mlton-20100608/0000755000076600000240000000000011404470407011560 5ustar mtfstaffmlton-20100608/.ignore0000644000076600000240000000011211404435642013040 0ustar mtfstaffbuild build-stamp configure-stamp install regression-log rpms runtime-log mlton-20100608/basis-library/0000755000076600000240000000000011404470406014322 5ustar mtfstaffmlton-20100608/basis-library/.ignore0000644000076600000240000000002611404435632015606 0ustar mtfstaffbasis-library.def-use mlton-20100608/basis-library/arrays-and-vectors/0000755000076600000240000000000011404470406020046 5ustar mtfstaffmlton-20100608/basis-library/arrays-and-vectors/array-slice.sig0000644000076600000240000000462711404435631022777 0ustar mtfstaffstructure Array = struct type 'a array = 'a array end signature ARRAY_SLICE_GLOBAL = sig end signature ARRAY_SLICE = sig include ARRAY_SLICE_GLOBAL type 'a slice val all: ('a -> bool) -> 'a slice -> bool val app : ('a -> unit) -> 'a slice -> unit val appi: (int * 'a -> unit) -> 'a slice -> unit val base: 'a slice -> 'a Array.array * int * int val collate: ('a * 'a -> order) -> 'a slice * 'a slice -> order val copy: {src: 'a slice, dst: 'a Array.array, di: int} -> unit val copyVec: {di: int, dst: 'a Array.array, src: 'a VectorSlice.slice} -> unit val exists: ('a -> bool) -> 'a slice -> bool val find: ('a -> bool) -> 'a slice -> 'a option val findi: (int * 'a -> bool) -> 'a slice -> (int * 'a) option val foldl: ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b val full: 'a Array.array -> 'a slice val getItem: 'a slice -> ('a * 'a slice) option val isEmpty: 'a slice -> bool val length: 'a slice -> int val modify : ('a -> 'a) -> 'a slice -> unit val modifyi: (int * 'a -> 'a) -> 'a slice -> unit val slice: 'a Array.array * int * int option -> 'a slice val sub: 'a slice * int -> 'a val subslice: 'a slice * int * int option -> 'a slice val update: 'a slice * int * 'a -> unit val vector: 'a slice -> 'a Vector.vector end signature ARRAY_SLICE_EXTRA = sig include ARRAY_SLICE val concat: 'a slice list -> 'a array val toList: 'a slice -> 'a list val slice': 'a array * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSlice': 'a array * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSlice: 'a array * int * int option -> 'a slice val sub': 'a slice * SeqIndex.int -> 'a val unsafeSub': 'a slice * SeqIndex.int -> 'a val unsafeSub: 'a slice * int -> 'a val unsafeSubslice': 'a slice * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSubslice: 'a slice * int * int option -> 'a slice val update': 'a slice * SeqIndex.int * 'a -> unit val unsafeUpdate': 'a slice * SeqIndex.int * 'a -> unit val unsafeUpdate: 'a slice * int * 'a -> unit end mlton-20100608/basis-library/arrays-and-vectors/array.sig0000644000076600000240000000374311404435631021700 0ustar mtfstaffsignature ARRAY_GLOBAL = sig type 'a array = 'a Array.array end signature ARRAY = sig include ARRAY_GLOBAL type 'a vector = 'a Vector.vector val all: ('a -> bool) -> 'a array -> bool val app: ('a -> unit) -> 'a array -> unit val appi: (int * 'a -> unit) -> 'a array -> unit val array: int * 'a -> 'a array val collate: ('a * 'a -> order) -> 'a array * 'a array -> order val copy: {src: 'a array, dst: 'a array, di: int} -> unit val copyVec: {src: 'a vector, dst: 'a array, di: int} -> unit val exists: ('a -> bool) -> 'a array -> bool val find: ('a -> bool) -> 'a array -> 'a option val findi: (int * 'a -> bool) -> 'a array -> (int * 'a) option val foldl: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b val fromList: 'a list -> 'a array val length: 'a array -> int val maxLen: int val modify: ('a -> 'a) -> 'a array -> unit val modifyi: (int * 'a -> 'a) -> 'a array -> unit val sub: 'a array * int -> 'a val tabulate: int * (int -> 'a) -> 'a array val update: 'a array * int * 'a -> unit val vector: 'a array -> 'a vector end signature ARRAY_EXTRA = sig include ARRAY structure ArraySlice: ARRAY_SLICE_EXTRA val arrayUninit': SeqIndex.int -> 'a array val arrayUninit: int -> 'a array val array': SeqIndex.int * 'a -> 'a array val unsafeSub': 'a array * SeqIndex.int -> 'a val unsafeSub: 'a array * int -> 'a val unsafeUpdate': 'a array * SeqIndex.int * 'a -> unit val unsafeUpdate: 'a array * int * 'a -> unit val concat: 'a array list -> 'a array val duplicate: 'a array -> 'a array val toList: 'a array -> 'a list val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a array * 'b end mlton-20100608/basis-library/arrays-and-vectors/array.sml0000644000076600000240000000735211404435631021711 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Array: ARRAY_EXTRA = struct structure A = Sequence (type 'a sequence = 'a array type 'a elt = 'a val fromArray = fn a => a val isMutable = true val length = Primitive.Array.length val subUnsafe = Primitive.Array.subUnsafe) open A val op +? = Int.+? val op < = Int.< val op <= = Int.<= fun wrap2 f = fn (i, x) => f (SeqIndex.toIntUnsafe i, x) type 'a array = 'a array type 'a vector = 'a Vector.vector structure ArraySlice = struct open Slice fun update' (arr, i, x) = update'Mk Primitive.Array.updateUnsafe (arr, i, x) fun update (arr, i, x) = updateMk Primitive.Array.updateUnsafe (arr, i, x) fun unsafeUpdate' (arr, i, x) = unsafeUpdate'Mk Primitive.Array.updateUnsafe (arr, i, x) fun unsafeUpdate (arr, i, x) = unsafeUpdateMk Primitive.Array.updateUnsafe (arr, i, x) fun vector sl = create Vector.tabulate' (fn x => x) sl fun modifyi' f sl = appi' (fn (i, x) => unsafeUpdate' (sl, i, f (i, x))) sl fun modifyi f sl = modifyi' (wrap2 f) sl fun modify f sl = modifyi (f o #2) sl local fun make (length, sub') {src, dst, di} = modifyi' (fn (i, _) => sub' (src, i)) (slice (dst, di, SOME (length src))) in fun copy (arg as {src, dst, di}) = let val (src', si', len') = base src in if src' = dst andalso si' < di andalso di <= si' +? len' then let val sl = slice (dst, di, SOME (length src)) in foldri' (fn (i, _, _) => unsafeUpdate' (sl, i, unsafeSub' (src, i))) () sl end else make (length, unsafeSub') arg end fun copyVec arg = make (Vector.VectorSlice.length, Vector.VectorSlice.unsafeSub') arg end end local fun make f arr = f (ArraySlice.full arr) in fun vector arr = make (ArraySlice.vector) arr (* fun modifyi' f = make (ArraySlice.modifyi' f) *) fun modifyi f = make (ArraySlice.modifyi f) fun modify f = make (ArraySlice.modify f) fun copy {src, dst, di} = ArraySlice.copy {src = ArraySlice.full src, dst = dst, di = di} fun copyVec {src, dst, di} = ArraySlice.copyVec {src = VectorSlice.full src, dst = dst, di = di} end val arrayUninit' = newUninit' val arrayUninit = newUninit val array' = new' val array = new (* fun update' (arr, i, x) = update'Mk Primitive.Array.updateUnsafe (arr, i, x) *) fun update (arr, i, x) = updateMk Primitive.Array.updateUnsafe (arr, i, x) fun unsafeUpdate' (arr, i, x) = unsafeUpdate'Mk Primitive.Array.updateUnsafe (arr, i, x) fun unsafeUpdate (arr, i, x) = unsafeUpdateMk Primitive.Array.updateUnsafe (arr, i, x) end structure ArraySlice: ARRAY_SLICE_EXTRA = Array.ArraySlice structure ArrayGlobal: ARRAY_GLOBAL = Array open ArrayGlobal mlton-20100608/basis-library/arrays-and-vectors/array2.sig0000644000076600000240000000246511404435631021762 0ustar mtfstaffsignature ARRAY2 = sig eqtype 'a array type 'a region = {base: 'a array, row: int, col: int, nrows: int option, ncols: int option} datatype traversal = RowMajor | ColMajor val array: int * int * 'a -> 'a array val fromList: 'a list list -> 'a array val tabulate: traversal -> (int * int * (int * int -> 'a)) -> 'a array val sub: 'a array * int * int -> 'a val update: 'a array * int * int * 'a -> unit val dimensions: 'a array -> int * int val nRows: 'a array -> int val nCols: 'a array -> int val row: 'a array * int -> 'a vector val column: 'a array * int -> 'a vector val copy: {src: 'a region, dst: 'a array, dst_row: int, dst_col: int} -> unit val appi: traversal -> (int * int * 'a -> unit) -> 'a region -> unit val app: traversal -> ('a -> unit) -> 'a array -> unit val foldi: traversal -> (int * int * 'a * 'b -> 'b) -> 'b -> 'a region -> 'b val fold: traversal -> ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val modifyi: traversal -> (int * int * 'a -> 'a) -> 'a region -> unit val modify: traversal -> ('a -> 'a) -> 'a array -> unit end mlton-20100608/basis-library/arrays-and-vectors/array2.sml0000644000076600000240000003212311404435631021765 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Array2 : ARRAY2 = struct val op +? = SeqIndex.+? val op + = SeqIndex.+ val op -? = SeqIndex.-? val op - = SeqIndex.- val op *? = SeqIndex.*? val op * = SeqIndex.* val op < = SeqIndex.< val op <= = SeqIndex.<= val op > = SeqIndex.> val op >= = SeqIndex.>= val ltu = SeqIndex.ltu val leu = SeqIndex.leu val gtu = SeqIndex.gtu val geu = SeqIndex.geu type 'a array = {array: 'a Array.array, rows: SeqIndex.int, cols: SeqIndex.int} fun dimensions' ({rows, cols, ...}: 'a array) = (rows, cols) fun dimensions ({rows, cols, ...}: 'a array) = (SeqIndex.toIntUnsafe rows, SeqIndex.toIntUnsafe cols) fun nRows' ({rows, ...}: 'a array) = rows fun nRows ({rows, ...}: 'a array) = SeqIndex.toIntUnsafe rows fun nCols' ({cols, ...}: 'a array) = cols fun nCols ({cols, ...}: 'a array) = SeqIndex.toIntUnsafe cols type 'a region = {base: 'a array, row: int, col: int, nrows: int option, ncols: int option} local fun checkSliceMax' (start: int, num: SeqIndex.int option, max: SeqIndex.int): SeqIndex.int * SeqIndex.int = case num of NONE => if Primitive.Controls.safe then let val start = (SeqIndex.fromInt start) handle Overflow => raise Subscript in if gtu (start, max) then raise Subscript else (start, max) end else (SeqIndex.fromIntUnsafe start, max) | SOME num => if Primitive.Controls.safe then let val start = (SeqIndex.fromInt start) handle Overflow => raise Subscript in if (start < 0 orelse num < 0 orelse start +? num > max) then raise Subscript else (start, start +? num) end else (SeqIndex.fromIntUnsafe start, SeqIndex.fromIntUnsafe start +? num) fun checkSliceMax (start: int, num: int option, max: SeqIndex.int): SeqIndex.int * SeqIndex.int = if Primitive.Controls.safe then (checkSliceMax' (start, Option.map SeqIndex.fromInt num, max)) handle Overflow => raise Subscript else checkSliceMax' (start, Option.map SeqIndex.fromIntUnsafe num, max) in fun checkRegion' {base, row, col, nrows, ncols} = let val (rows, cols) = dimensions' base val (startRow, stopRow) = checkSliceMax' (row, nrows, rows) val (startCol, stopCol) = checkSliceMax' (col, ncols, cols) in {startRow = startRow, stopRow = stopRow, startCol = startCol, stopCol = stopCol} end fun checkRegion {base, row, col, nrows, ncols} = let val (rows, cols) = dimensions' base val (startRow, stopRow) = checkSliceMax (row, nrows, rows) val (startCol, stopCol) = checkSliceMax (col, ncols, cols) in {startRow = startRow, stopRow = stopRow, startCol = startCol, stopCol = stopCol} end end fun wholeRegion (a : 'a array): 'a region = {base = a, row = 0, col = 0, nrows = NONE, ncols = NONE} datatype traversal = RowMajor | ColMajor local fun make (rows, cols, doit) = if Primitive.Controls.safe andalso (rows < 0 orelse cols < 0) then raise Size else {array = doit (rows * cols handle Overflow => raise Size), rows = rows, cols = cols} in fun arrayUninit' (rows, cols) = make (rows, cols, Array.arrayUninit') fun array' (rows, cols, init) = make (rows, cols, fn size => Array.array' (size, init)) end local fun make (rows, cols, doit) = if Primitive.Controls.safe then let val rows = (SeqIndex.fromInt rows) handle Overflow => raise Size val cols = (SeqIndex.fromInt cols) handle Overflow => raise Size in doit (rows, cols) end else doit (SeqIndex.fromIntUnsafe rows, SeqIndex.fromIntUnsafe cols) in fun arrayUninit (rows, cols) = make (rows, cols, fn (rows, cols) => arrayUninit' (rows, cols)) fun array (rows, cols, init) = make (rows, cols, fn (rows, cols) => array' (rows, cols, init)) end fun array0 (): 'a array = {array = Array.arrayUninit' 0, rows = 0, cols = 0} fun unsafeSpot' ({cols, ...}: 'a array, r, c) = r *? cols +? c fun spot' (a as {rows, cols, ...}: 'a array, r, c) = if Primitive.Controls.safe andalso (geu (r, rows) orelse geu (c, cols)) then raise Subscript else unsafeSpot' (a, r, c) fun unsafeSub' (a as {array, ...}: 'a array, r, c) = Array.unsafeSub' (array, unsafeSpot' (a, r, c)) fun sub' (a as {array, ...}: 'a array, r, c) = Array.unsafeSub' (array, spot' (a, r, c)) fun unsafeUpdate' (a as {array, ...}: 'a array, r, c, x) = Array.unsafeUpdate' (array, unsafeSpot' (a, r, c), x) fun update' (a as {array, ...}: 'a array, r, c, x) = Array.unsafeUpdate' (array, spot' (a, r, c), x) local fun make (r, c, doit) = if Primitive.Controls.safe then let val r = (SeqIndex.fromInt r) handle Overflow => raise Subscript val c = (SeqIndex.fromInt c) handle Overflow => raise Subscript in doit (r, c) end else doit (SeqIndex.fromIntUnsafe r, SeqIndex.fromIntUnsafe c) in fun sub (a, r, c) = make (r, c, fn (r, c) => sub' (a, r, c)) fun update (a, r, c, x) = make (r, c, fn (r, c) => update' (a, r, c, x)) end fun 'a fromList (rows: 'a list list): 'a array = case rows of [] => array0 () | row1 :: _ => let val cols = length row1 val a as {array, cols = cols', ...} = arrayUninit (length rows, cols) val _ = List.foldl (fn (row: 'a list, i) => let val max = i +? cols' val i' = List.foldl (fn (x: 'a, i) => (if i >= max then raise Size else (Array.unsafeUpdate' (array, i, x) ; i +? 1))) i row in if i' = max then i' else raise Size end) 0 rows in a end fun row' ({array, rows, cols}, r) = if Primitive.Controls.safe andalso geu (r, rows) then raise Subscript else ArraySlice.vector (ArraySlice.slice' (array, r *? cols, SOME cols)) fun row (a, r) = if Primitive.Controls.safe then let val r = (SeqIndex.fromInt r) handle Overflow => raise Subscript in row' (a, r) end else row' (a, SeqIndex.fromIntUnsafe r) fun column' (a as {rows, cols, ...}: 'a array, c) = if Primitive.Controls.safe andalso geu (c, cols) then raise Subscript else Vector.tabulate' (rows, fn r => unsafeSub' (a, r, c)) fun column (a, c) = if Primitive.Controls.safe then let val c = (SeqIndex.fromInt c) handle Overflow => raise Subscript in column' (a, c) end else column' (a, SeqIndex.fromIntUnsafe c) fun foldi' trv f b (region as {base, ...}) = let val {startRow, stopRow, startCol, stopCol} = checkRegion region in case trv of RowMajor => let fun loopRow (r, b) = if r >= stopRow then b else let fun loopCol (c, b) = if c >= stopCol then b else loopCol (c +? 1, f (r, c, sub' (base, r, c), b)) in loopRow (r +? 1, loopCol (startCol, b)) end in loopRow (startRow, b) end | ColMajor => let fun loopCol (c, b) = if c >= stopCol then b else let fun loopRow (r, b) = if r >= stopRow then b else loopRow (r +? 1, f (r, c, sub' (base, r, c), b)) in loopCol (c +? 1, loopRow (startRow, b)) end in loopCol (startCol, b) end end fun foldi trv f b a = foldi' trv (fn (r, c, x, b) => f (SeqIndex.toIntUnsafe r, SeqIndex.toIntUnsafe c, x, b)) b a fun fold trv f b a = foldi trv (fn (_, _, x, b) => f (x, b)) b (wholeRegion a) fun appi trv f = foldi trv (fn (r, c, x, ()) => f (r, c, x)) () fun app trv f = fold trv (f o #1) () fun modifyi trv f (r as {base, ...}) = appi trv (fn (r, c, x) => update (base, r, c, f (r, c, x))) r fun modify trv f a = modifyi trv (f o #3) (wholeRegion a) fun tabulate trv (rows, cols, f) = let val a = arrayUninit (rows, cols) val () = modifyi trv (fn (r, c, _) => f (r, c)) (wholeRegion a) in a end fun copy {src = src as {base, ...}: 'a region, dst, dst_row, dst_col} = let val {startRow, stopRow, startCol, stopCol} = checkRegion src val nrows = stopRow -? startRow val ncols = stopCol -? startCol val {startRow = dst_row, startCol = dst_col, ...} = checkRegion' {base = dst, row = dst_row, col = dst_col, nrows = SOME nrows, ncols = SOME ncols} fun forUp (start, stop, f: SeqIndex.int -> unit) = let fun loop i = if i >= stop then () else (f i; loop (i + 1)) in loop start end fun forDown (start, stop, f: SeqIndex.int -> unit) = let fun loop i = if i < start then () else (f i; loop (i - 1)) in loop (stop -? 1) end val forRows = if startRow <= dst_row then forDown else forUp val forCols = if startCol <= dst_col then forUp else forDown in forRows (0, nrows, fn r => forCols (0, ncols, fn c => unsafeUpdate' (dst, dst_row +? r, dst_col +? c, unsafeSub' (base, startRow +? r, startCol +? c)))) end end mlton-20100608/basis-library/arrays-and-vectors/mono-array-slice.sig0000644000076600000240000000343411404435631023740 0ustar mtfstaffsignature MONO_ARRAY_SLICE = sig type array type elem type slice type vector type vector_slice val length: slice -> int val sub: slice * int -> elem val update: slice * int * elem -> unit val full: array -> slice val slice: array * int * int option -> slice val subslice: slice * int * int option -> slice val base: slice -> array * int * int val vector: slice -> vector val copy: {src: slice, dst: array, di: int} -> unit val copyVec: {src: vector_slice, dst: array, di: int} -> unit val isEmpty: slice -> bool val getItem: slice -> (elem * slice) option val appi: (int * elem -> unit) -> slice -> unit val app: (elem -> unit) -> slice -> unit val modifyi: (int * elem -> elem) -> slice -> unit val modify: (elem -> elem) -> slice -> unit val foldli: (int * elem * 'b -> 'b) -> 'b -> slice -> 'b val foldr: (elem * 'b -> 'b) -> 'b -> slice -> 'b val foldl: (elem * 'b -> 'b) -> 'b -> slice -> 'b val foldri: (int * elem * 'b -> 'b) -> 'b -> slice -> 'b val findi: (int * elem -> bool) -> slice -> (int * elem) option val find: (elem -> bool) -> slice -> elem option val exists: (elem -> bool) -> slice -> bool val all: (elem -> bool) -> slice -> bool val collate: (elem * elem -> order) -> slice * slice -> order end signature MONO_ARRAY_SLICE_EXTRA = sig include MONO_ARRAY_SLICE val concat: slice list -> array val toList: slice -> elem list val toPoly: slice -> elem ArraySlice.slice val unsafeSlice: array * int * int option -> slice val unsafeSub: slice * int -> elem val unsafeSubslice: slice * int * int option -> slice val unsafeUpdate: slice * int * elem -> unit end mlton-20100608/basis-library/arrays-and-vectors/mono-array.fun0000644000076600000240000000234311404435631022647 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MonoArray (type elem structure V: MONO_VECTOR_EXTRA where type elem = elem and type vector = elem Vector.vector and type MonoVectorSlice.slice = elem VectorSlice.slice ): MONO_ARRAY_EXTRA where type elem = elem and type vector = V.vector and type vector_slice = V.MonoVectorSlice.slice = struct open Array type elem = V.elem type array = elem array type vector = V.vector type vector_slice = V.MonoVectorSlice.slice val fromPoly = fn a => a val toPoly = fn a => a structure MonoArraySlice = struct open ArraySlice type elem = elem type array = array type slice = elem slice type vector = vector type vector_slice = vector_slice val toPoly = fn s => s end end mlton-20100608/basis-library/arrays-and-vectors/mono-array.sig0000644000076600000240000000361711404435631022646 0ustar mtfstaffsignature MONO_ARRAY = sig eqtype array type elem type vector val all: (elem -> bool) -> array -> bool val app: (elem -> unit) -> array -> unit val appi: (int * elem -> unit) -> array -> unit val array: int * elem -> array val collate: (elem * elem -> order) -> array * array -> order val copy: {src: array, dst: array, di: int} -> unit val copyVec: {src: vector, dst: array, di: int} -> unit val exists: (elem -> bool) -> array -> bool val find: (elem -> bool) -> array -> elem option val findi: (int * elem -> bool) -> array -> (int * elem) option val foldl: (elem * 'b -> 'b) -> 'b -> array -> 'b val foldli: (int * elem * 'b -> 'b) -> 'b -> array -> 'b val foldr: (elem * 'b -> 'b) -> 'b -> array -> 'b val foldri: (int * elem * 'b -> 'b) -> 'b -> array -> 'b val fromList: elem list -> array val length: array -> int val maxLen: int val modify: (elem -> elem) -> array -> unit val modifyi: (int * elem -> elem) -> array -> unit val sub: array * int -> elem val tabulate: int * (int -> elem) -> array val update: array * int * elem -> unit val vector: array -> vector end signature MONO_ARRAY_EXTRA = sig include MONO_ARRAY type vector_slice structure MonoArraySlice: MONO_ARRAY_SLICE_EXTRA where type elem = elem and type array = array and type vector = vector and type vector_slice = vector_slice val arrayUninit: int -> array val concat: array list -> array val duplicate: array -> array val fromPoly: elem Array.array -> array val toList: array -> elem list val toPoly: array -> elem Array.array val unfoldi: int * 'a * (int * 'a -> elem * 'a) -> array * 'a val unsafeSub: array * int -> elem val unsafeUpdate: array * int * elem -> unit end mlton-20100608/basis-library/arrays-and-vectors/mono-array2.fun0000644000076600000240000000134711404435631022734 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MonoArray2 (type elem structure V: MONO_VECTOR where type elem = elem and type vector = elem Vector.vector): MONO_ARRAY2 = struct type elem = V.elem type vector = V.vector open Array2 type array = elem array type region = {base: array, row: int, col: int, nrows: int option, ncols: int option} end mlton-20100608/basis-library/arrays-and-vectors/mono-array2.sig0000644000076600000240000000237011404435631022723 0ustar mtfstaffsignature MONO_ARRAY2 = sig eqtype array type elem type vector type region = {base: array, row: int, col: int, nrows: int option, ncols: int option} datatype traversal = datatype Array2.traversal val array: int * int * elem -> array val fromList: elem list list -> array val tabulate: traversal -> int * int * (int * int -> elem) -> array val sub: array * int * int -> elem val update: array * int * int * elem -> unit val dimensions: array -> int * int val nCols: array -> int val nRows: array -> int val row: array * int -> vector val column: array * int -> vector val copy: {src: region, dst: array, dst_row: int, dst_col: int} -> unit val appi: traversal -> (int * int * elem -> unit) -> region -> unit val app: traversal -> (elem -> unit) -> array -> unit val foldi: traversal -> (int * int * elem * 'b -> 'b) -> 'b -> region -> 'b val fold: traversal -> (elem * 'b -> 'b) -> 'b -> array -> 'b val modifyi: traversal -> (int * int * elem -> elem) -> region -> unit val modify: traversal -> (elem -> elem) -> array -> unit end mlton-20100608/basis-library/arrays-and-vectors/mono-vector-slice.sig0000644000076600000240000000522311404435631024122 0ustar mtfstaffsignature MONO_VECTOR_SLICE = sig type elem type slice type vector val all: (elem -> bool) -> slice -> bool val app: (elem -> unit) -> slice -> unit val appi: (int * elem -> unit) -> slice -> unit val base: slice -> vector * int * int val collate: (elem * elem -> order) -> slice * slice -> order val concat: slice list -> vector val exists: (elem -> bool) -> slice -> bool val find : (elem -> bool) -> slice -> elem option val findi: (int * elem -> bool) -> slice -> (int * elem) option val foldl: (elem * 'b -> 'b) -> 'b -> slice -> 'b val foldli: (int * elem * 'b -> 'b) -> 'b -> slice -> 'b val foldr: (elem * 'b -> 'b) -> 'b -> slice -> 'b val foldri: (int * elem * 'b -> 'b) -> 'b -> slice -> 'b val full: vector -> slice val getItem: slice -> (elem * slice) option val isEmpty: slice -> bool val length: slice -> int val map: (elem -> elem) -> slice -> vector val mapi: (int * elem -> elem) -> slice -> vector val slice: vector * int * int option -> slice val sub: slice * int -> elem val subslice: slice * int * int option -> slice val vector: slice -> vector end signature MONO_VECTOR_SLICE_EXTRA = sig include MONO_VECTOR_SLICE val concatWith: vector -> slice list -> vector val dropl: (elem -> bool) -> slice -> slice val dropr: (elem -> bool) -> slice -> slice val fields: (elem -> bool) -> slice -> slice list val isPrefix: (elem * elem -> bool) -> vector -> slice -> bool val isSubvector: (elem * elem -> bool) -> vector -> slice -> bool val isSuffix: (elem * elem -> bool) -> vector -> slice -> bool val position: (elem * elem -> bool) -> vector -> slice -> slice * slice val splitAt: slice * int -> slice * slice val splitl: (elem -> bool) -> slice -> slice * slice val splitr: (elem -> bool) -> slice -> slice * slice val takel: (elem -> bool) -> slice -> slice val taker: (elem -> bool) -> slice -> slice val toList: slice -> elem list val tokens: (elem -> bool) -> slice -> slice list val translate: (elem -> vector) -> slice -> vector val triml: int -> slice -> slice val trimr: int -> slice -> slice val unsafeSlice: vector * int * int option -> slice val unsafeSub: slice * int -> elem val unsafeSubslice: slice * int * int option -> slice end signature EQTYPE_MONO_VECTOR_SLICE_EXTRA = sig include MONO_VECTOR_SLICE_EXTRA val fromPoly: elem VectorSlice.slice -> slice val span: slice * slice -> slice val toPoly: slice -> elem VectorSlice.slice end mlton-20100608/basis-library/arrays-and-vectors/mono-vector.fun0000644000076600000240000000233511404435631023034 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MonoVector (type elem): MONO_VECTOR_EXTRA where type elem = elem = struct open Vector type array = elem array type elem = elem type vector = elem vector structure MonoVectorSlice = struct open VectorSlice type elem = elem type vector = vector type slice = elem slice end end functor EqtypeMonoVector (eqtype elem): EQTYPE_MONO_VECTOR_EXTRA where type elem = elem = struct open Vector type array = elem array type elem = elem type vector = elem vector val fromPoly = fn v => v val toPoly = fn v => v structure MonoVectorSlice = struct open VectorSlice type elem = elem type vector = vector type slice = elem slice val fromPoly = fn s => s val toPoly = fn s => s end end mlton-20100608/basis-library/arrays-and-vectors/mono-vector.sig0000644000076600000240000000466111404435631023032 0ustar mtfstaffsignature MONO_VECTOR = sig type vector type elem val all: (elem -> bool) -> vector -> bool val app: (elem -> unit) -> vector -> unit val appi: (int * elem -> unit) -> vector -> unit val collate: (elem * elem -> order) -> vector * vector -> order val concat: vector list -> vector val exists: (elem -> bool) -> vector -> bool val find: (elem -> bool) -> vector -> elem option val findi: (int * elem -> bool) -> vector -> (int * elem) option val foldl: (elem * 'a -> 'a) -> 'a -> vector -> 'a val foldli: (int * elem * 'a -> 'a) -> 'a -> vector -> 'a val foldr: (elem * 'a -> 'a) -> 'a -> vector -> 'a val foldri: (int * elem * 'a -> 'a) -> 'a -> vector -> 'a val fromList: elem list -> vector val length: vector -> int val map: (elem -> elem) -> vector -> vector val mapi: (int * elem -> elem) -> vector -> vector val maxLen: int val sub: vector * int -> elem val tabulate: int * (int -> elem) -> vector val update: vector * int * elem -> vector end signature MONO_VECTOR_EXTRA_PRE = sig include MONO_VECTOR type array val unsafeFromArray: array -> vector val unsafeSub: vector * int -> elem val append: vector * vector -> vector val concatWith: vector -> vector list -> vector val duplicate: vector -> vector val fields: (elem -> bool) -> vector -> vector list val isPrefix: (elem * elem -> bool) -> vector -> vector -> bool val isSubvector: (elem * elem -> bool) -> vector -> vector -> bool val isSuffix: (elem * elem -> bool) -> vector -> vector -> bool val toList: vector -> elem list val tokens: (elem -> bool) -> vector -> vector list val translate: (elem -> vector) -> vector -> vector val unfoldi: int * 'a * (int * 'a -> elem * 'a) -> vector * 'a val vector: int * elem -> vector end signature MONO_VECTOR_EXTRA = sig include MONO_VECTOR_EXTRA_PRE structure MonoVectorSlice: MONO_VECTOR_SLICE_EXTRA where type elem = elem and type vector = vector end signature EQTYPE_MONO_VECTOR_EXTRA = sig include MONO_VECTOR_EXTRA_PRE structure MonoVectorSlice: EQTYPE_MONO_VECTOR_SLICE_EXTRA where type elem = elem and type vector = vector val fromPoly: elem Vector.vector -> vector val toPoly: vector -> elem Vector.vector end mlton-20100608/basis-library/arrays-and-vectors/mono.sml0000644000076600000240000001564111404435631021543 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature EQ_MONO = sig structure Array: MONO_ARRAY_EXTRA structure Array2: MONO_ARRAY2 structure ArraySlice: MONO_ARRAY_SLICE_EXTRA structure Vector: EQTYPE_MONO_VECTOR_EXTRA structure VectorSlice: EQTYPE_MONO_VECTOR_SLICE_EXTRA sharing type Array.array = ArraySlice.array = Vector.array sharing type Array.elem = Array2.elem = ArraySlice.elem = Vector.elem = VectorSlice.elem sharing type Array.vector = Array2.vector = ArraySlice.vector = Vector.vector = VectorSlice.vector sharing type ArraySlice.vector_slice = VectorSlice.slice end functor EqMono (eqtype elem) = struct structure Vector = EqtypeMonoVector (type elem = elem) structure VectorSlice = Vector.MonoVectorSlice structure Array = MonoArray (type elem = elem structure V = Vector) structure ArraySlice = Array.MonoArraySlice structure Array2 = MonoArray2 (type elem = elem structure V = Vector) end functor Mono (type elem) = struct structure Vector = MonoVector (type elem = elem) structure VectorSlice = Vector.MonoVectorSlice structure Array = MonoArray (type elem = elem structure V = Vector) structure ArraySlice = Array.MonoArraySlice structure Array2 = MonoArray2 (type elem = elem structure V = Vector) end local structure S = EqMono (type elem = Primitive.Bool.bool) open S in structure BoolVector = Vector structure BoolVectorSlice = VectorSlice structure BoolArray = Array structure BoolArraySlice = ArraySlice structure BoolArray2 = Array2 end local structure S = EqMono (type elem = Primitive.Int8.int) open S in structure Int8Vector = Vector structure Int8VectorSlice = VectorSlice structure Int8Array = Array structure Int8ArraySlice = ArraySlice structure Int8Array2 = Array2 end local structure S = EqMono (type elem = Primitive.Int16.int) open S in structure Int16Vector = Vector structure Int16VectorSlice = VectorSlice structure Int16Array = Array structure Int16ArraySlice = ArraySlice structure Int16Array2 = Array2 end local structure S = EqMono (type elem = Primitive.Int32.int) open S in structure Int32Vector = Vector structure Int32VectorSlice = VectorSlice structure Int32Array = Array structure Int32ArraySlice = ArraySlice structure Int32Array2 = Array2 end local structure S = EqMono (type elem = Primitive.Int64.int) open S in structure Int64Vector = Vector structure Int64VectorSlice = VectorSlice structure Int64Array = Array structure Int64ArraySlice = ArraySlice structure Int64Array2 = Array2 end local structure S = EqMono (type elem = Primitive.IntInf.int) open S in structure IntInfVector = Vector structure IntInfVectorSlice = VectorSlice structure IntInfArray = Array structure IntInfArraySlice = ArraySlice structure IntInfArray2 = Array2 end local structure S = Mono (type elem = Primitive.Real32.real) open S in structure Real32Vector = Vector structure Real32VectorSlice = VectorSlice structure Real32Array = Array structure Real32ArraySlice = ArraySlice structure Real32Array2 = Array2 end local structure S = Mono (type elem = Primitive.Real64.real) open S in structure Real64Vector = Vector structure Real64VectorSlice = VectorSlice structure Real64Array = Array structure Real64ArraySlice = ArraySlice structure Real64Array2 = Array2 end local structure S = EqMono (type elem = Primitive.Word8.word) open S in structure Word8Vector = Vector structure Word8VectorSlice = VectorSlice structure Word8Array = Array structure Word8ArraySlice = ArraySlice structure Word8Array2 = Array2 end local structure S = EqMono (type elem = Primitive.Word16.word) open S in structure Word16Vector = Vector structure Word16VectorSlice = VectorSlice structure Word16Array = Array structure Word16ArraySlice = ArraySlice structure Word16Array2 = Array2 end local structure S = EqMono (type elem = Primitive.Word32.word) open S in structure Word32Vector = Vector structure Word32VectorSlice = VectorSlice structure Word32Array = Array structure Word32ArraySlice = ArraySlice structure Word32Array2 = Array2 end local structure S = EqMono (type elem = Primitive.Word64.word) open S in structure Word64Vector = Vector structure Word64VectorSlice = VectorSlice structure Word64Array = Array structure Word64ArraySlice = ArraySlice structure Word64Array2 = Array2 end local structure S = EqMono (type elem = Char.char) open S in structure CharArray = Array structure CharArray2 = Array2 structure CharArraySlice = ArraySlice structure CharVector = Vector structure CharVectorSlice = VectorSlice end local structure S = EqMono (type elem = WideChar.char) open S in structure WideCharArray = Array structure WideCharArray2 = Array2 structure WideCharArraySlice = ArraySlice structure WideCharVector = Vector structure WideCharVectorSlice = VectorSlice end local structure S = EqMono (type elem = Int.int) open S in structure IntVector = Vector structure IntVectorSlice = VectorSlice structure IntArray = Array structure IntArraySlice = ArraySlice structure IntArray2 = Array2 end local structure S = EqMono (type elem = LargeInt.int) open S in structure LargeIntVector = Vector structure LargeIntVectorSlice = VectorSlice structure LargeIntArray = Array structure LargeIntArraySlice = ArraySlice structure LargeIntArray2 = Array2 end local structure S = Mono (type elem = Real.real) open S in structure RealVector = Vector structure RealVectorSlice = VectorSlice structure RealArray = Array structure RealArraySlice = ArraySlice structure RealArray2 = Array2 end local structure S = Mono (type elem = LargeReal.real) open S in structure LargeRealVector = Vector structure LargeRealVectorSlice = VectorSlice structure LargeRealArray = Array structure LargeRealArraySlice = ArraySlice structure LargeRealArray2 = Array2 end local structure S = EqMono (type elem = Word.word) open S in structure WordVector = Vector structure WordVectorSlice = VectorSlice structure WordArray = Array structure WordArraySlice = ArraySlice structure WordArray2 = Array2 end local structure S = EqMono (type elem = LargeWord.word) open S in structure LargeWordVector = Vector structure LargeWordVectorSlice = VectorSlice structure LargeWordArray = Array structure LargeWordArraySlice = ArraySlice structure LargeWordArray2 = Array2 end mlton-20100608/basis-library/arrays-and-vectors/sequence.fun0000644000076600000240000007340511404435631022402 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure SeqIndex = struct open SeqIndex val maxLen' = maxInt' local structure S = Int_ChooseInt (type 'a t = 'a -> int val fInt8 = SeqIndex.sextdFromInt8 val fInt16 = SeqIndex.sextdFromInt16 val fInt32 = SeqIndex.sextdFromInt32 val fInt64 = SeqIndex.sextdFromInt64 val fIntInf = SeqIndex.sextdFromIntInf) in val fromIntUnsafe = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> int val fInt8 = SeqIndex.schckFromInt8 val fInt16 = SeqIndex.schckFromInt16 val fInt32 = SeqIndex.schckFromInt32 val fInt64 = SeqIndex.schckFromInt64 val fIntInf = SeqIndex.schckFromIntInf) in val fromInt = S.f end local structure S = Int_ChooseInt (type 'a t = int -> 'a val fInt8 = SeqIndex.sextdToInt8 val fInt16 = SeqIndex.sextdToInt16 val fInt32 = SeqIndex.sextdToInt32 val fInt64 = SeqIndex.sextdToInt64 val fIntInf = SeqIndex.sextdToIntInf) in val toIntUnsafe = S.f end local structure S = Int_ChooseInt (type 'a t = int -> 'a val fInt8 = SeqIndex.schckToInt8 val fInt16 = SeqIndex.schckToInt16 val fInt32 = SeqIndex.schckToInt32 val fInt64 = SeqIndex.schckToInt64 val fIntInf = SeqIndex.schckToIntInf) in val toInt = S.f end end functor Sequence (S: sig type 'a sequence type 'a elt (* fromArray should be constant time. *) val fromArray: 'a elt array -> 'a sequence val isMutable: bool val length: 'a sequence -> SeqIndex.int val subUnsafe: 'a sequence * SeqIndex.int -> 'a elt end ): SEQUENCE = struct structure Array = Primitive.Array val op +? = SeqIndex.+? val op + = SeqIndex.+ val op -? = SeqIndex.-? val op < = SeqIndex.< val op <= = SeqIndex.<= val op > = SeqIndex.> val op >= = SeqIndex.>= val gtu = SeqIndex.gtu val geu = SeqIndex.geu (* fun wrap1 f = fn (i) => f (SeqIndex.toIntUnsafe i) *) fun wrap2 f = fn (i, x) => f (SeqIndex.toIntUnsafe i, x) fun wrap3 f = fn (i, x, y) => f (SeqIndex.toIntUnsafe i, x, y) fun unwrap1 f = fn (i) => f (SeqIndex.fromIntUnsafe i) fun unwrap2 f = fn (i, x) => f (SeqIndex.fromIntUnsafe i, x) type 'a sequence = 'a S.sequence type 'a elt = 'a S.elt (* * In general, *' values are in terms of SeqIndex.int, * while * values are in terms of Int.int. *) local fun doit (precision, toInt, fromInt, maxInt') = if Primitive.Int32.>= (valOf SeqIndex.precision, precision) then (fromInt maxInt', maxInt') else (SeqIndex.maxLen', toInt SeqIndex.maxLen') structure S = Int_ChooseInt (type 'a t = SeqIndex.int * 'a val fInt8 = doit (valOf Primitive.Int8.precision, SeqIndex.schckToInt8, SeqIndex.schckFromInt8, Primitive.Int8.maxInt') val fInt16 = doit (valOf Primitive.Int16.precision, SeqIndex.schckToInt16, SeqIndex.schckFromInt16, Primitive.Int16.maxInt') val fInt32 = doit (valOf Primitive.Int32.precision, SeqIndex.schckToInt32, SeqIndex.schckFromInt32, Primitive.Int32.maxInt') val fInt64 = doit (valOf Primitive.Int64.precision, SeqIndex.schckToInt64, SeqIndex.schckFromInt64, Primitive.Int64.maxInt') val fIntInf = (SeqIndex.maxLen', SeqIndex.schckToIntInf SeqIndex.maxLen')) in val (maxLen', maxLen) = S.f end fun fromIntForLength n = if Primitive.Controls.safe then (SeqIndex.fromInt n) handle Overflow => raise Size else SeqIndex.fromIntUnsafe n fun length' s = S.length s fun length s = if Primitive.Controls.safe then (SeqIndex.toInt (length' s)) handle Overflow => raise Fail "Sequence.length" else SeqIndex.toIntUnsafe (length' s) fun arrayUninit' n = if not S.isMutable andalso n = 0 then Array.array0Const () else if Primitive.Controls.safe andalso gtu (n, maxLen') then raise Size else Array.arrayUnsafe n fun arrayUninit n = arrayUninit' (fromIntForLength n) fun newUninit' n = S.fromArray (arrayUninit' n) fun newUninit n = S.fromArray (arrayUninit n) fun generate' n = let val a = arrayUninit' n val subLim = ref 0 fun sub i = if Primitive.Controls.safe andalso geu (i, !subLim) then raise Subscript else Array.subUnsafe (a, i) val updateLim = ref 0 fun update (i, x) = if Primitive.Controls.safe andalso geu (i, !updateLim) then if i = !updateLim andalso i < n then (Array.updateUnsafe (a, i, x); subLim := i + 1; updateLim := i + 1) else raise Subscript else Array.updateUnsafe (a, i, x) val gotIt = ref false fun done () = if !gotIt then raise Fail "already got vector" else if n = !updateLim then (gotIt := true; updateLim := 0; S.fromArray a) else raise Fail "vector not full" in {done = done, sub = sub, update = update} end fun generate n = let val {done, sub, update} = generate' (fromIntForLength n) in {done = done, sub = unwrap1 sub, update = unwrap2 update} end fun unfoldi' (n, b, f) = let val a = arrayUninit' n fun loop (i, b) = if i >= n then b else let val (x, b') = f (i, b) val () = Array.updateUnsafe (a, i, x) in loop (i +? 1, b') end val b = loop (0, b) in (S.fromArray a, b) end fun unfoldi (n, b, f) = unfoldi' (fromIntForLength n, b, wrap2 f) fun unfold (n, b, f) = unfoldi (n, b, f o #2) fun seq0 () = #1 (unfold (0, (), fn _ => raise Fail "Sequence.seq0")) fun tabulate' (n, f) = #1 (unfoldi' (n, (), fn (i, ()) => (f i, ()))) fun tabulate (n, f) = #1 (unfoldi (n, (), fn (i, ()) => (f i, ()))) fun new' (n, x) = tabulate' (n, fn _ => x) fun new (n, x) = tabulate (n, fn _ => x) fun fromList l = #1 (unfold (List.length l, l, fn l => case l of nil => raise Fail "Sequence.fromList" | h::t => (h, t))) structure Slice = struct type 'a sequence = 'a S.sequence type 'a elt = 'a S.elt datatype 'a t = T of {seq: 'a sequence, start: SeqIndex.int, len: SeqIndex.int} type 'a slice = 'a t fun length' (T {len, ...}) = len fun length sl = if Primitive.Controls.safe then (SeqIndex.toInt (length' sl)) handle Overflow => raise Fail "Sequence.Slice.length" else SeqIndex.toIntUnsafe (length' sl) fun unsafeSub' (T {seq, start, ...}, i) = S.subUnsafe (seq, start +? i) fun unsafeSub (sl, i) = unsafeSub' (sl, SeqIndex.fromIntUnsafe i) fun sub' (sl as T {len, ...}, i) = if Primitive.Controls.safe andalso geu (i, len) then raise Subscript else unsafeSub' (sl, i) fun sub (sl, i) = if Primitive.Controls.safe then let val i = (SeqIndex.fromInt i) handle Overflow => raise Subscript in sub' (sl, i) end else unsafeSub (sl, i) fun unsafeUpdate'Mk updateUnsafe (T {seq, start, ...}, i, x) = updateUnsafe (seq, start +? i, x) fun unsafeUpdateMk updateUnsafe (sl, i, x) = (unsafeUpdate'Mk updateUnsafe) (sl, SeqIndex.fromIntUnsafe i, x) fun update'Mk updateUnsafe (sl as T {len, ...}, i, x) = if Primitive.Controls.safe andalso geu (i, len) then raise Subscript else (unsafeUpdate'Mk updateUnsafe) (sl, i, x) fun updateMk updateUnsafe (sl, i, x) = if Primitive.Controls.safe then let val i = (SeqIndex.fromInt i) handle Overflow => raise Subscript in (update'Mk updateUnsafe) (sl, i, x) end else (unsafeUpdateMk updateUnsafe) (sl, i, x) fun full (seq: 'a sequence) : 'a slice = T {seq = seq, start = 0, len = S.length seq} fun unsafeSubslice' (T {seq, start, len}, start', len') = T {seq = seq, start = start +? start', len = (case len' of NONE => len -? start' | SOME len' => len')} fun unsafeSubslice (sl, start, len) = unsafeSubslice' (sl, SeqIndex.fromIntUnsafe start, Option.map SeqIndex.fromIntUnsafe len) fun unsafeSlice' (seq, start, len) = unsafeSubslice' (full seq, start, len) fun unsafeSlice (seq, start, len) = unsafeSubslice (full seq, start, len) fun subslice' (T {seq, start, len}, start', len') = case len' of NONE => if Primitive.Controls.safe andalso gtu (start', len) then raise Subscript else T {seq = seq, start = start +? start', len = len -? start'} | SOME len' => if Primitive.Controls.safe andalso (gtu (start', len) orelse gtu (len', len -? start')) then raise Subscript else T {seq = seq, start = start +? start', len = len'} fun subslice (sl, start, len) = if Primitive.Controls.safe then (subslice' (sl, SeqIndex.fromInt start, Option.map SeqIndex.fromInt len)) handle Overflow => raise Subscript else unsafeSubslice (sl, start, len) fun slice' (seq: 'a sequence, start, len) = subslice' (full seq, start, len) fun slice (seq: 'a sequence, start, len) = subslice (full seq, start, len) fun base' (T {seq, start, len}) = (seq, start, len) fun base (T {seq, start, len}) = (seq, SeqIndex.toIntUnsafe start, SeqIndex.toIntUnsafe len) fun isEmpty sl = length sl = 0 fun getItem (sl as T {seq, start, len}) = if isEmpty sl then NONE else SOME (S.subUnsafe (seq, start), T {seq = seq, start = start +? 1, len = len -? 1}) fun foldli' f b (T {seq, start, len}) = let val min = start val len = len -? 1 val max = start +? len fun loop (i, b) = if i > max then b else loop (i +? 1, f (i -? min, S.subUnsafe (seq, i), b)) in loop (min, b) end fun foldli f b sl = foldli' (wrap3 f) b sl fun foldri' f b (T {seq, start, len}) = let val min = start val len = len -? 1 val max = start +? len fun loop (i, b) = if i < min then b else loop (i -? 1, f (i -? min, S.subUnsafe (seq, i), b)) in loop (max, b) end fun foldri f b sl = foldri' (wrap3 f) b sl local fun make foldi f b sl = foldi (fn (_, x, b) => f (x, b)) b sl in fun foldl f = make foldli' f fun foldr f = make foldri' f end fun appi' f sl = foldli' (fn (i, x, ()) => f (i, x)) () sl fun appi f sl = appi' (wrap2 f) sl fun app f sl = appi (f o #2) sl fun createi' tabulate' f (T {seq, start, len}) = tabulate' (len, fn i => f (i, S.subUnsafe (seq, start +? i))) fun createi tabulate' f sl = createi' tabulate' (wrap2 f) sl fun create tabulate' f sl = createi tabulate' (f o #2) sl fun mapi' f sl = createi' tabulate' f sl fun mapi f sl = mapi' (wrap2 f) sl fun map f sl = mapi (f o #2) sl fun findi' p (T {seq, start, len}) = let val min = start val len = len -? 1 val max = start +? len fun loop i = if i > max then NONE else let val z = (i -? min, S.subUnsafe (seq, i)) in if p z then SOME z else loop (i +? 1) end in loop min end fun findi p sl = Option.map (wrap2 (fn z => z)) (findi' (wrap2 p) sl) fun find p sl = Option.map #2 (findi (p o #2) sl) fun existsi' p sl = Option.isSome (findi' p sl) fun existsi p sl = existsi' (wrap2 p) sl fun exists p sl = existsi (p o #2) sl fun alli' p sl = not (existsi' (not o p) sl) fun alli p sl = alli' (wrap2 p) sl fun all p sl = alli (p o #2) sl fun collate cmp (T {seq = seq1, start = start1, len = len1}, T {seq = seq2, start = start2, len = len2}) = let val min1 = start1 val min2 = start2 val max1 = start1 +? len1 val max2 = start2 +? len2 fun loop (i, j) = case (i >= max1, j >= max2) of (true, true) => EQUAL | (true, false) => LESS | (false, true) => GREATER | (false, false) => (case cmp (S.subUnsafe (seq1, i), S.subUnsafe (seq2, j)) of EQUAL => loop (i +? 1, j +? 1) | ans => ans) in loop (min1, min2) end fun sequence (sl as T {seq, start, len}): 'a sequence = if S.isMutable orelse (start <> 0 orelse len <> S.length seq) then map (fn x => x) sl else seq fun append (sl1: 'a slice, sl2: 'a slice): 'a sequence = if length' sl1 = 0 then sequence sl2 else if length' sl2 = 0 then sequence sl1 else let val l1 = length' sl1 val l2 = length' sl2 val n = (l1 + l2) handle Overflow => raise Size in #1 (unfoldi' (n, (0, sl1), fn (_, (i, sl)) => if SeqIndex.< (i, length' sl) then (unsafeSub' (sl, i), (i +? 1, sl)) else (unsafeSub' (sl2, 0), (1, sl2)))) end fun concat (sls: 'a slice list): 'a sequence = case sls of [] => seq0 () | [sl] => sequence sl | sls' as sl::sls => let val n = (List.foldl (fn (sl, s) => s +? length' sl) 0 sls') handle Overflow => raise Size in #1 (unfoldi' (n, (0, sl, sls), fn (_, ac) => let fun loop (i, sl, sls) = if SeqIndex.< (i, length' sl) then (unsafeSub' (sl, i), (i +? 1, sl, sls)) else case sls of [] => raise Fail "Sequence.Slice.concat" | sl :: sls => loop (0, sl, sls) in loop ac end)) end fun concatWith (sep: 'a sequence) (sls: 'a slice list): 'a sequence = let val sep = full sep in case sls of [] => seq0 () | [sl] => sequence sl | sl::sls => List.foldl (fn (sl,seq) => concat [full seq, sep, full (sequence sl)]) (sequence sl) sls end fun triml k = if Primitive.Controls.safe andalso Int.< (k, 0) then raise Subscript else (fn (T {seq, start, len}) => let val k = if Primitive.Controls.safe then SeqIndex.fromInt k else SeqIndex.fromIntUnsafe k in if SeqIndex.> (k, len) then unsafeSlice' (seq, start +? len, SOME 0) else unsafeSlice' (seq, start +? k, SOME (len -? k)) end handle Overflow => unsafeSlice' (seq, start +? len, SOME 0)) fun trimr k = if Primitive.Controls.safe andalso Int.< (k, 0) then raise Subscript else (fn (T {seq, start, len}) => let val k = if Primitive.Controls.safe then SeqIndex.fromInt k else SeqIndex.fromIntUnsafe k in if SeqIndex.> (k, len) then unsafeSlice' (seq, start, SOME 0) else unsafeSlice' (seq, start, SOME (len -? k)) end handle Overflow => unsafeSlice' (seq, start, SOME 0)) fun isSubsequence (eq: 'a elt * 'a elt -> bool) (seq: 'a sequence) (sl: 'a slice) = let val n = S.length seq val n' = length' sl in if n <= n' then let val n'' = n' -? n fun loop (i, j) = if i > n'' then false else if j >= n then true else if eq (S.subUnsafe (seq, j), unsafeSub' (sl, i +? j)) then loop (i, j +? 1) else loop (i +? 1, 0) in loop (0, 0) end else false end fun isPrefix (eq: 'a elt * 'a elt -> bool) (seq: 'a sequence) (sl: 'a slice) = let val n = S.length seq val n' = length' sl in if n <= n' then let fun loop (j) = if j >= n then true else if eq (S.subUnsafe (seq, j), unsafeSub' (sl, j)) then loop (j +? 1) else false in loop (0) end else false end fun isSuffix (eq: 'a elt * 'a elt -> bool) (seq: 'a sequence) (sl: 'a slice) = let val n = S.length seq val n' = length' sl in if n <= n' then let val n'' = n' -? n fun loop (j) = if j >= n then true else if eq (S.subUnsafe (seq, j), unsafeSub' (sl, n'' +? j)) then loop (j +? 1) else false in loop (0) end else false end fun split' (T {seq, start, len}, i) = (unsafeSlice' (seq, start, SOME (i -? start)), unsafeSlice' (seq, i, SOME (len -? (i -? start)))) fun splitl f (sl as T {seq, start, len}) = let val stop = start +? len fun loop i = if i >= stop then i else if f (S.subUnsafe (seq, i)) then loop (i +? 1) else i in split' (sl, loop start) end fun splitr f (sl as T {seq, start, len}) = let fun loop i = if i < start then start else if f (S.subUnsafe (seq, i)) then loop (i -? 1) else i +? 1 in split' (sl, loop (start +? len -? 1)) end fun splitAt' (T {seq, start, len}, i) = if Primitive.Controls.safe andalso SeqIndex.gtu (i, len) then raise Subscript else (unsafeSlice' (seq, start, SOME i), unsafeSlice' (seq, start +? i, SOME (len -? i))) fun splitAt (sl, i) = if Primitive.Controls.safe then (splitAt' (sl, SeqIndex.fromInt i)) handle Overflow => raise Subscript else splitAt' (sl, SeqIndex.fromIntUnsafe i) fun dropl p s = #2 (splitl p s) fun dropr p s = #1 (splitr p s) fun takel p s = #1 (splitl p s) fun taker p s = #2 (splitr p s) fun position (eq: 'a elt * 'a elt -> bool) (seq': 'a sequence) (sl as T {seq, start, len}) = let val len' = S.length seq' val max = start +? len -? len' +? 1 (* loop returns the index of the front of the suffix. *) fun loop i = if i >= max then start +? len else let fun loop' j = if j >= len' then i else if eq (S.subUnsafe (seq, i +? j), S.subUnsafe (seq', j)) then loop' (j +? 1) else loop (i +? 1) in loop' 0 end in split' (sl, loop start) end fun span (eq: 'a sequence * 'a sequence -> bool) (T {seq, start, ...}, T {seq = seq', start = start', len = len'}) = if Primitive.Controls.safe andalso (not (eq (seq, seq')) orelse start' +? len' < start) then raise Span else unsafeSlice' (seq, start, SOME ((start' +? len') -? start)) fun translate f (sl: 'a slice) = concat (List.rev (foldl (fn (c, l) => (full (f c)) :: l) [] sl)) local fun make finish p (T {seq, start, len}) = let val max = start +? len fun loop (i, start, sls) = if i >= max then List.rev (finish (seq, start, i, sls)) else if p (S.subUnsafe (seq, i)) then loop (i +? 1, i +? 1, finish (seq, start, i, sls)) else loop (i +? 1, start, sls) in loop (start, start, []) end in fun tokens p sl = make (fn (seq, start, stop, sls) => if start = stop then sls else (unsafeSlice' (seq, start, SOME (stop -? start))) :: sls) p sl fun fields p sl = make (fn (seq, start, stop, sls) => (unsafeSlice' (seq, start, SOME (stop -? start))) :: sls) p sl end fun toList (sl: 'a slice) = foldr (fn (a,l) => a::l) [] sl end local fun make f seq = f (Slice.full seq) fun make2 f (seq1, seq2) = f (Slice.full seq1, Slice.full seq2) in fun sub (seq, i) = Slice.sub (Slice.full seq, i) fun sub' (seq, i) = Slice.sub' (Slice.full seq, i) fun unsafeSub (seq, i) = Slice.unsafeSub (Slice.full seq, i) fun unsafeSub' (seq, i) = Slice.unsafeSub' (Slice.full seq, i) fun updateMk updateUnsafe (seq, i, x) = Slice.updateMk updateUnsafe (Slice.full seq, i, x) fun update'Mk updateUnsafe (seq, i, x) = Slice.update'Mk updateUnsafe (Slice.full seq, i, x) fun unsafeUpdateMk updateUnsafe (seq, i, x) = Slice.unsafeUpdateMk updateUnsafe (Slice.full seq, i, x) fun unsafeUpdate'Mk updateUnsafe (seq, i, x) = Slice.unsafeUpdate'Mk updateUnsafe (Slice.full seq, i, x) fun append seqs = make2 Slice.append seqs fun concat seqs = Slice.concat (List.map Slice.full seqs) fun appi' f = make (Slice.appi' f) fun appi f = make (Slice.appi f) fun app f = make (Slice.app f) fun mapi' f = make (Slice.mapi' f) fun mapi f = make (Slice.mapi f) fun map f = make (Slice.map f) fun foldli' f b = make (Slice.foldli' f b) fun foldli f b = make (Slice.foldli f b) fun foldl f b = make (Slice.foldl f b) fun foldri' f b = make (Slice.foldri' f b) fun foldri f b = make (Slice.foldri f b) fun foldr f b = make (Slice.foldr f b) fun findi' p = make (Slice.findi' p) fun findi p = make (Slice.findi p) fun find p = make (Slice.find p) fun existsi' p = make (Slice.existsi' p) fun existsi p = make (Slice.existsi p) fun exists p = make (Slice.exists p) fun alli' p = make (Slice.alli' p) fun alli p = make (Slice.alli p) fun all p = make (Slice.all p) fun collate cmp = make2 (Slice.collate cmp) fun concatWith sep seqs = Slice.concatWith sep (List.map Slice.full seqs) fun isPrefix eq seq = make (Slice.isPrefix eq seq) fun isSubsequence eq seq = make (Slice.isSubsequence eq seq) fun isSuffix eq seq = make (Slice.isSuffix eq seq) fun translate f = make (Slice.translate f) fun tokens f seq = List.map Slice.sequence (make (Slice.tokens f) seq) fun fields f seq = List.map Slice.sequence (make (Slice.fields f) seq) fun createi' tabulate' f seq = make (Slice.createi' tabulate' f) seq fun createi tabulate' f seq = make (Slice.createi tabulate' f) seq fun create tabulate' f seq = make (Slice.create tabulate' f) seq fun duplicate seq = make Slice.sequence seq fun toList seq = make Slice.toList seq end end mlton-20100608/basis-library/arrays-and-vectors/sequence.sig0000644000076600000240000001234211404435631022365 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SEQUENCE = sig type 'a sequence type 'a elt structure Slice : SLICE where type 'a sequence = 'a sequence and type 'a elt = 'a elt val maxLen: int val fromList: 'a elt list -> 'a sequence val tabulate': SeqIndex.int * (SeqIndex.int -> 'a elt) -> 'a sequence val tabulate: int * (int -> 'a elt) -> 'a sequence val length': 'a sequence -> SeqIndex.int val length: 'a sequence -> int val sub': 'a sequence * SeqIndex.int -> 'a elt val sub: 'a sequence * int -> 'a elt val unsafeSub': 'a sequence * SeqIndex.int -> 'a elt val unsafeSub: 'a sequence * int -> 'a elt (* update'Mk,updateMk,unsafeUpdate'Mk,unsafeUpdateMk: * ('a sequence * SeqIndex.int * 'a elt -> unit) should be an unsafe update. *) val update'Mk: ('a sequence * SeqIndex.int * 'a elt -> unit) -> ('a sequence * SeqIndex.int * 'a elt) -> unit val updateMk: ('a sequence * SeqIndex.int * 'a elt -> unit) -> ('a sequence * int * 'a elt) -> unit val unsafeUpdate'Mk: ('a sequence * SeqIndex.int * 'a elt -> unit) -> ('a sequence * SeqIndex.int * 'a elt) -> unit val unsafeUpdateMk: ('a sequence * SeqIndex.int * 'a elt -> unit) -> ('a sequence * int * 'a elt) -> unit val concat: 'a sequence list -> 'a sequence val appi': (SeqIndex.int * 'a elt -> unit) -> 'a sequence -> unit val appi: (int * 'a elt -> unit) -> 'a sequence -> unit val app: ('a elt -> unit) -> 'a sequence -> unit val mapi' : (SeqIndex.int * 'a elt -> 'b elt) -> 'a sequence -> 'b sequence val mapi : (int * 'a elt -> 'b elt) -> 'a sequence -> 'b sequence val map: ('a elt -> 'b elt) -> 'a sequence -> 'b sequence val foldli': (SeqIndex.int * 'a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldli: (int * 'a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldl: ('a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldri': (SeqIndex.int * 'a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldri: (int * 'a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val foldr: ('a elt * 'b -> 'b) -> 'b -> 'a sequence -> 'b val findi': (SeqIndex.int * 'a elt -> bool) -> 'a sequence -> (SeqIndex.int * 'a elt) option val findi: (int * 'a elt -> bool) -> 'a sequence -> (int * 'a elt) option val find: ('a elt -> bool) -> 'a sequence -> 'a elt option val existsi': (SeqIndex.int * 'a elt -> bool) -> 'a sequence -> bool val existsi: (int * 'a elt -> bool) -> 'a sequence -> bool val exists: ('a elt -> bool) -> 'a sequence -> bool val alli': (SeqIndex.int * 'a elt -> bool) -> 'a sequence -> bool val alli: (int * 'a elt -> bool) -> 'a sequence -> bool val all: ('a elt -> bool) -> 'a sequence -> bool val collate: ('a elt * 'a elt -> order) -> 'a sequence * 'a sequence -> order (* Used to implement Substring/String functions *) val concatWith: 'a sequence -> 'a sequence list -> 'a sequence val isPrefix: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a sequence -> bool val isSubsequence: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a sequence -> bool val isSuffix: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a sequence -> bool val translate: ('a elt -> 'b sequence) -> 'a sequence -> 'b sequence val tokens: ('a elt -> bool) -> 'a sequence -> 'a sequence list val fields: ('a elt -> bool) -> 'a sequence -> 'a sequence list (* Extra *) val append: 'a sequence * 'a sequence -> 'a sequence (* createi',createi,create: * (SeqIndex.int * (SeqIndex.int -> 'b elt) -> 'c) should be a tabulate' function. *) val createi': (SeqIndex.int * (SeqIndex.int -> 'b elt) -> 'c) -> (SeqIndex.int * 'a elt -> 'b elt) -> 'a sequence -> 'c val createi: (SeqIndex.int * (SeqIndex.int -> 'b elt) -> 'c) -> (int * 'a elt -> 'b elt) -> 'a sequence -> 'c val create: (SeqIndex.int * (SeqIndex.int -> 'b elt) -> 'c) -> ('a elt -> 'b elt) -> 'a sequence -> 'c val duplicate: 'a sequence -> 'a sequence val generate': SeqIndex.int -> {done: unit -> 'a sequence, sub: SeqIndex.int -> 'a elt, update: SeqIndex.int * 'a elt -> unit} val generate: int -> {done: unit -> 'a sequence, sub: int -> 'a elt, update: int * 'a elt -> unit} val newUninit': SeqIndex.int -> 'a sequence val newUninit: int -> 'a sequence val new': SeqIndex.int * 'a elt -> 'a sequence val new: int * 'a elt -> 'a sequence val toList: 'a sequence -> 'a elt list val unfoldi': SeqIndex.int * 'b * (SeqIndex.int * 'b -> 'a elt * 'b) -> 'a sequence * 'b val unfoldi: int * 'b * (int * 'b -> 'a elt * 'b) -> 'a sequence * 'b val unfold: int * 'b * ('b -> 'a elt * 'b) -> 'a sequence * 'b end mlton-20100608/basis-library/arrays-and-vectors/slice.sig0000644000076600000240000001330511404435631021654 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SLICE = sig type 'a sequence type 'a elt type 'a slice val length': 'a slice -> SeqIndex.int val length: 'a slice -> int val sub': 'a slice * SeqIndex.int -> 'a elt val sub: 'a slice * int -> 'a elt val unsafeSub': 'a slice * SeqIndex.int -> 'a elt val unsafeSub: 'a slice * int -> 'a elt (* update'Mk,updateMk,unsafeUpdate'Mk,unsafeUpdateMk: * ('a sequence * SeqIndex.int * 'a elt -> unit) should be an unsafe update. *) val update'Mk: ('a sequence * SeqIndex.int * 'a elt -> unit) -> ('a slice * SeqIndex.int * 'a elt) -> unit val updateMk: ('a sequence * SeqIndex.int * 'a elt -> unit) -> ('a slice * int * 'a elt) -> unit val unsafeUpdate'Mk: ('a sequence * SeqIndex.int * 'a elt -> unit) -> ('a slice * SeqIndex.int * 'a elt) -> unit val unsafeUpdateMk: ('a sequence * SeqIndex.int * 'a elt -> unit) -> ('a slice * int * 'a elt) -> unit val full: 'a sequence -> 'a slice val slice': 'a sequence * SeqIndex.int * SeqIndex.int option -> 'a slice val slice: 'a sequence * int * int option -> 'a slice val unsafeSlice': 'a sequence * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSlice: 'a sequence * int * int option -> 'a slice val subslice': 'a slice * SeqIndex.int * SeqIndex.int option -> 'a slice val subslice: 'a slice * int * int option -> 'a slice val unsafeSubslice': 'a slice * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSubslice: 'a slice * int * int option -> 'a slice val base': 'a slice -> 'a sequence * SeqIndex.int * SeqIndex.int val base: 'a slice -> 'a sequence * int * int val concat: 'a slice list -> 'a sequence val isEmpty: 'a slice -> bool val getItem: 'a slice -> ('a elt * 'a slice) option val appi': (SeqIndex.int * 'a elt -> unit) -> 'a slice -> unit val appi: (int * 'a elt -> unit) -> 'a slice -> unit val app: ('a elt -> unit) -> 'a slice -> unit val mapi': (SeqIndex.int * 'a elt -> 'b elt) -> 'a slice -> 'b sequence val mapi: (int * 'a elt -> 'b elt) -> 'a slice -> 'b sequence val map: ('a elt -> 'b elt) -> 'a slice -> 'b sequence val foldli': (SeqIndex.int * 'a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldli: (int * 'a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldl: ('a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldri': (SeqIndex.int * 'a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldri: (int * 'a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldr: ('a elt * 'b -> 'b) -> 'b -> 'a slice -> 'b val findi': (SeqIndex.int * 'a elt -> bool) -> 'a slice -> (SeqIndex.int * 'a elt) option val findi: (int * 'a elt -> bool) -> 'a slice -> (int * 'a elt) option val find: ('a elt -> bool) -> 'a slice -> 'a elt option val existsi': (SeqIndex.int * 'a elt -> bool) -> 'a slice -> bool val existsi: (int * 'a elt -> bool) -> 'a slice -> bool val exists: ('a elt -> bool) -> 'a slice -> bool val alli': (SeqIndex.int * 'a elt -> bool) -> 'a slice -> bool val alli: (int * 'a elt -> bool) -> 'a slice -> bool val all: ('a elt -> bool) -> 'a slice -> bool val collate: ('a elt * 'a elt -> order) -> 'a slice * 'a slice -> order (* Used to implement Substring/String functions *) val concatWith: 'a sequence -> 'a slice list -> 'a sequence val triml: int -> 'a slice -> 'a slice val trimr: int -> 'a slice -> 'a slice val isPrefix: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> bool val isSubsequence: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> bool val isSuffix: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> bool val splitl: ('a elt -> bool) -> 'a slice -> 'a slice * 'a slice val splitr: ('a elt -> bool) -> 'a slice -> 'a slice * 'a slice val splitAt': 'a slice * SeqIndex.int -> 'a slice * 'a slice val splitAt: 'a slice * int -> 'a slice * 'a slice val dropl: ('a elt -> bool) -> 'a slice -> 'a slice val dropr: ('a elt -> bool) -> 'a slice -> 'a slice val takel: ('a elt -> bool) -> 'a slice -> 'a slice val taker: ('a elt -> bool) -> 'a slice -> 'a slice val position: ('a elt * 'a elt -> bool) -> 'a sequence -> 'a slice -> 'a slice * 'a slice (* span: * ('a sequence * 'a sequence -> bool) should be polymorphic equality *) val span: ('a sequence * 'a sequence -> bool) -> 'a slice * 'a slice -> 'a slice val translate: ('a elt -> 'b sequence) -> 'a slice -> 'b sequence val tokens: ('a elt -> bool) -> 'a slice -> 'a slice list val fields: ('a elt -> bool) -> 'a slice -> 'a slice list (* Extra *) val append: 'a slice * 'a slice -> 'a sequence (* createi',createi,create: * (SeqIndex.int * (SeqIndex.int -> 'b elt) -> 'c) should be a tabulate' function. *) val createi': (SeqIndex.int * (SeqIndex.int -> 'b elt) -> 'c) -> (SeqIndex.int * 'a elt -> 'b elt) -> 'a slice -> 'c val createi: (SeqIndex.int * (SeqIndex.int -> 'b elt) -> 'c) -> (int * 'a elt -> 'b elt) -> 'a slice -> 'c val create: (SeqIndex.int * (SeqIndex.int -> 'b elt) -> 'c) -> ('a elt -> 'b elt) -> 'a slice -> 'c val toList: 'a slice -> 'a elt list val sequence: 'a slice -> 'a sequence end mlton-20100608/basis-library/arrays-and-vectors/vector-slice.sig0000644000076600000240000000620711404435631023157 0ustar mtfstaffstructure Vector = struct type 'a vector = 'a vector end signature VECTOR_SLICE_GLOBAL = sig end signature VECTOR_SLICE = sig include VECTOR_SLICE_GLOBAL type 'a slice val length: 'a slice -> int val sub: 'a slice * int -> 'a val full: 'a Vector.vector -> 'a slice val slice: 'a Vector.vector * int * int option -> 'a slice val subslice: 'a slice * int * int option -> 'a slice val base: 'a slice -> 'a Vector.vector * int * int val vector: 'a slice -> 'a Vector.vector val concat: 'a slice list -> 'a Vector.vector val isEmpty: 'a slice -> bool val getItem: 'a slice -> ('a * 'a slice) option val appi: (int * 'a -> unit) -> 'a slice -> unit val app: ('a -> unit) -> 'a slice -> unit val mapi: (int * 'a -> 'b) -> 'a slice -> 'b Vector.vector val map: ('a -> 'b) -> 'a slice -> 'b Vector.vector val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldl: ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a slice -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a slice -> 'b val findi: (int * 'a -> bool) -> 'a slice -> (int * 'a) option val find: ('a -> bool) -> 'a slice -> 'a option val exists: ('a -> bool) -> 'a slice -> bool val all: ('a -> bool) -> 'a slice -> bool val collate: ('a * 'a -> order) -> 'a slice * 'a slice -> order end signature VECTOR_SLICE_EXTRA = sig include VECTOR_SLICE val unsafeSub': 'a slice * SeqIndex.int -> 'a val unsafeSub: 'a slice * int -> 'a val unsafeSlice': 'a Vector.vector * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSlice: 'a Vector.vector * int * int option -> 'a slice val unsafeSubslice': 'a slice * SeqIndex.int * SeqIndex.int option -> 'a slice val unsafeSubslice: 'a slice * int * int option -> 'a slice (* Used to implement Substring/String functions *) val concatWith: 'a Vector.vector -> 'a slice list -> 'a Vector.vector val triml: int -> 'a slice -> 'a slice val trimr: int -> 'a slice -> 'a slice val isPrefix: ('a * 'a -> bool) -> 'a Vector.vector -> 'a slice -> bool val isSubvector: ('a * 'a -> bool) -> 'a Vector.vector -> 'a slice -> bool val isSuffix: ('a * 'a -> bool) -> 'a Vector.vector -> 'a slice -> bool val splitl: ('a -> bool) -> 'a slice -> 'a slice * 'a slice val splitr: ('a -> bool) -> 'a slice -> 'a slice * 'a slice val splitAt: 'a slice * int -> 'a slice * 'a slice val dropl: ('a -> bool) -> 'a slice -> 'a slice val dropr: ('a -> bool) -> 'a slice -> 'a slice val takel: ('a -> bool) -> 'a slice -> 'a slice val taker: ('a -> bool) -> 'a slice -> 'a slice val position: ('a * 'a -> bool) -> 'a Vector.vector -> 'a slice -> 'a slice * 'a slice val span: ''a slice * ''a slice -> ''a slice val translate: ('a -> 'b Vector.vector) -> 'a slice -> 'b Vector.vector val tokens: ('a -> bool) -> 'a slice -> 'a slice list val fields: ('a -> bool) -> 'a slice -> 'a slice list val toList: 'a slice -> 'a list end mlton-20100608/basis-library/arrays-and-vectors/vector.sig0000644000076600000240000000452511404435631022063 0ustar mtfstaffsignature VECTOR_GLOBAL = sig type 'a vector = 'a vector end signature VECTOR = sig include VECTOR_GLOBAL val maxLen: int val fromList: 'a list -> 'a vector val tabulate: int * (int -> 'a) -> 'a vector val length: 'a vector -> int val sub: 'a vector * int -> 'a val update: 'a vector * int * 'a -> 'a vector val concat: 'a vector list -> 'a vector val appi: (int * 'a -> unit) -> 'a vector -> unit val app: ('a -> unit) -> 'a vector -> unit val mapi : (int * 'a -> 'b) -> 'a vector -> 'b vector val map: ('a -> 'b) -> 'a vector -> 'b vector val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a vector -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a vector -> 'b val foldl: ('a * 'b -> 'b) -> 'b -> 'a vector -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a vector -> 'b val findi: (int * 'a -> bool) -> 'a vector -> (int * 'a) option val find: ('a -> bool) -> 'a vector -> 'a option val exists: ('a -> bool) -> 'a vector -> bool val all: ('a -> bool) -> 'a vector -> bool val collate: ('a * 'a -> order) -> 'a vector * 'a vector -> order end signature VECTOR_EXTRA = sig include VECTOR structure VectorSlice: VECTOR_SLICE_EXTRA val unsafeFromArray: 'a array -> 'a vector val unsafeSub: 'a vector * int -> 'a (* Used to implement Substring/String functions *) val concatWith: 'a vector -> 'a vector list -> 'a vector val isPrefix: ('a * 'a -> bool) -> 'a vector -> 'a vector -> bool val isSubvector: ('a * 'a -> bool) -> 'a vector -> 'a vector -> bool val isSuffix: ('a * 'a -> bool) -> 'a vector -> 'a vector -> bool val translate: ('a -> 'b vector) -> 'a vector -> 'b vector val tokens: ('a -> bool) -> 'a vector -> 'a vector list val fields: ('a -> bool) -> 'a vector -> 'a vector list val append: 'a vector * 'a vector -> 'a vector val create: int -> {done: unit -> 'a vector, sub: int -> 'a, update: int * 'a -> unit} val duplicate: 'a vector -> 'a vector val tabulate': SeqIndex.int * (SeqIndex.int -> 'a) -> 'a vector val toList: 'a vector -> 'a list val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a vector * 'b val vector: int * 'a -> 'a vector end mlton-20100608/basis-library/arrays-and-vectors/vector.sml0000644000076600000240000000420711404435631022071 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Vector: VECTOR_EXTRA = struct structure V = Sequence (type 'a sequence = 'a vector type 'a elt = 'a val fromArray = Primitive.Vector.fromArrayUnsafe val isMutable = false val length = Primitive.Vector.length val subUnsafe = Primitive.Vector.subUnsafe) open V type 'a vector = 'a vector structure VectorSlice = struct open Slice type 'a vector = 'a vector val vector = sequence val isSubvector = isSubsequence val span = fn (sl, sl') => span (op = : ''a vector * ''a vector -> bool) (sl, sl') end fun update (v, i, x) = let fun doit i = tabulate' (length' v, fn j => if i = j then x else unsafeSub' (v, j)) in if Primitive.Controls.safe then let val i = (SeqIndex.fromInt i) handle Overflow => raise Subscript in if SeqIndex.geu (i, length' v) then raise Subscript else doit i end else let val i = SeqIndex.fromIntUnsafe i in doit i end end val isSubvector = isSubsequence val unsafeFromArray = Primitive.Vector.fromArrayUnsafe val vector = new val create = generate end structure VectorSlice: VECTOR_SLICE_EXTRA = Vector.VectorSlice structure VectorGlobal: VECTOR_GLOBAL = Vector open VectorGlobal val vector = Vector.fromList mlton-20100608/basis-library/basis-1997.mlb0000644000076600000240000000130511404435632016527 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local basis-2002.mlb libs/basis-1997/basis-1997.mlb in libs/basis-1997/top-level/basis-funs.sml libs/basis-1997/top-level/basis-sigs.sml libs/basis-1997/top-level/top-level.sml libs/basis-1997/top-level/infixes.sml ann "allowOverload true" in libs/basis-1997/top-level/overloads.sml end end end mlton-20100608/basis-library/basis-2002.mlb0000644000076600000240000000131711404435632016504 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb libs/basis-2002/basis-2002.mlb in libs/basis-2002/top-level/basis-funs.sml libs/basis-2002/top-level/basis-sigs.sml libs/basis-2002/top-level/top-level.sml libs/basis-2002/top-level/infixes.sml ann "allowOverload true" in libs/basis-2002/top-level/overloads.sml end end end mlton-20100608/basis-library/basis-none.mlb0000644000076600000240000000110111404435632017047 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb libs/basis-none/top-level/basis.sig libs/basis-none/top-level/basis.sml in libs/basis-none/top-level/top-level.sml libs/basis-none/top-level/infixes.sml end end mlton-20100608/basis-library/basis.mlb0000644000076600000240000000032711404435632016123 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) basis-2002.mlb mlton-20100608/basis-library/build/0000755000076600000240000000000011404470406015421 5ustar mtfstaffmlton-20100608/basis-library/build/sources.mlb0000644000076600000240000002304311404435632017604 0ustar mtfstaff(* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused false" "forceUsed" in ../primitive/primitive.mlb ../top-level/infixes.sml ../top-level/infixes-overflow.sml ../top-level/infixes-unsafe.sml ../util/dynamic-wind.sig ../util/dynamic-wind.sml ../integer/iwconv0.sml ../integer/num0.sml local ../config/bind/int-prim.sml ../config/bind/pointer-prim.sml ../config/bind/real-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/objptr/objptr-$(OBJPTR_REP).sml ../config/header/header-$(HEADER_WORD).sml ../config/seqindex/seqindex-$(SEQINDEX_INT).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml end end ../integer/int-inf0.sml local local ../config/bind/int-prim.sml ../config/bind/int-inf-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_INT).sml ../config/default/default-$(DEFAULT_WORD).sml ../config/default/fixed-int.sml ../config/default/large-int.sml ../config/default/large-word.sml ../config/c/position.sml ../config/c/sys-word.sml end end in ../integer/num1.sml end local ../config/bind/char-prim.sml ../config/bind/int-prim.sml ../config/bind/int-inf-prim.sml ../config/bind/real-prim.sml ../config/bind/string-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_CHAR).sml ../config/default/default-$(DEFAULT_WIDECHAR).sml ../config/default/default-$(DEFAULT_INT).sml ../config/default/default-$(DEFAULT_REAL).sml ../config/default/default-$(DEFAULT_WORD).sml ../config/default/fixed-int.sml ../config/default/large-int.sml ../config/default/large-real.sml ../config/default/large-word.sml end end ../general/general.sig ../general/general.sml ../util/one.sml ../general/option.sig ../general/option.sml ../list/list.sig ../list/list.sml ../list/list-pair.sig ../list/list-pair.sml local ../config/bind/int-prim.sml in ann "forceUsed" in ../config/seqindex/seqindex-$(SEQINDEX_INT).sml end end ../arrays-and-vectors/slice.sig ../arrays-and-vectors/sequence.sig ../arrays-and-vectors/sequence.fun ../arrays-and-vectors/vector-slice.sig ../arrays-and-vectors/vector.sig ../arrays-and-vectors/vector.sml ../arrays-and-vectors/array-slice.sig ../arrays-and-vectors/array.sig ../arrays-and-vectors/array.sml ../arrays-and-vectors/array2.sig ../arrays-and-vectors/array2.sml ../arrays-and-vectors/mono-vector-slice.sig ../arrays-and-vectors/mono-vector.sig ../arrays-and-vectors/mono-vector.fun ../arrays-and-vectors/mono-array-slice.sig ../arrays-and-vectors/mono-array.sig ../arrays-and-vectors/mono-array.fun ../arrays-and-vectors/mono-array2.sig ../arrays-and-vectors/mono-array2.fun ../arrays-and-vectors/mono.sml ../text/char0.sig ../text/string0.sml ../text/char0.sml ../util/reader.sig ../util/reader.sml ../text/string-cvt.sig ../text/string-cvt.sml ../general/bool.sig ../general/bool.sml ../integer/integer.sig ../integer/int.sml ../integer/word.sig ../integer/word.sml local ../config/bind/int-top.sml ../config/bind/pointer-prim.sml ../config/bind/real-prim.sml ../config/bind/word-top.sml in ann "forceUsed" in ../config/header/header-$(HEADER_WORD).sml ../config/objptr/objptr-$(OBJPTR_REP).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml ../config/c/position.sml ../config/c/sys-word.sml end end ../integer/int-inf.sig ../integer/int-inf.sml local ../config/bind/int-top.sml ../config/bind/int-inf-top.sml ../config/bind/word-top.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_INT).sml ../config/default/default-$(DEFAULT_WORD).sml ../config/default/fixed-int.sml ../config/default/large-int.sml ../config/default/large-word.sml end end ../integer/int-global.sml ../integer/word-global.sml ../top-level/arithmetic.sml ../util/natural.sml ../integer/embed-int.sml ../integer/embed-word.sml ../integer/pack-word.sig ../integer/pack-word.sml local ../config/bind/int-top.sml ../config/bind/pointer-prim.sml ../config/bind/real-prim.sml ../config/bind/word-top.sml in ann "forceUsed" in ../config/header/header-$(HEADER_WORD).sml ../config/objptr/objptr-$(OBJPTR_REP).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml ../config/c/position.sml ../config/c/sys-word.sml end end ../text/char.sig ../text/string.sig ../text/substring.sig ../text/text.sig ../util/heap.sml ../text/char.sml ../text/string.sml ../text/substring.sml ../text/text.sml ../text/char-global.sml ../text/string-global.sml ../text/substring-global.sml ../text/byte.sig ../text/byte.sml ../text/nullstring.sml ../util/CUtil.sig ../util/CUtil.sml ../util/unique-id.sig ../util/unique-id.fun ../util/cleaner.sig ../util/cleaner.sml ../util/abs-rep.sig ../util/abs-rep.fun ../config/c/sys-types.sml ../system/pre-os.sml ../posix/pre-posix.sml ../posix/error.sig ../posix/error.sml ../real/IEEE-real.sig ../real/IEEE-real.sml ../real/math.sig ../real/real.sig ../real/real.sml local ../config/bind/real-top.sml in ann "forceUsed" in ../config/default/default-$(DEFAULT_REAL).sml ../config/default/large-real.sml end end ../real/real-global.sml ../real/pack-real.sig ../real/pack-real.sml local ../config/bind/int-top.sml ../config/bind/pointer-prim.sml ../config/bind/real-top.sml ../config/bind/word-top.sml in ann "forceUsed" in ../config/header/header-$(HEADER_WORD).sml ../config/objptr/objptr-$(OBJPTR_REP).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml ../config/c/position.sml ../config/c/sys-word.sml end end ../system/time.sig ../system/time.sml ../system/date.sig ../system/date.sml ../io/io.sig ../io/io.sml ../io/prim-io.sig ../io/prim-io.fun ../io/bin-prim-io.sml ../io/text-prim-io.sml ../posix/stub-mingw.sml ../posix/flags.sig ../posix/flags.sml ../posix/signal.sig ../posix/signal.sml ../posix/proc-env.sig ../posix/proc-env.sml ../posix/file-sys.sig ../posix/file-sys.sml ../posix/io.sig ../posix/io.sml ../posix/process.sig ../posix/process.sml ../posix/sys-db.sig ../posix/sys-db.sml ../posix/tty.sig ../posix/tty.sml ../posix/posix.sig ../posix/posix.sml ../platform/cygwin.sml ../platform/mingw.sml ../io/stream-io.sig ../io/stream-io.fun ../io/imperative-io.sig ../io/imperative-io.fun ../io/bin-stream-io.sig ../io/bin-io.sig ../io/bin-io.sml ../io/text-stream-io.sig ../io/text-io.sig ../io/text-io.sml ../system/path.sig ../system/path.sml ../system/file-sys.sig ../system/file-sys.sml ../system/command-line.sig ../system/command-line.sml ../general/sml90.sig ../general/sml90.sml ../mlton/pointer.sig ../mlton/pointer.sml ../mlton/call-stack.sig ../mlton/call-stack.sml ../mlton/exit.sml ../mlton/exn.sig ../mlton/exn.sml ../mlton/thread.sig ../mlton/thread.sml ../mlton/signal.sig ../mlton/signal.sml ../mlton/process.sig ../mlton/process.sml ../mlton/gc.sig ../mlton/gc.sml ../mlton/rusage.sig ../mlton/rusage.sml ../system/process.sig ../system/process.sml ../system/io.sig ../system/io.sml ../system/os.sig ../system/os.sml ../system/unix.sig ../system/unix.sml ../system/timer.sig ../system/timer.sml ../net/net.sig ../net/net.sml ../net/net-host-db.sig ../net/net-host-db.sml ../net/net-prot-db.sig ../net/net-prot-db.sml ../net/net-serv-db.sig ../net/net-serv-db.sml ../net/socket.sig ../net/socket.sml ../net/generic-sock.sig ../net/generic-sock.sml ../net/inet-sock.sig ../net/inet-sock.sml ../net/unix-sock.sig ../net/unix-sock.sml ../mlton/platform.sig ../mlton/platform.sml ../mlton/array.sig ../mlton/cont.sig ../mlton/cont.sml ../mlton/random.sig ../mlton/random.sml ../mlton/io.sig ../mlton/io.fun ../mlton/text-io.sig ../mlton/bin-io.sig ../mlton/itimer.sig ../mlton/itimer.sml ../mlton/ffi.sig ann "ffiStr MLtonFFI" in ../mlton/ffi.sml end ../mlton/int-inf.sig ../mlton/proc-env.sig ../mlton/proc-env.sml ../mlton/profile.sig ../mlton/profile.sml (* ../mlton/ptrace.sig *) (* ../mlton/ptrace.sml *) ../mlton/rlimit.sig ../mlton/rlimit.sml ../mlton/socket.sig ../mlton/socket.sml ../mlton/syslog.sig ../mlton/syslog.sml ../mlton/vector.sig ../mlton/weak.sig ../mlton/weak.sml ../mlton/finalizable.sig ../mlton/finalizable.sml ../mlton/real.sig ../mlton/word.sig ../mlton/world.sig ../mlton/world.sml ../mlton/mono-array.sig ../mlton/mono-vector.sig ../mlton/mlton.sig ../mlton/mlton.sml ../sml-nj/sml-nj.sig ../sml-nj/sml-nj.sml ../sml-nj/unsafe.sig ../sml-nj/unsafe.sml end mlton-20100608/basis-library/c/0000755000076600000240000000000011404470406014544 5ustar mtfstaffmlton-20100608/basis-library/c/pointer.sig0000644000076600000240000000663311404435631016741 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature C_POINTER = sig type t = MLton.Pointer.t val add: t * C_Ptrdiff.t -> t val compare: t * t -> order val diff: t * t -> C_Ptrdiff.t val fromWord: C_Size.t -> t val getC_SChar: t * C_Ptrdiff.t -> C_SChar.t val getC_UChar: t * C_Ptrdiff.t -> C_UChar.t val getC_SShort: t * C_Ptrdiff.t -> C_SShort.t val getC_UShort: t * C_Ptrdiff.t -> C_UShort.t val getC_SInt: t * C_Ptrdiff.t -> C_SInt.t val getC_UInt: t * C_Ptrdiff.t -> C_UInt.t val getC_SLong: t * C_Ptrdiff.t -> C_SLong.t val getC_ULong: t * C_Ptrdiff.t -> C_ULong.t val getC_SLongLong: t * C_Ptrdiff.t -> C_SLongLong.t val getC_ULongLong: t * C_Ptrdiff.t -> C_ULongLong.t val getC_Float: t * C_Ptrdiff.t -> C_Float.t val getC_Double: t * C_Ptrdiff.t -> C_Double.t val getC_Size: t * C_Ptrdiff.t -> C_Size.t val getC_Ptrdiff: t * C_Ptrdiff.t -> C_Ptrdiff.t val getC_Intmax: t * C_Ptrdiff.t -> C_Intmax.t val getC_UIntmax: t * C_Ptrdiff.t -> C_UIntmax.t val getC_Intptr: t * C_Ptrdiff.t -> C_Intptr.t val getC_UIntptr: t * C_Ptrdiff.t -> C_UIntptr.t val getC_Pointer: t * C_Ptrdiff.t -> t val getInt8: t * C_Ptrdiff.t -> Int8.int val getInt16: t * C_Ptrdiff.t -> Int16.int val getInt32: t * C_Ptrdiff.t -> Int32.int val getInt64: t * C_Ptrdiff.t -> Int64.int val getReal32: t * C_Ptrdiff.t -> Real32.real val getReal64: t * C_Ptrdiff.t -> Real64.real val getWord8: t * C_Ptrdiff.t -> Word8.word val getWord16: t * C_Ptrdiff.t -> Word16.word val getWord32: t * C_Ptrdiff.t -> Word32.word val getWord64: t * C_Ptrdiff.t -> Word64.word val isNull: t -> bool val null: t val setC_SChar: t * C_Ptrdiff.t * C_SChar.t -> unit val setC_UChar: t * C_Ptrdiff.t * C_UChar.t -> unit val setC_SShort: t * C_Ptrdiff.t * C_SShort.t -> unit val setC_UShort: t * C_Ptrdiff.t * C_UShort.t -> unit val setC_SInt: t * C_Ptrdiff.t * C_SInt.t -> unit val setC_UInt: t * C_Ptrdiff.t * C_UInt.t -> unit val setC_SLong: t * C_Ptrdiff.t * C_SLong.t -> unit val setC_ULong: t * C_Ptrdiff.t * C_ULong.t -> unit val setC_SLongLong: t * C_Ptrdiff.t * C_SLongLong.t -> unit val setC_ULongLong: t * C_Ptrdiff.t * C_ULongLong.t -> unit val setC_Float: t * C_Ptrdiff.t * C_Float.t -> unit val setC_Double: t * C_Ptrdiff.t * C_Double.t -> unit val setC_Size: t * C_Ptrdiff.t * C_Size.t -> unit val setC_Ptrdiff: t * C_Ptrdiff.t * C_Ptrdiff.t -> unit val setC_Intmax: t * C_Ptrdiff.t * C_Intmax.t -> unit val setC_UIntmax: t * C_Ptrdiff.t * C_UIntmax.t -> unit val setC_Intptr: t * C_Ptrdiff.t * C_Intptr.t -> unit val setC_UIntptr: t * C_Ptrdiff.t * C_UIntptr.t -> unit val setC_Pointer: t * C_Ptrdiff.t * t -> unit val setInt8: t * C_Ptrdiff.t * Int8.int -> unit val setInt16: t * C_Ptrdiff.t * Int16.int -> unit val setInt32: t * C_Ptrdiff.t * Int32.int -> unit val setInt64: t * C_Ptrdiff.t * Int64.int -> unit val setReal32: t * C_Ptrdiff.t * Real32.real -> unit val setReal64: t * C_Ptrdiff.t * Real64.real -> unit val setWord8: t * C_Ptrdiff.t * Word8.word -> unit val setWord16: t * C_Ptrdiff.t * Word16.word -> unit val setWord32: t * C_Ptrdiff.t * Word32.word -> unit val setWord64: t * C_Ptrdiff.t * Word64.word -> unit val sizeofPointer: C_Size.t val sub: t * C_Ptrdiff.t -> t val toWord: t -> C_Size.t endmlton-20100608/basis-library/c/pointer.sml0000644000076600000240000002137411404435631016751 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure C_Pointer : C_POINTER = struct open Primitive.MLton.Pointer val sizeofPointer = C_Size.div (C_Size.fromInt C_Size.wordSize, 0w8) local structure S = C_SChar_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SChar = S.f end local structure S = C_UChar_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UChar = S.f end local structure S = C_SShort_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SShort = S.f end local structure S = C_UShort_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UShort = S.f end local structure S = C_SInt_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SInt = S.f end local structure S = C_UInt_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UInt = S.f end local structure S = C_SLong_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SLong = S.f end local structure S = C_ULong_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_ULong = S.f end local structure S = C_SLongLong_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_SLongLong = S.f end local structure S = C_ULongLong_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_ULongLong = S.f end local structure S = C_Float_ChooseRealN (type 'a t = t * C_Ptrdiff.t -> 'a val fReal32 = getReal32 val fReal64 = getReal64) in val getC_Float = S.f end local structure S = C_Double_ChooseRealN (type 'a t = t * C_Ptrdiff.t -> 'a val fReal32 = getReal32 val fReal64 = getReal64) in val getC_Double = S.f end local structure S = C_Size_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_Size = S.f end local structure S = C_Ptrdiff_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_Ptrdiff = S.f end local structure S = C_Intmax_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_Intmax = S.f end local structure S = C_UIntmax_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UIntmax = S.f end local structure S = C_Intptr_ChooseIntN (type 'a t = t * C_Ptrdiff.t -> 'a val fInt8 = getInt8 val fInt16 = getInt16 val fInt32 = getInt32 val fInt64 = getInt64) in val getC_Intptr = S.f end local structure S = C_UIntptr_ChooseWordN (type 'a t = t * C_Ptrdiff.t -> 'a val fWord8 = getWord8 val fWord16 = getWord16 val fWord32 = getWord32 val fWord64 = getWord64) in val getC_UIntptr = S.f end val getC_Pointer = getCPointer local structure S = C_SChar_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SChar = S.f end local structure S = C_UChar_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UChar = S.f end local structure S = C_SShort_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SShort = S.f end local structure S = C_UShort_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UShort = S.f end local structure S = C_SInt_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SInt = S.f end local structure S = C_UInt_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UInt = S.f end local structure S = C_SLong_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SLong = S.f end local structure S = C_ULong_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_ULong = S.f end local structure S = C_SLongLong_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_SLongLong = S.f end local structure S = C_ULongLong_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_ULongLong = S.f end local structure S = C_Float_ChooseRealN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fReal32 = setReal32 val fReal64 = setReal64) in val setC_Float = S.f end local structure S = C_Double_ChooseRealN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fReal32 = setReal32 val fReal64 = setReal64) in val setC_Double = S.f end local structure S = C_Size_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_Size = S.f end local structure S = C_Ptrdiff_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_Ptrdiff = S.f end local structure S = C_Intmax_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_Intmax = S.f end local structure S = C_UIntmax_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UIntmax = S.f end local structure S = C_Intptr_ChooseIntN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fInt8 = setInt8 val fInt16 = setInt16 val fInt32 = setInt32 val fInt64 = setInt64) in val setC_Intptr = S.f end local structure S = C_UIntptr_ChooseWordN (type 'a t = t * C_Ptrdiff.t * 'a -> unit val fWord8 = setWord8 val fWord16 = setWord16 val fWord32 = setWord32 val fWord64 = setWord64) in val setC_UIntptr = S.f end val setC_Pointer = setCPointer end mlton-20100608/basis-library/c-types.mlb0000644000076600000240000000424711404435632016413 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local basis.mlb mlton.mlb local config/choose-int.sml config/choose-real.sml config/choose-word.sml config/c/word-to-bool.sml config/bind/int-top.sml config/bind/real-top.sml config/bind/word-top.sml in ann "forceUsed" in $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml end end local local primitive/primitive.mlb in structure Primitive end in c/pointer.sig c/pointer.sml end in structure C_Char structure C_SChar functor C_SChar_ChooseIntN structure C_UChar functor C_UChar_ChooseWordN structure C_Short structure C_SShort functor C_SShort_ChooseIntN structure C_UShort functor C_UShort_ChooseWordN structure C_Int structure C_SInt functor C_SInt_ChooseIntN structure C_UInt functor C_UInt_ChooseWordN structure C_Long structure C_SLong functor C_SLong_ChooseIntN structure C_ULong functor C_ULong_ChooseWordN structure C_LongLong structure C_SLongLong functor C_SLongLong_ChooseIntN structure C_ULongLong functor C_ULongLong_ChooseWordN structure C_Float functor C_Float_ChooseRealN structure C_Double functor C_Double_ChooseRealN structure C_Size functor C_Size_ChooseWordN structure C_Ptrdiff functor C_Ptrdiff_ChooseIntN structure C_Intmax functor C_Intmax_ChooseIntN structure C_UIntmax functor C_UIntmax_ChooseWordN structure C_Intptr functor C_Intptr_ChooseIntN structure C_UIntptr functor C_UIntptr_ChooseWordN signature C_POINTER structure C_Pointer end end mlton-20100608/basis-library/config/0000755000076600000240000000000011404470406015567 5ustar mtfstaffmlton-20100608/basis-library/config/bind/0000755000076600000240000000000011404470406016503 5ustar mtfstaffmlton-20100608/basis-library/config/bind/char-prim.sml0000644000076600000240000000046211404435632021106 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Char8 = Primitive.Char8 structure Char16 = Primitive.Char16 structure Char32 = Primitive.Char32 mlton-20100608/basis-library/config/bind/int-inf-prim.sml0000644000076600000240000000035411404435632021535 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure IntInf = Primitive.IntInf mlton-20100608/basis-library/config/bind/int-inf-top.sml0000644000076600000240000000034211404435632021365 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure IntInf = IntInf mlton-20100608/basis-library/config/bind/int-prim.sml0000644000076600000240000000051611404435632020763 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Int8 = Primitive.Int8 structure Int16 = Primitive.Int16 structure Int32 = Primitive.Int32 structure Int64 = Primitive.Int64 mlton-20100608/basis-library/config/bind/int-top.sml0000644000076600000240000000044611404435632020620 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Int8 = Int8 structure Int16 = Int16 structure Int32 = Int32 structure Int64 = Int64 mlton-20100608/basis-library/config/bind/pointer-mlton.sml0000644000076600000240000000035211404435632022031 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Pointer = MLton.Pointer mlton-20100608/basis-library/config/bind/pointer-prim.sml0000644000076600000240000000035611404435632021653 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Pointer = Primitive.Pointer mlton-20100608/basis-library/config/bind/real-prim.sml0000644000076600000240000000042011404435632021106 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Real32 = Primitive.Real32 structure Real64 = Primitive.Real64 mlton-20100608/basis-library/config/bind/real-top.sml0000644000076600000240000000037411404435632020751 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Real32 = Real32 structure Real64 = Real64 mlton-20100608/basis-library/config/bind/string-prim.sml0000644000076600000240000000047611404435632021504 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure String8 = Primitive.String8 structure String16 = Primitive.String16 structure String32 = Primitive.String32 mlton-20100608/basis-library/config/bind/word-prim.sml0000644000076600000240000000052611404435632021145 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Word8 = Primitive.Word8 structure Word16 = Primitive.Word16 structure Word32 = Primitive.Word32 structure Word64 = Primitive.Word64 mlton-20100608/basis-library/config/bind/word-top.sml0000644000076600000240000000045611404435632021002 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Word8 = Word8 structure Word16 = Word16 structure Word32 = Word32 structure Word64 = Word64 mlton-20100608/basis-library/config/c/0000755000076600000240000000000011404470406016011 5ustar mtfstaffmlton-20100608/basis-library/config/c/errno.sml0000644000076600000240000000062511404435632017660 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure C_Errno :> sig type 'a t val check: 'a t -> 'a val inject: 'a -> 'a t end = struct type 'a t = 'a val check = fn x => x val inject = fn x => x end mlton-20100608/basis-library/config/c/position.sml0000644000076600000240000000052411404435632020375 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Position = C_Off functor Position_ChooseIntN (A: CHOOSE_INT_ARG) : sig val f : Position.int A.t end = C_Off_ChooseIntN (A) mlton-20100608/basis-library/config/c/sys-types.sml0000644000076600000240000000526011404435632020513 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature C_SYSTYPE = sig type t val castFromSysWord: SysWord.word -> t val castToSysWord: t -> SysWord.t end signature C_FLAGTYPE = sig include C_SYSTYPE val andb: t * t -> t val notb: t -> t val orb: t * t -> t end (* from *) structure C_DirP : C_SYSTYPE = C_DirP (* from *) structure C_NFds : sig include C_SYSTYPE val fromInt: Int.int -> t end = C_NFds (* from *) structure C_RLim : C_SYSTYPE = C_RLim (* from *) structure C_Clock : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val toLargeInt: t -> LargeInt.int end = C_Clock structure C_Dev : C_SYSTYPE = C_Dev structure C_GId : C_SYSTYPE = C_GId structure C_INo : C_SYSTYPE = C_INo structure C_Mode : C_FLAGTYPE = C_Mode structure C_NLink : sig include C_SYSTYPE val toInt: t -> int end = C_NLink structure C_Off = C_Off structure C_PId : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val ~ : t -> t end = C_PId structure C_SSize : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val toInt: t -> Int.int end = C_SSize structure C_SUSeconds : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val fromLargeInt: LargeInt.int -> t val toLargeInt: t -> LargeInt.int end = C_SUSeconds structure C_Time : sig include C_SYSTYPE val castFromFixedInt: FixedInt.int -> t val fromInt: Int.int -> t val fromLargeInt: LargeInt.int -> t val toInt: t -> Int.int val toLargeInt: t -> LargeInt.int end = C_Time structure C_UId : C_SYSTYPE = C_UId (* from *) structure C_Socklen = C_Socklen (* from *) structure C_CC : C_SYSTYPE = C_CC structure C_Speed : sig include C_SYSTYPE val compare: t * t -> order end = C_Speed structure C_TCFlag : C_FLAGTYPE = C_TCFlag mlton-20100608/basis-library/config/c/sys-word.sml0000644000076600000240000000053611404435632020323 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure SysWord = C_UIntmax functor SysWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : SysWord.word A.t end = C_UIntmax_ChooseWordN (A) mlton-20100608/basis-library/config/c/word-to-bool.sml0000644000076600000240000000130311404435632021051 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor WordToBool (S : sig eqtype t val one: t val zero: t end) : sig eqtype t val fromBool: bool -> t val toBool: t -> bool end = struct open S val fromBool: bool -> t = fn b => if b then zero else one val toBool: t -> bool = fn w => w <> zero end mlton-20100608/basis-library/config/choose-char.sml0000644000076600000240000000154211404435632020503 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_CHARN_ARG = sig type 'a t val fChar8: Char8.char t val fChar16: Char16.char t val fChar32: Char32.char t end functor ChooseCharN_Char8 (A : CHOOSE_CHARN_ARG) : sig val f : Char8.char A.t end = struct val f = A.fChar8 val _ = A.fChar16 val _ = A.fChar32 end functor ChooseCharN_Char16 (A : CHOOSE_CHARN_ARG) : sig val f : Char16.char A.t end = struct val _ = A.fChar8 val f = A.fChar16 val _ = A.fChar32 end functor ChooseCharN_Char32 (A : CHOOSE_CHARN_ARG) : sig val f : Char32.char A.t end = struct val _ = A.fChar8 val _ = A.fChar16 val f = A.fChar32 end mlton-20100608/basis-library/config/choose-int.sml0000644000076600000240000000423311404435632020360 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_INTN_ARG = sig type 'a t val fInt8: Int8.int t val fInt16: Int16.int t val fInt32: Int32.int t val fInt64: Int64.int t end functor ChooseIntN_Int8 (A : CHOOSE_INTN_ARG) : sig val f : Int8.int A.t end = struct val f = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 end functor ChooseIntN_Int16 (A : CHOOSE_INTN_ARG) : sig val f : Int16.int A.t end = struct val _ = A.fInt8 val f = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 end functor ChooseIntN_Int32 (A : CHOOSE_INTN_ARG) : sig val f : Int32.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val f = A.fInt32 val _ = A.fInt64 end functor ChooseIntN_Int64 (A : CHOOSE_INTN_ARG) : sig val f : Int64.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val f = A.fInt64 end signature CHOOSE_INT_ARG = sig type 'a t val fInt8: Int8.int t val fInt16: Int16.int t val fInt32: Int32.int t val fInt64: Int64.int t val fIntInf: IntInf.int t end functor ChooseInt_Int8 (A : CHOOSE_INT_ARG) : sig val f : Int8.int A.t end = struct val f = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 val _ = A.fIntInf end functor ChooseInt_Int16 (A : CHOOSE_INT_ARG) : sig val f : Int16.int A.t end = struct val _ = A.fInt8 val f = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 val _ = A.fIntInf end functor ChooseInt_Int32 (A : CHOOSE_INT_ARG) : sig val f : Int32.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val f = A.fInt32 val _ = A.fInt64 val _ = A.fIntInf end functor ChooseInt_Int64 (A : CHOOSE_INT_ARG) : sig val f : Int64.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val f = A.fInt64 val _ = A.fIntInf end functor ChooseInt_IntInf (A : CHOOSE_INT_ARG) : sig val f : IntInf.int A.t end = struct val _ = A.fInt8 val _ = A.fInt16 val _ = A.fInt32 val _ = A.fInt64 val f = A.fIntInf end mlton-20100608/basis-library/config/choose-real.sml0000644000076600000240000000120511404435632020505 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_REALN_ARG = sig type 'a t val fReal32: Real32.real t val fReal64: Real64.real t end functor ChooseRealN_Real32 (A : CHOOSE_REALN_ARG) : sig val f : Real32.real A.t end = struct val f = A.fReal32 val _ = A.fReal64 end functor ChooseRealN_Real64 (A : CHOOSE_REALN_ARG) : sig val f : Real64.real A.t end = struct val _ = A.fReal32 val f = A.fReal64 end mlton-20100608/basis-library/config/choose-string.sml0000644000076600000240000000141311404435632021071 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_STRINGN_ARG = sig type 'a t val fString8: String8.string t val fString16: String16.string t val fString32: String32.string t end functor ChooseStringN_String8 (A : CHOOSE_STRINGN_ARG) : sig val f : String8.string A.t end = struct val f = A.fString8 end functor ChooseStringN_String16 (A : CHOOSE_STRINGN_ARG) : sig val f : String16.string A.t end = struct val f = A.fString16 end functor ChooseStringN_String32 (A : CHOOSE_STRINGN_ARG) : sig val f : String32.string A.t end = struct val f = A.fString32 end mlton-20100608/basis-library/config/choose-word.sml0000644000076600000240000000215111404435632020536 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHOOSE_WORDN_ARG = sig type 'a t val fWord8: Word8.word t val fWord16: Word16.word t val fWord32: Word32.word t val fWord64: Word64.word t end functor ChooseWordN_Word8 (A : CHOOSE_WORDN_ARG) : sig val f : Word8.word A.t end = struct val f = A.fWord8 val _ = A.fWord16 val _ = A.fWord32 val _ = A.fWord64 end functor ChooseWordN_Word16 (A : CHOOSE_WORDN_ARG) : sig val f : Word16.word A.t end = struct val _ = A.fWord8 val f = A.fWord16 val _ = A.fWord32 val _ = A.fWord64 end functor ChooseWordN_Word32 (A : CHOOSE_WORDN_ARG) : sig val f : Word32.word A.t end = struct val _ = A.fWord8 val _ = A.fWord16 val f = A.fWord32 val _ = A.fWord64 end functor ChooseWordN_Word64 (A : CHOOSE_WORDN_ARG) : sig val f : Word64.word A.t end = struct val _ = A.fWord8 val _ = A.fWord16 val _ = A.fWord32 val f = A.fWord64 end mlton-20100608/basis-library/config/default/0000755000076600000240000000000011404470406017213 5ustar mtfstaffmlton-20100608/basis-library/config/default/default-char8.sml0000644000076600000240000000102411404435632022356 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Char = Char8 type char = Char.char structure String = String8 type string = String.string functor Char_ChooseChar (A: CHOOSE_CHARN_ARG) : sig val f : Char.char A.t end = ChooseCharN_Char8 (A) functor String_ChooseString (A: CHOOSE_STRINGN_ARG) : sig val f : String.string A.t end = ChooseStringN_String8 (A) mlton-20100608/basis-library/config/default/default-int32.sml0000644000076600000240000000052611404435632022316 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Int = Int32 type int = Int.int functor Int_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : Int.int A.t end = ChooseInt_Int32 (A) mlton-20100608/basis-library/config/default/default-int64.sml0000644000076600000240000000052611404435632022323 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Int = Int64 type int = Int.int functor Int_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : Int.int A.t end = ChooseInt_Int64 (A) mlton-20100608/basis-library/config/default/default-intinf.sml0000644000076600000240000000053011404435632022641 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Int = IntInf type int = Int.int functor Int_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : Int.int A.t end = ChooseInt_IntInf (A) mlton-20100608/basis-library/config/default/default-real32.sml0000644000076600000240000000054511404435632022450 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Real = Real32 type real = Real.real functor Real_ChooseRealN (A: CHOOSE_REALN_ARG) : sig val f : Real.real A.t end = ChooseRealN_Real32 (A) mlton-20100608/basis-library/config/default/default-real64.sml0000644000076600000240000000054511404435632022455 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Real = Real64 type real = Real.real functor Real_ChooseRealN (A: CHOOSE_REALN_ARG) : sig val f : Real.real A.t end = ChooseRealN_Real64 (A) mlton-20100608/basis-library/config/default/default-widechar16.sml0000644000076600000240000000077611404435632023323 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure WideChar = Char16 structure WideString = String16 functor WideChar_ChooseChar (A: CHOOSE_CHARN_ARG) : sig val f : WideChar.char A.t end = ChooseCharN_Char16 (A) functor WideString_ChooseString (A: CHOOSE_STRINGN_ARG) : sig val f : WideString.string A.t end = ChooseStringN_String16 (A) mlton-20100608/basis-library/config/default/default-widechar32.sml0000644000076600000240000000077611404435632023321 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure WideChar = Char32 structure WideString = String32 functor WideChar_ChooseChar (A: CHOOSE_CHARN_ARG) : sig val f : WideChar.char A.t end = ChooseCharN_Char32 (A) functor WideString_ChooseString (A: CHOOSE_STRINGN_ARG) : sig val f : WideString.string A.t end = ChooseStringN_String32 (A) mlton-20100608/basis-library/config/default/default-word32.sml0000644000076600000240000000054511404435632022500 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Word = Word32 type word = Word.word functor Word_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : Word.word A.t end = ChooseWordN_Word32 (A) mlton-20100608/basis-library/config/default/default-word64.sml0000644000076600000240000000054511404435632022505 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Word = Word64 type word = Word.word functor Word_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : Word.word A.t end = ChooseWordN_Word64 (A) mlton-20100608/basis-library/config/default/fixed-int.sml0000644000076600000240000000052511404435632021623 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure FixedInt = Int64 functor FixedInt_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : FixedInt.int A.t end = ChooseIntN_Int64 (A) mlton-20100608/basis-library/config/default/large-int.sml0000644000076600000240000000052411404435632021615 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure LargeInt = IntInf functor LargeInt_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : LargeInt.int A.t end = ChooseInt_IntInf (A) mlton-20100608/basis-library/config/default/large-real.sml0000644000076600000240000000053611404435632021751 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure LargeReal = Real64 functor LargeReal_ChooseRealN (A: CHOOSE_REALN_ARG) : sig val f : LargeReal.real A.t end = ChooseRealN_Real64 (A) mlton-20100608/basis-library/config/default/large-word.sml0000644000076600000240000000053611404435632022001 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure LargeWord = Word64 functor LargeWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : LargeWord.word A.t end = ChooseWordN_Word64 (A) mlton-20100608/basis-library/config/header/0000755000076600000240000000000011404470406017017 5ustar mtfstaffmlton-20100608/basis-library/config/header/header-word32.sml0000644000076600000240000000054211404435632022105 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure HeaderWord = Word32 functor HeaderWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : HeaderWord.word A.t end = ChooseWordN_Word32 (A) mlton-20100608/basis-library/config/header/header-word64.sml0000644000076600000240000000054211404435632022112 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure HeaderWord = Word64 functor HeaderWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : HeaderWord.word A.t end = ChooseWordN_Word64 (A) mlton-20100608/basis-library/config/objptr/0000755000076600000240000000000011404470406017067 5ustar mtfstaffmlton-20100608/basis-library/config/objptr/objptr-rep32.sml0000644000076600000240000000076211404435632022044 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure ObjptrInt = Int32 structure ObjptrWord = Word32 functor ObjptrInt_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : ObjptrInt.int A.t end = ChooseIntN_Int32 (A) functor ObjptrWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : ObjptrWord.word A.t end = ChooseWordN_Word32 (A) mlton-20100608/basis-library/config/objptr/objptr-rep64.sml0000644000076600000240000000076211404435632022051 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure ObjptrInt = Int64 structure ObjptrWord = Word64 functor ObjptrInt_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : ObjptrInt.int A.t end = ChooseIntN_Int64 (A) functor ObjptrWord_ChooseWordN (A: CHOOSE_WORDN_ARG) : sig val f : ObjptrWord.word A.t end = ChooseWordN_Word64 (A) mlton-20100608/basis-library/config/seqindex/0000755000076600000240000000000011404470406017407 5ustar mtfstaffmlton-20100608/basis-library/config/seqindex/seqindex-int32.sml0000644000076600000240000000052611404435632022706 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure SeqIndex = Int32 functor SeqIndex_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : SeqIndex.int A.t end = ChooseIntN_Int32 (A) mlton-20100608/basis-library/config/seqindex/seqindex-int64.sml0000644000076600000240000000052611404435632022713 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure SeqIndex = Int64 functor SeqIndex_ChooseIntN (A: CHOOSE_INTN_ARG) : sig val f : SeqIndex.int A.t end = ChooseIntN_Int64 (A) mlton-20100608/basis-library/default.mlb0000644000076600000240000000063211404435632016445 0ustar mtfstaff(* Copyright (C) 2005-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Order here matters for choice of type names. In particular, we want * basis.mlb to come last so that basis type names are preferred to MLton type * names. *) unsafe.mlb sml-nj.mlb mlton.mlb basis.mlb mlton-20100608/basis-library/equal.mlb0000644000076600000240000000101211404435632016121 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-2002/basis-2002.mlb basis-2002.mlb libs/basis-2002/top-level/basis-equal.sig in libs/basis-2002/top-level/pervasive-equal.sml end end mlton-20100608/basis-library/general/0000755000076600000240000000000011404470406015737 5ustar mtfstaffmlton-20100608/basis-library/general/bool.sig0000644000076600000240000000047511404435632017406 0ustar mtfstaffsignature BOOL_GLOBAL = sig datatype bool = datatype bool val not: bool -> bool end signature BOOL = sig include BOOL_GLOBAL val fromString: string -> bool option val scan: (char, 'a) StringCvt.reader -> (bool, 'a) StringCvt.reader val toString: bool -> string end mlton-20100608/basis-library/general/bool.sml0000644000076600000240000000220411404435632017407 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Bool: BOOL = struct datatype bool = datatype bool val not = not fun scan reader state = case reader state of NONE => NONE | SOME(c, state) => case c of #"f" => (case Reader.reader4 reader state of SOME((#"a", #"l", #"s", #"e"), state) => SOME(false, state) | _ => NONE) | #"t" => (case Reader.reader3 reader state of SOME((#"r", #"u", #"e"), state) => SOME(true, state) | _ => NONE) | _ => NONE val fromString = StringCvt.scanString scan val toString = fn true => "true" | false => "false" end structure BoolGlobal: BOOL_GLOBAL = Bool open BoolGlobal mlton-20100608/basis-library/general/general.sig0000644000076600000240000000140511404435632020062 0ustar mtfstaffsignature GENERAL_GLOBAL = sig eqtype unit type exn exception Bind exception Match exception Chr exception Div exception Domain exception Fail of string exception Overflow exception Size exception Span exception Subscript val exnName: exn -> string val exnMessage: exn -> string datatype order = LESS | EQUAL | GREATER val ! : 'a ref -> 'a val := : ('a ref * 'a) -> unit val o : (('b -> 'c) * ('a -> 'b)) -> 'a -> 'c val before: ('a * unit) -> 'a val ignore: 'a -> unit end signature GENERAL = sig include GENERAL_GLOBAL end signature GENERAL_EXTRA = sig include GENERAL val addExnMessager: (exn -> string option) -> unit end mlton-20100608/basis-library/general/general.sml0000644000076600000240000000300611404435632020072 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure General: GENERAL_EXTRA = struct type unit = Primitive.Unit.unit type exn = exn exception Bind = Bind exception Match = Match exception Chr exception Div = Div exception Domain = Domain exception Fail of string exception Overflow = Overflow exception Size = Size exception Span exception Subscript = Subscript datatype order = datatype Primitive.Order.order val ! = Primitive.Ref.deref val op := = Primitive.Ref.assign fun (f o g) x = f (g x) fun x before () = x fun ignore _ = () val exnName = Primitive.Exn.name local val messagers: (exn -> string option) list ref = ref [] in val addExnMessager: (exn -> string option) -> unit = fn f => messagers := f :: !messagers val rec exnMessage: exn -> string = fn e => let val rec find = fn [] => exnName e | m :: ms => case m e of NONE => find ms | SOME s => s in find (!messagers) end end end structure GeneralGlobal: GENERAL_GLOBAL = General open GeneralGlobal mlton-20100608/basis-library/general/option.sig0000644000076600000240000000130211404435632017751 0ustar mtfstaffsignature OPTION_GLOBAL = sig datatype 'a option = NONE | SOME of 'a exception Option val getOpt: 'a option * 'a -> 'a val isSome: 'a option -> bool val valOf: 'a option -> 'a end signature OPTION = sig include OPTION_GLOBAL val app: ('a -> unit) -> 'a option -> unit val compose: ('a -> 'b) * ('c -> 'a option) -> 'c -> 'b option val composePartial: ('a -> 'b option) * ('c -> 'a option) -> 'c -> 'b option val filter: ('a -> bool) -> 'a -> 'a option val join: 'a option option -> 'a option val map: ('a -> 'b) -> 'a option -> 'b option val mapPartial: ('a -> 'b option) -> 'a option -> 'b option end mlton-20100608/basis-library/general/option.sml0000644000076600000240000000160611404435632017771 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Option: OPTION = struct datatype option = datatype option exception Option fun map f = fn NONE => NONE | SOME a => SOME (f a) fun app f z = (ignore (map f z); ()) fun compose (f, g) c = map f (g c) val join = fn NONE => NONE | SOME v => v fun mapPartial f = join o (map f) fun composePartial (f, g) = (mapPartial f) o g fun filter f a = if f a then SOME a else NONE fun getOpt (z, a) = case z of NONE => a | SOME v => v val isSome = fn NONE => false | SOME _ => true val valOf = fn NONE => raise Option | SOME v => v end structure OptionGlobal: OPTION_GLOBAL = Option open OptionGlobal mlton-20100608/basis-library/general/sml90.sig0000644000076600000240000000207211404435632017412 0ustar mtfstaffsignature SML90 = sig type instream type outstream exception Abs exception Diff exception Exp exception Floor exception Interrupt exception Io of string exception Ln exception Mod exception Neg exception Ord exception Prod exception Quot exception Sqrt exception Sum val arctan: real -> real val chr: int -> string val close_in: instream -> unit val close_out: outstream -> unit val cos: real -> real val end_of_stream: instream -> bool val exp: real -> real val explode: string -> string list val implode: string list -> string val input: instream * int -> string val ln: real -> real val lookahead: instream -> string val open_in: string -> instream val open_out: string -> outstream val ord: string -> int val output: outstream * string -> unit val sin: real -> real val sqrt: real -> real val std_in: instream val std_out: outstream end mlton-20100608/basis-library/general/sml90.sml0000644000076600000240000000432311404435632017424 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure SML90:> SML90 = struct type instream = TextIO.instream type outstream = TextIO.outstream exception Abs = Overflow exception Quot = Overflow exception Prod = Overflow exception Neg = Overflow exception Sum = Overflow exception Diff = Overflow exception Floor = Overflow exception Exp = Overflow exception Sqrt exception Ln exception Ord exception Mod = Div exception Io of string exception Interrupt local open Real.Math in val sqrt = fn x => if Real.< (x, 0.0) then raise Sqrt else sqrt x val exp = fn x => let val y = exp x in if Real.isFinite y then y else raise Exp end val ln = fn x => if Real.> (x, 0.0) then ln x else raise Ln val sin = sin val cos = cos val arctan = atan end fun ord s = if String.size s = 0 then raise Ord else Char.ord(String.sub(s, 0)) val chr = String.str o Char.chr fun explode s = List.map String.str (String.explode s) val implode = String.concat fun lookahead ins = case TextIO.lookahead ins of NONE => "" | SOME c => str c val std_in = TextIO.stdIn fun open_in f = TextIO.openIn f handle IO.Io _ => raise Io (concat ["Cannot open ", f]) fun input ins = TextIO.inputN ins handle IO.Io _ => raise Io "Input stream is closed" val close_in = TextIO.closeIn fun end_of_stream ins = TextIO.endOfStream ins handle _ => true val std_out = TextIO.stdOut fun open_out f = TextIO.openOut f handle IO.Io _ => raise Io (concat ["Cannot open ", f]) fun output (out, s) = TextIO.output (out, s) handle IO.Io _ => raise Io "Output stream is closed" val close_out = TextIO.closeOut end mlton-20100608/basis-library/infixes.mlb0000644000076600000240000000057711404435632016476 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in libs/basis-2002/top-level/infixes.sml end mlton-20100608/basis-library/integer/0000755000076600000240000000000011404470406015757 5ustar mtfstaffmlton-20100608/basis-library/integer/embed-int.sml0000644000076600000240000001123411404435632020343 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature EMBED_INT = sig eqtype int type big val fromBigUnsafe: big -> int val sizeInBits: Int32.int val toBig: int -> big end functor EmbedInt (structure Big: INTEGER_EXTRA structure Small: EMBED_INT where type big = Big.int): INTEGER = struct structure Small = struct open Small val precision': Int.int = Int32.toInt sizeInBits end val () = if Int.< (Small.precision', Big.precision') then () else raise Fail "EmbedWord" open Small val shift = Word.fromInt (Int.- (Big.precision', precision')) val extend: Big.int -> Big.int = fn i => Big.~>> (Big.<< (i, shift), shift) val toBig: Small.int -> Big.int = extend o Small.toBig val precision = SOME precision' val maxIntBig = Big.>> (Big.fromInt ~1, Word.+ (shift, 0w1)) val minIntBig = Big.- (Big.~ maxIntBig, Big.fromInt 1) val mask = Big.>> (Big.fromInt ~1, shift) fun fromBig (i: Big.int): int = let val i' = Big.andb (i, mask) in if i = extend i' then fromBigUnsafe i' else raise Overflow end val maxInt = SOME (fromBig maxIntBig) val minInt = SOME (fromBig minIntBig) local val make: (Big.int * Big.int -> Big.int) -> (int * int -> int) = fn f => fn (x, y) => fromBig (f (toBig x, toBig y)) in val op * = make Big.* val op + = make Big.+ val op - = make Big.- val op div = make Big.div val op mod = make Big.mod val quot = make Big.quot val rem = make Big.rem end local val make: (Big.int * Big.int -> 'a) -> (int * int -> 'a) = fn f => fn (x, y) => f (toBig x, toBig y) in val op < = make Big.< val op <= = make Big.<= val op > = make Big.> val op >= = make Big.>= val compare = make Big.compare end val fromInt = fromBig o Big.fromInt val toInt = Big.toInt o toBig local val make: (Big.int -> Big.int) -> (int -> int) = fn f => fn x => fromBig (f (toBig x)) in val ~ = make Big.~ val abs = make Big.abs end fun fmt r i = Big.fmt r (toBig i) val fromLarge = fromBig o Big.fromLarge fun fromString s = Option.map fromBig (Big.fromString s) fun max (i, j) = if i >= j then i else j fun min (i, j) = if i <= j then i else j fun scan r reader state = Option.map (fn (i, state) => (fromBig i, state)) (Big.scan r reader state) val sign = Big.sign o toBig fun sameSign (x, y) = sign x = sign y val toLarge = Big.toLarge o toBig val toString = Big.toString o toBig end functor Embed8 (Small: EMBED_INT where type big = Int8.int): INTEGER = EmbedInt (structure Big = Int8 structure Small = Small) functor Embed16 (Small: EMBED_INT where type big = Int16.int): INTEGER = EmbedInt (structure Big = Int16 structure Small = Small) functor Embed32 (Small: EMBED_INT where type big = Int32.int): INTEGER = EmbedInt (structure Big = Int32 structure Small = Small) structure Int1 = Embed8 (Primitive.Int1) structure Int2 = Embed8 (Primitive.Int2) structure Int3 = Embed8 (Primitive.Int3) structure Int4 = Embed8 (Primitive.Int4) structure Int5 = Embed8 (Primitive.Int5) structure Int6 = Embed8 (Primitive.Int6) structure Int7 = Embed8 (Primitive.Int7) structure Int9 = Embed16 (Primitive.Int9) structure Int10 = Embed16 (Primitive.Int10) structure Int11 = Embed16 (Primitive.Int11) structure Int12 = Embed16 (Primitive.Int12) structure Int13 = Embed16 (Primitive.Int13) structure Int14 = Embed16 (Primitive.Int14) structure Int15 = Embed16 (Primitive.Int15) structure Int17 = Embed32 (Primitive.Int17) structure Int18 = Embed32 (Primitive.Int18) structure Int19 = Embed32 (Primitive.Int19) structure Int20 = Embed32 (Primitive.Int20) structure Int21 = Embed32 (Primitive.Int21) structure Int22 = Embed32 (Primitive.Int22) structure Int23 = Embed32 (Primitive.Int23) structure Int24 = Embed32 (Primitive.Int24) structure Int25 = Embed32 (Primitive.Int25) structure Int26 = Embed32 (Primitive.Int26) structure Int27 = Embed32 (Primitive.Int27) structure Int28 = Embed32 (Primitive.Int28) structure Int29 = Embed32 (Primitive.Int29) structure Int30 = Embed32 (Primitive.Int30) structure Int31 = Embed32 (Primitive.Int31) mlton-20100608/basis-library/integer/embed-word.sml0000644000076600000240000001341211404435632020524 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature EMBED_WORD = sig eqtype word type big val fromBigUnsafe: big -> word val sizeInBits: Int32.int val toBig: word -> big end functor EmbedWord (structure Big: WORD structure Small: EMBED_WORD where type big = Big.word): WORD = struct structure Small = struct open Small val wordSize: Int.int = Int32.toInt sizeInBits end val () = if Int.< (Small.wordSize, Big.wordSize) then () else raise Fail "EmbedWord" open Small fun ones size = Big.- (Big.<< (Big.fromLarge 0w1, Word.fromInt size), Big.fromLarge 0w1) val maxWord = ones wordSize fun fromBig (w: Big.word): word = fromBigUnsafe (Big.andb (w, maxWord)) fun fromBigOverflow (w: Big.word): word = if Big.<= (w, maxWord) then fromBigUnsafe w else raise Overflow fun highBitIsSet (w: Big.word): bool = Big.> (w, ones (Int.- (wordSize, 1))) fun toBigX (w: word): Big.word = let val w = toBig w in if highBitIsSet w then Big.orb (w, Big.notb maxWord) else w end local val make: (Big.word * Big.word -> Big.word) -> (word * word -> word) = fn f => fn (x, y) => fromBig (f (toBig x, toBig y)) in val op * = make Big.* val op + = make Big.+ val op - = make Big.- val andb = make Big.andb val op div = make Big.div val op mod = make Big.mod val orb = make Big.orb val xorb = make Big.xorb end local val make: ((Big.word * Word.word -> Big.word) -> word * Word.word -> word) = fn f => fn (w, w') => fromBig (f (toBig w, w')) in val >> = make Big.>> val << = make Big.<< end fun ~>> (w, w') = fromBig (Big.~>> (toBigX w, w')) local val make: (Big.word * Big.word -> 'a) -> (word * word -> 'a) = fn f => fn (x, y) => f (toBig x, toBig y) in val op < = make Big.< val op <= = make Big.<= val op > = make Big.> val op >= = make Big.>= val compare = make Big.compare end local val make: (Big.word -> Big.word) -> word -> word = fn f => fn w => fromBig (f (toBig w)) in val notb = make Big.notb end local val make: ('a -> Big.word) -> 'a -> word = fn f => fn a => fromBig (f a) in val fromInt = make Big.fromInt val fromLarge = make Big.fromLarge val fromLargeInt = make Big.fromLargeInt end local val make: (Big.word -> 'a) -> word -> 'a = fn f => fn w => f (toBig w) in val toInt = make Big.toInt val toLarge = make Big.toLarge val toLargeInt = make Big.toLargeInt val toString = make Big.toString end local val make: (Big.word -> 'a) -> word -> 'a = fn f => fn w => f (toBigX w) in val toIntX = make Big.toIntX val toLargeIntX = make Big.toLargeIntX val toLargeX = make Big.toLargeX end fun fmt r i = Big.fmt r (toBig i) val fromLargeWord = fromLarge fun fromString s = Option.map fromBigOverflow (Big.fromString s) fun max (w, w') = if w >= w' then w else w' fun min (w, w') = if w <= w' then w else w' fun scan r reader state = Option.map (fn (w, state) => (fromBigOverflow w, state)) (Big.scan r reader state) val toLargeWord = toLarge val toLargeWordX = toLargeX fun ~ w = fromLarge 0w0 - w end functor EmbedWord8 (Small: EMBED_WORD where type big = Word8.word): WORD = EmbedWord (structure Big = Word8 structure Small = Small) functor EmbedWord16 (Small: EMBED_WORD where type big = Word16.word): WORD = EmbedWord (structure Big = Word16 structure Small = Small) functor EmbedWord32 (Small: EMBED_WORD where type big = Word32.word): WORD = EmbedWord (structure Big = Word32 structure Small = Small) structure Word1 = EmbedWord8 (Primitive.Word1) structure Word2 = EmbedWord8 (Primitive.Word2) structure Word3 = EmbedWord8 (Primitive.Word3) structure Word4 = EmbedWord8 (Primitive.Word4) structure Word5 = EmbedWord8 (Primitive.Word5) structure Word6 = EmbedWord8 (Primitive.Word6) structure Word7 = EmbedWord8 (Primitive.Word7) structure Word9 = EmbedWord16 (Primitive.Word9) structure Word10 = EmbedWord16 (Primitive.Word10) structure Word11 = EmbedWord16 (Primitive.Word11) structure Word12 = EmbedWord16 (Primitive.Word12) structure Word13 = EmbedWord16 (Primitive.Word13) structure Word14 = EmbedWord16 (Primitive.Word14) structure Word15 = EmbedWord16 (Primitive.Word15) structure Word17 = EmbedWord32 (Primitive.Word17) structure Word18 = EmbedWord32 (Primitive.Word18) structure Word19 = EmbedWord32 (Primitive.Word19) structure Word20 = EmbedWord32 (Primitive.Word20) structure Word21 = EmbedWord32 (Primitive.Word21) structure Word22 = EmbedWord32 (Primitive.Word22) structure Word23 = EmbedWord32 (Primitive.Word23) structure Word24 = EmbedWord32 (Primitive.Word24) structure Word25 = EmbedWord32 (Primitive.Word25) structure Word26 = EmbedWord32 (Primitive.Word26) structure Word27 = EmbedWord32 (Primitive.Word27) structure Word28 = EmbedWord32 (Primitive.Word28) structure Word29 = EmbedWord32 (Primitive.Word29) structure Word30 = EmbedWord32 (Primitive.Word30) structure Word31 = EmbedWord32 (Primitive.Word31) mlton-20100608/basis-library/integer/int-global.sml0000644000076600000240000000046411404435632020532 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure IntGlobal: INTEGER_GLOBAL = Int open IntGlobal mlton-20100608/basis-library/integer/int-inf.sig0000644000076600000240000000213411404435632020031 0ustar mtfstaffsignature INT_INF = sig include INTEGER val divMod: int * int -> int * int val quotRem: int * int -> int * int val pow: int * Int.int -> int val log2: int -> Int.int val orb: int * int -> int val xorb: int * int -> int val andb: int * int -> int val notb: int -> int val << : int * Word.word -> int val ~>> : int * Word.word -> int end signature INT_INF_EXTRA = sig include INT_INF type t = int structure BigWord : WORD structure SmallInt : INTEGER val areSmall: int * int -> bool val gcd: int * int -> int val isSmall: int -> bool datatype rep = Big of BigWord.word Vector.vector | Small of SmallInt.int val rep: int -> rep val fromRep: rep -> int option val zero: int val one: int val +? : int * int -> int val *? : int * int -> int val -? : int * int -> int val ~? : int -> int val ltu: int * int -> bool val leu: int * int -> bool val gtu: int * int -> bool val geu: int * int -> bool end mlton-20100608/basis-library/integer/int-inf.sml0000644000076600000240000003006711404435632020050 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure IntInf: INT_INF_EXTRA = struct open Primitive.IntInf type t = int structure BigWord = C_MPLimb structure SmallInt = ObjptrInt structure W = ObjptrWord structure I = ObjptrInt structure MPLimb = C_MPLimb val precision: Int.int option = NONE fun sign (arg: int): Int.int = if Prim.isSmall arg then I.sign (Prim.dropTagCoerceInt arg) else if isNeg arg then ~1 else 1 fun sameSign (x, y) = sign x = sign y local val maxShift32 = Word32.<< (0wx1, 0w30) val maxShift = Word32.toWord maxShift32 fun make f (arg, shift) = let fun body loop (arg, shift) = if Word.<= (shift, maxShift) then f (arg, Word32.fromWord shift) else loop (f (arg, maxShift32), Word.- (shift, maxShift)) fun loop (arg, shift) = body loop (arg, shift) in body loop (arg, shift) end in val << = make << val ~>> = make ~>> end val fromInt = schckFromInt val toInt = schckToInt val fromLarge = schckFromLargeInt val toLarge = schckToLargeInt local open StringCvt val binCvt = mkCvt {base = 2, smallCvt = I.fmt BIN} val octCvt = mkCvt {base = 8, smallCvt = I.fmt OCT} val decCvt = mkCvt {base = 10, smallCvt = I.fmt DEC} val hexCvt = mkCvt {base = 16, smallCvt = I.fmt HEX} in fun fmt radix = case radix of BIN => binCvt | OCT => octCvt | DEC => decCvt | HEX => hexCvt val toString = fmt DEC end local open StringCvt (* * Given a char, if it is a digit in the appropriate base, * convert it to a word. Otherwise, return NONE. * Note, both a-f and A-F are accepted as hexadecimal digits. *) fun binDig (ch: char): W.word option = case ch of #"0" => SOME 0w0 | #"1" => SOME 0w1 | _ => NONE local val op <= = Char.<= in fun octDig (ch: char): W.word option = if #"0" <= ch andalso ch <= #"7" then SOME (W.fromInt (Int.- (Char.ord ch, Char.ord #"0"))) else NONE fun decDig (ch: char): W.word option = if #"0" <= ch andalso ch <= #"9" then SOME (W.fromInt (Int.- (Char.ord ch, Char.ord #"0"))) else NONE fun hexDig (ch: char): W.word option = if #"0" <= ch andalso ch <= #"9" then SOME (W.fromInt (Int.- (Char.ord ch, Char.ord #"0"))) else if #"a" <= ch andalso ch <= #"f" then SOME (W.fromInt (Int.- (Char.ord ch, Int.- (Char.ord #"a", 0xa)))) else if #"A" <= ch andalso ch <= #"F" then SOME (W.fromInt (Int.- (Char.ord ch, Int.- (Char.ord #"A", 0xA)))) else NONE end (* * Given a digit converter and a char reader, return a digit * reader. *) fun toDigR (charToDig: char -> W.word option, cread: (char, 'a) reader) (s: 'a) : (W.word * 'a) option = case cread s of NONE => NONE | SOME (ch, s') => case charToDig ch of NONE => NONE | SOME dig => SOME (dig, s') (* * A chunk represents the result of processing some digits. * more is a bool indicating if there might be more digits. * shift is base raised to the number-of-digits-seen power. * chunk is the value of the digits seen. *) type chunk = {more: bool, shift: W.word, chunk: W.word} (* * Given the base and a digit reader, * return a chunk reader. *) fun toChunkR (base: W.word, dread: (W.word, 'a) reader) : (chunk, 'a) reader = let fun loop {left: Int32.int, shift: W.word, chunk: W.word, s: 'a} : chunk * 'a = if Int32.<= (left, 0) then ({more = true, shift = shift, chunk = chunk}, s) else case dread s of NONE => ({more = false, shift = shift, chunk = chunk}, s) | SOME (dig, s') => loop {left = Int32.- (left, 1), shift = W.* (base, shift), chunk = W.+ (W.* (base, chunk), dig), s = s'} (* digitsPerChunk = floor((W.wordSize - 3) / (log2 base)) *) val digitsPerChunk = case (W.wordSize, base) of (64, 0w16) => 15 | (64, 0w10) => 18 | (64, 0w8) => 20 | (64, 0w2) => 61 | (32, 0w16) => 7 | (32, 0w10) => 8 | (32, 0w8) => 9 | (32, 0w2) => 29 | _ => raise (Fail "IntInf.scan:digitsPerChunk") fun reader (s: 'a): (chunk * 'a) option = case dread s of NONE => NONE | SOME (dig, next) => SOME (loop {left = Int32.- (digitsPerChunk, 1), shift = base, chunk = dig, s = next}) in reader end (* * Given a chunk reader, return an unsigned reader. *) fun toUnsR (ckread: (chunk, 'a) reader): (int, 'a) reader = let fun loop (more: bool, acc: int, s: 'a) = if more then case ckread s of NONE => (acc, s) | SOME ({more, shift, chunk}, s') => loop (more, ((Prim.addTagCoerce shift) * acc) + (Prim.addTagCoerce chunk), s') else (acc, s) fun reader (s: 'a): (int * 'a) option = case ckread s of NONE => NONE | SOME ({more, chunk, ...}, s') => SOME (loop (more, Prim.addTagCoerce chunk, s')) in reader end (* * Given a char reader and an unsigned reader, return an unsigned * reader that includes skipping the option hex '0x'. *) fun toHexR (cread: (char, 'a) reader, uread: (int, 'a) reader) s = case cread s of NONE => NONE | SOME (c1, s1) => if c1 = #"0" then case cread s1 of NONE => SOME (zero, s1) | SOME (c2, s2) => if c2 = #"x" orelse c2 = #"X" then case uread s2 of NONE => SOME (zero, s1) | SOME x => SOME x else uread s else uread s (* * Given a char reader and an unsigned reader, return a signed * reader. This includes skipping any initial white space. *) fun toSign (cread: (char, 'a) reader, uread: (int, 'a) reader) : (int, 'a) reader = let fun reader (s: 'a): (int * 'a) option = let val s = StringCvt.skipWS cread s in case cread s of NONE => NONE | SOME (ch, s') => let val (isNeg, s'') = case ch of #"+" => (false, s') | #"-" => (true, s') | #"~" => (true, s') | _ => (false, s) in if isNeg then case uread s'' of NONE => NONE | SOME (abs, s''') => SOME (~ abs, s''') else uread s'' end end in reader end (* * Base-specific conversions from char readers to * int readers. *) local fun reader (base, dig) (cread: (char, 'a) reader) : (int, 'a) reader = let val dread = toDigR (dig, cread) val ckread = toChunkR (base, dread) val uread = toUnsR ckread val hread = if base = 0w16 then toHexR (cread, uread) else uread val reader = toSign (cread, hread) in reader end in fun binReader z = reader (0w2, binDig) z fun octReader z = reader (0w8, octDig) z fun decReader z = reader (0w10, decDig) z fun hexReader z = reader (0w16, hexDig) z end in fun scan radix = case radix of BIN => binReader | OCT => octReader | DEC => decReader | HEX => hexReader end val fromString = StringCvt.scanString (scan StringCvt.DEC) local fun isEven (n: Int.int) = Int.andb (n, 0x1) = 0 in fun pow (i: int, j: Int.int): int = if Int.< (j, 0) then if i = zero then raise Div else if i = one then one else if i = negOne then if isEven j then one else negOne else zero else if j = 0 then one else let fun square (n: int): int = n * n (* pow (j) returns (i ^ j) *) fun pow (j: Int.int): int = if Int.<= (j, 0) then one else if isEven j then evenPow j else i * evenPow (Int.- (j, 1)) (* evenPow (j) returns (i ^ j), assuming j is even *) and evenPow (j: Int.int): int = square (pow (Int.div (j, 2))) in pow j end end val log2 = mkLog2 {fromSmall = fn {smallLog2} => Int32.toInt smallLog2, fromLarge = fn {numLimbsMinusOne, mostSigLimbLog2} => Int.+ (Int.* (MPLimb.wordSize, SeqIndex.toInt numLimbsMinusOne), Int32.toInt mostSigLimbLog2)} val isSmall = Prim.isSmall val areSmall = Prim.areSmall end mlton-20100608/basis-library/integer/int-inf0.sml0000644000076600000240000020521211404435632020124 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRIM_INT_INF = sig eqtype int type t = int val precision: Primitive.Int32.int option val maxInt: int option val minInt: int option val zero: int val one: int val negOne: int datatype rep = Big of C_MPLimb.word vector | Small of ObjptrInt.int val rep: int -> rep val fromRep: rep -> int option structure Prim : sig val isSmall: int -> bool val areSmall: int * int -> bool val dropTag: ObjptrWord.word -> ObjptrWord.word val dropTagCoerce: int -> ObjptrWord.word val dropTagCoerceInt: int -> ObjptrInt.int val addTag: ObjptrWord.word -> ObjptrWord.word val addTagCoerce: ObjptrWord.word -> int val addTagCoerceInt: ObjptrInt.int -> int val zeroTag: ObjptrWord.word -> ObjptrWord.word val oneTag: ObjptrWord.word -> ObjptrWord.word val oneTagCoerce: ObjptrWord.word -> int end val abs: int -> int val +! : int * int -> int val +? : int * int -> int val + : int * int -> int val divMod: int * int -> int * int val div: int * int -> int val gcd: int * int -> int val mod: int * int -> int val *! : int * int -> int val *? : int * int -> int val * : int * int -> int val ~! : int -> int val ~? : int -> int val ~ : int -> int val quotRem: int * int -> int * int val quot: int * int -> int val rem: int * int -> int val -! : int * int -> int val -? : int * int -> int val - : int * int -> int val < : int * int -> bool val <= : int * int -> bool val > : int * int -> bool val >= : int * int -> bool val compare: int * int -> Primitive.Order.order val min: int * int -> int val max: int * int -> int val ltu: int * int -> bool val leu: int * int -> bool val gtu: int * int -> bool val geu: int * int -> bool val isNeg: int -> bool val andb: int * int -> int val < int val << : int * Primitive.Word32.word -> int val notb: int -> int val orb: int * int -> int val ~>>? : int * Primitive.Word32.word -> int val ~>> : int * Primitive.Word32.word -> int val xorb: int * int -> int val mkCvt: ({base: Primitive.Int32.int, smallCvt: ObjptrInt.int -> Primitive.String8.string} -> int -> Primitive.String8.string) val mkLog2: ({fromSmall: {smallLog2: Primitive.Int32.int} -> 'a, fromLarge: {mostSigLimbLog2: Primitive.Int32.int, numLimbsMinusOne: SeqIndex.int} -> 'a} -> int -> 'a) val zextdFromInt8: Primitive.Int8.int -> int val zextdFromInt16: Primitive.Int16.int -> int val zextdFromInt32: Primitive.Int32.int -> int val zextdFromInt64: Primitive.Int64.int -> int val zextdFromIntInf: Primitive.IntInf.int -> int val zextdFromWord8: Primitive.Word8.word -> int val zextdFromWord16: Primitive.Word16.word -> int val zextdFromWord32: Primitive.Word32.word -> int val zextdFromWord64: Primitive.Word64.word -> int val zextdToInt8: int -> Primitive.Int8.int val zextdToInt16: int -> Primitive.Int16.int val zextdToInt32: int -> Primitive.Int32.int val zextdToInt64: int -> Primitive.Int64.int val zextdToIntInf: int -> Primitive.IntInf.int val zextdToWord8: int -> Primitive.Word8.word val zextdToWord16: int -> Primitive.Word16.word val zextdToWord32: int -> Primitive.Word32.word val zextdToWord64: int -> Primitive.Word64.word val sextdFromInt8: Primitive.Int8.int -> int val sextdFromInt16: Primitive.Int16.int -> int val sextdFromInt32: Primitive.Int32.int -> int val sextdFromInt64: Primitive.Int64.int -> int val sextdFromIntInf: Primitive.IntInf.int -> int val sextdFromWord8: Primitive.Word8.word -> int val sextdFromWord16: Primitive.Word16.word -> int val sextdFromWord32: Primitive.Word32.word -> int val sextdFromWord64: Primitive.Word64.word -> int val sextdToInt8: int -> Primitive.Int8.int val sextdToInt16: int -> Primitive.Int16.int val sextdToInt32: int -> Primitive.Int32.int val sextdToInt64: int -> Primitive.Int64.int val sextdToIntInf: int -> Primitive.IntInf.int val sextdToWord8: int -> Primitive.Word8.word val sextdToWord16: int -> Primitive.Word16.word val sextdToWord32: int -> Primitive.Word32.word val sextdToWord64: int -> Primitive.Word64.word val castFromInt8: Primitive.Int8.int -> int val castFromInt16: Primitive.Int16.int -> int val castFromInt32: Primitive.Int32.int -> int val castFromInt64: Primitive.Int64.int -> int val castFromIntInf: Primitive.IntInf.int -> int val castFromWord8: Primitive.Word8.word -> int val castFromWord16: Primitive.Word16.word -> int val castFromWord32: Primitive.Word32.word -> int val castFromWord64: Primitive.Word64.word -> int val castToInt8: int -> Primitive.Int8.int val castToInt16: int -> Primitive.Int16.int val castToInt32: int -> Primitive.Int32.int val castToInt64: int -> Primitive.Int64.int val castToIntInf: int -> Primitive.IntInf.int val castToWord8: int -> Primitive.Word8.word val castToWord16: int -> Primitive.Word16.word val castToWord32: int -> Primitive.Word32.word val castToWord64: int -> Primitive.Word64.word val zchckFromInt8: Primitive.Int8.int -> int val zchckFromInt16: Primitive.Int16.int -> int val zchckFromInt32: Primitive.Int32.int -> int val zchckFromInt64: Primitive.Int64.int -> int val zchckFromIntInf: Primitive.IntInf.int -> int val zchckFromWord8: Primitive.Word8.word -> int val zchckFromWord16: Primitive.Word16.word -> int val zchckFromWord32: Primitive.Word32.word -> int val zchckFromWord64: Primitive.Word64.word -> int val zchckToInt8: int -> Primitive.Int8.int val zchckToInt16: int -> Primitive.Int16.int val zchckToInt32: int -> Primitive.Int32.int val zchckToInt64: int -> Primitive.Int64.int val zchckToIntInf: int -> Primitive.IntInf.int val zchckToWord8: int -> Primitive.Word8.word val zchckToWord16: int -> Primitive.Word16.word val zchckToWord32: int -> Primitive.Word32.word val zchckToWord64: int -> Primitive.Word64.word val schckFromInt8: Primitive.Int8.int -> int val schckFromInt16: Primitive.Int16.int -> int val schckFromInt32: Primitive.Int32.int -> int val schckFromInt64: Primitive.Int64.int -> int val schckFromIntInf: Primitive.IntInf.int -> int val schckFromWord8: Primitive.Word8.word -> int val schckFromWord16: Primitive.Word16.word -> int val schckFromWord32: Primitive.Word32.word -> int val schckFromWord64: Primitive.Word64.word -> int val schckToInt8: int -> Primitive.Int8.int val schckToInt16: int -> Primitive.Int16.int val schckToInt32: int -> Primitive.Int32.int val schckToInt64: int -> Primitive.Int64.int val schckToIntInf: int -> Primitive.IntInf.int val schckToWord8: int -> Primitive.Word8.word val schckToWord16: int -> Primitive.Word16.word val schckToWord32: int -> Primitive.Word32.word val schckToWord64: int -> Primitive.Word64.word end signature PRIM_INTWORD_CONV = sig include PRIM_INTWORD_CONV val idFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val zextdFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val zextdFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val zextdFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val zextdFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val zextdFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val zextdFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val zextdFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val zextdFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val zextdFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val zextdFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val zextdFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val zextdFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val zextdFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val zextdFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val zextdFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val zextdFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val zextdFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word val sextdFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val sextdFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val sextdFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val sextdFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val sextdFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val sextdFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val sextdFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val sextdFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val sextdFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val sextdFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val sextdFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val sextdFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val sextdFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val sextdFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val sextdFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val sextdFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val sextdFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word val castFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val castFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val castFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val castFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val castFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val castFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val castFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val castFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val castFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val castFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val castFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val castFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val castFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val castFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val castFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val castFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val castFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word val zchckFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val zchckFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val zchckFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val zchckFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val zchckFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val zchckFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val zchckFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val zchckFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val zchckFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val zchckFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val zchckFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val zchckFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val zchckFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val zchckFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val zchckFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val zchckFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val zchckFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word val schckFromInt8ToIntInf: Primitive.Int8.int -> Primitive.IntInf.int val schckFromInt16ToIntInf: Primitive.Int16.int -> Primitive.IntInf.int val schckFromInt32ToIntInf: Primitive.Int32.int -> Primitive.IntInf.int val schckFromInt64ToIntInf: Primitive.Int64.int -> Primitive.IntInf.int val schckFromWord8ToIntInf: Primitive.Word8.word -> Primitive.IntInf.int val schckFromWord16ToIntInf: Primitive.Word16.word -> Primitive.IntInf.int val schckFromWord32ToIntInf: Primitive.Word32.word -> Primitive.IntInf.int val schckFromWord64ToIntInf: Primitive.Word64.word -> Primitive.IntInf.int val schckFromIntInfToInt8: Primitive.IntInf.int -> Primitive.Int8.int val schckFromIntInfToInt16: Primitive.IntInf.int -> Primitive.Int16.int val schckFromIntInfToInt32: Primitive.IntInf.int -> Primitive.Int32.int val schckFromIntInfToInt64: Primitive.IntInf.int -> Primitive.Int64.int val schckFromIntInfToIntInf: Primitive.IntInf.int -> Primitive.IntInf.int val schckFromIntInfToWord8: Primitive.IntInf.int -> Primitive.Word8.word val schckFromIntInfToWord16: Primitive.IntInf.int -> Primitive.Word16.word val schckFromIntInfToWord32: Primitive.IntInf.int -> Primitive.Word32.word val schckFromIntInfToWord64: Primitive.IntInf.int -> Primitive.Word64.word end signature PRIM_INTEGER = sig include PRIM_INTEGER val zextdFromIntInf: Primitive.IntInf.int -> int val zextdToIntInf: int -> Primitive.IntInf.int val sextdFromIntInf: Primitive.IntInf.int -> int val sextdToIntInf: int -> Primitive.IntInf.int val castFromIntInf: Primitive.IntInf.int -> int val castToIntInf: int -> Primitive.IntInf.int val zchckFromIntInf: Primitive.IntInf.int -> int val zchckToIntInf: int -> Primitive.IntInf.int val schckFromIntInf: Primitive.IntInf.int -> int val schckToIntInf: int -> Primitive.IntInf.int end signature PRIM_WORD = sig include PRIM_WORD val zextdFromIntInf: Primitive.IntInf.int -> word val zextdToIntInf: word -> Primitive.IntInf.int val sextdFromIntInf: Primitive.IntInf.int -> word val sextdToIntInf: word -> Primitive.IntInf.int val castFromIntInf: Primitive.IntInf.int -> word val castToIntInf: word -> Primitive.IntInf.int val zchckFromIntInf: Primitive.IntInf.int -> word val zchckToIntInf: word -> Primitive.IntInf.int val schckFromIntInf: Primitive.IntInf.int -> word val schckToIntInf: word -> Primitive.IntInf.int end structure Primitive = struct open Primitive structure IntInf = struct structure Prim = Primitive.IntInf structure MLton = Primitive.MLton structure A = Primitive.Array structure V = Primitive.Vector structure S = SeqIndex structure W = struct open ObjptrWord local structure S = ObjptrInt_ChooseIntN (type 'a t = 'a -> ObjptrWord.word val fInt8 = ObjptrWord.zextdFromInt8 val fInt16 = ObjptrWord.zextdFromInt16 val fInt32 = ObjptrWord.zextdFromInt32 val fInt64 = ObjptrWord.zextdFromInt64) in val idFromObjptrInt = S.f end local structure S = ObjptrInt_ChooseIntN (type 'a t = ObjptrWord.word -> 'a val fInt8 = ObjptrWord.zextdToInt8 val fInt16 = ObjptrWord.zextdToInt16 val fInt32 = ObjptrWord.zextdToInt32 val fInt64 = ObjptrWord.zextdToInt64) in val idToObjptrInt = S.f end end structure I = ObjptrInt structure MPLimb = C_MPLimb structure Sz = struct open C_Size local structure S = SeqIndex_ChooseIntN (type 'a t = 'a -> C_Size.word val fInt8 = C_Size.zextdFromInt8 val fInt16 = C_Size.zextdFromInt16 val fInt32 = C_Size.zextdFromInt32 val fInt64 = C_Size.zextdFromInt64) in val zextdFromSeqIndex = S.f end end type bigInt = Prim.int datatype rep = Big of MPLimb.t V.vector | Small of ObjptrInt.int val zero: bigInt = 0 val one: bigInt = 1 val negOne: bigInt = ~1 (* Check if an IntInf.int is small (i.e., a fixnum). *) fun isSmall (i: bigInt): bool = 0w0 <> W.andb (Prim.toWord i, 0w1) (* Check if two IntInf.int's are both small (i.e., fixnums). *) fun areSmall (i: bigInt, i': bigInt): bool = 0w0 <> W.andb (W.andb (Prim.toWord i, Prim.toWord i'), 0w1) (* Return the number of `limbs' in a bigInt. *) fun bigNumLimbs i = S.- (V.length (Prim.toVector i), 1) fun numLimbs i = if isSmall i then 1 else bigNumLimbs i fun dropTag (w: W.word): W.word = W.~>>? (w, 0w1) fun dropTagCoerce (i: bigInt): W.word = dropTag (Prim.toWord i) fun dropTagCoerceInt (i: bigInt): I.int = W.idToObjptrInt (dropTagCoerce i) fun addTag (w: W.word): W.word = W.orb (W.< let val ok = SeqIndex.> (Vector.length v, 1) andalso MPLimb.<= (V.subUnsafe (v, 0), 0w1) in if ok then SOME (Prim.fromVector v) else NONE end | Small i => let val out = addTagCoerceInt i val undo = dropTagCoerceInt out in if i = undo then SOME out else NONE end local fun 'a make {zextdToMPLimb: 'a -> MPLimb.word, zextdToObjptrWord: 'a -> ObjptrWord.word, sextdToObjptrWord: 'a -> ObjptrWord.word, other : {sizeInBits: Int32.int, zero: 'a, eq: 'a * 'a -> bool, isNeg: 'a -> bool, neg: 'a -> 'a, notb: 'a -> 'a, rashift: 'a * Word32.word -> 'a, rshift: 'a * Word32.word -> 'a}} (sextd, w) = if Int32.> (ObjptrWord.sizeInBits, #sizeInBits other) orelse let val shift = Word32.- (ObjptrWord.sizeInBitsWord, 0w2) val upperBits = (#rashift other) (w, shift) val zeroBits = #zero other val oneBits = (#notb other) zeroBits in (#eq other) (upperBits, zeroBits) orelse (sextd andalso (#eq other) (upperBits, oneBits)) end then if sextd then Prim.fromWord (addTag (sextdToObjptrWord w)) else Prim.fromWord (addTag (zextdToObjptrWord w)) else let fun loop (w, i, acc) = if (#eq other) (w, (#zero other)) then (i, acc) else let val limb = zextdToMPLimb w val w = (#rshift other) (w, MPLimb.sizeInBitsWord) in loop (w, S.+ (i, 1), (i, limb) :: acc) end val (n, acc) = if sextd andalso (#isNeg other) w then loop ((#neg other) w, 1, [(0,0w1)]) else loop (w, 1, [(0,0w0)]) val a = A.arrayUnsafe n fun loop acc = case acc of [] => () | (i, v) :: acc => (A.updateUnsafe (a, i, v) ; loop acc) val () = loop acc in Prim.fromVector (V.fromArrayUnsafe a) end in fun extdFromWord8 (sextd, w) = make {zextdToMPLimb = MPLimb.zextdFromWord8, zextdToObjptrWord = ObjptrWord.zextdFromWord8, sextdToObjptrWord = ObjptrWord.sextdFromWord8, other = {sizeInBits = Word8.sizeInBits, zero = Word8.zero, eq = ((op =) : Word8.word * Word8.word -> bool), isNeg = fn w => Int8.< (IntWordConv.idFromWord8ToInt8 w, 0), neg = Word8.~, notb = Word8.notb, rashift = Word8.~>>?, rshift = Word8.>>?}} (sextd, w) fun zextdFromWord8 w = extdFromWord8 (false, w) fun zextdFromInt8 i = zextdFromWord8 (IntWordConv.idFromInt8ToWord8 i) fun sextdFromWord8 w = extdFromWord8 (true, w) fun sextdFromInt8 i = sextdFromWord8 (IntWordConv.idFromInt8ToWord8 i) val castFromInt8 = sextdFromInt8 val castFromWord8 = zextdFromWord8 val zchckFromInt8 = zextdFromInt8 val zchckFromWord8 = zextdFromWord8 val schckFromInt8 = sextdFromInt8 val schckFromWord8 = sextdFromWord8 fun extdFromWord16 (sextd, w) = make {zextdToMPLimb = MPLimb.zextdFromWord16, zextdToObjptrWord = ObjptrWord.zextdFromWord16, sextdToObjptrWord = ObjptrWord.sextdFromWord16, other = {sizeInBits = Word16.sizeInBits, zero = Word16.zero, eq = ((op =) : Word16.word * Word16.word -> bool), isNeg = fn w => Int16.< (IntWordConv.idFromWord16ToInt16 w, 0), neg = Word16.~, notb = Word16.notb, rashift = Word16.~>>?, rshift = Word16.>>?}} (sextd, w) fun zextdFromWord16 w = extdFromWord16 (false, w) fun zextdFromInt16 i = zextdFromWord16 (IntWordConv.idFromInt16ToWord16 i) fun sextdFromWord16 w = extdFromWord16 (true, w) fun sextdFromInt16 i = sextdFromWord16 (IntWordConv.idFromInt16ToWord16 i) val castFromInt16 = sextdFromInt16 val castFromWord16 = zextdFromWord16 val zchckFromInt16 = zextdFromInt16 val zchckFromWord16 = zextdFromWord16 val schckFromInt16 = sextdFromInt16 val schckFromWord16 = sextdFromWord16 fun extdFromWord32 (sextd, w) = make {zextdToMPLimb = MPLimb.zextdFromWord32, zextdToObjptrWord = ObjptrWord.zextdFromWord32, sextdToObjptrWord = ObjptrWord.sextdFromWord32, other = {sizeInBits = Word32.sizeInBits, zero = Word32.zero, eq = ((op =) : Word32.word * Word32.word -> bool), isNeg = fn w => Int32.< (IntWordConv.idFromWord32ToInt32 w, 0), neg = Word32.~, notb = Word32.notb, rashift = Word32.~>>?, rshift = Word32.>>?}} (sextd, w) fun zextdFromWord32 w = extdFromWord32 (false, w) fun zextdFromInt32 i = zextdFromWord32 (IntWordConv.idFromInt32ToWord32 i) fun sextdFromWord32 w = extdFromWord32 (true, w) fun sextdFromInt32 i = sextdFromWord32 (IntWordConv.idFromInt32ToWord32 i) val castFromInt32 = sextdFromInt32 val castFromWord32 = zextdFromWord32 val zchckFromInt32 = zextdFromInt32 val zchckFromWord32 = zextdFromWord32 val schckFromInt32 = sextdFromInt32 val schckFromWord32 = sextdFromWord32 fun extdFromWord64 (sextd, w) = make {zextdToMPLimb = MPLimb.zextdFromWord64, zextdToObjptrWord = ObjptrWord.zextdFromWord64, sextdToObjptrWord = ObjptrWord.sextdFromWord64, other = {sizeInBits = Word64.sizeInBits, zero = Word64.zero, eq = ((op =) : Word64.word * Word64.word -> bool), isNeg = fn w => Int64.< (IntWordConv.idFromWord64ToInt64 w, 0), neg = Word64.~, notb = Word64.notb, rashift = Word64.~>>?, rshift = Word64.>>?}} (sextd, w) fun zextdFromWord64 w = extdFromWord64 (false, w) fun zextdFromInt64 i = zextdFromWord64 (IntWordConv.idFromInt64ToWord64 i) fun sextdFromWord64 w = extdFromWord64 (true, w) fun sextdFromInt64 i = sextdFromWord64 (IntWordConv.idFromInt64ToWord64 i) val castFromInt64 = sextdFromInt64 val castFromWord64 = zextdFromWord64 val zchckFromInt64 = zextdFromInt64 val zchckFromWord64 = zextdFromWord64 val schckFromInt64 = sextdFromInt64 val schckFromWord64 = sextdFromWord64 fun zextdFromIntInf ii = ii fun sextdFromIntInf ii = ii fun castFromIntInf ii = ii fun zchckFromIntInf ii = ii fun schckFromIntInf ii = ii end local structure S = ObjptrInt_ChooseIntN (type 'a t = 'a -> bigInt val fInt8 = sextdFromInt8 val fInt16 = sextdFromInt16 val fInt32 = sextdFromInt32 val fInt64 = sextdFromInt64) in val sextdFromObjptrInt = S.f end local datatype 'a ans = Big of bool * bool * 'a | Small of ObjptrWord.word fun 'a make {zextdFromMPLimb: MPLimb.word -> 'a, other : {sizeInBits: Int32.int, sizeInBitsWord: Word32.word, zero: 'a, lshift: 'a * Word32.word -> 'a, orb: 'a * 'a -> 'a}} i = if isSmall i then Small (dropTagCoerce i) else let val v = Prim.toVector i val n = V.length v val isneg = V.subUnsafe (v, 0) <> 0w0 in if Int32.>= (MPLimb.sizeInBits, #sizeInBits other) then let val limbsPer = 1 val limb = V.subUnsafe (v, 1) val extra = S.> (n, S.+ (limbsPer, 1)) orelse (MPLimb.>>? (limb, #sizeInBitsWord other)) <> 0w0 val ans = zextdFromMPLimb limb in Big (isneg, extra, ans) end else let val limbsPer = S.sextdFromInt32 (Int32.quot (#sizeInBits other, MPLimb.sizeInBits)) val extra = S.> (n, S.+ (limbsPer, 1)) val ans = let fun loop (i, ans) = if S.> (i, 0) then let val limb = V.subUnsafe (v, i) val ans = (#orb other) ((#lshift other) (ans, MPLimb.sizeInBitsWord), zextdFromMPLimb limb) in loop (S.- (i, 1), ans) end else ans in loop (S.min (S.- (n, 1), limbsPer), #zero other) end in Big (isneg, extra, ans) end end in val chckToWord8Aux = make {zextdFromMPLimb = MPLimb.zextdToWord8, other = {sizeInBits = Word8.sizeInBits, sizeInBitsWord = Word8.sizeInBitsWord, zero = Word8.zero, lshift = Word8.< ObjptrWord.sextdToWord8 w | Big (isneg, _, ans) => if isneg then Word8.~ ans else ans fun sextdToInt8 i = IntWordConv.idFromWord8ToInt8 (sextdToWord8 i) val zextdToWord8 = sextdToWord8 fun zextdToInt8 i = IntWordConv.idFromWord8ToInt8 (zextdToWord8 i) val castToWord8 = sextdToWord8 val castToInt8 = sextdToInt8 fun schckToWord8 i = if not Primitive.Controls.detectOverflow then sextdToWord8 i else case chckToWord8Aux i of Small w => ObjptrWord.schckToWord8 w | Big (isneg, extra, ans) => if extra then raise Overflow else if isneg then let val ans = Word8.~ ans val ans' = IntWordConv.idFromWord8ToInt8 ans in if Int8.> (ans', 0) then raise Overflow else ans end else let val ans' = IntWordConv.idFromWord8ToInt8 ans in if Int8.< (ans', 0) then raise Overflow else ans end fun schckToInt8 i = IntWordConv.idFromWord8ToInt8 (schckToWord8 i) fun zchckToWord8 i = if not Primitive.Controls.detectOverflow then zextdToWord8 i else case chckToWord8Aux i of Small w => ObjptrWord.schckToWord8 w | Big (isneg, extra, ans) => if isneg orelse extra then raise Overflow else ans fun zchckToInt8 i = IntWordConv.idFromWord8ToInt8 (zchckToWord8 i) val chckToWord16Aux = make {zextdFromMPLimb = MPLimb.zextdToWord16, other = {sizeInBits = Word16.sizeInBits, sizeInBitsWord = Word16.sizeInBitsWord, zero = Word16.zero, lshift = Word16.< ObjptrWord.sextdToWord16 w | Big (isneg, _, ans) => if isneg then Word16.~ ans else ans fun sextdToInt16 i = IntWordConv.idFromWord16ToInt16 (sextdToWord16 i) val zextdToWord16 = sextdToWord16 fun zextdToInt16 i = IntWordConv.idFromWord16ToInt16 (zextdToWord16 i) val castToWord16 = sextdToWord16 val castToInt16 = sextdToInt16 fun schckToWord16 i = if not Primitive.Controls.detectOverflow then sextdToWord16 i else case chckToWord16Aux i of Small w => ObjptrWord.schckToWord16 w | Big (isneg, extra, ans) => if extra then raise Overflow else if isneg then let val ans = Word16.~ ans val ans' = IntWordConv.idFromWord16ToInt16 ans in if Int16.> (ans', 0) then raise Overflow else ans end else let val ans' = IntWordConv.idFromWord16ToInt16 ans in if Int16.< (ans', 0) then raise Overflow else ans end fun schckToInt16 i = IntWordConv.idFromWord16ToInt16 (schckToWord16 i) fun zchckToWord16 i = if not Primitive.Controls.detectOverflow then zextdToWord16 i else case chckToWord16Aux i of Small w => ObjptrWord.schckToWord16 w | Big (isneg, extra, ans) => if isneg orelse extra then raise Overflow else ans fun zchckToInt16 i = IntWordConv.idFromWord16ToInt16 (zchckToWord16 i) val chckToWord32Aux = make {zextdFromMPLimb = MPLimb.zextdToWord32, other = {sizeInBits = Word32.sizeInBits, sizeInBitsWord = Word32.sizeInBitsWord, zero = Word32.zero, lshift = Word32.< ObjptrWord.sextdToWord32 w | Big (isneg, _, ans) => if isneg then Word32.~ ans else ans fun sextdToInt32 i = IntWordConv.idFromWord32ToInt32 (sextdToWord32 i) val zextdToWord32 = sextdToWord32 fun zextdToInt32 i = IntWordConv.idFromWord32ToInt32 (zextdToWord32 i) val castToWord32 = sextdToWord32 val castToInt32 = sextdToInt32 fun schckToWord32 i = if not Primitive.Controls.detectOverflow then sextdToWord32 i else case chckToWord32Aux i of Small w => ObjptrWord.schckToWord32 w | Big (isneg, extra, ans) => if extra then raise Overflow else if isneg then let val ans = Word32.~ ans val ans' = IntWordConv.idFromWord32ToInt32 ans in if Int32.> (ans', 0) then raise Overflow else ans end else let val ans' = IntWordConv.idFromWord32ToInt32 ans in if Int32.< (ans', 0) then raise Overflow else ans end fun schckToInt32 i = IntWordConv.idFromWord32ToInt32 (schckToWord32 i) fun zchckToWord32 i = if not Primitive.Controls.detectOverflow then zextdToWord32 i else case chckToWord32Aux i of Small w => ObjptrWord.schckToWord32 w | Big (isneg, extra, ans) => if isneg orelse extra then raise Overflow else ans fun zchckToInt32 i = IntWordConv.idFromWord32ToInt32 (zchckToWord32 i) val chckToWord64Aux = make {zextdFromMPLimb = MPLimb.zextdToWord64, other = {sizeInBits = Word64.sizeInBits, sizeInBitsWord = Word64.sizeInBitsWord, zero = Word64.zero, lshift = Word64.< ObjptrWord.sextdToWord64 w | Big (isneg, _, ans) => if isneg then Word64.~ ans else ans fun sextdToInt64 i = IntWordConv.idFromWord64ToInt64 (sextdToWord64 i) val zextdToWord64 = sextdToWord64 fun zextdToInt64 i = IntWordConv.idFromWord64ToInt64 (zextdToWord64 i) val castToWord64 = sextdToWord64 val castToInt64 = sextdToInt64 fun schckToWord64 i = if not Primitive.Controls.detectOverflow then sextdToWord64 i else case chckToWord64Aux i of Small w => ObjptrWord.schckToWord64 w | Big (isneg, extra, ans) => if extra then raise Overflow else if isneg then let val ans = Word64.~ ans val ans' = IntWordConv.idFromWord64ToInt64 ans in if Int64.> (ans', 0) then raise Overflow else ans end else let val ans' = IntWordConv.idFromWord64ToInt64 ans in if Int64.< (ans', 0) then raise Overflow else ans end fun schckToInt64 i = IntWordConv.idFromWord64ToInt64 (schckToWord64 i) fun zchckToWord64 i = if not Primitive.Controls.detectOverflow then zextdToWord64 i else case chckToWord64Aux i of Small w => ObjptrWord.schckToWord64 w | Big (isneg, extra, ans) => if isneg orelse extra then raise Overflow else ans fun zchckToInt64 i = IntWordConv.idFromWord64ToInt64 (zchckToWord64 i) fun zextdToIntInf ii = ii fun sextdToIntInf ii = ii fun castToIntInf ii = ii fun zchckToIntInf ii = ii fun schckToIntInf ii = ii end local val bytesPerMPLimb = Sz.zextdFromInt32 (Int32.quot (MPLimb.sizeInBits, 8)) val bytesPerCounter = Sz.zextdFromInt32 (Int32.quot (S.sizeInBits, 8)) val bytesPerLength = Sz.zextdFromInt32 (Int32.quot (S.sizeInBits, 8)) val bytesPerHeader = Sz.zextdFromInt32 (Int32.quot (HeaderWord.sizeInBits, 8)) in val bytesPerArrayHeader = Sz.+ (bytesPerCounter, Sz.+ (bytesPerLength, bytesPerHeader )) (* Reserve heap space for a large IntInf.int with room for num + extra * `limbs'. The reason for splitting this up is that extra is intended * to be a constant, and so can be combined at compile time. *) fun reserve (num: S.int, extra: S.int) = Sz.+ (Sz.* (bytesPerMPLimb, Sz.zextdFromSeqIndex num), Sz.+ (Sz.* (bytesPerMPLimb, Sz.zextdFromSeqIndex extra), Sz.+ (bytesPerMPLimb, (* isneg Field *) Sz.+ (bytesPerArrayHeader, (* Array Header *) case MLton.Align.align of (* alignment *) MLton.Align.Align4 => 0w3 | MLton.Align.Align8 => 0w7 )))) end (* badObjptr{Int,Word}{,Tagged} is the fixnum IntInf.int whose * negation and absolute values are not fixnums. * negBadIntInf is the negation (and absolute value) of that IntInf.int. *) val badObjptrInt: I.int = I.~>>? (I.minInt', 0w1) val badObjptrWord: W.word = W.idFromObjptrInt badObjptrInt val badObjptrWordTagged: W.word = addTag badObjptrWord (* val badObjptrIntTagged: I.int = W.idToObjptrInt badObjptrWordTagged *) val negBadIntInf: bigInt = sextdFromObjptrInt (I.~ badObjptrInt) (* Given two ObjptrWord.word's, check if they have the same 'high'/'sign' bit. *) fun sameSignBit (lhs: W.word, rhs: W.word): bool = I.>= (W.idToObjptrInt (W.xorb (lhs, rhs)), 0) (* Given a bignum bigint, test if it is (strictly) negative. *) fun bigIsNeg (arg: bigInt): bool = V.subUnsafe (Prim.toVector arg, 0) <> 0w0 local fun make (smallOp, bigOp, limbsFn, extra) (lhs: bigInt, rhs: bigInt): bigInt = let val res = if areSmall (lhs, rhs) then let val lhsw = dropTagCoerce lhs val lhsi = W.idToObjptrInt lhsw val rhsw = dropTagCoerce rhs val rhsi = W.idToObjptrInt rhsw val ansi = smallOp (lhsi, rhsi) val answ = W.idFromObjptrInt ansi val ans = addTag answ in if sameSignBit (ans, answ) then SOME (Prim.fromWord ans) else NONE end handle Overflow => NONE else NONE in case res of NONE => bigOp (lhs, rhs, reserve (limbsFn (numLimbs lhs, numLimbs rhs), extra)) | SOME i => i end in val bigAdd = make (I.+!, Prim.+, S.max, 1) val bigSub = make (I.-!, Prim.-, S.max, 1) val bigMul = make (I.*!, Prim.*, S.+, 0) end fun bigNeg (arg: bigInt): bigInt = if isSmall arg then let val argw = Prim.toWord arg in if argw = badObjptrWordTagged then negBadIntInf else Prim.fromWord (W.- (0w2, argw)) end else Prim.~ (arg, reserve (numLimbs arg, 1)) fun bigQuot (num: bigInt, den: bigInt): bigInt = if areSmall (num, den) then let val numw = dropTagCoerce num val numi = W.idToObjptrInt numw val denw = dropTagCoerce den val deni = W.idToObjptrInt denw in if numw = badObjptrWord andalso deni = ~1 then negBadIntInf else let val ansi = I.quot (numi, deni) val answ = W.idFromObjptrInt ansi val ans = addTag answ in Prim.fromWord ans end end else let val nlimbs = numLimbs num val dlimbs = numLimbs den in if S.< (nlimbs, dlimbs) then zero else if den = zero then raise Div else Prim.quot (num, den, reserve (S.- (nlimbs, dlimbs), 2)) end fun bigRem (num: bigInt, den: bigInt): bigInt = if areSmall (num, den) then let val numw = dropTagCoerce num val numi = W.idToObjptrInt numw val denw = dropTagCoerce den val deni = W.idToObjptrInt denw val ansi = I.rem (numi, deni) val answ = W.idFromObjptrInt ansi val ans = addTag answ in Prim.fromWord ans end else let val nlimbs = numLimbs num val dlimbs = numLimbs den in if S.< (nlimbs, dlimbs) then num else if den = zero then raise Div else Prim.rem (num, den, reserve (dlimbs, 1)) end (* Based on code from PolySpace. *) local open I fun mod2 x = I.andb (x, 1) fun div2 x = I.>>? (x, 0w1) fun smallGcd (a, b, acc) = case (a, b) of (0, _) => b * acc | (_, 0) => a * acc | (_, 1) => acc | (1, _) => acc | _ => if a = b then a * acc else let val a_2 = div2 a val a_r2 = mod2 a val b_2 = div2 b val b_r2 = mod2 b in if 0 = a_r2 then if 0 = b_r2 then smallGcd (a_2, b_2, acc + acc) else smallGcd (a_2, b, acc) else if 0 = b_r2 then smallGcd (a, b_2, acc) else if a >= b then smallGcd (div2 (a - b), b, acc) else smallGcd (a, div2 (b - a), acc) end in fun bigGcd (lhs: bigInt, rhs: bigInt): bigInt = if areSmall (lhs, rhs) then addTagCoerceInt (smallGcd (I.abs (dropTagCoerceInt lhs), I.abs (dropTagCoerceInt rhs), 1)) else Prim.gcd (lhs, rhs, reserve (S.max (numLimbs lhs, numLimbs rhs), 0)) end local fun make (smallTest: I.int * I.int -> 'a, int32Test: Int32.int * Int32.int -> 'a) (lhs: bigInt, rhs: bigInt): 'a = if areSmall (lhs, rhs) then smallTest (W.idToObjptrInt (Prim.toWord lhs), W.idToObjptrInt (Prim.toWord rhs)) else int32Test (Prim.compare (lhs, rhs), 0) in val bigCompare = make (I.compare, Int32.compare) val bigLT = make (I.<, Int32.<) val bigLE = make (I.<=, Int32.<=) val bigGT = make (I.>, Int32.>) val bigGE = make (I.>=, Int32.>=) end fun bigAbs (arg: bigInt): bigInt = if isSmall arg then let val argw = Prim.toWord arg in if argw = badObjptrWordTagged then negBadIntInf else if I.< (W.idToObjptrInt argw, 0) then Prim.fromWord (W.- (0w2, argw)) else arg end else if bigIsNeg arg then Prim.~ (arg, reserve (numLimbs arg, 1)) else arg fun bigMin (lhs: bigInt, rhs: bigInt): bigInt = if bigLE (lhs, rhs) then lhs else rhs fun bigMax (lhs: bigInt, rhs: bigInt): bigInt = if bigLE (lhs, rhs) then rhs else lhs local fun bigLTU (lhs, rhs) = case (bigCompare (lhs, 0), bigCompare (rhs, 0)) of (LESS, LESS) => bigLT (lhs, rhs) | (LESS, GREATER) => false | (_, EQUAL) => false | (EQUAL, _) => true | (GREATER, LESS) => true | (GREATER, GREATER) => bigLT (lhs, rhs) structure S = IntegralComparisons(type t = bigInt val op < = bigLTU) in val bigLTU = S.< val bigLEU = S.<= val bigGTU = S.> val bigGEU = S.>= end local val op + = bigAdd val op - = bigSub val op > = bigGT val op >= = bigGE val op < = bigLT val quot = bigQuot val rem = bigRem in fun bigDiv (x, y) = if x >= zero then if y > zero then quot (x, y) else if y < zero then if x = zero then zero else quot (x - one, y) - one else raise Div else if y < zero then quot (x, y) else if y > zero then quot (x + one, y) - one else raise Div fun bigMod (x, y) = if x >= zero then if y > zero then rem (x, y) else if y < zero then if x = zero then zero else rem (x - one, y) + (one + y) else raise Div else if y < zero then rem (x, y) else if y > zero then rem (x + one, y) + (y - one) else raise Div fun bigDivMod (x, y) = (bigDiv (x, y), bigMod (x, y)) fun bigQuotRem (x, y) = (bigQuot (x, y), bigRem (x, y)) end local fun make (smallOp, bigOp) (lhs: bigInt, rhs: bigInt) = if areSmall (lhs, rhs) then let val answ = smallOp (Prim.toWord lhs, Prim.toWord rhs) val ans = oneTagCoerce answ in ans end else bigOp (lhs, rhs, reserve (S.max (numLimbs lhs, numLimbs rhs), 0)) in val bigAndb = make (W.andb, Prim.andb) val bigOrb = make (W.orb, Prim.orb) val bigXorb = make (W.xorb, Prim.xorb) end fun bigNotb (arg: bigInt): bigInt = if isSmall arg then oneTagCoerce (W.notb (Prim.toWord arg)) else Prim.notb (arg, reserve (numLimbs arg, 0)) local val bitsPerLimb = MPLimb.sizeInBitsWord fun shiftSize shift = S.sextdFromWord32 (Word32.div (shift, bitsPerLimb)) in fun bigLshift (arg: bigInt, shift: Word32.word): bigInt = if shift = 0wx0 then arg else Prim.<< (arg, shift, reserve (S.+ (numLimbs arg, shiftSize shift), 1)) fun bigRashift (arg: bigInt, shift: Word32.word): bigInt = if shift = 0wx0 then arg else Prim.~>> (arg, shift, reserve (S.max (0, S.- (numLimbs arg, shiftSize shift)), 1)) end fun mkBigCvt {base: Int32.int, smallCvt: I.int -> Primitive.String8.string} (arg: bigInt) : Primitive.String8.string = if isSmall arg then smallCvt (dropTagCoerceInt arg) else let val bpd = Int32.log2 base val bpl = MPLimb.sizeInBits val dpl = Int32.+ (Int32.quot (bpl, bpd), if Int32.mod (bpl, bpd) = 0 then 0 else 1) val bytes = Sz.+ (Sz.+ (bytesPerArrayHeader (* Array Header *), Sz.+ (0w1 (* sign *), case MLton.Align.align of (* alignment *) MLton.Align.Align4 => 0w3 | MLton.Align.Align8 => 0w7)), Sz.* (Sz.zextdFromInt32 dpl, Sz.zextdFromSeqIndex (numLimbs arg))) in Prim.toString (arg, base, bytes) end fun mkBigLog2 {fromSmall: {smallLog2: Primitive.Int32.int} -> 'a, fromLarge: {numLimbsMinusOne: SeqIndex.int, mostSigLimbLog2: Primitive.Int32.int} -> 'a} (arg: bigInt) = if bigLE (arg, 0) then raise Domain else if isSmall arg then fromSmall {smallLog2 = W.log2 (dropTagCoerce arg)} else let val v = Prim.toVector arg val n = V.length v val w = MPLimb.log2 (V.subUnsafe (v, S.- (n, 1))) in fromLarge {numLimbsMinusOne = S.- (n, 2), mostSigLimbLog2 = w} end type int = bigInt type t = int val precision = NONE val maxInt = NONE val minInt = NONE structure Prim = struct val isSmall = isSmall val areSmall = areSmall val dropTag = dropTag val dropTagCoerce = dropTagCoerce val dropTagCoerceInt = dropTagCoerceInt val addTag = addTag val addTagCoerce = addTagCoerce val addTagCoerceInt = addTagCoerceInt val zeroTag = zeroTag val oneTag = oneTag val oneTagCoerce = oneTagCoerce end val abs = bigAbs val op +! = bigAdd val op +? = bigAdd val op + = bigAdd val divMod = bigDivMod val op div = bigDiv val gcd = bigGcd val op mod = bigMod val op *! = bigMul val op *? = bigMul val op * = bigMul val op ~! = bigNeg val op ~? = bigNeg val op ~ = bigNeg val quotRem = bigQuotRem val quot = bigQuot val rem = bigRem val op -! = bigSub val op -? = bigSub val op - = bigSub val op < = bigLT val op <= = bigLE val op > = bigGT val op >= = bigGE val compare = bigCompare val min = bigMin val max = bigMax val ltu = bigLTU val leu = bigLEU val gtu = bigGTU val geu = bigGEU val isNeg = bigIsNeg val andb = bigAndb val <>? = bigRashift val ~>> = bigRashift val xorb = bigXorb val mkCvt = mkBigCvt val mkLog2 = mkBigLog2 end structure IntWordConv : PRIM_INTWORD_CONV = struct open IntWordConv val idFromIntInfToIntInf = fn i => i val zextdFromInt8ToIntInf = IntInf.zextdFromInt8 val zextdFromInt16ToIntInf = IntInf.zextdFromInt16 val zextdFromInt32ToIntInf = IntInf.zextdFromInt32 val zextdFromInt64ToIntInf = IntInf.zextdFromInt64 val zextdFromWord8ToIntInf = IntInf.zextdFromWord8 val zextdFromWord16ToIntInf = IntInf.zextdFromWord16 val zextdFromWord32ToIntInf = IntInf.zextdFromWord32 val zextdFromWord64ToIntInf = IntInf.zextdFromWord64 val zextdFromIntInfToInt8 = IntInf.zextdToInt8 val zextdFromIntInfToInt16 = IntInf.zextdToInt16 val zextdFromIntInfToInt32 = IntInf.zextdToInt32 val zextdFromIntInfToInt64 = IntInf.zextdToInt64 val zextdFromIntInfToIntInf = IntInf.zextdToIntInf val zextdFromIntInfToWord8 = IntInf.zextdToWord8 val zextdFromIntInfToWord16 = IntInf.zextdToWord16 val zextdFromIntInfToWord32 = IntInf.zextdToWord32 val zextdFromIntInfToWord64 = IntInf.zextdToWord64 val sextdFromInt8ToIntInf = IntInf.sextdFromInt8 val sextdFromInt16ToIntInf = IntInf.sextdFromInt16 val sextdFromInt32ToIntInf = IntInf.sextdFromInt32 val sextdFromInt64ToIntInf = IntInf.sextdFromInt64 val sextdFromWord8ToIntInf = IntInf.sextdFromWord8 val sextdFromWord16ToIntInf = IntInf.sextdFromWord16 val sextdFromWord32ToIntInf = IntInf.sextdFromWord32 val sextdFromWord64ToIntInf = IntInf.sextdFromWord64 val sextdFromIntInfToInt8 = IntInf.sextdToInt8 val sextdFromIntInfToInt16 = IntInf.sextdToInt16 val sextdFromIntInfToInt32 = IntInf.sextdToInt32 val sextdFromIntInfToInt64 = IntInf.sextdToInt64 val sextdFromIntInfToIntInf = IntInf.sextdToIntInf val sextdFromIntInfToWord8 = IntInf.sextdToWord8 val sextdFromIntInfToWord16 = IntInf.sextdToWord16 val sextdFromIntInfToWord32 = IntInf.sextdToWord32 val sextdFromIntInfToWord64 = IntInf.sextdToWord64 val castFromInt8ToIntInf = IntInf.castFromInt8 val castFromInt16ToIntInf = IntInf.castFromInt16 val castFromInt32ToIntInf = IntInf.castFromInt32 val castFromInt64ToIntInf = IntInf.castFromInt64 val castFromWord8ToIntInf = IntInf.castFromWord8 val castFromWord16ToIntInf = IntInf.castFromWord16 val castFromWord32ToIntInf = IntInf.castFromWord32 val castFromWord64ToIntInf = IntInf.castFromWord64 val castFromIntInfToInt8 = IntInf.castToInt8 val castFromIntInfToInt16 = IntInf.castToInt16 val castFromIntInfToInt32 = IntInf.castToInt32 val castFromIntInfToInt64 = IntInf.castToInt64 val castFromIntInfToIntInf = IntInf.castToIntInf val castFromIntInfToWord8 = IntInf.castToWord8 val castFromIntInfToWord16 = IntInf.castToWord16 val castFromIntInfToWord32 = IntInf.castToWord32 val castFromIntInfToWord64 = IntInf.castToWord64 val zchckFromInt8ToIntInf = IntInf.zchckFromInt8 val zchckFromInt16ToIntInf = IntInf.zchckFromInt16 val zchckFromInt32ToIntInf = IntInf.zchckFromInt32 val zchckFromInt64ToIntInf = IntInf.zchckFromInt64 val zchckFromWord8ToIntInf = IntInf.zchckFromWord8 val zchckFromWord16ToIntInf = IntInf.zchckFromWord16 val zchckFromWord32ToIntInf = IntInf.zchckFromWord32 val zchckFromWord64ToIntInf = IntInf.zchckFromWord64 val zchckFromIntInfToInt8 = IntInf.zchckToInt8 val zchckFromIntInfToInt16 = IntInf.zchckToInt16 val zchckFromIntInfToInt32 = IntInf.zchckToInt32 val zchckFromIntInfToInt64 = IntInf.zchckToInt64 val zchckFromIntInfToIntInf = IntInf.zchckToIntInf val zchckFromIntInfToWord8 = IntInf.zchckToWord8 val zchckFromIntInfToWord16 = IntInf.zchckToWord16 val zchckFromIntInfToWord32 = IntInf.zchckToWord32 val zchckFromIntInfToWord64 = IntInf.zchckToWord64 val schckFromInt8ToIntInf = IntInf.schckFromInt8 val schckFromInt16ToIntInf = IntInf.schckFromInt16 val schckFromInt32ToIntInf = IntInf.schckFromInt32 val schckFromInt64ToIntInf = IntInf.schckFromInt64 val schckFromWord8ToIntInf = IntInf.schckFromWord8 val schckFromWord16ToIntInf = IntInf.schckFromWord16 val schckFromWord32ToIntInf = IntInf.schckFromWord32 val schckFromWord64ToIntInf = IntInf.schckFromWord64 val schckFromIntInfToInt8 = IntInf.schckToInt8 val schckFromIntInfToInt16 = IntInf.schckToInt16 val schckFromIntInfToInt32 = IntInf.schckToInt32 val schckFromIntInfToInt64 = IntInf.schckToInt64 val schckFromIntInfToIntInf = IntInf.schckToIntInf val schckFromIntInfToWord8 = IntInf.schckToWord8 val schckFromIntInfToWord16 = IntInf.schckToWord16 val schckFromIntInfToWord32 = IntInf.schckToWord32 val schckFromIntInfToWord64 = IntInf.schckToWord64 end structure Int8 : PRIM_INTEGER = struct open Int8 val zextdFromIntInf = IntWordConv.zextdFromIntInfToInt8 val zextdToIntInf = IntWordConv.zextdFromInt8ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToInt8 val sextdToIntInf = IntWordConv.sextdFromInt8ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToInt8 val castToIntInf = IntWordConv.castFromInt8ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToInt8 val zchckToIntInf = IntWordConv.zchckFromInt8ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToInt8 val schckToIntInf = IntWordConv.schckFromInt8ToIntInf end structure Int16 : PRIM_INTEGER = struct open Int16 val zextdFromIntInf = IntWordConv.zextdFromIntInfToInt16 val zextdToIntInf = IntWordConv.zextdFromInt16ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToInt16 val sextdToIntInf = IntWordConv.sextdFromInt16ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToInt16 val castToIntInf = IntWordConv.castFromInt16ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToInt16 val zchckToIntInf = IntWordConv.zchckFromInt16ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToInt16 val schckToIntInf = IntWordConv.schckFromInt16ToIntInf end structure Int32 : PRIM_INTEGER = struct open Int32 val zextdFromIntInf = IntWordConv.zextdFromIntInfToInt32 val zextdToIntInf = IntWordConv.zextdFromInt32ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToInt32 val sextdToIntInf = IntWordConv.sextdFromInt32ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToInt32 val castToIntInf = IntWordConv.castFromInt32ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToInt32 val zchckToIntInf = IntWordConv.zchckFromInt32ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToInt32 val schckToIntInf = IntWordConv.schckFromInt32ToIntInf end structure Int64 : PRIM_INTEGER = struct open Int64 val zextdFromIntInf = IntWordConv.zextdFromIntInfToInt64 val zextdToIntInf = IntWordConv.zextdFromInt64ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToInt64 val sextdToIntInf = IntWordConv.sextdFromInt64ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToInt64 val castToIntInf = IntWordConv.castFromInt64ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToInt64 val zchckToIntInf = IntWordConv.zchckFromInt64ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToInt64 val schckToIntInf = IntWordConv.schckFromInt64ToIntInf end structure Word8 : PRIM_WORD = struct open Word8 val zextdFromIntInf = IntWordConv.zextdFromIntInfToWord8 val zextdToIntInf = IntWordConv.zextdFromWord8ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToWord8 val sextdToIntInf = IntWordConv.sextdFromWord8ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToWord8 val castToIntInf = IntWordConv.castFromWord8ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToWord8 val zchckToIntInf = IntWordConv.zchckFromWord8ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToWord8 val schckToIntInf = IntWordConv.schckFromWord8ToIntInf end structure Word16 : PRIM_WORD = struct open Word16 val zextdFromIntInf = IntWordConv.zextdFromIntInfToWord16 val zextdToIntInf = IntWordConv.zextdFromWord16ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToWord16 val sextdToIntInf = IntWordConv.sextdFromWord16ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToWord16 val castToIntInf = IntWordConv.castFromWord16ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToWord16 val zchckToIntInf = IntWordConv.zchckFromWord16ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToWord16 val schckToIntInf = IntWordConv.schckFromWord16ToIntInf end structure Word32 : PRIM_WORD = struct open Word32 val zextdFromIntInf = IntWordConv.zextdFromIntInfToWord32 val zextdToIntInf = IntWordConv.zextdFromWord32ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToWord32 val sextdToIntInf = IntWordConv.sextdFromWord32ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToWord32 val castToIntInf = IntWordConv.castFromWord32ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToWord32 val zchckToIntInf = IntWordConv.zchckFromWord32ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToWord32 val schckToIntInf = IntWordConv.schckFromWord32ToIntInf end structure Word64 : PRIM_WORD = struct open Word64 val zextdFromIntInf = IntWordConv.zextdFromIntInfToWord64 val zextdToIntInf = IntWordConv.zextdFromWord64ToIntInf val sextdFromIntInf = IntWordConv.sextdFromIntInfToWord64 val sextdToIntInf = IntWordConv.sextdFromWord64ToIntInf val castFromIntInf = IntWordConv.castFromIntInfToWord64 val castToIntInf = IntWordConv.castFromWord64ToIntInf val zchckFromIntInf = IntWordConv.zchckFromIntInfToWord64 val zchckToIntInf = IntWordConv.zchckFromWord64ToIntInf val schckFromIntInf = IntWordConv.schckFromIntInfToWord64 val schckToIntInf = IntWordConv.schckFromWord64ToIntInf end structure IntInf : PRIM_INT_INF = IntInf end mlton-20100608/basis-library/integer/int-inf1.sml0000644000076600000240000000357411404435632020134 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INT_INF1 = sig include INT_INF0 val fromInt: Int.int -> int val fromLarge: LargeInt.int -> int val toInt: int -> Int.int val toLarge: int -> LargeInt.int end structure Primitive = struct open Primitive structure IntInf : INT_INF1 = struct structure I = Primitive.IntInf local structure S = Int_ChooseInt (type 'a t = 'a -> int val fInt8 = I.fromInt8 val fInt16 = I.fromInt16 val fInt32 = I.fromInt32 val fInt64 = I.fromInt64 val fIntInf = I.fromIntInf) in val fromInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> int val fInt8 = I.fromInt8 val fInt16 = I.fromInt16 val fInt32 = I.fromInt32 val fInt64 = I.fromInt64 val fIntInf = I.fromIntInf) in val fromLarge = S.f end local structure S = Int_ChooseInt (type 'a t = int -> 'a val fInt8 = I.toInt8 val fInt16 = I.toInt16 val fInt32 = I.toInt32 val fInt64 = I.toInt64 val fIntInf = I.toIntInf) in val toInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = int -> 'a val fInt8 = I.toInt8 val fInt16 = I.toInt16 val fInt32 = I.toInt32 val fInt64 = I.toInt64 val fIntInf = I.toIntInf) in val toLarge = S.f end end end mlton-20100608/basis-library/integer/int.sml0000644000076600000240000001350611404435632017275 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Integer (I: PRIM_INTEGER): INTEGER_EXTRA = struct open I type t = int val precision': Int.int = Primitive.Int32.zextdToInt sizeInBits val precision: Int.int option = SOME precision' val sizeInBitsWord = Primitive.Word32.zextdToWord sizeInBitsWord val maxInt: int option = SOME maxInt' val minInt: int option = SOME minInt' val sign: int -> Int.int = fn i => if i = zero then (0: Int.int) else if i < zero then (~1: Int.int) else (1: Int.int) fun sameSign (x, y) = sign x = sign y fun << (i, n) = if Word.>= (n, sizeInBitsWord) then zero else I.<> (i, n) = if Word.>= (n, sizeInBitsWord) then zero else I.>>? (i, Primitive.Word32.zextdFromWord n) fun ~>> (i, n) = if Word.< (n, sizeInBitsWord) then I.~>>? (i, Primitive.Word32.zextdFromWord n) else I.~>>? (i, Primitive.Word32.- (I.sizeInBitsWord, 0w1)) fun rol (i, n) = I.rolUnsafe (i, Primitive.Word32.zextdFromWord n) fun ror (i, n) = I.rorUnsafe (i, Primitive.Word32.zextdFromWord n) val fromInt = I.schckFromInt val toInt = I.schckToInt val fromLargeInt = I.schckFromLargeInt val toLargeInt = I.schckToLargeInt val fromLarge = fromLargeInt val toLarge = toLargeInt (* fmt constructs a string to represent the integer by building it into a * statically allocated buffer. For the most part, this is a textbook * algorithm: loop starting at the end of the buffer; we use rem to * extract the next digit to put into the buffer; and we use quot to * figure out the part of the integer that we haven't yet formatted. * However, this function uses the negative absolute value of the input * number, which allows it to take into account minInt without any * special-casing. This requires the rem function to behave in a very * specific way, or else things will go terribly wrong. This may be a * concern when porting to platforms where the division hardware has a * different interpretation than SML about what happens when doing * division of negative numbers. *) local (* Allocate a buffer large enough to hold any formatted integer in any radix. * The most that will be required is for minInt in binary. *) val maxNumDigits = Int.+ (precision', 1) val oneBuf = One.make (fn () => CharArray.array (maxNumDigits, #"\000")) in fun fmt radix (n: int): string = One.use (oneBuf, fn buf => let val radix = fromInt (StringCvt.radixToInt radix) fun loop (q, i: Int.int) = let val _ = CharArray.update (buf, i, StringCvt.digitToChar (toInt (~? (rem (q, radix))))) val q = quot (q, radix) in if q = zero then let val start = if n < zero then let val i = Int.- (i, 1) val () = CharArray.update (buf, i, #"~") in i end else i in CharArraySlice.vector (CharArraySlice.slice (buf, start, NONE)) end else loop (q, Int.- (i, 1)) end in loop (if n < zero then n else ~? n, Int.- (maxNumDigits, 1)) end) end val toString = fmt StringCvt.DEC fun scan radix reader s = let (* Works with the negative of the number so that minInt can be scanned. *) val s = StringCvt.skipWS reader s fun charToDigit c = case StringCvt.charToDigit radix c of NONE => NONE | SOME n => SOME (fromInt n) val radixInt = fromInt (StringCvt.radixToInt radix) fun finishNum (s, n) = case reader s of NONE => SOME (n, s) | SOME (c, s') => case charToDigit c of NONE => SOME (n, s) | SOME n' => finishNum (s', n * radixInt - n') fun num s = case (reader s, radix) of (NONE, _) => NONE | (SOME (#"0", s), StringCvt.HEX) => (case reader s of NONE => SOME (zero, s) | SOME (c, s') => if c = #"x" orelse c = #"X" then case reader s' of NONE => SOME (zero, s) | SOME (c, s') => case charToDigit c of NONE => SOME (zero, s) | SOME n => finishNum (s', ~? n) else case charToDigit c of NONE => SOME (zero, s) | SOME n => finishNum (s', ~? n)) | (SOME (c, s), _) => case charToDigit c of NONE => NONE | SOME n => finishNum (s, ~? n) fun negate s = case num s of NONE => NONE | SOME (n, s) => SOME (~ n, s) in case reader s of NONE => NONE | SOME (c, s') => case c of #"~" => num s' | #"-" => num s' | #"+" => negate s' | _ => negate s end val fromString = StringCvt.scanString (scan StringCvt.DEC) end structure Int8 = Integer (Primitive.Int8) structure Int16 = Integer (Primitive.Int16) structure Int32 = Integer (Primitive.Int32) structure Int64 = Integer (Primitive.Int64) mlton-20100608/basis-library/integer/int1.sml0000644000076600000240000002446411404435632017363 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INT_FROM_TO_ARG = sig type int (* Lowbits or sign-extend. *) val fromInt8Unsafe: Primitive.Int8.int -> int val fromInt16Unsafe: Primitive.Int16.int -> int val fromInt32Unsafe: Primitive.Int32.int -> int val fromInt64Unsafe: Primitive.Int64.int -> int val fromIntInfUnsafe: Primitive.IntInf.int -> int (* Overflow checking, signed interp. *) val fromInt8: Primitive.Int8.int -> int val fromInt16: Primitive.Int16.int -> int val fromInt32: Primitive.Int32.int -> int val fromInt64: Primitive.Int64.int -> int val fromIntInf: Primitive.IntInf.int -> int (* Overflow checking, unsigned interp. *) val fromWord8: Primitive.Word8.word -> int val fromWord16: Primitive.Word16.word -> int val fromWord32: Primitive.Word32.word -> int val fromWord64: Primitive.Word64.word -> int (* Overflow checking, signed interp. *) val fromWord8X: Primitive.Word8.word -> int val fromWord16X: Primitive.Word16.word -> int val fromWord32X: Primitive.Word32.word -> int val fromWord64X: Primitive.Word64.word -> int (* Lowbits or sign-extend. *) val toInt8Unsafe: int -> Primitive.Int8.int val toInt16Unsafe: int -> Primitive.Int16.int val toInt32Unsafe: int -> Primitive.Int32.int val toInt64Unsafe: int -> Primitive.Int64.int val toIntInfUnsafe: int -> Primitive.IntInf.int (* Overflow checking. *) val toInt8: int -> Primitive.Int8.int val toInt16: int -> Primitive.Int16.int val toInt32: int -> Primitive.Int32.int val toInt64: int -> Primitive.Int64.int val toIntInf: int -> Primitive.IntInf.int (* Lowbits or zero extend. *) val toWord8: int -> Primitive.Word8.word val toWord16: int -> Primitive.Word16.word val toWord32: int -> Primitive.Word32.word val toWord64: int -> Primitive.Word64.word (* Lowbits or sign extend. *) val toWord8X: int -> Primitive.Word8.word val toWord16X: int -> Primitive.Word16.word val toWord32X: int -> Primitive.Word32.word val toWord64X: int -> Primitive.Word64.word end signature INT_FROM_TO_RES = sig type int val fromIntUnsafe: Int.int -> int val fromInt: Int.int -> int val fromLargeInt: LargeInt.int -> int val fromLarge: LargeInt.int -> int val fromWord: Word.word -> int val fromWordX: Word.word -> int val fromLargeWord: LargeWord.word -> int val fromLargeWordX: LargeWord.word -> int val fromSysWord: SysWord.word -> int val fromSysWordX: SysWord.word -> int val toIntUnsafe: int -> Int.int val toInt: int -> Int.int val toLargeInt: int -> LargeInt.int val toLarge: int -> LargeInt.int val toWord: int -> Word.word val toWordX: int -> Word.word val toLargeWord: int -> LargeWord.word val toLargeWordX: int -> LargeWord.word val toSysWord: int -> SysWord.word val toSysWordX: int -> SysWord.word end functor IntFromTo(I: INT_FROM_TO_ARG): INT_FROM_TO_RES where type int = I.int = struct open I local structure S = Int_ChooseInt (type 'a t = 'a -> int val fInt8 = I.fromInt8Unsafe val fInt16 = I.fromInt16Unsafe val fInt32 = I.fromInt32Unsafe val fInt64 = I.fromInt64Unsafe val fIntInf = I.fromIntInfUnsafe) in val fromIntUnsafe = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> int val fInt8 = I.fromInt8 val fInt16 = I.fromInt16 val fInt32 = I.fromInt32 val fInt64 = I.fromInt64 val fIntInf = I.fromIntInf) in val fromInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> int val fInt8 = I.fromInt8 val fInt16 = I.fromInt16 val fInt32 = I.fromInt32 val fInt64 = I.fromInt64 val fIntInf = I.fromIntInf) in val fromLargeInt = S.f val fromLarge = fromLargeInt end local structure S = Word_ChooseWordN (type 'a t = 'a -> int val fWord8 = I.fromWord8 val fWord16 = I.fromWord16 val fWord32 = I.fromWord32 val fWord64 = I.fromWord64) in val fromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> int val fWord8 = I.fromWord8X val fWord16 = I.fromWord16X val fWord32 = I.fromWord32X val fWord64 = I.fromWord64X) in val fromWordX = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> int val fWord8 = I.fromWord8 val fWord16 = I.fromWord16 val fWord32 = I.fromWord32 val fWord64 = I.fromWord64) in val fromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> int val fWord8 = I.fromWord8X val fWord16 = I.fromWord16X val fWord32 = I.fromWord32X val fWord64 = I.fromWord64X) in val fromLargeWordX = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> int val fWord8 = I.fromWord8 val fWord16 = I.fromWord16 val fWord32 = I.fromWord32 val fWord64 = I.fromWord64) in val fromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> int val fWord8 = I.fromWord8X val fWord16 = I.fromWord16X val fWord32 = I.fromWord32X val fWord64 = I.fromWord64X) in val fromSysWordX = S.f end local structure S = Int_ChooseInt (type 'a t = int -> 'a val fInt8 = I.toInt8Unsafe val fInt16 = I.toInt16Unsafe val fInt32 = I.toInt32Unsafe val fInt64 = I.toInt64Unsafe val fIntInf = I.toIntInfUnsafe) in val toIntUnsafe = S.f end local structure S = Int_ChooseInt (type 'a t = int -> 'a val fInt8 = I.toInt8 val fInt16 = I.toInt16 val fInt32 = I.toInt32 val fInt64 = I.toInt64 val fIntInf = I.toIntInf) in val toInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = int -> 'a val fInt8 = I.toInt8 val fInt16 = I.toInt16 val fInt32 = I.toInt32 val fInt64 = I.toInt64 val fIntInf = I.toIntInf) in val toLargeInt = S.f val toLarge = toLargeInt end local structure S = Word_ChooseWordN (type 'a t = int -> 'a val fWord8 = I.toWord8 val fWord16 = I.toWord16 val fWord32 = I.toWord32 val fWord64 = I.toWord64) in val toWord = S.f end local structure S = Word_ChooseWordN (type 'a t = int -> 'a val fWord8 = I.toWord8X val fWord16 = I.toWord16X val fWord32 = I.toWord32X val fWord64 = I.toWord64X) in val toWordX = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = int -> 'a val fWord8 = I.toWord8 val fWord16 = I.toWord16 val fWord32 = I.toWord32 val fWord64 = I.toWord64) in val toLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = int -> 'a val fWord8 = I.toWord8X val fWord16 = I.toWord16X val fWord32 = I.toWord32X val fWord64 = I.toWord64X) in val toLargeWordX = S.f end local structure S = SysWord_ChooseWordN (type 'a t = int -> 'a val fWord8 = I.toWord8 val fWord16 = I.toWord16 val fWord32 = I.toWord32 val fWord64 = I.toWord64) in val toSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = int -> 'a val fWord8 = I.toWord8X val fWord16 = I.toWord16X val fWord32 = I.toWord32X val fWord64 = I.toWord64X) in val toSysWordX = S.f end end structure Primitive = struct open Primitive structure Int8 = struct open Int8 local structure S = IntFromTo (Primitive.Int8) in open S end end structure Int16 = struct open Int16 local structure S = IntFromTo (Primitive.Int16) in open S end end structure Int32 = struct open Int32 local structure S = IntFromTo (Primitive.Int32) in open S end end structure Int64 = struct open Int64 local structure S = IntFromTo (Primitive.Int64) in open S end end structure IntInf = struct open IntInf local structure S = IntFromTo (Primitive.IntInf) in open S end end end mlton-20100608/basis-library/integer/integer.sig0000644000076600000240000000432311404435632020124 0ustar mtfstaffsignature INTEGER_GLOBAL = sig eqtype int end signature INTEGER = sig include INTEGER_GLOBAL val precision : Int.int option val minInt : int option val maxInt : int option val toLarge: int -> LargeInt.int val fromLarge: LargeInt.int -> int val toInt: int -> Int.int val fromInt: Int.int -> int val + : int * int -> int val - : int * int -> int val * : int * int -> int val div: int * int -> int val mod: int * int -> int val quot: int * int -> int val rem: int * int -> int val compare: int * int -> order val < : int * int -> bool val <= : int * int -> bool val > : int * int -> bool val >= : int * int -> bool val ~ : int -> int val abs: int -> int val min: int * int -> int val max: int * int -> int val sign: int -> Int.int val sameSign: int * int -> bool val fmt: StringCvt.radix -> int -> string val toString: int -> string val scan: (StringCvt.radix -> (char, 'a) StringCvt.reader -> (int, 'a) StringCvt.reader) val fromString: string -> int option end signature INTEGER_EXTRA = sig include INTEGER type t = int val zero: int val one: int val precision' : Int.int val maxInt' : int val minInt' : int val +? : int * int -> int val *? : int * int -> int val -? : int * int -> int val ~? : int -> int val andb: int * int -> int val << : int * Word.word -> int val notb: int -> int val orb: int * int -> int val rol: int * Word.word -> int val ror: int * Word.word -> int val ~>> : int * Word.word -> int val >> : int * Word.word -> int val xorb: int * int -> int val ltu: int * int -> bool val leu: int * int -> bool val gtu: int * int -> bool val geu: int * int -> bool val toLargeInt: int -> LargeInt.int val fromLargeInt: LargeInt.int -> int val castFromFixedInt: FixedInt.int -> int val castToFixedInt: int -> FixedInt.int val castFromSysWord: SysWord.word -> int val castToSysWord: int -> SysWord.word end mlton-20100608/basis-library/integer/iwconv0.sml0000644000076600000240000023734011404435632020074 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRIM_INTWORD_CONV = sig include PRIM_INTWORD_CONV (* C-like cast: extend according to signedness of from or low-bits *) val castFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val castFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val castFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val castFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val castFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val castFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val castFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val castFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val castFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val castFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val castFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val castFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val castFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val castFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val castFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val castFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val castFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val castFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val castFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val castFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val castFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val castFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val castFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val castFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val castFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val castFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val castFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val castFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val castFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val castFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val castFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val castFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val castFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val castFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val castFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val castFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val castFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val castFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val castFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val castFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val castFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val castFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val castFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val castFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val castFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val castFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val castFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val castFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val castFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val castFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val castFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val castFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val castFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val castFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val castFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val castFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val castFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val castFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val castFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val castFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val castFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val castFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val castFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val castFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word (* checked zero-extend or low-bits, * Overflow if composed zero-extend not identity *) val zchckFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val zchckFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val zchckFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val zchckFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val zchckFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val zchckFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val zchckFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val zchckFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val zchckFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val zchckFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val zchckFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val zchckFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val zchckFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val zchckFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val zchckFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val zchckFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val zchckFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val zchckFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val zchckFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val zchckFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val zchckFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val zchckFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val zchckFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val zchckFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val zchckFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val zchckFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val zchckFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val zchckFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val zchckFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val zchckFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val zchckFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val zchckFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val zchckFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val zchckFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val zchckFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val zchckFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val zchckFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val zchckFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val zchckFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val zchckFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val zchckFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val zchckFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val zchckFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val zchckFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val zchckFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val zchckFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val zchckFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val zchckFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val zchckFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val zchckFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val zchckFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val zchckFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val zchckFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val zchckFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val zchckFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val zchckFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val zchckFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val zchckFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val zchckFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val zchckFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val zchckFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val zchckFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val zchckFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val zchckFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word (* checked sign-extend or low-bits, * Overflow if composed sign-extend not identity *) val schckFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val schckFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val schckFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val schckFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val schckFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val schckFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val schckFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val schckFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val schckFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val schckFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val schckFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val schckFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val schckFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val schckFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val schckFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val schckFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val schckFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val schckFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val schckFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val schckFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val schckFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val schckFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val schckFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val schckFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val schckFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val schckFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val schckFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val schckFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val schckFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val schckFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val schckFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val schckFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val schckFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val schckFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val schckFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val schckFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val schckFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val schckFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val schckFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val schckFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val schckFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val schckFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val schckFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val schckFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val schckFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val schckFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val schckFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val schckFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val schckFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val schckFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val schckFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val schckFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val schckFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val schckFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val schckFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val schckFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val schckFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val schckFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val schckFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val schckFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val schckFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val schckFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val schckFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val schckFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word end signature PRIM_INTEGER = sig include PRIM_INTEGER val zextdFromInt8: Primitive.Int8.int -> int val zextdFromInt16: Primitive.Int16.int -> int val zextdFromInt32: Primitive.Int32.int -> int val zextdFromInt64: Primitive.Int64.int -> int val zextdFromWord8: Primitive.Word8.word -> int val zextdFromWord16: Primitive.Word16.word -> int val zextdFromWord32: Primitive.Word32.word -> int val zextdFromWord64: Primitive.Word64.word -> int val zextdToInt8: int -> Primitive.Int8.int val zextdToInt16: int -> Primitive.Int16.int val zextdToInt32: int -> Primitive.Int32.int val zextdToInt64: int -> Primitive.Int64.int val zextdToWord8: int -> Primitive.Word8.word val zextdToWord16: int -> Primitive.Word16.word val zextdToWord32: int -> Primitive.Word32.word val zextdToWord64: int -> Primitive.Word64.word val sextdFromInt8: Primitive.Int8.int -> int val sextdFromInt16: Primitive.Int16.int -> int val sextdFromInt32: Primitive.Int32.int -> int val sextdFromInt64: Primitive.Int64.int -> int val sextdFromWord8: Primitive.Word8.word -> int val sextdFromWord16: Primitive.Word16.word -> int val sextdFromWord32: Primitive.Word32.word -> int val sextdFromWord64: Primitive.Word64.word -> int val sextdToInt8: int -> Primitive.Int8.int val sextdToInt16: int -> Primitive.Int16.int val sextdToInt32: int -> Primitive.Int32.int val sextdToInt64: int -> Primitive.Int64.int val sextdToWord8: int -> Primitive.Word8.word val sextdToWord16: int -> Primitive.Word16.word val sextdToWord32: int -> Primitive.Word32.word val sextdToWord64: int -> Primitive.Word64.word val castFromInt8: Primitive.Int8.int -> int val castFromInt16: Primitive.Int16.int -> int val castFromInt32: Primitive.Int32.int -> int val castFromInt64: Primitive.Int64.int -> int val castFromWord8: Primitive.Word8.word -> int val castFromWord16: Primitive.Word16.word -> int val castFromWord32: Primitive.Word32.word -> int val castFromWord64: Primitive.Word64.word -> int val castToInt8: int -> Primitive.Int8.int val castToInt16: int -> Primitive.Int16.int val castToInt32: int -> Primitive.Int32.int val castToInt64: int -> Primitive.Int64.int val castToWord8: int -> Primitive.Word8.word val castToWord16: int -> Primitive.Word16.word val castToWord32: int -> Primitive.Word32.word val castToWord64: int -> Primitive.Word64.word val zchckFromInt8: Primitive.Int8.int -> int val zchckFromInt16: Primitive.Int16.int -> int val zchckFromInt32: Primitive.Int32.int -> int val zchckFromInt64: Primitive.Int64.int -> int val zchckFromWord8: Primitive.Word8.word -> int val zchckFromWord16: Primitive.Word16.word -> int val zchckFromWord32: Primitive.Word32.word -> int val zchckFromWord64: Primitive.Word64.word -> int val zchckToInt8: int -> Primitive.Int8.int val zchckToInt16: int -> Primitive.Int16.int val zchckToInt32: int -> Primitive.Int32.int val zchckToInt64: int -> Primitive.Int64.int val zchckToWord8: int -> Primitive.Word8.word val zchckToWord16: int -> Primitive.Word16.word val zchckToWord32: int -> Primitive.Word32.word val zchckToWord64: int -> Primitive.Word64.word val schckFromInt8: Primitive.Int8.int -> int val schckFromInt16: Primitive.Int16.int -> int val schckFromInt32: Primitive.Int32.int -> int val schckFromInt64: Primitive.Int64.int -> int val schckFromWord8: Primitive.Word8.word -> int val schckFromWord16: Primitive.Word16.word -> int val schckFromWord32: Primitive.Word32.word -> int val schckFromWord64: Primitive.Word64.word -> int val schckToInt8: int -> Primitive.Int8.int val schckToInt16: int -> Primitive.Int16.int val schckToInt32: int -> Primitive.Int32.int val schckToInt64: int -> Primitive.Int64.int val schckToWord8: int -> Primitive.Word8.word val schckToWord16: int -> Primitive.Word16.word val schckToWord32: int -> Primitive.Word32.word val schckToWord64: int -> Primitive.Word64.word end signature PRIM_WORD = sig include PRIM_WORD val zextdFromInt8: Primitive.Int8.int -> word val zextdFromInt16: Primitive.Int16.int -> word val zextdFromInt32: Primitive.Int32.int -> word val zextdFromInt64: Primitive.Int64.int -> word val zextdFromWord8: Primitive.Word8.word -> word val zextdFromWord16: Primitive.Word16.word -> word val zextdFromWord32: Primitive.Word32.word -> word val zextdFromWord64: Primitive.Word64.word -> word val zextdToInt8: word -> Primitive.Int8.int val zextdToInt16: word -> Primitive.Int16.int val zextdToInt32: word -> Primitive.Int32.int val zextdToInt64: word -> Primitive.Int64.int val zextdToWord8: word -> Primitive.Word8.word val zextdToWord16: word -> Primitive.Word16.word val zextdToWord32: word -> Primitive.Word32.word val zextdToWord64: word -> Primitive.Word64.word val sextdFromInt8: Primitive.Int8.int -> word val sextdFromInt16: Primitive.Int16.int -> word val sextdFromInt32: Primitive.Int32.int -> word val sextdFromInt64: Primitive.Int64.int -> word val sextdFromWord8: Primitive.Word8.word -> word val sextdFromWord16: Primitive.Word16.word -> word val sextdFromWord32: Primitive.Word32.word -> word val sextdFromWord64: Primitive.Word64.word -> word val sextdToInt8: word -> Primitive.Int8.int val sextdToInt16: word -> Primitive.Int16.int val sextdToInt32: word -> Primitive.Int32.int val sextdToInt64: word -> Primitive.Int64.int val sextdToWord8: word -> Primitive.Word8.word val sextdToWord16: word -> Primitive.Word16.word val sextdToWord32: word -> Primitive.Word32.word val sextdToWord64: word -> Primitive.Word64.word val castFromInt8: Primitive.Int8.int -> word val castFromInt16: Primitive.Int16.int -> word val castFromInt32: Primitive.Int32.int -> word val castFromInt64: Primitive.Int64.int -> word val castFromWord8: Primitive.Word8.word -> word val castFromWord16: Primitive.Word16.word -> word val castFromWord32: Primitive.Word32.word -> word val castFromWord64: Primitive.Word64.word -> word val castToInt8: word -> Primitive.Int8.int val castToInt16: word -> Primitive.Int16.int val castToInt32: word -> Primitive.Int32.int val castToInt64: word -> Primitive.Int64.int val castToWord8: word -> Primitive.Word8.word val castToWord16: word -> Primitive.Word16.word val castToWord32: word -> Primitive.Word32.word val castToWord64: word -> Primitive.Word64.word val zchckFromInt8: Primitive.Int8.int -> word val zchckFromInt16: Primitive.Int16.int -> word val zchckFromInt32: Primitive.Int32.int -> word val zchckFromInt64: Primitive.Int64.int -> word val zchckFromWord8: Primitive.Word8.word -> word val zchckFromWord16: Primitive.Word16.word -> word val zchckFromWord32: Primitive.Word32.word -> word val zchckFromWord64: Primitive.Word64.word -> word val zchckToInt8: word -> Primitive.Int8.int val zchckToInt16: word -> Primitive.Int16.int val zchckToInt32: word -> Primitive.Int32.int val zchckToInt64: word -> Primitive.Int64.int val zchckToWord8: word -> Primitive.Word8.word val zchckToWord16: word -> Primitive.Word16.word val zchckToWord32: word -> Primitive.Word32.word val zchckToWord64: word -> Primitive.Word64.word val schckFromInt8: Primitive.Int8.int -> word val schckFromInt16: Primitive.Int16.int -> word val schckFromInt32: Primitive.Int32.int -> word val schckFromInt64: Primitive.Int64.int -> word val schckFromWord8: Primitive.Word8.word -> word val schckFromWord16: Primitive.Word16.word -> word val schckFromWord32: Primitive.Word32.word -> word val schckFromWord64: Primitive.Word64.word -> word val schckToInt8: word -> Primitive.Int8.int val schckToInt16: word -> Primitive.Int16.int val schckToInt32: word -> Primitive.Int32.int val schckToInt64: word -> Primitive.Int64.int val schckToWord8: word -> Primitive.Word8.word val schckToWord16: word -> Primitive.Word16.word val schckToWord32: word -> Primitive.Word32.word val schckToWord64: word -> Primitive.Word64.word end structure Primitive = struct open Primitive structure IntWordConv : PRIM_INTWORD_CONV = struct open IntWordConv (* C-like cast: extend according to signedness of from or low-bits *) val castFromInt8ToInt8 = sextdFromInt8ToInt8 val castFromInt8ToInt16 = sextdFromInt8ToInt16 val castFromInt8ToInt32 = sextdFromInt8ToInt32 val castFromInt8ToInt64 = sextdFromInt8ToInt64 val castFromInt8ToWord8 = sextdFromInt8ToWord8 val castFromInt8ToWord16 = sextdFromInt8ToWord16 val castFromInt8ToWord32 = sextdFromInt8ToWord32 val castFromInt8ToWord64 = sextdFromInt8ToWord64 val castFromInt16ToInt8 = sextdFromInt16ToInt8 val castFromInt16ToInt16 = sextdFromInt16ToInt16 val castFromInt16ToInt32 = sextdFromInt16ToInt32 val castFromInt16ToInt64 = sextdFromInt16ToInt64 val castFromInt16ToWord8 = sextdFromInt16ToWord8 val castFromInt16ToWord16 = sextdFromInt16ToWord16 val castFromInt16ToWord32 = sextdFromInt16ToWord32 val castFromInt16ToWord64 = sextdFromInt16ToWord64 val castFromInt32ToInt8 = sextdFromInt32ToInt8 val castFromInt32ToInt16 = sextdFromInt32ToInt16 val castFromInt32ToInt32 = sextdFromInt32ToInt32 val castFromInt32ToInt64 = sextdFromInt32ToInt64 val castFromInt32ToWord8 = sextdFromInt32ToWord8 val castFromInt32ToWord16 = sextdFromInt32ToWord16 val castFromInt32ToWord32 = sextdFromInt32ToWord32 val castFromInt32ToWord64 = sextdFromInt32ToWord64 val castFromInt64ToInt8 = sextdFromInt64ToInt8 val castFromInt64ToInt16 = sextdFromInt64ToInt16 val castFromInt64ToInt32 = sextdFromInt64ToInt32 val castFromInt64ToInt64 = sextdFromInt64ToInt64 val castFromInt64ToWord8 = sextdFromInt64ToWord8 val castFromInt64ToWord16 = sextdFromInt64ToWord16 val castFromInt64ToWord32 = sextdFromInt64ToWord32 val castFromInt64ToWord64 = sextdFromInt64ToWord64 val castFromWord8ToInt8 = zextdFromWord8ToInt8 val castFromWord8ToInt16 = zextdFromWord8ToInt16 val castFromWord8ToInt32 = zextdFromWord8ToInt32 val castFromWord8ToInt64 = zextdFromWord8ToInt64 val castFromWord8ToWord8 = zextdFromWord8ToWord8 val castFromWord8ToWord16 = zextdFromWord8ToWord16 val castFromWord8ToWord32 = zextdFromWord8ToWord32 val castFromWord8ToWord64 = zextdFromWord8ToWord64 val castFromWord16ToInt8 = zextdFromWord16ToInt8 val castFromWord16ToInt16 = zextdFromWord16ToInt16 val castFromWord16ToInt32 = zextdFromWord16ToInt32 val castFromWord16ToInt64 = zextdFromWord16ToInt64 val castFromWord16ToWord8 = zextdFromWord16ToWord8 val castFromWord16ToWord16 = zextdFromWord16ToWord16 val castFromWord16ToWord32 = zextdFromWord16ToWord32 val castFromWord16ToWord64 = zextdFromWord16ToWord64 val castFromWord32ToInt8 = zextdFromWord32ToInt8 val castFromWord32ToInt16 = zextdFromWord32ToInt16 val castFromWord32ToInt32 = zextdFromWord32ToInt32 val castFromWord32ToInt64 = zextdFromWord32ToInt64 val castFromWord32ToWord8 = zextdFromWord32ToWord8 val castFromWord32ToWord16 = zextdFromWord32ToWord16 val castFromWord32ToWord32 = zextdFromWord32ToWord32 val castFromWord32ToWord64 = zextdFromWord32ToWord64 val castFromWord64ToInt8 = zextdFromWord64ToInt8 val castFromWord64ToInt16 = zextdFromWord64ToInt16 val castFromWord64ToInt32 = zextdFromWord64ToInt32 val castFromWord64ToInt64 = zextdFromWord64ToInt64 val castFromWord64ToWord8 = zextdFromWord64ToWord8 val castFromWord64ToWord16 = zextdFromWord64ToWord16 val castFromWord64ToWord32 = zextdFromWord64ToWord32 val castFromWord64ToWord64 = zextdFromWord64ToWord64 (* checked zero-extend or low-bits, * Overflow if composed zero-extend not identity *) local fun (''l, ''s) make {zextdFromLargeToSmall: ''l -> ''s, zextdFromSmallToLarge: ''s -> ''l} = if Primitive.Controls.detectOverflow then fn (x: ''l) => let val res = zextdFromLargeToSmall x in if x = (zextdFromSmallToLarge res) then res else raise Overflow end else zextdFromLargeToSmall in val zchckFromInt8ToInt8 = zextdFromInt8ToInt8 val zchckFromInt8ToInt16 = zextdFromInt8ToInt16 val zchckFromInt8ToInt32 = zextdFromInt8ToInt32 val zchckFromInt8ToInt64 = zextdFromInt8ToInt64 val zchckFromInt8ToWord8 = zextdFromInt8ToWord8 val zchckFromInt8ToWord16 = zextdFromInt8ToWord16 val zchckFromInt8ToWord32 = zextdFromInt8ToWord32 val zchckFromInt8ToWord64 = zextdFromInt8ToWord64 val zchckFromInt16ToInt8 = make {zextdFromLargeToSmall = zextdFromInt16ToInt8, zextdFromSmallToLarge = zextdFromInt8ToInt16} val zchckFromInt16ToInt16 = zextdFromInt16ToInt16 val zchckFromInt16ToInt32 = zextdFromInt16ToInt32 val zchckFromInt16ToInt64 = zextdFromInt16ToInt64 val zchckFromInt16ToWord8 = make {zextdFromLargeToSmall = zextdFromInt16ToWord8, zextdFromSmallToLarge = zextdFromWord8ToInt16} val zchckFromInt16ToWord16 = zextdFromInt16ToWord16 val zchckFromInt16ToWord32 = zextdFromInt16ToWord32 val zchckFromInt16ToWord64 = zextdFromInt16ToWord64 val zchckFromInt32ToInt8 = make {zextdFromLargeToSmall = zextdFromInt32ToInt8, zextdFromSmallToLarge = zextdFromInt8ToInt32} val zchckFromInt32ToInt16 = make {zextdFromLargeToSmall = zextdFromInt32ToInt16, zextdFromSmallToLarge = zextdFromInt16ToInt32} val zchckFromInt32ToInt32 = zextdFromInt32ToInt32 val zchckFromInt32ToInt64 = zextdFromInt32ToInt64 val zchckFromInt32ToWord8 = make {zextdFromLargeToSmall = zextdFromInt32ToWord8, zextdFromSmallToLarge = zextdFromWord8ToInt32} val zchckFromInt32ToWord16 = make {zextdFromLargeToSmall = zextdFromInt32ToWord16, zextdFromSmallToLarge = zextdFromWord16ToInt32} val zchckFromInt32ToWord32 = zextdFromInt32ToWord32 val zchckFromInt32ToWord64 = zextdFromInt32ToWord64 val zchckFromInt64ToInt8 = make {zextdFromLargeToSmall = zextdFromInt64ToInt8, zextdFromSmallToLarge = zextdFromInt8ToInt64} val zchckFromInt64ToInt16 = make {zextdFromLargeToSmall = zextdFromInt64ToInt16, zextdFromSmallToLarge = zextdFromInt16ToInt64} val zchckFromInt64ToInt32 = make {zextdFromLargeToSmall = zextdFromInt64ToInt32, zextdFromSmallToLarge = zextdFromInt32ToInt64} val zchckFromInt64ToInt64 = zextdFromInt64ToInt64 val zchckFromInt64ToWord8 = make {zextdFromLargeToSmall = zextdFromInt64ToWord8, zextdFromSmallToLarge = zextdFromWord8ToInt64} val zchckFromInt64ToWord16 = make {zextdFromLargeToSmall = zextdFromInt64ToWord16, zextdFromSmallToLarge = zextdFromWord16ToInt64} val zchckFromInt64ToWord32 = make {zextdFromLargeToSmall = zextdFromInt64ToWord32, zextdFromSmallToLarge = zextdFromWord32ToInt64} val zchckFromInt64ToWord64 = zextdFromInt64ToWord64 val zchckFromWord8ToInt8 = zextdFromWord8ToInt8 val zchckFromWord8ToInt16 = zextdFromWord8ToInt16 val zchckFromWord8ToInt32 = zextdFromWord8ToInt32 val zchckFromWord8ToInt64 = zextdFromWord8ToInt64 val zchckFromWord8ToWord8 = zextdFromWord8ToWord8 val zchckFromWord8ToWord16 = zextdFromWord8ToWord16 val zchckFromWord8ToWord32 = zextdFromWord8ToWord32 val zchckFromWord8ToWord64 = zextdFromWord8ToWord64 val zchckFromWord16ToInt8 = make {zextdFromLargeToSmall = zextdFromWord16ToInt8, zextdFromSmallToLarge = zextdFromInt8ToWord16} val zchckFromWord16ToInt16 = zextdFromWord16ToInt16 val zchckFromWord16ToInt32 = zextdFromWord16ToInt32 val zchckFromWord16ToInt64 = zextdFromWord16ToInt64 val zchckFromWord16ToWord8 = make {zextdFromLargeToSmall = zextdFromWord16ToWord8, zextdFromSmallToLarge = zextdFromWord8ToWord16} val zchckFromWord16ToWord16 = zextdFromWord16ToWord16 val zchckFromWord16ToWord32 = zextdFromWord16ToWord32 val zchckFromWord16ToWord64 = zextdFromWord16ToWord64 val zchckFromWord32ToInt8 = make {zextdFromLargeToSmall = zextdFromWord32ToInt8, zextdFromSmallToLarge = zextdFromInt8ToWord32} val zchckFromWord32ToInt16 = make {zextdFromLargeToSmall = zextdFromWord32ToInt16, zextdFromSmallToLarge = zextdFromInt16ToWord32} val zchckFromWord32ToInt32 = zextdFromWord32ToInt32 val zchckFromWord32ToInt64 = zextdFromWord32ToInt64 val zchckFromWord32ToWord8 = make {zextdFromLargeToSmall = zextdFromWord32ToWord8, zextdFromSmallToLarge = zextdFromWord8ToWord32} val zchckFromWord32ToWord16 = make {zextdFromLargeToSmall = zextdFromWord32ToWord16, zextdFromSmallToLarge = zextdFromWord16ToWord32} val zchckFromWord32ToWord32 = zextdFromWord32ToWord32 val zchckFromWord32ToWord64 = zextdFromWord32ToWord64 val zchckFromWord64ToInt8 = make {zextdFromLargeToSmall = zextdFromWord64ToInt8, zextdFromSmallToLarge = zextdFromInt8ToWord64} val zchckFromWord64ToInt16 = make {zextdFromLargeToSmall = zextdFromWord64ToInt16, zextdFromSmallToLarge = zextdFromInt16ToWord64} val zchckFromWord64ToInt32 = make {zextdFromLargeToSmall = zextdFromWord64ToInt32, zextdFromSmallToLarge = zextdFromInt32ToWord64} val zchckFromWord64ToInt64 = zextdFromWord64ToInt64 val zchckFromWord64ToWord8 = make {zextdFromLargeToSmall = zextdFromWord64ToWord8, zextdFromSmallToLarge = zextdFromWord8ToWord64} val zchckFromWord64ToWord16 = make {zextdFromLargeToSmall = zextdFromWord64ToWord16, zextdFromSmallToLarge = zextdFromWord16ToWord64} val zchckFromWord64ToWord32 = make {zextdFromLargeToSmall = zextdFromWord64ToWord32, zextdFromSmallToLarge = zextdFromWord32ToWord64} val zchckFromWord64ToWord64 = zextdFromWord64ToWord64 end (* checked sign-extend or low-bits, * Overflow if composed sign-extend not identity *) local fun (''l, ''s) make {sextdFromLargeToSmall: ''l -> ''s, sextdFromSmallToLarge: ''s -> ''l} = if Primitive.Controls.detectOverflow then fn (x: ''l) => let val res = sextdFromLargeToSmall x in if x = (sextdFromSmallToLarge res) then res else raise Overflow end else sextdFromLargeToSmall in val schckFromInt8ToInt8 = sextdFromInt8ToInt8 val schckFromInt8ToInt16 = sextdFromInt8ToInt16 val schckFromInt8ToInt32 = sextdFromInt8ToInt32 val schckFromInt8ToInt64 = sextdFromInt8ToInt64 val schckFromInt8ToWord8 = sextdFromInt8ToWord8 val schckFromInt8ToWord16 = sextdFromInt8ToWord16 val schckFromInt8ToWord32 = sextdFromInt8ToWord32 val schckFromInt8ToWord64 = sextdFromInt8ToWord64 val schckFromInt16ToInt8 = make {sextdFromLargeToSmall = sextdFromInt16ToInt8, sextdFromSmallToLarge = sextdFromInt8ToInt16} val schckFromInt16ToInt16 = sextdFromInt16ToInt16 val schckFromInt16ToInt32 = sextdFromInt16ToInt32 val schckFromInt16ToInt64 = sextdFromInt16ToInt64 val schckFromInt16ToWord8 = make {sextdFromLargeToSmall = sextdFromInt16ToWord8, sextdFromSmallToLarge = sextdFromWord8ToInt16} val schckFromInt16ToWord16 = sextdFromInt16ToWord16 val schckFromInt16ToWord32 = sextdFromInt16ToWord32 val schckFromInt16ToWord64 = sextdFromInt16ToWord64 val schckFromInt32ToInt8 = make {sextdFromLargeToSmall = sextdFromInt32ToInt8, sextdFromSmallToLarge = sextdFromInt8ToInt32} val schckFromInt32ToInt16 = make {sextdFromLargeToSmall = sextdFromInt32ToInt16, sextdFromSmallToLarge = sextdFromInt16ToInt32} val schckFromInt32ToInt32 = sextdFromInt32ToInt32 val schckFromInt32ToInt64 = sextdFromInt32ToInt64 val schckFromInt32ToWord8 = make {sextdFromLargeToSmall = sextdFromInt32ToWord8, sextdFromSmallToLarge = sextdFromWord8ToInt32} val schckFromInt32ToWord16 = make {sextdFromLargeToSmall = sextdFromInt32ToWord16, sextdFromSmallToLarge = sextdFromWord16ToInt32} val schckFromInt32ToWord32 = sextdFromInt32ToWord32 val schckFromInt32ToWord64 = sextdFromInt32ToWord64 val schckFromInt64ToInt8 = make {sextdFromLargeToSmall = sextdFromInt64ToInt8, sextdFromSmallToLarge = sextdFromInt8ToInt64} val schckFromInt64ToInt16 = make {sextdFromLargeToSmall = sextdFromInt64ToInt16, sextdFromSmallToLarge = sextdFromInt16ToInt64} val schckFromInt64ToInt32 = make {sextdFromLargeToSmall = sextdFromInt64ToInt32, sextdFromSmallToLarge = sextdFromInt32ToInt64} val schckFromInt64ToInt64 = sextdFromInt64ToInt64 val schckFromInt64ToWord8 = make {sextdFromLargeToSmall = sextdFromInt64ToWord8, sextdFromSmallToLarge = sextdFromWord8ToInt64} val schckFromInt64ToWord16 = make {sextdFromLargeToSmall = sextdFromInt64ToWord16, sextdFromSmallToLarge = sextdFromWord16ToInt64} val schckFromInt64ToWord32 = make {sextdFromLargeToSmall = sextdFromInt64ToWord32, sextdFromSmallToLarge = sextdFromWord32ToInt64} val schckFromInt64ToWord64 = sextdFromInt64ToWord64 val schckFromWord8ToInt8 = sextdFromWord8ToInt8 val schckFromWord8ToInt16 = sextdFromWord8ToInt16 val schckFromWord8ToInt32 = sextdFromWord8ToInt32 val schckFromWord8ToInt64 = sextdFromWord8ToInt64 val schckFromWord8ToWord8 = sextdFromWord8ToWord8 val schckFromWord8ToWord16 = sextdFromWord8ToWord16 val schckFromWord8ToWord32 = sextdFromWord8ToWord32 val schckFromWord8ToWord64 = sextdFromWord8ToWord64 val schckFromWord16ToInt8 = make {sextdFromLargeToSmall = sextdFromWord16ToInt8, sextdFromSmallToLarge = sextdFromInt8ToWord16} val schckFromWord16ToInt16 = sextdFromWord16ToInt16 val schckFromWord16ToInt32 = sextdFromWord16ToInt32 val schckFromWord16ToInt64 = sextdFromWord16ToInt64 val schckFromWord16ToWord8 = make {sextdFromLargeToSmall = sextdFromWord16ToWord8, sextdFromSmallToLarge = sextdFromWord8ToWord16} val schckFromWord16ToWord16 = sextdFromWord16ToWord16 val schckFromWord16ToWord32 = sextdFromWord16ToWord32 val schckFromWord16ToWord64 = sextdFromWord16ToWord64 val schckFromWord32ToInt8 = make {sextdFromLargeToSmall = sextdFromWord32ToInt8, sextdFromSmallToLarge = sextdFromInt8ToWord32} val schckFromWord32ToInt16 = make {sextdFromLargeToSmall = sextdFromWord32ToInt16, sextdFromSmallToLarge = sextdFromInt16ToWord32} val schckFromWord32ToInt32 = sextdFromWord32ToInt32 val schckFromWord32ToInt64 = sextdFromWord32ToInt64 val schckFromWord32ToWord8 = make {sextdFromLargeToSmall = sextdFromWord32ToWord8, sextdFromSmallToLarge = sextdFromWord8ToWord32} val schckFromWord32ToWord16 = make {sextdFromLargeToSmall = sextdFromWord32ToWord16, sextdFromSmallToLarge = sextdFromWord16ToWord32} val schckFromWord32ToWord32 = sextdFromWord32ToWord32 val schckFromWord32ToWord64 = sextdFromWord32ToWord64 val schckFromWord64ToInt8 = make {sextdFromLargeToSmall = sextdFromWord64ToInt8, sextdFromSmallToLarge = sextdFromInt8ToWord64} val schckFromWord64ToInt16 = make {sextdFromLargeToSmall = sextdFromWord64ToInt16, sextdFromSmallToLarge = sextdFromInt16ToWord64} val schckFromWord64ToInt32 = make {sextdFromLargeToSmall = sextdFromWord64ToInt32, sextdFromSmallToLarge = sextdFromInt32ToWord64} val schckFromWord64ToInt64 = sextdFromWord64ToInt64 val schckFromWord64ToWord8 = make {sextdFromLargeToSmall = sextdFromWord64ToWord8, sextdFromSmallToLarge = sextdFromWord8ToWord64} val schckFromWord64ToWord16 = make {sextdFromLargeToSmall = sextdFromWord64ToWord16, sextdFromSmallToLarge = sextdFromWord16ToWord64} val schckFromWord64ToWord32 = make {sextdFromLargeToSmall = sextdFromWord64ToWord32, sextdFromSmallToLarge = sextdFromWord32ToWord64} val schckFromWord64ToWord64 = sextdFromWord64ToWord64 end end structure Int8 : PRIM_INTEGER = struct open Int8 val zextdFromInt8 = IntWordConv.zextdFromInt8ToInt8 val zextdFromInt16 = IntWordConv.zextdFromInt16ToInt8 val zextdFromInt32 = IntWordConv.zextdFromInt32ToInt8 val zextdFromInt64 = IntWordConv.zextdFromInt64ToInt8 val zextdFromWord8 = IntWordConv.zextdFromWord8ToInt8 val zextdFromWord16 = IntWordConv.zextdFromWord16ToInt8 val zextdFromWord32 = IntWordConv.zextdFromWord32ToInt8 val zextdFromWord64 = IntWordConv.zextdFromWord64ToInt8 val zextdToInt8 = IntWordConv.zextdFromInt8ToInt8 val zextdToInt16 = IntWordConv.zextdFromInt8ToInt16 val zextdToInt32 = IntWordConv.zextdFromInt8ToInt32 val zextdToInt64 = IntWordConv.zextdFromInt8ToInt64 val zextdToWord8 = IntWordConv.zextdFromInt8ToWord8 val zextdToWord16 = IntWordConv.zextdFromInt8ToWord16 val zextdToWord32 = IntWordConv.zextdFromInt8ToWord32 val zextdToWord64 = IntWordConv.zextdFromInt8ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToInt8 val sextdFromInt16 = IntWordConv.sextdFromInt16ToInt8 val sextdFromInt32 = IntWordConv.sextdFromInt32ToInt8 val sextdFromInt64 = IntWordConv.sextdFromInt64ToInt8 val sextdFromWord8 = IntWordConv.sextdFromWord8ToInt8 val sextdFromWord16 = IntWordConv.sextdFromWord16ToInt8 val sextdFromWord32 = IntWordConv.sextdFromWord32ToInt8 val sextdFromWord64 = IntWordConv.sextdFromWord64ToInt8 val sextdToInt8 = IntWordConv.sextdFromInt8ToInt8 val sextdToInt16 = IntWordConv.sextdFromInt8ToInt16 val sextdToInt32 = IntWordConv.sextdFromInt8ToInt32 val sextdToInt64 = IntWordConv.sextdFromInt8ToInt64 val sextdToWord8 = IntWordConv.sextdFromInt8ToWord8 val sextdToWord16 = IntWordConv.sextdFromInt8ToWord16 val sextdToWord32 = IntWordConv.sextdFromInt8ToWord32 val sextdToWord64 = IntWordConv.sextdFromInt8ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToInt8 val castFromInt16 = IntWordConv.castFromInt16ToInt8 val castFromInt32 = IntWordConv.castFromInt32ToInt8 val castFromInt64 = IntWordConv.castFromInt64ToInt8 val castFromWord8 = IntWordConv.castFromWord8ToInt8 val castFromWord16 = IntWordConv.castFromWord16ToInt8 val castFromWord32 = IntWordConv.castFromWord32ToInt8 val castFromWord64 = IntWordConv.castFromWord64ToInt8 val castToInt8 = IntWordConv.castFromInt8ToInt8 val castToInt16 = IntWordConv.castFromInt8ToInt16 val castToInt32 = IntWordConv.castFromInt8ToInt32 val castToInt64 = IntWordConv.castFromInt8ToInt64 val castToWord8 = IntWordConv.castFromInt8ToWord8 val castToWord16 = IntWordConv.castFromInt8ToWord16 val castToWord32 = IntWordConv.castFromInt8ToWord32 val castToWord64 = IntWordConv.castFromInt8ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToInt8 val zchckFromInt16 = IntWordConv.zchckFromInt16ToInt8 val zchckFromInt32 = IntWordConv.zchckFromInt32ToInt8 val zchckFromInt64 = IntWordConv.zchckFromInt64ToInt8 val zchckFromWord8 = IntWordConv.zchckFromWord8ToInt8 val zchckFromWord16 = IntWordConv.zchckFromWord16ToInt8 val zchckFromWord32 = IntWordConv.zchckFromWord32ToInt8 val zchckFromWord64 = IntWordConv.zchckFromWord64ToInt8 val zchckToInt8 = IntWordConv.zchckFromInt8ToInt8 val zchckToInt16 = IntWordConv.zchckFromInt8ToInt16 val zchckToInt32 = IntWordConv.zchckFromInt8ToInt32 val zchckToInt64 = IntWordConv.zchckFromInt8ToInt64 val zchckToWord8 = IntWordConv.zchckFromInt8ToWord8 val zchckToWord16 = IntWordConv.zchckFromInt8ToWord16 val zchckToWord32 = IntWordConv.zchckFromInt8ToWord32 val zchckToWord64 = IntWordConv.zchckFromInt8ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToInt8 val schckFromInt16 = IntWordConv.schckFromInt16ToInt8 val schckFromInt32 = IntWordConv.schckFromInt32ToInt8 val schckFromInt64 = IntWordConv.schckFromInt64ToInt8 val schckFromWord8 = IntWordConv.schckFromWord8ToInt8 val schckFromWord16 = IntWordConv.schckFromWord16ToInt8 val schckFromWord32 = IntWordConv.schckFromWord32ToInt8 val schckFromWord64 = IntWordConv.schckFromWord64ToInt8 val schckToInt8 = IntWordConv.schckFromInt8ToInt8 val schckToInt16 = IntWordConv.schckFromInt8ToInt16 val schckToInt32 = IntWordConv.schckFromInt8ToInt32 val schckToInt64 = IntWordConv.schckFromInt8ToInt64 val schckToWord8 = IntWordConv.schckFromInt8ToWord8 val schckToWord16 = IntWordConv.schckFromInt8ToWord16 val schckToWord32 = IntWordConv.schckFromInt8ToWord32 val schckToWord64 = IntWordConv.schckFromInt8ToWord64 end structure Int16 : PRIM_INTEGER = struct open Int16 val zextdFromInt8 = IntWordConv.zextdFromInt8ToInt16 val zextdFromInt16 = IntWordConv.zextdFromInt16ToInt16 val zextdFromInt32 = IntWordConv.zextdFromInt32ToInt16 val zextdFromInt64 = IntWordConv.zextdFromInt64ToInt16 val zextdFromWord8 = IntWordConv.zextdFromWord8ToInt16 val zextdFromWord16 = IntWordConv.zextdFromWord16ToInt16 val zextdFromWord32 = IntWordConv.zextdFromWord32ToInt16 val zextdFromWord64 = IntWordConv.zextdFromWord64ToInt16 val zextdToInt8 = IntWordConv.zextdFromInt16ToInt8 val zextdToInt16 = IntWordConv.zextdFromInt16ToInt16 val zextdToInt32 = IntWordConv.zextdFromInt16ToInt32 val zextdToInt64 = IntWordConv.zextdFromInt16ToInt64 val zextdToWord8 = IntWordConv.zextdFromInt16ToWord8 val zextdToWord16 = IntWordConv.zextdFromInt16ToWord16 val zextdToWord32 = IntWordConv.zextdFromInt16ToWord32 val zextdToWord64 = IntWordConv.zextdFromInt16ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToInt16 val sextdFromInt16 = IntWordConv.sextdFromInt16ToInt16 val sextdFromInt32 = IntWordConv.sextdFromInt32ToInt16 val sextdFromInt64 = IntWordConv.sextdFromInt64ToInt16 val sextdFromWord8 = IntWordConv.sextdFromWord8ToInt16 val sextdFromWord16 = IntWordConv.sextdFromWord16ToInt16 val sextdFromWord32 = IntWordConv.sextdFromWord32ToInt16 val sextdFromWord64 = IntWordConv.sextdFromWord64ToInt16 val sextdToInt8 = IntWordConv.sextdFromInt16ToInt8 val sextdToInt16 = IntWordConv.sextdFromInt16ToInt16 val sextdToInt32 = IntWordConv.sextdFromInt16ToInt32 val sextdToInt64 = IntWordConv.sextdFromInt16ToInt64 val sextdToWord8 = IntWordConv.sextdFromInt16ToWord8 val sextdToWord16 = IntWordConv.sextdFromInt16ToWord16 val sextdToWord32 = IntWordConv.sextdFromInt16ToWord32 val sextdToWord64 = IntWordConv.sextdFromInt16ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToInt16 val castFromInt16 = IntWordConv.castFromInt16ToInt16 val castFromInt32 = IntWordConv.castFromInt32ToInt16 val castFromInt64 = IntWordConv.castFromInt64ToInt16 val castFromWord8 = IntWordConv.castFromWord8ToInt16 val castFromWord16 = IntWordConv.castFromWord16ToInt16 val castFromWord32 = IntWordConv.castFromWord32ToInt16 val castFromWord64 = IntWordConv.castFromWord64ToInt16 val castToInt8 = IntWordConv.castFromInt16ToInt8 val castToInt16 = IntWordConv.castFromInt16ToInt16 val castToInt32 = IntWordConv.castFromInt16ToInt32 val castToInt64 = IntWordConv.castFromInt16ToInt64 val castToWord8 = IntWordConv.castFromInt16ToWord8 val castToWord16 = IntWordConv.castFromInt16ToWord16 val castToWord32 = IntWordConv.castFromInt16ToWord32 val castToWord64 = IntWordConv.castFromInt16ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToInt16 val zchckFromInt16 = IntWordConv.zchckFromInt16ToInt16 val zchckFromInt32 = IntWordConv.zchckFromInt32ToInt16 val zchckFromInt64 = IntWordConv.zchckFromInt64ToInt16 val zchckFromWord8 = IntWordConv.zchckFromWord8ToInt16 val zchckFromWord16 = IntWordConv.zchckFromWord16ToInt16 val zchckFromWord32 = IntWordConv.zchckFromWord32ToInt16 val zchckFromWord64 = IntWordConv.zchckFromWord64ToInt16 val zchckToInt8 = IntWordConv.zchckFromInt16ToInt8 val zchckToInt16 = IntWordConv.zchckFromInt16ToInt16 val zchckToInt32 = IntWordConv.zchckFromInt16ToInt32 val zchckToInt64 = IntWordConv.zchckFromInt16ToInt64 val zchckToWord8 = IntWordConv.zchckFromInt16ToWord8 val zchckToWord16 = IntWordConv.zchckFromInt16ToWord16 val zchckToWord32 = IntWordConv.zchckFromInt16ToWord32 val zchckToWord64 = IntWordConv.zchckFromInt16ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToInt16 val schckFromInt16 = IntWordConv.schckFromInt16ToInt16 val schckFromInt32 = IntWordConv.schckFromInt32ToInt16 val schckFromInt64 = IntWordConv.schckFromInt64ToInt16 val schckFromWord8 = IntWordConv.schckFromWord8ToInt16 val schckFromWord16 = IntWordConv.schckFromWord16ToInt16 val schckFromWord32 = IntWordConv.schckFromWord32ToInt16 val schckFromWord64 = IntWordConv.schckFromWord64ToInt16 val schckToInt8 = IntWordConv.schckFromInt16ToInt8 val schckToInt16 = IntWordConv.schckFromInt16ToInt16 val schckToInt32 = IntWordConv.schckFromInt16ToInt32 val schckToInt64 = IntWordConv.schckFromInt16ToInt64 val schckToWord8 = IntWordConv.schckFromInt16ToWord8 val schckToWord16 = IntWordConv.schckFromInt16ToWord16 val schckToWord32 = IntWordConv.schckFromInt16ToWord32 val schckToWord64 = IntWordConv.schckFromInt16ToWord64 end structure Int32 : PRIM_INTEGER = struct open Int32 val zextdFromInt8 = IntWordConv.zextdFromInt8ToInt32 val zextdFromInt16 = IntWordConv.zextdFromInt16ToInt32 val zextdFromInt32 = IntWordConv.zextdFromInt32ToInt32 val zextdFromInt64 = IntWordConv.zextdFromInt64ToInt32 val zextdFromWord8 = IntWordConv.zextdFromWord8ToInt32 val zextdFromWord16 = IntWordConv.zextdFromWord16ToInt32 val zextdFromWord32 = IntWordConv.zextdFromWord32ToInt32 val zextdFromWord64 = IntWordConv.zextdFromWord64ToInt32 val zextdToInt8 = IntWordConv.zextdFromInt32ToInt8 val zextdToInt16 = IntWordConv.zextdFromInt32ToInt16 val zextdToInt32 = IntWordConv.zextdFromInt32ToInt32 val zextdToInt64 = IntWordConv.zextdFromInt32ToInt64 val zextdToWord8 = IntWordConv.zextdFromInt32ToWord8 val zextdToWord16 = IntWordConv.zextdFromInt32ToWord16 val zextdToWord32 = IntWordConv.zextdFromInt32ToWord32 val zextdToWord64 = IntWordConv.zextdFromInt32ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToInt32 val sextdFromInt16 = IntWordConv.sextdFromInt16ToInt32 val sextdFromInt32 = IntWordConv.sextdFromInt32ToInt32 val sextdFromInt64 = IntWordConv.sextdFromInt64ToInt32 val sextdFromWord8 = IntWordConv.sextdFromWord8ToInt32 val sextdFromWord16 = IntWordConv.sextdFromWord16ToInt32 val sextdFromWord32 = IntWordConv.sextdFromWord32ToInt32 val sextdFromWord64 = IntWordConv.sextdFromWord64ToInt32 val sextdToInt8 = IntWordConv.sextdFromInt32ToInt8 val sextdToInt16 = IntWordConv.sextdFromInt32ToInt16 val sextdToInt32 = IntWordConv.sextdFromInt32ToInt32 val sextdToInt64 = IntWordConv.sextdFromInt32ToInt64 val sextdToWord8 = IntWordConv.sextdFromInt32ToWord8 val sextdToWord16 = IntWordConv.sextdFromInt32ToWord16 val sextdToWord32 = IntWordConv.sextdFromInt32ToWord32 val sextdToWord64 = IntWordConv.sextdFromInt32ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToInt32 val castFromInt16 = IntWordConv.castFromInt16ToInt32 val castFromInt32 = IntWordConv.castFromInt32ToInt32 val castFromInt64 = IntWordConv.castFromInt64ToInt32 val castFromWord8 = IntWordConv.castFromWord8ToInt32 val castFromWord16 = IntWordConv.castFromWord16ToInt32 val castFromWord32 = IntWordConv.castFromWord32ToInt32 val castFromWord64 = IntWordConv.castFromWord64ToInt32 val castToInt8 = IntWordConv.castFromInt32ToInt8 val castToInt16 = IntWordConv.castFromInt32ToInt16 val castToInt32 = IntWordConv.castFromInt32ToInt32 val castToInt64 = IntWordConv.castFromInt32ToInt64 val castToWord8 = IntWordConv.castFromInt32ToWord8 val castToWord16 = IntWordConv.castFromInt32ToWord16 val castToWord32 = IntWordConv.castFromInt32ToWord32 val castToWord64 = IntWordConv.castFromInt32ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToInt32 val zchckFromInt16 = IntWordConv.zchckFromInt16ToInt32 val zchckFromInt32 = IntWordConv.zchckFromInt32ToInt32 val zchckFromInt64 = IntWordConv.zchckFromInt64ToInt32 val zchckFromWord8 = IntWordConv.zchckFromWord8ToInt32 val zchckFromWord16 = IntWordConv.zchckFromWord16ToInt32 val zchckFromWord32 = IntWordConv.zchckFromWord32ToInt32 val zchckFromWord64 = IntWordConv.zchckFromWord64ToInt32 val zchckToInt8 = IntWordConv.zchckFromInt32ToInt8 val zchckToInt16 = IntWordConv.zchckFromInt32ToInt16 val zchckToInt32 = IntWordConv.zchckFromInt32ToInt32 val zchckToInt64 = IntWordConv.zchckFromInt32ToInt64 val zchckToWord8 = IntWordConv.zchckFromInt32ToWord8 val zchckToWord16 = IntWordConv.zchckFromInt32ToWord16 val zchckToWord32 = IntWordConv.zchckFromInt32ToWord32 val zchckToWord64 = IntWordConv.zchckFromInt32ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToInt32 val schckFromInt16 = IntWordConv.schckFromInt16ToInt32 val schckFromInt32 = IntWordConv.schckFromInt32ToInt32 val schckFromInt64 = IntWordConv.schckFromInt64ToInt32 val schckFromWord8 = IntWordConv.schckFromWord8ToInt32 val schckFromWord16 = IntWordConv.schckFromWord16ToInt32 val schckFromWord32 = IntWordConv.schckFromWord32ToInt32 val schckFromWord64 = IntWordConv.schckFromWord64ToInt32 val schckToInt8 = IntWordConv.schckFromInt32ToInt8 val schckToInt16 = IntWordConv.schckFromInt32ToInt16 val schckToInt32 = IntWordConv.schckFromInt32ToInt32 val schckToInt64 = IntWordConv.schckFromInt32ToInt64 val schckToWord8 = IntWordConv.schckFromInt32ToWord8 val schckToWord16 = IntWordConv.schckFromInt32ToWord16 val schckToWord32 = IntWordConv.schckFromInt32ToWord32 val schckToWord64 = IntWordConv.schckFromInt32ToWord64 end structure Int64 : PRIM_INTEGER = struct open Int64 val zextdFromInt8 = IntWordConv.zextdFromInt8ToInt64 val zextdFromInt16 = IntWordConv.zextdFromInt16ToInt64 val zextdFromInt32 = IntWordConv.zextdFromInt32ToInt64 val zextdFromInt64 = IntWordConv.zextdFromInt64ToInt64 val zextdFromWord8 = IntWordConv.zextdFromWord8ToInt64 val zextdFromWord16 = IntWordConv.zextdFromWord16ToInt64 val zextdFromWord32 = IntWordConv.zextdFromWord32ToInt64 val zextdFromWord64 = IntWordConv.zextdFromWord64ToInt64 val zextdToInt8 = IntWordConv.zextdFromInt64ToInt8 val zextdToInt16 = IntWordConv.zextdFromInt64ToInt16 val zextdToInt32 = IntWordConv.zextdFromInt64ToInt32 val zextdToInt64 = IntWordConv.zextdFromInt64ToInt64 val zextdToWord8 = IntWordConv.zextdFromInt64ToWord8 val zextdToWord16 = IntWordConv.zextdFromInt64ToWord16 val zextdToWord32 = IntWordConv.zextdFromInt64ToWord32 val zextdToWord64 = IntWordConv.zextdFromInt64ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToInt64 val sextdFromInt16 = IntWordConv.sextdFromInt16ToInt64 val sextdFromInt32 = IntWordConv.sextdFromInt32ToInt64 val sextdFromInt64 = IntWordConv.sextdFromInt64ToInt64 val sextdFromWord8 = IntWordConv.sextdFromWord8ToInt64 val sextdFromWord16 = IntWordConv.sextdFromWord16ToInt64 val sextdFromWord32 = IntWordConv.sextdFromWord32ToInt64 val sextdFromWord64 = IntWordConv.sextdFromWord64ToInt64 val sextdToInt8 = IntWordConv.sextdFromInt64ToInt8 val sextdToInt16 = IntWordConv.sextdFromInt64ToInt16 val sextdToInt32 = IntWordConv.sextdFromInt64ToInt32 val sextdToInt64 = IntWordConv.sextdFromInt64ToInt64 val sextdToWord8 = IntWordConv.sextdFromInt64ToWord8 val sextdToWord16 = IntWordConv.sextdFromInt64ToWord16 val sextdToWord32 = IntWordConv.sextdFromInt64ToWord32 val sextdToWord64 = IntWordConv.sextdFromInt64ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToInt64 val castFromInt16 = IntWordConv.castFromInt16ToInt64 val castFromInt32 = IntWordConv.castFromInt32ToInt64 val castFromInt64 = IntWordConv.castFromInt64ToInt64 val castFromWord8 = IntWordConv.castFromWord8ToInt64 val castFromWord16 = IntWordConv.castFromWord16ToInt64 val castFromWord32 = IntWordConv.castFromWord32ToInt64 val castFromWord64 = IntWordConv.castFromWord64ToInt64 val castToInt8 = IntWordConv.castFromInt64ToInt8 val castToInt16 = IntWordConv.castFromInt64ToInt16 val castToInt32 = IntWordConv.castFromInt64ToInt32 val castToInt64 = IntWordConv.castFromInt64ToInt64 val castToWord8 = IntWordConv.castFromInt64ToWord8 val castToWord16 = IntWordConv.castFromInt64ToWord16 val castToWord32 = IntWordConv.castFromInt64ToWord32 val castToWord64 = IntWordConv.castFromInt64ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToInt64 val zchckFromInt16 = IntWordConv.zchckFromInt16ToInt64 val zchckFromInt32 = IntWordConv.zchckFromInt32ToInt64 val zchckFromInt64 = IntWordConv.zchckFromInt64ToInt64 val zchckFromWord8 = IntWordConv.zchckFromWord8ToInt64 val zchckFromWord16 = IntWordConv.zchckFromWord16ToInt64 val zchckFromWord32 = IntWordConv.zchckFromWord32ToInt64 val zchckFromWord64 = IntWordConv.zchckFromWord64ToInt64 val zchckToInt8 = IntWordConv.zchckFromInt64ToInt8 val zchckToInt16 = IntWordConv.zchckFromInt64ToInt16 val zchckToInt32 = IntWordConv.zchckFromInt64ToInt32 val zchckToInt64 = IntWordConv.zchckFromInt64ToInt64 val zchckToWord8 = IntWordConv.zchckFromInt64ToWord8 val zchckToWord16 = IntWordConv.zchckFromInt64ToWord16 val zchckToWord32 = IntWordConv.zchckFromInt64ToWord32 val zchckToWord64 = IntWordConv.zchckFromInt64ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToInt64 val schckFromInt16 = IntWordConv.schckFromInt16ToInt64 val schckFromInt32 = IntWordConv.schckFromInt32ToInt64 val schckFromInt64 = IntWordConv.schckFromInt64ToInt64 val schckFromWord8 = IntWordConv.schckFromWord8ToInt64 val schckFromWord16 = IntWordConv.schckFromWord16ToInt64 val schckFromWord32 = IntWordConv.schckFromWord32ToInt64 val schckFromWord64 = IntWordConv.schckFromWord64ToInt64 val schckToInt8 = IntWordConv.schckFromInt64ToInt8 val schckToInt16 = IntWordConv.schckFromInt64ToInt16 val schckToInt32 = IntWordConv.schckFromInt64ToInt32 val schckToInt64 = IntWordConv.schckFromInt64ToInt64 val schckToWord8 = IntWordConv.schckFromInt64ToWord8 val schckToWord16 = IntWordConv.schckFromInt64ToWord16 val schckToWord32 = IntWordConv.schckFromInt64ToWord32 val schckToWord64 = IntWordConv.schckFromInt64ToWord64 end structure Word8 : PRIM_WORD = struct open Word8 val zextdFromInt8 = IntWordConv.zextdFromInt8ToWord8 val zextdFromInt16 = IntWordConv.zextdFromInt16ToWord8 val zextdFromInt32 = IntWordConv.zextdFromInt32ToWord8 val zextdFromInt64 = IntWordConv.zextdFromInt64ToWord8 val zextdFromWord8 = IntWordConv.zextdFromWord8ToWord8 val zextdFromWord16 = IntWordConv.zextdFromWord16ToWord8 val zextdFromWord32 = IntWordConv.zextdFromWord32ToWord8 val zextdFromWord64 = IntWordConv.zextdFromWord64ToWord8 val zextdToInt8 = IntWordConv.zextdFromWord8ToInt8 val zextdToInt16 = IntWordConv.zextdFromWord8ToInt16 val zextdToInt32 = IntWordConv.zextdFromWord8ToInt32 val zextdToInt64 = IntWordConv.zextdFromWord8ToInt64 val zextdToWord8 = IntWordConv.zextdFromWord8ToWord8 val zextdToWord16 = IntWordConv.zextdFromWord8ToWord16 val zextdToWord32 = IntWordConv.zextdFromWord8ToWord32 val zextdToWord64 = IntWordConv.zextdFromWord8ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToWord8 val sextdFromInt16 = IntWordConv.sextdFromInt16ToWord8 val sextdFromInt32 = IntWordConv.sextdFromInt32ToWord8 val sextdFromInt64 = IntWordConv.sextdFromInt64ToWord8 val sextdFromWord8 = IntWordConv.sextdFromWord8ToWord8 val sextdFromWord16 = IntWordConv.sextdFromWord16ToWord8 val sextdFromWord32 = IntWordConv.sextdFromWord32ToWord8 val sextdFromWord64 = IntWordConv.sextdFromWord64ToWord8 val sextdToInt8 = IntWordConv.sextdFromWord8ToInt8 val sextdToInt16 = IntWordConv.sextdFromWord8ToInt16 val sextdToInt32 = IntWordConv.sextdFromWord8ToInt32 val sextdToInt64 = IntWordConv.sextdFromWord8ToInt64 val sextdToWord8 = IntWordConv.sextdFromWord8ToWord8 val sextdToWord16 = IntWordConv.sextdFromWord8ToWord16 val sextdToWord32 = IntWordConv.sextdFromWord8ToWord32 val sextdToWord64 = IntWordConv.sextdFromWord8ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToWord8 val castFromInt16 = IntWordConv.castFromInt16ToWord8 val castFromInt32 = IntWordConv.castFromInt32ToWord8 val castFromInt64 = IntWordConv.castFromInt64ToWord8 val castFromWord8 = IntWordConv.castFromWord8ToWord8 val castFromWord16 = IntWordConv.castFromWord16ToWord8 val castFromWord32 = IntWordConv.castFromWord32ToWord8 val castFromWord64 = IntWordConv.castFromWord64ToWord8 val castToInt8 = IntWordConv.castFromWord8ToInt8 val castToInt16 = IntWordConv.castFromWord8ToInt16 val castToInt32 = IntWordConv.castFromWord8ToInt32 val castToInt64 = IntWordConv.castFromWord8ToInt64 val castToWord8 = IntWordConv.castFromWord8ToWord8 val castToWord16 = IntWordConv.castFromWord8ToWord16 val castToWord32 = IntWordConv.castFromWord8ToWord32 val castToWord64 = IntWordConv.castFromWord8ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToWord8 val zchckFromInt16 = IntWordConv.zchckFromInt16ToWord8 val zchckFromInt32 = IntWordConv.zchckFromInt32ToWord8 val zchckFromInt64 = IntWordConv.zchckFromInt64ToWord8 val zchckFromWord8 = IntWordConv.zchckFromWord8ToWord8 val zchckFromWord16 = IntWordConv.zchckFromWord16ToWord8 val zchckFromWord32 = IntWordConv.zchckFromWord32ToWord8 val zchckFromWord64 = IntWordConv.zchckFromWord64ToWord8 val zchckToInt8 = IntWordConv.zchckFromWord8ToInt8 val zchckToInt16 = IntWordConv.zchckFromWord8ToInt16 val zchckToInt32 = IntWordConv.zchckFromWord8ToInt32 val zchckToInt64 = IntWordConv.zchckFromWord8ToInt64 val zchckToWord8 = IntWordConv.zchckFromWord8ToWord8 val zchckToWord16 = IntWordConv.zchckFromWord8ToWord16 val zchckToWord32 = IntWordConv.zchckFromWord8ToWord32 val zchckToWord64 = IntWordConv.zchckFromWord8ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToWord8 val schckFromInt16 = IntWordConv.schckFromInt16ToWord8 val schckFromInt32 = IntWordConv.schckFromInt32ToWord8 val schckFromInt64 = IntWordConv.schckFromInt64ToWord8 val schckFromWord8 = IntWordConv.schckFromWord8ToWord8 val schckFromWord16 = IntWordConv.schckFromWord16ToWord8 val schckFromWord32 = IntWordConv.schckFromWord32ToWord8 val schckFromWord64 = IntWordConv.schckFromWord64ToWord8 val schckToInt8 = IntWordConv.schckFromWord8ToInt8 val schckToInt16 = IntWordConv.schckFromWord8ToInt16 val schckToInt32 = IntWordConv.schckFromWord8ToInt32 val schckToInt64 = IntWordConv.schckFromWord8ToInt64 val schckToWord8 = IntWordConv.schckFromWord8ToWord8 val schckToWord16 = IntWordConv.schckFromWord8ToWord16 val schckToWord32 = IntWordConv.schckFromWord8ToWord32 val schckToWord64 = IntWordConv.schckFromWord8ToWord64 end structure Word16 : PRIM_WORD = struct open Word16 val zextdFromInt8 = IntWordConv.zextdFromInt8ToWord16 val zextdFromInt16 = IntWordConv.zextdFromInt16ToWord16 val zextdFromInt32 = IntWordConv.zextdFromInt32ToWord16 val zextdFromInt64 = IntWordConv.zextdFromInt64ToWord16 val zextdFromWord8 = IntWordConv.zextdFromWord8ToWord16 val zextdFromWord16 = IntWordConv.zextdFromWord16ToWord16 val zextdFromWord32 = IntWordConv.zextdFromWord32ToWord16 val zextdFromWord64 = IntWordConv.zextdFromWord64ToWord16 val zextdToInt8 = IntWordConv.zextdFromWord16ToInt8 val zextdToInt16 = IntWordConv.zextdFromWord16ToInt16 val zextdToInt32 = IntWordConv.zextdFromWord16ToInt32 val zextdToInt64 = IntWordConv.zextdFromWord16ToInt64 val zextdToWord8 = IntWordConv.zextdFromWord16ToWord8 val zextdToWord16 = IntWordConv.zextdFromWord16ToWord16 val zextdToWord32 = IntWordConv.zextdFromWord16ToWord32 val zextdToWord64 = IntWordConv.zextdFromWord16ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToWord16 val sextdFromInt16 = IntWordConv.sextdFromInt16ToWord16 val sextdFromInt32 = IntWordConv.sextdFromInt32ToWord16 val sextdFromInt64 = IntWordConv.sextdFromInt64ToWord16 val sextdFromWord8 = IntWordConv.sextdFromWord8ToWord16 val sextdFromWord16 = IntWordConv.sextdFromWord16ToWord16 val sextdFromWord32 = IntWordConv.sextdFromWord32ToWord16 val sextdFromWord64 = IntWordConv.sextdFromWord64ToWord16 val sextdToInt8 = IntWordConv.sextdFromWord16ToInt8 val sextdToInt16 = IntWordConv.sextdFromWord16ToInt16 val sextdToInt32 = IntWordConv.sextdFromWord16ToInt32 val sextdToInt64 = IntWordConv.sextdFromWord16ToInt64 val sextdToWord8 = IntWordConv.sextdFromWord16ToWord8 val sextdToWord16 = IntWordConv.sextdFromWord16ToWord16 val sextdToWord32 = IntWordConv.sextdFromWord16ToWord32 val sextdToWord64 = IntWordConv.sextdFromWord16ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToWord16 val castFromInt16 = IntWordConv.castFromInt16ToWord16 val castFromInt32 = IntWordConv.castFromInt32ToWord16 val castFromInt64 = IntWordConv.castFromInt64ToWord16 val castFromWord8 = IntWordConv.castFromWord8ToWord16 val castFromWord16 = IntWordConv.castFromWord16ToWord16 val castFromWord32 = IntWordConv.castFromWord32ToWord16 val castFromWord64 = IntWordConv.castFromWord64ToWord16 val castToInt8 = IntWordConv.castFromWord16ToInt8 val castToInt16 = IntWordConv.castFromWord16ToInt16 val castToInt32 = IntWordConv.castFromWord16ToInt32 val castToInt64 = IntWordConv.castFromWord16ToInt64 val castToWord8 = IntWordConv.castFromWord16ToWord8 val castToWord16 = IntWordConv.castFromWord16ToWord16 val castToWord32 = IntWordConv.castFromWord16ToWord32 val castToWord64 = IntWordConv.castFromWord16ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToWord16 val zchckFromInt16 = IntWordConv.zchckFromInt16ToWord16 val zchckFromInt32 = IntWordConv.zchckFromInt32ToWord16 val zchckFromInt64 = IntWordConv.zchckFromInt64ToWord16 val zchckFromWord8 = IntWordConv.zchckFromWord8ToWord16 val zchckFromWord16 = IntWordConv.zchckFromWord16ToWord16 val zchckFromWord32 = IntWordConv.zchckFromWord32ToWord16 val zchckFromWord64 = IntWordConv.zchckFromWord64ToWord16 val zchckToInt8 = IntWordConv.zchckFromWord16ToInt8 val zchckToInt16 = IntWordConv.zchckFromWord16ToInt16 val zchckToInt32 = IntWordConv.zchckFromWord16ToInt32 val zchckToInt64 = IntWordConv.zchckFromWord16ToInt64 val zchckToWord8 = IntWordConv.zchckFromWord16ToWord8 val zchckToWord16 = IntWordConv.zchckFromWord16ToWord16 val zchckToWord32 = IntWordConv.zchckFromWord16ToWord32 val zchckToWord64 = IntWordConv.zchckFromWord16ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToWord16 val schckFromInt16 = IntWordConv.schckFromInt16ToWord16 val schckFromInt32 = IntWordConv.schckFromInt32ToWord16 val schckFromInt64 = IntWordConv.schckFromInt64ToWord16 val schckFromWord8 = IntWordConv.schckFromWord8ToWord16 val schckFromWord16 = IntWordConv.schckFromWord16ToWord16 val schckFromWord32 = IntWordConv.schckFromWord32ToWord16 val schckFromWord64 = IntWordConv.schckFromWord64ToWord16 val schckToInt8 = IntWordConv.schckFromWord16ToInt8 val schckToInt16 = IntWordConv.schckFromWord16ToInt16 val schckToInt32 = IntWordConv.schckFromWord16ToInt32 val schckToInt64 = IntWordConv.schckFromWord16ToInt64 val schckToWord8 = IntWordConv.schckFromWord16ToWord8 val schckToWord16 = IntWordConv.schckFromWord16ToWord16 val schckToWord32 = IntWordConv.schckFromWord16ToWord32 val schckToWord64 = IntWordConv.schckFromWord16ToWord64 end structure Word32 : PRIM_WORD = struct open Word32 val zextdFromInt8 = IntWordConv.zextdFromInt8ToWord32 val zextdFromInt16 = IntWordConv.zextdFromInt16ToWord32 val zextdFromInt32 = IntWordConv.zextdFromInt32ToWord32 val zextdFromInt64 = IntWordConv.zextdFromInt64ToWord32 val zextdFromWord8 = IntWordConv.zextdFromWord8ToWord32 val zextdFromWord16 = IntWordConv.zextdFromWord16ToWord32 val zextdFromWord32 = IntWordConv.zextdFromWord32ToWord32 val zextdFromWord64 = IntWordConv.zextdFromWord64ToWord32 val zextdToInt8 = IntWordConv.zextdFromWord32ToInt8 val zextdToInt16 = IntWordConv.zextdFromWord32ToInt16 val zextdToInt32 = IntWordConv.zextdFromWord32ToInt32 val zextdToInt64 = IntWordConv.zextdFromWord32ToInt64 val zextdToWord8 = IntWordConv.zextdFromWord32ToWord8 val zextdToWord16 = IntWordConv.zextdFromWord32ToWord16 val zextdToWord32 = IntWordConv.zextdFromWord32ToWord32 val zextdToWord64 = IntWordConv.zextdFromWord32ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToWord32 val sextdFromInt16 = IntWordConv.sextdFromInt16ToWord32 val sextdFromInt32 = IntWordConv.sextdFromInt32ToWord32 val sextdFromInt64 = IntWordConv.sextdFromInt64ToWord32 val sextdFromWord8 = IntWordConv.sextdFromWord8ToWord32 val sextdFromWord16 = IntWordConv.sextdFromWord16ToWord32 val sextdFromWord32 = IntWordConv.sextdFromWord32ToWord32 val sextdFromWord64 = IntWordConv.sextdFromWord64ToWord32 val sextdToInt8 = IntWordConv.sextdFromWord32ToInt8 val sextdToInt16 = IntWordConv.sextdFromWord32ToInt16 val sextdToInt32 = IntWordConv.sextdFromWord32ToInt32 val sextdToInt64 = IntWordConv.sextdFromWord32ToInt64 val sextdToWord8 = IntWordConv.sextdFromWord32ToWord8 val sextdToWord16 = IntWordConv.sextdFromWord32ToWord16 val sextdToWord32 = IntWordConv.sextdFromWord32ToWord32 val sextdToWord64 = IntWordConv.sextdFromWord32ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToWord32 val castFromInt16 = IntWordConv.castFromInt16ToWord32 val castFromInt32 = IntWordConv.castFromInt32ToWord32 val castFromInt64 = IntWordConv.castFromInt64ToWord32 val castFromWord8 = IntWordConv.castFromWord8ToWord32 val castFromWord16 = IntWordConv.castFromWord16ToWord32 val castFromWord32 = IntWordConv.castFromWord32ToWord32 val castFromWord64 = IntWordConv.castFromWord64ToWord32 val castToInt8 = IntWordConv.castFromWord32ToInt8 val castToInt16 = IntWordConv.castFromWord32ToInt16 val castToInt32 = IntWordConv.castFromWord32ToInt32 val castToInt64 = IntWordConv.castFromWord32ToInt64 val castToWord8 = IntWordConv.castFromWord32ToWord8 val castToWord16 = IntWordConv.castFromWord32ToWord16 val castToWord32 = IntWordConv.castFromWord32ToWord32 val castToWord64 = IntWordConv.castFromWord32ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToWord32 val zchckFromInt16 = IntWordConv.zchckFromInt16ToWord32 val zchckFromInt32 = IntWordConv.zchckFromInt32ToWord32 val zchckFromInt64 = IntWordConv.zchckFromInt64ToWord32 val zchckFromWord8 = IntWordConv.zchckFromWord8ToWord32 val zchckFromWord16 = IntWordConv.zchckFromWord16ToWord32 val zchckFromWord32 = IntWordConv.zchckFromWord32ToWord32 val zchckFromWord64 = IntWordConv.zchckFromWord64ToWord32 val zchckToInt8 = IntWordConv.zchckFromWord32ToInt8 val zchckToInt16 = IntWordConv.zchckFromWord32ToInt16 val zchckToInt32 = IntWordConv.zchckFromWord32ToInt32 val zchckToInt64 = IntWordConv.zchckFromWord32ToInt64 val zchckToWord8 = IntWordConv.zchckFromWord32ToWord8 val zchckToWord16 = IntWordConv.zchckFromWord32ToWord16 val zchckToWord32 = IntWordConv.zchckFromWord32ToWord32 val zchckToWord64 = IntWordConv.zchckFromWord32ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToWord32 val schckFromInt16 = IntWordConv.schckFromInt16ToWord32 val schckFromInt32 = IntWordConv.schckFromInt32ToWord32 val schckFromInt64 = IntWordConv.schckFromInt64ToWord32 val schckFromWord8 = IntWordConv.schckFromWord8ToWord32 val schckFromWord16 = IntWordConv.schckFromWord16ToWord32 val schckFromWord32 = IntWordConv.schckFromWord32ToWord32 val schckFromWord64 = IntWordConv.schckFromWord64ToWord32 val schckToInt8 = IntWordConv.schckFromWord32ToInt8 val schckToInt16 = IntWordConv.schckFromWord32ToInt16 val schckToInt32 = IntWordConv.schckFromWord32ToInt32 val schckToInt64 = IntWordConv.schckFromWord32ToInt64 val schckToWord8 = IntWordConv.schckFromWord32ToWord8 val schckToWord16 = IntWordConv.schckFromWord32ToWord16 val schckToWord32 = IntWordConv.schckFromWord32ToWord32 val schckToWord64 = IntWordConv.schckFromWord32ToWord64 end structure Word64 : PRIM_WORD = struct open Word64 val zextdFromInt8 = IntWordConv.zextdFromInt8ToWord64 val zextdFromInt16 = IntWordConv.zextdFromInt16ToWord64 val zextdFromInt32 = IntWordConv.zextdFromInt32ToWord64 val zextdFromInt64 = IntWordConv.zextdFromInt64ToWord64 val zextdFromWord8 = IntWordConv.zextdFromWord8ToWord64 val zextdFromWord16 = IntWordConv.zextdFromWord16ToWord64 val zextdFromWord32 = IntWordConv.zextdFromWord32ToWord64 val zextdFromWord64 = IntWordConv.zextdFromWord64ToWord64 val zextdToInt8 = IntWordConv.zextdFromWord64ToInt8 val zextdToInt16 = IntWordConv.zextdFromWord64ToInt16 val zextdToInt32 = IntWordConv.zextdFromWord64ToInt32 val zextdToInt64 = IntWordConv.zextdFromWord64ToInt64 val zextdToWord8 = IntWordConv.zextdFromWord64ToWord8 val zextdToWord16 = IntWordConv.zextdFromWord64ToWord16 val zextdToWord32 = IntWordConv.zextdFromWord64ToWord32 val zextdToWord64 = IntWordConv.zextdFromWord64ToWord64 val sextdFromInt8 = IntWordConv.sextdFromInt8ToWord64 val sextdFromInt16 = IntWordConv.sextdFromInt16ToWord64 val sextdFromInt32 = IntWordConv.sextdFromInt32ToWord64 val sextdFromInt64 = IntWordConv.sextdFromInt64ToWord64 val sextdFromWord8 = IntWordConv.sextdFromWord8ToWord64 val sextdFromWord16 = IntWordConv.sextdFromWord16ToWord64 val sextdFromWord32 = IntWordConv.sextdFromWord32ToWord64 val sextdFromWord64 = IntWordConv.sextdFromWord64ToWord64 val sextdToInt8 = IntWordConv.sextdFromWord64ToInt8 val sextdToInt16 = IntWordConv.sextdFromWord64ToInt16 val sextdToInt32 = IntWordConv.sextdFromWord64ToInt32 val sextdToInt64 = IntWordConv.sextdFromWord64ToInt64 val sextdToWord8 = IntWordConv.sextdFromWord64ToWord8 val sextdToWord16 = IntWordConv.sextdFromWord64ToWord16 val sextdToWord32 = IntWordConv.sextdFromWord64ToWord32 val sextdToWord64 = IntWordConv.sextdFromWord64ToWord64 val castFromInt8 = IntWordConv.castFromInt8ToWord64 val castFromInt16 = IntWordConv.castFromInt16ToWord64 val castFromInt32 = IntWordConv.castFromInt32ToWord64 val castFromInt64 = IntWordConv.castFromInt64ToWord64 val castFromWord8 = IntWordConv.castFromWord8ToWord64 val castFromWord16 = IntWordConv.castFromWord16ToWord64 val castFromWord32 = IntWordConv.castFromWord32ToWord64 val castFromWord64 = IntWordConv.castFromWord64ToWord64 val castToInt8 = IntWordConv.castFromWord64ToInt8 val castToInt16 = IntWordConv.castFromWord64ToInt16 val castToInt32 = IntWordConv.castFromWord64ToInt32 val castToInt64 = IntWordConv.castFromWord64ToInt64 val castToWord8 = IntWordConv.castFromWord64ToWord8 val castToWord16 = IntWordConv.castFromWord64ToWord16 val castToWord32 = IntWordConv.castFromWord64ToWord32 val castToWord64 = IntWordConv.castFromWord64ToWord64 val zchckFromInt8 = IntWordConv.zchckFromInt8ToWord64 val zchckFromInt16 = IntWordConv.zchckFromInt16ToWord64 val zchckFromInt32 = IntWordConv.zchckFromInt32ToWord64 val zchckFromInt64 = IntWordConv.zchckFromInt64ToWord64 val zchckFromWord8 = IntWordConv.zchckFromWord8ToWord64 val zchckFromWord16 = IntWordConv.zchckFromWord16ToWord64 val zchckFromWord32 = IntWordConv.zchckFromWord32ToWord64 val zchckFromWord64 = IntWordConv.zchckFromWord64ToWord64 val zchckToInt8 = IntWordConv.zchckFromWord64ToInt8 val zchckToInt16 = IntWordConv.zchckFromWord64ToInt16 val zchckToInt32 = IntWordConv.zchckFromWord64ToInt32 val zchckToInt64 = IntWordConv.zchckFromWord64ToInt64 val zchckToWord8 = IntWordConv.zchckFromWord64ToWord8 val zchckToWord16 = IntWordConv.zchckFromWord64ToWord16 val zchckToWord32 = IntWordConv.zchckFromWord64ToWord32 val zchckToWord64 = IntWordConv.zchckFromWord64ToWord64 val schckFromInt8 = IntWordConv.schckFromInt8ToWord64 val schckFromInt16 = IntWordConv.schckFromInt16ToWord64 val schckFromInt32 = IntWordConv.schckFromInt32ToWord64 val schckFromInt64 = IntWordConv.schckFromInt64ToWord64 val schckFromWord8 = IntWordConv.schckFromWord8ToWord64 val schckFromWord16 = IntWordConv.schckFromWord16ToWord64 val schckFromWord32 = IntWordConv.schckFromWord32ToWord64 val schckFromWord64 = IntWordConv.schckFromWord64ToWord64 val schckToInt8 = IntWordConv.schckFromWord64ToInt8 val schckToInt16 = IntWordConv.schckFromWord64ToInt16 val schckToInt32 = IntWordConv.schckFromWord64ToInt32 val schckToInt64 = IntWordConv.schckFromWord64ToInt64 val schckToWord8 = IntWordConv.schckFromWord64ToWord8 val schckToWord16 = IntWordConv.schckFromWord64ToWord16 val schckToWord32 = IntWordConv.schckFromWord64ToWord32 val schckToWord64 = IntWordConv.schckFromWord64ToWord64 end end mlton-20100608/basis-library/integer/num0.sml0000644000076600000240000002331211404435632017356 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MKNUM0_ARG = sig structure Int: PRIM_INTEGER structure Word: PRIM_WORD val idFromIntToWord: Int.int -> Word.word val idFromWordToInt: Word.word -> Int.int end signature PRIM_INTEGER = sig include PRIM_INTEGER val maxInt': int val minInt': int val maxInt: int option val minInt: int option val zero: int val one: int val abs: int -> int val div: int * int -> int val mod: int * int -> int val quot: int * int -> int val rem: int * int -> int val ltu: int * int -> bool val leu: int * int -> bool val gtu: int * int -> bool val geu: int * int -> bool val andb : int * int -> int val < int val notb : int -> int val orb : int * int -> int val rolUnsafe : int * Primitive.Word32.word -> int val rorUnsafe : int * Primitive.Word32.word -> int val ~>>? : int * Primitive.Word32.word -> int val >>? : int * Primitive.Word32.word -> int val xorb : int * int -> int val power: {base:int, exp: int} -> int val log2: int -> Primitive.Int32.int val log2Word: int -> Primitive.Word32.word end signature PRIM_WORD = sig include PRIM_WORD val zero: word val one: word val maxWord': word val div: word * word -> word val mod: word * word -> word val log2: word -> Primitive.Int32.int val log2Word: word -> Primitive.Word32.word end functor MkNum0 (S: MKNUM0_ARG): sig structure Int: PRIM_INTEGER structure Word: PRIM_WORD end = struct open S val _ = if Int.sizeInBits <> Word.sizeInBits orelse Int.sizeInBitsWord <> Word.sizeInBitsWord then raise Primitive.Exn.Fail8 "MkNum0: Int.sizeInBits <> Word.sizeInBits" else () structure Word = struct open Word val zero = zextdFromWord32 0w0 val one = zextdFromWord32 0w1 val maxWord' = notb zero local fun make f (w, w') = if Primitive.Controls.safe andalso w' = zero then raise Div else f (w, w') in val op div = make (op quotUnsafe) val op mod = make (op remUnsafe) end fun log2Word w = let fun loop (n, s, acc) = if n = one then acc else let val (n, acc) = if n >= <>? (n, s), Primitive.Word32.+ (acc, s)) else (n, acc) in loop (n, Primitive.Word32.>>? (s, 0w1), acc) end in if Primitive.Controls.safe andalso w = zero then raise Domain else loop (w, Primitive.Word32.>>? (sizeInBitsWord, 0w1), 0w0) end fun log2 w = Primitive.IntWordConv.zextdFromWord32ToInt32 (log2Word w) end structure Int = struct open Int val zero = zextdFromInt32 0 val one = zextdFromInt32 1 local fun makeBinop f = fn (x: int, y: int) => idFromWordToInt (f (idFromIntToWord x, idFromIntToWord y)) fun makeUnop f = fn (x: int) => idFromWordToInt (f (idFromIntToWord x)) fun makeShop f = fn (x: int, w: Primitive.Word32.word) => idFromWordToInt (f (idFromIntToWord x, w)) in val andb = makeBinop Word.andb val <>? = makeShop Word.~>>? val >>? = makeShop Word.>>? val xorb = makeBinop Word.xorb end fun log2 i = Word.log2 (idFromIntToWord i) fun log2Word i = Word.log2Word (idFromIntToWord i) val minInt' = <>? (notb zero, 0w1) val minInt = SOME minInt' val maxInt = SOME maxInt' fun abs (x: int) = if x < zero then ~ x else x fun quot (x, y) = if Primitive.Controls.safe andalso y = zero then raise Div else if (Primitive.Controls.detectOverflow orelse Primitive.Controls.safe) andalso x = minInt' andalso y = ~one then if Primitive.Controls.detectOverflow then raise Overflow else minInt' else quotUnsafe (x, y) fun rem (x, y) = if Primitive.Controls.safe andalso y = zero then raise Div else if x = minInt' andalso y = ~one then zero else remUnsafe (x, y) fun x div y = if x >= zero then if y > zero then quotUnsafe (x, y) else if y < zero then if x = zero then zero else quotUnsafe (x -? one, y) -? one else raise Div else if y < zero then if (Primitive.Controls.detectOverflow orelse Primitive.Controls.safe) andalso x = minInt' andalso y = ~one then if Primitive.Controls.detectOverflow then raise Overflow else minInt' else quotUnsafe (x, y) else if y > zero then quotUnsafe (x +? one, y) -? one else raise Div fun x mod y = if x >= zero then if y > zero then remUnsafe (x, y) else if y < zero then if x = zero then zero else remUnsafe (x -? one, y) +? (y + one) else raise Div else if y < zero then if x = minInt' andalso y = ~one then zero else remUnsafe (x, y) else if y > zero then remUnsafe (x +? one, y) +? (y -? one) else raise Div local structure S = UnsignedIntegralComparisons (type int = int type word = Word.word val idFromIntToWord = idFromIntToWord val op < = Word.<) in open S end fun power {base, exp} = if Primitive.Controls.safe andalso exp < zero then raise Primitive.Exn.Fail8 "Int.power" else let fun loop (exp, accum) = if exp <= zero then accum else loop (exp - one, base * accum) in loop (exp, one) end end end structure Primitive = struct open Primitive local structure S = MkNum0 (structure Int = Int8 structure Word = Word8 val idFromIntToWord = IntWordConv.idFromInt8ToWord8 val idFromWordToInt = IntWordConv.idFromWord8ToInt8) in structure Int8 : PRIM_INTEGER = S.Int structure Word8 : PRIM_WORD = S.Word end local structure S = MkNum0 (structure Int = Int16 structure Word = Word16 val idFromIntToWord = IntWordConv.idFromInt16ToWord16 val idFromWordToInt = IntWordConv.idFromWord16ToInt16) in structure Int16 : PRIM_INTEGER = S.Int structure Word16 : PRIM_WORD = S.Word end local structure S = MkNum0 (structure Int = Int32 structure Word = Word32 val idFromIntToWord = IntWordConv.idFromInt32ToWord32 val idFromWordToInt = IntWordConv.idFromWord32ToInt32) in structure Int32 : PRIM_INTEGER = S.Int structure Word32 : PRIM_WORD = S.Word end local structure S = MkNum0 (structure Int = Int64 structure Word = Word64 val idFromIntToWord = IntWordConv.idFromInt64ToWord64 val idFromWordToInt = IntWordConv.idFromWord64ToInt64) in structure Int64 : PRIM_INTEGER = S.Int structure Word64 : PRIM_WORD = S.Word end end mlton-20100608/basis-library/integer/num1.sml0000644000076600000240000007435011404435632017367 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MKNUM1_ARG = sig type num val zextdFromInt8: Primitive.Int8.int -> num val zextdFromInt16: Primitive.Int16.int -> num val zextdFromInt32: Primitive.Int32.int -> num val zextdFromInt64: Primitive.Int64.int -> num val zextdFromIntInf: Primitive.IntInf.int -> num val zextdFromWord8: Primitive.Word8.word -> num val zextdFromWord16: Primitive.Word16.word -> num val zextdFromWord32: Primitive.Word32.word -> num val zextdFromWord64: Primitive.Word64.word -> num val zextdToInt8: num -> Primitive.Int8.int val zextdToInt16: num -> Primitive.Int16.int val zextdToInt32: num -> Primitive.Int32.int val zextdToInt64: num -> Primitive.Int64.int val zextdToIntInf: num -> Primitive.IntInf.int val zextdToWord8: num -> Primitive.Word8.word val zextdToWord16: num -> Primitive.Word16.word val zextdToWord32: num -> Primitive.Word32.word val zextdToWord64: num -> Primitive.Word64.word val sextdFromInt8: Primitive.Int8.int -> num val sextdFromInt16: Primitive.Int16.int -> num val sextdFromInt32: Primitive.Int32.int -> num val sextdFromInt64: Primitive.Int64.int -> num val sextdFromIntInf: Primitive.IntInf.int -> num val sextdFromWord8: Primitive.Word8.word -> num val sextdFromWord16: Primitive.Word16.word -> num val sextdFromWord32: Primitive.Word32.word -> num val sextdFromWord64: Primitive.Word64.word -> num val sextdToInt8: num -> Primitive.Int8.int val sextdToInt16: num -> Primitive.Int16.int val sextdToInt32: num -> Primitive.Int32.int val sextdToInt64: num -> Primitive.Int64.int val sextdToIntInf: num -> Primitive.IntInf.int val sextdToWord8: num -> Primitive.Word8.word val sextdToWord16: num -> Primitive.Word16.word val sextdToWord32: num -> Primitive.Word32.word val sextdToWord64: num -> Primitive.Word64.word val castFromInt8: Primitive.Int8.int -> num val castFromInt16: Primitive.Int16.int -> num val castFromInt32: Primitive.Int32.int -> num val castFromInt64: Primitive.Int64.int -> num val castFromIntInf: Primitive.IntInf.int -> num val castFromWord8: Primitive.Word8.word -> num val castFromWord16: Primitive.Word16.word -> num val castFromWord32: Primitive.Word32.word -> num val castFromWord64: Primitive.Word64.word -> num val castToInt8: num -> Primitive.Int8.int val castToInt16: num -> Primitive.Int16.int val castToInt32: num -> Primitive.Int32.int val castToInt64: num -> Primitive.Int64.int val castToIntInf: num -> Primitive.IntInf.int val castToWord8: num -> Primitive.Word8.word val castToWord16: num -> Primitive.Word16.word val castToWord32: num -> Primitive.Word32.word val castToWord64: num -> Primitive.Word64.word val zchckFromInt8: Primitive.Int8.int -> num val zchckFromInt16: Primitive.Int16.int -> num val zchckFromInt32: Primitive.Int32.int -> num val zchckFromInt64: Primitive.Int64.int -> num val zchckFromIntInf: Primitive.IntInf.int -> num val zchckFromWord8: Primitive.Word8.word -> num val zchckFromWord16: Primitive.Word16.word -> num val zchckFromWord32: Primitive.Word32.word -> num val zchckFromWord64: Primitive.Word64.word -> num val zchckToInt8: num -> Primitive.Int8.int val zchckToInt16: num -> Primitive.Int16.int val zchckToInt32: num -> Primitive.Int32.int val zchckToInt64: num -> Primitive.Int64.int val zchckToIntInf: num -> Primitive.IntInf.int val zchckToWord8: num -> Primitive.Word8.word val zchckToWord16: num -> Primitive.Word16.word val zchckToWord32: num -> Primitive.Word32.word val zchckToWord64: num -> Primitive.Word64.word val schckFromInt8: Primitive.Int8.int -> num val schckFromInt16: Primitive.Int16.int -> num val schckFromInt32: Primitive.Int32.int -> num val schckFromInt64: Primitive.Int64.int -> num val schckFromIntInf: Primitive.IntInf.int -> num val schckFromWord8: Primitive.Word8.word -> num val schckFromWord16: Primitive.Word16.word -> num val schckFromWord32: Primitive.Word32.word -> num val schckFromWord64: Primitive.Word64.word -> num val schckToInt8: num -> Primitive.Int8.int val schckToInt16: num -> Primitive.Int16.int val schckToInt32: num -> Primitive.Int32.int val schckToInt64: num -> Primitive.Int64.int val schckToIntInf: num -> Primitive.IntInf.int val schckToWord8: num -> Primitive.Word8.word val schckToWord16: num -> Primitive.Word16.word val schckToWord32: num -> Primitive.Word32.word val schckToWord64: num -> Primitive.Word64.word end signature MKNUM1_RES = sig type num val zextdFromInt: Int.int -> num val zextdToInt: num -> Int.int val sextdFromInt: Int.int -> num val sextdToInt: num -> Int.int val castFromInt: Int.int -> num val castToInt: num -> Int.int val zchckFromInt: Int.int -> num val zchckToInt: num -> Int.int val schckFromInt: Int.int -> num val schckToInt: num -> Int.int val zextdFromFixedInt: FixedInt.int -> num val zextdToFixedInt: num -> FixedInt.int val sextdFromFixedInt: FixedInt.int -> num val sextdToFixedInt: num -> FixedInt.int val castFromFixedInt: FixedInt.int -> num val castToFixedInt: num -> FixedInt.int val zchckFromFixedInt: FixedInt.int -> num val zchckToFixedInt: num -> FixedInt.int val schckFromFixedInt: FixedInt.int -> num val schckToFixedInt: num -> FixedInt.int val zextdFromLargeInt: LargeInt.int -> num val zextdToLargeInt: num -> LargeInt.int val sextdFromLargeInt: LargeInt.int -> num val sextdToLargeInt: num -> LargeInt.int val castFromLargeInt: LargeInt.int -> num val castToLargeInt: num -> LargeInt.int val zchckFromLargeInt: LargeInt.int -> num val zchckToLargeInt: num -> LargeInt.int val schckFromLargeInt: LargeInt.int -> num val schckToLargeInt: num -> LargeInt.int val zextdFromWord: Word.word -> num val zextdToWord: num -> Word.word val sextdFromWord: Word.word -> num val sextdToWord: num -> Word.word val castFromWord: Word.word -> num val castToWord: num -> Word.word val zchckFromWord: Word.word -> num val zchckToWord: num -> Word.word val schckFromWord: Word.word -> num val schckToWord: num -> Word.word val zextdFromLargeWord: LargeWord.word -> num val zextdToLargeWord: num -> LargeWord.word val sextdFromLargeWord: LargeWord.word -> num val sextdToLargeWord: num -> LargeWord.word val castFromLargeWord: LargeWord.word -> num val castToLargeWord: num -> LargeWord.word val zchckFromLargeWord: LargeWord.word -> num val zchckToLargeWord: num -> LargeWord.word val schckFromLargeWord: LargeWord.word -> num val schckToLargeWord: num -> LargeWord.word val zextdFromSysWord: SysWord.word -> num val zextdToSysWord: num -> SysWord.word val sextdFromSysWord: SysWord.word -> num val sextdToSysWord: num -> SysWord.word val castFromSysWord: SysWord.word -> num val castToSysWord: num -> SysWord.word val zchckFromSysWord: SysWord.word -> num val zchckToSysWord: num -> SysWord.word val schckFromSysWord: SysWord.word -> num val schckToSysWord: num -> SysWord.word end signature PRIM_INTEGER = sig include PRIM_INTEGER include MKNUM1_RES where type num = int end signature PRIM_WORD = sig include PRIM_WORD include MKNUM1_RES where type num = word end functor MkNum1 (I: MKNUM1_ARG) : MKNUM1_RES = struct open I local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.zextdFromInt8 val fInt16 = I.zextdFromInt16 val fInt32 = I.zextdFromInt32 val fInt64 = I.zextdFromInt64 val fIntInf = I.zextdFromIntInf) in val zextdFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.zextdToInt8 val fInt16 = I.zextdToInt16 val fInt32 = I.zextdToInt32 val fInt64 = I.zextdToInt64 val fIntInf = I.zextdToIntInf) in val zextdToInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.sextdFromInt8 val fInt16 = I.sextdFromInt16 val fInt32 = I.sextdFromInt32 val fInt64 = I.sextdFromInt64 val fIntInf = I.sextdFromIntInf) in val sextdFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.sextdToInt8 val fInt16 = I.sextdToInt16 val fInt32 = I.sextdToInt32 val fInt64 = I.sextdToInt64 val fIntInf = I.sextdToIntInf) in val sextdToInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.castFromInt8 val fInt16 = I.castFromInt16 val fInt32 = I.castFromInt32 val fInt64 = I.castFromInt64 val fIntInf = I.castFromIntInf) in val castFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.castToInt8 val fInt16 = I.castToInt16 val fInt32 = I.castToInt32 val fInt64 = I.castToInt64 val fIntInf = I.castToIntInf) in val castToInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.zchckFromInt8 val fInt16 = I.zchckFromInt16 val fInt32 = I.zchckFromInt32 val fInt64 = I.zchckFromInt64 val fIntInf = I.zchckFromIntInf) in val zchckFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.zchckToInt8 val fInt16 = I.zchckToInt16 val fInt32 = I.zchckToInt32 val fInt64 = I.zchckToInt64 val fIntInf = I.zchckToIntInf) in val zchckToInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> num val fInt8 = I.schckFromInt8 val fInt16 = I.schckFromInt16 val fInt32 = I.schckFromInt32 val fInt64 = I.schckFromInt64 val fIntInf = I.schckFromIntInf) in val schckFromInt = S.f end local structure S = Int_ChooseInt (type 'a t = num -> 'a val fInt8 = I.schckToInt8 val fInt16 = I.schckToInt16 val fInt32 = I.schckToInt32 val fInt64 = I.schckToInt64 val fIntInf = I.schckToIntInf) in val schckToInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.zextdFromInt8 val fInt16 = I.zextdFromInt16 val fInt32 = I.zextdFromInt32 val fInt64 = I.zextdFromInt64) in val zextdFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.zextdToInt8 val fInt16 = I.zextdToInt16 val fInt32 = I.zextdToInt32 val fInt64 = I.zextdToInt64) in val zextdToFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.sextdFromInt8 val fInt16 = I.sextdFromInt16 val fInt32 = I.sextdFromInt32 val fInt64 = I.sextdFromInt64) in val sextdFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.sextdToInt8 val fInt16 = I.sextdToInt16 val fInt32 = I.sextdToInt32 val fInt64 = I.sextdToInt64) in val sextdToFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.castFromInt8 val fInt16 = I.castFromInt16 val fInt32 = I.castFromInt32 val fInt64 = I.castFromInt64) in val castFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.castToInt8 val fInt16 = I.castToInt16 val fInt32 = I.castToInt32 val fInt64 = I.castToInt64) in val castToFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.zchckFromInt8 val fInt16 = I.zchckFromInt16 val fInt32 = I.zchckFromInt32 val fInt64 = I.zchckFromInt64) in val zchckFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.zchckToInt8 val fInt16 = I.zchckToInt16 val fInt32 = I.zchckToInt32 val fInt64 = I.zchckToInt64) in val zchckToFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = 'a -> num val fInt8 = I.schckFromInt8 val fInt16 = I.schckFromInt16 val fInt32 = I.schckFromInt32 val fInt64 = I.schckFromInt64) in val schckFromFixedInt = S.f end local structure S = FixedInt_ChooseIntN (type 'a t = num -> 'a val fInt8 = I.schckToInt8 val fInt16 = I.schckToInt16 val fInt32 = I.schckToInt32 val fInt64 = I.schckToInt64) in val schckToFixedInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.zextdFromInt8 val fInt16 = I.zextdFromInt16 val fInt32 = I.zextdFromInt32 val fInt64 = I.zextdFromInt64 val fIntInf = I.zextdFromIntInf) in val zextdFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.zextdToInt8 val fInt16 = I.zextdToInt16 val fInt32 = I.zextdToInt32 val fInt64 = I.zextdToInt64 val fIntInf = I.zextdToIntInf) in val zextdToLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.sextdFromInt8 val fInt16 = I.sextdFromInt16 val fInt32 = I.sextdFromInt32 val fInt64 = I.sextdFromInt64 val fIntInf = I.sextdFromIntInf) in val sextdFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.sextdToInt8 val fInt16 = I.sextdToInt16 val fInt32 = I.sextdToInt32 val fInt64 = I.sextdToInt64 val fIntInf = I.sextdToIntInf) in val sextdToLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.castFromInt8 val fInt16 = I.castFromInt16 val fInt32 = I.castFromInt32 val fInt64 = I.castFromInt64 val fIntInf = I.castFromIntInf) in val castFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.castToInt8 val fInt16 = I.castToInt16 val fInt32 = I.castToInt32 val fInt64 = I.castToInt64 val fIntInf = I.castToIntInf) in val castToLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.zchckFromInt8 val fInt16 = I.zchckFromInt16 val fInt32 = I.zchckFromInt32 val fInt64 = I.zchckFromInt64 val fIntInf = I.zchckFromIntInf) in val zchckFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.zchckToInt8 val fInt16 = I.zchckToInt16 val fInt32 = I.zchckToInt32 val fInt64 = I.zchckToInt64 val fIntInf = I.zchckToIntInf) in val zchckToLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> num val fInt8 = I.schckFromInt8 val fInt16 = I.schckFromInt16 val fInt32 = I.schckFromInt32 val fInt64 = I.schckFromInt64 val fIntInf = I.schckFromIntInf) in val schckFromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = num -> 'a val fInt8 = I.schckToInt8 val fInt16 = I.schckToInt16 val fInt32 = I.schckToInt32 val fInt64 = I.schckToInt64 val fIntInf = I.schckToIntInf) in val schckToLargeInt = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zextdFromWord8 val fWord16 = I.zextdFromWord16 val fWord32 = I.zextdFromWord32 val fWord64 = I.zextdFromWord64) in val zextdFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zextdToWord8 val fWord16 = I.zextdToWord16 val fWord32 = I.zextdToWord32 val fWord64 = I.zextdToWord64) in val zextdToWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.sextdFromWord8 val fWord16 = I.sextdFromWord16 val fWord32 = I.sextdFromWord32 val fWord64 = I.sextdFromWord64) in val sextdFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.sextdToWord8 val fWord16 = I.sextdToWord16 val fWord32 = I.sextdToWord32 val fWord64 = I.sextdToWord64) in val sextdToWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.castFromWord8 val fWord16 = I.castFromWord16 val fWord32 = I.castFromWord32 val fWord64 = I.castFromWord64) in val castFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.castToWord8 val fWord16 = I.castToWord16 val fWord32 = I.castToWord32 val fWord64 = I.castToWord64) in val castToWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zchckFromWord8 val fWord16 = I.zchckFromWord16 val fWord32 = I.zchckFromWord32 val fWord64 = I.zchckFromWord64) in val zchckFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zchckToWord8 val fWord16 = I.zchckToWord16 val fWord32 = I.zchckToWord32 val fWord64 = I.zchckToWord64) in val zchckToWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.schckFromWord8 val fWord16 = I.schckFromWord16 val fWord32 = I.schckFromWord32 val fWord64 = I.schckFromWord64) in val schckFromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.schckToWord8 val fWord16 = I.schckToWord16 val fWord32 = I.schckToWord32 val fWord64 = I.schckToWord64) in val schckToWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zextdFromWord8 val fWord16 = I.zextdFromWord16 val fWord32 = I.zextdFromWord32 val fWord64 = I.zextdFromWord64) in val zextdFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zextdToWord8 val fWord16 = I.zextdToWord16 val fWord32 = I.zextdToWord32 val fWord64 = I.zextdToWord64) in val zextdToLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.sextdFromWord8 val fWord16 = I.sextdFromWord16 val fWord32 = I.sextdFromWord32 val fWord64 = I.sextdFromWord64) in val sextdFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.sextdToWord8 val fWord16 = I.sextdToWord16 val fWord32 = I.sextdToWord32 val fWord64 = I.sextdToWord64) in val sextdToLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.castFromWord8 val fWord16 = I.castFromWord16 val fWord32 = I.castFromWord32 val fWord64 = I.castFromWord64) in val castFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.castToWord8 val fWord16 = I.castToWord16 val fWord32 = I.castToWord32 val fWord64 = I.castToWord64) in val castToLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zchckFromWord8 val fWord16 = I.zchckFromWord16 val fWord32 = I.zchckFromWord32 val fWord64 = I.zchckFromWord64) in val zchckFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zchckToWord8 val fWord16 = I.zchckToWord16 val fWord32 = I.zchckToWord32 val fWord64 = I.zchckToWord64) in val zchckToLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.schckFromWord8 val fWord16 = I.schckFromWord16 val fWord32 = I.schckFromWord32 val fWord64 = I.schckFromWord64) in val schckFromLargeWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.schckToWord8 val fWord16 = I.schckToWord16 val fWord32 = I.schckToWord32 val fWord64 = I.schckToWord64) in val schckToLargeWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zextdFromWord8 val fWord16 = I.zextdFromWord16 val fWord32 = I.zextdFromWord32 val fWord64 = I.zextdFromWord64) in val zextdFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zextdToWord8 val fWord16 = I.zextdToWord16 val fWord32 = I.zextdToWord32 val fWord64 = I.zextdToWord64) in val zextdToSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.sextdFromWord8 val fWord16 = I.sextdFromWord16 val fWord32 = I.sextdFromWord32 val fWord64 = I.sextdFromWord64) in val sextdFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.sextdToWord8 val fWord16 = I.sextdToWord16 val fWord32 = I.sextdToWord32 val fWord64 = I.sextdToWord64) in val sextdToSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.castFromWord8 val fWord16 = I.castFromWord16 val fWord32 = I.castFromWord32 val fWord64 = I.castFromWord64) in val castFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.castToWord8 val fWord16 = I.castToWord16 val fWord32 = I.castToWord32 val fWord64 = I.castToWord64) in val castToSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.zchckFromWord8 val fWord16 = I.zchckFromWord16 val fWord32 = I.zchckFromWord32 val fWord64 = I.zchckFromWord64) in val zchckFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.zchckToWord8 val fWord16 = I.zchckToWord16 val fWord32 = I.zchckToWord32 val fWord64 = I.zchckToWord64) in val zchckToSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> num val fWord8 = I.schckFromWord8 val fWord16 = I.schckFromWord16 val fWord32 = I.schckFromWord32 val fWord64 = I.schckFromWord64) in val schckFromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = num -> 'a val fWord8 = I.schckToWord8 val fWord16 = I.schckToWord16 val fWord32 = I.schckToWord32 val fWord64 = I.schckToWord64) in val schckToSysWord = S.f end end structure Primitive = struct open Primitive structure Int8 = struct open Int8 local structure S = MkNum1(struct open Int8 type num = int end) in open S end end structure Int16 = struct open Int16 local structure S = MkNum1(struct open Int16 type num = int end) in open S end end structure Int32 = struct open Int32 local structure S = MkNum1(struct open Int32 type num = int end) in open S end end structure Int64 = struct open Int64 local structure S = MkNum1(struct open Int64 type num = int end) in open S end end structure IntInf = struct open IntInf local structure S = MkNum1(struct open IntInf type num = int end) in open S end end structure Word8 = struct open Word8 local structure S = MkNum1(struct open Word8 type num = word end) in open S end end structure Word16 = struct open Word16 local structure S = MkNum1(struct open Word16 type num = word end) in open S end end structure Word32 = struct open Word32 local structure S = MkNum1(struct open Word32 type num = word end) in open S end end structure Word64 : PRIM_WORD = struct open Word64 local structure S = MkNum1(struct open Word64 type num = word end) in open S end end end mlton-20100608/basis-library/integer/pack-word.sig0000644000076600000240000000145711404435632020363 0ustar mtfstaffsignature PACK_WORD = sig val bytesPerElem: int val isBigEndian: bool val subArr: Word8Array.array * int -> LargeWord.word val subArrX: Word8Array.array * int -> LargeWord.word val subVec: Word8Vector.vector * int -> LargeWord.word val subVecX: Word8Vector.vector * int -> LargeWord.word val update: Word8Array.array * int * LargeWord.word -> unit end signature PACK_WORD_EXTRA = sig include PACK_WORD val unsafeSubArr: Word8Array.array * int -> LargeWord.word val unsafeSubArrX: Word8Array.array * int -> LargeWord.word val unsafeSubVec: Word8Vector.vector * int -> LargeWord.word val unsafeSubVecX: Word8Vector.vector * int -> LargeWord.word val unsafeUpdate: Word8Array.array * int * LargeWord.word -> unit end mlton-20100608/basis-library/integer/pack-word.sml0000644000076600000240000002025211404435632020366 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PackWord (S: sig type word val wordSize: int val isBigEndian: bool val subArr: Word8.word array * SeqIndex.int -> word val subVec: Word8.word vector * SeqIndex.int -> word val update: Word8.word array * SeqIndex.int * word -> unit val bswap: word -> word val toLarge: word -> LargeWord.word val toLargeX: word -> LargeWord.word val fromLarge: LargeWord.word -> word end): PACK_WORD_EXTRA = struct open S val bytesPerElem = Int.div (wordSize, 8) fun offset (i, n) = let val () = if Primitive.Controls.safe andalso (Int.geu (Int.+ (Int.* (bytesPerElem, i), Int.- (bytesPerElem, 1)), n)) then raise Subscript else () in SeqIndex.fromInt i end handle Overflow => raise Subscript val subArrRev = bswap o subArr val subVecRev = bswap o subVec fun updateRev (a, i, w) = update (a, i, bswap w) val (subA, subV, updA) = if isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian then (subArr, subVec, update) else (subArrRev, subVecRev, updateRev) fun unsafeUpdate (a, i, w) = let val i = SeqIndex.fromInt i val a = Word8Array.toPoly a in updA (a, i, fromLarge w) end fun update (a, i, w) = let val i = offset (i, Word8Array.length a) val a = Word8Array.toPoly a in updA (a, i, fromLarge w) end local fun make (sub, length, toPoly) (av, i) = let val i = offset (i, length av) in sub (toPoly av, i) end in val subArr = toLarge o (make (subA, Word8Array.length, Word8Array.toPoly)) val subArrX = toLargeX o (make (subA, Word8Array.length, Word8Array.toPoly)) val subVec = toLarge o (make (subV, Word8Vector.length, Word8Vector.toPoly)) val subVecX = toLargeX o (make (subV, Word8Vector.length, Word8Vector.toPoly)) end local fun make (sub, length, toPoly) (av, i) = let val i = SeqIndex.fromInt i in sub (toPoly av, i) end in val unsafeSubArr = toLarge o (make (subA, Word8Array.length, Word8Array.toPoly)) val unsafeSubArrX = toLargeX o (make (subA, Word8Array.length, Word8Array.toPoly)) val unsafeSubVec = toLarge o (make (subV, Word8Vector.length, Word8Vector.toPoly)) val unsafeSubVecX = toLargeX o (make (subV, Word8Vector.length, Word8Vector.toPoly)) end end structure PackWord8Big: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open Primitive.PackWord8 open Word8) structure PackWord8Little: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open Primitive.PackWord8 open Word8) structure PackWord8Host: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open Primitive.PackWord8 open Word8) structure PackWord16Big: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open Primitive.PackWord16 open Word16) structure PackWord16Little: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open Primitive.PackWord16 open Word16) structure PackWord16Host: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open Primitive.PackWord16 open Word16) structure PackWord32Big: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open Primitive.PackWord32 open Word32) structure PackWord32Little: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open Primitive.PackWord32 open Word32) structure PackWord32Host: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open Primitive.PackWord32 open Word32) structure PackWord64Big: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open Primitive.PackWord64 open Word64) structure PackWord64Little: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open Primitive.PackWord64 open Word64) structure PackWord64Host: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open Primitive.PackWord64 open Word64) local structure PackWord = struct local structure S = Word_ChooseWordN (type 'a t = Word8.word array * SeqIndex.t -> 'a val fWord8 = Primitive.PackWord8.subArr val fWord16 = Primitive.PackWord16.subArr val fWord32 = Primitive.PackWord32.subArr val fWord64 = Primitive.PackWord64.subArr) in val subArr = S.f end local structure S = Word_ChooseWordN (type 'a t = Word8.word vector * SeqIndex.t -> 'a val fWord8 = Primitive.PackWord8.subVec val fWord16 = Primitive.PackWord16.subVec val fWord32 = Primitive.PackWord32.subVec val fWord64 = Primitive.PackWord64.subVec) in val subVec = S.f end local structure S = Word_ChooseWordN (type 'a t = Word8.word array * SeqIndex.t * 'a -> unit val fWord8 = Primitive.PackWord8.update val fWord16 = Primitive.PackWord16.update val fWord32 = Primitive.PackWord32.update val fWord64 = Primitive.PackWord64.update) in val update = S.f end end in structure PackWordBig: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open PackWord open Word) structure PackWordLittle: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open PackWord open Word) structure PackWordHost: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open PackWord open Word) end local structure PackLargeWord = struct local structure S = LargeWord_ChooseWordN (type 'a t = Word8.word array * SeqIndex.t -> 'a val fWord8 = Primitive.PackWord8.subArr val fWord16 = Primitive.PackWord16.subArr val fWord32 = Primitive.PackWord32.subArr val fWord64 = Primitive.PackWord64.subArr) in val subArr = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = Word8.word vector * SeqIndex.t -> 'a val fWord8 = Primitive.PackWord8.subVec val fWord16 = Primitive.PackWord16.subVec val fWord32 = Primitive.PackWord32.subVec val fWord64 = Primitive.PackWord64.subVec) in val subVec = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = Word8.word array * SeqIndex.t * 'a -> unit val fWord8 = Primitive.PackWord8.update val fWord16 = Primitive.PackWord16.update val fWord32 = Primitive.PackWord32.update val fWord64 = Primitive.PackWord64.update) in val update = S.f end end in structure PackLargeWordBig: PACK_WORD_EXTRA = PackWord (val isBigEndian = true open PackLargeWord open LargeWord) structure PackLargeWordLittle: PACK_WORD_EXTRA = PackWord (val isBigEndian = false open PackLargeWord open LargeWord) structure PackLargeWordHost: PACK_WORD_EXTRA = PackWord (val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian open PackLargeWord open LargeWord) end mlton-20100608/basis-library/integer/word-global.sml0000644000076600000240000000046411404435632020713 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure WordGlobal: WORD_GLOBAL = Word open WordGlobal mlton-20100608/basis-library/integer/word.sig0000644000076600000240000000424011404435632017440 0ustar mtfstaffsignature WORD_GLOBAL = sig eqtype word end signature WORD = sig include WORD_GLOBAL val wordSize: Int.int val toLarge: word -> LargeWord.word val toLargeX: word -> LargeWord.word val toLargeWord: word -> LargeWord.word val toLargeWordX: word -> LargeWord.word val fromLarge: LargeWord.word -> word val fromLargeWord: LargeWord.word -> word val toLargeInt: word -> LargeInt.int val toLargeIntX: word -> LargeInt.int val fromLargeInt: LargeInt.int -> word val toInt: word -> int val toIntX: word -> int val fromInt: int -> word val + : word * word -> word val - : word * word -> word val * : word * word -> word val div: word * word -> word val mod: word * word -> word val andb: word * word -> word val << : word * Word.word -> word val notb: word -> word val orb: word * word -> word val ~>> : word * Word.word -> word val >> : word * Word.word -> word val xorb: word * word -> word val compare: word * word -> order val < : word * word -> bool val <= : word * word -> bool val > : word * word -> bool val >= : word * word -> bool val ~ : word -> word val min: word * word -> word val max: word * word -> word val fmt: StringCvt.radix -> word -> string val toString: word -> string val scan: (StringCvt.radix -> (char, 'a) StringCvt.reader -> (word, 'a) StringCvt.reader) val fromString: string -> word option end signature WORD_EXTRA = sig include WORD type t = word val zero: word val one: word val maxWord' : word val toWord: word -> Word.word val toWordX: word -> Word.word val fromWord: Word.word -> word val bswap: word -> word val rol: word * Word.word -> word val ror: word * Word.word -> word val log2 : word -> Primitive.Int32.int val castFromFixedInt: FixedInt.int -> word val castToFixedInt: word -> FixedInt.int val castFromSysWord: SysWord.word -> word val castToSysWord: word -> SysWord.word end mlton-20100608/basis-library/integer/word.sml0000644000076600000240000001612611404435632017457 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Word (W: PRIM_WORD) : WORD_EXTRA = struct open W type t = word val wordSize: Int.int = Primitive.Int32.zextdToInt sizeInBits val sizeInBitsWord = Primitive.Word32.zextdToWord sizeInBitsWord fun << (i, n) = if Word.>= (n, sizeInBitsWord) then zero else W.<> (i, n) = if Word.>= (n, sizeInBitsWord) then zero else W.>>? (i, Primitive.Word32.zextdFromWord n) fun ~>> (i, n) = if Word.< (n, sizeInBitsWord) then W.~>>? (i, Primitive.Word32.zextdFromWord n) else W.~>>? (i, Primitive.Word32.- (W.sizeInBitsWord, 0w1)) fun rol (i, n) = W.rolUnsafe (i, Primitive.Word32.zextdFromWord n) fun ror (i, n) = W.rorUnsafe (i, Primitive.Word32.zextdFromWord n) local fun st (w, msk, sft) = let val odd = andb (w, msk) val evn = xorb (w, odd) in (xorb (W.<>? (evn, sft)), xorb (msk, W.<>? (sft, 0w1))), Primitive.Word32.>>? (sft, 0w1)) end val (f, sft) = case W.sizeInBitsWord of 0w8 => (fn x => x, 0w4) | 0w16 => (st, 0w8) | 0w32 => (st o st, 0w16) | 0w64 => (st o st o st, 0w32) | _ => raise (Fail "Word.bswap") in fun bswap w = #1 (f (w, W.< false | SOME precision => Int32.<= (precision, W.sizeInBits)) andalso Int.< (i, 0) then raise Overflow else i end val fromLargeInt = W.sextdFromLargeInt val toLargeIntX = W.schckToLargeInt fun toLargeInt w = let val i = W.zchckToLargeInt w in if Primitive.Controls.detectOverflow andalso (case LargeInt.precision of NONE => false | SOME precision => Int32.<= (precision, W.sizeInBits)) andalso LargeInt.< (i, 0) then raise Overflow else i end val fromLargeWord = W.zextdFromLargeWord val fromLarge = fromLargeWord val toLargeWordX = W.sextdToLargeWord val toLargeX = toLargeWordX val toLargeWord = W.zextdToLargeWord val toLarge = toLargeWord val fromWord = W.zextdFromWord val toWordX = W.sextdToWord val toWord = W.zextdToWord local (* Allocate a buffer large enough to hold any formatted word in any radix. * The most that will be required is for maxWord in binary. *) val maxNumDigits = wordSize val oneBuf = One.make (fn () => CharArray.array (maxNumDigits, #"\000")) in fun fmt radix (w: word): string = One.use (oneBuf, fn buf => let val radix = fromInt (StringCvt.radixToInt radix) fun loop (q, i: Int.int) = let val _ = CharArray.update (buf, i, StringCvt.digitToChar (toInt (q mod radix))) val q = q div radix in if q = zero then CharArraySlice.vector (CharArraySlice.slice (buf, i, NONE)) else loop (q, Int.- (i, 1)) end in loop (w, Int.- (maxNumDigits, 1)) end) end (* fun fmt radix (w: word): string = let val radix = fromInt (StringCvt.radixToInt radix) fun loop (q, chars) = let val chars = StringCvt.digitToChar (toInt (q mod radix)) :: chars val q = q div radix in if q = zero then String.implode chars else loop (q, chars) end in loop (w, []) end *) val toString = fmt StringCvt.HEX fun scan radix reader state = let val state = StringCvt.skipWS reader state val charToDigit = StringCvt.charToDigit radix val radixWord = fromInt (StringCvt.radixToInt radix) fun finishNum (state, n) = case reader state of NONE => SOME (n, state) | SOME (c, state') => case charToDigit c of NONE => SOME (n, state) | SOME n' => let val n'' = n * radixWord in if n'' div radixWord = n then let val n' = fromInt n' val n''' = n'' + n' in if n''' >= n'' then finishNum (state', n''') else raise Overflow end else raise Overflow end fun num state = finishNum (state, zero) in case reader state of NONE => NONE | SOME (c, state) => case c of #"0" => (case reader state of NONE => SOME (zero, state) | SOME (c, state') => case c of #"w" => (case radix of StringCvt.HEX => (case reader state' of NONE => (* the #"w" was not followed by * an #"X" or #"x", therefore we * return 0 *) SOME (zero, state) | SOME (c, state) => (case c of #"x" => num state | #"X" => num state | _ => (* the #"w" was not followed by * an #"X" or #"x", therefore we * return 0 *) SOME (zero, state))) | _ => num state') | #"x" => (case radix of StringCvt.HEX => num state' | _ => NONE) | #"X" => (case radix of StringCvt.HEX => num state' | _ => NONE) | _ => num state) | _ => (case charToDigit c of NONE => NONE | SOME n => finishNum (state, fromInt n)) end val fromString = StringCvt.scanString (scan StringCvt.HEX) end structure Word8 = Word (Primitive.Word8) structure Word16 = Word (Primitive.Word16) structure Word32 = Word (Primitive.Word32) structure Word64 = Word (Primitive.Word64) mlton-20100608/basis-library/integer/word1.sml0000644000076600000240000002574611404435632017550 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature WORD_FROM_TO_ARG = sig type word (* Lowbits or sign extend. *) val fromInt8: Primitive.Int8.int -> word val fromInt16: Primitive.Int16.int -> word val fromInt32: Primitive.Int32.int -> word val fromInt64: Primitive.Int64.int -> word val fromIntInf: Primitive.IntInf.int -> word (* Lowbits or zero extend. *) val fromInt8Z: Primitive.Int8.int -> word val fromInt16Z: Primitive.Int16.int -> word val fromInt32Z: Primitive.Int32.int -> word val fromInt64Z: Primitive.Int64.int -> word val fromIntInfZ: Primitive.IntInf.int -> word (* Lowbits or zero extend. *) val fromWord8: Primitive.Word8.word -> word val fromWord16: Primitive.Word16.word -> word val fromWord32: Primitive.Word32.word -> word val fromWord64: Primitive.Word64.word -> word (* Lowbits or sign extend. *) val fromWord8X: Primitive.Word8.word -> word val fromWord16X: Primitive.Word16.word -> word val fromWord32X: Primitive.Word32.word -> word val fromWord64X: Primitive.Word64.word -> word (* Overflow checking, unsigned interp. *) val toInt8: word -> Primitive.Int8.int val toInt16: word -> Primitive.Int16.int val toInt32: word -> Primitive.Int32.int val toInt64: word -> Primitive.Int64.int val toIntInf: word -> Primitive.IntInf.int (* Overflow checking, signed interp. *) val toInt8X: word -> Primitive.Int8.int val toInt16X: word -> Primitive.Int16.int val toInt32X: word -> Primitive.Int32.int val toInt64X: word -> Primitive.Int64.int val toIntInfX: word -> Primitive.IntInf.int (* Lowbits or zero extend. *) val toWord8: word -> Primitive.Word8.word val toWord16: word -> Primitive.Word16.word val toWord32: word -> Primitive.Word32.word val toWord64: word -> Primitive.Word64.word (* Lowbits or sign extend. *) val toWord8X: word -> Primitive.Word8.word val toWord16X: word -> Primitive.Word16.word val toWord32X: word -> Primitive.Word32.word val toWord64X: word -> Primitive.Word64.word end signature WORD_FROM_TO_RES = sig type word val fromInt: Int.int -> word val fromIntZ: Int.int -> word val fromLargeInt: LargeInt.int -> word val fromLargeIntZ: LargeInt.int -> word val fromWord: Word.word -> word val fromWordX: Word.word -> word val fromLargeWord: LargeWord.word -> word val fromLarge: LargeWord.word -> word val fromLargeWordX: LargeWord.word -> word val fromLargeX: LargeWord.word -> word val fromSysWord: SysWord.word -> word val fromSysWordX: SysWord.word -> word val toInt: word -> Int.int val toIntX: word -> Int.int val toLargeInt: word -> LargeInt.int val toLargeIntX: word -> LargeInt.int val toWord: word -> Word.word val toWordX: word -> Word.word val toLargeWord: word -> LargeWord.word val toLarge: word -> LargeWord.word val toLargeWordX: word -> LargeWord.word val toLargeX: word -> LargeWord.word val toSysWord: word -> SysWord.word val toSysWordX: word -> SysWord.word end functor WordFromTo (W: WORD_FROM_TO_ARG): WORD_FROM_TO_RES where type word = W.word = struct open W local structure S = Int_ChooseInt (type 'a t = 'a -> word val fInt8 = W.fromInt8 val fInt16 = W.fromInt16 val fInt32 = W.fromInt32 val fInt64 = W.fromInt64 val fIntInf = W.fromIntInf) in val fromInt = S.f end local structure S = Int_ChooseInt (type 'a t = 'a -> word val fInt8 = W.fromInt8Z val fInt16 = W.fromInt16Z val fInt32 = W.fromInt32Z val fInt64 = W.fromInt64Z val fIntInf = W.fromIntInfZ) in val fromIntZ = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> word val fInt8 = W.fromInt8 val fInt16 = W.fromInt16 val fInt32 = W.fromInt32 val fInt64 = W.fromInt64 val fIntInf = W.fromIntInf) in val fromLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> word val fInt8 = W.fromInt8Z val fInt16 = W.fromInt16Z val fInt32 = W.fromInt32Z val fInt64 = W.fromInt64Z val fIntInf = W.fromIntInfZ) in val fromLargeIntZ = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> word val fWord8 = W.fromWord8 val fWord16 = W.fromWord16 val fWord32 = W.fromWord32 val fWord64 = W.fromWord64) in val fromWord = S.f end local structure S = Word_ChooseWordN (type 'a t = 'a -> word val fWord8 = W.fromWord8X val fWord16 = W.fromWord16X val fWord32 = W.fromWord32X val fWord64 = W.fromWord64X) in val fromWordX = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> word val fWord8 = W.fromWord8 val fWord16 = W.fromWord16 val fWord32 = W.fromWord32 val fWord64 = W.fromWord64) in val fromLargeWord = S.f val fromLarge = fromLargeWord end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> word val fWord8 = W.fromWord8X val fWord16 = W.fromWord16X val fWord32 = W.fromWord32X val fWord64 = W.fromWord64X) in val fromLargeWordX = S.f val fromLargeX = fromLargeWordX end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> word val fWord8 = W.fromWord8 val fWord16 = W.fromWord16 val fWord32 = W.fromWord32 val fWord64 = W.fromWord64) in val fromSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = 'a -> word val fWord8 = W.fromWord8X val fWord16 = W.fromWord16X val fWord32 = W.fromWord32X val fWord64 = W.fromWord64X) in val fromSysWordX = S.f end local structure S = Int_ChooseInt (type 'a t = word -> 'a val fInt8 = W.toInt8 val fInt16 = W.toInt16 val fInt32 = W.toInt32 val fInt64 = W.toInt64 val fIntInf = W.toIntInf) in val toInt = S.f end local structure S = Int_ChooseInt (type 'a t = word -> 'a val fInt8 = W.toInt8X val fInt16 = W.toInt16X val fInt32 = W.toInt32X val fInt64 = W.toInt64X val fIntInf = W.toIntInfX) in val toIntX = S.f end local structure S = LargeInt_ChooseInt (type 'a t = word -> 'a val fInt8 = W.toInt8 val fInt16 = W.toInt16 val fInt32 = W.toInt32 val fInt64 = W.toInt64 val fIntInf = W.toIntInf) in val toLargeInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = word -> 'a val fInt8 = W.toInt8X val fInt16 = W.toInt16X val fInt32 = W.toInt32X val fInt64 = W.toInt64X val fIntInf = W.toIntInfX) in val toLargeIntX = S.f end local structure S = Word_ChooseWordN (type 'a t = word -> 'a val fWord8 = W.toWord8 val fWord16 = W.toWord16 val fWord32 = W.toWord32 val fWord64 = W.toWord64) in val toWord = S.f end local structure S = Word_ChooseWordN (type 'a t = word -> 'a val fWord8 = W.toWord8X val fWord16 = W.toWord16X val fWord32 = W.toWord32X val fWord64 = W.toWord64X) in val toWordX = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = word -> 'a val fWord8 = W.toWord8 val fWord16 = W.toWord16 val fWord32 = W.toWord32 val fWord64 = W.toWord64) in val toLargeWord = S.f val toLarge = toLargeWord end local structure S = LargeWord_ChooseWordN (type 'a t = word -> 'a val fWord8 = W.toWord8X val fWord16 = W.toWord16X val fWord32 = W.toWord32X val fWord64 = W.toWord64X) in val toLargeWordX = S.f val toLargeX = toLargeWordX end local structure S = SysWord_ChooseWordN (type 'a t = word -> 'a val fWord8 = W.toWord8 val fWord16 = W.toWord16 val fWord32 = W.toWord32 val fWord64 = W.toWord64) in val toSysWord = S.f end local structure S = SysWord_ChooseWordN (type 'a t = word -> 'a val fWord8 = W.toWord8X val fWord16 = W.toWord16X val fWord32 = W.toWord32X val fWord64 = W.toWord64X) in val toSysWordX = S.f end end structure Primitive = struct open Primitive structure Word8 = struct open Word8 local structure S = WordFromTo (Primitive.Word8) in open S end end structure Word16 = struct open Word16 local structure S = WordFromTo (Primitive.Word16) in open S end end structure Word32 = struct open Word32 local structure S = WordFromTo (Primitive.Word32) in open S end end structure Word64 = struct open Word64 local structure S = WordFromTo (Primitive.Word64) in open S end end end mlton-20100608/basis-library/io/0000755000076600000240000000000011404470406014731 5ustar mtfstaffmlton-20100608/basis-library/io/bin-io.sig0000644000076600000240000000320311404435632016612 0ustar mtfstaffsignature BIN_IO = sig structure StreamIO: BIN_STREAM_IO type elem = StreamIO.elem type instream type outstream type vector = StreamIO.vector val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val flushOut: outstream -> unit val getInstream: instream -> StreamIO.instream val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val mkOutstream: StreamIO.outstream -> outstream val openAppend: string -> outstream val openIn: string -> instream val openOut: string -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val setInstream: (instream * StreamIO.instream) -> unit val setOutstream: outstream * StreamIO.outstream -> unit val setPosOut: outstream * StreamIO.out_pos -> unit end signature BIN_IO_EXTRA = sig include BIN_IO val equalsIn: instream * instream -> bool val inFd: instream -> Posix.IO.file_desc val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val outFd: outstream -> Posix.IO.file_desc val stdErr: outstream val stdIn: instream val stdOut: outstream end mlton-20100608/basis-library/io/bin-io.sml0000644000076600000240000000143611404435632016631 0ustar mtfstaff(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure BinIO: BIN_IO_EXTRA = ImperativeIOExtra (structure Array = Word8Array structure ArraySlice = Word8ArraySlice structure PrimIO = BinPrimIO structure Vector = Word8Vector structure VectorSlice = Word8VectorSlice val chunkSize = Int32.toInt (Primitive.Controls.bufSize) val fileTypeFlags = [PrimitiveFFI.Posix.FileSys.O.BINARY] val line = NONE val mkReader = Posix.IO.mkBinReader val mkWriter = Posix.IO.mkBinWriter val someElem = 0wx0: Word8.word val xlatePos = SOME {fromInt = fn i => i, toInt = fn i => i}) mlton-20100608/basis-library/io/bin-prim-io.sml0000644000076600000240000000136011404435632017572 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure BinPrimIO : PRIM_IO where type array = Word8Array.array where type vector = Word8Vector.vector where type elem = Word8.word where type pos = Position.int = PrimIO (structure Vector = Word8Vector structure VectorSlice = Word8VectorSlice structure Array = Word8Array structure ArraySlice = Word8ArraySlice type pos = Position.int val compare = Position.compare val someElem = 0wx0: Word8.word) mlton-20100608/basis-library/io/bin-stream-io.sig0000644000076600000240000000016711404435632020111 0ustar mtfstaffsignature BIN_STREAM_IO = STREAM_IO where type elem = Word8Vector.elem where type vector = Word8Vector.vector mlton-20100608/basis-library/io/imperative-io.fun0000644000076600000240000006467711404435632020243 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature IMPERATIVE_IO_EXTRA_ARG = sig structure Array: sig include MONO_ARRAY val arrayUninit: int -> array val unsafeSub: array * int -> elem end structure ArraySlice: MONO_ARRAY_SLICE structure PrimIO: PRIM_IO structure Vector: sig include MONO_VECTOR val unsafeFromArray: Array.array -> vector end structure VectorSlice: MONO_VECTOR_SLICE sharing type Array.array = ArraySlice.array = PrimIO.array sharing type Array.elem = ArraySlice.elem = PrimIO.elem = Vector.elem = VectorSlice.elem sharing type Array.vector = ArraySlice.vector = PrimIO.vector = Vector.vector = VectorSlice.vector sharing type ArraySlice.slice = PrimIO.array_slice sharing type ArraySlice.vector_slice = PrimIO.vector_slice = VectorSlice.slice val chunkSize: int val fileTypeFlags: Posix.FileSys.O.flags list val line : {isLine: Vector.elem -> bool, lineElem: Vector.elem} option val mkReader: {fd: Posix.FileSys.file_desc, name: string, initBlkMode: bool} -> PrimIO.reader val mkWriter: {fd: Posix.FileSys.file_desc, name: string, appendMode: bool, initBlkMode: bool, chunkSize: int} -> PrimIO.writer val someElem: PrimIO.elem val xlatePos : {toInt : PrimIO.pos -> Position.int, fromInt : Position.int -> PrimIO.pos} option end functor ImperativeIOExtra (S: IMPERATIVE_IO_EXTRA_ARG): IMPERATIVE_IO_EXTRA = struct open S structure StreamIO = StreamIOExtraFile (S) structure PIO = PrimIO structure SIO = StreamIO structure A = Array structure AS = ArraySlice structure V = Vector structure VS = VectorSlice type elem = PrimIO.elem type vector = PrimIO.vector type vector_slice = VS.slice (* ------------------------------------------------- *) (* outstream *) (* ------------------------------------------------- *) (* The following :> hides the fact that Outstream.t is an eqtype. Doing it * here is much easier than putting :> on the functor result. *) structure Outstream:> sig type t val get: t -> SIO.outstream val make: SIO.outstream -> t val set: t * SIO.outstream -> unit end = struct datatype t = T of SIO.outstream ref fun get (T r) = !r fun set (T r, s) = r := s fun make s = T (ref s) end type outstream = Outstream.t fun output (os, v) = SIO.output (Outstream.get os, v) fun output1 (os, v) = SIO.output1 (Outstream.get os, v) fun outputSlice (os, v) = SIO.outputSlice (Outstream.get os, v) fun flushOut os = SIO.flushOut (Outstream.get os) fun closeOut os = SIO.closeOut (Outstream.get os) val mkOutstream = Outstream.make val getOutstream = Outstream.get val setOutstream = Outstream.set val getPosOut = SIO.getPosOut o Outstream.get fun setPosOut (os, outPos) = Outstream.set (os, SIO.setPosOut outPos) fun newOut {appendMode, bufferMode, closeAtExit, fd, name} = let val writer = mkWriter {appendMode = appendMode, chunkSize = chunkSize, fd = fd, initBlkMode = true, name = name} val outstream = SIO.mkOutstream'' {bufferMode = bufferMode, closeAtExit = closeAtExit, closed = false, writer = writer} in mkOutstream outstream end structure PFS = Posix.FileSys val stdErr = newOut {appendMode = true, bufferMode = IO.NO_BUF, closeAtExit = false, fd = PFS.stderr, name = ""} val newOut = fn {appendMode, closeAtExit, fd, name} => newOut {appendMode = appendMode, bufferMode = if Posix.ProcEnv.isatty fd then IO.LINE_BUF else IO.BLOCK_BUF, closeAtExit = closeAtExit, fd = fd, name = name} val stdOut = newOut {appendMode = true, closeAtExit = false, fd = PFS.stdout, name = ""} val newOut = fn {appendMode, fd, name} => newOut {appendMode = appendMode, closeAtExit = true, fd = fd, name = name} fun 'a protect' (function: string, name: string, f: unit -> 'a): 'a = f () handle e => raise IO.Io {cause = e, function = function, name = name} local val readWrite = let open PFS.S in flags [irusr, iwusr, irgrp, iwgrp, iroth, iwoth] end in fun openOut file = protect' ("openOut", file, fn () => let val fd = PFS.createf (file, Posix.IO.O_WRONLY, PFS.O.flags (PFS.O.trunc::fileTypeFlags), readWrite) in newOut {fd = fd, name = file, appendMode = false} end) fun openAppend file = protect' ("openAppend", file, fn () => let val fd = PFS.createf (file, Posix.IO.O_WRONLY, PFS.O.flags (PFS.O.append::fileTypeFlags), readWrite) in newOut {fd = fd, name = file, appendMode = true} end) end val newOut = fn (fd, name) => newOut {fd = fd, name = name, appendMode = false} val outFd = SIO.outFd o getOutstream (* ------------------------------------------------- *) (* instream *) (* ------------------------------------------------- *) datatype state = Closed | Open of {eos: bool} | Stream of SIO.instream (* Inv: if !first < !last then !state = Open {eos = false} * if !state = Closed then !first = !last * if !state = Open {eos = true} then !first = !last *) datatype instream = In of {augmentedReader: PIO.reader, buf: A.array, first: int ref, (* index of first character *) last: int ref, (* one past the index of the last char *) reader: PIO.reader, state: state ref} local val augmentedReader = PIO.nullRd () val buf = A.arrayUninit 0 val first = ref 0 val last = ref 0 val reader = PIO.nullRd () in fun mkInstream s = In {augmentedReader = augmentedReader, buf = buf, first = first, last = last, reader = reader, state = ref (Stream s)} end fun setInstream (In {first, last, state, ...}, s) = (first := 0 ; last := 0 ; state := Stream s) fun equalsIn (In {first = f, ...}, In {first = f', ...}) = f = f' fun augmentedReaderSel (In {augmentedReader = PIO.RD v, ...}, sel) = sel v fun readerSel (In {reader = PIO.RD v, ...}, sel) = sel v fun inbufferName ib = readerSel (ib, #name) fun inFd ib = case readerSel (ib, #ioDesc) of NONE => raise IO.Io {cause = Fail "", function = "inFd", name = inbufferName ib} | SOME ioDesc => valOf (Posix.FileSys.iodToFD ioDesc) val empty = V.tabulate (0, fn _ => someElem) local fun make (sel, e: exn) ib = case augmentedReaderSel (ib, sel) of NONE => raise e | SOME x => x in val readArr = make (#readArr, IO.BlockingNotSupported) val readArrNB = make (#readArrNB, IO.NonblockingNotSupported) val readVec = make (#readVec, IO.BlockingNotSupported) end fun 'a protect (ib, function: string, f: unit -> 'a): 'a = f () handle e => raise IO.Io {cause = e, function = function, name = inbufferName ib} fun update (ib as In {buf, first, last, state, ...}) = let val i = readArr ib (AS.full buf) in if i = 0 then (state := Open {eos = true} ; false) else (first := 0 ; last := i ; true) end fun input (ib as In {buf, first, last, ...}) = let val f = !first val l = !last in if f < l then (first := l ; AS.vector (AS.slice (buf, f, SOME (l - f)))) else let val In {state, ...} = ib in case !state of Closed => empty | Open {eos} => if eos then (state := Open {eos = false} ; empty) else protect (ib, "input", fn () => readVec ib (augmentedReaderSel (ib, #chunkSize))) | Stream s => let val (v, s') = SIO.input s val _ = state := Stream s' in v end end end (* input1 will move past a temporary end of stream *) fun input1 (ib as In {buf, first, last, ...}) = let val f = !first in if f < !last then (first := f + 1 ; SOME (A.unsafeSub (buf, f))) else let val In {state, ...} = ib in case !state of Closed => NONE | Open {eos} => if eos then (state := Open {eos = false} ; NONE) else if protect (ib, "input1", fn () => update ib) then (first := 1 ; SOME (A.sub (buf, 0))) else NONE | Stream s => let val (c, s') = SIO.input1' s val _ = state := Stream s' in c end end end fun inputN (ib as In {buf, first, last, ...}, n) = if n < 0 orelse n > V.maxLen then raise Size else let val f = !first val l = !last val size = l - f in if size >= n then (first := f + n ; AS.vector (AS.slice (buf, f, SOME n))) else let val In {state, ...} = ib in case !state of Closed => empty | Open {eos} => if eos then (state := Open {eos = false} ; empty) else protect (ib, "inputN", fn () => let val readArr = readArr ib val inp = A.arrayUninit n fun fill k = if k >= size then () else (A.update (inp, k, A.sub (buf, f + k)) ; fill (k + 1)) val _ = fill 0 val _ = first := l fun loop i = if i = n then i else let val j = readArr (AS.slice (inp, i, SOME (n - i))) in if j = 0 then (state := Open {eos = true}; i) else loop (i + j) end val i = loop size in if i = n then V.unsafeFromArray inp else AS.vector (AS.slice (inp, 0, SOME i)) end) | Stream s => let val (v, s') = SIO.inputN (s, n) val _ = state := Stream s' in v end end end fun inputAll (ib as In {state, ...}) = case !state of Closed => empty | Open {eos} => if eos then (state := Open {eos = false} ; empty) else protect (ib, "inputAll", fn () => let val In {buf, first, last, ...} = ib val readVec = readVec ib val f = !first val l = !last val inp = AS.vector (AS.slice (buf, f, SOME (l - f))) val inps = [inp] fun loop inps = let val inp = readVec (augmentedReaderSel (ib, #chunkSize)) in if V.length inp = 0 then V.concat (List.rev inps) else loop (inp :: inps) end in loop inps end) | Stream s => let val (v, s') = SIO.inputAll s val _ = state := Stream s' in v end val inputLine = case line of NONE => (fn ib => SOME (input ib)) | SOME {isLine, lineElem, ...} => let val lineVec = V.tabulate (1, fn _ => lineElem) in fn (ib as In {state, ...}) => case !state of Closed => NONE | Open {eos} => if eos then NONE else protect (ib, "inputLine", fn () => let val In {buf, first, last, ...} = ib fun finish (inps, trail) = let val inps = if trail then lineVec :: inps else inps val inp = V.concat (List.rev inps) in SOME inp end fun loop inps = if !first < !last orelse update ib then let val f = !first val l = !last (* !first < !last *) fun loop' i = (* pre: !first <= i <= !last *) let fun done j = (* pre: !first < j <= !last *) let val inp = AS.vector (AS.slice (buf, f, SOME (j - f))) in first := j; inp::inps end in if i >= l then loop (done i) else if isLine (A.sub (buf, i)) then finish (done (i + 1), false) else loop' (i + 1) end in loop' f end else (case inps of [] => NONE | _ => finish (inps, true)) in loop [] end) | Stream s => Option.map (fn (v, s') => (state := Stream s'; v)) (SIO.inputLine s) end fun canInput (ib as In {state, ...}, n) = if n < 0 orelse n > V.maxLen then raise Size else case !state of Closed => SOME 0 | Open {eos} => if eos then SOME 0 else protect (ib, "canInput", fn () => let val readArrNB = readArrNB ib val In {buf, first, last, ...} = ib val f = !first val l = !last val read = l - f val _ = if f > 0 then (AS.copy {di = 0, dst = buf, src = AS.slice (buf, f, SOME read)} ; first := 0) else () val size = A.length buf (* 0 = !first *) fun loop read = if read = size then {read = read, eos = false} else let val slice = AS.slice (buf, read, NONE) val i = readArrNB slice in case i of NONE => {read = read, eos = false} | SOME i => if 0 = i then {read = read, eos = true} else loop (read + i) end val {read, eos} = loop read val _ = last := read in if read > 0 then SOME (Int.min (n, read)) else if eos then (state := Open {eos = true}; SOME 0) else NONE end) | Stream s => SIO.canInput (s, n) fun lookahead (ib as In {buf, first, last, ...}) = let val f = !first val l = !last in if f < l then SOME (A.unsafeSub (buf, f)) else let val In {state, ...} = ib in case !state of Closed => NONE | Open {eos, ...} => if eos then NONE else if protect (ib, "lookahead", fn () => update ib) then SOME (A.sub (buf, 0)) else NONE | Stream s => Option.map #1 (SIO.input1 s) end end fun closeIn (ib as In {first, last, state, ...}) = case !state of Closed => () | Open _ => (first := !last ; state := Closed ; protect (ib, "closeIn", fn () => readerSel (ib, #close) ())) | Stream s => SIO.closeIn s fun endOfStream (ib as In {first, last, state, ...}) = !first = !last andalso (case !state of Closed => true | Open {eos, ...} => eos orelse not (protect (ib, "endOfStream", fn () => update ib)) | Stream s => SIO.endOfStream s) fun mkInbuffer' {reader, closed, bufferContents} = let val (state, first, last, buf) = if closed then (ref Closed, ref 0, ref 0, Array.array (0, someElem)) else let val PIO.RD {chunkSize, ...} = reader val buf = Array.array (chunkSize, someElem) val first = ref 0 val (state, last) = case bufferContents of NONE => (ref (Open {eos = false}), ref 0) | SOME v => if V.length v = 0 then (ref (Open {eos = true}), ref 0) else (V.appi (fn (i, c) => A.update (buf, i, c)) v ; (ref (Open {eos = false}), ref (V.length v))) in (state, first, last, buf) end in In {augmentedReader = PIO.augmentReader reader, buf = buf, first = first, last = last, reader = reader, state = state} end fun openVector v = mkInbuffer' {bufferContents = NONE, closed = false, reader = PIO.openVector v} val openInbuffers : (instream * {close: bool}) list ref = ref [] fun getInstream (ib as In {state, ...}) = let fun doit (closed: bool, bufferContents) = let val In {reader, ...} = ib val (ibs, openInbuffers') = List.partition (fn (ib', _) => equalsIn (ib, ib')) (!openInbuffers) val _ = openInbuffers := openInbuffers' val closeAtExit = List.foldr (fn ((_, {close = close'}), close) => close orelse close') false ibs in SIO.mkInstream'' {bufferContents = bufferContents, closeAtExit = closeAtExit, closed = closed, reader = reader} end in case !state of Closed => doit (true, NONE) | Open {eos} => if eos then doit (false, SOME (true, empty)) else let val In {buf, first, last, ...} = ib val f = !first val l = !last val s = if f < l then doit (false, SOME (true, AS.vector (AS.slice (buf, f, SOME (l - f))))) else doit (false, NONE) val () = state := Stream s in s end | Stream s => s end val mkInbuffer'' = let val _ = Cleaner.addNew (Cleaner.atExit, fn () => List.app (fn (ib, {close}) => if close then closeIn ib else ()) (!openInbuffers)) in fn {bufferContents, closeAtExit, closed, reader} => let val ib = mkInbuffer' {bufferContents = bufferContents, closed = closed, reader = reader} val _ = if closed then () else openInbuffers := ((ib, {close = closeAtExit}) :: (!openInbuffers)) in ib end end fun scanStream f is = case f SIO.input1 (getInstream is) of NONE => NONE | SOME (v, s') => (setInstream (is, s'); SOME v) val closeIn = fn ib => let val _ = openInbuffers := List.filter (fn (ib',_) => not (equalsIn (ib, ib'))) (!openInbuffers) in closeIn ib end fun newIn {bufferContents, closeAtExit, fd, name} = let val reader = mkReader {fd = fd, initBlkMode = true, name = name} in mkInbuffer'' {bufferContents = bufferContents, closeAtExit = closeAtExit, closed = false, reader = reader} end val newIn = fn (fd, name) => newIn {bufferContents = NONE, closeAtExit = true, fd = fd, name = name} val stdIn = newIn (PFS.stdin, "") fun openIn file = protect' ("openIn", file, fn () => let val fd = PFS.openf (file, Posix.IO.O_RDONLY, PFS.O.flags fileTypeFlags) in newIn (fd, file) end) end signature IMPERATIVE_IO_ARG = sig structure Array: MONO_ARRAY (* structure ArraySlice: MONO_ARRAY_SLICE *) structure StreamIO: STREAM_IO structure Vector: MONO_VECTOR (* structure VectorSlice: MONO_VECTOR_SLICE *) (* sharing type Array.array = ArraySlice.array *) sharing type Array.elem (* = ArraySlice.elem *) = StreamIO.elem = Vector.elem (* = VectorSlice.elem *) sharing type Array.vector (* = ArraySlice.vector *) = Vector.vector (* = VectorSlice.vector *) (* sharing type ArraySlice.vector_slice = VectorSlice.slice *) end functor ImperativeIO (S: IMPERATIVE_IO_ARG): IMPERATIVE_IO = struct open S structure SIO = StreamIO type elem = SIO.elem type vector = SIO.vector datatype outstream = Out of SIO.outstream ref fun output (Out os, v) = SIO.output (!os, v) fun output1 (Out os, v) = SIO.output1 (!os, v) fun flushOut (Out os) = SIO.flushOut (!os) fun closeOut (Out os) = SIO.closeOut (!os) fun mkOutstream os = Out (ref os) fun getOutstream (Out os) = !os fun setOutstream (Out os, os') = os := os' fun getPosOut (Out os) = SIO.getPosOut (!os) fun setPosOut (Out os, out_pos) = os := SIO.setPosOut out_pos datatype instream = In of SIO.instream ref fun canInput (In is, n) = SIO.canInput (!is, n) fun closeIn (In is) = SIO.closeIn (!is) fun endOfStream (In is) = SIO.endOfStream (!is) fun getInstream (In is) = !is fun input (In is) = let val (v, is') = SIO.input (!is) in is := is'; v end (* input1 will never move past a temporary end of stream *) fun input1 (In is) = case SIO.input1 (!is) of SOME (c,is') => (is := is'; SOME c) | NONE => NONE fun inputAll (In is) = let val (v, is') = SIO.inputAll (!is) in is := is'; v end fun inputN (In is, n) = let val (v, is') = SIO.inputN (!is, n) in is := is'; v end fun lookahead (In is) = Option.map #1 (SIO.input1 (!is)) fun mkInstream is = In (ref is) fun setInstream (In is, is') = is := is' end mlton-20100608/basis-library/io/imperative-io.sig0000644000076600000240000000602111404435632020210 0ustar mtfstaffsignature IMPERATIVE_IO = sig structure StreamIO: STREAM_IO type elem = StreamIO.elem type vector = StreamIO.vector type instream type outstream val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val flushOut: outstream -> unit val getInstream: instream -> StreamIO.instream val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val mkOutstream: StreamIO.outstream -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val setInstream: instream * StreamIO.instream -> unit val setOutstream: outstream * StreamIO.outstream -> unit val setPosOut: outstream * StreamIO.out_pos -> unit end signature IMPERATIVE_IO_EXTRA = sig structure StreamIO: STREAM_IO_EXTRA type elem = StreamIO.elem type instream type outstream type vector = StreamIO.vector type vector_slice = StreamIO.vector_slice val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val equalsIn: instream * instream -> bool val flushOut: outstream -> unit val getInstream: instream -> StreamIO.instream val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val inFd: instream -> Posix.IO.file_desc val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputLine: instream -> vector option val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val mkOutstream: StreamIO.outstream -> outstream val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val openAppend: string -> outstream val openIn: string -> instream val openOut: string -> outstream val openVector: vector -> instream val outFd: outstream -> Posix.IO.file_desc val output1: outstream * elem -> unit val output: outstream * vector -> unit val outputSlice: outstream * vector_slice -> unit val scanStream: ((elem, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option val setInstream: instream * StreamIO.instream -> unit val setOutstream: outstream * StreamIO.outstream -> unit val setPosOut: outstream * StreamIO.out_pos -> unit val stdErr: outstream val stdIn: instream val stdOut: outstream end mlton-20100608/basis-library/io/io.sig0000644000076600000240000000113211404435632016043 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature IO = sig exception Io of {name : string, function : string, cause : exn} exception BlockingNotSupported exception NonblockingNotSupported exception RandomAccessNotSupported exception ClosedStream datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF end mlton-20100608/basis-library/io/io.sml0000644000076600000240000000160511404435632016061 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure IO: IO = struct exception BlockingNotSupported exception ClosedStream exception Io of {cause : exn, function : string, name : string} val _ = General.addExnMessager (fn e => case e of Io {cause, function, name, ...} => SOME (concat ["Io: ", function, " \"", name, "\" failed with ", exnMessage cause]) | _ => NONE) exception NonblockingNotSupported exception RandomAccessNotSupported datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF end mlton-20100608/basis-library/io/prim-io.fun0000644000076600000240000003223111404435632017022 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRIM_IO_ARG = sig structure Vector: MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE structure Array: MONO_ARRAY structure ArraySlice: MONO_ARRAY_SLICE sharing type Vector.elem = VectorSlice.elem = Array.elem = ArraySlice.elem sharing type Vector.vector = VectorSlice.vector = Array.vector = ArraySlice.vector sharing type VectorSlice.slice = ArraySlice.vector_slice sharing type Array.array = ArraySlice.array val someElem: Vector.elem eqtype pos val compare: pos * pos -> order end functor PrimIO (S: PRIM_IO_ARG): PRIM_IO = struct open S structure V = Vector structure VS = VectorSlice structure A = Array structure AS = ArraySlice type elem = A.elem type vector = V.vector type vector_slice = VS.slice type array = A.array type array_slice = AS.slice type pos = pos val compare = compare datatype reader = RD of {avail: unit -> int option, block: (unit -> unit) option, canInput: (unit -> bool) option, chunkSize: int, close: unit -> unit, endPos: (unit -> pos) option, getPos: (unit -> pos) option, ioDesc: OS.IO.iodesc option, name: string, readArr: (array_slice -> int) option, readArrNB: (array_slice -> int option) option, readVec: (int -> vector) option, readVecNB: (int -> vector option) option, setPos: (pos -> unit) option, verifyPos: (unit -> pos) option} datatype writer = WR of {block: (unit -> unit) option, canOutput: (unit -> bool) option, chunkSize: int, close: unit -> unit, endPos: (unit -> pos) option, getPos: (unit -> pos) option, ioDesc: OS.IO.iodesc option, name: string, setPos: (pos -> unit) option, verifyPos: (unit -> pos) option, writeArr: (array_slice -> int) option, writeArrNB: (array_slice -> int option) option, writeVec: (vector_slice -> int) option, writeVecNB: (vector_slice -> int option) option} fun liftExn name function cause = raise IO.Io {name = name, function = function, cause = cause} fun openVector v = let val name = "openVector" val closed = ref false val pos = ref 0 val eofPos = V.length v fun check f = if !closed then liftExn name f IO.ClosedStream else () fun const f c = fn _ => (check f; c) fun readVec f i = let val _ = check f val n = Int.min (i, eofPos - !pos) in VS.vector (VS.slice (v, !pos, SOME n)) before (pos := !pos + n) end fun readArr f sl = let val _ = check f val (buf, i, sz) = AS.base sl val n = Int.min (sz, eofPos - !pos) in AS.copyVec {src = VS.slice (v, !pos, SOME n), dst = buf, di = i}; pos := !pos + n; n end in RD {avail = const "avail" NONE, block = SOME (const "block" ()), canInput = SOME (const "canInput" true), chunkSize = 32, close = fn () => (closed := true), endPos = NONE, getPos = NONE, ioDesc = NONE, name = name, readArr = SOME (readArr "readArr"), readArrNB = SOME (SOME o (readArr "readVecNB")), readVec = SOME (readVec "readVec"), readVecNB = SOME (SOME o (readVec "readVecNB")), setPos = NONE, verifyPos = NONE} end fun nullRd () = let val name = "nullRd" val closed = ref false fun check f = if !closed then liftExn name f IO.ClosedStream else () fun const f c = fn _ => (check f; c) val empty = V.fromList [] in RD {avail = const "avail" NONE, block = SOME (const "block" ()), canInput = SOME (const "canInput" true), chunkSize = 1, close = fn () => (closed := true), endPos = NONE, getPos = NONE, ioDesc = NONE, name = name, readArr = SOME (const "readArr" 0), readArrNB = SOME (const "readArrNB" (SOME 0)), readVec = SOME (const "readVec" empty), readVecNB = SOME (const "readVecNB" (SOME empty)), setPos = NONE, verifyPos = NONE} end fun nullWr () = let val name = "nullWr" val closed = ref false fun check f = if !closed then liftExn name f IO.ClosedStream else () fun const f c = fn _ => (check f; c) fun function f g = fn x => (check f; g x) in WR {block = SOME (const "block" ()), canOutput = SOME (const "canOutput" true), chunkSize = 1, close = fn () => (closed := true), endPos = NONE, getPos = NONE, ioDesc = NONE, name = name, setPos = NONE, verifyPos = NONE, writeArr = SOME (function "writeArr" AS.length), writeArrNB = SOME (function "writeArrNB" (SOME o AS.length)), writeVec = SOME (function "writeVec" VS.length), writeVecNB = SOME (function "writeVecNB" (SOME o VS.length))} end fun doBlock (f, block: unit -> unit) x = (block (); valOf (f x)) fun doCanInput (f, canInput) x = if canInput () then SOME (f x) else NONE fun augmentReader (RD {name, chunkSize, readVec, readArr, readVecNB, readArrNB, block, canInput, avail, getPos, setPos, endPos, verifyPos, close, ioDesc}) = let fun augmentRead (readVec, readArr) = case (readVec, readArr) of (SOME readVec, SOME readArr) => (SOME readVec, SOME readArr) | (NONE, SOME readArr) => (SOME (fn i => let val buf = A.array (i, someElem) fun first j = AS.slice (buf, 0, SOME j) in (AS.vector o first) (readArr (first i)) end), SOME readArr) | (SOME readVec, NONE) => (SOME readVec, SOME (fn sl => let val (buf, i, sz) = AS.base sl val v = readVec sz val _ = A.copyVec {src = v, dst = buf, di = i} in V.length v end)) | (NONE, NONE) => (NONE, NONE) fun augmentReadNB (readVecNB, readArrNB) = case (readVecNB, readArrNB) of (SOME readVecNB, SOME readArrNB) => (SOME readVecNB, SOME readArrNB) | (NONE, SOME readArrNB) => (SOME (fn i => let val buf = A.array (i, someElem) fun first j = AS.slice (buf, 0, SOME j) in Option.map (AS.vector o first) (readArrNB (first i)) end), SOME readArrNB) | (SOME readVecNB, NONE) => (SOME readVecNB, SOME (fn sl => let val (buf, i, sz) = AS.base sl in case readVecNB sz of NONE => NONE | SOME v => (A.copyVec {src = v, dst = buf, di = i} ; SOME (V.length v)) end)) | (NONE, NONE) => (NONE, NONE) fun augmentSeq (readSeq, readSeqNB) = case (readSeq, readSeqNB) of (SOME readSeq, SOME readSeqNB) => (SOME readSeq, SOME readSeqNB) | (NONE, SOME readSeqNB) => (case block of NONE => NONE | SOME block => SOME (doBlock (readSeqNB, block)), SOME readSeqNB) | (SOME readSeq, NONE) => (SOME readSeq, case canInput of NONE => NONE | SOME canInput => SOME (doCanInput (readSeq, canInput))) | (NONE, NONE) => (NONE, NONE) val ((readVec,readArr),(readVecNB,readArrNB)) = (augmentRead (readVec, readArr), augmentReadNB (readVecNB, readArrNB)) val ((readVec,readVecNB),(readArr,readArrNB)) = (augmentSeq (readVec, readVecNB), augmentSeq (readArr, readArrNB)) in RD {name = name, chunkSize = chunkSize, readVec = readVec, readArr = readArr, readVecNB = readVecNB, readArrNB = readArrNB, block = block, canInput = canInput, avail = avail, getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = verifyPos, close = close, ioDesc = ioDesc} end fun augmentWriter (WR {name, chunkSize, writeVec, writeArr, writeVecNB, writeArrNB, block, canOutput, getPos, setPos, endPos, verifyPos, close, ioDesc}) = let fun augmentWrite (writeVec, writeArr) = case (writeVec, writeArr) of (SOME writeVec, SOME writeArr) => (SOME writeVec, SOME writeArr) | (NONE, SOME writeArr) => (SOME (fn sl => writeArr (AS.full (A.tabulate (VS.length sl, fn i => VS.sub (sl, i))))), SOME writeArr) | (SOME writeVec, NONE) => (SOME writeVec, SOME (fn sl => writeVec (VS.full (AS.vector sl)))) | (NONE, NONE) => (NONE, NONE) fun augmentSeq (writeSeq, writeSeqNB) = case (writeSeq, writeSeqNB) of (SOME writeSeq, SOME writeSeqNB) => (SOME writeSeq, SOME writeSeqNB) | (NONE, SOME writeSeqNB) => (case block of NONE => NONE | SOME block => SOME (fn x => (block (); valOf (writeSeqNB x))), SOME writeSeqNB) | (SOME writeSeq, NONE) => (SOME writeSeq, case canOutput of NONE => NONE | SOME canOutput => SOME (fn x => (if canOutput () then SOME (writeSeq x) else NONE))) | (NONE, NONE) => (NONE, NONE) val ((writeVec,writeArr),(writeVecNB,writeArrNB)) = (augmentWrite (writeVec, writeArr), augmentWrite (writeVecNB, writeArrNB)) val ((writeVec,writeVecNB),(writeArr,writeArrNB)) = (augmentSeq (writeVec, writeVecNB), augmentSeq (writeArr, writeArrNB)) in WR {name = name, chunkSize = chunkSize, writeVec = writeVec, writeArr = writeArr, writeVecNB = writeVecNB, writeArrNB = writeArrNB, block = block, canOutput = canOutput, getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = verifyPos, close = close, ioDesc = ioDesc} end end mlton-20100608/basis-library/io/prim-io.sig0000644000076600000240000000370711404435632017022 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRIM_IO = sig type elem type vector type vector_slice type array type array_slice eqtype pos val compare: pos * pos -> order datatype reader = RD of {avail: unit -> int option, block: (unit -> unit) option, canInput: (unit -> bool) option, chunkSize: int, close: unit -> unit, endPos: (unit -> pos) option, getPos: (unit -> pos) option, ioDesc: OS.IO.iodesc option, name: string, readArr: (array_slice -> int) option, readArrNB: (array_slice -> int option) option, readVec: (int -> vector) option, readVecNB: (int -> vector option) option, setPos: (pos -> unit) option, verifyPos: (unit -> pos) option} datatype writer = WR of {block: (unit -> unit) option, canOutput: (unit -> bool) option, chunkSize: int, close: unit -> unit, endPos: (unit -> pos) option, getPos: (unit -> pos) option, ioDesc: OS.IO.iodesc option, name: string, setPos: (pos -> unit) option, verifyPos: (unit -> pos) option, writeArr: (array_slice -> int) option, writeArrNB: (array_slice -> int option) option, writeVec: (vector_slice -> int) option, writeVecNB: (vector_slice -> int option) option} val openVector: vector -> reader val nullRd: unit -> reader val nullWr: unit -> writer val augmentReader: reader -> reader val augmentWriter: writer -> writer end mlton-20100608/basis-library/io/stream-io.fun0000644000076600000240000011234411404435632017352 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature STREAM_IO_EXTRA_ARG = sig structure Array: MONO_ARRAY structure ArraySlice: MONO_ARRAY_SLICE structure PrimIO: PRIM_IO structure Vector: MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE sharing type PrimIO.elem = Vector.elem = VectorSlice.elem = Array.elem = ArraySlice.elem sharing type PrimIO.vector = Vector.vector = VectorSlice.vector = Array.vector = ArraySlice.vector sharing type PrimIO.vector_slice = VectorSlice.slice = ArraySlice.vector_slice sharing type PrimIO.array = Array.array = ArraySlice.array sharing type PrimIO.array_slice = ArraySlice.slice val line: {isLine: PrimIO.elem -> bool, lineElem: PrimIO.elem} option val someElem: PrimIO.elem val xlatePos : {toInt : PrimIO.pos -> Position.int, fromInt : Position.int -> PrimIO.pos} option end functor StreamIOExtra (S: STREAM_IO_EXTRA_ARG): STREAM_IO_EXTRA = struct open S structure PIO = PrimIO structure A = Array structure AS = ArraySlice structure V = struct open Vector val extract : vector * int * int option -> vector = VectorSlice.vector o VectorSlice.slice end structure VS = VectorSlice type elem = PIO.elem type vector = PIO.vector type vector_slice = PIO.vector_slice type reader = PIO.reader type writer = PIO.writer type pos = PIO.pos fun liftExn name function cause = raise IO.Io {name = name, function = function, cause = cause} (*---------------*) (* outstream *) (*---------------*) datatype buf = Buf of {array: A.array, size: int ref} datatype bufferMode = NO_BUF | LINE_BUF of buf | BLOCK_BUF of buf fun newLineBuf bufSize = LINE_BUF (Buf {size = ref 0, array = A.array (bufSize, someElem)}) fun newBlockBuf bufSize = BLOCK_BUF (Buf {size = ref 0, array = A.array (bufSize, someElem)}) datatype state = Active | Terminated | Closed fun active state = case state of Active => true | _ => false fun terminated state = not (active state) fun closed state = case state of Closed => true | _ => false datatype outstream = Out of {writer: writer, augmented_writer: writer, state: state ref, bufferMode: bufferMode ref} fun equalsOut (Out {state = state1, ...}, Out {state = state2, ...}) = state1 = state2 fun outstreamSel (Out v, sel) = sel v fun outstreamWriter os = outstreamSel (os, #writer) fun writerSel (PIO.WR v, sel) = sel v fun outstreamName os = writerSel (outstreamWriter os, #name) local fun flushGen (write: 'a -> int, base: 'a -> ('b * int * int), slice: ('b * int * int option) -> 'a, a: 'a) = let val (b, i, sz) = base a val max = i + sz fun loop i = if i = max then () else let val j = write (slice (b, i, SOME (max - i))) in if j = 0 then raise (Fail "partial write") else loop (i + j) end in loop i end in fun flushVec (writer, x) = case writerSel (writer, #writeVec) of NONE => raise IO.BlockingNotSupported | SOME writeVec => flushGen (writeVec, VS.base, VS.slice, x) fun flushArr (writer, x) = case writerSel (writer, #writeArr) of NONE => raise IO.BlockingNotSupported | SOME writeArr => flushGen (writeArr, AS.base, AS.slice, x) end fun flushBuf' (writer, size, array) = let val size' = !size in size := 0 ; flushArr (writer, AS.slice (array, 0, SOME size')) end fun flushBuf (writer, Buf {size, array}) = flushBuf' (writer, size, array) fun output (os as Out {augmented_writer, state, bufferMode, ...}, v) = if terminated (!state) then liftExn (outstreamName os) "output" IO.ClosedStream else let fun put () = flushVec (augmented_writer, VS.full v) fun doit (buf as Buf {size, array}, maybe) = let val curSize = !size val newSize = curSize + V.length v in if newSize >= A.length array orelse maybe () then (flushBuf (augmented_writer, buf); put ()) else (A.copyVec {src = v, dst = array, di = curSize}; size := newSize) end in case !bufferMode of NO_BUF => put () | LINE_BUF buf => doit (buf, fn () => (case line of NONE => false | SOME {isLine, ...} => V.exists isLine v)) | BLOCK_BUF buf => doit (buf, fn () => false) end handle exn => liftExn (outstreamName os) "output" exn fun ensureActive (os as Out {state, ...}) = if active (!state) then () else liftExn (outstreamName os) "output" IO.ClosedStream local val buf1 = A.array (1, someElem) fun flush (os, size, array) = let val Out {augmented_writer, ...} = os in flushBuf' (augmented_writer, size, array) handle exn => liftExn (outstreamName os) "output1" exn end in (* output1 is implemented very carefully to make it fast. Think hard * before modifying it, and test after you do, to make sure that it * hasn't been slowed down. *) fun output1 (os as Out {bufferMode, ...}, c): unit = case !bufferMode of BLOCK_BUF (Buf {array, size}) => let val n = !size in (* Use the bounds check for the update to make sure there * is space to put the character in the array. *) (A.update (array, n, c) ; size := 1 + n) handle Subscript => let val _ = ensureActive os val _ = flush (os, size, array) val _ = A.update (array, 0, c) val _ = size := 1 in () end end | LINE_BUF (Buf {array, size}) => let val n = !size val _ = (* Use the bounds check for the update to make sure there * is space to put the character in the array. *) (A.update (array, n, c) ; size := 1 + n) handle Subscript => let val _ = ensureActive os val _ = flush (os, size, array) val _ = A.update (array, 0, c) val _ = size := 1 in () end in case line of NONE => () | SOME {isLine, ...} => if isLine c then flush (os, size, array) else () end | NO_BUF => let val _ = ensureActive os val _ = A.update (buf1, 0, c) val Out {augmented_writer, ...} = os in flushArr (augmented_writer, AS.slice (buf1, 0, SOME 1)) end end fun outputSlice (os as Out {augmented_writer, state, bufferMode, ...}, v) = if terminated (!state) then liftExn (outstreamName os) "output" IO.ClosedStream else let fun put () = flushVec (augmented_writer, v) fun doit (buf as Buf {size, array}, maybe) = let val curSize = !size val newSize = curSize + VS.length v in if newSize >= A.length array orelse maybe () then (flushBuf (augmented_writer, buf); put ()) else (AS.copyVec {src = v, dst = array, di = curSize}; size := newSize) end in case !bufferMode of NO_BUF => put () | LINE_BUF buf => doit (buf, fn () => (case line of NONE => false | SOME {isLine, ...} => VS.exists isLine v)) | BLOCK_BUF buf => doit (buf, fn () => false) end handle exn => liftExn (outstreamName os) "output" exn fun flushOut (os as Out {augmented_writer, state, bufferMode, ...}) = if terminated (!state) then () else case !bufferMode of NO_BUF => () | LINE_BUF buf => flushBuf (augmented_writer, buf) | BLOCK_BUF buf => flushBuf (augmented_writer, buf) handle exn => liftExn (outstreamName os) "flushOut" exn fun makeTerminated (Out {bufferMode, ...}) = let fun doit (Buf {array, size}) = size := A.length array in case !bufferMode of BLOCK_BUF b => doit b | LINE_BUF b => doit b | NO_BUF => () end fun closeOut (os as Out {state, ...}) = if closed (!state) then () else (flushOut os; if terminated (!state) then () else (writerSel (outstreamWriter os, #close)) (); state := Closed ; makeTerminated os) handle exn => liftExn (outstreamName os) "closeOut" exn fun getBufferMode (Out {bufferMode, ...}) = case !bufferMode of NO_BUF => IO.NO_BUF | LINE_BUF _ => IO.LINE_BUF | BLOCK_BUF _ => IO.BLOCK_BUF fun setBufferMode (os as Out {bufferMode, ...}, mode) = case mode of IO.NO_BUF => (flushOut os; bufferMode := NO_BUF) | IO.LINE_BUF => let fun doit () = bufferMode := newLineBuf (writerSel (outstreamWriter os, #chunkSize)) in case !bufferMode of NO_BUF => doit () | LINE_BUF _ => () | BLOCK_BUF _ => doit () end | IO.BLOCK_BUF => let fun doit () = bufferMode := newBlockBuf (writerSel (outstreamWriter os, #chunkSize)) in case !bufferMode of NO_BUF => doit () | LINE_BUF _ => doit () | BLOCK_BUF _ => () end fun mkOutstream' {writer, closed, bufferMode} = let val bufSize = writerSel (writer, #chunkSize) in Out {writer = writer, augmented_writer = PIO.augmentWriter writer, state = ref (if closed then Closed else Active), bufferMode = ref (case bufferMode of IO.NO_BUF => NO_BUF | IO.LINE_BUF => newLineBuf bufSize | IO.BLOCK_BUF => newBlockBuf bufSize)} end fun mkOutstream (writer, bufferMode) = mkOutstream' {writer = writer, closed = false, bufferMode = bufferMode} fun getWriter (os as Out {writer, state, bufferMode, ...}) = if closed (!state) then liftExn (outstreamName os) "getWriter" IO.ClosedStream else (flushOut os ; state := Terminated ; makeTerminated os ; (writer, case !bufferMode of NO_BUF => IO.NO_BUF | LINE_BUF _ => IO.LINE_BUF | BLOCK_BUF _ => IO.BLOCK_BUF)) datatype out_pos = OutPos of {pos: pos, outstream: outstream} fun getPosOut (os as Out {...}) = (flushOut os; case writerSel (outstreamSel (os, #writer), #getPos) of NONE => liftExn (outstreamName os) "getPosOut" IO.RandomAccessNotSupported | SOME getPos => OutPos {pos = getPos (), outstream = os}) fun setPosOut (OutPos {pos, outstream = os}) = (flushOut os; case writerSel (outstreamSel (os, #writer), #setPos) of NONE => liftExn (outstreamName os) "setPosOut" IO.RandomAccessNotSupported | SOME setPos => setPos pos; os) fun filePosOut (OutPos {pos, ...}) = pos (*---------------*) (* instream *) (*---------------*) datatype state = Link of {buf: buf} | Eos of {buf: buf} (* V.length inp = 0 *) | End | Truncated | Closed and buf = Buf of {inp: V.vector, base: pos option, next: state ref} datatype instream = In of {common: {reader: reader, augmented_reader: reader, tail: state ref ref}, pos: int, buf: buf} (* @ s = Eos, End, Truncated, Closed ==> * pos = V.length inp, !next = s *) fun equalsIn (In {common = {tail = tail1, ...}, ...}, In {common = {tail = tail2, ...}, ...}) = tail1 = tail2 fun update (In {common, ...}, pos, buf) = In {common = common, pos = pos, buf = buf} fun updatePos (is as In {buf, ...}, pos) = update (is, pos, buf) fun updateBufBeg (is, buf) = update (is, 0, buf) fun updateBufEnd (is, buf as Buf {inp, ...}) = update (is, V.length inp, buf) fun instreamSel (In v, sel) = sel v fun instreamCommon is = instreamSel (is, #common) fun instreamCommonSel (is, sel) = sel (instreamCommon is) fun instreamReader is = instreamCommonSel (is, #reader) fun instreamTail is = instreamCommonSel (is, #tail) fun readerSel (PIO.RD v, sel) = sel v fun instreamName is = readerSel (instreamReader is, #name) val empty = V.tabulate (0, fn _ => someElem) fun extend function (is as In {common = {augmented_reader, tail, ...}, ...}) blocking = case !(!tail) of End => let fun link (base, inp) = let val next = ref End val buf = Buf {inp = inp, base = base, next = next} val this = if V.length inp = 0 then Eos {buf = buf} else Link {buf = buf} val _ = !tail := this val _ = tail := next in SOME this end fun doit readVec = let val base = case readerSel (augmented_reader, #getPos) of NONE => NONE | SOME getPos => SOME (getPos ()) val inp = readVec (readerSel (augmented_reader, #chunkSize)) handle exn => liftExn (instreamName is) function exn in case inp of NONE => NONE | SOME inp => link (base, inp) end in if blocking then case readerSel (augmented_reader, #readVec) of NONE => liftExn (instreamName is) function IO.BlockingNotSupported | SOME readVec => doit (SOME o readVec) else case readerSel (augmented_reader, #readVecNB) of NONE => liftExn (instreamName is) function IO.NonblockingNotSupported | SOME readVecNB => doit readVecNB end | _ => liftExn (instreamName is) function Match fun extendB function is = valOf (extend function is true) fun extendNB function is = extend function is false fun input (is as In {pos, buf as Buf {inp, next, ...}, ...}) = if pos < V.length inp then (V.extract(inp, pos, NONE), updateBufEnd (is, buf)) else let fun doit next = case next of Link {buf as Buf {inp, ...}} => (inp, updateBufEnd (is, buf)) | Eos {buf} => (empty, updateBufBeg (is, buf)) | End => doit (extendB "input" is) | _ => (empty, is) in doit (!next) end fun inputN (is, n) = if n < 0 orelse n > V.maxLen then raise Size else let fun first (is as In {pos, buf as Buf {inp, ...}, ...}, n) = if pos + n <= V.length inp then let val inp' = V.extract(inp, pos, SOME n) in (inp', updatePos (is, pos + n)) end else let val inp' = VS.slice(inp, pos, NONE) in loop (buf, [inp'], n - (V.length inp - pos)) end and loop (buf' as Buf {next, ...}, inps, n) = let fun doit next = case next of Link {buf as Buf {inp, ...}} => if n <= V.length inp then let val inp' = VS.slice(inp, 0, SOME n) val inps = inp'::inps in finish (inps, update (is, n, buf)) end else loop (buf, (VS.full inp)::inps, n - V.length inp) | Eos {buf} => finish (inps, if n > 0 then updateBufBeg (is, buf) else updateBufEnd (is, buf')) | End => doit (extendB "inputN" is) | _ => finish (inps, updateBufEnd (is, buf')) in doit (!next) end and finish (inps, is) = let val inp = VS.concat (List.rev inps) in (inp, is) end in first (is, n) end (* input1' will move past a temporary end of stream *) fun input1' (is as In {pos, buf = Buf {inp, next, ...}, ...}) = case SOME (V.sub (inp, pos)) handle Subscript => NONE of NONE => let fun doit next = case next of Link {buf} => input1' (updateBufBeg (is, buf)) | Eos {buf} => (NONE, updateBufBeg (is, buf)) | End => doit (extendB "input1" is) | _ => (NONE, is) in doit (!next) end | SOME e => let val is' = updatePos (is, pos + 1) in (SOME e, is') end (* input1 will never move past a temporary end of stream *) fun input1 is = case input1' is of (SOME c, is') => SOME (c, is') | _ => NONE fun inputAll is = let fun loop (is, ac) = let val (inp, is') = input is in if V.length inp = 0 then (V.concat (List.rev ac), is') else loop (is', inp::ac) end in loop (is, []) end val inputLine = case line of NONE => (fn is => SOME (input is)) | SOME {isLine, lineElem, ...} => let val lineVecSl = VS.full (V.tabulate(1, fn _ => lineElem)) in fn is => let fun findLine (v, i) = let fun loop i = case SOME (V.sub (v, i)) handle Subscript => NONE of NONE => NONE | SOME c => if isLine c then SOME (i + 1) else loop (i + 1) in loop i end fun first (is as In {pos, buf as Buf {inp, next, ...}, ...}) = (case findLine (inp, pos) of SOME i => let val inp' = V.extract(inp, pos, SOME (i - pos)) in SOME (inp', updatePos (is, i)) end | NONE => if pos < V.length inp then let val inp' = VS.slice(inp, pos, NONE) in loop (buf, [inp']) end else let fun doit next = case next of Link {buf} => first (updateBufBeg (is, buf)) | Eos _ => NONE | End => doit (extendB "inputLine" is) | _ => NONE in doit (!next) end) and loop (buf' as Buf {next, ...}, inps) = (* List.length inps > 0 *) let fun doit next = case next of Link {buf as Buf {inp, ...}} => (case findLine (inp, 0) of SOME i => let val inp' = VS.slice(inp, 0, SOME i) val inps = inp'::inps in finish (inps, update (is, i, buf), false) end | NONE => loop (buf, (VS.full inp)::inps)) | End => doit (extendB "inputLine" is) | _ => finish (inps, updateBufEnd (is, buf'), true) in doit (!next) end and finish (inps, is, trail) = let val inps = if trail then lineVecSl::inps else inps val inp = VS.concat (List.rev inps) in SOME (inp, is) end in first is end end fun canInput (is as In {pos, buf = Buf {inp, next, ...}, ...}, n) = if n < 0 orelse n > V.maxLen then raise Size else if n = 0 then SOME 0 else let fun start inp = add ([], inp, 0) and add (inps, inp, k) = let val l = V.length inp val inps = inp::inps in if k + l > n then finish (inps, n) else loop (inps, k + l) end and loop (inps, k) = case extendNB "canInput" is of NONE => finish (inps, k) | SOME (Link {buf = Buf {inp, ...}}) => add (inps, inp, k) | SOME (Eos _) => finish (inps, k) | _ => raise Fail "extendNB bug" and finish (inps, k) = let val inp = V.concat (List.rev inps) in (inp, k) end in if pos < V.length inp then SOME (Int.min (V.length inp - pos, n)) else case !next of End => (case extendNB "canInput" is of NONE => NONE | SOME (Link {buf = Buf {inp, base, ...}}) => let val (inp, k) = start inp val buf = Buf {inp = inp, base = base, next = ref End} in next := Link {buf = buf}; SOME k end | SOME (Eos _) => SOME 0 | _ => raise Fail "extendNB bug") | _ => SOME 0 end structure Close = struct datatype t = T of {close: unit -> unit, name: string, tail: state ref ref} fun close (T {close, name, tail}) = case !(!tail) of End => (!tail := Closed ; close () handle exn => liftExn name "closeIn" exn) | _ => () fun equalsInstream (T {tail, ...}, is) = tail = instreamTail is fun make (In {common = {reader = PIO.RD {close, name, ...}, tail, ...}, ...}): t = T {close = close, name = name, tail = tail} end val closeIn = Close.close o Close.make fun endOfStream is = let val (inp, _) = input is in V.length inp = 0 end fun mkInstream' {bufferContents, closed, reader} = let val next = ref (if closed then Closed else End) val base = case readerSel (reader, #getPos) of NONE => NONE | SOME getPos => SOME (getPos ()) val buf = case bufferContents of NONE => Buf {inp = empty, base = base, next = next} | SOME (lastRead, v) => if V.length v = 0 then Buf {inp = empty, base = base, next = ref (Eos {buf = Buf {inp = empty, base = base, next = next}})} else case (lastRead, base, xlatePos) of (true, SOME b, SOME {fromInt, toInt, ...}) => let val b = fromInt (Position.- (toInt b, Position.fromInt (V.length v))) in Buf {inp = v, base = SOME b, next = next} end | _ => Buf {inp = v, base = NONE, next = next} in In {common = {reader = reader, augmented_reader = PIO.augmentReader reader, tail = ref next}, pos = 0, buf = buf} end fun mkInstream (reader, bufferContents) = mkInstream' {bufferContents = if 0 = V.length bufferContents then NONE else SOME (false, bufferContents), closed = false, reader = reader} fun getReader (is as In {common = {reader, tail, ...}, ...}) = case !(!tail) of End => (!tail := Truncated; let val (inp, _) = inputAll is in (reader, inp) end) | _ => liftExn (instreamName is) "getReader" IO.ClosedStream fun filePosIn (is as In {common = {augmented_reader, ...}, pos, buf = Buf {base, ...}, ...}) = case base of SOME b => (case xlatePos of SOME {fromInt, toInt, ...} => (fromInt (Position.+ (Position.fromInt pos, toInt b))) | NONE => (case (readerSel (augmented_reader, #readVec), readerSel (augmented_reader, #getPos), readerSel (augmented_reader, #setPos)) of (SOME readVec, SOME getPos, SOME setPos) => let val curPos = getPos () in setPos b ; ignore (readVec pos) ; getPos () before setPos curPos end | _ => liftExn (instreamName is) "filePosIn" IO.RandomAccessNotSupported)) | NONE => liftExn (instreamName is) "filePosIn" IO.RandomAccessNotSupported end signature STREAM_IO_ARG = sig structure Array: MONO_ARRAY structure ArraySlice: MONO_ARRAY_SLICE structure PrimIO: PRIM_IO structure Vector: MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE sharing type PrimIO.elem = Vector.elem = VectorSlice.elem = Array.elem = ArraySlice.elem sharing type PrimIO.vector = Vector.vector = VectorSlice.vector = Array.vector = ArraySlice.vector sharing type PrimIO.vector_slice = VectorSlice.slice = ArraySlice.vector_slice sharing type PrimIO.array = Array.array = ArraySlice.array sharing type PrimIO.array_slice = ArraySlice.slice val someElem: PrimIO.elem end functor StreamIO (S: STREAM_IO_ARG): STREAM_IO = StreamIOExtra (open S val line = NONE val xlatePos = NONE) signature STREAM_IO_EXTRA_FILE_ARG = STREAM_IO_EXTRA_ARG functor StreamIOExtraFile (S: STREAM_IO_EXTRA_FILE_ARG): STREAM_IO_EXTRA_FILE = struct open S structure PIO = PrimIO structure V = Vector structure StreamIO = StreamIOExtra (S) open StreamIO fun liftExn name function cause = raise IO.Io {name = name, function = function, cause = cause} (*---------------*) (* outstream *) (*---------------*) fun writerSel (PIO.WR v, sel) = sel v fun outstreamName os = writerSel (outstreamWriter os, #name) fun outFd os = case writerSel (outstreamWriter os, #ioDesc) of SOME ioDesc => valOf (Posix.FileSys.iodToFD ioDesc) | NONE => liftExn (outstreamName os) "outFd" (Fail "") val openOutstreams : (outstream * {close: bool}) list ref = ref [] val mkOutstream'' = let val _ = Cleaner.addNew (Cleaner.atExit, fn () => List.app (fn (os, {close}) => if close then closeOut os else flushOut os) (!openOutstreams)) in fn {bufferMode, closeAtExit, closed, writer} => let val os = mkOutstream' {bufferMode = bufferMode, closed = closed, writer = writer} val _ = if closed then () else openOutstreams := ((os, {close = closeAtExit}) :: (!openOutstreams)) in os end end fun mkOutstream' {bufferMode, closed, writer} = mkOutstream'' {bufferMode = bufferMode, closeAtExit = true, closed = closed, writer = writer} fun mkOutstream (writer, bufferMode) = mkOutstream' {bufferMode = bufferMode, closed = false, writer = writer} val closeOut = fn os => let val _ = openOutstreams := List.filter (fn (os', _) => not (equalsOut (os, os'))) (!openOutstreams) in closeOut os end (*---------------*) (* instream *) (*---------------*) fun readerSel (PIO.RD v, sel) = sel v fun instreamName is = readerSel (instreamReader is, #name) fun inFd is = case readerSel (instreamReader is, #ioDesc) of SOME ioDesc => valOf (Posix.FileSys.iodToFD ioDesc) | NONE => liftExn (instreamName is) "inFd" (Fail "") val closeAtExits: Close.t list ref = ref [] val mkInstream'' = let val _ = Cleaner.addNew (Cleaner.atExit, fn () => List.app Close.close (!closeAtExits)) in fn {bufferContents, closeAtExit, closed, reader} => let val is = mkInstream' {bufferContents = bufferContents, closed = closed, reader = reader} val _ = if closed orelse not closeAtExit then () else closeAtExits := Close.make is :: (!closeAtExits) in is end end fun mkInstream' {bufferContents, closed, reader} = mkInstream'' {bufferContents = bufferContents, closeAtExit = true, closed = closed, reader = reader} fun mkInstream (reader, bufferContents) = mkInstream' {bufferContents = (if V.length bufferContents = 0 then NONE else SOME (false, bufferContents)), closed = false, reader = reader} val closeIn = fn is => let val _ = closeAtExits := List.filter (fn c => Close.equalsInstream (c, is)) (!closeAtExits) in closeIn is end end mlton-20100608/basis-library/io/stream-io.sig0000644000076600000240000000517011404435632017342 0ustar mtfstaffsignature STREAM_IO = sig type elem type instream type out_pos type outstream type pos type reader type vector type writer val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val filePosIn: instream -> pos val filePosOut: out_pos -> pos val flushOut: outstream -> unit val getBufferMode: outstream -> IO.buffer_mode val getPosOut: outstream -> out_pos val getReader: instream -> reader * vector val getWriter: outstream -> writer * IO.buffer_mode val input1: instream -> (elem * instream) option val input: instream -> vector * instream val inputAll: instream -> vector * instream val inputN: instream * int -> vector * instream val mkInstream: reader * vector -> instream val mkOutstream: writer * IO.buffer_mode -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val setBufferMode: outstream * IO.buffer_mode -> unit val setPosOut: out_pos -> outstream end signature STREAM_IO_EXTRA = sig include STREAM_IO type vector_slice structure Close: sig type t val close: t -> unit val equalsInstream: t * instream -> bool val make: instream -> t end val equalsIn: instream * instream -> bool val equalsOut: outstream * outstream -> bool val input1': instream -> elem option * instream val inputLine: instream -> (vector * instream) option val instreamReader: instream -> reader val mkInstream': {bufferContents: (bool * vector) option, closed: bool, reader: reader} -> instream val mkOutstream': {bufferMode: IO.buffer_mode, closed: bool, writer: writer} -> outstream val outputSlice: outstream * vector_slice -> unit val outstreamWriter: outstream -> writer end signature STREAM_IO_EXTRA_FILE = sig include STREAM_IO_EXTRA val inFd: instream -> Posix.IO.file_desc val mkInstream'': {bufferContents: (bool * vector) option, closeAtExit: bool, closed: bool, reader: reader} -> instream val outFd: outstream -> Posix.IO.file_desc val mkOutstream'': {bufferMode: IO.buffer_mode, closeAtExit: bool, closed: bool, writer: writer} -> outstream end mlton-20100608/basis-library/io/text-io.sig0000644000076600000240000000445111404435632017034 0ustar mtfstaffsignature TEXT_IO_GLOBAL = sig val print: string -> unit end signature TEXT_IO = sig include TEXT_IO_GLOBAL structure StreamIO: TEXT_STREAM_IO (* where type elem = Char.char *) (* redundant *) where type pos = TextPrimIO.pos where type reader = TextPrimIO.reader (* where type vector = CharVector.vector *) (* redundant *) where type writer = TextPrimIO.writer type elem = StreamIO.elem type instream type outstream type vector = StreamIO.vector val canInput: instream * int -> int option val closeIn: instream -> unit val closeOut: outstream -> unit val endOfStream: instream -> bool val flushOut: outstream -> unit val getInstream: instream -> StreamIO.instream val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputLine: instream -> string option val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val mkOutstream: StreamIO.outstream -> outstream val openAppend: string -> outstream val openIn: string -> instream val openOut: string -> outstream val openString: string -> instream val output1: outstream * elem -> unit val output: outstream * vector -> unit val outputSubstr: outstream * substring -> unit val scanStream: ((Char.char, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option val setInstream: (instream * StreamIO.instream) -> unit val setOutstream: outstream * StreamIO.outstream -> unit val setPosOut: outstream * StreamIO.out_pos -> unit val stdErr: outstream val stdIn: instream val stdOut: outstream end signature TEXT_IO_EXTRA = sig include TEXT_IO val equalsIn: instream * instream -> bool val inFd: instream -> Posix.IO.file_desc val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val outFd: outstream -> Posix.IO.file_desc end mlton-20100608/basis-library/io/text-io.sml0000644000076600000240000000260011404435632017037 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure TextIO: TEXT_IO_EXTRA = struct structure IO = ImperativeIOExtra (structure Array = CharArray structure ArraySlice = CharArraySlice structure PrimIO = TextPrimIO structure Vector = CharVector structure VectorSlice = CharVectorSlice val chunkSize = Int32.toInt (Primitive.Controls.bufSize) val fileTypeFlags = [PrimitiveFFI.Posix.FileSys.O.TEXT] val line = SOME {isLine = fn c => c = #"\n", lineElem = #"\n"} val mkReader = Posix.IO.mkTextReader val mkWriter = Posix.IO.mkTextWriter val someElem = (#"\000": Char.char) val xlatePos = SOME {fromInt = fn i => i, toInt = fn i => i}) open IO structure StreamIO = struct open StreamIO fun outputSubstr (s, ss) = outputSlice (s, ss) end val outputSubstr = outputSlice val openString = openVector fun print (s: string) = (output (stdOut, s); flushOut stdOut) end structure TextIOGlobal: TEXT_IO_GLOBAL = TextIO open TextIOGlobal mlton-20100608/basis-library/io/text-prim-io.sml0000644000076600000240000000130111404435632020001 0ustar mtfstaff(* Copyright (C) 2002-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure TextPrimIO : PRIM_IO where type array = CharArray.array where type vector = CharVector.vector where type elem = Char.char = PrimIO (structure Vector = CharVector structure VectorSlice = CharVectorSlice structure Array = CharArray structure ArraySlice = CharArraySlice type pos = Position.int val compare = Position.compare val someElem = #"\000": Char.char) mlton-20100608/basis-library/io/text-stream-io.sig0000644000076600000240000000041111404435632020315 0ustar mtfstaffsignature TEXT_STREAM_IO = sig include STREAM_IO where type elem = Char.char where type vector = CharVector.vector val inputLine: instream -> (string * instream) option val outputSubstr: outstream * substring -> unit end mlton-20100608/basis-library/libs/0000755000076600000240000000000011404470406015253 5ustar mtfstaffmlton-20100608/basis-library/libs/all.mlb0000644000076600000240000000057411404435631016526 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../basis.mlb ../pervasive.mlb ../basis-2002.mlb ../basis-1997.mlb ../basis-none.mlb ../mlton.mlb ../sml-nj.mlb ../unsafe.mlb ../c-types.mlb in end mlton-20100608/basis-library/libs/basis-1997/0000755000076600000240000000000011404470406016763 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/arrays-and-vectors/0000755000076600000240000000000011404470406022507 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/arrays-and-vectors/array.sig0000644000076600000240000000222411404435631024332 0ustar mtfstaffsignature ARRAY_1997 = sig eqtype 'a array type 'a vector val app: ('a -> unit) -> 'a array -> unit val appi: (int * 'a -> unit) -> 'a array * int * int option -> unit val array: int * 'a -> 'a array val copy: {src: 'a array, si: int, len: int option, dst: 'a array, di: int} -> unit val copyVec: {src: 'a vector, si: int, len: int option, dst: 'a array, di: int} -> unit val extract: 'a array * int * int option -> 'a vector val foldl: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a array * int * int option -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a array * int * int option -> 'b val fromList: 'a list -> 'a array val length: 'a array -> int val maxLen: int val modify: ('a -> 'a) -> 'a array -> unit val modifyi: (int * 'a -> 'a) -> 'a array * int * int option -> unit val sub: 'a array * int -> 'a val tabulate: int * (int -> 'a) -> 'a array val update: 'a array * int * 'a -> unit end mlton-20100608/basis-library/libs/basis-1997/arrays-and-vectors/mono-array.sig0000644000076600000240000000226611404435631025306 0ustar mtfstaffsignature MONO_ARRAY_1997 = sig eqtype array type elem structure Vector: MONO_VECTOR_1997 val maxLen: int val array: (int * elem) -> array val fromList: elem list -> array val tabulate: (int * (int -> elem)) -> array val length: array -> int val sub: (array * int) -> elem val update: (array * int * elem) -> unit val extract: (array * int * int option) -> Vector.vector val copy: {src: array, si: int, len: int option, dst: array, di: int} -> unit val copyVec: {src: Vector.vector, si: int, len: int option, dst: array, di: int} -> unit val appi: ((int * elem) -> unit) -> (array * int * int option) -> unit val app: (elem -> unit) -> array -> unit val foldli: ((int * elem * 'b) -> 'b) -> 'b -> (array * int * int option) -> 'b val foldri: ((int * elem * 'b) -> 'b) -> 'b -> (array * int * int option) -> 'b val foldl: ((elem * 'b) -> 'b) -> 'b -> array -> 'b val foldr: ((elem * 'b) -> 'b) -> 'b -> array -> 'b val modifyi: ((int * elem) -> elem) -> (array * int * int option) -> unit val modify: (elem -> elem) -> array -> unit end mlton-20100608/basis-library/libs/basis-1997/arrays-and-vectors/mono-array2.sig0000644000076600000240000000245211404435631025365 0ustar mtfstaffsignature MONO_ARRAY2_1997 = sig eqtype array type elem type region = {base: array, row: int, col: int, nrows: int option, ncols: int option} datatype traversal = datatype Array2.traversal structure Vector: MONO_VECTOR_1997 val array: (int * int * elem) -> array val fromList: elem list list -> array val tabulate: traversal -> (int * int * ((int * int) -> elem)) -> array val sub: (array * int * int) -> elem val update: (array * int * int * elem) -> unit val dimensions: array -> (int * int) val nCols: array -> int val nRows: array -> int val row: (array * int) -> Vector.vector val column: (array * int) -> Vector.vector val copy: {src: region, dst: array, dst_row: int, dst_col: int} -> unit val appi: Array2.traversal -> ((int * int * elem) -> unit) -> region -> unit val app: Array2.traversal -> (elem -> unit) -> array -> unit val modifyi: Array2.traversal -> ((int * int * elem) -> elem) -> region -> unit val modify: Array2.traversal -> (elem -> elem) -> array -> unit val foldi: Array2.traversal -> ((int * int * elem * 'b) -> 'b) -> 'b -> region -> 'b val fold: Array2.traversal -> ((elem * 'b) -> 'b) -> 'b -> array -> 'b end mlton-20100608/basis-library/libs/basis-1997/arrays-and-vectors/mono-vector-array-array2-convert.fun0000644000076600000240000000535511404435631031472 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MonoVectorArrayArray2Convert (structure Vector: MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE structure Array: MONO_ARRAY structure ArraySlice: MONO_ARRAY_SLICE structure Array2: MONO_ARRAY2 sharing type Vector.elem = VectorSlice.elem = Array.elem = ArraySlice.elem = Array2.elem sharing type Vector.vector = VectorSlice.vector = Array.vector = ArraySlice.vector = Array2.vector sharing type VectorSlice.slice = ArraySlice.vector_slice sharing type Array.array = ArraySlice.array) : sig structure Vector: MONO_VECTOR_1997 structure Array: MONO_ARRAY_1997 structure Array2: MONO_ARRAY2_1997 sharing type Vector.elem = Array.elem = Array2.elem sharing type Vector.vector = Array.Vector.vector = Array2.Vector.vector end = struct fun shift1 f (_, s, _) = fn (i:int, x) => f (i + s, x) fun shift2 f (_, s, _) = fn (i:int, x, y) => f (i + s, x, y) structure V = struct open Vector fun extract sl = VectorSlice.vector (VectorSlice.slice sl) fun mapi f sl = VectorSlice.mapi (shift1 f sl) (VectorSlice.slice sl) fun appi f sl = VectorSlice.appi (shift1 f sl) (VectorSlice.slice sl) fun foldli f b sl = VectorSlice.foldli (shift2 f sl) b (VectorSlice.slice sl) fun foldri f b sl = VectorSlice.foldri (shift2 f sl) b (VectorSlice.slice sl) end structure A = struct open Array structure Vector = V fun appi f sl = ArraySlice.appi (shift1 f sl) (ArraySlice.slice sl) fun copy {src, si, len, dst, di} = ArraySlice.copy {src = ArraySlice.slice (src, si, len), dst = dst, di = di} fun copyVec {src, si, len, dst, di} = ArraySlice.copyVec {src = VectorSlice.slice (src, si, len), dst = dst, di = di} fun extract sl = ArraySlice.vector (ArraySlice.slice sl) fun foldli f b sl = ArraySlice.foldli (shift2 f sl) b (ArraySlice.slice sl) fun foldri f b sl = ArraySlice.foldri (shift2 f sl) b (ArraySlice.slice sl) fun modifyi f sl = ArraySlice.modifyi (shift1 f sl) (ArraySlice.slice sl) end structure A2 = struct open Array2 structure Vector = V end structure Array = A structure Vector = V structure Array2 = A2 end mlton-20100608/basis-library/libs/basis-1997/arrays-and-vectors/mono-vector.sig0000644000076600000240000000161311404435631025465 0ustar mtfstaffsignature MONO_VECTOR_1997 = sig type vector type elem val maxLen: int val fromList: elem list -> vector val tabulate: (int * (int -> elem)) -> vector val length: vector -> int val sub: (vector * int) -> elem val extract: (vector * int * int option) -> vector val concat: vector list -> vector val mapi: ((int * elem) -> elem) -> (vector * int * int option) -> vector val map: (elem -> elem) -> vector -> vector val appi: ((int * elem) -> unit) -> (vector * int * int option) -> unit val app: (elem -> unit) -> vector -> unit val foldli: ((int * elem * 'a) -> 'a) -> 'a -> (vector * int * int option) -> 'a val foldri: ((int * elem * 'a) -> 'a) -> 'a -> (vector * int * int option) -> 'a val foldl: ((elem * 'a) -> 'a) -> 'a -> vector -> 'a val foldr: ((elem * 'a) -> 'a) -> 'a -> vector -> 'a end mlton-20100608/basis-library/libs/basis-1997/arrays-and-vectors/vector-array-convert.fun0000644000076600000240000000407311404435631027322 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor VectorArrayConvert (structure Vector: VECTOR structure VectorSlice: VECTOR_SLICE where type 'a slice = 'a VectorSlice.slice structure Array: ARRAY structure ArraySlice: ARRAY_SLICE where type 'a slice = 'a ArraySlice.slice) : sig structure Vector: VECTOR_1997 structure Array: ARRAY_1997 end = struct fun shift1 f (_, s, _) = fn (i:int, x) => f (i + s, x) fun shift2 f (_, s, _) = fn (i:int, x, y) => f (i + s, x, y) structure V = struct open Vector fun extract sl = VectorSlice.vector (VectorSlice.slice sl) fun mapi f sl = VectorSlice.mapi (shift1 f sl) (VectorSlice.slice sl) fun appi f sl = VectorSlice.appi (shift1 f sl) (VectorSlice.slice sl) fun foldli f b sl = VectorSlice.foldli (shift2 f sl) b (VectorSlice.slice sl) fun foldri f b sl = VectorSlice.foldri (shift2 f sl) b (VectorSlice.slice sl) end structure A = struct open Array fun appi f sl = ArraySlice.appi (shift1 f sl) (ArraySlice.slice sl) fun copy {src, si, len, dst, di} = ArraySlice.copy {src = ArraySlice.slice (src, si, len), dst = dst, di = di} fun copyVec {src, si, len, dst, di} = ArraySlice.copyVec {src = VectorSlice.slice (src, si, len), dst = dst, di = di} fun extract sl = ArraySlice.vector (ArraySlice.slice sl) fun foldli f b sl = ArraySlice.foldli (shift2 f sl) b (ArraySlice.slice sl) fun foldri f b sl = ArraySlice.foldri (shift2 f sl) b (ArraySlice.slice sl) fun modifyi f sl = ArraySlice.modifyi (shift1 f sl) (ArraySlice.slice sl) end structure Vector = V structure Array = A end mlton-20100608/basis-library/libs/basis-1997/arrays-and-vectors/vector.sig0000644000076600000240000000160411404435631024517 0ustar mtfstaffsignature VECTOR_1997 = sig eqtype 'a vector val maxLen: int val fromList: 'a list -> 'a vector val tabulate: (int * (int -> 'a)) -> 'a vector val length: 'a vector -> int val sub: ('a vector * int) -> 'a val extract: ('a vector * int * int option) -> 'a vector val concat: 'a vector list -> 'a vector val mapi: ((int * 'a) -> 'b) -> ('a vector * int * int option) -> 'b vector val map: ('a -> 'b) -> 'a vector -> 'b vector val appi: ((int * 'a) -> unit) -> ('a vector * int * int option) -> unit val app: ('a -> unit) -> 'a vector -> unit val foldli: ((int * 'a * 'b) -> 'b) -> 'b -> ('a vector * int * int option) -> 'b val foldri: ((int * 'a * 'b) -> 'b) -> 'b -> ('a vector * int * int option) -> 'b val foldl: (('a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val foldr: (('a * 'b) -> 'b) -> 'b -> 'a vector -> 'b end mlton-20100608/basis-library/libs/basis-1997/basis-1997.mlb0000644000076600000240000000520311404435631021170 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local ../basis-2002/basis-2002.mlb ../../basis-2002.mlb local ../basis-extra/basis-extra.mlb in signature SML90 structure SML90 end arrays-and-vectors/vector.sig arrays-and-vectors/array.sig arrays-and-vectors/vector-array-convert.fun arrays-and-vectors/mono-vector.sig arrays-and-vectors/mono-array.sig arrays-and-vectors/mono-array2.sig arrays-and-vectors/mono-vector-array-array2-convert.fun integer/word.sig text/string.sig text/substring.sig text/text-convert.fun real/IEEE-real.sig real/IEEE-real-convert.fun real/real.sig real/real-convert.fun posix/flags.sig posix/flags-convert.fun posix/process.sig posix/process-convert.fun posix/file-sys.sig posix/file-sys-convert.fun posix/io.sig posix/io-convert.fun posix/tty.sig posix/tty-convert.fun posix/posix.sig posix/posix-convert.fun system/timer.sig system/timer-convert.fun system/file-sys.sig system/file-sys-convert.fun system/path.sig system/path-convert.fun system/process.sig system/process-convert.fun system/os.sig system/os-convert.fun system/unix.sig system/unix-convert.fun io/io.sig io/io-convert.fun io/stream-io.sig io/text-stream-io.sig io/text-io.sig io/text-io-convert.fun io/bin-stream-io.sig io/bin-io.sig io/bin-io-convert.fun top-level/basis.sig top-level/basis.sml in signature MONO_ARRAY_1997 signature MONO_VECTOR_1997 signature REAL_1997 signature STRING_1997 signature SUBSTRING_1997 signature WORD_1997 signature ARRAY_1997 signature IEEE_REAL_1997 signature IO_1997 signature OS_1997 signature OS_FILE_SYS_1997 signature OS_PATH_1997 signature OS_PROCESS_1997 signature SML90 signature TIMER_1997 signature VECTOR_1997 signature MONO_ARRAY2_1997 signature POSIX_FLAGS_1997 signature POSIX_1997 signature POSIX_PROCESS_1997 signature POSIX_FILE_SYS_1997 signature POSIX_IO_1997 signature POSIX_TTY_1997 signature UNIX_1997 structure Basis1997 end end mlton-20100608/basis-library/libs/basis-1997/integer/0000755000076600000240000000000011404470406020420 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/integer/word.sig0000644000076600000240000000261611404435631022105 0ustar mtfstaffsignature WORD_1997 = sig eqtype word val wordSize: int val toLargeWord: word -> LargeWord.word val toLargeWordX: word -> LargeWord.word val fromLargeWord: LargeWord.word -> word val toLargeInt: word -> LargeInt.int val toLargeIntX: word -> LargeInt.int val fromLargeInt: LargeInt.int -> word val toInt: word -> Int.int val toIntX: word -> Int.int val fromInt: Int.int -> word val orb: (word * word) -> word val xorb: (word * word) -> word val andb: (word * word) -> word val notb: word -> word val << : (word * Word.word) -> word val >> : (word * Word.word) -> word val ~>> : (word * Word.word) -> word val + : (word * word) -> word val - : (word * word) -> word val * : (word * word) -> word val div: (word * word) -> word val mod: (word * word) -> word val compare: (word * word) -> order val > : (word * word) -> bool val < : (word * word) -> bool val >= : (word * word) -> bool val <= : (word * word) -> bool val min: (word * word) -> word val max: (word * word) -> word val fmt: StringCvt.radix -> word -> string val toString: word -> string val fromString: string -> word option val scan: StringCvt.radix -> (char, 'a) StringCvt.reader -> (word, 'a) StringCvt.reader end mlton-20100608/basis-library/libs/basis-1997/io/0000755000076600000240000000000011404470406017372 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/io/bin-io-convert.fun0000644000076600000240000000065511404435631022746 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor BinIOConvert (structure BinIO: BIN_IO) : BIN_IO_1997 = struct open BinIO structure StreamIO = struct open StreamIO val inputAll = #1 o inputAll end end mlton-20100608/basis-library/libs/basis-1997/io/bin-io.sig0000644000076600000240000000304311404435631021254 0ustar mtfstaffsignature BIN_IO_1997 = sig structure StreamIO: BIN_STREAM_IO_1997 type vector = StreamIO.vector type elem = StreamIO.elem type instream val canInput: instream * int -> int option val closeIn: instream -> unit val endOfStream: instream -> bool val getInstream: instream -> StreamIO.instream val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val openIn: string -> instream (* val scanStream: ((Char.char, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option *) val setInstream: (instream * StreamIO.instream) -> unit (* val getPosIn: instream -> StreamIO.in_pos val setPosIn: (instream * StreamIO.in_pos) -> unit *) type outstream val closeOut: outstream -> unit val flushOut: outstream -> unit val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val mkOutstream: StreamIO.outstream -> outstream val openAppend: string -> outstream val openOut: string -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val setOutstream: outstream * StreamIO.outstream -> unit (* val setPosOut: outstream * StreamIO.out_pos -> unit *) end mlton-20100608/basis-library/libs/basis-1997/io/bin-stream-io.sig0000644000076600000240000000024711404435631022550 0ustar mtfstaffsignature BIN_STREAM_IO_1997 = sig include STREAM_IO_1997 where type vector = Word8Vector.vector where type elem = Word8Vector.elem end mlton-20100608/basis-library/libs/basis-1997/io/io-convert.fun0000644000076600000240000000050511404435631022172 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor IOConvert (structure IO: IO) : IO_1997 = struct open IO exception TerminatedStream end mlton-20100608/basis-library/libs/basis-1997/io/io.sig0000644000076600000240000000060211404435631020504 0ustar mtfstaffsignature IO_1997 = sig exception Io of {cause: exn, function: string, name: string} exception BlockingNotSupported exception NonblockingNotSupported exception RandomAccessNotSupported exception TerminatedStream exception ClosedStream datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF end mlton-20100608/basis-library/libs/basis-1997/io/stream-io.sig0000644000076600000240000000225011404435631021776 0ustar mtfstaffsignature STREAM_IO_1997 = sig type elem type vector (* type reader type writer *) type instream type outstream type out_pos type pos (* = int *) val canInput: instream * int -> int option val closeIn: instream -> unit val endOfStream: instream -> bool val filePosOut: out_pos -> pos val input1: instream -> (elem * instream) option val input: instream -> vector * instream val inputAll: instream -> vector val inputN: instream * int -> vector * instream (* val mkInstream: reader * vector -> instream (* need to update this *) val getReader: instream -> reader * vector val output: outstream * vector -> unit val output1: outstream * elem -> unit val flushOut: outstream -> unit val closeOut: outstream -> unit val setBufferMode: outstream * IO.buffer_mode -> unit val getBufferMode: outstream -> IO.buffer_mode val mkOutstream: writer * IO.buffer_mode -> outstream val getWriter: outstream -> writer * IO.buffer_mode val getPosOut: outstream -> out_pos val setPosOut: out_pos -> outstream *) end mlton-20100608/basis-library/libs/basis-1997/io/text-io-convert.fun0000644000076600000240000000127211404435631023156 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TextIOConvert (structure TextIO: TEXT_IO) : TEXT_IO_1997 = struct open TextIO fun inputLine ins = case TextIO.inputLine ins of NONE => "" | SOME s => s structure StreamIO = struct open StreamIO val inputAll = #1 o inputAll fun inputLine ins = case StreamIO.inputLine ins of NONE => ("", ins) | SOME (s, ins) => (s, ins) end end mlton-20100608/basis-library/libs/basis-1997/io/text-io.sig0000644000076600000240000000343011404435631021470 0ustar mtfstaffsignature TEXT_IO_1997 = sig structure StreamIO: TEXT_STREAM_IO_1997 type vector = StreamIO.vector type elem = StreamIO.elem type instream val canInput: instream * int -> int option val closeIn: instream -> unit val endOfStream: instream -> bool val getInstream: instream -> StreamIO.instream val input1: instream -> elem option val input: instream -> vector val inputAll: instream -> vector val inputLine: instream -> string val inputN: instream * int -> vector val lookahead: instream -> elem option val mkInstream: StreamIO.instream -> instream val openIn: string -> instream val print: string -> unit val scanStream: ((Char.char, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option val setInstream: (instream * StreamIO.instream) -> unit val stdIn: instream (* val openString: string -> instream val getPosIn: instream -> StreamIO.in_pos val setPosIn: (instream * StreamIO.in_pos) -> unit *) type outstream val closeOut: outstream -> unit val flushOut: outstream -> unit val getOutstream: outstream -> StreamIO.outstream val getPosOut: outstream -> StreamIO.out_pos val mkOutstream: StreamIO.outstream -> outstream val openAppend: string -> outstream val openOut: string -> outstream val output1: outstream * elem -> unit val output: outstream * vector -> unit val outputSubstr: outstream * substring -> unit val setOutstream: outstream * StreamIO.outstream -> unit val stdErr: outstream val stdOut: outstream (* val setPosOut: outstream * StreamIO.out_pos -> unit *) end mlton-20100608/basis-library/libs/basis-1997/io/text-stream-io.sig0000644000076600000240000000042011404435631022755 0ustar mtfstaffsignature TEXT_STREAM_IO_1997 = sig include STREAM_IO_1997 where type vector = CharVector.vector where type elem = Char.char val inputLine: instream -> string * instream (* val outputSubstr: outstream * substring -> unit *) end mlton-20100608/basis-library/libs/basis-1997/posix/0000755000076600000240000000000011404470406020125 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/posix/file-sys-convert.fun0000644000076600000240000000133011404435631024046 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PosixFileSysConvert (structure FileSys: POSIX_FILE_SYS) : POSIX_FILE_SYS_1997 = struct open FileSys val readdir = fn d => case readdir d of NONE => "" | SOME s => s structure S = struct open S structure Flags = FlagsConvert(structure Flags = S) open Flags end structure O = struct open O structure Flags = FlagsConvert(structure Flags = O) open Flags end end mlton-20100608/basis-library/libs/basis-1997/posix/file-sys.sig0000644000076600000240000000721511404435631022372 0ustar mtfstaffsignature POSIX_FILE_SYS_1997 = sig eqtype uid eqtype gid eqtype file_desc val fdToWord: file_desc -> SysWord.word val wordToFD: SysWord.word -> file_desc (* identity functions *) val fdToIOD: file_desc -> OS.IO.iodesc val iodToFD: OS.IO.iodesc -> file_desc option type dirstream val opendir: string -> dirstream val readdir: dirstream -> string val rewinddir: dirstream -> unit val closedir: dirstream -> unit val chdir: string -> unit val getcwd: unit -> string val stdin: file_desc val stdout: file_desc val stderr: file_desc structure S: sig eqtype mode include POSIX_FLAGS_1997 where type flags = mode val irwxu: mode val irusr: mode val iwusr: mode val ixusr: mode val irwxg: mode val irgrp: mode val iwgrp: mode val ixgrp: mode val irwxo: mode val iroth: mode val iwoth: mode val ixoth: mode val isuid: mode val isgid: mode end structure O: sig include POSIX_FLAGS_1997 val append: flags val excl: flags val noctty: flags val nonblock: flags val sync: flags val trunc: flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val openf: string * open_mode * O.flags -> file_desc val createf: string * open_mode * O.flags * S.mode -> file_desc val creat: string * S.mode -> file_desc val umask: S.mode -> S.mode val link: {old: string, new: string} -> unit val mkdir: string * S.mode -> unit val mkfifo: string * S.mode -> unit val unlink: string -> unit val rmdir: string -> unit val rename: {old: string, new: string} -> unit val symlink: {old: string, new: string} -> unit val readlink: string -> string eqtype dev val wordToDev: SysWord.word -> dev val devToWord: dev -> SysWord.word eqtype ino val wordToIno: SysWord.word -> ino val inoToWord: ino -> SysWord.word structure ST: sig type stat val isDir: stat -> bool val isChr: stat -> bool val isBlk: stat -> bool val isReg: stat -> bool val isFIFO: stat -> bool val isLink: stat -> bool val isSock: stat -> bool val mode: stat -> S.mode val ino: stat -> ino val dev: stat -> dev val nlink: stat -> int val uid: stat -> uid val gid: stat -> gid val size: stat -> Position.int val atime: stat -> Time.time val mtime: stat -> Time.time val ctime: stat -> Time.time end val stat: string -> ST.stat val lstat: string -> ST.stat val fstat: file_desc -> ST.stat datatype access_mode = A_READ | A_WRITE | A_EXEC val access: string * access_mode list -> bool val chmod: string * S.mode -> unit val fchmod: file_desc * S.mode -> unit val chown: string * uid * gid -> unit val fchown: file_desc * uid * gid -> unit val utime: string * {actime: Time.time, modtime: Time.time} option -> unit val ftruncate: file_desc * Position.int -> unit val pathconf: string * string -> SysWord.word option val fpathconf: file_desc * string -> SysWord.word option end mlton-20100608/basis-library/libs/basis-1997/posix/flags-convert.fun0000644000076600000240000000057011404435631023414 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor FlagsConvert (structure Flags: BIT_FLAGS) : POSIX_FLAGS_1997 where type flags = Flags.flags = struct open Flags val wordTo = fromWord end mlton-20100608/basis-library/libs/basis-1997/posix/flags.sig0000644000076600000240000000041011404435631021721 0ustar mtfstaffsignature POSIX_FLAGS_1997 = sig eqtype flags val toWord: flags -> SysWord.word val wordTo: SysWord.word -> flags val flags: flags list -> flags val allSet: flags * flags -> bool val anySet: flags * flags -> bool end mlton-20100608/basis-library/libs/basis-1997/posix/io-convert.fun0000644000076600000240000000160411404435631022726 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PosixIOConvert (structure IO: POSIX_IO): POSIX_IO_1997 = struct open IO structure FD = struct open FD structure Flags = FlagsConvert (structure Flags = FD) open Flags end structure O = struct open O structure Flags = FlagsConvert (structure Flags = O) open Flags end fun readArr (fd, {buf, i, sz}) = IO.readArr (fd, Word8ArraySlice.slice (buf, i, sz)) fun writeArr (fd, {buf, i, sz}) = IO.writeArr (fd, Word8ArraySlice.slice (buf, i, sz)) fun writeVec (fd, {buf, i, sz}) = IO.writeVec (fd, Word8VectorSlice.slice (buf, i, sz)) end mlton-20100608/basis-library/libs/basis-1997/posix/io.sig0000644000076600000240000000447411404435631021252 0ustar mtfstaffsignature POSIX_IO_1997 = sig eqtype file_desc eqtype pid val pipe: unit -> {infd: file_desc, outfd: file_desc} val dup: file_desc -> file_desc val dup2: {old: file_desc, new: file_desc} -> unit val close: file_desc -> unit val readVec: file_desc * int -> Word8Vector.vector val readArr: file_desc * {buf: Word8Array.array, i: int, sz: int option} -> int val writeVec: file_desc * {buf: Word8Vector.vector, i: int, sz: int option} -> int val writeArr: file_desc * {buf: Word8Array.array, i: int, sz: int option} -> int datatype whence = SEEK_SET | SEEK_CUR | SEEK_END structure FD: sig include POSIX_FLAGS_1997 val cloexec: flags end structure O: sig include POSIX_FLAGS_1997 val append: flags val nonblock: flags val sync: flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val dupfd: {old: file_desc, base: file_desc} -> file_desc val getfd: file_desc -> FD.flags val setfd: file_desc * FD.flags -> unit val getfl: file_desc -> O.flags * open_mode val setfl: file_desc * O.flags -> unit val lseek: file_desc * Position.int * whence -> Position.int val fsync: file_desc -> unit datatype lock_type = F_RDLCK | F_WRLCK | F_UNLCK structure FLock: sig type flock val flock: { ltype: lock_type, whence: whence, start: Position.int, len: Position.int, pid: pid option } -> flock val ltype: flock -> lock_type val whence: flock -> whence val start: flock -> Position.int val len: flock -> Position.int val pid: flock -> pid option end val getlk: file_desc * FLock.flock -> FLock.flock val setlk: file_desc * FLock.flock -> FLock.flock val setlkw: file_desc * FLock.flock -> FLock.flock end mlton-20100608/basis-library/libs/basis-1997/posix/posix-convert.fun0000644000076600000240000000107211404435631023460 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PosixConvert (structure Posix : POSIX) : POSIX_1997 = struct open Posix structure Process = PosixProcessConvert(structure Process = Process) structure FileSys = PosixFileSysConvert(structure FileSys = FileSys) structure IO = PosixIOConvert(structure IO = IO) structure TTY = PosixTTYConvert(structure TTY = TTY) end mlton-20100608/basis-library/libs/basis-1997/posix/posix.sig0000644000076600000240000000050611404435631021775 0ustar mtfstaffsignature POSIX_1997 = sig structure Error: POSIX_ERROR structure Signal: POSIX_SIGNAL structure Process: POSIX_PROCESS_1997 structure ProcEnv: POSIX_PROC_ENV structure FileSys: POSIX_FILE_SYS_1997 structure IO: POSIX_IO_1997 structure SysDB: POSIX_SYS_DB structure TTY: POSIX_TTY_1997 end mlton-20100608/basis-library/libs/basis-1997/posix/process-convert.fun0000644000076600000240000000074411404435631024001 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PosixProcessConvert (structure Process: POSIX_PROCESS) : POSIX_PROCESS_1997 = struct open Process structure W = struct open W structure Flags = FlagsConvert(structure Flags = W) open Flags end end mlton-20100608/basis-library/libs/basis-1997/posix/process.sig0000644000076600000240000000230311404435631022306 0ustar mtfstaffsignature POSIX_PROCESS_1997 = sig eqtype signal eqtype pid val wordToPid: SysWord.word -> pid val pidToWord: pid -> SysWord.word val fork: unit -> pid option val exec: string * string list -> 'a val exece: string * string list * string list -> 'a val execp: string * string list -> 'a datatype waitpid_arg = W_ANY_CHILD | W_CHILD of pid | W_SAME_GROUP | W_GROUP of pid datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal structure W : sig include POSIX_FLAGS_1997 val untraced: flags end val wait: unit -> pid * exit_status val waitpid: waitpid_arg * W.flags list -> pid * exit_status val waitpid_nh: waitpid_arg * W.flags list -> (pid * exit_status) option val exit: Word8.word -> 'a datatype killpid_arg = K_PROC of pid | K_SAME_GROUP | K_GROUP of pid val kill: killpid_arg * signal -> unit val alarm: Time.time -> Time.time val pause: unit -> unit val sleep: Time.time -> Time.time end mlton-20100608/basis-library/libs/basis-1997/posix/tty-convert.fun0000644000076600000240000000163411404435631023142 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PosixTTYConvert (structure TTY: POSIX_TTY) : POSIX_TTY_1997 = struct open TTY structure I = struct open I structure Flags = FlagsConvert(structure Flags = I) open Flags end structure O = struct open O structure Flags = FlagsConvert(structure Flags = O) open Flags end structure C = struct open C structure Flags = FlagsConvert(structure Flags = C) open Flags end structure L = struct open L structure Flags = FlagsConvert(structure Flags = L) open Flags end open TC end mlton-20100608/basis-library/libs/basis-1997/posix/tty.sig0000644000076600000240000001037211404435631021455 0ustar mtfstaffsignature POSIX_TTY_1997 = sig eqtype pid eqtype file_desc structure V: sig val eof: int val eol: int val erase: int val intr: int val kill: int val min: int val quit: int val susp: int val time: int val start: int val stop: int val nccs: int type cc val cc: (int * char) list -> cc val update: cc * (int * char) list -> cc val sub: cc * int -> char end structure I: sig include POSIX_FLAGS_1997 val brkint: flags val icrnl: flags val ignbrk: flags val igncr: flags val ignpar: flags val inlcr: flags val inpck: flags val istrip: flags val ixoff: flags val ixon: flags val parmrk: flags end structure O: sig include POSIX_FLAGS_1997 val opost: flags end structure C: sig include POSIX_FLAGS_1997 val clocal: flags val cread: flags val cs5: flags val cs6: flags val cs7: flags val cs8: flags val csize: flags val cstopb: flags val hupcl: flags val parenb: flags val parodd: flags end structure L: sig include POSIX_FLAGS_1997 val echo: flags val echoe: flags val echok: flags val echonl: flags val icanon: flags val iexten: flags val isig: flags val noflsh: flags val tostop: flags end eqtype speed val compareSpeed: speed * speed -> order val speedToWord: speed -> SysWord.word val wordToSpeed: SysWord.word -> speed val b0: speed val b50: speed val b75: speed val b110: speed val b134: speed val b150: speed val b200: speed val b300: speed val b600: speed val b1200: speed val b1800: speed val b2400: speed val b4800: speed val b9600: speed val b19200: speed val b38400: speed type termios val termios: {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} -> termios val fieldsOf: termios -> {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} val getiflag: termios -> I.flags val getoflag: termios -> O.flags val getcflag: termios -> C.flags val getlflag: termios -> L.flags val getcc: termios -> V.cc structure CF: sig val getospeed: termios -> speed val setospeed: termios * speed -> termios val getispeed: termios -> speed val setispeed: termios * speed -> termios end structure TC: sig eqtype set_action val sanow: set_action val sadrain: set_action val saflush: set_action eqtype flow_action val ooff: flow_action val oon: flow_action val ioff: flow_action val ion: flow_action eqtype queue_sel val iflush: queue_sel val oflush: queue_sel val ioflush: queue_sel end val getattr: file_desc -> termios val setattr: file_desc * TC.set_action * termios -> unit val sendbreak: file_desc * int -> unit val drain: file_desc -> unit val flush: file_desc * TC.queue_sel -> unit val flow: file_desc * TC.flow_action -> unit val getpgrp: file_desc -> pid val setpgrp: file_desc * pid -> unit end mlton-20100608/basis-library/libs/basis-1997/real/0000755000076600000240000000000011404470406017706 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/real/IEEE-real-convert.fun0000644000076600000240000000320111404435631023523 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor IEEERealConvert (structure IEEEReal: IEEE_REAL): sig include IEEE_REAL_1997 val >> : IEEEReal.float_class -> float_class val << : float_class -> IEEEReal.float_class val >>> : IEEEReal.decimal_approx -> decimal_approx val <<< : decimal_approx -> IEEEReal.decimal_approx end = struct open IEEEReal datatype nan_mode = QUIET | SIGNALLING datatype float_class = NAN of nan_mode | INF | ZERO | NORMAL | SUBNORMAL val >> = fn IEEEReal.NAN => NAN QUIET | IEEEReal.INF => INF | IEEEReal.ZERO => ZERO | IEEEReal.NORMAL => NORMAL | IEEEReal.SUBNORMAL => SUBNORMAL val << = fn NAN _ => IEEEReal.NAN | INF => IEEEReal.INF | ZERO => IEEEReal.ZERO | NORMAL => IEEEReal.NORMAL | SUBNORMAL => IEEEReal.SUBNORMAL type decimal_approx = {kind: float_class, sign: bool, digits: int list, exp: int} val <<< = fn {kind, sign, digits, exp} => {class = << kind, sign = sign, digits = digits, exp = exp} val >>> = fn {class, sign, digits, exp} => {kind = >> class, sign = sign, digits = digits, exp = exp} val toString = toString o <<< val fromString = fn s => Option.map (>>>) (fromString s) end structure IEEEReal1997 = IEEERealConvert(structure IEEEReal = IEEEReal) mlton-20100608/basis-library/libs/basis-1997/real/IEEE-real.sig0000644000076600000240000000131311404435631022041 0ustar mtfstaffsignature IEEE_REAL_1997 = sig exception Unordered datatype real_order = LESS | EQUAL | GREATER | UNORDERED datatype nan_mode = QUIET | SIGNALLING datatype float_class = NAN of nan_mode | INF | ZERO | NORMAL | SUBNORMAL datatype rounding_mode = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO val setRoundingMode: rounding_mode -> unit val getRoundingMode: unit -> rounding_mode type decimal_approx = {kind: float_class, sign: bool, digits: int list, exp: int} val toString: decimal_approx -> string val fromString: string -> decimal_approx option end mlton-20100608/basis-library/libs/basis-1997/real/real-convert.fun0000644000076600000240000000070111404435631023020 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RealConvert (structure Real: REAL) : REAL_1997 = struct open Real val class = IEEEReal1997.>> o class val toDecimal = IEEEReal1997.>>> o toDecimal val fromDecimal = fromDecimal o IEEEReal1997.<<< end mlton-20100608/basis-library/libs/basis-1997/real/real.sig0000644000076600000240000000473011404435631021342 0ustar mtfstaffsignature REAL_1997 = sig type real structure Math: MATH where type real = real val ceil: real -> Int.int val floor: real -> Int.int val round: real -> Int.int val trunc: real -> Int.int val radix: int val precision: int val maxFinite: real val minPos: real val minNormalPos: real val posInf: real val negInf: real val + : real * real -> real val - : real * real -> real val * : real * real -> real val / : real * real -> real val rem: real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val ~ : real -> real val abs: real -> real val min: real * real -> real val max: real * real -> real val sign: real -> int val signBit: real -> bool val sameSign: real * real -> bool val copySign: real * real -> real val compare: real * real -> order val compareReal: real * real -> IEEEReal1997.real_order val < : real * real -> bool val <= : real * real -> bool val > : real * real -> bool val >= : real * real -> bool val == : real * real -> bool val != : real * real -> bool val ?= : real * real -> bool val unordered: real * real -> bool val isFinite: real -> bool val isNan: real -> bool val isNormal: real -> bool val class: real -> IEEEReal1997.float_class val fmt: StringCvt.realfmt -> real -> string val toString: real -> string val scan: (char, 'a) StringCvt.reader -> (real, 'a) StringCvt.reader val fromString: string -> real option val toManExp: real -> {man: real, exp: int} val fromManExp: {man: real, exp: int} -> real val split: real -> {whole: real, frac: real} val realMod: real -> real val nextAfter: real * real -> real val checkFloat: real -> real val realFloor: real -> real val realCeil: real -> real val realTrunc: real -> real val toInt: IEEEReal1997.rounding_mode -> real -> int val toLargeInt: IEEEReal1997.rounding_mode -> real -> LargeInt.int val fromInt: int -> real val fromLargeInt: LargeInt.int -> real val toLarge: real -> LargeReal.real val fromLarge: IEEEReal1997.rounding_mode -> LargeReal.real -> real val toDecimal: real -> IEEEReal1997.decimal_approx val fromDecimal: IEEEReal1997.decimal_approx -> real option end mlton-20100608/basis-library/libs/basis-1997/system/0000755000076600000240000000000011404470406020307 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/system/file-sys-convert.fun0000644000076600000240000000064611404435631024241 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor OSFileSysConvert (structure FileSys : OS_FILE_SYS) : OS_FILE_SYS_1997 = struct open FileSys val readDir = fn d => case readDir d of NONE => "" | SOME s => s end mlton-20100608/basis-library/libs/basis-1997/system/file-sys.sig0000644000076600000240000000205511404435631022551 0ustar mtfstaffsignature OS_FILE_SYS_1997 = sig type dirstream val openDir: string -> dirstream val readDir: dirstream -> string val rewindDir: dirstream -> unit val closeDir: dirstream -> unit val chDir: string -> unit val getDir: unit -> string val mkDir: string -> unit val rmDir: string -> unit val isDir: string -> bool val isLink: string -> bool val readLink: string -> string val fullPath: string -> string val realPath: string -> string val modTime: string -> Time.time val fileSize: string -> Position.int val setTime: string * Time.time option -> unit val remove: string -> unit val rename: {old: string, new: string} -> unit datatype access_mode = A_READ | A_WRITE | A_EXEC val access: string * access_mode list -> bool val tmpName: unit -> string eqtype file_id val fileId: string -> file_id val hash: file_id -> word val compare: file_id * file_id -> order end mlton-20100608/basis-library/libs/basis-1997/system/os-convert.fun0000644000076600000240000000075711404435631023132 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor OSConvert (structure OS: OS) : OS_1997 = struct open OS structure FileSys = OSFileSysConvert(structure FileSys = FileSys) structure Path = OSPathConvert(structure Path = Path) structure Process = OSProcessConvert(structure Process = Process) end mlton-20100608/basis-library/libs/basis-1997/system/os.sig0000644000076600000240000000057411404435631021443 0ustar mtfstaffsignature OS_1997 = sig eqtype syserror exception SysErr of string * syserror option val errorMsg: syserror -> string val errorName: syserror -> string val syserror: string -> syserror option structure FileSys: OS_FILE_SYS_1997 structure Path: OS_PATH_1997 structure Process: OS_PROCESS_1997 structure IO: OS_IO end mlton-20100608/basis-library/libs/basis-1997/system/path-convert.fun0000644000076600000240000000101111404435631023425 0ustar mtfstaff(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor OSPathConvert (structure Path : OS_PATH) : OS_PATH_1997 = struct open Path val mkAbsolute = fn (path, relativeTo) => mkAbsolute {path = path, relativeTo = relativeTo} val mkRelative = fn (path, relativeTo) => mkRelative {path = path, relativeTo = relativeTo} end mlton-20100608/basis-library/libs/basis-1997/system/path.sig0000644000076600000240000000240211404435631021746 0ustar mtfstaffsignature OS_PATH_1997 = sig exception Path exception InvalidArc val parentArc : string val currentArc : string val validVolume : {isAbs : bool, vol : string} -> bool val fromString : string -> {isAbs : bool, vol : string, arcs : string list} val toString : {isAbs : bool, vol : string, arcs : string list} -> string val getVolume : string -> string val getParent : string -> string val splitDirFile : string -> {dir : string, file : string} val joinDirFile : {dir : string, file : string} -> string val dir : string -> string val file : string -> string val splitBaseExt : string -> {base : string, ext : string option} val joinBaseExt : {base : string, ext : string option} -> string val base : string -> string val ext : string -> string option val mkCanonical : string -> string val isCanonical : string -> bool val mkAbsolute : (string * string) -> string val mkRelative : (string * string) -> string val isAbsolute : string -> bool val isRelative : string -> bool val isRoot : string -> bool val concat : (string * string) -> string val toUnixPath : string -> string val fromUnixPath : string -> string end mlton-20100608/basis-library/libs/basis-1997/system/process-convert.fun0000644000076600000240000000050711404435631024160 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor OSProcessConvert (structure Process : OS_PROCESS) : OS_PROCESS_1997 = struct open Process end mlton-20100608/basis-library/libs/basis-1997/system/process.sig0000644000076600000240000000053411404435631022474 0ustar mtfstaffsignature OS_PROCESS_1997 = sig (* VIOLATION *) (* eqtype status *) type status val atExit: (unit -> unit) -> unit val exit: status -> 'a val failure: status val getEnv: string -> string option val success: status val system: string -> status val terminate: status -> 'a end mlton-20100608/basis-library/libs/basis-1997/system/timer-convert.fun0000644000076600000240000000076211404435631023625 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TimerConvert (structure Timer: TIMER) : TIMER_1997 = struct open Timer val checkCPUTimer = fn cput => let val {usr, sys} = checkCPUTimer cput val gc = checkGCTime cput in {usr = usr, sys = sys, gc = gc} end end mlton-20100608/basis-library/libs/basis-1997/system/timer.sig0000644000076600000240000000061011404435631022131 0ustar mtfstaffsignature TIMER_1997 = sig type cpu_timer type real_timer val startCPUTimer: unit -> cpu_timer val checkCPUTimer: cpu_timer -> {usr: Time.time, sys: Time.time, gc: Time.time} val totalCPUTimer: unit -> cpu_timer val startRealTimer: unit -> real_timer val checkRealTimer: real_timer -> Time.time val totalRealTimer: unit -> real_timer end mlton-20100608/basis-library/libs/basis-1997/system/unix-convert.fun0000644000076600000240000000055111404435631023464 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor UnixConvert (structure Unix: UNIX) : UNIX_1997 = struct open Unix type proc = (TextIO.instream, TextIO.outstream) proc end mlton-20100608/basis-library/libs/basis-1997/system/unix.sig0000644000076600000240000000051611404435631022001 0ustar mtfstaffsignature UNIX_1997 = sig type proc type signal val executeInEnv: string * string list * string list -> proc val execute: string * string list -> proc val streamsOf: proc -> TextIO.instream * TextIO.outstream val reap: proc -> OS.Process.status val kill: proc * signal -> unit end mlton-20100608/basis-library/libs/basis-1997/text/0000755000076600000240000000000011404470406017747 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/text/string.sig0000644000076600000240000000242511404435631021765 0ustar mtfstaffsignature STRING_1997 = sig eqtype string structure Char: CHAR val maxSize: int val size: string -> int val sub: (string * int) -> Char.char val extract: (string * int * int option) -> string val substring: (string * int * int) -> string val concat: string list -> string val ^ : (string * string) -> string val str: Char.char -> string val implode: Char.char list -> string val explode: string -> Char.char list val map: (Char.char -> Char.char) -> string -> string val translate: (Char.char -> string) -> string -> string val tokens: (Char.char -> bool) -> string -> string list val fields: (Char.char -> bool) -> string -> string list val isPrefix: string -> string -> bool val compare: (string * string) -> order val collate: (((Char.char * Char.char) -> order) -> (string * string) -> order) val < : (string * string) -> bool val <= : (string * string) -> bool val > : (string * string) -> bool val >= : (string * string) -> bool val fromString: String.string -> string option val toString: string -> String.string val fromCString: String.string -> string option val toCString: string -> String.string end mlton-20100608/basis-library/libs/basis-1997/text/substring.sig0000644000076600000240000000432511404435631022500 0ustar mtfstaffsignature SUBSTRING_1997 = sig structure String: STRING_1997 type substring val base: substring -> (String.string * int * int) val string: substring -> String.string val extract: (String.string * int * int option) -> substring val substring: (String.string * int * int) -> substring val all: String.string -> substring val isEmpty: substring -> bool val getc: substring -> (String.Char.char * substring) option val first: substring -> String.Char.char option val triml: int -> substring -> substring val trimr: int -> substring -> substring val slice: (substring * int * int option) -> substring val sub: (substring * int) -> String.Char.char val size: substring -> int val concat: substring list -> String.string val explode: substring -> String.Char.char list val isPrefix: String.string -> substring -> bool val compare: (substring * substring) -> order val collate: ((String.Char.char * String.Char.char) -> order) -> (substring * substring) -> order val splitl: ((String.Char.char -> bool) -> substring -> (substring * substring)) val splitr: ((String.Char.char -> bool) -> substring -> (substring * substring)) val splitAt: (substring * int) -> (substring * substring) val dropl: (String.Char.char -> bool) -> substring -> substring val dropr: (String.Char.char -> bool) -> substring -> substring val takel: (String.Char.char -> bool) -> substring -> substring val taker: (String.Char.char -> bool) -> substring -> substring val position: String.string -> substring -> (substring * substring) val span: (substring * substring) -> substring val translate: ((String.Char.char -> String.string) -> substring -> String.string) val tokens: (String.Char.char -> bool) -> substring -> substring list val fields: (String.Char.char -> bool) -> substring -> substring list val foldl: ((String.Char.char * 'a) -> 'a) -> 'a -> substring -> 'a val foldr: ((String.Char.char * 'a) -> 'a) -> 'a -> substring -> 'a val app: (String.Char.char -> unit) -> substring -> unit end mlton-20100608/basis-library/libs/basis-1997/text/text-convert.fun0000644000076600000240000000146611404435631023133 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TextConvert (structure Text: TEXT): sig structure Char: CHAR structure String: STRING_1997 structure Substring: SUBSTRING_1997 sharing type Char.char = String.Char.char = Substring.String.Char.char sharing type String.string = Substring.String.string end = struct structure Char = Text.Char structure String = struct structure Char = Char open Text.String end structure Substring = struct structure String = String open Text.Substring val all = full end end mlton-20100608/basis-library/libs/basis-1997/top-level/0000755000076600000240000000000011404470406020672 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-1997/top-level/basis-funs.sml0000644000076600000240000000037111404435631023463 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Required functors *) (* Optional functors *) mlton-20100608/basis-library/libs/basis-1997/top-level/basis-sigs.sml0000644000076600000240000000366111404435631023462 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Required signatures *) signature CHAR = CHAR signature INTEGER = INTEGER signature MATH = MATH signature IMPERATIVE_IO = IMPERATIVE_IO signature MONO_ARRAY = MONO_ARRAY_1997 signature MONO_VECTOR = MONO_VECTOR_1997 signature PRIM_IO = PRIM_IO signature REAL = REAL_1997 signature STREAM_IO = STREAM_IO signature STRING = STRING_1997 signature SUBSTRING = SUBSTRING_1997 signature TEXT_IO = TEXT_IO signature TEXT_STREAM_IO = TEXT_STREAM_IO signature WORD = WORD_1997 signature ARRAY = ARRAY_1997 signature BIN_IO = BIN_IO signature BOOL = BOOL signature BYTE = BYTE signature COMMAND_LINE = COMMAND_LINE signature DATE = DATE signature GENERAL = GENERAL signature IEEE_REAL = IEEE_REAL_1997 signature IO = IO_1997 signature LIST = LIST signature LIST_PAIR = LIST_PAIR signature OPTION = OPTION signature OS = OS_1997 signature OS_FILE_SYS = OS_FILE_SYS_1997 signature OS_PATH = OS_PATH_1997 signature OS_PROCESS = OS_PROCESS_1997 signature OS_IO = OS_IO signature SML90 = SML90 signature STRING_CVT = STRING_CVT signature TIME = TIME signature TIMER = TIMER_1997 signature VECTOR = VECTOR_1997 (* Optional signatures *) signature ARRAY2 = ARRAY2 signature INT_INF = INT_INF (* signature LOCALE = LOCALE *) signature MONO_ARRAY2 = MONO_ARRAY2_1997 (* signature MULTIBYTE = MULTIBYTE *) signature PACK_REAL = PACK_REAL signature PACK_WORD = PACK_WORD signature POSIX_FLAGS = POSIX_FLAGS_1997 signature POSIX = POSIX_1997 signature POSIX_ERROR = POSIX_ERROR signature POSIX_SIGNAL = POSIX_SIGNAL signature POSIX_PROCESS = POSIX_PROCESS_1997 signature POSIX_PROC_ENV = POSIX_PROC_ENV signature POSIX_FILE_SYS = POSIX_FILE_SYS_1997 signature POSIX_IO = POSIX_IO_1997 signature POSIX_SYS_DB = POSIX_SYS_DB signature POSIX_TTY = POSIX_TTY_1997 signature UNIX = UNIX_1997 mlton-20100608/basis-library/libs/basis-1997/top-level/basis.sig0000644000076600000240000001750511404435631022510 0ustar mtfstaffsignature BASIS_1997 = sig (* Top-level types *) eqtype unit eqtype int eqtype word type real eqtype char eqtype string type substring type exn eqtype 'a array eqtype 'a vector datatype ref = datatype ref datatype bool = datatype bool datatype 'a option = NONE | SOME of 'a datatype order = LESS | EQUAL | GREATER datatype list = datatype list (* Top-level exceptions *) exception Bind exception Chr exception Div exception Domain exception Empty exception Fail of string exception Match exception Option exception Overflow exception Size exception Span exception Subscript (* Top-level values *) val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val @ : ('a list * 'a list) -> 'a list val ^ : string * string -> string val app : ('a -> unit) -> 'a list -> unit val before : 'a * unit -> 'a val ceil : real -> int val chr : int -> char val concat : string list -> string val exnMessage : exn -> string val exnName : exn -> string val explode : string -> char list val floor : real -> int val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val getOpt : ('a option * 'a) -> 'a val hd : 'a list -> 'a val ignore : 'a -> unit val isSome : 'a option -> bool val implode : char list -> string val length : 'a list -> int val map : ('a -> 'b) -> 'a list -> 'b list val not : bool -> bool val null : 'a list -> bool val o : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b val ord : char -> int val print : string -> unit val real : int -> real (* val ref : 'a -> 'a ref *) val rev : 'a list -> 'a list val round : real -> int val size : string -> int val str : char -> string val substring : string * int * int -> string val tl : 'a list -> 'a list val trunc : real -> int (* val use : string -> unit *) val valOf : 'a option -> 'a val vector : 'a list -> 'a vector val = : ''a * ''a -> bool val <> : ''a * ''a -> bool (* Required structures *) structure Array : ARRAY_1997 structure BinIO : BIN_IO_1997 (* structure BinPrimIO : PRIM_IO *) structure Bool : BOOL structure Byte : BYTE structure Char : CHAR structure CharArray : MONO_ARRAY_1997 structure CharVector : MONO_VECTOR_1997 structure CommandLine : COMMAND_LINE structure Date : DATE structure General : GENERAL structure IEEEReal : IEEE_REAL_1997 structure Int : INTEGER structure IO : IO_1997 structure LargeInt : INTEGER structure LargeReal : REAL_1997 structure LargeWord : WORD_1997 structure List : LIST structure ListPair : LIST_PAIR structure Math : MATH structure Option : OPTION structure OS : OS_1997 (* structure OS.FileSys : OS_FILE_SYS_1997 structure OS.Path : OS_PATH_1997 structure OS.Process : OS_PROCESS_1997 structure OS.IO : OS_IO *) structure Position : INTEGER structure Real : REAL_1997 structure SML90 : SML90 structure String : STRING_1997 structure StringCvt : STRING_CVT structure Substring : SUBSTRING_1997 structure TextIO : TEXT_IO_1997 (* structure TextPrimIO : PRIM_IO *) structure Time : TIME structure Timer : TIMER_1997 structure Vector : VECTOR_1997 structure Word : WORD_1997 structure Word8 : WORD_1997 structure Word8Array : MONO_ARRAY_1997 structure Word8Vector : MONO_VECTOR_1997 (* Optional structures *) structure Array2 : ARRAY2 structure BoolArray : MONO_ARRAY_1997 structure BoolArray2 : MONO_ARRAY2_1997 structure BoolVector : MONO_VECTOR_1997 structure CharArray2 : MONO_ARRAY2_1997 structure FixedInt : INTEGER structure IntInf : INT_INF structure Int1: INTEGER structure Int2: INTEGER structure Int3: INTEGER structure Int4: INTEGER structure Int5: INTEGER structure Int6: INTEGER structure Int7: INTEGER structure Int8: INTEGER structure Int9: INTEGER structure Int10: INTEGER structure Int11: INTEGER structure Int12: INTEGER structure Int13: INTEGER structure Int14: INTEGER structure Int15: INTEGER structure Int16: INTEGER structure Int17: INTEGER structure Int18: INTEGER structure Int19: INTEGER structure Int20: INTEGER structure Int21: INTEGER structure Int22: INTEGER structure Int23: INTEGER structure Int24: INTEGER structure Int25: INTEGER structure Int26: INTEGER structure Int27: INTEGER structure Int28: INTEGER structure Int29: INTEGER structure Int30: INTEGER structure Int31: INTEGER structure Int32: INTEGER structure Int64: INTEGER structure IntArray : MONO_ARRAY_1997 structure Int32Array : MONO_ARRAY_1997 structure IntArray2 : MONO_ARRAY2_1997 structure Int32Array2 : MONO_ARRAY2_1997 structure IntVector : MONO_VECTOR_1997 structure Int32Vector : MONO_VECTOR_1997 (* structure Locale : LOCALE structure MultiByte : MULTIBYTE *) (* structure PackReal64Big : PACK_REAL *) structure PackReal64Little : PACK_REAL (* structure PackRealBig : PACK_REAL *) structure PackRealLittle : PACK_REAL structure Pack32Big : PACK_WORD structure Pack32Little : PACK_WORD structure Posix : POSIX_1997 (* structure Posix.Error : POSIX_ERROR structure Posix.Signal : POSIX_SIGNAL structure Posix.Process : POSIX_PROCESS_1997 structure Posix.ProcEnv : POSIX_PROC_ENV structure Posix.FileSys : POSIX_FILE_SYS_1997 structure Posix.IO : POSIX_IO_1997 structure Posix.SysDB : POSIX_SYS_DB structure Posix.TTY : POSIX_TTY_1997 *) structure RealArray : MONO_ARRAY_1997 structure RealVector : MONO_VECTOR_1997 structure Real64 : REAL_1997 structure Real64Array : MONO_ARRAY_1997 structure Real64Vector : MONO_VECTOR_1997 structure RealArray2 : MONO_ARRAY2_1997 structure Real64Array2 : MONO_ARRAY2_1997 structure SysWord : WORD_1997 (* structure WideChar : CHAR structure WideCharArray : MONO_ARRAY_1997 structure WideCharArray2 : MONO_ARRAY2_1997 structure WideCharVector : MONO_VECTOR_1997 structure WideString : STRING structure WideSubstring : SUBSTRING structure WideTextPrimIO : PRIM_IO structure WideTextIO : TEXT_IO *) structure Word1: WORD_1997 structure Word2: WORD_1997 structure Word3: WORD_1997 structure Word4: WORD_1997 structure Word5: WORD_1997 structure Word6: WORD_1997 structure Word7: WORD_1997 structure Word9: WORD_1997 structure Word10: WORD_1997 structure Word11: WORD_1997 structure Word12: WORD_1997 structure Word13: WORD_1997 structure Word14: WORD_1997 structure Word15: WORD_1997 structure Word16: WORD_1997 structure Word17: WORD_1997 structure Word18: WORD_1997 structure Word19: WORD_1997 structure Word20: WORD_1997 structure Word21: WORD_1997 structure Word22: WORD_1997 structure Word23: WORD_1997 structure Word24: WORD_1997 structure Word25: WORD_1997 structure Word26: WORD_1997 structure Word27: WORD_1997 structure Word28: WORD_1997 structure Word29: WORD_1997 structure Word30: WORD_1997 structure Word31: WORD_1997 structure Word32: WORD_1997 structure Word64: WORD_1997 structure Word8Array2 : MONO_ARRAY2_1997 structure Unix : UNIX_1997 end mlton-20100608/basis-library/libs/basis-1997/top-level/basis.sml0000644000076600000240000001266311404435631022521 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Basis1997: BASIS_1997 = struct open Basis2002 structure SML90 = SML90 structure VectorArray = VectorArrayConvert (structure Vector = Vector structure VectorSlice = VectorSlice structure Array = Array structure ArraySlice = ArraySlice) structure Vector = VectorArray.Vector structure Array = VectorArray.Array structure BoolVectorArray = MonoVectorArrayArray2Convert (structure Vector = BoolVector structure VectorSlice = BoolVectorSlice structure Array = BoolArray structure ArraySlice = BoolArraySlice structure Array2 = BoolArray2) structure BoolVector = BoolVectorArray.Vector structure BoolArray = BoolVectorArray.Array structure BoolArray2 = BoolVectorArray.Array2 structure CharVectorArray = MonoVectorArrayArray2Convert (structure Vector = CharVector structure VectorSlice = CharVectorSlice structure Array = CharArray structure ArraySlice = CharArraySlice structure Array2 = CharArray2) structure CharVector = CharVectorArray.Vector structure CharArray = CharVectorArray.Array structure CharArray2 = CharVectorArray.Array2 structure IntVectorArray = MonoVectorArrayArray2Convert (structure Vector = IntVector structure VectorSlice = IntVectorSlice structure Array = IntArray structure ArraySlice = IntArraySlice structure Array2 = IntArray2) structure IntVector = IntVectorArray.Vector structure IntArray = IntVectorArray.Array structure IntArray2 = IntVectorArray.Array2 structure Int32VectorArray = MonoVectorArrayArray2Convert (structure Vector = Int32Vector structure VectorSlice = Int32VectorSlice structure Array = Int32Array structure ArraySlice = Int32ArraySlice structure Array2 = Int32Array2) structure Int32Vector = Int32VectorArray.Vector structure Int32Array = Int32VectorArray.Array structure Int32Array2 = Int32VectorArray.Array2 structure RealVectorArray = MonoVectorArrayArray2Convert (structure Vector = RealVector structure VectorSlice = RealVectorSlice structure Array = RealArray structure ArraySlice = RealArraySlice structure Array2 = RealArray2) structure RealVector = RealVectorArray.Vector structure RealArray = RealVectorArray.Array structure RealArray2 = RealVectorArray.Array2 structure Real64VectorArray = MonoVectorArrayArray2Convert (structure Vector = Real64Vector structure VectorSlice = Real64VectorSlice structure Array = Real64Array structure ArraySlice = Real64ArraySlice structure Array2 = Real64Array2) structure Real64Vector = Real64VectorArray.Vector structure Real64Array = Real64VectorArray.Array structure Real64Array2 = Real64VectorArray.Array2 structure Word8VectorArray = MonoVectorArrayArray2Convert (structure Vector = Word8Vector structure VectorSlice = Word8VectorSlice structure Array = Word8Array structure ArraySlice = Word8ArraySlice structure Array2 = Word8Array2) structure Word8Vector = Word8VectorArray.Vector structure Word8Array = Word8VectorArray.Array structure Word8Array2 = Word8VectorArray.Array2 structure Pack32Big = PackWord32Big structure Pack32Little = PackWord32Little structure Text = TextConvert (structure Text = Text) structure Char = Text.Char structure String = Text.String structure Substring = Text.Substring structure IEEEReal = IEEEReal1997 structure LargeReal = RealConvert(structure Real = LargeReal) structure Real = RealConvert(structure Real = Real) structure Real64 = RealConvert(structure Real = Real64) structure Posix = PosixConvert(structure Posix = Posix) structure OS = OSConvert(structure OS = OS) structure Timer = TimerConvert(structure Timer = Timer) structure IO = IOConvert(structure IO = IO) structure TextIO = TextIOConvert(structure TextIO = TextIO) structure BinIO = BinIOConvert(structure BinIO = BinIO) structure Unix = UnixConvert (structure Unix = Unix) end mlton-20100608/basis-library/libs/basis-1997/top-level/infixes.sml0000644000076600000240000000054311404435631023057 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) infix 7 * / mod div infix 6 + - ^ infixr 5 :: @ infix 4 = <> > >= < <= infix 3 := o infix 0 before mlton-20100608/basis-library/libs/basis-1997/top-level/overloads.sml0000644000076600000240000000351711404435631023414 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) _overload ~ : ('a -> 'a) as Int.~ and IntInf.~ and Real.~ _overload + : ('a * 'a -> 'a) as Int.+ and IntInf.+ and Word.+ and Word8.+ and Real.+ _overload - : ('a * 'a -> 'a) as Int.- and IntInf.- and Word.- and Word8.- and Real.- _overload * : ('a * 'a -> 'a) as Int.* and IntInf.* and Word.* and Word8.* and Real.* (* Can't use the following overload, because then * fun f (x, y) = x + y / y * fails to type check. The problem is that because + and / are not constrained, * the type checker chooses the default type for +, int * int -> int. It is * then screwed because it can't chose that type for /. The problem happens * when there are overloaded variables that have some compatible type (in this * case real) but one of whose default types (int) is not a valid instance * of the other. *) (* * _overload / : ('a * 'a -> 'a) * as Real./ *) val op / = Real./ _overload div: ('a * 'a -> 'a) as Int.div and IntInf.div and Word.div and Word8.div _overload mod: ('a * 'a -> 'a) as Int.mod and IntInf.mod and Word.mod and Word8.mod _overload < : ('a * 'a -> bool) as Int.< and IntInf.< and Word.< and Word8.< and Real.< and Char.< and String.< _overload <= : ('a * 'a -> bool) as Int.<= and IntInf.<= and Word.<= and Word8.<= and Real.<= and Char.<= and String.<= _overload > : ('a * 'a -> bool) as Int.> and IntInf.> and Word.> and Word8.> and Real.> and Char.> and String.> _overload >= : ('a * 'a -> bool) as Int.>= and IntInf.>= and Word.>= and Word8.>= and Real.>= and Char.>= and String.>= _overload abs: ('a -> 'a) as Int.abs and IntInf.abs and Real.abs mlton-20100608/basis-library/libs/basis-1997/top-level/top-level.sml0000644000076600000240000000033011404435631023313 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) open Basis1997 mlton-20100608/basis-library/libs/basis-2002/0000755000076600000240000000000011404470406016735 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-2002/basis-2002.mlb0000644000076600000240000000073711404435631021123 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local ../basis-extra/basis-extra.mlb top-level/basis.sig top-level/basis.sml in structure Basis2002 end end mlton-20100608/basis-library/libs/basis-2002/top-level/0000755000076600000240000000000011404470406020644 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-2002/top-level/.ignore0000644000076600000240000000002311404435631022124 0ustar mtfstaffgenerate-overloads mlton-20100608/basis-library/libs/basis-2002/top-level/basis-equal.sig0000644000076600000240000000015511404435631023560 0ustar mtfstaffsignature BASIS_2002_EQUAL = sig val = : ''a * ''a -> bool val <> : ''a * ''a -> bool end mlton-20100608/basis-library/libs/basis-2002/top-level/basis-exns.sig0000644000076600000240000000053711404435631023432 0ustar mtfstaffsignature BASIS_2002_EXNS = sig (* Top-level exceptions *) exception Bind exception Chr exception Div exception Domain exception Empty exception Fail of string exception Match exception Option exception Overflow exception Size exception Span exception Subscript end mlton-20100608/basis-library/libs/basis-2002/top-level/basis-funs.sml0000644000076600000240000000067311404435631023442 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Required functors *) (* Optional functors *) functor PrimIO (S: PRIM_IO_ARG): PRIM_IO = PrimIO (S) functor StreamIO (S: STREAM_IO_ARG): STREAM_IO = StreamIO (S) functor ImperativeIO (S: IMPERATIVE_IO_ARG): IMPERATIVE_IO = ImperativeIO (S) mlton-20100608/basis-library/libs/basis-2002/top-level/basis-sigs.sml0000644000076600000240000000440111404435631023425 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Required signatures *) signature ARRAY = ARRAY signature ARRAY_SLICE = ARRAY_SLICE signature BIN_IO = BIN_IO signature BOOL = BOOL signature BYTE = BYTE signature CHAR = CHAR signature COMMAND_LINE = COMMAND_LINE signature DATE = DATE signature GENERAL = GENERAL signature IEEE_REAL = IEEE_REAL signature IMPERATIVE_IO = IMPERATIVE_IO signature INTEGER = INTEGER signature INT_INF = INT_INF signature IO = IO signature LIST = LIST signature LIST_PAIR = LIST_PAIR signature MATH = MATH signature MONO_ARRAY = MONO_ARRAY signature MONO_ARRAY_SLICE = MONO_ARRAY_SLICE signature MONO_VECTOR = MONO_VECTOR signature MONO_VECTOR_SLICE = MONO_VECTOR_SLICE signature OPTION = OPTION signature OS = OS signature OS_FILE_SYS = OS_FILE_SYS signature OS_IO = OS_IO signature OS_PATH = OS_PATH signature OS_PROCESS = OS_PROCESS signature PRIM_IO = PRIM_IO signature REAL = REAL signature STREAM_IO = STREAM_IO signature STRING = STRING signature STRING_CVT = STRING_CVT signature SUBSTRING = SUBSTRING signature TEXT = TEXT signature TEXT_IO = TEXT_IO signature TEXT_STREAM_IO = TEXT_STREAM_IO signature TIME = TIME signature TIMER = TIMER signature VECTOR = VECTOR signature VECTOR_SLICE = VECTOR_SLICE signature WORD = WORD (* Optional signatures *) signature ARRAY2 = ARRAY2 signature BIT_FLAGS = BIT_FLAGS signature GENERIC_SOCK = GENERIC_SOCK signature INET_SOCK = INET_SOCK signature INT_INF = INT_INF signature MONO_ARRAY2 = MONO_ARRAY2 signature NET_HOST_DB = NET_HOST_DB signature NET_PROT_DB = NET_PROT_DB signature NET_SERV_DB = NET_SERV_DB signature PACK_REAL = PACK_REAL signature PACK_WORD = PACK_WORD signature POSIX = POSIX signature POSIX_ERROR = POSIX_ERROR signature POSIX_FILE_SYS = POSIX_FILE_SYS signature POSIX_IO = POSIX_IO signature POSIX_PROC_ENV = POSIX_PROC_ENV signature POSIX_PROCESS = POSIX_PROCESS signature POSIX_SIGNAL = POSIX_SIGNAL signature POSIX_SYS_DB = POSIX_SYS_DB signature POSIX_TTY = POSIX_TTY signature SOCKET = SOCKET signature UNIX = UNIX signature UNIX_SOCK = UNIX_SOCK (* signature WINDOWS = WINDOWS *) mlton-20100608/basis-library/libs/basis-2002/top-level/basis-types.sig0000644000076600000240000000071511404435631023617 0ustar mtfstaffsignature BASIS_2002_TYPES = sig (* Top-level types *) eqtype 'a array datatype bool = datatype bool eqtype char type exn eqtype int datatype 'a option = NONE | SOME of 'a datatype order = LESS | EQUAL | GREATER datatype list = datatype list datatype ref = datatype ref type real eqtype string type substring eqtype unit eqtype 'a vector eqtype word end mlton-20100608/basis-library/libs/basis-2002/top-level/basis-vals.sig0000644000076600000240000000305111404435631023414 0ustar mtfstaffsignature BASIS_2002_VALS = sig (* Top-level values *) val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val @ : ('a list * 'a list) -> 'a list val ^ : string * string -> string val app : ('a -> unit) -> 'a list -> unit val before : 'a * unit -> 'a val ceil : real -> int val chr : int -> char val concat : string list -> string val exnMessage : exn -> string val exnName : exn -> string val explode : string -> char list val floor : real -> int val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val getOpt : ('a option * 'a) -> 'a val hd : 'a list -> 'a val ignore : 'a -> unit val isSome : 'a option -> bool val implode : char list -> string val length : 'a list -> int val map : ('a -> 'b) -> 'a list -> 'b list val not : bool -> bool val null : 'a list -> bool val o : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b val ord : char -> int val print : string -> unit val real : int -> real (* val ref : 'a -> 'a ref *) val rev : 'a list -> 'a list val round : real -> int val size : string -> int val str : char -> string val substring : string * int * int -> string val tl : 'a list -> 'a list val trunc : real -> int (* val use : string -> unit *) val valOf : 'a option -> 'a val vector : 'a list -> 'a vector val = : ''a * ''a -> bool val <> : ''a * ''a -> bool end mlton-20100608/basis-library/libs/basis-2002/top-level/basis.sig0000644000076600000240000006701011404435631022456 0ustar mtfstaffsignature BASIS_2002 = sig (* Top-level types *) eqtype 'a array datatype bool = datatype BasisExtra.bool eqtype char type exn eqtype int datatype 'a option = NONE | SOME of 'a datatype order = LESS | EQUAL | GREATER datatype list = datatype BasisExtra.list datatype ref = datatype BasisExtra.ref type real eqtype string type substring eqtype unit eqtype 'a vector eqtype word (* Top-level exceptions *) exception Bind exception Chr exception Div exception Domain exception Empty exception Fail of string exception Match exception Option exception Overflow exception Size exception Span exception Subscript (* Top-level values *) val = : ''a * ''a -> bool val <> : ''a * ''a -> bool val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val @ : ('a list * 'a list) -> 'a list val ^ : string * string -> string val app : ('a -> unit) -> 'a list -> unit val before : 'a * unit -> 'a val ceil : real -> int val chr : int -> char val concat : string list -> string val exnMessage : exn -> string val exnName : exn -> string val explode : string -> char list val floor : real -> int val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val getOpt : ('a option * 'a) -> 'a val hd : 'a list -> 'a val ignore : 'a -> unit val isSome : 'a option -> bool val implode : char list -> string val length : 'a list -> int val map : ('a -> 'b) -> 'a list -> 'b list val not : bool -> bool val null : 'a list -> bool val o : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b val ord : char -> int val print : string -> unit val real : int -> real (* val ref : 'a -> 'a ref *) val rev : 'a list -> 'a list val round : real -> int val size : string -> int val str : char -> string val substring : string * int * int -> string val tl : 'a list -> 'a list val trunc : real -> int (* val use : string -> unit *) val valOf : 'a option -> 'a val vector : 'a list -> 'a vector (* Required structures *) structure Array : ARRAY structure ArraySlice : ARRAY_SLICE structure BinIO : BIN_IO structure BinPrimIO : PRIM_IO structure Bool : BOOL structure Byte : BYTE structure Char : CHAR structure CharArray : MONO_ARRAY structure CharArraySlice : MONO_ARRAY_SLICE structure CharVector : MONO_VECTOR structure CharVectorSlice : MONO_VECTOR_SLICE structure CommandLine : COMMAND_LINE structure Date : DATE structure General : GENERAL structure IEEEReal : IEEE_REAL structure Int : INTEGER structure IO : IO structure LargeInt : INTEGER structure LargeReal : REAL structure LargeWord : WORD structure List : LIST structure ListPair : LIST_PAIR structure Math : MATH structure Option : OPTION structure OS : OS structure Position : INTEGER structure Real : REAL structure StringCvt : STRING_CVT structure String : STRING structure Substring : SUBSTRING structure TextIO : TEXT_IO structure TextPrimIO : PRIM_IO structure Text : TEXT structure Time : TIME structure Timer : TIMER structure VectorSlice : VECTOR_SLICE structure Vector : VECTOR structure Word : WORD structure Word8Array : MONO_ARRAY structure Word8Array2 : MONO_ARRAY2 structure Word8ArraySlice : MONO_ARRAY_SLICE structure Word8Vector : MONO_VECTOR structure Word8VectorSlice : MONO_VECTOR_SLICE (* Optional structures *) structure Array2 : ARRAY2 structure BoolArray : MONO_ARRAY structure BoolArray2 : MONO_ARRAY2 structure BoolArraySlice : MONO_ARRAY_SLICE structure BoolVector : MONO_VECTOR structure BoolVectorSlice : MONO_VECTOR_SLICE structure CharArray2 : MONO_ARRAY2 structure FixedInt : INTEGER structure GenericSock : GENERIC_SOCK structure INetSock : INET_SOCK structure Int1: INTEGER structure Int2: INTEGER structure Int3: INTEGER structure Int4: INTEGER structure Int5: INTEGER structure Int6: INTEGER structure Int7: INTEGER structure Int8: INTEGER structure Int9: INTEGER structure Int10: INTEGER structure Int11: INTEGER structure Int12: INTEGER structure Int13: INTEGER structure Int14: INTEGER structure Int15: INTEGER structure Int16: INTEGER structure Int17: INTEGER structure Int18: INTEGER structure Int19: INTEGER structure Int20: INTEGER structure Int21: INTEGER structure Int22: INTEGER structure Int23: INTEGER structure Int24: INTEGER structure Int25: INTEGER structure Int26: INTEGER structure Int27: INTEGER structure Int28: INTEGER structure Int29: INTEGER structure Int30: INTEGER structure Int31: INTEGER structure Int32: INTEGER structure Int64: INTEGER structure Int8Array : MONO_ARRAY structure Int8Array2 : MONO_ARRAY2 structure Int8ArraySlice : MONO_ARRAY_SLICE structure Int8Vector : MONO_VECTOR structure Int8VectorSlice : MONO_VECTOR_SLICE structure Int16Array : MONO_ARRAY structure Int16Array2 : MONO_ARRAY2 structure Int16ArraySlice : MONO_ARRAY_SLICE structure Int16Vector : MONO_VECTOR structure Int16VectorSlice : MONO_VECTOR_SLICE structure Int32Array : MONO_ARRAY structure Int32Array2 : MONO_ARRAY2 structure Int32ArraySlice : MONO_ARRAY_SLICE structure Int32Vector : MONO_VECTOR structure Int32VectorSlice : MONO_VECTOR_SLICE structure Int64Array : MONO_ARRAY structure Int64Array2 : MONO_ARRAY2 structure Int64ArraySlice : MONO_ARRAY_SLICE structure Int64Vector : MONO_VECTOR structure Int64VectorSlice : MONO_VECTOR_SLICE structure IntArray : MONO_ARRAY structure IntArray2 : MONO_ARRAY2 structure IntArraySlice : MONO_ARRAY_SLICE structure IntVector : MONO_VECTOR structure IntVectorSlice : MONO_VECTOR_SLICE structure IntInf : INT_INF structure LargeIntArray : MONO_ARRAY structure LargeIntArray2 : MONO_ARRAY2 structure LargeIntArraySlice : MONO_ARRAY_SLICE structure LargeIntVector : MONO_VECTOR structure LargeIntVectorSlice : MONO_VECTOR_SLICE structure LargeRealArray : MONO_ARRAY structure LargeRealArray2 : MONO_ARRAY2 structure LargeRealArraySlice : MONO_ARRAY_SLICE structure LargeRealVector : MONO_VECTOR structure LargeRealVectorSlice : MONO_VECTOR_SLICE structure LargeWordArray : MONO_ARRAY structure LargeWordArray2 : MONO_ARRAY2 structure LargeWordArraySlice : MONO_ARRAY_SLICE structure LargeWordVector : MONO_VECTOR structure LargeWordVectorSlice : MONO_VECTOR_SLICE structure NetHostDB : NET_HOST_DB structure NetProtDB : NET_PROT_DB structure NetServDB : NET_SERV_DB structure PackReal32Big : PACK_REAL structure PackReal32Little : PACK_REAL structure PackReal64Big : PACK_REAL structure PackReal64Little : PACK_REAL structure PackRealBig : PACK_REAL structure PackRealLittle : PACK_REAL structure PackWord16Big : PACK_WORD structure PackWord16Little : PACK_WORD structure PackWord32Big : PACK_WORD structure PackWord32Little : PACK_WORD structure PackWord64Big : PACK_WORD structure PackWord64Little : PACK_WORD structure Posix : POSIX structure Real32 : REAL structure Real32Array : MONO_ARRAY structure Real32Array2 : MONO_ARRAY2 structure Real32ArraySlice : MONO_ARRAY_SLICE structure Real32Vector : MONO_VECTOR structure Real32VectorSlice : MONO_VECTOR_SLICE structure Real64 : REAL structure Real64Array : MONO_ARRAY structure Real64Array2 : MONO_ARRAY2 structure Real64ArraySlice : MONO_ARRAY_SLICE structure Real64Vector : MONO_VECTOR structure Real64VectorSlice : MONO_VECTOR_SLICE structure RealArray : MONO_ARRAY structure RealArray2 : MONO_ARRAY2 structure RealArraySlice : MONO_ARRAY_SLICE structure RealVector : MONO_VECTOR structure RealVectorSlice : MONO_VECTOR_SLICE structure Socket : SOCKET structure SysWord : WORD structure Unix : UNIX structure UnixSock : UNIX_SOCK structure WideChar : CHAR structure WideCharArray : MONO_ARRAY structure WideCharArray2 : MONO_ARRAY2 structure WideCharArraySlice : MONO_ARRAY_SLICE structure WideCharVector : MONO_VECTOR structure WideCharVectorSlice : MONO_VECTOR_SLICE structure WideString : STRING structure WideSubstring : SUBSTRING structure WideText : TEXT (* structure WideTextIO : TEXT_IO structure WideTextPrimIO : PRIM_IO *) (* structure Windows : WINDOWS *) structure Word1: WORD structure Word2: WORD structure Word3: WORD structure Word4: WORD structure Word5: WORD structure Word6: WORD structure Word7: WORD structure Word8: WORD structure Word9: WORD structure Word10: WORD structure Word11: WORD structure Word12: WORD structure Word13: WORD structure Word14: WORD structure Word15: WORD structure Word16: WORD structure Word17: WORD structure Word18: WORD structure Word19: WORD structure Word20: WORD structure Word21: WORD structure Word22: WORD structure Word23: WORD structure Word24: WORD structure Word25: WORD structure Word26: WORD structure Word27: WORD structure Word28: WORD structure Word29: WORD structure Word30: WORD structure Word31: WORD structure Word32: WORD structure Word64: WORD structure WordArray : MONO_ARRAY structure WordArray2 : MONO_ARRAY2 structure WordArraySlice : MONO_ARRAY_SLICE structure WordVector : MONO_VECTOR structure WordVectorSlice : MONO_VECTOR_SLICE structure Word16Array : MONO_ARRAY structure Word16Array2 : MONO_ARRAY2 structure Word16ArraySlice : MONO_ARRAY_SLICE structure Word16Vector : MONO_VECTOR structure Word16VectorSlice : MONO_VECTOR_SLICE structure Word32Array : MONO_ARRAY structure Word32Array2 : MONO_ARRAY2 structure Word32ArraySlice : MONO_ARRAY_SLICE structure Word32Vector : MONO_VECTOR structure Word32VectorSlice : MONO_VECTOR_SLICE structure Word64Array : MONO_ARRAY structure Word64Array2 : MONO_ARRAY2 structure Word64ArraySlice : MONO_ARRAY_SLICE structure Word64Vector : MONO_VECTOR structure Word64VectorSlice : MONO_VECTOR_SLICE (* ************************************************** *) (* ************************************************** *) (* Sharing constraints *) (* Top-level types *) sharing type unit = General.unit sharing type int = Int.int sharing type word = Word.word sharing type real = Real.real sharing type char = Char.char sharing type string = String.string sharing type substring = Substring.substring sharing type exn = General.exn (* Can't use sharing on type array or vector, because they are rigid tycons. * Don't need it anyways, since it's built into the ARRAY and VECTOR signatures. *) (* sharing type array = Array.array sharing type vector = Vector.vector *) (* sharing type ref = General.ref *) (* sharing type bool = Bool.bool *) sharing type option = Option.option sharing type order = General.order (* sharing type list = List.list *) (* Required structures *) (* sharing type BinIO.StreamIO.elem = Word8.word *) sharing type BinIO.StreamIO.reader = BinPrimIO.reader sharing type BinIO.StreamIO.pos = BinPrimIO.pos (* sharing type BinIO.StreamIO.vector = Word8Vector.vector *) sharing type BinIO.StreamIO.writer = BinPrimIO.writer sharing type BinPrimIO.array = Word8Array.array sharing type BinPrimIO.array_slice = Word8ArraySlice.slice sharing type BinPrimIO.elem = Word8.word sharing type BinPrimIO.pos = Position.int sharing type BinPrimIO.vector = Word8Vector.vector sharing type BinPrimIO.vector_slice = Word8VectorSlice.slice sharing type Char.char = char sharing type Char.string = String.string sharing type CharArray.elem = char sharing type CharArray.vector = CharVector.vector sharing type CharArraySlice.elem = char sharing type CharArraySlice.array = CharArray.array sharing type CharArraySlice.vector = CharVector.vector sharing type CharArraySlice.vector_slice = CharVectorSlice.slice sharing type CharVector.elem = char sharing type CharVector.vector = String.string sharing type CharVectorSlice.elem = char sharing type CharVectorSlice.vector = String.string sharing type CharVectorSlice.slice = Substring.substring sharing type Int.int = int sharing type Math.real = Real.real sharing type Real.real = real sharing type String.string = string sharing type String.string = CharVector.vector sharing type String.char = Char.char sharing type Substring.substring = CharVectorSlice.slice sharing type Substring.string = String.string sharing type Substring.char = Char.char sharing type Text.Char.char = Char.char sharing type Text.String.string = String.string sharing type Text.Substring.substring = Substring.substring sharing type Text.CharVector.vector = CharVector.vector sharing type Text.CharArray.array = CharArray.array sharing type Text.CharArraySlice.slice = CharArraySlice.slice sharing type Text.CharVectorSlice.slice = CharVectorSlice.slice (* redundant *) (* sharing type TextIO.elem = char sharing type TextIO.vector = string *) sharing type TextPrimIO.array = CharArray.array sharing type TextPrimIO.array_slice = CharArraySlice.slice sharing type TextPrimIO.elem = Char.char sharing type TextPrimIO.pos = Position.int sharing type TextPrimIO.vector = CharVector.vector sharing type TextPrimIO.vector_slice = CharVectorSlice.slice sharing type Word.word = word sharing type Word8Array.elem = Word8.word sharing type Word8Array.vector = Word8Vector.vector sharing type Word8ArraySlice.elem = Word8.word sharing type Word8ArraySlice.array = Word8Array.array sharing type Word8ArraySlice.vector = Word8Vector.vector sharing type Word8ArraySlice.vector_slice = Word8VectorSlice.slice sharing type Word8Vector.elem = Word8.word sharing type Word8VectorSlice.elem = Word8.word sharing type Word8VectorSlice.vector = Word8Vector.vector sharing type Word8Array2.elem = Word8.word sharing type Word8Array2.vector = Word8Vector.vector (* Optional structures *) sharing type BoolArray.vector = BoolVector.vector sharing type BoolArraySlice.array = BoolArray.array sharing type BoolArraySlice.vector = BoolVector.vector sharing type BoolArraySlice.vector_slice = BoolVectorSlice.slice sharing type BoolVectorSlice.vector = BoolVector.vector sharing type BoolArray2.vector = BoolVector.vector sharing type CharArray2.elem = char sharing type CharArray2.vector = CharVector.vector sharing type IntArray.elem = int sharing type IntArray.vector = IntVector.vector sharing type IntArraySlice.elem = int sharing type IntArraySlice.array = IntArray.array sharing type IntArraySlice.vector = IntVector.vector sharing type IntArraySlice.vector_slice = IntVectorSlice.slice sharing type IntVector.elem = int sharing type IntVectorSlice.elem = int sharing type IntVectorSlice.vector = IntVector.vector sharing type IntArray2.elem = int sharing type IntArray2.vector = IntVector.vector sharing type Int8Array.elem = Int8.int sharing type Int8Array.vector = Int8Vector.vector sharing type Int8ArraySlice.elem = Int8.int sharing type Int8ArraySlice.array = Int8Array.array sharing type Int8ArraySlice.vector = Int8Vector.vector sharing type Int8ArraySlice.vector_slice = Int8VectorSlice.slice sharing type Int8Vector.elem = Int8.int sharing type Int8VectorSlice.elem = Int8.int sharing type Int8VectorSlice.vector = Int8Vector.vector sharing type Int8Array2.elem = Int8.int sharing type Int8Array2.vector = Int8Vector.vector sharing type Int16Array.elem = Int16.int sharing type Int16Array.vector = Int16Vector.vector sharing type Int16ArraySlice.elem = Int16.int sharing type Int16ArraySlice.array = Int16Array.array sharing type Int16ArraySlice.vector = Int16Vector.vector sharing type Int16ArraySlice.vector_slice = Int16VectorSlice.slice sharing type Int16Vector.elem = Int16.int sharing type Int16VectorSlice.elem = Int16.int sharing type Int16VectorSlice.vector = Int16Vector.vector sharing type Int16Array2.elem = Int16.int sharing type Int16Array2.vector = Int16Vector.vector sharing type Int32Array.elem = Int32.int sharing type Int32Array.vector = Int32Vector.vector sharing type Int32ArraySlice.elem = Int32.int sharing type Int32ArraySlice.array = Int32Array.array sharing type Int32ArraySlice.vector = Int32Vector.vector sharing type Int32ArraySlice.vector_slice = Int32VectorSlice.slice sharing type Int32Vector.elem = Int32.int sharing type Int32VectorSlice.elem = Int32.int sharing type Int32VectorSlice.vector = Int32Vector.vector sharing type Int32Array2.elem = Int32.int sharing type Int32Array2.vector = Int32Vector.vector sharing type Int64Array.elem = Int64.int sharing type Int64Array.vector = Int64Vector.vector sharing type Int64ArraySlice.elem = Int64.int sharing type Int64ArraySlice.array = Int64Array.array sharing type Int64ArraySlice.vector = Int64Vector.vector sharing type Int64ArraySlice.vector_slice = Int64VectorSlice.slice sharing type Int64Vector.elem = Int64.int sharing type Int64VectorSlice.elem = Int64.int sharing type Int64VectorSlice.vector = Int64Vector.vector sharing type Int64Array2.elem = Int64.int sharing type Int64Array2.vector = Int64Vector.vector sharing type LargeIntArray.elem = LargeInt.int sharing type LargeIntArray.vector = LargeIntVector.vector sharing type LargeIntArraySlice.elem = LargeInt.int sharing type LargeIntArraySlice.array = LargeIntArray.array sharing type LargeIntArraySlice.vector = LargeIntVector.vector sharing type LargeIntArraySlice.vector_slice = LargeIntVectorSlice.slice sharing type LargeIntVector.elem = LargeInt.int sharing type LargeIntVectorSlice.elem = LargeInt.int sharing type LargeIntVectorSlice.vector = LargeIntVector.vector sharing type LargeIntArray2.elem = LargeInt.int sharing type LargeIntArray2.vector = LargeIntVector.vector sharing type LargeRealArray.elem = LargeReal.real sharing type LargeRealArray.vector = LargeRealVector.vector sharing type LargeRealArraySlice.elem = LargeReal.real sharing type LargeRealArraySlice.array = LargeRealArray.array sharing type LargeRealArraySlice.vector = LargeRealVector.vector sharing type LargeRealArraySlice.vector_slice = LargeRealVectorSlice.slice sharing type LargeRealVector.elem = LargeReal.real sharing type LargeRealVectorSlice.elem = LargeReal.real sharing type LargeRealVectorSlice.vector = LargeRealVector.vector sharing type LargeRealArray2.elem = LargeReal.real sharing type LargeRealArray2.vector = LargeRealVector.vector sharing type LargeWordArray.elem = LargeWord.word sharing type LargeWordArray.vector = LargeWordVector.vector sharing type LargeWordArraySlice.elem = LargeWord.word sharing type LargeWordArraySlice.array = LargeWordArray.array sharing type LargeWordArraySlice.vector = LargeWordVector.vector sharing type LargeWordArraySlice.vector_slice = LargeWordVectorSlice.slice sharing type LargeWordVector.elem = LargeWord.word sharing type LargeWordVectorSlice.elem = LargeWord.word sharing type LargeWordVectorSlice.vector = LargeWordVector.vector sharing type LargeWordArray2.elem = LargeWord.word sharing type LargeWordArray2.vector = LargeWordVector.vector sharing type PackRealBig.real = real sharing type PackRealLittle.real = real sharing type PackReal32Big.real = Real32.real sharing type PackReal32Little.real = Real32.real sharing type PackReal64Big.real = Real64.real sharing type PackReal64Little.real = Real64.real sharing type Posix.Error.syserror = OS.syserror sharing type Posix.IO.file_desc = Posix.ProcEnv.file_desc sharing type Posix.FileSys.dirstream = OS.FileSys.dirstream sharing type Posix.FileSys.access_mode = OS.FileSys.access_mode sharing type Posix.Process.exit_status = Unix.exit_status sharing type Posix.Signal.signal = Unix.signal sharing type RealArray.elem = real sharing type RealArray.vector = RealVector.vector sharing type RealArraySlice.elem = real sharing type RealArraySlice.array = RealArray.array sharing type RealArraySlice.vector = RealVector.vector sharing type RealArraySlice.vector_slice = RealVectorSlice.slice sharing type RealVector.elem = real sharing type RealVectorSlice.elem = real sharing type RealVectorSlice.vector = RealVector.vector sharing type RealArray2.elem = real sharing type RealArray2.vector = RealVector.vector sharing type Real32Array.elem = Real32.real sharing type Real32Array.vector = Real32Vector.vector sharing type Real32ArraySlice.elem = Real32.real sharing type Real32ArraySlice.array = Real32Array.array sharing type Real32ArraySlice.vector = Real32Vector.vector sharing type Real32ArraySlice.vector_slice = Real32VectorSlice.slice sharing type Real32Vector.elem = Real32.real sharing type Real32VectorSlice.elem = Real32.real sharing type Real32VectorSlice.vector = Real32Vector.vector sharing type Real32Array2.elem = Real32.real sharing type Real32Array2.vector = Real32Vector.vector sharing type Real64Array.elem = Real64.real sharing type Real64Array.vector = Real64Vector.vector sharing type Real64ArraySlice.elem = Real64.real sharing type Real64ArraySlice.array = Real64Array.array sharing type Real64ArraySlice.vector = Real64Vector.vector sharing type Real64ArraySlice.vector_slice = Real64VectorSlice.slice sharing type Real64Vector.elem = Real64.real sharing type Real64VectorSlice.elem = Real64.real sharing type Real64VectorSlice.vector = Real64Vector.vector sharing type Real64Array2.elem = Real64.real sharing type Real64Array2.vector = Real64Vector.vector sharing type Unix.exit_status = Posix.Process.exit_status sharing type WideChar.string = WideString.string sharing type WideCharArray.elem = WideChar.char sharing type WideCharArray.vector = WideCharVector.vector sharing type WideCharArray2.elem = WideChar.char sharing type WideCharArray2.vector = WideCharVector.vector sharing type WideCharArraySlice.elem = WideChar.char sharing type WideCharArraySlice.array = WideCharArray.array sharing type WideCharArraySlice.vector = WideCharVector.vector sharing type WideCharArraySlice.vector_slice = WideCharVectorSlice.slice sharing type WideCharVector.elem = WideChar.char sharing type WideCharVector.vector = WideString.string sharing type WideCharVectorSlice.elem = WideChar.char sharing type WideCharVectorSlice.slice = WideSubstring.substring sharing type WideCharVectorSlice.vector = WideString.string sharing type WideString.char = WideChar.char (* next two are redundant? basis & char both do it... *) sharing type WideString.string = WideCharVector.vector sharing type WideSubstring.substring = WideCharVectorSlice.slice sharing type WideSubstring.string = WideString.string sharing type WideSubstring.char = WideChar.char sharing type WideText.Char.char = WideChar.char sharing type WideText.String.string = WideString.string sharing type WideText.Substring.substring = WideSubstring.substring sharing type WideText.CharVector.vector = WideCharVector.vector sharing type WideText.CharArray.array = WideCharArray.array sharing type WideText.CharArraySlice.slice = WideCharArraySlice.slice sharing type WideText.CharVectorSlice.slice = WideCharVectorSlice.slice sharing type WordArray.elem = word sharing type WordArray.vector = WordVector.vector sharing type WordArraySlice.elem = word sharing type WordArraySlice.array = WordArray.array sharing type WordArraySlice.vector = WordVector.vector sharing type WordArraySlice.vector_slice = WordVectorSlice.slice sharing type WordVector.elem = word sharing type WordVectorSlice.elem = word sharing type WordVectorSlice.vector = WordVector.vector sharing type WordArray2.elem = word sharing type WordArray2.vector = WordVector.vector sharing type Word16Array.elem = Word16.word sharing type Word16Array.vector = Word16Vector.vector sharing type Word16ArraySlice.elem = Word16.word sharing type Word16ArraySlice.array = Word16Array.array sharing type Word16ArraySlice.vector = Word16Vector.vector sharing type Word16ArraySlice.vector_slice = Word16VectorSlice.slice sharing type Word16Vector.elem = Word16.word sharing type Word16VectorSlice.elem = Word16.word sharing type Word16VectorSlice.vector = Word16Vector.vector sharing type Word16Array2.elem = Word16.word sharing type Word16Array2.vector = Word16Vector.vector sharing type Word32Array.elem = Word32.word sharing type Word32Array.vector = Word32Vector.vector sharing type Word32ArraySlice.elem = Word32.word sharing type Word32ArraySlice.array = Word32Array.array sharing type Word32ArraySlice.vector = Word32Vector.vector sharing type Word32ArraySlice.vector_slice = Word32VectorSlice.slice sharing type Word32Vector.elem = Word32.word sharing type Word32VectorSlice.elem = Word32.word sharing type Word32VectorSlice.vector = Word32Vector.vector sharing type Word32Array2.elem = Word32.word sharing type Word32Array2.vector = Word32Vector.vector sharing type Word64Array.elem = Word64.word sharing type Word64Array.vector = Word64Vector.vector sharing type Word64ArraySlice.elem = Word64.word sharing type Word64ArraySlice.array = Word64Array.array sharing type Word64ArraySlice.vector = Word64Vector.vector sharing type Word64ArraySlice.vector_slice = Word64VectorSlice.slice sharing type Word64Vector.elem = Word64.word sharing type Word64VectorSlice.elem = Word64.word sharing type Word64VectorSlice.vector = Word64Vector.vector sharing type Word64Array2.elem = Word64.word sharing type Word64Array2.vector = Word64Vector.vector end mlton-20100608/basis-library/libs/basis-2002/top-level/basis.sml0000644000076600000240000000036611404435631022470 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Basis2002 : BASIS_2002 = BasisExtra mlton-20100608/basis-library/libs/basis-2002/top-level/generate-overloads.sml0000644000076600000240000000357211404435631025157 0ustar mtfstaff(* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure List = struct fun foreach (l, f) = List.app f l fun map (l, f) = List.map f l val tabulate = List.tabulate end val int = ["Int", "IntInf", "LargeInt", "FixedInt", "Position"] @ List.map (List.tabulate (31, fn i => i + 2) @ [64], fn i => concat ["Int", Int.toString i]) val real = ["Real", "Real32", "Real64", "LargeReal"] val word = ["Word", "LargeWord", "SysWord"] @ List.map (List.tabulate (32, fn i => i + 1) @ [64], fn i => concat ["Word", Int.toString i]) val text = ["Char", "WideChar", "String", "WideString"] (* Order matters here in the appends, since the first element will be the * default. *) val num = int @ word @ real val numtext = num @ text val realint = int @ real val wordint = int @ word val binary = "'a * 'a -> 'a" val compare = "'a * 'a -> bool" val unary = "'a -> 'a" val () = print "(* This file is automatically generated. Do not edit. *)\n" val () = List.foreach ([(2, "~", unary, num), (2, "+", binary, num), (2, "-", binary, num), (2, "*", binary, num), (4, "/", binary, real), (3, "div", binary, wordint), (3, "mod", binary, wordint), (3, "abs", unary, realint), (1, "<", compare, numtext), (1, "<=", compare, numtext), (1, ">", compare, numtext), (1, ">=", compare, numtext)], fn (prec, f, ty, class) => (print (concat ["\n_overload ", Int.toString prec, " ", f, " : ", ty, "\n"]) ; (case class of [] => () | c :: class => (print (concat ["as ", c, ".", f, "\n"]) ; List.foreach (class, fn c => print (concat ["and ", c, ".", f, "\n"])))))) mlton-20100608/basis-library/libs/basis-2002/top-level/infixes.sml0000644000076600000240000000054311404435631023031 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) infix 7 * / mod div infix 6 + - ^ infixr 5 :: @ infix 4 = <> > >= < <= infix 3 := o infix 0 before mlton-20100608/basis-library/libs/basis-2002/top-level/Makefile0000644000076600000240000000052311404435631022305 0ustar mtfstaff## Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## GEN := generate-overloads overloads.sml: $(GEN).sml mlton $(GEN).sml $(GEN) >overloads.sml .PHONY: clean clean: ../../../../bin/clean mlton-20100608/basis-library/libs/basis-2002/top-level/overloads.sml0000644000076600000240000002572411404435631023372 0ustar mtfstaff(* This file is automatically generated. Do not edit. *) _overload 2 ~ : 'a -> 'a as Int.~ and IntInf.~ and LargeInt.~ and FixedInt.~ and Position.~ and Int2.~ and Int3.~ and Int4.~ and Int5.~ and Int6.~ and Int7.~ and Int8.~ and Int9.~ and Int10.~ and Int11.~ and Int12.~ and Int13.~ and Int14.~ and Int15.~ and Int16.~ and Int17.~ and Int18.~ and Int19.~ and Int20.~ and Int21.~ and Int22.~ and Int23.~ and Int24.~ and Int25.~ and Int26.~ and Int27.~ and Int28.~ and Int29.~ and Int30.~ and Int31.~ and Int32.~ and Int64.~ and Word.~ and LargeWord.~ and SysWord.~ and Word1.~ and Word2.~ and Word3.~ and Word4.~ and Word5.~ and Word6.~ and Word7.~ and Word8.~ and Word9.~ and Word10.~ and Word11.~ and Word12.~ and Word13.~ and Word14.~ and Word15.~ and Word16.~ and Word17.~ and Word18.~ and Word19.~ and Word20.~ and Word21.~ and Word22.~ and Word23.~ and Word24.~ and Word25.~ and Word26.~ and Word27.~ and Word28.~ and Word29.~ and Word30.~ and Word31.~ and Word32.~ and Word64.~ and Real.~ and Real32.~ and Real64.~ and LargeReal.~ _overload 2 + : 'a * 'a -> 'a as Int.+ and IntInf.+ and LargeInt.+ and FixedInt.+ and Position.+ and Int2.+ and Int3.+ and Int4.+ and Int5.+ and Int6.+ and Int7.+ and Int8.+ and Int9.+ and Int10.+ and Int11.+ and Int12.+ and Int13.+ and Int14.+ and Int15.+ and Int16.+ and Int17.+ and Int18.+ and Int19.+ and Int20.+ and Int21.+ and Int22.+ and Int23.+ and Int24.+ and Int25.+ and Int26.+ and Int27.+ and Int28.+ and Int29.+ and Int30.+ and Int31.+ and Int32.+ and Int64.+ and Word.+ and LargeWord.+ and SysWord.+ and Word1.+ and Word2.+ and Word3.+ and Word4.+ and Word5.+ and Word6.+ and Word7.+ and Word8.+ and Word9.+ and Word10.+ and Word11.+ and Word12.+ and Word13.+ and Word14.+ and Word15.+ and Word16.+ and Word17.+ and Word18.+ and Word19.+ and Word20.+ and Word21.+ and Word22.+ and Word23.+ and Word24.+ and Word25.+ and Word26.+ and Word27.+ and Word28.+ and Word29.+ and Word30.+ and Word31.+ and Word32.+ and Word64.+ and Real.+ and Real32.+ and Real64.+ and LargeReal.+ _overload 2 - : 'a * 'a -> 'a as Int.- and IntInf.- and LargeInt.- and FixedInt.- and Position.- and Int2.- and Int3.- and Int4.- and Int5.- and Int6.- and Int7.- and Int8.- and Int9.- and Int10.- and Int11.- and Int12.- and Int13.- and Int14.- and Int15.- and Int16.- and Int17.- and Int18.- and Int19.- and Int20.- and Int21.- and Int22.- and Int23.- and Int24.- and Int25.- and Int26.- and Int27.- and Int28.- and Int29.- and Int30.- and Int31.- and Int32.- and Int64.- and Word.- and LargeWord.- and SysWord.- and Word1.- and Word2.- and Word3.- and Word4.- and Word5.- and Word6.- and Word7.- and Word8.- and Word9.- and Word10.- and Word11.- and Word12.- and Word13.- and Word14.- and Word15.- and Word16.- and Word17.- and Word18.- and Word19.- and Word20.- and Word21.- and Word22.- and Word23.- and Word24.- and Word25.- and Word26.- and Word27.- and Word28.- and Word29.- and Word30.- and Word31.- and Word32.- and Word64.- and Real.- and Real32.- and Real64.- and LargeReal.- _overload 2 * : 'a * 'a -> 'a as Int.* and IntInf.* and LargeInt.* and FixedInt.* and Position.* and Int2.* and Int3.* and Int4.* and Int5.* and Int6.* and Int7.* and Int8.* and Int9.* and Int10.* and Int11.* and Int12.* and Int13.* and Int14.* and Int15.* and Int16.* and Int17.* and Int18.* and Int19.* and Int20.* and Int21.* and Int22.* and Int23.* and Int24.* and Int25.* and Int26.* and Int27.* and Int28.* and Int29.* and Int30.* and Int31.* and Int32.* and Int64.* and Word.* and LargeWord.* and SysWord.* and Word1.* and Word2.* and Word3.* and Word4.* and Word5.* and Word6.* and Word7.* and Word8.* and Word9.* and Word10.* and Word11.* and Word12.* and Word13.* and Word14.* and Word15.* and Word16.* and Word17.* and Word18.* and Word19.* and Word20.* and Word21.* and Word22.* and Word23.* and Word24.* and Word25.* and Word26.* and Word27.* and Word28.* and Word29.* and Word30.* and Word31.* and Word32.* and Word64.* and Real.* and Real32.* and Real64.* and LargeReal.* _overload 4 / : 'a * 'a -> 'a as Real./ and Real32./ and Real64./ and LargeReal./ _overload 3 div : 'a * 'a -> 'a as Int.div and IntInf.div and LargeInt.div and FixedInt.div and Position.div and Int2.div and Int3.div and Int4.div and Int5.div and Int6.div and Int7.div and Int8.div and Int9.div and Int10.div and Int11.div and Int12.div and Int13.div and Int14.div and Int15.div and Int16.div and Int17.div and Int18.div and Int19.div and Int20.div and Int21.div and Int22.div and Int23.div and Int24.div and Int25.div and Int26.div and Int27.div and Int28.div and Int29.div and Int30.div and Int31.div and Int32.div and Int64.div and Word.div and LargeWord.div and SysWord.div and Word1.div and Word2.div and Word3.div and Word4.div and Word5.div and Word6.div and Word7.div and Word8.div and Word9.div and Word10.div and Word11.div and Word12.div and Word13.div and Word14.div and Word15.div and Word16.div and Word17.div and Word18.div and Word19.div and Word20.div and Word21.div and Word22.div and Word23.div and Word24.div and Word25.div and Word26.div and Word27.div and Word28.div and Word29.div and Word30.div and Word31.div and Word32.div and Word64.div _overload 3 mod : 'a * 'a -> 'a as Int.mod and IntInf.mod and LargeInt.mod and FixedInt.mod and Position.mod and Int2.mod and Int3.mod and Int4.mod and Int5.mod and Int6.mod and Int7.mod and Int8.mod and Int9.mod and Int10.mod and Int11.mod and Int12.mod and Int13.mod and Int14.mod and Int15.mod and Int16.mod and Int17.mod and Int18.mod and Int19.mod and Int20.mod and Int21.mod and Int22.mod and Int23.mod and Int24.mod and Int25.mod and Int26.mod and Int27.mod and Int28.mod and Int29.mod and Int30.mod and Int31.mod and Int32.mod and Int64.mod and Word.mod and LargeWord.mod and SysWord.mod and Word1.mod and Word2.mod and Word3.mod and Word4.mod and Word5.mod and Word6.mod and Word7.mod and Word8.mod and Word9.mod and Word10.mod and Word11.mod and Word12.mod and Word13.mod and Word14.mod and Word15.mod and Word16.mod and Word17.mod and Word18.mod and Word19.mod and Word20.mod and Word21.mod and Word22.mod and Word23.mod and Word24.mod and Word25.mod and Word26.mod and Word27.mod and Word28.mod and Word29.mod and Word30.mod and Word31.mod and Word32.mod and Word64.mod _overload 3 abs : 'a -> 'a as Int.abs and IntInf.abs and LargeInt.abs and FixedInt.abs and Position.abs and Int2.abs and Int3.abs and Int4.abs and Int5.abs and Int6.abs and Int7.abs and Int8.abs and Int9.abs and Int10.abs and Int11.abs and Int12.abs and Int13.abs and Int14.abs and Int15.abs and Int16.abs and Int17.abs and Int18.abs and Int19.abs and Int20.abs and Int21.abs and Int22.abs and Int23.abs and Int24.abs and Int25.abs and Int26.abs and Int27.abs and Int28.abs and Int29.abs and Int30.abs and Int31.abs and Int32.abs and Int64.abs and Real.abs and Real32.abs and Real64.abs and LargeReal.abs _overload 1 < : 'a * 'a -> bool as Int.< and IntInf.< and LargeInt.< and FixedInt.< and Position.< and Int2.< and Int3.< and Int4.< and Int5.< and Int6.< and Int7.< and Int8.< and Int9.< and Int10.< and Int11.< and Int12.< and Int13.< and Int14.< and Int15.< and Int16.< and Int17.< and Int18.< and Int19.< and Int20.< and Int21.< and Int22.< and Int23.< and Int24.< and Int25.< and Int26.< and Int27.< and Int28.< and Int29.< and Int30.< and Int31.< and Int32.< and Int64.< and Word.< and LargeWord.< and SysWord.< and Word1.< and Word2.< and Word3.< and Word4.< and Word5.< and Word6.< and Word7.< and Word8.< and Word9.< and Word10.< and Word11.< and Word12.< and Word13.< and Word14.< and Word15.< and Word16.< and Word17.< and Word18.< and Word19.< and Word20.< and Word21.< and Word22.< and Word23.< and Word24.< and Word25.< and Word26.< and Word27.< and Word28.< and Word29.< and Word30.< and Word31.< and Word32.< and Word64.< and Real.< and Real32.< and Real64.< and LargeReal.< and Char.< and WideChar.< and String.< and WideString.< _overload 1 <= : 'a * 'a -> bool as Int.<= and IntInf.<= and LargeInt.<= and FixedInt.<= and Position.<= and Int2.<= and Int3.<= and Int4.<= and Int5.<= and Int6.<= and Int7.<= and Int8.<= and Int9.<= and Int10.<= and Int11.<= and Int12.<= and Int13.<= and Int14.<= and Int15.<= and Int16.<= and Int17.<= and Int18.<= and Int19.<= and Int20.<= and Int21.<= and Int22.<= and Int23.<= and Int24.<= and Int25.<= and Int26.<= and Int27.<= and Int28.<= and Int29.<= and Int30.<= and Int31.<= and Int32.<= and Int64.<= and Word.<= and LargeWord.<= and SysWord.<= and Word1.<= and Word2.<= and Word3.<= and Word4.<= and Word5.<= and Word6.<= and Word7.<= and Word8.<= and Word9.<= and Word10.<= and Word11.<= and Word12.<= and Word13.<= and Word14.<= and Word15.<= and Word16.<= and Word17.<= and Word18.<= and Word19.<= and Word20.<= and Word21.<= and Word22.<= and Word23.<= and Word24.<= and Word25.<= and Word26.<= and Word27.<= and Word28.<= and Word29.<= and Word30.<= and Word31.<= and Word32.<= and Word64.<= and Real.<= and Real32.<= and Real64.<= and LargeReal.<= and Char.<= and WideChar.<= and String.<= and WideString.<= _overload 1 > : 'a * 'a -> bool as Int.> and IntInf.> and LargeInt.> and FixedInt.> and Position.> and Int2.> and Int3.> and Int4.> and Int5.> and Int6.> and Int7.> and Int8.> and Int9.> and Int10.> and Int11.> and Int12.> and Int13.> and Int14.> and Int15.> and Int16.> and Int17.> and Int18.> and Int19.> and Int20.> and Int21.> and Int22.> and Int23.> and Int24.> and Int25.> and Int26.> and Int27.> and Int28.> and Int29.> and Int30.> and Int31.> and Int32.> and Int64.> and Word.> and LargeWord.> and SysWord.> and Word1.> and Word2.> and Word3.> and Word4.> and Word5.> and Word6.> and Word7.> and Word8.> and Word9.> and Word10.> and Word11.> and Word12.> and Word13.> and Word14.> and Word15.> and Word16.> and Word17.> and Word18.> and Word19.> and Word20.> and Word21.> and Word22.> and Word23.> and Word24.> and Word25.> and Word26.> and Word27.> and Word28.> and Word29.> and Word30.> and Word31.> and Word32.> and Word64.> and Real.> and Real32.> and Real64.> and LargeReal.> and Char.> and WideChar.> and String.> and WideString.> _overload 1 >= : 'a * 'a -> bool as Int.>= and IntInf.>= and LargeInt.>= and FixedInt.>= and Position.>= and Int2.>= and Int3.>= and Int4.>= and Int5.>= and Int6.>= and Int7.>= and Int8.>= and Int9.>= and Int10.>= and Int11.>= and Int12.>= and Int13.>= and Int14.>= and Int15.>= and Int16.>= and Int17.>= and Int18.>= and Int19.>= and Int20.>= and Int21.>= and Int22.>= and Int23.>= and Int24.>= and Int25.>= and Int26.>= and Int27.>= and Int28.>= and Int29.>= and Int30.>= and Int31.>= and Int32.>= and Int64.>= and Word.>= and LargeWord.>= and SysWord.>= and Word1.>= and Word2.>= and Word3.>= and Word4.>= and Word5.>= and Word6.>= and Word7.>= and Word8.>= and Word9.>= and Word10.>= and Word11.>= and Word12.>= and Word13.>= and Word14.>= and Word15.>= and Word16.>= and Word17.>= and Word18.>= and Word19.>= and Word20.>= and Word21.>= and Word22.>= and Word23.>= and Word24.>= and Word25.>= and Word26.>= and Word27.>= and Word28.>= and Word29.>= and Word30.>= and Word31.>= and Word32.>= and Word64.>= and Real.>= and Real32.>= and Real64.>= and LargeReal.>= and Char.>= and WideChar.>= and String.>= and WideString.>= mlton-20100608/basis-library/libs/basis-2002/top-level/pervasive-equal.sml0000644000076600000240000000041511404435631024473 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local structure B = Basis2002 : BASIS_2002_EQUAL in open B end mlton-20100608/basis-library/libs/basis-2002/top-level/pervasive-exns.sml0000644000076600000240000000041411404435631024340 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local structure B : BASIS_2002_EXNS = Basis2002 in open B end mlton-20100608/basis-library/libs/basis-2002/top-level/pervasive-types.sml0000644000076600000240000000041511404435631024530 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local structure B : BASIS_2002_TYPES = Basis2002 in open B end mlton-20100608/basis-library/libs/basis-2002/top-level/pervasive-vals.sml0000644000076600000240000000041411404435631024330 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local structure B : BASIS_2002_VALS = Basis2002 in open B end mlton-20100608/basis-library/libs/basis-2002/top-level/top-level.sml0000644000076600000240000000406311404435631023274 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) open Basis2002 (* Rebind some structures so that their definitions appear later, so that they * will be used for displaying tycon names. * * Order here matters! Do not alphabetize or otherwise reorder without thinking. *) structure Posix = Posix structure OS = OS structure BoolArray = BoolArray structure BoolVector = BoolVector structure CharArraySlice = CharArraySlice structure CharArray = CharArray structure Int8Array = Int8Array structure Int8Vector = Int8Vector structure Int16Array = Int16Array structure Int16Vector = Int16Vector structure Int32Array = Int32Array structure Int32Vector = Int32Vector structure Int64Array = Int64Array structure Int64Vector = Int64Vector structure IntArray = IntArray structure IntVector = IntVector structure LargeIntArray = LargeIntArray structure LargeIntVector = LargeIntVector structure LargeRealArray = LargeRealArray structure LargeRealVector = LargeRealVector structure LargeWordArray = LargeWordArray structure LargeWordVector = LargeWordVector structure Real32Array = Real32Array structure Real32Vector = Real32Vector structure Real64Array = Real64Array structure Real64Vector = Real64Vector structure RealArray = RealArray structure RealVector = RealVector structure Word8Array = Word8Array structure Word8Vector = Word8Vector structure Word16Array = Word16Array structure Word16Vector = Word16Vector structure Word32Array = Word32Array structure Word32Vector = Word32Vector structure Word64Array = Word64Array structure Word64Vector = Word64Vector structure WordArray = WordArray structure WordVector = WordVector structure Int8 = Int8 structure Int16 = Int16 structure Int32 = Int32 structure Int64 = Int64 structure IntInf = IntInf structure Real32 = Real32 structure Real64 = Real64 structure Word8 = Word8 structure Word16 = Word16 structure Word32 = Word32 structure Word64 = Word64 mlton-20100608/basis-library/libs/basis-2002-strict/0000755000076600000240000000000011404470406020243 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-2002-strict/top-level/0000755000076600000240000000000011404470406022152 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-2002-strict/top-level/top-level.sml0000644000076600000240000000043311404435631024577 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) open Basis2002 val op = = op = mlton-20100608/basis-library/libs/basis-extra/0000755000076600000240000000000011404470406017475 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-extra/basis-extra.mlb0000644000076600000240000000117411404435631022417 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local ../../build/sources.mlb top-level/basis.sig ann "allowRebindEquals true" in top-level/basis.sml end in structure BasisExtra top-level/basis-sigs.sml top-level/basis-funs.sml top-level/top-level.sml end end mlton-20100608/basis-library/libs/basis-extra/top-level/0000755000076600000240000000000011404470406021404 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-extra/top-level/basis-funs.sml0000644000076600000240000000067311404435631024202 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Required functors *) (* Optional functors *) functor PrimIO (S: PRIM_IO_ARG): PRIM_IO = PrimIO (S) functor StreamIO (S: STREAM_IO_ARG): STREAM_IO = StreamIO (S) functor ImperativeIO (S: IMPERATIVE_IO_ARG): IMPERATIVE_IO = ImperativeIO (S) mlton-20100608/basis-library/libs/basis-extra/top-level/basis-sigs.sml0000644000076600000240000000713111404435631024170 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Required signatures *) signature ARRAY = ARRAY signature ARRAY_SLICE = ARRAY_SLICE signature BIN_IO = BIN_IO signature BOOL = BOOL signature BYTE = BYTE signature CHAR = CHAR signature COMMAND_LINE = COMMAND_LINE signature DATE = DATE signature GENERAL = GENERAL signature IEEE_REAL = IEEE_REAL signature IMPERATIVE_IO = IMPERATIVE_IO signature INTEGER = INTEGER signature INT_INF = INT_INF signature IO = IO signature LIST = LIST signature LIST_PAIR = LIST_PAIR signature MATH = MATH signature MONO_ARRAY = MONO_ARRAY signature MONO_ARRAY_SLICE = MONO_ARRAY_SLICE signature MONO_VECTOR = MONO_VECTOR signature MONO_VECTOR_SLICE = MONO_VECTOR_SLICE signature OPTION = OPTION signature OS = OS signature OS_FILE_SYS = OS_FILE_SYS signature OS_IO = OS_IO signature OS_PATH = OS_PATH signature OS_PROCESS = OS_PROCESS signature PRIM_IO = PRIM_IO signature REAL = REAL signature STREAM_IO = STREAM_IO signature STRING = STRING signature STRING_CVT = STRING_CVT signature SUBSTRING = SUBSTRING signature TEXT = TEXT signature TEXT_IO = TEXT_IO signature TEXT_STREAM_IO = TEXT_STREAM_IO signature TIME = TIME signature TIMER = TIMER signature VECTOR = VECTOR signature VECTOR_SLICE = VECTOR_SLICE signature WORD = WORD (* Optional signatures *) signature ARRAY2 = ARRAY2 signature BIT_FLAGS = BIT_FLAGS signature GENERIC_SOCK = GENERIC_SOCK signature INET_SOCK = INET_SOCK signature INT_INF = INT_INF signature MONO_ARRAY2 = MONO_ARRAY2 signature NET_HOST_DB = NET_HOST_DB signature NET_PROT_DB = NET_PROT_DB signature NET_SERV_DB = NET_SERV_DB signature PACK_REAL = PACK_REAL signature PACK_WORD = PACK_WORD signature POSIX = POSIX signature POSIX_ERROR = POSIX_ERROR signature POSIX_FILE_SYS = POSIX_FILE_SYS signature POSIX_IO = POSIX_IO signature POSIX_PROC_ENV = POSIX_PROC_ENV signature POSIX_PROCESS = POSIX_PROCESS signature POSIX_SIGNAL = POSIX_SIGNAL signature POSIX_SYS_DB = POSIX_SYS_DB signature POSIX_TTY = POSIX_TTY signature SOCKET = SOCKET signature UNIX = UNIX signature UNIX_SOCK = UNIX_SOCK (* signature WINDOWS = WINDOWS *) (* Non-standard signatures *) signature PRIM_IO_ARG = PRIM_IO_ARG signature STREAM_IO_ARG = STREAM_IO_ARG signature IMPERATIVE_IO_ARG = IMPERATIVE_IO_ARG signature SML90 = SML90 signature MLTON = MLTON signature MLTON_ARRAY = MLTON_ARRAY signature MLTON_BIN_IO = MLTON_BIN_IO signature MLTON_CONT = MLTON_CONT signature MLTON_EXN = MLTON_EXN signature MLTON_FINALIZABLE = MLTON_FINALIZABLE signature MLTON_GC = MLTON_GC signature MLTON_INT_INF = MLTON_INT_INF signature MLTON_IO = MLTON_IO signature MLTON_ITIMER = MLTON_ITIMER signature MLTON_MONO_ARRAY = MLTON_MONO_ARRAY signature MLTON_MONO_VECTOR = MLTON_MONO_VECTOR signature MLTON_PLATFORM = MLTON_PLATFORM signature MLTON_POINTER = MLTON_POINTER signature MLTON_PROC_ENV = MLTON_PROC_ENV signature MLTON_PROCESS = MLTON_PROCESS signature MLTON_PROFILE = MLTON_PROFILE signature MLTON_RANDOM = MLTON_RANDOM signature MLTON_REAL = MLTON_REAL signature MLTON_RLIMIT = MLTON_RLIMIT signature MLTON_RUSAGE = MLTON_RUSAGE signature MLTON_SIGNAL = MLTON_SIGNAL signature MLTON_SOCKET = MLTON_SOCKET signature MLTON_SYSLOG = MLTON_SYSLOG signature MLTON_TEXT_IO = MLTON_TEXT_IO signature MLTON_THREAD = MLTON_THREAD signature MLTON_VECTOR = MLTON_VECTOR signature MLTON_WEAK = MLTON_WEAK signature MLTON_WORD = MLTON_WORD signature MLTON_WORLD = MLTON_WORLD signature SML_OF_NJ = SML_OF_NJ signature UNSAFE = UNSAFE mlton-20100608/basis-library/libs/basis-extra/top-level/basis.sig0000644000076600000240000011426011404435631023216 0ustar mtfstaffsignature BASIS_EXTRA = sig (* Top-level types *) eqtype 'a array datatype bool = datatype bool eqtype char type exn eqtype int datatype 'a option = NONE | SOME of 'a datatype order = LESS | EQUAL | GREATER datatype list = datatype list datatype ref = datatype ref type real eqtype string type substring eqtype unit eqtype 'a vector eqtype word (* Top-level exceptions *) exception Bind exception Chr exception Div exception Domain exception Empty exception Fail of string exception Match exception Option exception Overflow exception Size exception Span exception Subscript (* Top-level values *) val = : ''a * ''a -> bool val <> : ''a * ''a -> bool val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val @ : ('a list * 'a list) -> 'a list val ^ : string * string -> string val app : ('a -> unit) -> 'a list -> unit val before : 'a * unit -> 'a val ceil : real -> int val chr : int -> char val concat : string list -> string val exnMessage : exn -> string val exnName : exn -> string val explode : string -> char list val floor : real -> int val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val getOpt : ('a option * 'a) -> 'a val hd : 'a list -> 'a val ignore : 'a -> unit val isSome : 'a option -> bool val implode : char list -> string val length : 'a list -> int val map : ('a -> 'b) -> 'a list -> 'b list val not : bool -> bool val null : 'a list -> bool val o : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b val ord : char -> int val print : string -> unit val real : int -> real (* val ref : 'a -> 'a ref *) val rev : 'a list -> 'a list val round : real -> int val size : string -> int val str : char -> string val substring : string * int * int -> string val tl : 'a list -> 'a list val trunc : real -> int (* val use : string -> unit *) val valOf : 'a option -> 'a val vector : 'a list -> 'a vector (* Required structures *) structure Array : ARRAY structure ArraySlice : ARRAY_SLICE structure BinIO : BIN_IO structure BinPrimIO : PRIM_IO structure Bool : BOOL structure Byte : BYTE structure Char : CHAR structure CharArray : MONO_ARRAY structure CharArraySlice : MONO_ARRAY_SLICE structure CharVector : MONO_VECTOR structure CharVectorSlice : MONO_VECTOR_SLICE structure CommandLine : COMMAND_LINE structure Date : DATE structure General : GENERAL structure IEEEReal : IEEE_REAL structure Int : INTEGER structure IO : IO structure LargeInt : INTEGER structure LargeReal : REAL structure LargeWord : WORD structure List : LIST structure ListPair : LIST_PAIR structure Math : MATH structure Option : OPTION structure OS : OS structure Position : INTEGER structure Real : REAL structure StringCvt : STRING_CVT structure String : STRING structure Substring : SUBSTRING structure TextIO : TEXT_IO structure TextPrimIO : PRIM_IO structure Text : TEXT structure Time : TIME structure Timer : TIMER structure VectorSlice : VECTOR_SLICE structure Vector : VECTOR structure Word : WORD structure Word8: WORD structure Word8Array : MONO_ARRAY structure Word8Array2 : MONO_ARRAY2 structure Word8ArraySlice : MONO_ARRAY_SLICE structure Word8Vector : MONO_VECTOR structure Word8VectorSlice : MONO_VECTOR_SLICE (* Optional structures *) structure Array2 : ARRAY2 structure BoolArray : MONO_ARRAY structure BoolArray2 : MONO_ARRAY2 structure BoolArraySlice : MONO_ARRAY_SLICE structure BoolVector : MONO_VECTOR structure BoolVectorSlice : MONO_VECTOR_SLICE structure CharArray2 : MONO_ARRAY2 structure FixedInt : INTEGER structure GenericSock : GENERIC_SOCK structure INetSock : INET_SOCK structure IntArray : MONO_ARRAY structure IntArray2 : MONO_ARRAY2 structure IntArraySlice : MONO_ARRAY_SLICE structure IntVector : MONO_VECTOR structure IntVectorSlice : MONO_VECTOR_SLICE structure Int1: INTEGER structure Int2: INTEGER structure Int3: INTEGER structure Int4: INTEGER structure Int5: INTEGER structure Int6: INTEGER structure Int7: INTEGER structure Int8: INTEGER structure Int9: INTEGER structure Int10: INTEGER structure Int11: INTEGER structure Int12: INTEGER structure Int13: INTEGER structure Int14: INTEGER structure Int15: INTEGER structure Int16: INTEGER structure Int17: INTEGER structure Int18: INTEGER structure Int19: INTEGER structure Int20: INTEGER structure Int21: INTEGER structure Int22: INTEGER structure Int23: INTEGER structure Int24: INTEGER structure Int25: INTEGER structure Int26: INTEGER structure Int27: INTEGER structure Int28: INTEGER structure Int29: INTEGER structure Int30: INTEGER structure Int31: INTEGER structure Int32: INTEGER structure Int64: INTEGER structure Int8Array : MONO_ARRAY structure Int8Array2 : MONO_ARRAY2 structure Int8ArraySlice : MONO_ARRAY_SLICE structure Int8Vector : MONO_VECTOR structure Int8VectorSlice : MONO_VECTOR_SLICE structure Int16Array : MONO_ARRAY structure Int16Array2 : MONO_ARRAY2 structure Int16ArraySlice : MONO_ARRAY_SLICE structure Int16Vector : MONO_VECTOR structure Int16VectorSlice : MONO_VECTOR_SLICE structure Int32Array : MONO_ARRAY structure Int32Array2 : MONO_ARRAY2 structure Int32ArraySlice : MONO_ARRAY_SLICE structure Int32Vector : MONO_VECTOR structure Int32VectorSlice : MONO_VECTOR_SLICE structure Int64Array : MONO_ARRAY structure Int64Array2 : MONO_ARRAY2 structure Int64ArraySlice : MONO_ARRAY_SLICE structure Int64Vector : MONO_VECTOR structure Int64VectorSlice : MONO_VECTOR_SLICE structure IntInf : INT_INF structure IntInfArray : MONO_ARRAY structure IntInfArray2 : MONO_ARRAY2 structure IntInfArraySlice : MONO_ARRAY_SLICE structure IntInfVector : MONO_VECTOR structure IntInfVectorSlice : MONO_VECTOR_SLICE structure LargeIntArray : MONO_ARRAY structure LargeIntArray2 : MONO_ARRAY2 structure LargeIntArraySlice : MONO_ARRAY_SLICE structure LargeIntVector : MONO_VECTOR structure LargeIntVectorSlice : MONO_VECTOR_SLICE structure LargeRealArray : MONO_ARRAY structure LargeRealArray2 : MONO_ARRAY2 structure LargeRealArraySlice : MONO_ARRAY_SLICE structure LargeRealVector : MONO_VECTOR structure LargeRealVectorSlice : MONO_VECTOR_SLICE structure LargeWordArray : MONO_ARRAY structure LargeWordArray2 : MONO_ARRAY2 structure LargeWordArraySlice : MONO_ARRAY_SLICE structure LargeWordVector : MONO_VECTOR structure LargeWordVectorSlice : MONO_VECTOR_SLICE structure NetHostDB : NET_HOST_DB structure NetProtDB : NET_PROT_DB structure NetServDB : NET_SERV_DB structure PackReal32Big : PACK_REAL structure PackReal32Little : PACK_REAL structure PackReal64Big : PACK_REAL structure PackReal64Little : PACK_REAL structure PackRealBig : PACK_REAL structure PackRealLittle : PACK_REAL structure PackWord16Big : PACK_WORD structure PackWord16Little : PACK_WORD structure PackWord32Big : PACK_WORD structure PackWord32Little : PACK_WORD structure PackWord64Big : PACK_WORD structure PackWord64Little : PACK_WORD structure Posix : POSIX structure RealArray : MONO_ARRAY structure RealArray2 : MONO_ARRAY2 structure RealArraySlice : MONO_ARRAY_SLICE structure RealVector : MONO_VECTOR structure RealVectorSlice : MONO_VECTOR_SLICE structure Real32 : REAL structure Real32Array : MONO_ARRAY structure Real32Array2 : MONO_ARRAY2 structure Real32ArraySlice : MONO_ARRAY_SLICE structure Real32Vector : MONO_VECTOR structure Real32VectorSlice : MONO_VECTOR_SLICE structure Real64 : REAL structure Real64Array : MONO_ARRAY structure Real64Array2 : MONO_ARRAY2 structure Real64ArraySlice : MONO_ARRAY_SLICE structure Real64Vector : MONO_VECTOR structure Real64VectorSlice : MONO_VECTOR_SLICE structure Socket : SOCKET structure SysWord : WORD structure Unix : UNIX structure UnixSock : UNIX_SOCK structure WideChar : CHAR structure WideCharArray : MONO_ARRAY structure WideCharArray2 : MONO_ARRAY2 structure WideCharArraySlice : MONO_ARRAY_SLICE structure WideCharVector : MONO_VECTOR structure WideCharVectorSlice : MONO_VECTOR_SLICE structure WideString : STRING structure WideSubstring : SUBSTRING structure WideText : TEXT (* structure WideTextIO : TEXT_IO structure WideTextPrimIO : PRIM_IO *) (* structure Windows : WINDOWS *) structure WordArray : MONO_ARRAY structure WordArray2 : MONO_ARRAY2 structure WordArraySlice : MONO_ARRAY_SLICE structure WordVector : MONO_VECTOR structure WordVectorSlice : MONO_VECTOR_SLICE structure Word1: WORD structure Word2: WORD structure Word3: WORD structure Word4: WORD structure Word5: WORD structure Word6: WORD structure Word7: WORD (* structure Word8: WORD (* Word8 is a required structure *)*) structure Word9: WORD structure Word10: WORD structure Word11: WORD structure Word12: WORD structure Word13: WORD structure Word14: WORD structure Word15: WORD structure Word16: WORD structure Word17: WORD structure Word18: WORD structure Word19: WORD structure Word20: WORD structure Word21: WORD structure Word22: WORD structure Word23: WORD structure Word24: WORD structure Word25: WORD structure Word26: WORD structure Word27: WORD structure Word28: WORD structure Word29: WORD structure Word30: WORD structure Word31: WORD structure Word32: WORD structure Word64: WORD structure Word16Array : MONO_ARRAY structure Word16Array2 : MONO_ARRAY2 structure Word16ArraySlice : MONO_ARRAY_SLICE structure Word16Vector : MONO_VECTOR structure Word16VectorSlice : MONO_VECTOR_SLICE structure Word32Array : MONO_ARRAY structure Word32Array2 : MONO_ARRAY2 structure Word32ArraySlice : MONO_ARRAY_SLICE structure Word32Vector : MONO_VECTOR structure Word32VectorSlice : MONO_VECTOR_SLICE structure Word64Array : MONO_ARRAY structure Word64Array2 : MONO_ARRAY2 structure Word64ArraySlice : MONO_ARRAY_SLICE structure Word64Vector : MONO_VECTOR structure Word64VectorSlice : MONO_VECTOR_SLICE (* Non-standard structures *) structure SML90: SML90 structure MLton: MLTON structure SMLofNJ: SML_OF_NJ structure Unsafe: UNSAFE sharing type MLton.IntInf.t = IntInf.int sharing type MLton.Process.pid = Posix.Process.pid sharing type MLton.ProcEnv.gid = Posix.ProcEnv.gid sharing type MLton.LargeReal.t = LargeReal.real sharing type MLton.LargeWord.t = LargeWord.word sharing type MLton.Real.t = Real.real sharing type MLton.Real32.t = Real32.real sharing type MLton.Real64.t = Real64.real sharing type MLton.Signal.t = Posix.Signal.signal sharing type MLton.Word.t = Word.word sharing type MLton.Word8.t = Word8.word sharing type MLton.Word16.t = Word16.word sharing type MLton.Word32.t = Word32.word sharing type MLton.Word64.t = Word64.word sharing Unsafe.BoolArray = BoolArray sharing Unsafe.BoolVector = BoolVector sharing Unsafe.CharArray = CharArray sharing Unsafe.CharVector = CharVector sharing Unsafe.IntArray = IntArray sharing Unsafe.IntVector = IntVector sharing Unsafe.Int8Array = Int8Array sharing Unsafe.Int8Vector = Int8Vector sharing Unsafe.Int16Array = Int16Array sharing Unsafe.Int16Vector = Int16Vector sharing Unsafe.Int32Array = Int32Array sharing Unsafe.Int32Vector = Int32Vector sharing Unsafe.Int64Array = Int64Array sharing Unsafe.Int64Vector = Int64Vector sharing Unsafe.IntInfArray = IntInfArray sharing Unsafe.IntInfVector = IntInfVector sharing Unsafe.LargeIntArray = LargeIntArray sharing Unsafe.LargeIntVector = LargeIntVector sharing Unsafe.LargeRealArray = LargeRealArray sharing Unsafe.LargeRealVector = LargeRealVector sharing Unsafe.LargeWordArray = LargeWordArray sharing Unsafe.LargeWordVector = LargeWordVector sharing Unsafe.RealArray = RealArray sharing Unsafe.RealVector = RealVector sharing Unsafe.Real32Array = Real32Array sharing Unsafe.Real32Vector = Real32Vector sharing Unsafe.Real64Array = Real64Array sharing Unsafe.Real64Vector = Real64Vector sharing Unsafe.WordArray = WordArray sharing Unsafe.WordVector = WordVector sharing Unsafe.Word8Array = Word8Array sharing Unsafe.Word8Vector = Word8Vector sharing Unsafe.Word16Array = Word16Array sharing Unsafe.Word16Vector = Word16Vector sharing Unsafe.Word32Array = Word32Array sharing Unsafe.Word32Vector = Word32Vector sharing Unsafe.Word64Array = Word64Array sharing Unsafe.Word64Vector = Word64Vector sharing Unsafe.PackReal32Big = PackReal32Big sharing Unsafe.PackReal32Little = PackReal32Little sharing Unsafe.PackReal64Big = PackReal64Big sharing Unsafe.PackReal64Little = PackReal64Little sharing Unsafe.PackRealBig = PackRealBig sharing Unsafe.PackRealLittle = PackRealLittle sharing Unsafe.PackWord16Big = PackWord16Big sharing Unsafe.PackWord16Little = PackWord16Little sharing Unsafe.PackWord32Big = PackWord32Big sharing Unsafe.PackWord32Little = PackWord32Little sharing Unsafe.PackWord64Big = PackWord64Big sharing Unsafe.PackWord64Little = PackWord64Little (* ************************************************** *) (* ************************************************** *) (* Sharing constraints *) (* Top-level types *) sharing type unit = General.unit sharing type int = Int.int sharing type word = Word.word sharing type real = Real.real sharing type char = Char.char sharing type string = String.string sharing type substring = Substring.substring sharing type exn = General.exn (* Can't use sharing on type array or vector, because they are rigid tycons. * Don't need it anyways, since it's built into the ARRAY and VECTOR signatures. *) (* sharing type array = Array.array sharing type vector = Vector.vector *) (* sharing type ref = General.ref *) (* sharing type bool = Bool.bool *) sharing type option = Option.option sharing type order = General.order (* sharing type list = List.list *) (* Required structures *) (* sharing type BinIO.StreamIO.elem = Word8.word *) sharing type BinIO.StreamIO.reader = BinPrimIO.reader sharing type BinIO.StreamIO.pos = BinPrimIO.pos (* sharing type BinIO.StreamIO.vector = Word8Vector.vector *) sharing type BinIO.StreamIO.writer = BinPrimIO.writer sharing type BinPrimIO.array = Word8Array.array sharing type BinPrimIO.array_slice = Word8ArraySlice.slice sharing type BinPrimIO.elem = Word8.word sharing type BinPrimIO.pos = Position.int sharing type BinPrimIO.vector = Word8Vector.vector sharing type BinPrimIO.vector_slice = Word8VectorSlice.slice sharing type Char.char = char sharing type Char.string = String.string sharing type CharArray.elem = char sharing type CharArray.vector = CharVector.vector sharing type CharArraySlice.elem = char sharing type CharArraySlice.array = CharArray.array sharing type CharArraySlice.vector = CharVector.vector sharing type CharArraySlice.vector_slice = CharVectorSlice.slice sharing type CharVector.elem = char sharing type CharVector.vector = String.string sharing type CharVectorSlice.elem = char sharing type CharVectorSlice.vector = String.string sharing type CharVectorSlice.slice = Substring.substring sharing type Int.int = int sharing type Math.real = Real.real sharing type Real.real = real sharing type String.string = string sharing type String.string = CharVector.vector sharing type String.char = Char.char sharing type Substring.substring = CharVectorSlice.slice sharing type Substring.string = String.string sharing type Substring.char = Char.char sharing type Text.Char.char = Char.char sharing type Text.String.string = String.string sharing type Text.Substring.substring = Substring.substring sharing type Text.CharVector.vector = CharVector.vector sharing type Text.CharArray.array = CharArray.array sharing type Text.CharArraySlice.slice = CharArraySlice.slice sharing type Text.CharVectorSlice.slice = CharVectorSlice.slice (* redundant *) (* sharing type TextIO.elem = char sharing type TextIO.vector = string *) sharing type TextPrimIO.array = CharArray.array sharing type TextPrimIO.array_slice = CharArraySlice.slice sharing type TextPrimIO.elem = Char.char sharing type TextPrimIO.pos = Position.int sharing type TextPrimIO.vector = CharVector.vector sharing type TextPrimIO.vector_slice = CharVectorSlice.slice sharing type Word.word = word sharing type Word8Array.elem = Word8.word sharing type Word8Array.vector = Word8Vector.vector sharing type Word8ArraySlice.elem = Word8.word sharing type Word8ArraySlice.array = Word8Array.array sharing type Word8ArraySlice.vector = Word8Vector.vector sharing type Word8ArraySlice.vector_slice = Word8VectorSlice.slice sharing type Word8Vector.elem = Word8.word sharing type Word8VectorSlice.elem = Word8.word sharing type Word8VectorSlice.vector = Word8Vector.vector sharing type Word8Array2.elem = Word8.word sharing type Word8Array2.vector = Word8Vector.vector (* Optional structures *) sharing type BoolArray.vector = BoolVector.vector sharing type BoolArraySlice.array = BoolArray.array sharing type BoolArraySlice.vector = BoolVector.vector sharing type BoolArraySlice.vector_slice = BoolVectorSlice.slice sharing type BoolVectorSlice.vector = BoolVector.vector sharing type BoolArray2.vector = BoolVector.vector sharing type CharArray2.elem = char sharing type CharArray2.vector = CharVector.vector sharing type IntArray.elem = int sharing type IntArray.vector = IntVector.vector sharing type IntArraySlice.elem = int sharing type IntArraySlice.array = IntArray.array sharing type IntArraySlice.vector = IntVector.vector sharing type IntArraySlice.vector_slice = IntVectorSlice.slice sharing type IntVector.elem = int sharing type IntVectorSlice.elem = int sharing type IntVectorSlice.vector = IntVector.vector sharing type IntArray2.elem = int sharing type IntArray2.vector = IntVector.vector sharing type Int8Array.elem = Int8.int sharing type Int8Array.vector = Int8Vector.vector sharing type Int8ArraySlice.elem = Int8.int sharing type Int8ArraySlice.array = Int8Array.array sharing type Int8ArraySlice.vector = Int8Vector.vector sharing type Int8ArraySlice.vector_slice = Int8VectorSlice.slice sharing type Int8Vector.elem = Int8.int sharing type Int8VectorSlice.elem = Int8.int sharing type Int8VectorSlice.vector = Int8Vector.vector sharing type Int8Array2.elem = Int8.int sharing type Int8Array2.vector = Int8Vector.vector sharing type Int16Array.elem = Int16.int sharing type Int16Array.vector = Int16Vector.vector sharing type Int16ArraySlice.elem = Int16.int sharing type Int16ArraySlice.array = Int16Array.array sharing type Int16ArraySlice.vector = Int16Vector.vector sharing type Int16ArraySlice.vector_slice = Int16VectorSlice.slice sharing type Int16Vector.elem = Int16.int sharing type Int16VectorSlice.elem = Int16.int sharing type Int16VectorSlice.vector = Int16Vector.vector sharing type Int16Array2.elem = Int16.int sharing type Int16Array2.vector = Int16Vector.vector sharing type Int32Array.elem = Int32.int sharing type Int32Array.vector = Int32Vector.vector sharing type Int32ArraySlice.elem = Int32.int sharing type Int32ArraySlice.array = Int32Array.array sharing type Int32ArraySlice.vector = Int32Vector.vector sharing type Int32ArraySlice.vector_slice = Int32VectorSlice.slice sharing type Int32Vector.elem = Int32.int sharing type Int32VectorSlice.elem = Int32.int sharing type Int32VectorSlice.vector = Int32Vector.vector sharing type Int32Array2.elem = Int32.int sharing type Int32Array2.vector = Int32Vector.vector sharing type Int64Array.elem = Int64.int sharing type Int64Array.vector = Int64Vector.vector sharing type Int64ArraySlice.elem = Int64.int sharing type Int64ArraySlice.array = Int64Array.array sharing type Int64ArraySlice.vector = Int64Vector.vector sharing type Int64ArraySlice.vector_slice = Int64VectorSlice.slice sharing type Int64Vector.elem = Int64.int sharing type Int64VectorSlice.elem = Int64.int sharing type Int64VectorSlice.vector = Int64Vector.vector sharing type Int64Array2.elem = Int64.int sharing type Int64Array2.vector = Int64Vector.vector sharing type LargeIntArray.elem = LargeInt.int sharing type LargeIntArray.vector = LargeIntVector.vector sharing type LargeIntArraySlice.elem = LargeInt.int sharing type LargeIntArraySlice.array = LargeIntArray.array sharing type LargeIntArraySlice.vector = LargeIntVector.vector sharing type LargeIntArraySlice.vector_slice = LargeIntVectorSlice.slice sharing type LargeIntVector.elem = LargeInt.int sharing type LargeIntVectorSlice.elem = LargeInt.int sharing type LargeIntVectorSlice.vector = LargeIntVector.vector sharing type LargeIntArray2.elem = LargeInt.int sharing type LargeIntArray2.vector = LargeIntVector.vector sharing type LargeRealArray.elem = LargeReal.real sharing type LargeRealArray.vector = LargeRealVector.vector sharing type LargeRealArraySlice.elem = LargeReal.real sharing type LargeRealArraySlice.array = LargeRealArray.array sharing type LargeRealArraySlice.vector = LargeRealVector.vector sharing type LargeRealArraySlice.vector_slice = LargeRealVectorSlice.slice sharing type LargeRealVector.elem = LargeReal.real sharing type LargeRealVectorSlice.elem = LargeReal.real sharing type LargeRealVectorSlice.vector = LargeRealVector.vector sharing type LargeRealArray2.elem = LargeReal.real sharing type LargeRealArray2.vector = LargeRealVector.vector sharing type LargeWordArray.elem = LargeWord.word sharing type LargeWordArray.vector = LargeWordVector.vector sharing type LargeWordArraySlice.elem = LargeWord.word sharing type LargeWordArraySlice.array = LargeWordArray.array sharing type LargeWordArraySlice.vector = LargeWordVector.vector sharing type LargeWordArraySlice.vector_slice = LargeWordVectorSlice.slice sharing type LargeWordVector.elem = LargeWord.word sharing type LargeWordVectorSlice.elem = LargeWord.word sharing type LargeWordVectorSlice.vector = LargeWordVector.vector sharing type LargeWordArray2.elem = LargeWord.word sharing type LargeWordArray2.vector = LargeWordVector.vector sharing type PackRealBig.real = real sharing type PackRealLittle.real = real sharing type PackReal32Big.real = Real32.real sharing type PackReal32Little.real = Real32.real sharing type PackReal64Big.real = Real64.real sharing type PackReal64Little.real = Real64.real sharing type Posix.Error.syserror = OS.syserror sharing type Posix.IO.file_desc = Posix.ProcEnv.file_desc sharing type Posix.FileSys.dirstream = OS.FileSys.dirstream sharing type Posix.FileSys.access_mode = OS.FileSys.access_mode sharing type Posix.Process.exit_status = Unix.exit_status sharing type Posix.Signal.signal = Unix.signal sharing type RealArray.elem = real sharing type RealArray.vector = RealVector.vector sharing type RealArraySlice.elem = real sharing type RealArraySlice.array = RealArray.array sharing type RealArraySlice.vector = RealVector.vector sharing type RealArraySlice.vector_slice = RealVectorSlice.slice sharing type RealVector.elem = real sharing type RealVectorSlice.elem = real sharing type RealVectorSlice.vector = RealVector.vector sharing type RealArray2.elem = real sharing type RealArray2.vector = RealVector.vector sharing type Real32Array.elem = Real32.real sharing type Real32Array.vector = Real32Vector.vector sharing type Real32ArraySlice.elem = Real32.real sharing type Real32ArraySlice.array = Real32Array.array sharing type Real32ArraySlice.vector = Real32Vector.vector sharing type Real32ArraySlice.vector_slice = Real32VectorSlice.slice sharing type Real32Vector.elem = Real32.real sharing type Real32VectorSlice.elem = Real32.real sharing type Real32VectorSlice.vector = Real32Vector.vector sharing type Real32Array2.elem = Real32.real sharing type Real32Array2.vector = Real32Vector.vector sharing type Real64Array.elem = Real64.real sharing type Real64Array.vector = Real64Vector.vector sharing type Real64ArraySlice.elem = Real64.real sharing type Real64ArraySlice.array = Real64Array.array sharing type Real64ArraySlice.vector = Real64Vector.vector sharing type Real64ArraySlice.vector_slice = Real64VectorSlice.slice sharing type Real64Vector.elem = Real64.real sharing type Real64VectorSlice.elem = Real64.real sharing type Real64VectorSlice.vector = Real64Vector.vector sharing type Real64Array2.elem = Real64.real sharing type Real64Array2.vector = Real64Vector.vector sharing type Unix.exit_status = Posix.Process.exit_status sharing type WideChar.string = WideString.string sharing type WideCharArray.elem = WideChar.char sharing type WideCharArray.vector = WideCharVector.vector sharing type WideCharArray2.elem = WideChar.char sharing type WideCharArray2.vector = WideCharVector.vector sharing type WideCharArraySlice.elem = WideChar.char sharing type WideCharArraySlice.array = WideCharArray.array sharing type WideCharArraySlice.vector = WideCharVector.vector sharing type WideCharArraySlice.vector_slice = WideCharVectorSlice.slice sharing type WideCharVector.elem = WideChar.char sharing type WideCharVector.vector = WideString.string sharing type WideCharVectorSlice.elem = WideChar.char sharing type WideCharVectorSlice.slice = WideSubstring.substring sharing type WideCharVectorSlice.vector = WideString.string sharing type WideString.char = WideChar.char (* next two are redundant? basis & char both do it... *) sharing type WideString.string = WideCharVector.vector sharing type WideSubstring.substring = WideCharVectorSlice.slice sharing type WideSubstring.string = WideString.string sharing type WideSubstring.char = WideChar.char sharing type WideText.Char.char = WideChar.char sharing type WideText.String.string = WideString.string sharing type WideText.Substring.substring = WideSubstring.substring sharing type WideText.CharVector.vector = WideCharVector.vector sharing type WideText.CharArray.array = WideCharArray.array sharing type WideText.CharArraySlice.slice = WideCharArraySlice.slice sharing type WideText.CharVectorSlice.slice = WideCharVectorSlice.slice (* sharing type WideTextIO. sharing type WideTextPrimIO.array = WideCharArray.array sharing type WideTextPrimIO.vector = WideCharVector.vector sharing type WideTextPrimIO.elem = WideChar.char *) sharing type WordArray.elem = word sharing type WordArray.vector = WordVector.vector sharing type WordArraySlice.elem = word sharing type WordArraySlice.array = WordArray.array sharing type WordArraySlice.vector = WordVector.vector sharing type WordArraySlice.vector_slice = WordVectorSlice.slice sharing type WordVector.elem = word sharing type WordVectorSlice.elem = word sharing type WordVectorSlice.vector = WordVector.vector sharing type WordArray2.elem = word sharing type WordArray2.vector = WordVector.vector sharing type Word16Array.elem = Word16.word sharing type Word16Array.vector = Word16Vector.vector sharing type Word16ArraySlice.elem = Word16.word sharing type Word16ArraySlice.array = Word16Array.array sharing type Word16ArraySlice.vector = Word16Vector.vector sharing type Word16ArraySlice.vector_slice = Word16VectorSlice.slice sharing type Word16Vector.elem = Word16.word sharing type Word16VectorSlice.elem = Word16.word sharing type Word16VectorSlice.vector = Word16Vector.vector sharing type Word16Array2.elem = Word16.word sharing type Word16Array2.vector = Word16Vector.vector sharing type Word32Array.elem = Word32.word sharing type Word32Array.vector = Word32Vector.vector sharing type Word32ArraySlice.elem = Word32.word sharing type Word32ArraySlice.array = Word32Array.array sharing type Word32ArraySlice.vector = Word32Vector.vector sharing type Word32ArraySlice.vector_slice = Word32VectorSlice.slice sharing type Word32Vector.elem = Word32.word sharing type Word32VectorSlice.elem = Word32.word sharing type Word32VectorSlice.vector = Word32Vector.vector sharing type Word32Array2.elem = Word32.word sharing type Word32Array2.vector = Word32Vector.vector sharing type Word64Array.elem = Word64.word sharing type Word64Array.vector = Word64Vector.vector sharing type Word64ArraySlice.elem = Word64.word sharing type Word64ArraySlice.array = Word64Array.array sharing type Word64ArraySlice.vector = Word64Vector.vector sharing type Word64ArraySlice.vector_slice = Word64VectorSlice.slice sharing type Word64Vector.elem = Word64.word sharing type Word64VectorSlice.elem = Word64.word sharing type Word64VectorSlice.vector = Word64Vector.vector sharing type Word64Array2.elem = Word64.word sharing type Word64Array2.vector = Word64Vector.vector sharing type MLton.BinIO.instream = BinIO.instream sharing type MLton.BinIO.outstream = BinIO.outstream sharing type MLton.CharArray.t = CharArray.array sharing type MLton.CharArray.elem = CharArray.elem sharing type MLton.CharVector.t = CharVector.vector sharing type MLton.CharVector.elem = CharVector.elem sharing type MLton.TextIO.instream = TextIO.instream sharing type MLton.TextIO.outstream = TextIO.outstream sharing type MLton.Word8Array.t = Word8Array.array sharing type MLton.Word8Array.elem = Word8Array.elem sharing type MLton.Word8Vector.t = Word8Vector.vector sharing type MLton.Word8Vector.elem = Word8Vector.elem end (* bool is already defined as bool and so cannot be shared. * So, we where these to get the needed sharing. *) where type BoolArray.elem = bool where type BoolArray2.elem = bool where type BoolArraySlice.elem = bool where type BoolVector.elem = bool where type BoolVectorSlice.elem = bool (* Top-level types. These appear free in basis signatures and hence must be * the same in the basis as at the top level. *) where type 'a array = 'a array where type 'a option = 'a option where type 'a vector = 'a vector where type char = char where type exn = exn where type int = int where type order = order where type real = real where type string = string where type substring = substring where type unit = unit where type word = word (* Types referenced in signatures by structure name *) (* where type 'a Array.array = 'a Array.array *) where type Array2.traversal = Array2.traversal where type 'a ArraySlice.slice = 'a ArraySlice.slice where type BinIO.instream = BinIO.instream (* UNIX *) where type BinIO.outstream = BinIO.outstream (* UNIX *) where type BinPrimIO.reader = BinPrimIO.reader (* POSIX_IO *) where type BinPrimIO.writer = BinPrimIO.writer (* POSIX_IO *) where type IO.buffer_mode = IO.buffer_mode where type LargeInt.int = LargeInt.int where type LargeReal.real = LargeReal.real where type LargeWord.word = LargeWord.word where type IEEEReal.real_order = IEEEReal.real_order where type IEEEReal.float_class = IEEEReal.float_class where type IEEEReal.rounding_mode = IEEEReal.rounding_mode where type NetHostDB.in_addr = NetHostDB.in_addr where type NetHostDB.addr_family = NetHostDB.addr_family where type OS.IO.iodesc = OS.IO.iodesc (* PRIM_IO, POSIX_FILE_SYS *) where type OS.Process.status = OS.Process.status (* UNIX, POSIX_PROCESS *) where type Position.int = Position.int where type Posix.IO.file_desc = Posix.IO.file_desc where type Posix.Process.exit_status = Posix.Process.exit_status where type Posix.Signal.signal = Posix.Signal.signal where type Socket.dgram = Socket.dgram where type ('a, 'b) Socket.sock = ('a, 'b) Socket.sock where type 'a Socket.sock_addr = 'a Socket.sock_addr where type Socket.SOCK.sock_type = Socket.SOCK.sock_type (* GENERIC_SOCK *) where type 'a Socket.stream = 'a Socket.stream where type StringCvt.radix = StringCvt.radix where type StringCvt.realfmt = StringCvt.realfmt (* where type ('a, 'b) StringCvt.reader = ('a, 'b) StringCvt.reader *) where type SysWord.word = SysWord.word where type TextIO.instream = TextIO.instream (* UNIX *) where type TextIO.outstream = TextIO.outstream (* UNIX *) where type TextPrimIO.reader = TextPrimIO.reader (* POSIX_IO *) where type TextPrimIO.writer = TextPrimIO.writer (* POSIX_IO *) where type Time.time = Time.time (* where type 'a Vector.vector = 'a Vector.vector *) where type 'a VectorSlice.slice = 'a VectorSlice.slice (* where type WideTextIO.instream = WideTextIO.instream where type WideTextIO.outstream = WideTextIO.outstream where type WideTextPrimIO.reader = WideTextPrimIO.reader where type WideTextPrimIO.writer = WideTextPrimIO.writer *) where type Word8Array.array = Word8Array.array where type Word8ArraySlice.slice = Word8ArraySlice.slice where type Word8ArraySlice.vector_slice = Word8ArraySlice.vector_slice where type Word8Vector.vector = Word8Vector.vector where type MLton.Pointer.t = MLton.Pointer.t where type 'a MLton.Thread.t = 'a MLton.Thread.t where type MLton.Thread.Runnable.t = MLton.Thread.Runnable.t (* Types that must be exposed because constants denote them. *) where type FixedInt.int = FixedInt.int where type Int1.int = Int1.int where type Int2.int = Int2.int where type Int3.int = Int3.int where type Int4.int = Int4.int where type Int5.int = Int5.int where type Int6.int = Int6.int where type Int7.int = Int7.int where type Int8.int = Int8.int where type Int9.int = Int9.int where type Int10.int = Int10.int where type Int11.int = Int11.int where type Int12.int = Int12.int where type Int13.int = Int13.int where type Int14.int = Int14.int where type Int15.int = Int15.int where type Int16.int = Int16.int where type Int17.int = Int17.int where type Int18.int = Int18.int where type Int19.int = Int19.int where type Int20.int = Int20.int where type Int21.int = Int21.int where type Int22.int = Int22.int where type Int23.int = Int23.int where type Int24.int = Int24.int where type Int25.int = Int25.int where type Int26.int = Int26.int where type Int27.int = Int27.int where type Int28.int = Int28.int where type Int29.int = Int29.int where type Int30.int = Int30.int where type Int31.int = Int31.int where type Int32.int = Int32.int where type Int64.int = Int64.int where type IntInf.int = IntInf.int where type Real32.real = Real32.real where type Real64.real = Real64.real where type WideChar.char = WideChar.char where type WideString.string = WideString.string where type Word1.word = Word1.word where type Word2.word = Word2.word where type Word3.word = Word3.word where type Word4.word = Word4.word where type Word5.word = Word5.word where type Word6.word = Word6.word where type Word7.word = Word7.word where type Word8.word = Word8.word where type Word9.word = Word9.word where type Word10.word = Word10.word where type Word11.word = Word11.word where type Word12.word = Word12.word where type Word13.word = Word13.word where type Word14.word = Word14.word where type Word15.word = Word15.word where type Word16.word = Word16.word where type Word17.word = Word17.word where type Word18.word = Word18.word where type Word19.word = Word19.word where type Word20.word = Word20.word where type Word21.word = Word21.word where type Word22.word = Word22.word where type Word23.word = Word23.word where type Word24.word = Word24.word where type Word25.word = Word25.word where type Word26.word = Word26.word where type Word27.word = Word27.word where type Word28.word = Word28.word where type Word29.word = Word29.word where type Word30.word = Word30.word where type Word31.word = Word31.word where type Word32.word = Word32.word where type Word64.word = Word64.word mlton-20100608/basis-library/libs/basis-extra/top-level/basis.sml0000644000076600000240000002362311404435631023231 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure BasisExtra :> BASIS_EXTRA = struct (* Required structures *) structure Array = Array structure ArraySlice = ArraySlice structure BinIO = BinIO structure BinPrimIO = BinPrimIO structure Bool = Bool structure Byte = Byte structure Char = Char structure CharArray = CharArray structure CharArraySlice = CharArraySlice structure CharVector = CharVector structure CharVectorSlice = CharVectorSlice structure CommandLine = CommandLine structure Date = Date structure General = General structure IEEEReal = IEEEReal structure IO = IO structure Int = Int structure LargeInt = LargeInt structure LargeReal = LargeReal structure LargeWord = LargeWord structure List = List structure ListPair = ListPair structure OS = OS structure Option = Option structure Position = Position structure Real = Real structure String = String structure StringCvt = StringCvt structure Substring = Substring structure Text = Text structure TextIO = TextIO structure TextPrimIO = TextPrimIO structure Time = Time structure Timer = Timer structure Vector = Vector structure VectorSlice = VectorSlice structure Word = Word structure Word8 = Word8 structure Word8Array = Word8Array structure Word8Array2 = Word8Array2 structure Word8ArraySlice = Word8ArraySlice structure Word8Vector = Word8Vector structure Word8VectorSlice = Word8VectorSlice (* Optional structures *) structure Array2 = Array2 structure BoolArray = BoolArray structure BoolArray2 = BoolArray2 structure BoolArraySlice = BoolArraySlice structure BoolVector = BoolVector structure BoolVectorSlice = BoolVectorSlice structure CharArray2 = CharArray2 structure FixedInt = FixedInt structure GenericSock = GenericSock structure INetSock = INetSock structure Int1 = Int1 structure Int2 = Int2 structure Int3 = Int3 structure Int4 = Int4 structure Int5 = Int5 structure Int6 = Int6 structure Int7 = Int7 structure Int8 = Int8 structure Int9 = Int9 structure Int10 = Int10 structure Int11 = Int11 structure Int12 = Int12 structure Int13 = Int13 structure Int14 = Int14 structure Int15 = Int15 structure Int16 = Int16 structure Int16 = Int16 structure Int17 = Int17 structure Int18 = Int18 structure Int19 = Int19 structure Int20 = Int20 structure Int21 = Int21 structure Int22 = Int22 structure Int23 = Int23 structure Int24 = Int24 structure Int25 = Int25 structure Int26 = Int26 structure Int27 = Int27 structure Int28 = Int28 structure Int29 = Int29 structure Int30 = Int30 structure Int31 = Int31 structure Int32 = Int32 structure Int64 = Int64 structure IntArray = IntArray structure IntArray2 = IntArray2 structure IntArraySlice = IntArraySlice structure IntVector = IntVector structure IntVectorSlice = IntVectorSlice structure Int8Array = Int8Array structure Int8Array2 = Int8Array2 structure Int8ArraySlice = Int8ArraySlice structure Int8Vector = Int8Vector structure Int8VectorSlice = Int8VectorSlice structure Int16Array = Int16Array structure Int16Array2 = Int16Array2 structure Int16ArraySlice = Int16ArraySlice structure Int16Vector = Int16Vector structure Int16VectorSlice = Int16VectorSlice structure Int32Array = Int32Array structure Int32Array2 = Int32Array2 structure Int32ArraySlice = Int32ArraySlice structure Int32Vector = Int32Vector structure Int32VectorSlice = Int32VectorSlice structure Int64Array = Int64Array structure Int64Array2 = Int64Array2 structure Int64ArraySlice = Int64ArraySlice structure Int64Vector = Int64Vector structure Int64VectorSlice = Int64VectorSlice structure IntInf = IntInf structure IntInfArray = IntInfArray structure IntInfArray2 = IntInfArray2 structure IntInfArraySlice = IntInfArraySlice structure IntInfVector = IntInfVector structure IntInfVectorSlice = IntInfVectorSlice structure LargeIntArray = LargeIntArray structure LargeIntArray2 = LargeIntArray2 structure LargeIntArraySlice = LargeIntArraySlice structure LargeIntVector = LargeIntVector structure LargeIntVectorSlice = LargeIntVectorSlice structure LargeRealArray = LargeRealArray structure LargeRealArray2 = LargeRealArray2 structure LargeRealArraySlice = LargeRealArraySlice structure LargeRealVector = LargeRealVector structure LargeRealVectorSlice = LargeRealVectorSlice structure LargeWordArray = LargeWordArray structure LargeWordArray2 = LargeWordArray2 structure LargeWordArraySlice = LargeWordArraySlice structure LargeWordVector = LargeWordVector structure LargeWordVectorSlice = LargeWordVectorSlice structure NetHostDB = NetHostDB structure NetProtDB = NetProtDB structure NetServDB = NetServDB structure PackReal32Big = PackReal32Big structure PackReal32Little = PackReal32Little structure PackReal64Big = PackReal64Big structure PackReal64Little = PackReal64Little structure PackRealBig = PackRealBig structure PackRealLittle = PackRealLittle structure PackWord16Big = PackWord16Big structure PackWord16Little = PackWord16Little structure PackWord32Big = PackWord32Big structure PackWord32Little = PackWord32Little structure PackWord64Big = PackWord64Big structure PackWord64Little = PackWord64Little structure Posix = Posix structure Real32 = Real32 structure Real32Array = Real32Array structure Real32Array2 = Real32Array2 structure Real32ArraySlice = Real32ArraySlice structure Real32Vector = Real32Vector structure Real32VectorSlice = Real32VectorSlice structure Real64 = Real64 structure Real64Array = Real64Array structure Real64Array2 = Real64Array2 structure Real64ArraySlice = Real64ArraySlice structure Real64Vector = Real64Vector structure Real64VectorSlice = Real64VectorSlice structure RealArray = RealArray structure RealArray2 = RealArray2 structure RealArraySlice = RealArraySlice structure RealVector = RealVector structure RealVectorSlice = RealVectorSlice structure Socket = Socket structure SysWord = SysWord structure Unix = Unix structure UnixSock = UnixSock structure WideChar = WideChar structure WideCharArray = WideCharArray structure WideCharArray2 = WideCharArray2 structure WideCharArraySlice = WideCharArraySlice structure WideCharVector = WideCharVector structure WideCharVectorSlice = WideCharVectorSlice structure WideString = WideString structure WideSubstring = WideSubstring structure WideText = WideText (* structure WideTextIO = WideTextIO structure WideTextPrimIO = WideTextPrimIO *) (* structure Windows = Windows *) structure Word1 = Word1 structure Word2 = Word2 structure Word3 = Word3 structure Word4 = Word4 structure Word5 = Word5 structure Word6 = Word6 structure Word7 = Word7 structure Word8 = Word8 structure Word9 = Word9 structure Word10 = Word10 structure Word11 = Word11 structure Word12 = Word12 structure Word13 = Word13 structure Word14 = Word14 structure Word15 = Word15 structure Word16 = Word16 structure Word17 = Word17 structure Word18 = Word18 structure Word19 = Word19 structure Word20 = Word20 structure Word21 = Word21 structure Word22 = Word22 structure Word23 = Word23 structure Word24 = Word24 structure Word25 = Word25 structure Word26 = Word26 structure Word27 = Word27 structure Word28 = Word28 structure Word29 = Word29 structure Word30 = Word30 structure Word31 = Word31 structure Word32 = Word32 structure Word64 = Word64 structure Word16 = Word16 structure WordArray = WordArray structure WordArray2 = WordArray2 structure WordArraySlice = WordArraySlice structure WordVector = WordVector structure WordVectorSlice = WordVectorSlice structure Word16Array = Word16Array structure Word16Array2 = Word16Array2 structure Word16ArraySlice = Word16ArraySlice structure Word16Vector = Word16Vector structure Word16VectorSlice = Word16VectorSlice structure Word32Array = Word32Array structure Word32Array2 = Word32Array2 structure Word32ArraySlice = Word32ArraySlice structure Word32Vector = Word32Vector structure Word32VectorSlice = Word32VectorSlice structure Word64Array = Word64Array structure Word64Array2 = Word64Array2 structure Word64ArraySlice = Word64ArraySlice structure Word64Vector = Word64Vector structure Word64VectorSlice = Word64VectorSlice (* Non-standard structures *) structure SML90 = SML90 structure MLton = MLton structure SMLofNJ = SMLofNJ structure Unsafe = Unsafe open ArrayGlobal BoolGlobal CharGlobal IntGlobal GeneralGlobal ListGlobal OptionGlobal RealGlobal StringGlobal SubstringGlobal TextIOGlobal VectorGlobal WordGlobal val real = real val op = = op = val op <> = op <> val vector = vector datatype ref = datatype ref end mlton-20100608/basis-library/libs/basis-extra/top-level/top-level.sml0000644000076600000240000000052611404435631024034 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local open BasisExtra in structure SML90 = SML90 structure MLton = MLton structure SMLofNJ = SMLofNJ structure Unsafe = Unsafe end mlton-20100608/basis-library/libs/basis-none/0000755000076600000240000000000011404470406017311 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-none/top-level/0000755000076600000240000000000011404470406021220 5ustar mtfstaffmlton-20100608/basis-library/libs/basis-none/top-level/basis.sig0000644000076600000240000000102211404435631023021 0ustar mtfstaffsignature BASIS_NONE = sig (* Top-level types *) eqtype 'a array datatype bool = datatype BasisExtra.bool eqtype char type exn eqtype int datatype list = datatype BasisExtra.list datatype ref = datatype BasisExtra.ref type real eqtype string type substring eqtype unit eqtype 'a vector eqtype word exception Bind exception Match exception Overflow val = : ''a * ''a -> bool val <> : ''a * ''a -> bool end mlton-20100608/basis-library/libs/basis-none/top-level/basis.sml0000644000076600000240000000036611404435631023044 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure BasisNone : BASIS_NONE = BasisExtra mlton-20100608/basis-library/libs/basis-none/top-level/infixes.sml0000644000076600000240000000040711404435631023404 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) infix 4 = mlton-20100608/basis-library/libs/basis-none/top-level/top-level.sml0000644000076600000240000000033611404435631023647 0ustar mtfstaff(* Copyright (C) 2002-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) open BasisNone mlton-20100608/basis-library/list/0000755000076600000240000000000011404470406015275 5ustar mtfstaffmlton-20100608/basis-library/list/list-pair.sig0000644000076600000240000000171211404435631017707 0ustar mtfstaffsignature LIST_PAIR = sig exception UnequalLengths val zip: 'a list * 'b list -> ('a * 'b) list val zipEq: 'a list * 'b list -> ('a * 'b) list val unzip: ('a * 'b) list -> 'a list * 'b list val app: ('a * 'b -> unit) -> 'a list * 'b list -> unit val appEq: ('a * 'b -> unit) -> 'a list * 'b list -> unit val map: ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list val mapEq: ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list val foldl: ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c val foldr: ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c val foldlEq: ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c val foldrEq: ('a * 'b * 'c -> 'c) -> 'c -> 'a list * 'b list -> 'c val all: ('a * 'b -> bool) -> 'a list * 'b list -> bool val exists: ('a * 'b -> bool) -> 'a list * 'b list -> bool val allEq: ('a * 'b -> bool) -> 'a list * 'b list -> bool end mlton-20100608/basis-library/list/list-pair.sml0000644000076600000240000000431311404435631017720 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure ListPair: LIST_PAIR = struct exception UnequalLengths fun id x = x fun ul _ = raise UnequalLengths fun unzip l = List.foldr (fn ((x, y), (xs, ys)) => (x :: xs, y :: ys)) ([], []) l fun foldl' w f b (l1, l2) = let fun loop (l1, l2, b) = case (l1, l2) of ([], []) => b | (x1 :: l1, x2 :: l2) => loop (l1, l2, f (x1, x2, b)) | _ => w b in loop (l1, l2, b) end fun foldl f = foldl' id f fun foldlEq f = foldl' ul f fun foldr' w f b (l1, l2) = let fun loop (l1, l2) = case (l1, l2) of ([], []) => b | (x1 :: l1, x2 :: l2) => f (x1, x2, loop (l1, l2)) | _ => w b in loop (l1, l2) end fun foldr f = foldr' id f fun foldrEq f = foldr' ul f fun zip' w (l1, l2) = rev (foldl' w (fn (x, x', l) => (x, x') :: l) [] (l1, l2)) fun zip (l1, l2) = zip' id (l1, l2) fun zipEq (l1, l2) = zip' ul (l1, l2) fun map' w f = rev o (foldl' w (fn (x1, x2, l) => f (x1, x2) :: l) []) fun map f = map' id f fun mapEq f = map' ul f fun app' w f = foldl' w (fn (x1, x2, ()) => f (x1, x2)) () fun app f = app' id f fun appEq f = app' ul f fun exists p (l1, l2) = let fun loop (l1, l2) = case (l1, l2) of (x1 :: l1, x2 :: l2) => p (x1, x2) orelse loop (l1, l2) | _ => false in loop (l1, l2) end fun all p ls = not (exists (not o p) ls) fun allEq p = let fun loop (l1, l2) = case (l1, l2) of ([], []) => true | (x1 :: l1, x2 :: l2) => p (x1, x2) andalso loop (l1, l2) | _ => false in loop end end mlton-20100608/basis-library/list/list.sig0000644000076600000240000000246111404435631016760 0ustar mtfstaffsignature LIST_GLOBAL = sig datatype list = datatype list exception Empty val @ : 'a list * 'a list -> 'a list val app: ('a -> unit) -> 'a list -> unit val foldl: ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldr: ('a * 'b -> 'b) -> 'b -> 'a list -> 'b val hd: 'a list -> 'a val length: 'a list -> int val map: ('a -> 'b) -> 'a list -> 'b list val null: 'a list -> bool val rev: 'a list -> 'a list val tl: 'a list -> 'a list end signature LIST = sig include LIST_GLOBAL val all: ('a -> bool) -> 'a list -> bool val collate: ('a * 'a -> order) -> 'a list * 'a list -> order val concat: 'a list list -> 'a list val drop: 'a list * int -> 'a list val exists: ('a -> bool) -> 'a list -> bool val filter: ('a -> bool) -> 'a list -> 'a list val find: ('a -> bool) -> 'a list -> 'a option val getItem: 'a list -> ('a * 'a list) option val last: 'a list -> 'a val mapPartial: ('a -> 'b option) -> 'a list -> 'b list val nth: 'a list * int -> 'a val partition: ('a -> bool) -> 'a list -> 'a list * 'a list val revAppend: 'a list * 'a list -> 'a list val tabulate: int * (int -> 'a) -> 'a list val take: 'a list * int -> 'a list end mlton-20100608/basis-library/list/list.sml0000644000076600000240000001022611404435631016767 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure List: LIST = struct open Int datatype list = datatype Primitive.List.list exception Empty val null = fn [] => true | _ => false val hd = fn x :: _ => x | _ => raise Empty val tl = fn _ :: l => l | _ => raise Empty val rec last = fn [] => raise Empty | [x] => x | _ :: l => last l val getItem = fn [] => NONE | x :: r => SOME (x, r) fun foldl f b l = let fun loop (l, b) = case l of [] => b | x :: l => loop (l, f (x, b)) in loop (l, b) end fun length l = foldl (fn (_, n) => n +? 1) 0 l fun appendRev (l1, l2) = foldl (op ::) l2 l1 val revAppend = appendRev fun rev l = appendRev (l, []) fun l1 @ l2 = case l2 of [] => l1 | _ => appendRev (rev l1, l2) fun foldr f b l = foldl f b (rev l) fun concat ls = foldr (op @) [] ls fun app f = foldl (f o #1) () fun map f l = rev (foldl (fn (x, l) => f x :: l) [] l) fun mapPartial pred l = rev (foldl (fn (x, l) => (case pred x of NONE => l | SOME y => y :: l)) [] l) fun filter pred = mapPartial (fn x => if pred x then SOME x else NONE) fun partition pred l = let val (pos, neg) = foldl (fn (x, (trues, falses)) => if pred x then (x :: trues, falses) else (trues, x :: falses)) ([], []) l in (rev pos, rev neg) end fun find pred = let val rec loop = fn [] => NONE | x :: l => if pred x then SOME x else loop l in loop end fun exists pred l = case find pred l of NONE => false | SOME _ => true fun all pred = not o (exists (not o pred)) fun tabulate (n, f) = if Primitive.Controls.safe andalso n < 0 then raise Size else let fun loop (i, ac) = if i < n then loop (i + 1, f i :: ac) else rev ac in loop (0, []) end fun nth (l, n) = let fun loop (l, n) = case l of [] => raise Subscript | x :: l => if n > 0 then loop (l, n - 1) else x in if Primitive.Controls.safe andalso n < 0 then raise Subscript else loop (l, n) end fun take (l, n) = let fun loop (l, n, ac) = if n > 0 then (case l of [] => raise Subscript | x :: l => loop (l, n - 1, x :: ac)) else rev ac in if Primitive.Controls.safe andalso n < 0 then raise Subscript else loop (l, n, []) end fun drop (l, n) = let fun loop (l, n) = if n > 0 then (case l of [] => raise Subscript | _ :: l => loop (l, n - 1)) else l in if Primitive.Controls.safe andalso n < 0 then raise Subscript else loop (l, n) end fun collate cmp = let val rec loop = fn ([], []) => EQUAL | ([], _) => LESS | (_, []) => GREATER | (x1::l1,x2::l2) => (case cmp (x1, x2) of EQUAL => loop (l1, l2) | ans => ans) in loop end end structure ListGlobal: LIST_GLOBAL = List open ListGlobal mlton-20100608/basis-library/Makefile0000644000076600000240000000402311404435632015763 0ustar mtfstaff## Copyright (C) 2010 Matthew Fluet. # Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## SRC = $(shell cd .. && pwd) BUILD = $(SRC)/build BIN = $(BUILD)/bin MLTON = mlton PATH = $(BIN):$(shell echo $$PATH) all: .PHONY: clean clean: ../bin/clean OBJPTR_MAPS = objptr-rep32.map objptr-rep64.map HEADER_MAPS = header-word32.map header-word64.map SEQINDEX_MAPS = seqindex-int32.map seqindex-int64.map DEFAULT_CHAR = char8 DEFAULT_INT = int32 int64 intinf DEFAULT_REAL = real32 real64 DEFAULT_WORD = word32 word64 .PHONY: def-use def-use: "$(MLTON)" -disable-ann deadCode -stop tc -show-types true \ -prefer-abs-paths true -show-def-use basis-library.def-use \ libs/all.mlb .PHONY: type-check-def type-check-def: "$(MLTON)" -disable-ann deadCode -stop tc -show-types true \ libs/all.mlb .PHONY: type-check-all type-check-all: for objptrrep in $(OBJPTR_MAPS); do \ for header in $(HEADER_MAPS); do \ for seqindex in $(SEQINDEX_MAPS); do \ for defchar in $(DEFAULT_CHAR); do \ for defint in $(DEFAULT_INT); do \ for defreal in $(DEFAULT_REAL); do \ for defword in $(DEFAULT_WORD); do \ echo "Type checking: $$objptrrep $$header $$seqindex $$defchar $$defint $$defreal $$defword"; \ echo "$(MLTON)" -disable-ann deadCode -stop tc -show-types true \ -mlb-path-map "maps/$$objptrrep" \ -mlb-path-map "maps/$$header" \ -mlb-path-map "maps/$$seqindex" \ -default-type "$$defchar" \ -default-type "$$defint" \ -default-type "$$defreal" \ -default-type "$$defword" \ libs/all.mlb; \ "$(MLTON)" -disable-ann deadCode -stop tc -show-types true \ -mlb-path-map "maps/$$objptrrep" \ -mlb-path-map "maps/$$header" \ -mlb-path-map "maps/$$seqindex" \ -default-type "$$defchar" \ -default-type "$$defint" \ -default-type "$$defreal" \ -default-type "$$defword" \ libs/all.mlb; \ done; done; done; done; done; done; done; mlton-20100608/basis-library/maps/0000755000076600000240000000000011404470406015262 5ustar mtfstaffmlton-20100608/basis-library/maps/header-word32.map0000644000076600000240000000002311404435631020323 0ustar mtfstaffHEADER_WORD word32 mlton-20100608/basis-library/maps/header-word64.map0000644000076600000240000000002311404435631020330 0ustar mtfstaffHEADER_WORD word64 mlton-20100608/basis-library/maps/objptr-rep32.map0000644000076600000240000000002111404435631020204 0ustar mtfstaffOBJPTR_REP rep32 mlton-20100608/basis-library/maps/objptr-rep64.map0000644000076600000240000000002111404435631020211 0ustar mtfstaffOBJPTR_REP rep64 mlton-20100608/basis-library/maps/seqindex-int32.map0000644000076600000240000000002311404435631020532 0ustar mtfstaffSEQINDEX_INT int32 mlton-20100608/basis-library/maps/seqindex-int64.map0000644000076600000240000000002311404435631020537 0ustar mtfstaffSEQINDEX_INT int64 mlton-20100608/basis-library/mlton/0000755000076600000240000000000011404470406015453 5ustar mtfstaffmlton-20100608/basis-library/mlton/array.sig0000644000076600000240000000057211404435631017302 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) type int = Int.int signature MLTON_ARRAY = sig val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a array * 'b end mlton-20100608/basis-library/mlton/bin-io.sig0000644000076600000240000000036011404435631017334 0ustar mtfstaff(* Copyright (C) 2002-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_BIN_IO = MLTON_IO mlton-20100608/basis-library/mlton/call-stack.sig0000644000076600000240000000053111404435631020175 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_CALL_STACK = sig type t val keep: bool val current: unit -> t val toStrings: t -> string list end mlton-20100608/basis-library/mlton/call-stack.sml0000644000076600000240000000312711404435631020212 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonCallStack = struct open Primitive.MLton.CallStack val gcState = Primitive.MLton.GCState.gcState structure Pointer = MLtonPointer val current: unit -> t = fn () => if not keep then T (Array.array (0, 0wx0)) else let val a = Array.arrayUninit (Word32.toInt (numStackFrames gcState)) val () = callStack (gcState, a) in T a end val toStrings: t -> string list = fn T a => if not keep then [] else let val skip = Array.length a - 1 in Array.foldri (fn (i, frameIndex, ac) => if i >= skip then ac else let val p = frameIndexSourceSeq (gcState, frameIndex) val max = Int32.toInt (Pointer.getInt32 (p, 0)) fun loop (j, ac) = if j > max then ac else loop (j + 1, CUtil.C_String.toString (sourceName (gcState, Pointer.getWord32 (p, j))) :: ac) in loop (1, ac) end) [] a end end mlton-20100608/basis-library/mlton/cont.sig0000644000076600000240000000077611404435631017135 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_CONT = sig type 'a t val callcc: ('a t -> 'a) -> 'a val isolate: ('a -> unit) -> 'a t val prepend: 'a t * ('b -> 'a) -> 'b t val throw: 'a t * 'a -> 'b val throw': 'a t * (unit -> 'a) -> 'b end mlton-20100608/basis-library/mlton/cont.sml0000644000076600000240000000576511404435631017151 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonCont:> MLTON_CONT = struct structure Thread = struct open Primitive.MLton.Thread val savedPre = fn () => savedPre Primitive.MLton.GCState.gcState end fun die (s: string): 'a = (PrimitiveFFI.Stdio.print s ; PrimitiveFFI.Posix.Process.exit 1 ; let exception DieFailed in raise DieFailed end) type 'a t = (unit -> 'a) -> unit fun callcc (f: 'a t -> 'a): 'a = if MLtonThread.amInSignalHandler () then die "MLton.Cont.callcc can not be used in a signal handler\n" else let datatype 'a state = Original of 'a t -> 'a | Copy of unit -> 'a | Clear val r: 'a state ref = ref (Original f) val _ = Thread.atomicBegin () (* Match 1 *) val _ = Thread.copyCurrent () in case (!r before r := Clear) of Clear => raise Fail "MLton.Cont.callcc: Clear" | Copy v => let val _ = Thread.atomicEnd () (* Match 2 *) in v () end | Original f => let val t = Thread.savedPre () val _ = Thread.atomicEnd () (* Match 1 *) in f (fn v => let val _ = Thread.atomicBegin () (* Match 2 *) val _ = r := Copy v val new = Thread.copy t val _ = Thread.atomicBegin () (* Match 3 *) in Thread.switchTo new (* Match 3 *) end) end end fun ('a, 'b) throw' (k: 'a t, v: unit -> 'a): 'b = (k v; raise Fail "MLton.Cont.throw': return from continuation") fun ('a, 'b) throw (k: 'a t, v: 'a): 'b = throw' (k, fn () => v) fun prepend (k, f) v = throw' (k, f o v) local val thRef: (unit -> unit) option ref = ref NONE val base: Thread.preThread = let val () = Thread.copyCurrent () in case !thRef of NONE => Thread.savedPre () | SOME th => let val () = thRef := NONE val () = Thread.atomicEnd () (* Match 1 *) val _ = (th () ; Exit.topLevelSuffix ()) handle exn => MLtonExn.topLevelHandler exn in raise Fail "MLton.Cont.isolate: return from (wrapped) func" end end in val isolate: ('a -> unit) -> 'a t = fn (f: 'a -> unit) => fn (v: unit -> 'a) => let val _ = Thread.atomicBegin () (* Match 1 *) val _ = Thread.atomicBegin () (* Match 2 *) val () = thRef := SOME (f o v) val new = Thread.copy base in Thread.switchTo new (* Match 2 *) end end end mlton-20100608/basis-library/mlton/exit.sml0000644000076600000240000000570011404435631017144 0ustar mtfstaff(* Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Exit = struct structure Status = struct open PreOS.Status val fromInt = fromRep o C_Status.fromInt val toInt = C_Status.toInt o toRep val failure = fromInt 1 val success = fromInt 0 end val exiting = ref false fun atExit f = if !exiting then () else Cleaner.addNew (Cleaner.atExit, f) fun halt (status: Status.t) = Primitive.MLton.halt (Status.toRep status) fun exit (status: Status.t): 'a = if !exiting then raise Fail "MLton.Exit.exit" else let val _ = exiting := true val i = Status.toInt status in if 0 <= i andalso i < 256 then (let open Cleaner in clean atExit end ; halt status ; raise Fail "MLton.Exit.exit") else raise Fail (concat ["MLton.Exit.exit(", Int.toString i, "): ", "exit must have 0 <= status < 256"]) end local val message = PrimitiveFFI.Stdio.print fun 'a wrapSuffix (suffix: unit -> unit) () : 'a = (suffix () ; message "Top-level suffix returned.\n" ; exit Status.failure) handle _ => (message "Top-level suffix raised exception.\n" ; halt Status.failure ; raise Fail "MLton.Exit.wrapSuffix") fun suffixArchiveOrLibrary () = let (* Return to 'lib_open'. *) val () = Primitive.MLton.Thread.returnToC () (* Enter from 'lib_close'. *) val _ = exiting := true val () = let open Cleaner in clean atExit end (* Return to 'lib_close'. *) val () = Primitive.MLton.Thread.returnToC () in () end fun suffixExecutable () = exit Status.success val defaultSuffix = let open Primitive.MLton.Platform.Format in case host of Archive => suffixArchiveOrLibrary | Executable => suffixExecutable | LibArchive => suffixArchiveOrLibrary | Library => suffixArchiveOrLibrary end in val getTopLevelSuffix = Primitive.TopLevel.getSuffix val setTopLevelSuffix = Primitive.TopLevel.setSuffix o wrapSuffix fun 'a defaultTopLevelSuffix ((): unit): 'a = wrapSuffix defaultSuffix () fun 'a topLevelSuffix ((): unit) : 'a = (getTopLevelSuffix () () ; raise Fail "MLton.Exit.topLevelSuffix") end end mlton-20100608/basis-library/mlton/exn.sig0000644000076600000240000000106111404435631016750 0ustar mtfstaff(* Copyright (C) 2001-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_EXN = sig val addExnMessager: (exn -> string option) -> unit val history: exn -> string list val defaultTopLevelHandler: exn -> 'a (* does not return *) val getTopLevelHandler: unit -> (exn -> unit) val setTopLevelHandler: (exn -> unit) -> unit val topLevelHandler: exn -> 'a (* does not return *) end mlton-20100608/basis-library/mlton/exn.sml0000644000076600000240000000507511404435631016772 0ustar mtfstaff(* Copyright (C) 2001-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonExn = struct open Primitive.MLton.Exn type t = exn val addExnMessager = General.addExnMessager val history: t -> string list = if keepHistory then (setExtendExtra (fn e => case e of NONE => SOME (MLtonCallStack.current ()) | SOME _ => e) ; (fn e => case extra e of NONE => [] | SOME cs => let (* Gets rid of the anonymous function passed to * setExtendExtra above. *) fun loop xs = case xs of [] => [] | x :: xs => if String.isPrefix "MLtonExn.fn " x then xs else loop xs in loop (MLtonCallStack.toStrings cs) end)) else fn _ => [] local val message = PrimitiveFFI.Stdio.print fun 'a wrapHandler (handler: exn -> unit) exn : 'a = (handler exn ; message "Top-level handler returned.\n" ; Exit.exit Exit.Status.failure) handle _ => (message "Top-level handler raised exception.\n" ; Exit.halt Exit.Status.failure ; raise Fail "MLton.Exn.wrapHandler") val defaultHandler = fn exn => (message (concat ["unhandled exception: ", exnMessage exn, "\n"]) ; (case history exn of [] => () | l => (message "with history:\n" ; List.app (fn s => message (concat ["\t", s, "\n"])) l)) ; Exit.exit Exit.Status.failure) in val getTopLevelHandler = Primitive.TopLevel.getHandler val setTopLevelHandler = Primitive.TopLevel.setHandler o wrapHandler fun 'a defaultTopLevelHandler (exn: exn): 'a = wrapHandler defaultHandler exn fun 'a topLevelHandler (exn: exn) : 'a = (getTopLevelHandler () exn ; raise Fail "MLton.Exn.topLevelHandler") end end mlton-20100608/basis-library/mlton/ffi.sig0000644000076600000240000000416711404435631016734 0ustar mtfstaff(* Copyright (C) 2003-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_FFI = sig val getBool: MLtonPointer.t * int -> bool val getChar8: MLtonPointer.t * int -> Char.char (* val getChar16: MLtonPointer.t * int -> Char16.char val getChar32: MLtonPointer.t * int -> Char32.char *) val getCPointer: MLtonPointer.t * int -> MLtonPointer.t val getInt8: MLtonPointer.t * int -> Int8.int val getInt16: MLtonPointer.t * int -> Int16.int val getInt32: MLtonPointer.t * int -> Int32.int val getInt64: MLtonPointer.t * int -> Int64.int val getObjptr: MLtonPointer.t * int -> 'a val getReal32: MLtonPointer.t * int -> Real32.real val getReal64: MLtonPointer.t * int -> Real64.real val getWord8: MLtonPointer.t * int -> Word8.word val getWord16: MLtonPointer.t * int -> Word16.word val getWord32: MLtonPointer.t * int -> Word32.word val getWord64: MLtonPointer.t * int -> Word64.word val register: int * (MLtonPointer.t -> unit) -> unit val setBool: MLtonPointer.t * int * bool -> unit val setChar8: MLtonPointer.t * int * Char.char -> unit (* val setChar16: MLtonPointer.t * Char16.char -> unit val setChar32: MLtonPointer.t * Char32.char -> unit *) val setCPointer: MLtonPointer.t * int * MLtonPointer.t -> unit val setInt8: MLtonPointer.t * int * Int8.int -> unit val setInt16: MLtonPointer.t * int * Int16.int -> unit val setInt32: MLtonPointer.t * int * Int32.int -> unit val setInt64: MLtonPointer.t * int * Int64.int -> unit val setObjptr: MLtonPointer.t * int * 'a -> unit val setReal32: MLtonPointer.t * int * Real32.real -> unit val setReal64: MLtonPointer.t * int * Real64.real -> unit val setWord8: MLtonPointer.t * int * Word8.word -> unit val setWord16: MLtonPointer.t * int * Word16.word -> unit val setWord32: MLtonPointer.t * int * Word32.word -> unit val setWord64: MLtonPointer.t * int * Word64.word -> unit end mlton-20100608/basis-library/mlton/ffi.sml0000644000076600000240000000456211404435631016744 0ustar mtfstaff(* Copyright (C) 2003-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonFFI: MLTON_FFI = struct val register = MLtonThread.register local fun makeGet get (p,i) = get (MLtonPointer.getPointer (p, i), 0) fun makeSet set (p,i,x) = set (MLtonPointer.getPointer (p, i), 0, x) fun make (get,set) = (makeGet get, makeSet set) in val (getCPointer, setCPointer) = make (MLtonPointer.getCPointer, MLtonPointer.setCPointer) val (getInt8, setInt8) = make (MLtonPointer.getInt8, MLtonPointer.setInt8) val (getInt16, setInt16) = make (MLtonPointer.getInt16, MLtonPointer.setInt16) val (getInt32, setInt32) = make (MLtonPointer.getInt32, MLtonPointer.setInt32) val (getInt64, setInt64) = make (MLtonPointer.getInt64, MLtonPointer.setInt64) val getObjptr = fn (p,i) => makeGet MLtonPointer.getObjptr (p,i) val setObjptr = fn (p,i,x) => makeSet MLtonPointer.setObjptr (p,i,x) val (getReal32, setReal32) = make (MLtonPointer.getReal32, MLtonPointer.setReal32) val (getReal64, setReal64) = make (MLtonPointer.getReal64, MLtonPointer.setReal64) val (getWord8, setWord8) = make (MLtonPointer.getWord8, MLtonPointer.setWord8) val (getWord16, setWord16) = make (MLtonPointer.getWord16, MLtonPointer.setWord16) val (getWord32, setWord32) = make (MLtonPointer.getWord32, MLtonPointer.setWord32) val (getWord64, setWord64) = make (MLtonPointer.getWord64, MLtonPointer.setWord64) end (* To the C-world, chars are unsigned integers. *) val getChar8 = fn (p, i) => Primitive.Char8.idFromWord8 (getWord8 (p, i)) (* val getChar16 = fn (p, i) => Primitive.Char16.idFromWord16 (getWord16 (p, i)) val getChar32 = fn (p, i) => Primitive.Char32.idFromWord32 (getWord32 (p, i)) *) val setChar8 = fn (p, i, x) => setWord8 (p, i, Primitive.Char8.idToWord8 x) (* val setChar16 = fn (p, i, x) => setWord16 (p, i, Primitive.Char16.idToWord16 x) val setChar32 = fn (p, i, x) => setWord32 (p, i, Primitive.Char32.idToWord32 x) *) (* To the C-world, booleans are 32-bit integers. *) fun intToBool (i: Int32.int): bool = i <> 0 val getBool = fn (p, i) => intToBool(getInt32 (p, i)) fun boolToInt (b: bool): Int32.int = if b then 1 else 0 val setBool = fn (p, i, x) => setInt32 (p, i, boolToInt x) end mlton-20100608/basis-library/mlton/finalizable.sig0000644000076600000240000000071411404435631020442 0ustar mtfstaff(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_FINALIZABLE = sig type 'a t val addFinalizer: 'a t * ('a -> unit) -> unit val finalizeBefore: 'a t * 'b t -> unit val new: 'a -> 'a t val touch: 'a t -> unit val withValue: 'a t * ('a -> 'b) -> 'b end mlton-20100608/basis-library/mlton/finalizable.sml0000644000076600000240000000471711404435631020462 0ustar mtfstaff(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonFinalizable: MLTON_FINALIZABLE = struct structure List = struct open List fun push (l, x) = l := x :: !l fun foreach (l, f) = app f l end datatype 'a t = T of {afters: (unit -> unit) list ref, finalizers: ('a -> unit) list ref, value: 'a ref} fun touch (T {value, ...}) = Primitive.MLton.Finalizable.touch value fun withValue (f as T {value, ...}, g) = DynamicWind.wind (fn () => g (!value), fn () => touch f) fun addFinalizer (T {finalizers, ...}, f) = List.push (finalizers, f) val finalize = let val r: {clean: unit -> unit, isAlive: unit -> bool} list ref = ref [] fun clean l = List.foldl (fn (z as {clean: unit -> unit, isAlive}, (gotOne, zs)) => if isAlive () then (gotOne, z :: zs) else (clean (); (true, zs))) (false, []) l val _ = MLtonSignal.handleGC (fn () => r := #2 (clean (!r))) val _ = Cleaner.addNew (Cleaner.atExit, fn () => let val l = !r (* Must clear r so that the handler doesn't interfere and so that * all other references to the finalizers are dropped. *) val _ = r := [] fun loop l = let val _ = MLtonGC.collect () val (gotOne, l) = clean l in if gotOne then loop l else () end in loop l end) in fn z => r := z :: !r end fun new (v: 'a): 'a t = let val afters = ref [] val finalizers = ref [] val value = ref v val f = T {afters = afters, finalizers = finalizers, value = value} val weak = MLtonWeak.new value fun clean () = (List.foreach (!finalizers, fn f => f v) ; List.foreach (!afters, fn f => f ())) fun isAlive () = isSome (MLtonWeak.get weak) val _ = finalize {clean = clean, isAlive = isAlive} in f end fun finalizeBefore (T {afters, ...}, f) = List.push (afters, fn () => touch f) end mlton-20100608/basis-library/mlton/gc.sig0000644000076600000240000000154211404435631016553 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_GC = sig val collect: unit -> unit val pack: unit -> unit val setMessages: bool -> unit val setSummary: bool -> unit val unpack: unit -> unit (* Most meaningful immediately after 'collect()'. *) structure Statistics : sig val bytesAllocated: unit -> IntInf.int val lastBytesLive: unit -> IntInf.int val numCopyingGCs: unit -> IntInf.int val numMarkCompactGCs: unit -> IntInf.int val numMinorGCs: unit -> IntInf.int val maxBytesLive: unit -> IntInf.int end end mlton-20100608/basis-library/mlton/gc.sml0000644000076600000240000000275711404435631016575 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonGC = struct open Primitive.MLton.GC val gcState = Primitive.MLton.GCState.gcState val pack : unit -> unit = fn () => pack gcState val unpack : unit -> unit = fn () => unpack gcState val setHashConsDuringGC : bool -> unit = fn b => setHashConsDuringGC (gcState, b) val setMessages : bool -> unit = fn b => setMessages (gcState, b) val setRusageMeasureGC : bool -> unit = fn b => setRusageMeasureGC (gcState, b) val setSummary : bool -> unit = fn b => setSummary (gcState, b) structure Statistics = struct local fun mk conv prim = fn () => conv (prim gcState) val mkSize = mk C_Size.toLargeInt val mkUIntmax = mk C_UIntmax.toLargeInt in val bytesAllocated = mkUIntmax getBytesAllocated val lastBytesLive = mkSize getLastBytesLive val maxBytesLive = mkSize getMaxBytesLive val numCopyingGCs = mkUIntmax getNumCopyingGCs val numMarkCompactGCs = mkUIntmax getNumMarkCompactGCs val numMinorGCs = mkUIntmax getNumMinorGCs end end end mlton-20100608/basis-library/mlton/int-inf.sig0000644000076600000240000000105511404435631017525 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_INT_INF = sig type t val areSmall: t * t -> bool val gcd: t * t -> t val isSmall: t -> bool structure BigWord : WORD structure SmallInt : INTEGER datatype rep = Big of BigWord.word vector | Small of SmallInt.int val rep: t -> rep val fromRep: rep -> t option end mlton-20100608/basis-library/mlton/io.fun0000644000076600000240000000220711404435631016576 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MLtonIO (S: MLTON_IO_ARG): MLTON_IO = struct open S fun mkstemps {prefix, suffix}: string * outstream = let fun loop () = let val name = concat [prefix, MLtonRandom.alphaNumString 6, suffix] open Posix.FileSys in (name, newOut (createf (name, O_WRONLY, O.flags [O.excl], let open S in flags [irusr, iwusr] end), name)) end handle e as PosixError.SysErr (_, SOME s) => if s = Posix.Error.exist then loop () else raise e in loop () end fun mkstemp s = mkstemps {prefix = s, suffix = ""} fun tempPrefix file = case MLtonPlatform.OS.host of MLtonPlatform.OS.MinGW => (case MinGW.getTempPath () of SOME d => d | NONE => "C:\\temp\\") ^ file | _ => "/tmp/" ^ file end mlton-20100608/basis-library/mlton/io.sig0000644000076600000240000000201311404435631016563 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_IO_ARG = sig type instream type outstream val inFd: instream -> Posix.IO.file_desc val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val outFd: outstream -> Posix.IO.file_desc end signature MLTON_IO = sig include MLTON_IO_ARG (* mkstemp s creates and opens a new temp file with prefix s, returning * the name of the temp file and the outstream to write to it. *) val mkstemp: string -> string * outstream (* mkstemps is like mkstemp, except it has both a prefix and suffix. *) val mkstemps: {prefix: string, suffix: string} -> string * outstream (* adds a suitable system or user specific prefix (dir) for temp files *) val tempPrefix : string -> string end mlton-20100608/basis-library/mlton/itimer.sig0000644000076600000240000000072111404435631017451 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_ITIMER = sig datatype t = Prof | Real | Virtual val set: t * {interval: Time.time, value: Time.time} -> unit val signal: t -> Posix.Signal.signal end mlton-20100608/basis-library/mlton/itimer.sml0000644000076600000240000000257211404435631017470 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonItimer = struct structure Prim = PrimitiveFFI.MLton.Itimer datatype t = Prof | Real | Virtual val signal = fn Prof => PosixSignal.prof | Real => PosixSignal.alrm | Virtual => PosixSignal.vtalrm val toInt = fn Prof => Prim.PROF | Real => Prim.REAL | Virtual => Prim.VIRTUAL fun set' (t, {interval, value}) = let fun split t = let val q = LargeInt.quot (Time.toMicroseconds t, 1000000) val r = LargeInt.rem (Time.toMicroseconds t, 1000000) in (C_Time.fromLargeInt q, C_SUSeconds.fromLargeInt r) end val (s1, u1) = split interval val (s2, u2) = split value in ignore (Prim.set (toInt t, s1, u1, s2, u2)) end fun set (z as (t, _)) = if Primitive.MLton.Profile.isOn andalso t = Prof then let open PosixError in raiseSys inval end else set' z end mlton-20100608/basis-library/mlton/mlton.sig0000644000076600000240000000563611404435631017323 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON = sig (* val cleanAtExit: unit -> unit *) val debug: bool (* val deserialize: Word8Vector.vector -> 'a *) (* Pointer equality. The usual caveats about lack of a well-defined * semantics. *) val eq: 'a * 'a -> bool (* Structural equality. Equivalent to SML's polymorphic * equality on equality types and a conservative approximation * of equivalence other types. *) val equal: 'a * 'a -> bool (* Structural hash. *) val hash: 'a -> Word32.word (* val errno: unit -> int *) (* the value of the C errno global *) val isMLton: bool val safe: bool (* val serialize: 'a -> Word8Vector.vector *) val share: 'a -> unit val shareAll: unit -> unit val size: 'a -> int structure Array: MLTON_ARRAY structure BinIO: MLTON_BIN_IO (* structure CallStack: MLTON_CALL_STACK *) structure CharArray: MLTON_MONO_ARRAY structure CharVector: MLTON_MONO_VECTOR structure Cont: MLTON_CONT structure Exn: MLTON_EXN structure Finalizable: MLTON_FINALIZABLE structure GC: MLTON_GC structure IntInf: MLTON_INT_INF structure Itimer: MLTON_ITIMER structure LargeReal: MLTON_REAL structure LargeWord: MLTON_WORD structure Platform: MLTON_PLATFORM structure Pointer: MLTON_POINTER structure ProcEnv: MLTON_PROC_ENV structure Process: MLTON_PROCESS structure Profile: MLTON_PROFILE (* structure Ptrace: MLTON_PTRACE *) structure Random: MLTON_RANDOM structure Real: MLTON_REAL structure Real32: sig include MLTON_REAL val castFromWord: Word32.word -> t val castToWord: t -> Word32.word end structure Real64: sig include MLTON_REAL val castFromWord: Word64.word -> Real64.real val castToWord: Real64.real -> Word64.word end structure Rlimit: MLTON_RLIMIT structure Rusage: MLTON_RUSAGE structure Signal: MLTON_SIGNAL structure Socket: MLTON_SOCKET structure Syslog: MLTON_SYSLOG structure TextIO: MLTON_TEXT_IO structure Thread: MLTON_THREAD structure Vector: MLTON_VECTOR structure Weak: MLTON_WEAK structure Word: MLTON_WORD structure Word8: MLTON_WORD structure Word16: MLTON_WORD structure Word32: MLTON_WORD structure Word64: MLTON_WORD structure Word8Array: MLTON_MONO_ARRAY structure Word8Vector: MLTON_MONO_VECTOR structure World: MLTON_WORLD end mlton-20100608/basis-library/mlton/mlton.sml0000644000076600000240000000707011404435631017326 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLton: MLTON = struct val isMLton = true (* The ref stuff is so that the (de)serializer always deals with pointers * to heap objects. *) (* val serialize = fn x => serialize (ref x) * val deserialize = fn x => !(deserialize x) *) val share = Primitive.MLton.share structure GC = MLtonGC fun shareAll () = (GC.setHashConsDuringGC true ; GC.collect ()) fun size x = let val refOverhead = Int.div (HeaderWord.wordSize + ObjptrWord.wordSize, 8) in C_Size.toInt (Primitive.MLton.size (ref x)) - refOverhead end (* fun cleanAtExit () = let open Cleaner in clean atExit end *) val debug = Primitive.Controls.debug val eq = Primitive.MLton.eq val equal = Primitive.MLton.equal val hash = Primitive.MLton.hash (* val errno = Primitive.errno *) val safe = Primitive.Controls.safe structure Array = Array structure BinIO = MLtonIO (BinIO) (*structure CallStack = MLtonCallStack*) structure CharArray = struct open CharArray type t = array end structure CharVector = struct open CharVector type t = vector end structure Cont = MLtonCont structure Exn = MLtonExn structure Finalizable = MLtonFinalizable structure IntInf = struct open IntInf type t = int end structure Itimer = MLtonItimer structure LargeReal = struct open LargeReal type t = real end structure LargeWord = struct open LargeWord type t = word end structure Platform = MLtonPlatform structure Pointer = MLtonPointer structure ProcEnv = MLtonProcEnv structure Process = MLtonProcess (* structure Ptrace = MLtonPtrace *) structure Profile = MLtonProfile structure Random = MLtonRandom structure Real = struct open Real type t = real end structure Real32 = struct open Real32 type t = real open Primitive.PackReal32 end structure Real64 = struct open Real64 type t = real open Primitive.PackReal64 end structure Rlimit = MLtonRlimit structure Rusage = MLtonRusage structure Signal = MLtonSignal structure Socket = MLtonSocket structure Syslog = MLtonSyslog structure TextIO = MLtonIO (TextIO) structure Thread = MLtonThread structure Vector = Vector structure Weak = MLtonWeak structure World = MLtonWorld structure Word = struct open Word type t = word end structure Word8 = struct open Word8 type t = word end structure Word16 = struct open Word16 type t = word end structure Word32 = struct open Word32 type t = word end structure Word64 = struct open Word64 type t = word end structure Word8Array = struct open Word8Array type t = array end structure Word8Vector = struct open Word8Vector type t = vector end val _ = (Primitive.TopLevel.setHandler MLtonExn.defaultTopLevelHandler ; Primitive.TopLevel.setSuffix Exit.defaultTopLevelSuffix) end (* Patch OS.FileSys.tmpName to use mkstemp. *) structure OS = struct open OS structure FileSys = struct open FileSys fun tmpName () = let val (f, out) = MLton.TextIO.mkstemp (MLton.TextIO.tempPrefix "file") val _ = TextIO.closeOut out in f end end end mlton-20100608/basis-library/mlton/mono-array.sig0000644000076600000240000000017411404435631020246 0ustar mtfstaffsignature MLTON_MONO_ARRAY = sig type t type elem val fromPoly: elem array -> t val toPoly: t -> elem array end mlton-20100608/basis-library/mlton/mono-vector.sig0000644000076600000240000000017711404435631020435 0ustar mtfstaffsignature MLTON_MONO_VECTOR = sig type t type elem val fromPoly: elem vector -> t val toPoly: t -> elem vector end mlton-20100608/basis-library/mlton/platform.sig0000644000076600000240000000205211404435631020003 0ustar mtfstaff(* Copyright (C) 2003-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PLATFORM = sig structure Arch: sig datatype t = Alpha | AMD64 | ARM | HPPA | IA64 | m68k | MIPS | PowerPC | PowerPC64 | S390 | Sparc | X86 val fromString: string -> t option val host: t val toString: t -> string end structure Format: sig datatype t = Archive | Executable | LibArchive | Library val fromString: string -> t option val host: t val toString: t -> string end structure OS: sig datatype t = AIX | Cygwin | Darwin | FreeBSD | Hurd | HPUX | Linux | MinGW | NetBSD | OpenBSD | Solaris val fromString: string -> t option val host: t val toString: t -> string end end mlton-20100608/basis-library/mlton/platform.sml0000644000076600000240000000465711404435631020031 0ustar mtfstaff(* Copyright (C) 2003-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonPlatform: MLTON_PLATFORM = struct open Primitive.MLton.Platform fun peek (l, f) = List.find f l fun omap (opt, f) = Option.map f opt structure Arch = struct open Arch val all = [ (Alpha, "Alpha"), (AMD64, "AMD64"), (ARM, "ARM"), (HPPA, "HPPA"), (IA64, "IA64"), (m68k, "m68k"), (MIPS, "MIPS"), (PowerPC, "PowerPC"), (PowerPC64, "PowerPC64"), (S390, "S390"), (Sparc, "Sparc"), (X86, "X86")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) end structure Format = struct open Format val all = [ (Archive, "Archive"), (Executable, "Executable"), (LibArchive, "LibArchive"), (Library, "Library")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) end structure OS = struct open OS val all = [ (AIX, "AIX"), (Cygwin, "Cygwin"), (Darwin, "Darwin"), (FreeBSD, "FreeBSD"), (Hurd, "Hurd"), (HPUX, "HPUX"), (Linux, "Linux"), (MinGW, "MinGW"), (NetBSD, "NetBSD"), (OpenBSD, "OpenBSD"), (Solaris, "Solaris")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) end end mlton-20100608/basis-library/mlton/pointer.sig0000644000076600000240000000323311404435631017641 0ustar mtfstaff(* Copyright (C) 2003-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_POINTER = sig eqtype t val add: t * word -> t val compare: t * t -> order val diff: t * t -> word (* val free: t -> unit *) val getInt8: t * int -> Int8.int val getInt16: t * int -> Int16.int val getInt32: t * int -> Int32.int val getInt64: t * int -> Int64.int val getPointer: t * int -> t val getReal32: t * int -> Real32.real val getReal64: t * int -> Real64.real val getWord8: t * int -> Word8.word val getWord16: t * int -> Word16.word val getWord32: t * int -> Word32.word val getWord64: t * int -> Word64.word val null: t val setInt8: t * int * Int8.int -> unit val setInt16: t * int * Int16.int -> unit val setInt32: t * int * Int32.int -> unit val setInt64: t * int * Int64.int -> unit val setPointer: t * int * t -> unit val setReal32: t * int * Real32.real -> unit val setReal64: t * int * Real64.real -> unit val setWord8: t * int * Word8.word -> unit val setWord16: t * int * Word16.word -> unit val setWord32: t * int * Word32.word -> unit val setWord64: t * int * Word64.word -> unit val sizeofPointer: word val sub: t * word -> t end signature MLTON_POINTER_EXTRA = sig include MLTON_POINTER val getCPointer: t * int -> t val setCPointer: t * int * t -> unit val getObjptr: t * int -> 'a val setObjptr: t * int * 'a -> unit end mlton-20100608/basis-library/mlton/pointer.sml0000644000076600000240000000322211404435631017650 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 2003-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonPointer: MLTON_POINTER_EXTRA = struct open Primitive.MLton.Pointer val sizeofPointer = Word.div (Word.fromInt C_Size.wordSize, 0w8) val add = fn (p, t) => add (p, C_Ptrdiff.fromLarge (Word.toLargeIntX t)) val sub = fn (p, t) => sub (p, C_Ptrdiff.fromLarge (Word.toLargeIntX t)) val diff = fn (p, p') => Word.fromLargeInt (C_Ptrdiff.toLarge (diff (p, p'))) local fun wrap f (p, i) = f (p, C_Ptrdiff.fromInt i) in val getCPointer = wrap getCPointer val getInt8 = wrap getInt8 val getInt16 = wrap getInt16 val getInt32 = wrap getInt32 val getInt64 = wrap getInt64 val getObjptr = fn (p, i) => (wrap getObjptr) (p, i) val getReal32 = wrap getReal32 val getReal64 = wrap getReal64 val getWord8 = wrap getWord8 val getWord16 = wrap getWord16 val getWord32 = wrap getWord32 val getWord64 = wrap getWord64 end val getPointer = getCPointer local fun wrap f (p, i, x) = f (p, C_Ptrdiff.fromInt i, x) in val setCPointer = wrap setCPointer val setInt8 = wrap setInt8 val setInt16 = wrap setInt16 val setInt32 = wrap setInt32 val setInt64 = wrap setInt64 val setObjptr = fn (p, i, x) => (wrap setObjptr) (p, i, x) val setReal32 = wrap setReal32 val setReal64 = wrap setReal64 val setWord8 = wrap setWord8 val setWord16 = wrap setWord16 val setWord32 = wrap setWord32 val setWord64 = wrap setWord64 end val setPointer = setCPointer end mlton-20100608/basis-library/mlton/proc-env.sig0000644000076600000240000000062211404435631017711 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROC_ENV = sig type gid val setenv: {name: string, value: string} -> unit val setgroups: gid list -> unit end mlton-20100608/basis-library/mlton/proc-env.sml0000644000076600000240000000164211404435631017725 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonProcEnv: MLTON_PROC_ENV = struct structure GId = PrePosix.GId type gid = GId.t fun setenv {name, value} = let val name = NullString.nullTerm name val value = NullString.nullTerm value in PosixError.SysCall.simple (fn () => PrimitiveFFI.Posix.ProcEnv.setenv (name, value)) end fun setgroups gs = let val v = GId.vectorToRep (Vector.fromList gs) val n = C_Int.fromInt (Vector.length v) in PosixError.SysCall.simple (fn () => PrimitiveFFI.Posix.ProcEnv.setgroups (n, v)) end end mlton-20100608/basis-library/mlton/process.sig0000644000076600000240000000563611404435631017650 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROCESS = sig type pid val spawn: {args: string list, path: string} -> pid val spawne: {args: string list, env: string list, path: string} -> pid val spawnp: {file: string, args: string list} -> pid (* Process handle *) type ('stdin, 'stdout, 'stderr) t (* is the io 'dir input or output *) type input type output (* to what use can the stdio channel be put *) type none (* it's not connected to a pipe *) type chain (* connect one child to another *) type any (* any use is allowed -- dangerous *) exception MisuseOfForget (* you avoided the type safety and broke it *) exception DoublyRedirected (* you tried to reuse a Param.child *) structure Child: sig type ('use, 'dir) t val binIn: (BinIO.instream, input) t -> BinIO.instream val binOut: (BinIO.outstream, output) t -> BinIO.outstream (* not necessarily available on all systems; may raise an exception *) val fd: (Posix.FileSys.file_desc, 'dir) t -> Posix.FileSys.file_desc (* used for situations where 'forget' was needed for arbitrary redir *) val remember: (any, 'dir) t -> ('use, 'dir) t val textIn: (TextIO.instream, input) t -> TextIO.instream val textOut: (TextIO.outstream, output) t -> TextIO.outstream end structure Param: sig type ('use, 'dir) t (* {child,fd} close their parameter when create is called. * therefore they may only be used once! *) val child: (chain, 'dir) Child.t -> (none, 'dir) t (* Not necessarily available on all systems; may raise an exception *) val fd: Posix.FileSys.file_desc -> (none, 'dir) t val file: string -> (none, 'dir) t (* used if you want to return two posibilities; use with care *) val forget: ('use, 'dir) t -> (any, 'dir) t val null: (none, 'dir) t val pipe: ('use, 'dir) t val self: (none, 'dir) t end val create: {args: string list, env: string list option, path: string, stderr: ('stderr, output) Param.t, stdin: ('stdin, input) Param.t, stdout: ('stdout, output) Param.t} -> ('stdin, 'stdout, 'stderr) t val getStderr: ('stdin, 'stdout, 'stderr) t -> ('stderr, input) Child.t val getStdin: ('stdin, 'stdout, 'stderr) t -> ('stdin, output) Child.t val getStdout: ('stdin, 'stdout, 'stderr) t -> ('stdout, input) Child.t val kill: ('stdin, 'stdout, 'stderr) t * Posix.Signal.signal -> unit val reap: ('stdin, 'stdout, 'stderr) t -> Posix.Process.exit_status end mlton-20100608/basis-library/mlton/process.sml0000644000076600000240000003704111404435631017654 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonProcess = struct structure Prim = PrimitiveFFI.MLton.Process structure MLton = Primitive.MLton local open Posix in structure FileSys = FileSys structure IO = IO structure ProcEnv = ProcEnv structure Process = Process structure FileDesc = PrePosix.FileDesc structure PId = PrePosix.PId structure Signal = PrePosix.Signal end structure Mask = MLtonSignal.Mask structure SysCall = PosixError.SysCall type pid = PId.t exception MisuseOfForget exception DoublyRedirected type input = unit type output = unit type none = unit type chain = unit type any = unit val useWindowsProcess = MLton.Platform.OS.useWindowsProcess val readWrite = let open FileSys.S in flags [irusr, iwusr, irgrp, iwgrp, iroth, iwoth] end structure Child = struct datatype 'use childt = FileDesc of FileSys.file_desc | Stream of 'use * ('use -> unit) | Term type ('use, 'dir) t = 'use childt ref (* This is _not_ the identity; by rebuilding it we get type * ('a, 'b) t -> ('c, 'd) t *) fun remember x = case !x of FileDesc f => (x := Stream ((), fn () => ()) ; ref (FileDesc f)) | Stream _ => raise MisuseOfForget (* remember twice = bad *) | Term => ref Term local fun convert (new, close) p = case !p of FileDesc fd => let val str = new (fd, "") val () = p := Stream (str, close) in str end | Stream (str, _) => str | Term => raise MisuseOfForget in val binIn = convert (BinIO.newIn, BinIO.closeIn) val binOut = convert (BinIO.newOut, BinIO.closeOut) val textIn = convert (TextIO.newIn, TextIO.closeIn) val textOut = convert (TextIO.newOut, TextIO.closeOut) end fun fd p = case !p of FileDesc fd => fd | _ => raise MisuseOfForget fun close ch = case ch of FileDesc fd => IO.close fd | Stream (str, close) => close str | Term => () val close = fn (stdin, stdout, stderr) => (close stdin; close stdout; close stderr) end structure Param = struct datatype ('use, 'dir) t = File of string | FileDesc of FileSys.file_desc | Pipe | Self (* This is _not_ the identity; by rebuilding it we get type * ('a, 'b) t -> ('c, 'd) t *) val forget = fn File x => File x | FileDesc f => FileDesc f | Pipe => Pipe | Self => Self val pipe = Pipe local val null = if useWindowsProcess then "nul" else "/dev/null" in val null = File null end val self = Self fun file f = File f fun fd f = FileDesc f fun child c = FileDesc (case !c of Child.FileDesc f => (c := Child.Stream ((), fn () => ()); f) | Child.Stream _ => raise DoublyRedirected | Child.Term => raise MisuseOfForget) fun setCloseExec fd = if useWindowsProcess then () else IO.setfd (fd, IO.FD.flags [IO.FD.cloexec]) local fun openOut std p = case p of File s => (FileSys.creat (s, readWrite), Child.Term) | FileDesc f => (f, Child.Term) | Pipe => let val {infd, outfd} = IO.pipe () val () = setCloseExec infd in (outfd, Child.FileDesc infd) end | Self => (std, Child.Term) in fun openStdout p = openOut FileSys.stdout p fun openStderr p = openOut FileSys.stderr p end fun openStdin p = case p of File s => (FileSys.openf (s, FileSys.O_RDONLY, FileSys.O.flags []), Child.Term) | FileDesc f => (f, Child.Term) | Pipe => let val {infd, outfd} = IO.pipe () val () = setCloseExec outfd in (infd, Child.FileDesc outfd) end | Self => (FileSys.stdin, Child.Term) fun close p fd = case p of File _ => IO.close fd | FileDesc _ => IO.close fd | Pipe => IO.close fd | _ => () end datatype ('stdin, 'stdout, 'stderr) t = T of {pid: Process.pid, (* if useWindowsProcess, * then this is a Windows process handle * and can't be passed to * Posix.Process.* functions. *) status: Posix.Process.exit_status option ref, stderr: ('stderr, input) Child.t, stdin: ('stdin, output) Child.t, stdout: ('stdout, input) Child.t} local fun make f (T r) = f r in val getStderr = fn z => make #stderr z val getStdin = fn z => make #stdin z val getStdout = fn z => make #stdout z end fun ('a, 'b) protect (f: 'a -> 'b, x: 'a): 'b = let val () = Mask.block Mask.all in DynamicWind.wind (fn () => f x, fn () => Mask.unblock Mask.all) end local fun reap reapFn (T {pid, status, stderr, stdin, stdout, ...}) = case !status of NONE => let val _ = Child.close (!stdin, !stdout, !stderr) val st = reapFn pid in status := SOME st ; st end | SOME st => st in fun reapForFork p = reap (fn pid => let (* protect is probably too much; typically, one * would only mask SIGINT, SIGQUIT and SIGHUP. *) val (_, st) = protect (Process.waitpid, (Process.W_CHILD pid, [])) in st end) p fun reapForCreate p = reap (fn pid => let val pid' = PId.toRep pid val status' = ref (C_Status.fromInt 0) val () = SysCall.simple (fn () => PrimitiveFFI.Windows.Process.getexitcode (pid', status')) in Process.fromStatus' (!status') end) p end val reap = fn p => (if useWindowsProcess then reapForCreate else reapForFork) p local fun kill killFn (p as T {pid, status, ...}, signal) = case !status of NONE => let val () = killFn (pid, signal) in ignore (reap p) end | SOME _ => () in fun killForFork p = kill (fn (pid, signal) => Process.kill (Process.K_PROC pid, signal)) p fun killForCreate p = kill (fn (pid, signal) => SysCall.simple (fn () => PrimitiveFFI.Windows.Process.terminate (PId.toRep pid, Signal.toRep signal))) p end val kill = fn (p, signal) => (if useWindowsProcess then killForCreate else killForFork) (p, signal) fun launchWithFork (path, args, env, stdin, stdout, stderr) = case protect (Process.fork, ()) of NONE => (* child *) let fun dup2 (old, new) = if old = new then () else (IO.dup2 {old = old, new = new}; IO.close old) val args = path :: args val execTh = case env of NONE => (fn () => Process.exec (path, args)) | SOME env => (fn () => Process.exece (path, args, env)) in dup2 (stdin, FileSys.stdin) ; dup2 (stdout, FileSys.stdout) ; dup2 (stderr, FileSys.stderr) ; ignore (execTh ()) ; Process.exit 0w127 (* just in case *) end | SOME pid => pid (* parent *) fun strContains seps s = CharVector.exists (Char.contains seps) s (* In MinGW, a string must be escaped if it contains " \t" or is "". * Escaping means adds "s on the front and end. Any quotes inside * must be escaped with \. Any \s already in the string must be * doubled ONLY when they precede a " or the end of string. *) fun mingwEscape (l, 0) = l | mingwEscape (l, i) = mingwEscape (#"\\"::l, i-1) fun mingwFold (#"\\", (l, escapeCount)) = (#"\\"::l, escapeCount+1) | mingwFold (#"\"", (l, escapeCount)) = (#"\"" :: mingwEscape (#"\\"::l, escapeCount), 0) | mingwFold (x, (l, _)) = (x :: l, 0) val mingwQuote = mingwEscape o CharVector.foldl mingwFold ([#"\""], 0) fun mingwEscape y = if not (strContains " \t\"" y) andalso y<>"" then y else String.implode (List.rev (#"\"" :: mingwQuote y)) fun cygwinEscape y = if not (strContains " \t\"\r\n\f'" y) andalso y<>"" then y else concat ["\"", String.translate (fn #"\"" => "\\\"" | #"\\" => "\\\\" | x => String.str x) y, "\""] val cmdEscapeCreate = if MLton.Platform.OS.host = MLton.Platform.OS.MinGW then mingwEscape else cygwinEscape val cmdEscapeSpawn = if MLton.Platform.OS.host = MLton.Platform.OS.MinGW then mingwEscape else (fn s => s) fun launchWithCreate (path, args, env, stdin, stdout, stderr) = let val path' = NullString.nullTerm (let open MLton.Platform.OS in case host of Cygwin => Cygwin.toFullWindowsPath path | MinGW => path | _ => raise Fail "MLton.Process.launchWithCreate: path'" end) val args' = NullString.nullTerm (String.concatWith " " (List.map cmdEscapeCreate (path :: args))) val env' = Option.map (fn env => NullString.nullTerm ((String.concatWith "\000" env) ^ "\000")) env val stdin' = FileDesc.toRep stdin val stdout' = FileDesc.toRep stdout val stderr' = FileDesc.toRep stderr val createTh = case env' of NONE => (fn () => PrimitiveFFI.Windows.Process.createNull (path', args', stdin', stdout', stderr')) | SOME env' => (fn () => PrimitiveFFI.Windows.Process.create (path', args', env', stdin', stdout', stderr')) val pid' = SysCall.simpleResult' ({errVal = C_PId.castFromFixedInt ~1}, fn () => createTh ()) val pid = PId.fromRep pid' in pid end val launch = fn z => (if useWindowsProcess then launchWithCreate else launchWithFork) z fun create {args, env, path, stderr, stdin, stdout} = if not (FileSys.access (path, [FileSys.A_EXEC])) then PosixError.raiseSys PosixError.noent else let val () = TextIO.flushOut TextIO.stdOut val (fstdin, cstdin) = Param.openStdin stdin val (fstdout, cstdout) = Param.openStdout stdout val (fstderr, cstderr) = Param.openStderr stderr val closeStdio = fn () => (Param.close stdin fstdin ; Param.close stdout fstdout ; Param.close stderr fstderr) val pid = launch (path, args, env, fstdin, fstdout, fstderr) handle ex => (closeStdio () ; Child.close (cstdin, cstdout, cstderr) ; raise ex) val () = closeStdio () in T {pid = pid, status = ref NONE, stderr = ref cstderr, stdin = ref cstdin, stdout = ref cstdout} end fun spawne {path, args, env} = if useWindowsProcess then let val args = List.map cmdEscapeSpawn args val path = NullString.nullTerm path val args = CUtil.C_StringArray.fromList args val env = CUtil.C_StringArray.fromList env in (PId.fromRep o SysCall.simpleResult') ({errVal = C_PId.castFromFixedInt ~1}, fn () => Prim.spawne (path, args, env)) end else case Posix.Process.fork () of NONE => (Posix.Process.exece (path, args, env) handle _ => () ; Posix.Process.exit 0w127) | SOME pid => pid fun spawn {args, path}= spawne {args = args, env = ProcEnv.environ (), path = path} fun spawnp {args, file} = if useWindowsProcess then let val file = NullString.nullTerm file val args = List.map cmdEscapeSpawn args val args = CUtil.C_StringArray.fromList args in (PId.fromRep o SysCall.simpleResult') ({errVal = C_PId.castFromFixedInt ~1}, fn () => Prim.spawnp (file, args)) end else case Posix.Process.fork () of NONE => (Posix.Process.execp (file, args) handle _ => () ; Posix.Process.exit 0w127) | SOME pid => pid open Exit end mlton-20100608/basis-library/mlton/profile.sig0000644000076600000240000000105211404435631017616 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROFILE = sig structure Data: sig type t val equals: t * t -> bool val free: t -> unit val malloc: unit -> t val write: t * string -> unit end val isOn: bool (* a compile-time constant *) val withData: Data.t * (unit -> 'a) -> 'a end mlton-20100608/basis-library/mlton/profile.sml0000644000076600000240000000660511404435631017640 0ustar mtfstaff(* Copyright (C) 2003-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonProfile: MLTON_PROFILE = struct structure P = Primitive.MLton.Profile val gcState = Primitive.MLton.GCState.gcState val isOn = P.isOn structure Data = struct datatype t = T of {isCurrent: bool ref, isFreed: bool ref, raw: P.Data.t} val all: t list ref = ref [] local fun make f (T r) = f r in val isFreed = make #isFreed val raw = make #raw end fun equals (d, d') = isFreed d = isFreed d' fun free (d as T {isCurrent, isFreed, raw, ...}) = if not isOn then () else if !isFreed then raise Fail "free of freed profile data" else if !isCurrent then raise Fail "free of current profile data" else (all := List.foldl (fn (d', ac) => if equals (d, d') then ac else d' :: ac) [] (!all) ; P.Data.free (gcState, raw) ; isFreed := true) fun make (raw: P.Data.t): t = T {isCurrent = ref false, isFreed = ref false, raw = raw} fun malloc (): t = let val array = if isOn then P.Data.malloc gcState else P.Data.dummy val d = make array val _ = all := d :: !all in d end fun write (T {isFreed, raw, ...}, file) = if not isOn then () else if !isFreed then raise Fail "write of freed profile data" else P.Data.write (gcState, raw, Primitive.NullString8.fromString (String.nullTerm file)) end val r: Data.t ref = ref (Data.make P.Data.dummy) fun current () = !r fun setCurrent (d as Data.T {isCurrent, isFreed, raw, ...}) = if not isOn then () else if !isFreed then raise Fail "setCurrent of freed profile data" else let val Data.T {isCurrent = ic, ...} = current () val _ = ic := false val _ = isCurrent := true val _ = r := d val _ = P.setCurrent (gcState, raw) in () end fun withData (d: Data.t, f: unit -> 'a): 'a = let val old = current () val _ = setCurrent d in DynamicWind.wind (f, fn () => setCurrent old) end fun init () = setCurrent (Data.make (P.getCurrent gcState)) val _ = if not isOn then () else let val _ = Cleaner.addNew (Cleaner.atExit, fn () => (P.done gcState ; Data.write (current (), "mlmon.out") ; List.app (fn d => P.Data.free (gcState, Data.raw d)) (!Data.all))) val _ = Cleaner.addNew (Cleaner.atLoadWorld, fn () => ((* In a new world, all of the old profiling data is invalid. *) Data.all := [] ; init ())) in init () end end mlton-20100608/basis-library/mlton/ptrace.sig0000644000076600000240000000103011404435631017430 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PTRACE = sig type pid val attach: pid -> unit val cont: pid -> unit val detach: pid -> unit val kill: pid -> unit val peekText: pid * Word.word -> Word.word val singleStep: pid -> unit val sysCall: pid -> unit end mlton-20100608/basis-library/mlton/ptrace.sml0000644000076600000240000000160311404435631017447 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonPtrace: MLTON_PTRACE = struct open Primitive.Ptrace type pid = Pid.t local fun make request pid = PosixError.checkResult(ptrace2(request, pid)) in val attach = make ATTACH val cont = make CONT val detach = make DETACH val kill = make KILL val singleStep = make SINGLESTEP val sysCall = make SYSCALL end local in fun peekText(pid, addr) = let val data: word ref = ref 0w0 in PosixError.checkResult(ptrace4(PEEKTEXT, pid, addr, data)) ; !data end end end mlton-20100608/basis-library/mlton/random.sig0000644000076600000240000000174011404435631017442 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RANDOM = sig (* Return a random alphanumeric character. *) val alphaNumChar: unit -> char (* Return a string of random alphanumeric characters of specified * length. *) val alphaNumString: int -> string (* Get the next pseudrandom. *) val rand: unit -> word (* Use /dev/random to get a word. Useful as an arg to srand. * Return NONE if /dev/random can't be read. *) val seed: unit -> word option (* Set the seed used by rand. *) val srand: word -> unit (* Use /dev/urandom to get a word. Useful as an arg to srand. * Return NONE if /dev/urandom can't be read. *) val useed: unit -> word option end mlton-20100608/basis-library/mlton/random.sml0000644000076600000240000000657011404435631017461 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonRandom: MLTON_RANDOM = struct (* Uses /dev/random and /dev/urandom to get a random word. * If they can't be read from, return NONE. *) local fun make (file, name) = let val buf = Word8Array.array (4, 0w0) in fn () => (let val fd = let open Posix.FileSys in openf (file, O_RDONLY, O.flags []) end fun loop rem = let val n = Posix.IO.readArr (fd, Word8ArraySlice.slice (buf, 4 - rem, SOME rem)) val _ = if n = 0 then (Posix.IO.close fd; raise Fail name) else () val rem = rem - n in if rem = 0 then () else loop rem end val _ = loop 4 val _ = Posix.IO.close fd in SOME (Word.fromLarge (PackWord32Little.subArr (buf, 0))) end handle OS.SysErr _ => NONE) end in val seed = make ("/dev/random", "Random.seed") val useed = make ("/dev/urandom", "Random.useed") end local open Word val seed: word ref = ref 0w13 in (* From page 284 of Numerical Recipes in C. *) fun rand (): word = let val res = 0w1664525 * !seed + 0w1013904223 val _ = seed := res in res end fun srand (w: word): unit = seed := w end local val chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" val numChars = String.size chars val refresh = let val numChars = IntInf.fromInt numChars fun loop (i: IntInf.int, c: int): int = if IntInf.< (i, numChars) then c else loop (IntInf.div (i, numChars), c + 1) in loop (IntInf.pow (2, Word.wordSize), 0) end val r: word ref = ref 0w0 val count: int ref = ref refresh val numChars = Word.fromInt numChars in fun alphaNumChar (): char = let val n = !count val _ = if n = refresh then (r := rand () ; count := 1) else (count := n + 1) val w = !r val c = String.sub (chars, Word.toInt (Word.mod (w, numChars))) val _ = r := Word.div (w, numChars) in c end end fun alphaNumString (length: int): string = String.tabulate (length, fn _ => alphaNumChar ()) end mlton-20100608/basis-library/mlton/real.sig0000644000076600000240000000076411404435631017112 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_REAL = sig type t val fromWord: word -> t val fromLargeWord: LargeWord.word -> t val toWord: IEEEReal.rounding_mode -> t -> word val toLargeWord: IEEEReal.rounding_mode -> t -> LargeWord.word end mlton-20100608/basis-library/mlton/rlimit.sig0000644000076600000240000000251211404435631017460 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RLIMIT = sig structure RLim : sig type t val castFromSysWord: SysWord.word -> t val castToSysWord: t -> SysWord.word end val infinity: RLim.t type t val coreFileSize: t (* CORE max core file size *) val cpuTime: t (* CPU CPU time in seconds *) val dataSize: t (* DATA max data size *) val fileSize: t (* FSIZE Maximum filesize *) val numFiles: t (* NOFILE max number of open files *) val stackSize: t (* STACK max stack size *) val virtualMemorySize: t (* AS virtual memory limit *) (* NOT STANDARD *) val lockedInMemorySize: t (* MEMLOCK max locked address space *) val numProcesses: t (* NPROC max number of processes *) val residentSetSize: t (* RSS max resident set size *) (* *) val get: t -> {hard: RLim.t, soft: RLim.t} val set: t * {hard: RLim.t, soft: RLim.t} -> unit end mlton-20100608/basis-library/mlton/rlimit.sml0000644000076600000240000000205211404435631017470 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonRlimit: MLTON_RLIMIT = struct open PrimitiveFFI.MLton.Rlimit structure RLim = C_RLim type t = C_Int.t val get = fn (r: t) => PosixError.SysCall.syscall (fn () => (get r, fn _ => {hard = getHard (), soft = getSoft ()})) val set = fn (r: t, {hard, soft}) => PosixError.SysCall.simple (fn () => set (r, hard, soft)) val infinity = INFINITY val coreFileSize = CORE val cpuTime = CPU val dataSize = DATA val fileSize = FSIZE val numFiles = NOFILE val stackSize = STACK val virtualMemorySize = AS (* NOT STANDARD *) val lockedInMemorySize = MEMLOCK val numProcesses = NPROC val residentSetSize = RSS (* *) end mlton-20100608/basis-library/mlton/rusage.sig0000644000076600000240000000074411404435631017453 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RUSAGE = sig type t = {utime: Time.time, (* user time *) stime: Time.time} (* system time *) val measureGC: bool -> unit val rusage: unit -> {children: t, gc: t, self: t} end mlton-20100608/basis-library/mlton/rusage.sml0000644000076600000240000000316111404435631017460 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonRusage: MLTON_RUSAGE = struct structure Prim = PrimitiveFFI.MLton.Rusage type t = {utime: Time.time, stime: Time.time} fun collect (utimeSec, utimeUsec, stimeSec, stimeUsec) = let fun toTime (sec, usec) = let val time_sec = Time.fromSeconds (C_Time.toLargeInt (sec ())) val time_usec = Time.fromMicroseconds (C_SUSeconds.toLargeInt (usec ())) in Time.+ (time_sec, time_usec) end in {stime = toTime (stimeSec, stimeUsec), utime = toTime (utimeSec, utimeUsec)} end val measureGC = MLtonGC.setRusageMeasureGC val rusage = let val () = measureGC true in fn () => let val () = Prim.getrusage () open Prim in {children = collect (children_utime_sec, children_utime_usec, children_stime_sec, children_stime_usec), gc = collect (gc_utime_sec, gc_utime_usec, gc_stime_sec, gc_stime_usec), self = collect (self_utime_sec, self_utime_usec, self_stime_sec, self_stime_usec)} end end end mlton-20100608/basis-library/mlton/signal.sig0000644000076600000240000000277311404435631017446 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_SIGNAL = sig type t type signal = t structure Handler: sig type t val default: t val handler: (MLtonThread.Runnable.t -> MLtonThread.Runnable.t) -> t val ignore: t val isDefault: t -> bool val isIgnore: t -> bool val simple: (unit -> unit) -> t end structure Mask: sig type t val all: t val allBut: signal list -> t val block: t -> unit val getBlocked: unit -> t val isMember: t * signal -> bool val none: t val setBlocked: t -> unit val some: signal list -> t val unblock: t -> unit end val getHandler: t -> Handler.t val handled: unit -> Mask.t val prof: t val restart: bool ref val setHandler: t * Handler.t -> unit (* suspend m temporarily sets the signal mask to m and suspends until an * unmasked signal is received and handled, and then resets the mask. *) val suspend: Mask.t -> unit val vtalrm: t end signature MLTON_SIGNAL_EXTRA = sig include MLTON_SIGNAL val handleGC: (unit -> unit) -> unit end mlton-20100608/basis-library/mlton/signal.sml0000644000076600000240000001642211404435631017453 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonSignal: MLTON_SIGNAL_EXTRA = struct open Posix.Signal structure Prim = PrimitiveFFI.Posix.Signal structure Error = PosixError structure SysCall = Error.SysCall val restart = SysCall.restartFlag type t = signal type how = C_Int.t fun raiseInval () = let open PosixError in raiseSys inval end val validSignals = Array.tabulate (C_Int.toInt Prim.NSIG, fn i => SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {return = Prim.sigismember (repFromInt i), post = fn _ => true, handlers = [(Error.inval, fn () => false)]})) structure Mask = struct datatype t = AllBut of signal list | Some of signal list val allBut = AllBut val some = Some val all = allBut [] val none = some [] fun read () = Some (Array.foldri (fn (i, b, sigs) => if b then let val s = fromInt i val s' = repFromInt i val res = SysCall.simpleResult (fn () => Prim.sigismember s') in if res = C_Int.fromInt 1 then s::sigs else sigs end else sigs) [] validSignals) fun write m = case m of AllBut signals => (SysCall.simple Prim.sigfillset ; List.app (fn s => SysCall.simple (fn () => Prim.sigdelset (toRep s))) signals) | Some signals => (SysCall.simple Prim.sigemptyset ; List.app (fn s => SysCall.simple (fn () => Prim.sigaddset (toRep s))) signals) local fun make (how: how) (m: t) = (write m; SysCall.simpleRestart (fn () => Prim.sigprocmask how)) in val block = make Prim.SIG_BLOCK val unblock = make Prim.SIG_UNBLOCK val setBlocked = make Prim.SIG_SETMASK fun getBlocked () = (make Prim.SIG_BLOCK none; read ()) end local fun member (sigs, s) = List.exists (fn s' => s = s') sigs in fun isMember (mask, s) = if Array.sub (validSignals, toInt s) then case mask of AllBut sigs => not (member (sigs, s)) | Some sigs => member (sigs, s) else raiseInval () end end structure Handler = struct datatype t = Default | Handler of MLtonThread.Runnable.t -> MLtonThread.Runnable.t | Ignore | InvalidSignal end datatype handler = datatype Handler.t local val r = ref C_Int.zero in fun initHandler (s: signal): Handler.t = SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {return = Prim.isDefault (toRep s, r), post = fn _ => if !r <> C_Int.zero then Default else Ignore, handlers = [(Error.inval, fn () => InvalidSignal)]}) end val (getHandler, setHandler, handlers) = let val handlers = Array.tabulate (C_Int.toInt Prim.NSIG, initHandler o fromInt) val _ = Cleaner.addNew (Cleaner.atLoadWorld, fn () => Array.modifyi (initHandler o fromInt o #1) handlers) in (fn s: t => Array.sub (handlers, toInt s), fn (s: t, h) => if Primitive.MLton.Profile.isOn andalso s = prof then raiseInval () else Array.update (handlers, toInt s, h), handlers) end val gcHandler = ref Ignore fun handled () = Mask.some (Array.foldri (fn (s, h, sigs) => case h of Handler _ => (fromInt s)::sigs | _ => sigs) [] handlers) structure Handler = struct open Handler val default = Default val ignore = Ignore val isDefault = fn Default => true | _ => false val isIgnore = fn Ignore => true | _ => false val handler = (* This let is used so that Thread.setHandler is only used if * Handler.handler is used. This prevents threads from being part * of every program. *) let (* As far as C is concerned, there is only one signal handler. * As soon as possible after a C signal is received, this signal * handler walks over the array of all SML handlers, and invokes any * one for which a C signal has been received. * * Any exceptions raised by a signal handler will be caught by * the topLevelHandler, which is installed in thread.sml. *) val _ = PosixError.SysCall.blocker := (fn () => let val m = Mask.getBlocked () val () = Mask.block (handled ()) in fn () => Mask.setBlocked m end) val () = MLtonThread.setSignalHandler (fn t => let val mask = Mask.getBlocked () val () = Mask.block (handled ()) val fs = case !gcHandler of Handler f => if Prim.isPendingGC () <> C_Int.zero then [f] else [] | _ => [] val fs = Array.foldri (fn (s, h, fs) => case h of Handler f => if Prim.isPending (repFromInt s) <> C_Int.zero then f::fs else fs | _ => fs) fs handlers val () = Prim.resetPending () val () = Mask.setBlocked mask in List.foldl (fn (f, t) => f t) t fs end) in Handler end fun simple (f: unit -> unit) = handler (fn t => (f (); t)) end val setHandler = fn (s, h) => case (getHandler s, h) of (InvalidSignal, _) => raiseInval () | (_, InvalidSignal) => raiseInval () | (Default, Default) => () | (_, Default) => (setHandler (s, Default) ; SysCall.simpleRestart (fn () => Prim.default (toRep s))) | (Handler _, Handler _) => setHandler (s, h) | (_, Handler _) => (setHandler (s, h) ; SysCall.simpleRestart (fn () => Prim.handlee (toRep s))) | (Ignore, Ignore) => () | (_, Ignore) => (setHandler (s, Ignore) ; SysCall.simpleRestart (fn () => Prim.ignore (toRep s))) fun suspend m = (Mask.write m ; Prim.sigsuspend () ; MLtonThread.switchToSignalHandler ()) fun handleGC f = (Prim.handleGC () ; gcHandler := Handler.simple f) end mlton-20100608/basis-library/mlton/socket.sig0000644000076600000240000000224611404435631017454 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_SOCKET = sig structure Address: sig type t = NetHostDB.in_addr val toVector : t -> Word8Vector.vector val fromVector : Word8Vector.vector -> t end structure Ctl: sig val getERROR: ('af, 'sock_type) Socket.sock -> (string * Posix.Error.syserror option) option end structure Port: sig type t = int end type t val accept: t -> Address.t * Port.t * TextIO.instream * TextIO.outstream val connect: string * Port.t -> TextIO.instream * TextIO.outstream val listen: unit -> Port.t * t val listenAt: Port.t -> t val shutdownRead: TextIO.instream -> unit val shutdownWrite: TextIO.outstream -> unit val fdToSock: Posix.FileSys.file_desc -> ('af, 'sock_type) Socket.sock end mlton-20100608/basis-library/mlton/socket.sml0000644000076600000240000000517511404435631017471 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonSocket: MLTON_SOCKET = struct structure Address = struct type t = NetHostDB.in_addr fun toVector x = x fun fromVector x = x end structure Ctl = Socket.CtlExtra structure Port = struct type t = int end type passiveSocket = (INetSock.inet, Socket.passive Socket.stream) Socket.sock type activeSocket = (INetSock.inet, Socket.active Socket.stream) Socket.sock type t = passiveSocket val listen: unit -> Port.t * passiveSocket = fn () => let val sl: passiveSocket = INetSock.TCP.socket () val _ = Socket.Ctl.setREUSEADDR (sl, true) val addr: INetSock.inet Socket.sock_addr = INetSock.any 0 val _ = Socket.bind (sl, addr) val _ = Socket.listen (sl, 5) val addr: INetSock.inet Socket.sock_addr = Socket.Ctl.getSockName sl val (_, port: int) = INetSock.fromAddr addr in (port, sl) end val listenAt: Port.t -> passiveSocket = fn port => let val sl: passiveSocket = INetSock.TCP.socket () val _ = Socket.Ctl.setREUSEADDR (sl, true) val addr: INetSock.inet Socket.sock_addr = INetSock.any port val _ = Socket.bind (sl, addr) val _ = Socket.listen (sl, 5) in sl end fun sockToIO (sock: activeSocket) = let val fd = Socket.sockToFD sock val ins = TextIO.newIn (fd, "") val out = TextIO.newOut (Posix.IO.dup fd, "") in (ins, out) end fun accept s = let val (sock: activeSocket, addr: INetSock.inet Socket.sock_addr) = Socket.accept s val (in_addr: NetHostDB.in_addr, port: int) = INetSock.fromAddr addr val (ins, out) = sockToIO sock in (in_addr, port, ins, out) end fun connect (host, port) = let val hp: NetHostDB.entry = valOf (NetHostDB.getByName host) val res: activeSocket = INetSock.TCP.socket () val addr: INetSock.inet Socket.sock_addr = INetSock.toAddr (NetHostDB.addr hp, port) val _ = Socket.connect (res, addr) val (ins, out) = sockToIO res in (ins, out) end fun shutdown (fd: Posix.IO.file_desc, mode: Socket.shutdown_mode): unit = Socket.shutdown (Socket.fdToSock fd, mode) fun shutdownRead ins = shutdown (TextIO.inFd ins, Socket.NO_RECVS) fun shutdownWrite out = (TextIO.flushOut out ; shutdown (TextIO.outFd out, Socket.NO_SENDS)) val fdToSock = Socket.fdToSock end mlton-20100608/basis-library/mlton/syslog.sig0000644000076600000240000000375411404435631017511 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* From Tom 7 . *) (* A rather complete interface to the syslog facilities. * * See * man 3 syslog * * .. for descriptions of these constants. *) signature MLTON_SYSLOG = sig type openflag val CONS : openflag val NDELAY : openflag val NOWAIT : openflag val ODELAY : openflag (* NOT STANDARD *) val PERROR : openflag (* *) val PID : openflag type facility val AUTHPRIV : facility val CRON : facility val DAEMON : facility val KERN : facility val LOCAL0 : facility val LOCAL1 : facility val LOCAL2 : facility val LOCAL3 : facility val LOCAL4 : facility val LOCAL5 : facility val LOCAL6 : facility val LOCAL7 : facility val LPR : facility val MAIL : facility val NEWS : facility (* NOT STANDARD *) val SYSLOG : facility (* *) val USER : facility val UUCP : facility type loglevel val EMERG : loglevel val ALERT : loglevel val CRIT : loglevel val ERR : loglevel val WARNING : loglevel val NOTICE : loglevel val INFO : loglevel val DEBUG : loglevel (* Closelog is also optional. *) val closelog: unit -> unit (* log a message at a particular loglevel. *) val log: loglevel * string -> unit (* * Openlog opens a connection to the system logger. * Calling openlog is optional but recommended. * From the man pages. * The string is prefixed to each message, and is typically set to the * program name. *) val openlog: string * openflag list * facility -> unit end mlton-20100608/basis-library/mlton/syslog.sml0000644000076600000240000000332411404435631017513 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* From Tom 7 . *) (* Implementation of the SYSLOG interface using MLton FFI. * This will only work in MLton. *) structure MLtonSyslog :> MLTON_SYSLOG = struct open PrimitiveFFI.MLton.Syslog type openflag = C_Int.t local open Logopt in val CONS = LOG_CONS val NDELAY = LOG_NDELAY val NOWAIT = LOG_NOWAIT val ODELAY = LOG_ODELAY (* NOT STANDARD *) val PERROR = LOG_PERROR (* *) val PID = LOG_PID end type facility = C_Int.t local open Facility in val AUTHPRIV = LOG_AUTH val CRON = LOG_CRON val DAEMON = LOG_DAEMON val KERN = LOG_KERN val LOCAL0 = LOG_LOCAL0 val LOCAL1 = LOG_LOCAL1 val LOCAL2 = LOG_LOCAL2 val LOCAL3 = LOG_LOCAL3 val LOCAL4 = LOG_LOCAL4 val LOCAL5 = LOG_LOCAL5 val LOCAL6 = LOG_LOCAL6 val LOCAL7 = LOG_LOCAL7 val LPR = LOG_LPR val MAIL = LOG_MAIL val NEWS = LOG_NEWS (* NOT STANDARD *) val SYSLOG = LOG_SYSLOG (* *) val USER = LOG_USER val UUCP = LOG_UUCP end type loglevel = C_Int.t local open Severity in val ALERT = LOG_ALERT val CRIT = LOG_CRIT val DEBUG = LOG_DEBUG val EMERG = LOG_EMERG val ERR = LOG_ERR val INFO = LOG_INFO val NOTICE = LOG_NOTICE val WARNING = LOG_WARNING end val openlog = fn (s, opt, fac) => let val optf = foldl C_Int.orb 0 opt in openlog (NullString.nullTerm s, optf, fac) end val closelog = fn () => closelog () val log = fn (lev, msg) => syslog (lev, NullString.nullTerm msg) end mlton-20100608/basis-library/mlton/text-io.sig0000644000076600000240000000043611404435631017554 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_TEXT_IO = MLTON_IO mlton-20100608/basis-library/mlton/thread.sig0000644000076600000240000000407011404435631017430 0ustar mtfstaff(* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) type int = Int.int signature MLTON_THREAD = sig structure AtomicState : sig datatype t = NonAtomic | Atomic of int end val atomically: (unit -> 'a) -> 'a val atomicBegin: unit -> unit val atomicEnd: unit -> unit val atomicState: unit -> AtomicState.t structure Runnable : sig type t end type 'a t (* atomicSwitch f * as switch, but assumes an atomic calling context. Upon * switch-ing back to the current thread, an implicit atomicEnd is * performed. *) val atomicSwitch: ('a t -> Runnable.t) -> 'a (* new f * create a new thread that, when run, applies f to * the value given to the thread. f must terminate by * switch-ing to another thread or exiting the process. *) val new: ('a -> unit) -> 'a t (* prepend(t, f) * create a new thread (destroying t in the process) that first * applies f to the value given to the thread and then continues * with t. This is a constant time operation. *) val prepend: 'a t * ('b -> 'a) -> 'b t (* prepare(t, v) * create a new runnable thread (destroying t in the process) * that will evaluate t on v. *) val prepare: 'a t * 'a -> Runnable.t (* switch f * apply f to the current thread to get rt, and then start * running thread rt. It is an error for f to * perform another switch. f is guaranteed to run * atomically. *) val switch: ('a t -> Runnable.t) -> 'a end signature MLTON_THREAD_EXTRA = sig include MLTON_THREAD val amInSignalHandler: unit -> bool val register: int * (MLtonPointer.t -> unit) -> unit val setSignalHandler: (Runnable.t -> Runnable.t) -> unit val switchToSignalHandler: unit -> unit end mlton-20100608/basis-library/mlton/thread.sml0000644000076600000240000001731411404435631017446 0ustar mtfstaff(* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonThread:> MLTON_THREAD_EXTRA = struct structure Prim = Primitive.MLton.Thread fun die (s: string): 'a = (PrimitiveFFI.Stdio.print s ; PrimitiveFFI.Posix.Process.exit 1 ; let exception DieFailed in raise DieFailed end) val gcState = Primitive.MLton.GCState.gcState structure AtomicState = struct datatype t = NonAtomic | Atomic of int end local open Prim in val atomicBegin = atomicBegin val atomicEnd = atomicEnd val atomicState = fn () => case atomicState () of 0wx0 => AtomicState.NonAtomic | w => AtomicState.Atomic (Word32.toInt w) end fun atomically f = (atomicBegin (); DynamicWind.wind (f, atomicEnd)) datatype 'a thread = Dead | Interrupted of Prim.thread | New of 'a -> unit (* In Paused (f, t), f is guaranteed to not raise an exception. *) | Paused of ((unit -> 'a) -> unit) * Prim.thread datatype 'a t = T of 'a thread ref structure Runnable = struct type t = unit t end fun prepend (T r: 'a t, f: 'b -> 'a): 'b t = let val t = case !r of Dead => raise Fail "prepend to a Dead thread" | Interrupted _ => raise Fail "prepend to a Interrupted thread" | New g => New (g o f) | Paused (g, t) => Paused (fn h => g (f o h), t) in r := Dead ; T (ref t) end fun prepare (t: 'a t, v: 'a): Runnable.t = prepend (t, fn () => v) fun new f = T (ref (New f)) local local val func: (unit -> unit) option ref = ref NONE val base: Prim.preThread = let val () = Prim.copyCurrent () in case !func of NONE => Prim.savedPre gcState | SOME x => (* This branch never returns. *) let (* Atomic 1 *) val () = func := NONE val () = atomicEnd () (* Atomic 0 *) in (x () handle e => MLtonExn.topLevelHandler e) ; die "Thread didn't exit properly.\n" end end in fun newThread (f: unit -> unit) : Prim.thread = let (* Atomic 2 *) val () = func := SOME f in Prim.copy base end end val switching = ref false in fun 'a atomicSwitch (f: 'a t -> Runnable.t): 'a = (* Atomic 1 *) if !switching then let val () = atomicEnd () (* Atomic 0 *) in raise Fail "nested Thread.switch" end else let val _ = switching := true val r : (unit -> 'a) ref = ref (fn () => die "Thread.atomicSwitch didn't set r.\n") val t: 'a thread ref = ref (Paused (fn x => r := x, Prim.current gcState)) fun fail e = (t := Dead ; switching := false ; atomicEnd () ; raise e) val (T t': Runnable.t) = f (T t) handle e => fail e val primThread = case !t' before t' := Dead of Dead => fail (Fail "switch to a Dead thread") | Interrupted t => t | New g => (atomicBegin (); newThread g) | Paused (f, t) => (f (fn () => ()); t) val _ = switching := false (* Atomic 1 when Paused/Interrupted, Atomic 2 when New *) val _ = Prim.switchTo primThread (* implicit atomicEnd() *) (* Atomic 0 when resuming *) in !r () end fun switch f = (atomicBegin () ; atomicSwitch f) end fun fromPrimitive (t: Prim.thread): Runnable.t = T (ref (Interrupted t)) fun toPrimitive (t as T r : unit t): Prim.thread = case !r of Dead => die "Thread.toPrimitive saw Dead.\n" | Interrupted t => (r := Dead ; t) | New _ => switch (fn cur : Prim.thread t => prepare (prepend (t, fn () => switch (fn t' : unit t => prepare (cur, toPrimitive t'))), ())) | Paused (f, t) => (r := Dead ; f (fn () => ()) ; t) local val signalHandler: Prim.thread option ref = ref NONE datatype state = Normal | InHandler val state: state ref = ref Normal in fun amInSignalHandler () = InHandler = !state fun setSignalHandler (f: Runnable.t -> Runnable.t): unit = let val _ = Primitive.MLton.installSignalHandler () fun loop (): unit = let (* Atomic 1 *) val _ = state := InHandler val t = f (fromPrimitive (Prim.saved gcState)) val _ = state := Normal val _ = Prim.finishSignalHandler gcState val _ = atomicSwitch (fn (T r) => let val _ = case !r of Paused (f, _) => f (fn () => ()) | _ => raise die "Thread.setSignalHandler saw strange thread" in t end) (* implicit atomicEnd () *) in loop () end val p = toPrimitive (new (fn () => loop () handle e => MLtonExn.topLevelHandler e)) val _ = signalHandler := SOME p in Prim.setSignalHandler (gcState, p) end fun switchToSignalHandler () = let (* Atomic 0 *) val () = atomicBegin () (* Atomic 1 *) val () = Prim.startSignalHandler gcState (* implicit atomicBegin () *) (* Atomic 2 *) in case !signalHandler of NONE => raise Fail "no signal handler installed" | SOME t => Prim.switchTo t (* implicit atomicEnd() *) end end local in val register: int * (MLtonPointer.t -> unit) -> unit = let val exports = Array.array (Int32.toInt (Primitive.MLton.FFI.numExports), fn _ => raise Fail "undefined export") fun loop (): unit = let (* Atomic 2 *) val t = Prim.saved gcState fun doit () = let (* Atomic 1 *) val p = Primitive.MLton.FFI.getOpArgsResPtr () val _ = atomicEnd () (* Atomic 0 *) val i = MLtonPointer.getInt32 (MLtonPointer.getPointer (p, 0), 0) val _ = (Array.sub (exports, Int32.toInt i) p) handle e => (TextIO.output (TextIO.stdErr, "Call from C to SML raised exception.\n") ; MLtonExn.topLevelHandler e) (* Atomic 0 *) val _ = atomicBegin () (* Atomic 1 *) val _ = Prim.setSaved (gcState, t) val _ = Prim.returnToC () (* implicit atomicEnd() *) in () end val _ = Prim.switchTo (toPrimitive (new doit)) (* implicit atomicEnd() *) in loop () end val p = toPrimitive (new (fn () => loop ())) val _ = Prim.setCallFromCHandler (gcState, p) in fn (i, f) => Array.update (exports, i, f) end end end mlton-20100608/basis-library/mlton/vector.sig0000644000076600000240000000102311404435631017456 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) type int = Int.int signature MLTON_VECTOR = sig val create: int -> {done: unit -> 'a vector, sub: int -> 'a, update: int * 'a -> unit} val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a vector * 'b end mlton-20100608/basis-library/mlton/weak.sig0000644000076600000240000000047111404435631017111 0ustar mtfstaff(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WEAK = sig type 'a t val get: 'a t -> 'a option val new: 'a -> 'a t end mlton-20100608/basis-library/mlton/weak.sml0000644000076600000240000000133411404435631017121 0ustar mtfstaff(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonWeak = struct structure Weak = Primitive.MLton.Weak type 'a t = 'a Weak.t val new = Weak.new fun get (w: 'a t): 'a option = let (* Need to do the canGet after the get. If you did the canGet first, * there could be a GC that invalidates the pointer between the * canGet and the get. *) val x = Weak.get w in if Weak.canGet w then SOME x else NONE end end mlton-20100608/basis-library/mlton/word.sig0000644000076600000240000000060011404435631017127 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WORD = sig type t val bswap: t -> t val rol: t * word -> t val ror: t * word -> t end mlton-20100608/basis-library/mlton/world.sig0000644000076600000240000000110111404435631017300 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WORLD = sig datatype status = Clone | Original val load: string -> 'a (* Save the world to resume with the current thread. *) val save: string -> status (* Save the world to resume with the given thread. *) val saveThread: string * MLtonThread.Runnable.t -> unit end mlton-20100608/basis-library/mlton/world.sml0000644000076600000240000000352011404435631017320 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonWorld: MLTON_WORLD = struct structure Prim = Primitive.MLton.World structure Error = PosixError structure SysCall = Error.SysCall val gcState = Primitive.MLton.GCState.gcState datatype status = Clone | Original (* Need to worry about: * - open file descriptors * - redetermine buffer status when restart *) fun save' (file: string): status = let val () = SysCall.simple' ({errVal = false}, fn () => (Prim.save (NullString.nullTerm file) ; Prim.getSaveStatus (gcState))) in if Prim.getAmOriginal gcState then Original else (Prim.setAmOriginal (gcState, true) ; Cleaner.clean Cleaner.atLoadWorld ; Clone) end fun saveThread (file: string, t: MLtonThread.Runnable.t): unit = case save' file of Clone => MLtonThread.switch (fn _ => t) | Original => () fun save (file: string): status = if MLtonThread.amInSignalHandler () then raise Fail "cannot call MLton.World.save within signal handler" else save' file fun load (file: string): 'a = if let open OS_FileSys in access (file, [A_READ]) end then let val c = CommandLine.name () in Posix.Process.exec (c, [c, "@MLton", "load-world", file, "--"]) end else raise Fail (concat ["World.load can not read ", file]) end mlton-20100608/basis-library/mlton.mlb0000644000076600000240000000241311404435632016151 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb in signature MLTON signature MLTON_ARRAY signature MLTON_BIN_IO signature MLTON_CONT signature MLTON_EXN signature MLTON_FINALIZABLE signature MLTON_GC signature MLTON_INT_INF signature MLTON_IO signature MLTON_ITIMER signature MLTON_MONO_ARRAY signature MLTON_MONO_VECTOR signature MLTON_PLATFORM signature MLTON_POINTER signature MLTON_PROC_ENV signature MLTON_PROCESS signature MLTON_PROFILE signature MLTON_RANDOM signature MLTON_REAL signature MLTON_RLIMIT signature MLTON_RUSAGE signature MLTON_SIGNAL signature MLTON_SOCKET signature MLTON_SYSLOG signature MLTON_TEXT_IO signature MLTON_THREAD signature MLTON_VECTOR signature MLTON_WEAK signature MLTON_WORD signature MLTON_WORLD structure MLton end end mlton-20100608/basis-library/net/0000755000076600000240000000000011404470406015110 5ustar mtfstaffmlton-20100608/basis-library/net/generic-sock.sig0000644000076600000240000000112711404435631020167 0ustar mtfstaffsignature GENERIC_SOCK = sig val socket: Socket.AF.addr_family * Socket.SOCK.sock_type -> ('af, 'sock_type) Socket.sock val socketPair: Socket.AF.addr_family * Socket.SOCK.sock_type -> ('af, 'sock_type) Socket.sock * ('af, 'sock_type) Socket.sock val socket': Socket.AF.addr_family * Socket.SOCK.sock_type * int -> ('af, 'sock_type) Socket.sock val socketPair': Socket.AF.addr_family * Socket.SOCK.sock_type * int -> ('af, 'sock_type) Socket.sock * ('af, 'sock_type) Socket.sock end mlton-20100608/basis-library/net/generic-sock.sml0000644000076600000240000000235111404435631020200 0ustar mtfstaff(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure GenericSock : GENERIC_SOCK = struct structure Prim = PrimitiveFFI.Socket.GenericSock structure PE = Posix.Error structure PESC = PE.SysCall fun socket' (af, st, p) = (Socket.fromRep o PESC.simpleResult) (fn () => Prim.socket (Net.AddrFamily.toRep af, Socket.SOCKExtra.toRep st, C_Int.fromInt p)) fun socketPair' (af, st, p) = let val a : C_Sock.t array = Array.array (2, C_Sock.fromInt 0) val get = fn i => Socket.fromRep (Array.sub (a, i)) in PESC.syscall (fn () => (Prim.socketPair (Net.AddrFamily.toRep af, Socket.SOCKExtra.toRep st, C_Int.fromInt p, a), fn _ => (get 0, get 1))) end fun socket (af, st) = socket' (af, st, 0) fun socketPair (af, st) = socketPair' (af, st, 0) end mlton-20100608/basis-library/net/inet-sock.sig0000644000076600000240000000147611404435631017521 0ustar mtfstaffsignature INET_SOCK = sig type inet type 'sock_type sock = (inet, 'sock_type) Socket.sock type dgram_sock = Socket.dgram sock type sock_addr = inet Socket.sock_addr type 'mode stream_sock = 'mode Socket.stream sock val inetAF: Socket.AF.addr_family val toAddr: NetHostDB.in_addr * int -> sock_addr val fromAddr: sock_addr -> NetHostDB.in_addr * int val any: int -> sock_addr structure UDP: sig val socket: unit -> dgram_sock val socket': int -> dgram_sock end structure TCP: sig val socket: unit -> 'mode stream_sock val socket': int -> 'mode stream_sock val getNODELAY: 'mode stream_sock -> bool val setNODELAY: 'mode stream_sock * bool -> unit end end mlton-20100608/basis-library/net/inet-sock.sml0000644000076600000240000000422411404435631017524 0ustar mtfstaff(* Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure INetSock:> INET_SOCK = struct structure Prim = PrimitiveFFI.Socket.INetSock datatype inet = INET (* a phantom type*) type 'sock_type sock = (inet, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = inet Socket.sock_addr val inetAF = Net.AddrFamily.fromRep PrimitiveFFI.Socket.AF.INET fun toAddr (in_addr, port) = let val port = Word16.fromInt port handle Overflow => PosixError.raiseSys PosixError.inval val port = Net.Word16.hton port val (sa, salen, finish) = Socket.newSockAddr () val _ = Prim.toAddr (NetHostDB.inAddrToWord8Vector in_addr, port, sa, salen) in finish () end fun any port = toAddr (NetHostDB.any (), port) fun fromAddr sa = let val () = Prim.fromAddr (Socket.unpackSockAddr sa) val port = Prim.getPort () val port = Net.Word16.ntoh port val port = Word16.toInt port val (ia, finish) = NetHostDB.newInAddr () val _ = Prim.getInAddr (NetHostDB.preInAddrToWord8Array ia) in (finish (), port) end structure UDP = struct fun socket' prot = GenericSock.socket' (inetAF, Socket.SOCK.dgram, prot) fun socket () = socket' 0 end structure TCP = struct structure Prim = Prim.Ctl fun socket' prot = GenericSock.socket' (inetAF, Socket.SOCK.stream, prot) fun socket () = socket' 0 fun getNODELAY sock = Socket.CtlExtra.getSockOptBool (Prim.IPPROTO_TCP, Prim.TCP_NODELAY) sock fun setNODELAY (sock, optval) = Socket.CtlExtra.setSockOptBool (Prim.IPPROTO_TCP, Prim.TCP_NODELAY) (sock,optval) end end mlton-20100608/basis-library/net/net-host-db.sig0000644000076600000240000000157111404435631017745 0ustar mtfstaffsignature NET_HOST_DB = sig eqtype addr_family type entry eqtype in_addr val addr: entry -> in_addr val addrType: entry -> addr_family val addrs: entry -> in_addr list val aliases: entry -> string list val fromString: string -> in_addr option val getByAddr: in_addr -> entry option val getByName: string -> entry option val getHostName: unit -> string val name: entry -> string val scan: (char, 'a) StringCvt.reader -> (in_addr, 'a) StringCvt.reader val toString: in_addr -> string end signature NET_HOST_DB_EXTRA = sig include NET_HOST_DB type pre_in_addr val any: unit -> in_addr val inAddrToWord8Vector: in_addr -> Word8.word vector val newInAddr: unit -> pre_in_addr * (unit -> in_addr) val preInAddrToWord8Array: pre_in_addr -> Word8.word array end mlton-20100608/basis-library/net/net-host-db.sml0000644000076600000240000001747411404435631017767 0ustar mtfstaff(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure NetHostDB: NET_HOST_DB_EXTRA = struct structure Prim = PrimitiveFFI.NetHostDB (* network byte order (big-endian) *) type pre_in_addr = Word8.word array type in_addr = Word8.word vector val preInAddrToWord8Array = fn a => a val inAddrToWord8Vector = fn v => v val inAddrLen = C_Size.toInt Prim.inAddrSize fun newInAddr () = let val ia: pre_in_addr = Array.array (inAddrLen, 0wx0: Word8.word) fun finish () = Array.vector ia in (ia, finish) end fun any () = let val (wa, finish) = newInAddr () fun loop (i, acc) = if i >= inAddrLen then () else let val w = Word8.castFromSysWord (C_Int.castToSysWord acc) val () = Array.update (wa, (inAddrLen - 1) - i, w) in loop (i + 1, C_Int.>> (acc, 0w4)) end in loop (0, Prim.INADDR_ANY) ; finish () end structure AddrFamily = Net.AddrFamily type addr_family = AddrFamily.t datatype entry = T of {name: string, aliases: string list, addrType: addr_family, addrs: in_addr list} local fun make s (T r) = s r in val name = make #name val aliases = make #aliases val addrType = make #addrType val addrs = make #addrs end fun addr entry = hd (addrs entry) local fun get (i: C_Int.t): entry option = if i <> C_Int.zero then let val name = CUtil.C_String.toString (Prim.getEntryName ()) val numAliases = Prim.getEntryAliasesNum () fun fill (n, aliases) = if C_Int.< (n, numAliases) then let val alias = CUtil.C_String.toString (Prim.getEntryAliasesN n) in fill (C_Int.+ (n, 1), alias::aliases) end else List.rev aliases val aliases = fill (0, []) val addrType = Prim.getEntryAddrType () val length = Prim.getEntryLength () val numAddrs = Prim.getEntryAddrsNum () fun fill (n, addrs) = if C_Int.< (n, numAddrs) then let val addr = Word8Array.array (C_Int.toInt length, 0wx0) val _ = Prim.getEntryAddrsN (n, Word8Array.toPoly addr) val addr = Word8Vector.toPoly (Word8Array.vector addr) in fill (C_Int.+ (n, 1), addr::addrs) end else List.rev addrs val addrs = fill (0, []) in SOME (T {name = name, aliases = aliases, addrType = AddrFamily.fromRep addrType, addrs = addrs}) end else NONE in fun getByAddr in_addr = get (Prim.getByAddress (in_addr, C_Socklen.fromInt (Vector.length in_addr))) fun getByName name = get (Prim.getByName (NullString.nullTerm name)) end fun getHostName () = let val n = 128 val buf = CharArray.array (n, #"\000") val () = Posix.Error.SysCall.simple (fn () => Prim.getHostName (CharArray.toPoly buf, C_Size.fromInt n)) in case CharArray.findi (fn (_, c) => c = #"\000") buf of NONE => CharArray.vector buf | SOME (i, _) => CharArraySlice.vector (CharArraySlice.slice (buf, 0, SOME i)) end fun scan reader state = let fun scanW state = case reader state of SOME (#"0", state') => (case reader state' of NONE => SOME (0w0, state') | SOME (c, state'') => if Char.isDigit c then StringCvt.wdigits StringCvt.OCT reader state' else if c = #"x" orelse c = #"X" then StringCvt.wdigits StringCvt.HEX reader state'' else SOME (0w0, state')) | _ => StringCvt.wdigits StringCvt.DEC reader state fun loop (n, state, acc) = if n <= 0 then List.rev acc else let fun finish (w, state) = case reader state of SOME (#".", state') => loop (n - 1, state', (w, state)::acc) | _ => List.rev ((w, state)::acc) in case scanW state of SOME (w, state') => finish (w, state') | NONE => List.rev acc end val l = loop (4, state, []) fun get1 w = (Word8.fromLarge (Word.toLarge (Word.andb (w, 0wxFF))), Word.>>(w, 0w8)) fun get2 w = let val (a,w) = get1 w val (b,w) = get1 w in (a,b,w) end fun get3 w = let val (a,b,w) = get2 w val (c,w) = get1 w in (a,b,c,w) end fun get4 w = let val (a,b,c,w) = get3 w val (d,w) = get1 w in (a,b,c,d,w) end fun try l = case l of [] => NONE | [(w, statew)] => let val (d,c,b,a,w) = get4 w in if w = 0wx0 then SOME (Vector.fromList [a,b,c,d], statew) else NONE end | [(x, statex), (w, statew)] => let val (d,c,b,w) = get3 w val (a,x) = get1 x in if w = 0wx0 andalso x = 0wx0 then SOME (Vector.fromList [a,b,c,d], statew) else try [(x, statex)] end | [(y, statey), (x, statex), (w, statew)] => let val (d,c,w) = get2 w val (b,x) = get1 x val (a,y) = get1 y in if w = 0wx0 andalso x = 0wx0 andalso y = 0wx0 then SOME (Vector.fromList [a,b,c,d], statew) else try [(y, statey), (x, statex)] end | [(z, statez), (y, statey), (x, statex), (w, statew)] => let val (d,w) = get1 w val (c,x) = get1 x val (b,y) = get1 y val (a,z) = get1 z in if w = 0wx0 andalso x = 0wx0 andalso y = 0wx0 andalso z = 0wx0 then SOME (Vector.fromList [a,b,c,d], statew) else try [(z, statez), (y, statey), (x, statex)] end | _ => NONE in try l end fun fromString s = StringCvt.scanString scan s fun toString in_addr = String.concatWith "." (Vector.foldr (fn (w,ss) => (Word8.fmt StringCvt.DEC w)::ss) [] in_addr) end mlton-20100608/basis-library/net/net-prot-db.sig0000644000076600000240000000036711404435631017756 0ustar mtfstaffsignature NET_PROT_DB = sig type entry val name: entry -> string val aliases: entry -> string list val protocol: entry -> int val getByName: string -> entry option val getByNumber: int -> entry option end mlton-20100608/basis-library/net/net-prot-db.sml0000644000076600000240000000334211404435631017763 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure NetProtDB: NET_PROT_DB = struct structure Prim = PrimitiveFFI.NetProtDB datatype entry = T of {name: string, aliases: string list, protocol: C_Int.t} local fun make s (T r) = s r in val name = make #name val aliases = make #aliases val protocol = C_Int.toInt o (make #protocol) end local fun get (i: C_Int.t): entry option = if i <> C_Int.zero then let val name = CUtil.C_String.toString (Prim.getEntryName ()) val numAliases = Prim.getEntryAliasesNum () fun fill (n, aliases) = if C_Int.< (n, numAliases) then let val alias = CUtil.C_String.toString (Prim.getEntryAliasesN n) in fill (C_Int.+ (n, 1), alias::aliases) end else List.rev aliases val aliases = fill (0, []) val protocol = Prim.getEntryProto () in SOME (T {name = name, aliases = aliases, protocol = protocol}) end else NONE in fun getByName name = get (Prim.getByName (NullString.nullTerm name)) fun getByNumber proto = get (Prim.getByNumber (C_Int.fromInt proto)) end end mlton-20100608/basis-library/net/net-serv-db.sig0000644000076600000240000000046511404435631017750 0ustar mtfstaffsignature NET_SERV_DB = sig type entry val name: entry -> string val aliases: entry -> string list val port: entry -> int val protocol: entry -> string val getByName: string * string option -> entry option val getByPort: int * string option -> entry option end mlton-20100608/basis-library/net/net-serv-db.sml0000644000076600000240000000453411404435631017762 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure NetServDB: NET_SERV_DB = struct structure Prim = PrimitiveFFI.NetServDB datatype entry = T of {name: string, aliases: string list, port: C_Int.t, protocol: string} local fun make s (T r) = s r in val name = make #name val aliases = make #aliases val port = C_Int.toInt o (make #port) val protocol = make #protocol end local fun get (i: C_Int.t): entry option = if i <> C_Int.zero then let val name = CUtil.C_String.toString (Prim.getEntryName ()) val numAliases = Prim.getEntryAliasesNum () fun fill (n, aliases) = if C_Int.< (n, numAliases) then let val alias = CUtil.C_String.toString (Prim.getEntryAliasesN n) in fill (C_Int.+ (n, 1), alias::aliases) end else List.rev aliases val aliases = fill (0, []) val port = Net.C_Int.ntoh (Prim.getEntryPort ()) val protocol = CUtil.C_String.toString (Prim.getEntryProto ()) in SOME (T {name = name, aliases = aliases, port = port, protocol = protocol}) end else NONE in fun getByName (name, proto) = case proto of SOME proto => get (Prim.getByName (NullString.nullTerm name, NullString.nullTerm proto)) | NONE => get (Prim.getByNameNull (NullString.nullTerm name)) fun getByPort (port, proto) = let val port = Net.C_Int.hton (C_Int.fromInt port) in case proto of NONE => get (Prim.getByPortNull port) | SOME proto => get (Prim.getByPort (port, NullString.nullTerm proto)) end end end mlton-20100608/basis-library/net/net.sig0000644000076600000240000000130011404435631016375 0ustar mtfstaff(* Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature NET = sig structure AddrFamily : ABS_REP_EQ where type Rep.t = C_Int.t structure Sock : ABS_REP where type Rep.t = C_Sock.t structure SockType : ABS_REP_EQ where type Rep.t = C_Sock.t structure Word16 : sig val hton: Word16.word -> Word16.word val ntoh: Word16.word -> Word16.word end structure C_Int : sig val hton: C_Int.t -> C_Int.t val ntoh: C_Int.t -> C_Int.t end end mlton-20100608/basis-library/net/net.sml0000644000076600000240000000452411404435631016421 0ustar mtfstaff(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Net : NET = struct structure AddrFamily = MkAbsRepEq(type rep = C_Int.t) structure Sock = MkAbsRep(type rep = C_Sock.t) structure SockType = MkAbsRepEq(type rep = C_Sock.t) structure Prim = PrimitiveFFI.Net structure Word32 = struct val hton = Prim.htonl val ntoh = Prim.ntohl end structure Word16 = struct val hton = Prim.htons val ntoh = Prim.ntohs end structure Int32 = struct val hton = Primitive.IntWordConv.idFromWord32ToInt32 o Word32.hton o Primitive.IntWordConv.idFromInt32ToWord32 val ntoh = Primitive.IntWordConv.idFromWord32ToInt32 o Word32.ntoh o Primitive.IntWordConv.idFromInt32ToWord32 end structure Int16 = struct val hton = Primitive.IntWordConv.idFromWord16ToInt16 o Word16.hton o Primitive.IntWordConv.idFromInt16ToWord16 val ntoh = Primitive.IntWordConv.idFromWord16ToInt16 o Word16.ntoh o Primitive.IntWordConv.idFromInt16ToWord16 end structure C_Int = struct local structure S = C_Int_ChooseIntN (type 'a t = 'a -> 'a val fInt8 = fn _ => raise Fail "Net.C_Int.hton: fInt8" val fInt16 = Int16.hton val fInt32 = Int32.hton val fInt64 = fn _ => raise Fail "Net.C_Int.hton: fInt64") in val hton = S.f end local structure S = C_Int_ChooseIntN (type 'a t = 'a -> 'a val fInt8 = fn _ => raise Fail "Net.C_Int.ntoh: fInt8" val fInt16 = Int16.ntoh val fInt32 = Int32.ntoh val fInt64 = fn _ => raise Fail "Net.C_Int.ntoh: fInt64") in val ntoh = S.f end end end mlton-20100608/basis-library/net/socket.sig0000644000076600000240000002232411404435631017110 0ustar mtfstaffsignature SOCKET = sig type active type dgram type in_flags = {peek: bool, oob: bool} type out_flags = {don't_route: bool, oob: bool} type passive datatype shutdown_mode = NO_RECVS | NO_SENDS | NO_RECVS_OR_SENDS type ('af,'sock_type) sock type 'af sock_addr type sock_desc type 'mode stream structure AF: sig type addr_family = NetHostDB.addr_family val fromString: string -> addr_family option val list: unit -> (string * addr_family) list val toString: addr_family -> string end structure SOCK: sig eqtype sock_type val dgram: sock_type val fromString: string -> sock_type option val list: unit -> (string * sock_type) list val stream: sock_type val toString: sock_type -> string end structure Ctl: sig val getATMARK: ('af, active stream) sock -> bool val getBROADCAST: ('af, 'sock_type) sock -> bool val getDEBUG: ('af, 'sock_type) sock -> bool val getDONTROUTE: ('af, 'sock_type) sock -> bool val getERROR: ('af, 'sock_type) sock -> bool val getKEEPALIVE: ('af, 'sock_type) sock -> bool val getLINGER: ('af, 'sock_type) sock -> Time.time option val getNREAD: ('af, 'sock_type) sock -> int val getOOBINLINE: ('af, 'sock_type) sock -> bool val getPeerName: ('af, 'sock_type) sock -> 'af sock_addr val getRCVBUF: ('af, 'sock_type) sock -> int val getREUSEADDR: ('af, 'sock_type) sock -> bool val getSNDBUF: ('af, 'sock_type) sock -> int val getSockName: ('af, 'sock_type) sock -> 'af sock_addr val getTYPE: ('af, 'sock_type) sock -> SOCK.sock_type val setBROADCAST: ('af, 'sock_type) sock * bool -> unit val setDEBUG: ('af, 'sock_type) sock * bool -> unit val setDONTROUTE: ('af, 'sock_type) sock * bool -> unit val setKEEPALIVE: ('af, 'sock_type) sock * bool -> unit val setLINGER: ('af, 'sock_type) sock * Time.time option -> unit val setOOBINLINE: ('af, 'sock_type) sock * bool -> unit val setRCVBUF: ('af, 'sock_type) sock * int -> unit val setREUSEADDR: ('af, 'sock_type) sock * bool -> unit val setSNDBUF: ('af, 'sock_type) sock * int -> unit end val accept: ('af, passive stream) sock -> (('af, active stream) sock * 'af sock_addr) val acceptNB: ('af, passive stream) sock -> (('af, active stream) sock * 'af sock_addr) option val bind: ('af, 'sock_type) sock * 'af sock_addr -> unit val close: ('af, 'sock_type) sock -> unit val connect: ('af, 'sock_type) sock * 'af sock_addr -> unit val connectNB: ('af, 'sock_type) sock * 'af sock_addr -> bool val familyOfAddr: 'af sock_addr -> AF.addr_family val ioDesc: ('af, 'sock_type) sock -> OS.IO.iodesc val listen: ('af, passive stream) sock * int -> unit val recvArr: ('af, active stream) sock * Word8ArraySlice.slice -> int val recvArr': (('af, active stream) sock * Word8ArraySlice.slice * in_flags) -> int val recvArrFrom: (('af, dgram) sock * Word8ArraySlice.slice -> int * 'af sock_addr) val recvArrFrom': (('af, dgram) sock * Word8ArraySlice.slice * in_flags -> int * 'af sock_addr) val recvArrFromNB: (('af, dgram) sock * Word8ArraySlice.slice -> (int * 'af sock_addr) option) val recvArrFromNB': (('af, dgram) sock * Word8ArraySlice.slice * in_flags -> (int * 'af sock_addr) option) val recvArrNB: (('af, active stream) sock * Word8ArraySlice.slice) -> int option val recvArrNB': (('af, active stream) sock * Word8ArraySlice.slice * in_flags) -> int option val recvVec: ('af, active stream) sock * int -> Word8Vector.vector val recvVec': (('af, active stream) sock * int * in_flags -> Word8Vector.vector) val recvVecFrom: (('af, dgram) sock * int -> Word8Vector.vector * 'af sock_addr) val recvVecFrom': (('af, dgram) sock * int * in_flags -> Word8Vector.vector * 'af sock_addr) val recvVecFromNB: (('af, dgram) sock * int -> (Word8Vector.vector * 'af sock_addr) option) val recvVecFromNB': (('af, dgram) sock * int * in_flags -> (Word8Vector.vector * 'af sock_addr) option) val recvVecNB: ('af, active stream) sock * int -> Word8Vector.vector option val recvVecNB': (('af, active stream) sock * int * in_flags -> Word8Vector.vector option) val sameAddr: 'af sock_addr * 'af sock_addr -> bool val sameDesc: sock_desc * sock_desc -> bool val select: {exs: sock_desc list, rds: sock_desc list, timeout: Time.time option, wrs: sock_desc list} -> {exs: sock_desc list, rds: sock_desc list, wrs: sock_desc list} val sendArr: ('af, active stream) sock * Word8ArraySlice.slice -> int val sendArr': (('af, active stream) sock * Word8ArraySlice.slice * out_flags) -> int val sendArrNB: (('af, active stream) sock * Word8ArraySlice.slice -> int option) val sendArrNB': (('af, active stream) sock * Word8ArraySlice.slice * out_flags) -> int option val sendArrTo: (('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice) -> unit val sendArrTo': (('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice * out_flags) -> unit val sendArrToNB: (('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice) -> bool val sendArrToNB': (('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice * out_flags) -> bool val sendVec: ('af, active stream) sock * Word8VectorSlice.slice -> int val sendVec': (('af, active stream) sock * Word8VectorSlice.slice * out_flags) -> int val sendVecNB: (('af, active stream) sock * Word8VectorSlice.slice) -> int option val sendVecNB': (('af, active stream) sock * Word8VectorSlice.slice * out_flags) -> int option val sendVecTo: (('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice) -> unit val sendVecTo': (('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice * out_flags) -> unit val sendVecToNB: (('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice) -> bool val sendVecToNB': (('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice * out_flags) -> bool val shutdown: ('af, 'mode stream) sock * shutdown_mode -> unit val sockDesc: ('af, 'sock_type) sock -> sock_desc end signature SOCKET_EXTRA = sig include SOCKET val fromRep : C_Sock.t -> ('af, 'sock_type) sock val toRep : ('af, 'sock_type) sock -> C_Sock.t val sockToWord: ('af, 'sock_type) sock -> SysWord.word val wordToSock: SysWord.word -> ('af, 'sock_type) sock val sockToFD: ('af, 'sock_type) sock -> Posix.FileSys.file_desc val fdToSock: Posix.FileSys.file_desc -> ('af, 'sock_type) sock type pre_sock_addr = Word8.word array val unpackSockAddr: 'af sock_addr -> Word8.word vector val newSockAddr: unit -> (pre_sock_addr * C_Socklen.t ref * (unit -> 'af sock_addr)) structure SOCKExtra: sig val toRep : SOCK.sock_type -> C_Sock.t end structure CtlExtra: sig type level = C_Int.int type optname = C_Int.int type request = C_Int.int val getERROR: ('af, 'sock_type) sock -> (string * Posix.Error.syserror option) option val getSockOptInt: level * optname -> ('af, 'sock_type) sock -> C_Int.int val setSockOptInt: level * optname -> ('af, 'sock_type) sock * C_Int.int -> unit val getSockOptBool: level * optname -> ('af, 'sock_type) sock -> bool val setSockOptBool: level * optname -> ('af, 'sock_type) sock * bool -> unit val getIOCtlInt: request -> ('af, 'sock_type) sock -> C_Int.int (* val setIOCtlInt: request -> ('af, 'sock_type) sock * C_Int.int -> unit *) val getIOCtlBool: request -> ('af, 'sock_type) sock -> bool (* val setIOCtlBool: request -> ('af, 'sock_type) sock * bool -> unit *) end end mlton-20100608/basis-library/net/socket.sml0000644000076600000240000006440511404435631017127 0ustar mtfstaff(* Copyright (C) 2002-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Socket :> SOCKET_EXTRA = struct structure Prim = PrimitiveFFI.Socket structure Error = Posix.Error structure Syscall = Error.SysCall structure FileSys = Posix.FileSys structure Sock = Net.Sock type sock = Sock.t val fromRep = Sock.fromRep val toRep = Sock.toRep val sockToWord = C_Sock.castToSysWord o Sock.toRep val wordToSock = Sock.fromRep o C_Sock.castFromSysWord val sockToFD = PrePosix.FileDesc.fromRep o Sock.toRep val fdToSock = Sock.fromRep o PrePosix.FileDesc.toRep type pre_sock_addr = Word8.word array datatype sock_addr = SA of Word8.word vector fun unpackSockAddr (SA sa) = sa fun newSockAddr (): (pre_sock_addr * C_Socklen.t ref * (unit -> sock_addr)) = let val salen = C_Size.toInt Prim.sockAddrStorageLen val sa = Array.array (salen, 0wx0) val salenRef = ref (C_Socklen.fromInt salen) fun finish () = SA (ArraySlice.vector (ArraySlice.slice (sa, 0, SOME (C_Socklen.toInt (!salenRef))))) in (sa, salenRef, finish) end datatype dgram = DGRAM (* phantom *) datatype stream = MODE (* phantom *) datatype passive = PASSIVE (* phantom *) datatype active = ACTIVE (* phantom *) structure AddrFamily = Net.AddrFamily structure AF = struct type addr_family = AddrFamily.t val names : (string * addr_family) list = ("UNIX", AddrFamily.fromRep Prim.AF.UNIX) :: ("INET", AddrFamily.fromRep Prim.AF.INET) :: ("INET6", AddrFamily.fromRep Prim.AF.INET6) :: ("UNSPEC", AddrFamily.fromRep Prim.AF.UNSPEC) :: nil fun list () = names fun toString af' = case List.find (fn (_, af) => af = af') names of SOME (name, _) => name | NONE => raise (Fail "Internal error: bogus addr_family") fun fromString name' = case List.find (fn (name, _) => name = name') names of SOME (_, af) => SOME af | NONE => NONE end structure SockType = Net.SockType structure SOCK = struct type sock_type = SockType.t val toRep = SockType.toRep val stream = SockType.fromRep Prim.SOCK.STREAM val dgram = SockType.fromRep Prim.SOCK.DGRAM val names : (string * sock_type) list = ("STREAM", stream) :: ("DGRAM", dgram) :: nil fun list () = names fun toString st' = case List.find (fn (_, st) => st = st') names of SOME (name, _) => name | NONE => raise (Fail "Internal error: bogus sock_type") fun fromString name' = case List.find (fn (name, _) => name = name') names of SOME (_, st) => SOME st | NONE => NONE end structure SOCKExtra = SOCK structure CtlExtra = struct type level = C_Int.t type optname = C_Int.t type request = C_Int.t (* host byte order *) type optvalVec = Word8.word vector type optvalArr = Word8.word array val bitsPerByte = 8 val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian val intLen = Int.quot (C_Int.precision', bitsPerByte) fun unmarshalInt (wa: optvalArr) : C_Int.int = let fun loop (i, acc) = if i >= intLen then acc else let val w = Array.sub (wa, if isBigEndian then i else (intLen - 1) - i) val w = C_Int.castFromSysWord (Word8.castToSysWord w) in loop (i + 1, C_Int.orb (w, C_Int.<< (acc, 0w4))) end in loop (0, 0) end fun marshalInt (i: C_Int.int) : optvalVec = let val wa = Array.array (intLen, 0wx0) fun loop (i, acc) = if i >= intLen then () else let val w = Word8.castFromSysWord (C_Int.castToSysWord acc) val () = Array.update (wa, if isBigEndian then (intLen - 1) - i else i, w) in loop (i + 1, C_Int.>> (acc, 0w4)) end in loop (0, i) ; Array.vector wa end val boolLen = intLen fun unmarshalBool (wa: optvalArr) : bool = if (unmarshalInt wa) = 0 then false else true fun marshalBool (b: bool) : optvalVec = marshalInt (if b then 1 else 0) val sizeLen = Int.quot (C_Size.wordSize, bitsPerByte) fun unmarshalSize (wa: optvalArr) : int = let fun loop (i, acc) = if i >= sizeLen then acc else let val w = Array.sub (wa, if isBigEndian then i else (sizeLen - 1) - i) val w = C_Size.castFromSysWord (Word8.castToSysWord w) in loop (i + 1, C_Size.orb (w, C_Size.<< (acc, 0w4))) end in C_Size.toInt (loop (0, 0wx0)) end fun marshalSize (i: int) : optvalVec = let val wa = Array.array (sizeLen, 0wx0) fun loop (i, acc) = if i >= sizeLen then () else let val w = Word8.castFromSysWord (C_Size.castToSysWord acc) val () = Array.update (wa, if isBigEndian then (sizeLen - 1) - i else i, w) in loop (i + 1, C_Size.>> (acc, 0w4)) end in loop (0, C_Size.fromInt i) ; Array.vector wa end (* Assume 'struct linger' has no padding. *) val optTimeLen: int = intLen + intLen fun unmarshalOptTime (wa: optvalArr) : Time.time option = let fun loopBool (i, acc) = if i >= intLen then acc else let val w = Array.sub (wa, if isBigEndian then i else (intLen - 1) - i) val w = C_Int.castFromSysWord (Word8.castToSysWord w) in loopBool (i + 1, C_Int.orb (w, C_Int.<< (acc, 0w4))) end fun loopInt (i, acc) = if i >= intLen then acc else let val w = Array.sub (wa, intLen + (if isBigEndian then i else (intLen - 1) - i)) val w = C_Int.castFromSysWord (Word8.castToSysWord w) in loopInt (i + 1, C_Int.orb (w, C_Int.<< (acc, 0w4))) end in if loopBool (0, 0) = 0 then NONE else SOME (Time.fromSeconds (C_Int.toLarge (loopInt (0, 0)))) end fun marshalOptTime (to: Time.time option) : optvalVec = let val wa = Array.array (optTimeLen, 0wx0) fun loopBool (i, acc) = if i >= intLen then () else let val w = Word8.castFromSysWord (C_Int.castToSysWord acc) val () = Array.update (wa, if isBigEndian then (intLen - 1) - i else i, w) in loopBool (i + 1, C_Int.>> (acc, 0w4)) end fun loopInt (i, acc) = if i >= intLen then () else let val w = Word8.castFromSysWord (C_Int.castToSysWord acc) val () = Array.update (wa, intLen + (if isBigEndian then (intLen - 1) - i else i), w) in loopInt (i + 1, C_Int.>> (acc, 0w4)) end in case to of NONE => (loopBool (0, 0); loopInt (0, 0)) | SOME t => (loopBool (0, 1); loopInt (0, C_Int.fromLarge (Time.toSeconds t))) ; Array.vector wa end local fun make (optlen: int, marshal: 'a -> optvalVec, unmarshal: optvalArr -> 'a) = let fun getSockOpt (level: level, optname: optname) s : 'a = let val optval = Array.array (optlen, 0wx0) val optlen' = ref (C_Socklen.fromInt optlen) val () = Syscall.simple (fn () => Prim.Ctl.getSockOpt (Sock.toRep s, level, optname, optval, optlen')) val () = if C_Socklen.toInt (!optlen') <> optlen then raise (Fail "Socket.Ctl.getSockOpt: optlen' <> optlen") else () in unmarshal optval end fun setSockOpt (level: level, optname: optname) (s, optval: 'a) : unit = let val optval = marshal optval val optlen' = C_Socklen.fromInt optlen val () = Syscall.simple (fn () => Prim.Ctl.setSockOpt (Sock.toRep s, level, optname, optval, optlen')) in () end fun getIOCtl (request: request) s : 'a = let val optval = Array.array (optlen, 0wx0) val () = Syscall.simple (fn () => Prim.Ctl.getIOCtl (Sock.toRep s, request, optval)) in unmarshal optval end fun setIOCtl (request: request) (s, optval: 'a) : unit = let val optval = marshal optval val () = Syscall.simple (fn () => Prim.Ctl.setIOCtl (Sock.toRep s, request, optval)) in () end in (getSockOpt, getIOCtl, setSockOpt, setIOCtl) end in val (getSockOptInt, getIOCtlInt, setSockOptInt, _) = make (intLen, marshalInt, unmarshalInt) val (getSockOptBool, getIOCtlBool, setSockOptBool, _) = make (boolLen, marshalBool, unmarshalBool) val (getSockOptSize, getIOCtlSize, setSockOptSize, _) = make (sizeLen, marshalSize, unmarshalSize) val (getSockOptOptTime, _, setSockOptOptTime, _) = make (optTimeLen, marshalOptTime, unmarshalOptTime) end val getDEBUG = getSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_DEBUG) val setDEBUG = setSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_DEBUG) val getREUSEADDR = getSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_REUSEADDR) val setREUSEADDR = setSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_REUSEADDR) val getKEEPALIVE = getSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_KEEPALIVE) val setKEEPALIVE = setSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_KEEPALIVE) val getDONTROUTE = getSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_DONTROUTE) val setDONTROUTE = setSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_DONTROUTE) val getLINGER = getSockOptOptTime (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_LINGER) val setLINGER = setSockOptOptTime (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_LINGER) val getBROADCAST = getSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_BROADCAST) val setBROADCAST = setSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_BROADCAST) val getOOBINLINE = getSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_OOBINLINE) val setOOBINLINE = setSockOptBool (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_OOBINLINE) val getSNDBUF = getSockOptSize (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_SNDBUF) val setSNDBUF = setSockOptSize (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_SNDBUF) val getRCVBUF = getSockOptSize (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_RCVBUF) val setRCVBUF = setSockOptSize (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_RCVBUF) fun getTYPE s = SockType.fromRep (getSockOptInt (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_TYPE) s) fun getERROR s = let val se = getSockOptInt (Prim.Ctl.SOL_SOCKET, Prim.Ctl.SO_ERROR) s val se = PrePosix.SysError.fromRep se in if PosixError.cleared = se then NONE else SOME (Error.errorMsg se, SOME se) end handle Error.SysErr z => SOME z local fun getName (s, f: C_Sock.t * pre_sock_addr * C_Socklen.t ref -> C_Int.int C_Errno.t) = let val (sa, salen, finish) = newSockAddr () val () = Syscall.simple (fn () => f (Sock.toRep s, sa, salen)) in finish () end in fun getPeerName s = getName (s, Prim.Ctl.getPeerName) fun getSockName s = getName (s, Prim.Ctl.getSockName) end val getNREAD = getIOCtlSize Prim.Ctl.FIONREAD val getATMARK = getIOCtlBool Prim.Ctl.SIOCATMARK end structure Ctl = struct open CtlExtra val getERROR = isSome o CtlExtra.getERROR end fun sameAddr (SA sa1, SA sa2) = sa1 = sa2 fun familyOfAddr (SA sa) = AddrFamily.fromRep (Prim.familyOfAddr sa) fun bind (s, SA sa) = Syscall.simple (fn () => Prim.bind (Sock.toRep s, sa, C_Socklen.fromInt (Vector.length sa))) fun listen (s, n) = Syscall.simple (fn () => Prim.listen (Sock.toRep s, C_Int.fromInt n)) fun nonBlock' ({restart: bool}, errVal : ''a, f : unit -> ''a C_Errno.t, post : ''a -> 'b, again, no : 'b) = Syscall.syscallErr ({clear = false, restart = restart, errVal = errVal}, fn () => {return = f (), post = post, handlers = [(again, fn () => no)]}) fun nonBlock (errVal, f, post, no) = nonBlock' ({restart = true}, errVal, f, post, Error.again, no) local structure PIO = PrimitiveFFI.Posix.IO structure OS = Primitive.MLton.Platform.OS structure MinGW = PrimitiveFFI.MinGW fun withNonBlockNormal (s, f: unit -> 'a) = let val fd = Sock.toRep s val flags = Syscall.simpleResultRestart (fn () => PIO.fcntl2 (fd, PIO.F_GETFL)) val () = Syscall.simpleRestart (fn () => PIO.fcntl3 (fd, PIO.F_SETFL, C_Int.orb (flags, PrimitiveFFI.Posix.FileSys.O.NONBLOCK))) in DynamicWind.wind (f, fn () => Syscall.simpleRestart (fn () => PIO.fcntl3 (fd, PIO.F_SETFL, flags))) end fun withNonBlockMinGW (s, f: unit -> 'a) = let val fd = Sock.toRep s val () = MinGW.setNonBlock fd in DynamicWind.wind (f, fn () => MinGW.clearNonBlock fd) end in val withNonBlock = fn x => case OS.host of OS.MinGW => withNonBlockMinGW x | _ => withNonBlockNormal x end fun connect (s, SA sa) = Syscall.simple (fn () => Prim.connect (Sock.toRep s, sa, C_Socklen.fromInt (Vector.length sa))) fun connectNB (s, SA sa) = nonBlock' ({restart = false}, C_Int.fromInt ~1, fn () => withNonBlock (s, fn () => Prim.connect (Sock.toRep s, sa, C_Socklen.fromInt (Vector.length sa))), fn _ => true, Error.inprogress, false) fun accept s = let val (sa, salen, finish) = newSockAddr () val s = Syscall.simpleResultRestart (fn () => Prim.accept (Sock.toRep s, sa, salen)) in (Sock.fromRep s, finish ()) end fun acceptNB s = let val (sa, salen, finish) = newSockAddr () in nonBlock (C_Int.fromInt ~1, fn () => withNonBlock (s, fn () => Prim.accept (Sock.toRep s, sa, salen)), fn s => SOME (Sock.fromRep s, finish ()), NONE) end fun close s = Syscall.simple (fn () => Prim.close (Sock.toRep s)) datatype shutdown_mode = NO_RECVS | NO_SENDS | NO_RECVS_OR_SENDS fun shutdownModeToHow m = case m of NO_RECVS => Prim.SHUT_RD | NO_SENDS => Prim.SHUT_WR | NO_RECVS_OR_SENDS => Prim.SHUT_RDWR fun shutdown (s, m) = let val m = shutdownModeToHow m in Syscall.simple (fn () => Prim.shutdown (Sock.toRep s, m)) end type sock_desc = FileSys.file_desc fun sockDesc sock = sockToFD sock fun sameDesc (desc1, desc2) = desc1 = desc2 fun select {rds: sock_desc list, wrs: sock_desc list, exs: sock_desc list, timeout: Time.time option} = let local fun mk l = let val vec = Vector.fromList l val arr = Array.array (Vector.length vec, 0) in (PrePosix.FileDesc.vectorToRep vec, arr) end in val (read_vec, read_arr) = mk rds val (write_vec, write_arr) = mk wrs val (except_vec, except_arr) = mk exs end val setTimeout = case timeout of NONE => Prim.setTimeoutNull | SOME t => if Time.< (t, Time.zeroTime) then Error.raiseSys Error.inval else let val q = LargeInt.quot (Time.toMicroseconds t, 1000000) val q = C_Time.fromLargeInt q val r = LargeInt.rem (Time.toMicroseconds t, 1000000) val r = C_SUSeconds.fromLargeInt r in fn () => Prim.setTimeout (q, r) end handle Overflow => Error.raiseSys Error.inval val res = Syscall.simpleResult (fn () => (setTimeout () ; Prim.select (read_vec, write_vec, except_vec, read_arr, write_arr, except_arr))) val (rds, wrs, exs) = if res = 0 then ([],[],[]) else let fun mk (l, arr) = (List.rev o #1) (List.foldl (fn (sd, (l, i)) => (if Array.sub (arr, i) <> 0 then sd::l else l, i + 1)) ([],0) l) in (mk (rds, read_arr), mk (wrs, write_arr), mk (exs, except_arr)) end in {rds = rds, wrs = wrs, exs = exs} end val ioDesc = FileSys.fdToIOD o sockDesc type out_flags = {don't_route: bool, oob: bool} val no_out_flags = {don't_route = false, oob = false} fun mk_out_flags {don't_route, oob} = C_Int.orb (if don't_route then Prim.MSG_DONTROUTE else 0x0, C_Int.orb (if oob then Prim.MSG_OOB else 0x0, 0x0)) local fun make (base, primSend, primSendTo) = let val base = fn sl => let val (buf, i, sz) = base sl in (buf, i, sz) end fun send' (s, sl, out_flags) = let val (buf, i, sz) = base sl in (C_SSize.toInt o Syscall.simpleResultRestart') ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primSend (Sock.toRep s, buf, C_Int.fromInt i, C_Size.fromInt sz, mk_out_flags out_flags)) end fun send (sock, buf) = send' (sock, buf, no_out_flags) fun sendNB' (s, sl, out_flags) = let val (buf, i, sz) = base sl in nonBlock (C_SSize.castFromFixedInt ~1, fn () => primSend (Sock.toRep s, buf, C_Int.fromInt i, C_Size.fromInt sz, C_Int.orb (Prim.MSG_DONTWAIT, mk_out_flags out_flags)), SOME o C_SSize.toInt, NONE) end fun sendNB (sock, sl) = sendNB' (sock, sl, no_out_flags) fun sendTo' (s, SA sa, sl, out_flags) = let val (buf, i, sz) = base sl in Syscall.simpleRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primSendTo (Sock.toRep s, buf, C_Int.fromInt i, C_Size.fromInt sz, mk_out_flags out_flags, sa, C_Socklen.fromInt (Vector.length sa))) end fun sendTo (sock, sock_addr, sl) = sendTo' (sock, sock_addr, sl, no_out_flags) fun sendToNB' (s, SA sa, sl, out_flags) = let val (buf, i, sz) = base sl in nonBlock (C_SSize.castFromFixedInt ~1, fn () => primSendTo (Sock.toRep s, buf, C_Int.fromInt i, C_Size.fromInt sz, C_Int.orb (Prim.MSG_DONTWAIT, mk_out_flags out_flags), sa, C_Socklen.fromInt (Vector.length sa)), fn _ => true, false) end fun sendToNB (sock, sa, sl) = sendToNB' (sock, sa, sl, no_out_flags) in (send, send', sendNB, sendNB', sendTo, sendTo', sendToNB, sendToNB') end in val (sendArr, sendArr', sendArrNB, sendArrNB', sendArrTo, sendArrTo', sendArrToNB, sendArrToNB') = make (Word8ArraySlice.base, Prim.sendArr, Prim.sendArrTo) val (sendVec, sendVec', sendVecNB, sendVecNB', sendVecTo, sendVecTo', sendVecToNB, sendVecToNB') = make (Word8VectorSlice.base, Prim.sendVec, Prim.sendVecTo) end type in_flags = {peek: bool, oob: bool} val no_in_flags = {peek = false, oob = false} fun mk_in_flags {peek, oob} = C_Int.orb (if peek then Prim.MSG_PEEK else 0x0, C_Int.orb (if oob then Prim.MSG_OOB else 0x0, 0x0)) fun recvArr' (s, sl, in_flags) = let val (buf, i, sz) = Word8ArraySlice.base sl in (C_SSize.toInt o Syscall.simpleResultRestart') ({errVal = C_SSize.castFromFixedInt ~1}, fn () => Prim.recv (Sock.toRep s, Word8Array.toPoly buf, C_Int.fromInt i, C_Size.fromInt sz, mk_in_flags in_flags)) end fun getVec (a, n, bytesRead) = if n = bytesRead then Word8Vector.unsafeFromArray a else Word8ArraySlice.vector (Word8ArraySlice.slice (a, 0, SOME bytesRead)) fun recvVec' (sock, n, in_flags) = let val a = Word8Array.arrayUninit n val bytesRead = recvArr' (sock, Word8ArraySlice.full a, in_flags) in getVec (a, n, bytesRead) end fun recvArr (sock, sl) = recvArr' (sock, sl, no_in_flags) fun recvVec (sock, n) = recvVec' (sock, n, no_in_flags) fun recvArrFrom' (s, sl, in_flags) = let val (buf, i, sz) = Word8ArraySlice.base sl val (sa, salen, finish) = newSockAddr () val n = (C_SSize.toInt o Syscall.simpleResultRestart') ({errVal = C_SSize.castFromFixedInt ~1}, fn () => Prim.recvFrom (Sock.toRep s, Word8Array.toPoly buf, C_Int.fromInt i, C_Size.fromInt sz, mk_in_flags in_flags, sa, salen)) in (n, finish ()) end fun recvVecFrom' (sock, n, in_flags) = let val a = Word8Array.arrayUninit n val (bytesRead, sock_addr) = recvArrFrom' (sock, Word8ArraySlice.full a, in_flags) in (getVec (a, n, bytesRead), sock_addr) end fun recvArrFrom (sock, sl) = recvArrFrom' (sock, sl, no_in_flags) fun recvVecFrom (sock, n) = recvVecFrom' (sock, n, no_in_flags) fun mk_in_flagsNB in_flags = C_Int.orb (mk_in_flags in_flags, Prim.MSG_DONTWAIT) fun recvArrNB' (s, sl, in_flags) = let val (buf, i, sz) = Word8ArraySlice.base sl in nonBlock (C_SSize.castFromFixedInt ~1, fn () => Prim.recv (Sock.toRep s, Word8Array.toPoly buf, C_Int.fromInt i, C_Size.fromInt sz, mk_in_flagsNB in_flags), SOME o C_SSize.toInt, NONE) end fun recvVecNB' (s, n, in_flags) = let val a = Word8Array.arrayUninit n in nonBlock (C_SSize.castFromFixedInt ~1, fn () => Prim.recv (Sock.toRep s, Word8Array.toPoly a, 0, C_Size.fromInt n, mk_in_flagsNB in_flags), fn bytesRead => SOME (getVec (a, n, C_SSize.toInt bytesRead)), NONE) end fun recvArrNB (sock, sl) = recvArrNB' (sock, sl, no_in_flags) fun recvVecNB (sock, n) = recvVecNB' (sock, n, no_in_flags) fun recvArrFromNB' (s, sl, in_flags) = let val (buf, i, sz) = Word8ArraySlice.base sl val (sa, salen, finish) = newSockAddr () in nonBlock (C_SSize.castFromFixedInt ~1, fn () => Prim.recvFrom (Sock.toRep s, Word8Array.toPoly buf, C_Int.fromInt i, C_Size.fromInt sz, mk_in_flagsNB in_flags, sa, salen), fn n => SOME (C_SSize.toInt n, finish ()), NONE) end fun recvVecFromNB' (s, n, in_flags) = let val a = Word8Array.arrayUninit n val (sa, salen, finish) = newSockAddr () in nonBlock (C_SSize.castFromFixedInt ~1, fn () => Prim.recvFrom (Sock.toRep s, Word8Array.toPoly a, 0, C_Size.fromInt n, mk_in_flagsNB in_flags, sa, salen), fn bytesRead => SOME (getVec (a, n, C_SSize.toInt bytesRead), finish ()), NONE) end fun recvArrFromNB (sock, sl) = recvArrFromNB' (sock, sl, no_in_flags) fun recvVecFromNB (sock, n) = recvVecFromNB' (sock, n, no_in_flags) (* Phantom type. *) type ('af, 'sock_type) sock = sock type 'af sock_addr = sock_addr type 'mode stream = stream end mlton-20100608/basis-library/net/unix-sock.sig0000644000076600000240000000127411404435631017541 0ustar mtfstaffsignature UNIX_SOCK = sig type unix type 'sock_type sock = (unix, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = unix Socket.sock_addr val unixAF: Socket.AF.addr_family val toAddr: string -> sock_addr val fromAddr: sock_addr -> string structure Strm : sig val socket: unit -> 'mode stream_sock val socketPair: unit -> 'mode stream_sock * 'mode stream_sock end structure DGrm : sig val socket: unit -> dgram_sock val socketPair: unit -> dgram_sock * dgram_sock end end mlton-20100608/basis-library/net/unix-sock.sml0000644000076600000240000000322411404435631017547 0ustar mtfstaff(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure UnixSock : UNIX_SOCK = struct structure Prim = PrimitiveFFI.Socket.UnixSock datatype unix = UNIX type 'sock_type sock = (unix, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = unix Socket.sock_addr val unixAF = Net.AddrFamily.fromRep PrimitiveFFI.Socket.AF.UNIX fun toAddr s = let val (sa, salen, finish) = Socket.newSockAddr () val _ = Prim.toAddr (NullString.nullTerm s, C_Size.fromInt (String.size s), sa, salen) in finish () end fun fromAddr sa = let val sa = Socket.unpackSockAddr sa val len = Prim.pathLen sa val a = CharArray.array (C_Size.toInt len, #"\000") val _ = Prim.fromAddr (sa, CharArray.toPoly a, len) in CharArraySlice.vector (CharArraySlice.slice (a, 0, SOME (C_Size.toInt len))) end structure Strm = struct fun socket () = GenericSock.socket (unixAF, Socket.SOCK.stream) fun socketPair () = GenericSock.socketPair (unixAF, Socket.SOCK.stream) end structure DGrm = struct fun socket () = GenericSock.socket (unixAF, Socket.SOCK.dgram) fun socketPair () = GenericSock.socketPair (unixAF, Socket.SOCK.dgram) end end mlton-20100608/basis-library/notes.txt0000644000076600000240000014670211404435632016227 0ustar mtfstaff Date: Tue, 23 Jul 2002 11:49:57 -0400 (EDT) From: Matthew Fluet John and SML implementers, Here are a loose collection of notes I've taken while starting to update the MLton implementation of the SML Basis Library to the latest version. They span quite a range: errata and typos, signature constraint concerns, and some design questions. Thus far, I've looked at the structures that had been grouped under the headings General, Text, Integer, Reals, Lists, and Arrays and Vectors (i.e., excluding IO, System, and Posix) in the "old" web specification. A few high level comments: * As an organizational principal, I liked the grouping of modules into larger collections used in the "old" web specification better than the long alphabetical list. * I'm quite happy to see opaque signature matches for most structures. In particular, I think it will help avoid porting problems between implementations that provide different INTEGER structures, especially when LargeInt = Int in one implementation and LargeInt = IntInf in another. Required and optional components, Top-level: * A number of structures have an opaque signature match in overview.html, but not in the corresponding structure specific page: General, Bool, Option, List, ListPair, IntInf, Array, ArraySlice, Vector, VectorSlice. * Word8Array2 is listed as required in overview.html, but its signature, MONO_ARRAY2, is not required. Furthermore, Word8Array2 is marked optional in mono-array2.html. I don't quite see a rationale for Word8Array2 being required. * With the addition of val ~ : word -> word to the WORD signature, presumably ~ should be overloaded at num, rather than at intreal. Reals: * In pack-float.html, the where type clauses are incorrect: structure PackRealBig :> PACK_REAL where type PackRealBig.real = Real.real should be structure PackRealBig :> PACK_REAL where type real = Real.real * Likewise, in most places, references to basic types are unqualifed, so perhaps the where clause should read where type real = real for the PackRealBig and PackRealLittle structures. Arrays and Vectors: * In vector-slice.html, the description of subslice references |arr| when it should reference |sl|. * In {[mono-]array[-slice],[mono-]vector[-slice]}.html, the description of findi references appi when it should reference findi. * In mono-array-slice.html, structure CharArraySlice has the clause where type array = CharVector.vector which should be where type array = CharArray.array. * In mono-{vector[-slice],array[-slice],array2}.html, there are Word structures but no (default word) Word structures. * In mono-vector.html, structure CharVector has the clause where type elem = Char.char while the other monomorphic vectors of basic types reference the unqualified type; i.e. structure BoolVector has the clause where type elem = bool. * There are no "See also"'s into MONO_VECTOR_SLICE or MONO_ARRAY_SLICE from MONO_VECTOR or MONO_ARRAY. * A long discussion about types defined in [MONO_]{ARRAY,VECTOR}[_SLICE] signatures; deferred to a separate email. Really nit-picky: * Ordering of comparison functions (>, >=, etc.) and unary negation are different within INTEGER and WORD. * Ordering of functions in CHAR seems awkward. * Ordering of full, slice, subslice different in ARRAY_SLICE and VECTOR_SLICE. * Ordering of foldi/fold and modifi/modify different in ARRAY2 and MONO_ARRAY2. Top-level and opaque signatures: * I think it would be useful to see the entire top-level of required structures written out with their respective signature constraints. For example, in the description of the Math structure, the spec reads: "The top-level structure Math provides these functions for the default real type Real.real." Because the top-level Math structure has an opaque signature match (in overview.html), then the sentence above implies that there ought to be the constraint where type real = real (or Real.real). Granted, none of the other structures in overview.html have where clauses, and most type constraints are documented in the structure specific pages, but the constraint on the top-level Math.real slipped my mind when I first looked at it. -Matthew ****************************************************************************** ****************************************************************************** Date: Tue, 23 Jul 2002 11:54:09 -0400 (EDT) From: Matthew Fluet As promised, here is a longish look at the types used in Arrays and Vectors. Array and Vector design: * The ARRAY signature includes type 'a vector. Presumably, type 'a Array.vector = type 'a Vector.vector, but no constraint makes this explicit. * MONO_ARRAY_SLICE includes type vector and type vector_slice, while the ARRAY_SLICE signature explicitly references 'a VectorSlice.slice and 'a Vector.vector. * VECTOR_SLICE doesn't include 'a vector, but has val mapi : (int * 'a -> 'b) -> 'a slice -> 'b vector val map : ('a -> 'b) -> 'a slice -> 'b vector; On the other hand, full, slice, base, vector, and concat reference 'a Vector.vector. For consistency, I'd prefer to see signature VECTOR = sig type 'a vector ... end signature VECTOR_SLICE = sig type 'a vector type 'a slice ... end signature ARRAY = sig type 'a vector type 'a array ... end signature ARRAY_SLICE = sig type 'a vector type 'a vector_slice tyep 'a array type 'a slice ... end signature MONO_VECTOR = sig type elem type vector ... end signature MONO_VECTOR_SLICE = sig type elem type vector type slice ... end signature MONO_ARRAY = sig type elem type vector type array ... end signature MONO_ARRAY_SLICE = sig type elem type vector type vector_slice type array type slice ... end structure Vector :> VECTOR structure VectorSlice :> VECTOR_SLICE where type 'a vector = 'a Vector.vector structure Array :> ARRAY where type 'a vector = 'a Vector.vector structure ArraySlice :> ARRAY_SLICE where type 'a vector = 'a Vector where type 'a vector_slice = 'a VectorSlice.slice where type 'a array = 'a Array.array structure BoolVector :> MONO_VECTOR where type elem = bool structure BoolVectorSlice :> MONO_VECTOR_SLICE where type elem = bool where type vector = BoolVector.vector structure BoolArray :> MONO_ARRAY where type elem = bool where type vector = BoolVector.vector structure BoolArraySlice :> MONO_ARRAY_SLICE where type elem = bool where type vector = BoolVector.vector where type vector_slice = BoolVectorSlice.slice where type array = BoolArray.array While semantically, this shouldn't be any different than the specification, it could effect type-error messages. For example, if I have the structure Foo: structure Foo = struct open BoolArraySlice val copyVec0 {src: vector_slice, dst: array} = copyVec {src = src, dst = dst, di = 0} end which I decide to generalize to polymorphic array slices, then just changing BoolArraySlice to ArraySlice will lead to different type-error messages: either "ubound type constructor: vector_slice" (under the specification) or "type constructor vector_slice given 0 arguments, wants 1" (under the signatures given above); and an arity error for array in either case. It's not much of an argument, but I need to replace vector_slice with 'a VectorSlice.slice under the specification, while I only need to add 'a under the sigs above. Array2: * Why not have an ARRAY2_REGION analagous to ARRAY_SLICE? Likewise, how about VECTOR2 and VECTOR2_REGION? I think the decision to separate Arrays and Vectors from their corresponding slices is a nice design choice, and I'd be in favor of extending it to multi-dimentional ones. * Should ARRAY2 have findi/find, exists, all? collate? ****************************************************************************** ****************************************************************************** Date: Thu, 25 Jul 2002 15:20:01 +0200 From: Andreas Rossberg Like Matthew I started implementing the latest version of the Basis spec for Alice and Hamlet. I'm quite happy with most of the changes. It was a surprise to discover the presence of a Windows structure, though :-) Here is my list of comments, some of which may duplicate observations already made by Matthew. They primarily cover global issues and the required part of the library, though I haven't looked deeper into the IO and Posix parts yet. I also included some proposals for modest additions to the library, which I believe are useful and fit its spirit. Trivial bugs, typos, cosmetics ------------------------------ * Overview: - INT_INF appears in the list of required signatures. - WordArray2 appears under the list of required structures, instead of optional ones. * LIST_PAIR: - Typo in description of allEq: double "the". * SUBSTRING: - The scan example uses the deprecated "all" function. * VECTOR_SLICE: - Typo in synopsis of subslice: s/opt/sz/. - Typo in description of subslice: s/|arr|/|sl|/. - Typo in description of findi: s/appi/findi/. - Signature sometimes uses Vector.vector instead of plain vector. - The equation for mapi can be simplified to: Vector.fromList (foldri (fn (i,a,l) => f(i,a)::l) [] slice) * MONO_VECTOR_SLICE and ARRAY_SLICE and MONO_ARRAY_SLICE: - Typo in synopsis of subslice: s/opt/sz/. - Typo in description of findi: s/appi/findi/. * BYTE: - Accidental "val" keyword in synopsis of some functions. * TEXT_IO: - The "where" constraints contain erroneously qualified ids. - The specification of the TEXT_IO signature is not valid SML'97, since StreamIO is specified twice. You might want to add a comment regarding that. - The constraints for types vector and elem are redundant (in fact, invalid), because the signature TEXT_STREAM_IO already specifies the necessary equations. * The use of variable names is sometimes inconsistent: - Predicate arguments to higher-order functions are usually named "f" (eg. List.all), sometimes "p" (eg. String.tokens, StringCvt.splitl), and sometimes even "pred" (eg. ListPair.all). - Similarly, fold functions mostly use "init" to name initial accumulators, except in the List and ListPair modules. Ambiguities / Unclear Details ----------------------------- * Overview: - The subsection about dependencies among optional modules has disappeared. Does that mean that there aren't any anymore? (The nice subsection about design rules and conventions also has gone.) * The intended meaning of opaque signature constraints is not always clear to me. Sometimes the prose contains remarks about additional equalities that are not appearent from the signature constraints. For example, is or isn't - Text.Char.char = Char.char ? (and so on for the rest of Text) - LargeInt.int = IntN.int (for some structure IntN) ? (likewise LargeWord.word, LargeReal.real) - Char.string = String.string ? - Math.real = Real.real ? In particular, the spec sometimes speaks of "equal structures", which has no real technical meaning in SML'97. Note that from the opaque matching on the overview page one might even conclude that General.unit <> {} ! * The type specification of String.string and CharVector.vector is circular: structure String :> STRING where type string = CharVector.vector structure CharVector :> MONO_VECTOR where type vector = String.string Likewise for Substring.substring and CharVectorSlice.slice. A respective defining structure should be chosen. * STRING: - Function fromString has a special case that is not covered by implementing the function through straight-forward iterative application of the Char.scan function, namely a trailing gap escape (\f...f\) as in "foo\\ \\" or "foo\\ \\\000" (where \000 is an non-convertible character). Several implementations I tried get that detail wrong, so a corresponding note might be in order. Moreover, it is not completely obvious from the description what the result should be for strings that contain a gap escape as the only convertible sequence, e.g. "\\ \\" or "\\ \\\000" - it is supposed to be SOME "", I guess. * SUBSTRING: - Shouldn't span raise Span if i' < i? Otherwise, contrary to the prose, it in fact accepts arguments where ss' is left to ss, as long as they overlap (which is rather odd). - For the curried triml/trimr it is not clear whether an Subscript exception has to be raised already if k < 0 but no second argument is applied. Naming and structuring ---------------------- Its nicely chosen regular naming conventions and structure are two of the aspects I like most about the Standard Basis. The following list enumerates the few cases where I feel that the spec violates its own conventions. * WORD: - The fromLargeWord and toLargeWord functions should drop the "Word" suffix to be consistent with the corresponding functions in the REAL and INTEGER signatures. * CHAR: - The functions contains/notContains should be moved to the STRING signature, as they are similar to find/exist operations and thus functionality of the aggregate. The type string could then be removed from the signature. * ARRAY_SLICE and MONO_ARRAY_SLICE: - The function copyVec seems completely out of place: it does neither operate on array slices, nor on vectors. But honestly I have got no idea where else to put it :-( * STRING and SUBSTRING: - There is a certain asymmetry between slices and substrings which tends to confuse at least myself when hacking. For more consistency I propose: (1) changing the type of Substring.substring to string * int * int option -> substring (for consistency with VectorSlice.slice), (2) renaming Substring.slice to Substring.subsubstring, (for consistency with VectorSlice.subslice), (3) removing Substring.{app,foldl,foldr} (there are no similar functions in the STRING signature, and in both cases they are available through CharVector/CharVectorSlice), (4) removing String.extract and Substring.extract (the same functionality is available through CharVector[Slice]). - I believe the deprecated Substring.all can be removed for good. After all, there are more serious incompatible changes being made (e.g. array copying functions). * Vectors and arrays: - While the lib consistently uses the to/from convention for conversions on basic types, it sometimes uses adhoc conventions for aggregates. I propose renaming: (1) Array.vector to Array.toVector (2) VectorSlice.vector to VectorSlice.toVector, (3) ArraySlice.vector to ArraySlice.toVector, (4) Substring.string to Substring.toString, - Since the copy functions have only 3, mostly distinctly typed arguments now, there no longer seems to be a strong reason to require passing those by notationally heavy records. * INT_INF: - The presence of bit fiddling operators in that signature is something that feels exceptionally ad-hoc. Either they should be available for all integer types, or there should be a separate WORD_INF, with appropriate conversions, that makes these available. * Toplevel: - Now that there is Word.~ (which is good) it seems rather odd that the toplevel ~ is not overloaded for words, i.e. does not have type num-> num. * Net functionality: - I really like the idea of structuring the library namespace as it has been done with the OS and Posix structures. I would prefer to see something similar being done for the added network functionality. More precisely, I propose (1) moving the structures Socket, INetSock, GenericSock, and the three Net*DB structures into a new wrapper structure Net (renaming Net*DB to *DB), (2) defining a corresponding signature NET, (3) renaming the signatures SOCKET, GENERIC_SOCK and INET_SOCK to NET_SOCKET, NET_GENERIC_SOCK and NET_INET_SOCK, resp., (4) moving UnixSock to the Unix structure (renamed as Socket). Misc. proposals for additional functionality -------------------------------------------- Here is a small collection of miscellaneous simple functions which I believe the library is still lacking, either because they are commonly useful or because they would make the library more regular. * LIST and LIST_PAIR: - The IMHO single most convenient extension to the library would be indexed morphisms on lists, i.e. adding val appi : (int * 'a -> unit) -> 'a list -> unit val mapi : (int * 'a -> 'b) -> 'a list -> 'b list val foldli : (int * 'a * 'b -> 'b) -> 'b -> 'a list -> 'b val foldri : (int * 'a * 'b -> 'b) -> 'b -> 'a list -> 'b val findi : (int * 'a -> bool) -> 'a list -> (int * 'a) option - Likewise for LIST_PAIR. - LIST_PAIR does not support partial mapping: val mapPartial : ('a * 'b -> 'c option) -> 'a list * 'b list -> 'c list * LIST, VECTOR, ARRAY, etc.: - Another function on lists that would be very useful from my perspective is val appr : ('a -> unit) -> 'a list -> unit and its indexed sibling val appri : (int * 'a -> unit) -> 'a list -> unit which traverse the list from right to left. - Likewise for all aggregate types. - All aggregates come with a fromList function. I often feel the need to have inverse toList functions. Use of foldr is obfuscating. * OPTION: - Often using isSome is a bit clumsy. I thus propose adding the dual val isNone : 'a option -> bool * STRING and SUBSTRING: - For historical reasons we have {String,Substring}.size instead of *.length, which is inconsistent with all other aggregates and frequently lets me mix them up when I use them side by side. I propose adding aliases String.maxLen String.length Substring.length * WideChar and WideString: - There is no convenient way to convert between the standard and wide character set. Would it be reasonable to introduce LargeChar and LargeString structures (and so on) and have the CHAR and STRING signatures enriched by fromLarge/toLarge functions, as for numbers? That would also allow a program to select the widest character set available (which is currently impossible within the language). * String conversion: - I don't quite see the rationale for which signatures contain a scan function and which don't. I believe it makes sense to have scan in every signature that has fromString. - There should be a function val scanC : (Char.char, 'a) StringCvt.reader -> (char, 'a) StringCvt.reader to scan strings as C characters. This would make Char.fromCString and particularly String.fromCString more modular. - How about a dual writer abstraction as with type ('a,'b) writer = 'a * 'b -> 'b option and supporting fmt functions for basic types? Such a thing might be useful for writing to streams or buffers. * Vectors: For some time now I have been trying to use vectors more often instead of an often inappropriate list representation. This is sometimes made more difficult simply because the library support isn't as good as for lists. It improved in the updated version but still I miss: - Array.fromVector, - Vector.mapPartial, - Vector.rev, - Vector.append (though I guess concat is good enough), - most of all: a VectorPair structure. * Hash functions: - Giving every basic type a (default) hash function in addition to comparison would be quite useful in conjunction with container libraries. * There is no defining structure for references. I would like to see signature REF structure Ref : REF where REF contains: datatype ref = datatype ref val ! : 'a ref -> 'a val := : 'a ref * 'a -> unit val swap : 'a ref * 'a ref -> unit (* or :=: ? *) val map : ('a -> 'a) -> 'a ref -> 'a ref You might then consider removing ! and := from GENERAL. * Signature conventions: Some additional conventions would make use of Basis types as functor arguments more convenient: - Each signature defining an abstract type should make that type available under the alias "t" as well (this includes monomorphic types as well as polymorphic ones). - Every equality type should come with an explicit equality function val eq : t * t -> bool to move away from the reliance on eqtypes. - There should be a uniform name for canonical constructor functions, e.g. "new" (or at least an alias). -- Andreas Rossberg, rossberg@ps.uni-sb.de ****************************************************************************** ****************************************************************************** Date: Fri, 2 Aug 2002 14:04:16 +0100 From: David Matthews I've been having another look at the Basis library implementation in Poly/ML and in particular the I/O library. I'm still not sure I fully understand the implications of the Stream IO (functional IO) layer and in particular the way "canInput" works and interacts with "input". The definition says that canInput(f, n) returns SOME k "if a call to input would return immediately with at least k characters". Specifically it does not say "if a call to inputN(f, k) would return immediately". Secondly it says that it "should attempt to return as large a k as possible" and gives the example of a buffer containing 10 characters with the user calling canInput(f, 15). This suggests that a call to canInput could have the effect of committing the stream since a perfectly good implementation of "input" would be to return what was left of the buffer, i.e. 10 characters, and only read from the underlying stream on a subsequent call to "input". Yet after a call to canInput(f, 15) which returns SOME 15 the call to "input" is forced to return at least 15. In other words a call to canInput changes the behaviour of a subsequent call to "input". Generally, what is the behaviour of canInput with an argument larger than the buffer size? How far ahead is canInput expected to read? A few other notes of things I've discovered, some of which are trivial: The signature for TextIO.StreamIO contains duplicates of where type StreamIO.reader = TextPrimIO.reader where type StreamIO.writer = TextPrimIO.writer There are declared constants for platformWin32Windows2000 and platformWin32WindowsXP in the Windows structure. When I proposed the Windows.Config structure I didn't include constants for these versions of the OS because the underlying GetVersionEx function returns the same value, VER_PLATFORM_WIN32_NT in the dwPlatformId field for NT, Windows 2000 and XP It is possible to distinguish these but only using the major and minor version fields. Windows CE does give a different value for the platformID. I would say it is confusing to have these here because it implies that it's possible to discriminate on the basis of the platformID field. The example definition of input1 at the bottom of STREAM_IO returns a value of type elem option * instream when the signature says it should be (elem * instream) option. Description of "input" function in STREAM_IO signature. The word "ay" should be "may". -- David. ****************************************************************************** ****************************************************************************** Date: Fri, 11 Oct 2002 17:46:59 -0400 (EDT) From: Matthew Fluet Following up my previous post, here is another loose collection of notes I've taken while updating the MLton implementation of the SML Basis Library. This includes the structures that had been grouped under the headings System, Posix, and IO in the "old" web specification. Required and optional components: * The optional functors PrimIO, StreamIO, and ImperativeIO are not listed among the optional components in overview.html. Lists: * The discussion for the ListPair structure says: "Note that a function requiring equal length arguments may determine this lazily, i.e. , it may act as though the lists have equal length and invoke the user-supplied function argument, but raise the exception when it arrives at the end of one list before the end of the other." Such an implementation choice seems to go against the spirit that programs run under conforming implementations of the Basis Library should behave the same. Posix: * In posix.html, last sentence in Discussion: "onsult" instead of "consult" PosixSignal: * In posix-signal.html, in Discussion: "The name of the coressponding ..." sentence is repeated. PosixError: * In the discussion of POSIX_ERROR: "The name of a corresponding POSIX error can be derived by capitalizing all letters and adding the character ``E'' as a prefix. For example, the POSIX error associated with nodev is ENODEV. The only exception to this rule is the error toobig, whose associated POSIX error is E2BIG." It isn't clear if this is the intended semantics for errorName and syserror. Time: * The type time now includes "negative values moving to the past." In the absence of negative values, the text for the the to{Seconds,Milliseconds,Microseconds} functions to drop fractions of the time unit was unambigous. With negative values, I would interpret this as rounding towards zero. Is this correct? Would it be clearer to describe the rounding as such? * The + and - functions are required to raise Overflow, although most other "result not representable as a time value" error raises Time. * The - function is written prefix instead of infix in the description. * The scan and fromString functions do not specify how to treat a value with greater precision than the internal representation; should it have rounding or truncation semantics? Also, the functions are required to raise Overflow for an unrepresentable time value. IO: * The nice introduction to IO that appears at http://cm.bell-labs.com/cm/cs/what/smlnj/doc/basis/pages/io-explain.html doesn't seem to be included with the new pages. * The functor arguments in PrimIO, StreamIO, and ImperativIO functors don't match; some use structure A: MONO_ARRAY and others use structure Array: MONO_ARRAY. PrimIO() and PRIM_IO * The PRIM_IO signature requires pos to be an eqtype, but the PrimIO functor argument only requires pos to be a type. * readArr[NB], write{Vec,Arr}[NB] take "slices" (records of type {buf: {vector,array}, i: int, sz: int option}) but no description of the appropriate action to take when the slices are invalid. Presumably, they should raise Subscript. * There are a number of "contradictory" statments: "Readers and writers should not, in general, raise the IO.Io exception. It is assumed that the higher levels will appropriately handle these exceptions." "A reader is required to raise IO.Io if any of its functions, except close or getPos, is invoked after a call to close. A writer is required to raise IO.Io if any of its functions, except close, is invoked after a call to close." "closes the reader and frees operating system resources. Further operations on the reader (besides close and getPos) raise IO.ClosedStream." "closes the writer and frees operating system resources. Further operations (other than close) raise IO.ClosedStream." * The augment_reader and augment_writer functions may introduce new functions. Should the synthesized operations handle IO.Io exceptions and change the function field? Maybe this falls under the "intentionally unspecified" clause. StreamIO() and STREAM_IO: * What is the difference between a terminated output stream and a closed output stream? Some operations say what to do when the stream is terminated or closed, but many are unspecified when the other condition holds. I resolved this by looking at the IO introduction mentioned above, where it discusses stream states. But, closeOut is still confusing: "flushes f's buffers, marks the stream closed, and closes the underlying writer. This operation has no effect if f is already closed. If f is terminated, it should close the underlying writer." Shouldn't closeOut always execute the underlying writer's close function? The only way to terminate an outstream is to getOutstream, but I would really expect TextIO.closeOut to "really" close the underlying file/outstream/writer. * The IO structure has dropped the TerminatedStream exception, but there seem to be sufficient cases when a stream should raise an exception when it is terminated. * The semantics of the vector returned by getReader are unclear. At the very least, the source code for SML/NJ and PolyML have very different interpretations, and I've chosen yet another. I think part of the problem is that the word "[un]consumed" only appears in the description of this function, so it's unclear what corresponds to consumed input. * I suspect the example under endOfStream is wrong: In these cases the StreamIO.instream will also have multiple EOF's; that is, it can be that val true = endOfStream(f) val ("",f') = input f val true = endOfStream(f') val ("xyz",f'') = input f The fact that input f can return two different values would seem to violate the principal argument for functional streams! Looking at the aforementioned IO introduction in the "old" pages, I see the more reasonable example: Consequently, the following is not guaranteed to be true: let val z = TextIO.StreamIO.endOfStream f val (a,f') = TextIO.StreamIO.input f val x = TextIO.StreamIO.endOfStream f' in x=z (* not necessarily true! *) end whereas the following is guaranteed to be true: let val z = TextIO.StreamIO.endOfStream f val (a,f') = TextIO.StreamIO.input f val x = TextIO.StreamIO.endOfStream f (* note, no prime! *) in x=z (* guaranteed true! *) end * David Matthews's post on Aug. 2 raised questions about canInput which are unresolved. General comments: * Various operations in IO take "slices", but aren't expressed in terms of {Vector,Array}Slice structures. One difficulty with this is that the slice types are not in scope within the IO signatures. I would really advocate making the VectorSlice structure a substructure of the Vector structure (and likewise for arrays). Even if this isn't done for the polymorphic vector/array structures, it would be extremely beneficial for the monomorphic structures, where in the {Prim,Stream,Imperative}IO functors, it is impossible to access the corresponding monomorphic vector/array slice structures. I found myself using Vector.tabulate when I really wanted ArraySlice.vector. The "old" MONO_ARRAY signature included structure Vector: MONO_VECTOR which gave access to the corresponding monomorphic vectors. -Matthew ****************************************************************************** ****************************************************************************** Date: Fri, 13 Dec 2002 15:57:55 +0100 From: Andreas Rossberg Here is a collection of issues and comments we gathered when implementing the I/O stack from the Standard Basis (primitive, stream, imperative I/O) for Alice. While in general the specification seems to be pretty precise and complete, we sometimes found it hard to understand the semantic details of stream I/O, especially since many of them can only be derived indirectly from the examples in the discussion section and there appear to be some minor ambiguities and inconsistencies. Also, the PrimIO and StreamIO functors cannot always be implemented as suggested, because of their parametricity in types such as position and element. As a general note, the I/O interface does not seem to have been designed with concurrency in mind. In particular, augmenting readers and writers cannot be made thread-safe, AFAWCS. This is a bit of a problem for us, since Alice is relying on concurrency. However, that does not seem to be an issue easily solved. - Leif Kornstaedt, Andreas Rossberg The IO structure ---------------- * exception Io: - function field: (pedantic) The wording seems to imply that only functions from STREAM_IO raise the Io exception, but this is clearly not the case (consider TextIO.openIn to name just one). * datatype buffer_mode: - There is no specification of what precisely line buffering is supposed to mean, in particular for non-text streams. The PRIM_IO signature --------------------- * Synopsis: - (pedantic) It says that "higher level I/O facilities do not access the OS structure directly...". That's somewhat misleading since OS does not provide the same functionality anyway (if any, it was the Posix structure). * type reader: - Unlike for writers, it is not specified what the minimal set of operations is that a reader must support. - It is not specified whether multiple end-of-streams may occur. Since they are anticipated for StreamIO, one should expect them to be possible for underlying readers as well. However, this requires clarification of the semantics of several operations. - readArr, readArrNB: It is specified nowhere what the option for sz is supposed to mean, i.e. what the semantics of NONE is (presumably as for slices). - readVec, readVecNB: Unlike all other similar read and write functions, these two do not accept an option for the size argument. - avail: The description suggests that the function can be used as a hint by inputAll. However, this information is too inaccurate to be useful, since (apart from translation issues) the physical size of elements cannot be obtained (in particular in the StreamIO functor, which is parametric in the element type). In practice, endPos seems to be more useful for this purpose. So it is not clear what purpose avail could actually serve at all at the abstraction level provided by readers. - endPos: (1) May it block? For example, when reading from terminal or from another kind of stream, this can be naturally expected. (2) Which position is returned if there are multiple end-of-streams? - getPos, setPos, endPos, verifyPos: Description should start with "when present". - setPos, endPos: Should not raise an exception if unimplemented, but rather be NONE. Actually, the implementation notes on writers state that endPos *must* be implemented for readers. - Implementation note, item 6: Why is it likely that the client uses getPos frequently? And why should the reader count *untranslated* elements (and how would there be actual elements before translation)? (See also comments on STREAM_IO.filePosIn) * type writer: - writeVec, writeArr, writeVecNB, writeArrNB: (1) Again, it is not specified what the optional size means. (2) When may k < sz occur without having IO failure? If it is arbitrary, then there appears to be no correct way to write a sequence of elements, because it is neither possible to detect partial element writes (which are explained in the paragraph before the Implementation Notes), nor to complete such writes. This particularly implies that the StreamIO functor cannot implement flushing correctly (see below). - getPos, setPos, endPos, verifyPos: Description should start with "when present". - getPos, setPos: Should not raise an exception if unimplemented, but rather be NONE. - last paragraph before Implementation Note: Typo, double "plus". - first sentence in Implementation Note: (pedantic) Why is this put into the implementation notes when it actually seems to be a requirement of the specification? - last paragraph of Implementation Note: (1) States that readers must implement getPos, which seems to be contradicted by its optional type. (2) Typo, double "need". * openVector: - Is this supposed to support random access? Note that for types generated with the PrimIO functor it cannot (see below)! That seems to make this function rather useless. * augmentReader, augmentWriter: - It is not possible to synthesize operations in a way that is thread-safe in concurrent systems, hence it should be noted that augmenting is potentially dangerous. * There is no reference to the PrimIO functor. The PrimIO functor ------------------ * General problems: - Since the implementation is necessarily parametric in the pos type, openVector, nullRd, nullWr cannot create readers that allow random access, although one would expect that at least for openVector. * Functor argument: - Structure names A and V are inconsistent with the StreamIO and ImperativeIO functors. - Type pos has to be an eqtype to match the result signature. - Since the extract and copy functions have been removed/changed from ARRAY and VECTOR signatures, the PrimIO functor now naturally requires slice structures for efficient implementation. (Likewise the StreamIO functor) * Functor result: - Type sharing of the pos type is not specified, though essential for this functor being useful at all. The STREAM_IO signature ----------------------- * Synopsis: - An exception likely to be raised in by the underlying reader/writer is Size, which is not mentioned. OTOH, Fail can only occur in the rare case of user-supplied readers/writers, as the Basis itself is supposed to never raise it. * type out_pos: - A note on the meaning of this type would be desirable, since its canonical representation is (outstream * pos) rather than pos. (That also may have caused confusion in the discussion of imperative I/O, see below.) * input1: - The signature of this function is inconsistent with all other input functions. It should rather have type instream -> elem option * instream which in fact appears to be the type assumed in the discussion example relating input1 to inputN. * input: - Typo, s/ay/may/ * inputN: - This function is somewhat underspecified for n=0. In particular, may it block? Is it required to raise Io if the underlying reader is closed? * input, input1, inputN, inputAll: - (pedantic) Descriptions speak of "underlying system calls", although the reader may not actually depend on system calls. Preferably speak of "underlying reader" only. * closeIn: - Likewise, description speaks of "releasing system resources". This should be replaced by saying that it closes the underlying reader (which is not even specified as is). * closeOut: - Does the function attempt to close the stream even if flushing fails? - Why is it possible to close terminated streams? That seems to allow unfortunate interference with another stream that has been created from the extracted writer. * mkInstream, getReader: - The table seems to imply that mkInstream always augments its reader. This is inappropriate for concurrent environments (see above). - Should getReader return the original or the augmented reader? - The table still includes the removed getPosIn and setPosIn functions. * mkOutstream, getWriter: - Likewise. * filePosIn: - There seems to be no way to implement this function for buffered I/O, because the reader position that corresponds to a mid-block-element is not available and cannot be calculated in general. So how is this meant? - Typo, s/character/element/ * filePosOut: - Likewise. * getWriter: - It is non-obvious what the precise meaning of "terminating" a stream is. If this is merely setting a status flag then a corresponding note would be helpful. * getPosOut: - May this flush the stream (and hence raise Io exceptions)? * setPosOut: - This may raise an exception because the position has been invalidated after obtaining it (e.g. by file truncation performed by another process). - Typo, s/underlying device/underlying writer/ * setBufferMode, getBufferMode: - There is no specification of the semantics of line buffering, in particular for non-text streams. (See also comments on StreamIO functor) - It is not specified whether the stream may be flushed when set to LINE_BUF mode (may cause Io exception). It seems unreasonable to require it not to do so (assuming that line buffering is intended to maintain the invariant that the buffer never contains line breaks). - The synopsis of this function uses "ostr", while all others use "f" for streams. * setPosOut, setBufferMode, getWriter: - Can raise an exception if flushing fails. * Discussion: - The statement that closing a stream just causes the not-yet-determined part of the stream to be empty should probably be generalised to explain what *truncating* a stream means (getReader also truncates the stream). - Example of freshly opened stream: s/mkInstream r/mkInstream(r, vector [])/ s/size/length/ - nreads example: s/mkInstream r/mkInstream(r, vector [])/ s/size/length/ - input1/inputN relation example: (1) Inconsistent with the actual typing of input1 (see above). (2) Typo, s/inputN f/inputN(f,1)/ - Unbuffered I/O, 1st example: (1) Typos, s/mkInstream(reader)/mkInstream(reader, vector [])/ s/PrimIO.Rd{chunkSize,...}/(PrimIO.RD{chunksize,...}, v)/ (2) More importantly, the actual condition appears to be incorrect. It should read: (chunkSize > 1 orelse length v = 1) andalso endOfStream f' - Unbuffered I/O, 2nd example: s/mkInstream(reader)/mkInstream(reader, vector [])/ s/PrimIO.Rd{chunkSize,...}/(PrimIO.RD{chunksize,...}, v)/ The condition must be corrected as above. * There is no reference to the StreamIO functor. The StreamIO functor -------------------- * General problems: - It is impossible for this functor to support line buffering, since it has no way of knowing which element consists a line break. This could be solved by changing the someElem functor argument to a breakElem argument. - It is also impossible to utilize reader's endPos for pre-allocation, because the functor is parametric in the position type. * Functor argument: - Since the extract and copy functions have been removed/changed from ARRAY and VECTOR signatures, the StreamIO functor now naturally requires slice structures for efficient implementation. (Likewise the PrimIO functor) * Functor result: - Type sharing of the result types is not specified. * Discussion, paragraph on flushing: - Most of this discussion rather belongs to the description of STREAM_IO. - Everything said here is not restricted to flushOut, but applies to flushing in general. - Unfortunately, it is left unspecified where flushing may happen and, consequently, where respective Io exceptions may occur. - Write retries as suggested here seem to be impossible to implement correctly using the writer interface as specified (see comments on PRIM_IO.writer). - According to the writer description, write operations may never return an element count of 0, so the last sentence is misleading. * Discussion, last paragraph: - Typo, missing ")" * Implementation note: - 3rd bullet: typo, s/PrimIO.augmentIn/PrimIO.augmentReader/ - 5th and 6th bullet: The endPos function cannot be utilized as suggested, because the functor is necessarily parametric in the position type. The IMPERATIVE_IO signature --------------------------- * General comment: - It is unfortunate that imperative I/O is asymmetric with respect to providing (limited) random access on input vs. output streams - the former requires going down to the lower-level stream I/O. That makes imperative I/O a somewhat incomplete abstraction layer. - Likewise, it would be desirable if there were ways for performing full-fledged random access without leaving the imperative I/O abstraction layer, at least for streams were it is suitable (e.g. BinIO). Despite the statement in the discussion this is neither available for input nor for output streams (see comments below). * closeIn: - Typo, s/S.closeIn/StreamIO.closeIn/ * flushOut: - Typo, s/S.flushOut/StreamIO.flushOut/ * closeOut: - Typo, s/S.closeOut/StreamIO.closeOut/ * Discussion: - Equivalences, last line: s/StreamIO.output/StreamIO.flushOut/ - Paragraph about random-access on output streams: It says that BinIO.StreamIO.out_pos = Position.int. This is not true, we have BinPrimIO.pos = Position.int, but that is a completely different type. In fact, it is impossible to implement out_pos as Position.int. * There is no reference to the ImperativeIO functor. The ImperativeIO functor ------------------------ * Functor argument: - The Array argument is unnecessary. * Functor result: - Type sharing of the result types is not specified. The TEXT_STREAM_IO signature ---------------------------- * General comment: - Why bother separating this signature from STREAM_IO? => outputSubstr can easily be generalised to outputSlice (for good), => if line buffering is part of STREAM_IO, inputLine might be as well. The TextIO structure -------------------- * General comment: - Systems providing WideText should also provide a WideTextIO structure (they have to provide WideTextPrimIO already, which seems inconsistent). * Interface: - Duplicated type constraints for StreamIO.reader and StreamIO.writer. The BinIO structure -------------------- * Interface: - Type sharing with BinPrimIO is not specified (unlike for TextIO), i.e. the following constraints are missing: where type StreamIO.reader = BinPrimIO.reader where type StreamIO.writer = BinPrimIO.writer where type StreamIO.pos = BinPrimIO.pos ****************************************************************************** ****************************************************************************** ****************************************************************************** ****************************************************************************** Doing host/network byte order conversions on ML side. Socket.Ctl * Semantics of setNBIO, getNREAD, getATMARK are unclear; Don't seem to be accessible via {get,set}sockopt; Instead, using ioctl. ****************************************************************************** ****************************************************************************** Posix.FileSys: * Within structure S, the type mode is constrained equal to flags, but flags is an eqtype. STREAM_IO.pos * "This is the type of positions in the underlying readers and writers. In some instantiations of this signature (e.g., TextIO.StreamIO), pos is abstract; in others (e.g., BinIO.StreamIO) it is Position.int." But, the equality of BinIO.StreamIO.pos and Position.int is never specified in any where constraint of BinIO. * How can filePosIn be implemented with completely abstract pos? Not sent to list: * (In general, probably a good idea to look at the entire top-level structure/signature matches and choose a consistent usage of base types. For example, Int:>INTEGER would seem to hide the top-level int; unless Int is opened afterwards. But, then what about all the other structures that reference int? Is top-level int = Int.int or is Int.int = top-level int.) --> I think I'm biased from looking at the MLton implementation, becuase I'm finding it hard to think about how to really express all of the sharing constraints in a way that will be acceptable. This might be the wrong way to look at things: the listing of structures and signatures with clauses doesn't correspond to a build order, it corresponds to the way the environment should look to the program. Sequences and Slices: Why not existsi, alli? Vector: Why no vector: int * 'a -> 'a vector? Resolved: If one defines VECTOR_SLICE by including a type 'a vector and replace 'a Vector.vector with the local 'a vector, but then binds structure Vector: VECTOR structure VectorSlice: VECTOR_SLICE where type 'a vector = 'a Vector.vector at the top-level, does one violate the basis spec? Rationale: it's easiset to implement Vector and VectorSlice simultaneously, say with VectorSlice as a substructure of Vector (in fact, with all of the Vector operations being dispatched to the corresponding VectorSlice ops with full slices), so Vector isn't in scope for the VECTOR_SLICE. *** No, it's not o.k., because opening VectorSlice will introduce a binding for 'a vector; but, if we're lucky, John will accept the proposal. IEEEReal: toString prepends a #"~" even when the class is NAN? *** I guess this is o.k.; there is an explicit sign field. PACK_WORD: structure PackBig :> PACK_WORD (* OPTIONAL *) structure PackLittle :> PACK_WORD (* OPTIONAL *) but PACK_WORD has val subVec : Word8Vector.vector * int -> LargeWord.word i.e., reference to LargeWord.word. Should it be PACK_WORD type word val subVec : Word8Vector.vector * int -> word with structure PackBig :> PACK_WORD with word = Word.word (* OPTIONAL *) Should there be PackBig and PackLittle with word = Word.word? Should there be PackLargeBig with word = LargeWord.word? There aren't many structures that refine on LargeXYZ; most refine on XYZ. *** O.k., we always unpack into a LargeWord, which we could then Word.fromLargeWord back to the size. I guess this is o.k.; It lets an implementation give more PackBig structures than there are Word structures. MLton specific: + why are Int32_gtu and Int32_geu primitive? Why not just Word.fromInt and use Word comparisons? + Real:>REAL doesn't match basis because it may peform arithmetic at extended precision. Should this be mentioned in the user guide? + QUESTION: proc-env.sml + QUESTION: char.sml + check uses of {Vector,Array}Slice.slice for replacement by unsafeSlice. ****************************************************************************** ****************************************************************************** UNIX: I'm not quite sure how the ('a, 'b) proc type is supposed to work in practice; The old Unix structure just used them as TextIO.{in,out}streams. My suspicion is that we're supposed to use Posix.IO.mk{Bin,Text}{Reader,Writer} functions and then use the type system to ensure that if we force a stream to be bin or text, then all other uses have to be the same. I also suspect that we're only supposed to lift the file_desc up to an instream/outstream once; i.e., multiple textInstreamOf calls should continue to return the same TextIO.instream. That would seem to suggest we need an 'a option ref that can be banged at the first call to a streamOf function, and subsequent calls just return the value there. textInstreamOf pr binInstreamOf pr return a text or binary instream connected to the standard output stream of the process pr. Note the multiple calls to these functions on the same proc will result in multiple streams that all share the same underlying Unix stream. textOutstreamOf pr binOutstreamOf pr return a text or binary outstream connected to the standard input stream of the process pr. Note the multiple calls to these functions on the same proc will result in multiple streams that all share the same underlying Unix stream. streamsOf pr returns a pair of input and output text streams associated with pr. This function is equivalent to (textInstream pr, textOutstream pr) and is provided for backward compatibility. mlton-20100608/basis-library/overloads.mlb0000644000076600000240000000075111404435632017021 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local basis-2002.mlb in ann "allowOverload true" in libs/basis-2002/top-level/overloads.sml end end end mlton-20100608/basis-library/pervasive-exns.mlb0000644000076600000240000000101011404435632017767 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-2002/basis-2002.mlb basis-2002.mlb libs/basis-2002/top-level/basis-exns.sig in libs/basis-2002/top-level/pervasive-exns.sml end end mlton-20100608/basis-library/pervasive-types.mlb0000644000076600000240000000101211404435632020160 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-2002/basis-2002.mlb basis-2002.mlb libs/basis-2002/top-level/basis-types.sig in libs/basis-2002/top-level/pervasive-types.sml end end mlton-20100608/basis-library/pervasive-vals.mlb0000644000076600000240000000101011404435632017757 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-2002/basis-2002.mlb basis-2002.mlb libs/basis-2002/top-level/basis-vals.sig in libs/basis-2002/top-level/pervasive-vals.sml end end mlton-20100608/basis-library/pervasive.mlb0000644000076600000240000000044611404435632017030 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) pervasive-types.mlb pervasive-exns.mlb pervasive-vals.mlb infixes.mlb equal.mlb overloads.mlb mlton-20100608/basis-library/platform/0000755000076600000240000000000011404470406016146 5ustar mtfstaffmlton-20100608/basis-library/platform/cygwin.sml0000644000076600000240000000064111404435631020165 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Cygwin = struct fun toFullWindowsPath p = CUtil.C_String.toString (PrimitiveFFI.Cygwin.toFullWindowsPath (NullString.nullTerm p)) end mlton-20100608/basis-library/platform/mingw.sml0000644000076600000240000000167311404435631020014 0ustar mtfstaff(* Copyright (C) 2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MinGW = struct fun getTempPath () = let fun lp bufSz = let val buf = CharArray.arrayUninit (C_Size.toInt bufSz) val reqSz = PrimitiveFFI.MinGW.getTempPath (bufSz, buf) in if 0w0 = reqSz then NONE else if C_Size.< (reqSz, bufSz) then SOME (CharArraySlice.vector (CharArraySlice.unsafeSlice (buf, 0, SOME (C_Size.toInt reqSz)))) else lp reqSz end in (* Win32 MAX_PATH is 260, but some subsystems allow longer names *) lp 0w261 end end mlton-20100608/basis-library/posix/0000755000076600000240000000000011404470406015464 5ustar mtfstaffmlton-20100608/basis-library/posix/error.sig0000644000076600000240000001033311404435632017323 0ustar mtfstaffsignature POSIX_ERROR = sig eqtype syserror val toWord: syserror -> SysWord.word val fromWord: SysWord.word -> syserror val errorMsg: syserror -> string val errorName: syserror -> string val syserror: string -> syserror option val acces: syserror val again: syserror val badf: syserror val badmsg: syserror val busy: syserror val canceled: syserror val child: syserror val deadlk: syserror val dom: syserror val exist: syserror val fault: syserror val fbig: syserror val inprogress: syserror val intr: syserror val inval: syserror val io: syserror val isdir: syserror val loop: syserror val mfile: syserror val mlink: syserror val msgsize: syserror val nametoolong: syserror val nfile: syserror val nodev: syserror val noent: syserror val noexec: syserror val nolck: syserror val nomem: syserror val nospc: syserror val nosys: syserror val notdir: syserror val notempty: syserror val notsup: syserror val notty: syserror val nxio: syserror val perm: syserror val pipe: syserror val range: syserror val rofs: syserror val spipe: syserror val srch: syserror val toobig: syserror val xdev: syserror end signature POSIX_ERROR_EXTRA = sig include POSIX_ERROR exception SysErr of string * syserror option val cleared: syserror val raiseSys: syserror -> 'a val raiseSysWithMsg: syserror * string -> 'a structure SysCall : sig val blocker: (unit -> (unit -> unit)) ref val restartFlag: bool ref val syscallErr: {clear: bool, restart: bool, errVal: ''a} * (unit -> {return: ''a C_Errno.t, post: ''a -> 'b, handlers: (syserror * (unit -> 'b)) list}) -> 'b (* clear = false, restart = false, errVal = ~1 * post = fn _ => (), handlers = [] *) val simple: (unit -> C_Int.t C_Errno.t) -> unit (* clear = false, restart = false, * post = fn _ => (), handlers = [] *) val simple': {errVal: ''a} * (unit -> ''a C_Errno.t) -> unit (* clear = false, restart = true, errVal = ~1 * post = fn _ => (), handlers = [] *) val simpleRestart: (unit -> C_Int.t C_Errno.t) -> unit (* clear = false, restart = true, * post = fn _ => (), handlers = [] *) val simpleRestart': {errVal: ''a} * (unit -> ''a C_Errno.t) -> unit (* clear = false, restart = false, errVal = ~1 * post = fn ret => ret, handlers = [] *) val simpleResult: (unit -> C_Int.t C_Errno.t) -> C_Int.t (* clear = false, restart = false, * post = fn ret => ret, handlers = [] *) val simpleResult': {errVal: ''a} * (unit -> ''a C_Errno.t) -> ''a (* clear = false, restart = true, errVal = ~1 * post = fn ret => ret, handlers = [] *) val simpleResultRestart: (unit -> C_Int.t C_Errno.t) -> C_Int.t (* clear = false, restart = true, * post = fn ret => ret, handlers = [] *) val simpleResultRestart': {errVal: ''a} * (unit -> ''a C_Errno.t) -> ''a (* clear = false, restart = false, errVal = ~1 * handlers = [] *) val syscall: (unit -> C_Int.t C_Errno.t * (C_Int.t -> 'a)) -> 'a (* clear = false, restart = false, * handlers = [] *) val syscall': {errVal: ''a} * (unit -> ''a C_Errno.t * (''a -> 'b)) -> 'b (* clear = false, restart = true, errVal = ~1 * handlers = [] *) val syscallRestart: (unit -> C_Int.t C_Errno.t * (C_Int.t -> 'a)) -> 'a (* clear = false, restart = true, * handlers = [] *) val syscallRestart': {errVal: ''a} * (unit -> ''a C_Errno.t * (''a -> 'b)) -> 'b end end mlton-20100608/basis-library/posix/error.sml0000644000076600000240000003234211404435632017340 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PosixError: POSIX_ERROR_EXTRA = struct structure Prim = PrimitiveFFI.Posix.Error open Prim structure SysError = PrePosix.SysError type syserror = SysError.t val acces = SysError.fromRep EACCES val addrinuse = SysError.fromRep EADDRINUSE val addrnotavail = SysError.fromRep EADDRNOTAVAIL val afnosupport = SysError.fromRep EAFNOSUPPORT val again = SysError.fromRep EAGAIN val already = SysError.fromRep EALREADY val badf = SysError.fromRep EBADF val badmsg = SysError.fromRep EBADMSG val busy = SysError.fromRep EBUSY val canceled = SysError.fromRep ECANCELED val child = SysError.fromRep ECHILD val connaborted = SysError.fromRep ECONNABORTED val connrefused = SysError.fromRep ECONNREFUSED val connreset = SysError.fromRep ECONNRESET val deadlk = SysError.fromRep EDEADLK val destaddrreq = SysError.fromRep EDESTADDRREQ val dom = SysError.fromRep EDOM val dquot = SysError.fromRep EDQUOT val exist = SysError.fromRep EEXIST val fault = SysError.fromRep EFAULT val fbig = SysError.fromRep EFBIG val hostunreach = SysError.fromRep EHOSTUNREACH val idrm = SysError.fromRep EIDRM val ilseq = SysError.fromRep EILSEQ val inprogress = SysError.fromRep EINPROGRESS val intr = SysError.fromRep EINTR val inval = SysError.fromRep EINVAL val io = SysError.fromRep EIO val isconn = SysError.fromRep EISCONN val isdir = SysError.fromRep EISDIR val loop = SysError.fromRep ELOOP val mfile = SysError.fromRep EMFILE val mlink = SysError.fromRep EMLINK val msgsize = SysError.fromRep EMSGSIZE val multihop = SysError.fromRep EMULTIHOP val nametoolong = SysError.fromRep ENAMETOOLONG val netdown = SysError.fromRep ENETDOWN val netreset = SysError.fromRep ENETRESET val netunreach = SysError.fromRep ENETUNREACH val nfile = SysError.fromRep ENFILE val nobufs = SysError.fromRep ENOBUFS val nodata = SysError.fromRep ENODATA val nodev = SysError.fromRep ENODEV val noent = SysError.fromRep ENOENT val noexec = SysError.fromRep ENOEXEC val nolck = SysError.fromRep ENOLCK val nolink = SysError.fromRep ENOLINK val nomem = SysError.fromRep ENOMEM val nomsg = SysError.fromRep ENOMSG val noprotoopt = SysError.fromRep ENOPROTOOPT val nospc = SysError.fromRep ENOSPC val nosr = SysError.fromRep ENOSR val nostr = SysError.fromRep ENOSTR val nosys = SysError.fromRep ENOSYS val notconn = SysError.fromRep ENOTCONN val notdir = SysError.fromRep ENOTDIR val notempty = SysError.fromRep ENOTEMPTY val notsock = SysError.fromRep ENOTSOCK val notsup = SysError.fromRep ENOTSUP val notty = SysError.fromRep ENOTTY val nxio = SysError.fromRep ENXIO val opnotsupp = SysError.fromRep EOPNOTSUPP val overflow = SysError.fromRep EOVERFLOW val perm = SysError.fromRep EPERM val pipe = SysError.fromRep EPIPE val proto = SysError.fromRep EPROTO val protonosupport = SysError.fromRep EPROTONOSUPPORT val prototype = SysError.fromRep EPROTOTYPE val range = SysError.fromRep ERANGE val rofs = SysError.fromRep EROFS val spipe = SysError.fromRep ESPIPE val srch = SysError.fromRep ESRCH val stale = SysError.fromRep ESTALE val time = SysError.fromRep ETIME val timedout = SysError.fromRep ETIMEDOUT val toobig = SysError.fromRep E2BIG val txtbsy = SysError.fromRep ETXTBSY val wouldblock = SysError.fromRep EWOULDBLOCK val xdev = SysError.fromRep EXDEV local infixr 5 ::? fun (n,s) ::? l = if n = SysError.fromRep ~1 then l else (n,s) :: l in val errorNames = (acces,"acces") ::? (addrinuse,"addrinuse") ::? (addrnotavail,"addrnotavail") ::? (afnosupport,"afnosupport") ::? (again,"again") ::? (already,"already") ::? (badf,"badf") ::? (badmsg,"badmsg") ::? (busy,"busy") ::? (canceled,"canceled") ::? (child,"child") ::? (connaborted,"connaborted") ::? (connrefused,"connrefused") ::? (connreset,"connreset") ::? (deadlk,"deadlk") ::? (destaddrreq,"destaddrreq") ::? (dom,"dom") ::? (dquot,"dquot") ::? (exist,"exist") ::? (fault,"fault") ::? (fbig,"fbig") ::? (hostunreach,"hostunreach") ::? (idrm,"idrm") ::? (ilseq,"ilseq") ::? (inprogress,"inprogress") ::? (intr,"intr") ::? (inval,"inval") ::? (io,"io") ::? (isconn,"isconn") ::? (isdir,"isdir") ::? (loop,"loop") ::? (mfile,"mfile") ::? (mlink,"mlink") ::? (msgsize,"msgsize") ::? (multihop,"multihop") ::? (nametoolong,"nametoolong") ::? (netdown,"netdown") ::? (netreset,"netreset") ::? (netunreach,"netunreach") ::? (nfile,"nfile") ::? (nobufs,"nobufs") ::? (nodata,"nodata") ::? (nodev,"nodev") ::? (noent,"noent") ::? (noexec,"noexec") ::? (nolck,"nolck") ::? (nolink,"nolink") ::? (nomem,"nomem") ::? (nomsg,"nomsg") ::? (noprotoopt,"noprotoopt") ::? (nospc,"nospc") ::? (nosr,"nosr") ::? (nostr,"nostr") ::? (nosys,"nosys") ::? (notconn,"notconn") ::? (notdir,"notdir") ::? (notempty,"notempty") ::? (notsock,"notsock") ::? (notsup,"notsup") ::? (notty,"notty") ::? (nxio,"nxio") ::? (opnotsupp,"opnotsupp") ::? (overflow,"overflow") ::? (perm,"perm") ::? (pipe,"pipe") ::? (proto,"proto") ::? (protonosupport,"protonosupport") ::? (prototype,"prototype") ::? (range,"range") ::? (rofs,"rofs") ::? (spipe,"spipe") ::? (srch,"srch") ::? (stale,"stale") ::? (time,"time") ::? (timedout,"timedout") ::? (toobig,"toobig") ::? (txtbsy,"txtbsy") ::? (wouldblock,"wouldblock") ::? (xdev,"xdev") ::? [] end exception SysErr of string * syserror option val toWord = C_Int.castToSysWord o SysError.toRep val fromWord = SysError.fromRep o C_Int.castFromSysWord val cleared : syserror = SysError.fromRep 0 fun errorName n = case List.find (fn (m, _) => n = m) errorNames of NONE => "" | SOME (_, s) => s val _ = General.addExnMessager (fn e => case e of SysErr (s, eo) => SOME (concat ["SysErr: ", s, case eo of NONE => "" | SOME e => concat [" [", errorName e, "]"]]) | _ => NONE) fun syserror s = case List.find (fn (_, s') => s = s') errorNames of NONE => NONE | SOME (n, _) => SOME n fun errorMsg (n: syserror) = let val cs = strError (SysError.toRep n) in if Primitive.MLton.Pointer.isNull (Primitive.MLton.Pointer.fromWord cs) then "Unknown error" else CUtil.C_String.toString cs end fun raiseSys n = raise SysErr (errorMsg n, SOME n) fun raiseSysWithMsg (n, msg) = raise SysErr ((errorMsg n) ^ ": " ^ msg, SOME n) structure SysCall = struct structure Thread = Primitive.MLton.Thread val blocker: (unit -> (unit -> unit)) ref = ref (fn () => (fn () => ())) (* ref (fn () => raise Fail "blocker not installed") *) val restartFlag = ref true val syscallErr: {clear: bool, restart: bool, errVal: ''a} * (unit -> {return: ''a C_Errno.t, post: ''a -> 'b, handlers: (syserror * (unit -> 'b)) list}) -> 'b = fn ({clear, restart, errVal}, f) => let fun call (err: {errno: syserror, handlers: (syserror * (unit -> 'b)) list} -> 'b): 'b = let val () = Thread.atomicBegin () val () = if clear then clearErrno () else () val {return, post, handlers} = f () handle exn => (Thread.atomicEnd (); raise exn) val return = C_Errno.check return in if errVal = return then (* Must getErrno () in the critical section. *) let val e = SysError.fromRep (getErrno ()) val () = Thread.atomicEnd () in err {errno = e, handlers = handlers} end else DynamicWind.wind (fn () => post return , Thread.atomicEnd) end fun err {default: unit -> 'b, errno: syserror, handlers: (syserror * (unit -> 'b)) list}: 'b = case List.find (fn (e',_) => errno = e') handlers of NONE => default () | SOME (_, handler) => handler () fun errBlocked {errno: syserror, handlers: (syserror * (unit -> 'b)) list}: 'b = err {default = fn () => raiseSys errno, errno = errno, handlers = handlers} fun errUnblocked {errno: syserror, handlers: (syserror * (unit -> 'b)) list}: 'b = err {default = fn () => if restart andalso errno = intr andalso !restartFlag then if Thread.atomicState () = 0w0 then call errUnblocked else let val finish = !blocker () in DynamicWind.wind (fn () => call errBlocked, finish) end else raiseSys errno, errno = errno, handlers = handlers} in call errUnblocked end local val simpleResultAux = fn ({restart, errVal}, f) => syscallErr ({clear = false, restart = restart, errVal = errVal}, fn () => let val return = f () in {return = return, post = fn ret => ret, handlers = []} end) in val simpleResultRestart = fn f => simpleResultAux ({restart = true, errVal = C_Int.fromInt ~1}, f) val simpleResult = fn f => simpleResultAux ({restart = false, errVal = C_Int.fromInt ~1}, f) val simpleResultRestart' = fn ({errVal}, f) => simpleResultAux ({restart = true, errVal = errVal}, f) val simpleResult' = fn ({errVal}, f) => simpleResultAux ({restart = false, errVal = errVal}, f) end val simpleRestart = ignore o simpleResultRestart val simple = ignore o simpleResult val simpleRestart' = fn ({errVal}, f) => ignore (simpleResultRestart' ({errVal = errVal}, f)) val simple' = fn ({errVal}, f) => ignore (simpleResult' ({errVal = errVal}, f)) val syscallRestart' = fn ({errVal}, f) => syscallErr ({clear = false, restart = true, errVal = errVal}, fn () => let val (return, post) = f () in {return = return, post = post, handlers = []} end) val syscall' = fn ({errVal}, f) => syscallErr ({clear = false, restart = false, errVal = errVal}, fn () => let val (return, post) = f () in {return = return, post = post, handlers = []} end) val syscallRestart = fn f => syscallRestart' ({errVal = C_Int.fromInt ~1}, f) val syscall = fn f => syscall' ({errVal = C_Int.fromInt ~1}, f) end end mlton-20100608/basis-library/posix/file-sys.sig0000644000076600000240000000717011404435632017732 0ustar mtfstaffsignature POSIX_FILE_SYS = sig eqtype uid eqtype gid eqtype file_desc val fdToWord: file_desc -> SysWord.word val wordToFD: SysWord.word -> file_desc (* identity functions *) val fdToIOD: file_desc -> OS.IO.iodesc val iodToFD: OS.IO.iodesc -> file_desc option type dirstream val opendir: string -> dirstream val readdir: dirstream -> string option val rewinddir: dirstream -> unit val closedir: dirstream -> unit val chdir: string -> unit val getcwd: unit -> string val stdin: file_desc val stdout: file_desc val stderr: file_desc structure S: sig eqtype mode include BIT_FLAGS where type flags = mode val irwxu: mode val irusr: mode val iwusr: mode val ixusr: mode val irwxg: mode val irgrp: mode val iwgrp: mode val ixgrp: mode val irwxo: mode val iroth: mode val iwoth: mode val ixoth: mode val isuid: mode val isgid: mode end structure O: sig include BIT_FLAGS val append: flags val excl: flags val noctty: flags val nonblock: flags val sync: flags val trunc: flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val openf: string * open_mode * O.flags -> file_desc val createf: string * open_mode * O.flags * S.mode -> file_desc val creat: string * S.mode -> file_desc val umask: S.mode -> S.mode val link: {old: string, new: string} -> unit val mkdir: string * S.mode -> unit val mkfifo: string * S.mode -> unit val unlink: string -> unit val rmdir: string -> unit val rename: {old: string, new: string} -> unit val symlink: {old: string, new: string} -> unit val readlink: string -> string eqtype dev val wordToDev: SysWord.word -> dev val devToWord: dev -> SysWord.word eqtype ino val wordToIno: SysWord.word -> ino val inoToWord: ino -> SysWord.word structure ST: sig type stat val isDir: stat -> bool val isChr: stat -> bool val isBlk: stat -> bool val isReg: stat -> bool val isFIFO: stat -> bool val isLink: stat -> bool val isSock: stat -> bool val mode: stat -> S.mode val ino: stat -> ino val dev: stat -> dev val nlink: stat -> int val uid: stat -> uid val gid: stat -> gid val size: stat -> Position.int val atime: stat -> Time.time val mtime: stat -> Time.time val ctime: stat -> Time.time end val stat: string -> ST.stat val lstat: string -> ST.stat val fstat: file_desc -> ST.stat datatype access_mode = A_READ | A_WRITE | A_EXEC val access: string * access_mode list -> bool val chmod: string * S.mode -> unit val fchmod: file_desc * S.mode -> unit val chown: string * uid * gid -> unit val fchown: file_desc * uid * gid -> unit val utime: string * {actime: Time.time, modtime: Time.time} option -> unit val ftruncate: file_desc * Position.int -> unit val pathconf: string * string -> SysWord.word option val fpathconf: file_desc * string -> SysWord.word option end signature POSIX_FILE_SYS_EXTRA = sig include POSIX_FILE_SYS val flagsToOpenMode: O.flags -> open_mode end mlton-20100608/basis-library/posix/file-sys.sml0000644000076600000240000003736311404435632017752 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PosixFileSys: POSIX_FILE_SYS_EXTRA = struct structure Prim = PrimitiveFFI.Posix.FileSys open Prim structure FileDesc = PrePosix.FileDesc structure GId = PrePosix.GId structure PId = PrePosix.PId structure Stat = Prim.Stat structure UId = PrePosix.UId structure Error = PosixError structure SysCall = Error.SysCall (* Patch to make Time look like it deals with C_Time.t * instead of LargeInt.int. *) structure Time = struct open Time val fromSeconds = fromSeconds o C_Time.toLargeInt fun toSeconds t = C_Time.fromLargeInt (Time.toSeconds t) handle Overflow => Error.raiseSys Error.inval end type file_desc = FileDesc.t type gid = GId.t type uid = UId.t val fdToWord = C_Fd.castToSysWord o FileDesc.toRep val wordToFD = FileDesc.fromRep o C_Fd.castFromSysWord val fdToIOD = PreOS.IODesc.fromRep o FileDesc.toRep val iodToFD = SOME o FileDesc.fromRep o PreOS.IODesc.toRep (*------------------------------------*) (* dirstream *) (*------------------------------------*) local structure Prim = Prim.Dirstream datatype dirstream = DS of C_DirP.t option ref fun get (DS r) = case !r of NONE => Error.raiseSys Error.badf | SOME d => d in type dirstream = dirstream fun opendir s = let val s = NullString.nullTerm s in SysCall.syscall' ({errVal = C_DirP.castFromSysWord 0w0}, fn () => (Prim.openDir s, fn d => DS (ref (SOME d)))) end fun readdir d = let val d = get d fun loop () = let val res = SysCall.syscallErr ({clear = true, restart = false, errVal = CUtil.C_Pointer.null}, fn () => {return = Prim.readDir d, post = fn cs => SOME cs, handlers = [(Error.cleared, fn () => NONE), (* MinGW sets errno to ENOENT when it * returns NULL. *) (Error.noent, fn () => NONE)]}) in case res of NONE => NONE | SOME cs => let val s = CUtil.C_String.toString cs in if s = "." orelse s = ".." then loop () else SOME s end end in loop () end fun rewinddir d = let val d = get d in Prim.rewindDir d end fun closedir (DS r) = case !r of NONE => () | SOME d => (SysCall.simple (fn () => Prim.closeDir d); r := NONE) end fun chdir s = SysCall.simple (fn () => Prim.chdir (NullString.nullTerm s)) local val size: int ref = ref 1 fun make () = Array.arrayUninit (!size) val buffer = ref (make ()) fun extractToChar (a, c) = let val n = Array.length a (* find the null terminator *) fun loop i = if i >= n then raise Fail "extractToChar didn't find terminator" else if c = Array.sub (a, i) then i else loop (i + 1) in ArraySlice.vector (ArraySlice.slice (a, 0, SOME (loop 0))) end fun extract a = extractToChar (a, #"\000") in fun getcwd () = let val res = SysCall.syscallErr ({clear = false, restart = false, errVal = CUtil.C_Pointer.null}, fn () => {return = Prim.getcwd (!buffer, C_Size.fromInt (!size)), post = fn _ => true, handlers = [(Error.range, fn _ => false)]}) in if res then extract (!buffer) else (size := 2 * !size ; buffer := make () ; getcwd ()) end end val stdin : file_desc = FileDesc.fromRep 0 val stdout : file_desc = FileDesc.fromRep 1 val stderr : file_desc = FileDesc.fromRep 2 structure S = struct structure Flags = BitFlags(structure S = C_Mode) open S Flags type mode = C_Mode.t val ifblk = IFBLK val ifchr = IFCHR val ifdir = IFDIR val ififo = IFIFO val iflnk = IFLNK val ifmt = IFMT val ifreg = IFREG val ifsock = IFSOCK val irgrp = IRGRP val iroth = IROTH val irusr = IRUSR val irwxg = IRWXG val irwxo = IRWXO val irwxu = IRWXU val isgid = ISGID val isuid = ISUID val isvtx = ISVTX val iwgrp = IWGRP val iwoth = IWOTH val iwusr = IWUSR val ixgrp = IXGRP val ixoth = IXOTH val ixusr = IXUSR end structure O = struct structure Flags = BitFlags(structure S = C_Int) open O Flags val append = APPEND val binary = BINARY val creat = CREAT val dsync = DSYNC val excl = EXCL val noctty = NOCTTY val nonblock = NONBLOCK val rdonly = RDONLY val rdwr = RDWR val rsync = RSYNC val sync = SYNC val text = TEXT val trunc = TRUNC val wronly = WRONLY end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR fun flagsToOpenMode f = if f = O.rdonly then O_RDONLY else if f = O.wronly then O_WRONLY else if f = O.rdwr then O_RDWR else raise Fail "flagsToOpenMode: unknown flag" val openModeToFlags = fn O_RDONLY => O.rdonly | O_WRONLY => O.wronly | O_RDWR => O.rdwr fun createf (pathname, openMode, flags, mode) = let val pathname = NullString.nullTerm pathname val flags = O.Flags.flags [openModeToFlags openMode, flags, O.creat] val flags = C_Int.castFromSysWord (O.Flags.toWord flags) val fd = SysCall.simpleResult (fn () => Prim.open3 (pathname, flags, mode)) in FileDesc.fromRep fd end fun openf (pathname, openMode, flags) = let val pathname = NullString.nullTerm pathname val flags = O.Flags.flags [openModeToFlags openMode, flags] val flags = C_Int.castFromSysWord (O.Flags.toWord flags) val fd = SysCall.simpleResult (fn () => Prim.open3 (pathname, flags, C_Mode.castFromSysWord 0wx0)) in FileDesc.fromRep fd end fun creat (s, m) = createf (s, O_WRONLY, O.trunc, m) val umask = Prim.umask local fun wrap p arg = (SysCall.simple (fn () => p arg); ()) fun wrapRestart p arg = (SysCall.simpleRestart (fn () => p arg); ()) fun wrapOldNew p = wrap (fn {old,new} => p (NullString.nullTerm old, NullString.nullTerm new)) in val link = wrapOldNew Prim.link val mkdir = wrap (fn (p, m) => Prim.mkdir (NullString.nullTerm p, m)) val mkfifo = wrap (fn (p, m) => Prim.mkfifo (NullString.nullTerm p, m)) val unlink = wrap (Prim.unlink o NullString.nullTerm) val rmdir = wrap (Prim.rmdir o NullString.nullTerm) val rename = wrapOldNew Prim.rename val symlink = wrapOldNew Prim.symlink val chmod = wrap (fn (p, m) => Prim.chmod (NullString.nullTerm p, m)) val fchmod = wrap (fn (fd, m) => Prim.fchmod (FileDesc.toRep fd, m)) val chown = wrap (fn (s, uid, gid) => Prim.chown (NullString.nullTerm s, UId.toRep uid, GId.toRep gid)) val fchown = wrap (fn (fd, uid, gid) => Prim.fchown (FileDesc.toRep fd, UId.toRep uid, GId.toRep gid)) val ftruncate = wrapRestart (fn (fd, n) => Prim.ftruncate (FileDesc.toRep fd, n)) end local val size: int = 1024 val buf : char array = Array.array (size, #"\000") in fun readlink (path: string): string = let val path = NullString.nullTerm path in SysCall.syscall' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => (Prim.readlink (path, buf, C_Size.fromInt size), fn len => ArraySlice.vector (ArraySlice.slice (buf, 0, SOME (C_SSize.toInt len))))) end end type dev = C_Dev.t val wordToDev = C_Dev.castFromSysWord val devToWord = C_Dev.castToSysWord type ino = C_INo.t val wordToIno = C_INo.castFromSysWord val inoToWord = C_INo.castToSysWord structure ST = struct datatype stat = T of {dev: dev, ino: ino, mode: S.mode, nlink: int, uid: uid, gid: gid, size: Position.int, atime: Time.time, mtime: Time.time, ctime: Time.time} fun fromC (): stat = T {dev = Stat.getDev (), ino = Stat.getINo (), mode = Stat.getMode (), nlink = C_NLink.toInt (Stat.getNLink ()), uid = UId.fromRep (Stat.getUId ()), gid = GId.fromRep (Stat.getGId ()), size = Stat.getSize (), atime = Time.fromSeconds (Stat.getATime ()), mtime = Time.fromSeconds (Stat.getMTime ()), ctime = Time.fromSeconds (Stat.getCTime ())} local fun make sel (T r) = sel r in val mode = make #mode val ino = make #ino val dev = make #dev val nlink = make #nlink val uid = make #uid val gid = make #gid val size = make #size val atime = make #atime val mtime = make #mtime val ctime = make #ctime end local fun make prim s = prim (mode s) <> C_Int.zero in val isDir = make Prim.ST.isDir val isChr = make Prim.ST.isChr val isBlk = make Prim.ST.isBlk val isReg = make Prim.ST.isReg val isFIFO = make Prim.ST.isFIFO val isLink = make Prim.ST.isLink val isSock = make Prim.ST.isSock end end local fun make prim arg = SysCall.syscall (fn () => (prim arg, fn _ => ST.fromC ())) in val stat = (make Prim.Stat.stat) o NullString.nullTerm val lstat = (make Prim.Stat.lstat) o NullString.nullTerm val fstat = (make Prim.Stat.fstat) o FileDesc.toRep end datatype access_mode = A_READ | A_WRITE | A_EXEC val conv_access_mode = fn A_READ => A.R_OK | A_WRITE => A.W_OK | A_EXEC => A.X_OK fun access (path: string, mode: access_mode list): bool = let val mode = List.foldl C_Int.orb 0 (A.F_OK :: (map conv_access_mode mode)) val path = NullString.nullTerm path in SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {return = Prim.access (path, mode), post = fn _ => true, handlers = [(Error.acces, fn () => false), (Error.loop, fn () => false), (Error.nametoolong, fn () => false), (Error.noent, fn () => false), (Error.notdir, fn () => false), (Error.rofs, fn () => false)]}) end local structure U = Prim.Utimbuf in fun utime (f: string, opt: {actime: Time.time, modtime: Time.time} option): unit = let val (a, m) = case opt of NONE => let val t = Time.now () in (t, t) end | SOME {actime = a, modtime = m} => (a, m) val a = Time.toSeconds a val m = Time.toSeconds m val f = NullString.nullTerm f in SysCall.syscallRestart (fn () => (U.setAcTime a ; U.setModTime m ; (U.utime f, fn _ => ()))) end end local local open Prim.PC infixr 5 ::? fun (n,s) ::? l = if n = C_Int.fromInt ~1 then l else (n,s) :: l in val properties = (TWO_SYMLINKS,"2_SYMLINKS") ::? (ALLOC_SIZE_MIN,"ALLOC_SIZE_MIN") ::? (ASYNC_IO,"ASYNC_IO") ::? (CHOWN_RESTRICTED,"CHOWN_RESTRICTED") ::? (FILESIZEBITS,"FILESIZEBITS") ::? (LINK_MAX,"LINK_MAX") ::? (MAX_CANON,"MAX_CANON") ::? (MAX_INPUT,"MAX_INPUT") ::? (NAME_MAX,"NAME_MAX") ::? (NO_TRUNC,"NO_TRUNC") ::? (PATH_MAX,"PATH_MAX") ::? (PIPE_BUF,"PIPE_BUF") ::? (PRIO_IO,"PRIO_IO") ::? (REC_INCR_XFER_SIZE,"REC_INCR_XFER_SIZE") ::? (REC_MAX_XFER_SIZE,"REC_MAX_XFER_SIZE") ::? (REC_MIN_XFER_SIZE,"REC_MIN_XFER_SIZE") ::? (REC_XFER_ALIGN,"REC_XFER_ALIGN") ::? (SYMLINK_MAX,"SYMLINK_MAX") ::? (SYNC_IO,"SYNC_IO") ::? (VDISABLE,"VDISABLE") ::? [] end fun convertProperty s = case List.find (fn (_, s') => s = s') properties of NONE => Error.raiseSys Error.inval | SOME (n, _) => n fun make prim (f, s) = SysCall.syscallErr ({clear = true, restart = false, errVal = C_Long.fromInt ~1}, fn () => {return = prim (f, convertProperty s), post = fn ret => SOME (SysWord.fromLargeInt (C_Long.toLarge ret)), handlers = [(Error.cleared, fn () => NONE)]}) in val pathconf = make (fn (path, s) => Prim.pathconf (NullString.nullTerm path, s)) val fpathconf = make (fn (fd, s) => Prim.fpathconf (FileDesc.toRep fd, s)) end end mlton-20100608/basis-library/posix/flags.sig0000644000076600000240000000127711404435632017275 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BIT_FLAGS = sig eqtype flags val all: flags val allSet: flags * flags -> bool val anySet: flags * flags -> bool val clear: flags * flags -> flags val flags: flags list -> flags val fromWord: SysWord.word -> flags val intersect: flags list -> flags val toWord: flags -> SysWord.word end signature BIT_FLAGS_EXTRA = sig include BIT_FLAGS val empty: flags end mlton-20100608/basis-library/posix/flags.sml0000644000076600000240000000214511404435632017301 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor BitFlags(structure S : sig eqtype t val castToSysWord: t -> SysWord.word val castFromSysWord: SysWord.word -> t val andb: t * t -> t val notb: t -> t val orb: t * t -> t end): BIT_FLAGS_EXTRA = struct type flags = S.t val all: flags = S.castFromSysWord (SysWord.~ 0w1) val empty: flags = S.castFromSysWord 0w0 fun toWord f = S.castToSysWord f fun fromWord w = S.castFromSysWord (SysWord.andb (w, toWord all)) val flags: flags list -> flags = List.foldl S.orb empty val intersect: flags list -> flags = List.foldl S.andb all fun clear (f, f') = S.andb (S.notb f, f') fun allSet (f, f') = S.andb (f, f') = f' fun anySet (f, f') = S.andb (f, f') <> empty end mlton-20100608/basis-library/posix/io.sig0000644000076600000240000000525111404435632016604 0ustar mtfstaffsignature POSIX_IO = sig eqtype file_desc eqtype pid val pipe: unit -> {infd: file_desc, outfd: file_desc} val dup: file_desc -> file_desc val dup2: {old: file_desc, new: file_desc} -> unit val close: file_desc -> unit val readVec: file_desc * int -> Word8Vector.vector val readArr: file_desc * Word8ArraySlice.slice -> int val writeVec: file_desc * Word8VectorSlice.slice -> int val writeArr: file_desc * Word8ArraySlice.slice -> int datatype whence = SEEK_SET | SEEK_CUR | SEEK_END structure FD: sig include BIT_FLAGS val cloexec: flags end structure O: sig include BIT_FLAGS val append: flags val nonblock: flags val sync: flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val dupfd: {old: file_desc, base: file_desc} -> file_desc val getfd: file_desc -> FD.flags val setfd: file_desc * FD.flags -> unit val getfl: file_desc -> O.flags * open_mode val setfl: file_desc * O.flags -> unit val lseek: file_desc * Position.int * whence -> Position.int val fsync: file_desc -> unit datatype lock_type = F_RDLCK | F_WRLCK | F_UNLCK structure FLock: sig type flock val flock: {ltype: lock_type, whence: whence, start: Position.int, len: Position.int, pid: pid option} -> flock val ltype: flock -> lock_type val whence: flock -> whence val start: flock -> Position.int val len: flock -> Position.int val pid: flock -> pid option end val getlk: file_desc * FLock.flock -> FLock.flock val setlk: file_desc * FLock.flock -> FLock.flock val setlkw: file_desc * FLock.flock -> FLock.flock val mkBinReader: {fd: file_desc, name: string, initBlkMode: bool} -> BinPrimIO.reader val mkTextReader: {fd: file_desc, name: string, initBlkMode: bool} -> TextPrimIO.reader val mkBinWriter: {fd: file_desc, name: string, appendMode: bool, initBlkMode: bool, chunkSize: int} -> BinPrimIO.writer val mkTextWriter: {fd: file_desc, name: string, appendMode: bool, initBlkMode: bool, chunkSize: int} -> TextPrimIO.writer end mlton-20100608/basis-library/posix/io.sml0000644000076600000240000003523511404435632016622 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PosixIO: POSIX_IO = struct structure Prim = PrimitiveFFI.Posix.IO open Prim structure FileDesc = PrePosix.FileDesc structure PId = PrePosix.PId structure Error = PosixError structure SysCall = Error.SysCall structure FS = PosixFileSys type file_desc = FileDesc.t type pid = PId.t local val a: C_Fd.t array = Array.array (2, C_Fd.fromInt 0) val get = fn i => FileDesc.fromRep (Array.sub (a, i)) in fun pipe () = SysCall.syscall (fn () => (Prim.pipe a, fn _ => {infd = get 0, outfd = get 1})) end fun dup fd = (FileDesc.fromRep o SysCall.simpleResult) (fn () => Prim.dup (FileDesc.toRep fd)) fun dup2 {new, old} = SysCall.simple (fn () => Prim.dup2 (FileDesc.toRep old, FileDesc.toRep new)) fun close fd = SysCall.simpleRestart (fn () => Prim.close (FileDesc.toRep fd)) structure FD = struct structure Flags = BitFlags(structure S = C_Int) open FD Flags val cloexec = CLOEXEC end structure O = PosixFileSys.O datatype open_mode = datatype PosixFileSys.open_mode fun dupfd {base, old} = (FileDesc.fromRep o SysCall.simpleResultRestart) (fn () => Prim.fcntl3 (FileDesc.toRep old, F_DUPFD, FileDesc.toRep base)) fun getfd fd = SysCall.simpleResultRestart (fn () => Prim.fcntl2 (FileDesc.toRep fd, F_GETFD)) fun setfd (fd, flags): unit = SysCall.simpleRestart (fn () => Prim.fcntl3 (FileDesc.toRep fd, F_SETFD, flags)) fun getfl fd : O.flags * open_mode = let val n = SysCall.simpleResultRestart (fn () => Prim.fcntl2 (FileDesc.toRep fd, F_GETFL)) val flags = C_Int.andb (n, C_Int.notb O_ACCMODE) val mode = C_Int.andb (n, O_ACCMODE) in (flags, PosixFileSys.flagsToOpenMode mode) end fun setfl (fd, flags: O.flags): unit = SysCall.simpleRestart (fn () => Prim.fcntl3 (FileDesc.toRep fd, F_SETFL, flags)) datatype whence = SEEK_SET | SEEK_CUR | SEEK_END val whenceToInt = fn SEEK_SET => Prim.SEEK_SET | SEEK_CUR => Prim.SEEK_CUR | SEEK_END => Prim.SEEK_END fun lseek (fd, n: Position.int, w: whence): Position.int = SysCall.simpleResult' ({errVal = C_Off.fromInt ~1}, fn () => Prim.lseek (FileDesc.toRep fd, n, whenceToInt w)) fun fsync fd : unit = SysCall.simple (fn () => Prim.fsync (FileDesc.toRep fd)) val whenceToInt = fn SEEK_SET => Prim.FLock.SEEK_SET | SEEK_CUR => Prim.FLock.SEEK_CUR | SEEK_END => Prim.FLock.SEEK_END fun intToWhence n = if n = Prim.FLock.SEEK_SET then SEEK_SET else if n = Prim.FLock.SEEK_CUR then SEEK_CUR else if n = Prim.FLock.SEEK_END then SEEK_END else raise Fail "Posix.IO.intToWhence" datatype lock_type = F_RDLCK | F_WRLCK | F_UNLCK val lockTypeToInt = fn F_RDLCK => Prim.FLock.F_RDLCK | F_WRLCK => Prim.FLock.F_WRLCK | F_UNLCK => Prim.FLock.F_UNLCK fun intToLockType n = if n = Prim.FLock.F_RDLCK then F_RDLCK else if n = Prim.FLock.F_WRLCK then F_WRLCK else if n = Prim.FLock.F_UNLCK then F_UNLCK else raise Fail "Posix.IO.intToLockType" structure FLock = struct open FLock type flock = {ltype: lock_type, whence: whence, start: Position.int, len: Position.int, pid: pid option} fun flock l = l val ltype: flock -> lock_type = #ltype val whence: flock -> whence = #whence val start: flock -> Position.int = #start val len: flock -> Position.int = #len val pid: flock -> pid option = #pid end local structure P = Prim.FLock fun make (cmd, usepid) (fd, {ltype, whence, start, len, ...}: FLock.flock) : FLock.flock = SysCall.syscallRestart (fn () => ((P.setType (lockTypeToInt ltype) ; P.setWhence (whenceToInt whence) ; P.setStart start ; P.setLen len ; P.fcntl (FileDesc.toRep fd, cmd)), fn _ => {ltype = intToLockType (P.getType ()), whence = intToWhence (P.getWhence ()), start = P.getStart (), len = P.getLen (), pid = if usepid then SOME (PId.fromRep (P.getPId ())) else NONE})) in val getlk = make (FLock.F_GETLK, true) val setlk = make (FLock.F_SETLK, false) val setlkw = make (FLock.F_SETLKW, false) end (* Adapted from SML/NJ sources. *) (* posix-bin-prim-io.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * * This implements the UNIX version of the OS specific binary primitive * IO structure. The Text IO version is implemented by a trivial translation * of these operations (see posix-text-prim-io.sml). * *) local val pos0 = Position.fromInt 0 fun isReg fd = FS.ST.isReg(FS.fstat fd) fun posFns (closed, fd) = if (isReg fd) then let val pos = ref pos0 fun getPos () = !pos fun setPos p = (if !closed then raise IO.ClosedStream else (); pos := lseek(fd,p,SEEK_SET)) fun endPos () = (if !closed then raise IO.ClosedStream else (); FS.ST.size(FS.fstat fd)) fun verifyPos () = let val curPos = lseek(fd, pos0, SEEK_CUR) in pos := curPos; curPos end val _ = verifyPos () in {pos = pos, getPos = SOME getPos, setPos = SOME setPos, endPos = SOME endPos, verifyPos = SOME verifyPos} end else {pos = ref pos0, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE} fun make {RD, WR, fromVector, readArr, setMode, toArraySlice, toVectorSlice, vectorLength, writeArr, writeVec} = let val primReadArr = fn (fd, buf, i, sz) => readArr (FileDesc.toRep fd, buf, C_Int.fromInt i, C_Size.fromInt sz) val primWriteArr = fn (fd, buf, i, sz) => writeArr (FileDesc.toRep fd, buf, C_Int.fromInt i, C_Size.fromInt sz) val primWriteVec = fn (fd, buf, i, sz) => writeVec (FileDesc.toRep fd, buf, C_Int.fromInt i, C_Size.fromInt sz) val setMode = fn fd => if let open Primitive.MLton.Platform.OS in case host of MinGW => true | _ => false end then setMode (FileDesc.toRep fd) else () fun readArr (fd, sl): int = let val (buf, i, sz) = ArraySlice.base (toArraySlice sl) val bytesRead = SysCall.simpleResultRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primReadArr (fd, buf, i, sz)) val bytesRead = C_SSize.toInt bytesRead in bytesRead end fun readVec (fd, n) = let val buf = Array.arrayUninit n val bytesRead = SysCall.simpleResultRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primReadArr (fd, buf, 0, n)) val bytesRead = C_SSize.toInt bytesRead in fromVector (if n = bytesRead then Vector.unsafeFromArray buf else ArraySlice.vector (ArraySlice.slice (buf, 0, SOME bytesRead))) end fun writeArr (fd, sl): int = let val (buf, i, sz) = ArraySlice.base (toArraySlice sl) val bytesWrote = SysCall.simpleResultRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primWriteArr (fd, buf, i, sz)) val bytesWrote = C_SSize.toInt bytesWrote in bytesWrote end fun writeVec (fd, sl): int = let val (buf, i, sz) = VectorSlice.base (toVectorSlice sl) val bytesWrote = SysCall.simpleResultRestart' ({errVal = C_SSize.castFromFixedInt ~1}, fn () => primWriteVec (fd, buf, i, sz)) val bytesWrote = C_SSize.toInt bytesWrote in bytesWrote end fun mkReader {fd, name, initBlkMode} = let val closed = ref false val {pos, getPos, setPos, endPos, verifyPos} = posFns (closed, fd) val blocking = ref initBlkMode fun blockingOn () = (setfl(fd, O.flags[]); blocking := true) fun blockingOff () = (setfl(fd, O.nonblock); blocking := false) fun ensureOpen () = if !closed then raise IO.ClosedStream else () fun incPos k = pos := Position.+ (!pos, Position.fromInt k) val readVec = fn n => let val v = readVec (fd, n) in incPos (vectorLength v); v end val readArr = fn x => let val k = readArr (fd, x) in incPos k; k end fun blockWrap f x = (ensureOpen (); if !blocking then () else blockingOn (); f x) fun noBlockWrap f x = (ensureOpen (); if !blocking then blockingOff () else (); (SOME (f x) handle (e as PosixError.SysErr (_, SOME cause)) => if cause = PosixError.again then NONE else raise e)) val close = fn () => if !closed then () else (closed := true; close fd) val avail = if isReg fd then fn () => if !closed then SOME 0 else SOME (Position.toInt (Position.- (FS.ST.size (FS.fstat fd), !pos))) else fn () => if !closed then SOME 0 else NONE val () = setMode fd in RD {avail = avail, block = NONE, canInput = NONE, chunkSize = Int32.toInt Primitive.Controls.bufSize, close = close, endPos = endPos, getPos = getPos, ioDesc = SOME (FS.fdToIOD fd), name = name, readArr = SOME (blockWrap readArr), readArrNB = SOME (noBlockWrap readArr), readVec = SOME (blockWrap readVec), readVecNB = SOME (noBlockWrap readVec), setPos = setPos, verifyPos = verifyPos} end fun mkWriter {fd, name, initBlkMode, appendMode, chunkSize} = let val closed = ref false val {pos, getPos, setPos, endPos, verifyPos} = posFns (closed, fd) fun incPos k = (pos := Position.+ (!pos, Position.fromInt k); k) val blocking = ref initBlkMode val appendFlgs = O.flags(if appendMode then [O.append] else []) fun updateStatus () = let val flgs = if !blocking then appendFlgs else O.flags [O.nonblock, appendFlgs] in setfl(fd, flgs) end fun ensureOpen () = if !closed then raise IO.ClosedStream else () fun ensureBlock x = if !blocking then () else (blocking := x; updateStatus ()) fun putV x = incPos (writeVec x) fun putA x = incPos (writeArr x) fun write (put, block) arg = (ensureOpen (); ensureBlock block; put (fd, arg)) fun handleBlock writer arg = SOME(writer arg) handle (e as PosixError.SysErr (_, SOME cause)) => if cause = PosixError.again then NONE else raise e val close = fn () => if !closed then () else (closed := true; close fd) val () = setMode fd in WR {block = NONE, canOutput = NONE, chunkSize = chunkSize, close = close, endPos = endPos, getPos = getPos, ioDesc = SOME (FS.fdToIOD fd), name = name, setPos = setPos, verifyPos = verifyPos, writeArr = SOME (write (putA, true)), writeArrNB = SOME (handleBlock (write (putA, false))), writeVec = SOME (write (putV, true)), writeVecNB = SOME (handleBlock (write (putV, false)))} end in {mkReader = mkReader, mkWriter = mkWriter, readArr = readArr, readVec = readVec, writeArr = writeArr, writeVec = writeVec} end in val {mkReader = mkBinReader, mkWriter = mkBinWriter, readArr, readVec, writeArr, writeVec} = make {RD = BinPrimIO.RD, WR = BinPrimIO.WR, fromVector = Word8Vector.fromPoly, readArr = readWord8, setMode = Prim.setbin, toArraySlice = Word8ArraySlice.toPoly, toVectorSlice = Word8VectorSlice.toPoly, vectorLength = Word8Vector.length, writeArr = writeWord8Arr, writeVec = writeWord8Vec} val {mkReader = mkTextReader, mkWriter = mkTextWriter, ...} = make {RD = TextPrimIO.RD, WR = TextPrimIO.WR, fromVector = fn v => v, readArr = readChar8, setMode = Prim.settext, toArraySlice = CharArraySlice.toPoly, toVectorSlice = CharVectorSlice.toPoly, vectorLength = CharVector.length, writeArr = writeChar8Arr, writeVec = writeChar8Vec} end end mlton-20100608/basis-library/posix/posix.sig0000644000076600000240000000257711404435632017347 0ustar mtfstaffsignature POSIX = sig structure Error: POSIX_ERROR structure FileSys: POSIX_FILE_SYS structure IO: POSIX_IO structure ProcEnv: POSIX_PROC_ENV structure Process: POSIX_PROCESS structure Signal: POSIX_SIGNAL structure SysDB: POSIX_SYS_DB structure TTY: POSIX_TTY sharing type FileSys.file_desc = ProcEnv.file_desc = IO.file_desc = TTY.file_desc sharing type ProcEnv.gid = FileSys.gid = SysDB.gid sharing type FileSys.open_mode = IO.open_mode sharing type Process.pid = ProcEnv.pid = IO.pid = TTY.pid sharing type Process.signal = Signal.signal sharing type ProcEnv.uid = FileSys.uid = SysDB.uid end signature POSIX_EXTRA = sig structure Error: POSIX_ERROR_EXTRA structure FileSys: POSIX_FILE_SYS_EXTRA structure IO: POSIX_IO structure ProcEnv: POSIX_PROC_ENV structure Process: POSIX_PROCESS_EXTRA structure Signal: POSIX_SIGNAL_EXTRA structure SysDB: POSIX_SYS_DB structure TTY: POSIX_TTY sharing type FileSys.file_desc = ProcEnv.file_desc = IO.file_desc = TTY.file_desc sharing type ProcEnv.gid = FileSys.gid = SysDB.gid sharing type FileSys.open_mode = IO.open_mode sharing type Process.pid = ProcEnv.pid = IO.pid = TTY.pid sharing type Process.signal = Signal.signal sharing type ProcEnv.uid = FileSys.uid = SysDB.uid end mlton-20100608/basis-library/posix/posix.sml0000644000076600000240000000111611404435632017344 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Posix: POSIX_EXTRA = struct structure Error = PosixError structure Signal = PosixSignal structure Process = PosixProcess structure ProcEnv = PosixProcEnv structure FileSys = PosixFileSys structure IO = PosixIO structure SysDB = PosixSysDB structure TTY = PosixTTY end mlton-20100608/basis-library/posix/pre-posix.sml0000644000076600000240000000106611404435632020134 0ustar mtfstaff(* Copyright (C) 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PrePosix = struct structure FileDesc = MkAbsRepEq(type rep = C_Fd.t) structure GId = MkAbsRepEq(type rep = C_GId.t) structure PId = MkAbsRepEq(type rep = C_PId.t) structure Signal = MkAbsRepEq(type rep = C_Signal.t) structure SysError = MkAbsRepEq(type rep = C_Int.t) structure UId = MkAbsRepEq(type rep = C_UId.t) end mlton-20100608/basis-library/posix/proc-env.sig0000644000076600000240000000235511404435632017730 0ustar mtfstaffsignature POSIX_PROC_ENV = sig eqtype pid eqtype uid eqtype gid eqtype file_desc val uidToWord: uid -> SysWord.word val wordToUid: SysWord.word -> uid val gidToWord: gid -> SysWord.word val wordToGid: SysWord.word -> gid val getpid : unit -> pid val getppid: unit -> pid val getuid : unit -> uid val geteuid: unit -> uid val getgid : unit -> gid val getegid: unit -> gid val setuid: uid -> unit val setgid: gid -> unit val getgroups: unit -> gid list val getlogin: unit -> string val getpgrp: unit -> pid val setsid: unit -> pid val setpgid: {pid: pid option, pgid: pid option} -> unit val uname: unit -> (string * string) list val time: unit -> Time.time val times: unit -> {elapsed: Time.time, utime: Time.time, stime: Time.time, cutime: Time.time, cstime: Time.time} val getenv: string -> string option val environ: unit -> string list val ctermid: unit -> string val ttyname: file_desc -> string val isatty: file_desc -> bool val sysconf: string -> SysWord.word end mlton-20100608/basis-library/posix/proc-env.sml0000644000076600000240000003076311404435632017745 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PosixProcEnv: POSIX_PROC_ENV = struct structure Prim = PrimitiveFFI.Posix.ProcEnv structure FileDesc = PrePosix.FileDesc structure GId = PrePosix.GId structure PId = PrePosix.PId structure UId = PrePosix.UId structure Error = PosixError structure SysCall = Error.SysCall structure CS = CUtil.C_String structure CSS = CUtil.C_StringArray type file_desc = FileDesc.t type gid = GId.t type pid = PId.t type uid = UId.t val uidToWord = C_UId.castToSysWord o UId.toRep val wordToUid = UId.fromRep o C_UId.castFromSysWord val gidToWord = C_GId.castToSysWord o GId.toRep val wordToGid = GId.fromRep o C_GId.castFromSysWord local open Prim in val getpgrp = PId.fromRep o getpgrp (* No error checking required *) val getegid = GId.fromRep o getegid (* No error checking required *) val geteuid = UId.fromRep o geteuid (* No error checking required *) val getgid = GId.fromRep o getgid (* No error checking required *) val getpid = PId.fromRep o getpid (* No error checking required *) val getppid = PId.fromRep o getppid (* No error checking required *) val getuid = UId.fromRep o getuid (* No error checking required *) val setgid = fn gid => let val gid = GId.toRep gid in SysCall.simple (fn () => setgid gid) end val setuid = fn uid => let val uid = UId.toRep uid in SysCall.simple (fn () => setuid uid) end end fun setsid () = (PId.fromRep o SysCall.simpleResult') ({errVal = C_PId.castFromFixedInt ~1}, Prim.setsid) fun getgroups () = SysCall.syscall (fn () => let val n = Prim.getgroupsN () val a: C_GId.t array = Array.arrayUninit (C_Int.toInt n) in (Prim.getgroups (n, a), fn n => (GId.listFromRep o ArraySlice.toList) (ArraySlice.slice (a, 0, SOME (C_Int.toInt n)))) end) fun getlogin () = SysCall.syscall' ({errVal = CUtil.C_Pointer.null}, fn () => (Prim.getlogin (), fn cs => CS.toString cs)) fun setpgid {pid, pgid} = let val pid = case pid of NONE => 0 | SOME pid => PId.toRep pid val pgid = case pgid of NONE => 0 | SOME pgid => PId.toRep pgid in SysCall.simple (fn () => Prim.setpgid (pid, pgid)) end fun uname () = SysCall.syscall (fn () => (Prim.uname (), fn _ => [("sysname", CS.toString (Prim.Uname.getSysName ())), ("nodename", CS.toString (Prim.Uname.getNodeName ())), ("release", CS.toString (Prim.Uname.getRelease ())), ("version", CS.toString (Prim.Uname.getVersion ())), ("machine", CS.toString (Prim.Uname.getMachine ()))])) val time = Time.now local local infixr 5 ::? fun (n,s) ::? l = if n = C_Int.fromInt ~1 then l else (n,s) :: l in val sysconfNames = (Prim.SC_2_CHAR_TERM,"2_CHAR_TERM") ::? (Prim.SC_2_C_BIND,"2_C_BIND") ::? (Prim.SC_2_C_DEV,"2_C_DEV") ::? (Prim.SC_2_FORT_DEV,"2_FORT_DEV") ::? (Prim.SC_2_FORT_RUN,"2_FORT_RUN") ::? (Prim.SC_2_LOCALEDEF,"2_LOCALEDEF") ::? (Prim.SC_2_PBS,"2_PBS") ::? (Prim.SC_2_PBS_ACCOUNTING,"2_PBS_ACCOUNTING") ::? (Prim.SC_2_PBS_CHECKPOINT,"2_PBS_CHECKPOINT") ::? (Prim.SC_2_PBS_LOCATE,"2_PBS_LOCATE") ::? (Prim.SC_2_PBS_MESSAGE,"2_PBS_MESSAGE") ::? (Prim.SC_2_PBS_TRACK,"2_PBS_TRACK") ::? (Prim.SC_2_SW_DEV,"2_SW_DEV") ::? (Prim.SC_2_UPE,"2_UPE") ::? (Prim.SC_2_VERSION,"2_VERSION") ::? (Prim.SC_ADVISORY_INFO,"ADVISORY_INFO") ::? (Prim.SC_AIO_LISTIO_MAX,"AIO_LISTIO_MAX") ::? (Prim.SC_AIO_MAX,"AIO_MAX") ::? (Prim.SC_AIO_PRIO_DELTA_MAX,"AIO_PRIO_DELTA_MAX") ::? (Prim.SC_ARG_MAX,"ARG_MAX") ::? (Prim.SC_ASYNCHRONOUS_IO,"ASYNCHRONOUS_IO") ::? (Prim.SC_ATEXIT_MAX,"ATEXIT_MAX") ::? (Prim.SC_BARRIERS,"BARRIERS") ::? (Prim.SC_BC_BASE_MAX,"BC_BASE_MAX") ::? (Prim.SC_BC_DIM_MAX,"BC_DIM_MAX") ::? (Prim.SC_BC_SCALE_MAX,"BC_SCALE_MAX") ::? (Prim.SC_BC_STRING_MAX,"BC_STRING_MAX") ::? (Prim.SC_CHILD_MAX,"CHILD_MAX") ::? (Prim.SC_CLK_TCK,"CLK_TCK") ::? (Prim.SC_CLOCK_SELECTION,"CLOCK_SELECTION") ::? (Prim.SC_COLL_WEIGHTS_MAX,"COLL_WEIGHTS_MAX") ::? (Prim.SC_CPUTIME,"CPUTIME") ::? (Prim.SC_DELAYTIMER_MAX,"DELAYTIMER_MAX") ::? (Prim.SC_EXPR_NEST_MAX,"EXPR_NEST_MAX") ::? (Prim.SC_FSYNC,"FSYNC") ::? (Prim.SC_GETGR_R_SIZE_MAX,"GETGR_R_SIZE_MAX") ::? (Prim.SC_GETPW_R_SIZE_MAX,"GETPW_R_SIZE_MAX") ::? (Prim.SC_HOST_NAME_MAX,"HOST_NAME_MAX") ::? (Prim.SC_IOV_MAX,"IOV_MAX") ::? (Prim.SC_IPV6,"IPV6") ::? (Prim.SC_JOB_CONTROL,"JOB_CONTROL") ::? (Prim.SC_LINE_MAX,"LINE_MAX") ::? (Prim.SC_LOGIN_NAME_MAX,"LOGIN_NAME_MAX") ::? (Prim.SC_MAPPED_FILES,"MAPPED_FILES") ::? (Prim.SC_MEMLOCK,"MEMLOCK") ::? (Prim.SC_MEMLOCK_RANGE,"MEMLOCK_RANGE") ::? (Prim.SC_MEMORY_PROTECTION,"MEMORY_PROTECTION") ::? (Prim.SC_MESSAGE_PASSING,"MESSAGE_PASSING") ::? (Prim.SC_MONOTONIC_CLOCK,"MONOTONIC_CLOCK") ::? (Prim.SC_MQ_OPEN_MAX,"MQ_OPEN_MAX") ::? (Prim.SC_MQ_PRIO_MAX,"MQ_PRIO_MAX") ::? (Prim.SC_NGROUPS_MAX,"NGROUPS_MAX") ::? (Prim.SC_OPEN_MAX,"OPEN_MAX") ::? (Prim.SC_PAGESIZE,"PAGESIZE") ::? (Prim.SC_PAGE_SIZE,"PAGE_SIZE") ::? (Prim.SC_PRIORITIZED_IO,"PRIORITIZED_IO") ::? (Prim.SC_PRIORITY_SCHEDULING,"PRIORITY_SCHEDULING") ::? (Prim.SC_RAW_SOCKETS,"RAW_SOCKETS") ::? (Prim.SC_READER_WRITER_LOCKS,"READER_WRITER_LOCKS") ::? (Prim.SC_REALTIME_SIGNALS,"REALTIME_SIGNALS") ::? (Prim.SC_REGEXP,"REGEXP") ::? (Prim.SC_RE_DUP_MAX,"RE_DUP_MAX") ::? (Prim.SC_RTSIG_MAX,"RTSIG_MAX") ::? (Prim.SC_SAVED_IDS,"SAVED_IDS") ::? (Prim.SC_SEMAPHORES,"SEMAPHORES") ::? (Prim.SC_SEM_NSEMS_MAX,"SEM_NSEMS_MAX") ::? (Prim.SC_SEM_VALUE_MAX,"SEM_VALUE_MAX") ::? (Prim.SC_SHARED_MEMORY_OBJECTS,"SHARED_MEMORY_OBJECTS") ::? (Prim.SC_SHELL,"SHELL") ::? (Prim.SC_SIGQUEUE_MAX,"SIGQUEUE_MAX") ::? (Prim.SC_SPAWN,"SPAWN") ::? (Prim.SC_SPIN_LOCKS,"SPIN_LOCKS") ::? (Prim.SC_SPORADIC_SERVER,"SPORADIC_SERVER") ::? (Prim.SC_SS_REPL_MAX,"SS_REPL_MAX") ::? (Prim.SC_STREAM_MAX,"STREAM_MAX") ::? (Prim.SC_SYMLOOP_MAX,"SYMLOOP_MAX") ::? (Prim.SC_SYNCHRONIZED_IO,"SYNCHRONIZED_IO") ::? (Prim.SC_THREADS,"THREADS") ::? (Prim.SC_THREAD_ATTR_STACKADDR,"THREAD_ATTR_STACKADDR") ::? (Prim.SC_THREAD_ATTR_STACKSIZE,"THREAD_ATTR_STACKSIZE") ::? (Prim.SC_THREAD_CPUTIME,"THREAD_CPUTIME") ::? (Prim.SC_THREAD_DESTRUCTOR_ITERATIONS,"THREAD_DESTRUCTOR_ITERATIONS") ::? (Prim.SC_THREAD_KEYS_MAX,"THREAD_KEYS_MAX") ::? (Prim.SC_THREAD_PRIORITY_SCHEDULING,"THREAD_PRIORITY_SCHEDULING") ::? (Prim.SC_THREAD_PRIO_INHERIT,"THREAD_PRIO_INHERIT") ::? (Prim.SC_THREAD_PRIO_PROTECT,"THREAD_PRIO_PROTECT") ::? (Prim.SC_THREAD_PROCESS_SHARED,"THREAD_PROCESS_SHARED") ::? (Prim.SC_THREAD_SAFE_FUNCTIONS,"THREAD_SAFE_FUNCTIONS") ::? (Prim.SC_THREAD_SPORADIC_SERVER,"THREAD_SPORADIC_SERVER") ::? (Prim.SC_THREAD_STACK_MIN,"THREAD_STACK_MIN") ::? (Prim.SC_THREAD_THREADS_MAX,"THREAD_THREADS_MAX") ::? (Prim.SC_TIMEOUTS,"TIMEOUTS") ::? (Prim.SC_TIMERS,"TIMERS") ::? (Prim.SC_TIMER_MAX,"TIMER_MAX") ::? (Prim.SC_TRACE,"TRACE") ::? (Prim.SC_TRACE_EVENT_FILTER,"TRACE_EVENT_FILTER") ::? (Prim.SC_TRACE_EVENT_NAME_MAX,"TRACE_EVENT_NAME_MAX") ::? (Prim.SC_TRACE_INHERIT,"TRACE_INHERIT") ::? (Prim.SC_TRACE_LOG,"TRACE_LOG") ::? (Prim.SC_TRACE_NAME_MAX,"TRACE_NAME_MAX") ::? (Prim.SC_TRACE_SYS_MAX,"TRACE_SYS_MAX") ::? (Prim.SC_TRACE_USER_EVENT_MAX,"TRACE_USER_EVENT_MAX") ::? (Prim.SC_TTY_NAME_MAX,"TTY_NAME_MAX") ::? (Prim.SC_TYPED_MEMORY_OBJECTS,"TYPED_MEMORY_OBJECTS") ::? (Prim.SC_TZNAME_MAX,"TZNAME_MAX") ::? (Prim.SC_V6_ILP32_OFF32,"V6_ILP32_OFF32") ::? (Prim.SC_V6_ILP32_OFFBIG,"V6_ILP32_OFFBIG") ::? (Prim.SC_V6_LP64_OFF64,"V6_LP64_OFF64") ::? (Prim.SC_V6_LPBIG_OFFBIG,"V6_LPBIG_OFFBIG") ::? (Prim.SC_VERSION,"VERSION") ::? (Prim.SC_XBS5_ILP32_OFF32,"XBS5_ILP32_OFF32") ::? (Prim.SC_XBS5_ILP32_OFFBIG,"XBS5_ILP32_OFFBIG") ::? (Prim.SC_XBS5_LP64_OFF64,"XBS5_LP64_OFF64") ::? (Prim.SC_XBS5_LPBIG_OFFBIG,"XBS5_LPBIG_OFFBIG") ::? (Prim.SC_XOPEN_CRYPT,"XOPEN_CRYPT") ::? (Prim.SC_XOPEN_ENH_I18N,"XOPEN_ENH_I18N") ::? (Prim.SC_XOPEN_LEGACY,"XOPEN_LEGACY") ::? (Prim.SC_XOPEN_REALTIME,"XOPEN_REALTIME") ::? (Prim.SC_XOPEN_REALTIME_THREADS,"XOPEN_REALTIME_THREADS") ::? (Prim.SC_XOPEN_SHM,"XOPEN_SHM") ::? (Prim.SC_XOPEN_STREAMS,"XOPEN_STREAMS") ::? (Prim.SC_XOPEN_UNIX,"XOPEN_UNIX") ::? (Prim.SC_XOPEN_VERSION,"XOPEN_VERSION") ::? [] end in fun sysconf s = case List.find (fn (_, s') => s = s') sysconfNames of NONE => Error.raiseSys Error.inval | SOME (n, _) => (SysWord.fromLargeInt o C_Long.toLarge o SysCall.simpleResult') ({errVal = C_Long.fromInt ~1}, fn () => Prim.sysconf n) end local structure Times = Prim.Times val clocksPerSec = (* syconf is not implemented on MinGW; * we don't want a SysErr during Basis Library initialization. *) if (let open Primitive.MLton.Platform.OS in host = MinGW end) then LargeInt.zero else SysWord.toLargeIntX (sysconf "CLK_TCK") fun cvt (clocks: C_Clock.t) = Time.fromTicks (LargeInt.quot (LargeInt.* (C_Clock.toLargeInt clocks, Time.ticksPerSecond), clocksPerSec)) in fun times () = SysCall.syscall' ({errVal = C_Clock.castFromFixedInt ~1}, fn () => (Prim.times (), fn elapsed => {elapsed = cvt elapsed, utime = cvt (Times.getUTime ()), stime = cvt (Times.getSTime ()), cutime = cvt (Times.getCUTime ()), cstime = cvt (Times.getCSTime ())})) end fun environ () = CSS.toList (Prim.environGet ()) fun getenv name = let val cs = Prim.getenv (NullString.nullTerm name) in if CUtil.C_Pointer.isNull cs then NONE else SOME (CS.toString cs) end fun ctermid () = CS.toString (Prim.ctermid ()) fun isatty fd = (Prim.isatty (FileDesc.toRep fd)) <> C_Int.zero fun ttyname fd = SysCall.syscall' ({errVal = CUtil.C_Pointer.null}, fn () => (Prim.ttyname (FileDesc.toRep fd), fn cs => CS.toString cs)) end mlton-20100608/basis-library/posix/process.sig0000644000076600000240000000254711404435632017660 0ustar mtfstaffsignature POSIX_PROCESS = sig eqtype signal eqtype pid structure W: sig include BIT_FLAGS val untraced: flags end datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal datatype killpid_arg = K_PROC of pid | K_SAME_GROUP | K_GROUP of pid datatype waitpid_arg = W_ANY_CHILD | W_CHILD of pid | W_SAME_GROUP | W_GROUP of pid val alarm: Time.time -> Time.time val exec: string * string list -> 'a val exece: string * string list * string list -> 'a val execp: string * string list -> 'a val exit: Word8.word -> 'a val fork: unit -> pid option val fromStatus: OS.Process.status -> exit_status val kill: killpid_arg * signal -> unit val pause: unit -> unit val pidToWord: pid -> SysWord.word val sleep: Time.time -> Time.time val wait: unit -> pid * exit_status val waitpid: waitpid_arg * W.flags list -> pid * exit_status val waitpid_nh: waitpid_arg * W.flags list -> (pid * exit_status) option val wordToPid: SysWord.word -> pid end signature POSIX_PROCESS_EXTRA = sig include POSIX_PROCESS val fromStatus': C_Status.t -> exit_status end mlton-20100608/basis-library/posix/process.sml0000644000076600000240000001507311404435632017667 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PosixProcess: POSIX_PROCESS_EXTRA = struct structure Prim = PrimitiveFFI.Posix.Process open Prim structure FileDesc = PrePosix.FileDesc structure PId = PrePosix.PId structure Signal = PrePosix.Signal structure Error = PosixError structure SysCall = Error.SysCall type signal = Signal.t type pid = PId.t val pidToWord = C_PId.castToSysWord o PId.toRep val wordToPid = PId.fromRep o C_PId.castFromSysWord fun fork () = SysCall.syscall' ({errVal = C_PId.castFromFixedInt ~1}, fn () => (Prim.fork (), fn p => if p = C_PId.castFromFixedInt 0 then NONE else SOME (PId.fromRep p))) val fork = if Primitive.MLton.Platform.OS.forkIsEnabled then fork else fn () => Error.raiseSys Error.nosys val conv = NullString.nullTerm val convs = CUtil.C_StringArray.fromList fun exece (path, args, env): 'a = let val path = conv path val args = convs args val env = convs env in (SysCall.simple (fn () => Prim.exece (path, args, env)) ; raise Fail "Posix.Process.exece") end fun exec (path, args): 'a = exece (path, args, PosixProcEnv.environ ()) fun execp (file, args): 'a = let val file = conv file val args = convs args in (SysCall.simple (fn () => Prim.execp (file, args)) ; raise Fail "Posix.Process.execp") end datatype waitpid_arg = W_ANY_CHILD | W_CHILD of pid | W_SAME_GROUP | W_GROUP of pid datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal fun fromStatus' (status : C_Status.t) = if Prim.ifExited status <> C_Int.zero then (case Prim.exitStatus status of 0 => W_EXITED | n => W_EXITSTATUS (Word8.castFromSysWord (C_Int.castToSysWord n))) else if Prim.ifSignaled status <> C_Int.zero then W_SIGNALED (PosixSignal.fromRep (Prim.termSig status)) else if Prim.ifStopped status <> C_Int.zero then W_STOPPED (PosixSignal.fromRep (Prim.stopSig status)) else raise Fail "Posix.Process.fromStatus" fun fromStatus status = fromStatus' (PreOS.Status.toRep status) structure W = struct structure Flags = BitFlags(structure S = C_Int) open W Flags (* val continued = CONTINUED *) val nohang = NOHANG val untraced = UNTRACED end local val status: C_Status.t ref = ref (C_Status.fromInt 0) fun wait (wa, status, flags) = let val pid = case wa of W_ANY_CHILD => C_PId.castFromFixedInt ~1 | W_CHILD pid => PId.toRep pid | W_SAME_GROUP => C_PId.castFromFixedInt 0 | W_GROUP pid => C_PId.~ (PId.toRep pid) val flags = W.flags flags in (PId.fromRep o SysCall.simpleResultRestart') ({errVal = C_PId.castFromFixedInt ~1}, fn () => let val pid = Prim.waitpid (pid, status, flags) in pid end) end fun getStatus () = fromStatus' (!status) in fun waitpid (wa, flags) = let val pid = wait (wa, status, flags) in (pid, getStatus ()) end fun waitpid_nh (wa, flags) = let val pid = wait (wa, status, W.nohang :: flags) in if PId.fromRep (C_PId.castFromFixedInt 0) = pid then NONE else SOME (pid, getStatus ()) end end fun wait () = waitpid (W_ANY_CHILD, []) fun exit (w: Word8.word): 'a = (* Posix.Process.exit does not call atExit cleaners, as per the basis * library spec. *) (Prim.exit (C_Status.castFromSysWord (Word8.castToSysWord w)) ; raise Fail "Posix.Process.exit") datatype killpid_arg = K_PROC of pid | K_SAME_GROUP | K_GROUP of pid fun kill (ka: killpid_arg, s: signal): unit = let val pid = case ka of K_PROC pid => PId.toRep pid | K_SAME_GROUP => C_PId.castFromFixedInt ~1 | K_GROUP pid => C_PId.~ (PId.toRep pid) val s = PosixSignal.toRep s in SysCall.simple (fn () => Prim.kill (pid, s)) end local fun wrap prim (t: Time.time): Time.time = Time.fromSeconds (C_UInt.toLargeInt (prim ((C_UInt.fromLargeInt (Time.toSeconds t)) handle Overflow => Error.raiseSys Error.inval))) in val alarm = wrap Prim.alarm (* val sleep = wrap Prim.sleep *) end fun sleep (t: Time.time): Time.time = let val t = Time.toNanoseconds t val sec = LargeInt.quot (t, 1000000000) val nsec = LargeInt.rem (t, 1000000000) val (sec, nsec) = (C_Time.fromLargeInt sec, C_Long.fromLargeInt nsec) handle Overflow => Error.raiseSys Error.inval val secRem = ref sec val nsecRem = ref nsec fun remaining _ = Time.+ (Time.fromSeconds (C_Time.toLargeInt (!secRem)), Time.fromNanoseconds (C_Long.toLargeInt (!nsecRem))) in SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {handlers = [(Error.intr, remaining)], post = remaining, return = Prim.nanosleep (secRem, nsecRem)}) end (* FIXME: pause *) fun pause () = SysCall.syscallErr ({clear = false, restart = false, errVal = C_Int.fromInt ~1}, fn () => {return = Prim.pause (), post = fn _ => (), handlers = [(Error.intr, fn () => ())]}) end mlton-20100608/basis-library/posix/signal.sig0000644000076600000240000000164511404435632017455 0ustar mtfstaffsignature POSIX_SIGNAL = sig eqtype signal val toWord: signal -> SysWord.word val fromWord: SysWord.word -> signal val abrt: signal val alrm: signal val bus: signal val fpe: signal val hup: signal val ill: signal val int: signal val kill: signal val pipe: signal val quit: signal val segv: signal val term: signal val usr1: signal val usr2: signal val chld: signal val cont: signal val stop: signal val tstp: signal val ttin: signal val ttou: signal end signature POSIX_SIGNAL_EXTRA = sig include POSIX_SIGNAL val prof: signal val vtalrm: signal val fromRep: C_Int.t -> signal val toRep: signal -> C_Int.t val repFromInt: int -> C_Int.t val repToInt: C_Int.t -> int val fromInt: int -> signal val toInt: signal -> int end mlton-20100608/basis-library/posix/signal.sml0000644000076600000240000000360211404435632017461 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PosixSignal: POSIX_SIGNAL_EXTRA = struct open PrimitiveFFI.Posix.Signal structure Signal = PrePosix.Signal type signal = Signal.t val abrt = Signal.fromRep SIGABRT val alrm = Signal.fromRep SIGALRM val bus = Signal.fromRep SIGBUS val chld = Signal.fromRep SIGCHLD val cont = Signal.fromRep SIGCONT val fpe = Signal.fromRep SIGFPE val hup = Signal.fromRep SIGHUP val ill = Signal.fromRep SIGILL val int = Signal.fromRep SIGINT val kill = Signal.fromRep SIGKILL val pipe = Signal.fromRep SIGPIPE val poll = Signal.fromRep SIGPOLL val prof = Signal.fromRep SIGPROF val quit = Signal.fromRep SIGQUIT val segv = Signal.fromRep SIGSEGV val stop = Signal.fromRep SIGSTOP val sys = Signal.fromRep SIGSYS val term = Signal.fromRep SIGTERM val trap = Signal.fromRep SIGTRAP val tstp = Signal.fromRep SIGTSTP val ttin = Signal.fromRep SIGTTIN val ttou = Signal.fromRep SIGTTOU val urg = Signal.fromRep SIGURG val usr1 = Signal.fromRep SIGUSR1 val usr2 = Signal.fromRep SIGUSR2 val vtalrm = Signal.fromRep SIGVTALRM val xcpu = Signal.fromRep SIGXCPU val xfsz = Signal.fromRep SIGXFSZ val fromRep = Signal.fromRep val toRep = Signal.toRep val repToInt = C_Int.toInt val repFromInt = C_Int.fromInt val toInt = repToInt o toRep val fromInt = fromRep o repFromInt val repToWord = C_Int.castToSysWord val repFromWord = C_Int.castFromSysWord val toWord = repToWord o toRep val fromWord = fromRep o repFromWord end mlton-20100608/basis-library/posix/stub-mingw.sml0000644000076600000240000001166311404435632020306 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Stub out functions that are not implemented on MinGW. *) local structure Error = PosixError val stub: string * ('a -> 'b) -> ('a -> 'b) = fn (msg, f) => if let open Primitive.MLton.Platform.OS in MinGW = host end then fn _ => (if true then () else (PrimitiveFFI.Stdio.print msg ; PrimitiveFFI.Stdio.print "\n") ; Error.raiseSysWithMsg (Error.nosys, msg)) else f in structure PrimitiveFFI = struct open PrimitiveFFI structure OS = struct open OS structure IO = struct open IO val poll = stub ("poll", poll) end end structure Posix = struct open Posix structure FileSys = struct open FileSys val chown = stub ("chown", chown) val fchown = stub ("fchown", fchown) val fpathconf = stub ("fpathconf", fpathconf) val link = stub ("link", link) val mkfifo = stub ("mkfifo", mkfifo) val pathconf = stub ("pathconf", pathconf) val readlink = stub ("readlink", readlink) val symlink = stub ("symlink", symlink) end structure IO = struct open IO val fcntl2 = stub ("fcntl2", fcntl2) val fcntl3 = stub ("fcntl3", fcntl3) end structure ProcEnv = struct open ProcEnv val ctermid = stub ("ctermid", ctermid) val getegid = stub ("getegid", getegid) val geteuid = stub ("geteuid", geteuid) val getgid = stub ("getgid", getgid) val getgroups = stub ("getgroups", getgroups) val getlogin = stub ("getlogin", getlogin) val getpgrp = stub ("getpgrp", getpgrp) val getppid = stub ("getppid", getppid) val getuid = stub ("getuid", getuid) val setgid = stub ("setgid", setgid) val setgroups = stub ("stegroups", setgroups) val setpgid = stub ("setpgid", setpgid) val setsid = stub ("setsid", setsid) val setuid = stub ("setuid", setuid) val sysconf = stub ("sysconf", sysconf) val times = stub ("times", times) val ttyname = stub ("ttyname", ttyname) end structure Process = struct open Process val exece = stub ("exece", exece) val execp = stub ("execp", execp) val fork = stub ("fork", fork) val pause = stub ("pause", pause) val waitpid = fn (args as (pid, _, _)) => if C_PId.<= (pid, 0) then stub ("waitpid", waitpid) args else waitpid args end structure SysDB = struct open SysDB val getgrgid = stub ("getgrgid", getgrgid) val getgrnam = stub ("getgrnam", getgrnam) val getpwuid = stub ("getpwuid", getpwuid) end structure TTY = struct open TTY structure TC = struct open TC val drain = stub ("drain", drain) val flow = stub ("flow", flow) val flush = stub ("flush", flush) val getattr = stub ("getattr", getattr) val getpgrp = stub ("getpgrp", getpgrp) val sendbreak = stub ("sendbreak", sendbreak) val setattr = stub ("setattr", setattr) val setpgrp = stub ("setpgrp", setpgrp) end end end structure Socket = struct open Socket structure UnixSock = struct open UnixSock val toAddr = stub ("toAddr", toAddr) val fromAddr = stub ("fromAddr", fromAddr) end end end end mlton-20100608/basis-library/posix/sys-db.sig0000644000076600000240000000130111404435632017366 0ustar mtfstaffsignature POSIX_SYS_DB = sig eqtype uid eqtype gid structure Passwd: sig type passwd val name: passwd -> string val uid: passwd -> uid val gid: passwd -> gid val home: passwd -> string val shell: passwd -> string end structure Group: sig type group val name: group -> string val gid: group -> gid val members: group -> string list end val getgrgid: gid -> Group.group val getgrnam: string -> Group.group val getpwuid: uid -> Passwd.passwd val getpwnam: string -> Passwd.passwd end mlton-20100608/basis-library/posix/sys-db.sml0000644000076600000240000000743011404435632017410 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PosixSysDB: POSIX_SYS_DB = struct structure Prim = PrimitiveFFI.Posix.SysDB structure GId = PrePosix.GId structure UId = PrePosix.UId structure Error = PosixError structure SysCall = Error.SysCall type gid = GId.t type uid = UId.t structure Passwd = struct type passwd = {name: string, uid: uid, gid: gid, home: string, shell: string} structure Passwd = Prim.Passwd fun fromC (f: unit -> C_Int.t C_Errno.t, fname, fitem): passwd = SysCall.syscallErr ({clear = true, restart = false, errVal = C_Int.zero}, fn () => {return = f (), post = fn _ => {name = CUtil.C_String.toString (Passwd.getName ()), uid = UId.fromRep (Passwd.getUId ()), gid = GId.fromRep (Passwd.getGId ()), home = CUtil.C_String.toString (Passwd.getDir ()), shell = CUtil.C_String.toString (Passwd.getShell ())}, handlers = [(Error.cleared, fn () => raise Error.SysErr (concat ["Posix.SysDB.", fname, ": no group with ", fitem], NONE))]}) val name: passwd -> string = #name val uid: passwd -> uid = #uid val gid: passwd -> gid = #gid val home: passwd -> string = #home val shell: passwd -> string = #shell end fun getpwnam name = let val name = NullString.nullTerm name in Passwd.fromC (fn () => Prim.getpwnam name, "getpwnam", "name") end fun getpwuid uid = let val uid = UId.toRep uid in Passwd.fromC (fn () => Prim.getpwuid uid, "getpwuid", "user id") end structure Group = struct type group = {name: string, gid: gid, members: string list} structure Group = Prim.Group fun fromC (f: unit -> C_Int.t C_Errno.t, fname, fitem): group = SysCall.syscallErr ({clear = true, restart = false, errVal = C_Int.zero}, fn () => {return = f (), post = fn _ => {name = CUtil.C_String.toString (Group.getName ()), gid = GId.fromRep (Group.getGId ()), members = CUtil.C_StringArray.toList (Group.getMem ())}, handlers = [(Error.cleared, fn () => raise Error.SysErr (concat ["Posix.SysDB.", fname, ": no group with ", fitem], NONE))]}) val name: group -> string = #name val gid: group -> gid = #gid val members: group -> string list = #members end fun getgrnam name = let val name = NullString.nullTerm name in Group.fromC (fn () => Prim.getgrnam name, "getgrnam", "name") end fun getgrgid gid = let val gid = GId.toRep gid in Group.fromC (fn () => Prim.getgrgid gid, "getgrgid", "group id") end end mlton-20100608/basis-library/posix/tty.sig0000644000076600000240000001040011404435632017005 0ustar mtfstaffsignature POSIX_TTY = sig eqtype pid eqtype file_desc structure V: sig val eof: int val eol: int val erase: int val intr: int val kill: int val min: int val quit: int val susp: int val time: int val start: int val stop: int val nccs: int type cc val cc: (int * char) list -> cc val update: cc * (int * char) list -> cc val sub: cc * int -> char end structure I: sig include BIT_FLAGS val brkint: flags val icrnl: flags val ignbrk: flags val igncr: flags val ignpar: flags val inlcr: flags val inpck: flags val istrip: flags val ixoff: flags val ixon: flags val parmrk: flags end structure O: sig include BIT_FLAGS val opost: flags end structure C: sig include BIT_FLAGS val clocal: flags val cread: flags val cs5: flags val cs6: flags val cs7: flags val cs8: flags val csize: flags val cstopb: flags val hupcl: flags val parenb: flags val parodd: flags end structure L: sig include BIT_FLAGS val echo: flags val echoe: flags val echok: flags val echonl: flags val icanon: flags val iexten: flags val isig: flags val noflsh: flags val tostop: flags end eqtype speed val compareSpeed: speed * speed -> order val speedToWord: speed -> SysWord.word val wordToSpeed: SysWord.word -> speed val b0: speed val b50: speed val b75: speed val b110: speed val b134: speed val b150: speed val b200: speed val b300: speed val b600: speed val b1200: speed val b1800: speed val b2400: speed val b4800: speed val b9600: speed val b19200: speed val b38400: speed type termios val termios: {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} -> termios val fieldsOf: termios -> {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} val getiflag: termios -> I.flags val getoflag: termios -> O.flags val getcflag: termios -> C.flags val getlflag: termios -> L.flags val getcc: termios -> V.cc structure CF: sig val getospeed: termios -> speed val setospeed: termios * speed -> termios val getispeed: termios -> speed val setispeed: termios * speed -> termios end structure TC: sig eqtype set_action val sanow: set_action val sadrain: set_action val saflush: set_action eqtype flow_action val ooff: flow_action val oon: flow_action val ioff: flow_action val ion: flow_action eqtype queue_sel val iflush: queue_sel val oflush: queue_sel val ioflush: queue_sel val getattr: file_desc -> termios val setattr: file_desc * set_action * termios -> unit val sendbreak: file_desc * int -> unit val drain: file_desc -> unit val flush: file_desc * queue_sel -> unit val flow: file_desc * flow_action -> unit val getpgrp: file_desc -> pid val setpgrp: file_desc * pid -> unit end end mlton-20100608/basis-library/posix/tty.sml0000644000076600000240000002066011404435632017027 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PosixTTY: POSIX_TTY = struct structure Prim = PrimitiveFFI.Posix.TTY open Prim structure FileDesc = PrePosix.FileDesc structure PId = PrePosix.PId structure Error = PosixError structure SysCall = Error.SysCall type file_desc = FileDesc.t type pid = PId.t structure V = struct open V val nccs = C_Int.toInt NCCS val eof = C_Int.toInt VEOF val eol = C_Int.toInt VEOL val erase = C_Int.toInt VERASE val intr = C_Int.toInt VINTR val kill = C_Int.toInt VKILL val min = C_Int.toInt VMIN val quit = C_Int.toInt VQUIT val susp = C_Int.toInt VSUSP val time = C_Int.toInt VTIME val start = C_Int.toInt VSTART val stop = C_Int.toInt VSTOP type cc = C_CC.t array val default = C_CC.castFromSysWord 0w0 fun new () = Array.array (nccs, default) fun updates (a, l) = List.app (fn (i, cc) => Array.update (a, i, (C_CC.castFromSysWord o Word8.castToSysWord o Byte.charToByte) cc)) l fun cc l = let val a = new () in updates (a, l) ; a end fun update (a, l) = let val a' = new () in Array.copy {src = a, dst = a', di = 0} ; updates (a', l) ; a' end val sub = (Byte.byteToChar o Word8.castFromSysWord o C_CC.castToSysWord) o Array.sub end structure Flags = BitFlags(structure S = C_TCFlag) structure I = struct open I Flags val brkint = BRKINT val icrnl = ICRNL val ignbrk = IGNBRK val igncr = IGNCR val ignpar = IGNPAR val inlcr = INLCR val inpck = INPCK val istrip = ISTRIP val ixany = IXANY val ixoff = IXOFF val ixon = IXON val parmrk = PARMRK end structure O = struct open O Flags val bs0 = BS0 val bs1 = BS1 val bsdly = BSDLY val cr0 = CR0 val cr1 = CR1 val cr2 = CR2 val cr3 = CR3 val crdly = CRDLY val ff0 = FF0 val ff1 = FF1 val ffdly = FFDLY val nl0 = NL0 val nl1 = NL1 val onldly = NLDLY val ocrnl = OCRNL val ofill = OFILL val onlcr = ONLCR val onlret = ONLRET val onocr = ONOCR val opost = OPOST val tab0 = TAB0 val tab1 = TAB1 val tab2 = TAB2 val tab3 = TAB3 val tabdly = TABDLY val vt0 = VT0 val vt1 = VT1 val vtdly = VTDLY end structure C = struct open C Flags val clocal = CLOCAL val cread = CREAD val cs5 = CS5 val cs6 = CS6 val cs7 = CS7 val cs8 = CS8 val csize = CSIZE val cstopb = CSTOPB val hupcl = HUPCL val parenb = PARENB val parodd = PARODD end structure L = struct open L Flags val echo = ECHO val echoe = ECHOE val echok = ECHOK val echonl = ECHONL val icanon = ICANON val iexten = IEXTEN val isig = ISIG val noflsh = NOFLSH val tostop = TOSTOP end type speed = C_Speed.t val b0 = B0 val b110 = B110 val b1200 = B1200 val b134 = B134 val b150 = B150 val b1800 = B1800 val b19200 = B19200 val b200 = B200 val b2400 = B2400 val b300 = B300 val b38400 = B38400 val b4800 = B4800 val b50 = B50 val b600 = B600 val b75 = B75 val b9600 = B9600 val compareSpeed = C_Speed.compare val speedToWord = C_Speed.castToSysWord val wordToSpeed = C_Speed.castFromSysWord type termios = {iflag: I.flags, oflag: O.flags, cflag: C.flags, lflag: L.flags, cc: V.cc, ispeed: speed, ospeed: speed} val id = fn x => x val termios = id val fieldsOf = id val getiflag: termios -> I.flags = #iflag val getoflag: termios -> O.flags = #oflag val getcflag: termios -> C.flags = #cflag val getlflag: termios -> L.flags = #oflag val getcc: termios -> V.cc = #cc structure CF = struct val getospeed: termios -> speed = #ospeed fun setospeed ({iflag, oflag, cflag, lflag, cc, ispeed, ...}: termios, ospeed: speed): termios = {iflag = iflag, oflag = oflag, cflag = cflag, lflag = lflag, cc = cc, ispeed = ispeed, ospeed = ospeed} val getispeed: termios -> speed = #ispeed fun setispeed ({iflag, oflag, cflag, lflag, cc, ospeed, ...}: termios, ispeed: speed): termios = {iflag = iflag, oflag = oflag, cflag = cflag, lflag = lflag, cc = cc, ispeed = ispeed, ospeed = ospeed} end structure Termios = Prim.Termios structure TC = struct open Prim.TC type set_action = C_Int.t val sadrain = TCSADRAIN val saflush = TCSAFLUSH val sanow = TCSANOW type flow_action = C_Int.t val ioff = TCIOFF val ion = TCION val ooff = TCOOFF val oon = TCOON type queue_sel = C_Int.t val iflush = TCIFLUSH val oflush = TCOFLUSH val ioflush = TCIOFLUSH fun getattr fd = SysCall.syscallRestart (fn () => (Prim.TC.getattr (FileDesc.toRep fd), fn _ => {iflag = Termios.getIFlag (), oflag = Termios.getOFlag (), cflag = Termios.getCFlag (), lflag = Termios.getLFlag (), cc = let val a = V.new () in Termios.getCC (a); a end, ispeed = Termios.cfGetISpeed (), ospeed = Termios.cfGetOSpeed ()})) fun setattr (fd, a, {iflag, oflag, cflag, lflag, cc, ispeed, ospeed}) = SysCall.syscallRestart (fn () => (Termios.setIFlag iflag ; Termios.setOFlag oflag ; Termios.setCFlag cflag ; Termios.setLFlag lflag ; SysCall.simple (fn () => Termios.cfSetOSpeed ospeed) ; SysCall.simple (fn () => Termios.cfSetISpeed ispeed) ; Termios.setCC cc ; (Prim.TC.setattr (FileDesc.toRep fd, a), fn _ => ()))) fun sendbreak (fd, n) = SysCall.simpleRestart (fn () => Prim.TC.sendbreak (FileDesc.toRep fd, C_Int.fromInt n)) fun drain fd = SysCall.simpleRestart (fn () => Prim.TC.drain (FileDesc.toRep fd)) fun flush (fd, n) = SysCall.simpleRestart (fn () => Prim.TC.flush (FileDesc.toRep fd, n)) fun flow (fd, n) = SysCall.simpleRestart (fn () => Prim.TC.flow (FileDesc.toRep fd, n)) fun getpgrp fd = (PId.fromRep o SysCall.simpleResultRestart') ({errVal = C_PId.castFromFixedInt ~1}, fn () => Prim.TC.getpgrp (FileDesc.toRep fd)) fun setpgrp (fd, pid) = SysCall.simpleRestart (fn () => Prim.TC.setpgrp (FileDesc.toRep fd, PId.toRep pid)) end end mlton-20100608/basis-library/primitive/0000755000076600000240000000000011404470406016332 5ustar mtfstaffmlton-20100608/basis-library/primitive/basis-ffi.sml0000644000076600000240000024564411404435632020733 0ustar mtfstaff(* This file is automatically generated. Do not edit. *) local open Primitive in structure PrimitiveFFI = struct structure CommandLine = struct val (argcGet, argcSet) = _symbol "CommandLine_argc" private : (unit -> (C_Int.t)) * ((C_Int.t) -> unit); val (argvGet, argvSet) = _symbol "CommandLine_argv" private : (unit -> (C_StringArray.t)) * ((C_StringArray.t) -> unit); val (commandNameGet, commandNameSet) = _symbol "CommandLine_commandName" private : (unit -> (C_String.t)) * ((C_String.t) -> unit); end structure Cygwin = struct val toFullWindowsPath = _import "Cygwin_toFullWindowsPath" private : NullString8.t -> C_String.t; end structure Date = struct val gmTime = _import "Date_gmTime" private : (C_Time.t) ref -> (C_Int.t) C_Errno.t; val localOffset = _import "Date_localOffset" private : unit -> C_Double.t; val localTime = _import "Date_localTime" private : (C_Time.t) ref -> (C_Int.t) C_Errno.t; val mkTime = _import "Date_mkTime" private : unit -> (C_Time.t) C_Errno.t; val strfTime = _import "Date_strfTime" private : (Char8.t) array * C_Size.t * NullString8.t -> C_Size.t; structure Tm = struct val getHour = _import "Date_Tm_getHour" private : unit -> C_Int.t; val getIsDst = _import "Date_Tm_getIsDst" private : unit -> C_Int.t; val getMDay = _import "Date_Tm_getMDay" private : unit -> C_Int.t; val getMin = _import "Date_Tm_getMin" private : unit -> C_Int.t; val getMon = _import "Date_Tm_getMon" private : unit -> C_Int.t; val getSec = _import "Date_Tm_getSec" private : unit -> C_Int.t; val getWDay = _import "Date_Tm_getWDay" private : unit -> C_Int.t; val getYDay = _import "Date_Tm_getYDay" private : unit -> C_Int.t; val getYear = _import "Date_Tm_getYear" private : unit -> C_Int.t; val setHour = _import "Date_Tm_setHour" private : C_Int.t -> unit; val setIsDst = _import "Date_Tm_setIsDst" private : C_Int.t -> unit; val setMDay = _import "Date_Tm_setMDay" private : C_Int.t -> unit; val setMin = _import "Date_Tm_setMin" private : C_Int.t -> unit; val setMon = _import "Date_Tm_setMon" private : C_Int.t -> unit; val setSec = _import "Date_Tm_setSec" private : C_Int.t -> unit; val setWDay = _import "Date_Tm_setWDay" private : C_Int.t -> unit; val setYDay = _import "Date_Tm_setYDay" private : C_Int.t -> unit; val setYear = _import "Date_Tm_setYear" private : C_Int.t -> unit; end end structure IEEEReal = struct structure FloatClass = struct val FP_INFINITE = _const "IEEEReal_FloatClass_FP_INFINITE" : C_Int.t; val FP_NAN = _const "IEEEReal_FloatClass_FP_NAN" : C_Int.t; val FP_NORMAL = _const "IEEEReal_FloatClass_FP_NORMAL" : C_Int.t; val FP_SUBNORMAL = _const "IEEEReal_FloatClass_FP_SUBNORMAL" : C_Int.t; val FP_ZERO = _const "IEEEReal_FloatClass_FP_ZERO" : C_Int.t; end val getRoundingMode = _import "IEEEReal_getRoundingMode" private : unit -> C_Int.t; structure RoundingMode = struct val FE_DOWNWARD = _const "IEEEReal_RoundingMode_FE_DOWNWARD" : C_Int.t; val FE_NOSUPPORT = _const "IEEEReal_RoundingMode_FE_NOSUPPORT" : C_Int.t; val FE_TONEAREST = _const "IEEEReal_RoundingMode_FE_TONEAREST" : C_Int.t; val FE_TOWARDZERO = _const "IEEEReal_RoundingMode_FE_TOWARDZERO" : C_Int.t; val FE_UPWARD = _const "IEEEReal_RoundingMode_FE_UPWARD" : C_Int.t; end val setRoundingMode = _import "IEEEReal_setRoundingMode" private : C_Int.t -> C_Int.t; end structure MinGW = struct val clearNonBlock = _import "MinGW_clearNonBlock" private : C_Fd.t -> unit; val getTempPath = _import "MinGW_getTempPath" private : C_Size.t * (Char8.t) array -> C_Size.t; val setNonBlock = _import "MinGW_setNonBlock" private : C_Fd.t -> unit; end structure MLton = struct val bug = _import "MLton_bug" private : String8.t -> unit; structure Itimer = struct val PROF = _const "MLton_Itimer_PROF" : C_Int.t; val REAL = _const "MLton_Itimer_REAL" : C_Int.t; val set = _import "MLton_Itimer_set" private : C_Int.t * C_Time.t * C_SUSeconds.t * C_Time.t * C_SUSeconds.t -> (C_Int.t) C_Errno.t; val VIRTUAL = _const "MLton_Itimer_VIRTUAL" : C_Int.t; end structure Process = struct val spawne = _import "MLton_Process_spawne" private : NullString8.t * (NullString8.t) array * (NullString8.t) array -> (C_PId.t) C_Errno.t; val spawnp = _import "MLton_Process_spawnp" private : NullString8.t * (NullString8.t) array -> (C_PId.t) C_Errno.t; end structure Rlimit = struct val AS = _const "MLton_Rlimit_AS" : C_Int.t; val CORE = _const "MLton_Rlimit_CORE" : C_Int.t; val CPU = _const "MLton_Rlimit_CPU" : C_Int.t; val DATA = _const "MLton_Rlimit_DATA" : C_Int.t; val FSIZE = _const "MLton_Rlimit_FSIZE" : C_Int.t; val get = _import "MLton_Rlimit_get" private : C_Int.t -> (C_Int.t) C_Errno.t; val getHard = _import "MLton_Rlimit_getHard" private : unit -> C_RLim.t; val getSoft = _import "MLton_Rlimit_getSoft" private : unit -> C_RLim.t; val INFINITY = _const "MLton_Rlimit_INFINITY" : C_RLim.t; val MEMLOCK = _const "MLton_Rlimit_MEMLOCK" : C_Int.t; val NOFILE = _const "MLton_Rlimit_NOFILE" : C_Int.t; val NPROC = _const "MLton_Rlimit_NPROC" : C_Int.t; val RSS = _const "MLton_Rlimit_RSS" : C_Int.t; val set = _import "MLton_Rlimit_set" private : C_Int.t * C_RLim.t * C_RLim.t -> (C_Int.t) C_Errno.t; val STACK = _const "MLton_Rlimit_STACK" : C_Int.t; end structure Rusage = struct val children_stime_sec = _import "MLton_Rusage_children_stime_sec" private : unit -> C_Time.t; val children_stime_usec = _import "MLton_Rusage_children_stime_usec" private : unit -> C_SUSeconds.t; val children_utime_sec = _import "MLton_Rusage_children_utime_sec" private : unit -> C_Time.t; val children_utime_usec = _import "MLton_Rusage_children_utime_usec" private : unit -> C_SUSeconds.t; val gc_stime_sec = _import "MLton_Rusage_gc_stime_sec" private : unit -> C_Time.t; val gc_stime_usec = _import "MLton_Rusage_gc_stime_usec" private : unit -> C_SUSeconds.t; val gc_utime_sec = _import "MLton_Rusage_gc_utime_sec" private : unit -> C_Time.t; val gc_utime_usec = _import "MLton_Rusage_gc_utime_usec" private : unit -> C_SUSeconds.t; val getrusage = _import "MLton_Rusage_getrusage" private : unit -> unit; val self_stime_sec = _import "MLton_Rusage_self_stime_sec" private : unit -> C_Time.t; val self_stime_usec = _import "MLton_Rusage_self_stime_usec" private : unit -> C_SUSeconds.t; val self_utime_sec = _import "MLton_Rusage_self_utime_sec" private : unit -> C_Time.t; val self_utime_usec = _import "MLton_Rusage_self_utime_usec" private : unit -> C_SUSeconds.t; end structure Syslog = struct val closelog = _import "MLton_Syslog_closelog" private : unit -> unit; structure Facility = struct val LOG_AUTH = _const "MLton_Syslog_Facility_LOG_AUTH" : C_Int.t; val LOG_CRON = _const "MLton_Syslog_Facility_LOG_CRON" : C_Int.t; val LOG_DAEMON = _const "MLton_Syslog_Facility_LOG_DAEMON" : C_Int.t; val LOG_KERN = _const "MLton_Syslog_Facility_LOG_KERN" : C_Int.t; val LOG_LOCAL0 = _const "MLton_Syslog_Facility_LOG_LOCAL0" : C_Int.t; val LOG_LOCAL1 = _const "MLton_Syslog_Facility_LOG_LOCAL1" : C_Int.t; val LOG_LOCAL2 = _const "MLton_Syslog_Facility_LOG_LOCAL2" : C_Int.t; val LOG_LOCAL3 = _const "MLton_Syslog_Facility_LOG_LOCAL3" : C_Int.t; val LOG_LOCAL4 = _const "MLton_Syslog_Facility_LOG_LOCAL4" : C_Int.t; val LOG_LOCAL5 = _const "MLton_Syslog_Facility_LOG_LOCAL5" : C_Int.t; val LOG_LOCAL6 = _const "MLton_Syslog_Facility_LOG_LOCAL6" : C_Int.t; val LOG_LOCAL7 = _const "MLton_Syslog_Facility_LOG_LOCAL7" : C_Int.t; val LOG_LPR = _const "MLton_Syslog_Facility_LOG_LPR" : C_Int.t; val LOG_MAIL = _const "MLton_Syslog_Facility_LOG_MAIL" : C_Int.t; val LOG_NEWS = _const "MLton_Syslog_Facility_LOG_NEWS" : C_Int.t; val LOG_SYSLOG = _const "MLton_Syslog_Facility_LOG_SYSLOG" : C_Int.t; val LOG_USER = _const "MLton_Syslog_Facility_LOG_USER" : C_Int.t; val LOG_UUCP = _const "MLton_Syslog_Facility_LOG_UUCP" : C_Int.t; end structure Logopt = struct val LOG_CONS = _const "MLton_Syslog_Logopt_LOG_CONS" : C_Int.t; val LOG_NDELAY = _const "MLton_Syslog_Logopt_LOG_NDELAY" : C_Int.t; val LOG_NOWAIT = _const "MLton_Syslog_Logopt_LOG_NOWAIT" : C_Int.t; val LOG_ODELAY = _const "MLton_Syslog_Logopt_LOG_ODELAY" : C_Int.t; val LOG_PERROR = _const "MLton_Syslog_Logopt_LOG_PERROR" : C_Int.t; val LOG_PID = _const "MLton_Syslog_Logopt_LOG_PID" : C_Int.t; end val openlog = _import "MLton_Syslog_openlog" private : NullString8.t * C_Int.t * C_Int.t -> unit; structure Severity = struct val LOG_ALERT = _const "MLton_Syslog_Severity_LOG_ALERT" : C_Int.t; val LOG_CRIT = _const "MLton_Syslog_Severity_LOG_CRIT" : C_Int.t; val LOG_DEBUG = _const "MLton_Syslog_Severity_LOG_DEBUG" : C_Int.t; val LOG_EMERG = _const "MLton_Syslog_Severity_LOG_EMERG" : C_Int.t; val LOG_ERR = _const "MLton_Syslog_Severity_LOG_ERR" : C_Int.t; val LOG_INFO = _const "MLton_Syslog_Severity_LOG_INFO" : C_Int.t; val LOG_NOTICE = _const "MLton_Syslog_Severity_LOG_NOTICE" : C_Int.t; val LOG_WARNING = _const "MLton_Syslog_Severity_LOG_WARNING" : C_Int.t; end val syslog = _import "MLton_Syslog_syslog" private : C_Int.t * NullString8.t -> unit; end end structure Net = struct val htonl = _import "Net_htonl" private : Word32.t -> Word32.t; val htons = _import "Net_htons" private : Word16.t -> Word16.t; val ntohl = _import "Net_ntohl" private : Word32.t -> Word32.t; val ntohs = _import "Net_ntohs" private : Word16.t -> Word16.t; end structure NetHostDB = struct val getByAddress = _import "NetHostDB_getByAddress" private : (Word8.t) vector * C_Socklen.t -> C_Int.t; val getByName = _import "NetHostDB_getByName" private : NullString8.t -> C_Int.t; val getEntryAddrsN = _import "NetHostDB_getEntryAddrsN" private : C_Int.t * (Word8.t) array -> unit; val getEntryAddrsNum = _import "NetHostDB_getEntryAddrsNum" private : unit -> C_Int.t; val getEntryAddrType = _import "NetHostDB_getEntryAddrType" private : unit -> C_Int.t; val getEntryAliasesN = _import "NetHostDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetHostDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryLength = _import "NetHostDB_getEntryLength" private : unit -> C_Int.t; val getEntryName = _import "NetHostDB_getEntryName" private : unit -> C_String.t; val getHostName = _import "NetHostDB_getHostName" private : (Char8.t) array * C_Size.t -> (C_Int.t) C_Errno.t; val INADDR_ANY = _const "NetHostDB_INADDR_ANY" : C_Int.t; val inAddrSize = _const "NetHostDB_inAddrSize" : C_Size.t; end structure NetProtDB = struct val getByName = _import "NetProtDB_getByName" private : NullString8.t -> C_Int.t; val getByNumber = _import "NetProtDB_getByNumber" private : C_Int.t -> C_Int.t; val getEntryAliasesN = _import "NetProtDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetProtDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryName = _import "NetProtDB_getEntryName" private : unit -> C_String.t; val getEntryProto = _import "NetProtDB_getEntryProto" private : unit -> C_Int.t; end structure NetServDB = struct val getByName = _import "NetServDB_getByName" private : NullString8.t * NullString8.t -> C_Int.t; val getByNameNull = _import "NetServDB_getByNameNull" private : NullString8.t -> C_Int.t; val getByPort = _import "NetServDB_getByPort" private : C_Int.t * NullString8.t -> C_Int.t; val getByPortNull = _import "NetServDB_getByPortNull" private : C_Int.t -> C_Int.t; val getEntryAliasesN = _import "NetServDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetServDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryName = _import "NetServDB_getEntryName" private : unit -> C_String.t; val getEntryPort = _import "NetServDB_getEntryPort" private : unit -> C_Int.t; val getEntryProto = _import "NetServDB_getEntryProto" private : unit -> C_String.t; end structure OS = struct structure IO = struct val poll = _import "OS_IO_poll" private : (C_Fd.t) vector * (C_Short.t) vector * C_NFds.t * C_Int.t * (C_Short.t) array -> (C_Int.t) C_Errno.t; val POLLIN = _const "OS_IO_POLLIN" : C_Short.t; val POLLOUT = _const "OS_IO_POLLOUT" : C_Short.t; val POLLPRI = _const "OS_IO_POLLPRI" : C_Short.t; end end structure Posix = struct structure Error = struct val clearErrno = _import "Posix_Error_clearErrno" private : unit -> unit; val E2BIG = _const "Posix_Error_E2BIG" : C_Int.t; val EACCES = _const "Posix_Error_EACCES" : C_Int.t; val EADDRINUSE = _const "Posix_Error_EADDRINUSE" : C_Int.t; val EADDRNOTAVAIL = _const "Posix_Error_EADDRNOTAVAIL" : C_Int.t; val EAFNOSUPPORT = _const "Posix_Error_EAFNOSUPPORT" : C_Int.t; val EAGAIN = _const "Posix_Error_EAGAIN" : C_Int.t; val EALREADY = _const "Posix_Error_EALREADY" : C_Int.t; val EBADF = _const "Posix_Error_EBADF" : C_Int.t; val EBADMSG = _const "Posix_Error_EBADMSG" : C_Int.t; val EBUSY = _const "Posix_Error_EBUSY" : C_Int.t; val ECANCELED = _const "Posix_Error_ECANCELED" : C_Int.t; val ECHILD = _const "Posix_Error_ECHILD" : C_Int.t; val ECONNABORTED = _const "Posix_Error_ECONNABORTED" : C_Int.t; val ECONNREFUSED = _const "Posix_Error_ECONNREFUSED" : C_Int.t; val ECONNRESET = _const "Posix_Error_ECONNRESET" : C_Int.t; val EDEADLK = _const "Posix_Error_EDEADLK" : C_Int.t; val EDESTADDRREQ = _const "Posix_Error_EDESTADDRREQ" : C_Int.t; val EDOM = _const "Posix_Error_EDOM" : C_Int.t; val EDQUOT = _const "Posix_Error_EDQUOT" : C_Int.t; val EEXIST = _const "Posix_Error_EEXIST" : C_Int.t; val EFAULT = _const "Posix_Error_EFAULT" : C_Int.t; val EFBIG = _const "Posix_Error_EFBIG" : C_Int.t; val EHOSTUNREACH = _const "Posix_Error_EHOSTUNREACH" : C_Int.t; val EIDRM = _const "Posix_Error_EIDRM" : C_Int.t; val EILSEQ = _const "Posix_Error_EILSEQ" : C_Int.t; val EINPROGRESS = _const "Posix_Error_EINPROGRESS" : C_Int.t; val EINTR = _const "Posix_Error_EINTR" : C_Int.t; val EINVAL = _const "Posix_Error_EINVAL" : C_Int.t; val EIO = _const "Posix_Error_EIO" : C_Int.t; val EISCONN = _const "Posix_Error_EISCONN" : C_Int.t; val EISDIR = _const "Posix_Error_EISDIR" : C_Int.t; val ELOOP = _const "Posix_Error_ELOOP" : C_Int.t; val EMFILE = _const "Posix_Error_EMFILE" : C_Int.t; val EMLINK = _const "Posix_Error_EMLINK" : C_Int.t; val EMSGSIZE = _const "Posix_Error_EMSGSIZE" : C_Int.t; val EMULTIHOP = _const "Posix_Error_EMULTIHOP" : C_Int.t; val ENAMETOOLONG = _const "Posix_Error_ENAMETOOLONG" : C_Int.t; val ENETDOWN = _const "Posix_Error_ENETDOWN" : C_Int.t; val ENETRESET = _const "Posix_Error_ENETRESET" : C_Int.t; val ENETUNREACH = _const "Posix_Error_ENETUNREACH" : C_Int.t; val ENFILE = _const "Posix_Error_ENFILE" : C_Int.t; val ENOBUFS = _const "Posix_Error_ENOBUFS" : C_Int.t; val ENODATA = _const "Posix_Error_ENODATA" : C_Int.t; val ENODEV = _const "Posix_Error_ENODEV" : C_Int.t; val ENOENT = _const "Posix_Error_ENOENT" : C_Int.t; val ENOEXEC = _const "Posix_Error_ENOEXEC" : C_Int.t; val ENOLCK = _const "Posix_Error_ENOLCK" : C_Int.t; val ENOLINK = _const "Posix_Error_ENOLINK" : C_Int.t; val ENOMEM = _const "Posix_Error_ENOMEM" : C_Int.t; val ENOMSG = _const "Posix_Error_ENOMSG" : C_Int.t; val ENOPROTOOPT = _const "Posix_Error_ENOPROTOOPT" : C_Int.t; val ENOSPC = _const "Posix_Error_ENOSPC" : C_Int.t; val ENOSR = _const "Posix_Error_ENOSR" : C_Int.t; val ENOSTR = _const "Posix_Error_ENOSTR" : C_Int.t; val ENOSYS = _const "Posix_Error_ENOSYS" : C_Int.t; val ENOTCONN = _const "Posix_Error_ENOTCONN" : C_Int.t; val ENOTDIR = _const "Posix_Error_ENOTDIR" : C_Int.t; val ENOTEMPTY = _const "Posix_Error_ENOTEMPTY" : C_Int.t; val ENOTSOCK = _const "Posix_Error_ENOTSOCK" : C_Int.t; val ENOTSUP = _const "Posix_Error_ENOTSUP" : C_Int.t; val ENOTTY = _const "Posix_Error_ENOTTY" : C_Int.t; val ENXIO = _const "Posix_Error_ENXIO" : C_Int.t; val EOPNOTSUPP = _const "Posix_Error_EOPNOTSUPP" : C_Int.t; val EOVERFLOW = _const "Posix_Error_EOVERFLOW" : C_Int.t; val EPERM = _const "Posix_Error_EPERM" : C_Int.t; val EPIPE = _const "Posix_Error_EPIPE" : C_Int.t; val EPROTO = _const "Posix_Error_EPROTO" : C_Int.t; val EPROTONOSUPPORT = _const "Posix_Error_EPROTONOSUPPORT" : C_Int.t; val EPROTOTYPE = _const "Posix_Error_EPROTOTYPE" : C_Int.t; val ERANGE = _const "Posix_Error_ERANGE" : C_Int.t; val EROFS = _const "Posix_Error_EROFS" : C_Int.t; val ESPIPE = _const "Posix_Error_ESPIPE" : C_Int.t; val ESRCH = _const "Posix_Error_ESRCH" : C_Int.t; val ESTALE = _const "Posix_Error_ESTALE" : C_Int.t; val ETIME = _const "Posix_Error_ETIME" : C_Int.t; val ETIMEDOUT = _const "Posix_Error_ETIMEDOUT" : C_Int.t; val ETXTBSY = _const "Posix_Error_ETXTBSY" : C_Int.t; val EWOULDBLOCK = _const "Posix_Error_EWOULDBLOCK" : C_Int.t; val EXDEV = _const "Posix_Error_EXDEV" : C_Int.t; val getErrno = _import "Posix_Error_getErrno" private : unit -> C_Int.t; val strError = _import "Posix_Error_strError" private : C_Int.t -> C_String.t; end structure FileSys = struct structure A = struct val F_OK = _const "Posix_FileSys_A_F_OK" : C_Int.t; val R_OK = _const "Posix_FileSys_A_R_OK" : C_Int.t; val W_OK = _const "Posix_FileSys_A_W_OK" : C_Int.t; val X_OK = _const "Posix_FileSys_A_X_OK" : C_Int.t; end val access = _import "Posix_FileSys_access" private : NullString8.t * C_Int.t -> (C_Int.t) C_Errno.t; val chdir = _import "Posix_FileSys_chdir" private : NullString8.t -> (C_Int.t) C_Errno.t; val chmod = _import "Posix_FileSys_chmod" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; val chown = _import "Posix_FileSys_chown" private : NullString8.t * C_UId.t * C_GId.t -> (C_Int.t) C_Errno.t; structure Dirstream = struct val closeDir = _import "Posix_FileSys_Dirstream_closeDir" private : C_DirP.t -> (C_Int.t) C_Errno.t; val openDir = _import "Posix_FileSys_Dirstream_openDir" private : NullString8.t -> (C_DirP.t) C_Errno.t; val readDir = _import "Posix_FileSys_Dirstream_readDir" private : C_DirP.t -> (C_String.t) C_Errno.t; val rewindDir = _import "Posix_FileSys_Dirstream_rewindDir" private : C_DirP.t -> unit; end val fchdir = _import "Posix_FileSys_fchdir" private : C_Fd.t -> (C_Int.t) C_Errno.t; val fchmod = _import "Posix_FileSys_fchmod" private : C_Fd.t * C_Mode.t -> (C_Int.t) C_Errno.t; val fchown = _import "Posix_FileSys_fchown" private : C_Fd.t * C_UId.t * C_GId.t -> (C_Int.t) C_Errno.t; val fpathconf = _import "Posix_FileSys_fpathconf" private : C_Fd.t * C_Int.t -> (C_Long.t) C_Errno.t; val ftruncate = _import "Posix_FileSys_ftruncate" private : C_Fd.t * C_Off.t -> (C_Int.t) C_Errno.t; val getcwd = _import "Posix_FileSys_getcwd" private : (Char8.t) array * C_Size.t -> (C_String.t) C_Errno.t; val link = _import "Posix_FileSys_link" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val mkdir = _import "Posix_FileSys_mkdir" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; val mkfifo = _import "Posix_FileSys_mkfifo" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; structure O = struct val APPEND = _const "Posix_FileSys_O_APPEND" : C_Int.t; val BINARY = _const "Posix_FileSys_O_BINARY" : C_Int.t; val CREAT = _const "Posix_FileSys_O_CREAT" : C_Int.t; val DSYNC = _const "Posix_FileSys_O_DSYNC" : C_Int.t; val EXCL = _const "Posix_FileSys_O_EXCL" : C_Int.t; val NOCTTY = _const "Posix_FileSys_O_NOCTTY" : C_Int.t; val NONBLOCK = _const "Posix_FileSys_O_NONBLOCK" : C_Int.t; val RDONLY = _const "Posix_FileSys_O_RDONLY" : C_Int.t; val RDWR = _const "Posix_FileSys_O_RDWR" : C_Int.t; val RSYNC = _const "Posix_FileSys_O_RSYNC" : C_Int.t; val SYNC = _const "Posix_FileSys_O_SYNC" : C_Int.t; val TEXT = _const "Posix_FileSys_O_TEXT" : C_Int.t; val TRUNC = _const "Posix_FileSys_O_TRUNC" : C_Int.t; val WRONLY = _const "Posix_FileSys_O_WRONLY" : C_Int.t; end val open2 = _import "Posix_FileSys_open2" private : NullString8.t * C_Int.t -> (C_Fd.t) C_Errno.t; val open3 = _import "Posix_FileSys_open3" private : NullString8.t * C_Int.t * C_Mode.t -> (C_Fd.t) C_Errno.t; val pathconf = _import "Posix_FileSys_pathconf" private : NullString8.t * C_Int.t -> (C_Long.t) C_Errno.t; structure PC = struct val ALLOC_SIZE_MIN = _const "Posix_FileSys_PC_ALLOC_SIZE_MIN" : C_Int.t; val ASYNC_IO = _const "Posix_FileSys_PC_ASYNC_IO" : C_Int.t; val CHOWN_RESTRICTED = _const "Posix_FileSys_PC_CHOWN_RESTRICTED" : C_Int.t; val FILESIZEBITS = _const "Posix_FileSys_PC_FILESIZEBITS" : C_Int.t; val LINK_MAX = _const "Posix_FileSys_PC_LINK_MAX" : C_Int.t; val MAX_CANON = _const "Posix_FileSys_PC_MAX_CANON" : C_Int.t; val MAX_INPUT = _const "Posix_FileSys_PC_MAX_INPUT" : C_Int.t; val NAME_MAX = _const "Posix_FileSys_PC_NAME_MAX" : C_Int.t; val NO_TRUNC = _const "Posix_FileSys_PC_NO_TRUNC" : C_Int.t; val PATH_MAX = _const "Posix_FileSys_PC_PATH_MAX" : C_Int.t; val PIPE_BUF = _const "Posix_FileSys_PC_PIPE_BUF" : C_Int.t; val PRIO_IO = _const "Posix_FileSys_PC_PRIO_IO" : C_Int.t; val REC_INCR_XFER_SIZE = _const "Posix_FileSys_PC_REC_INCR_XFER_SIZE" : C_Int.t; val REC_MAX_XFER_SIZE = _const "Posix_FileSys_PC_REC_MAX_XFER_SIZE" : C_Int.t; val REC_MIN_XFER_SIZE = _const "Posix_FileSys_PC_REC_MIN_XFER_SIZE" : C_Int.t; val REC_XFER_ALIGN = _const "Posix_FileSys_PC_REC_XFER_ALIGN" : C_Int.t; val SYMLINK_MAX = _const "Posix_FileSys_PC_SYMLINK_MAX" : C_Int.t; val SYNC_IO = _const "Posix_FileSys_PC_SYNC_IO" : C_Int.t; val TWO_SYMLINKS = _const "Posix_FileSys_PC_TWO_SYMLINKS" : C_Int.t; val VDISABLE = _const "Posix_FileSys_PC_VDISABLE" : C_Int.t; end val readlink = _import "Posix_FileSys_readlink" private : NullString8.t * (Char8.t) array * C_Size.t -> (C_SSize.t) C_Errno.t; val rename = _import "Posix_FileSys_rename" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val rmdir = _import "Posix_FileSys_rmdir" private : NullString8.t -> (C_Int.t) C_Errno.t; structure S = struct val IFBLK = _const "Posix_FileSys_S_IFBLK" : C_Mode.t; val IFCHR = _const "Posix_FileSys_S_IFCHR" : C_Mode.t; val IFDIR = _const "Posix_FileSys_S_IFDIR" : C_Mode.t; val IFIFO = _const "Posix_FileSys_S_IFIFO" : C_Mode.t; val IFLNK = _const "Posix_FileSys_S_IFLNK" : C_Mode.t; val IFMT = _const "Posix_FileSys_S_IFMT" : C_Mode.t; val IFREG = _const "Posix_FileSys_S_IFREG" : C_Mode.t; val IFSOCK = _const "Posix_FileSys_S_IFSOCK" : C_Mode.t; val IRGRP = _const "Posix_FileSys_S_IRGRP" : C_Mode.t; val IROTH = _const "Posix_FileSys_S_IROTH" : C_Mode.t; val IRUSR = _const "Posix_FileSys_S_IRUSR" : C_Mode.t; val IRWXG = _const "Posix_FileSys_S_IRWXG" : C_Mode.t; val IRWXO = _const "Posix_FileSys_S_IRWXO" : C_Mode.t; val IRWXU = _const "Posix_FileSys_S_IRWXU" : C_Mode.t; val ISGID = _const "Posix_FileSys_S_ISGID" : C_Mode.t; val ISUID = _const "Posix_FileSys_S_ISUID" : C_Mode.t; val ISVTX = _const "Posix_FileSys_S_ISVTX" : C_Mode.t; val IWGRP = _const "Posix_FileSys_S_IWGRP" : C_Mode.t; val IWOTH = _const "Posix_FileSys_S_IWOTH" : C_Mode.t; val IWUSR = _const "Posix_FileSys_S_IWUSR" : C_Mode.t; val IXGRP = _const "Posix_FileSys_S_IXGRP" : C_Mode.t; val IXOTH = _const "Posix_FileSys_S_IXOTH" : C_Mode.t; val IXUSR = _const "Posix_FileSys_S_IXUSR" : C_Mode.t; end structure ST = struct val isBlk = _import "Posix_FileSys_ST_isBlk" private : C_Mode.t -> C_Int.t; val isChr = _import "Posix_FileSys_ST_isChr" private : C_Mode.t -> C_Int.t; val isDir = _import "Posix_FileSys_ST_isDir" private : C_Mode.t -> C_Int.t; val isFIFO = _import "Posix_FileSys_ST_isFIFO" private : C_Mode.t -> C_Int.t; val isLink = _import "Posix_FileSys_ST_isLink" private : C_Mode.t -> C_Int.t; val isReg = _import "Posix_FileSys_ST_isReg" private : C_Mode.t -> C_Int.t; val isSock = _import "Posix_FileSys_ST_isSock" private : C_Mode.t -> C_Int.t; end structure Stat = struct val fstat = _import "Posix_FileSys_Stat_fstat" private : C_Fd.t -> (C_Int.t) C_Errno.t; val getATime = _import "Posix_FileSys_Stat_getATime" private : unit -> C_Time.t; val getCTime = _import "Posix_FileSys_Stat_getCTime" private : unit -> C_Time.t; val getDev = _import "Posix_FileSys_Stat_getDev" private : unit -> C_Dev.t; val getGId = _import "Posix_FileSys_Stat_getGId" private : unit -> C_GId.t; val getINo = _import "Posix_FileSys_Stat_getINo" private : unit -> C_INo.t; val getMode = _import "Posix_FileSys_Stat_getMode" private : unit -> C_Mode.t; val getMTime = _import "Posix_FileSys_Stat_getMTime" private : unit -> C_Time.t; val getNLink = _import "Posix_FileSys_Stat_getNLink" private : unit -> C_NLink.t; val getRDev = _import "Posix_FileSys_Stat_getRDev" private : unit -> C_Dev.t; val getSize = _import "Posix_FileSys_Stat_getSize" private : unit -> C_Off.t; val getUId = _import "Posix_FileSys_Stat_getUId" private : unit -> C_UId.t; val lstat = _import "Posix_FileSys_Stat_lstat" private : NullString8.t -> (C_Int.t) C_Errno.t; val stat = _import "Posix_FileSys_Stat_stat" private : NullString8.t -> (C_Int.t) C_Errno.t; end val symlink = _import "Posix_FileSys_symlink" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val truncate = _import "Posix_FileSys_truncate" private : NullString8.t * C_Off.t -> (C_Int.t) C_Errno.t; val umask = _import "Posix_FileSys_umask" private : C_Mode.t -> C_Mode.t; val unlink = _import "Posix_FileSys_unlink" private : NullString8.t -> (C_Int.t) C_Errno.t; structure Utimbuf = struct val setAcTime = _import "Posix_FileSys_Utimbuf_setAcTime" private : C_Time.t -> unit; val setModTime = _import "Posix_FileSys_Utimbuf_setModTime" private : C_Time.t -> unit; val utime = _import "Posix_FileSys_Utimbuf_utime" private : NullString8.t -> (C_Int.t) C_Errno.t; end end structure IO = struct val close = _import "Posix_IO_close" private : C_Fd.t -> (C_Int.t) C_Errno.t; val dup = _import "Posix_IO_dup" private : C_Fd.t -> (C_Fd.t) C_Errno.t; val dup2 = _import "Posix_IO_dup2" private : C_Fd.t * C_Fd.t -> (C_Fd.t) C_Errno.t; val F_DUPFD = _const "Posix_IO_F_DUPFD" : C_Int.t; val F_GETFD = _const "Posix_IO_F_GETFD" : C_Int.t; val F_GETFL = _const "Posix_IO_F_GETFL" : C_Int.t; val F_GETOWN = _const "Posix_IO_F_GETOWN" : C_Int.t; val F_SETFD = _const "Posix_IO_F_SETFD" : C_Int.t; val F_SETFL = _const "Posix_IO_F_SETFL" : C_Int.t; val F_SETOWN = _const "Posix_IO_F_SETOWN" : C_Int.t; val fcntl2 = _import "Posix_IO_fcntl2" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val fcntl3 = _import "Posix_IO_fcntl3" private : C_Fd.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; structure FD = struct val CLOEXEC = _const "Posix_IO_FD_CLOEXEC" : C_Int.t; end structure FLock = struct val F_GETLK = _const "Posix_IO_FLock_F_GETLK" : C_Int.t; val F_RDLCK = _const "Posix_IO_FLock_F_RDLCK" : C_Short.t; val F_SETLK = _const "Posix_IO_FLock_F_SETLK" : C_Int.t; val F_SETLKW = _const "Posix_IO_FLock_F_SETLKW" : C_Int.t; val F_UNLCK = _const "Posix_IO_FLock_F_UNLCK" : C_Short.t; val F_WRLCK = _const "Posix_IO_FLock_F_WRLCK" : C_Short.t; val fcntl = _import "Posix_IO_FLock_fcntl" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val getLen = _import "Posix_IO_FLock_getLen" private : unit -> C_Off.t; val getPId = _import "Posix_IO_FLock_getPId" private : unit -> C_PId.t; val getStart = _import "Posix_IO_FLock_getStart" private : unit -> C_Off.t; val getType = _import "Posix_IO_FLock_getType" private : unit -> C_Short.t; val getWhence = _import "Posix_IO_FLock_getWhence" private : unit -> C_Short.t; val SEEK_CUR = _const "Posix_IO_FLock_SEEK_CUR" : C_Short.t; val SEEK_END = _const "Posix_IO_FLock_SEEK_END" : C_Short.t; val SEEK_SET = _const "Posix_IO_FLock_SEEK_SET" : C_Short.t; val setLen = _import "Posix_IO_FLock_setLen" private : C_Off.t -> unit; val setPId = _import "Posix_IO_FLock_setPId" private : C_PId.t -> unit; val setStart = _import "Posix_IO_FLock_setStart" private : C_Off.t -> unit; val setType = _import "Posix_IO_FLock_setType" private : C_Short.t -> unit; val setWhence = _import "Posix_IO_FLock_setWhence" private : C_Short.t -> unit; end val fsync = _import "Posix_IO_fsync" private : C_Fd.t -> (C_Int.t) C_Errno.t; val lseek = _import "Posix_IO_lseek" private : C_Fd.t * C_Off.t * C_Int.t -> (C_Off.t) C_Errno.t; val O_ACCMODE = _const "Posix_IO_O_ACCMODE" : C_Int.t; val pipe = _import "Posix_IO_pipe" private : (C_Fd.t) array -> (C_Int.t) C_Errno.t; val readChar8 = _import "Posix_IO_readChar8" private : C_Fd.t * (Char8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val readWord8 = _import "Posix_IO_readWord8" private : C_Fd.t * (Word8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val SEEK_CUR = _const "Posix_IO_SEEK_CUR" : C_Int.t; val SEEK_END = _const "Posix_IO_SEEK_END" : C_Int.t; val SEEK_SET = _const "Posix_IO_SEEK_SET" : C_Int.t; val setbin = _import "Posix_IO_setbin" private : C_Fd.t -> unit; val settext = _import "Posix_IO_settext" private : C_Fd.t -> unit; val writeChar8Arr = _import "Posix_IO_writeChar8Arr" private : C_Fd.t * (Char8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeChar8Vec = _import "Posix_IO_writeChar8Vec" private : C_Fd.t * (Char8.t) vector * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeWord8Arr = _import "Posix_IO_writeWord8Arr" private : C_Fd.t * (Word8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeWord8Vec = _import "Posix_IO_writeWord8Vec" private : C_Fd.t * (Word8.t) vector * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; end structure ProcEnv = struct val ctermid = _import "Posix_ProcEnv_ctermid" private : unit -> C_String.t; val (environGet, environSet) = _symbol "Posix_ProcEnv_environ" private : (unit -> (C_StringArray.t)) * ((C_StringArray.t) -> unit); val getegid = _import "Posix_ProcEnv_getegid" private : unit -> C_GId.t; val getenv = _import "Posix_ProcEnv_getenv" private : NullString8.t -> C_String.t; val geteuid = _import "Posix_ProcEnv_geteuid" private : unit -> C_UId.t; val getgid = _import "Posix_ProcEnv_getgid" private : unit -> C_GId.t; val getgroups = _import "Posix_ProcEnv_getgroups" private : C_Int.t * (C_GId.t) array -> (C_Int.t) C_Errno.t; val getgroupsN = _import "Posix_ProcEnv_getgroupsN" private : unit -> C_Int.t; val getlogin = _import "Posix_ProcEnv_getlogin" private : unit -> (C_String.t) C_Errno.t; val getpgrp = _import "Posix_ProcEnv_getpgrp" private : unit -> C_PId.t; val getpid = _import "Posix_ProcEnv_getpid" private : unit -> C_PId.t; val getppid = _import "Posix_ProcEnv_getppid" private : unit -> C_PId.t; val getuid = _import "Posix_ProcEnv_getuid" private : unit -> C_UId.t; val isatty = _import "Posix_ProcEnv_isatty" private : C_Fd.t -> C_Int.t; val SC_2_C_BIND = _const "Posix_ProcEnv_SC_2_C_BIND" : C_Int.t; val SC_2_C_DEV = _const "Posix_ProcEnv_SC_2_C_DEV" : C_Int.t; val SC_2_CHAR_TERM = _const "Posix_ProcEnv_SC_2_CHAR_TERM" : C_Int.t; val SC_2_FORT_DEV = _const "Posix_ProcEnv_SC_2_FORT_DEV" : C_Int.t; val SC_2_FORT_RUN = _const "Posix_ProcEnv_SC_2_FORT_RUN" : C_Int.t; val SC_2_LOCALEDEF = _const "Posix_ProcEnv_SC_2_LOCALEDEF" : C_Int.t; val SC_2_PBS = _const "Posix_ProcEnv_SC_2_PBS" : C_Int.t; val SC_2_PBS_ACCOUNTING = _const "Posix_ProcEnv_SC_2_PBS_ACCOUNTING" : C_Int.t; val SC_2_PBS_CHECKPOINT = _const "Posix_ProcEnv_SC_2_PBS_CHECKPOINT" : C_Int.t; val SC_2_PBS_LOCATE = _const "Posix_ProcEnv_SC_2_PBS_LOCATE" : C_Int.t; val SC_2_PBS_MESSAGE = _const "Posix_ProcEnv_SC_2_PBS_MESSAGE" : C_Int.t; val SC_2_PBS_TRACK = _const "Posix_ProcEnv_SC_2_PBS_TRACK" : C_Int.t; val SC_2_SW_DEV = _const "Posix_ProcEnv_SC_2_SW_DEV" : C_Int.t; val SC_2_UPE = _const "Posix_ProcEnv_SC_2_UPE" : C_Int.t; val SC_2_VERSION = _const "Posix_ProcEnv_SC_2_VERSION" : C_Int.t; val SC_ADVISORY_INFO = _const "Posix_ProcEnv_SC_ADVISORY_INFO" : C_Int.t; val SC_AIO_LISTIO_MAX = _const "Posix_ProcEnv_SC_AIO_LISTIO_MAX" : C_Int.t; val SC_AIO_MAX = _const "Posix_ProcEnv_SC_AIO_MAX" : C_Int.t; val SC_AIO_PRIO_DELTA_MAX = _const "Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX" : C_Int.t; val SC_ARG_MAX = _const "Posix_ProcEnv_SC_ARG_MAX" : C_Int.t; val SC_ASYNCHRONOUS_IO = _const "Posix_ProcEnv_SC_ASYNCHRONOUS_IO" : C_Int.t; val SC_ATEXIT_MAX = _const "Posix_ProcEnv_SC_ATEXIT_MAX" : C_Int.t; val SC_BARRIERS = _const "Posix_ProcEnv_SC_BARRIERS" : C_Int.t; val SC_BC_BASE_MAX = _const "Posix_ProcEnv_SC_BC_BASE_MAX" : C_Int.t; val SC_BC_DIM_MAX = _const "Posix_ProcEnv_SC_BC_DIM_MAX" : C_Int.t; val SC_BC_SCALE_MAX = _const "Posix_ProcEnv_SC_BC_SCALE_MAX" : C_Int.t; val SC_BC_STRING_MAX = _const "Posix_ProcEnv_SC_BC_STRING_MAX" : C_Int.t; val SC_CHILD_MAX = _const "Posix_ProcEnv_SC_CHILD_MAX" : C_Int.t; val SC_CLK_TCK = _const "Posix_ProcEnv_SC_CLK_TCK" : C_Int.t; val SC_CLOCK_SELECTION = _const "Posix_ProcEnv_SC_CLOCK_SELECTION" : C_Int.t; val SC_COLL_WEIGHTS_MAX = _const "Posix_ProcEnv_SC_COLL_WEIGHTS_MAX" : C_Int.t; val SC_CPUTIME = _const "Posix_ProcEnv_SC_CPUTIME" : C_Int.t; val SC_DELAYTIMER_MAX = _const "Posix_ProcEnv_SC_DELAYTIMER_MAX" : C_Int.t; val SC_EXPR_NEST_MAX = _const "Posix_ProcEnv_SC_EXPR_NEST_MAX" : C_Int.t; val SC_FSYNC = _const "Posix_ProcEnv_SC_FSYNC" : C_Int.t; val SC_GETGR_R_SIZE_MAX = _const "Posix_ProcEnv_SC_GETGR_R_SIZE_MAX" : C_Int.t; val SC_GETPW_R_SIZE_MAX = _const "Posix_ProcEnv_SC_GETPW_R_SIZE_MAX" : C_Int.t; val SC_HOST_NAME_MAX = _const "Posix_ProcEnv_SC_HOST_NAME_MAX" : C_Int.t; val SC_IOV_MAX = _const "Posix_ProcEnv_SC_IOV_MAX" : C_Int.t; val SC_IPV6 = _const "Posix_ProcEnv_SC_IPV6" : C_Int.t; val SC_JOB_CONTROL = _const "Posix_ProcEnv_SC_JOB_CONTROL" : C_Int.t; val SC_LINE_MAX = _const "Posix_ProcEnv_SC_LINE_MAX" : C_Int.t; val SC_LOGIN_NAME_MAX = _const "Posix_ProcEnv_SC_LOGIN_NAME_MAX" : C_Int.t; val SC_MAPPED_FILES = _const "Posix_ProcEnv_SC_MAPPED_FILES" : C_Int.t; val SC_MEMLOCK = _const "Posix_ProcEnv_SC_MEMLOCK" : C_Int.t; val SC_MEMLOCK_RANGE = _const "Posix_ProcEnv_SC_MEMLOCK_RANGE" : C_Int.t; val SC_MEMORY_PROTECTION = _const "Posix_ProcEnv_SC_MEMORY_PROTECTION" : C_Int.t; val SC_MESSAGE_PASSING = _const "Posix_ProcEnv_SC_MESSAGE_PASSING" : C_Int.t; val SC_MONOTONIC_CLOCK = _const "Posix_ProcEnv_SC_MONOTONIC_CLOCK" : C_Int.t; val SC_MQ_OPEN_MAX = _const "Posix_ProcEnv_SC_MQ_OPEN_MAX" : C_Int.t; val SC_MQ_PRIO_MAX = _const "Posix_ProcEnv_SC_MQ_PRIO_MAX" : C_Int.t; val SC_NGROUPS_MAX = _const "Posix_ProcEnv_SC_NGROUPS_MAX" : C_Int.t; val SC_OPEN_MAX = _const "Posix_ProcEnv_SC_OPEN_MAX" : C_Int.t; val SC_PAGE_SIZE = _const "Posix_ProcEnv_SC_PAGE_SIZE" : C_Int.t; val SC_PAGESIZE = _const "Posix_ProcEnv_SC_PAGESIZE" : C_Int.t; val SC_PRIORITIZED_IO = _const "Posix_ProcEnv_SC_PRIORITIZED_IO" : C_Int.t; val SC_PRIORITY_SCHEDULING = _const "Posix_ProcEnv_SC_PRIORITY_SCHEDULING" : C_Int.t; val SC_RAW_SOCKETS = _const "Posix_ProcEnv_SC_RAW_SOCKETS" : C_Int.t; val SC_RE_DUP_MAX = _const "Posix_ProcEnv_SC_RE_DUP_MAX" : C_Int.t; val SC_READER_WRITER_LOCKS = _const "Posix_ProcEnv_SC_READER_WRITER_LOCKS" : C_Int.t; val SC_REALTIME_SIGNALS = _const "Posix_ProcEnv_SC_REALTIME_SIGNALS" : C_Int.t; val SC_REGEXP = _const "Posix_ProcEnv_SC_REGEXP" : C_Int.t; val SC_RTSIG_MAX = _const "Posix_ProcEnv_SC_RTSIG_MAX" : C_Int.t; val SC_SAVED_IDS = _const "Posix_ProcEnv_SC_SAVED_IDS" : C_Int.t; val SC_SEM_NSEMS_MAX = _const "Posix_ProcEnv_SC_SEM_NSEMS_MAX" : C_Int.t; val SC_SEM_VALUE_MAX = _const "Posix_ProcEnv_SC_SEM_VALUE_MAX" : C_Int.t; val SC_SEMAPHORES = _const "Posix_ProcEnv_SC_SEMAPHORES" : C_Int.t; val SC_SHARED_MEMORY_OBJECTS = _const "Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS" : C_Int.t; val SC_SHELL = _const "Posix_ProcEnv_SC_SHELL" : C_Int.t; val SC_SIGQUEUE_MAX = _const "Posix_ProcEnv_SC_SIGQUEUE_MAX" : C_Int.t; val SC_SPAWN = _const "Posix_ProcEnv_SC_SPAWN" : C_Int.t; val SC_SPIN_LOCKS = _const "Posix_ProcEnv_SC_SPIN_LOCKS" : C_Int.t; val SC_SPORADIC_SERVER = _const "Posix_ProcEnv_SC_SPORADIC_SERVER" : C_Int.t; val SC_SS_REPL_MAX = _const "Posix_ProcEnv_SC_SS_REPL_MAX" : C_Int.t; val SC_STREAM_MAX = _const "Posix_ProcEnv_SC_STREAM_MAX" : C_Int.t; val SC_SYMLOOP_MAX = _const "Posix_ProcEnv_SC_SYMLOOP_MAX" : C_Int.t; val SC_SYNCHRONIZED_IO = _const "Posix_ProcEnv_SC_SYNCHRONIZED_IO" : C_Int.t; val SC_THREAD_ATTR_STACKADDR = _const "Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR" : C_Int.t; val SC_THREAD_ATTR_STACKSIZE = _const "Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE" : C_Int.t; val SC_THREAD_CPUTIME = _const "Posix_ProcEnv_SC_THREAD_CPUTIME" : C_Int.t; val SC_THREAD_DESTRUCTOR_ITERATIONS = _const "Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS" : C_Int.t; val SC_THREAD_KEYS_MAX = _const "Posix_ProcEnv_SC_THREAD_KEYS_MAX" : C_Int.t; val SC_THREAD_PRIO_INHERIT = _const "Posix_ProcEnv_SC_THREAD_PRIO_INHERIT" : C_Int.t; val SC_THREAD_PRIO_PROTECT = _const "Posix_ProcEnv_SC_THREAD_PRIO_PROTECT" : C_Int.t; val SC_THREAD_PRIORITY_SCHEDULING = _const "Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING" : C_Int.t; val SC_THREAD_PROCESS_SHARED = _const "Posix_ProcEnv_SC_THREAD_PROCESS_SHARED" : C_Int.t; val SC_THREAD_SAFE_FUNCTIONS = _const "Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS" : C_Int.t; val SC_THREAD_SPORADIC_SERVER = _const "Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER" : C_Int.t; val SC_THREAD_STACK_MIN = _const "Posix_ProcEnv_SC_THREAD_STACK_MIN" : C_Int.t; val SC_THREAD_THREADS_MAX = _const "Posix_ProcEnv_SC_THREAD_THREADS_MAX" : C_Int.t; val SC_THREADS = _const "Posix_ProcEnv_SC_THREADS" : C_Int.t; val SC_TIMEOUTS = _const "Posix_ProcEnv_SC_TIMEOUTS" : C_Int.t; val SC_TIMER_MAX = _const "Posix_ProcEnv_SC_TIMER_MAX" : C_Int.t; val SC_TIMERS = _const "Posix_ProcEnv_SC_TIMERS" : C_Int.t; val SC_TRACE = _const "Posix_ProcEnv_SC_TRACE" : C_Int.t; val SC_TRACE_EVENT_FILTER = _const "Posix_ProcEnv_SC_TRACE_EVENT_FILTER" : C_Int.t; val SC_TRACE_EVENT_NAME_MAX = _const "Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX" : C_Int.t; val SC_TRACE_INHERIT = _const "Posix_ProcEnv_SC_TRACE_INHERIT" : C_Int.t; val SC_TRACE_LOG = _const "Posix_ProcEnv_SC_TRACE_LOG" : C_Int.t; val SC_TRACE_NAME_MAX = _const "Posix_ProcEnv_SC_TRACE_NAME_MAX" : C_Int.t; val SC_TRACE_SYS_MAX = _const "Posix_ProcEnv_SC_TRACE_SYS_MAX" : C_Int.t; val SC_TRACE_USER_EVENT_MAX = _const "Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX" : C_Int.t; val SC_TTY_NAME_MAX = _const "Posix_ProcEnv_SC_TTY_NAME_MAX" : C_Int.t; val SC_TYPED_MEMORY_OBJECTS = _const "Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS" : C_Int.t; val SC_TZNAME_MAX = _const "Posix_ProcEnv_SC_TZNAME_MAX" : C_Int.t; val SC_V6_ILP32_OFF32 = _const "Posix_ProcEnv_SC_V6_ILP32_OFF32" : C_Int.t; val SC_V6_ILP32_OFFBIG = _const "Posix_ProcEnv_SC_V6_ILP32_OFFBIG" : C_Int.t; val SC_V6_LP64_OFF64 = _const "Posix_ProcEnv_SC_V6_LP64_OFF64" : C_Int.t; val SC_V6_LPBIG_OFFBIG = _const "Posix_ProcEnv_SC_V6_LPBIG_OFFBIG" : C_Int.t; val SC_VERSION = _const "Posix_ProcEnv_SC_VERSION" : C_Int.t; val SC_XBS5_ILP32_OFF32 = _const "Posix_ProcEnv_SC_XBS5_ILP32_OFF32" : C_Int.t; val SC_XBS5_ILP32_OFFBIG = _const "Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG" : C_Int.t; val SC_XBS5_LP64_OFF64 = _const "Posix_ProcEnv_SC_XBS5_LP64_OFF64" : C_Int.t; val SC_XBS5_LPBIG_OFFBIG = _const "Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG" : C_Int.t; val SC_XOPEN_CRYPT = _const "Posix_ProcEnv_SC_XOPEN_CRYPT" : C_Int.t; val SC_XOPEN_ENH_I18N = _const "Posix_ProcEnv_SC_XOPEN_ENH_I18N" : C_Int.t; val SC_XOPEN_LEGACY = _const "Posix_ProcEnv_SC_XOPEN_LEGACY" : C_Int.t; val SC_XOPEN_REALTIME = _const "Posix_ProcEnv_SC_XOPEN_REALTIME" : C_Int.t; val SC_XOPEN_REALTIME_THREADS = _const "Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS" : C_Int.t; val SC_XOPEN_SHM = _const "Posix_ProcEnv_SC_XOPEN_SHM" : C_Int.t; val SC_XOPEN_STREAMS = _const "Posix_ProcEnv_SC_XOPEN_STREAMS" : C_Int.t; val SC_XOPEN_UNIX = _const "Posix_ProcEnv_SC_XOPEN_UNIX" : C_Int.t; val SC_XOPEN_VERSION = _const "Posix_ProcEnv_SC_XOPEN_VERSION" : C_Int.t; val setenv = _import "Posix_ProcEnv_setenv" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val setgid = _import "Posix_ProcEnv_setgid" private : C_GId.t -> (C_Int.t) C_Errno.t; val setgroups = _import "Posix_ProcEnv_setgroups" private : C_Int.t * (C_GId.t) vector -> (C_Int.t) C_Errno.t; val setpgid = _import "Posix_ProcEnv_setpgid" private : C_PId.t * C_PId.t -> (C_Int.t) C_Errno.t; val setsid = _import "Posix_ProcEnv_setsid" private : unit -> (C_PId.t) C_Errno.t; val setuid = _import "Posix_ProcEnv_setuid" private : C_UId.t -> (C_Int.t) C_Errno.t; val sysconf = _import "Posix_ProcEnv_sysconf" private : C_Int.t -> (C_Long.t) C_Errno.t; val times = _import "Posix_ProcEnv_times" private : unit -> (C_Clock.t) C_Errno.t; structure Times = struct val getCSTime = _import "Posix_ProcEnv_Times_getCSTime" private : unit -> C_Clock.t; val getCUTime = _import "Posix_ProcEnv_Times_getCUTime" private : unit -> C_Clock.t; val getSTime = _import "Posix_ProcEnv_Times_getSTime" private : unit -> C_Clock.t; val getUTime = _import "Posix_ProcEnv_Times_getUTime" private : unit -> C_Clock.t; end val ttyname = _import "Posix_ProcEnv_ttyname" private : C_Fd.t -> (C_String.t) C_Errno.t; val uname = _import "Posix_ProcEnv_uname" private : unit -> (C_Int.t) C_Errno.t; structure Uname = struct val getMachine = _import "Posix_ProcEnv_Uname_getMachine" private : unit -> C_String.t; val getNodeName = _import "Posix_ProcEnv_Uname_getNodeName" private : unit -> C_String.t; val getRelease = _import "Posix_ProcEnv_Uname_getRelease" private : unit -> C_String.t; val getSysName = _import "Posix_ProcEnv_Uname_getSysName" private : unit -> C_String.t; val getVersion = _import "Posix_ProcEnv_Uname_getVersion" private : unit -> C_String.t; end end structure Process = struct val alarm = _import "Posix_Process_alarm" private : C_UInt.t -> C_UInt.t; val exece = _import "Posix_Process_exece" private : NullString8.t * (NullString8.t) array * (NullString8.t) array -> (C_Int.t) C_Errno.t; val execp = _import "Posix_Process_execp" private : NullString8.t * (NullString8.t) array -> (C_Int.t) C_Errno.t; val exit = _import "Posix_Process_exit" private : C_Status.t -> unit; val exitStatus = _import "Posix_Process_exitStatus" private : C_Status.t -> C_Int.t; val fork = _import "Posix_Process_fork" private : unit -> (C_PId.t) C_Errno.t; val ifExited = _import "Posix_Process_ifExited" private : C_Status.t -> C_Int.t; val ifSignaled = _import "Posix_Process_ifSignaled" private : C_Status.t -> C_Int.t; val ifStopped = _import "Posix_Process_ifStopped" private : C_Status.t -> C_Int.t; val kill = _import "Posix_Process_kill" private : C_PId.t * C_Signal.t -> (C_Int.t) C_Errno.t; val nanosleep = _import "Posix_Process_nanosleep" private : (C_Time.t) ref * (C_Long.t) ref -> (C_Int.t) C_Errno.t; val pause = _import "Posix_Process_pause" private : unit -> (C_Int.t) C_Errno.t; val sleep = _import "Posix_Process_sleep" private : C_UInt.t -> C_UInt.t; val stopSig = _import "Posix_Process_stopSig" private : C_Status.t -> C_Signal.t; val system = _import "Posix_Process_system" private : NullString8.t -> (C_Status.t) C_Errno.t; val termSig = _import "Posix_Process_termSig" private : C_Status.t -> C_Signal.t; structure W = struct val NOHANG = _const "Posix_Process_W_NOHANG" : C_Int.t; val UNTRACED = _const "Posix_Process_W_UNTRACED" : C_Int.t; end val waitpid = _import "Posix_Process_waitpid" private : C_PId.t * (C_Status.t) ref * C_Int.t -> (C_PId.t) C_Errno.t; end structure Signal = struct val default = _import "Posix_Signal_default" private : C_Signal.t -> (C_Int.t) C_Errno.t; val handlee = _import "Posix_Signal_handlee" private : C_Signal.t -> (C_Int.t) C_Errno.t; val handleGC = _import "Posix_Signal_handleGC" private : unit -> unit; val ignore = _import "Posix_Signal_ignore" private : C_Signal.t -> (C_Int.t) C_Errno.t; val isDefault = _import "Posix_Signal_isDefault" private : C_Signal.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val isIgnore = _import "Posix_Signal_isIgnore" private : C_Signal.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val isPending = _import "Posix_Signal_isPending" private : C_Signal.t -> C_Int.t; val isPendingGC = _import "Posix_Signal_isPendingGC" private : unit -> C_Int.t; val NSIG = _const "Posix_Signal_NSIG" : C_Int.t; val resetPending = _import "Posix_Signal_resetPending" private : unit -> unit; val SIG_BLOCK = _const "Posix_Signal_SIG_BLOCK" : C_Int.t; val SIG_SETMASK = _const "Posix_Signal_SIG_SETMASK" : C_Int.t; val SIG_UNBLOCK = _const "Posix_Signal_SIG_UNBLOCK" : C_Int.t; val SIGABRT = _const "Posix_Signal_SIGABRT" : C_Signal.t; val sigaddset = _import "Posix_Signal_sigaddset" private : C_Signal.t -> (C_Int.t) C_Errno.t; val SIGALRM = _const "Posix_Signal_SIGALRM" : C_Signal.t; val SIGBUS = _const "Posix_Signal_SIGBUS" : C_Signal.t; val SIGCHLD = _const "Posix_Signal_SIGCHLD" : C_Signal.t; val SIGCONT = _const "Posix_Signal_SIGCONT" : C_Signal.t; val sigdelset = _import "Posix_Signal_sigdelset" private : C_Signal.t -> (C_Int.t) C_Errno.t; val sigemptyset = _import "Posix_Signal_sigemptyset" private : unit -> (C_Int.t) C_Errno.t; val sigfillset = _import "Posix_Signal_sigfillset" private : unit -> (C_Int.t) C_Errno.t; val SIGFPE = _const "Posix_Signal_SIGFPE" : C_Signal.t; val SIGHUP = _const "Posix_Signal_SIGHUP" : C_Signal.t; val SIGILL = _const "Posix_Signal_SIGILL" : C_Signal.t; val SIGINT = _const "Posix_Signal_SIGINT" : C_Signal.t; val sigismember = _import "Posix_Signal_sigismember" private : C_Signal.t -> (C_Int.t) C_Errno.t; val SIGKILL = _const "Posix_Signal_SIGKILL" : C_Signal.t; val SIGPIPE = _const "Posix_Signal_SIGPIPE" : C_Signal.t; val SIGPOLL = _const "Posix_Signal_SIGPOLL" : C_Signal.t; val sigprocmask = _import "Posix_Signal_sigprocmask" private : C_Int.t -> (C_Int.t) C_Errno.t; val SIGPROF = _const "Posix_Signal_SIGPROF" : C_Signal.t; val SIGQUIT = _const "Posix_Signal_SIGQUIT" : C_Signal.t; val SIGSEGV = _const "Posix_Signal_SIGSEGV" : C_Signal.t; val SIGSTOP = _const "Posix_Signal_SIGSTOP" : C_Signal.t; val sigsuspend = _import "Posix_Signal_sigsuspend" private : unit -> unit; val SIGSYS = _const "Posix_Signal_SIGSYS" : C_Signal.t; val SIGTERM = _const "Posix_Signal_SIGTERM" : C_Signal.t; val SIGTRAP = _const "Posix_Signal_SIGTRAP" : C_Signal.t; val SIGTSTP = _const "Posix_Signal_SIGTSTP" : C_Signal.t; val SIGTTIN = _const "Posix_Signal_SIGTTIN" : C_Signal.t; val SIGTTOU = _const "Posix_Signal_SIGTTOU" : C_Signal.t; val SIGURG = _const "Posix_Signal_SIGURG" : C_Signal.t; val SIGUSR1 = _const "Posix_Signal_SIGUSR1" : C_Signal.t; val SIGUSR2 = _const "Posix_Signal_SIGUSR2" : C_Signal.t; val SIGVTALRM = _const "Posix_Signal_SIGVTALRM" : C_Signal.t; val SIGXCPU = _const "Posix_Signal_SIGXCPU" : C_Signal.t; val SIGXFSZ = _const "Posix_Signal_SIGXFSZ" : C_Signal.t; end structure SysDB = struct val getgrgid = _import "Posix_SysDB_getgrgid" private : C_GId.t -> (C_Int.t) C_Errno.t; val getgrnam = _import "Posix_SysDB_getgrnam" private : NullString8.t -> (C_Int.t) C_Errno.t; val getpwnam = _import "Posix_SysDB_getpwnam" private : NullString8.t -> (C_Int.t) C_Errno.t; val getpwuid = _import "Posix_SysDB_getpwuid" private : C_GId.t -> (C_Int.t) C_Errno.t; structure Group = struct val getGId = _import "Posix_SysDB_Group_getGId" private : unit -> C_GId.t; val getMem = _import "Posix_SysDB_Group_getMem" private : unit -> C_StringArray.t; val getName = _import "Posix_SysDB_Group_getName" private : unit -> C_String.t; end structure Passwd = struct val getDir = _import "Posix_SysDB_Passwd_getDir" private : unit -> C_String.t; val getGId = _import "Posix_SysDB_Passwd_getGId" private : unit -> C_GId.t; val getName = _import "Posix_SysDB_Passwd_getName" private : unit -> C_String.t; val getShell = _import "Posix_SysDB_Passwd_getShell" private : unit -> C_String.t; val getUId = _import "Posix_SysDB_Passwd_getUId" private : unit -> C_UId.t; end end structure TTY = struct val B0 = _const "Posix_TTY_B0" : C_Speed.t; val B110 = _const "Posix_TTY_B110" : C_Speed.t; val B1200 = _const "Posix_TTY_B1200" : C_Speed.t; val B134 = _const "Posix_TTY_B134" : C_Speed.t; val B150 = _const "Posix_TTY_B150" : C_Speed.t; val B1800 = _const "Posix_TTY_B1800" : C_Speed.t; val B19200 = _const "Posix_TTY_B19200" : C_Speed.t; val B200 = _const "Posix_TTY_B200" : C_Speed.t; val B2400 = _const "Posix_TTY_B2400" : C_Speed.t; val B300 = _const "Posix_TTY_B300" : C_Speed.t; val B38400 = _const "Posix_TTY_B38400" : C_Speed.t; val B4800 = _const "Posix_TTY_B4800" : C_Speed.t; val B50 = _const "Posix_TTY_B50" : C_Speed.t; val B600 = _const "Posix_TTY_B600" : C_Speed.t; val B75 = _const "Posix_TTY_B75" : C_Speed.t; val B9600 = _const "Posix_TTY_B9600" : C_Speed.t; structure C = struct val CLOCAL = _const "Posix_TTY_C_CLOCAL" : C_TCFlag.t; val CREAD = _const "Posix_TTY_C_CREAD" : C_TCFlag.t; val CS5 = _const "Posix_TTY_C_CS5" : C_TCFlag.t; val CS6 = _const "Posix_TTY_C_CS6" : C_TCFlag.t; val CS7 = _const "Posix_TTY_C_CS7" : C_TCFlag.t; val CS8 = _const "Posix_TTY_C_CS8" : C_TCFlag.t; val CSIZE = _const "Posix_TTY_C_CSIZE" : C_TCFlag.t; val CSTOPB = _const "Posix_TTY_C_CSTOPB" : C_TCFlag.t; val HUPCL = _const "Posix_TTY_C_HUPCL" : C_TCFlag.t; val PARENB = _const "Posix_TTY_C_PARENB" : C_TCFlag.t; val PARODD = _const "Posix_TTY_C_PARODD" : C_TCFlag.t; end structure I = struct val BRKINT = _const "Posix_TTY_I_BRKINT" : C_TCFlag.t; val ICRNL = _const "Posix_TTY_I_ICRNL" : C_TCFlag.t; val IGNBRK = _const "Posix_TTY_I_IGNBRK" : C_TCFlag.t; val IGNCR = _const "Posix_TTY_I_IGNCR" : C_TCFlag.t; val IGNPAR = _const "Posix_TTY_I_IGNPAR" : C_TCFlag.t; val INLCR = _const "Posix_TTY_I_INLCR" : C_TCFlag.t; val INPCK = _const "Posix_TTY_I_INPCK" : C_TCFlag.t; val ISTRIP = _const "Posix_TTY_I_ISTRIP" : C_TCFlag.t; val IXANY = _const "Posix_TTY_I_IXANY" : C_TCFlag.t; val IXOFF = _const "Posix_TTY_I_IXOFF" : C_TCFlag.t; val IXON = _const "Posix_TTY_I_IXON" : C_TCFlag.t; val PARMRK = _const "Posix_TTY_I_PARMRK" : C_TCFlag.t; end structure L = struct val ECHO = _const "Posix_TTY_L_ECHO" : C_TCFlag.t; val ECHOE = _const "Posix_TTY_L_ECHOE" : C_TCFlag.t; val ECHOK = _const "Posix_TTY_L_ECHOK" : C_TCFlag.t; val ECHONL = _const "Posix_TTY_L_ECHONL" : C_TCFlag.t; val ICANON = _const "Posix_TTY_L_ICANON" : C_TCFlag.t; val IEXTEN = _const "Posix_TTY_L_IEXTEN" : C_TCFlag.t; val ISIG = _const "Posix_TTY_L_ISIG" : C_TCFlag.t; val NOFLSH = _const "Posix_TTY_L_NOFLSH" : C_TCFlag.t; val TOSTOP = _const "Posix_TTY_L_TOSTOP" : C_TCFlag.t; end structure O = struct val BS0 = _const "Posix_TTY_O_BS0" : C_TCFlag.t; val BS1 = _const "Posix_TTY_O_BS1" : C_TCFlag.t; val BSDLY = _const "Posix_TTY_O_BSDLY" : C_TCFlag.t; val CR0 = _const "Posix_TTY_O_CR0" : C_TCFlag.t; val CR1 = _const "Posix_TTY_O_CR1" : C_TCFlag.t; val CR2 = _const "Posix_TTY_O_CR2" : C_TCFlag.t; val CR3 = _const "Posix_TTY_O_CR3" : C_TCFlag.t; val CRDLY = _const "Posix_TTY_O_CRDLY" : C_TCFlag.t; val FF0 = _const "Posix_TTY_O_FF0" : C_TCFlag.t; val FF1 = _const "Posix_TTY_O_FF1" : C_TCFlag.t; val FFDLY = _const "Posix_TTY_O_FFDLY" : C_TCFlag.t; val NL0 = _const "Posix_TTY_O_NL0" : C_TCFlag.t; val NL1 = _const "Posix_TTY_O_NL1" : C_TCFlag.t; val NLDLY = _const "Posix_TTY_O_NLDLY" : C_TCFlag.t; val OCRNL = _const "Posix_TTY_O_OCRNL" : C_TCFlag.t; val OFILL = _const "Posix_TTY_O_OFILL" : C_TCFlag.t; val ONLCR = _const "Posix_TTY_O_ONLCR" : C_TCFlag.t; val ONLRET = _const "Posix_TTY_O_ONLRET" : C_TCFlag.t; val ONOCR = _const "Posix_TTY_O_ONOCR" : C_TCFlag.t; val OPOST = _const "Posix_TTY_O_OPOST" : C_TCFlag.t; val TAB0 = _const "Posix_TTY_O_TAB0" : C_TCFlag.t; val TAB1 = _const "Posix_TTY_O_TAB1" : C_TCFlag.t; val TAB2 = _const "Posix_TTY_O_TAB2" : C_TCFlag.t; val TAB3 = _const "Posix_TTY_O_TAB3" : C_TCFlag.t; val TABDLY = _const "Posix_TTY_O_TABDLY" : C_TCFlag.t; val VT0 = _const "Posix_TTY_O_VT0" : C_TCFlag.t; val VT1 = _const "Posix_TTY_O_VT1" : C_TCFlag.t; val VTDLY = _const "Posix_TTY_O_VTDLY" : C_TCFlag.t; end structure TC = struct val drain = _import "Posix_TTY_TC_drain" private : C_Fd.t -> (C_Int.t) C_Errno.t; val flow = _import "Posix_TTY_TC_flow" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val flush = _import "Posix_TTY_TC_flush" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val getattr = _import "Posix_TTY_TC_getattr" private : C_Fd.t -> (C_Int.t) C_Errno.t; val getpgrp = _import "Posix_TTY_TC_getpgrp" private : C_Fd.t -> (C_PId.t) C_Errno.t; val sendbreak = _import "Posix_TTY_TC_sendbreak" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val setattr = _import "Posix_TTY_TC_setattr" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val setpgrp = _import "Posix_TTY_TC_setpgrp" private : C_Fd.t * C_PId.t -> (C_Int.t) C_Errno.t; val TCIFLUSH = _const "Posix_TTY_TC_TCIFLUSH" : C_Int.t; val TCIOFF = _const "Posix_TTY_TC_TCIOFF" : C_Int.t; val TCIOFLUSH = _const "Posix_TTY_TC_TCIOFLUSH" : C_Int.t; val TCION = _const "Posix_TTY_TC_TCION" : C_Int.t; val TCOFLUSH = _const "Posix_TTY_TC_TCOFLUSH" : C_Int.t; val TCOOFF = _const "Posix_TTY_TC_TCOOFF" : C_Int.t; val TCOON = _const "Posix_TTY_TC_TCOON" : C_Int.t; val TCSADRAIN = _const "Posix_TTY_TC_TCSADRAIN" : C_Int.t; val TCSAFLUSH = _const "Posix_TTY_TC_TCSAFLUSH" : C_Int.t; val TCSANOW = _const "Posix_TTY_TC_TCSANOW" : C_Int.t; end structure Termios = struct val cfGetISpeed = _import "Posix_TTY_Termios_cfGetISpeed" private : unit -> C_Speed.t; val cfGetOSpeed = _import "Posix_TTY_Termios_cfGetOSpeed" private : unit -> C_Speed.t; val cfSetISpeed = _import "Posix_TTY_Termios_cfSetISpeed" private : C_Speed.t -> (C_Int.t) C_Errno.t; val cfSetOSpeed = _import "Posix_TTY_Termios_cfSetOSpeed" private : C_Speed.t -> (C_Int.t) C_Errno.t; val getCC = _import "Posix_TTY_Termios_getCC" private : (C_CC.t) array -> unit; val getCFlag = _import "Posix_TTY_Termios_getCFlag" private : unit -> C_TCFlag.t; val getIFlag = _import "Posix_TTY_Termios_getIFlag" private : unit -> C_TCFlag.t; val getLFlag = _import "Posix_TTY_Termios_getLFlag" private : unit -> C_TCFlag.t; val getOFlag = _import "Posix_TTY_Termios_getOFlag" private : unit -> C_TCFlag.t; val setCC = _import "Posix_TTY_Termios_setCC" private : (C_CC.t) array -> unit; val setCFlag = _import "Posix_TTY_Termios_setCFlag" private : C_TCFlag.t -> unit; val setIFlag = _import "Posix_TTY_Termios_setIFlag" private : C_TCFlag.t -> unit; val setLFlag = _import "Posix_TTY_Termios_setLFlag" private : C_TCFlag.t -> unit; val setOFlag = _import "Posix_TTY_Termios_setOFlag" private : C_TCFlag.t -> unit; end structure V = struct val NCCS = _const "Posix_TTY_V_NCCS" : C_Int.t; val VEOF = _const "Posix_TTY_V_VEOF" : C_Int.t; val VEOL = _const "Posix_TTY_V_VEOL" : C_Int.t; val VERASE = _const "Posix_TTY_V_VERASE" : C_Int.t; val VINTR = _const "Posix_TTY_V_VINTR" : C_Int.t; val VKILL = _const "Posix_TTY_V_VKILL" : C_Int.t; val VMIN = _const "Posix_TTY_V_VMIN" : C_Int.t; val VQUIT = _const "Posix_TTY_V_VQUIT" : C_Int.t; val VSTART = _const "Posix_TTY_V_VSTART" : C_Int.t; val VSTOP = _const "Posix_TTY_V_VSTOP" : C_Int.t; val VSUSP = _const "Posix_TTY_V_VSUSP" : C_Int.t; val VTIME = _const "Posix_TTY_V_VTIME" : C_Int.t; end end end structure Real32 = struct type t = Real32.t val abs = _import "Real32_abs" private : Real32.t -> Real32.t; val add = _import "Real32_add" private : Real32.t * Real32.t -> Real32.t; val castToWord32 = _import "Real32_castToWord32" private : Real32.t -> Word32.t; val class = _import "Real32_class" private : Real32.t -> C_Int.t; val div = _import "Real32_div" private : Real32.t * Real32.t -> Real32.t; val equal = _import "Real32_equal" private : Real32.t * Real32.t -> Bool.t; val fetch = _import "Real32_fetch" private : (Real32.t) ref -> Real32.t; val frexp = _import "Real32_frexp" private : Real32.t * (C_Int.t) ref -> Real32.t; val gdtoa = _import "Real32_gdtoa" private : Real32.t * C_Int.t * C_Int.t * C_Int.t * (C_Int.t) ref -> C_String.t; val ldexp = _import "Real32_ldexp" private : Real32.t * C_Int.t -> Real32.t; val le = _import "Real32_le" private : Real32.t * Real32.t -> Bool.t; val lt = _import "Real32_lt" private : Real32.t * Real32.t -> Bool.t; structure Math = struct val acos = _import "Real32_Math_acos" private : Real32.t -> Real32.t; val asin = _import "Real32_Math_asin" private : Real32.t -> Real32.t; val atan = _import "Real32_Math_atan" private : Real32.t -> Real32.t; val atan2 = _import "Real32_Math_atan2" private : Real32.t * Real32.t -> Real32.t; val cos = _import "Real32_Math_cos" private : Real32.t -> Real32.t; val cosh = _import "Real32_Math_cosh" private : Real32.t -> Real32.t; val (eGet, eSet) = _symbol "Real32_Math_e" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val exp = _import "Real32_Math_exp" private : Real32.t -> Real32.t; val ln = _import "Real32_Math_ln" private : Real32.t -> Real32.t; val log10 = _import "Real32_Math_log10" private : Real32.t -> Real32.t; val (piGet, piSet) = _symbol "Real32_Math_pi" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val pow = _import "Real32_Math_pow" private : Real32.t * Real32.t -> Real32.t; val sin = _import "Real32_Math_sin" private : Real32.t -> Real32.t; val sinh = _import "Real32_Math_sinh" private : Real32.t -> Real32.t; val sqrt = _import "Real32_Math_sqrt" private : Real32.t -> Real32.t; val tan = _import "Real32_Math_tan" private : Real32.t -> Real32.t; val tanh = _import "Real32_Math_tanh" private : Real32.t -> Real32.t; end val (maxFiniteGet, maxFiniteSet) = _symbol "Real32_maxFinite" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val (minNormalPosGet, minNormalPosSet) = _symbol "Real32_minNormalPos" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val (minPosGet, minPosSet) = _symbol "Real32_minPos" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val modf = _import "Real32_modf" private : Real32.t * (Real32.t) ref -> Real32.t; val move = _import "Real32_move" private : (Real32.t) ref * (Real32.t) ref -> unit; val mul = _import "Real32_mul" private : Real32.t * Real32.t -> Real32.t; val muladd = _import "Real32_muladd" private : Real32.t * Real32.t * Real32.t -> Real32.t; val mulsub = _import "Real32_mulsub" private : Real32.t * Real32.t * Real32.t -> Real32.t; val neg = _import "Real32_neg" private : Real32.t -> Real32.t; val rndToReal32 = _import "Real32_rndToReal32" private : Real32.t -> Real32.t; val rndToReal64 = _import "Real32_rndToReal64" private : Real32.t -> Real64.t; val rndToWordS16 = _import "Real32_rndToWordS16" private : Real32.t -> Int16.t; val rndToWordS32 = _import "Real32_rndToWordS32" private : Real32.t -> Int32.t; val rndToWordS64 = _import "Real32_rndToWordS64" private : Real32.t -> Int64.t; val rndToWordS8 = _import "Real32_rndToWordS8" private : Real32.t -> Int8.t; val rndToWordU16 = _import "Real32_rndToWordU16" private : Real32.t -> Word16.t; val rndToWordU32 = _import "Real32_rndToWordU32" private : Real32.t -> Word32.t; val rndToWordU64 = _import "Real32_rndToWordU64" private : Real32.t -> Word64.t; val rndToWordU8 = _import "Real32_rndToWordU8" private : Real32.t -> Word8.t; val round = _import "Real32_round" private : Real32.t -> Real32.t; val signBit = _import "Real32_signBit" private : Real32.t -> C_Int.t; val store = _import "Real32_store" private : (Real32.t) ref * Real32.t -> unit; val strto = _import "Real32_strto" private : NullString8.t * C_Int.t -> Real32.t; val sub = _import "Real32_sub" private : Real32.t * Real32.t -> Real32.t; end structure Real64 = struct type t = Real64.t val abs = _import "Real64_abs" private : Real64.t -> Real64.t; val add = _import "Real64_add" private : Real64.t * Real64.t -> Real64.t; val castToWord64 = _import "Real64_castToWord64" private : Real64.t -> Word64.t; val class = _import "Real64_class" private : Real64.t -> C_Int.t; val div = _import "Real64_div" private : Real64.t * Real64.t -> Real64.t; val equal = _import "Real64_equal" private : Real64.t * Real64.t -> Bool.t; val fetch = _import "Real64_fetch" private : (Real64.t) ref -> Real64.t; val frexp = _import "Real64_frexp" private : Real64.t * (C_Int.t) ref -> Real64.t; val gdtoa = _import "Real64_gdtoa" private : Real64.t * C_Int.t * C_Int.t * C_Int.t * (C_Int.t) ref -> C_String.t; val ldexp = _import "Real64_ldexp" private : Real64.t * C_Int.t -> Real64.t; val le = _import "Real64_le" private : Real64.t * Real64.t -> Bool.t; val lt = _import "Real64_lt" private : Real64.t * Real64.t -> Bool.t; structure Math = struct val acos = _import "Real64_Math_acos" private : Real64.t -> Real64.t; val asin = _import "Real64_Math_asin" private : Real64.t -> Real64.t; val atan = _import "Real64_Math_atan" private : Real64.t -> Real64.t; val atan2 = _import "Real64_Math_atan2" private : Real64.t * Real64.t -> Real64.t; val cos = _import "Real64_Math_cos" private : Real64.t -> Real64.t; val cosh = _import "Real64_Math_cosh" private : Real64.t -> Real64.t; val (eGet, eSet) = _symbol "Real64_Math_e" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val exp = _import "Real64_Math_exp" private : Real64.t -> Real64.t; val ln = _import "Real64_Math_ln" private : Real64.t -> Real64.t; val log10 = _import "Real64_Math_log10" private : Real64.t -> Real64.t; val (piGet, piSet) = _symbol "Real64_Math_pi" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val pow = _import "Real64_Math_pow" private : Real64.t * Real64.t -> Real64.t; val sin = _import "Real64_Math_sin" private : Real64.t -> Real64.t; val sinh = _import "Real64_Math_sinh" private : Real64.t -> Real64.t; val sqrt = _import "Real64_Math_sqrt" private : Real64.t -> Real64.t; val tan = _import "Real64_Math_tan" private : Real64.t -> Real64.t; val tanh = _import "Real64_Math_tanh" private : Real64.t -> Real64.t; end val (maxFiniteGet, maxFiniteSet) = _symbol "Real64_maxFinite" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val (minNormalPosGet, minNormalPosSet) = _symbol "Real64_minNormalPos" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val (minPosGet, minPosSet) = _symbol "Real64_minPos" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val modf = _import "Real64_modf" private : Real64.t * (Real64.t) ref -> Real64.t; val move = _import "Real64_move" private : (Real64.t) ref * (Real64.t) ref -> unit; val mul = _import "Real64_mul" private : Real64.t * Real64.t -> Real64.t; val muladd = _import "Real64_muladd" private : Real64.t * Real64.t * Real64.t -> Real64.t; val mulsub = _import "Real64_mulsub" private : Real64.t * Real64.t * Real64.t -> Real64.t; val neg = _import "Real64_neg" private : Real64.t -> Real64.t; val rndToReal32 = _import "Real64_rndToReal32" private : Real64.t -> Real32.t; val rndToReal64 = _import "Real64_rndToReal64" private : Real64.t -> Real64.t; val rndToWordS16 = _import "Real64_rndToWordS16" private : Real64.t -> Int16.t; val rndToWordS32 = _import "Real64_rndToWordS32" private : Real64.t -> Int32.t; val rndToWordS64 = _import "Real64_rndToWordS64" private : Real64.t -> Int64.t; val rndToWordS8 = _import "Real64_rndToWordS8" private : Real64.t -> Int8.t; val rndToWordU16 = _import "Real64_rndToWordU16" private : Real64.t -> Word16.t; val rndToWordU32 = _import "Real64_rndToWordU32" private : Real64.t -> Word32.t; val rndToWordU64 = _import "Real64_rndToWordU64" private : Real64.t -> Word64.t; val rndToWordU8 = _import "Real64_rndToWordU8" private : Real64.t -> Word8.t; val round = _import "Real64_round" private : Real64.t -> Real64.t; val signBit = _import "Real64_signBit" private : Real64.t -> C_Int.t; val store = _import "Real64_store" private : (Real64.t) ref * Real64.t -> unit; val strto = _import "Real64_strto" private : NullString8.t * C_Int.t -> Real64.t; val sub = _import "Real64_sub" private : Real64.t * Real64.t -> Real64.t; end structure Socket = struct val accept = _import "Socket_accept" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; structure AF = struct val INET = _const "Socket_AF_INET" : C_Int.t; val INET6 = _const "Socket_AF_INET6" : C_Int.t; val UNIX = _const "Socket_AF_UNIX" : C_Int.t; val UNSPEC = _const "Socket_AF_UNSPEC" : C_Int.t; end val bind = _import "Socket_bind" private : C_Sock.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; val close = _import "Socket_close" private : C_Sock.t -> (C_Int.t) C_Errno.t; val connect = _import "Socket_connect" private : C_Sock.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; structure Ctl = struct val FIONBIO = _const "Socket_Ctl_FIONBIO" : C_Int.t; val FIONREAD = _const "Socket_Ctl_FIONREAD" : C_Int.t; val getIOCtl = _import "Socket_Ctl_getIOCtl" private : C_Sock.t * C_Int.t * (Word8.t) array -> (C_Int.t) C_Errno.t; val getPeerName = _import "Socket_Ctl_getPeerName" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val getSockName = _import "Socket_Ctl_getSockName" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val getSockOpt = _import "Socket_Ctl_getSockOpt" private : C_Sock.t * C_Int.t * C_Int.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val setIOCtl = _import "Socket_Ctl_setIOCtl" private : C_Sock.t * C_Int.t * (Word8.t) vector -> (C_Int.t) C_Errno.t; val setSockOpt = _import "Socket_Ctl_setSockOpt" private : C_Sock.t * C_Int.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; val SIOCATMARK = _const "Socket_Ctl_SIOCATMARK" : C_Int.t; val SO_ACCEPTCONN = _const "Socket_Ctl_SO_ACCEPTCONN" : C_Int.t; val SO_BROADCAST = _const "Socket_Ctl_SO_BROADCAST" : C_Int.t; val SO_DEBUG = _const "Socket_Ctl_SO_DEBUG" : C_Int.t; val SO_DONTROUTE = _const "Socket_Ctl_SO_DONTROUTE" : C_Int.t; val SO_ERROR = _const "Socket_Ctl_SO_ERROR" : C_Int.t; val SO_KEEPALIVE = _const "Socket_Ctl_SO_KEEPALIVE" : C_Int.t; val SO_LINGER = _const "Socket_Ctl_SO_LINGER" : C_Int.t; val SO_OOBINLINE = _const "Socket_Ctl_SO_OOBINLINE" : C_Int.t; val SO_RCVBUF = _const "Socket_Ctl_SO_RCVBUF" : C_Int.t; val SO_RCVLOWAT = _const "Socket_Ctl_SO_RCVLOWAT" : C_Int.t; val SO_RCVTIMEO = _const "Socket_Ctl_SO_RCVTIMEO" : C_Int.t; val SO_REUSEADDR = _const "Socket_Ctl_SO_REUSEADDR" : C_Int.t; val SO_SNDBUF = _const "Socket_Ctl_SO_SNDBUF" : C_Int.t; val SO_SNDLOWAT = _const "Socket_Ctl_SO_SNDLOWAT" : C_Int.t; val SO_SNDTIMEO = _const "Socket_Ctl_SO_SNDTIMEO" : C_Int.t; val SO_TYPE = _const "Socket_Ctl_SO_TYPE" : C_Int.t; val SOL_SOCKET = _const "Socket_Ctl_SOL_SOCKET" : C_Int.t; end val familyOfAddr = _import "Socket_familyOfAddr" private : (Word8.t) vector -> C_Int.t; structure GenericSock = struct val socket = _import "Socket_GenericSock_socket" private : C_Int.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; val socketPair = _import "Socket_GenericSock_socketPair" private : C_Int.t * C_Int.t * C_Int.t * (C_Int.t) array -> (C_Int.t) C_Errno.t; end val getTimeout_sec = _import "Socket_getTimeout_sec" private : unit -> C_Time.t; val getTimeout_usec = _import "Socket_getTimeout_usec" private : unit -> C_SUSeconds.t; structure INetSock = struct structure Ctl = struct val IPPROTO_TCP = _const "Socket_INetSock_Ctl_IPPROTO_TCP" : C_Int.t; val TCP_NODELAY = _const "Socket_INetSock_Ctl_TCP_NODELAY" : C_Int.t; end val fromAddr = _import "Socket_INetSock_fromAddr" private : (Word8.t) vector -> unit; val getInAddr = _import "Socket_INetSock_getInAddr" private : (Word8.t) array -> unit; val getPort = _import "Socket_INetSock_getPort" private : unit -> Word16.t; val toAddr = _import "Socket_INetSock_toAddr" private : (Word8.t) vector * Word16.t * (Word8.t) array * (C_Socklen.t) ref -> unit; end val listen = _import "Socket_listen" private : C_Sock.t * C_Int.t -> (C_Int.t) C_Errno.t; val MSG_CTRUNC = _const "Socket_MSG_CTRUNC" : C_Int.t; val MSG_DONTROUTE = _const "Socket_MSG_DONTROUTE" : C_Int.t; val MSG_DONTWAIT = _const "Socket_MSG_DONTWAIT" : C_Int.t; val MSG_EOR = _const "Socket_MSG_EOR" : C_Int.t; val MSG_OOB = _const "Socket_MSG_OOB" : C_Int.t; val MSG_PEEK = _const "Socket_MSG_PEEK" : C_Int.t; val MSG_TRUNC = _const "Socket_MSG_TRUNC" : C_Int.t; val MSG_WAITALL = _const "Socket_MSG_WAITALL" : C_Int.t; val recv = _import "Socket_recv" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val recvFrom = _import "Socket_recvFrom" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t * (Word8.t) array * (C_Socklen.t) ref -> (C_SSize.t) C_Errno.t; val select = _import "Socket_select" private : (C_Fd.t) vector * (C_Fd.t) vector * (C_Fd.t) vector * (C_Int.t) array * (C_Int.t) array * (C_Int.t) array -> (C_Int.t) C_Errno.t; val sendArr = _import "Socket_sendArr" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val sendArrTo = _import "Socket_sendArrTo" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_SSize.t) C_Errno.t; val sendVec = _import "Socket_sendVec" private : C_Sock.t * (Word8.t) vector * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val sendVecTo = _import "Socket_sendVecTo" private : C_Sock.t * (Word8.t) vector * C_Int.t * C_Size.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_SSize.t) C_Errno.t; val setTimeout = _import "Socket_setTimeout" private : C_Time.t * C_SUSeconds.t -> unit; val setTimeoutNull = _import "Socket_setTimeoutNull" private : unit -> unit; val SHUT_RD = _const "Socket_SHUT_RD" : C_Int.t; val SHUT_RDWR = _const "Socket_SHUT_RDWR" : C_Int.t; val SHUT_WR = _const "Socket_SHUT_WR" : C_Int.t; val shutdown = _import "Socket_shutdown" private : C_Sock.t * C_Int.t -> (C_Int.t) C_Errno.t; structure SOCK = struct val DGRAM = _const "Socket_SOCK_DGRAM" : C_Int.t; val RAW = _const "Socket_SOCK_RAW" : C_Int.t; val SEQPACKET = _const "Socket_SOCK_SEQPACKET" : C_Int.t; val STREAM = _const "Socket_SOCK_STREAM" : C_Int.t; end val sockAddrStorageLen = _const "Socket_sockAddrStorageLen" : C_Size.t; structure UnixSock = struct val fromAddr = _import "Socket_UnixSock_fromAddr" private : (Word8.t) vector * (Char8.t) array * C_Size.t -> unit; val pathLen = _import "Socket_UnixSock_pathLen" private : (Word8.t) vector -> C_Size.t; val toAddr = _import "Socket_UnixSock_toAddr" private : NullString8.t * C_Size.t * (Word8.t) array * (C_Socklen.t) ref -> unit; end end structure Stdio = struct val print = _import "Stdio_print" private : String8.t -> unit; val printStderr = _import "Stdio_printStderr" private : String8.t -> unit; val printStdout = _import "Stdio_printStdout" private : String8.t -> unit; end structure Time = struct val getTimeOfDay = _import "Time_getTimeOfDay" private : (C_Time.t) ref * (C_SUSeconds.t) ref -> C_Int.t; end structure Windows = struct structure Process = struct val create = _import "Windows_Process_create" private : NullString8.t * NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> (C_PId.t) C_Errno.t; val createNull = _import "Windows_Process_createNull" private : NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> (C_PId.t) C_Errno.t; val getexitcode = _import "Windows_Process_getexitcode" private : C_PId.t * (C_Status.t) ref -> (C_Int.t) C_Errno.t; val terminate = _import "Windows_Process_terminate" private : C_PId.t * C_Signal.t -> (C_Int.t) C_Errno.t; end end structure Word16 = struct type t = Word16.t val add = _import "Word16_add" private : Word16.t * Word16.t -> Word16.t; val andb = _import "Word16_andb" private : Word16.t * Word16.t -> Word16.t; val equal = _import "Word16_equal" private : Word16.t * Word16.t -> Bool.t; val lshift = _import "Word16_lshift" private : Word16.t * Word32.t -> Word16.t; val neg = _import "Word16_neg" private : Word16.t -> Word16.t; val notb = _import "Word16_notb" private : Word16.t -> Word16.t; val orb = _import "Word16_orb" private : Word16.t * Word16.t -> Word16.t; val rol = _import "Word16_rol" private : Word16.t * Word32.t -> Word16.t; val ror = _import "Word16_ror" private : Word16.t * Word32.t -> Word16.t; val sub = _import "Word16_sub" private : Word16.t * Word16.t -> Word16.t; val xorb = _import "Word16_xorb" private : Word16.t * Word16.t -> Word16.t; end structure Word32 = struct type t = Word32.t val add = _import "Word32_add" private : Word32.t * Word32.t -> Word32.t; val andb = _import "Word32_andb" private : Word32.t * Word32.t -> Word32.t; val castToReal32 = _import "Word32_castToReal32" private : Word32.t -> Real32.t; val equal = _import "Word32_equal" private : Word32.t * Word32.t -> Bool.t; val lshift = _import "Word32_lshift" private : Word32.t * Word32.t -> Word32.t; val neg = _import "Word32_neg" private : Word32.t -> Word32.t; val notb = _import "Word32_notb" private : Word32.t -> Word32.t; val orb = _import "Word32_orb" private : Word32.t * Word32.t -> Word32.t; val rol = _import "Word32_rol" private : Word32.t * Word32.t -> Word32.t; val ror = _import "Word32_ror" private : Word32.t * Word32.t -> Word32.t; val sub = _import "Word32_sub" private : Word32.t * Word32.t -> Word32.t; val xorb = _import "Word32_xorb" private : Word32.t * Word32.t -> Word32.t; end structure Word64 = struct type t = Word64.t val add = _import "Word64_add" private : Word64.t * Word64.t -> Word64.t; val andb = _import "Word64_andb" private : Word64.t * Word64.t -> Word64.t; val castToReal64 = _import "Word64_castToReal64" private : Word64.t -> Real64.t; val equal = _import "Word64_equal" private : Word64.t * Word64.t -> Bool.t; val fetch = _import "Word64_fetch" private : (Word64.t) ref -> Word64.t; val lshift = _import "Word64_lshift" private : Word64.t * Word32.t -> Word64.t; val move = _import "Word64_move" private : (Word64.t) ref * (Word64.t) ref -> unit; val neg = _import "Word64_neg" private : Word64.t -> Word64.t; val notb = _import "Word64_notb" private : Word64.t -> Word64.t; val orb = _import "Word64_orb" private : Word64.t * Word64.t -> Word64.t; val rol = _import "Word64_rol" private : Word64.t * Word32.t -> Word64.t; val ror = _import "Word64_ror" private : Word64.t * Word32.t -> Word64.t; val store = _import "Word64_store" private : (Word64.t) ref * Word64.t -> unit; val sub = _import "Word64_sub" private : Word64.t * Word64.t -> Word64.t; val xorb = _import "Word64_xorb" private : Word64.t * Word64.t -> Word64.t; end structure Word8 = struct type t = Word8.t val add = _import "Word8_add" private : Word8.t * Word8.t -> Word8.t; val andb = _import "Word8_andb" private : Word8.t * Word8.t -> Word8.t; val equal = _import "Word8_equal" private : Word8.t * Word8.t -> Bool.t; val lshift = _import "Word8_lshift" private : Word8.t * Word32.t -> Word8.t; val neg = _import "Word8_neg" private : Word8.t -> Word8.t; val notb = _import "Word8_notb" private : Word8.t -> Word8.t; val orb = _import "Word8_orb" private : Word8.t * Word8.t -> Word8.t; val rol = _import "Word8_rol" private : Word8.t * Word32.t -> Word8.t; val ror = _import "Word8_ror" private : Word8.t * Word32.t -> Word8.t; val sub = _import "Word8_sub" private : Word8.t * Word8.t -> Word8.t; val xorb = _import "Word8_xorb" private : Word8.t * Word8.t -> Word8.t; end structure WordS16 = struct val addCheckOverflows = _import "WordS16_addCheckOverflows" private : Int16.t * Int16.t -> Bool.t; val extdToWord16 = _import "WordS16_extdToWord16" private : Int16.t -> Word16.t; val extdToWord32 = _import "WordS16_extdToWord32" private : Int16.t -> Word32.t; val extdToWord64 = _import "WordS16_extdToWord64" private : Int16.t -> Word64.t; val extdToWord8 = _import "WordS16_extdToWord8" private : Int16.t -> Word8.t; val ge = _import "WordS16_ge" private : Int16.t * Int16.t -> Bool.t; val gt = _import "WordS16_gt" private : Int16.t * Int16.t -> Bool.t; val le = _import "WordS16_le" private : Int16.t * Int16.t -> Bool.t; val lt = _import "WordS16_lt" private : Int16.t * Int16.t -> Bool.t; val mul = _import "WordS16_mul" private : Int16.t * Int16.t -> Int16.t; val mulCheckOverflows = _import "WordS16_mulCheckOverflows" private : Int16.t * Int16.t -> Bool.t; val negCheckOverflows = _import "WordS16_negCheckOverflows" private : Int16.t -> Bool.t; val quot = _import "WordS16_quot" private : Int16.t * Int16.t -> Int16.t; val rem = _import "WordS16_rem" private : Int16.t * Int16.t -> Int16.t; val rndToReal32 = _import "WordS16_rndToReal32" private : Int16.t -> Real32.t; val rndToReal64 = _import "WordS16_rndToReal64" private : Int16.t -> Real64.t; val rshift = _import "WordS16_rshift" private : Int16.t * Word32.t -> Int16.t; val subCheckOverflows = _import "WordS16_subCheckOverflows" private : Int16.t * Int16.t -> Bool.t; end structure WordS32 = struct val addCheckOverflows = _import "WordS32_addCheckOverflows" private : Int32.t * Int32.t -> Bool.t; val extdToWord16 = _import "WordS32_extdToWord16" private : Int32.t -> Word16.t; val extdToWord32 = _import "WordS32_extdToWord32" private : Int32.t -> Word32.t; val extdToWord64 = _import "WordS32_extdToWord64" private : Int32.t -> Word64.t; val extdToWord8 = _import "WordS32_extdToWord8" private : Int32.t -> Word8.t; val ge = _import "WordS32_ge" private : Int32.t * Int32.t -> Bool.t; val gt = _import "WordS32_gt" private : Int32.t * Int32.t -> Bool.t; val le = _import "WordS32_le" private : Int32.t * Int32.t -> Bool.t; val lt = _import "WordS32_lt" private : Int32.t * Int32.t -> Bool.t; val mul = _import "WordS32_mul" private : Int32.t * Int32.t -> Int32.t; val mulCheckOverflows = _import "WordS32_mulCheckOverflows" private : Int32.t * Int32.t -> Bool.t; val negCheckOverflows = _import "WordS32_negCheckOverflows" private : Int32.t -> Bool.t; val quot = _import "WordS32_quot" private : Int32.t * Int32.t -> Int32.t; val rem = _import "WordS32_rem" private : Int32.t * Int32.t -> Int32.t; val rndToReal32 = _import "WordS32_rndToReal32" private : Int32.t -> Real32.t; val rndToReal64 = _import "WordS32_rndToReal64" private : Int32.t -> Real64.t; val rshift = _import "WordS32_rshift" private : Int32.t * Word32.t -> Int32.t; val subCheckOverflows = _import "WordS32_subCheckOverflows" private : Int32.t * Int32.t -> Bool.t; end structure WordS64 = struct val addCheckOverflows = _import "WordS64_addCheckOverflows" private : Int64.t * Int64.t -> Bool.t; val extdToWord16 = _import "WordS64_extdToWord16" private : Int64.t -> Word16.t; val extdToWord32 = _import "WordS64_extdToWord32" private : Int64.t -> Word32.t; val extdToWord64 = _import "WordS64_extdToWord64" private : Int64.t -> Word64.t; val extdToWord8 = _import "WordS64_extdToWord8" private : Int64.t -> Word8.t; val ge = _import "WordS64_ge" private : Int64.t * Int64.t -> Bool.t; val gt = _import "WordS64_gt" private : Int64.t * Int64.t -> Bool.t; val le = _import "WordS64_le" private : Int64.t * Int64.t -> Bool.t; val lt = _import "WordS64_lt" private : Int64.t * Int64.t -> Bool.t; val mul = _import "WordS64_mul" private : Int64.t * Int64.t -> Int64.t; val mulCheckOverflows = _import "WordS64_mulCheckOverflows" private : Int64.t * Int64.t -> Bool.t; val negCheckOverflows = _import "WordS64_negCheckOverflows" private : Int64.t -> Bool.t; val quot = _import "WordS64_quot" private : Int64.t * Int64.t -> Int64.t; val rem = _import "WordS64_rem" private : Int64.t * Int64.t -> Int64.t; val rndToReal32 = _import "WordS64_rndToReal32" private : Int64.t -> Real32.t; val rndToReal64 = _import "WordS64_rndToReal64" private : Int64.t -> Real64.t; val rshift = _import "WordS64_rshift" private : Int64.t * Word32.t -> Int64.t; val subCheckOverflows = _import "WordS64_subCheckOverflows" private : Int64.t * Int64.t -> Bool.t; end structure WordS8 = struct val addCheckOverflows = _import "WordS8_addCheckOverflows" private : Int8.t * Int8.t -> Bool.t; val extdToWord16 = _import "WordS8_extdToWord16" private : Int8.t -> Word16.t; val extdToWord32 = _import "WordS8_extdToWord32" private : Int8.t -> Word32.t; val extdToWord64 = _import "WordS8_extdToWord64" private : Int8.t -> Word64.t; val extdToWord8 = _import "WordS8_extdToWord8" private : Int8.t -> Word8.t; val ge = _import "WordS8_ge" private : Int8.t * Int8.t -> Bool.t; val gt = _import "WordS8_gt" private : Int8.t * Int8.t -> Bool.t; val le = _import "WordS8_le" private : Int8.t * Int8.t -> Bool.t; val lt = _import "WordS8_lt" private : Int8.t * Int8.t -> Bool.t; val mul = _import "WordS8_mul" private : Int8.t * Int8.t -> Int8.t; val mulCheckOverflows = _import "WordS8_mulCheckOverflows" private : Int8.t * Int8.t -> Bool.t; val negCheckOverflows = _import "WordS8_negCheckOverflows" private : Int8.t -> Bool.t; val quot = _import "WordS8_quot" private : Int8.t * Int8.t -> Int8.t; val rem = _import "WordS8_rem" private : Int8.t * Int8.t -> Int8.t; val rndToReal32 = _import "WordS8_rndToReal32" private : Int8.t -> Real32.t; val rndToReal64 = _import "WordS8_rndToReal64" private : Int8.t -> Real64.t; val rshift = _import "WordS8_rshift" private : Int8.t * Word32.t -> Int8.t; val subCheckOverflows = _import "WordS8_subCheckOverflows" private : Int8.t * Int8.t -> Bool.t; end structure WordU16 = struct val addCheckOverflows = _import "WordU16_addCheckOverflows" private : Word16.t * Word16.t -> Bool.t; val extdToWord16 = _import "WordU16_extdToWord16" private : Word16.t -> Word16.t; val extdToWord32 = _import "WordU16_extdToWord32" private : Word16.t -> Word32.t; val extdToWord64 = _import "WordU16_extdToWord64" private : Word16.t -> Word64.t; val extdToWord8 = _import "WordU16_extdToWord8" private : Word16.t -> Word8.t; val ge = _import "WordU16_ge" private : Word16.t * Word16.t -> Bool.t; val gt = _import "WordU16_gt" private : Word16.t * Word16.t -> Bool.t; val le = _import "WordU16_le" private : Word16.t * Word16.t -> Bool.t; val lt = _import "WordU16_lt" private : Word16.t * Word16.t -> Bool.t; val mul = _import "WordU16_mul" private : Word16.t * Word16.t -> Word16.t; val mulCheckOverflows = _import "WordU16_mulCheckOverflows" private : Word16.t * Word16.t -> Bool.t; val quot = _import "WordU16_quot" private : Word16.t * Word16.t -> Word16.t; val rem = _import "WordU16_rem" private : Word16.t * Word16.t -> Word16.t; val rndToReal32 = _import "WordU16_rndToReal32" private : Word16.t -> Real32.t; val rndToReal64 = _import "WordU16_rndToReal64" private : Word16.t -> Real64.t; val rshift = _import "WordU16_rshift" private : Word16.t * Word32.t -> Word16.t; end structure WordU32 = struct val addCheckOverflows = _import "WordU32_addCheckOverflows" private : Word32.t * Word32.t -> Bool.t; val extdToWord16 = _import "WordU32_extdToWord16" private : Word32.t -> Word16.t; val extdToWord32 = _import "WordU32_extdToWord32" private : Word32.t -> Word32.t; val extdToWord64 = _import "WordU32_extdToWord64" private : Word32.t -> Word64.t; val extdToWord8 = _import "WordU32_extdToWord8" private : Word32.t -> Word8.t; val ge = _import "WordU32_ge" private : Word32.t * Word32.t -> Bool.t; val gt = _import "WordU32_gt" private : Word32.t * Word32.t -> Bool.t; val le = _import "WordU32_le" private : Word32.t * Word32.t -> Bool.t; val lt = _import "WordU32_lt" private : Word32.t * Word32.t -> Bool.t; val mul = _import "WordU32_mul" private : Word32.t * Word32.t -> Word32.t; val mulCheckOverflows = _import "WordU32_mulCheckOverflows" private : Word32.t * Word32.t -> Bool.t; val quot = _import "WordU32_quot" private : Word32.t * Word32.t -> Word32.t; val rem = _import "WordU32_rem" private : Word32.t * Word32.t -> Word32.t; val rndToReal32 = _import "WordU32_rndToReal32" private : Word32.t -> Real32.t; val rndToReal64 = _import "WordU32_rndToReal64" private : Word32.t -> Real64.t; val rshift = _import "WordU32_rshift" private : Word32.t * Word32.t -> Word32.t; end structure WordU64 = struct val addCheckOverflows = _import "WordU64_addCheckOverflows" private : Word64.t * Word64.t -> Bool.t; val extdToWord16 = _import "WordU64_extdToWord16" private : Word64.t -> Word16.t; val extdToWord32 = _import "WordU64_extdToWord32" private : Word64.t -> Word32.t; val extdToWord64 = _import "WordU64_extdToWord64" private : Word64.t -> Word64.t; val extdToWord8 = _import "WordU64_extdToWord8" private : Word64.t -> Word8.t; val ge = _import "WordU64_ge" private : Word64.t * Word64.t -> Bool.t; val gt = _import "WordU64_gt" private : Word64.t * Word64.t -> Bool.t; val le = _import "WordU64_le" private : Word64.t * Word64.t -> Bool.t; val lt = _import "WordU64_lt" private : Word64.t * Word64.t -> Bool.t; val mul = _import "WordU64_mul" private : Word64.t * Word64.t -> Word64.t; val mulCheckOverflows = _import "WordU64_mulCheckOverflows" private : Word64.t * Word64.t -> Bool.t; val quot = _import "WordU64_quot" private : Word64.t * Word64.t -> Word64.t; val rem = _import "WordU64_rem" private : Word64.t * Word64.t -> Word64.t; val rndToReal32 = _import "WordU64_rndToReal32" private : Word64.t -> Real32.t; val rndToReal64 = _import "WordU64_rndToReal64" private : Word64.t -> Real64.t; val rshift = _import "WordU64_rshift" private : Word64.t * Word32.t -> Word64.t; end structure WordU8 = struct val addCheckOverflows = _import "WordU8_addCheckOverflows" private : Word8.t * Word8.t -> Bool.t; val extdToWord16 = _import "WordU8_extdToWord16" private : Word8.t -> Word16.t; val extdToWord32 = _import "WordU8_extdToWord32" private : Word8.t -> Word32.t; val extdToWord64 = _import "WordU8_extdToWord64" private : Word8.t -> Word64.t; val extdToWord8 = _import "WordU8_extdToWord8" private : Word8.t -> Word8.t; val ge = _import "WordU8_ge" private : Word8.t * Word8.t -> Bool.t; val gt = _import "WordU8_gt" private : Word8.t * Word8.t -> Bool.t; val le = _import "WordU8_le" private : Word8.t * Word8.t -> Bool.t; val lt = _import "WordU8_lt" private : Word8.t * Word8.t -> Bool.t; val mul = _import "WordU8_mul" private : Word8.t * Word8.t -> Word8.t; val mulCheckOverflows = _import "WordU8_mulCheckOverflows" private : Word8.t * Word8.t -> Bool.t; val quot = _import "WordU8_quot" private : Word8.t * Word8.t -> Word8.t; val rem = _import "WordU8_rem" private : Word8.t * Word8.t -> Word8.t; val rndToReal32 = _import "WordU8_rndToReal32" private : Word8.t -> Real32.t; val rndToReal64 = _import "WordU8_rndToReal64" private : Word8.t -> Real64.t; val rshift = _import "WordU8_rshift" private : Word8.t * Word32.t -> Word8.t; end end end mlton-20100608/basis-library/primitive/check-real.sml0000644000076600000240000000776711404435632021070 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local fun 'a check (_: 'a, _: 'a) : unit = () local structure R1 = Primitive.Real32 structure R2 = PrimitiveFFI.Real32 in val () = check (R1.Math.acos, R2.Math.acos) val () = check (R1.Math.asin, R2.Math.asin) val () = check (R1.Math.atan, R2.Math.atan) val () = check (R1.Math.atan2, R2.Math.atan2) val () = check (R1.Math.cos, R2.Math.cos) val () = check (R1.Math.cosh, R2.Math.cosh) val () = check (fn () => R1.Math.e, R2.Math.eGet) val () = check (R1.Math.exp, R2.Math.exp) val () = check (R1.Math.ln, R2.Math.ln) val () = check (R1.Math.log10, R2.Math.log10) val () = check (fn () => R1.Math.pi, R2.Math.piGet) val () = check (R1.Math.pow, R2.Math.pow) val () = check (R1.Math.sin, R2.Math.sin) val () = check (R1.Math.sinh, R2.Math.sinh) val () = check (R1.Math.sqrt, R2.Math.sqrt) val () = check (R1.Math.tan, R2.Math.tan) val () = check (R1.Math.tanh, R2.Math.tanh) val () = check (R1.abs, R2.abs) val () = check (R1.+, R2.add) val () = check (R1.class, R2.class) val () = check (R1./, R2.div) val () = check (R1.==, R2.equal) val () = check (R1.frexp, R2.frexp) val () = check (R1.gdtoa, R2.gdtoa) val () = check (R1.ldexp, R2.ldexp) val () = check (R1.<=, R2.le) val () = check (R1.<, R2.lt) val () = check (fn () => R1.maxFinite, R2.maxFiniteGet) val () = check (fn () => R1.minNormalPos, R2.minNormalPosGet) val () = check (fn () => R1.minPos, R2.minPosGet) val () = check (R1.modf, R2.modf) val () = check (R1.*, R2.mul) val () = check (R1.*+, R2.muladd) val () = check (R1.*-, R2.mulsub) val () = check (R1.~, R2.neg) val () = check (R1.round, R2.round) val () = check (R1.signBit, R2.signBit) val () = check (R1.strto, R2.strto) val () = check (R1.-, R2.sub) end local structure R1 = Primitive.Real64 structure R2 = PrimitiveFFI.Real64 in val () = check (R1.Math.acos, R2.Math.acos) val () = check (R1.Math.asin, R2.Math.asin) val () = check (R1.Math.atan, R2.Math.atan) val () = check (R1.Math.atan2, R2.Math.atan2) val () = check (R1.Math.cos, R2.Math.cos) val () = check (R1.Math.cosh, R2.Math.cosh) val () = check (fn () => R1.Math.e, R2.Math.eGet) val () = check (R1.Math.exp, R2.Math.exp) val () = check (R1.Math.ln, R2.Math.ln) val () = check (R1.Math.log10, R2.Math.log10) val () = check (fn () => R1.Math.pi, R2.Math.piGet) val () = check (R1.Math.pow, R2.Math.pow) val () = check (R1.Math.sin, R2.Math.sin) val () = check (R1.Math.sinh, R2.Math.sinh) val () = check (R1.Math.sqrt, R2.Math.sqrt) val () = check (R1.Math.tan, R2.Math.tan) val () = check (R1.Math.tanh, R2.Math.tanh) val () = check (R1.abs, R2.abs) val () = check (R1.+, R2.add) val () = check (R1.class, R2.class) val () = check (R1./, R2.div) val () = check (R1.==, R2.equal) val () = check (R1.frexp, R2.frexp) val () = check (R1.gdtoa, R2.gdtoa) val () = check (R1.ldexp, R2.ldexp) val () = check (R1.<=, R2.le) val () = check (R1.<, R2.lt) val () = check (fn () => R1.maxFinite, R2.maxFiniteGet) val () = check (fn () => R1.minNormalPos, R2.minNormalPosGet) val () = check (fn () => R1.minPos, R2.minPosGet) val () = check (R1.modf, R2.modf) val () = check (R1.*, R2.mul) val () = check (R1.*+, R2.muladd) val () = check (R1.*-, R2.mulsub) val () = check (R1.~, R2.neg) val () = check (R1.round, R2.round) val () = check (R1.signBit, R2.signBit) val () = check (R1.strto, R2.strto) val () = check (R1.-, R2.sub) end in end mlton-20100608/basis-library/primitive/prim-basis.mlb0000644000076600000240000000062711404435632021103 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "allowPrim true" "deadCode true" "nonexhaustiveMatch warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused true" in local _prim in prim-basis.sml end end mlton-20100608/basis-library/primitive/prim-basis.sml0000644000076600000240000001635011404435632021124 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Primitive = struct (* Primitive Basis (Definition) *) structure Bool = struct datatype t = datatype bool datatype bool = datatype t end structure Exn = struct type t = exn type exn = t exception Bind = Bind exception Match = Match exception PrimOverflow = Overflow end structure List = struct datatype t = datatype list datatype list = datatype t end structure Ref = struct datatype t = datatype ref datatype ref = datatype t end structure Unit = struct type t = unit type unit = t end (* Primitive Basis (Basis Library) *) structure Array = struct type 'a t = 'a array type 'a array = 'a t end structure Vector = struct type 'a t = 'a vector type 'a vector = 'a t end (* Primitive Basis (Primitive Types) *) structure Char8 = struct type t = char8 type char = t end structure Char16 = struct type t = char16 type char = t end structure Char32 = struct type t = char32 type char = t end structure Int1 = struct type t = int1 type int = t end structure Int2 = struct type t = int2 type int = t end structure Int3 = struct type t = int3 type int = t end structure Int4 = struct type t = int4 type int = t end structure Int5 = struct type t = int5 type int = t end structure Int6 = struct type t = int6 type int = t end structure Int7 = struct type t = int7 type int = t end structure Int8 = struct type t = int8 type int = t end structure Int9 = struct type t = int9 type int = t end structure Int10 = struct type t = int10 type int = t end structure Int11 = struct type t = int11 type int = t end structure Int12 = struct type t = int12 type int = t end structure Int13 = struct type t = int13 type int = t end structure Int14 = struct type t = int14 type int = t end structure Int15 = struct type t = int15 type int = t end structure Int16 = struct type t = int16 type int = t end structure Int17 = struct type t = int17 type int = t end structure Int18 = struct type t = int18 type int = t end structure Int19 = struct type t = int19 type int = t end structure Int20 = struct type t = int20 type int = t end structure Int21 = struct type t = int21 type int = t end structure Int22 = struct type t = int22 type int = t end structure Int23 = struct type t = int23 type int = t end structure Int24 = struct type t = int24 type int = t end structure Int25 = struct type t = int25 type int = t end structure Int26 = struct type t = int26 type int = t end structure Int27 = struct type t = int27 type int = t end structure Int28 = struct type t = int28 type int = t end structure Int29 = struct type t = int29 type int = t end structure Int30 = struct type t = int30 type int = t end structure Int31 = struct type t = int31 type int = t end structure Int32 = struct type t = int32 type int = t end structure Int64 = struct type t = int64 type int = t end structure IntInf = struct type t = intInf type int = t end structure Real32 = struct type t = real32 type real = t end structure Real64 = struct type t = real64 type real = t end structure String8 = struct type t = Char8.t vector type string = t end structure String16 = struct type t = Char16.t vector type string = t end structure String32 = struct type t = Char32.t vector type string = t end structure Word1 = struct type t = word1 type word = t end structure Word2 = struct type t = word2 type word = t end structure Word3 = struct type t = word3 type word = t end structure Word4 = struct type t = word4 type word = t end structure Word5 = struct type t = word5 type word = t end structure Word6 = struct type t = word6 type word = t end structure Word7 = struct type t = word7 type word = t end structure Word8 = struct type t = word8 type word = t end structure Word9 = struct type t = word9 type word = t end structure Word10 = struct type t = word10 type word = t end structure Word11 = struct type t = word11 type word = t end structure Word12 = struct type t = word12 type word = t end structure Word13 = struct type t = word13 type word = t end structure Word14 = struct type t = word14 type word = t end structure Word15 = struct type t = word15 type word = t end structure Word16 = struct type t = word16 type word = t end structure Word17 = struct type t = word17 type word = t end structure Word18 = struct type t = word18 type word = t end structure Word19 = struct type t = word19 type word = t end structure Word20 = struct type t = word20 type word = t end structure Word21 = struct type t = word21 type word = t end structure Word22 = struct type t = word22 type word = t end structure Word23 = struct type t = word23 type word = t end structure Word24 = struct type t = word24 type word = t end structure Word25 = struct type t = word25 type word = t end structure Word26 = struct type t = word26 type word = t end structure Word27 = struct type t = word27 type word = t end structure Word28 = struct type t = word28 type word = t end structure Word29 = struct type t = word29 type word = t end structure Word30 = struct type t = word30 type word = t end structure Word31 = struct type t = word31 type word = t end structure Word32 = struct type t = word32 type word = t end structure Word64 = struct type t = word64 type word = t end (* Primitive Basis (MLton Extensions) *) structure Pointer = struct type t = cpointer end structure Thread = struct type t = thread end structure Weak = struct type 'a t = 'a weak end end (* Top-level bindings *) datatype bool = datatype Primitive.Bool.bool type exn = Primitive.Exn.exn datatype list = datatype Primitive.List.list datatype ref = datatype Primitive.Ref.ref type unit = Primitive.Unit.unit type 'a array = 'a Primitive.Array.array type 'a vector = 'a Primitive.Vector.vector mlton-20100608/basis-library/primitive/prim-char.sml0000644000076600000240000000373611404435632020744 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure Char8 = struct open Char8 val < = _prim "WordU8_lt": char * char -> bool; val idToWord8 = _prim "WordU8_extdToWord8": char -> Word8.word; val idFromWord8 = _prim "WordU8_extdToWord8": Word8.word -> char; val idToInt8 = _prim "WordS8_extdToWord8": char -> Int8.int; val idFromInt8 = _prim "WordS8_extdToWord8": Int8.int -> char; end structure Char8 = struct open Char8 local structure S = IntegralComparisons(Char8) in open S end end structure Char16 = struct open Char16 val < = _prim "WordU16_lt": char * char -> bool; val idToWord16 = _prim "WordU16_extdToWord16": char -> Word16.word; val idFromWord16 = _prim "WordU16_extdToWord16": Word16.word -> char; val idToInt16 = _prim "WordS16_extdToWord16": char -> Int16.int; val idFromInt16 = _prim "WordS16_extdToWord16": Int16.int -> char; end structure Char16 = struct open Char16 local structure S = IntegralComparisons(Char16) in open S end end structure Char32 = struct open Char32 val < = _prim "WordU32_lt": char * char -> bool; val idToWord32 = _prim "WordU32_extdToWord32": char -> Word32.word; val idFromWord32 = _prim "WordU32_extdToWord32": Word32.word -> char; val idToInt32 = _prim "WordS32_extdToWord32": char -> Int32.int; val idFromInt32 = _prim "WordS32_extdToWord32": Int32.int -> char; end structure Char32 = struct open Char32 local structure S = IntegralComparisons(Char32) in open S end end end mlton-20100608/basis-library/primitive/prim-int-inf.sml0000644000076600000240000000327411404435632021370 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure IntInf = struct open IntInf val + = _prim "IntInf_add": int * int * C_Size.t -> int; val andb = _prim "IntInf_andb": int * int * C_Size.t -> int; val ~>> = _prim "IntInf_arshift": int * Word32.word * C_Size.t -> int; val compare = _prim "IntInf_compare": int * int -> Int32.int; val fromVector = _prim "WordVector_toIntInf": C_MPLimb.t vector -> int; val fromWord = _prim "Word_toIntInf": ObjptrWord.word -> int; val gcd = _prim "IntInf_gcd": int * int * C_Size.t -> int; val << = _prim "IntInf_lshift": int * Word32.word * C_Size.t -> int; val * = _prim "IntInf_mul": int * int * C_Size.t -> int; val ~ = _prim "IntInf_neg": int * C_Size.t -> int; val notb = _prim "IntInf_notb": int * C_Size.t -> int; val orb = _prim "IntInf_orb": int * int * C_Size.t -> int; val quot = _prim "IntInf_quot": int * int * C_Size.t -> int; val rem = _prim "IntInf_rem": int * int * C_Size.t -> int; val - = _prim "IntInf_sub": int * int * C_Size.t -> int; val toString = _prim "IntInf_toString": int * Int32.int * C_Size.t -> String8.string; val toVector = _prim "IntInf_toVector": int -> C_MPLimb.t vector; val toWord = _prim "IntInf_toWord": int -> ObjptrWord.word; val xorb = _prim "IntInf_xorb": int * int * C_Size.t -> int; end end mlton-20100608/basis-library/primitive/prim-int.sml0000644000076600000240000003330711404435632020616 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) signature PRIM_INTEGER = sig eqtype int type t = int val sizeInBits: Primitive.Int32.int val sizeInBitsWord: Primitive.Word32.word val precision: Primitive.Int32.int option val +! : int * int -> int val +? : int * int -> int val + : int * int -> int val *! : int * int -> int val *? : int * int -> int val * : int * int -> int val ~! : int -> int val ~? : int -> int val ~ : int -> int val quotUnsafe: int * int -> int val -! : int * int -> int val -? : int * int -> int val - : int * int -> int val remUnsafe: int * int -> int val < : int * int -> bool val <= : int * int -> bool val > : int * int -> bool val >= : int * int -> bool val compare: int * int -> Primitive.Order.order val min: int * int -> int val max: int * int -> int end structure Primitive = struct open Primitive structure Int1 = struct open Int1 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord1": big -> int; val sizeInBits: Int32.int = 1 val toBig = _prim "WordU1_extdToWord8": int -> big; end structure Int2 = struct open Int2 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord2": big -> int; val sizeInBits: Int32.int = 2 val toBig = _prim "WordU2_extdToWord8": int -> big; end structure Int3 = struct open Int3 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord3": big -> int; val sizeInBits: Int32.int = 3 val toBig = _prim "WordU3_extdToWord8": int -> big; end structure Int4 = struct open Int4 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord4": big -> int; val sizeInBits: Int32.int = 4 val toBig = _prim "WordU4_extdToWord8": int -> big; end structure Int5 = struct open Int5 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord5": big -> int; val sizeInBits: Int32.int = 5 val toBig = _prim "WordU5_extdToWord8": int -> big; end structure Int6 = struct open Int6 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord6": big -> int; val sizeInBits: Int32.int = 6 val toBig = _prim "WordU6_extdToWord8": int -> big; end structure Int7 = struct open Int7 type big = Int8.int val fromBigUnsafe = _prim "WordU8_extdToWord7": big -> int; val sizeInBits: Int32.int = 7 val toBig = _prim "WordU7_extdToWord8": int -> big; end structure Int8 = struct open Int8 val sizeInBits: Int32.int = 8 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val precision = SOME sizeInBits val +! = Exn.wrapOverflow (_prim "WordS8_addCheck": int * int -> int;) val +? = _prim "Word8_add": int * int -> int; val + = if Controls.detectOverflow then +! else +? val *! = Exn.wrapOverflow (_prim "WordS8_mulCheck": int * int -> int;) val *? = _prim "WordS8_mul": int * int -> int; val * = if Controls.detectOverflow then *! else *? val ~! = Exn.wrapOverflow (_prim "Word8_negCheck": int -> int;) val ~? = _prim "Word8_neg": int -> int; val ~ = if Controls.detectOverflow then ~! else ~? val quotUnsafe = _prim "WordS8_quot": int * int -> int; val -! = Exn.wrapOverflow (_prim "WordS8_subCheck": int * int -> int;) val -? = _prim "Word8_sub": int * int -> int; val - = if Controls.detectOverflow then -! else -? val remUnsafe = _prim "WordS8_rem": int * int -> int; val < = _prim "WordS8_lt": int * int -> bool; end structure Int8 : PRIM_INTEGER = struct open Int8 local structure S = IntegralComparisons(Int8) in open S end end structure Int9 = struct open Int9 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord9": big -> int; val sizeInBits: Int32.int = 9 val toBig = _prim "WordU9_extdToWord16": int -> big; end structure Int10 = struct open Int10 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord10": big -> int; val sizeInBits: Int32.int = 10 val toBig = _prim "WordU10_extdToWord16": int -> big; end structure Int11 = struct open Int11 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord11": big -> int; val sizeInBits: Int32.int = 11 val toBig = _prim "WordU11_extdToWord16": int -> big; end structure Int12 = struct open Int12 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord12": big -> int; val sizeInBits: Int32.int = 12 val toBig = _prim "WordU12_extdToWord16": int -> big; end structure Int13 = struct open Int13 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord13": big -> int; val sizeInBits: Int32.int = 13 val toBig = _prim "WordU13_extdToWord16": int -> big; end structure Int14 = struct open Int14 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord14": big -> int; val sizeInBits: Int32.int = 14 val toBig = _prim "WordU14_extdToWord16": int -> big; end structure Int15 = struct open Int15 type big = Int16.int val fromBigUnsafe = _prim "WordU16_extdToWord15": big -> int; val sizeInBits: Int32.int = 15 val toBig = _prim "WordU15_extdToWord16": int -> big; end structure Int16 = struct open Int16 val sizeInBits: Int32.int = 16 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val precision = SOME sizeInBits val +! = Exn.wrapOverflow (_prim "WordS16_addCheck": int * int -> int;) val +? = _prim "Word16_add": int * int -> int; val + = if Controls.detectOverflow then +! else +? val *! = Exn.wrapOverflow (_prim "WordS16_mulCheck": int * int -> int;) val *? = _prim "WordS16_mul": int * int -> int; val * = if Controls.detectOverflow then *! else *? val ~! = Exn.wrapOverflow (_prim "Word16_negCheck": int -> int;) val ~? = _prim "Word16_neg": int -> int; val ~ = if Controls.detectOverflow then ~! else ~? val quotUnsafe = _prim "WordS16_quot": int * int -> int; val -! = Exn.wrapOverflow (_prim "WordS16_subCheck": int * int -> int;) val -? = _prim "Word16_sub": int * int -> int; val - = if Controls.detectOverflow then -! else -? val remUnsafe = _prim "WordS16_rem": int * int -> int; val < = _prim "WordS16_lt": int * int -> bool; end structure Int16 : PRIM_INTEGER = struct open Int16 local structure S = IntegralComparisons(Int16) in open S end end structure Int17 = struct open Int17 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord17": big -> int; val sizeInBits: Int32.int = 17 val toBig = _prim "WordU17_extdToWord32": int -> big; end structure Int18 = struct open Int18 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord18": big -> int; val sizeInBits: Int32.int = 18 val toBig = _prim "WordU18_extdToWord32": int -> big; end structure Int19 = struct open Int19 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord19": big -> int; val sizeInBits: Int32.int = 19 val toBig = _prim "WordU19_extdToWord32": int -> big; end structure Int20 = struct open Int20 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord20": big -> int; val sizeInBits: Int32.int = 20 val toBig = _prim "WordU20_extdToWord32": int -> big; end structure Int21 = struct open Int21 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord21": big -> int; val sizeInBits: Int32.int = 21 val toBig = _prim "WordU21_extdToWord32": int -> big; end structure Int22 = struct open Int22 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord22": big -> int; val sizeInBits: Int32.int = 22 val toBig = _prim "WordU22_extdToWord32": int -> big; end structure Int23 = struct open Int23 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord23": big -> int; val sizeInBits: Int32.int = 23 val toBig = _prim "WordU23_extdToWord32": int -> big; end structure Int24 = struct open Int24 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord24": big -> int; val sizeInBits: Int32.int = 24 val toBig = _prim "WordU24_extdToWord32": int -> big; end structure Int25 = struct open Int25 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord25": big -> int; val sizeInBits: Int32.int = 25 val toBig = _prim "WordU25_extdToWord32": int -> big; end structure Int26 = struct open Int26 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord26": big -> int; val sizeInBits: Int32.int = 26 val toBig = _prim "WordU26_extdToWord32": int -> big; end structure Int27 = struct open Int27 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord27": big -> int; val sizeInBits: Int32.int = 27 val toBig = _prim "WordU27_extdToWord32": int -> big; end structure Int28 = struct open Int28 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord28": big -> int; val sizeInBits: Int32.int = 28 val toBig = _prim "WordU28_extdToWord32": int -> big; end structure Int29 = struct open Int29 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord29": big -> int; val sizeInBits: Int32.int = 29 val toBig = _prim "WordU29_extdToWord32": int -> big; end structure Int30 = struct open Int30 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord30": big -> int; val sizeInBits: Int32.int = 30 val toBig = _prim "WordU30_extdToWord32": int -> big; end structure Int31 = struct open Int31 type big = Int32.int val fromBigUnsafe = _prim "WordU32_extdToWord31": big -> int; val sizeInBits: Int32.int = 31 val toBig = _prim "WordU31_extdToWord32": int -> big; end structure Int32 = struct open Int32 val sizeInBits: Int32.int = 32 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val precision = SOME sizeInBits val +! = Exn.wrapOverflow (_prim "WordS32_addCheck": int * int -> int;) val +? = _prim "Word32_add": int * int -> int; val + = if Controls.detectOverflow then +! else +? val *! = Exn.wrapOverflow (_prim "WordS32_mulCheck": int * int -> int;) val *? = _prim "WordS32_mul": int * int -> int; val * = if Controls.detectOverflow then *! else *? val ~! = Exn.wrapOverflow (_prim "Word32_negCheck": int -> int;) val ~? = _prim "Word32_neg": int -> int; val ~ = if Controls.detectOverflow then ~! else ~? val quotUnsafe = _prim "WordS32_quot": int * int -> int; val -! = Exn.wrapOverflow (_prim "WordS32_subCheck": int * int -> int;) val -? = _prim "Word32_sub": int * int -> int; val - = if Controls.detectOverflow then -! else -? val remUnsafe = _prim "WordS32_rem": int * int -> int; val < = _prim "WordS32_lt": int * int -> bool; end structure Int32 : PRIM_INTEGER = struct open Int32 local structure S = IntegralComparisons(Int32) in open S end end structure Int64 = struct open Int64 val sizeInBits: Int32.int = 64 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val precision = SOME sizeInBits val +! = Exn.wrapOverflow (_prim "WordS64_addCheck": int * int -> int;) val +? = _prim "Word64_add": int * int -> int; val + = if Controls.detectOverflow then +! else +? val *! = Exn.wrapOverflow (_prim "WordS64_mulCheck": int * int -> int;) val *? = _prim "WordS64_mul": int * int -> int; val * = if Controls.detectOverflow then *! else *? val ~! = Exn.wrapOverflow (_prim "Word64_negCheck": int -> int;) val ~? = _prim "Word64_neg": int -> int; val ~ = if Controls.detectOverflow then ~! else ~? val quotUnsafe = _prim "WordS64_quot": int * int -> int; val -! = Exn.wrapOverflow (_prim "WordS64_subCheck": int * int -> int;) val -? = _prim "Word64_sub": int * int -> int; val - = if Controls.detectOverflow then -! else -? val remUnsafe = _prim "WordS64_rem": int * int -> int; val < = _prim "WordS64_lt": int * int -> bool; end structure Int64 : PRIM_INTEGER = struct open Int64 local structure S = IntegralComparisons(Int64) in open S end end end mlton-20100608/basis-library/primitive/prim-iwconv.sml0000644000076600000240000006262411404435632021335 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) signature PRIM_INTWORD_CONV = sig (* identity *) val idFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val idFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val idFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val idFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val idFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val idFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val idFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val idFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val idFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val idFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val idFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val idFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val idFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val idFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val idFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val idFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word (* zero-extend or low-bits *) val zextdFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val zextdFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val zextdFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val zextdFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val zextdFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val zextdFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val zextdFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val zextdFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val zextdFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val zextdFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val zextdFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val zextdFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val zextdFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val zextdFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val zextdFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val zextdFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val zextdFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val zextdFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val zextdFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val zextdFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val zextdFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val zextdFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val zextdFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val zextdFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val zextdFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val zextdFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val zextdFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val zextdFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val zextdFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val zextdFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val zextdFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val zextdFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val zextdFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val zextdFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val zextdFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val zextdFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val zextdFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val zextdFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val zextdFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val zextdFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val zextdFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val zextdFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val zextdFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val zextdFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val zextdFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val zextdFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val zextdFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val zextdFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val zextdFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val zextdFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val zextdFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val zextdFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val zextdFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val zextdFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val zextdFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val zextdFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val zextdFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val zextdFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val zextdFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val zextdFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val zextdFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val zextdFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val zextdFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val zextdFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word (* sign-extend or low-bits *) val sextdFromInt8ToInt8: Primitive.Int8.int -> Primitive.Int8.int val sextdFromInt8ToInt16: Primitive.Int8.int -> Primitive.Int16.int val sextdFromInt8ToInt32: Primitive.Int8.int -> Primitive.Int32.int val sextdFromInt8ToInt64: Primitive.Int8.int -> Primitive.Int64.int val sextdFromInt8ToWord8: Primitive.Int8.int -> Primitive.Word8.word val sextdFromInt8ToWord16: Primitive.Int8.int -> Primitive.Word16.word val sextdFromInt8ToWord32: Primitive.Int8.int -> Primitive.Word32.word val sextdFromInt8ToWord64: Primitive.Int8.int -> Primitive.Word64.word val sextdFromInt16ToInt8: Primitive.Int16.int -> Primitive.Int8.int val sextdFromInt16ToInt16: Primitive.Int16.int -> Primitive.Int16.int val sextdFromInt16ToInt32: Primitive.Int16.int -> Primitive.Int32.int val sextdFromInt16ToInt64: Primitive.Int16.int -> Primitive.Int64.int val sextdFromInt16ToWord8: Primitive.Int16.int -> Primitive.Word8.word val sextdFromInt16ToWord16: Primitive.Int16.int -> Primitive.Word16.word val sextdFromInt16ToWord32: Primitive.Int16.int -> Primitive.Word32.word val sextdFromInt16ToWord64: Primitive.Int16.int -> Primitive.Word64.word val sextdFromInt32ToInt8: Primitive.Int32.int -> Primitive.Int8.int val sextdFromInt32ToInt16: Primitive.Int32.int -> Primitive.Int16.int val sextdFromInt32ToInt32: Primitive.Int32.int -> Primitive.Int32.int val sextdFromInt32ToInt64: Primitive.Int32.int -> Primitive.Int64.int val sextdFromInt32ToWord8: Primitive.Int32.int -> Primitive.Word8.word val sextdFromInt32ToWord16: Primitive.Int32.int -> Primitive.Word16.word val sextdFromInt32ToWord32: Primitive.Int32.int -> Primitive.Word32.word val sextdFromInt32ToWord64: Primitive.Int32.int -> Primitive.Word64.word val sextdFromInt64ToInt8: Primitive.Int64.int -> Primitive.Int8.int val sextdFromInt64ToInt16: Primitive.Int64.int -> Primitive.Int16.int val sextdFromInt64ToInt32: Primitive.Int64.int -> Primitive.Int32.int val sextdFromInt64ToInt64: Primitive.Int64.int -> Primitive.Int64.int val sextdFromInt64ToWord8: Primitive.Int64.int -> Primitive.Word8.word val sextdFromInt64ToWord16: Primitive.Int64.int -> Primitive.Word16.word val sextdFromInt64ToWord32: Primitive.Int64.int -> Primitive.Word32.word val sextdFromInt64ToWord64: Primitive.Int64.int -> Primitive.Word64.word val sextdFromWord8ToInt8: Primitive.Word8.word -> Primitive.Int8.int val sextdFromWord8ToInt16: Primitive.Word8.word -> Primitive.Int16.int val sextdFromWord8ToInt32: Primitive.Word8.word -> Primitive.Int32.int val sextdFromWord8ToInt64: Primitive.Word8.word -> Primitive.Int64.int val sextdFromWord8ToWord8: Primitive.Word8.word -> Primitive.Word8.word val sextdFromWord8ToWord16: Primitive.Word8.word -> Primitive.Word16.word val sextdFromWord8ToWord32: Primitive.Word8.word -> Primitive.Word32.word val sextdFromWord8ToWord64: Primitive.Word8.word -> Primitive.Word64.word val sextdFromWord16ToInt8: Primitive.Word16.word -> Primitive.Int8.int val sextdFromWord16ToInt16: Primitive.Word16.word -> Primitive.Int16.int val sextdFromWord16ToInt32: Primitive.Word16.word -> Primitive.Int32.int val sextdFromWord16ToInt64: Primitive.Word16.word -> Primitive.Int64.int val sextdFromWord16ToWord8: Primitive.Word16.word -> Primitive.Word8.word val sextdFromWord16ToWord16: Primitive.Word16.word -> Primitive.Word16.word val sextdFromWord16ToWord32: Primitive.Word16.word -> Primitive.Word32.word val sextdFromWord16ToWord64: Primitive.Word16.word -> Primitive.Word64.word val sextdFromWord32ToInt8: Primitive.Word32.word -> Primitive.Int8.int val sextdFromWord32ToInt16: Primitive.Word32.word -> Primitive.Int16.int val sextdFromWord32ToInt32: Primitive.Word32.word -> Primitive.Int32.int val sextdFromWord32ToInt64: Primitive.Word32.word -> Primitive.Int64.int val sextdFromWord32ToWord8: Primitive.Word32.word -> Primitive.Word8.word val sextdFromWord32ToWord16: Primitive.Word32.word -> Primitive.Word16.word val sextdFromWord32ToWord32: Primitive.Word32.word -> Primitive.Word32.word val sextdFromWord32ToWord64: Primitive.Word32.word -> Primitive.Word64.word val sextdFromWord64ToInt8: Primitive.Word64.word -> Primitive.Int8.int val sextdFromWord64ToInt16: Primitive.Word64.word -> Primitive.Int16.int val sextdFromWord64ToInt32: Primitive.Word64.word -> Primitive.Int32.int val sextdFromWord64ToInt64: Primitive.Word64.word -> Primitive.Int64.int val sextdFromWord64ToWord8: Primitive.Word64.word -> Primitive.Word8.word val sextdFromWord64ToWord16: Primitive.Word64.word -> Primitive.Word16.word val sextdFromWord64ToWord32: Primitive.Word64.word -> Primitive.Word32.word val sextdFromWord64ToWord64: Primitive.Word64.word -> Primitive.Word64.word end structure Primitive = struct open Primitive structure IntWordConv : PRIM_INTWORD_CONV = struct (* identity *) val idFromInt8ToInt8 = _prim "WordU8_extdToWord8": Int8.int -> Int8.int; val idFromInt8ToWord8 = _prim "WordU8_extdToWord8": Int8.int -> Word8.word; val idFromInt16ToInt16 = _prim "WordU16_extdToWord16": Int16.int -> Int16.int; val idFromInt16ToWord16 = _prim "WordU16_extdToWord16": Int16.int -> Word16.word; val idFromInt32ToInt32 = _prim "WordU32_extdToWord32": Int32.int -> Int32.int; val idFromInt32ToWord32 = _prim "WordU32_extdToWord32": Int32.int -> Word32.word; val idFromInt64ToInt64 = _prim "WordU64_extdToWord64": Int64.int -> Int64.int; val idFromInt64ToWord64 = _prim "WordU64_extdToWord64": Int64.int -> Word64.word; val idFromWord8ToInt8 = _prim "WordU8_extdToWord8": Word8.word -> Int8.int; val idFromWord8ToWord8 = _prim "WordU8_extdToWord8": Word8.word -> Word8.word; val idFromWord16ToInt16 = _prim "WordU16_extdToWord16": Word16.word -> Int16.int; val idFromWord16ToWord16 = _prim "WordU16_extdToWord16": Word16.word -> Word16.word; val idFromWord32ToInt32 = _prim "WordU32_extdToWord32": Word32.word -> Int32.int; val idFromWord32ToWord32 = _prim "WordU32_extdToWord32": Word32.word -> Word32.word; val idFromWord64ToInt64 = _prim "WordU64_extdToWord64": Word64.word -> Int64.int; val idFromWord64ToWord64 = _prim "WordU64_extdToWord64": Word64.word -> Word64.word; (* zero-extend or low-bits *) val zextdFromInt8ToInt8 = _prim "WordU8_extdToWord8": Int8.int -> Int8.int; val zextdFromInt8ToInt16 = _prim "WordU8_extdToWord16": Int8.int -> Int16.int; val zextdFromInt8ToInt32 = _prim "WordU8_extdToWord32": Int8.int -> Int32.int; val zextdFromInt8ToInt64 = _prim "WordU8_extdToWord64": Int8.int -> Int64.int; val zextdFromInt8ToWord8 = _prim "WordU8_extdToWord8": Int8.int -> Word8.word; val zextdFromInt8ToWord16 = _prim "WordU8_extdToWord16": Int8.int -> Word16.word; val zextdFromInt8ToWord32 = _prim "WordU8_extdToWord32": Int8.int -> Word32.word; val zextdFromInt8ToWord64 = _prim "WordU8_extdToWord64": Int8.int -> Word64.word; val zextdFromInt16ToInt8 = _prim "WordU16_extdToWord8": Int16.int -> Int8.int; val zextdFromInt16ToInt16 = _prim "WordU16_extdToWord16": Int16.int -> Int16.int; val zextdFromInt16ToInt32 = _prim "WordU16_extdToWord32": Int16.int -> Int32.int; val zextdFromInt16ToInt64 = _prim "WordU16_extdToWord64": Int16.int -> Int64.int; val zextdFromInt16ToWord8 = _prim "WordU16_extdToWord8": Int16.int -> Word8.word; val zextdFromInt16ToWord16 = _prim "WordU16_extdToWord16": Int16.int -> Word16.word; val zextdFromInt16ToWord32 = _prim "WordU16_extdToWord32": Int16.int -> Word32.word; val zextdFromInt16ToWord64 = _prim "WordU16_extdToWord64": Int16.int -> Word64.word; val zextdFromInt32ToInt8 = _prim "WordU32_extdToWord8": Int32.int -> Int8.int; val zextdFromInt32ToInt16 = _prim "WordU32_extdToWord16": Int32.int -> Int16.int; val zextdFromInt32ToInt32 = _prim "WordU32_extdToWord32": Int32.int -> Int32.int; val zextdFromInt32ToInt64 = _prim "WordU32_extdToWord64": Int32.int -> Int64.int; val zextdFromInt32ToWord8 = _prim "WordU32_extdToWord8": Int32.int -> Word8.word; val zextdFromInt32ToWord16 = _prim "WordU32_extdToWord16": Int32.int -> Word16.word; val zextdFromInt32ToWord32 = _prim "WordU32_extdToWord32": Int32.int -> Word32.word; val zextdFromInt32ToWord64 = _prim "WordU32_extdToWord64": Int32.int -> Word64.word; val zextdFromInt64ToInt8 = _prim "WordU64_extdToWord8": Int64.int -> Int8.int; val zextdFromInt64ToInt16 = _prim "WordU64_extdToWord16": Int64.int -> Int16.int; val zextdFromInt64ToInt32 = _prim "WordU64_extdToWord32": Int64.int -> Int32.int; val zextdFromInt64ToInt64 = _prim "WordU64_extdToWord64": Int64.int -> Int64.int; val zextdFromInt64ToWord8 = _prim "WordU64_extdToWord8": Int64.int -> Word8.word; val zextdFromInt64ToWord16 = _prim "WordU64_extdToWord16": Int64.int -> Word16.word; val zextdFromInt64ToWord32 = _prim "WordU64_extdToWord32": Int64.int -> Word32.word; val zextdFromInt64ToWord64 = _prim "WordU64_extdToWord64": Int64.int -> Word64.word; val zextdFromWord8ToInt8 = _prim "WordU8_extdToWord8": Word8.word -> Int8.int; val zextdFromWord8ToInt16 = _prim "WordU8_extdToWord16": Word8.word -> Int16.int; val zextdFromWord8ToInt32 = _prim "WordU8_extdToWord32": Word8.word -> Int32.int; val zextdFromWord8ToInt64 = _prim "WordU8_extdToWord64": Word8.word -> Int64.int; val zextdFromWord8ToWord8 = _prim "WordU8_extdToWord8": Word8.word -> Word8.word; val zextdFromWord8ToWord16 = _prim "WordU8_extdToWord16": Word8.word -> Word16.word; val zextdFromWord8ToWord32 = _prim "WordU8_extdToWord32": Word8.word -> Word32.word; val zextdFromWord8ToWord64 = _prim "WordU8_extdToWord64": Word8.word -> Word64.word; val zextdFromWord16ToInt8 = _prim "WordU16_extdToWord8": Word16.word -> Int8.int; val zextdFromWord16ToInt16 = _prim "WordU16_extdToWord16": Word16.word -> Int16.int; val zextdFromWord16ToInt32 = _prim "WordU16_extdToWord32": Word16.word -> Int32.int; val zextdFromWord16ToInt64 = _prim "WordU16_extdToWord64": Word16.word -> Int64.int; val zextdFromWord16ToWord8 = _prim "WordU16_extdToWord8": Word16.word -> Word8.word; val zextdFromWord16ToWord16 = _prim "WordU16_extdToWord16": Word16.word -> Word16.word; val zextdFromWord16ToWord32 = _prim "WordU16_extdToWord32": Word16.word -> Word32.word; val zextdFromWord16ToWord64 = _prim "WordU16_extdToWord64": Word16.word -> Word64.word; val zextdFromWord32ToInt8 = _prim "WordU32_extdToWord8": Word32.word -> Int8.int; val zextdFromWord32ToInt16 = _prim "WordU32_extdToWord16": Word32.word -> Int16.int; val zextdFromWord32ToInt32 = _prim "WordU32_extdToWord32": Word32.word -> Int32.int; val zextdFromWord32ToInt64 = _prim "WordU32_extdToWord64": Word32.word -> Int64.int; val zextdFromWord32ToWord8 = _prim "WordU32_extdToWord8": Word32.word -> Word8.word; val zextdFromWord32ToWord16 = _prim "WordU32_extdToWord16": Word32.word -> Word16.word; val zextdFromWord32ToWord32 = _prim "WordU32_extdToWord32": Word32.word -> Word32.word; val zextdFromWord32ToWord64 = _prim "WordU32_extdToWord64": Word32.word -> Word64.word; val zextdFromWord64ToInt8 = _prim "WordU64_extdToWord8": Word64.word -> Int8.int; val zextdFromWord64ToInt16 = _prim "WordU64_extdToWord16": Word64.word -> Int16.int; val zextdFromWord64ToInt32 = _prim "WordU64_extdToWord32": Word64.word -> Int32.int; val zextdFromWord64ToInt64 = _prim "WordU64_extdToWord64": Word64.word -> Int64.int; val zextdFromWord64ToWord8 = _prim "WordU64_extdToWord8": Word64.word -> Word8.word; val zextdFromWord64ToWord16 = _prim "WordU64_extdToWord16": Word64.word -> Word16.word; val zextdFromWord64ToWord32 = _prim "WordU64_extdToWord32": Word64.word -> Word32.word; val zextdFromWord64ToWord64 = _prim "WordU64_extdToWord64": Word64.word -> Word64.word; (* sign-extend or low-bits *) val sextdFromInt8ToInt8 = _prim "WordS8_extdToWord8": Int8.int -> Int8.int; val sextdFromInt8ToInt16 = _prim "WordS8_extdToWord16": Int8.int -> Int16.int; val sextdFromInt8ToInt32 = _prim "WordS8_extdToWord32": Int8.int -> Int32.int; val sextdFromInt8ToInt64 = _prim "WordS8_extdToWord64": Int8.int -> Int64.int; val sextdFromInt8ToWord8 = _prim "WordS8_extdToWord8": Int8.int -> Word8.word; val sextdFromInt8ToWord16 = _prim "WordS8_extdToWord16": Int8.int -> Word16.word; val sextdFromInt8ToWord32 = _prim "WordS8_extdToWord32": Int8.int -> Word32.word; val sextdFromInt8ToWord64 = _prim "WordS8_extdToWord64": Int8.int -> Word64.word; val sextdFromInt16ToInt8 = _prim "WordS16_extdToWord8": Int16.int -> Int8.int; val sextdFromInt16ToInt16 = _prim "WordS16_extdToWord16": Int16.int -> Int16.int; val sextdFromInt16ToInt32 = _prim "WordS16_extdToWord32": Int16.int -> Int32.int; val sextdFromInt16ToInt64 = _prim "WordS16_extdToWord64": Int16.int -> Int64.int; val sextdFromInt16ToWord8 = _prim "WordS16_extdToWord8": Int16.int -> Word8.word; val sextdFromInt16ToWord16 = _prim "WordS16_extdToWord16": Int16.int -> Word16.word; val sextdFromInt16ToWord32 = _prim "WordS16_extdToWord32": Int16.int -> Word32.word; val sextdFromInt16ToWord64 = _prim "WordS16_extdToWord64": Int16.int -> Word64.word; val sextdFromInt32ToInt8 = _prim "WordS32_extdToWord8": Int32.int -> Int8.int; val sextdFromInt32ToInt16 = _prim "WordS32_extdToWord16": Int32.int -> Int16.int; val sextdFromInt32ToInt32 = _prim "WordS32_extdToWord32": Int32.int -> Int32.int; val sextdFromInt32ToInt64 = _prim "WordS32_extdToWord64": Int32.int -> Int64.int; val sextdFromInt32ToWord8 = _prim "WordS32_extdToWord8": Int32.int -> Word8.word; val sextdFromInt32ToWord16 = _prim "WordS32_extdToWord16": Int32.int -> Word16.word; val sextdFromInt32ToWord32 = _prim "WordS32_extdToWord32": Int32.int -> Word32.word; val sextdFromInt32ToWord64 = _prim "WordS32_extdToWord64": Int32.int -> Word64.word; val sextdFromInt64ToInt8 = _prim "WordS64_extdToWord8": Int64.int -> Int8.int; val sextdFromInt64ToInt16 = _prim "WordS64_extdToWord16": Int64.int -> Int16.int; val sextdFromInt64ToInt32 = _prim "WordS64_extdToWord32": Int64.int -> Int32.int; val sextdFromInt64ToInt64 = _prim "WordS64_extdToWord64": Int64.int -> Int64.int; val sextdFromInt64ToWord8 = _prim "WordS64_extdToWord8": Int64.int -> Word8.word; val sextdFromInt64ToWord16 = _prim "WordS64_extdToWord16": Int64.int -> Word16.word; val sextdFromInt64ToWord32 = _prim "WordS64_extdToWord32": Int64.int -> Word32.word; val sextdFromInt64ToWord64 = _prim "WordS64_extdToWord64": Int64.int -> Word64.word; val sextdFromWord8ToInt8 = _prim "WordS8_extdToWord8": Word8.word -> Int8.int; val sextdFromWord8ToInt16 = _prim "WordS8_extdToWord16": Word8.word -> Int16.int; val sextdFromWord8ToInt32 = _prim "WordS8_extdToWord32": Word8.word -> Int32.int; val sextdFromWord8ToInt64 = _prim "WordS8_extdToWord64": Word8.word -> Int64.int; val sextdFromWord8ToWord8 = _prim "WordS8_extdToWord8": Word8.word -> Word8.word; val sextdFromWord8ToWord16 = _prim "WordS8_extdToWord16": Word8.word -> Word16.word; val sextdFromWord8ToWord32 = _prim "WordS8_extdToWord32": Word8.word -> Word32.word; val sextdFromWord8ToWord64 = _prim "WordS8_extdToWord64": Word8.word -> Word64.word; val sextdFromWord16ToInt8 = _prim "WordS16_extdToWord8": Word16.word -> Int8.int; val sextdFromWord16ToInt16 = _prim "WordS16_extdToWord16": Word16.word -> Int16.int; val sextdFromWord16ToInt32 = _prim "WordS16_extdToWord32": Word16.word -> Int32.int; val sextdFromWord16ToInt64 = _prim "WordS16_extdToWord64": Word16.word -> Int64.int; val sextdFromWord16ToWord8 = _prim "WordS16_extdToWord8": Word16.word -> Word8.word; val sextdFromWord16ToWord16 = _prim "WordS16_extdToWord16": Word16.word -> Word16.word; val sextdFromWord16ToWord32 = _prim "WordS16_extdToWord32": Word16.word -> Word32.word; val sextdFromWord16ToWord64 = _prim "WordS16_extdToWord64": Word16.word -> Word64.word; val sextdFromWord32ToInt8 = _prim "WordS32_extdToWord8": Word32.word -> Int8.int; val sextdFromWord32ToInt16 = _prim "WordS32_extdToWord16": Word32.word -> Int16.int; val sextdFromWord32ToInt32 = _prim "WordS32_extdToWord32": Word32.word -> Int32.int; val sextdFromWord32ToInt64 = _prim "WordS32_extdToWord64": Word32.word -> Int64.int; val sextdFromWord32ToWord8 = _prim "WordS32_extdToWord8": Word32.word -> Word8.word; val sextdFromWord32ToWord16 = _prim "WordS32_extdToWord16": Word32.word -> Word16.word; val sextdFromWord32ToWord32 = _prim "WordS32_extdToWord32": Word32.word -> Word32.word; val sextdFromWord32ToWord64 = _prim "WordS32_extdToWord64": Word32.word -> Word64.word; val sextdFromWord64ToInt8 = _prim "WordS64_extdToWord8": Word64.word -> Int8.int; val sextdFromWord64ToInt16 = _prim "WordS64_extdToWord16": Word64.word -> Int16.int; val sextdFromWord64ToInt32 = _prim "WordS64_extdToWord32": Word64.word -> Int32.int; val sextdFromWord64ToInt64 = _prim "WordS64_extdToWord64": Word64.word -> Int64.int; val sextdFromWord64ToWord8 = _prim "WordS64_extdToWord8": Word64.word -> Word8.word; val sextdFromWord64ToWord16 = _prim "WordS64_extdToWord16": Word64.word -> Word16.word; val sextdFromWord64ToWord32 = _prim "WordS64_extdToWord32": Word64.word -> Word32.word; val sextdFromWord64ToWord64 = _prim "WordS64_extdToWord64": Word64.word -> Word64.word; end end mlton-20100608/basis-library/primitive/prim-mlton.sml0000644000076600000240000003474011404435632021157 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure MLton = struct val eq = _prim "MLton_eq": 'a * 'a -> bool; val equal = _prim "MLton_equal": 'a * 'a -> bool; (* val deserialize = _prim "MLton_deserialize": Word8Vector.vector -> 'a ref; *) val halt = _prim "MLton_halt": C_Status.t -> unit; val hash = _prim "MLton_hash": 'a -> Word32.word; (* val serialize = _prim "MLton_serialize": 'a ref -> Word8Vector.vector; *) val share = _prim "MLton_share": 'a -> unit; val size = _prim "MLton_size": 'a ref -> C_Size.t; val installSignalHandler = _prim "MLton_installSignalHandler": unit -> unit; structure GCState = struct type t = Pointer.t val gcState = #1 _symbol "gcStateAddress" private: t GetSet.t; () end structure Align = struct datatype t = Align4 | Align8 val align = case _build_const "MLton_Align_align": Int32.int; of 4 => Align4 | 8 => Align8 | _ => raise Primitive.Exn.Fail8 "MLton_Align_align" end structure CallStack = struct (* The most recent caller is at index 0 in the array. *) datatype t = T of Word32.word array val callStack = _import "GC_callStack" private: GCState.t * Word32.word array -> unit; val frameIndexSourceSeq = _import "GC_frameIndexSourceSeq" private: GCState.t * Word32.word -> Pointer.t; val keep = _command_line_const "CallStack.keep": bool = false; val numStackFrames = _import "GC_numStackFrames" private: GCState.t -> Word32.word; val sourceName = _import "GC_sourceName" private: GCState.t * Word32.word -> C_String.t; end structure Codegen = struct datatype t = Bytecode | C | x86 | amd64 val codegen = case _build_const "MLton_Codegen_codegen": Int32.int; of 0 => Bytecode | 1 => C | 2 => x86 | 3 => amd64 | _ => raise Primitive.Exn.Fail8 "MLton_Codegen_codegen" val isBytecode = codegen = Bytecode val isC = codegen = C val isX86 = codegen = x86 val isAmd64 = codegen = amd64 (* val isNative = isX86 orelse isAmd64 *) end structure Exn = struct (* The polymorphism with extra and setInitExtra is because primitives * are only supposed to deal with basic types. The polymorphism * allows the various passes like monomorphisation to translate * the types appropriately. *) type extra = CallStack.t option val extra = _prim "Exn_extra": exn -> 'a; val extra: exn -> extra = extra val keepHistory = _command_line_const "Exn.keepHistory": bool = false; val setExtendExtra = _prim "Exn_setExtendExtra": ('a -> 'a) -> unit; val setExtendExtra: (extra -> extra) -> unit = setExtendExtra (* Ensure that setExtendExtra is initialized. * Important for -const 'Exn.keepHistory true', so that * exceptions can be raised (and handled) during Basis Library * initialization. *) val setExtendExtra : (extra -> extra) -> unit = if keepHistory then (setExtendExtra (fn _ => NONE) ; setExtendExtra) else fn _ => () end structure FFI = struct val getOpArgsResPtr = #1 _symbol "MLton_FFI_opArgsResPtr" private: Pointer.t GetSet.t; val numExports = _build_const "MLton_FFI_numExports": Int32.int; end structure Finalizable = struct val touch = _prim "MLton_touch": 'a -> unit; end structure GC = struct val collect = _prim "GC_collect": unit -> unit; val pack = _import "GC_pack" private: GCState.t -> unit; val getBytesAllocated = _import "GC_getCumulativeStatisticsBytesAllocated" private: GCState.t -> C_UIntmax.t; val getNumCopyingGCs = _import "GC_getCumulativeStatisticsNumCopyingGCs" private: GCState.t -> C_UIntmax.t; val getNumMarkCompactGCs = _import "GC_getCumulativeStatisticsNumMarkCompactGCs" private: GCState.t -> C_UIntmax.t; val getNumMinorGCs = _import "GC_getCumulativeStatisticsNumMinorGCs" private: GCState.t -> C_UIntmax.t; val getLastBytesLive = _import "GC_getLastMajorStatisticsBytesLive" private: GCState.t -> C_Size.t; val getMaxBytesLive = _import "GC_getCumulativeStatisticsMaxBytesLive" private: GCState.t -> C_Size.t; val setHashConsDuringGC = _import "GC_setHashConsDuringGC" private: GCState.t * bool -> unit; val setMessages = _import "GC_setControlsMessages" private: GCState.t * bool -> unit; val setRusageMeasureGC = _import "GC_setControlsRusageMeasureGC" private: GCState.t * bool -> unit; val setSummary = _import "GC_setControlsSummary" private: GCState.t * bool -> unit; val unpack = _import "GC_unpack" private: GCState.t -> unit; end structure Platform = struct structure Arch = struct datatype t = Alpha | AMD64 | ARM | HPPA | IA64 | m68k | MIPS | PowerPC | PowerPC64 | S390 | Sparc | X86 val host: t = case _const "MLton_Platform_Arch_host": String8.string; of "alpha" => Alpha | "amd64" => AMD64 | "arm" => ARM | "hppa" => HPPA | "ia64" => IA64 | "m68k" => m68k | "mips" => MIPS | "powerpc" => PowerPC | "powerpc64" => PowerPC64 | "s390" => S390 | "sparc" => Sparc | "x86" => X86 | _ => raise Primitive.Exn.Fail8 "strange MLton_Platform_Arch_host" val hostIsBigEndian = _const "MLton_Platform_Arch_bigendian": bool; end structure Format = struct datatype t = Archive | Executable | LibArchive | Library val host: t = case _build_const "MLton_Platform_Format": String8.string; of "archive" => Archive | "executable" => Executable | "libarchive" => LibArchive | "library" => Library | _ => raise Primitive.Exn.Fail8 "strange MLton_Platform_Format" end structure OS = struct datatype t = AIX | Cygwin | Darwin | FreeBSD | Hurd | HPUX | Linux | MinGW | NetBSD | OpenBSD | Solaris val host: t = case _const "MLton_Platform_OS_host": String8.string; of "aix" => AIX | "cygwin" => Cygwin | "darwin" => Darwin | "freebsd" => FreeBSD | "hurd" => Hurd | "hpux" => HPUX | "linux" => Linux | "mingw" => MinGW | "netbsd" => NetBSD | "openbsd" => OpenBSD | "solaris" => Solaris | _ => raise Primitive.Exn.Fail8 "strange MLton_Platform_OS_host" val forkIsEnabled = case host of Cygwin => #1 _symbol "MLton_Platform_CygwinUseMmap" private: bool GetSet.t; () | MinGW => false | _ => true val useWindowsProcess = not forkIsEnabled end end structure Pointer = struct open Pointer type pointer = t val add = _prim "CPointer_add": t * C_Ptrdiff.t -> t; val sub = _prim "CPointer_sub": t * C_Ptrdiff.t -> t; val diff = _prim "CPointer_diff": t * t -> C_Ptrdiff.t; val < = _prim "CPointer_lt": t * t -> bool; local structure S = IntegralComparisons(type t = t val < = <) in open S end val fromWord = _prim "CPointer_fromWord": C_Size.t -> t; val toWord = _prim "CPointer_toWord": t -> C_Size.t; val null: t = fromWord 0w0 fun isNull p = p = null val getCPointer = _prim "CPointer_getCPointer": t * C_Ptrdiff.t -> t; val getInt8 = _prim "CPointer_getWord8": t * C_Ptrdiff.t -> Int8.int; val getInt16 = _prim "CPointer_getWord16": t * C_Ptrdiff.t -> Int16.int; val getInt32 = _prim "CPointer_getWord32": t * C_Ptrdiff.t -> Int32.int; val getInt64 = _prim "CPointer_getWord64": t * C_Ptrdiff.t -> Int64.int; val getObjptr = _prim "CPointer_getObjptr": t * C_Ptrdiff.t -> 'a; val getReal32 = _prim "CPointer_getReal32": t * C_Ptrdiff.t -> Real32.real; val getReal64 = _prim "CPointer_getReal64": t * C_Ptrdiff.t -> Real64.real; val getWord8 = _prim "CPointer_getWord8": t * C_Ptrdiff.t -> Word8.word; val getWord16 = _prim "CPointer_getWord16": t * C_Ptrdiff.t -> Word16.word; val getWord32 = _prim "CPointer_getWord32": t * C_Ptrdiff.t -> Word32.word; val getWord64 = _prim "CPointer_getWord64": t * C_Ptrdiff.t -> Word64.word; val setCPointer = _prim "CPointer_setCPointer": t * C_Ptrdiff.t * t -> unit; val setInt8 = _prim "CPointer_setWord8": t * C_Ptrdiff.t * Int8.int -> unit; val setInt16 = _prim "CPointer_setWord16": t * C_Ptrdiff.t * Int16.int -> unit; val setInt32 = _prim "CPointer_setWord32": t * C_Ptrdiff.t * Int32.int -> unit; val setInt64 = _prim "CPointer_setWord64": t * C_Ptrdiff.t * Int64.int -> unit; val setObjptr = _prim "CPointer_setObjptr": t * C_Ptrdiff.t * 'a -> unit; val setReal32 = _prim "CPointer_setReal32": t * C_Ptrdiff.t * Real32.real -> unit; val setReal64 = _prim "CPointer_setReal64": t * C_Ptrdiff.t * Real64.real -> unit; val setWord8 = _prim "CPointer_setWord8": t * C_Ptrdiff.t * Word8.word -> unit; val setWord16 = _prim "CPointer_setWord16": t * C_Ptrdiff.t * Word16.word -> unit; val setWord32 = _prim "CPointer_setWord32": t * C_Ptrdiff.t * Word32.word -> unit; val setWord64 = _prim "CPointer_setWord64": t * C_Ptrdiff.t * Word64.word -> unit; end structure Profile = struct val isOn = _build_const "MLton_Profile_isOn": bool; structure Data = struct type t = Pointer.t val dummy = Pointer.null val free = _import "GC_profileFree" private: GCState.t * t -> unit; val malloc = _import "GC_profileMalloc" private: GCState.t -> t; val write = _import "GC_profileWrite" private: GCState.t * t * NullString8.t -> unit; end val done = _import "GC_profileDone" private: GCState.t -> unit; val getCurrent = _import "GC_getProfileCurrent" private: GCState.t -> Data.t; val setCurrent = _import "GC_setProfileCurrent" private : GCState.t * Data.t -> unit; end structure Thread = struct type preThread = PreThread.t type thread = Thread.t val atomicState = _prim "Thread_atomicState": unit -> Word32.word; val atomicBegin = _prim "Thread_atomicBegin": unit -> unit; fun atomicEnd () = if atomicState () = 0w0 then raise Primitive.Exn.Fail8 "Thread.atomicEnd" else _prim "Thread_atomicEnd": unit -> unit; () val copy = _prim "Thread_copy": preThread -> thread; (* copyCurrent's result is accesible via savedPre (). * It is not possible to have the type of copyCurrent as * unit -> preThread, because there are two different ways to * return from the call to copyCurrent. One way is the direct * obvious way, in the thread that called copyCurrent. That one, * of course, wants to call savedPre (). However, another way to * return is by making a copy of the preThread and then switching * to it. In that case, there is no preThread to return. Making * copyCurrent return a preThread creates nasty bugs where the * return code from the CCall expects to see a preThread result * according to the C return convention, but there isn't one when * switching to a copy. *) val copyCurrent = _prim "Thread_copyCurrent": unit -> unit; val current = _import "GC_getCurrentThread" private: GCState.t -> thread; val finishSignalHandler = _import "GC_finishSignalHandler" private: GCState.t -> unit; val returnToC = _prim "Thread_returnToC": unit -> unit; val saved = _import "GC_getSavedThread" private: GCState.t -> thread; val savedPre = _import "GC_getSavedThread" private: GCState.t -> preThread; val setCallFromCHandler = _import "GC_setCallFromCHandlerThread" private: GCState.t * thread -> unit; val setSignalHandler = _import "GC_setSignalHandlerThread" private: GCState.t * thread -> unit; val setSaved = _import "GC_setSavedThread" private: GCState.t * thread -> unit; val startSignalHandler = _import "GC_startSignalHandler" private: GCState.t -> unit; val switchTo = _prim "Thread_switchTo": thread -> unit; end structure Weak = struct open Weak val canGet = _prim "Weak_canGet": 'a t -> bool; val get = _prim "Weak_get": 'a t -> 'a; val new = _prim "Weak_new": 'a -> 'a t; end structure World = struct val getAmOriginal = _import "GC_getAmOriginal" private: GCState.t -> bool; val setAmOriginal = _import "GC_setAmOriginal" private: GCState.t * bool -> unit; val getSaveStatus = _import "GC_getSaveWorldStatus" private: GCState.t -> bool C_Errno.t; (* save's result status is accesible via getSaveStatus (). * It is not possible to have the type of save as * NullString8.t -> bool C_Errno.t, because there are two * different ways to return from the call to save. One way is * the direct obvious way, in the program instance that called * save. However, another way to return is in the program * instance that loads the world. Making save return a bool * creates nasty bugs where the return code from the CCall * expects to see a bool result according to the C return * convention, but there isn't one when returning in the load * world. *) val save = _prim "World_save": NullString8.t -> unit; end end end mlton-20100608/basis-library/primitive/prim-nullstring.sml0000644000076600000240000000161211404435632022217 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive (* NullString is used for strings that must be passed to C and hence must be * null terminated. *) structure NullString8 :> sig type t val empty: t val fromString: String8.string -> t end = struct type t = String8.string fun fromString s = if #"\000" = Vector.subUnsafe (s, SeqIndex.- (Vector.length s, 1)) then s else raise Exn.Fail8 "NullString.fromString" val empty = fromString "\000" end structure NullString8Array = struct type t = NullString8.t array end end mlton-20100608/basis-library/primitive/prim-pack-real.sml0000644000076600000240000000147711404435632021666 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure PackReal32 = struct type real = Real32.real type word = Word32.word val castFromWord = _prim "Word32_castToReal32": word -> real; val castToWord = _prim "Real32_castToWord32": real -> word; end structure PackReal64 = struct type real = Real64.real type word = Word64.word val castFromWord = _prim "Word64_castToReal64": word -> real; val castToWord = _prim "Real64_castToWord64": real -> word; end end mlton-20100608/basis-library/primitive/prim-pack-word.sml0000644000076600000240000000354211404435632021711 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure PackWord8 = struct type word = Word8.word val subArr = _prim "Word8Array_subWord8": Word8.word array * SeqIndex.int -> word; val subVec = _prim "Word8Vector_subWord8": Word8.word vector * SeqIndex.int -> word; val update = _prim "Word8Array_updateWord8": Word8.word array * SeqIndex.int * word -> unit; end structure PackWord16 = struct type word = Word16.word val subArr = _prim "Word8Array_subWord16": Word8.word array * SeqIndex.int -> word; val subVec = _prim "Word8Vector_subWord16": Word8.word vector * SeqIndex.int -> word; val update = _prim "Word8Array_updateWord16": Word8.word array * SeqIndex.int * word -> unit; end structure PackWord32 = struct type word = Word32.word val subArr = _prim "Word8Array_subWord32": Word8.word array * SeqIndex.int -> word; val subVec = _prim "Word8Vector_subWord32": Word8.word vector * SeqIndex.int -> word; val update = _prim "Word8Array_updateWord32": Word8.word array * SeqIndex.int * word -> unit; end structure PackWord64 = struct type word = Word64.word val subArr = _prim "Word8Array_subWord64": Word8.word array * SeqIndex.int -> word; val subVec = _prim "Word8Vector_subWord64": Word8.word vector * SeqIndex.int -> word; val update = _prim "Word8Array_updateWord64": Word8.word array * SeqIndex.int * word -> unit; end end mlton-20100608/basis-library/primitive/prim-real.sml0000644000076600000240000003130511404435632020743 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) signature PRIM_REAL = sig type real type t = real val realSize: Primitive.Int32.int val precision: Primitive.Int32.int val radix: Primitive.Int32.int structure Math : sig type real val acos: real -> real val asin: real -> real val atan: real -> real val atan2: real * real -> real val cos: real -> real val cosh: real -> real val e: real val exp: real -> real val ln: real -> real val log10: real -> real val pi: real val pow: real * real -> real val sin: real -> real val sinh: real -> real val sqrt: real -> real val tan: real -> real val tanh: real -> real end val * : real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val + : real * real -> real val - : real * real -> real val / : real * real -> real val ~ : real -> real val < : real * real -> bool val <= : real * real -> bool val == : real * real -> bool val ?= : real * real -> bool val abs: real -> real val class: real -> C_Int.t val frexp: real * C_Int.t ref -> real val gdtoa: real * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t val ldexp: real * C_Int.t -> real val maxFinite: real val minNormalPos: real val minPos: real val modf: real * real ref -> real val round: real -> real val signBit: real -> C_Int.t val strto: Primitive.NullString8.t * C_Int.t -> real (* Integer to float; depends on rounding mode. *) val fromInt8Unsafe: Primitive.Int8.int -> real val fromInt16Unsafe: Primitive.Int16.int -> real val fromInt32Unsafe: Primitive.Int32.int -> real val fromInt64Unsafe: Primitive.Int64.int -> real (* Float to float; depends on rounding mode. *) val fromReal32Unsafe: Primitive.Real32.real -> real val fromReal64Unsafe: Primitive.Real64.real -> real (* Word to float; depends on rounding mode. *) val fromWord8Unsafe: Primitive.Word8.word -> real val fromWord16Unsafe: Primitive.Word16.word -> real val fromWord32Unsafe: Primitive.Word32.word -> real val fromWord64Unsafe: Primitive.Word64.word -> real (* Float to integer, taking lowbits. *) val toInt8Unsafe: real -> Primitive.Int8.int val toInt16Unsafe: real -> Primitive.Int16.int val toInt32Unsafe: real -> Primitive.Int32.int val toInt64Unsafe: real -> Primitive.Int64.int (* Float to float; depends on rounding mode. *) val toReal32Unsafe: real -> Primitive.Real32.real val toReal64Unsafe: real -> Primitive.Real64.real (* Float to word, taking lowbits. *) val toWord8Unsafe: real -> Primitive.Word8.word val toWord16Unsafe: real -> Primitive.Word16.word val toWord32Unsafe: real -> Primitive.Word32.word val toWord64Unsafe: real -> Primitive.Word64.word end structure Primitive = struct open Primitive structure Real32 : PRIM_REAL = struct open Real32 val realSize : Int32.int = 32 val precision : Int32.int = 24 val radix : Int32.int = 2 structure Math = struct type real = real val acos = _prim "Real32_Math_acos": real -> real; val asin = _prim "Real32_Math_asin": real -> real; val atan = _prim "Real32_Math_atan": real -> real; val atan2 = _prim "Real32_Math_atan2": real * real -> real; val cos = _prim "Real32_Math_cos": real -> real; val cosh = _import "Real32_Math_cosh" private: real -> real; val e = #1 _symbol "Real32_Math_e" private: real GetSet.t; () val exp = _prim "Real32_Math_exp": real -> real; val ln = _prim "Real32_Math_ln": real -> real; val log10 = _prim "Real32_Math_log10": real -> real; val pi = #1 _symbol "Real32_Math_pi" private: real GetSet.t; () val pow = _import "Real32_Math_pow" private: real * real -> real; val sin = _prim "Real32_Math_sin": real -> real; val sinh = _import "Real32_Math_sinh" private: real -> real; val sqrt = _prim "Real32_Math_sqrt": real -> real; val tan = _prim "Real32_Math_tan": real -> real; val tanh = _import "Real32_Math_tanh" private: real -> real; end val * = _prim "Real32_mul": real * real -> real; val *+ = _prim "Real32_muladd": real * real * real -> real; val *- = _prim "Real32_mulsub": real * real * real -> real; val + = _prim "Real32_add": real * real -> real; val - = _prim "Real32_sub": real * real -> real; val / = _prim "Real32_div": real * real -> real; val ~ = _prim "Real32_neg": real -> real; val op < = _prim "Real32_lt": real * real -> bool; val op <= = _prim "Real32_le": real * real -> bool; val == = _prim "Real32_equal": real * real -> bool; val ?= = _prim "Real32_qequal": real * real -> bool; val abs = _prim "Real32_abs": real -> real; val class = _import "Real32_class" private: real -> C_Int.t; val frexp = _import "Real32_frexp" private: real * C_Int.t ref -> real; val gdtoa = _import "Real32_gdtoa" private: real * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t; val ldexp = _prim "Real32_ldexp": real * C_Int.t -> real; val maxFinite = #1 _symbol "Real32_maxFinite" private: real GetSet.t; () val minNormalPos = #1 _symbol "Real32_minNormalPos" private: real GetSet.t; () val minPos = #1 _symbol "Real32_minPos" private: real GetSet.t; () val modf = _import "Real32_modf" private: real * real ref -> real; val round = _prim "Real32_round": real -> real; val signBit = _import "Real32_signBit" private: real -> C_Int.t; val strto = _import "Real32_strto" private: NullString8.t * C_Int.t -> real; val fromInt8Unsafe = _prim "WordS8_rndToReal32": Int8.int -> real; val fromInt16Unsafe = _prim "WordS16_rndToReal32": Int16.int -> real; val fromInt32Unsafe = _prim "WordS32_rndToReal32": Int32.int -> real; val fromInt64Unsafe = _prim "WordS64_rndToReal32": Int64.int -> real; val fromReal32Unsafe = _prim "Real32_rndToReal32": Real32.real -> real; val fromReal64Unsafe = _prim "Real64_rndToReal32": Real64.real -> real; val fromWord8Unsafe = _prim "WordU8_rndToReal32": Word8.word -> real; val fromWord16Unsafe = _prim "WordU16_rndToReal32": Word16.word -> real; val fromWord32Unsafe = _prim "WordU32_rndToReal32": Word32.word -> real; val fromWord64Unsafe = _prim "WordU64_rndToReal32": Word64.word -> real; val toInt8Unsafe = _prim "Real32_rndToWordS8": real -> Int8.int; val toInt16Unsafe = _prim "Real32_rndToWordS16": real -> Int16.int; val toInt32Unsafe = _prim "Real32_rndToWordS32": real -> Int32.int; val toInt64Unsafe = _prim "Real32_rndToWordS64": real -> Int64.int; val toReal32Unsafe = _prim "Real32_rndToReal32": real -> Real32.real; val toReal64Unsafe = _prim "Real32_rndToReal64": real -> Real64.real; val toWord8Unsafe = _prim "Real32_rndToWordU8": real -> Word8.word; val toWord16Unsafe = _prim "Real32_rndToWordU16": real -> Word16.word; val toWord32Unsafe = _prim "Real32_rndToWordU32": real -> Word32.word; val toWord64Unsafe = _prim "Real32_rndToWordU64": real -> Word64.word; end structure Real32 = struct open Real32 local structure S = RealComparisons (Real32) in open S end end structure Real64 : sig include PRIM_REAL val castFromWord64 : Word64.word -> real val castToWord64 : real -> Word64.word end = struct open Real64 val realSize : Int32.int = 64 val precision : Int32.int = 53 val radix : Int32.int = 2 structure Math = struct type real = real val acos = _prim "Real64_Math_acos": real -> real; val asin = _prim "Real64_Math_asin": real -> real; val atan = _prim "Real64_Math_atan": real -> real; val atan2 = _prim "Real64_Math_atan2": real * real -> real; val cos = _prim "Real64_Math_cos": real -> real; val cosh = _import "Real64_Math_cosh" private: real -> real; val e = #1 _symbol "Real64_Math_e" private: real GetSet.t; () val exp = _prim "Real64_Math_exp": real -> real; val ln = _prim "Real64_Math_ln": real -> real; val log10 = _prim "Real64_Math_log10": real -> real; val pi = #1 _symbol "Real64_Math_pi" private: real GetSet.t; () val pow = _import "Real64_Math_pow" private: real * real -> real; val sin = _prim "Real64_Math_sin": real -> real; val sinh = _import "Real64_Math_sinh" private: real -> real; val sqrt = _prim "Real64_Math_sqrt": real -> real; val tan = _prim "Real64_Math_tan": real -> real; val tanh = _import "Real64_Math_tanh" private: real -> real; end val * = _prim "Real64_mul": real * real -> real; val *+ = _prim "Real64_muladd": real * real * real -> real; val *- = _prim "Real64_mulsub": real * real * real -> real; val + = _prim "Real64_add": real * real -> real; val - = _prim "Real64_sub": real * real -> real; val / = _prim "Real64_div": real * real -> real; val ~ = _prim "Real64_neg": real -> real; val op < = _prim "Real64_lt": real * real -> bool; val op <= = _prim "Real64_le": real * real -> bool; val == = _prim "Real64_equal": real * real -> bool; val ?= = _prim "Real64_qequal": real * real -> bool; val abs = _prim "Real64_abs": real -> real; val class = _import "Real64_class" private: real -> C_Int.t; val frexp = _import "Real64_frexp" private: real * C_Int.t ref -> real; val gdtoa = _import "Real64_gdtoa" private: real * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t; val ldexp = _prim "Real64_ldexp": real * C_Int.t -> real; val maxFinite = #1 _symbol "Real64_maxFinite" private: real GetSet.t; () val minNormalPos = #1 _symbol "Real64_minNormalPos" private: real GetSet.t; () val minPos = #1 _symbol "Real64_minPos" private: real GetSet.t; () val modf = _import "Real64_modf" private: real * real ref -> real; val round = _prim "Real64_round": real -> real; val signBit = _import "Real64_signBit" private: real -> C_Int.t; val strto = _import "Real64_strto" private: NullString8.t * C_Int.t -> real; val fromInt8Unsafe = _prim "WordS8_rndToReal64": Int8.int -> real; val fromInt16Unsafe = _prim "WordS16_rndToReal64": Int16.int -> real; val fromInt32Unsafe = _prim "WordS32_rndToReal64": Int32.int -> real; val fromInt64Unsafe = _prim "WordS64_rndToReal64": Int64.int -> real; val fromReal32Unsafe = _prim "Real32_rndToReal64": Real32.real -> real; val fromReal64Unsafe = _prim "Real64_rndToReal64": Real64.real -> real; val fromWord8Unsafe = _prim "WordU8_rndToReal64": Word8.word -> real; val fromWord16Unsafe = _prim "WordU16_rndToReal64": Word16.word -> real; val fromWord32Unsafe = _prim "WordU32_rndToReal64": Word32.word -> real; val fromWord64Unsafe = _prim "WordU64_rndToReal64": Word64.word -> real; val toInt8Unsafe = _prim "Real64_rndToWordS8": real -> Int8.int; val toInt16Unsafe = _prim "Real64_rndToWordS16": real -> Int16.int; val toInt32Unsafe = _prim "Real64_rndToWordS32": real -> Int32.int; val toInt64Unsafe = _prim "Real64_rndToWordS64": real -> Int64.int; val toReal32Unsafe = _prim "Real64_rndToReal32": real -> Real32.real; val toReal64Unsafe = _prim "Real64_rndToReal64": real -> Real64.real; val toWord8Unsafe = _prim "Real64_rndToWordU8": real -> Word8.word; val toWord16Unsafe = _prim "Real64_rndToWordU16": real -> Word16.word; val toWord32Unsafe = _prim "Real64_rndToWordU32": real -> Word32.word; val toWord64Unsafe = _prim "Real64_rndToWordU64": real -> Word64.word; val castFromWord64 = _prim "Word64_castToReal64": Word64.t -> real; val castToWord64 = _prim "Real64_castToWord64": real -> Word64.t; end structure Real64 = struct open Real64 local structure S = RealComparisons (Real64) in open S end end end mlton-20100608/basis-library/primitive/prim-seq.sml0000644000076600000240000000251311404435632020607 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure Array = struct open Array val arrayUnsafe = _prim "Array_array": SeqIndex.int -> 'a array; val array0Const = _prim "Array_array0Const": unit -> 'a array; val length = _prim "Array_length": 'a array -> SeqIndex.int; (* There is no maximum length on arrays, so maxLen' = SeqIndex.maxInt'. *) (* val maxLen': SeqIndex.int = SeqIndex.maxInt' *) val subUnsafe = _prim "Array_sub": 'a array * SeqIndex.int -> 'a; val updateUnsafe = _prim "Array_update": 'a array * SeqIndex.int * 'a -> unit; end structure Vector = struct open Vector (* Don't mutate the array after you apply fromArray, because vectors * are supposed to be immutable and the optimizer depends on this. *) val fromArrayUnsafe = _prim "Array_toVector": 'a array -> 'a vector; val length = _prim "Vector_length": 'a vector -> SeqIndex.int; val subUnsafe = _prim "Vector_sub": 'a vector * SeqIndex.int -> 'a; end end mlton-20100608/basis-library/primitive/prim-string.sml0000644000076600000240000000114511404435632021325 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure String8 = struct open String8 val idFromWord8Vector = _prim "Word8Vector_toString": Word8.word vector -> string; val idToWord8Vector = _prim "String_toWord8Vector": string -> Word8.word vector; end end mlton-20100608/basis-library/primitive/prim-word.sml0000644000076600000240000003307311404435632020777 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) signature PRIM_WORD = sig eqtype word type t = word val sizeInBits: Primitive.Int32.int val sizeInBitsWord: Primitive.Word32.word val + : word * word -> word val andb : word * word -> word val < word val * : word * word -> word val ~ : word -> word val notb : word -> word val orb : word * word -> word val quotUnsafe : word * word -> word val remUnsafe: word * word -> word val rolUnsafe: word * Primitive.Word32.word -> word val rorUnsafe: word * Primitive.Word32.word -> word val ~>>? : word * Primitive.Word32.word -> word val >>? : word * Primitive.Word32.word -> word val - : word * word -> word val xorb: word * word -> word val < : word * word -> bool val <= : word * word -> bool val > : word * word -> bool val >= : word * word -> bool val compare: word * word -> Primitive.Order.order val min: word * word -> word val max: word * word -> word end structure Primitive = struct open Primitive structure Word1 = struct open Word1 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord1": big -> word; val toBig = _prim "WordU1_extdToWord8": word -> big; val sizeInBits: Int32.int = 1 end structure Word2 = struct open Word2 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord2": big -> word; val toBig = _prim "WordU2_extdToWord8": word -> big; val sizeInBits: Int32.int = 2 end structure Word3 = struct open Word3 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord3": big -> word; val toBig = _prim "WordU3_extdToWord8": word -> big; val sizeInBits: Int32.int = 3 end structure Word4 = struct open Word4 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord4": big -> word; val toBig = _prim "WordU4_extdToWord8": word -> big; val sizeInBits: Int32.int = 4 end structure Word5 = struct open Word5 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord5": big -> word; val toBig = _prim "WordU5_extdToWord8": word -> big; val sizeInBits: Int32.int = 5 end structure Word6 = struct open Word6 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord6": big -> word; val toBig = _prim "WordU6_extdToWord8": word -> big; val sizeInBits: Int32.int = 6 end structure Word7 = struct open Word7 type big = Word8.word val fromBigUnsafe = _prim "WordU8_extdToWord7": big -> word; val toBig = _prim "WordU7_extdToWord8": word -> big; val sizeInBits: Int32.int = 7 end structure Word8 = struct open Word8 val sizeInBits: Int32.int = 8 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val + = _prim "Word8_add": word * word -> word; val andb = _prim "Word8_andb": word * word -> word; val < word; val * = _prim "WordU8_mul": word * word -> word; val ~ = _prim "Word8_neg": word -> word; val notb = _prim "Word8_notb": word -> word; val orb = _prim "Word8_orb": word * word -> word; val quotUnsafe = _prim "WordU8_quot": word * word -> word; val remUnsafe = _prim "WordU8_rem": word * word -> word; val rolUnsafe = _prim "Word8_rol": word * Word32.word -> word; val rorUnsafe = _prim "Word8_ror": word * Word32.word -> word; val ~>>? = _prim "WordS8_rshift": word * Word32.word -> word; val >>? = _prim "WordU8_rshift": word * Word32.word -> word; val - = _prim "Word8_sub": word * word -> word; val xorb = _prim "Word8_xorb": word * word -> word; val < = _prim "WordU8_lt": word * word -> bool; end structure Word8 : PRIM_WORD = struct open Word8 local structure S = IntegralComparisons(Word8) in open S end end structure Word9 = struct open Word9 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord9": big -> word; val toBig = _prim "WordU9_extdToWord16": word -> big; val sizeInBits: Int32.int = 9 end structure Word10 = struct open Word10 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord10": big -> word; val toBig = _prim "WordU10_extdToWord16": word -> big; val sizeInBits: Int32.int = 10 end structure Word11 = struct open Word11 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord11": big -> word; val toBig = _prim "WordU11_extdToWord16": word -> big; val sizeInBits: Int32.int = 11 end structure Word12 = struct open Word12 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord12": big -> word; val toBig = _prim "WordU12_extdToWord16": word -> big; val sizeInBits: Int32.int = 12 end structure Word13 = struct open Word13 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord13": big -> word; val toBig = _prim "WordU13_extdToWord16": word -> big; val sizeInBits: Int32.int = 13 end structure Word14 = struct open Word14 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord14": big -> word; val toBig = _prim "WordU14_extdToWord16": word -> big; val sizeInBits: Int32.int = 14 end structure Word15 = struct open Word15 type big = Word16.word val fromBigUnsafe = _prim "WordU16_extdToWord15": big -> word; val toBig = _prim "WordU15_extdToWord16": word -> big; val sizeInBits: Int32.int = 15 end structure Word16 = struct open Word16 val sizeInBits: Int32.int = 16 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val + = _prim "Word16_add": word * word -> word; val andb = _prim "Word16_andb": word * word -> word; val < word; val * = _prim "WordU16_mul": word * word -> word; val ~ = _prim "Word16_neg": word -> word; val notb = _prim "Word16_notb": word -> word; val orb = _prim "Word16_orb": word * word -> word; val quotUnsafe = _prim "WordU16_quot": word * word -> word; val remUnsafe = _prim "WordU16_rem": word * word -> word; val rolUnsafe = _prim "Word16_rol": word * Word32.word -> word; val rorUnsafe = _prim "Word16_ror": word * Word32.word -> word; val ~>>? = _prim "WordS16_rshift": word * Word32.word -> word; val >>? = _prim "WordU16_rshift": word * Word32.word -> word; val - = _prim "Word16_sub": word * word -> word; val xorb = _prim "Word16_xorb": word * word -> word; val < = _prim "WordU16_lt": word * word -> bool; end structure Word16 : PRIM_WORD = struct open Word16 local structure S = IntegralComparisons(Word16) in open S end end structure Word17 = struct open Word17 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord17": big -> word; val toBig = _prim "WordU17_extdToWord32": word -> big; val sizeInBits: Int32.int = 17 end structure Word18 = struct open Word18 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord18": big -> word; val toBig = _prim "WordU18_extdToWord32": word -> big; val sizeInBits: Int32.int = 18 end structure Word19 = struct open Word19 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord19": big -> word; val toBig = _prim "WordU19_extdToWord32": word -> big; val sizeInBits: Int32.int = 19 end structure Word20 = struct open Word20 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord20": big -> word; val toBig = _prim "WordU20_extdToWord32": word -> big; val sizeInBits: Int32.int = 20 end structure Word21 = struct open Word21 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord21": big -> word; val toBig = _prim "WordU21_extdToWord32": word -> big; val sizeInBits: Int32.int = 21 end structure Word22 = struct open Word22 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord22": big -> word; val toBig = _prim "WordU22_extdToWord32": word -> big; val sizeInBits: Int32.int = 22 end structure Word23 = struct open Word23 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord23": big -> word; val toBig = _prim "WordU23_extdToWord32": word -> big; val sizeInBits: Int32.int = 23 end structure Word24 = struct open Word24 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord24": big -> word; val toBig = _prim "WordU24_extdToWord32": word -> big; val sizeInBits: Int32.int = 24 end structure Word25 = struct open Word25 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord25": big -> word; val toBig = _prim "WordU25_extdToWord32": word -> big; val sizeInBits: Int32.int = 25 end structure Word26 = struct open Word26 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord26": big -> word; val toBig = _prim "WordU26_extdToWord32": word -> big; val sizeInBits: Int32.int = 26 end structure Word27 = struct open Word27 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord27": big -> word; val toBig = _prim "WordU27_extdToWord32": word -> big; val sizeInBits: Int32.int = 27 end structure Word28 = struct open Word28 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord28": big -> word; val toBig = _prim "WordU28_extdToWord32": word -> big; val sizeInBits: Int32.int = 28 end structure Word29 = struct open Word29 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord29": big -> word; val toBig = _prim "WordU29_extdToWord32": word -> big; val sizeInBits: Int32.int = 29 end structure Word30 = struct open Word30 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord30": big -> word; val toBig = _prim "WordU30_extdToWord32": word -> big; val sizeInBits: Int32.int = 30 end structure Word31 = struct open Word31 type big = Word32.word val fromBigUnsafe = _prim "WordU32_extdToWord31": big -> word; val toBig = _prim "WordU31_extdToWord32": word -> big; val sizeInBits: Int32.int = 31 end structure Word32 = struct open Word32 val sizeInBits: Int32.int = 32 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val + = _prim "Word32_add": word * word -> word; val andb = _prim "Word32_andb": word * word -> word; val < word; val * = _prim "WordU32_mul": word * word -> word; val ~ = _prim "Word32_neg": word -> word; val notb = _prim "Word32_notb": word -> word; val orb = _prim "Word32_orb": word * word -> word; val quotUnsafe = _prim "WordU32_quot": word * word -> word; val remUnsafe = _prim "WordU32_rem": word * word -> word; val rolUnsafe = _prim "Word32_rol": word * Word32.word -> word; val rorUnsafe = _prim "Word32_ror": word * Word32.word -> word; val ~>>? = _prim "WordS32_rshift": word * Word32.word -> word; val >>? = _prim "WordU32_rshift": word * Word32.word -> word; val - = _prim "Word32_sub": word * word -> word; val xorb = _prim "Word32_xorb": word * word -> word; val < = _prim "WordU32_lt": word * word -> bool; end structure Word32 : PRIM_WORD = struct open Word32 local structure S = IntegralComparisons(Word32) in open S end end structure Word64 = struct open Word64 val sizeInBits: Int32.int = 64 val sizeInBitsWord: Word32.word = IntWordConv.zextdFromInt32ToWord32 sizeInBits val + = _prim "Word64_add": word * word -> word; val andb = _prim "Word64_andb": word * word -> word; val < word; val * = _prim "WordU64_mul": word * word -> word; val ~ = _prim "Word64_neg": word -> word; val notb = _prim "Word64_notb": word -> word; val orb = _prim "Word64_orb": word * word -> word; val quotUnsafe = _prim "WordU64_quot": word * word -> word; val remUnsafe = _prim "WordU64_rem": word * word -> word; val rolUnsafe = _prim "Word64_rol": word * Word32.word -> word; val rorUnsafe = _prim "Word64_ror": word * Word32.word -> word; val ~>>? = _prim "WordS64_rshift": word * Word32.word -> word; val >>? = _prim "WordU64_rshift": word * Word32.word -> word; val - = _prim "Word64_sub": word * word -> word; val xorb = _prim "Word64_xorb": word * word -> word; val < = _prim "WordU64_lt": word * word -> bool; end structure Word64 : PRIM_WORD = struct open Word64 local structure S = IntegralComparisons(Word64) in open S end end end mlton-20100608/basis-library/primitive/prim1.sml0000644000076600000240000000533011404435632020102 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Primitive names are special -- see atoms/prim.fun. *) structure Primitive = struct open Primitive structure GetSet = struct type 'a t = (unit -> 'a) * ('a -> unit) end structure PreThread :> sig type t end = struct type t = Thread.t end structure Thread :> sig type t end = struct type t = Thread.t end (**************************************************************************) structure Bool = struct open Bool fun not b = if b then false else true end structure Controls = struct val debug = _command_line_const "MLton.debug": bool = false; val detectOverflow = _command_line_const "MLton.detectOverflow": bool = true; val safe = _command_line_const "MLton.safe": bool = true; val bufSize = _command_line_const "TextIO.bufSize": Int32.int = 4096; end structure Exn = struct open Exn val name = _prim "Exn_name": exn -> String8.string; exception Div exception Domain exception Fail8 of String8.string exception Fail16 of String16.string exception Fail32 of String32.string exception Overflow exception Size exception Subscript val wrapOverflow: ('a -> 'b) -> ('a -> 'b) = fn f => fn a => f a handle PrimOverflow => raise Overflow end structure Order = struct datatype t = LESS | EQUAL | GREATER datatype order = datatype t end structure Option = struct datatype 'a t = NONE | SOME of 'a datatype option = datatype t end structure Ref = struct open Ref val deref = _prim "Ref_deref": 'a ref -> 'a; val assign = _prim "Ref_assign": 'a ref * 'a -> unit; end structure TopLevel = struct val getHandler = _prim "TopLevel_getHandler": unit -> (exn -> unit); val getSuffix = _prim "TopLevel_getSuffix": unit -> (unit -> unit); val setHandler = _prim "TopLevel_setHandler": (exn -> unit) -> unit; val setSuffix = _prim "TopLevel_setSuffix": (unit -> unit) -> unit; end end val not = Primitive.Bool.not exception Bind = Primitive.Exn.Bind exception Div = Primitive.Exn.Div exception Domain = Primitive.Exn.Domain exception Match = Primitive.Exn.Match exception Overflow = Primitive.Exn.Overflow exception Size = Primitive.Exn.Size exception Subscript = Primitive.Exn.Subscript datatype option = datatype Primitive.Option.option datatype order = datatype Primitive.Order.order infix 4 = <> val op = = _prim "MLton_equal": ''a * ''a -> bool; val op <> = fn (x, y) => not (x = y) mlton-20100608/basis-library/primitive/prim2.sml0000644000076600000240000000306711404435632020110 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Primitive = struct open Primitive structure MLton = struct open MLton val bug = PrimitiveFFI.MLton.bug end val dontInline: (unit -> 'a) -> 'a = fn f => let val rec recur: Int32.int -> 'a = fn i => if i = 0 then f () else let val _ = recur (Int32.- (i, 1)) in recur (Int32.- (i, 2)) end in recur 0 end end (* Install an emergency exception handler. *) local structure P = Primitive structure PFFI = PrimitiveFFI val _ = P.TopLevel.setHandler (fn exn => (PFFI.Stdio.print "unhandled exception: " ; case exn of P.Exn.Fail8 msg => (PFFI.Stdio.print "Fail " ; PFFI.Stdio.print msg) | _ => PFFI.Stdio.print (P.Exn.name exn) ; PFFI.Stdio.print "\n" ; P.MLton.bug ("unhandled exception in Basis Library"))) in end (* Install an emergency suffix. *) local structure P = Primitive val _ = P.TopLevel.setSuffix (fn () => (P.MLton.halt 0 ; P.MLton.bug ("missing suffix in Basis Library"))) in end mlton-20100608/basis-library/primitive/primitive.mlb0000644000076600000240000000353011404435632021041 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "allowConstant true" "allowFFI true" "allowPrim true" "deadCode true" "nonexhaustiveMatch warn" "redundantMatch warn" "sequenceNonUnit warn" "warnUnused false" in prim-basis.mlb ann "allowRebindEquals true" in prim1.sml end ../util/integral-comparisons.sml ../util/string-comparisons.sml ../util/real-comparisons.sml local ../config/bind/char-prim.sml ../config/bind/int-prim.sml ../config/bind/int-inf-prim.sml ../config/bind/real-prim.sml ../config/bind/string-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/choose-char.sml ../config/choose-int.sml ../config/choose-real.sml ../config/choose-string.sml ../config/choose-word.sml ../config/c/word-to-bool.sml end end prim-iwconv.sml prim-word.sml prim-int.sml local ../config/bind/int-prim.sml ../config/bind/pointer-prim.sml ../config/bind/real-prim.sml ../config/bind/word-prim.sml in ann "forceUsed" in ../config/objptr/objptr-$(OBJPTR_REP).sml ../config/header/header-$(HEADER_WORD).sml ../config/seqindex/seqindex-$(SEQINDEX_INT).sml $(LIB_MLTON_DIR)/targets/$(TARGET)/sml/c-types.sml ../config/c/errno.sml ../config/c/position.sml ../config/c/sys-word.sml end end prim-seq.sml prim-nullstring.sml prim-int-inf.sml prim-char.sml prim-string.sml prim-real.sml prim-pack-word.sml prim-pack-real.sml prim-mlton.sml basis-ffi.sml prim2.sml (* Check compatibility between primitives and runtime functions. *) check-real.sml end mlton-20100608/basis-library/README0000644000076600000240000000243411404435632015207 0ustar mtfstaffThis directory contains the MLton implementation of the Basis Library. The files are grouped in directories in the same way that the corresponding modules are grouped in the basis library documentation. All other implementation files are in the misc/ and libs/ directories. The basis is constructed using the ML Basis system. There are several special files that make use of non-SML extensions. misc/primitive.sml posix/primitve.sml These are not Standard ML. They describe all of the primitives and C routines used in the basis. top-level/overloads.sml Not Standard ML. Uses the notation _overload : as (and )* Dead Code Elimination ---------------------------------------- In order to compile small programs rapidly, a pass of dead code elimination (core-ml/dead-code.{sig,fun}) is run in order to eliminate as much of the basis library as possible. The dead code elimination algorithm used is not safe in general, and only works because the basis library implementation has special properties: * it terminates * it performs no I/O The dead code elimination includes the minimal set of declarations from the basis so that there are no free variables in the user program (or basis). It has a special hack to include all bindings of the form val _ = ... mlton-20100608/basis-library/real/0000755000076600000240000000000011404470406015245 5ustar mtfstaffmlton-20100608/basis-library/real/IEEE-real.sig0000644000076600000240000000175311404435631017410 0ustar mtfstaffsignature IEEE_REAL = sig exception Unordered datatype real_order = LESS | EQUAL | GREATER | UNORDERED datatype float_class = NAN | INF | ZERO | NORMAL | SUBNORMAL datatype rounding_mode = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO type decimal_approx = {class: float_class, digits: int list, exp: int, sign: bool} val fromString: string -> decimal_approx option val getRoundingMode: unit -> rounding_mode val scan: (char, 'a) StringCvt.reader -> (decimal_approx, 'a) StringCvt.reader val setRoundingMode: rounding_mode -> unit val toString: decimal_approx -> string end signature IEEE_REAL_EXTRA = sig include IEEE_REAL val mkClass: ('a -> C_Int.t) -> 'a -> float_class val withRoundingMode: rounding_mode * (unit -> 'a) -> 'a end mlton-20100608/basis-library/real/IEEE-real.sml0000644000076600000240000003635711404435631017431 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure IEEEReal: IEEE_REAL_EXTRA = struct val op + = Int.+ val op - = Int.- val op * = Int.* exception Unordered datatype real_order = LESS | EQUAL | GREATER | UNORDERED structure Prim = PrimitiveFFI.IEEEReal datatype float_class = INF | NAN | NORMAL | SUBNORMAL | ZERO fun mkClass class x = let val i = class x open Prim.FloatClass in (* order here is chosen based on putting the more * commonly used classes at the front. *) if i = FP_NORMAL then NORMAL else if i = FP_ZERO then ZERO else if i = FP_INFINITE then INF else if i = FP_NAN then NAN else if i = FP_SUBNORMAL then SUBNORMAL else raise Fail "Real_class returned bogus integer" end structure RoundingMode = struct datatype t = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO fun fromInt (i: C_Int.int): t = let open Prim.RoundingMode in if i = FE_TONEAREST then TO_NEAREST else if i = FE_DOWNWARD then TO_NEGINF else if i = FE_UPWARD then TO_POSINF else if i = FE_TOWARDZERO then TO_ZERO else raise Fail "IEEEReal.RoundingMode.fromInt" end fun toInt (m: t): C_Int.int = let open Prim.RoundingMode val i = case m of TO_NEAREST => FE_TONEAREST | TO_NEGINF => FE_DOWNWARD | TO_POSINF => FE_UPWARD | TO_ZERO => FE_TOWARDZERO in if i = FE_NOSUPPORT then raise Fail "IEEEReal rounding mode not supported" else i end end datatype rounding_mode = datatype RoundingMode.t fun setRoundingMode (m: rounding_mode): unit = if Prim.setRoundingMode (RoundingMode.toInt m) = 0 then () else raise PosixError.raiseSys PosixError.inval val getRoundingMode = RoundingMode.fromInt o Prim.getRoundingMode fun withRoundingMode (m: rounding_mode, th: unit -> 'a): 'a = let val m' = getRoundingMode () val _ = setRoundingMode m val res = th () val _ = setRoundingMode m' in res end structure DecimalApprox = struct type t = {class: float_class, digits: int list, exp: int, sign: bool} val inf: t = {class = INF, digits = [], exp = 0, sign = false} val zero: t = {class = ZERO, digits = [], exp = 0, sign = false} end type decimal_approx = DecimalApprox.t fun 'a scan reader (state: 'a) = let val state = StringCvt.skipWS reader state fun readc (c, state, f) = case reader state of NONE => NONE | SOME (c', state') => if c = Char.toLower c' then f state' else NONE fun readString (s, state, failure, success) = let val n = String.size s fun loop (i, state) = if i = n then success state else case reader state of NONE => failure () | SOME (c, state) => if Char.toLower c = String.sub (s, i) then loop (i + 1, state) else failure () in loop (0, state) end fun charToDigit c = Char.ord c - Char.ord #"0" fun digitStar (ds: int list, state) = let fun done () = (rev ds, state) in case reader state of NONE => done () | SOME (c, state) => if Char.isDigit c then digitStar (charToDigit c :: ds, state) else done () end fun digitPlus (state, failure, success) = case reader state of NONE => failure () | SOME (c, state) => if Char.isDigit c then success (digitStar ([charToDigit c], state)) else failure () (* [+~-]?[0-9]+ *) type exp = {digits: int list, negate: bool} fun 'b afterE (state: 'a, failure: unit -> 'b, success: exp * 'a -> 'b) : 'b = case reader state of NONE => failure () | SOME (c, state) => let fun neg () = digitPlus (state, failure, fn (ds, state) => success ({digits = ds, negate = true}, state)) in case c of #"+" => digitPlus (state, failure, fn (ds, state) => success ({digits = ds, negate = false}, state)) | #"~" => neg () | #"-" => neg () | _ => if Char.isDigit c then let val (ds, state) = digitStar ([charToDigit c], state) in success ({digits = ds, negate = false}, state) end else failure () end (* e[+~-]?[0-9]+)? *) fun exp (state: 'a, failure, success) = case reader state of NONE => failure () | SOME (c, state) => case Char.toLower c of #"e" => afterE (state, failure, success) | _ => failure () (* (\.[0-9]+)(e[+~-]?[0-9]+)? *) fun 'b afterDot (state: 'a, failure: unit -> 'b, success: int list * exp * 'a -> 'b) = digitPlus (state, failure, fn (frac, state) => exp (state, fn () => success (frac, {digits = [], negate = false}, state), fn (e, state) => success (frac, e, state))) fun stripLeadingZeros (ds: int list): int * int list = let fun loop (i, ds) = case ds of [] => (i, []) | d :: ds' => if d = 0 then loop (i + 1, ds') else (i, ds) in loop (0, ds) end fun stripTrailingZeros ds = case ds of [] => [] | _ => case List.last ds of 0 => rev (#2 (stripLeadingZeros (rev ds))) | _ => ds fun done (whole: int list, frac: int list, {digits: int list, negate: bool}, state: 'a) = let val (_, il) = stripLeadingZeros whole val fl = stripTrailingZeros frac datatype exp = Int of int | Overflow of DecimalApprox.t val exp = case (SOME (let val i = List.foldl (fn (d, n) => n * 10 + d) 0 digits in if negate then Int.~ i else i end) handle General.Overflow => NONE) of NONE => Overflow (if negate then DecimalApprox.zero else DecimalApprox.inf) | SOME i => Int i val da = case il of [] => (case fl of [] => DecimalApprox.zero | _ => case exp of Int e => let val (m, fl) = stripLeadingZeros fl in {class = NORMAL, digits = fl, exp = e - m, sign = false} end | Overflow da => da) | _ => case exp of Int e => {class = NORMAL, digits = stripTrailingZeros (il @ fl), exp = e + length il, sign = false} | Overflow da => da in SOME (da, state) end fun normal' (c, state) = case Char.toLower c of #"i" => readc (#"n", state, fn state => readc (#"f", state, fn state => let fun res state = SOME ({class = INF, digits = [], exp = 0, sign = false}, state) in readString ("inity", state, fn () => res state, res) end)) | #"n" => readc (#"a", state, fn state => readc (#"n", state, fn state => SOME ({class = NAN, digits = [], exp = 0, sign = false}, state))) (* (([0-9]+(\.[0-9]+)?)|(\.[0-9]+))(e[+~-]?[0-9]+)? *) | #"." => afterDot (state, fn () => NONE, fn (frac, exp, state) => done ([], frac, exp, state)) | _ => if Char.isDigit c then (* ([0-9]+(\.[0-9]+)?)(e[+~-]?[0-9]+)? *) let val (whole, state) = digitStar ([charToDigit c], state) fun no () = done (whole, [], {digits = [], negate = false}, state) in case reader state of NONE => no () | SOME (c, state) => case Char.toLower c of #"." => afterDot (state, no, fn (frac, e, state) => done (whole, frac, e, state)) | #"e" => afterE (state, no, fn (e, state) => done (whole, [], e, state)) | _ => no () end else NONE fun normal state = case reader state of NONE => NONE | SOME z => normal' z fun negate state = case normal state of NONE => NONE | SOME ({class, digits, exp, ...}, state) => SOME ({class = class, digits = digits, exp = exp, sign = true}, state) in case reader state of NONE => NONE | SOME (c, state) => case c of #"~" => negate state | #"-" => negate state | #"+" => normal state | _ => normal' (c, state) end fun fromString s = StringCvt.scanString scan s fun toString {class, sign, digits, exp}: string = let fun digitStr () = implode (map StringCvt.digitToChar digits) fun norm () = let val num = "0." ^ digitStr() in if exp = 0 then num else concat [num, "E", Int.toString exp] end val num = case class of ZERO => "0.0" | NORMAL => norm () | SUBNORMAL => norm () | INF => "inf" | NAN => "nan" in if sign then "~" ^ num else num end end mlton-20100608/basis-library/real/math.sig0000644000076600000240000000104111404435631016677 0ustar mtfstaffsignature MATH = sig type real val acos: real -> real val asin: real -> real val atan2: real * real -> real val atan: real -> real val cos: real -> real val cosh: real -> real val e: real val exp: real -> real val ln: real -> real val log10: real -> real val pi: real val pow: real * real -> real val sin: real -> real val sinh: real -> real val sqrt: real -> real val tan: real -> real val tanh: real -> real end mlton-20100608/basis-library/real/pack-real.sig0000644000076600000240000000114011404435631017605 0ustar mtfstaffsignature PACK_REAL = sig type real val bytesPerElem: int val isBigEndian: bool val toBytes: real -> Word8Vector.vector val fromBytes: Word8Vector.vector -> real val subVec: Word8Vector.vector * int -> real val subArr: Word8Array.array * int -> real val update: Word8Array.array * int * real -> unit end signature PACK_REAL_EXTRA = sig include PACK_REAL val unsafeSubVec: Word8Vector.vector * int -> real val unsafeSubArr: Word8Array.array * int -> real val unsafeUpdate: Word8Array.array * int * real -> unit end mlton-20100608/basis-library/real/pack-real.sml0000644000076600000240000002243211404435631017625 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PackRealArg (S: sig type real type word val subArr: Word8.word array * SeqIndex.int -> word val subVec: Word8.word vector * SeqIndex.int -> word val update: Word8.word array * SeqIndex.int * word -> unit val bswap: word -> word val castFromWord: word -> real val castToWord: real -> word end) = struct open S val subArrRev = castFromWord o bswap o subArr val subVecRev = castFromWord o bswap o subVec fun updateRev (a, i, r) = update (a, i, bswap (castToWord r)) val subArr = castFromWord o subArr val subVec = castFromWord o subVec val update = fn (a, i, r) => update (a, i, castToWord r) end structure PackReal32Arg = PackRealArg (open Primitive.PackReal32 open Primitive.PackWord32 val bswap = Word32.bswap) structure PackReal64Arg = PackRealArg (open Primitive.PackReal64 open Primitive.PackWord64 val bswap = Word64.bswap) structure PackRealArg = struct type real = Real.real local structure S = Real_ChooseRealN (type 'a t = int val fReal32 = Real32.realSize val fReal64 = Real64.realSize) in val realSize = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subArr val fReal64 = PackReal64Arg.subArr) in val subArr = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word vector * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subVec val fReal64 = PackReal64Arg.subVec) in val subVec = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int * 'a -> unit val fReal32 = PackReal32Arg.update val fReal64 = PackReal64Arg.update) in val update = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subArrRev val fReal64 = PackReal64Arg.subArrRev) in val subArrRev = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word vector * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subVecRev val fReal64 = PackReal64Arg.subVecRev) in val subVecRev = S.f end local structure S = Real_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int * 'a -> unit val fReal32 = PackReal32Arg.updateRev val fReal64 = PackReal64Arg.updateRev) in val updateRev = S.f end end structure PackLargeRealArg = struct type real = LargeReal.real local structure S = LargeReal_ChooseRealN (type 'a t = int val fReal32 = Real32.realSize val fReal64 = Real64.realSize) in val realSize = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subArr val fReal64 = PackReal64Arg.subArr) in val subArr = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word vector * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subVec val fReal64 = PackReal64Arg.subVec) in val subVec = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int * 'a -> unit val fReal32 = PackReal32Arg.update val fReal64 = PackReal64Arg.update) in val update = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subArrRev val fReal64 = PackReal64Arg.subArrRev) in val subArrRev = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word vector * SeqIndex.int -> 'a val fReal32 = PackReal32Arg.subVecRev val fReal64 = PackReal64Arg.subVecRev) in val subVecRev = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = Word8.word array * SeqIndex.int * 'a -> unit val fReal32 = PackReal32Arg.updateRev val fReal64 = PackReal64Arg.updateRev) in val updateRev = S.f end end functor PackReal (S: sig type real val realSize: int val isBigEndian: bool val subArr: Word8.word array * SeqIndex.int -> real val subVec: Word8.word vector * SeqIndex.int -> real val update: Word8.word array * SeqIndex.int * real -> unit val subArrRev: Word8.word array * SeqIndex.int -> real val subVecRev: Word8.word vector * SeqIndex.int -> real val updateRev: Word8.word array * SeqIndex.int * real -> unit end): PACK_REAL_EXTRA = struct open S val bytesPerElem = Int.div (realSize, 8) fun offset (i, n) = let val i' = Int.* (bytesPerElem, i) val () = if Primitive.Controls.safe andalso (Int.geu (Int.+ (i', Int.- (bytesPerElem, 1)), n)) then raise Subscript else () in SeqIndex.fromInt i end handle Overflow => raise Subscript val (subA, subV, updA) = if isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian then (subArr, subVec, update) else (subArrRev, subVecRev, updateRev) fun update (a, i, r) = let val i = offset (i, Word8Array.length a) val a = Word8Array.toPoly a in updA (a, i, r) end fun unsafeUpdate (a, i, r) = let val i = SeqIndex.fromInt i val a = Word8Array.toPoly a in updA (a, i, r) end local fun make (sub, length, toPoly) (av, i) = let val i = offset (i, length av) in sub (toPoly av, i) end in val subArr = make (subA, Word8Array.length, Word8Array.toPoly) val subVec = make (subV, Word8Vector.length, Word8Vector.toPoly) end local fun make (sub, length, toPoly) (av, i) = let val i = SeqIndex.fromInt i in sub (toPoly av, i) end in val unsafeSubArr = make (subA, Word8Array.length, Word8Array.toPoly) val unsafeSubVec = make (subV, Word8Vector.length, Word8Vector.toPoly) end fun toBytes (r: real): Word8Vector.vector = let val a = Array.arrayUninit bytesPerElem in (updA (a, 0, r) ; Word8Vector.fromPoly (Array.vector a)) end fun fromBytes v = subVec (v, 0) end structure PackReal32Big: PACK_REAL_EXTRA = PackReal (open Real32 open PackReal32Arg val isBigEndian = true) structure PackReal32Little: PACK_REAL_EXTRA = PackReal (open Real32 open PackReal32Arg val isBigEndian = false) structure PackReal32Host: PACK_REAL_EXTRA = PackReal (open Real32 open PackReal32Arg val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian) structure PackReal64Big: PACK_REAL_EXTRA = PackReal (open Real64 open PackReal64Arg val isBigEndian = true) structure PackReal64Little: PACK_REAL_EXTRA = PackReal (open Real64 open PackReal64Arg val isBigEndian = false) structure PackReal64Host: PACK_REAL_EXTRA = PackReal (open Real64 open PackReal64Arg val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian) structure PackRealBig: PACK_REAL_EXTRA = PackReal (open Real open PackRealArg val isBigEndian = true) structure PackRealLittle: PACK_REAL_EXTRA = PackReal (open Real open PackRealArg val isBigEndian = false) structure PackRealHost: PACK_REAL_EXTRA = PackReal (open Real open PackRealArg val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian) structure PackLargeRealBig: PACK_REAL_EXTRA = PackReal (open LargeReal open PackLargeRealArg val isBigEndian = true) structure PackLargeRealLittle: PACK_REAL_EXTRA = PackReal (open LargeReal open PackLargeRealArg val isBigEndian = false) structure PackLargeRealHost: PACK_REAL_EXTRA = PackReal (open LargeReal open PackLargeRealArg val isBigEndian = Primitive.MLton.Platform.Arch.hostIsBigEndian) mlton-20100608/basis-library/real/real-global.sml0000644000076600000240000000051411404435631020144 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val real = Real.fromInt structure RealGlobal: REAL_GLOBAL = Real open RealGlobal mlton-20100608/basis-library/real/real.sig0000644000076600000240000001213011404435631016672 0ustar mtfstaffsignature PRE_REAL_GLOBAL = sig type real structure Math: MATH where type real = real end signature PRE_REAL = sig include PRE_REAL_GLOBAL val * : real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val + : real * real -> real val - : real * real -> real val / : real * real -> real val < : real * real -> bool val <= : real * real -> bool val == : real * real -> bool val > : real * real -> bool val >= : real * real -> bool val ?= : real * real -> bool val ~ : real -> real val abs: real -> real val maxFinite: real val minNormalPos: real val minPos: real val realSize: Primitive.Int32.int val precision: Primitive.Int32.int val radix: Primitive.Int32.int val class: real -> C_Int.t val signBit: real -> C_Int.t val nextAfterDown: real -> real val nextAfterUp: real -> real val frexp: real * C_Int.int ref -> real val ldexp: real * C_Int.int -> real val modf: real * real ref -> real val round: real -> real val gdtoa: real * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t val strto: Primitive.NullString8.t * C_Int.t -> real val fromInt8Unsafe: Primitive.Int8.int -> real val fromInt16Unsafe: Primitive.Int16.int -> real val fromInt32Unsafe: Primitive.Int32.int -> real val fromInt64Unsafe: Primitive.Int64.int -> real val fromReal32Unsafe: Primitive.Real32.real -> real val fromReal64Unsafe: Primitive.Real64.real -> real val fromWord8Unsafe: Primitive.Word8.word -> real val fromWord16Unsafe: Primitive.Word16.word -> real val fromWord32Unsafe: Primitive.Word32.word -> real val fromWord64Unsafe: Primitive.Word64.word -> real val toInt8Unsafe: real -> Primitive.Int8.int val toInt16Unsafe: real -> Primitive.Int16.int val toInt32Unsafe: real -> Primitive.Int32.int val toInt64Unsafe: real -> Primitive.Int64.int val toReal32Unsafe: real -> Primitive.Real32.real val toReal64Unsafe: real -> Primitive.Real64.real val toWord8Unsafe: real -> Primitive.Word8.word val toWord16Unsafe: real -> Primitive.Word16.word val toWord32Unsafe: real -> Primitive.Word32.word val toWord64Unsafe: real -> Primitive.Word64.word end signature REAL_GLOBAL = sig include PRE_REAL_GLOBAL val round: real -> Int.int val trunc: real -> Int.int val ceil: real -> Int.int val floor: real -> Int.int end signature REAL = sig include REAL_GLOBAL val != : real * real -> bool val * : real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val + : real * real -> real val - : real * real -> real val / : real * real -> real val < : real * real -> bool val <= : real * real -> bool val == : real * real -> bool val > : real * real -> bool val >= : real * real -> bool val ?= : real * real -> bool val ~ : real -> real val abs: real -> real val checkFloat: real -> real val class: real -> IEEEReal.float_class val compare: real * real -> order val compareReal: real * real -> IEEEReal.real_order val copySign: real * real -> real val fmt: StringCvt.realfmt -> real -> string val fromDecimal: IEEEReal.decimal_approx -> real option val fromInt: int -> real val fromLarge: IEEEReal.rounding_mode -> LargeReal.real -> real val fromLargeInt: LargeInt.int -> real val fromManExp: {man: real, exp: int} -> real val fromString: string -> real option val isFinite: real -> bool val isNan: real -> bool val isNormal: real -> bool val max: real * real -> real val maxFinite: real val min: real * real -> real val minNormalPos: real val minPos: real val negInf: real val nextAfter: real * real -> real val posInf: real val precision: int val radix: int val realCeil: real -> real val realFloor: real -> real val realMod: real -> real val realRound: real -> real val realTrunc: real -> real val rem: real * real -> real val sameSign: real * real -> bool val scan: (char, 'a) StringCvt.reader -> (real, 'a) StringCvt.reader val sign: real -> int val signBit: real -> bool val split: real -> {whole: real, frac: real} val toDecimal: real -> IEEEReal.decimal_approx val toInt: IEEEReal.rounding_mode -> real -> int val toLarge: real -> LargeReal.real val toLargeInt: IEEEReal.rounding_mode -> real -> LargeInt.int val toManExp: real -> {man: real, exp: int} val toString: real -> string val unordered: real * real -> bool end signature REAL_EXTRA = sig include REAL val realSize: Int.int val fromWord: word -> real val fromLargeWord: LargeWord.word -> real val toWord: IEEEReal.rounding_mode -> real -> word val toLargeWord: IEEEReal.rounding_mode -> real -> LargeWord.word end mlton-20100608/basis-library/real/real.sml0000644000076600000240000011512111404435631016707 0ustar mtfstaff(* Copyright (C) 2003-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Real (R: PRE_REAL): REAL_EXTRA = struct structure MLton = Primitive.MLton structure Prim = R local open IEEEReal in datatype float_class = datatype float_class datatype rounding_mode = datatype rounding_mode end infix 4 == != ?= type real = R.real local open Prim val isBytecode = MLton.Codegen.isBytecode in val *+ = if isBytecode then fn (r1, r2, r3) => r1 * r2 + r3 else *+ val *- = if isBytecode then fn (r1, r2, r3) => r1 * r2 - r3 else *- val op * = op * val op + = op + val op - = op - val op / = op / val op < = op < val op <= = op <= val op > = op > val op >= = op >= val ~ = ~ val abs = abs val maxFinite = maxFinite val minNormalPos = minNormalPos val minPos = minPos val realSize = Int32.toInt realSize val precision = Int32.toInt precision val radix = Int32.toInt radix val signBit = fn r => signBit r <> 0 end local fun 'a make {fromRealUnsafe: 'a -> real, toRealUnsafe: real -> 'a, other : {precision: Primitive.Int32.int}} = if R.precision = #precision other then (fn (_: rounding_mode) => fromRealUnsafe, toRealUnsafe) else (fn (m: rounding_mode) => fn r => IEEEReal.withRoundingMode (m, fn () => fromRealUnsafe r), toRealUnsafe) in val (fromReal32,toReal32) = make {fromRealUnsafe = R.fromReal32Unsafe, toRealUnsafe = R.toReal32Unsafe, other = {precision = Primitive.Real32.precision}} val (fromReal64,toReal64) = make {fromRealUnsafe = R.fromReal64Unsafe, toRealUnsafe = R.toReal64Unsafe, other = {precision = Primitive.Real64.precision}} end local structure S = LargeReal_ChooseRealN (type 'a t = real -> 'a val fReal32 = toReal32 val fReal64 = toReal64) in val toLarge = S.f end local structure S = LargeReal_ChooseRealN (type 'a t = rounding_mode -> 'a -> real val fReal32 = fromReal32 val fReal64 = fromReal64) in val fromLarge = S.f end val zero = R.fromInt32Unsafe 0 val one = R.fromInt32Unsafe 1 val two = R.fromInt32Unsafe 2 val half = one / two val negOne = ~ one val posInf = one / zero val negInf = ~one / zero val nan = posInf + negInf val class = IEEEReal.mkClass R.class val abs = if MLton.Codegen.isX86 orelse MLton.Codegen.isAmd64 then abs else fn x => case class x of INF => posInf | NAN => x | _ => if signBit x then ~x else x fun isFinite r = abs r <= maxFinite val op == = Prim.== val op != = not o op == fun isNan r = r != r fun isNormal r = class r = NORMAL val op ?= = if MLton.Codegen.isX86 orelse MLton.Codegen.isAmd64 then R.?= else fn (x, y) => case (class x, class y) of (NAN, _) => true | (_, NAN) => true | (ZERO, ZERO) => true | _ => R.== (x, y) fun min (x, y) = if x <= y then x else if x > y then y else if isNan y then x else y fun max (x, y) = if x >= y then x else if x < y then y else if isNan y then x else y fun sign (x: real): int = if x > zero then 1 else if x < zero then ~1 else if x == zero then 0 else raise Domain fun sameSign (x, y) = signBit x = signBit y fun copySign (x, y) = if sameSign (x, y) then x else ~ x local datatype z = datatype IEEEReal.real_order in fun compareReal (x, y) = if x < y then LESS else if x > y then GREATER else if x == y then EQUAL else UNORDERED end local structure I = IEEEReal structure G = General in fun compare (x, y) = case compareReal (x, y) of I.EQUAL => G.EQUAL | I.GREATER => G.GREATER | I.LESS => G.LESS | I.UNORDERED => raise IEEEReal.Unordered end fun unordered (x, y) = isNan x orelse isNan y val nextAfter: real * real -> real = fn (r, t) => case (class r, class t) of (NAN, _) => nan | (_, NAN) => nan | (INF, _) => r | (ZERO, ZERO) => t (* want "t", not "r", to get the sign right *) | (ZERO, _) => if t > zero then minPos else ~minPos | _ => if r == t then r else if (r > t) = (r > zero) then R.nextAfterDown r else R.nextAfterUp r local val one = One.make (fn () => ref (0 : C_Int.t)) in fun toManExp x = case class x of INF => {exp = 0, man = x} | NAN => {exp = 0, man = nan} | ZERO => {exp = 0, man = x} | _ => One.use (one, fn r => let val man = R.frexp (x, r) in {exp = C_Int.toInt (!r), man = man} end) end fun fromManExp {exp, man} = (R.ldexp (man, C_Int.fromInt exp)) handle Overflow => man * (if Int.< (exp, 0) then zero else posInf) val fromManExp = if MLton.Codegen.isX86 then fromManExp else fn {exp, man} => case class man of INF => man | NAN => man | ZERO => man | _ => fromManExp {exp = exp, man = man} local val one = One.make (fn () => ref zero) in fun split x = case class x of INF => {frac = if x > zero then zero else ~zero, whole = x} | NAN => {frac = nan, whole = nan} | _ => let val (frac, whole) = One.use (one, fn int => (R.modf (x, int), !int)) (* Some platforms' C libraries don't get sign of * zero right. *) fun fix y = if class y = ZERO andalso not (sameSign (x, y)) then ~ y else y in {frac = fix frac, whole = fix whole} end end val realMod = #frac o split fun checkFloat x = if isFinite x then x else if isNan x then raise Div else raise Overflow fun roundReal (x: real, m: rounding_mode): real = IEEEReal.withRoundingMode (m, fn () => R.round x) local fun round mode x = case class x of INF => x | NAN => x | _ => roundReal (x, mode) in val realCeil = round TO_POSINF val realFloor = round TO_NEGINF val realRound = round TO_NEAREST val realTrunc = round TO_ZERO end fun rem (x, y) = (case class x of INF => nan | NAN => nan | ZERO => zero | _ => (case class y of INF => x | NAN => nan | ZERO => nan | _ => x - realTrunc (x/y) * y)) (* fromDecimal, scan, fromString: decimal -> binary conversions *) fun strto (str: NullString.t, rounding_mode: IEEEReal.rounding_mode) = let val rounding : C_Int.int = case rounding_mode of TO_NEAREST => 1 | TO_NEGINF => 3 | TO_POSINF => 2 | TO_ZERO => 0 in Prim.strto (str, rounding) end exception Bad fun fromDecimalWithRoundingMode ({class, digits, exp, sign}: IEEEReal.decimal_approx, rounding_mode: IEEEReal.rounding_mode) = let fun doit () = let val exp = if Int.< (exp, 0) then concat ["-", Int.toString (Int.~ exp)] else Int.toString exp (* val str = concat [if sign then "-" else "", "0.", digits, "E", exp, "\000"] *) val n = Int.+ (if sign then 1 else 0, Int.+ (4 (* "0." + "E" + "\000" *), Int.+ (List.length digits, String.size exp))) val a = Array.arrayUninit n fun upd (i, c) = (Array.update (a, i, c); Int.+ (i, 1)) val i = 0 val i = if sign then upd (i, #"-") else i val i = upd (i, #"0") val i = upd (i, #".") val i = List.foldl (fn (d, i) => if Int.< (d, 0) orelse Int.> (d, 9) then raise Bad else upd (i, Char.chr (Int.+ (d, Char.ord #"0")))) i digits val i = upd (i, #"E") val i = CharVector.foldl (fn (c, i) => upd (i, c)) i exp val _ = upd (i, #"\000") val str = Vector.unsafeFromArray a val x = strto (NullString.fromString str, rounding_mode) in x end in SOME (case class of INF => if sign then negInf else posInf | NAN => nan | NORMAL => doit () | SUBNORMAL => doit () | ZERO => if sign then ~ zero else zero) handle Bad => NONE end fun fromDecimal da = fromDecimalWithRoundingMode (da, TO_NEAREST) fun scan reader state = case IEEEReal.scan reader state of NONE => NONE | SOME (da, state) => SOME (valOf (fromDecimalWithRoundingMode (da, IEEEReal.getRoundingMode ())), state) val fromString = StringCvt.scanString scan (* toDecimal, fmt, toString: binary -> decimal conversions. *) datatype mode = Fix | Gen | Sci local val one = One.make (fn () => ref (0: C_Int.int)) in fun gdtoa (x: real, mode: mode, ndig: int, rounding_mode: IEEEReal.rounding_mode) = let val mode : C_Int.int = case mode of Fix => 3 | Gen => 0 | Sci => 2 val ndig : C_Int.int = C_Int.fromInt ndig val rounding : C_Int.int = case rounding_mode of TO_NEAREST => 1 | TO_NEGINF => 3 | TO_POSINF => 2 | TO_ZERO => 0 in One.use (one, fn decpt => (Prim.gdtoa (x, mode, ndig, rounding, decpt), C_Int.toInt (!decpt))) end end fun toDecimal (x: real): IEEEReal.decimal_approx = case class x of INF => {class = INF, digits = [], exp = 0, sign = x < zero} | NAN => {class = NAN, digits = [], exp = 0, sign = false} | ZERO => {class = ZERO, digits = [], exp = 0, sign = signBit x} | c => let val (cs, exp) = gdtoa (x, Gen, 0, TO_NEAREST) fun loop (i, ac) = if Int.< (i, 0) then ac else loop (Int.- (i, 1), (Int.- (Char.ord (CUtil.C_String.sub (cs, i)), Char.ord #"0")) :: ac) val digits = loop (Int.- (CUtil.C_String.length cs, 1), []) in {class = c, digits = digits, exp = exp, sign = x < zero} end datatype realfmt = datatype StringCvt.realfmt local fun fix (sign: string, cs: CUtil.C_String.t, decpt: int, ndig: int): string = let val length = CUtil.C_String.length cs in if Int.< (decpt, 0) then concat [sign, "0.", String.new (Int.~ decpt, #"0"), CUtil.C_String.toString cs, String.new (Int.+ (Int.- (ndig, length), decpt), #"0")] else let val whole = if decpt = 0 then "0" else String.tabulate (decpt, fn i => if Int.< (i, length) then CUtil.C_String.sub (cs, i) else #"0") in if 0 = ndig then concat [sign, whole] else let val frac = String.tabulate (ndig, fn i => let val j = Int.+ (i, decpt) in if Int.< (j, length) then CUtil.C_String.sub (cs, j) else #"0" end) in concat [sign, whole, ".", frac] end end end fun sci (x: real, ndig: int): string = let val sign = if x < zero then "~" else "" val (cs, decpt) = gdtoa (x, Sci, Int.+ (1, ndig), IEEEReal.getRoundingMode ()) val length = CUtil.C_String.length cs val whole = String.tabulate (1, fn _ => CUtil.C_String.sub (cs, 0)) val frac = if 0 = ndig then "" else concat [".", String.tabulate (ndig, fn i => let val j = Int.+ (i, 1) in if Int.< (j, length) then CUtil.C_String.sub (cs, j) else #"0" end)] val exp = Int.- (decpt, 1) val exp = let val (exp, sign) = if Int.< (exp, 0) then (Int.~ exp, "~") else (exp, "") in concat [sign, Int.toString exp] end in concat [sign, whole, frac, "E", exp] end fun gen (x: real, n: int): string = case class x of INF => if x > zero then "inf" else "~inf" | NAN => "nan" | _ => let val (prefix, x) = if x < zero then ("~", ~ x) else ("", x) val ss = Substring.full (sci (x, Int.- (n, 1))) fun isE c = c = #"E" fun isZero c = c = #"0" val expS = Substring.string (Substring.taker (not o isE) ss) val exp = valOf (Int.fromString expS) val man = String.translate (fn #"." => "" | c => str c) (Substring.string (Substring.dropr isZero (Substring.takel (not o isE) ss))) val manSize = String.size man fun zeros i = CharVector.tabulate (i, fn _ => #"0") fun dotAt i = concat [String.substring (man, 0, i), ".", String.extract (man, i, NONE)] fun sci () = concat [prefix, if manSize = 1 then man else dotAt 1, "E", expS] val op - = Int.- val op + = Int.+ val ~ = Int.~ val op >= = Int.>= in if exp >= (if manSize = 1 then 3 else manSize + 3) then sci () else if exp >= manSize - 1 then concat [prefix, man, zeros (exp - (manSize - 1))] else if exp >= 0 then concat [prefix, dotAt (exp + 1)] else if exp >= (if manSize = 1 then ~2 else ~3) then concat [prefix, "0.", zeros (~exp - 1), man] else sci () end in fun fmt spec = let val doit = case spec of EXACT => IEEEReal.toString o toDecimal | FIX opt => let val n = case opt of NONE => 6 | SOME n => if Primitive.Controls.safe andalso Int.< (n, 0) then raise Size else n in fn x => let val sign = if x < zero then "~" else "" val (cs, decpt) = gdtoa (x, Fix, n, IEEEReal.getRoundingMode ()) in fix (sign, cs, decpt, n) end end | GEN opt => let val n = case opt of NONE => 12 | SOME n => if Primitive.Controls.safe andalso Int.< (n, 1) then raise Size else n in fn x => gen (x, n) end | SCI opt => let val n = case opt of NONE => 6 | SOME n => if Primitive.Controls.safe andalso Int.< (n, 0) then raise Size else n in fn x => sci (x, n) end in fn x => case class x of NAN => "nan" | INF => if x > zero then "inf" else "~inf" | _ => doit x end end val toString = fmt (StringCvt.GEN NONE) local fun 'a make {fromIntUnsafe: 'a -> real, toIntUnsafe: real -> 'a, other : {maxInt': 'a, minInt': 'a, precision': int}} = (fromIntUnsafe, if Int.< (precision, #precision' other) then let val maxInt' = #maxInt' other val minInt' = #minInt' other (* maxInt can't be represented exactly. *) (* minInt can be represented exactly. *) val (maxInt,minInt) = IEEEReal.withRoundingMode (TO_ZERO, fn () => (fromIntUnsafe maxInt', fromIntUnsafe minInt')) in fn (m: rounding_mode) => fn x => if minInt <= x then if x <= maxInt then toIntUnsafe (roundReal (x, m)) else raise Overflow else if x < minInt then raise Overflow else raise Domain (* NaN *) end else let val maxInt' = #maxInt' other val minInt' = #minInt' other val maxInt = fromIntUnsafe maxInt' val minInt = fromIntUnsafe minInt' in fn (m: rounding_mode) => fn x => if minInt <= x then if x <= maxInt then toIntUnsafe (roundReal (x, m)) else if x < maxInt + one then (case m of TO_NEGINF => maxInt' | TO_POSINF => raise Overflow | TO_ZERO => maxInt' | TO_NEAREST => (* Depends on maxInt being odd. *) if x - maxInt >= half then raise Overflow else maxInt') else raise Overflow else if x < minInt then if minInt - one < x then (case m of TO_NEGINF => raise Overflow | TO_POSINF => minInt' | TO_ZERO => minInt' | TO_NEAREST => (* Depends on minInt being even. *) if x - minInt < ~half then raise Overflow else minInt') else raise Overflow else raise Domain (* NaN *) end) in val (fromInt8,toInt8) = make {fromIntUnsafe = R.fromInt8Unsafe, toIntUnsafe = R.toInt8Unsafe, other = {maxInt' = Int8.maxInt', minInt' = Int8.minInt', precision' = Int8.precision'}} val (fromInt16,toInt16) = make {fromIntUnsafe = R.fromInt16Unsafe, toIntUnsafe = R.toInt16Unsafe, other = {maxInt' = Int16.maxInt', minInt' = Int16.minInt', precision' = Int16.precision'}} val (fromInt32,toInt32) = make {fromIntUnsafe = R.fromInt32Unsafe, toIntUnsafe = R.toInt32Unsafe, other = {maxInt' = Int32.maxInt', minInt' = Int32.minInt', precision' = Int32.precision'}} val (fromInt64,toInt64) = make {fromIntUnsafe = R.fromInt64Unsafe, toIntUnsafe = R.toInt64Unsafe, other = {maxInt' = Int64.maxInt', minInt' = Int64.minInt', precision' = Int64.precision'}} end val fromIntInf: IntInf.int -> real = fn i => let val str = if IntInf.< (i, 0) then "-" ^ (IntInf.toString (IntInf.~ i)) else IntInf.toString i val x = strto (NullString.nullTerm str, IEEEReal.getRoundingMode ()) in x end val toIntInf: rounding_mode -> real -> LargeInt.int = fn mode => fn x => case class x of INF => raise Overflow | NAN => raise Domain | ZERO => 0 | _ => let (* This round may turn x into an INF, so we need to check the * class again. *) val x = roundReal (x, mode) in case class x of INF => raise Overflow | _ => valOf (IntInf.fromString (fmt (StringCvt.FIX (SOME 0)) x)) end local structure S = Int_ChooseInt (type 'a t = 'a -> real val fInt8 = fromInt8 val fInt16 = fromInt16 val fInt32 = fromInt32 val fInt64 = fromInt64 val fIntInf = fromIntInf) in val fromInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = 'a -> real val fInt8 = fromInt8 val fInt16 = fromInt16 val fInt32 = fromInt32 val fInt64 = fromInt64 val fIntInf = fromIntInf) in val fromLargeInt = S.f end local structure S = Int_ChooseInt (type 'a t = rounding_mode -> real -> 'a val fInt8 = toInt8 val fInt16 = toInt16 val fInt32 = toInt32 val fInt64 = toInt64 val fIntInf = toIntInf) in val toInt = S.f end local structure S = LargeInt_ChooseInt (type 'a t = rounding_mode -> real -> 'a val fInt8 = toInt8 val fInt16 = toInt16 val fInt32 = toInt32 val fInt64 = toInt64 val fIntInf = toIntInf) in val toLargeInt = S.f end val floor = toInt TO_NEGINF val ceil = toInt TO_POSINF val trunc = toInt TO_ZERO val round = toInt TO_NEAREST local fun 'a make {fromWordUnsafe: 'a -> real, toWordUnsafe: real -> 'a, other : {maxWord': 'a, wordSize: int, zeroWord: 'a}} = (fromWordUnsafe, if Int.<= (precision, #wordSize other) then let val maxWord' = #maxWord' other (* maxWord can't be represented exactly. *) val maxWord = IEEEReal.withRoundingMode (TO_ZERO, fn () => fromWordUnsafe maxWord') val zeroWord = #zeroWord other in fn (m: rounding_mode) => fn x => case class x of INF => raise Overflow | NAN => raise Domain | _ => if zero <= x then if x <= maxWord then toWordUnsafe (roundReal (x, m)) else raise Overflow else if x > ~one then (case m of TO_NEGINF => raise Overflow | TO_POSINF => zeroWord | TO_ZERO => zeroWord | TO_NEAREST => if x < ~half then raise Overflow else zeroWord) else raise Overflow end else let val maxWord' = #maxWord' other val maxWord = fromWordUnsafe maxWord' val zeroWord = #zeroWord other in fn (m: rounding_mode) => fn x => case class x of INF => raise Overflow | NAN => raise Domain | _ => if zero <= x then if x <= maxWord then toWordUnsafe (roundReal (x, m)) else if x < maxWord + one then (case m of TO_NEGINF => maxWord' | TO_POSINF => raise Overflow | TO_ZERO => maxWord' | TO_NEAREST => (* Depends on maxWord being odd. *) if x - maxWord >= half then raise Overflow else maxWord') else raise Overflow else if x > ~one then (case m of TO_NEGINF => raise Overflow | TO_POSINF => zeroWord | TO_ZERO => zeroWord | TO_NEAREST => if x < ~half then raise Overflow else zeroWord) else raise Overflow end) in val (fromWord8,toWord8) = make {fromWordUnsafe = R.fromWord8Unsafe, toWordUnsafe = R.toWord8Unsafe, other = {maxWord' = Word8.maxWord', wordSize = Word8.wordSize, zeroWord = Word8.zero}} val (fromWord16,toWord16) = make {fromWordUnsafe = R.fromWord16Unsafe, toWordUnsafe = R.toWord16Unsafe, other = {maxWord' = Word16.maxWord', wordSize = Word16.wordSize, zeroWord = Word16.zero}} val (fromWord32,toWord32) = make {fromWordUnsafe = R.fromWord32Unsafe, toWordUnsafe = R.toWord32Unsafe, other = {maxWord' = Word32.maxWord', wordSize = Word32.wordSize, zeroWord = Word32.zero}} val (fromWord64,toWord64) = make {fromWordUnsafe = R.fromWord64Unsafe, toWordUnsafe = R.toWord64Unsafe, other = {maxWord' = Word64.maxWord', wordSize = Word64.wordSize, zeroWord = Word64.zero}} end local structure S = Word_ChooseWordN (type 'a t = 'a -> real val fWord8 = fromWord8 val fWord16 = fromWord16 val fWord32 = fromWord32 val fWord64 = fromWord64) in val fromWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = 'a -> real val fWord8 = fromWord8 val fWord16 = fromWord16 val fWord32 = fromWord32 val fWord64 = fromWord64) in val fromLargeWord = S.f end local structure S = Word_ChooseWordN (type 'a t = rounding_mode -> real -> 'a val fWord8 = toWord8 val fWord16 = toWord16 val fWord32 = toWord32 val fWord64 = toWord64) in val toWord = S.f end local structure S = LargeWord_ChooseWordN (type 'a t = rounding_mode -> real -> 'a val fWord8 = toWord8 val fWord16 = toWord16 val fWord32 = toWord32 val fWord64 = toWord64) in val toLargeWord = S.f end structure Math = struct open Prim.Math (* Patch functions to handle out-of-range args. Many C math * libraries do not do what the SML Basis Spec requires. *) local fun patch f x = if x < ~one orelse x > one then nan else f x in val acos = patch acos val asin = patch asin end local fun patch f x = if x < zero then nan else f x in val ln = patch ln val log10 = patch log10 end (* The x86 doesn't get exp right on infs. *) val exp = if MLton.Codegen.isX86 andalso let open MLton.Platform.Arch in host = X86 end then (fn x => case class x of INF => if x > zero then posInf else zero | _ => exp x) else exp (* The Cygwin math library doesn't get pow right on some exceptional * cases. * * The Linux math library doesn't get pow (x, y) right when x < 0 * and y is large (but finite). * * So, we define a pow function that gives the correct result on * exceptional cases, and only calls the C pow with x > 0. *) fun isInt (x: real): bool = x == realFloor x (* isEven x assumes isInt x. *) fun isEven (x: real): bool = isInt (x / two) fun isOddInt x = isInt x andalso not (isEven x) fun isNeg x = x < zero fun pow (x, y) = case class y of INF => if class x = NAN then nan else if x < negOne orelse x > one then if isNeg y then zero else posInf else if negOne < x andalso x < one then if isNeg y then posInf else zero else (* x = 1 orelse x = ~1 *) nan | NAN => nan | ZERO => one | _ => (case class x of INF => if isNeg x then if isNeg y then if isOddInt y then ~ zero else zero else if isOddInt y then negInf else posInf else (* x = posInf *) if isNeg y then zero else posInf | NAN => nan | ZERO => if isNeg y then if isOddInt y then copySign (posInf, x) else posInf else if isOddInt y then x else zero | _ => if isNeg x then if isInt y then if isEven y then Prim.Math.pow (~ x, y) else negOne * Prim.Math.pow (~ x, y) else nan else Prim.Math.pow (x, y)) fun cosh x = case class x of INF => x | ZERO => one | _ => R.Math.cosh x fun sinh x = case class x of INF => x | ZERO => x | _ => R.Math.sinh x fun tanh x = case class x of INF => if x > zero then one else negOne | ZERO => x | _ => R.Math.tanh x end end (* All of the Real{32,64}.nextAfter{Down,Up} functions work by * converting the real to a word of equivalent size and doing an * increment or decrement on the word. This works because the SML * Basis Library code that calls these functions handles all the * special cases (nans and infs). Also, because of the way IEEE * floating point numbers are represented, word {de,in}crement * automatically does the right thing at the boundary between normals * and denormals. Also, convienently, maxFinite+1 = posInf and * minFinite-1 = negInf. *) structure Real32 = Real (open Primitive.Real32 local open Primitive.PackReal32 in fun nextAfterDown r = castFromWord (Word32.- (castToWord r, 0wx1)) fun nextAfterUp r = castFromWord (Word32.+ (castToWord r, 0wx1)) end) structure Real64 = Real (open Primitive.Real64 local open Primitive.PackReal64 in fun nextAfterDown r = castFromWord (Word64.- (castToWord r, 0wx1)) fun nextAfterUp r = castFromWord (Word64.+ (castToWord r, 0wx1)) end) mlton-20100608/basis-library/sml-nj/0000755000076600000240000000000011404470406015522 5ustar mtfstaffmlton-20100608/basis-library/sml-nj/sml-nj.sig0000644000076600000240000000143711404435632017435 0ustar mtfstaffsignature SML_OF_NJ = sig structure Cont: sig type 'a cont val callcc: ('a cont -> 'a) -> 'a val isolate: ('a -> unit) -> 'a cont val throw: 'a cont -> 'a -> 'b end structure SysInfo: sig exception UNKNOWN datatype os_kind = BEOS | MACOS | OS2 | UNIX | WIN32 val getHostArch: unit -> string val getOSKind: unit -> os_kind val getOSName: unit -> string end val exnHistory: exn -> string list val exportFn: string * (string * string list -> OS.Process.status) -> unit val exportML: string -> bool val getAllArgs: unit -> string list val getArgs: unit -> string list val getCmdName: unit -> string end mlton-20100608/basis-library/sml-nj/sml-nj.sml0000644000076600000240000000406511404435632017446 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure SMLofNJ: SML_OF_NJ = struct structure Cont = struct structure C = MLton.Cont type 'a cont = 'a C.t val callcc = C.callcc val isolate = C.isolate fun throw k v = C.throw (k, v) end structure SysInfo = struct exception UNKNOWN datatype os_kind = BEOS | MACOS | OS2 | UNIX | WIN32 fun getHostArch () = MLton.Platform.Arch.toString MLton.Platform.Arch.host fun getOSKind () = let open MLton.Platform.OS in case host of AIX => UNIX | Cygwin => UNIX | Darwin => MACOS | FreeBSD => UNIX | Hurd => UNIX | HPUX => UNIX | Linux => UNIX | MinGW => WIN32 | NetBSD => UNIX | OpenBSD => UNIX | Solaris => UNIX end fun getOSName () = MLton.Platform.OS.toString MLton.Platform.OS.host end val getCmdName = CommandLine.name val getArgs = CommandLine.arguments fun getAllArgs () = getCmdName () :: getArgs () val exnHistory = MLton.Exn.history fun exportFn (file: string, f) = let open MLton.World OS.Process in case save (file ^ ".mlton") of Original => exit success | Clone => exit (f (getCmdName (), getArgs ()) handle _ => failure) end fun exportML (f: string): bool = let open MLton.World in case save (f ^ ".mlton") of Clone => true | Original => false end end mlton-20100608/basis-library/sml-nj/unsafe.sig0000644000076600000240000000646611404435632017525 0ustar mtfstaff(* A subset of the UNSAFE signature provided by SML/NJ. Modified from SML/NJ * sources, which are * * Copyright (c) 1997 Bell Labs, Lucent Technologies. * *) signature UNSAFE_MONO_ARRAY = sig type array type elem val create: int -> array val sub: array * int -> elem val update: array * int * elem -> unit end (* sweeks took out update and create because vectors are immutable * and mlton optimizations may break if you update them. *) signature UNSAFE_MONO_VECTOR = sig type elem type vector (* val create: int -> vector *) val sub: vector * int -> elem (* val update: vector * int * elem -> unit *) end signature UNSAFE = sig structure Array: sig val create: int * 'a -> 'a array val sub: 'a array * int -> 'a val update: 'a array * int * 'a -> unit end structure BoolArray: UNSAFE_MONO_ARRAY structure BoolVector: UNSAFE_MONO_VECTOR structure CharArray: UNSAFE_MONO_ARRAY structure CharVector: UNSAFE_MONO_VECTOR structure IntArray: UNSAFE_MONO_ARRAY structure IntVector: UNSAFE_MONO_VECTOR structure Int8Array: UNSAFE_MONO_ARRAY structure Int8Vector: UNSAFE_MONO_VECTOR structure Int16Array: UNSAFE_MONO_ARRAY structure Int16Vector: UNSAFE_MONO_VECTOR structure Int32Array: UNSAFE_MONO_ARRAY structure Int32Vector: UNSAFE_MONO_VECTOR structure Int64Array: UNSAFE_MONO_ARRAY structure Int64Vector: UNSAFE_MONO_VECTOR structure IntInfArray: UNSAFE_MONO_ARRAY structure IntInfVector: UNSAFE_MONO_VECTOR structure LargeIntArray: UNSAFE_MONO_ARRAY structure LargeIntVector: UNSAFE_MONO_VECTOR structure LargeRealArray: UNSAFE_MONO_ARRAY structure LargeRealVector: UNSAFE_MONO_VECTOR structure LargeWordArray: UNSAFE_MONO_ARRAY structure LargeWordVector: UNSAFE_MONO_VECTOR structure RealArray: UNSAFE_MONO_ARRAY structure RealVector: UNSAFE_MONO_VECTOR structure Real32Array: UNSAFE_MONO_ARRAY structure Real32Vector: UNSAFE_MONO_VECTOR structure Real64Array: UNSAFE_MONO_ARRAY structure Real64Vector: UNSAFE_MONO_VECTOR structure Vector: sig (* val create: int -> 'a vector *) val sub: 'a vector * int -> 'a end structure WordArray: UNSAFE_MONO_ARRAY structure WordVector: UNSAFE_MONO_VECTOR structure Word8Array: UNSAFE_MONO_ARRAY structure Word8Vector: UNSAFE_MONO_VECTOR structure Word16Array: UNSAFE_MONO_ARRAY structure Word16Vector: UNSAFE_MONO_VECTOR structure Word32Array: UNSAFE_MONO_ARRAY structure Word32Vector: UNSAFE_MONO_VECTOR structure Word64Array: UNSAFE_MONO_ARRAY structure Word64Vector: UNSAFE_MONO_VECTOR structure PackReal32Big : PACK_REAL structure PackReal32Little : PACK_REAL structure PackReal64Big : PACK_REAL structure PackReal64Little : PACK_REAL structure PackRealBig : PACK_REAL structure PackRealLittle : PACK_REAL structure PackWord16Big : PACK_WORD structure PackWord16Little : PACK_WORD structure PackWord32Big : PACK_WORD structure PackWord32Little : PACK_WORD structure PackWord64Big : PACK_WORD structure PackWord64Little : PACK_WORD end mlton-20100608/basis-library/sml-nj/unsafe.sml0000644000076600000240000001060111404435632017520 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor UnsafeMonoArray (A: MONO_ARRAY_EXTRA): UNSAFE_MONO_ARRAY = struct open A val sub = unsafeSub val update = unsafeUpdate val create = fromPoly o Array.arrayUninit end functor UnsafeMonoVector (V: MONO_VECTOR_EXTRA): UNSAFE_MONO_VECTOR = struct open V val sub = unsafeSub end functor UnsafePackWord(PW : PACK_WORD_EXTRA) : PACK_WORD = struct open PW val subVec = unsafeSubVec val subVecX = unsafeSubVecX val subArr = unsafeSubArr val subArrX = unsafeSubArrX val update = unsafeUpdate end functor UnsafePackReal(PW : PACK_REAL_EXTRA) : PACK_REAL = struct open PW val subVec = unsafeSubVec val subArr = unsafeSubArr val update = unsafeUpdate end (* This is here so that the code generated by Lex and Yacc will work. *) structure Unsafe: UNSAFE = struct structure Array = struct val sub = Array.unsafeSub val update = Array.unsafeUpdate val create = Array.array end structure BoolArray = UnsafeMonoArray (BoolArray) structure BoolVector = UnsafeMonoVector (BoolVector) structure CharArray = UnsafeMonoArray (CharArray) structure CharVector = UnsafeMonoVector (CharVector) structure IntArray = UnsafeMonoArray (IntArray) structure IntVector = UnsafeMonoVector (IntVector) structure Int8Array = UnsafeMonoArray (Int8Array) structure Int8Vector = UnsafeMonoVector (Int8Vector) structure Int16Array = UnsafeMonoArray (Int16Array) structure Int16Vector = UnsafeMonoVector (Int16Vector) structure Int32Array = UnsafeMonoArray (Int32Array) structure Int32Vector = UnsafeMonoVector (Int32Vector) structure Int64Array = UnsafeMonoArray (Int64Array) structure Int64Vector = UnsafeMonoVector (Int64Vector) structure IntInfArray = UnsafeMonoArray (IntInfArray) structure IntInfVector = UnsafeMonoVector (IntInfVector) structure LargeIntArray = UnsafeMonoArray (LargeIntArray) structure LargeIntVector = UnsafeMonoVector (LargeIntVector) structure LargeRealArray = UnsafeMonoArray (LargeRealArray) structure LargeRealVector = UnsafeMonoVector (LargeRealVector) structure LargeWordArray = UnsafeMonoArray (LargeWordArray) structure LargeWordVector = UnsafeMonoVector (LargeWordVector) structure RealArray = UnsafeMonoArray (RealArray) structure RealVector = UnsafeMonoVector (RealVector) structure Real32Array = UnsafeMonoArray (Real32Array) structure Real32Vector = UnsafeMonoVector (Real32Vector) structure Real64Array = UnsafeMonoArray (Real64Array) structure Real64Vector = UnsafeMonoVector (Real64Vector) structure Vector = struct val sub = Vector.unsafeSub end structure WordArray = UnsafeMonoArray (WordArray) structure WordVector = UnsafeMonoVector (WordVector) structure Word8Array = UnsafeMonoArray (Word8Array) structure Word8Vector = UnsafeMonoVector (Word8Vector) structure Word16Array = UnsafeMonoArray (Word16Array) structure Word16Vector = UnsafeMonoVector (Word16Vector) structure Word32Array = UnsafeMonoArray (Word32Array) structure Word32Vector = UnsafeMonoVector (Word32Vector) structure Word64Array = UnsafeMonoArray (Word64Array) structure Word64Vector = UnsafeMonoVector (Word64Vector) structure PackReal32Big = UnsafePackReal(PackReal32Big) structure PackReal32Little = UnsafePackReal(PackReal32Little) structure PackReal64Big = UnsafePackReal(PackReal64Big) structure PackReal64Little = UnsafePackReal(PackReal64Little) structure PackRealBig = UnsafePackReal(PackRealBig) structure PackRealLittle = UnsafePackReal(PackRealLittle) structure PackWord16Big = UnsafePackWord(PackWord16Big) structure PackWord16Little = UnsafePackWord(PackWord16Little) structure PackWord32Big = UnsafePackWord(PackWord32Big) structure PackWord32Little = UnsafePackWord(PackWord32Little) structure PackWord64Big = UnsafePackWord(PackWord64Big) structure PackWord64Little = UnsafePackWord(PackWord64Little) end mlton-20100608/basis-library/sml-nj.mlb0000644000076600000240000000070511404435632016222 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb in signature SML_OF_NJ structure SMLofNJ end end mlton-20100608/basis-library/system/0000755000076600000240000000000011404470406015646 5ustar mtfstaffmlton-20100608/basis-library/system/command-line.sig0000644000076600000240000000016011404435631020713 0ustar mtfstaffsignature COMMAND_LINE = sig val name: unit -> string val arguments: unit -> string list end mlton-20100608/basis-library/system/command-line.sml0000644000076600000240000000110511404435631020724 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure CommandLine: COMMAND_LINE = struct structure Prim = PrimitiveFFI.CommandLine fun name () = CUtil.C_String.toString (Prim.commandNameGet ()) fun arguments () = (Array.toList o CUtil.C_StringArray.toArrayOfLength) (Prim.argvGet (), C_Int.toInt (Prim.argcGet ())) end mlton-20100608/basis-library/system/date.sig0000644000076600000240000000226711404435631017277 0ustar mtfstaffsignature DATE = sig datatype weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun datatype month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec type date exception Date val date: {year: int, month: month, day: int, hour: int, minute: int, second: int, offset: Time.time option} -> date val year: date -> int val month: date -> month val day: date -> int val hour: date -> int val minute: date -> int val second: date -> int val weekDay: date -> weekday val yearDay: date -> int val offset: date -> Time.time option val isDst: date -> bool option val localOffset: unit -> Time.time val fromTimeLocal: Time.time -> date val fromTimeUniv: Time.time -> date val toTime: date -> Time.time val toString: date -> string val fmt: string -> date -> string val fromString: string -> date option val scan: (char, 'a) StringCvt.reader -> (date, 'a) StringCvt.reader val compare: date * date -> order end mlton-20100608/basis-library/system/date.sml0000644000076600000240000004615011404435631017307 0ustar mtfstaff(* Modified from the ML Kit 4.1.4; basislib/Date.sml * by mfluet@acm.org on 2006-4-25 * by mfluet@acm.org on 2005-8-10 based on * modifications from the ML Kit Version 3; basislib/Date.sml * by sweeks@research.nj.nec.com on 1999-1-3 and * by sweeks@acm.org on 2000-1-18. *) (* Date -- 1995-07-03, 1998-04-07 *) structure Date :> DATE = struct structure Prim = PrimitiveFFI.Date structure Tm = Prim.Tm (* Patch to make Time look like it deals with Int.int * instead of LargeInt.int. *) structure Time = struct open Time val toSeconds = LargeInt.toInt o toSeconds val fromSeconds = fromSeconds o LargeInt.fromInt end datatype weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun datatype month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec datatype t = T of {day: int, (* 1-31 *) hour: int, (* 0-23 *) isDst: bool option, (* daylight savings time in force *) minute: int, (* 0-59 *) month: month, offset: int option, (* signed seconds East of UTC: * this zone = UTC+t; ~82800 < t <= 82800 *) second: int, (* 0-61 (allowing for leap seconds) *) weekDay: weekday, year: int, (* e.g. 1995 *) yearDay: int} (* 0-365 *) type date = t local fun make f (T r) = f r in val day = make #day val hour = make #hour val isDst = make #isDst val minute = make #minute val month = make #month val second = make #second val weekDay = make #weekDay val year = make #year val yearDay = make #yearDay end exception Date (* 86400 = 24*60*6 is the number of seconds per day *) type tmoz = {tm_hour : C_Int.t, tm_isdst : C_Int.t, (* 0 = no, 1 = yes, ~1 = don't know *) tm_mday : C_Int.t, tm_min : C_Int.t, tm_mon : C_Int.t, tm_sec : C_Int.t, tm_wday : C_Int.t, tm_yday : C_Int.t, tm_year : C_Int.t} local fun make (f: C_Time.t ref -> C_Int.t C_Errno.t) (n: C_Time.t) : tmoz = (ignore (f (ref n)) ; {tm_hour = Tm.getHour (), tm_isdst = Tm.getIsDst (), tm_mday = Tm.getMDay (), tm_min = Tm.getMin (), tm_mon = Tm.getMon (), tm_sec = Tm.getSec (), tm_wday = Tm.getWDay (), tm_yday = Tm.getYDay (), tm_year = Tm.getYear ()}) in val getlocaltime_ = make Prim.localTime val getgmtime_ = make Prim.gmTime end fun setTmBuf ({tm_hour, tm_isdst, tm_mday, tm_min, tm_mon, tm_sec, tm_wday, tm_yday, tm_year}: tmoz) : unit = (Tm.setHour tm_hour ; Tm.setIsDst tm_isdst ; Tm.setMDay tm_mday ; Tm.setMin tm_min ; Tm.setMon tm_mon ; Tm.setSec tm_sec ; Tm.setWDay tm_wday ; Tm.setYDay tm_yday ; Tm.setYear tm_year) fun mktime_ (t: tmoz): C_Time.t = C_Errno.check (setTmBuf t; Prim.mkTime ()) (* The offset to add to local time to get UTC: positive West of UTC *) val localoffset: int = C_Double.round (Prim.localOffset ()) val toweekday: int -> weekday = fn 0 => Sun | 1 => Mon | 2 => Tue | 3 => Wed | 4 => Thu | 5 => Fri | 6 => Sat | _ => raise Fail "Internal error: Date.toweekday" val fromwday: weekday -> int = fn Sun => 0 | Mon => 1 | Tue => 2 | Wed => 3 | Thu => 4 | Fri => 5 | Sat => 6 val tomonth: int -> month = fn 0 => Jan | 1 => Feb | 2 => Mar | 3 => Apr | 4 => May | 5 => Jun | 6 => Jul | 7 => Aug | 8 => Sep | 9 => Oct | 10 => Nov | 11 => Dec | _ => raise Fail "Internal error: Date.tomonth" val frommonth: month -> int = fn Jan => 0 | Feb => 1 | Mar => 2 | Apr => 3 | May => 4 | Jun => 5 | Jul => 6 | Aug => 7 | Sep => 8 | Oct => 9 | Nov => 10 | Dec => 11 fun tmozToDate ({tm_hour, tm_isdst, tm_mday, tm_min, tm_mon, tm_sec, tm_wday, tm_yday, tm_year}: tmoz) offset = T {day = C_Int.toInt tm_mday, hour = C_Int.toInt tm_hour, isDst = (case tm_isdst of 0 => SOME false | 1 => SOME true | _ => NONE), minute = C_Int.toInt tm_min, month = tomonth (C_Int.toInt tm_mon), offset = offset, second = C_Int.toInt tm_sec, weekDay = toweekday (C_Int.toInt tm_wday), yearDay = C_Int.toInt tm_yday, year = (C_Int.toInt tm_year) + 1900} fun leapyear (y: int) = y mod 4 = 0 andalso y mod 100 <> 0 orelse y mod 400 = 0 fun monthdays year month : int = case month of Jan => 31 | Feb => if leapyear year then 29 else 28 | Mar => 31 | Apr => 30 | May => 31 | Jun => 30 | Jul => 31 | Aug => 31 | Sep => 30 | Oct => 31 | Nov => 30 | Dec => 31 (* Check whether date may be passed to ISO/ANSI C functions: *) fun okDate (T {year, month, day, hour, minute, second, ...}) = 1 <= day andalso day <= monthdays year month andalso 0 <= hour andalso hour <= 23 andalso 0 <= minute andalso minute <= 59 andalso 0 <= second andalso second <= 61 (* leap seconds *) fun dateToTmoz (dt as T {year, month, day, hour, minute, second, weekDay, yearDay, isDst, ...}): tmoz = if not (okDate dt) then raise Date else {tm_hour = C_Int.fromInt hour, tm_isdst = (case isDst of SOME false => 0 | SOME true => 1 | NONE=> ~1), tm_mday = C_Int.fromInt day, tm_min = C_Int.fromInt minute, tm_mon = C_Int.fromInt (frommonth month), tm_sec = C_Int.fromInt second, tm_wday = C_Int.fromInt (fromwday weekDay), tm_yday = C_Int.fromInt yearDay, tm_year = C_Int.fromInt (year - 1900)} (* -------------------------------------------------- *) (* Translated from Emacs's calendar.el: *) (* Reingold: Number of the day within the year: *) fun dayinyear (year: int, month: month, day: int): int = let val monthno = frommonth month in day - 1 + 31 * monthno - (if monthno > 1 then (27 + 4 * monthno) div 10 - (if leapyear year then 1 else 0) else 0) end (* Reingold: Find the number of days elapsed from the (imagined) Gregorian date Sunday, December 31, 1 BC to the given date. *) fun todaynumber year month day = let val prioryears = year - 1 in dayinyear (year, month, day) + 1 + 365 * prioryears + prioryears div 4 - prioryears div 100 + prioryears div 400 end (* Reingold et al: from absolute day number to year, month, date: *) fun fromdaynumber n = let val d0 = n - 1 val n400 = d0 div 146097 val d1 = d0 mod 146097 val n100 = d1 div 36524 val d2 = d1 mod 36524 val n4 = d2 div 1461 val d3 = d2 mod 1461 val n1 = d3 div 365 val day = 1 + d3 mod 365 val year = 400 * n400 + 100 * n100 + n4 * 4 + n1 + 1 fun loop month day = let val mdays = monthdays year (tomonth month) in if mdays < day then loop (month+1) (day-mdays) else (year, tomonth month, day) end in if n100 = 4 orelse n1 = 4 then (year-1, Dec, 31) else loop 0 day end (* -------------------------------------------------- *) fun weekday daynumber = toweekday (daynumber mod 7) (* Normalize a date, disregarding leap seconds: *) fun normalizedate yr0 mo0 dy0 hr0 mn0 sec0 offset = let val mn1 = mn0 + sec0 div 60 val second = sec0 mod 60 val hr1 = hr0 + mn1 div 60 val minute = mn1 mod 60 val dayno = todaynumber yr0 mo0 dy0 + hr1 div 24 val hour = hr1 mod 24 val (year, month, day) = fromdaynumber dayno val date1 = T {day = day, hour = hour, isDst = (case offset of NONE => NONE | SOME _ => SOME false), minute = minute, month = month, offset = offset, second = second, weekDay = weekday dayno, year = year, yearDay = dayinyear (year, month, day)} in (* One cannot reliably compute DST in non-local timezones, not even given the offset from UTC. Countries in the Northern hemisphere have DST during Mar-Oct, those around Equator do not have DST, and those in the Southern hemisphere have DST during Oct-Mar. *) if year < 1970 orelse year > 2037 then date1 else case offset of NONE => tmozToDate (getlocaltime_ (mktime_ (dateToTmoz date1))) offset | SOME _ => date1 end fun fromTimeLocal t = tmozToDate (getlocaltime_ (C_Time.fromInt (Time.toSeconds t))) NONE fun fromTimeUniv t = tmozToDate (getgmtime_ (C_Time.fromInt (Time.toSeconds t))) (SOME 0) (* The following implements conversion from a local date to * a Time.time. It IGNORES wday and yday. *) fun toTime (date as T {offset, ...}) = let val secoffset = case offset of NONE => 0 | SOME secs => localoffset + secs val clock = C_Time.toInt (mktime_ (dateToTmoz date)) - secoffset in if clock < 0 then raise Date else Time.fromSeconds clock end fun localOffset () = Time.fromSeconds (localoffset mod 86400) local val isFormatChar = let val a = Array.tabulate (Char.maxOrd + 1, fn _ => false) val validChars = "aAbBcdHIjmMpSUwWxXyYZ%" in Natural.foreach (size validChars, fn i => Array.update (a, Char.ord (String.sub (validChars, i)), true)); fn c => Array.sub (a, Char.ord c) end in fun fmt fmtStr d = let val _ = setTmBuf (dateToTmoz d) val bufLen = 50 (* more than enough for a single format char *) val buf = Array.arrayUninit bufLen fun strftime fmtChar = let val len = Prim.strfTime (buf, C_Size.fromInt bufLen, NullString.fromString (concat ["%", str fmtChar, "\000"])) val len = C_Size.toInt len in if len = 0 then raise Fail "Date.fmt" else ArraySlice.vector (ArraySlice.slice (buf, 0, SOME len)) end val max = size fmtStr fun loop (i, start, accum) = let fun newAccum () = let val len = i - start in if len = 0 then accum else String.extract (fmtStr, start, SOME len) :: accum end in if i >= max then newAccum () else if #"%" = String.sub (fmtStr, i) then let val i = i + 1 in if i >= max then newAccum () else let val c = String.sub (fmtStr, i) in if isFormatChar c then loop (i + 1, i + 1, strftime c :: newAccum ()) else loop (i, i, newAccum ()) end end else loop (i + 1, start, accum) end in concat (rev (loop (0, 0, []))) end end val toString = fmt "%a %b %d %H:%M:%S %Y" type ('a, 'b) reader = ('a, 'b) Reader.reader fun scan (reader: (char, 'a) reader): (t, 'a) reader = let type 'b t = ('b, 'a) reader val none: 'b t = fn _ => NONE fun done (b: 'b): 'b t = fn a => SOME (b, a) fun peek1 (f: char -> 'b t): 'b t = fn a => case reader a of NONE => NONE | SOME (c, _) => f c a fun read1 (f: char -> 'b t): 'b t = fn a => case reader a of NONE => NONE | SOME (c, a) => f c a fun skipSpace (r: 'b t): 'b t = let fun loop (): 'b t = peek1 (fn c => if Char.isSpace c then read1 (fn _ => loop ()) else r) in loop () end fun readN (n: int, f: string -> 'b t): 'b t = let fun loop (n: int, ac: char list): 'b t = if 0 = n then f (implode (rev ac)) else read1 (fn c => loop (n - 1, c :: ac)) in loop (n, []) end fun readChar (c: char, r: 'b t): 'b t = read1 (fn c' => if c = c' then r else none) fun readWeekDay (f: weekday -> 'b t): 'b t = readN (3, fn s => case s of "Mon" => f Mon | "Tue" => f Tue | "Wed" => f Wed | "Thu" => f Thu | "Fri" => f Fri | "Sat" => f Sat | "Sun" => f Sun | _ => none) fun readMonth (f: month -> 'b t): 'b t = readN (3, fn s => case s of "Jan" => f Jan | "Feb" => f Feb | "Mar" => f Mar | "Apr" => f Apr | "May" => f May | "Jun" => f Jun | "Jul" => f Jul | "Aug" => f Aug | "Sep" => f Sep | "Oct" => f Oct | "Nov" => f Nov | "Dec" => f Dec | _ => none) fun readDigs (n: int, lower: int, upper: int, f: int -> 'b t): 'b t = readN (n, fn s => if not (CharVector.all Char.isDigit s) then none else let val v = CharVector.foldl (fn (c, ac) => ac * 10 + (Char.ord c - Char.ord #"0")) 0 s in if lower <= v andalso v <= upper then f v else none end) fun readDay f = peek1 (fn c => if c = #" " then read1 (fn _ => readDigs (1, 1, 9, f)) else readDigs (2, 1, 31, f)) fun readHour f = readDigs (2, 0, 23, f) fun readMinute f = readDigs (2, 0, 59, f) fun readSeconds f = readDigs (2, 0, 61, f) fun readYear f = readDigs (4, 0, 9999, f) in skipSpace (readWeekDay (fn weekDay => readChar (#" ", readMonth (fn month => readChar (#" ", readDay (fn day => readChar (#" ", readHour (fn hour => readChar (#":", readMinute (fn minute => (readChar (#":", readSeconds (fn second => readChar (#" ", readYear (fn year => done (T {day = day, hour = hour, isDst = NONE, minute = minute, month = month, offset = NONE, second = second, weekDay = weekDay, year = year, yearDay = dayinyear (year, month, day)} )))))))))))))))) end fun fromString s = StringCvt.scanString scan s (* Ignore timezone and DST when comparing dates: *) fun compare (T {year=y1,month=mo1,day=d1,hour=h1,minute=mi1,second=s1, ...}, T {year=y2,month=mo2,day=d2,hour=h2,minute=mi2,second=s2, ...}) = let fun cmp (v1, v2, cmpnext) = case Int.compare (v1, v2) of EQUAL => cmpnext () | r => r in cmp (y1, y2, fn _ => cmp (frommonth mo1, frommonth mo2, fn _ => cmp (d1, d2, fn _ => cmp (h1, h2, fn _ => cmp (mi1, mi2, fn _ => cmp (s1, s2, fn _ => EQUAL)))))) end fun date { year, month, day, hour, minute, second, offset } = if year < 0 then raise Date else let val (dayoffset, offset') = case offset of NONE => (0, NONE) | SOME time => let val secs = Time.toSeconds time val secoffset = if secs <= 82800 then ~secs else 86400 - secs in (Int.quot (secs, 86400), SOME secoffset) end val day' = day + dayoffset in normalizedate year month day' hour minute second offset' end fun offset (T {offset, ...}) = Option.map (fn secs => Time.fromSeconds ((86400 + secs) mod 86400)) offset end mlton-20100608/basis-library/system/file-sys.sig0000644000076600000240000000200411404435631020102 0ustar mtfstaffsignature OS_FILE_SYS = sig type dirstream val openDir: string -> dirstream val readDir: dirstream -> string option val rewindDir: dirstream -> unit val closeDir: dirstream -> unit val chDir: string -> unit val getDir: unit -> string val mkDir: string -> unit val rmDir: string -> unit val isDir: string -> bool val isLink: string -> bool val readLink: string -> string val fullPath: string -> string val realPath: string -> string val modTime: string -> Time.time val fileSize: string -> Position.int val setTime: string * Time.time option -> unit val remove: string -> unit val rename: {old: string, new: string} -> unit datatype access_mode = A_READ | A_WRITE | A_EXEC val access: string * access_mode list -> bool val tmpName: unit -> string eqtype file_id val fileId: string -> file_id val hash: file_id -> word val compare: file_id * file_id -> order end mlton-20100608/basis-library/system/file-sys.sml0000644000076600000240000001354211404435631020124 0ustar mtfstaff(* os-filesys.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * * The Posix implementation of the generic file system interface. * *) structure OS_FileSys = struct structure P_FSys = Posix.FileSys val sysWordToWord = Word.fromLargeWord o SysWord.toLargeWord type dirstream = P_FSys.dirstream val openDir = P_FSys.opendir val readDir = P_FSys.readdir val rewindDir = P_FSys.rewinddir val closeDir = P_FSys.closedir val chDir = P_FSys.chdir val getDir = P_FSys.getcwd local structure S = P_FSys.S val mode777 = S.flags[S.irwxu, S.irwxg, S.irwxo] in fun mkDir path = P_FSys.mkdir(path, mode777) end val rmDir = P_FSys.rmdir val isDir = P_FSys.ST.isDir o P_FSys.stat val isLink = P_FSys.ST.isLink o P_FSys.lstat val readLink = P_FSys.readlink (* the maximum number of links allowed *) val maxLinks: int = 64 structure P = OS_Path val isMinGW = let open Primitive.MLton.Platform.OS in host = MinGW end (* An implementation of fullPath which works on Unix and Windows (Cygwin and MinGW) *) fun fullPath p = let val oldCWD = getDir() fun mkPath (pathFromRoot, vol) = P.toString {arcs = List.rev pathFromRoot, isAbs = true, vol = vol} fun walkPath (n, pathFromRoot, arcs, vol) = if n = 0 then raise PosixError.SysErr ("too many links", NONE) else case arcs of [] => mkPath (pathFromRoot, vol) | arc :: al => if arc = "" orelse arc = "." then walkPath (n, pathFromRoot, al, vol) else if arc = ".." then case pathFromRoot of [] => walkPath (n, [], al, vol) | _ :: r => (chDir ".."; walkPath (n, r, al, vol)) else if isLink arc then expandLink (n, pathFromRoot, arc, al, vol) else case al of [] => mkPath (arc :: pathFromRoot, vol) | _ => (chDir arc ; walkPath (n, arc :: pathFromRoot, al, vol)) and expandLink (n, pathFromRoot, link, rest, vol) = let val {isAbs, arcs, ...} = P.fromString (readLink link) val arcs = List.@ (arcs, rest) in if isAbs then gotoRoot (n-1, arcs, vol) else walkPath (n-1, pathFromRoot, arcs, vol) end (* If the volume is not empty, chDir to it rather than to "/" *) and gotoRoot (n, arcs, vol) = (if vol <> "" andalso vol <> "/" then chDir (vol ^ (if isMinGW then "\\" else "/")) else chDir "/" ; walkPath (n, [], arcs, vol)) fun computeFullPath (arcs, vol) = (gotoRoot (maxLinks, arcs, vol) before chDir oldCWD) handle ex => (chDir oldCWD; raise ex) in case (P.fromString p) of {isAbs=false, arcs, ...} => let val {arcs=arcs', vol=vol, ...} = P.fromString(oldCWD) in computeFullPath (List.@(arcs', arcs), vol) end | {isAbs=true, arcs, vol} => computeFullPath (arcs, vol) end fun realPath p = if P.isAbsolute p then fullPath p else P.mkRelative {path = fullPath p, relativeTo = fullPath (getDir ())} val fileSize = P_FSys.ST.size o P_FSys.stat val modTime = P_FSys.ST.mtime o P_FSys.stat fun setTime (path, t) = P_FSys.utime (path, Option.map (fn t => {actime = t, modtime = t}) t) val remove = P_FSys.unlink val rename = P_FSys.rename datatype access_mode = datatype Posix.FileSys.access_mode fun access (path, al) = let fun cvt A_READ = P_FSys.A_READ | cvt A_WRITE = P_FSys.A_WRITE | cvt A_EXEC = P_FSys.A_EXEC in P_FSys.access (path, List.map cvt al) end datatype file_id = FID of {dev: SysWord.word, ino: SysWord.word} fun fileId fname = let val st = P_FSys.stat fname in FID{ dev = P_FSys.devToWord(P_FSys.ST.dev st), ino = P_FSys.inoToWord(P_FSys.ST.ino st) } end fun hash (FID{dev, ino}) = sysWordToWord(SysWord.+(SysWord.<<(dev, 0w16), ino)) fun compare (FID{dev=d1, ino=i1}, FID{dev=d2, ino=i2}) = if (SysWord.<(d1, d2)) then General.LESS else if (SysWord.>(d1, d2)) then General.GREATER else if (SysWord.<(i1, i2)) then General.LESS else if (SysWord.>(i1, i2)) then General.GREATER else General.EQUAL end (* * $Log: os-filesys.sml, v $ * Revision 1.3 1997/06/07 15:27:51 jhr * SML'97 Basis Library changes (phase 3; Posix changes) * * Revision 1.2 1997/02/26 21:00:32 george * Defined a new top level Option structure. All 'a option related * functions have been moved out of General. * * Revision 1.1.1.1 1997/01/14 01:38:25 george * Version 109.24 * *) mlton-20100608/basis-library/system/io.sig0000644000076600000240000000173311404435631016766 0ustar mtfstaffsignature OS_IO = sig eqtype iodesc eqtype iodesc_kind val hash: iodesc -> word val compare: iodesc * iodesc -> order val kind: iodesc -> iodesc_kind structure Kind: sig val file: iodesc_kind val dir: iodesc_kind val symlink: iodesc_kind val tty: iodesc_kind val pipe: iodesc_kind val socket: iodesc_kind val device: iodesc_kind end eqtype poll_desc type poll_info val pollDesc: iodesc -> poll_desc option val pollToIODesc: poll_desc -> iodesc exception Poll val pollIn: poll_desc -> poll_desc val pollOut: poll_desc -> poll_desc val pollPri: poll_desc -> poll_desc val poll: poll_desc list * Time.time option -> poll_info list val isIn: poll_info -> bool val isOut: poll_info -> bool val isPri: poll_info -> bool val infoToPollDesc: poll_info -> poll_desc end mlton-20100608/basis-library/system/io.sml0000644000076600000240000001313011404435631016771 0ustar mtfstaff(* modified from SML/NJ sources by Stephen Weeks 1998-06-25 *) (* modified by Matthew Fluet 2002-10-11 *) (* modified by Matthew Fluet 2002-11-21 *) (* modified by Matthew Fluet 2006-04-30 *) (* modified by Matthew Fluet 2008-04-06 *) (* os-io.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * * NOTE: this interface has been proposed, but not yet adopted by the * Standard basis committee. * *) structure OS_IO: OS_IO = struct structure Error = PosixError (* an iodesc is an abstract descriptor for an OS object that * supports I/O (e.g., file, tty device, socket, ...). *) type iodesc = PreOS.IODesc.t datatype iodesc_kind = K of string val iodToFd = PrePosix.FileDesc.fromRep o PreOS.IODesc.toRep val fdToIod = PreOS.IODesc.fromRep o PrePosix.FileDesc.toRep val iodescToWord = C_Fd.castToSysWord o PreOS.IODesc.toRep (* return a hash value for the I/O descriptor. *) val hash = SysWord.toWord o iodescToWord (* compare two I/O descriptors *) fun compare (i, i') = SysWord.compare (iodescToWord i, iodescToWord i') structure Kind = struct val file = K "FILE" val dir = K "DIR" val symlink = K "LINK" val tty = K "TTY" val pipe = K "PIPE" val socket = K "SOCK" val device = K "DEV" end (* return the kind of I/O descriptor *) fun kind (iod) = let val stat = Posix.FileSys.fstat (iodToFd iod) in if (Posix.FileSys.ST.isReg stat) then Kind.file else if (Posix.FileSys.ST.isDir stat) then Kind.dir else if (Posix.FileSys.ST.isChr stat) then Kind.tty else if (Posix.FileSys.ST.isBlk stat) then Kind.device (* ?? *) else if (Posix.FileSys.ST.isLink stat) then Kind.symlink else if (Posix.FileSys.ST.isFIFO stat) then Kind.pipe else if (Posix.FileSys.ST.isSock stat) then Kind.socket else K "UNKNOWN" end type poll_flags = {rd: bool, wr: bool, pri: bool} datatype poll_desc = PollDesc of iodesc * poll_flags datatype poll_info = PollInfo of iodesc * poll_flags (* create a polling operation on the given descriptor; note that * not all I/O devices support polling, but for the time being, we * don't test for this. *) fun pollDesc iod = SOME (PollDesc (iod, {rd=false, wr=false, pri=false})) (* return the I/O descriptor that is being polled *) fun pollToIODesc (PollDesc (iod, _)) = iod exception Poll (* set polling events; if the polling operation is not appropriate * for the underlying I/O device, then the Poll exception is raised. *) fun pollIn (PollDesc (iod, {wr, pri, ...}: poll_flags)) = PollDesc (iod, {rd=true, wr=wr, pri=pri}) fun pollOut (PollDesc (iod, {rd, pri, ...}: poll_flags)) = PollDesc (iod, {rd=rd, wr=true, pri=pri}) fun pollPri (PollDesc (iod, {rd, wr, ...}: poll_flags)) = PollDesc (iod, {rd=rd, wr=wr, pri=true}) (* polling function *) local structure Prim = PrimitiveFFI.OS.IO fun join (false, _, w) = w | join (true, b, w) = C_Short.orb(w, b) fun test (w, b) = (C_Short.andb(w, b) <> 0) val rdBit = PrimitiveFFI.OS.IO.POLLIN and wrBit = PrimitiveFFI.OS.IO.POLLOUT and priBit = PrimitiveFFI.OS.IO.POLLPRI fun fromPollDesc (PollDesc (iod, {rd, wr, pri})) = ( iodToFd iod, join (rd, rdBit, join (wr, wrBit, join (pri, priBit, 0))) ) fun toPollInfo (fd, i) = PollInfo (fdToIod fd, { rd = test(i, rdBit), wr = test(i, wrBit), pri = test(i, priBit) }) in fun poll (pds, timeOut) = let val (fds, events) = ListPair.unzip (List.map fromPollDesc pds) val fds = Vector.fromList fds val n = Vector.length fds val events = Vector.fromList events val timeOut = case timeOut of NONE => ~1 | SOME t => if Time.< (t, Time.zeroTime) then Error.raiseSys Error.inval else (C_Int.fromLarge (Time.toMilliseconds t) handle Overflow => Error.raiseSys Error.inval) val revents = Array.array (n, 0) val _ = Posix.Error.SysCall.simpleRestart (fn () => Prim.poll (PrePosix.FileDesc.vectorToRep fds, events, C_NFds.fromInt n, timeOut, revents)) in Array.foldri (fn (i, w, l) => if w <> 0 then (toPollInfo (Vector.sub (fds, i), w))::l else l) [] revents end end (* local *) (* check for conditions *) fun isIn (PollInfo(_, flgs)) = #rd flgs fun isOut (PollInfo(_, flgs)) = #wr flgs fun isPri (PollInfo(_, flgs)) = #pri flgs fun infoToPollDesc (PollInfo arg) = PollDesc arg end (* OS_IO *) (* * $Log: os-io.sml, v $ * Revision 1.4 1997/07/31 17:25:26 jhr * We are now using 32-bit ints to represent the seconds portion of a * time value. This was required to handle the change in the type of * Time.{to, from}{Seconds, Milliseconds, Microseconds}. * * Revision 1.3 1997/06/07 15:27:51 jhr * SML'97 Basis Library changes (phase 3; Posix changes) * * Revision 1.2 1997/06/02 19:16:19 jhr * SML'97 Basis Library changes (phase 2) * * Revision 1.1.1.1 1997/01/14 01:38:25 george * Version 109.24 * *) mlton-20100608/basis-library/system/os.sig0000644000076600000240000000054411404435631016777 0ustar mtfstaffsignature OS = sig structure FileSys: OS_FILE_SYS structure Path: OS_PATH structure Process: OS_PROCESS structure IO: OS_IO eqtype syserror exception SysErr of string * syserror option val errorMsg: syserror -> string val errorName: syserror -> string val syserror: string -> syserror option end mlton-20100608/basis-library/system/os.sml0000644000076600000240000000066511404435631017014 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure OS = struct structure FileSys = OS_FileSys structure Path = OS_Path structure Process = OS_Process structure IO = OS_IO open PosixError end mlton-20100608/basis-library/system/path.sig0000644000076600000240000000236411404435631017314 0ustar mtfstaffsignature OS_PATH = sig exception InvalidArc exception Path val base: string -> string val concat: string * string -> string val currentArc: string val dir: string -> string val ext: string -> string option val file: string -> string val fromString: string -> {isAbs: bool, vol: string, arcs: string list} val fromUnixPath: string -> string val getParent: string -> string val getVolume: string -> string val isAbsolute: string -> bool val isCanonical: string -> bool val isRelative: string -> bool val isRoot: string -> bool val joinBaseExt: {base: string, ext: string option} -> string val joinDirFile: {dir: string, file: string} -> string val mkAbsolute: {path: string, relativeTo: string} -> string val mkCanonical: string -> string val mkRelative: {path: string, relativeTo: string} -> string val parentArc: string val splitBaseExt: string -> {base: string, ext: string option} val splitDirFile: string -> {dir: string, file: string} val toString: {isAbs: bool, vol: string, arcs: string list} -> string val toUnixPath: string -> string val validVolume: {isAbs: bool, vol: string} -> bool end mlton-20100608/basis-library/system/path.sml0000644000076600000240000002020211404435631017314 0ustar mtfstaff(* Modified from the ML Kit 4.1.4; basislib/Path.sml * by mfluet@acm.org on 2005-8-10 based on * modifications from the ML Kit 3 Version; basislib/Path.sml * by sweeks@research.nj.nec.com on 1999-1-5. *) structure OS_Path: OS_PATH = struct exception Path exception InvalidArc (* It would make sense to use substrings for internal versions of * fromString and toString, and to allocate new strings only when * externalizing the strings. * Impossible cases: UNIX: {isAbs = false, vol = _, arcs = "" :: _} Mac: {isAbs = true, vol = _, arcs = "" :: _} *) val op @ = List.@ infix 9 sub val op sub = String.sub val substring = String.extract val isWindows = let open Primitive.MLton.Platform.OS in host = MinGW end (* the path separator used in canonical paths *) val slash = if isWindows then "\\" else "/" (* MinGW and newer Windows commands treat both / and \ as path * separators. * * Sadly this means that toString o fromString is not the identity * b/c foo/bar -> foo\bar. However, there's nothing else one can do! * This diverges from the standard. *) fun isslash c = c = #"/" orelse (isWindows andalso c = #"\\") fun iscolon c = c = #":" fun isVolumeName v = (isWindows andalso size v = 2 andalso Char.isAlpha (v sub 0) andalso iscolon (v sub 1)) fun volumeMatch (root, relative) = relative = "" orelse (isVolumeName root andalso isVolumeName relative andalso (Char.toUpper (root sub 0) = Char.toUpper (relative sub 0))) fun canonName a = if isWindows then String.translate (str o Char.toLower) a else a val parentArc = ".." val currentArc = "." (* Ahh joy. The SML basis library standard and Windows paths. * * The big problem with windows paths is "\foo"" * - It's not absolute, since chdir("A:\") may switch from "C:", thus * changing the meaning of "\foo". *) fun validVolume {isAbs, vol} = if isWindows then isVolumeName vol orelse (not isAbs andalso vol = "") else vol = "" fun fromString s = let val (vol, rest) = (* 4:foo has a volume of "4:" even tho invalid *) if isWindows andalso size s >= 2 andalso iscolon (s sub 1) then (substring (s, 0, SOME 2), substring (s, 2, NONE)) else ("", s) val (isAbs, arcs) = case (String.fields isslash rest) of "" :: [] => (false, []) | "" :: r => (true, r) | r => (false, r) in {arcs = arcs, isAbs = isAbs, vol = vol} end val getVolume = #vol o fromString val isAbsolute = #isAbs o fromString val isRelative = not o isAbsolute fun isArc s = s = "" orelse (case fromString s of {arcs = [_], isAbs = false, vol = ""} => true | _ => false) fun toString {arcs, isAbs, vol} = if not (validVolume {isAbs = isAbs, vol = vol}) then raise Path else if not isAbs andalso case arcs of ("" :: _) => true | _ => false then raise Path else if List.exists (not o isArc) arcs then raise InvalidArc else concat [vol, if isAbs then slash else "", String.concatWith slash arcs] fun concatArcs (a1, a2) = let val a1 = case List.rev a1 of "" :: r => List.rev r | _ => a1 in a1 @ a2 end fun concat (p1, p2) = let val {arcs = a1, isAbs, vol = v1} = fromString p1 val {arcs = a2, isAbs = isAbs2, vol = v2} = fromString p2 in if isAbs2 orelse not (volumeMatch (v1, v2)) then raise Path else toString {arcs = concatArcs (a1, a2), isAbs = isAbs, vol = v1} end fun getParent p = let val {isAbs, vol, arcs} = fromString p val arcs = List.rev (case List.rev arcs of [] => [parentArc] | "." :: r => parentArc :: r | ".." :: r => parentArc :: parentArc :: r | _ :: [] => if isAbs then [""] else [currentArc] | "" :: r => parentArc :: r | _ :: r => r) in toString {arcs = arcs, isAbs = isAbs, vol = vol} end fun mkCanonical p = let val {arcs, isAbs, vol} = fromString p fun backup l = case l of [] => if isAbs then [] else [parentArc] | first :: res => if first = ".." then parentArc :: parentArc :: res else res fun reduce arcs = let fun h (l, res) = case l of [] => (case res of [] => if isAbs then [""] else [currentArc] | _ => res ) | a1 :: ar => if a1 = "" orelse a1 = "." then h (ar, res) else if a1 = ".." then h (ar, backup res) else h (ar, canonName a1 :: res) in h (arcs, []) end in toString {arcs = List.rev (reduce arcs), isAbs = isAbs, vol = canonName vol} end val rec parentize = fn [] => [] | _ :: ar => parentArc :: parentize ar fun mkRelative {path = p1, relativeTo = p2} = let val {arcs = arcs1, isAbs = isAbs1, vol = vol1} = fromString p1 val {arcs = arcs2, isAbs = isAbs2, vol = vol2} = fromString (mkCanonical p2) in if not isAbs2 then raise Path else if not isAbs1 then p1 else let fun h (a1, a2) = case (a1, a2) of ([], []) => ["."] | (_, []) => a1 | ([], a2) => parentize a2 | (a11 :: a1r, a21 :: a2r) => if canonName a11 = a21 then h (a1r, a2r) else parentize a2 @ (if arcs1 = [""] then [] else a1) in if not (volumeMatch (vol2, vol1)) then raise Path else toString {arcs = h (arcs1, arcs2), isAbs = false, vol = ""} end end fun mkAbsolute {path = p1, relativeTo = p2} = if isRelative p2 then raise Path else if isAbsolute p1 then p1 else mkCanonical (concat (p2, p1)) fun isCanonical p = mkCanonical p = p fun joinDirFile {dir, file} = let val {arcs, isAbs, vol} = fromString dir val arcs = case (arcs, file) of ([], "") => [] | _ => concatArcs (arcs, [file]) in toString {arcs = arcs, isAbs = isAbs, vol = vol} end fun splitDirFile p = let open List val {isAbs, vol, arcs} = fromString p in case rev arcs of [] => {dir = p, file = ""} | arcn :: farcs => {dir = toString {arcs = rev farcs, isAbs = isAbs, vol = vol}, file = arcn} end val dir = #dir o splitDirFile val file = #file o splitDirFile fun joinBaseExt {base, ext} = case ext of NONE => base | SOME ex => if ex = "" then base else String.concat [base, ".", ex] fun splitBaseExt s = let val {dir, file} = splitDirFile s open Substring val (fst, snd) = splitr (fn c => c <> #".") (full file) in if isEmpty snd (* dot at right end *) orelse isEmpty fst (* no dot *) orelse size fst = 1 (* dot at left end only *) then {base = s, ext = NONE} else {base = joinDirFile {dir = dir, file = string (trimr 1 fst)}, ext = SOME (string snd)} end val ext = #ext o splitBaseExt val base = #base o splitBaseExt fun isRoot path = case fromString path of {isAbs = true, arcs=[""], ...} => true | _ => false fun fromUnixPath s = if not isWindows then s else if Char.contains s (slash sub 0) then raise InvalidArc else String.translate (fn c => if c = #"/" then slash else str c) s fun toUnixPath s = if not isWindows then s else let val {arcs, isAbs, vol} = fromString s in if vol <> "" then raise Path else (if isAbs then "/" else "") ^ String.concatWith "/" arcs end end mlton-20100608/basis-library/system/pre-os.sml0000644000076600000240000000111611404435631017570 0ustar mtfstaff(* Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure PreOS = struct structure Status = MkAbsRep(type rep = C_Status.t) structure IODesc = MkAbsRepEq(type rep = C_Fd.t) end structure OS = struct structure Process = struct type status = PreOS.Status.t end structure IO = struct type iodesc = PreOS.IODesc.t end end mlton-20100608/basis-library/system/process.sig0000644000076600000240000000113111404435631020025 0ustar mtfstaffsignature OS_PROCESS = sig type status val atExit: (unit -> unit) -> unit val exit: status -> 'a val failure: status val getEnv: string -> string option val isSuccess: status -> bool val sleep: Time.time -> unit val success: status val system: string -> status val terminate: status -> 'a end signature OS_PROCESS_EXTRA = sig include OS_PROCESS structure Status: sig type t = status val fromInt: int -> t val fromPosix: Posix.Process.exit_status -> t end end mlton-20100608/basis-library/system/process.sml0000644000076600000240000000333711404435631020050 0ustar mtfstaff(* Modified from SML/NJ sources by Stephen Weeks 1998-06-25 *) (* modified by Stephen Weeks 1999-12-10 *) (* modified by Stephen Weeks 2000-01-18 *) (* modified by Matthew Fluet 2008-03-02 *) (* modified by Matthew Fluet 2008-04-06 *) (* os-process.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * * The Posix-based implementation of the generic process control * interface (OS.Process). * *) structure OS_Process: OS_PROCESS_EXTRA = struct open Posix.Process structure Status = struct open MLtonProcess.Status fun equals (s1, s2) = (toRep s1) = (toRep s2) val fromPosix = fn es => let datatype z = datatype Posix.Process.exit_status in case es of W_EXITED => success | W_EXITSTATUS w => fromRep (C_Status.castFromSysWord (Word8.castToSysWord w)) | W_SIGNALED _ => failure | W_STOPPED _ => failure end end type status = Status.t val failure = Status.failure val success = Status.success fun isSuccess st = Status.equals (st, success) fun system cmd = (Status.fromRep o Posix.Error.SysCall.simpleResult) (fn () => PrimitiveFFI.Posix.Process.system (NullString.nullTerm cmd)) val atExit = MLtonProcess.atExit val exit = MLtonProcess.exit fun terminate x = Posix.Process.exit (Word8.fromInt (Status.toInt x)) val getEnv = Posix.ProcEnv.getenv fun sleep t = if Time.<= (t, Time.zeroTime) then () else sleep (Posix.Process.sleep t) end mlton-20100608/basis-library/system/time.sig0000644000076600000240000000222611404435631017313 0ustar mtfstaffsignature TIME = sig eqtype time exception Time val + : time * time -> time val - : time * time -> time val < : time * time -> bool val <= : time * time -> bool val > : time * time -> bool val >= : time * time -> bool val compare: time * time -> order val fmt: int -> time -> string val fromMicroseconds: LargeInt.int -> time val fromMilliseconds: LargeInt.int -> time val fromNanoseconds: LargeInt.int -> time val fromReal: LargeReal.real -> time val fromSeconds: LargeInt.int -> time val fromString: string -> time option val now: unit -> time val scan: (char, 'a) StringCvt.reader -> (time, 'a) StringCvt.reader val toMicroseconds: time -> LargeInt.int val toMilliseconds: time -> LargeInt.int val toNanoseconds: time -> LargeInt.int val toReal: time -> LargeReal.real val toSeconds: time -> LargeInt.int val toString: time -> string val zeroTime: time end signature TIME_EXTRA = sig include TIME val fromTicks: LargeInt.int -> time val ticksPerSecond: LargeInt.int end mlton-20100608/basis-library/system/time.sml0000644000076600000240000001242711404435631017330 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Time: TIME_EXTRA = struct structure Prim = PrimitiveFFI.Time (* A time is represented as a number of nanoseconds. *) val ticksPerSecond: LargeInt.int = 1000000000 datatype time = T of LargeInt.int val fromTicks = T exception Time val zeroTime = T 0 fun fromReal r = T (LargeReal.toLargeInt IEEEReal.TO_NEAREST (LargeReal.* (r, LargeReal.fromLargeInt ticksPerSecond))) handle Overflow => raise Time fun toReal (T i) = LargeReal./ (LargeReal.fromLargeInt i, LargeReal.fromLargeInt ticksPerSecond) local fun make ticksPer = let val d = LargeInt.quot (ticksPerSecond, ticksPer) in (fn i => T (LargeInt.* (i, d)), fn T i => LargeInt.quot (i, d)) end in val (fromSeconds, toSeconds) = make 1 val (fromMilliseconds, toMilliseconds) = make 1000 val (fromMicroseconds, toMicroseconds) = make 1000000 val (fromNanoseconds, toNanoseconds) = make 1000000000 end local fun make f (T i, T i') = f (i, i') in val compare = make LargeInt.compare val op < = make LargeInt.< val op <= = make LargeInt.<= val op > = make LargeInt.> val op >= = make LargeInt.>= end local fun make f (T i, T i') = T (f (i, i')) in val timeAdd = make LargeInt.+ val timeSub = make LargeInt.- end (* There's a mess here to work around a bug in vmware virtual machines * that may return a decreasing(!) sequence of time values. This will * cause some programs to raise Time exceptions where it should be * impossible. *) local fun getNow (): time = let val sec = ref (C_Time.castFromFixedInt 0) val usec = ref (C_SUSeconds.castFromFixedInt 0) in if ~1 = Prim.getTimeOfDay (sec, usec) then raise Fail "Time.now" else timeAdd(fromSeconds (C_Time.toLargeInt (! sec)), fromMicroseconds (C_SUSeconds.toLargeInt (! usec))) end val prev = ref (getNow ()) in fun now (): time = let val old = !prev val t = getNow () in case compare (old, t) of GREATER => old | _ => (prev := t; t) end end val fmt: int -> time -> string = fn n => (LargeReal.fmt (StringCvt.FIX (SOME n))) o toReal val toString = fmt 3 (* Adapted from the ML Kit 4.1.4; basislib/Time.sml * by mfluet@acm.org on 2005-11-10 based on * by mfluet@acm.org on 2005-8-10 based on * adaptations from the ML Kit 3 Version; basislib/Time.sml * by sweeks@research.nj.nec.com on 1999-1-3. *) fun scan getc src = let val charToDigit = StringCvt.charToDigit StringCvt.DEC fun pow10 0 = 1 | pow10 n = 10 * pow10 (n-1) fun mkTime sign intv fracv decs = let val nsec = LargeInt.div (LargeInt.+ (LargeInt.* (Int.toLarge (pow10 (10 - decs)), Int.toLarge fracv), 5), 10) val t = LargeInt.+ (LargeInt.* (Int.toLarge intv, ticksPerSecond), nsec) val t = if sign then t else LargeInt.~ t in T t end fun frac' sign intv fracv decs src = if Int.>= (decs, 7) then SOME (mkTime sign intv fracv decs, StringCvt.dropl Char.isDigit getc src) else case getc src of NONE => SOME (mkTime sign intv fracv decs, src) | SOME (c, rest) => (case charToDigit c of NONE => SOME (mkTime sign intv fracv decs, src) | SOME d => frac' sign intv (10 * fracv + d) (decs + 1) rest) fun frac sign intv src = case getc src of NONE => NONE | SOME (c, rest) => (case charToDigit c of NONE => NONE | SOME d => frac' sign intv d 1 rest) fun int' sign intv src = case getc src of NONE => SOME (mkTime sign intv 0 7, src) | SOME (#".", rest) => frac sign intv rest | SOME (c, rest) => (case charToDigit c of NONE => SOME (mkTime sign intv 0 7, src) | SOME d => int' sign (10 * intv + d) rest) fun int sign src = case getc src of NONE => NONE | SOME (#".", rest) => frac sign 0 rest | SOME (c, rest) => (case charToDigit c of NONE => NONE | SOME d => int' sign d rest) in case getc (StringCvt.skipWS getc src) of NONE => NONE | SOME (#"+", rest) => int true rest | SOME (#"~", rest) => int false rest | SOME (#"-", rest) => int false rest | SOME (#".", rest) => frac true 0 rest | SOME (c, rest) => (case charToDigit c of NONE => NONE | SOME d => int' true d rest) end handle Overflow => raise Time val fromString = StringCvt.scanString scan val op + = timeAdd val op - = timeSub end mlton-20100608/basis-library/system/timer.sig0000644000076600000240000000123211404435631017471 0ustar mtfstaffsignature TIMER = sig type cpu_timer type real_timer val checkCPUTimer: cpu_timer -> {sys: Time.time, usr: Time.time} val checkCPUTimes: cpu_timer -> {gc: {sys: Time.time, usr: Time.time}, nongc: {sys: Time.time, usr: Time.time}} val checkGCTime: cpu_timer -> Time.time val checkRealTimer: real_timer -> Time.time val startCPUTimer: unit -> cpu_timer val startRealTimer: unit -> real_timer val totalCPUTimer: unit -> cpu_timer val totalRealTimer: unit -> real_timer end mlton-20100608/basis-library/system/timer.sml0000644000076600000240000000372111404435631017507 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Timer: TIMER = struct structure SysUsr = struct datatype t = T of {sys: Time.time, usr: Time.time} fun export (T r) = r fun (T {sys, usr}) - (T {sys = s', usr = u'}) = T {sys = Time.- (sys, s'), usr = Time.- (usr, u')} end type cpu_timer = {gc: SysUsr.t, self: SysUsr.t} fun startCPUTimer (): cpu_timer = let val {gc = {utime = gcu, stime = gcs, ...}, self = {utime = selfu, stime = selfs}, ...} = MLtonRusage.rusage () in {gc = SysUsr.T {sys = gcs, usr = gcu}, self = SysUsr.T {sys = selfs, usr = selfu}} end fun checkCPUTimes {gc, self} = let val {gc = g', self = s'} = startCPUTimer () val gc = SysUsr.- (g', gc) val self = SysUsr.- (s', self) in {gc = SysUsr.export gc, nongc = SysUsr.export (SysUsr.- (self, gc))} end fun checkCPUTimer timer = let val {nongc, gc} = checkCPUTimes timer in {sys = Time.+ (#sys gc, #sys nongc), usr = Time.+ (#usr gc, #usr nongc)} end val totalCPUTimer = let val t = startCPUTimer () in fn () => t end val checkGCTime = #usr o #gc o checkCPUTimes type real_timer = Time.time fun startRealTimer (): real_timer = Time.now () fun checkRealTimer (t: real_timer): Time.time = Time.- (startRealTimer (), t) val totalRealTimer = let val t = startRealTimer () in fn () => t end end mlton-20100608/basis-library/system/unix.sig0000644000076600000240000000166611404435631017347 0ustar mtfstaffsignature UNIX = sig type ('a, 'b) proc type signal datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal val binInstreamOf: (BinIO.instream, 'a) proc -> BinIO.instream val binOutstreamOf: ('a, BinIO.outstream) proc -> BinIO.outstream val execute: string * string list -> ('a, 'b) proc val executeInEnv: string * string list * string list -> ('a, 'b) proc val exit: Word8.word -> 'a val fromStatus: OS.Process.status -> exit_status val kill: ('a, 'b) proc * signal -> unit val reap: ('a, 'b) proc -> OS.Process.status val streamsOf: ((TextIO.instream, TextIO.outstream) proc -> TextIO.instream * TextIO.outstream) val textInstreamOf: (TextIO.instream, 'a) proc -> TextIO.instream val textOutstreamOf: ('a, TextIO.outstream) proc -> TextIO.outstream end mlton-20100608/basis-library/system/unix.sml0000644000076600000240000000312011404435631017343 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Rewritten by wesley@terpstra.ca on 2004-11-23 to use MLtonProcess for the * implementation. *) structure Unix: UNIX = struct structure Status = OS_Process.Status structure Process = MLtonProcess local open Process in structure Child = Child structure Param = Param end type signal = Posix.Signal.signal datatype exit_status = datatype Posix.Process.exit_status val fromStatus = Posix.Process.fromStatus type ('in, 'out) proc = ('out, 'in, Process.none) Process.t local fun create {args, env, path} = Process.create {args = args, env = env, path = path, stderr = Param.self, stdin = Param.pipe, stdout = Param.pipe} in fun execute (path, args) = create {args = args, env = NONE, path = path} fun executeInEnv (path, args, env) = create {args = args, env = SOME env, path = path} end fun binInstreamOf proc = Child.binIn (Process.getStdout proc) fun binOutstreamOf proc = Child.binOut (Process.getStdin proc) fun textInstreamOf proc = Child.textIn (Process.getStdout proc) fun textOutstreamOf proc = Child.textOut (Process.getStdin proc) fun streamsOf pr = (textInstreamOf pr, textOutstreamOf pr) val kill = Process.kill fun reap z = Status.fromPosix (Process.reap z) fun exit (w: Word8.word): 'a = OS.Process.exit (Status.fromInt (Word8.toInt w)) end mlton-20100608/basis-library/text/0000755000076600000240000000000011404470406015306 5ustar mtfstaffmlton-20100608/basis-library/text/byte.sig0000644000076600000240000000062211404435631016756 0ustar mtfstaffsignature BYTE = sig val byteToChar: Word8.word -> char val bytesToString: Word8Vector.vector -> string val charToByte: char -> Word8.word val packString: Word8Array.array * int * substring -> unit val stringToBytes: string -> Word8Vector.vector val unpackString: Word8ArraySlice.slice -> string val unpackStringVec: Word8VectorSlice.slice -> string end mlton-20100608/basis-library/text/byte.sml0000644000076600000240000000206111404435631016766 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Byte: BYTE = struct val byteToChar = Primitive.Char8.idFromWord8 val bytesToString = Primitive.String8.idFromWord8Vector o Word8Vector.toPoly val charToByte = Primitive.Char8.idToWord8 fun packString (a: Word8Array.array, i: int, s: substring): unit = Natural.foreach (Substring.size s, fn j => Word8Array.update (a, i + j, charToByte (Substring.sub (s, j)))) val stringToBytes = Word8Vector.fromPoly o Primitive.String8.idToWord8Vector local fun make (length, sub) s = String.tabulate (length s, fn i => byteToChar (sub (s, i))) in val unpackString = make (Word8ArraySlice.length, Word8ArraySlice.sub) val unpackStringVec = make (Word8VectorSlice.length, Word8VectorSlice.sub) end end mlton-20100608/basis-library/text/char-global.sml0000644000076600000240000000046411404435631020203 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure CharGlobal: CHAR_GLOBAL = Char open CharGlobal mlton-20100608/basis-library/text/char.sig0000644000076600000240000000302411404435631016727 0ustar mtfstaffsignature CHAR_GLOBAL = sig eqtype char val ord: char -> int val chr: int -> char end signature CHAR = sig include CHAR_GLOBAL eqtype string val minChar: char val maxChar: char val maxOrd: int val succ: char -> char val pred: char -> char val < : char * char -> bool val <= : char * char -> bool val > : char * char -> bool val >= : char * char -> bool val compare: char * char -> order val contains: string -> char -> bool val notContains: string -> char -> bool val toLower: char -> char val toUpper: char -> char val isAscii: char -> bool val isAlpha: char -> bool val isAlphaNum: char -> bool val isCntrl: char -> bool val isDigit: char -> bool val isGraph: char -> bool val isHexDigit: char -> bool val isLower: char -> bool val isUpper: char -> bool val isPrint: char -> bool val isPunct: char -> bool val isSpace: char -> bool val toString: char -> String.string val scan: (Char.char, 'a) StringCvt.reader -> (char, 'a) StringCvt.reader val fromString: String.string -> char option val toCString: char -> String.string val fromCString: String.string -> char option end signature CHAR_EXTRA = sig include CHAR val formatSequences: (Char.char, 'a) StringCvt.reader -> 'a -> 'a val scanC: (Char.char, 'a) StringCvt.reader -> (char, 'a) StringCvt.reader end mlton-20100608/basis-library/text/char.sml0000644000076600000240000003164111404435631016746 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHAR_ARG = sig structure PreChar : PRE_CHAR structure CharVector: EQTYPE_MONO_VECTOR_EXTRA structure CharArray: MONO_ARRAY_EXTRA sharing type PreChar.char = CharVector.elem = CharArray.elem sharing type PreChar.string = CharVector.vector = CharArray.vector end functor CharFn(Arg : CHAR_ARG) :> CHAR_EXTRA where type char = Arg.PreChar.char where type string = Arg.PreChar.string = struct open Arg.PreChar type string = Arg.CharVector.vector val maxOrd: int = numChars - 1 val fromString = Arg.CharVector.fromPoly o Vector.map (fn x => fromChar x) o String.toPoly fun succ c = if Primitive.Controls.safe andalso c = maxChar then raise Chr else chrUnsafe (Int.+ (ord c, 1)) fun pred c = if Primitive.Controls.safe andalso c = minChar then raise Chr else chrUnsafe (Int.- (ord c, 1)) fun chrOpt c = if Primitive.Controls.safe andalso Int.gtu (c, maxOrd) then NONE else SOME (chrUnsafe c) fun chr c = case chrOpt c of NONE => raise Chr | SOME c => c (* To implement character classes, we cannot use lookup tables on the * order of the number of characters. We don't want to scan the string * each time, so instead we'll sort it and use binary search. *) fun contains s = let val a = Array.tabulate (Arg.CharVector.length s, fn i => Arg.CharVector.sub (s, i)) val () = Heap.heapSort (a, op <) in fn c => let val x = Heap.binarySearch (a, fn d => d < c) in if x = Array.length a then false else Array.sub (a, x) = c end end fun notContains s = not o contains s val c = fromChar val ( la, lA, lf, lF, lz, lZ, l0, l9, lSPACE,lBANG, lTIL, lTAB, lCR, lDEL) = (c#"a", c#"A", c#"f", c#"F", c#"z", c#"Z", c#"0", c#"9", c#" ", c#"!", c#"~", c#"\t", c#"\r", c#"\127") (* Range comparisons don't need tables! It's faster to just compare. *) fun isLower c = la <= c andalso c <= lz fun isUpper c = c <= lZ andalso lA <= c (* More discriminating first! *) fun isDigit c = c <= l9 andalso l0 <= c (* More discriminating first! *) fun isGraph c = lBANG <= c andalso c <= lTIL fun isPrint c = lSPACE <= c andalso c <= lTIL fun isCntrl c = c < lSPACE orelse c = lDEL fun isAscii c = c <= lDEL (* These take advantage of ASCII ordering to minimize comparisons. *) fun isAlpha c = if la <= c then c <= lz else lA <= c andalso c <= lZ fun isAlphaNum c = if lA <= c then if la <= c then c <= lz else c <= lZ else l0 <= c andalso c <= l9 fun isHexDigit c = if lA <= c then if la <= c then c <= lf else c <= lF else l0 <= c andalso c <= l9 fun isSpace c = if lCR < c then c = lSPACE else lTAB <= c fun isPunct c = isGraph c andalso not (isAlphaNum c) local fun make (test, diff) c = if test c then chrUnsafe (Int.+? (ord c, diff)) else c val diff = Int.- (ord lA, ord la) in val toLower = make (isUpper, Int.~ diff) val toUpper = make (isLower, diff) end fun control reader state = case reader state of NONE => NONE | SOME (c, state) => if Char.<= (#"@", c) andalso Char.<= (c, #"_") then SOME (chr (Int.-? (Char.ord c, Char.ord #"@")), state) else NONE fun formatChar reader state = case reader state of NONE => NONE | SOME (c, state) => if StringCvt.isSpace c then SOME ((), state) else NONE fun formatChars reader = let fun loop state = case formatChar reader state of NONE => state | SOME ((), state) => loop state in loop end val 'a formatSequences: (Char.char, 'a) StringCvt.reader -> 'a -> 'a = fn reader => let fun loop state = case reader state of SOME (#"\\", state1) => (case formatChar reader state1 of NONE => state | SOME ((), state2) => let val state3 = formatChars reader state2 in case reader state3 of SOME (#"\\", state4) => loop state4 | _ => state end) | _ => state in loop end fun 'a scan (reader: (Char.char, 'a) StringCvt.reader) : (char, 'a) StringCvt.reader = let val escape : (char, 'a) StringCvt.reader = fn state => case reader state of NONE => NONE | SOME (c, state') => let fun yes c = SOME (fromChar c, state') in case c of #"a" => yes #"\a" | #"b" => yes #"\b" | #"t" => yes #"\t" | #"n" => yes #"\n" | #"v" => yes #"\v" | #"f" => yes #"\f" | #"r" => yes #"\r" | #"\\" => yes #"\\" | #"\"" => yes #"\"" | #"^" => control reader state' | #"u" => Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.HEX, 4) reader) state' | #"U" => Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.HEX, 8) reader) state' | _ => (* 3 decimal digits *) Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.DEC, 3) reader) state end val main: (char, 'a) StringCvt.reader = fn state => let val state = formatSequences reader state in case reader state of NONE => NONE | SOME (c, state) => (* isPrint doesn't exist. yuck: *) if Char.>= (c, #" ") andalso Char.<= (c, #"~") then case c of #"\\" => escape state | #"\"" => NONE | _ => SOME (fromChar c, formatSequences reader state) else NONE end in main end val fromString = StringCvt.scanString scan fun 'a scanC (reader: (Char.char, 'a) StringCvt.reader) : (char, 'a) StringCvt.reader = let val rec escape = fn state => case reader state of NONE => NONE | SOME (c, state') => let fun yes c = SOME (fromChar c, state') in case c of #"a" => yes #"\a" | #"b" => yes #"\b" | #"t" => yes #"\t" | #"n" => yes #"\n" | #"v" => yes #"\v" | #"f" => yes #"\f" | #"r" => yes #"\r" | #"?" => yes #"?" | #"\\" => yes #"\\" | #"\"" => yes #"\"" | #"'" => yes #"'" | #"^" => control reader state' | #"x" => Reader.mapOpt chrOpt (StringCvt.digits StringCvt.HEX reader) state' | #"u" => Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.HEX, 4) reader) state' | #"U" => Reader.mapOpt chrOpt (StringCvt.digitsExact (StringCvt.HEX, 8) reader) state' | _ => Reader.mapOpt chrOpt (StringCvt.digitsPlus (StringCvt.OCT, 3) reader) state end and main = fn NONE => NONE | SOME (c, state) => (* yuck. isPrint is not defined yet: *) if Char.>= (c, #" ") andalso Char.<= (c, #"~") then case c of #"\\" => escape state | _ => SOME (fromChar c, state) else NONE in main o reader end val fromCString = StringCvt.scanString scanC fun padLeft (s: String.string, n: int): String.string = let val m = String.size s val diff = Int.-? (n, m) in if Int.> (diff, 0) then String.concat [String.new (diff, #"0"), s] else if diff = 0 then s else raise Fail "padLeft" end fun unicodeEscape ord = if Int.< (ord, 65536) then String.concat ["\\u", padLeft (Int.fmt StringCvt.HEX ord, 4)] else String.concat ["\\U", padLeft (Int.fmt StringCvt.HEX ord, 8)] fun toString c = let val ord = ord c in if isPrint c then case ord of 92 (* #"\\" *) => "\\\\" | 34 (* #"\"" *) => "\\\"" | _ => String.new (1, Char.chrUnsafe ord) (* ^^^^ safe b/c isPrint < 128 *) else case ord of 7 (* #"\a" *) => "\\a" | 8 (* #"\b" *) => "\\b" | 9 (* #"\t" *) => "\\t" | 10 (* #"\n" *) => "\\n" | 11 (* #"\v" *) => "\\v" | 12 (* #"\f" *) => "\\f" | 13 (* #"\r" *) => "\\r" | _ => if Int.< (ord, 32) then String.concat ["\\^", String.new (1, Char.chrUnsafe (Int.+? (ord, 64 (* #"@" *) )))] else if Int.< (ord, 256) then String.concat ["\\", padLeft (Int.fmt StringCvt.DEC ord, 3)] else unicodeEscape ord end fun toCString c = let val ord = ord c in if isPrint c then case ord of 92 (* #"\\" *) => "\\\\" | 34 (* #"\"" *) => "\\\"" | 63 (* #"?" *) => "\\?" | 39 (* #"'" *) => "\\'" | _ => String.new (1, Char.chrUnsafe ord) else case ord of 7 (* #"\a" *) => "\\a" | 8 (* #"\b" *) => "\\b" | 9 (* #"\t" *) => "\\t" | 10 (* #"\n" *) => "\\n" | 11 (* #"\v" *) => "\\v" | 12 (* #"\f" *) => "\\f" | 13 (* #"\r" *) => "\\r" | _ => if Int.< (ord, 256) then String.concat ["\\", padLeft (Int.fmt StringCvt.OCT ord, 3)] else unicodeEscape ord end end structure CharArg : CHAR_ARG = struct structure PreChar = Char structure CharVector = CharVector structure CharArray = CharArray end structure WideCharArg : CHAR_ARG = struct structure PreChar = WideChar structure CharVector = WideCharVector structure CharArray = WideCharArray end structure Char : CHAR_EXTRA = CharFn(CharArg) structure WideChar : CHAR_EXTRA = CharFn(WideCharArg) mlton-20100608/basis-library/text/char0.sig0000644000076600000240000000070611404435631017013 0ustar mtfstaffsignature PRE_CHAR = sig eqtype char eqtype string val chrUnsafe: int -> char val ord: char -> int val fromChar: Char.char -> char val minChar : char val maxChar : char val numChars : int val compare: char * char -> order val < : char * char -> bool val <= : char * char -> bool val > : char * char -> bool val >= : char * char -> bool end mlton-20100608/basis-library/text/char0.sml0000644000076600000240000000444211404435631017025 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local structure PreCharX = struct structure Prim8 = Primitive.Char8 structure Prim16 = Primitive.Char16 structure Prim32 = Primitive.Char32 type 'a t = { chrUnsafe: int -> 'a, ord: 'a -> int, minChar: 'a, maxChar: 'a, numChars: int } val fChar8 : Prim8.char t = { chrUnsafe = Prim8.idFromWord8 o Int.sextdToWord8, ord = Int.zextdFromWord8 o Prim8.idToWord8, minChar = #"\000", maxChar = #"\255", numChars = 256 } val fChar16 : Prim16.char t = { chrUnsafe = Prim16.idFromWord16 o Int.sextdToWord16, ord = Int.zextdFromWord16 o Prim16.idToWord16, minChar = #"\000", maxChar = #"\uFFFF", numChars = 65536 } val fChar32 : Prim32.char t = { chrUnsafe = Prim32.idFromWord32 o Int.sextdToWord32, ord = Int.zextdFromWord32 o Prim32.idToWord32, minChar = #"\000", maxChar = #"\U0010FFFF", numChars = 1114112 (* 0x110000 *) } end in structure Char : PRE_CHAR = struct (* set by config/default/default-charX.sml *) open Char type string = String.string local structure PCX = Char_ChooseChar(PreCharX) in val { chrUnsafe, ord, minChar, maxChar, numChars } = PCX.f end fun fromChar x = x end structure WideChar : PRE_CHAR = struct (* set by config/default/default-widecharX.sml *) open WideChar type string = WideString.string local structure PCX = WideChar_ChooseChar(PreCharX) in val { chrUnsafe, ord, minChar, maxChar, numChars } = PCX.f end (* safe b/c WideChar >= Char *) val fromChar = chrUnsafe o Char.ord end end mlton-20100608/basis-library/text/nullstring.sml0000644000076600000240000000071211404435631020225 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure NullString = struct open Primitive.NullString8 val nullTerm = fromString o String.nullTerm end structure NullStringArray = struct open Primitive.NullString8Array end mlton-20100608/basis-library/text/string-cvt.sig0000644000076600000240000000314111404435631020112 0ustar mtfstaffsignature STRING_CVT = sig datatype radix = BIN | OCT | DEC | HEX datatype realfmt = SCI of int option | FIX of int option | GEN of int option | EXACT type ('a, 'b) reader = 'b -> ('a * 'b) option val padLeft: char -> int -> string -> string val padRight: char -> int -> string -> string val splitl: (char -> bool) -> (char, 'a) reader -> 'a -> string * 'a val takel: (char -> bool) -> (char, 'a) reader -> 'a -> string val dropl: (char -> bool) -> (char, 'a) reader -> 'a -> 'a val skipWS: (char, 'a) reader -> 'a -> 'a type cs val scanString: ((char, cs) reader -> ('a, cs) reader) -> string -> 'a option end signature STRING_CVT_EXTRA = sig include STRING_CVT val radixToInt: radix -> int val radixToWord: radix -> word val charToDigit: radix -> char -> int option val charToWDigit: radix -> char -> word option (* this exists before Char.isSpace *) val isSpace: char -> bool (* maps 0...15 to #"0", #"1", ..., #"F" *) val digitToChar: int -> char (* digitsExact(r, n) reads exactly n digits of radix r *) val digitsExact: radix * int -> (char, 'a) reader -> (int, 'a) reader (* digitsPlus(r, m) reads between 1 and m digits of radix r *) val digitsPlus: radix * int -> (char, 'a) reader -> (int, 'a) reader (* digits r reads as many digits of radix r as possible *) val digits: radix -> (char, 'a) reader -> (int, 'a) reader val wdigits: radix -> (char, 'a) reader -> (word, 'a) reader end mlton-20100608/basis-library/text/string-cvt.sml0000644000076600000240000001500111404435631020121 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure StringCvt: STRING_CVT_EXTRA = struct open Reader val wordFromInt = Word.sextdFromInt datatype radix = BIN | OCT | DEC | HEX val radixToInt: radix -> int = fn BIN => 2 | OCT => 8 | DEC => 10 | HEX => 16 val radixToWord: radix -> word = wordFromInt o radixToInt datatype realfmt = SCI of int option | FIX of int option | GEN of int option | EXACT type ('a, 'b) reader = 'b -> ('a * 'b) option open Int local fun pad f (c: char) i s = let val n = String.size s in if n >= i then s else f (s, String.vector (i -? n, c)) end in val padLeft = pad (fn (s, pad) => String.^ (pad, s)) val padRight = pad String.^ end fun splitl p f src = let fun done chars = String.implode (rev chars) fun loop (src, chars) = case f src of NONE => (done chars, src) | SOME (c, src') => if p c then loop (src', c :: chars) else (done chars, src) in loop (src, []) end fun takel p f s = #1 (splitl p f s) fun dropl p f s = #2 (splitl p f s) type cs = int fun stringReader (s: string): (char, cs) reader = fn i => if i >= String.size s then NONE else SOME (String.sub (s, i), i + 1) fun 'a scanString (f: ((char, cs) reader -> ('a, cs) reader)) (s: string) : 'a option = case f (stringReader s) 0 of NONE => NONE | SOME (a, _) => SOME a local fun memoize (f: char -> 'a): char -> 'a = let val a = Array.tabulate (Char.numChars, f o Char.chrUnsafe) in fn c => Array.sub (a, Char.ord c) end fun range (add: int, cmin: char, cmax: char): char -> int option = let val min = Char.ord cmin in fn c => if Char.<= (cmin, c) andalso Char.<= (c, cmax) then SOME (add +? Char.ord c -? min) else NONE end fun 'a combine (ds: (char -> 'a option) list): char -> 'a option = memoize (fn c => let val rec loop = fn [] => NONE | d :: ds => case d c of NONE => loop ds | z => z in loop ds end) val bin = memoize (range (0, #"0", #"1")) val oct = memoize (range (0, #"0", #"7")) val dec = memoize (range (0, #"0", #"9")) val hex = combine [range (0, #"0", #"9"), range (10, #"a", #"f"), range (10, #"A", #"F")] fun isSpace c = (c = #" " orelse c = #"\t" orelse c = #"\r" orelse c = #"\n" orelse c = #"\v" orelse c = #"\f") in val isSpace = memoize isSpace fun skipWS x = dropl isSpace x fun charToDigit (radix: radix): char -> int option = case radix of BIN => bin | OCT => oct | DEC => dec | HEX => hex end fun charToWDigit radix = (Option.map wordFromInt) o (charToDigit radix) fun digits (radix, max, accum) reader state = let val r = radixToInt radix fun loop (max, accum, state) = let fun done () = SOME (accum, state) in if max <= 0 then done () else case reader state of NONE => done () | SOME (c, state) => case charToDigit radix c of NONE => done () | SOME n => loop (max - 1, n + accum * r, state) end in loop (max, accum, state) end fun digitsPlus (radix, max) reader state = case reader state of NONE => NONE | SOME (c, state) => case charToDigit radix c of NONE => NONE | SOME n => digits (radix, max -? 1, n) reader state fun digitsExact (radix, num) reader state = let val r = radixToInt radix fun loop (num, accum, state) = if num <= 0 then SOME (accum, state) else case reader state of NONE => NONE | SOME (c, state) => case charToDigit radix c of NONE => NONE | SOME n => loop (num - 1, n + accum * r, state) in loop (num, 0, state) end fun digits radix reader state = let val r = radixToInt radix fun loop (accum, state) = case reader state of NONE => SOME (accum, state) | SOME (c, state') => case charToDigit radix c of NONE => SOME (accum, state) | SOME n => loop (n + accum * r, state') in case reader state of NONE => NONE | SOME (c, state) => case charToDigit radix c of NONE => NONE | SOME n => loop (n, state) end fun wdigits radix reader state = let val op + = Word.+ val op * = Word.* val r = radixToWord radix fun loop (accum, state) = case reader state of NONE => SOME (accum, state) | SOME (c, state') => case charToWDigit radix c of NONE => SOME (accum, state) | SOME n => loop (n + accum * r, state') in case reader state of NONE => NONE | SOME (c, state) => case charToWDigit radix c of NONE => NONE | SOME n => loop (n, state) end fun digitToChar (n: int): char = String.sub ("0123456789ABCDEF", n) end mlton-20100608/basis-library/text/string-global.sml0000644000076600000240000000077711404435631020603 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure StringGlobal: STRING_GLOBAL = String open StringGlobal (* Now that concat is defined, we can add the exnMessager for Fail. *) val _ = General.addExnMessager (fn e => case e of Fail s => SOME (concat ["Fail: ", s]) | _ => NONE) mlton-20100608/basis-library/text/string.sig0000644000076600000240000000340111404435631017317 0ustar mtfstaffsignature STRING_GLOBAL = sig eqtype char eqtype string val ^ : string * string -> string val concat: string list -> string val explode: string -> char list val implode: char list -> string val size: string -> int val str: char -> string val substring: string * int * int -> string end signature STRING = sig include STRING_GLOBAL val < : string * string -> bool val <= : string * string -> bool val > : string * string -> bool val >= : string * string -> bool val collate: (char * char -> order) -> string * string -> order val compare: string * string -> order val concatWith: string -> string list -> string val extract: string * int * int option -> string val fields: (char -> bool) -> string -> string list val fromCString: String.string -> string option val fromString: String.string -> string option val isPrefix: string -> string -> bool val isSubstring: string -> string -> bool val isSuffix: string -> string -> bool val map: (char -> char) -> string -> string val maxSize: int val scan: (Char.char, 'a) StringCvt.reader -> (string, 'a) StringCvt.reader val sub: string * int -> char val toCString: string -> String.string val toString: string -> String.string val tokens: (char -> bool) -> string -> string list val translate: (char -> string) -> string -> string end signature STRING_EXTRA = sig include STRING type array val unsafeFromArray: array -> string val new: int * char -> string val nullTerm: string -> string val tabulate: int * (int -> char) -> string val toLower: string -> string end mlton-20100608/basis-library/text/string.sml0000644000076600000240000000564511404435631017344 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature STRING_ARG = sig structure Char: CHAR_EXTRA structure CharVector: EQTYPE_MONO_VECTOR_EXTRA sharing type Char.char = CharVector.elem sharing type Char.string = CharVector.vector end functor StringFn(Arg : STRING_ARG) :> STRING_EXTRA where type char = Arg.CharVector.elem where type string = Arg.CharVector.vector where type array = Arg.CharVector.array = struct open Arg open CharVector structure CharVectorSlice = MonoVectorSlice type char = elem type string = vector val new = vector fun str c = new (1, c) val maxSize = maxLen val size = length val op ^ = append val implode = fromList val explode = toList fun extract (s, start, len) = CharVectorSlice.vector (CharVectorSlice.slice (s, start, len)) fun substring (s, start, len) = extract (s, start, SOME len) val toLower = translate (str o Char.toLower) local fun make f = f (op = : char * char -> bool) in val isPrefix = make isPrefix val isSubstring = make isSubvector val isSuffix = make isSuffix end val compare = collate Char.compare local structure S = StringComparisons (type t = string val compare = compare) in open S end fun Stranslate f = String.fromPoly o Vector.translate f o toPoly val toString = Stranslate Char.toString val toCString = Stranslate Char.toCString val scan = fn reader => let fun loop (state, cs) = case Char.scan reader state of NONE => SOME (implode (rev cs), Char.formatSequences reader state) | SOME (c, state) => loop (state, c :: cs) in fn state => loop (state, []) end val fromString = StringCvt.scanString scan fun scanString scanChar reader = fn state => Option.map (fn (cs, state) => (implode cs, state)) (Reader.list (scanChar reader) state) val fromCString = StringCvt.scanString (scanString Char.scanC) val null = str (Char.chr 0) fun nullTerm s = s ^ null end structure StringArg : STRING_ARG = struct structure Char = Char structure CharVector = CharVector end structure WideStringArg : STRING_ARG = struct structure Char = WideChar structure CharVector = WideCharVector end structure String : STRING_EXTRA = StringFn(StringArg) structure WideString : STRING_EXTRA = StringFn(WideStringArg) mlton-20100608/basis-library/text/string0.sml0000644000076600000240000000121411404435631017410 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure String = struct open CharVector type string = vector val size = length val op ^ = append val implode = fromList val new = vector end (* structure WideString = struct open WideCharVector type string = vector val size = length val op ^ = append val implode = fromList val new = vector end *) mlton-20100608/basis-library/text/substring-global.sml0000644000076600000240000000051011404435631021276 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure SubstringGlobal: SUBSTRING_GLOBAL = Substring open SubstringGlobal mlton-20100608/basis-library/text/substring.sig0000644000076600000240000000415311404435631020036 0ustar mtfstaffsignature SUBSTRING_GLOBAL = sig type substring end signature SUBSTRING = sig include SUBSTRING_GLOBAL eqtype char eqtype string val app: (char -> unit) -> substring -> unit val base: substring -> string * int * int val collate: (char * char -> order) -> substring * substring -> order val compare: substring * substring -> order val concat: substring list -> string val concatWith: string -> substring list -> string val dropl: (char -> bool) -> substring -> substring val dropr: (char -> bool) -> substring -> substring val explode: substring -> char list val extract: string * int * int option -> substring val fields: (char -> bool) -> substring -> substring list val first: substring -> char option val foldl: (char * 'a -> 'a) -> 'a -> substring -> 'a val foldr: (char * 'a -> 'a) -> 'a -> substring -> 'a val full: string -> substring val getc: substring -> (char * substring) option val isEmpty: substring -> bool val isPrefix: string -> substring -> bool val isSubstring: string -> substring -> bool val isSuffix: string -> substring -> bool val position: string -> substring -> substring * substring val size: substring -> int val slice: substring * int * int option -> substring val span: substring * substring -> substring val splitAt: substring * int -> substring * substring val splitl: (char -> bool) -> substring -> substring * substring val splitr: (char -> bool) -> substring -> substring * substring val string: substring -> string val sub: substring * int -> char val substring: string * int * int -> substring val takel: (char -> bool) -> substring -> substring val taker: (char -> bool) -> substring -> substring val tokens: (char -> bool) -> substring -> substring list val translate: (char -> string) -> substring -> string val triml: int -> substring -> substring val trimr: int -> substring -> substring end signature SUBSTRING_EXTRA = sig include SUBSTRING end mlton-20100608/basis-library/text/substring.sml0000644000076600000240000000360011404435631020043 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* The :> is to hide the type substring. We must add the where's to make char * and string the same as the toplevel types. *) functor SubstringFn(Arg : STRING_ARG) :> SUBSTRING_EXTRA where type char = Arg.CharVector.MonoVectorSlice.elem where type string = Arg.CharVector.MonoVectorSlice.vector where type substring = Arg.CharVector.MonoVectorSlice.slice = struct open Arg open CharVector.MonoVectorSlice type char = elem type string = vector type substring = slice val size = length val extract = slice fun substring (s, start, len) = extract (s, start, SOME len) val string = vector val getc = getItem fun first ss = Option.map #1 (getItem ss) val slice = subslice val explode = toList local fun make f = f (op = : char * char -> bool) in val isPrefix = make isPrefix val isSubstring = make isSubvector val isSuffix = make isSuffix val position = make position end val compare = collate Char.compare (* type cs = int fun reader (T {str, start, size}): (char, cs) Reader.reader = fn i => if i >= size then NONE else SOME (String.sub (str, start +? i), i + 1) fun 'a scanSubstring (f: (char, cs) Reader.reader -> ('a, int) Reader.reader) (ss: substring): 'a option = case f (reader ss) 0 of NONE => NONE | SOME (a, _) => SOME a *) end structure Substring = SubstringFn(StringArg) structure WideSubstring = SubstringFn(WideStringArg) mlton-20100608/basis-library/text/text.sig0000644000076600000240000000150311404435631016776 0ustar mtfstaffsignature TEXT = sig structure Char: CHAR structure CharArray: MONO_ARRAY structure CharArraySlice: MONO_ARRAY_SLICE structure CharVector: MONO_VECTOR structure CharVectorSlice: MONO_VECTOR_SLICE structure String: STRING structure Substring: SUBSTRING sharing type Char.char = CharArray.elem = CharArraySlice.elem = CharVector.elem = CharVectorSlice.elem = String.char = Substring.char sharing type Char.string = CharArraySlice.vector = CharVector.vector = CharArray.vector = CharVectorSlice.vector = String.string = Substring.string sharing type CharArray.array = CharArraySlice.array sharing type CharVectorSlice.slice = CharArraySlice.vector_slice end mlton-20100608/basis-library/text/text.sml0000644000076600000240000000153511404435631017014 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Text: TEXT = struct structure Char = Char structure CharArray = CharArray structure CharArraySlice = CharArraySlice structure CharVector = CharVector structure CharVectorSlice = CharVectorSlice structure String = String structure Substring = Substring end structure WideText: TEXT = struct structure Char = WideChar structure CharArray = WideCharArray structure CharArraySlice = WideCharArraySlice structure CharVector = WideCharVector structure CharVectorSlice = WideCharVectorSlice structure String = WideString structure Substring = WideSubstring end mlton-20100608/basis-library/top-level/0000755000076600000240000000000011404470406016231 5ustar mtfstaffmlton-20100608/basis-library/top-level/arithmetic.sml0000644000076600000240000000073011404435631021100 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val ~ = Int.~ val ( op + ) = Int.+ val ( op - ) = Int.- val ( op * ) = Int.* val ( op div ) = Int.div val ( op mod ) = Int.mod val ( op < ) = Int.< val ( op <= ) = Int.<= val ( op > ) = Int.> val ( op >= ) = Int.>= mlton-20100608/basis-library/top-level/infixes-overflow.sml0000644000076600000240000000042711404435631022260 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) infix 7 *! infix 6 +! -! mlton-20100608/basis-library/top-level/infixes-unsafe.sml0000644000076600000240000000042711404435631021676 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) infix 7 *? infix 6 +? -? mlton-20100608/basis-library/top-level/infixes.sml0000644000076600000240000000054311404435631020416 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) infix 7 * / mod div infix 6 + - ^ infixr 5 :: @ infix 4 = <> > >= < <= infix 3 := o infix 0 before mlton-20100608/basis-library/unsafe.mlb0000644000076600000240000000070111404435632016277 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "deadCode true" "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local libs/basis-extra/basis-extra.mlb in signature UNSAFE structure Unsafe end end mlton-20100608/basis-library/util/0000755000076600000240000000000011404470406015277 5ustar mtfstaffmlton-20100608/basis-library/util/abs-rep.fun0000644000076600000240000000247511404435632017354 0ustar mtfstaff(* Copyright (C) 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MkAbsRep(type rep) :> ABS_REP where type Rep.t = rep = struct structure Rep = struct type t = rep end type t = Rep.t val arrayFromRep : rep array -> t array = fn x => x val arrayToRep : t array -> rep array = fn x => x val fromRep : rep -> t = fn x => x val listFromRep : rep list -> t list = fn x => x val listToRep : t list -> rep list = fn x => x val toRep : t -> rep = fn x => x val vectorFromRep : rep vector -> t vector = fn x => x val vectorToRep : t vector -> rep vector = fn x => x end functor MkAbsRepEq(eqtype rep) :> ABS_REP_EQ where type Rep.t = rep = struct structure Rep = struct type t = rep end type t = Rep.t val arrayFromRep : rep array -> t array = fn x => x val arrayToRep : t array -> rep array = fn x => x val fromRep : rep -> t = fn x => x val listFromRep : rep list -> t list = fn x => x val listToRep : t list -> rep list = fn x => x val toRep : t -> rep = fn x => x val vectorFromRep : rep vector -> t vector = fn x => x val vectorToRep : t vector -> rep vector = fn x => x end mlton-20100608/basis-library/util/abs-rep.sig0000644000076600000240000000203711404435632017340 0ustar mtfstaff(* Copyright (C) 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ABS_REP = sig type t structure Rep : sig type t end val arrayFromRep : Rep.t array -> t array val arrayToRep : t array -> Rep.t array val fromRep : Rep.t -> t val listFromRep : Rep.t list -> t list val listToRep : t list -> Rep.t list val toRep : t -> Rep.t val vectorFromRep : Rep.t vector -> t vector val vectorToRep : t vector -> Rep.t vector end signature ABS_REP_EQ = sig eqtype t structure Rep : sig eqtype t end val arrayFromRep : Rep.t array -> t array val arrayToRep : t array -> Rep.t array val fromRep : Rep.t -> t val listFromRep : Rep.t list -> t list val listToRep : t list -> Rep.t list val toRep : t -> Rep.t val vectorFromRep : Rep.t vector -> t vector val vectorToRep : t vector -> Rep.t vector end mlton-20100608/basis-library/util/cleaner.sig0000644000076600000240000000067111404435632017422 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CLEANER = sig type t val addNew: t * (unit -> unit) -> unit val atExit: t val atLoadWorld: t val clean: t -> unit val new: unit -> t end mlton-20100608/basis-library/util/cleaner.sml0000644000076600000240000000075411404435632017435 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Cleaner: CLEANER = struct type t = (unit -> unit) list ref fun new (): t = ref [] fun addNew (cs, f) = cs := f :: (!cs) fun clean cs = app (fn c => c () handle _ => ()) (!cs) val atExit = new () val atLoadWorld = new () end mlton-20100608/basis-library/util/CUtil.sig0000644000076600000240000000243111404435632017025 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature C_UTIL = sig structure C_Pointer : sig type t = C_Pointer.t val null: t val isNull: t -> bool end (* C char* *) structure C_String : sig type t = C_String.t (* string must be null terminated *) val length: t -> int val sub: t * int -> char val toCharArrayOfLength: t * int -> char array (* string must be null terminated *) val toString: t -> string (* extract first n characters of string *) val toStringOfLength: t * int -> string val update: t * int * char -> unit end (* NULL terminated char** *) structure C_StringArray : sig type t = C_StringArray.t val fromList: string list -> NullString.t array (* extract first n strings from array *) val toArrayOfLength: t * int -> string array val toList: t -> string list end end mlton-20100608/basis-library/util/CUtil.sml0000644000076600000240000000603311404435632017040 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure CUtil: C_UTIL = struct open Int structure Pointer = Primitive.MLton.Pointer fun makeLength (sub, term) p = let fun loop i = if term (sub (p, i)) then i else loop (i +? 1) in loop 0 end fun toArrayOfLength (s: 'a, sub: 'a * int -> 'b, n: int) : 'b array = let val (a, _) = Array.unfoldi (n, (), fn (i, ()) => (sub (s, i), ())) in a end structure C_Pointer = struct type t = C_Pointer.t val null = Pointer.toWord Pointer.null fun isNull p = p = null end structure C_String = struct type t = C_String.t fun sub (cs, i) = Primitive.Char8.idFromWord8 (Pointer.getWord8 (Pointer.fromWord cs, C_Ptrdiff.fromInt i)) fun update (cs, i, c) = Pointer.setWord8 (Pointer.fromWord cs, C_Ptrdiff.fromInt i, Primitive.Char8.idToWord8 c) val length = makeLength (sub, fn #"\000" => true | _ => false) fun toCharArrayOfLength (cs, n) = toArrayOfLength (cs, sub, n) fun toStringOfLength (cs, n) = String.unsafeFromArray (CharArray.fromPoly (toCharArrayOfLength (cs, n))) fun toString cs = toStringOfLength (cs, length cs) end structure C_StringArray = struct type t = C_StringArray.t fun sub (css: t, i) = (Pointer.toWord o Pointer.getCPointer) (Pointer.fromWord css, C_Ptrdiff.fromInt i) val length = makeLength (sub, C_Pointer.isNull) val toArrayOfLength = fn (css, n) => toArrayOfLength (css, C_String.toString o sub, n) fun toArray css = toArrayOfLength (css, length css) val toList = Array.toList o toArray (* The C side converts the last element of the array, "", * to the null terminator that C primitives expect. * As far as C can tell, the other elements of the array * are just char*'s. *) fun fromList l = let val (a, _) = Array.unfoldi (1 +? List.length l, l, fn (_, l) => case l of [] => (NullString.empty, l) | s::l => (NullString.nullTerm s, l)) in a end end end mlton-20100608/basis-library/util/dynamic-wind.sig0000644000076600000240000000052611404435632020373 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DYNAMIC_WIND = sig val wind: (unit -> 'a) * (unit -> unit) -> 'a end mlton-20100608/basis-library/util/dynamic-wind.sml0000644000076600000240000000116411404435632020403 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure DynamicWind: DYNAMIC_WIND = struct fun try (f: unit -> 'a, k: 'a -> 'b, h: exn -> 'b) = let datatype t = A of 'a | E of exn in case A (f ()) handle e => E e of A a => k a | E e => h e end fun wind (thunk, cleanup: unit -> unit) = try (thunk, fn a => (cleanup (); a), fn e => (cleanup (); raise e)) end mlton-20100608/basis-library/util/heap.sml0000644000076600000240000000745311404435632016744 0ustar mtfstaff(* Copyright (C) 2007-2007 Wesley W. Terpstra * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Heap: sig (* Sorts the provided array relative to the lessthan argument*) val heapSort: 'a array * ('a * 'a -> bool) -> unit (* Precondition: array is 0+ true values followed by 0+ false values *) (* Finds the index of the first array entry where: f x = false *) val binarySearch: 'a array * ('a -> bool) -> int end = struct fun heapSort (a : 'a array, lessthan : 'a * 'a -> bool) = let open Array (* Push the hole down until value > both children *) fun pushHoleDown ( hole, end_of_heap, value ) = let val left_child = Int.+ (Int.* (hole, 2), 1) val right_child = Int.+ (left_child, 1) in (* Recursion: two children *) if Int.< (right_child, end_of_heap) then let val left_value = sub (a, left_child) val right_value = sub (a, right_child) val (bigger_child, bigger_value) = if lessthan (left_value, right_value) then (right_child, right_value) else (left_child, left_value) in if lessthan (bigger_value, value) then update (a, hole, value) else (update (a, hole, bigger_value); pushHoleDown (bigger_child, end_of_heap, value)) end (* Base case: one child *) else if right_child = end_of_heap then let val left_value = sub (a, left_child) in if lessthan (left_value, value) then update (a, hole, value) else (update (a, hole, left_value); update (a, left_child, value)) end (* Base case: no children *) else update (a, hole, value) end (* Move largest element to end_of_table, then restore invariant *) fun sortHeap end_of_heap = let val end_of_heap = Int.- (end_of_heap, 1) in if end_of_heap = 0 then () else let val value = sub (a, end_of_heap) in update (a, end_of_heap, sub (a, 0)); pushHoleDown (0, end_of_heap, value); sortHeap end_of_heap end end (* Start at last node w/ parent, loop till 0: push down *) val heapSize = Array.length a fun heapify i = if i = 0 then () else let val i = Int.- (i, 1) in pushHoleDown (i, heapSize, sub (a, i)); heapify i end in if Int.<= (heapSize, 1) then () else (heapify (Int.div (heapSize, 2)); sortHeap heapSize) end fun binarySearch (a : 'a array, f : 'a -> bool) = let fun loop (lower, upper) = (* Base case: one element left *) if Int.- (upper, lower) = 1 then if f (Array.sub (a, lower)) then upper else lower (* Recursive case: check middle *) else let val mid = Int.div (Int.+ (lower, upper), 2) in if f (Array.sub (a, mid)) then loop (mid, upper) else loop (lower, mid) end val size = Array.length a in if size = 0 then 0 else loop (0, size) end end mlton-20100608/basis-library/util/integral-comparisons.sml0000644000076600000240000000230611404435632022157 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor IntegralComparisons (type t val < : t * t -> bool) = struct val < : t * t -> bool = < fun <= (a, b) = not (< (b, a)) fun > (a, b) = < (b, a) fun >= (a, b) = <= (b, a) fun compare (i, j) = if < (i, j) then LESS else if < (j, i) then GREATER else EQUAL fun min (x, y) = if < (x, y) then x else y fun max (x, y) = if < (x, y) then y else x end functor UnsignedIntegralComparisons (type int type word val idFromIntToWord : int -> word val < : word * word -> bool) = struct local fun ltu (i: int, i': int) = < (idFromIntToWord i, idFromIntToWord i') structure S = IntegralComparisons (type t = int val < = ltu) in val ltu = S.< val leu = S.<= val gtu = S.> val geu = S.>= end end mlton-20100608/basis-library/util/natural.sml0000644000076600000240000000135511404435632017470 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Natural = struct fun foldStartStop (start, stop, b, f) = if start > stop then raise Subscript else let fun loop (i, b) = if i >= stop then b else loop (i + 1, f (i, b)) in loop (start, b) end fun foreachStartStop (start, stop, f) = foldStartStop (start, stop, (), fn (i, ()) => f i) fun foreach (n, f) = foreachStartStop (0, n, f) end mlton-20100608/basis-library/util/one.sml0000644000076600000240000000223511404435632016601 0ustar mtfstaff(* Copyright (C) 2006-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure One: sig type 'a t val make: (unit -> 'a) -> 'a t val use: 'a t * ('a -> 'b) -> 'b end = struct datatype 'a t = T of {more: unit -> 'a, static: 'a, staticIsInUse: bool ref} fun make f = T {more = f, static = f (), staticIsInUse = ref false} fun use (T {more, static, staticIsInUse}, f) = let val () = Primitive.MLton.Thread.atomicBegin () val b = ! staticIsInUse val d = if b then (Primitive.MLton.Thread.atomicEnd (); more ()) else (staticIsInUse := true; Primitive.MLton.Thread.atomicEnd (); static) in DynamicWind.wind (fn () => f d, fn () => if b then () else staticIsInUse := false) end end mlton-20100608/basis-library/util/reader.sig0000644000076600000240000000220611404435632017247 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature READER = sig type ('a, 'b) reader = 'b -> ('a * 'b) option (* read as many items as possible (never returns NONE) *) val list: ('a, 'b) reader -> ('a list, 'b) reader (* never return NONE *) (* val tokens: ('a -> bool) -> ('a, 'b) reader -> ('a list list, 'b) reader *) (* val fields: ('a -> bool) -> ('a, 'b) reader -> ('a list list, 'b) reader *) val map: ('a -> 'c) -> ('a, 'b) reader -> ('c, 'b) reader val mapOpt: ('a -> 'c option) -> ('a, 'b) reader -> ('c, 'b) reader val ignore: ('a -> bool) -> ('a, 'b) reader -> ('a, 'b) reader (* read excatly N items *) val readerN: ('a, 'b) reader * int -> ('a list, 'b) reader val reader2: ('a, 'b) reader -> ('a * 'a, 'b) reader val reader3: ('a, 'b) reader -> ('a * 'a * 'a, 'b) reader val reader4: ('a, 'b) reader -> ('a * 'a * 'a * 'a, 'b) reader end mlton-20100608/basis-library/util/reader.sml0000644000076600000240000000371711404435632017270 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Reader: READER = struct open Int type ('a, 'b) reader = 'b -> ('a * 'b) option fun list (reader: ('a, 'b) reader): ('a list, 'b) reader = fn state => let fun loop (state, accum) = case reader state of NONE => SOME (rev accum, state) | SOME (a, state) => loop (state, a :: accum) in loop (state, []) end fun readerN (reader: ('a, 'b) reader, n: int): ('a list, 'b) reader = fn (state :'b) => let fun loop (n, state, accum) = if n <= 0 then SOME (rev accum, state) else case reader state of NONE => NONE | SOME (x, state) => loop (n - 1, state, x :: accum) in loop (n, state, []) end fun ignore f reader = let fun loop state = case reader state of NONE => NONE | SOME (x, state) => if f x then loop state else SOME (x, state) in loop end val _ = ignore fun map (f: 'a -> 'c) (reader: ('a, 'b) reader): ('c, 'b) reader = fn (b: 'b) => case reader b of NONE => NONE | SOME (a, b) => SOME (f a, b) fun mapOpt (f: 'a -> 'c option) (reader: ('a, 'b) reader): ('c, 'b) reader = fn (b: 'b) => case reader b of NONE => NONE | SOME (a, b) => case f a of NONE => NONE | SOME c => SOME (c, b) fun reader2 reader = map (fn [y, z] => (y, z) | _ => raise Fail "Reader.reader2") (readerN (reader, 2)) val _ = reader2 fun reader3 reader = map (fn [x, y, z] => (x, y, z) | _ => raise Fail "Reader.reader3") (readerN (reader, 3)) fun reader4 reader = map (fn [w, x, y, z] => (w, x, y, z) | _ => raise Fail "Reader.reader4") (readerN (reader, 4)) end mlton-20100608/basis-library/util/real-comparisons.sml0000644000076600000240000000063111404435632021274 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RealComparisons (type t val < : t * t -> bool val <= : t * t -> bool) = struct fun > (a, b) = < (b, a) fun >= (a, b) = <= (b, a) end mlton-20100608/basis-library/util/string-comparisons.sml0000644000076600000240000000142711404435632021663 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor StringComparisons (type t val compare: t * t -> order) = struct fun < (x, y) = (case compare (x, y) of LESS => true | _ => false) fun <= (x, y) = (case compare (x, y) of GREATER => false | _ => true) fun > (x, y) = (case compare (x, y) of GREATER => true | _ => false) fun >= (x, y) = (case compare (x, y) of LESS => false | _ => true) end mlton-20100608/basis-library/util/unique-id.fun0000644000076600000240000000054511404435632017717 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor UniqueId () :> UNIQUE_ID = struct type t = unit ref fun new (): t = ref () end mlton-20100608/basis-library/util/unique-id.sig0000644000076600000240000000050611404435632017706 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNIQUE_ID = sig type t val new: unit -> t end mlton-20100608/benchmark/0000755000076600000240000000000011404470406013511 5ustar mtfstaffmlton-20100608/benchmark/.ignore0000644000076600000240000000004511404435630014774 0ustar mtfstaff*~ core benchmark benchmark.sml junk mlton-20100608/benchmark/benchmark.mlb0000644000076600000240000000036511404435630016143 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local sources.mlb in call-main.sml end mlton-20100608/benchmark/call-main.sml0000644000076600000240000000041711404435630016065 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20100608/benchmark/main.sml0000644000076600000240000006557211404435630015171 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Main = struct type int = Int.t fun usage msg = Process.usage {usage = "[-mlkit] [-mlton ] [-mosml] [-poly] [-smlnj] bench1 bench2 ...", msg = msg} val doOnce = ref false val doWiki = ref false val runArgs : string list ref = ref [] fun withInput (file, f: unit -> 'a): 'a = let open FileDesc val inFd = let open Pervasive.Posix.FileSys in openf (file, O_RDONLY, O.flags []) end in Exn.finally (fn () => FileDesc.fluidLet (FileDesc.stdin, inFd, f), fn () => FileDesc.close inFd) end fun ignoreOutput f = let val nullFd = let open Pervasive.Posix.FileSys in openf ("/dev/null", O_WRONLY, O.flags []) end open FileDesc in Exn.finally (fn () => fluidLet (stderr, nullFd, fn () => fluidLet (stdout, nullFd, f)), fn () => close nullFd) end datatype command = Explicit of {args: string list, com: string} | Shell of string fun timeIt ca = Process.time (fn () => case ca of Explicit {args, com} => Process.wait (Process.spawnp {file = com, args = com :: args}) | Shell s => Process.system s) local val trialTime = Time.seconds (IntInf.fromInt 60) in fun timeCall (com, args): real = let fun doit ac = let val {user, system} = timeIt (Explicit {args = args, com = com}) val op + = Time.+ in ac + user + system end fun loop (n, ac: Time.t): real = if Time.> (ac, trialTime) then Time.toReal ac / Real.fromInt n else loop (n + 1, doit ac) in if !doOnce then Time.toReal (doit Time.zero) else loop (0, Time.zero) end end val benchCounts: (string * int * int) list = [("barnes-hut", 4096, 1024), ("boyer", 3000, 1000), ("checksum", 1500, 150), ("count-graphs", 3, 1), ("DLXSimulator", 50, 15), ("fft", 256, 128), ("fib", 6, 1), ("flat-array", 6000, 1200), ("hamlet", 100, 10), ("imp-for", 1000, 300), ("knuth-bendix", 500, 100), ("lexgen", 300, 50), ("life", 6, 2), ("logic", 40, 7), ("mandelbrot", 2, 1), ("matrix-multiply", 20, 20), ("md5", 30, 10), ("merge", 4000, 1000), ("mlyacc", 500, 150), ("model-elimination", 0, 0), ("mpuz", 20, 5), ("nucleic", 500, 150), ("output1", 3, 3), ("peek", 1000, 100), ("psdes-random", 3, 1), ("ratio-regions", 1024, 512), ("ray", 100, 30), ("raytrace", 10, 3), ("simple", 100, 20), ("smith-normal-form", 6, 1), ("tailfib", 200, 60), ("tak", 4, 2), ("tensor", 3, 1), ("tsp", 4, 1), ("tyan", 80, 13), ("vector-concat", 10, 2), ("vector-rev", 20, 20), ("vliw", 150, 30), ("wc-input1", 4000, 1000), ("wc-scanStream", 6000, 2000), ("zebra", 15, 3), ("zern", 2000, 500)] val benchCount = String.memoize (fn s => case List.peek (benchCounts, fn (b, _, _) => b = s) of NONE => Error.bug (concat ["no benchCount for ", s]) | SOME (_, x86, sparc) => Int.toString let open MLton.Platform.Arch in case host of Sparc => sparc | _ => x86 end) fun compileSizeRun {command, exe, doTextPlusData: bool} = Escape.new (fn e => let val exe = "./" ^ exe val {system, user} = timeIt command handle _ => Escape.escape (e, {compile = NONE, run = NONE, size = NONE}) val compile = SOME (Time.toReal (Time.+ (system, user))) val size = if doTextPlusData then let val {text, data, ...} = Process.size exe in SOME (Position.fromInt (text + data)) end else SOME (File.size exe) val run = timeCall (exe, !runArgs) handle _ => Escape.escape (e, {compile = compile, run = NONE, size = size}) in {compile = compile, run = SOME run, size = size} end) fun batch bench = concat [bench, ".batch.sml"] local val n = Counter.new 0 val exe = "a.out" in fun makeMLton commandPattern = case ChoicePattern.expand commandPattern of Result.No m => usage m | Result.Yes coms => List.map (coms, fn com => {name = com, abbrv = "MLton" ^ (Int.toString (Counter.next n)), test = (fn {bench} => compileSizeRun {command = Shell (concat [com, " -output ", exe, " ", batch bench]), exe = exe, doTextPlusData = true})}) end fun kitCompile {bench} = compileSizeRun {command = Explicit {args = [batch bench], com = "mlkit"}, exe = "run", doTextPlusData = true} fun mosmlCompile {bench} = compileSizeRun {command = Explicit {args = ["-orthodox", "-standalone", "-toplevel", batch bench], com = "mosmlc"}, exe = "a.out", doTextPlusData = false} val njSuffix = Promise.delay (fn () => let val sml = "sml" val suffix = File.withTemp (fn tmp => (File.withTempOut (fn output => Out.output (output, concat ["val tmp = TextIO.openOut(\"", tmp, "\");\n", "val _ = TextIO.output(tmp, SMLofNJ.SysInfo.getHeapSuffix());\n", "val _ = TextIO.closeOut(tmp);\n"]), fn input => withInput (input, fn () => Process.wait (Process.spawnp {file = sml, args = [sml]}))) ; In.withClose (In.openIn tmp, In.inputAll))) in suffix end) fun njCompile {bench} = Escape.new (fn e => let (* sml should start SML/NJ *) val sml = "sml" val {system, user} = File.withTempOut (fn out => (Out.output (out, "local\nval _ = SMLofNJ.Internals.GC.messages false\n") ; File.outputContents (concat [bench, ".sml"], out) ; (Out.output (out, concat ["in val _ = SMLofNJ.exportFn (\"", bench, "\", fn _ => (Main.doit ", benchCount bench, "; OS.Process.success))\nend\n"] ))), fn input => withInput (input, fn () => timeIt (Explicit {args = [], com = sml}))) handle _ => Escape.escape (e, {compile = NONE, run = NONE, size = NONE}) val suffix = Promise.force njSuffix val heap = concat [bench, ".", suffix] in if not (File.doesExist heap) then {compile = NONE, run = NONE, size = NONE} else let val compile = Time.toReal (Time.+ (user, system)) val size = SOME (File.size heap) val run = timeCall (sml, [concat ["@SMLload=", heap]]) handle _ => Escape.escape (e, {compile = SOME compile, run = NONE, size = size}) in {compile = SOME compile, run = SOME run, size = size} end end) fun polyCompile {bench} = Escape.new (fn e => let val originalDbase = "/usr/lib/poly/ML_dbase" val poly = "/usr/bin/poly" in File.withTemp (fn dbase => let val _ = File.copy (originalDbase, dbase) val original = File.size dbase val {system, user} = File.withTempOut (fn out => Out.output (out, concat ["use \"", bench, ".sml\" handle _ => PolyML.quit ();\n", "if PolyML.commit() then () else ", "(Main.doit ", benchCount bench, "; ());\n", "PolyML.quit();\n"]), fn input => withInput (input, fn () => timeIt (Explicit {args = [dbase], com = poly}))) val after = File.size dbase in if original = after then {compile = NONE, run = NONE, size = NONE} else let val compile = SOME (Time.toReal (Time.+ (user, system))) val size = SOME (after - original) val run = timeCall (poly, [dbase]) handle _ => Escape.escape (e, {compile = compile, run = NONE, size = size}) in {compile = compile, run = SOME run, size = size} end end) end) type 'a data = {bench: string, compiler: string, value: 'a} list fun main args = let val compilers: {name: string, abbrv: string, test: {bench: File.t} -> {compile: real option, run: real option, size: Position.int option}} list ref = ref [] fun pushCompiler compiler = List.push(compilers, compiler) fun pushCompilers compilers' = compilers := (List.rev compilers') @ (!compilers) fun setData (switch, data, str) = let fun die () = usage (concat ["invalid -", switch, " argument: ", str]) open Regexp val numSave = Save.new () val regexpSave = Save.new () val re = seq [save (star digit, numSave), char #",", save (star any, regexpSave)] val reC = compileDFA re in case Compiled.matchAll (reC, str) of NONE => die () | SOME match => let val num = Match.lookupString (match, numSave) val num = case Int.fromString num of NONE => die () | SOME num => num val regexp = Match.lookupString (match, regexpSave) val (regexp, saves) = case Regexp.fromString regexp of NONE => die () | SOME regexp => regexp val save = if 0 <= num andalso num < Vector.length saves then Vector.sub (saves, num) else die () val regexpC = compileDFA regexp fun doit s = Option.map (Compiled.matchAll (regexpC, s), fn match => Match.lookupString (match, save)) in data := SOME (str, doit) end end val outData : (string * (string -> string option)) option ref = ref NONE val setOutData = fn str => setData ("out", outData, str) val errData : (string * (string -> string option)) option ref = ref NONE val setErrData = fn str => setData ("err", errData, str) (* Set the stack limit to its max, since mlkit segfaults on some benchmarks * otherwise. *) val _ = let open MLton.Platform.OS in if host = Linux then let open MLton.Rlimit val {hard, ...} = get stackSize in set (stackSize, {hard = hard, soft = hard}) end else () end local open Popt in val res = parse {switches = args, opts = [("args", SpaceString (fn args => runArgs := String.tokens (args, Char.isSpace))), ("err", SpaceString setErrData), ("mlkit", None (fn () => pushCompiler {name = "ML-Kit", abbrv = "ML-Kit", test = kitCompile})), ("mosml", None (fn () => pushCompiler {name = "Moscow-ML", abbrv = "Moscow-ML", test = mosmlCompile})), ("mlton", SpaceString (fn arg => pushCompilers (makeMLton arg))), ("once", trueRef doOnce), ("out", SpaceString setOutData), ("poly", None (fn () => pushCompiler {name = "Poly/ML", abbrv = "Poly/ML", test = polyCompile})), ("smlnj", None (fn () => pushCompiler {name = "SML/NJ", abbrv = "SML/NJ", test = njCompile})), trace, ("wiki", trueRef doWiki)]} end in case res of Result.No msg => usage msg | Result.Yes benchmarks => let val compilers = List.rev (!compilers) val base = #name (hd compilers) val _ = let open MLton.Signal in setHandler (Pervasive.Posix.Signal.pipe, Handler.ignore) end fun r2s n r = Real.format (r, Real.Format.fix (SOME n)) val i2s = Int.toCommaString val p2s = i2s o Position.toInt val s2s = fn s => s val failures = ref [] fun show ({compiles, runs, sizes, errs, outs}, {showAll}) = let val out = Out.standard val _ = List.foreach (compilers, fn {name, abbrv, ...} => Out.output (out, concat [abbrv, " -- ", name, "\n"])) val _ = case !failures of [] => () | fs => Out.output (out, concat ["WARNING: ", base, " failed on: ", concat (List.separate (fs, ", ")), "\n"]) fun show (title, data: 'a data, toString, toStringHtml) = let val _ = Out.output (out, concat [title, "\n"]) val compilers = List.fold (compilers, [], fn ({name = n, abbrv = n', ...}, ac) => if showAll orelse (List.exists (data, fn {compiler = c, ...} => n = c)) then (n, n') :: ac else ac) val benchmarks = List.fold (benchmarks, [], fn (b, ac) => if showAll orelse List.exists (data, fn {bench, ...} => bench = b) then b :: ac else ac) fun rows toString = ("benchmark" :: List.revMap (compilers, fn (_, n') => n')) :: (List.revMap (benchmarks, fn b => b :: (List.revMap (compilers, fn (n, _) => case (List.peek (data, fn {bench = b', compiler = c', ...} => b = b' andalso n = c')) of NONE => "*" | SOME {value = v, ...} => toString v)))) open Justify val () = outputTable (table {columnHeads = NONE, justs = (Left :: List.revMap (compilers, fn _ => Right)), rows = rows toString}, out) fun prow ns = let fun p s = Out.output (out, s) in case ns of [] => raise Fail "bug" | b :: ns => (p "||" ; p b ; List.foreach (ns, fn n => (p "||"; p n)) ; p "||\n") end val _ = if not (!doWiki) then () else let val rows = rows toStringHtml in prow (hd rows) ; (List.foreach (tl rows, fn [] => raise Fail "bug" | b :: r => let val b = concat ["[attachment:", b, ".sml ", b, "]"] in prow (b :: r) end)) end in () end val bases = List.keepAll (runs, fn {compiler, ...} => compiler = base) val ratios = List.fold (runs, [], fn ({bench, compiler, value}, ac) => if compiler = base andalso not showAll then ac else {bench = bench, compiler = compiler, value = case List.peek (bases, fn {bench = b, ...} => bench = b) of NONE => ~1.0 | SOME {value = v, ...} => value / v} :: ac) val _ = show ("run time ratio", ratios, r2s 2, r2s 1) val _ = show ("size", sizes, p2s, p2s) val _ = show ("compile time", compiles, r2s 2, r2s 2) val _ = show ("run time", runs, r2s 2, r2s 2) val _ = case !outData of NONE => () | SOME (out, _) => show (concat ["out: ", out], outs, s2s, s2s) val _ = case !errData of NONE => () | SOME (err, _) => show (concat ["err: ", err], errs, s2s, s2s) in () end val totalFailures = ref [] val data = List.fold (benchmarks, {compiles = [], runs = [], sizes = [], outs = [], errs = []}, fn (bench, ac) => let val _ = File.withOut (batch bench, fn out => (File.outputContents (concat [bench, ".sml"], out) ; Out.output (out, concat ["val _ = Main.doit ", benchCount bench, "\n"]))) val foundOne = ref false val res = List.fold (compilers, ac, fn ({name, abbrv = _, test}, ac as {compiles: real data, runs: real data, sizes: Position.int data, outs: string data, errs: string data}) => if true then let (* val outTmpFile = File.tempName {prefix = "tmp", suffix = "out"} val errTmpFile = File.tempName {prefix = "tmp", suffix = "err"} *) val {compile, run, size} = ignoreOutput (fn () => test {bench = bench}) val _ = if name = base andalso Option.isNone run then List.push (failures, bench) else () (* val out = case !outData of NONE => NONE | SOME (_, doit) => File.foldLines (outTmpFile, NONE, fn (s, v) => let val s = String.removeTrailing (s, fn c => Char.equals (c, Char.newline)) in case doit s of NONE => v | v => v end) val err = case !errData of NONE => NONE | SOME (_, doit) => File.foldLines (errTmpFile, NONE, fn (s, v) => let val s = String.removeTrailing (s, fn c => Char.equals (c, Char.newline)) in case doit s of NONE => v | v => v end) val _ = File.remove outTmpFile val _ = File.remove errTmpFile *) val out = NONE val err = NONE fun add (v, ac) = case v of NONE => ac | SOME v => (foundOne := true ; {bench = bench, compiler = name, value = v} :: ac) val ac = {compiles = add (compile, compiles), runs = add (run, runs), sizes = add (size, sizes), outs = add (out, outs), errs = add (err, errs)} val _ = show (ac, {showAll = false}) val _ = Out.flush Out.standard in ac end else ac) val _ = if !foundOne then () else List.push (totalFailures, bench) in res end) val _ = show (data, {showAll = true}) val totalFailures = !totalFailures val _ = if List.isEmpty totalFailures then () else (print ("The following benchmarks failed completely.\n") ; List.foreach (totalFailures, fn s => print (concat [s, "\n"]))) in () end end val main = Process.makeMain main end mlton-20100608/benchmark/Makefile0000644000076600000240000000434111404435630015153 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## SRC := $(shell cd .. && pwd) BUILD := $(SRC)/build BIN := $(BUILD)/bin LIB := $(BUILD)/lib MLTON := mlton TARGET := self FLAGS := -target $(TARGET) \ -default-ann 'sequenceNonUnit warn' \ -default-ann 'warnUnused true' NAME := benchmark PATH := $(BIN):$(shell echo $$PATH) all: $(NAME) $(NAME): $(NAME).mlb $(shell PATH="$(BIN):$$PATH" && "$(MLTON)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' "$(MLTON)" $(FLAGS) $(NAME).mlb .PHONY: clean clean: ../bin/clean BENCH := barnes-hut boyer checksum count-graphs DLXSimulator fft fib flat-array hamlet imp-for knuth-bendix lexgen life logic mandelbrot matrix-multiply md5 merge mlyacc model-elimination mpuz nucleic output1 peek psdes-random ratio-regions ray raytrace simple smith-normal-form tailfib tak tensor tsp tyan vector-concat vector-rev vliw wc-input1 wc-scanStream zebra zern FPBENCH := barnes-hut fft hamlet mandelbrot matrix-multiply nucleic ray raytrace simple tensor tsp tyan vliw zern BFLAGS := -mlton "/usr/bin/mlton" -mlton "mlton -optimize-ssa {false,true}" BFLAGS := -wiki -mlton "/usr/bin/mlton" -mlkit -mosml -poly -smlnj BFLAGS := -mlton "$(BIN)/mlton" .PHONY: test test: $(NAME) cd tests && ../benchmark $(BFLAGS) $(BENCH) QBENCH := $(BENCH) QBFLAGS := -mlton "~/devel/mlton/mlton-20061119-1.x86-darwin/build/bin/mlton" QBFLAGS += -mlton "~/devel/mlton/mlton.svn.trunk/build/bin/mlton" # QBFLAGS += -mlton "~/devel/mlton/mlton.svn.trunk.inline/build/bin/mlton -drop-pass introduceLoops1 -drop-pass loopInvariant1 -inline-leafa-loops true -inline-leafa-repeat false -inline-leafa-size 20 -drop-pass inlineLeaf2" # QBFLAGS += -mlton "~/devel/mlton/mlton.svn.trunk.inline/build/bin/mlton -inline-leafa-loops true -inline-leafa-repeat true -inline-leafa-size 20 -inline-leafb-loops true -inline-leafb-repeat true -inline-leafb-size 40" QBFLAGS += -mlton "~/devel/mlton/mlton.svn.trunk.inline/build/bin/mlton" .PHONY: qtest qtest: $(NAME) cd tests && ../benchmark $(QBFLAGS) $(QBENCH) && $(MAKE) clean mlton-20100608/benchmark/sources.mlb0000644000076600000240000000042011404435630015664 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../lib/mlton/sources.mlb main.sml in structure Main end mlton-20100608/benchmark/tests/0000755000076600000240000000000011404470406014653 5ustar mtfstaffmlton-20100608/benchmark/tests/.ignore0000644000076600000240000000071311404435630016140 0ustar mtfstaff*.batch.sml *.dot *.mlton.sml *.ssa *.ui *.uo *.x86-linux DLXSimulator ML_dbase PM TEST a.out barnes-hut checksum chess.ppm count-graphs fft fib flint.core fxp hamlet hello imp-for knuth-bendix lexgen life logic mandelbrot matrix-multiply md5 merge mlmon.out mlyacc mpuz nucleic peek psdes-random ratio-regions ray raytrace run simple smith-normal-form tailfib tak tensor tmp* tsp tyan vector-concat vector-rev vliw wc-input1 wc-scanStream z z.sml zebra zern mlton-20100608/benchmark/tests/barnes-hut.sml0000644000076600000240000012056611404435630017452 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) (* vector-sig.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * The abstract interface of vectors and matrices in some dimension. *) signature VECTOR = sig type 'a vec val dim : int (* dimension of the vectors *) val tabulate : (int -> 'a) -> 'a vec val equal : real vec * real vec -> bool val zerov : real vec val addv : (real vec * real vec) -> real vec val subv : (real vec * real vec) -> real vec val dotvp : (real vec * real vec) -> real val crossvp : (real vec * real vec) -> real vec val addvs : (real vec * real) -> real vec val mulvs : (real vec * real) -> real vec val divvs : (real vec * real) -> real vec val mapv : ('a -> 'b) -> 'a vec -> 'b vec val map3v : (('a * 'b * 'c) -> 'd) -> ('a vec * 'b vec * 'c vec) -> 'd vec val foldv : ('a * 'b -> 'b) -> 'a vec -> 'b -> 'b val format : {lp : string, sep : string, rp : string, cvt : 'a -> string} -> 'a vec -> string val explode : 'a vec -> 'a list val implode : 'a list -> 'a vec type matrix (* matrices are always real valued *) val zerom : matrix val addm : (matrix * matrix) -> matrix val outvp : (real vec * real vec) -> matrix end (* space.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * The quad/oct-tree representation of space. *) signature SPACE = sig structure V : VECTOR datatype body = Body of { mass : real, pos : real V.vec ref, vel : real V.vec ref, acc : real V.vec ref, phi : real ref } datatype cell = BodyCell of body | Cell of node Array.array and node = Empty | Node of { mass : real ref, pos : real V.vec ref, cell : cell } datatype space = Space of { rmin : real V.vec, rsize : real, root : node } val nsub : int (* number of sub cells / cell (2 ^ V.dim) *) val putCell : (cell * int * node) -> unit val getCell : (cell * int) -> node val mkCell : unit -> cell val mkBodyNode : body -> node val mkCellNode : cell -> node val eqBody : body * body -> bool (* debugging code *) val dumpTree : node -> unit val prBody : body -> string val prNode : node -> string end; (* SPACE *) functor Space (V : VECTOR) : SPACE = struct structure V = V datatype body = Body of { mass : real, pos : real V.vec ref, vel : real V.vec ref, acc : real V.vec ref, phi : real ref } datatype cell = BodyCell of body | Cell of node Array.array and node = Empty | Node of { mass : real ref, pos : real V.vec ref, cell : cell } datatype space = Space of { rmin : real V.vec, rsize : real, root : node } fun eqBody(Body{mass,pos,vel,acc,phi}, Body{mass=m1,pos=p1,vel=v1,acc=a1,phi=h1}) = (Real.==(mass, m1) andalso Real.==(!phi, !h1) andalso V.equal(!pos, !p1) andalso V.equal(!vel, !v1) andalso V.equal(!acc, !a1)) (* number of sub cells per cell (2 ^ V.dim) *) val nsub = Word.toInt(Word.<<(0w1, Word.fromInt V.dim)) fun putCell (Cell a, i, nd) = Array.update(a, i, nd) fun getCell (Cell a, i) = Array.sub(a, i) fun mkCell () = Cell(Array.array(nsub, Empty)) fun mkBodyNode (body as Body{pos, mass, ...}) = Node{ cell = BodyCell body, mass = ref mass, pos = ref (!pos) } fun mkCellNode cell = Node{cell = cell, mass = ref 0.0, pos = ref V.zerov} (* debugging code *) local val rfmt = Real.toString val vfmt = V.format{lp="[", rp="]", sep=",", cvt = rfmt} in fun prBody (Body{mass, pos, vel, acc, phi}) = String.concat [ "B{m=", rfmt mass, ", p=", vfmt(!pos), ", v=", vfmt(!vel), ", a=", vfmt(!acc), ", phi=", rfmt(!phi), "}" ] fun prNode Empty = "Empty" | prNode (Node{mass, pos, cell}) = let val cell = (case cell of (Cell _) => "Cell" | (BodyCell b) => (*prBody b*) "Body" (* end case *)) in String.concat [ "N{m=", rfmt(!mass), ", p=", vfmt(!pos), cell, "}" ] end end fun dumpTree tree = let fun printf items = TextIO.output(TextIO.stdOut, String.concat items) fun indent i = StringCvt.padLeft #" " (i+1) "" fun dump (node, l) = let fun dump' (Node{cell=Cell a, ...}) = let fun dump'' i = (dump(Array.sub(a, i), l+1); dump''(i+1)) in (dump'' 0) handle _ => () end | dump' _ = () in printf [ StringCvt.padLeft #" " 2 (Int.toString l), indent l, prNode node, "\n" ]; dump' node end in dump (tree, 0) end end; (* Space *) (* load.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * Code to build the tree from a list of bodies. *) signature LOAD = sig structure S : SPACE structure V : VECTOR sharing S.V = V val makeTree : (S.body list * real V.vec * real) -> S.space end; (* LOAD *) functor Load (S : SPACE) : LOAD = struct structure S = S structure V = S.V exception NotIntCoord fun rshift (n, k) = Word.toInt(Word.~>>(Word.fromInt n, Word.fromInt k)) val IMAX = 0x20000000 (* 2^29 *) val IMAXrs1 = rshift(IMAX, 1) val rIMAX = real IMAX (* compute integerized coordinates. Raises the NotIntCoord exception, * if rp is out of bounds. *) fun intcoord (rp, rmin, rsize) = let val xsc = V.divvs (V.subv(rp, rmin), rsize) fun cvt x = if ((0.0 <= x) andalso (x < 1.0)) then floor(rIMAX * x) else raise NotIntCoord in V.mapv cvt xsc end (* determine which subcell to select. *) fun subindex (iv, l) = let fun aux (v, (i, k)) = if (Word.andb(Word.fromInt v, Word.fromInt l) <> 0w0) then (i + rshift(S.nsub, k+1), k+1) else (i, k+1) in #1 (V.foldv aux iv (0, 0)) end (* enlarge cubical "box", salvaging existing tree structure. *) fun expandBox (nd as S.Body{pos, ...}, box as S.Space{rmin, rsize, root}) = ( (intcoord (!pos, rmin, rsize); box) handle NotIntCoord => let val rmid = V.addvs (rmin, 0.5 * rsize) val rmin' = V.map3v (fn (x,y,z) => if x < y then z - rsize else z) (!pos, rmid, rmin) val rsize' = 2.0 * rsize fun mksub (v, r) = let val x = intcoord (v, rmin', rsize') val k = subindex (x, IMAXrs1) val cell = S.mkCell () in S.putCell (cell, k, r); cell end val box = (case root of S.Empty => S.Space{rmin=rmin', rsize=rsize', root=root} | _ => S.Space{ rmin = rmin', rsize = rsize', root = S.mkCellNode (mksub (rmid, root)) } (* end case *)) in expandBox (nd, box) end) (* insert a single node into the tree *) fun loadTree (body as S.Body{pos=posp, ...}, S.Space{rmin, rsize, root}) = let val xp = intcoord (!posp, rmin, rsize) fun insert (S.Empty, _) = S.mkBodyNode body | insert (n as S.Node{cell=S.BodyCell _, pos=posq, ...}, l) = let val xq = intcoord (!posq, rmin, rsize) val k = subindex (xq, l) val a = S.mkCell() in S.putCell(a, k, n); insert (S.mkCellNode a, l) end | insert (n as S.Node{cell, ...}, l) = let val k = subindex (xp, l) val subtree = insert (S.getCell (cell, k), rshift(l, 1)) in S.putCell (cell, k, subtree); n end in S.Space{rmin = rmin, rsize = rsize, root = insert (root, IMAXrs1)} end (* descend tree finding center-of-mass coordinates. *) fun hackCofM S.Empty = () | hackCofM (S.Node{cell = S.BodyCell _, ...}) = () | hackCofM (S.Node{cell = S.Cell subcells, mass, pos}) = let fun sumMass (i, totMass, cofm) = if (i < S.nsub) then (case Array.sub(subcells, i) of S.Empty => sumMass (i+1, totMass, cofm) | (nd as S.Node{mass, pos, ...}) => let val _ = hackCofM nd val m = !mass in sumMass (i+1, totMass + m, V.addv(cofm, V.mulvs(!pos, m))) end (* end case *)) else ( mass := totMass; pos := V.divvs(cofm, totMass)) in sumMass (0, 0.0, V.zerov) end (* initialize tree structure for hack force calculation. *) fun makeTree (bodies, rmin, rsize) = let fun build ([], space) = space | build ((body as S.Body{mass, ...}) :: r, space) = if Real.==(mass, 0.0) then build (r, space) else let val box = expandBox (body, space) val box = loadTree(body, box) in build (r, box) end val (space as S.Space{root, ...}) = build (bodies, S.Space{rmin=rmin, rsize=rsize, root=S.Empty}) in hackCofM root; space end end; (* functor Load *) (* grav.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * Gravity module for hierarchical N-body code; routines to compute gravity. *) signature GRAV = sig structure S : SPACE structure V : VECTOR sharing S.V = V val hackGrav : {body:S.body, root:S.node, rsize:real, tol:real, eps : real} -> {n2bterm:int, nbcterm:int, skipSelf:bool} end; (* GRAV *) functor Grav (S : SPACE) : GRAV = struct structure S = S structure V = S.V fun walk {acc0, phi0, pos0, pskip, eps, rsize, tol, root} = let val skipSelf = ref false val nbcterm = ref 0 and n2bterm = ref 0 val tolsq = (tol * tol) (* compute a single body-body or body-cell interaction. *) fun gravsub (S.Empty, phi0, acc0, _) = (phi0, acc0) | gravsub (p as S.Node{mass, pos, cell, ...}, phi0, acc0, memo) = let val (dr, drsq) = (case memo of NONE => let val dr = V.subv(!pos, pos0) in (dr, V.dotvp(dr, dr) + (eps*eps)) end | SOME(dr', drsq') => (dr', drsq' + (eps*eps)) (* end case *)) val phii = !mass / (Math.sqrt drsq) in case cell of (S.Cell _) => nbcterm := !nbcterm + 1 | _ => n2bterm := !n2bterm + 1 (* end case *); (phi0 - phii, V.addv(acc0, V.mulvs(dr, phii / drsq))) end (* gravsub *) (* recursive routine to do hackwalk operation. This combines the * subdivp and walksub routines from the C version. *) fun walksub (p, dsq, phi0, acc0) = ( (*print(implode[" walksub: dsq = ", makestring dsq, ", ", S.prNode p, "\n"]);*) case p of S.Empty => (phi0, acc0) | (S.Node{cell = S.BodyCell body, ...}) => if S.eqBody(body, pskip) then (skipSelf := true; (phi0, acc0)) else gravsub (p, phi0, acc0, NONE) | (S.Node{cell = S.Cell a, pos, ...}) => let val dr = V.subv(!pos, pos0) val drsq = V.dotvp(dr, dr) in if ((tolsq * drsq) < dsq) then let (* open p up *) fun loop (i, phi0, acc0) = if (i < S.nsub) then let val (phi0', acc0') = walksub ( Array.sub(a, i), dsq/4.0, phi0, acc0) in loop (i+1, phi0', acc0') end else (phi0, acc0) in loop (0, phi0, acc0) end else gravsub (p, phi0, acc0, SOME(dr, drsq)) end (* end case *)) val (phi0, acc0) = walksub (root, rsize*rsize, phi0, acc0) in { phi0 = phi0, acc0 = acc0, nbcterm = !nbcterm, n2bterm = !n2bterm, skip = !skipSelf } end (* walk *) (* evaluate grav field at a given particle. *) fun hackGrav {body as S.Body{pos, phi, acc, ...}, root, rsize, eps, tol} = let val {phi0, acc0, nbcterm, n2bterm, skip} = walk { acc0 = V.zerov, phi0 = 0.0, pos0 = !pos, pskip = body, eps = eps, rsize = rsize, tol = tol, root = root } in phi := phi0; acc := acc0; (** app (fn (fmt, items) => print(Format.format fmt items)) [ ("pos = [%f %f %f]\n", map Format.REAL (V.explode(!pos))), ("pos = [%f %f %f]\n", map Format.REAL (V.explode acc0)), ("phi = %f\n", [Format.REAL phi0]) ]; raise Fail ""; **) {nbcterm=nbcterm, n2bterm=n2bterm, skipSelf=skip} end (* hackgrav *) end; (* Grav *) (* data-io.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * I/O routines for export version of hierarchical N-body code. *) signature DATA_IO = sig structure S : SPACE val inputData : string -> { nbody : int, bodies : S.body list, tnow : real, headline : string } (* output routines *) val initOutput : { outfile : string, headline : string, nbody : int, tnow : real, dtime : real, eps : real, tol : real, dtout : real, tstop : real } -> unit val output : { nbody : int, bodies : S.body list, n2bcalc : int, nbccalc : int, selfint : int, tnow : real } -> unit val stopOutput : unit -> unit end; functor DataIO (S : SPACE) : DATA_IO = struct structure SS = Substring structure S = S structure V = S.V val atoi = valOf o Int.scan StringCvt.DEC SS.getc (* NOTE: this really out to be implemented using the lazy IO streams, * but SML/NJ doesn't implement these correctly yet. *) fun inputData fname = let val strm = TextIO.openIn fname val buf = ref(SS.full "") fun getLn () = (case (TextIO.inputLine strm) of NONE => raise Fail "inputData: EOF" | SOME s => buf := SS.full s (* end case *)) fun skipWS () = let val buf' = SS.dropl Char.isSpace (!buf) in if (SS.isEmpty buf') then (getLn(); skipWS()) else buf' end fun readInt () = let val (n, ss) = atoi (skipWS ()) in buf := ss; n end fun readReal () = let val (r, ss) = valOf (Real.scan SS.getc (skipWS())) in buf := ss; r end val nbody = readInt() val _ = if (nbody < 1) then raise Fail "absurd nbody" else () val ndim = readInt() val _ = if (ndim <> V.dim) then raise Fail "absurd ndim" else () val tnow = readReal() fun iter f = let fun loop (0, l) = l | loop (n, l) = loop (n-1, f() :: l) in fn n => loop (n, []) end fun readVec () = V.implode (rev (iter readReal ndim)) val massList = iter readReal nbody val posList = iter readVec nbody val velList = iter readVec nbody fun mkBodies ([], [], [], l) = l | mkBodies (m::r1, p::r2, v::r3, l) = let val b = S.Body{ mass = m, pos = ref p, vel = ref v, acc = ref V.zerov, phi = ref 0.0 } in mkBodies(r1, r2, r3, b::l) end in TextIO.closeIn strm; { nbody = nbody, bodies = mkBodies (massList, posList, velList, []), tnow = tnow, headline = concat["Hack code: input file ", fname, "\n"] } end local val timer = ref (Timer.startCPUTimer ()) in fun initTimer () = timer := Timer.startCPUTimer() fun cputime () = let val {usr, sys, ...} = Timer.checkCPUTimer(!timer) val totTim = usr in (Time.toReal totTim) / 60.0 end end type out_state = { tout : real, dtout : real, dtime : real, strm : TextIO.outstream } val outState = ref (NONE : out_state option) fun fprintf (strm, items) = TextIO.output(strm, String.concat items) fun printf items = fprintf(TextIO.stdOut, items) fun pad n s = StringCvt.padLeft #" " n s fun fmtInt (wid, i) = pad wid (Int.toString i) fun fmtReal (wid, prec, r) = pad wid (Real.fmt (StringCvt.FIX(SOME prec)) r) fun fmtRealE (wid, prec, r) = pad wid (Real.fmt (StringCvt.SCI(SOME prec)) r) local fun itemFmt r = fmtReal (9, 4, r) val fmt = V.format{lp="", sep="", rp="", cvt=itemFmt} in fun printvec (init, vec) = printf [ "\t ", pad 9 init, fmt vec, "\n" ] end (* local *) fun stopOutput () = (case (! outState) of NONE => () | (SOME{strm, ...}) => (TextIO.closeOut strm; outState := NONE) (* end case *)) fun initOutput {outfile, headline, nbody, tnow, dtime, eps, tol, dtout, tstop} = ( initTimer(); printf ["\n\t\t", headline, "\n\n"]; printf (map (pad 12) ["nbody", "dtime", "eps", "tol", "dtout", "tstop"]); printf ["\n"]; printf [fmtInt(12, nbody), fmtReal(12, 5, dtime)]; printf [ fmtInt(12, nbody), fmtReal(12, 5, dtime), fmtReal(12, 4, eps), fmtReal(12, 2, tol), fmtReal(12, 3, dtout), fmtReal(12, 2, tstop), "\n\n" ]; case outfile of "" => stopOutput() | _ => outState := SOME{ dtime = dtime, tout = tnow, dtout = dtout, strm = TextIO.openOut outfile } (* end case *)) (* compute set of dynamical diagnostics. *) fun diagnostics bodies = let fun loop ([], arg) = { mtot = #totM arg, (* total mass *) totKE = #totKE arg, (* total kinetic energy *) totPE = #totPE arg, (* total potential energy *) cOfMPos = #cOfMPos arg, (* center of mass: position *) cOfMVel = #cOfMVel arg, (* center of mass: velocity *) amVec = #amVec arg (* angular momentum vector *) } | loop (S.Body{ mass, pos=ref pos, vel=ref vel, acc=ref acc, phi=ref phi } :: r, arg) = let val velsq = V.dotvp(vel, vel) val halfMass = 0.5 * mass val posXmass = V.mulvs(pos, mass) in loop ( r, { totM = (#totM arg) + mass, totKE = (#totKE arg) + halfMass * velsq, totPE = (#totPE arg) + halfMass * phi, keTen = V.addm(#keTen arg, V.outvp(V.mulvs(vel, halfMass), vel)), peTen = V.addm(#peTen arg, V.outvp(posXmass, acc)), cOfMPos = V.addv(#cOfMPos arg, posXmass), cOfMVel = V.addv(#cOfMVel arg, V.mulvs(vel, mass)), amVec = V.addv(#amVec arg, V.mulvs(V.crossvp(pos, vel), mass)) }) end in loop (bodies, { totM = 0.0, totKE = 0.0, totPE = 0.0, keTen = V.zerom, peTen = V.zerom, cOfMPos = V.zerov, cOfMVel = V.zerov, amVec = V.zerov }) end (* diagnostics *) fun outputData (strm, tnow, nbody, bodies) = let fun outInt i = fprintf(strm, [" ", Int.toString i, "\n"]) fun outReal r = fprintf(strm, [" ", fmtRealE(21, 14, r), "\n"]) fun prReal r = fprintf(strm, [" ", fmtRealE(21, 14, r)]) fun outVec v = let fun out [] = TextIO.output(strm, "\n") | out (x::r) = (prReal x; out r) in out(V.explode v) end in outInt nbody; outInt V.dim; outReal tnow; app (fn (S.Body{mass, ...}) => outReal mass) bodies; app (fn (S.Body{pos, ...}) => outVec(!pos)) bodies; app (fn (S.Body{vel, ...}) => outVec(!vel)) bodies; printf ["\n\tparticle data written\n"] end; fun output {nbody, bodies, n2bcalc, nbccalc, selfint, tnow} = let val nttot = n2bcalc + nbccalc val nbavg = floor(real n2bcalc / real nbody) val ncavg = floor(real nbccalc / real nbody) val data = diagnostics bodies in printf ["\n"]; printf (map (pad 9) [ "tnow", "T+U", "T/U", "nttot", "nbavg", "ncavg", "selfint", "cputime" ]); printf ["\n"]; printf [ fmtReal(9, 3, tnow), fmtReal(9, 4, #totKE data + #totPE data), fmtReal(9, 4, #totKE data / #totPE data), fmtInt(9, nttot), fmtInt(9, nbavg), fmtInt(9, ncavg), fmtInt(9, selfint), fmtReal(9, 2, cputime()), "\n\n" ]; printvec ("cm pos", #cOfMPos data); printvec ("cm vel", #cOfMVel data); printvec ("am pos", #amVec data); case !outState of NONE => () | (SOME{tout, dtout, dtime, strm}) => if ((tout - 0.01 * dtime) <= tnow) then ( outputData (strm, tnow, nbody, bodies); outState := SOME{ tout=tout+dtout, dtout=dtout, dtime=dtime, strm=strm }) else () (* end case *) end end; (* DataIO *) (* getparam.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. *) structure GetParam : sig exception EOF val initParam : (string list * string list) -> unit val getParam : string -> string val getIParam : string -> int val getRParam : string -> real val getBParam : string -> bool end = struct exception EOF val defaults = ref ([] : string list) (* ignore arg vector, remember defaults. *) fun initParam (argv, defl) = defaults := defl fun prompt items = ( TextIO.output(TextIO.stdOut, String.concat items); TextIO.flushOut TextIO.stdOut) structure SS = Substring (* export version prompts user for value. *) fun getParam name = let fun scanBind [] = NONE | scanBind (s::r) = let val (_, suffix) = SS.position name (SS.full s) in if (SS.isEmpty suffix) then scanBind r else SOME(SS.string(SS.triml (size name+1) suffix)) end fun get default = (case (TextIO.inputLine TextIO.stdIn) of NONE => raise EOF | SOME "\n" => default | SOME s => substring(s, 0, size s - 1) (* end case *)) in if (null (! defaults)) then raise Fail "getParam called before initParam" else (); case (scanBind (! defaults)) of (SOME s) => ( prompt ["enter ", name, " [", s, "]: "]; get s) | NONE => (prompt ["enter ", name, ": "]; get "") (* end case *) end local fun cvt scanFn = let fun cvt' name = let fun get () = (case getParam name of "" => get () | s => s) val param = get () in (valOf (scanFn param)) handle _ => (cvt' name) end in cvt' end in (* get integer parameter *) val getIParam = cvt Int.fromString (* get real parameter *) val getRParam = cvt Real.fromString (* get bool parameter *) val getBParam = cvt Bool.fromString end (* local *) end; (* GetParam *) (* rand-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Signature for a simple random number generator. * *) signature RAND = sig val randMin : real val randMax : real val random : real -> real (* Given seed, return value randMin <= v <= randMax * Iteratively using the value returned by random as the * next seed to random will produce a sequence of pseudo-random * numbers. *) val mkRandom : real -> unit -> real (* Given seed, return function generating a sequence of * random numbers randMin <= v <= randMax *) val norm : real -> real (* r -> r / (randMax + 1.0) *) val range : (int * int) -> real -> int (* Map v, randMin <= v <= randMax to integer range [i,j] * Exception - * BadArg if j < i *) end (* RAND *) (* rand.sml * * COPYRIGHT (c) 1991 by AT&T Bell Laboratories. See COPYRIGHT file for details * * Random number generator taken from Paulson, pp. 170-171. * Recommended by Stephen K. Park and Keith W. Miller, * Random number generators: good ones are hard to find, * CACM 31 (1988), 1192-1201 * * Note: The Random structure provides a better generator. *) structure Rand : RAND = struct (* real number version for systems with 46-bit mantissas *) val a = 16807.0 and m = 2147483647.0 val randMin = 1.0 val randMax = m - 1.0 fun random seed = let val t = a*seed in t - m * real(floor(t/m)) end fun mkRandom seed = let val seed = ref seed in fn () => (seed := random (!seed); !seed) end fun norm r = r / m fun range (i,j) = if j < i then raise Fail "Rand.range" else let val R = real(j - i + 1) in fn r => i + floor(R*(r/m)) end handle _ => let val ri = real i val R = (real j)-ri+1.0 in fn r => floor(ri + R*(r/m)) end end (* Rand *) (* main.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * This is the main driver for the Barnse-HutN-body code. *) functor Main (V : VECTOR) : sig structure S : SPACE structure V : VECTOR structure L : LOAD val srand : int -> unit (* reset the random number generator *) val testdata : int -> S.body list (* generate the Plummer model data *) val go : { output : {n2bcalc:int, nbccalc:int, nstep:int, selfint:int, tnow:real} -> unit, bodies : S.body list, tnow : real, tstop : real, dtime : real, eps : real, tol : real, rmin : real V.vec, rsize : real } -> unit val doit : unit -> unit end = struct structure V = V structure S = Space(V) structure L = Load(S) structure G = Grav(S) structure DataIO = DataIO(S) (* some math utilities *) (** NOTE: these are part of the Math structure in the new basis *) val pi = 3.14159265358979323846 fun pow(x, y) = if Real.==(y, 0.0) then 1.0 else Math.exp (y * Math.ln x) (* random numbers *) local val seed = ref 0.0 in fun srand s = (seed := real s) fun xrand (xl, xh) = let val r = Rand.random (! seed) in seed := r; xl + (((xh - xl) * r) / 2147483647.0) end end (* local *) (* default parameter values *) val defaults = [ (* file names for input/output *) "in=", (* snapshot of initial conditions *) "out=", (* stream of output snapshots *) (* params, used if no input specified, to make a Plummer Model*) "nbody=128", (* number of particles to generate *) "seed=123", (* random number generator seed *) (* params to control N-body integration *) "dtime=0.025", (* integration time-step *) "eps=0.05", (* usual potential softening *) "tol=1.0", (* cell subdivision tolerence *) "fcells=0.75", (* cell allocation parameter *) "tstop=2.0", (* time to stop integration *) "dtout=0.25", (* data-output interval *) "debug=false", (* turn on debugging messages *) "VERSION=1.0" (* JEB 06 March 1988 *) ] (* pick a random point on a sphere of specified radius. *) fun pickshell rad = let fun pickvec () = let val vec = V.tabulate (fn _ => xrand(~1.0, 1.0)) val rsq = V.dotvp(vec, vec) in if (rsq > 1.0) then pickvec () else V.mulvs (vec, rad / Math.sqrt(rsq)) end in pickvec () end (* generate Plummer model initial conditions for test runs, scaled * to units such that M = -4E = G = 1 (Henon, Hegge, etc). * See Aarseth, SJ, Henon, M, & Wielen, R (1974) Astr & Ap, 37, 183. *) fun testdata n = let val mfrac = 0.999 (* mass cut off at mfrac of total *) val rn = real n val rsc = (3.0 * pi) / 16.0 val vsc = Math.sqrt(1.0 / rsc) fun mkBodies (0, cmr, cmv, l) = let (* offset bodies by normalized cm coordinates. Also, reverse * the list to get the same order of bodies as in the C version. *) val cmr = V.divvs(cmr, rn) val cmv = V.divvs(cmv, rn) fun norm ([], l) = l | norm ((p as S.Body{pos, vel, ...}) :: r, l) = ( pos := V.subv(!pos, cmr); vel := V.subv(!vel, cmv); norm (r, p::l)) in norm (l, []) end | mkBodies (i, cmr, cmv, l) = let val r = 1.0 / Math.sqrt (pow(xrand(0.0, mfrac), ~2.0/3.0) - 1.0) val pos = pickshell (rsc * r) fun vN () = let (* von Neumann technique *) val x = xrand(0.0,1.0) val y = xrand(0.0,0.1) in if (y > x*x * (pow (1.0-x*x, 3.5))) then vN () else x end val v = ((Math.sqrt 2.0) * vN()) / pow(1.0 + r*r, 0.25) val vel = pickshell (vsc * v) val body = S.Body{ mass = 1.0 / rn, pos = ref pos, vel = ref vel, acc = ref V.zerov, phi = ref 0.0 } in mkBodies (i-1, V.addv(cmr, pos), V.addv(cmv, vel), body :: l) end in mkBodies (n, V.zerov, V.zerov, []) end (* testdata *) (* startup hierarchical N-body code. This either reads in or generates * an initial set of bodies, and other parameters. *) fun startrun argv = let val _ = GetParam.initParam(argv, defaults) val {nbody, bodies, tnow, headline} = (case (GetParam.getParam "in") of "" => let val nbody = GetParam.getIParam "nbody" in if (nbody < 1) then raise Fail "startrun: absurd nbody" else (); srand (GetParam.getIParam "seed"); { nbody = nbody, bodies = testdata nbody, tnow = 0.0, headline = "Hack code: Plummer model" } end | fname => DataIO.inputData fname (* end case *)) in { nbody = nbody, bodies = bodies, headline = headline, outfile = GetParam.getParam "out", dtime = GetParam.getRParam "dtime", eps = GetParam.getRParam "eps", tol = GetParam.getRParam "tol", tnow = tnow, tstop = GetParam.getRParam "tstop", dtout = GetParam.getRParam "dtout", debug = GetParam.getBParam "debug", rmin = V.tabulate (fn _ => ~2.0), rsize = 4.0 } end (* advance N-body system one time-step. *) fun stepSystem output {plist, dtime, eps, nstep, rmin, rsize, tnow, tol} = let val dthf = 0.5 * dtime val S.Space{rmin, rsize, root} = L.makeTree (plist, rmin, rsize) (* recalculate accelaration *) fun recalc ([], n2bcalc, nbccalc, selfint) = (n2bcalc, nbccalc, selfint) | recalc (p::r, n2bcalc, nbccalc, selfint) = let val S.Body{acc as ref acc1, vel, ...} = p val {n2bterm, nbcterm, skipSelf} = G.hackGrav { body = p, root = root, rsize = rsize, eps = eps, tol = tol } in if (nstep > 0) then (* use change in accel to make 2nd order *) (* correction to vel. *) vel := V.addv(!vel, V.mulvs(V.subv(!acc, acc1), dthf)) else (); recalc (r, n2bcalc+n2bterm, nbccalc+nbcterm, if skipSelf then selfint else (selfint+1)) end (* advance bodies *) fun advance (S.Body{pos, acc, vel, ...}) = let val dvel = V.mulvs (!acc, dthf) val vel1 = V.addv (!vel, dvel) val dpos = V.mulvs (vel1, dtime) in pos := V.addv (!pos, dpos); vel := V.addv (vel1, dvel) end val (n2bcalc, nbccalc, selfint) = recalc (plist, 0, 0, 0) in output {nstep=nstep, tnow=tnow, n2bcalc=n2bcalc, nbccalc=nbccalc, selfint=selfint}; app advance plist; (nstep+1, tnow + dtime) end (* given an initial configuration, run the simulation *) fun go { output, bodies, tnow, tstop, dtime, eps, tol, rsize, rmin } = let val step = stepSystem output fun loop (nstep, tnow) = if (tnow < tstop + (0.1 * dtime)) then loop (step { plist = bodies, dtime = dtime, eps = eps, nstep = nstep, rmin = rmin, rsize = rsize, tnow = tnow, tol = tol }) else () in loop (0, tnow) end fun doit () = let val { nbody, bodies, headline, outfile, dtime, eps, tol, tnow, tstop, dtout, debug, rsize, rmin } = startrun [] fun output {nstep, tnow, n2bcalc, nbccalc, selfint} = DataIO.output{ bodies = bodies, nbody = nbody, n2bcalc = n2bcalc, nbccalc = nbccalc, selfint = selfint, tnow = tnow } in DataIO.initOutput { outfile = outfile, headline = headline, nbody = nbody, tnow = tnow, dtime = dtime, eps = eps, tol = tol, dtout = dtout, tstop = tstop }; go { output=output, bodies=bodies, tnow=tnow, tstop=tstop, dtime=dtime, eps=eps, tol=tol, rsize=rsize, rmin=rmin }; DataIO.stopOutput() end (* doit *) end; (* Main *) (* vector3.sml * * COPYRIGHT (c) 1993, AT&T Bell Laboratories. * * 3 dimensional vector arithmetic. *) structure Vector3 : VECTOR = struct type 'a vec = {x : 'a, y : 'a, z : 'a} type realvec = real vec val dim = 3 fun tabulate f = {x = f 0, y = f 1, z = f 2} val zerov = {x = 0.0, y = 0.0, z = 0.0} fun equal({x, y, z}, {x=x1, y=y1, z=z1}) = Real.==(x, x1) andalso Real.==(y, y1) andalso Real.==(z, z1) fun addv ({x=x1, y=y1, z=z1} : realvec, {x=x2, y=y2, z=z2}) = {x=x1+x2, y=y1+y2, z=z1+z2} fun subv ({x=x1, y=y1, z=z1} : realvec, {x=x2, y=y2, z=z2}) = {x=x1-x2, y=y1-y2, z=z1-z2} fun dotvp ({x=x1, y=y1, z=z1} : realvec, {x=x2, y=y2, z=z2}) = x1*x2 + y1*y2 + z1*z2 fun crossvp ({x=x1, y=y1, z=z1} : realvec, {x=x2, y=y2, z=z2}) = {x = y1*z2 - z1*y2, y = x1*z2 - z1*x2, z = x1*y2 - y1*x2} fun addvs ({x, y, z} : realvec, s) = {x=x+s, y=y+s, z=z+s} fun mulvs ({x, y, z} : realvec, s) = {x=x*s, y=y*s, z=z*s} fun divvs ({x, y, z} : realvec, s) = {x=x/s, y=y/s, z=z/s} fun mapv f {x, y, z} = {x = f x, y = f y, z = f z} fun map3v f ({x=x1, y=y1, z=z1}, {x=x2, y=y2, z=z2}, {x=x3, y=y3, z=z3}) = {x = f(x1, x2, x3), y = f(y1, y2, y3), z = f(z1, z2, z3)} fun foldv f {x, y, z} init = f(z, f(y, f(x, init))) fun format {lp, rp, sep, cvt} {x, y, z} = String.concat[ lp, cvt x, sep, cvt y, sep, cvt z, rp ] fun explode {x, y, z} = [x, y, z] fun implode [x, y, z] = {x=x, y=y, z=z} | implode _ = raise Fail "implode: bad dimension" type matrix = { m00 : real, m01 : real, m02 : real, m10 : real, m11 : real, m12 : real, m20 : real, m21 : real, m22 : real } val zerom = { m00 = 0.0, m01 = 0.0, m02 = 0.0, m10 = 0.0, m11 = 0.0, m12 = 0.0, m20 = 0.0, m21 = 0.0, m22 = 0.0 } fun addm (a : matrix, b : matrix) = { m00=(#m00 a + #m00 b), m01=(#m01 a + #m01 b), m02=(#m02 a + #m02 b), m10=(#m10 a + #m10 b), m11=(#m11 a + #m11 b), m12=(#m12 a + #m12 b), m20=(#m20 a + #m20 b), m21=(#m21 a + #m21 b), m22=(#m22 a + #m22 b) } fun outvp ({x=a0, y=a1, z=a2} : realvec, {x=b0, y=b1, z=b2}) = { m00=(a0*b0), m01=(a0*b1), m02=(a0*b2), m10=(a1*b0), m11=(a1*b1), m12=(a1*b2), m20=(a2*b0), m21=(a2*b1), m22=(a2*b2) } end (* VectMath *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* load file for bmark version *) (* app use [ "rand-sig.sml", "rand.sml", "vector-sig.sml", "space.sml", "load.sml", "grav.sml", "getparam.sml", "data-io.sml", "main.sml", "vector3.sml" ]; *) structure Main : BMARK = struct structure M3 = Main(Vector3); val name = "Barnes-Hut (3d)" fun testit strm = () fun doit n = ( M3.srand 123; M3.go { output = fn _ => (), bodies = M3.testdata n, tnow = 0.0, tstop = 2.0, dtime = 0.025, eps = 0.05, tol = 1.0, rmin = M3.S.V.tabulate (fn _ => ~2.0), rsize = 4.0 }) end; mlton-20100608/benchmark/tests/boyer.sml0000644000076600000240000006140111404435630016512 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) (* terms.sml: * * Manipulations over terms *) signature TERMS = sig type head; datatype term = Var of int | Prop of head * term list; datatype binding = Bind of int * term; val get: string -> head and headname: head -> string and add_lemma: term -> unit and apply_subst: binding list -> term -> term and rewrite: term -> term end; structure Terms:TERMS = struct datatype term = Var of int | Prop of { name: string, props: (term * term) list ref } * term list type head = { name: string, props: (term * term) list ref } val lemmas = ref ([] : head list) (* replacement for property lists *) fun headname {name = n, props=p} = n; fun get name = let fun get_rec ((hd1 as {name=n,...})::hdl) = if n = name then hd1 else get_rec hdl | get_rec [] = let val entry = {name = name, props = ref []} in lemmas := entry :: !lemmas; entry end in get_rec (!lemmas) end ; fun add_lemma (Prop(_, [(left as Prop({props=r,...},_)), right])) = r := (left, right) :: !r ; (* substitutions *) exception failure of string; datatype binding = Bind of int * term ; fun get_binding v = let fun get_rec [] = raise (failure "unbound") | get_rec (Bind(w,t)::rest) = if v = w then t else get_rec rest in get_rec end ; fun apply_subst alist = let fun as_rec (term as Var v) = ((get_binding v alist) handle failure _ => term) | as_rec (Prop (head,argl)) = Prop (head, map as_rec argl) in as_rec end ; exception Unify; fun unify (term1, term2) = unify1 (term1, term2, []) and unify1 (term1, term2, unify_subst) = (case term2 of Var v => ((if get_binding v unify_subst = term1 then unify_subst else raise Unify) handle failure _ => Bind(v,term1)::unify_subst) | Prop (head2,argl2) => case term1 of Var _ => raise Unify | Prop (head1,argl1) => if head1=head2 then unify1_lst (argl1, argl2, unify_subst) else raise Unify) and unify1_lst ([], [], unify_subst) = unify_subst | unify1_lst (h1::r1, h2::r2, unify_subst) = unify1_lst(r1, r2, unify1(h1, h2, unify_subst)) | unify1_lst _ = raise Unify ; fun rewrite (term as Var _) = term | rewrite (Prop ((head as {props=p,...}), argl)) = rewrite_with_lemmas (Prop (head, map rewrite argl), !p) and rewrite_with_lemmas (term, []) = term | rewrite_with_lemmas (term, (t1,t2)::rest) = rewrite (apply_subst (unify (term, t1)) t2) handle unify => rewrite_with_lemmas (term, rest) ; end; (* rules.sml: *) structure Rules = struct open Terms; datatype cterm = CVar of int | CProp of string * cterm list; fun cterm_to_term (CVar v) = Var v | cterm_to_term (CProp(p, l)) = Prop(get p, map cterm_to_term l) fun add t = add_lemma (cterm_to_term t) val _ = ( add (CProp ("equal", [CProp ("compile",[CVar 5]), CProp ("reverse", [CProp ("codegen",[CProp ("optimize",[CVar 5]), CProp ("nil",[])])])])); add (CProp ("equal", [CProp ("eqp",[CVar 23, CVar 24]), CProp ("equal",[CProp ("fix",[CVar 23]), CProp ("fix",[CVar 24])])])); add (CProp ("equal", [CProp ("gt",[CVar 23, CVar 24]), CProp ("lt",[CVar 24, CVar 23])])); add (CProp ("equal", [CProp ("le",[CVar 23, CVar 24]), CProp ("ge",[CVar 24, CVar 23])])); add (CProp ("equal", [CProp ("ge",[CVar 23, CVar 24]), CProp ("le",[CVar 24, CVar 23])])); add (CProp ("equal", [CProp ("boolean",[CVar 23]), CProp ("or", [CProp ("equal",[CVar 23, CProp ("true",[])]), CProp ("equal",[CVar 23, CProp ("false",[])])])])); add (CProp ("equal", [CProp ("iff",[CVar 23, CVar 24]), CProp ("and", [CProp ("implies",[CVar 23, CVar 24]), CProp ("implies",[CVar 24, CVar 23])])])); add (CProp ("equal", [CProp ("even1",[CVar 23]), CProp ("if", [CProp ("zerop",[CVar 23]), CProp ("true",[]), CProp ("odd",[CProp ("sub1",[CVar 23])])])])); add (CProp ("equal", [CProp ("countps_",[CVar 11, CVar 15]), CProp ("countps_loop",[CVar 11, CVar 15, CProp ("zero",[])])])); add (CProp ("equal", [CProp ("fact_",[CVar 8]), CProp ("fact_loop",[CVar 8, CProp ("one",[])])])); add (CProp ("equal", [CProp ("reverse_",[CVar 23]), CProp ("reverse_loop",[CVar 23, CProp ("nil",[])])])); add (CProp ("equal", [CProp ("divides",[CVar 23, CVar 24]), CProp ("zerop",[CProp ("remainder",[CVar 24, CVar 23])])])); add (CProp ("equal", [CProp ("assume_true",[CVar 21, CVar 0]), CProp ("cons",[CProp ("cons",[CVar 21, CProp ("true",[])]), CVar 0])])); add (CProp ("equal", [CProp ("assume_false",[CVar 21, CVar 0]), CProp ("cons",[CProp ("cons",[CVar 21, CProp ("false",[])]), CVar 0])])); add (CProp ("equal", [CProp ("tautology_checker",[CVar 23]), CProp ("tautologyp",[CProp ("normalize",[CVar 23]), CProp ("nil",[])])])); add (CProp ("equal", [CProp ("falsify",[CVar 23]), CProp ("falsify1",[CProp ("normalize",[CVar 23]), CProp ("nil",[])])])); add (CProp ("equal", [CProp ("prime",[CVar 23]), CProp ("and", [CProp ("not",[CProp ("zerop",[CVar 23])]), CProp ("not", [CProp ("equal",[CVar 23, CProp ("add1",[CProp ("zero",[])])])]), CProp ("prime1",[CVar 23, CProp ("sub1",[CVar 23])])])])); add (CProp ("equal", [CProp ("and",[CVar 15, CVar 16]), CProp ("if", [CVar 15, CProp ("if",[CVar 16, CProp ("true",[]), CProp ("false",[])]), CProp ("false",[])])])); add (CProp ("equal", [CProp ("or",[CVar 15, CVar 16]), CProp ("if", [CVar 15, CProp ("true",[]), CProp ("if",[CVar 16, CProp ("true",[]), CProp ("false",[])]), CProp ("false",[])])])); add (CProp ("equal", [CProp ("not",[CVar 15]), CProp ("if",[CVar 15, CProp ("false",[]), CProp ("true",[])])])); add (CProp ("equal", [CProp ("implies",[CVar 15, CVar 16]), CProp ("if", [CVar 15, CProp ("if",[CVar 16, CProp ("true",[]), CProp ("false",[])]), CProp ("true",[])])])); add (CProp ("equal", [CProp ("fix",[CVar 23]), CProp ("if",[CProp ("numberp",[CVar 23]), CVar 23, CProp ("zero",[])])])); add (CProp ("equal", [CProp ("if",[CProp ("if",[CVar 0, CVar 1, CVar 2]), CVar 3, CVar 4]), CProp ("if", [CVar 0, CProp ("if",[CVar 1, CVar 3, CVar 4]), CProp ("if",[CVar 2, CVar 3, CVar 4])])])); add (CProp ("equal", [CProp ("zerop",[CVar 23]), CProp ("or", [CProp ("equal",[CVar 23, CProp ("zero",[])]), CProp ("not",[CProp ("numberp",[CVar 23])])])])); add (CProp ("equal", [CProp ("plus",[CProp ("plus",[CVar 23, CVar 24]), CVar 25]), CProp ("plus",[CVar 23, CProp ("plus",[CVar 24, CVar 25])])])); add (CProp ("equal", [CProp ("equal",[CProp ("plus",[CVar 0, CVar 1]), CProp ("zero",[])]), CProp ("and",[CProp ("zerop",[CVar 0]), CProp ("zerop",[CVar 1])])])); add (CProp ("equal",[CProp ("difference",[CVar 23, CVar 23]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("equal", [CProp ("plus",[CVar 0, CVar 1]), CProp ("plus",[CVar 0, CVar 2])]), CProp ("equal",[CProp ("fix",[CVar 1]), CProp ("fix",[CVar 2])])])); add (CProp ("equal", [CProp ("equal",[CProp ("zero",[]), CProp ("difference",[CVar 23, CVar 24])]), CProp ("not",[CProp ("gt",[CVar 24, CVar 23])])])); add (CProp ("equal", [CProp ("equal",[CVar 23, CProp ("difference",[CVar 23, CVar 24])]), CProp ("and", [CProp ("numberp",[CVar 23]), CProp ("or", [CProp ("equal",[CVar 23, CProp ("zero",[])]), CProp ("zerop",[CVar 24])])])])); add (CProp ("equal", [CProp ("meaning", [CProp ("plus_tree",[CProp ("append",[CVar 23, CVar 24])]), CVar 0]), CProp ("plus", [CProp ("meaning",[CProp ("plus_tree",[CVar 23]), CVar 0]), CProp ("meaning",[CProp ("plus_tree",[CVar 24]), CVar 0])])])); add (CProp ("equal", [CProp ("meaning", [CProp ("plus_tree",[CProp ("plus_fringe",[CVar 23])]), CVar 0]), CProp ("fix",[CProp ("meaning",[CVar 23, CVar 0])])])); add (CProp ("equal", [CProp ("append",[CProp ("append",[CVar 23, CVar 24]), CVar 25]), CProp ("append",[CVar 23, CProp ("append",[CVar 24, CVar 25])])])); add (CProp ("equal", [CProp ("reverse",[CProp ("append",[CVar 0, CVar 1])]), CProp ("append",[CProp ("reverse",[CVar 1]), CProp ("reverse",[CVar 0])])])); add (CProp ("equal", [CProp ("times",[CVar 23, CProp ("plus",[CVar 24, CVar 25])]), CProp ("plus", [CProp ("times",[CVar 23, CVar 24]), CProp ("times",[CVar 23, CVar 25])])])); add (CProp ("equal", [CProp ("times",[CProp ("times",[CVar 23, CVar 24]), CVar 25]), CProp ("times",[CVar 23, CProp ("times",[CVar 24, CVar 25])])])); add (CProp ("equal", [CProp ("equal",[CProp ("times",[CVar 23, CVar 24]), CProp ("zero",[])]), CProp ("or",[CProp ("zerop",[CVar 23]), CProp ("zerop",[CVar 24])])])); add (CProp ("equal", [CProp ("exec",[CProp ("append",[CVar 23, CVar 24]), CVar 15, CVar 4]), CProp ("exec",[CVar 24, CProp ("exec",[CVar 23, CVar 15, CVar 4]), CVar 4])])); add (CProp ("equal", [CProp ("mc_flatten",[CVar 23, CVar 24]), CProp ("append",[CProp ("flatten",[CVar 23]), CVar 24])])); add (CProp ("equal", [CProp ("member",[CVar 23, CProp ("append",[CVar 0, CVar 1])]), CProp ("or", [CProp ("member",[CVar 23, CVar 0]), CProp ("member",[CVar 23, CVar 1])])])); add (CProp ("equal", [CProp ("member",[CVar 23, CProp ("reverse",[CVar 24])]), CProp ("member",[CVar 23, CVar 24])])); add (CProp ("equal", [CProp ("length",[CProp ("reverse",[CVar 23])]), CProp ("length",[CVar 23])])); add (CProp ("equal", [CProp ("member",[CVar 0, CProp ("intersect",[CVar 1, CVar 2])]), CProp ("and", [CProp ("member",[CVar 0, CVar 1]), CProp ("member",[CVar 0, CVar 2])])])); add (CProp ("equal",[CProp ("nth",[CProp ("zero",[]), CVar 8]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("exp",[CVar 8, CProp ("plus",[CVar 9, CVar 10])]), CProp ("times", [CProp ("exp",[CVar 8, CVar 9]), CProp ("exp",[CVar 8, CVar 10])])])); add (CProp ("equal", [CProp ("exp",[CVar 8, CProp ("times",[CVar 9, CVar 10])]), CProp ("exp",[CProp ("exp",[CVar 8, CVar 9]), CVar 10])])); add (CProp ("equal", [CProp ("reverse_loop",[CVar 23, CVar 24]), CProp ("append",[CProp ("reverse",[CVar 23]), CVar 24])])); add (CProp ("equal", [CProp ("reverse_loop",[CVar 23, CProp ("nil",[])]), CProp ("reverse",[CVar 23])])); add (CProp ("equal", [CProp ("count_list",[CVar 25, CProp ("sort_lp",[CVar 23, CVar 24])]), CProp ("plus", [CProp ("count_list",[CVar 25, CVar 23]), CProp ("count_list",[CVar 25, CVar 24])])])); add (CProp ("equal", [CProp ("equal", [CProp ("append",[CVar 0, CVar 1]), CProp ("append",[CVar 0, CVar 2])]), CProp ("equal",[CVar 1, CVar 2])])); add (CProp ("equal", [CProp ("plus", [CProp ("remainder",[CVar 23, CVar 24]), CProp ("times",[CVar 24, CProp ("quotient",[CVar 23, CVar 24])])]), CProp ("fix",[CVar 23])])); add (CProp ("equal", [CProp ("power_eval",[CProp ("big_plus",[CVar 11, CVar 8, CVar 1]), CVar 1]), CProp ("plus",[CProp ("power_eval",[CVar 11, CVar 1]), CVar 8])])); add (CProp ("equal", [CProp ("power_eval", [CProp ("big_plus",[CVar 23, CVar 24, CVar 8, CVar 1]), CVar 1]), CProp ("plus", [CVar 8, CProp ("plus", [CProp ("power_eval",[CVar 23, CVar 1]), CProp ("power_eval",[CVar 24, CVar 1])])])])); add (CProp ("equal", [CProp ("remainder",[CVar 24, CProp ("one",[])]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("lt",[CProp ("remainder",[CVar 23, CVar 24]), CVar 24]), CProp ("not",[CProp ("zerop",[CVar 24])])])); add (CProp ("equal",[CProp ("remainder",[CVar 23, CVar 23]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("lt",[CProp ("quotient",[CVar 8, CVar 9]), CVar 8]), CProp ("and", [CProp ("not",[CProp ("zerop",[CVar 8])]), CProp ("or", [CProp ("zerop",[CVar 9]), CProp ("not",[CProp ("equal",[CVar 9, CProp ("one",[])])])])])])); add (CProp ("equal", [CProp ("lt",[CProp ("remainder",[CVar 23, CVar 24]), CVar 23]), CProp ("and", [CProp ("not",[CProp ("zerop",[CVar 24])]), CProp ("not",[CProp ("zerop",[CVar 23])]), CProp ("not",[CProp ("lt",[CVar 23, CVar 24])])])])); add (CProp ("equal", [CProp ("power_eval",[CProp ("power_rep",[CVar 8, CVar 1]), CVar 1]), CProp ("fix",[CVar 8])])); add (CProp ("equal", [CProp ("power_eval", [CProp ("big_plus", [CProp ("power_rep",[CVar 8, CVar 1]), CProp ("power_rep",[CVar 9, CVar 1]), CProp ("zero",[]), CVar 1]), CVar 1]), CProp ("plus",[CVar 8, CVar 9])])); add (CProp ("equal", [CProp ("gcd",[CVar 23, CVar 24]), CProp ("gcd",[CVar 24, CVar 23])])); add (CProp ("equal", [CProp ("nth",[CProp ("append",[CVar 0, CVar 1]), CVar 8]), CProp ("append", [CProp ("nth",[CVar 0, CVar 8]), CProp ("nth", [CVar 1, CProp ("difference",[CVar 8, CProp ("length",[CVar 0])])])])])); add (CProp ("equal", [CProp ("difference",[CProp ("plus",[CVar 23, CVar 24]), CVar 23]), CProp ("fix",[CVar 24])])); add (CProp ("equal", [CProp ("difference",[CProp ("plus",[CVar 24, CVar 23]), CVar 23]), CProp ("fix",[CVar 24])])); add (CProp ("equal", [CProp ("difference", [CProp ("plus",[CVar 23, CVar 24]), CProp ("plus",[CVar 23, CVar 25])]), CProp ("difference",[CVar 24, CVar 25])])); add (CProp ("equal", [CProp ("times",[CVar 23, CProp ("difference",[CVar 2, CVar 22])]), CProp ("difference", [CProp ("times",[CVar 2, CVar 23]), CProp ("times",[CVar 22, CVar 23])])])); add (CProp ("equal", [CProp ("remainder",[CProp ("times",[CVar 23, CVar 25]), CVar 25]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("difference", [CProp ("plus",[CVar 1, CProp ("plus",[CVar 0, CVar 2])]), CVar 0]), CProp ("plus",[CVar 1, CVar 2])])); add (CProp ("equal", [CProp ("difference", [CProp ("add1",[CProp ("plus",[CVar 24, CVar 25])]), CVar 25]), CProp ("add1",[CVar 24])])); add (CProp ("equal", [CProp ("lt", [CProp ("plus",[CVar 23, CVar 24]), CProp ("plus",[CVar 23, CVar 25])]), CProp ("lt",[CVar 24, CVar 25])])); add (CProp ("equal", [CProp ("lt", [CProp ("times",[CVar 23, CVar 25]), CProp ("times",[CVar 24, CVar 25])]), CProp ("and", [CProp ("not",[CProp ("zerop",[CVar 25])]), CProp ("lt",[CVar 23, CVar 24])])])); add (CProp ("equal", [CProp ("lt",[CVar 24, CProp ("plus",[CVar 23, CVar 24])]), CProp ("not",[CProp ("zerop",[CVar 23])])])); add (CProp ("equal", [CProp ("gcd", [CProp ("times",[CVar 23, CVar 25]), CProp ("times",[CVar 24, CVar 25])]), CProp ("times",[CVar 25, CProp ("gcd",[CVar 23, CVar 24])])])); add (CProp ("equal", [CProp ("value",[CProp ("normalize",[CVar 23]), CVar 0]), CProp ("value",[CVar 23, CVar 0])])); add (CProp ("equal", [CProp ("equal", [CProp ("flatten",[CVar 23]), CProp ("cons",[CVar 24, CProp ("nil",[])])]), CProp ("and", [CProp ("nlistp",[CVar 23]), CProp ("equal",[CVar 23, CVar 24])])])); add (CProp ("equal", [CProp ("listp",[CProp ("gother",[CVar 23])]), CProp ("listp",[CVar 23])])); add (CProp ("equal", [CProp ("samefringe",[CVar 23, CVar 24]), CProp ("equal",[CProp ("flatten",[CVar 23]), CProp ("flatten",[CVar 24])])])); add (CProp ("equal", [CProp ("equal", [CProp ("greatest_factor",[CVar 23, CVar 24]), CProp ("zero",[])]), CProp ("and", [CProp ("or", [CProp ("zerop",[CVar 24]), CProp ("equal",[CVar 24, CProp ("one",[])])]), CProp ("equal",[CVar 23, CProp ("zero",[])])])])); add (CProp ("equal", [CProp ("equal", [CProp ("greatest_factor",[CVar 23, CVar 24]), CProp ("one",[])]), CProp ("equal",[CVar 23, CProp ("one",[])])])); add (CProp ("equal", [CProp ("numberp",[CProp ("greatest_factor",[CVar 23, CVar 24])]), CProp ("not", [CProp ("and", [CProp ("or", [CProp ("zerop",[CVar 24]), CProp ("equal",[CVar 24, CProp ("one",[])])]), CProp ("not",[CProp ("numberp",[CVar 23])])])])])); add (CProp ("equal", [CProp ("times_list",[CProp ("append",[CVar 23, CVar 24])]), CProp ("times", [CProp ("times_list",[CVar 23]), CProp ("times_list",[CVar 24])])])); add (CProp ("equal", [CProp ("prime_list",[CProp ("append",[CVar 23, CVar 24])]), CProp ("and", [CProp ("prime_list",[CVar 23]), CProp ("prime_list",[CVar 24])])])); add (CProp ("equal", [CProp ("equal",[CVar 25, CProp ("times",[CVar 22, CVar 25])]), CProp ("and", [CProp ("numberp",[CVar 25]), CProp ("or", [CProp ("equal",[CVar 25, CProp ("zero",[])]), CProp ("equal",[CVar 22, CProp ("one",[])])])])])); add (CProp ("equal", [CProp ("ge",[CVar 23, CVar 24]), CProp ("not",[CProp ("lt",[CVar 23, CVar 24])])])); add (CProp ("equal", [CProp ("equal",[CVar 23, CProp ("times",[CVar 23, CVar 24])]), CProp ("or", [CProp ("equal",[CVar 23, CProp ("zero",[])]), CProp ("and", [CProp ("numberp",[CVar 23]), CProp ("equal",[CVar 24, CProp ("one",[])])])])])); add (CProp ("equal", [CProp ("remainder",[CProp ("times",[CVar 24, CVar 23]), CVar 24]), CProp ("zero",[])])); add (CProp ("equal", [CProp ("equal",[CProp ("times",[CVar 0, CVar 1]), CProp ("one",[])]), CProp ("and", [CProp ("not",[CProp ("equal",[CVar 0, CProp ("zero",[])])]), CProp ("not",[CProp ("equal",[CVar 1, CProp ("zero",[])])]), CProp ("numberp",[CVar 0]), CProp ("numberp",[CVar 1]), CProp ("equal",[CProp ("sub1",[CVar 0]), CProp ("zero",[])]), CProp ("equal",[CProp ("sub1",[CVar 1]), CProp ("zero",[])])])])); add (CProp ("equal", [CProp ("lt", [CProp ("length",[CProp ("delete",[CVar 23, CVar 11])]), CProp ("length",[CVar 11])]), CProp ("member",[CVar 23, CVar 11])])); add (CProp ("equal", [CProp ("sort2",[CProp ("delete",[CVar 23, CVar 11])]), CProp ("delete",[CVar 23, CProp ("sort2",[CVar 11])])])); add (CProp ("equal",[CProp ("dsort",[CVar 23]), CProp ("sort2",[CVar 23])])); add (CProp ("equal", [CProp ("length", [CProp ("cons", [CVar 0, CProp ("cons", [CVar 1, CProp ("cons", [CVar 2, CProp ("cons", [CVar 3, CProp ("cons",[CVar 4, CProp ("cons",[CVar 5, CVar 6])])])])])])]) , CProp ("plus",[CProp ("six",[]), CProp ("length",[CVar 6])])])); add (CProp ("equal", [CProp ("difference", [CProp ("add1",[CProp ("add1",[CVar 23])]), CProp ("two",[])]), CProp ("fix",[CVar 23])])); add (CProp ("equal", [CProp ("quotient", [CProp ("plus",[CVar 23, CProp ("plus",[CVar 23, CVar 24])]), CProp ("two",[])]), CProp ("plus",[CVar 23, CProp ("quotient",[CVar 24, CProp ("two",[])])])])); add (CProp ("equal", [CProp ("sigma",[CProp ("zero",[]), CVar 8]), CProp ("quotient", [CProp ("times",[CVar 8, CProp ("add1",[CVar 8])]), CProp ("two",[])])])); add (CProp ("equal", [CProp ("plus",[CVar 23, CProp ("add1",[CVar 24])]), CProp ("if", [CProp ("numberp",[CVar 24]), CProp ("add1",[CProp ("plus",[CVar 23, CVar 24])]), CProp ("add1",[CVar 23])])])); add (CProp ("equal", [CProp ("equal", [CProp ("difference",[CVar 23, CVar 24]), CProp ("difference",[CVar 25, CVar 24])]), CProp ("if", [CProp ("lt",[CVar 23, CVar 24]), CProp ("not",[CProp ("lt",[CVar 24, CVar 25])]), CProp ("if", [CProp ("lt",[CVar 25, CVar 24]), CProp ("not",[CProp ("lt",[CVar 24, CVar 23])]), CProp ("equal",[CProp ("fix",[CVar 23]), CProp ("fix",[CVar 25])])])])]) ); add (CProp ("equal", [CProp ("meaning", [CProp ("plus_tree",[CProp ("delete",[CVar 23, CVar 24])]), CVar 0]), CProp ("if", [CProp ("member",[CVar 23, CVar 24]), CProp ("difference", [CProp ("meaning",[CProp ("plus_tree",[CVar 24]), CVar 0]), CProp ("meaning",[CVar 23, CVar 0])]), CProp ("meaning",[CProp ("plus_tree",[CVar 24]), CVar 0])])])); add (CProp ("equal", [CProp ("times",[CVar 23, CProp ("add1",[CVar 24])]), CProp ("if", [CProp ("numberp",[CVar 24]), CProp ("plus", [CVar 23, CProp ("times",[CVar 23, CVar 24]), CProp ("fix",[CVar 23])])])])); add (CProp ("equal", [CProp ("nth",[CProp ("nil",[]), CVar 8]), CProp ("if",[CProp ("zerop",[CVar 8]), CProp ("nil",[]), CProp ("zero",[])])])); add (CProp ("equal", [CProp ("last",[CProp ("append",[CVar 0, CVar 1])]), CProp ("if", [CProp ("listp",[CVar 1]), CProp ("last",[CVar 1]), CProp ("if", [CProp ("listp",[CVar 0]), CProp ("cons",[CProp ("car",[CProp ("last",[CVar 0])]), CVar 1]), CVar 1])])])); add (CProp ("equal", [CProp ("equal",[CProp ("lt",[CVar 23, CVar 24]), CVar 25]), CProp ("if", [CProp ("lt",[CVar 23, CVar 24]), CProp ("equal",[CProp ("true",[]), CVar 25]), CProp ("equal",[CProp ("false",[]), CVar 25])])])); add (CProp ("equal", [CProp ("assignment",[CVar 23, CProp ("append",[CVar 0, CVar 1])]), CProp ("if", [CProp ("assignedp",[CVar 23, CVar 0]), CProp ("assignment",[CVar 23, CVar 0]), CProp ("assignment",[CVar 23, CVar 1])])])); add (CProp ("equal", [CProp ("car",[CProp ("gother",[CVar 23])]), CProp ("if", [CProp ("listp",[CVar 23]), CProp ("car",[CProp ("flatten",[CVar 23])]), CProp ("zero",[])])])); add (CProp ("equal", [CProp ("flatten",[CProp ("cdr",[CProp ("gother",[CVar 23])])]), CProp ("if", [CProp ("listp",[CVar 23]), CProp ("cdr",[CProp ("flatten",[CVar 23])]), CProp ("cons",[CProp ("zero",[]), CProp ("nil",[])])])])); add (CProp ("equal", [CProp ("quotient",[CProp ("times",[CVar 24, CVar 23]), CVar 24]), CProp ("if", [CProp ("zerop",[CVar 24]), CProp ("zero",[]), CProp ("fix",[CVar 23])])])); add (CProp ("equal", [CProp ("get",[CVar 9, CProp ("set",[CVar 8, CVar 21, CVar 12])]), CProp ("if", [CProp ("eqp",[CVar 9, CVar 8]), CVar 21, CProp ("get",[CVar 9, CVar 12])])]))) end; (* Rules *) (* boyer.sml: * * Tautology checker *) signature BOYER = sig include TERMS val tautp: term -> bool end structure Boyer: BOYER = struct open Terms fun mem x [] = false | mem x (y::L) = x=y orelse mem x L fun truep (x, lst) = case x of Prop(head, _) => headname head = "true" orelse mem x lst | _ => mem x lst and falsep (x, lst) = case x of Prop(head, _) => headname head = "false" orelse mem x lst | _ => mem x lst fun tautologyp (x, true_lst, false_lst) = if truep (x, true_lst) then true else if falsep (x, false_lst) then false else (case x of Var _ => false | Prop (head,[test, yes, no]) => if headname head = "if" then if truep (test, true_lst) then tautologyp (yes, true_lst, false_lst) else if falsep (test, false_lst) then tautologyp (no, true_lst, false_lst) else tautologyp (yes, test::true_lst, false_lst) andalso tautologyp (no, true_lst, test::false_lst) else false) fun tautp x = tautologyp(rewrite x, [], []); end; (* Boyer *) signature BMARK = sig val doit : unit -> unit val testit : TextIO.outstream -> unit end; (* the benchmark *) structure Main : BMARK = struct open Terms; open Boyer; val subst = [Bind(23, Prop (get "f", [Prop (get "plus", [Prop (get "plus",[Var 0, Var 1]), Prop (get "plus",[Var 2, Prop (get "zero",[])])])])), Bind(24, Prop (get "f", [Prop (get "times", [Prop (get "times",[Var 0, Var 1]), Prop (get "plus",[Var 2, Var 3])])])), Bind(25, Prop (get "f", [Prop (get "reverse", [Prop (get "append", [Prop (get "append",[Var 0, Var 1]), Prop (get "nil",[])])])])), Bind(20, Prop (get "equal", [Prop (get "plus",[Var 0, Var 1]), Prop (get "difference",[Var 23, Var 24])])), Bind(22, Prop (get "lt", [Prop (get "remainder",[Var 0, Var 1]), Prop (get "member",[Var 0, Prop (get "length",[Var 1])])]))] val term = Prop (get "implies", [Prop (get "and", [Prop (get "implies",[Var 23, Var 24]), Prop (get "and", [Prop (get "implies",[Var 24, Var 25]), Prop (get "and", [Prop (get "implies",[Var 25, Var 20]), Prop (get "implies",[Var 20, Var 22])])])]), Prop (get "implies",[Var 23, Var 22])]) fun testit outstrm = if tautp (apply_subst subst term) then TextIO.output (outstrm, "Proved!\n") else TextIO.output (outstrm, "Cannot prove!\n") fun doit () = (tautp (apply_subst subst term); ()) end; (* Main *) structure Main = struct val doit = fn n => let fun loop n = if n = 0 then () else (Main.doit (); loop(n-1)) in loop n end end; mlton-20100608/benchmark/tests/checksum.sml0000644000076600000240000000215711404435630017177 0ustar mtfstaff(* Author: sweeks@sweeks.com * This code is based on the following paper. * The Performance of FoxNet 2.0 * Herb Derby * CMU-CS-99-137 * June 1999 *) fun checkOne (new, ac) = let open Word32 in ac + >> (new, 0w16) + andb (new, 0wxFFFF) end fun fold f b (buf, first, last) = let fun loop (i, ac) = if i > last then ac else loop (i + 1, f (Word32.fromLarge (PackWord32Little.subArr (buf, i)), ac)) in loop (first, b) end fun checksum buf = fold checkOne 0w0 buf structure Main = struct fun doit n = let val first = 0 val size = 10000000 val buf = Word8Array.array (size, 0w0) val bytesPerWord = 4 val last = size div bytesPerWord - 1 val rec loop = fn 0 => () | n => let val w = checksum (buf, first, last) val _ = if w <> 0w0 then raise Fail "bug" else () in loop (n - 1) end in loop n end end mlton-20100608/benchmark/tests/count-graphs.sml0000644000076600000240000005602311404435630020010 0ustar mtfstaff(* Written by Henry Cejtin (henry@sourcelight.com). *) fun print _ = () (* * My favorite high-order procedure. *) fun fold (lst, folder, state) = let fun loop (lst, state) = case lst of [] => state | first::rest => loop (rest, folder (first, state)) in loop (lst, state) end fun naturalFold (limit, folder, state) = if limit < 0 then raise Domain else let fun loop (i, state) = if i = limit then state else loop (i+1, folder (i, state)) in loop (0, state) end fun naturalAny (limit, ok) = if limit < 0 then raise Domain else let fun loop i = i <> limit andalso (ok i orelse loop (i+1)) in loop 0 end fun naturalAll (limit, ok) = if limit < 0 then raise Domain else let fun loop i = i = limit orelse (ok i andalso loop (i+1)) in loop 0 end (* * Fold over all permutations. * Universe is a list of all the items to be permuted. * pFolder is used to build up the permutation. It is called via * pFolder (next, pState, state, accross) * where next is the next item in the permutation, pState is the * partially constructed permutation and state is the current fold * state over permutations that have already been considered. * If pFolder knows what will result from folding over all permutations * descending from the resulting partial permutation (starting at state), * it should raise the accross exception carrying the new state value. * If pFolder wants to continue building up the permutation, it should * return (newPState, newState). * When a permutation has been completely constructed, folder is called * via * folder (pState, state) * where pState is the final pState and state is the current state. * It should return the new state. *) fun 'a foldOverPermutations (universe, pFolder, pState, folder, state: 'a) = let exception accross of 'a fun outer (universe, pState, state) = case universe of [] => folder (pState, state) | first::rest => let fun inner (first, rest, revOut, state) = let val state = let val (newPState, state) = pFolder (first, pState, state, accross) in outer (fold (revOut, op ::, rest), newPState, state) end handle accross state => state in case rest of [] => state | second::rest => inner (second, rest, first::revOut, state) end in inner (first, rest, [], state) end in outer (universe, pState, state) end (* * Fold over all arrangements of bag elements. * Universe is a list of lists of items, with equivalent items in the * same list. * pFolder is used to build up the permutation. It is called via * pFolder (next, pState, state, accross) * where next is the next item in the permutation, pState is the * partially constructed permutation and state is the current fold * state over permutations that have already been considered. * If pFolder knows what will result from folding over all permutations * descending from the resulting partial permutation (starting at state), * it should raise the accross exception carrying the new state value. * If pFolder wants to continue building up the permutation, it should * return (newPState, newState). * When a permutation has been completely constructed, folder is called * via * folder (pState, state) * where pState is the final pState and state is the current state. * It should return the new state. *) fun 'a foldOverBagPerms (universe, pFolder, pState, folder, state: 'a) = let exception accross of 'a fun outer (universe, pState, state) = case universe of [] => folder (pState, state) | (fbag as (first::fclone))::rest => let fun inner (fbag, first, fclone, rest, revOut, state) = let val state = let val (newPState, state) = pFolder (first, pState, state, accross) in outer (fold (revOut, op ::, case fclone of [] => rest | _ => fclone::rest), newPState, state) end handle accross state => state in case rest of [] => state | (sbag as (second::sclone))::rest => inner (sbag, second, sclone, rest, fbag::revOut, state) end in inner (fbag, first, fclone, rest, [], state) end in outer (universe, pState, state) end (* * Fold over the tree of subsets of the elements of universe. * The tree structure comes from the root picking if the first element * is in the subset, etc. * eFolder is called to build up the subset given a decision on wether * or not a given element is in it or not. It is called via * eFolder (elem, isinc, eState, state, fini) * If this determines the result of folding over all the subsets consistant * with the choice so far, then eFolder should raise the exception * fini newState * If we need to proceed deeper in the tree, then eFolder should return * the tuple * (newEState, newState) * folder is called to buld up the final state, folding over subsets * (represented as the terminal eStates). It is called via * folder (eState, state) * It returns the new state. * Note, the order in which elements are folded (via eFolder) is the same * as the order in universe. *) fun 'a foldOverSubsets (universe, eFolder, eState, folder, state: 'a) = let exception fini of 'a fun f (first, rest, eState) (isinc, state) = let val (newEState, newState) = eFolder (first, isinc, eState, state, fini) in outer (rest, newEState, newState) end handle fini state => state and outer (universe, eState, state) = case universe of [] => folder (eState, state) | first::rest => let val f = f (first, rest, eState) in f (false, f (true, state)) end in outer (universe, eState, state) end fun f universe = foldOverSubsets (universe, fn (elem, isinc, set, state, _) => (if isinc then elem::set else set, state), [], fn (set, sets) => set::sets, []) (* * Given a partitioning of [0, size) into equivalence classes (as a list * of the classes, where each class is a list of integers), and where two * vertices are equivalent iff transposing the two is an automorphism * of the full subgraph on the vertices [0, size), return the equivalence * classes for the graph. The graph is provided as a connection function. * In the result, two equivalent vertices in [0, size) remain equivalent * iff they are either both connected or neither is connected to size. * The vertex size is equivalent to a vertex x in [0, size) iff * connected (size, y) = connected (x, if y = x then size else y) * for all y in [0, size). *) fun refine (size: int, classes: int list list, connected: int*int -> bool): int list list = let fun sizeMatch x = (* Check if vertex size is equivalent to vertex x. *) naturalAll (size, fn y => connected (size, y) = connected (x, if y = x then size else y)) fun merge (class, (merged, classes)) = (* Add class into classes, testing if size should be merged. *) if merged then (true, (rev class)::classes) else let val first::_ = class in if sizeMatch first then (true, fold (class, op ::, [size])::classes) else (false, (rev class)::classes) end fun split (elem, (yes, no)) = if connected (elem, size) then (elem::yes, no) else (yes, elem::no) fun subdivide (class, state) = case class of [first] => merge (class, state) | _ => case fold (class, split, ([], [])) of ([], no) => merge (no, state) | (yes, []) => merge (yes, state) | (yes, no) => merge (no, merge (yes, state)) in case fold (classes, subdivide, (false, [])) of (true, classes) => rev classes | (false, classes) => fold (classes, op ::, [[size]]) end (* * Given a count of the number of vertices, a partitioning of the vertices * into equivalence classes (where two vertices are equivalent iff * transposing them is a graph automorphism), and a function which, given * two distinct vertices, returns a bool indicating if there is an edge * connecting them, check if the graph is minimal. * If it is, return * SOME how-many-clones-we-walked-through * If not, return NONE. * A graph is minimal iff its connection matrix is (weakly) smaller * then all its permuted friends, where true is less than false, and * the entries are compared lexicographically in the following order: * - * 0 - * 1 2 - * 3 4 5 - * ... * Note, the vertices are the integers in [0, nverts). *) fun minimal (nverts: int, classes: int list list, connected: int*int -> bool): int option = let val perm = Array.array (nverts, ~1) exception fini fun pFolder (new, old, state, accross) = let fun loop v = if v = old then (Array.update (perm, old, new); (old + 1, state)) else case (connected (old, v), connected (new, Array.sub (perm, v))) of (true, false) => raise (accross state) | (false, true) => raise fini | _ => loop (v + 1) in loop 0 end fun folder (_, state) = state + 1 in SOME (foldOverBagPerms ( classes, pFolder, 0, folder, 0)) handle fini => NONE end (* * Fold over the tree of graphs. * * eFolder is used to fold over the choice of edges via * eFolder (from, to, isinc, eState, state, accross) * with from > to. * * If eFolder knows the result of folding over all graphs which agree * with the currently made decisions, then it should raise the accross * exception carrying the resulting state as a value. * * To continue normally, it should return the tuple * (newEState, newState) * * When all decisions are made with regards to edges from `from', folder * is called via * folder (size, eState, state, accross) * where size is the number of vertices in the graph (the last from+1) and * eState is the final eState for edges from `from'. * * If folder knows the result of folding over all extensions of this graph, * it should raise accross carrying the resulting state as a value. * * If extensions of this graph should be folded over, it should return * the new state. *) fun ('a, 'b) foldOverGraphs (eFolder, eState: 'a, folder, state: 'b) = let exception noextend of 'b fun makeVertss limit = Vector.tabulate (limit, fn nverts => List.tabulate (nverts, fn v => v)) val vertss = ref (makeVertss 0) fun findVerts size = ( if size >= Vector.length (!vertss) then vertss := makeVertss (size + 1) else (); Vector.sub (!vertss, size)) fun f (size, eState, state) = let val state = folder (size, eState, state, noextend) in g (size+1, state) end handle noextend state => state and g (size, state) = let val indices = findVerts (size - 1) fun SeFolder (to, isinc, eState, state, accross) = eFolder (size-1, to, isinc, eState, state, accross) fun Sf (eState, state) = f (size, eState, state) in foldOverSubsets ( indices, SeFolder, eState, Sf, state) end in f (0, eState, state) end (* * Given the size of a graph, a list of the vertices (the integers in * [0, size)), and the connected function, check if for all full subgraphs, * 3*V - 4 - 2*E >= 0 or V <= 1 * where V is the number of vertices and E is the number of edges. *) local fun short lst = case lst of [] => true | [_] => true | _ => false in fun okSoFar (size, verts, connected) = let exception fini of unit fun eFolder (elem, isinc, eState as (ac, picked), _, accross) = (if isinc then (fold (picked, fn (p, ac) => if connected (elem, p) then ac - 2 else ac, ac + 3), elem::picked) else eState, ()) fun folder ((ac, picked), state) = if ac >= 0 orelse short picked then state else raise (fini ()) in (foldOverSubsets ( verts, eFolder, (~4, []), folder, ()); true) handle fini () => false end end fun showGraph (size, connected) = naturalFold (size, fn (from, _) => ( print ((Int.toString from) ^ ":"); naturalFold (size, fn (to, _) => if from <> to andalso connected (from, to) then print (" " ^ (Int.toString to)) else (), ()); print "\n"), ()); fun showList (start, sep, stop, trans) lst = ( start (); case lst of [] => () | first::rest => ( trans first; fold (rest, fn (item, _) => ( sep (); trans item), ())); stop ()) val showIntList = showList ( fn () => print "[", fn () => print ", ", fn () => print "]", fn i => print (Int.toString i)) val showIntListList = showList ( fn () => print "[", fn () => print ", ", fn () => print "]", showIntList) fun h (maxSize, folder, state) = let val ctab = Array.tabulate (maxSize, fn v => Array.array (v, false)) val classesv = Array.array (maxSize+1, []) fun connected (from, to) = let val (from, to) = if from > to then (from, to) else (to, from) in Array.sub (Array.sub (ctab, from), to) end fun update (from, to, value) = let val (from, to) = if from > to then (from, to) else (to, from) in Array.update (Array.sub (ctab, from), to, value) end fun triangle (vnum, e) = naturalAny (e, fn f => connected (vnum, f) andalso connected (e, f)) fun eFolder (from, to, isinc, _, state, accross) = if isinc andalso triangle (from, to) then raise (accross state) else ( update (from, to, isinc); ((), state)) fun Gfolder (size, _, state, accross) = ( if size <> 0 then Array.update (classesv, size, refine (size-1, Array.sub (classesv, size-1), connected)) else (); case minimal (size, Array.sub (classesv, size), connected) of NONE => raise (accross state) | SOME eatMe => if okSoFar (size, List.tabulate (size, fn v => v), connected) then let val state = folder (size, connected, state) in if size = maxSize then raise (accross state) else state end else raise (accross state)) in foldOverGraphs (eFolder, (), Gfolder, state) end local fun final (size: int, connected: int * int -> bool): int = naturalFold (size, fn (from, ac) => naturalFold (from, fn (to, ac) => if connected (from, to) then ac - 2 else ac, ac), 3*size - 4) in fun f maxSize = h (maxSize, fn (size, connected, state) => if final (size, connected) = 0 then state + 1 else state, 0) end fun doOne arg = ( print (arg ^ " -> "); case Int.fromString arg of SOME n => print ((Int.toString (f n)) ^ "\n") | NONE => print "NOT A NUMBER\n") structure Main = struct fun doit() = List.app doOne ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"] val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end mlton-20100608/benchmark/tests/DATA/0000755000076600000240000000000011404470406015364 5ustar mtfstaffmlton-20100608/benchmark/tests/DATA/.ignore0000644000076600000240000000005511404435627016656 0ustar mtfstaffml.grm.sig ml.grm.sml ml.lex.sml tmp.s cmp.s mlton-20100608/benchmark/tests/DATA/chess.gml0000644000076600000240000001666311404435627017214 0ustar mtfstaff% chess.gml % % OUTPUTS: chess.ppm % %%% %%% Author: %%% Leif Kornstaedt %%% %%% Copyright: %%% Leif Kornstaedt, 2000 %%% %%% Last change: %%% $Date: 2000/09/04 22:34:00 $ by $Author: kornstae $ %%% $Revision: 1.6 $ %%% { /y /x x x mulf y y mulf addf sqrt } /dist 0.2 0.2 0.3 point /black1 0.4 0.4 0.5 point /black2 0.7 0.7 0.5 point /white1 1.0 1.0 0.8 point /white2 %% %% Surface functions %% { /col2 /col1 { /v /u /face face 0 eqi { % rotational: stripes according to angle u u 12.0 mulf floor 2 modi 1 eqi { col1 } { col2 } if } { % flat: rays according to angle from origin to (u, v) u 0.5 subf /u v 0.5 subf /v u u v dist apply divf /b 0.0 v lessf { b asin } { 360.0 b asin subf } if 180.0 addf 30.0 divf floor 2 modi 1 eqi { col1 } { col2 } if } if 0.7 0.3 1.0 } } /figureSurface %% %% Board %% { /v /u /face 3 face lessi { % top, bottom: checkered 0 u 8.0 mulf floor v 8.0 mulf floor addi } { face 2 modi 0 eqi { 0 } % front, left: striped black/white { 1 } % back, right: striped white/black if u 8.0 mulf floor } if 2 modi eqi { black1 } { white2 } if 0.4 0.6 0.5 } cube -0.5 -1.0 -0.5 translate 8.0 0.3 8.0 scale /board %% %% Pawns %% { /col2 /col1 col1 col2 figureSurface apply /surface surface sphere 0.0 1.0 0.0 translate surface cylinder union surface sphere 0.0 2.3 0.0 translate difference surface sphere 0.8 uscale 0.0 2.5 0.0 translate union 0.3 uscale } /pawn white1 white2 pawn apply /whitePawn black1 black2 pawn apply /blackPawn %% %% Towers %% { /col2 /col1 col1 col2 figureSurface apply /surface col1 col1 figureSurface apply /surface1 col2 col2 figureSurface apply /surface2 % Base surface cylinder 1.0 0.75 1.0 scale % Wall surface cone 0.0 -1.0 0.0 translate 180.0 rotatez 90.0 rotatey 1.0 7.5 1.0 scale union surface cylinder 1.0 2.8 1.0 scale intersect % Platform surface cylinder 0.0 3.0 0.0 translate union % Viewholes surface cylinder 0.7 4.0 0.7 scale { /rot surface1 plane 90.0 rotatex surface2 plane -90.0 rotatex 30.0 rotatey intersect rot rotatey } /apex 15.0 apex apply 75.0 apex apply union 135.0 apex apply union 195.0 apex apply union 255.0 apex apply union 315.0 apex apply union surface cylinder intersect union 0.0 3.5 0.0 translate difference 0.4 uscale } /tower white1 white2 tower apply /whiteTower black1 black2 tower apply /blackTower %% %% Knights %% { /col2 /col1 col1 col2 figureSurface apply /surface % Base surface cylinder 1.0 0.75 1.0 scale % Body surface cone 180.0 rotatez 30.0 rotatey 0.0 1.0 0.0 translate 1.0 5.0 1.0 scale surface plane 0.0 3.0 0.0 translate intersect union % Head surface cone 1.0 3.0 1.0 scale 0.0 -1.0 0.0 translate surface cylinder 1.0 2.0 1.0 scale intersect 0.0 -1.5 0.0 translate /head head 1.25 1.0 1.25 scale 0.0 0.5 0.0 translate -90.0 rotatex 0.0 3.2 0.0 translate difference head 0.8 1.0 0.8 scale -90.0 rotatex 0.0 3.2 0.0 translate union 0.4 uscale } /knight white1 white2 knight apply /whiteKnight black1 black2 knight apply 180.0 rotatey /blackKnight %% %% Bishops %% { /col2 /col1 col1 col2 figureSurface apply /surface % Base surface cylinder 1.0 0.75 1.0 scale % Body surface cone 180.0 rotatez 30.0 rotatey 0.0 1.0 0.0 translate 1.0 5.0 1.0 scale surface plane 0.0 3.0 0.0 translate intersect union % Head surface sphere 0.9 uscale 0.0 3.15 0.0 translate difference surface sphere 0.8 uscale 0.0 3.25 0.0 translate union 0.4 uscale } /bishop white1 white2 bishop apply /whiteBishop black1 black2 bishop apply /blackBishop %% %% Queens %% { /col2 /col1 col1 col2 figureSurface apply /surface col1 col1 figureSurface apply /surface1 col2 col2 figureSurface apply /surface2 % Base surface cylinder 1.0 0.75 1.0 scale % Body surface cone 180.0 rotatez 30.0 rotatey 0.0 1.0 0.0 translate 1.0 7.5 1.0 scale surface plane 0.0 4.0 0.0 translate intersect union % Crown 38.146 /phi surface cylinder 1.0 2.0 1.0 scale surface1 plane -90.0 phi subf rotatex surface2 plane 90.0 phi addf rotatex intersect -45.0 rotatez 1.0 0.0 0.0 translate /wedge wedge wedge 60.0 rotatey union wedge 120.0 rotatey union wedge 180.0 rotatey union wedge 240.0 rotatey union wedge 300.0 rotatey union 0.0 1.0 0.0 translate difference 0.6 0.25 0.6 scale 0.0 4.7 0.0 translate union % Head surface sphere 0.9 uscale 0.0 3.9 0.0 translate difference surface sphere 0.8 uscale 0.0 4.0 0.0 translate union 0.4 uscale } /queen white1 white2 queen apply /whiteQueen black1 black2 queen apply /blackQueen %% %% Kings %% { /col2 /col1 col1 col2 figureSurface apply /surface col1 col1 figureSurface apply /surface1 col2 col2 figureSurface apply /surface2 % Base surface cylinder 1.0 0.75 1.0 scale % Body surface cone 180.0 rotatez 30.0 rotatey 0.0 1.0 0.0 translate 1.0 7.5 1.0 scale surface plane 0.0 4.0 0.0 translate intersect union % Crown 38.146 /phi surface cylinder 1.0 2.0 1.0 scale surface1 plane -90.0 phi subf rotatex surface2 plane 90.0 phi addf rotatex intersect -45.0 rotatez 1.0 0.0 0.0 translate /wedge wedge wedge 60.0 rotatey union wedge 120.0 rotatey union wedge 180.0 rotatey union wedge 240.0 rotatey union wedge 300.0 rotatey union 0.0 1.0 0.0 translate difference 0.6 0.25 0.6 scale % Scepter surface2 cube 0.1 0.7 0.1 scale surface2 cube 0.6 0.1 0.1 scale -0.25 0.35 0.0 translate union -0.05 0.4 -0.05 translate union 0.0 4.7 0.0 translate union % Head surface sphere 0.9 uscale 0.0 3.9 0.0 translate difference surface sphere 0.8 uscale 0.0 4.0 0.0 translate union 0.4 uscale } /king white1 white2 king apply /whiteKing black1 black2 king apply /blackKing %% %% The scene %% board whitePawn -3.5 0.0 -2.5 translate union whitePawn -2.5 0.0 -2.5 translate union whitePawn -1.5 0.0 -2.5 translate union whitePawn -0.5 0.0 -2.5 translate union whitePawn 0.5 0.0 -2.5 translate union whitePawn 1.5 0.0 -2.5 translate union whitePawn 2.5 0.0 -2.5 translate union whitePawn 3.5 0.0 -2.5 translate union whiteTower -3.5 0.0 -3.5 translate union whiteTower 3.5 0.0 -3.5 translate union whiteKnight -2.5 0.0 -3.5 translate union whiteKnight 2.5 0.0 -3.5 translate union whiteBishop -1.5 0.0 -3.5 translate union whiteBishop 1.5 0.0 -3.5 translate union whiteQueen -0.5 0.0 -3.5 translate union whiteKing 0.5 0.0 -3.5 translate union blackPawn -3.5 0.0 2.5 translate union blackPawn -2.5 0.0 2.5 translate union blackPawn -1.5 0.0 2.5 translate union blackPawn -0.5 0.0 2.5 translate union blackPawn 0.5 0.0 2.5 translate union blackPawn 1.5 0.0 2.5 translate union blackPawn 2.5 0.0 2.5 translate union blackPawn 3.5 0.0 2.5 translate union blackTower -3.5 0.0 3.5 translate union blackTower 3.5 0.0 3.5 translate union blackKnight -2.5 0.0 3.5 translate union blackKnight 2.5 0.0 3.5 translate union blackBishop -1.5 0.0 3.5 translate union blackBishop 1.5 0.0 3.5 translate union blackQueen -0.5 0.0 3.5 translate union blackKing 0.5 0.0 3.5 translate union 30.0 rotatey -20.0 rotatex 0.4 uscale 0.3 0.0 3.0 translate %whiteTower -70.0 rotatex 0.0 0.0 4.0 translate /scene 0.0 0.0 -1.0 point 1.0 1.0 1.0 point pointlight /l 0.33 0.33 0.33 point [ l ] scene 3 60.0 400 300 "chess.ppm" render mlton-20100608/benchmark/tests/DATA/hamlet-input.sml0000644000076600000240000000055311404435627020521 0ustar mtfstaffdatatype t = Z | S of t; val zero = Z; val one = S zero; val two = S one; val rec add: t * t -> t = fn (Z, n) => n | (S m, n) => S (add (m, n)); val rec mul: t * t -> t = fn (Z, n) => Z | (S z, n) => add (n, mul (z, n)); val four = mul (two, two); val rec exp: t * t -> t = fn (n, Z) => one | (n, S m) => mul (n, exp (n, m)); val _ = exp (exp (four, four), two); mlton-20100608/benchmark/tests/DATA/ml.grm0000644000076600000240000010377011404435627016521 0ustar mtfstaff(* Copyright 1989 by AT&T Bell Laboratories *) open ErrorMsg Symbol Access Basics BasicTypes TypesUtil Absyn open EnvAccess Misc CoreLang Signs Strs TyvarSet fun fire a b c = (a(); b c) fun markexp (e as MARKexp _, _, _) = e | markexp(e,a,b) = if !System.Control.markabsyn then MARKexp(e,a,b) else e fun markdec((d as MARKdec _, e), _, _) = (d,e) | markdec((d,e),a,b) = if !System.Control.markabsyn then (MARKdec(d,a,b),e) else (d,e) fun markdec' d = let val (d,e) = markdec d in ([d],e) end fun markdec'' (([d],e),a,b) = markdec'((d,e),a,b) | markdec'' ((s,e),a,b) = markdec'((SEQdec s, e),a,b) fun markstr(f,a,b) $ = case f $ of s as (MARKstr _,x,y) => s | s as (t,x,y) => if !System.Control.markabsyn then (MARKstr(t,a,b),x,y) else s infix \/ val op \/ = union_tyvars fun V(_,vars) = vars and E(e,_) = e fun sequence (do1,do2) (env,a2,a3,a4) = let val (r1,env1) = do1 (env,a2,a3,a4) val (r2,env2) = do2 (Env.atop(env1,env),a2,a3,a4) in (r1 @ r2, Env.atop(env2,env1)) end fun sequence' (do1,do2) env = let val (r1,env1) = do1 env val (r2,env2) = do2 (Env.atop(env1,env)) in (r1 @ r2, Env.atop(env2,env1)) end fun seqdec (d,e) = ([d],e) %% %term EOF | SEMICOLON | ID of string | TYVAR of string | INT of int | INT0 of int | REAL of string | STRING of string | ABSTRACTION | ABSTYPE | AND | ARROW | AS | BAR | CASE | DATATYPE | DOTDOTDOT | ELSE | END | EQUAL | EQTYPE | EXCEPTION | DO | DOT | DARROW | FN | FUN | FUNCTOR | HANDLE | HASH | IF | IN | INCLUDE | INFIX | INFIXR | LET | LOCAL | NONFIX | OF | OP | OPEN | OVERLOAD | QUERY | RAISE | REC | SHARING | SIG | SIGNATURE | STRUCT | STRUCTURE | THEN | TYPE | VAL | WHILE | WILD | WITH | WITHTYPE | ASTERISK | COLON | COMMA | LBRACE | LBRACKET | LPAREN | RBRACE | RBRACKET | RPAREN | ORELSE | ANDALSO | IMPORT %nonterm ident of string | id of string | int of int | op_op of unit susp | opid of symbol enved | qid of ((string->symbol) -> symbol list) | qid_p0 of symbol list list | selector of symbol | tycon of symbol list | tlabel of (symbol * ty) enved uvars | tlabels of (symbol * ty) list enved uvars | ty' of ty enved uvars | tuple_ty of ty list enved uvars | ty of ty enved uvars | ty0_pc of ty list enved uvars | match of rule list evstamped uvars | rule of rule evstamped uvars | elabel of (symbol * exp) evstamped uvars | elabels of (symbol * exp) list evstamped uvars | exp_ps of exp list evstamped uvars | exp of exp evstamped uvars | app_exp of exp precStack evstamped uvars | aexp of exp evstamped uvars | exp_list of exp list evstamped uvars | exp_2c of exp list evstamped uvars | pat of pat enved uvars | pat' of pat enved uvars | pat'' of pat enved uvars | apat of (pat * fixity * complainer) enved uvars | apat' of (pat * fixity * complainer) enved uvars | apat'' of pat enved uvars | plabel of (symbol * pat) enved uvars | plabels of ((symbol * pat) list * bool) enved uvars | pat_2c of pat list enved uvars | pat_list of pat list enved uvars | vb of vb list evstamped | constraint of ty option enved uvars | rvb of rawrvb list enved | fb' of rawclause list enved uvars | fb of rawclause list list enved uvars | apats of (pat * fixity * complainer) list enved uvars | clause' of (symbol * pat list) enved uvars | clause of rawclause enved uvars | tb of bool -> tb list withenv epathvstamped | tyvars of tyvar list | tyvar_pc of tyvar list | db of (symbol * int * datacon list withenv epathed) list | constrs of (Basics.env * ty -> (symbol * bool * ty) list) uvars | constr of (Basics.env * ty -> symbol * bool * ty) uvars | eb of eb list withenv epathvstamped uvars | qid_p of structureVar list enved | fixity of fixity | ldec of dec withenv epathvstamped uvars | exp_pa of exp list evstamped | ldecs of dec withenv epathvstamped uvars | ops of symbol list | spec_s of spectype | spec of spectype | strspec of spectype | tyspec of eqprop -> spectype | valspec of spectype | exnspec of spectype | sharespec of spectype | patheqn of (string->symbol) -> symbol list list | sign of bool (* toplevel? *) * bool (* functor param? *) * Structure (*param*) -> signtype | sigconstraint_op of (Basics.env * Structure) -> Structure option | sigb of signatureVar list withenv enved | str of strtype | sdecs of dec list withenv epathnstamped | sdecs' of dec list withenv epathnstamped | sdec of dec withenv epathnstamped | strb of bool -> (symbol*structureVar*strb) list epathstamped | fparam of functorFormal | fctb of (symbol * functorVar * fctb) list enved | importdec of string list | interdec of dec withenv enved %pos int %arg (error) : pos * pos -> ErrorMsg.severity -> string -> unit %pure %start interdec %eop EOF SEMICOLON %noshift EOF %nonassoc WITHTYPE %right AND %right ARROW %right AS %right DARROW %left DO %left ELSE %left RAISE %right HANDLE %left ORELSE %left ANDALSO %left COLON %name ML %keyword ABSTRACTION ABSTYPE AND AS CASE DATATYPE DOTDOTDOT ELSE END EQTYPE EXCEPTION DO DARROW FN FUN FUNCTOR HANDLE IF IN INCLUDE INFIX INFIXR LET LOCAL NONFIX OF OP OPEN OVERLOAD RAISE REC SHARING SIG SIGNATURE STRUCT STRUCTURE THEN TYPE VAL WHILE WITH WITHTYPE ORELSE ANDALSO IMPORT %subst EQUAL for DARROW | DARROW for EQUAL | ANDALSO for AND | OF for COLON | COMMA for SEMICOLON | SEMICOLON for COMMA %prefer VAL THEN ELSE LPAREN %value ID ("bogus") %value TYVAR ("'bogus") %value INT (1) %value INT0 (0) %value REAL ("0.0") %value STRING ("") %% int : INT (INT) | INT0 (INT0) id : ID (ID) | ASTERISK ("*") ident : ID (ID) | ASTERISK ("*") | EQUAL ("=") op_op : OP (fn()=> error (OPleft,OPright) WARN "unnecessary `op'") | (fn()=>()) opid : id (fn env => let val (v,f) = var'n'fix id in case lookFIX env f of NONfix => () | _ => error (idleft,idright) COMPLAIN "nonfix identifier required"; v end) | OP ident (fn _ => varSymbol ident) qid : ID DOT qid (fn kind => strSymbol ID :: qid kind) | ident (fn kind => [kind ident]) selector: id (labSymbol id) | INT (Symbol.labSymbol(makestring INT)) tycon : ID DOT tycon (strSymbol ID :: tycon) | ID ([tycSymbol ID]) tlabel : selector COLON ty (fn $ =>(selector, E ty $), V ty) tlabels : tlabel COMMA tlabels (fn $ => E tlabel $ :: E tlabels $, V tlabel \/ V tlabels) | tlabel (fn $ => [E tlabel $], V tlabel) ty' : TYVAR (let val tyv = mkTyvar(mkUBOUND(tyvSymbol TYVAR)) in (fn _ => VARty tyv, singleton_tyvar tyv) end) | LBRACE tlabels RBRACE (fn $ => make_recordTy(E tlabels $, error(LBRACEleft,RBRACEright)), V tlabels) | LBRACE RBRACE (fn _ => make_recordTy(nil, error(LBRACEleft,RBRACEright)), no_tyvars) | LPAREN ty0_pc RPAREN tycon (fn env =>let val ts = E ty0_pc env in CONty(lookPathArTYC env (tycon,length ts, error (tyconleft,tyconright) COMPLAIN), ts) end, V ty0_pc) | LPAREN ty RPAREN (ty) | ty' tycon (fn env =>CONty(lookPathArTYC env (tycon,1, error(tyconleft,tyconright)COMPLAIN), [E ty' env]), V ty') | tycon (fn env =>CONty(lookPathArTYC env (tycon, 0, error(tyconleft,tyconright)COMPLAIN),[]), no_tyvars) tuple_ty : ty' ASTERISK tuple_ty (fn $ => E ty' $ :: E tuple_ty $, V ty' \/ V tuple_ty) | ty' ASTERISK ty' (fn $ =>[E ty'1 $, E ty'2 $], V ty'1 \/ V ty'2) ty : tuple_ty (fn $ =>tupleTy(E tuple_ty $), V tuple_ty) | ty ARROW ty (fn $ =>CONty(arrowTycon, [E ty1 $, E ty2 $]), V ty1 \/ V ty2) | ty' (ty') ty0_pc : ty COMMA ty (fn $ => [E ty1 $, E ty2 $], V ty1 \/ V ty2) | ty COMMA ty0_pc (fn $ => E ty $ :: E ty0_pc $, V ty \/ V ty0_pc) match : rule (fn evst => [E rule evst], V rule) | rule BAR match (fn evst => E rule evst :: E match evst, V rule \/ V match) rule : pat DARROW exp (makeRULE(E pat, fn $ => markexp(E exp $,expleft,expright), error(patleft,patright)), V pat \/ V exp) elabel : selector EQUAL exp (fn evst => (selector,E exp evst), V exp) elabels : elabel COMMA elabels (fn evst => (E elabel evst :: E elabels evst), V elabel \/ V elabels) | elabel (fn evst => [E elabel evst], V elabel) exp_ps : exp (fn st => [E exp st], V exp) | exp SEMICOLON exp_ps (fn st => E exp st :: E exp_ps st, V exp \/ V exp_ps) exp : exp HANDLE match (fn st=> makeHANDLEexp(E exp st, E match st), V exp \/ V match) | exp ORELSE exp (fn st=> ORELSEexp(markexp(E exp1 st, exp1left,exp1right), markexp(E exp2 st,exp2left,expright)), V exp1 \/ V exp2) | exp ANDALSO exp (fn st=> ANDALSOexp(markexp(E exp1 st,exp1left,exp1right), markexp(E exp2 st,exp2left,exp2right)), V exp1 \/ V exp2) | exp COLON ty (fn (st as (env,_,_))=> CONSTRAINTexp(E exp st, E ty env), V exp \/ V ty) | app_exp (fn st=> exp_finish(E app_exp st, error(app_expright,app_expright)), V app_exp) | FN match (fn st=> markexp(FNexp(completeMatch(E match st)), FNleft,matchright), V match) | CASE exp OF match (fn st=>markexp(CASEexp(E exp st, completeMatch(E match st)), CASEleft,matchright), V exp \/ V match) | WHILE exp DO exp (fn st=> WHILEexp(E exp1 st, markexp(E exp2 st,exp2left,exp2right)), V exp1 \/ V exp2) | IF exp THEN exp ELSE exp (fn st=>IFexp(E exp1 st, markexp(E exp2 st,exp2left,exp2right), markexp(E exp3 st,exp3left,exp3right)), V exp1 \/ V exp2 \/ V exp3) | RAISE exp (fn st=>markexp(RAISEexp(E exp st),RAISEleft,expright), V exp) app_exp : aexp (fn st => exp_start(markexp(E aexp st, aexpleft,aexpright), NONfix, error (aexpleft,aexpright)), V aexp) | ident (fn (env,_,_) => let val e = error(identleft,identright) val (v,f) = var'n'fix ident in exp_start(markexp(lookID env (v,e), identleft,identright), lookFIX env f, e) end, no_tyvars) | app_exp aexp (fn st => exp_parse(E app_exp st, markexp(E aexp st, aexpleft,aexpright), NONfix, error (aexpleft,aexpright)), V app_exp \/ V aexp) | app_exp ident (fn (st as (env,_,_)) => let val e = error(identleft,identright) val (v,f) = var'n'fix ident in exp_parse(E app_exp st, markexp(lookID env (v,e), identleft,identright), lookFIX env f, e) end, V app_exp) aexp : OP ident (fn (env,_,_) => lookID env (varSymbol ident, error(identleft,identright)), no_tyvars) | ID DOT qid (fn (env,_,_) => varcon(lookPathVARCON env (strSymbol ID ::(qid varSymbol), error(IDleft,qidright)COMPLAIN)), no_tyvars) | int (fn st => INTexp int, no_tyvars) | REAL (fn st => REALexp REAL, no_tyvars) | STRING (fn st => STRINGexp STRING, no_tyvars) | HASH selector (fn st => SELECTORexp selector, no_tyvars) | LBRACE elabels RBRACE (fn st=> makeRECORDexp(E elabels st, error(LBRACEleft,RBRACEright)), V elabels) | LBRACE RBRACE (fn st=> RECORDexp nil, no_tyvars) | LPAREN RPAREN (fn st=> unitExp, no_tyvars) | LPAREN exp_ps RPAREN (fn st=> SEQexp(E exp_ps st), V exp_ps) | LPAREN exp_2c RPAREN (fn st=> TUPLEexp(E exp_2c st), V exp_2c) | LBRACKET exp_list RBRACKET (fn st=> LISTexp(E exp_list st), V exp_list) | LBRACKET RBRACKET (fn st=> nilExp, no_tyvars) | LET ldecs IN exp_ps END (fn (env,tv,st) => let val (d,env') = E ldecs(env,[],tv,st) val e = E exp_ps (Env.atop(env',env),tv,st) in markexp(LETexp(d,SEQexp e), LETleft,ENDright) end, V exp_ps \/ V ldecs) exp_2c : exp COMMA exp_2c (fn st=> E exp st :: E exp_2c st, V exp \/ V exp_2c) | exp COMMA exp (fn st=> [E exp1 st, E exp2 st], V exp1 \/ V exp2) exp_list : exp (fn st=> [E exp st], V exp) | exp COMMA exp_list (fn st=> E exp st :: E exp_list st, V exp \/ V exp_list) pat : pat' (pat') | apat apats (fn $ => make_app_pat(E apat $ ::E apats $), V apat \/ V apats) pat' : pat AS pat (fn $ => layered(E pat1 $, E pat2 $, error(pat1left,pat1right)), V pat1 \/ V pat2) | pat'' (pat'') pat'' : apat apats COLON ty (fn env => CONSTRAINTpat( make_app_pat(E apat env ::E apats env), E ty env), V apat \/ V apats \/ V ty) | pat'' COLON ty (fn env => CONSTRAINTpat(E pat'' env, E ty env), V pat'' \/ V ty) apat : apat' (apat') | LPAREN pat RPAREN (fn $ =>(E pat $,NONfix,error(LPARENleft,RPARENright)), V pat) apat' : apat'' (fn $ =>(E apat'' $,NONfix,error(apat''left,apat''right)), V apat'') | id (fn env => let val e = error(idleft,idright) val (v,f) = var'n'fix id in (pat_id env v, lookFIX env f, e) end, no_tyvars) | LPAREN RPAREN (fn _ =>(unitPat,NONfix, error(LPARENleft,RPARENright)), no_tyvars) | LPAREN pat COMMA pat_list RPAREN (fn $ =>(TUPLEpat(E pat $ ::E pat_list $), NONfix,error(LPARENleft,RPARENright)), V pat \/ V pat_list) apat'' : OP ident (fn env =>pat_id env(varSymbol ident), no_tyvars) | ID DOT qid (fn env =>qid_pat env (strSymbol ID :: qid varSymbol, error(IDleft,qidright)), no_tyvars) | int (fn _ =>INTpat int, no_tyvars) | REAL (fn _ =>REALpat REAL, no_tyvars) | STRING (fn _ =>STRINGpat STRING, no_tyvars) | WILD (fn _ =>WILDpat, no_tyvars) | LBRACKET RBRACKET (fn _ =>LISTpat nil, no_tyvars) | LBRACKET pat_list RBRACKET (fn $ =>LISTpat(E pat_list $), V pat_list) | LBRACE RBRACE (fn _ =>makeRECORDpat((nil,false), error(LBRACEleft,RBRACEright)), no_tyvars) | LBRACE plabels RBRACE (fn $ =>makeRECORDpat(E plabels $, error(LBRACEleft,RBRACEright)), V plabels) plabel : selector EQUAL pat (fn $ => (selector,E pat $), V pat) | ID (fn env => (labSymbol ID, pat_id env(varSymbol ID)), no_tyvars) | ID AS pat (fn env => (labSymbol ID, LAYEREDpat(pat_id env (varSymbol ID), E pat env)), V pat) | ID COLON ty (fn env => (labSymbol ID, CONSTRAINTpat(pat_id env (varSymbol ID), E ty env)), V ty) | ID COLON ty AS pat (fn env => (labSymbol ID, LAYEREDpat(CONSTRAINTpat( pat_id env (varSymbol ID), E ty env), E pat env)), V ty \/ V pat) plabels : plabel COMMA plabels (fn $ =>let val (a,(b,fx))=(E plabel $,E plabels $) in (a::b, fx) end, V plabel \/ V plabels) | plabel (fn $ => ([E plabel $],false), V plabel) | DOTDOTDOT (fn _ => (nil, true), no_tyvars) pat_list: pat (fn $ => [E pat $], V pat) | pat COMMA pat_list (fn $ => E pat $ :: E pat_list $, V pat \/ V pat_list) vb : vb AND vb (fn st=> vb1 st @ vb2 st) | pat EQUAL exp (valbind(pat, exp)) constraint : (fn _ =>NONE, no_tyvars) | COLON ty (fn env =>SOME(E ty env), V ty) rvb : opid constraint EQUAL FN match (fn env =>[{name=opid env, ty=constraint,match=match}]) | rvb AND rvb (fn env => (rvb1 env) @ (rvb2 env)) fb' : clause (fn $ =>[E clause $], V clause) | clause BAR fb' (fn $ =>E clause $ ::E fb' $, V clause \/ V fb') fb : fb' (fn $ => [checkFB(E fb' $,error(fb'left,fb'right))], V fb') | fb' AND fb (fn $ => checkFB(E fb' $,error(fb'left,fb'right)) :: E fb $, V fb' \/ V fb) clause' : LPAREN apat apats RPAREN apats (fn $ =>makecl(E apat $ ::E apats1 $,E apats2 $), V apat \/ V apats1 \/ V apats2) | LPAREN pat' RPAREN apats (fn $ =>makecl([],(E pat' $,NONfix, error(LPARENleft,RPARENright)) ::E apats $), V pat' \/ V apats) | apat' apats (fn $ =>makecl([],E apat' $ ::E apats $), V apat' \/ V apats) apats : (fn _ =>nil, no_tyvars) | apat apats (fn $ => E apat $ ::E apats $, V apat \/ V apats) clause : clause' constraint EQUAL exp (fn env => let val (id,pats) = E clause' env in {name=id,pats=pats, resultty=E constraint env, exp=fn $ => markexp(E exp $,expleft,expright), err=error(clause'left,clause'right)} end, V clause' \/ V constraint \/ V exp) tb : tyvars ID EQUAL ty (makeTB(tyvars, tycSymbol ID, ty, error(tyleft,tyright))) | tb AND tb (fn nw => sequence(tb1 nw,tb2 nw)) tyvars : TYVAR ([mkTyvar(mkUBOUND(tyvSymbol TYVAR))]) | LPAREN tyvar_pc RPAREN (checkUniq(error(tyvar_pcleft,tyvar_pcright), "duplicate type variable") (List.map(fn ref(UBOUND{name,...})=>name) tyvar_pc); tyvar_pc) | (nil) tyvar_pc: TYVAR ([mkTyvar(mkUBOUND(tyvSymbol TYVAR))]) | TYVAR COMMA tyvar_pc (mkTyvar(mkUBOUND(tyvSymbol TYVAR)) :: tyvar_pc) db : db AND db (db1 @ db2) | tyvars ident EQUAL constrs (let val name = tycSymbol ident in [(name,length tyvars, makeDB'(tyvars,name,constrs, error(constrsleft,constrsright)))] end) constrs : constr (fn $ => [E constr $], V constr) | constr BAR constrs (fn $ => E constr $ :: E constrs $, V constr \/ V constrs) constr : op_op ident (fire op_op (fn(_,t)=> (varSymbol ident,true,t)), no_tyvars) | op_op ident OF ty (fire op_op (fn(env,t)=> (varSymbol ident,false, CONty(arrowTycon,[E ty env, t]))), V ty) eb : op_op ident (fire op_op (makeEB(varSymbol ident)), no_tyvars) | op_op ident OF ty (fire op_op (makeEBof(varSymbol ident,E ty, error(tyleft,tyright))), V ty) | op_op ident EQUAL qid (fire op_op (makeEBeq(varSymbol ident,qid varSymbol, error(qidleft,qidright))), no_tyvars) | eb AND eb (sequence(E eb1,E eb2), V eb1 \/ V eb2) qid_p0 : qid ([qid strSymbol]) | qid qid_p0 (qid strSymbol :: qid_p0) qid_p : qid (fn env => [getSTRpath env (qid strSymbol,error(qidleft,qidright))]) | qid qid_p (fn env => getSTRpath env (qid strSymbol,error(qidleft,qidright)) :: qid_p env) fixity : INFIX (infixleft 0) | INFIX int (infixleft int) | INFIXR (infixright 0) | INFIXR int (infixright int) | NONFIX (NONfix) ldec : VAL vb (makeVALdec(vb,error(vbleft,vbright)), no_tyvars) | VAL REC rvb (makeVALRECdec (rvb,error(rvbleft,rvbright)), no_tyvars) | FUN fb (makeFUNdec fb, no_tyvars) | TYPE tb ((fn $ => makeTYPEdec(tb true $, error(tbleft,tbright))), no_tyvars) | DATATYPE db (makeDB(db, nullTB), no_tyvars) | DATATYPE db WITHTYPE tb (makeDB(db,tb), no_tyvars) | ABSTYPE db WITH ldecs END (makeABSTYPEdec(db,nullTB,E ldecs),V ldecs) | ABSTYPE db WITHTYPE tb WITH ldecs END (makeABSTYPEdec(db,tb,E ldecs),V ldecs) | EXCEPTION eb ((fn $ => makeEXCEPTIONdec(E eb $, error(ebleft,ebright))), V eb) | OPEN qid_p (makeOPENdec qid_p, no_tyvars) | fixity ops (makeFIXdec(fixity,ops), no_tyvars) | OVERLOAD ident COLON ty AS exp_pa (makeOVERLOADdec(varSymbol ident,ty,exp_pa), no_tyvars) exp_pa : exp (fn st => [E exp st]) | exp AND exp_pa (fn st => E exp st :: exp_pa st) ldecs : (fn $ => (SEQdec nil,Env.empty), no_tyvars) | ldec ldecs (makeSEQdec(fn $ => markdec(E ldec $,ldecleft,ldecright), E ldecs), V ldec \/ V ldecs) | SEMICOLON ldecs (ldecs) | LOCAL ldecs IN ldecs END ldecs (makeSEQdec(fn $ => markdec(makeLOCALdec(E ldecs1,E ldecs2) $, LOCALleft,ENDright), E ldecs3), V ldecs1 \/ V ldecs2 \/ V ldecs3) ops : ident ([fixSymbol ident]) | ident ops (fixSymbol ident :: ops) spec_s : (fn $ => nil) | spec spec_s (fn $ => spec $ @ spec_s $) | SEMICOLON spec_s (spec_s) spec : STRUCTURE strspec (strspec) | DATATYPE db (make_dtyspec db) | TYPE tyspec (tyspec UNDEF) | EQTYPE tyspec (tyspec YES) | VAL valspec (valspec) | EXCEPTION exnspec (exnspec) | fixity ops (make_fixityspec(fixity,ops)) | SHARING sharespec (sharespec) | OPEN qid_p0 (make_openspec(qid_p0, error(OPENleft,qid_p0right))) | LOCAL spec_s IN spec_s END (fn $ => (spec_s1 $; error(spec_s1left,spec_s1right) WARN "LOCAL specs are only partially implemented"; spec_s2 $)) | INCLUDE ident (make_includespec (sigSymbol ident,error(identleft,identright))) strspec : strspec AND strspec (fn $ => strspec1 $ @ strspec2 $) | ident COLON sign (make_strspec(strSymbol ident, sign(false,false,NULLstr))) tyspec : tyspec AND tyspec (fn eq => fn $ => tyspec1 eq $ @ tyspec2 eq $) | tyvars ID (fn eq => make_tyspec(eq,tyvars,tycSymbol ID, error(tyvarsleft,IDright))) valspec : valspec AND valspec (fn $ => valspec1 $ @ valspec2 $) | op_op ident COLON ty (fire op_op (make_valspec(varSymbol ident,ty))) exnspec : exnspec AND exnspec (fn $ => exnspec1 $ @ exnspec2 $) | ident (make_exnspec(varSymbol ident)) | ident OF ty (make_exnspecOF (varSymbol ident,ty)) sharespec: sharespec AND sharespec (fn $ => sharespec1 $ @ sharespec2 $) | TYPE patheqn (make_type_sharespec(patheqn tycSymbol)) | patheqn (make_str_sharespec(patheqn strSymbol)) patheqn: qid EQUAL qid (fn kind => [qid1 kind, qid2 kind]) | qid EQUAL patheqn (fn kind => qid kind :: patheqn kind) sign : ID (makeSIGid(sigSymbol ID,error(IDleft,IDright))) | SIG spec_s END (makeSIG(spec_s,error(spec_sleft,spec_sright))) sigconstraint_op : (fn _ => NONE) | COLON sign (fn (env,param) => SOME(sign(true,false,param) (env,Stampset.newStampsets()))) sigb : sigb AND sigb (sequence'(sigb1,sigb2)) | ident EQUAL sign (make_sigb(sigSymbol ident, sign(true,false,NULLstr))) str : qid (markstr(make_str_qid(qid strSymbol, error(qidleft,qidright)),qidleft,qidright)) | STRUCT sdecs END (markstr(make_str_struct(sdecs, error(STRUCTleft,ENDright)), STRUCTleft,ENDright)) | ID LPAREN sdecs RPAREN (markstr(make_str_app(fctSymbol ID,error(IDleft,IDright), (fn $ => let val (s,s')=spread_args sdecs $ in (MARKstr(s,sdecsleft,sdecsright) ,s') end)),IDleft,RPARENright)) | ID LPAREN str RPAREN (markstr(make_str_app(fctSymbol ID,error(IDleft,IDright), single_arg str),IDleft,RPARENright)) | LET sdecs IN str END (markstr(make_str_let(sdecs,str),LETleft,ENDright)) sdecs : sdec sdecs (sequence(fn $ => markdec'(sdec $,sdecleft, sdecright), sdecs)) | SEMICOLON sdecs (sdecs) | LOCAL sdecs IN sdecs END sdecs (sequence(fn $ => markdec''(makeLOCALsdecs(sdecs1,sdecs2) $,LOCALleft,ENDright), sdecs3)) | (fn $ => (nil,Env.empty)) sdecs' : sdec sdecs' (sequence(fn $ => markdec'(sdec $,sdecleft,sdecright), sdecs')) | LOCAL sdecs IN sdecs END sdecs' (sequence(fn $ => markdec''(makeLOCALsdecs(sdecs1,sdecs2) $, LOCALleft,ENDright), sdecs')) | LOCAL sdecs IN sdecs END (fn $ => markdec''(makeLOCALsdecs(sdecs1,sdecs2) $,LOCALleft,ENDright)) | sdec (fn $ => seqdec(markdec(sdec $,sdecleft,sdecright))) sdec : STRUCTURE strb (makeSTRBs(strb false)) | ABSTRACTION strb (makeSTRBs(strb true)) | SIGNATURE sigb (makeSIGdec(sigb,error(SIGNATUREleft,sigbright))) | FUNCTOR fctb (makeFCTdec(fctb,error(FUNCTORleft,fctbright))) | ldec (fn (env,pa,top,st) => let val (dec,env') = markdec(E ldec(env,pa,no_tyvars,st),ldecleft,ldecright) in Typecheck.decType(Env.atop(env',env),dec,top,error, (ldecleft,ldecright)); (dec,env') end) strb : ident sigconstraint_op EQUAL str (makeSTRB(strSymbol ident,sigconstraint_op,str, error(sigconstraint_opleft,sigconstraint_opright))) | strb AND strb (fn a => fn $ => strb1 a $ @ strb2 a $) fparam : ID COLON sign (single_formal(strSymbol ID, sign(true,true,NULLstr))) | spec_s (spread_formal(spec_s, error(spec_sleft,spec_sright))) fctb : ident LPAREN fparam RPAREN sigconstraint_op EQUAL str (makeFCTB(fctSymbol ident,fparam, sigconstraint_op,str, error(strleft,strright))) | fctb AND fctb (fn $ => fctb1 $ @ fctb2 $) importdec: STRING ([STRING]) | STRING importdec (STRING :: importdec) interdec: sdecs' (fn env=> let val (s,e)= sdecs'(env,[],true,Stampset.globalStamps) in markdec((SEQdec s,e),sdecs'left,sdecs'right) end) | IMPORT importdec (fn env =>(IMPORTdec importdec,env)) | exp (fn env=>markdec(toplevelexp(env,exp,error,(expleft,expright)), expleft,expright)) mlton-20100608/benchmark/tests/DATA/ml.lex0000644000076600000240000002200011404435627016506 0ustar mtfstaff(* Copyright 1989 by AT&T Bell Laboratories *) open ErrorMsg type svalue = Tokens.svalue type pos = int type lexresult = (svalue,pos) Tokens.token type lexarg = {comLevel : int ref, lineNum : int ref, linePos : int list ref, (* offsets of lines in file *) charlist : string list ref, stringstart : int ref, (* start of current string or comment*) err : pos*pos -> ErrorMsg.severity -> string->unit} type arg = lexarg type ('a,'b) token = ('a,'b) Tokens.token val eof = fn ({comLevel,err,linePos,stringstart,lineNum,charlist}:lexarg) => let val pos = Integer.max(!stringstart+2, hd(!linePos)) in if !comLevel>0 then err (!stringstart,pos) COMPLAIN "unclosed comment" else (); Tokens.EOF(pos,pos) end fun addString (charlist,s:string) = charlist := s :: (!charlist) fun makeString charlist = (implode(rev(!charlist)) before charlist := nil) fun makeHexInt sign s = let fun digit d = if (d < Ascii.uc_a) then (d - Ascii.zero) else (10 + (if (d < Ascii.lc_a) then (d - Ascii.uc_a) else (d - Ascii.lc_a))) in revfold (fn (c,a) => sign(a*16, digit(ord c))) (explode s) 0 end fun makeInt sign s = revfold (fn (c,a) => sign(a*10, ord c - Ascii.zero)) (explode s) 0 %% %s A S F; %header (functor MLLexFun(structure Tokens : ML_TOKENS)); %arg ({comLevel,lineNum,err,linePos,charlist,stringstart}); idchars=[A-Za-z'_0-9]; id=[A-Za-z'_]{idchars}*; ws=("\012"|[\t\ ])*; sym=[!%&$+/:<=>?@~|#*`]|\\|\-|\^; num=[0-9]+; frac="."{num}; exp="E"(~?){num}; real=(~?)(({num}{frac}?{exp})|({num}{frac}{exp}?)); hexnum=[0-9a-fA-F]+; %% {ws} => (continue()); \n => (inc lineNum; linePos := yypos :: !linePos; continue()); "*" => (Tokens.ASTERISK(yypos,yypos+1)); "|" => (Tokens.BAR(yypos,yypos+1)); ":" => (Tokens.COLON(yypos,yypos+1)); "=" => (Tokens.EQUAL(yypos,yypos+1)); "_" => (Tokens.WILD(yypos,yypos+1)); "#" => (Tokens.HASH(yypos,yypos+1)); "," => (Tokens.COMMA(yypos,yypos+1)); "{" => (Tokens.LBRACE(yypos,yypos+1)); "}" => (Tokens.RBRACE(yypos,yypos+1)); "[" => (Tokens.LBRACKET(yypos,yypos+1)); "]" => (Tokens.RBRACKET(yypos,yypos+1)); ";" => (Tokens.SEMICOLON(yypos,yypos+1)); "(" => (Tokens.LPAREN(yypos,yypos+1)); ")" => (Tokens.RPAREN(yypos,yypos+1)); "and" => (Tokens.AND(yypos,yypos+3)); "abstraction" => (Tokens.ABSTRACTION(yypos,yypos+11)); "abstype" => (Tokens.ABSTYPE(yypos,yypos+7)); "->" => (Tokens.ARROW(yypos,yypos+2)); "as" => (Tokens.AS(yypos,yypos+2)); "case" => (Tokens.CASE(yypos,yypos+4)); "datatype" => (Tokens.DATATYPE(yypos,yypos+8)); "." => (Tokens.DOT(yypos,yypos+1)); "..." => (Tokens.DOTDOTDOT(yypos,yypos+3)); "else" => (Tokens.ELSE(yypos,yypos+4)); "end" => (Tokens.END(yypos,yypos+3)); "eqtype" => (Tokens.EQTYPE(yypos,yypos+6)); "exception" => (Tokens.EXCEPTION(yypos,yypos+9)); "do" => (Tokens.DO(yypos,yypos+2)); "=>" => (Tokens.DARROW(yypos,yypos+2)); "fn" => (Tokens.FN(yypos,yypos+2)); "fun" => (Tokens.FUN(yypos,yypos+3)); "functor" => (Tokens.FUNCTOR(yypos,yypos+7)); "handle" => (Tokens.HANDLE(yypos,yypos+6)); "if" => (Tokens.IF(yypos,yypos+2)); "in" => (Tokens.IN(yypos,yypos+2)); "include" => (Tokens.INCLUDE(yypos,yypos+7)); "infix" => (Tokens.INFIX(yypos,yypos+5)); "infixr" => (Tokens.INFIXR(yypos,yypos+6)); "let" => (Tokens.LET(yypos,yypos+3)); "local" => (Tokens.LOCAL(yypos,yypos+5)); "nonfix" => (Tokens.NONFIX(yypos,yypos+6)); "of" => (Tokens.OF(yypos,yypos+2)); "op" => (Tokens.OP(yypos,yypos+2)); "open" => (Tokens.OPEN(yypos,yypos+4)); "overload" => (Tokens.OVERLOAD(yypos,yypos+8)); "raise" => (Tokens.RAISE(yypos,yypos+5)); "rec" => (Tokens.REC(yypos,yypos+3)); "sharing" => (Tokens.SHARING(yypos,yypos+7)); "sig" => (Tokens.SIG(yypos,yypos+3)); "signature" => (Tokens.SIGNATURE(yypos,yypos+9)); "struct" => (Tokens.STRUCT(yypos,yypos+6)); "structure" => (Tokens.STRUCTURE(yypos,yypos+9)); "then" => (Tokens.THEN(yypos,yypos+4)); "type" => (Tokens.TYPE(yypos,yypos+4)); "val" => (Tokens.VAL(yypos,yypos+3)); "while" => (Tokens.WHILE(yypos,yypos+5)); "with" => (Tokens.WITH(yypos,yypos+4)); "withtype" => (Tokens.WITHTYPE(yypos,yypos+8)); "orelse" => (Tokens.ORELSE(yypos,yypos+6)); "andalso" => (Tokens.ANDALSO(yypos,yypos+7)); "import" => (Tokens.IMPORT(yypos,yypos+6)); "'"{idchars}* => (Tokens.TYVAR(yytext, yypos, yypos+size yytext)); ({sym}+|{id}) => (Tokens.ID(yytext, yypos, yypos+size yytext)); {real} => (Tokens.REAL(yytext,yypos,yypos+size yytext)); [1-9][0-9]* => (Tokens.INT(makeInt (op +) yytext handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 1), yypos,yypos+size yytext)); {num} => (Tokens.INT0(makeInt (op +) yytext handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 0), yypos,yypos+size yytext)); ~{num} => (Tokens.INT0(makeInt (op -) (substring(yytext,1,size(yytext)-1)) handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 0), yypos,yypos+size yytext)); "0x"{hexnum} => ( Tokens.INT0(makeHexInt (op +) (substring(yytext, 2, size(yytext)-2)) handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 0), yypos, yypos+size yytext)); "~0x"{hexnum} => ( Tokens.INT0(makeHexInt (op -) (substring(yytext, 3, size(yytext)-3)) handle Overflow => (err (yypos,yypos+size yytext) COMPLAIN "integer too large"; 0), yypos, yypos+size yytext)); \" => (charlist := [""]; stringstart := yypos; YYBEGIN S; continue()); "(*" => (YYBEGIN A; stringstart := yypos; comLevel := 1; continue()); \h => (err (yypos,yypos) COMPLAIN "non-Ascii character"; continue()); . => (err (yypos,yypos) COMPLAIN "illegal token"; continue()); "(*" => (inc comLevel; continue()); \n => (inc lineNum; linePos := yypos :: !linePos; continue()); "*)" => (dec comLevel; if !comLevel=0 then YYBEGIN INITIAL else (); continue()); . => (continue()); \" => (YYBEGIN INITIAL; Tokens.STRING(makeString charlist, !stringstart,yypos+1)); \n => (err (!stringstart,yypos) COMPLAIN "unclosed string"; inc lineNum; linePos := yypos :: !linePos; YYBEGIN INITIAL; Tokens.STRING(makeString charlist,!stringstart,yypos)); [^"\\\n]* => (addString(charlist,yytext); continue()); \\\n => (inc lineNum; linePos := yypos :: !linePos; YYBEGIN F; continue()); \\[\ \t] => (YYBEGIN F; continue()); \n => (inc lineNum; linePos := yypos :: !linePos; continue()); {ws} => (continue()); \\ => (YYBEGIN S; stringstart := yypos; continue()); . => (err (!stringstart,yypos) COMPLAIN "unclosed string"; YYBEGIN INITIAL; Tokens.STRING(makeString charlist,!stringstart,yypos+1)); \\t => (addString(charlist,"\t"); continue()); \\n => (addString(charlist,"\n"); continue()); \\\\ => (addString(charlist,"\\"); continue()); \\\" => (addString(charlist,chr(Ascii.dquote)); continue()); \\\^[@-_] => (addString(charlist,chr(ordof(yytext,2)-ord("@"))); continue()); \\[0-9]{3} => (let val x = ordof(yytext,1)*100 +ordof(yytext,2)*10 +ordof(yytext,3) -(Ascii.zero*111) in (if x>255 then err (yypos,yypos+4) COMPLAIN "illegal ascii escape" else addString(charlist,chr x); continue()) end); \\ => (err (yypos,yypos+1) COMPLAIN "illegal string escape"; continue()); mlton-20100608/benchmark/tests/DATA/ndotprod.s0000644000076600000240000001124711404435627017414 0ustar mtfstaffARITHI new_allocptr/R1 := zero/R0 iadd 257 LABEL v/L0: ( zero/R0 allocptr/R1 exnhandler/R2 std_closure/R3 std_arg/R4 std_cont/R5 ) GETLAB v/R6 := v/L4 STORE M[ allocptr/R1 + 0 ] := v/R6 STORE M[ allocptr/R1 + 1 ] := std_cont/R5 ARITHI closure/R5 := allocptr/R1 iadd 0 ARITHI int10/R8 := zero/R0 iadd 10 GETREAL real3.0/R9 := 3.0 ARITHI new_allocptr/R1 := allocptr/R1 iadd 2 BRANCH IF zero/R0 ieq zero/R0 GOTO array/L1 ( zero/R0 allocptr/R1 exnhandler/R2 n/R8 v/R9 v/R5 ) LABEL array/L1: ( zero/R0 allocptr/R1 exnhandler/R2 n/R8 v/R9 v/R5 ) STORE M[ allocptr/R1 + 0 ] := n/R8 ARITH new_allocptr/R1 := n/R8 iadd allocptr/R1 ARITH arr/R4 := allocptr/R1 isub n/R8 BRANCH IF zero/R0 ige n/R8 GOTO else/L8 ( zero/R0 allocptr/R1 exnhandler/R2 arr/R4 v/R5 ) GETLAB v/R6 := v/L3 STORE M[ allocptr/R1 + 1 ] := v/R6 STORE M[ allocptr/R1 + 2 ] := arr/R4 STORE M[ allocptr/R1 + 3 ] := v/R5 ARITHI closure/R5 := allocptr/R1 iadd 1 STORE M[ arr/R4 + 1 ] := v/R9 ARITHI int1/R6 := zero/R0 iadd 1 ARITHI new_allocptr/R1 := allocptr/R1 iadd 4 BRANCH IF zero/R0 ieq zero/R0 GOTO g/L2 ( zero/R0 allocptr/R1 exnhandler/R2 i/R6 v/R5 arr/R4 n/R8 v/R9 ) LABEL else/L8: ( zero/R0 allocptr/R1 exnhandler/R2 arr/R4 v/R5 ) FETCHi v/R6 := M[ v/R5 + 0 ] ARITHI new_allocptr/R1 := allocptr/R1 iadd 1 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL g/L2: ( zero/R0 allocptr/R1 exnhandler/R2 i/R6 v/R5 arr/R4 n/R8 v/R9 ) BRANCH IF i/R6 ige n/R8 GOTO else/L9 ( zero/R0 allocptr/R1 exnhandler/R2 v/R5 ) ARITH x/R7 := arr/R4 iadd i/R6 STORE M[ x/R7 + 1 ] := v/R9 ARITHI i/R6 := i/R6 iadd 1 BRANCH IF i/R6 ige n/R8 GOTO else/L10 ( zero/R0 allocptr/R1 exnhandler/R2 v/R5 ) ARITH x/R7 := arr/R4 iadd i/R6 STORE M[ x/R7 + 1 ] := v/R9 ARITHI i/R6 := i/R6 iadd 1 BRANCH IF zero/R0 ieq zero/R0 GOTO g/L2 ( zero/R0 allocptr/R1 exnhandler/R2 i/R6 v/R5 arr/R4 n/R8 v/R9 ) LABEL else/L10: ( zero/R0 allocptr/R1 exnhandler/R2 v/R5 ) FETCHi v/R6 := M[ v/R5 + 0 ] MOVE std_arg/R4 := zero/R0 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL else/L9: ( zero/R0 allocptr/R1 exnhandler/R2 v/R5 ) FETCHi v/R6 := M[ v/R5 + 0 ] MOVE std_arg/R4 := zero/R0 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL v/L3: ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) FETCHi arr/R4 := M[ std_cont/R5 + 1 ] FETCHi v/R5 := M[ std_cont/R5 + 2 ] FETCHi v/R6 := M[ v/R5 + 0 ] JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL v/L4: ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) GETLAB v/R6 := v/L5 STORE M[ allocptr/R1 + 0 ] := v/R6 FETCHi x/R6 := M[ std_cont/R5 + 1 ] STORE M[ allocptr/R1 + 1 ] := x/R6 STORE M[ allocptr/R1 + 2 ] := std_arg/R4 ARITHI closure/R5 := allocptr/R1 iadd 0 ARITHI int10/R8 := zero/R0 iadd 10 GETREAL real4.0/R9 := 4.0 ARITHI new_allocptr/R1 := allocptr/R1 iadd 3 BRANCH IF zero/R0 ieq zero/R0 GOTO array/L1 ( zero/R0 allocptr/R1 exnhandler/R2 n/R8 v/R9 v/R5 ) LABEL v/L5: ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) GETLAB v/R6 := v/L7 STORE M[ allocptr/R1 + 0 ] := v/R6 FETCHi x/R6 := M[ std_cont/R5 + 1 ] STORE M[ allocptr/R1 + 1 ] := x/R6 ARITHI closure/R11 := allocptr/R1 iadd 0 GETREAL real0.0/R10 := 0.0 ARITHI new_allocptr/R1 := allocptr/R1 iadd 2 MOVE k/R8 := zero/R0 BRANCH IF zero/R0 ieq zero/R0 GOTO f/L6 ( zero/R0 allocptr/R1 exnhandler/R2 k/R8 Q/R10 v/R11 X1/R4 closure/R5 ) LABEL f/L6: ( zero/R0 allocptr/R1 exnhandler/R2 k/R8 Q/R10 v/R11 X1/R4 closure/R5 ) ARITHI int10/R6 := zero/R0 iadd 10 BRANCH IF k/R8 ige int10/R6 GOTO else/L11 ( zero/R0 allocptr/R1 exnhandler/R2 v/R11 Q/R10 ) ARITHI v/R9 := k/R8 iadd 1 FETCHi Z1/R6 := M[ closure/R5 + 2 ] ARITH x/R6 := Z1/R6 iadd k/R8 FETCHm v/R7 := M[ x/R6 + 1 ] ARITH x/R6 := X1/R4 iadd k/R8 FETCHm v/R6 := M[ x/R6 + 1 ] ARITH v/R6 := v/R7 fmul v/R6 ARITH v/R10 := Q/R10 fadd v/R6 MOVE k/R8 := v/R9 BRANCH IF zero/R0 ieq zero/R0 GOTO f/L6 ( zero/R0 allocptr/R1 exnhandler/R2 k/R8 Q/R10 v/R11 X1/R4 closure/R5 ) LABEL else/L11: ( zero/R0 allocptr/R1 exnhandler/R2 v/R11 Q/R10 ) FETCHi v/R6 := M[ v/R11 + 0 ] MOVE std_cont/R5 := v/R11 MOVE std_arg/R4 := Q/R10 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) LABEL v/L7: ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) STORE M[ allocptr/R1 + 0 ] := std_arg/R4 ARITHI S/R4 := allocptr/R1 iadd 0 FETCHi v/R5 := M[ std_cont/R5 + 1 ] FETCHi v/R6 := M[ v/R5 + 0 ] ARITHI new_allocptr/R1 := allocptr/R1 iadd 1 JUMP v/R6 ( zero/R0 allocptr/R1 exnhandler/R2 std_cont/R5 std_arg/R4 ) mlton-20100608/benchmark/tests/DATA/ray0000644000076600000240000000006311404435627016107 0ustar mtfstaff100 0 0 0 8 8 8 color sphere /./TEST raytrace stop mlton-20100608/benchmark/tests/DLXSimulator.sml0000644000076600000240000034342411404435630017731 0ustar mtfstaff(* Minor tweaks by Stephen Weeks (sweeks@sweeks.com) on 2001-07-17 to turn into a * benchmark. * Added rand function. *) (* * Matthew Thomas Fluet * Harvey Mudd College * Claremont, CA 91711 * e-mail: Matthew_Fluet@hmc.edu * * A DLX Simulator in Standard ML * * Description: * The DLX Simulator is a partial implementation of the RISC instruction * set described in Patterson's and Hennessy's _Computer Architecture_. * Currently, the DLX Simulator implements the following instructions: * ADD ADDI * ADDU ADDUI * SUB SUBI * SUBU SUBUI * AND ANDI * OR ORI * XOR XORI * * LHI * * SLL SLLI * SRL SRLI * SRA SRAI * * SEQ SEQI * SNE SNEI * SLT SLTI * SGT SGTI * SLE SLEI * SGE SGEI * * LB LBU SB * LH LHU SH * LW SW * * BEQZ BNEZ * J JR * JAL JALR * * TRAP * * NOP * * Currently, the DLX Simulator uses 32 bit words for addressing and * the register file and a 65535 word memory. To augment the memory * a cache can be installed in the simulator, with a number of different * caching options that can be made. Caches can also cache other caches, * so realistic dual level caches can be simulated. Input and output * is limited to requesting and outputing signed integers. * * Usage: * DLXSimulatorCX.run_file : string -> unit * DLXSimulatorCX.run_prog : string list -> unit; * The DLXSimualatorCX family of structures represent different caches * used on the simulator. The following table describes the different * caches used: * C1: a small level 1 cache * DLXSimulatorCX.run_file attempts to open and execute the instructions * in a file. DLXSimulatorCX.run_prog runs a set of instructions as * a list of strings. Four programs are included here. * Simple : simply outputs the number 42. * Twos: performs the twos complement on an inputed number. * Abs: performs the absolute value on an imputed number. * Fact: performs the factorial on an inputed number. * GCD: performs the greatest common divisor on two imputed numbers. * After running, the DLX Simulator outputs a set of statistics * concerning memory reads and writes, and cache hits and misses. * * Future Work: * With the implementation of the PACK_REAL structures * as documented in the SML'97 Basis Library, the remainder * of the DLX instruction set should be implemented. * Currently, without an efficient and correct means of * converting a 32 bit word into a 32 bit float, it is * difficult to incorporate these instructions. * In order to finish following the current development * model, a FPALU structure should be implemented as the * floating point arithmetic-logic unit. * Another possibility for future work would be to * model a pipelined processor. Currently, the DLX Simulator * uses a simple one cycle per instruction model. * It should be possible to break this model and implement * a pipeline, but it would mean a major reworking of the * DLXSimulatorFun functor. * * References: * Patterson, David A. and John L. Hennessy. _Computer Architecture: A * Quantitative Approach: Second Edition_. San Francisco: Morgan * Kaufmann Publishers, Inc., 1996. * *) (* ************************************************************************* *) (* sweeks added rand *) local open Word val seed: word ref = ref 0w13 in (* From page 284 of Numerical Recipes in C. *) fun rand (): word = let val res = 0w1664525 * !seed + 0w1013904223 val _ = seed := res in res end end (* * ImmArray.sml * * The ImmArray structure defines an immutable array implementation. * An immarray is stored internally as a list. * This results in O(n) sub and update functions, as opposed * to O(1) sub and update functions found in Array. However, * immutable arrays are truly immutable, and can be integrated * with a functionally programming style easier than mutable * arrays. * * The ImmArray structure mimics the Array structure as much as possible. * The most obvious deviation is that unit return types in Array are replaced * by 'a immarray return types in ImmArray. Unlike an 'a array, an 'a immarray * is an equality type if and only if 'a is an equality type. Further immarray * equality is structural, rather than the "creation" equality used by Array. * Additionally, no vector type is supported, and consequently no copyVec * function is supported. Finally, the functions mapi and map provide * similar functionality as modifyi and modify, but relax the constraint that * the argument function need be of type 'a -> 'a. * * Future Work : There are random-access list implementations * that support O(log n) sub and update functions, * which may provide a faster implementation, although * possibly at the expense of space and the ease of * implementing app, foldl, foldr, modify, and map functions. *) signature IMMARRAY = sig type 'a immarray; val maxLen : int; val immarray : (int * 'a) -> 'a immarray; val fromList : 'a list -> 'a immarray; val toList : 'a immarray -> 'a list; val tabulate : int * (int -> 'a) -> 'a immarray; val length : 'a immarray -> int; val sub : 'a immarray * int -> 'a; val update : 'a immarray * int * 'a -> 'a immarray; val extract : 'a immarray * int * int option -> 'a immarray; val copy : {src : 'a immarray, si : int, len : int option, dst : 'a immarray, di : int} -> 'a immarray; val appi : (int * 'a -> unit) -> ('a immarray * int * int option) -> unit; val app : ('a -> unit) -> 'a immarray -> unit; val foldli : ((int * 'a * 'b) -> 'b) -> 'b -> ('a immarray * int * int option) -> 'b; val foldri : ((int * 'a * 'b) -> 'b) -> 'b -> ('a immarray * int * int option) -> 'b; val foldl : (('a * 'b) -> 'b) -> 'b -> 'a immarray -> 'b; val foldr : (('a * 'b) -> 'b) -> 'b -> 'a immarray -> 'b; val mapi : ((int * 'a) -> 'b) -> ('a immarray * int * int option) -> 'b immarray; val map : ('a -> 'b) -> 'a immarray -> 'b immarray; val modifyi : ((int * 'a) -> 'a) -> ('a immarray * int * int option) -> 'a immarray; val modify : ('a -> 'a) -> 'a immarray -> 'a immarray; end; structure ImmArray : IMMARRAY = struct (* datatype 'a immarray * An immarray is stored internally as a list. * The use of a constructor prevents list functions from * treating immarray type as a list. *) datatype 'a immarray = IA of 'a list; (* val maxLen : int * The maximum length of immarrays supported. * Technically, under this implementation, the maximum length * of immarrays is the same as the maximum length of a list, * but for convience and compatibility, use the Array structure's * maximum length. *) val maxLen = Array.maxLen; (* val tabulate : int * (int -> 'a) -> 'a immarray * val immarray : int * 'a -> 'a immarray * val fromList : 'a list -> 'a immarray * val toList : 'a immarray -> 'a list * val length : 'a immarray -> int * These functions perform basic immarray functions. * The tabulate, immarray, and fromList functions create an immarray. * The toList function converts an immarray to a list. * The length function returns the length of an immarray. *) fun tabulate (n, initfn) = IA (List.tabulate (n, initfn)); fun immarray (n, init) = tabulate (n, fn _ => init); fun fromList l = IA l; fun toList (IA ia) = ia; fun length (IA ia) = List.length ia; (* val sub : 'a immarray * int -> 'a * val update : 'a immarray * int * 'a -> 'a immarray * These functions sub and update an immarray by index. *) fun sub (IA ia, i) = List.nth (ia, i); fun update (IA ia, i, x) = IA ((List.take (ia, i)) @ (x::(List.drop (ia, i + 1)))); (* val extract : 'a immarray * int * int option -> 'a immarray * This function extracts an immarray slice from an immarray from * one index either through the rest of the immarray (NONE) * or for n elements (SOME n), as described in the * Standard ML Basis Library. *) fun extract (IA ia, i, NONE) = IA (List.drop (ia, i)) | extract (IA ia, i, SOME n) = IA (List.take (List.drop (ia, i), n)); (* val copy : {src : 'a immarray, si : int, len : int option, dst : 'a immarray, di : int} -> 'a immarray * This function copies an immarray slice from src into dst starting * at the di element. *) fun copy {src, si, len, dst=IA ia, di} = let val IA sia = extract (src, si, len); val pre = List.take (ia, di); val post = case len of NONE => List.drop (ia, di+(List.length sia)) | SOME n => List.drop (ia, di+n); in IA (pre @ sia @ post) end; (* val appi : ('a * int -> unit) -> ('a immarray * int * int option) * -> unit * val app : ('a -> unit) -> 'a immarray -> unit * These functions apply a function to every element * of an immarray. The appi function also provides the * index of the element as an argument to the applied function * and uses an immarray slice argument. *) local fun appi_aux f i [] = () | appi_aux f i (h::t) = (f(i,h); appi_aux f (i + 1) t); in fun appi f (IA ia, i, len) = let val IA sia = extract (IA ia, i, len); in appi_aux f i sia end; end; fun app f immarr = appi (f o #2) (immarr, 0, NONE); (* val foldli : (int * 'a * 'b -> 'b) -> 'b * -> ('a immarray * int * int option) -> 'b; * val foldri : (int * 'a * 'b -> 'b) -> 'b * -> ('a immarray * int * int option) -> 'b; * val foldl : ('a * 'b -> 'b) -> 'b -> 'a immarray -> 'b * val foldr : ('a * 'b -> 'b) -> 'b -> 'a immarray -> 'b * These functions fold a function over every element * of an immarray. The foldri and foldli functions also provide * the index of the element as an argument to the folded function * and uses an immarray slice argument. *) local fun foldli_aux f b i [] = b | foldli_aux f b i (h::t) = foldli_aux f (f(i,h,b)) (i+1) t; fun foldri_aux f b i [] = b | foldri_aux f b i (h::t) = f(i,h,foldri_aux f b (i+1) t); in fun foldli f b (IA ia, i, len) = let val IA ia2 = extract (IA ia, i, len); in foldli_aux f b i ia2 end; fun foldri f b (IA ia, i, len) = let val IA ia2 = extract (IA ia, i, len); in foldri_aux f b i ia2 end; end; fun foldl f b (IA ia) = foldli (fn (_,i,x) => f(i,x)) b (IA ia, 0, NONE); fun foldr f b (IA ia) = foldri (fn (_,i,x) => f(i,x)) b (IA ia, 0, NONE); (* val mapi : ('a * int -> 'b) -> 'a immarray -> 'b immarray * val map : ('a -> 'b) -> 'a immarray -> 'b immarray * These functions map a function over every element * of an immarray. The mapi function also provides the * index of the element as an argument to the mapped function * and uses an immarray slice argument. Although there are * similarities between mapi and modifyi, note that when mapi is * used with an immarray slice, the resulting immarray is the * same size as the slice. This is necessary to preserve the * type of the resulting immarray. Thus, mapi with the identity * function reduces to the extract function. *) local fun mapi_aux f i [] = [] | mapi_aux f i (h::t) = (f (i,h))::(mapi_aux f (i + 1) t); in fun mapi f (IA ia, i, len) = let val IA ia2 = extract (IA ia, i, len); in IA (mapi_aux f i ia2) end; end; fun map f (IA ia)= mapi (f o #2) (IA ia, 0, NONE); (* val modifyi : (int * 'a -> 'a) -> ('a immarray * int * int option) * -> 'a immarray * val modify : ('a -> 'a) -> 'a immarray -> 'a immarray * These functions apply a function to every element of an immarray * in left to right order and returns a new immarray where corresponding * elements are replaced by their modified values. The modifyi * function also provides the index of the element as an argument * to the mapped function and uses an immarray slice argument. *) local fun modifyi_aux f i [] = [] | modifyi_aux f i (h::t) = (f (i,h))::(modifyi_aux f (i + 1) t); in fun modifyi f (IA ia, i, len) = let val pre = List.take (ia, i); val IA ia2 = extract (IA ia, i, len); val post = case len of NONE => [] | SOME n => List.drop (ia, i+n); in IA (pre @ (modifyi_aux f i ia2) @ post) end; end; fun modify f (IA ia) = modifyi (f o #2) (IA ia, 0, NONE); end; (* ************************************************************************* *) (* * ImmArray2.sml * * The ImmArray2 structure defines a two dimensional immutable array * implementation. An immarray2 is stored internally as an immutable * array of immutable arrays. As such, the ImmArray2 makes heavy use * of the ImmArray structure. * * The ImmArray2 structure mimics the Array2 structure as much as possible. * The most obvious deviation is that unit return types in Array2 are replaced * by 'a immarray2 return types in ImmArray2. Unlike an 'a array, * an 'a immarray2 is an equality type if and only if 'a is an equality type. * Further immarray2 equality is structural, rather than the "creation" * equality used by Array2. Also, the 'a region type is not included in * ImmArray2, but all functions in Array2 that require 'a regions are present * with arguments taken in the natural order. Finally, the functions mapi * and map provide similar functionality as modifyi and modify, but relax * the constraint that the argument function need be of type 'a -> 'a. *) signature IMMARRAY2 = sig type 'a immarray2; datatype traversal = RowMajor | ColMajor val immarray2 : int * int * 'a -> 'a immarray2; val tabulate : traversal -> int * int * ((int * int) -> 'a) -> 'a immarray2; val fromList : 'a list list -> 'a immarray2; val dimensions : 'a immarray2 -> int * int; val sub : 'a immarray2 * int * int -> 'a; val update : 'a immarray2 * int * int * 'a -> 'a immarray2; val extract : 'a immarray2 * int * int * int option * int option -> 'a immarray2; val copy : {src : 'a immarray2, si : int, sj : int, ilen : int option, jlen : int option, dst : 'a immarray2, di : int, dj : int} -> 'a immarray2; val nRows : 'a immarray2 -> int; val nCols : 'a immarray2 -> int; val row : 'a immarray2 * int -> 'a ImmArray.immarray; val column : 'a immarray2 * int -> 'a ImmArray.immarray; val appi : traversal -> (int * int * 'a -> unit) -> ('a immarray2 * int * int * int option * int option) -> unit; val app : traversal -> ('a -> unit) -> 'a immarray2 -> unit; val foldli : traversal -> ((int * int * 'a * 'b) -> 'b) -> 'b -> ('a immarray2 * int * int * int option * int option) -> 'b val foldri : traversal -> ((int * int * 'a * 'b) -> 'b) -> 'b -> ('a immarray2 * int * int * int option * int option) -> 'b val foldl : traversal -> (('a * 'b) -> 'b) -> 'b -> 'a immarray2 -> 'b val foldr : traversal -> (('a * 'b) -> 'b) -> 'b -> 'a immarray2 -> 'b val mapi : traversal -> (int * int * 'a -> 'b) -> ('a immarray2 * int * int * int option * int option) -> 'b immarray2; val map : traversal -> ('a -> 'b) -> 'a immarray2 -> 'b immarray2; val modifyi : traversal -> ((int * int * 'a) -> 'a) -> ('a immarray2 * int * int * int option * int option) -> 'a immarray2; val modify : traversal -> ('a -> 'a) -> 'a immarray2 -> 'a immarray2; end; structure ImmArray2 : IMMARRAY2 = struct (* datatype 'a immarray2 * An immarray2 is stored internally as an immutable array * of immutable arrays. The use of a contructor prevents ImmArray * functions from treating the immarray2 type as an immarray. *) datatype 'a immarray2 = IA2 of 'a ImmArray.immarray ImmArray.immarray; datatype traversal = RowMajor | ColMajor (* val tabulate : traversal -> int * int * (int * int -> 'a) * -> 'a immarray2 * val immarray2 : int * int * 'a -> 'a immarray2 * val fromList : 'a list list -> 'a immarray2 * val dmensions : 'a immarray2 -> int * int * These functions perform basic immarray2 functions. * The tabulate and immarray2 functions create an immarray2. * The fromList function converts a list of lists into an immarray2. * Unlike Array2.fromList, fromList will accept lists of different * lengths, allowing one to create an immarray2 in which the * rows have different numbers of columns, although it is likely that * exceptions will be raised when other ImmArray2 functions are applied * to such an immarray2. Note that dimensions will return the * number of columns in row 0. * The dimensions function returns the dimensions of an immarray2. *) fun tabulate RowMajor (r, c, initfn) = let fun initrow r = ImmArray.tabulate (c, fn ic => initfn (r,ic)); in IA2 (ImmArray.tabulate (r, fn ir => initrow ir)) end | tabulate ColMajor (r, c, initfn) = turn (tabulate RowMajor (c,r, fn (c,r) => initfn(r,c))) and immarray2 (r, c, init) = tabulate RowMajor (r, c, fn (_, _) => init) and fromList l = IA2 (ImmArray.tabulate (length l, fn ir => ImmArray.fromList (List.nth(l,ir)))) and dimensions (IA2 ia2) = (ImmArray.length ia2, ImmArray.length (ImmArray.sub (ia2, 0))) (* turn : 'a immarray2 -> 'a immarray2 * This function reverses the rows and columns of an immarray2 * to allow handling of ColMajor traversals. *) and turn ia2 = let val (r,c) = dimensions ia2; in tabulate RowMajor (c,r,fn (cc,rr) => sub (ia2,rr,cc)) end (* val sub : 'a immarray2 * int * int -> 'a * val update : 'a immarray2 * int * int * 'a -> 'a immarray2 * These functions sub and update an immarray2 by indices. *) and sub (IA2 ia2, r, c) = ImmArray.sub(ImmArray.sub (ia2, r), c); fun update (IA2 ia2, r, c, x) = IA2 (ImmArray.update (ia2, r, ImmArray.update (ImmArray.sub (ia2, r), c, x))); (* val extract : 'a immarray2 * int * int * * int option * int option -> 'a immarray2 * This function extracts a subarray from an immarray2 from * one pair of indices either through the rest of the * immarray2 (NONE, NONE) or for the specfied number of elements. *) fun extract (IA2 ia2, i, j, rlen, clen) = IA2 (ImmArray.map (fn ia => ImmArray.extract (ia, j, clen)) (ImmArray.extract (ia2, i, rlen))); (* val nRows : 'a immarray2 -> int * val nCols : 'a immarray2 -> int * These functions return specific dimensions of an immarray2. *) fun nRows (IA2 ia2) = (#1 o dimensions) (IA2 ia2); fun nCols (IA2 ia2) = (#2 o dimensions) (IA2 ia2); (* val row : immarray2 * int -> ImmArray.immarray * val column : immarray2 * int -> ImmArray.immarray * These functions extract an entire row or column from * an immarray2 by index, returning the row or column as * an ImmArray.immarray. *) fun row (ia2, r) = let val (c, _) = dimensions ia2; in ImmArray.tabulate (c, fn i => sub (ia2, r, i)) end; fun column (ia2, c) = let val (_, r) = dimensions ia2; in ImmArray.tabulate (r, fn i => sub (ia2, i, c)) end; (* val copy : {src : 'a immarray2, si : int, sj : int, * ilen : int option, jlen : int option, * dst : 'a immarray2, di : int, dj : int}; * This function copies an immarray2 slice from src int dst starting * at the di,dj element. *) fun copy {src, si, sj, ilen, jlen, dst=IA2 ia2, di, dj} = let val nilen = case ilen of NONE => SOME ((nRows src) - si) | SOME n => SOME n; in IA2 (ImmArray.modifyi (fn (r, ia) => ImmArray.copy {src=row (src, si+r-di), si=sj, len=jlen, dst=ia, di=dj}) (ia2, di, nilen)) end; (* val appi : traversal -> ('a * int * int -> unit) -> 'a immarray2 * -> unit * val app : traversal -> ('a -> unit) -> 'a immarray2 -> unit * These functions apply a function to every element * of an immarray2. The appi function also provides the * indices of the element as an argument to the applied function * and uses an immarray2 slice argument. *) fun appi RowMajor f (IA2 ia2, i, j, rlen, clen) = ImmArray.appi (fn (r,ia) => ImmArray.appi (fn (c,x) => f(r,c,x)) (ia, j, clen)) (ia2, i, rlen) | appi ColMajor f (ia2, i, j, rlen, clen) = appi RowMajor (fn (c,r,x) => f(r,c,x)) (turn ia2, j, i, clen, rlen); fun app tr f (IA2 ia2) = appi tr (f o #3) (IA2 ia2, 0, 0, NONE, NONE); (* val foldli : traversal -> ((int * int * 'a * 'b) -> 'b) -> 'b * -> ('a immarray2 * int * int * int option * int option) * -> 'b * val foldri : traversal -> ((int * int * 'a * 'b) -> 'b) -> 'b * -> ('a immarray2 * int * int * int option * int option) * -> 'b * val foldl : traversal -> ('a * 'b -> 'b) -> 'b -> 'a immarray2 -> 'b * val foldr : traversal -> ('a * 'b -> 'b) -> 'b -> 'a immarray2 -> 'b * These functions fold a function over every element * of an immarray2. The foldri and foldli functions also provide * the index of the element as an argument to the folded function * and uses an immarray2 slice argument. *) fun foldli RowMajor f b (IA2 ia2, i, j, rlen, clen) = ImmArray.foldli (fn (r,ia,b) => ImmArray.foldli (fn (c,x,b) => f(r,c,x,b)) b (ia, j, clen)) b (ia2, i, rlen) | foldli ColMajor f b (ia2, i, j, rlen, clen) = foldli RowMajor (fn (c,r,x,b) => f(r,c,x,b)) b (turn ia2, j, i, clen, rlen); fun foldri RowMajor f b (IA2 ia2, i, j, rlen, clen) = ImmArray.foldri (fn (r,ia,b) => ImmArray.foldri (fn (c,x,b) => f(r,c,x,b)) b (ia, j, clen)) b (ia2, i, rlen) | foldri ColMajor f b (ia2, i, j, rlen, clen) = foldri RowMajor (fn (c,r,x,b) => f(r,c,x,b)) b (turn ia2, j, i, clen, rlen); fun foldl tr f b (IA2 ia2) = foldli tr (fn (_,_,x,b) => f(x,b)) b (IA2 ia2, 0, 0, NONE, NONE); fun foldr tr f b (IA2 ia2) = foldri tr (fn (_,_,x,b) => f(x,b)) b (IA2 ia2, 0, 0, NONE, NONE); (* val mapi : traversal -> ('a * int * int -> 'b) -> 'a immarray2 * -> 'b immarray2 * val map : traversal -> ('a -> 'b) -> 'a immarray2 -> 'b immarray2 * These functions map a function over every element * of an immarray2. The mapi function also provides the * indices of the element as an argument to the mapped function * and uses an immarray2 slice argument. Although there are * similarities between mapi and modifyi, note that when mapi is * used with an immarray2 slice, the resulting immarray2 is the * same size as the slice. This is necessary to preserve the * type of the resulting immarray2. Thus, mapi with the identity * function reduces to the extract function. *) fun mapi RowMajor f (IA2 ia2, i, j, rlen, clen) = IA2 (ImmArray.mapi (fn (r,ia) => ImmArray.mapi (fn (c,x) => f(r,c,x)) (ia, j, clen)) (ia2, i, rlen)) | mapi ColMajor f (ia2, i, j, rlen, clen) = turn (mapi RowMajor (fn (c,r,x) => f(r,c,x)) (turn ia2, j, i, clen, rlen)) fun map tr f (IA2 ia2) = mapi tr (f o #3) (IA2 ia2, 0, 0, NONE, NONE); (* val modifyi : traversal -> (int * int* 'a -> 'a) -> ('a immarray2 * int * int * int option * int option) * -> 'a immarray2 * val modify : traversal -> ('a -> 'a) -> 'a immarray2 -> 'a immarray2 * These functions apply a function to every element of an immarray2 * in row by column order and returns a new immarray2 where corresponding * elements are replaced by their modified values. The modifyi * function also provides the index of the element as an argument * to the mapped function and uses an immarray2 slice argument. *) fun modifyi RowMajor f (IA2 ia2, i, j, rlen, clen) = IA2 (ImmArray.modifyi (fn (r,ia) => ImmArray.modifyi (fn (c,x) => f(r,c,x)) (ia, j, clen)) (ia2, i, rlen)) | modifyi ColMajor f (ia2, i, j, rlen, clen) = turn (modifyi RowMajor (fn (c,r,x) => f(r,c,x)) (turn ia2, j, i, clen, rlen)); fun modify tr f (IA2 ia2) = modifyi tr (f o #3) (IA2 ia2, 0, 0, NONE, NONE); end; (* ************************************************************************* *) (* * RegisterFile.sig * * This defines the exported datatype and functions provided by the * register file. The datatype registerfile provides the encapsulation * of the register file, InitRegisterFile initializes the registerfile, * setting all registers to zero and setting r0, gp, sp, and fp to * their appropriate values, LoadRegister takes a registerfile and * an integer corresponding to the register, and returns the * Word32.word value at that register, and StoreRegister takes a * registerfile, an integer corresponding to the register, and a * Word32.word and returns the registerfile updated with the word * stored in the appropriate register. *) signature REGISTERFILE = sig type registerfile; val InitRegisterFile : unit -> registerfile; val LoadRegister : registerfile * int -> Word32.word; val StoreRegister : registerfile * int * Word32.word -> registerfile; end; (*****************************************************************************) (* * RegisterFile.sml * * This defines the RegisterFile structure, which provides the * functionality of the register file. The datatype registerfile * provides the encapsulation of the register file, InitRegisterFile * initializes the registerfile, setting all registers to zero and * setting r0, gp, sp, and fp to their appropriate values, * LoadRegister takes a registerfile and an integer corresponding to * the register, and returns the Word32.word value at that register, * and StoreRegister takes a registerfile, an integer corresponding to * the register, and a Word32.word and returns the registerfile * updated with the word stored in the appropriate register. * * The underlying structure of registerfile is an immutable array of * Word32.word. *) structure RegisterFile : REGISTERFILE = struct type registerfile = Word32.word ImmArray.immarray; fun InitRegisterFile () = ImmArray.update (ImmArray.update (ImmArray.update (ImmArray.update (ImmArray.immarray(32, 0wx00000000 : Word32.word), 00, 0wx00000000 : Word32.word), 28, 0wx00000000 : Word32.word), 29, 0wx00040000 : Word32.word), 30, 0wx00040000 : Word32.word) : registerfile; fun LoadRegister (rf, reg) = ImmArray.sub(rf, reg); fun StoreRegister (rf, reg, data) = ImmArray.update(rf, reg, data); end; (*****************************************************************************) (* * ALU.sig * * This defines the exported datatype and function provided by the * ALU. The datatype ALUOp provides a means to specify which * operation is to be performed by the ALU, and PerformAL performs * one of the operations on two thirty-two bit words, returning the * result as a thirty-two bit word. *) signature ALU = sig datatype ALUOp = SLL | SRL | SRA | ADD | ADDU | SUB | SUBU | AND | OR | XOR | SEQ | SNE | SLT | SGT | SLE | SGE; val PerformAL : (ALUOp * Word32.word * Word32.word) -> Word32.word; end; (*****************************************************************************) (* * ALU.sml * * This defines the ALU structure, which provides the functionality of * an Arithmetic/Logic Unit. The datatype ALUOp provides a means to * specify which operation is to be performed by the ALU, and * PerformAL performs one of the operations on two thirty-two bit * words, returning the result as a thirty-two bit word. * * A note about SML'97 Basis Library implementation of thirty-two bit * numbers: the Word32.word is an unsigned thirty-two bit integer, * while Int.int (equivalent to Int.int) is a signed thirty-two * bit integer. In order to perform the signed operations, it is * necessary to convert the words to signed form, using the * Word32.toIntX function, which performs sign extension, * and to convert the result back into unsigned form using the * Word32.fromInt function. In addition, to perform a shift, * the second Word32.word needs to be "downsized" to a normal * Word.word using the Word.fromWord function. *) structure ALU : ALU = struct datatype ALUOp = SLL | SRL | SRA | ADD | ADDU | SUB | SUBU | AND | OR | XOR | SEQ | SNE | SLT | SGT | SLE | SGE; fun PerformAL (opcode, s1, s2) = (case opcode of SLL => Word32.<< (s1, Word.fromLarge (Word32.toLarge s2)) | SRL => Word32.>> (s1, Word.fromLarge (Word32.toLarge s2)) | SRA => Word32.~>> (s1, Word.fromLarge (Word32.toLarge s2)) | ADD => Word32.fromInt (Int.+ (Word32.toIntX s1, Word32.toIntX s2)) | ADDU => Word32.+ (s1, s2) | SUB => Word32.fromInt (Int.- (Word32.toIntX s1, Word32.toIntX s2)) | SUBU => Word32.- (s1, s2) | AND => Word32.andb (s1, s2) | OR => Word32.orb (s1, s2) | XOR => Word32.xorb (s1, s2) | SEQ => if (s1 = s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SNE => if not (s1 = s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SLT => if Int.< (Word32.toIntX s1, Word32.toIntX s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SGT => if Int.> (Word32.toIntX s1, Word32.toIntX s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SLE => if Int.<= (Word32.toIntX s1, Word32.toIntX s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word | SGE => if Int.>= (Word32.toIntX s1, Word32.toIntX s2) then 0wx00000001 : Word32.word else 0wx00000000 : Word32.word) (* * This handle will handle all ALU errors, most * notably overflow and division by zero, and will * print an error message and return 0. *) handle _ => (print "Error : ALU returning 0\n"; 0wx00000000 : Word32.word); end; (*****************************************************************************) (* * Memory.sig * * This defines the exported datatype and functions provided by * memory. The datatype memory provides the encapsulation * of memory, InitMemory initializes memory, setting all * addresses to zero, LoadWord takes memory and * a Word32.word corresponding to the address, and returns the * Word32.word value at that address, StoreWord takes memory, * a Word32.word corresponding to the address, and a * Word32.word and returns memory updated with the word * stored at the appropriate address. LoadHWord, LoadHWordU, * LoadByte, and LoadByteU load halfwords, unsigned halfwords, * bytes, and unsigned bytes respectively from memory into the * lower portion of the returned Word32.word. StoreHWord and * StoreByte store halfwords and bytes taken from the lower portion * of the Word32.word into memory. * GetStatistics takes memory and returns the read and write * statistics as a string. *) signature MEMORY = sig type memory; val InitMemory : unit -> memory; val LoadWord : memory * Word32.word -> memory * Word32.word; val StoreWord : memory * Word32.word * Word32.word -> memory; val LoadHWord : memory * Word32.word -> memory * Word32.word; val LoadHWordU : memory * Word32.word -> memory * Word32.word; val StoreHWord : memory * Word32.word * Word32.word -> memory; val LoadByte : memory * Word32.word -> memory * Word32.word; val LoadByteU : memory * Word32.word -> memory * Word32.word; val StoreByte : memory * Word32.word * Word32.word -> memory; val GetStatistics : memory -> string; end; (*****************************************************************************) (* * Memory.sml * * This defines the Memory structure, which provides the functionality * of memory. The datatype memory provides the encapsulation of * memory, InitMemory initializes memory, setting all * addresses to zero, LoadWord takes memory and * a Word32.word corresponding to the address, and returns the * Word32.word value at that address and the updated memory, * StoreWord takes memory, a Word32.word corresponding to the * address, and a Word32.word and returns memory updated with the word * stored at the appropriate address. LoadHWord, LoadHWordU, * LoadByte, and LoadByteU load halfwords, unsigned halfwords, * bytes, and unsigned bytes respectively from memory into the * lower portion of the returned Word32.word. StoreHWord and * StoreByte store halfwords and bytes taken from the lower portion * of the Word32.word into memory. * GetStatistics takes memory and returns the read and write * statistics as a string. * * The underlying structure of memory is an immutable array of Word32.word. * The array has a length of 0x10000, since every element of the array * corresponds to a thirty-two bit integer. * * Also, the functions AlignWAddress and AlignHWAddress aligns a memory * address to a word and halfword address, respectively. If LoadWord, * StoreWord, LoadHWord, LoadHWordU, or StoreHWord is asked to access an * unaligned address, it writes an error message, and uses the address * rounded down to the aligned address. *) structure Memory : MEMORY = struct type memory = Word32.word ImmArray.immarray * (int * int); fun InitMemory () = (ImmArray.immarray(Word32.toInt(0wx10000 : Word32.word), 0wx00000000 : Word32.word), (0, 0)) : memory; fun AlignWAddress address = Word32.<< (Word32.>> (address, 0wx0002), 0wx0002); fun AlignHWAddress address = Word32.<< (Word32.>> (address, 0wx0001), 0wx0001); (* Load and Store provide errorless access to memory. * They provide a common interface to memory, while * the LoadX and StoreX specifically access words, * halfwords and bytes, requiring address to be aligned. * In Load and Store, two intermediate values are * generated. The value aligned_address is the aligned * version of the given address, and is used to compare with * the original address to determine if it was aligned. The * value use_address is equivalent to aligned_address divided * by four, and it corresponds to the index of the memory * array where the corresponding aligned address can be found. *) fun Load ((mem, (reads, writes)), address) = let val aligned_address = AlignWAddress address; val use_address = Word32.>> (aligned_address, 0wx0002); in ((mem, (reads + 1, writes)), ImmArray.sub(mem, Word32.toInt(use_address))) end; fun Store ((mem, (reads, writes)), address, data) = let val aligned_address = AlignWAddress address; val use_address = Word32.>> (aligned_address, 0wx0002); in (ImmArray.update(mem, Word32.toInt(use_address), data), (reads, writes + 1)) end; fun LoadWord (mem, address) = let val aligned_address = if address = AlignWAddress address then address else (print "Error LW: Memory using aligned address\n"; AlignWAddress address); in Load(mem, aligned_address) end; fun StoreWord (mem, address, data) = let val aligned_address = if address = AlignWAddress address then address else (print "Error SW: Memory using aligned address\n"; AlignWAddress address); in Store(mem, aligned_address, data) end; fun LoadHWord (mem, address) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error LH: Memory using aligned address\n"; AlignHWAddress address); val (nmem,l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0010), 0wx0010) | 0wx00000010 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0000), 0wx0010) | _ => (print "Error LH: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun LoadHWordU (mem, address) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error LHU: Memory using aligned address\n"; AlignHWAddress address); val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0010), 0wx0010) | 0wx00000010 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0000), 0wx0010) | _ => (print "Error LHU: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun StoreHWord (mem, address, data) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error SH: Memory using aligned address\n"; AlignWAddress address); val (_, s_word) = Load(mem, aligned_address); in case aligned_address of 0wx00000000 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFF0000 : Word32.word, s_word), Word32.<<(Word32.andb(0wx0000FFFF : Word32.word, data), 0wx0000))) | 0wx00000010 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wx0000FFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx0000FFFF : Word32.word, data), 0wx0010))) | _ => (print "Error SH: Memory unchanged\n"; mem) end; fun LoadByte (mem, address) = let val aligned_address = address; val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0018), 0wx0018) | 0wx00000008 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0010), 0wx0018) | 0wx00000010 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0008), 0wx0018) | 0wx00000018 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0000), 0wx0018) | _ => (print "Error LB: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun LoadByteU (mem, address) = let val aligned_address = address; val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0018), 0wx0018) | 0wx00000008 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0010), 0wx0018) | 0wx00000010 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0008), 0wx0018) | 0wx00000018 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0000), 0wx0018) | _ => (print "Error LBU: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun StoreByte (mem, address, data) = let val aligned_address = address; val (_, s_word) = Load(mem, aligned_address); in case aligned_address of 0wx00000000 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFFFF00 : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0000))) | 0wx00000008 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFF00FF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0008))) | 0wx00000010 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFF00FFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0010))) | 0wx00000018 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wx00FFFFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0018))) | _ => (print "Error SB: Memory unchanged\n"; mem) end; fun GetStatistics (mem, (reads, writes)) = "Memory :\n" ^ "Memory Reads : " ^ (Int.toString reads) ^ "\n" ^ "Memory Writes : " ^ (Int.toString writes) ^ "\n"; end; (*****************************************************************************) (* * CacheSpec.sig * * This defines the signature that outlines the specifications to * describe a cache. The two datatypes are given to provide clear * means of differentiating between the write hit and write miss * options. CacheName can be any string describing the cache. * CacheSize is an integer that represents the total number of words * in the cache. BlockSize is an integer that represents the total * number of words in a block. Associativity is an integer that * represents the associativity of the cache. WriteHit and WriteMiss * represent the write hit and write miss options to be implemented by * this cache. *) signature CACHESPEC = sig datatype WriteHitOption = Write_Through | Write_Back; datatype WriteMissOption = Write_Allocate | Write_No_Allocate; val CacheName : string; val CacheSize : int; val BlockSize : int; val Associativity : int; val WriteHit : WriteHitOption; val WriteMiss : WriteMissOption; end; (*****************************************************************************) (* * CachedMemory.sml * * This defines the CachedMemory functor, which provides the * functionality of a cached memory and which takes two structures, * corresponding to the cache specification and the the level of * memory which the cache will be caching. The datatype memory * provides the encapsulation of the cache along with the memory * system that is being cached, InitMemory initializes the cache and * the memory system that is being cached, LoadWord takes memory and a * Word32.word corresponding to the address, and returns the * Word32.word at that address and the updated cache and memory, * StoreWord takes memory, a Word32.word corresponding to the address, * and a Word32.word and returns the cache and memory updated with the * stored at the appropriate address. LoadHWord, LoadHWordU, * LoadByte, and LoadByteU load halfwords, unsigned halfwords, * bytes, and unsigned bytes respectively from memory into the * lower portion of the returned Word32.word. StoreHWord and * StoreByte store halfwords and bytes taken from the lower portion * of the Word32.word into memory. * GetStatistics takes memory and returns the read and write * statistics as a string. * * The underlying structure of cache is a two dimensional array of * cache lines, where a cache line consists of a valid bit, dirty bit, * a tag and a block of words, as a Word32.word array. * The size of the cache, the associativity, and the block size are * specified by the cache specification. * * Also, the functions AlignWAddress and AlignHWAddress aligns a memory * address to a word and halfword address, respectively. If LoadWord, * StoreWord, LoadHWord, LoadHWordU, or StoreHWord is asked to access an * unaligned address, it writes an error message, and uses the address * rounded down to the aligned address. *) functor CachedMemory (structure CS : CACHESPEC; structure MEM : MEMORY;) : MEMORY = struct type cacheline = bool * bool * Word32.word * Word32.word ImmArray.immarray; type cacheset = cacheline ImmArray.immarray; type cache = cacheset ImmArray.immarray; type memory = (cache * (int * int * int * int)) * MEM.memory; (* Performs log[base2] on an integer. *) fun exp2 0 = 1 | exp2 n = 2 * (exp2 (n-1)) fun log2 x = let fun log2_aux n = if exp2 n > x then (n-1) else log2_aux (n+1) in log2_aux 0 end open CS; (* * The following values of index size and field bits are * calculated from the values in the cache specification * structure. *) val IndexSize = CacheSize div (BlockSize * Associativity); val BlockOffsetBits = log2 (BlockSize * 4); val IndexBits = log2 IndexSize; val TagBits = 32 - BlockOffsetBits - IndexBits; (* * RandEntry returns a random number between * [0, Associativity - 1]. It is used to determine * replacement of data in the cache. *) val RandEntry = let val modulus = Word.fromInt(Associativity - 1) in fn () => Word.toInt(Word.mod(rand (), modulus)) end (* * The InitCache function initializes the cache to * not-valid, not-dirty, 0wx00000000 tag, blocks initialized * to 0wx00000000. *) fun InitCache () = let val cacheline = (false, false, 0wx00000000 : Word32.word, ImmArray.immarray (BlockSize, 0wx00000000 : Word32.word)); val cacheset = ImmArray.immarray (Associativity, cacheline); in (ImmArray.immarray (IndexSize, cacheset), (0, 0, 0, 0)) end; (* * The InitMemory function initializes the cache * and the memory being cached. *) fun InitMemory () = (InitCache (), MEM.InitMemory ()) : memory; (* * GetTag returns the Word32.word corresponding to the tag field of * address *) fun GetTag address = Word32.>> (address, Word.fromInt (IndexBits + BlockOffsetBits)); (* * GetIndex returns the Word32.word corresponding to the index * field of address. *) fun GetIndex address = let val mask = Word32.notb (Word32.<< (Word32.>> (0wxFFFFFFFF : Word32.word, Word.fromInt (IndexBits + BlockOffsetBits)), Word.fromInt (IndexBits + BlockOffsetBits))); in Word32.>> (Word32.andb (address, mask), Word.fromInt (BlockOffsetBits)) end; (* * GetBlockOffset returns the Word32.word corresponding to the * block offset field of address. *) fun GetBlockOffset address = let val mask = Word32.notb (Word32.<< (Word32.>> (0wxFFFFFFFF : Word32.word, Word.fromInt BlockOffsetBits), Word.fromInt BlockOffsetBits)); in Word32.andb (address, mask) end; (* * The InCache* family of functions returns a boolean value * that determines if the word specified by address is in the * cache at the current time (and that the data is valid). *) fun InCache_aux_entry ((valid, dirty, tag, block), address) = tag = (GetTag address) andalso valid; fun InCache_aux_set (set, address) = ImmArray.foldr (fn (entry, result) => (InCache_aux_entry (entry, address)) orelse result) false set; fun InCache (cac, address) = InCache_aux_set (ImmArray.sub (cac, Word32.toInt (GetIndex address)), address); (* * The ReadCache* family of functions returns the Word32.word * stored at address in the cache. *) fun ReadCache_aux_entry ((valid, dirty, tag, block), address) = ImmArray.sub (block, Word32.toInt (Word32.>> (GetBlockOffset address, 0wx0002))); fun ReadCache_aux_set (set, address) = ImmArray.foldr (fn (entry, result) => if InCache_aux_entry (entry, address) then ReadCache_aux_entry (entry, address) else result) (0wx00000000 : Word32.word) set; fun ReadCache (cac, address) = ReadCache_aux_set (ImmArray.sub (cac, Word32.toInt(GetIndex address)), address); (* * The WriteCache* family of functions returns the updated * cache with data stored at address. *) fun WriteCache_aux_entry ((valid, dirty, tag, block), address, data) = let val ndirty = case WriteHit of Write_Through => false | Write_Back => true; in (true, ndirty, tag, ImmArray.update (block, Word32.toInt (Word32.>> (GetBlockOffset address, 0wx0002)), data)) end; fun WriteCache_aux_set (set, address, data) = ImmArray.map (fn entry => if InCache_aux_entry (entry, address) then WriteCache_aux_entry (entry, address, data) else entry) set; fun WriteCache (cac, address, data) = let val index = Word32.toInt (GetIndex address); val nset = WriteCache_aux_set (ImmArray.sub (cac, index), address, data); in ImmArray.update (cac, index, nset) end; (* * The LoadBlock function returns the updated * memory and the block containing address loaded from memory. *) fun LoadBlock (mem, address) = ImmArray.foldr (fn (offset, (block, mem)) => let val laddress = Word32.+ (Word32.<< (Word32.>> (address, Word.fromInt BlockOffsetBits), Word.fromInt BlockOffsetBits), Word32.<< (Word32.fromInt offset, 0wx0002)); val (nmem, nword) = MEM.LoadWord (mem, laddress); in (ImmArray.update (block, offset, nword), nmem) end) (ImmArray.immarray (BlockSize, 0wx00000000 : Word32.word), mem) (ImmArray.tabulate (BlockSize, fn i => i)); (* * The StoreBlock functionsreturns the updated * memory with block stored into the block containing address. *) fun StoreBlock (block, mem, address) = ImmArray.foldr (fn (offset, mem) => let val saddress = Word32.+ (Word32.<< (Word32.>> (address, Word.fromInt BlockOffsetBits), Word.fromInt BlockOffsetBits), Word32.<< (Word32.fromInt offset, 0wx0002)); in MEM.StoreWord (mem, saddress, ImmArray.sub (block, offset)) end) mem (ImmArray.tabulate (BlockSize, fn i => i)); (* * The LoadCache* family of functions returns the updated * cache and memory, with the block containing address loaded * into the cache at the appropriate cache line, and dirty * data written back to memory as needed. *) fun LoadCache_aux_entry ((valid, dirty, tag, block), mem, address) = let val saddress = Word32.orb (Word32.<< (tag, Word.fromInt TagBits), Word32.<< (GetIndex address, Word.fromInt IndexBits)); val nmem = if valid andalso dirty then StoreBlock (block, mem, saddress) else mem; val (nblock, nnmem) = LoadBlock (nmem, address); in ((true, false, GetTag address, nblock), nnmem) end; fun LoadCache_aux_set (set, mem, address) = let val entry = RandEntry (); val (nentry, nmem) = LoadCache_aux_entry (ImmArray.sub (set, entry), mem, address); in (ImmArray.update (set, entry, nentry), nmem) end; fun LoadCache (cac, mem, address) = let val index = Word32.toInt (GetIndex address); val (nset, nmem) = LoadCache_aux_set (ImmArray.sub (cac, index), mem, address); in (ImmArray.update (cac, index, nset), nmem) end; (* * The remainder of the function defined here satisfy the MEMORY * signature. This allows a CachedMemory to act exactly like * a normal Memory, and thus caches can be nested to an arbitrary * depth. *) fun AlignWAddress address = Word32.<< (Word32.>> (address, 0wx0002), 0wx0002); fun AlignHWAddress address = Word32.<< (Word32.>> (address, 0wx0001), 0wx0001); (* Load and Store provide errorless access to memory. * They provide a common interface to memory, while * the LoadX and StoreX specifically access words, * halfwords and bytes, requiring address to be aligned. * In Load and Store, two intermediate values are * generated. The value aligned_address is the aligned * version of the given address, and is used to compare with * the original address to determine if it was aligned. The * value use_address is equivalent to aligned_address divided * by four, and it corresponds to the index of the memory * array where the corresponding aligned address can be found. *) fun Load (((cac, (rh, rm, wh, wm)), mem), address) = let val aligned_address = AlignWAddress address; in if InCache (cac, aligned_address) then (((cac, (rh + 1, rm, wh, wm)), mem), ReadCache (cac, aligned_address)) else let val (ncac, nmem) = LoadCache (cac, mem, aligned_address); in (((ncac, (rh, rm + 1, wh, wm)), nmem), ReadCache (ncac, aligned_address)) end end; fun Store (((cac, (rh, rm, wh, wm)), mem), address, data) = let val aligned_address = AlignWAddress address; in if InCache (cac, aligned_address) then let val ncac = WriteCache (cac, aligned_address, data); in case WriteHit of Write_Through => ((ncac, (rh, rm, wh + 1, wm)), MEM.StoreWord (mem, aligned_address, data)) | Write_Back => ((ncac, (rh, rm, wh + 1, wm)), mem) end else case WriteMiss of Write_Allocate => let val (ncac, nmem) = LoadCache (cac, mem, aligned_address); val nncac = WriteCache (ncac, aligned_address, data); in case WriteHit of Write_Through => ((nncac, (rh, rm, wh, wm + 1)), MEM.StoreWord (nmem, aligned_address, data)) | Write_Back => ((nncac, (rh, rm, wh, wm + 1)), nmem) end | Write_No_Allocate => ((cac, (rh, rm, wh, wm + 1)), MEM.StoreWord (mem, aligned_address, data)) end; fun LoadWord (mem, address) = let val aligned_address = if address = AlignWAddress address then address else (print "Error LW: Memory using aligned address\n"; AlignWAddress address); in Load(mem, aligned_address) end; fun StoreWord (mem, address, data) = let val aligned_address = if address = AlignWAddress address then address else (print "Error SW: Memory using aligned address\n"; AlignWAddress address); in Store(mem, aligned_address, data) end; fun LoadHWord (mem, address) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error LH: Memory using aligned address\n"; AlignHWAddress address); val (nmem,l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0010), 0wx0010) | 0wx00000010 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0000), 0wx0010) | _ => (print "Error LH: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun LoadHWordU (mem, address) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error LHU: Memory using aligned address\n"; AlignHWAddress address); val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0010), 0wx0010) | 0wx00000010 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0000), 0wx0010) | _ => (print "Error LHU: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun StoreHWord (mem, address, data) = let val aligned_address = if address = AlignHWAddress address then address else (print "Error SH: Memory using aligned address\n"; AlignWAddress address); val (_, s_word) = Load(mem, aligned_address); in case aligned_address of 0wx00000000 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFF0000 : Word32.word, s_word), Word32.<<(Word32.andb(0wx0000FFFF : Word32.word, data), 0wx0000))) | 0wx00000010 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wx0000FFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx0000FFFF : Word32.word, data), 0wx0010))) | _ => (print "Error SH: Memory unchanged\n"; mem) end; fun LoadByte (mem, address) = let val aligned_address = address; val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0018), 0wx0018) | 0wx00000008 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0010), 0wx0018) | 0wx00000010 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0008), 0wx0018) | 0wx00000018 : Word32.word => Word32.~>>(Word32.<<(l_word, 0wx0000), 0wx0018) | _ => (print "Error LB: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun LoadByteU (mem, address) = let val aligned_address = address; val (nmem, l_word) = Load(mem, aligned_address); in (nmem, case aligned_address of 0wx00000000 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0018), 0wx0018) | 0wx00000008 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0010), 0wx0018) | 0wx00000010 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0008), 0wx0018) | 0wx00000018 : Word32.word => Word32.>>(Word32.<<(l_word, 0wx0000), 0wx0018) | _ => (print "Error LBU: Memory returning 0\n"; 0wx00000000 : Word32.word)) end; fun StoreByte (mem, address, data) = let val aligned_address = address; val (_, s_word) = Load(mem, aligned_address); in case aligned_address of 0wx00000000 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFFFF00 : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0000))) | 0wx00000008 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFFFF00FF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0008))) | 0wx00000010 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wxFF00FFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0010))) | 0wx00000018 : Word32.word => Store(mem, aligned_address, Word32.orb(Word32.andb(0wx00FFFFFF : Word32.word, s_word), Word32.<<(Word32.andb(0wx000000FF : Word32.word, data), 0wx0018))) | _ => (print "Error SB: Memory unchanged\n"; mem) end; fun GetStatistics ((cac, (rh, rm, wh, wm)), mem) = let val th = rh + wh; val tm = rm + wm; val who = case WriteHit of Write_Through => "Write Through" | Write_Back => "Write Back"; val wmo = case WriteMiss of Write_Allocate => "Write Allocate" | Write_No_Allocate => "Write No Allocate"; in CacheName ^ " :\n" ^ "CacheSize : " ^ (Int.toString CacheSize) ^ "\n" ^ "BlockSize : " ^ (Int.toString BlockSize) ^ "\n" ^ "Associativity : " ^ (Int.toString Associativity) ^ "\n" ^ "Write Hit : " ^ who ^ "\n" ^ "Write Miss : " ^ wmo ^ "\n" ^ "Read hits : " ^ (Int.toString rh) ^ "\n" ^ "Read misses : " ^ (Int.toString rm) ^ "\n" ^ "Write hits : " ^ (Int.toString wh) ^ "\n" ^ "Write misses : " ^ (Int.toString wm) ^ "\n" ^ "Total hits : " ^ (Int.toString th) ^ "\n" ^ "Total misses : " ^ (Int.toString tm) ^ "\n" ^ (MEM.GetStatistics mem) end; end; (*****************************************************************************) (* * DLXSimulator.sig * * This defines the exported function provided by the DLXSimulator. * The function run_file takes a string corresponding to the name of the * file to be run, and executes it. The function run_prog takes a * list of instructions and executes them. *) signature DLXSIMULATOR = sig val run_file : string -> unit; val run_prog : string list -> unit; end; (*****************************************************************************) (* * DLXSimulator.sml * * This defines the DLXSimulatorFun functor, which takes three * structures, corresponding to the register file, the ALU, and memory, * and provides the functionality of a DLX processor, able to execute * DLX programs. The function run_file takes a string corresponding to the * name of the file to be executed, and executes it. The function * run_prog takes a list of instructions and executes them. *) functor DLXSimulatorFun (structure RF : REGISTERFILE; structure ALU : ALU; structure MEM : MEMORY; ) : DLXSIMULATOR = struct (* * The datatype Opcode provides a means of differentiating * * among the main opcodes. *) datatype Opcode = (* for R-type opcodes *) SPECIAL | (* I-type opcodes *) BEQZ | BNEZ | ADDI | ADDUI | SUBI | SUBUI | ANDI | ORI | XORI | LHI | SLLI | SRLI | SRAI | SEQI | SNEI | SLTI | SGTI | SLEI | SGEI | LB | LBU | SB | LH | LHU | SH | LW | SW | (* J-type opcodes *) J | JAL | TRAP | JR | JALR | (* Unrecognized opcode *) NON_OP; (* * The datatype RRFuncCode provides a means of * differentiating among * the register-register function codes. *) datatype RRFunctCode = NOP | SLL | SRL | SRA | ADD | ADDU | SUB | SUBU | AND | OR | XOR | SEQ | SNE | SLT | SGT | SLE | SGE | NON_FUNCT; (* * The datatype Instruction provides a means of * differentiating among the three different types of * instructions, I-type, R-type, and J-type. * An I-type is interpreted as (opcode, rs1, rd, immediate). * An R-type is interpreted as (opcode, rs1, rs2, rd, shamt, funct). * An J-type is interpreted as (opcode, offset). * An ILLEGAL causes the simulator to end. *) datatype Instruction = ITYPE of Opcode * int * int * Word32.word | RTYPE of Opcode * int * int * int * int * RRFunctCode | JTYPE of Opcode * Word32.word | ILLEGAL; (* * The value HALT is set to the DLX instruction TRAP #0, * and is used to check for the halt of the program. *) val HALT = JTYPE (TRAP, 0wx00000000); (* * The function DecodeIType decodes a Word32.word into an * I-type instruction. *) fun DecodeIType instr = let val opc = Word32.andb (Word32.>> (instr, 0wx001A), 0wx0000003F : Word32.word); val opcode = case opc of 0wx00000004 : Word32.word => BEQZ | 0wx00000005 : Word32.word => BNEZ | 0wx00000008 : Word32.word => ADDI | 0wx00000009 : Word32.word => ADDUI | 0wx0000000A : Word32.word => SUBI | 0wx0000000B : Word32.word => SUBUI | 0wx0000000C : Word32.word => ANDI | 0wx0000000D : Word32.word => ORI | 0wx0000000E : Word32.word => XORI | 0wx0000000F : Word32.word => LHI | 0wx00000014 : Word32.word => SLLI | 0wx00000016 : Word32.word => SRLI | 0wx00000017 : Word32.word => SRAI | 0wx00000018 : Word32.word => SEQI | 0wx00000019 : Word32.word => SNEI | 0wx0000001A : Word32.word => SLTI | 0wx0000001B : Word32.word => SGTI | 0wx0000001C : Word32.word => SLEI | 0wx0000001D : Word32.word => SGEI | 0wx00000020 : Word32.word => LB | 0wx00000024 : Word32.word => LBU | 0wx00000028 : Word32.word => SB | 0wx00000021 : Word32.word => LH | 0wx00000025 : Word32.word => LHU | 0wx00000029 : Word32.word => SH | 0wx00000023 : Word32.word => LW | 0wx0000002B : Word32.word => SW | _ => (print "Error : Non I-Type opcode\n"; NON_OP); val rs1 = Word32.toInt(Word32.andb (Word32.>> (instr, 0wx0015), 0wx0000001F : Word32.word)); val rd = Word32.toInt(Word32.andb (Word32.>> (instr, 0wx0010), 0wx0000001F : Word32.word)); val immediate = Word32.~>> (Word32.<< (instr, 0wx0010), 0wx0010); in if opcode = NON_OP then ILLEGAL else ITYPE (opcode, rs1, rd, immediate) end; (* * The function DecodeRType decodes a Word32.word into an * R-type instruction. *) fun DecodeRType instr = let val rs1 = Word32.toInt (Word32.andb (Word32.>> (instr, 0wx0015), 0wx0000001F : Word32.word)); val rs2 = Word32.toInt (Word32.andb (Word32.>> (instr, 0wx0010), 0wx0000001F : Word32.word)); val rd = Word32.toInt (Word32.andb (Word32.>> (instr, 0wx000B), 0wx0000001F : Word32.word)); val shamt = Word32.toInt (Word32.andb (Word32.>> (instr, 0wx0006), 0wx0000001F : Word32.word)); val funct = Word32.andb (instr, 0wx0000003F : Word32.word); val functcode = case funct of 0wx00000000 : Word32.word => NOP | 0wx00000004 : Word32.word => SLL | 0wx00000006 : Word32.word => SRL | 0wx00000007 : Word32.word => SRA | 0wx00000020 : Word32.word => ADD | 0wx00000021 : Word32.word => ADDU | 0wx00000022 : Word32.word => SUB | 0wx00000023 : Word32.word => SUBU | 0wx00000024 : Word32.word => AND | 0wx00000025 : Word32.word => OR | 0wx00000026 : Word32.word => XOR | 0wx00000028 : Word32.word => SEQ | 0wx00000029 : Word32.word => SNE | 0wx0000002A : Word32.word => SLT | 0wx0000002B : Word32.word => SGT | 0wx0000002C : Word32.word => SLE | 0wx0000002D : Word32.word => SGE | _ => (print "Error : Non R-type funct\n"; NON_FUNCT); in if functcode = NON_FUNCT then ILLEGAL else RTYPE (SPECIAL, rs1, rs2, rd, shamt, functcode) end; (* * The function DecodeJType decodes a Word32.word into an * J-type instruction. *) fun DecodeJType instr = let val opc = Word32.andb (Word32.>> (instr, 0wx1A), 0wx0000003F : Word32.word); val opcode = case opc of 0wx00000002 : Word32.word => J | 0wx00000003 : Word32.word => JAL | 0wx00000011 : Word32.word => TRAP | 0wx00000012 : Word32.word => JR | 0wx00000013 : Word32.word => JALR | _ => (print "Error : Non J-type opcode\n"; NON_OP); val offset = Word32.~>> (Word32.<< (instr, 0wx0006), 0wx0006); in if opcode = NON_OP then ILLEGAL else JTYPE (opcode, offset) end; (* * The function DecodeInstr decodes a Word32.word into an * instruction. It first checks the opcode, and then calls * one of DecodeIType, DecodeJType, and DecodeRType to * complete the decoding process. *) fun DecodeInstr instr = let val opcode = Word32.andb (Word32.>> (instr, 0wx1A), 0wx0000003F : Word32.word); in case opcode of 0wx00000000 : Word32.word => DecodeRType instr | 0wx00000002 : Word32.word => DecodeJType instr | 0wx00000003 : Word32.word => DecodeJType instr | 0wx00000004 : Word32.word => DecodeIType instr | 0wx00000005 : Word32.word => DecodeIType instr | 0wx00000008 : Word32.word => DecodeIType instr | 0wx00000009 : Word32.word => DecodeIType instr | 0wx0000000A : Word32.word => DecodeIType instr | 0wx0000000B : Word32.word => DecodeIType instr | 0wx0000000C : Word32.word => DecodeIType instr | 0wx0000000D : Word32.word => DecodeIType instr | 0wx0000000E : Word32.word => DecodeIType instr | 0wx0000000F : Word32.word => DecodeIType instr | 0wx00000011 : Word32.word => DecodeJType instr | 0wx00000012 : Word32.word => DecodeJType instr | 0wx00000013 : Word32.word => DecodeJType instr | 0wx00000016 : Word32.word => DecodeIType instr | 0wx00000017 : Word32.word => DecodeIType instr | 0wx00000018 : Word32.word => DecodeIType instr | 0wx00000019 : Word32.word => DecodeIType instr | 0wx0000001A : Word32.word => DecodeIType instr | 0wx0000001B : Word32.word => DecodeIType instr | 0wx0000001C : Word32.word => DecodeIType instr | 0wx0000001D : Word32.word => DecodeIType instr | 0wx00000020 : Word32.word => DecodeIType instr | 0wx00000024 : Word32.word => DecodeIType instr | 0wx00000028 : Word32.word => DecodeIType instr | 0wx00000021 : Word32.word => DecodeIType instr | 0wx00000025 : Word32.word => DecodeIType instr | 0wx00000029 : Word32.word => DecodeIType instr | 0wx00000023 : Word32.word => DecodeIType instr | 0wx0000002B : Word32.word => DecodeIType instr | _ => (print "Error : Unrecognized opcode\n"; ILLEGAL) end; (* * The function PerformIType performs one of the I-Type * instructions. A number of the instructions make use of the * ALU, and as such, call ALU.PerformAL. *) fun PerformIType ((BEQZ, rs1, rd, immediate), (PC, rf, mem)) = if (RF.LoadRegister(rf, rs1) = (0wx00000000 : Word32.word)) then (Word32.fromInt (Int.+ (Word32.toIntX PC, Word32.toIntX (Word32.<< (immediate, 0wx0002)))), rf, mem) else (PC, rf, mem) | PerformIType ((BNEZ, rs1, rd, immediate), (PC, rf, mem)) = if not (RF.LoadRegister(rf, rs1) = (0wx00000000 : Word32.word)) then (Word32.fromInt (Int.+ (Word32.toIntX PC, Word32.toIntX (Word32.<< (immediate, 0wx0002)))), rf, mem) else (PC, rf, mem) | PerformIType ((ADDI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.ADD, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((ADDUI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.ADDU, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((SUBI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SUB, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((SUBUI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SUBU, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((ANDI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.AND, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((ORI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.OR, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((XORI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.XOR, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((LHI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, Word32.<< (immediate, 0wx0010)), mem) | PerformIType ((SLLI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, Word32.<< (RF.LoadRegister(rf, rs1), Word.fromLarge (Word32.toLarge immediate))), mem) | PerformIType ((SRLI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, Word32.>> (RF.LoadRegister(rf, rs1), Word.fromLarge (Word32.toLarge immediate))), mem) | PerformIType ((SRAI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, Word32.~>> (RF.LoadRegister(rf, rs1), Word.fromLarge (Word32.toLarge immediate))), mem) | PerformIType ((SEQI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SEQ, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((SNEI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SNE, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((SLTI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLT, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((SGTI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SGT, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((SLEI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLE, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((SGEI, rs1, rd, immediate), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SGE, RF.LoadRegister(rf, rs1), immediate)), mem) | PerformIType ((LB, rs1, rd, immediate), (PC, rf, mem)) = let val (nmem, l_byte) = MEM.LoadByte(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_byte), nmem) end | PerformIType ((LBU, rs1, rd, immediate), (PC, rf, mem)) = let val (nmem, l_byte) = MEM.LoadByteU(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_byte), nmem) end | PerformIType ((SB, rs1, rd, immediate), (PC, rf, mem)) = (PC, rf, MEM.StoreByte(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate), Word32.andb(0wx000000FF, RF.LoadRegister(rf, rd)))) | PerformIType ((LH, rs1, rd, immediate), (PC, rf, mem)) = let val (nmem, l_hword) = MEM.LoadHWord(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_hword), nmem) end | PerformIType ((LHU, rs1, rd, immediate), (PC, rf, mem)) = let val (nmem, l_hword) = MEM.LoadHWordU(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_hword), nmem) end | PerformIType ((SH, rs1, rd, immediate), (PC, rf, mem)) = (PC, rf, MEM.StoreByte(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate), Word32.andb(0wx0000FFFF, RF.LoadRegister(rf, rd)))) | PerformIType ((LW, rs1, rd, immediate), (PC, rf, mem)) = let val (nmem, l_word) = MEM.LoadWord(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate)); in (PC, RF.StoreRegister(rf, rd, l_word), nmem) end | PerformIType ((SW, rs1, rd, immediate), (PC, rf, mem)) = (PC, rf, MEM.StoreWord(mem, Word32.+ (RF.LoadRegister(rf, rs1), immediate), RF.LoadRegister(rf, rd))) | PerformIType ((_, rs1, rd, immediate), (PC, rf, mem)) = (print "Error : Non I-Type opcode, performing NOP\n"; (PC, rf, mem)); (* * The function PerformRType performs one of the R-Type * instructions. All of the instructions make use of the * ALU, and as such, call ALU.PerformAL. *) fun PerformRType ((SPECIA, rs1, rs2, rd, shamt, NOP), (PC, rf, mem)) = (PC, rf, mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SLL), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLL, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SRL), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SRL, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SRA), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SRA, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, ADD), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.ADD, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, ADDU), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.ADDU, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SUB), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SUB, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SUBU), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SUBU, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, AND), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.AND, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, OR), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.OR, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, XOR), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.XOR, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SEQ), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SEQ, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SNE), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SNE, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SLT), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLT, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SGT), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SGT, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SLE), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SLE, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((SPECIAL, rs1, rs2, rd, shamt, SGE), (PC, rf, mem)) = (PC, RF.StoreRegister(rf, rd, ALU.PerformAL(ALU.SGE, RF.LoadRegister(rf, rs1), RF.LoadRegister(rf, rs2))), mem) | PerformRType ((_, rs1, rs2, rd, shamt, _), (PC, rf, mem)) = (print "Error : Non R-Type opcode, performing NOP\n"; (PC, rf, mem)); (* * The function PerformJType performs one of the J-Type * instructions. *) fun PerformJType ((J, offset), (PC, rf, mem)) = (Word32.fromInt (Int.+ (Word32.toIntX PC, Word32.toIntX (Word32.<< (offset, 0wx0002)))), rf, mem) | PerformJType ((JR, offset), (PC, rf, mem)) = (RF.LoadRegister(rf, Word32.toInt(Word32.andb (Word32.>> (offset, 0wx0015), 0wx0000001F : Word32.word))), rf, mem) | PerformJType ((JAL, offset), (PC, rf, mem)) = (Word32.fromInt (Int.+ (Word32.toIntX PC, Word32.toIntX (Word32.<< (offset, 0wx0002)))), RF.StoreRegister(rf, 31, PC), mem) | PerformJType ((JALR, offset), (PC, rf, mem)) = (RF.LoadRegister(rf, Word32.toInt (Word32.andb (Word32.>> (offset, 0wx0015), 0wx0000001F : Word32.word))), RF.StoreRegister(rf, 31, PC), mem) | PerformJType ((TRAP, 0wx00000003 : Word32.word), (PC, rf, mem)) = let val x = TextIO.print "Value? "; val s = "10" (* TextIO.inputLine TextIO.stdIn; *) val i = Int.fromString s; val input = if isSome i then valOf i else (TextIO.print "Error : Returning 0\n"; Int.fromInt 0); in (PC, RF.StoreRegister(rf, 14, Word32.fromInt input), mem) end | PerformJType ((TRAP, 0wx00000004 : Word32.word), (PC, rf, mem)) = let val output = Int.toString (Word32.toIntX (RF.LoadRegister(rf, 14))); in (TextIO.print ("Output: " ^ output ^ "\n"); (PC, rf, mem)) end | PerformJType ((_, offset), (PC, rf, mem)) = (print "Error : Non J-Type opcode, performing NOP\n"; (PC, rf, mem)); (* * The function PerformInstr performs an instruction by * passing the instruction to the appropriate auxiliary function. *) fun PerformInstr (ITYPE instr, (PC, rf, mem)) = PerformIType (instr, (PC, rf, mem)) | PerformInstr (RTYPE instr, (PC, rf, mem)) = PerformRType (instr, (PC, rf, mem)) | PerformInstr (JTYPE instr, (PC, rf, mem)) = PerformJType (instr, (PC, rf, mem)) | PerformInstr (ILLEGAL, (PC, rf, mem)) = (PC, rf, mem); (* * The function CycleLoop represents the basic clock cylce of * the DLX processor. It takes as input the current program * counter, the current register file, and the current memory. * It loads, decodes, and executes an instruction and increments * the program counter. If the instruction that was loaded is * the HALT instruction, the program terminates, otherwise, * CycleLoop is recursively called with the result of performing * the instruction. *) fun CycleLoop (PC, rf, mem) = let val (nmem, instr_word) = MEM.LoadWord (mem, PC); val instr = DecodeInstr instr_word; val nPC = Word32.+ (PC, 0wx00000004 : Word32.word); in if instr = HALT orelse instr = ILLEGAL then (print "Program halted.\n"; print (MEM.GetStatistics (nmem)); ()) else CycleLoop (PerformInstr (instr, (nPC, rf, nmem))) end (* * The function LoadProgAux is an auxilary function that * assists in loading a program into memory. It recursively * calls itself, each time loading an instruction and incrementing * the address to which the next instruction is to be loaded. *) fun LoadProgAux ([], mem, address) = mem | LoadProgAux (instrs::instr_list, mem, address) = let val instro = Word32.fromString instrs; val instr = if isSome instro then valOf instro else (print ("Error : Invalid " ^ "instruction format, " ^ "returning NOP\n"); 0wx00000000 : Word32.word); in LoadProgAux (instr_list, MEM.StoreWord (mem, address, instr), Word32.+ (address, 0wx00000004 : Word32.word)) end; (* * The function LoadProg takes a list of instructions and memory, and * loads the file into memory, beginning at 0x10000. *) fun LoadProg (instr_list, mem) = LoadProgAux (instr_list, mem, 0wx00010000 : Word32.word); (* * The function ReadFileToInstr reads the sequence of * instructions in a file into a list. *) fun ReadFileToInstr file = (case TextIO.inputLine file of NONE => [] | SOME l => l :: (ReadFileToInstr file)); (* * The function run_prog is exported by DLXSimulator. * It takes a list of instructions, then begins * execution of the instructions loaded at 0x10000, with an * initialized register file, and the loaded program in an * initialised memory. *) fun run_prog instructions = CycleLoop (0wx00010000 : Word32.word, RF.InitRegisterFile (), LoadProg (instructions, MEM.InitMemory ())); (* * The function run_file is exported by DLXSimulator. * It takes the name of a file to be run, then begins * execution of the loaded program at 0x10000, with an * initialized register file, and the loaded program in an * initialized memory. *) fun run_file filename = (run_prog o ReadFileToInstr) (TextIO.openIn filename); end; (* ************************************************************************* *) (* * Cache1.sml * * This file describes a small simple level 1 cache. *) structure L1CacheSpec1 : CACHESPEC = struct datatype WriteHitOption = Write_Through | Write_Back; datatype WriteMissOption = Write_Allocate | Write_No_Allocate; val CacheName = "Level 1 Cache"; val CacheSize = 256; val BlockSize = 4; val Associativity = 2; val WriteHit = Write_Through; val WriteMiss = Write_No_Allocate; end; structure L1Cache1 : MEMORY = CachedMemory (structure CS = L1CacheSpec1; structure MEM = Memory; ); structure DLXSimulatorC1 : DLXSIMULATOR = DLXSimulatorFun (structure RF = RegisterFile; structure ALU = ALU; structure MEM = L1Cache1; ); (* Example programs *) val Simple = ["200E002F", "44000004", "44000000"]; val Twos = ["44000003", "00000000", "3D00FFFF", "3508FFFF", "010E7026", "25CE0001", "44000004", "00000000", "44000000", "00000000"]; val Abs = ["44000003", "00000000", "01C0402A", "11000002", "00000000", "000E7022", "44000004", "00000000", "44000000", "00000000"] val Fact = ["0C000002", "00000000", "44000000", "44000003", "000E2020", "2FBD0020", "AFBF0014", "AFBE0010", "27BE0020", "0C000009", "00000000", "8FBE0010", "8FBF0014", "27BD0020", "00027020", "44000004", "00001020", "4BE00000", "00000000", "20080001", "0088402C", "11000004", "00000000", "20020001", "08000016", "00000000", "2FBD0004", "AFA40000", "28840001", "2FBD0020", "AFBF0014", "AFBE0010", "27BE0020", "0FFFFFF1", "00000000", "8FBE0010", "8FBF0014", "27BD0020", "8FA40000", "27BD0004", "00004020", "10800005", "00000000", "01024020", "28840001", "0BFFFFFB", "00000000", "01001020", "4BE00000", "00000000"]; val GCD = ["0C000002", "00000000", "44000000", "44000003", "00000000", "000E2020", "0080402A", "11000002", "00000000", "00042022", "44000003", "00000000", "000E2820", "00A0402A", "11000002", "00000000", "00052822", "2FBD0020", "AFBF0014", "AFBE0010", "27BE0020", "0C00000A", "00000000", "8FBE0010", "8FBF0014", "27BD0020", "00027020", "44000004", "00000000", "00001020", "4BE00000", "00000000", "14A00004", "00000000", "00801020", "08000013", "00000000", "0085402C", "15000006", "00000000", "00804020", "00A02020", "01002820", "08000002", "00000000", "00A42822", "2FBD0020", "AFBF0014", "AFBE0010", "27BE0020", "0FFFFFED", "00000000", "8FBE0010", "8FBF0014", "27BD0020", "4BE00000", "00000000"]; (* val _ = DLXSimulatorC1.run_prog GCD *) structure Main = struct fun doit () = (DLXSimulatorC1.run_prog Simple ; DLXSimulatorC1.run_prog Twos ; DLXSimulatorC1.run_prog Abs ; DLXSimulatorC1.run_prog Fact ; DLXSimulatorC1.run_prog GCD ) val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end mlton-20100608/benchmark/tests/fft.sml0000644000076600000240000002005011404435630016144 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) fun print _ = () signature BMARK = sig val doit : int -> unit end; structure Main: BMARK = struct local open Array Math val printr = print o (Real.fmt (StringCvt.SCI(SOME 14))) val printi = print o Int.toString in val PI = 3.14159265358979323846 val tpi = 2.0 * PI (* fun trace(name,f) x = (print name ; print "(" ; printr x ; print ") = " ; let val y = f x in printr y ; print "\n" ; y end) fun trace2(name,f) (x,y) = (printr x ; print " "; print name ; print " "; printr y ; print " = " ; let val z = f(x,y) in printr z ; print "\n" ; z end) fun trace2(_,f) = f val op * = trace2("*", Real.* ) val op - = trace2("-", Real.-) val op + = trace2("+", Real.+) local nonfix * + - in _overload * : ('a * 'a -> 'a) as Int.* and * _overload + : ('a * 'a -> 'a) as Int.+ and + _overload - : ('a * 'a -> 'a) as Int.- and - end val sin = trace("sin", sin) val cos = trace("cos", cos) val sub = fn (a,i) => let val x = sub(a,i) in print "sub(_, " ; printi i ; print ") = "; printr x ; print "\n" ; x end val update = fn (a,i,x) => (update(a,i,x); print "update(_, " ; printi i ; print ", " ; printr x ; print ")\n") *) fun fft px py np = let fun find_num_points i m = if i < np then find_num_points (i+i) (m+1) else (i,m) val (n,m) = find_num_points 2 1 (* val _ = (printi n ; print "\n" ; printi m ; print "\n") *) in if n <> np then let fun loop i = if i > n then () else (update(px, i, 0.0); update(py, i, 0.0); loop (i+1)) in loop (np+1); print "Use "; printi n; print " point fft\n" end else (); let fun loop_k k n2 = if k >= m then () else let val n4 = n2 div 4 val e = tpi / (real n2) fun loop_j j a = if j > n4 then () else let val a3 = 3.0 * a val cc1 = cos(a) val ss1 = sin(a) val cc3 = cos(a3) val ss3 = sin(a3) fun loop_is is id = if is >= n then () else let fun loop_i0 i0 = if i0 >= n then () else let val i1 = i0 + n4 val i2 = i1 + n4 val i3 = i2 + n4 val r1 = sub(px, i0) - sub(px, i2) val _ = update(px, i0, sub(px, i0) + sub(px, i2)) val r2 = sub(px, i1) - sub(px, i3) val _ = update(px, i1, sub(px, i1) + sub(px, i3)) val s1 = sub(py, i0) - sub(py, i2) val _ = update(py, i0, sub(py, i0) + sub(py, i2)) val s2 = sub(py, i1) - sub(py, i3) val _ = update(py, i1, sub(py, i1) + sub(py, i3)) val s3 = r1 - s2 val r1 = r1 + s2 val s2 = r2 - s1 val r2 = r2 + s1 val _ = update(px, i2, r1*cc1 - s2*ss1) val _ = update(py, i2, ~s2*cc1 - r1*ss1) val _ = update(px, i3, s3*cc3 + r2*ss3) val _ = update(py, i3, r2*cc3 - s3*ss3) in loop_i0 (i0 + id) end in loop_i0 is; loop_is (2 * id - n2 + j) (4 * id) end in loop_is j (2 * n2); loop_j (j+1) (e * real j) end in loop_j 1 0.0; loop_k (k+1) (n2 div 2) end in loop_k 1 n end; (************************************) (* Last stage, length=2 butterfly *) (************************************) let fun loop_is is id = if is >= n then () else let fun loop_i0 i0 = if i0 > n then () else let val i1 = i0 + 1 val r1 = sub(px, i0) val _ = update(px, i0, r1 + sub(px, i1)) val _ = update(px, i1, r1 - sub(px, i1)) val r1 = sub(py, i0) val _ = update(py, i0, r1 + sub(py, i1)) val _ = update(py, i1, r1 - sub(py, i1)) in loop_i0 (i0 + id) end in loop_i0 is; loop_is (2*id - 1) (4 * id) end in loop_is 1 4 end; (*************************) (* Bit reverse counter *) (*************************) let fun loop_i i j = if i >= n then () else (if i < j then (let val xt = sub(px, j) in update(px, j, sub(px, i)); update(px, i, xt) end; let val xt = sub(py, j) in update(py, j, sub(py, i)); update(py, i, xt) end) else (); let fun loop_k k j = if k < j then loop_k (k div 2) (j-k) else j+k val j' = loop_k (n div 2) j in loop_i (i+1) j' end) in loop_i 1 1 end; n end fun abs x = if x >= 0.0 then x else ~x fun test np = let val _ = (printi np; print "... ") val enp = real np val npm = (np div 2) - 1 val pxr = array (np+2, 0.0) val pxi = array (np+2, 0.0) val t = PI / enp val _ = update(pxr, 1, (enp - 1.0) * 0.5) val _ = update(pxi, 1, 0.0) val n2 = np div 2 val _ = update(pxr, n2+1, ~0.5) val _ = update(pxi, n2+1, 0.0) fun loop_i i = if i > npm then () else let val j = np - i val _ = update(pxr, i+1, ~0.5) val _ = update(pxr, j+1, ~0.5) val z = t * real i val y = ~0.5*(cos(z)/sin(z)) val _ = update(pxi, i+1, y) val _ = update(pxi, j+1, ~y) in loop_i (i+1) end val _ = loop_i 1 (* val _ = print "\n" fun loop_i i = if i > 15 then () else (printi i; print "\t"; printr (sub(pxr, i+1)); print "\t"; printr (sub(pxi, i+1)); print "\n"; loop_i (i+1)) val _ = loop_i 0 *) val _ = fft pxr pxi np (* fun loop_i i = if i > 15 then () else (printi i; print "\t"; printr (sub(pxr, i+1)); print "\t"; printr (sub(pxi, i+1)); print "\n"; loop_i (i+1)) val _ = loop_i 0 *) fun loop_i i zr zi kr ki = if i >= np then (zr,zi) else let val a = abs(sub(pxr, i+1) - real i) val (zr, kr) = if zr < a then (a, i) else (zr, kr) val a = abs(sub(pxi, i+1)) val (zi, ki) = if zi < a then (a, i) else (zi, ki) in loop_i (i+1) zr zi kr ki end val (zr, zi) = loop_i 0 0.0 0.0 0 0 val zm = if abs zr < abs zi then zi else zr in printr zm; print "\n" end fun loop_np i np = if i > 15 then () else (test np; loop_np (i+1) (np*2)) fun doit size = loop_np 1 size end end; mlton-20100608/benchmark/tests/fib.sml0000644000076600000240000000057711404435630016141 0ustar mtfstaffval rec fib = fn 0 => 0 | 1 => 1 | n => fib (n - 1) + fib (n - 2) structure Main = struct fun doit n = if n = 0 then () else let val _ = if 165580141 <> fib 41 then raise Fail "bug" else () in doit (n - 1) end end mlton-20100608/benchmark/tests/flat-array.sml0000644000076600000240000000100311404435630017424 0ustar mtfstaffstructure Main = struct fun doit n = let val v = Vector.tabulate (1000000, fn i => (i, i + 1)) fun loop n = if 0 = n then () else let val sum = Vector.foldl (fn ((a, b), c) => a + b + c handle Overflow => 0) 0 v in loop (n - 1) end in loop n end end mlton-20100608/benchmark/tests/fxp.sml0000644000076600000240000277435611404435630016215 0ustar mtfstaff(* MLton 20010629 (built Fri Jun 29 11:14:21 2001 on starlinux) *) (* created this file on Fri Jun 29 13:02:19 2001. *) (* Do not edit this file. *) (* Flag settings: *) (* aux: false *) (* chunk: chunk per function *) (* debug: false *) (* defines: [NODEBUG,MLton_safe=TRUE,MLton_detectOverflow=TRUE] *) (* detect overflow: true *) (* fixed heap: None *) (* indentation: 3 *) (* includes: [mlton.h] *) (* inline: NonRecursive {product = 320,small = 60} *) (* input file: fxp.cm *) (* instrument: false *) (* instrument Sxml: false *) (* keep Cps: false *) (* native: true *) (* native commented: 0 *) (* native copy prop: true *) (* future: 64 *) (* native ieee fp: false *) (* native live transfer: true *) (* native move hoist: true *) (* native optimize: 1 *) (* native split: Some (20000) *) (* polyvariance: Some ({rounds = 2,small = 30,product = 300}) *) (* print at fun entry: false *) (* profile: false *) (* safe: true *) (* show types: false *) (* static: false *) (* use basis library: true *) (* verbosity: Silent *) (* start of ../../Util/utilTime.sml *) (*--------------------------------------------------------------------------*) (* Structure: UtilTime *) (* *) (* Depends on: *) (* *) (* Exceptions raised by functions in this structure: *) (* time : none *) (* timeN : none *) (*--------------------------------------------------------------------------*) signature UtilTime = sig val time : ('a -> 'b) -> 'a -> 'b * {usr:Time.time, sys:Time.time, gc:Time.time} val timeN : int -> ('a -> 'b) -> 'a -> 'b * {usr:Time.time, sys:Time.time, gc:Time.time} end structure UtilTime : UtilTime = struct (*--------------------------------------------------------------------*) (* run f on x, and measure the runtime. return the result and time. *) (*--------------------------------------------------------------------*) fun time f x = let val timer = Timer.startCPUTimer () val y = f x val ptime = Timer.checkCPUTimer timer in (y,ptime) end (*--------------------------------------------------------------------*) (* run f n times on x, and measure the runtime. return the time. *) (*--------------------------------------------------------------------*) fun timeN n f x = let fun iter m = if m<=1 then f x else (ignore (f x); iter (m-1)) in time iter n end end (* stop of ../../Util/utilTime.sml *) (* start of ../../Util/utilString.sml *) (*--------------------------------------------------------------------------*) (* Structure: UtilString *) (*--------------------------------------------------------------------------*) signature UtilString = sig val quoteString : char -> string -> string val numberNth : int -> string val prependAnA : string -> string val nBlanks : int -> string val padxLeft : char -> string * int -> string val padxRight : char -> string * int -> string val breakLines : int -> string -> string list val toUpperFirst : string -> string val toUpperString : string -> string val Int2String : int -> string val Bool2xString : string * string -> bool -> string val Bool2String : bool -> string val Option2xString : string * (('a -> string) -> 'a -> string) -> ('a -> string) -> 'a option -> string val Option2String0 : ('a -> string) -> 'a option -> string val Option2String : ('a -> string) -> 'a option -> string val List2xString : string * string * string -> ('a -> string) -> 'a list -> string val List2String0 : ('a -> string) -> 'a list -> string val List2String : ('a -> string) -> 'a list -> string val Vector2xString : string * string * string -> ('a -> string) -> 'a vector -> string val Vector2String : ('a -> string) -> 'a vector -> string end structure UtilString : UtilString = struct fun quoteString q s = let val quote = String.implode [q] in quote^s^quote end (*--------------------------------------------------------------------*) (* generate a string with the ordinal number of n, by appending *) (* "st", "nd", "rd" or "th" to the number. *) (*--------------------------------------------------------------------*) fun numberNth n = let val suffix = case n mod 9 of 1 => "st" | 2 => "nd" | 3 => "rd" | _ => "th" in Int.toString n^suffix end (*--------------------------------------------------------------------*) (* is the single character c represented by a word starting with a *) (* vocal in the alphabet? (l~ell->true, k~kay->false) *) (*--------------------------------------------------------------------*) fun vocalLetter c = case Char.toLower c of #"a" => true | #"f" => true | #"h" => true | #"i" => true | #"l" => true | #"m" => true | #"n" => true | #"o" => true | #"r" => true | #"s" => true | #"x" => true | #"8" => true | _ => false (*--------------------------------------------------------------------*) (* is character c a vocal? *) (*--------------------------------------------------------------------*) fun isVocal c = case Char.toLower c of #"a" => true | #"e" => true | #"i" => true | #"o" => true | #"u" => true | _ => false (*--------------------------------------------------------------------*) (* does a word require "an" as undefinite article? true if: *) (* - it is a single letter that starts with a vocal in the alphabet *) (* - its first two letters are capitals, i.e. it is an abbreviation, *) (* and its first letter starts with a vocal in the alphabet *) (* - it has more than one letter, is not an abbreviation, and either *) (* + it starts with a, i or o *) (* + it starts with e and the second letter is not a u (europe) *) (* + it starts with a u and continues with a vocal (very unlikely, *) (* only in c.s., like uuencoded or uid *) (* + it starts with a u, continues with a consonant not followed by *) (* an i (like in unicode); that is something like un-... *) (* This ruleset is not complete since it does not cover, e.g., the *) (* word uninvented, but sufficient for most cases. *) (* (Is english pronounciation decidable at all?) *) (*--------------------------------------------------------------------*) fun extendsAtoAn word = case String.explode word of nil => false | [c] => vocalLetter c | c1::c2::cs => if not (Char.isLower c1 orelse Char.isLower c2) then vocalLetter c1 else case Char.toLower c1 of #"a" => true | #"i" => true | #"o" => true | #"e" => Char.toLower c2 <> #"u" | #"u" => if isVocal c2 then false else (case cs of nil => true | c3::_ => Char.toLower c3 <> #"i") | _ => false (*--------------------------------------------------------------------*) (* add an undefinite article to a word. *) (*--------------------------------------------------------------------*) fun prependAnA word = if extendsAtoAn word then "an "^word else "a "^word (*--------------------------------------------------------------------*) (* generate a list/string of n times character c. *) (*--------------------------------------------------------------------*) fun nCharsC c n = if n>0 then c::nCharsC c (n-1) else nil fun nChars c n = String.implode (nCharsC c n) val nBlanks = nChars #" " (*--------------------------------------------------------------------*) (* add a minimal number of characters c to the left/right of a string *) (* in order to make its length at least n. *) (*--------------------------------------------------------------------*) fun padxLeft c (s,n) = (nChars c (n-String.size s))^s fun padxRight c (s,n) = s^(nChars c (n-String.size s)) val padLeft = padxLeft #" " val padRight = padxRight #" " (*--------------------------------------------------------------------*) (* break a string into several lines of length width. *) (*--------------------------------------------------------------------*) fun breakLines width str = let val tokens = String.tokens (fn c => #" "=c) str fun makeLine(toks,lines) = if null toks then lines else (String.concat (rev toks))::lines fun doit w (toks,lines) nil = makeLine(toks,lines) | doit w (toks,lines) (one::rest) = let val l = String.size one val w1 = w+l in if w1=width then doit 0 (nil,one::makeLine(toks,lines)) rest else doit (l+1) ([" ",one],makeLine(toks,lines)) rest end in List.rev (doit 0 (nil,nil) tokens) end (*--------------------------------------------------------------------*) (* convert the first/all characters of a string to upper case *) (*--------------------------------------------------------------------*) fun toUpperFirst str = case String.explode str of nil => "" | c::cs => String.implode (Char.toUpper c::cs) fun toUpperString str = String.implode(map Char.toUpper (String.explode str)) (*--------------------------------------------------------------------*) (* return a string representation of an int, char or unit. *) (*--------------------------------------------------------------------*) val Int2String = Int.toString val Char2String = Char.toString fun Unit2String() = "()" (*--------------------------------------------------------------------*) (* return a string representation of a boolean. *) (*--------------------------------------------------------------------*) fun Bool2xString (t,f) b = if b then t else f val Bool2String = Bool2xString ("true","false") (*--------------------------------------------------------------------*) (* return a string representation of an option. *) (* the first arg is a string for the NONE case, the second a function *) (* that converts x to a string, given a function for doing so. *) (*--------------------------------------------------------------------*) fun Option2xString (none,Some2String) x2String opt = case opt of NONE => none | SOME x => Some2String x2String x fun Option2String0 x2String = Option2xString ("",fn f => fn x => f x) x2String fun Option2String x2String = Option2xString ("NONE",fn f => fn x => "SOME "^f x) x2String (*--------------------------------------------------------------------*) (* return a string representation of list; start with pre, separate *) (* with sep and finish with post; use X2String for each element. *) (*--------------------------------------------------------------------*) fun List2xString (pre,sep,post) X2String nil = pre^post | List2xString (pre,sep,post) X2String l = let fun doit nil _ = [post] | doit (x::r) str = str::X2String x::doit r sep in String.concat (doit l pre) end fun List2String X2String nil = "[]" | List2String X2String l = let fun doit nil _ = ["]"] | doit (x::r) str = str::X2String x::doit r "," in String.concat (doit l "[") end fun List2String0 X2String nil = "" | List2String0 X2String l = let fun doit nil _ = nil | doit (x::r) str = str::X2String x::doit r " " in String.concat (doit l "") end (* a compiler bug in smlnj 110 makes the following uncompilable: *) (* fun List2String X2String xs = List2xString ("[",",","]") X2String xs *) (* fun List2String0 X2String xs = List2xString (""," ","") X2String xs *) (*--------------------------------------------------------------------*) (* return a string representation of list; start with pre, separate *) (* with sep and finish with post; use X2String for each element. *) (*--------------------------------------------------------------------*) fun Vector2xString (pre,sep,post) X2String vec = if Vector.length vec=0 then pre^post else String.concat (pre::X2String(Vector.sub(vec,0)):: Vector.foldri (fn (_,x,yet) => sep::X2String x::yet) [post] (vec,1,NONE)) fun Vector2String X2String vec = Vector2xString ("#[",",","]") X2String vec end (* stop of ../../Util/utilString.sml *) (* start of ../../Util/utilCompare.sml *) signature UtilCompare = sig type 'a Comparer = 'a * 'a -> order val comparePair : 'a Comparer * 'b Comparer -> ('a * 'b) Comparer val compareTriple : 'a Comparer * 'b Comparer * 'c Comparer -> ('a * 'b * 'c) Comparer val compareOption : 'a Comparer -> 'a option Comparer val compareList : 'a Comparer -> 'a list Comparer val compareVector : 'a Comparer -> 'a vector Comparer val compareInt : int Comparer val compareIntPair : (int * int) Comparer val compareIntTriple : (int * int * int) Comparer val compareWord : word Comparer val compareWordPair : (word * word) Comparer val compareWordTriple : (word * word * word) Comparer end structure UtilCompare : UtilCompare = struct type 'a Comparer = 'a * 'a -> order fun comparePair (compareA,compareB) ((a1,b1),(a2,b2)) = case compareA(a1,a2) of EQUAL => compareB(b1,b2) | order => order fun compareTriple (compareA,compareB,compareC) ((a1,b1,c1),(a2,b2,c2)) = case compareA(a1,a2) of EQUAL => (case compareB(b1,b2) of EQUAL => compareC(c1,c2) | order => order) | order => order val compareInt = Int.compare fun compareIntPair((x1,y1),(x2,y2)) = case Int.compare(x1,x2) of EQUAL => Int.compare (y1,y2) | order => order fun compareIntTriple((x1,y1,z1),(x2,y2,z2)) = case Int.compare(x1,x2) of EQUAL => (case Int.compare (y1,y2) of EQUAL => Int.compare (z1,z2) | order => order) | order => order val compareWord = Word.compare fun compareWordPair((x1,y1),(x2,y2)) = case Word.compare(x1,x2) of EQUAL => Word.compare (y1,y2) | order => order fun compareWordTriple((x1,y1,z1),(x2,y2,z2)) = case Word.compare(x1,x2) of EQUAL => (case Word.compare (y1,y2) of EQUAL => Word.compare (z1,z2) | order => order) | order => order fun compareOption compareA opts = case opts of (NONE,NONE) => EQUAL | (NONE,SOME x) => LESS | (SOME x,NONE) => GREATER | (SOME x,SOME y) => compareA(x,y) fun compareList compA ll = let fun doit (nil,nil) = EQUAL | doit (nil,_) = LESS | doit (_,nil) = GREATER | doit (a1::as1,a2::as2) = case compA(a1,a2) of EQUAL => doit(as1,as2) | order => order in doit ll end fun compareVector compA (vec1,vec2) = let val (l,l2) = (Vector.length vec1,Vector.length vec2) in case Int.compare(l,l2) of EQUAL => let fun doit i = if i>=l then EQUAL else case compA(Vector.sub(vec1,i),Vector.sub(vec2,i)) of EQUAL => doit (i+1) | order => order in doit 0 end | order => order end end (* stop of ../../Util/utilCompare.sml *) (* start of ../../Util/utilHash.sml *) signature UtilHash = sig val hashPair : ('a -> word) * ('b -> word) -> 'a * 'b -> word val hashTriple : ('a -> word) * ('b -> word) * ('c -> word) -> 'a * 'b * 'c -> word val hashOption : ('a -> word) -> 'a option -> word val hashList : ('a -> word) -> 'a list -> word val hashVector : ('a -> word) -> 'a vector -> word val hashString : string -> word val hashInt : int -> word val hashIntPair : int * int -> word val hashIntTriple : int * int * int -> word val hashWord : word -> word val hashWordPair : word * word -> word val hashWordTriple : word * word * word -> word end structure UtilHash : UtilHash = struct fun hashPair (hashA,hashB) (a,b) = 0w1327 * hashA a + 0w3853 * hashB b fun hashTriple (hashA,hashB,hashC) (a,b,c) = 0w1327 * hashA a + 0w3853 * hashB b + 0w2851 * hashC c val hashInt = Word.fromInt fun hashIntPair (i,j) = 0w1327 * Word.fromInt i + 0w3853 * Word.fromInt j fun hashIntTriple (i,j,k) = 0w1327 * Word.fromInt i + 0w3853 * Word.fromInt j + 0w2851 * Word.fromInt k fun hashWord w = w fun hashWordPair (i,j) = 0w1327 * i + 0w3853 * j fun hashWordTriple (i,j,k) = 0w1327 * i + 0w3853 * j + 0w2851 * k val hashChar = Word.fromInt o ord fun hashString s = case String.size s of 0 => 0wx0 | 1 => 0w1 + hashChar(String.sub(s,0)) | 2 => let val w1 = String.sub(s,0) val w2 = String.sub(s,1) in 0w2 + hashChar w1 * 0wx1327 + hashChar w2 end | n => let val w1 = String.sub(s,0) val w2 = String.sub(s,1) val wn = String.sub(s,n-1) in 0w3 + hashChar w1 * 0wx3853 + hashChar w2 * 0wx1327 + hashChar wn end fun hashOption hashA opt = case opt of NONE => 0w0 | SOME a => 0w1 + hashA a fun hashList hashA l = case l of nil => 0wx0 | [a] => 0w1 + hashA a | a1::a2::_ => 0w2 + 0w3853 * hashA a1 + 0wx1327 * hashA a2 fun hashVector hashA cv = case Vector.length cv of 0 => 0wx0 | 1 => 0w1 + hashA(Vector.sub(cv,0)) | 2 => let val w1 = Vector.sub(cv,0) val w2 = Vector.sub(cv,1) in 0w2 + hashA w1 * 0wx1327 + hashA w2 end | n => let val w1 = Vector.sub(cv,0) val w2 = Vector.sub(cv,1) val wn = Vector.sub(cv,n-1) in 0w3 + hashA w1 * 0wx3853 + hashA w2 * 0wx1327 + hashA wn end end (* stop of ../../Util/utilHash.sml *) (* start of ../../Util/SymDict/key.sml *) (*--------------------------------------------------------------------------*) (* In order to be used as a dictinary/symbol table key, a type must have a *) (* null value, hash to words, must be comparable and printable. *) (*--------------------------------------------------------------------------*) signature Key = sig type Key val null : Key val hash : Key -> word val compare : Key * Key -> order val toString : Key -> string end (* stop of ../../Util/SymDict/key.sml *) (* start of ../../Util/utilInt.sml *) (*--------------------------------------------------------------------------*) (* Structure: UtilInt *) (* *) (* Depends on: *) (* *) (* Exceptions raised by functions in this structure: *) (* appInterval : none *) (* insertInt : none *) (* insertNewInt : none *) (* nextPowerTwo : none *) (*--------------------------------------------------------------------------*) signature UtilInt = sig val intervalList : (int * int) -> int list val appInterval : (int -> unit) -> (int * int) -> unit val insertInt : int * int list -> int list val insertNewInt : int * int list -> int list option val powerOfTwo : int -> int val nextPowerTwo : int -> int end structure UtilInt : UtilInt = struct (*--------------------------------------------------------------------*) (* generate the list [n,...,m] *) (*--------------------------------------------------------------------*) fun intervalList(n,m) = if n>m then nil else n::intervalList(n+1,m) (*--------------------------------------------------------------------*) (* apply f to each number in [n...m] *) (*--------------------------------------------------------------------*) fun appInterval f (n,m) = let fun doit i = if i>m then () else let val _ = f i in doit (i+1) end in doit n end (*--------------------------------------------------------------------*) (* insert an integer into a sorted list without duplicates. *) (*--------------------------------------------------------------------*) fun insertInt (x:int,l) = let fun go nil = [x] | go (l as y::ys) = case Int.compare (x,y) of LESS => x::l | EQUAL => l | GREATER => y::go ys in go l end (*--------------------------------------------------------------------*) (* insert an integer into a sorted list if it is not yet in it. *) (*--------------------------------------------------------------------*) fun insertNewInt (x:int,l) = let fun go nil = SOME [x] | go (l as y::ys) = case Int.compare (x,y) of LESS => SOME(x::l) | EQUAL => NONE | GREATER => case go ys of NONE => NONE | SOME xys => SOME(y::xys) in go l end (*--------------------------------------------------------------------*) (* compute the power to the base of two. *) (*--------------------------------------------------------------------*) fun powerOfTwo n = if n=0 then 1 else if n mod 2=0 then let val x=powerOfTwo (n div 2) in x*x end else let val x=powerOfTwo (n-1) in 2*x end (*--------------------------------------------------------------------*) (* find the smallest p with 2^p >= n. *) (*--------------------------------------------------------------------*) fun nextPowerTwo n = let fun doit (p,m) = if m>=n then p else if m*m<2*n then doit (2*p,m*m) else doit (1+p,2*m) in doit (1,2) end end (* stop of ../../Util/utilInt.sml *) (* start of ../../Util/utilError.sml *) signature UtilError = sig exception InternalError of string * string * string exception NoSuchFile of string * string val formatMessage : int * int -> string list -> string end structure UtilError : UtilError = struct open UtilString exception InternalError of string * string * string exception NoSuchFile of string * string fun formatMessage (indentWidth,lineWidth) strs = let val indent = nBlanks indentWidth val nl = "\n"^indent val blank = " " val dot = "." fun isSep c = #" "=c orelse #"\n"=c orelse #"\t"=c fun go (w,yet) nil = List.rev ("\n"::yet) | go (w,yet) (x::xs) = let val y = if null xs then x^dot else x val l = String.size y val w1 = w+l val (w2,yet2) = if w1<=lineWidth then (w1,y::yet) else (indentWidth+l,y::nl::yet) val (w3,yet3) = if null xs then (w2,yet2) else (if w2 'a Dict val makeDict : string * int * 'a -> 'a Dict val clearDict : 'a Dict * int option -> unit val hasIndex : 'a Dict * Key -> int option val getIndex : 'a Dict * Key -> int val getKey : 'a Dict * int -> Key val getByIndex : 'a Dict * int -> 'a val getByKey : 'a Dict * Key -> 'a val setByIndex : 'a Dict * int * 'a -> unit val setByKey : 'a Dict * Key * 'a -> unit val usedIndices : 'a Dict -> int val extractDict : 'a Dict -> (Key * 'a) array val printDict : ('a -> string) -> 'a Dict -> unit end functor Dict (structure Key : Key) : Dict = struct open UtilError UtilInt type Key = Key.Key exception NoSuchIndex (*--------------------------------------------------------------------*) (* a dictionary can have at most size MAX_WIDTH. This is because *) (* arrays may at most have Array.maxLen elements. We only use powers *) (* of two as sizes, so we are really only interested in the position *) (* of maxLen's highest bit. That would be the maximal width for hash *) (* tables, and thus we must decrease it by one for obtaining the max *) (* table width. *) (*--------------------------------------------------------------------*) fun highestBit w = if w=0w0 then 0 else 1+highestBit(Word.>>(w,0w1)) val MAX_WIDTH = highestBit (Word.fromInt Array.maxLen)-1 type Bucket = (Key * int) list val nullBucket = nil : Bucket (*--------------------------------------------------------------------*) (* buckets are unsorted - they are probably small, so comparing the *) (* keys might be overkill. *) (*--------------------------------------------------------------------*) fun addToBucket (ni as (key,_),bucket) = let fun doit nil = [ni] | doit (nis as (ni' as (key',_))::rest) = case Key.compare (key',key) of LESS => ni'::doit rest | EQUAL => ni::rest | GREATER => ni::nis in doit bucket end fun searchBucket (key,bucket) = let fun doit nil = NONE | doit ((key',i)::rest) = case Key.compare (key',key) of LESS => doit rest | EQUAL => SOME i | GREATER => NONE in doit bucket end (*--------------------------------------------------------------------*) (* a dictionary consists of *) (* - a string desc saying what is stored in this dictionary *) (* - an array tab holding for each index its key and value *) (* - a hash table, i.e. Bucket array, of double size than tab *) (* - a hashFun mapping Key to the range of the hash table *) (* - an integer width for computing table sizes *) (* - an integer size wich is the size of the value table *) (* - an integer count holding the next free index *) (* - a default value for the value table *) (*--------------------------------------------------------------------*) type 'a Dict = {desc : string, tab : (Key * 'a) array ref, hashTab : Bucket array ref, hashFun : (Key -> int) ref, width : int ref, (* bit width *) size : int ref, (* tab size=2^width, hash size is double *) count : int ref, (* number of entries *) def : 'a (* default for values *) } fun nullDict (desc,def) = {desc = desc, tab = ref (Array.array(1,(Key.null,def))), hashTab = ref (Array.array(2,nullBucket)), hashFun = ref (fn _ => 0), count = ref 0, size = ref 1, width = ref 0, def = def} (*--------------------------------------------------------------------*) (* how many entries are in the dictionary? *) (*--------------------------------------------------------------------*) fun usedIndices ({count,...}:'a Dict) = !count (*--------------------------------------------------------------------*) (* what is the table load, i.e. percentage of number of entries to *) (* hash table size = 100*count/(2*size) = 50*count/size. *) (*--------------------------------------------------------------------*) fun hashRatio({count,size,...}:'a Dict) = 50 * !count div !size handle Div => 100 (*--------------------------------------------------------------------*) (* this is the hash function. Key.hash hashes data to arbitrary *) (* words, that are mapped to the hash range by this function, where *) (* mask is the bitmask corresponding to the size of the hash table: *) (* 1. square the word produced by Key.hash *) (* 2. take the width bits from the middle of the square, these are *) (* the bit-places influenced by all input bit-places: *) (* - shift to the right by half of the destination width *) (* - mask out all bits to the left of destination *) (* this is a simple strategy but experiences good results. *) (*--------------------------------------------------------------------*) fun square (x:word) = Word.*(x,x) fun hashKey(half,mask) x = Word.toInt(Word.andb(mask,Word.>>(square(Key.hash x),half))) fun makeHashFun(size,width) = let val mask = 0w2*Word.fromInt size-0w1 val half = Word.fromInt((width+1) div 2) in hashKey(half,mask) end (*--------------------------------------------------------------------*) (* create a new dictionary for 2^w, but at least 2 and at most 2^m *) (* entries, where m is the value of MAX_WIDTH. *) (*--------------------------------------------------------------------*) fun makeDict (desc,w,def) = let val width= Int.min(Int.max(1,w),MAX_WIDTH) val size = Word.toInt(Word.<<(0w1,Word.fromInt(width-1))) in {desc = desc, tab = ref (Array.array(size,(Key.null,def))), hashTab = ref (Array.array(2*size,nullBucket)), hashFun = ref (makeHashFun(size,width)), width = ref width, size = ref size, count = ref 0, def = def} end (*--------------------------------------------------------------------*) (* clear a dictionary. If the 2nd arg is SOME w, use w for resizing. *) (*--------------------------------------------------------------------*) fun clearDict (dict:'a Dict,widthOpt) = case widthOpt of NONE => let val {tab=ref tab,hashTab=ref hashTab,size,count,def,...} = dict val _ = appInterval (fn i => Array.update(tab,i,(Key.null,def))) (0,!count-1) val _ = appInterval (fn i => Array.update(hashTab,i,nullBucket)) (0,!size*2-1) in count := 0 end | SOME w => let val {tab,hashTab,hashFun,width,size,count,def,...} = dict val newWidth = Int.min(Int.max(1,w),MAX_WIDTH) val newSize = Word.toInt(Word.<<(0w1,Word.fromInt(newWidth-1))) val _ = tab := (Array.array(newSize,(Key.null,def))) val _ = hashTab := (Array.array(2*newSize,nullBucket)) val _ = hashFun := (makeHashFun(newSize,newWidth)) val _ = width := newWidth val _ = size := newSize in count := 0 end (*--------------------------------------------------------------------*) (* grow a dictionary to the double size. raise InternalError if the *) (* dictionary already has maximal size. *) (*--------------------------------------------------------------------*) fun growDictionary ({desc,tab,hashTab,hashFun,width,size,count,def}:'a Dict) = let val oldTab = !tab val _ = if !width < MAX_WIDTH then width := !width+1 else raise InternalError ("Dict","growDictionary", String.concat ["growing the ",desc," dictionary ", "exceeded the system maximum size of ", Int.toString Array.maxLen," for arrays"]) val _ = size := !size*2 val _ = tab := Array.array(!size,(Key.null,def)) val _ = hashTab := Array.array(!size*2,nullBucket) val _ = hashFun := makeHashFun(!size,!width) fun addTo (i,kv as (key,_)) = let val idx = !hashFun key val _ = Array.update(!hashTab,idx,addToBucket((key,i),Array.sub(!hashTab,idx))) val _ = Array.update(!tab,i,kv) in () end in Array.appi addTo (oldTab,0,NONE) end (*--------------------------------------------------------------------*) (* lookup the key for an index of the dictionary. *) (*--------------------------------------------------------------------*) fun getKey({tab,count,...}:'a Dict,idx) = if !count>idx then #1(Array.sub(!tab,idx)) else raise NoSuchIndex (*--------------------------------------------------------------------*) (* map a Key to its index in the dictionary. if it is not in the *) (* dictionary yet, add a new entry with a new index. grow the table *) (* if there is no more free index in the dictionary. *) (*--------------------------------------------------------------------*) fun getIndex(dict as {tab,hashTab,hashFun,size,count,def,...}:'a Dict,key) = let val k = !hashFun key val bucket = Array.sub(!hashTab,k) in case searchBucket(key,bucket) of SOME idx => idx | NONE => let val idx = !count val (k',buck') = if !size>idx then (k,bucket) else let val _ = growDictionary dict val k' = !hashFun key val buck' = Array.sub(!hashTab,k') in (k',buck') end val _ = Array.update(!hashTab,k',addToBucket((key,idx),buck')) val _ = Array.update(!tab,idx,(key,def)) val _ = count := idx+1 in idx end end (*--------------------------------------------------------------------*) (* does a Key have an entry in a dictionary? *) (*--------------------------------------------------------------------*) fun hasIndex({hashTab,hashFun,...}:'a Dict,key) = let val idx = !hashFun key val bucket = Array.sub(!hashTab,idx) in searchBucket(key,bucket) end (*--------------------------------------------------------------------*) (* get the value stored for index idx *) (*--------------------------------------------------------------------*) fun getByIndex({tab,count,...}:'a Dict,idx) = if !count>idx then #2(Array.sub(!tab,idx)) else raise NoSuchIndex (*--------------------------------------------------------------------*) (* get the value stored for a key *) (*--------------------------------------------------------------------*) fun getByKey(dict,key) = getByIndex(dict,getIndex(dict,key)) (*--------------------------------------------------------------------*) (* enter a value for index idx. *) (*--------------------------------------------------------------------*) fun setByIndex({tab,count,...}:'a Dict,idx,a) = if !count>idx then let val (key,_) = Array.sub(!tab,idx) in Array.update(!tab,idx,(key,a)) end else raise NoSuchIndex (*--------------------------------------------------------------------*) (* enter a value for a key. *) (*--------------------------------------------------------------------*) fun setByKey(dict,key,v) = setByIndex(dict,getIndex(dict,key),v) (*--------------------------------------------------------------------*) (* extract the contents of the dictionary to an array. *) (*--------------------------------------------------------------------*) fun extractDict({count,tab,...}:'a Dict) = Array.tabulate(!count,fn i => Array.sub(!tab,i)) (*--------------------------------------------------------------------*) (* print the contents of the dictionary. *) (*--------------------------------------------------------------------*) fun printDict X2String ({desc,tab,count,...}:'a Dict) = (print (desc^" dictionary:\n"); Array.appi (fn (n,(key,value)) => print (" "^Int.toString n^": "^Key.toString key^" = "^X2String value^"\n")) (!tab,0,SOME (!count))) end (* stop of ../../Util/SymDict/dict.sml *) (* start of ../../Util/SymDict/symbolTable.sml *) (*--------------------------------------------------------------------------*) (* Functor: SymbolTable *) (* *) (* Exceptions raised by functions in this structure: *) (* getSymIndex : Key.InternalError *) (* getSymKey : NoSuchSymbol *) (* hasSymIndex : none *) (* makeSymTable : none *) (* nullSymTable : none *) (* printSymTable : none *) (* usedSymbols : none *) (*--------------------------------------------------------------------------*) (* A symbol table maps Keys to consecutive integers. *) (*--------------------------------------------------------------------------*) signature SymTable = sig type Key type SymTable exception NoSuchSymbol val nullSymTable : string -> SymTable val makeSymTable : string * int -> SymTable val clearSymTable : SymTable * int option -> unit val hasSymIndex : SymTable * Key -> int option val getSymIndex : SymTable * Key -> int val getSymKey : SymTable * int -> Key val usedSymbols : SymTable -> int val assignSymIndex : SymTable * Key * int -> unit val reserveSymIndex : SymTable -> int val extractSymTable : SymTable -> Key vector val printSymTable : SymTable -> unit end functor SymTable (structure Key : Key) : SymTable = struct open UtilError UtilInt exception NoSuchSymbol type Key = Key.Key (*--------------------------------------------------------------------*) (* a symbol table can have at most size MAX_WIDTH. This is because *) (* arrays may at most have Array.maxLen elements. We only use powers *) (* of two as sizes, so we are really only interested in the position *) (* of maxLen's highest bit. That would be the maximal width for hash *) (* tables, and thus we must decrease it by one for obtaining the max *) (* table width. *) (*--------------------------------------------------------------------*) fun highestBit w = if w=0w0 then 0 else 1+highestBit(Word.>>(w,0w1)) val MAX_WIDTH = highestBit (Word.fromInt Array.maxLen)-1 type Bucket = (Key * int) list val nullBucket = nil : Bucket (*--------------------------------------------------------------------*) (* buckets are sorted - though they are probably small. *) (*--------------------------------------------------------------------*) fun addToBucket (ni as (key,_),bucket) = let fun doit nil = [ni] | doit (nis as (ni' as (key',_))::rest) = case Key.compare (key',key) of LESS => ni'::doit rest | EQUAL => ni::rest | GREATER => ni::nis in doit bucket end fun searchBucket (key,bucket) = let fun doit nil = NONE | doit ((key',i)::rest) = case Key.compare (key',key) of LESS => doit rest | EQUAL => SOME i | GREATER => NONE in doit bucket end (*--------------------------------------------------------------------*) (* a symbol table consists of *) (* - an array tab holding for each index its key *) (* - a hash table, i.e. Bucket array, of double size than tab *) (* - a hashFun mapping Key to the range of the hash table *) (* - an integer width for computing table sizes *) (* - an integer size wich is the size of the value table *) (* - an integer count holding the next free index *) (*--------------------------------------------------------------------*) type SymTable = {desc : string, tab : Key array ref, hash : Bucket array ref, hashFun : (Key -> int) ref, width : int ref, (* bit width *) size : int ref, (* tab size=2^width, hash size is double *) count : int ref (* number of entries *) } fun nullSymTable desc = {desc = desc, tab = ref (Array.array(1,Key.null)), hash = ref (Array.array(2,nullBucket)), hashFun = ref (fn _ => 0), count = ref 0, size = ref 1, width = ref 0} : SymTable (*--------------------------------------------------------------------*) (* how many entries are in the symtable? *) (*--------------------------------------------------------------------*) fun usedSymbols ({count,...}:SymTable) = !count (*--------------------------------------------------------------------*) (* what is the table load, i.e. percentage of number of entries to *) (* hash table size = 100*count/(2*size) = 50*count/size. *) (*--------------------------------------------------------------------*) fun hashRatio({count,size,...}:SymTable) = 50 * !count div !size handle Div => 100 (*--------------------------------------------------------------------*) (* this is the hash function. Key.hash hashes data to arbitrary *) (* words, that are mapped to the hash range by this function, where *) (* mask is the bitmask corresponding to the size of the hash table: *) (* 1. square the word produced by Key.hash *) (* 2. take the width bits from the middle of the square, these are *) (* the bit-places influenced by all input bit-places: *) (* - shift to the right by half of the destination width *) (* - mask out all bits to the left of destination *) (* this is a simple strategy but experiences good results. *) (*--------------------------------------------------------------------*) fun square (x:word) = Word.*(x,x) fun hashKey(half,mask) x = Word.toInt(Word.andb(mask,Word.>>(square(Key.hash x),half))) fun makeHashFun(size,width) = let val mask = Word.fromInt(2*size-1) val half = Word.fromInt((width+1) div 2) in hashKey(half,mask) end (*--------------------------------------------------------------------*) (* create a new symtable for 2^w, but at least 2 and at most 2^m *) (* entries, where m is the value of MAX_WIDTH. *) (*--------------------------------------------------------------------*) fun makeSymTable (desc,w) = let val width= Int.min(Int.max(1,w),MAX_WIDTH) val size = Word.toInt(Word.<<(0w1,Word.fromInt(width-1))) in {desc = desc, tab = ref (Array.array(size,Key.null)), hash = ref (Array.array(2*size,nullBucket)), hashFun = ref (makeHashFun(size,width)), width = ref width, size = ref size, count = ref 0} end (*--------------------------------------------------------------------*) (* clear a dictionary. If the 2nd arg is SOME w, use w for resizing. *) (*--------------------------------------------------------------------*) fun clearSymTable (symTab:SymTable,widthOpt) = case widthOpt of NONE => let val {tab=ref tab,hash=ref hash,size,count,...} = symTab val _ = appInterval (fn i => Array.update(tab,i,Key.null)) (0,!count-1) val _ = appInterval (fn i => Array.update(hash,i,nullBucket)) (0,!size*2-1) in count := 0 end | SOME w => let val {tab,hash,hashFun,width,size,count,...} = symTab val newWidth = Int.min(Int.max(1,w),MAX_WIDTH) val newSize = Word.toInt(Word.<<(0w1,Word.fromInt(newWidth-1))) val _ = tab := (Array.array(newSize,Key.null)) val _ = hash := (Array.array(2*newSize,nullBucket)) val _ = hashFun := (makeHashFun(newSize,newWidth)) val _ = width := newWidth val _ = size := newSize in count := 0 end (*--------------------------------------------------------------------*) (* grow a symtable to the double size. raise InternalError if the *) (* table already has maximal size. *) (*--------------------------------------------------------------------*) fun growTable ({desc,tab,hash,hashFun,width,size,count}:SymTable) = let val newWidth = if !width < MAX_WIDTH then !width+1 else raise InternalError ("SymTable","growTable", String.concat ["growing the ",desc," symbol table ", "exceeded the system maximum size of ", Int.toString Array.maxLen," for arrays"]) val newSize = !size*2 val oldTab = !tab val newTab = Array.array(newSize,Key.null) val newHash = Array.array(2*newSize,nullBucket) val newHashFun = makeHashFun(newSize,newWidth) fun addToNew (inv as (i,key)) = let val idx = newHashFun key val _ = Array.update(newHash,idx,addToBucket((key,i),Array.sub(newHash,idx))) val _ = Array.update(newTab,i,key) in () end val _ = Array.appi addToNew (!tab,0,NONE) val _ = tab := newTab val _ = hash := newHash val _ = size := newSize val _ = width := newWidth val _ = hashFun := newHashFun in () end (*--------------------------------------------------------------------*) (* lookup the key for an index of the symbol table. *) (*--------------------------------------------------------------------*) fun getSymKey({tab,count,...}:SymTable,idx) = if !count>idx then Array.sub(!tab,idx) else raise NoSuchSymbol (*--------------------------------------------------------------------*) (* map a Key to its index in the symbol table. if it is not in the *) (* symbol table yet, add a new entry with a new index. grow the table *) (* if there is no more free index in the table. *) (*--------------------------------------------------------------------*) fun getSymIndex(st as {tab,hash,hashFun,size,count,...}:SymTable,key) = let val idx = !hashFun key val bucket = Array.sub(!hash,idx) in case searchBucket(key,bucket) of SOME i => i | NONE => let val i = !count val (idx',buck') = if !size>i then (idx,bucket) else let val _ = growTable st val idx' = !hashFun key val buck' = Array.sub(!hash,idx') in (idx',buck') end val _ = Array.update(!hash,idx',addToBucket((key,i),buck')) val _ = Array.update(!tab,i,key) val _ = count := i+1 in i end end (*--------------------------------------------------------------------*) (* does a Key have an entry in a symbol table? *) (*--------------------------------------------------------------------*) fun hasSymIndex({hash,hashFun,...}:SymTable,key) = let val idx = !hashFun key val buck = Array.sub(!hash,idx) in searchBucket(key,buck) end (*--------------------------------------------------------------------*) (* reserve an index for a (yet unknown) key. *) (*--------------------------------------------------------------------*) fun reserveSymIndex(st as {size,count=count as ref i,...}:SymTable) = let val _ = if !size>i then () else growTable st val _ = count := i+1 in i end (*--------------------------------------------------------------------*) (* assign an index to a (previously reserved) index. *) (*--------------------------------------------------------------------*) fun assignSymIndex(st as {count,hash,hashFun,tab,...}:SymTable,key,i) = if !count<=i then raise NoSuchSymbol else let val idx = !hashFun key val buck = Array.sub(!hash,idx) val newBuck = addToBucket((key,i),buck) val _ = Array.update(!hash,idx,newBuck) val _ = Array.update(!tab,i,key) in () end (*--------------------------------------------------------------------*) (* extract the contents of a symbol table to a vector. *) (*--------------------------------------------------------------------*) fun extractSymTable({count,tab,...}:SymTable) = Array.extract(!tab,0,SOME(!count)) (*--------------------------------------------------------------------*) (* print the contents of the symbol table. *) (*--------------------------------------------------------------------*) fun printSymTable ({desc,tab,count,...}:SymTable) = (print (desc^" table:\n"); Array.appi (fn (n,key) => print (" "^Int.toString n^": "^Key.toString key^"\n")) (!tab,0,SOME (!count))) end (* stop of ../../Util/SymDict/symbolTable.sml *) (* start of ../../Util/SymDict/intListDict.sml *) structure KeyIntList : Key = struct type Key = int list val null = nil val hash = UtilHash.hashList Word.fromInt val compare = UtilCompare.compareList Int.compare val toString = UtilString.List2String Int.toString end structure IntListDict = Dict (structure Key = KeyIntList) structure IntListSymTab = SymTable (structure Key = KeyIntList) (* stop of ../../Util/SymDict/intListDict.sml *) (* start of ../../Util/SymDict/intDict.sml *) structure KeyInt : Key = struct type Key = int val null = 0 val hash = Word.fromInt val compare = Int.compare val toString = Int.toString end structure IntDict = Dict (structure Key = KeyInt) structure IntSymTab = SymTable (structure Key = KeyInt) (* stop of ../../Util/SymDict/intDict.sml *) (* start of ../../Unicode/Chars/uniChar.sml *) (*--------------------------------------------------------------------------*) (* Structure: UniChar *) (* *) (* Depends on: *) (* UtilString *) (* *) (* Exceptions raised by functions in this structure: *) (*--------------------------------------------------------------------------*) signature UniChar = sig structure Chars : WORD type Char = Chars.word type Data = Char list type Vector = Char vector val nullData : Data val nullVector : Vector val hashChar : Char -> word val hashData : Data -> word val hashVector : Vector -> word val compareChar : Char * Char -> order val compareData : Data * Data -> order val compareVector : Vector * Vector -> order val char2Char : char -> Char val Char2char : Char -> char val Char2Uni : Char -> string val Char2String : Char -> string val String2Data : string -> Data val Data2String : Data -> string val Latin2String : Data -> string val Data2Vector : Data -> Vector val Vector2Data : Vector -> Data val String2Vector : string -> Vector val Vector2String : Vector -> string val quoteUni : Char -> string -> string val quoteChar : Char -> Char -> string val quoteData : Char -> Data -> string val quoteVector : Char -> Vector -> string end structure UniChar : UniChar = struct val O_VECTOR_PRINTLEN = 48 structure Chars = Word val _ = if Chars.wordSize > 21 then () else let val str = ("UniChar: Chars.wordSize is too small.\n"^ "Cannot compile on this system!\n" ) val _ = print str in raise Fail str end type Char = Chars.word type Data = Char list type CharInterval = Char * Char type CharRange = CharInterval list type Vector = Char vector val nullChar = 0wx0:Char val nullData = nil:Data val nullVector = Vector.fromList nullData val hashChar = Word.fromLargeWord o Chars.toLargeWord val hashData = UtilHash.hashList hashChar val hashVector = UtilHash.hashVector hashChar val compareChar = Chars.compare val compareData = UtilCompare.compareList compareChar val compareVector = UtilCompare.compareVector compareChar val char2Char = Chars.fromLargeWord o Word8.toLargeWord o Byte.charToByte val Char2char = Byte.byteToChar o Word8.fromLargeWord o Chars.toLargeWord fun Char2Uni c = "U+"^UtilString.toUpperString(StringCvt.padLeft #"0" 4 (Chars.toString c)) fun Char2String c = case c of 0wx9 => "\\t" | 0wxA => "\\n" | _ => if c<0wx100 then String.implode [Char2char c] else Char2Uni c fun String2Data s = map char2Char (String.explode s) fun Data2String cs = String.concat (map Char2String cs) fun Latin2String cs = String.implode (map Char2char cs) val Data2Vector = Vector.fromList fun String2Vector s = Vector.tabulate(String.size s,fn i => char2Char(String.sub(s,i))) fun Vector2Data vec = Vector.foldr (op ::) nil vec fun Vector2String vec = let val maxlen = O_VECTOR_PRINTLEN val len = Vector.length vec in if len<=maxlen orelse maxlen=0 then Data2String (Vector2Data vec) else let val cs1 = Vector.foldri (fn (_,c,cs) => c::cs) nil (vec,0,SOME (maxlen div 2)) val cs2 = Vector.foldri (fn (_,c,cs) => c::cs) nil (vec,len-3-maxlen div 2,NONE) in Data2String cs1^"..."^Data2String cs2 end end fun quoteUni q s = let val sQ = Char2String q in sQ^s^sQ end fun quoteChar q c = if c=0wx0 then "entity end" else quoteUni q (Char2String c) fun quoteData q cs = quoteUni q (Data2String cs) fun quoteVector q v = quoteUni q (Vector2String v) end (* stop of ../../Unicode/Chars/uniChar.sml *) (* start of ../../Unicode/Chars/charVecDict.sml *) structure KeyVector : Key = struct type Key = UniChar.Vector val null = UniChar.nullVector val compare = UniChar.compareVector val toString = UniChar.Vector2String val hash = UniChar.hashVector end structure VectorDict = Dict (structure Key = KeyVector) (* stop of ../../Unicode/Chars/charVecDict.sml *) (* start of ../../Util/SymDict/stringDict.sml *) structure KeyString : Key = struct type Key = string val null = "" val hash = UtilHash.hashString val compare = String.compare fun toString str = str end structure StringDict = Dict (structure Key = KeyString) (* stop of ../../Util/SymDict/stringDict.sml *) (* start of ../../Unicode/encoding.sml *) signature Encoding = sig datatype Encoding = NOENC | ASCII | EBCDIC | LATIN1 | UCS4B | UCS4L | UCS4SB | UCS4SL | UCS2B | UCS2L | UTF16B | UTF16L | UTF8 val UCS2 : Encoding val UCS4 : Encoding val UTF16 : Encoding val encodingName : Encoding -> string val isEncoding : string -> Encoding val switchEncoding : Encoding * Encoding -> Encoding end structure Encoding : Encoding = struct open StringDict datatype Encoding = NOENC | ASCII | EBCDIC | LATIN1 | UCS4B | UCS4L | UCS4SB | UCS4SL | UCS2B | UCS2L | UTF16B | UTF16L | UTF8 val UCS2 = UCS2B val UCS4 = UCS4B val UTF16 = UTF16B fun encodingName enc = case enc of NOENC => "NONE" | ASCII => "ASCII" | EBCDIC => "EBCDIC" | LATIN1 => "ISO-8859-1" | UCS2B => "UCS-2" | UCS2L => "UCS-2" | UCS4B => "UCS-4" | UCS4L => "UCS-4" | UCS4SB => "UCS-4" | UCS4SL => "UCS-4" | UTF8 => "UTF-8" | UTF16B => "UTF-16" | UTF16L => "UTF-16" val encDict = makeDict("encoding",6,NOENC) val encAliases = [(ASCII,["ANSI_X3.4-1968","ANSI_X3.4-1986","ASCII","US-ASCII","US", "ISO646-US","ISO-IR-6","ISO_646.IRV:1991","IBM367","CP367"]), (EBCDIC,["EBCDIC"]), (LATIN1,["ISO_8859-1:1987","ISO-8859-1","ISO_8859-1", "ISO-IR-100","CP819","IBM819","L1","LATIN1"]), (UCS2,["UCS-2","ISO-10646-UCS-2"]), (UCS4,["UCS-4","ISO-10646-UCS-4"]), (UTF16,["UTF-16"]), (UTF8,["UTF-8"]) ] val _ = app (fn (x,ys) => app (fn y => setByKey(encDict,y,x)) ys) encAliases fun isEncoding name = getByKey(encDict,name) fun compatAscii new = case new of ASCII => new | LATIN1 => new | UTF8 => new | _ => NOENC fun compatUcs4 (old,new) = if new=UCS4 then old else NOENC fun switchEncoding(old,new) = case old of NOENC => NOENC | ASCII => compatAscii new | EBCDIC => if new=EBCDIC then new else NOENC | LATIN1 => compatAscii new | UCS4B => compatUcs4(old,new) | UCS4L => compatUcs4(old,new) | UCS4SB => compatUcs4(old,new) | UCS4SL => compatUcs4(old,new) | UTF16B => if new=UTF16 then old else if new=UCS2 then UCS2B else NOENC | UTF16L => if new=UTF16 then old else if new=UCS2 then UCS2L else NOENC | UCS2B => if new=UCS2 then old else if new=UTF16 then UTF16B else NOENC | UCS2L => if new=UCS2 then old else if new=UTF16 then UTF16L else NOENC | UTF8 => compatAscii new end (* stop of ../../Unicode/encoding.sml *) (* start of ../../Unicode/Encode/encodeBasic.sml *) (*--------------------------------------------------------------------------*) (* Structure: EncodeBasic *) (* *) (* Exceptions raised by functions in this structure: *) (* closeFile : none *) (* fileName : none *) (* openFile : NoSuchFile *) (* writeByte : Io *) (*--------------------------------------------------------------------------*) signature EncodeBasic = sig type File val stdOutFile : File val closeFile : File -> unit val fileName : File -> string val openFile : string -> File val writeByte : File * Word8.word -> File end structure EncodeBasic : EncodeBasic = struct open UtilError type outstream = TextIO.outstream val closeOut = TextIO.closeOut val openOut = TextIO.openOut val output1 = TextIO.output1 val stdOut = TextIO.stdOut type File = string * outstream val stdOutFile = ("-",stdOut) fun closeFile(fname,s) = if fname="-" then () else closeOut s fun fileName(fname,_) = if fname="-" then "" else fname fun openFile fname = if fname = "-" then (fname,stdOut) else (fname,openOut fname) handle IO.Io {name,cause,...} => raise NoSuchFile(name,exnMessage cause) fun writeByte (f as (_,s),b) = f before output1(s,chr(Word8.toInt b)) end (* stop of ../../Unicode/Encode/encodeBasic.sml *) (* start of ../../Unicode/Encode/encodeError.sml *) signature EncodeError = sig datatype EncodeError = ERR_ILLEGAL_CHAR of UniChar.Char * string val encodeMessage : EncodeError -> string list exception EncodeError of EncodeBasic.File * EncodeError end structure EncodeError : EncodeError = struct open UtilString UniChar datatype EncodeError = ERR_ILLEGAL_CHAR of UniChar.Char * string fun encodeMessage err = case err of ERR_ILLEGAL_CHAR(c,what) => [Char2Uni c,"is not",prependAnA what,"character"] exception EncodeError of EncodeBasic.File * EncodeError end (* stop of ../../Unicode/Encode/encodeError.sml *) (* start of ../../Unicode/Encode/encodeMisc.sml *) (* require "basis.__word"; require "basis.__word8"; require "basis.__word8_vector"; require "chars"; require "encodeBasic"; require "encodeError"; *) signature EncodeMisc = sig val writeCharAscii : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharEbcdic : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharLatin1 : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs4B : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs4L : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs4SB : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs4SL : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUtf8 : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUtf16B : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUtf16L : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs2B : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val writeCharUcs2L : UniChar.Char * EncodeBasic.File -> EncodeBasic.File val validCharAscii : UniChar.Char -> bool val validCharEbcdic : UniChar.Char -> bool val validCharLatin1 : UniChar.Char -> bool end structure EncodeMisc : EncodeMisc = struct open UniChar EncodeBasic EncodeError infix 8 >> infix 7 && infix 6 || val op && = Chars.andb val op >> = Chars.>> val op || = Word8.orb fun splitSurrogates (c : Char) = (((c-0wx10000) >> 0w10)+0wxD800,c && 0wx3FF + 0wxDC00) fun Char2Byte c = Word8.fromLargeWord(Chars.toLargeWord c) (*---------------------------------------------------------------------*) (* Ascii *) (*---------------------------------------------------------------------*) fun validCharAscii (c : Char) = c<0wx80 fun writeCharAscii(c,f) = if c<0wx80 then writeByte(f,Char2Byte c) else raise EncodeError(f,ERR_ILLEGAL_CHAR(c,"ASCII")) (*---------------------------------------------------------------------*) (* Ebcdic *) (*---------------------------------------------------------------------*) val latin2ebcdicTab = Word8Vector.fromList [0wx00,0wx01,0wx02,0wx03,0wx37,0wx2D,0wx2E,0wx2F, 0wx16,0wx05,0wx25,0wx0B,0wx0C,0wx0D,0wx0E,0wx0F, 0wx10,0wx11,0wx12,0wx13,0wx3C,0wx3D,0wx32,0wx26, 0wx18,0wx19,0wx3F,0wx27,0wx1C,0wx1D,0wx1E,0wx1F, 0wx40,0wx4F,0wx7F,0wx7B,0wx5B,0wx6C,0wx50,0wx7D, 0wx4D,0wx5D,0wx5C,0wx4E,0wx6B,0wx60,0wx4B,0wx61, 0wxF0,0wxF1,0wxF2,0wxF3,0wxF4,0wxF5,0wxF6,0wxF7, 0wxF8,0wxF9,0wx7A,0wx5E,0wx4C,0wx7E,0wx6E,0wx6F, 0wx7C,0wxC1,0wxC2,0wxC3,0wxC4,0wxC5,0wxC6,0wxC7, 0wxC8,0wxC9,0wxD1,0wxD2,0wxD3,0wxD4,0wxD5,0wxD6, 0wxD7,0wxD8,0wxD9,0wxE2,0wxE3,0wxE4,0wxE5,0wxE6, 0wxE7,0wxE8,0wxE9,0wx4A,0wxE0,0wx5A,0wx5F,0wx6D, 0wx79,0wx81,0wx82,0wx83,0wx84,0wx85,0wx86,0wx87, 0wx88,0wx89,0wx91,0wx92,0wx93,0wx94,0wx95,0wx96, 0wx97,0wx98,0wx99,0wxA2,0wxA3,0wxA4,0wxA5,0wxA6, 0wxA7,0wxA8,0wxA9,0wxC0,0wx6A,0wxD0,0wxA1,0wx07, 0wx20,0wx21,0wx22,0wx23,0wx24,0wx15,0wx06,0wx17, 0wx28,0wx29,0wx2A,0wx2B,0wx2C,0wx09,0wx0A,0wx1B, 0wx30,0wx31,0wx1A,0wx33,0wx34,0wx35,0wx36,0wx08, 0wx38,0wx39,0wx3A,0wx3B,0wx04,0wx14,0wx3E,0wxE1, 0wx41,0wx42,0wx43,0wx44,0wx45,0wx46,0wx47,0wx48, 0wx49,0wx51,0wx52,0wx53,0wx54,0wx55,0wx56,0wx57, 0wx58,0wx59,0wx62,0wx63,0wx64,0wx65,0wx66,0wx67, 0wx68,0wx69,0wx70,0wx71,0wx72,0wx73,0wx74,0wx75, 0wx76,0wx77,0wx78,0wx80,0wx8A,0wx8B,0wx8C,0wx8D, 0wx8E,0wx8F,0wx90,0wx9A,0wx9B,0wx9C,0wx9D,0wx9E, 0wx9F,0wxA0,0wxAA,0wxAB,0wxAC,0wxAD,0wxAE,0wxAF, 0wxB0,0wxB1,0wxB2,0wxB3,0wxB4,0wxB5,0wxB6,0wxB7, 0wxB8,0wxB9,0wxBA,0wxBB,0wxBC,0wxBD,0wxBE,0wxBF, 0wxCA,0wxCB,0wxCC,0wxCD,0wxCE,0wxCF,0wxDA,0wxDB, 0wxDC,0wxDD,0wxDE,0wxDF,0wxEA,0wxEB,0wxEC,0wxED, 0wxEE,0wxEF,0wxFA,0wxFB,0wxFC,0wxFD,0wxFE,0wxFF ] fun validCharEbcdic (c : Char) = c<0wx100 fun writeCharEbcdic(c,f) = if c<0wx100 then writeByte(f,Word8Vector.sub(latin2ebcdicTab,Chars.toInt c)) else raise EncodeError(f,ERR_ILLEGAL_CHAR(c,"EBCDIC")) (*---------------------------------------------------------------------*) (* Latin1 *) (*---------------------------------------------------------------------*) fun validCharLatin1 (c : Char) = c<0wx100 fun writeCharLatin1(c,f) = if c<0wx100 then writeByte(f,Char2Byte c) else raise EncodeError(f,ERR_ILLEGAL_CHAR(c,"LATIN-1")) (*---------------------------------------------------------------------*) (* UCS-4 *) (*---------------------------------------------------------------------*) fun ucs4Bytes c = (Char2Byte(c >> 0w24), Char2Byte(c >> 0w16), Char2Byte(c >> 0w8), Char2Byte c) fun writeCharUcs4 perm = fn (c,f) => let val bytes = ucs4Bytes c val (b1,b2,b3,b4) = perm bytes val f1 = writeByte(f,b1) val f2 = writeByte(f1,b2) val f3 = writeByte(f2,b3) val f4 = writeByte(f3,b4) in f4 end fun permUcs4B x = x fun permUcs4L (b1,b2,b3,b4) = (b4,b3,b2,b1) fun permUcs4SB (b1,b2,b3,b4) = (b2,b1,b4,b3) fun permUcs4SL (b1,b2,b3,b4) = (b3,b4,b1,b2) val writeCharUcs4B = writeCharUcs4 permUcs4B val writeCharUcs4L = writeCharUcs4 permUcs4L val writeCharUcs4SB = writeCharUcs4 permUcs4SB val writeCharUcs4SL = writeCharUcs4 permUcs4SL (*---------------------------------------------------------------------*) (* UTF-8 *) (*---------------------------------------------------------------------*) fun writeCharUtf8(c,f) = if c<0wx80 then writeByte(f,Char2Byte c) else if c<0wx800 then let val f1 = writeByte(f,0wxC0 || Char2Byte(c >> 0w6)) val f2 = writeByte(f1,0wx80 || Char2Byte(c && 0wx3F)) in f2 end else if c<0wx10000 then let val f1 = writeByte(f, 0wxE0 || Char2Byte(c >> 0w12)) val f2 = writeByte(f1,0wx80 || Char2Byte((c >> 0w6) && 0wx3F)) val f3 = writeByte(f2,0wx80 || Char2Byte(c && 0wx3F)) in f3 end else if c<0wx200000 then let val f1 = writeByte(f, 0wxF0 || Char2Byte(c >> 0w18)) val f2 = writeByte(f1,0wx80 || Char2Byte((c >> 0w12) && 0wx3F)) val f3 = writeByte(f2,0wx80 || Char2Byte((c >> 0w6) && 0wx3F)) val f4 = writeByte(f3,0wx80 || Char2Byte(c && 0wx3F)) in f4 end else if c<0wx4000000 then let val f1 = writeByte(f, 0wxF8 || Char2Byte(c >> 0w24)) val f2 = writeByte(f1,0wx80 || Char2Byte((c >> 0w18) && 0wx3F)) val f3 = writeByte(f2,0wx80 || Char2Byte((c >> 0w12) && 0wx3F)) val f4 = writeByte(f3,0wx80 || Char2Byte((c >> 0w6) && 0wx3F)) val f5 = writeByte(f4,0wx80 || Char2Byte(c && 0wx3F)) in f5 end else let val f1 = writeByte(f, 0wxFC || Char2Byte(c >> 0w30)) val f2 = writeByte(f1,0wx80 || Char2Byte((c >> 0w24) && 0wx3F)) val f3 = writeByte(f2,0wx80 || Char2Byte((c >> 0w18) && 0wx3F)) val f4 = writeByte(f3,0wx80 || Char2Byte((c >> 0w12) && 0wx3F)) val f5 = writeByte(f4,0wx80 || Char2Byte((c >> 0w6) && 0wx3F)) val f6 = writeByte(f5,0wx80 || Char2Byte(c && 0wx3F)) in f6 end (*---------------------------------------------------------------------*) (* UTF-16 *) (*---------------------------------------------------------------------*) fun oneUtf16 isL (c,f) = let val (b1,b2) = (Char2Byte(c >> 0w8),Char2Byte c) in if isL then writeByte(writeByte(f,b2),b1) else writeByte(writeByte(f,b1),b2) end fun writeCharUtf16 isL = fn (c,f) => if c<0wx10000 then oneUtf16 isL (c,f) else let val (hi,lo) = splitSurrogates c val f1 = oneUtf16 isL (hi,f) val f2 = oneUtf16 isL (lo,f1) in f2 end val writeCharUtf16B = writeCharUtf16 false val writeCharUtf16L = writeCharUtf16 true (*---------------------------------------------------------------------*) (* UCS-2 *) (*---------------------------------------------------------------------*) fun writeCharUcs2 isL = fn (c,f) => if c<0wx10000 then let val (b1,b2) = (Char2Byte(c >> 0w8),Char2Byte c) in if isL then writeByte(writeByte(f,b2),b1) else writeByte(writeByte(f,b1),b2) end else raise EncodeError(f,ERR_ILLEGAL_CHAR(c,"UCS-2")) val writeCharUcs2B = writeCharUcs2 false val writeCharUcs2L = writeCharUcs2 true end (* stop of ../../Unicode/Encode/encodeMisc.sml *) (* start of ../../Unicode/Encode/encode.sml *) signature Encode = sig include EncodeError type File type EncFile val encNoFile : EncFile val encStdOut : EncFile val encOpenFile : string * Encoding.Encoding * string -> EncFile val encCloseFile : EncFile -> unit val encAdapt : EncFile * File -> EncFile val encPutChar : EncFile * UniChar.Char -> EncFile val encValidChar : EncFile * UniChar.Char -> bool end structure Encode : Encode = struct open Encoding UtilError EncodeBasic EncodeError EncodeMisc type EncFile = Encoding * File val encNoFile = (NOENC,stdOutFile) val encStdOut = (LATIN1,stdOutFile) fun encAdapt((enc,_),f) = (enc,f) fun encValidChar((enc,_),c) = case enc of ASCII => validCharAscii c | EBCDIC => validCharEbcdic c | LATIN1 => validCharLatin1 c | _ => true fun encPutChar((enc,f),c) = let val f1 = case enc of NOENC => f | ASCII => (writeCharAscii(c,f)) | EBCDIC => (writeCharEbcdic(c,f)) | LATIN1 => (writeCharLatin1(c,f)) | UCS2B => (writeCharUcs2B(c,f)) | UCS2L => (writeCharUcs2L(c,f)) | UCS4B => (writeCharUcs4B(c,f)) | UCS4L => (writeCharUcs4L(c,f)) | UCS4SB => (writeCharUcs4SB(c,f)) | UCS4SL => (writeCharUcs4SL(c,f)) | UTF8 => (writeCharUtf8(c,f)) | UTF16B => (writeCharUtf16B(c,f)) | UTF16L => (writeCharUtf16L(c,f)) in (enc,f1) end fun encCloseFile(_,f) = closeFile f fun encOpenFile (fname,enc,name) = let val outEnc = case enc of NOENC => (case isEncoding name of NOENC => raise NoSuchFile(fname,"Unsupported encoding \""^name^"\"") | enc => enc) | enc => enc val f = openFile fname val f1 = case outEnc of UTF16B => writeByte(writeByte(f,0wxFE),0wxFF) | UTF16L => writeByte(writeByte(f,0wxFF),0wxFE) | _ => f in (outEnc,f1) end end (* stop of ../../Unicode/Encode/encode.sml *) (* start of nullHard.sml *) (* structure NullHard = struct fun parseNull uri = NullParse.parseDocument uri NONE NullHooks.nullStart open NullCatOptions NullOptions Options NullParserOptions Uri val usage = List.concat [parserUsage,[("","")],catalogUsage,[("","")],nullUsage] exception Exit of OS.Process.status fun null(prog,args) = let val prog = "fxp" val hadError = ref false fun optError msg = let val _ = TextIO.output(TextIO.stdErr,msg^".\n") in hadError := true end fun exitError msg = let val _ = TextIO.output(TextIO.stdErr,msg^".\n") in raise Exit OS.Process.failure end fun exitHelp prog = let val _ = printUsage TextIO.stdOut prog usage in raise Exit OS.Process.success end fun exitVersion prog = let val _ = app print [prog," version ",Version.FXP_VERSION,"\n"] in raise Exit OS.Process.success end fun summOpt prog = "For a summary of options type "^prog^" --help" fun noFile(f,cause) = "can't open file '"^f^"': "^exnMessage cause val opts = parseOptions args val _ = setParserDefaults() val opts1 = setParserOptions (opts,optError) val _ = setCatalogDefaults() val opts2 = setCatalogOptions (opts1,optError) val _ = setNullDefaults() val (vers,help,err,file) = setNullOptions (opts2,optError) val _ = if !hadError then exitError (summOpt prog) else () val _ = if vers then exitVersion prog else () val _ = if help then exitHelp prog else () val _ = case err of SOME "-" => O_ERROR_DEVICE := TextIO.stdErr | SOME f => (O_ERROR_DEVICE := TextIO.openOut f handle IO.Io {cause,...} => exitError(noFile(f,cause))) | NONE => () val f = valOf file handle Option => "-" val uri = if f="-" then NONE else SOME(String2Uri f) val status = parseNull uri val _ = if isSome err then TextIO.closeOut (!O_ERROR_DEVICE) else () in status end handle Exit status => status | exn => let val _ = TextIO.output (TextIO.stdErr,prog^": Unexpected exception: "^exnMessage exn^".\n") in OS.Process.failure end end *) structure NullHard = struct end (* stop of nullHard.sml *) (* start of ../../Util/options.sml *) signature Options= sig datatype Option = OPT_LONG of string * string option | OPT_SHORT of char list | OPT_NEG of char list | OPT_NOOPT | OPT_STRING of string val parseOptions : string list -> Option list datatype UsageItem = U_SEP | U_TITLE of string | U_ITEM of string list * string type Usage = UsageItem list val printUsage : TextIO.outstream -> string -> Usage -> unit end structure Options : Options = struct exception BadOption of string datatype Option = OPT_LONG of string * string option | OPT_SHORT of char list | OPT_NEG of char list | OPT_NOOPT | OPT_STRING of string datatype UsageItem = U_SEP | U_TITLE of string | U_ITEM of string list * string type Usage = UsageItem list fun parseOptions ss = let fun doOne opt = if String.isPrefix "--" opt then let val opt1 = Substring.extract(opt,2,NONE) val (key0,opt2) = Substring.splitl (fn c => #"="<>c) opt1 val key = if Substring.isEmpty key0 then raise BadOption opt else Substring.string key0 val valOpt = if Substring.isPrefix "=" opt2 then let val val0 = Substring.triml 1 opt2 in if Substring.isEmpty val0 then raise BadOption opt else SOME(Substring.string val0) end else NONE in OPT_LONG(key,valOpt) end handle BadOption s => if opt="--" then OPT_NOOPT else OPT_STRING opt else if String.isPrefix "-" opt then let val chars = tl(String.explode opt) (* val _ = app (fn c => if Char.isAlphaNum c then () else raise BadOption opt) chars *) in case chars of nil => OPT_STRING opt | #"n"::(cs as _::_) => OPT_NEG cs | _ => OPT_SHORT chars end handle BadOption s => OPT_STRING opt else OPT_STRING opt fun doAll nil = nil | doAll (s::ss) = let val opt = doOne s in case opt of OPT_NOOPT => opt::map OPT_STRING ss | _ => opt::doAll ss end in doAll ss end fun printUsage stream prog usage = let val KEY_WIDTH = 30 val LINE_WIDTH = 80 val EMPTY_KEY = UtilString.nBlanks KEY_WIDTH fun appendKeys col nil = if col>KEY_WIDTH then "\n"^EMPTY_KEY else UtilString.nBlanks (KEY_WIDTH-col) | appendKeys col [key] = key^" "^appendKeys (col+1+String.size key) nil | appendKeys col (key::keys) = let val col1 = col+2+String.size key in if col1>KEY_WIDTH then key^",\n"^appendKeys 0 keys else key^", "^appendKeys col1 keys end fun makeKey keylist = appendKeys 0 keylist val makeText = UtilString.breakLines(LINE_WIDTH-KEY_WIDTH) fun format (keylist,text) = let val key = makeKey keylist in case makeText text of nil => [key] | line::lines => key^line::map (fn line => EMPTY_KEY^line) lines end val _ = app (fn x => TextIO.output(stream,x)) ["Usage: ",prog," [option ...] file\n","where option is one of:\n\n"] val _ = app (fn item => app (fn x => TextIO.output(stream,x^"\n")) (case item of U_SEP => [""] | U_TITLE txt => ["",txt] | U_ITEM option => format option)) usage in () end end (* stop of ../../Util/options.sml *) (* start of ../../config.sml *) structure Config = struct (*---------------------------------------------------------------------*) (* The OS command for retrieving a URI from the internet and storing *) (* it in a local file, where *) (* %1 is replaced by the URI. *) (* %2 is replaced by the local filename. *) (* It is recommended that the command exits with failure in case the *) (* URI cannot be retrieved. If the command generates a HTML error *) (* message instead (like, e.g., lynx), this HTML file is considered *) (* to be XML and will probably cause a mess of parsing errors. If you *) (* don't need URI retrieval, use "exit 1" which always fails. *) (* Sensible values are, e.g.: *) (* val retrieveCommand = "wget -qO %2 %1" *) (* val retrieveCommand = "got_it -o %2 %1" *) (* val retrieveCommand = "urlget -s -o %2 %1" *) (*---------------------------------------------------------------------*) val retrieveCommand = "wget -qO %2 %1" end (* stop of ../../config.sml *) (* start of ../../Unicode/Chars/charClasses.sml *) (*--------------------------------------------------------------------------*) (* Structure: CharClasses *) (* *) (* Notes: *) (* This implementation uses the UNSAFE array operations, and does NO *) (* range checks. This is for efficiency reasons. *) (* If class=makeCharClass(lo,hi) then a filed of size hi-lo+1 is allo- *) (* cated. In order to lookup a character, first make sure it in [lo..hi], *) (* then subtract lo before calling inCharClass! *) (* The same holds for addChar. *) (* *) (* Depends on: *) (* UniChar *) (* UtilInt *) (* *) (* Exceptions raised by functions in this structure: *) (* addChar : none *) (* addCharClass : none *) (* inCharClass : none *) (* makeCharClass : none *) (*--------------------------------------------------------------------------*) signature CharClasses = sig type CharClass type MutableClass type CharInterval = UniChar.Char * UniChar.Char type CharRange = CharInterval list val initialize : CharInterval -> MutableClass val finalize : MutableClass -> CharClass val addChar : MutableClass * UniChar.Char * UniChar.Char * UniChar.Char -> unit val addCharRange : MutableClass * UniChar.Char * UniChar.Char * CharRange -> CharRange val inCharClass : UniChar.Char * CharClass -> bool end structure CharClasses : CharClasses = struct open UniChar type CharInterval = Char * Char type CharRange = CharInterval list val Char2Word = Word.fromLargeWord o Chars.toLargeWord (*--------------------------------------------------------------------*) (* helpers *) (*--------------------------------------------------------------------*) infix 5 >> >>> <<< infix 6 || ||| infix 6 -- infix 7 & && &&& val op >> = Chars.>> val op -- = Chars.- val op || = Chars.orb val op && = Chars.andb val op >>> = Word32.>> val op <<< = Word32.<< val op &&& = Word32.andb val op ||| = Word32.orb val op & = Word.andb val max32 = Word32.notb 0wx0 (*--------------------------------------------------------------------*) (* a char class is an array of words, interpreted as bitvectors. *) (*--------------------------------------------------------------------*) type MutableClass = Word32.word array type CharClass = Word32.word vector (*--------------------------------------------------------------------*) (* each word in a char class holds 32 entries. Thus the for a char c *) (* is c div 32 == c >> 5. The bitmask is a word of zeros, only the *) (* significant bit for c, i.e. the (c && 31==0x1F)th bit set to one. *) (*--------------------------------------------------------------------*) fun indexMask c = let val idx = Chars.toInt(c>>0w5) val mask = 0wx1 <<< Char2Word c & 0w31 in (idx,mask) end (*--------------------------------------------------------------------*) (* generate index and mask, then lookup. *) (*--------------------------------------------------------------------*) fun inCharClass(c,vec) = let val (idx,mask) = indexMask c in mask &&& Vector.sub(vec,idx) <> 0wx0 end (*--------------------------------------------------------------------*) (* generate a CharClass large enough to hold (max-min+1) characters. *) (*--------------------------------------------------------------------*) fun initialize(min,max) = Array.array((Chars.toInt max-Chars.toInt min+1) div 32+1,0wx0):MutableClass fun finalize arr = Array.extract(arr,0,NONE) (*--------------------------------------------------------------------*) (* add a single character to a CharClass. *) (*--------------------------------------------------------------------*) fun addChar(cls,min,max,c) = let val (idx,new) = indexMask c val old = Array.sub(cls,idx) in Array.update(cls,idx,old|||new) end (*--------------------------------------------------------------------*) (* add a full range of characters to a CharClass. *) (* this is the only function that computes the offset before access *) (* to the array. *) (*--------------------------------------------------------------------*) fun addCharRange(cls,min,max,range) = let fun doOne (lo,hi) = let val (l,h) = (lo-min,hi-min) val (idxL,idxH) = ((Chars.toInt l) div 32,(Chars.toInt h) div 32) val (bitL,bitH) = (Char2Word l & 0w31,Char2Word h & 0w31) in if idxL=idxH then let val new = (max32>>>(0w31-bitH+bitL))<<>>(0w31-bitH) val oldL = Array.sub(cls,idxL) val oldH = Array.sub(cls,idxH) val _ = Array.update(cls,idxL,oldL|||newL) val _ = Array.update(cls,idxH,oldH|||newH) val _ = UtilInt.appInterval (fn i => Array.update(cls,i,max32)) (idxL+1,idxH-1) in () end else () end fun doAll nil = nil | doAll ((lh as (lo,hi))::lhs) = if himax then lh::doAll lhs else if lo=min andalso hi<=max then (doOne lh; doAll lhs) else if lo>=min andalso hi>max then (doOne(lo,max); (max+0w1,hi)::lhs) else (doOne(min,max); (max+0w1,hi)::lhs) val _ = doAll range in doAll range end end (* stop of ../../Unicode/Chars/charClasses.sml *) (* start of ../../Unicode/Chars/uniRanges.sml *) structure UniRanges = struct val digitRange = [(0wx0030,0wx0039), (0wx0660,0wx0669), (0wx06F0,0wx06F9), (0wx0966,0wx096F), (0wx09E6,0wx09EF), (0wx0A66,0wx0A6F), (0wx0AE6,0wx0AEF), (0wx0B66,0wx0B6F), (0wx0BE7,0wx0BEF), (0wx0C66,0wx0C6F), (0wx0CE6,0wx0CEF), (0wx0D66,0wx0D6F), (0wx0E50,0wx0E59), (0wx0ED0,0wx0ED9), (0wx0F20,0wx0F29) ] : CharClasses.CharRange val digitRange09 = [(0wx0030,0wx0039), (0wx0660,0wx0669), (0wx06F0,0wx06F9), (0wx0E50,0wx0E59), (0wx0ED0,0wx0ED9), (0wx0F20,0wx0F29) ] : CharClasses.CharRange val digitRange6F = [(0wx0966,0wx096F), (0wx09E6,0wx09EF), (0wx0A66,0wx0A6F), (0wx0AE6,0wx0AEF), (0wx0B66,0wx0B6F), (0wx0BE7,0wx0BEF), (0wx0C66,0wx0C6F), (0wx0CE6,0wx0CEF), (0wx0D66,0wx0D6F) ] : CharClasses.CharRange val baseRange = [(0wx0041,0wx005A), (0wx0061,0wx007A), (0wx00C0,0wx00D6), (0wx00D8,0wx00F6), (0wx00F8,0wx00FF), (0wx0100,0wx0131), (0wx0134,0wx013E), (0wx0141,0wx0148), (0wx014A,0wx017E), (0wx0180,0wx01C3), (0wx01CD,0wx01F0), (0wx01F4,0wx01F5), (0wx01FA,0wx0217), (0wx0250,0wx02A8), (0wx02BB,0wx02C1), (0wx0386,0wx0386), (0wx0388,0wx038A), (0wx038C,0wx038C), (0wx038E,0wx03A1), (0wx03A3,0wx03CE), (0wx03D0,0wx03D6), (0wx03DA,0wx03DA), (0wx03DC,0wx03DC), (0wx03DE,0wx03DE), (0wx03E0,0wx03E0), (0wx03E2,0wx03F3), (0wx0401,0wx040C), (0wx040E,0wx044F), (0wx0451,0wx045C), (0wx045E,0wx0481), (0wx0490,0wx04C4), (0wx04C7,0wx04C8), (0wx04CB,0wx04CC), (0wx04D0,0wx04EB), (0wx04EE,0wx04F5), (0wx04F8,0wx04F9), (0wx0531,0wx0556), (0wx0559,0wx0559), (0wx0561,0wx0586), (0wx05D0,0wx05EA), (0wx05F0,0wx05F2), (0wx0621,0wx063A), (0wx0641,0wx064A), (0wx0671,0wx06B7), (0wx06BA,0wx06BE), (0wx06C0,0wx06CE), (0wx06D0,0wx06D3), (0wx06D5,0wx06D5), (0wx06E5,0wx06E6), (0wx0905,0wx0939), (0wx093D,0wx093D), (0wx0958,0wx0961), (0wx0985,0wx098C), (0wx098F,0wx0990), (0wx0993,0wx09A8), (0wx09AA,0wx09B0), (0wx09B2,0wx09B2), (0wx09B6,0wx09B9), (0wx09DC,0wx09DD), (0wx09DF,0wx09E1), (0wx09F0,0wx09F1), (0wx0A05,0wx0A0A), (0wx0A0F,0wx0A10), (0wx0A13,0wx0A28), (0wx0A2A,0wx0A30), (0wx0A32,0wx0A33), (0wx0A35,0wx0A36), (0wx0A38,0wx0A39), (0wx0A59,0wx0A5C), (0wx0A5E,0wx0A5E), (0wx0A72,0wx0A74), (0wx0A85,0wx0A8B), (0wx0A8D,0wx0A8D), (0wx0A8F,0wx0A91), (0wx0A93,0wx0AA8), (0wx0AAA,0wx0AB0), (0wx0AB2,0wx0AB3), (0wx0AB5,0wx0AB9), (0wx0ABD,0wx0ABD), (0wx0AE0,0wx0AE0), (0wx0B05,0wx0B0C), (0wx0B0F,0wx0B10), (0wx0B13,0wx0B28), (0wx0B2A,0wx0B30), (0wx0B32,0wx0B33), (0wx0B36,0wx0B39), (0wx0B3D,0wx0B3D), (0wx0B5C,0wx0B5D), (0wx0B5F,0wx0B61), (0wx0B85,0wx0B8A), (0wx0B8E,0wx0B90), (0wx0B92,0wx0B95), (0wx0B99,0wx0B9A), (0wx0B9C,0wx0B9C), (0wx0B9E,0wx0B9F), (0wx0BA3,0wx0BA4), (0wx0BA8,0wx0BAA), (0wx0BAE,0wx0BB5), (0wx0BB7,0wx0BB9), (0wx0C05,0wx0C0C), (0wx0C0E,0wx0C10), (0wx0C12,0wx0C28), (0wx0C2A,0wx0C33), (0wx0C35,0wx0C39), (0wx0C60,0wx0C61), (0wx0C85,0wx0C8C), (0wx0C8E,0wx0C90), (0wx0C92,0wx0CA8), (0wx0CAA,0wx0CB3), (0wx0CB5,0wx0CB9), (0wx0CDE,0wx0CDE), (0wx0CE0,0wx0CE1), (0wx0D05,0wx0D0C), (0wx0D0E,0wx0D10), (0wx0D12,0wx0D28), (0wx0D2A,0wx0D39), (0wx0D60,0wx0D61), (0wx0E01,0wx0E2E), (0wx0E30,0wx0E30), (0wx0E32,0wx0E33), (0wx0E40,0wx0E45), (0wx0E81,0wx0E82), (0wx0E84,0wx0E84), (0wx0E87,0wx0E88), (0wx0E8A,0wx0E8A), (0wx0E8D,0wx0E8D), (0wx0E94,0wx0E97), (0wx0E99,0wx0E9F), (0wx0EA1,0wx0EA3), (0wx0EA5,0wx0EA5), (0wx0EA7,0wx0EA7), (0wx0EAA,0wx0EAB), (0wx0EAD,0wx0EAE), (0wx0EB0,0wx0EB0), (0wx0EB2,0wx0EB3), (0wx0EBD,0wx0EBD), (0wx0EC0,0wx0EC4), (0wx0F40,0wx0F47), (0wx0F49,0wx0F69), (0wx10A0,0wx10C5), (0wx10D0,0wx10F6), (0wx1100,0wx1100), (0wx1102,0wx1103), (0wx1105,0wx1107), (0wx1109,0wx1109), (0wx110B,0wx110C), (0wx110E,0wx1112), (0wx113C,0wx113C), (0wx113E,0wx113E), (0wx1140,0wx1140), (0wx114C,0wx114C), (0wx114E,0wx114E), (0wx1150,0wx1150), (0wx1154,0wx1155), (0wx1159,0wx1159), (0wx115F,0wx1161), (0wx1163,0wx1163), (0wx1165,0wx1165), (0wx1167,0wx1167), (0wx1169,0wx1169), (0wx116D,0wx116E), (0wx1172,0wx1173), (0wx1175,0wx1175), (0wx119E,0wx119E), (0wx11A8,0wx11A8), (0wx11AB,0wx11AB), (0wx11AE,0wx11AF), (0wx11B7,0wx11B8), (0wx11BA,0wx11BA), (0wx11BC,0wx11C2), (0wx11EB,0wx11EB), (0wx11F0,0wx11F0), (0wx11F9,0wx11F9), (0wx1E00,0wx1E9B), (0wx1EA0,0wx1EF9), (0wx1F00,0wx1F15), (0wx1F18,0wx1F1D), (0wx1F20,0wx1F45), (0wx1F48,0wx1F4D), (0wx1F50,0wx1F57), (0wx1F59,0wx1F59), (0wx1F5B,0wx1F5B), (0wx1F5D,0wx1F5D), (0wx1F5F,0wx1F7D), (0wx1F80,0wx1FB4), (0wx1FB6,0wx1FBC), (0wx1FBE,0wx1FBE), (0wx1FC2,0wx1FC4), (0wx1FC6,0wx1FCC), (0wx1FD0,0wx1FD3), (0wx1FD6,0wx1FDB), (0wx1FE0,0wx1FEC), (0wx1FF2,0wx1FF4), (0wx1FF6,0wx1FFC), (0wx2126,0wx2126), (0wx212A,0wx212B), (0wx212E,0wx212E), (0wx2180,0wx2182), (0wx3041,0wx3094), (0wx30A1,0wx30FA), (0wx3105,0wx312C), (0wxAC00,0wxD7A3) ] : CharClasses.CharRange val ideoRange = [(0wx3007,0wx3007), (0wx3021,0wx3029), (0wx4E00,0wx9FA5) ] : CharClasses.CharRange val combRange = [(0wx0300,0wx0345), (0wx0360,0wx0361), (0wx0483,0wx0486), (0wx0591,0wx05A1), (0wx05A3,0wx05B9), (0wx05BB,0wx05BD), (0wx05BF,0wx05BF), (0wx05C1,0wx05C2), (0wx05C4,0wx05C4), (0wx064B,0wx0652), (0wx0670,0wx0670), (0wx06D6,0wx06DC), (0wx06DD,0wx06DF), (0wx06E0,0wx06E4), (0wx06E7,0wx06E8), (0wx06EA,0wx06ED), (0wx0901,0wx0903), (0wx093C,0wx093C), (0wx093E,0wx094C), (0wx094D,0wx094D), (0wx0951,0wx0954), (0wx0962,0wx0963), (0wx0981,0wx0983), (0wx09BC,0wx09BC), (0wx09BE,0wx09BE), (0wx09BF,0wx09BF), (0wx09C0,0wx09C4), (0wx09C7,0wx09C8), (0wx09CB,0wx09CD), (0wx09D7,0wx09D7), (0wx09E2,0wx09E3), (0wx0A02,0wx0A02), (0wx0A3C,0wx0A3C), (0wx0A3E,0wx0A3E), (0wx0A3F,0wx0A3F), (0wx0A40,0wx0A42), (0wx0A47,0wx0A48), (0wx0A4B,0wx0A4D), (0wx0A70,0wx0A71), (0wx0A81,0wx0A83), (0wx0ABC,0wx0ABC), (0wx0ABE,0wx0AC5), (0wx0AC7,0wx0AC9), (0wx0ACB,0wx0ACD), (0wx0B01,0wx0B03), (0wx0B3C,0wx0B3C), (0wx0B3E,0wx0B43), (0wx0B47,0wx0B48), (0wx0B4B,0wx0B4D), (0wx0B56,0wx0B57), (0wx0B82,0wx0B83), (0wx0BBE,0wx0BC2), (0wx0BC6,0wx0BC8), (0wx0BCA,0wx0BCD), (0wx0BD7,0wx0BD7), (0wx0C01,0wx0C03), (0wx0C3E,0wx0C44), (0wx0C46,0wx0C48), (0wx0C4A,0wx0C4D), (0wx0C55,0wx0C56), (0wx0C82,0wx0C83), (0wx0CBE,0wx0CC4), (0wx0CC6,0wx0CC8), (0wx0CCA,0wx0CCD), (0wx0CD5,0wx0CD6), (0wx0D02,0wx0D03), (0wx0D3E,0wx0D43), (0wx0D46,0wx0D48), (0wx0D4A,0wx0D4D), (0wx0D57,0wx0D57), (0wx0E31,0wx0E31), (0wx0E34,0wx0E3A), (0wx0E47,0wx0E4E), (0wx0EB1,0wx0EB1), (0wx0EB4,0wx0EB9), (0wx0EBB,0wx0EBC), (0wx0EC8,0wx0ECD), (0wx0F18,0wx0F19), (0wx0F35,0wx0F35), (0wx0F37,0wx0F37), (0wx0F39,0wx0F39), (0wx0F3E,0wx0F3E), (0wx0F3F,0wx0F3F), (0wx0F71,0wx0F84), (0wx0F86,0wx0F8B), (0wx0F90,0wx0F95), (0wx0F97,0wx0F97), (0wx0F99,0wx0FAD), (0wx0FB1,0wx0FB7), (0wx0FB9,0wx0FB9), (0wx20D0,0wx20DC), (0wx20E1,0wx20E1), (0wx302A,0wx302F), (0wx3099,0wx3099), (0wx309A,0wx309A) ] : CharClasses.CharRange val extRange = [(0wx00B7,0wx00B7), (0wx02D0,0wx02D0), (0wx02D1,0wx02D1), (0wx0387,0wx0387), (0wx0640,0wx0640), (0wx0E46,0wx0E46), (0wx0EC6,0wx0EC6), (0wx3005,0wx3005), (0wx3031,0wx3035), (0wx309D,0wx309E), (0wx30FC,0wx30FE) ] : CharClasses.CharRange val nmsRange = List.concat [[(0wx3A,0wx3A),(0wx5F,0wx5F)](* :_ *), baseRange, ideoRange] val nameRange = List.concat [[(0wx2D,0wx2D),(0wx2E,0wx2E)](* -. *), digitRange, combRange, extRange, nmsRange] val pubidRange = List.concat [map (fn c => (c,c)) [0wx0A,0wx0D,0wx20], (* space,cr,lf *) map (fn c => (c,c)) (UniChar.String2Data "-'()+,./:=?;!*#@$_%"), [(0wx0030,0wx0039),(0wx0041,0wx005A),(0wx0061,0wx007A)] (* [0-9A-Za-z] *) ] : CharClasses.CharRange val encRange = [(0wx002D,0wx002E), (* -. *) (0wx0030,0wx0039), (* 0-9 *) (0wx0041,0wx005A), (* A-Z *) (0wx005F,0wx005F), (* _ *) (0wx0061,0wx007A) (* a-z *) ] : CharClasses.CharRange end (* stop of ../../Unicode/Chars/uniRanges.sml *) (* start of ../../Unicode/Chars/uniClasses.sml *) (*--------------------------------------------------------------------------*) (* Structure: UniClasses *) (* *) (* Notes: *) (* read CharClasses in order to understand how CharClasses are handled. *) (* *) (* Depends on: *) (* UniChar *) (* CharClasses *) (* *) (* Exceptions raised by functions in this structure: *) (* decValue : none *) (* hexValue : none *) (* isAsciiLetter : none *) (* isEnc : none *) (* isEncS : none *) (* isName : none *) (* isNms : none *) (* isPubid : none *) (* isS : none *) (* isXml : none *) (* isUnicode : none *) (* isVers : none *) (*--------------------------------------------------------------------------*) signature UniClasses = sig val isName : UniChar.Char -> bool val isNms : UniChar.Char -> bool val isPubid : UniChar.Char -> bool val isS : UniChar.Char -> bool val isEnc : UniChar.Char -> bool val isEncS : UniChar.Char -> bool val isVers : UniChar.Char -> bool val isDec : UniChar.Char -> bool val isHex : UniChar.Char -> bool val isXml : UniChar.Char -> bool val isUnicode : UniChar.Char -> bool val decValue : UniChar.Char -> UniChar.Char option val hexValue : UniChar.Char -> UniChar.Char option val isAsciiLetter : UniChar.Char -> bool end structure UniClasses : UniClasses = struct open UniChar CharClasses UniRanges (*--------------------------------------------------------------------*) (* initialize the character classes. *) (*--------------------------------------------------------------------*) local val nmsTemp = initialize(0wx0000,0wx3FFF) val restNms = addCharRange(nmsTemp,0wx0000,0wx3FFF,nmsRange) val _ = if restNms=[(0wxAC00,0wxD7A3),(0wx4E00,0wx9FA5)] then () else print ("Warning: extra characters after computing nms char class.\n") val nameTemp = initialize(0wx0000,0wxFFFF) val restName = addCharRange(nameTemp,0wx0000,0wx3FFF,nameRange) val _ = if restName=[(0wxAC00,0wxD7A3),(0wx4E00,0wx9FA5)] then () else print ("Warning: extra characters after computing name char class.\n") val pubTemp = initialize(0wx0000,0wx007F) val restPubid = addCharRange(pubTemp,0wx0000,0wx007F,pubidRange) val _ = if restPubid=nil then () else print ("Warning: extra characters after computing pubid char class.\n") val encTemp = initialize(0wx0000,0wx007F) val restEnc = addCharRange(encTemp,0wx0000,0wx007F,encRange) val _ = if restEnc=nil then () else print ("Warning: extra characters after computing enc char class.\n") in val nmsClass = finalize nmsTemp val nameClass = finalize nameTemp val pubClass = finalize pubTemp val encClass = finalize encTemp end (*--------------------------------------------------------------------*) (* is a character a name start char? *) (*--------------------------------------------------------------------*) fun isNms c = if c<0wx4000 then inCharClass(c,nmsClass) else c>=0wx4E00 andalso c<=0wx9FA5 orelse c>=0wxAC00 andalso c<=0wxD7A3 (*--------------------------------------------------------------------*) (* is a character a name char? *) (*--------------------------------------------------------------------*) fun isName c = if c<0wx4000 then inCharClass(c,nameClass) else c>=0wx4E00 andalso c<=0wx9FA5 orelse c>=0wxAC00 andalso c<=0wxD7A3 (*--------------------------------------------------------------------*) (* is a character a pubid char? *) (*--------------------------------------------------------------------*) fun isPubid c = c<0wx80 andalso inCharClass(c,pubClass) (*--------------------------------------------------------------------*) (* is a character valid in an encoding name, at its start, or in a *) (* version number? *) (*--------------------------------------------------------------------*) fun isEnc c = c<0wx80 andalso inCharClass(c,encClass) fun isEncS (c:UniChar.Char) = c>=0wx41 andalso c<=0wx5A orelse c>=0wx61 andalso c<=0wx7A fun isVers c = isEnc c orelse c=0wx3A (* #":" *) (*--------------------------------------------------------------------*) (* these are the valid Unicode characters (including surrogates). *) (*--------------------------------------------------------------------*) fun isUnicode (c:UniChar.Char) = c<=0wx10FFFF (*--------------------------------------------------------------------*) (* XML characters if not checked for Unicode char in advance. *) (*--------------------------------------------------------------------*) fun isXml (c:UniChar.Char) = c>=0wx0020 andalso c<=0wxD7FF orelse c>=0wxE000 andalso c<=0wxFFFD orelse c>=0wx10000 andalso c<=0wx10FFFF orelse c=0wx9 orelse c=0wxA orelse c=0wxD (*--------------------------------------------------------------------*) (* the frontend supresses 0wxD (carriage return), but its is still *) (* present when encoding is recognized. *) (*--------------------------------------------------------------------*) fun isS (c:UniChar.Char) = case c of 0wx09 => true | 0wx0A => true | 0wx0D => true | 0wx20 => true | _ => false (*--------------------------------------------------------------------*) (* is this character an ascii decimal/hexadecimal digit? *) (*--------------------------------------------------------------------*) fun isDec (c:UniChar.Char) = c>=0wx30 andalso c<=0wx39 fun isHex (c:UniChar.Char) = c>=0wx30 andalso c<=0wx39 orelse c>=0wx41 andalso c<=0wx46 orelse c>=0wx61 andalso c<=0wx66 (*--------------------------------------------------------------------*) (* calculate the decimal/hexadecimal value of an ascii (hex-)digit. *) (*--------------------------------------------------------------------*) fun decValue (c:UniChar.Char) = let val v = c-0wx30 in if v<=0wx9 then SOME v else NONE end fun hexValue (c:UniChar.Char) = let val v = c-0wx30 in if v<=0wx9 then SOME v else (if c>=0wx41 andalso c<=0wx46 then SOME(c-0wx37) else if c>=0wx61 andalso c<=0wx66 then SOME(c-0wx57) else NONE) end (*--------------------------------------------------------------------*) (* is c in [a-z]+[A-Z]? *) (*--------------------------------------------------------------------*) fun isAsciiLetter (c:UniChar.Char) = c>=0wx41 andalso c<=0wx5A orelse c>=0wx61 andalso c<=0wx7A end (* stop of ../../Unicode/Chars/uniClasses.sml *) (* start of ../../Unicode/Uri/uriDecode.sml *) signature UriDecode = sig val decodeUriLatin : string -> string val decodeUriUtf8 : string -> string end structure UriDecode : UriDecode = struct open UniChar UtilInt infix 8 << <<< infix 7 && infix 6 || ||| val op && = Word8.andb val op << = Word8.<< val op <<< = Chars.<< val op || = Word8.orb val op ||| = Chars.orb val Byte2Char = Chars.fromLargeWord o Word8.toLargeWord fun hexValue c = if #"0"<=c andalso #"9">=c then SOME (Byte.charToByte c-0wx30) else if #"A"<=c andalso #"F">=c then SOME (Byte.charToByte c-0wx37) else if #"a"<=c andalso #"f">=c then SOME (Byte.charToByte c-0wx57) else NONE exception Failed of char list fun getQuads cs = case cs of c1::c2::cs1 => (case (hexValue c1,hexValue c2) of (SOME b1,SOME b2) => ((b1 << 0w4 || b2),cs1) | _ => raise Failed cs1) | _ => raise Failed nil (*--------------------------------------------------------------------*) (* decode UTF-8 *) (*--------------------------------------------------------------------*) val byte1switch = Array.array(256,1) (* 1 byte *) val _ = appInterval (fn i => Array.update(byte1switch,i,0)) (0x80,0xBF) (* Error *) val _ = appInterval (fn i => Array.update(byte1switch,i,2)) (0xC0,0xDF) (* 2 bytes *) val _ = appInterval (fn i => Array.update(byte1switch,i,3)) (0xE0,0xEF) (* 3 bytes *) val _ = appInterval (fn i => Array.update(byte1switch,i,4)) (0xF0,0xF7) (* 4 bytes *) val _ = appInterval (fn i => Array.update(byte1switch,i,5)) (0xF8,0xFB) (* 5 bytes *) val _ = appInterval (fn i => Array.update(byte1switch,i,6)) (0xFC,0xFD) (* 6 bytes *) val diff2 = 0wx00003080 val diff3 = diff2 <<< 0wx6 ||| 0wx00020080 val diff4 = diff3 <<< 0wx6 ||| 0wx00400080 val diff5 = diff4 <<< 0wx6 ||| 0wx08000080 val diff6 = diff5 <<< 0wx6 ||| 0wx00000080 val diffsByLen = Vector.fromList [0w0,0w0,diff2,diff3,diff4,diff5,diff6] fun getByte cs = case cs of #"%"::cs1 => getQuads cs1 | c::cs1 => (Byte.charToByte c,cs1) | nil => raise Failed nil fun getBytes(b,cs,n) = let fun do_err (cs,m) = if n do_err(cs,m+1) val w1 = if b && 0wxC0 = 0wx80 then w <<< 0w6 + Byte2Char b else do_err(cs1,m+1) in doit (w1,cs1,m+1) end val (w,cs1) = doit (Byte2Char b,cs,2) val diff = Vector.sub(diffsByLen,n) val c = w-diff in if c<0wx100 then (Char2char c,cs1) else raise Failed cs1 end fun getCharUtf8 cs = let val (b,cs1) = getQuads cs in case Array.sub(byte1switch,Word8.toInt b) of 0 (* error *) => raise Failed cs1 | 1 (* 1 byte *) => (Byte.byteToChar b,cs1) | n (* n bytes *) => getBytes(b,cs1,n) end fun decodeUriUtf8 str = let val cs = String.explode str fun doit yet nil = yet | doit yet (c::cs) = if #"%"<>c then doit (c::yet) cs else let val (yet1,cs1) = let val (ch,cs1) = getCharUtf8 cs in (ch::yet,cs1) end handle Failed cs => (yet,cs) in doit yet1 cs1 end in String.implode(rev(doit nil cs)) end (*--------------------------------------------------------------------*) (* decode Latin *) (*--------------------------------------------------------------------*) fun getChar cs = case cs of #"%"::cs1 => let val (b,cs2) = getQuads cs1 in (Byte.byteToChar b,cs2) end | c::cs1 => (c,cs1) | nil => raise Failed nil fun decodeUriLatin str = let val cs = String.explode str fun doit yet nil = yet | doit yet (c::cs) = let val (yet1,cs1) = let val (ch,cs1) = getChar cs in (ch::yet,cs1) end handle Failed cs => (yet,cs) in doit yet1 cs1 end in String.implode(rev(doit nil cs)) end end (* stop of ../../Unicode/Uri/uriDecode.sml *) (* start of ../../Unicode/Uri/uriEncode.sml *) signature UriEncode = sig val Data2UriUtf8 : UniChar.Data -> string val Data2UriLatin : UniChar.Data -> string val Vector2UriUtf8 : UniChar.Vector -> string val Vector2UriLatin : UniChar.Vector -> string val String2UriUtf8 : string -> string val String2UriLatin : string -> string end structure UriEncode : UriEncode = struct open UniChar UniClasses infix 8 >> >>> infix 7 && &&& infix 6 || val op && = Word8.andb val op &&& = Chars.andb val op >> = Word8.>> val op >>> = Chars.>> val op || = Word8.orb val Char2Byte = Word8.fromLargeWord o Chars.toLargeWord fun encodeCharUtf8 c = if c<0wx80 then [Char2Byte c] else if c<0wx800 then [0wxC0 || Char2Byte(c >>> 0w6), 0wx80 || Char2Byte(c &&& 0wx3F)] else if c<0wx10000 then [0wxE0 || Char2Byte(c >>> 0w12), 0wx80 || Char2Byte((c >>> 0w6) &&& 0wx3F), 0wx80 || Char2Byte(c &&& 0wx3F)] else if c<0wx200000 then [0wxF0 || Char2Byte(c >>> 0w18), 0wx80 || Char2Byte((c >>> 0w12) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w6) &&& 0wx3F), 0wx80 || Char2Byte(c &&& 0wx3F)] else if c<0wx4000000 then [0wxF8 || Char2Byte(c >>> 0w24), 0wx80 || Char2Byte((c >>> 0w18) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w12) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w6) &&& 0wx3F), 0wx80 || Char2Byte(c &&& 0wx3F)] else [0wxFC || Char2Byte(c >>> 0w30), 0wx80 || Char2Byte((c >>> 0w24) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w18) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w12) &&& 0wx3F), 0wx80 || Char2Byte((c >>> 0w6) &&& 0wx3F), 0wx80 || Char2Byte(c &&& 0wx3F)] fun Byte2Cc b = let fun Quad2C b = if b<0wxA then Byte.byteToChar(b+0wx30) else Byte.byteToChar(b+0wx37) in (Quad2C(b >> 0w4),Quad2C(b && 0wx0F)) end fun precedesHex (i,cv) = if Vector.length cv <= i+2 then false else let val (c1,c2) = (Vector.sub(cv,i+1),Vector.sub(cv,i+2)) in isHex c1 andalso isHex c2 end fun Vector2UriUtf8 cv = let val revd = Vector.foldli (fn (i,c,s) => if c<0wx80 andalso (c<>0wx25 orelse precedesHex(i,cv)) then Char2char c::s else foldl (fn (b,s) => let val (c1,c2) = Byte2Cc b in c2::c1:: #"%"::s end) s (encodeCharUtf8 c)) nil (cv,0,NONE) in String.implode (rev revd) end fun Vector2UriLatin cv = let val revd = Vector.foldli (fn (i,c,s) => if c<0wx80 andalso (c<>0wx25 orelse precedesHex(i,cv)) then Char2char c::s else (if c>= 0w100 then s else let val (c1,c2) = Byte2Cc (Char2Byte c) in c2::c1:: #"%"::s end)) nil (cv,0,NONE) in String.implode (rev revd) end val Data2UriUtf8 = Vector2UriUtf8 o Data2Vector val Data2UriLatin = Vector2UriLatin o Data2Vector val String2UriUtf8 = Vector2UriUtf8 o String2Vector val String2UriLatin = Vector2UriLatin o String2Vector end (* stop of ../../Unicode/Uri/uriEncode.sml *) (* start of ../../Unicode/Uri/uri.sml *) (* require "basis.__array"; require "basis.__byte"; require "basis.__string"; require "basis.__vector"; require "basis.__word"; require "basis.__word8"; require "util.unsafe"; require "util.utilInt"; require "chars"; require "naming"; *) signature Uri = sig eqtype Uri val emptyUri : Uri val hashUri : Uri -> word val compareUri : Uri * Uri -> order val uriJoin : Uri * Uri -> Uri val uriSuffix : Uri -> string val Data2Uri : UniChar.Data -> Uri val Vector2Uri : UniChar.Vector -> Uri val String2Uri : string -> Uri val Uri2String : Uri -> string val retrieveUri : Uri -> string * string * bool end structure Uri :> Uri = struct open UniChar UniClasses UriDecode UriEncode UtilError UtilInt (*--------------------------------------------------------------------*) (* decoding *) (*--------------------------------------------------------------------*) type Uri = string val emptyUri = "" val Vector2Uri = Vector2UriUtf8 val Data2Uri = Data2UriUtf8 val String2Uri = String2UriUtf8 val Uri2String = decodeUriUtf8 val slash = "/" fun uriSuffix s = let fun search i = if i<0 then NONE else case String.sub(s,i) of #"." => SOME i | #"/" => NONE | _ => search (i-1) in case search (String.size s-1) of NONE => "" | SOME i => String.extract(s,i+1,NONE) end fun isScheme c = Char.isAlphaNum c orelse #"+"=c orelse #"-"=c orelse #"."=c fun uriAbsolute uri = let fun search i = if i>=String.size uri then false else let val c=String.sub(uri,i) in if #":"=c then true else if isScheme c then search (i+1) else false end in if uri="" then false else if Char.isAlpha (String.sub(uri,0)) then search 1 else false end fun uriRelative uri = not (uriAbsolute uri) fun uriLocal uri = if String.isPrefix "file:" uri then SOME(String.extract(uri,5,NONE)) else if uriRelative uri then SOME uri else NONE fun uriPath s = let fun search (i,hadSlash) = if i<0 then if hadSlash then SOME 0 else NONE else case String.sub(s,i) of #"/" => if hadSlash then NONE else search(i-1,true) | _ => if hadSlash then SOME(i+1) else search(i-1,false) val len = String.size s val posOpt = search(len-1,false) in case posOpt of NONE => emptyUri | SOME i => if i=0 then slash else String.extract(s,0,SOME(i+1)) end fun uriAuth uri = let fun searchScheme i = if i>=String.size uri then NONE else let val c=String.sub(uri,i) in if #":"=c then SOME i else if isScheme c then searchScheme (i+1) else NONE end fun searchSlash i = if i>=String.size uri then NONE else let val c=String.sub(uri,i) in if #"/"=c then SOME i else searchSlash (i+1) end in if uri="" then "" else if not (Char.isAlpha(String.sub(uri,0))) then "" else case searchScheme 1 of NONE => "" | SOME i => if String.size uri<=i+2 then String.extract(uri,0,SOME(i+1)) else if #"/"=String.sub(uri,i+1) andalso #"/"=String.sub(uri,i+2) then case searchSlash (i+3) of NONE => uri | SOME j => String.extract(uri,0,SOME j) else String.extract(uri,0,SOME(i+1)) end fun uriScheme uri = let fun searchScheme i = if i>=String.size uri then NONE else let val c=String.sub(uri,i) in if #":"=c then SOME i else if isScheme c then searchScheme (i+1) else NONE end in if uri="" then "" else if not (Char.isAlpha(String.sub(uri,0))) then "" else case searchScheme 1 of NONE => "" | SOME i => String.extract(uri,0,SOME(i+1)) end fun uriJoin(abs,rel) = if rel="" then uriPath abs else if abs="" then rel else if String.isPrefix "//" rel then uriScheme abs^rel else if #"/"=String.sub(rel,0) then uriAuth abs^rel else if uriAbsolute rel then rel else uriPath abs^rel val compareUri = String.compare val hashUri = UtilHash.hashString fun convertCommand str (src,dst) = let val s = Substring.all str fun doit ss s = if Substring.isEmpty s then ss else let val (sl,sr) = Substring.splitr (fn c => #"%"<>c) s in if Substring.isEmpty sl then sr::ss else let val sl' = Substring.trimr 1 sl in case Substring.first sr of SOME #"1" => let val sr' = Substring.triml 1 sr in doit (Substring.all src::sr'::ss) sl' end | SOME #"2" => let val sr' = Substring.triml 1 sr in doit (Substring.all dst::sr'::ss) sl' end | _ => doit (Substring.all "%"::sr::ss) sl' end end val ss = doit nil s val s = Substring.concat ss in s end fun retrieveRemote uri = let val tmp = OS.FileSys.tmpName() val cmd = convertCommand Config.retrieveCommand (uri,tmp) val status = OS.Process.system cmd val _ = if status = OS.Process.success then () else let val _ = (OS.FileSys.remove tmp handle OS.SysErr _ => ()) val cmd = convertCommand Config.retrieveCommand ("",tmp) in raise NoSuchFile (uri,"command '"^cmd^"' failed") end in (Uri2String uri,tmp,true) end fun retrieveUri uri = case uriLocal uri of SOME f => (Uri2String uri,Uri2String f,false) | NONE => retrieveRemote uri end (* stop of ../../Unicode/Uri/uri.sml *) (* start of ../../Parser/version.sml *) structure Version = struct val FXP_VERSION = "1.4.4" end (* stop of ../../Parser/version.sml *) (* start of ../../Util/utilList.sml *) (*--------------------------------------------------------------------------*) (* Structure: UtilList *) (* *) (* Depends on: *) (* *) (* Exceptions raised by functions in this structure: *) (* member : none *) (* findAndDelete : none *) (*--------------------------------------------------------------------------*) signature UtilList = sig val split : ('a -> bool) -> 'a list -> 'a list list val member : ''a -> ''a list -> bool val mapAllPairs : ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list val findAndMap : ('a -> 'b option) -> 'a list -> 'b option val findAndDelete : ('a -> bool) -> 'a list -> ('a option * 'a list) val sort : ('a * 'a -> order) -> 'a list -> 'a list val merge : ('a * 'a -> order) -> 'a list * 'a list -> 'a list val diff : ('a * 'a -> order) -> 'a list * 'a list -> 'a list val cap : ('a * 'a -> order) -> 'a list * 'a list -> 'a list val sub : ('a * 'a -> order) -> 'a list * 'a list -> bool val insert : ('a * 'a -> order) -> 'a * 'a list -> 'a list val delete : ('a * 'a -> order) -> 'a * 'a list -> 'a list val elem : ('a * 'a -> order) -> 'a * 'a list -> bool end structure UtilList : UtilList = struct (*--------------------------------------------------------------------*) (* split a list into a list of lists at each element fullfilling p. *) (*--------------------------------------------------------------------*) fun split p l = let val (one,ls) = foldr (fn (a,(curr,ls)) => if p a then (nil,curr::ls) else (a::curr,ls)) (nil,nil) l in one::ls end (*--------------------------------------------------------------------*) (* is x a member of l? *) (*--------------------------------------------------------------------*) fun member x l = List.exists (fn y => x=y) l (*--------------------------------------------------------------------*) (* for [a1,...,an] and [b1,...,bk], generate *) (* [f(a1,b1),f(a1,b2),...,f(an,bk-1),f(an,bk)]. *) (*--------------------------------------------------------------------*) fun mapAllPairs f (ass,bs) = foldr (fn (a,cs) => foldr (fn (b,cs) => f(a,b)::cs) cs bs) nil ass (*--------------------------------------------------------------------*) (* find the first element x of l such that f x = SOME y, and return *) (* f x. If there is no such x, return NONE. *) (*--------------------------------------------------------------------*) fun findAndMap _ nil = NONE | findAndMap f (x::xs) = case f x of NONE => findAndMap f xs | y => y (*--------------------------------------------------------------------*) (* find the first element x of l such that f x = true, delete it from *) (* l, and return SOME x with the modified list. If there is no such x *) (* return (NONE,l). *) (*--------------------------------------------------------------------*) fun findAndDelete _ nil = (NONE,nil) | findAndDelete f (x::xs) = if f x then (SOME x,xs) else let val (y,ys) = findAndDelete f xs in (y,x::ys) end (*--------------------------------------------------------------------*) (* given a function that compares elements, merge two sorted lists. *) (*--------------------------------------------------------------------*) fun merge comp (l1,l2) = let fun go (nil,l) = l | go (l,nil) = l | go (l1 as (x1::r1),l2 as (x2::r2)) = case comp(x1,x2) of LESS => x1::go(r1,l2) | EQUAL => go(l1,r2) | GREATER => x2::go(l1,r2) in go(l1,l2) end (*--------------------------------------------------------------------*) (* given a comparing function, compute the intersection of two *) (* ordered lists. *) (*--------------------------------------------------------------------*) fun cap comp (l1,l2) = let fun go (nil,l) = nil | go (l,nil) = nil | go (l1 as (x1::r1),l2 as (x2::r2)) = case comp(x1,x2) of LESS => go(r1,l2) | EQUAL => x1::go(r1,r2) | GREATER => go(l1,r2) in go(l1,l2) end (*--------------------------------------------------------------------*) (* given a comparing function, compute the difference of two *) (* ordered lists. *) (*--------------------------------------------------------------------*) fun diff comp (l1,l2) = let fun go (nil,l) = nil | go (l,nil) = l | go (l1 as (x1::r1),l2 as (x2::r2)) = case comp(x1,x2) of LESS => x1::go(r1,l2) | EQUAL => go(r1,r2) | GREATER => go(l1,r2) in go(l1,l2) end (*--------------------------------------------------------------------*) (* given a comparing function, find out whether an ordered list is *) (* contained in an other ordered list. *) (*--------------------------------------------------------------------*) fun sub comp (l1,l2) = let fun go (nil,l) = true | go (l,nil) = false | go (l1 as (x1::r1),l2 as (x2::r2)) = case comp(x1,x2) of LESS => false | EQUAL => go(r1,r2) | GREATER => go(l1,r2) in go(l1,l2) end (*--------------------------------------------------------------------*) (* given a function that compares elements, insert an element into an *) (* ordered list. *) (*--------------------------------------------------------------------*) fun insert comp (x,l) = let fun go nil = [x] | go (l as y::ys) = case comp(x,y) of LESS => x::l | EQUAL => l | GREATER => y::go ys in go l end (*--------------------------------------------------------------------*) (* given a function that compares elements, delete an element from *) (* an ordered list. *) (*--------------------------------------------------------------------*) fun delete comp (x,l) = let fun go nil = [x] | go (l as y::ys) = case comp(x,y) of LESS => l | EQUAL => ys | GREATER => y::go ys in go l end (*--------------------------------------------------------------------*) (* given a function that compares elements, insert an element into an *) (* ordered list. *) (*--------------------------------------------------------------------*) fun elem comp (x,l) = let fun go nil = false | go (l as y::ys) = case comp(x,y) of LESS => false | EQUAL => true | GREATER => go ys in go l end (*--------------------------------------------------------------------*) (* merge-sort a list of elements comparable with the function in the *) (* 1st argument. Preserve duplicate elements. *) (*--------------------------------------------------------------------*) fun sort _ nil = nil | sort comp l = let fun mergeOne (x::y::l) = merge comp (x,y)::mergeOne l | mergeOne l = l fun mergeAll [l] = l | mergeAll ls = mergeAll (mergeOne ls) val singles = map (fn x => [x]) l in mergeAll singles end end (* stop of ../../Util/utilList.sml *) (* start of ../../Parser/Dfa/dfaOptions.sml *) signature DfaOptions = sig val O_DFA_INITIAL_WIDTH : int ref val O_DFA_MAX_STATES : int ref val O_DFA_WARN_TOO_LARGE : bool ref val setDfaDefaults : unit -> unit val setDfaOptions : Options.Option list * (string -> unit) -> Options.Option list val dfaUsage : Options.Usage end functor DfaOptions () : DfaOptions = struct open Options UtilInt val O_DFA_INITIAL_WIDTH = ref 4 val O_DFA_MAX_STATES = ref 256 val O_DFA_WARN_TOO_LARGE = ref true fun setDfaDefaults() = let val _ = O_DFA_INITIAL_WIDTH := 4 val _ = O_DFA_MAX_STATES := 256 val _ = O_DFA_WARN_TOO_LARGE := true in () end val dfaUsage = [U_ITEM(["--dfa-initial-size=n"],"Initial size of DFA transition tables (16)"), U_ITEM(["--dfa-initial-width=n"],"Same as --dfa-initial-size=2^n (4)"), U_ITEM(["--dfa-max-size=n"],"Maximal size of DFAs for ambiguous content models (256)"), U_ITEM(["--dfa-warn-size[=(yes|no)]"],"Warn about too large DFAs (yes)") ] fun setDfaOptions(opts,doError) = let exception Failed of string option fun getNat str = if str="" then raise Failed NONE else let val cs = String.explode str in foldl (fn (c,n) => if #"0">c orelse #"9" raise Failed (SOME("number "^str^" is too large for this system")) end val yesNo = "'yes' or 'no'" fun tooLarge n = String.concat ["number ",n," is too large for this system"] fun mustHave key = String.concat ["option --",key," must have an argument"] fun mustBe key what = String.concat ["the argument to option --",key," must be ",what] fun do_yesno(key,valOpt,flag) = case valOpt of NONE => flag := true | SOME "yes" => flag := true | SOME "no" => flag := false | SOME s => doError (mustBe key yesNo) fun do_num(key,valOpt,flag) = case valOpt of NONE => doError (mustHave key) | SOME s => flag := getNat s handle Failed NONE => doError (mustBe key "a number") | Failed (SOME s) => doError s fun do_dfa_ts(key,valOpt,toWidth) = case valOpt of NONE => doError (mustHave key) | SOME s => O_DFA_INITIAL_WIDTH := toWidth (getNat s) handle Failed NONE => doError (mustBe key "a number") | Failed (SOME s) => doError s fun do_long(key,valOpt) = case key of "dfa-initial-size" => true before do_dfa_ts(key,valOpt,nextPowerTwo) | "dfa-initial-width" => true before do_dfa_ts(key,valOpt,fn i => i) | "dfa-max-size" => true before do_num(key,valOpt,O_DFA_MAX_STATES) | "dfa-warn-size" => true before do_yesno(key,valOpt,O_DFA_WARN_TOO_LARGE) | _ => false and doit nil = nil | doit (opt::opts) = case opt of OPT_NOOPT => opts | OPT_LONG(key,value) => if do_long(key,value) then doit opts else opt::doit opts | OPT_NEG _ => opt::doit opts | OPT_SHORT _ => opt::doit opts | OPT_STRING _ => opt::doit opts in doit opts end end (* stop of ../../Parser/Dfa/dfaOptions.sml *) (* start of ../../Parser/Params/parserOptions.sml *) (*--------------------------------------------------------------------------*) (* Structure: ParserOptions *) (* *) (* Depends on: none *) (*--------------------------------------------------------------------------*) signature ParserOptions = sig structure DfaOptions : DfaOptions val O_CHECK_ISO639 : bool ref val O_CHECK_LANGID : bool ref val O_CHECK_PREDEFINED : bool ref val O_CHECK_RESERVED : bool ref val O_CHECK_VERSION : bool ref val O_WARN_MULT_ENUM : bool ref val O_WARN_XML_DECL : bool ref val O_WARN_ATT_NO_ELEM : bool ref val O_WARN_MULT_ENT_DECL : bool ref val O_WARN_MULT_NOT_DECL : bool ref val O_WARN_MULT_ATT_DEF : bool ref val O_WARN_MULT_ATT_DECL : bool ref val O_WARN_SHOULD_DECLARE : bool ref val O_WARN_NON_ASCII_URI : bool ref val O_ERROR_MINIMIZE : bool ref val O_VALIDATE : bool ref val O_COMPATIBILITY : bool ref val O_INTEROPERABILITY : bool ref val O_INCLUDE_EXT_PARSED : bool ref val O_INCLUDE_PARAM_ENTS : bool ref val setParserDefaults : unit -> unit val setParserOptions : Options.Option list * (string -> unit) -> Options.Option list val parserUsage : Options.Usage end functor ParserOptions () : ParserOptions = struct structure DfaOptions = DfaOptions () open DfaOptions Options UtilInt UtilList val O_CHECK_VERSION = ref true (* check for conforming xml version? *) val O_CHECK_ISO639 = ref true (* check whether a two-letter LangCode *) (* is acording to ISO 639? *) val O_CHECK_LANGID = ref true (* check whether a LangCode fullfills *) (* IETF RFC 1766? *) val O_CHECK_RESERVED = ref false(* check for names starting with xml? *) val O_CHECK_PREDEFINED = ref true (* check declarations of predefined *) val O_WARN_MULT_ENUM = ref true (* check whether a token occurs *) (* twice in the enumerated attribute *) (* types of the same element *) val O_WARN_XML_DECL = ref false (* warn if the XML decl is missing? *) val O_WARN_ATT_NO_ELEM = ref true (* warn for undeclared elements *) (* in att def list declarations? *) val O_WARN_MULT_ENT_DECL = ref true (* warn about redefined entities *) val O_WARN_MULT_NOT_DECL = ref true (* warn about redefined notations*) val O_WARN_SHOULD_DECLARE = ref true (* warn if predefined entities *) (* are not declared in the dtd *) val O_WARN_MULT_ATT_DEF = ref true (* warn if an attributes is defd *) (* twice for the same element? *) val O_WARN_MULT_ATT_DECL = ref true (* warn if there are multiple att *) (* def lists for one element? *) val O_WARN_NON_ASCII_URI = ref true (* warn about non-ascii chars in *) (* system identifiers? *) val O_ERROR_MINIMIZE = ref true (* try to avoid repeating errors? *) val O_VALIDATE = ref true val O_COMPATIBILITY = ref true val O_INTEROPERABILITY = ref false val O_INCLUDE_EXT_PARSED = ref false val O_INCLUDE_PARAM_ENTS = ref false fun setParserDefaults() = let val _ = setDfaDefaults() val _ = O_CHECK_ISO639 := false val _ = O_CHECK_LANGID := false val _ = O_CHECK_PREDEFINED := true val _ = O_CHECK_RESERVED := false val _ = O_CHECK_VERSION := true val _ = O_WARN_MULT_ENUM := true val _ = O_WARN_XML_DECL := false val _ = O_WARN_ATT_NO_ELEM := false val _ = O_WARN_MULT_ENT_DECL := false val _ = O_WARN_MULT_NOT_DECL := false val _ = O_WARN_MULT_ATT_DEF := false val _ = O_WARN_MULT_ATT_DECL := false val _ = O_WARN_SHOULD_DECLARE := true val _ = O_WARN_NON_ASCII_URI := true val _ = O_VALIDATE := true val _ = O_COMPATIBILITY := true val _ = O_INTEROPERABILITY := false val _ = O_ERROR_MINIMIZE := true val _ = O_INCLUDE_EXT_PARSED := false val _ = O_INCLUDE_PARAM_ENTS := false in () end val parserUsage = [U_ITEM(["-[n]v","--validate[=(yes|no)]"],"Turn on or off validation (yes)"), U_ITEM(["-[n]c","--compat[=(yes|no)]","--compatibility[=(yes|no)]"], "Turn on or off compatibility checking (yes)"), U_ITEM(["-[n]i","--interop[=(yes|no)]","--interoperability[=(yes|no)]"], "Turn on or off interoperability checking (no)"), U_SEP, U_ITEM(["--few-errors[=(yes|no)]"],"Report fewer errors (no)"), U_ITEM(["--check-reserved[=(yes|no)]"], "Checking for reserved names (no)"), U_ITEM(["--check-predef[=(yes|no)]","--check-predefined[=(yes|no)]"], "Check declaration of predefined entities (yes)"), U_ITEM(["--check-lang-id[=(yes|no)]"],"Checking language identifiers (no)"), U_ITEM(["--check-iso639[=(yes|no)]"],"Check ISO 639 language codes (no)"), U_ITEM(["--check-xml-version[=(yes|no)]"], "Check XML version number (yes)"), U_SEP, U_ITEM(["--warn-xml-decl[=(yes|no)]"],"Warn if there is no XML declaration (no)"), U_ITEM(["--warn-att-elem[=(yes|no)]"], "Warn about attlist declarations for undeclared elements (no)"), U_ITEM(["--warn-predefined[=(yes|no)]"], "Warn if the predefined entities are not declared (no)"), U_ITEM(["--warn-mult-decl[=]"],"Warn about multiple declarations (none)"), U_ITEM(["--warn-uri[=(yes|no)]"],"Warn about non-ASCII characters in URIs (yes)"), U_ITEM(["--warn[=all]"],"Warn about nearly everything"), U_ITEM(["--warn=none"],"Do not print warnings"), U_SEP, U_ITEM(["--include-ext[=(yes|no)]","--include-external[=(yes|no)]"], "Include external entities in non-validating mode (no)"), U_ITEM(["--include-par[=(yes|no)]","--include-parameter[=(yes|no)]"], "Include parameter entities and external subset in "^ "non-validating mode (no)"), U_SEP] @dfaUsage fun setParserOptions(opts,doError) = let datatype What = ATT | ATTLIST | ENT | NOT exception Failed of string option fun getNat str = if str="" then raise Failed NONE else let val cs = String.explode str in foldl (fn (c,n) => if #"0">c orelse #"9" raise Failed (SOME("number "^str^" is too large for this system")) end val allNone = "'all' or 'none'" val yesNo = "'yes' or 'no'" val yesNoWhat = "'yes', 'no' or a list of 'att', 'attlist', 'ent' and 'not'" fun errorMustBe(key,what) = doError (String.concat ["the argument to option --",key," must be ",what]) fun errorNoArg key = doError (String.concat ["option --",key," has no argument"]) fun do_mult_decl(key,valOpt) = let val all = [ATT,ATTLIST,ENT,NOT] fun setFlags whats = app (fn (what,flag) => flag := member what whats) [(ATT,O_WARN_MULT_ATT_DEF),(ATTLIST,O_WARN_MULT_ATT_DECL), (ENT,O_WARN_MULT_ENT_DECL),(NOT,O_WARN_MULT_NOT_DECL)] in case valOpt of NONE => setFlags all | SOME "yes" => setFlags all | SOME "no" => setFlags nil | SOME s => let val fields = String.fields (fn c => #","=c) s val whats = map (fn s => case s of "att" => ATT | "attlist" => ATTLIST | "ent" => ENT | "not" => NOT | _ => raise Failed NONE) fields in setFlags whats end handle Failed _ => errorMustBe(key,yesNoWhat) end fun do_noarg(key,valOpt,flag) = case valOpt of NONE => flag := true | SOME _ => errorNoArg key fun do_yesno(key,valOpt,flag) = case valOpt of NONE => flag := true | SOME "yes" => flag := true | SOME "no" => flag := false | SOME s => errorMustBe(key,yesNo) fun do_num(key,valOpt,flag) = case valOpt of NONE => errorMustBe(key,"a number") | SOME s => flag := getNat s handle Failed NONE => errorMustBe(key,"a number") | Failed (SOME s) => doError s fun do_warn(key,valOpt) = let val all = [O_WARN_MULT_ENUM,O_WARN_ATT_NO_ELEM, O_WARN_MULT_ENT_DECL,O_WARN_MULT_NOT_DECL,O_WARN_MULT_ATT_DEF, O_WARN_MULT_ATT_DECL,O_WARN_SHOULD_DECLARE,O_WARN_XML_DECL] fun setFlags value = app (fn flag => flag := value) all in case valOpt of NONE => setFlags true | SOME "all" => setFlags true | SOME "none" => setFlags false | SOME _ => errorMustBe(key,allNone) end fun do_long(key,valOpt) = case key of "validate" => true before do_yesno(key,valOpt,O_VALIDATE) | "compat" => true before do_yesno(key,valOpt,O_COMPATIBILITY) | "compatibility" => true before do_yesno(key,valOpt,O_COMPATIBILITY) | "interop" => true before do_yesno(key,valOpt,O_INTEROPERABILITY) | "interoperability" => true before do_yesno(key,valOpt,O_INTEROPERABILITY) | "few-errors" => true before do_yesno(key,valOpt,O_ERROR_MINIMIZE) | "check-reserved" => true before do_yesno(key,valOpt,O_CHECK_RESERVED) | "check-predef" => true before do_yesno(key,valOpt,O_CHECK_PREDEFINED) | "check-predefined" => true before do_yesno(key,valOpt,O_CHECK_PREDEFINED) | "check-lang-id" => true before do_yesno(key,valOpt,O_CHECK_LANGID) | "check-iso639" => true before do_yesno(key,valOpt,O_CHECK_ISO639) | "check-xml-version" => true before do_yesno(key,valOpt,O_CHECK_VERSION) | "warn" => true before do_warn(key,valOpt) | "warn-xml-decl" => true before do_yesno(key,valOpt,O_WARN_XML_DECL) | "warn-att-elem" => true before do_yesno(key,valOpt,O_WARN_ATT_NO_ELEM) | "warn-predefined" => true before do_yesno(key,valOpt,O_WARN_SHOULD_DECLARE) | "warn-mult-decl" => true before do_mult_decl(key,valOpt) | "warn-uri" => true before do_yesno(key,valOpt,O_WARN_NON_ASCII_URI) | "include-ext" => true before do_yesno(key,valOpt,O_INCLUDE_EXT_PARSED) | "include-external" => true before do_yesno(key,valOpt,O_INCLUDE_EXT_PARSED) | "include-par" => true before do_yesno(key,valOpt,O_INCLUDE_PARAM_ENTS) | "include-parameter" => true before do_yesno(key,valOpt,O_INCLUDE_PARAM_ENTS) | _ => false fun do_short cs = let fun doOne c = case c of #"v" => false before O_VALIDATE := true | #"c" => false before O_COMPATIBILITY := true | #"i" => false before O_INTEROPERABILITY := true | _ => true in List.filter doOne cs end fun do_neg cs = let fun doOne c = case c of #"v" => false before O_VALIDATE := false | #"c" => false before O_COMPATIBILITY := false | #"i" => false before O_INTEROPERABILITY := false | _ => true in List.filter doOne cs end and doit nil = nil | doit (opt::opts) = case opt of OPT_NOOPT => opts | OPT_LONG(key,value) => if do_long(key,value) then doit opts else opt::doit opts | OPT_SHORT cs => (case do_short cs of nil => doit opts | rest => OPT_SHORT rest::doit opts) | OPT_NEG cs => (case do_neg cs of nil => doit opts | rest => OPT_NEG rest::doit opts) | OPT_STRING s => opt::doit opts val opts1 = setDfaOptions (opts,doError) in doit opts1 end end (* stop of ../../Parser/Params/parserOptions.sml *) (* start of ../../Util/intLists.sml *) signature IntLists = sig type IntList = int list val emptyIntList : IntList val singleIntList : int -> IntList val fullIntList : int -> IntList val isEmptyIntList : IntList -> bool val inIntList : int * IntList -> bool val subIntList : IntList * IntList -> bool val compareIntLists: IntList * IntList -> order val hashIntList : IntList -> word val addIntList : int * IntList -> IntList val delIntList : int * IntList -> IntList val cupIntLists : IntList * IntList -> IntList val capIntLists : IntList * IntList -> IntList val diffIntLists : IntList * IntList -> IntList val IntList2String : IntList -> string end structure IntLists : IntLists = struct open UtilCompare UtilHash UtilInt UtilList UtilString type IntList = int list val emptyIntList = nil : IntList fun fullIntList n = intervalList(0,n) fun singleIntList n = [n] val isEmptyIntList = null val inIntList = elem Int.compare val subIntList = sub Int.compare val addIntList = insert Int.compare val delIntList = delete Int.compare val capIntLists = cap Int.compare val cupIntLists = merge Int.compare val diffIntLists = diff Int.compare val compareIntLists = compareList Int.compare val hashIntList = hashList hashInt val IntList2String = List2String Int.toString end (* stop of ../../Util/intLists.sml *) (* start of ../../Unicode/Chars/dataDict.sml *) structure KeyData : Key = struct type Key = UniChar.Data val null = UniChar.nullData val hash = UniChar.hashData val compare = UniChar.compareData val toString = UniChar.Data2String end structure DataDict = Dict (structure Key = KeyData) structure DataSymTab = SymTable (structure Key = KeyData) (* stop of ../../Unicode/Chars/dataDict.sml *) (* start of ../../Parser/Dfa/dfaData.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaData *) (* *) (* Depends on: *) (* *) (* Exceptions raised by functions in this structure: *) (* boundsFollow : none *) (* mergeFirst : ConflictFirst *) (* mergeFollow : ConflictFollow *) (*--------------------------------------------------------------------------*) signature DfaData = sig type Dfa datatype ContentModel = CM_ELEM of int | CM_OPT of ContentModel | CM_REP of ContentModel | CM_PLUS of ContentModel | CM_ALT of ContentModel list | CM_SEQ of ContentModel list end structure DfaBase = struct (*--- visible to the parser ---*) datatype ContentModel = CM_ELEM of int | CM_OPT of ContentModel | CM_REP of ContentModel | CM_PLUS of ContentModel | CM_ALT of ContentModel list | CM_SEQ of ContentModel list type Sigma = int type State = int val dfaDontCare = ~2 val dfaError = ~1 val dfaInitial = 0 exception DfaTooLarge of int exception Ambiguous of Sigma * int * int exception ConflictFirst of Sigma * State * State exception ConflictFollow of Sigma * State * State type Empty = bool type First = (State * Sigma) list type Follow = First type Info = State * Empty * First datatype CM' = ELEM of Sigma | OPT of CM | REP of CM | PLUS of CM | ALT of CM list | SEQ of CM list withtype CM = CM' * Info type Row = Sigma * Sigma * State vector * bool val nullRow : Row = (1,0,Vector.fromList nil,false) type Dfa = Row vector val emptyDfa : Dfa = Vector.fromList [(1,0,Vector.fromList nil,true)] end structure DfaData = DfaBase : DfaData (* stop of ../../Parser/Dfa/dfaData.sml *) (* start of ../../Unicode/Decode/decodeFile.sml *) (*--------------------------------------------------------------------------*) (* Structure: DecodeBasic *) (* *) (* Exceptions raised by functions in this structure: *) (* closeFile : none *) (* filePos : none *) (* fileName : none *) (* nextByte : EndOfFile *) (* openFile : NoSuchFile *) (*--------------------------------------------------------------------------*) signature DecodeFile = sig structure Bytes : WORD type File type Byte = Bytes.word exception EndOfFile of File val Char2Byte : UniChar.Char -> Byte val Byte2Char : Byte -> UniChar.Char val Byte2Hex : Byte -> string val openFile : Uri.Uri option -> File val closeFile : File -> unit val getByte : File -> Byte * File val ungetBytes : File * Byte list -> File val fileUri : File -> Uri.Uri val fileName : File -> string end structure DecodeFile : DecodeFile = struct open UniChar Uri UtilError structure Bytes = Word8 type Byte = Bytes.word fun Byte2Char b = Chars.fromLargeWord(Bytes.toLargeWord b) fun Byte2Hex b = "0x"^UtilString.toUpperString(StringCvt.padLeft #"0" 2 (Bytes.toString b)) fun Char2Byte c = Bytes.fromLargeWord(Chars.toLargeWord c) type instream = TextIO.instream val closeIn = TextIO.closeIn val input = TextIO.input val input1 = TextIO.input1 val openIn = TextIO.openIn val stdIn = TextIO.stdIn (*--------------------------------------------------------------------*) (* a file type is stdin or a uri with its string representation and *) (* the file it is mapped to. *) (* a file position is a stream, an int position and a file type. *) (* a file is a file position, a buffer, its size and current index. *) (*--------------------------------------------------------------------*) datatype FileType = STD | FNAME of (Uri * string * string * bool) type FilePos = FileType * instream * int type File = FilePos * Word8Vector.vector * int * int exception EndOfFile of File val nullVec = Word8Vector.fromList nil (*--------------------------------------------------------------------*) (* return the uri of a file. *) (*--------------------------------------------------------------------*) fun fileUri ((typ,_,_),_,_,_) = case typ of STD => emptyUri | FNAME(uri,_,_,_) => uri (*--------------------------------------------------------------------*) (* return the uri string name of a file. *) (*--------------------------------------------------------------------*) fun fileName ((typ,_,_),_,_,_) = case typ of STD => "" | FNAME(_,str,_,_) => str (*--------------------------------------------------------------------*) (* return the uri string and the position in the the file. *) (*--------------------------------------------------------------------*) fun filePos ((typ,_,p),_,s,i) = case typ of STD => ("",p+i-s) | FNAME(_,str,_,_) => (str,p+i-s) (*--------------------------------------------------------------------*) (* open a file; report IO errors by raising NoSuchFile. *) (*--------------------------------------------------------------------*) fun openFile uriOpt = let val (typ,stream) = case uriOpt of NONE => (STD,stdIn) | SOME uri => let val (str,fname,tmp) = retrieveUri uri in (FNAME(uri,str,fname,tmp),openIn fname) end handle IO.Io {name,cause,...} => raise NoSuchFile(name,exnMessage cause) in ((typ,stream,0),nullVec,0,0) end (*--------------------------------------------------------------------*) (* close the file; ignore IO errors. *) (*--------------------------------------------------------------------*) fun closeStream (typ,stream,_) = case typ of STD => () | FNAME(_,uri,fname,tmp) => let val _ = closeIn stream handle IO.Io _ => () val _ = (if tmp andalso OS.FileSys.access(fname,nil) then OS.FileSys.remove fname else ()) handle exn as OS.SysErr _ => TextIO.output(TextIO.stdErr,String.concat ["Error removing temporary file ",fname,"for URI",uri, "(",exnMessage exn,")\n"]) in () end fun closeFile (tsp,_,_,_) = closeStream tsp (*--------------------------------------------------------------------*) (* read a byte from the file; if at the end of buffer, reload it. *) (* if a reload fails or returns an IO error, raise EndOfFile. --------*) (*--------------------------------------------------------------------*) fun getByte (tsp,vec,s,i) = if i nullVec val s = Word8Vector.length v in if s=0 then let val _ = closeStream tsp in raise EndOfFile(tsp,v,0,0) end else (Word8Vector.sub(v,0),((typ,stream,pos+s),v,s,1)) end (*--------------------------------------------------------------------*) (* un-get some bytes. this should only happen while checking for a *) (* byte-order mark or xml/text declaration. It should be efficient in *) (* that case, otherwise might be very space-consuming. *) (*--------------------------------------------------------------------*) fun ungetBytes ((tsp,vec,s,i),bs) = let val len = length bs in if len<=i then (tsp,vec,s,i-len) else let val diff = len-i val vec0 = Word8Vector.fromList(List.take(bs,diff)) in (tsp,Word8Vector.concat [vec0,vec],s+diff,0) end end end (* stop of ../../Unicode/Decode/decodeFile.sml *) (* start of ../../Unicode/Decode/decodeError.sml *) (*--------------------------------------------------------------------------*) (* Structure: DecodeError *) (* *) (* Exceptions raised by functions in this structure: *) (* decodeMessage : none *) (*--------------------------------------------------------------------------*) signature DecodeError = sig datatype DecodeError = ERR_ILLEGAL_CHAR of DecodeFile.Byte * string | ERR_NON_UNI_UCS4 of UniChar.Char | ERR_EOF_UCS4 of int * DecodeFile.Byte list | ERR_NON_DIRECT_UTF7 of DecodeFile.Byte | ERR_PADDING_UTF7 of UniChar.Char | ERR_ILLFORMED_UTF8 of DecodeFile.Byte * int * int | ERR_ILLEGAL_UTF8 of DecodeFile.Byte | ERR_INVALID_UTF8_SEQ of DecodeFile.Byte list | ERR_EOF_UTF8 of int * int | ERR_NON_UNI_UTF8 of UniChar.Char * int | ERR_EOF_UCS2 of DecodeFile.Byte | ERR_EOF_UTF16 of DecodeFile.Byte | ERR_LOW_SURROGATE of UniChar.Char | ERR_HIGH_SURROGATE of UniChar.Char * UniChar.Char | ERR_EOF_SURROGATE of UniChar.Char | ERR_NO_ENC_DECL of string | ERR_UNSUPPORTED_ENC of string | ERR_INCOMPATIBLE_ENC of string * string val decodeMessage : DecodeError -> string list exception DecodeError of DecodeFile.File * bool * DecodeError end structure DecodeError : DecodeError = struct open DecodeFile UtilString UniChar datatype DecodeError = ERR_ILLEGAL_CHAR of DecodeFile.Byte * string | ERR_NON_UNI_UCS4 of UniChar.Char | ERR_EOF_UCS4 of int * DecodeFile.Byte list | ERR_NON_DIRECT_UTF7 of DecodeFile.Byte | ERR_PADDING_UTF7 of UniChar.Char | ERR_ILLFORMED_UTF8 of DecodeFile.Byte * int * int | ERR_ILLEGAL_UTF8 of DecodeFile.Byte | ERR_INVALID_UTF8_SEQ of DecodeFile.Byte list | ERR_EOF_UTF8 of int * int | ERR_NON_UNI_UTF8 of UniChar.Char * int | ERR_EOF_UCS2 of DecodeFile.Byte | ERR_EOF_UTF16 of DecodeFile.Byte | ERR_LOW_SURROGATE of UniChar.Char | ERR_HIGH_SURROGATE of UniChar.Char * UniChar.Char | ERR_EOF_SURROGATE of UniChar.Char | ERR_NO_ENC_DECL of string | ERR_UNSUPPORTED_ENC of string | ERR_INCOMPATIBLE_ENC of string * string fun Char2Hex c = "0x"^UtilString.toUpperString(StringCvt.padLeft #"0" 4 (Chars.toString c)) fun decodeMessage err = case err of ERR_ILLEGAL_CHAR(b,what) => [Byte2Hex b,"is not",prependAnA what,"character"] | ERR_NON_UNI_UCS4 c => ["UCS-4 coded non-Unicode character",Char2Uni c] | ERR_EOF_UCS4(pos,bytes) => ["End of file after",Int2String pos,"bytes of UCS-4 character", "starting with ",List2String0 Byte2Hex bytes] | ERR_NON_DIRECT_UTF7 b => ["Indirect UTF-7 character ",Byte2Hex b,"in non-shifted mode"] | ERR_PADDING_UTF7 pad => ["Non-zero padding",Char2Hex pad,"at end of UTF-7 shifted sequence"] | ERR_ILLFORMED_UTF8 (b,len,pos) => [numberNth pos,"byte",Byte2Hex b,"of a",Int2String len^"-byte", "UTF-8 sequence does not start with bits 10"] | ERR_ILLEGAL_UTF8 b => ["Byte",Byte2Hex b,"is neither ASCII nor does it start", "a valid multi-byte UTF-8 sequence"] | ERR_EOF_UTF8 (len,pos) => ["End of file terminates a ",Int2String len^"-byte", "UTF-8 sequence before the ",numberNth pos,"byte"] | ERR_NON_UNI_UTF8 (c,len) => [Int2String len^"-byte UTF-8 sequence decodes to non-Unicode character",Char2Uni c] | ERR_INVALID_UTF8_SEQ bs => ["Invalid UTF-8 sequence",List2xString (""," ","") Byte2Hex bs] | ERR_EOF_UCS2 b => ["End of file before second byte of UCS-2 character starting with",Byte2Hex b] | ERR_EOF_UTF16 b => ["End of file before second byte of UTF-16 character starting with",Byte2Hex b] | ERR_LOW_SURROGATE c => ["Low surrogate",Char2Uni c,"without preceding high surrogate"] | ERR_HIGH_SURROGATE (c,c1) => ["High surrogate",Char2Uni c,"followed by",Char2Uni c1,"instead of low surrogate"] | ERR_EOF_SURROGATE c => ["High surrogate",Char2Uni c,"followed by the end of file"] | ERR_NO_ENC_DECL auto => ["Couldn't parse encoding declaration but auto-detected encoding",auto,"required so"] | ERR_UNSUPPORTED_ENC enc => ["Unsupported encoding",enc] | ERR_INCOMPATIBLE_ENC (enc,auto) => ["Encoding",enc,"is incompatible with auto-detected encoding",auto] exception DecodeError of File * bool * DecodeError end (* stop of ../../Unicode/Decode/decodeError.sml *) (* start of ../../Unicode/Decode/decodeUtil.sml *) (* require "basis.__word"; require "basis.__word8"; require "chars"; require "decodeBasic"; require "decodeError"; *) (*--------------------------------------------------------------------------*) (* Structure: DecodeUtil *) (* *) (* Exceptions raised by functions in this structure: *) (* combineSurrogates : none *) (* combineUcs4big : none *) (* combineUcs4little : none *) (* combineUcs4strangeBig : none *) (* combineUcs4strangeLittle : none *) (* combineUtf16big : none *) (* combineUtf16little : none *) (* isLowSurrogate : none *) (* isHighSurrogate : none *) (* isSurrogate : none *) (*--------------------------------------------------------------------------*) signature DecodeUtil = sig val isSurrogate : UniChar.Char -> bool val isLowSurrogate : UniChar.Char -> bool val isHighSurrogate : UniChar.Char -> bool val combineSurrogates : UniChar.Char * UniChar.Char -> UniChar.Char end structure DecodeUtil : DecodeUtil = struct open UniChar DecodeFile DecodeError fun isSurrogate c = Chars.orb(c,0wx7FF)=0wxDFFF fun isLowSurrogate c = Chars.orb(c,0wx3FF)=0wxDFFF fun isHighSurrogate c = Chars.orb(c,0wx3FF)=0wxDBFF fun combineSurrogates(hi,lo) = (hi-0wxD800)*0wx400+lo+0wx2400 : Char end (* stop of ../../Unicode/Decode/decodeUtil.sml *) (* start of ../../Unicode/Decode/decodeUcs2.sml *) signature DecodeUcs2 = sig val getCharUcs2b : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUcs2l : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeUcs2 : DecodeUcs2 = struct open UniChar Encoding DecodeFile DecodeError DecodeUtil fun getCharUcs2b f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS2 b1) val c = Chars.orb(Chars.<<(Byte2Char b1,0w8),Byte2Char b2) in (c,f2) end fun getCharUcs2l f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS2 b1) val c = Chars.orb(Chars.<<(Byte2Char b2,0w8),Byte2Char b1) in (c,f2) end end (* stop of ../../Unicode/Decode/decodeUcs2.sml *) (* start of ../../Unicode/Decode/decodeMisc.sml *) signature DecodeMisc = sig val getCharAscii : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharEbcdic : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharEof : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharLatin1 : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeMisc : DecodeMisc = struct open UniChar DecodeFile DecodeError fun getCharEof f = raise EndOfFile f (*--------------------------------------------------------------------*) (* ASCII characters must be lower than 0wx80 *) (*--------------------------------------------------------------------*) fun getCharAscii f = let val (b,f1) = getByte f in if b<0wx80 then (Byte2Char b,f1) else raise DecodeError(f1,false,ERR_ILLEGAL_CHAR(b,"ASCII")) end (*--------------------------------------------------------------------*) (* LATIN-1 is the first plane of Unicode. *) (*--------------------------------------------------------------------*) fun getCharLatin1 f = let val (b,f1) = getByte f in (Byte2Char b,f1) end (*--------------------------------------------------------------------*) (* EBCDIC is mapped to the first plane of Unicode. *) (*--------------------------------------------------------------------*) (* according to rfc-1345 (and gnu recode experiments) *) val ebcdic2latinTab = Vector.fromList [0wx00,0wx01,0wx02,0wx03,0wx9C,0wx09,0wx86,0wx7F, 0wx97,0wx8D,0wx8E,0wx0B,0wx0C,0wx0D,0wx0E,0wx0F, 0wx10,0wx11,0wx12,0wx13,0wx9D,0wx85,0wx08,0wx87, 0wx18,0wx19,0wx92,0wx8F,0wx1C,0wx1D,0wx1E,0wx1F, 0wx80,0wx81,0wx82,0wx83,0wx84,0wx0A,0wx17,0wx1B, 0wx88,0wx89,0wx8A,0wx8B,0wx8C,0wx05,0wx06,0wx07, 0wx90,0wx91,0wx16,0wx93,0wx94,0wx95,0wx96,0wx04, 0wx98,0wx99,0wx9A,0wx9B,0wx14,0wx15,0wx9E,0wx1A, 0wx20,0wxA0,0wxA1,0wxA2,0wxA3,0wxA4,0wxA5,0wxA6, 0wxA7,0wxA8,0wx5B,0wx2E,0wx3C,0wx28,0wx2B,0wx21, 0wx26,0wxA9,0wxAA,0wxAB,0wxAC,0wxAD,0wxAE,0wxAF, 0wxB0,0wxB1,0wx5D,0wx24,0wx2A,0wx29,0wx3B,0wx5E, 0wx2D,0wx2F,0wxB2,0wxB3,0wxB4,0wxB5,0wxB6,0wxB7, 0wxB8,0wxB9,0wx7C,0wx2C,0wx25,0wx5F,0wx3E,0wx3F, 0wxBA,0wxBB,0wxBC,0wxBD,0wxBE,0wxBF,0wxC0,0wxC1, 0wxC2,0wx60,0wx3A,0wx23,0wx40,0wx27,0wx3D,0wx22, 0wxC3,0wx61,0wx62,0wx63,0wx64,0wx65,0wx66,0wx67, 0wx68,0wx69,0wxC4,0wxC5,0wxC6,0wxC7,0wxC8,0wxC9, 0wxCA,0wx6A,0wx6B,0wx6C,0wx6D,0wx6E,0wx6F,0wx70, 0wx71,0wx72,0wxCB,0wxCC,0wxCD,0wxCE,0wxCF,0wxD0, 0wxD1,0wx7E,0wx73,0wx74,0wx75,0wx76,0wx77,0wx78, 0wx79,0wx7A,0wxD2,0wxD3,0wxD4,0wxD5,0wxD6,0wxD7, 0wxD8,0wxD9,0wxDA,0wxDB,0wxDC,0wxDD,0wxDE,0wxDF, 0wxE0,0wxE1,0wxE2,0wxE3,0wxE4,0wxE5,0wxE6,0wxE7, 0wx7B,0wx41,0wx42,0wx43,0wx44,0wx45,0wx46,0wx47, 0wx48,0wx49,0wxE8,0wxE9,0wxEA,0wxEB,0wxEC,0wxED, 0wx7D,0wx4A,0wx4B,0wx4C,0wx4D,0wx4E,0wx4F,0wx50, 0wx51,0wx52,0wxEE,0wxEF,0wxF0,0wxF1,0wxF2,0wxF3, 0wx5C,0wx9F,0wx53,0wx54,0wx55,0wx56,0wx57,0wx58, 0wx59,0wx5A,0wxF4,0wxF5,0wxF6,0wxF7,0wxF8,0wxF9, 0wx30,0wx31,0wx32,0wx33,0wx34,0wx35,0wx36,0wx37, 0wx38,0wx39,0wxFA,0wxFB,0wxFC,0wxFD,0wxFE,0wxFF ] fun ebcdic2latin b = Vector.sub(ebcdic2latinTab,Word8.toInt b) fun getCharEbcdic f = let val (b,f1) = getByte f in (ebcdic2latin b,f1) end end (* stop of ../../Unicode/Decode/decodeMisc.sml *) (* start of ../../Unicode/Decode/decodeUcs4.sml *) signature DecodeUcs4 = sig val getCharUcs4b : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUcs4l : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUcs4sb : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUcs4sl : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeUcs4 : DecodeUcs4 = struct open UniChar UniClasses DecodeFile DecodeError DecodeUtil fun getCharUcs4b f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1])) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2])) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2,b3])) val c = Chars.orb(Chars.orb(Chars.<<(Byte2Char b1,0w24), Chars.<<(Byte2Char b2,0w16)), Chars.orb(Chars.<<(Byte2Char b3,0w08), Byte2Char b4)) in if isUnicode c then (c,f4) else raise DecodeError(f4,false,ERR_NON_UNI_UCS4 c) end fun getCharUcs4l f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1])) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2])) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2,b3])) val c = Chars.orb(Chars.orb(Chars.<<(Byte2Char b4,0w24), Chars.<<(Byte2Char b3,0w16)), Chars.orb(Chars.<<(Byte2Char b2,0w08), Byte2Char b1)) in if isUnicode c then (c,f4) else raise DecodeError(f4,false,ERR_NON_UNI_UCS4 c) end fun getCharUcs4sb f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1])) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2])) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2,b3])) val c = Chars.orb(Chars.orb(Chars.<<(Byte2Char b2,0w24), Chars.<<(Byte2Char b1,0w16)), Chars.orb(Chars.<<(Byte2Char b4,0w08), Byte2Char b3)) in if isUnicode c then (c,f4) else raise DecodeError(f4,false,ERR_NON_UNI_UCS4 c) end fun getCharUcs4sl f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1])) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2])) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UCS4(1,[b1,b2,b3])) val c = Chars.orb(Chars.orb(Chars.<<(Byte2Char b3,0w24), Chars.<<(Byte2Char b4,0w16)), Chars.orb(Chars.<<(Byte2Char b1,0w08), Byte2Char b2)) in if isUnicode c then (c,f4) else raise DecodeError(f4,false,ERR_NON_UNI_UCS4 c) end end (* stop of ../../Unicode/Decode/decodeUcs4.sml *) (* start of ../../Unicode/Decode/decodeUtf16.sml *) signature DecodeUtf16 = sig val getCharUtf16b : DecodeFile.File -> UniChar.Char * DecodeFile.File val getCharUtf16l : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeUtf16 : DecodeUtf16 = struct open UniChar Encoding DecodeFile DecodeError DecodeUtil fun getCharUtf16b f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF16 b1) val c = Chars.orb(Chars.<<(Byte2Char b1,0w8),Byte2Char b2) in if isSurrogate c then (* Chars.orb(c,0wx7FF)=0wxDFFF *) if isLowSurrogate c then raise DecodeError(f2,false,ERR_LOW_SURROGATE c) else let val (b3,f3) = getByte f2 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_SURROGATE c) val (b4,f4) = getByte f3 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF16 b3) val c1 = Chars.orb(Chars.<<(Byte2Char b3,0w8),Byte2Char b4) in if isLowSurrogate c1 then (combineSurrogates(c,c1),f4) else raise DecodeError(f4,false,ERR_HIGH_SURROGATE(c,c1)) end else (c,f2) end fun getCharUtf16l f = let val (b1,f1) = getByte f val (b2,f2) = getByte f1 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF16 b1) val c = Chars.orb(Chars.<<(Byte2Char b2,0w8),Byte2Char b1) in if isSurrogate c then if isLowSurrogate c then raise DecodeError(f2,false,ERR_LOW_SURROGATE c) else let val (b3,f3) = getByte f2 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_SURROGATE c) val (b4,f4) = getByte f3 handle exn as EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF16 b3) val c1 = Chars.orb(Chars.<<(Byte2Char b4,0w8),Byte2Char b3) in if isLowSurrogate c1 then (combineSurrogates(c,c1),f4) else raise DecodeError(f4,false,ERR_HIGH_SURROGATE(c,c1)) end else (c,f2) end end (* stop of ../../Unicode/Decode/decodeUtf16.sml *) (* start of ../../Unicode/Decode/decodeUtf8.sml *) signature DecodeUtf8 = sig val getCharUtf8 : DecodeFile.File -> UniChar.Char * DecodeFile.File end structure DecodeUtf8 : DecodeUtf8 = struct open UniChar UniClasses UtilError UtilInt DecodeFile DecodeError DecodeUtil val THIS_MODULE = "DecodeUtf8" infix 8 <<< infix 7 && infix 6 ||| val op && = Bytes.andb val op <<< = Chars.<< val op ||| = Chars.orb val byte1switch = Vector.tabulate (256,fn i => if i<0x80 then 1 else if i<0xC0 then 0 else if i<0xE0 then 2 else if i<0xF0 then 3 else if i<0xF8 then 4 else if i<0xFC then 5 else if i<0xFE then 6 else 0) val diff2 : Char = 0wx00003080 val diff3 : Char = diff2 <<< 0wx6 ||| 0wx00020080 val diff4 : Char = diff3 <<< 0wx6 ||| 0wx00400080 val diff5 : Char = diff4 <<< 0wx6 ||| 0wx08000080 val diff6 : Char = diff5 <<< 0wx6 ||| 0wx00000080 fun getCharUtf8 f = let val (b1,f1) = getByte f in if b1<0wx80 then (Byte2Char b1,f1) else let val n = Vector.sub(byte1switch,Word8.toInt b1) in case n of 0 (* error *) => raise DecodeError(f1,false,ERR_ILLEGAL_UTF8 b1) | 1 => (Byte2Char b1,f1) | 2 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f2,false,ERR_ILLFORMED_UTF8(b2,n,2)) else let val c = Byte2Char b1 <<< 0w6 + Byte2Char b2 - diff2 in if c>=0wx80 then (c,f2) else raise DecodeError(f2,false,ERR_INVALID_UTF8_SEQ [b1,b2]) end end | 3 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,3)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f3,false,ERR_ILLFORMED_UTF8(b2,n,2)) else if b3 && 0wxC0 <> 0wx80 then raise DecodeError(f3,false,ERR_ILLFORMED_UTF8(b2,n,3)) else let val c = (Byte2Char b1 <<< 0w12 + Byte2Char b2 <<< 0w06 + Byte2Char b3 - diff3) in if c>=0wx800 then (c,f3) else raise DecodeError (f3,false,ERR_INVALID_UTF8_SEQ [b1,b2,b3]) end end | 4 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,3)) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,4)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f4,false,ERR_ILLFORMED_UTF8(b2,n,2)) else if b3 && 0wxC0 <> 0wx80 then raise DecodeError(f4,false,ERR_ILLFORMED_UTF8(b2,n,3)) else if b4 && 0wxC0 <> 0wx80 then raise DecodeError(f4,false,ERR_ILLFORMED_UTF8(b2,n,4)) else let val c = (Byte2Char b1 <<< 0w18 + Byte2Char b2 <<< 0w12 + Byte2Char b3 <<< 0w06 + Byte2Char b4 - diff4) in if c>=0wx100000 andalso c<=0wx10FFFF then (c,f4) else if c<0wx10000 then raise DecodeError (f4,false,ERR_INVALID_UTF8_SEQ [b1,b2,b3,b4]) else raise DecodeError (f4,false,ERR_NON_UNI_UTF8(c,n)) end end | 5 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,3)) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,4)) val (b5,f5) = getByte f4 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,5)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f5,false,ERR_ILLFORMED_UTF8(b2,n,2)) else if b3 && 0wxC0 <> 0wx80 then raise DecodeError(f5,false,ERR_ILLFORMED_UTF8(b2,n,3)) else if b4 && 0wxC0 <> 0wx80 then raise DecodeError(f5,false,ERR_ILLFORMED_UTF8(b2,n,4)) else if b5 && 0wxC0 <> 0wx80 then raise DecodeError(f5,false,ERR_ILLFORMED_UTF8(b2,n,5)) else let val c = (Byte2Char b1 <<< 0w24 + Byte2Char b2 <<< 0w18 + Byte2Char b3 <<< 0w12 + Byte2Char b4 <<< 0w06 + Byte2Char b5 - diff5) in if c<0wx200000 then raise DecodeError (f5,false,ERR_INVALID_UTF8_SEQ [b1,b2,b3,b4,b5]) else raise DecodeError (f5,false,ERR_NON_UNI_UTF8(c,n)) end end | 6 => let val (b2,f2) = getByte f1 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,2)) val (b3,f3) = getByte f2 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,3)) val (b4,f4) = getByte f3 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,4)) val (b5,f5) = getByte f4 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,5)) val (b6,f6) = getByte f5 handle EndOfFile f => raise DecodeError(f,true,ERR_EOF_UTF8(n,6)) in if b2 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,2)) else if b3 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,3)) else if b4 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,4)) else if b5 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,5)) else if b6 && 0wxC0 <> 0wx80 then raise DecodeError(f6,false,ERR_ILLFORMED_UTF8(b2,n,6)) else let val c = (Byte2Char b1 <<< 0w30 + Byte2Char b2 <<< 0w24 + Byte2Char b3 <<< 0w18 + Byte2Char b4 <<< 0w12 + Byte2Char b5 <<< 0w06 + Byte2Char b6 - diff6) in if c<0wx4000000 then raise DecodeError (f6,false,ERR_INVALID_UTF8_SEQ [b1,b2,b3,b4,b5,b6]) else raise DecodeError (f6,false,ERR_NON_UNI_UTF8(c,n)) end end | _ => raise InternalError(THIS_MODULE,"getCharUtf8", "byte1switch holds "^Int.toString n^ ">6 for byte "^Bytes.toString b1) end end end (* stop of ../../Unicode/Decode/decodeUtf8.sml *) (* start of ../../Unicode/Decode/decode.sml *) (*--------------------------------------------------------------------------*) (* Structure: Decode *) (* *) (* Exceptions raised by functions in this structure: *) (* checkEncoding : NoSuchFile *) (* encCloseFile : none *) (* encFileName : none *) (*--------------------------------------------------------------------------*) signature Decode = sig structure Error : DecodeError type DecFile exception DecEof of DecFile exception DecError of DecFile * bool * Error.DecodeError val decUri : DecFile -> Uri.Uri val decName : DecFile -> string val decEncoding : DecFile -> Encoding.Encoding val decOpenXml : Uri.Uri option -> DecFile val decOpenUni : Uri.Uri option * Encoding.Encoding -> DecFile val decClose : DecFile -> DecFile val decCommit : DecFile -> unit val decSwitch : DecFile * string -> DecFile val decGetChar : DecFile -> UniChar.Char * DecFile val decGetArray : DecFile -> UniChar.Char array -> int * DecFile * Error.DecodeError option end structure Decode : Decode = struct structure Error = DecodeError open UniChar Encoding Error DecodeFile DecodeMisc DecodeUcs2 DecodeUcs4 DecodeUtf16 DecodeUtf8 DecodeUtil type DecFile = Encoding * File exception DecEof of DecFile exception DecError of DecFile * bool * DecodeError (*--------------------------------------------------------------------*) (* close an encoded entity. *) (*--------------------------------------------------------------------*) fun decClose (_,f) = (NOENC,f) before closeFile f (*--------------------------------------------------------------------*) (* get the uri string of an encoded entity. *) (*--------------------------------------------------------------------*) fun decName (_,f) = fileName f (*--------------------------------------------------------------------*) (* get the uri of an encoded entity. *) (*--------------------------------------------------------------------*) fun decUri (_,f) = fileUri f (*--------------------------------------------------------------------*) (* get the encoding of an encoded entity. *) (*--------------------------------------------------------------------*) fun decEncoding (enc,_) = enc (*--------------------------------------------------------------------*) (* commit the auto-detected encoding. *) (*--------------------------------------------------------------------*) fun decCommit (enc,f) = case enc of UTF8 => () | UTF16B => () | UTF16L => () | _ => raise DecError((enc,f),false,ERR_NO_ENC_DECL(encodingName enc)) (*--------------------------------------------------------------------*) (* change to another - compatible - encoding. *) (*--------------------------------------------------------------------*) fun decSwitch ((enc,f),decl) = let val decEnc = isEncoding decl val _ = if decEnc<>NOENC then () else raise DecError((enc,f),false,ERR_UNSUPPORTED_ENC decl) val newEnc = switchEncoding(enc,decEnc) val _ = if decEnc<>NOENC orelse enc=NOENC then () else raise DecError((enc,f),false,ERR_INCOMPATIBLE_ENC(encodingName enc,decl)) in (newEnc,f) end (*--------------------------------------------------------------------*) (* get a character from an encoded entity. *) (*--------------------------------------------------------------------*) fun decGetChar (enc,f) = let val (c,f1) = case enc of NOENC => raise EndOfFile f | ASCII => getCharAscii f | EBCDIC => getCharEbcdic f | LATIN1 => getCharLatin1 f | UCS2B => getCharUcs2b f | UCS2L => getCharUcs2l f | UCS4B => getCharUcs4b f | UCS4L => getCharUcs4l f | UCS4SB => getCharUcs4sb f | UCS4SL => getCharUcs4sl f | UTF8 => getCharUtf8 f | UTF16B => getCharUtf16b f | UTF16L => getCharUtf16l f in (c,(enc,f1)) end handle EndOfFile f => raise DecEof(NOENC,f) | DecodeError(f,eof,err) => raise DecError((enc,f),eof,err) (*--------------------------------------------------------------------*) (* Load new characters, depending on the current entity's encoding. *) (*--------------------------------------------------------------------*) fun decGetArray (enc,f) arr = let (*--------------------------------------------------------------*) (* Load the buffer with len new characters, or until the entity *) (* end is reached. Close the current file in that case. *) (* Local exception Ended is needed in order to preserve tail *) (* recursion. *) (*--------------------------------------------------------------*) fun loadArray getChar = let val ende = Array.length arr exception Error of int * exn fun doit (idx,f) = if idx=ende then (ende,(enc,f),NONE) else let val (c,f1) = getChar f handle exn => raise Error (idx,exn) val _ = Array.update(arr,idx,c) in doit (idx+1,f1) end in doit (0,f) handle Error(idx,exn) => case exn of EndOfFile f => (idx,(NOENC,f),NONE) | DecodeError (f,_,err) => (idx,(enc,f),SOME err) | _ => raise exn end in case enc of NOENC => (0,(NOENC,f),NONE) | ASCII => loadArray getCharAscii | EBCDIC => loadArray getCharEbcdic | LATIN1 => loadArray getCharLatin1 | UCS2B => loadArray getCharUcs2b | UCS2L => loadArray getCharUcs2l | UCS4B => loadArray getCharUcs4b | UCS4L => loadArray getCharUcs4l | UCS4SB => loadArray getCharUcs4sb | UCS4SL => loadArray getCharUcs4sl | UTF8 => loadArray getCharUtf8 | UTF16B => loadArray getCharUtf16b | UTF16L => loadArray getCharUtf16l end (*--------------------------------------------------------------------*) (* open an XML file and try to auto-detect its encoding. *) (*--------------------------------------------------------------------*) (* Auto-detection of the encoding of XML entities according to App. F *) (* of the XML recommendation. *) (* *) (* The file is opened in basic mode and upto four bytes are read from *) (* it in order to detect the encoding: if they constitute a prefix of *) (* " (nil,f) fun detect bs = case bs of [0wx0,0wx0,0wxFE,0wxFF] => (UCS4B,nil) | [0wxFF,0wxFE,0wx0,0wx0] => (UCS4L,nil) | [0wxFE,0wxFF,0wx0,b4] => if b4 <> 0wx0 then (UTF16B,[0wx0,b4]) else (UTF8,bs) | [0wxFF,0wxFE,b3,0wx0] => if b3 <> 0wx0 then (UTF16L,[b3,0wx0]) else (UTF8,bs) | [0wxEF,0wxBB,0wxBF,b4] => (UTF8,[b4]) | [0wx0,0wx0,0wx0,0wx3C] => (UCS4B,bs) | [0wx3C,0wx0,0wx0,0wx0] => (UCS4L,bs) | [0wx0,0wx0,0wx3C,0wx0] => (UCS4SB,bs) | [0wx0,0wx3C,0wx0,0wx0] => (UCS4SL,bs) | [0wx0,b2,b3,b4] => if (b2=0wx3C orelse b2=0wx25 orelse b2=0wx20 orelse b2=0wx09 orelse b2=0wx0D orelse b2=0wx0A) andalso (b3<>0wx0 orelse b4<>0wx0) then (UTF16B,bs) else (UTF8,bs) | [b1,0wx0,b3,b4] => if (b1=0wx3C orelse b1=0wx25 orelse b1=0wx20 orelse b1=0wx09 orelse b1=0wx0D orelse b1=0wx0A) andalso (b3<>0wx0 orelse b4<>0wx0) then (UTF16L,bs) else (UTF8,bs) | [0wx4C,0wx6F,0wxA7,0wx94] => (EBCDIC,bs) | _ => (UTF8,bs) val f = openFile uri val (bs,f1) = get4Bytes(0,f) val (enc,unget) = detect bs in (enc,ungetBytes(f1,unget)) end (*--------------------------------------------------------------------*) (* open a Unicode file. Check whether it starts with a byte order *) (* mark. If yes, chose UTF16 encoding, otherwise use the default that *) (* is provided as second argument. *) (* *) (* return the encoded file, a list of bytes looked ahead and the *) (* encoding. *) (*--------------------------------------------------------------------*) fun decOpenUni (uri,default) = let fun def(f,bs) = (default,ungetBytes(f,bs)) fun detect f = let val (b1,f1) = getByte f in case b1 of 0wxFE => (let val (b2,f2) = getByte f1 in if b2 = 0wxFF then (UTF16B,f2) else def(f2,[b1,b2]) end handle EndOfFile f => def(f,[b1])) | 0wxFF => (let val (b2,f2) = getByte f1 in if b2 = 0wxFE then (UTF16L,f2) else def(f2,[b1,b2]) end handle EndOfFile f => def(f,[b1])) | _ => def(f1,[b1]) end handle EndOfFile f => def(f,nil) val f = openFile uri val (enc,f1) = detect f in (enc,f1) end end (* stop of ../../Unicode/Decode/decode.sml *) (* start of ../../Parser/Error/errorData.sml *) structure ErrorData = struct (*--------------------------------------------------------------------*) (* a position holds the filename, line and column number. *) (*--------------------------------------------------------------------*) type Position = string * int * int val nullPosition = ("",0,0) datatype ExpItem = EXP_CHAR of UniChar.Char | EXP_DATA of UniChar.Data | EXP_STRING of string type Expected = ExpItem list type Found = UniChar.Data datatype Location = LOC_NONE | LOC_AFTER_DTD | LOC_ATT_DECL | LOC_ATT_DEFAULT of Position | LOC_ATT_VALUE | LOC_CDATA | LOC_CHOICE | LOC_COMMENT | LOC_CONTENT | LOC_DECL | LOC_DOC_DECL | LOC_ELEM_DECL | LOC_ENCODING | LOC_ENT_DECL | LOC_ENT_VALUE | LOC_EPILOG | LOC_ETAG | LOC_IGNORED | LOC_INCLUDED | LOC_INT_DECL | LOC_INT_SUBSET | LOC_LITERAL | LOC_MIXED | LOC_NOT_DECL | LOC_OUT_COND | LOC_PROC | LOC_PROLOG | LOC_PUB_LIT | LOC_SEQ | LOC_STAG | LOC_SUBSET | LOC_SYS_LIT | LOC_TEXT_DECL | LOC_VERSION | LOC_XML_DECL datatype EntityClass = ENT_GENERAL | ENT_PARAMETER | ENT_EXTERNAL | ENT_UNPARSED datatype Item = IT_ATT_NAME | IT_CDATA | IT_CHAR of UniChar.Char | IT_CHAR_REF | IT_COND | IT_DATA of UniChar.Data | IT_DECL | IT_DTD | IT_ELEM | IT_ENT_NAME | IT_ETAG | IT_GEN_ENT | IT_ID_NAME | IT_LANG_ID | IT_NAME | IT_NMTOKEN | IT_NOT_NAME | IT_NOTATION | IT_PAR_ENT | IT_PAR_REF | IT_REF | IT_STAG | IT_TARGET datatype Error = (* syntax errors *) ERR_EMPTY of Location | ERR_ENDED_BY_EE of Location | ERR_EXPECTED of Expected * Found | ERR_NON_XML_CHAR of UniChar.Char | ERR_MISSING_WHITE | ERR_NON_XML_CHARREF of UniChar.Char (* other well-formedness errors *) | ERR_CANT_PARSE of Location | ERR_ELEM_ENT_NESTING of UniChar.Data | ERR_ELEM_TYPE_MATCH of UniChar.Data * UniChar.Data | ERR_OMITTED_END_TAG of UniChar.Data | ERR_IGNORED_END_TAG of UniChar.Data * UniChar.Data | ERR_ENDED_IN_PROLOG | ERR_FORBIDDEN_HERE of Item * Location | ERR_ILLEGAL_ENTITY of EntityClass * UniChar.Data * Location | ERR_MULTIPLE_DTD | ERR_MULT_ATT_SPEC of UniChar.Data | ERR_RECURSIVE_ENTITY of EntityClass * UniChar.Data | ERR_UNDEC_ENTITY of EntityClass * UniChar.Data (* validity errors concerning attributes *) | ERR_AT_LEAST_ONE of Item | ERR_AT_MOST_ONE of Item | ERR_ATT_IS_NOT of UniChar.Data * Item | ERR_EXACTLY_ONE of Item | ERR_FIXED_VALUE of UniChar.Data * UniChar.Vector * UniChar.Vector | ERR_ID_DEFAULT | ERR_MISSING_ATT of UniChar.Data | ERR_MULT_ID_ELEM of UniChar.Data | ERR_MUST_BE_AMONG of Item * UniChar.Data * UniChar.Data list | ERR_MUST_BE_UNPARSED of UniChar.Data * Location | ERR_REPEATED_ID of UniChar.Data | ERR_UNDECL_ATT of UniChar.Data * UniChar.Data | ERR_UNDECL_ID of UniChar.Data * Position list (* validity errors concerning elements *) | ERR_BAD_ELEM of UniChar.Data * UniChar.Data | ERR_ELEM_CONTENT of Item | ERR_EMPTY_TAG of UniChar.Data | ERR_ENDED_EARLY of UniChar.Data | ERR_MULT_MIXED of UniChar.Data | ERR_NONEMPTY of UniChar.Data | ERR_REDEC_ELEM of UniChar.Data | ERR_ROOT_ELEM of UniChar.Data * UniChar.Data (* other validity errors *) | ERR_DECL_ENT_NESTING of Location | ERR_EE_INT_SUBSET | ERR_GROUP_ENT_NESTING of Location | ERR_NO_DTD | ERR_STANDALONE_DEF of UniChar.Data | ERR_STANDALONE_ELEM of UniChar.Data | ERR_STANDALONE_ENT of EntityClass *UniChar.Data | ERR_STANDALONE_NORM of UniChar.Data | ERR_UNDECLARED of Item * UniChar.Data * Location (* miscellaneous errors *) | ERR_DECL_PREDEF of UniChar.Data * UniChar.Vector | ERR_NO_SUCH_FILE of string * string | ERR_RESERVED of UniChar.Data * Item | ERR_VERSION of string | ERR_XML_SPACE (* compatibility errors *) | ERR_AMBIGUOUS of UniChar.Data * int * int | ERR_MUST_ESCAPE of UniChar.Char (* interoperability errors *) | ERR_EMPTY_TAG_INTER of UniChar.Data | ERR_MUST_BE_EMPTY of UniChar.Data (* decoding errors *) | ERR_DECODE_ERROR of Decode.Error.DecodeError datatype Warning = WARN_NO_XML_DECL | WARN_MULT_DECL of Item * UniChar.Data | WARN_SHOULD_DECLARE of UniChar.Data list | WARN_ATT_UNDEC_ELEM of UniChar.Data | WARN_MULT_ATT_DECL of UniChar.Data | WARN_MULT_ATT_DEF of UniChar.Data * UniChar.Data | WARN_ENUM_ATTS of UniChar.Data * UniChar.Data list | WARN_DFA_TOO_LARGE of UniChar.Data * int | WARN_NON_ASCII_URI of UniChar.Char end (* stop of ../../Parser/Error/errorData.sml *) (* start of ../../Parser/Error/errorString.sml *) signature ErrorString = sig val errorChar2String : UniChar.Char -> string val errorData2String : UniChar.Data -> string val errorVector2String : UniChar.Vector -> string val quoteErrorChar0 : UniChar.Char -> string val quoteErrorChar : UniChar.Char -> string val quoteErrorData : UniChar.Data -> string val quoteErrorString : string -> string val quoteErrorVector : UniChar.Vector -> string val Position2String : ErrorData.Position -> string val Expected2String : ErrorData.Expected -> string val Found2String : ErrorData.Found -> string val Item2String : ErrorData.Item -> string val AnItem2String : ErrorData.Item -> string val Location2String : ErrorData.Location -> string val InLocation2String : ErrorData.Location -> string val EntityClass2String : ErrorData.EntityClass -> string end structure ErrorString : ErrorString = struct open ErrorData UniChar UtilString fun errorChar2String c = case c of 0wx9 => "\\t" | 0wxA => "\\n" | _ => if c>=0wx20 andalso c<0wx100 then String.implode [Char2char c] else "U+"^UtilString.toUpperString (StringCvt.padLeft #"0" 4 (Chars.toString c)) fun errorData2String cs = String.concat (map errorChar2String cs) fun errorVector2String vec = errorData2String (Vector.foldr (op ::) nil vec) val QUOTE = "'" fun quoteErrorChar0 c = QUOTE^errorChar2String c^QUOTE fun quoteErrorChar c = if c=0wx0 then "entity end" else QUOTE^errorChar2String c^QUOTE fun quoteErrorData cs = QUOTE^errorData2String cs^QUOTE fun quoteErrorString s = QUOTE^s^QUOTE fun quoteErrorVector v = QUOTE^errorVector2String v^QUOTE fun Position2String (fname,l,c) = if fname="" then "" else String.concat ["[",fname,":",Int2String l,".",Int2String c,"]"] fun ExpItem2String exp = case exp of EXP_CHAR c => quoteErrorChar c | EXP_DATA cs => quoteErrorData cs | EXP_STRING s => s fun Expected2String exp = case exp of nil => "nothing" | [one] => ExpItem2String one | _ => let val l=List.length exp in List2xString ("",", ","") ExpItem2String (List.take (exp,l-1)) ^" or "^ExpItem2String (List.last exp) end fun Found2String fnd = case fnd of [0wx0] => "entity end" | cs => quoteErrorData cs fun Location2String loc = case loc of LOC_NONE => "nothing" | LOC_AFTER_DTD => "document instance" | LOC_ATT_DECL => "attribute list declaration" | LOC_ATT_DEFAULT pos => "default value declared at "^Position2String pos | LOC_ATT_VALUE => "attribute value" | LOC_CDATA => "CDATA section" | LOC_CHOICE => "choice list" | LOC_COMMENT => "comment" | LOC_CONTENT => "content" | LOC_DECL => "declaration" | LOC_DOC_DECL => "document type declaration" | LOC_ELEM_DECL => "element type declaration" | LOC_ENCODING => "encoding name" | LOC_ENT_DECL => "entity declaration" | LOC_ENT_VALUE => "entity value" | LOC_EPILOG => "epilog" | LOC_ETAG => "end-tag" | LOC_IGNORED => "ignored section" | LOC_INCLUDED => "included section" | LOC_INT_DECL => "declaration in the internal subset" | LOC_INT_SUBSET => "internal subset" | LOC_LITERAL => "literal" | LOC_MIXED => "Mixed list" | LOC_NOT_DECL => "notation declaration" | LOC_OUT_COND => "outside a conditional section" | LOC_PROLOG => "prolog" | LOC_PROC => "processing instruction" | LOC_PUB_LIT => "public identifier" | LOC_SEQ => "sequence list" | LOC_STAG => "start-tag" | LOC_SUBSET => "declaration subset" | LOC_SYS_LIT => "system identifier" | LOC_TEXT_DECL => "text declaration" | LOC_VERSION => "version number" | LOC_XML_DECL => "XML declaration" fun InLocation2String loc = case loc of LOC_NONE => "" | LOC_AFTER_DTD => "after the DTD" | LOC_CONTENT => "in content" | LOC_ATT_DEFAULT pos => "in default value declared at "^Position2String pos | LOC_DOC_DECL => "in the document type declaration" | LOC_EPILOG => "after the root element" | LOC_INT_SUBSET => "in the internal subset" | LOC_OUT_COND => "outside a conditional section" | LOC_PROLOG => "in prolog" | LOC_SUBSET => "in the declaration subset" | LOC_XML_DECL => "in the XML declaration" | _ => "in "^prependAnA (Location2String loc) fun EntityClass2String ent = case ent of ENT_GENERAL => "general" | ENT_PARAMETER => "parameter" | ENT_UNPARSED => "unparsed" | ENT_EXTERNAL => "external" fun Item2String item = case item of IT_ATT_NAME => "attribute name" | IT_CDATA => "CDATA section" | IT_CHAR c => "character "^quoteErrorChar c | IT_CHAR_REF => "character reference" | IT_COND => "conditional section" | IT_DATA cs => if null cs then "character data" else quoteErrorData cs | IT_DECL => "declaration" | IT_DTD => "document type declaration" | IT_ELEM => "element type" | IT_ENT_NAME => "entity name" | IT_ETAG => "end-tag" | IT_GEN_ENT => "general entity" | IT_ID_NAME => "ID name" | IT_LANG_ID => "language identifier" | IT_NAME => "name" | IT_NMTOKEN => "name token" | IT_NOT_NAME => "notation name" | IT_NOTATION => "notation" | IT_PAR_ENT => "parameter entity" | IT_PAR_REF => "parameter entity reference" | IT_REF => "reference" | IT_STAG => "start-tag" | IT_TARGET => "target name" fun AnItem2String item = case item of IT_CHAR c => Item2String item | IT_DATA cs => Item2String item | _ => prependAnA (Item2String item) end (* stop of ../../Parser/Error/errorString.sml *) (* start of ../../Parser/Error/errorMessage.sml *) signature ErrorMessage = sig val errorMessage : ErrorData.Error -> string list val warningMessage : ErrorData.Warning -> string list end structure ErrorMessage : ErrorMessage = struct open Decode UtilString ErrorData ErrorString val quoteChar0 = quoteErrorChar0 val quoteChar = quoteErrorChar val quoteData = quoteErrorData val quoteString = quoteErrorString val quoteVector = quoteErrorVector fun errorMessage err = case err (* syntax errors *) of ERR_EMPTY loc => ["Empty",Location2String loc] | ERR_ENDED_BY_EE loc => [toUpperFirst (Location2String loc),"ended by entity end"] | ERR_EXPECTED (exp,found) => ["Expected",Expected2String exp,"but found",Found2String found] | ERR_MISSING_WHITE => ["Missing white space"] | ERR_NON_XML_CHAR c => ["Non-XML character",quoteChar0 c] | ERR_NON_XML_CHARREF c => ["Reference to non-XML character",quoteChar0 c] (* other well-formedness errors *) | ERR_CANT_PARSE loc => ["Cannot parse",Location2String loc] | ERR_ELEM_ENT_NESTING elem => ["The first and last character of element",quoteData elem, "are in different entities"] | ERR_ELEM_TYPE_MATCH (elem,other) => ["Element",quoteData elem,"was ended by an end-tag for",quoteData other] | ERR_IGNORED_END_TAG(elem,other) => ["An end-tag for element type",quoteData other,"is not allowed in the", "content of element",quoteData elem] | ERR_OMITTED_END_TAG elem => ["Element",quoteData elem,"has no end-tag"] | ERR_ENDED_IN_PROLOG => ["Document entity ended in prolog"] | ERR_FORBIDDEN_HERE(what,loc) => [AnItem2String what,"is not allowed",InLocation2String loc] | ERR_ILLEGAL_ENTITY(what,ent,loc) => ["Reference to",EntityClass2String what,"entity",quoteData ent,InLocation2String loc] | ERR_MULTIPLE_DTD => ["Repeated document type declaration"] | ERR_MULT_ATT_SPEC att => ["A value for attribute",quoteData att,"was already specified in this tag"] | ERR_RECURSIVE_ENTITY(what,ent) => ["Reference to",EntityClass2String what,"entity",quoteData ent, "that is already open"] | ERR_UNDEC_ENTITY(what,ent) => ["Reference to undeclared",EntityClass2String what,"entity",quoteData ent] (* validity errors concerning attributes *) | ERR_AT_LEAST_ONE what => ["At least one",Item2String what,"must be specified"] | ERR_AT_MOST_ONE what => ["Only one",Item2String what,"may be specified"] | ERR_ATT_IS_NOT(cs,what) => [quoteData cs,"is not",AnItem2String what] | ERR_EXACTLY_ONE what => [toUpperFirst (AnItem2String what),"must be specified"] | ERR_FIXED_VALUE(att,value,fixed) => ["Attribute",quoteData att,"has the value",quoteVector value, "but was declared with a fixed default value of",quoteVector fixed] | ERR_ID_DEFAULT => ["An ID attribute must have a default value of #IMPLIED or #REQUIRED"] | ERR_MISSING_ATT att => ["No value was specified for required attribute",quoteData att] | ERR_MULT_ID_ELEM elem => ["Element type",quoteData elem,"already has an ID attribute"] | ERR_MUST_BE_AMONG (what,x,ys) => [toUpperFirst (Item2String what),quoteData x,"is none of", List2xString ("",",","") quoteData ys] | ERR_MUST_BE_UNPARSED (name,loc) => [quoteData name,InLocation2String loc,"is not the name of an unparsed entity"] | ERR_REPEATED_ID name => ["ID name",quoteData name,"already occurred as an attribute value"] | ERR_UNDECL_ATT(att,elem) => ["Attribute",quoteData att,"was not declared for element type",quoteData elem] | ERR_UNDECL_ID(name,refs) => (if null refs then ["Reference to non-existent ID",quoteData name] else ["Reference to non-existent ID",quoteData name, "(also referenced at",List2xString ("",", ",")") Position2String refs]) (* validity errors concerning elements *) | ERR_BAD_ELEM (curr,elem) => ["Element type",quoteData elem,"not allowed at this point", "in the content of element",quoteData curr] | ERR_ELEM_CONTENT what => [toUpperFirst (AnItem2String what),"is not allowed in element content"] | ERR_EMPTY_TAG elem => ["Empty-element tag for element type",quoteData elem, "whose content model requires non-empty content"] | ERR_ENDED_EARLY elem => ["Element",quoteData elem,"ended before its content was completed"] | ERR_MULT_MIXED elem => ["Element type",quoteData elem,"already occurred in this mixed-content declaration"] | ERR_NONEMPTY elem => ["The end-tag for element",quoteData elem,"with declared EMPTY content", "must follow immediately after its start-tag"] | ERR_REDEC_ELEM elem => ["Element type",quoteData elem,"was already declared"] | ERR_ROOT_ELEM (dec,root) => ["Document element",quoteData root,"does not match the name", quoteData dec,"in the document type declaration"] (* other validity errors *) | ERR_DECL_ENT_NESTING loc => ["The first and last character of this",Location2String loc, "are not in the same entity replacement text"] | ERR_EE_INT_SUBSET => ["An entity end is not allowed in a declaration in the internal subset"] | ERR_GROUP_ENT_NESTING loc => ["The opening and closing parentheses of this",Location2String loc, "are not in the same entity replacement text"] | ERR_NO_DTD => ["There is no document type declaration. Switching to semi-validating mode", "(will not check for declaredness of entities, elements, etc.)"] | ERR_STANDALONE_DEF att => ["Externally declared attribute",quoteData att,"was defaulted,", "although the standalone declaration is",quoteString "yes"] | ERR_STANDALONE_ELEM elem => ["White space occurred in the content of externally declared", "element",quoteData elem,"with declared element content", "although the standalone declaration is",quoteString "yes"] | ERR_STANDALONE_ENT(what,ent) => ["Reference to externally declared",EntityClass2String what,"entity", quoteData ent^",","although the standalone declaration is",quoteString "yes"] | ERR_STANDALONE_NORM att => ["The value for externally declared attribute", quoteData att,"was changed as a result of normalization,", "although the standalone declaration is",quoteString "yes"] | ERR_UNDECLARED (what,x,loc) => ["Undeclared",Item2String what,quoteData x,InLocation2String loc] (* miscellaneous errors *) | ERR_DECL_PREDEF(ent,def) => ["General entity",quoteData ent,"must be declared as internal entity", "with replacement text",quoteVector def] | ERR_NO_SUCH_FILE(f,msg) => ["Could not open file",quoteString f,"("^msg^")"] | ERR_RESERVED(name,what) => [quoteData name,"is reserved for standardization and therefore not allowed as", AnItem2String what] | ERR_VERSION version => ["XML version",quoteString version,"is not supported"] | ERR_XML_SPACE => ["Attribute",quoteString "xml:space","must be given an enumeration type", "with values",quoteString "default","and",quoteString "preserve","only"] (* compatibility errors *) | ERR_AMBIGUOUS(a,n1,n2) => ["Content model is ambiguous: conflict between the",numberNth n1, "and the",numberNth n2,"occurrence of element",quoteData a^".", "Using an approximation instead"] | ERR_MUST_ESCAPE c => ["Character",quoteChar c,"must be escaped for compatibility"] (* interoperability errors *) | ERR_EMPTY_TAG_INTER elem => ["Empty-element tag for element",quoteData elem,"with non-EMPTY declared content"] | ERR_MUST_BE_EMPTY elem => ["An empty-element tag must be used for element type", quoteData elem,"with EMPTY declared content"] (* decoding errors *) | ERR_DECODE_ERROR err => "Decoding error:"::Decode.Error.decodeMessage err fun warningMessage warn = case warn of WARN_NO_XML_DECL => ["Document entity has no XML declaration"] | WARN_MULT_DECL(what,name) => ["Repeated declaration for",Item2String what,quoteData name] | WARN_SHOULD_DECLARE(ents) => let val (one,more) = (hd ents,tl ents) in case more of nil => ["The predefined entity",quoteData one,"should have been declared"] | _ => ["The predefined entities",List2xString ("",", ","") quoteData more, "and",quoteData one,"should have been declared"] end | WARN_ATT_UNDEC_ELEM elem => ["Attribute-list declaration for undeclared element type",quoteData elem] | WARN_MULT_ATT_DECL elem => ["Repeated attribute-list declaration for element type",quoteData elem] | WARN_MULT_ATT_DEF(elem,att) => ["Repeated definition of attribute",quoteData att,"for element type",quoteData elem] | WARN_ENUM_ATTS(elem,names) => ["The following name tokens occur more than once in the enumerated attribute", "types of element",quoteData elem^":",List2xString ("",", ","") quoteData names] | WARN_DFA_TOO_LARGE (elem,max) => ["The finite state machine for the content model of element type", quoteData elem,"would have more than the maximal allowed number of", Int2String max,"states. Using an approximation instead"] | WARN_NON_ASCII_URI c => ["System identifier contains non-ASCII character",quoteChar c] end (* stop of ../../Parser/Error/errorMessage.sml *) (* start of ../../Parser/Error/errorUtil.sml *) signature ErrorUtil = sig val isFatalError : ErrorData.Error -> bool val isDecodeError : ErrorData.Error -> bool val isSyntaxError : ErrorData.Error -> bool val isValidityError : ErrorData.Error -> bool val isWellFormedError : ErrorData.Error -> bool end structure ErrorUtil : ErrorUtil = struct open ErrorData fun isDecodeError err = case err of ERR_DECODE_ERROR _ => true | _ => false fun isSyntaxError err = case err of ERR_EMPTY _ => true | ERR_ENDED_BY_EE _ => true | ERR_EXPECTED _ => true | ERR_MISSING_WHITE => true | ERR_NON_XML_CHAR _ => true | ERR_NON_XML_CHARREF _ => true | _ => false fun isWellFormedError err = case err of ERR_CANT_PARSE _ => true | ERR_ELEM_ENT_NESTING _ => true | ERR_ELEM_TYPE_MATCH _ => true | ERR_OMITTED_END_TAG _ => true | ERR_IGNORED_END_TAG _ => true | ERR_ENDED_IN_PROLOG => true | ERR_FORBIDDEN_HERE _ => true | ERR_ILLEGAL_ENTITY _ => true | ERR_MULTIPLE_DTD => true | ERR_MULT_ATT_SPEC _ => true | ERR_RECURSIVE_ENTITY _ => true | ERR_UNDEC_ENTITY _ => true | _ => isSyntaxError err fun isFatalError err = case err of ERR_NO_SUCH_FILE _ => true | _ => isWellFormedError err fun isValidityError err = case err of ERR_AT_LEAST_ONE _ => true | ERR_AT_MOST_ONE _ => true | ERR_ATT_IS_NOT _ => true | ERR_EXACTLY_ONE _ => true | ERR_FIXED_VALUE _ => true | ERR_ID_DEFAULT => true | ERR_MISSING_ATT _ => true | ERR_MULT_ID_ELEM _ => true | ERR_MUST_BE_AMONG _ => true | ERR_MUST_BE_UNPARSED _ => true | ERR_REPEATED_ID _ => true | ERR_UNDECL_ATT _ => true | ERR_UNDECL_ID _ => true | ERR_BAD_ELEM _ => true | ERR_ELEM_CONTENT _ => true | ERR_EMPTY_TAG _ => true | ERR_ENDED_EARLY _ => true | ERR_MULT_MIXED _ => true | ERR_NONEMPTY _ => true | ERR_REDEC_ELEM _ => true | ERR_ROOT_ELEM _ => true | ERR_DECL_ENT_NESTING _ => true | ERR_EE_INT_SUBSET => true | ERR_GROUP_ENT_NESTING _ => true | ERR_NO_DTD => true | ERR_STANDALONE_DEF _ => true | ERR_STANDALONE_ELEM _ => true | ERR_STANDALONE_ENT _ => true | ERR_STANDALONE_NORM _ => true | ERR_UNDECLARED _ => true | _ => false end (* stop of ../../Parser/Error/errorUtil.sml *) (* start of ../../Parser/Error/expected.sml *) structure Expected = struct local open UniChar ErrorData in val expAnElemName = [EXP_STRING "an element name"] val expAnEntName = [EXP_STRING "an entity name"] val expAName = [EXP_STRING "a name"] val expANameToken = [EXP_STRING "a name token"] val expANotName = [EXP_STRING "a notation name"] val expATarget = [EXP_STRING "a target name"] val expAttDefKey = [EXP_DATA (String2Data "REQUIRED"),EXP_DATA (String2Data "IMPLIED"), EXP_DATA (String2Data "FIXED")] val expAttNameGt = [EXP_STRING "an attribute name",EXP_CHAR 0wx3E] val expAttSTagEnd = [EXP_STRING "an attribute name",EXP_CHAR 0wx3E, EXP_DATA(String2Data "/>")] val expAttType = [EXP_CHAR 0wx28,EXP_DATA (String2Data "CDATA"), EXP_DATA (String2Data "ID"),EXP_DATA (String2Data "IDREF"), EXP_DATA (String2Data "IDREFS"),EXP_DATA (String2Data "ENTITY"), EXP_DATA (String2Data "ENTITIES"),EXP_DATA (String2Data "NMTOKEN"), EXP_DATA (String2Data "NMTOKENS"),EXP_DATA (String2Data "NOTATION")] val expBarRpar = [EXP_CHAR 0wx29,EXP_CHAR 0wx7C] val expCdata = [EXP_DATA (String2Data "CDATA")] fun expConCRpar c = [EXP_CHAR 0wx29,EXP_CHAR c] val expConRpar = [EXP_CHAR 0wx29,EXP_CHAR 0wx2C,EXP_CHAR 0wx7C] val expCondStatus = [EXP_DATA (String2Data "IGNORE"),EXP_DATA (String2Data "INCLUDE")] val expContSpec = [EXP_CHAR 0wx28,EXP_DATA (String2Data "ANY"), EXP_DATA (String2Data "EMPTY")] val expElemLpar = [EXP_STRING "an element name",EXP_CHAR 0wx28] val expEncStand = [EXP_DATA (String2Data "encoding"), EXP_DATA (String2Data "standalone")] val expDash = [EXP_CHAR 0wx2D] val expDashDocLbrk = [EXP_CHAR 0wx2D,EXP_CHAR 0wx5B,EXP_DATA (String2Data "DOCTYPE")] val expDashLbrack = [EXP_CHAR 0wx2D,EXP_CHAR 0wx5B] val expDigitX = [EXP_STRING "a digit",EXP_CHAR 0wx78] val expEncoding = [EXP_DATA (String2Data "encoding")] val expEncVers = [EXP_DATA (String2Data "encoding"),EXP_DATA (String2Data "version")] val expEntNamePero = [EXP_STRING "an entity name",EXP_CHAR 0wx25] val expEq = [EXP_CHAR 0wx3D] val expExclQuest = [EXP_CHAR 0wx21,EXP_CHAR 0wx3F] val expExtId = [EXP_DATA (String2Data "PUBLIC"),EXP_DATA (String2Data "SYSTEM")] val expGt = [EXP_CHAR 0wx3E] val expGtNdata = [EXP_CHAR 0wx3E,EXP_DATA (String2Data "NDATA")] val expHexDigit = [EXP_STRING "a hexadecimal digit"] val expInSubset = [EXP_CHAR 0wx3C,EXP_CHAR 0wx5D,EXP_CHAR 0wx25, EXP_STRING "white space"] val expLbrack = [EXP_CHAR 0wx5B] val expLitQuote = [EXP_CHAR 0wx22,EXP_CHAR 0wx27] val expLitQuotExt = [EXP_CHAR 0wx22,EXP_CHAR 0wx27, EXP_DATA (String2Data "PUBLIC"),EXP_DATA (String2Data "SYSTEM")] val expLpar = [EXP_CHAR 0wx28] val expNoYes = [EXP_DATA (String2Data "no"),EXP_DATA (String2Data "yes")] val expPcdata = [EXP_DATA (String2Data "PCDATA")] val expProcEnd = [EXP_DATA (String2Data "?>")] val expQuoteRni = [EXP_CHAR 0wx22,EXP_CHAR 0wx27,EXP_CHAR 0wx23] val expRbrack = [EXP_CHAR 0wx5D] val expRep = [EXP_CHAR 0wx2A] val expSemi = [EXP_CHAR 0wx3B] val expStandOpt = [EXP_DATA (String2Data "standalone"),EXP_DATA (String2Data "?>")] val expStartEnc = [EXP_STRING "a letter"] val expStartMarkup = [EXP_DATA (String2Data "--"),EXP_DATA (String2Data "ATTLIST"), EXP_DATA (String2Data "ELEMENT"),EXP_DATA (String2Data "ENTITY"), EXP_DATA (String2Data "NOTATION")] val expVersion = [EXP_DATA (String2Data "version")] end end (* stop of ../../Parser/Error/expected.sml *) (* start of ../../Parser/Error/errors.sml *) structure Errors = struct open UtilError ErrorData ErrorMessage ErrorString ErrorUtil Expected end (* stop of ../../Parser/Error/errors.sml *) (* start of ../../Parser/Base/baseData.sml *) (*--------------------------------------------------------------------------*) (* Structure: BaseData *) (*--------------------------------------------------------------------------*) structure BaseData = struct open DfaData (*--- external ids may have a public id and must have a system id ---*) (*--- for notations, however, also the system id can be optional ----*) datatype ExternalId = EXTID of (string * UniChar.Char) option * (Uri.Uri * Uri.Uri * UniChar.Char) option (*--- external ids may have a public id and must have a system id ---*) type NotationInfo = ExternalId option (*--- replacement of a general entity ---*) datatype GenEntity = GE_NULL | GE_INTERN of UniChar.Vector * UniChar.Vector | GE_EXTERN of ExternalId | GE_UNPARSED of ExternalId * int * Errors.Position type GenEntInfo = GenEntity * bool fun isExtGen (GE_EXTERN _) = true | isExtGen _ = false (*--- replacement of a parameter entity ---*) datatype ParEntity = PE_NULL | PE_INTERN of UniChar.Vector * UniChar.Vector | PE_EXTERN of ExternalId type ParEntInfo = ParEntity * bool fun isExtPar (PE_EXTERN _) = true | isExtPar _ = false (*--- declared type of an attribute ---*) datatype AttType = AT_CDATA | AT_NMTOKEN | AT_NMTOKENS | AT_ID | AT_IDREF | AT_IDREFS | AT_ENTITY | AT_ENTITIES | AT_GROUP of int list | AT_NOTATION of int list (*--- typed attribute value ---*) datatype AttValue = AV_CDATA of UniChar.Vector | AV_NMTOKEN of UniChar.Data | AV_NMTOKENS of UniChar.Data list | AV_ID of int | AV_IDREF of int | AV_IDREFS of int list | AV_ENTITY of int | AV_ENTITIES of int list | AV_GROUP of int list * int | AV_NOTATION of int list * int fun isIdType at = at=AT_ID (*--- default values of attributes ---*) datatype AttDefault = AD_IMPLIED | AD_REQUIRED | AD_DEFAULT of (UniChar.Vector * UniChar.Vector * AttValue option) * (Errors.Position * bool ref) | AD_FIXED of (UniChar.Vector * UniChar.Vector * AttValue option) * (Errors.Position * bool ref) (*--- attribute definition (list) ---*) (*--- the boolean says whether it was externally declared ---*) type AttDef = int * AttType * AttDefault * bool type AttDefList = AttDef list (*--- content specification ---*) fun defaultAttDef idx = (idx,AT_CDATA,AD_IMPLIED,false) (*--- content specification ---*) datatype ContentSpec = CT_ANY | CT_EMPTY | CT_MIXED of int list | CT_ELEMENT of DfaData.ContentModel * DfaData.Dfa fun isMixed ct = case ct of CT_ANY => true | CT_MIXED _ => true | _ => false type ElemInfo = {decl : (ContentSpec * bool) option, atts : (AttDefList * bool) option, errAtts : int list} val nullElemInfo : ElemInfo = {decl=NONE, atts=NONE, errAtts=nil} (*--------------------------------------------------------------------*) (* the id info tells whether an id value has occurred for a name and *) (* the list of all positions where it occurred as an idref value. *) (*--------------------------------------------------------------------*) type IdInfo = bool * Errors.Position list val nullIdInfo : IdInfo = (false,nil) end (* stop of ../../Parser/Base/baseData.sml *) (* start of ../../Parser/Dfa/dfaString.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaString *) (* *) (* Notes: *) (* This structure is needed for debugging of content models and tables. *) (* *) (* Depends on: *) (* DfaData *) (* UtilString *) (* *) (* Exceptions raised by functions in this structure: *) (* Table2String : none *) (* ContentModel2String : none *) (*--------------------------------------------------------------------------*) signature DfaString = sig val ContentModel2String : (int -> string) -> DfaData.ContentModel -> string val Dfa2String : (int -> string) -> DfaData.Dfa -> string end structure DfaString : DfaString = struct open DfaBase UtilString fun State2String q = if q=dfaError then "Error" else Int2String q fun Info2String Elem2String (q,mt,fst) = String.concat (State2String q::Bool2xString ("[empty]","") mt ::map (fn (q,a) => " "^Elem2String a^"->"^State2String q) fst) fun ContentModel2String Elem2String cm = case cm of CM_ELEM i => Elem2String i | CM_OPT cm => ContentModel2String Elem2String cm^"?" | CM_REP cm => ContentModel2String Elem2String cm^"*" | CM_PLUS cm => ContentModel2String Elem2String cm^"+" | CM_ALT cms => List2xString ("(","|",")") (ContentModel2String Elem2String) cms | CM_SEQ cms => List2xString ("(",",",")") (ContentModel2String Elem2String) cms fun CM2String Elem2String = let fun cm2s indent cm = case cm of (ELEM a,info) => String.concat [indent,Elem2String a," ",Info2String Elem2String info,"\n"] | (OPT cm',info) => String.concat [indent,"? ",Info2String Elem2String info,"\n",cm2s (indent^" ") cm'] | (REP cm',info) => String.concat [indent,"* ",Info2String Elem2String info,"\n",cm2s (indent^" ") cm'] | (PLUS cm',info) => String.concat [indent,"+ ",Info2String Elem2String info,"\n",cm2s (indent^" ") cm'] | (ALT cms,info) => String.concat (indent^"| "::Info2String Elem2String info::"\n" ::map (cm2s (indent^" ")) cms) | (SEQ cms,info) => String.concat (indent^", "::Info2String Elem2String info::"\n" ::map (cm2s (indent^" ")) cms) in cm2s "" end fun Row2String Elem2String (lo,hi,tab,fin) = String.concat (Vector.foldri (fn (i,q,yet) => if q<0 then yet else " "::Elem2String (i+lo)::"->"::State2String q::yet) (if fin then [" [Final]"] else nil) (tab,0,NONE)) fun Dfa2String Elem2String tab = String.concat (Vector.foldri (fn (q,row,yet) => State2String q::":"::Row2String Elem2String row::yet) nil (tab,0,NONE)) end (* stop of ../../Parser/Dfa/dfaString.sml *) (* start of ../../Parser/Base/baseString.sml *) (*--------------------------------------------------------------------------*) (* Structure: BaseString *) (* *) (* Depends on: *) (* UniChar *) (* Dfa *) (* BaseData *) (* UtilString *) (* *) (* Exceptions raised by functions in this structure: *) (* ElemInfo2xString : InternalError *) (* ExternalId2String : none *) (* GenEntity2xString : none *) (* Notation2String : none *) (* IdInfo2String : none *) (* ParEntity2String : none *) (*--------------------------------------------------------------------------*) signature BaseString = sig val ExternalId2String : BaseData.ExternalId -> string val NotationInfo2String : BaseData.NotationInfo -> string val GenEntity2xString : (int -> string) -> BaseData.GenEntity -> string val ParEntity2String : BaseData.ParEntity -> string val ElemInfo2xString : (int -> string) * (int -> string) * (int -> string) * (int -> string) * (int -> string) -> BaseData.ElemInfo -> string val IdInfo2String : BaseData.IdInfo -> string end structure BaseString : BaseString = struct open UtilString Uri Errors UniChar DfaString BaseData val THIS_MODULE = "BaseString" fun ExternalId2String (EXTID id) = case id of (SOME(p,pq),SOME(rel,s,sq)) => String.concat ["PUBLIC ",quoteUni pq p, " ",quoteUni sq (Uri2String rel), " @ ",quoteUni sq (Uri2String s)] | (SOME(p,pq),NONE) => String.concat ["PUBLIC ",quoteUni pq p] | (NONE,SOME(rel,s,sq)) => String.concat ["SYSTEM ",quoteUni sq (Uri2String rel), " @ ",quoteUni sq (Uri2String s)] | (NONE,NONE) => "" fun NotationInfo2String not = case not of NONE => "undeclared" | SOME extId => ExternalId2String extId fun GenEntity2xString NotIdx2String ge = case ge of GE_NULL => "NULL" | GE_INTERN(lit,cv) => let val quote = Vector.sub(lit,0) in String.concat ["INTERN ",Vector2String lit, " - ",quoteVector quote cv] end | GE_EXTERN id => "EXTERN "^ExternalId2String id | GE_UNPARSED(id,not,_) => "UNPARSED "^ExternalId2String id^" "^NotIdx2String not fun ParEntity2String pe = case pe of PE_NULL => "NULL" | PE_INTERN(lit,cv) => let val quote = Vector.sub(lit,0) in String.concat ["INTERN ",Vector2String lit, " - ",quoteVector quote cv] end | PE_EXTERN id => "EXTERN "^ExternalId2String id fun ContentSpec2String Elem2String cs = case cs of CT_ANY => "ANY" | CT_EMPTY => "EMPTY" | CT_MIXED is => List2xString ("MIXED (","|",")") Elem2String is | CT_ELEMENT(cm,_) => "ELEMENT "^ContentModel2String Elem2String cm fun AttValue2xString (Att2String,Ent2String,Id2String,Not2String) quote av = quoteUni quote (case av of AV_CDATA buf => Vector2String buf | AV_NMTOKEN cs => Data2String cs | AV_NMTOKENS css => List2xString (""," ","") Data2String css | AV_ID idx => Id2String idx | AV_IDREF idx => Id2String idx | AV_IDREFS idxs => List2xString (""," ","") Id2String idxs | AV_ENTITY idx => Ent2String idx | AV_ENTITIES idxs => List2xString (""," ","") Ent2String idxs | AV_GROUP(_,idx) => Att2String idx | AV_NOTATION(_,idx) => Not2String idx) fun AttDefault2xString funs ad = case ad of AD_DEFAULT ((lit,cv,av),_) => let val quote = Vector.sub(lit,0) in String.concat [quoteVector quote cv," ", Option2String0 (AttValue2xString funs quote) av] end | AD_FIXED ((lit,cv,av),_) => let val quote = Vector.sub(lit,0) in String.concat ["#FIXED ",quoteVector quote cv," ", Option2String0 (AttValue2xString funs quote) av] end | AD_IMPLIED => "#IMPLIED" | AD_REQUIRED => "#REQUIRED" fun AttType2xString (Att2String,Not2String) at = case at of AT_CDATA => "CDATA" | AT_NMTOKEN => "NMTOKEN" | AT_NMTOKENS => "NMTOKENS" | AT_ID => "ID" | AT_IDREF => "IDREF" | AT_IDREFS => "IDREFS" | AT_ENTITY => "ENTITY" | AT_ENTITIES => "ENTITIES" | AT_GROUP idxs => List2xString ("(","|",")") Att2String idxs | AT_NOTATION idxs => List2xString ("NOTATION(","|",")") Not2String idxs fun AttDef2xString (funs as (Att2String,_,_,Not2String)) (idx,attType,default,ext) = String.concat [Att2String idx," ", AttType2xString (Att2String,Not2String) attType," ", AttDefault2xString funs default, Bool2xString ("[external]","") ext] fun AttDefList2xString funs adl = List2xString ("",",","") (AttDef2xString funs) adl fun ElemInfo2xString (Att2String,Elem2String,Ent2String,Id2String,Not2String) ({decl,atts,...}:ElemInfo) = let val dec = case decl of NONE => "elem undeclared" | SOME(cont,ext) => String.concat ["elem declared ",if ext then "ex" else "in","ternally: ", ContentSpec2String Elem2String cont] val att = case atts of NONE => "no atts declared" | SOME(defs,hadId) => String.concat ["atts were declared",if hadId then "(has id attribute): " else ": ", AttDefList2xString (Att2String,Ent2String,Id2String,Not2String) defs] in dec^att end fun IdInfo2String (decl,refs) = Bool2xString ("declared","undeclared") decl^"/"^ (if null refs then "no references" else List2xString ("references: ",", ","") Position2String refs) end (* stop of ../../Parser/Base/baseString.sml *) (* start of ../../Parser/Base/base.sml *) structure Base = struct open BaseData BaseString end (* stop of ../../Parser/Base/base.sml *) (* start of ../../Parser/Params/dtd.sml *) (*--------------------------------------------------------------------------*) (* Structure: Dtd *) (* *) (* Exceptions raised by functions in this structure: *) (* AttNot2Index : none *) (* Element2Index : none *) (* GenEnt2Index : none *) (* Id2Index : none *) (* Index2AttNot : NoSuchIndex *) (* Index2Element : NoSuchIndex *) (* Index2GenEnt : NoSuchIndex *) (* Index2Id : NoSuchIndex *) (* Index2ParEnt : NoSuchIndex *) (* ParEnt2Index : none *) (* entitiesWellformed : none *) (* getElement : NoSuchIndex *) (* getGenEnt : NoSuchIndex *) (* getId : NoSuchIndex *) (* getNotation : NoSuchIndex *) (* getParEnt : NoSuchIndex *) (* hasNotation : NoSuchIndex *) (* initDtdTables : none *) (* maxUsedElem : none *) (* maxUsedId : none *) (* printAttNotTable : none *) (* printIdTable : none *) (* printParEntTable : none *) (* printxElementTable : none *) (* printxGenEntTable : none *) (* setElement : NoSuchIndex *) (* setGenEnt : NoSuchIndex *) (* setId : NoSuchIndex *) (* setNotation : NoSuchIndex *) (* setParEnt : NoSuchIndex *) (*--------------------------------------------------------------------------*) signature Dtd = sig type Dtd val hasDtd : Dtd -> bool val hasExternal : Dtd -> bool val standsAlone : Dtd -> bool val setHasDtd : Dtd -> unit val setExternal : Dtd -> unit val setStandAlone : Dtd -> bool -> unit val entitiesWellformed : Dtd -> bool val validPredef : int -> UniChar.Vector val isRedefined : Dtd -> int -> bool val setRedefined : Dtd -> int -> unit val notRedefined : Dtd -> UniChar.Data list val AttNot2Index : Dtd -> UniChar.Data -> int val Element2Index : Dtd -> UniChar.Data -> int val Id2Index : Dtd -> UniChar.Data -> int val GenEnt2Index : Dtd -> UniChar.Data -> int val ParEnt2Index : Dtd -> UniChar.Data -> int val Index2Element : Dtd -> int -> UniChar.Data val Index2Id : Dtd -> int -> UniChar.Data val Index2GenEnt : Dtd -> int -> UniChar.Data val Index2AttNot : Dtd -> int -> UniChar.Data val Index2ParEnt : Dtd -> int -> UniChar.Data val getId : Dtd -> int -> Base.IdInfo val getElement : Dtd -> int -> Base.ElemInfo val getGenEnt : Dtd -> int -> Base.GenEntInfo val getNotation : Dtd -> int -> Base.NotationInfo val getParEnt : Dtd -> int -> Base.ParEntInfo val hasNotation : Dtd -> int -> bool val setId : Dtd -> int * Base.IdInfo -> unit val setElement : Dtd -> int * Base.ElemInfo -> unit val setGenEnt : Dtd -> int * Base.GenEntInfo -> unit val setNotation : Dtd -> int * Base.ExternalId -> unit val setParEnt : Dtd -> int * Base.ParEntInfo -> unit val maxUsedId : Dtd -> int val maxUsedElem : Dtd -> int val maxUsedGen : Dtd -> int val initDtdTables : unit -> Dtd val printDtdTables : Dtd -> unit val printAttNotTable : Dtd -> unit val printIdTable : Dtd -> unit val printElementTable : Dtd -> unit val printGenEntTable : Dtd -> unit val printParEntTable : Dtd -> unit val defaultIdx : int val preserveIdx : int val xmlLangIdx : int val xmlSpaceIdx : int val xmlSpaceType : Base.AttType end structure Dtd :> Dtd = struct open UtilInt Base UniChar DataDict DataSymTab val O_TS_ELEM = ref 6 (* Initial size of element table *) val O_TS_GEN_ENT = ref 6 (* Initial size of general entity table *) val O_TS_ID = ref 6 (* Initial size of id attribute table *) val O_TS_ATT_NOT = ref 6 (* Initial size of notation table *) val O_TS_PAR_ENT = ref 6 (* Initial size of parameter entity table *) (*--------------------------------------------------------------------*) (* this is how the predefined entities must be declared. *) (*--------------------------------------------------------------------*) val predefined = Vector.fromList (map (fn (x,y,z) => (String2Data x,String2Vector y,String2Vector z)) [("","",""), ("amp" ,"'&'","&"), ("lt" ,"'<'","<"), ("gt" ,"'>'",">"), ("apos","\"'\"" ,"'" ), ("quot","'\"'" ,"\"" )]) fun validPredef i = #3(Vector.sub(predefined,i)) (*--------------------------------------------------------------------*) (* this type holds all information relevent to the DTD. *) (*--------------------------------------------------------------------*) type Dtd = {hasDtdFlag : bool ref, standAloneFlag : bool ref, externalFlag : bool ref, elDict : ElemInfo DataDict.Dict, genDict : GenEntInfo DataDict.Dict, idDict : IdInfo DataDict.Dict, notDict : NotationInfo DataDict.Dict, parDict : ParEntInfo DataDict.Dict, preRedef : bool array } fun newDtd() = {hasDtdFlag = ref false, standAloneFlag = ref false, externalFlag = ref false, elDict = nullDict ("element",nullElemInfo), idDict = nullDict ("ID name",nullIdInfo), genDict = nullDict ("general entity",(GE_NULL,false)), notDict = nullDict ("attribute and notation",NONE:NotationInfo), parDict = nullDict ("parameter entity",(PE_NULL,false)), preRedef = Array.array(6,false) } : Dtd val default = String2Data "default" val preserve = String2Data "preserve" val xmlLang = String2Data "xml:lang" val xmlSpace = String2Data "xml:space" (*--------------------------------------------------------------------*) (* standalone status, existance of a DTD and of external declarations *) (* externalFlag is true if there is an external subset or a (not nece-*) (* ssarily external) parameter entity reference in the DTD. (cf. 4.1) *) (*--------------------------------------------------------------------*) fun standsAlone (dtd:Dtd) = !(#standAloneFlag dtd) fun hasExternal (dtd:Dtd) = !(#externalFlag dtd) fun hasDtd (dtd:Dtd) = !(#hasDtdFlag dtd) fun setHasDtd (dtd:Dtd) = #hasDtdFlag dtd := true fun setExternal (dtd:Dtd) = #externalFlag dtd := true fun setStandAlone (dtd:Dtd) x = #standAloneFlag dtd := x (*--------------------------------------------------------------------*) (* 4.1: *) (* Well-Formedness Constraint: Entity Declared *) (* In a document without any DTD, a document with only an internal *) (* DTD subset which contains no parameter entity references, or a *) (* document with "standalone='yes'", the Name given in the entity *) (* reference must match that in an entity declaration ... Note that *) (* if entities are declared in the external subset or in external *) (* parameter entities, a non-validating processor is not obligated *) (* to read and process their declarations; for such documents, the *) (* rule that an entity must be declared is a well-formedness *) (* constraint only if standalone='yes'. *) (* *) (* Thus a reference to an undeclared entity is a well-formedness *) (* error if either #hasDtdFlag or #externalFlag is false, or if *) (* #standaloneFlag is true *) (*--------------------------------------------------------------------*) (* bug fixed 080600: changed !hasDtdFlag to not(!hasDtdFlag) *) (*--------------------------------------------------------------------*) fun entitiesWellformed ({hasDtdFlag,standAloneFlag,externalFlag,...}:Dtd) = not (!hasDtdFlag andalso !externalFlag) orelse !standAloneFlag fun initStandalone ({hasDtdFlag,standAloneFlag,externalFlag,...}:Dtd) = (hasDtdFlag := false; standAloneFlag := false; externalFlag := false) (*--------------------------------------------------------------------*) (* this array tells whether the predefined entities (index 1-5) have *) (* been declared in the dtd. *) (*--------------------------------------------------------------------*) fun isRedefined (dtd:Dtd) i = Array.sub(#preRedef dtd,i) fun setRedefined (dtd:Dtd) i = Array.update(#preRedef dtd,i,true) fun notRedefined dtd = List.mapPartial (fn i => if isRedefined dtd i then NONE else SOME(#1(Vector.sub(predefined,i)))) [1,2,3,4,5] fun AttNot2Index (dtd:Dtd) name = getIndex(#notDict dtd,name) fun Element2Index (dtd:Dtd) name = getIndex(#elDict dtd,name) fun GenEnt2Index (dtd:Dtd) name = getIndex(#genDict dtd,name) fun Id2Index (dtd:Dtd) name = getIndex(#idDict dtd,name) fun ParEnt2Index (dtd:Dtd) name = getIndex(#parDict dtd,name) fun Index2AttNot (dtd:Dtd) idx = getKey(#notDict dtd,idx) fun Index2Element (dtd:Dtd) idx = getKey(#elDict dtd,idx) fun Index2GenEnt (dtd:Dtd) idx = getKey(#genDict dtd,idx) fun Index2Id (dtd:Dtd) idx = getKey(#idDict dtd,idx) fun Index2ParEnt (dtd:Dtd) idx = getKey(#parDict dtd,idx) fun getElement (dtd:Dtd) idx = getByIndex(#elDict dtd,idx) fun getGenEnt (dtd:Dtd) idx = getByIndex(#genDict dtd,idx) fun getId (dtd:Dtd) idx = getByIndex(#idDict dtd,idx) fun getNotation (dtd:Dtd) idx = getByIndex(#notDict dtd,idx) fun getParEnt (dtd:Dtd) idx = getByIndex(#parDict dtd,idx) fun hasNotation (dtd:Dtd) idx = isSome(getByIndex(#notDict dtd,idx)) fun setElement (dtd:Dtd) (idx,el) = setByIndex(#elDict dtd,idx,el) fun setGenEnt (dtd:Dtd) (idx,ge) = setByIndex(#genDict dtd,idx,ge) fun setId (dtd:Dtd) (idx,a) = setByIndex(#idDict dtd,idx,a) fun setNotation (dtd:Dtd) (idx,nt) = setByIndex(#notDict dtd,idx,SOME nt) fun setParEnt (dtd:Dtd) (idx,pe) = setByIndex(#parDict dtd,idx,pe) fun maxUsedElem (dtd:Dtd) = usedIndices(#elDict dtd)-1 fun maxUsedGen (dtd:Dtd) = usedIndices(#genDict dtd)-1 fun maxUsedId (dtd:Dtd) = usedIndices(#idDict dtd)-1 (*--------------------------------------------------------------------*) (* initialize the attribute tables. Make sure that indices 0...3 are *) (* assigned to "default", "preserve", "xml:lang" and "xml:space". *) (*--------------------------------------------------------------------*) fun initAttNotTable (dtd as {idDict,notDict,...}:Dtd) = let val _ = clearDict(notDict,SOME(!O_TS_ATT_NOT)) val _ = clearDict(idDict,SOME(!O_TS_ID)) val _ = AttNot2Index dtd default val _ = AttNot2Index dtd preserve val _ = AttNot2Index dtd xmlLang val _ = AttNot2Index dtd xmlSpace in () end fun initElementTable (dtd:Dtd) = clearDict(#elDict dtd,SOME(!O_TS_ELEM)) (*--------------------------------------------------------------------*) (* reserve 0 for gen entity -, i.e., the document entity. *) (* reserve 1 for gen entity amp, i.e., "&#38;" *) (* reserve 2 for gen entity lt, i.e., "&#60;" *) (* reserve 3 for gen entity gt, i.e., ">" *) (* reserve 4 for gen entity apos, i.e., "'" *) (* reserve 5 for gen entity quot, i.e., """ *) (* reserve 0 for par entity -, i.e., the external dtd subset. *) (* *) (* Cf. 4.1: *) (* *) (* ... except that well-formed documents need not declare any of *) (* the following entities: amp, lt, gt, apos, quot. *) (* *) (* and 4.6: *) (* *) (* *) (* *) (* *) (* *) (* *) (*--------------------------------------------------------------------*) fun initEntityTables (dtd as {genDict,parDict,preRedef,...}:Dtd) = let val _ = clearDict(genDict,SOME(!O_TS_GEN_ENT)) val _ = clearDict(parDict,SOME(!O_TS_PAR_ENT)) val _ = map (fn i => Array.update(preRedef,i,false)) [1,2,3,4,5] val _ = GenEnt2Index dtd [0wx2D] (* "-" *) val _ = ParEnt2Index dtd [0wx2D] (* "-" *) val _ = Vector.appi (fn (_,(name,lit,cs)) => (setGenEnt dtd (GenEnt2Index dtd name,(GE_INTERN(lit,cs),false)))) (predefined,1,NONE) in () end fun initDtdTables() = let val dtd = newDtd() val _ = initAttNotTable dtd val _ = initElementTable dtd val _ = initEntityTables dtd val _ = initStandalone dtd in dtd end local val dtd = initDtdTables() in val defaultIdx = AttNot2Index dtd default val preserveIdx = AttNot2Index dtd preserve val xmlLangIdx = AttNot2Index dtd xmlLang val xmlSpaceIdx = AttNot2Index dtd xmlSpace val xmlSpaceType = AT_GROUP (IntLists.addIntList (preserveIdx,[defaultIdx])) end fun printAttNotTable (dtd:Dtd) = printDict NotationInfo2String (#notDict dtd) fun printElementTable dtd = printDict (ElemInfo2xString (UniChar.Data2String o (Index2AttNot dtd), UniChar.Data2String o (Index2Element dtd), UniChar.Data2String o (Index2GenEnt dtd), UniChar.Data2String o (Index2Id dtd), UniChar.Data2String o (Index2AttNot dtd))) (#elDict dtd) fun printGenEntTable dtd = printDict (fn (ent,ext) => GenEntity2xString (Data2String o (Index2AttNot dtd)) ent ^(if ext then "[external]" else "")) (#genDict dtd) fun printIdTable (dtd:Dtd) = printDict (IdInfo2String) (#idDict dtd) fun printParEntTable (dtd:Dtd) = printDict (fn (ent,ext) => ParEntity2String ent ^(if ext then "[external]" else "")) (#parDict dtd) fun printDtdTables dtd = (printAttNotTable dtd; printElementTable dtd; printGenEntTable dtd; printIdTable dtd; printParEntTable dtd) end (* stop of ../../Parser/Params/dtd.sml *) (* start of ../../Parser/Params/hookData.sml *) structure HookData = struct type StartEnd = Errors.Position * Errors.Position (*--------------------------------------------------------------------*) (* a text declaration consists of a version info and an encoding decl.*) (* an xml declaration has an additional standalone decl. *) (*--------------------------------------------------------------------*) type TextDecl = string option * string option type XmlDecl = string option * string option * bool option type XmlInfo = Uri.Uri * Encoding.Encoding * XmlDecl option type ExtSubsetInfo = Uri.Uri * Encoding.Encoding * TextDecl option type SubsetInfo = Errors.Position type EndDtdInfo = Errors.Position type ErrorInfo = Errors.Position * Errors.Error type WarningInfo = Errors.Position * Errors.Warning type NoFileInfo = string * string type CommentInfo = StartEnd * UniChar.Vector type ProcInstInfo = StartEnd * UniChar.Data * Errors.Position * UniChar.Vector type DtdInfo = int * Base.ExternalId option datatype AttPresent = AP_IMPLIED | AP_MISSING | AP_DEFAULT of UniChar.Vector * UniChar.Vector * Base.AttValue option | AP_PRESENT of UniChar.Vector * UniChar.Vector * Base.AttValue option type AttSpec = int * AttPresent * (UniChar.Data * UniChar.Data) option type AttSpecList = AttSpec list type EndTagInfo = StartEnd * int * (int * UniChar.Data) option type StartTagInfo = StartEnd * int * AttSpecList * UniChar.Data * bool type WhiteInfo = UniChar.Vector type CDataInfo = StartEnd * UniChar.Vector type DataInfo = StartEnd * UniChar.Vector * bool type CharRefInfo = StartEnd * UniChar.Char * UniChar.Vector type GenRefInfo = StartEnd * int * Base.GenEntity * bool type ParRefInfo = StartEnd * int * Base.ParEntity * bool type EntEndInfo = Errors.Position datatype MarkupDecl = DEC_ATTLIST of int * (int * Base.AttType * Base.AttDefault) list * bool | DEC_ELEMENT of int * Base.ContentSpec * bool | DEC_GEN_ENT of int * Base.GenEntity * bool | DEC_PAR_ENT of int * Base.ParEntity * bool | DEC_NOTATION of int * Base.ExternalId * bool type DeclInfo = StartEnd * MarkupDecl fun isExtDecl decl = case decl of DEC_ATTLIST(_,_,ext) => ext | DEC_ELEMENT(_,_,ext) => ext | DEC_GEN_ENT(_,_,ext) => ext | DEC_PAR_ENT(_,_,ext) => ext | DEC_NOTATION(_,_,ext) => ext end (* stop of ../../Parser/Params/hookData.sml *) (* start of ../../Parser/Params/hooks.sml *) signature Hooks = sig type AppData type AppFinal val hookXml : AppData * HookData.XmlInfo -> AppData val hookFinish : AppData -> AppFinal val hookError : AppData * HookData.ErrorInfo -> AppData val hookWarning : AppData * HookData.WarningInfo -> AppData val hookProcInst : AppData * HookData.ProcInstInfo -> AppData val hookComment : AppData * HookData.CommentInfo -> AppData val hookWhite : AppData * HookData.WhiteInfo -> AppData val hookDecl : AppData * HookData.DeclInfo -> AppData val hookStartTag : AppData * HookData.StartTagInfo -> AppData val hookEndTag : AppData * HookData.EndTagInfo -> AppData val hookCData : AppData * HookData.CDataInfo -> AppData val hookData : AppData * HookData.DataInfo -> AppData val hookCharRef : AppData * HookData.CharRefInfo -> AppData val hookGenRef : AppData * HookData.GenRefInfo -> AppData val hookParRef : AppData * HookData.ParRefInfo -> AppData val hookEntEnd : AppData * HookData.EntEndInfo -> AppData val hookDocType : AppData * HookData.DtdInfo -> AppData val hookSubset : AppData * HookData.SubsetInfo -> AppData val hookExtSubset : AppData * HookData.ExtSubsetInfo -> AppData val hookEndDtd : AppData * HookData.EndDtdInfo -> AppData end (* stop of ../../Parser/Params/hooks.sml *) (* start of ../../Parser/Params/resolve.sml *) signature Resolve = sig val resolveExtId : Base.ExternalId -> Uri.Uri end structure ResolveNull : Resolve = struct open Base Errors Uri fun resolveExtId (EXTID(_,sys)) = case sys of NONE => raise NoSuchFile ("","Could not generate system identifier") | SOME (base,file,_) => uriJoin(base,file) end (* stop of ../../Parser/Params/resolve.sml *) (* start of ../../Parser/Dfa/dfaUtil.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaUtil *) (* *) (* Depends on: *) (* DfaData *) (* UtilInt *) (* *) (* Exceptions raised by functions in this structure: *) (* boundsFollow : none *) (* cmSymbols : none *) (* makeRow : none *) (* mergeFirst : ConflictFirst *) (* mergeFollow : ConflictFollow *) (*--------------------------------------------------------------------------*) signature DfaUtil = sig val mergeFirst : bool -> DfaBase.First * DfaBase.First -> DfaBase.First val mergeFollow : bool -> DfaBase.Follow * DfaBase.Follow -> DfaBase.Follow val boundsFollow : DfaBase.Follow -> DfaBase.Sigma * DfaBase.Sigma val cmSymbols : DfaBase.ContentModel -> DfaBase.Sigma list val makeRow : DfaBase.Follow * bool -> DfaBase.Row end structure DfaUtil : DfaUtil = struct open UtilInt DfaBase (*--------------------------------------------------------------------*) (* merge two First sets, raise ConflictFirst at conflict: there may *) (* not be two entries (q1,a) and (q2,a) in the same First set, if *) (* nondet is false. *) (*--------------------------------------------------------------------*) fun mergeFirst nondet ll = let fun go_det (nil,l) = l | go_det (l,nil) = l | go_det (l1 as (x1 as (q1,a1))::r1,l2 as (x2 as (q2,a2))::r2) = case Int.compare(a1,a2) of LESS => x1::go_det(r1,l2) | GREATER => x2::go_det(l1,r2) | EQUAL => raise ConflictFirst(a1,q1,q2) fun go_nondet (nil,l) = l | go_nondet (l,nil) = l | go_nondet (l1 as (x1 as (q1,a1))::r1,l2 as (x2 as (q2,a2))::r2) = case Int.compare(a1,a2) of LESS => x1::go_nondet(r1,l2) | GREATER => x2::go_nondet(l1,r2) | EQUAL => case Int.compare(q1,q2) of LESS => x1::go_nondet(r1,l2) | GREATER => x2::go_nondet(l1,r2) | EQUAL => go_nondet(l1,r2) in if nondet then go_nondet ll else go_det ll end (*--------------------------------------------------------------------*) (* merge two Follow sets, raise ConflictFollow at conflict. there may *) (* not be two entries (q1,a) and (q2,a) with q1<>q2 in the same Follow*) (* set, if nondet is false. Note that, e.g. for (a+)+, Follow(a) = *) (* Follow(a+) U First(a+), so duplicate occurrences of the same (q,a) *) (* are possible (as opposed to First). *) (*--------------------------------------------------------------------*) fun mergeFollow nondet ll = let fun go_det (nil,l) = l | go_det (l,nil) = l | go_det (l1 as (x1 as (q1,a1))::r1,l2 as (x2 as (q2,a2))::r2) = case Int.compare(a1,a2) of LESS => x1::go_det(r1,l2) | GREATER => x2::go_det(l1,r2) | EQUAL => if q1=q2 then go_det(l1,r2) else raise ConflictFollow(a1,q1,q2) fun go_nondet (nil,l) = l | go_nondet (l,nil) = l | go_nondet (l1 as (x1 as (q1,a1))::r1,l2 as (x2 as (q2,a2))::r2) = case Int.compare(a1,a2) of LESS => x1::go_nondet(r1,l2) | GREATER => x2::go_nondet(l1,r2) | EQUAL => case Int.compare(q1,q2) of LESS => x1::go_nondet(r1,l2) | GREATER => x2::go_nondet(l1,r2) | EQUAL => go_nondet(l1,r2) in if nondet then go_nondet ll else go_det ll end (*--------------------------------------------------------------------*) (* what are the least and largest symbol occurring in a Follow set? *) (*--------------------------------------------------------------------*) fun boundsFollow (nil:Follow) = (1,0) | boundsFollow [(q,a)] = (a,a) | boundsFollow ((q,a)::xs) = (a,#2(List.last xs)) (*--------------------------------------------------------------------*) (* return the list of all symbols occurring in a content model. *) (*--------------------------------------------------------------------*) fun cmSymbols cm = let fun do_cm(cm,yet) = case cm of CM_ELEM a => insertInt(a,yet) | CM_OPT cm => do_cm(cm,yet) | CM_REP cm => do_cm(cm,yet) | CM_PLUS cm => do_cm(cm,yet) | CM_ALT cms => foldr do_cm yet cms | CM_SEQ cms => foldr do_cm yet cms in do_cm(cm,nil) end (*--------------------------------------------------------------------*) (* given the follow set and the final flag, make a row in the dfa. *) (*--------------------------------------------------------------------*) fun makeRow (flw,fin) = let val (lo,hi) = boundsFollow flw val tab = Array.array(hi-lo+1,dfaError) val _ = app (fn (q,a) => Array.update (tab,a-lo,q)) flw in (lo,hi,Array.extract (tab,0,NONE),fin) end end (* stop of ../../Parser/Dfa/dfaUtil.sml *) (* start of ../../Util/intSets.sml *) signature IntSets = sig eqtype IntSet val emptyIntSet : IntSet val singleIntSet : int -> IntSet val fullIntSet : int -> IntSet val isEmptyIntSet : IntSet -> bool val inIntSet : int * IntSet -> bool val compareIntSets: IntSet * IntSet -> order val hashIntSet : IntSet -> word val addIntSet : int * IntSet -> IntSet val delIntSet : int * IntSet -> IntSet val cupIntSets : IntSet * IntSet -> IntSet val capIntSets : IntSet * IntSet -> IntSet val diffIntSets : IntSet * IntSet -> IntSet val IntSet2List : IntSet -> int list val IntList2Set : int list -> IntSet end structure IntSets : IntSets = struct structure W = Word32 val wordSize = W.wordSize type IntSet = W.word vector infix 7 << >> infix 6 && infix 5 || val op >> = W.>> val op << = W.<< val op && = W.andb val op || = W.orb val !! = W.notb fun normalize (vec:IntSet) = let val max = Vector.foldli (fn (i,w,max) => if w=0wx0 then i else max) 0 (vec,0,NONE) in Vector.extract (vec,0,SOME max) end val emptyIntSet = Vector.fromList nil : IntSet fun fullIntSet n = let val size = (n+wordSize-1) div wordSize val full = 0w0-0w1:W.word val bits = (n-1) mod wordSize+1 val last = full >> (Word.fromInt (wordSize-bits)) in Vector.tabulate(n div wordSize+1, fn i => if i if i=idx then mask else 0w0):IntSet end fun isEmptyIntSet vec = Vector.length vec=0 fun inIntSet(n,vec) = let val idx = n div wordSize in if idx>=Vector.length vec then false else let val mask = 0w1 << (Word.fromInt (n mod wordSize)) in Vector.sub(vec,idx) && mask <> 0w0 end end fun addIntSet(n,vec) = let val idx = n div wordSize val mask = 0w1 << (Word.fromInt (n mod wordSize)) val size = Vector.length vec in if size>idx then Vector.mapi (fn (i,x) => if i=idx then x||mask else x) (vec,0,NONE) else Vector.tabulate (idx+1,fn i => if i if i=idx then x && mask else x) (vec,0,NONE) end in normalize vec1 end fun capIntSets(vec1,vec2) = let val l12 = Int.min(Vector.length vec1,Vector.length vec2) val v12 = Vector.tabulate(l12,fn i => Vector.sub(vec1,i) && Vector.sub(vec2,i)) in normalize v12 end fun cupIntSets(vec1,vec2) = let val (l1,l2) = (Vector.length vec1,Vector.length vec2) val (shorter,longer,v) = if l1<=l2 then (l1,l2,vec2) else (l2,l1,vec1) in Vector.tabulate (longer,fn i => if i>=shorter then Vector.sub(v,i) else Vector.sub(vec1,i) || Vector.sub(vec2,i)) end fun diffIntSets(vec1,vec2) = let val (l1,l2) = (Vector.length vec1,Vector.length vec2) val vec1 = Vector.tabulate (l1,fn i => if i>=l2 then Vector.sub(vec1,i) else Vector.sub(vec1,i) && !!(Vector.sub(vec2,i))) in normalize vec1 end fun IntList2Set l = List.foldl addIntSet emptyIntSet l fun IntSet2List vec = let val size = Vector.length vec fun doOne (w,off,yet) = let fun doit (i,mask) = if i=wordSize then yet else if w&&mask=0w0 then doit(i+1,mask<<0wx1) else (off+i)::doit(i+1,mask<<0wx1) in doit(0,0wx1) end fun doAll i = if i>=size then nil else doOne(Vector.sub(vec,i),wordSize*i,(doAll (i+1))) in doAll 0 end fun compareIntSets (vec1,vec2:IntSet) = let val (l1,l2) = (Vector.length vec1,Vector.length vec2) val (l12,ifEq) = case Int.compare(l1,l2) of LESS => (l1,LESS) | order => (l2,order) fun doit i = if i>=l12 then ifEq else case W.compare(Vector.sub(vec1,i),Vector.sub(vec2,i)) of EQUAL => doit (i+1) | order => order in doit 0 end val intShift = case Int.precision of NONE => 0w0 | SOME x => Word.fromInt(Int.max(wordSize-x+1,0)) fun hashIntSet vec = case Vector.length vec of 0 => 0w0 | 1 => Word.fromInt(W.toInt(W.>>(Vector.sub(vec,0),intShift))) | l => Word.fromInt(W.toInt(W.>>(Vector.sub(vec,0)+Vector.sub(vec,l-1),intShift))) end (* stop of ../../Util/intSets.sml *) (* start of ../../Util/SymDict/intSetDict.sml *) structure KeyIntSet : Key = struct open IntSets UtilString type Key = IntSet val null = emptyIntSet val hash = hashIntSet val compare = compareIntSets val toString = (List2xString ("{",",","}") Int2String) o IntSet2List end structure IntSetDict = Dict (structure Key = KeyIntSet) structure IntSetSymTab = SymTable (structure Key = KeyIntSet) (* stop of ../../Util/SymDict/intSetDict.sml *) (* start of ../../Parser/Dfa/dfaPassThree.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaPassThree *) (* *) (* Depends on: *) (* DfaData *) (* DfaUtil *) (* IntSets *) (* IntSetDict *) (* ParseOptions *) (* *) (* Exceptions raised by functions in this structure: *) (* passThree : TooLarge *) (*--------------------------------------------------------------------------*) signature DfaPassThree = sig val passThree: bool -> (DfaBase.Follow * bool) vector -> DfaBase.Dfa end functor DfaPassThree (structure DfaOptions : DfaOptions) : DfaPassThree = struct open IntSets IntSetDict DfaBase DfaOptions DfaUtil (*--------------------------------------------------------------------*) (* do the subset construction. *) (*--------------------------------------------------------------------*) (* given an automaton (Q,q0,F,delta), the subset automaton is *) (* (Q',q0',F',delta') with: *) (* - Q' = 2^Q *) (* - q0'= {q0} *) (* - F' = {S | S cap F <> empty} *) (* - delta'(S,a) = {p | (q,a,p) in delta, q in S} *) (*--------------------------------------------------------------------*) fun makeDet tab = let (* the new start state is the singleton of the old start state *) val sNull = singleIntSet 0 (* create a dictionary for the subsets, make sNull get index 0 *) val tau = makeDict("",!O_DFA_INITIAL_WIDTH,(nil:Follow,false)) val pInitial = getIndex(tau,sNull) (* enter a new set state. raise DfaTooLarge if the new state *) (* would have a too large index *) fun makeState s = let val (max,i) = (!O_DFA_MAX_STATES,getIndex(tau,s)) in if max>i then i else raise DfaTooLarge max end (* compute the follow set for a set state from the follow sets *) (* of its members *) fun makeFollow NONE nil = nil | makeFollow (SOME(s,a)) nil = [(makeState s,a)] | makeFollow NONE ((q,a)::qas) = makeFollow (SOME(singleIntSet q,a)) qas | makeFollow (SOME(s,a)) ((q,b)::qas) = if a=b then makeFollow (SOME(addIntSet(q,s),a)) qas else (makeState s,a)::makeFollow (SOME(singleIntSet q,b)) qas (* continue until all entries in the state dictionary are done -*) fun doit i = if i>=usedIndices tau then i else let val sI = getKey(tau,i) val lI = IntSet2List sI val ffs = map (fn j => Vector.sub(tab,j)) lI val (followJs,finI) = foldl (fn ((flwJ,finJ),(flw,fin)) => (mergeFollow true (flwJ,flw), finJ orelse fin)) (nil,false) ffs val followI = makeFollow NONE followJs val _ = setByIndex(tau,i,(followI,finI)) in doit (i+1) end val size = doit 0 in (* finally create a vector holding the new follow/fin pairs *) Vector.tabulate (size,fn i => getByIndex(tau,i)) end (*--------------------------------------------------------------------*) (* given a vector of Follow and boolean final condition, make a dfa *) (* out of it. if the first arg is true, then the content model was *) (* ambiguous; in this case we must first apply a subset construction *) (* in order to obtain a deterministic finite machine. *) (*--------------------------------------------------------------------*) fun passThree nondet tab = let val det = if nondet then makeDet tab else tab in Vector.map makeRow det end end (* stop of ../../Parser/Dfa/dfaPassThree.sml *) (* start of ../../Parser/Dfa/dfaError.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaError *) (* *) (* Note: *) (* The function in this structure is for producing good error messages *) (* for ambiguous content models. It numbers the nodes of a cm exactly *) (* like passOne does, but counts the occurrences of symbol a in order to *) (* indicate which are in conflict. It is only executed in case of error. *) (* *) (* Depends on: *) (* DfaData *) (* *) (* Exceptions raised by functions in this structure: *) (* countOccs : none *) (*--------------------------------------------------------------------------*) signature DfaError = sig val countOccs : DfaBase.Sigma * DfaBase.State * DfaBase.State -> DfaBase.ContentModel -> DfaBase.Sigma * int * int end structure DfaError : DfaError = struct open DfaBase fun countOccs (a,q1,q2) cm = let val (q1,q2) = if q1>q2 then (q2,q1) else (q1,q2) fun next a nil = (1,[(a,2)]) | next a ((b,n)::rest) = if a=b then (n,(b,n+1)::rest) else if a insert a yet | CM_OPT cmi => doit (cmi,yet) | CM_REP cmi => doit (cmi,yet) | CM_PLUS cmi => doit (cmi,yet) | CM_ALT cmis => foldl doit yet cmis | CM_SEQ cmis => foldl doit yet cmis val (_,_,n1,n2) = doit (cm,(1,nil,0,0)) in (a,n1,n2) end end (* stop of ../../Parser/Dfa/dfaError.sml *) (* start of ../../Parser/Dfa/dfaPassOne.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaPassOne *) (* *) (* Depends on: *) (* DfaData *) (* DfaUtil *) (* *) (* Exceptions raised by functions in this structure: *) (* passOne : ConflictFirst *) (*--------------------------------------------------------------------------*) signature DfaPassOne = sig val passOne : bool -> DfaBase.ContentModel -> DfaBase.CM end structure DfaPassOne : DfaPassOne = struct open DfaBase DfaUtil (*--------------------------------------------------------------------*) (* Given a content model, number the leafs, compute Empty and First *) (* for each node, and construct a corresponding CM annotated with *) (* these informations. *) (* *) (* Numbering: *) (* The leafs are numbered in left-to-right, depth-first order, *) (* starting with 1 (0 will be the start state of the DFA). *) (* *) (* Empty a = false *) (* Empty e? = Empty e* = true *) (* Empty e+ = Empty e *) (* Empty e1|...|eN = Empty e1 \/ ... \/ Empty eN *) (* Empty e1,...,eN = Empty e1 /\ ... /\ Empty eN *) (* *) (* First a = {q,a}, where q is the number of this leaf. *) (* First e? = First e* = First e+ = First e *) (* First e1|...|eN = First e1 ++ ... ++ First eN *) (* First e1,...,eN = ++{First eI | Empty eJ=False forall ja1 forall (q1,a1) in F1, (q1,a1) in F1} *) (* error, if exist (q1,a) in F1, (q2,a) in F2 *) (* then raise ConflictFirst(a,q1,q2) *) (*--------------------------------------------------------------------*) fun passOne nondet cm = let fun und(a,b) = a andalso b fun oder(a,b) = a orelse b fun op_fst_seq (fst,fsts,mt) = if mt then mergeFirst nondet (fst,fsts) else fst fun op_fst_or (fst,fsts,_) = mergeFirst nondet (fst,fsts) fun do_cm cm q = case cm of CM_ELEM a => (ELEM a,(q+1,false,[(q+1,a)])) | CM_OPT cm => let val cmi as (_,(q1,_,fst)) = do_cm cm q in (OPT cmi,(q1,true,fst)) end | CM_REP cm => let val cmi as (_,(q1,_,fst)) = do_cm cm q in (REP cmi,(q1,true,fst)) end | CM_PLUS cm => let val cmi as (_,info1) = do_cm cm q in (PLUS cmi,info1) end | CM_ALT cms => do_cms (ALT,false,oder,op_fst_or) cms q | CM_SEQ cms => do_cms (SEQ,true,und,op_fst_seq) cms q and do_cms(con,null_mt,op_mt,op_fst) cms q = let fun doit [] q = ([],(q,null_mt,[])) | doit (cm::cms) q = let val cmi as (_,(q1,mt1,fst1)) = do_cm cm q val (cmis,(q2,mt2,fst2)) = doit cms q1 in (cmi::cmis,(q2,op_mt(mt1,mt2),op_fst(fst1,fst2,mt1))) end val (cmis,info1) = doit cms q in (con cmis,info1) end in do_cm cm 0 end end (* stop of ../../Parser/Dfa/dfaPassOne.sml *) (* start of ../../Parser/Dfa/dfaPassTwo.sml *) (*--------------------------------------------------------------------------*) (* Structure: DfaPassTwo *) (* *) (* Depends on: *) (* DfaData *) (* DfaUtil *) (* *) (* Exceptions raised by functions in this structure: *) (* passTwo : ConflictFollow *) (*--------------------------------------------------------------------------*) signature DfaPassTwo = sig val passTwo: bool -> DfaBase.CM -> (DfaBase.Follow * bool) vector end structure DfaPassTwo : DfaPassTwo = struct open DfaBase DfaUtil (*--------------------------------------------------------------------*) (* Given a CM annotated with leaf numbers (states), Empty and First, *) (* compute Follow and Fin foreach node, and generate the transition *) (* row if node is a leaf. Follow and Fin are computed top-down: *) (* *) (* (Top-Level): *) (* Follow e = {}, Fin e = true *) (* *) (* (e=e1?): *) (* Follow e1 = Follow e, Fin e1 = Fin e *) (* *) (* (e=e1*, e=e1+) *) (* Follow e1 = Follow e1 ++ First e1, Fin e1 = Fin e *) (* *) (* (e=e1|...|eN) = *) (* Follow eI = Follow e, Fin eI = Fin e for i=0...n *) (* *) (* (e=e1,...,eN) = *) (* Follow eN = Follow e, Fin eN = Fin e *) (* Follow eI = First eI+1, if Empty eI+1 = false, ia1 forall (q1,a1) in F1, (q1,a1) in F1} *) (* error, if exist (q1,a) in F1, (q2,a) in F2 *) (* then raise ConflictFirst(a,q1,q2) *) (*--------------------------------------------------------------------*) fun passTwo nondet (cmi as (_,(n,mt,fst))) = let val table = Array.array(n+1,(nil,false)) val _ = Array.update(table,0,(fst,mt)) fun do_cm (ff as (flw,fin)) (cm,(q,mt,fst)) = case cm of ELEM a => Array.update(table,q,ff) | OPT cmi => do_cm ff cmi | REP cmi => do_cm (mergeFollow nondet (fst,flw),fin) cmi | PLUS cmi => do_cm (mergeFollow nondet (fst,flw),fin) cmi | ALT cmis => app (do_cm ff) cmis | SEQ cmis => ignore (do_seq ff cmis) and do_seq ff cmis = foldr (fn (cmi as (_,(_,mt,fst)),ff as (flw,fin)) => (do_cm ff cmi; if mt then (mergeFollow nondet (fst,flw),fin) else (fst,false))) ff cmis val _ = do_cm (nil,true) cmi in Array.extract (table,0,NONE) end end (* stop of ../../Parser/Dfa/dfaPassTwo.sml *) (* start of ../../Parser/Dfa/dfa.sml *) (*--------------------------------------------------------------------------*) (* Structure: Dfa *) (* *) (* Depends on: *) (* DfaData *) (* DfaError *) (* DfaPassOne *) (* DfaPassTwo *) (* DfaString *) (* DfaUtil *) (* *) (* Exceptions raised by functions in this structure: *) (* ContentModel2String : none *) (* dfaFinal : none *) (* dfaTrans : none *) (* makeAmbiguous : DfaTooLarge *) (* makeChoiceDfa : none *) (* makeDfa : Ambiguous *) (* Dfa2String : none *) (*--------------------------------------------------------------------------*) signature Dfa = sig eqtype DfaState val dfaError : DfaState val dfaInitial : DfaState exception DfaTooLarge of int exception Ambiguous of int * int * int val emptyDfa : DfaData.Dfa val makeDfa : DfaData.ContentModel -> DfaData.Dfa val makeAmbiguous : DfaData.ContentModel -> DfaData.Dfa val makeChoiceDfa : DfaData.ContentModel -> DfaData.Dfa val dfaFinal : DfaData.Dfa * DfaState -> bool val dfaTrans : DfaData.Dfa * DfaState * int -> DfaState end functor Dfa (structure DfaOptions : DfaOptions) : Dfa = struct structure DfaPassThree = DfaPassThree (structure DfaOptions = DfaOptions) open DfaBase DfaError DfaPassOne DfaPassTwo DfaString DfaUtil type DfaState = State (*--------------------------------------------------------------------*) (* Create a dfa for the content model (a1|...|aN)*, where a1,...,aN *) (* are the symbols occurring in the input dfa. *) (*--------------------------------------------------------------------*) fun makeChoiceDfa cm = let val syms = cmSymbols cm val flw = map (fn a => (dfaInitial,a)) syms in Vector.fromList [makeRow(flw,true)] end (*--------------------------------------------------------------------*) (* create a dfa for an ambiguous content model. Raise DfaTooLarge if *) (* the subset construction yields too many states. *) (*--------------------------------------------------------------------*) fun makeAmbiguous cm = let val cmi = DfaPassOne.passOne true cm val tab = DfaPassTwo.passTwo true cmi val dfa = DfaPassThree.passThree true tab in dfa end (*--------------------------------------------------------------------*) (* generate a dfa for a content model. Raise Ambiguous if the content *) (* model is ambiguous. *) (*--------------------------------------------------------------------*) fun makeDfa cm = let val cmi = DfaPassOne.passOne false cm val tab = DfaPassTwo.passTwo false cmi val dfa = DfaPassThree.passThree false tab in dfa end handle ConflictFirst aqq => raise Ambiguous (countOccs aqq cm) | ConflictFollow aqq => raise Ambiguous (countOccs aqq cm) (*--------------------------------------------------------------------*) (* make one transitions in the dfa. *) (*--------------------------------------------------------------------*) fun dfaTrans(tab,q,a) = if q<0 then dfaDontCare else let val (lo,hi,tab,_) = Vector.sub(tab,q) in if a>=lo andalso a<=hi then Vector.sub(tab,a-lo) else dfaError end (*--------------------------------------------------------------------*) (* check whether a dfa's state is an accepting state. *) (*--------------------------------------------------------------------*) fun dfaFinal (tab,q) = q<0 orelse #4(Vector.sub(tab,q):Row) end (* stop of ../../Parser/Dfa/dfa.sml *) (* start of ../../Parser/entities.sml *) (*--------------------------------------------------------------------------*) (* Structure: Entities *) (* *) (* Exceptions raised by functions in this structure: *) (* closeAll : none *) (* getChar : none *) (* getEntId : none *) (* getPos : none *) (* inInternalSubset : none *) (* isOpenEntity : none *) (* isSpecialEnd : none *) (* Position2String : none *) (* pushDummy : none *) (* pushExtern : NoSuchFile *) (* pushIntern : none *) (* pushSpecial : NoSuchFile *) (* statePos : none *) (*--------------------------------------------------------------------------*) (* This module maintains the entity stack. For each open entity it holds a *) (* buffer to read characters from. When the buffer is exceeded, it gets re- *) (* filled with new characters, depending on the entity's encoding. *) (* *) (* End-of-line handling as specified in 2.11 is performed: *) (* *) (* ... To simplify the tasks of applications, wherever an external parsed *) (* entity or the literal entity value of an internal parsed entity *) (* contains either the literal two-character sequence "#xD#xA" or a *) (* standalone literal #xD, an XML processor must pass to the application *) (* the single character #xA. *) (* (This behavior can conveniently be produced by normalizing all line *) (* breaks to #xA on input, before parsing.) *) (* *) (* It also checks for illegal characters, cf. 2.2: *) (* *) (* [2] Char ::= #x9 | #xA | #xD /* any Unicode character, *) (* | [#x20-#xD7FF] excluding the surrogate *) (* | [#xE000-#xFFFD] blocks, FFFE, and FFFF. */ *) (* | [#x10000-#x10FFFF] *) (* *) (* More precisely, it assumes that all decoded characters are valid Unicode *) (* characters. It thus only checks for control characters other than #x9, *) (* #xA or #xD. *) (*--------------------------------------------------------------------------*) signature Entities = sig include Hooks type State eqtype EntId datatype Special = DOC_ENTITY | EXT_SUBSET exception CantOpenFile of (string * string) * AppData val pushIntern : State * int * bool * UniChar.Vector -> State val pushExtern : State * int * bool * Uri.Uri -> State * Encoding.Encoding val pushSpecial : Special * Uri.Uri option -> State * Encoding.Encoding val closeAll : State -> unit val commitAuto : AppData * State -> AppData * State val changeAuto : AppData * State * string -> AppData * State * Encoding.Encoding val getEntId : State -> EntId val getPos : State -> Errors.Position val getUri : State -> Uri.Uri val getChar : AppData * State -> UniChar.Char * AppData * State val ungetChars : State * UniChar.Data -> State val isOpen : int * bool * State -> bool val isSpecial : State -> bool val inDocEntity : State -> bool end functor Entities (structure Hooks : Hooks) : Entities = struct open UniChar Decode Decode.Error Errors Hooks Uri UtilError val THIS_MODULE = "Entities" val BUFSIZE = 1024 type CharBuffer = UniChar.Char array (*--------------------------------------------------------------------*) (* A special entity can not be popped from the stack by getChar, so *) (* it must be popped explicitly. This is for the document entity and *) (* the external subset. *) (*--------------------------------------------------------------------*) datatype Special = DOC_ENTITY | EXT_SUBSET (*--------------------------------------------------------------------*) (* In order to distinguish a general entity from a paramter entity, *) (* entity idxs are marked with this datatype. *) (*--------------------------------------------------------------------*) datatype EntId = GENERAL of int | PARAMETER of int (*--------------------------------------------------------------------*) (* Make an EntId from the entity's index. *) (*--------------------------------------------------------------------*) fun makeEntId(idx,isParam) = if isParam then PARAMETER idx else GENERAL idx (*--------------------------------------------------------------------*) (* A non-empty stack is: *) (* *) (* an internal entity INT(buf,size,idx,(id,other)): *) (* - (vec,idx,size) is a buffer,current index and its size; *) (* - id is the index of the entity's name in the entity table. *) (* - other contains the underlying entities (the rest of the stack). *) (* The components are nested according to access frequency. *) (* *) (* an external entity has three forms: *) (* EXT2(buf,size,idx,line,col,break,(dec,err,typ)) *) (* - (buf,size,idx) is a buffer, its size and current index; *) (* - (line,col) are the line and column; *) (* - break is a boolean indicating whether the last character was a *) (* carriage return (0xD) (then a succeeding line feed (0xA) must be *) (* supressed); *) (* - err is an option: if it is SOME(f,ee,err) then it indicates that *) (* the array was finished by a decoding error err, with the basic *) (* file f; f was at end of file if ee is true. Otherwise there was *) (* no error when loading the array. *) (* - dec describies the encoding of the entity and thus, how more *) (* data can be loaded; *) (* - typ is either of the form SPECIAL spec indicating a special *) (* entity; then this is the only entity on the stack. Otherwise it *) (* is NORMAL(id,other) for a normal external entity, with: *) (* + id is the index of the entity's name in the DTD; *) (* + other is the underlying stack. *) (* The components are nested according to access frequency. *) (* *) (* The second form of an external entity is *) (* EXT1(dec,line,col,break,typ). This is an unbuffered *) (* entity whose encoding declaration is being read. We may not load *) (* an array of characters as a whole because the encoding might still *) (* change. The components have the same meaning as for EXT2. *) (* *) (* A closed entity remains on the stack until the next getChar, for *) (* purposes of error printing. A closed external entity has the form *) (* CLOSED(dec,l,col,typ); components have the same meaning *) (* as for open external entities. A closed internal entity has the *) (* form ENDED(id,other) with components as above. *) (* *) (* Sometimes (for parsing xml/decl declarations) we need a lookahead. *) (* LOOKING(cs,q) is a state remembering all chars cs looked ahead up *) (* to state q, in reverse order. LOOKED(cs,q) is an undone lookahead, *) (* the looked-ahead chars now in the right order. *) (*--------------------------------------------------------------------*) datatype ExtType = SPECIAL of Special | NORMAL of EntId * State and State = LOOKED of Data * State | ENDED of EntId * State | CLOSED of DecFile * int * int * ExtType | INT of Vector * int * int * (EntId * State) | EXT1 of DecFile * int * int * bool * ExtType | EXT2 of CharBuffer * int * int * int * int * bool * (DecFile * DecodeError option * ExtType) exception CantOpenFile of (string * string) * AppData (*--------------------------------------------------------------------*) (* Extract the unique number from a state. *) (*--------------------------------------------------------------------*) fun getExtEntId extType = case extType of SPECIAL DOC_ENTITY => GENERAL 0 | SPECIAL EXT_SUBSET => PARAMETER 0 | NORMAL(id,_) => id fun getEntId q = case q of LOOKED (_,q) => getEntId q | ENDED(id,_) => id | CLOSED(_,_,_,extType) => getExtEntId extType | INT(_,_,_,(id,_)) => id | EXT1(_,_,_,_,extType) => getExtEntId extType | EXT2(_,_,_,_,_,_,(_,_,extType)) => getExtEntId extType (*--------------------------------------------------------------------*) (* Find the nearest enclosing external entity, and return its *) (* filename, line and column number. *) (*--------------------------------------------------------------------*) fun getPos q = case q of ENDED(_,other) => getPos other | INT(_,_,_,(_,other)) => getPos other | CLOSED(dec,l,col,_) => (decName dec,l,col) | EXT1(dec,l,col,_,_) => (decName dec,l,col) | EXT2(_,_,_,l,col,_,(dec,_,_)) => (decName dec,l,col) | LOOKED (cs,q) => let val (f,l,c) = getPos q val k = length cs in if c>=k then (f,l,c-k) else (f,l,0) end (*--------------------------------------------------------------------*) (* get the path of the nearest enclosing external entity. *) (*--------------------------------------------------------------------*) fun getUri q = case q of LOOKED (_,q) => getUri q | ENDED(_,other) => getUri other | INT(_,_,_,(_,other)) => getUri other | CLOSED(dec,l,col,_) => decUri dec | EXT1(dec,l,col,_,_) => decUri dec | EXT2(_,_,_,l,col,_,(dec,_,_)) => decUri dec (*--------------------------------------------------------------------*) (* close all files, return nothing. *) (*--------------------------------------------------------------------*) fun closeAll q = case q of LOOKED(_,other) => closeAll other | ENDED(_,other) => closeAll other | CLOSED(_,_,_,SPECIAL _) => () | CLOSED(_,_,_,NORMAL(_,other)) => closeAll other | INT(_,_,_,(_,other)) => closeAll other | EXT1(dec,_,_,_,SPECIAL _) => ignore(decClose dec) | EXT1(dec,_,_,_,NORMAL(_,other)) => (decClose dec; closeAll other) | EXT2(_,_,_,_,_,_,(dec,_,SPECIAL _)) => ignore(decClose dec) | EXT2(_,_,_,_,_,_,(dec,_,NORMAL(_,other))) => (decClose dec; closeAll other) (*--------------------------------------------------------------------*) (* is this entity already on the stack? *) (*--------------------------------------------------------------------*) fun isOpen (idx,isParam,q) = let val id = makeEntId(idx,isParam) fun doit q = case q of LOOKED (_,other) => doit other | ENDED(id',other) => id=id' orelse doit other | CLOSED(_,_,_,SPECIAL _) => false | CLOSED(_,_,_,NORMAL(id',other)) => id=id' orelse doit other | INT(_,_,_,(id',other)) => id=id' orelse doit other | EXT1(_,_,_,_,SPECIAL _) => false | EXT1(_,_,_,_,NORMAL(id',other)) => id=id' orelse doit other | EXT2(_,_,_,_,_,_,(_,_,SPECIAL _)) => false | EXT2(_,_,_,_,_,_,(_,_,NORMAL(id',other))) => id=id' orelse doit other in doit q end (*--------------------------------------------------------------------*) (* are we in the internal subset, i.e., in the document entity? *) (* The internal subset can only be in the document entity, since no *) (* parameter entities are declared prior to it. The document entity *) (* is then the only entity on the stack. *) (*--------------------------------------------------------------------*) fun inDocEntity q = case q of LOOKED (_,q) => inDocEntity q | ENDED(_,other) => inDocEntity other | INT(_,_,_,(_,other)) => inDocEntity other | CLOSED(_,_,_,NORMAL _) => false | CLOSED(_,_,_,SPECIAL what) => what=DOC_ENTITY | EXT1(_,_,_,_,NORMAL _) => false | EXT1(_,_,_,_,SPECIAL what) => what=DOC_ENTITY | EXT2(_,_,_,_,_,_,(_,_,NORMAL _)) => false | EXT2(_,_,_,_,_,_,(_,_,SPECIAL what)) => what=DOC_ENTITY (*--------------------------------------------------------------------*) (* is this state the document end, i.e., are all entities closed? *) (*--------------------------------------------------------------------*) fun isSpecial q = case q of LOOKED (_,q) => isSpecial q | CLOSED(_,_,_,SPECIAL _) => true | EXT1(_,_,_,_,SPECIAL _) => true | EXT2(_,_,_,_,_,_,(_,_,SPECIAL _)) => true | _ => false (*--------------------------------------------------------------------*) (* Initialize and load a new buffer when opening an external entity. *) (*--------------------------------------------------------------------*) fun initArray dec = let val arr = Array.array(BUFSIZE,0wx0) val (n,dec1,err) = decGetArray dec arr in (arr,n,dec1,err) end (*--------------------------------------------------------------------*) (* Open an external/internal entity. *) (*--------------------------------------------------------------------*) fun pushIntern(q,id,isParam,vec) = INT(vec,Vector.length vec,0,(makeEntId(id,isParam),q)) fun pushExtern(q,id,isParam,uri) = let val dec = decOpenXml (SOME uri) val auto = decEncoding dec val q1 = EXT1(dec,1,0,false,NORMAL(makeEntId(id,isParam),q)) in (q1,auto) end fun pushSpecial(what,uri) = let val dec = decOpenXml uri val auto = decEncoding dec val q = EXT1(dec,1,0,false,SPECIAL what) in (q,auto) end (*--------------------------------------------------------------------*) (* confirm the autodetected encoding of an external entity. *) (*--------------------------------------------------------------------*) fun commitAuto(a,q) = case q of EXT1(dec,l,col,brk,typ) => let val a1 = a before decCommit dec handle DecError(_,_,err) => hookError(a,(getPos q,ERR_DECODE_ERROR err)) val (arr,n,dec1,err) = initArray dec in (a1,EXT2(arr,n,0,l,col,brk,(dec1,err,typ))) end (* in (a1,EXT1(dec,l,col,brk,typ)) end *) | LOOKED(cs,q1) => let val (a1,q2) = commitAuto (a,q1) in (a1,LOOKED(cs,q2)) end | CLOSED _ => (a,q) | _ => raise InternalError(THIS_MODULE,"commitAuto", "entity is neither EXT1 nor CLOSED nor LOOKED") (*--------------------------------------------------------------------*) (* change from the autodetected encoding to the declared one. *) (*--------------------------------------------------------------------*) fun changeAuto (a,q,decl) = case q of EXT1(dec,l,col,brk,typ) => let val dec1 = decSwitch(dec,decl) handle DecError(dec,_,err) => let val a1 = hookError(a,(getPos q,ERR_DECODE_ERROR err)) val _ = decClose dec val uri = decName dec val msg = case err of ERR_UNSUPPORTED_ENC _ => "Unsupported encoding" | _ => "Declared encoding incompatible" ^"with auto-detected encoding" in raise CantOpenFile ((uri,msg),a1) end val newEnc = decEncoding dec1 val (arr,n,dec2,err) = initArray dec1 in (a,EXT2(arr,n,0,l,col,brk,(dec2,err,typ)),newEnc) end (* in (a,EXT1(dec1,l,col,brk,typ),newEnc) end *) | LOOKED(cs,q1) => let val (a2,q2,enc2) = changeAuto(a,q1,decl) in (a2,LOOKED(cs,q2),enc2) end | CLOSED(dec,_,_,_) => (a,q,decEncoding dec) | _ => raise InternalError(THIS_MODULE,"changeAuto", "entity is neither EXT1 nor CLOSED nor LOOKED") (*--------------------------------------------------------------------*) (* Get one character from the current entity. Possibly reload buffer. *) (* Return 0wx0 at entity end. Otherwise check whether the character *) (* is valid (cf. 2.2). If the last character was a carriage return *) (* (0xD) supress a line feed (0xA). *) (*--------------------------------------------------------------------*) fun getChar (a,q) = case q of ENDED(_,other) => getChar(a,other) | CLOSED(_,_,_,typ) => (case typ of SPECIAL _ => raise InternalError (THIS_MODULE,"getChar", "attempt to read beyond special entity end") | NORMAL(_,other) => getChar(a,other)) | INT(vec,s,i,io) => if i>=s then (0wx0,a,ENDED io) else (Vector.sub(vec,i),a,INT(vec,s,i+1,io)) | EXT1(dec,l,col,br,typ) => (let val (c,dec1) = decGetChar dec in if (* c>=0wx20 orelse c=0wx09 *) c>=0wx0020 andalso (c<=0wxD7FF orelse c>=0wxE000 andalso (c<=0wxFFFD orelse c>=0wx10000)) orelse c=0wx9 then (c,a,EXT1(dec1,l,col+1,false,typ)) else if c=0wxA then if br then getChar(a,EXT1(dec1,l,col,false,typ)) else (c,a,EXT1(dec1,l+1,0,false,typ)) else (if c=0wxD then (0wxA,a,EXT1(dec1,l+1,0,true,typ)) else let val a1 = hookError(a,(getPos q,ERR_NON_XML_CHAR c)) in getChar(a1,EXT1(dec1,l,col+1,false,typ)) end) end handle DecEof dec => (0wx0,a,CLOSED(dec,l,col,typ)) | DecError(dec,eof,err) => let val err = ERR_DECODE_ERROR err val a1 = hookError(a,(getPos q,err)) in if eof then (0wx0,a,CLOSED(dec,l,col,typ)) else getChar(a1,EXT1(dec,col,l,br,typ)) end) | EXT2(arr,s,i,l,col,br,det) => if i=0wx20 orelse c=0wx09 *) (* c>=0wx0020 andalso c<=0wxD7FF orelse c=0wx9 orelse *) (* c>=0wxE000 andalso c<=0wxFFFD orelse c>=0wx10000 *) c>=0wx0020 andalso (c<=0wxD7FF orelse c>=0wxE000 andalso (c<=0wxFFFD orelse c>=0wx10000)) orelse c=0wx9 then (c,a,EXT2(arr,s,i+1,l,col+1,false,det)) else if c=0wxA then if br then getChar(a,EXT2(arr,s,i+1,l,col,false,det)) else (c,a,EXT2(arr,s,i+1,l+1,0,false,det)) else (if c=0wxD then (0wxA,a,EXT2(arr,s,i+1,l+1,0,true,det)) else let val a1 = hookError(a,(getPos q,ERR_NON_XML_CHAR c)) in getChar(a1,EXT2(arr,s,i+1,l,col+1,false,det)) end) end else let val (dec,err,typ) = det val (a1,(n,dec1,err1)) = case err of NONE => if s=BUFSIZE then (a,decGetArray dec arr) else (a,(0,dec,NONE)) | SOME err => (hookError(a,(getPos q,ERR_DECODE_ERROR err)), decGetArray dec arr) in if n=0 andalso not (isSome err1) then (0wx0,a1,CLOSED(dec1,l,col,typ)) else getChar(a1,EXT2(arr,n,0,l,col,br,(dec1,err1,typ))) end | LOOKED(nil,q) => getChar(a,q) | LOOKED(c::cs,q) => (c,a,LOOKED(cs,q)) (*--------------------------------------------------------------------*) (* unget a list of characters. *) (*--------------------------------------------------------------------*) fun ungetChars (q,cs) = LOOKED(cs,q) end (* stop of ../../Parser/entities.sml *) (* start of ../../Parser/Dtd/dtdDeclare.sml *) (*--------------------------------------------------------------------------*) (* Structure: DtdDeclare *) (* *) (*--------------------------------------------------------------------------*) (* Functor: DtdDeclare *) (*--------------------------------------------------------------------------*) (* This module provides functions for adding declarations to the DTD tables *) (* and for doing checks on components of declarations. *) (*--------------------------------------------------------------------------*) functor DtdDeclare (structure Dtd : Dtd structure Entities : Entities structure ParserOptions : ParserOptions) = struct open UtilInt UtilList Base Dtd Errors Entities ParserOptions UniChar UniClasses (*--------------------------------------------------------------------*) (* check whether a sequence a chars is the b-adic representation of a *) (* character's code, terminated by ";". base will be 10 or 16, isBase *) (* will check for a character being a decimal/hexadecimal number. *) (*--------------------------------------------------------------------*) fun checkBasimal (base,baseValue) (ch:Char,cs) = let fun doit _ (nil:Data) = false | doit yet [0wx3B] = yet=ch | doit yet (c::cs) = case baseValue c of NONE => false | SOME v => doit (base*yet+v) cs in doit 0w0 cs end val checkDecimal = checkBasimal (0w10,decValue) val checkHeximal = checkBasimal (0wx10,hexValue) (*--------------------------------------------------------------------*) (* check a character reference for identifying a character. *) (*--------------------------------------------------------------------*) fun checkRef (ch,0wx26::0wx23::0wx78::cs) (* "&#x..." *) = checkHeximal(ch,cs) | checkRef (ch,0wx26::0wx23::cs) (* "&#..." *) = checkDecimal(ch,cs) | checkRef _ = false (*--------------------------------------------------------------------*) (* check for a single character ch. *) (*--------------------------------------------------------------------*) fun checkSingle (ch,[c]) = c=ch | checkSingle _ = false (*--------------------------------------------------------------------*) (* check a predefined entity for being well defined. Note that both *) (* a single char and a char ref representation are allowed, except *) (* for 'amp' which must be escaped. *) (*--------------------------------------------------------------------*) fun checkPredef (idx,cs) = case idx of 1 => checkRef(0wx26,cs) | 2 => checkSingle(0wx3C,cs) orelse checkRef(0wx3C,cs) | 3 => checkSingle(0wx3E,cs) orelse checkRef(0wx3E,cs) | 4 => checkSingle(0wx27,cs) orelse checkRef(0wx27,cs) | 5 => checkSingle(0wx22,cs) orelse checkRef(0wx22,cs) | _ => true (*--------------------------------------------------------------------*) (* Given the declaration of an entity check whether it is predefined. *) (* If no return false. If yes, check whether is was already declared *) (* and whether it is correctly declared. See 4.6: *) (* *) (* All XML processors must recognize these entities whether they *) (* are declared or not. For interoperability, valid XML documents *) (* should declare these entities, like any others, before using *) (* them. If the entities in question are declared, they must be *) (* declared as internal entities whose replacement text is the *) (* single character being escaped or a character reference to that *) (* character, as shown below. *) (* *) (* *) (* *) (* *) (* *) (* *) (* *) (* Note that the < and & characters in the declarations of "lt" and *) (* "amp" are doubly escaped to meet the requirement that entity *) (* replacement be well-formed. *) (* *) (* print an error if the entity was already declared. *) (* print an error if the declaration is not correct. *) (*--------------------------------------------------------------------*) fun checkPredefined dtd (a,q) (idx,ent) = if !O_VALIDATE andalso idx>=1 andalso idx<=5 then let val a1 = if !O_WARN_MULT_ENT_DECL andalso isRedefined dtd idx then let val warn = WARN_MULT_DECL(IT_GEN_ENT,Index2GenEnt dtd idx) in hookWarning(a,(getPos q,warn)) end else a before setRedefined dtd idx val a2 = if !O_CHECK_PREDEFINED then let val correct = case ent of GE_INTERN(_,rep) => checkPredef (idx,Vector2Data rep) | _ => false in if correct then a1 else let val err = ERR_DECL_PREDEF(Index2GenEnt dtd idx,validPredef idx) in hookError(a1,(getPos q,err)) end end else a1 in (true,a2) end else (false,a) (*--------------------------------------------------------------------*) (* add an entity declaration to the DTD tables. 4.2 *) (* *) (* ... If the same entity is declared more than once, the first *) (* declaration encountered is binding; at user option, an XML *) (* processor may issue a warning if entities are declared multiple *) (* times. *) (* *) (* For general entities, check whether it is a predefined entity and *) (* if so, whether it is declared correctly. *) (*--------------------------------------------------------------------*) (* print a warning and ignore the declaration if the notation was *) (* declared previously. *) (*--------------------------------------------------------------------*) fun addGenEnt dtd (a,q) (idx,ent,ext) = case getGenEnt dtd idx of (GE_NULL,_) => a before setGenEnt dtd (idx,(ent,ext)) | _ => let val (pre,a1) = checkPredefined dtd (a,q) (idx,ent) in if pre orelse not (!O_WARN_MULT_ENT_DECL) then a1 else hookWarning(a1,(getPos q,WARN_MULT_DECL (IT_GEN_ENT,Index2GenEnt dtd idx))) end fun addParEnt dtd (a,q) (idx,ent,ext) = case getParEnt dtd idx of (PE_NULL,_) => a before setParEnt dtd (idx,(ent,ext)) | _ => if !O_WARN_MULT_ENT_DECL then hookWarning(a,(getPos q,WARN_MULT_DECL (IT_PAR_ENT,Index2ParEnt dtd idx))) else a (*--------------------------------------------------------------------*) (* at option print a warning if not all predefined entities have been *) (* declared. Cf. 4.1: *) (* *) (* For interoperability, valid documents should declare the *) (* entities amp, lt, gt, apos, quot, in the form specified in *) (* "4.6 Predefined Entities". *) (*--------------------------------------------------------------------*) fun checkPreDefined dtd (a,q) = if !O_VALIDATE andalso !O_INTEROPERABILITY andalso !O_WARN_SHOULD_DECLARE andalso hasDtd dtd then case notRedefined dtd of nil => a | ents => hookWarning(a,(getPos q,WARN_SHOULD_DECLARE ents)) else a (*--------------------------------------------------------------------*) (* add a notation declaration to the DTD tables. *) (* *) (* though the rec. says nothing about repeated notation declarations, *) (* I assume that the intention is to treat them like entities, i.e. *) (* ignore repeated declarations with an optional warning. *) (* *) (* print a warning and ignore the declaration if the notation was *) (* declared previously. *) (*--------------------------------------------------------------------*) fun addNotation dtd (a,q) (idx,nt) = if hasNotation dtd idx then if !O_WARN_MULT_NOT_DECL then hookWarning(a,(getPos q,WARN_MULT_DECL (IT_NOTATION,Index2AttNot dtd idx))) else a else a before setNotation dtd (idx,nt) (*--------------------------------------------------------------------*) (* add an element declaration to the element table. Only the content *) (* part of the element info is updated. 3.2: *) (* *) (* Validity Constraint: Unique Element Type Declaration *) (* No element type may be declared more than once. *) (* *) (* print an error and ignore the declaration if the element was *) (* declared previously. *) (*--------------------------------------------------------------------*) fun addElement dtd (a,q) (idx,cont,ext) = let val {decl,atts,errAtts,...} = getElement dtd idx in case decl of NONE => a before setElement dtd (idx,{decl = SOME(cont,ext), atts = atts, errAtts = errAtts}) | SOME _ => if !O_VALIDATE then hookError(a,(getPos q,ERR_REDEC_ELEM(Index2Element dtd idx))) else a end (*--------------------------------------------------------------------*) (* at option, pretend an element is declared by adding a default *) (* declaration. Only the decl flag of the element info is updated. *) (*--------------------------------------------------------------------*) fun handleUndeclElement dtd idx = let val {atts,errAtts,...} = getElement dtd idx val newInfo = {decl = SOME(CT_ANY,false), atts = atts, errAtts = errAtts} in newInfo before setElement dtd (idx,newInfo) end (*--------------------------------------------------------------------*) (* check whether an element is declared and whether it already had an *) (* attribute list declaration. Cf. 3.3: *) (* *) (* At user option, an XML processor may issue a warning if *) (* attributes are declared for an element type not itself declared, *) (* but this is not an error. *) (* *) (* ... an XML processor may at user option issue a warning when *) (* more than one attribute-list declaration is provided for a given *) (* element type, ... *) (* *) (* print a warning if the element is not declared or already had an *) (* attribute list declaration. *) (*--------------------------------------------------------------------*) fun enterAttList dtd (a,q) idx = let val {decl,atts,errAtts,...} = getElement dtd idx val a1 = if isSome decl orelse not (!O_WARN_ATT_NO_ELEM) then a else hookWarning(a,(getPos q,WARN_ATT_UNDEC_ELEM(Index2Element dtd idx))) in case atts of NONE => a1 before setElement dtd (idx,{decl=decl,atts=SOME(nil,false),errAtts=errAtts}) | _ => if !O_INTEROPERABILITY andalso !O_WARN_MULT_ATT_DECL then hookWarning(a1,(getPos q,WARN_MULT_ATT_DECL(Index2Element dtd idx))) else a1 end (*--------------------------------------------------------------------*) (* check whether attribute "xml:space" is declared correctly. 2.10: *) (* *) (* A special attribute named xml:space may be attached ... In valid *) (* documents, this attribute, like any other, must be declared if *) (* it is used. When declared, it must be given as an enumerated *) (* type whose only possible values are "default" and "preserve". *) (*--------------------------------------------------------------------*) fun checkAttDef (a,q) (aidx,attType,_,_) = if aidx<>xmlSpaceIdx orelse attType=xmlSpaceType then a else hookError(a,(getPos q,ERR_XML_SPACE)) (*--------------------------------------------------------------------*) (* enter a definition of a single attribute to the element table. *) (* ignore the definition if the attribute is already defined for that *) (* element. Cf. 3.3: *) (* *) (* When more than one AttlistDecl is provided for a given element *) (* type, the contents of all those provided are merged. When more *) (* than one definition is provided for the same attribute of a *) (* given element type, the first declaration is binding and later *) (* declarations are ignored. For interoperability, an XML processor *) (* may at user option issue a warning when ... more than one *) (* attribute definition is provided for a given attribute, but this *) (* is not an error. *) (* *) (* If the attribute type is ID, check whether an element already has *) (* an attribute of that type. 3.3.1: *) (* *) (* Validity Constraint: One ID per Element Type *) (* No element type may have more than one ID attribute specified. *) (*--------------------------------------------------------------------*) (* print an error if the element already has an ID attribute. *) (* print a warning if the attr. is already defined for this element. *) (*--------------------------------------------------------------------*) (* return the new application data. *) (*--------------------------------------------------------------------*) fun addAttribute dtd (a,q) (eidx,attDef as (att,attType,attDefault,_)) = let val a1 = checkAttDef (a,q) attDef fun doit nil = (false,[attDef],a) | doit (atts as (ad as (aidx,_,_,_))::rest) = if aidx=att then let val a1 = if !O_INTEROPERABILITY andalso !O_WARN_MULT_ATT_DEF then let val warn = WARN_MULT_ATT_DEF (Index2Element dtd eidx,Index2AttNot dtd att) in hookWarning(a,(getPos q,warn)) end else a in (true,atts,a1) end else (if aidx (c1=0wx58 orelse c1=0wx78) andalso (c2=0wx4D orelse c2=0wx6D) andalso (c3=0wx4C orelse c3=0wx6C) | _ => false fun checkAttName (a,q) name = if !O_CHECK_RESERVED andalso startsWithXml name then case name of [0wx78,0wx6d,0wx6c,0wx3a,0wx6c,0wx61,0wx6e,0wx67] (* ":lang" *) => a | [0wx78,0wx6d,0wx6c,0wx3a,0wx73,0wx70,0wx61,0wx63,0wx65] (* ":space" *) => a | _ => hookError(a,(getPos q,ERR_RESERVED(name,IT_ATT_NAME))) else a fun checkElemName (a,q) name = if !O_CHECK_RESERVED andalso startsWithXml name then hookError(a,(getPos q,ERR_RESERVED(name,IT_ELEM))) else a (*--------------------------------------------------------------------*) (* check for each element in the dtd, whether a name token occurs *) (* more than once in its enumerated attribute types. *) (* *) (* print a warning for each element where this is true. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) fun checkMultEnum dtd (a,q) = if !O_INTEROPERABILITY andalso !O_WARN_MULT_ENUM then let fun doElem a idx = let (*-----------------------------------------------------*) (* for each i, add i to yet if it not in that list. *) (* otherwise add it to dup. *) (*-----------------------------------------------------*) fun do_list yd nil = yd | do_list (yet,dup) (i::is) = let val yd' = case insertNewInt (i,yet) of NONE => (yet,insertInt (i,dup)) | SOME new => (new,dup) in do_list yd' is end (*-----------------------------------------------------*) (* For each enumerated attribute type call the appro- *) (* priate function. *) (*-----------------------------------------------------*) fun doit (yet,dup) nil = dup | doit (yet,dup) ((_,attType,_,_)::rest) = case attType of AT_GROUP is => doit (do_list (yet,dup) is) rest | AT_NOTATION is => doit (do_list (yet,dup) is) rest | _ => doit (yet,dup) rest val defs = case #atts(getElement dtd idx) of NONE => nil | SOME(defs,_) => defs val dup = doit (nil,nil) defs in if null dup then a else hookWarning(a,(getPos q,WARN_ENUM_ATTS (Index2Element dtd idx,map (Index2AttNot dtd) dup))) end (*-----------------------------------------------------------*) (* the highest used index is usedIndices-1. *) (*-----------------------------------------------------------*) val maxIdx = maxUsedElem dtd fun doit a i = if i>maxIdx then a else doit (doElem a i) (i+1) in doit a 0 end else a (*--------------------------------------------------------------------*) (* check for all id names refereneced by some IDREF attribute whether *) (* it was also declared by an ID attribute. *) (* *) (* print an error if a referenced ID name was not defined. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) fun checkDefinedIds dtd (a,q) = if !O_VALIDATE then let val maxId = maxUsedId dtd fun doOne a i = let val (decl,refs) = getId dtd i in if decl orelse null refs then a else hookError(a,(hd refs,ERR_UNDECL_ID(Index2Id dtd i,tl refs))) end fun doAll a i = if i>maxId then a else doAll (doOne a i) (i+1) in doAll a 0 end else a (*--------------------------------------------------------------------*) (* check for all declared unparsed entities, whether their notations *) (* have been declared. *) (* *) (* print an error if a notation was not declared. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) fun checkUnparsed dtd a = if !O_VALIDATE then let val maxGen = maxUsedGen dtd fun doOne a i = case getGenEnt dtd i of (GE_UNPARSED(_,nidx,pos),_) => if hasNotation dtd nidx then a else hookError(a,(pos,ERR_UNDECLARED (IT_NOTATION,Index2AttNot dtd nidx,LOC_NONE))) | _ => a fun doAll a i = if i>maxGen then a else doAll (doOne a i) (i+1) in doAll a 0 end else a end (* stop of ../../Parser/Dtd/dtdDeclare.sml *) (* start of ../../Parser/Dtd/dtdAttributes.sml *) (*--------------------------------------------------------------------------*) (* Structure: DtdAttributes *) (* *) (* Exceptions raised by functions in this structure: *) (* checkAttValue : AttValue InternalError *) (* checkDefinedIds : none *) (* genMissingAtts : none *) (* makeAttValue : AttValue InternalError *) (*--------------------------------------------------------------------------*) functor DtdAttributes (structure Dtd : Dtd structure Entities : Entities structure ParserOptions : ParserOptions) = struct structure DtdDeclare = DtdDeclare (structure Dtd = Dtd structure Entities = Entities structure ParserOptions = ParserOptions) open UniChar UniClasses UtilList Base Dtd DtdDeclare Errors Entities HookData ParserOptions val THIS_MODULE = "DtdAttributes" exception AttValue of AppData (*--------------------------------------------------------------------*) (* this is the list of language codes in ISO 639. *) (*--------------------------------------------------------------------*) val iso639codes = Vector.fromList ["AA","AB","AF","AM","AR","AS","AY","AZ", "BA","BE","BG","BH","BI","BN","BO","BR", "CA","CO","CS","CY", "DA","DE","DZ", "EL","EN","EO","ES","ET","EU", "FA","FI","FJ","FO","FR","FY", "GA","GD","GL","GN","GU", "HA","HE","HI","HR","HU","HY", "IA","ID","IE","IK","IN","IS","IT","IU","IW", "JA","JI","JW", "KA","KK","KL","KM","KN","KO","KS","KU","KY", "LA","LN","LO","LT","LV", "MG","MI","MK","ML","MN","MO","MR","MS","MT","MY", "NA","NE","NL","NO", "OC","OM","OR", "PA","PL","PS","PT", "QU", "RM","RN","RO","RU","RW", "SA","SD","SG","SH","SI","SK","SL","SM","SN","SO","SQ","SR","SS","ST","SU","SV","SW", "TA","TE","TG","TH","TI","TK","TL","TN","TO","TR","TS","TT","TW", "UG","UK","UR","UZ", "VI","VO", "WO", "XH", "YI","YO", "ZA","ZH","ZU"] (*--------------------------------------------------------------------*) (* a two-dimensional field [0..25][0..25] of booleans for ISO 639. *) (*--------------------------------------------------------------------*) val iso639field = let val arr = Array.tabulate(26,fn _ => Array.array(26,false)) val _ = Vector.map (fn s => Array.update(Array.sub(arr,ord(String.sub(s,0))-65), ord(String.sub(s,1))-65, true)) iso639codes in Vector.tabulate(26,fn i => Array.extract (Array.sub(arr,i),0,NONE)) end (*--------------------------------------------------------------------*) (* for a letter, compute ord(toUpper c)-ord(#"A"), for subscripting. *) (*--------------------------------------------------------------------*) val toUpperMask = Chars.notb(0wx20) fun cIndex c = Chars.toInt(Chars.andb(c,toUpperMask)-0wx41) (*--------------------------------------------------------------------*) (* are these two letters an ISO 639 code? *) (*--------------------------------------------------------------------*) fun isIso639 (c1,c2) = if !O_CHECK_ISO639 then Vector.sub(Vector.sub(iso639field,cIndex c1),cIndex c2) handle Subscript => false else isAsciiLetter c1 andalso isAsciiLetter c2 (*--------------------------------------------------------------------*) (* does this match Subcode ('-' Subcode)* ? *) (* is this a sequence of ('-' Subcode) ? *) (* Iana codes and user codes also end on ([a-z] | [A-Z])+ *) (*--------------------------------------------------------------------*) fun isSubcode' nil = false | isSubcode' (c::cs) = let fun doit nil = true | doit (c::cs) = if c=0wx2D then isSubcode' cs else isAsciiLetter c andalso doit cs in isAsciiLetter c andalso doit cs end fun isSubcode nil = true | isSubcode (c::cs) = c=0wx2D andalso isSubcode' cs val isIanaUser = isSubcode' (*--------------------------------------------------------------------*) (* Check whether a "xml:lang" attribute matches the LanguageID *) (* production. 2.12: *) (* *) (* [33] LanguageID ::= Langcode ('-' Subcode)* *) (* [34] Langcode ::= ISO639Code | IanaCode | UserCode *) (* [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) *) (* [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ *) (* [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ *) (* [38] Subcode ::= ([a-z] | [A-Z])+ *) (* *) (* print an error and raise AttValue if the "xml:lang" attribute does *) (* not have a valid value. *) (*--------------------------------------------------------------------*) fun checkAttSpec (a,q) (aidx,cs) = if !O_CHECK_LANGID andalso aidx=xmlLangIdx then let val valid = case cs of c::0wx2D::cs' => (c=0wx49 orelse c=0wx69 orelse c=0wx58 orelse c=0wx78) andalso isIanaUser cs' | c1::c2::cs' => isIso639 (c1,c2) andalso isSubcode cs' | _ => false in if valid then a else raise AttValue(hookError(a,(getPos q,ERR_ATT_IS_NOT(cs,IT_LANG_ID)))) end else a (*--------------------------------------------------------------------*) (* Normalize an attribute value of type other than CDATA, and split *) (* it into tokens at space characters. Cf. 3.3.3: *) (* *) (* ... If the declared value is not CDATA, then the XML processor *) (* must further process the normalized attribute value by dis- *) (* carding any leading and trailing space (#x20) characters, and by *) (* replacing sequences of space (#x20) characters by a single space *) (* (#x20) character. *) (* *) (* replacement of references is already done when parsing the literal,*) (* thus we need only do whitespace normalization. we don't need to *) (* take care of the 3rd rule since replacement of sequences of #x20 *) (* and then splitting subsumes its effect. *) (* *) (* return the list of tokens as character lists and the normalized *) (* value as a char vector. *) (*--------------------------------------------------------------------*) fun splitAttValue av = let fun doOne nil = (nil,nil,nil) | doOne (c::cs) = if c=0wx20 then let val (toks,ys) = doAll true cs in (nil,toks,ys) end else let val (tok,toks,ys) = doOne cs in ((c::tok),toks,c::ys) end and doAll addS nil = (nil,nil) | doAll addS (c::cs) = if c=0wx20 then doAll addS cs else let val (tok,toks,ys) = doOne cs in ((c::tok)::toks, if addS then 0wx20::c::ys else c::ys) end val (tokens,normed) = doAll false av in (Data2Vector normed,tokens) end (*--------------------------------------------------------------------*) (* normalize an attribute value other than CDATA according to 3.3.3. *) (* *) (* return the normalized att value as a Vector. *) (*--------------------------------------------------------------------*) fun normAttValue av = let fun doOne nil = nil | doOne (c::cs) = if c=0wx20 then doAll true cs else c::doOne cs and doAll addS nil = nil | doAll addS (c::cs) = if c=0wx20 then doAll addS cs else let val ys = doOne cs in if addS then 0wx20::c::ys else c::ys end val normed = doAll false av in Data2Vector normed end (*--------------------------------------------------------------------*) (* Check whether a sequence of chars forms a name (token). *) (*--------------------------------------------------------------------*) fun isNmToken cs = List.all isName cs fun isaName nil = false | isaName (c::cs) = isNms c andalso List.all isName cs (*--------------------------------------------------------------------*) (* Check whether a list of tokens is a single what fulfilling isWhat. *) (* print an error and raise AttValue if it is not. *) (*--------------------------------------------------------------------*) fun checkOne (isWhat,what,detail) (a,q) toks = case toks of nil => raise AttValue (hookError(a,(getPos q,ERR_EXACTLY_ONE detail))) | [one] => if isWhat one then one else raise AttValue(hookError(a,(getPos q,ERR_ATT_IS_NOT(one,what)))) | more => raise AttValue(hookError(a,(getPos q,ERR_AT_MOST_ONE detail))) (*--------------------------------------------------------------------*) (* Check whether a list of tokens is non-empty and all elements ful- *) (* fil isWhat. *) (* print an error and raise AttValue if not. *) (*--------------------------------------------------------------------*) fun checkList (isWhat,what,detail) (a,q) toks = case toks of nil => raise AttValue (hookError(a,(getPos q,ERR_AT_LEAST_ONE detail))) | _ => app (fn one => if isWhat one then () else let val err = ERR_ATT_IS_NOT(one,what) in raise AttValue(hookError(a,(getPos q,err))) end) toks (*--------------------------------------------------------------------*) (* Convert a list of tokens into an ID att value. 3.3.1: *) (* *) (* Validity Constraint: ID *) (* Values of type ID must match the Name production. *) (* *) (* Validity Constraint: ID *) (* ... A name must not appear more than once in an XML document as *) (* a value of this type; i.e., ID values must uniquely identify the *) (* elements which bear them. *) (* *) (* mark the value as used, print an error and raise AttValue if it *) (* was already used. *) (* print an error and raise AttValue if it is not a name. *) (*--------------------------------------------------------------------*) fun takeId (dtd,inDtd) (a,q) toks = let val one = checkOne (isaName,IT_NAME,IT_ID_NAME) (a,q) toks val idx = Id2Index dtd one val _ = if inDtd then () else let val (decl,refs) = getId dtd idx in if decl then let val err = ERR_REPEATED_ID one in raise AttValue (hookError(a,(getPos q,err))) end else setId dtd (idx,(true,refs)) end in (SOME(AV_ID idx),a) end (*--------------------------------------------------------------------*) (* Convert a list of tokens into an IDREF/IDREFS att value. 3.3.1: *) (* *) (* Validity Constraint: IDREF *) (* Values of type IDREF must match the Name production. *) (* *) (* print an error an raise AttValue if it is not a (list of) name(s). *) (*--------------------------------------------------------------------*) fun setIdRef (dtd,q) idx = let val (decl,refs) = getId dtd idx in setId dtd (idx,(decl,getPos q::refs)) end fun takeIdref (dtd,_) (a,q) toks = let val one = checkOne (isaName,IT_NAME,IT_ID_NAME) (a,q) toks val idx=Id2Index dtd one val _ = setIdRef (dtd,q) idx in (SOME(AV_IDREF idx),a) end fun takeIdrefs (dtd,_) (a,q) toks = let val _ = checkList (isaName,IT_NAME,IT_ID_NAME) (a,q) toks val idxs = map (Id2Index dtd) toks val _ = app (setIdRef (dtd,q)) idxs in (SOME(AV_IDREFS idxs),a) end (*--------------------------------------------------------------------*) (* Convert a list of tokens into an ENTITY/IES att value. 3.3.1: *) (* *) (* Validity Constraint: Entity Name *) (* Values of type ENTITY must match the Name production... *) (* must match the name of an unparsed entity declared in the DTD. *) (* *) (* print an error and raise AttValue if a token is not a name. *) (* print an error and raise AttValue if an entity is undeclared or a *) (* parsed entity. *) (*--------------------------------------------------------------------*) fun checkEntity (dtd,inDtd) (a,q) name = let val idx = GenEnt2Index dtd name val (ent,_) = getGenEnt dtd idx val _ = if inDtd then () else case ent of GE_UNPARSED _ => () | GE_NULL => let val err = ERR_UNDECLARED(IT_GEN_ENT,name,LOC_NONE) in raise AttValue (hookError(a,(getPos q,err))) end | _ => let val err = ERR_MUST_BE_UNPARSED(name,LOC_NONE) in raise AttValue (hookError(a,(getPos q,err))) end in idx end fun takeEntity (dtd,inDtd) (aq as (a,_)) toks = let val one = checkOne (isaName,IT_NAME,IT_ENT_NAME) aq toks val idx = checkEntity (dtd,inDtd) aq one in (SOME(AV_ENTITY idx),a) end fun takeEntities (dtd,inDtd) (aq as (a,_)) toks = let val _ = checkList (isaName,IT_NAME,IT_ENT_NAME) aq toks val idxs = map (checkEntity (dtd,inDtd) aq) toks in (SOME(AV_ENTITIES idxs),a) end (*--------------------------------------------------------------------*) (* Convert a list of tokens into a NOTATION att value. 3.3.1: *) (* *) (* Validity Constraint: Notation Attributes *) (* Values of this type must match one of the notation names *) (* included in the declaration. *) (* *) (* print an error and raise AttValue if it is not a single name. *) (* print an error and raise AttValue if the notation's index is not *) (* in the list given as 1st arg. *) (*--------------------------------------------------------------------*) fun takeNotation is (dtd,inDtd) (aq as (a,q)) toks = let val one = checkOne (isaName,IT_NAME,IT_NOT_NAME) aq toks val idx = AttNot2Index dtd one val _ = if member idx is then () else let val nots = map (Index2AttNot dtd) is val err = ERR_MUST_BE_AMONG(IT_NOT_NAME,one,nots) in raise AttValue (hookError(a,(getPos q,err))) end in (SOME(AV_NOTATION(is,idx)),a) end (*--------------------------------------------------------------------*) (* Convert a list of tokens into an enumerated att value. 3.3.1: *) (* *) (* Validity Constraint: Enumeration *) (* Values of this type must match one of the Nmtoken tokens in *) (* the declaration. *) (* *) (* print an error and raise AttValue if it is not a single name token.*) (* print an error and raise AttValue if the token's index is not *) (* in the list given as 1st arg. *) (*--------------------------------------------------------------------*) fun takeGroup is (dtd,_) (aq as (a,q)) toks = let val one = checkOne (isNmToken,IT_NMTOKEN,IT_NMTOKEN) aq toks val idx = AttNot2Index dtd one val _ = if member idx is then () else let val toks = map (Index2AttNot dtd) is val err = ERR_MUST_BE_AMONG(IT_NMTOKEN,one,toks) in raise AttValue (hookError(a,(getPos q,err))) end in (SOME(AV_GROUP(is,idx)),a) end (*--------------------------------------------------------------------*) (* Given an attribute type and a list of characters, construct the *) (* corresponding AttValue. *) (* *) (* print an error (and possibly raise AttValue) if the attribute *) (* is ill-formed. *) (*--------------------------------------------------------------------*) fun makeAttValue dtd (a,q) (aidx,attType,ext,inDtd,cs) = if attType=AT_CDATA then let val cv = Data2Vector cs in if !O_VALIDATE andalso hasDtd dtd then (cv,(SOME(AV_CDATA cv),checkAttSpec (a,q) (aidx,cs))) else (cv,(NONE,a)) end else if !O_VALIDATE andalso hasDtd dtd then let val a1 = checkAttSpec (a,q) (aidx,cs) val (cv,toks) = splitAttValue cs val a2 = if ext andalso standsAlone dtd then let val cdata = Data2Vector cs in if cdata=cv then a1 else let val err = ERR_STANDALONE_NORM(Index2AttNot dtd aidx) val _ = setStandAlone dtd (not (!O_ERROR_MINIMIZE)) in hookError(a1,(getPos q,err)) end end else a1 in case attType of AT_NMTOKEN => (cv,(SOME(AV_NMTOKEN(checkOne(isNmToken,IT_NMTOKEN, IT_NMTOKEN) (a2,q) toks)),a2)) | AT_NMTOKENS => (cv,(SOME(AV_NMTOKENS toks),a2)) before checkList(isNmToken,IT_NMTOKEN,IT_NMTOKEN) (a2,q) toks | AT_ID => (cv,takeId (dtd,inDtd) (a2,q) toks) | AT_IDREF => (cv,takeIdref (dtd,inDtd) (a2,q) toks) | AT_IDREFS => (cv,takeIdrefs (dtd,inDtd) (a2,q) toks) | AT_ENTITY => (cv,takeEntity (dtd,inDtd) (a2,q) toks) | AT_ENTITIES => (cv,takeEntities (dtd,inDtd) (a2,q) toks) | AT_GROUP is => (cv,takeGroup is (dtd,inDtd) (a2,q) toks) | AT_NOTATION is => (cv,takeNotation is (dtd,inDtd) (a2,q) toks) | AT_CDATA => raise InternalError(THIS_MODULE,"makeAttValue", "AT_CDATA in the innermost case") end else (normAttValue cs,(NONE,a)) (*--------------------------------------------------------------------*) (* given an attribute value literal and the attribute type, generate *) (* the AttValue, and check whether it complies with its default value.*) (* If yes, make an AttPresent value out of it. *) (* See 3.3.2: *) (* *) (* Validity Constraint: Fixed Attribute Default *) (* If an attribute has a default value declared with the #FIXED *) (* keyword, instances of that attribute must match the default *) (* value. *) (* *) (* print an error and raise AttValue if the attribute value doesn't *) (* comply. *) (* *) (* return the value as a AttPresent value. *) (*--------------------------------------------------------------------*) fun checkAttValue dtd (a,q) ((aidx,attType,defVal,ext),literal,cs) = let val (cv,(av,a1)) = makeAttValue dtd (a,q) (aidx,attType,ext,false,cs) in if !O_VALIDATE andalso hasDtd dtd then case defVal of AD_FIXED((def,cv',_),_) => if cv=cv' then (AP_PRESENT(literal,cv,av),a1) else raise AttValue (hookError(a1,(getPos q,ERR_FIXED_VALUE(Index2AttNot dtd aidx,cv,cv')))) | _ => (AP_PRESENT(literal,cv,av),a1) else (AP_PRESENT(literal,cv,av),a1) end (*--------------------------------------------------------------------*) (* check a defaulted attribute value for validity. *) (* *) (* since the lexical constraints are checked when the default is *) (* declared we only need to check whether notations are declared and *) (* entities are declared and unparsed. An ID attribute cannot be *) (* defaulted, so no need to check for duplicate ID attributes. *) (*--------------------------------------------------------------------*) fun checkDefaultValue dtd (a,q,pos) av = let fun checkEntity (idx,a) = let val (ent,_) = getGenEnt dtd idx in case ent of GE_UNPARSED _ => a | GE_NULL => hookError(a,(getPos q,ERR_UNDECLARED (IT_GEN_ENT,Index2GenEnt dtd idx, LOC_ATT_DEFAULT pos))) | _ => hookError(a,(getPos q,ERR_MUST_BE_UNPARSED (Index2GenEnt dtd idx,LOC_ATT_DEFAULT pos))) end fun checkNotation (idx,a) = if hasNotation dtd idx then a else hookError(a,(getPos q,ERR_UNDECLARED (IT_NOTATION,Index2AttNot dtd idx,LOC_ATT_DEFAULT pos))) in case av of SOME(AV_ENTITY i) => checkEntity (i,a) | SOME(AV_ENTITIES is) => foldl checkEntity a is | SOME(AV_NOTATION(_,i)) => checkNotation(i,a) | _ => a end (*--------------------------------------------------------------------*) (* Generate the attributes not specified in a start-tag, the defs of *) (* these atts and the specified atts given as argument. 3.3.2: *) (* *) (* If the declaration is neither #REQUIRED nor #IMPLIED, then the *) (* AttValue value contains the declared default value; ... If a *) (* default value is declared, when an XML processor encounters an *) (* omitted attribute, it is to behave as though the attribute were *) (* present with the declared default value. *) (* *) (* Validity Constraint: Required Attribute *) (* If the default declaration is the keyword #REQUIRED, then the *) (* attribute must be specified for all elements of the type in the *) (* attribute-list declaration. *) (* *) (* print an error if a required attribute was omitted. *) (* *) (* return the AttSpecList of all attributes for this tag. *) (*--------------------------------------------------------------------*) fun genMissingAtts dtd (a,q) (defs,specd) = let fun default a (idx,(v as (_,_,av),(pos,checked)),ext) = let val a1 = if ext andalso !O_VALIDATE andalso standsAlone dtd then let val err = ERR_STANDALONE_DEF(Index2AttNot dtd idx) val _ = setStandAlone dtd (not (!O_ERROR_MINIMIZE)) in hookError(a,(getPos q,err)) end else a val a2 = if !O_VALIDATE andalso not (!checked andalso !O_ERROR_MINIMIZE) then checkDefaultValue dtd (a1,q,pos) av before checked := true else a1 in (AP_DEFAULT v,a1) end fun doit a nil = (specd,a) | doit a ((idx,_,dv,ext)::rest) = let val (value,a1) = case dv of AD_DEFAULT v => default a (idx,v,ext) | AD_FIXED v => default a (idx,v,ext) | AD_IMPLIED => (AP_IMPLIED,a) | AD_REQUIRED => let val a1 = if not (!O_VALIDATE) then a else hookError(a,(getPos q, ERR_MISSING_ATT(Index2AttNot dtd idx))) in (AP_MISSING,a1) end val (other,a2) = doit a1 rest in ((idx,value,NONE)::other,a2) end in doit a defs end (*--------------------------------------------------------------------*) (* process an undeclared attribute in a start-tag. *) (* At option, an error message is generated only once for the same *) (* attribute and element. *) (* *) (* possibly print an error. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) fun handleUndeclAtt dtd (a,q) (aidx,att,eidx,elem) = if !O_ERROR_MINIMIZE then let val {decl,atts,errAtts} = getElement dtd eidx in if member aidx errAtts then a else let val a1 = if !O_VALIDATE andalso hasDtd dtd then let val err = ERR_UNDECL_ATT(att,elem) in hookError(a,(getPos q,err)) end else a val a2 = checkAttName (a1,q) att val _ = setElement dtd (eidx,{decl = decl, atts = atts, errAtts = aidx::errAtts}) in a2 end end else let val a1 = if !O_VALIDATE andalso hasDtd dtd then hookError(a,(getPos q,ERR_UNDECL_ATT(att,elem))) else a in checkAttName (a1,q) att end end (* stop of ../../Parser/Dtd/dtdAttributes.sml *) (* start of ../../Parser/Dtd/dtdManager.sml *) (*--------------------------------------------------------------------------*) (* Structure: Dtd *) (* *) (* Depends on: *) (* UniChar *) (* DtdAttributes *) (* DtdElements *) (* DtdEntities *) (* DtdNotations *) (* DtdStandalone *) (* *) (* Exceptions raised by functions in this structure: *) (* initDtdTables : none *) (* AttIdx2String : NoSuchSymbol *) (* ElemIdx2String : NoSuchIndex *) (* GenEntIdx2String : NoSuchIndex *) (* IdIdx2String : NoSuchIndex *) (* NotIdx2String : NoSuchIndex *) (* GenEntity2String : NoSuchIndex *) (* ElemInfo2String : NoSuchIndex NoSuchSymbol *) (* printGenEntTable : NoSuchIndex *) (* printElementTable : NoSuchIndex NoSuchSymbol *) (* printDtdTables : NoSuchIndex NoSuchSymbol *) (*--------------------------------------------------------------------------*) signature DtdManager = sig include Entities include Dtd exception AttValue of AppData val makeAttValue : Dtd -> AppData * State -> int * Base.AttType * bool * bool * UniChar.Data -> UniChar.Vector * (Base.AttValue option * AppData) val checkAttValue : Dtd -> AppData * State -> Base.AttDef * UniChar.Vector * UniChar.Data -> HookData.AttPresent * AppData val genMissingAtts : Dtd -> AppData * State -> Base.AttDefList * HookData.AttSpecList -> HookData.AttSpecList * AppData val handleUndeclAtt : Dtd -> AppData * State -> int * UniChar.Data * int * UniChar.Data -> AppData val handleUndeclElement : Dtd -> int -> Base.ElemInfo val checkAttName : AppData * State -> UniChar.Data -> AppData val checkElemName : AppData * State -> UniChar.Data -> AppData val checkDefinedIds : Dtd -> AppData * State -> AppData val checkMultEnum : Dtd -> AppData * State -> AppData val checkPreDefined : Dtd -> AppData * State -> AppData val checkUnparsed : Dtd -> AppData -> AppData val enterAttList : Dtd -> AppData * State -> int -> AppData val addAttribute : Dtd -> AppData * State -> int * Base.AttDef -> AppData val addElement : Dtd -> AppData * State -> int * Base.ContentSpec * bool -> AppData val addGenEnt : Dtd -> AppData * State -> int * Base.GenEntity * bool -> AppData val addNotation : Dtd -> AppData * State -> int * Base.ExternalId -> AppData val addParEnt : Dtd -> AppData * State -> int * Base.ParEntity * bool -> AppData end functor DtdManager (structure Dtd : Dtd structure Hooks : Hooks structure ParserOptions : ParserOptions) : DtdManager = struct structure Entities = Entities (structure Hooks = Hooks) structure DtdAttributes = DtdAttributes (structure Dtd = Dtd structure Entities = Entities structure ParserOptions = ParserOptions) open Dtd DtdAttributes end (* stop of ../../Parser/Dtd/dtdManager.sml *) (* start of ../../Parser/Parse/parseBase.sml *) signature ParseBase = sig include Dfa DtdManager Resolve DfaOptions ParserOptions exception NoSuchChar of AppData * State exception NoSuchEntity of AppData * State exception NotFound of UniChar.Char * AppData * State exception SyntaxError of UniChar.Char * AppData * State val expectedOrEnded : Errors.Expected * Errors.Location -> UniChar.Char -> Errors.Error val recoverXml : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val recoverETag : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val recoverSTag : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val recoverDecl : bool -> UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val useParamEnts : unit -> bool end (*--------------------------------------------------------------------------*) (* Structure: ParseBase *) (*--------------------------------------------------------------------------*) (* This structure provides exceptions for the Parse functions, and strings *) (* for error generation (these strings don't really need to reside in their *) (* own structure, but like this the code is more easier to read). *) (*--------------------------------------------------------------------------*) functor ParseBase (structure Dtd : Dtd structure Hooks : Hooks structure Resolve : Resolve structure ParserOptions : ParserOptions) : ParseBase = struct structure DfaOptions = ParserOptions.DfaOptions structure Dfa = Dfa (structure DfaOptions = DfaOptions) structure DtdManager = DtdManager (structure Dtd = Dtd structure Hooks = Hooks structure ParserOptions = ParserOptions) open Base DtdManager DfaOptions Dfa Errors ParserOptions Resolve UniChar exception NoSuchChar of AppData * State exception NoSuchEntity of AppData * State exception NotFound of UniChar.Char * AppData * State exception SyntaxError of UniChar.Char * AppData * State fun expectedOrEnded (exp,ended) c = if c=0wx00 then ERR_ENDED_BY_EE ended else ERR_EXPECTED(exp,[c]) (*--------------------------------------------------------------------*) (* Besides "?>" also recognize ">" as end delimiter, because the typo *) (* might be an omitted "?". Also stop on "<"; then the entire "?>" *) (* was omitted; the "<" may not be consumed then. *) (* Within literals dont recognize ">" and "<", but only "?>"; then *) (* the typo is an omitted quote character. *) (*--------------------------------------------------------------------*) fun recoverXml caq = let fun do_lit ch (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx3F (* #"?" *) => let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then (c1,a1,q1) else do_lit ch (c1,a1,q1) end | _ => if c=ch then (getChar (a,q)) else do_lit ch (getChar (a,q)) fun doit (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx22 (* #""""*) => doit (do_lit c (getChar (a,q))) | 0wx25 (* #"%" *) => (c,a,q) | 0wx26 (* #"&" *) => (c,a,q) | 0wx27 (* #"'" *) => doit (do_lit c (getChar (a,q))) | 0wx3C (* #"<" *) => (c,a,q) | 0wx3E (* #">" *) => (getChar (a,q)) | _ => doit (getChar (a,q)) in doit caq end fun recoverETag caq = let fun do_lit ch (c,a,q) = case c of 0wx00 => (c,a,q) | _ => if c=ch then (getChar (a,q)) else do_lit ch (getChar (a,q)) fun doit (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx22 (* #""""*) => doit (do_lit c (getChar (a,q))) | 0wx26 (* #"&" *) => (c,a,q) | 0wx27 (* #"'" *) => doit (do_lit c (getChar (a,q))) | 0wx3E (* #">" *) => (getChar (a,q)) | 0wx3C (* #"<" *) => (c,a,q) | _ => doit (getChar (a,q)) in doit caq end fun recoverSTag caq = let fun do_lit ch (c,a,q) = case c of 0wx00 => (c,a,q) | _ => if c=ch then (getChar (a,q)) else do_lit ch (getChar (a,q)) fun doit (c,a,q) = case c of 0wx00 => (false,(c,a,q)) | 0wx22 (* #""""*) => doit (do_lit c (getChar (a,q))) | 0wx26 (* #"&" *) => (false,(c,a,q)) | 0wx27 (* #"'" *) => doit (do_lit c (getChar (a,q))) | 0wx2F (* #"/" *) => let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then (true,(c1,a1,q1)) else doit (c1,a1,q1) end | 0wx3E (* #">" *) => (false,getChar (a,q)) | 0wx3C (* #"<" *) => (false,(c,a,q)) | _ => doit (getChar (a,q)) in doit caq end fun recoverDecl hasSubset caq = let fun do_lit ch (c,a,q) = if c=0wx00 then (c,a,q) else if c=ch then getChar (a,q) else do_lit ch (getChar(a,q)) fun do_decl (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx22 (* #"\""*) => do_decl (do_lit c (getChar (a,q))) | 0wx27 (* #"'" *) => do_decl (do_lit c (getChar (a,q))) | 0wx3E (* #">" *) => getChar (a,q) | _ => do_decl (getChar (a,q)) fun do_subset (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx3C (* #"<" *) => do_subset (do_decl (getChar (a,q))) | 0wx5D (* #"]" *) => getChar (a,q) | _ => do_subset (getChar (a,q)) fun doit (c,a,q) = case c of 0wx00 => if isSpecial q then (c,a,q) else doit (getChar (a,q)) | 0wx22 (* #"\""*) => doit (do_lit c (getChar (a,q))) | 0wx25 (* #"%" *) => if hasSubset then (c,a,q) else doit (getChar (a,q)) | 0wx27 (* #"'" *) => doit (do_lit c (getChar (a,q))) | 0wx3C (* #"<" *) => (c,a,q) | 0wx3E (* #">" *) => getChar (a,q) | 0wx5B (* #"[" *) => if hasSubset then doit (do_subset (getChar (a,q))) else doit (getChar (a,q)) | _ => doit (getChar (a,q)) in doit caq end fun useParamEnts() = !O_VALIDATE orelse !O_INCLUDE_PARAM_ENTS end (* stop of ../../Parser/Parse/parseBase.sml *) (* start of ../../Parser/Parse/parseNames.sml *) signature ParseNames = sig include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNameLit : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseEntName : UniChar.Data * UniChar.Data -> UniChar.Char * AppData * State -> bool * UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseNames *) (* *) (* Exceptions raised by functions in this structure: *) (* parseEntName : none *) (* parseName : NotFound *) (* parseNmtoken : NotFound *) (*--------------------------------------------------------------------------*) functor ParseNames (structure ParseBase : ParseBase) : ParseNames = struct open Errors ParseBase UniClasses (*--------------------------------------------------------------------*) (* parse (the remainder of) a name or nmtoken. *) (* *) (* [5] Name ::= (Letter | '_' | ':') (NameChar)* *) (* *) (* raise NotFound if no name/name start character comes first. *) (* *) (* return the name as a list of characters, together with the next *) (* character and the remaining state. *) (*--------------------------------------------------------------------*) fun parseName' (c,a,q) = if isName c then let val (cs,caq1) = parseName'(getChar(a,q)) in (c::cs,caq1) end else (nil,(c,a,q)) fun parseName (c,a,q) = if isNms c then let val (cs,caq1) = parseName'(getChar(a,q)) in (c::cs,caq1) end else raise NotFound(c,a,q) fun parseNmtoken (c,a,q) = if isName c then let val (cs,caq1) = parseName'(getChar(a,q)) in (c::cs,caq1) end else raise NotFound(c,a,q) (*--------------------------------------------------------------------*) (* parse a name, additionally accumulating its characters in reverse *) (* order to the first argument. *) (* *) (* raise NotFound if no name/name start character comes first. *) (*--------------------------------------------------------------------*) fun parseNameLit cs (c,a,q) = let fun doit (cs,ns) (c,a,q) = if isName c then doit (c::cs,c::ns) (getChar(a,q)) else (cs,rev ns,(c,a,q)) in if isNms c then doit (c::cs,[c]) (getChar(a,q)) else raise NotFound(c,a,q) end (*--------------------------------------------------------------------*) (* parse a name, accumulating its reverse in the first arg text. This *) (* is useful for parsing of entity values, where entity references *) (* are parsed but bypassed, and must thus be accumulated together *) (* the other literal text. *) (* *) (* print an error if no name/name start character comes first. *) (* *) (* return a boolean indicating whether a name was found, the reverse *) (* name as a list of characters, concatenated with the text in the *) (* first arg, together with the next character and remaining state. *) (*--------------------------------------------------------------------*) fun parseEntName (lit,text) (c,a,q) = let fun doit (lit,text) (c,a,q) = if isName c then doit (c::lit,c::text) (getChar (a,q)) else (true,lit,text,(c,a,q)) in if isNms c then doit (c::lit,c::text) (getChar (a,q)) else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expAnEntName,[c]))) in (false,lit,text,(c,a1,q)) end end end (* stop of ../../Parser/Parse/parseNames.sml *) (* start of ../../Parser/Parse/parseMisc.sml *) signature ParseMisc = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNameLit : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseEntName : UniChar.Data * UniChar.Data -> UniChar.Char * AppData * State -> bool * UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseNames val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSopt : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseSmay : UniChar.Data -> UniChar.Char * AppData * State -> bool * (UniChar.Data * (UniChar.Char * AppData * State)) val skipEq : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseEq : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseMisc *) (* *) (* Exceptions raised by functions in this structure: *) (* skipS : none *) (* skipSopt : none *) (* skipSmay : none *) (* skipEq : SyntaxError *) (* skipComment : none *) (* parseComment : none *) (* parseProcInstr : none *) (*--------------------------------------------------------------------------*) functor ParseMisc (structure ParseBase : ParseBase) : ParseMisc = struct structure ParseNames = ParseNames (structure ParseBase = ParseBase) open UniChar Errors ParseNames (*--------------------------------------------------------------------*) (* parse a sequence of white space. 2.3: *) (* *) (* [3] S ::= (#x20 | #x9 | #xD | #xA)+ *) (*--------------------------------------------------------------------*) (* parse optional white space. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun skipSopt (c,a,q) = case c of 0wx09 => skipSopt (getChar (a,q)) | 0wx0A => skipSopt (getChar (a,q)) | 0wx20 => skipSopt (getChar (a,q)) | _ => (c,a,q) fun parseSopt cs (c,a,q) = case c of 0wx09 => parseSopt (c::cs) (getChar (a,q)) | 0wx0A => parseSopt (c::cs) (getChar (a,q)) | 0wx20 => parseSopt (c::cs) (getChar (a,q)) | _ => (cs,(c,a,q)) (*--------------------------------------------------------------------*) (* parse optional white space. *) (*--------------------------------------------------------------------*) (* Return type: bool * (Char * AppData * State) *) (* the bool indicates whether white space was found or not. *) (*--------------------------------------------------------------------*) fun skipSmay (c,a,q) = case c of 0wx09 => (true,skipSopt (getChar (a,q))) | 0wx0A => (true,skipSopt (getChar (a,q))) | 0wx20 => (true,skipSopt (getChar (a,q))) | _ => (false,(c,a,q)) fun parseSmay cs (c,a,q) = case c of 0wx09 => (true,parseSopt (c::cs) (getChar (a,q))) | 0wx0A => (true,parseSopt (c::cs) (getChar (a,q))) | 0wx20 => (true,parseSopt (c::cs) (getChar (a,q))) | _ => (false,(cs,(c,a,q))) (*--------------------------------------------------------------------*) (* parse required white space. *) (*--------------------------------------------------------------------*) (* print an error if no white space character is found. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun skipS (c,a,q) = case c of 0wx09 => skipSopt (getChar (a,q)) | 0wx0A => skipSopt (getChar (a,q)) | 0wx20 => skipSopt (getChar (a,q)) | _ => (c,hookError(a,(getPos q,ERR_MISSING_WHITE)),q) (*--------------------------------------------------------------------*) (* parse a "=" together with surrounding white space. Cf. 28: *) (* *) (* [25] Eq ::= S? '=' S? *) (*--------------------------------------------------------------------*) (* Raises: *) (* SyntaxError if no "=" is found. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun skipEq caq = let val (c1,a1,q1) = skipSopt caq in if c1=0wx3D then skipSopt (getChar (a1,q1)) else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expEq,[c1]))) in raise SyntaxError(c1,a2,q1) end end fun parseEq caq = let val (cs1,(c1,a1,q1)) = parseSopt nil caq in if c1=0wx3D then let val (cs2,caq2)= parseSopt (c1::cs1) (getChar (a1,q1)) in (rev cs2,caq2) end else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expEq,[c1]))) in raise SyntaxError(c1,a2,q1) end end (*--------------------------------------------------------------------*) (* parse a comment, the initial "<--" already consumed. cf. 2.5: *) (* *) (* They are not part of the document's character data; an XML *) (* processor may, but need not, make it possible for an application *) (* to retrieve the text of comments. For compatibility, the string *) (* "--" (double-hyphen) must not occur within comments. *) (* *) (* [15] Comment ::= '' *) (*--------------------------------------------------------------------*) (* print an error and end the comment if an entity end is found. *) (* print an error if the comment contains "--". *) (*--------------------------------------------------------------------*) (* add the comment to the user data. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun parseComment startPos aq = let fun check_end yet (a0,q0) = let val (c,a,q) = getChar (a0,q0) in if c=0wx2D (* #"-" *) then let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then let val cs = Data2Vector(rev yet) val a2 = hookComment(a1,((startPos,getPos q1),cs)) in getChar(a2,q1) end else let val a2 = if not (!O_COMPATIBILITY) then a1 else hookError(a1,(getPos q0,ERR_FORBIDDEN_HERE (IT_DATA [c,c],LOC_COMMENT))) in doit (c::c::yet) (c1,a2,q1) end end else doit (0wx2D::yet) (c,a,q) end and doit yet (c,a,q) = if c=0wx2D (* #"-" *) then check_end yet (a,q) else if c<>0wx00 then doit (c::yet) (getChar (a,q)) else let val err = ERR_ENDED_BY_EE LOC_COMMENT val a1 = hookError(a,(getPos q,err)) val cs = Data2Vector(rev yet) val a2 = hookComment(a1,((startPos,getPos q),cs)) in (c,a2,q) end in doit nil (getChar aq) end (*--------------------------------------------------------------------*) (* check whether a name matches "xml", disregarding case, cf. 2.6: *) (* *) (* [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) *) (* *) (* The target names "XML", "xml", and so on are reserved for *) (* standardization in this or future versions of this specification.*) (*--------------------------------------------------------------------*) (* print an error if it does match. *) (*--------------------------------------------------------------------*) (* Return type: AppData *) (*--------------------------------------------------------------------*) fun checkPiTarget (a,q) name = case name of [c1,c2,c3] => if ((c1=0wx58 orelse c1=0wx78) andalso (c2=0wx4D orelse c2=0wx6D) andalso (c3=0wx4C orelse c3=0wx6C)) then hookError(a,(getPos q,ERR_RESERVED(name,IT_TARGET))) else a | _ => a (*--------------------------------------------------------------------*) (* parse a processing instruction, the initial "' Char* )))? '?>'*) (* *) (* The first arg consists of the target and the (reversed) list of *) (* leading characters of the text that have been looked ahead. *) (*--------------------------------------------------------------------*) (* print an error and end the proc. instr. if an entity end is found. *) (*--------------------------------------------------------------------*) (* add the processing instruction to the user data. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun parseProcInstr' (startPos,target,txtPos,yetText) caq = let fun doit text (c1,a1,q1) = case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_PROC)) in (text,getPos q1,(c1,a2,q1)) end | 0wx3F => (* #"?" *) let val (c2,a2,q2) = getChar (a1,q1) in case c2 of 0wx3E => (* #">" *) (text,getPos q2,getChar(a2,q2)) | _ => doit (c1::text) (c2,a2,q2) end | _ => doit (c1::text) (getChar (a1,q1)) val (cs,endPos,(c2,a2,q2)) = doit yetText caq val text = Data2Vector(rev cs) val a3 = hookProcInst(a2,((startPos,endPos),target,txtPos,text)) in (c2,a3,q2) end (*--------------------------------------------------------------------*) (* parse a processing instruction, the initial "' Char* )))? '?>'*) (*--------------------------------------------------------------------*) (* print an error and end the proc. instr. if an entity end is found. *) (* print an error if no target name is found. *) (* print an error if no whitespace follows the target. *) (*--------------------------------------------------------------------*) (* add the processing instruction to the user data. *) (*--------------------------------------------------------------------*) (* Return type: Char * AppData * State *) (*--------------------------------------------------------------------*) fun parseProcInstr startPos (a,q) = let (* NotFound is handled after the 'in .. end' *) val (target,(c1,a1,q1)) = parseName (getChar(a,q)) val a1 = checkPiTarget (a1,q) target in case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_PROC)) val a3 = hookProcInst(a2,((startPos,getPos q1),target,getPos q1,nullVector)) in (c1,a3,q1) end | 0wx3F => (* #"?" *) let val (c2,a2,q2) = getChar (a1,q1) in case c2 of 0wx3E => (* #">" *) let val a3 = hookProcInst(a2,((startPos,getPos q2),target, getPos q1,nullVector)) in getChar (a3,q2) end | _ => let val a3 = hookError(a2,(getPos q1,ERR_MISSING_WHITE)) in parseProcInstr' (startPos,target,getPos q1,[c1]) (c2,a3,q2) end end | _ => let val (hadS,(c2,a2,q2)) = skipSmay (c1,a1,q1) val a3 = if hadS then a2 else hookError(a2,(getPos q2,ERR_MISSING_WHITE)) in parseProcInstr' (startPos,target,getPos q2,nil) (c2,a3,q2) end end handle NotFound(c,a,q) => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expATarget,[c]))) in parseProcInstr' (startPos,nullData,getPos q,nil) (c,a1,q) end end (* stop of ../../Parser/Parse/parseMisc.sml *) (* start of ../../Parser/Parse/parseXml.sml *) signature ParseXml = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNameLit : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseEntName : UniChar.Data * UniChar.Data -> UniChar.Char * AppData * State -> bool * UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSopt : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseSmay : UniChar.Data -> UniChar.Char * AppData * State -> bool * (UniChar.Data * (UniChar.Char * AppData * State)) val parseEq : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseMisc val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openExtern : int * bool * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseXml *) (* *) (* Exceptions raised by functions in this structure: *) (* openDocument : NoSuchFile *) (* openExtern : none *) (* openSubset : NoSuchFile *) (*--------------------------------------------------------------------------*) functor ParseXml (structure ParseBase : ParseBase) : ParseXml = struct structure ParseMisc = ParseMisc (structure ParseBase = ParseBase) open Errors UniChar UniClasses UtilString ParseMisc fun checkVersionNum (a,q) version = if not (!O_CHECK_VERSION) orelse version="1.0" then a else hookError(a,(getPos q,ERR_VERSION version)) (*--------------------------------------------------------------------*) (* parse a version number, the quote character ("'" or '"') passed as *) (* first argument. cf. 2.8: *) (* *) (* [24] VersionInfo ::= S 'version' Eq (' VersionNum ' *) (* | " VersionNum ") *) (* [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+ *) (* *) (* print an error and end the literal if an entity end is found. *) (* print an error if a disallowed character is found. *) (* *) (* return the version number as a string option, together with the *) (* next character and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseVersionNum quote aq = let fun doit text (c,a,q) = if c=quote then (text,getChar (a,q)) else if isVers c then doit (c::text) (getChar (a,q)) else if c=0wx0 then let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_VERSION)) in (text,(c,a1,q)) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR c,LOC_VERSION) val a1 = hookError(a,(getPos q,err)) in doit text (getChar (a1,q)) end val (c1,a1,q1) = getChar aq val (text,(c2,a2,q2)) = if isVers c1 then doit [c1] (getChar (a1,q1)) else if c1=quote then let val a2 = hookError(a1,(getPos q1,ERR_EMPTY LOC_VERSION)) in (nil,getChar (a2,q1)) end else if c1=0wx00 then let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_VERSION)) val a3 = hookError(a2,(getPos q1,ERR_EMPTY LOC_VERSION)) in (nil,(c1,a3,q1)) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR c1,LOC_VERSION) val a2 = hookError(a1,(getPos q1,err)) in doit nil (getChar (a2,q1)) end val version = Latin2String (rev text) val a3 = checkVersionNum (a2,q1) version in (SOME version,(c2,a3,q2)) end (*--------------------------------------------------------------------*) (* parse a version info starting after 'version'. Cf. 2.8: *) (* *) (* [24] VersionInfo ::= S 'version' Eq (' VersionNum ' *) (* | " VersionNum ") *) (* *) (* print an error and raise SyntaxState if no '=' is found. *) (* print an error and raise SyntaxState if no quote sign is found. *) (* *) (* return the version number as a string option, together with the *) (* next char and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseVersionInfo caq = let val (c1,a1,q1) = skipEq caq in case c1 of 0wx22 (* '""' *) => parseVersionNum c1 (a1,q1) | 0wx27 (* "'" *) => parseVersionNum c1 (a1,q1) | _ => let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expLitQuote,[c1]))) in raise SyntaxError(c1,a2,q1) end end (*--------------------------------------------------------------------*) (* parse an encoding name, the quote character ("'" or '"') passed as *) (* first argument. cf. 4.3.3: *) (* *) (* [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' *) (* |"'" EncName "'") *) (* *) (* [81] EncName ::= [A-Za-z] /* Encoding name *) (* ([A-Za-z0-9._] | '-')* contains only Latin *) (* characters */ *) (* *) (* print an error and end the literal if an entity end is found. *) (* print an error if a disallowed character is found. *) (* *) (* return the encoding name as a string option, together with the *) (* next character and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseEncName quote aq = let fun doit text (c,a,q) = if c=quote then (text,getChar (a,q)) else if isEnc c then doit (c::text) (getChar (a,q)) else if c=0wx00 then let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_ENCODING)) in (text,(c,a1,q)) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR c,LOC_ENCODING) val a1 = hookError(a,(getPos q,err)) in doit text (getChar (a,q)) end val (c1,a1,q1) = getChar aq val (text,caq2) = if isEncS c1 then doit [c1] (getChar (a1,q1)) else if c1=quote then let val a2 = hookError(a1,(getPos q1,ERR_EMPTY LOC_ENCODING)) in (nil,getChar (a2,q1)) end else if c1=0wx00 then let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_ENCODING)) val a3 = hookError(a2,(getPos q1,ERR_EMPTY LOC_ENCODING)) in (nil,(c1,a3,q1)) end else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expStartEnc,[c1]))) in doit nil (getChar (a2,q1)) end val enc = toUpperString (Latin2String (rev text)) in (enc,caq2) end (*--------------------------------------------------------------------*) (* parse an encoding decl starting after 'encoding'. Cf. 4.3.3: *) (* *) (* *) (* [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' *) (* |"'" EncName "'") *) (* *) (* print an error and raise SyntaxState if no '=' is found. *) (* print an error and raise SyntaxState if no quote sign is found. *) (* *) (* return the encoding name as a string option, together with the *) (* next char and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseEncodingDecl caq = let val (c1,a1,q1) = skipEq caq in case c1 of 0wx22 (* '""' *) => parseEncName c1 (a1,q1) | 0wx27 (* "'" *) => parseEncName c1 (a1,q1) | _ => let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expLitQuote,[c1]))) in raise SyntaxError(c1,a2,q1) end end (*--------------------------------------------------------------------*) (* parse a standalone declaration starting after 'standalone'. *) (* Cf. 2.9: *) (* *) (* [32] SDDecl ::= S 'standalone' Eq [ VC: Standalone *) (* ( ("'" ('yes' | 'no') "'") Document *) (* | ('"' ('yes' | 'no') '"')) Declaration ] *) (* *) (* print an error and raise SyntaxState if no '=' is found. *) (* print an error and raise SyntaxState if no literal is found. *) (* print an error and end the literal if an entity end is found. *) (* print an error if the literal is neither 'yes' nor 'no'. *) (* *) (* return the standalone status as a boolean option, together with *) (* the next character and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseStandaloneDecl caq0 = let val (quote,a,q) = skipEq caq0 fun doit text (c,a,q) = if c=quote then (text,getChar (a,q)) else if c<>0wx0 then doit (c::text) (getChar (a,q)) else let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_LITERAL)) in (text,(c,a1,q)) end val caq1 as (_,_,q1) = case quote of 0wx22 (* '""' *) => (getChar (a,q)) | 0wx27 (* "'" *) => (getChar (a,q)) | _ => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expLitQuote,[quote]))) in raise SyntaxError(quote,a1,q) end val (text,caq2) = doit nil caq1 in case text of [0wx73,0wx65,0wx79] (* reversed "yes" *) => (SOME true,caq2) | [0wx6f,0wx6e] (* reversed "no" *) => (SOME false,caq2) | revd => let val (c2,a2,q2) = caq2 val a3 = hookError(a2,(getPos q1,ERR_EXPECTED(expNoYes,revd))) in (NONE,(c2,a3,q2)) end end (*--------------------------------------------------------------------*) (* parse an xml declaration starting after 'xml ' (i.e. the first *) (* white space character is already consumed). Cf. 2.8: *) (* *) (* [23] XMLDecl ::= ''*) (* *) (* [24] VersionInfo ::= S 'version' Eq (' VersionNum ' *) (* | " VersionNum ") *) (* *) (* [32] SDDecl ::= S 'standalone' Eq [ VC: Standalone *) (* ( ("'" ('yes' | 'no') "'") Document *) (* | ('"' ('yes' | 'no') '"')) Declaration ] *) (* *) (* [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' *) (* |"'" EncName "'") *) (* *) (* default version, encoding and standalone status to NONE. *) (* *) (* print an error if no leading white space is found. *) (* print an error whenever a wrong name is encountered. *) (* print an Error if no VersionInfo is found. *) (* print an Error if no '?>' is found at the end. *) (* print an error and raise SyntaxState if no '=' or no literal is *) (* found in VersionInfo, EncodingDecl or SDDecl. *) (* print an error if a literal does not have a correct value. *) (* *) (* return the corresponding XmlDecl option and the next char & state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseXmlDecl auto caq = let (*-----------------------------------------------------------------*) (* skip the '?>' at the end of the xml declaration. *) (* *) (* print an error and raise SyntaxState if no '?>' is found. *) (* *) (* return the info passed as first arg, and the next char & state. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun skipXmlDeclEnd enc res (c,a,q) = if c=0wx3F (* "#?" *) then let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then (enc,SOME res,getChar (a1,q1)) else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expGt,[c1]))) in raise SyntaxError (c1,a2,q1) end end else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expProcEnd,[c]))) in raise SyntaxError (c,a1,q) end (*-----------------------------------------------------------------*) (* parse the remainder after the keyword 'standalone', the version *) (* and encoding already parsed and given in the first arg. *) (* *) (* pass the version,encoding and sd status to skipXmlDeclEnd *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseXmlDeclAfterS enc (v,e) caq = let val (alone,caq1) = parseStandaloneDecl caq val caq2 = skipSopt caq1 in skipXmlDeclEnd enc (v,e,alone) caq2 end (*-----------------------------------------------------------------*) (* parse the remainder after the encoding declaration, the version *) (* and encoding already parsed and given in the first arg. *) (* *) (* print an error if a name other than 'standalone' is found. *) (* *) (* pass the version and encoding to parseXmlDeclAfterS. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseXmlDeclBeforeS enc (v,e) caq = let val (hadS,caq1 as (_,_,q1)) = skipSmay caq val (name,(c2,a2,q2)) = parseName caq1 (* NotFound handled below *) val a3 = if hadS then a2 else hookError(a2,(getPos q1,ERR_MISSING_WHITE)) in case name of [0wx73,0wx74,0wx61,0wx6e,0wx64,0wx61,0wx6c,0wx6f,0wx6e,0wx65] => (* "standalone" *) parseXmlDeclAfterS enc (v,e) (c2,a3,q2) | _ => let val a4 = hookError(a3,(getPos q1,ERR_EXPECTED(expStandOpt,name))) in parseXmlDeclAfterS enc (v,e) (c2,a4,q2) end end handle NotFound caq => (* exception raised by parseName *) skipXmlDeclEnd enc (v,e,NONE) caq (*-----------------------------------------------------------------*) (* parse the remainder after the keyword 'encoding', the version *) (* already parsed and given in the first arg. *) (* *) (* pass the version and encoding and to parseXmlDeclBeforeS *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseXmlDeclAfterE ver caq = let val (enc,(c1,a1,q1)) = parseEncodingDecl caq val (a2,q2,enc1) = changeAuto(a1,q1,enc) in parseXmlDeclBeforeS enc1 (ver,SOME enc) (c1,a2,q2) end (*-----------------------------------------------------------------*) (* parse the remainder after the version info, the version already *) (* parsed and given in the first arg. *) (* *) (* print an error if a name other than 'encoding' or 'standalone' *) (* is found. *) (* *) (* pass obtained/default values to parseXmlDeclAfter[E|S] or to *) (* skipXmlDeclEnd. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseXmlDeclBeforeE ver caq = let val (hadS,caq1 as (_,_,q1)) = skipSmay caq val (name,(c2,a2,q2)) = parseName caq1 (* NotFound handled below *) val a3 = if hadS then a2 else hookError(a2,(getPos q1,ERR_MISSING_WHITE)) in case name of [0wx65,0wx6e,0wx63,0wx6f,0wx64,0wx69,0wx6e,0wx67] => (* "encoding" *) parseXmlDeclAfterE ver (c2,a3,q2) | [0wx73,0wx74,0wx61,0wx6e,0wx64,0wx61,0wx6c,0wx6f,0wx6e,0wx65] => (* "standalone" *) parseXmlDeclAfterS auto (ver,NONE) (c2,a3,q2) | _ => let val a4 = hookError(a3,(getPos q1,ERR_EXPECTED(expEncStand,name))) in parseXmlDeclAfterE ver (c2,a4,q2) end end handle NotFound caq => (* exception raised by parseName *) skipXmlDeclEnd auto (ver,NONE,NONE) caq (*-----------------------------------------------------------------*) (* do the main work. if the first name is not 'version' then it *) (* might be 'encoding' or 'standalone'. Then take the default *) (* NONE for version and - if needed - encoding and call the *) (* appropriate function. otherwise assume a typo and parse the *) (* version number, then call parseXmlDeclBeforeE. if no name is *) (* found at all, proceed with skipXmlDeclEnd. *) (* *) (* print an error and raise SyntaxState if an entity end is found. *) (* print an error and raise SyntaxState if appropriate. *) (* print an error if a name other than 'version' is found. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) val caq1 as (_,_,q1) = skipSopt caq val (name,(caq2 as (c2,a2,q2))) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expVersion,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end in if name=[0wx76,0wx65,0wx72,0wx73,0wx69,0wx6f,0wx6e] (* "version" *) then let val (ver,caq3) = parseVersionInfo caq2 in parseXmlDeclBeforeE ver caq3 end else let val a3 = hookError(a2,(getPos q1,ERR_EXPECTED(expVersion,name))) in case name of [0wx65,0wx6e,0wx63,0wx6f,0wx64,0wx69,0wx6e,0wx67] => (* "encoding" *) parseXmlDeclAfterE NONE (c2,a3,q2) | [0wx73,0wx74,0wx61,0wx6e,0wx64,0wx61,0wx6c,0wx6f,0wx6e,0wx65] => (* "standalone" *) parseXmlDeclAfterS auto (NONE,NONE) (c2,a3,q2) | _ => let val (ver,caq3) = parseVersionInfo (c2,a3,q2) in parseXmlDeclBeforeE ver caq3 end end end (*----------------------------------------------------------------*) (* catch entity end exceptions raised by subfunctions, print an *) (* error and re-raise the exception. *) (*----------------------------------------------------------------*) handle SyntaxError(c,a,q) => let val err = if c=0wx0 then ERR_ENDED_BY_EE LOC_XML_DECL else ERR_CANT_PARSE LOC_XML_DECL val a1 = hookError(a,(getPos q,err)) in (auto,NONE,recoverXml(c,a1,q)) end (*--------------------------------------------------------------------*) (* parse a text declaration starting after 'xml ' (i.e. the first *) (* white space character is already consumed). Cf. 2.8: *) (* *) (* [77] TextDecl ::= '' *) (* *) (* [24] VersionInfo ::= S 'version' Eq (' VersionNum ' *) (* | " VersionNum ") *) (* *) (* [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' *) (* |"'" EncName "'") *) (* *) (* default version and encoding to NONE. *) (* *) (* print an error if no leading white space is found. *) (* print an error whenever a wrong name is encountered. *) (* print an Error if no EncodingDecl is found. *) (* print an Error if '?>' is found at the end. *) (* print an error and raise SyntaxState if no '=' or no literal is *) (* found in VersionInfo or EncodingDecl. *) (* print an error if a literal does not have a correct value. *) (* *) (* return the corresponding TextDecl option and the next char & state.*) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseTextDecl auto caq = let (*-----------------------------------------------------------------*) (* skip the '?>' at the end of the text declaration. *) (* *) (* print an error and raise SyntaxState if no '?>' is found. *) (* *) (* return the info passed as first arg, and the next char & state. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun skipTextDeclEnd enc res (c,a,q) = if c=0wx3F (* "#?" *) then let val (c1,a1,q1) = getChar (a,q) in if c1=0wx3E (* #">" *) then (enc,SOME res,getChar (a1,q1)) else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expGt,[c1]))) in raise SyntaxError(c1,a2,q1) end end else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expProcEnd,[c]))) in raise SyntaxError(c,a1,q) end (*-----------------------------------------------------------------*) (* parse the remainder after the keyword 'encoding', the version *) (* already parsed and given in the first arg. *) (* *) (* pass the version and encoding and to skipTextDeclEnd. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseTextDeclAfterE ver caq = let val (enc,(c1,a1,q1)) = parseEncodingDecl caq val (a2,q2,enc1) = changeAuto(a1,q1,enc) val caq3 = skipSopt (c1,a2,q2) in skipTextDeclEnd enc1 (ver,SOME enc) caq3 end (*-----------------------------------------------------------------*) (* parse the remainder after the version info, the version given *) (* as first argument. *) (* *) (* print an error and raise SyntaxState is no name is found. *) (* print an error if a name other than 'encoding' is found. *) (* *) (* pass obtained/default values to parseTextDeclAfterE. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) fun parseTextDeclBeforeE ver caq = let val caq1 as (_,_,q1) = skipS caq val (name,caq2) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expEncoding,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end in if name=[0wx65,0wx6e,0wx63,0wx6f,0wx64,0wx69,0wx6e,0wx67] (* "encoding" *) then parseTextDeclAfterE ver caq2 else let val (c2,a2,q2) = caq2 val a3 = hookError(a2,(getPos q1,ERR_EXPECTED(expEncoding,name))) in parseTextDeclAfterE ver (c2,a3,q2) end end (*-----------------------------------------------------------------*) (* do the main work. if the first name is neither 'version' nor *) (* 'encoding' then assume typo of 'version'. Then parse the *) (* version number, call parseTextDeclBeforeE. if no name is found *) (* at all, proceed with skipTextDeclEnd. *) (* *) (* print an error and raise SyntaxState if appropriate. *) (* print an error if a name other than 'version' or 'encoding' is *) (* found. *) (*-----------------------------------------------------------------*) (* might raise: SyntaxState *) (*-----------------------------------------------------------------*) val caq1 as (_,_,q1) = skipSopt caq val (name,caq2) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expEncVers,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end in case name of [0wx76,0wx65,0wx72,0wx73,0wx69,0wx6f,0wx6e] => (* "version" *) let val (ver,caq3) = parseVersionInfo caq2 in parseTextDeclBeforeE ver caq3 end | [0wx65,0wx6e,0wx63,0wx6f,0wx64,0wx69,0wx6e,0wx67] => (* "encoding" *) parseTextDeclAfterE NONE caq2 | _ => let val (c2,a2,q2) = caq2 val a3 = hookError(a2,(getPos q1,ERR_EXPECTED(expEncVers,name))) val (ver,caq3) = parseVersionInfo (c2,a3,q2) in parseTextDeclBeforeE ver caq3 end end (*----------------------------------------------------------------*) (* catch entity end exceptions raised by subfunctions, print an *) (* error and re-raise the exception. *) (*----------------------------------------------------------------*) handle SyntaxError(c,a,q) => let val err = if c=0wx0 then ERR_ENDED_BY_EE LOC_TEXT_DECL else ERR_CANT_PARSE LOC_TEXT_DECL val a1 = hookError(a,(getPos q,err)) in (auto,NONE,recoverXml(c,a1,q)) end (*--------------------------------------------------------------------*) (* check for the string " if isS c1 then (true,(a1,q1)) else (false,(a1,ungetChars(q1,rev(c1::seen)))) | c::cs => if c1=c then doit (c1::seen,cs) (a1,q1) else (false,(a1,ungetChars(q1,rev(c1::seen)))) end in doit (nil,unseen) aq end (*--------------------------------------------------------------------*) (* consume the text/xml declaration. The first parameter is a pair of *) (* the function that parses the declaration and a boolean indicating *) (* whether a warning should we produced if the declaration is missing.*) (* The second parameter is a pair (seen,auto), where auto is the *) (* auto-detected encoding, and seen is SOME cs, if auto-detection *) (* found some initial characters cs of the string " raise CantOpenFile(fmsg,a) (*--------------------------------------------------------------------*) (* open the external subset; consume its text declaration if present. *) (* See 2.8: *) (* *) (* [30] extSubset ::= TextDecl? extSubsetDecl *) (* *) (* return the optional text declaration and the first char and state. *) (*--------------------------------------------------------------------*) (* might raise: NoSuchFile *) (*--------------------------------------------------------------------*) fun openSubset uri a = let val (q,auto) = pushSpecial (EXT_SUBSET,SOME uri) in findTextDecl (parseTextDecl,false) auto (a,q) end handle NoSuchFile fmsg => raise CantOpenFile(fmsg,a) (*--------------------------------------------------------------------*) (* open the document entity; consume its xml declaration if present. *) (* See 2.8: *) (* *) (* [1] document ::= prolog element Misc* *) (* [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc* )? *) (* *) (* return the optional xml declaration and the first char and state. *) (*--------------------------------------------------------------------*) (* might raise: NoSuchFile *) (*--------------------------------------------------------------------*) fun openDocument uri a = let val (q,auto) = pushSpecial (DOC_ENTITY,uri) in findTextDecl (parseXmlDecl,!O_WARN_XML_DECL) auto (a,q) end handle NoSuchFile fmsg => raise CantOpenFile(fmsg,a) end (* stop of ../../Parser/Parse/parseXml.sml *) (* start of ../../Parser/Parse/parseRefs.sml *) signature ParseRefs = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseEntName : UniChar.Data * UniChar.Data -> UniChar.Char * AppData * State -> bool * UniChar.Data * UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSopt : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseSmay : UniChar.Data -> UniChar.Char * AppData * State -> bool * (UniChar.Data * (UniChar.Char * AppData * State)) val parseEq : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseXml val parseCharRef : AppData * State -> UniChar.Char * AppData * State val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseParRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.ParEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseGenRefLit : Dtd -> UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * ((int * Base.GenEntity) * (AppData * State)) val parseParRefLit : Dtd -> UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * ((int * Base.ParEntity) * (AppData * State)) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val skipPS : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSopt : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSmay : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val skipPSdec : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseRefs *) (* *) (* Exceptions raised by functions in this structure: *) (* parseCharRef : NoSuchChar SyntaxError *) (* parseGenRef : NoSuchEntity SyntaxState *) (* parseParRef : NoSuchEntity SyntaxState *) (* skipCharRef : none *) (* skipPS : none *) (* skipPSdec : none *) (* skipPSmay : none *) (* skipPSopt : none *) (* skipReference : none *) (*--------------------------------------------------------------------------*) functor ParseRefs (structure ParseBase : ParseBase) : ParseRefs = struct structure ParseXml = ParseXml (structure ParseBase = ParseBase) open Base Errors UniClasses ParseXml (*--------------------------------------------------------------------*) (* parse a character reference, the "&#" already read. See 4.1: *) (* *) (* [66] CharRef ::= '&#' [0-9]+ ';' *) (* | '&#x' [0-9a-fA-F]+ ';' [ WFC: Legal Character ] *) (* *) (* Well-Formedness Constraint: Legal Character *) (* Characters referred to using character references must match the *) (* production for Char. *) (* *) (* If the character reference begins with "&#x", the digits and *) (* letters up to the terminating ; provide a hexadecimal *) (* representation of the character's code point in ISO/IEC 10646. *) (* If it begins just with "&#", the digits up to the terminating ; *) (* provide a decimal representation of the character's code point. *) (* *) (* raise SyntaxError if no number or x plus hexnum is found, or if no *) (* semicolon follows it. *) (* raise NoSuchChar if the reference is to a non-XML character. *) (* *) (* return the character referred to, and the remaining state. *) (*--------------------------------------------------------------------*) fun parseCharRef aq = let (*--------------------------------------------------------------*) (* parse a (hexa)decimal number, accumulating the value in the *) (* first parameter. *) (* *) (* return the numbers value as a Char. *) (*--------------------------------------------------------------*) fun do_hex_n yet (c,a,q) = case hexValue c of NONE => (yet,(c,a,q)) | SOME v => do_hex_n (0wx10*yet+v) (getChar (a,q)) fun do_dec_n yet (c,a,q) = case decValue c of NONE => (yet,(c,a,q)) | SOME v => do_dec_n (0wx0A*yet+v) (getChar (a,q)) (*--------------------------------------------------------------*) (* Parse a (hexa)decimal number of at least one digit. *) (* *) (* raise SyntaxError if no hexdigit is found first. *) (* *) (* return the numbers value as a Char. *) (*--------------------------------------------------------------*) fun do_hex_1 (c,a,q) = case hexValue c of SOME v => do_hex_n v (getChar (a,q)) | NONE => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expHexDigit,[c]))) in raise SyntaxError(c,a1,q) end (*--------------------------------------------------------------*) (* Parse a decimal number of at least one digit, or a hexnumber *) (* if the first character is 'x'. *) (* *) (* raise SyntaxError if neither 'x' nor digit is found first. *) (* *) (* return the number's value as a Char. *) (*--------------------------------------------------------------*) fun do_dec_1 (c,a,q) = case decValue c of SOME v => do_dec_n v (getChar (a,q)) | NONE => if c=0wx78 (* #"x" *) then do_hex_1 (getChar (a,q)) else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expDigitX,[c]))) in raise SyntaxError(c,a1,q) end val (ch,(c1,a1,q1)) = do_dec_1 (getChar aq) val _ = if c1=0wx3B then () else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expSemi,[c1]))) in raise SyntaxError(c1,a2,q1) end val _ = if isXml ch then () else let val a2 = hookError(a1,(getPos q1,ERR_NON_XML_CHARREF ch)) in raise NoSuchChar (a2,q1) end in (ch,a1,q1) end fun parseCharRefLit cs aq = let (*--------------------------------------------------------------*) (* parse a (hexa)decimal number, accumulating the value in the *) (* first parameter. *) (* *) (* return the numbers value as a Char. *) (*--------------------------------------------------------------*) fun do_hex_n (cs,yet) (c,a,q) = case hexValue c of NONE => (cs,yet,(c,a,q)) | SOME v => do_hex_n (c::cs,0wx10*yet+v) (getChar (a,q)) fun do_dec_n (cs,yet) (c,a,q) = case decValue c of NONE => (cs,yet,(c,a,q)) | SOME v => do_dec_n (c::cs,0wx0A*yet+v) (getChar (a,q)) (*--------------------------------------------------------------*) (* Parse a (hexa)decimal number of at least one digit. *) (* *) (* raise SyntaxError if no hexdigit is found first. *) (* *) (* return the numbers value as a Char. *) (*--------------------------------------------------------------*) fun do_hex_1 cs (c,a,q) = case hexValue c of SOME v => do_hex_n (c::cs,v) (getChar (a,q)) | NONE => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expHexDigit,[c]))) in raise SyntaxError(c,a1,q) end (*--------------------------------------------------------------*) (* Parse a decimal number of at least one digit, or a hexnumber *) (* if the first character is 'x'. *) (* *) (* raise SyntaxError if neither 'x' nor digit is found first. *) (* *) (* return the number's value as a Char. *) (*--------------------------------------------------------------*) fun do_dec_1 cs (c,a,q) = case decValue c of SOME v => do_dec_n (c::cs,v) (getChar (a,q)) | NONE => if c=0wx78 (* #"x" *) then do_hex_1 (c::cs) (getChar (a,q)) else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expDigitX,[c]))) in raise SyntaxError(c,a1,q) end val (cs1,ch,(c1,a1,q1)) = do_dec_1 cs (getChar aq) val _ = if c1=0wx3B then () else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expSemi,[c1]))) in raise SyntaxError(c1,a2,q1) end val _ = if isXml ch then () else let val a2 = hookError(a1,(getPos q1,ERR_NON_XML_CHARREF ch)) in raise NoSuchChar (a2,q1) end in (c1::cs1,(ch,a1,q1)) end (*--------------------------------------------------------------------*) (* parse a general entity reference, the "&" already read. See 4.1: *) (* *) (* [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] *) (* [ VC: Entity Declared ] *) (* [ WFC: Parsed Entity ] *) (* [ WFC: No Recursion ] *) (* *) (* Well-Formedness Constraint: Entity Declared *) (* In a document without any DTD, a document with only an internal *) (* DTD subset which contains no parameter entity references, or a *) (* document with "standalone='yes'", the Name given in the entity *) (* reference must match that in an entity declaration, ... *) (* ... the declaration of a general entity must precede any *) (* reference to it which appears in a default value in an *) (* attribute-list declaration. *) (* *) (* Validity Constraint: Entity Declared *) (* In a document with an external subset or external parameter *) (* entities with "standalone='no'", the Name given in the entity *) (* reference must match that in an entity declaration. ... *) (* ... the declaration of a general entity must precede any *) (* reference to it which appears in a default value in an *) (* attribute-list declaration. *) (* *) (* Thus: in both cases it is an error if the entity is not declared. *) (* The only difference is the impact on well-formednes/validity. *) (* *) (* There are three contexts in which a general entity reference can *) (* appear: in content, in attribute value, in entity value. This *) (* passage states that it need not be declared prior to a reference *) (* in an entity value. But in this context, it is bypassed and not *) (* included, i.e., it need not be recognized. *) (* *) (* Well-Formedness Constraint: Parsed Entity *) (* An entity reference must not contain the name of an unparsed *) (* entity. Unparsed entities may be referred to only in attribute *) (* values ... *) (* *) (* Well-Formedness Constraint: No Recursion *) (* A parsed entity must not contain a recursive reference to *) (* itself, either directly or indirectly. *) (* *) (* print an error and raise SyntaxState if no name is found, or if no *) (* semicolon follows it. *) (* print an error and return GE_NULL if the reference is to an *) (* undeclared, unparsed or open entity. *) (* *) (* return the entity referred to, and the remaining state. *) (*--------------------------------------------------------------------*) fun parseGenRef dtd (caq as (_,_,q)) = let val (name,(c1,a1,q1)) = parseName caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end val _ = if c1=0wx3B then () else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expSemi,[c1]))) in raise SyntaxError(c1,a2,q1) end val idx = GenEnt2Index dtd name val (ent,ext) = getGenEnt dtd idx val _ = (* check whether entity is undeclared/unparsed/open *) case ent of GE_NULL => if entitiesWellformed dtd then let val err = ERR_UNDEC_ENTITY(ENT_GENERAL,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else if useParamEnts() then let val err = ERR_UNDECLARED(IT_GEN_ENT,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () | GE_UNPARSED _ => let val err = ERR_ILLEGAL_ENTITY(ENT_UNPARSED,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end | _ => if isOpen(idx,false,q1) then let val err = ERR_RECURSIVE_ENTITY(ENT_GENERAL,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () val a2 = if ext andalso !O_VALIDATE andalso standsAlone dtd andalso inDocEntity q1 then let val _ = if !O_ERROR_MINIMIZE then setStandAlone dtd false else () in hookError(a1,(getPos q,ERR_STANDALONE_ENT(ENT_GENERAL,name))) end else a1 in ((idx,ent),(a2,q1)) end fun parseGenRefLit dtd cs (caq as (_,_,q)) = let val (cs1,name,(c1,a1,q1)) = parseNameLit cs caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end val _ = if c1=0wx3B then () else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expSemi,[c1]))) in raise SyntaxError(c1,a2,q1) end val idx = GenEnt2Index dtd name val (ent,ext) = getGenEnt dtd idx val _ = (* check whether entity is undeclared/unparsed/open *) case ent of GE_NULL => if entitiesWellformed dtd then let val err = ERR_UNDEC_ENTITY(ENT_GENERAL,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else if useParamEnts() then let val err = ERR_UNDECLARED(IT_GEN_ENT,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () | GE_UNPARSED _ => let val err = ERR_ILLEGAL_ENTITY(ENT_UNPARSED,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end | _ => if isOpen(idx,false,q1) then let val err = ERR_RECURSIVE_ENTITY(ENT_GENERAL,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () val a2 = if ext andalso !O_VALIDATE andalso standsAlone dtd andalso inDocEntity q1 then let val _ = if !O_ERROR_MINIMIZE then setStandAlone dtd false else () in hookError(a1,(getPos q,ERR_STANDALONE_ENT(ENT_GENERAL,name))) end else a1 in (c1::cs1,((idx,ent),(a2,q1))) end (*--------------------------------------------------------------------*) (* parse a parameter entity reference, the "%" already read. See 4.1: *) (* *) (* [69] PEReference ::= '%' Name ';' [ VC: Entity Declared ] *) (* [ WFC: No Recursion ] *) (* [ WFC: In DTD ] *) (* *) (* Well-Formedness Constraint: Entity Declared *) (* In a document without any DTD, a document with only an internal *) (* DTD subset which contains no parameter entity references, or a *) (* document with "standalone='yes'", the Name given in the entity *) (* reference must match that in an entity declaration, ... *) (* The declaration of a parameter entity must precede any reference *) (* to it... *) (* *) (* Validity Constraint: Entity Declared *) (* In a document with an external subset or external parameter *) (* entities with "standalone='no'", the Name given in the entity *) (* reference must match that in an entity declaration. ... *) (* The declaration of a parameter entity must precede any reference *) (* to it... *) (* *) (* Thus: in both cases it is an error if the entity is not declared. *) (* The only difference is the impact on well-formednes/validity. *) (* Because the thing to be parsed is a parameter entity reference, *) (* this DTD has references, and thus an undeclared entity is probably *) (* a validity and not a well-formedness error. Thus setExternal must *) (* be called before determining a possible error! *) (* *) (* Well-Formedness Constraint: No Recursion *) (* A parsed entity must not contain a recursive reference to *) (* itself, either directly or indirectly. *) (* *) (* print an error and raise SyntaxError if no name is found, or if no *) (* semicolon follows it. *) (* print an error and return PE_NULL if the reference is to an *) (* undeclared or open entity. *) (* *) (* return the entity referred to, and the remaining state. *) (*--------------------------------------------------------------------*) fun parseParRef dtd (caq as (_,_,q)) = let val (name,(c1,a1,q1)) = parseName caq handle NotFound(c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end val _ = if c1=0wx3B then () else let val err = ERR_EXPECTED(expSemi,[c1]) val a2 = hookError(a1,(getPos q1,err)) in raise SyntaxError(c1,a2,q1) end val _ = setExternal dtd; val idx = ParEnt2Index dtd name val (ent,ext) = getParEnt dtd idx val _ = (* check whether entity is declared *) case ent of PE_NULL => if entitiesWellformed dtd then let val err = ERR_UNDEC_ENTITY(ENT_PARAMETER,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else if useParamEnts() then let val err = ERR_UNDECLARED(IT_PAR_ENT,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () (* check whether the entity is already open *) | _ => if isOpen(idx,true,q1) then let val err = ERR_RECURSIVE_ENTITY(ENT_PARAMETER,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () in ((idx,ent),(a1,q1)) end fun parseParRefLit dtd cs (caq as (_,_,q)) = let val (cs1,name,(c1,a1,q1)) = parseNameLit cs caq handle NotFound(c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end val _ = if c1=0wx3B then () else let val err = ERR_EXPECTED(expSemi,[c1]) val a2 = hookError(a1,(getPos q1,err)) in raise SyntaxError(c1,a2,q1) end val _ = setExternal dtd; val idx = ParEnt2Index dtd name val (ent,ext) = getParEnt dtd idx val _ = (* check whether entity is declared *) case ent of PE_NULL => if entitiesWellformed dtd then let val err = ERR_UNDEC_ENTITY(ENT_PARAMETER,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else if useParamEnts() then let val err = ERR_UNDECLARED(IT_PAR_ENT,name,LOC_NONE) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () (* check whether the entity is already open *) | _ => if isOpen(idx,true,q1) then let val err = ERR_RECURSIVE_ENTITY(ENT_PARAMETER,name) val a2 = hookError(a1,(getPos q,err)) in raise NoSuchEntity (a2,q1) end else () in (c1::cs1,((idx,ent),(a1,q1))) end (*--------------------------------------------------------------------*) (* skip a general/parameter entity reference, the "&/%" already read. *) (* *) (* print an error if no name is found, or if no semicolon follows it. *) (* *) (* handle any SyntaxState by returning its char and state. *) (* *) (* return the remaining state. *) (*--------------------------------------------------------------------*) fun skipReference caq = let val (_,(c1,a1,q1)) = parseName caq in if c1=0wx3B then getChar (a1,q1) else let val err = ERR_EXPECTED(expSemi,[c1]) val a2 = hookError(a1,(getPos q1,err)) in (c1,a2,q1) end end handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAnEntName,[c]) val a1 = hookError(a,(getPos q,err)) in (c,a1,q) end (*--------------------------------------------------------------------*) (* skip a character reference, the "&#" already read. See 4.1: *) (* *) (* print an error if no number or x plus hexnum is found, or if no *) (* semicolon follows it. *) (* *) (* handle any SyntaxState by returning its char and state. *) (* *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) fun skipCharRef aq = let (*--------------------------------------------------------------*) (* skip a (hexa)decimal number. *) (*--------------------------------------------------------------*) fun skip_ximal isX (c,a,q) = if isX c then skip_ximal isX (getChar (a,q)) else (c,a,q) val (c1,a1,q1) = getChar aq val (c2,a2,q2) = if isDec c1 then skip_ximal isDec (getChar (a1,q1)) else if c1=0wx78 (* #"x" *) then let val (c2,a2,q2) = getChar (a1,q1) in if isHex c2 then skip_ximal isHex (getChar (a2,q2)) else let val err = ERR_EXPECTED(expHexDigit,[c2]) val a3 = hookError(a2,(getPos q2,err)) in raise SyntaxError(c2,a3,q2) end end else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expDigitX,[c1]))) in raise SyntaxError (c1,a2,q1) end in if c2=0wx3B then getChar (a2,q2) else (c2,hookError(a2,(getPos q2,ERR_EXPECTED(expSemi,[c2]))),q2) end handle SyntaxError caq => caq (*--------------------------------------------------------------------*) (* parse a sequence of white space in markup declarations. Cf. 2.3: *) (* *) (* [3] S ::= (#x20 | #x9 | #xD | #xA)+ *) (* *) (* and 2.8 states: *) (* *) (* The markup declarations may be made up in whole or in part of *) (* the replacement text of parameter entities. The productions *) (* later in this specification for individual nonterminals *) (* (elementdecl, AttlistDecl, and so on) describe the declarations *) (* after all the parameter entities have been included. *) (* *) (* in markup declarations, we thus have to include entity references *) (* and skip entity ends, except for the document end. *) (* *) (* Well-Formedness Constraint: PEs in Internal Subset *) (* In the internal DTD subset, parameter-entity references can *) (* occur only where markup declarations can occur, not within *) (* markup declarations. (This does not apply to references that *) (* occur in external parameter entities or to the external subset.) *) (* *) (* we therefore always check whether we are in the internal subset *) (* before including a parameter entity. *) (*--------------------------------------------------------------------*) (* handle a parameter entity reference *) (*--------------------------------------------------------------------*) fun doParRef dtd (caq as (c,a,q)) = if inDocEntity q then let val err = ERR_FORBIDDEN_HERE(IT_PAR_REF,LOC_INT_DECL) val a1 = hookError(a,(getPos q,err)) in skipReference (c,a1,q) end else let val ((id,ent),(a1,q1)) = parseParRef dtd caq in case ent of PE_NULL => getChar (a1,q1) | PE_INTERN (_,rep) => getChar(a1,(pushIntern(q1,id,true,rep))) | PE_EXTERN extId => #3(openExtern(id,true,resolveExtId extId) (a1,q1)) handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a1 = hookError(a,(getPos q1,err)) in (getChar(a1,q1)) end end handle SyntaxError caq => caq | NoSuchEntity aq => getChar aq (*--------------------------------------------------------------------*) (* parse optional white space. *) (* *) (* catch SyntaxState exceptions from parameter refs. *) (* *) (* print an error if a parameter entity reference or an entity end is *) (* found inside the internal subset. *) (* *) (* return the following character and the remaining state. *) (*--------------------------------------------------------------------*) fun skipPSopt dtd caq = let fun doit (c,a,q) = case c of 0wx00 => if isSpecial q then (c,a,q) else let val a1 = if !O_VALIDATE andalso inDocEntity q then hookError(a,(getPos q,ERR_EE_INT_SUBSET)) else a in doit (getChar (a1,q)) end | 0wx09 => doit (getChar (a,q)) | 0wx0A => doit (getChar (a,q)) | 0wx20 => doit (getChar (a,q)) | 0wx25 (* #"%" *) => doit (doParRef dtd (getChar (a,q))) | _ => (c,a,q) in doit caq end (*--------------------------------------------------------------------*) (* parse optional white space. *) (* *) (* catch SyntaxState exceptions from parameter refs. *) (* *) (* print an error if a parameter entity reference or an entity end is *) (* found inside the internal subset. *) (* *) (* return a boolean whether white space was actually found, and the *) (* following character with the remaining state. *) (*--------------------------------------------------------------------*) fun skipPSmay dtd (c,a,q) = case c of 0wx00 => if isSpecial q then (false,(c,a,q)) else let val a1 = if !O_VALIDATE andalso inDocEntity q then hookError(a,(getPos q,ERR_EE_INT_SUBSET)) else a in (true,skipPSopt dtd (getChar (a1,q))) end | 0wx09 => (true,skipPSopt dtd (getChar (a,q))) | 0wx0A => (true,skipPSopt dtd (getChar (a,q))) | 0wx20 => (true,skipPSopt dtd (getChar (a,q))) | 0wx25 (* #"%" *) => (true,skipPSopt dtd (doParRef dtd (getChar (a,q)))) | _ => (false,(c,a,q)) (*--------------------------------------------------------------------*) (* parse required white space. *) (* *) (* catch SyntaxState exceptions from parameter refs. *) (* *) (* print an error and return if no white space character is found. *) (* print an error if a parameter entity reference or an entity end is *) (* found inside the internal subset. *) (* *) (* return the following character and the remaining state. *) (*--------------------------------------------------------------------*) fun skipPS dtd (c,a,q) = case c of 0wx00 => if isSpecial q then (c,hookError(a,(getPos q,ERR_MISSING_WHITE)),q) else let val a1 = if !O_VALIDATE andalso inDocEntity q then hookError(a,(getPos q,ERR_EE_INT_SUBSET)) else a in skipPSopt dtd (getChar (a1,q)) end | 0wx09 => skipPSopt dtd (getChar (a,q)) | 0wx0A => skipPSopt dtd (getChar (a,q)) | 0wx20 => skipPSopt dtd (getChar (a,q)) | 0wx25 (* #"%" *) => skipPSopt dtd (doParRef dtd (getChar (a,q))) | _ => (c,hookError(a,(getPos q,ERR_MISSING_WHITE)),q) (*--------------------------------------------------------------------*) (* parse required white space, taking care of a single '%' character. *) (* this is only needed before the entity name in an entity decl. *) (* *) (* catch SyntaxState exceptions from parameter refs. *) (* *) (* print an error if no white space character is found. *) (* print an error if a parameter entity reference or an entity end is *) (* found inside the internal subset. *) (* *) (* return a boolean whether a '%' was found, the following character *) (* and the remaining state. *) (*--------------------------------------------------------------------*) fun skipPSdec dtd caq = let fun doit req (c,a,q) = case c of 0wx00 => if isSpecial q then (false,(c,a,q)) else let val a1 = if !O_VALIDATE andalso inDocEntity q then hookError(a,(getPos q,ERR_EE_INT_SUBSET)) else a in doit false (getChar (a1,q)) end | 0wx09 => doit false (getChar (a,q)) | 0wx0A => doit false (getChar (a,q)) | 0wx20 => doit false (getChar (a,q)) | 0wx25 => (* #"%" *) let val (c1,a1,q1) = getChar (a,q) in if isNms c1 then doit false (doParRef dtd (c1,a1,q1)) else let val a2 = if req then hookError(a1,(getPos q,ERR_MISSING_WHITE)) else a1 in (true,(c1,a2,q1)) end end | _ => let val a1 = if req then hookError(a,(getPos q,ERR_MISSING_WHITE)) else a in (false,(c,a1,q)) end in doit true caq end end (* stop of ../../Parser/Parse/parseRefs.sml *) (* start of ../../Parser/Parse/parseLiterals.sml *) signature ParseLiterals = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSopt : UniChar.Data -> UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseSmay : UniChar.Data -> UniChar.Char * AppData * State -> bool * (UniChar.Data * (UniChar.Char * AppData * State)) val parseEq : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseParRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.ParEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val skipPS : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSopt : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSmay : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val skipPSdec : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseRefs val parseSystemLiteral : UniChar.Char * AppData * State -> Uri.Uri * UniChar.Char * (UniChar.Char * AppData * State) val parsePubidLiteral : UniChar.Char * AppData * State -> string * UniChar.Char * (UniChar.Char * AppData * State) val parseAttValue : Dtd -> UniChar.Char * AppData * State -> UniChar.Vector * UniChar.Data * (UniChar.Char * AppData * State) val parseEntityValue : Dtd -> (UniChar.Vector * UniChar.Vector -> 'a) -> UniChar.Char * AppData * State -> 'a * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseLiterals *) (* *) (* Exceptions raised by functions in this structure: *) (* parseSystemLiteral : NotFound *) (* parsePubidLiteral : NotFound *) (* parseAttValue : NotFound *) (* parseEntityValue : NotFound *) (*--------------------------------------------------------------------------*) functor ParseLiterals (structure ParseBase : ParseBase) : ParseLiterals = struct structure ParseRefs = ParseRefs (structure ParseBase = ParseBase) open Base UniChar Errors UniClasses Uri ParseRefs val THIS_MODULE = "ParseLiterals" (*--------------------------------------------------------------------*) (* parse a system literal, the quote character ("'" or '"') already --*) (* read and passed as first argument. cf. 2.3: *) (* *) (* ... Note that a SystemLiteral can be parsed without scanning *) (* for markup. *) (* *) (* [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") *) (* *) (* print an error and end the literal if an entity end is found. *) (* *) (* return the literal as a string together with the next character *) (* and remaining state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseSystemLiteral' quote aq = let fun doit text (c,a,q) = if c=quote then (text,getChar (a,q)) else if c=0wx0 then let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_SYS_LIT)) in (text,(c,a1,q)) end else if c>0wx7F andalso !O_WARN_NON_ASCII_URI then let val a1 = hookWarning(a,(getPos q,WARN_NON_ASCII_URI c)) in doit (c::text) (getChar(a1,q)) end else doit (c::text) (getChar(a,q)) val (text,caq1) = doit nil (getChar aq) in (Data2Uri(rev text),quote,caq1) end (*--------------------------------------------------------------------*) (* parse a system literal. *) (* *) (* [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") *) (* *) (* raise NotFound if neither '"' nor "'" comes first. *) (* *) (* return the literal as a string together with the next character *) (* and remaining state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound *) (*--------------------------------------------------------------------*) fun parseSystemLiteral (c,a,q) = if c=0wx22 (* "'" *) orelse c=0wx27 (* '"' *) then parseSystemLiteral' c (a,q) else raise NotFound (c,a,q) (*--------------------------------------------------------------------*) (* parse a pubid literal, the quote character ("'" or '"') already ---*) (* read and passed as first argument. cf. 2.3: *) (* *) (* [12] PubidLiteral ::= '"' PubidChar* '"' *) (* | "'" (PubidChar - "'")* "'" *) (* *) (* print an error and end the literal if an entity end is found. *) (* print an error if a non-pubid character is found. *) (* *) (* return the literal as a string together with the next character *) (* and remaining state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parsePubidLiteral' quote aq = let fun doit (hadSpace,atStart,text) aq = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_PUB_LIT)) in (text,(c1,a2,q1)) end | 0wx0A => doit (true,atStart,text) (a1,q1) | 0wx20 => doit (true,atStart,text) (a1,q1) | _ => if c1=quote then (text,getChar (a1,q1)) else if not (isPubid c1) then let val err = ERR_FORBIDDEN_HERE(IT_CHAR c1,LOC_PUB_LIT) val a2 = hookError(a1,(getPos q1,err)) in doit (hadSpace,atStart,text) (a2,q1) end else if hadSpace andalso not atStart then doit (false,false,c1::0wx20::text) (a1,q1) else doit (false,false,c1::text) (a1,q1) end val (text,caq1) = doit (false,true,nil) aq in (Latin2String(rev text),quote,caq1) end (*--------------------------------------------------------------------*) (* parse a pubid literal. *) (* *) (* [12] PubidLiteral ::= '"' PubidChar* '"' *) (* | "'" (PubidChar - "'")* "'" *) (* *) (* raise NotFound if neither '"' nor "'" comes first. *) (* *) (* return the literal as a string together with the next character *) (* and remaining state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound *) (*--------------------------------------------------------------------*) fun parsePubidLiteral (c,a,q) = if c=0wx22 (* "'" *) orelse c=0wx27 (* '"' *) then parsePubidLiteral' c (a,q) else raise NotFound (c,a,q) (*--------------------------------------------------------------------*) (* parse an entity value and the quote character ("'" or '"') passed *) (* as first argument. Cf. 2.3: *) (* *) (* [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'*) (* | "'" ([^%&'] | PEReference | Reference)* "'"*) (* See also 4.4.5: *) (* *) (* When ... a parameter entity reference appears in a literal *) (* entity value, its replacement text is processed in place of the *) (* reference itself as though it were part of the document at the *) (* location the reference was recognized, except that a single or *) (* double quote character in the replacement text is always treated *) (* as a normal data character and will not terminate the literal. *) (* *) (* and 4.4.7: *) (* *) (* When a general entity reference appears in the EntityValue in an *) (* entity declaration, it is bypassed and left as is. *) (* *) (* A bypassed entity ref must, however, be checked for syntactic *) (* validity, as opposed to SGML, where it is not even recognized. *) (* *) (* print an error and end the literal if an entity end is found at *) (* the toplevel. *) (* print an error if a general entity reference is ill-formed. *) (* *) (* handle any errors in references by ignoring them syntactically. *) (* *) (* return argument con applied to the entity value as a char buffer, *) (* and the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseEntityValue' dtd (quote,con) aq = let fun doit (level,hadCr,lit,text) (c1,a1,q1) = case c1 of 0wx00 => if level=0 then let val err = ERR_ENDED_BY_EE LOC_ENT_VALUE val a2 = hookError(a1,(getPos q1,err)) in (lit,text,(c1,a2,q1)) end else doit (level-1,false,lit,text) (getChar (a1,q1)) | 0wx25 => (* #"%" *) let val (level1,lit1,caq2) = if inDocEntity q1 then let val err = ERR_FORBIDDEN_HERE(IT_PAR_REF,LOC_INT_DECL) val a2 = hookError(a1,(getPos q1,err)) in (level,lit,skipReference (getChar(a2,q1))) end else let val (lit1,((id,ent),(a2,q2))) = if level=0 then parseParRefLit dtd (c1::lit) (getChar(a1,q1)) else (lit,parseParRef dtd (getChar(a1,q1))) in case ent of PE_NULL => (level,lit1,getChar(a2,q2)) | PE_INTERN(_,rep) => let val q3 = pushIntern(q2,id,true,rep) in (level+1,lit1,getChar(a2,q3)) end | PE_EXTERN extId => let val fname = resolveExtId extId val caq3 = #3(openExtern (id,true,fname) (a2,q2)) in (level+1,lit1,caq3) end handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a1 = hookError(a,(getPos q1,err)) in (level,lit1,getChar(a1,q1)) end end (* ignore syntax errors in references *) handle SyntaxError caq => (level,lit,caq) | NoSuchEntity aq => (level,lit,getChar aq) in doit (level1,false,lit1,text) caq2 end | 0wx26 => (* #"&" *) let val (c2,a2,q2) = getChar (a1,q1) in (if c2=0wx23 (* #"#" *) (*--------------------------------------------------*) (* it's a character reference. *) (*--------------------------------------------------*) then (if level=0 then let val (lit3,(ch,a3,q3)) = parseCharRefLit (c2::c1::lit) (a2,q2) in doit (level,false,lit3,ch::text) (getChar(a3,q3)) end else let val (ch,a3,q3) = parseCharRef (a2,q2) in doit (level,false,lit,ch::text) (getChar(a3,q3)) end) (* ignore errors in char references *) handle SyntaxError caq => doit (level,false,lit,text) caq | NoSuchChar aq => doit (level,false,lit,text) (getChar aq) (*-----------------------------------------------------*) (* it's a general entity reference. *) (*-----------------------------------------------------*) else let val (fnd,lit3,text3,(c3,a3,q3)) = parseEntName (c1::lit,c1::text) (c2,a2,q2) val (lit4,text4,caq4) = if not fnd then (lit,text,(c3,a3,q3)) else if c3=0wx3B (* #";" *) then (c3::lit3,c3::text3,(getChar(a3,q3))) else let val err = ERR_EXPECTED(expSemi,[c3]) val a4 = hookError(a3,(getPos q3,err)) in (lit,text,(c3,a4,q3)) end in doit (level,false,lit4,text4) caq4 end ) end | 0wx0A => doit (level,false,if level=0 then c1::lit else lit, if hadCr then text else c1::text) (getChar (a1,q1)) | 0wx0D => doit (level,true,if level=0 then c1::lit else lit,0wx0A::text) (getChar (a1,q1)) | _ => if c1=quote andalso level=0 then (lit,text,getChar(a1,q1)) else doit (level,false,if level=0 then c1::lit else lit,c1::text) (getChar (a1,q1)) val (lit,text,caq1) = doit (0,false,nil,nil) (getChar aq) val literal = Data2Vector(quote::rev(quote::lit)) val repText = Data2Vector(rev text) in (con(literal,repText),caq1) end (*--------------------------------------------------------------------*) (* parse an entity value. *) (* *) (* [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'*) (* | "'" ([^%&'] | PEReference | Reference)* "'"*) (* *) (* raise NotFound if neither '"' nor "'" comes first. *) (* *) (* return the entity value as a char buffer, and the remaining char *) (* and state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound *) (*--------------------------------------------------------------------*) fun parseEntityValue dtd con (c,a,q) = if c=0wx22 (* "'" *) orelse c=0wx27 (* '"' *) then parseEntityValue' dtd (c,con) (a,q) else raise NotFound (c,a,q) (*--------------------------------------------------------------------*) (* parse and normalize an attribute value, consume the final quote *) (* character ("'" or '""') passed in the argument. Cf. 2.3: *) (* *) (* [10] AttValue ::= '"' ([^<&""] | Reference)* '"' *) (* | "'" ([^<&'] | Reference)* "'" *) (* See also 4.4.5: *) (* *) (* When an entity reference appears in an attribute value ..., *) (* its replacement text is processed in place of the reference *) (* itself as though it were part of the document at the location *) (* the reference was recognized, except that a single or double *) (* quote character in the replacement text is always treated as a *) (* normal data character and will not terminate the literal. *) (* *) (* and 3.3.3: *) (* *) (* Before the value of an attribute is passed to the application *) (* or checked for validity, the XML processor must normalize it as *) (* follows: *) (* *) (* * a character reference is processed by appending the referenced *) (* character to the attribute value *) (* * an entity reference is processed by recursively processing the *) (* replacement text of the entity *) (* * a whitespace character (#x20, #xD, #xA, #x9) is processed by *) (* appending #x20 to the normalized value, except that only a *) (* single #x20 is appended for a "#xD#xA" sequence that is part *) (* of an external parsed entity or the literal entity value of *) (* an internal parsed entity *) (* * other characters are processed by appending them to the *) (* normalized value *) (* *) (* since #xD#xA are normalized by the parseEntityValue (internal) and *) (* getChar (external entities), we don't need to care about that. *) (*--------------------------------------------------------------------*) (* print an error and end the literal if an entity end is found. *) (* print an error if a general entity reference is ill-formed. *) (* print an error if a reference to an external or unparsed entity is *) (* found. *) (* print an error if character '<' appears literally. *) (* *) (* handle any errors in references by ignoring them syntactically. *) (* raise NotFound if neither '"' nor "'" comes first. *) (* *) (* return the list of chars in the value, and the next char and state *) (*--------------------------------------------------------------------*) (* might raise: NotFound *) (*--------------------------------------------------------------------*) fun parseAttValue dtd (quote,a,q) = let fun doit (lhlt as (level,lit,text)) (c1,a1,q1) = case c1 of 0wx00 => if level=0 then let val err = ERR_ENDED_BY_EE LOC_ATT_VALUE val a2 = hookError(a1,(getPos q1,err)) in (lit,text,(c1,a2,q1)) end else doit (level-1,lit,text) (getChar (a1,q1)) | 0wx26 => (* #"&" *) let val (c2,a2,q2) = getChar (a1,q1) val ((level1,lit1,text1),caq3) = (if c2=0wx23 (* #"#" *) (*--------------------------------------------------*) (* it's a character reference. *) (*--------------------------------------------------*) then if level=0 then let val (lit3,(ch,a3,q3)) = parseCharRefLit (c2::c1::lit) (a2,q2) in ((level,lit3,ch::text),getChar(a3,q3)) end else let val (ch,a3,q3) = parseCharRef (a2,q2) in ((level,lit,ch::text),getChar (a3,q3)) end (*-----------------------------------------------------*) (* it's a general entity reference. *) (*-----------------------------------------------------*) else let val (lit3,((id,ent),(a3,q3))) = if level=0 then parseGenRefLit dtd (c1::lit) (c2,a2,q2) else (nil,parseGenRef dtd (c2,a2,q2)) in case ent of GE_NULL => ((level,lit3,text),getChar(a3,q3)) | GE_INTERN(_,rep) => let val q4 = pushIntern(q3,id,false,rep) in ((level+1,lit3,text),getChar (a3,q4)) end | GE_EXTERN _ => let val err = ERR_ILLEGAL_ENTITY (ENT_EXTERNAL,Index2GenEnt dtd id,LOC_ATT_VALUE) val a4 = hookError(a3,(getPos q2,err)) in ((level,lit,text),getChar (a4,q3)) end | GE_UNPARSED _ => raise InternalError (THIS_MODULE,"parseAttValue'", "parseGenRef returned GE_UNPARSED") end) (*------------------------------------------------------*) (* handle any errors in references by ignoring them. *) (*------------------------------------------------------*) handle SyntaxError caq => ((level,lit,text),caq) | NoSuchEntity aq => ((level,lit,text),getChar aq) | NoSuchChar aq => ((level,lit,text),getChar aq) in doit (level1,lit1,text1) caq3 end | 0wx3C => let val err = ERR_FORBIDDEN_HERE(IT_CHAR c1,LOC_ATT_VALUE) val a2 = hookError(a1,(getPos q1,err)) val lit1 = if level=0 then c1::lit else lit in doit (level,lit1,c1::text) (getChar (a2,q1)) end | _ => if isS c1 then doit (level,if level=0 then c1::lit else lit,0wx20::text) (getChar (a1,q1)) else (if c1=quote andalso level=0 then (lit,text,getChar (a1,q1)) else doit (level,if level=0 then c1::lit else lit,c1::text) (getChar (a1,q1))) val _ = if quote=0wx22 orelse quote=0wx27 (* "'",'"' *) then () else raise NotFound (quote,a,q) val (lit,text,caq1) = doit (0,nil,nil) (getChar(a,q)) in (Data2Vector(quote::rev(quote::lit)),rev text,caq1) end end (* stop of ../../Parser/Parse/parseLiterals.sml *) (* start of ../../Parser/Parse/parseTags.sml *) signature ParseTags = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseNmtoken : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseParRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.ParEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val skipPS : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSopt : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipPSmay : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val skipPSdec : Dtd -> UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val parseSystemLiteral : UniChar.Char * AppData * State -> Uri.Uri * UniChar.Char * (UniChar.Char * AppData * State) val parsePubidLiteral : UniChar.Char * AppData * State -> string * UniChar.Char * (UniChar.Char * AppData * State) val parseAttValue : Dtd -> UniChar.Char * AppData * State -> UniChar.Vector * UniChar.Data * (UniChar.Char * AppData * State) val parseEntityValue : Dtd -> (UniChar.Vector * UniChar.Vector -> 'a) -> UniChar.Char * AppData * State -> 'a * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseLiterals val skipTag : Errors.Location -> AppData * State -> (UniChar.Char * AppData * State) val parseETag : Dtd -> AppData * State -> int * UniChar.Data * Errors.Position * (UniChar.Char * AppData * State) val parseSTag : Dtd -> Errors.Position -> UniChar.Char * AppData * State -> (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseTags *) (* *) (* Exceptions raised by functions in this structure: *) (* skipTag : none *) (* parseETag : SyntaxState *) (* parseSTag : SyntaxState *) (*--------------------------------------------------------------------------*) functor ParseTags (structure ParseBase : ParseBase) : ParseTags = struct structure ParseLiterals = ParseLiterals (structure ParseBase = ParseBase) open UtilList Base Errors UniClasses ParseLiterals (*--------------------------------------------------------------------*) (* parse an end-tag, the "' *) (* *) (* and 3. states: *) (* *) (* Validity Constraint: Element Valid *) (* An element is valid if there is a declaration matching elementdecl *) (* where the Name matches the element type, and ... *) (* *) (* print an error, recover and raise SyntaxState if no name is found. *) (* print an error and recover if no ">" is found. *) (* print an error if the element is not declared. *) (* *) (* return the index of the element, and the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseETag dtd aq = let val caq0 as (_,_,q0) = getChar aq val (elem,(c1,a1,q1)) = parseName caq0 handle NotFound (c,a,q) => let val err = expectedOrEnded (expAName,LOC_ETAG) c val a1 = hookError(a,(getPos q,err)) val caq1 = recoverETag (c,a1,q) in raise SyntaxError caq1 end val idx = Element2Index dtd elem val elemInfo as {decl,...} = getElement dtd idx val a1' = if isSome decl then a1 else let val a2 = if not (!O_VALIDATE andalso hasDtd dtd) then a1 else let val err = ERR_UNDECLARED(IT_ELEM,elem,LOC_ETAG) val a1' = hookError(a1,(getPos q0,err)) val _ = if not (!O_ERROR_MINIMIZE) then () else ignore (handleUndeclElement dtd idx) in a1' end in checkElemName (a2,q0) elem end val (cs,(c2,a2,q2)) = parseSopt nil (c1,a1',q1) val space = rev cs in if c2=0wx3E (* #">" *) then (idx,space,getPos q2,getChar(a2,q2)) else let val err = expectedOrEnded (expGt,LOC_ETAG) c2 val a3 = hookError(a2,(getPos q2,err)) val caq3 = recoverETag(c2,a3,q2) in (idx,space,getPos q2,caq3) end end (*--------------------------------------------------------------------*) (* parse a start-tag or an empty-element-tag, the "<" already read. *) (* 3.1: *) (* *) (* [40] STag ::= '<' Name (S Attribute)* S? '>' *) (* [ WFC: Unique Att Spec ] *) (* [41] Attribute ::= Name Eq AttValue [ VC: Attribute Value Type ] *) (* *) (* Well-Formedness Constraint: Unique Att Spec *) (* No attribute name may appear more than once in the same *) (* start-tag or empty-element tag. *) (* *) (* Validity Constraint: Attribute Value Type *) (* The attribute must have been declared; the value must be of the *) (* type declared for it. *) (* *) (* [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' *) (* [ WFC: Unique Att Spec ] *) (* *) (* and 3. states: *) (* *) (* Validity Constraint: Element Valid *) (* An element is valid if there is a declaration matching elementdecl *) (* where the Name matches the element type, and ... *) (* *) (* catch entity end exceptions in subfunctions by printing an error *) (* and re-raising the exception. *) (* *) (* print an error, recover and raise SyntaxState if no element name *) (* is found. *) (* print an error and recover if no ">" or "/>" is found. *) (* print an error and continue if no "=" is found after an att name. *) (* print an error and recover if no literal is found after the "=". *) (* print an error if white space is missing. *) (* print an error if the element is not declared. *) (* print an error and ignore the attribute if an attribute is *) (* specified twice. *) (* print an error if an attribute is not declared. *) (* *) (* return the index of the element, its ElemInfo, the list of *) (* AttSpecs (specified and omitted atts) and a boolean whether it was *) (* an empty-element-tag, together with the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseSTag dtd startPos (caq as (_,_,q)) = let val (elem,(c1,a1,q1)) = parseName caq handle NotFound (c,a,q) => let val err = expectedOrEnded (expAName,LOC_STAG) c val a1 = hookError(a,(getPos q,err)) val (_,caq1) = recoverSTag (c,a1,q) in raise SyntaxError (c,a1,q) end val eidx = Element2Index dtd elem val elemInfo as {atts,decl,...} = getElement dtd eidx val defs = case atts of NONE => nil | SOME (defs,_) => defs val (a1',elemInfo) = if isSome decl then (a1,elemInfo) else let val (a2,newInfo) = if not (!O_VALIDATE andalso hasDtd dtd) then (a1,elemInfo) else let val err = ERR_UNDECLARED(IT_ELEM,elem,LOC_STAG) val a1' = hookError(a1,(getPos q,err)) val newInfo = if not (!O_ERROR_MINIMIZE) then elemInfo else handleUndeclElement dtd eidx in (a1',newInfo) end in (checkElemName (a2,q) elem,newInfo) end val hscaq2 = parseSmay nil (c1,a1',q1) (*--------------------------------------------------------------*) (* yet are the indices of attributes encountered yet, old are *) (* the valid attributes specified yet, and todo are the defs of *) (* attributes yet to be specified. hadS indicates whether white *) (* space preceded. *) (*--------------------------------------------------------------*) fun doit (yet,old,todo) (hadS,(sp,(c,a,q))) = case c of 0wx3E (* #">" *) => (old,todo,sp,false,q,getChar(a,q)) | 0wx2F (* #"/" *) => let val (c1,a1,q1) = getChar(a,q) in if c1=0wx3E (* #">" *) then (old,todo,sp,true,q1,getChar(a1,q1)) else let val err = expectedOrEnded (expGt,LOC_STAG) c1 val a2 = hookError(a1,(getPos q1,err)) val (mt,caq2) = recoverSTag (c1,a2,q1) in (old,todo,sp,mt,q,caq2) end end | _ => if not (isNms c) then let val err = expectedOrEnded (expAttSTagEnd,LOC_STAG) c val a1 = hookError(a,(getPos q,err)) val (mt,caq1) = recoverSTag (c,a1,q) in (old,todo,sp,mt,q,caq1) end else let(* first parse the name of the attribute *) val (att,(c1,a1,q1)) = parseName (c,a,q) val a2 = if hadS then a1 else hookError(a1,(getPos q,ERR_MISSING_WHITE)) (* now get its index, check whether it already *) (* occurred and get its definition. *) val aidx = AttNot2Index dtd att val (hadIt,a3) = if member aidx yet then (true,hookError(a2,(getPos q,ERR_MULT_ATT_SPEC att))) else (false,a2) val (def,rest) = findAndDelete (fn (i,_,_,_) => i=aidx) todo val a4 = if isSome def orelse hadIt then a3 else handleUndeclAtt dtd (a3,q) (aidx,att,eidx,elem) (* consume the " = ", ignore errors *) val (eq,caq5 as (_,_,q5)) = parseEq (c1,a4,q1) handle SyntaxError caq => ([0wx3D],caq) (* now parse the attribute value *) val (literal,value,(c6,a6,q6)) = parseAttValue dtd caq5 (* possibly make a new AttSpec *) val space = rev sp val (new,a7) = if hadIt then (old,a6) else case def of NONE => if !O_VALIDATE andalso hasDtd dtd then (old,a6) else (let val (attVal,a7) = checkAttValue dtd (a6,q5) (defaultAttDef aidx,literal,value) in ((aidx,attVal,SOME(space,eq))::old,a7) end handle AttValue a => (old,a)) | SOME ad => let val (attVal,a7) = checkAttValue dtd (a6,q5) (ad,literal,value) in ((aidx,attVal,SOME(space,eq))::old,a7) end handle AttValue a => (old,a) val hscaq8 = parseSmay nil (c6,a7,q6) in doit (aidx::yet,new,rest) hscaq8 end handle NotFound (c,a,q) (* raised by parseAttValue above *) => let val err = expectedOrEnded (expLitQuote,LOC_STAG) c val a1 = hookError(a,(getPos q,err)) val (mt,caq1) = recoverSTag (c,a1,q) in (old,todo,sp,mt,q,caq1) end val (specd,todo,sp,empty,qe,(c3,a3,q3)) = doit (nil,nil,defs) hscaq2 val space = rev sp (* generate the defaults for unspecified attributes *) val (all,a4) = genMissingAtts dtd (a3,qe) (todo,rev specd) in ((((startPos,getPos q3),eidx,all,space,empty),elemInfo),(c3,a4,q3)) end (*--------------------------------------------------------------------*) (* skip a tag, the initial "<" or "" and *) (* "/>" if within a literal. *) (* *) (* print an error and finish if an entity end is found. *) (* *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun skipTag loc aq = let fun do_lit ch (c,a,q) = if c=0wx00 then let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE loc)) in (c,a1,q) end else if c=ch then doit (getChar(a,q)) else do_lit ch (getChar(a,q)) and doit (c,a,q) = case c of 0wx00 => let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE loc)) in (c,a1,q) end | 0wx22 (* #"\""*) => do_lit c (getChar(a,q)) | 0wx27 (* #"'" *) => do_lit c (getChar(a,q)) | 0wx2F (* #"/" *) => (case getChar(a,q) of (0wx3E,a1,q1) (* #">" *) => getChar(a1,q1) | caq1 => doit caq1) | 0wx3E (* #">" *) => getChar(a,q) | _ => doit(getChar(a,q)) in doit (getChar aq) end end (* stop of ../../Parser/Parse/parseTags.sml *) (* start of ../../Parser/Parse/parseDecl.sml *) signature ParseDecl = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipS : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSopt : UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipSmay : UniChar.Char * AppData * State -> bool * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val openSubset : Uri.Uri -> AppData -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseParRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.ParEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val skipPSopt : Dtd -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val skipTag : Errors.Location -> AppData * State -> (UniChar.Char * AppData * State) val parseETag : Dtd -> AppData * State -> int * UniChar.Data * Errors.Position * (UniChar.Char * AppData * State) val parseSTag : Dtd -> Errors.Position -> UniChar.Char * AppData * State -> (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseTags val skipDecl : bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseExtIdSub : Dtd -> UniChar.Char * AppData * State -> Base.ExternalId * bool * (UniChar.Char * AppData * State) val parseEntityDecl : Dtd -> EntId * Errors.Position * bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseElementDecl : Dtd -> EntId * Errors.Position * bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseNotationDecl : Dtd -> EntId * Errors.Position * bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseAttListDecl : Dtd -> EntId * Errors.Position * bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State end (*--------------------------------------------------------------------------*) (* Structure: ParseDecl *) (* *) (* Exceptions raised by functions in this structure: *) (* skipDecl : none *) (* parseExtIdSub : NotFound SyntaxError *) (* parseEntityDecl : none *) (* parseElementDecl : none *) (* parseNotationDecl : none *) (* parseAttListDecl : none *) (*--------------------------------------------------------------------------*) functor ParseDecl (structure ParseBase : ParseBase) : ParseDecl = struct structure ParseTags = ParseTags (structure ParseBase = ParseBase) open UtilInt UtilList Base Errors HookData ParseTags (*--------------------------------------------------------------------*) (* skip a markup declaration, the initial "" if within a literal. yake care of internal subset if *) (* the first arg is true. *) (* *) (* print an error and finish if an entity end is found. *) (* *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun skipDecl hasSubset caq = let fun do_lit ch (c,a,q) = if c=0wx00 then (c,a,q) else if c=ch then getChar (a,q) else do_lit ch (getChar(a,q)) fun do_decl (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx22 (* #"\""" *) => do_decl (do_lit c (getChar(a,q))) | 0wx27 (* #"'" *) => do_decl (do_lit c (getChar(a,q))) | 0wx3E (* #">" *) => getChar(a,q) | _ => do_decl (getChar(a,q)) fun do_subset (c,a,q) = case c of 0wx00 => (c,a,q) | 0wx3C (* #"<" *) => do_subset (do_decl (getChar(a,q))) | 0wx5D (* #"]" *) => getChar(a,q) | _ => do_subset (getChar(a,q)) fun doit (c,a,q) = case c of 0wx00 => (c,hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_DECL)),q) | 0wx22 (* #"\"""*) => doit (do_lit c (getChar(a,q))) | 0wx27 (* #"'" *) => doit (do_lit c (getChar(a,q))) | 0wx3E (* #">" *) => getChar(a,q) | 0wx5B (* #"[" *) => if hasSubset then doit (do_subset (getChar(a,q))) else doit (getChar(a,q)) | _ => doit (getChar(a,q)) in doit caq end (*--------------------------------------------------------------------*) (* parse an external id, or a public id if the first arg is true. *) (* Cf. 4.2.2 and 4.7: *) (* *) (* [75] ExternalID ::= 'SYSTEM' S SystemLiteral *) (* | 'PUBLIC' S PubidLiteral S SystemLiteral *) (* *) (* [83] PublicID ::= 'PUBLIC' S PubidLiteral *) (* *) (* raise NotFound if no name is found first. *) (* print an error if white space is missing. *) (* print an error and raise SyntaxState if a wrong name is found. *) (* print an Error and raise SyntaxState if a required literal is not *) (* found (depends on optSys). *) (* *) (* return the public and system identifiers as string options, *) (* a boolean, whether whit space followed the external id, *) (* and the next character and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound SyntaxState *) (*--------------------------------------------------------------------*) fun parseExternalId dtd optSys (caq as (_,_,q))= let (* do not handle NotFound: in this case no extId was found *) val (name,caq1) = parseName caq val caq2 as (_,_,q2)= skipPS dtd caq1 in case name of [0wx50,0wx55,0wx42,0wx4c,0wx49,0wx43] => (* "PUBLIC" *) let val (pub,pquote,caq3) = parsePubidLiteral caq2 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expLitQuote,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val (hadS,caq4 as (_,_,q4)) = skipPSmay dtd caq3 in let val (sys,squote,(c5,a5,q5)) = parseSystemLiteral caq4 val base = getUri q4 val a6 = if hadS then a5 else hookError(a5,(getPos q4,ERR_MISSING_WHITE)) val (hadS6,caq6) = skipPSmay dtd (c5,a6,q5) in (EXTID(SOME(pub,pquote),SOME(base,sys,squote)),hadS6,caq6) end handle NotFound (c,a,q) => (* no system id *) if optSys then (EXTID(SOME(pub,pquote),NONE),hadS,(c,a,q)) else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expLitQuote,[c]))) in raise SyntaxError (c,a1,q) end end | [0wx53,0wx59,0wx53,0wx54,0wx45,0wx4d] => (* "SYSTEM" *) let val (sys,squote,caq3) = parseSystemLiteral caq2 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expLitQuote,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val base = getUri q2 val (hadS,caq4) = skipPSmay dtd caq3 in (EXTID(NONE,SOME(base,sys,squote)),hadS,caq4) end | _ => let val (c2,a2,q2) = caq2 val a3 = hookError(a2,(getPos q,ERR_EXPECTED(expExtId,name))) in raise SyntaxError (c2,a3,q2) end end (*--------------------------------------------------------------------*) (* parse an external id in an entity definition. Cf. 4.2.2: *) (* *) (* print an Error and raise SyntaxState if no external id is found. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseExtIdEnt dtd caq = parseExternalId dtd false caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expLitQuotExt,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end (*--------------------------------------------------------------------*) (* parse an external or public id in a notation declaration. *) (* *) (* print an Error and raise SyntaxState if neither external nor *) (* public id is found. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseExtIdNot dtd caq = parseExternalId dtd true caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expExtId,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end (*--------------------------------------------------------------------*) (* parse an external id for the external subset. *) (* *) (* raise NotFound if no external id is found. *) (*--------------------------------------------------------------------*) (* might raise: NotFound SyntaxState *) (*--------------------------------------------------------------------*) fun parseExtIdSub dtd caq = parseExternalId dtd false caq (*--------------------------------------------------------------------*) (* parse a parameter entity declaration, starting after the '%'. The *) (* unique entity id of the initial '<' is given as first arg. 4.2: *) (* *) (* [72] PEDecl ::= '' *) (* [74] PEDef ::= EntityValue | ExternalID *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* print an error if white space is missing. *) (* print an error and raise SyntaxState if neither entity value nor *) (* external identifier is found. *) (* print an error and raise SyntaxState if the closing '>' is missing.*) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expAnEntName,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val idx = ParEnt2Index dtd name val caq3 = skipPS dtd caq2 val (ent,(c4,a4,q4)) = let val (ent,caq4) = parseEntityValue dtd PE_INTERN caq3 val caq5 = skipPSopt dtd caq4 in (ent,caq5) end handle NotFound caq => let val (extId,_,caq1) = parseExtIdEnt dtd caq in (PE_EXTERN extId,caq1) end val a5 = if useParamEnts() orelse not ext then addParEnt dtd (a4,q1) (idx,ent,ext) else a4 val a6 = hookDecl(a5,((startPos,getPos q4),DEC_PAR_ENT(idx,ent,ext))) in if c4<>0wx3E (* #">" *) then let val a7 = hookError(a6,(getPos q4,ERR_EXPECTED(expGt,[c4]))) in raise SyntaxError(c4,a7,q4) end else let val a7 = if not (!O_VALIDATE) orelse getEntId q4=startEnt then a6 else hookError(a6,(getPos q4,ERR_DECL_ENT_NESTING LOC_ENT_DECL)) in getChar(a7,q4) end end (*--------------------------------------------------------------------*) (* parse a general entity declaration, starting with the name. The *) (* unique entity id of the initial '<' is given as first arg. 4.2: *) (* *) (* [71] GEDecl ::= '' *) (* [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) *) (* *) (* [76] NDataDecl ::= S 'NDATA' S Name [ VC: Notation *) (* Declared ] *) (* *) (* If the NDataDecl is present, this is a general unparsed entity; *) (* otherwise it is a parsed entity. *) (* *) (* Validity Constraint: Notation Declared *) (* The Name must match the declared name of a notation. *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* print an error if white space is missing. *) (* print an error and raise SyntaxState if neither entity value nor *) (* external identifier is found. *) (* print an error if name other then 'NDATA' is found after ext. id. *) (* print an error and raise SyntaxState if no name is found after the *) (* 'NDATA'. *) (* print an error if the notation is not declared. *) (* print an error and raise SyntaxState if the closing '>' is missing.*) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expEntNamePero,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val idx = GenEnt2Index dtd name val caq2 = skipPS dtd caq1 val (ent,expEnd,(c3,a3,q3)) = (*-----------------------------------------------------------*) (* Try for an internal entity. Then '>' must follow. *) (*-----------------------------------------------------------*) let val (ent,caq3) = parseEntityValue dtd GE_INTERN caq2 val caq4 = skipPSopt dtd caq3 in (ent,expGt,caq4) end handle NotFound cq => (* raised by parseEntityValue *) (*-----------------------------------------------------------*) (* Must be external. First parse the external identifier. *) (*-----------------------------------------------------------*) let val (extId,hadS,caq1 as (_,_,q1)) = parseExtIdEnt dtd caq2 in let (*-----------------------------------------------------*) (* Does a name follow? Then is must be 'NDATA' and the *) (* notation name follows. Thus the entity is unparsed. *) (* Also, only '>' may come next. *) (* NotFound is handled at the end of the let. *) (*-----------------------------------------------------*) val (key,(c2,a2,q2)) = parseName caq1 val a3 = if hadS then a2 else hookError(a2,(getPos q1,ERR_MISSING_WHITE)) val a4 = if key = [0wx4e,0wx44,0wx41,0wx54,0wx41] (* "NDATA" *) then a3 else hookError(a3,(getPos q1,ERR_EXPECTED(expGtNdata,key))) val caq5 as (_,_,q5) = skipPS dtd (c2,a4,q2) val (not,caq6) = parseName caq5 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expANotName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val notIdx = AttNot2Index dtd not val caq7 = skipPSopt dtd caq6 in (GE_UNPARSED(extId,notIdx,getPos q5),expGt,caq7) end handle NotFound caq => (*--------------------------------------------------------*) (* No 'NDATA' present, so it's parsed external entity. *) (* A 'NDATA' might have followed. *) (*--------------------------------------------------------*) (GE_EXTERN extId,expGtNdata,caq) end val a4 = if useParamEnts() orelse not ext then addGenEnt dtd (a3,q) (idx,ent,ext) else a3 val a5 = hookDecl(a4,((startPos,getPos q3),DEC_GEN_ENT(idx,ent,ext))) in if c3<>0wx3E (* #">" *) then let val a6 = hookError(a5,(getPos q3,ERR_EXPECTED(expGt,[c3]))) in raise SyntaxError(c3,a6,q3) end else let val a6 = if not (!O_VALIDATE) orelse getEntId q3=startEnt then a5 else hookError(a5,(getPos q3,ERR_DECL_ENT_NESTING LOC_ENT_DECL)) in getChar(a6,q3) end end (*--------------------------------------------------------------------*) (* parse an entity declaration, the initial '' *) (* [72] PEDecl ::= '' *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* raise SyntaxState in case of a syntax error. *) (* print an error if white space is missing. *) (* *) (* print an error for entity end exceptions in subfunctions. *) (* catch syntax errors by recovering to the next possible state. *) (* *) (* pass control to parseParEntDecl or parseGenEntDecl, depending on *) (* whether the S is followed by a '%'. *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseEntityDecl dtd pars caq = let val (hadPero,caq1) = skipPSdec dtd caq in if hadPero then parseParEntDecl dtd pars caq1 else parseGenEntDecl dtd pars caq1 end handle exn as SyntaxError (c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_ENT_DECL)) else a in recoverDecl false (c,a1,q) end (*--------------------------------------------------------------------*) (* parse a notation declaration, the initial '' *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* print an error and raise SyntaxState if no notation name, no *) (* external/public identifier or no final '>' is found. *) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expANotName,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val idx = AttNot2Index dtd name val caq3 = skipPS dtd caq2 val (extId,_,(c4,a4,q4)) = parseExtIdNot dtd caq3 val a5 = if useParamEnts() orelse not ext then addNotation dtd (a4,q1) (idx,extId) else a4 val a6 = hookDecl(a5,((startPos,getPos q4),DEC_NOTATION(idx,extId,ext))) in if c4<>0wx3E (* #">" *) then let val a7 = hookError(a6,(getPos q4,ERR_EXPECTED(expGt,[c4]))) in raise SyntaxError (c4,a7,q4) end else let val a7 = if not (!O_VALIDATE) orelse getEntId q4=startEnt then a6 else hookError(a6,(getPos q4,ERR_DECL_ENT_NESTING LOC_NOT_DECL)) in getChar(a7,q4) end end handle exn as SyntaxError(c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_NOT_DECL)) else a in recoverDecl false (c,a1,q) end (*--------------------------------------------------------------------*) (* parse a mixed-content specification, the initial '(', S? and '#' *) (* already read. The unique id of the openening paren's entity is *) (* given as first arg. Cf. 3.2.1/2: *) (* *) (* Validity Constraint: Proper Group/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* parenthetized groups. That is to say, if either of the opening *) (* or closing parentheses in a choice, seq, or Mixed construct is *) (* contained in the replacement text for a parameter entity, both *) (* must be contained in the same replacement text. *) (* ... *) (* [51] Mixed ::= '(' S? '#PCDATA' [ VC: Proper Group/PE *) (* (S? '|' S? Name)* S? ')*' Nesting ] *) (* | '(' S? '#PCDATA' S? ')' [ VC: No Duplicate *) (* Types ] *) (* *) (* print an error and raise SyntaxState if no name is found first. *) (* print an error if a name other than 'PCDATA' is found. *) (* is found in the first place. *) (* print an error if element names are specified but no '*' follows. *) (* print an error if an element name is specified more than once. *) (* print an error and raise SyntaxState if neither '|' nor ')' is *) (* found after the 'PCDATA' or after an element name. *) (* print an error if the closing parenthesis is not in the same *) (* as the opening one. *) (* *) (* return the mixed-content specification, togther with the next *) (* character and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseMixed dtd lparEnt (caq as (_,_,q)) = let fun doit is (c,a,q) = case c of 0wx29 (* #")" *) => let val a1 = if not (!O_VALIDATE) orelse getEntId q=lparEnt then a else hookError(a,(getPos q,ERR_GROUP_ENT_NESTING LOC_MIXED)) in (rev is,getChar(a1,q)) end | 0wx7C (* #"|" *) => let val caq1 as (_,_,q1) = skipPSopt dtd (getChar(a,q)) val (name,(c2,a2,q2)) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAName,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val i = Element2Index dtd name val (newis,a3) = if not (member i is) then (i::is,a2) else let val a3 = if !O_VALIDATE then hookError(a2,(getPos q1,ERR_MULT_MIXED name)) else a2 in (is,a3) end val caq3 = skipPSopt dtd (c2,a3,q2) in doit newis caq3 end | _ => let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expBarRpar,[c]))) in raise SyntaxError (c,a1,q) end val (name,(c1,a1,q1)) = parseName caq handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expPcdata,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val a2 = case name of [0wx50,0wx43,0wx44,0wx41,0wx54,0wx41] (* "PCDATA" *) => a1 | _ => hookError(a1,(getPos q,ERR_EXPECTED(expPcdata,name))) val caq2 = skipPSopt dtd (c1,a2,q1) val (is,(c3,a3,q3)) = doit nil caq2 val caq4 = if c3=0wx2A (* #"*" *) then getChar(a3,q3) else let val a4 = if null is then a3 else hookError(a3,(getPos q3,ERR_EXPECTED(expRep,[c3]))) in (c3,a4,q3) end in (CT_MIXED is,caq4) end (*--------------------------------------------------------------------*) (* parse an optional occurrence indicator afer a content particle or *) (* a content model, given as first argument. Cf. 3.2.1: *) (* *) (* [47] children ::= (choice | seq) ('?' | '*' | '+')? *) (* [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? *) (* *) (* return the (possibly modified) content particle, together with the *) (* next char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseOcc cm (c,a,q) = case c of 0wx3F (* #"?" *) => (CM_OPT cm,getChar(a,q)) | 0wx2A (* #"*" *) => (CM_REP cm,getChar(a,q)) | 0wx2B (* #"+" *) => (CM_PLUS cm,getChar(a,q)) | _ => (cm,(c,a,q)) (*--------------------------------------------------------------------*) (* parse a content particle. Cf. 3.2.1: *) (* *) (* Validity Constraint: Proper Group/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* parenthetized groups. ... *) (* *) (* (see also parseMixed) *) (* *) (* [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? *) (* [49] choice ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? '|' S? cp )* S? ')' PE Nesting ] *) (* [50] seq ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? ',' S? cp )* S? ')' PE Nesting ] *) (* *) (* print an error and raise SyntaxState if no element name or "(" is *) (* found in the first place. *) (* *) (* return the content particle together with the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseCP dtd (c,a,q) = case c of 0wx28 (* #"(" *) => let val lparEnt = getEntId q val caq1 = skipPSopt dtd (getChar (a,q)) in parseGroup dtd lparEnt caq1 end | _ => (* must be an element name *) let val (name,caq1) = parseName (c,a,q) handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expElemLpar,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val idx = Element2Index dtd name in parseOcc (CM_ELEM idx) caq1 end (*--------------------------------------------------------------------*) (* parse a seq/choice, the first content particle and the connector *) (* already parsed; the connector, the type of group and the entity id *) (* of the opening parenthesis are given in first arg. Cf. 3.2.1: *) (* *) (* Validity Constraint: Proper Group/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* parenthetized groups. ... *) (* *) (* (see also parseMixed) *) (* *) (* [49] choice ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? '|' S? cp )* S? ')' PE Nesting ] *) (* [50] seq ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? ',' S? cp )* S? ')' PE Nesting ] *) (* *) (* print an error and raise SyntaxState if something other than the *) (* connector or ')' is found after a content particle. *) (* print an error if the closing parenthesis of a group is not in the *) (* same entity as the opening one. *) (* *) (* return the list of content particles parsed, together with the *) (* remaining character and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) and parseGroup' dtd (con,loc,lparEnt) caq = let fun doit caq = let val caq1 = skipPSopt dtd caq val (cp,caq2) = parseCP dtd caq1 val (c3,a3,q3) = skipPSopt dtd caq2 in if c3=0wx29 (* #")" ( *) then let val a4 = if not (!O_VALIDATE) orelse getEntId q3=lparEnt then a3 else hookError(a3,(getPos q3,ERR_GROUP_ENT_NESTING loc)) in ([cp],getChar(a4,q3)) end else (if c3=con then let val (cps,caq4) = doit (getChar(a3,q3)) in (cp::cps,caq4) end else let val err = ERR_EXPECTED(expConCRpar con,[c3]) in raise SyntaxError (c3,hookError(a3,(getPos q3,err)),q3) end) end in doit caq end (*--------------------------------------------------------------------*) (* parse a seq/choice, the first content particle parsed; the entity *) (* id of the opening parenthesis are given in first arg. Cf. 3.2.1: *) (* *) (* (see also parseMixed) *) (* *) (* [49] choice ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? '|' S? cp )* S? ')' PE Nesting ] *) (* [50] seq ::= '(' S? cp [ VC: Proper Group/ *) (* ( S? ',' S? cp )* S? ')' PE Nesting ] *) (* *) (* print an error and raise SyntaxState if neither '|' nor ',' nor *) (* ')' follows the first content particle in a seq/choice. *) (* *) (* return the list of as a ContentModel, together with the remaining *) (* character and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) and parseGroup dtd lparEnt caq = let val (cp,caq1) = parseCP dtd caq val (c2,a2,q2) = skipPSopt dtd caq1 val (group,caq3) = case c2 of 0wx29 (* #")" *) => let val a3 = if not (!O_VALIDATE) orelse getEntId q2=lparEnt then a2 else hookError(a2,(getPos q2,ERR_GROUP_ENT_NESTING LOC_SEQ)) in (CM_SEQ[cp],getChar(a3,q2)) end | 0wx2C (* #"," *) => let val (cps,caq3) = parseGroup' dtd (c2,LOC_SEQ,lparEnt) (getChar(a2,q2)) in (CM_SEQ(cp::cps),caq3) end | 0wx7C (* #"|" *) => let val (cps,caq3) = parseGroup' dtd (c2,LOC_CHOICE,lparEnt) (getChar(a2,q2)) in (CM_ALT(cp::cps),caq3) end | _ => let val a3 = hookError(a2,(getPos q2,ERR_EXPECTED(expConRpar,[c2]))) in raise SyntaxError (c2,a3,q2) end in parseOcc group caq3 end (*--------------------------------------------------------------------*) (* parse a content specification. Cf. 3.2/3.2.1: *) (* *) (* Validity Constraint: Proper Group/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* parenthetized groups. That is to say, if either of the opening *) (* or closing parentheses in a choice, seq, or Mixed construct is *) (* contained in the replacement text for a parameter entity, both *) (* must be contained in the same replacement text. *) (* ... *) (* [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children *) (* *) (* [47] children ::= (choice | seq) ('?' | '*' | '+')? *) (* *) (* [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' [ VC:Proper *) (* [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' Group/PE *) (* Nesting ]*) (* *) (* [51] Mixed ::= '(' S? '#PCDATA' [ VC: Proper Group/PE *) (* (S? '|' S? Name)* S? ')*' Nesting ] *) (* | '(' S? '#PCDATA' S? ')' [ VC: No Duplicate *) (* Types ] *) (* *) (* print an error and raise SyntaxState if no children, Mixed, or *) (* name is found. *) (* print an error and assume ANY if an ambiguous content model is *) (* specified. *) (* print an error and assume ANY if a name other than EMPTY or ANY *) (* is found. *) (* print an error if the closing parenthesis of a Mixed is not in the *) (* same entity as the opening one. *) (* *) (* return the parsed content specification, togther with the next *) (* character and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseContentSpec dtd curr (c,a,q) = case c of 0wx28 (* #"(" *) => let val (c1,a1,q1) = skipPSopt dtd (getChar(a,q)) val lparEnt = getEntId q in if c1=0wx23 (* #"#" *) then parseMixed dtd lparEnt (getChar(a1,q1)) else let val (cm,(c2,a2,q2)) = parseGroup dtd lparEnt (c1,a1,q1) val (dfa,a3) = (makeDfa cm,a2) handle Ambiguous(a,n1,n2) => if !O_COMPATIBILITY then let val err = ERR_AMBIGUOUS(Index2Element dtd a,n1,n2) val a3 = hookError(a2,(getPos q,err)) val dfa = makeChoiceDfa cm in (dfa,a3) end else (makeAmbiguous cm,a2) handle DfaTooLarge max => let val a3 = if !O_DFA_WARN_TOO_LARGE then hookWarning (a2,(getPos q,WARN_DFA_TOO_LARGE(curr,max))) else a2 val dfa = makeChoiceDfa cm in (dfa,a3) end in (CT_ELEMENT(cm,dfa),(c2,a3,q2)) end end | _ => (* must be ANY or EMPTY *) let val (name,caq1 as (c1,a1,q1)) = parseName (c,a,q) handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expContSpec,[c]) in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end in case name of [0wx41,0wx4e,0wx59] (* "ANY" *) => (CT_ANY,caq1) | [0wx45,0wx4d,0wx50,0wx54,0wx59] (* "EMPTY" *) => (CT_EMPTY,caq1) | _ => let val a2 = hookError(a1,(getPos q,ERR_EXPECTED(expContSpec,name))) in (CT_ANY,(c1,a2,q1)) end end (*--------------------------------------------------------------------*) (* parse an element declaration, the initial '' Element Type *) (* Declaration ] *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* print an error and raise SyntaxState if no element name, no *) (* content specification, or no final '>' is found. *) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expAnElemName,[c]) in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end val a3 = checkElemName (a2,q1) name val idx = Element2Index dtd name val caq3 = skipPS dtd (c2,a3,q2) val (contSpec,(c4,a4,q4)) = parseContentSpec dtd name caq3 val a5 = if useParamEnts() orelse not ext then addElement dtd (a4,q1) (idx,contSpec,ext) else a4 val a5' = hookDecl(a5,((startPos,getPos q4),DEC_ELEMENT(idx,contSpec,ext))) val (c6,a6,q6) = skipPSopt dtd (c4,a5',q4) in if c6<>0wx3E (* #">" *) then let val a7 = hookError(a6,(getPos q6,ERR_EXPECTED(expGt,[c6]))) in raise SyntaxError(c6,a7,q6) end else let val a7 = if not (!O_VALIDATE) orelse getEntId q6=startEnt then a6 else hookError(a6,(getPos q6,ERR_DECL_ENT_NESTING LOC_ELEM_DECL)) in getChar(a7,q6) end end handle exn as SyntaxError (c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_ELEM_DECL)) else a in recoverDecl false (c,a1,q) end (*--------------------------------------------------------------------*) (* parse an enumerated attribute type, the '(' already consumed. the *) (* 1st arg is a string describing the attribute (nmtoken or notation),*) (* the 2nd arg is a function that parses a single token, the 3rd arg *) (* a function for converting the token to its index. 3.3.1: *) (* *) (* [58] NotationType ::= 'NOTATION' S *) (* '(' S? Name (S? '|' S? Name)* S? ')' *) (* [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' *) (* *) (* print an error and raise SyntaxState if no token is found after a *) (* '(' or '|', or if neither '|' nor ')' follows a token. *) (* *) (* return the (sorted) list of indices of the parsed tokens. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseEnumerated dtd (expWhat,parseToken,Token2Index) caq = let fun doit idxs caq = let val caq1 as (_,_,q1) = skipPSopt dtd caq val (nt,(c2,a2,q2)) = parseToken caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expWhat,[c]) in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end val (idx,a3) = Token2Index dtd (a2,q1) nt val (c4,a4,q4) = skipPSopt dtd (c2,a3,q2) val newIdxs = insertInt(idx,idxs) in case c4 of 0wx7C (* #"|" *) => doit newIdxs (getChar(a4,q4)) | 0wx29 (* #")" *) => (newIdxs,getChar(a4,q4)) | _ => let val a5 = hookError(a4,(getPos q4,ERR_EXPECTED(expBarRpar,[c4]))) in raise SyntaxError (c4,a5,q4) end end in doit nil caq end (*--------------------------------------------------------------------*) (* Convert a (name) token to its index as an enumerated attribute. *) (* 3.3.1: *) (* *) (* Validity Constraint: Notation Attributes *) (* ... all notation names in the declaration must be declared. *) (* *) (* print an error if a notation is not declared. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun Token2NmtokenIndex dtd (a,_) token = (AttNot2Index dtd token,a) fun Token2NotationIndex dtd (a,q) token = let val idx = AttNot2Index dtd token val a1 = if not (!O_VALIDATE) orelse hasNotation dtd idx then a else hookError(a,(getPos q,ERR_UNDECLARED(IT_NOTATION,token,LOC_NONE))) in (idx,a1) end (*--------------------------------------------------------------------*) (* parse an attribute type, the 1st arg being the element this decl. *) (* refers to. 3.3.1: *) (* *) (* [54] AttType ::= StringType | TokenizedType | EnumeratedType *) (* *) (* [55] StringType ::= 'CDATA' *) (* [56] TokenizedType ::= 'ID' [VC: One ID per Element Type ] *) (* | 'IDREF' *) (* | 'IDREFS' *) (* | 'ENTITY' *) (* | 'ENTITIES' *) (* | 'NMTOKEN' *) (* | 'NMTOKENS' *) (* *) (* Validity Constraint: One ID per Element Type *) (* No element type may have more than one ID attribute specified. *) (* *) (* Enumerated Attribute Types *) (* *) (* [57] EnumeratedType ::= NotationType | Enumeration *) (* [58] NotationType ::= 'NOTATION' S '(' ... *) (* [59] Enumeration ::= '(' ... *) (* *) (* print an error and raise SyntaxState if no '(', or name is found *) (* in the first place, or the name does not start an attribute type, *) (* or if no '(' follows a 'NOTATION'. *) (* print an error and assume NMTOKEN instead of ID if the element *) (* already has an ID attribute. *) (* *) (* return the attribute type together with the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseAttType dtd elem (c,a,q) = if c=0wx28 (* #"(" *) then let val (idxs,caq1) = parseEnumerated dtd (expANameToken,parseNmtoken,Token2NmtokenIndex) (getChar(a,q)) in (AT_GROUP idxs,caq1) end else let val (name,caq1 as (c1,a1,q1)) = parseName (c,a,q) handle NotFound cq => let val err = ERR_EXPECTED(expAttType,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end in case name of [0wx43,0wx44,0wx41,0wx54,0wx41] (* "CDATA" *) => (AT_CDATA,caq1) | [0wx49,0wx44] (* "ID" *) => (AT_ID,caq1) | [0wx49,0wx44,0wx52,0wx45,0wx46] (* "IDREF" *) => (AT_IDREF,caq1) | [0wx49,0wx44,0wx52,0wx45,0wx46,0wx53] (* "IDREFS" *) => (AT_IDREFS,caq1) | [0wx45,0wx4e,0wx54,0wx49,0wx54,0wx59] (* "ENTITY" *) => (AT_ENTITY,caq1) | [0wx45,0wx4e,0wx54,0wx49,0wx54,0wx49,0wx45,0wx53] (* "ENTITIES" *) => (AT_ENTITIES,caq1) | [0wx4e,0wx4d,0wx54,0wx4f,0wx4b,0wx45,0wx4e] (* "NMTOKEN" *) => (AT_NMTOKEN,caq1) | [0wx4e,0wx4d,0wx54,0wx4f,0wx4b,0wx45,0wx4e,0wx53] (* "NMTOKEN" *) => (AT_NMTOKENS,caq1) | [0wx4e,0wx4f,0wx54,0wx41,0wx54,0wx49,0wx4f,0wx4e] (* "NOTATION" *) => let val (c2,a2,q2) = skipPSopt dtd caq1 in case c2 of 0wx28 (* #"(" *) => let val (idxs,caq3) = parseEnumerated dtd (expANotName,parseName,Token2NotationIndex) (getChar(a2,q2)) in (AT_NOTATION idxs,caq3) end | _ => let val err = ERR_EXPECTED(expLpar,[c2]) in raise SyntaxError(c2,hookError(a2,(getPos q2,err)),q2) end end | _ => let val a2 = hookError(a1,(getPos q,ERR_EXPECTED(expAttType,name))) in raise SyntaxError (c1,a2,q1) end end (*--------------------------------------------------------------------*) (* parse an attribute default, for an attribute whose type is given *) (* the 1st argument. Cf. 3.3.2: *) (* *) (* [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' *) (* | (('#FIXED' S)? AttValue) *) (* *) (* Validity Constraint: Attribute Default Legal *) (* The declared default value must meet the lexical constraints of *) (* the declared attribute type. *) (* *) (* and 3.3.1: *) (* *) (* Validity Constraint: ID Attribute Default *) (* An ID attribute must have a declared default of #IMPLIED or *) (* #REQUIRED. *) (* *) (* print an error and raise SyntaxState if no '#' or literal is found *) (* in the first place, or no name or a wrong name is found after the *) (* '#', or if no literal follows the 'FIXED'. *) (* print an error if white space is missing. *) (* print an error and assume IMPLIED if the default for an ID attrib. *) (* is not IMPLIED or REQUIRED. *) (* *) (* return the default together with the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: SyntaxState *) (*--------------------------------------------------------------------*) fun parseDefaultDecl dtd (aidx,attType) (c,a,q) = if c=0wx23 (* #"#" *) then let val caq0 as (_,_,q0) = (getChar(a,q)) val (name,caq1) = parseName caq0 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAttDefKey,[c]) in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end in case name of [0wx46,0wx49,0wx58,0wx45,0wx44] (* "FIXED" *) => let val caq2 as (_,_,q2) = skipPS dtd caq1 val (lit,text,(c3,a3,q3)) = parseAttValue dtd caq2 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expLitQuote,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end in if !O_VALIDATE andalso isIdType attType then let val a4 = hookError(a3,(getPos q,ERR_ID_DEFAULT)) in (AD_IMPLIED,(c3,a4,q3)) end else let val (cv,(av,a4)) = makeAttValue dtd (a3,q2) (aidx,attType,false,true,text) in (AD_FIXED((lit,cv,av),(getPos q2,ref false)),(c3,a4,q3)) end handle AttValue a => (AD_IMPLIED,(c3,a,q3)) end | [0wx49,0wx4d,0wx50,0wx4c,0wx49,0wx45,0wx44] (* "IMPLIED" *) => (AD_IMPLIED,caq1) | [0wx52,0wx45,0wx51,0wx55,0wx49,0wx52,0wx45,0wx44] (* "REQUIRED" *) => (AD_REQUIRED,caq1) | _ => let val (c1,a1,q1) = caq1 val a2 = hookError(a1,(getPos q0,ERR_EXPECTED(expAttDefKey,name))) in raise SyntaxError (c1,a2,q1) end end else let val (lit,text,(c1,a1,q1)) = parseAttValue dtd (c,a,q) handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expQuoteRni,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError(c,a1,q) end in if !O_VALIDATE andalso isIdType attType then let val a2 = hookError(a1,(getPos q,ERR_ID_DEFAULT)) in (AD_IMPLIED,(c1,a2,q1)) end else let val (cv,(av,a2)) = makeAttValue dtd (a1,q) (aidx,attType,false,true,text) in (AD_DEFAULT((lit,cv,av),(getPos q,ref false)),(c1,a2,q1)) end handle AttValue a => (AD_IMPLIED,(c1,a,q1)) end (*--------------------------------------------------------------------*) (* parse an attribute definition, the referred element given as 1st *) (* argument. 3.3: *) (* *) (* [53] AttDef ::= S Name S AttType S DefaultDecl *) (* *) (* raise NotFound if no name is found (and thus no attribute def.) *) (* print an error if white space is missing. *) (* *) (* enter the attribute definition into the element table. *) (* return the next character and the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: NotFound SyntaxState *) (*--------------------------------------------------------------------*) fun parseAttDef dtd (elem,ext) caq = let val (hadS,caq1 as (_,_,q1)) = skipPSmay dtd caq val (name,(c2,a2,q2)) = parseName caq1 (* NotFound falls through to the next level *) val a3 = if hadS then a2 else hookError(a2,(getPos q1,ERR_MISSING_WHITE)) val a4 = checkAttName (a3,q1) name val idx = AttNot2Index dtd name val caq5 = skipPS dtd (c2,a4,q2) val (attType,caq6) = parseAttType dtd elem caq5 val caq7 = skipPS dtd caq6 val (attDef,(c8,a8,q8)) = parseDefaultDecl dtd (idx,attType) caq7 val a9 = if useParamEnts() orelse not ext then addAttribute dtd (a8,q1) (elem,(idx,attType,attDef,ext)) else a8 in ((idx,attType,attDef),(c8,a9,q8)) end (*--------------------------------------------------------------------*) (* parse an attribute-list declaration, the initial '' *) (* *) (* (see also the comments for ParseDtd.parseMarkupDecl). *) (* *) (* check whether the element already had an attlist declaration. (cf. *) (* DtdElements.enterAttDecl) *) (* *) (* print an error and raise SyntaxState if no element name, or no *) (* final '>' is found. *) (* print an error if the '>' is not in the same entity as the ' let val err = ERR_EXPECTED(expAnElemName,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val a3 = checkElemName (a2,q1) name val idx = Element2Index dtd name val a4 = if !O_VALIDATE orelse not ext then enterAttList dtd (a3,q1) idx else a3 fun doit attDefs caq = let val (attDef,caq1) = parseAttDef dtd (idx,ext) caq handle NotFound (c,a,q) => raise NotFound (c,hookDecl(a,((startPos,getPos q),DEC_ATTLIST(idx,rev attDefs,ext))),q) | SyntaxError (c,a,q) => raise SyntaxError (c,hookDecl(a,((startPos,getPos q),DEC_ATTLIST(idx,rev attDefs,ext))),q) in doit (attDef::attDefs) caq1 end val (c5,a5,q5) = doit nil (c2,a4,q2) handle NotFound caq => caq in if c5 <> 0wx3E (* #">" *) then let val a6 = hookError(a5,(getPos q5,ERR_EXPECTED(expAttNameGt,[c5]))) in raise SyntaxError (c5,a6,q5) end else let val a6 = if not (!O_VALIDATE) orelse getEntId q5=startEnt then a5 else hookError(a5,(getPos q5,ERR_DECL_ENT_NESTING LOC_ATT_DECL)) in getChar(a6,q5) end end handle exn as SyntaxError (c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_ATT_DECL)) else a in recoverDecl false (c,a,q) end end (* stop of ../../Parser/Parse/parseDecl.sml *) (* start of ../../Parser/Parse/parseDtd.sml *) signature ParseDtd = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val openExtern : int * Uri.Uri -> AppData * State -> Encoding.Encoding * HookData.TextDecl option * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseGenRef : Dtd -> UniChar.Char * AppData * State -> (int * Base.GenEntity) * (AppData * State) val parseCharRefLit : UniChar.Data -> AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipTag : Errors.Location -> AppData * State -> (UniChar.Char * AppData * State) val parseETag : Dtd -> AppData * State -> int * UniChar.Data * Errors.Position * (UniChar.Char * AppData * State) val parseSTag : Dtd -> Errors.Position -> UniChar.Char * AppData * State -> (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) val skipDecl : bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State ----------------------------------------------------------------------*) include ParseDecl val parseDocTypeDecl : Dtd -> (UniChar.Char * AppData * State) -> int option * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseDtd *) (* *) (* Exceptions raised by functions in this structure: *) (* parseDocTypeDecl : none *) (*--------------------------------------------------------------------------*) functor ParseDtd (structure ParseBase : ParseBase) : ParseDtd = struct structure ParseDecl = ParseDecl (structure ParseBase = ParseBase) open Base UniChar Errors ParseDecl (*--------------------------------------------------------------------*) (* parse a markup declaration other than a processing instruction, *) (* " (* #"-" *) let val (c1,a1,q1) = getChar (a,q) in if c1<>0wx2D (* #"-" *) then let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expDash,[c1]))) in recoverDecl false (c1,a2,q1) end else parseComment startPos (a1,q1) end | _ => let val (name,caq1) = parseName (c,a,q) handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expStartMarkup,[c]) val a1 = hookError(a,(getPos q,err)) in raise SyntaxError (c,a1,q) end val ext = hasExternal dtd in case name of [0wx45,0wx4c,0wx45,0wx4d,0wx45,0wx4e,0wx54] (* "ELEMENT" *) => parseElementDecl dtd (startEnt,startPos,ext) caq1 | [0wx41,0wx54,0wx54,0wx4c,0wx49,0wx53,0wx54] (* "ATTLIST" *) => parseAttListDecl dtd (startEnt,startPos,ext) caq1 | [0wx4e,0wx4f,0wx54,0wx41,0wx54,0wx49,0wx4f,0wx4e] (* "NOTATION" *) => parseNotationDecl dtd (startEnt,startPos,ext) caq1 | [0wx45,0wx4e,0wx54,0wx49,0wx54,0wx59] (* "ENTITY" *) => parseEntityDecl dtd (startEnt,startPos,ext) caq1 | _ => let val (c1,a1,q1) = caq1 val err = ERR_EXPECTED(expStartMarkup,name) val a2 = hookError(a1,(getPos q,err)) in recoverDecl false (c1,a2,q1) end end (*--------------------------------------------------------------------*) (* skip an ignored section, starting after the '". 3.4: *) (* *) (* [63] ignoreSect ::= '' *) (* [64] ignoreSectContents ::= Ignore ('' Ignore)* *) (* [65] Ignore ::= Char* - (Char* ('') Char* ) *) (* *) (* ... If the keyword of the conditional section is IGNORE, then *) (* the contents of the conditional section are not logically part *) (* of the DTD. Note that for reliable parsing, the contents of even *) (* ignored conditional sections must be read in order to detect *) (* nested conditional sections and ensure that the end of the *) (* outermost (ignored) conditional section is properly detected. *) (* If a conditional section with a keyword of INCLUDE occurs within *) (* a larger conditional section with a keyword of IGNORE, both the *) (* outer and the inner conditional sections are ignored. *) (* *) (* print an error an finish if an entity end is encountered. *) (* *) (* return the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun skipIgnored caq = let (*--------------------------------------------------------------*) (* level counts the nesting of conditional sections. *) (* if the second char after a "<" ("]") is not a "[" ("]"), it *) (* can nevertheless start another delimiter and is therefore *) (* fed into a recursive call of doit. *) (*--------------------------------------------------------------*) fun doit level (c,a,q) = case c of 0wx00 => (c,hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_IGNORED)),q) | 0wx3C (* #"<" *) => let val (c1,a1,q1) = getChar (a,q) in if c1=0wx21 (* #"!" *) then let val (c2,a2,q2) = (getChar(a1,q1)) in if c2=0wx5B (* #"[" *) then doit (level+1) (getChar(a2,q2)) else doit level (c2,a2,q2) end else doit level (c1,a1,q1) end | 0wx5D (* #"]" *) => let val (c1,a1,q1) = getChar (a,q) in if c1=0wx5D (* #"]" *) then doit' level (getChar (a1,q1)) else doit level (c1,a1,q1) end | _ => doit level (getChar (a,q)) (*--------------------------------------------------------------*) (* if the second "]" is followed by a "]", then this might be *) (* the real second "]". Therefore doit' loops as long as it *) (* finds "]"'s. *) (*--------------------------------------------------------------*) and doit' level (c,a,q) = case c of 0wx3E (* #">" *) => if level>0 then doit (level-1) (getChar (a,q)) else getChar (a,q) | 0wx5D (* #"]" *) => doit' level (getChar (a,q)) | _ => doit level (c,a,q) in doit 0 caq end (*--------------------------------------------------------------------*) (* parse the internal or external subset of the dtd. handle included *) (* sections by counting their nesting level. Cf 2.8: *) (* *) (* Validity Constraint: Proper Declaration/PE Nesting *) (* Parameter-entity replacement text must be properly nested with *) (* markup declarations. That is to say, if either the first *) (* character or the last character of a markup declaration *) (* (markupdecl above) is contained in the replacement text for a *) (* parameter-entity reference, both must be contained in the same *) (* replacement text. *) (* ... *) (* [28] doctypedecl ::= '' *) (* [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl *) (* | NotationDecl | PI | Comment *) (* [30] extSubset ::= TextDecl? extSubsetDecl *) (* [31] extSubsetDecl ::= ( markupdecl | conditionalSect *) (* | PEReference | S )* *) (* and 3.4: *) (* *) (* [61] conditionalSect ::= includeSect | ignoreSect *) (* [62] includeSect ::= '' *) (* [63] ignoreSect ::= '' *) (* *) (* print an error and finish if the end of document is encountered in *) (* the internal subset. *) (* print an error and raise SyntaxState if a "<" is not followed by a *) (* "!" or a "?". *) (* print an error and raise SyntaxState if a "]" is not followed by *) (* "]>". *) (* print an error if a "" is found outside an included section. *) (* print an error an raise SyntaxState if something other than a *) (* markup declaration, parameter entity reference, white space or *) (* a conditional section is encountered. *) (* print an error and raise SyntaxState if a " (ws,(c,a,q)) | 0wx09 => doit false (c::ws) (getChar(a,q)) | 0wx0A => doit false (c::ws) (getChar(a,q)) | 0wx20 => doit false (c::ws) (getChar(a,q)) | 0wx25 => (ws,(c,a,q)) | 0wx3C => (ws,(c,a,q)) | 0wx5D => (ws,(c,a,q)) | _ => if hadError then doit true ws (getChar(a,q)) else let val err = ERR_FORBIDDEN_HERE(IT_DATA nil,LOC_SUBSET) val a1 = hookError (a,(getPos q,err)) in doit true ws (getChar(a1,q)) end val (ws,(c1,a1,q1)) = doit false nil caq val a2 = if null ws then a1 else hookWhite(a1,Data2Vector (rev ws)) in (c1,a2,q1) end fun doit cond (c,a,q) = case c of 0wx00 => if isSpecial q (*---------------------------------------------------*) (* the external subset ends at and of special entity.*) (* so does the internal subset, but with error. *) (*---------------------------------------------------*) then let val a1 = if inDocEntity q then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_INT_SUBSET)) else if cond=0 then a else hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_INCLUDED)) in (c,a1,q) end else let val a1 = hookEntEnd (a,getPos q) in doit cond (getChar(a1,q)) end (* ignore errors in parameter references -----------------*) | 0wx25 (* #"%" *) => let val caq2 = let val ((id,ent),(a1,q1)) = parseParRef dtd (getChar(a,q)) in if !O_VALIDATE orelse !O_INCLUDE_PARAM_ENTS then case ent of PE_NULL => getChar(a1,q1) | PE_INTERN(_,rep) => let val q2 = pushIntern(q1,id,true,rep) val a2 = hookParRef(a1,((getPos q,getPos q1),id,ent,true)) in getChar(a2,q2) end | PE_EXTERN extId => let val a2 = hookParRef(a1,((getPos q,getPos q1),id,ent,true)) val caq3 = #3(openExtern (id,true,resolveExtId extId) (a2,q1)) handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a1 = hookError(a,(getPos q1,err)) val a2 = hookEntEnd (a1,getPos q1) in (getChar(a2,q1)) end in caq3 end (* changed 080600: setExternal is already called by parseParRef *) else let val a2 = hookParRef(a1,((getPos q,getPos q1),id,ent,false)) in getChar(a2,q1) end end handle SyntaxError caq => caq | NoSuchEntity aq => getChar aq in doit cond caq2 end | 0wx3C (* #"<" *) => let val (c1,a1,q1) = getChar(a,q) in case c1 of 0wx3F => (* #"?" *) let val caq2 = parseProcInstr (getPos q) (a1,q1) in doit cond caq2 end | 0wx21 => (* #"!" *) let val (c2,a2,q2) = (getChar(a1,q1)) in if c2=0wx5B (* #"[" *) then do_cond cond q (a2,q2) else let val caq3 = parseMarkupDecl dtd (getEntId q,getPos q) (c2,a2,q2) in doit cond caq3 end end | _ => let val err = ERR_EXPECTED(expExclQuest,[c1]) val a2 = hookError(a1,(getPos q1,err)) val caq3 = recoverDecl false (c1,a2,q1) in doit cond caq3 end end | 0wx5D (* #"]" *) => do_brack cond q (getChar(a,q)) | _ => let val caq1 = do_data (c,a,q) in doit cond caq1 end and do_brack cond q0 (c,a,q) = if inDocEntity q then (c,a,q) else if c=0wx5D (* #"]" *) then let val (c1,a1,q1) = getChar(a,q) in if c1=0wx3E (* #">" *) (* ignore wrong "]]>"'s ------------------*) then if cond=0 then let val err = ERR_FORBIDDEN_HERE(IT_DATA [c,c,c1], LOC_OUT_COND) val a2 = hookError(a1,(getPos q0,err)) in doit cond (getChar(a2,q1)) end else doit (cond-1) (getChar(a1,q1)) (* the second "]" may start another "]]>" ---*) else let val a2 = hookError(a1,(getPos q1,ERR_EXPECTED(expGt,[c1]))) in do_brack cond q (c1,a2,q1) end end else let val a1 = hookError(a,(getPos q,ERR_EXPECTED(expRbrack,[c]))) in doit cond (c,a1,q) end and do_cond cond q0 (a,q) = let (* marked sections are forbidden in the internal subset. -*) val inInt = inDocEntity q val a1 = if inInt then hookError (a,(getPos q0,ERR_FORBIDDEN_HERE (IT_COND,LOC_INT_SUBSET))) else a val caq2 as (_,_,q2) = skipPSopt dtd (getChar(a1,q)) val (status,caq3) = let val (name,(c3,a3,q3)) = parseName caq2 (* ignore sections with bad status keyword ---------*) val (status,a4) = case name of [0wx49,0wx47,0wx4e,0wx4f,0wx52,0wx45] => (IGNORE,a3) | [0wx49,0wx4e,0wx43,0wx4c,0wx55,0wx44,0wx45] => (INCLUDE,a3) | _ => let val err = ERR_EXPECTED(expCondStatus,name) val a4 = hookError(a3,(getPos q2,err)) in (IGNORE,a4) end val (c5,a5,q5) = skipPSopt dtd (c3,a4,q3) in (* ignore sections without "[" after keyword -------*) if c5=0wx5B then (status,getChar(a5,q5)) else let val a6 = hookError(a5,(getPos q5,ERR_EXPECTED(expLbrack,[c5]))) in (IGNORE,(c5,a6,q5)) end end handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expCondStatus,[c]) val a1 = hookError(a,(getPos q,err)) in (IGNORE,(c,a1,q)) end in (* ignore sections in the internal subset ----------------*) case (status,inInt) of (INCLUDE,_) => doit (cond+1) caq3 | (_,_) => doit cond (skipIgnored caq3) end in doit 0 caq end (*--------------------------------------------------------------------*) (* parse the internal subset of the dtd. Cf 2.8: *) (* *) (* return the remaining character and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseInternalSubset dtd (a,q) = let val a1 = hookSubset (a,getPos q) in parseSubset dtd (getChar(a1,q)) end (*--------------------------------------------------------------------*) (* parse the external subset of the dtd, the filename given as first *) (* argument. handle included sections by counting their nesting level.*) (* the file is opened on its own stack, and closed at the end. *) (* Cf 2.8: *) (* *) (* print an error and do nothing if the file cannot be opened. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseExternalSubset dtd (a,q) extId = let val uri = resolveExtId extId val (enc,textDecl,(c1,a1,q1)) = openSubset uri a val a2 = hookExtSubset (a1,(uri,enc,textDecl)) val (_,a3,q3) = parseSubset dtd (c1,a2,q1) val _ = closeAll q3 in a3 end handle CantOpenFile(fmsg,a) => hookError(a,(getPos q,ERR_NO_SUCH_FILE fmsg)) (*--------------------------------------------------------------------*) (* Parse the document type declaration, the ' *) (* *) (* print an error and raise SyntaxState if no name is found. *) (* print an error and raise SyntaxState if no final ">" is found. *) (* external identifier is found. *) (* print an error if white space is missing. *) (* *) (* return nothing. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseDocTypeDecl dtd caq = let val _ = setHasDtd dtd val caq1 = skipS caq val (doc,caq2) = parseName caq1 handle NotFound (c,a,q) => let val err = ERR_EXPECTED(expAName,[c]) in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val idx = Element2Index dtd doc val (hadS,caq3 as (_,_,q3)) = skipSmay caq2 val (ext,(c4,a4,q4)) = let val (extId,_,(c4,a4,q4)) = parseExtIdSub dtd caq3 val a5 = if hadS then a4 else hookError(a4,(getPos q3,ERR_MISSING_WHITE)) in (SOME extId,(c4,a5,q4)) end handle NotFound caq => (NONE,caq) val a4' = hookDocType(a4,(idx,ext)) val (c5,a5,q5) = case c4 of 0wx5B (* #"[" *) => let val caq5 = parseInternalSubset dtd (a4',q4) in skipSopt caq5 end | _ => (c4,a4',q4) val a6 = case ext of NONE => a5 | SOME extId => let val _ = setExternal dtd in if !O_VALIDATE orelse !O_INCLUDE_PARAM_ENTS then parseExternalSubset dtd (a5,q5) extId else a5 end val a7 = checkMultEnum dtd (a6,q5) val a7'= checkPreDefined dtd (a7,q5) val a8 = checkUnparsed dtd a7' val (c9,a9,q9) = if c5=0wx3E (* #">" *) then getChar(a8,q5) else let val err = expectedOrEnded(expGt,LOC_DOC_DECL) c5 val a9 = hookError(a8,(getPos q5,err)) in recoverDecl false (c5,a9,q5) end in (SOME idx,(c9,hookEndDtd(a9,getPos q9),q9)) end handle exn as SyntaxError(c,a,q) => let val a1 = if c=0wx00 then hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_DOC_DECL)) else a val (c2,a2,q2) = recoverDecl true (c,a1,q) in (NONE,(c2,hookEndDtd(a2,getPos q2),q2)) end end (* stop of ../../Parser/Parse/parseDtd.sml *) (* start of ../../Parser/Parse/parseContent.sml *) signature ParseContent = sig (*---------------------------------------------------------------------- include ParseBase val parseName : UniChar.Char * AppData * State -> UniChar.Data * (UniChar.Char * AppData * State) val openDocument : Uri.Uri option -> AppData -> Encoding.Encoding * HookData.XmlDecl option * (UniChar.Char * AppData * State) val skipCharRef : AppData * State -> (UniChar.Char * AppData * State) val skipReference : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseComment : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val parseProcInstr : Errors.Position -> AppData * State -> (UniChar.Char * AppData * State) val skipTag : Errors.Location -> AppData * State -> (UniChar.Char * AppData * State) val parseSTag : Dtd -> Errors.Position -> UniChar.Char * AppData * State -> (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) val skipDecl : bool -> UniChar.Char * AppData * State -> UniChar.Char * AppData * State val parseDocTypeDecl : Dtd -> (UniChar.Char * AppData * State) -> int option * (UniChar.Char * AppData * State) ----------------------------------------------------------------------*) include ParseDtd val skipBadSection : UniChar.Char * AppData * State -> (UniChar.Char * AppData * State) val parseElement : Dtd * int list * State * (HookData.StartTagInfo * Base.ElemInfo) * (UniChar.Char * AppData * State) -> (int * UniChar.Data * Errors.Position * Errors.Position) option * (UniChar.Char * AppData * State) end (*--------------------------------------------------------------------------*) (* Structure: ParseContent *) (* *) (* Exceptions raised by functions in this structure: *) (* skipBadSection : none *) (* parseElement : none *) (*--------------------------------------------------------------------------*) functor ParseContent (structure ParseBase : ParseBase) : ParseContent = struct structure ParseDtd = ParseDtd (structure ParseBase = ParseBase) open Base Errors UniChar UniClasses UtilList ParseDtd val THIS_MODULE = "ParseContent" val DATA_BUFSIZE = 1024 val dataBuffer = Array.array(DATA_BUFSIZE,0w0:UniChar.Char) (*--------------------------------------------------------------------*) (* skip a cdata section, the initial "' Char* )) [[ *) (* [21] CDEnd ::= ']]>' *) (* *) (* don't care abeout whether "CDATA[" is present. just skip until the *) (* next "]]>" or entity end. *) (* *) (* return the remaining char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun skipBadSection caq = let(*--------------------------------------------------------------*) (* for a sequence of "]"s, check whether the last two are *) (* followed by a ">" *) (*--------------------------------------------------------------*) fun checkEnd aq = let val (c1,a1,q1) = getChar aq in case c1 of 0wx3E (* #">" *) => getChar(a1,q1) | 0wx5D (* #"]" *) => checkEnd(a1,q1) | _ => doit(c1,a1,q1) end and doit (c,a,q) = case c of 0wx00 => let val a1 = hookError(a,(getPos q,ERR_ENDED_BY_EE LOC_CDATA)) in (c,a1,q) end | 0wx5D (* #"]" *) => let val (c1,a1,q1) = getChar(a,q) in if c1=0wx5D (* #"]" *) then checkEnd(a1,q1) else doit (c1,a1,q1) end | _ => doit (getChar(a,q)) in doit caq end (*--------------------------------------------------------------------*) (* parse a cdata section, the initial "' Char* )) [[ *) (* [21] CDEnd ::= ']]>' *) (* *) (* print an error and finish if an entity end is found. *) (* *) (* return the data as a Vector option and the next char & state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseCDataSection' (aq as (_,q)) = let (*--------------------------------------------------------------*) (* for a sequence of "]"s, check whether the last two are *) (* followed by a ">" *) (*--------------------------------------------------------------*) fun doEnd (text,q0,q1) (a2,q2) = let val (c3,a3,q3) = getChar (a2,q2) in case c3 of 0wx00 => let val a4 = hookError(a3,(getPos q3,ERR_ENDED_BY_EE LOC_CDATA)) in (0wx5D::text,getPos q2,(c3,a4,q3)) end | 0wx3E => (* #">" *) (text,getPos q0,getChar(a3,q3)) | 0wx5D => doEnd (0wx5D::text,q1,q2) (a3,q3) | _ => doit (c3::0wx5D::0wx5D::text) (a3,q3) end and doBrack (text,q0) (a1,q1) = let val (c2,a2,q2) = getChar(a1,q1) in case c2 of 0wx00 => let val a3 = hookError(a2,(getPos q2,ERR_ENDED_BY_EE LOC_CDATA)) in (0wx5D::text,getPos q1,(c2,a3,q2)) end | 0wx5D (* #"]" *) => doEnd (text,q0,q1) (a2,q2) | _ => doit (c2::0wx5D::text) (a2,q2) end and doit text (a,q) = let val (c1,a1,q1) = getChar(a,q) in case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_CDATA)) in (text,getPos q,(c1,a2,q1)) end | 0wx5D (* #"]" *) => doBrack (text,q) (a1,q1) | _ => doit (c1::text) (a1,q1) end val (c1,a1,q1) = getChar aq val startPos = getPos q1 val (cs,endPos,(c2,a2,q2)) = case c1 of 0wx00 => let val a2 = hookError(a1,(getPos q1,ERR_ENDED_BY_EE LOC_CDATA)) in (nil,getPos q,(c1,a2,q1)) end | 0wx5D (* #"]" *) => doBrack (nil,q) (a1,q1) | _ => doit [c1] (a1,q1) val text = Data2Vector(rev cs) val a3 = hookCData(a1,((startPos,endPos),text)) in (c2,a3,q2) end (*--------------------------------------------------------------------*) (* parse a cdata section, the initial "' Char* )) [[ *) (* [21] CDEnd ::= ']]>' *) (* *) (* print an error and skip the section if no name or a name other *) (* than CDATA comes first, or no '[' follows the name. *) (* *) (* return the text of the section together with the remaining state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseCDataSection startPos aq = let val caq0 as (_,_,q0) = (getChar aq) val (name,(c1,a1,q1)) = parseName caq0 handle NotFound (c,a,q) => let val err = expectedOrEnded(expCdata,LOC_CDATA) c in raise SyntaxError(c,hookError(a,(getPos q,err)),q) end val _ = if name = [0wx43,0wx44,0wx41,0wx54,0wx41] (* "CDATA" *) then () else let val err = ERR_EXPECTED(expCdata,name) in raise SyntaxError(c1,hookError(a1,(getPos q0,err)),q1) end val _ = if c1=0wx5B (* #"[" *) then () else let val err = expectedOrEnded(expLbrack,LOC_CDATA) c1 in raise SyntaxError(c1,hookError(a1,(getPos q1,err)),q1) end in parseCDataSection'(a1,q1) end handle SyntaxError caq => skipBadSection caq (*--------------------------------------------------------------------*) (* parse element or empty content. The second arg holds the unique *) (* number of the element's first characters's entity, the index of *) (* the current element, and the dfa for its content. Cf. 3: *) (* *) (* [39] element ::= EmptyElemTag *) (* | STag content ETag *) (* ... *) (* Well-Formedness Constraint: Element Type Match *) (* The Name in an element's end-tag must match the element type in *) (* the start-tag. *) (* *) (* Validity Constraint: Element Valid *) (* An element is valid if there is a declaration matching *) (* elementdecl where the Name matches the element type, and one of *) (* the following holds: *) (* *) (* 1. The declaration matches EMPTY and the element has no content. *) (* 2. The declaration matches children and the sequence of child *) (* elements belongs to the language generated by the regular *) (* expression in the content model, with optional white space *) (* (characters matching the nonterminal S) between each pair of *) (* child elements. *) (* *) (* and 3.1: *) (* *) (* [43] content ::= (element | CharData | Reference | CDSect | PI *) (* | Comment)* *) (* 2.4: *) (* The ampersand character (&) and the left angle bracket (<) may *) (* appear in their literal form only when used as markup delimiters,*) (* or within a comment, a processing instruction, or a CDATA *) (* section... If they are needed elsewhere, they must be escaped *) (* using either numeric character references or the strings "&" *) (* and "<" respectively... *) (* *) (* consume the content of the element, accumulating it via the user *) (* data functions (parameter a in subfunctions). trace the content *) (* model of the element with a dfa transitions on a dfa state (para- *) (* meter p in subfunctions). finish at the first end-tag, whether *) (* matching or not, or at the document end. *) (* *) (* handle all syntax and other recoverable errors from subfunctions *) (* and try to continue. *) (* *) (* return the accumulated user data and the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) fun parseElementContent dtd (openElems,startEnt,curr,dfa,ext,mt) caq = let (*--------------------------------------------------------------*) (* check whether the dfa allows a transition/an end tag here. *) (* print an error if not. After a transition return the new *) (* dfa state. *) (*--------------------------------------------------------------*) fun fin_elem (a,pos,dfa,p) = if dfaFinal(dfa,p) then a else hookError(a,(pos,ERR_ENDED_EARLY(Index2Element dtd curr))) fun trans_elem (a,q,dfa,p,el) = let val p1 = dfaTrans(dfa,p,el) in if p1<>dfaError then (p1,a) else let val err = ERR_BAD_ELEM(Index2Element dtd curr,Index2Element dtd el) in (p1,hookError(a,(getPos q,err))) end end (*--------------------------------------------------------------*) (* consume all white space and skip all data until the next "<" *) (* or "&". print an error for each sequence of data encountered.*) (* *) (* add the white space as data to the user data. *) (* return the next char and state. *) (*--------------------------------------------------------------*) fun do_char_elem (c0,a0,q0) = let (*--------------------------------------------------------------*) (* read data characters until the next "<", "&" or entity end. *) (* add the data to the user data when an error occurs or no *) (* more data follows. *) (* *) (* return the modified user data with the next char and state. *) (*--------------------------------------------------------------*) fun data_hook(a,q,cs) = if null cs then a else hookData(a,((getPos q0,getPos q),Data2Vector(rev cs),true)) fun after_error (caq as (c,a,q)) = case c of 0wx00 => caq | 0wx26 (* #"&" *) => caq | 0wx3C (* #"<" *) => caq | _ => after_error(getChar(a,q)) fun do_data (yet,aq as (_,q)) = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => (c1,data_hook(a1,q,yet),q1) | 0wx26 (* #"&" *) => (c1,data_hook(a1,q,yet),q1) | 0wx3C (* #"<" *) => (c1,data_hook(a1,q,yet),q1) | _ => if isS c1 then do_data (c1::yet,(a1,q1)) else let val a2 = data_hook(a1,q,yet) val err = ERR_ELEM_CONTENT(IT_DATA nil) val a3 = hookError(a2,(getPos q1,err)) in after_error (getChar(a3,q1)) end end in if isS c0 then let val a1 = if not (ext andalso standsAlone dtd) then a0 else let val err = ERR_STANDALONE_ELEM(Index2Element dtd curr) val _ = setStandAlone dtd (not (!O_ERROR_MINIMIZE)) in hookError(a0,(getPos q0,err)) end in do_data ([c0],(a1,q0)) end else let val a1 = hookError(a0,(getPos q0,ERR_ELEM_CONTENT(IT_DATA nil))) in after_error(getChar(a1,q0)) end end (*--------------------------------------------------------------*) (* consume a reference, handling errors by ignoring them. *) (*--------------------------------------------------------------*) fun do_ref (q,(c1,a1,q1)) = if c1=0wx23 (* #"#" *) (*------------------------------------------------------*) (* it's a character reference. *) (*------------------------------------------------------*) then let val err = ERR_ELEM_CONTENT IT_CHAR_REF val a2 = hookError(a1,(getPos q,err)) in skipCharRef(a2,q1) end (*---------------------------------------------------------*) (* it's a general entity reference. *) (*---------------------------------------------------------*) else let val ((id,ent),(a2,q2)) = parseGenRef dtd (c1,a1,q1) in case ent of GE_NULL => let val a3 = hookGenRef(a2,((getPos q,getPos q2),id,ent,false)) in (getChar(a3,q2)) end | GE_INTERN(_,rep) => let val q3 = pushIntern(q2,id,false,rep) val a3 = hookGenRef(a2,((getPos q,getPos q2),id,ent,true)) in (getChar(a3,q3)) end | GE_EXTERN ext => if !O_VALIDATE orelse !O_INCLUDE_EXT_PARSED then let val a3 = hookGenRef(a2,((getPos q,getPos q2),id,ent,true)) val caq4 = #3(openExtern (id,false,resolveExtId ext) (a3,q2)) handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a2 = hookError(a,(getPos q2,err)) val a3 = hookEntEnd(a2,getPos q2) in (getChar(a3,q2)) end in caq4 end else let val a3 = hookGenRef(a2,((getPos q,getPos q2),id,ent,false)) in getChar(a3,q2) end | GE_UNPARSED _ => raise InternalError (THIS_MODULE,"parseElementContent", "parseGenRef returned GE_UNPARSED") end (*-------------------------------------------------------*) (* handle any errors in references by ignoring them. *) (*-------------------------------------------------------*) handle SyntaxError caq => caq | NoSuchEntity aq => getChar aq (*--------------------------------------------------------------*) (* handle an end-tag. finish the element in the user data and *) (* return. *) (* *) (* print an error if the element's content is not yet finished. *) (* print an error if the end-tag is for another element. *) (* print an error if the element's first character was not in *) (* the same entity. *) (*--------------------------------------------------------------*) and do_etag (p,etag as (elem,space,startPos,endPos),(c,a,q)) = let fun checkNesting a = if getEntId q=startEnt then a else hookError(a,(startPos,ERR_ELEM_ENT_NESTING(Index2Element dtd curr))) in if elem=curr then let val a1 = fin_elem (a,startPos,dfa,p) val a2 = checkNesting a1 val a3 = hookEndTag (a2,((startPos,endPos),curr,SOME(elem,space))) in (NONE,(c,a3,q)) end else if member elem openElems then let val err = ERR_OMITTED_END_TAG(Index2Element dtd curr) val a1 = hookError(a,(startPos,err)) val a2 = fin_elem (a1,startPos,dfa,p) val a3 = hookEndTag(a2,((startPos,endPos),curr,NONE)) in (SOME etag,(c,a3,q)) end else if dfaFinal(dfa,p) then let val err = ERR_ELEM_TYPE_MATCH(Index2Element dtd curr, Index2Element dtd elem) val a1 = hookError(a,(startPos,err)) val a2 = checkNesting a1 val a3 = hookEndTag(a2,((startPos,endPos),curr,SOME(elem,space))) in (NONE,(c,a3,q)) end else let val err = ERR_IGNORED_END_TAG(Index2Element dtd curr, Index2Element dtd elem) val a1 = hookError(a,(startPos,err)) in do_elem(p,(c,a1,q)) end end (*--------------------------------------------------------------*) (* handle a declaration, proc. instr or tag. *) (*--------------------------------------------------------------*) and do_lt (p,q,(c1,a1,q1)) = case c1 of 0wx21 (* #"!" *) => (*------------------------------------------------------*) (* its a declaration, cdata section or comment. *) (* Only comments are valid. *) (*------------------------------------------------------*) let val (c2,a2,q2) = getChar(a1,q1) val caq3 = case c2 of 0wx2D (* #"-" *) => let val (c3,a3,q3) = getChar(a2,q2) in if c3=0wx2D then parseComment (getPos q) (a3,q3) else let val err = ERR_EXPECTED(expDash,[c3]) val a4 = hookError(a3,(getPos q3,err)) in recoverDecl false (c3,a4,q3) end end | 0wx5B (* #"[" *) => let val a3 = hookError(a2,(getPos q2,ERR_ELEM_CONTENT IT_CDATA)) in skipBadSection (getChar(a3,q2)) end | _ => (c2,hookError(a2,(getPos q2,ERR_EXPECTED(expDash,[c2]))),q2) in do_elem(p,caq3) end | 0wx2F (* #"/" *) => (let val (elem,space,endPos,caq2) = parseETag dtd (a1,q1) in do_etag (p,(elem,space,getPos q,endPos),caq2) end handle SyntaxError caq => do_elem(p,caq)) | 0wx3F (* #"?" *) => do_elem (p,parseProcInstr (getPos q) (a1,q1)) | _ => (*------------------------------------------------------*) (* it's a start tag. the recursive call to parseElement *) (* might return an end-tag that has to be consumed. *) (*------------------------------------------------------*) if isNms c1 then let val (p1,(opt,caq2)) = (let val (stag as ((_,elem,_,_,_),_),(c2,a2,q2)) = parseSTag dtd (getPos q) (c1,a1,q1) val (p1,a3) = trans_elem (a2,q1,dfa,p,elem) in (p1,parseElement (dtd,curr::openElems,q,stag,(c2,a3,q2))) end) handle SyntaxError caq => (p,(NONE,caq)) in case opt of NONE => do_elem (p1,caq2) | SOME etag => do_etag (p1,etag,caq2) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR 0wx3C,LOC_CONTENT) val a2 = hookError(a1,(getPos q,err)) in do_elem (p,(c1,a2,q1)) end (*--------------------------------------------------------------*) (* do element content. handle the document end by printing an *) (* error and finishing like with an end-tag. *) (*--------------------------------------------------------------*) and do_elem (p,(c,a,q)) = case c of 0wx00 => if isSpecial q then let val err = ERR_OMITTED_END_TAG(Index2Element dtd curr) val a1 = hookError(a,(getPos q,err)) val pos = getPos q val a2 = fin_elem (a1,pos,dfa,p) val a3 = hookEndTag(a2,((pos,pos),curr,NONE)) in (NONE,(c,a3,q)) end else let val a1 = hookEntEnd(a,getPos q) in do_elem (p,getChar(a1,q)) end | 0wx26 (* #"&" *) => do_elem (p,do_ref (q,getChar(a,q))) | 0wx3C (* #"<" *) => do_lt (p,q,getChar(a,q)) | _ => do_elem (p,do_char_elem (c,a,q)) (*--------------------------------------------------------------*) (* do empty content. if the first thing to come is the current *) (* element's end-tag, finish it. Otherwise print an error and *) (* continue as for element content. *) (*--------------------------------------------------------------*) and do_empty (c,a,q) = if c<>0wx3C (* #"<" *) then let val a1 = hookError(a,(getPos q,ERR_NONEMPTY(Index2Element dtd curr))) in do_elem (dfaInitial,(c,a1,q)) end else let val (c1,a1,q1) = getChar(a,q) in if c1<>0wx2F (* #"/" *) then let val err = ERR_NONEMPTY(Index2Element dtd curr) val a2 = hookError(a1,(getPos q,err)) in do_lt (dfaInitial,q,(c1,a2,q1)) end else let val (elem,space,endPos,caq2) = parseETag dtd (a1,q1) in do_etag (dfaInitial,(elem,space,getPos q,endPos),caq2) end handle SyntaxError caq => do_elem (dfaInitial,caq) end in if mt then do_empty caq else do_elem (dfaInitial,caq) end (*--------------------------------------------------------------------*) (* parse mixed or any content. The second arg holds the unique number *) (* of the element's first characters's entity, the idx of the current *) (* element, and a function for validating child elements. Cf. 3: *) (* *) (* [39] element ::= EmptyElemTag *) (* | STag content ETag *) (* ... *) (* Well-Formedness Constraint: Element Type Match *) (* The Name in an element's end-tag must match the element type in *) (* the start-tag. *) (* *) (* Validity Constraint: Element Valid *) (* An element is valid if there is a declaration matching *) (* elementdecl where the Name matches the element type, and one of *) (* the following holds: *) (* ... *) (* 3. The declaration matches Mixed and the content consists of *) (* character data and child elements whose types match names in *) (* the content model. *) (* 4. The declaration matches ANY, and the types of any child *) (* elements have been declared. *) (* *) (* 3.1: *) (* *) (* [43] content ::= (element | CharData | Reference | CDSect | PI *) (* | Comment)* *) (* 2.4: *) (* The ampersand character (&) and the left angle bracket (<) may *) (* appear in their literal form only when used as markup delimiters,*) (* or within a comment, a processing instruction, or a CDATA *) (* section... If they are needed elsewhere, they must be escaped *) (* using either numeric character references or the strings "&" *) (* and "<" respectively. The right angle bracket (>) may be *) (* represented using the string ">", and must, for compatibility,*) (* be escaped using ">" or a character reference when it appears *) (* in the string "]]>" in content, when that string is not marking *) (* the end of a CDATA section. *) (* *) (* consume the content of the element, accumulating it via the user *) (* data functions (parameter a in subfunctions). for each child, *) (* check whether it was specified in the element's Mixed content *) (* specification (validate). finish at the first end-tag, whether *) (* matching or not, or at the document end. *) (* *) (* handle all syntax and other recoverable errors from subfunctions *) (* and try to continue. *) (* *) (* return the accumulated user data and the next char and state. *) (*--------------------------------------------------------------------*) (* might raise: none *) (*--------------------------------------------------------------------*) and parseMixedContent dtd (openElems,startEnt,curr,validate) caq = let (*--------------------------------------------------------------*) (* read data characters until the next "<", "&" or entity end. *) (* add the data to the user data when an error occurs or no *) (* more data follows. *) (* *) (* return the modified user data with the next char and state. *) (*--------------------------------------------------------------*) fun do_data (br,(c0,a0,q0)) = let val pos0 = ref (getPos q0) val _ = Array.update(dataBuffer,0,c0) fun data_hook (i,(a,q)) = hookData(a,((!pos0,getPos q),Array.extract(dataBuffer,0,SOME i),false)) fun takeOne (c,qE,i,aq as (a,q)) = if i (c1,data_hook(i,(a1,q)),q1) | 0wx26 (* #"&" *) => (c1,data_hook(i,(a1,q)),q1) | 0wx3C (* #"<" *) => (c1,data_hook(i,(a1,q)),q1) | 0wx5D (* #"]" *) => do_br (n+1,takeOne(c1,q,i,(a1,q1))) | 0wx3E (* #">" *) => let val a2 = if n=1 then a1 else hookError(a1,(getPos q1,ERR_MUST_ESCAPE c1)) in doit (takeOne(c1,q,i,(a2,q1))) end | _ => doit (takeOne(c1,q,i,(a1,q1))) end and doit (i,aq as (_,q)) = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => (c1,data_hook(i,(a1,q)),q1) | 0wx26 (* #"&" *) => (c1,data_hook(i,(a1,q)),q1) | 0wx3C (* #"<" *) => (c1,data_hook(i,(a1,q)),q1) | 0wx5D (* #"]" *) => if !O_COMPATIBILITY then do_br (1,takeOne(c1,q,i,(a1,q1))) else doit (takeOne(c1,q,i,(a1,q1))) | _ => doit (takeOne(c1,q,i,(a1,q1))) end in if br then do_br (1,(1,(a0,q0))) else doit (1,(a0,q0)) end (* fun do_data (br,(c0,a0,q0)) = let fun data_hook (yet,(a,q)) = hookData(a,((getPos q0,getPos q),Data2Vector(rev yet),false)) fun do_br (n,yet,aq as (_,q)) = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => (c1,data_hook(yet,(a1,q)),q1) | 0wx26 (* #"&" *) => (c1,data_hook(yet,(a1,q)),q1) | 0wx3C (* #"<" *) => (c1,data_hook(yet,(a1,q)),q1) | 0wx5D (* #"]" *) => do_br (n+1,c1::yet,(a1,q1)) | 0wx3E (* #">" *) => let val a2 = if n=1 then a1 else hookError(a1,(getPos q1,ERR_MUST_ESCAPE c1)) in doit (c1::yet,(a2,q1)) end | _ => doit (c1::yet,(a1,q1)) end and doit (yet,aq as (_,q)) = let val (c1,a1,q1) = getChar aq in case c1 of 0wx00 => (c1,data_hook(yet,(a1,q)),q1) | 0wx26 (* #"&" *) => (c1,data_hook(yet,(a1,q)),q1) | 0wx3C (* #"<" *) => (c1,data_hook(yet,(a1,q)),q1) | 0wx5D (* #"]" *) => if !O_COMPATIBILITY then do_br (1,c1::yet,(a1,q1)) else doit (c1::yet,(a1,q1)) | _ => doit (c1::yet,(a1,q1)) end in if br then do_br (1,[0wx5D],(a0,q0)) else doit ([c0],(a0,q0)) end *) (*--------------------------------------------------------------*) (* consume a reference, handling errors by ignoring them. *) (*--------------------------------------------------------------*) fun do_ref (q0,(c,a,q)) = if c=0wx23 (* #"#" *) (*------------------------------------------------------*) (* it's a character reference. *) (*------------------------------------------------------*) then let val (cs,(ch,a1,q1)) = parseCharRefLit [0wx23,0wx26] (a,q) val cv = Data2Vector(rev cs) val a2 = hookCharRef(a1,((getPos q0,getPos q1),ch,cv)) in getChar(a2,q1) end handle SyntaxError caq => caq | NoSuchChar aq => getChar aq (*---------------------------------------------------------*) (* it's a general entity reference. *) (*---------------------------------------------------------*) else let val ((id,ent),(a1,q1)) = parseGenRef dtd (c,a,q) in case ent of GE_NULL => let val a2 = hookGenRef(a1,((getPos q0,getPos q1),id,ent,false)) in getChar(a2,q1) end | GE_INTERN(_,rep) => let val q2 = pushIntern(q1,id,false,rep) val a2 = hookGenRef(a1,((getPos q0,getPos q1),id,ent,true)) in getChar(a2,q2) end | GE_EXTERN ext => if !O_VALIDATE orelse !O_INCLUDE_EXT_PARSED then let val a2 = hookGenRef(a1,((getPos q0,getPos q1),id,ent,true)) val caq3 = #3(openExtern (id,false,resolveExtId ext) (a2,q1)) handle CantOpenFile(fmsg,a) => let val err = ERR_NO_SUCH_FILE fmsg val a1 = hookError(a,(getPos q1,err)) val a2 = hookEntEnd(a1,getPos q1) in (getChar(a2,q1)) end in caq3 end else let val a2 = hookGenRef(a1,((getPos q0,getPos q1),id,ent,false)) in getChar(a2,q1) end | GE_UNPARSED _ => raise InternalError ("THIS_MODULE","parseMixedContent", "parseGenRef returned GE_UNPARSED") end (*-------------------------------------------------------*) (* handle any errors in references by ignoring them. *) (*-------------------------------------------------------*) handle SyntaxError caq => caq | NoSuchEntity aq => getChar aq (*--------------------------------------------------------------*) (* handle an end-tag. finish the element in the user data and *) (* return. *) (* *) (* print an error if the element's content is not yet finished. *) (* print an error if the end-tag is for another element. *) (* print an error if the element's first character was not in *) (* the same entity. *) (*--------------------------------------------------------------*) and do_etag (etag as (elem,space,startPos,endPos),(c,a,q)) = let fun checkNesting a = if getEntId q=startEnt then a else hookError(a,(startPos,ERR_ELEM_ENT_NESTING(Index2Element dtd curr))) in if elem=curr then let val a1 = checkNesting a val a2 = hookEndTag (a1,((startPos,endPos),curr,SOME(elem,space))) in (NONE,(c,a2,q)) end else if member elem openElems then let val err = ERR_OMITTED_END_TAG(Index2Element dtd curr) val a1 = hookError(a,(startPos,err)) val a2 = hookEndTag(a1,((startPos,endPos),curr,NONE)) in (SOME etag,(c,a2,q)) end else let val err = ERR_ELEM_TYPE_MATCH(Index2Element dtd curr, Index2Element dtd elem) val a1 = hookError(a,(startPos,err)) val a2 = checkNesting a1 val a3 = hookEndTag(a2,((startPos,endPos),curr,SOME(elem,space))) in (NONE,(c,a3,q)) end end (*--------------------------------------------------------------*) (* handle a declaration, proc. instr or tag. If it is an end- *) (* tag, finish the element in the user data and return. *) (* *) (* print an error if the element's content is not yet finished. *) (* print an error if the end-tag is for another element. *) (* print an error if the element's first character was not in *) (* the same entity. *) (*--------------------------------------------------------------*) and do_lt (q,(c1,a1,q1)) = case c1 of 0wx21 (* #"!" *) => (*------------------------------------------------------*) (* its a declaration, cdata section or comment. *) (* Only comments and cdata sections are valid. *) (*------------------------------------------------------*) let val (c2,a2,q2) = getChar(a1,q1) val caq3 = case c2 of 0wx2D (* #"-" *) => let val (c3,a3,q3) = getChar(a2,q2) in if c3=0wx2D then parseComment (getPos q) (a3,q3) else let val err = ERR_EXPECTED(expDash,[c3]) val a4 = hookError(a3,(getPos q3,err)) in recoverDecl false (c3,a4,q3) end end | 0wx5B (* #"[" *) => parseCDataSection (getPos q) (a2,q2) | _ => (c2,hookError(a2,(getPos q2,ERR_EXPECTED(expDashLbrack,[c2]))),q2) in do_mixed caq3 end | 0wx2F (* #"/" *) => (let val (elem,space,endPos,caq2) = parseETag dtd (a1,q1) in do_etag ((elem,space,getPos q,endPos),caq2) end handle SyntaxError caq => do_mixed caq) | 0wx3F (* #"?" *) => do_mixed (parseProcInstr (getPos q) (a1,q1)) | _ => (*------------------------------------------------------*) (* it's a start tag. the recursive call to parseElement *) (* might return an end-tag that has to be consumed. *) (*------------------------------------------------------*) if isNms c1 then let val (opt,caq2) = (let val (stag as ((_,elem,_,_,_),_),(c2,a2,q2)) = parseSTag dtd (getPos q) (c1,a1,q1) val a3 = validate (a2,q1) elem in parseElement (dtd,curr::openElems,q,stag,(c2,a3,q2)) end handle SyntaxError caq => (NONE,caq)) in case opt of NONE => do_mixed caq2 | SOME etag => do_etag (etag,caq2) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR 0wx3C,LOC_CONTENT) val a2 = hookError(a1,(getPos q,err)) in do_mixed (c1,a2,q1) end (*--------------------------------------------------------------*) (* do mixed content. handle the document end by printing an *) (* error and finishing like with an end-tag. *) (*--------------------------------------------------------------*) and do_mixed (c,a,q) = case c of 0wx00 => if isSpecial q then let val err = ERR_OMITTED_END_TAG(Index2Element dtd curr) val a1 = hookError(a,(getPos q,err)) val pos = getPos q val a2 = hookEndTag(a1,((pos,pos),curr,NONE)) in (NONE,(c,a2,q)) end else let val a1 = hookEntEnd(a,getPos q) in do_mixed (getChar(a1,q)) end | 0wx26 (* #"&" *) => do_mixed (do_ref (q,getChar(a,q))) | 0wx3C (* #"<" *) => do_lt (q,getChar(a,q)) | 0wx5D => do_mixed (do_data (!O_COMPATIBILITY,(c,a,q))) | _ => do_mixed (do_data (false,(c,a,q))) in do_mixed caq end (*--------------------------------------------------------------------*) (* parse an element, the start tag already read. the second arg holds *) (* the number of the entity of the start-tag's first char, and the *) (* start-tag information. The 1st arg is the start value for the user *) (* data. 3: *) (* *) (* [39] element ::= EmptyElemTag *) (* | STag content ETag *) (* and 3.1: *) (* *) (* Empty-element tags may be used for any element which has no *) (* content, whether or not it is declared using the keyword EMPTY. *) (* For interoperability, the empty-element tag must be used, and *) (* can only be used, for elements which are declared EMPTY. *) (*--------------------------------------------------------------------*) and parseElement (dtd,openElems,q0,(stag as (_,curr,_,_,mt),elemInfo),(c,a,q)) = let (*--------------------------------------------------------------*) (* validate whether an element is allowed in mixed/any content. *) (*--------------------------------------------------------------*) fun trans_any (a,_) _ = a fun trans_mixed is (a,q) i = if member i is then a else let val err = ERR_BAD_ELEM(Index2Element dtd curr,Index2Element dtd i) in hookError(a,(getPos q,err)) end in (*-----------------------------------------------------------*) (* For empty-element tags, verify that the element's declar. *) (* allows empty content. *) (*-----------------------------------------------------------*) if mt then let val a1 = if not (!O_VALIDATE andalso hasDtd dtd) then a else case #decl elemInfo of (SOME(CT_EMPTY,_)) => a | (SOME(CT_ELEMENT(_,dfa),_)) => if not (dfaFinal(dfa,dfaInitial)) then hookError(a,(getPos q0,ERR_EMPTY_TAG(Index2Element dtd curr))) else if not (!O_INTEROPERABILITY) then a else hookError (a,(getPos q0,ERR_EMPTY_TAG_INTER (Index2Element dtd curr))) | _ => if not (!O_INTEROPERABILITY) then a else hookError(a,(getPos q0,ERR_EMPTY_TAG_INTER (Index2Element dtd curr))) in (NONE,(c,hookStartTag(a1,stag),q)) end (*-----------------------------------------------------------*) (* for normal start-tags, check whether the element's decl. *) (* requires an empty-element tag, or empty content, then *) (* call the appropriate function that parses the content. *) (*-----------------------------------------------------------*) else let val startEnt = getEntId q0 in if !O_VALIDATE then case getOpt(#decl elemInfo,(CT_ANY,false)) of (CT_ANY,_) => parseMixedContent dtd (openElems,startEnt,curr,trans_any) (c,hookStartTag(a,stag),q) | (CT_MIXED is,_) => parseMixedContent dtd (openElems,startEnt,curr,trans_mixed is) (c,hookStartTag(a,stag),q) | (CT_ELEMENT(_,dfa),ext) => parseElementContent dtd (openElems,startEnt,curr,dfa,ext,false) (c,hookStartTag(a,stag),q) | (CT_EMPTY,_) => let val a1 = if not (!O_INTEROPERABILITY) then a else let val err = ERR_MUST_BE_EMPTY(Index2Element dtd curr) in hookError(a,(getPos q0,err)) end val a2 = hookStartTag(a1,stag) in parseElementContent dtd (openElems,startEnt,curr,emptyDfa,false,true) (c,a2,q) end else parseMixedContent dtd (openElems,startEnt,curr,trans_any) (c,hookStartTag(a,stag),q) end end end (* stop of ../../Parser/Parse/parseContent.sml *) (* start of ../../Parser/Parse/parseDocument.sml *) (*--------------------------------------------------------------------------*) (* Structure: ParseDocument *) (* *) (* Exceptions raised by functions in this structure: *) (* parseDocTypeDecl : none *) (*--------------------------------------------------------------------------*) functor Parse (structure Dtd : Dtd structure Hooks : Hooks structure Resolve : Resolve structure ParserOptions : ParserOptions) : sig val parseDocument : Uri.Uri option -> Dtd.Dtd option -> Hooks.AppData -> Hooks.AppFinal end = struct structure ParseBase = ParseBase (structure Dtd = Dtd structure Hooks = Hooks structure Resolve = Resolve structure ParserOptions = ParserOptions) structure ParseContent = ParseContent (structure ParseBase = ParseBase) open Base UniChar Errors UniClasses Uri ParseContent val THIS_MODULE = "ParseContent" datatype Where = PROLOG | EPILOG | INSTANCE of int option fun locOf wher = case wher of PROLOG => LOC_PROLOG | INSTANCE _ => LOC_PROLOG | EPILOG => LOC_EPILOG fun checkRoot dtd (a,q) (doc,stag as ((_,elem,_,_,_),_)) = if !O_VALIDATE then case doc of NONE => a | SOME doc => if doc=elem then a else let val err = ERR_ROOT_ELEM(Index2Element dtd doc, Index2Element dtd elem) in hookError(a,(getPos q,err)) end else a fun parseDoc dtd caq = let fun do_data wher caq = let fun doit hadError ws (c,a,q) = case c of 0wx00 => (ws,(c,a,q)) | 0wx26 (* #"&" *) => (ws,(c,a,q)) | 0wx3C (* #"<" *) => (ws,(c,a,q)) | 0wx09 (* #"\t"*) => doit hadError (c::ws) (getChar(a,q)) | 0wx0A (* #"\n"*) => doit hadError (c::ws) (getChar(a,q)) | 0wx20 (* #" " *) => doit hadError (c::ws) (getChar(a,q)) | _ => let val a1 = if hadError then a else hookError(a,(getPos q,ERR_FORBIDDEN_HERE (IT_DATA nil,locOf wher))) in doit true ws (getChar(a1,q)) end val (ws,(c1,a1,q1)) = doit false nil caq val a2 = if null ws then a1 else hookWhite(a1,Data2Vector (rev ws)) in (c1,a2,q1) end fun do_decl wher q0 (c,a,q) = case c of 0wx2D (* #"-" *) => let val (c1,a1,q1) = getChar(a,q) in if c1=0wx2D then (wher,parseComment (getPos q0) (a1,q1)) else let val err = ERR_EXPECTED(expDash,[c1]) val a2 = hookError(a1,(getPos q1,err)) val caq2 = recoverDecl false (c1,a2,q1) in (wher,caq2) end end | 0wx5B (* #"[" *) => let val err = ERR_FORBIDDEN_HERE (IT_CDATA,locOf wher) val a1 = hookError(a,(getPos q0,err)) val caq2 = skipBadSection (getChar(a1,q)) in (wher,caq2) end | _ => case wher of PROLOG => (let val (name,(c1,a1,q1)) = parseName (c,a,q) handle NotFound (c,a,q) => let val err = expectedOrEnded(expDashDocLbrk,LOC_DECL) c in raise SyntaxError (c,hookError(a,(getPos q,err)),q) end val _ = if name=[0wx44,0wx4f,0wx43,0wx54,0wx59,0wx50,0wx45] (* "DOCTYPE" *) then () else let val err = ERR_EXPECTED(expDashDocLbrk,name) val a2 = hookError(a1,(getPos q,err)) in raise SyntaxError (c1,a2,q1) end val (doc,caq2) = parseDocTypeDecl dtd (c1,a1,q1) in (INSTANCE doc,caq2) end handle SyntaxError caq => (PROLOG,recoverDecl true caq)) | _ => let val loc = if wher=EPILOG then LOC_EPILOG else LOC_AFTER_DTD val err = ERR_FORBIDDEN_HERE (IT_DECL,loc) val a1 = hookError(a,(getPos q0,err)) val caq2 = skipDecl true (c,a1,q) in (wher,caq2) end and doit wher (c,a,q) = case c of 0wx00 => if isSpecial q then (wher,(a,q)) else doit wher (getChar(a,q)) (*--------------------------------------------------------------*) (* References are forbidden outside the document element *) (*--------------------------------------------------------------*) | 0wx26 (* #"&" *) => let val (c1,a1,q1) = getChar(a,q) val caq2 = if c1=0wx23 (* #"#" *) then let val err = ERR_FORBIDDEN_HERE(IT_CHAR_REF,locOf wher) val a2 = hookError(a1,(getPos q,err)) in skipCharRef (a2,q1) end else let val err = ERR_FORBIDDEN_HERE(IT_REF,locOf wher) val a2 = hookError(a1,(getPos q,err)) in skipReference (c1,a2,q1) end in doit wher caq2 end | 0wx3C (* #"<" *) => let val (c1,a1,q1) = getChar (a,q) in case c1 of 0wx21 (* #"!" *) => let val (wher1,caq2) = do_decl wher q (getChar(a1,q1)) in doit wher1 caq2 end | 0wx2F (* #"/" *) => let val err = ERR_FORBIDDEN_HERE(IT_ETAG,locOf wher) val a2 = hookError(a1,(getPos q,err)) val caq3 = skipTag LOC_ETAG (a2,q1) in doit wher caq3 end | 0wx3F (* #"?" *) => doit wher (parseProcInstr (getPos q) (a1,q1)) | _ => if isName c1 then let val wher1 = case wher of PROLOG => INSTANCE NONE | _ => wher in case wher1 of PROLOG => raise InternalError(THIS_MODULE,"parseDoc.doit","") | EPILOG => let val err = ERR_FORBIDDEN_HERE(IT_STAG,LOC_EPILOG) val a2 = hookError(a1,(getPos q,err)) val caq3 = skipTag LOC_STAG (a2,q1) in doit EPILOG caq3 end | INSTANCE doc => (let val a2 = if not (!O_VALIDATE) orelse isSome doc then a1 else hookError(a1,(getPos q,ERR_NO_DTD)) val (stag,(c3,a3,q3)) = parseSTag dtd (getPos q) (c1,a2,q1) val a4 = checkRoot dtd (a3,q1) (doc,stag) val (opt,(c5,a5,q5)) = parseElement (dtd,nil,q,stag,(c3,a4,q3)) val a6 = checkDefinedIds dtd (a5,q5) in case opt of NONE => doit EPILOG (c5,a6,q5) | SOME (_,_,startPos,_) => let val err = ERR_FORBIDDEN_HERE(IT_ETAG,LOC_EPILOG) val a7 = hookError(a6,(startPos,err)) in doit EPILOG (c5,a7,q5) end end handle SyntaxError caq => doit wher1 caq) end else let val err = ERR_FORBIDDEN_HERE(IT_CHAR 0wx3C,locOf wher) val a2 = hookError(a1,(getPos q,err)) in doit wher (c1,a2,q1) end end | _ => let val caq1 = do_data wher (c,a,q) in doit wher caq1 end in doit PROLOG caq end (* to false. (cf. 2.9) *) (* *) (* ... If ... there is no standalone document declaration, the *) (* value "no" is assumed. *) fun parseDocument uriOpt dtdOpt a = let val dtd = case dtdOpt of NONE => initDtdTables () | SOME dtd => dtd val (enc,xmlDecl,(c1,a1,q1)) = openDocument uriOpt a val uri = getUri q1 val alone = case xmlDecl of (SOME(_,_,SOME sa)) => sa | _ => false val _ = if alone then setStandAlone dtd true else () val a2 = hookXml(a1,(uri,enc,xmlDecl)) val (wher,(a3,q3)) = parseDoc dtd (c1,a2,q1) val _ = closeAll q3 val a4 = case wher of EPILOG => a3 | _ => hookError(a3,(getPos q3,ERR_ENDED_IN_PROLOG)) in hookFinish a4 end handle CantOpenFile(fmsg,a) => let val a1 = hookError(a,(nullPosition,ERR_NO_SUCH_FILE fmsg)) in hookFinish a1 end end (* stop of ../../Parser/Parse/parseDocument.sml *) (* start of ../../Catalog/catError.sml *) signature CatError = sig type Position val nullPosition : Position val Position2String : Position -> string datatype Location = LOC_CATALOG | LOC_COMMENT | LOC_NOCOMMENT | LOC_PUBID | LOC_SYSID datatype Expected = EXP_NAME | EXP_LITERAL datatype CatError = ERR_DECODE_ERROR of Decode.Error.DecodeError | ERR_NO_SUCH_FILE of string * string | ERR_ILLEGAL_HERE of UniChar.Char * Location | ERR_MISSING_WHITE | ERR_EOF of Location | ERR_EXPECTED of Expected * UniChar.Char | ERR_XML of Errors.Error | ERR_MISSING_ATT of UniChar.Data * UniChar.Data | ERR_NON_PUBID of UniChar.Data * UniChar.Data val catMessage : CatError -> string list end structure CatError : CatError = struct open Errors UtilError UtilString type Position = string * int * int val nullPosition = ("",0,0) fun Position2String (fname,l,c) = if fname="" then "" else String.concat ["[",fname,":",Int2String l,".",Int2String c,"]"] datatype Location = LOC_CATALOG | LOC_COMMENT | LOC_NOCOMMENT | LOC_PUBID | LOC_SYSID fun Location2String loc = case loc of LOC_CATALOG => "catalog file" | LOC_COMMENT => "comment" | LOC_NOCOMMENT => "something other than a comment" | LOC_PUBID => "public identifier" | LOC_SYSID => "system identifier" fun InLocation2String loc = case loc of LOC_CATALOG => "in a catalog file" | LOC_COMMENT => "in a comment" | LOC_NOCOMMENT => "outside of comments" | LOC_PUBID => "in a public identifier" | LOC_SYSID => "in a system identifier" datatype Expected = EXP_NAME | EXP_LITERAL fun Expected2String exp = case exp of EXP_NAME => "a name" | EXP_LITERAL => "a literal" datatype CatError = ERR_DECODE_ERROR of Decode.Error.DecodeError | ERR_NO_SUCH_FILE of string * string | ERR_ILLEGAL_HERE of UniChar.Char * Location | ERR_MISSING_WHITE | ERR_EOF of Location | ERR_EXPECTED of Expected * UniChar.Char | ERR_XML of Error | ERR_MISSING_ATT of UniChar.Data * UniChar.Data | ERR_NON_PUBID of UniChar.Data * UniChar.Data fun catMessage err = case err of ERR_DECODE_ERROR err => Decode.Error.decodeMessage err | ERR_NO_SUCH_FILE(f,msg) => ["Could not open file",quoteErrorString f,"("^msg^")"] | ERR_ILLEGAL_HERE (c,loc) => ["Character",quoteErrorChar c,"is not allowed",InLocation2String loc] | ERR_MISSING_WHITE => ["Missing white space"] | ERR_EOF loc => [toUpperFirst (Location2String loc),"ended by end of file"] | ERR_EXPECTED (exp,c) => ["Expected",Expected2String exp,"but found",quoteErrorChar c] | ERR_XML err => errorMessage err | ERR_MISSING_ATT(elem,att) => ["Element",quoteErrorData elem,"has no",quoteErrorData att,"attribute"] | ERR_NON_PUBID(att,cs) => ["Value specified for attribute",quoteErrorData att,"contains non-PublicId", case cs of [c] => "character"^quoteErrorChar c | cs => List2xString ("characters ",", ","") quoteErrorChar cs] end (* stop of ../../Catalog/catError.sml *) (* start of ../../Catalog/catParams.sml *) signature CatParams = sig val O_CATALOG_FILES : Uri.Uri list ref val O_PREFER_SOCAT : bool ref val O_PREFER_SYSID : bool ref val O_PREFER_CATALOG : bool ref val O_SUPPORT_REMAP : bool ref val O_CATALOG_ENC : Encoding.Encoding ref val catError : CatError.Position * CatError.CatError -> unit end (* stop of ../../Catalog/catParams.sml *) (* start of ../../Unicode/Uri/uriDict.sml *) structure KeyUri : Key = struct type Key = Uri.Uri val null = Uri.emptyUri val compare = Uri.compareUri val toString = Uri.Uri2String val hash = Uri.hashUri end structure UriDict = Dict (structure Key = KeyUri) (* stop of ../../Unicode/Uri/uriDict.sml *) (* start of ../../Catalog/catData.sml *) structure CatData = struct datatype CatEntry = E_BASE of Uri.Uri | E_DELEGATE of string * Uri.Uri | E_EXTEND of Uri.Uri | E_MAP of string * Uri.Uri | E_REMAP of Uri.Uri * Uri.Uri type Catalog = Uri.Uri * CatEntry list end (* stop of ../../Catalog/catData.sml *) (* start of ../../Catalog/catFile.sml *) signature CatFile = sig type CatFile type Position val catOpenFile : Uri.Uri -> CatFile val catCloseFile : CatFile -> unit val catGetChar : CatFile -> UniChar.Char * CatFile val catPos : CatFile -> CatError.Position end functor CatFile ( structure Params : CatParams ) : CatFile = struct open UniChar CatError Decode Params Uri UtilError (* column, line, break *) type PosInfo = int * int * bool val startPos = (0,1,false) datatype CatFile = NOFILE of string * PosInfo | DIRECT of DecFile * PosInfo fun catPos cf = case cf of NOFILE (uri,(col,line,_)) => (uri,line,col) | DIRECT (dec,(col,line,_)) => (decName dec,line,col) fun catOpenFile uri = let val dec = decOpenUni(SOME uri,!O_CATALOG_ENC) in DIRECT(dec,startPos) end handle NoSuchFile fmsg => let val _ = catError(nullPosition,ERR_NO_SUCH_FILE fmsg) in NOFILE(Uri2String uri,startPos) end fun catCloseFile cf = case cf of NOFILE _ => () | DIRECT(dec,_) => ignore (decClose dec) fun catGetChar cf = case cf of NOFILE _ => (0wx00,cf) | DIRECT(dec,(col,line,brk)) => (let val (c,dec1) = decGetChar dec in case c of 0wx09 => (c,DIRECT(dec1,(col+1,line,false))) | 0wx0A => if brk then catGetChar(DIRECT(dec1,(col,line,false))) else (c,DIRECT(dec1,(0,line+1,false))) | 0wx0D => (0wx0A,DIRECT(dec1,(0,line+1,true))) | _ => if c>=0wx20 then (c,DIRECT(dec1,(col+1,line,false))) else let val err = ERR_ILLEGAL_HERE(c,LOC_CATALOG) val _ = catError(catPos cf,err) in catGetChar(DIRECT(dec1,(col+1,line,false))) end end handle DecEof dec => (0wx00,NOFILE(decName dec,(col,line,brk))) | DecError(dec,_,err) => let val _ = catError(catPos cf,ERR_DECODE_ERROR err) in catGetChar(DIRECT(dec,(col,line,false))) end ) end (* stop of ../../Catalog/catFile.sml *) (* start of ../../Catalog/socatParse.sml *) signature SocatParse = sig val parseSoCat : Uri.Uri -> CatData.Catalog end functor SocatParse ( structure Params : CatParams ) : SocatParse = struct structure CatFile = CatFile ( structure Params = Params ) open CatData CatError CatFile Params UniChar UniClasses Uri exception SyntaxError of UniChar.Char * CatFile.CatFile exception NotFound of UniChar.Char * CatFile.CatFile val getChar = catGetChar fun parseName' (c,f) = if isName c then let val (cs,cf1) = parseName' (getChar f) in (c::cs,cf1) end else (nil,(c,f)) fun parseName (c,f) = if isNms c then let val (cs,cf1) = parseName' (getChar f) in (c::cs,cf1) end else raise NotFound (c,f) datatype Keyword = KW_BASE | KW_CATALOG | KW_DELEGATE | KW_PUBLIC | KW_SYSTEM | KW_OTHER of UniChar.Data fun parseKeyword cf = let val (name,cf1) = parseName cf val kw = case name of [0wx42,0wx41,0wx53,0wx45] => KW_BASE | [0wx43,0wx41,0wx54,0wx41,0wx4c,0wx4f,0wx47] => KW_CATALOG | [0wx44,0wx45,0wx4c,0wx45,0wx47,0wx41,0wx54,0wx45] => KW_DELEGATE | [0wx50,0wx55,0wx42,0wx4c,0wx49,0wx43] => KW_PUBLIC | [0wx53,0wx59,0wx53,0wx54,0wx45,0wx4d] => KW_SYSTEM | _ => KW_OTHER name in (kw,cf1) end fun parseSysLit' quote f = let fun doit text (c,f) = if c=quote then (text,getChar f) else if c<>0wx0 then doit (c::text) (getChar f) else let val _ = catError(catPos f,ERR_EOF LOC_SYSID) in (text,(c,f)) end val (text,cf1) = doit nil (getChar f) in (Data2Uri(rev text),cf1) end fun parseSysLit req (c,f) = if c=0wx22 orelse c=0wx27 then parseSysLit' c f else if req then let val _ = catError(catPos f,ERR_EXPECTED(EXP_LITERAL,c)) in raise SyntaxError (c,f) end else raise NotFound (c,f) fun parsePubLit' quote f = let fun doit (hadSpace,atStart,text) (c,f) = case c of 0wx0 => let val _ = catError(catPos f,ERR_EOF LOC_PUBID) in (text,(c,f)) end | 0wx0A => doit (true,atStart,text) (getChar f) | 0wx20 => doit (true,atStart,text) (getChar f) | _ => if c=quote then (text,getChar f) else if isPubid c then if hadSpace andalso not atStart then doit (false,false,c::0wx20::text) (getChar f) else doit (false,false,c::text) (getChar f) else let val _ = catError(catPos f,ERR_ILLEGAL_HERE(c,LOC_PUBID)) in doit (hadSpace,atStart,text) (getChar f) end val (text,cf1) = doit (false,true,nil) (getChar f) in (Latin2String(rev text),cf1) end fun parsePubLit (c,f) = if c=0wx22 orelse c=0wx27 then parsePubLit' c f else let val _ = catError(catPos f,ERR_EXPECTED(EXP_LITERAL,c)) in raise SyntaxError (c,f) end fun skipComment (c,f) = case c of 0wx00 => let val _ = catError(catPos f,ERR_EOF LOC_COMMENT) in (c,f) end | 0wx2D => let val (c1,f1) = getChar f in if c1 = 0wx2D then (getChar f1) else skipComment (c1,f1) end | _ => skipComment (getChar f) fun skipCopt (c,f) = case c of 0wx00 => (c,f) | 0wx2D => let val (c1,f1) = getChar f in if c1=0wx2D then skipComment (getChar f1) else let val _ = catError(catPos f,ERR_ILLEGAL_HERE(c,LOC_NOCOMMENT)) in (c1,f1) end end | _ => (c,f) fun skipScomm req0 cf = let fun endit req (c,f) = if req andalso c<>0wx00 then let val _ = catError(catPos f,ERR_MISSING_WHITE) in (c,f) end else (c,f) fun doit req (c,f) = case c of 0wx00 => endit req (c,f) | 0wx09 => doit false (getChar f) | 0wx0A => doit false (getChar f) | 0wx20 => doit false (getChar f) | 0wx22 => endit req (c,f) | 0wx27 => endit req (c,f) | 0wx2D => let val (c1,f1) = getChar f in if c1=0wx2D then let val _ = if not req then () else catError(catPos f1,ERR_MISSING_WHITE) val cf1 = skipComment (getChar f1) in doit true cf1 end else let val _ = catError(catPos f,ERR_ILLEGAL_HERE(c,LOC_NOCOMMENT)) in doit req (c1,f1) end end | _ => if isNms c then endit req (c,f) else let val _ = catError(catPos f,ERR_ILLEGAL_HERE(c,LOC_NOCOMMENT)) in doit req (getChar f) end in doit req0 cf end val skipWS = skipScomm true val skipCommWS = (skipScomm false) o skipCopt val skipWSComm = skipScomm false fun skipOther cf = let val cf1 = skipWS cf val cf2 = let val (_,cf') = parseName cf1 in skipWS cf' end handle NotFound cf => cf fun doit cf = let val (_,cf1) = parseSysLit false cf in doit (skipWS cf1) end handle NotFound(c,f) => (c,f) in (NONE,doit cf2) end fun parseBase cf = let val cf1 = skipWS cf val (lit,cf2) = parseSysLit true cf1 val cf3 = skipWS cf2 in (SOME(E_BASE lit),cf3) end fun parseExtend cf = let val cf1 = skipWS cf val (lit,cf2) = parseSysLit true cf1 val cf3 = skipWS cf2 in (SOME(E_EXTEND lit),cf3) end fun parseDelegate cf = let val cf1 = skipWS cf val (pub,cf2) = parsePubLit cf1 val cf3 = skipWS cf2 val (sys,cf4) = parseSysLit true cf3 val cf5 = skipWS cf4 in (SOME(E_DELEGATE(pub,sys)),cf5) end fun parseRemap cf = let val cf1 = skipWS cf val (sys0,cf2) = parseSysLit true cf1 val cf3 = skipWS cf2 val (sys,cf4) = parseSysLit true cf3 val cf5 = skipWS cf4 in (SOME(E_REMAP(sys0,sys)),cf5) end fun parseMap cf = let val cf1 = skipWS cf val (pub,cf2) = parsePubLit cf1 val cf3 = skipWS cf2 val (sys,cf4) = parseSysLit true cf3 val cf5 = skipWS cf4 in (SOME(E_MAP(pub,sys)),cf5) end fun recover cf = let fun do_lit q (c,f) = if c=0wx00 then (c,f) else if c=q then getChar f else do_lit q (getChar f) fun do_com (c,f) = case c of 0wx00 => (c,f) | 0wx2D => let val (c1,f1) = getChar f in if c1=0wx2D then getChar f1 else do_com (c1,f1) end | _ => do_com (getChar f) fun doit (c,f) = case c of 0wx00 => (c,f) | 0wx22 => doit (do_lit c (getChar f)) | 0wx27 => doit (do_lit c (getChar f)) | 0wx2D => let val (c1,f1) = getChar f in if c1=0wx2D then doit (do_com (getChar f1)) else doit (c1,f1) end | _ => if isNms c then (c,f) else doit (getChar f) in doit cf end fun parseEntry (cf as (c,f)) = let val (kw,cf1) = parseKeyword cf handle NotFound cf => raise SyntaxError cf in case kw of KW_BASE => parseBase cf1 | KW_CATALOG => parseExtend cf1 | KW_DELEGATE => parseDelegate cf1 | KW_SYSTEM => parseRemap cf1 | KW_PUBLIC => parseMap cf1 | KW_OTHER _ => skipOther cf1 end handle SyntaxError cf => (NONE,recover cf) fun parseDocument cf = let fun doit (c,f) = if c=0wx0 then nil before catCloseFile f else let val (opt,cf1) = parseEntry (c,f) val entries = doit cf1 in case opt of NONE => entries | SOME entry => entry::entries end val cf1 = skipCommWS cf in doit cf1 end fun parseSoCat uri = let val f = catOpenFile uri val cf1 = getChar f in (uri,parseDocument cf1) end end (* stop of ../../Catalog/socatParse.sml *) (* start of ../../Catalog/catDtd.sml *) signature CatDtd = sig type Dtd val baseIdx : int val delegateIdx : int val extendIdx : int val mapIdx : int val remapIdx : int val hrefIdx : int val pubidIdx : int val sysidIdx : int val Index2AttNot : Dtd -> int -> UniChar.Data val Index2Element : Dtd -> int -> UniChar.Data end structure CatDtd = struct open Dtd val baseGi = UniChar.String2Data "Base" val delegateGi = UniChar.String2Data "Delegate" val extendGi = UniChar.String2Data "Extend" val mapGi = UniChar.String2Data "Map" val remapGi = UniChar.String2Data "Remap" val hrefAtt = UniChar.String2Data "HRef" val pubidAtt = UniChar.String2Data "PublicId" val sysidAtt = UniChar.String2Data "SystemId" fun initDtdTables () = let val dtd = Dtd.initDtdTables() val _ = app (ignore o (Element2Index dtd)) [baseGi,delegateGi,extendGi,mapGi,remapGi] val _ = app (ignore o (AttNot2Index dtd)) [hrefAtt,pubidAtt,sysidAtt] in dtd end local val dtd = initDtdTables() in val baseIdx = Element2Index dtd baseGi val delegateIdx = Element2Index dtd delegateGi val extendIdx = Element2Index dtd extendGi val mapIdx = Element2Index dtd mapGi val remapIdx = Element2Index dtd remapGi val hrefIdx = AttNot2Index dtd hrefAtt val pubidIdx = AttNot2Index dtd pubidAtt val sysidIdx = AttNot2Index dtd sysidAtt end end (* stop of ../../Catalog/catDtd.sml *) (* start of ../../Parser/Params/ignore.sml *) structure IgnoreHooks = struct type AppData = unit type AppFinal = unit fun hookXml(a,_) = a fun hookFinish a = a fun hookError(a,_) = a fun hookWarning(a,_) = a fun hookProcInst(a,_) = a fun hookComment(a,_) = a fun hookWhite(a,_) = a fun hookDecl (a,_) = a fun hookStartTag(a,_) = a fun hookEndTag(a,_) = a fun hookCData(a,_) = a fun hookData(a,_) = a fun hookCharRef(a,_) = a fun hookGenRef(a,_) = a fun hookParRef(a,_) = a fun hookEntEnd(a,_) = a fun hookDocType(a,_) = a fun hookSubset(a,_) = a fun hookExtSubset(a,_) = a fun hookEndDtd(a,_) = a end (* stop of ../../Parser/Params/ignore.sml *) (* start of ../../Catalog/catHooks.sml *) signature CatHooks = sig type AppData = CatData.CatEntry list val initCatHooks : unit -> AppData end functor CatHooks (structure Params : CatParams structure Dtd : CatDtd ) = struct open Dtd HookData IgnoreHooks Params UniChar UniClasses Uri UtilList CatData CatError type AppData = Dtd * CatEntry list type AppFinal = CatEntry list fun initCatHooks dtd = (dtd,nil) fun hookError (a,(pos,err)) = a before catError (pos,ERR_XML err) fun getAtt dtd (pos,elem,att,trans) atts = let val cvOpt = findAndMap (fn (i,ap,_) => if i<>att then NONE else case ap of AP_DEFAULT(_,cv,_) => SOME cv | AP_PRESENT(_,cv,_) => SOME cv | _ => NONE) atts in case cvOpt of SOME cv => trans (pos,att) cv | NONE => NONE before catError (pos,ERR_MISSING_ATT(Index2Element dtd elem,Index2AttNot dtd att)) end fun makePubid dtd (pos,att) cv = let val (cs,bad) = Vector.foldr (fn (c,(cs,bad)) => if isPubid c then (Char2char c::cs,bad) else (cs,c::bad)) (nil,nil) cv in if null bad then SOME(String.implode cs) else NONE before catError(pos,ERR_NON_PUBID(Index2AttNot dtd att,bad)) end fun makeUri (pos,att) cv = SOME cv fun hookStartTag (a as (dtd,items),((_,pos),elem,atts,_,_)) = if elem=baseIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts in case hrefOpt of NONE => a | SOME href => (dtd,E_BASE (Vector2Uri href)::items) end else if elem=delegateIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts val pubidOpt = getAtt dtd (pos,elem,pubidIdx,makePubid dtd) atts in case (hrefOpt,pubidOpt) of (SOME href,SOME pubid) => (dtd,E_DELEGATE(pubid,Vector2Uri href)::items) | _ => a end else if elem=extendIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts in case hrefOpt of NONE => a | SOME href => (dtd,E_EXTEND (Vector2Uri href)::items) end else if elem=mapIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts val pubidOpt = getAtt dtd (pos,elem,pubidIdx,makePubid dtd) atts in case (hrefOpt,pubidOpt) of (SOME href,SOME pubid) => (dtd,E_MAP(pubid,Vector2Uri href)::items) | _ => a end else if elem=remapIdx then let val hrefOpt = getAtt dtd (pos,elem,hrefIdx,makeUri) atts val sysidOpt = getAtt dtd (pos,elem,sysidIdx,makeUri) atts in case (hrefOpt,sysidOpt) of (SOME href,SOME sysid) => (dtd,E_REMAP(Vector2Uri sysid,Vector2Uri href)::items) | _ => a end else a fun hookFinish (_,items) = rev items end (* stop of ../../Catalog/catHooks.sml *) (* start of ../../Catalog/catParse.sml *) signature CatParse = sig val parseCatalog : Uri.Uri -> CatData.Catalog end functor CatParse (structure Params : CatParams) : CatParse = struct structure SocatParse = SocatParse (structure Params = Params) structure ParserOptions = struct structure Options = ParserOptions() open Options local fun setDefaults() = let val _ = setParserDefaults() val _ = O_WARN_MULT_ENUM := false val _ = O_WARN_XML_DECL := false val _ = O_WARN_ATT_NO_ELEM := false val _ = O_WARN_MULT_ENT_DECL := false val _ = O_WARN_MULT_NOT_DECL := false val _ = O_WARN_MULT_ATT_DEF := false val _ = O_WARN_MULT_ATT_DECL := false val _ = O_WARN_SHOULD_DECLARE := false val _ = O_VALIDATE := false val _ = O_COMPATIBILITY := false val _ = O_INTEROPERABILITY := false val _ = O_INCLUDE_EXT_PARSED := true in () end in val setParserDefaults = setDefaults end end structure CatHooks = CatHooks (structure Params = Params structure Dtd = CatDtd) structure Parse = Parse (structure Dtd = CatDtd structure Hooks = CatHooks structure Resolve = ResolveNull structure ParserOptions = ParserOptions) open CatHooks CatDtd Parse ParserOptions SocatParse Uri fun parseXmlCat uri = let val _ = setParserDefaults() val dtd = initDtdTables() val items = parseDocument (SOME uri) (SOME dtd) (initCatHooks dtd) in (uri,items) end fun isSocatSuffix x = x="soc" orelse x="SOC" fun isXmlSuffix x = x="xml" orelse x="XML" fun parseCatalog uri = let val suffix = uriSuffix uri in if isSocatSuffix suffix then parseSoCat uri else (if isXmlSuffix suffix then parseXmlCat uri else (if !O_PREFER_SOCAT then parseSoCat uri else parseXmlCat uri)) end end (* stop of ../../Catalog/catParse.sml *) (* start of ../../Catalog/catalog.sml *) signature Catalog = sig val resolveExtId : string option * (Uri.Uri * Uri.Uri) option -> Uri.Uri option end functor Catalog ( structure Params : CatParams ) : Catalog = struct structure CatParse = CatParse ( structure Params = Params ) open CatData CatParse Params Uri UriDict val catDict = makeDict("catalog",6,NONE:Catalog option) fun getCatalog uri = let val idx = getIndex(catDict,uri) in case getByIndex(catDict,idx) of SOME cat => cat | NONE => let val cat = parseCatalog uri val _ = setByIndex(catDict,idx,SOME cat) in cat end end datatype SearchType = SYS of Uri | PUB of string datatype SearchResult = FOUND of Uri * Uri | NOTFOUND of Uri list fun searchId id = let fun searchOne (base,other) nil = NOTFOUND other | searchOne (base,other) (entry::entries) = case entry of E_BASE path => let val newBase = uriJoin(base,path) in searchOne (newBase,other) entries end | E_EXTEND path => let val fullPath = uriJoin(base,path) in searchOne (base,fullPath::other) entries end | E_DELEGATE(prefix,path) => (case id of PUB pid => if String.isPrefix prefix pid then let val fullPath = uriJoin(base,path) in searchOne (base,fullPath::other) entries end else searchOne (base,other) entries | SYS _ => searchOne (base,other) entries) | E_MAP(pubid,path) => (case id of PUB pid => if pubid=pid then FOUND (base,path) else searchOne (base,other) entries | _ => searchOne (base,other) entries) | E_REMAP(sysid,path) => (case id of SYS sid => if sysid=sid then FOUND(base,path) else searchOne (base,other) entries | _ => searchOne (base,other) entries) fun searchLevel other nil = NOTFOUND(rev other) | searchLevel other (fname::fnames) = let val (base,entries) = getCatalog fname in case searchOne (base,other) entries of FOUND bp => FOUND bp | NOTFOUND other' => searchLevel other' fnames end fun searchAll fnames = if null fnames then NONE else case searchLevel nil fnames of FOUND bp => SOME bp | NOTFOUND other => searchAll other val fnames = !O_CATALOG_FILES in case id of PUB _ => searchAll fnames | SYS _ => if !O_SUPPORT_REMAP then searchAll fnames else NONE end fun resolveExtId (pub,sys) = let fun resolvePubCat () = case pub of NONE => NONE | SOME id => case searchId (PUB id) of NONE => NONE | SOME(base,sysid) => case searchId (SYS sysid) of NONE => SOME(base,sysid) | new => new fun resolveSysCat () = case sys of NONE => NONE | SOME(base,id) => searchId (SYS id) fun resolveCat () = if !O_PREFER_SYSID then case resolveSysCat () of NONE => resolvePubCat () | found => found else case resolvePubCat () of NONE => resolveSysCat () | found => found fun resolve () = if !O_PREFER_CATALOG then case resolveCat () of NONE => (case sys of NONE => NONE | SOME(base,id) => SOME(base,id)) | found => found else case sys of NONE => resolvePubCat () | SOME(base,id) => SOME(base,id) in if null (!O_CATALOG_FILES) then case sys of NONE => NONE | SOME(base,id) => SOME (uriJoin (base,id)) else case resolve () of NONE => NONE | SOME bp => SOME (uriJoin bp) end end (* stop of ../../Catalog/catalog.sml *) (* start of ../../Catalog/catResolve.sml *) functor ResolveCatalog ( structure Params : CatParams ) : Resolve = struct structure Catalog = Catalog ( structure Params = Params ) open Base Errors fun resolveExtId (id as EXTID(pub,sys)) = let val pub1 = case pub of NONE => NONE | SOME (str,_) => SOME str val sys1 = case sys of NONE => NONE | SOME (base,file,_) => SOME(base,file) in case Catalog.resolveExtId (pub1,sys1) of NONE => raise NoSuchFile ("","Could not generate system identifier") | SOME uri => uri end end (* stop of ../../Catalog/catResolve.sml *) (* start of ../../Catalog/catOptions.sml *) signature CatOptions = sig val O_CATALOG_FILES : Uri.Uri list ref val O_PREFER_SOCAT : bool ref val O_PREFER_SYSID : bool ref val O_PREFER_CATALOG : bool ref val O_SUPPORT_REMAP : bool ref val O_CATALOG_ENC : Encoding.Encoding ref val setCatalogDefaults : unit -> unit val setCatalogOptions : Options.Option list * (string -> unit) -> Options.Option list val catalogUsage : Options.Usage end functor CatOptions () : CatOptions = struct open Encoding Options Uri val O_CATALOG_FILES = ref nil: Uri list ref val O_PREFER_SOCAT = ref false val O_PREFER_SYSID = ref false val O_PREFER_CATALOG = ref true val O_SUPPORT_REMAP = ref true val O_CATALOG_ENC = ref LATIN1 fun setCatalogDefaults() = let val _ = O_CATALOG_FILES := nil val _ = O_PREFER_SOCAT := false val _ = O_PREFER_SYSID := false val _ = O_PREFER_CATALOG := true val _ = O_SUPPORT_REMAP := true val _ = O_CATALOG_ENC := LATIN1 in () end val catalogUsage = [U_ITEM(["-C ","--catalog="],"Use catalog "), U_ITEM(["--catalog-syntax=(soc|xml)"],"Default syntax for catalogs (xml)"), U_ITEM(["--catalog-encoding="],"Default encoding for Socat catalogs (LATIN1)"), U_ITEM(["--catalog-remap=[(yes|no)]"],"Support remapping of system identifiers (yes)"), U_ITEM(["--catalog-priority=(map|remap|sys)"],"Resolving strategy in catalogs (map)") ] fun setCatalogOptions (opts,doError) = let val catalogs = ref nil:string list ref fun hasNoArg key = "option "^key^" has no argument" fun mustHave key = String.concat ["option ",key," must have an argument"] fun mustBe(key,what) = String.concat ["the argument to --",key," must be ",what] val yesNo = "'yes' or 'no'" val mapRemapSys = "'map', 'remap' or 'sys'" val encName = "'ascii', 'latin1', 'utf8' or 'utf16'" val syntaxName = "'soc' or 'xml'" fun do_catalog valOpt = case valOpt of NONE => doError(mustHave "--catalog") | SOME s => catalogs := s::(!catalogs) fun do_prio valOpt = let fun set(cat,sys) = (O_PREFER_CATALOG := cat; O_PREFER_SYSID := sys) in case valOpt of NONE => doError(mustHave "--catalog-priority") | SOME "map" => set(true,false) | SOME "remap" => set(true,true) | SOME "sys" => set(false,true) | SOME s => doError(mustBe("catalog-priority",mapRemapSys)) end fun do_enc valOpt = case valOpt of NONE => doError(mustHave "--catalog-encoding") | SOME s => case isEncoding s of NOENC => doError("unsupported encoding "^s) | enc => O_CATALOG_ENC := enc fun do_remap valOpt = case valOpt of NONE => doError(mustHave "--catalog-remap") | SOME "no" => O_SUPPORT_REMAP := false | SOME "yes" => O_SUPPORT_REMAP := true | SOME s => doError(mustBe("catalog-remap",yesNo)) fun do_syntax valOpt = case valOpt of NONE => doError(mustHave "--catalog-syntax") | SOME "soc" => O_PREFER_SOCAT := true | SOME "xml" => O_PREFER_SOCAT := false | SOME s => doError(mustBe("catalog-remap",syntaxName)) fun do_long(key,valOpt) = case key of "catalog" => true before do_catalog valOpt | "catalog-remap" => true before do_remap valOpt | "catalog-syntax" => true before do_syntax valOpt | "catalog-encoding" => true before do_enc valOpt | "catalog-priority" => true before do_prio valOpt | _ => false fun do_short cs opts = case cs of nil => doit opts | [#"C"] => (case opts of OPT_STRING s::opts1 => (catalogs := s::(!catalogs); doit opts1) | _ => let val _ = doError (mustHave "-C") in doit opts end) | cs => let val cs1 = List.filter (fn c => if #"C"<>c then true else false before doError (mustHave "-C")) cs in if null cs1 then doit opts else (OPT_SHORT cs1)::doit opts end and doit nil = nil | doit (opt::opts) = case opt of OPT_NOOPT => opts | OPT_LONG(key,value) => if do_long(key,value) then doit opts else opt::doit opts | OPT_SHORT cs => do_short cs opts | OPT_NEG cs => opt::doit opts | OPT_STRING s => opt::doit opts val opts1 = doit opts val uris = map String2Uri (!catalogs) val _ = O_CATALOG_FILES := uris in opts1 end end (* stop of ../../Catalog/catOptions.sml *) (* start of nullOptions.sml *) signature NullOptions = sig val O_SILENT : bool ref val O_ERROR_DEVICE : TextIO.outstream ref val O_ERROR_LINEWIDTH : int ref val setNullDefaults : unit -> unit val setNullOptions : Options.Option list * (string -> unit) -> bool * bool * string option * string option val nullUsage : Options.Usage end structure NullOptions : NullOptions = struct open Options val O_SILENT = ref false val O_ERROR_DEVICE = ref TextIO.stdErr val O_ERROR_LINEWIDTH = ref 80 val nullUsage = [U_ITEM(["-s","--silent"],"Suppress reporting of errors and warnings"), U_ITEM(["-e ","--error-output="],"Redirect errors to file (stderr)"), U_SEP, U_ITEM(["--version"],"Print the version number and exit"), U_ITEM(["-?","--help"],"Print this text and exit"), U_ITEM(["--"],"Do not recognize remaining arguments as options") ] fun setNullDefaults () = let val _ = O_SILENT := false val _ = O_ERROR_DEVICE := TextIO.stdErr in () end fun setNullOptions (opts,optError) = let fun onlyOne what = "at most one "^what^" may be specified" fun unknown pre opt = String.concat ["unknown option ",pre,opt] fun hasNoArg pre key = String.concat ["option ",pre,key," expects no argument"] fun mustHave pre key = String.concat ["option ",pre,key," must have an argument"] fun check_noarg(key,valOpt) = if isSome valOpt then optError (hasNoArg "--" key) else () fun do_long (pars as (v,h,e,f)) (key,valOpt) = case key of "help" => (v,true,e,f) before check_noarg(key,valOpt) | "version" => (true,h,e,f) before check_noarg(key,valOpt) | "silent" => pars before O_SILENT := true before check_noarg(key,valOpt) | "error-output" => (case valOpt of NONE => pars before optError (mustHave "--" key) | SOME s => (v,h,SOME s,f)) | _ => pars before optError(unknown "--" key) fun do_short (pars as (v,h,e,f)) (cs,opts) = case cs of nil => doit pars opts | [#"e"] => (case opts of OPT_STRING s::opts1 => doit (v,h,SOME s,f) opts1 | _ => (optError (hasNoArg "-" "e"); doit pars opts)) | cs => doit (foldr (fn (c,pars) => case c of #"e" => pars before optError (hasNoArg "-" "e") | #"s" => pars before O_SILENT := true | #"?" => (v,true,e,f) | c => pars before optError (unknown "-" (String.implode [c]))) pars cs) opts and doit pars nil = pars | doit (pars as (v,h,e,f)) (opt::opts) = case opt of OPT_LONG(key,valOpt) => doit (do_long pars (key,valOpt)) opts | OPT_SHORT cs => do_short pars (cs,opts) | OPT_STRING s => if isSome f then let val _ = optError(onlyOne "input file") in doit pars opts end else doit (v,h,e,SOME s) opts | OPT_NOOPT => doit pars opts | OPT_NEG cs => let val _ = if null cs then () else app (fn c => optError (unknown "-n" (String.implode[c]))) cs in doit pars opts end in doit (false,false,NONE,NONE) opts end end (* stop of nullOptions.sml *) (* start of nullHooks.sml *) structure NullHooks = struct open Errors IgnoreHooks NullOptions type AppData = OS.Process.status type AppFinal = AppData val nullStart = OS.Process.success fun printError(pos,err) = if !O_SILENT then () else TextIO.output (!O_ERROR_DEVICE,formatMessage (4,!O_ERROR_LINEWIDTH) (Position2String pos ::(if isFatalError err then "Fatal error:" else "Error:") ::errorMessage err)) fun printWarning(pos,warn) = if !O_SILENT then () else TextIO.output (!O_ERROR_DEVICE,formatMessage (4,!O_ERROR_LINEWIDTH) (Position2String pos^" Warning:"::warningMessage warn)) fun hookError (_,pe) = OS.Process.failure before printError pe fun hookWarning (status,pw) = status before printWarning pw end (* stop of nullHooks.sml *) (* start of null.sml *) structure Null = struct structure ParserOptions = ParserOptions () structure CatOptions = CatOptions () structure CatParams = struct open CatError CatOptions NullOptions Uri UtilError fun catError(pos,err) = if !O_SILENT then () else TextIO.output (!O_ERROR_DEVICE,formatMessage (4,!O_ERROR_LINEWIDTH) (Position2String pos^" Error in catalog:"::catMessage err)) end structure Resolve = ResolveCatalog (structure Params = CatParams) structure ParseNull = Parse (structure Dtd = Dtd structure Hooks = NullHooks structure Resolve = Resolve structure ParserOptions = ParserOptions) fun parseNull uri = ParseNull.parseDocument uri NONE NullHooks.nullStart open CatOptions NullOptions Options ParserOptions Uri val usage = List.concat [parserUsage,[U_SEP],catalogUsage,[U_SEP],nullUsage] exception Exit of OS.Process.status fun null(prog,args) = let val prog = "fxp" val hadError = ref false fun optError msg = let val _ = TextIO.output(TextIO.stdErr,msg^".\n") in hadError := true end fun exitError msg = let val _ = TextIO.output(TextIO.stdErr,msg^".\n") in raise Exit OS.Process.failure end fun exitHelp prog = let val _ = printUsage TextIO.stdOut prog usage in raise Exit OS.Process.success end fun exitVersion prog = let val _ = app print [prog," version ",Version.FXP_VERSION,"\n"] in raise Exit OS.Process.success end fun summOpt prog = "For a summary of options type "^prog^" --help" fun noFile(f,cause) = "can't open file '"^f^"': "^exnMessage cause val opts = parseOptions args val _ = setParserDefaults() val opts1 = setParserOptions (opts,optError) val _ = setCatalogDefaults() val opts2 = setCatalogOptions (opts1,optError) val _ = setNullDefaults() val (vers,help,err,file) = setNullOptions (opts2,optError) val _ = if !hadError then exitError (summOpt prog) else () val _ = if vers then exitVersion prog else () val _ = if help then exitHelp prog else () val _ = case err of SOME "-" => O_ERROR_DEVICE := TextIO.stdErr | SOME f => (O_ERROR_DEVICE := TextIO.openOut f handle IO.Io {cause,...} => exitError(noFile(f,cause))) | NONE => () val f = valOf file handle Option => "-" val uri = if f="-" then NONE else SOME(String2Uri f) val status = parseNull uri val _ = if isSome err then TextIO.closeOut (!O_ERROR_DEVICE) else () in status end handle Exit status => status | exn => let val _ = TextIO.output (TextIO.stdErr,prog^": Unexpected exception: "^exnMessage exn^".\n") in OS.Process.failure end end (* stop of null.sml *) (* start of call-null.sml *) val _ = Null.null (CommandLine.name (), CommandLine.arguments ()) (* stop of call-null.sml *) mlton-20100608/benchmark/tests/hamlet.sml0000644000076600000240000316412611404435630016657 0ustar mtfstaff(* * 2001-2-14. * Stephen Weeks (sweeks@sweeks.com) generated this file from the hamlet SML * interpreter written by Andreas Rossberg. * The sources are from http://www.ps.uni-sb.de/~rossberg/hamlet/hamlet.tar * * The file consists of the concatenation of all of the source code (plus SML/NJ * library code) in the correct order, with a simple test case to test the * interpreter at the end. * * I also removed uses of the nonstandard Unsafe structure. * * I also made a minor change so that it could read in from a file instead of * from stdIn. *) val ins = ref TextIO.stdIn (* start of STAMP.sml *) (* * Stamp generator. *) signature STAMP = sig eqtype stamp val stamp: unit -> stamp val toString: stamp -> string val reset: unit -> unit val compare: stamp * stamp -> order end (* stop of STAMP.sml *) (* start of Stamp.sml *) (* * Stamp generator. *) structure Stamp :> STAMP = struct type stamp = int val r = ref 0 fun reset() = r := 0 fun stamp() = (r := !r + 1; !r) val toString = Int.toString val compare = Int.compare end (* stop of Stamp.sml *) (* start of smlnj-lib/Util/ord-key-sig.sml *) (* ord-key-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Abstract linearly ordered keys. * *) signature ORD_KEY = sig type ord_key val compare : ord_key * ord_key -> order end (* ORD_KEY *) (* stop of smlnj-lib/Util/ord-key-sig.sml *) (* start of smlnj-lib/Util/lib-base-sig.sml *) (* lib-base-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. *) signature LIB_BASE = sig exception Unimplemented of string (* raised to report unimplemented features *) exception Impossible of string (* raised to report internal errors *) exception NotFound (* raised by searching operations *) val failure : {module : string, func : string, msg : string} -> 'a (* raise the exception Fail with a standard format message. *) val version : {date : string, system : string, version_id : int list} val banner : string end (* LIB_BASE *) (* stop of smlnj-lib/Util/lib-base-sig.sml *) (* start of smlnj-lib/Util/lib-base.sml *) (* lib-base.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. *) structure LibBase : LIB_BASE = struct (* raised to report unimplemented features *) exception Unimplemented of string (* raised to report internal errors *) exception Impossible of string (* raised by searching operations *) exception NotFound (* raise the exception Fail with a standard format message. *) fun failure {module, func, msg} = raise (Fail(concat[module, ".", func, ": ", msg])) val version = { date = "June 1, 1996", system = "SML/NJ Library", version_id = [1, 0] } fun f ([], l) = l | f ([x : int], l) = (Int.toString x)::l | f (x::r, l) = (Int.toString x) :: "." :: f(r, l) val banner = concat ( #system version :: ", Version " :: f (#version_id version, [", ", #date version])) end (* LibBase *) (* stop of smlnj-lib/Util/lib-base.sml *) (* start of smlnj-lib/Util/ord-map-sig.sml *) (* ord-map-sig.sml * * COPYRIGHT (c) 1996 by AT&T Research. See COPYRIGHT file for details. * * Abstract signature of an applicative-style finite maps (dictionaries) * structure over ordered monomorphic keys. *) signature ORD_MAP = sig structure Key : ORD_KEY type 'a map val empty : 'a map (* The empty map *) val isEmpty : 'a map -> bool (* Return true if and only if the map is empty *) val singleton : (Key.ord_key * 'a) -> 'a map (* return the specified singleton map *) val insert : 'a map * Key.ord_key * 'a -> 'a map val insert' : ((Key.ord_key * 'a) * 'a map) -> 'a map (* Insert an item. *) val find : 'a map * Key.ord_key -> 'a option (* Look for an item, return NONE if the item doesn't exist *) val inDomain : ('a map * Key.ord_key) -> bool (* return true, if the key is in the domain of the map *) val remove : 'a map * Key.ord_key -> 'a map * 'a (* Remove an item, returning new map and value removed. * Raises LibBase.NotFound if not found. *) val first : 'a map -> 'a option val firsti : 'a map -> (Key.ord_key * 'a) option (* return the first item in the map (or NONE if it is empty) *) val numItems : 'a map -> int (* Return the number of items in the map *) val listItems : 'a map -> 'a list val listItemsi : 'a map -> (Key.ord_key * 'a) list (* Return an ordered list of the items (and their keys) in the map. *) val listKeys : 'a map -> Key.ord_key list (* return an ordered list of the keys in the map. *) val collate : ('a * 'a -> order) -> ('a map * 'a map) -> order (* given an ordering on the map's range, return an ordering * on the map. *) val unionWith : ('a * 'a -> 'a) -> ('a map * 'a map) -> 'a map val unionWithi : (Key.ord_key * 'a * 'a -> 'a) -> ('a map * 'a map) -> 'a map (* return a map whose domain is the union of the domains of the two input * maps, using the supplied function to define the map on elements that * are in both domains. *) val intersectWith : ('a * 'b -> 'c) -> ('a map * 'b map) -> 'c map val intersectWithi : (Key.ord_key * 'a * 'b -> 'c) -> ('a map * 'b map) -> 'c map (* return a map whose domain is the intersection of the domains of the * two input maps, using the supplied function to define the range. *) val app : ('a -> unit) -> 'a map -> unit val appi : ((Key.ord_key * 'a) -> unit) -> 'a map -> unit (* Apply a function to the entries of the map in map order. *) val map : ('a -> 'b) -> 'a map -> 'b map val mapi : (Key.ord_key * 'a -> 'b) -> 'a map -> 'b map (* Create a new map by applying a map function to the * name/value pairs in the map. *) val foldl : ('a * 'b -> 'b) -> 'b -> 'a map -> 'b val foldli : (Key.ord_key * 'a * 'b -> 'b) -> 'b -> 'a map -> 'b (* Apply a folding function to the entries of the map * in increasing map order. *) val foldr : ('a * 'b -> 'b) -> 'b -> 'a map -> 'b val foldri : (Key.ord_key * 'a * 'b -> 'b) -> 'b -> 'a map -> 'b (* Apply a folding function to the entries of the map * in decreasing map order. *) val filter : ('a -> bool) -> 'a map -> 'a map val filteri : (Key.ord_key * 'a -> bool) -> 'a map -> 'a map (* Filter out those elements of the map that do not satisfy the * predicate. The filtering is done in increasing map order. *) val mapPartial : ('a -> 'b option) -> 'a map -> 'b map val mapPartiali : (Key.ord_key * 'a -> 'b option) -> 'a map -> 'b map (* map a partial function over the elements of a map in increasing * map order. *) end (* ORD_MAP *) (* stop of smlnj-lib/Util/ord-map-sig.sml *) (* start of smlnj-lib/Util/binary-map-fn.sml *) (* binary-map-fn.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * *) functor BinaryMapFn (K : ORD_KEY) : ORD_MAP = struct structure Key = K (* ** val weight = 3 ** fun wt i = weight * i *) fun wt (i : int) = i + i + i datatype 'a map = E | T of { key : K.ord_key, value : 'a, cnt : int, left : 'a map, right : 'a map } val empty = E fun isEmpty E = true | isEmpty _ = false fun numItems E = 0 | numItems (T{cnt,...}) = cnt (* return the first item in the map (or NONE if it is empty) *) fun first E = NONE | first (T{value, left=E, ...}) = SOME value | first (T{left, ...}) = first left (* return the first item in the map and its key (or NONE if it is empty) *) fun firsti E = NONE | firsti (T{key, value, left=E, ...}) = SOME(key, value) | firsti (T{left, ...}) = firsti left local fun N(k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | N(k,v,E,r as T n) = T{key=k,value=v,cnt=1+(#cnt n),left=E,right=r} | N(k,v,l as T n,E) = T{key=k,value=v,cnt=1+(#cnt n),left=l,right=E} | N(k,v,l as T n,r as T n') = T{key=k,value=v,cnt=1+(#cnt n)+(#cnt n'),left=l,right=r} fun single_L (a,av,x,T{key=b,value=bv,left=y,right=z,...}) = N(b,bv,N(a,av,x,y),z) | single_L _ = raise Match fun single_R (b,bv,T{key=a,value=av,left=x,right=y,...},z) = N(a,av,x,N(b,bv,y,z)) | single_R _ = raise Match fun double_L (a,av,w,T{key=c,value=cv,left=T{key=b,value=bv,left=x,right=y,...},right=z,...}) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_L _ = raise Match fun double_R (c,cv,T{key=a,value=av,left=w,right=T{key=b,value=bv,left=x,right=y,...},...},z) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_R _ = raise Match fun T' (k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | T' (k,v,E,r as T{right=E,left=E,...}) = T{key=k,value=v,cnt=2,left=E,right=r} | T' (k,v,l as T{right=E,left=E,...},E) = T{key=k,value=v,cnt=2,left=l,right=E} | T' (p as (_,_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if ln < rn then single_L p else double_L p | T' (p as (_,_,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...},E)) = if ln > rn then single_R p else double_R p | T' (p as (_,_,E,T{left=E,...})) = single_L p | T' (p as (_,_,T{right=E,...},E)) = single_R p | T' (p as (k,v,l as T{cnt=ln,left=ll,right=lr,...}, r as T{cnt=rn,left=rl,right=rr,...})) = if rn >= wt ln then (*right is too big*) let val rln = numItems rl val rrn = numItems rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn then (*left is too big*) let val lln = numItems ll val lrn = numItems lr in if lrn < lln then single_R p else double_R p end else T{key=k,value=v,cnt=ln+rn+1,left=l,right=r} local fun min (T{left=E,key,value,...}) = (key,value) | min (T{left,...}) = min left | min _ = raise Match fun delmin (T{left=E,right,...}) = right | delmin (T{key,value,left,right,...}) = T'(key,value,delmin left,right) | delmin _ = raise Match in fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = let val (mink,minv) = min r in T'(mink,minv,l,delmin r) end end in fun mkDict () = E fun singleton (x,v) = T{key=x,value=v,cnt=1,left=E,right=E} fun insert (E,x,v) = T{key=x,value=v,cnt=1,left=E,right=E} | insert (T(set as {key,left,right,value,...}),x,v) = case K.compare (key,x) of GREATER => T'(key,value,insert(left,x,v),right) | LESS => T'(key,value,left,insert(right,x,v)) | _ => T{key=x,value=v,left=left,right=right,cnt= #cnt set} fun insert' ((k, x), m) = insert(m, k, x) fun inDomain (set, x) = let fun mem E = false | mem (T(n as {key,left,right,...})) = (case K.compare (x,key) of GREATER => mem right | EQUAL => true | LESS => mem left (* end case *)) in mem set end fun find (set, x) = let fun mem E = NONE | mem (T(n as {key,left,right,...})) = (case K.compare (x,key) of GREATER => mem right | EQUAL => SOME(#value n) | LESS => mem left (* end case *)) in mem set end fun remove (E,x) = raise LibBase.NotFound | remove (set as T{key,left,right,value,...},x) = ( case K.compare (key,x) of GREATER => let val (left', v) = remove(left, x) in (T'(key, value, left', right), v) end | LESS => let val (right', v) = remove (right, x) in (T'(key, value, left, right'), v) end | _ => (delete'(left,right),value) (* end case *)) fun listItems d = let fun d2l (E, l) = l | d2l (T{key,value,left,right,...}, l) = d2l(left, value::(d2l(right,l))) in d2l (d,[]) end fun listItemsi d = let fun d2l (E, l) = l | d2l (T{key,value,left,right,...}, l) = d2l(left, (key,value)::(d2l(right,l))) in d2l (d,[]) end fun listKeys d = let fun d2l (E, l) = l | d2l (T{key,left,right,...}, l) = d2l(left, key::(d2l(right,l))) in d2l (d,[]) end local fun next ((t as T{right, ...})::rest) = (t, left(right, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T{left=l, ...}, rest) = left(l, t::rest) in fun collate cmpRng (s1, s2) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T{key=x1, value=y1, ...}, r1), (T{key=x2, value=y2, ...}, r2)) => ( case Key.compare(x1, x2) of EQUAL => (case cmpRng(y1, y2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) | order => order (* end case *)) (* end case *)) in cmp (left(s1, []), left(s2, [])) end end (* local *) fun appi f d = let fun app' E = () | app' (T{key,value,left,right,...}) = ( app' left; f(key, value); app' right) in app' d end fun app f d = let fun app' E = () | app' (T{value,left,right,...}) = ( app' left; f value; app' right) in app' d end fun mapi f d = let fun map' E = E | map' (T{key,value,left,right,cnt}) = let val left' = map' left val value' = f(key, value) val right' = map' right in T{cnt=cnt, key=key, value=value', left = left', right = right'} end in map' d end fun map f d = mapi (fn (_, x) => f x) d fun foldli f init d = let fun fold (E, v) = v | fold (T{key,value,left,right,...}, v) = fold (right, f(key, value, fold(left, v))) in fold (d, init) end fun foldl f init d = foldli (fn (_, v, accum) => f (v, accum)) init d fun foldri f init d = let fun fold (E,v) = v | fold (T{key,value,left,right,...},v) = fold (left, f(key, value, fold(right, v))) in fold (d, init) end fun foldr f init d = foldri (fn (_, v, accum) => f (v, accum)) init d (** To be implemented ** val filter : ('a -> bool) -> 'a map -> 'a map val filteri : (Key.ord_key * 'a -> bool) -> 'a map -> 'a map **) end (* local *) (* the following are generic implementations of the unionWith and intersectWith * operetions. These should be specialized for the internal representations * at some point. *) fun unionWith f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (a, b) => f (b, a))) m1 m2 else foldli (ins f) m2 m1 end fun unionWithi f (m1, m2) = let fun ins f (key, x, m) = (case find(m, key) of NONE => insert(m, key, x) | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in if (numItems m1 > numItems m2) then foldli (ins (fn (k, a, b) => f (k, b, a))) m1 m2 else foldli (ins f) m2 m1 end fun intersectWith f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (a, b) => f(b, a)) (m2, m1) end fun intersectWithi f (m1, m2) = let (* iterate over the elements of m1, checking for membership in m2 *) fun intersect f (m1, m2) = let fun ins (key, x, m) = (case find(m2, key) of NONE => m | (SOME x') => insert(m, key, f(key, x, x')) (* end case *)) in foldli ins empty m1 end in if (numItems m1 > numItems m2) then intersect f (m1, m2) else intersect (fn (k, a, b) => f(k, b, a)) (m2, m1) end (* this is a generic implementation of filter. It should * be specialized to the data-structure at some point. *) fun filter predFn m = let fun f (key, item, m) = if predFn item then insert(m, key, item) else m in foldli f empty m end fun filteri predFn m = let fun f (key, item, m) = if predFn(key, item) then insert(m, key, item) else m in foldli f empty m end (* this is a generic implementation of mapPartial. It should * be specialized to the data-structure at some point. *) fun mapPartial f m = let fun g (key, item, m) = (case f item of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end fun mapPartiali f m = let fun g (key, item, m) = (case f(key, item) of NONE => m | (SOME item') => insert(m, key, item') (* end case *)) in foldli g empty m end end (* functor BinaryMapFn *) (* stop of smlnj-lib/Util/binary-map-fn.sml *) (* start of FIN_MAP.sml *) (* * Standard ML finite maps * * Definition, section 4.2 * * Note: * This signature just extends the one available in the SML/NJ lib. * Actually, the operation added here would be general purpose and useful enough * (and more efficient) to be in the lib. Also see FIN_SET. *) signature FIN_MAP = sig include ORD_MAP val fromList: (Key.ord_key * 'a) list -> 'a map val all: ('a -> bool) -> 'a map -> bool val exists: ('a -> bool) -> 'a map -> bool val alli: (Key.ord_key * 'a -> bool) -> 'a map -> bool val existsi: (Key.ord_key * 'a -> bool) -> 'a map -> bool val disjoint: 'a map * 'a map -> bool end (* stop of FIN_MAP.sml *) (* start of FinMapFn.sml *) (* * Standard ML finite maps * * Definition, section 4.2 * * Note: * This functor just extends the one available in the SML/NJ lib. * Actually, the operation added here would be general purpose and useful enough * (and more efficient) to be in the lib. Also see FinSetFn. *) functor FinMapFn(Key: ORD_KEY) :> FIN_MAP where type Key.ord_key = Key.ord_key = struct structure BinaryMap = BinaryMapFn(Key) open BinaryMap fun fromList kvs = List.foldl (fn((k, v),m) => insert(m, k, v)) empty kvs fun all p = foldl (fn(v, b) => b andalso p v) true fun exists p = foldl (fn(v, b) => b orelse p v) false fun alli p = foldli (fn(k, v, b) => b andalso p(k, v)) true fun existsi p = foldli (fn(k, v, b) => b orelse p(k, v)) false fun disjoint(m1,m2) = isEmpty(intersectWith #2 (m1, m2)) end (* stop of FinMapFn.sml *) (* start of ID.sml *) (* * Standard ML identifiers * * Definition, section 2.4 * * Note: * This is a generic signature to represent all kinds of identifiers (except * for labels and tyvars). *) signature ID = sig (* Type [Section 2.4] *) eqtype Id (* [id] *) (* Operations *) val invent: unit -> Id val fromString: string -> Id val toString: Id -> string val compare: Id * Id -> order end (* stop of ID.sml *) (* start of IdFn.sml *) (* * Standard ML identifiers * * Definition, section 2.4 * * Note: * This is a generic functor to represent all kinds of identifiers (except * for labels tyvars). *) functor IdFn() :> ID = struct (* Type [Section 2.4] *) type Id = string (* [id] *) (* Creation *) fun invent() = "_id" ^ Stamp.toString(Stamp.stamp()) fun fromString s = s fun toString s = s (* Ordering *) val compare = String.compare end (* stop of IdFn.sml *) (* start of IdsModule.sml *) (* * Standard ML identifiers for modules * * Definition, section 3.2 *) structure SigId = IdFn() structure FunId = IdFn() (* stop of IdsModule.sml *) (* start of AssembliesModule.sml *) (* * Standard ML sets and maps for the module semantics * * Definition, sections 5.1 and 7.2 *) structure SigIdMap = FinMapFn(type ord_key = SigId.Id val compare = SigId.compare) structure FunIdMap = FinMapFn(type ord_key = FunId.Id val compare = FunId.compare) (* stop of AssembliesModule.sml *) (* start of LONGID.sml *) (* * Standard ML long identifiers * * Definition, section 2.4 * * Note: * This is a generic signature to represent all kinds of long identifiers. *) signature LONGID = sig (* Import *) structure Id: ID structure StrId: ID type Id = Id.Id type StrId = StrId.Id (* Type [Section 2.4] *) eqtype longId (* [longid] *) (* Operations *) val invent: unit -> longId val fromId: Id -> longId val toId: longId -> Id val toString: longId -> string val strengthen: StrId * longId -> longId val implode: StrId list * Id -> longId val explode: longId -> StrId list * Id val isUnqualified: longId -> bool val compare: longId * longId -> order end (* stop of LONGID.sml *) (* start of LongIdFn.sml *) (* * Standard ML long identifiers * * Definition, section 2.4 * * Note: * This is a generic functor that generates a long identifier type from a * given identifier type and the StrId type. *) functor LongIdFn(structure Id: ID structure StrId: ID ) :> LONGID where type Id.Id = Id.Id and type StrId.Id = StrId.Id = struct (* Import *) structure Id = Id structure StrId = StrId type Id = Id.Id type StrId = StrId.Id (* Type [Section 2.4] *) type longId = StrId list * Id (* [longid] *) (* Conversions *) fun toId(strid, id) = id fun fromId id = ([],id) fun invent() = ([],Id.invent()) fun toString(strids, id) = let fun prefix [] = Id.toString id | prefix(id::ids) = StrId.toString id ^ "." ^ prefix ids in prefix strids end fun strengthen(strid, (strids, id)) = (strid::strids, id) fun implode longid = longid fun explode longid = longid fun isUnqualified (strids,id) = List.null strids (* Ordering *) fun compare(longid1, longid2) = String.compare(toString longid1, toString longid2) end (* stop of LongIdFn.sml *) (* start of IdsCore.sml *) (* * Standard ML identifiers for the core * * Definition, section 2.4 *) structure VId = IdFn() structure TyCon = IdFn() structure StrId = IdFn() structure LongVId = LongIdFn(structure Id = VId structure StrId = StrId) structure LongTyCon = LongIdFn(structure Id = TyCon structure StrId = StrId) structure LongStrId = LongIdFn(structure Id = StrId structure StrId = StrId) (* stop of IdsCore.sml *) (* start of smlnj-lib/Util/ord-set-sig.sml *) (* ordset-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * Signature for a set of values with an order relation. *) signature ORD_SET = sig structure Key : ORD_KEY type item = Key.ord_key type set val empty : set (* The empty set *) val singleton : item -> set (* Create a singleton set *) val add : set * item -> set val add' : (item * set) -> set (* Insert an item. *) val addList : set * item list -> set (* Insert items from list. *) val delete : set * item -> set (* Remove an item. Raise NotFound if not found. *) val member : set * item -> bool (* Return true if and only if item is an element in the set *) val isEmpty : set -> bool (* Return true if and only if the set is empty *) val equal : (set * set) -> bool (* Return true if and only if the two sets are equal *) val compare : (set * set) -> order (* does a lexical comparison of two sets *) val isSubset : (set * set) -> bool (* Return true if and only if the first set is a subset of the second *) val numItems : set -> int (* Return the number of items in the table *) val listItems : set -> item list (* Return an ordered list of the items in the set *) val union : set * set -> set (* Union *) val intersection : set * set -> set (* Intersection *) val difference : set * set -> set (* Difference *) val map : (item -> item) -> set -> set (* Create a new set by applying a map function to the elements * of the set. *) val app : (item -> unit) -> set -> unit (* Apply a function to the entries of the set * in decreasing order *) val foldl : (item * 'b -> 'b) -> 'b -> set -> 'b (* Apply a folding function to the entries of the set * in increasing order *) val foldr : (item * 'b -> 'b) -> 'b -> set -> 'b (* Apply a folding function to the entries of the set * in decreasing order *) val filter : (item -> bool) -> set -> set val exists : (item -> bool) -> set -> bool val find : (item -> bool) -> set -> item option end (* ORD_SET *) (* stop of smlnj-lib/Util/ord-set-sig.sml *) (* start of smlnj-lib/Util/binary-set-fn.sml *) (* binary-set-fn.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * * 3. There are two implementations of union. The default, * hedge_union, is much more complex and usually 20% faster. I * am not sure that the performance increase warrants the * complexity (and time it took to write), but I am leaving it * in for the competition. It is derived from the original * union by replacing the split_lt(gt) operations with a lazy * version. The `obvious' version is called old_union. * * 4. Most time is spent in T', the rebalancing constructor. If my * understanding of the output of * in the sml batch * compiler is correct then the code produced by NJSML 0.75 * (sparc) for the final case is very disappointing. Most * invocations fall through to this case and most of these cases * fall to the else part, i.e. the plain contructor, * T(v,ln+rn+1,l,r). The poor code allocates a 16 word vector * and saves lots of registers into it. In the common case it * then retrieves a few of the registers and allocates the 5 * word T node. The values that it retrieves were live in * registers before the massive save. * * Modified to functor to support general ordered values *) functor BinarySetFn (K : ORD_KEY) : ORD_SET = struct structure Key = K type item = K.ord_key datatype set = E | T of { elt : item, cnt : int, left : set, right : set } fun numItems E = 0 | numItems (T{cnt,...}) = cnt fun isEmpty E = true | isEmpty _ = false fun mkT(v,n,l,r) = T{elt=v,cnt=n,left=l,right=r} (* N(v,l,r) = T(v,1+numItems(l)+numItems(r),l,r) *) fun N(v,E,E) = mkT(v,1,E,E) | N(v,E,r as T{cnt=n,...}) = mkT(v,n+1,E,r) | N(v,l as T{cnt=n,...}, E) = mkT(v,n+1,l,E) | N(v,l as T{cnt=n,...}, r as T{cnt=m,...}) = mkT(v,n+m+1,l,r) fun single_L (a,x,T{elt=b,left=y,right=z,...}) = N(b,N(a,x,y),z) | single_L _ = raise Match fun single_R (b,T{elt=a,left=x,right=y,...},z) = N(a,x,N(b,y,z)) | single_R _ = raise Match fun double_L (a,w,T{elt=c,left=T{elt=b,left=x,right=y,...},right=z,...}) = N(b,N(a,w,x),N(c,y,z)) | double_L _ = raise Match fun double_R (c,T{elt=a,left=w,right=T{elt=b,left=x,right=y,...},...},z) = N(b,N(a,w,x),N(c,y,z)) | double_R _ = raise Match (* ** val weight = 3 ** fun wt i = weight * i *) fun wt (i : int) = i + i + i fun T' (v,E,E) = mkT(v,1,E,E) | T' (v,E,r as T{left=E,right=E,...}) = mkT(v,2,E,r) | T' (v,l as T{left=E,right=E,...},E) = mkT(v,2,l,E) | T' (p as (_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if lnrn then single_R p else double_R p | T' (p as (_,E,T{left=E,...})) = single_L p | T' (p as (_,T{right=E,...},E)) = single_R p | T' (p as (v,l as T{elt=lv,cnt=ln,left=ll,right=lr}, r as T{elt=rv,cnt=rn,left=rl,right=rr})) = if rn >= wt ln (*right is too big*) then let val rln = numItems rl val rrn = numItems rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn (*left is too big*) then let val lln = numItems ll val lrn = numItems lr in if lrn < lln then single_R p else double_R p end else mkT(v,ln+rn+1,l,r) fun add (E,x) = mkT(x,1,E,E) | add (set as T{elt=v,left=l,right=r,cnt},x) = case K.compare(x,v) of LESS => T'(v,add(l,x),r) | GREATER => T'(v,l,add(r,x)) | EQUAL => mkT(x,cnt,l,r) fun add' (s, x) = add(x, s) fun concat3 (E,v,r) = add(r,v) | concat3 (l,v,E) = add(l,v) | concat3 (l as T{elt=v1,cnt=n1,left=l1,right=r1}, v, r as T{elt=v2,cnt=n2,left=l2,right=r2}) = if wt n1 < n2 then T'(v2,concat3(l,v,l2),r2) else if wt n2 < n1 then T'(v1,l1,concat3(r1,v,r)) else N(v,l,r) fun split_lt (E,x) = E | split_lt (T{elt=v,left=l,right=r,...},x) = case K.compare(v,x) of GREATER => split_lt(l,x) | LESS => concat3(l,v,split_lt(r,x)) | _ => l fun split_gt (E,x) = E | split_gt (T{elt=v,left=l,right=r,...},x) = case K.compare(v,x) of LESS => split_gt(r,x) | GREATER => concat3(split_gt(l,x),v,r) | _ => r fun min (T{elt=v,left=E,...}) = v | min (T{left=l,...}) = min l | min _ = raise Match fun delmin (T{left=E,right=r,...}) = r | delmin (T{elt=v,left=l,right=r,...}) = T'(v,delmin l,r) | delmin _ = raise Match fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = T'(min r,l,delmin r) fun concat (E, s) = s | concat (s, E) = s | concat (t1 as T{elt=v1,cnt=n1,left=l1,right=r1}, t2 as T{elt=v2,cnt=n2,left=l2,right=r2}) = if wt n1 < n2 then T'(v2,concat(t1,l2),r2) else if wt n2 < n1 then T'(v1,l1,concat(r1,t2)) else T'(min t2,t1, delmin t2) local fun trim (lo,hi,E) = E | trim (lo,hi,s as T{elt=v,left=l,right=r,...}) = if K.compare(v,lo) = GREATER then if K.compare(v,hi) = LESS then s else trim(lo,hi,l) else trim(lo,hi,r) fun uni_bd (s,E,_,_) = s | uni_bd (E,T{elt=v,left=l,right=r,...},lo,hi) = concat3(split_gt(l,lo),v,split_lt(r,hi)) | uni_bd (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},lo,hi) = concat3(uni_bd(l1,trim(lo,v,s2),lo,v), v, uni_bd(r1,trim(v,hi,s2),v,hi)) (* inv: lo < v < hi *) (* all the other versions of uni and trim are * specializations of the above two functions with * lo=-infinity and/or hi=+infinity *) fun trim_lo (_, E) = E | trim_lo (lo,s as T{elt=v,right=r,...}) = case K.compare(v,lo) of GREATER => s | _ => trim_lo(lo,r) fun trim_hi (_, E) = E | trim_hi (hi,s as T{elt=v,left=l,...}) = case K.compare(v,hi) of LESS => s | _ => trim_hi(hi,l) fun uni_hi (s,E,_) = s | uni_hi (E,T{elt=v,left=l,right=r,...},hi) = concat3(l,v,split_lt(r,hi)) | uni_hi (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},hi) = concat3(uni_hi(l1,trim_hi(v,s2),v),v,uni_bd(r1,trim(v,hi,s2),v,hi)) fun uni_lo (s,E,_) = s | uni_lo (E,T{elt=v,left=l,right=r,...},lo) = concat3(split_gt(l,lo),v,r) | uni_lo (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...},lo) = concat3(uni_bd(l1,trim(lo,v,s2),lo,v),v,uni_lo(r1,trim_lo(v,s2),v)) fun uni (s,E) = s | uni (E,s) = s | uni (T{elt=v,left=l1,right=r1,...}, s2 as T{elt=v2,left=l2,right=r2,...}) = concat3(uni_hi(l1,trim_hi(v,s2),v), v, uni_lo(r1,trim_lo(v,s2),v)) in val hedge_union = uni end (* The old_union version is about 20% slower than * hedge_union in most cases *) fun old_union (E,s2) = s2 | old_union (s1,E) = s1 | old_union (T{elt=v,left=l,right=r,...},s2) = let val l2 = split_lt(s2,v) val r2 = split_gt(s2,v) in concat3(old_union(l,l2),v,old_union(r,r2)) end val empty = E fun singleton x = T{elt=x,cnt=1,left=E,right=E} fun addList (s,l) = List.foldl (fn (i,s) => add(s,i)) s l val add = add fun member (set, x) = let fun pk E = false | pk (T{elt=v, left=l, right=r, ...}) = ( case K.compare(x,v) of LESS => pk l | EQUAL => true | GREATER => pk r (* end case *)) in pk set end local (* true if every item in t is in t' *) fun treeIn (t,t') = let fun isIn E = true | isIn (T{elt,left=E,right=E,...}) = member(t',elt) | isIn (T{elt,left,right=E,...}) = member(t',elt) andalso isIn left | isIn (T{elt,left=E,right,...}) = member(t',elt) andalso isIn right | isIn (T{elt,left,right,...}) = member(t',elt) andalso isIn left andalso isIn right in isIn t end in fun isSubset (E,_) = true | isSubset (_,E) = false | isSubset (t as T{cnt=n,...},t' as T{cnt=n',...}) = (n<=n') andalso treeIn (t,t') fun equal (E,E) = true | equal (t as T{cnt=n,...},t' as T{cnt=n',...}) = (n=n') andalso treeIn (t,t') | equal _ = false end local fun next ((t as T{right, ...})::rest) = (t, left(right, rest)) | next _ = (E, []) and left (E, rest) = rest | left (t as T{left=l, ...}, rest) = left(l, t::rest) in fun compare (s1, s2) = let fun cmp (t1, t2) = (case (next t1, next t2) of ((E, _), (E, _)) => EQUAL | ((E, _), _) => LESS | (_, (E, _)) => GREATER | ((T{elt=e1, ...}, r1), (T{elt=e2, ...}, r2)) => ( case Key.compare(e1, e2) of EQUAL => cmp (r1, r2) | order => order (* end case *)) (* end case *)) in cmp (left(s1, []), left(s2, [])) end end fun delete (E,x) = raise LibBase.NotFound | delete (set as T{elt=v,left=l,right=r,...},x) = case K.compare(x,v) of LESS => T'(v,delete(l,x),r) | GREATER => T'(v,l,delete(r,x)) | _ => delete'(l,r) val union = hedge_union fun intersection (E, _) = E | intersection (_, E) = E | intersection (s, T{elt=v,left=l,right=r,...}) = let val l2 = split_lt(s,v) val r2 = split_gt(s,v) in if member(s,v) then concat3(intersection(l2,l),v,intersection(r2,r)) else concat(intersection(l2,l),intersection(r2,r)) end fun difference (E,s) = E | difference (s,E) = s | difference (s, T{elt=v,left=l,right=r,...}) = let val l2 = split_lt(s,v) val r2 = split_gt(s,v) in concat(difference(l2,l),difference(r2,r)) end fun map f set = let fun map'(acc, E) = acc | map'(acc, T{elt,left,right,...}) = map' (add (map' (acc, left), f elt), right) in map' (E, set) end fun app apf = let fun apply E = () | apply (T{elt,left,right,...}) = (apply left;apf elt; apply right) in apply end fun foldl f b set = let fun foldf (E, b) = b | foldf (T{elt,left,right,...}, b) = foldf (right, f(elt, foldf (left, b))) in foldf (set, b) end fun foldr f b set = let fun foldf (E, b) = b | foldf (T{elt,left,right,...}, b) = foldf (left, f(elt, foldf (right, b))) in foldf (set, b) end fun listItems set = foldr (op::) [] set fun filter pred set = foldl (fn (item, s) => if (pred item) then add(s, item) else s) empty set fun find p E = NONE | find p (T{elt,left,right,...}) = (case find p left of NONE => if (p elt) then SOME elt else find p right | a => a (* end case *)) fun exists p E = false | exists p (T{elt, left, right,...}) = (exists p left) orelse (p elt) orelse (exists p right) end (* BinarySetFn *) (* stop of smlnj-lib/Util/binary-set-fn.sml *) (* start of FIN_SET.sml *) (* * Standard ML finite sets * * Definition, section 4.2 * * Note: * This signature just extends the one available in the SML/NJ lib. * Actually, the operation added here would be general purpose and useful enough * to be in the lib. Also see FIN_MAP. *) signature FIN_SET = sig include ORD_SET val fromList: item list -> set end (* stop of FIN_SET.sml *) (* start of FinSetFn.sml *) (* * Standard ML finite sets * * Definition, section 4.2 * * Note: * This functor just extends the one available in the SML/NJ lib. * Actually, the operation added here would be general purpose and useful enough * to be in the lib. Also see FinMapFn. *) functor FinSetFn(Key: ORD_KEY) :> FIN_SET where type Key.ord_key = Key.ord_key = struct structure BinarySet = BinarySetFn(Key) open BinarySet fun fromList xs = addList(empty, xs) end (* stop of FinSetFn.sml *) (* start of TYVAR.sml *) (* * Standard ML type variables * * Definition, sections 2.4 and 4.1 *) signature TYVAR = sig (* Type [Sections 2.4 and 4.1]*) eqtype TyVar (* [alpha] or [tyvar] *) (* Operations *) val invent: bool -> TyVar val fromIndex: bool -> int -> TyVar val fromString: string -> TyVar val toString: TyVar -> string val admitsEquality: TyVar -> bool val isExplicit: TyVar -> bool val instance: TyVar -> TyVar val normalise: TyVar * int -> TyVar val compare: TyVar * TyVar -> order end (* stop of TYVAR.sml *) (* start of TyVar.sml *) (* * Standard ML type variables * * Definition, sections 2.4 and 4.1 * * Note: * - Internally generated tyvars get names '#xxx, where xxx is a stamp number. * - Tyvars generated from integers are mapped to 'a,'b,..,'z,'aa,'bb,..,'zz, * 'aaa,... *) structure TyVar :> TYVAR = struct (* Type [Sections 2.4 and 4.1]*) type TyVar = { name: string, equality: bool } (* [alpha] or [tyvar] *) (* Creation *) fun invent equality = { name="'#" ^ Stamp.toString(Stamp.stamp()), equality=equality } fun fromIndex equality n = let fun rep(0,c) = c | rep(n,c) = c ^ rep(n-1,c) val c = String.str(Char.chr(Char.ord #"a" + n mod 26)) val name = (if equality then "''" else "'") ^ rep(n div 26, c) in { name=name, equality=equality } end fun fromString s = { name = s, equality = String.size(s) > 1 andalso String.sub(s,1) = #"'" } fun toString{name,equality} = name (* Attributes [Section 4.1] *) fun admitsEquality{name,equality} = equality fun isExplicit{name,equality} = String.size name = 1 orelse String.sub(name,1) <> #"#" (* Small helpers *) fun normalise({name,equality}, n) = fromIndex equality n fun instance{name,equality} = invent equality (* Ordering *) fun compare(alpha1: TyVar, alpha2: TyVar) = String.compare(#name alpha1, #name alpha2) end (* stop of TyVar.sml *) (* start of TYNAME.sml *) (* * Standard ML type names * * Definition, section 4.1 * * Notes: * - Equality is not a boolean attribute. We distinguish a 3rd kind of special * type names which have equality regardless of the types applied. This * implements ref, array, and equivalent types. * - For easy checking of pattern exhaustiveness we add an attribute * `span' counting the number of constructors of the type. *) signature TYNAME = sig (* Import *) type TyCon = TyCon.Id (* Type [Section 4.1] *) eqtype TyName (* [t] *) datatype Equality = NOEQ | EQ | SPECIALEQ (* Operations *) val tyname: TyCon * int * Equality * int -> TyName val invent: int * Equality -> TyName val rename: TyName -> TyName val removeEquality: TyName -> TyName val Abs: TyName -> TyName val arity: TyName -> int val equality: TyName -> Equality val span: TyName -> int val tycon: TyName -> TyCon val toString: TyName -> string val compare: TyName * TyName -> order end (* stop of TYNAME.sml *) (* start of TyName.sml *) (* * Standard ML type names * * Definition, section 4.1 * * Notes: * - Equality is not a boolean attribute. We distinguish a 3rd kind of special * type names which have equality regardless of the types applied. This * implements ref, array, and equivalent types. * - For easy checking of pattern exhaustiveness we add an attribute * `span' counting the number of constructors of the type. *) structure TyName :> TYNAME = struct (* Import *) type TyCon = TyCon.Id type stamp = Stamp.stamp (* Type [Section 4.1] *) datatype Equality = NOEQ | EQ | SPECIALEQ type TyName = (* [t] *) { tycon: TyCon , stamp: stamp , arity: int , equality: Equality , span: int } (* Creation *) fun tyname(tycon, arity, equality, span) = { tycon = tycon , stamp = Stamp.stamp() , arity = arity , equality = equality , span = span } fun invent(arity, equality) = tyname(TyCon.invent(), arity, equality, 0) (* Creation from existing *) fun rename{tycon, stamp, arity, equality, span} = tyname(tycon, arity, equality, span) fun removeEquality{tycon, stamp, arity, equality, span} = tyname(tycon, arity, NOEQ, span) fun Abs{tycon, stamp, arity, equality, span} = tyname(tycon, arity, NOEQ, 0) (* Attributes [Section 4.1] *) fun arity {tycon, stamp, arity, equality, span} = arity fun equality{tycon, stamp, arity, equality, span} = equality fun span {tycon, stamp, arity, equality, span} = span fun tycon {tycon, stamp, arity, equality, span} = tycon fun toString{tycon, stamp, arity, equality, span} = TyCon.toString tycon (* Ordering *) fun compare(t1: TyName, t2: TyName) = Stamp.compare(#stamp t1, #stamp t2) end (* stop of TyName.sml *) (* start of SCON.sml *) (* * Standard ML special constants * * Definition, section 2.2 *) signature SCON = sig (* Type [Section 2.2] *) datatype SCon = (* [scon] *) INT of int | WORD of word | STRING of string | CHAR of char | REAL of real (* Operations *) val fromInt: int -> SCon val fromWord: word -> SCon val fromString: string -> SCon val fromChar: char -> SCon val fromReal: real -> SCon val toString: SCon -> string val compare: SCon * SCon -> order end (* stop of SCON.sml *) (* start of SCon.sml *) (* * Standard ML special constants * * Definition, section 2.2 *) structure SCon :> SCON = struct (* Type [Section 2.2] *) datatype SCon = (* [scon] *) INT of int | WORD of word | STRING of string | CHAR of char | REAL of real (* Conversions *) val fromInt = INT val fromWord = WORD val fromString = STRING val fromChar = CHAR val fromReal = REAL fun toString(INT i) = Int.toString i | toString(WORD w) = "0wx" ^ Word.toString w | toString(STRING s) = "\"" ^ String.toCString s ^ "\"" | toString(CHAR c) = "\"#" ^ Char.toCString c ^ "\"" | toString(REAL r) = Real.toString r (* Ordering *) fun compare(INT n1, INT n2) = Int.compare(n1, n2) | compare(WORD w1, WORD w2) = Word.compare(w1, w2) | compare(STRING s1, STRING s2) = String.compare(s1, s2) | compare(CHAR c1, CHAR c2) = Char.compare(c1, c2) | compare(REAL x1, REAL x2) = Real.compare(x1, x2) | compare _ = raise Domain end (* stop of SCon.sml *) (* start of LAB.sml *) (* * Standard ML label identifiers * * Definition, section 2.4 *) signature LAB = sig (* Type [Section 2.4] *) eqtype Lab (* [lab] *) (* Operations *) val fromString: string -> Lab val fromInt: int -> Lab val toString: Lab -> string val compare: Lab * Lab -> order end (* stop of LAB.sml *) (* start of Lab.sml *) (* * Standard ML label identifiers * * Definition, section 2.4 *) structure Lab :> LAB = struct (* Type [Section 2.4] *) type Lab = string (* [lab] *) (* Conversions *) fun fromString s = s val fromInt = Int.toString fun toString s = s (* Ordering *) fun compare(lab1,lab2) = case (Int.fromString lab1, Int.fromString lab2) of (SOME i1, SOME i2) => Int.compare(i1,i2) | _ => String.compare(lab1,lab2) end (* stop of Lab.sml *) (* start of AssembliesCoreStatic.sml *) (* * Standard ML sets and maps for the static semantics of the core * * Definition, section 4.2 *) structure TyVarSet = FinSetFn(type ord_key = TyVar.TyVar val compare = TyVar.compare) structure TyNameSet = FinSetFn(type ord_key = TyName.TyName val compare = TyName.compare) structure SConSet = FinSetFn(type ord_key = SCon.SCon val compare = SCon.compare) structure VIdSet = FinSetFn(type ord_key = VId.Id val compare = VId.compare) structure LongVIdSet = FinSetFn(type ord_key = LongVId.longId val compare = LongVId.compare) structure LabMap = FinMapFn(type ord_key = Lab.Lab val compare = Lab.compare) structure VIdMap = FinMapFn(type ord_key = VId.Id val compare = VId.compare) structure TyConMap = FinMapFn(type ord_key = TyCon.Id val compare = TyCon.compare) structure TyVarMap = FinMapFn(type ord_key = TyVar.TyVar val compare = TyVar.compare) structure TyNameMap = FinMapFn(type ord_key = TyName.TyName val compare = TyName.compare) structure StrIdMap = FinMapFn(type ord_key = StrId.Id val compare = StrId.compare) (* stop of AssembliesCoreStatic.sml *) (* start of OVERLOADINGCLASS.sml *) (* * Standard ML overloading classes * * Definition, appendix E * * Note: * Overloading -- and defaulting in particular -- is not well formalised in * the Definition. We describe an overloading class as a pair (T,t) of a set * of type names (like the definition does), plus the default type name t. * For overloading to be sound some well-formedness properties have to be * enforced for all existing overloading classes (T,t): * (1) t elem T * (2) Eq T = 0 \/ t admits equality * (3) forall (T',t') . ( TT' = 0 \/ t = t' ) * where Eq T = { t elem T | t admits equality } and we write TT' for the * T intersect T' and 0 for the empty set. * The reason for (1) is obvious. (2) guarantees that we do not loose the * default if we enforce equality. (3) ensures the same if we have to unify * two overloading classes. (2) and (3) also allow the resulting set to become * empty which will cause a type error. *) signature OVERLOADINGCLASS = sig (* Import types *) type TyName = TyName.TyName type TyNameSet = TyNameSet.set (* Type *) type OverloadingClass (* [O] *) (* Operations *) val make: TyNameSet * TyName -> OverloadingClass val isEmpty: OverloadingClass -> bool val isSingular: OverloadingClass -> bool val default: OverloadingClass -> TyName val set: OverloadingClass -> TyNameSet val member: OverloadingClass * TyName -> bool val getItem: OverloadingClass -> TyName val makeEquality: OverloadingClass -> OverloadingClass option val intersection: OverloadingClass * OverloadingClass -> OverloadingClass option val union: OverloadingClass * OverloadingClass -> OverloadingClass end (* stop of OVERLOADINGCLASS.sml *) (* start of OverloadingClass.sml *) (* * Standard ML overloading classes * * Definition, appendix E * * Note: * Overloading -- and defaulting in particular -- is not well formalised in * the Definition. We describe an overloading class as a pair (T,t) of a set * of type names (like the definition does), plus the default type name t. * For overloading to be sound some well-formedness properties have to be * enforced for all existing overloading classes (T,t): * (1) t elem T * (2) Eq T = 0 \/ t admits equality * (3) forall (T',t') . ( TT' = 0 \/ t = t' ) * where Eq T = { t elem T | t admits equality } and we write TT' for the * T intersect T' and 0 for the empty set. * The reason for (1) is obvious. (2) guarantees that we do not loose the * default if we enforce equality. (3) ensures the same if we have to unify * two overloading classes. (2) and (3) also allow the resulting set to become * empty which will cause a type error. *) structure OverloadingClass :> OVERLOADINGCLASS = struct (* Import types *) type TyName = TyName.TyName type TyNameSet = TyNameSet.set (* Type *) type OverloadingClass = TyNameSet * TyName (* [O] *) (* Simple operations *) fun make O = O fun isEmpty (T,t) = TyNameSet.isEmpty T fun isSingular (T,t) = TyNameSet.numItems T = 1 fun default (T,t) = t fun set (T,t) = T fun member((T,t), t') = TyNameSet.member(T, t') fun getItem (T,t) = valOf(TyNameSet.find (fn _ => true) T) (* Filter equality types *) fun makeEquality (T,t) = let val T' = TyNameSet.filter (fn t => TyName.equality t = TyName.EQ) T in if TyNameSet.isEmpty T' then NONE else if TyName.equality t <> TyName.NOEQ then SOME(T',t) else raise Fail "OverloadingClass.makeEquality: \ \inconsistent overloading classes" end (* Intersection and union *) fun intersection((T1,t1), (T2,t2)) = let val T' = TyNameSet.intersection(T1,T2) in if TyNameSet.isEmpty T' then NONE else if t1 = t2 then SOME(T',t1) else raise Fail "OverloadingClass.intersect: \ \inconsistent overloading classes" end fun union((T1,t1), (T2,t2)) = ( TyNameSet.union(T1,T2), t2 ) end (* stop of OverloadingClass.sml *) (* start of TYPE.sml *) (* * Standard ML types * * Definition, section 4.2 and 4.4 * * Notes: * - Types are references so that unification can work via side effects. * We need links (forwards) to unify two type variables. * - Types built bottom-up have to be `normalised' to induce the required * sharing on type variables. * - Care has to be taken to clone types at the proper places. * - Substitution creates a clone, but shares free type variables. * - To represent overloaded type (variables), we add a special type. * - Record types may contain a row variable to represent open record types * (which appear during type inference). Flexible rows have to carry an * equality flag to properly propagate equality enforced by unification * when extending a row. *) signature TYPE = sig (* Import types *) type Lab = Lab.Lab type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type OverloadingClass = OverloadingClass.OverloadingClass type 'a LabMap = 'a LabMap.map type 'a TyVarMap = 'a TyVarMap.map type 'a TyNameMap = 'a TyNameMap.map (* Types [Section 4.2] *) datatype RowVar = CLOSEDRow | FLEXRow of bool (* [r] *) datatype Type' = (* [tau] *) TyVar of TyVar | RowType of (*RowType*) (Type' ref LabMap * RowVar) | FunType of (*FunType*) (Type' ref * Type' ref) | ConsType of (*ConsType*)(Type' ref list * TyName) | Overloaded of OverloadingClass | Link of (*Type*) Type' ref type Type = Type' ref type RowType = Type LabMap * RowVar (* [rho] *) type FunType = Type * Type type ConsType = Type list * TyName type TypeFcn = TyVar list * Type (* [theta] *) type Substitution = Type TyVarMap (* [mu] *) type Realisation = TypeFcn TyNameMap (* [phi] *) (* Operations *) val invent: unit -> Type val fromTyVar: TyVar -> Type val fromRowType: RowType -> Type val fromFunType: FunType -> Type val fromConsType: ConsType -> Type val fromOverloadingClass: OverloadingClass -> Type val range: Type -> Type val tyname: Type -> TyName val normalise: Type -> Type val substitute: Substitution -> Type -> Type val realise: Realisation -> Type -> Type val tyvars: Type -> TyVarSet val tynames: Type -> TyNameSet val admitsEquality: Type -> bool val isFlexible: Type -> bool exception Unify val unify: Type * Type -> unit (* Unify *) val unifyRestricted: TyVarSet -> Type * Type -> unit (* Unify *) val makeEquality: Type -> unit (* Unify *) val defaultOverloaded: Type -> unit (* Operations on rows *) val emptyRho: RowType val singletonRho: Lab * Type -> RowType val insertRho: RowType * Lab * Type -> RowType val inventRho: unit -> RowType val findLab: RowType * Lab -> Type option end (* stop of TYPE.sml *) (* start of Type.sml *) (* * Standard ML types * * Definition, section 4.2 and 4.4 * * Notes: * - Types are references so that unification can work via side effects. * We need links (forwards) to unify two type variables. * - Types built bottom-up have to be `normalised' to induce the required * sharing on type variables. * - Care has to be taken to clone types at the proper places. * - Substitution creates a clone, but shares free type variables. * - To represent overloaded type (variables), we add a special type. * - Record types may contain a row variable to represent open record types * (which appear during type inference). Flexible rows have to carry an * equality flag to properly propagate equality enforced by unification * when extending a row. *) structure Type :> TYPE = struct (* Import types *) type Lab = Lab.Lab type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type OverloadingClass = OverloadingClass.OverloadingClass type 'a LabMap = 'a LabMap.map type 'a TyVarMap = 'a TyVarMap.map type 'a TyNameMap = 'a TyNameMap.map (* Types [Section 4.2] *) datatype RowVar = CLOSEDRow | FLEXRow of bool (* [r] *) datatype Type' = (* [tau] *) TyVar of TyVar | RowType of RowType | FunType of FunType | ConsType of ConsType | Overloaded of OverloadingClass | Link of Type withtype Type = Type' ref and RowType = Type' ref LabMap * RowVar (* [rho] *) and FunType = Type' ref * Type' ref and ConsType = Type' ref list * TyName type TypeFcn = TyVar list * Type (* [theta] *) type Substitution = Type TyVarMap (* [mu] *) type Realisation = TypeFcn TyNameMap (* [phi] *) (* Creation *) fun invent() = ref(TyVar(TyVar.invent false)) fun fromTyVar alpha = ref(TyVar alpha) fun fromRowType rho = ref(RowType rho) fun fromFunType x = ref(FunType x) fun fromConsType x = ref(ConsType x) fun fromOverloadingClass O = ref(Overloaded O) (* Projections *) fun range(ref(FunType(tau1,tau2))) = tau2 | range tau = tau fun tyname(ref(ConsType(taus,t))) = t | tyname _ = raise Fail "Type.tyname: non-constructed type" (* Induce sharing on equal type variables in a type *) fun normalise tau = let (* Note that Overloaded nodes also have to be shared. * But since such types are always pre-built rather than * infered, we just take care that we construct them with * proper sharing and ignore Overloaded nodes here. *) val alphas = ref [] fun normalise(tau as ref(TyVar(alpha))) = (case List.find (fn(alpha1,_) => alpha1 = alpha) (!alphas) of SOME(_,tau1) => tau1 | NONE => ( alphas := (alpha,tau) :: !alphas ; tau ) ) | normalise(ref(Link(tau))) = normalise tau | normalise(tau as ref tau') = ( tau := normalise' tau' ; tau ) and normalise'(RowType(Rho,r)) = RowType(LabMap.map normalise Rho, r) | normalise'(FunType(tau1,tau2)) = FunType(normalise tau1, normalise tau2) | normalise'(ConsType(taus,t)) = ConsType(List.map normalise taus, t) | normalise'(Overloaded(O)) = Overloaded(O) | normalise' _ = raise Fail "Type.normalise: bypassed type variable or link" in normalise tau end (* Cloning under a substitution and a type realisation *) fun clone (mu,phi) tau = let (* Cloning must respect sharing, so an association list is used * to remember nodes already visited together with their copy. *) val mu' = ref mu val cloned = ref [] fun clone tau = case List.find (fn(tau1,_) => tau1 = tau) (!cloned) of SOME(_,tau2) => tau2 | NONE => let val tau2 = clone' tau in cloned := (tau,tau2) :: !cloned ; tau2 end and clone'(tau as ref(TyVar(alpha))) = (case TyVarMap.find(!mu', alpha) of NONE => tau | SOME tau => tau ) | clone'(ref(RowType(Rho,r))) = ref(RowType(LabMap.map clone Rho, r)) | clone'(ref(FunType(tau1,tau2))) = ref(FunType(clone tau1, clone tau2)) | clone'(tau as ref(ConsType(taus,t))) = let val taus2 = List.map clone taus in case TyNameMap.find(phi, t) of NONE => ref(ConsType(taus2,t)) | SOME(alphas,tau1) => let val cloned' = !cloned in mu' := ListPair.foldl (fn(alpha,tau2,mu) => TyVarMap.insert(mu,alpha,tau2)) (!mu') (alphas,taus2) ; clone' tau1 before cloned := cloned' end end | clone'(ref(Overloaded(O))) = ref(Overloaded(O)) | clone'(ref(Link(tau))) = clone tau in clone tau end (* Substitution, and realisation [Section 5.2] *) fun substitute mu = clone(mu,TyNameMap.empty) fun realise phi = clone(TyVarMap.empty,phi) (* Type variable and type name extraction [Section 4.2] *) fun tyvars(ref tau') = tyvars' tau' and tyvars'(TyVar(alpha)) = TyVarSet.singleton alpha | tyvars'(RowType(Rho,r)) = LabMap.foldl (fn(tau,U) => TyVarSet.union(U, tyvars tau)) TyVarSet.empty Rho | tyvars'(FunType(tau1,tau2)) = TyVarSet.union(tyvars tau1, tyvars tau2) | tyvars'(ConsType(taus,t)) = List.foldl (fn(tau,U) => TyVarSet.union(U, tyvars tau)) TyVarSet.empty taus | tyvars'(Overloaded(O)) = TyVarSet.empty | tyvars'(Link(tau)) = tyvars tau fun tynames(ref tau') = tynames' tau' and tynames'(TyVar(alpha)) = TyNameSet.empty | tynames'(RowType(Rho,r)) = LabMap.foldl (fn(tau,T) => TyNameSet.union(T, tynames tau)) TyNameSet.empty Rho | tynames'(FunType(tau1,tau2)) = TyNameSet.union(tynames tau1, tynames tau2) | tynames'(ConsType(taus,t)) = let val T = List.foldl (fn(tau,T) => TyNameSet.union(T, tynames tau)) TyNameSet.empty taus in TyNameSet.add(T, t) end | tynames'(Overloaded(O)) = (* Conservative approximation *) OverloadingClass.set O | tynames'(Link(tau)) = tynames tau (* Check for equality type [Section 4.4] *) fun admitsEquality(ref tau') = admitsEquality' tau' and admitsEquality'(TyVar alpha) = TyVar.admitsEquality alpha orelse not(TyVar.isExplicit alpha) | admitsEquality'(RowType(Rho,CLOSEDRow)) = LabMap.all admitsEquality Rho | admitsEquality'(RowType(Rho,FLEXRow _)) = raise Fail "Type.admitsEquality: flexible row" | admitsEquality'(FunType _) = false | admitsEquality'(ConsType(taus,t)) = (case TyName.equality t of TyName.SPECIALEQ => true | TyName.EQ => List.all admitsEquality taus | TyName.NOEQ => false ) | admitsEquality'(Overloaded(O)) = raise Fail "Type.admitsEquality: overloaded type" | admitsEquality'(Link(tau)) = admitsEquality tau (* Look for flexible records *) fun isFlexible(ref tau') = isFlexible' tau' and isFlexible'(TyVar(alpha')) = false | isFlexible'(RowType(Rho,r)) = r <> CLOSEDRow orelse LabMap.exists isFlexible Rho | isFlexible'(FunType(tau1,tau2)) = isFlexible tau1 orelse isFlexible tau2 | isFlexible'(ConsType(taus,t)) = List.exists isFlexible taus | isFlexible'(Overloaded(O)) = false | isFlexible'(Link(tau)) = isFlexible tau (* Unification *) exception Unify fun occurs(alpha, ref tau') = occurs'(alpha, tau') and occurs'(alpha, TyVar(alpha')) = alpha = alpha' | occurs'(alpha, RowType(Rho,r)) = LabMap.exists (fn tau => occurs(alpha, tau)) Rho | occurs'(alpha, FunType(tau1,tau2)) = occurs(alpha, tau1) orelse occurs(alpha, tau2) | occurs'(alpha, ConsType(taus,t)) = List.exists (fn tau => occurs(alpha, tau)) taus | occurs'(alpha, Overloaded(O)) = false | occurs'(alpha, Link(tau)) = occurs(alpha, tau) fun unify(ref(Link(tau1)), tau2) = unify(tau1, tau2) | unify(tau1, ref(Link(tau2))) = unify(tau1, tau2) | unify(tau1 as ref tau1', tau2 as ref tau2') = if tau1 = tau2 then () else let val tau' = Link(ref(unify'(tau1',tau2'))) in tau1 := tau' ; tau2 := tau' end and unify'(TyVar(alpha), tau') = unifyTyVar(alpha, tau') | unify'(tau', TyVar(alpha)) = unifyTyVar(alpha, tau') | unify'(Overloaded(O), tau') = unifyOverloaded(O, tau') | unify'(tau', Overloaded(O)) = unifyOverloaded(O, tau') | unify'(tau' as FunType(tau11,tau12), FunType(tau21,tau22)) = ( unify(tau11,tau21) ; unify(tau12,tau22) ; tau' ) | unify'(RowType(Rho1,r1), RowType(Rho2,r2)) = let fun unifyField r (lab, tau1, Rho) = case LabMap.find(Rho, lab) of SOME tau2 => ( unify(tau1,tau2) ; #1(LabMap.remove(Rho,lab)) ) | NONE => case r of CLOSEDRow => raise Unify | FLEXRow eq => ( if eq then makeEquality tau1 else () ; Rho ) val Rho1' = LabMap.foldli (unifyField r1) Rho1 Rho2 val _ = LabMap.foldli (unifyField r2) Rho2 Rho1' val r = case (r1,r2) of (CLOSEDRow, _) => CLOSEDRow | (_, CLOSEDRow) => CLOSEDRow | (FLEXRow eq1, FLEXRow eq2) => FLEXRow(eq1 orelse eq2) in RowType(LabMap.unionWith #2 (Rho2,Rho1'), r) end | unify'(tau' as ConsType(taus1,t1), ConsType(taus2,t2)) = if t1 = t2 then ( ListPair.app unify (taus1,taus2) ; tau' ) else raise Unify | unify' _ = raise Unify and unifyTyVar(alpha1, TyVar(alpha2)) = if alpha1 = alpha2 then TyVar(alpha2) else if not(TyVar.isExplicit alpha1) then bindTyVar(alpha1, TyVar(alpha2)) else if not(TyVar.isExplicit alpha2) then bindTyVar(alpha2, TyVar(alpha1)) else raise Unify | unifyTyVar(alpha, tau') = if TyVar.isExplicit alpha orelse occurs'(alpha, tau') then raise Unify else bindTyVar(alpha, tau') and bindTyVar(alpha, tau') = if TyVar.admitsEquality alpha then makeEquality' tau' else tau' and unifyOverloaded(O, TyVar(alpha2)) = unifyTyVar(alpha2, Overloaded(O)) | unifyOverloaded(O, tau' as ConsType([],t)) = if OverloadingClass.member(O, t) then tau' else raise Unify | unifyOverloaded(O1, Overloaded(O2)) = (case OverloadingClass.intersection(O1,O2) of NONE => raise Unify | SOME O => Overloaded(O) ) | unifyOverloaded(O, _) = raise Unify and makeEquality(tau as ref tau') = tau := makeEquality' tau' and makeEquality'(TyVar(alpha)) = if TyVar.admitsEquality alpha then TyVar(alpha) else if TyVar.isExplicit alpha then raise Unify else TyVar(TyVar.invent true) | makeEquality'(RowType(Rho,r)) = ( LabMap.app makeEquality Rho ; RowType(Rho, case r of CLOSEDRow => CLOSEDRow | FLEXRow _ => FLEXRow true) ) | makeEquality'(FunType _) = raise Unify | makeEquality'(tau' as ConsType(taus,t)) = (case TyName.equality t of TyName.SPECIALEQ => tau' | TyName.EQ => ( List.app makeEquality taus ; tau' ) | TyName.NOEQ => raise Unify ) | makeEquality'(Overloaded(O)) = (case OverloadingClass.makeEquality O of NONE => raise Unify | SOME O' => Overloaded(O') ) | makeEquality'(Link(tau)) = ( makeEquality tau ; Link(tau) ) fun unifyRestricted U (tau1,tau2) = let fun skolemise(alpha, mu) = let val equality = if TyVar.admitsEquality alpha then TyName.EQ else TyName.NOEQ val tau' = ConsType([], TyName.invent(0,equality)) in TyVarMap.insert(mu, alpha, ref tau') end val mu = TyVarSet.foldl skolemise TyVarMap.empty U in unify(substitute mu tau1, substitute mu tau2) end (* Assign default type to overloaded type components [Appendix E] *) fun defaultOverloaded(tau as ref(Overloaded(O))) = tau := ConsType([], OverloadingClass.default O) | defaultOverloaded(ref tau') = defaultOverloaded' tau' and defaultOverloaded'(TyVar(alpha')) = () | defaultOverloaded'(RowType(Rho,r)) = LabMap.app defaultOverloaded Rho | defaultOverloaded'(FunType(tau1,tau2)) = ( defaultOverloaded tau1 ; defaultOverloaded tau2 ) | defaultOverloaded'(ConsType(taus,t)) = List.app defaultOverloaded taus | defaultOverloaded'(Overloaded(O)) = raise Fail "Type.defaultOverloaded: bypassed overloaded type" | defaultOverloaded'(Link(tau)) = defaultOverloaded tau (* Operations on rows *) val emptyRho = ( LabMap.empty, CLOSEDRow ) fun singletonRho(lab,tau) = ( LabMap.singleton(lab,tau), CLOSEDRow ) fun inventRho() = ( LabMap.empty, FLEXRow false ) fun insertRho((Rho,r), lab, tau) = ( LabMap.insert(Rho, lab, tau), r ) fun findLab((Rho,r), lab) = LabMap.find(Rho, lab) end (* stop of Type.sml *) (* start of TYPESCHEME.sml *) (* * Standard ML type schemes * * Definition, section 4.2, 4.5, and 4.8 * * Note: * Instantiation copies a type (except free type variables). * Closure does not! *) signature TYPESCHEME = sig (* Import types *) type Type = Type.Type type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Substitution = Type.Substitution type Realisation = Type.Realisation type 'a TyNameMap = 'a TyNameMap.map (* Type [Section 4.2] *) type TypeScheme = TyVar list * Type (* [sigma] *) (* Operations *) val instance: TypeScheme -> Type val instance': TypeScheme -> TyVar list * Type val Clos: Type -> TypeScheme val ClosRestricted: TyVarSet -> Type -> TypeScheme val isClosed: TypeScheme -> bool val tyvars: TypeScheme -> TyVarSet val tynames: TypeScheme -> TyNameSet val normalise: TypeScheme -> TypeScheme val generalises: TypeScheme * TypeScheme -> bool val equals: TypeScheme * TypeScheme -> bool val substitute: Substitution -> TypeScheme -> TypeScheme val realise: Realisation -> TypeScheme -> TypeScheme end (* stop of TYPESCHEME.sml *) (* start of TypeScheme.sml *) (* * Standard ML type schemes * * Definition, section 4.2, 4.5, and 4.8 * * Note: * Instantiation copies a type (except free type variables). * Closure does not! *) structure TypeScheme :> TYPESCHEME = struct (* Import types *) type Type = Type.Type type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Substitution = Type.Substitution type Realisation = Type.Realisation type 'a TyNameMap = 'a TyNameMap.map (* Type [Section 4.2] *) type TypeScheme = TyVar list * Type (* [sigma] *) (* Some helper (this should be in the library...) *) fun List_foldri f y0 xs = let fun fold(n, []) = y0 | fold(n, x::xs) = f(n, x, fold(n+1,xs)) in fold(0,xs) end (* Type variable and type name extraction [Section 4.2] *) fun tyvars (alphas,tau) = let val U = Type.tyvars tau in List.foldl (fn(alpha,U) => TyVarSet.delete(U,alpha) handle LibBase.NotFound => U) U alphas end fun tynames (alphas,tau) = Type.tynames tau (* Instantiation *) fun instance' (alphas,tau) = let val alphas' = List.map TyVar.instance alphas val mu = ListPair.foldl (fn(alpha, alpha', mu) => TyVarMap.insert(mu, alpha, Type.fromTyVar alpha')) TyVarMap.empty (alphas, alphas') in ( alphas', Type.substitute mu tau ) end fun instance sigma = #2(instance' sigma) (* Generalisation [Section 4.5] *) fun generalisesType(sigma, tau) = let val U = Type.tyvars tau in ( Type.unifyRestricted U (instance sigma, tau) ; true ) handle Type.Unify => false end fun generalises(sigma1, sigma2) = generalisesType(sigma1, instance sigma2) (* Closure [Section 4.8] *) fun Clos tau = (* Does not copy! *) ( TyVarSet.listItems(Type.tyvars tau), tau ) fun ClosRestricted U tau = ( TyVarSet.listItems(TyVarSet.difference(Type.tyvars tau, U)), tau ) fun isClosed (alphas,tau) = TyVarSet.isSubset(Type.tyvars tau, TyVarSet.fromList alphas) (* Comparison [Section 4.5] *) fun equals((alphas1,tau1), (alphas2,tau2)) = List.length alphas1 = List.length alphas2 andalso let fun insert(alpha1, alpha2, mu) = TyVarMap.insert(mu, alpha1, Type.fromTyVar alpha2) val (alphas2',tau2') = instance' (alphas2,tau2) val mu = ListPair.foldl insert TyVarMap.empty (alphas1,alphas2') val tau1' = Type.substitute mu tau1 val U = TyVarSet.fromList alphas2' in ( Type.unifyRestricted U (tau1',tau2') ; true ) handle Type.Unify => false end (* Normalisation (for output) *) fun normalise (alphas,tau) = let fun insert(n, alpha, (alphas',mu)) = let val alpha' = TyVar.normalise(alpha, n) val tau = Type.fromTyVar alpha' in ( alpha'::alphas', TyVarMap.insert(mu, alpha,tau) ) end val (alphas',mu) = List_foldri insert (nil,TyVarMap.empty) alphas in ( alphas', Type.substitute mu tau ) end (* Substitution *) fun substitute mu (alphas,tau) = let val mu' = List.foldl (fn(alpha,mu) => #1(TyVarMap.remove(mu,alpha)) handle LibBase.NotFound => mu) mu alphas in ( alphas, Type.substitute mu' tau ) end (* Realisation [Section 5.2] *) fun realise phi (alphas,tau) = (alphas, Type.realise phi tau) end (* stop of TypeScheme.sml *) (* start of TYPEFCN.sml *) (* * Standard ML type functions * * Definition, section 4.2, 4.4, and 4.8 * * Note: * Application copies the type (except free type variables). *) signature TYPEFCN = sig (* Import types *) type Type = Type.Type type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Realisation = Type.TypeFcn TyNameMap.map (* Type [Section 4.2] *) type TypeFcn = Type.TypeFcn (* [theta] *) (* Operations *) val fromTyName: TyName -> TypeFcn val toTyName: TypeFcn -> TyName option val isClosed: TypeFcn -> bool val arity: TypeFcn -> int val admitsEquality: TypeFcn -> bool val tyvars: TypeFcn -> TyVarSet val tynames: TypeFcn -> TyNameSet val normalise: TypeFcn -> TypeFcn val rename: TypeFcn -> TypeFcn val equals: TypeFcn * TypeFcn -> bool exception Apply val apply: Type list * TypeFcn -> Type (* may raise Apply *) val realise: Realisation -> TypeFcn -> TypeFcn val makeEquality: TypeFcn -> unit end (* stop of TYPEFCN.sml *) (* start of TypeFcn.sml *) (* * Standard ML type functions * * Definition, section 4.2, 4.4, and 4.8 * * Note: * Application copies the type (except free type variables). *) structure TypeFcn :> TYPEFCN = struct (* Import types *) type Type = Type.Type type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Realisation = Type.TypeFcn TyNameMap.map (* Type [Section 4.2] *) type TypeFcn = Type.TypeFcn (* [theta] *) (* Operations *) val tyvars = TypeScheme.tyvars (* same type ;-) *) val tynames = TypeScheme.tynames val equals = TypeScheme.equals val isClosed = TypeScheme.isClosed val realise = TypeScheme.realise val rename = TypeScheme.instance' val normalise = TypeScheme.normalise (* Arity [Section 4.4] *) fun arity (alphas,tau) = List.length alphas (* Equality [Section 4.4] *) fun admitsEquality (alphas,tau) = let fun insert(alpha, mu) = TyVarMap.insert(mu, alpha, Type.fromTyVar(TyVar.invent true)) val mu = List.foldl insert TyVarMap.empty alphas in Type.admitsEquality(Type.substitute mu tau) end (* Eta-conversion [Section 4.4] *) fun fromTyName t = let val alphas = List.tabulate(TyName.arity t, TyVar.fromIndex false) in ( alphas, Type.fromConsType(List.map Type.fromTyVar alphas, t) ) end fun toTyName(alphas, ref(Type.ConsType(taus,t))) = t | toTyName _ = raise Fail "TypeFcn.toTyName: invalid type function" fun toTyName(alphas, ref(Type.ConsType(taus,t))) = let fun isSame(alpha, ref(Type.TyVar alpha')) = alpha = alpha' | isSame(alpha, _ ) = false in if List.length alphas = List.length taus andalso ListPair.all isSame (alphas, taus) then SOME t else NONE end | toTyName _ = NONE (* Application [Section 4.4] *) exception Apply fun apply(taus, (alphas,tau)) = if List.length taus <> List.length alphas then raise Apply else let fun insert(alpha, tau, mu) = TyVarMap.insert(mu, alpha, tau) val mu = ListPair.foldl insert TyVarMap.empty (alphas, taus) in Type.substitute mu tau end (* Make it an equality type *) fun makeEquality (alphas,tau) = Type.makeEquality tau end (* stop of TypeFcn.sml *) (* start of IDSTATUS.sml *) (* * Standard ML identifier status * * Definition, sections 4.1 and 5.5 *) signature IDSTATUS = sig (* Type [Section 4.1] *) datatype IdStatus = c | e | v (* [is] *) (* Operations *) val generalises: IdStatus * IdStatus -> bool end (* stop of IDSTATUS.sml *) (* start of IdStatus.sml *) (* * Standard ML identifier status * * Definition, sections 4.1 and 5.5 *) structure IdStatus :> IDSTATUS = struct (* Type [Section 4.1] *) datatype IdStatus = c | e | v (* [is] *) (* Generalisation [Section 5.5] *) fun generalises(is1,is2) = is1 = is2 orelse is2 = v end (* stop of IdStatus.sml *) (* start of GENERIC_ENV.sml *) (* * Standard ML generic core environment * * Definition, sections 4.2, 4.3, 6.3 and 7.2 * * Notes: * - A datatype Str is necessary to break the recursion * between Env and StrEnv. * - Also, all types are parameterised over the range of value and type * environments. This is because of the recursion between values and * the dynamic environment (via function closures) -- we cannot make them * into functor parameters as this would require recursive structures. *) signature GENERIC_ENV = sig (* Import types *) type VId = VId.Id type TyCon = TyCon.Id type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId type IdStatus = IdStatus.IdStatus type 'a VIdMap = 'a VIdMap.map type 'a TyConMap = 'a TyConMap.map type 'a StrIdMap = 'a StrIdMap.map (* Export types [Section 4.2 and 6.3] *) datatype ('a,'b) Str' = Str of (*Env*) ('a,'b) Str' StrIdMap * 'b TyConMap * 'a VIdMap type 'a ValEnv' = 'a VIdMap type 'b TyEnv' = 'b TyConMap type ('a,'b) StrEnv' = ('a,'b) Str' StrIdMap type ('a,'b) Env' = ('a,'b) StrEnv' * 'b TyEnv' * 'a ValEnv' (* Operations *) val empty: ('a,'b) Env' val fromSE: ('a,'b) StrEnv' -> ('a,'b) Env' val fromTE: 'b TyEnv' -> ('a,'b) Env' val fromVE: 'a ValEnv' -> ('a,'b) Env' val fromVEandTE: 'a ValEnv' * 'b TyEnv' -> ('a,'b) Env' val plus: ('a,'b) Env' * ('a,'b) Env' -> ('a,'b) Env' val plusVE: ('a,'b) Env' * 'a ValEnv' -> ('a,'b) Env' val plusTE: ('a,'b) Env' * 'b TyEnv' -> ('a,'b) Env' val plusSE: ('a,'b) Env' * ('a,'b) StrEnv' -> ('a,'b) Env' val plusVEandTE: ('a,'b) Env' * ('a ValEnv' * 'b TyEnv') -> ('a,'b) Env' val findVId: ('a,'b) Env' * VId -> 'a option val findTyCon: ('a,'b) Env' * TyCon -> 'b option val findStrId: ('a,'b) Env' * StrId -> ('a,'b) Str' option val findLongVId: ('a,'b) Env' * longVId -> 'a option val findLongTyCon: ('a,'b) Env' * longTyCon -> 'b option val findLongStrId: ('a,'b) Env' * longStrId -> ('a,'b) Str' option val disjoint: ('a,'b) Env' * ('a,'b) Env' -> bool end (* stop of GENERIC_ENV.sml *) (* start of GenericEnvFn.sml *) (* * Standard ML generic core environment * * Definition, sections 4.2, 4.3, 6.3 and 7.2 * * Notes: * - A datatype Str is necessary to break the recursion * between Env and StrEnv. * - Also, all types are parameterised over the range of value and type * environments. This is because of the recursion between values and * the dynamic environment (via function closures) -- we cannot make them * into functor parameters as this would require recursive structures. *) functor GenericEnvFn() :> GENERIC_ENV = struct (* Import types *) type VId = VId.Id type TyCon = TyCon.Id type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId type IdStatus = IdStatus.IdStatus type 'a VIdMap = 'a VIdMap.map type 'a TyConMap = 'a TyConMap.map type 'a StrIdMap = 'a StrIdMap.map (* Export types [Section 4.2 and 6.3] *) datatype ('a,'b) Str' = Str of (*Env*) ('a,'b) Str' StrIdMap * 'b TyConMap * 'a VIdMap type 'a ValEnv' = 'a VIdMap (* [VE] *) type 'b TyEnv' = 'b TyConMap (* [TE] *) type ('a,'b) StrEnv' = ('a,'b) Str' StrIdMap (* [SE] *) type ('a,'b) Env' = ('a,'b) StrEnv' * 'b TyEnv' * 'a ValEnv' (* [E] *) (* Injections [Section 4.3] *) val empty = ( StrIdMap.empty, TyConMap.empty, VIdMap.empty ) fun fromSE SE = ( SE, TyConMap.empty, VIdMap.empty ) fun fromTE TE = ( StrIdMap.empty, TE, VIdMap.empty ) fun fromVE VE = ( StrIdMap.empty, TyConMap.empty, VE ) fun fromVEandTE(VE,TE) = ( StrIdMap.empty, TE, VE ) (* Modifications [Section 4.3] *) infix plus plusVE plusTE plusSE plusVEandTE fun (SE,TE,VE) plus (SE',TE',VE') = ( StrIdMap.unionWith #2 (SE,SE') , TyConMap.unionWith #2 (TE,TE') , VIdMap.unionWith #2 (VE,VE') ) fun (SE,TE,VE) plusVE VE' = ( SE, TE, VIdMap.unionWith #2 (VE,VE') ) fun (SE,TE,VE) plusTE TE' = ( SE, TyConMap.unionWith #2 (TE,TE'), VE ) fun (SE,TE,VE) plusSE SE' = ( StrIdMap.unionWith #2 (SE,SE'), TE, VE ) fun (SE,TE,VE) plusVEandTE (VE',TE') = ( SE , TyConMap.unionWith #2 (TE,TE') , VIdMap.unionWith #2 (VE,VE') ) (* Application (lookup) [Section 4.3] *) fun findVId ((SE,TE,VE), vid) = VIdMap.find(VE, vid) fun findTyCon((SE,TE,VE), tycon) = TyConMap.find(TE, tycon) fun findStrId((SE,TE,VE), strid) = StrIdMap.find(SE, strid) fun findLongX'(E, findX, [], x) = findX(E, x) | findLongX'(E, findX, strid::strids, x) = Option.mapPartial (fn E => findLongX'(E, findX, strids, x)) (Option.map (fn Str E => E) (findStrId(E, strid))) fun findLongX (explodeLongX, findX) (E, longX) = let val (strids,x) = explodeLongX longX in findLongX'(E, findX, strids, x) end fun findLongVId x = findLongX (LongVId.explode, findVId) x fun findLongTyCon x = findLongX (LongTyCon.explode, findTyCon) x fun findLongStrId x = findLongX (LongStrId.explode, findStrId) x (* Disjointness *) fun disjoint((SE1,TE1,VE1), (SE2,TE2,VE2)) = StrIdMap.disjoint(SE1,SE2) andalso TyConMap.disjoint(TE1,TE2) andalso VIdMap.disjoint(VE1,VE2) end (* stop of GenericEnvFn.sml *) (* start of STATIC_ENV.sml *) (* * Standard ML environments of the static semantics of the core * * Definition, sections 4.2, 4.3, 4.8, 4.9, and 5.5 * * Note: * We call the domain type of value environments ValStr. *) signature STATIC_ENV = sig (* Inheritance *) include GENERIC_ENV (* Import types *) type TypeScheme = TypeScheme.TypeScheme type TypeFcn = TypeFcn.TypeFcn type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Realisation = Type.Realisation (* Export types [Section 4.2] *) type ValStr = TypeScheme * IdStatus type ValEnv = ValStr VIdMap (* [VE] *) type TyStr = TypeFcn * ValEnv type TyEnv = TyStr TyConMap (* [TE] *) type Str = (ValStr, TyStr) Str' type StrEnv = Str StrIdMap (* [SE] *) type Env = StrEnv * TyEnv * ValEnv (* [E] *) (* Operations *) val tyvarsVE: ValEnv -> TyVarSet val tyvars: Env -> TyVarSet val tynamesTE: TyEnv -> TyNameSet val tynamesSE: StrEnv -> TyNameSet val tynames: Env -> TyNameSet val isWellFormed: Env -> bool val Clos: ValEnv -> ValEnv val containsFlexibleType: ValEnv -> bool val defaultOverloaded: ValEnv -> unit val makeEquality: TyEnv -> unit val maximiseEquality: TyEnv * ValEnv -> TyEnv * ValEnv val Abs: TyEnv * Env -> Env val realise: Realisation -> Env -> Env val enriches: Env * Env -> bool end (* stop of STATIC_ENV.sml *) (* start of StaticEnv.sml *) (* * Standard ML environments of the static semantics of the core * * Definition, sections 4.2, 4.3, 4.8, 4.9, and 5.5 * * Note: * We call the domain type of value environments ValStr. *) structure StaticEnv :> STATIC_ENV = struct (* Inheritance *) structure GenericEnv = GenericEnvFn() open GenericEnv (* Import types *) type TypeScheme = TypeScheme.TypeScheme type TypeFcn = TypeFcn.TypeFcn type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type TyName = TyName.TyName type TyNameSet = TyNameSet.set type Realisation = Type.Realisation (* Export types [Section 4.2] *) type ValStr = TypeScheme * IdStatus type ValEnv = ValStr VIdMap (* [VE] *) type TyStr = TypeFcn * ValEnv type TyEnv = TyStr TyConMap (* [TE] *) type Str = (ValStr, TyStr) Str' type StrEnv = Str StrIdMap (* [SE] *) type Env = StrEnv * TyEnv * ValEnv (* [E] *) (* Further modifications [Section 4.3] *) infix TEplus fun TE' TEplus (SE,TE,VE) = ( SE, TyConMap.unionWith #2 (TE',TE), VE ) (* Type variable and type name set [Section 4.2] *) fun tyvarsVE VE = VIdMap.foldl (fn((sigma,is), U) => TyVarSet.union(U, TypeScheme.tyvars sigma)) TyVarSet.empty VE fun tyvarsTE TE = TyConMap.foldl (fn((theta,VE), U) => TyVarSet.union(TyVarSet.union (U, TypeFcn.tyvars theta), tyvarsVE VE)) TyVarSet.empty TE fun tyvarsSE SE = StrIdMap.foldl (fn(Str E, U) => TyVarSet.union(U, tyvars E)) TyVarSet.empty SE and tyvars (SE,TE,VE) = TyVarSet.union(TyVarSet.union(tyvarsSE SE, tyvarsTE TE), tyvarsVE VE) fun tynamesVE VE = VIdMap.foldl (fn((sigma,is), T) => TyNameSet.union(T, TypeScheme.tynames sigma)) TyNameSet.empty VE fun tynamesTE TE = TyConMap.foldl (fn((theta,VE), T) => TyNameSet.union(TyNameSet.union (T, TypeFcn.tynames theta), tynamesVE VE)) TyNameSet.empty TE fun tynamesSE SE = StrIdMap.foldl (fn(Str E, T) => TyNameSet.union(T, tynames E)) TyNameSet.empty SE and tynames (SE,TE,VE) = TyNameSet.union(TyNameSet.union(tynamesSE SE, tynamesTE TE), tynamesVE VE) (* Well-formedness [Section 4.9] *) fun isWellFormedTyStr (theta,VE) = VIdMap.isEmpty VE orelse isSome(TypeFcn.toTyName theta) fun isWellFormedTE TE = TyConMap.all isWellFormedTyStr TE fun isWellFormedSE SE = StrIdMap.all (fn Str E => isWellFormed E) SE and isWellFormed (SE,TE,VE) = isWellFormedTE TE andalso isWellFormedSE SE (* Closure [Section 4.8] *) fun Clos VE = VIdMap.map (fn((_,tau), is) => (TypeScheme.Clos tau, is)) VE (* Check for unresolved flexible record types [Section 4.11, item 1] *) fun containsFlexibleType VE = VIdMap.exists (fn((_,tau), is) => Type.isFlexible tau) VE (* Assign default types to overloaded types [Appendix E] *) fun defaultOverloaded VE = VIdMap.app (fn((_,tau), is) => Type.defaultOverloaded tau) VE (* Realisation [Section 5.2] *) fun realiseVE phi VE = VIdMap.map (fn(sigma,is) => ( TypeScheme.realise phi sigma, is )) VE and realiseTE phi TE = TyConMap.map (fn(theta,VE) => ( TypeFcn.realise phi theta , realiseVE phi VE )) TE and realiseSE phi SE = StrIdMap.map (fn(Str E) => Str(realise phi E)) SE and realise phi (SE,TE,VE) = ( realiseSE phi SE , realiseTE phi TE , realiseVE phi VE ) (* Make all type names bound in a type environment equality types *) (* Assumes abstract types, i.e. no constructors. *) fun makeEquality TE = TyConMap.app (fn(theta,VE) => TypeFcn.makeEquality theta) TE (* Maximise equality of a type environment [Section 4.9], * together with its appendant value envrionment *) fun admitsEqualityValStr ((_,tau),_) = Type.admitsEquality tau fun maximiseEquality(TE,VE) = let fun checkTyStr((theta,VE), (phi,changed)) = let val t = valOf(TypeFcn.toTyName theta) in if TyName.equality t = TyName.EQ andalso not(VIdMap.all admitsEqualityValStr VE) then ( TyNameMap.insert(phi, t, TypeFcn.fromTyName (TyName.removeEquality t) ) , true ) else ( phi, changed ) end fun checkTE(TE, phi) = let val (phi',change) = TyConMap.foldl checkTyStr (phi,false) TE val TE' = realiseTE phi' TE in if change then checkTE(TE', phi') else (TE', phi') end val (TE',phi) = checkTE(TE, TyNameMap.empty) in ( TE', realiseVE phi VE ) end (* Abstraction of a type environment [Section 4.9] *) fun AbsTE(TE) = TyConMap.map (fn(theta,_) => (theta,VIdMap.empty)) TE fun Abs(TE,E) = let val ts = tynamesTE TE val phi = TyNameSet.foldl (fn(t,phi) => TyNameMap.insert(phi, t, TypeFcn.fromTyName(TyName.Abs t))) TyNameMap.empty ts in realise phi (AbsTE(TE) TEplus E) end (* Disjointness *) fun disjoint((SE1,TE1,VE1), (SE2,TE2,VE2)) = StrIdMap.disjoint(SE1,SE2) andalso TyConMap.disjoint(TE1,TE2) andalso VIdMap.disjoint(VE1,VE2) (* Enrichment [Section 5.5] *) fun equalsVE(VE1,VE2) = VIdMap.numItems VE1 = VIdMap.numItems VE2 andalso VIdMap.alli (fn(vid, (sigma1,is1)) => case VIdMap.find(VE2, vid) of NONE => false | SOME(sigma2,is2) => TypeScheme.equals(sigma1,sigma2) andalso is1 = is2 ) VE1 fun enriches((SE1,TE1,VE1), (SE2,TE2,VE2)) = enrichesSE(SE1,SE2) andalso enrichesTE(TE1,TE2) andalso enrichesVE(VE1,VE2) and enrichesSE(SE1,SE2) = StrIdMap.alli (fn(strid, Str E2) => case StrIdMap.find(SE1, strid) of NONE => false | SOME(Str E1) => enriches(E1,E2) ) SE2 and enrichesTE(TE1,TE2) = TyConMap.alli (fn(tycon, tystr2) => case TyConMap.find(TE1, tycon) of NONE => false | SOME tystr1 => enrichesTyStr(tystr1,tystr2) ) TE2 and enrichesVE(VE1,VE2) = VIdMap.alli (fn(vid, valstr2) => case VIdMap.find(VE1, vid) of NONE => false | SOME valstr1 => enrichesValStr(valstr1,valstr2) ) VE2 and enrichesTyStr((theta1,VE1), (theta2,VE2)) = TypeFcn.equals(theta1,theta2) andalso ( VIdMap.isEmpty VE2 orelse equalsVE(VE1,VE2) ) and enrichesValStr((sigma1,is1), (sigma2,is2)) = TypeScheme.generalises(sigma1,sigma2) andalso IdStatus.generalises(is1,is2) end (* stop of StaticEnv.sml *) (* start of SIG.sml *) (* * Standard ML signatures * * Definition, sections 5.1, 5.3, and 5.6 *) signature SIG = sig (* Import types *) type Env = StaticEnv.Env type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set type Realisation = Type.Realisation (* Type [Section 5.1] *) type Sig = TyNameSet * Env (* [Sigma] *) (* Operations *) val tyvars: Sig -> TyVarSet val tynames: Sig -> TyNameSet val rename: Sig -> Sig exception Match val match: Env * Sig -> Env * Realisation (* Matching *) end (* stop of SIG.sml *) (* start of Sig.sml *) (* * Standard ML signatures * * Definition, sections 5.1, 5.3, and 5.6 *) structure Sig :> SIG = struct (* Import types *) type Env = StaticEnv.Env type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set type Realisation = Type.Realisation (* Type [Section 5.1] *) type Sig = TyNameSet * Env (* [Sigma] *) (* Type variable and type name extraction [Section 4.2] *) fun tyvars (T,E) = StaticEnv.tyvars E fun tynames (T,E) = TyNameSet.difference(StaticEnv.tynames E, T) (* Alpha Renaming *) fun rename (T,E) = let val phi' = TyNameSet.foldl (fn(t,phi')=> TyNameMap.insert(phi',t,TyName.rename t)) TyNameMap.empty T val phi = TyNameMap.map TypeFcn.fromTyName phi' val T' = TyNameSet.map (fn t => valOf(TyNameMap.find(phi',t))) T val E' = StaticEnv.realise phi E in (T',E') end (* Matching [Section 5.6] *) exception Match fun matchTypeFcn(theta', theta, phi, T) = if TypeFcn.arity theta <> TypeFcn.arity theta' then raise Match else case TypeFcn.toTyName theta of NONE => phi | SOME t => if isSome(TyNameMap.find(phi, t)) orelse not(TyNameSet.member(T, t)) then phi else let val phi' = TyNameMap.insert(phi, t, TypeFcn.rename theta') in TyNameMap.map (TypeFcn.realise phi') phi' end fun matchTE(TE', TE, phi, T) = let fun matchTyStr(tycon, (theta,VE), phi) = case TyConMap.find(TE', tycon) of NONE => raise Match | SOME(theta',VE') => matchTypeFcn(theta', theta, phi, T) in TyConMap.foldli matchTyStr phi TE end fun matchSE(SE', SE, phi, T) = let fun matchStr(strid, StaticEnv.Str E, phi) = case StrIdMap.find(SE', strid) of NONE => raise Match | SOME(StaticEnv.Str E') => matchE(E', E, phi, T) in StrIdMap.foldli matchStr phi SE end and matchE((SE',TE',VE'), (SE,TE,VE), phi, T) = let val phi1 = matchTE(TE', TE, phi, T) val phi2 = matchSE(SE', SE, phi1, T) in phi2 end fun match(E', (T,E)) = let val phi = matchE(E', E, TyNameMap.empty, T) val E'' = StaticEnv.realise phi E in if StaticEnv.enriches(E',E'') then (E'', phi) else raise Match end end (* stop of Sig.sml *) (* start of FUNSIG.sml *) (* * Standard ML functor signatures * * Definition, sections 5.1 and 5.4 *) signature FUNSIG = sig (* Import types *) type Env = StaticEnv.Env type Sig = Sig.Sig type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set (* Type [Section 5.1] *) type FunSig = TyNameSet * (Env * Sig) (* [Phi] *) (* Operations *) val tyvars: FunSig -> TyVarSet val tynames: FunSig -> TyNameSet end (* stop of FUNSIG.sml *) (* start of FunSig.sml *) (* * Standard ML functor signatures * * Definition, sections 5.1 and 5.4 *) structure FunSig :> FUNSIG = struct (* Import types *) type Env = StaticEnv.Env type Sig = Sig.Sig type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set (* Type [Section 5.1] *) type FunSig = TyNameSet * (Env * Sig) (* [Phi] *) (* Type variable and type name extraction [Section 4.2] *) fun tyvars (T,(E,Sigma)) = TyVarSet.union(StaticEnv.tyvars E, Sig.tyvars Sigma) fun tynames (T,(E,Sigma)) = TyNameSet.difference(TyNameSet.union(StaticEnv.tynames E, Sig.tynames Sigma), T) end (* stop of FunSig.sml *) (* start of CONTEXT.sml *) (* * Standard ML contexts * * Definition, sections 4.2, 4.3, 4.7, and 4.9 *) signature CONTEXT = sig (* Import types *) type VId = VId.Id type TyCon = TyCon.Id type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId type TyName = TyName.TyName type TyNameSet = TyNameSet.set type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type IdStatus = IdStatus.IdStatus type TypeScheme = TypeScheme.TypeScheme type StrEnv = StaticEnv.StrEnv type Str = StaticEnv.Str type TyStr = StaticEnv.TyStr type TyEnv = StaticEnv.TyEnv type ValStr = StaticEnv.ValStr type ValEnv = StaticEnv.ValEnv type Env = StaticEnv.Env (* Type [Section 4.2] *) type Context = TyNameSet * TyVarSet * Env (* [C] *) (* Operations *) val Tof: Context -> TyNameSet val Uof: Context -> TyVarSet val Eof: Context -> Env val plusVE: Context * ValEnv -> Context val plusU: Context * TyVarSet -> Context val oplusE: Context * Env -> Context val oplusTE: Context * TyEnv -> Context val oplusVEandTE: Context * (ValEnv * TyEnv) -> Context val findVId: Context * VId -> ValStr option val findTyCon: Context * TyCon -> TyStr option val findStrId: Context * StrId -> Str option val findLongVId: Context * longVId -> ValStr option val findLongTyCon: Context * longTyCon -> TyStr option val findLongStrId: Context * longStrId -> Str option val tyvars: Context -> TyVarSet end (* stop of CONTEXT.sml *) (* start of Context.sml *) (* * Standard ML contexts * * Definition, sections 4.2, 4.3, 4.7, and 4.9 *) structure Context :> CONTEXT = struct (* Import types *) type VId = VId.Id type TyCon = TyCon.Id type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId type TyName = TyName.TyName type TyNameSet = TyNameSet.set type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type IdStatus = IdStatus.IdStatus type TypeScheme = TypeScheme.TypeScheme type StrEnv = StaticEnv.StrEnv type Str = StaticEnv.Str type TyStr = StaticEnv.TyStr type TyEnv = StaticEnv.TyEnv type ValStr = StaticEnv.ValStr type ValEnv = StaticEnv.ValEnv type Env = StaticEnv.Env (* Type [Section 4.2] *) type Context = TyNameSet * TyVarSet * Env (* [C] *) (* Projections [Section 4.3] *) fun Tof (T,U,E) = T fun Uof (T,U,E) = U fun Eof (T,U,E) = E (* Modification [Section 4.3] *) infix plusVE plusU oplusE oplusTE oplusVEandTE fun (T,U,E) plusVE VE = ( T, U, StaticEnv.plusVE(E,VE) ) fun (T,U,E) plusU U' = ( T, TyVarSet.union(U,U'), E ) fun (T,U,E) oplusE E' = ( TyNameSet.union(T, StaticEnv.tynames E) , U , StaticEnv.plus(E,E') ) fun (T,U,E) oplusTE TE = ( TyNameSet.union(T, StaticEnv.tynamesTE TE) , U , StaticEnv.plusTE(E,TE) ) fun (T,U,E) oplusVEandTE (VE,TE) = ( TyNameSet.union(T, StaticEnv.tynamesTE TE) , U , StaticEnv.plusVEandTE(E, (VE,TE)) ) (* Application (lookup) [Section 4.3] *) fun findVId ((T,U,E), vid) = StaticEnv.findVId(E, vid) fun findTyCon((T,U,E), tycon) = StaticEnv.findTyCon(E, tycon) fun findStrId((T,U,E), strid) = StaticEnv.findStrId(E, strid) fun findLongVId ((T,U,E), longvid) = StaticEnv.findLongVId(E,longvid) fun findLongTyCon((T,U,E), longtycon) = StaticEnv.findLongTyCon(E,longtycon) fun findLongStrId((T,U,E), longstrid) = StaticEnv.findLongStrId(E,longstrid) (* Calculation of tyvars [Section 4.2] *) fun tyvars (T,U,E) = TyVarSet.union(U, StaticEnv.tyvars E) end (* stop of Context.sml *) (* start of STATIC_BASIS.sml *) (* * Standard ML static basis and environments of modules * * Definition, section 5.1 *) signature STATIC_BASIS = sig (* Import types *) type StrId = StrId.Id type SigId = SigId.Id type FunId = FunId.Id type longStrId = LongStrId.longId type longTyCon = LongTyCon.longId type Env = StaticEnv.Env type StrEnv = StaticEnv.StrEnv type Str = StaticEnv.Str type TyStr = StaticEnv.TyStr type Context = Context.Context type Sig = Sig.Sig type FunSig = FunSig.FunSig type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set type 'a SigIdMap = 'a SigIdMap.map type 'a FunIdMap = 'a FunIdMap.map (* Types [Section 5.1] *) type SigEnv = Sig SigIdMap (* [G] *) type FunEnv = FunSig FunIdMap (* [F] *) type Basis = TyNameSet * FunEnv * SigEnv * Env (* [B] *) (* Operations *) val empty: Basis val fromTandE: TyNameSet * Env -> Basis val fromTandF: TyNameSet * FunEnv -> Basis val fromTandG: TyNameSet * SigEnv -> Basis val Tof: Basis -> TyNameSet val Cof: Basis -> Context val plus: Basis * Basis -> Basis val plusT: Basis * TyNameSet -> Basis val oplusSE: Basis * StrEnv -> Basis val oplusG: Basis * SigEnv -> Basis val oplusF: Basis * FunEnv -> Basis val oplusE: Basis * Env -> Basis val findStrId: Basis * StrId -> Str option val findSigId: Basis * SigId -> Sig option val findFunId: Basis * FunId -> FunSig option val findLongStrId: Basis * longStrId -> Str option val findLongTyCon: Basis * longTyCon -> TyStr option val tyvars: Basis -> TyVarSet val tynamesF: FunEnv -> TyNameSet val tynamesG: SigEnv -> TyNameSet end (* stop of STATIC_BASIS.sml *) (* start of StaticBasis.sml *) (* * Standard ML static basis and environments of modules * * Definition, section 5.1 *) structure StaticBasis :> STATIC_BASIS = struct (* Import types *) type StrId = StrId.Id type SigId = SigId.Id type FunId = FunId.Id type longStrId = LongStrId.longId type longTyCon = LongTyCon.longId type Env = StaticEnv.Env type StrEnv = StaticEnv.StrEnv type Str = StaticEnv.Str type TyStr = StaticEnv.TyStr type Context = Context.Context type Sig = Sig.Sig type FunSig = FunSig.FunSig type TyVarSet = TyVarSet.set type TyNameSet = TyNameSet.set type 'a SigIdMap = 'a SigIdMap.map type 'a FunIdMap = 'a FunIdMap.map (* Types [Section 5.1] *) type SigEnv = Sig SigIdMap (* [G] *) type FunEnv = FunSig FunIdMap (* [F] *) type Basis = TyNameSet * FunEnv * SigEnv * Env (* [B] *) (* Calculation of type variable and type name sets [Section 4.2] *) fun tyvarsG G = SigIdMap.foldl (fn(Sigma, U) => TyVarSet.union(U, Sig.tyvars Sigma)) TyVarSet.empty G fun tyvarsF F = FunIdMap.foldl (fn(Phi, U) => TyVarSet.union(U, FunSig.tyvars Phi)) TyVarSet.empty F fun tyvars (T,F,G,E) = TyVarSet.union(TyVarSet.union( tyvarsF F, tyvarsG G), StaticEnv.tyvars E) fun tynamesG G = SigIdMap.foldl (fn(Sigma, T) => TyNameSet.union(T, Sig.tynames Sigma)) TyNameSet.empty G fun tynamesF F = FunIdMap.foldl (fn(Phi, T) => TyNameSet.union(T, FunSig.tynames Phi)) TyNameSet.empty F (* Injection [Sections 4.3 and 5.1] *) val empty = ( TyNameSet.empty, FunIdMap.empty, SigIdMap.empty, StaticEnv.empty ) fun fromTandE(T,E) = ( T, FunIdMap.empty, SigIdMap.empty, E ) fun fromTandF(T,F) = ( T, F, SigIdMap.empty, StaticEnv.empty ) fun fromTandG(T,G) = ( T, FunIdMap.empty, G, StaticEnv.empty ) (* Projections [Sections 4.3 and 5.1] *) fun Tof (T,F,G,E) = T fun Cof (T,F,G,E) = (T, TyVarSet.empty, E) (* Modifications [Sections 4.3 and 5.1] *) infix plus plusT oplusG oplusF oplusE oplusSE fun (T,F,G,E) plus (T',F',G',E') = ( TyNameSet.union(T,T') , FunIdMap.unionWith #2 (F,F') , SigIdMap.unionWith #2 (G,G') , StaticEnv.plus(E,E') ) fun (T,F,G,E) plusT T' = ( TyNameSet.union(T,T'), F, G, E ) fun (T,F,G,E) oplusG G' = ( TyNameSet.union(T, tynamesG G') , F , SigIdMap.unionWith #2 (G,G') , E ) fun (T,F,G,E) oplusF F' = ( TyNameSet.union(T, tynamesF F') , FunIdMap.unionWith #2 (F,F') , G , E ) fun (T,F,G,E) oplusE E' = ( TyNameSet.union(T, StaticEnv.tynames E') , F , G , StaticEnv.plus(E,E') ) fun (T,F,G,E) oplusSE SE = ( TyNameSet.union(T, StaticEnv.tynamesSE SE) , F , G , StaticEnv.plusSE(E,SE) ) (* Application (lookup) [Sections 5.1 and 4.3] *) fun findStrId((T,F,G,E), strid) = StaticEnv.findStrId(E, strid) fun findSigId((T,F,G,E), sigid) = SigIdMap.find(G, sigid) fun findFunId((T,F,G,E), funid) = FunIdMap.find(F, funid) fun findLongStrId((T,F,G,E), longstrid) = StaticEnv.findLongStrId(E, longstrid) fun findLongTyCon((T,F,G,E), longtycon) = StaticEnv.findLongTyCon(E, longtycon) end (* stop of StaticBasis.sml *) (* start of INITIAL_STATIC_ENV.sml *) (* * Standard ML core view of the initial static basis * * Definition, appendices C and E *) signature INITIAL_STATIC_ENV = sig (* Import types *) type Type = Type.Type type TyNameSet = TyNameSet.set type OverloadingClass = OverloadingClass.OverloadingClass type Env = StaticEnv.Env (* Predefined monomorphic types [Figure 24] *) val tauBool: Type val tauInt: Type val tauWord: Type val tauReal: Type val tauString: Type val tauChar: Type val tauExn: Type (* Overloading classes [Appendix E.1] *) val Int: OverloadingClass val Real: OverloadingClass val Word: OverloadingClass val String: OverloadingClass val Char: OverloadingClass val WordInt: OverloadingClass val RealInt: OverloadingClass val Num: OverloadingClass val NumTxt: OverloadingClass (* Initial environment [Appendix C] *) val T0: TyNameSet val E0: Env end (* stop of INITIAL_STATIC_ENV.sml *) (* start of InitialStaticEnv.sml *) (* * Standard ML core view of the initial static basis * * Definition, appendices C and E *) structure InitialStaticEnv :> INITIAL_STATIC_ENV = struct (* Import *) type Type = Type.Type type TyNameSet = TyNameSet.set type Overloadingclass = OverloadingClass.OverloadingClass type VIdSet = VIdSet.set type Env = StaticEnv.Env type ValEnv = StaticEnv.ValEnv open Type open IdStatus (* Helpers *) fun pairType(tau1,tau2) = let val Rho = LabMap.insert(LabMap.insert(LabMap.empty, Lab.fromInt 1, tau1), Lab.fromInt 2, tau2) in fromRowType (Rho,CLOSEDRow) end (* VIds [Figure 25] *) val vidEq = VId.fromString "=" val vidAssign = VId.fromString ":=" val vidFalse = VId.fromString "false" val vidTrue = VId.fromString "true" val vidNil = VId.fromString "nil" val vidCons = VId.fromString "::" val vidRef = VId.fromString "ref" val vidMatch = VId.fromString "Match" val vidBind = VId.fromString "Bind" (* TyCons [Figure 24] *) val tyconUnit = TyCon.fromString "unit" val tyconBool = TyCon.fromString "bool" val tyconInt = TyCon.fromString "int" val tyconWord = TyCon.fromString "word" val tyconReal = TyCon.fromString "real" val tyconString = TyCon.fromString "string" val tyconChar = TyCon.fromString "char" val tyconList = TyCon.fromString "list" val tyconRef = TyCon.fromString "ref" val tyconExn = TyCon.fromString "exn" (* TyNames [Appendix C] *) val tBool = TyName.tyname(tyconBool, 0, TyName.EQ, 2) val tInt = TyName.tyname(tyconInt, 0, TyName.EQ, 0) val tWord = TyName.tyname(tyconWord, 0, TyName.EQ, 0) val tReal = TyName.tyname(tyconReal, 0, TyName.NOEQ, 0) val tString = TyName.tyname(tyconString, 0, TyName.EQ, 0) val tChar = TyName.tyname(tyconChar, 0, TyName.EQ, 0) val tList = TyName.tyname(tyconList, 1, TyName.EQ, 2) val tRef = TyName.tyname(tyconRef, 1, TyName.SPECIALEQ, 1) val tExn = TyName.tyname(tyconExn, 0, TyName.NOEQ, 0) val T0 = TyNameSet.fromList[tBool, tInt, tWord, tReal, tString, tChar, tList, tRef, tExn] (* Types *) val alpha = TyVar.fromString "'a" val alphaEq = TyVar.fromString "''a" val tauAlpha = fromTyVar alpha val tauAlphaEq = fromTyVar alphaEq val tauUnit = fromRowType emptyRho val tauBool = fromConsType([], tBool) val tauInt = fromConsType([], tInt) val tauWord = fromConsType([], tWord) val tauReal = fromConsType([], tReal) val tauString = fromConsType([], tString) val tauChar = fromConsType([], tChar) val tauExn = fromConsType([], tExn) val tauAlphaList = fromConsType([tauAlpha], tList) val tauAlphaRef = fromConsType([tauAlpha], tRef) (* TypeSchemes [Figure 25] *) val sigmaEq = ([alphaEq], fromFunType(pairType(tauAlphaEq,tauAlphaEq), tauBool)) val sigmaAssign = ([alpha], fromFunType(pairType(tauAlphaRef,tauAlpha), tauUnit)) val sigmaFalse = ([], tauBool) val sigmaTrue = ([], tauBool) val sigmaNil = ([alpha], tauAlphaList) val sigmaCons = ([alpha], fromFunType(pairType(tauAlpha, tauAlphaList), tauAlphaList)) val sigmaRef = ([alpha], fromFunType(tauAlpha, tauAlphaRef)) val sigmaMatch = ([], tauExn) val sigmaBind = ([], tauExn) (* Value entries [Figure 25] *) val valstrEq = (sigmaEq, v) val valstrAssign = (sigmaAssign, v) val valstrFalse = (sigmaFalse, c) val valstrTrue = (sigmaTrue, c) val valstrNil = (sigmaNil, c) val valstrCons = (sigmaCons, c) val valstrRef = (sigmaRef, c) val valstrMatch = (sigmaMatch, e) val valstrBind = (sigmaBind, e) (* TypeFcns [Figure 24] *) val thetaUnit = ([], tauUnit) val thetaBool = ([], tauBool) val thetaInt = ([], tauInt) val thetaWord = ([], tauWord) val thetaReal = ([], tauReal) val thetaString = ([], tauString) val thetaChar = ([], tauChar) val thetaExn = ([], tauExn) val thetaList = ([alpha], tauAlphaList) val thetaRef = ([alpha], tauAlphaRef) (* TyStrs [Figure 25] *) val VEEmpty = VIdMap.empty val VEBool = VIdMap.fromList[(vidFalse, valstrFalse), (vidTrue, valstrTrue)] : ValEnv val VEList = VIdMap.fromList[(vidNil, valstrNil), (vidCons, valstrCons)] val VERef = VIdMap.fromList[(vidRef, valstrRef)] val tystrUnit = (thetaUnit, VEEmpty) val tystrBool = (thetaBool, VEBool ) val tystrInt = (thetaInt, VEEmpty) val tystrWord = (thetaWord, VEEmpty) val tystrReal = (thetaReal, VEEmpty) val tystrString = (thetaString, VEEmpty) val tystrChar = (thetaChar, VEEmpty) val tystrList = (thetaList, VEList ) val tystrRef = (thetaRef, VERef ) val tystrExn = (thetaExn, VEEmpty) (* Environments [Appendix C] *) val SE0 = StrIdMap.empty val TE0 = TyConMap.fromList[(tyconUnit, tystrUnit), (tyconBool, tystrBool), (tyconInt, tystrInt), (tyconWord, tystrWord), (tyconReal, tystrReal), (tyconString, tystrString), (tyconChar, tystrChar), (tyconList, tystrList), (tyconRef, tystrRef), (tyconExn, tystrExn)] val VE0 = VIdMap.fromList [(vidEq, valstrEq), (vidAssign, valstrAssign), (vidRef, valstrRef), (vidNil, valstrNil), (vidCons, valstrCons), (vidFalse, valstrFalse), (vidTrue, valstrTrue), (vidMatch, valstrMatch), (vidBind, valstrBind)] val E0 = (SE0,TE0,VE0) (* Overloading classes [Section E.1] *) val Int = OverloadingClass.make(TyNameSet.singleton tInt, tInt) val Real = OverloadingClass.make(TyNameSet.singleton tReal, tReal) val Word = OverloadingClass.make(TyNameSet.singleton tWord, tWord) val String = OverloadingClass.make(TyNameSet.singleton tString, tString) val Char = OverloadingClass.make(TyNameSet.singleton tChar, tChar) val WordInt = OverloadingClass.union(Word, Int) (* default is 2nd *) val RealInt = OverloadingClass.union(Real, Int) val Num = OverloadingClass.union(Word, RealInt) val Txt = OverloadingClass.union(String, Char) val NumTxt = OverloadingClass.union(Txt, Num) end (* stop of InitialStaticEnv.sml *) (* start of INITIAL_STATIC_BASIS.sml *) (* * Standard ML initial static basis * * Definition, appendices C and E *) signature INITIAL_STATIC_BASIS = sig (* Import *) type Basis = StaticBasis.Basis (* Export *) val B0: Basis end (* stop of INITIAL_STATIC_BASIS.sml *) (* start of InitialStaticBasis.sml *) (* * Standard ML initial static basis * * Definition, appendices C and E *) structure InitialStaticBasis :> INITIAL_STATIC_BASIS = struct (* Import *) type Basis = StaticBasis.Basis (* Enviornments *) val T0 = InitialStaticEnv.T0 val F0 = FunIdMap.empty val G0 = SigIdMap.empty val E0 = InitialStaticEnv.E0 val B0 = (T0,F0,G0,E0) end (* stop of InitialStaticBasis.sml *) (* start of EXNAME.sml *) (* * Standard ML exception names * * Definition, section 6.2 *) signature EXNAME = sig (* Import *) type VId = VId.Id (* Type [Section 6.2] *) eqtype ExName (* [en] *) (* Operations *) val exname: VId -> ExName val toString: ExName -> string val compare: ExName * ExName -> order end (* stop of EXNAME.sml *) (* start of ExName.sml *) (* * Standard ML exception names * * Definition, section 6.2 *) structure ExName :> EXNAME = struct (* Import *) type VId = VId.Id type stamp = Stamp.stamp (* Type [Section 6.2] *) type ExName = (* [en] *) { vid: VId , stamp: stamp } (* Creation *) fun exname vid = { vid = vid, stamp = Stamp.stamp() } (* Conversion *) fun toString{vid, stamp} = VId.toString vid (* Ordering *) fun compare(en1: ExName, en2: ExName) = Stamp.compare(#stamp en1, #stamp en2) end (* stop of ExName.sml *) (* start of ADDR.sml *) (* * Standard ML addresses * * Definition, section 6.2 *) signature ADDR = sig (* Type [Section 6.2] *) eqtype Addr (* [a] *) (* Operations *) val addr: unit -> Addr val compare: Addr * Addr -> order end (* stop of ADDR.sml *) (* start of Addr.sml *) (* * Standard ML addresses * * Definition, section 6.2 *) structure Addr :> ADDR = struct (* Type [Section 6.2] *) type Addr = Stamp.stamp (* [a] *) (* Operations *) val addr = Stamp.stamp val compare = Stamp.compare end (* stop of Addr.sml *) (* start of AssembliesCoreDynamic.sml *) (* * Standard ML additional sets and maps for the dynamic semantics of the core * * Definition, section 6.3 *) structure ExNameSet = FinSetFn(type ord_key = ExName.ExName val compare = ExName.compare) structure AddrMap = FinMapFn(type ord_key = Addr.Addr val compare = Addr.compare) (* stop of AssembliesCoreDynamic.sml *) (* start of SVAL.sml *) (* * Standard ML special values * * Definition, section 6.2 *) signature SVAL = sig (* Type [Section 6.2] *) datatype SVal = (* [sv] *) INT of int | WORD of word | STRING of string | CHAR of char | REAL of real (* Operations *) val toString: SVal -> string val equal: SVal * SVal -> bool end (* stop of SVAL.sml *) (* start of SVal.sml *) (* * Standard ML special values * * Definition, section 6.2 *) structure SVal :> SVAL = struct (* Type [Section 6.2] *) datatype SVal = (* [sv] *) INT of int | WORD of word | STRING of string | CHAR of char | REAL of real (* Conversions *) fun toString(INT i) = Int.toString i | toString(WORD w) = "0wx" ^ Word.toString w | toString(STRING s) = "\"" ^ String.toString s ^ "\"" | toString(CHAR c) = "\"#" ^ Char.toString c ^ "\"" | toString(REAL r) = Real.toString r (* Equality *) fun equal(INT n1, INT n2 ) = n1 = n2 | equal(WORD w1, WORD w2 ) = w1 = w2 | equal(STRING s1, STRING s2) = s1 = s2 | equal(CHAR c1, CHAR c2 ) = c1 = c2 | equal _ = raise Fail "type error: equality type expected" end (* stop of SVal.sml *) (* start of VAL.sml *) (* * Standard ML values * * Definition, sections 6.2, 6.3, and 6.4 * * Note: * - All value types are parameterised over the representation of function * closures to break up the recursion between values and environments. * - The basic values are just strings. *) signature VAL = sig (* Import *) type Addr = Addr.Addr type ExName = ExName.ExName type SVal = SVal.SVal type VId = VId.Id type 'a LabMap = 'a LabMap.map (* Types [Sections 6.2 and 6.3] *) type BasVal = string (* [b] *) datatype 'a Val = (* [v] *) := | SVal of SVal | BasVal of BasVal | VId of VId | VIdVal of VId * 'a Val | ExVal of 'a ExVal | Record of (*Record*) 'a Val LabMap | Addr of Addr | FcnClosure of 'a and 'a ExVal = (* [e] *) ExName of ExName | ExNameVal of ExName * 'a Val type 'a Record = 'a Val LabMap (* [r] *) (* Operations *) val equal: 'a Val * 'a Val -> bool val toBoolVal: bool -> 'a Val val unpair: 'a Val -> ('a Val * 'a Val) option end (* stop of VAL.sml *) (* start of Val.sml *) (* * Standard ML values * * Definition, sections 6.2, 6.3, and 6.4 * * Note: * - All value types are parameterised over the representation of function * closures to break up the recursion between values and environments. * - The basic values are just strings. *) structure Val :> VAL = struct (* Import *) type Addr = Addr.Addr type ExName = ExName.ExName type SVal = SVal.SVal type VId = VId.Id type 'a LabMap = 'a LabMap.map (* Types [Sections 6.2 and 6.3] *) type BasVal = string (* [b] *) datatype 'a Val = (* [v] *) op:= | SVal of SVal | BasVal of BasVal | VId of VId | VIdVal of VId * 'a Val | ExVal of 'a ExVal | Record of 'a Record | Addr of Addr | FcnClosure of 'a and 'a ExVal = (* [e] *) ExName of ExName | ExNameVal of ExName * 'a Val withtype 'a Record = 'a Val LabMap (* [r] *) (* Operations *) fun toBoolVal b = VId(VId.fromString(if b then "true" else "false")) fun unpair(Record r) = (case (LabMap.find(r, Lab.fromInt 1), LabMap.find(r, Lab.fromInt 2)) of (SOME v1, SOME v2) => SOME(v1, v2) | _ => NONE ) | unpair _ = NONE (* Implementation of polymorphic equality *) fun equal(SVal sv1, SVal sv2 ) = SVal.equal(sv1, sv2) | equal(VId vid1, VId vid2 ) = vid1 = vid2 | equal(ExVal(ExName en1), ExVal(ExName en2)) = en1 = en2 | equal(Addr a1, Addr a2 ) = a1 = a2 | equal(VIdVal(vid1, v1), VIdVal(vid2, v2)) = vid1 = vid2 andalso equal(v1, v2) | equal(ExVal(ExNameVal(en1,v1)), ExVal(ExNameVal(en2,v2))) = en1 = en2 andalso equal(v1, v2) | equal(Record r1, Record r2) = LabMap.numItems r1 = LabMap.numItems r2 andalso LabMap.alli (fn(lab, v1) => case LabMap.find(r2, lab) of SOME v2 => equal(v1, v2) | NONE => false ) r1 | equal _ = false end (* stop of Val.sml *) (* start of STATE.sml *) (* * Standard ML state * * Definition, section 6.3 * * Notes: * - Memory gets represented by references. This avoids expanding out all * occurances of the state convention in the inference rules. * - Since exception names are generated by stamps we do not really need the * exception name set. We maintain it anyway. *) signature STATE = sig (* Import *) type Addr = Addr.Addr type ExName = ExName.ExName type ExNameSet = ExNameSet.set type 'a Val = 'a Val.Val type 'a AddrMap = 'a AddrMap.map (* Types [Section 6.3] *) type 'a Mem = 'a Val AddrMap (* [mem] *) type 'a State = 'a Mem * ExNameSet (* [s] *) (* Operations *) val insertAddr: 'a State * Addr * 'a Val -> 'a State val insertExName: 'a State * ExName -> 'a State val findAddr: 'a State * Addr -> 'a Val option end (* stop of STATE.sml *) (* start of State.sml *) (* * Standard ML state * * Definition, section 6.3 * * Notes: * - Memory gets represented by references. This avoids expanding out all * occurances of the state convention in the inference rules. * - Since exception names are generated by stamps we do not really need the * exception name set. We maintain it anyway. *) structure State :> STATE = struct (* Import *) type Addr = Addr.Addr type ExName = ExName.ExName type ExNameSet = ExNameSet.set type 'a Val = 'a Val.Val type 'a AddrMap = 'a AddrMap.map (* Types [Section 6.3] *) type 'a Mem = 'a Val AddrMap (* [mem] *) type 'a State = 'a Mem * ExNameSet (* [s] *) (* Operations *) fun insertAddr ((mem,ens), a, v) = ( AddrMap.insert(mem, a, v), ens ) fun insertExName((mem,ens), en) = ( mem, ExNameSet.add(ens, en) ) fun findAddr((mem,ens), a) = AddrMap.find(mem, a) end (* stop of State.sml *) (* start of GRAMMAR_CORE.sml *) (* * Standard ML abstract core grammar * * Definition, section 2.8 * * Note: * This is the syntax used in the inference rules for the core [Definition, * sections 4.10 and 6.7]. It omits almost anything having to do with infixed * identifiers: * - fixity directives * - infixed application * - infixed value construction * However, op prefixes are kept, since they are required for rebuilding the * syntax tree during fixity resolution. * Optional semicolons are also omitted. *) signature GRAMMAR_CORE = sig (* Import *) type Info type SCon = SCon.SCon type Lab = Lab.Lab type VId = VId.Id type TyCon = TyCon.Id type TyVar = TyVar.TyVar type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId (* Optional keyword `op' *) datatype Op = SANSOp | WITHOp (* Expressions [Figures 2 and 4] *) datatype AtExp = SCONAtExp of Info * SCon | LONGVIDAtExp of Info * Op * longVId | RECORDAtExp of Info * ExpRow option | LETAtExp of Info * Dec * Exp | PARAtExp of Info * Exp and ExpRow = ExpRow of Info * Lab * Exp * ExpRow option and Exp = ATEXPExp of Info * AtExp | APPExp of Info * Exp * AtExp | TYPEDExp of Info * Exp * Ty | HANDLEExp of Info * Exp * Match | RAISEExp of Info * Exp | FNExp of Info * Match (* Matches [Figures 2 and 4] *) and Match = Match of Info * Mrule * Match option and Mrule = Mrule of Info * Pat * Exp (* Declarations [Figures 2 and 4] *) and Dec = VALDec of Info * TyVarseq * ValBind | TYPEDec of Info * TypBind | DATATYPEDec of Info * DatBind | REPLICATIONDec of Info * TyCon * longTyCon | ABSTYPEDec of Info * DatBind * Dec | EXCEPTIONDec of Info * ExBind | LOCALDec of Info * Dec * Dec | OPENDec of Info * longStrId list | EMPTYDec of Info | SEQDec of Info * Dec * Dec (* Bindings [Figures 2 and 4] *) and ValBind = PLAINValBind of Info * Pat * Exp * ValBind option | RECValBind of Info * ValBind and TypBind = TypBind of Info * TyVarseq * TyCon * Ty * TypBind option and DatBind = DatBind of Info * TyVarseq * TyCon * ConBind * DatBind option and ConBind = ConBind of Info * Op * VId * Ty option * ConBind option and ExBind = NEWExBind of Info * Op * VId * Ty option * ExBind option | EQUALExBind of Info * Op * VId * Op * longVId * ExBind option (* Patterns [Figures 2 and 3] *) and AtPat = WILDCARDAtPat of Info | SCONAtPat of Info * SCon | LONGVIDAtPat of Info * Op * longVId | RECORDAtPat of Info * PatRow option | PARAtPat of Info * Pat and PatRow = WILDCARDPatRow of Info | ROWPatRow of Info * Lab * Pat * PatRow option and Pat = ATPATPat of Info * AtPat | CONPat of Info * Op * longVId * AtPat | TYPEDPat of Info * Pat * Ty | ASPat of Info * Op * VId * Ty option * Pat (* Type expressions [Figures 2 and 3] *) and Ty = TYVARTy of Info * TyVar | RECORDTy of Info * TyRow option | TYCONTy of Info * Tyseq * longTyCon | ARROWTy of Info * Ty * Ty | PARTy of Info * Ty and TyRow = TyRow of Info * Lab * Ty * TyRow option (* Sequences [Section 2.8] *) and Tyseq = Tyseq of Info * Ty list and TyVarseq = TyVarseq of Info * TyVar list (* Operations *) val infoAtExp: AtExp -> Info val infoExpRow: ExpRow -> Info val infoExp: Exp -> Info val infoMatch: Match -> Info val infoMrule: Mrule -> Info val infoDec: Dec -> Info val infoValBind: ValBind -> Info val infoTypBind: TypBind -> Info val infoDatBind: DatBind -> Info val infoConBind: ConBind -> Info val infoExBind: ExBind -> Info val infoAtPat: AtPat -> Info val infoPatRow: PatRow -> Info val infoPat: Pat -> Info val infoTy: Ty -> Info val infoTyRow: TyRow -> Info val infoTyseq: Tyseq -> Info val infoTyVarseq: TyVarseq -> Info end (* stop of GRAMMAR_CORE.sml *) (* start of GrammarCoreFn.sml *) (* * Standard ML abstract core grammar * * Definition, section 2.8 * * Note: * This is the syntax used in the inference rules for the core [Definition, * sections 4.10 and 6.7]. It omits almost anything having to do with infixed * identifiers: * - fixity directives * - infixed application * - infixed value construction * However, op prefixes are kept, since they are required for rebuilding the * syntax tree during fixity resolution. * Optional semicolons are also omitted. *) functor GrammarCoreFn(type Info) : GRAMMAR_CORE = struct (* Import *) type Info = Info type SCon = SCon.SCon type Lab = Lab.Lab type VId = VId.Id type TyCon = TyCon.Id type TyVar = TyVar.TyVar type StrId = StrId.Id type longVId = LongVId.longId type longTyCon = LongTyCon.longId type longStrId = LongStrId.longId (* Optional keyword `op' *) datatype Op = SANSOp | WITHOp (* Expressions [Figures 2 and 4] *) datatype AtExp = SCONAtExp of Info * SCon | LONGVIDAtExp of Info * Op * longVId | RECORDAtExp of Info * ExpRow option | LETAtExp of Info * Dec * Exp | PARAtExp of Info * Exp and ExpRow = ExpRow of Info * Lab * Exp * ExpRow option and Exp = ATEXPExp of Info * AtExp | APPExp of Info * Exp * AtExp | TYPEDExp of Info * Exp * Ty | HANDLEExp of Info * Exp * Match | RAISEExp of Info * Exp | FNExp of Info * Match (* Matches [Figures 2 and 4] *) and Match = Match of Info * Mrule * Match option and Mrule = Mrule of Info * Pat * Exp (* Declarations [Figures 2 and 4] *) and Dec = VALDec of Info * TyVarseq * ValBind | TYPEDec of Info * TypBind | DATATYPEDec of Info * DatBind | REPLICATIONDec of Info * TyCon * longTyCon | ABSTYPEDec of Info * DatBind * Dec | EXCEPTIONDec of Info * ExBind | LOCALDec of Info * Dec * Dec | OPENDec of Info * longStrId list | EMPTYDec of Info | SEQDec of Info * Dec * Dec (* Bindings [Figures 2 and 4] *) and ValBind = PLAINValBind of Info * Pat * Exp * ValBind option | RECValBind of Info * ValBind and TypBind = TypBind of Info * TyVarseq * TyCon * Ty * TypBind option and DatBind = DatBind of Info * TyVarseq * TyCon * ConBind * DatBind option and ConBind = ConBind of Info * Op * VId * Ty option * ConBind option and ExBind = NEWExBind of Info * Op * VId * Ty option * ExBind option | EQUALExBind of Info * Op * VId * Op * longVId * ExBind option (* Patterns [Figures 2 and 3] *) and AtPat = WILDCARDAtPat of Info | SCONAtPat of Info * SCon | LONGVIDAtPat of Info * Op * longVId | RECORDAtPat of Info * PatRow option | PARAtPat of Info * Pat and PatRow = WILDCARDPatRow of Info | ROWPatRow of Info * Lab * Pat * PatRow option and Pat = ATPATPat of Info * AtPat | CONPat of Info * Op * longVId * AtPat | TYPEDPat of Info * Pat * Ty | ASPat of Info * Op * VId * Ty option * Pat (* Type expressions [Figures 2 and 3] *) and Ty = TYVARTy of Info * TyVar | RECORDTy of Info * TyRow option | TYCONTy of Info * Tyseq * longTyCon | ARROWTy of Info * Ty * Ty | PARTy of Info * Ty and TyRow = TyRow of Info * Lab * Ty * TyRow option (* Sequences [Section 2.8] *) and Tyseq = Tyseq of Info * Ty list and TyVarseq = TyVarseq of Info * TyVar list (* Extracting info fields *) fun infoAtExp(SCONAtExp(I,_)) = I | infoAtExp(LONGVIDAtExp(I,_,_)) = I | infoAtExp(RECORDAtExp(I,_)) = I | infoAtExp(LETAtExp(I,_,_)) = I | infoAtExp(PARAtExp(I,_)) = I fun infoExpRow(ExpRow(I,_,_,_)) = I fun infoExp(ATEXPExp(I,_)) = I | infoExp(APPExp(I,_,_)) = I | infoExp(TYPEDExp(I,_,_)) = I | infoExp(HANDLEExp(I,_,_)) = I | infoExp(RAISEExp(I,_)) = I | infoExp(FNExp(I,_)) = I fun infoMatch(Match(I,_,_)) = I fun infoMrule(Mrule(I,_,_)) = I fun infoDec(VALDec(I,_,_)) = I | infoDec(TYPEDec(I,_)) = I | infoDec(DATATYPEDec(I,_)) = I | infoDec(REPLICATIONDec(I,_,_)) = I | infoDec(ABSTYPEDec(I,_,_)) = I | infoDec(EXCEPTIONDec(I,_)) = I | infoDec(LOCALDec(I,_,_)) = I | infoDec(OPENDec(I,_)) = I | infoDec(EMPTYDec(I)) = I | infoDec(SEQDec(I,_,_)) = I fun infoValBind(PLAINValBind(I,_,_,_)) = I | infoValBind(RECValBind(I,_)) = I fun infoTypBind(TypBind(I,_,_,_,_)) = I fun infoDatBind(DatBind(I,_,_,_,_)) = I fun infoConBind(ConBind(I,_,_,_,_)) = I fun infoExBind(NEWExBind(I,_,_,_,_)) = I | infoExBind(EQUALExBind(I,_,_,_,_,_)) = I fun infoAtPat(WILDCARDAtPat(I)) = I | infoAtPat(SCONAtPat(I,_)) = I | infoAtPat(LONGVIDAtPat(I,_,_)) = I | infoAtPat(RECORDAtPat(I,_)) = I | infoAtPat(PARAtPat(I,_)) = I fun infoPatRow(WILDCARDPatRow(I)) = I | infoPatRow(ROWPatRow(I,_,_,_)) = I fun infoPat(ATPATPat(I,_)) = I | infoPat(CONPat(I,_,_,_)) = I | infoPat(TYPEDPat(I,_,_)) = I | infoPat(ASPat(I,_,_,_,_)) = I fun infoTy(TYVARTy(I,_)) = I | infoTy(RECORDTy(I,_)) = I | infoTy(TYCONTy(I,_,_)) = I | infoTy(ARROWTy(I,_,_)) = I | infoTy(PARTy(I,_)) = I fun infoTyRow(TyRow(I,_,_,_)) = I fun infoTyseq(Tyseq(I,_)) = I fun infoTyVarseq(TyVarseq(I,_)) = I end (* stop of GrammarCoreFn.sml *) (* start of SOURCE.sml *) (* * Helpers for handling source strings *) signature SOURCE = sig type source = string type region = int * int val over: region * region -> region val between: region * region -> region val compare: region * region -> order end (* stop of SOURCE.sml *) (* start of Source.sml *) (* * Helpers for handling source strings *) structure Source :> SOURCE = struct type source = string type region = int * int fun over(r1: region, r2: region) = (#1 r1, #2 r2) fun between(r1: region, r2: region) = (#2 r1, #1 r2) fun compare((m1,n1), (m2,n2)) = case Int.compare(m1, m2) of EQUAL => Int.compare(n1, n2) | order => order end (* stop of Source.sml *) (* start of GRAMMAR_MODULE.sml *) (* * Standard ML abstract module grammar * * Definition, section 3.4 * * Notes: * This is the syntax used in the inference rules for modules [Definition, * sections 5.7 and 7.3]. Optional semicolons are omitted. * The structure sharing derived form [Definition, Appendix A] has been added, * because it cannot be derived purely syntactically. *) signature GRAMMAR_MODULE = sig (* Import *) structure Core: GRAMMAR_CORE type Info type VId = Core.VId type TyCon = Core.TyCon type TyVar = Core.TyVar type StrId = Core.StrId type longVId = Core.longVId type longTyCon = Core.longTyCon type longStrId = Core.longStrId type Dec = Core.Dec type Ty = Core.Ty type TyVarseq = Core.TyVarseq type SigId = SigId.Id type FunId = FunId.Id (* Structures [Figures 5 and 6] *) datatype StrExp = STRUCTStrExp of Info * StrDec | LONGSTRIDStrExp of Info * longStrId | TRANSStrExp of Info * StrExp * SigExp | OPAQStrExp of Info * StrExp * SigExp | APPStrExp of Info * FunId * StrExp | LETStrExp of Info * StrDec * StrExp and StrDec = DECStrDec of Info * Dec | STRUCTUREStrDec of Info * StrBind | LOCALStrDec of Info * StrDec * StrDec | EMPTYStrDec of Info | SEQStrDec of Info * StrDec * StrDec and StrBind = StrBind of Info * StrId * StrExp * StrBind option (* Signatures [Figures 5 and 6] *) and SigExp = SIGSigExp of Info * Spec | SIGIDSigExp of Info * SigId | WHERETYPESigExp of Info * SigExp * TyVarseq * longTyCon * Ty and SigDec = SigDec of Info * SigBind and SigBind = SigBind of Info * SigId * SigExp * SigBind option (* Specifications [Figures 5 and 7] *) and Spec = VALSpec of Info * ValDesc | TYPESpec of Info * TypDesc | EQTYPESpec of Info * TypDesc | DATATYPESpec of Info * DatDesc | REPLICATIONSpec of Info * TyCon * longTyCon | EXCEPTIONSpec of Info * ExDesc | STRUCTURESpec of Info * StrDesc | INCLUDESpec of Info * SigExp | EMPTYSpec of Info | SEQSpec of Info * Spec * Spec | SHARINGTYPESpec of Info * Spec * longTyCon list | SHARINGSpec of Info * Spec * longStrId list and ValDesc = ValDesc of Info * VId * Ty * ValDesc option and TypDesc = TypDesc of Info * TyVarseq * TyCon * TypDesc option and DatDesc = DatDesc of Info * TyVarseq * TyCon * ConDesc * DatDesc option and ConDesc = ConDesc of Info * VId * Ty option * ConDesc option and ExDesc = ExDesc of Info * VId * Ty option * ExDesc option and StrDesc = StrDesc of Info * StrId * SigExp * StrDesc option (* Functors [Figures 5 and 8] *) and FunDec = FunDec of Info * FunBind and FunBind = FunBind of Info * FunId * StrId * SigExp * StrExp * FunBind option (* Top-level declarations [Figures 5 and 8] *) and TopDec = STRDECTopDec of Info * StrDec * TopDec option | SIGDECTopDec of Info * SigDec * TopDec option | FUNDECTopDec of Info * FunDec * TopDec option (* Operations *) val infoStrExp: StrExp -> Info val infoStrDec: StrDec -> Info val infoStrBind: StrBind -> Info val infoSigExp: SigExp -> Info val infoSigBind: SigBind -> Info val infoSpec: Spec -> Info val infoValDesc: ValDesc -> Info val infoTypDesc: TypDesc -> Info val infoDatDesc: DatDesc -> Info val infoConDesc: ConDesc -> Info val infoExDesc: ExDesc -> Info val infoStrDesc: StrDesc -> Info val infoFunDec: FunDec -> Info val infoFunBind: FunBind -> Info val infoTopDec: TopDec -> Info end (* stop of GRAMMAR_MODULE.sml *) (* start of GrammarModuleFn.sml *) (* * Standard ML abstract module grammar * * Definition, section 3.4 * * Notes: * This is the syntax used in the inference rules for modules [Definition, * sections 5.7 and 7.3]. Optional semicolons are omitted. * The structure sharing derived form [Definition, Appendix A] has been added, * because it cannot be derived purely syntactically. *) functor GrammarModuleFn(type Info structure Core: GRAMMAR_CORE ) : GRAMMAR_MODULE = struct (* Import *) structure Core = Core type Info = Info open Core type SigId = SigId.Id type FunId = FunId.Id (* Structures [Figures 5 and 6] *) datatype StrExp = STRUCTStrExp of Info * StrDec | LONGSTRIDStrExp of Info * longStrId | TRANSStrExp of Info * StrExp * SigExp | OPAQStrExp of Info * StrExp * SigExp | APPStrExp of Info * FunId * StrExp | LETStrExp of Info * StrDec * StrExp and StrDec = DECStrDec of Info * Dec | STRUCTUREStrDec of Info * StrBind | LOCALStrDec of Info * StrDec * StrDec | EMPTYStrDec of Info | SEQStrDec of Info * StrDec * StrDec and StrBind = StrBind of Info * StrId * StrExp * StrBind option (* Signatures [Figures 5 and 6] *) and SigExp = SIGSigExp of Info * Spec | SIGIDSigExp of Info * SigId | WHERETYPESigExp of Info * SigExp * TyVarseq * longTyCon * Ty and SigDec = SigDec of Info * SigBind and SigBind = SigBind of Info * SigId * SigExp * SigBind option (* Specifications [Figures 5 and 7] *) and Spec = VALSpec of Info * ValDesc | TYPESpec of Info * TypDesc | EQTYPESpec of Info * TypDesc | DATATYPESpec of Info * DatDesc | REPLICATIONSpec of Info * TyCon * longTyCon | EXCEPTIONSpec of Info * ExDesc | STRUCTURESpec of Info * StrDesc | INCLUDESpec of Info * SigExp | EMPTYSpec of Info | SEQSpec of Info * Spec * Spec | SHARINGTYPESpec of Info * Spec * longTyCon list | SHARINGSpec of Info * Spec * longStrId list and ValDesc = ValDesc of Info * VId * Ty * ValDesc option and TypDesc = TypDesc of Info * TyVarseq * TyCon * TypDesc option and DatDesc = DatDesc of Info * TyVarseq * TyCon * ConDesc * DatDesc option and ConDesc = ConDesc of Info * VId * Ty option * ConDesc option and ExDesc = ExDesc of Info * VId * Ty option * ExDesc option and StrDesc = StrDesc of Info * StrId * SigExp * StrDesc option (* Functors [Figures 5 and 8] *) and FunDec = FunDec of Info * FunBind and FunBind = FunBind of Info * FunId * StrId * SigExp * StrExp * FunBind option (* Top-level declarations [Figures 5 and 8] *) and TopDec = STRDECTopDec of Info * StrDec * TopDec option | SIGDECTopDec of Info * SigDec * TopDec option | FUNDECTopDec of Info * FunDec * TopDec option (* Extracting info fields *) fun infoStrExp(STRUCTStrExp(I,_)) = I | infoStrExp(LONGSTRIDStrExp(I,_)) = I | infoStrExp(TRANSStrExp(I,_,_)) = I | infoStrExp(OPAQStrExp(I,_,_)) = I | infoStrExp(APPStrExp(I,_,_)) = I | infoStrExp(LETStrExp(I,_,_)) = I fun infoStrDec(DECStrDec(I,_)) = I | infoStrDec(STRUCTUREStrDec(I,_)) = I | infoStrDec(LOCALStrDec(I,_,_)) = I | infoStrDec(EMPTYStrDec(I)) = I | infoStrDec(SEQStrDec(I,_,_)) = I fun infoStrBind(StrBind(I,_,_,_)) = I fun infoSigExp(SIGSigExp(I,_)) = I | infoSigExp(SIGIDSigExp(I,_)) = I | infoSigExp(WHERETYPESigExp(I,_,_,_,_)) = I fun infoSigDec(SigDec(I,_)) = I fun infoSigBind(SigBind(I,_,_,_)) = I fun infoSpec(VALSpec(I,_)) = I | infoSpec(TYPESpec(I,_)) = I | infoSpec(EQTYPESpec(I,_)) = I | infoSpec(DATATYPESpec(I,_)) = I | infoSpec(REPLICATIONSpec(I,_,_)) = I | infoSpec(EXCEPTIONSpec(I,_)) = I | infoSpec(STRUCTURESpec(I,_)) = I | infoSpec(INCLUDESpec(I,_)) = I | infoSpec(EMPTYSpec(I)) = I | infoSpec(SEQSpec(I,_,_)) = I | infoSpec(SHARINGTYPESpec(I,_,_)) = I | infoSpec(SHARINGSpec(I,_,_)) = I fun infoValDesc(ValDesc(I,_,_,_)) = I fun infoTypDesc(TypDesc(I,_,_,_)) = I fun infoDatDesc(DatDesc(I,_,_,_,_)) = I fun infoConDesc(ConDesc(I,_,_,_)) = I fun infoExDesc(ExDesc(I,_,_,_)) = I fun infoStrDesc(StrDesc(I,_,_,_)) = I fun infoFunDec(FunDec(I,_)) = I fun infoFunBind(FunBind(I,_,_,_,_,_)) = I fun infoTopDec(STRDECTopDec(I,_,_)) = I | infoTopDec(SIGDECTopDec(I,_,_)) = I | infoTopDec(FUNDECTopDec(I,_,_)) = I end (* stop of GrammarModuleFn.sml *) (* start of GRAMMAR_PROGRAM.sml *) (* * Standard ML abstract program grammar * * Definition, section 8 *) signature GRAMMAR_PROGRAM = sig (* Import *) structure Module: GRAMMAR_MODULE type Info = Module.Info type TopDec = Module.TopDec (* Programs *) datatype Program = Program of Info * TopDec * Program option (* Extracting the info field *) val infoProgram: Program -> Info end (* stop of GRAMMAR_PROGRAM.sml *) (* start of GrammarProgramFn.sml *) (* * Standard ML abstract program grammar * * Definition, section 8 *) functor GrammarProgramFn(type Info structure Module: GRAMMAR_MODULE ) : GRAMMAR_PROGRAM = struct (* Import *) structure Module = Module type Info = Info open Module (* Programs *) datatype Program = Program of Info * TopDec * Program option (* Extracting the info field *) fun infoProgram(Program(I,_,_)) = I end (* stop of GrammarProgramFn.sml *) (* start of Grammars.sml *) structure GrammarCore = GrammarCoreFn(type Info = Source.region) structure GrammarModule = GrammarModuleFn(type Info = Source.region structure Core = GrammarCore) structure GrammarProgram = GrammarProgramFn(type Info = Source.region structure Module = GrammarModule) (* stop of Grammars.sml *) (* start of DYNAMIC_ENV.sml *) (* * Standard ML environments of the dynamic semantics of the core * * Definition, sections 6.3 and 6.6 * * Notes: * - We call the domain type of value environments ValStr. * - The type definitions here are heavily recursive and it is really stupid * that SML allows no withtype in signatures... *) signature DYNAMIC_ENV = sig (* Inheritance *) include GENERIC_ENV (* Import types *) type 'a Val = 'a Val.Val type Match = GrammarCore.Match (* Export types [Section 6.6] *) datatype FcnClosure = FcnClosure of Match * ( (*Env*) ( FcnClosure Val * IdStatus , (FcnClosure Val * IdStatus) VIdMap ) Str' StrIdMap * (FcnClosure Val * IdStatus) VIdMap TyConMap * (FcnClosure Val * IdStatus) VIdMap ) * (*ValEnv*) (FcnClosure Val * IdStatus) VIdMap type ValStr = FcnClosure Val * IdStatus type ValEnv = ValStr VIdMap (* [VE] *) type TyStr = ValEnv type TyEnv = TyStr TyConMap (* [TE] *) type Str = (ValStr, TyStr) Str' type StrEnv = Str StrIdMap (* [SE] *) type Env = StrEnv * TyEnv * ValEnv (* [E] *) (* Operations *) val Rec: ValEnv -> ValEnv end (* stop of DYNAMIC_ENV.sml *) (* start of DynamicEnv.sml *) (* * Standard ML environments of the dynamic semantics of the core * * Definition, sections 6.3 and 6.6 * * Notes: * - We call the domain type of value environments ValStr. * - The type definitions here are heavily recursive. It would be easier if * SML would define withtype sequentially (as SML/NJ implements it). * However, it is still better than inside the signature... *) structure DynamicEnv :> DYNAMIC_ENV = struct (* Inheritance *) structure GenericEnv = GenericEnvFn() open GenericEnv (* Import types *) type 'a Val = 'a Val.Val type Match = GrammarCore.Match (* Export types [Section 6.6] *) datatype FcnClosure = FcnClosure of Match * ((*Env*) StrEnv * TyEnv * ValEnv) * ValEnv withtype ValEnv = (FcnClosure Val * IdStatus) VIdMap (* [VE] *) and TyEnv = (FcnClosure Val * IdStatus) VIdMap TyConMap (* [TE] *) and StrEnv = (FcnClosure Val * IdStatus, (FcnClosure Val * IdStatus) VIdMap) Str' StrIdMap (* [SE] *) type ValStr = FcnClosure Val * IdStatus type TyStr = ValEnv type Str = (ValStr, TyStr) Str' type Env = StrEnv * TyEnv * ValEnv (* [E] *) (* Unrolling [Section 6.6] *) fun Rec VE = VIdMap.map (fn (Val.FcnClosure(FcnClosure(match',E',VE')), IdStatus.v) => (Val.FcnClosure(FcnClosure(match',E',VE)), IdStatus.v) | valstr => valstr ) VE end (* stop of DynamicEnv.sml *) (* start of INITIAL_DYNAMIC_ENV.sml *) (* * Standard ML core view of the initial dynamic basis * * Definition, appendix D and section 6.5 * * Note: * The Definition does not specify what the initial state has to contain. * This is a bug as it must at least contain the exception names Match * and Bind. We put the state associated with the initial environment in * here, too. *) signature INITIAL_DYNAMIC_ENV = sig (* Import types *) type Env = DynamicEnv.Env type ExName = ExName.ExName type State = DynamicEnv.FcnClosure State.State (* Basic exception names [Section 6.5] *) val enMatch: ExName val enBind: ExName (* Initial environment [Appendix D] *) val E0: Env (* Associated state *) val s: State end (* stop of INITIAL_DYNAMIC_ENV.sml *) (* start of InitialDynamicEnv.sml *) (* * Standard ML core view of the initial dynamic basis * * Definition, appendix D and section 6.5 * * Note: * The Definition does not specify what the initial state has to contain. * This is a bug as it must at least contain the exception names Match * and Bind. We put the state associated with the initial environment in * here, too. *) structure InitialDynamicEnv :> INITIAL_DYNAMIC_ENV = struct (* Import *) type Env = DynamicEnv.Env type ValEnv = DynamicEnv.ValEnv type ExName = ExName.ExName type State = DynamicEnv.FcnClosure State.State open Val open IdStatus (* VIds [Appendix D] *) val vidEq = VId.fromString "=" val vidAssign = VId.fromString ":=" val vidFalse = VId.fromString "false" val vidTrue = VId.fromString "true" val vidNil = VId.fromString "nil" val vidCons = VId.fromString "::" val vidRef = VId.fromString "ref" val vidMatch = VId.fromString "Match" val vidBind = VId.fromString "Bind" (* Basic exception names [Section 6.5] *) val enMatch = ExName.exname vidMatch val enBind = ExName.exname vidBind (* Value entries [Appendix D] *) val valstrEq = (BasVal "=", v) val valstrAssign = (op:=, v) val valstrFalse = (VId vidFalse, c) val valstrTrue = (VId vidTrue, c) val valstrNil = (VId vidNil, c) val valstrCons = (VId vidCons, c) val valstrRef = (VId vidRef, c) val valstrMatch = (ExVal(ExName enMatch), e) val valstrBind = (ExVal(ExName enBind), e) (* TyCons [Figure 26] *) val tyconUnit = TyCon.fromString "unit" val tyconBool = TyCon.fromString "bool" val tyconInt = TyCon.fromString "int" val tyconWord = TyCon.fromString "word" val tyconReal = TyCon.fromString "real" val tyconString = TyCon.fromString "string" val tyconChar = TyCon.fromString "char" val tyconList = TyCon.fromString "list" val tyconRef = TyCon.fromString "ref" val tyconExn = TyCon.fromString "exn" (* Type ValEnvs [Figure 26] *) val VEUnit = VIdMap.empty val VEBool = VIdMap.fromList[(vidFalse, valstrFalse), (vidTrue, valstrTrue)] : ValEnv val VEInt = VIdMap.empty val VEWord = VIdMap.empty val VEReal = VIdMap.empty val VEString = VIdMap.empty val VEChar = VIdMap.empty val VEList = VIdMap.fromList[(vidNil, valstrNil), (vidCons, valstrCons)] : ValEnv val VERef = VIdMap.fromList[(vidRef, valstrRef)] : ValEnv val VEExn = VIdMap.empty (* Environments [Appendix D] *) val SE0 = StrIdMap.empty val TE0 = TyConMap.fromList[(tyconUnit, VEUnit), (tyconBool, VEBool), (tyconInt, VEInt), (tyconWord, VEWord), (tyconReal, VEReal), (tyconString, VEString), (tyconChar, VEChar), (tyconList, VEList), (tyconRef, VERef), (tyconExn, VEExn)] val VE0 = VIdMap.fromList [(vidEq, valstrEq), (vidAssign, valstrAssign), (vidRef, valstrRef), (vidNil, valstrNil), (vidCons, valstrCons), (vidFalse, valstrFalse), (vidTrue, valstrTrue), (vidMatch, valstrMatch), (vidBind, valstrBind)] : ValEnv val E0 = (SE0,TE0,VE0) (* Associated state *) val mem = AddrMap.empty val ens = ExNameSet.fromList[enMatch, enBind] val s = (mem, ens) end (* stop of InitialDynamicEnv.sml *) (* start of INTERFACE.sml *) (* * Standard ML interfaces * * Definition, section 7.2 *) signature INTERFACE = sig (* Inheritance *) include GENERIC_ENV (* Import *) type Env = DynamicEnv.Env (* Export types [Section 7.2] *) type ValInt = IdStatus VIdMap (* [VI] *) type TyInt = ValInt TyConMap (* [TI] *) type Str = (IdStatus, ValInt) Str' type StrInt = Str StrIdMap (* [SI] *) type Int = StrInt * TyInt * ValInt (* [I] *) (* Operations *) val fromSI: StrInt -> Int val fromTI: TyInt -> Int val fromVI: ValInt -> Int val fromVIandTI: ValInt * TyInt -> Int val Inter: Env -> Int val cutdown: Env * Int -> Env end (* stop of INTERFACE.sml *) (* start of Interface.sml *) (* * Standard ML interfaces * * Definition, section 7.2 *) structure Interface :> INTERFACE = struct (* Inheritance *) structure GenericEnv = GenericEnvFn() open GenericEnv (* Import *) type Env = DynamicEnv.Env (* Export types [Section 7.2] *) type ValInt = IdStatus VIdMap (* [VI] *) type TyInt = ValInt TyConMap (* [TI] *) type Str = (IdStatus, ValInt) Str' type StrInt = Str StrIdMap (* [SI] *) type Int = StrInt * TyInt * ValInt (* [I] *) (* Injections [Section 4.3] *) val fromSI = fromSE val fromTI = fromTE val fromVI = fromVE val fromVIandTI = fromVEandTE (* Extracting interfaces from environments [Section 7.2] *) fun InterVE VE = VIdMap.map (fn(v,is) => is) VE fun InterTE TE = TyConMap.map (fn VE => InterVE VE) TE fun InterSE SE = StrIdMap.map (fn DynamicEnv.Str E => Str(Inter E)) SE and Inter (SE,TE,VE) = (InterSE SE, InterTE TE, InterVE VE) (* Cutting down environments [Section 7.2] *) fun cutdownVE(VE, VI) = VIdMap.foldli (fn(vid, is, VE') => case VIdMap.find(VE, vid) of SOME(v,is') => VIdMap.insert(VE', vid, (v,is)) | NONE => VE' ) VIdMap.empty VI fun cutdownTE(TE, TI) = TyConMap.foldli (fn(tycon, VI', TE') => case TyConMap.find(TE, tycon) of SOME VE' => TyConMap.insert(TE', tycon, cutdownVE(VE',VI')) | NONE => TE' ) TyConMap.empty TI fun cutdownSE(SE, SI) = StrIdMap.foldli (fn(strid, Str I, SE') => case StrIdMap.find(SE, strid) of SOME(DynamicEnv.Str E) => StrIdMap.insert(SE', strid, DynamicEnv.Str(cutdown(E,I))) | NONE => SE' ) StrIdMap.empty SI and cutdown((SE,TE,VE), (SI,TI,VI)) = ( cutdownSE(SE, SI), cutdownTE(TE, TI), cutdownVE(VE, VI) ) end (* stop of Interface.sml *) (* start of DYNAMIC_BASIS.sml *) (* * Standard ML dynamic basis and environments of modules * * Definition, section 7.2 *) signature DYNAMIC_BASIS = sig (* Import types *) type StrId = StrId.Id type SigId = SigId.Id type FunId = FunId.Id type longStrId = LongStrId.longId type longTyCon = LongTyCon.longId type Env = DynamicEnv.Env type ValEnv = DynamicEnv.ValEnv type StrEnv = DynamicEnv.StrEnv type Str = DynamicEnv.Str type Int = Interface.Int type StrExp = GrammarModule.StrExp type 'a SigIdMap = 'a SigIdMap.map type 'a FunIdMap = 'a FunIdMap.map (* Types [Section 7.2] *) datatype FunctorClosure = FunctorClosure of (StrId * Int) * StrExp * (*Basis*) (FunctorClosure FunIdMap * Int SigIdMap * Env) type SigEnv = Int SigIdMap (* [G] *) type FunEnv = FunctorClosure FunIdMap (* [F] *) type Basis = FunEnv * SigEnv * Env (* [B] *) (* Operations *) val empty: Basis val fromE: Env -> Basis val fromF: FunEnv -> Basis val fromG: SigEnv -> Basis val Eof: Basis -> Env val plus: Basis * Basis -> Basis val plusSE: Basis * StrEnv -> Basis val plusG: Basis * SigEnv -> Basis val plusF: Basis * FunEnv -> Basis val plusE: Basis * Env -> Basis val findStrId: Basis * StrId -> Str option val findSigId: Basis * SigId -> Int option val findFunId: Basis * FunId -> FunctorClosure option val findLongStrId: Basis * longStrId -> Str option val findLongTyCon: Basis * longTyCon -> ValEnv option end (* stop of DYNAMIC_BASIS.sml *) (* start of DynamicBasis.sml *) (* * Standard ML dynamic basis and environments of modules * * Definition, section 7.2 *) structure DynamicBasis :> DYNAMIC_BASIS = struct (* Import types *) type StrId = StrId.Id type SigId = SigId.Id type FunId = FunId.Id type longStrId = LongStrId.longId type longTyCon = LongTyCon.longId type Env = DynamicEnv.Env type ValEnv = DynamicEnv.ValEnv type StrEnv = DynamicEnv.StrEnv type Str = DynamicEnv.Str type Int = Interface.Int type StrExp = GrammarModule.StrExp type 'a SigIdMap = 'a SigIdMap.map type 'a FunIdMap = 'a FunIdMap.map (* Types [Section 7.2] *) datatype FunctorClosure = FunctorClosure of (StrId * Int) * StrExp * (*Basis*) (FunEnv * SigEnv * Env) withtype SigEnv = Int SigIdMap (* [G] *) and FunEnv = FunctorClosure FunIdMap (* [F] *) type Basis = FunEnv * SigEnv * Env (* [B] *) (* Injections [Sections 4.3 and 7.2] *) val empty = ( FunIdMap.empty, SigIdMap.empty, DynamicEnv.empty ) fun fromE E = ( FunIdMap.empty, SigIdMap.empty, E ) fun fromF F = ( F, SigIdMap.empty, DynamicEnv.empty ) fun fromG G = ( FunIdMap.empty, G, DynamicEnv.empty ) (* Injections [Sections 4.3 and 7.2] *) fun Eof (F,G,E) = E (* Modifications [Sections 4.3 and 7.2] *) infix plus plusG plusF plusE plusSE IBplusI fun (F,G,E) plus (F',G',E') = ( FunIdMap.unionWith #2 (F,F') , SigIdMap.unionWith #2 (G,G') , DynamicEnv.plus(E,E') ) fun (F,G,E) plusG G' = ( F, SigIdMap.unionWith #2 (G,G'), E ) fun (F,G,E) plusF F' = ( FunIdMap.unionWith #2 (F,F'), G, E ) fun (F,G,E) plusE E' = ( F, G, DynamicEnv.plus(E,E') ) fun (F,G,E) plusSE SE = ( F, G, DynamicEnv.plusSE(E,SE) ) (* Application (lookup) [Sections 7.2 and 4.3] *) fun findStrId((F,G,E), strid) = DynamicEnv.findStrId(E, strid) fun findSigId((F,G,E), sigid) = SigIdMap.find(G, sigid) fun findFunId((F,G,E), funid) = FunIdMap.find(F, funid) fun findLongStrId((F,G,E), longstrid) = DynamicEnv.findLongStrId(E, longstrid) fun findLongTyCon((F,G,E), longtycon) = DynamicEnv.findLongTyCon(E, longtycon) end (* stop of DynamicBasis.sml *) (* start of INITIAL_DYNAMIC_BASIS.sml *) (* * Standard ML initial dynamic basis * * Definition, appendix D * * Note: * The Definition does not specify what the initial state has to contain. * This is a bug as it must at least contain the exception names Match * and Bind. We put the state associated with the initial basis in * here, too. *) signature INITIAL_DYNAMIC_BASIS = sig (* Import *) type Basis = DynamicBasis.Basis type State = InitialDynamicEnv.State (* Export *) val B0: Basis val s: State end (* stop of INITIAL_DYNAMIC_BASIS.sml *) (* start of InitialDynamicBasis.sml *) (* * Standard ML initial dynamic basis * * Definition, appendix D * * Note: * The Definition does not specify what the initial state has to contain. * This is a bug as it must at least contain the exception names Match * and Bind. We put the state associated with the initial basis in * here, too. *) structure InitialDynamicBasis :> INITIAL_DYNAMIC_BASIS = struct (* Import *) type Basis = DynamicBasis.Basis type State = InitialDynamicEnv.State (* Enviornments *) val F0 = FunIdMap.empty val G0 = SigIdMap.empty val E0 = InitialDynamicEnv.E0 val B0 = (F0,G0,E0) (* Associated state *) val s = InitialDynamicEnv.s end (* stop of InitialDynamicBasis.sml *) (* start of ERROR.sml *) (* * Error handling. *) signature ERROR = sig (* Import *) type position = Source.region (* Export *) exception Error of position * string val error: position * string -> 'a val warning: position * string -> unit end (* stop of ERROR.sml *) (* start of Error.sml *) (* * Error handling. *) structure Error :> ERROR = struct (* Import *) type position = Source.region (* Helper *) fun print((pos1,pos2), message) = let val a = Int.toString pos1 val b = Int.toString pos2 in TextIO.output(TextIO.stdErr, a ^ "-" ^ b ^ ": " ^ message ^ "\n") ; TextIO.flushOut TextIO.stdErr end (* Export *) exception Error of position * string fun error(pos, message) = ( print(pos, message) ; raise Error(pos, message) ) fun warning(pos, message) = print(pos, "warning: " ^ message) end (* stop of Error.sml *) (* start of INFIX.sml *) (* * Standard ML infix resolution * * Definition, section 2.6 *) signature INFIX = sig (* Import *) type Info = GrammarCore.Info type Op = GrammarCore.Op type VId = GrammarCore.VId type longVId = GrammarCore.longVId type Exp = GrammarCore.Exp type Pat = GrammarCore.Pat type AtExp = GrammarCore.AtExp type AtPat = GrammarCore.AtPat (* Modifying fixity status *) datatype Assoc = LEFT | RIGHT type InfStatus = Assoc * int type InfEnv = InfStatus VIdMap.map (* [J] *) val empty: InfEnv val assign: InfEnv * VId list * InfStatus -> InfEnv val cancel: InfEnv * VId list -> InfEnv (* Resolving phrases containing infixed identifiers *) val parseExp: InfEnv * AtExp list -> Exp val parsePat: InfEnv * AtPat list -> Pat val parseFmrule: InfEnv * AtPat list -> Op * VId * AtPat list end (* stop of INFIX.sml *) (* start of Infix.sml *) (* * Standard ML infix resolution * * Definition, section 2.6 *) structure Infix :> INFIX = struct (* Import *) open GrammarCore (* Type definitions *) datatype Assoc = LEFT | RIGHT type InfStatus = Assoc * int type InfEnv = InfStatus VIdMap.map (* [J] *) (* Modifying infix environments *) val empty = VIdMap.empty fun assign(J, vids, infstatus) = let fun insert(vid, J) = VIdMap.insert(J, vid, infstatus) in List.foldl insert J vids end fun cancel(J, vids) = let fun remove(vid, J) = #1(VIdMap.remove(J, vid)) in List.foldl remove J vids end (* Helpers for error messages *) val error = Error.error fun errorVId(I, s, vid) = error(I, s ^ VId.toString vid) fun errorLongVId(I, s, longvid) = error(I, s ^ LongVId.toString longvid) (* Categorisation of atomic expressions and patterns *) datatype 'a FixityCategory = NONFIX of 'a | INFIX of InfStatus * VId * Info fun isInfix J (longvid) = LongVId.isUnqualified longvid andalso VIdMap.find(J, LongVId.toId longvid) <> NONE fun categoriseLongVId J (atomic, I, longvid) = if LongVId.isUnqualified longvid then let val vid = LongVId.toId longvid in case VIdMap.find(J, vid) of NONE => NONFIX(atomic) | SOME infstatus => INFIX(infstatus, vid, I) end else NONFIX(atomic) fun categoriseAtExp J (atexp as LONGVIDAtExp(I, SANSOp, longvid)) = categoriseLongVId J (atexp, I, longvid) | categoriseAtExp J (atexp) = NONFIX(atexp) fun categoriseAtPat J (atpat as LONGVIDAtPat(I, SANSOp, longvid)) = categoriseLongVId J (atpat, I, longvid) | categoriseAtPat J (atpat) = NONFIX(atpat) (* Resolving infixing [Section 2.6] *) fun parse(app, infapp, es) = let fun loop(NONFIX(e)::[], []) = e | loop(NONFIX(e2)::NONFIX(e1)::s', i) = (* reduce nonfix application *) loop(NONFIX(app(e1, e2))::s', i) | loop(s, NONFIX(e)::i') = (* shift *) loop(NONFIX(e)::s, i') | loop(s as NONFIX(e)::[], INFIX(x)::i') = (* shift *) loop(INFIX(x)::s, i') | loop(NONFIX(e2)::INFIX(_,vid,_)::NONFIX(e1)::s', []) = (* reduce infix application *) loop(NONFIX(infapp(e1, vid, e2))::s', []) | loop(s as NONFIX(e2)::INFIX((a1,p1),vid1,I1)::NONFIX(e1)::s', i as INFIX(x2 as ((a2,p2),vid2,I2))::i') = if p1 > p2 then (* reduce infix application *) loop(NONFIX(infapp(e1, vid1, e2))::s', i) else if p1 < p2 then (* shift *) loop(INFIX(x2)::s, i') else if a1 <> a2 then error(Source.over(I1,I2), "conflicting infix associativity") else if a1 = LEFT then (* reduce infix application *) loop(NONFIX(infapp(e1, vid1, e2))::s', i) else (* a1 = RIGHT *) (* shift *) loop(INFIX(x2)::s, i') | loop(INFIX(_, vid, I)::s, []) = errorVId(I, "misplaced infix identifier ", vid) | loop(INFIX(x)::s, INFIX(_, vid, I)::i) = errorVId(I, "misplaced infix identifier ", vid) | loop([], INFIX(_, vid, I)::i) = errorVId(I, "misplaced infix identifier ", vid) | loop _ = raise Fail "Infix.parse: inconsistency" in loop([], es) end (* Resolving infixed expressions [Section 2.6] *) fun atexpExp(PARAtExp(_, exp)) = exp | atexpExp atexp = ATEXPExp(infoAtExp atexp, atexp) fun appExp(atexp1, atexp2) = let val I1 = infoAtExp atexp1 val I2 = infoAtExp atexp2 val I = Source.over(I1, I2) in PARAtExp(I, APPExp(I, atexpExp atexp1, atexp2)) end fun pairExp(atexp1, atexp2) = let val I1 = infoAtExp atexp1 val I2 = infoAtExp atexp2 val lab1 = Lab.fromInt 1 val lab2 = Lab.fromInt 2 val exprow2 = ExpRow(I2, lab2, atexpExp atexp2, NONE) val exprow1 = ExpRow(I1, lab1, atexpExp atexp1, SOME exprow2) in RECORDAtExp(Source.over(I1,I2), SOME exprow1) end fun infappExp(atexp1, vid, atexp2) = let val Ivid = Source.between(infoAtExp atexp1, infoAtExp atexp2) val longvid = LongVId.fromId vid val atexp1' = LONGVIDAtExp(Ivid, SANSOp, longvid) val atexp2' = pairExp(atexp1, atexp2) in appExp(atexp1', atexp2') end fun parseExp(J, atexps) = let val atexp = parse(appExp, infappExp, List.map (categoriseAtExp J) atexps) in atexpExp atexp end (* Resolving infixed patterns [Section 2.6] *) fun atpatPat(PARAtPat(_, pat)) = pat | atpatPat atpat = ATPATPat(infoAtPat atpat, atpat) fun conPat(LONGVIDAtPat(I1, op_opt, longvid), atpat) = let val I2 = infoAtPat atpat val I = Source.over(I1, I2) in PARAtPat(I, CONPat(I, op_opt, longvid, atpat)) end | conPat(_, atpat) = error(infoAtPat atpat, "misplaced atomic pattern") fun pairPat(atpat1, atpat2) = let val I1 = infoAtPat atpat1 val I2 = infoAtPat atpat2 val lab1 = Lab.fromInt 1 val lab2 = Lab.fromInt 2 val patrow2 = ROWPatRow(I2, lab2, atpatPat atpat2, NONE) val patrow1 = ROWPatRow(I1, lab1, atpatPat atpat1, SOME patrow2) in RECORDAtPat(Source.over(I1,I2), SOME patrow1) end fun infconPat(atpat1, vid, atpat2) = let val Ivid = Source.between(infoAtPat atpat1, infoAtPat atpat2) val longvid = LongVId.fromId vid val atpat1' = LONGVIDAtPat(Ivid, SANSOp, longvid) val atpat2' = pairPat(atpat1, atpat2) in conPat(atpat1', atpat2') end fun parsePat(J, atpats) = let val atpat = parse(conPat, infconPat, List.map (categoriseAtPat J) atpats) in atpatPat atpat end (* Resolving fun match rules [Figure 21, note] *) fun parseFmrule(J, atpats) = (* * Allowed is the following: * (1) vid atpat+ * (2) (atpat infix_vid atpat) atpat* * (3) atpat infix_vid atpat *) let fun checkNonfixity [] = true | checkNonfixity(NONFIX _::t) = checkNonfixity t | checkNonfixity(INFIX(_, vid, I)::t) = errorVId(I, "misplaced infix identifier ", vid) fun maybeNonfixClause(ps) = case List.hd atpats of LONGVIDAtPat(I, op_opt, longvid) => if not(LongVId.isUnqualified longvid) then errorLongVId(I, "misplaced long identifier ", longvid) else if List.length atpats < 2 then error(I, "missing function arguments") else ( checkNonfixity ps (* including 1st *) ; ( op_opt, LongVId.toId longvid, List.tl atpats ) ) | WILDCARDAtPat(I) => error(I, "misplaced wildcard pattern") | SCONAtPat(I, _) => error(I, "misplaced constant pattern") | RECORDAtPat(I, _) => error(I, "misplaced record or tuple pattern") | PARAtPat(I, _) => error(I, "misplaced parenthesised pattern") fun maybeParenthesisedInfixClause(ps) = case List.hd ps of NONFIX(PARAtPat(_, CONPat(I, SANSOp, longvid, atpat))) => if not(LongVId.isUnqualified longvid) then errorLongVId(I, "misplaced long identifier ", longvid) else if not(isInfix J longvid) then error(I, "misplaced non-infix pattern") else (* Now, longvid has infix status but is sans `op', so it can only result from resolving an appropriate infix construction. *) ( checkNonfixity(List.tl ps) ; ( SANSOp, LongVId.toId longvid, atpat::List.tl atpats ) ) | NONFIX(PARAtPat(_, pat)) => error(infoPat pat, "misplaced non-infix pattern") | _ => maybeNonfixClause(ps) fun maybePlainInfixClause(ps) = case ps of [NONFIX atpat1, INFIX(_, vid, I), NONFIX atpat2] => ( SANSOp, vid, pairPat(atpat1, atpat2)::[] ) | _ => maybeParenthesisedInfixClause(ps) in maybePlainInfixClause(List.map (categoriseAtPat J) atpats) end end (* stop of Infix.sml *) (* start of INITIAL_INFIX_ENV.sml *) (* * Standard ML initial infix environment * * Definition, Appendix C *) signature INITIAL_INFIX_ENV = sig (* Import type *) type InfEnv = Infix.InfEnv (* Export *) val J0: InfEnv end (* stop of INITIAL_INFIX_ENV.sml *) (* start of InitialInfixEnv.sml *) (* * Standard ML initial infix environment * * Definition, Appendix C *) structure InitialInfixEnv :> INITIAL_INFIX_ENV = struct (* Import type *) type InfEnv = Infix.InfEnv (* Value identifiers *) val vidCons = VId.fromString "::" val vidEqual = VId.fromString "=" val vidAssign = VId.fromString ":=" (* Export *) val J0 = VIdMap.fromList[(vidCons, (Infix.RIGHT, 5)), (vidEqual, (Infix.LEFT, 4)), (vidAssign, (Infix.LEFT, 3))] end (* stop of InitialInfixEnv.sml *) (* start of BASIS.sml *) (* * Standard ML combined basis * * Definition, section 8 *) signature BASIS = sig (* Import types *) type StaticBasis = StaticBasis.Basis (* [B_STAT] *) type DynamicBasis = DynamicBasis.Basis (* [B_DYN] *) (* Type [Section 8] *) type Basis = StaticBasis * DynamicBasis (* [B] *) (* Operations *) val B_STATof: Basis -> StaticBasis val B_DYNof: Basis -> DynamicBasis val oplus: Basis * Basis -> Basis end (* stop of BASIS.sml *) (* start of Basis.sml *) (* * Standard ML combined basis * * Definition, section 8 *) structure Basis :> BASIS = struct (* Import types *) type StaticBasis = StaticBasis.Basis (* [B_STAT] *) type DynamicBasis = DynamicBasis.Basis (* [B_DYN] *) (* Type [Section 8] *) type Basis = StaticBasis * DynamicBasis (* [B] *) (* Projections *) fun B_STATof (B_STAT,B_DYN) = B_STAT fun B_DYNof (B_STAT,B_DYN) = B_DYN (* Modification [Section 4.3] *) infix oplus fun (B_STAT,B_DYN) oplus (B_STAT',B_DYN') = ( StaticBasis.plus(B_STAT, B_STAT') , DynamicBasis.plus(B_DYN, B_DYN') ) end (* stop of Basis.sml *) (* start of PACK.sml *) (* * Standard ML exception packets * * Definition, section 6.2 *) signature PACK = sig (* Import *) type 'a ExVal = 'a Val.ExVal type FcnClosure = DynamicEnv.FcnClosure (* Definitions [Section 6.2] *) type Pack = FcnClosure ExVal (* [p] *) exception Pack of Pack end (* stop of PACK.sml *) (* start of Pack.sml *) (* * Standard ML exception packets * * Definition, section 6.2 *) structure Pack :> PACK = struct (* Import *) type 'a ExVal = 'a Val.ExVal type FcnClosure = DynamicEnv.FcnClosure (* Definitions [Section 6.2] *) type Pack = FcnClosure ExVal (* [p] *) exception Pack of Pack end (* stop of Pack.sml *) (* start of BASVAL.sml *) (* * Standard ML basic values * * Definition, section 6.4 *) signature BASVAL = sig (* Import *) type BasVal = Val.BasVal type 'a Val = 'a Val.Val exception Pack of Pack.Pack (* = Pack.Pack *) (* Operations *) exception TypeError val APPLY: BasVal * 'a Val -> 'a Val (* / Pack *) val toString: BasVal -> string end (* stop of BASVAL.sml *) (* start of BasVal.sml *) (* * Standard ML basic values * * Definition, section 6.4 *) structure BasVal :> BASVAL = struct (* Import *) type BasVal = Val.BasVal type 'a Val = 'a Val.Val exception Pack = Pack.Pack (* Conversions *) fun toString b = b (* Application of basic values *) exception TypeError fun APPLY("=", v) = (case Val.unpair v of SOME vv => Val.toBoolVal(Val.equal vv) | NONE => raise TypeError ) | APPLY _ = raise Fail "BasVal.APPLY: unknown basic value" end (* stop of BasVal.sml *) (* start of EVAL_CORE.sml *) (* * Standard ML core evaluation * * Definition, section 6.7 * * Notes: * - State is passed as reference and modified via side effects. This way * expanding out of the state and exception convention in the inference * rules can be avoided (would really be a pain). Note that the state * therefore never is returned. * - Doing so, we can model the exception convention using exceptions. *) signature EVAL_CORE = sig (* Import types *) type Dec = GrammarCore.Dec type Env = DynamicEnv.Env type State = DynamicEnv.FcnClosure State.State (* Export *) val evalDec: State ref * Env * Dec -> Env end (* stop of EVAL_CORE.sml *) (* start of EvalCore.sml *) (* * Standard ML core evaluation * * Definition, sections 6.7 and 6.2 * * Notes: * - State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * can be avoided (would really be a pain). Note that the state therefore * never is returned. * - Doing so, we can model the exception convention using exceptions. * Rules of the form A |- phrase => A'/p therefore turn into * A |- phrase => A'. * - We only pass the state where necessary. * - Special constants have already been evaluated inside the Lexer. *) structure EvalCore :> EVAL_CORE = struct (* Import *) type Dec = GrammarCore.Dec type Env = DynamicEnv.Env type State = DynamicEnv.FcnClosure State.State exception Pack = Pack.Pack open GrammarCore (* Some helpers for error messages *) val error = Error.error fun errorLab(I, s, lab) = error(I, s ^ Lab.toString lab) fun errorLongVId(I, s, longvid) = error(I, s ^ LongVId.toString longvid) fun errorLongTyCon(I, s, longtycon) = error(I, s ^ LongTyCon.toString longtycon) fun errorLongStrId(I, s, longstrid) = error(I, s ^ LongStrId.toString longstrid) (* Helpers for environment modification *) val plus = DynamicEnv.plus val plusVE = DynamicEnv.plusVE val plusTE = DynamicEnv.plusTE val plusVEandTE = DynamicEnv.plusVEandTE infix plus plusVE plusTE plusVEandTE (* Evaluating special constants [Section 6.2] *) fun valSCon(SCon.INT n) = Val.SVal(SVal.INT n) | valSCon(SCon.WORD w) = Val.SVal(SVal.WORD w) | valSCon(SCon.CHAR c) = Val.SVal(SVal.CHAR c) | valSCon(SCon.REAL x) = Val.SVal(SVal.REAL x) | valSCon(SCon.STRING s) = Val.SVal(SVal.STRING s) (* Inference rules [Section 6.7] *) exception FAIL (* Atomic Expressions *) fun evalAtExp(s,E, SCONAtExp(I, scon)) = (* [Rule 90] *) valSCon scon | evalAtExp(s,E, LONGVIDAtExp(I, _, longvid)) = (* [Rule 91] *) let val (v,is) = case DynamicEnv.findLongVId(E, longvid) of SOME valstr => valstr | NONE => errorLongVId(I, "runtime error: \ \unknown identifier ", longvid) in v end | evalAtExp(s,E, RECORDAtExp(I, exprow_opt)) = (* [Rule 92] *) let val r = case exprow_opt of NONE => LabMap.empty | SOME exprow => evalExpRow(s,E, exprow) in Val.Record r end | evalAtExp(s,E, LETAtExp(I, dec, exp)) = (* [Rule 93] *) let val E' = evalDec(s,E, dec) val v = evalExp(s,E plus E', exp) in v end | evalAtExp(s,E, PARAtExp(I, exp)) = (* [Rule 94] *) let val v = evalExp(s,E, exp) in v end (* Expression Rows *) and evalExpRow(s,E, ExpRow(I, lab, exp, exprow_opt)) = (* [Rule 95] *) let val v = evalExp(s,E, exp) val r = case exprow_opt of NONE => LabMap.empty | SOME exprow => evalExpRow(s,E, exprow) in LabMap.insert(r, lab, v) end (* Expressions *) and evalExp(s,E, ATEXPExp(I, atexp)) = (* [Rule 96] *) let val v = evalAtExp(s,E, atexp) in v end | evalExp(s,E, APPExp(I, exp, atexp)) = (* [Rules 97 to 103] *) let val v1 = evalExp(s,E, exp) val v = evalAtExp(s,E, atexp) in case v1 of Val.VId vid => if vid = VId.fromString "ref" then (* [Rule 99] *) let val a = Addr.addr() in s := State.insertAddr(!s, a, v) ; Val.Addr a end else (* [Rule 97] *) Val.VIdVal (vid,v) | Val.ExVal(Val.ExName en) => (* [Rule 98] *) Val.ExVal(Val.ExNameVal(en,v)) | Val.:= => (* [Rule 100] *) (case Val.unpair v of SOME(Val.Addr a, v) => ( s := State.insertAddr(!s, a, v) ; Val.Record LabMap.empty ) | _ => error(I, "runtime type error: address expected") ) | Val.BasVal b => (* [Rule 101] *) BasVal.APPLY(b, v) | Val.FcnClosure(DynamicEnv.FcnClosure(match,E',VE)) => (* [Rule 102] *) (let val v' = evalMatch(s,E' plusVE DynamicEnv.Rec VE, v, match) in v' end handle FAIL => (* [Rule 103] *) raise Pack(Val.ExName InitialDynamicEnv.enMatch) ) | _ => error(I, "runtime type error: applicative value expected") end | evalExp(s,E, TYPEDExp(I, exp, _)) = (* Omitted [Section 6.1] *) evalExp(s,E, exp) | evalExp(s,E, HANDLEExp(I, exp, match)) = (* [Rule 104 to 106] *) (let val v = evalExp(s,E, exp) in (* [Rule 104] *) v end handle Pack.Pack e => let val v = evalMatch(s,E,Val.ExVal e, match) in (* [Rule 105] *) v end handle FAIL => (* [Rule 106] *) raise Pack.Pack e ) | evalExp(s,E, RAISEExp(I, exp)) = (* [Rule 107] *) let val e = case evalExp(s,E, exp) of Val.ExVal e => e | _ => error(I, "runtime type error: \ \exception value expected") in raise Pack.Pack e end | evalExp(s,E, FNExp(I, match)) = (* [Rule 108] *) Val.FcnClosure(DynamicEnv.FcnClosure(match,E,VIdMap.empty)) (* Matches *) and evalMatch(s,E,v, Match(I, mrule, match_opt)) = (* [Rules 109 to 111] *) let val v' = evalMrule(s,E,v, mrule) in (* [Rule 109] *) v' end handle FAIL => case match_opt of NONE => (* [Rule 110] *) raise FAIL | SOME match => (* [Rule 111] *) let val v' = evalMatch(s,E,v, match) in v' end (* Match rules *) and evalMrule(s,E,v, Mrule(I, pat, exp)) = (* [Rules 112 and 113] *) let val VE = evalPat(s,E,v, pat) (* [Rule 112] *) val v' = evalExp(s,E plusVE VE, exp) in v' end (* FAIL on evalPat propagates through [Rule 113] *) (* Declarations *) and evalDec(s,E, VALDec(I, tyvarseq, valbind)) = (* [Rule 114] *) let val VE = evalValBind(s,E, valbind) in DynamicEnv.fromVE VE end | evalDec(s,E, TYPEDec(I, typbind)) = (* [Rule 115] *) let val TE = evalTypBind(typbind) in DynamicEnv.fromTE TE end | evalDec(s,E, DATATYPEDec(I, datbind)) = (* [Rule 116] *) let val (VE,TE) = evalDatBind(datbind) in DynamicEnv.fromVEandTE(VE,TE) end | evalDec(s,E, REPLICATIONDec(I, tycon, longtycon)) = (* [Rule 117] *) let val VE = case DynamicEnv.findLongTyCon(E, longtycon) of SOME VE => VE | NONE => errorLongTyCon(I, "runtime error: unknown type ", longtycon) in DynamicEnv.fromVEandTE(VE, TyConMap.singleton(tycon, VE)) end | evalDec(s,E, ABSTYPEDec(I, datbind, dec)) = (* [Rule 118] *) let val (VE,TE) = evalDatBind(datbind) val E' = evalDec(s,E plusVEandTE (VE,TE), dec) in E' end | evalDec(s,E, EXCEPTIONDec(I, exbind)) = (* [Rule 119] *) let val VE = evalExBind(s,E, exbind) in DynamicEnv.fromVE VE end | evalDec(s,E, LOCALDec(I, dec1, dec2)) = (* [Rule 120] *) let val E1 = evalDec(s,E, dec1) val E2 = evalDec(s,E plus E1, dec2) in E2 end | evalDec(s,E, OPENDec(I, longstrids)) = (* [Rule 121] *) let val Es = List.map (fn longstrid => case DynamicEnv.findLongStrId(E, longstrid) of SOME(DynamicEnv.Str E) => E | NONE => errorLongStrId(I, "runtime error: unknown \ \structure ", longstrid) ) longstrids in List.foldl DynamicEnv.plus DynamicEnv.empty Es end | evalDec(s,E, EMPTYDec(I)) = (* [Rule 122] *) DynamicEnv.empty | evalDec(s,E, SEQDec(I, dec1, dec2)) = (* [Rule 123] *) let val E1 = evalDec(s,E, dec1) val E2 = evalDec(s,E plus E1, dec2) in E1 plus E2 end (* Value Bindings *) and evalValBind(s,E, PLAINValBind(I, pat, exp, valbind_opt)) = (* [Rule 124 and 125] *) (let val v = evalExp(s,E, exp) val VE = evalPat(s,E,v, pat) (* [Rule 124] *) val VE' = case valbind_opt of NONE => VIdMap.empty | SOME valbind => evalValBind(s,E, valbind) in VIdMap.unionWith #2 (VE, VE') end handle FAIL => (* [Rule 125] *) raise Pack.Pack(Val.ExName InitialDynamicEnv.enBind) ) | evalValBind(s,E, RECValBind(I, valbind)) = (* [Rule 126] *) let val VE = evalValBind(s,E, valbind) in DynamicEnv.Rec VE end (* Type Bindings *) and evalTypBind(TypBind(I, tyvarseq, tycon, ty, typbind_opt)) = (* [Rule 127] *) let val TE = case typbind_opt of NONE => TyConMap.empty | SOME typbind => evalTypBind(typbind) in TyConMap.insert(TE, tycon, VIdMap.empty) end (* Datatype Bindings *) and evalDatBind(DatBind(I, tyvarseq, tycon, conbind, datbind_opt)) = (* [Rule 128] *) let val VE = evalConBind(conbind) val (VE',TE') = case datbind_opt of NONE => ( VIdMap.empty, TyConMap.empty ) | SOME datbind' => evalDatBind(datbind') in ( VIdMap.unionWith #2 (VE, VE') , TyConMap.insert(TE', tycon, VE) ) end (* Constructor Bindings *) and evalConBind(ConBind(I, _, vid, _, conbind_opt)) = (* [Rule 129] *) let val VE = case conbind_opt of NONE => VIdMap.empty | SOME conbind => evalConBind(conbind) in VIdMap.insert(VE, vid, (Val.VId vid,IdStatus.c)) end (* Exception Bindings *) and evalExBind(s,E, NEWExBind(I, _, vid, _, exbind_opt)) = (* [Rule 130] *) let val en = ExName.exname vid val VE = case exbind_opt of NONE => VIdMap.empty | SOME exbind => evalExBind(s,E, exbind) in s := State.insertExName(!s, en) ; VIdMap.insert(VE, vid, (Val.ExVal(Val.ExName en),IdStatus.e)) end | evalExBind(s,E, EQUALExBind(I, _, vid, _, longvid, exbind_opt)) = (* [Rule 131] *) let val en = case DynamicEnv.findLongVId(E, longvid) of SOME(en,IdStatus.e) => en | SOME _ => errorLongVId(I, "runtime error: non-exception \ \identifier ", longvid) | NONE => errorLongVId(I, "runtime error: unknown identifier ", longvid) val VE = case exbind_opt of NONE => VIdMap.empty | SOME exbind => evalExBind(s,E, exbind) in VIdMap.insert(VE, vid, (en,IdStatus.e)) end (* Atomic Patterns *) and evalAtPat(s,E,v, WILDCARDAtPat(I)) = (* [Rule 132] *) VIdMap.empty | evalAtPat(s,E,v, SCONAtPat(I, scon)) = (* [Rule 133 and 134] *) (case v of Val.SVal sv => if Val.equal(v, valSCon(scon)) then (* [Rule 133] *) VIdMap.empty else (* [Rule 134] *) raise FAIL | _ => error(I, "runtime type error: special constant expected") ) | evalAtPat(s,E,v, LONGVIDAtPat(I, _, longvid)) = (* [Rule 135 to 137] *) let val (strids,vid) = LongVId.explode longvid in if List.null strids andalso ( case DynamicEnv.findVId(E, vid) of NONE => true | SOME(_,is) => is = IdStatus.v ) then (* [Rule 135] *) VIdMap.singleton(vid, (v,IdStatus.v)) else let val (v',is) = case DynamicEnv.findLongVId(E, longvid) of SOME valstr => valstr | NONE => errorLongVId(I,"runtime error: \ \unknown constructor ", longvid) in if Val.equal(v, v') then (* [Rule 136] *) VIdMap.empty else (* [Rule 137] *) raise FAIL end end | evalAtPat(s,E,v, RECORDAtPat(I, patrow_opt)) = (* [Rule 138] *) let val r = case v of Val.Record r => r | _ => error(I, "runtime type error: record expected") val VE = case patrow_opt of NONE => if LabMap.isEmpty r then VIdMap.empty else error(I, "runtime type error: \ \empty record expected") | SOME patrow => evalPatRow(s,E,r, patrow) in VE end | evalAtPat(s,E,v, PARAtPat(I, pat)) = (* [Rule 139] *) let val VE = evalPat(s,E,v, pat) in VE end (* Pattern Rows *) and evalPatRow(s,E,r, WILDCARDPatRow(I)) = (* [Rule 140] *) VIdMap.empty | evalPatRow(s,E,r, ROWPatRow(I, lab, pat, patrow_opt)) = (* [Rule 141 and 142] *) let val v = case LabMap.find(r, lab) of SOME v => v | _ => errorLab(I, "runtime type error: \ \unmatched label ", lab) val VE = evalPat(s,E,v, pat) (* [Rule 142] *) val VE' = case patrow_opt of NONE => VIdMap.empty | SOME patrow => evalPatRow(s,E,r, patrow) in VIdMap.unionWithi #2 (VE, VE') end (* FAIL on evalPat propagates through [Rule 142] *) (* Patterns *) and evalPat(s,E,v, ATPATPat(I, atpat)) = (* [Rule 143] *) let val VE = evalAtPat(s,E,v, atpat) in VE end | evalPat(s,E,v, CONPat(I, _, longvid, atpat)) = (* [Rules 144 to 148] *) (case (DynamicEnv.findLongVId(E, longvid), v) of ( SOME(Val.VId vid, IdStatus.c), Val.VIdVal(vid',v') ) => if vid = VId.fromString "ref" then error(I, "runtime type error: address expected") else if vid = vid' then (* [Rule 144] *) let val VE = evalAtPat(s,E,v', atpat) in VE end else (* [Rule 145] *) raise FAIL | ( SOME(Val.ExVal(Val.ExName en),IdStatus.e), Val.ExVal(Val.ExNameVal(en',v')) ) => if en = en' then (* [Rule 146] *) let val VE = evalAtPat(s,E,v', atpat) in VE end else (* [Rule 147] *) raise FAIL | ( SOME(Val.VId vid, IdStatus.c), Val.Addr a ) => if vid = VId.fromString "ref" then (* [Rule 148] *) let val v = case State.findAddr(!s, a) of SOME v => v | NONE => raise Fail "EvalCore.evalPat: \ \invalid address" val VE = evalAtPat(s,E,v, atpat) in VE end else error(I, "runtime type error: reference expected") | _ => error(I, "runtime type error: constructor expected") ) | evalPat(s,E,v, TYPEDPat(I, pat, _)) = (* Omitted [Section 6.1] *) evalPat(s,E,v, pat) | evalPat(s,E,v, ASPat(I, _, vid, _, pat)) = (* [Rule 149] *) let val VE = evalPat(s,E,v, pat) in VIdMap.insert(VE, vid, (v,IdStatus.v)) end end (* stop of EvalCore.sml *) (* start of INTBASIS.sml *) (* * Standard ML interface basis * * Definition, section 7.2 *) signature INTBASIS = sig (* Import types *) type SigId = SigId.Id type longTyCon = LongTyCon.longId type Basis = DynamicBasis.Basis type SigEnv = DynamicBasis.SigEnv type Env = DynamicEnv.Env type Int = Interface.Int type ValInt = Interface.ValInt type 'a SigIdMap = 'a SigIdMap.map (* Types [Section 7.2] *) type IntBasis = SigEnv * Int (* [IB] *) (* Operations *) val Inter: Basis -> IntBasis val plusI: IntBasis * Int -> IntBasis val findSigId: IntBasis * SigId -> Int option val findLongTyCon: IntBasis * longTyCon -> ValInt option end (* stop of INTBASIS.sml *) (* start of IntBasis.sml *) (* * Standard ML interface basis * * Definition, section 7.2 *) structure IntBasis :> INTBASIS = struct (* Import types *) type SigId = SigId.Id type longTyCon = LongTyCon.longId type Basis = DynamicBasis.Basis type SigEnv = DynamicBasis.SigEnv type Env = DynamicEnv.Env type Int = Interface.Int type ValInt = Interface.ValInt type 'a SigIdMap = 'a SigIdMap.map (* Types [Section 7.2] *) type IntBasis = SigEnv * Int (* [IB] *) (* Injections [Section 7.2] *) fun Inter (F,G,E) = (G, Interface.Inter E) (* Modifications [Sections 4.3 and 7.2] *) infix plusI fun (G,I) plusI I' = ( G, Interface.plus(I,I') ) (* Application (lookup) [Sections 7.2 and 4.3] *) fun findSigId((G,I), sigid) = SigIdMap.find(G, sigid) fun findLongTyCon((G,I), longtycon) = Interface.findLongTyCon(I, longtycon) end (* stop of IntBasis.sml *) (* start of EVAL_MODULE.sml *) (* * Standard ML modules evaluation * * Definition, section 7.3 * * Notes: * - State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * can be avoided (would really be a pain). Note that the state therefore * never is returned. * - Doing so, we can model the exception convention using exceptions. *) signature EVAL_MODULE = sig (* Import types *) type TopDec = GrammarModule.TopDec type Basis = DynamicBasis.Basis type State = EvalCore.State (* Export *) val evalTopDec: State ref * Basis * TopDec -> Basis end (* stop of EVAL_MODULE.sml *) (* start of EvalModule.sml *) (* * Standard ML modules evaluation * * Definition, section 7.3 * * Notes: * - State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * can be avoided (would really be a pain). Note that the state therefore * never is returned. * - Doing so, we can model the exception convention using exceptions. * Rules of the form A |- phrase => A'/p therefore turn into * A |- phrase => A'. * - We only pass the state where necessary, ie. strexp, strdec, strbind, and * topdec (compare note in [Section 7.3]). * - There is a typo in the Definition in rule 182: both occurances of IB * should be replaced by B. * - The rules for toplevel declarations are all wrong: in the conclusions, * the result right of the arrow must be B' <+ B''> instead of B'<'> in * all three rules. *) structure EvalModule :> EVAL_MODULE = struct (* Import *) type TopDec = GrammarModule.TopDec type Basis = DynamicBasis.Basis type State = EvalCore.State open GrammarModule (* Helpers for error messages *) val error = Error.error fun errorSigId(I, s, sigid) = error(I, s ^ SigId.toString sigid) fun errorFunId(I, s, funid) = error(I, s ^ FunId.toString funid) fun errorLongTyCon(I, s, longtycon) = error(I, s ^ LongTyCon.toString longtycon) fun errorLongStrId(I, s, longstrid) = error(I, s ^ LongStrId.toString longstrid) (* Helpers for basis modification *) val plus = DynamicBasis.plus val plusSE = DynamicBasis.plusSE val plusG = DynamicBasis.plusG val plusF = DynamicBasis.plusF val plusE = DynamicBasis.plusE infix plus plusG plusF plusE plusSE (* Inference rules [Section 7.3] *) (* Structure Expressions *) fun evalStrExp(s,B, STRUCTStrExp(I, strdec)) = (* [Rule 150] *) let val E = evalStrDec(s,B, strdec) in E end | evalStrExp(s,B, LONGSTRIDStrExp(I, longstrid)) = (* [Rule 151] *) let val E = case DynamicBasis.findLongStrId(B, longstrid) of SOME(DynamicEnv.Str E) => E | NONE => errorLongStrId(I, "runtime error: unknown structure ", longstrid) in E end | evalStrExp(s,B, TRANSStrExp(I, strexp, sigexp)) = (* [Rule 152] *) let val E = evalStrExp(s,B, strexp) val I = evalSigExp(IntBasis.Inter B, sigexp) in Interface.cutdown(E, I) end | evalStrExp(s,B, OPAQStrExp(I, strexp, sigexp)) = (* [Rule 153] *) let val E = evalStrExp(s,B, strexp) val I = evalSigExp(IntBasis.Inter B, sigexp) in Interface.cutdown(E, I) end | evalStrExp(s,B, APPStrExp(I, funid, strexp)) = (* [Rule 154] *) let val DynamicBasis.FunctorClosure((strid, I), strexp', B') = case DynamicBasis.findFunId(B, funid) of SOME funcclos => funcclos | NONE => errorFunId(I, "runtime error: \ \unknown functor ", funid) val E = evalStrExp(s,B, strexp) val E' = evalStrExp( s, B' plusSE StrIdMap.singleton(strid, DynamicEnv.Str(Interface.cutdown(E, I))), strexp') in E' end | evalStrExp(s,B, LETStrExp(I, strdec, strexp)) = (* [Rule 155] *) let val E = evalStrDec(s,B, strdec) val E' = evalStrExp(s,B plusE E, strexp) in E' end (* Structure-level Declarations *) and evalStrDec(s,B, DECStrDec(I, dec)) = (* [Rule 156] *) let val E' = EvalCore.evalDec(s,DynamicBasis.Eof B, dec) in E' end | evalStrDec(s,B, STRUCTUREStrDec(I, strbind)) = (* [Rule 157] *) let val SE = evalStrBind(s,B, strbind) in DynamicEnv.fromSE SE end | evalStrDec(s,B, LOCALStrDec(I, strdec1, strdec2)) = (* [Rule 158] *) let val E1 = evalStrDec(s,B, strdec1) val E2 = evalStrDec(s,B plusE E1, strdec2) in E2 end | evalStrDec(s,B, EMPTYStrDec(I)) = (* [Rule 159] *) DynamicEnv.empty | evalStrDec(s,B, SEQStrDec(I, strdec1, strdec2)) = (* [Rule 160] *) let val E1 = evalStrDec(s,B, strdec1) val E2 = evalStrDec(s,B plusE E1, strdec2) in DynamicEnv.plus(E1, E2) end (* Structure Bindings *) and evalStrBind(s,B, StrBind(I, strid, strexp, strbind_opt)) = (* [Rule 161] *) let val E = evalStrExp(s,B, strexp) val SE = case strbind_opt of NONE => StrIdMap.empty | SOME strbind => evalStrBind(s,B, strbind) in StrIdMap.insert(SE, strid, DynamicEnv.Str E) end (* Signature Expressions *) and evalSigExp(IB, SIGSigExp(I, spec)) = (* [Rule 162] *) let val I = evalSpec(IB, spec) in I end | evalSigExp(IB, SIGIDSigExp(I, sigid)) = (* [Rule 163] *) let val I = case IntBasis.findSigId(IB, sigid) of SOME I => I | NONE => errorSigId(I, "runtime error: unknown \ \signature ",sigid) in I end | evalSigExp(IB, WHERETYPESigExp(I, sigexp, _, _, _)) = (* Omitted [Section 7.1] *) evalSigExp(IB, sigexp) (* Signature Declarations *) and evalSigDec(IB, SigDec(I, sigbind)) = (* [Rule 164] *) let val G = evalSigBind(IB, sigbind) in G end (* Signature Bindings *) and evalSigBind(IB, SigBind(I, sigid, sigexp, sigbind_opt)) = (* [Rule 165] *) let val I = evalSigExp(IB, sigexp) val G = case sigbind_opt of NONE => SigIdMap.empty | SOME sigbind => evalSigBind(IB, sigbind) in SigIdMap.insert(G, sigid, I) end (* Specifications *) and evalSpec(IB, VALSpec(I, valdesc)) = (* [Rule 166] *) let val VI = evalValDesc(valdesc) in Interface.fromVI VI end | evalSpec(IB, TYPESpec(I, typdesc)) = (* [Rule 167] *) let val TI = evalTypDesc(typdesc) in Interface.fromTI TI end | evalSpec(IB, EQTYPESpec(I, typdesc)) = (* [Rule 168] *) let val TI = evalTypDesc(typdesc) in Interface.fromTI TI end | evalSpec(IB, DATATYPESpec(I, datdesc)) = (* [Rule 169] *) let val (VI,TI) = evalDatDesc(datdesc) in Interface.fromVIandTI(VI,TI) end | evalSpec(IB, REPLICATIONSpec(I, tycon, longtycon)) = (* [Rule 170] *) let val VI = case IntBasis.findLongTyCon(IB, longtycon) of SOME VI => VI | NONE => errorLongTyCon(I, "runtime error: \ \unknown type ", longtycon) val TI = TyConMap.singleton(tycon, VI) in Interface.fromVIandTI(VI,TI) end | evalSpec(IB, EXCEPTIONSpec(I, exdesc)) = (* [Rule 171] *) let val VI = evalExDesc(exdesc) in Interface.fromVI VI end | evalSpec(IB, STRUCTURESpec(I, strdesc)) = (* [Rule 172] *) let val SI = evalStrDesc(IB, strdesc) in Interface.fromSI SI end | evalSpec(IB, INCLUDESpec(I, sigexp)) = (* [Rule 173] *) let val I = evalSigExp(IB, sigexp) in I end | evalSpec(IB, EMPTYSpec(I)) = (* [Rule 174] *) Interface.empty | evalSpec(IB, SEQSpec(I, spec1, spec2)) = (* [Rule 77] *) let val I1 = evalSpec(IB, spec1) val I2 = evalSpec(IntBasis.plusI(IB, I1), spec2) in Interface.plus(I1,I2) end | evalSpec(IB, SHARINGTYPESpec(I, spec, longtycons)) = (* Omitted [Section 7.1] *) evalSpec(IB, spec) | evalSpec(IB, SHARINGSpec(I, spec, longstrids)) = (* Omitted [Section 7.1] *) evalSpec(IB, spec) (* Value Descriptions *) and evalValDesc(ValDesc(I, vid, _, valdesc_opt)) = (* [Rule 176] *) let val VI = case valdesc_opt of NONE => VIdMap.empty | SOME valdesc => evalValDesc(valdesc) in VIdMap.insert(VI, vid, IdStatus.v) end (* Type Descriptions *) and evalTypDesc(TypDesc(I, tyvarseq, tycon, typdesc_opt)) = (* [Rule 177] *) let val TI = case typdesc_opt of NONE => TyConMap.empty | SOME typdesc => evalTypDesc(typdesc) in TyConMap.insert(TI, tycon, VIdMap.empty) end (* Datatype Descriptions *) and evalDatDesc(DatDesc(I, tyvarseq, tycon, condesc, datdesc_opt)) = (* [Rule 178] *) let val VI = evalConDesc(condesc) val (VI',TI') = case datdesc_opt of NONE => ( VIdMap.empty, TyConMap.empty ) | SOME datdesc' => evalDatDesc(datdesc') in ( VIdMap.unionWith #2 (VI, VI') , TyConMap.insert(TI', tycon, VI) ) end (* Constructor Descriptions *) and evalConDesc(ConDesc(I, vid, _, condesc_opt)) = (* [Rule 179] *) let val VI = case condesc_opt of NONE => VIdMap.empty | SOME condesc => evalConDesc(condesc) in VIdMap.insert(VI, vid, IdStatus.c) end (* Exception Description *) and evalExDesc(ExDesc(I, vid, _, exdesc_opt)) = (* [Rule 180] *) let val VI = case exdesc_opt of NONE => VIdMap.empty | SOME exdesc => evalExDesc(exdesc) in VIdMap.insert(VI, vid, IdStatus.e) end (* Structure Descriptions *) and evalStrDesc(IB, StrDesc(I, strid, sigexp, strdesc_opt)) = (* [Rule 181] *) let val I = evalSigExp(IB, sigexp) val SI = case strdesc_opt of NONE => StrIdMap.empty | SOME strdesc => evalStrDesc(IB, strdesc) in StrIdMap.insert(SI, strid, Interface.Str I) end (* Functor Bindings *) and evalFunBind(B, FunBind(I, funid, strid, sigexp, strexp, funbind_opt)) = (* [Rule 182] *) (* Note that there is a typo in this rule. *) let val I = evalSigExp(IntBasis.Inter B, sigexp) val F = case funbind_opt of NONE => FunIdMap.empty | SOME funbind => evalFunBind(B, funbind) in FunIdMap.insert(F, funid, DynamicBasis.FunctorClosure((strid,I),strexp,B)) end (* Functor Declarations *) and evalFunDec(B, FunDec(I, funbind)) = (* [Rule 183] *) let val F = evalFunBind(B, funbind) in F end (* Top-level Declarations *) and evalTopDec(s,B, STRDECTopDec(I, strdec, topdec_opt)) = (* [Rule 184] *) (* Note the mistake in the conclusion of this rule. *) let val E = evalStrDec(s,B, strdec) val B' = DynamicBasis.fromE E val B'' = case topdec_opt of NONE => DynamicBasis.empty | SOME topdec => evalTopDec(s,B plus B', topdec) in B' plus B'' end | evalTopDec(s,B, SIGDECTopDec(I, sigdec, topdec_opt)) = (* [Rule 185] *) (* Note the mistake in the conclusion of this rule. *) let val G = evalSigDec(IntBasis.Inter B, sigdec) val B' = DynamicBasis.fromG G val B'' = case topdec_opt of NONE => DynamicBasis.empty | SOME topdec => evalTopDec(s,B plus B', topdec) in B' plus B'' end | evalTopDec(s,B, FUNDECTopDec(I, fundec, topdec_opt)) = (* [Rule 186] *) (* Note the mistake in the conclusion of this rule. *) let val F = evalFunDec(B, fundec) val B' = DynamicBasis.fromF F val B'' = case topdec_opt of NONE => DynamicBasis.empty | SOME topdec => evalTopDec(s,B plus B', topdec) in B' plus B'' end end (* stop of EvalModule.sml *) (* start of PRETTY_PRINT.sml *) (* * A generic pretty printer. * * Based on: * Philip Wadler. "A prettier printer" * http://cm.bell-labs.com/cm/cs/who/wadler/ * and Christian Lindig's port to OCaml. * * The semantics has been extended to allow 4 different kinds of * groups (`boxes'), 2 modes of nesting, and varying break representations. * This is no more easily described by an algebra though, and the `below' * combinator looses optimality. *) signature PRETTY_PRINT = sig type doc val empty : doc (* empty document *) val break : doc (* space or line break *) val ebreak : doc (* empty or line break *) val text : string -> doc (* raw text *) val ^^ : doc * doc -> doc (* concatenation *) val ^/^ : doc * doc -> doc (* concatenation with break *) val hbox : doc -> doc (* horizontal box *) val vbox : doc -> doc (* vertical box *) val fbox : doc -> doc (* fill box (h and v) *) val abox : doc -> doc (* auto box (h or v) *) val nest : int -> doc -> doc (* indentation by k char's *) val below : doc -> doc (* keep current indentation *) val isEmpty : doc -> bool val toString : doc * int -> string val output : TextIO.outstream * doc * int -> unit end (* stop of PRETTY_PRINT.sml *) (* start of PrettyPrint.sml *) (* * A generic pretty printer. * * Based on: * Philip Wadler. "A prettier printer" * http://cm.bell-labs.com/cm/cs/who/wadler/ * and Christian Lindig's port to OCaml. * * The semantics has been extended to allow 4 different kinds of * groups (`boxes'), 2 modes of nesting, and varying break representations. * This is no more easily described by an algebra though, and the `below' * combinator looses optimality. *) structure PrettyPrint :> PRETTY_PRINT = struct (* Types *) datatype mode = H | V | F | A datatype doc = EMPTY | BREAK of string | TEXT of string | CONS of doc * doc | BOX of mode * doc | NEST of int * doc | BELOW of doc datatype prim = PTEXT of string | PLINE of int (* Interface operators *) infixr ^^ ^/^ val empty = EMPTY val break = BREAK " " val ebreak = BREAK "" val text = TEXT fun x ^^ EMPTY = x | EMPTY ^^ y = y | x ^^ y = CONS(x, y) fun x ^/^ EMPTY = x | EMPTY ^/^ y = y | x ^/^ y = CONS(x, CONS(break, y)) fun below EMPTY = EMPTY | below x = BELOW x fun hbox EMPTY = EMPTY | hbox x = BOX(H, x) fun vbox EMPTY = EMPTY | vbox x = BOX(V, x) fun fbox EMPTY = EMPTY | fbox x = BOX(F, x) fun abox EMPTY = EMPTY | abox x = BOX(A, x) fun nest k EMPTY = EMPTY | nest k x = NEST(k, x) fun isEmpty EMPTY = true | isEmpty _ = false (* Check whether the first line of a document fits into remaining characters *) (* We abuse the mode A (which can never occur in the lists passed to * fits) to flag breaks which occur inside swallowed vboxes. *) fun fits(w, z) = w >= 0 andalso case z of [] => true | (i,m,EMPTY)::z => fits(w, z) | (i,m,CONS(x,y))::z => fits(w, (i,m,x)::(i,m,y)::z) | (i,m,TEXT s)::z => fits(w - String.size s, z) | (i,H,BREAK s)::z => fits(w - String.size s, z) | (i,A,BREAK s)::z => false | (i,m,BREAK s)::z => true | (i,m,BOX(V,x))::z => fits(w, (i,A,x)::z) | (i,m,BOX(n,x))::z => fits(w, (i,H,x)::z) | (i,m,NEST(j,x))::z => fits(w, (i,m,x)::z) | (i,m,BELOW x)::z => fits(w, (i,m,x)::z) (* Layout *) fun best(w, k, z, a) = case z of [] => List.rev a | (i,m,EMPTY)::z => best(w, k, z, a) | (i,m,CONS(x,y))::z => best(w, k, (i,m,x)::(i,m,y)::z, a) | (i,m,TEXT s)::z => best(w, k + String.size s, z, PTEXT(s)::a) | (i,H,BREAK s)::z => horizontal(w, k, s, z, a) | (i,V,BREAK s)::z => vertical(w, i, z, a) | (i,F,BREAK s)::z => if fits(w - k - String.size s, z) then horizontal(w, k, s, z, a) else vertical(w, i, z, a) | (i,A,BREAK s)::z => raise Fail "PrettyPrint.best" | (i,m,BOX(A,x))::z => if fits(w - k, (i,H,x)::z) then best(w, k, (i,H,x)::z, a) else best(w, k, (i,V,x)::z, a) | (i,m,BOX(n,x))::z => best(w, k, (i,n,x)::z, a) | (i,m,NEST(j,x))::z => best(w, k, (i+j,m,x)::z, a) | (i,m,BELOW x)::z => best(w, k, (k,m,x)::z, a) and horizontal(w, k, s, z, a) = best(w, k + String.size s, z, PTEXT(s)::a) and vertical(w, i, z, a) = best(w, i, z, PLINE(i)::a) fun layout(doc, w) = best(w, 0, [(0,V,doc)], []) (* Convert a document *) fun primToString(PTEXT s) = s | primToString(PLINE i) = String.implode(#"\n" :: List.tabulate(i, fn _ => #" ")) val toString = String.concat o List.map primToString o layout (* Output a document directly (is MUCH faster!) *) fun loop 0 f = () | loop n f = ( f() ; loop (n-1) f ) fun outputPrim os (PTEXT s) = TextIO.output(os, s) | outputPrim os (PLINE i) = ( TextIO.output1(os, #"\n") ; loop i (fn() => TextIO.output1(os, #" ")) ) fun output(os, doc, w) = List.app (outputPrim os) (layout(doc, w)) end (* stop of PrettyPrint.sml *) (* start of PP_MISC.sml *) (* * Standard ML miscellaneous pretty printing helpers *) signature PP_MISC = sig type doc = PrettyPrint.doc val nest: doc -> doc val paren: doc -> doc val brace: doc -> doc val brack: doc -> doc val ppCommaList: ('a -> doc) -> 'a list -> doc val ppStarList: ('a -> doc) -> 'a list -> doc val ppSeq: ('a -> doc) -> 'a list -> doc val ppSeqPrec: (int -> 'a -> doc) -> int -> 'a list -> doc end (* stop of PP_MISC.sml *) (* start of PPMisc.sml *) (* * Standard ML miscellaneous pretty printing helpers *) structure PPMisc :> PP_MISC = struct (* Import *) open PrettyPrint infixr ^^ (* Some PP combinators *) val nest = nest 2 fun paren doc = text "(" ^^ fbox(below doc) ^^ text ")" fun brace doc = text "{" ^^ fbox(below doc) ^^ text "}" fun brack doc = text "[" ^^ fbox(below doc) ^^ text "]" fun ppCommaList ppX [] = empty | ppCommaList ppX [x] = ppX x | ppCommaList ppX (x::xs) = ppX x ^^ text "," ^^ break ^^ ppCommaList ppX xs fun ppStarList ppX [] = empty | ppStarList ppX [x] = ppX x | ppStarList ppX (x::xs) = hbox(ppX x ^^ break ^^ text "*") ^^ break ^^ ppStarList ppX xs fun ppSeqPrec ppXPrec n [] = empty | ppSeqPrec ppXPrec n [x] = ppXPrec n x | ppSeqPrec ppXPrec n xs = paren(ppCommaList (ppXPrec 0) xs) fun ppSeq ppX = ppSeqPrec (fn _ => ppX) 0 end (* stop of PPMisc.sml *) (* start of PP_VAL.sml *) (* * Standard ML pretty printing of values *) signature PP_VAL = sig type doc = PrettyPrint.doc type 'a State = 'a State.State type 'a Val = 'a Val.Val type 'a ExVal = 'a Val.ExVal val ppVal: 'a State * 'a Val -> doc val ppExVal: 'a State * 'a ExVal -> doc end (* stop of PP_VAL.sml *) (* start of PPVal.sml *) (* * Standard ML pretty printing of values *) structure PPVal :> PP_VAL = struct (* Import *) type 'a State = 'a State.State open Val open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) val ppFn = text "" fun ppLab lab = text(Lab.toString lab) fun ppVId vid = text(VId.toString vid) fun ppExName en = text(ExName.toString en) fun ppSVal sv = text(SVal.toString sv) (* Values *) (* Precedence: * 0 : plain expressions * 1 : constructor arguments *) fun ppVal (s, v) = fbox(below(nest(ppValPrec (0, s) v))) and ppExVal(s, e) = fbox(below(nest(ppExValPrec (0, s) e))) and ppValPrec (p, s) (op:=) = ppFn | ppValPrec (p, s) (SVal sv) = ppSVal sv | ppValPrec (p, s) (BasVal b) = ppFn | ppValPrec (p, s) (VId vid) = ppVId vid | ppValPrec (p, s) (v as VIdVal(vid, v')) = let exception NotAList fun items(VId vid, vs) = if vid <> VId.fromString "nil" then raise NotAList else List.rev vs | items(VIdVal(vid, v), vs) = if vid <> VId.fromString "::" then raise NotAList else (case Val.unpair v of NONE => raise NotAList | SOME(v1, v2) => items(v2, v1::vs) ) | items(_, vs) = raise NotAList in let val vs = items(v, []) in brack(ppCommaList (ppValPrec (0, s)) vs) end handle NotAList => let val doc = ppVId vid ^/^ ppValPrec (1, s) v' in if p = 0 then doc else paren doc end end | ppValPrec (p, s) (ExVal e) = ppExValPrec (p, s) e | ppValPrec (p, s) (Record r) = let fun isTuple( [], n) = n > 2 | isTuple(lab::labs, n) = lab = Lab.fromInt n andalso isTuple(labs, n+1) val labvs = LabMap.listItemsi r val (labs,vs) = ListPair.unzip labvs in if List.null labs then text "()" else if isTuple(labs, 1) then paren(ppCommaList (ppValPrec (0, s)) vs) else brace(ppCommaList (ppLabVal s) labvs) end | ppValPrec (p, s) (Addr a) = let val v = case State.findAddr(s, a) of SOME v => v | NONE => raise Fail "PPVal.ppVal: invalid address" val doc = text "ref" ^/^ ppValPrec (1, s) v in if p = 0 then doc else paren doc end | ppValPrec (p, s) (FcnClosure _) = ppFn and ppLabVal s (lab, v) = abox( hbox( ppLab lab ^/^ text "=" ) ^^ below(nest(break ^^ ppVal(s, v) )) ) and ppExValPrec (p, s) (ExName en) = ppExName en | ppExValPrec (p, s) (ExNameVal(en, v)) = let val doc = ppExName en ^/^ ppValPrec (1, s) v in if p = 0 then doc else paren doc end end (* stop of PPVal.sml *) (* start of PP_DYNAMIC_ENV.sml *) (* * Standard ML pretty printing of the dynamic environment *) signature PP_DYNAMIC_ENV = sig type doc = PrettyPrint.doc type Env = DynamicEnv.Env type Str = DynamicEnv.Str type State = DynamicEnv.FcnClosure State.State val ppEnv: State * Env -> doc val ppStr: State * Str -> doc end (* stop of PP_DYNAMIC_ENV.sml *) (* start of PPDynamicEnv.sml *) (* * Standard ML pretty printing of the dynamic environment *) structure PPDynamicEnv :> PP_DYNAMIC_ENV = struct (* Import *) type Env = DynamicEnv.Env type Str = DynamicEnv.Str type State = DynamicEnv.FcnClosure State.State open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppVId vid = text(VId.toString vid) fun ppStrId strid = text(StrId.toString strid) (* Environments *) fun ppValEnv(s, VE) = VIdMap.foldri (fn(vid, (v,IdStatus.v), doc) => abox( hbox( text "val" ^/^ ppVId vid ^/^ text "=" ) ^^ nest(break ^^ abox(PPVal.ppVal(s, v)) ) ) ^/^ doc | (vid, (v,_), doc) => doc ) empty VE fun ppExEnv VE = VIdMap.foldri (fn(vid, (v,IdStatus.e), doc) => hbox( text "exception" ^/^ ppVId vid ) ^/^ doc | (vid, (v,_), doc) => doc ) empty VE fun ppConEnv VE = VIdMap.foldli (fn(vid, (v,IdStatus.c), doc) => hbox( text "con" ^/^ ppVId vid ) ^/^ doc | (vid, (v,_), doc) => doc ) empty VE fun ppStrEnv(s, SE) = StrIdMap.foldri (fn(strid, S, doc) => abox( hbox( text "structure" ^/^ ppStrId strid ^/^ text "=" ) ^^ nest(break ^^ ppStr(s, S) ) ) ^/^ doc ) empty SE and ppEnv(s, (SE,TE,VE)) = vbox( ppStrEnv(s, SE) ^/^ ppConEnv VE ^/^ ppExEnv VE ^/^ ppValEnv(s, VE) ) (* Structures *) and ppStr(s, DynamicEnv.Str E) = let val doc = ppEnv(s, E) in abox(below( text "struct" ^^ (if isEmpty doc then empty else nest(vbox(break ^^ doc)) ) ^^ break ^^ text "end" )) end end (* stop of PPDynamicEnv.sml *) (* start of PP_DYNAMIC_BASIS.sml *) (* * Standard ML pretty printing of the dynamic basis *) signature PP_DYNAMIC_BASIS = sig type doc = PrettyPrint.doc type Basis = DynamicBasis.Basis type State = DynamicEnv.FcnClosure State.State val ppBasis: State * Basis -> doc end (* stop of PP_DYNAMIC_BASIS.sml *) (* start of PPDynamicBasis.sml *) (* * Standard ML pretty printing of the dynamic basis *) structure PPDynamicBasis :> PP_DYNAMIC_BASIS = struct (* Import *) type Basis = DynamicBasis.Basis type State = DynamicEnv.FcnClosure State.State open PrettyPrint infixr ^^ ^/^ (* Simple objects *) fun ppFunId funid = text(FunId.toString funid) (* Environments *) fun ppFunEnv F = FunIdMap.foldri (fn(funid, _, doc) => hbox( text "functor" ^/^ ppFunId funid ) ^/^ doc ) empty F (* Basis *) fun ppBasis(s, (F,G,E)) = vbox( ppFunEnv F ^/^ PPDynamicEnv.ppEnv(s, E) ^/^ text "" ) end (* stop of PPDynamicBasis.sml *) (* start of CHECK_PATTERN.sml *) (* * Standard ML consistency of patterns and matches * * Definition, section 4.11 * * Note: * The requirement to check for irredundancy of matches is a `bug' in the * definition since this cannot be checked in general for two reasons: * * (1) There may be (hidden) aliasing of exception constructors. * Consequently, we only detect redundant exception constructors * if they are denoted by the same longvid. * * (2) There is no requirement of consistency for constructors in * sharing specifications or type realisations (actually, we * consider this a serious bug). For example, * datatype t1 = A | B * datatype t2 = C * sharing type t1 = t2 * is a legal specification. This allows a mix of the constructors * to appear in matches, rendering the terms of irredundancy and * exhaustiveness meaningless. We make no attempt to detect this, * so generated warnings may or may not make sense in that situation. *) signature CHECK_PATTERN = sig (* Import *) type Pat = GrammarCore.Pat type Match = GrammarCore.Match type Env = StaticEnv.Env (* Operations *) val checkPat: Env * Pat -> unit val checkMatch: Env * Match -> unit end (* stop of CHECK_PATTERN.sml *) (* start of CheckPattern.sml *) (* * Standard ML consistency of patterns and matches * * Definition, section 4.11 * * Note: * The requirement to check for irredundancy of matches is a `bug' in the * definition since this cannot be checked in general for two reasons: * * (1) There may be (hidden) aliasing of exception constructors. * Consequently, we only detect redundant exception constructors * if they are denoted by the same longvid. * * (2) There is no requirement of consistency for constructors in * sharing specifications or type realisations (actually, we * consider this a serious bug). For example, * datatype t1 = A | B * datatype t2 = C * sharing type t1 = t2 * is a legal specification. This allows a mix of the constructors * to appear in matches, rendering the terms of irredundancy and * exhaustiveness meaningless. We make no attempt to detect this, * so generated warnings may or may not make sense in that situation. * * Bugs: * All types of special constants are assumed to be infinite, so that * a match only gets exhaustive by placing a variable. This is a bit * inaccurate for char in particular where the programmer actually would * be able to write down the complete set of values. * The reason is that for special constants to be treated properly in * the presence of overloading we would require the (resolved) type * information. *) structure CheckPattern :> CHECK_PATTERN = struct (* Import *) type SCon = SCon.SCon type Lab = Lab.Lab type VId = VId.Id type longVId = LongVId.longId type Pat = GrammarCore.Pat type Match = GrammarCore.Match type Env = StaticEnv.Env type SConSet = SConSet.set type VIdSet = VIdSet.set type LongVIdSet = LongVIdSet.set type 'a LabMap = 'a LabMap.map open GrammarCore (* * Algorithm has been derived from: * Peter Sestoft. * "ML pattern matching compilation and partial evaluation", * in: Dagstuhl Seminar on Partial Evaluation, * Lecture Notes in Computer Science, Springer-Verlag 1996 *) (* Value description *) datatype description = ANY | SCON of SCon | NOT_SCON of SConSet | EXCON of longVId * description option | NOT_EXCON of LongVIdSet | CON of VId * description option | NOT_CON of VIdSet | RECORD of description LabMap datatype context = EXCON' of longVId | CON' of VId | LAB' of Lab | RECORD' of description LabMap type knowledge = description * context list type continuations = PatRow option list * Match option (* Extending the context on partial success *) fun augment(EXCON'(longvid)::context, desc) = augment(context, EXCON(longvid, SOME desc)) | augment(CON'(vid)::context, desc) = augment(context, CON(vid, SOME desc)) | augment(LAB'(lab)::RECORD'(descs)::context, desc) = RECORD'(LabMap.insert(descs, lab, desc)) :: context | augment _ = raise Fail "CheckPattern.augment: invalid context" (* Building the description on failure *) fun build([], desc) = desc | build(EXCON'(longvid)::context, desc) = build(context, EXCON(longvid, SOME desc)) | build(CON'(vid)::context, desc) = build(context, CON(vid, SOME desc)) | build(LAB'(lab)::RECORD'(descs)::context, desc) = build(context, RECORD(LabMap.insert(descs, lab, desc))) | build _ = raise Fail "CheckPattern.build: invalid context" (* Result type for static matching *) structure RegionSet = FinSetFn(type ord_key = Source.region val compare = Source.compare) type result = RegionSet.set * bool val success = ( RegionSet.empty, true ) val failure = ( RegionSet.empty, false ) fun branch((P1, exhaustive1), (P2, exhaustive2)) = ( RegionSet.union(P1, P2), exhaustive1 andalso exhaustive2 ) fun reached(I, (P, exhaustive)) = ( RegionSet.add(P, I), exhaustive ) (* Static pattern matching *) fun matchMatch(E, desc, Match(_, mrule, match_opt)) = matchMrule(E, desc, mrule, match_opt) and matchMrule(E, desc, Mrule(I, pat, exp), match_opt) = reached(I, matchPat(E, (desc, []), pat, ([], match_opt))) and matchAtPat(E, know, atpat, cont) = case atpat of WILDCARDAtPat(_) => succeed(E, know, cont) | SCONAtPat(_, scon) => matchSCon(E, know, scon, cont) | LONGVIDAtPat(_, _, longvid) => (case StaticEnv.findLongVId(E, longvid) of NONE => succeed(E, know, cont) | SOME(sigma, IdStatus.v) => succeed(E, know, cont) | SOME(sigma, IdStatus.e) => matchExCon(E, know, longvid, NONE, cont) | SOME((_,tau), IdStatus.c) => let val vid = LongVId.toId longvid val span = TyName.span(Type.tyname(Type.range tau)) in matchCon(E, know, vid, span, NONE, cont) end ) | RECORDAtPat(_, patrow_opt) => matchRecord(E, know, patrow_opt, cont) | PARAtPat(_, pat) => matchPat(E, know, pat, cont) and matchPat(E, know, pat, cont) = case pat of ATPATPat(_, atpat) => matchAtPat(E, know, atpat, cont) | CONPat(_, _, longvid, atpat) => (case StaticEnv.findLongVId(E, longvid) of SOME(sigma, IdStatus.e) => matchExCon(E, know, longvid, SOME atpat, cont) | SOME((_,tau), IdStatus.c) => let val vid = LongVId.toId longvid val span = TyName.span(Type.tyname(Type.range tau)) in matchCon(E, know, vid, span, SOME atpat, cont) end | _ => raise Fail "CheckMatching.matchPat: \ \invalid constructed pattern" ) | TYPEDPat(_, pat, ty) => matchPat(E, know, pat, cont) | ASPat(_, _, vid, ty_opt, pat) => matchPat(E, know, pat, cont) and matchRecord(E, (desc, context), patrow_opt, cont) = let val descs = case desc of ANY => LabMap.empty | RECORD descs => descs | _ => raise Fail "CheckPattern.matchRecord: type error" in matchPatRowOpt(E, RECORD'(descs)::context, patrow_opt, cont) end and matchPatRowOpt(E, RECORD'(descs)::context, patrow_opt, cont as (patrow_opts, match_opt)) = (case patrow_opt of SOME(ROWPatRow(_, lab, pat, patrow_opt')) => let val desc' = case LabMap.find(descs, lab) of NONE => ANY | SOME desc' => desc' in matchPat(E, (desc', LAB'(lab)::RECORD'(descs)::context), pat, (patrow_opt'::patrow_opts, match_opt)) end | _ => succeed(E, (RECORD descs, context), cont) ) | matchPatRowOpt _ = raise Fail "CheckPattern.matchPatRowOpt: inconsistent context" and matchSCon(E, know as (desc, context), scon, cont) = let val knowSucc = (SCON scon, context) fun knowFail scons = (NOT_SCON(SConSet.add(scons, scon)), context) in case desc of ANY => branch(succeed(E, knowSucc, cont), fail(E, knowFail SConSet.empty, cont) ) | SCON scon' => if SCon.compare(scon, scon') = EQUAL then succeed(E, know, cont) else fail(E, know, cont) | NOT_SCON scons => if SConSet.member(scons, scon) then fail(E, know, cont) else branch(succeed(E, knowSucc, cont), fail(E, knowFail scons, cont) ) | _ => raise Fail "CheckPattern.matchSCon: type error" end and matchExCon(E, know as (desc, context), longvid, atpat_opt, cont) = let val knowSucc = (EXCON(longvid, NONE), EXCON'(longvid)::context) fun knowFail longvids = (NOT_EXCON(LongVIdSet.add(longvids, longvid)), context) in case desc of ANY => branch(matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont), fail(E, knowFail LongVIdSet.empty, cont) ) | EXCON(longvid', desc_opt) => if longvid = longvid' then matchArgOpt(E, knowSucc, desc_opt, atpat_opt, cont) else fail(E, know, cont) | NOT_EXCON longvids => if LongVIdSet.member(longvids, longvid) then fail(E, know, cont) else branch(matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont), fail(E, knowFail longvids, cont) ) | _ => raise Fail "CheckPattern.matchSCon: type error" end and matchCon(E, know as (desc, context), vid, span, atpat_opt, cont) = let val knowSucc = (CON(vid, NONE), CON'(vid)::context) fun knowFail vids = (NOT_CON(VIdSet.add(vids, vid)), context) in case desc of ANY => if span = 1 then matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont) else branch(matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont), fail(E, knowFail VIdSet.empty, cont) ) | CON(vid', desc_opt) => if vid = vid' then matchArgOpt(E, knowSucc, desc_opt, atpat_opt, cont) else fail(E, know, cont) | NOT_CON vids => if VIdSet.member(vids, vid) then fail(E, know, cont) else if VIdSet.numItems vids = span - 1 then matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont) else branch(matchArgOpt(E, knowSucc, SOME ANY, atpat_opt, cont), fail(E, knowFail vids, cont) ) | _ => raise Fail "CheckPattern.matchSCon: type error" end and matchArgOpt(E, (desc, context), desc_opt, atpat_opt, cont) = case atpat_opt of NONE => succeed(E, (desc, List.tl context), cont) | SOME atpat => matchAtPat(E, (valOf desc_opt, context), atpat, cont) and succeed(E, know, ([], match_opt)) = success | succeed(E, (desc, context), (patrow_opt::patrow_opts, match_opt)) = let val context' = augment(context, desc) in matchPatRowOpt(E, context', patrow_opt, (patrow_opts, match_opt)) end and fail(E, know, (_, NONE)) = failure | fail(E, (desc, context), (_, SOME match)) = matchMatch(E, build(context, desc), match) (* Checking matches [Section 4.11, item 2] *) fun checkReachableMrule(reachables, Mrule(I, _, _)) = if RegionSet.member(reachables, I) then () else Error.warning(I, "redundant match rule") fun checkReachableMatchOpt(reachables, NONE) = () | checkReachableMatchOpt(reachables, SOME(Match(_, mrule, match_opt))) = ( checkReachableMrule(reachables, mrule) ; checkReachableMatchOpt(reachables, match_opt) ) fun checkMatch(E, match) = let val (reachables, exhaustive) = matchMatch(E, ANY, match) in checkReachableMatchOpt(reachables, SOME match) ; if exhaustive then () else Error.warning(infoMatch match, "match not exhaustive") end (* Checking single patterns [Section 4.11, item 3] *) fun checkPat(E, pat) = let val (_, exhaustive) = matchPat(E, (ANY, []), pat, ([], NONE)) in if exhaustive then () else Error.warning(infoPat pat, "pattern not exhaustive") end end (* stop of CheckPattern.sml *) (* start of ELAB_CORE.sml *) (* * Standard ML core elaboration * * Definition, sections 4.10, 4.11, 4.6, 4.7, 2.9 * * Notes: * - Elaboration also checks the syntactic restrictions [Section 2.9] * and the further restrictions [Section 4.11]. * - To implement the 3rd restriction in 4.11 elabDec is passed an * additional boolean argument to recognise being on the toplevel. *) signature ELAB_CORE = sig (* Import types *) type Dec = GrammarCore.Dec type Ty = GrammarCore.Ty type TyVarseq = GrammarCore.TyVarseq type VId = VId.Id type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type Type = Type.Type type Env = StaticEnv.Env type Context = Context.Context (* Export *) val elabDec: bool * Context * Dec -> Env val elabTy: Context * Ty -> Type val tyvars: TyVarseq -> TyVarSet * TyVar list val validBindVId: VId -> bool val validConBindVId: VId -> bool end (* stop of ELAB_CORE.sml *) (* start of ElabCore.sml *) (* * Standard ML core elaboration * * Definition, sections 4.10, 4.11, 4.6, 4.7, 2.9 * * Notes: * - Elaboration also checks the syntactic restrictions [Section 2.9] * and the further restrictions [Section 4.11]. * - To implement the 3rd restriction in 4.11 some elab functions are * passed an additional boolean argument to recognise being on the toplevel. * - There is a bug in the Definition -- an important syntactic restriction * is missing: * "Any tyvar occuring on the right side of a typbind or datbind of the * form tyvarseq tycon = ... must occur in tyvarseq." * - The definition says that overloaded types get defaulted if the * "surrounding text" does not resolve it. It leaves some freedom to * how large this context may be. We choose the innermost value binding. * - The definition states that "the program context" must determine the * exact type of flexible records, but it does not say how large this * context may be either. Again we choose the innermost surrounding value * binding. * - Most conditions on type names can be ignored since they are * always ensured by the Stamp mechanism. * * Bugs: * - Unresolved overloading is left unnoticed if it never propagates to a * value binding's result environment. To resolve all cases we either had * to annotate all expressions with their types and walk the whole tree * for each value binding's RHS, or extend the inference results with * complicated information on overloaded type variables, or use some dirty * side effect hack. * - The same goes for unresolved flexible record types, for essentially the * same reason. *) structure ElabCore :> ELAB_CORE = struct (* Import *) type Dec = GrammarCore.Dec type Ty = GrammarCore.Ty type TyVarseq = GrammarCore.TyVarseq type VId = VId.Id type TyVar = TyVar.TyVar type TyVarSet = TyVarSet.set type Type = Type.Type type Env = StaticEnv.Env type Context = Context.Context open GrammarCore (* Some helpers for error messages *) val error = Error.error fun errorLab(I, s, lab) = error(I, s ^ Lab.toString lab) fun errorVId(I, s, vid) = error(I, s ^ VId.toString vid) fun errorTyCon(I, s, tycon) = error(I, s ^ TyCon.toString tycon) fun errorTyVar(I, s, tyvar) = error(I, s ^ TyVar.toString tyvar) fun errorLongVId(I, s, longvid) = error(I, s ^ LongVId.toString longvid) fun errorLongTyCon(I, s, longtycon) = error(I, s ^ LongTyCon.toString longtycon) fun errorLongStrId(I, s, longstrid) = error(I, s ^ LongStrId.toString longstrid) (* Helpers for context modification *) val plus = StaticEnv.plus val plusU = Context.plusU val plusVE = Context.plusVE val oplusE = Context.oplusE val oplusTE = Context.oplusTE val oplusVEandTE = Context.oplusVEandTE infix plusU plusVE oplusE oplusTE oplusVEandTE (* Checking restriction for vids in binding [Section 2.9, 5th bullet] *) fun validBindVId vid = vid <> VId.fromString "true" andalso vid <> VId.fromString "false" andalso vid <> VId.fromString "nil" andalso vid <> VId.fromString "::" andalso vid <> VId.fromString "ref" fun validConBindVId vid = validBindVId vid andalso vid <> VId.fromString "it" (* Treating tyvarseqs *) fun tyvars(TyVarseq(I, tyvars)) = let fun collect( [], U) = U | collect(tyvar::tyvars, U) = if TyVarSet.member(U, tyvar) then (* Syntactic restriction [Section 2.9, 3rd bullet] *) errorTyVar(I, "duplicate type variable ", tyvar) else collect(tyvars, TyVarSet.add(U, tyvar)) in ( collect(tyvars, TyVarSet.empty), tyvars ) end (* Typing special constants [Section 4.1, Appendix E.1] *) fun typeSCon(SCon.INT _) = Type.fromOverloadingClass InitialStaticEnv.Int | typeSCon(SCon.WORD _) = Type.fromOverloadingClass InitialStaticEnv.Word | typeSCon(SCon.CHAR _) = Type.fromOverloadingClass InitialStaticEnv.Char | typeSCon(SCon.REAL _) = Type.fromOverloadingClass InitialStaticEnv.Real | typeSCon(SCon.STRING _) = Type.fromOverloadingClass InitialStaticEnv.String (* Calculate sets of unguarded explicit type variables [Section 4.6] *) local val op+ = TyVarSet.union fun ? tyvarsX NONE = TyVarSet.empty | ? tyvarsX (SOME x) = tyvarsX x in fun unguardedTyVarsAtExp(RECORDAtExp(_, exprow_opt)) = ?unguardedTyVarsExpRow exprow_opt | unguardedTyVarsAtExp(LETAtExp(_, dec, exp)) = unguardedTyVarsDec dec + unguardedTyVarsExp exp | unguardedTyVarsAtExp(PARAtExp(_, exp)) = unguardedTyVarsExp exp | unguardedTyVarsAtExp _ = TyVarSet.empty and unguardedTyVarsExpRow(ExpRow(_, lab, exp, exprow_opt)) = unguardedTyVarsExp exp + ?unguardedTyVarsExpRow exprow_opt and unguardedTyVarsExp(ATEXPExp(_, atexp)) = unguardedTyVarsAtExp atexp | unguardedTyVarsExp(APPExp(_, exp, atexp)) = unguardedTyVarsExp exp + unguardedTyVarsAtExp atexp | unguardedTyVarsExp(TYPEDExp(_, exp, ty)) = unguardedTyVarsExp exp + unguardedTyVarsTy ty | unguardedTyVarsExp(HANDLEExp(_, exp, match)) = unguardedTyVarsExp exp + unguardedTyVarsMatch match | unguardedTyVarsExp(RAISEExp(_, exp)) = unguardedTyVarsExp exp | unguardedTyVarsExp(FNExp(_, match)) = unguardedTyVarsMatch match and unguardedTyVarsMatch(Match(_, mrule, match_opt)) = unguardedTyVarsMrule mrule + ?unguardedTyVarsMatch match_opt and unguardedTyVarsMrule(Mrule(_, pat, exp)) = unguardedTyVarsPat pat + unguardedTyVarsExp exp and unguardedTyVarsDec(ABSTYPEDec(_, datbind, dec)) = unguardedTyVarsDec dec | unguardedTyVarsDec(EXCEPTIONDec(_, exbind)) = unguardedTyVarsExBind exbind | unguardedTyVarsDec(LOCALDec(_, dec1, dec2)) = unguardedTyVarsDec dec1 + unguardedTyVarsDec dec2 | unguardedTyVarsDec(SEQDec(_, dec1, dec2)) = unguardedTyVarsDec dec1 + unguardedTyVarsDec dec2 | unguardedTyVarsDec _ = TyVarSet.empty and unguardedTyVarsValBind(PLAINValBind(_, pat, exp, valbind_opt)) = unguardedTyVarsPat pat + unguardedTyVarsExp exp + ?unguardedTyVarsValBind valbind_opt | unguardedTyVarsValBind(RECValBind(_, valbind)) = unguardedTyVarsValBind valbind and unguardedTyVarsExBind(NEWExBind(_, _, vid, ty_opt, exbind_opt)) = ?unguardedTyVarsTy ty_opt + ?unguardedTyVarsExBind exbind_opt | unguardedTyVarsExBind(EQUALExBind(_, _, vid, _, longvid, exbind_opt)) = ?unguardedTyVarsExBind exbind_opt and unguardedTyVarsAtPat(RECORDAtPat(_, patrow_opt)) = ?unguardedTyVarsPatRow patrow_opt | unguardedTyVarsAtPat(PARAtPat(_, pat)) = unguardedTyVarsPat pat | unguardedTyVarsAtPat _ = TyVarSet.empty and unguardedTyVarsPatRow(WILDCARDPatRow(_)) = TyVarSet.empty | unguardedTyVarsPatRow(ROWPatRow(_, lab, pat, patrow_opt)) = unguardedTyVarsPat pat + ?unguardedTyVarsPatRow patrow_opt and unguardedTyVarsPat(ATPATPat(_, atpat)) = unguardedTyVarsAtPat atpat | unguardedTyVarsPat(CONPat(_, _, longvid, atpat)) = unguardedTyVarsAtPat atpat | unguardedTyVarsPat(TYPEDPat(_, pat, ty)) = unguardedTyVarsPat pat + unguardedTyVarsTy ty | unguardedTyVarsPat(ASPat(_, _, vid, ty_opt, pat)) = ?unguardedTyVarsTy ty_opt + unguardedTyVarsPat pat and unguardedTyVarsTy(TYVARTy(_, tyvar)) = TyVarSet.singleton tyvar | unguardedTyVarsTy(RECORDTy(_, tyrow_opt)) = ?unguardedTyVarsTyRow tyrow_opt | unguardedTyVarsTy(TYCONTy(_, tyseq, longtycon)) = unguardedTyVarsTyseq tyseq | unguardedTyVarsTy(ARROWTy(_, ty, ty')) = unguardedTyVarsTy ty + unguardedTyVarsTy ty' | unguardedTyVarsTy(PARTy(_, ty)) = unguardedTyVarsTy ty and unguardedTyVarsTyRow(TyRow(_, lab, ty, tyrow_opt)) = unguardedTyVarsTy ty + ?unguardedTyVarsTyRow tyrow_opt and unguardedTyVarsTyseq(Tyseq(_, tys)) = List.foldl (fn(ty,U) => unguardedTyVarsTy ty + U) TyVarSet.empty tys end (* local *) (* Check whether a pattern binds an identifier *) local fun ? boundByX(NONE, vid) = false | ? boundByX(SOME x, vid) = boundByX(x, vid) in fun boundByAtPat(WILDCARDAtPat(_), vid) = false | boundByAtPat(SCONAtPat(_, scon), vid) = false | boundByAtPat(LONGVIDAtPat(_, _, longvid), vid) = let val (strids,vid') = LongVId.explode longvid in List.null strids andalso vid = vid' end | boundByAtPat(RECORDAtPat(_, patrow_opt), vid) = ?boundByPatRow(patrow_opt, vid) | boundByAtPat(PARAtPat(_, pat), vid) = boundByPat(pat, vid) and boundByPatRow(WILDCARDPatRow(_), vid) = false | boundByPatRow(ROWPatRow(_, lab, pat, patrow_opt), vid) = boundByPat(pat, vid) orelse ?boundByPatRow(patrow_opt, vid) and boundByPat(ATPATPat(_, atpat), vid) = boundByAtPat(atpat, vid) | boundByPat(CONPat(_, _, longvid, atpat), vid) = boundByAtPat(atpat, vid) | boundByPat(TYPEDPat(_, pat, ty), vid) = boundByPat(pat, vid) | boundByPat(ASPat(_, _, vid', ty_opt, pat), vid) = vid = vid' orelse boundByPat(pat, vid) end (* local *) (* Non-expansive expressions [Section 4.7] *) local fun ? isNonExpansiveX C NONE = true | ? isNonExpansiveX C (SOME x) = isNonExpansiveX C x in fun isNonExpansiveAtExp C (SCONAtExp(_, scon)) = true | isNonExpansiveAtExp C (LONGVIDAtExp(_, _, longvid)) = true | isNonExpansiveAtExp C (RECORDAtExp(_, exprow_opt)) = ?isNonExpansiveExpRow C exprow_opt | isNonExpansiveAtExp C (PARAtExp(_, exp)) = isNonExpansiveExp C exp | isNonExpansiveAtExp C _ = false and isNonExpansiveExpRow C (ExpRow(_, lab, exp, exprow_opt)) = isNonExpansiveExp C exp andalso ?isNonExpansiveExpRow C exprow_opt and isNonExpansiveExp C (ATEXPExp(_, atexp)) = isNonExpansiveAtExp C atexp | isNonExpansiveExp C (APPExp(_, exp, atexp)) = isConExp C exp andalso isNonExpansiveAtExp C atexp | isNonExpansiveExp C (TYPEDExp(_, exp, ty)) = isNonExpansiveExp C exp | isNonExpansiveExp C (FNExp(_, match)) = true | isNonExpansiveExp C _ = false and isConAtExp C (PARAtExp(_, exp)) = isConExp C exp | isConAtExp C (LONGVIDAtExp(_, _, longvid)) = LongVId.explode longvid <> ([],VId.fromString "ref") andalso (case Context.findLongVId(C, longvid) of SOME(_,is) => is=IdStatus.c orelse is=IdStatus.e | NONE => false ) | isConAtExp C _ = false and isConExp C (ATEXPExp(_, atexp)) = isConAtExp C atexp | isConExp C (TYPEDExp(_, ATEXPExp(_, atexp), ty)) = isConAtExp C atexp | isConExp C _ = false end (* local *) (* Closure of value environments [Section 4.8] *) fun hasNonExpansiveRHS C (vid, PLAINValBind(I, pat, exp, valbind_opt)) = if boundByPat(pat, vid) then isNonExpansiveExp C exp else hasNonExpansiveRHS C (vid, valOf valbind_opt) | hasNonExpansiveRHS C (vid, RECValBind _) = (* A rec valbind can only contain functions. *) true fun Clos (C,valbind) VE = let val tyvarsC = Context.tyvars C fun alphas(vid, tau) = if hasNonExpansiveRHS C (vid, valbind) then TyVarSet.listItems (TyVarSet.difference(Type.tyvars tau, tyvarsC)) else [] in VIdMap.mapi (fn(vid, ((_,tau),is)) => ((alphas(vid,tau),tau),is)) VE end (* Inference rules [Section 4.10] *) (* Atomic Expressions *) fun elabAtExp(C, SCONAtExp(I, scon)) = (* [Rule 1] *) typeSCon scon | elabAtExp(C, LONGVIDAtExp(I, _, longvid)) = (* [Rule 2] *) let val (sigma,is) = case Context.findLongVId(C, longvid) of SOME valstr => valstr | NONE => errorLongVId(I, "unknown identifier ",longvid) val tau = TypeScheme.instance sigma in tau end | elabAtExp(C, RECORDAtExp(I, exprow_opt)) = (* [Rule 3] *) let val rho = case exprow_opt of NONE => Type.emptyRho | SOME exprow => elabExpRow(C, exprow) in Type.fromRowType rho end | elabAtExp(C, LETAtExp(I, dec, exp)) = (* [Rule 4] *) let val E = elabDec(false, C, dec) val tau = elabExp(C oplusE E, exp) in if TyNameSet.isSubset(Type.tynames tau, Context.Tof C) then tau else error(I, "escaping local type name in let expression") end | elabAtExp(C, PARAtExp(I, exp)) = (* [Rule 5] *) let val tau = elabExp(C, exp) in tau end (* Expression Rows *) and elabExpRow(C, ExpRow(I, lab, exp, exprow_opt)) = (* [Rule 6] *) let val tau = elabExp(C, exp) val rho = case exprow_opt of NONE => Type.emptyRho | SOME exprow => elabExpRow(C, exprow) in if isSome(Type.findLab(rho, lab)) then (* Syntactic restriction [Section 2.9, 1st bullet] *) errorLab(I, "duplicate label ", lab) else Type.insertRho(rho, lab, tau) end (* Expressions *) and elabExp(C, ATEXPExp(I, atexp)) = (* [Rule 7] *) let val tau = elabAtExp(C, atexp) in tau end | elabExp(C, APPExp(I, exp, atexp)) = (* [Rule 8] *) let val tau1 = elabExp(C, exp) val tau' = elabAtExp(C, atexp) val tau = Type.invent() in Type.unify(tau1, Type.fromFunType(tau',tau)) handle Type.Unify => error(I, "type mismatch on application") ; tau end | elabExp(C, TYPEDExp(I, exp, ty)) = (* [Rule 9] *) let val tau1 = elabExp(C, exp) val tau = elabTy(C, ty) in Type.unify(tau1,tau) handle Type.Unify => error(I, "expression does not match annotation") ; tau end | elabExp(C, HANDLEExp(I, exp, match)) = (* [Rule 10] *) let val tau1 = elabExp(C, exp) val tau2 = elabMatch(C, match) in Type.unify(tau1,tau2) handle Type.Unify => error(I, "type mismatch between expression and handler") ; tau1 end | elabExp(C, RAISEExp(I, exp)) = (* [Rule 11] *) let val tau1 = elabExp(C, exp) in Type.unify(tau1, InitialStaticEnv.tauExn) handle Type.Unify => error(I, "raised expression is not an exception") ; Type.invent() end | elabExp(C, FNExp(I, match)) = (* [Rule 12] *) let val tau = elabMatch(C, match) in (* Further restriction [Section 4.11, item 2] *) CheckPattern.checkMatch(Context.Eof C, match) ; tau end (* Matches *) and elabMatch(C, Match(I, mrule, match_opt)) = (* [Rule 13] *) let val tau = elabMrule(C, mrule) in case match_opt of NONE => tau | SOME match => let val tau2 = elabMatch(C, match) in Type.unify(tau, tau2) handle Type.Unify => error(I, "type mismatch between different matches") ; tau end end (* Match rules *) and elabMrule(C, Mrule(I, pat, exp)) = (* [Rule 14] *) let val (VE,tau) = elabPat(C, pat) val tau' = elabExp(C plusVE VE, exp) (* Side condition on type names is always ensured. *) in Type.fromFunType(tau,tau') end (* Declarations *) and elabDec(toplevel, C, VALDec(I, tyvarseq, valbind)) = (* [Rule 15] *) let val U' = #1(tyvars(tyvarseq)) (* Collect implicitly bound tyvars [Section 4.6] *) val U = TyVarSet.union(U', TyVarSet.difference(unguardedTyVarsValBind valbind, Context.Uof C)) val VE = elabValBind(toplevel, C plusU U, valbind) val VE' = Clos(C,valbind) VE val _ = StaticEnv.defaultOverloaded VE' in if not(TyVarSet.isEmpty( TyVarSet.intersection(Context.Uof C, U))) then (* Syntactic restriction [Section 2.9, last bullet] *) error(I, "some type variables shadow previous ones") else if StaticEnv.containsFlexibleType VE' then (* Further restriction [Section 4.11, item 1] *) error(I, "unresolved flexible record type") else if TyVarSet.isEmpty( TyVarSet.intersection(U, StaticEnv.tyvarsVE VE')) then StaticEnv.fromVE VE' else error(I, "some explicit type variables cannot be generalised") end | elabDec(toplevel, C, TYPEDec(I, typbind)) = (* [Rule 16] *) let val TE = elabTypBind(C, typbind) in StaticEnv.fromTE TE end | elabDec(toplevel, C, DATATYPEDec(I, datbind)) = (* [Rule 17] *) let val TE1 = lhsDatBind datbind val (VE2,TE2) = elabDatBind(C oplusTE TE1, datbind) val (TE, VE) = StaticEnv.maximiseEquality(TE2,VE2) (* Side condition on type names is always ensured. *) in StaticEnv.fromVEandTE(VE,TE) end | elabDec(toplevel, C, REPLICATIONDec(I, tycon, longtycon)) = (* [Rule 18] *) let val (theta,VE) = case Context.findLongTyCon(C, longtycon) of SOME tystr => tystr | NONE => errorLongTyCon(I, "unknown type ", longtycon) val TE = TyConMap.singleton(tycon, (theta,VE)) in StaticEnv.fromVEandTE(VE,TE) end | elabDec(toplevel, C, ABSTYPEDec(I, datbind, dec)) = (* [Rule 19] *) let val TE1 = lhsDatBind datbind val (VE2,TE2) = elabDatBind(C oplusTE TE1, datbind) val (TE, VE) = StaticEnv.maximiseEquality(TE2,VE2) val E = elabDec(false, C oplusVEandTE (VE,TE), dec) (* Side condition on type names is always ensured. *) in StaticEnv.Abs(TE,E) end | elabDec(toplevel, C, EXCEPTIONDec(I, exbind)) = (* [Rule 20] *) let val VE = elabExBind(C, exbind) in StaticEnv.fromVE VE end | elabDec(toplevel, C, LOCALDec(I, dec1, dec2)) = (* [Rule 21] *) let val E1 = elabDec(false, C, dec1) val E2 = elabDec(false, C oplusE E1, dec2) in E2 end | elabDec(toplevel, C, OPENDec(I, longstrids)) = (* [Rule 22] *) let val Es = List.map (fn longstrid => case Context.findLongStrId(C, longstrid) of SOME(StaticEnv.Str E) => E | NONE => errorLongStrId(I, "unknown structure ", longstrid)) longstrids in List.foldl StaticEnv.plus StaticEnv.empty Es end | elabDec(toplevel, C, EMPTYDec(I)) = (* [Rule 23] *) StaticEnv.empty | elabDec(toplevel, C, SEQDec(I, dec1, dec2)) = (* [Rule 24] *) let val E1 = elabDec(toplevel, C, dec1) val E2 = elabDec(toplevel, C oplusE E1, dec2) in StaticEnv.plus(E1, E2) end (* Value Bindings *) and elabValBind(toplevel, C, PLAINValBind(I, pat, exp, valbind_opt)) = (* [Rule 25] *) let val (VE,tau1) = elabPat(C, pat) val tau2 = elabExp(C, exp) val VE' = case valbind_opt of NONE => VIdMap.empty | SOME valbind => elabValBind(toplevel, C, valbind) in Type.unify(tau1,tau2) handle Type.Unify => error(I, "type mismatch between pattern and expression") ; if toplevel then () else (* Further restriction [Section 4.11, item 3] *) CheckPattern.checkPat(Context.Eof C, pat) ; VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate variable ", vid)) (VE,VE') end | elabValBind(toplevel, C, RECValBind(I, valbind)) = (* [Rule 26] *) let val VE1 = lhsRecValBind valbind val VE = elabValBind(toplevel, C plusVE VE1, valbind) (* Side condition on type names is always ensured. *) in VE end (* Type Bindings *) and elabTypBind(C, TypBind(I, tyvarseq, tycon, ty, typbind_opt)) = (* [Rule 27] *) let val (U,alphas) = tyvars tyvarseq val tau = elabTy(C, ty) val TE = case typbind_opt of NONE => TyConMap.empty | SOME typbind => elabTypBind(C, typbind) in if not(TyVarSet.isSubset(Type.tyvars tau, U)) then (* Syntactic restriction (missing in the Definition!) *) error(I, "free type variables in type binding") else if isSome(TyConMap.find(TE, tycon)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else TyConMap.insert(TE, tycon, ((alphas,tau),VIdMap.empty)) end (* Datatype Bindings *) and elabDatBind(C, DatBind(I, tyvarseq, tycon, conbind, datbind_opt)) = (* [Rule 28, part 2] *) let val (U,alphas) = tyvars tyvarseq val (alphas,tau) = case Context.findTyCon(C, tycon) of SOME(theta,VE) => theta | NONE => (* lhsDatBind inserted it! *) raise Fail "ElabCore.elabDatBind: \ \tycon not pre-bound" val VE = elabConBind(C,tau, conbind) val(VE',TE') = case datbind_opt of NONE => ( VIdMap.empty, TyConMap.empty ) | SOME datbind => elabDatBind(C, datbind) (* Side condition on t is always true. *) val ClosVE = if TyVarSet.isSubset(StaticEnv.tyvarsVE VE, U) then StaticEnv.Clos VE else (* Syntactic restriction (missing in Definition!)*) error(I, "free type variables in datatype binding") in if isSome(TyConMap.find(TE', tycon)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else ( VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate data cnstructor ", vid)) (ClosVE,VE') , TyConMap.insert(TE', tycon, ((alphas,tau),ClosVE)) ) end (* Constructor Bindings *) and elabConBind(C,tau, ConBind(I, _, vid, ty_opt, conbind_opt)) = (* [Rule 29] *) let val tau1 = case ty_opt of NONE => tau | SOME ty => let val tau' = elabTy(C, ty) in Type.fromFunType(tau',tau) end val VE = case conbind_opt of NONE => VIdMap.empty | SOME conbind => elabConBind(C,tau, conbind) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate data constructor ", vid) else if not(validConBindVId vid) then (* Syntactic restriction [Section 2.9, 5th bullet] *) errorVId(I, "illegal rebinding of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau1),IdStatus.c)) end (* Exception Bindings *) and elabExBind(C, NEWExBind(I, _, vid, ty_opt, exbind_opt)) = (* [Rule 30] *) let val tau1 = case ty_opt of NONE => InitialStaticEnv.tauExn | SOME ty => let val tau = elabTy(C, ty) in Type.fromFunType(tau, InitialStaticEnv.tauExn) end val VE = case exbind_opt of NONE => VIdMap.empty | SOME exbind => elabExBind(C, exbind) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate exception constructor ", vid) else if not(validConBindVId vid) then (* Syntactic restriction [Section 2.9, 5th bullet] *) errorVId(I, "illegal rebinding of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau1),IdStatus.e)) end | elabExBind(C, EQUALExBind(I, _, vid, _, longvid, exbind_opt)) = (* [Rule 31] *) let val tau = case Context.findLongVId(C, longvid) of SOME(([],tau),IdStatus.e) => tau | SOME _ => errorLongVId(I, "non-exception identifier ", longvid) | NONE => errorLongVId(I, "unknown identifier ", longvid) val VE = case exbind_opt of NONE => VIdMap.empty | SOME exbind => elabExBind(C, exbind) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate exception constructor ", vid) else VIdMap.insert(VE, vid, (([],tau),IdStatus.e)) end (* Atomic Patterns *) and elabAtPat(C, WILDCARDAtPat(I)) = (* [Rule 32] *) ( VIdMap.empty, Type.invent() ) | elabAtPat(C, SCONAtPat(I, scon)) = (* [Rule 33] *) (case scon of SCon.REAL _ => (* Syntactic restriction [Section 2.9, 6th bullet] *) error(I, "real constant in pattern") | _ => ( VIdMap.empty, typeSCon scon ) ) | elabAtPat(C, LONGVIDAtPat(I, _, longvid)) = (* [Rule 34 and 35] *) let val (strids,vid) = LongVId.explode longvid in if List.null strids andalso ( case Context.findVId(C, vid) of NONE => true | SOME(sigma,is) => is = IdStatus.v ) then (* [Rule 34] *) let val tau = Type.invent() in ( VIdMap.singleton(vid, (([],tau),IdStatus.v)) , tau ) end else (* [Rule 35] *) let val (sigma,is) = case Context.findLongVId(C, longvid) of SOME valstr => valstr | NONE => errorLongVId(I,"unknown constructor ", longvid) val tau = TypeScheme.instance sigma (* Note that tau will always be a ConsType. *) in if is <> IdStatus.v then ( VIdMap.empty, tau ) else error(I, "non-constructor long identifier in pattern") end end | elabAtPat(C, RECORDAtPat(I, patrow_opt)) = (* [Rule 36] *) let val (VE,rho) = case patrow_opt of NONE => ( VIdMap.empty, Type.emptyRho ) | SOME patrow => elabPatRow(C, patrow) in (VE, Type.fromRowType rho) end | elabAtPat(C, PARAtPat(I, pat)) = (* [Rule 37] *) let val (VE,tau) = elabPat(C, pat) in (VE,tau) end (* Pattern Rows *) and elabPatRow(C, WILDCARDPatRow(I)) = (* [Rule 38] *) ( VIdMap.empty, Type.inventRho() ) | elabPatRow(C, ROWPatRow(I, lab, pat, patrow_opt)) = (* [Rule 39] *) let val (VE,tau) = elabPat(C, pat) val (VE',rho) = case patrow_opt of NONE => ( VIdMap.empty, Type.emptyRho ) | SOME patrow => elabPatRow(C, patrow) in if isSome(Type.findLab(rho, lab)) then (* Syntactic restriction [Section 2.9, 1st bullet] *) errorLab(I, "duplicate label ", lab) else ( VIdMap.unionWithi (fn(vid,_,_) => errorVId(I, "duplicate variable ", vid)) (VE,VE') , Type.insertRho(rho, lab, tau) ) end (* Patterns *) and elabPat(C, ATPATPat(I, atpat)) = (* [Rule 40] *) let val (VE,tau) = elabAtPat(C, atpat) in (VE,tau) end | elabPat(C, CONPat(I, _, longvid, atpat)) = (* [Rule 41] *) let val (sigma,is) = case Context.findLongVId(C, longvid) of SOME valstr => valstr | NONE => errorLongVId(I, "unknown constructor ", longvid) val _ = if is <> IdStatus.v then () else errorLongVId(I, "non-constructor ", longvid) val (tau',tau) = case !(TypeScheme.instance sigma) of Type.FunType(tau',tau) => (tau', tau) | _ => errorLongVId(I,"misplaced nullary constructor ", longvid) val (VE,tau'2) = elabAtPat(C, atpat) in Type.unify(tau',tau'2) handle Type.Unify => error(I, "type mismatch in constructor pattern") ; (VE,tau) end | elabPat(C, TYPEDPat(I, pat, ty)) = (* [Rule 42] *) let val (VE,tau1) = elabPat(C, pat) val tau = elabTy(C, ty) in Type.unify(tau1,tau) handle Type.Unify => error(I, "pattern does not match annotation") ; (VE,tau) end | elabPat(C, ASPat(I, _, vid, ty_opt, pat)) = (* [Rule 43] *) let val (VE1,tau1) = elabPat(C, pat) val (VE, tau) = case ty_opt of NONE => (VE1,tau1) | SOME ty => let val tau = elabTy(C, ty) in Type.unify(tau1,tau) handle Type.Unify => error(I, "pattern does not match annotation") ; (VE1,tau) end in if not( case Context.findVId(C, vid) of NONE => true | SOME(sigma,is) => is = IdStatus.v ) then errorVId(I, "misplaced constructor ", vid) else if isSome(VIdMap.find(VE, vid)) then errorVId(I, "duplicate variable ", vid) else ( VIdMap.insert(VE, vid, (([],tau),IdStatus.v)), tau ) end (* Type Expressions *) and elabTy(C, ty) = Type.normalise(elabTy'(C, ty)) and elabTy'(C, TYVARTy(I, tyvar)) = (* [Rule 44] *) let val alpha = tyvar in Type.fromTyVar alpha end | elabTy'(C, RECORDTy(I, tyrow_opt)) = (* [Rule 45] *) let val rho = case tyrow_opt of NONE => Type.emptyRho | SOME tyrow => elabTyRow'(C, tyrow) in Type.fromRowType rho end | elabTy'(C, TYCONTy(I, tyseq, longtycon)) = (* [Rule 46] *) let val Tyseq(I',tys) = tyseq val k = List.length tys val taus = List.map (fn ty => elabTy'(C, ty)) tys val (theta,VE) = case Context.findLongTyCon(C, longtycon) of SOME tystr => tystr | NONE => errorLongTyCon(I, "unknown type constructor ", longtycon) in TypeFcn.apply(taus, theta) handle TypeFcn.Apply => errorLongTyCon(I, "arity mismatch at type application ", longtycon) end | elabTy'(C, ARROWTy(I, ty, ty')) = (* [Rule 47] *) let val tau = elabTy'(C, ty) val tau' = elabTy'(C, ty') in Type.fromFunType(tau,tau') end | elabTy'(C, PARTy(I, ty)) = (* [Rule 48] *) let val tau = elabTy'(C, ty) in tau end (* Type-expression Rows *) and elabTyRow'(C, TyRow(I, lab, ty, tyrow_opt)) = (* [Rule 49] *) let val tau = elabTy'(C, ty) val rho = case tyrow_opt of NONE => Type.emptyRho | SOME tyrow => elabTyRow'(C, tyrow) in if isSome(Type.findLab(rho, lab)) then (* Syntactic restriction [Section 2.9, 1st bullet] *) errorLab(I, "duplicate label ", lab) else Type.insertRho(rho, lab, tau) end (* Build tentative VE from LHSs of recursive valbind *) and lhsRecValBind(PLAINValBind(I, pat, exp, valbind_opt)) = let val VE = lhsRecValBindPat pat val VE' = case valbind_opt of NONE => VIdMap.empty | SOME valbind => lhsRecValBind valbind val _ = case exp of FNExp _ => () | _ => (* Syntactic restriction [Section 2.9, 4th bullet] *) error(I, "illegal expression within recursive \ \value binding") in VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate variable ", vid)) (VE,VE') end | lhsRecValBind(RECValBind(I, valbind)) = lhsRecValBind valbind and lhsRecValBindPat(ATPATPat(I, atpat)) = lhsRecValBindAtPat atpat | lhsRecValBindPat(CONPat(I, _, longvid, atpat)) = lhsRecValBindAtPat atpat | lhsRecValBindPat(TYPEDPat(I, pat, ty)) = lhsRecValBindPat pat | lhsRecValBindPat(ASPat(I, _, vid, ty_opt, pat)) = let val VE = lhsRecValBindPat pat in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate variable ", vid) else if not(validBindVId vid) then (* Syntactic restriction [Section 2.9, 5th bullet] *) errorVId(I, "illegal rebinding of identifier ", vid) else VIdMap.insert(VE, vid, (([],Type.invent()), IdStatus.v)) end and lhsRecValBindAtPat(WILDCARDAtPat(I)) = VIdMap.empty | lhsRecValBindAtPat(SCONAtPat(I, scon)) = VIdMap.empty | lhsRecValBindAtPat(LONGVIDAtPat(I, _, longvid)) = (case LongVId.explode longvid of ([], vid) => if not(validBindVId vid) then (* Syntactic restriction [Section 2.9, 5th bullet] *) errorVId(I, "illegal rebinding of identifier ", vid) else VIdMap.singleton(vid, (([],Type.invent()),IdStatus.v)) | _ => VIdMap.empty ) | lhsRecValBindAtPat(RECORDAtPat(I, patrow_opt)) = (case patrow_opt of NONE => VIdMap.empty | SOME patrow => lhsRecValBindPatRow patrow ) | lhsRecValBindAtPat(PARAtPat(I, pat)) = lhsRecValBindPat pat and lhsRecValBindPatRow(WILDCARDPatRow(I)) = VIdMap.empty | lhsRecValBindPatRow(ROWPatRow(I, lab, pat, patrow_opt)) = let val VE = lhsRecValBindPat pat in case patrow_opt of NONE => VE | SOME patrow => let val VE' = lhsRecValBindPatRow patrow in VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorVId(I, "duplicate variable ", vid)) (VE,VE') end end (* Build tentative TE from LHSs of datbind *) and lhsDatBind(DatBind(I, tyvarseq, tycon, conbind, datbind_opt)) = (* [Rule 28, part 1] *) let val (U,alphas) = tyvars tyvarseq val k = List.length alphas val span = lhsConBind conbind val t = TyName.tyname(tycon, k, TyName.EQ, span) val tau = Type.fromConsType(List.map Type.fromTyVar alphas,t) val TE' = case datbind_opt of NONE => TyConMap.empty | SOME datbind => lhsDatBind datbind in if isSome(TyConMap.find(TE', tycon)) then (* Syntactic restriction [Section 2.9, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else TyConMap.insert(TE', tycon, ((alphas,tau), VIdMap.empty)) end and lhsConBind(ConBind(I, _, vid, ty_opt, conbind_opt)) = case conbind_opt of NONE => 1 | SOME conbind => 1 + lhsConBind conbind end (* stop of ElabCore.sml *) (* start of ELAB_MODULE.sml *) (* * Standard ML modules elaboration * * Definition, sections 5.7 and 3.5 * * Note: * Elaboration also checks the syntactic restrictions [Section 3.5]. *) signature ELAB_MODULE = sig (* Import types *) type TopDec = GrammarModule.TopDec type Basis = StaticBasis.Basis (* Export *) val elabTopDec: Basis * TopDec -> Basis end (* stop of ELAB_MODULE.sml *) (* start of ElabModule.sml *) (* * Standard ML modules elaboration * * Definition, sections 5.7 and 3.5 * * Notes: * - Elaboration also checks the syntactic restrictions [Section 3.5]. * - To implement the 3rd restriction in 4.11 some elab functions are * passed an additional boolean argument to recognise being on the toplevel. *) structure ElabModule :> ELAB_MODULE = struct (* Import *) type TopDec = GrammarModule.TopDec type Basis = StaticBasis.Basis open GrammarModule (* Helpers for error messages *) val error = Error.error fun errorVId (I, s, vid) = error(I, s ^ VId.toString vid) fun errorTyCon(I, s, tycon) = error(I, s ^ TyCon.toString tycon) fun errorStrId(I, s, strid) = error(I, s ^ StrId.toString strid) fun errorSigId(I, s, sigid) = error(I, s ^ SigId.toString sigid) fun errorFunId(I, s, funid) = error(I, s ^ FunId.toString funid) fun errorLongTyCon(I, s, longtycon) = error(I, s ^ LongTyCon.toString longtycon) fun errorLongStrId(I, s, longstrid) = error(I, s ^ LongStrId.toString longstrid) (* Helpers for basis modification *) val plus = StaticBasis.plus val plusT = StaticBasis.plusT val oplusSE = StaticBasis.oplusSE val oplusG = StaticBasis.oplusG val oplusF = StaticBasis.oplusF val oplusE = StaticBasis.oplusE infix plus plusT oplusG oplusF oplusE oplusSE (* Inference rules [Section 5.7] *) (* Structure Expressions *) fun elabStrExp(B, STRUCTStrExp(I, strdec)) = (* [Rule 50] *) let val E = elabStrDec(false, B, strdec) in E end | elabStrExp(B, LONGSTRIDStrExp(I, longstrid)) = (* [Rule 51] *) let val E = case StaticBasis.findLongStrId(B, longstrid) of SOME(StaticEnv.Str E) => E | NONE => errorLongStrId(I, "unknown structure ", longstrid) in E end | elabStrExp(B, TRANSStrExp(I, strexp, sigexp)) = (* [Rule 52] *) let val E = elabStrExp(B, strexp) val Sigma = elabSigExp(B, sigexp) val (E',_) = Sig.match(E, Sigma) handle Sig.Match => error(I, "structure does not match constraint") in E' end | elabStrExp(B, OPAQStrExp(I, strexp, sigexp)) = (* [Rule 53] *) let val E = elabStrExp(B, strexp) val (T',E') = Sig.rename(elabSigExp(B, sigexp)) val (E'',_) = Sig.match(E, (T',E')) handle Sig.Match => error(I, "structure does not match constraint") (* Renaming ensures side condition on T' *) in E' end | elabStrExp(B, APPStrExp(I, funid, strexp)) = (* [Rule 54] *) let val E = elabStrExp(B, strexp) val (T1'',(E1'',(T1',E1'))) = case StaticBasis.findFunId(B, funid) of SOME Phi => Phi | NONE => errorFunId(I, "unknown functor ", funid) val (E'',phi) = Sig.match(E, (T1'',E1'')) handle Sig.Match => error(I, "structure does not match constraint") val (T',E') = Sig.rename (T1', StaticEnv.realise phi E1') (* Renaming ensures side condition on T' *) in E' end | elabStrExp(B, LETStrExp(I, strdec, strexp)) = (* [Rule 55] *) let val E1 = elabStrDec(false, B, strdec) val E2 = elabStrExp(B oplusE E1, strexp) in E2 end (* Structure-level Declarations *) and elabStrDec(toplevel, B, DECStrDec(I, dec)) = (* [Rule 56] *) let val E = ElabCore.elabDec(toplevel, StaticBasis.Cof B, dec) in E end | elabStrDec(toplevel, B, STRUCTUREStrDec(I, strbind)) = (* [Rule 57] *) let val SE = elabStrBind(B, strbind) in StaticEnv.fromSE SE end | elabStrDec(toplevel, B, LOCALStrDec(I, strdec1, strdec2)) = (* [Rule 58] *) let val E1 = elabStrDec(false, B, strdec1) val E2 = elabStrDec(false, B oplusE E1, strdec2) in E2 end | elabStrDec(toplevel, B, EMPTYStrDec(I)) = (* [Rule 59] *) StaticEnv.empty | elabStrDec(toplevel, B, SEQStrDec(I, strdec1, strdec2)) = (* [Rule 60] *) let val E1 = elabStrDec(toplevel, B, strdec1) val E2 = elabStrDec(toplevel, B oplusE E1, strdec2) in StaticEnv.plus(E1,E2) end (* Structure Bindings *) and elabStrBind(B, StrBind(I, strid, strexp, strbind_opt)) = (* [Rule 61] *) let val E = elabStrExp(B, strexp) val SE = case strbind_opt of NONE => StrIdMap.empty | SOME strbind => elabStrBind(B plusT StaticEnv.tynames E, strbind) in if isSome(StrIdMap.find(SE, strid)) then (* Syntactic restriction [Section 3.5, 1st bullet] *) errorStrId(I, "duplicate structure identifier ", strid) else StrIdMap.insert(SE, strid, StaticEnv.Str E) end (* Signature Expressions *) and elabSigExpE(B, SIGSigExp(I, spec)) = (* [Rule 62] *) let val E = elabSpec(B, spec) in E end | elabSigExpE(B, SIGIDSigExp(I, sigid)) = (* [Rule 63] *) let val (T,E) = case StaticBasis.findSigId(B, sigid) of SOME Sigma => Sig.rename Sigma | NONE => errorSigId(I, "unknown signature ",sigid) in E end | elabSigExpE(B, WHERETYPESigExp(I, sigexp, tyvarseq, longtycon, ty)) = (* [Rule 64] *) let val E = elabSigExpE(B, sigexp) val alphas = #2(ElabCore.tyvars tyvarseq) val tau = ElabCore.elabTy(StaticBasis.Cof B, ty) val t = case StaticEnv.findLongTyCon(E,longtycon) of NONE => errorLongTyCon(I, "unknown type ", longtycon) | SOME(theta,VE) => case TypeFcn.toTyName theta of NONE => errorLongTyCon(I, "non-flexible type ", longtycon) | SOME t => t val _ = if not(TyNameSet.member(StaticBasis.Tof B, t)) then () else errorLongTyCon(I, "rigid type ", longtycon) val phi = TyNameMap.singleton(t, (alphas,tau)) val _ = if TyName.equality t = TyName.NOEQ orelse TypeFcn.admitsEquality (alphas,tau) then () else error(I, "type realisation does not respect equality") val E' = StaticEnv.realise phi E val _ = if StaticEnv.isWellFormed E' then () else error(I, "type realisation does not respect datatype") in E' end and elabSigExp(B, sigexp) = (* [Rule 65] *) let val E = elabSigExpE(B, sigexp) val T = TyNameSet.difference(StaticEnv.tynames E, StaticBasis.Tof B) in (T,E) end (* Signature Declarations *) and elabSigDec(B, SigDec(I, sigbind)) = (* [Rule 66] *) let val G = elabSigBind(B, sigbind) in G end (* Signature Bindings *) and elabSigBind(B, SigBind(I, sigid, sigexp, sigbind_opt)) = (* [Rule 67] *) let val Sigma = elabSigExp(B, sigexp) val G = case sigbind_opt of NONE => SigIdMap.empty | SOME sigbind => elabSigBind(B, sigbind) in if isSome(SigIdMap.find(G, sigid)) then (* Syntactic restriction [Section 3.5, 1st bullet] *) errorSigId(I, "duplicate signature identifier ", sigid) else SigIdMap.insert(G, sigid, Sigma) end (* Specifications *) and elabSpec(B, VALSpec(I, valdesc)) = (* [Rule 68] *) let val VE = elabValDesc(StaticBasis.Cof B, valdesc) in StaticEnv.fromVE(StaticEnv.Clos VE) end | elabSpec(B, TYPESpec(I, typdesc)) = (* [Rule 69] *) let val TE = elabTypDesc(StaticBasis.Cof B, typdesc) (* Side condition on type names is always ensured. *) in StaticEnv.fromTE TE end | elabSpec(B, EQTYPESpec(I, typdesc)) = (* [Rule 70] *) let val TE = elabTypDesc(StaticBasis.Cof B, typdesc) val _ = StaticEnv.makeEquality TE in StaticEnv.fromTE TE end | elabSpec(B, DATATYPESpec(I, datdesc)) = (* [Rule 71] *) let val TE1 = lhsDatDesc datdesc val (VE2,TE2) = elabDatDesc(Context.oplusTE(StaticBasis.Cof B,TE1), datdesc) val (TE, VE) = StaticEnv.maximiseEquality(TE2,VE2) (* Side condition on type names is always ensured. *) in StaticEnv.fromVEandTE(VE,TE) end | elabSpec(B, REPLICATIONSpec(I, tycon, longtycon)) = (* [Rule 72] *) let val (theta,VE) = case StaticBasis.findLongTyCon(B, longtycon) of SOME tystr => tystr | NONE => errorLongTyCon(I, "unknown type ", longtycon) val TE = TyConMap.singleton(tycon, (theta,VE)) in StaticEnv.fromVEandTE(VE,TE) end | elabSpec(B, EXCEPTIONSpec(I, exdesc)) = (* [Rule 73] *) let val VE = elabExDesc(StaticBasis.Cof B, exdesc) in StaticEnv.fromVE VE end | elabSpec(B, STRUCTURESpec(I, strdesc)) = (* [Rule 74] *) let val SE = elabStrDesc(B, strdesc) in StaticEnv.fromSE SE end | elabSpec(B, INCLUDESpec(I, sigexp)) = (* [Rule 75] *) let val E = elabSigExpE(B, sigexp) in E end | elabSpec(B, EMPTYSpec(I)) = (* [Rule 76] *) StaticEnv.empty | elabSpec(B, SEQSpec(I, spec1, spec2)) = (* [Rule 77] *) let val E1 = elabSpec(B, spec1) val E2 = elabSpec(B oplusE E1, spec2) val _ = if StaticEnv.disjoint(E1,E2) then () else error(I, "duplicate specifications in signature") in StaticEnv.plus(E1,E2) end | elabSpec(B, SHARINGTYPESpec(I, spec, longtycons)) = (* [Rule 78] *) let val E = elabSpec(B, spec) val ts = List.map (fn longtycon => case StaticEnv.findLongTyCon(E, longtycon) of NONE => errorLongTyCon(I, "unknown type ", longtycon) | SOME(theta,VE) => case TypeFcn.toTyName theta of NONE => errorLongTyCon(I, "non-flexible type ", longtycon) | SOME t => if TyNameSet.member(StaticBasis.Tof B, t) then errorLongTyCon(I, "rigid type ", longtycon) else t ) longtycons val equality = if List.exists (fn t => TyName.equality t <> TyName.NOEQ) ts then TyName.EQ else TyName.NOEQ val span = List.foldl (fn(t, span) => Int.max(TyName.span t, span)) 0 ts val t1 = List.hd ts val t = TyName.tyname(TyName.tycon t1, TyName.arity t1, equality, span) val theta = TypeFcn.fromTyName t val phi = List.foldl (fn(ti, phi) => TyNameMap.insert(phi, ti, theta)) TyNameMap.empty ts in StaticEnv.realise phi E end | elabSpec(B, SHARINGSpec(I, spec, longstrids)) = (* [Appendix A] *) let fun shareFlexibleTyName(t1, t2, phi) = let val equality = if TyName.equality t1 <> TyName.NOEQ orelse TyName.equality t2 <> TyName.NOEQ then TyName.EQ else TyName.NOEQ val t = TyName.tyname(TyName.tycon t1, TyName.arity t1, equality, Int.max(TyName.span t1, TyName.span t2)) val theta = TypeFcn.fromTyName t in TyNameMap.insert(TyNameMap.insert(phi, t1, theta), t2, theta) end fun shareTE(TE1, TE2, phi) = TyConMap.foldli (fn(tycon, (theta1,VE1), phi) => case TyConMap.find(TE2, tycon) of NONE => phi | SOME(theta2,VE2) => case (TypeFcn.toTyName(TypeFcn.realise phi theta1), TypeFcn.toTyName(TypeFcn.realise phi theta2)) of (SOME t1, SOME t2) => if TyNameSet.member(StaticBasis.Tof B, t1) orelse TyNameSet.member(StaticBasis.Tof B,t2) then errorTyCon(I, "structure contains rigid type ", tycon) else shareFlexibleTyName(t1, t2, phi) | _ => errorTyCon(I, "structure contains non-flexible \ \type ", tycon) ) phi TE1 fun shareSE(SE1, SE2, phi) = StrIdMap.foldli (fn(strid, StaticEnv.Str E1, phi) => case StrIdMap.find(SE2, strid) of NONE => phi | SOME(StaticEnv.Str E2) => shareE(E1, E2, phi) ) phi SE1 and shareE((SE1,TE1,VE1), (SE2,TE2,VE2), phi) = let val phi' = shareTE(TE1, TE2, phi) val phi'' = shareSE(SE1, SE2, phi') in phi'' end fun share1(E1, [], phi) = phi | share1(E1, E2::Es, phi) = let val phi' = shareE(E1, E2, phi) in share1(E1, Es, phi') end fun shareAll( [], phi) = phi | shareAll(E::Es, phi) = let val phi' = share1(E, Es, phi) in shareAll(Es, phi') end val E = elabSpec(B, spec) val Es = List.map (fn longstrid => case StaticEnv.findLongStrId(E, longstrid) of SOME(StaticEnv.Str E') => E' | NONE => errorLongStrId(I, "unknown structure ", longstrid) ) longstrids val phi = shareAll(Es, TyNameMap.empty) in StaticEnv.realise phi E end (* Value Descriptions *) and elabValDesc(C, ValDesc(I, vid, ty, valdesc_opt)) = (* [Rule 79] *) let val tau = ElabCore.elabTy(C, ty) val VE = case valdesc_opt of NONE => VIdMap.empty | SOME valdesc => elabValDesc(C, valdesc) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorVId(I, "duplicate variable ", vid) else if not(ElabCore.validBindVId vid) then (* Syntactic restriction [Section 3.5, 5th bullet] *) errorVId(I, "illegal specification of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau),IdStatus.v)) end (* Type Descriptions *) and elabTypDesc(C, TypDesc(I, tyvarseq, tycon, typdesc_opt)) = (* [Rule 80] *) let val alphas = #2(ElabCore.tyvars tyvarseq) val k = List.length alphas val t = TyName.tyname(tycon, k, TyName.NOEQ, 0) val TE = case typdesc_opt of NONE => TyConMap.empty | SOME typdesc => elabTypDesc(C, typdesc) (* Side condition on t is always true. *) val tau = Type.fromConsType (List.map Type.fromTyVar alphas, t) in if isSome(TyConMap.find(TE, tycon)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else TyConMap.insert(TE, tycon, ((alphas,tau),VIdMap.empty)) end (* Datatype Descriptions *) and elabDatDesc(C, DatDesc(I, tyvarseq, tycon, condesc, datdesc_opt)) = (* [Rule 81, part 2] *) let val (U,alphas) = ElabCore.tyvars tyvarseq val (alphas,tau) = case Context.findTyCon(C, tycon) of SOME(theta,VE) => theta | NONE => (* lhsDatDesc inserted it! *) raise Fail "ElabCore.elabDatDesc: \ \tycon not pre-bound" val VE = elabConDesc(C,tau, condesc) val(VE',TE') = case datdesc_opt of NONE => ( VIdMap.empty, TyConMap.empty ) | SOME datdesc => elabDatDesc(C, datdesc) (* Side condition on t is always true. *) val ClosVE = if TyVarSet.isSubset(StaticEnv.tyvarsVE VE, U) then StaticEnv.Clos VE else (* Syntactic restriction [Section 3.5,4th bullet]*) error(I, "free type variables \ \in datatype description") in if isSome(TyConMap.find(TE', tycon)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else ( VIdMap.unionWithi (fn(vid,_,_) => (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorVId(I, "duplicate data cnstructor ", vid)) (ClosVE,VE') , TyConMap.insert(TE', tycon, ((alphas,tau),ClosVE)) ) end (* Constructor Descriptions *) and elabConDesc(C,tau, ConDesc(I, vid, ty_opt, condesc_opt)) = (* [Rule 82] *) let val tau1 = case ty_opt of NONE => tau | SOME ty => let val tau' = ElabCore.elabTy(C, ty) in Type.fromFunType(tau',tau) end val VE = case condesc_opt of NONE => VIdMap.empty | SOME condesc => elabConDesc(C,tau, condesc) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorVId(I, "duplicate data constructor ", vid) else if not(ElabCore.validConBindVId vid) then (* Syntactic restriction [Section 3.5, 5th bullet] *) errorVId(I, "illegal specifiation of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau1),IdStatus.c)) end (* Exception Description *) and elabExDesc(C, ExDesc(I, vid, ty_opt, exdesc_opt)) = (* [Rule 83] *) let val tau1 = case ty_opt of NONE => InitialStaticEnv.tauExn | SOME ty => let val tau = ElabCore.elabTy(C, ty) val _ = if TyVarSet.isEmpty(Type.tyvars tau) then () else error(I, "free type variables \ \in exception description") in Type.fromFunType(tau, InitialStaticEnv.tauExn) end val VE = case exdesc_opt of NONE => VIdMap.empty | SOME exdesc => elabExDesc(C, exdesc) in if isSome(VIdMap.find(VE, vid)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorVId(I, "duplicate exception constructor ", vid) else if not(ElabCore.validConBindVId vid) then (* Syntactic restriction [Section 3.5, 5th bullet] *) errorVId(I, "illegal specification of identifier ", vid) else VIdMap.insert(VE, vid, (([],tau1),IdStatus.e)) end (* Structure Descriptions *) and elabStrDesc(B, StrDesc(I, strid, sigexp, strdesc_opt)) = (* [Rule 84] *) let val E = elabSigExpE(B, sigexp) val SE = case strdesc_opt of NONE => StrIdMap.empty | SOME strdesc => elabStrDesc(B plusT StaticEnv.tynames E, strdesc) in if isSome(StrIdMap.find(SE, strid)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorStrId(I, "duplicate structure identifier ", strid) else StrIdMap.insert(SE, strid, StaticEnv.Str E) end (* Functor Declarations *) and elabFunDec(B, FunDec(I, funbind)) = (* [Rule 85] *) let val F = elabFunBind(B, funbind) in F end (* Functor Bindings *) and elabFunBind(B, FunBind(I, funid, strid, sigexp, strexp, funbind_opt)) = (* [Rule 86] *) let val (T,E) = elabSigExp(B, sigexp) val E' = elabStrExp( B oplusSE StrIdMap.singleton(strid,StaticEnv.Str E), strexp) (* Side condition on T is always ensured. *) val T' = TyNameSet.difference(StaticEnv.tynames E', TyNameSet.union(StaticBasis.Tof B, T)) val F = case funbind_opt of NONE => FunIdMap.empty | SOME funbind => elabFunBind(B, funbind) in if isSome(FunIdMap.find(F, funid)) then (* Syntactic restriction [Section 3.5, 1st bullet] *) errorFunId(I, "duplicate functor identifier ", funid) else FunIdMap.insert(F, funid, (T,(E,(T',E')))) end (* Top-level Declarations *) and elabTopDec(B, STRDECTopDec(I, strdec, topdec_opt)) = (* [Rule 87] *) let val E = elabStrDec(true, B, strdec) val B' = case topdec_opt of NONE => StaticBasis.empty | SOME topdec => elabTopDec(B oplusE E, topdec) val B'' = StaticBasis.plus (StaticBasis.fromTandE(StaticEnv.tynames E, E), B') in if TyVarSet.isEmpty(StaticBasis.tyvars B'') then B'' else error(I, "free type variables on top-level") end | elabTopDec(B, SIGDECTopDec(I, sigdec, topdec_opt)) = (* [Rule 88] *) let val G = elabSigDec(B, sigdec) val B' = case topdec_opt of NONE => StaticBasis.empty | SOME topdec => elabTopDec(B oplusG G, topdec) val B'' = StaticBasis.plus (StaticBasis.fromTandG(StaticBasis.tynamesG G, G), B') in B'' end | elabTopDec(B, FUNDECTopDec(I, fundec, topdec_opt)) = (* [Rule 89] *) let val F = elabFunDec(B, fundec) val B' = case topdec_opt of NONE => StaticBasis.empty | SOME topdec => elabTopDec(B oplusF F, topdec) val B'' = StaticBasis.plus (StaticBasis.fromTandF(StaticBasis.tynamesF F, F), B') in if TyVarSet.isEmpty(StaticBasis.tyvars B'') then B'' else error(I, "free type variables on top-level") end (* Build tentative TE from LHSs of datdesc *) and lhsDatDesc(DatDesc(I, tyvarseq, tycon, condesc, datdesc_opt)) = (* [Rule 81, part 1] *) let val (U,alphas) = ElabCore.tyvars tyvarseq val k = List.length alphas val span = lhsConDesc condesc val t = TyName.tyname(tycon, k, TyName.EQ, span) val tau = Type.fromConsType(List.map Type.fromTyVar alphas,t) val TE' = case datdesc_opt of NONE => TyConMap.empty | SOME datdesc => lhsDatDesc datdesc in if isSome(TyConMap.find(TE', tycon)) then (* Syntactic restriction [Section 3.5, 2nd bullet] *) errorTyCon(I, "duplicate type constructor ", tycon) else TyConMap.insert(TE', tycon, ((alphas,tau), VIdMap.empty)) end and lhsConDesc(ConDesc(I, vid, ty_opt, condesc_opt)) = case condesc_opt of NONE => 1 | SOME condesc => 1 + lhsConDesc condesc end (* stop of ElabModule.sml *) (* start of PP_TYPE.sml *) (* * Standard ML pretty printing of types and type schemes *) signature PP_TYPE = sig type doc = PrettyPrint.doc type Type = Type.Type type TypeScheme = TypeScheme.TypeScheme val ppType: Type -> doc val ppTypeScheme: TypeScheme -> doc end (* stop of PP_TYPE.sml *) (* start of PPType.sml *) (* * Standard ML pretty printing of types and type schemes *) structure PPType :> PP_TYPE = struct (* Import *) type TypeScheme = TypeScheme.TypeScheme open Type open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppLab lab = text(Lab.toString lab) fun ppTyVar alpha = text(TyVar.toString alpha) fun ppTyName t = text(TyName.toString t) fun ppOverloadingClass O = let val T = OverloadingClass.set O val t = OverloadingClass.default O val ts = t :: TyNameSet.listItems(TyNameSet.delete(T,t)) in brack(ppCommaList ppTyName ts) end fun ppRowVar CLOSEDRow = empty | ppRowVar(FLEXRow _) = text "," ^^ break ^^ text "..." (* Types *) (* Precedence: * 0 : function arrow (ty1 -> ty2) * 1 : tuple (ty1 * ... * tyn) * 2 : constructed type (tyseq tycon) *) fun ppType tau = fbox(below(nest(ppTypePrec 0 tau))) and ppTypePrec p (ref tau') = ppType'Prec p tau' and ppType'Prec p (TyVar(alpha)) = ppTyVar alpha | ppType'Prec p (RowType(Rho,r)) = let fun isTuple( [], n) = n > 2 | isTuple(lab::labs, n) = lab = Lab.fromInt n andalso isTuple(labs, n+1) val labtaus = LabMap.listItemsi Rho val (labs,taus) = ListPair.unzip labtaus in if r = CLOSEDRow andalso List.null labs then text "unit" else if r = CLOSEDRow andalso isTuple(labs, 1) then let val doc = ppStarList (ppTypePrec 2) taus in if p > 1 then paren doc else fbox(below(nest doc)) end else brace(ppCommaList ppLabType labtaus ^^ ppRowVar r) end | ppType'Prec p (FunType(tau1,tau2)) = let val doc = ppTypePrec 1 tau1 ^/^ text "->" ^/^ ppTypePrec 0 tau2 in if p > 0 then paren doc else doc end | ppType'Prec p (ConsType(taus,t)) = fbox(nest(ppSeqPrec ppTypePrec 2 taus ^/^ ppTyName t)) | ppType'Prec p (Overloaded(O)) = text "'" ^^ ppOverloadingClass O | ppType'Prec p (Link tau) = ppTypePrec p tau and ppLabType(lab, tau) = abox( hbox( ppLab lab ^/^ text ":" ) ^^ below(nest(break ^^ ppType tau )) ) (* Type schemes *) fun ppTypeScheme sigma = let val (alphas,tau) = TypeScheme.normalise sigma in ppType tau end end (* stop of PPType.sml *) (* start of PP_STATIC_ENV.sml *) (* * Standard ML pretty printing of the static environment *) signature PP_STATIC_ENV = sig type doc = PrettyPrint.doc type ValEnv = StaticEnv.ValEnv type TyEnv = StaticEnv.TyEnv type Env = StaticEnv.Env type TyNameSet = TyNameSet.set val ppEnv: Env -> doc val ppSig: TyNameSet * Env -> doc val ppTyEnv: TyNameSet * TyEnv -> doc val ppExEnv: ValEnv -> doc end (* stop of PP_STATIC_ENV.sml *) (* start of PPStaticEnv.sml *) (* * Standard ML pretty printing of the static environment *) structure PPStaticEnv :> PP_STATIC_ENV = struct (* Import *) type ValEnv = StaticEnv.ValEnv type TyEnv = StaticEnv.TyEnv type Env = StaticEnv.Env type TyNameSet = TyNameSet.set open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppVId vid = text(VId.toString vid) fun ppTyCon tycon = text(TyCon.toString tycon) fun ppTyVar alpha = text(TyVar.toString alpha) fun ppStrId strid = text(StrId.toString strid) fun ppTyName t = text(TyName.toString t) (* Environments *) fun ppConTypeScheme (_, ref(Type.FunType(tau,_))) = text "of" ^^ break ^^ PPType.ppType tau | ppConTypeScheme _ = empty fun ppValEnv VE = VIdMap.foldri (fn(vid, (sigma,IdStatus.v), doc) => abox( hbox( text "val" ^/^ ppVId vid ^/^ text ":" ) ^^ nest(break ^^ abox(PPType.ppTypeScheme sigma) ) ) ^/^ doc | (vid, (sigma,_), doc) => doc ) empty VE fun ppExEnv VE = VIdMap.foldri (fn(vid, (sigma,IdStatus.e), doc) => abox( hbox( text "exception" ^/^ ppVId vid ) ^^ nest(break ^^ abox(ppConTypeScheme sigma) ) ) ^/^ doc | (vid, (sigma,_), doc) => doc ) empty VE fun ppConEnv VE = VIdMap.foldli (fn(vid, (sigma,_), doc) => doc ^/^ abox( hbox( (if isEmpty doc then empty else text "|") ^/^ ppVId vid ) ^^ nest(text "" ^/^ abox(ppConTypeScheme sigma) ) ) ) empty VE fun absTy(T, tycon, theta) = case TypeFcn.toTyName theta of NONE => NONE | SOME t => if TyName.tycon t = tycon andalso TyNameSet.member(T, t) then SOME(TyName.equality t <> TyName.NOEQ) else NONE fun ppAbsTyEnv(T,TE) = TyConMap.foldri (fn(tycon, (theta as (alphas,tau), VE), doc) => if VIdMap.isEmpty VE then case absTy(T, tycon, theta) of NONE => doc | SOME eq => abox( hbox( text(if eq then "eqtype" else "type") ^/^ ppSeq ppTyVar alphas ^/^ ppTyCon tycon ) ) ^/^ doc else doc ) empty TE fun ppSynTyEnv(T,TE) = TyConMap.foldri (fn(tycon, (theta as (alphas,tau), VE), doc) => if VIdMap.isEmpty VE andalso not(isSome(absTy(T, tycon, theta))) then abox( hbox( text "type" ^/^ ppSeq ppTyVar alphas ^/^ ppTyCon tycon ^/^ text "=" ) ^^ nest(break ^^ abox(PPType.ppType tau) ) ) ^/^ doc else doc ) empty TE fun ppDataTyEnv TE = TyConMap.foldri (fn(tycon, ((alphas,tau),VE), doc) => if VIdMap.isEmpty VE then doc else abox( hbox( text "datatype" ^/^ ppSeq ppTyVar alphas ^/^ ppTyCon tycon ^/^ text "=" ) ^^ nest(break ^^ abox(ppConEnv VE) ) ) ^/^ doc ) empty TE fun ppTyEnv(T,TE) = vbox( ppAbsTyEnv(T,TE) ^/^ ppSynTyEnv(T,TE) ^/^ ppDataTyEnv TE ) fun ppStrEnv(T,SE) = StrIdMap.foldri (fn(strid, StaticEnv.Str E, doc) => abox( hbox( text "structure" ^/^ ppStrId strid ^/^ text ":" ) ^^ nest(break ^^ ppSig (T,E) ) ) ^/^ doc ) empty SE and ppEnv'(T,(SE,TE,VE)) = vbox( ppStrEnv(T,SE) ^/^ ppTyEnv(T,TE) ^/^ ppExEnv VE ^/^ ppValEnv VE ) and ppEnv E = ppEnv'(TyNameSet.empty,E) (* Signatures *) and ppSig (T,E) = let val doc = ppEnv'(T, E) in abox(below( text "sig" ^^ brace(ppCommaList ppTyName (TyNameSet.listItems T)) ^^ (if isEmpty doc then empty else nest(vbox(break ^^ doc)) ) ^^ break ^^ text "end" )) end end (* stop of PPStaticEnv.sml *) (* start of PP_STATIC_BASIS.sml *) (* * Standard ML pretty printing of the static basis *) signature PP_STATIC_BASIS = sig type doc = PrettyPrint.doc type Basis = StaticBasis.Basis type SigEnv = StaticBasis.SigEnv type FunEnv = StaticBasis.FunEnv val ppBasis: Basis -> doc val ppSigEnv: SigEnv -> doc val ppFunEnv: FunEnv -> doc end (* stop of PP_STATIC_BASIS.sml *) (* start of PPStaticBasis.sml *) (* * Standard ML pretty printing of the static basis *) structure PPStaticBasis :> PP_STATIC_BASIS = struct (* Import *) type Basis = StaticBasis.Basis type SigEnv = StaticBasis.SigEnv type FunEnv = StaticBasis.FunEnv open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppSigId sigid = text(SigId.toString sigid) fun ppFunId funid = text(FunId.toString funid) (* Environments *) fun ppSigEnv G = SigIdMap.foldri (fn(sigid, Sigma, doc) => abox( hbox( text "signature" ^/^ ppSigId sigid ^/^ text "=" ) ^^ nest(break ^^ PPStaticEnv.ppSig Sigma ) ) ^/^ doc ) empty G fun ppFunEnv F = FunIdMap.foldri (fn(funid, (T,(E,Sigma)), doc) => abox( hbox( text "functor" ^/^ ppFunId funid ) ^^ nest(ebreak ^^ abox( hbox( text "(" ^^ text "Arg" ^/^ text ":" ) ^^ nest(break ^^ PPStaticEnv.ppSig(T,E) ) ^^ ebreak ^^ hbox( text ")" ^/^ text ":" ) ) ^/^ PPStaticEnv.ppSig Sigma ) ) ^/^ doc ) empty F (* Basis *) fun ppBasis (T,F,G,E) = vbox( ppSigEnv G ^/^ ppFunEnv F ^/^ PPStaticEnv.ppEnv E ^/^ text "" ) end (* stop of PPStaticBasis.sml *) (* start of PP_ENV.sml *) (* * Standard ML pretty printing of the combined static/dynamic environment *) signature PP_ENV = sig type doc = PrettyPrint.doc type Env = StaticEnv.Env * DynamicEnv.Env type State = PPDynamicEnv.State val ppEnv: State * Env -> doc end (* stop of PP_ENV.sml *) (* start of PPEnv.sml *) (* * Standard ML pretty printing of the combined static/dynamic environment *) structure PPEnv :> PP_ENV = struct (* Import *) type Env = StaticEnv.Env * DynamicEnv.Env type State = PPDynamicEnv.State open PrettyPrint open PPMisc infixr ^^ ^/^ (* Simple objects *) fun ppVId vid = text(VId.toString vid) fun ppStrId strid = text(StrId.toString strid) (* Environments *) fun ppValEnv(s, (VE_STAT,VE_DYN)) = VIdMap.foldri (fn(vid, (sigma,IdStatus.v), doc) => let val (v,is) = valOf(VIdMap.find(VE_DYN, vid)) in fbox( hbox( text "val" ^/^ ppVId vid ) ^^ nest(break ^^ text "=" ^/^ below(abox(PPVal.ppVal(s, v))) ^/^ text ":" ^/^ below(abox(PPType.ppTypeScheme sigma)) ) ) ^/^ doc end | (vid, (sigma,_), doc) => doc ) empty VE_STAT fun ppStrEnv(s, T, (SE_STAT,SE_DYN)) = StrIdMap.foldri (fn(strid, StaticEnv.Str E_STAT, doc) => let val DynamicEnv.Str E_DYN = valOf(StrIdMap.find(SE_DYN, strid)) in abox( hbox( text "structure" ^/^ ppStrId strid ^/^ text "=" ) ^^ nest(break ^^ ppStr (s, T, (E_STAT,E_DYN)) ) ) ^/^ doc end ) empty SE_STAT and ppEnv'(s, T, ((SE_STAT,TE_STAT,VE_STAT), (SE_DYN, TE_DYN, VE_DYN))) = vbox( ppStrEnv(s, T, (SE_STAT,SE_DYN)) ^/^ PPStaticEnv.ppTyEnv(T,TE_STAT) ^/^ PPStaticEnv.ppExEnv VE_STAT ^/^ ppValEnv(s, (VE_STAT,VE_DYN)) ) and ppEnv(s, E) = ppEnv'(s, TyNameSet.empty, E) (* Structures *) and ppStr(s, T, E) = let val doc = ppEnv'(s, T, E) in abox(below( text "struct" ^^ (if isEmpty doc then empty else nest(vbox(break ^^ doc)) ) ^^ break ^^ text "end" )) end end (* stop of PPEnv.sml *) (* start of PP_BASIS.sml *) (* * Standard ML pretty printing of the combined basis *) signature PP_BASIS = sig type doc = PrettyPrint.doc type Basis = Basis.Basis type State = PPEnv.State val ppBasis: State * Basis -> doc end (* stop of PP_BASIS.sml *) (* start of PPBasis.sml *) (* * Standard ML pretty printing of the combined basis *) structure PPBasis :> PP_BASIS = struct (* Import *) type Basis = Basis.Basis type State = PPEnv.State open PrettyPrint infixr ^^ ^/^ (* Basis *) fun ppBasis (s, ((T,F_STAT,G_STAT,E_STAT), (F_DYN,G_DYN,E_DYN))) = vbox( PPStaticBasis.ppSigEnv G_STAT ^/^ PPStaticBasis.ppFunEnv F_STAT ^/^ PPEnv.ppEnv(s, (E_STAT,E_DYN)) ^/^ text "" ) end (* stop of PPBasis.sml *) (* start of PROGRAM.sml *) (* * Standard ML programs * * Definition, section 8 * * Note: * State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * of modules and core can be avoided. Note that the state therefore * never is returned. *) signature PROGRAM = sig (* Import types *) type Program = GrammarProgram.Program type StaticBasis = StaticBasis.Basis type DynamicBasis = DynamicBasis.Basis type Basis = Basis.Basis type State = EvalModule.State (* Export *) val execProgram: State ref * Basis * Program -> Basis val elabProgram: StaticBasis * Program -> StaticBasis val evalProgram: State ref * DynamicBasis * Program -> DynamicBasis end (* stop of PROGRAM.sml *) (* start of Program.sml *) (* * Standard ML programs * * Definition, section 8 * * Note: * State is passed as reference and modified via side effects. This way * expanding out the state and exception convention in the inference rules * of modules and core can be avoided. Note that the state therefore * never is returned. *) structure Program :> PROGRAM = struct (* Import *) type StaticBasis = StaticBasis.Basis type DynamicBasis = DynamicBasis.Basis type Basis = Basis.Basis type State = EvalModule.State open GrammarProgram (* Helpers for output *) val width = 79 fun printException(s, e) = ( TextIO.output(TextIO.stdOut, "Uncaught exception: ") ; PrettyPrint.output(TextIO.stdOut, PPVal.ppExVal(s, e), width) ; TextIO.output1(TextIO.stdOut, #"\n") ; TextIO.flushOut TextIO.stdOut ) fun printStaticBasis B_STAT = ( PrettyPrint.output(TextIO.stdOut, PPStaticBasis.ppBasis B_STAT, width) ; TextIO.flushOut TextIO.stdOut ) fun printDynamicBasis(s, B_DYN) = ( PrettyPrint.output(TextIO.stdOut, PPDynamicBasis.ppBasis(s, B_DYN), width) ; TextIO.flushOut TextIO.stdOut ) fun printBasis(s, B) = ( PrettyPrint.output(TextIO.stdOut, PPBasis.ppBasis(s, B), width) ; TextIO.flushOut TextIO.stdOut ) (* Helpers for basis modification *) val oplus = Basis.oplus infix oplus (* Inference rules [Section 8] *) fun execProgram(s,B, Program(I, topdec, program_opt)) = (* [Rules 187 to 189] *) let val B_STAT1 = ElabModule.elabTopDec(Basis.B_STATof B, topdec) val B_DYN1 = EvalModule.evalTopDec(s,Basis.B_DYNof B, topdec) (* [Rule 189] *) val _ = printBasis(!s, (B_STAT1,B_DYN1)) val B' = B oplus (B_STAT1,B_DYN1) val B'' = case program_opt of NONE => B' | SOME program => execProgram(s,B', program) in B'' end handle Error.Error m => (* [Rule 187] *) let val B' = case program_opt of NONE => B | SOME program => execProgram(s,B, program) in B' end | Pack.Pack e => (* [Rule 188] *) let val _ = printException(!s, e) val B' = case program_opt of NONE => B | SOME program => execProgram(s,B, program) in B' end (* Elaboration only *) fun elabProgram(B_STAT, Program(I, topdec, program_opt)) = let val B_STAT1 = ElabModule.elabTopDec(B_STAT, topdec) val _ = printStaticBasis B_STAT1 val B_STAT' = StaticBasis.plus(B_STAT, B_STAT1) val B_STAT'' = case program_opt of NONE => B_STAT' | SOME program => elabProgram(B_STAT', program) in B_STAT'' end handle Error.Error m => B_STAT (* Evaluation only *) fun evalProgram(s,B_DYN, Program(I, topdec, program_opt)) = let val B_DYN1 = EvalModule.evalTopDec(s,B_DYN, topdec) val _ = printDynamicBasis(!s, B_DYN1) val B_DYN' = DynamicBasis.plus(B_DYN, B_DYN1) val B_DYN'' = case program_opt of NONE => B_DYN' | SOME program => evalProgram(s,B_DYN', program) in B_DYN'' end handle Error.Error m => (* Runtime error *) let val B_DYN' = case program_opt of NONE => B_DYN | SOME program => evalProgram(s,B_DYN, program) in B_DYN' end | Pack.Pack e => let val _ = printException(!s, e) val B_DYN' = case program_opt of NONE => B_DYN | SOME program => evalProgram(s,B_DYN, program) in B_DYN' end end (* stop of Program.sml *) (* start of ml-yacc/lib/base.sig *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* base.sig: Base signature file for SML-Yacc. This file contains signatures that must be loaded before any of the files produced by ML-Yacc are loaded *) (* STREAM: signature for a lazy stream.*) signature STREAM = sig type 'xa stream val streamify : (unit -> '_a) -> '_a stream val cons : '_a * '_a stream -> '_a stream val get : '_a stream -> '_a * '_a stream end (* LR_TABLE: signature for an LR Table. The list of actions and gotos passed to mkLrTable must be ordered by state number. The values for state 0 are the first in the list, the values for state 1 are next, etc. *) signature LR_TABLE = sig datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype state = STATE of int datatype term = T of int datatype nonterm = NT of int datatype action = SHIFT of state | REDUCE of int | ACCEPT | ERROR type table val numStates : table -> int val numRules : table -> int val describeActions : table -> state -> (term,action) pairlist * action val describeGoto : table -> state -> (nonterm,state) pairlist val action : table -> state * term -> action val goto : table -> state * nonterm -> state val initialState : table -> state exception Goto of state * nonterm val mkLrTable : {actions : ((term,action) pairlist * action) array, gotos : (nonterm,state) pairlist array, numStates : int, numRules : int, initialState : state} -> table end (* TOKEN: signature revealing the internal structure of a token. This signature TOKEN distinct from the signature {parser name}_TOKENS produced by ML-Yacc. The {parser name}_TOKENS structures contain some types and functions to construct tokens from values and positions. The representation of token was very carefully chosen here to allow the polymorphic parser to work without knowing the types of semantic values or line numbers. This has had an impact on the TOKENS structure produced by SML-Yacc, which is a structure parameter to lexer functors. We would like to have some type 'a token which functions to construct tokens would create. A constructor function for a integer token might be INT: int * 'a * 'a -> 'a token. This is not possible because we need to have tokens with the representation given below for the polymorphic parser. Thus our constructur functions for tokens have the form: INT: int * 'a * 'a -> (svalue,'a) token This in turn has had an impact on the signature that lexers for SML-Yacc must match and the types that a user must declare in the user declarations section of lexers. *) signature TOKEN = sig structure LrTable : LR_TABLE datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken : ('a,'b) token * ('a,'b) token -> bool end (* LR_PARSER: signature for a polymorphic LR parser *) signature LR_PARSER = sig structure Stream: STREAM structure LrTable : LR_TABLE structure Token : TOKEN sharing LrTable = Token.LrTable exception ParseError val parse : {table : LrTable.table, lexer : ('_b,'_c) Token.token Stream.stream, arg: 'arg, saction : int * '_c * (LrTable.state * ('_b * '_c * '_c)) list * 'arg -> LrTable.nonterm * ('_b * '_c * '_c) * ((LrTable.state *('_b * '_c * '_c)) list), void : '_b, ec : { is_keyword : LrTable.term -> bool, noShift : LrTable.term -> bool, preferred_change : (LrTable.term list * LrTable.term list) list, errtermvalue : LrTable.term -> '_b, showTerminal : LrTable.term -> string, terms: LrTable.term list, error : string * '_c * '_c -> unit }, lookahead : int (* max amount of lookahead used in *) (* error correction *) } -> '_b * (('_b,'_c) Token.token Stream.stream) end (* LEXER: a signature that most lexers produced for use with SML-Yacc's output will match. The user is responsible for declaring type token, type pos, and type svalue in the UserDeclarations section of a lexer. Note that type token is abstract in the lexer. This allows SML-Yacc to create a TOKENS signature for use with lexers produced by ML-Lex that treats the type token abstractly. Lexers that are functors parametrized by a Tokens structure matching a TOKENS signature cannot examine the structure of tokens. *) signature LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue end val makeLexer : (int -> string) -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* ARG_LEXER: the %arg option of ML-Lex allows users to produce lexers which also take an argument before yielding a function from unit to a token *) signature ARG_LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue type arg end val makeLexer : (int -> string) -> UserDeclarations.arg -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* PARSER_DATA: the signature of ParserData structures in {parser name}LrValsFun produced by SML-Yacc. All such structures match this signature. The {parser name}LrValsFun produces a structure which contains all the values except for the lexer needed to call the polymorphic parser mentioned before. *) signature PARSER_DATA = sig (* the type of line numbers *) type pos (* the type of semantic values *) type svalue (* the type of the user-supplied argument to the parser *) type arg (* the intended type of the result of the parser. This value is produced by applying extract from the structure Actions to the final semantic value resultiing from a parse. *) type result structure LrTable : LR_TABLE structure Token : TOKEN sharing Token.LrTable = LrTable (* structure Actions contains the functions which mantain the semantic values stack in the parser. Void is used to provide a default value for the semantic stack. *) structure Actions : sig val actions : int * pos * (LrTable.state * (svalue * pos * pos)) list * arg-> LrTable.nonterm * (svalue * pos * pos) * ((LrTable.state *(svalue * pos * pos)) list) val void : svalue val extract : svalue -> result end (* structure EC contains information used to improve error recovery in an error-correcting parser *) structure EC : sig val is_keyword : LrTable.term -> bool val noShift : LrTable.term -> bool val preferred_change : (LrTable.term list * LrTable.term list) list val errtermvalue : LrTable.term -> svalue val showTerminal : LrTable.term -> string val terms: LrTable.term list end (* table is the LR table for the parser *) val table : LrTable.table end (* signature PARSER is the signature that most user parsers created by SML-Yacc will match. *) signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError (* type pos is the type of line numbers *) type pos (* type result is the type of the result from the parser *) type result (* the type of the user-supplied argument to the parser *) type arg (* type svalue is the type of semantic values for the semantic value stack *) type svalue (* val makeLexer is used to create a stream of tokens for the parser *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream (* val parse takes a stream of tokens and a function to print errors and returns a value of type result and a stream containing the unused tokens *) val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* signature ARG_PARSER is the signature that will be matched by parsers whose lexer takes an additional argument. *) signature ARG_PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type arg type lexarg type pos type result type svalue val makeLexer : (int -> string) -> lexarg -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* stop of ml-yacc/lib/base.sig *) (* start of ml-yacc/lib/join.sml *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* functor Join creates a user parser by putting together a Lexer structure, an LrValues structure, and a polymorphic parser structure. Note that the Lexer and LrValues structure must share the type pos (i.e. the type of line numbers), the type svalues for semantic values, and the type of tokens. *) functor Join(structure Lex : LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = LrParser.Stream.streamify o Lex.makeLexer val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end (* functor JoinWithArg creates a variant of the parser structure produced above. In this case, the makeLexer take an additional argument before yielding a value of type unit -> (svalue,pos) token *) functor JoinWithArg(structure Lex : ARG_LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : ARG_PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type lexarg = Lex.UserDeclarations.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = fn s => fn arg => LrParser.Stream.streamify (Lex.makeLexer s arg) val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end; (* stop of ml-yacc/lib/join.sml *) (* start of ml-yacc/lib/lrtable.sml *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) structure LrTable : LR_TABLE = struct open Array List infix 9 sub datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype term = T of int datatype nonterm = NT of int datatype state = STATE of int datatype action = SHIFT of state | REDUCE of int (* rulenum from grammar *) | ACCEPT | ERROR exception Goto of state * nonterm type table = {states: int, rules : int,initialState: state, action: ((term,action) pairlist * action) array, goto : (nonterm,state) pairlist array} val numStates = fn ({states,...} : table) => states val numRules = fn ({rules,...} : table) => rules val describeActions = fn ({action,...} : table) => fn (STATE s) => action sub s val describeGoto = fn ({goto,...} : table) => fn (STATE s) => goto sub s fun findTerm (T term,row,default) = let fun find (PAIR (T key,data,r)) = if key < term then find r else if key=term then data else default | find EMPTY = default in find row end fun findNonterm (NT nt,row) = let fun find (PAIR (NT key,data,r)) = if key < nt then find r else if key=nt then SOME data else NONE | find EMPTY = NONE in find row end val action = fn ({action,...} : table) => fn (STATE state,term) => let val (row,default) = action sub state in findTerm(term,row,default) end val goto = fn ({goto,...} : table) => fn (a as (STATE state,nonterm)) => case findNonterm(nonterm,goto sub state) of SOME state => state | NONE => raise (Goto a) val initialState = fn ({initialState,...} : table) => initialState val mkLrTable = fn {actions,gotos,initialState,numStates,numRules} => ({action=actions,goto=gotos, states=numStates, rules=numRules, initialState=initialState} : table) end; (* stop of ml-yacc/lib/lrtable.sml *) (* start of ml-yacc/lib/stream.sml *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* Stream: a structure implementing a lazy stream. The signature STREAM is found in base.sig *) structure Stream :> STREAM = struct datatype 'a str = EVAL of 'a * 'a str ref | UNEVAL of (unit->'a) type 'a stream = 'a str ref fun get(ref(EVAL t)) = t | get(s as ref(UNEVAL f)) = let val t = (f(), ref(UNEVAL f)) in s := EVAL t; t end fun streamify f = ref(UNEVAL f) fun cons(a,s) = ref(EVAL(a,s)) end; (* stop of ml-yacc/lib/stream.sml *) (* start of ml-yacc/lib/parser2.sml *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* parser.sml: This is a parser driver for LR tables with an error-recovery routine added to it. The routine used is described in detail in this article: 'A Practical Method for LR and LL Syntactic Error Diagnosis and Recovery', by M. Burke and G. Fisher, ACM Transactions on Programming Langauges and Systems, Vol. 9, No. 2, April 1987, pp. 164-197. This program is an implementation is the partial, deferred method discussed in the article. The algorithm and data structures used in the program are described below. This program assumes that all semantic actions are delayed. A semantic action should produce a function from unit -> value instead of producing the normal value. The parser returns the semantic value on the top of the stack when accept is encountered. The user can deconstruct this value and apply the unit -> value function in it to get the answer. It also assumes that the lexer is a lazy stream. Data Structures: ---------------- * The parser: The state stack has the type (state * (semantic value * line # * line #)) list The parser keeps a queue of (state stack * lexer pair). A lexer pair consists of a terminal * value pair and a lexer. This allows the parser to reconstruct the states for terminals to the left of a syntax error, and attempt to make error corrections there. The queue consists of a pair of lists (x,y). New additions to the queue are cons'ed onto y. The first element of x is the top of the queue. If x is nil, then y is reversed and used in place of x. Algorithm: ---------- * The steady-state parser: This parser keeps the length of the queue of state stacks at a steady state by always removing an element from the front when another element is placed on the end. It has these arguments: stack: current stack queue: value of the queue lexPair ((terminal,value),lex stream) When SHIFT is encountered, the state to shift to and the value are are pushed onto the state stack. The state stack and lexPair are placed on the queue. The front element of the queue is removed. When REDUCTION is encountered, the rule is applied to the current stack to yield a triple (nonterm,value,new stack). A new stack is formed by adding (goto(top state of stack,nonterm),value) to the stack. When ACCEPT is encountered, the top value from the stack and the lexer are returned. When an ERROR is encountered, fixError is called. FixError takes the arguments to the parser, fixes the error if possible and returns a new set of arguments. * The distance-parser: This parser includes an additional argument distance. It pushes elements on the queue until it has parsed distance tokens, or an ACCEPT or ERROR occurs. It returns a stack, lexer, the number of tokens left unparsed, a queue, and an action option. *) signature FIFO = sig type 'a queue val empty : 'a queue exception Empty val get : 'a queue -> 'a * 'a queue val put : 'a * 'a queue -> 'a queue end (* drt (12/15/89) -- the functor should be used in development work, but it wastes space in the release version. functor ParserGen(structure LrTable : LR_TABLE structure Stream : STREAM) : LR_PARSER = *) structure LrParser :> LR_PARSER = struct structure LrTable = LrTable structure Stream = Stream structure Token : TOKEN = struct structure LrTable = LrTable datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken = fn (TOKEN(t,_),TOKEN(t',_)) => t=t' end open LrTable open Token val DEBUG1 = false val DEBUG2 = false exception ParseError exception ParseImpossible of int structure Fifo :> FIFO = struct type 'a queue = ('a list * 'a list) val empty = (nil,nil) exception Empty fun get(a::x, y) = (a, (x,y)) | get(nil, nil) = raise Empty | get(nil, y) = get(rev y, nil) fun put(a,(x,y)) = (x,a::y) end type ('a,'b) elem = (state * ('a * 'b * 'b)) type ('a,'b) stack = ('a,'b) elem list type ('a,'b) lexv = ('a,'b) token type ('a,'b) lexpair = ('a,'b) lexv * (('a,'b) lexv Stream.stream) type ('a,'b) distanceParse = ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int -> ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int * action option type ('a,'b) ecRecord = {is_keyword : term -> bool, preferred_change : (term list * term list) list, error : string * 'b * 'b -> unit, errtermvalue : term -> 'a, terms : term list, showTerminal : term -> string, noShift : term -> bool} local val print = fn s => TextIO.output(TextIO.stdOut,s) val println = fn s => (print s; print "\n") val showState = fn (STATE s) => "STATE " ^ (Int.toString s) in fun printStack(stack: ('a,'b) stack, n: int) = case stack of (state,_) :: rest => (print("\t" ^ Int.toString n ^ ": "); println(showState state); printStack(rest, n+1)) | nil => () fun prAction showTerminal (stack as (state,_) :: _, next as (TOKEN (term,_),_), action) = (println "Parse: state stack:"; printStack(stack, 0); print(" state=" ^ showState state ^ " next=" ^ showTerminal term ^ " action=" ); case action of SHIFT state => println ("SHIFT " ^ (showState state)) | REDUCE i => println ("REDUCE " ^ (Int.toString i)) | ERROR => println "ERROR" | ACCEPT => println "ACCEPT") | prAction _ (_,_,action) = () end (* ssParse: parser which maintains the queue of (state * lexvalues) in a steady-state. It takes a table, showTerminal function, saction function, and fixError function. It parses until an ACCEPT is encountered, or an exception is raised. When an error is encountered, fixError is called with the arguments of parseStep (lexv,stack,and queue). It returns the lexv, and a new stack and queue adjusted so that the lexv can be parsed *) val ssParse = fn (table,showTerminal,saction,fixError,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(args as (lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue)) = let val nextAction = action (state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer val (_,newQueue) =Fifo.get(Fifo.put((newStack,newLexPair), queue)) in parseStep(newLexPair,(s,value)::stack,newQueue) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue) | _ => raise (ParseImpossible 197)) | ERROR => parseStep(fixError args) | ACCEPT => (case stack of (_,(topvalue,_,_)) :: _ => let val (token,restLexer) = lexPair in (topvalue,Stream.cons(token,restLexer)) end | _ => raise (ParseImpossible 202)) end | parseStep _ = raise (ParseImpossible 204) in parseStep end (* distanceParse: parse until n tokens are shifted, or accept or error are encountered. Takes a table, showTerminal function, and semantic action function. Returns a parser which takes a lexPair (lex result * lexer), a state stack, a queue, and a distance (must be > 0) to parse. The parser returns a new lex-value, a stack with the nth token shifted on top, a queue, a distance, and action option. *) val distanceParse = fn (table,showTerminal,saction,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(lexPair,stack,queue,0) = (lexPair,stack,queue,0,NONE) | parseStep(lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue,distance) = let val nextAction = action(state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer in parseStep(newLexPair,(s,value)::stack, Fifo.put((newStack,newLexPair),queue),distance-1) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue,distance) | _ => raise (ParseImpossible 240)) | ERROR => (lexPair,stack,queue,distance,SOME nextAction) | ACCEPT => (lexPair,stack,queue,distance,SOME nextAction) end | parseStep _ = raise (ParseImpossible 242) in parseStep : ('_a,'_b) distanceParse end (* mkFixError: function to create fixError function which adjusts parser state so that parse may continue in the presence of an error *) fun mkFixError({is_keyword,terms,errtermvalue, preferred_change,noShift, showTerminal,error,...} : ('_a,'_b) ecRecord, distanceParse : ('_a,'_b) distanceParse, minAdvance,maxAdvance) (lexv as (TOKEN (term,value as (_,leftPos,_)),_),stack,queue) = let val _ = if DEBUG2 then error("syntax error found at " ^ (showTerminal term), leftPos,leftPos) else () fun tokAt(t,p) = TOKEN(t,(errtermvalue t,p,p)) val minDelta = 3 (* pull all the state * lexv elements from the queue *) val stateList = let fun f q = let val (elem,newQueue) = Fifo.get q in elem :: (f newQueue) end handle Fifo.Empty => nil in f queue end (* now number elements of stateList, giving distance from error token *) val (_, numStateList) = List.foldr (fn (a,(num,r)) => (num+1,(a,num)::r)) (0, []) stateList (* Represent the set of potential changes as a linked list. Values of datatype Change hold information about a potential change. oper = oper to be applied pos = the # of the element in stateList that would be altered. distance = the number of tokens beyond the error token which the change allows us to parse. new = new terminal * value pair at that point orig = original terminal * value pair at the point being changed. *) datatype ('a,'b) change = CHANGE of {pos : int, distance : int, leftPos: 'b, rightPos: 'b, new : ('a,'b) lexv list, orig : ('a,'b) lexv list} val showTerms = concat o map (fn TOKEN(t,_) => " " ^ showTerminal t) val printChange = fn c => let val CHANGE {distance,new,orig,pos,...} = c in (print ("{distance= " ^ (Int.toString distance)); print (",orig ="); print(showTerms orig); print (",new ="); print(showTerms new); print (",pos= " ^ (Int.toString pos)); print "}\n") end val printChangeList = app printChange (* parse: given a lexPair, a stack, and the distance from the error token, return the distance past the error token that we are able to parse.*) fun parse (lexPair,stack,queuePos : int) = case distanceParse(lexPair,stack,Fifo.empty,queuePos+maxAdvance+1) of (_,_,_,distance,SOME ACCEPT) => if maxAdvance-distance-1 >= 0 then maxAdvance else maxAdvance-distance-1 | (_,_,_,distance,_) => maxAdvance - distance - 1 (* catList: concatenate results of scanning list *) fun catList l f = List.foldr (fn(a,r)=> f a @ r) [] l fun keywordsDelta new = if List.exists (fn(TOKEN(t,_))=>is_keyword t) new then minDelta else 0 fun tryChange{lex,stack,pos,leftPos,rightPos,orig,new} = let val lex' = List.foldr (fn (t',p)=>(t',Stream.cons p)) lex new val distance = parse(lex',stack,pos+length new-length orig) in if distance >= minAdvance + keywordsDelta new then [CHANGE{pos=pos,leftPos=leftPos,rightPos=rightPos, distance=distance,orig=orig,new=new}] else [] end (* tryDelete: Try to delete n terminals. Return single-element [success] or nil. Do not delete unshiftable terminals. *) fun tryDelete n ((stack,lexPair as (TOKEN(term,(_,l,r)),_)),qPos) = let fun del(0,accum,left,right,lexPair) = tryChange{lex=lexPair,stack=stack, pos=qPos,leftPos=left,rightPos=right, orig=rev accum, new=[]} | del(n,accum,left,right,(tok as TOKEN(term,(_,_,r)),lexer)) = if noShift term then [] else del(n-1,tok::accum,left,r,Stream.get lexer) in del(n,[],l,r,lexPair) end (* tryInsert: try to insert tokens before the current terminal; return a list of the successes *) fun tryInsert((stack,lexPair as (TOKEN(_,(_,l,_)),_)),queuePos) = catList terms (fn t => tryChange{lex=lexPair,stack=stack, pos=queuePos,orig=[],new=[tokAt(t,l)], leftPos=l,rightPos=l}) (* trySubst: try to substitute tokens for the current terminal; return a list of the successes *) fun trySubst ((stack,lexPair as (orig as TOKEN (term,(_,l,r)),lexer)), queuePos) = if noShift term then [] else catList terms (fn t => tryChange{lex=Stream.get lexer,stack=stack, pos=queuePos, leftPos=l,rightPos=r,orig=[orig], new=[tokAt(t,r)]}) (* do_delete(toks,lexPair) tries to delete tokens "toks" from "lexPair". If it succeeds, returns SOME(toks',l,r,lp), where toks' is the actual tokens (with positions and values) deleted, (l,r) are the (leftmost,rightmost) position of toks', lp is what remains of the stream after deletion *) fun do_delete(nil,lp as (TOKEN(_,(_,l,_)),_)) = SOME(nil,l,l,lp) | do_delete([t],(tok as TOKEN(t',(_,l,r)),lp')) = if t=t' then SOME([tok],l,r,Stream.get lp') else NONE | do_delete(t::rest,(tok as TOKEN(t',(_,l,r)),lp')) = if t=t' then case do_delete(rest,Stream.get lp') of SOME(deleted,l',r',lp'') => SOME(tok::deleted,l,r',lp'') | NONE => NONE else NONE fun tryPreferred((stack,lexPair),queuePos) = catList preferred_change (fn (delete,insert) => if List.exists noShift delete then [] (* should give warning at parser-generation time *) else case do_delete(delete,lexPair) of SOME(deleted,l,r,lp) => tryChange{lex=lp,stack=stack,pos=queuePos, leftPos=l,rightPos=r,orig=deleted, new=map (fn t=>(tokAt(t,r))) insert} | NONE => []) val changes = catList numStateList tryPreferred @ catList numStateList tryInsert @ catList numStateList trySubst @ catList numStateList (tryDelete 1) @ catList numStateList (tryDelete 2) @ catList numStateList (tryDelete 3) val findMaxDist = fn l => foldr (fn (CHANGE {distance,...},high) => Int.max(distance,high)) 0 l (* maxDist: max distance past error taken that we could parse *) val maxDist = findMaxDist changes (* remove changes which did not parse maxDist tokens past the error token *) val changes = catList changes (fn(c as CHANGE{distance,...}) => if distance=maxDist then [c] else []) in case changes of (l as change :: _) => let fun print_msg (CHANGE {new,orig,leftPos,rightPos,...}) = let val s = case (orig,new) of (_::_,[]) => "deleting " ^ (showTerms orig) | ([],_::_) => "inserting " ^ (showTerms new) | _ => "replacing " ^ (showTerms orig) ^ " with " ^ (showTerms new) in error ("syntax error: " ^ s,leftPos,rightPos) end val _ = (if length l > 1 andalso DEBUG2 then (print "multiple fixes possible; could fix it by:\n"; app print_msg l; print "chosen correction:\n") else (); print_msg change) (* findNth: find nth queue entry from the error entry. Returns the Nth queue entry and the portion of the queue from the beginning to the nth-1 entry. The error entry is at the end of the queue. Examples: queue = a b c d e findNth 0 = (e,a b c d) findNth 1 = (d,a b c) *) val findNth = fn n => let fun f (h::t,0) = (h,rev t) | f (h::t,n) = f(t,n-1) | f (nil,_) = let exception FindNth in raise FindNth end in f (rev stateList,n) end val CHANGE {pos,orig,new,...} = change val (last,queueFront) = findNth pos val (stack,lexPair) = last val lp1 = foldl(fn (_,(_,r)) => Stream.get r) lexPair orig val lp2 = foldr(fn(t,r)=>(t,Stream.cons r)) lp1 new val restQueue = Fifo.put((stack,lp2), foldl Fifo.put Fifo.empty queueFront) val (lexPair,stack,queue,_,_) = distanceParse(lp2,stack,restQueue,pos) in (lexPair,stack,queue) end | nil => (error("syntax error found at " ^ (showTerminal term), leftPos,leftPos); raise ParseError) end val parse = fn {arg,table,lexer,saction,void,lookahead, ec=ec as {showTerminal,...} : ('_a,'_b) ecRecord} => let val distance = 15 (* defer distance tokens *) val minAdvance = 1 (* must parse at least 1 token past error *) val maxAdvance = Int.max(lookahead,0)(* max distance for parse check *) val lexPair = Stream.get lexer val (TOKEN (_,(_,leftPos,_)),_) = lexPair val startStack = [(initialState table,(void,leftPos,leftPos))] val startQueue = Fifo.put((startStack,lexPair),Fifo.empty) val distanceParse = distanceParse(table,showTerminal,saction,arg) val fixError = mkFixError(ec,distanceParse,minAdvance,maxAdvance) val ssParse = ssParse(table,showTerminal,saction,fixError,arg) fun loop (lexPair,stack,queue,_,SOME ACCEPT) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,0,_) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,distance,SOME ERROR) = let val (lexPair,stack,queue) = fixError(lexPair,stack,queue) in loop (distanceParse(lexPair,stack,queue,distance)) end | loop _ = let exception ParseInternal in raise ParseInternal end in loop (distanceParse(lexPair,startStack,startQueue,distance)) end end; (* stop of ml-yacc/lib/parser2.sml *) (* start of DERIVED_FORMS_CORE.sml *) (* * Standard ML core derived forms * * Definition, Section 2.7 and appendix A * * Note: * Two phrases named Fmatch and Fmrule have been added to factorize FvalBind. *) signature DERIVED_FORMS_CORE = sig (* Import *) type Info = GrammarCore.Info type Lab = GrammarCore.Lab type VId = GrammarCore.VId type Op = GrammarCore.Op type AtExp = GrammarCore.AtExp type AppExp = GrammarCore.AtExp list type InfExp = GrammarCore.Exp type Exp = GrammarCore.Exp type Match = GrammarCore.Match type Mrule = GrammarCore.Mrule type Dec = GrammarCore.Dec type ValBind = GrammarCore.ValBind type FvalBind = GrammarCore.ValBind type Fmatch = GrammarCore.Match * VId * int type Fmrule = GrammarCore.Mrule * VId * int type TypBind = GrammarCore.TypBind type DatBind = GrammarCore.DatBind type AtPat = GrammarCore.AtPat type PatRow = GrammarCore.PatRow type Pat = GrammarCore.Pat type Ty = GrammarCore.Ty type TyVarseq = GrammarCore.TyVarseq (* Expressions [Figure 15] *) val UNITAtExp: Info -> AtExp val TUPLEAtExp: Info * Exp list -> AtExp val HASHAtExp: Info * Lab -> AtExp val CASEExp: Info * Exp * Match -> Exp val IFExp: Info * Exp * Exp * Exp -> Exp val ANDALSOExp: Info * Exp * Exp -> Exp val ORELSEExp: Info * Exp * Exp -> Exp val SEQAtExp: Info * Exp list -> AtExp val LETAtExp: Info * Dec * Exp list -> AtExp val WHILEExp: Info * Exp * Exp -> Exp val LISTAtExp: Info * Exp list -> AtExp (* Patterns [Figure 16] *) val UNITAtPat: Info -> AtPat val TUPLEAtPat: Info * Pat list -> AtPat val LISTAtPat: Info * Pat list -> AtPat val VIDPatRow: Info * VId * Ty option * Pat option * PatRow option -> PatRow (* Types [Figure 16] *) val TUPLETy: Info * Ty list -> Ty (* Function-value bindings [Figure 17] *) val FvalBind: Info * Fmatch * FvalBind option -> FvalBind val Fmatch: Info * Fmrule * Fmatch option -> Fmatch val Fmrule: Info * Op * VId * AtPat list * Ty option * Exp -> Fmrule (* Declarations [Figure 17] *) val FUNDec: Info * TyVarseq * FvalBind -> Dec val DATATYPEDec: Info * DatBind * TypBind option -> Dec val ABSTYPEDec: Info * DatBind * TypBind option * Dec -> Dec end (* stop of DERIVED_FORMS_CORE.sml *) (* start of DerivedFormsCore.sml *) (* * Standard ML core derived forms * * Definition, Section 2.7 and appendix A * * Notes: * - Two phrases named Fmatch and Fmrule have been added to factorize FvalBind. * - In Fvalbinds we do not enforce that all optional type annotations are * syntactically identical (as the Definition enforces, although this seems * to be a mistake). * - The Definition is somewhat inaccurate about the derived forms of Exp * [Definition, Appendix A, Figure 15] in that most forms are actually AtExp * derived forms, as can be seen from the full grammar [Definition, * Appendix B, Figure 20]. To achieve consistency, the equivalent forms must * be put in parentheses in some cases. * - The same goes for pattern derived forms [Definition, Appendix A, Figure 16; * Appendix B, Figure 22]. *) structure DerivedFormsCore :> DERIVED_FORMS_CORE = struct (* Import *) structure C = GrammarCore type Info = C.Info type Lab = C.Lab type VId = C.VId type Op = C.Op type AtExp = C.AtExp type AppExp = C.AtExp list type InfExp = C.Exp type Exp = C.Exp type Match = C.Match type Mrule = C.Mrule type Dec = C.Dec type ValBind = C.ValBind type FvalBind = C.ValBind type Fmatch = C.Match * C.VId * int type Fmrule = C.Mrule * C.VId * int type TypBind = C.TypBind type DatBind = C.DatBind type AtPat = C.AtPat type PatRow = C.PatRow type Pat = C.Pat type Ty = C.Ty type TyVarseq = C.TyVarseq (* Some helpers *) val vidFALSE = VId.fromString "false" val vidTRUE = VId.fromString "true" val vidNIL = VId.fromString "nil" val vidCONS = VId.fromString "::" val longvidCONS = LongVId.fromId vidCONS fun LONGVIDExp(I, longvid) = C.ATEXPExp(I, C.LONGVIDAtExp(I, C.SANSOp, longvid)) fun LONGVIDPat(I, longvid) = C.ATPATPat(I, C.LONGVIDAtPat(I, C.SANSOp, longvid)) fun VIDExp(I, vid) = LONGVIDExp(I, LongVId.fromId vid) fun VIDPat(I, vid) = LONGVIDPat(I, LongVId.fromId vid) fun FALSEExp(I) = VIDExp(I, vidFALSE) fun TRUEExp(I) = VIDExp(I, vidTRUE) fun NILExp(I) = VIDExp(I, vidNIL) fun CONSExp(I) = VIDExp(I, vidCONS) fun FALSEPat(I) = VIDPat(I, vidFALSE) fun TRUEPat(I) = VIDPat(I, vidTRUE) fun NILPat(I) = VIDPat(I, vidNIL) (* Rewriting of withtype declarations [Appendix A, 2nd bullet] *) fun lookupTyCon(tycon, C.TypBind(_, tyvarseq, tycon', ty, typbind_opt)) = if tycon' = tycon then (tyvarseq, ty) else lookupTyCon(tycon, Option.valOf typbind_opt) (* may raise Option *) fun replaceTy (C.TyVarseq(_,tyvars), C.Tyseq(i',tys)) (C.TYVARTy(i,tyvar)) = let fun loop(tyvar'::tyvars', ty'::tys') = if tyvar' = tyvar then ty' else loop(tyvars', tys') | loop([],_) = Error.error(i, "unbound type variable") | loop(_,[]) = Error.error(i', "type sequence has wrong arity") in loop(tyvars, tys) end | replaceTy tyvarseq_tyseq (C.RECORDTy(I, tyrow_opt)) = C.RECORDTy(I, Option.map (replaceTyRow tyvarseq_tyseq) tyrow_opt) | replaceTy tyvarseq_tyseq (C.TYCONTy(I, tyseq', tycon)) = C.TYCONTy(I, replaceTyseq tyvarseq_tyseq tyseq', tycon) | replaceTy tyvarseq_tyseq (C.ARROWTy(I, ty1, ty2)) = C.ARROWTy(I, replaceTy tyvarseq_tyseq ty1, replaceTy tyvarseq_tyseq ty2) | replaceTy tyvarseq_tyseq (C.PARTy(I, ty)) = C.PARTy(I, replaceTy tyvarseq_tyseq ty) and replaceTyRow tyvarseq_tyseq (C.TyRow(I, lab, ty, tyrow_opt)) = C.TyRow(I, lab, replaceTy tyvarseq_tyseq ty, Option.map (replaceTyRow tyvarseq_tyseq) tyrow_opt) and replaceTyseq tyvarseq_tyseq (C.Tyseq(I, tys)) = C.Tyseq(I, List.map (replaceTy tyvarseq_tyseq) tys) fun rewriteTy typbind (ty as C.TYVARTy _) = ty | rewriteTy typbind (C.RECORDTy(I, tyrow_opt)) = C.RECORDTy(I, Option.map (rewriteTyRow typbind) tyrow_opt) | rewriteTy typbind (C.TYCONTy(I, tyseq, longtycon)) = let val tyseq' = rewriteTyseq typbind tyseq val (strids, tycon) = LongTyCon.explode longtycon in if not(List.null strids) then C.TYCONTy(I, tyseq', longtycon) else let val (tyvarseq', ty') = lookupTyCon(tycon, typbind) in replaceTy (tyvarseq',tyseq') ty' end handle Option => C.TYCONTy(I, tyseq', longtycon) end | rewriteTy typbind (C.ARROWTy(I, ty1, ty2)) = C.ARROWTy(I, rewriteTy typbind ty1, rewriteTy typbind ty2) | rewriteTy typbind (C.PARTy(I, ty)) = C.PARTy(I, rewriteTy typbind ty) and rewriteTyRow typbind (C.TyRow(I, lab, ty, tyrow_opt)) = C.TyRow(I, lab, rewriteTy typbind ty, Option.map (rewriteTyRow typbind) tyrow_opt) and rewriteTyseq typbind (C.Tyseq(I, tys)) = C.Tyseq(I, List.map (rewriteTy typbind) tys) fun rewriteConBind typbind (C.ConBind(I, op_opt, vid, ty_opt, conbind_opt))= C.ConBind(I, op_opt, vid, Option.map (rewriteTy typbind) ty_opt, Option.map (rewriteConBind typbind) conbind_opt) fun rewriteDatBind typbind (C.DatBind(I, tyvarseq, tycon, conbind, datbind_opt)) = C.DatBind(I, tyvarseq, tycon, rewriteConBind typbind conbind, Option.map (rewriteDatBind typbind) datbind_opt) (* Patterns [Figure 16] *) fun UNITAtPat(I) = C.RECORDAtPat(I, NONE) fun TUPLEAtPat(I, [pat]) = C.PARAtPat(I, pat) | TUPLEAtPat(I, pats) = let fun toPatRow(n, [] ) = NONE | toPatRow(n, pat::pats') = SOME(C.ROWPatRow(I, Lab.fromInt n, pat, toPatRow(n+1,pats'))) in C.RECORDAtPat(I, toPatRow(1, pats)) end fun LISTAtPat(I, pats) = let fun toPatList [] = NILPat(I) | toPatList(pat::pats') = C.CONPat(I, C.SANSOp, longvidCONS, TUPLEAtPat(I, [pat,toPatList pats'])) in C.PARAtPat(I, toPatList pats) end (* Pattern Rows [Figure 16] *) fun VIDPatRow(I, vid, ty_opt, pat_opt, patrow_opt) = let val lab = Lab.fromString(VId.toString vid) val vidPat = VIDPat(I, vid) val pat = case (ty_opt, pat_opt) of (NONE, NONE) => vidPat | (SOME ty, NONE) => C.TYPEDPat(I, vidPat, ty) | ( _ , SOME pat) => C.ASPat(I, C.SANSOp,vid,ty_opt,pat) in C.ROWPatRow(I, lab, pat, patrow_opt) end (* Expressions [Figure 15] *) fun UNITAtExp(I) = C.RECORDAtExp(I, NONE) fun TUPLEAtExp(I, [exp]) = C.PARAtExp(I, exp) | TUPLEAtExp(I, exps) = let fun toExpRow(n, [] ) = NONE | toExpRow(n, exp::exps') = SOME(C.ExpRow(I, Lab.fromInt n, exp, toExpRow(n+1, exps'))) in C.RECORDAtExp(I, toExpRow(1, exps)) end fun HASHAtExp(I, lab) = let val vid = VId.invent() val dots = C.WILDCARDPatRow(I) val patrow = C.ROWPatRow(I, lab, VIDPat(I, vid), SOME dots) val pat = C.ATPATPat(I, C.RECORDAtPat(I, SOME patrow)) val mrule = C.Mrule(I, pat, VIDExp(I, vid)) val match = C.Match(I, mrule, NONE) in C.PARAtExp(I, C.FNExp(I, match)) end fun CASEExp(I, exp, match) = let val function = C.ATEXPExp(I, C.PARAtExp(I, C.FNExp(I, match))) in C.APPExp(I, function, C.PARAtExp(I, exp)) end fun IFExp(I, exp1, exp2, exp3) = let val mruleTrue = C.Mrule(I, TRUEPat(I), exp2) val mruleFalse = C.Mrule(I, FALSEPat(I), exp3) val matchFalse = C.Match(I, mruleFalse, NONE) val matchTrue = C.Match(I, mruleTrue, SOME matchFalse) in CASEExp(I, exp1, matchTrue) end fun ORELSEExp (I, exp1, exp2) = IFExp(I, exp1, TRUEExp(I), exp2) fun ANDALSOExp(I, exp1, exp2) = IFExp(I, exp1, exp2, FALSEExp(I)) fun SEQAtExp(I, exps) = let val wildcard = C.ATPATPat(I, C.WILDCARDAtPat(I)) fun toExpSeq [] = raise Fail "DerivedFormsCore.SEQAtExp: \ \empty exp list" | toExpSeq [exp] = exp | toExpSeq(exp::exps') = let val mrule = C.Mrule(I, wildcard, toExpSeq exps') val match = C.Match(I, mrule, NONE) in CASEExp(I, exp, match) end in C.PARAtExp(I, toExpSeq exps) end fun LETAtExp(I, dec, [exp]) = C.LETAtExp(I, dec, exp) | LETAtExp(I, dec, exps) = C.LETAtExp(I, dec, C.ATEXPExp(I, SEQAtExp(I, exps))) fun WHILEExp(I, exp1, exp2) = let val vid = VId.invent() val vidExp = VIDExp(I, vid) val unitAtExp = UNITAtExp(I) val unitExp = C.ATEXPExp(I, unitAtExp) val callVid = C.APPExp(I, vidExp, unitAtExp) val seqExp = C.ATEXPExp(I, SEQAtExp(I, [exp2, callVid])) val fnBody = IFExp(I, exp1, seqExp, unitExp) val mrule = C.Mrule(I, C.ATPATPat(I, UNITAtPat(I)), fnBody) val match = C.Match(I, mrule, NONE) val fnExp = C.FNExp(I, match) val fnBind = C.PLAINValBind(I, VIDPat(I, vid), fnExp, NONE) val valbind = C.RECValBind(I, fnBind) val dec = C.VALDec(I, C.TyVarseq(I, []), valbind) in C.ATEXPExp(I, C.LETAtExp(I, dec, callVid)) end fun LISTAtExp(I, exps) = let fun toExpList [] = NILExp(I) | toExpList(exp::exps') = C.APPExp(I, CONSExp(I), TUPLEAtExp(I, [exp, toExpList exps'])) in C.PARAtExp(I, toExpList exps) end (* Type Expressions [Figure 16] *) fun TUPLETy(I, [ty]) = ty | TUPLETy(I, tys) = let fun toTyRow(n, [] ) = NONE | toTyRow(n, ty::tys') = SOME(C.TyRow(I, Lab.fromInt n, ty, toTyRow(n+1, tys'))) in C.RECORDTy(I, toTyRow(1, tys)) end (* Function-value Bindings [Figure 17] *) fun FvalBind(I, (match, vid, arity), fvalbind_opt) = let fun abstract(0, vidExps) = let val exp = C.ATEXPExp(I, TUPLEAtExp(I, List.rev vidExps)) in CASEExp(I, exp, match) end | abstract(n, vidExps) = let val vid = VId.invent() val exp = VIDExp(I, vid) val pat = VIDPat(I, vid) val mrule = C.Mrule(I, pat, abstract(n-1, exp::vidExps)) in C.FNExp(I, C.Match(I, mrule, NONE)) end val exp = abstract(arity, []) val pat = VIDPat(I, vid) in C.PLAINValBind(I, pat, exp, fvalbind_opt) end fun Fmatch(I, (mrule, vid, arity), NONE) = ( C.Match(I, mrule, NONE), vid, arity ) | Fmatch(I, (mrule, vid, arity), SOME(match, vid', arity')) = if vid <> vid' then Error.error(I, "inconsistent function identifier") else if arity <> arity' then Error.error(I, "inconsistent function arity") else ( C.Match(I, mrule, SOME match), vid, arity ) fun Fmrule(I, _, vid, atpats, ty_opt, exp) = let val pats = List.map (fn atpat => C.ATPATPat(I, atpat)) atpats val pat' = C.ATPATPat(I, TUPLEAtPat(I, pats)) val exp' = case ty_opt of NONE => exp | SOME ty => C.TYPEDExp(I, exp, ty) val arity = List.length atpats in ( C.Mrule(I, pat', exp'), vid, arity ) end (* Declarations [Figure 17] *) fun FUNDec(I, tyvarseq, fvalbind) = C.VALDec(I, tyvarseq, C.RECValBind(I, fvalbind)) fun DATATYPEDec(I, datbind, NONE) = C.DATATYPEDec(I, datbind) | DATATYPEDec(I, datbind, SOME typbind) = let val datbind' = rewriteDatBind typbind datbind in C.SEQDec(I, C.DATATYPEDec(C.infoDatBind datbind, datbind'), C.TYPEDec(C.infoTypBind typbind, typbind)) end fun ABSTYPEDec(I, datbind, NONE, dec) = C.ABSTYPEDec(I, datbind,dec) | ABSTYPEDec(I, datbind, SOME typbind, dec) = let val I' = C.infoTypBind typbind val datbind' = rewriteDatBind typbind datbind in C.ABSTYPEDec(I, datbind', C.SEQDec(I, C.TYPEDec(I', typbind), dec)) end end (* stop of DerivedFormsCore.sml *) (* start of DERIVED_FORMS_MODULE.sml *) (* * Standard ML modules derived forms * * Definition, Appendix A * * Notes: * - A phrase named SynDesc has been added to factorize type synonym * specifications. * - Similarly, a phrase named TyReaDesc has been added to factorize type * realisation signature expressions. * - The structure sharing derived form is missing since it cannot be resolved * syntactically. It has been moved to the bare grammar. *) signature DERIVED_FORMS_MODULE = sig (* Import *) type Info = GrammarModule.Info type VId = GrammarCore.VId type TyCon = GrammarCore.TyCon type StrId = GrammarCore.StrId type SigId = GrammarModule.SigId type FunId = GrammarModule.FunId type longTyCon = GrammarCore.longTyCon type Ty = GrammarCore.Ty type TyVarseq = GrammarCore.TyVarseq type StrExp = GrammarModule.StrExp type StrDec = GrammarModule.StrDec type StrBind = GrammarModule.StrBind type SigExp = GrammarModule.SigExp type TyReaDesc = (Info * TyVarseq * longTyCon * Ty) list type Spec = GrammarModule.Spec type SynDesc = (Info * TyVarseq * TyCon * Ty) list type FunBind = GrammarModule.FunBind (* Structure Bindings [Figure 18] *) val TRANSStrBind: Info * StrId * SigExp option * StrExp * StrBind option -> StrBind val OPAQStrBind: Info * StrId * SigExp * StrExp * StrBind option -> StrBind (* Structure Expressions [Figure 18] *) val APPDECStrExp: Info * FunId * StrDec -> StrExp (* Functor Bindings [Figure 18] *) val TRANSFunBind: Info * FunId * StrId * SigExp * SigExp option * StrExp * FunBind option -> FunBind val OPAQFunBind: Info * FunId * StrId * SigExp * SigExp * StrExp * FunBind option -> FunBind val TRANSSPECFunBind: Info * FunId * Spec * SigExp option * StrExp * FunBind option -> FunBind val OPAQSPECFunBind: Info * FunId * Spec * SigExp * StrExp * FunBind option -> FunBind (* Specifications [Figure 19] *) val SYNSpec: Info * SynDesc -> Spec val INCLUDEMULTISpec: Info * SigId list -> Spec val SynDesc: Info * TyVarseq * TyCon * Ty * SynDesc option -> SynDesc (* Signature Expressions [Figure 19] *) val WHERETYPESigExp: Info * SigExp * TyReaDesc -> SigExp val TyReaDesc: Info * TyVarseq * longTyCon * Ty * TyReaDesc option -> TyReaDesc end (* stop of DERIVED_FORMS_MODULE.sml *) (* start of DerivedFormsModule.sml *) (* * Standard ML modules derived forms * * Definition, Appendix A * * Notes: * - A phrase named SynDesc has been added to factorize type synonym * specifications. * - Similarly, a phrase named TyReaDesc has been added to factorize type * realisation signature expressions. * - The structure sharing derived form is missing since it cannot be resolved * syntactically. It has been moved to the bare grammar. *) structure DerivedFormsModule :> DERIVED_FORMS_MODULE = struct (* Import *) structure C = GrammarCore structure M = GrammarModule type Info = M.Info type VId = M.VId type TyCon = M.TyCon type StrId = M.StrId type SigId = M.SigId type FunId = M.FunId type longTyCon = M.longTyCon type Ty = M.Ty type TyVarseq = M.TyVarseq type StrExp = M.StrExp type StrDec = M.StrDec type StrBind = M.StrBind type SigExp = M.SigExp type TyReaDesc = (M.Info * M.TyVarseq * M.longTyCon * M.Ty) list type Spec = M.Spec type SynDesc = (M.Info * M.TyVarseq * M.TyCon * M.Ty) list type FunBind = M.FunBind (* Structure Bindings [Figure 18] *) fun TRANSStrBind(I, strid, NONE, strexp, strbind_opt) = M.StrBind(I, strid, strexp, strbind_opt) | TRANSStrBind(I, strid, SOME sigexp, strexp, strbind_opt) = M.StrBind(I, strid, M.TRANSStrExp(I, strexp, sigexp), strbind_opt) fun OPAQStrBind(I, strid, sigexp, strexp, strbind_opt) = M.StrBind(I, strid, M.OPAQStrExp(I, strexp, sigexp), strbind_opt) (* Structure Expressions [Figure 18] *) fun APPDECStrExp(I, funid, strdec) = M.APPStrExp(I, funid, M.STRUCTStrExp(M.infoStrDec strdec, strdec)) (* Functor Bindings [Figure 18] *) fun TRANSFunBind(I, funid, strid, sigexp, NONE, strexp, funbind_opt) = M.FunBind(I, funid, strid, sigexp, strexp, funbind_opt) | TRANSFunBind(I, funid, strid,sigexp, SOME sigexp', strexp, funbind_opt)= M.FunBind(I, funid, strid, sigexp, M.TRANSStrExp(I, strexp,sigexp'), funbind_opt) fun OPAQFunBind(I, funid, strid, sigexp, sigexp', strexp, funbind_opt) = M.FunBind(I, funid, strid, sigexp, M.OPAQStrExp(I, strexp, sigexp'), funbind_opt) fun TRANSSPECFunBind(I, funid, spec, sigexp_opt, strexp, funbind_opt) = let val I' = M.infoStrExp strexp val strid = StrId.invent() val sigexp = M.SIGSigExp(M.infoSpec spec, spec) val strdec = M.DECStrDec(I', C.OPENDec(I',[LongStrId.fromId strid])) val strexp'= case sigexp_opt of NONE => strexp | SOME sigexp' => M.TRANSStrExp(I', strexp, sigexp') val letexp = M.LETStrExp(I', strdec, strexp') in M.FunBind(I, funid, strid, sigexp, letexp, funbind_opt) end fun OPAQSPECFunBind(I, funid, spec, sigexp', strexp, funbind_opt) = let val I' = M.infoStrExp strexp val strid = StrId.invent() val sigexp = M.SIGSigExp(M.infoSpec spec, spec) val strdec = M.DECStrDec(I', C.OPENDec(I',[LongStrId.fromId strid])) val strexp'= M.TRANSStrExp(I', strexp, sigexp') val letexp = M.LETStrExp(I', strdec, strexp') in M.FunBind(I, funid, strid, sigexp, letexp, funbind_opt) end (* Specifications [Figure 19] *) fun SYNSpec(I, []) = M.EMPTYSpec(I) | SYNSpec(I, (I',tyvarseq,tycon,ty)::syns') = let val longtycon = LongTyCon.fromId tycon val typdesc = M.TypDesc(I', tyvarseq, tycon, NONE) val sigexp = M.SIGSigExp(I', M.TYPESpec(I', typdesc)) val sigexp' = M.WHERETYPESigExp(I', sigexp, tyvarseq, longtycon, ty) val spec1 = M.INCLUDESpec(I', sigexp') in M.SEQSpec(I, spec1, SYNSpec(I, syns')) end fun INCLUDEMULTISpec(I, [] ) = M.EMPTYSpec(I) | INCLUDEMULTISpec(I, sigid::sigids') = let val spec1 = M.INCLUDESpec(I, M.SIGIDSigExp(I, sigid)) in M.SEQSpec(I, spec1, INCLUDEMULTISpec(I, sigids')) end fun SynDesc(I, tyvarseq, tycon, ty, NONE) = (I, tyvarseq, tycon, ty) :: [] | SynDesc(I, tyvarseq, tycon, ty, SOME syndesc) = (I, tyvarseq, tycon, ty) :: syndesc (* Signature Expressions [Figure 19] *) fun WHERETYPESigExp(I, sigexp, [] ) = sigexp | WHERETYPESigExp(I, sigexp, (I',tyvarseq,longtycon,ty)::reas') = let val sigexp' = M.WHERETYPESigExp(I', sigexp, tyvarseq, longtycon, ty) in WHERETYPESigExp(I, sigexp', reas') end fun TyReaDesc(I, tyvarseq, longtycon, ty, NONE) = (I, tyvarseq, longtycon, ty) :: [] | TyReaDesc(I, tyvarseq, longtycon, ty, SOME tyreadesc) = (I, tyvarseq, longtycon, ty) :: tyreadesc end (* stop of DerivedFormsModule.sml *) (* start of DERIVED_FORMS_PROGRAM.sml *) (* * Standard ML program derived forms * * Definition, Appendix A *) signature DERIVED_FORMS_PROGRAM = sig (* Import *) type Info = GrammarProgram.Info type Exp = GrammarCore.Exp type TopDec = GrammarModule.TopDec type Program = GrammarProgram.Program (* Programs [Figure 18] *) val TOPDECProgram: Info * TopDec * Program option -> Program val EXPProgram: Info * Exp * Program option -> Program end (* stop of DERIVED_FORMS_PROGRAM.sml *) (* start of DerivedFormsProgram.sml *) (* * Standard ML program derived forms * * Definition, Appendix A *) structure DerivedFormsProgram :> DERIVED_FORMS_PROGRAM = struct (* Import *) structure C = GrammarCore structure M = GrammarModule structure P = GrammarProgram type Info = GrammarProgram.Info type Exp = GrammarCore.Exp type TopDec = GrammarModule.TopDec type Program = GrammarProgram.Program (* Programs [Figure 18] *) fun TOPDECProgram(I, topdec, program_opt) = P.Program(I, topdec, program_opt) fun EXPProgram(I, exp, program_opt) = let val longvid = LongVId.fromId(VId.fromString "it") val pat = C.ATPATPat(I, C.LONGVIDAtPat(I, C.SANSOp, longvid)) val valbind = C.PLAINValBind(I, pat, exp, NONE) val dec = C.VALDec(I, C.TyVarseq(I, []), valbind) val topdec = M.STRDECTopDec(I, M.DECStrDec(I, dec), NONE) in P.Program(I, topdec, program_opt) end end (* stop of DerivedFormsProgram.sml *) (* start of Parser.grm.sig *) signature Parser_TOKENS = sig type ('a,'b) token type svalue val LONGID: (string list*string) * 'a * 'a -> (svalue,'a) token val ETYVAR: (string) * 'a * 'a -> (svalue,'a) token val TYVAR: (string) * 'a * 'a -> (svalue,'a) token val STAR: 'a * 'a -> (svalue,'a) token val SYMBOL: (string) * 'a * 'a -> (svalue,'a) token val ALPHA: (string) * 'a * 'a -> (svalue,'a) token val CHAR: (char) * 'a * 'a -> (svalue,'a) token val STRING: (string) * 'a * 'a -> (svalue,'a) token val REAL: (real) * 'a * 'a -> (svalue,'a) token val WORD: (word) * 'a * 'a -> (svalue,'a) token val INT: (int) * 'a * 'a -> (svalue,'a) token val NUMERIC: (int) * 'a * 'a -> (svalue,'a) token val DIGIT: (int) * 'a * 'a -> (svalue,'a) token val ZERO: 'a * 'a -> (svalue,'a) token val COLONGREATER: 'a * 'a -> (svalue,'a) token val WHERE: 'a * 'a -> (svalue,'a) token val STRUCTURE: 'a * 'a -> (svalue,'a) token val STRUCT: 'a * 'a -> (svalue,'a) token val SIGNATURE: 'a * 'a -> (svalue,'a) token val SIG: 'a * 'a -> (svalue,'a) token val SHARING: 'a * 'a -> (svalue,'a) token val INCLUDE: 'a * 'a -> (svalue,'a) token val FUNCTOR: 'a * 'a -> (svalue,'a) token val EQTYPE: 'a * 'a -> (svalue,'a) token val HASH: 'a * 'a -> (svalue,'a) token val ARROW: 'a * 'a -> (svalue,'a) token val DARROW: 'a * 'a -> (svalue,'a) token val EQUALS: 'a * 'a -> (svalue,'a) token val BAR: 'a * 'a -> (svalue,'a) token val UNDERBAR: 'a * 'a -> (svalue,'a) token val DOTS: 'a * 'a -> (svalue,'a) token val SEMICOLON: 'a * 'a -> (svalue,'a) token val COLON: 'a * 'a -> (svalue,'a) token val COMMA: 'a * 'a -> (svalue,'a) token val RBRACE: 'a * 'a -> (svalue,'a) token val LBRACE: 'a * 'a -> (svalue,'a) token val RBRACK: 'a * 'a -> (svalue,'a) token val LBRACK: 'a * 'a -> (svalue,'a) token val RPAR: 'a * 'a -> (svalue,'a) token val LPAR: 'a * 'a -> (svalue,'a) token val WHILE: 'a * 'a -> (svalue,'a) token val WITHTYPE: 'a * 'a -> (svalue,'a) token val WITH: 'a * 'a -> (svalue,'a) token val VAL: 'a * 'a -> (svalue,'a) token val TYPE: 'a * 'a -> (svalue,'a) token val THEN: 'a * 'a -> (svalue,'a) token val REC: 'a * 'a -> (svalue,'a) token val RAISE: 'a * 'a -> (svalue,'a) token val ORELSE: 'a * 'a -> (svalue,'a) token val OPEN: 'a * 'a -> (svalue,'a) token val OP: 'a * 'a -> (svalue,'a) token val OF: 'a * 'a -> (svalue,'a) token val NONFIX: 'a * 'a -> (svalue,'a) token val LOCAL: 'a * 'a -> (svalue,'a) token val LET: 'a * 'a -> (svalue,'a) token val INFIXR: 'a * 'a -> (svalue,'a) token val INFIX: 'a * 'a -> (svalue,'a) token val IN: 'a * 'a -> (svalue,'a) token val IF: 'a * 'a -> (svalue,'a) token val HANDLE: 'a * 'a -> (svalue,'a) token val FUN: 'a * 'a -> (svalue,'a) token val FN: 'a * 'a -> (svalue,'a) token val EXCEPTION: 'a * 'a -> (svalue,'a) token val END: 'a * 'a -> (svalue,'a) token val ELSE: 'a * 'a -> (svalue,'a) token val DATATYPE: 'a * 'a -> (svalue,'a) token val DO: 'a * 'a -> (svalue,'a) token val CASE: 'a * 'a -> (svalue,'a) token val AS: 'a * 'a -> (svalue,'a) token val ANDALSO: 'a * 'a -> (svalue,'a) token val AND: 'a * 'a -> (svalue,'a) token val ABSTYPE: 'a * 'a -> (svalue,'a) token val EOF: 'a * 'a -> (svalue,'a) token end signature Parser_LRVALS= sig structure Tokens : Parser_TOKENS structure ParserData:PARSER_DATA sharing type ParserData.Token.token = Tokens.token sharing type ParserData.svalue = Tokens.svalue end (* stop of Parser.grm.sig *) (* start of Parser.grm.sml *) functor LrValsFn(structure Token: TOKEN) = struct structure ParserData= struct structure Header = struct (* *) (* Standard ML syntactical analysis *) (* *) (* Definition, sections 2, 3, and 8, Appendix A and B *) (* *) (* Notes: *) (* - Two phrases named Fmatch and Fmrule have been added to factorize *) (* Fvalbind. *) (* - A phrase named SynDesc has been added to factorize type synonym *) (* specifications. Similarly, a phrase named TyReaDesc has been added to *) (* factorize type realisation signature expressions. *) (* - Infix expressions [Definition, section 2.6] are resolved externally in *) (* structure Infix. The parser just maintains the infix environment J by *) (* side effect. To achieve correct treatment of scoped fixity directives, *) (* a stack of environments is used. To handle `local' we even need a *) (* second environment J' (together with a a second stack). *) (* - Syntactic restrictions [Definition, sections 2.9 and 3.5] are checked *) (* during elaboration, as well as the Fvalbind derived form. *) (* - The Definition is not clear about whether `=' should also be legal as *) (* a tycon. Since this would result in massive conflicts, and a type named *) (* `=' could only be used legally if an implementation would be mad enough *) (* to predefine it anyway, we simply disallow it. *) (* - The Definition is also vague about what consists a non-infixed occurance *) (* of an infix identifier: we assume any occurances in expressions *) (* or patterns. This implies that uses of the keyword `op' in constructor *) (* and exception bindings are completely redundant. *) (* - Datatype replication requires rules for datatype to be duplicated to *) (* avoid conflicts on empty tyvarseqs. *) (* - Layered patterns require some grammar transformation hack, see pat. *) (* - The messy `sigexp where type ... and type ...' syntax requires some *) (* really ugly transformations (in absence of a lookahead of 2), watch out *) (* for non-terminals of the form xxx__AND_yyybind_opt. *) (* - ML-Yacc does not seem to like comments that stretch over several *) (* lines... Similarly, comments in semantic actions make it puke... *) (* *) (* Bugs: *) (* - We do NOT support declarations like *) (* fun f p1 = case e1 of p2 => e2 *) (* | f p3 = e3 *) (* (without parentheses around the case) because the transformations *) (* required to support this would be even a magnitude uglier than those *) (* above. In fact, no compiler I know of supports this. *) (* *) (* Import *) open GrammarCore open GrammarModule open GrammarProgram open DerivedFormsCore open DerivedFormsModule open DerivedFormsProgram (* Helper to build info fields *) fun I(left, right) = if right = 0 then (left, left) else (left, right) (* Handling infix environments *) val J = ref Infix.empty (* context *) val J' = ref Infix.empty (* local environment (+ enclosing one) *) val stackJ = ref [] : Infix.InfEnv list ref val stackJ' = ref [] : Infix.InfEnv list ref fun initJandJ'(J0) = ( J := J0; J' := J0; stackJ := []; stackJ' := [] ) fun pushJ() = ( stackJ := !J :: !stackJ ) fun popJ() = ( J := List.hd(!stackJ); stackJ := List.tl(!stackJ) ) fun pushJ'shiftJ() = ( stackJ' := !J' :: !stackJ'; J' := List.hd(!stackJ) ) fun popJandJ'() = ( J := !J'; J' := List.hd(!stackJ'); stackJ := List.tl(!stackJ); stackJ' := List.tl(!stackJ') ) fun assignInfix(infstatus, vids) = ( J := Infix.assign(!J, vids, infstatus); J' := Infix.assign(!J', vids, infstatus) ) fun cancelInfix(vids) = ( J := Infix.cancel(!J, vids); J' := Infix.cancel(!J', vids) ) (* Helper for long identifiers *) fun toLongId toId (strids, id) = ( List.map StrId.fromString strids, toId id ) (* Helper to handle typed patterns (needed because of layered patterns) *) fun typedPat(pat, [] ) = pat | typedPat(pat, ty::tys) = let val I = Source.over(infoPat pat, infoTy ty) in typedPat(TYPEDPat(I, pat, ty), tys) end end structure LrTable = Token.LrTable structure Token = Token local open LrTable in val table=let val actionRows = "\ \\001\000\001\000\000\000\000\000\ \\001\000\001\000\184\003\002\000\049\000\006\000\048\000\008\000\047\000\ \\011\000\046\000\012\000\045\000\013\000\044\000\015\000\043\000\ \\017\000\042\000\018\000\041\000\019\000\040\000\020\000\039\000\ \\021\000\038\000\023\000\037\000\024\000\036\000\026\000\035\000\ \\029\000\034\000\030\000\033\000\033\000\032\000\034\000\031\000\ \\036\000\030\000\038\000\029\000\042\000\174\003\046\000\151\002\ \\049\000\028\000\051\000\027\000\055\000\026\000\057\000\025\000\ \\060\000\024\000\061\000\023\000\062\000\022\000\063\000\021\000\ \\064\000\020\000\065\000\019\000\066\000\018\000\067\000\017\000\ \\068\000\151\002\069\000\151\002\070\000\151\002\073\000\151\002\000\000\ \\001\000\002\000\139\002\003\000\139\002\008\000\139\002\010\000\139\002\ \\011\000\139\002\013\000\139\002\016\000\139\002\017\000\139\002\ \\018\000\139\002\020\000\139\002\021\000\139\002\024\000\139\002\ \\029\000\139\002\030\000\139\002\034\000\141\002\035\000\139\002\ \\041\000\139\002\042\000\139\002\051\000\139\002\055\000\139\002\ \\057\000\139\002\059\000\139\002\000\000\ \\001\000\002\000\178\002\003\000\178\002\004\000\178\002\007\000\178\002\ \\008\000\178\002\009\000\178\002\010\000\178\002\011\000\178\002\ \\013\000\178\002\014\000\178\002\016\000\178\002\017\000\178\002\ \\018\000\178\002\019\000\040\000\020\000\178\002\021\000\178\002\ \\022\000\178\002\023\000\037\000\024\000\178\002\025\000\178\002\ \\028\000\178\002\029\000\178\002\030\000\178\002\034\000\031\000\ \\035\000\178\002\036\000\030\000\037\000\178\002\038\000\029\000\ \\039\000\178\002\040\000\178\002\041\000\178\002\042\000\178\002\ \\045\000\178\002\046\000\151\002\049\000\028\000\051\000\178\002\ \\055\000\178\002\057\000\178\002\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\068\000\151\002\069\000\151\002\ \\070\000\151\002\073\000\151\002\000\000\ \\001\000\002\000\034\003\003\000\034\003\004\000\034\003\005\000\034\003\ \\007\000\034\003\008\000\034\003\009\000\034\003\010\000\034\003\ \\011\000\034\003\013\000\034\003\014\000\034\003\016\000\034\003\ \\017\000\034\003\018\000\034\003\020\000\034\003\021\000\034\003\ \\022\000\034\003\024\000\034\003\025\000\034\003\028\000\034\003\ \\029\000\034\003\030\000\034\003\031\000\034\003\032\000\034\003\ \\035\000\034\003\037\000\034\003\039\000\034\003\040\000\034\003\ \\041\000\034\003\042\000\034\003\045\000\034\003\046\000\034\003\ \\047\000\034\003\048\000\034\003\050\000\034\003\051\000\034\003\ \\052\000\034\003\053\000\034\003\055\000\034\003\057\000\034\003\ \\058\000\034\003\059\000\034\003\068\000\045\003\069\000\045\003\ \\070\000\248\000\073\000\045\003\000\000\ \\001\000\002\000\075\003\003\000\148\001\008\000\075\003\010\000\075\003\ \\011\000\075\003\013\000\075\003\016\000\075\003\017\000\075\003\ \\018\000\075\003\020\000\075\003\021\000\075\003\024\000\075\003\ \\029\000\075\003\030\000\075\003\035\000\075\003\041\000\056\003\ \\042\000\075\003\051\000\075\003\055\000\075\003\057\000\075\003\ \\059\000\056\003\000\000\ \\001\000\002\000\075\003\003\000\148\001\008\000\075\003\010\000\075\003\ \\011\000\075\003\013\000\075\003\016\000\075\003\017\000\075\003\ \\018\000\075\003\020\000\075\003\021\000\075\003\024\000\075\003\ \\029\000\075\003\030\000\075\003\035\000\075\003\041\000\086\003\ \\042\000\075\003\051\000\075\003\055\000\075\003\057\000\075\003\ \\058\000\086\003\059\000\086\003\000\000\ \\001\000\002\000\075\003\003\000\097\002\008\000\075\003\010\000\075\003\ \\011\000\075\003\013\000\075\003\016\000\075\003\017\000\075\003\ \\018\000\075\003\020\000\075\003\021\000\075\003\024\000\075\003\ \\029\000\075\003\030\000\075\003\035\000\075\003\041\000\101\003\ \\042\000\075\003\051\000\075\003\055\000\075\003\057\000\075\003\ \\058\000\101\003\059\000\101\003\000\000\ \\001\000\002\000\093\003\003\000\086\001\008\000\093\003\011\000\093\003\ \\013\000\093\003\017\000\093\003\018\000\093\003\020\000\093\003\ \\021\000\093\003\024\000\093\003\029\000\093\003\030\000\093\003\ \\042\000\093\003\051\000\093\003\055\000\093\003\057\000\093\003\ \\058\000\086\003\000\000\ \\001\000\002\000\093\003\003\000\077\002\008\000\093\003\011\000\093\003\ \\013\000\093\003\017\000\093\003\018\000\093\003\020\000\093\003\ \\021\000\093\003\024\000\093\003\029\000\093\003\030\000\093\003\ \\042\000\093\003\051\000\093\003\055\000\093\003\057\000\093\003\ \\058\000\101\003\000\000\ \\001\000\002\000\164\003\003\000\032\002\008\000\164\003\011\000\164\003\ \\013\000\164\003\017\000\164\003\018\000\164\003\020\000\164\003\ \\021\000\164\003\024\000\164\003\029\000\164\003\030\000\164\003\ \\041\000\056\003\042\000\164\003\051\000\164\003\055\000\164\003\ \\057\000\164\003\059\000\056\003\000\000\ \\001\000\002\000\164\003\003\000\032\002\008\000\164\003\011\000\164\003\ \\013\000\164\003\017\000\164\003\018\000\164\003\020\000\164\003\ \\021\000\164\003\024\000\164\003\029\000\164\003\030\000\164\003\ \\041\000\086\003\042\000\164\003\051\000\164\003\055\000\164\003\ \\057\000\164\003\058\000\086\003\059\000\086\003\000\000\ \\001\000\002\000\164\003\003\000\108\002\008\000\164\003\011\000\164\003\ \\013\000\164\003\017\000\164\003\018\000\164\003\020\000\164\003\ \\021\000\164\003\024\000\164\003\029\000\164\003\030\000\164\003\ \\041\000\101\003\042\000\164\003\051\000\164\003\055\000\164\003\ \\057\000\164\003\058\000\101\003\059\000\101\003\000\000\ \\001\000\002\000\049\000\006\000\048\000\008\000\047\000\011\000\046\000\ \\012\000\045\000\013\000\044\000\015\000\043\000\017\000\042\000\ \\018\000\041\000\019\000\040\000\020\000\039\000\021\000\038\000\ \\023\000\037\000\024\000\036\000\026\000\035\000\029\000\034\000\ \\030\000\033\000\033\000\032\000\034\000\031\000\036\000\030\000\ \\038\000\029\000\042\000\174\003\046\000\151\002\049\000\028\000\ \\051\000\027\000\055\000\026\000\057\000\025\000\060\000\024\000\ \\061\000\023\000\062\000\022\000\063\000\021\000\064\000\020\000\ \\065\000\019\000\066\000\018\000\067\000\017\000\068\000\151\002\ \\069\000\151\002\070\000\151\002\073\000\151\002\000\000\ \\001\000\003\000\005\002\008\000\152\003\010\000\152\003\011\000\152\003\ \\029\000\152\003\030\000\152\003\035\000\152\003\050\000\152\003\ \\052\000\152\003\053\000\152\003\057\000\152\003\058\000\086\003\000\000\ \\001\000\003\000\101\002\008\000\152\003\010\000\152\003\011\000\152\003\ \\029\000\152\003\030\000\152\003\035\000\152\003\050\000\152\003\ \\052\000\152\003\053\000\152\003\057\000\152\003\058\000\101\003\000\000\ \\001\000\004\000\059\000\007\000\183\000\014\000\058\000\025\000\057\000\ \\041\000\056\000\000\000\ \\001\000\004\000\059\000\009\000\131\001\014\000\058\000\025\000\057\000\ \\041\000\056\000\000\000\ \\001\000\004\000\059\000\014\000\058\000\022\000\242\000\025\000\057\000\ \\041\000\056\000\000\000\ \\001\000\004\000\059\000\014\000\058\000\025\000\057\000\028\000\224\000\ \\041\000\056\000\000\000\ \\001\000\004\000\059\000\014\000\058\000\025\000\057\000\035\000\180\000\ \\040\000\179\000\041\000\056\000\042\000\178\000\000\000\ \\001\000\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\ \\042\000\055\000\000\000\ \\001\000\005\000\133\002\039\000\133\002\040\000\133\002\041\000\133\002\ \\046\000\126\002\000\000\ \\001\000\005\000\134\002\039\000\134\002\040\000\134\002\041\000\134\002\ \\046\000\127\002\000\000\ \\001\000\005\000\135\002\039\000\135\002\040\000\135\002\041\000\135\002\ \\046\000\128\002\000\000\ \\001\000\005\000\012\003\035\000\029\003\037\000\029\003\039\000\029\003\ \\040\000\029\003\041\000\186\000\046\000\029\003\047\000\029\003\000\000\ \\001\000\005\000\013\003\023\000\144\002\034\000\144\002\035\000\144\002\ \\036\000\144\002\037\000\144\002\038\000\144\002\039\000\144\002\ \\040\000\144\002\041\000\031\001\044\000\144\002\046\000\144\002\ \\047\000\144\002\060\000\144\002\061\000\144\002\062\000\144\002\ \\063\000\144\002\064\000\144\002\065\000\144\002\066\000\144\002\ \\067\000\144\002\068\000\144\002\069\000\144\002\070\000\144\002\ \\073\000\144\002\000\000\ \\001\000\005\000\118\001\000\000\ \\001\000\006\000\048\000\012\000\045\000\015\000\043\000\019\000\040\000\ \\023\000\037\000\026\000\035\000\033\000\032\000\034\000\031\000\ \\036\000\030\000\037\000\163\002\038\000\029\000\046\000\151\002\ \\049\000\028\000\060\000\024\000\061\000\023\000\062\000\022\000\ \\063\000\021\000\064\000\020\000\065\000\019\000\066\000\018\000\ \\067\000\017\000\068\000\151\002\069\000\151\002\070\000\151\002\ \\073\000\151\002\000\000\ \\001\000\008\000\233\001\068\000\067\000\069\000\066\000\070\000\065\000\000\000\ \\001\000\010\000\157\001\000\000\ \\001\000\010\000\198\001\000\000\ \\001\000\010\000\238\001\000\000\ \\001\000\010\000\020\002\000\000\ \\001\000\010\000\027\002\000\000\ \\001\000\010\000\070\002\000\000\ \\001\000\010\000\072\002\000\000\ \\001\000\016\000\045\001\000\000\ \\001\000\016\000\047\001\000\000\ \\001\000\016\000\190\001\000\000\ \\001\000\016\000\251\001\000\000\ \\001\000\019\000\081\001\056\000\080\001\068\000\079\001\073\000\118\000\000\000\ \\001\000\023\000\037\000\034\000\142\000\035\000\018\003\036\000\107\000\ \\037\000\018\003\038\000\106\000\039\000\018\003\040\000\018\003\ \\044\000\105\000\046\000\018\003\047\000\018\003\060\000\024\000\ \\061\000\023\000\062\000\022\000\063\000\021\000\064\000\020\000\ \\065\000\019\000\066\000\018\000\067\000\017\000\068\000\151\002\ \\069\000\151\002\070\000\151\002\073\000\151\002\000\000\ \\001\000\023\000\037\000\034\000\142\000\035\000\026\003\036\000\107\000\ \\037\000\026\003\038\000\106\000\039\000\026\003\040\000\026\003\ \\041\000\026\003\044\000\105\000\046\000\026\003\047\000\026\003\ \\060\000\024\000\061\000\023\000\062\000\022\000\063\000\021\000\ \\064\000\020\000\065\000\019\000\066\000\018\000\067\000\017\000\ \\068\000\151\002\069\000\151\002\070\000\151\002\073\000\151\002\000\000\ \\001\000\023\000\037\000\034\000\142\000\036\000\107\000\037\000\003\003\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\068\000\151\002\069\000\151\002\ \\070\000\151\002\073\000\151\002\000\000\ \\001\000\029\000\096\001\068\000\071\000\073\000\118\000\000\000\ \\001\000\029\000\155\001\000\000\ \\001\000\029\000\160\001\000\000\ \\001\000\029\000\160\001\068\000\074\000\000\000\ \\001\000\029\000\162\001\068\000\071\000\073\000\118\000\000\000\ \\001\000\029\000\024\002\000\000\ \\001\000\029\000\024\002\068\000\071\000\000\000\ \\001\000\029\000\040\002\000\000\ \\001\000\029\000\040\002\068\000\071\000\000\000\ \\001\000\029\000\088\002\000\000\ \\001\000\029\000\088\002\068\000\077\000\000\000\ \\001\000\031\000\066\001\000\000\ \\001\000\034\000\113\000\068\000\150\000\069\000\149\000\071\000\104\000\000\000\ \\001\000\034\000\173\000\000\000\ \\001\000\034\000\151\001\000\000\ \\001\000\035\000\181\000\000\000\ \\001\000\035\000\182\000\000\000\ \\001\000\035\000\038\001\000\000\ \\001\000\035\000\040\001\040\000\039\001\000\000\ \\001\000\035\000\041\001\000\000\ \\001\000\035\000\071\001\000\000\ \\001\000\035\000\073\001\040\000\072\001\000\000\ \\001\000\035\000\090\001\000\000\ \\001\000\035\000\217\001\058\000\082\001\000\000\ \\001\000\035\000\246\001\000\000\ \\001\000\035\000\249\001\041\000\248\001\059\000\247\001\000\000\ \\001\000\037\000\177\000\000\000\ \\001\000\037\000\037\001\000\000\ \\001\000\039\000\174\000\000\000\ \\001\000\039\000\033\001\000\000\ \\001\000\039\000\069\001\000\000\ \\001\000\041\000\070\001\000\000\ \\001\000\041\000\091\001\000\000\ \\001\000\041\000\150\001\059\000\149\001\000\000\ \\001\000\041\000\166\001\000\000\ \\001\000\041\000\173\001\000\000\ \\001\000\041\000\034\002\059\000\033\002\000\000\ \\001\000\042\000\050\000\000\000\ \\001\000\043\000\200\000\061\000\083\000\062\000\082\000\068\000\199\000\ \\069\000\198\000\070\000\197\000\000\000\ \\001\000\046\000\068\000\068\000\067\000\069\000\066\000\070\000\065\000\ \\073\000\064\000\000\000\ \\001\000\046\000\122\000\068\000\067\000\069\000\066\000\070\000\065\000\000\000\ \\001\000\046\000\172\000\000\000\ \\001\000\046\000\175\000\000\000\ \\001\000\046\000\187\000\000\000\ \\001\000\046\000\241\000\000\000\ \\001\000\046\000\255\000\000\000\ \\001\000\046\000\035\001\000\000\ \\001\000\046\000\043\001\000\000\ \\001\000\046\000\050\001\000\000\ \\001\000\046\000\059\001\000\000\ \\001\000\046\000\065\001\000\000\ \\001\000\046\000\083\001\058\000\082\001\000\000\ \\001\000\046\000\167\001\000\000\ \\001\000\046\000\177\001\000\000\ \\001\000\046\000\215\001\000\000\ \\001\000\046\000\223\001\000\000\ \\001\000\046\000\227\001\000\000\ \\001\000\046\000\230\001\000\000\ \\001\000\046\000\001\002\058\000\082\001\000\000\ \\001\000\046\000\029\002\000\000\ \\001\000\046\000\030\002\000\000\ \\001\000\046\000\036\002\000\000\ \\001\000\046\000\063\002\058\000\082\001\000\000\ \\001\000\046\000\083\002\000\000\ \\001\000\046\000\084\002\000\000\ \\001\000\046\000\089\002\000\000\ \\001\000\046\000\103\002\000\000\ \\001\000\047\000\233\000\000\000\ \\001\000\054\000\003\001\068\000\074\000\000\000\ \\001\000\058\000\087\001\000\000\ \\001\000\058\000\006\002\000\000\ \\001\000\061\000\083\000\062\000\082\000\068\000\081\000\069\000\080\000\ \\070\000\079\000\000\000\ \\001\000\068\000\067\000\069\000\066\000\070\000\065\000\000\000\ \\001\000\068\000\067\000\069\000\066\000\070\000\065\000\073\000\064\000\000\000\ \\001\000\068\000\067\000\069\000\066\000\070\000\065\000\073\000\192\000\000\000\ \\001\000\068\000\071\000\000\000\ \\001\000\068\000\071\000\073\000\118\000\000\000\ \\001\000\068\000\074\000\000\000\ \\001\000\068\000\077\000\000\000\ \\001\000\068\000\150\000\069\000\149\000\000\000\ \\001\000\068\000\150\000\069\000\149\000\073\000\247\000\000\000\ \\001\000\071\000\104\000\000\000\ \\111\002\000\000\ \\112\002\000\000\ \\113\002\000\000\ \\113\002\041\000\248\001\059\000\247\001\000\000\ \\114\002\000\000\ \\115\002\000\000\ \\116\002\000\000\ \\117\002\000\000\ \\118\002\000\000\ \\119\002\000\000\ \\120\002\000\000\ \\121\002\000\000\ \\122\002\000\000\ \\123\002\000\000\ \\124\002\000\000\ \\125\002\000\000\ \\126\002\000\000\ \\127\002\000\000\ \\128\002\000\000\ \\129\002\000\000\ \\130\002\000\000\ \\131\002\000\000\ \\132\002\000\000\ \\133\002\000\000\ \\134\002\000\000\ \\135\002\000\000\ \\136\002\000\000\ \\137\002\000\000\ \\138\002\000\000\ \\139\002\000\000\ \\140\002\000\000\ \\141\002\000\000\ \\142\002\000\000\ \\143\002\000\000\ \\144\002\000\000\ \\145\002\000\000\ \\145\002\041\000\186\000\000\000\ \\146\002\000\000\ \\147\002\000\000\ \\148\002\000\000\ \\149\002\000\000\ \\150\002\000\000\ \\151\002\006\000\048\000\012\000\045\000\015\000\043\000\019\000\040\000\ \\023\000\037\000\026\000\035\000\033\000\032\000\034\000\031\000\ \\035\000\093\000\036\000\030\000\038\000\029\000\049\000\028\000\ \\060\000\024\000\061\000\023\000\062\000\022\000\063\000\021\000\ \\064\000\020\000\065\000\019\000\066\000\018\000\067\000\017\000\000\000\ \\151\002\006\000\048\000\012\000\045\000\015\000\043\000\019\000\040\000\ \\023\000\037\000\026\000\035\000\033\000\032\000\034\000\031\000\ \\036\000\030\000\038\000\029\000\049\000\028\000\060\000\024\000\ \\061\000\023\000\062\000\022\000\063\000\021\000\064\000\020\000\ \\065\000\019\000\066\000\018\000\067\000\017\000\000\000\ \\151\002\008\000\063\001\023\000\037\000\000\000\ \\151\002\023\000\037\000\000\000\ \\151\002\023\000\037\000\027\000\109\000\034\000\108\000\036\000\107\000\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\071\000\104\000\000\000\ \\151\002\023\000\037\000\027\000\109\000\034\000\142\000\036\000\107\000\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\000\000\ \\151\002\023\000\037\000\034\000\108\000\036\000\107\000\038\000\106\000\ \\044\000\105\000\060\000\024\000\061\000\023\000\062\000\022\000\ \\063\000\021\000\064\000\020\000\065\000\019\000\066\000\018\000\ \\067\000\017\000\071\000\104\000\000\000\ \\151\002\023\000\037\000\034\000\142\000\035\000\208\000\036\000\107\000\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\000\000\ \\151\002\023\000\037\000\034\000\142\000\035\000\208\000\036\000\107\000\ \\038\000\106\000\044\000\105\000\060\000\024\000\061\000\023\000\ \\062\000\022\000\063\000\021\000\064\000\020\000\065\000\019\000\ \\066\000\018\000\067\000\017\000\071\000\104\000\000\000\ \\151\002\023\000\037\000\034\000\142\000\036\000\107\000\038\000\106\000\ \\044\000\105\000\060\000\024\000\061\000\023\000\062\000\022\000\ \\063\000\021\000\064\000\020\000\065\000\019\000\066\000\018\000\ \\067\000\017\000\000\000\ \\152\002\000\000\ \\153\002\000\000\ \\154\002\000\000\ \\155\002\000\000\ \\156\002\000\000\ \\157\002\000\000\ \\158\002\000\000\ \\159\002\000\000\ \\160\002\000\000\ \\161\002\000\000\ \\162\002\000\000\ \\164\002\000\000\ \\165\002\004\000\059\000\014\000\058\000\025\000\057\000\040\000\176\000\ \\041\000\056\000\000\000\ \\166\002\000\000\ \\167\002\000\000\ \\168\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\ \\042\000\188\001\000\000\ \\169\002\000\000\ \\170\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\ \\042\000\178\000\000\000\ \\171\002\000\000\ \\172\002\000\000\ \\173\002\004\000\059\000\014\000\058\000\025\000\057\000\040\000\114\001\ \\041\000\056\000\000\000\ \\174\002\000\000\ \\175\002\061\000\083\000\062\000\082\000\068\000\081\000\069\000\080\000\ \\070\000\079\000\000\000\ \\176\002\000\000\ \\177\002\000\000\ \\179\002\000\000\ \\180\002\000\000\ \\181\002\004\000\059\000\041\000\056\000\000\000\ \\182\002\004\000\059\000\025\000\057\000\041\000\056\000\000\000\ \\183\002\000\000\ \\184\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\185\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\186\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\187\002\000\000\ \\188\002\000\000\ \\189\002\000\000\ \\190\002\000\000\ \\191\002\045\000\235\000\000\000\ \\192\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\193\002\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\221\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\042\000\220\000\000\000\ \\194\002\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\221\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\042\000\220\000\000\000\ \\195\002\000\000\ \\196\002\000\000\ \\197\002\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\221\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\000\000\ \\198\002\000\000\ \\199\002\000\000\ \\200\002\000\000\ \\201\002\000\000\ \\202\002\000\000\ \\203\002\000\000\ \\204\002\000\000\ \\205\002\000\000\ \\206\002\000\000\ \\207\002\000\000\ \\208\002\000\000\ \\209\002\000\000\ \\210\002\000\000\ \\211\002\000\000\ \\212\002\000\000\ \\213\002\000\000\ \\214\002\032\000\239\000\000\000\ \\215\002\000\000\ \\216\002\046\000\122\000\068\000\067\000\069\000\066\000\070\000\065\000\000\000\ \\217\002\000\000\ \\218\002\068\000\071\000\073\000\118\000\000\000\ \\219\002\000\000\ \\220\002\060\000\128\000\061\000\127\000\000\000\ \\221\002\000\000\ \\222\002\000\000\ \\223\002\000\000\ \\224\002\003\000\117\001\004\000\059\000\014\000\058\000\025\000\057\000\ \\041\000\056\000\000\000\ \\225\002\000\000\ \\226\002\000\000\ \\227\002\003\000\232\000\000\000\ \\228\002\000\000\ \\229\002\000\000\ \\230\002\045\000\230\000\000\000\ \\231\002\004\000\059\000\014\000\058\000\025\000\057\000\041\000\056\000\000\000\ \\232\002\000\000\ \\233\002\000\000\ \\234\002\003\000\186\001\000\000\ \\235\002\000\000\ \\236\002\000\000\ \\237\002\000\000\ \\238\002\000\000\ \\239\002\003\000\139\001\000\000\ \\240\002\000\000\ \\241\002\000\000\ \\242\002\045\000\242\001\000\000\ \\243\002\000\000\ \\244\002\022\000\058\001\000\000\ \\244\002\022\000\058\001\046\000\057\001\000\000\ \\245\002\000\000\ \\246\002\000\000\ \\247\002\000\000\ \\248\002\003\000\134\001\000\000\ \\249\002\000\000\ \\249\002\041\000\186\000\000\000\ \\250\002\000\000\ \\251\002\000\000\ \\252\002\000\000\ \\253\002\000\000\ \\254\002\000\000\ \\255\002\000\000\ \\000\003\000\000\ \\001\003\000\000\ \\002\003\000\000\ \\004\003\000\000\ \\005\003\040\000\036\001\000\000\ \\006\003\000\000\ \\007\003\000\000\ \\008\003\000\000\ \\009\003\000\000\ \\010\003\000\000\ \\011\003\040\000\182\001\000\000\ \\012\003\000\000\ \\013\003\041\000\227\000\000\000\ \\014\003\000\000\ \\015\003\005\000\121\001\000\000\ \\016\003\000\000\ \\017\003\043\000\200\000\061\000\083\000\062\000\082\000\068\000\199\000\ \\069\000\198\000\070\000\197\000\000\000\ \\019\003\041\000\186\000\000\000\ \\020\003\000\000\ \\021\003\000\000\ \\022\003\000\000\ \\023\003\000\000\ \\024\003\000\000\ \\025\003\000\000\ \\027\003\000\000\ \\028\003\000\000\ \\029\003\041\000\186\000\000\000\ \\030\003\048\000\249\000\000\000\ \\031\003\000\000\ \\032\003\000\000\ \\033\003\000\000\ \\035\003\000\000\ \\036\003\000\000\ \\037\003\000\000\ \\038\003\000\000\ \\039\003\000\000\ \\040\003\000\000\ \\041\003\000\000\ \\042\003\040\000\200\001\000\000\ \\043\003\000\000\ \\044\003\061\000\083\000\062\000\082\000\068\000\081\000\069\000\080\000\ \\070\000\079\000\000\000\ \\046\003\034\000\165\000\038\000\164\000\071\000\104\000\000\000\ \\047\003\000\000\ \\048\003\000\000\ \\049\003\040\000\072\001\000\000\ \\050\003\000\000\ \\051\003\034\000\113\000\071\000\104\000\000\000\ \\052\003\000\000\ \\053\003\000\000\ \\054\003\000\000\ \\055\003\040\000\042\001\000\000\ \\056\003\000\000\ \\057\003\058\000\082\001\000\000\ \\057\003\058\000\245\001\000\000\ \\057\003\058\000\079\002\000\000\ \\058\003\058\000\082\001\000\000\ \\058\003\058\000\245\001\000\000\ \\058\003\058\000\079\002\000\000\ \\059\003\000\000\ \\060\003\000\000\ \\061\003\000\000\ \\062\003\000\000\ \\063\003\000\000\ \\064\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\039\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\042\000\216\000\ \\057\000\025\000\000\000\ \\065\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\019\000\081\001\020\000\039\000\ \\021\000\038\000\024\000\036\000\029\000\034\000\030\000\033\000\ \\042\000\216\000\056\000\080\001\057\000\025\000\068\000\079\001\ \\073\000\118\000\000\000\ \\065\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\039\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\042\000\216\000\ \\057\000\025\000\000\000\ \\066\003\000\000\ \\067\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\039\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\057\000\025\000\000\000\ \\068\003\000\000\ \\069\003\000\000\ \\070\003\000\000\ \\071\003\000\000\ \\072\003\000\000\ \\073\003\000\000\ \\074\003\000\000\ \\076\003\000\000\ \\077\003\000\000\ \\078\003\000\000\ \\079\003\000\000\ \\080\003\000\000\ \\081\003\000\000\ \\082\003\000\000\ \\083\003\000\000\ \\084\003\058\000\082\001\000\000\ \\085\003\041\000\171\000\059\000\170\000\000\000\ \\085\003\041\000\171\000\059\000\164\001\000\000\ \\085\003\041\000\171\000\059\000\003\002\000\000\ \\086\003\000\000\ \\087\003\000\000\ \\088\003\000\000\ \\089\003\000\000\ \\089\003\068\000\074\000\000\000\ \\090\003\000\000\ \\091\003\000\000\ \\092\003\000\000\ \\094\003\000\000\ \\095\003\000\000\ \\096\003\000\000\ \\097\003\000\000\ \\098\003\000\000\ \\099\003\000\000\ \\100\003\000\000\ \\101\003\003\000\074\002\000\000\ \\102\003\008\000\020\001\011\000\019\001\029\000\018\001\030\000\017\001\ \\050\000\015\001\052\000\014\001\053\000\089\001\057\000\012\001\000\000\ \\103\003\008\000\020\001\011\000\019\001\029\000\018\001\030\000\017\001\ \\042\000\016\001\050\000\015\001\052\000\014\001\053\000\013\001\ \\057\000\012\001\000\000\ \\103\003\008\000\020\001\011\000\019\001\029\000\018\001\030\000\017\001\ \\042\000\016\001\050\000\015\001\052\000\014\001\053\000\013\001\ \\057\000\012\001\068\000\071\000\000\000\ \\104\003\000\000\ \\105\003\000\000\ \\106\003\000\000\ \\107\003\000\000\ \\108\003\000\000\ \\109\003\000\000\ \\110\003\000\000\ \\111\003\000\000\ \\112\003\000\000\ \\113\003\000\000\ \\114\003\000\000\ \\115\003\000\000\ \\116\003\000\000\ \\117\003\000\000\ \\118\003\000\000\ \\119\003\000\000\ \\120\003\058\000\082\001\000\000\ \\121\003\000\000\ \\122\003\000\000\ \\123\003\068\000\074\000\000\000\ \\124\003\000\000\ \\125\003\046\000\042\002\000\000\ \\126\003\000\000\ \\127\003\000\000\ \\128\003\046\000\007\002\000\000\ \\129\003\000\000\ \\130\003\000\000\ \\131\003\000\000\ \\132\003\003\000\012\002\000\000\ \\133\003\000\000\ \\134\003\000\000\ \\135\003\003\000\225\001\000\000\ \\135\003\003\000\225\001\046\000\227\001\000\000\ \\136\003\000\000\ \\137\003\000\000\ \\138\003\003\000\045\002\000\000\ \\139\003\000\000\ \\140\003\000\000\ \\141\003\000\000\ \\142\003\000\000\ \\143\003\003\000\017\002\000\000\ \\144\003\000\000\ \\145\003\000\000\ \\146\003\045\000\050\002\000\000\ \\147\003\000\000\ \\148\003\000\000\ \\149\003\003\000\229\001\000\000\ \\150\003\000\000\ \\151\003\000\000\ \\153\003\000\000\ \\154\003\000\000\ \\155\003\000\000\ \\156\003\000\000\ \\157\003\000\000\ \\158\003\000\000\ \\159\003\000\000\ \\160\003\000\000\ \\161\003\000\000\ \\162\003\000\000\ \\163\003\000\000\ \\165\003\000\000\ \\166\003\000\000\ \\167\003\000\000\ \\168\003\000\000\ \\169\003\000\000\ \\170\003\000\000\ \\171\003\000\000\ \\172\003\000\000\ \\173\003\000\000\ \\175\003\000\000\ \\176\003\000\000\ \\177\003\000\000\ \\178\003\000\000\ \\179\003\002\000\049\000\008\000\047\000\011\000\046\000\013\000\044\000\ \\017\000\042\000\018\000\041\000\020\000\039\000\021\000\038\000\ \\024\000\036\000\029\000\034\000\030\000\033\000\051\000\027\000\ \\055\000\026\000\057\000\025\000\000\000\ \\180\003\000\000\ \\181\003\000\000\ \\182\003\000\000\ \\183\003\000\000\ \" val actionRowNumbers = "\127\000\013\000\207\001\201\001\ \\082\000\206\001\206\001\206\001\ \\096\001\021\000\204\000\003\000\ \\202\000\084\000\179\000\139\000\ \\138\000\140\000\137\000\136\000\ \\135\000\134\000\133\000\120\000\ \\122\000\123\000\116\000\201\000\ \\028\000\169\000\170\000\173\000\ \\073\001\170\000\121\000\168\000\ \\085\000\128\000\128\000\245\000\ \\245\000\170\000\175\000\178\000\ \\172\000\057\000\170\000\073\001\ \\001\000\204\001\205\001\203\001\ \\202\001\001\000\068\001\170\000\ \\178\000\170\000\203\000\159\000\ \\180\000\161\000\162\000\152\000\ \\151\000\150\000\160\000\097\001\ \\111\001\156\000\119\001\086\000\ \\157\000\187\001\058\000\158\000\ \\182\000\145\000\144\000\143\000\ \\147\000\146\000\073\000\200\000\ \\087\000\191\000\189\000\071\000\ \\020\000\060\000\061\000\183\000\ \\016\000\174\000\044\001\088\000\ \\020\001\042\000\224\000\119\000\ \\074\001\023\001\155\000\022\001\ \\043\001\044\000\177\000\174\000\ \\072\001\124\000\228\000\126\000\ \\209\000\234\000\243\000\166\000\ \\167\000\237\000\148\000\241\000\ \\149\000\092\001\219\000\085\000\ \\244\000\142\000\141\000\085\000\ \\019\000\178\000\039\001\019\001\ \\043\000\255\000\252\000\226\000\ \\118\000\112\000\216\000\213\000\ \\176\000\233\000\117\000\124\000\ \\239\000\239\000\089\000\154\000\ \\153\000\018\000\124\000\239\000\ \\208\001\210\001\209\001\125\000\ \\058\001\004\000\056\001\054\001\ \\205\000\060\001\067\001\068\001\ \\207\000\208\000\206\000\090\000\ \\113\000\113\000\113\000\132\001\ \\181\000\170\000\170\000\185\000\ \\170\000\170\000\188\000\186\000\ \\184\000\170\000\225\000\046\001\ \\068\001\170\000\045\001\051\001\ \\021\001\026\000\163\000\074\000\ \\042\001\039\001\091\000\024\000\ \\023\000\022\000\033\001\031\001\ \\029\001\072\000\062\000\063\000\ \\064\000\077\001\025\001\247\000\ \\092\000\242\000\240\000\093\001\ \\090\001\037\000\095\001\220\000\ \\218\000\038\000\223\000\128\000\ \\236\000\235\000\170\000\227\000\ \\093\000\068\001\050\001\253\000\ \\178\000\250\000\178\000\170\000\ \\214\000\178\000\014\001\094\000\ \\230\000\073\001\229\000\171\000\ \\178\000\095\000\056\000\059\001\ \\164\000\165\000\068\001\068\001\ \\075\000\066\001\076\000\065\000\ \\066\000\041\000\114\001\096\000\ \\117\001\131\001\110\001\120\001\ \\008\000\114\000\133\001\130\001\ \\067\000\077\000\120\000\045\000\ \\113\000\073\001\135\001\117\000\ \\073\001\117\000\057\000\199\000\ \\190\000\196\000\195\000\192\000\ \\211\000\053\001\249\000\047\001\ \\027\000\068\001\048\001\024\001\ \\041\001\178\000\178\000\027\001\ \\075\001\178\000\028\001\026\001\ \\126\000\068\001\094\001\131\000\ \\222\000\170\000\219\000\017\000\ \\170\000\038\001\254\000\251\000\ \\217\000\215\000\018\001\172\000\ \\068\001\172\000\238\000\008\001\ \\117\000\125\000\212\000\172\000\ \\219\000\057\001\055\001\061\001\ \\068\001\069\001\068\001\062\001\ \\099\001\005\000\078\000\086\001\ \\059\000\002\000\128\000\128\000\ \\046\000\041\000\030\000\122\001\ \\122\000\047\000\134\001\049\000\ \\112\001\113\000\148\001\079\000\ \\138\001\097\000\125\000\150\001\ \\149\001\118\001\142\001\124\000\ \\140\001\080\000\143\001\141\001\ \\124\000\147\001\013\001\145\001\ \\144\001\124\000\098\000\197\000\ \\116\000\052\001\246\000\174\000\ \\178\000\025\000\037\001\178\000\ \\037\001\030\001\032\001\076\001\ \\003\001\092\001\194\000\129\000\ \\039\000\170\000\000\001\015\001\ \\172\000\084\000\012\001\008\001\ \\005\001\073\001\013\001\231\000\ \\008\001\031\000\065\001\070\001\ \\071\001\102\001\120\000\113\000\ \\113\000\091\001\092\001\092\001\ \\115\001\073\001\100\001\116\001\ \\121\001\123\001\073\001\139\001\ \\125\000\099\000\113\000\068\000\ \\113\000\121\000\136\001\100\000\ \\151\001\152\001\164\001\068\001\ \\165\001\179\001\102\000\029\000\ \\198\000\248\000\049\001\035\001\ \\083\000\040\001\034\001\001\001\ \\073\001\132\000\170\000\032\000\ \\131\000\210\000\017\001\018\001\ \\006\001\007\001\011\001\004\001\ \\232\000\063\001\116\000\101\001\ \\006\000\083\001\104\001\080\001\ \\103\001\069\000\078\001\070\000\ \\129\000\040\000\125\000\125\000\ \\137\001\041\000\103\000\113\001\ \\180\001\014\000\115\000\158\001\ \\157\001\125\000\162\001\073\001\ \\161\001\068\001\177\001\117\000\ \\117\000\173\001\013\001\125\000\ \\036\001\002\001\033\000\193\000\ \\187\000\219\000\016\001\009\001\ \\172\000\064\001\105\001\050\000\ \\088\001\113\000\113\000\087\001\ \\034\000\041\000\104\000\105\000\ \\190\001\010\000\081\000\041\000\ \\106\000\113\000\182\001\120\000\ \\052\000\121\000\155\001\154\001\ \\163\001\159\001\117\000\168\001\ \\178\001\173\001\170\001\073\001\ \\176\001\146\001\098\001\132\000\ \\010\001\106\001\073\001\082\001\ \\079\001\085\001\130\000\068\001\ \\068\001\193\001\123\000\113\000\ \\113\000\191\001\041\000\107\000\ \\181\001\183\001\073\001\156\001\ \\125\000\160\001\166\001\073\001\ \\171\001\172\001\124\000\174\001\ \\117\000\035\000\125\000\036\000\ \\129\001\009\000\192\001\195\001\ \\011\000\084\001\194\001\081\001\ \\188\001\041\000\125\000\153\001\ \\167\001\124\000\108\000\175\001\ \\221\000\109\000\089\001\127\001\ \\046\000\124\001\125\001\048\000\ \\196\001\054\000\189\001\110\000\ \\101\000\117\000\068\001\128\001\ \\126\001\197\001\073\001\068\001\ \\173\001\007\000\125\000\015\000\ \\169\001\107\001\108\001\051\000\ \\111\000\184\001\185\001\053\000\ \\109\001\068\001\186\001\012\000\ \\198\001\199\001\055\000\200\001\ \\000\000" val gotoT = "\ \\142\000\108\002\145\000\001\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\009\000\033\000\008\000\087\000\007\000\ \\097\000\006\000\132\000\005\000\139\000\004\000\140\000\003\000\ \\143\000\002\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\033\000\008\000\087\000\007\000\097\000\006\000\132\000\005\000\ \\140\000\050\000\141\000\049\000\000\000\ \\033\000\008\000\087\000\007\000\097\000\006\000\132\000\005\000\ \\140\000\050\000\141\000\051\000\000\000\ \\033\000\008\000\087\000\007\000\097\000\006\000\132\000\005\000\ \\140\000\050\000\141\000\052\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\058\000\000\000\ \\000\000\ \\005\000\061\000\011\000\060\000\012\000\059\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\068\000\088\000\067\000\000\000\ \\009\000\071\000\098\000\070\000\000\000\ \\010\000\074\000\133\000\073\000\000\000\ \\003\000\076\000\000\000\ \\003\000\084\000\022\000\083\000\023\000\082\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\017\000\087\000\ \\018\000\086\000\025\000\011\000\026\000\010\000\027\000\085\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\019\000\090\000\ \\021\000\089\000\025\000\011\000\026\000\010\000\027\000\088\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\092\000\000\000\ \\001\000\101\000\007\000\100\000\015\000\099\000\038\000\098\000\ \\056\000\097\000\057\000\096\000\066\000\095\000\068\000\094\000\ \\081\000\093\000\000\000\ \\007\000\100\000\045\000\110\000\080\000\109\000\081\000\108\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\112\000\000\000\ \\008\000\115\000\014\000\114\000\036\000\113\000\000\000\ \\000\000\ \\004\000\119\000\005\000\118\000\035\000\117\000\000\000\ \\146\000\121\000\000\000\ \\146\000\122\000\000\000\ \\002\000\124\000\037\000\123\000\000\000\ \\002\000\124\000\037\000\127\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\128\000\000\000\ \\001\000\101\000\007\000\100\000\015\000\136\000\040\000\135\000\ \\042\000\134\000\044\000\133\000\056\000\132\000\057\000\131\000\ \\067\000\130\000\081\000\129\000\000\000\ \\001\000\101\000\015\000\099\000\028\000\139\000\030\000\138\000\ \\056\000\097\000\057\000\096\000\066\000\137\000\068\000\094\000\000\000\ \\015\000\142\000\054\000\141\000\000\000\ \\006\000\146\000\007\000\100\000\048\000\145\000\049\000\144\000\ \\081\000\143\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\149\000\000\000\ \\007\000\100\000\047\000\151\000\080\000\150\000\081\000\108\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\009\000\033\000\008\000\087\000\007\000\ \\097\000\006\000\132\000\005\000\139\000\004\000\140\000\003\000\ \\143\000\153\000\144\000\152\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\009\000\033\000\008\000\087\000\007\000\ \\097\000\006\000\132\000\005\000\139\000\004\000\140\000\003\000\ \\143\000\153\000\144\000\154\000\000\000\ \\007\000\161\000\070\000\160\000\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\164\000\000\000\ \\001\000\101\000\015\000\099\000\028\000\165\000\030\000\138\000\ \\056\000\097\000\057\000\096\000\066\000\137\000\068\000\094\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\166\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\094\000\167\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\038\000\182\000\056\000\097\000\ \\057\000\096\000\066\000\095\000\068\000\094\000\000\000\ \\069\000\183\000\000\000\ \\000\000\ \\069\000\186\000\000\000\ \\001\000\101\000\015\000\136\000\056\000\132\000\057\000\131\000\ \\067\000\187\000\000\000\ \\000\000\ \\005\000\189\000\012\000\188\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\194\000\005\000\193\000\061\000\192\000\062\000\191\000\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\058\000\201\000\059\000\200\000\066\000\199\000\068\000\094\000\000\000\ \\001\000\101\000\007\000\205\000\015\000\099\000\056\000\097\000\ \\057\000\096\000\060\000\204\000\066\000\203\000\068\000\094\000\ \\082\000\202\000\000\000\ \\001\000\101\000\015\000\099\000\038\000\207\000\056\000\097\000\ \\057\000\096\000\066\000\095\000\068\000\094\000\000\000\ \\000\000\ \\006\000\208\000\000\000\ \\000\000\ \\007\000\205\000\082\000\202\000\000\000\ \\000\000\ \\000\000\ \\008\000\115\000\014\000\114\000\036\000\209\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\004\000\119\000\005\000\118\000\035\000\210\000\000\000\ \\000\000\ \\033\000\008\000\085\000\213\000\086\000\212\000\087\000\211\000\000\000\ \\031\000\217\000\032\000\216\000\033\000\215\000\000\000\ \\004\000\119\000\005\000\118\000\035\000\220\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\004\000\119\000\005\000\118\000\035\000\221\000\000\000\ \\000\000\ \\001\000\101\000\015\000\136\000\040\000\223\000\042\000\134\000\ \\044\000\133\000\056\000\132\000\057\000\131\000\067\000\130\000\000\000\ \\064\000\224\000\000\000\ \\000\000\ \\001\000\101\000\015\000\136\000\056\000\132\000\057\000\131\000\ \\067\000\226\000\000\000\ \\043\000\227\000\000\000\ \\041\000\229\000\000\000\ \\000\000\ \\005\000\061\000\012\000\188\000\000\000\ \\000\000\ \\029\000\232\000\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\060\000\204\000\066\000\203\000\068\000\094\000\000\000\ \\000\000\ \\005\000\234\000\000\000\ \\006\000\235\000\000\000\ \\034\000\236\000\000\000\ \\034\000\238\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\241\000\000\000\ \\034\000\242\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\244\000\013\000\243\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\250\000\075\000\249\000\076\000\248\000\000\000\ \\007\000\161\000\070\000\252\000\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\079\000\251\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\009\000\000\001\095\000\255\000\096\000\254\000\000\000\ \\009\000\000\001\095\000\002\001\096\000\254\000\000\000\ \\009\000\000\001\095\000\005\001\096\000\004\001\100\000\003\001\000\000\ \\008\000\009\001\105\000\008\001\106\000\007\001\107\000\006\001\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\019\001\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\018\000\020\001\ \\025\000\011\000\026\000\010\000\027\000\085\000\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\021\000\022\001\ \\025\000\011\000\026\000\010\000\027\000\021\001\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\018\000\023\001\ \\025\000\011\000\026\000\010\000\027\000\085\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\024\001\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\070\000\025\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\026\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\064\000\028\001\069\000\027\001\000\000\ \\069\000\030\001\000\000\ \\000\000\ \\000\000\ \\064\000\032\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\033\000\008\000\086\000\042\001\087\000\211\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\032\000\044\001\033\000\215\000\000\000\ \\000\000\ \\000\000\ \\146\000\046\001\000\000\ \\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\047\001\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\070\000\049\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\000\000\ \\001\000\101\000\015\000\136\000\042\000\050\001\044\000\133\000\ \\056\000\132\000\057\000\131\000\067\000\130\000\000\000\ \\000\000\ \\001\000\101\000\015\000\136\000\040\000\051\001\042\000\134\000\ \\044\000\133\000\056\000\132\000\057\000\131\000\067\000\130\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\052\001\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\028\000\053\001\030\000\138\000\ \\056\000\097\000\057\000\096\000\066\000\137\000\068\000\094\000\000\000\ \\053\000\054\001\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\045\000\058\001\080\000\109\000\081\000\108\000\000\000\ \\000\000\ \\015\000\060\001\051\000\059\001\000\000\ \\001\000\101\000\015\000\099\000\028\000\062\001\030\000\138\000\ \\056\000\097\000\057\000\096\000\066\000\137\000\068\000\094\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\072\000\065\001\073\000\157\000\074\000\156\000\ \\078\000\155\000\000\000\ \\007\000\161\000\070\000\066\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\074\001\ \\084\000\073\001\090\000\072\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\105\000\082\001\106\000\007\001\107\000\006\001\000\000\ \\000\000\ \\000\000\ \\099\000\083\001\000\000\ \\000\000\ \\000\000\ \\107\000\086\001\000\000\ \\000\000\ \\000\000\ \\008\000\091\001\127\000\090\001\000\000\ \\008\000\115\000\014\000\093\001\112\000\092\001\000\000\ \\009\000\097\001\095\000\096\001\096\000\254\000\108\000\095\001\000\000\ \\007\000\100\000\080\000\099\001\081\000\108\000\115\000\098\001\000\000\ \\000\000\ \\005\000\101\001\113\000\100\001\000\000\ \\007\000\100\000\080\000\104\001\081\000\108\000\115\000\103\001\ \\117\000\102\001\000\000\ \\005\000\106\001\125\000\105\001\000\000\ \\006\000\110\001\007\000\100\000\081\000\109\001\120\000\108\001\ \\121\000\107\001\000\000\ \\024\000\111\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\069\000\113\001\000\000\ \\039\000\114\001\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\070\000\117\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\000\000\ \\065\000\118\001\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\066\000\120\001\068\000\094\000\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\059\000\121\001\066\000\199\000\068\000\094\000\000\000\ \\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\059\000\122\001\066\000\199\000\068\000\094\000\000\000\ \\000\000\ \\000\000\ \\007\000\205\000\082\000\123\001\000\000\ \\007\000\161\000\070\000\124\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\033\000\008\000\086\000\042\001\087\000\211\000\000\000\ \\148\000\125\001\000\000\ \\032\000\044\001\033\000\215\000\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\020\000\127\001\ \\025\000\011\000\026\000\010\000\027\000\126\001\000\000\ \\031\000\128\001\032\000\216\000\033\000\215\000\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\130\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\055\000\131\001\000\000\ \\015\000\133\001\000\000\ \\007\000\161\000\070\000\134\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\015\000\060\001\051\000\135\001\000\000\ \\000\000\ \\050\000\136\001\000\000\ \\005\000\138\001\000\000\ \\006\000\244\000\013\000\139\001\000\000\ \\000\000\ \\015\000\060\001\051\000\140\001\000\000\ \\031\000\141\001\032\000\216\000\033\000\215\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\161\000\070\000\142\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\007\000\161\000\070\000\144\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\079\000\143\001\000\000\ \\000\000\ \\000\000\ \\089\000\145\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\146\000\150\001\000\000\ \\146\000\151\001\000\000\ \\103\000\152\001\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\074\001\ \\084\000\073\001\090\000\154\001\000\000\ \\000\000\ \\000\000\ \\009\000\071\000\098\000\156\001\000\000\ \\101\000\157\001\103\000\152\001\000\000\ \\000\000\ \\008\000\115\000\014\000\093\001\112\000\159\001\000\000\ \\094\000\161\001\000\000\ \\009\000\000\001\095\000\163\001\096\000\254\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\244\000\013\000\167\001\110\000\166\001\000\000\ \\000\000\ \\000\000\ \\009\000\169\001\108\000\168\001\000\000\ \\000\000\ \\006\000\170\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\172\001\000\000\ \\000\000\ \\053\000\173\001\000\000\ \\000\000\ \\000\000\ \\006\000\174\001\000\000\ \\000\000\ \\000\000\ \\003\000\084\000\022\000\176\001\000\000\ \\000\000\ \\000\000\ \\001\000\101\000\015\000\099\000\038\000\177\001\056\000\097\000\ \\057\000\096\000\066\000\095\000\068\000\094\000\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\066\000\178\001\068\000\094\000\000\000\ \\069\000\113\001\000\000\ \\063\000\179\001\000\000\ \\001\000\101\000\015\000\099\000\056\000\097\000\057\000\096\000\ \\066\000\181\001\068\000\094\000\000\000\ \\063\000\182\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\046\000\183\001\000\000\ \\033\000\008\000\085\000\185\001\086\000\212\000\087\000\211\000\000\000\ \\000\000\ \\147\000\187\001\000\000\ \\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\025\000\011\000\ \\026\000\010\000\027\000\189\001\000\000\ \\000\000\ \\000\000\ \\015\000\142\000\054\000\190\001\000\000\ \\005\000\061\000\011\000\191\001\012\000\059\000\000\000\ \\000\000\ \\050\000\192\001\000\000\ \\000\000\ \\007\000\100\000\047\000\193\001\080\000\150\000\081\000\108\000\000\000\ \\053\000\194\001\000\000\ \\000\000\ \\050\000\195\001\000\000\ \\000\000\ \\077\000\197\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\068\000\088\000\199\001\000\000\ \\009\000\000\001\091\000\202\001\095\000\201\001\096\000\200\001\000\000\ \\009\000\000\001\091\000\204\001\095\000\203\001\096\000\200\001\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\033\000\008\000\ \\083\000\207\001\084\000\206\001\085\000\205\001\086\000\212\000\ \\087\000\211\000\000\000\ \\033\000\008\000\085\000\208\001\086\000\212\000\087\000\211\000\000\000\ \\033\000\008\000\085\000\209\001\086\000\212\000\087\000\211\000\000\000\ \\000\000\ \\007\000\100\000\080\000\210\001\081\000\108\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\211\001\081\000\108\000\000\000\ \\000\000\ \\006\000\244\000\013\000\167\001\110\000\212\001\000\000\ \\000\000\ \\009\000\000\001\095\000\214\001\096\000\254\000\000\000\ \\000\000\ \\009\000\000\001\095\000\218\001\096\000\217\001\129\000\216\001\000\000\ \\008\000\115\000\014\000\220\001\111\000\219\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\009\000\169\001\108\000\168\001\000\000\ \\116\000\222\001\000\000\ \\007\000\161\000\070\000\224\001\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\116\000\222\001\000\000\ \\126\000\226\001\000\000\ \\000\000\ \\005\000\230\001\123\000\229\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\194\000\005\000\193\000\061\000\232\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\045\000\233\001\080\000\109\000\081\000\108\000\000\000\ \\149\000\234\001\000\000\ \\001\000\014\000\015\000\013\000\016\000\012\000\020\000\235\001\ \\025\000\011\000\026\000\010\000\027\000\126\001\000\000\ \\000\000\ \\148\000\237\001\000\000\ \\000\000\ \\000\000\ \\055\000\238\001\000\000\ \\000\000\ \\000\000\ \\052\000\239\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\250\000\075\000\241\001\000\000\ \\000\000\ \\089\000\242\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\147\000\248\001\000\000\ \\000\000\ \\006\000\244\000\013\000\250\001\000\000\ \\006\000\244\000\013\000\251\001\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\254\001\ \\084\000\253\001\135\000\252\001\000\000\ \\000\000\ \\094\000\000\002\000\000\ \\000\000\ \\128\000\002\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\006\000\244\000\013\000\007\002\109\000\006\002\000\000\ \\000\000\ \\007\000\100\000\080\000\099\001\081\000\108\000\115\000\008\002\000\000\ \\114\000\009\002\000\000\ \\007\000\161\000\070\000\011\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\005\000\106\001\125\000\012\002\000\000\ \\005\000\230\001\123\000\013\002\000\000\ \\122\000\014\002\000\000\ \\053\000\016\002\000\000\ \\006\000\244\000\013\000\017\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\031\000\019\002\032\000\216\000\033\000\215\000\000\000\ \\000\000\ \\000\000\ \\015\000\060\001\051\000\020\002\000\000\ \\000\000\ \\000\000\ \\092\000\021\002\103\000\152\001\000\000\ \\000\000\ \\009\000\000\001\095\000\023\002\096\000\254\000\000\000\ \\009\000\000\001\095\000\024\002\096\000\254\000\000\000\ \\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\026\002\ \\084\000\206\001\000\000\ \\000\000\ \\000\000\ \\000\000\ \\134\000\029\002\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\254\001\ \\084\000\253\001\135\000\033\002\000\000\ \\000\000\ \\009\000\000\001\095\000\035\002\096\000\254\000\000\000\ \\000\000\ \\008\000\091\001\127\000\036\002\000\000\ \\103\000\152\001\130\000\037\002\000\000\ \\008\000\115\000\014\000\220\001\111\000\039\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\005\000\101\001\113\000\041\002\000\000\ \\118\000\042\002\000\000\ \\000\000\ \\122\000\044\002\000\000\ \\000\000\ \\007\000\100\000\080\000\046\002\081\000\108\000\119\000\045\002\000\000\ \\124\000\047\002\000\000\ \\000\000\ \\000\000\ \\149\000\049\002\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\050\002\081\000\108\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\147\000\051\002\000\000\ \\007\000\161\000\070\000\052\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\007\000\161\000\070\000\053\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\010\000\074\000\133\000\054\002\000\000\ \\009\000\000\001\095\000\057\002\096\000\056\002\136\000\055\002\000\000\ \\009\000\000\001\095\000\059\002\096\000\056\002\136\000\058\002\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\254\001\ \\084\000\253\001\135\000\060\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\062\002\081\000\108\000\000\000\ \\000\000\ \\006\000\244\000\013\000\007\002\109\000\063\002\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\065\002\081\000\108\000\117\000\064\002\000\000\ \\000\000\ \\000\000\ \\006\000\066\002\000\000\ \\000\000\ \\005\000\230\001\123\000\067\002\000\000\ \\000\000\ \\006\000\244\000\013\000\069\002\000\000\ \\000\000\ \\104\000\071\002\000\000\ \\099\000\074\002\102\000\073\002\104\000\071\002\000\000\ \\000\000\ \\000\000\ \\134\000\076\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\115\000\010\000\076\001\014\000\075\001\083\000\254\001\ \\084\000\253\001\135\000\078\002\000\000\ \\006\000\244\000\013\000\079\002\000\000\ \\000\000\ \\000\000\ \\006\000\080\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\103\000\083\002\000\000\ \\000\000\ \\000\000\ \\009\000\071\000\098\000\156\001\101\000\084\002\103\000\083\002\000\000\ \\000\000\ \\103\000\152\001\137\000\085\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\005\000\230\001\123\000\088\002\000\000\ \\007\000\161\000\070\000\089\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\100\000\080\000\090\002\081\000\108\000\000\000\ \\007\000\161\000\070\000\091\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\122\000\092\002\000\000\ \\089\000\094\002\093\000\093\002\104\000\071\002\000\000\ \\006\000\244\000\013\000\096\002\000\000\ \\104\000\071\002\128\000\098\002\131\000\097\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\068\000\088\000\199\001\092\000\100\002\103\000\083\002\000\000\ \\000\000\ \\000\000\ \\000\000\ \\008\000\091\001\103\000\083\002\127\000\036\002\130\000\102\002\000\000\ \\000\000\ \\007\000\161\000\070\000\103\002\071\000\159\000\072\000\158\000\ \\073\000\157\000\074\000\156\000\078\000\155\000\000\000\ \\000\000\ \\104\000\071\002\134\000\105\002\138\000\104\002\000\000\ \\000\000\ \\000\000\ \\010\000\074\000\103\000\083\002\133\000\054\002\137\000\107\002\000\000\ \\000\000\ \\000\000\ \" val numstates = 621 val numrules = 330 val s = ref "" and index = ref 0 val string_to_int = fn () => let val i = !index in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256 end val string_to_list = fn s' => let val len = String.size s' fun f () = if !index < len then string_to_int() :: f() else nil in index := 0; s := s'; f () end val string_to_pairlist = fn (conv_key,conv_entry) => let fun f () = case string_to_int() of 0 => EMPTY | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f()) in f end val string_to_pairlist_default = fn (conv_key,conv_entry) => let val conv_row = string_to_pairlist(conv_key,conv_entry) in fn () => let val default = conv_entry(string_to_int()) val row = conv_row() in (row,default) end end val string_to_table = fn (convert_row,s') => let val len = String.size s' fun f ()= if !index < len then convert_row() :: f() else nil in (s := s'; index := 0; f ()) end local val memo = Array.array(numstates+numrules,ERROR) val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1)) fun f i = if i=numstates then g i else (Array.update(memo,i,SHIFT (STATE i)); f (i+1)) in f 0 handle Subscript => () end in val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2)) end val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT)) val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows) val actionRowNumbers = string_to_list actionRowNumbers val actionT = let val actionRowLookUp= let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end in Array.fromList(map actionRowLookUp actionRowNumbers) end in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules, numStates=numstates,initialState=STATE 0} end end local open Header in type pos = int type arg = Infix.InfEnv structure MlyValue = struct datatype svalue = VOID | ntVOID of unit -> unit | LONGID of unit -> (string list*string) | ETYVAR of unit -> (string) | TYVAR of unit -> (string) | SYMBOL of unit -> (string) | ALPHA of unit -> (string) | CHAR of unit -> (char) | STRING of unit -> (string) | REAL of unit -> (real) | WORD of unit -> (word) | INT of unit -> (int) | NUMERIC of unit -> (int) | DIGIT of unit -> (int) | popLocalInfix of unit -> (unit) | pushLocalInfix of unit -> (unit) | popInfix of unit -> (unit) | pushInfix of unit -> (unit) | initInfix of unit -> (unit) | program_opt of unit -> (Program option) | program' of unit -> (Program) | program of unit -> (Program*Infix.InfEnv) | topdec_opt of unit -> (TopDec option) | topdec1 of unit -> (TopDec) | topdec of unit -> (TopDec) | AND_tyreadesc_opt__AND_funbind_opt of unit -> (TyReaDesc option*FunBind option) | tyreadesc__AND_funbind_opt of unit -> (TyReaDesc*FunBind option) | sigexp__AND_funbind_opt of unit -> (SigExp*FunBind option) | strexp__AND_funbind_opt of unit -> (StrExp*FunBind option) | AND_funbind_opt of unit -> (FunBind option) | funbind of unit -> (FunBind) | fundec of unit -> (FunDec) | AND_tyreadesc_opt__AND_strdesc_opt of unit -> (TyReaDesc option*StrDesc option) | tyreadesc__AND_strdesc_opt of unit -> (TyReaDesc*StrDesc option) | sigexp__AND_strdesc_opt of unit -> (SigExp*StrDesc option) | AND_strdesc_opt of unit -> (StrDesc option) | strdesc of unit -> (StrDesc) | AND_exdesc_opt of unit -> (ExDesc option) | exdesc of unit -> (ExDesc) | BAR_condesc_opt of unit -> (ConDesc option) | condesc of unit -> (ConDesc) | AND_datdesc_opt of unit -> (DatDesc option) | datdesc1 of unit -> (DatDesc) | datdesc0 of unit -> (DatDesc) | datdesc of unit -> (DatDesc) | AND_syndesc_opt of unit -> (SynDesc option) | syndesc of unit -> (SynDesc) | AND_typdesc_opt of unit -> (TypDesc option) | typdesc of unit -> (TypDesc) | AND_valdesc_opt of unit -> (ValDesc option) | valdesc of unit -> (ValDesc) | longstrid_EQUALS_list2 of unit -> (longStrId list) | longstrid_EQUALS_list1 of unit -> (longStrId list) | longtycon_EQUALS_list2 of unit -> (longTyCon list) | longtycon_EQUALS_list1 of unit -> (longTyCon list) | sigid_list2 of unit -> (SigId list) | spec1' of unit -> (Spec) | spec1 of unit -> (Spec) | spec of unit -> (Spec) | AND_tyreadesc_opt of unit -> (TyReaDesc option) | tyreadesc of unit -> (TyReaDesc) | AND_tyreadesc_opt__AND_sigbind_opt of unit -> (TyReaDesc option*SigBind option) | tyreadesc__AND_sigbind_opt of unit -> (TyReaDesc*SigBind option) | sigexp__AND_sigbind_opt of unit -> (SigExp*SigBind option) | AND_sigbind_opt of unit -> (SigBind option) | sigbind of unit -> (SigBind) | sigdec of unit -> (SigDec) | sigexp' of unit -> (SigExp) | sigexp of unit -> (SigExp) | COLON_sigexp_opt of unit -> (SigExp option) | AND_tyreadesc_opt__AND_strbind_opt of unit -> (TyReaDesc option*StrBind option) | tyreadesc__AND_strbind_opt of unit -> (TyReaDesc*StrBind option) | sigexp__AND_strbind_opt of unit -> (SigExp*StrBind option) | strexp__AND_strbind_opt of unit -> (StrExp*StrBind option) | AND_strbind_opt of unit -> (StrBind option) | strbind of unit -> (StrBind) | strdec1' of unit -> (StrDec) | strdec1 of unit -> (StrDec) | strdec of unit -> (StrDec) | strexp' of unit -> (StrExp) | strexp of unit -> (StrExp) | tyvar_COMMA_list1 of unit -> (TyVar list) | tyvarseq1 of unit -> (TyVarseq) | tyvarseq of unit -> (TyVarseq) | ty_COMMA_list2 of unit -> (Ty list) | tyseq of unit -> (Tyseq) | COMMA_tyrow_opt of unit -> (TyRow option) | tyrow_opt of unit -> (TyRow option) | tyrow of unit -> (TyRow) | atty of unit -> (Ty) | consty of unit -> (Ty) | ty_STAR_list of unit -> (Ty list) | tupty of unit -> (Ty) | ty of unit -> (Ty) | COLON_ty_list1 of unit -> (Ty list) | atpat_list2 of unit -> (AtPat list) | atpat_list1 of unit -> (AtPat list) | pat of unit -> (Pat) | AS_pat_opt of unit -> (Pat option) | COLON_ty_opt of unit -> (Ty option) | COMMA_patrow_opt of unit -> (PatRow option) | patrow_opt of unit -> (PatRow option) | patrow of unit -> (PatRow) | pat_COMMA_list2 of unit -> (Pat list) | pat_COMMA_list1 of unit -> (Pat list) | pat_COMMA_list0 of unit -> (Pat list) | atpat' of unit -> (AtPat) | atpat of unit -> (AtPat) | AND_exbind_opt of unit -> (ExBind option) | exbind of unit -> (ExBind) | OF_ty_opt of unit -> (Ty option) | BAR_conbind_opt of unit -> (ConBind option) | conbind of unit -> (ConBind) | AND_datbind_opt of unit -> (DatBind option) | datbind1 of unit -> (DatBind) | datbind0 of unit -> (DatBind) | datbind of unit -> (DatBind) | AND_typbind_opt of unit -> (TypBind option) | typbind of unit -> (TypBind) | fmrule of unit -> (Fmrule) | BAR_fmatch_opt of unit -> (Fmatch option) | fmatch of unit -> (Fmatch) | AND_fvalbind_opt of unit -> (FvalBind option) | fvalbind of unit -> (FvalBind) | AND_valbind_opt of unit -> (ValBind option) | valbind of unit -> (ValBind) | d_opt of unit -> (int) | longstrid_list1 of unit -> (longStrId list) | vid_list1 of unit -> (VId list) | WITHTYPE_typbind_opt of unit -> (TypBind option) | dec1' of unit -> (Dec) | dec1 of unit -> (Dec) | dec of unit -> (Dec) | mrule of unit -> (Mrule) | BAR_match_opt of unit -> (Match option) | match of unit -> (Match) | exp of unit -> (Exp) | infexp of unit -> (InfExp) | appexp of unit -> (AppExp) | COMMA_exprow_opt of unit -> (ExpRow option) | exprow_opt of unit -> (ExpRow option) | exprow of unit -> (ExpRow) | exp_SEMICOLON_list2 of unit -> (Exp list) | exp_SEMICOLON_list1 of unit -> (Exp list) | exp_COMMA_list2 of unit -> (Exp list) | exp_COMMA_list1 of unit -> (Exp list) | exp_COMMA_list0 of unit -> (Exp list) | atexp of unit -> (AtExp) | OP_opt of unit -> (Op) | longstrid of unit -> (longStrId) | longtycon of unit -> (longTyCon) | longvid' of unit -> (longVId) | longvid of unit -> (longVId) | funid of unit -> (FunId) | sigid of unit -> (SigId) | strid of unit -> (StrId) | tyvar of unit -> (TyVar) | tycon of unit -> (TyCon) | vid' of unit -> (VId) | vid of unit -> (VId) | lab of unit -> (Lab) | d of unit -> (int) | scon of unit -> (SCon) end type svalue = MlyValue.svalue type result = Program*Infix.InfEnv end structure EC= struct open LrTable val is_keyword = fn (T 1) => true | (T 2) => true | (T 3) => true | (T 4) => true | (T 5) => true | (T 6) => true | (T 7) => true | (T 8) => true | (T 9) => true | (T 10) => true | (T 11) => true | (T 12) => true | (T 13) => true | (T 14) => true | (T 15) => true | (T 16) => true | (T 17) => true | (T 18) => true | (T 19) => true | (T 20) => true | (T 21) => true | (T 22) => true | (T 23) => true | (T 24) => true | (T 25) => true | (T 26) => true | (T 27) => true | (T 28) => true | (T 29) => true | (T 30) => true | (T 31) => true | (T 32) => true | (T 49) => true | (T 50) => true | (T 51) => true | (T 52) => true | (T 53) => true | (T 54) => true | (T 55) => true | (T 56) => true | (T 57) => true | _ => false val preferred_change = nil val noShift = fn (T 0) => true | _ => false val showTerminal = fn (T 0) => "EOF" | (T 1) => "ABSTYPE" | (T 2) => "AND" | (T 3) => "ANDALSO" | (T 4) => "AS" | (T 5) => "CASE" | (T 6) => "DO" | (T 7) => "DATATYPE" | (T 8) => "ELSE" | (T 9) => "END" | (T 10) => "EXCEPTION" | (T 11) => "FN" | (T 12) => "FUN" | (T 13) => "HANDLE" | (T 14) => "IF" | (T 15) => "IN" | (T 16) => "INFIX" | (T 17) => "INFIXR" | (T 18) => "LET" | (T 19) => "LOCAL" | (T 20) => "NONFIX" | (T 21) => "OF" | (T 22) => "OP" | (T 23) => "OPEN" | (T 24) => "ORELSE" | (T 25) => "RAISE" | (T 26) => "REC" | (T 27) => "THEN" | (T 28) => "TYPE" | (T 29) => "VAL" | (T 30) => "WITH" | (T 31) => "WITHTYPE" | (T 32) => "WHILE" | (T 33) => "LPAR" | (T 34) => "RPAR" | (T 35) => "LBRACK" | (T 36) => "RBRACK" | (T 37) => "LBRACE" | (T 38) => "RBRACE" | (T 39) => "COMMA" | (T 40) => "COLON" | (T 41) => "SEMICOLON" | (T 42) => "DOTS" | (T 43) => "UNDERBAR" | (T 44) => "BAR" | (T 45) => "EQUALS" | (T 46) => "DARROW" | (T 47) => "ARROW" | (T 48) => "HASH" | (T 49) => "EQTYPE" | (T 50) => "FUNCTOR" | (T 51) => "INCLUDE" | (T 52) => "SHARING" | (T 53) => "SIG" | (T 54) => "SIGNATURE" | (T 55) => "STRUCT" | (T 56) => "STRUCTURE" | (T 57) => "WHERE" | (T 58) => "COLONGREATER" | (T 59) => "ZERO" | (T 60) => "DIGIT" | (T 61) => "NUMERIC" | (T 62) => "INT" | (T 63) => "WORD" | (T 64) => "REAL" | (T 65) => "STRING" | (T 66) => "CHAR" | (T 67) => "ALPHA" | (T 68) => "SYMBOL" | (T 69) => "STAR" | (T 70) => "TYVAR" | (T 71) => "ETYVAR" | (T 72) => "LONGID" | _ => "bogus-term" local open Header in val errtermvalue= fn _ => MlyValue.VOID end val terms = (T 0) :: (T 1) :: (T 2) :: (T 3) :: (T 4) :: (T 5) :: (T 6 ) :: (T 7) :: (T 8) :: (T 9) :: (T 10) :: (T 11) :: (T 12) :: (T 13) :: (T 14) :: (T 15) :: (T 16) :: (T 17) :: (T 18) :: (T 19) :: (T 20) :: (T 21) :: (T 22) :: (T 23) :: (T 24) :: (T 25) :: (T 26) :: (T 27) :: (T 28) :: (T 29) :: (T 30) :: (T 31) :: (T 32) :: (T 33) :: (T 34) :: (T 35) :: (T 36) :: (T 37) :: (T 38) :: (T 39) :: (T 40) :: (T 41) :: (T 42) :: (T 43) :: (T 44) :: (T 45) :: (T 46) :: (T 47) :: (T 48) :: (T 49) :: (T 50) :: (T 51) :: (T 52) :: (T 53) :: (T 54) :: (T 55) :: (T 56) :: (T 57) :: (T 58) :: (T 59) :: (T 69) :: nil end structure Actions = struct type int = Int.int exception mlyAction of int local open Header in val actions = fn (i392:int,defaultPos,stack, (J0):arg) => case (i392,stack) of (0,rest671) => let val result=MlyValue.initInfix(fn _ => ( initJandJ'(J0) )) in (LrTable.NT 144,(result,defaultPos,defaultPos),rest671) end | (1,rest671) => let val result=MlyValue.pushInfix(fn _ => ( pushJ() ) ) in (LrTable.NT 145,(result,defaultPos,defaultPos),rest671) end | (2,rest671) => let val result=MlyValue.popInfix(fn _ => ( popJ() )) in (LrTable.NT 146,(result,defaultPos,defaultPos),rest671) end | (3,rest671) => let val result=MlyValue.pushLocalInfix(fn _ => ( pushJ'shiftJ() )) in (LrTable.NT 147,(result,defaultPos,defaultPos),rest671) end | (4,rest671) => let val result=MlyValue.popLocalInfix(fn _ => ( popJandJ'() )) in (LrTable.NT 148,(result,defaultPos,defaultPos),rest671) end | (5,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.scon(fn _ => ( SCon.fromInt 0 )) in (LrTable.NT 0,(result,ZERO1left,ZERO1right),rest671) end | (6,(_,(MlyValue.DIGIT DIGIT1,DIGIT1left,DIGIT1right))::rest671) => let val result=MlyValue.scon(fn _ => let val DIGIT as DIGIT1=DIGIT1 () in ( SCon.fromInt DIGIT ) end ) in (LrTable.NT 0,(result,DIGIT1left,DIGIT1right),rest671) end | (7,(_,(MlyValue.NUMERIC NUMERIC1,NUMERIC1left,NUMERIC1right)):: rest671) => let val result=MlyValue.scon(fn _ => let val NUMERIC as NUMERIC1=NUMERIC1 () in ( SCon.fromInt NUMERIC ) end ) in (LrTable.NT 0,(result,NUMERIC1left,NUMERIC1right),rest671) end | (8,(_,(MlyValue.INT INT1,INT1left,INT1right))::rest671) => let val result=MlyValue.scon(fn _ => let val INT as INT1=INT1 () in ( SCon.fromInt INT ) end ) in (LrTable.NT 0,(result,INT1left,INT1right),rest671) end | (9,(_,(MlyValue.WORD WORD1,WORD1left,WORD1right))::rest671) => let val result=MlyValue.scon(fn _ => let val WORD as WORD1=WORD1 () in ( SCon.fromWord WORD ) end ) in (LrTable.NT 0,(result,WORD1left,WORD1right),rest671) end | (10,(_,(MlyValue.STRING STRING1,STRING1left,STRING1right))::rest671) => let val result=MlyValue.scon(fn _ => let val STRING as STRING1= STRING1 () in ( SCon.fromString STRING ) end ) in (LrTable.NT 0,(result,STRING1left,STRING1right),rest671) end | (11,(_,(MlyValue.CHAR CHAR1,CHAR1left,CHAR1right))::rest671) => let val result=MlyValue.scon(fn _ => let val CHAR as CHAR1=CHAR1 () in ( SCon.fromChar CHAR ) end ) in (LrTable.NT 0,(result,CHAR1left,CHAR1right),rest671) end | (12,(_,(MlyValue.REAL REAL1,REAL1left,REAL1right))::rest671) => let val result=MlyValue.scon(fn _ => let val REAL as REAL1=REAL1 () in ( SCon.fromReal REAL ) end ) in (LrTable.NT 0,(result,REAL1left,REAL1right),rest671) end | (13,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.d(fn _ => ( 0 )) in (LrTable.NT 1,(result,ZERO1left,ZERO1right),rest671) end | (14,(_,(MlyValue.DIGIT DIGIT1,DIGIT1left,DIGIT1right))::rest671) => let val result=MlyValue.d(fn _ => let val DIGIT as DIGIT1=DIGIT1 () in ( DIGIT ) end ) in (LrTable.NT 1,(result,DIGIT1left,DIGIT1right),rest671) end | (15,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.lab(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( Lab.fromString ALPHA ) end ) in (LrTable.NT 2,(result,ALPHA1left,ALPHA1right),rest671) end | (16,(_,(MlyValue.SYMBOL SYMBOL1,SYMBOL1left,SYMBOL1right))::rest671) => let val result=MlyValue.lab(fn _ => let val SYMBOL as SYMBOL1= SYMBOL1 () in ( Lab.fromString SYMBOL ) end ) in (LrTable.NT 2,(result,SYMBOL1left,SYMBOL1right),rest671) end | (17,(_,(_,STAR1left,STAR1right))::rest671) => let val result= MlyValue.lab(fn _ => ( Lab.fromString "*" )) in (LrTable.NT 2,(result,STAR1left,STAR1right),rest671) end | (18,(_,(MlyValue.DIGIT DIGIT1,DIGIT1left,DIGIT1right))::rest671) => let val result=MlyValue.lab(fn _ => let val DIGIT as DIGIT1=DIGIT1 () in ( Lab.fromInt DIGIT ) end ) in (LrTable.NT 2,(result,DIGIT1left,DIGIT1right),rest671) end | (19,(_,(MlyValue.NUMERIC NUMERIC1,NUMERIC1left,NUMERIC1right)):: rest671) => let val result=MlyValue.lab(fn _ => let val NUMERIC as NUMERIC1=NUMERIC1 () in ( Lab.fromInt NUMERIC ) end ) in (LrTable.NT 2,(result,NUMERIC1left,NUMERIC1right),rest671) end | (20,(_,(MlyValue.vid' vid'1,vid'1left,vid'1right))::rest671) => let val result=MlyValue.vid(fn _ => let val vid' as vid'1=vid'1 () in ( vid' ) end ) in (LrTable.NT 3,(result,vid'1left,vid'1right),rest671) end | (21,(_,(_,EQUALS1left,EQUALS1right))::rest671) => let val result= MlyValue.vid(fn _ => ( VId.fromString "=" )) in (LrTable.NT 3,(result,EQUALS1left,EQUALS1right),rest671) end | (22,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.vid'(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( VId.fromString ALPHA ) end ) in (LrTable.NT 4,(result,ALPHA1left,ALPHA1right),rest671) end | (23,(_,(MlyValue.SYMBOL SYMBOL1,SYMBOL1left,SYMBOL1right))::rest671) => let val result=MlyValue.vid'(fn _ => let val SYMBOL as SYMBOL1= SYMBOL1 () in ( VId.fromString SYMBOL ) end ) in (LrTable.NT 4,(result,SYMBOL1left,SYMBOL1right),rest671) end | (24,(_,(_,STAR1left,STAR1right))::rest671) => let val result= MlyValue.vid'(fn _ => ( VId.fromString "*" )) in (LrTable.NT 4,(result,STAR1left,STAR1right),rest671) end | (25,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.tycon(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( TyCon.fromString ALPHA ) end ) in (LrTable.NT 5,(result,ALPHA1left,ALPHA1right),rest671) end | (26,(_,(MlyValue.SYMBOL SYMBOL1,SYMBOL1left,SYMBOL1right))::rest671) => let val result=MlyValue.tycon(fn _ => let val SYMBOL as SYMBOL1= SYMBOL1 () in ( TyCon.fromString SYMBOL ) end ) in (LrTable.NT 5,(result,SYMBOL1left,SYMBOL1right),rest671) end | (27,(_,(MlyValue.TYVAR TYVAR1,TYVAR1left,TYVAR1right))::rest671) => let val result=MlyValue.tyvar(fn _ => let val TYVAR as TYVAR1=TYVAR1 () in ( TyVar.fromString TYVAR ) end ) in (LrTable.NT 6,(result,TYVAR1left,TYVAR1right),rest671) end | (28,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.strid(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( StrId.fromString ALPHA ) end ) in (LrTable.NT 7,(result,ALPHA1left,ALPHA1right),rest671) end | (29,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.sigid(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( SigId.fromString ALPHA ) end ) in (LrTable.NT 8,(result,ALPHA1left,ALPHA1right),rest671) end | (30,(_,(MlyValue.ALPHA ALPHA1,ALPHA1left,ALPHA1right))::rest671) => let val result=MlyValue.funid(fn _ => let val ALPHA as ALPHA1=ALPHA1 () in ( FunId.fromString ALPHA ) end ) in (LrTable.NT 9,(result,ALPHA1left,ALPHA1right),rest671) end | (31,(_,(MlyValue.longvid' longvid'1,longvid'1left,longvid'1right)):: rest671) => let val result=MlyValue.longvid(fn _ => let val longvid' as longvid'1=longvid'1 () in ( longvid' ) end ) in (LrTable.NT 10,(result,longvid'1left,longvid'1right),rest671) end | (32,(_,(_,EQUALS1left,EQUALS1right))::rest671) => let val result= MlyValue.longvid(fn _ => ( LongVId.fromId(VId.fromString "=") )) in (LrTable.NT 10,(result,EQUALS1left,EQUALS1right),rest671) end | (33,(_,(MlyValue.vid' vid'1,vid'1left,vid'1right))::rest671) => let val result=MlyValue.longvid'(fn _ => let val vid' as vid'1=vid'1 () in ( LongVId.fromId vid' ) end ) in (LrTable.NT 11,(result,vid'1left,vid'1right),rest671) end | (34,(_,(MlyValue.LONGID LONGID1,LONGID1left,LONGID1right))::rest671) => let val result=MlyValue.longvid'(fn _ => let val LONGID as LONGID1 =LONGID1 () in ( LongVId.implode(toLongId VId.fromString LONGID) ) end ) in (LrTable.NT 11,(result,LONGID1left,LONGID1right),rest671) end | (35,(_,(MlyValue.tycon tycon1,tycon1left,tycon1right))::rest671) => let val result=MlyValue.longtycon(fn _ => let val tycon as tycon1= tycon1 () in ( LongTyCon.fromId tycon ) end ) in (LrTable.NT 12,(result,tycon1left,tycon1right),rest671) end | (36,(_,(MlyValue.LONGID LONGID1,LONGID1left,LONGID1right))::rest671) => let val result=MlyValue.longtycon(fn _ => let val LONGID as LONGID1=LONGID1 () in ( LongTyCon.implode(toLongId TyCon.fromString LONGID) ) end ) in (LrTable.NT 12,(result,LONGID1left,LONGID1right),rest671) end | (37,(_,(MlyValue.strid strid1,strid1left,strid1right))::rest671) => let val result=MlyValue.longstrid(fn _ => let val strid as strid1= strid1 () in ( LongStrId.fromId strid ) end ) in (LrTable.NT 13,(result,strid1left,strid1right),rest671) end | (38,(_,(MlyValue.LONGID LONGID1,LONGID1left,LONGID1right))::rest671) => let val result=MlyValue.longstrid(fn _ => let val LONGID as LONGID1=LONGID1 () in ( LongStrId.implode(toLongId StrId.fromString LONGID) ) end ) in (LrTable.NT 13,(result,LONGID1left,LONGID1right),rest671) end | (39,(_,(_,OP1left,OP1right))::rest671) => let val result= MlyValue.OP_opt(fn _ => ( WITHOp )) in (LrTable.NT 14,(result,OP1left,OP1right),rest671) end | (40,rest671) => let val result=MlyValue.OP_opt(fn _ => ( SANSOp )) in (LrTable.NT 14,(result,defaultPos,defaultPos),rest671) end | (41,(_,(MlyValue.scon scon1,sconleft as scon1left,sconright as scon1right))::rest671) => let val result=MlyValue.atexp(fn _ => let val scon as scon1=scon1 () in ( SCONAtExp(I(sconleft,sconright), scon) ) end ) in (LrTable.NT 15,(result,scon1left,scon1right),rest671) end | (42,(_,(MlyValue.longvid longvid1,_,longvidright as longvid1right)) ::(_,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val OP_opt as OP_opt1= OP_opt1 () val longvid as longvid1=longvid1 () in ( LONGVIDAtExp(I(OP_optleft,longvidright), OP_opt, longvid) ) end ) in (LrTable.NT 15,(result,OP_opt1left,longvid1right),rest671) end | (43,(_,(_,_,RBRACEright as RBRACE1right))::(_,(MlyValue.exprow_opt exprow_opt1,_,_))::(_,(_,LBRACEleft as LBRACE1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val exprow_opt as exprow_opt1=exprow_opt1 () in ( RECORDAtExp(I(LBRACEleft,RBRACEright), exprow_opt) ) end ) in (LrTable.NT 15,(result,LBRACE1left,RBRACE1right),rest671) end | (44,(_,(MlyValue.lab lab1,_,labright as lab1right))::(_,(_,HASHleft as HASH1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val lab as lab1=lab1 () in ( HASHAtExp(I(HASHleft,labright), lab) ) end ) in (LrTable.NT 15,(result,HASH1left,lab1right),rest671) end | (45,(_,(_,_,RPARright as RPAR1right))::(_,(_,LPARleft as LPAR1left,_ ))::rest671) => let val result=MlyValue.atexp(fn _ => ( UNITAtExp(I(LPARleft,RPARright)) )) in (LrTable.NT 15,(result,LPAR1left,RPAR1right),rest671) end | (46,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.exp_COMMA_list2 exp_COMMA_list21,_,_))::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val exp_COMMA_list2 as exp_COMMA_list21=exp_COMMA_list21 () in ( TUPLEAtExp(I(LPARleft,RPARright), exp_COMMA_list2) ) end ) in (LrTable.NT 15,(result,LPAR1left,RPAR1right),rest671) end | (47,(_,(_,_,RBRACKright as RBRACK1right))::(_,( MlyValue.exp_COMMA_list0 exp_COMMA_list01,_,_))::(_,(_,LBRACKleft as LBRACK1left,_))::rest671) => let val result=MlyValue.atexp(fn _ => let val exp_COMMA_list0 as exp_COMMA_list01=exp_COMMA_list01 () in ( LISTAtExp(I(LBRACKleft,RBRACKright), exp_COMMA_list0 )) end ) in (LrTable.NT 15,(result,LBRACK1left,RBRACK1right),rest671) end | (48,(_,(_,_,RPARright as RPAR1right))::(_,( MlyValue.exp_SEMICOLON_list2 exp_SEMICOLON_list21,_,_))::(_,(_, LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.atexp( fn _ => let val exp_SEMICOLON_list2 as exp_SEMICOLON_list21= exp_SEMICOLON_list21 () in ( SEQAtExp(I(LPARleft,RPARright), exp_SEMICOLON_list2) ) end ) in (LrTable.NT 15,(result,LPAR1left,RPAR1right),rest671) end | (49,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popInfix popInfix1 ,_,_))::(_,(MlyValue.exp_SEMICOLON_list1 exp_SEMICOLON_list11,_,_))::_ ::(_,(MlyValue.dec dec1,_,_))::(_,(MlyValue.pushInfix pushInfix1,_,_)) ::(_,(_,LETleft as LET1left,_))::rest671) => let val result= MlyValue.atexp(fn _ => let val pushInfix1=pushInfix1 () val dec as dec1=dec1 () val exp_SEMICOLON_list1 as exp_SEMICOLON_list11=exp_SEMICOLON_list11 () val popInfix1=popInfix1 () in ( LETAtExp(I(LETleft,ENDright), dec, exp_SEMICOLON_list1) ) end ) in (LrTable.NT 15,(result,LET1left,END1right),rest671) end | (50,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.exp exp1,_,_)):: (_,(_,LPARleft as LPAR1left,_))::rest671) => let val result= MlyValue.atexp(fn _ => let val exp as exp1=exp1 () in ( PARAtExp(I(LPARleft,RPARright), exp) ) end ) in (LrTable.NT 15,(result,LPAR1left,RPAR1right),rest671) end | (51,(_,(MlyValue.exp_COMMA_list1 exp_COMMA_list11, exp_COMMA_list11left,exp_COMMA_list11right))::rest671) => let val result=MlyValue.exp_COMMA_list0(fn _ => let val exp_COMMA_list1 as exp_COMMA_list11=exp_COMMA_list11 () in ( exp_COMMA_list1 ) end ) in (LrTable.NT 16,(result,exp_COMMA_list11left,exp_COMMA_list11right) ,rest671) end | (52,rest671) => let val result=MlyValue.exp_COMMA_list0(fn _ => ( [] )) in (LrTable.NT 16,(result,defaultPos,defaultPos),rest671) end | (53,(_,(MlyValue.exp_COMMA_list1 exp_COMMA_list11,_, exp_COMMA_list11right))::_::(_,(MlyValue.exp exp1,exp1left,_)):: rest671) => let val result=MlyValue.exp_COMMA_list1(fn _ => let val exp as exp1=exp1 () val exp_COMMA_list1 as exp_COMMA_list11=exp_COMMA_list11 () in ( exp::exp_COMMA_list1 ) end ) in (LrTable.NT 17,(result,exp1left,exp_COMMA_list11right),rest671) end | (54,(_,(MlyValue.exp exp1,exp1left,exp1right))::rest671) => let val result=MlyValue.exp_COMMA_list1(fn _ => let val exp as exp1=exp1 () in ( exp::[] ) end ) in (LrTable.NT 17,(result,exp1left,exp1right),rest671) end | (55,(_,(MlyValue.exp_COMMA_list1 exp_COMMA_list11,_, exp_COMMA_list11right))::_::(_,(MlyValue.exp exp1,exp1left,_)):: rest671) => let val result=MlyValue.exp_COMMA_list2(fn _ => let val exp as exp1=exp1 () val exp_COMMA_list1 as exp_COMMA_list11=exp_COMMA_list11 () in ( exp::exp_COMMA_list1 ) end ) in (LrTable.NT 18,(result,exp1left,exp_COMMA_list11right),rest671) end | (56,(_,(MlyValue.exp_SEMICOLON_list1 exp_SEMICOLON_list11,_, exp_SEMICOLON_list11right))::_::(_,(MlyValue.exp exp1,exp1left,_)):: rest671) => let val result=MlyValue.exp_SEMICOLON_list1(fn _ => let val exp as exp1=exp1 () val exp_SEMICOLON_list1 as exp_SEMICOLON_list11=exp_SEMICOLON_list11 () in ( exp::exp_SEMICOLON_list1 ) end ) in (LrTable.NT 19,(result,exp1left,exp_SEMICOLON_list11right),rest671 ) end | (57,(_,(MlyValue.exp exp1,exp1left,exp1right))::rest671) => let val result=MlyValue.exp_SEMICOLON_list1(fn _ => let val exp as exp1=exp1 () in ( exp::[] ) end ) in (LrTable.NT 19,(result,exp1left,exp1right),rest671) end | (58,(_,(MlyValue.exp_SEMICOLON_list2 exp_SEMICOLON_list21,_, exp_SEMICOLON_list21right))::_::(_,(MlyValue.exp exp1,exp1left,_)):: rest671) => let val result=MlyValue.exp_SEMICOLON_list2(fn _ => let val exp as exp1=exp1 () val exp_SEMICOLON_list2 as exp_SEMICOLON_list21=exp_SEMICOLON_list21 () in ( exp::exp_SEMICOLON_list2 ) end ) in (LrTable.NT 20,(result,exp1left,exp_SEMICOLON_list21right),rest671 ) end | (59,(_,(MlyValue.exp exp2,_,exp2right))::_::(_,(MlyValue.exp exp1, exp1left,_))::rest671) => let val result=MlyValue.exp_SEMICOLON_list2( fn _ => let val exp1=exp1 () val exp2=exp2 () in ( [exp1, exp2] ) end ) in (LrTable.NT 20,(result,exp1left,exp2right),rest671) end | (60,(_,(MlyValue.COMMA_exprow_opt COMMA_exprow_opt1,_, COMMA_exprow_optright as COMMA_exprow_opt1right))::(_,(MlyValue.exp exp1,_,_))::_::(_,(MlyValue.lab lab1,lableft as lab1left,_))::rest671) => let val result=MlyValue.exprow(fn _ => let val lab as lab1=lab1 () val exp as exp1=exp1 () val COMMA_exprow_opt as COMMA_exprow_opt1=COMMA_exprow_opt1 () in ( ExpRow(I(lableft,COMMA_exprow_optright), lab, exp, COMMA_exprow_opt) ) end ) in (LrTable.NT 21,(result,lab1left,COMMA_exprow_opt1right),rest671) end | (61,(_,(MlyValue.exprow exprow1,_,exprow1right))::(_,(_,COMMA1left,_ ))::rest671) => let val result=MlyValue.COMMA_exprow_opt(fn _ => let val exprow as exprow1=exprow1 () in ( SOME exprow ) end ) in (LrTable.NT 23,(result,COMMA1left,exprow1right),rest671) end | (62,rest671) => let val result=MlyValue.COMMA_exprow_opt(fn _ => ( NONE )) in (LrTable.NT 23,(result,defaultPos,defaultPos),rest671) end | (63,(_,(MlyValue.exprow exprow1,exprow1left,exprow1right))::rest671) => let val result=MlyValue.exprow_opt(fn _ => let val exprow as exprow1=exprow1 () in ( SOME exprow ) end ) in (LrTable.NT 22,(result,exprow1left,exprow1right),rest671) end | (64,rest671) => let val result=MlyValue.exprow_opt(fn _ => ( NONE )) in (LrTable.NT 22,(result,defaultPos,defaultPos),rest671) end | (65,(_,(MlyValue.atexp atexp1,atexp1left,atexp1right))::rest671) => let val result=MlyValue.appexp(fn _ => let val atexp as atexp1=atexp1 () in ( atexp::[] ) end ) in (LrTable.NT 24,(result,atexp1left,atexp1right),rest671) end | (66,(_,(MlyValue.atexp atexp1,_,atexp1right))::(_,(MlyValue.appexp appexp1,appexp1left,_))::rest671) => let val result=MlyValue.appexp( fn _ => let val appexp as appexp1=appexp1 () val atexp as atexp1=atexp1 () in ( atexp::appexp ) end ) in (LrTable.NT 24,(result,appexp1left,atexp1right),rest671) end | (67,(_,(MlyValue.appexp appexp1,appexp1left,appexp1right))::rest671) => let val result=MlyValue.infexp(fn _ => let val appexp as appexp1= appexp1 () in ( Infix.parseExp(!J, List.rev appexp) ) end ) in (LrTable.NT 25,(result,appexp1left,appexp1right),rest671) end | (68,(_,(MlyValue.infexp infexp1,infexp1left,infexp1right))::rest671) => let val result=MlyValue.exp(fn _ => let val infexp as infexp1= infexp1 () in ( infexp ) end ) in (LrTable.NT 26,(result,infexp1left,infexp1right),rest671) end | (69,(_,(MlyValue.ty ty1,_,tyright as ty1right))::_::(_,(MlyValue.exp exp1,expleft as exp1left,_))::rest671) => let val result=MlyValue.exp (fn _ => let val exp as exp1=exp1 () val ty as ty1=ty1 () in ( TYPEDExp(I(expleft,tyright), exp, ty) ) end ) in (LrTable.NT 26,(result,exp1left,ty1right),rest671) end | (70,(_,(MlyValue.exp exp2,_,exp2right))::_::(_,(MlyValue.exp exp1, exp1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val exp1=exp1 () val exp2=exp2 () in ( ANDALSOExp(I(exp1left,exp2right), exp1, exp2)) end ) in (LrTable.NT 26,(result,exp1left,exp2right),rest671) end | (71,(_,(MlyValue.exp exp2,_,exp2right))::_::(_,(MlyValue.exp exp1, exp1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val exp1=exp1 () val exp2=exp2 () in ( ORELSEExp(I(exp1left,exp2right), exp1, exp2) ) end ) in (LrTable.NT 26,(result,exp1left,exp2right),rest671) end | (72,(_,(MlyValue.match match1,_,matchright as match1right))::_::(_,( MlyValue.exp exp1,expleft as exp1left,_))::rest671) => let val result= MlyValue.exp(fn _ => let val exp as exp1=exp1 () val match as match1=match1 () in ( HANDLEExp(I(expleft,matchright), exp, match) ) end ) in (LrTable.NT 26,(result,exp1left,match1right),rest671) end | (73,(_,(MlyValue.exp exp1,_,expright as exp1right))::(_,(_,RAISEleft as RAISE1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val exp as exp1=exp1 () in ( RAISEExp(I(RAISEleft,expright), exp) ) end ) in (LrTable.NT 26,(result,RAISE1left,exp1right),rest671) end | (74,(_,(MlyValue.exp exp3,_,exp3right))::_::(_,(MlyValue.exp exp2,_, _))::_::(_,(MlyValue.exp exp1,_,_))::(_,(_,IFleft as IF1left,_)):: rest671) => let val result=MlyValue.exp(fn _ => let val exp1=exp1 () val exp2=exp2 () val exp3=exp3 () in ( IFExp(I(IFleft,exp3right), exp1, exp2, exp3) ) end ) in (LrTable.NT 26,(result,IF1left,exp3right),rest671) end | (75,(_,(MlyValue.exp exp2,_,exp2right))::_::(_,(MlyValue.exp exp1,_, _))::(_,(_,WHILEleft as WHILE1left,_))::rest671) => let val result= MlyValue.exp(fn _ => let val exp1=exp1 () val exp2=exp2 () in ( WHILEExp(I(WHILEleft,exp2right), exp1, exp2) ) end ) in (LrTable.NT 26,(result,WHILE1left,exp2right),rest671) end | (76,(_,(MlyValue.match match1,_,matchright as match1right))::_::(_,( MlyValue.exp exp1,_,_))::(_,(_,CASEleft as CASE1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val exp as exp1=exp1 () val match as match1=match1 () in ( CASEExp(I(CASEleft,matchright), exp, match) ) end ) in (LrTable.NT 26,(result,CASE1left,match1right),rest671) end | (77,(_,(MlyValue.match match1,_,matchright as match1right))::(_,(_, FNleft as FN1left,_))::rest671) => let val result=MlyValue.exp(fn _ => let val match as match1=match1 () in ( FNExp(I(FNleft,matchright), match) ) end ) in (LrTable.NT 26,(result,FN1left,match1right),rest671) end | (78,(_,(MlyValue.BAR_match_opt BAR_match_opt1,_,BAR_match_optright as BAR_match_opt1right))::(_,(MlyValue.mrule mrule1,mruleleft as mrule1left,_))::rest671) => let val result=MlyValue.match(fn _ => let val mrule as mrule1=mrule1 () val BAR_match_opt as BAR_match_opt1=BAR_match_opt1 () in ( Match(I(mruleleft,BAR_match_optright), mrule, BAR_match_opt) ) end ) in (LrTable.NT 27,(result,mrule1left,BAR_match_opt1right),rest671) end | (79,(_,(MlyValue.match match1,_,match1right))::(_,(_,BAR1left,_)):: rest671) => let val result=MlyValue.BAR_match_opt(fn _ => let val match as match1=match1 () in ( SOME match ) end ) in (LrTable.NT 28,(result,BAR1left,match1right),rest671) end | (80,rest671) => let val result=MlyValue.BAR_match_opt(fn _ => ( NONE )) in (LrTable.NT 28,(result,defaultPos,defaultPos),rest671) end | (81,(_,(MlyValue.exp exp1,_,expright as exp1right))::_::(_,( MlyValue.pat pat1,patleft as pat1left,_))::rest671) => let val result= MlyValue.mrule(fn _ => let val pat as pat1=pat1 () val exp as exp1=exp1 () in ( Mrule(I(patleft,expright), pat, exp) ) end ) in (LrTable.NT 29,(result,pat1left,exp1right),rest671) end | (82,(_,(MlyValue.dec1 dec11,dec11left,dec11right))::rest671) => let val result=MlyValue.dec(fn _ => let val dec1 as dec11=dec11 () in ( dec1 ) end ) in (LrTable.NT 30,(result,dec11left,dec11right),rest671) end | (83,rest671) => let val result=MlyValue.dec(fn _ => ( EMPTYDec(I(defaultPos,defaultPos)) )) in (LrTable.NT 30,(result,defaultPos,defaultPos),rest671) end | (84,(_,(MlyValue.dec1' dec1'1,dec1'1left,dec1'1right))::rest671) => let val result=MlyValue.dec1(fn _ => let val dec1' as dec1'1=dec1'1 () in ( dec1' ) end ) in (LrTable.NT 31,(result,dec1'1left,dec1'1right),rest671) end | (85,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popLocalInfix popLocalInfix1,_,_))::(_,(MlyValue.dec dec2,_,_))::(_,( MlyValue.pushLocalInfix pushLocalInfix1,_,_))::_::(_,(MlyValue.dec dec1,_,_))::(_,(MlyValue.pushInfix pushInfix1,_,_))::(_,(_,LOCALleft as LOCAL1left,_))::rest671) => let val result=MlyValue.dec1(fn _ => let val pushInfix1=pushInfix1 () val dec1=dec1 () val pushLocalInfix1=pushLocalInfix1 () val dec2=dec2 () val popLocalInfix1=popLocalInfix1 () in ( LOCALDec(I(LOCALleft,ENDright), dec1, dec2) ) end ) in (LrTable.NT 31,(result,LOCAL1left,END1right),rest671) end | (86,(_,(MlyValue.dec1 dec12,_,dec12right))::(_,(MlyValue.dec1 dec11, dec11left,_))::rest671) => let val result=MlyValue.dec1(fn _ => let val dec11=dec11 () val dec12=dec12 () in ( SEQDec(I(dec11left,dec12right), dec11, dec12) ) end ) in (LrTable.NT 31,(result,dec11left,dec12right),rest671) end | (87,(_,(_,SEMICOLON1left,SEMICOLON1right))::rest671) => let val result=MlyValue.dec1(fn _ => ( EMPTYDec(I(defaultPos,defaultPos)) )) in (LrTable.NT 31,(result,SEMICOLON1left,SEMICOLON1right),rest671) end | (88,(_,(MlyValue.valbind valbind1,_,valbindright as valbind1right)) ::(_,(_,VALleft as VAL1left,_))::rest671) => let val result= MlyValue.dec1'(fn _ => let val valbind as valbind1=valbind1 () in ( VALDec(I(VALleft,valbindright), TyVarseq(I(defaultPos,defaultPos), []), valbind) ) end ) in (LrTable.NT 32,(result,VAL1left,valbind1right),rest671) end | (89,(_,(MlyValue.valbind valbind1,_,valbindright as valbind1right)) ::(_,(MlyValue.tyvarseq1 tyvarseq11,_,_))::(_,(_,VALleft as VAL1left,_ ))::rest671) => let val result=MlyValue.dec1'(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () val valbind as valbind1=valbind1 () in ( VALDec(I(VALleft,valbindright), tyvarseq1, valbind) ) end ) in (LrTable.NT 32,(result,VAL1left,valbind1right),rest671) end | (90,(_,(MlyValue.fvalbind fvalbind1,_,fvalbindright as fvalbind1right))::(_,(_,FUNleft as FUN1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val fvalbind as fvalbind1=fvalbind1 () in ( FUNDec(I(FUNleft,fvalbindright), TyVarseq(I(defaultPos,defaultPos), []), fvalbind) ) end ) in (LrTable.NT 32,(result,FUN1left,fvalbind1right),rest671) end | (91,(_,(MlyValue.fvalbind fvalbind1,_,fvalbindright as fvalbind1right))::(_,(MlyValue.tyvarseq1 tyvarseq11,_,_))::(_,(_, FUNleft as FUN1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () val fvalbind as fvalbind1=fvalbind1 () in ( FUNDec(I(FUNleft,fvalbindright), tyvarseq1, fvalbind)) end ) in (LrTable.NT 32,(result,FUN1left,fvalbind1right),rest671) end | (92,(_,(MlyValue.typbind typbind1,_,typbindright as typbind1right)) ::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result= MlyValue.dec1'(fn _ => let val typbind as typbind1=typbind1 () in ( TYPEDec(I(TYPEleft,typbindright), typbind) ) end ) in (LrTable.NT 32,(result,TYPE1left,typbind1right),rest671) end | (93,(_,(MlyValue.WITHTYPE_typbind_opt WITHTYPE_typbind_opt1,_, WITHTYPE_typbind_optright as WITHTYPE_typbind_opt1right))::(_,( MlyValue.datbind0 datbind01,_,_))::(_,(_,DATATYPEleft as DATATYPE1left ,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val datbind0 as datbind01=datbind01 () val WITHTYPE_typbind_opt as WITHTYPE_typbind_opt1= WITHTYPE_typbind_opt1 () in ( DATATYPEDec(I(DATATYPEleft,WITHTYPE_typbind_optright), datbind0, WITHTYPE_typbind_opt) ) end ) in (LrTable.NT 32,(result,DATATYPE1left,WITHTYPE_typbind_opt1right), rest671) end | (94,(_,(MlyValue.WITHTYPE_typbind_opt WITHTYPE_typbind_opt1,_, WITHTYPE_typbind_optright as WITHTYPE_typbind_opt1right))::(_,( MlyValue.datbind1 datbind11,_,_))::(_,(_,DATATYPEleft as DATATYPE1left ,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val datbind1 as datbind11=datbind11 () val WITHTYPE_typbind_opt as WITHTYPE_typbind_opt1= WITHTYPE_typbind_opt1 () in ( DATATYPEDec(I(DATATYPEleft,WITHTYPE_typbind_optright), datbind1, WITHTYPE_typbind_opt) ) end ) in (LrTable.NT 32,(result,DATATYPE1left,WITHTYPE_typbind_opt1right), rest671) end | (95,(_,(MlyValue.longtycon longtycon1,_,longtyconright as longtycon1right))::_::_::(_,(MlyValue.tycon tycon1,_,_))::(_,(_, DATATYPEleft as DATATYPE1left,_))::rest671) => let val result= MlyValue.dec1'(fn _ => let val tycon as tycon1=tycon1 () val longtycon as longtycon1=longtycon1 () in ( REPLICATIONDec(I(DATATYPEleft,longtyconright), tycon, longtycon) ) end ) in (LrTable.NT 32,(result,DATATYPE1left,longtycon1right),rest671) end | (96,(_,(_,_,ENDright as END1right))::(_,(MlyValue.dec dec1,_,_))::_ ::(_,(MlyValue.WITHTYPE_typbind_opt WITHTYPE_typbind_opt1,_,_))::(_,( MlyValue.datbind datbind1,_,_))::(_,(_,ABSTYPEleft as ABSTYPE1left,_)) ::rest671) => let val result=MlyValue.dec1'(fn _ => let val datbind as datbind1=datbind1 () val WITHTYPE_typbind_opt as WITHTYPE_typbind_opt1= WITHTYPE_typbind_opt1 () val dec as dec1=dec1 () in ( ABSTYPEDec(I(ABSTYPEleft,ENDright), datbind, WITHTYPE_typbind_opt, dec) ) end ) in (LrTable.NT 32,(result,ABSTYPE1left,END1right),rest671) end | (97,(_,(MlyValue.exbind exbind1,_,exbindright as exbind1right))::(_, (_,EXCEPTIONleft as EXCEPTION1left,_))::rest671) => let val result= MlyValue.dec1'(fn _ => let val exbind as exbind1=exbind1 () in ( EXCEPTIONDec(I(EXCEPTIONleft,exbindright), exbind) ) end ) in (LrTable.NT 32,(result,EXCEPTION1left,exbind1right),rest671) end | (98,(_,(MlyValue.longstrid_list1 longstrid_list11,_, longstrid_list1right as longstrid_list11right))::(_,(_,OPENleft as OPEN1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val longstrid_list1 as longstrid_list11=longstrid_list11 () in ( OPENDec(I(OPENleft,longstrid_list1right), longstrid_list1) ) end ) in (LrTable.NT 32,(result,OPEN1left,longstrid_list11right),rest671) end | (99,(_,(MlyValue.vid_list1 vid_list11,_,vid_list1right as vid_list11right))::(_,(MlyValue.d_opt d_opt1,_,_))::(_,(_,INFIXleft as INFIX1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val d_opt as d_opt1=d_opt1 () val vid_list1 as vid_list11=vid_list11 () in ( assignInfix((Infix.LEFT, d_opt), vid_list1); EMPTYDec(I(INFIXleft,vid_list1right)) ) end ) in (LrTable.NT 32,(result,INFIX1left,vid_list11right),rest671) end | (100,(_,(MlyValue.vid_list1 vid_list11,_,vid_list1right as vid_list11right))::(_,(MlyValue.d_opt d_opt1,_,_))::(_,(_,INFIXRleft as INFIXR1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val d_opt as d_opt1=d_opt1 () val vid_list1 as vid_list11=vid_list11 () in ( assignInfix((Infix.RIGHT, d_opt), vid_list1); EMPTYDec(I(INFIXRleft,vid_list1right)) ) end ) in (LrTable.NT 32,(result,INFIXR1left,vid_list11right),rest671) end | (101,(_,(MlyValue.vid_list1 vid_list11,_,vid_list1right as vid_list11right))::(_,(_,NONFIXleft as NONFIX1left,_))::rest671) => let val result=MlyValue.dec1'(fn _ => let val vid_list1 as vid_list11= vid_list11 () in ( cancelInfix(vid_list1); EMPTYDec(I(NONFIXleft,vid_list1right)) ) end ) in (LrTable.NT 32,(result,NONFIX1left,vid_list11right),rest671) end | (102,(_,(MlyValue.typbind typbind1,_,typbind1right))::(_,(_, WITHTYPE1left,_))::rest671) => let val result= MlyValue.WITHTYPE_typbind_opt(fn _ => let val typbind as typbind1= typbind1 () in ( SOME typbind ) end ) in (LrTable.NT 33,(result,WITHTYPE1left,typbind1right),rest671) end | (103,rest671) => let val result=MlyValue.WITHTYPE_typbind_opt(fn _ => ( NONE )) in (LrTable.NT 33,(result,defaultPos,defaultPos),rest671) end | (104,(_,(MlyValue.vid_list1 vid_list11,_,vid_list11right))::(_,( MlyValue.vid vid1,vid1left,_))::rest671) => let val result= MlyValue.vid_list1(fn _ => let val vid as vid1=vid1 () val vid_list1 as vid_list11=vid_list11 () in ( vid::vid_list1 ) end ) in (LrTable.NT 34,(result,vid1left,vid_list11right),rest671) end | (105,(_,(MlyValue.vid vid1,vid1left,vid1right))::rest671) => let val result=MlyValue.vid_list1(fn _ => let val vid as vid1=vid1 () in ( vid::[] ) end ) in (LrTable.NT 34,(result,vid1left,vid1right),rest671) end | (106,(_,(MlyValue.longstrid_list1 longstrid_list11,_, longstrid_list11right))::(_,(MlyValue.longstrid longstrid1, longstrid1left,_))::rest671) => let val result= MlyValue.longstrid_list1(fn _ => let val longstrid as longstrid1= longstrid1 () val longstrid_list1 as longstrid_list11=longstrid_list11 () in ( longstrid::longstrid_list1 ) end ) in (LrTable.NT 35,(result,longstrid1left,longstrid_list11right), rest671) end | (107,(_,(MlyValue.longstrid longstrid1,longstrid1left, longstrid1right))::rest671) => let val result=MlyValue.longstrid_list1 (fn _ => let val longstrid as longstrid1=longstrid1 () in ( longstrid::[] ) end ) in (LrTable.NT 35,(result,longstrid1left,longstrid1right),rest671) end | (108,(_,(MlyValue.d d1,d1left,d1right))::rest671) => let val result= MlyValue.d_opt(fn _ => let val d as d1=d1 () in ( d ) end ) in (LrTable.NT 36,(result,d1left,d1right),rest671) end | (109,rest671) => let val result=MlyValue.d_opt(fn _ => ( 0 )) in (LrTable.NT 36,(result,defaultPos,defaultPos),rest671) end | (110,(_,(MlyValue.AND_valbind_opt AND_valbind_opt1,_, AND_valbind_optright as AND_valbind_opt1right))::(_,(MlyValue.exp exp1 ,_,_))::_::(_,(MlyValue.pat pat1,patleft as pat1left,_))::rest671) => let val result=MlyValue.valbind(fn _ => let val pat as pat1=pat1 () val exp as exp1=exp1 () val AND_valbind_opt as AND_valbind_opt1=AND_valbind_opt1 () in ( PLAINValBind(I(patleft,AND_valbind_optright), pat, exp, AND_valbind_opt) ) end ) in (LrTable.NT 37,(result,pat1left,AND_valbind_opt1right),rest671) end | (111,(_,(MlyValue.valbind valbind1,_,valbindright as valbind1right)) ::(_,(_,RECleft as REC1left,_))::rest671) => let val result= MlyValue.valbind(fn _ => let val valbind as valbind1=valbind1 () in ( RECValBind(I(RECleft,valbindright), valbind) ) end ) in (LrTable.NT 37,(result,REC1left,valbind1right),rest671) end | (112,(_,(MlyValue.valbind valbind1,_,valbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_valbind_opt(fn _ => let val valbind as valbind1=valbind1 () in ( SOME valbind ) end ) in (LrTable.NT 38,(result,AND1left,valbind1right),rest671) end | (113,rest671) => let val result=MlyValue.AND_valbind_opt(fn _ => ( NONE )) in (LrTable.NT 38,(result,defaultPos,defaultPos),rest671) end | (114,(_,(MlyValue.AND_fvalbind_opt AND_fvalbind_opt1,_, AND_fvalbind_optright as AND_fvalbind_opt1right))::(_,(MlyValue.fmatch fmatch1,fmatchleft as fmatch1left,_))::rest671) => let val result= MlyValue.fvalbind(fn _ => let val fmatch as fmatch1=fmatch1 () val AND_fvalbind_opt as AND_fvalbind_opt1=AND_fvalbind_opt1 () in ( FvalBind(I(fmatchleft,AND_fvalbind_optright), fmatch, AND_fvalbind_opt) ) end ) in (LrTable.NT 39,(result,fmatch1left,AND_fvalbind_opt1right),rest671 ) end | (115,(_,(MlyValue.fvalbind fvalbind1,_,fvalbind1right))::(_,(_, AND1left,_))::rest671) => let val result=MlyValue.AND_fvalbind_opt(fn _ => let val fvalbind as fvalbind1=fvalbind1 () in ( SOME fvalbind ) end ) in (LrTable.NT 40,(result,AND1left,fvalbind1right),rest671) end | (116,rest671) => let val result=MlyValue.AND_fvalbind_opt(fn _ => ( NONE )) in (LrTable.NT 40,(result,defaultPos,defaultPos),rest671) end | (117,(_,(MlyValue.BAR_fmatch_opt BAR_fmatch_opt1,_, BAR_fmatch_optright as BAR_fmatch_opt1right))::(_,(MlyValue.fmrule fmrule1,fmruleleft as fmrule1left,_))::rest671) => let val result= MlyValue.fmatch(fn _ => let val fmrule as fmrule1=fmrule1 () val BAR_fmatch_opt as BAR_fmatch_opt1=BAR_fmatch_opt1 () in ( Fmatch(I(fmruleleft,BAR_fmatch_optright), fmrule, BAR_fmatch_opt) ) end ) in (LrTable.NT 41,(result,fmrule1left,BAR_fmatch_opt1right),rest671) end | (118,(_,(MlyValue.fmatch fmatch1,_,fmatch1right))::(_,(_,BAR1left,_) )::rest671) => let val result=MlyValue.BAR_fmatch_opt(fn _ => let val fmatch as fmatch1=fmatch1 () in ( SOME fmatch ) end ) in (LrTable.NT 42,(result,BAR1left,fmatch1right),rest671) end | (119,rest671) => let val result=MlyValue.BAR_fmatch_opt(fn _ => ( NONE )) in (LrTable.NT 42,(result,defaultPos,defaultPos),rest671) end | (120,(_,(MlyValue.exp exp1,_,expright as exp1right))::_::(_,( MlyValue.COLON_ty_opt COLON_ty_opt1,_,_))::(_,(MlyValue.atpat_list1 atpat_list11,atpat_list1left as atpat_list11left,_))::rest671) => let val result=MlyValue.fmrule(fn _ => let val atpat_list1 as atpat_list11 =atpat_list11 () val COLON_ty_opt as COLON_ty_opt1=COLON_ty_opt1 () val exp as exp1=exp1 () in ( let val (op_opt, vid, atpats) = Infix.parseFmrule(!J, atpat_list1) in Fmrule(I(atpat_list1left,expright), op_opt, vid, atpats, COLON_ty_opt, exp) end ) end ) in (LrTable.NT 43,(result,atpat_list11left,exp1right),rest671) end | (121,(_,(MlyValue.AND_typbind_opt AND_typbind_opt1,_, AND_typbind_optright as AND_typbind_opt1right))::(_,(MlyValue.ty ty1,_ ,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671) => let val result=MlyValue.typbind(fn _ => let val tyvarseq as tyvarseq1= tyvarseq1 () val tycon as tycon1=tycon1 () val ty as ty1=ty1 () val AND_typbind_opt as AND_typbind_opt1=AND_typbind_opt1 () in ( TypBind(I(tyvarseqleft,AND_typbind_optright), tyvarseq, tycon, ty, AND_typbind_opt) ) end ) in (LrTable.NT 44,(result,tyvarseq1left,AND_typbind_opt1right), rest671) end | (122,(_,(MlyValue.typbind typbind1,_,typbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_typbind_opt(fn _ => let val typbind as typbind1=typbind1 () in ( SOME typbind ) end ) in (LrTable.NT 45,(result,AND1left,typbind1right),rest671) end | (123,rest671) => let val result=MlyValue.AND_typbind_opt(fn _ => ( NONE )) in (LrTable.NT 45,(result,defaultPos,defaultPos),rest671) end | (124,(_,(MlyValue.AND_datbind_opt AND_datbind_opt1,_, AND_datbind_optright as AND_datbind_opt1right))::(_,(MlyValue.conbind conbind1,_,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,( MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671 ) => let val result=MlyValue.datbind(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val tycon as tycon1=tycon1 () val conbind as conbind1=conbind1 () val AND_datbind_opt as AND_datbind_opt1=AND_datbind_opt1 () in ( DatBind(I(tyvarseqleft,AND_datbind_optright), tyvarseq, tycon, conbind, AND_datbind_opt) ) end ) in (LrTable.NT 46,(result,tyvarseq1left,AND_datbind_opt1right), rest671) end | (125,(_,(MlyValue.AND_datbind_opt AND_datbind_opt1,_, AND_datbind_optright as AND_datbind_opt1right))::(_,(MlyValue.conbind conbind1,_,_))::_::(_,(MlyValue.tycon tycon1,tyconleft as tycon1left,_ ))::rest671) => let val result=MlyValue.datbind0(fn _ => let val tycon as tycon1=tycon1 () val conbind as conbind1=conbind1 () val AND_datbind_opt as AND_datbind_opt1=AND_datbind_opt1 () in ( DatBind(I(tyconleft,AND_datbind_optright), TyVarseq(I(defaultPos,defaultPos), []), tycon, conbind, AND_datbind_opt) ) end ) in (LrTable.NT 47,(result,tycon1left,AND_datbind_opt1right),rest671) end | (126,(_,(MlyValue.AND_datbind_opt AND_datbind_opt1,_, AND_datbind_optright as AND_datbind_opt1right))::(_,(MlyValue.conbind conbind1,_,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,( MlyValue.tyvarseq1 tyvarseq11,tyvarseq1left as tyvarseq11left,_)):: rest671) => let val result=MlyValue.datbind1(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () val tycon as tycon1=tycon1 () val conbind as conbind1=conbind1 () val AND_datbind_opt as AND_datbind_opt1=AND_datbind_opt1 () in ( DatBind(I(tyvarseq1left,AND_datbind_optright), tyvarseq1, tycon, conbind, AND_datbind_opt) ) end ) in (LrTable.NT 48,(result,tyvarseq11left,AND_datbind_opt1right), rest671) end | (127,(_,(MlyValue.datbind datbind1,_,datbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_datbind_opt(fn _ => let val datbind as datbind1=datbind1 () in ( SOME datbind ) end ) in (LrTable.NT 49,(result,AND1left,datbind1right),rest671) end | (128,rest671) => let val result=MlyValue.AND_datbind_opt(fn _ => ( NONE )) in (LrTable.NT 49,(result,defaultPos,defaultPos),rest671) end | (129,(_,(MlyValue.BAR_conbind_opt BAR_conbind_opt1,_, BAR_conbind_optright as BAR_conbind_opt1right))::(_,( MlyValue.OF_ty_opt OF_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,_,_))::(_ ,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.conbind(fn _ => let val OP_opt as OP_opt1= OP_opt1 () val vid' as vid'1=vid'1 () val OF_ty_opt as OF_ty_opt1=OF_ty_opt1 () val BAR_conbind_opt as BAR_conbind_opt1=BAR_conbind_opt1 () in ( ConBind(I(OP_optleft,BAR_conbind_optright), OP_opt, vid', OF_ty_opt, BAR_conbind_opt) ) end ) in (LrTable.NT 50,(result,OP_opt1left,BAR_conbind_opt1right),rest671) end | (130,(_,(MlyValue.conbind conbind1,_,conbind1right))::(_,(_,BAR1left ,_))::rest671) => let val result=MlyValue.BAR_conbind_opt(fn _ => let val conbind as conbind1=conbind1 () in ( SOME conbind ) end ) in (LrTable.NT 51,(result,BAR1left,conbind1right),rest671) end | (131,rest671) => let val result=MlyValue.BAR_conbind_opt(fn _ => ( NONE )) in (LrTable.NT 51,(result,defaultPos,defaultPos),rest671) end | (132,(_,(MlyValue.ty ty1,_,ty1right))::(_,(_,OF1left,_))::rest671) => let val result=MlyValue.OF_ty_opt(fn _ => let val ty as ty1=ty1 () in ( SOME ty ) end ) in (LrTable.NT 52,(result,OF1left,ty1right),rest671) end | (133,rest671) => let val result=MlyValue.OF_ty_opt(fn _ => ( NONE )) in (LrTable.NT 52,(result,defaultPos,defaultPos),rest671) end | (134,(_,(MlyValue.AND_exbind_opt AND_exbind_opt1,_, AND_exbind_optright as AND_exbind_opt1right))::(_,(MlyValue.OF_ty_opt OF_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,_,_))::(_,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result= MlyValue.exbind(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val vid' as vid'1=vid'1 () val OF_ty_opt as OF_ty_opt1=OF_ty_opt1 () val AND_exbind_opt as AND_exbind_opt1=AND_exbind_opt1 () in ( NEWExBind(I(OP_optleft,AND_exbind_optright), OP_opt, vid', OF_ty_opt, AND_exbind_opt) ) end ) in (LrTable.NT 53,(result,OP_opt1left,AND_exbind_opt1right),rest671) end | (135,(_,(MlyValue.AND_exbind_opt AND_exbind_opt1,_, AND_exbind_optright as AND_exbind_opt1right))::(_,(MlyValue.longvid longvid1,_,_))::(_,(MlyValue.OP_opt OP_opt2,_,_))::_::(_,( MlyValue.vid' vid'1,_,_))::(_,(MlyValue.OP_opt OP_opt1,OP_opt1left,_)) ::rest671) => let val result=MlyValue.exbind(fn _ => let val OP_opt1= OP_opt1 () val vid' as vid'1=vid'1 () val OP_opt2=OP_opt2 () val longvid as longvid1=longvid1 () val AND_exbind_opt as AND_exbind_opt1=AND_exbind_opt1 () in ( EQUALExBind(I(OP_opt1left,AND_exbind_optright), OP_opt1, vid', OP_opt2, longvid, AND_exbind_opt) ) end ) in (LrTable.NT 53,(result,OP_opt1left,AND_exbind_opt1right),rest671) end | (136,(_,(MlyValue.exbind exbind1,_,exbind1right))::(_,(_,AND1left,_) )::rest671) => let val result=MlyValue.AND_exbind_opt(fn _ => let val exbind as exbind1=exbind1 () in ( SOME exbind ) end ) in (LrTable.NT 54,(result,AND1left,exbind1right),rest671) end | (137,rest671) => let val result=MlyValue.AND_exbind_opt(fn _ => ( NONE )) in (LrTable.NT 54,(result,defaultPos,defaultPos),rest671) end | (138,(_,(MlyValue.atpat' atpat'1,atpat'1left,atpat'1right))::rest671 ) => let val result=MlyValue.atpat(fn _ => let val atpat' as atpat'1= atpat'1 () in ( atpat' ) end ) in (LrTable.NT 55,(result,atpat'1left,atpat'1right),rest671) end | (139,(_,(MlyValue.longvid' longvid'1,_,longvid'right as longvid'1right))::(_,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.atpat(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val longvid' as longvid'1=longvid'1 () in ( LONGVIDAtPat(I(OP_optleft,longvid'right), OP_opt, longvid') ) end ) in (LrTable.NT 55,(result,OP_opt1left,longvid'1right),rest671) end | (140,(_,(_,UNDERBARleft as UNDERBAR1left,UNDERBARright as UNDERBAR1right))::rest671) => let val result=MlyValue.atpat'(fn _ => ( WILDCARDAtPat(I(UNDERBARleft,UNDERBARright)) )) in (LrTable.NT 56,(result,UNDERBAR1left,UNDERBAR1right),rest671) end | (141,(_,(MlyValue.scon scon1,sconleft as scon1left,sconright as scon1right))::rest671) => let val result=MlyValue.atpat'(fn _ => let val scon as scon1=scon1 () in ( SCONAtPat(I(sconleft,sconright), scon) ) end ) in (LrTable.NT 56,(result,scon1left,scon1right),rest671) end | (142,(_,(_,_,RBRACEright as RBRACE1right))::(_,(MlyValue.patrow_opt patrow_opt1,_,_))::(_,(_,LBRACEleft as LBRACE1left,_))::rest671) => let val result=MlyValue.atpat'(fn _ => let val patrow_opt as patrow_opt1=patrow_opt1 () in ( RECORDAtPat(I(LBRACEleft,RBRACEright), patrow_opt) ) end ) in (LrTable.NT 56,(result,LBRACE1left,RBRACE1right),rest671) end | (143,(_,(_,_,RPARright as RPAR1right))::(_,(_,LPARleft as LPAR1left, _))::rest671) => let val result=MlyValue.atpat'(fn _ => ( UNITAtPat(I(LPARleft,RPARright)) )) in (LrTable.NT 56,(result,LPAR1left,RPAR1right),rest671) end | (144,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.pat_COMMA_list2 pat_COMMA_list21,_,_))::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.atpat'(fn _ => let val pat_COMMA_list2 as pat_COMMA_list21=pat_COMMA_list21 () in ( TUPLEAtPat(I(LPARleft,RPARright), pat_COMMA_list2) ) end ) in (LrTable.NT 56,(result,LPAR1left,RPAR1right),rest671) end | (145,(_,(_,_,RBRACKright as RBRACK1right))::(_,( MlyValue.pat_COMMA_list0 pat_COMMA_list01,_,_))::(_,(_,LBRACKleft as LBRACK1left,_))::rest671) => let val result=MlyValue.atpat'(fn _ => let val pat_COMMA_list0 as pat_COMMA_list01=pat_COMMA_list01 () in ( LISTAtPat(I(LBRACKleft,RBRACKright), pat_COMMA_list0) ) end ) in (LrTable.NT 56,(result,LBRACK1left,RBRACK1right),rest671) end | (146,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.pat pat1,_,_)) ::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result= MlyValue.atpat'(fn _ => let val pat as pat1=pat1 () in ( PARAtPat(I(LPARleft,RPARright), pat) ) end ) in (LrTable.NT 56,(result,LPAR1left,RPAR1right),rest671) end | (147,(_,(MlyValue.pat_COMMA_list1 pat_COMMA_list11, pat_COMMA_list11left,pat_COMMA_list11right))::rest671) => let val result=MlyValue.pat_COMMA_list0(fn _ => let val pat_COMMA_list1 as pat_COMMA_list11=pat_COMMA_list11 () in ( pat_COMMA_list1 ) end ) in (LrTable.NT 57,(result,pat_COMMA_list11left,pat_COMMA_list11right) ,rest671) end | (148,rest671) => let val result=MlyValue.pat_COMMA_list0(fn _ => ( [] )) in (LrTable.NT 57,(result,defaultPos,defaultPos),rest671) end | (149,(_,(MlyValue.pat_COMMA_list1 pat_COMMA_list11,_, pat_COMMA_list11right))::_::(_,(MlyValue.pat pat1,pat1left,_)):: rest671) => let val result=MlyValue.pat_COMMA_list1(fn _ => let val pat as pat1=pat1 () val pat_COMMA_list1 as pat_COMMA_list11=pat_COMMA_list11 () in ( pat::pat_COMMA_list1 ) end ) in (LrTable.NT 58,(result,pat1left,pat_COMMA_list11right),rest671) end | (150,(_,(MlyValue.pat pat1,pat1left,pat1right))::rest671) => let val result=MlyValue.pat_COMMA_list1(fn _ => let val pat as pat1=pat1 () in ( pat::[] ) end ) in (LrTable.NT 58,(result,pat1left,pat1right),rest671) end | (151,(_,(MlyValue.pat_COMMA_list1 pat_COMMA_list11,_, pat_COMMA_list11right))::_::(_,(MlyValue.pat pat1,pat1left,_)):: rest671) => let val result=MlyValue.pat_COMMA_list2(fn _ => let val pat as pat1=pat1 () val pat_COMMA_list1 as pat_COMMA_list11=pat_COMMA_list11 () in ( pat::pat_COMMA_list1 ) end ) in (LrTable.NT 59,(result,pat1left,pat_COMMA_list11right),rest671) end | (152,(_,(_,DOTSleft as DOTS1left,DOTSright as DOTS1right))::rest671) => let val result=MlyValue.patrow(fn _ => ( WILDCARDPatRow(I(DOTSleft,DOTSright)) )) in (LrTable.NT 60,(result,DOTS1left,DOTS1right),rest671) end | (153,(_,(MlyValue.COMMA_patrow_opt COMMA_patrow_opt1,_, COMMA_patrow_optright as COMMA_patrow_opt1right))::(_,(MlyValue.pat pat1,_,_))::_::(_,(MlyValue.lab lab1,lableft as lab1left,_))::rest671) => let val result=MlyValue.patrow(fn _ => let val lab as lab1=lab1 () val pat as pat1=pat1 () val COMMA_patrow_opt as COMMA_patrow_opt1=COMMA_patrow_opt1 () in ( ROWPatRow(I(lableft,COMMA_patrow_optright), lab, pat, COMMA_patrow_opt) ) end ) in (LrTable.NT 60,(result,lab1left,COMMA_patrow_opt1right),rest671) end | (154,(_,(MlyValue.COMMA_patrow_opt COMMA_patrow_opt1,_, COMMA_patrow_optright as COMMA_patrow_opt1right))::(_,( MlyValue.AS_pat_opt AS_pat_opt1,_,_))::(_,(MlyValue.COLON_ty_opt COLON_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,vid'left as vid'1left,_)) ::rest671) => let val result=MlyValue.patrow(fn _ => let val vid' as vid'1=vid'1 () val COLON_ty_opt as COLON_ty_opt1=COLON_ty_opt1 () val AS_pat_opt as AS_pat_opt1=AS_pat_opt1 () val COMMA_patrow_opt as COMMA_patrow_opt1=COMMA_patrow_opt1 () in ( VIDPatRow(I(vid'left,COMMA_patrow_optright), vid', COLON_ty_opt, AS_pat_opt, COMMA_patrow_opt) ) end ) in (LrTable.NT 60,(result,vid'1left,COMMA_patrow_opt1right),rest671) end | (155,(_,(MlyValue.patrow patrow1,_,patrow1right))::(_,(_,COMMA1left, _))::rest671) => let val result=MlyValue.COMMA_patrow_opt(fn _ => let val patrow as patrow1=patrow1 () in ( SOME patrow ) end ) in (LrTable.NT 62,(result,COMMA1left,patrow1right),rest671) end | (156,rest671) => let val result=MlyValue.COMMA_patrow_opt(fn _ => ( NONE )) in (LrTable.NT 62,(result,defaultPos,defaultPos),rest671) end | (157,(_,(MlyValue.ty ty1,_,ty1right))::(_,(_,COLON1left,_))::rest671 ) => let val result=MlyValue.COLON_ty_opt(fn _ => let val ty as ty1= ty1 () in ( SOME ty ) end ) in (LrTable.NT 63,(result,COLON1left,ty1right),rest671) end | (158,rest671) => let val result=MlyValue.COLON_ty_opt(fn _ => ( NONE )) in (LrTable.NT 63,(result,defaultPos,defaultPos),rest671) end | (159,(_,(MlyValue.pat pat1,_,pat1right))::(_,(_,AS1left,_))::rest671 ) => let val result=MlyValue.AS_pat_opt(fn _ => let val pat as pat1= pat1 () in ( SOME pat ) end ) in (LrTable.NT 64,(result,AS1left,pat1right),rest671) end | (160,rest671) => let val result=MlyValue.AS_pat_opt(fn _ => ( NONE ) ) in (LrTable.NT 64,(result,defaultPos,defaultPos),rest671) end | (161,(_,(MlyValue.patrow patrow1,patrow1left,patrow1right))::rest671 ) => let val result=MlyValue.patrow_opt(fn _ => let val patrow as patrow1=patrow1 () in ( SOME patrow ) end ) in (LrTable.NT 61,(result,patrow1left,patrow1right),rest671) end | (162,rest671) => let val result=MlyValue.patrow_opt(fn _ => ( NONE ) ) in (LrTable.NT 61,(result,defaultPos,defaultPos),rest671) end | (163,(_,(MlyValue.atpat atpat1,atpat1left,atpat1right))::rest671) => let val result=MlyValue.pat(fn _ => let val atpat as atpat1=atpat1 () in ( Infix.parsePat(!J, [atpat]) ) end ) in (LrTable.NT 65,(result,atpat1left,atpat1right),rest671) end | (164,(_,(MlyValue.atpat_list2 atpat_list21,atpat_list21left, atpat_list21right))::rest671) => let val result=MlyValue.pat(fn _ => let val atpat_list2 as atpat_list21=atpat_list21 () in ( Infix.parsePat(!J, atpat_list2) ) end ) in (LrTable.NT 65,(result,atpat_list21left,atpat_list21right),rest671 ) end | (165,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.atpat' atpat'1,atpat'1left,_)):: rest671) => let val result=MlyValue.pat(fn _ => let val atpat' as atpat'1=atpat'1 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( let val pat = Infix.parsePat(!J, [atpat']) in typedPat(pat, COLON_ty_list1) end ) end ) in (LrTable.NT 65,(result,atpat'1left,COLON_ty_list11right),rest671) end | (166,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.atpat_list2 atpat_list21, atpat_list21left,_))::rest671) => let val result=MlyValue.pat(fn _ => let val atpat_list2 as atpat_list21=atpat_list21 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( let val pat = Infix.parsePat(!J, atpat_list2) in typedPat(pat, COLON_ty_list1) end ) end ) in (LrTable.NT 65,(result,atpat_list21left,COLON_ty_list11right), rest671) end | (167,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.vid' vid'1,_,vid'right))::(_,( MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.pat(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val vid' as vid'1=vid'1 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( let val atpat = LONGVIDAtPat(I(OP_optleft,vid'right), OP_opt, LongVId.fromId vid') val pat = Infix.parsePat(!J, [atpat]) in typedPat(pat, COLON_ty_list1) end ) end ) in (LrTable.NT 65,(result,OP_opt1left,COLON_ty_list11right),rest671) end | (168,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.LONGID LONGID1,_,LONGIDright))::( _,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_))::rest671) => let val result=MlyValue.pat(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val LONGID as LONGID1=LONGID1 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( let val longvid = LongVId.implode (toLongId VId.fromString LONGID) val atpat = LONGVIDAtPat(I(OP_optleft,LONGIDright), OP_opt, longvid) val pat = Infix.parsePat(!J, [atpat]) in typedPat(pat, COLON_ty_list1) end ) end ) in (LrTable.NT 65,(result,OP_opt1left,COLON_ty_list11right),rest671) end | (169,(_,(MlyValue.pat pat1,_,patright as pat1right))::_::(_,( MlyValue.COLON_ty_opt COLON_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,_, vid'right))::(_,(MlyValue.OP_opt OP_opt1,OP_optleft as OP_opt1left,_)) ::rest671) => let val result=MlyValue.pat(fn _ => let val OP_opt as OP_opt1=OP_opt1 () val vid' as vid'1=vid'1 () val COLON_ty_opt as COLON_ty_opt1=COLON_ty_opt1 () val pat as pat1=pat1 () in ( Infix.parsePat(!J, [ LONGVIDAtPat(I(OP_optleft,vid'right), OP_opt, LongVId.implode([],vid')) ] ) ; ASPat(I(OP_optleft,patright), OP_opt, vid', COLON_ty_opt, pat) ) end ) in (LrTable.NT 65,(result,OP_opt1left,pat1right),rest671) end | (170,(_,(MlyValue.atpat_list1 atpat_list11,_,atpat_list11right))::(_ ,(MlyValue.atpat atpat1,atpat1left,_))::rest671) => let val result= MlyValue.atpat_list1(fn _ => let val atpat as atpat1=atpat1 () val atpat_list1 as atpat_list11=atpat_list11 () in ( atpat::atpat_list1 ) end ) in (LrTable.NT 66,(result,atpat1left,atpat_list11right),rest671) end | (171,(_,(MlyValue.atpat atpat1,atpat1left,atpat1right))::rest671) => let val result=MlyValue.atpat_list1(fn _ => let val atpat as atpat1=atpat1 () in ( atpat::[] ) end ) in (LrTable.NT 66,(result,atpat1left,atpat1right),rest671) end | (172,(_,(MlyValue.atpat_list1 atpat_list11,_,atpat_list11right))::(_ ,(MlyValue.atpat atpat1,atpat1left,_))::rest671) => let val result= MlyValue.atpat_list2(fn _ => let val atpat as atpat1=atpat1 () val atpat_list1 as atpat_list11=atpat_list11 () in ( atpat::atpat_list1 ) end ) in (LrTable.NT 67,(result,atpat1left,atpat_list11right),rest671) end | (173,(_,(MlyValue.COLON_ty_list1 COLON_ty_list11,_, COLON_ty_list11right))::(_,(MlyValue.ty ty1,_,_))::(_,(_,COLON1left,_) )::rest671) => let val result=MlyValue.COLON_ty_list1(fn _ => let val ty as ty1=ty1 () val COLON_ty_list1 as COLON_ty_list11=COLON_ty_list11 () in ( ty::COLON_ty_list1 ) end ) in (LrTable.NT 68,(result,COLON1left,COLON_ty_list11right),rest671) end | (174,(_,(MlyValue.ty ty1,_,ty1right))::(_,(_,COLON1left,_))::rest671 ) => let val result=MlyValue.COLON_ty_list1(fn _ => let val ty as ty1= ty1 () in ( ty::[] ) end ) in (LrTable.NT 68,(result,COLON1left,ty1right),rest671) end | (175,(_,(MlyValue.tupty tupty1,tupty1left,tupty1right))::rest671) => let val result=MlyValue.ty(fn _ => let val tupty as tupty1=tupty1 () in ( tupty ) end ) in (LrTable.NT 69,(result,tupty1left,tupty1right),rest671) end | (176,(_,(MlyValue.ty ty1,_,tyright as ty1right))::_::(_,( MlyValue.tupty tupty1,tuptyleft as tupty1left,_))::rest671) => let val result=MlyValue.ty(fn _ => let val tupty as tupty1=tupty1 () val ty as ty1=ty1 () in ( ARROWTy(I(tuptyleft,tyright), tupty, ty) ) end ) in (LrTable.NT 69,(result,tupty1left,ty1right),rest671) end | (177,(_,(MlyValue.ty_STAR_list ty_STAR_list1,ty_STAR_listleft as ty_STAR_list1left,ty_STAR_listright as ty_STAR_list1right))::rest671) => let val result=MlyValue.tupty(fn _ => let val ty_STAR_list as ty_STAR_list1=ty_STAR_list1 () in ( TUPLETy(I(ty_STAR_listleft,ty_STAR_listright), ty_STAR_list) ) end ) in (LrTable.NT 70,(result,ty_STAR_list1left,ty_STAR_list1right), rest671) end | (178,(_,(MlyValue.ty_STAR_list ty_STAR_list1,_,ty_STAR_list1right)) ::_::(_,(MlyValue.consty consty1,consty1left,_))::rest671) => let val result=MlyValue.ty_STAR_list(fn _ => let val consty as consty1=consty1 () val ty_STAR_list as ty_STAR_list1=ty_STAR_list1 () in ( consty::ty_STAR_list ) end ) in (LrTable.NT 71,(result,consty1left,ty_STAR_list1right),rest671) end | (179,(_,(MlyValue.consty consty1,consty1left,consty1right))::rest671 ) => let val result=MlyValue.ty_STAR_list(fn _ => let val consty as consty1=consty1 () in ( consty::[] ) end ) in (LrTable.NT 71,(result,consty1left,consty1right),rest671) end | (180,(_,(MlyValue.atty atty1,atty1left,atty1right))::rest671) => let val result=MlyValue.consty(fn _ => let val atty as atty1=atty1 () in ( atty ) end ) in (LrTable.NT 72,(result,atty1left,atty1right),rest671) end | (181,(_,(MlyValue.longtycon longtycon1,_,longtyconright as longtycon1right))::(_,(MlyValue.tyseq tyseq1,tyseqleft as tyseq1left,_ ))::rest671) => let val result=MlyValue.consty(fn _ => let val tyseq as tyseq1=tyseq1 () val longtycon as longtycon1=longtycon1 () in ( TYCONTy(I(tyseqleft,longtyconright), tyseq, longtycon) ) end ) in (LrTable.NT 72,(result,tyseq1left,longtycon1right),rest671) end | (182,(_,(MlyValue.tyvar tyvar1,tyvarleft as tyvar1left,tyvarright as tyvar1right))::rest671) => let val result=MlyValue.atty(fn _ => let val tyvar as tyvar1=tyvar1 () in ( TYVARTy(I(tyvarleft,tyvarright), tyvar) ) end ) in (LrTable.NT 73,(result,tyvar1left,tyvar1right),rest671) end | (183,(_,(_,_,RBRACEright as RBRACE1right))::(_,(MlyValue.tyrow_opt tyrow_opt1,_,_))::(_,(_,LBRACEleft as LBRACE1left,_))::rest671) => let val result=MlyValue.atty(fn _ => let val tyrow_opt as tyrow_opt1= tyrow_opt1 () in ( RECORDTy(I(LBRACEleft,RBRACEright), tyrow_opt) ) end ) in (LrTable.NT 73,(result,LBRACE1left,RBRACE1right),rest671) end | (184,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.ty ty1,_,_))::( _,(_,LPARleft as LPAR1left,_))::rest671) => let val result= MlyValue.atty(fn _ => let val ty as ty1=ty1 () in ( PARTy(I(LPARleft,RPARright), ty) ) end ) in (LrTable.NT 73,(result,LPAR1left,RPAR1right),rest671) end | (185,(_,(MlyValue.COMMA_tyrow_opt COMMA_tyrow_opt1,_, COMMA_tyrow_optright as COMMA_tyrow_opt1right))::(_,(MlyValue.ty ty1,_ ,_))::_::(_,(MlyValue.lab lab1,lableft as lab1left,_))::rest671) => let val result=MlyValue.tyrow(fn _ => let val lab as lab1=lab1 () val ty as ty1=ty1 () val COMMA_tyrow_opt as COMMA_tyrow_opt1=COMMA_tyrow_opt1 () in ( TyRow(I(lableft,COMMA_tyrow_optright), lab, ty, COMMA_tyrow_opt) ) end ) in (LrTable.NT 74,(result,lab1left,COMMA_tyrow_opt1right),rest671) end | (186,(_,(MlyValue.tyrow tyrow1,_,tyrow1right))::(_,(_,COMMA1left,_)) ::rest671) => let val result=MlyValue.COMMA_tyrow_opt(fn _ => let val tyrow as tyrow1=tyrow1 () in ( SOME tyrow ) end ) in (LrTable.NT 76,(result,COMMA1left,tyrow1right),rest671) end | (187,rest671) => let val result=MlyValue.COMMA_tyrow_opt(fn _ => ( NONE )) in (LrTable.NT 76,(result,defaultPos,defaultPos),rest671) end | (188,(_,(MlyValue.tyrow tyrow1,tyrow1left,tyrow1right))::rest671) => let val result=MlyValue.tyrow_opt(fn _ => let val tyrow as tyrow1= tyrow1 () in ( SOME tyrow ) end ) in (LrTable.NT 75,(result,tyrow1left,tyrow1right),rest671) end | (189,rest671) => let val result=MlyValue.tyrow_opt(fn _ => ( NONE )) in (LrTable.NT 75,(result,defaultPos,defaultPos),rest671) end | (190,(_,(MlyValue.consty consty1,constyleft as consty1left, constyright as consty1right))::rest671) => let val result= MlyValue.tyseq(fn _ => let val consty as consty1=consty1 () in ( Tyseq(I(constyleft,constyright), [consty]) ) end ) in (LrTable.NT 77,(result,consty1left,consty1right),rest671) end | (191,rest671) => let val result=MlyValue.tyseq(fn _ => ( Tyseq(I(defaultPos,defaultPos), []) )) in (LrTable.NT 77,(result,defaultPos,defaultPos),rest671) end | (192,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.ty_COMMA_list2 ty_COMMA_list21,_,_))::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.tyseq(fn _ => let val ty_COMMA_list2 as ty_COMMA_list21=ty_COMMA_list21 () in ( Tyseq(I(LPARleft,RPARright), ty_COMMA_list2) ) end ) in (LrTable.NT 77,(result,LPAR1left,RPAR1right),rest671) end | (193,(_,(MlyValue.ty_COMMA_list2 ty_COMMA_list21,_, ty_COMMA_list21right))::_::(_,(MlyValue.ty ty1,ty1left,_))::rest671) => let val result=MlyValue.ty_COMMA_list2(fn _ => let val ty as ty1= ty1 () val ty_COMMA_list2 as ty_COMMA_list21=ty_COMMA_list21 () in ( ty::ty_COMMA_list2 ) end ) in (LrTable.NT 78,(result,ty1left,ty_COMMA_list21right),rest671) end | (194,(_,(MlyValue.ty ty2,_,ty2right))::_::(_,(MlyValue.ty ty1, ty1left,_))::rest671) => let val result=MlyValue.ty_COMMA_list2(fn _ => let val ty1=ty1 () val ty2=ty2 () in ( [ty1, ty2] ) end ) in (LrTable.NT 78,(result,ty1left,ty2right),rest671) end | (195,(_,(MlyValue.tyvarseq1 tyvarseq11,tyvarseq11left, tyvarseq11right))::rest671) => let val result=MlyValue.tyvarseq(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () in ( tyvarseq1 ) end ) in (LrTable.NT 79,(result,tyvarseq11left,tyvarseq11right),rest671) end | (196,rest671) => let val result=MlyValue.tyvarseq(fn _ => ( TyVarseq(I(defaultPos,defaultPos), []) )) in (LrTable.NT 79,(result,defaultPos,defaultPos),rest671) end | (197,(_,(MlyValue.tyvar tyvar1,tyvarleft as tyvar1left,tyvarright as tyvar1right))::rest671) => let val result=MlyValue.tyvarseq1(fn _ => let val tyvar as tyvar1=tyvar1 () in ( TyVarseq(I(tyvarleft,tyvarright), [tyvar]) ) end ) in (LrTable.NT 80,(result,tyvar1left,tyvar1right),rest671) end | (198,(_,(_,_,RPARright as RPAR1right))::(_,( MlyValue.tyvar_COMMA_list1 tyvar_COMMA_list11,_,_))::(_,(_,LPARleft as LPAR1left,_))::rest671) => let val result=MlyValue.tyvarseq1(fn _ => let val tyvar_COMMA_list1 as tyvar_COMMA_list11=tyvar_COMMA_list11 () in ( TyVarseq(I(LPARleft,RPARright), tyvar_COMMA_list1) ) end ) in (LrTable.NT 80,(result,LPAR1left,RPAR1right),rest671) end | (199,(_,(MlyValue.tyvar_COMMA_list1 tyvar_COMMA_list11,_, tyvar_COMMA_list11right))::_::(_,(MlyValue.tyvar tyvar1,tyvar1left,_)) ::rest671) => let val result=MlyValue.tyvar_COMMA_list1(fn _ => let val tyvar as tyvar1=tyvar1 () val tyvar_COMMA_list1 as tyvar_COMMA_list11=tyvar_COMMA_list11 () in ( tyvar::tyvar_COMMA_list1 ) end ) in (LrTable.NT 81,(result,tyvar1left,tyvar_COMMA_list11right),rest671 ) end | (200,(_,(MlyValue.tyvar tyvar1,tyvar1left,tyvar1right))::rest671) => let val result=MlyValue.tyvar_COMMA_list1(fn _ => let val tyvar as tyvar1=tyvar1 () in ( tyvar::[] ) end ) in (LrTable.NT 81,(result,tyvar1left,tyvar1right),rest671) end | (201,(_,(MlyValue.strexp' strexp'1,strexp'1left,strexp'1right)):: rest671) => let val result=MlyValue.strexp(fn _ => let val strexp' as strexp'1=strexp'1 () in ( strexp' ) end ) in (LrTable.NT 82,(result,strexp'1left,strexp'1right),rest671) end | (202,(_,(MlyValue.sigexp sigexp1,_,sigexpright as sigexp1right))::_ ::(_,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp(fn _ => let val strexp as strexp1= strexp1 () val sigexp as sigexp1=sigexp1 () in ( TRANSStrExp(I(strexpleft,sigexpright), strexp, sigexp) ) end ) in (LrTable.NT 82,(result,strexp1left,sigexp1right),rest671) end | (203,(_,(MlyValue.sigexp sigexp1,_,sigexpright as sigexp1right))::_ ::(_,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp(fn _ => let val strexp as strexp1= strexp1 () val sigexp as sigexp1=sigexp1 () in ( OPAQStrExp(I(strexpleft,sigexpright), strexp, sigexp)) end ) in (LrTable.NT 82,(result,strexp1left,sigexp1right),rest671) end | (204,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popInfix popInfix1,_,_))::(_,(MlyValue.strdec strdec1,_,_))::(_,( MlyValue.pushInfix pushInfix1,_,_))::(_,(_,STRUCTleft as STRUCT1left,_ ))::rest671) => let val result=MlyValue.strexp'(fn _ => let val pushInfix1=pushInfix1 () val strdec as strdec1=strdec1 () val popInfix1=popInfix1 () in ( STRUCTStrExp(I(STRUCTleft,ENDright), strdec) ) end ) in (LrTable.NT 83,(result,STRUCT1left,END1right),rest671) end | (205,(_,(MlyValue.longstrid longstrid1,longstridleft as longstrid1left,longstridright as longstrid1right))::rest671) => let val result=MlyValue.strexp'(fn _ => let val longstrid as longstrid1= longstrid1 () in ( LONGSTRIDStrExp(I(longstridleft,longstridright), longstrid) ) end ) in (LrTable.NT 83,(result,longstrid1left,longstrid1right),rest671) end | (206,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.strexp strexp1, _,_))::_::(_,(MlyValue.funid funid1,funidleft as funid1left,_)):: rest671) => let val result=MlyValue.strexp'(fn _ => let val funid as funid1=funid1 () val strexp as strexp1=strexp1 () in ( APPStrExp(I(funidleft,RPARright), funid, strexp) ) end ) in (LrTable.NT 83,(result,funid1left,RPAR1right),rest671) end | (207,(_,(_,_,RPARright as RPAR1right))::(_,(MlyValue.strdec strdec1, _,_))::_::(_,(MlyValue.funid funid1,funidleft as funid1left,_)):: rest671) => let val result=MlyValue.strexp'(fn _ => let val funid as funid1=funid1 () val strdec as strdec1=strdec1 () in ( APPDECStrExp(I(funidleft,RPARright), funid, strdec) ) end ) in (LrTable.NT 83,(result,funid1left,RPAR1right),rest671) end | (208,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popInfix popInfix1,_,_))::(_,(MlyValue.strexp strexp1,_,_))::_::(_,( MlyValue.strdec strdec1,_,_))::(_,(MlyValue.pushInfix pushInfix1,_,_)) ::(_,(_,LETleft as LET1left,_))::rest671) => let val result= MlyValue.strexp'(fn _ => let val pushInfix1=pushInfix1 () val strdec as strdec1=strdec1 () val strexp as strexp1=strexp1 () val popInfix1=popInfix1 () in ( LETStrExp(I(LETleft,ENDright), strdec, strexp) ) end ) in (LrTable.NT 83,(result,LET1left,END1right),rest671) end | (209,(_,(MlyValue.strdec1 strdec11,strdec11left,strdec11right)):: rest671) => let val result=MlyValue.strdec(fn _ => let val strdec1 as strdec11=strdec11 () in ( strdec1 ) end ) in (LrTable.NT 84,(result,strdec11left,strdec11right),rest671) end | (210,rest671) => let val result=MlyValue.strdec(fn _ => ( EMPTYStrDec(I(defaultPos,defaultPos)) )) in (LrTable.NT 84,(result,defaultPos,defaultPos),rest671) end | (211,(_,(MlyValue.strdec1' strdec1'1,strdec1'1left,strdec1'1right)) ::rest671) => let val result=MlyValue.strdec1(fn _ => let val strdec1' as strdec1'1=strdec1'1 () in ( strdec1' ) end ) in (LrTable.NT 85,(result,strdec1'1left,strdec1'1right),rest671) end | (212,(_,(MlyValue.strdec1 strdec12,_,strdec12right))::(_,( MlyValue.strdec1 strdec11,strdec11left,_))::rest671) => let val result =MlyValue.strdec1(fn _ => let val strdec11=strdec11 () val strdec12=strdec12 () in ( SEQStrDec(I(strdec11left,strdec12right), strdec11, strdec12) ) end ) in (LrTable.NT 85,(result,strdec11left,strdec12right),rest671) end | (213,(_,(_,SEMICOLONleft as SEMICOLON1left,SEMICOLONright as SEMICOLON1right))::rest671) => let val result=MlyValue.strdec1(fn _ => ( EMPTYStrDec(I(SEMICOLONleft,SEMICOLONright)) )) in (LrTable.NT 85,(result,SEMICOLON1left,SEMICOLON1right),rest671) end | (214,(_,(MlyValue.dec1' dec1'1,dec1'left as dec1'1left,dec1'right as dec1'1right))::rest671) => let val result=MlyValue.strdec1'(fn _ => let val dec1' as dec1'1=dec1'1 () in ( DECStrDec(I(dec1'left,dec1'right), dec1') ) end ) in (LrTable.NT 86,(result,dec1'1left,dec1'1right),rest671) end | (215,(_,(MlyValue.strbind strbind1,_,strbindright as strbind1right)) ::(_,(_,STRUCTUREleft as STRUCTURE1left,_))::rest671) => let val result=MlyValue.strdec1'(fn _ => let val strbind as strbind1=strbind1 () in ( STRUCTUREStrDec(I(STRUCTUREleft,strbindright), strbind) ) end ) in (LrTable.NT 86,(result,STRUCTURE1left,strbind1right),rest671) end | (216,(_,(_,_,ENDright as END1right))::(_,(MlyValue.popLocalInfix popLocalInfix1,_,_))::(_,(MlyValue.strdec strdec2,_,_))::(_,( MlyValue.pushLocalInfix pushLocalInfix1,_,_))::_::(_,(MlyValue.strdec strdec1,_,_))::(_,(MlyValue.pushInfix pushInfix1,_,_))::(_,(_, LOCALleft as LOCAL1left,_))::rest671) => let val result= MlyValue.strdec1'(fn _ => let val pushInfix1=pushInfix1 () val strdec1=strdec1 () val pushLocalInfix1=pushLocalInfix1 () val strdec2=strdec2 () val popLocalInfix1=popLocalInfix1 () in ( LOCALStrDec(I(LOCALleft,ENDright), strdec1, strdec2) ) end ) in (LrTable.NT 86,(result,LOCAL1left,END1right),rest671) end | (217,(_,(MlyValue.strexp__AND_strbind_opt strexp__AND_strbind_opt1,_ ,strexp__AND_strbind_optright as strexp__AND_strbind_opt1right))::_::( _,(MlyValue.COLON_sigexp_opt COLON_sigexp_opt1,_,_))::(_,( MlyValue.strid strid1,stridleft as strid1left,_))::rest671) => let val result=MlyValue.strbind(fn _ => let val strid as strid1=strid1 () val COLON_sigexp_opt as COLON_sigexp_opt1=COLON_sigexp_opt1 () val strexp__AND_strbind_opt as strexp__AND_strbind_opt1= strexp__AND_strbind_opt1 () in ( TRANSStrBind(I(stridleft, strexp__AND_strbind_optright), strid, COLON_sigexp_opt, #1 strexp__AND_strbind_opt, #2 strexp__AND_strbind_opt) ) end ) in (LrTable.NT 87,(result,strid1left,strexp__AND_strbind_opt1right), rest671) end | (218,(_,(MlyValue.strexp__AND_strbind_opt strexp__AND_strbind_opt1,_ ,strexp__AND_strbind_optright as strexp__AND_strbind_opt1right))::_::( _,(MlyValue.sigexp sigexp1,_,_))::_::(_,(MlyValue.strid strid1, stridleft as strid1left,_))::rest671) => let val result= MlyValue.strbind(fn _ => let val strid as strid1=strid1 () val sigexp as sigexp1=sigexp1 () val strexp__AND_strbind_opt as strexp__AND_strbind_opt1= strexp__AND_strbind_opt1 () in ( OPAQStrBind(I(stridleft,strexp__AND_strbind_optright), strid, sigexp, #1 strexp__AND_strbind_opt, #2 strexp__AND_strbind_opt) ) end ) in (LrTable.NT 87,(result,strid1left,strexp__AND_strbind_opt1right), rest671) end | (219,(_,(MlyValue.strbind strbind1,_,strbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_strbind_opt(fn _ => let val strbind as strbind1=strbind1 () in ( SOME strbind ) end ) in (LrTable.NT 88,(result,AND1left,strbind1right),rest671) end | (220,rest671) => let val result=MlyValue.AND_strbind_opt(fn _ => ( NONE )) in (LrTable.NT 88,(result,defaultPos,defaultPos),rest671) end | (221,(_,(MlyValue.AND_strbind_opt AND_strbind_opt1,_, AND_strbind_opt1right))::(_,(MlyValue.strexp' strexp'1,strexp'1left,_) )::rest671) => let val result=MlyValue.strexp__AND_strbind_opt(fn _ => let val strexp' as strexp'1=strexp'1 () val AND_strbind_opt as AND_strbind_opt1=AND_strbind_opt1 () in ( ( strexp', AND_strbind_opt ) ) end ) in (LrTable.NT 89,(result,strexp'1left,AND_strbind_opt1right),rest671 ) end | (222,(_,(MlyValue.sigexp__AND_strbind_opt sigexp__AND_strbind_opt1,_ ,sigexp__AND_strbind_optright as sigexp__AND_strbind_opt1right))::_::( _,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp__AND_strbind_opt(fn _ => let val strexp as strexp1=strexp1 () val sigexp__AND_strbind_opt as sigexp__AND_strbind_opt1= sigexp__AND_strbind_opt1 () in ( ( TRANSStrExp(I(strexpleft, sigexp__AND_strbind_optright), strexp, #1 sigexp__AND_strbind_opt), #2 sigexp__AND_strbind_opt ) ) end ) in (LrTable.NT 89,(result,strexp1left,sigexp__AND_strbind_opt1right), rest671) end | (223,(_,(MlyValue.sigexp__AND_strbind_opt sigexp__AND_strbind_opt1,_ ,sigexp__AND_strbind_optright as sigexp__AND_strbind_opt1right))::_::( _,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp__AND_strbind_opt(fn _ => let val strexp as strexp1=strexp1 () val sigexp__AND_strbind_opt as sigexp__AND_strbind_opt1= sigexp__AND_strbind_opt1 () in ( ( OPAQStrExp(I(strexpleft, sigexp__AND_strbind_optright), strexp, #1 sigexp__AND_strbind_opt), #2 sigexp__AND_strbind_opt ) ) end ) in (LrTable.NT 89,(result,strexp1left,sigexp__AND_strbind_opt1right), rest671) end | (224,(_,(MlyValue.AND_strbind_opt AND_strbind_opt1,_, AND_strbind_opt1right))::(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,_) )::rest671) => let val result=MlyValue.sigexp__AND_strbind_opt(fn _ => let val sigexp' as sigexp'1=sigexp'1 () val AND_strbind_opt as AND_strbind_opt1=AND_strbind_opt1 () in ( ( sigexp', AND_strbind_opt ) ) end ) in (LrTable.NT 90,(result,sigexp'1left,AND_strbind_opt1right),rest671 ) end | (225,(_,(MlyValue.tyreadesc__AND_strbind_opt tyreadesc__AND_strbind_opt1,_,tyreadesc__AND_strbind_optright as tyreadesc__AND_strbind_opt1right))::_::(_,(MlyValue.sigexp sigexp1, sigexpleft as sigexp1left,_))::rest671) => let val result= MlyValue.sigexp__AND_strbind_opt(fn _ => let val sigexp as sigexp1= sigexp1 () val tyreadesc__AND_strbind_opt as tyreadesc__AND_strbind_opt1= tyreadesc__AND_strbind_opt1 () in ( ( WHERETYPESigExp(I(sigexpleft, tyreadesc__AND_strbind_optright), sigexp, #1 tyreadesc__AND_strbind_opt), #2 tyreadesc__AND_strbind_opt ) ) end ) in (LrTable.NT 90,(result,sigexp1left, tyreadesc__AND_strbind_opt1right),rest671) end | (226,(_,(MlyValue.AND_tyreadesc_opt__AND_strbind_opt AND_tyreadesc_opt__AND_strbind_opt1,_, AND_tyreadesc_opt__AND_strbind_optright as AND_tyreadesc_opt__AND_strbind_opt1right))::(_,(MlyValue.ty ty1,_,_)) ::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result=MlyValue.tyreadesc__AND_strbind_opt(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt__AND_strbind_opt as AND_tyreadesc_opt__AND_strbind_opt1= AND_tyreadesc_opt__AND_strbind_opt1 () in ( ( TyReaDesc(I(TYPEleft, AND_tyreadesc_opt__AND_strbind_optright), tyvarseq, longtycon, ty, #1 AND_tyreadesc_opt__AND_strbind_opt), #2 AND_tyreadesc_opt__AND_strbind_opt ) ) end ) in (LrTable.NT 91,(result,TYPE1left, AND_tyreadesc_opt__AND_strbind_opt1right),rest671) end | (227,(_,(MlyValue.AND_strbind_opt AND_strbind_opt1, AND_strbind_opt1left,AND_strbind_opt1right))::rest671) => let val result=MlyValue.AND_tyreadesc_opt__AND_strbind_opt(fn _ => let val AND_strbind_opt as AND_strbind_opt1=AND_strbind_opt1 () in ( ( NONE, AND_strbind_opt ) ) end ) in (LrTable.NT 92,(result,AND_strbind_opt1left,AND_strbind_opt1right) ,rest671) end | (228,(_,(MlyValue.tyreadesc__AND_strbind_opt tyreadesc__AND_strbind_opt1,_,tyreadesc__AND_strbind_opt1right))::(_,( _,AND1left,_))::rest671) => let val result= MlyValue.AND_tyreadesc_opt__AND_strbind_opt(fn _ => let val tyreadesc__AND_strbind_opt as tyreadesc__AND_strbind_opt1= tyreadesc__AND_strbind_opt1 () in ( ( SOME(#1 tyreadesc__AND_strbind_opt), #2 tyreadesc__AND_strbind_opt ) ) end ) in (LrTable.NT 92,(result,AND1left,tyreadesc__AND_strbind_opt1right), rest671) end | (229,(_,(MlyValue.sigexp sigexp1,_,sigexp1right))::(_,(_,COLON1left, _))::rest671) => let val result=MlyValue.COLON_sigexp_opt(fn _ => let val sigexp as sigexp1=sigexp1 () in ( SOME sigexp ) end ) in (LrTable.NT 93,(result,COLON1left,sigexp1right),rest671) end | (230,rest671) => let val result=MlyValue.COLON_sigexp_opt(fn _ => ( NONE )) in (LrTable.NT 93,(result,defaultPos,defaultPos),rest671) end | (231,(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,sigexp'1right)):: rest671) => let val result=MlyValue.sigexp(fn _ => let val sigexp' as sigexp'1=sigexp'1 () in ( sigexp' ) end ) in (LrTable.NT 94,(result,sigexp'1left,sigexp'1right),rest671) end | (232,(_,(MlyValue.tyreadesc tyreadesc1,_,tyreadescright as tyreadesc1right))::_::(_,(MlyValue.sigexp sigexp1,sigexpleft as sigexp1left,_))::rest671) => let val result=MlyValue.sigexp(fn _ => let val sigexp as sigexp1=sigexp1 () val tyreadesc as tyreadesc1=tyreadesc1 () in ( WHERETYPESigExp(I(sigexpleft,tyreadescright), sigexp, tyreadesc) ) end ) in (LrTable.NT 94,(result,sigexp1left,tyreadesc1right),rest671) end | (233,(_,(_,_,ENDright as END1right))::(_,(MlyValue.spec spec1,_,_)) ::(_,(_,SIGleft as SIG1left,_))::rest671) => let val result= MlyValue.sigexp'(fn _ => let val spec as spec1=spec1 () in ( SIGSigExp(I(SIGleft,ENDright), spec) ) end ) in (LrTable.NT 95,(result,SIG1left,END1right),rest671) end | (234,(_,(MlyValue.sigid sigid1,sigidleft as sigid1left,sigidright as sigid1right))::rest671) => let val result=MlyValue.sigexp'(fn _ => let val sigid as sigid1=sigid1 () in ( SIGIDSigExp(I(sigidleft,sigidright), sigid) ) end ) in (LrTable.NT 95,(result,sigid1left,sigid1right),rest671) end | (235,(_,(MlyValue.sigbind sigbind1,_,sigbindright as sigbind1right)) ::(_,(_,SIGNATUREleft as SIGNATURE1left,_))::rest671) => let val result=MlyValue.sigdec(fn _ => let val sigbind as sigbind1=sigbind1 () in ( SigDec(I(SIGNATUREleft,sigbindright), sigbind) ) end ) in (LrTable.NT 96,(result,SIGNATURE1left,sigbind1right),rest671) end | (236,(_,(MlyValue.sigexp__AND_sigbind_opt sigexp__AND_sigbind_opt1,_ ,sigexp__AND_sigbind_optright as sigexp__AND_sigbind_opt1right))::_::( _,(MlyValue.sigid sigid1,sigidleft as sigid1left,_))::rest671) => let val result=MlyValue.sigbind(fn _ => let val sigid as sigid1=sigid1 () val sigexp__AND_sigbind_opt as sigexp__AND_sigbind_opt1= sigexp__AND_sigbind_opt1 () in ( SigBind(I(sigidleft,sigexp__AND_sigbind_optright), sigid, #1 sigexp__AND_sigbind_opt, #2 sigexp__AND_sigbind_opt) ) end ) in (LrTable.NT 97,(result,sigid1left,sigexp__AND_sigbind_opt1right), rest671) end | (237,(_,(MlyValue.sigbind sigbind1,_,sigbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_sigbind_opt(fn _ => let val sigbind as sigbind1=sigbind1 () in ( SOME sigbind ) end ) in (LrTable.NT 98,(result,AND1left,sigbind1right),rest671) end | (238,rest671) => let val result=MlyValue.AND_sigbind_opt(fn _ => ( NONE )) in (LrTable.NT 98,(result,defaultPos,defaultPos),rest671) end | (239,(_,(MlyValue.AND_sigbind_opt AND_sigbind_opt1,_, AND_sigbind_opt1right))::(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,_) )::rest671) => let val result=MlyValue.sigexp__AND_sigbind_opt(fn _ => let val sigexp' as sigexp'1=sigexp'1 () val AND_sigbind_opt as AND_sigbind_opt1=AND_sigbind_opt1 () in ( ( sigexp', AND_sigbind_opt ) ) end ) in (LrTable.NT 99,(result,sigexp'1left,AND_sigbind_opt1right),rest671 ) end | (240,(_,(MlyValue.tyreadesc__AND_sigbind_opt tyreadesc__AND_sigbind_opt1,_,tyreadesc__AND_sigbind_optright as tyreadesc__AND_sigbind_opt1right))::_::(_,(MlyValue.sigexp sigexp1, sigexpleft as sigexp1left,_))::rest671) => let val result= MlyValue.sigexp__AND_sigbind_opt(fn _ => let val sigexp as sigexp1= sigexp1 () val tyreadesc__AND_sigbind_opt as tyreadesc__AND_sigbind_opt1= tyreadesc__AND_sigbind_opt1 () in ( ( WHERETYPESigExp(I(sigexpleft, tyreadesc__AND_sigbind_optright), sigexp, #1 tyreadesc__AND_sigbind_opt), #2 tyreadesc__AND_sigbind_opt ) ) end ) in (LrTable.NT 99,(result,sigexp1left, tyreadesc__AND_sigbind_opt1right),rest671) end | (241,(_,(MlyValue.AND_tyreadesc_opt__AND_sigbind_opt AND_tyreadesc_opt__AND_sigbind_opt1,_, AND_tyreadesc_opt__AND_sigbind_optright as AND_tyreadesc_opt__AND_sigbind_opt1right))::(_,(MlyValue.ty ty1,_,_)) ::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result=MlyValue.tyreadesc__AND_sigbind_opt(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt__AND_sigbind_opt as AND_tyreadesc_opt__AND_sigbind_opt1= AND_tyreadesc_opt__AND_sigbind_opt1 () in ( ( TyReaDesc(I(TYPEleft, AND_tyreadesc_opt__AND_sigbind_optright), tyvarseq, longtycon, ty, #1 AND_tyreadesc_opt__AND_sigbind_opt), #2 AND_tyreadesc_opt__AND_sigbind_opt ) ) end ) in (LrTable.NT 100,(result,TYPE1left, AND_tyreadesc_opt__AND_sigbind_opt1right),rest671) end | (242,(_,(MlyValue.AND_sigbind_opt AND_sigbind_opt1, AND_sigbind_opt1left,AND_sigbind_opt1right))::rest671) => let val result=MlyValue.AND_tyreadesc_opt__AND_sigbind_opt(fn _ => let val AND_sigbind_opt as AND_sigbind_opt1=AND_sigbind_opt1 () in ( ( NONE, AND_sigbind_opt) ) end ) in (LrTable.NT 101,(result,AND_sigbind_opt1left,AND_sigbind_opt1right ),rest671) end | (243,(_,(MlyValue.tyreadesc__AND_sigbind_opt tyreadesc__AND_sigbind_opt1,_,tyreadesc__AND_sigbind_opt1right))::(_,( _,AND1left,_))::rest671) => let val result= MlyValue.AND_tyreadesc_opt__AND_sigbind_opt(fn _ => let val tyreadesc__AND_sigbind_opt as tyreadesc__AND_sigbind_opt1= tyreadesc__AND_sigbind_opt1 () in ( ( SOME(#1 tyreadesc__AND_sigbind_opt), #2 tyreadesc__AND_sigbind_opt ) ) end ) in (LrTable.NT 101,(result,AND1left,tyreadesc__AND_sigbind_opt1right) ,rest671) end | (244,(_,(MlyValue.AND_tyreadesc_opt AND_tyreadesc_opt1,_, AND_tyreadesc_optright as AND_tyreadesc_opt1right))::(_,(MlyValue.ty ty1,_,_))::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,( MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_)):: rest671) => let val result=MlyValue.tyreadesc(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt as AND_tyreadesc_opt1=AND_tyreadesc_opt1 () in ( TyReaDesc(I(TYPEleft,AND_tyreadesc_optright), tyvarseq, longtycon, ty, AND_tyreadesc_opt) ) end ) in (LrTable.NT 102,(result,TYPE1left,AND_tyreadesc_opt1right),rest671 ) end | (245,(_,(MlyValue.tyreadesc tyreadesc1,_,tyreadesc1right))::(_,(_, AND1left,_))::rest671) => let val result=MlyValue.AND_tyreadesc_opt( fn _ => let val tyreadesc as tyreadesc1=tyreadesc1 () in ( SOME tyreadesc ) end ) in (LrTable.NT 103,(result,AND1left,tyreadesc1right),rest671) end | (246,rest671) => let val result=MlyValue.AND_tyreadesc_opt(fn _ => ( NONE )) in (LrTable.NT 103,(result,defaultPos,defaultPos),rest671) end | (247,(_,(MlyValue.spec1 spec11,spec11left,spec11right))::rest671) => let val result=MlyValue.spec(fn _ => let val spec1 as spec11= spec11 () in ( spec1 ) end ) in (LrTable.NT 104,(result,spec11left,spec11right),rest671) end | (248,rest671) => let val result=MlyValue.spec(fn _ => ( EMPTYSpec(I(defaultPos,defaultPos)) )) in (LrTable.NT 104,(result,defaultPos,defaultPos),rest671) end | (249,(_,(MlyValue.spec1' spec1'1,spec1'1left,spec1'1right))::rest671 ) => let val result=MlyValue.spec1(fn _ => let val spec1' as spec1'1= spec1'1 () in ( spec1' ) end ) in (LrTable.NT 105,(result,spec1'1left,spec1'1right),rest671) end | (250,(_,(MlyValue.spec1' spec1'1,_,spec1'right as spec1'1right))::(_ ,(MlyValue.spec1 spec11,spec1left as spec11left,_))::rest671) => let val result=MlyValue.spec1(fn _ => let val spec1 as spec11=spec11 () val spec1' as spec1'1=spec1'1 () in ( SEQSpec(I(spec1left,spec1'right), spec1, spec1') ) end ) in (LrTable.NT 105,(result,spec11left,spec1'1right),rest671) end | (251,(_,(_,SEMICOLON1left,SEMICOLON1right))::rest671) => let val result=MlyValue.spec1(fn _ => ( EMPTYSpec(I(defaultPos,defaultPos)) )) in (LrTable.NT 105,(result,SEMICOLON1left,SEMICOLON1right),rest671) end | (252,(_,(MlyValue.longtycon_EQUALS_list2 longtycon_EQUALS_list21,_, longtycon_EQUALS_list2right as longtycon_EQUALS_list21right))::_::(_,( _,SHARINGleft as SHARING1left,_))::rest671) => let val result= MlyValue.spec1(fn _ => let val longtycon_EQUALS_list2 as longtycon_EQUALS_list21=longtycon_EQUALS_list21 () in ( SHARINGTYPESpec(I(SHARINGleft, longtycon_EQUALS_list2right), EMPTYSpec(I(SHARINGleft,SHARINGleft)), longtycon_EQUALS_list2) ) end ) in (LrTable.NT 105,(result,SHARING1left,longtycon_EQUALS_list21right) ,rest671) end | (253,(_,(MlyValue.longtycon_EQUALS_list2 longtycon_EQUALS_list21,_, longtycon_EQUALS_list2right as longtycon_EQUALS_list21right))::_::_::( _,(MlyValue.spec1 spec11,spec1left as spec11left,_))::rest671) => let val result=MlyValue.spec1(fn _ => let val spec1 as spec11=spec11 () val longtycon_EQUALS_list2 as longtycon_EQUALS_list21= longtycon_EQUALS_list21 () in ( SHARINGTYPESpec(I(spec1left, longtycon_EQUALS_list2right), spec1, longtycon_EQUALS_list2) ) end ) in (LrTable.NT 105,(result,spec11left,longtycon_EQUALS_list21right), rest671) end | (254,(_,(MlyValue.longstrid_EQUALS_list2 longstrid_EQUALS_list21,_, longstrid_EQUALS_list2right as longstrid_EQUALS_list21right))::(_,(_, SHARINGleft as SHARING1left,_))::rest671) => let val result= MlyValue.spec1(fn _ => let val longstrid_EQUALS_list2 as longstrid_EQUALS_list21=longstrid_EQUALS_list21 () in ( SHARINGSpec(I(SHARINGleft, longstrid_EQUALS_list2right), EMPTYSpec(I(SHARINGleft,SHARINGleft)), longstrid_EQUALS_list2) ) end ) in (LrTable.NT 105,(result,SHARING1left,longstrid_EQUALS_list21right) ,rest671) end | (255,(_,(MlyValue.longstrid_EQUALS_list2 longstrid_EQUALS_list21,_, longstrid_EQUALS_list2right as longstrid_EQUALS_list21right))::_::(_,( MlyValue.spec1 spec11,spec1left as spec11left,_))::rest671) => let val result=MlyValue.spec1(fn _ => let val spec1 as spec11=spec11 () val longstrid_EQUALS_list2 as longstrid_EQUALS_list21= longstrid_EQUALS_list21 () in ( SHARINGSpec(I(spec1left,longstrid_EQUALS_list2right), spec1, longstrid_EQUALS_list2) ) end ) in (LrTable.NT 105,(result,spec11left,longstrid_EQUALS_list21right), rest671) end | (256,(_,(MlyValue.valdesc valdesc1,_,valdescright as valdesc1right)) ::(_,(_,VALleft as VAL1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val valdesc as valdesc1=valdesc1 () in ( VALSpec(I(VALleft,valdescright), valdesc) ) end ) in (LrTable.NT 106,(result,VAL1left,valdesc1right),rest671) end | (257,(_,(MlyValue.typdesc typdesc1,_,typdescright as typdesc1right)) ::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val typdesc as typdesc1=typdesc1 () in ( TYPESpec(I(TYPEleft,typdescright), typdesc) ) end ) in (LrTable.NT 106,(result,TYPE1left,typdesc1right),rest671) end | (258,(_,(MlyValue.typdesc typdesc1,_,typdescright as typdesc1right)) ::(_,(_,EQTYPEleft as EQTYPE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val typdesc as typdesc1=typdesc1 () in ( EQTYPESpec(I(EQTYPEleft,typdescright), typdesc) ) end ) in (LrTable.NT 106,(result,EQTYPE1left,typdesc1right),rest671) end | (259,(_,(MlyValue.syndesc syndesc1,_,syndescright as syndesc1right)) ::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val syndesc as syndesc1=syndesc1 () in ( SYNSpec(I(TYPEleft,syndescright), syndesc) ) end ) in (LrTable.NT 106,(result,TYPE1left,syndesc1right),rest671) end | (260,(_,(MlyValue.datdesc0 datdesc01,_,datdesc0right as datdesc01right))::(_,(_,DATATYPEleft as DATATYPE1left,_))::rest671) => let val result=MlyValue.spec1'(fn _ => let val datdesc0 as datdesc01=datdesc01 () in ( DATATYPESpec(I(DATATYPEleft,datdesc0right), datdesc0)) end ) in (LrTable.NT 106,(result,DATATYPE1left,datdesc01right),rest671) end | (261,(_,(MlyValue.datdesc1 datdesc11,_,datdesc1right as datdesc11right))::(_,(_,DATATYPEleft as DATATYPE1left,_))::rest671) => let val result=MlyValue.spec1'(fn _ => let val datdesc1 as datdesc11=datdesc11 () in ( DATATYPESpec(I(DATATYPEleft,datdesc1right), datdesc1)) end ) in (LrTable.NT 106,(result,DATATYPE1left,datdesc11right),rest671) end | (262,(_,(MlyValue.longtycon longtycon1,_,longtyconright as longtycon1right))::_::_::(_,(MlyValue.tycon tycon1,_,_))::(_,(_, DATATYPEleft as DATATYPE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val tycon as tycon1=tycon1 () val longtycon as longtycon1=longtycon1 () in ( REPLICATIONSpec(I(DATATYPEleft,longtyconright), tycon, longtycon) ) end ) in (LrTable.NT 106,(result,DATATYPE1left,longtycon1right),rest671) end | (263,(_,(MlyValue.exdesc exdesc1,_,exdescright as exdesc1right))::(_ ,(_,EXCEPTIONleft as EXCEPTION1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val exdesc as exdesc1=exdesc1 () in ( EXCEPTIONSpec(I(EXCEPTIONleft,exdescright), exdesc) ) end ) in (LrTable.NT 106,(result,EXCEPTION1left,exdesc1right),rest671) end | (264,(_,(MlyValue.strdesc strdesc1,_,strdescright as strdesc1right)) ::(_,(_,STRUCTUREleft as STRUCTURE1left,_))::rest671) => let val result=MlyValue.spec1'(fn _ => let val strdesc as strdesc1=strdesc1 () in ( STRUCTURESpec(I(STRUCTUREleft,strdescright), strdesc)) end ) in (LrTable.NT 106,(result,STRUCTURE1left,strdesc1right),rest671) end | (265,(_,(MlyValue.sigexp sigexp1,_,sigexpright as sigexp1right))::(_ ,(_,INCLUDEleft as INCLUDE1left,_))::rest671) => let val result= MlyValue.spec1'(fn _ => let val sigexp as sigexp1=sigexp1 () in ( INCLUDESpec(I(INCLUDEleft,sigexpright), sigexp) ) end ) in (LrTable.NT 106,(result,INCLUDE1left,sigexp1right),rest671) end | (266,(_,(MlyValue.sigid_list2 sigid_list21,_,sigid_list2right as sigid_list21right))::(_,(_,INCLUDEleft as INCLUDE1left,_))::rest671) => let val result=MlyValue.spec1'(fn _ => let val sigid_list2 as sigid_list21=sigid_list21 () in ( INCLUDEMULTISpec(I(INCLUDEleft,sigid_list2right), sigid_list2) ) end ) in (LrTable.NT 106,(result,INCLUDE1left,sigid_list21right),rest671) end | (267,(_,(MlyValue.sigid_list2 sigid_list21,_,sigid_list21right))::(_ ,(MlyValue.sigid sigid1,sigid1left,_))::rest671) => let val result= MlyValue.sigid_list2(fn _ => let val sigid as sigid1=sigid1 () val sigid_list2 as sigid_list21=sigid_list21 () in ( sigid::sigid_list2 ) end ) in (LrTable.NT 107,(result,sigid1left,sigid_list21right),rest671) end | (268,(_,(MlyValue.sigid sigid2,_,sigid2right))::(_,(MlyValue.sigid sigid1,sigid1left,_))::rest671) => let val result=MlyValue.sigid_list2 (fn _ => let val sigid1=sigid1 () val sigid2=sigid2 () in ( sigid1::sigid2::[] ) end ) in (LrTable.NT 107,(result,sigid1left,sigid2right),rest671) end | (269,(_,(MlyValue.longtycon_EQUALS_list1 longtycon_EQUALS_list11,_, longtycon_EQUALS_list11right))::_::(_,(MlyValue.longtycon longtycon1, longtycon1left,_))::rest671) => let val result= MlyValue.longtycon_EQUALS_list1(fn _ => let val longtycon as longtycon1=longtycon1 () val longtycon_EQUALS_list1 as longtycon_EQUALS_list11= longtycon_EQUALS_list11 () in ( longtycon::longtycon_EQUALS_list1 ) end ) in (LrTable.NT 108,(result,longtycon1left, longtycon_EQUALS_list11right),rest671) end | (270,(_,(MlyValue.longtycon longtycon1,longtycon1left, longtycon1right))::rest671) => let val result= MlyValue.longtycon_EQUALS_list1(fn _ => let val longtycon as longtycon1=longtycon1 () in ( longtycon::[] ) end ) in (LrTable.NT 108,(result,longtycon1left,longtycon1right),rest671) end | (271,(_,(MlyValue.longtycon_EQUALS_list1 longtycon_EQUALS_list11,_, longtycon_EQUALS_list11right))::_::(_,(MlyValue.longtycon longtycon1, longtycon1left,_))::rest671) => let val result= MlyValue.longtycon_EQUALS_list2(fn _ => let val longtycon as longtycon1=longtycon1 () val longtycon_EQUALS_list1 as longtycon_EQUALS_list11= longtycon_EQUALS_list11 () in ( longtycon::longtycon_EQUALS_list1 ) end ) in (LrTable.NT 109,(result,longtycon1left, longtycon_EQUALS_list11right),rest671) end | (272,(_,(MlyValue.longstrid_EQUALS_list1 longstrid_EQUALS_list11,_, longstrid_EQUALS_list11right))::_::(_,(MlyValue.longstrid longstrid1, longstrid1left,_))::rest671) => let val result= MlyValue.longstrid_EQUALS_list1(fn _ => let val longstrid as longstrid1=longstrid1 () val longstrid_EQUALS_list1 as longstrid_EQUALS_list11= longstrid_EQUALS_list11 () in ( longstrid::longstrid_EQUALS_list1 ) end ) in (LrTable.NT 110,(result,longstrid1left, longstrid_EQUALS_list11right),rest671) end | (273,(_,(MlyValue.longstrid longstrid1,longstrid1left, longstrid1right))::rest671) => let val result= MlyValue.longstrid_EQUALS_list1(fn _ => let val longstrid as longstrid1=longstrid1 () in ( longstrid::[] ) end ) in (LrTable.NT 110,(result,longstrid1left,longstrid1right),rest671) end | (274,(_,(MlyValue.longstrid_EQUALS_list1 longstrid_EQUALS_list11,_, longstrid_EQUALS_list11right))::_::(_,(MlyValue.longstrid longstrid1, longstrid1left,_))::rest671) => let val result= MlyValue.longstrid_EQUALS_list2(fn _ => let val longstrid as longstrid1=longstrid1 () val longstrid_EQUALS_list1 as longstrid_EQUALS_list11= longstrid_EQUALS_list11 () in ( longstrid::longstrid_EQUALS_list1 ) end ) in (LrTable.NT 111,(result,longstrid1left, longstrid_EQUALS_list11right),rest671) end | (275,(_,(MlyValue.AND_valdesc_opt AND_valdesc_opt1,_, AND_valdesc_optright as AND_valdesc_opt1right))::(_,(MlyValue.ty ty1,_ ,_))::_::(_,(MlyValue.vid' vid'1,vid'left as vid'1left,_))::rest671) => let val result=MlyValue.valdesc(fn _ => let val vid' as vid'1= vid'1 () val ty as ty1=ty1 () val AND_valdesc_opt as AND_valdesc_opt1=AND_valdesc_opt1 () in ( ValDesc(I(vid'left,AND_valdesc_optright), vid', ty, AND_valdesc_opt) ) end ) in (LrTable.NT 112,(result,vid'1left,AND_valdesc_opt1right),rest671) end | (276,(_,(MlyValue.valdesc valdesc1,_,valdesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_valdesc_opt(fn _ => let val valdesc as valdesc1=valdesc1 () in ( SOME valdesc ) end ) in (LrTable.NT 113,(result,AND1left,valdesc1right),rest671) end | (277,rest671) => let val result=MlyValue.AND_valdesc_opt(fn _ => ( NONE )) in (LrTable.NT 113,(result,defaultPos,defaultPos),rest671) end | (278,(_,(MlyValue.AND_typdesc_opt AND_typdesc_opt1,_, AND_typdesc_optright as AND_typdesc_opt1right))::(_,(MlyValue.tycon tycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671) => let val result=MlyValue.typdesc(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val tycon as tycon1=tycon1 () val AND_typdesc_opt as AND_typdesc_opt1=AND_typdesc_opt1 () in ( TypDesc(I(tyvarseqleft,AND_typdesc_optright), tyvarseq, tycon, AND_typdesc_opt) ) end ) in (LrTable.NT 114,(result,tyvarseq1left,AND_typdesc_opt1right), rest671) end | (279,(_,(MlyValue.typdesc typdesc1,_,typdesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_typdesc_opt(fn _ => let val typdesc as typdesc1=typdesc1 () in ( SOME typdesc ) end ) in (LrTable.NT 115,(result,AND1left,typdesc1right),rest671) end | (280,rest671) => let val result=MlyValue.AND_typdesc_opt(fn _ => ( NONE )) in (LrTable.NT 115,(result,defaultPos,defaultPos),rest671) end | (281,(_,(MlyValue.AND_syndesc_opt AND_syndesc_opt1,_, AND_syndesc_optright as AND_syndesc_opt1right))::(_,(MlyValue.ty ty1,_ ,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671) => let val result=MlyValue.syndesc(fn _ => let val tyvarseq as tyvarseq1= tyvarseq1 () val tycon as tycon1=tycon1 () val ty as ty1=ty1 () val AND_syndesc_opt as AND_syndesc_opt1=AND_syndesc_opt1 () in ( SynDesc(I(tyvarseqleft,AND_syndesc_optright), tyvarseq, tycon, ty, AND_syndesc_opt) ) end ) in (LrTable.NT 116,(result,tyvarseq1left,AND_syndesc_opt1right), rest671) end | (282,(_,(MlyValue.syndesc syndesc1,_,syndesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_syndesc_opt(fn _ => let val syndesc as syndesc1=syndesc1 () in ( SOME syndesc ) end ) in (LrTable.NT 117,(result,AND1left,syndesc1right),rest671) end | (283,rest671) => let val result=MlyValue.AND_syndesc_opt(fn _ => ( NONE )) in (LrTable.NT 117,(result,defaultPos,defaultPos),rest671) end | (284,(_,(MlyValue.AND_datdesc_opt AND_datdesc_opt1,_, AND_datdesc_optright as AND_datdesc_opt1right))::(_,(MlyValue.condesc condesc1,_,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,( MlyValue.tyvarseq tyvarseq1,tyvarseqleft as tyvarseq1left,_))::rest671 ) => let val result=MlyValue.datdesc(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val tycon as tycon1=tycon1 () val condesc as condesc1=condesc1 () val AND_datdesc_opt as AND_datdesc_opt1=AND_datdesc_opt1 () in ( DatDesc(I(tyvarseqleft,AND_datdesc_optright), tyvarseq, tycon, condesc, AND_datdesc_opt) ) end ) in (LrTable.NT 118,(result,tyvarseq1left,AND_datdesc_opt1right), rest671) end | (285,(_,(MlyValue.AND_datdesc_opt AND_datdesc_opt1,_, AND_datdesc_optright as AND_datdesc_opt1right))::(_,(MlyValue.condesc condesc1,_,_))::_::(_,(MlyValue.tycon tycon1,tyconleft as tycon1left,_ ))::rest671) => let val result=MlyValue.datdesc0(fn _ => let val tycon as tycon1=tycon1 () val condesc as condesc1=condesc1 () val AND_datdesc_opt as AND_datdesc_opt1=AND_datdesc_opt1 () in ( DatDesc(I(tyconleft,AND_datdesc_optright), TyVarseq(I(defaultPos,defaultPos), []), tycon, condesc, AND_datdesc_opt) ) end ) in (LrTable.NT 119,(result,tycon1left,AND_datdesc_opt1right),rest671) end | (286,(_,(MlyValue.AND_datdesc_opt AND_datdesc_opt1,_, AND_datdesc_optright as AND_datdesc_opt1right))::(_,(MlyValue.condesc condesc1,_,_))::_::(_,(MlyValue.tycon tycon1,_,_))::(_,( MlyValue.tyvarseq1 tyvarseq11,tyvarseq1left as tyvarseq11left,_)):: rest671) => let val result=MlyValue.datdesc1(fn _ => let val tyvarseq1 as tyvarseq11=tyvarseq11 () val tycon as tycon1=tycon1 () val condesc as condesc1=condesc1 () val AND_datdesc_opt as AND_datdesc_opt1=AND_datdesc_opt1 () in ( DatDesc(I(tyvarseq1left,AND_datdesc_optright), tyvarseq1, tycon, condesc, AND_datdesc_opt) ) end ) in (LrTable.NT 120,(result,tyvarseq11left,AND_datdesc_opt1right), rest671) end | (287,(_,(MlyValue.datdesc datdesc1,_,datdesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_datdesc_opt(fn _ => let val datdesc as datdesc1=datdesc1 () in ( SOME datdesc ) end ) in (LrTable.NT 121,(result,AND1left,datdesc1right),rest671) end | (288,rest671) => let val result=MlyValue.AND_datdesc_opt(fn _ => ( NONE )) in (LrTable.NT 121,(result,defaultPos,defaultPos),rest671) end | (289,(_,(MlyValue.BAR_condesc_opt BAR_condesc_opt1,_, BAR_condesc_optright as BAR_condesc_opt1right))::(_,( MlyValue.OF_ty_opt OF_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,vid'left as vid'1left,_))::rest671) => let val result=MlyValue.condesc(fn _ => let val vid' as vid'1=vid'1 () val OF_ty_opt as OF_ty_opt1=OF_ty_opt1 () val BAR_condesc_opt as BAR_condesc_opt1=BAR_condesc_opt1 () in ( ConDesc(I(vid'left,BAR_condesc_optright), vid', OF_ty_opt, BAR_condesc_opt) ) end ) in (LrTable.NT 122,(result,vid'1left,BAR_condesc_opt1right),rest671) end | (290,(_,(MlyValue.condesc condesc1,_,condesc1right))::(_,(_,BAR1left ,_))::rest671) => let val result=MlyValue.BAR_condesc_opt(fn _ => let val condesc as condesc1=condesc1 () in ( SOME condesc ) end ) in (LrTable.NT 123,(result,BAR1left,condesc1right),rest671) end | (291,rest671) => let val result=MlyValue.BAR_condesc_opt(fn _ => ( NONE )) in (LrTable.NT 123,(result,defaultPos,defaultPos),rest671) end | (292,(_,(MlyValue.AND_exdesc_opt AND_exdesc_opt1,_, AND_exdesc_optright as AND_exdesc_opt1right))::(_,(MlyValue.OF_ty_opt OF_ty_opt1,_,_))::(_,(MlyValue.vid' vid'1,vid'left as vid'1left,_)):: rest671) => let val result=MlyValue.exdesc(fn _ => let val vid' as vid'1=vid'1 () val OF_ty_opt as OF_ty_opt1=OF_ty_opt1 () val AND_exdesc_opt as AND_exdesc_opt1=AND_exdesc_opt1 () in ( ExDesc(I(vid'left,AND_exdesc_optright), vid', OF_ty_opt, AND_exdesc_opt) ) end ) in (LrTable.NT 124,(result,vid'1left,AND_exdesc_opt1right),rest671) end | (293,(_,(MlyValue.exdesc exdesc1,_,exdesc1right))::(_,(_,AND1left,_) )::rest671) => let val result=MlyValue.AND_exdesc_opt(fn _ => let val exdesc as exdesc1=exdesc1 () in ( SOME exdesc ) end ) in (LrTable.NT 125,(result,AND1left,exdesc1right),rest671) end | (294,rest671) => let val result=MlyValue.AND_exdesc_opt(fn _ => ( NONE )) in (LrTable.NT 125,(result,defaultPos,defaultPos),rest671) end | (295,(_,(MlyValue.sigexp__AND_strdesc_opt sigexp__AND_strdesc_opt1,_ ,sigexp__AND_strdesc_optright as sigexp__AND_strdesc_opt1right))::_::( _,(MlyValue.strid strid1,stridleft as strid1left,_))::rest671) => let val result=MlyValue.strdesc(fn _ => let val strid as strid1=strid1 () val sigexp__AND_strdesc_opt as sigexp__AND_strdesc_opt1= sigexp__AND_strdesc_opt1 () in ( StrDesc(I(stridleft,sigexp__AND_strdesc_optright), strid, #1 sigexp__AND_strdesc_opt, #2 sigexp__AND_strdesc_opt) ) end ) in (LrTable.NT 126,(result,strid1left,sigexp__AND_strdesc_opt1right), rest671) end | (296,(_,(MlyValue.strdesc strdesc1,_,strdesc1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_strdesc_opt(fn _ => let val strdesc as strdesc1=strdesc1 () in ( SOME strdesc ) end ) in (LrTable.NT 127,(result,AND1left,strdesc1right),rest671) end | (297,rest671) => let val result=MlyValue.AND_strdesc_opt(fn _ => ( NONE )) in (LrTable.NT 127,(result,defaultPos,defaultPos),rest671) end | (298,(_,(MlyValue.AND_strdesc_opt AND_strdesc_opt1,_, AND_strdesc_opt1right))::(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,_) )::rest671) => let val result=MlyValue.sigexp__AND_strdesc_opt(fn _ => let val sigexp' as sigexp'1=sigexp'1 () val AND_strdesc_opt as AND_strdesc_opt1=AND_strdesc_opt1 () in ( ( sigexp', AND_strdesc_opt ) ) end ) in (LrTable.NT 128,(result,sigexp'1left,AND_strdesc_opt1right), rest671) end | (299,(_,(MlyValue.tyreadesc__AND_strdesc_opt tyreadesc__AND_strdesc_opt1,_,tyreadesc__AND_strdesc_optright as tyreadesc__AND_strdesc_opt1right))::_::(_,(MlyValue.sigexp sigexp1, sigexpleft as sigexp1left,_))::rest671) => let val result= MlyValue.sigexp__AND_strdesc_opt(fn _ => let val sigexp as sigexp1= sigexp1 () val tyreadesc__AND_strdesc_opt as tyreadesc__AND_strdesc_opt1= tyreadesc__AND_strdesc_opt1 () in ( ( WHERETYPESigExp(I(sigexpleft, tyreadesc__AND_strdesc_optright), sigexp, #1 tyreadesc__AND_strdesc_opt), #2 tyreadesc__AND_strdesc_opt ) ) end ) in (LrTable.NT 128,(result,sigexp1left, tyreadesc__AND_strdesc_opt1right),rest671) end | (300,(_,(MlyValue.AND_tyreadesc_opt__AND_strdesc_opt AND_tyreadesc_opt__AND_strdesc_opt1,_, AND_tyreadesc_opt__AND_strdesc_optright as AND_tyreadesc_opt__AND_strdesc_opt1right))::(_,(MlyValue.ty ty1,_,_)) ::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result=MlyValue.tyreadesc__AND_strdesc_opt(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt__AND_strdesc_opt as AND_tyreadesc_opt__AND_strdesc_opt1= AND_tyreadesc_opt__AND_strdesc_opt1 () in ( ( TyReaDesc(I(TYPEleft, AND_tyreadesc_opt__AND_strdesc_optright), tyvarseq, longtycon, ty, #1 AND_tyreadesc_opt__AND_strdesc_opt), #2 AND_tyreadesc_opt__AND_strdesc_opt ) ) end ) in (LrTable.NT 129,(result,TYPE1left, AND_tyreadesc_opt__AND_strdesc_opt1right),rest671) end | (301,(_,(MlyValue.AND_strdesc_opt AND_strdesc_opt1, AND_strdesc_opt1left,AND_strdesc_opt1right))::rest671) => let val result=MlyValue.AND_tyreadesc_opt__AND_strdesc_opt(fn _ => let val AND_strdesc_opt as AND_strdesc_opt1=AND_strdesc_opt1 () in ( ( NONE, AND_strdesc_opt ) ) end ) in (LrTable.NT 130,(result,AND_strdesc_opt1left,AND_strdesc_opt1right ),rest671) end | (302,(_,(MlyValue.tyreadesc__AND_strdesc_opt tyreadesc__AND_strdesc_opt1,_,tyreadesc__AND_strdesc_opt1right))::(_,( _,AND1left,_))::rest671) => let val result= MlyValue.AND_tyreadesc_opt__AND_strdesc_opt(fn _ => let val tyreadesc__AND_strdesc_opt as tyreadesc__AND_strdesc_opt1= tyreadesc__AND_strdesc_opt1 () in ( ( SOME(#1 tyreadesc__AND_strdesc_opt), #2 tyreadesc__AND_strdesc_opt ) ) end ) in (LrTable.NT 130,(result,AND1left,tyreadesc__AND_strdesc_opt1right) ,rest671) end | (303,(_,(MlyValue.funbind funbind1,_,funbindright as funbind1right)) ::(_,(_,FUNCTORleft as FUNCTOR1left,_))::rest671) => let val result= MlyValue.fundec(fn _ => let val funbind as funbind1=funbind1 () in ( FunDec(I(FUNCTORleft,funbindright), funbind) ) end ) in (LrTable.NT 131,(result,FUNCTOR1left,funbind1right),rest671) end | (304,(_,(MlyValue.strexp__AND_funbind_opt strexp__AND_funbind_opt1,_ ,strexp__AND_funbind_optright as strexp__AND_funbind_opt1right))::_::( _,(MlyValue.COLON_sigexp_opt COLON_sigexp_opt1,_,_))::_::(_,( MlyValue.sigexp sigexp1,_,_))::_::(_,(MlyValue.strid strid1,_,_))::_:: (_,(MlyValue.funid funid1,funidleft as funid1left,_))::rest671) => let val result=MlyValue.funbind(fn _ => let val funid as funid1=funid1 () val strid as strid1=strid1 () val sigexp as sigexp1=sigexp1 () val COLON_sigexp_opt as COLON_sigexp_opt1=COLON_sigexp_opt1 () val strexp__AND_funbind_opt as strexp__AND_funbind_opt1= strexp__AND_funbind_opt1 () in ( TRANSFunBind(I(funidleft, strexp__AND_funbind_optright), funid, strid, sigexp, COLON_sigexp_opt, #1 strexp__AND_funbind_opt, #2 strexp__AND_funbind_opt) ) end ) in (LrTable.NT 132,(result,funid1left,strexp__AND_funbind_opt1right), rest671) end | (305,(_,(MlyValue.strexp__AND_funbind_opt strexp__AND_funbind_opt1,_ ,strexp__AND_funbind_optright as strexp__AND_funbind_opt1right))::_::( _,(MlyValue.sigexp sigexp2,_,_))::_::_::(_,(MlyValue.sigexp sigexp1,_, _))::_::(_,(MlyValue.strid strid1,_,_))::_::(_,(MlyValue.funid funid1, funidleft as funid1left,_))::rest671) => let val result= MlyValue.funbind(fn _ => let val funid as funid1=funid1 () val strid as strid1=strid1 () val sigexp1=sigexp1 () val sigexp2=sigexp2 () val strexp__AND_funbind_opt as strexp__AND_funbind_opt1= strexp__AND_funbind_opt1 () in ( OPAQFunBind(I(funidleft,strexp__AND_funbind_optright), funid, strid, sigexp1, sigexp2, #1 strexp__AND_funbind_opt, #2 strexp__AND_funbind_opt) ) end ) in (LrTable.NT 132,(result,funid1left,strexp__AND_funbind_opt1right), rest671) end | (306,(_,(MlyValue.strexp__AND_funbind_opt strexp__AND_funbind_opt1,_ ,strexp__AND_funbind_optright as strexp__AND_funbind_opt1right))::_::( _,(MlyValue.COLON_sigexp_opt COLON_sigexp_opt1,_,_))::_::(_,( MlyValue.spec spec1,_,_))::_::(_,(MlyValue.funid funid1,funidleft as funid1left,_))::rest671) => let val result=MlyValue.funbind(fn _ => let val funid as funid1=funid1 () val spec as spec1=spec1 () val COLON_sigexp_opt as COLON_sigexp_opt1=COLON_sigexp_opt1 () val strexp__AND_funbind_opt as strexp__AND_funbind_opt1= strexp__AND_funbind_opt1 () in ( TRANSSPECFunBind(I(funidleft, strexp__AND_funbind_optright), funid, spec, COLON_sigexp_opt, #1 strexp__AND_funbind_opt, #2 strexp__AND_funbind_opt) ) end ) in (LrTable.NT 132,(result,funid1left,strexp__AND_funbind_opt1right), rest671) end | (307,(_,(MlyValue.strexp__AND_funbind_opt strexp__AND_funbind_opt1,_ ,strexp__AND_funbind_optright as strexp__AND_funbind_opt1right))::_::( _,(MlyValue.sigexp sigexp1,_,_))::_::_::(_,(MlyValue.spec spec1,_,_)) ::_::(_,(MlyValue.funid funid1,funidleft as funid1left,_))::rest671) => let val result=MlyValue.funbind(fn _ => let val funid as funid1= funid1 () val spec as spec1=spec1 () val sigexp as sigexp1=sigexp1 () val strexp__AND_funbind_opt as strexp__AND_funbind_opt1= strexp__AND_funbind_opt1 () in ( OPAQSPECFunBind(I(funidleft, strexp__AND_funbind_optright), funid, spec, sigexp, #1 strexp__AND_funbind_opt, #2 strexp__AND_funbind_opt) ) end ) in (LrTable.NT 132,(result,funid1left,strexp__AND_funbind_opt1right), rest671) end | (308,(_,(MlyValue.funbind funbind1,_,funbind1right))::(_,(_,AND1left ,_))::rest671) => let val result=MlyValue.AND_funbind_opt(fn _ => let val funbind as funbind1=funbind1 () in ( SOME funbind ) end ) in (LrTable.NT 133,(result,AND1left,funbind1right),rest671) end | (309,rest671) => let val result=MlyValue.AND_funbind_opt(fn _ => ( NONE )) in (LrTable.NT 133,(result,defaultPos,defaultPos),rest671) end | (310,(_,(MlyValue.AND_funbind_opt AND_funbind_opt1,_, AND_funbind_opt1right))::(_,(MlyValue.strexp' strexp'1,strexp'1left,_) )::rest671) => let val result=MlyValue.strexp__AND_funbind_opt(fn _ => let val strexp' as strexp'1=strexp'1 () val AND_funbind_opt as AND_funbind_opt1=AND_funbind_opt1 () in ( ( strexp', AND_funbind_opt ) ) end ) in (LrTable.NT 134,(result,strexp'1left,AND_funbind_opt1right), rest671) end | (311,(_,(MlyValue.sigexp__AND_funbind_opt sigexp__AND_funbind_opt1,_ ,sigexp__AND_funbind_optright as sigexp__AND_funbind_opt1right))::_::( _,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp__AND_funbind_opt(fn _ => let val strexp as strexp1=strexp1 () val sigexp__AND_funbind_opt as sigexp__AND_funbind_opt1= sigexp__AND_funbind_opt1 () in ( ( TRANSStrExp(I(strexpleft, sigexp__AND_funbind_optright), strexp, #1 sigexp__AND_funbind_opt), #2 sigexp__AND_funbind_opt ) ) end ) in (LrTable.NT 134,(result,strexp1left,sigexp__AND_funbind_opt1right) ,rest671) end | (312,(_,(MlyValue.sigexp__AND_funbind_opt sigexp__AND_funbind_opt1,_ ,sigexp__AND_funbind_optright as sigexp__AND_funbind_opt1right))::_::( _,(MlyValue.strexp strexp1,strexpleft as strexp1left,_))::rest671) => let val result=MlyValue.strexp__AND_funbind_opt(fn _ => let val strexp as strexp1=strexp1 () val sigexp__AND_funbind_opt as sigexp__AND_funbind_opt1= sigexp__AND_funbind_opt1 () in ( ( OPAQStrExp(I(strexpleft, sigexp__AND_funbind_optright), strexp, #1 sigexp__AND_funbind_opt), #2 sigexp__AND_funbind_opt ) ) end ) in (LrTable.NT 134,(result,strexp1left,sigexp__AND_funbind_opt1right) ,rest671) end | (313,(_,(MlyValue.AND_funbind_opt AND_funbind_opt1,_, AND_funbind_opt1right))::(_,(MlyValue.sigexp' sigexp'1,sigexp'1left,_) )::rest671) => let val result=MlyValue.sigexp__AND_funbind_opt(fn _ => let val sigexp' as sigexp'1=sigexp'1 () val AND_funbind_opt as AND_funbind_opt1=AND_funbind_opt1 () in ( ( sigexp', AND_funbind_opt ) ) end ) in (LrTable.NT 135,(result,sigexp'1left,AND_funbind_opt1right), rest671) end | (314,(_,(MlyValue.tyreadesc__AND_funbind_opt tyreadesc__AND_funbind_opt1,_,tyreadesc__AND_funbind_optright as tyreadesc__AND_funbind_opt1right))::_::(_,(MlyValue.sigexp sigexp1, sigexpleft as sigexp1left,_))::rest671) => let val result= MlyValue.sigexp__AND_funbind_opt(fn _ => let val sigexp as sigexp1= sigexp1 () val tyreadesc__AND_funbind_opt as tyreadesc__AND_funbind_opt1= tyreadesc__AND_funbind_opt1 () in ( ( WHERETYPESigExp(I(sigexpleft, tyreadesc__AND_funbind_optright), sigexp, #1 tyreadesc__AND_funbind_opt), #2 tyreadesc__AND_funbind_opt ) ) end ) in (LrTable.NT 135,(result,sigexp1left, tyreadesc__AND_funbind_opt1right),rest671) end | (315,(_,(MlyValue.AND_tyreadesc_opt__AND_funbind_opt AND_tyreadesc_opt__AND_funbind_opt1,_, AND_tyreadesc_opt__AND_funbind_optright as AND_tyreadesc_opt__AND_funbind_opt1right))::(_,(MlyValue.ty ty1,_,_)) ::_::(_,(MlyValue.longtycon longtycon1,_,_))::(_,(MlyValue.tyvarseq tyvarseq1,_,_))::(_,(_,TYPEleft as TYPE1left,_))::rest671) => let val result=MlyValue.tyreadesc__AND_funbind_opt(fn _ => let val tyvarseq as tyvarseq1=tyvarseq1 () val longtycon as longtycon1=longtycon1 () val ty as ty1=ty1 () val AND_tyreadesc_opt__AND_funbind_opt as AND_tyreadesc_opt__AND_funbind_opt1= AND_tyreadesc_opt__AND_funbind_opt1 () in ( ( TyReaDesc(I(TYPEleft, AND_tyreadesc_opt__AND_funbind_optright), tyvarseq, longtycon, ty, #1 AND_tyreadesc_opt__AND_funbind_opt), #2 AND_tyreadesc_opt__AND_funbind_opt ) ) end ) in (LrTable.NT 136,(result,TYPE1left, AND_tyreadesc_opt__AND_funbind_opt1right),rest671) end | (316,(_,(MlyValue.AND_funbind_opt AND_funbind_opt1, AND_funbind_opt1left,AND_funbind_opt1right))::rest671) => let val result=MlyValue.AND_tyreadesc_opt__AND_funbind_opt(fn _ => let val AND_funbind_opt as AND_funbind_opt1=AND_funbind_opt1 () in ( ( NONE, AND_funbind_opt ) ) end ) in (LrTable.NT 137,(result,AND_funbind_opt1left,AND_funbind_opt1right ),rest671) end | (317,(_,(MlyValue.tyreadesc__AND_funbind_opt tyreadesc__AND_funbind_opt1,_,tyreadesc__AND_funbind_opt1right))::(_,( _,AND1left,_))::rest671) => let val result= MlyValue.AND_tyreadesc_opt__AND_funbind_opt(fn _ => let val tyreadesc__AND_funbind_opt as tyreadesc__AND_funbind_opt1= tyreadesc__AND_funbind_opt1 () in ( ( SOME(#1 tyreadesc__AND_funbind_opt), #2 tyreadesc__AND_funbind_opt ) ) end ) in (LrTable.NT 137,(result,AND1left,tyreadesc__AND_funbind_opt1right) ,rest671) end | (318,(_,(MlyValue.topdec1 topdec11,topdec11left,topdec11right)):: rest671) => let val result=MlyValue.topdec(fn _ => let val topdec1 as topdec11=topdec11 () in ( topdec1 ) end ) in (LrTable.NT 138,(result,topdec11left,topdec11right),rest671) end | (319,rest671) => let val result=MlyValue.topdec(fn _ => ( STRDECTopDec(I(defaultPos,defaultPos), EMPTYStrDec(I(defaultPos,defaultPos)), NONE) )) in (LrTable.NT 138,(result,defaultPos,defaultPos),rest671) end | (320,(_,(MlyValue.topdec_opt topdec_opt1,_,topdec_optright as topdec_opt1right))::(_,(MlyValue.strdec1' strdec1'1,strdec1'left as strdec1'1left,_))::rest671) => let val result=MlyValue.topdec1(fn _ => let val strdec1' as strdec1'1=strdec1'1 () val topdec_opt as topdec_opt1=topdec_opt1 () in ( STRDECTopDec(I(strdec1'left,topdec_optright), strdec1', topdec_opt) ) end ) in (LrTable.NT 139,(result,strdec1'1left,topdec_opt1right),rest671) end | (321,(_,(MlyValue.topdec_opt topdec_opt1,_,topdec_optright as topdec_opt1right))::(_,(MlyValue.sigdec sigdec1,sigdecleft as sigdec1left,_))::rest671) => let val result=MlyValue.topdec1(fn _ => let val sigdec as sigdec1=sigdec1 () val topdec_opt as topdec_opt1=topdec_opt1 () in ( SIGDECTopDec(I(sigdecleft,topdec_optright), sigdec, topdec_opt) ) end ) in (LrTable.NT 139,(result,sigdec1left,topdec_opt1right),rest671) end | (322,(_,(MlyValue.topdec_opt topdec_opt1,_,topdec_optright as topdec_opt1right))::(_,(MlyValue.fundec fundec1,fundecleft as fundec1left,_))::rest671) => let val result=MlyValue.topdec1(fn _ => let val fundec as fundec1=fundec1 () val topdec_opt as topdec_opt1=topdec_opt1 () in ( FUNDECTopDec(I(fundecleft,topdec_optright), fundec, topdec_opt) ) end ) in (LrTable.NT 139,(result,fundec1left,topdec_opt1right),rest671) end | (323,(_,(MlyValue.topdec1 topdec11,topdec11left,topdec11right)):: rest671) => let val result=MlyValue.topdec_opt(fn _ => let val topdec1 as topdec11=topdec11 () in ( SOME topdec1 ) end ) in (LrTable.NT 140,(result,topdec11left,topdec11right),rest671) end | (324,rest671) => let val result=MlyValue.topdec_opt(fn _ => ( NONE ) ) in (LrTable.NT 140,(result,defaultPos,defaultPos),rest671) end | (325,(_,(MlyValue.program' program'1,_,program'1right))::(_,( MlyValue.initInfix initInfix1,initInfix1left,_))::rest671) => let val result=MlyValue.program(fn _ => let val initInfix1=initInfix1 () val program' as program'1=program'1 () in ( (program', !J) ) end ) in (LrTable.NT 141,(result,initInfix1left,program'1right),rest671) end | (326,(_,(MlyValue.program_opt program_opt1,_,program_opt1right))::(_ ,(_,_,SEMICOLONright))::(_,(MlyValue.topdec topdec1,topdecleft as topdec1left,_))::rest671) => let val result=MlyValue.program'(fn _ => let val topdec as topdec1=topdec1 () val program_opt as program_opt1=program_opt1 () in ( TOPDECProgram(I(topdecleft,SEMICOLONright), topdec, program_opt) ) end ) in (LrTable.NT 142,(result,topdec1left,program_opt1right),rest671) end | (327,(_,(MlyValue.program_opt program_opt1,_,program_opt1right))::(_ ,(_,_,SEMICOLONright))::(_,(MlyValue.exp exp1,expleft as exp1left,_)) ::rest671) => let val result=MlyValue.program'(fn _ => let val exp as exp1=exp1 () val program_opt as program_opt1=program_opt1 () in ( EXPProgram(I(expleft,SEMICOLONright), exp, program_opt) ) end ) in (LrTable.NT 142,(result,exp1left,program_opt1right),rest671) end | (328,(_,(MlyValue.program' program'1,program'1left,program'1right)) ::rest671) => let val result=MlyValue.program_opt(fn _ => let val program' as program'1=program'1 () in ( SOME program' ) end ) in (LrTable.NT 143,(result,program'1left,program'1right),rest671) end | (329,rest671) => let val result=MlyValue.program_opt(fn _ => ( NONE )) in (LrTable.NT 143,(result,defaultPos,defaultPos),rest671) end | _ => raise (mlyAction i392) end val void = MlyValue.VOID val extract = fn a => (fn MlyValue.program x => x | _ => let exception ParseInternal in raise ParseInternal end) a () end end structure Tokens : Parser_TOKENS = struct type svalue = ParserData.svalue type ('a,'b) token = ('a,'b) Token.token fun EOF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 0,( ParserData.MlyValue.VOID,p1,p2)) fun ABSTYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 1,( ParserData.MlyValue.VOID,p1,p2)) fun AND (p1,p2) = Token.TOKEN (ParserData.LrTable.T 2,( ParserData.MlyValue.VOID,p1,p2)) fun ANDALSO (p1,p2) = Token.TOKEN (ParserData.LrTable.T 3,( ParserData.MlyValue.VOID,p1,p2)) fun AS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 4,( ParserData.MlyValue.VOID,p1,p2)) fun CASE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 5,( ParserData.MlyValue.VOID,p1,p2)) fun DO (p1,p2) = Token.TOKEN (ParserData.LrTable.T 6,( ParserData.MlyValue.VOID,p1,p2)) fun DATATYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 7,( ParserData.MlyValue.VOID,p1,p2)) fun ELSE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 8,( ParserData.MlyValue.VOID,p1,p2)) fun END (p1,p2) = Token.TOKEN (ParserData.LrTable.T 9,( ParserData.MlyValue.VOID,p1,p2)) fun EXCEPTION (p1,p2) = Token.TOKEN (ParserData.LrTable.T 10,( ParserData.MlyValue.VOID,p1,p2)) fun FN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 11,( ParserData.MlyValue.VOID,p1,p2)) fun FUN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 12,( ParserData.MlyValue.VOID,p1,p2)) fun HANDLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 13,( ParserData.MlyValue.VOID,p1,p2)) fun IF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 14,( ParserData.MlyValue.VOID,p1,p2)) fun IN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 15,( ParserData.MlyValue.VOID,p1,p2)) fun INFIX (p1,p2) = Token.TOKEN (ParserData.LrTable.T 16,( ParserData.MlyValue.VOID,p1,p2)) fun INFIXR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 17,( ParserData.MlyValue.VOID,p1,p2)) fun LET (p1,p2) = Token.TOKEN (ParserData.LrTable.T 18,( ParserData.MlyValue.VOID,p1,p2)) fun LOCAL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 19,( ParserData.MlyValue.VOID,p1,p2)) fun NONFIX (p1,p2) = Token.TOKEN (ParserData.LrTable.T 20,( ParserData.MlyValue.VOID,p1,p2)) fun OF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 21,( ParserData.MlyValue.VOID,p1,p2)) fun OP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 22,( ParserData.MlyValue.VOID,p1,p2)) fun OPEN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 23,( ParserData.MlyValue.VOID,p1,p2)) fun ORELSE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 24,( ParserData.MlyValue.VOID,p1,p2)) fun RAISE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 25,( ParserData.MlyValue.VOID,p1,p2)) fun REC (p1,p2) = Token.TOKEN (ParserData.LrTable.T 26,( ParserData.MlyValue.VOID,p1,p2)) fun THEN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 27,( ParserData.MlyValue.VOID,p1,p2)) fun TYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 28,( ParserData.MlyValue.VOID,p1,p2)) fun VAL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 29,( ParserData.MlyValue.VOID,p1,p2)) fun WITH (p1,p2) = Token.TOKEN (ParserData.LrTable.T 30,( ParserData.MlyValue.VOID,p1,p2)) fun WITHTYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 31,( ParserData.MlyValue.VOID,p1,p2)) fun WHILE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 32,( ParserData.MlyValue.VOID,p1,p2)) fun LPAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 33,( ParserData.MlyValue.VOID,p1,p2)) fun RPAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 34,( ParserData.MlyValue.VOID,p1,p2)) fun LBRACK (p1,p2) = Token.TOKEN (ParserData.LrTable.T 35,( ParserData.MlyValue.VOID,p1,p2)) fun RBRACK (p1,p2) = Token.TOKEN (ParserData.LrTable.T 36,( ParserData.MlyValue.VOID,p1,p2)) fun LBRACE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 37,( ParserData.MlyValue.VOID,p1,p2)) fun RBRACE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 38,( ParserData.MlyValue.VOID,p1,p2)) fun COMMA (p1,p2) = Token.TOKEN (ParserData.LrTable.T 39,( ParserData.MlyValue.VOID,p1,p2)) fun COLON (p1,p2) = Token.TOKEN (ParserData.LrTable.T 40,( ParserData.MlyValue.VOID,p1,p2)) fun SEMICOLON (p1,p2) = Token.TOKEN (ParserData.LrTable.T 41,( ParserData.MlyValue.VOID,p1,p2)) fun DOTS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 42,( ParserData.MlyValue.VOID,p1,p2)) fun UNDERBAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 43,( ParserData.MlyValue.VOID,p1,p2)) fun BAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 44,( ParserData.MlyValue.VOID,p1,p2)) fun EQUALS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 45,( ParserData.MlyValue.VOID,p1,p2)) fun DARROW (p1,p2) = Token.TOKEN (ParserData.LrTable.T 46,( ParserData.MlyValue.VOID,p1,p2)) fun ARROW (p1,p2) = Token.TOKEN (ParserData.LrTable.T 47,( ParserData.MlyValue.VOID,p1,p2)) fun HASH (p1,p2) = Token.TOKEN (ParserData.LrTable.T 48,( ParserData.MlyValue.VOID,p1,p2)) fun EQTYPE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 49,( ParserData.MlyValue.VOID,p1,p2)) fun FUNCTOR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 50,( ParserData.MlyValue.VOID,p1,p2)) fun INCLUDE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 51,( ParserData.MlyValue.VOID,p1,p2)) fun SHARING (p1,p2) = Token.TOKEN (ParserData.LrTable.T 52,( ParserData.MlyValue.VOID,p1,p2)) fun SIG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 53,( ParserData.MlyValue.VOID,p1,p2)) fun SIGNATURE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 54,( ParserData.MlyValue.VOID,p1,p2)) fun STRUCT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 55,( ParserData.MlyValue.VOID,p1,p2)) fun STRUCTURE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 56,( ParserData.MlyValue.VOID,p1,p2)) fun WHERE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 57,( ParserData.MlyValue.VOID,p1,p2)) fun COLONGREATER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 58,( ParserData.MlyValue.VOID,p1,p2)) fun ZERO (p1,p2) = Token.TOKEN (ParserData.LrTable.T 59,( ParserData.MlyValue.VOID,p1,p2)) fun DIGIT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 60,( ParserData.MlyValue.DIGIT (fn () => i),p1,p2)) fun NUMERIC (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 61,( ParserData.MlyValue.NUMERIC (fn () => i),p1,p2)) fun INT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 62,( ParserData.MlyValue.INT (fn () => i),p1,p2)) fun WORD (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 63,( ParserData.MlyValue.WORD (fn () => i),p1,p2)) fun REAL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 64,( ParserData.MlyValue.REAL (fn () => i),p1,p2)) fun STRING (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 65,( ParserData.MlyValue.STRING (fn () => i),p1,p2)) fun CHAR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 66,( ParserData.MlyValue.CHAR (fn () => i),p1,p2)) fun ALPHA (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 67,( ParserData.MlyValue.ALPHA (fn () => i),p1,p2)) fun SYMBOL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 68,( ParserData.MlyValue.SYMBOL (fn () => i),p1,p2)) fun STAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 69,( ParserData.MlyValue.VOID,p1,p2)) fun TYVAR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 70,( ParserData.MlyValue.TYVAR (fn () => i),p1,p2)) fun ETYVAR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 71,( ParserData.MlyValue.ETYVAR (fn () => i),p1,p2)) fun LONGID (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 72,( ParserData.MlyValue.LONGID (fn () => i),p1,p2)) end end (* stop of Parser.grm.sml *) (* start of Lexer.lex.sml *) type int = Int.int functor LexerFn(structure Tokens: Parser_TOKENS) = struct structure UserDeclarations = struct (* * Standard ML lexical analysis * * Definition, sections 2.1-2.5, 3.1 * * Notes: * Since all lexical classes must be disjoint: * - There is no single class ID, use ALPHA|SYMBOL|STAR|EQUALS. * - There is no class LAB, use ALPHA|SYMBOL|NUMERIC|DIGIT|STAR. * - ID does not contain `=' and `*', those are EQUALS and STAR. * - LONGID does not contain unqualified ids (but allows for `=' and `*'). * - INT does not contain positive decimal integers without leading 0, * and single DIGIT integers, those are in NUMERIC, DIGIT, and ZERO. * - NUMERIC does not contain single digit numbers, those are in DIGIT. * - DIGIT does not contain 0, that is ZERO. * * The parser uses a global variable to recognise nested comments, so it is * not reentrant. *) open Tokens (* Types to match structure LEXER.UserDeclaration *) type ('a,'b) token = ('a,'b) Tokens.token type pos = int type svalue = Tokens.svalue type lexresult = (svalue, pos) token (* Handling nested comments *) val nesting = ref 0 (* non-reentrant side-effect way :-P *) fun eof() = if !nesting = 0 then Tokens.EOF(0, 0) else Error.error((0,0), "unclosed comment") (* Some helpers to create tokens *) open Tokens fun toLRPos(yypos, yytext) = let val yypos = yypos - 2 (* bug in ML-Lex... *) in (yypos, yypos + String.size yytext) end fun token(TOKEN, yypos, yytext) = TOKEN(toLRPos(yypos, yytext)) fun tokenOf(TOKEN, toVal, yypos, yytext) = let val i as (l,r) = toLRPos(yypos, yytext) in TOKEN(toVal(yytext, i), l, r) end fun error(yypos, yytext, s) = Error.error(toLRPos(yypos,yytext), s) fun invalid(yypos, yytext) = let val s = "invalid character `" ^ String.toCString yytext ^ "'" in error(yypos, yytext, s) end (* Convert identifiers *) fun toId(s, i) = s fun toLongId(s, i) = let fun split [] = raise Fail "Lexer.toLongId: empty longid" | split [x] = ([],x) | split(x::xs) = let val (ys,y) = split xs in (x::ys,y) end in split(String.fields (fn c => c = #".") s) end (* Convert constants [Section 2.2] *) local open StringCvt in fun toInt(s,i) = (case String.explode s of #"0" :: #"x" :: s' => valOf(scanString (Int.scan HEX) (String.implode s')) | #"~" :: #"0" :: #"x" :: s' => ~(valOf(scanString (Int.scan HEX) (String.implode s'))) | _ => valOf(scanString (Int.scan DEC) s) ) handle Overflow => Error.error(i, "integer constant too big") fun toWord(s,i) = (case String.explode s of #"0" :: #"w" :: #"x" :: s' => valOf(scanString (Word.scan HEX) (String.implode s')) | #"0" :: #"w" :: s' => valOf(scanString (Word.scan DEC) (String.implode s')) | _ => raise Fail "Lexer.toWord: invalid word constant" ) handle Overflow => Error.error(i, "word constant too big") fun toReal(s,i) = valOf(scanString Real.scan s) fun toString(s,i) = let fun convert(#"\\"::s, cs) = escape(s, cs) | convert([#"\""], cs) = cs | convert(c::s, cs) = convert(s, c::cs) | convert([], cs) = raise Fail "Lexer.toString: unclosed string literal" and escape(#"a"::s, cs) = convert(s, #"\a"::cs) | escape(#"b"::s, cs) = convert(s, #"\b"::cs) | escape(#"t"::s, cs) = convert(s, #"\t"::cs) | escape(#"n"::s, cs) = convert(s, #"\n"::cs) | escape(#"v"::s, cs) = convert(s, #"\v"::cs) | escape(#"f"::s, cs) = convert(s, #"\f"::cs) | escape(#"r"::s, cs) = convert(s, #"\r"::cs) | escape(#"\""::s, cs) = convert(s, #"\""::cs) | escape(#"\\"::s, cs) = convert(s, #"\\"::cs) | escape(#"^"::c::s, cs) = convert(s, Char.chr(Char.ord c - 64)::cs) | escape(#"u"::x1::x2::x3::x4::s, cs) = convert(s, unicode[x1,x2,x3,x4]::cs) | escape(c::s, cs) = if Char.isDigit c then case s of c2::c3::s => convert(s, ascii[c,c2,c3]::cs) | _ => raise Fail "Lexer.toString: invalid ASCII escape sequence" else if Char.isSpace c then escapeGap(s,cs) else raise Fail "Lexer.toString: invalid escape sequence" | escape([], cs) = raise Fail "Lexer.toString: empty escape character" and escapeGap(c::s, cs) = if Char.isSpace c then escapeGap(s, cs) else (* c = #"\\" *) convert(s, cs) | escapeGap([], cs) = raise Fail "Lexer.toString: invalid string gap" and ascii s = Char.chr(valOf(scanString (Int.scan DEC) (String.implode s))) handle Chr => Error.error(i, "ASCII escape character too big") | Overflow => Error.error(i, "ASCII escape character too big") and unicode s = Char.chr(valOf(scanString (Int.scan HEX) (String.implode s))) handle Chr => Error.error(i, "unicode escape character too big") | Overflow => Error.error(i, "unicode escape character too big") val cs = List.tl(String.explode s) in String.implode(List.rev(convert(cs, []))) end fun toChar(s,i) = let val s' = String.substring(s, 1, String.size s-1) val ss' = toString(s',i) in if String.size ss' = 1 then String.sub(ss',0) else if ss' = "" then Error.error(i, "empty character constant") else Error.error(i, "character constant too long") end end (* local *) end (* end of user routines *) exception LexError (* raised if illegal leaf action tried *) structure Internal = struct datatype yyfinstate = N of int type statedata = {fin : yyfinstate list, trans: string} (* transition & final state table *) val tab = let val s = [ (0, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (1, "\005\005\005\005\005\005\005\005\005\235\236\235\235\235\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\235\180\223\211\180\180\180\209\207\206\205\180\204\202\199\180\ \\191\189\189\189\189\189\189\189\189\189\187\186\180\184\180\180\ \\180\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\ \\025\025\025\025\025\025\025\025\025\025\025\183\180\182\180\181\ \\180\166\025\162\153\134\126\025\120\108\025\025\101\025\095\085\ \\025\025\078\055\048\025\045\030\025\025\025\024\023\022\006\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\ \\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" ), (3, "\237\237\237\237\237\237\237\237\237\237\242\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\240\237\238\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\ \\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237\237" ), (6, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\019\008\008\008\008\008\008\008\008\008\007\000\007\007\007\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (7, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\007\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (8, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\008\008\008\008\008\008\008\008\008\008\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (9, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (10, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\011\011\011\011\011\011\011\011\011\011\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (12, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (13, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (14, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\000\ \\000\000\000\000\000\015\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\015\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (15, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\018\018\018\018\018\018\018\018\018\018\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (16, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\017\017\017\017\017\017\017\017\017\017\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (18, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\018\018\018\018\018\018\018\018\018\018\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (19, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\008\008\008\008\008\008\008\008\008\008\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (20, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\021\021\021\021\021\021\021\021\021\021\000\000\000\000\000\000\ \\000\021\021\021\021\021\021\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\021\021\021\021\021\021\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (25, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (27, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\028\000\028\028\028\028\000\000\000\028\028\000\028\000\028\ \\000\000\000\000\000\000\000\000\000\000\028\000\028\028\028\028\ \\028\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\ \\029\029\029\029\029\029\029\029\029\029\029\000\028\000\028\000\ \\028\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\ \\029\029\029\029\029\029\029\029\029\029\029\000\028\000\028\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (28, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\028\000\028\028\028\028\000\000\000\028\028\000\028\000\028\ \\000\000\000\000\000\000\000\000\000\000\028\000\028\028\028\028\ \\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\028\000\028\000\ \\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\028\000\028\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (29, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\029\000\000\000\000\000\000\027\000\ \\029\029\029\029\029\029\029\029\029\029\000\000\000\000\000\000\ \\000\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\ \\029\029\029\029\029\029\029\029\029\029\029\000\000\000\000\029\ \\000\029\029\029\029\029\029\029\029\029\029\029\029\029\029\029\ \\029\029\029\029\029\029\029\029\029\029\029\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (30, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\038\031\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (31, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\032\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (32, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\033\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (33, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\034\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (34, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\035\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (35, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\036\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (36, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\037\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (38, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\042\026\026\026\039\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (39, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\040\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (40, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\041\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (42, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\043\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (43, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\044\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (45, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\046\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (46, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\047\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (48, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\052\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\049\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (49, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\050\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (50, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\051\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (52, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\053\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (53, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\054\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (55, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\072\064\026\026\026\026\026\026\ \\026\026\026\026\056\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (56, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\057\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (57, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\058\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (58, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\059\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (59, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\060\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (60, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\061\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (61, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\062\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (62, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\063\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (64, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\065\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (65, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\066\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (66, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\067\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (67, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\068\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (68, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\069\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (69, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\070\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (70, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\071\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (72, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\073\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (73, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\074\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (74, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\075\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (75, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\076\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (76, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\077\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (78, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\081\026\026\026\079\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (79, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\080\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (81, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\082\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (82, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\083\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (83, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\084\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (85, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\094\026\026\026\026\026\026\026\026\026\ \\091\026\086\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (86, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\087\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (87, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\088\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (88, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\089\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (89, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\090\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (91, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\092\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (92, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\093\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (95, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\096\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (96, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\097\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (97, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\098\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (98, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\099\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (99, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\100\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (101, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\106\026\026\026\026\026\026\026\026\026\102\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (102, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\103\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (103, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\104\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (104, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\105\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (106, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\107\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (108, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\119\026\026\026\026\026\026\026\109\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (109, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\114\026\026\110\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (110, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\111\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (111, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\112\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (112, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\113\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (114, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\115\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (115, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\116\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (116, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\117\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (117, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\118\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (120, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\121\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (121, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\122\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (122, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\123\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (123, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\124\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (124, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\125\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (126, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\133\026\ \\026\026\026\026\026\127\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (127, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\128\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (128, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\129\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (129, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\130\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (130, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\131\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (131, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\132\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (134, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\150\026\148\026\ \\026\143\026\026\026\026\026\026\135\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (135, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\136\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (136, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\137\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (137, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\138\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (138, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\139\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (139, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\140\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (140, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\141\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (141, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\142\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (143, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\144\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (144, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\145\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (145, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\146\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (146, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\147\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (148, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\149\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (150, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\151\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (151, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\152\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (153, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\155\026\026\026\026\026\026\026\026\026\026\026\026\026\154\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (155, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\156\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (156, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\157\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (157, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\158\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (158, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\159\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (159, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\160\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (160, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\161\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (162, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\163\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (163, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\164\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (164, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\165\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (166, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\174\026\026\026\026\026\026\026\026\026\026\026\168\026\ \\026\026\026\167\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (168, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\169\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (169, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\170\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (170, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\171\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (171, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\172\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (172, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\173\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (174, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\175\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (175, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\176\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (176, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\177\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (177, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\178\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (178, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\ \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\ \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\ \\000\026\026\026\026\179\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (184, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\185\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (187, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\188\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (189, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\190\190\190\190\190\190\190\190\190\190\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (191, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\198\198\198\198\198\198\198\198\198\198\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\194\192\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (192, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\193\193\193\193\193\193\193\193\193\193\000\000\000\000\000\000\ \\000\193\193\193\193\193\193\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\193\193\193\193\193\193\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (194, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\197\197\197\197\197\197\197\197\197\197\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\195\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (195, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\196\196\196\196\196\196\196\196\196\196\000\000\000\000\000\000\ \\000\196\196\196\196\196\196\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\196\196\196\196\196\196\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (197, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\197\197\197\197\197\197\197\197\197\197\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (198, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ \\198\198\198\198\198\198\198\198\198\198\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (199, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (200, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\201\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (202, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\000\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\203\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (207, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\208\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (209, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\210\000\000\000\000\000\000\000\000\ \\210\210\210\210\210\210\210\210\210\210\000\000\000\000\000\000\ \\000\210\210\210\210\210\210\210\210\210\210\210\210\210\210\210\ \\210\210\210\210\210\210\210\210\210\210\210\000\000\000\000\210\ \\000\210\210\210\210\210\210\210\210\210\210\210\210\210\210\210\ \\210\210\210\210\210\210\210\210\210\210\210\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (211, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\007\212\007\007\007\007\000\000\000\007\007\000\007\000\007\ \\000\000\000\000\000\000\000\000\000\000\007\000\007\007\007\007\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (212, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\212\212\222\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\213\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\000\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212" ), (213, "\000\000\000\000\000\000\000\000\000\221\221\221\221\221\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\221\000\212\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\219\219\219\219\219\219\219\219\219\219\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\212\000\218\000\ \\000\212\212\000\000\000\212\000\000\000\000\000\000\000\212\000\ \\000\000\212\000\212\214\212\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (214, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\215\215\215\215\215\215\215\215\215\215\000\000\000\000\000\000\ \\000\215\215\215\215\215\215\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\215\215\215\215\215\215\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (215, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\216\216\216\216\216\216\216\216\216\216\000\000\000\000\000\000\ \\000\216\216\216\216\216\216\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\216\216\216\216\216\216\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (216, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\217\217\217\217\217\217\217\217\217\217\000\000\000\000\000\000\ \\000\217\217\217\217\217\217\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\217\217\217\217\217\217\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (217, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\212\212\212\212\212\212\212\212\212\212\000\000\000\000\000\000\ \\000\212\212\212\212\212\212\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\212\212\212\212\212\212\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (218, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (219, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\220\220\220\220\220\220\220\220\220\220\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (220, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\212\212\212\212\212\212\212\212\212\212\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (221, "\000\000\000\000\000\000\000\000\000\221\221\221\221\221\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\212\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (223, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\224\224\234\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\225\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\000\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224" ), (225, "\000\000\000\000\000\000\000\000\000\233\233\233\233\233\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\233\000\224\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\231\231\231\231\231\231\231\231\231\231\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\224\000\230\000\ \\000\224\224\000\000\000\224\000\000\000\000\000\000\000\224\000\ \\000\000\224\000\224\226\224\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (226, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\227\227\227\227\227\227\227\227\227\227\000\000\000\000\000\000\ \\000\227\227\227\227\227\227\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\227\227\227\227\227\227\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (227, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\228\228\228\228\228\228\228\228\228\228\000\000\000\000\000\000\ \\000\228\228\228\228\228\228\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\228\228\228\228\228\228\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (228, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\229\229\229\229\229\229\229\229\229\229\000\000\000\000\000\000\ \\000\229\229\229\229\229\229\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\229\229\229\229\229\229\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (229, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\224\224\224\224\224\224\224\224\224\224\000\000\000\000\000\000\ \\000\224\224\224\224\224\224\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\224\224\224\224\224\224\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (230, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\224\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (231, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\232\232\232\232\232\232\232\232\232\232\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (232, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\224\224\224\224\224\224\224\224\224\224\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (233, "\000\000\000\000\000\000\000\000\000\233\233\233\233\233\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\224\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (235, "\000\000\000\000\000\000\000\000\000\236\236\236\236\236\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (238, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (240, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" ), (0, "")] fun f x = x val s = map f (rev (tl (rev s))) exception LexHackingError fun look ((j,x)::r, i) = if i = j then x else look(r, i) | look ([], i) = raise LexHackingError fun g {fin=x, trans=i} = {fin=x, trans=look(s,i)} in Vector.fromList(map g [{fin = [], trans = 0}, {fin = [], trans = 1}, {fin = [], trans = 1}, {fin = [], trans = 3}, {fin = [], trans = 3}, {fin = [(N 472)], trans = 0}, {fin = [(N 436),(N 472)], trans = 6}, {fin = [(N 436)], trans = 7}, {fin = [(N 304)], trans = 8}, {fin = [], trans = 9}, {fin = [], trans = 10}, {fin = [(N 342)], trans = 10}, {fin = [(N 342)], trans = 12}, {fin = [], trans = 13}, {fin = [(N 342)], trans = 14}, {fin = [], trans = 15}, {fin = [], trans = 16}, {fin = [(N 342)], trans = 16}, {fin = [(N 342)], trans = 18}, {fin = [(N 304)], trans = 19}, {fin = [], trans = 20}, {fin = [(N 304)], trans = 20}, {fin = [(N 43),(N 472)], trans = 0}, {fin = [(N 41),(N 436),(N 472)], trans = 7}, {fin = [(N 39),(N 472)], trans = 0}, {fin = [(N 433),(N 472)], trans = 25}, {fin = [(N 433)], trans = 25}, {fin = [], trans = 27}, {fin = [(N 455)], trans = 28}, {fin = [(N 455)], trans = 29}, {fin = [(N 433),(N 472)], trans = 30}, {fin = [(N 433)], trans = 31}, {fin = [(N 433)], trans = 32}, {fin = [(N 273),(N 433)], trans = 33}, {fin = [(N 433)], trans = 34}, {fin = [(N 433)], trans = 35}, {fin = [(N 433)], trans = 36}, {fin = [(N 282),(N 433)], trans = 25}, {fin = [(N 433)], trans = 38}, {fin = [(N 433)], trans = 39}, {fin = [(N 433)], trans = 40}, {fin = [(N 268),(N 433)], trans = 25}, {fin = [(N 433)], trans = 42}, {fin = [(N 433)], trans = 43}, {fin = [(N 262),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 45}, {fin = [(N 433)], trans = 46}, {fin = [(N 256),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 48}, {fin = [(N 433)], trans = 49}, {fin = [(N 433)], trans = 50}, {fin = [(N 252),(N 433)], trans = 25}, {fin = [(N 433)], trans = 52}, {fin = [(N 433)], trans = 53}, {fin = [(N 247),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 55}, {fin = [(N 433)], trans = 56}, {fin = [(N 433)], trans = 57}, {fin = [(N 433)], trans = 58}, {fin = [(N 433)], trans = 59}, {fin = [(N 232),(N 433)], trans = 60}, {fin = [(N 433)], trans = 61}, {fin = [(N 433)], trans = 62}, {fin = [(N 242),(N 433)], trans = 25}, {fin = [(N 433)], trans = 64}, {fin = [(N 215),(N 433)], trans = 65}, {fin = [(N 433)], trans = 66}, {fin = [(N 433)], trans = 67}, {fin = [(N 433)], trans = 68}, {fin = [(N 433)], trans = 69}, {fin = [(N 433)], trans = 70}, {fin = [(N 225),(N 433)], trans = 25}, {fin = [(N 433)], trans = 72}, {fin = [(N 433)], trans = 73}, {fin = [(N 433)], trans = 74}, {fin = [(N 433)], trans = 75}, {fin = [(N 433)], trans = 76}, {fin = [(N 211),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 78}, {fin = [(N 433)], trans = 79}, {fin = [(N 203),(N 433)], trans = 25}, {fin = [(N 433)], trans = 81}, {fin = [(N 433)], trans = 82}, {fin = [(N 433)], trans = 83}, {fin = [(N 199),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 85}, {fin = [(N 433)], trans = 86}, {fin = [(N 433)], trans = 87}, {fin = [(N 433)], trans = 88}, {fin = [(N 433)], trans = 89}, {fin = [(N 193),(N 433)], trans = 25}, {fin = [(N 181),(N 433)], trans = 91}, {fin = [(N 433)], trans = 92}, {fin = [(N 186),(N 433)], trans = 25}, {fin = [(N 178),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 95}, {fin = [(N 433)], trans = 96}, {fin = [(N 433)], trans = 97}, {fin = [(N 433)], trans = 98}, {fin = [(N 433)], trans = 99}, {fin = [(N 175),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 101}, {fin = [(N 433)], trans = 102}, {fin = [(N 433)], trans = 103}, {fin = [(N 433)], trans = 104}, {fin = [(N 168),(N 433)], trans = 25}, {fin = [(N 433)], trans = 106}, {fin = [(N 162),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 108}, {fin = [(N 137),(N 433)], trans = 109}, {fin = [(N 433)], trans = 110}, {fin = [(N 433)], trans = 111}, {fin = [(N 151),(N 433)], trans = 112}, {fin = [(N 158),(N 433)], trans = 25}, {fin = [(N 433)], trans = 114}, {fin = [(N 433)], trans = 115}, {fin = [(N 433)], trans = 116}, {fin = [(N 433)], trans = 117}, {fin = [(N 145),(N 433)], trans = 25}, {fin = [(N 134),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 120}, {fin = [(N 433)], trans = 121}, {fin = [(N 433)], trans = 122}, {fin = [(N 433)], trans = 123}, {fin = [(N 433)], trans = 124}, {fin = [(N 131),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 126}, {fin = [(N 433)], trans = 127}, {fin = [(N 116),(N 433)], trans = 128}, {fin = [(N 433)], trans = 129}, {fin = [(N 433)], trans = 130}, {fin = [(N 433)], trans = 131}, {fin = [(N 124),(N 433)], trans = 25}, {fin = [(N 112),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 134}, {fin = [(N 433)], trans = 135}, {fin = [(N 433)], trans = 136}, {fin = [(N 433)], trans = 137}, {fin = [(N 433)], trans = 138}, {fin = [(N 433)], trans = 139}, {fin = [(N 433)], trans = 140}, {fin = [(N 433)], trans = 141}, {fin = [(N 109),(N 433)], trans = 25}, {fin = [(N 433)], trans = 143}, {fin = [(N 433)], trans = 144}, {fin = [(N 433)], trans = 145}, {fin = [(N 433)], trans = 146}, {fin = [(N 99),(N 433)], trans = 25}, {fin = [(N 433)], trans = 148}, {fin = [(N 92),(N 433)], trans = 25}, {fin = [(N 433)], trans = 150}, {fin = [(N 433)], trans = 151}, {fin = [(N 88),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 153}, {fin = [(N 83),(N 433)], trans = 25}, {fin = [(N 433)], trans = 155}, {fin = [(N 433)], trans = 156}, {fin = [(N 433)], trans = 157}, {fin = [(N 433)], trans = 158}, {fin = [(N 433)], trans = 159}, {fin = [(N 433)], trans = 160}, {fin = [(N 80),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 162}, {fin = [(N 433)], trans = 163}, {fin = [(N 433)], trans = 164}, {fin = [(N 71),(N 433)], trans = 25}, {fin = [(N 433),(N 472)], trans = 166}, {fin = [(N 66),(N 433)], trans = 25}, {fin = [(N 433)], trans = 168}, {fin = [(N 55),(N 433)], trans = 169}, {fin = [(N 433)], trans = 170}, {fin = [(N 433)], trans = 171}, {fin = [(N 433)], trans = 172}, {fin = [(N 63),(N 433)], trans = 25}, {fin = [(N 433)], trans = 174}, {fin = [(N 433)], trans = 175}, {fin = [(N 433)], trans = 176}, {fin = [(N 433)], trans = 177}, {fin = [(N 433)], trans = 178}, {fin = [(N 51),(N 433)], trans = 25}, {fin = [(N 436),(N 472)], trans = 7}, {fin = [(N 37),(N 472)], trans = 0}, {fin = [(N 35),(N 472)], trans = 0}, {fin = [(N 33),(N 472)], trans = 0}, {fin = [(N 28),(N 436),(N 472)], trans = 184}, {fin = [(N 31),(N 436)], trans = 7}, {fin = [(N 26),(N 472)], trans = 0}, {fin = [(N 21),(N 436),(N 472)], trans = 187}, {fin = [(N 24),(N 436)], trans = 7}, {fin = [(N 286),(N 289),(N 304),(N 472)], trans = 189}, {fin = [(N 289),(N 304)], trans = 189}, {fin = [(N 284),(N 304),(N 472)], trans = 191}, {fin = [], trans = 192}, {fin = [(N 304)], trans = 192}, {fin = [], trans = 194}, {fin = [], trans = 195}, {fin = [(N 314)], trans = 195}, {fin = [(N 314)], trans = 197}, {fin = [(N 304)], trans = 198}, {fin = [(N 472)], trans = 199}, {fin = [], trans = 200}, {fin = [(N 19)], trans = 0}, {fin = [(N 436),(N 472)], trans = 202}, {fin = [(N 15),(N 436)], trans = 7}, {fin = [(N 12),(N 472)], trans = 0}, {fin = [(N 10),(N 436),(N 472)], trans = 7}, {fin = [(N 8),(N 472)], trans = 0}, {fin = [(N 6),(N 472)], trans = 207}, {fin = [(N 458)], trans = 0}, {fin = [(N 428),(N 472)], trans = 209}, {fin = [(N 428)], trans = 209}, {fin = [(N 4),(N 436),(N 472)], trans = 211}, {fin = [], trans = 212}, {fin = [], trans = 213}, {fin = [], trans = 214}, {fin = [], trans = 215}, {fin = [], trans = 216}, {fin = [], trans = 217}, {fin = [], trans = 218}, {fin = [], trans = 219}, {fin = [], trans = 220}, {fin = [], trans = 221}, {fin = [(N 423)], trans = 0}, {fin = [(N 470),(N 472)], trans = 223}, {fin = [], trans = 223}, {fin = [], trans = 225}, {fin = [], trans = 226}, {fin = [], trans = 227}, {fin = [], trans = 228}, {fin = [], trans = 229}, {fin = [], trans = 230}, {fin = [], trans = 231}, {fin = [], trans = 232}, {fin = [], trans = 233}, {fin = [(N 382)], trans = 0}, {fin = [(N 2),(N 472)], trans = 235}, {fin = [(N 2)], trans = 235}, {fin = [(N 466)], trans = 0}, {fin = [(N 466)], trans = 238}, {fin = [(N 464)], trans = 0}, {fin = [(N 466)], trans = 240}, {fin = [(N 461)], trans = 0}, {fin = [(N 468)], trans = 0}]) end structure StartStates = struct datatype yystartstate = STARTSTATE of int (* start state definitions *) val COMMENT = STARTSTATE 3; val INITIAL = STARTSTATE 1; end type result = UserDeclarations.lexresult exception LexerError (* raised if illegal leaf action tried *) end type int = Int.int fun makeLexer (yyinput: int -> string) = let val yygone0:int=1 val yyb = ref "\n" (* buffer *) val yybl: int ref = ref 1 (*buffer length *) val yybufpos: int ref = ref 1 (* location of next character to use *) val yygone: int ref = ref yygone0 (* position in file of beginning of buffer *) val yydone = ref false (* eof found yet? *) val yybegin: int ref = ref 1 (*Current 'start state' for lexer *) val YYBEGIN = fn (Internal.StartStates.STARTSTATE x) => yybegin := x fun lex () : Internal.result = let fun continue() = lex() in let fun scan (s,AcceptingLeaves : Internal.yyfinstate list list,l,i0: int) = let fun action (i: int,nil) = raise LexError | action (i,nil::l) = action (i-1,l) | action (i,(node::acts)::l) = case node of Internal.N yyk => (let fun yymktext() = String.substring(!yyb,i0,i-i0) val yypos: int = i0+ !yygone open UserDeclarations Internal.StartStates in (yybufpos := i; case yyk of (* Application actions *) 10 => let val yytext=yymktext() in token(STAR, yypos, yytext) end | 109 => let val yytext=yymktext() in token(EXCEPTION, yypos, yytext) end | 112 => let val yytext=yymktext() in token(FN, yypos, yytext) end | 116 => let val yytext=yymktext() in token(FUN, yypos, yytext) end | 12 => let val yytext=yymktext() in token(COMMA, yypos, yytext) end | 124 => let val yytext=yymktext() in token(FUNCTOR, yypos, yytext) end | 131 => let val yytext=yymktext() in token(HANDLE, yypos, yytext) end | 134 => let val yytext=yymktext() in token(IF, yypos, yytext) end | 137 => let val yytext=yymktext() in token(IN, yypos, yytext) end | 145 => let val yytext=yymktext() in token(INCLUDE, yypos, yytext) end | 15 => let val yytext=yymktext() in token(ARROW, yypos, yytext) end | 151 => let val yytext=yymktext() in token(INFIX, yypos, yytext) end | 158 => let val yytext=yymktext() in token(INFIXR, yypos, yytext) end | 162 => let val yytext=yymktext() in token(LET, yypos, yytext) end | 168 => let val yytext=yymktext() in token(LOCAL, yypos, yytext) end | 175 => let val yytext=yymktext() in token(NONFIX, yypos, yytext) end | 178 => let val yytext=yymktext() in token(OF, yypos, yytext) end | 181 => let val yytext=yymktext() in token(OP, yypos, yytext) end | 186 => let val yytext=yymktext() in token(OPEN, yypos, yytext) end | 19 => let val yytext=yymktext() in token(DOTS, yypos, yytext) end | 193 => let val yytext=yymktext() in token(ORELSE, yypos, yytext) end | 199 => let val yytext=yymktext() in token(RAISE, yypos, yytext) end | 2 => ( continue() ) | 203 => let val yytext=yymktext() in token(REC, yypos, yytext) end | 21 => let val yytext=yymktext() in token(COLON, yypos, yytext) end | 211 => let val yytext=yymktext() in token(SHARING, yypos, yytext) end | 215 => let val yytext=yymktext() in token(SIG, yypos, yytext) end | 225 => let val yytext=yymktext() in token(SIGNATURE, yypos, yytext) end | 232 => let val yytext=yymktext() in token(STRUCT, yypos, yytext) end | 24 => let val yytext=yymktext() in token(COLONGREATER, yypos, yytext) end | 242 => let val yytext=yymktext() in token(STRUCTURE, yypos, yytext) end | 247 => let val yytext=yymktext() in token(THEN, yypos, yytext) end | 252 => let val yytext=yymktext() in token(TYPE, yypos, yytext) end | 256 => let val yytext=yymktext() in token(VAL, yypos, yytext) end | 26 => let val yytext=yymktext() in token(SEMICOLON, yypos, yytext) end | 262 => let val yytext=yymktext() in token(WHERE, yypos, yytext) end | 268 => let val yytext=yymktext() in token(WHILE, yypos, yytext) end | 273 => let val yytext=yymktext() in token(WITH, yypos, yytext) end | 28 => let val yytext=yymktext() in token(EQUALS, yypos, yytext) end | 282 => let val yytext=yymktext() in token(WITHTYPE, yypos, yytext) end | 284 => let val yytext=yymktext() in token (ZERO, yypos, yytext) end | 286 => let val yytext=yymktext() in tokenOf(DIGIT, toInt, yypos, yytext) end | 289 => let val yytext=yymktext() in tokenOf(NUMERIC, toInt, yypos, yytext) end | 304 => let val yytext=yymktext() in tokenOf(INT, toInt, yypos, yytext) end | 31 => let val yytext=yymktext() in token(DARROW, yypos, yytext) end | 314 => let val yytext=yymktext() in tokenOf(WORD, toWord, yypos, yytext) end | 33 => let val yytext=yymktext() in token(LBRACK, yypos, yytext) end | 342 => let val yytext=yymktext() in tokenOf(REAL, toReal, yypos, yytext) end | 35 => let val yytext=yymktext() in token(RBRACK, yypos, yytext) end | 37 => let val yytext=yymktext() in token(UNDERBAR, yypos, yytext) end | 382 => let val yytext=yymktext() in tokenOf(STRING, toString, yypos, yytext) end | 39 => let val yytext=yymktext() in token(LBRACE, yypos, yytext) end | 4 => let val yytext=yymktext() in token(HASH, yypos, yytext) end | 41 => let val yytext=yymktext() in token(BAR, yypos, yytext) end | 423 => let val yytext=yymktext() in tokenOf(CHAR, toChar, yypos, yytext) end | 428 => let val yytext=yymktext() in tokenOf(TYVAR, toId, yypos, yytext) end | 43 => let val yytext=yymktext() in token(RBRACE, yypos, yytext) end | 433 => let val yytext=yymktext() in tokenOf(ALPHA, toId, yypos, yytext) end | 436 => let val yytext=yymktext() in tokenOf(SYMBOL, toId, yypos, yytext) end | 455 => let val yytext=yymktext() in tokenOf(LONGID, toLongId, yypos, yytext) end | 458 => ( nesting := 1 ; YYBEGIN COMMENT ; continue() ) | 461 => ( nesting := !nesting+1 ; continue() ) | 464 => ( nesting := !nesting-1 ; if !nesting = 0 then YYBEGIN INITIAL else () ; continue() ) | 466 => ( continue() ) | 468 => ( continue() ) | 470 => let val yytext=yymktext() in error(yypos, yytext, "invalid string") end | 472 => let val yytext=yymktext() in invalid(yypos, yytext) end | 51 => let val yytext=yymktext() in token(ABSTYPE, yypos, yytext) end | 55 => let val yytext=yymktext() in token(AND, yypos, yytext) end | 6 => let val yytext=yymktext() in token(LPAR, yypos, yytext) end | 63 => let val yytext=yymktext() in token(ANDALSO, yypos, yytext) end | 66 => let val yytext=yymktext() in token(AS, yypos, yytext) end | 71 => let val yytext=yymktext() in token(CASE, yypos, yytext) end | 8 => let val yytext=yymktext() in token(RPAR, yypos, yytext) end | 80 => let val yytext=yymktext() in token(DATATYPE, yypos, yytext) end | 83 => let val yytext=yymktext() in token(DO, yypos, yytext) end | 88 => let val yytext=yymktext() in token(ELSE, yypos, yytext) end | 92 => let val yytext=yymktext() in token(END, yypos, yytext) end | 99 => let val yytext=yymktext() in token(EQTYPE, yypos, yytext) end | _ => raise Internal.LexerError ) end ) val {fin,trans} = Vector.sub(Internal.tab, s) val NewAcceptingLeaves = fin::AcceptingLeaves in if l = !yybl then if trans = #trans(Vector.sub(Internal.tab,0)) then action(l,NewAcceptingLeaves ) else let val newchars= if !yydone then "" else yyinput 1024 in if (String.size newchars)=0 then (yydone := true; if (l=i0) then UserDeclarations.eof () else action(l,NewAcceptingLeaves)) else (if i0=l then yyb := newchars else yyb := String.substring(!yyb,i0,l-i0)^newchars; yygone := !yygone+i0; yybl := String.size (!yyb); scan (s,AcceptingLeaves,l-i0,0)) end else let val NewChar = Char.ord(CharVector.sub(!yyb,l)) val NewState = Char.ord(CharVector.sub(trans,NewChar)) in if NewState=0 then action(l,NewAcceptingLeaves) else scan(NewState,NewAcceptingLeaves,l+1,i0) end end (* val start= if String.substring(!yyb,!yybufpos-1,1)="\n" then !yybegin+1 else !yybegin *) in scan(!yybegin (* start *),nil,!yybufpos,!yybufpos) end end in lex end end (* stop of Lexer.lex.sml *) (* start of PARSE.sml *) signature PARSE = sig (* Import *) type source = Source.source type InfEnv = Infix.InfEnv type Program = GrammarProgram.Program (* Export *) val parse: InfEnv * source -> InfEnv * Program end (* stop of PARSE.sml *) (* start of Parse.sml *) structure Parse :> PARSE = struct (* Import *) type source = Source.source type InfEnv = Infix.InfEnv type Program = GrammarProgram.Program (* Build Yacc parser *) structure LrVals = LrValsFn(structure Token = LrParser.Token) structure Lexer = LexerFn (structure Tokens = LrVals.Tokens) structure Parser = Join (structure LrParser = LrParser structure ParserData = LrVals.ParserData structure Lex = Lexer) (* The actual parsing function *) fun parse(J, source) = let val yyread = ref false fun yyinput _ = if !yyread then "" else ( yyread := true; source ) val lexer = Parser.makeLexer yyinput fun onError(s, pos1, pos2) = Error.error((pos1,pos2), s) val ((program,J'), lexer') = Parser.parse(0, lexer, onError, J) in (J',program) end end (* stop of Parse.sml *) (* start of SML.sml *) (* * Standard ML implementation main structure *) signature SML = sig val parseString: string -> unit (* Parse only *) val elabString: string -> unit (* Parse and elaborate *) val evalString: string -> unit (* Parse and evaluate *) val execString: string -> unit (* Parse, elaborate, and evaluate *) val parseFile: string -> unit val elabFile: string -> unit val evalFile: string -> unit val execFile: string -> unit val parseFiles: string -> unit val elabFiles: string -> unit val evalFiles: string -> unit val execFiles: string -> unit val parseSession: unit -> unit val elabSession: unit -> unit val evalSession: unit -> unit val execSession: unit -> unit end (* stop of SML.sml *) (* start of Sml.sml *) (* * Standard ML implementation main structure *) structure Sml :> SML = struct (* Initial arguments *) val J0 = InitialInfixEnv.J0 val B_STAT0 = InitialStaticBasis.B0 val B_DYN0 = InitialDynamicBasis.B0 val B0 = (B_STAT0, B_DYN0) val s0 = InitialDynamicBasis.s (* Parsing only *) fun parse J source = let val (J',program) = Parse.parse(J, source) val _ = TextIO.output(TextIO.stdOut, "OK\n") in J' end val parseInitialArg = J0 val parseInitial = parse parseInitialArg (* Parsing and elaboration *) val elabInitialArg = (J0, B_STAT0) fun elab (J, B_STAT) source = let val (J',program) = Parse.parse(J, source) val B_STAT' = Program.elabProgram(B_STAT, program) in (J', B_STAT') end (* Parsing and evaluation *) val evalInitialArg = (J0, B_DYN0, s0) fun eval (J, B_DYN, s) source = let val (J',program) = Parse.parse(J, source) val s' = ref s val B_DYN' = Program.evalProgram(s', B_DYN, program) in (J', B_DYN', !s') end (* Parsing, elaboration, and evaluation *) val execInitialArg = (J0, B0, s0) fun exec (J, B, s) source = let val (J',program) = Parse.parse(J, source) val s' = ref s val B' = Program.execProgram(s', B, program) in (J', B', !s' ) end (* Processing of strings *) fun processString (process, arg) source = ignore(process arg source) handle Error.Error _ => () (* Syntax error *) val parseString = processString(parse, parseInitialArg) val elabString = processString(elab, elabInitialArg) val evalString = processString(eval, evalInitialArg) val execString = processString(exec, execInitialArg) (* Processing of files *) fun processFile (process, arg) name = let val file = TextIO.openIn name val source = TextIO.inputAll file val _ = TextIO.closeIn file in ignore(process arg source) handle Error.Error _ => () (* Syntax error *) end val parseFile = processFile(parse, parseInitialArg) val elabFile = processFile(elab, elabInitialArg) val evalFile = processFile(eval, evalInitialArg) val execFile = processFile(exec, execInitialArg) (* Processing several files mentioned in a list file *) fun processFiles (process, initialArg) name = let val file = TextIO.openIn name val content = TextIO.inputAll file val _ = TextIO.closeIn file val _ = Stamp.reset() fun loop(arg, [] ) = () | loop(arg, "" ::names) = loop(arg, names) | loop(arg, name::names) = let val file = TextIO.openIn name val source = TextIO.inputAll file val _ = TextIO.closeIn file val _ = TextIO.output(TextIO.stdOut, ">> File \"" ^ name ^ "\":\n") in loop(process arg source, names) handle Error.Error _ => (* Syntax error *) loop(arg, names) end in loop(initialArg, String.fields Char.isSpace content) end val parseFiles = processFiles(parse, parseInitialArg) val elabFiles = processFiles(elab, elabInitialArg) val evalFiles = processFiles(eval, evalInitialArg) val execFiles = processFiles(exec, execInitialArg) (* Session *) fun processSession(process, initialArg) = let val ins = !ins fun loop arg = let val _ = TextIO.output(TextIO.stdOut, "SML> ") val _ = TextIO.flushOut TextIO.stdOut in case TextIO.inputLine ins of NONE => () | SOME source => loop(process arg source) handle Error.Error _ => (* Syntax error *) loop arg end in loop initialArg end fun parseSession() = processSession(parse, parseInitialArg) fun elabSession() = processSession(elab, elabInitialArg) fun evalSession() = processSession(eval, evalInitialArg) fun execSession() = processSession(exec, execInitialArg) end (* stop of Sml.sml *) (* start of Main.sml *) (* * Standard ML implementation stand-alone *) structure Main = struct val version = "0.5" fun usage() = ( TextIO.output(TextIO.stdErr, "Usage: hamlet -\n\ \where is one of:\n\ \ h help: print this message\n\ \ p parse mode: just parse input\n\ \ l elab mode: parse and elaborate\n\ \ v eval mode: parse and evaluate (no type checking!)\n\ \ x exec mode: parse, elaborate, and evaluate\n" ) ; TextIO.flushOut TextIO.stdErr ; OS.Process.failure ) fun start process = ( TextIO.output(TextIO.stdOut, "HaMLet " ^ version ^ " - to be or not to be SML\n") ; TextIO.flushOut TextIO.stdOut ; process() ; TextIO.output(TextIO.stdOut, "\n") ; TextIO.flushOut TextIO.stdOut ; OS.Process.success ) fun main' ["-h"] = ( usage() ; OS.Process.success ) | main' ["-p"] = start Sml.parseSession | main' ["-l"] = start Sml.elabSession | main' ["-v"] = start Sml.evalSession | main' ["-x"] = start Sml.execSession | main' _ = usage() fun main() = OS.Process.exit(main'(CommandLine.arguments())) end (* stop of Main.sml *) (* Here begins the simple test case. *) structure Main = struct fun doit size = let open TextIO fun loop n = if n < 0 then () else let val _ = ins := openIn "DATA/hamlet-input.sml" val _ = Main.main' ["-x"] in loop (n - 1) end in loop size end end mlton-20100608/benchmark/tests/imp-for.sml0000644000076600000240000000133511404435630016743 0ustar mtfstaff fun for (start, stop, f) = let val i = ref start fun loop () = if !i >= stop then () else (f (!i) ; i := !i + 1 ; loop ()) in loop () end structure Main = struct fun doit () = let val x = ref 0 val _ = for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => for (0, 10, fn _ => x := !x + 1))))))) in if (!x) <> 10000000 then raise Fail "bug" else () end val doit = fn size => for (0, size, fn _ => doit ()) end mlton-20100608/benchmark/tests/knuth-bendix.sml0000644000076600000240000004436011404435630017777 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* knuth-bendix.sml *) signature KB = sig datatype term = Var of int | Term of string * term list; datatype ordering = Greater | Equal | NotGE; val rpo: (string -> string -> ordering) -> ((term * term -> ordering) -> term * term -> ordering) -> term * term -> ordering; val lex_ext: (term * term -> ordering) -> term * term -> ordering; val kb_complete: (term * term -> bool) -> (int * (int * (term * term))) list -> ('a * ('b * (term * term))) list -> unit; include BMARK end; structure Main : KB = struct val name = "Knuth-Bendix" fun length l = let fun j(k, nil) = k | j(k, a::x) = j(k+1,x) in j(0,l) end fun op @ (nil, l) = l | op @ (a::r, l) = a :: (r@l) fun rev l = let fun f (nil, h) = h | f (a::r, h) = f(r, a::h) in f(l,nil) end fun app f = let fun app_rec [] = () | app_rec (a::L) = (f a; app_rec L) in app_rec end fun map f = let fun map_rec [] = [] | map_rec (a::L) = f a :: map_rec L in map_rec end (******* Quelques definitions du prelude CAML **************) exception Failure of string; fun failwith s = raise(Failure s) fun fst (x,y) = x and snd (x,y) = y fun it_list f = let fun it_rec a [] = a | it_rec a (b::L) = it_rec (f a b) L in it_rec end fun it_list2 f = let fun it_rec a [] [] = a | it_rec a (a1::L1) (a2::L2) = it_rec (f a (a1,a2)) L1 L2 | it_rec _ _ _ = failwith "it_list2" in it_rec end fun exists p = let fun exists_rec [] = false | exists_rec (a::L) = (p a) orelse (exists_rec L) in exists_rec end fun for_all p = let fun for_all_rec [] = true | for_all_rec (a::L) = (p a) andalso (for_all_rec L) in for_all_rec end fun rev_append [] L = L | rev_append (x::L1) L2 = rev_append L1 (x::L2) fun try_find f = let fun try_find_rec [] = failwith "try_find" | try_find_rec (a::L) = (f a) handle Failure _ => try_find_rec L in try_find_rec end fun partition p = let fun part_rec [] = ([],[]) | part_rec (a::L) = let val (pos,neg) = part_rec L in if p a then ((a::pos), neg) else (pos, (a::neg)) end in part_rec end (* 3- Les ensembles et les listes d'association *) fun mem a = let fun mem_rec [] = false | mem_rec (b::L) = (a=b) orelse mem_rec L in mem_rec end fun union L1 L2 = let fun union_rec [] = L2 | union_rec (a::L) = if mem a L2 then union_rec L else a :: union_rec L in union_rec L1 end fun mem_assoc a = let fun mem_rec [] = false | mem_rec ((b,_)::L) = (a=b) orelse mem_rec L in mem_rec end fun assoc a = let fun assoc_rec [] = failwith "find" | assoc_rec ((b,d)::L) = if a=b then d else assoc_rec L in assoc_rec end (* 4- Les sorties *) fun print s = TextIO.output(TextIO.stdOut, s) fun print _ = () val print_string = print val print_num = print o Int.toString fun print_newline () = print "\n"; fun message s = (print s; print "\n"); (* 5- Les ensembles *) fun union L1 = let fun union_rec [] = L1 | union_rec (a::L) = if mem a L1 then union_rec L else a :: union_rec L in union_rec end (****************** Term manipulations *****************) datatype term = Var of int | Term of string * term list fun vars (Var n) = [n] | vars (Term(_,L)) = vars_of_list L and vars_of_list [] = [] | vars_of_list (t::r) = union (vars t) (vars_of_list r) fun substitute subst = let fun subst_rec (Term(oper,sons)) = Term(oper, map subst_rec sons) | subst_rec (t as (Var n)) = (assoc n subst) handle Failure _ => t in subst_rec end fun change f = let fun change_rec (h::t) n = if n=1 then f h :: t else h :: change_rec t (n-1) | change_rec _ _ = failwith "change" in change_rec end (* Term replacement replace M u N => M[u<-N] *) fun replace M u N = let fun reprec (_, []) = N | reprec (Term(oper,sons), (n::u)) = Term(oper, change (fn P => reprec(P,u)) sons n) | reprec _ = failwith "replace" in reprec(M,u) end (* matching = - : (term -> term -> subst) *) fun matching term1 term2 = let fun match_rec subst (Var v, M) = if mem_assoc v subst then if M = assoc v subst then subst else failwith "matching" else (v,M) :: subst | match_rec subst (Term(op1,sons1), Term(op2,sons2)) = if op1 = op2 then it_list2 match_rec subst sons1 sons2 else failwith "matching" | match_rec _ _ = failwith "matching" in match_rec [] (term1,term2) end (* A naive unification algorithm *) fun compsubst subst1 subst2 = (map (fn (v,t) => (v, substitute subst1 t)) subst2) @ subst1 fun occurs n = let fun occur_rec (Var m) = (m=n) | occur_rec (Term(_,sons)) = exists occur_rec sons in occur_rec end fun unify ((term1 as (Var n1)), term2) = if term1 = term2 then [] else if occurs n1 term2 then failwith "unify" else [(n1,term2)] | unify (term1, Var n2) = if occurs n2 term1 then failwith "unify" else [(n2,term1)] | unify (Term(op1,sons1), Term(op2,sons2)) = if op1 = op2 then it_list2 (fn s => fn (t1,t2) => compsubst (unify(substitute s t1, substitute s t2)) s) [] sons1 sons2 else failwith "unify" (* We need to print terms with variables independently from input terms obtained by parsing. We give arbitrary names v1,v2,... to their variables. *) val INFIXES = ["+","*"]; fun pretty_term (Var n) = (print_string "v"; print_num n) | pretty_term (Term (oper,sons)) = if mem oper INFIXES then case sons of [s1,s2] => (pretty_close s1; print_string oper; pretty_close s2) | _ => failwith "pretty_term : infix arity <> 2" else (print_string oper; case sons of [] => () | t::lt =>(print_string "("; pretty_term t; app (fn t => (print_string ","; pretty_term t)) lt; print_string ")")) and pretty_close (M as Term(oper, _)) = if mem oper INFIXES then (print_string "("; pretty_term M; print_string ")") else pretty_term M | pretty_close M = pretty_term M (****************** Equation manipulations *************) (* standardizes an equation so its variables are 1,2,... *) fun mk_rule M N = let val all_vars = union (vars M) (vars N); val (k,subst) = it_list (fn (i,sigma) => fn v => (i+1,(v,Var(i))::sigma)) (1,[]) all_vars in (k-1, (substitute subst M, substitute subst N)) end (* checks that rules are numbered in sequence and returns their number *) fun check_rules l = it_list (fn n => fn (k,_) => if k=n+1 then k else failwith "Rule numbers not in sequence") 0 l fun pretty_rule (k,(n,(M,N))) = (print_num k; print_string " : "; pretty_term M; print_string " = "; pretty_term N; print_newline()) fun pretty_rules l = app pretty_rule l (****************** Rewriting **************************) (* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. With sigma = matching L M, we define the image of M by eq as sigma(R) *) fun reduce L M = substitute (matching L M) (* A more efficient version of can (rewrite1 (L,R)) for R arbitrary *) fun reducible L = let fun redrec M = (matching L M; true) handle Failure _ => case M of Term(_,sons) => exists redrec sons | _ => false in redrec end (* mreduce : rules -> term -> term *) fun mreduce rules M = let fun redex (_,(_,(L,R))) = reduce L M R in try_find redex rules end (* One step of rewriting in leftmost-outermost strategy, with multiple rules *) (* fails if no redex is found *) (* mrewrite1 : rules -> term -> term *) fun mrewrite1 rules = let fun rewrec M = (mreduce rules M) handle Failure _ => let fun tryrec [] = failwith "mrewrite1" | tryrec (son::rest) = (rewrec son :: rest) handle Failure _ => son :: tryrec rest in case M of Term(f, sons) => Term(f, tryrec sons) | _ => failwith "mrewrite1" end in rewrec end (* Iterating rewrite1. Returns a normal form. May loop forever *) (* mrewrite_all : rules -> term -> term *) fun mrewrite_all rules M = let fun rew_loop M = rew_loop(mrewrite1 rules M) handle Failure _ => M in rew_loop M end (* pretty_term (mrewrite_all Group_rules M where M,_=<>);; ==> A*U *) (************************ Recursive Path Ordering ****************************) datatype ordering = Greater | Equal | NotGE; fun ge_ord order pair = case order pair of NotGE => false | _ => true and gt_ord order pair = case order pair of Greater => true | _ => false and eq_ord order pair = case order pair of Equal => true | _ => false fun rem_eq equiv = let fun remrec x [] = failwith "rem_eq" | remrec x (y::l) = if equiv (x,y) then l else y :: remrec x l in remrec end fun diff_eq equiv (x,y) = let fun diffrec (p as ([],_)) = p | diffrec ((h::t), y) = diffrec (t,rem_eq equiv h y) handle Failure _ => let val (x',y') = diffrec (t,y) in (h::x',y') end in if length x > length y then diffrec(y,x) else diffrec(x,y) end (* multiset extension of order *) fun mult_ext order (Term(_,sons1), Term(_,sons2)) = (case diff_eq (eq_ord order) (sons1,sons2) of ([],[]) => Equal | (l1,l2) => if for_all (fn N => exists (fn M => order (M,N) = Greater) l1) l2 then Greater else NotGE) | mult_ext order (_, _) = failwith "mult_ext" (* lexicographic extension of order *) fun lex_ext order ((M as Term(_,sons1)), (N as Term(_,sons2))) = let fun lexrec ([] , []) = Equal | lexrec ([] , _ ) = NotGE | lexrec ( _ , []) = Greater | lexrec (x1::l1, x2::l2) = case order (x1,x2) of Greater => if for_all (fn N' => gt_ord order (M,N')) l2 then Greater else NotGE | Equal => lexrec (l1,l2) | NotGE => if exists (fn M' => ge_ord order (M',N)) l1 then Greater else NotGE in lexrec (sons1, sons2) end | lex_ext order _ = failwith "lex_ext" (* recursive path ordering *) fun rpo op_order ext = let fun rporec (M,N) = if M=N then Equal else case M of Var m => NotGE | Term(op1,sons1) => case N of Var n => if occurs n M then Greater else NotGE | Term(op2,sons2) => case (op_order op1 op2) of Greater => if for_all (fn N' => gt_ord rporec (M,N')) sons2 then Greater else NotGE | Equal => ext rporec (M,N) | NotGE => if exists (fn M' => ge_ord rporec (M',N)) sons1 then Greater else NotGE in rporec end (****************** Critical pairs *********************) (* All (u,sig) such that N/u (&var) unifies with M, with principal unifier sig *) fun super M = let fun suprec (N as Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (suprec son), n+1); val insides = fst (it_list collate ([],1) sons) in ([], unify(M,N)) :: insides handle Failure _ => insides end | suprec _ = [] in suprec end (* Ex : let (M,_) = <> and (N,_) = <> in super M N;; ==> [[1],[2,Term ("B",[])]; x <- B [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B *) (* All (u,sigma), u&[], such that N/u unifies with M *) (* super_strict : term -> term -> (num list & subst) list *) fun super_strict M (Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (super M son), n+1) in fst (it_list collate ([],1) sons) end | super_strict _ _ = [] (* Critical pairs of L1=R1 with L2=R2 *) (* critical_pairs : term_pair -> term_pair -> term_pair list *) fun critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super L1 L2) end (* Strict critical pairs of L1=R1 with L2=R2 *) (* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) fun strict_critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super_strict L1 L2) end (* All critical pairs of eq1 with eq2 *) fun mutual_critical_pairs eq1 eq2 = (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) (* Renaming of variables *) fun rename n (t1,t2) = let fun ren_rec (Var k) = Var(k+n) | ren_rec (Term(oper,sons)) = Term(oper, map ren_rec sons) in (ren_rec t1, ren_rec t2) end (************************ Completion ******************************) fun deletion_message (k,_) = (print_string "Rule ";print_num k; message " deleted") (* Generate failure message *) fun non_orientable (M,N) = (pretty_term M; print_string " = "; pretty_term N; print_newline()) (* Improved Knuth-Bendix completion procedure *) (* kb_completion : (term_pair -> bool) -> num -> rules -> term_pair list -> (num & num) -> term_pair list -> rules *) fun kb_completion greater = let fun kbrec n rules = let val normal_form = mrewrite_all rules; fun get_rule k = assoc k rules; fun process failures = let fun processf (k,l) = let fun processkl [] = if k rules (* successful completion *) | _ => (message "Non-orientable equations :"; app non_orientable failures; failwith "kb_completion")) | processkl ((M,N)::eqs) = let val M' = normal_form M; val N' = normal_form N; fun enter_rule(left,right) = let val new_rule = (n+1, mk_rule left right) in (pretty_rule new_rule; let fun left_reducible (_,(_,(L,_))) = reducible left L; val (redl,irredl) = partition left_reducible rules in (app deletion_message redl; let fun right_reduce (m,(_,(L,R))) = (m,mk_rule L (mrewrite_all (new_rule::rules) R)); val irreds = map right_reduce irredl; val eqs' = map (fn (_,(_,pair)) => pair) redl in kbrec (n+1) (new_rule::irreds) [] (k,l) (eqs @ eqs' @ failures) end) end) end in if M'=N' then processkl eqs else if greater(M',N') then enter_rule(M',N') else if greater(N',M') then enter_rule(N',M') else process ((M',N')::failures) (k,l) eqs end in processkl end and next_criticals (k,l) = (let val (v,el) = get_rule l in if k=l then processf (k,l) (strict_critical_pairs el (rename v el)) else (let val (_,ek) = get_rule k in processf (k,l) (mutual_critical_pairs el (rename v ek)) end handle Failure "find" (*rule k deleted*) => next_criticals (k+1,l)) end handle Failure "find" (*rule l deleted*) => next_criticals (1,l+1)) in processf end in process end in kbrec end fun kb_complete greater complete_rules rules = let val n = check_rules complete_rules; val eqs = map (fn (_,(_,pair)) => pair) rules; val completed_rules = kb_completion greater n complete_rules [] (n,n) eqs in (message "Canonical set found :"; pretty_rules (rev completed_rules); ()) end val Group_rules = [ (1, (1, (Term("*", [Term("U",[]), Var 1]), Var 1))), (2, (1, (Term("*", [Term("I",[Var 1]), Var 1]), Term("U",[])))), (3, (3, (Term("*", [Term("*", [Var 1, Var 2]), Var 3]), Term("*", [Var 1, Term("*", [Var 2, Var 3])]))))]; val Geom_rules = [ (1,(1,(Term ("*",[(Term ("U",[])), (Var 1)]),(Var 1)))), (2,(1,(Term ("*",[(Term ("I",[(Var 1)])), (Var 1)]),(Term ("U",[]))))), (3,(3,(Term ("*",[(Term ("*",[(Var 1), (Var 2)])), (Var 3)]), (Term ("*",[(Var 1), (Term ("*",[(Var 2), (Var 3)]))]))))), (4,(0,(Term ("*",[(Term ("A",[])), (Term ("B",[]))]), (Term ("*",[(Term ("B",[])), (Term ("A",[]))]))))), (5,(0,(Term ("*",[(Term ("C",[])), (Term ("C",[]))]),(Term ("U",[]))))), (6,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("A",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("I",[(Term ("A",[]))]))))), (7,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("B",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("B",[]))))) ]; fun Group_rank "U" = 0 | Group_rank "*" = 1 | Group_rank "I" = 2 | Group_rank "B" = 3 | Group_rank "C" = 4 | Group_rank "A" = 5 fun Group_precedence op1 op2 = let val r1 = Group_rank op1; val r2 = Group_rank op2 in if r1 = r2 then Equal else if r1 > r2 then Greater else NotGE end val Group_order = rpo Group_precedence lex_ext fun greater pair = (case Group_order pair of Greater => true | _ => false) fun doit() = kb_complete greater [] Geom_rules val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end fun testit _ = () end (* Main *) mlton-20100608/benchmark/tests/lexgen.sml0000644000076600000240000015121211404435630016654 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* Lexical analyzer generator for Standard ML. Version 1.6.0, October 1994 Copyright (c) 1989-1992 by Andrew W. Appel, David R. Tarditi, James S. Mattson This software comes with ABSOLUTELY NO WARRANTY. This software is subject only to the PRINCETON STANDARD ML SOFTWARE LIBRARY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER, (in the file "COPYRIGHT", distributed with this software). You may copy and distribute this software; see the COPYRIGHT NOTICE for details and restrictions. Changes: 07/25/89 (drt): added %header declaration, code to place user declarations at same level as makeLexer, etc. This is needed for the parser generator. /10/89 (appel): added %arg declaration (see lexgen.doc). /04/90 (drt): fixed following bug: couldn't use the lexer after an error occurred -- NextTok and inquote weren't being reset 10/22/91 (drt): disabled use of lookahead 10/23/92 (drt): disabled use of $ operator (which involves lookahead), added handlers for dictionary lookup routine 11/02/92 (drt): changed handler for exception Reject in generated lexer to Internal.Reject 02/01/94 (appel): Moved the exception handler for Reject in such a way as to allow tail-recursion (improves performance wonderfully!). 02/01/94 (appel): Fixed a bug in parsing of state names. 05/19/94 (Mikael Pettersson, mpe@ida.liu.se): Transition tables are usually represented as strings, but when the range is too large, int vectors constructed by code like "Vector.vector[1,2,3,...]" are used instead. The problem with this isn't that the vector itself takes a lot of space, but that the code generated by SML/NJ to construct the intermediate list at run-time is *HUGE*. My fix is to encode an int vector as a string literal (using two bytes per int) and emit code to decode the string to a vector at run-time. SML/NJ compiles string literals into substrings in the code, so this uses much less space. 06/02/94 (jhr): Modified export-lex.sml to conform to new installation scheme. Also removed tab characters from string literals. 10/05/94 (jhr): Changed generator to produce code that uses the new basis style strings and characters. 10/06/94 (jhr) Modified code to compile under new basis style strings and characters. 02/08/95 (jhr) Modified to use new List module interface. 05/18/95 (jhr) changed Vector.vector to Vector.fromList * * $Log: lexgen.sml,v $ * Revision 1.6 1996/10/03 14:57:30 jhr * Qualified use of Int.quot, since it is no longer available at top-level; improved * the code that prints the tables. * * Revision 1.5 1996/09/16 12:25:14 george * here is a bug in ml-lex (109.17) when using the %count flag. The yylineno * variable should get reinitialized to zero on each call to makeLexer, but * instead is globally allocated and never reset. * * Revision 1.4 1996/08/13 13:50:36 george * Fixed bugs in counting lines (from jhr) * * Revision 1.3 1996/07/25 20:38:52 jhr * Fixed bug in ungetch that caused Subscript exceptions. * * Revision 1.2 1996/02/26 15:02:27 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:15 george * Version 109 * *) (* Subject: lookahead in sml-lex Reply-to: david.tarditi@CS.CMU.EDU Date: Mon, 21 Oct 91 14:13:26 -0400 There is a serious bug in the implementation of lookahead, as done in sml-lex, and described in Aho, Sethi, and Ullman, p. 134 "Implementing the Lookahead Operator" We have disallowed the use of lookahead for now because of this bug. As a counter-example to the implementation described in ASU, consider the following specification with the input string "aba" (this example is taken from a comp.compilers message from Dec. 1989, I think): type lexresult=unit val linenum = ref 1 fun error x = TextIO.output(TextIO.stdErr, x ^ "\n") val eof = fn () => () %% %structure Lex %% (a|ab)/ba => (print yytext; print "\n"; ()); The ASU proposal works as follows. Suppose that we are using NFA's to represent our regular expressions. Then to build an NFA for e1 / e2, we build an NFA n1 for e1 and an NFA n2 for e2, and add an epsilon transition from e1 to e2. When lexing, when we encounter the end state of e1e2, we take as the end of the string the position in the string that was the last occurrence of the state of the NFA having a transition on the epsilon introduced for /. Using the example we have above, we'll have an NFA with the following states: 1 -- a --> 2 -- b --> 3 | | | epsilon | epsilon | | |------------> 4 -- b --> 5 -- a --> 6 On our example, we get the following list of transitions: a : 2, 4 (make an epsilon transition from 2 to 4) ab : 3, 4, 5 (make an epsilon transition from 3 to 4) aba : 6 If we chose the last state in which we made an epsilon transition, we'll chose the transition from 3 to 4, and end up with "ab" as our token, when we should have "a" as our token. *) functor RedBlack(B : sig type key val > : key*key->bool end): sig type tree type key val empty : tree val insert : key * tree -> tree val lookup : key * tree -> key exception notfound of key end = struct open B datatype color = RED | BLACK datatype tree = empty | tree of key * color * tree * tree exception notfound of key fun insert (key,t) = let fun f empty = tree(key,RED,empty,empty) | f (tree(k,BLACK,l,r)) = if key>k then case f r of r as tree(rk,RED, rl as tree(rlk,RED,rll,rlr),rr) => (case l of tree(lk,RED,ll,lr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(rlk,BLACK,tree(k,RED,l,rll), tree(rk,RED,rlr,rr))) | r as tree(rk,RED,rl, rr as tree(rrk,RED,rrl,rrr)) => (case l of tree(lk,RED,ll,lr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(rk,BLACK,tree(k,RED,l,rl),rr)) | r => tree(k,BLACK,l,r) else if k>key then case f l of l as tree(lk,RED,ll, lr as tree(lrk,RED,lrl,lrr)) => (case r of tree(rk,RED,rl,rr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(lrk,BLACK,tree(lk,RED,ll,lrl), tree(k,RED,lrr,r))) | l as tree(lk,RED, ll as tree(llk,RED,lll,llr), lr) => (case r of tree(rk,RED,rl,rr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(lk,BLACK,ll,tree(k,RED,lr,r))) | l => tree(k,BLACK,l,r) else tree(key,BLACK,l,r) | f (tree(k,RED,l,r)) = if key>k then tree(k,RED,l, f r) else if k>key then tree(k,RED, f l, r) else tree(key,RED,l,r) in case f t of tree(k,RED, l as tree(_,RED,_,_), r) => tree(k,BLACK,l,r) | tree(k,RED, l, r as tree(_,RED,_,_)) => tree(k,BLACK,l,r) | t => t end fun lookup (key,t) = let fun look empty = raise (notfound key) | look (tree(k,_,l,r)) = if k>key then look l else if key>k then look r else k in look t end end signature LEXGEN = sig val lexGen: string -> unit end structure LexGen: LEXGEN = struct open Array List infix 9 sub datatype token = CHARS of bool array | QMARK | STAR | PLUS | BAR | LP | RP | CARAT | DOLLAR | SLASH | STATE of string list | REPS of int * int | ID of string | ACTION of string | BOF | EOF | ASSIGN | SEMI | ARROW | LEXMARK | LEXSTATES | COUNT | REJECT | FULLCHARSET | STRUCT | HEADER | ARG datatype exp = EPS | CLASS of bool array * int | CLOSURE of exp | ALT of exp * exp | CAT of exp * exp | TRAIL of int | END of int (* flags describing input Lex spec. - unnecessary code is omitted *) (* if possible *) val CharFormat = ref false; val UsesTrailingContext = ref false; val UsesPrevNewLine = ref false; (* flags for various bells & whistles that Lex has. These slow the lexer down and should be omitted from production lexers (if you really want speed) *) val CountNewLines = ref false; val HaveReject = ref false; (* Can increase size of character set *) val CharSetSize = ref 129; (* Can name structure or declare header code *) val StrName = ref "Mlex" val HeaderCode = ref "" val HeaderDecl = ref false val ArgCode = ref (NONE: string option) val StrDecl = ref false val ResetFlags = fn () => (CountNewLines := false; HaveReject := false; UsesTrailingContext := false; CharSetSize := 129; StrName := "Mlex"; HeaderCode := ""; HeaderDecl:= false; ArgCode := NONE; StrDecl := false) val LexOut = ref(TextIO.stdOut) fun say x = TextIO.output(!LexOut, x) (* Union: merge two sorted lists of integers *) fun union(a,b) = let val rec merge = fn (nil,nil,z) => z | (nil,el::more,z) => merge(nil,more,el::z) | (el::more,nil,z) => merge(more,nil,el::z) | (x::morex,y::morey,z) => if (x:int)=(y:int) then merge(morex,morey,x::z) else if x>y then merge(morex,y::morey,x::z) else merge(x::morex,morey,y::z) in merge(rev a,rev b,nil) end (* Nullable: compute if a important expression parse tree node is nullable *) val rec nullable = fn EPS => true | CLASS(_) => false | CLOSURE(_) => true | ALT(n1,n2) => nullable(n1) orelse nullable(n2) | CAT(n1,n2) => nullable(n1) andalso nullable(n2) | TRAIL(_) => true | END(_) => false (* FIRSTPOS: firstpos function for parse tree expressions *) and firstpos = fn EPS => nil | CLASS(_,i) => [i] | CLOSURE(n) => firstpos(n) | ALT(n1,n2) => union(firstpos(n1),firstpos(n2)) | CAT(n1,n2) => if nullable(n1) then union(firstpos(n1),firstpos(n2)) else firstpos(n1) | TRAIL(i) => [i] | END(i) => [i] (* LASTPOS: Lastpos function for parse tree expressions *) and lastpos = fn EPS => nil | CLASS(_,i) => [i] | CLOSURE(n) => lastpos(n) | ALT(n1,n2) => union(lastpos(n1),lastpos(n2)) | CAT(n1,n2) => if nullable(n2) then union(lastpos(n1),lastpos(n2)) else lastpos(n2) | TRAIL(i) => [i] | END(i) => [i] ; (* ++: Increment an integer reference *) fun ++(x) : int = (x := !x + 1; !x); structure Dict = struct type 'a relation = 'a * 'a -> bool abstype ('b,'a) dictionary = DATA of {Table : ('b * 'a) list, Leq : 'b * 'b -> bool } with exception LOOKUP fun create Leqfunc = DATA { Table = nil, Leq = Leqfunc } fun lookup (DATA { Table = entrylist, Leq = leq }) key = let fun search [] = raise LOOKUP | search((k,item)::entries) = if leq(key,k) then if leq(k,key) then item else raise LOOKUP else search entries in search entrylist end fun enter (DATA { Table = entrylist, Leq = leq }) (newentry as (key : 'b,item :'a)) : ('b,'a) dictionary = let val gt = fn a => fn b => not (leq(a,b)) val eq = fn k => fn k' => (leq(k,k')) andalso (leq(k',k)) fun update nil = [ newentry ] | update ((entry as (k,_))::entries) = if (eq key k) then newentry::entries else if gt k key then newentry::(entry::entries) else entry::(update entries) in DATA { Table = update entrylist, Leq = leq } end fun listofdict (DATA { Table = entrylist,Leq = leq}) = let fun f (nil,r) = rev r | f (a::b,r) = f (b,a::r) in f(entrylist,nil) end end end (* structure Dict *) open Dict; (* INPUT.ML : Input w/ one character push back capability *) val LineNum = ref 1; abstype ibuf = BUF of TextIO.instream * {b : string ref, p : int ref} with fun make_ibuf(s) = BUF (s, {b=ref"", p = ref 0}) fun close_ibuf (BUF (s,_)) = TextIO.closeIn(s) exception eof fun getch (a as (BUF(s,{b,p}))) = if (!p = (size (!b))) then (b := TextIO.inputN(s, 1024); p := 0; if (size (!b))=0 then raise eof else getch a) else (let val ch = String.sub(!b,!p) in (if ch = #"\n" then LineNum := !LineNum + 1 else (); p := !p + 1; ch) end) fun ungetch(BUF(s,{b,p})) = ( p := !p - 1; if String.sub(!b,!p) = #"\n" then LineNum := !LineNum - 1 else ()) end; exception Error fun prErr x = ( TextIO.output (TextIO.stdErr, String.concat [ "ml-lex: error, line ", (Int.toString (!LineNum)), ": ", x, "\n" ]); raise Error) fun prSynErr x = ( TextIO.output (TextIO.stdErr, String.concat [ "ml-lex: syntax error, line ", (Int.toString (!LineNum)), ": ", x, "\n" ]); raise Error) exception SyntaxError; (* error in user's input file *) exception LexError; (* unexpected error in lexer *) val LexBuf = ref(make_ibuf(TextIO.stdIn)); val LexState = ref 0; val NextTok = ref BOF; val inquote = ref false; fun AdvanceTok () : unit = let fun isLetter c = ((c >= #"a") andalso (c <= #"z")) orelse ((c >= #"A") andalso (c <= #"Z")) fun isDigit c = (c >= #"0") andalso (c <= #"9") (* check for valid (non-leading) identifier character (added by JHR) *) fun isIdentChr c = ((isLetter c) orelse (isDigit c) orelse (c = #"_") orelse (c = #"'")) fun atoi s = let fun num (c::r, n) = if isDigit c then num (r, 10*n + (Char.ord c - Char.ord #"0")) else n | num ([], n) = n in num (explode s, 0) end fun skipws () = (case nextch() of #" " => skipws() | #"\t" => skipws() | #"\n" => skipws() | x => x (* end case *)) and nextch () = getch(!LexBuf) and escaped () = (case nextch() of #"b" => #"\008" | #"n" => #"\n" | #"t" => #"\t" | #"h" => #"\128" | x => let fun err t = prErr("illegal ascii escape '"^(implode(rev t))^"'") fun cvt c = (Char.ord c - Char.ord #"0") fun f (n, c, t) = if c=3 then if n >= (!CharSetSize) then err t else Char.chr n else let val ch=nextch() in if isDigit ch then f(n*10+(cvt ch), c+1, ch::t) else err t end in if isDigit x then f(cvt x, 1, [x]) else x end (* end case *)) and onechar x = let val c = array(!CharSetSize, false) in update(c, Char.ord(x), true); CHARS(c) end in case !LexState of 0 => let val makeTok = fn () => case skipws() (* Lex % operators *) of #"%" => (case nextch() of #"%" => LEXMARK | a => let fun f s = let val a = nextch() in if isLetter a then f(a::s) else (ungetch(!LexBuf); implode(rev s)) end val command = f [a] in if command = "reject" then REJECT else if command = "count" then COUNT else if command = "full" then FULLCHARSET else if command = "s" then LEXSTATES else if command = "S" then LEXSTATES else if command = "structure" then STRUCT else if command = "header" then HEADER else if command = "arg" then ARG else prErr "unknown % operator " end ) (* semicolon (for end of LEXSTATES) *) | #";" => SEMI (* anything else *) | ch => if isLetter(ch) then let fun getID matched = let val x = nextch() (**** fix by JHR in if isLetter(x) orelse isDigit(x) orelse x = "_" orelse x = "'" ****) in if (isIdentChr x) then getID (x::matched) else (ungetch(!LexBuf); implode(rev matched)) end in ID(getID [ch]) end else (prSynErr ("bad character: " ^ String.str ch)) in NextTok := makeTok() end | 1 => let val rec makeTok = fn () => if !inquote then case nextch() of (* inside quoted string *) #"\\" => onechar(escaped()) | #"\"" => (inquote := false; makeTok()) | x => onechar(x) else case skipws() of (* single character operators *) #"?" => QMARK | #"*" => STAR | #"+" => PLUS | #"|" => BAR | #"(" => LP | #")" => RP | #"^" => CARAT | #"$" => DOLLAR | #"/" => SLASH | #";" => SEMI | #"." => let val c = array(!CharSetSize,true) in update(c,10,false); CHARS(c) end (* assign and arrow *) | #"=" => let val c = nextch() in if c = #">" then ARROW else (ungetch(!LexBuf); ASSIGN) end (* character set *) | #"[" => let val rec classch = fn () => let val x = skipws() in if x = #"\\" then escaped() else x end; val first = classch(); val flag = (first <> #"^"); val c = array(!CharSetSize,not flag); fun add NONE = () | add (SOME x) = update(c, Char.ord(x), flag) and range (x, y) = if x>y then (prErr "bad char. range") else let val i = ref(Char.ord(x)) and j = Char.ord(y) in while !i<=j do ( add (SOME(Char.chr(!i))); i := !i + 1) end and getClass last = (case classch() of #"]" => (add(last); c) | #"-" => (case last of NONE => getClass(SOME #"-") | (SOME last') => let val x = classch() in if x = #"]" then (add(last); add(SOME #"-"); c) else (range(last',x); getClass(NONE)) end (* end case *)) | x => (add(last); getClass(SOME x)) (* end case *)) in CHARS(getClass(if first = #"^" then NONE else SOME first)) end (* Start States specification *) | #"<" => let val rec get_state = fn (prev,matched) => case nextch() of #">" => matched::prev | #"," => get_state(matched::prev,"") | x => if isIdentChr(x) then get_state(prev,matched ^ String.str x) else (prSynErr "bad start state list") in STATE(get_state(nil,"")) end (* {id} or repititions *) | #"{" => let val ch = nextch() in if isLetter(ch) then let fun getID matched = (case nextch() of #"}" => matched | x => if (isIdentChr x) then getID(matched ^ String.str x) else (prErr "invalid char. class name") (* end case *)) in ID(getID(String.str ch)) end else if isDigit(ch) then let fun get_r (matched, r1) = (case nextch() of #"}" => let val n = atoi(matched) in if r1 = ~1 then (n,n) else (r1,n) end | #"," => if r1 = ~1 then get_r("",atoi(matched)) else (prErr "invalid repetitions spec.") | x => if isDigit(x) then get_r(matched ^ String.str x,r1) else (prErr "invalid char in repetitions spec") (* end case *)) in REPS(get_r(String.str ch,~1)) end else (prErr "bad repetitions spec") end (* Lex % operators *) | #"%" => if nextch() = #"%" then LEXMARK else (ungetch(!LexBuf); onechar (#"%")) (* backslash escape *) | #"\\" => onechar(escaped()) (* start quoted string *) | #"\"" => (inquote := true; makeTok()) (* anything else *) | ch => onechar(ch) in NextTok := makeTok() end | 2 => NextTok := (case skipws() of #"(" => let fun GetAct (lpct,x) = (case getch(!LexBuf) of #"(" => GetAct (lpct+1, #"("::x) | #")" => if lpct = 0 then (implode (rev x)) else GetAct(lpct-1, #")"::x) | y => GetAct(lpct,y::x) (* end case *)) in ACTION (GetAct (0,nil)) end | #";" => SEMI | c => (prSynErr ("invalid character " ^ String.str c))) | _ => raise LexError end handle eof => NextTok := EOF ; fun GetTok (_:unit) : token = let val t = !NextTok in AdvanceTok(); t end; val SymTab = ref (create String.<=) : (string,exp) dictionary ref fun GetExp () : exp = let val rec optional = fn e => ALT(EPS,e) and lookup' = fn name => lookup(!SymTab) name handle LOOKUP => prErr ("bad regular expression name: "^ name) and newline = fn () => let val c = array(!CharSetSize,false) in update(c,10,true); c end and endline = fn e => trail(e,CLASS(newline(),0)) and trail = fn (e1,e2) => CAT(CAT(e1,TRAIL(0)),e2) and closure1 = fn e => CAT(e,CLOSURE(e)) and repeat = fn (min,max,e) => let val rec rep = fn (0,0) => EPS | (0,1) => ALT(e,EPS) | (0,i) => CAT(rep(0,1),rep(0,i-1)) | (i,j) => CAT(e,rep(i-1,j-1)) in rep(min,max) end and exp0 = fn () => case GetTok() of CHARS(c) => exp1(CLASS(c,0)) | LP => let val e = exp0() in if !NextTok = RP then (AdvanceTok(); exp1(e)) else (prSynErr "missing '('") end | ID(name) => exp1(lookup' name) | _ => raise SyntaxError and exp1 = fn (e) => case !NextTok of SEMI => e | ARROW => e | EOF => e | LP => exp2(e,exp0()) | RP => e | t => (AdvanceTok(); case t of QMARK => exp1(optional(e)) | STAR => exp1(CLOSURE(e)) | PLUS => exp1(closure1(e)) | CHARS(c) => exp2(e,CLASS(c,0)) | BAR => ALT(e,exp0()) | DOLLAR => (UsesTrailingContext := true; endline(e)) | SLASH => (UsesTrailingContext := true; trail(e,exp0())) | REPS(i,j) => exp1(repeat(i,j,e)) | ID(name) => exp2(e,lookup' name) | _ => raise SyntaxError) and exp2 = fn (e1,e2) => case !NextTok of SEMI => CAT(e1,e2) | ARROW => CAT(e1,e2) | EOF => CAT(e1,e2) | LP => exp2(CAT(e1,e2),exp0()) | RP => CAT(e1,e2) | t => (AdvanceTok(); case t of QMARK => exp1(CAT(e1,optional(e2))) | STAR => exp1(CAT(e1,CLOSURE(e2))) | PLUS => exp1(CAT(e1,closure1(e2))) | CHARS(c) => exp2(CAT(e1,e2),CLASS(c,0)) | BAR => ALT(CAT(e1,e2),exp0()) | DOLLAR => (UsesTrailingContext := true; endline(CAT(e1,e2))) | SLASH => (UsesTrailingContext := true; trail(CAT(e1,e2),exp0())) | REPS(i,j) => exp1(CAT(e1,repeat(i,j,e2))) | ID(name) => exp2(CAT(e1,e2),lookup' name) | _ => raise SyntaxError) in exp0() end; val StateTab = ref(create(String.<=)) : (string,int) dictionary ref val StateNum = ref 0; fun GetStates () : int list = let fun add nil sl = sl | add (x::y) sl = add y (union ([lookup (!StateTab)(x) handle LOOKUP => prErr ("bad state name: "^x) ],sl)) fun addall i sl = if i <= !StateNum then addall (i+2) (union ([i],sl)) else sl fun incall (x::y) = (x+1)::incall y | incall nil = nil fun addincs nil = nil | addincs (x::y) = x::(x+1)::addincs y val state_list = case !NextTok of STATE s => (AdvanceTok(); LexState := 1; add s nil) | _ => addall 1 nil in case !NextTok of CARAT => (LexState := 1; AdvanceTok(); UsesPrevNewLine := true; incall state_list) | _ => addincs state_list end val LeafNum = ref ~1; fun renum(e : exp) : exp = let val rec label = fn EPS => EPS | CLASS(x,_) => CLASS(x,++LeafNum) | CLOSURE(e) => CLOSURE(label(e)) | ALT(e1,e2) => ALT(label(e1),label(e2)) | CAT(e1,e2) => CAT(label(e1),label(e2)) | TRAIL(i) => TRAIL(++LeafNum) | END(i) => END(++LeafNum) in label(e) end; exception ParseError; fun parse() : (string * (int list * exp) list * ((string,string) dictionary)) = let val Accept = ref (create String.<=) : (string,string) dictionary ref val rec ParseRtns = fn l => case getch(!LexBuf) of #"%" => let val c = getch(!LexBuf) in if c = #"%" then (implode (rev l)) else ParseRtns(c :: #"%" :: l) end | c => ParseRtns(c::l) and ParseDefs = fn () => (LexState:=0; AdvanceTok(); case !NextTok of LEXMARK => () | LEXSTATES => let fun f () = (case !NextTok of (ID i) => (StateTab := enter(!StateTab)(i,++StateNum); ++StateNum; AdvanceTok(); f()) | _ => ()) in AdvanceTok(); f (); if !NextTok=SEMI then ParseDefs() else (prSynErr "expected ';'") end | ID x => (LexState:=1; AdvanceTok(); if GetTok() = ASSIGN then (SymTab := enter(!SymTab)(x,GetExp()); if !NextTok = SEMI then ParseDefs() else (prSynErr "expected ';'")) else raise SyntaxError) | REJECT => (HaveReject := true; ParseDefs()) | COUNT => (CountNewLines := true; ParseDefs()) | FULLCHARSET => (CharSetSize := 256; ParseDefs()) | HEADER => (LexState := 2; AdvanceTok(); case GetTok() of ACTION s => if (!StrDecl) then (prErr "cannot have both %s and %header \ \declarations") else if (!HeaderDecl) then (prErr "duplicate %header declarations") else (HeaderCode := s; LexState := 0; HeaderDecl := true; ParseDefs()) | _ => raise SyntaxError) | ARG => (LexState := 2; AdvanceTok(); case GetTok() of ACTION s => (case !ArgCode of SOME _ => prErr "duplicate %arg declarations" | NONE => ArgCode := SOME s; LexState := 0; ParseDefs()) | _ => raise SyntaxError) | STRUCT => (AdvanceTok(); case !NextTok of (ID i) => if (!HeaderDecl) then (prErr "cannot have both %s and %header \ \declarations") else if (!StrDecl) then (prErr "duplicate %s declarations") else StrName := i | _ => (prErr "expected ID"); ParseDefs()) | _ => raise SyntaxError) and ParseRules = fn rules => (LexState:=1; AdvanceTok(); case !NextTok of LEXMARK => rules | EOF => rules | _ => let val s = GetStates() val e = renum(CAT(GetExp(),END(0))) in if !NextTok = ARROW then (LexState:=2; AdvanceTok(); case GetTok() of ACTION(act) => if !NextTok=SEMI then (Accept:=enter(!Accept) (Int.toString (!LeafNum),act); ParseRules((s,e)::rules)) else (prSynErr "expected ';'") | _ => raise SyntaxError) else (prSynErr "expected '=>'") end) in let val usercode = ParseRtns nil in (ParseDefs(); (usercode,ParseRules(nil),!Accept)) end end handle SyntaxError => (prSynErr "") fun makebegin () : unit = let fun make nil = () | make ((x,n:int)::y)=(say "val "; say x; say " = " ; say "STARTSTATE "; say (Int.toString n); say ";\n"; make y) in say "\n(* start state definitions *)\n\n"; make(listofdict(!StateTab)) end structure L = struct nonfix > type key = int list * string fun > ((key,item:string),(key',item')) = let fun f ((a:int)::a') (b::b') = if Int.> (a,b) then true else if a=b then f a' b' else false | f _ _ = false in f key key' end end structure RB = RedBlack(L) fun maketable (fins:(int * (int list)) list, tcs :(int * (int list)) list, tcpairs: (int * int) list, trans : (int*(int list)) list) : unit = (* Fins = (state #, list of final leaves for the state) list tcs = (state #, list of trailing context leaves which begin in this state) list tcpairs = (trailing context leaf, end leaf) list trans = (state #,list of transitions for state) list *) let datatype elem = N of int | T of int | D of int val count = ref 0 val _ = (if length(trans)<256 then CharFormat := true else CharFormat := false; if !UsesTrailingContext then (say "\ndatatype yyfinstate = N of int | \ \ T of int | D of int\n") else say "\ndatatype yyfinstate = N of int"; say "\ntype statedata = {fin : yyfinstate list, trans: "; case !CharFormat of true => say "string}" | false => say "int Vector.vector}"; say "\n(* transition & final state table *)\nval tab = let\n"; case !CharFormat of true => () | false => (say "fun decode s k =\n"; say " let val k' = k + k\n"; say " val hi = Char.ord(String.sub(s, k'))\n"; say " val lo = Char.ord(String.sub(s, k' + 1))\n"; say " in hi * 256 + lo end\n")) val newfins = let fun IsEndLeaf t = let fun f ((l,e)::r) = if (e=t) then true else f r | f nil = false in f tcpairs end fun GetEndLeaf t = let fun f ((tl,el)::r) = if (tl=t) then el else f r in f tcpairs end fun GetTrConLeaves s = let fun f ((s',l)::r) = if (s = s') then l else f r | f nil = nil in f tcs end fun sort_leaves s = let fun insert (x:int) (a::b) = if (x <= a) then x::(a::b) else a::(insert x b) | insert x nil = [x] in List.foldr (fn (x,r) => insert x r) [] s end fun conv a = if (IsEndLeaf a) then (D a) else (N a) fun merge (a::a',b::b') = if (a <= b) then (conv a)::merge(a',b::b') else (T b)::(merge(a::a',b')) | merge (a::a',nil) = (conv a)::(merge (a',nil)) | merge (nil,b::b') = (T b)::(merge (b',nil)) | merge (nil,nil) = nil in map (fn (x,l) => rev (merge (l, sort_leaves (map (fn x => GetEndLeaf x) (GetTrConLeaves x))))) fins end val rs = let open RB fun makeItems x = let fun emit8(x, pos) = let val s = StringCvt.padLeft #"0" 3 (Int.toString x) in case pos of 16 => (say "\\\n\\\\"; say s; 1) | _ => (say "\\"; say s; pos+1) end fun emit16(x, pos) = let val hi8 = x div 256 val lo8 = x - hi8 * 256 (* x rem 256 *) in emit8(lo8, emit8(hi8, pos)) end fun MakeString([], _, _) = () | MakeString(x::xs, emitter, pos) = MakeString(xs, emitter, emitter(x, pos)) in case !CharFormat of true => (say " =\n\""; MakeString(x,emit8,0); say "\"\n") | false => (say " = Vector.tabulate("; say (Int.toString(length x)); say ", decode\n\""; MakeString(x,emit16,0); say "\")\n") end fun makeEntry(nil,rs,t) = rev rs | makeEntry(((l:int,x)::y),rs,t) = let val name = "s" ^ (Int.toString l) in let val (r,n) = lookup ((x,name),t) in makeEntry(y,(n::rs),t) end handle notfound _ => (count := !count+1; say "val "; say name; makeItems x; makeEntry(y,(name::rs),(insert ((x,name),t)))) end in (makeEntry(trans,nil,empty)) end fun makeTable(nil,nil) = () | makeTable(a::a',b::b') = let fun makeItems nil = () | makeItems (hd::tl) = let val (t,n) = case hd of (N i) => ("(N ",i) | (T i) => ("(T ",i) | (D i) => ("(D ",i) in (say t; say (Int.toString n); say ")"; if null tl then () else (say ","; makeItems tl)) end in (say "{fin = ["; makeItems b; say "], trans = "; say a; say "}"; if null a' then () else (say ",\n"; makeTable(a',b'))) end fun msg x = () (*TextIO.output(TextIO.stdOut, x)*) in (say "in Vector.fromList\n["; makeTable(rs,newfins); say "]\nend\n"; msg ("\nNumber of states = " ^ (Int.toString (length trans))); msg ("\nNumber of distinct rows = " ^ (Int.toString (!count))); msg ("\nApprox. memory size of trans. table = " ^ (Int.toString (!count*(!CharSetSize)*(if !CharFormat then 1 else 8)))); msg " bytes\n") end (* makeaccept: Takes a (string,string) dictionary, prints case statement for accepting leaf actions. The key strings are the leaf #'s, the data strings are the actions *) fun makeaccept ends = let fun startline f = if f then say " " else say "| " fun make(nil,f) = (startline f; say "_ => raise Internal.LexerError\n") | make((x,a)::y,f) = (startline f; say x; say " => ("; say a; say ")\n"; make(y,false)) in make (listofdict(ends),true) end fun leafdata(e:(int list * exp) list) = let val fp = array(!LeafNum + 1,nil) and leaf = array(!LeafNum + 1,EPS) and tcpairs = ref nil and trailmark = ref ~1; val rec add = fn (nil,x) => () | (hd::tl,x) => (update(fp,hd,union(fp sub hd,x)); add(tl,x)) and moredata = fn CLOSURE(e1) => (moredata(e1); add(lastpos(e1),firstpos(e1))) | ALT(e1,e2) => (moredata(e1); moredata(e2)) | CAT(e1,e2) => (moredata(e1); moredata(e2); add(lastpos(e1),firstpos(e2))) | CLASS(x,i) => update(leaf,i,CLASS(x,i)) | TRAIL(i) => (update(leaf,i,TRAIL(i)); if !trailmark = ~1 then trailmark := i else ()) | END(i) => (update(leaf,i,END(i)); if !trailmark <> ~1 then (tcpairs := (!trailmark,i)::(!tcpairs); trailmark := ~1) else ()) | _ => () and makedata = fn nil => () | (_,x)::tl => (moredata(x);makedata(tl)) in trailmark := ~1; makedata(e); (fp,leaf,!tcpairs) end; fun makedfa(rules) = let val StateTab = ref (create(String.<=)) : (string,int) dictionary ref val fintab = ref (create(Int.<=)) : (int,(int list)) dictionary ref val transtab = ref (create(Int.<=)) : (int,int list) dictionary ref val tctab = ref (create(Int.<=)) : (int,(int list)) dictionary ref val (fp, leaf, tcpairs) = leafdata(rules); fun visit (state,statenum) = let val transitions = gettrans(state) in fintab := enter(!fintab)(statenum,getfin(state)); tctab := enter(!tctab)(statenum,gettc(state)); transtab := enter(!transtab)(statenum,transitions) end and visitstarts (states) = let fun vs nil i = () | vs (hd::tl) i = (visit (hd,i); vs tl (i+1)) in vs states 0 end and hashstate(s: int list) = let val rec hs = fn (nil,z) => z | ((x:int)::y,z) => hs(y,z ^ " " ^ (Int.toString x)) in hs(s,"") end and find(s) = lookup(!StateTab)(hashstate(s)) and add(s,n) = StateTab := enter(!StateTab)(hashstate(s),n) and getstate (state) = find(state) handle LOOKUP => let val n = ++StateNum in add(state,n); visit(state,n); n end and getfin state = let fun f nil fins = fins | f (hd::tl) fins = case (leaf sub hd) of END _ => f tl (hd::fins) | _ => f tl fins in f state nil end and gettc state = let fun f nil fins = fins | f (hd::tl) fins = case (leaf sub hd) of TRAIL _ => f tl (hd::fins) | _ => f tl fins in f state nil end and gettrans (state) = let fun loop c tlist = let fun cktrans nil r = r | cktrans (hd::tl) r = case (leaf sub hd) of CLASS(i,_)=> (if (i sub c) then cktrans tl (union(r,fp sub hd)) else cktrans tl r handle Subscript => cktrans tl r ) | _ => cktrans tl r in if c >= 0 then let val v=cktrans state nil in loop (c-1) (if v=nil then 0::tlist else (getstate v)::tlist) end else tlist end in loop ((!CharSetSize) - 1) nil end and startstates() = let val startarray = array(!StateNum + 1, nil); fun listofarray(a,n) = let fun f i l = if i >= 0 then f (i-1) ((a sub i)::l) else l in f (n-1) nil end val rec makess = fn nil => () | (startlist,e)::tl => (fix(startlist,firstpos(e));makess(tl)) and fix = fn (nil,_) => () | (s::tl,firsts) => (update(startarray,s, union(firsts,startarray sub s)); fix(tl,firsts)) in makess(rules);listofarray(startarray, !StateNum + 1) end in visitstarts(startstates()); (listofdict(!fintab),listofdict(!transtab),listofdict(!tctab),tcpairs) end val skel_hd = " struct\n\ \ structure UserDeclarations =\n\ \ struct\n\ \" val skel_mid2 = " | Internal.D k => action (i,(acts::l),k::rs)\n\ \ | Internal.T k =>\n\ \ let fun f (a::b,r) =\n\ \ if a=k\n\ \ then action(i,(((Internal.N a)::acts)::l),(b@r))\n\ \ else f (b,a::r)\n\ \ | f (nil,r) = action(i,(acts::l),rs)\n\ \ in f (rs,nil)\n\ \ end\n\ \" fun lexGen(infile) = let val outfile = infile ^ ".sml" fun PrintLexer (ends) = let val sayln = fn x => (say x; say "\n") in case !ArgCode of NONE => (sayln "fun lex () : Internal.result ="; sayln "let fun continue() = lex() in") | SOME s => (say "fun lex "; say "(yyarg as ("; say s; sayln ")) ="; sayln "let fun continue() : Internal.result = "); say " let fun scan (s,AcceptingLeaves : Internal.yyfinstate"; sayln " list list,l,i0) ="; if !UsesTrailingContext then say "\tlet fun action (i,nil,rs)" else say "\tlet fun action (i,nil)"; sayln " = raise LexError"; if !UsesTrailingContext then sayln "\t| action (i,nil::l,rs) = action(i-1,l,rs)" else sayln "\t| action (i,nil::l) = action (i-1,l)"; if !UsesTrailingContext then sayln "\t| action (i,(node::acts)::l,rs) =" else sayln "\t| action (i,(node::acts)::l) ="; sayln "\t\tcase node of"; sayln "\t\t Internal.N yyk => "; sayln "\t\t\t(let val yytext = substring(!yyb,i0,i-i0)\n\ \\t\t\t val yypos = i0+ !yygone"; if !CountNewLines then (sayln "\t\t\tval _ = yylineno := CharVector.foldl"; sayln "\t\t\t\t(fn (#\"\\n\", n) => n+1 | (_, n) => n) (!yylineno) yytext") else (); if !HaveReject then (say "\t\t\tfun REJECT() = action(i,acts::l"; if !UsesTrailingContext then sayln ",rs)" else sayln ")") else (); sayln "\t\t\topen UserDeclarations Internal.StartStates"; sayln " in (yybufpos := i; case yyk of "; sayln ""; sayln "\t\t\t(* Application actions *)\n"; makeaccept(ends); say "\n\t\t) end "; say ")\n\n"; if (!UsesTrailingContext) then say skel_mid2 else (); sayln "\tval {fin,trans} = Vector.sub(Internal.tab, s)"; sayln "\tval NewAcceptingLeaves = fin::AcceptingLeaves"; sayln "\tin if l = !yybl then"; sayln "\t if trans = #trans(Vector.sub(Internal.tab,0))"; sayln "\t then action(l,NewAcceptingLeaves"; if !UsesTrailingContext then say ",nil" else (); say ") else"; sayln "\t let val newchars= if !yydone then \"\" else yyinput 1024"; sayln "\t in if (size newchars)=0"; sayln "\t\t then (yydone := true;"; say "\t\t if (l=i0) then UserDeclarations.eof "; sayln (case !ArgCode of NONE => "()" | SOME _ => "yyarg"); say "\t\t else action(l,NewAcceptingLeaves"; if !UsesTrailingContext then sayln ",nil))" else sayln "))"; sayln "\t\t else (if i0=l then yyb := newchars"; sayln "\t\t else yyb := substring(!yyb,i0,l-i0)^newchars;"; sayln "\t\t yygone := !yygone+i0;"; sayln "\t\t yybl := size (!yyb);"; sayln "\t\t scan (s,AcceptingLeaves,l-i0,0))"; sayln "\t end"; sayln "\t else let val NewChar = Char.ord(String.sub(!yyb,l))"; say "\t\tval NewState = "; case (!CharFormat,!CharSetSize) of (true,129) => sayln "if NewChar<128 then Char.ord(String.sub(trans,NewChar)) else Char.ord(String.sub(trans,128))" | (true,256) => sayln "Char.ord(String.sub(trans,NewChar))" | (false,129) => sayln "if NewChar<128 then Vector.sub(trans, NewChar) else Vector.sub(trans, 128)" | (false,256) => sayln "Vector.sub(trans, NewChar)"; say "\t\tin if NewState=0 then action(l,NewAcceptingLeaves"; if !UsesTrailingContext then sayln ",nil)" else sayln ")"; sayln "\t\telse scan(NewState,NewAcceptingLeaves,l+1,i0)"; sayln "\tend"; sayln "\tend"; if !UsesPrevNewLine then () else sayln "(*"; sayln "\tval start= if substring(!yyb,!yybufpos-1,1)=\"\\n\""; sayln "then !yybegin+1 else !yybegin"; if !UsesPrevNewLine then () else sayln "*)"; say "\tin scan("; if !UsesPrevNewLine then say "start" else say "!yybegin (* start *)"; sayln ",nil,!yybufpos,!yybufpos)"; sayln " end"; sayln (case !ArgCode of NONE => "end" | SOME _ => "in continue end"); sayln " in lex"; sayln " end"; sayln "end" end in (UsesPrevNewLine := false; ResetFlags(); LexBuf := make_ibuf(TextIO.openIn infile); NextTok := BOF; inquote := false; LexOut := TextIO.openOut(outfile); StateNum := 2; LineNum := 1; StateTab := enter(create(String.<=))("INITIAL",1); LeafNum := ~1; let val (user_code,rules,ends) = parse() handle x => (close_ibuf(!LexBuf); TextIO.closeOut(!LexOut); raise x) val (fins,trans,tctab,tcpairs) = makedfa(rules) val _ = if !UsesTrailingContext then (close_ibuf(!LexBuf); TextIO.closeOut(!LexOut); prErr "lookahead is unimplemented") else () in if (!HeaderDecl) then say (!HeaderCode) else say ("structure " ^ (!StrName)); say "=\n"; say skel_hd; say user_code; say "end (* end of user routines *)\n"; say "exception LexError (* raised if illegal leaf "; say "action tried *)\n"; say "structure Internal =\n\tstruct\n"; maketable(fins,tctab,tcpairs,trans); say "structure StartStates =\n\tstruct\n"; say "\tdatatype yystartstate = STARTSTATE of int\n"; makebegin(); say "\nend\n"; say "type result = UserDeclarations.lexresult\n"; say "\texception LexerError (* raised if illegal leaf "; say "action tried *)\n"; say "end\n\n"; say "fun makeLexer yyinput = \n"; say "let \n"; if !CountNewLines then say "\tval yylineno = ref 0\n\n" else (); say "\tval yyb = ref \"\\n\" \t\t(* buffer *)\n\ \\tval yybl = ref 1\t\t(*buffer length *)\n\ \\tval yybufpos = ref 1\t\t(* location of next character to use *)\n\ \\tval yygone = ref 1\t\t(* position in file of beginning of buffer *)\n\ \\tval yydone = ref false\t\t(* eof found yet? *)\n\ \\tval yybegin = ref 1\t\t(*Current 'start state' for lexer *)\n\ \\n\tval YYBEGIN = fn (Internal.StartStates.STARTSTATE x) =>\n\ \\t\t yybegin := x\n\n"; PrintLexer(ends); close_ibuf(!LexBuf); TextIO.closeOut(!LexOut) end) end end structure Main : BMARK = struct val s = OS.FileSys.getDir() fun doit () = LexGen.lexGen (s^"/DATA/ml.lex"); val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end fun testit _ = LexGen.lexGen (s^"DATA/ml.lex") end (* Main *) mlton-20100608/benchmark/tests/life.sml0000644000076600000240000001267111404435630016316 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; structure Main : BMARK = struct fun map f [] = [] | map f (a::x) = f a :: map f x exception ex_undefined of string fun error str = raise ex_undefined str fun accumulate f = let fun foldf a [] = a | foldf a (b::x) = foldf (f a b) x in foldf end fun filter p = let fun consifp x a = if p a then a::x else x in rev o accumulate consifp [] end fun exists p = let fun existsp [] = false | existsp (a::x) = if p a then true else existsp x in existsp end fun equal a b = (a = b) fun member x a = exists (equal a) x fun C f x y = f y x fun cons a x = a::x fun revonto x = accumulate (C cons) x fun length x = let fun count n a = n+1 in accumulate count 0 x end fun repeat f = let fun rptf n x = if n=0 then x else rptf(n-1)(f x) fun check n = if n<0 then error "repeat<0" else n in rptf o check end fun copy n x = repeat (cons x) n [] fun spaces n = concat (copy n " ") local fun lexordset [] = [] | lexordset (a::x) = lexordset (filter (lexless a) x) @ [a] @ lexordset (filter (lexgreater a) x) and lexless(a1:int,b1:int)(a2,b2) = if a2=xstart andalso y>=ystart in fun plot coordlist = plotfrom(xstart,ystart) "" (filter good coordlist) end infix 6 at fun coordlist at (x:int,y:int) = let fun move(a,b) = (a+x,b+y) in map move coordlist end val rotate = map (fn (x:int,y:int) => (y,~x)) val glider = [(0,0),(0,2),(1,1),(1,2),(2,1)] val bail = [(0,0),(0,1),(1,0),(1,1)] fun barberpole n = let fun f i = if i=n then (n+n-1,n+n)::(n+n,n+n)::nil else (i+i,i+i+1)::(i+i+2,i+i+1)::f(i+1) in (0,0)::(1,0):: f 0 end val genB = mkgen(glider at (2,2) @ bail at (2,12) @ rotate (barberpole 4) at (5,20)) fun nthgen g 0 = g | nthgen g i = nthgen (mk_nextgen_fn neighbours g) (i-1) val gun = mkgen [(2,20),(3,19),(3,21),(4,18),(4,22),(4,23),(4,32),(5,7),(5,8),(5,18), (5,22),(5,23),(5,29),(5,30),(5,31),(5,32),(5,36),(6,7),(6,8),(6,18), (6,22),(6,23),(6,28),(6,29),(6,30),(6,31),(6,36),(7,19),(7,21),(7,28), (7,31),(7,40),(7,41),(8,20),(8,28),(8,29),(8,30),(8,31),(8,40),(8,41), (9,29),(9,30),(9,31),(9,32)] fun show pr = (app (fn s => (pr s; pr "\n"))) o plot o alive fun doit () = show (fn _ => ()) (nthgen gun 25000) val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end fun testit strm = show (fn c => TextIO.output (strm, c)) (nthgen gun 50) end (* Life *) mlton-20100608/benchmark/tests/logic.sml0000644000076600000240000003022711404435630016471 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) (* term.sml *) structure Term = struct datatype term = STR of string * term list | INT of int | CON of string | REF of term option ref exception BadArg of string end; (* trail.sml *) structure Trail = struct local open Term val global_trail = ref (nil : term option ref list) val trail_counter = ref 0 in fun unwind_trail (0, tr) = tr | unwind_trail (n, r::tr) = ( r := NONE ; unwind_trail (n-1, tr) ) | unwind_trail (_, nil) = raise BadArg "unwind_trail" fun reset_trail () = ( global_trail := nil ) fun trail func = let val tc0 = !trail_counter in ( func () ; global_trail := unwind_trail (!trail_counter-tc0, !global_trail) ; trail_counter := tc0 ) end fun bind (r, t) = ( r := SOME t ; global_trail := r::(!global_trail) ; trail_counter := !trail_counter+1 ) end (* local *) end; (* Trail *) (* unify.sml *) structure Unify = struct local open Term Trail fun same_ref (r, REF(r')) = (r = r') | same_ref _ = false fun occurs_check r t = let fun oc (STR(_,ts)) = ocs ts | oc (REF(r')) = (case !r' of SOME(s) => oc s | _ => r <> r') | oc (CON _) = true | oc (INT _) = true and ocs nil = true | ocs (t::ts) = oc t andalso ocs ts in oc t end fun deref (t as (REF(x))) = (case !x of SOME(s) => deref s | _ => t) | deref t = t fun unify' (REF(r), t) sc = unify_REF (r,t) sc | unify' (s, REF(r)) sc = unify_REF (r,s) sc | unify' (STR(f,ts), STR(g,ss)) sc = if (f = g) then unifys (ts,ss) sc else () | unify' (CON(f), CON(g)) sc = if (f = g) then sc () else () | unify' (INT(f), INT(g)) sc = if (f = g) then sc () else () | unify' (_, _) sc = () and unifys (nil, nil) sc = sc () | unifys (t::ts, s::ss) sc = unify' (deref(t), deref(s)) (fn () => unifys (ts, ss) sc) | unifys _ sc = () and unify_REF (r, t) sc = if same_ref (r, t) then sc () else if occurs_check r t then ( bind(r, t) ; sc () ) else () in val deref = deref fun unify (s, t) = unify' (deref(s), deref(t)) end (* local *) end; (* Unify *) (* data.sml *) structure Data = struct local open Term Trail Unify val cons_s = "cons" val x_s = "x" val nil_s = "nil" val o_s = "o" val s_s = "s" val CON_o_s = CON(o_s) val CON_nil_s = CON(nil_s) val CON_x_s = CON(x_s) in fun exists sc = sc (REF(ref(NONE))) fun move_horiz (T_1, T_2) sc = ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => ( trail (fn () => exists (fn T => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, T])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, T])])]), TT])) (fn () => sc ()))))) ; exists (fn P1 => exists (fn P5 => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () => sc ()))))) )) ; exists (fn P1 => exists (fn P2 => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), TT])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn P4 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn P1 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])])]), TT])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), TT])])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn L2 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, CON_nil_s])])]), TT])])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), TT])])])) (fn () => sc ()))))) )) ; exists (fn T => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, T])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, T])])]), TT])) (fn () => sc ())))) )) ; exists (fn P1 => exists (fn P5 => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [P5, CON_nil_s])])])])]), TT])) (fn () => sc ()))))) )) ; exists (fn P1 => exists (fn P2 => exists (fn TT => unify (T_1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), TT])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [P2, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])])])]), TT])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn P4 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, STR(cons_s, [P4, CON_nil_s])])])]), TT])])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn P1 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), TT])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [STR(cons_s, [P1, STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])])]), TT])])) (fn () => sc ()))))) )) ; exists (fn L1 => exists (fn L2 => exists (fn TT => unify (T_1, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), TT])])])) (fn () => unify (T_2, STR(cons_s, [L1, STR(cons_s, [L2, STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_o_s, CON_nil_s])])]), TT])])])) (fn () => sc ()))))) ) (* | move_horiz _ _ = () *) and rotate (T_1, T_2) sc = exists (fn P11 => exists (fn P12 => exists (fn P13 => exists (fn P14 => exists (fn P15 => exists (fn P21 => exists (fn P22 => exists (fn P23 => exists (fn P24 => exists (fn P31 => exists (fn P32 => exists (fn P33 => exists (fn P41 => exists (fn P42 => exists (fn P51 => unify (T_1, STR(cons_s, [STR(cons_s, [P11, STR(cons_s, [P12, STR(cons_s, [P13, STR(cons_s, [P14, STR(cons_s, [P15, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [P21, STR(cons_s, [P22, STR(cons_s, [P23, STR(cons_s, [P24, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [P31, STR(cons_s, [P32, STR(cons_s, [P33, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [P41, STR(cons_s, [P42, CON_nil_s])]), STR(cons_s, [STR(cons_s, [P51, CON_nil_s]), CON_nil_s])])])])])) (fn () => unify (T_2, STR(cons_s, [STR(cons_s, [P51, STR(cons_s, [P41, STR(cons_s, [P31, STR(cons_s, [P21, STR(cons_s, [P11, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [P42, STR(cons_s, [P32, STR(cons_s, [P22, STR(cons_s, [P12, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [P33, STR(cons_s, [P23, STR(cons_s, [P13, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [P24, STR(cons_s, [P14, CON_nil_s])]), STR(cons_s, [STR(cons_s, [P15, CON_nil_s]), CON_nil_s])])])])])) (fn () => sc ()))))))))))))))))) (* | rotate _ _ = () *) and move (T_1, T_2) sc = ( trail (fn () => ( trail (fn () => exists (fn X => exists (fn Y => unify (T_1, X) (fn () => unify (T_2, Y) (fn () => move_horiz (X, Y) sc))))) ; exists (fn X => exists (fn X1 => exists (fn Y => exists (fn Y1 => unify (T_1, X) (fn () => unify (T_2, Y) (fn () => rotate (X, X1) (fn () => move_horiz (X1, Y1) (fn () => rotate (Y, Y1) sc)))))))) )) ; exists (fn X => exists (fn X1 => exists (fn Y => exists (fn Y1 => unify (T_1, X) (fn () => unify (T_2, Y) (fn () => rotate (X1, X) (fn () => move_horiz (X1, Y1) (fn () => rotate (Y1, Y) sc)))))))) ) (* | move _ _ = () *) and solitaire (T_1, T_2, T_3) sc = ( trail (fn () => exists (fn X => unify (T_1, X) (fn () => unify (T_2, STR(cons_s, [X, CON_nil_s])) (fn () => unify (T_3, INT(0)) (fn () => sc ()))))) ; exists (fn N => exists (fn X => exists (fn Y => exists (fn Z => unify (T_1, X) (fn () => unify (T_2, STR(cons_s, [X, Z])) (fn () => unify (T_3, STR(s_s, [N])) (fn () => move (X, Y) (fn () => solitaire (Y, Z, N) sc)))))))) ) (* | solitaire _ _ = () *) and solution1 (T_1) sc = exists (fn X => unify (T_1, X) (fn () => solitaire (STR(cons_s, [STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])]), STR(cons_s, [STR(cons_s, [CON_x_s, CON_nil_s]), CON_nil_s])])])])]) , X, STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [INT(0)])])])])])])])])])])])])])) sc)) (* | solution1 _ _ = () *) and solution2 (T_1) sc = exists (fn X => unify (T_1, X) (fn () => solitaire (STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_o_s, STR(cons_s, [CON_x_s, CON_nil_s])])]), STR(cons_s, [STR(cons_s, [CON_x_s, STR(cons_s, [CON_x_s, CON_nil_s])]), STR(cons_s, [STR(cons_s, [CON_x_s, CON_nil_s]), CON_nil_s])])])])]) , X, STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [STR(s_s, [INT(0)])])])])])])])])])])])])])) sc)) (* | solution2 _ _ = () *) end (* local *) end; (* Data *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* main.sml *) structure Main : BMARK = struct val name = "Logic" exception Done fun testit strm = Data.exists(fn Z => Data.solution2 Z (fn () => raise Done)) handle Done => TextIO.output(strm, "yes\n") fun doit () = Data.exists(fn Z => Data.solution2 Z (fn () => raise Done)) handle Done => () val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end; (* Main *) mlton-20100608/benchmark/tests/Makefile0000644000076600000240000000062711404435630016320 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../../bin/clean rm -f *.c *.s for f in *; do \ if [ -x "$$f" -a ! -d "$$f" ]; then \ rm -f "$$f"; \ fi; \ done mlton-20100608/benchmark/tests/mandelbrot.sml0000644000076600000240000000417011404435630017521 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* mandelbrot.sml *) structure Main : BMARK = struct val x_base = ~2.0 val y_base = 1.25 val side = 2.5 val sz = 32768 val maxCount = 2048 val delta = side / (real sz) val sum_iterations = ref 0 fun loop1 i = if (i >= sz) then () else let val c_im : real = y_base - (delta * real i) fun loop2 j = if (j >= sz) then () else let val c_re = x_base * (delta + real j) fun loop3 (count, z_re : real, z_im : real) = if (count < maxCount) then let val z_re_sq = z_re * z_re val z_im_sq = z_im * z_im in if ((z_re_sq + z_im_sq) > 4.0) then count else let val z_re_im = (z_re * z_im) in loop3 (count+1, (z_re_sq - z_im_sq) + c_re, z_re_im + z_re_im + c_im) end end (* loop3 *) else count val count = loop3 (0, c_re, c_im) in sum_iterations := !sum_iterations + count; loop2 (j+1) end in loop2 0; loop1 (i+1) end fun doit () = (sum_iterations := 0; loop1 0) val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end fun testit outstrm = ( sum_iterations := 0; loop1 0; TextIO.output (outstrm, Int.toString(!sum_iterations) ^ " iterations\n")) end (* Mandelbrot *) mlton-20100608/benchmark/tests/matrix-multiply.sml0000644000076600000240000000311311404435630020547 0ustar mtfstaff(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Array = Array2 fun 'a fold (n : int, b : 'a, f : int * 'a -> 'a) = let fun loop (i : int, b : 'a) : 'a = if i = n then b else loop (i + 1, f (i, b)) in loop (0, b) end fun foreach (n : int, f : int -> unit) : unit = fold (n, (), f o #1) fun mult (a1 : real Array.array, a2 : real Array.array) : real Array.array = let val r1 = Array.nRows a1 val c1 = Array.nCols a1 val r2 = Array.nRows a2 val c2 = Array.nCols a2 in if c1 <> r2 then raise Fail "mult" else let val a = Array2.array (r1, c2, 0.0) fun dot (r, c) = fold (c1, 0.0, fn (i, sum) => sum + Array.sub (a1, r, i) * Array.sub (a2, i, c)) in foreach (r1, fn r => foreach (c2, fn c => Array.update (a, r, c, dot (r,c)))); a end end structure Main = struct fun doit () = let val dim = 500 val a = Array.tabulate Array.RowMajor (dim, dim, fn (r, c) => Real.fromInt (r + c)) in if Real.== (41541750.0, Array2.sub (mult (a, a), 0, 0)) then () else raise Fail "bug" end val doit = fn size => let fun loop n = if n = 0 then () else (doit (); loop (n-1)) in loop size end end mlton-20100608/benchmark/tests/md5.sml0000644000076600000240000002507011404435630016061 0ustar mtfstaff(* Copyright (C) 2001 Daniel Wang. All rights reserved. Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. *) signature MD5 = sig type md5state (* type slice = (Word8Vector.vector * int * int option) *) val init : md5state (* val updateSlice : (md5state * slice) -> md5state *) val update : (md5state * Word8Vector.vector) -> md5state val final : md5state -> Word8Vector.vector val toHexString : Word8Vector.vector -> string end (* Quick and dirty transliteration of C code *) structure MD5 :> MD5 = struct structure W32 = Word32 structure W8V = struct open Word8Vector fun extract (vec, s, l) = let val n = case l of NONE => length vec - s | SOME i => i in tabulate (n, fn i => sub (vec, s + i)) end end type word64 = {hi:W32.word,lo:W32.word} type word128 = {A:W32.word, B:W32.word, C:W32.word, D:W32.word} type md5state = {digest:word128, mlen:word64, buf:Word8Vector.vector} val w64_zero = ({hi=0w0,lo=0w0}:word64) fun mul8add ({hi,lo},n) = let val mul8lo = W32.<< (W32.fromInt (n),0w3) val mul8hi = W32.>> (W32.fromInt (n),0w29) val lo = W32.+ (lo,mul8lo) val cout = if W32.< (lo,mul8lo) then 0w1 else 0w0 val hi = W32.+ (mul8hi,W32.+ (hi,cout)) in {hi=hi,lo=lo} end fun packLittle wrds = let fun loop [] = [] | loop (w::ws) = let val b0 = Word8.fromLarge (W32.toLarge w) val b1 = Word8.fromLarge (W32.toLarge (W32.>> (w,0w8))) val b2 = Word8.fromLarge (W32.toLarge (W32.>> (w,0w16))) val b3 = Word8.fromLarge (W32.toLarge (W32.>> (w,0w24))) in b0::b1::b2::b3:: (loop ws) end in W8V.fromList (loop wrds) end val S11 = 0w7 val S12 = 0w12 val S13 = 0w17 val S14 = 0w22 val S21 = 0w5 val S22 = 0w9 val S23 = 0w14 val S24 = 0w20 val S31 = 0w4 val S32 = 0w11 val S33 = 0w16 val S34 = 0w23 val S41 = 0w6 val S42 = 0w10 val S43 = 0w15 val S44 = 0w21 fun PADDING i = W8V.tabulate (i,(fn 0 => 0wx80 | _ => 0wx0)) fun F (x,y,z) = W32.orb (W32.andb (x,y), W32.andb (W32.notb x,z)) fun G (x,y,z) = W32.orb (W32.andb (x,z), W32.andb (y,W32.notb z)) fun H (x,y,z) = W32.xorb (x,W32.xorb (y,z)) fun I (x,y,z) = W32.xorb (y,W32.orb (x,W32.notb z)) fun ROTATE_LEFT (x,n) = W32.orb (W32.<< (x,n), W32.>> (x,0w32 - n)) fun XX f (a,b,c,d,x,s,ac) = let val a = W32.+ (a,W32.+ (W32.+ (f (b,c,d),x),ac)) val a = ROTATE_LEFT (a,s) in W32.+ (a,b) end val FF = XX F val GG = XX G val HH = XX H val II = XX I val empty_buf = W8V.tabulate (0,(fn x => raise (Fail "buf"))) val init = {digest= {A=0wx67452301, B=0wxefcdab89, C=0wx98badcfe, D=0wx10325476}, mlen=w64_zero, buf=empty_buf} : md5state fun update ({buf,digest,mlen}:md5state,input) = let val inputLen = W8V.length input val needBytes = 64 - W8V.length buf fun loop (i,digest) = if i + 63 < inputLen then loop (i + 64,transform (digest,i,input)) else (i,digest) val (buf,(i,digest)) = if inputLen >= needBytes then let val buf = W8V.concat [buf,W8V.extract (input,0,SOME needBytes)] val digest = transform (digest,0,buf) in (empty_buf,loop (needBytes,digest)) end else (buf,(0,digest)) val buf = W8V.concat [buf, W8V.extract (input,i,SOME (inputLen-i))] val mlen = mul8add (mlen,inputLen) in {buf=buf,digest=digest,mlen=mlen} end and final (state:md5state) = let val {mlen= {lo,hi},buf,...} = state val bits = packLittle [lo,hi] val index = W8V.length buf val padLen = if index < 56 then 56 - index else 120 - index val state = update (state,PADDING padLen) val {digest= {A,B,C,D},...} = update (state,bits) in packLittle [A,B,C,D] end and transform ({A,B,C,D},i,buf) = let val off = i div PackWord32Little.bytesPerElem fun x (n) = Word32.fromLarge (PackWord32Little.subVec (buf,n + off)) val (a,b,c,d) = (A,B,C,D) (* fetch to avoid range checks *) val x_00 = x (0) val x_01 = x (1) val x_02 = x (2) val x_03 = x (3) val x_04 = x (4) val x_05 = x (5) val x_06 = x (6) val x_07 = x (7) val x_08 = x (8) val x_09 = x (9) val x_10 = x (10) val x_11 = x (11) val x_12 = x (12) val x_13 = x (13) val x_14 = x (14) val x_15 = x (15) val a = FF (a, b, c, d, x_00, S11, 0wxd76aa478) (* 1 *) val d = FF (d, a, b, c, x_01, S12, 0wxe8c7b756) (* 2 *) val c = FF (c, d, a, b, x_02, S13, 0wx242070db) (* 3 *) val b = FF (b, c, d, a, x_03, S14, 0wxc1bdceee) (* 4 *) val a = FF (a, b, c, d, x_04, S11, 0wxf57c0faf) (* 5 *) val d = FF (d, a, b, c, x_05, S12, 0wx4787c62a) (* 6 *) val c = FF (c, d, a, b, x_06, S13, 0wxa8304613) (* 7 *) val b = FF (b, c, d, a, x_07, S14, 0wxfd469501) (* 8 *) val a = FF (a, b, c, d, x_08, S11, 0wx698098d8) (* 9 *) val d = FF (d, a, b, c, x_09, S12, 0wx8b44f7af) (* 10 *) val c = FF (c, d, a, b, x_10, S13, 0wxffff5bb1) (* 11 *) val b = FF (b, c, d, a, x_11, S14, 0wx895cd7be) (* 12 *) val a = FF (a, b, c, d, x_12, S11, 0wx6b901122) (* 13 *) val d = FF (d, a, b, c, x_13, S12, 0wxfd987193) (* 14 *) val c = FF (c, d, a, b, x_14, S13, 0wxa679438e) (* 15 *) val b = FF (b, c, d, a, x_15, S14, 0wx49b40821) (* 16 *) (* Round 2 *) val a = GG (a, b, c, d, x_01, S21, 0wxf61e2562) (* 17 *) val d = GG (d, a, b, c, x_06, S22, 0wxc040b340) (* 18 *) val c = GG (c, d, a, b, x_11, S23, 0wx265e5a51) (* 19 *) val b = GG (b, c, d, a, x_00, S24, 0wxe9b6c7aa) (* 20 *) val a = GG (a, b, c, d, x_05, S21, 0wxd62f105d) (* 21 *) val d = GG (d, a, b, c, x_10, S22, 0wx2441453) (* 22 *) val c = GG (c, d, a, b, x_15, S23, 0wxd8a1e681) (* 23 *) val b = GG (b, c, d, a, x_04, S24, 0wxe7d3fbc8) (* 24 *) val a = GG (a, b, c, d, x_09, S21, 0wx21e1cde6) (* 25 *) val d = GG (d, a, b, c, x_14, S22, 0wxc33707d6) (* 26 *) val c = GG (c, d, a, b, x_03, S23, 0wxf4d50d87) (* 27 *) val b = GG (b, c, d, a, x_08, S24, 0wx455a14ed) (* 28 *) val a = GG (a, b, c, d, x_13, S21, 0wxa9e3e905) (* 29 *) val d = GG (d, a, b, c, x_02, S22, 0wxfcefa3f8) (* 30 *) val c = GG (c, d, a, b, x_07, S23, 0wx676f02d9) (* 31 *) val b = GG (b, c, d, a, x_12, S24, 0wx8d2a4c8a) (* 32 *) (* Round 3 *) val a = HH (a, b, c, d, x_05, S31, 0wxfffa3942) (* 33 *) val d = HH (d, a, b, c, x_08, S32, 0wx8771f681) (* 34 *) val c = HH (c, d, a, b, x_11, S33, 0wx6d9d6122) (* 35 *) val b = HH (b, c, d, a, x_14, S34, 0wxfde5380c) (* 36 *) val a = HH (a, b, c, d, x_01, S31, 0wxa4beea44) (* 37 *) val d = HH (d, a, b, c, x_04, S32, 0wx4bdecfa9) (* 38 *) val c = HH (c, d, a, b, x_07, S33, 0wxf6bb4b60) (* 39 *) val b = HH (b, c, d, a, x_10, S34, 0wxbebfbc70) (* 40 *) val a = HH (a, b, c, d, x_13, S31, 0wx289b7ec6) (* 41 *) val d = HH (d, a, b, c, x_00, S32, 0wxeaa127fa) (* 42 *) val c = HH (c, d, a, b, x_03, S33, 0wxd4ef3085) (* 43 *) val b = HH (b, c, d, a, x_06, S34, 0wx4881d05) (* 44 *) val a = HH (a, b, c, d, x_09, S31, 0wxd9d4d039) (* 45 *) val d = HH (d, a, b, c, x_12, S32, 0wxe6db99e5) (* 46 *) val c = HH (c, d, a, b, x_15, S33, 0wx1fa27cf8) (* 47 *) val b = HH (b, c, d, a, x_02, S34, 0wxc4ac5665) (* 48 *) (* Round 4 *) val a = II (a, b, c, d, x_00, S41, 0wxf4292244) (* 49 *) val d = II (d, a, b, c, x_07, S42, 0wx432aff97) (* 50 *) val c = II (c, d, a, b, x_14, S43, 0wxab9423a7) (* 51 *) val b = II (b, c, d, a, x_05, S44, 0wxfc93a039) (* 52 *) val a = II (a, b, c, d, x_12, S41, 0wx655b59c3) (* 53 *) val d = II (d, a, b, c, x_03, S42, 0wx8f0ccc92) (* 54 *) val c = II (c, d, a, b, x_10, S43, 0wxffeff47d) (* 55 *) val b = II (b, c, d, a, x_01, S44, 0wx85845dd1) (* 56 *) val a = II (a, b, c, d, x_08, S41, 0wx6fa87e4f) (* 57 *) val d = II (d, a, b, c, x_15, S42, 0wxfe2ce6e0) (* 58 *) val c = II (c, d, a, b, x_06, S43, 0wxa3014314) (* 59 *) val b = II (b, c, d, a, x_13, S44, 0wx4e0811a1) (* 60 *) val a = II (a, b, c, d, x_04, S41, 0wxf7537e82) (* 61 *) val d = II (d, a, b, c, x_11, S42, 0wxbd3af235) (* 62 *) val c = II (c, d, a, b, x_02, S43, 0wx2ad7d2bb) (* 63 *) val b = II (b, c, d, a, x_09, S44, 0wxeb86d391) (* 64 *) val A = Word32.+ (A,a) val B = Word32.+ (B,b) val C = Word32.+ (C,c) val D = Word32.+ (D,d) in {A=A,B=B,C=C,D=D} end val hxd = "0123456789abcdef" fun toHexString v = let fun byte2hex (b,acc) = (String.sub (hxd,(Word8.toInt b) div 16)):: (String.sub (hxd,(Word8.toInt b) mod 16))::acc val digits = Word8Vector.foldr byte2hex [] v in String.implode (digits) end end structure Test = struct val tests = [("", "d41d8cd98f00b204e9800998ecf8427e"), ("a", "0cc175b9c0f1b6a831c399e269772661"), ("abc", "900150983cd24fb0d6963f7d28e17f72"), ("message digest", "f96b697d7cb7938d525a2f31aaf161d0"), ("abcdefghijklmnopqrstuvwxyz", "c3fcd3d76192e4007dfb496cca67e13b"), ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "d174ab98d277d9f5a5611c2c9f419d9f"), ("12345678901234567890123456789012345678901234567890123456789012345678901234567890", "57edf4a22be3c955ac49da2e2107b67a")] fun do_tests () = let fun f (x,s) = let val mstate = MD5.update (MD5.init,Byte.stringToBytes x) val hash = MD5.final (mstate) in print (" input: "^x^"\n"); print ("expected: "^s^"\n"); print ("produced: "^MD5.toHexString (hash)^"\n") end in List.app f tests end val BLOCK_LEN = 10000 val BLOCK_COUNT = 100000 fun time_test () = let val block = Word8Vector.tabulate (BLOCK_LEN,Word8.fromInt) fun loop (n,s) = if n < BLOCK_COUNT then loop (n+1,MD5.update (s,block)) else s in loop (0,MD5.init) end end structure Main = struct fun doit n = if n = 0 then () else (Test.time_test () ; doit (n - 1)) end mlton-20100608/benchmark/tests/merge.sml0000644000076600000240000000142711404435630016473 0ustar mtfstaff(* Written by Stephen Weeks (sweeks@sweeks.com). *) fun merge (l1: int list, l2) = case (l1, l2) of ([], _) => l2 | (_, []) => l1 | (x1 :: l1', x2 :: l2') => if x1 <= x2 then x1 :: merge (l1', l2) else x2 :: merge (l1, l2') structure Main = struct fun doit size = let val len = 100000 val l1 = List.tabulate (len, fn i => i * 2) val l2 = List.tabulate (len, fn i => i * 2 + 1) fun test () = if 0 = hd (merge (l1, l2)) then () else raise Fail "bug" fun loop n = if n = 0 then () else (test (); loop (n - 1)) in loop size end end mlton-20100608/benchmark/tests/mlyacc.sml0000644000076600000240000107160511404435630016652 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) signature ORDSET = sig type set type elem exception Select_arb val app : (elem -> unit) -> set -> unit and card: set -> int and closure: set * (elem -> set) -> set and difference: set * set -> set and elem_eq: (elem * elem -> bool) and elem_gt : (elem * elem -> bool) and empty: set and exists: (elem * set) -> bool and find : (elem * set) -> elem option and fold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b and insert: (elem * set) -> set and is_empty: set -> bool and make_list: set -> elem list and make_set: (elem list -> set) and partition: (elem -> bool) -> (set -> set * set) and remove: (elem * set) -> set and revfold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b and select_arb: set -> elem and set_eq: (set * set) -> bool and set_gt: (set * set) -> bool and singleton: (elem -> set) and union: set * set -> set end signature TABLE = sig type 'a table type key val size : 'a table -> int val empty: 'a table val exists: (key * 'a table) -> bool val find : (key * 'a table) -> 'a option val insert: ((key * 'a) * 'a table) -> 'a table val make_table : (key * 'a ) list -> 'a table val make_list : 'a table -> (key * 'a) list val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b end signature HASH = sig type table type elem val size : table -> int val add : elem * table -> table val find : elem * table -> int option val exists : elem * table -> bool val empty : table end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:42 george * Version 109 * *) (* base.sig: Base signature file for SML-Yacc. This file contains signatures that must be loaded before any of the files produced by ML-Yacc are loaded *) (* STREAM: signature for a lazy stream.*) signature STREAM = sig type 'xa stream val streamify : (unit -> 'a) -> 'a stream val cons : 'a * 'a stream -> 'a stream val get : 'a stream -> 'a * 'a stream end (* LR_TABLE: signature for an LR Table. The list of actions and gotos passed to mkLrTable must be ordered by state number. The values for state 0 are the first in the list, the values for state 1 are next, etc. *) signature LR_TABLE = sig datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype state = STATE of int datatype term = T of int datatype nonterm = NT of int datatype action = SHIFT of state | REDUCE of int | ACCEPT | ERROR type table val numStates : table -> int val numRules : table -> int val describeActions : table -> state -> (term,action) pairlist * action val describeGoto : table -> state -> (nonterm,state) pairlist val action : table -> state * term -> action val goto : table -> state * nonterm -> state val initialState : table -> state exception Goto of state * nonterm val mkLrTable : {actions : ((term,action) pairlist * action) array, gotos : (nonterm,state) pairlist array, numStates : int, numRules : int, initialState : state} -> table end (* TOKEN: signature revealing the internal structure of a token. This signature TOKEN distinct from the signature {parser name}_TOKENS produced by ML-Yacc. The {parser name}_TOKENS structures contain some types and functions to construct tokens from values and positions. The representation of token was very carefully chosen here to allow the polymorphic parser to work without knowing the types of semantic values or line numbers. This has had an impact on the TOKENS structure produced by SML-Yacc, which is a structure parameter to lexer functors. We would like to have some type 'a token which functions to construct tokens would create. A constructor function for a integer token might be INT: int * 'a * 'a -> 'a token. This is not possible because we need to have tokens with the representation given below for the polymorphic parser. Thus our constructur functions for tokens have the form: INT: int * 'a * 'a -> (svalue,'a) token This in turn has had an impact on the signature that lexers for SML-Yacc must match and the types that a user must declare in the user declarations section of lexers. *) signature TOKEN = sig structure LrTable : LR_TABLE datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken : ('a,'b) token * ('a,'b) token -> bool end (* LR_PARSER: signature for a polymorphic LR parser *) signature LR_PARSER = sig structure Stream: STREAM structure LrTable : LR_TABLE structure Token : TOKEN sharing LrTable = Token.LrTable exception ParseError val parse : {table : LrTable.table, lexer : ('b,'c) Token.token Stream.stream, arg: 'arg, saction : int * 'c * (LrTable.state * ('b * 'c * 'c)) list * 'arg -> LrTable.nonterm * ('b * 'c * 'c) * ((LrTable.state *('b * 'c * 'c)) list), void : 'b, ec : { is_keyword : LrTable.term -> bool, noShift : LrTable.term -> bool, preferred_change : (LrTable.term list * LrTable.term list) list, errtermvalue : LrTable.term -> 'b, showTerminal : LrTable.term -> string, terms: LrTable.term list, error : string * 'c * 'c -> unit }, lookahead : int (* max amount of lookahead used in *) (* error correction *) } -> 'b * (('b,'c) Token.token Stream.stream) end (* LEXER: a signature that most lexers produced for use with SML-Yacc's output will match. The user is responsible for declaring type token, type pos, and type svalue in the UserDeclarations section of a lexer. Note that type token is abstract in the lexer. This allows SML-Yacc to create a TOKENS signature for use with lexers produced by ML-Lex that treats the type token abstractly. Lexers that are functors parametrized by a Tokens structure matching a TOKENS signature cannot examine the structure of tokens. *) signature LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue end val makeLexer : (int -> string) -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* ARG_LEXER: the %arg option of ML-Lex allows users to produce lexers which also take an argument before yielding a function from unit to a token *) signature ARG_LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue type arg end val makeLexer : (int -> string) -> UserDeclarations.arg -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* PARSER_DATA: the signature of ParserData structures in {parser name}LrValsFun produced by SML-Yacc. All such structures match this signature. The {parser name}LrValsFun produces a structure which contains all the values except for the lexer needed to call the polymorphic parser mentioned before. *) signature PARSER_DATA = sig (* the type of line numbers *) type pos (* the type of semantic values *) type svalue (* the type of the user-supplied argument to the parser *) type arg (* the intended type of the result of the parser. This value is produced by applying extract from the structure Actions to the final semantic value resultiing from a parse. *) type result structure LrTable : LR_TABLE structure Token : TOKEN sharing Token.LrTable = LrTable (* structure Actions contains the functions which mantain the semantic values stack in the parser. Void is used to provide a default value for the semantic stack. *) structure Actions : sig val actions : int * pos * (LrTable.state * (svalue * pos * pos)) list * arg-> LrTable.nonterm * (svalue * pos * pos) * ((LrTable.state *(svalue * pos * pos)) list) val void : svalue val extract : svalue -> result end (* structure EC contains information used to improve error recovery in an error-correcting parser *) structure EC : sig val is_keyword : LrTable.term -> bool val noShift : LrTable.term -> bool val preferred_change : (LrTable.term list * LrTable.term list) list val errtermvalue : LrTable.term -> svalue val showTerminal : LrTable.term -> string val terms: LrTable.term list end (* table is the LR table for the parser *) val table : LrTable.table end (* signature PARSER is the signature that most user parsers created by SML-Yacc will match. *) signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError (* type pos is the type of line numbers *) type pos (* type result is the type of the result from the parser *) type result (* the type of the user-supplied argument to the parser *) type arg (* type svalue is the type of semantic values for the semantic value stack *) type svalue (* val makeLexer is used to create a stream of tokens for the parser *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream (* val parse takes a stream of tokens and a function to print errors and returns a value of type result and a stream containing the unused tokens *) val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* signature ARG_PARSER is the signature that will be matched by parsers whose lexer takes an additional argument. *) signature ARG_PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type arg type lexarg type pos type result type svalue val makeLexer : (int -> string) -> lexarg -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* ML-Yacc Parser Generator (c) 1989, 1991 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:38 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) signature HEADER = sig type pos (*= int 1998-5-14 STW: taken out because leads to nonstandard sharing constraint on line 3386 *) val lineno : pos ref val text : string list ref type inputSource val newSource : string * TextIO.instream * TextIO.outstream -> inputSource val error : inputSource -> pos -> string -> unit val warn : inputSource -> pos -> string -> unit val errorOccurred : inputSource -> unit -> bool datatype symbol = SYMBOL of string * pos val symbolName : symbol -> string val symbolPos : symbol -> pos val symbolMake : string * int -> symbol type ty val tyName : ty -> string val tyMake : string -> ty (* associativities: each kind of associativity is assigned a unique integer *) datatype prec = LEFT | RIGHT | NONASSOC datatype control = NODEFAULT | VERBOSE | PARSER_NAME of symbol | FUNCTOR of string | START_SYM of symbol | NSHIFT of symbol list | POS of string | PURE | PARSE_ARG of string * string datatype rule = RULE of {lhs : symbol, rhs : symbol list, code : string, prec : symbol option} datatype declData = DECL of {eop : symbol list, keyword : symbol list, nonterm : (symbol * ty option) list option, prec : (prec * (symbol list)) list, change: (symbol list * symbol list) list, term : (symbol * ty option) list option, control : control list, value : (symbol * string) list} val join_decls : declData * declData * inputSource * pos -> declData type parseResult val getResult : parseResult -> string * declData * rule list end; signature PARSE_GEN_PARSER = sig structure Header : HEADER val parse : string -> Header.parseResult * Header.inputSource end; signature PARSE_GEN = sig val parseGen : string -> unit end; signature GRAMMAR = sig datatype term = T of int datatype nonterm = NT of int datatype symbol = TERM of term | NONTERM of nonterm (* grammar: terminals should be numbered from 0 to terms-1, nonterminals should be numbered from 0 to nonterms-1, rules should be numbered between 0 and (length rules) - 1, higher precedence binds tighter, start nonterminal should not occur on the rhs of any rule *) datatype grammar = GRAMMAR of {rules: {lhs : nonterm, rhs : symbol list, precedence : int option, rulenum : int } list, terms: int, nonterms: int, start : nonterm, eop : term list, noshift : term list, precedence : term -> int option, termToString : term -> string, nontermToString : nonterm -> string} end (* signature for internal version of grammar *) signature INTGRAMMAR = sig structure Grammar : GRAMMAR structure SymbolAssoc : TABLE structure NontermAssoc : TABLE sharing type SymbolAssoc.key = Grammar.symbol sharing type NontermAssoc.key = Grammar.nonterm datatype rule = RULE of {lhs : Grammar.nonterm, rhs : Grammar.symbol list, (* internal number of rule - convenient for producing LR graph *) num : int, rulenum : int, precedence : int option} val gtTerm : Grammar.term * Grammar.term -> bool val eqTerm : Grammar.term * Grammar.term -> bool val gtNonterm : Grammar.nonterm * Grammar.nonterm -> bool val eqNonterm : Grammar.nonterm * Grammar.nonterm -> bool val gtSymbol : Grammar.symbol * Grammar.symbol -> bool val eqSymbol : Grammar.symbol * Grammar.symbol -> bool (* Debugging information will be generated only if DEBUG is true. *) val DEBUG : bool val prRule : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> 'b) -> rule -> unit val prGrammar : (Grammar.symbol -> string)*(Grammar.nonterm -> string) * (string -> unit) -> Grammar.grammar -> unit end signature CORE = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR sharing Grammar = IntGrammar.Grammar datatype item = ITEM of { rule : IntGrammar.rule, dot : int, (* rhsAfter: The portion of the rhs of a rule that lies after the dot *) rhsAfter: Grammar.symbol list } (* eqItem and gtItem compare items *) val eqItem : item * item -> bool val gtItem : item * item -> bool (* functions for maintaining ordered item lists *) val insert : item * item list -> item list val union : item list * item list -> item list (* core: a set of items. It is represented by an ordered list of items. The list is in ascending order The rule numbers and the positions of the dots are used to order the items. *) datatype core = CORE of item list * int (* state # *) (* gtCore and eqCore compare the lists of items *) val gtCore : core * core -> bool val eqCore : core * core -> bool (* functions for debugging *) val prItem : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> unit) -> item -> unit val prCore : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> unit) -> core -> unit end signature CORE_UTILS = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE sharing Grammar = IntGrammar.Grammar = Core.Grammar sharing IntGrammar = Core.IntGrammar (* mkFuncs: create functions for the set of productions derived from a nonterminal, the cores that result from shift/gotos from a core, and return a list of rules *) val mkFuncs : Grammar.grammar -> { produces : Grammar.nonterm -> IntGrammar.rule list, (* shifts: take a core and compute all the cores that result from shifts/gotos on symbols *) shifts : Core.core -> (Grammar.symbol*Core.item list) list, rules: IntGrammar.rule list, (* epsProds: take a core compute epsilon productions for it *) epsProds : Core.core -> IntGrammar.rule list} end signature LRGRAPH = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE sharing Grammar = IntGrammar.Grammar = Core.Grammar sharing IntGrammar = Core.IntGrammar type graph val edges : Core.core * graph -> {edge:Grammar.symbol,to:Core.core} list val nodes : graph -> Core.core list val shift : graph -> int * Grammar.symbol -> int (* int = state # *) val core : graph -> int -> Core.core (* get core for a state *) (* mkGraph: compute the LR(0) sets of items *) val mkGraph : Grammar.grammar -> {graph : graph, produces : Grammar.nonterm -> IntGrammar.rule list, rules : IntGrammar.rule list, epsProds: Core.core -> IntGrammar.rule list} val prGraph: (Grammar.symbol -> string)*(Grammar.nonterm -> string) * (string -> unit) -> graph -> unit end signature LOOK = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR sharing Grammar = IntGrammar.Grammar val union : Grammar.term list * Grammar.term list -> Grammar.term list val make_set : Grammar.term list -> Grammar.term list val mkFuncs : {rules : IntGrammar.rule list, nonterms : int, produces : Grammar.nonterm -> IntGrammar.rule list} -> {nullable: Grammar.nonterm -> bool, first : Grammar.symbol list -> Grammar.term list} val prLook : (Grammar.term -> string) * (string -> unit) -> Grammar.term list -> unit end signature LALR_GRAPH = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE structure Graph : LRGRAPH sharing Grammar = IntGrammar.Grammar = Core.Grammar = Graph.Grammar sharing IntGrammar = Core.IntGrammar = Graph.IntGrammar sharing Core = Graph.Core datatype lcore = LCORE of (Core.item * Grammar.term list) list * int val addLookahead : {graph : Graph.graph, first : Grammar.symbol list -> Grammar.term list, eop : Grammar.term list, nonterms : int, nullable: Grammar.nonterm -> bool, produces : Grammar.nonterm -> IntGrammar.rule list, rules : IntGrammar.rule list, epsProds : Core.core -> IntGrammar.rule list, print : string -> unit, (* for debugging *) termToString : Grammar.term -> string, nontermToString : Grammar.nonterm -> string} -> lcore list val prLcore : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (Grammar.term -> string) * (string -> unit) -> lcore -> unit end (* LR_ERRS: errors found while constructing an LR table *) signature LR_ERRS = sig structure LrTable : LR_TABLE (* RR = reduce/reduce, SR = shift/reduce NS: non-shiftable terminal found on the rhs of a rule NOT_REDUCED n: rule number n was not reduced START n : start symbol found on the rhs of rule n *) datatype err = RR of LrTable.term * LrTable.state * int * int | SR of LrTable.term * LrTable.state * int | NS of LrTable.term * int | NOT_REDUCED of int | START of int val summary : err list -> {rr : int, sr: int, not_reduced : int, start : int,nonshift : int} val printSummary : (string -> unit) -> err list -> unit end (* PRINT_STRUCT: prints a structure which includes a value 'table' and a structure Table whose signature matches LR_TABLE. The table in the printed structure will contain the same information as the one passed to printStruct, although the representation may be different. It returns the number of entries left in the table after compaction.*) signature PRINT_STRUCT = sig structure LrTable : LR_TABLE val makeStruct : {table : LrTable.table, name : string, print: string -> unit, verbose : bool } -> int end (* VERBOSE: signature for a structure which takes a table and creates a verbose description of it *) signature VERBOSE = sig structure Errs : LR_ERRS val printVerbose : {table : Errs.LrTable.table, entries : int, termToString : Errs.LrTable.term -> string, nontermToString : Errs.LrTable.nonterm -> string, stateErrs : Errs.LrTable.state -> Errs.err list, errs : Errs.err list, print: string -> unit, printCores : (string -> unit) -> Errs.LrTable.state -> unit, printRule : (string -> unit) -> int -> unit} -> unit end (* MAKE_LR_TABLE: signature for a structure which includes a structure matching the signature LR_TABLE and a function which maps grammars to tables *) signature MAKE_LR_TABLE = sig structure Grammar : GRAMMAR structure Errs : LR_ERRS structure LrTable : LR_TABLE sharing Errs.LrTable = LrTable sharing type LrTable.term = Grammar.term sharing type LrTable.nonterm = Grammar.nonterm (* boolean value determines whether default reductions will be used. If it is true, reductions will be used. *) val mkTable : Grammar.grammar * bool -> LrTable.table * (LrTable.state -> Errs.err list) * (* errors in a state *) ((string -> unit) -> LrTable.state -> unit) * Errs.err list (* list of all errors *) end; (* SHRINK_LR_TABLE: finds unique action entry rows in the action table for the LR parser *) signature SHRINK_LR_TABLE = sig (* Takes an action table represented as a list of action rows. It returns the number of unique rows left in the action table, a list of integers which maps each original row to a unique row, and a list of unique rows *) structure LrTable : LR_TABLE val shrinkActionList : LrTable.table * bool -> (int * int list * ((LrTable.term,LrTable.action) LrTable.pairlist * LrTable.action) list) * int end (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:34 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) functor HeaderFun () : HEADER = struct val DEBUG = true type pos = int val lineno = ref 0 val text = ref (nil: string list) type inputSource = {name : string, errStream : TextIO.outstream, inStream : TextIO.instream, errorOccurred : bool ref} val newSource = fn (s : string,i : TextIO.instream ,errs : TextIO.outstream) => {name=s,errStream=errs,inStream=i, errorOccurred = ref false} val errorOccurred = fn (s : inputSource) =>fn () => !(#errorOccurred s) val pr = fn out : TextIO.outstream => fn s : string => TextIO.output(out,s) val error = fn {name,errStream, errorOccurred,...} : inputSource => let val pr = pr errStream in fn l : pos => fn msg : string => (pr name; pr ", line "; pr (Int.toString l); pr ": Error: "; pr msg; pr "\n"; errorOccurred := true) end val warn = fn {name,errStream, errorOccurred,...} : inputSource => let val pr = pr errStream in fn l : pos => fn msg : string => (pr name; pr ", line "; pr (Int.toString l); pr ": Warning: "; pr msg; pr "\n") end datatype prec = LEFT | RIGHT | NONASSOC datatype symbol = SYMBOL of string * pos val symbolName = fn SYMBOL(s,_) => s val symbolPos = fn SYMBOL(_,p) => p val symbolMake = fn sp => SYMBOL sp type ty = string val tyName = fn i => i val tyMake = fn i => i datatype control = NODEFAULT | VERBOSE | PARSER_NAME of symbol | FUNCTOR of string | START_SYM of symbol | NSHIFT of symbol list | POS of string | PURE | PARSE_ARG of string * string datatype declData = DECL of {eop : symbol list, keyword : symbol list, nonterm : (symbol*ty option) list option, prec : (prec * (symbol list)) list, change: (symbol list * symbol list) list, term : (symbol* ty option) list option, control : control list, value : (symbol * string) list} type rhsData = {rhs:symbol list,code:string, prec:symbol option} list datatype rule = RULE of {lhs : symbol, rhs : symbol list, code : string, prec : symbol option} type parseResult = string * declData * rule list val getResult = fn p => p fun join_decls (DECL {eop=e,control=c,keyword=k,nonterm=n,prec, change=su,term=t,value=v}:declData, DECL {eop=e',control=c',keyword=k',nonterm=n',prec=prec', change=su',term=t',value=v'} : declData, inputSource,pos) = let val ignore = fn s => (warn inputSource pos ("ignoring duplicate " ^ s ^ " declaration")) val join = fn (e,NONE,NONE) => NONE | (e,NONE,a) => a | (e,a,NONE) => a | (e,a,b) => (ignore e; a) fun mergeControl (nil,a) = [a] | mergeControl (l as h::t,a) = case (h,a) of (PARSER_NAME _,PARSER_NAME n1) => (ignore "%name"; l) | (FUNCTOR _,FUNCTOR _) => (ignore "%header"; l) | (PARSE_ARG _,PARSE_ARG _) => (ignore "%arg"; l) | (START_SYM _,START_SYM s) => (ignore "%start"; l) | (POS _,POS _) => (ignore "%pos"; l) | (NSHIFT a,NSHIFT b) => (NSHIFT (a@b)::t) | _ => h :: mergeControl(t,a) fun loop (nil,r) = r | loop (h::t,r) = loop(t,mergeControl(r,h)) in DECL {eop=e@e',control=loop(c',c),keyword=k'@k, nonterm=join("%nonterm",n,n'), prec=prec@prec', change=su@su', term=join("%term",t,t'),value=v@v'} : declData end end; structure Header = HeaderFun(); signature Mlyacc_TOKENS = sig type ('a,'b) token type svalue val BOGUS_VALUE: 'a * 'a -> (svalue,'a) token val UNKNOWN: (string) * 'a * 'a -> (svalue,'a) token val VALUE: 'a * 'a -> (svalue,'a) token val VERBOSE: 'a * 'a -> (svalue,'a) token val TYVAR: (string) * 'a * 'a -> (svalue,'a) token val TERM: 'a * 'a -> (svalue,'a) token val START: 'a * 'a -> (svalue,'a) token val SUBST: 'a * 'a -> (svalue,'a) token val RPAREN: 'a * 'a -> (svalue,'a) token val RBRACE: 'a * 'a -> (svalue,'a) token val PROG: (string) * 'a * 'a -> (svalue,'a) token val PREFER: 'a * 'a -> (svalue,'a) token val PREC_TAG: 'a * 'a -> (svalue,'a) token val PREC: (Header.prec) * 'a * 'a -> (svalue,'a) token val PERCENT_ARG: 'a * 'a -> (svalue,'a) token val PERCENT_POS: 'a * 'a -> (svalue,'a) token val PERCENT_PURE: 'a * 'a -> (svalue,'a) token val PERCENT_EOP: 'a * 'a -> (svalue,'a) token val OF: 'a * 'a -> (svalue,'a) token val NOSHIFT: 'a * 'a -> (svalue,'a) token val NONTERM: 'a * 'a -> (svalue,'a) token val NODEFAULT: 'a * 'a -> (svalue,'a) token val NAME: 'a * 'a -> (svalue,'a) token val LPAREN: 'a * 'a -> (svalue,'a) token val LBRACE: 'a * 'a -> (svalue,'a) token val KEYWORD: 'a * 'a -> (svalue,'a) token val INT: (string) * 'a * 'a -> (svalue,'a) token val PERCENT_HEADER: 'a * 'a -> (svalue,'a) token val IDDOT: (string) * 'a * 'a -> (svalue,'a) token val ID: (string*int) * 'a * 'a -> (svalue,'a) token val HEADER: (string) * 'a * 'a -> (svalue,'a) token val FOR: 'a * 'a -> (svalue,'a) token val EOF: 'a * 'a -> (svalue,'a) token val DELIMITER: 'a * 'a -> (svalue,'a) token val COMMA: 'a * 'a -> (svalue,'a) token val COLON: 'a * 'a -> (svalue,'a) token val CHANGE: 'a * 'a -> (svalue,'a) token val BAR: 'a * 'a -> (svalue,'a) token val BLOCK: 'a * 'a -> (svalue,'a) token val ASTERISK: 'a * 'a -> (svalue,'a) token val ARROW: 'a * 'a -> (svalue,'a) token end signature Mlyacc_LRVALS= sig structure Tokens : Mlyacc_TOKENS structure ParserData:PARSER_DATA sharing type ParserData.Token.token = Tokens.token sharing type ParserData.svalue = Tokens.svalue end functor MlyaccLrValsFun(structure Hdr : HEADER where type prec = Header.prec structure Token : TOKEN) = struct structure ParserData= struct structure Header = struct (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* parser for the ML parser generator *) open Hdr end structure LrTable = Token.LrTable structure Token = Token local open LrTable in val table=let val actionRows = "\ \\001\000\001\000\074\000\000\000\ \\001\000\005\000\024\000\008\000\023\000\014\000\022\000\016\000\021\000\ \\019\000\020\000\020\000\019\000\021\000\018\000\022\000\017\000\ \\024\000\016\000\025\000\015\000\026\000\014\000\027\000\013\000\ \\028\000\012\000\030\000\011\000\034\000\010\000\035\000\009\000\ \\036\000\008\000\038\000\007\000\039\000\006\000\000\000\ \\001\000\006\000\061\000\000\000\ \\001\000\006\000\072\000\000\000\ \\001\000\006\000\084\000\000\000\ \\001\000\006\000\096\000\000\000\ \\001\000\007\000\083\000\032\000\082\000\000\000\ \\001\000\009\000\000\000\000\000\ \\001\000\010\000\059\000\000\000\ \\001\000\011\000\003\000\000\000\ \\001\000\012\000\025\000\000\000\ \\001\000\012\000\027\000\000\000\ \\001\000\012\000\028\000\000\000\ \\001\000\012\000\031\000\000\000\ \\001\000\012\000\042\000\013\000\041\000\000\000\ \\001\000\012\000\042\000\013\000\041\000\017\000\040\000\031\000\039\000\ \\037\000\038\000\000\000\ \\001\000\012\000\046\000\000\000\ \\001\000\012\000\051\000\000\000\ \\001\000\012\000\069\000\015\000\068\000\000\000\ \\001\000\012\000\069\000\015\000\068\000\032\000\067\000\000\000\ \\001\000\012\000\075\000\000\000\ \\001\000\012\000\078\000\000\000\ \\001\000\012\000\099\000\000\000\ \\001\000\031\000\035\000\000\000\ \\001\000\031\000\048\000\000\000\ \\001\000\031\000\055\000\000\000\ \\001\000\031\000\098\000\000\000\ \\001\000\031\000\102\000\000\000\ \\104\000\012\000\051\000\000\000\ \\105\000\000\000\ \\106\000\000\000\ \\107\000\004\000\056\000\000\000\ \\108\000\004\000\056\000\000\000\ \\109\000\000\000\ \\110\000\000\000\ \\111\000\000\000\ \\112\000\000\000\ \\113\000\000\000\ \\114\000\000\000\ \\115\000\000\000\ \\116\000\000\000\ \\117\000\000\000\ \\118\000\000\000\ \\119\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\120\000\000\000\ \\121\000\000\000\ \\122\000\000\000\ \\123\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\124\000\000\000\ \\125\000\000\000\ \\126\000\004\000\073\000\000\000\ \\127\000\000\000\ \\128\000\000\000\ \\129\000\004\000\058\000\000\000\ \\130\000\000\000\ \\131\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\132\000\023\000\089\000\000\000\ \\133\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\134\000\023\000\057\000\000\000\ \\135\000\004\000\092\000\000\000\ \\136\000\000\000\ \\137\000\000\000\ \\138\000\000\000\ \\139\000\012\000\033\000\000\000\ \\140\000\000\000\ \\141\000\000\000\ \\142\000\000\000\ \\143\000\000\000\ \\144\000\000\000\ \\145\000\000\000\ \\146\000\000\000\ \\147\000\000\000\ \\148\000\012\000\042\000\013\000\041\000\000\000\ \\149\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\150\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\151\000\001\000\064\000\002\000\063\000\012\000\042\000\013\000\041\000\000\000\ \\152\000\000\000\ \\153\000\000\000\ \\154\000\000\000\ \\155\000\000\000\ \\156\000\000\000\ \\157\000\029\000\094\000\000\000\ \" val actionRowNumbers = "\009\000\030\000\001\000\029\000\ \\010\000\044\000\011\000\012\000\ \\013\000\063\000\063\000\023\000\ \\015\000\046\000\063\000\063\000\ \\011\000\045\000\016\000\063\000\ \\024\000\017\000\063\000\025\000\ \\031\000\058\000\034\000\053\000\ \\039\000\008\000\037\000\063\000\ \\033\000\002\000\047\000\071\000\ \\066\000\069\000\019\000\014\000\ \\076\000\035\000\040\000\032\000\ \\042\000\036\000\041\000\028\000\ \\061\000\003\000\050\000\038\000\ \\000\000\048\000\020\000\015\000\ \\013\000\021\000\062\000\015\000\ \\070\000\015\000\015\000\006\000\ \\004\000\068\000\079\000\078\000\ \\077\000\060\000\063\000\063\000\ \\063\000\056\000\057\000\052\000\ \\054\000\043\000\072\000\073\000\ \\067\000\018\000\015\000\059\000\ \\081\000\049\000\051\000\015\000\ \\005\000\075\000\063\000\026\000\ \\022\000\055\000\015\000\081\000\ \\064\000\080\000\074\000\027\000\ \\065\000\007\000" val gotoT = "\ \\001\000\101\000\000\000\ \\006\000\002\000\000\000\ \\005\000\003\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\002\000\024\000\000\000\ \\000\000\ \\013\000\028\000\014\000\027\000\000\000\ \\003\000\030\000\000\000\ \\003\000\032\000\000\000\ \\000\000\ \\007\000\035\000\017\000\034\000\000\000\ \\000\000\ \\003\000\041\000\000\000\ \\003\000\042\000\000\000\ \\002\000\043\000\000\000\ \\000\000\ \\000\000\ \\003\000\045\000\000\000\ \\000\000\ \\010\000\048\000\011\000\047\000\000\000\ \\003\000\052\000\015\000\051\000\016\000\050\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\058\000\000\000\ \\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\004\000\064\000\008\000\063\000\000\000\ \\007\000\068\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\010\000\069\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\007\000\035\000\017\000\074\000\000\000\ \\013\000\075\000\014\000\027\000\000\000\ \\000\000\ \\000\000\ \\007\000\035\000\017\000\077\000\000\000\ \\000\000\ \\007\000\035\000\017\000\078\000\000\000\ \\007\000\035\000\017\000\079\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\000\000\ \\003\000\084\000\009\000\083\000\000\000\ \\003\000\052\000\015\000\085\000\016\000\050\000\000\000\ \\003\000\086\000\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\007\000\060\000\000\000\ \\007\000\060\000\000\000\ \\000\000\ \\004\000\088\000\000\000\ \\007\000\035\000\017\000\089\000\000\000\ \\000\000\ \\012\000\091\000\000\000\ \\000\000\ \\000\000\ \\007\000\035\000\017\000\093\000\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\003\000\095\000\000\000\ \\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\007\000\035\000\017\000\098\000\000\000\ \\012\000\099\000\000\000\ \\000\000\ \\000\000\ \\007\000\060\000\000\000\ \\000\000\ \\000\000\ \\000\000\ \" val numstates = 102 val numrules = 54 val s = ref "" and index = ref 0 val string_to_int = fn () => let val i = !index in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256 end val string_to_list = fn s' => let val len = String.size s' fun f () = if !index < len then string_to_int() :: f() else nil in index := 0; s := s'; f () end val string_to_pairlist = fn (conv_key,conv_entry) => let fun f () = case string_to_int() of 0 => EMPTY | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f()) in f end val string_to_pairlist_default = fn (conv_key,conv_entry) => let val conv_row = string_to_pairlist(conv_key,conv_entry) in fn () => let val default = conv_entry(string_to_int()) val row = conv_row() in (row,default) end end val string_to_table = fn (convert_row,s') => let val len = String.size s' fun f ()= if !index < len then convert_row() :: f() else nil in (s := s'; index := 0; f ()) end local val memo = Array.array(numstates+numrules,ERROR) val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1)) fun f i = if i=numstates then g i else (Array.update(memo,i,SHIFT (STATE i)); f (i+1)) in f 0 handle Subscript => () end in val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2)) end val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT)) val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows) val actionRowNumbers = string_to_list actionRowNumbers val actionT = let val actionRowLookUp= let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end in Array.fromList(map actionRowLookUp actionRowNumbers) end in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules, numStates=numstates,initialState=STATE 0} end end local open Header in type pos = int type arg = Hdr.inputSource structure MlyValue = struct datatype svalue = VOID | ntVOID of unit -> unit | UNKNOWN of unit -> (string) | TYVAR of unit -> (string) | PROG of unit -> (string) | PREC of unit -> (Header.prec) | INT of unit -> (string) | IDDOT of unit -> (string) | ID of unit -> (string*int) | HEADER of unit -> (string) | TY of unit -> (string) | CHANGE_DEC of unit -> ( ( Hdr.symbol list * Hdr.symbol list ) ) | CHANGE_DECL of unit -> ( ( Hdr.symbol list * Hdr.symbol list ) list) | SUBST_DEC of unit -> ( ( Hdr.symbol list * Hdr.symbol list ) ) | SUBST_DECL of unit -> ( ( Hdr.symbol list * Hdr.symbol list ) list) | G_RULE_PREC of unit -> (Hdr.symbol option) | G_RULE_LIST of unit -> (Hdr.rule list) | G_RULE of unit -> (Hdr.rule list) | RHS_LIST of unit -> ({ rhs:Hdr.symbol list,code:string,prec:Hdr.symbol option } list) | RECORD_LIST of unit -> (string) | QUAL_ID of unit -> (string) | MPC_DECLS of unit -> (Hdr.declData) | MPC_DECL of unit -> (Hdr.declData) | LABEL of unit -> (string) | ID_LIST of unit -> (Hdr.symbol list) | CONSTR_LIST of unit -> ( ( Hdr.symbol * Hdr.ty option ) list) | BEGIN of unit -> (string*Hdr.declData* ( Hdr.rule list ) ) end type svalue = MlyValue.svalue type result = string*Hdr.declData* ( Hdr.rule list ) end structure EC= struct open LrTable val is_keyword = fn _ => false val preferred_change = nil val noShift = fn (T 8) => true | _ => false val showTerminal = fn (T 0) => "ARROW" | (T 1) => "ASTERISK" | (T 2) => "BLOCK" | (T 3) => "BAR" | (T 4) => "CHANGE" | (T 5) => "COLON" | (T 6) => "COMMA" | (T 7) => "DELIMITER" | (T 8) => "EOF" | (T 9) => "FOR" | (T 10) => "HEADER" | (T 11) => "ID" | (T 12) => "IDDOT" | (T 13) => "PERCENT_HEADER" | (T 14) => "INT" | (T 15) => "KEYWORD" | (T 16) => "LBRACE" | (T 17) => "LPAREN" | (T 18) => "NAME" | (T 19) => "NODEFAULT" | (T 20) => "NONTERM" | (T 21) => "NOSHIFT" | (T 22) => "OF" | (T 23) => "PERCENT_EOP" | (T 24) => "PERCENT_PURE" | (T 25) => "PERCENT_POS" | (T 26) => "PERCENT_ARG" | (T 27) => "PREC" | (T 28) => "PREC_TAG" | (T 29) => "PREFER" | (T 30) => "PROG" | (T 31) => "RBRACE" | (T 32) => "RPAREN" | (T 33) => "SUBST" | (T 34) => "START" | (T 35) => "TERM" | (T 36) => "TYVAR" | (T 37) => "VERBOSE" | (T 38) => "VALUE" | (T 39) => "UNKNOWN" | (T 40) => "BOGUS_VALUE" | _ => "bogus-term" local open Header in val errtermvalue= fn _ => MlyValue.VOID end val terms = (T 0) :: (T 1) :: (T 2) :: (T 3) :: (T 4) :: (T 5) :: (T 6 ) :: (T 7) :: (T 8) :: (T 9) :: (T 13) :: (T 15) :: (T 16) :: (T 17) :: (T 18) :: (T 19) :: (T 20) :: (T 21) :: (T 22) :: (T 23) :: (T 24) :: (T 25) :: (T 26) :: (T 28) :: (T 29) :: (T 31) :: (T 32) :: (T 33) :: (T 34) :: (T 35) :: (T 37) :: (T 38) :: (T 40) :: nil end structure Actions = struct exception mlyAction of int local open Header in val actions = fn (i392,defaultPos,stack, (inputSource):arg) => case (i392,stack) of (0,(_,(MlyValue.G_RULE_LIST G_RULE_LIST1,_,G_RULE_LIST1right))::_:: (_,(MlyValue.MPC_DECLS MPC_DECLS1,_,_))::(_,(MlyValue.HEADER HEADER1, HEADER1left,_))::rest671) => let val result=MlyValue.BEGIN(fn _ => let val HEADER as HEADER1=HEADER1 () val MPC_DECLS as MPC_DECLS1=MPC_DECLS1 () val G_RULE_LIST as G_RULE_LIST1=G_RULE_LIST1 () in (HEADER,MPC_DECLS,rev G_RULE_LIST) end ) in (LrTable.NT 0,(result,HEADER1left,G_RULE_LIST1right),rest671) end | (1,(_,(MlyValue.MPC_DECL MPC_DECL1,MPC_DECLleft,MPC_DECL1right))::(_ ,(MlyValue.MPC_DECLS MPC_DECLS1,MPC_DECLS1left,_))::rest671) => let val result=MlyValue.MPC_DECLS(fn _ => let val MPC_DECLS as MPC_DECLS1= MPC_DECLS1 () val MPC_DECL as MPC_DECL1=MPC_DECL1 () in (join_decls(MPC_DECLS,MPC_DECL,inputSource,MPC_DECLleft)) end ) in (LrTable.NT 5,(result,MPC_DECLS1left,MPC_DECL1right),rest671) end | (2,rest671) => let val result=MlyValue.MPC_DECLS(fn _ => ( DECL {prec=nil,nonterm=NONE,term=NONE,eop=nil,control=nil, keyword=nil,change=nil, value=nil} )) in (LrTable.NT 5,(result,defaultPos,defaultPos),rest671) end | (3,(_,(MlyValue.CONSTR_LIST CONSTR_LIST1,_,CONSTR_LIST1right))::(_,( _,TERM1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val CONSTR_LIST as CONSTR_LIST1=CONSTR_LIST1 () in ( DECL { prec=nil,nonterm=NONE, term = SOME CONSTR_LIST, eop =nil,control=nil, change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,TERM1left,CONSTR_LIST1right),rest671) end | (4,(_,(MlyValue.CONSTR_LIST CONSTR_LIST1,_,CONSTR_LIST1right))::(_,( _,NONTERM1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val CONSTR_LIST as CONSTR_LIST1=CONSTR_LIST1 () in ( DECL { prec=nil,control=nil,nonterm= SOME CONSTR_LIST, term = NONE, eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,NONTERM1left,CONSTR_LIST1right),rest671) end | (5,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,( MlyValue.PREC PREC1,PREC1left,_))::rest671) => let val result= MlyValue.MPC_DECL(fn _ => let val PREC as PREC1=PREC1 () val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec= [(PREC,ID_LIST)],control=nil, nonterm=NONE,term=NONE,eop=nil,change=nil, keyword=nil,value=nil} ) end ) in (LrTable.NT 4,(result,PREC1left,ID_LIST1right),rest671) end | (6,(_,(MlyValue.ID ID1,_,ID1right))::(_,(_,START1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID as ID1=ID1 () in ( DECL {prec=nil,control=[START_SYM (symbolMake ID)],nonterm=NONE, term = NONE, eop = nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,START1left,ID1right),rest671) end | (7,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(_, PERCENT_EOP1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE, eop=ID_LIST, change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PERCENT_EOP1left,ID_LIST1right),rest671) end | (8,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(_, KEYWORD1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=ID_LIST, value=nil} ) end ) in (LrTable.NT 4,(result,KEYWORD1left,ID_LIST1right),rest671) end | (9,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(_, PREFER1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=map (fn i=>([],[i])) ID_LIST,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PREFER1left,ID_LIST1right),rest671) end | (10,(_,(MlyValue.CHANGE_DECL CHANGE_DECL1,_,CHANGE_DECL1right))::(_, (_,CHANGE1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val CHANGE_DECL as CHANGE_DECL1=CHANGE_DECL1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=CHANGE_DECL,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,CHANGE1left,CHANGE_DECL1right),rest671) end | (11,(_,(MlyValue.SUBST_DECL SUBST_DECL1,_,SUBST_DECL1right))::(_,(_, SUBST1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val SUBST_DECL as SUBST_DECL1=SUBST_DECL1 () in ( DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=SUBST_DECL,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,SUBST1left,SUBST_DECL1right),rest671) end | (12,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(_, NOSHIFT1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () in ( DECL {prec=nil,control=[NSHIFT ID_LIST],nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,NOSHIFT1left,ID_LIST1right),rest671) end | (13,(_,(MlyValue.PROG PROG1,_,PROG1right))::(_,(_, PERCENT_HEADER1left,_))::rest671) => let val result=MlyValue.MPC_DECL( fn _ => let val PROG as PROG1=PROG1 () in ( DECL {prec=nil,control=[FUNCTOR PROG],nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PERCENT_HEADER1left,PROG1right),rest671) end | (14,(_,(MlyValue.ID ID1,_,ID1right))::(_,(_,NAME1left,_))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val ID as ID1=ID1 () in ( DECL {prec=nil,control=[PARSER_NAME (symbolMake ID)], nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,NAME1left,ID1right),rest671) end | (15,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.PROG PROG1,_,_ ))::(_,(_,PERCENT_ARG1left,_))::rest671) => let val result= MlyValue.MPC_DECL(fn _ => let val PROG as PROG1=PROG1 () val TY as TY1=TY1 () in ( DECL {prec=nil,control=[PARSE_ARG(PROG,TY)],nonterm=NONE, term=NONE,eop=nil,change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PERCENT_ARG1left,TY1right),rest671) end | (16,(_,(_,VERBOSE1left,VERBOSE1right))::rest671) => let val result= MlyValue.MPC_DECL(fn _ => ( DECL {prec=nil,control=[Hdr.VERBOSE], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil} )) in (LrTable.NT 4,(result,VERBOSE1left,VERBOSE1right),rest671) end | (17,(_,(_,NODEFAULT1left,NODEFAULT1right))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => ( DECL {prec=nil,control=[Hdr.NODEFAULT], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil} )) in (LrTable.NT 4,(result,NODEFAULT1left,NODEFAULT1right),rest671) end | (18,(_,(_,PERCENT_PURE1left,PERCENT_PURE1right))::rest671) => let val result=MlyValue.MPC_DECL(fn _ => ( DECL {prec=nil,control=[Hdr.PURE], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil} )) in (LrTable.NT 4,(result,PERCENT_PURE1left,PERCENT_PURE1right), rest671) end | (19,(_,(MlyValue.TY TY1,_,TY1right))::(_,(_,PERCENT_POS1left,_)):: rest671) => let val result=MlyValue.MPC_DECL(fn _ => let val TY as TY1 =TY1 () in ( DECL {prec=nil,control=[Hdr.POS TY], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil} ) end ) in (LrTable.NT 4,(result,PERCENT_POS1left,TY1right),rest671) end | (20,(_,(MlyValue.PROG PROG1,_,PROG1right))::(_,(MlyValue.ID ID1,_,_) )::(_,(_,VALUE1left,_))::rest671) => let val result=MlyValue.MPC_DECL( fn _ => let val ID as ID1=ID1 () val PROG as PROG1=PROG1 () in ( DECL {prec=nil,control=nil, nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=[(symbolMake ID,PROG)]} ) end ) in (LrTable.NT 4,(result,VALUE1left,PROG1right),rest671) end | (21,(_,(MlyValue.CHANGE_DECL CHANGE_DECL1,_,CHANGE_DECL1right))::_:: (_,(MlyValue.CHANGE_DEC CHANGE_DEC1,CHANGE_DEC1left,_))::rest671) => let val result=MlyValue.CHANGE_DECL(fn _ => let val CHANGE_DEC as CHANGE_DEC1=CHANGE_DEC1 () val CHANGE_DECL as CHANGE_DECL1=CHANGE_DECL1 () in (CHANGE_DEC :: CHANGE_DECL) end ) in (LrTable.NT 14,(result,CHANGE_DEC1left,CHANGE_DECL1right),rest671) end | (22,(_,(MlyValue.CHANGE_DEC CHANGE_DEC1,CHANGE_DEC1left, CHANGE_DEC1right))::rest671) => let val result=MlyValue.CHANGE_DECL( fn _ => let val CHANGE_DEC as CHANGE_DEC1=CHANGE_DEC1 () in ([CHANGE_DEC]) end ) in (LrTable.NT 14,(result,CHANGE_DEC1left,CHANGE_DEC1right),rest671) end | (23,(_,(MlyValue.ID_LIST ID_LIST2,_,ID_LIST2right))::_::(_,( MlyValue.ID_LIST ID_LIST1,ID_LIST1left,_))::rest671) => let val result =MlyValue.CHANGE_DEC(fn _ => let val ID_LIST1=ID_LIST1 () val ID_LIST2=ID_LIST2 () in (ID_LIST1, ID_LIST2) end ) in (LrTable.NT 15,(result,ID_LIST1left,ID_LIST2right),rest671) end | (24,(_,(MlyValue.SUBST_DECL SUBST_DECL1,_,SUBST_DECL1right))::_::(_, (MlyValue.SUBST_DEC SUBST_DEC1,SUBST_DEC1left,_))::rest671) => let val result=MlyValue.SUBST_DECL(fn _ => let val SUBST_DEC as SUBST_DEC1 =SUBST_DEC1 () val SUBST_DECL as SUBST_DECL1=SUBST_DECL1 () in (SUBST_DEC :: SUBST_DECL) end ) in (LrTable.NT 12,(result,SUBST_DEC1left,SUBST_DECL1right),rest671) end | (25,(_,(MlyValue.SUBST_DEC SUBST_DEC1,SUBST_DEC1left,SUBST_DEC1right ))::rest671) => let val result=MlyValue.SUBST_DECL(fn _ => let val SUBST_DEC as SUBST_DEC1=SUBST_DEC1 () in ([SUBST_DEC]) end ) in (LrTable.NT 12,(result,SUBST_DEC1left,SUBST_DEC1right),rest671) end | (26,(_,(MlyValue.ID ID2,_,ID2right))::_::(_,(MlyValue.ID ID1,ID1left ,_))::rest671) => let val result=MlyValue.SUBST_DEC(fn _ => let val ID1=ID1 () val ID2=ID2 () in ([symbolMake ID2],[symbolMake ID1]) end ) in (LrTable.NT 13,(result,ID1left,ID2right),rest671) end | (27,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.ID ID1,_,_)):: _::(_,(MlyValue.CONSTR_LIST CONSTR_LIST1,CONSTR_LIST1left,_))::rest671 ) => let val result=MlyValue.CONSTR_LIST(fn _ => let val CONSTR_LIST as CONSTR_LIST1=CONSTR_LIST1 () val ID as ID1=ID1 () val TY as TY1=TY1 () in ((symbolMake ID,SOME (tyMake TY))::CONSTR_LIST) end ) in (LrTable.NT 1,(result,CONSTR_LIST1left,TY1right),rest671) end | (28,(_,(MlyValue.ID ID1,_,ID1right))::_::(_,(MlyValue.CONSTR_LIST CONSTR_LIST1,CONSTR_LIST1left,_))::rest671) => let val result= MlyValue.CONSTR_LIST(fn _ => let val CONSTR_LIST as CONSTR_LIST1= CONSTR_LIST1 () val ID as ID1=ID1 () in ((symbolMake ID,NONE)::CONSTR_LIST) end ) in (LrTable.NT 1,(result,CONSTR_LIST1left,ID1right),rest671) end | (29,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.ID ID1,ID1left ,_))::rest671) => let val result=MlyValue.CONSTR_LIST(fn _ => let val ID as ID1=ID1 () val TY as TY1=TY1 () in ([(symbolMake ID,SOME (tyMake TY))]) end ) in (LrTable.NT 1,(result,ID1left,TY1right),rest671) end | (30,(_,(MlyValue.ID ID1,ID1left,ID1right))::rest671) => let val result=MlyValue.CONSTR_LIST(fn _ => let val ID as ID1=ID1 () in ([(symbolMake ID,NONE)]) end ) in (LrTable.NT 1,(result,ID1left,ID1right),rest671) end | (31,(_,(MlyValue.RHS_LIST RHS_LIST1,_,RHS_LIST1right))::_::(_,( MlyValue.ID ID1,ID1left,_))::rest671) => let val result= MlyValue.G_RULE(fn _ => let val ID as ID1=ID1 () val RHS_LIST as RHS_LIST1=RHS_LIST1 () in ( map (fn {rhs,code,prec} => Hdr.RULE {lhs=symbolMake ID,rhs=rhs, code=code,prec=prec}) RHS_LIST ) end ) in (LrTable.NT 9,(result,ID1left,RHS_LIST1right),rest671) end | (32,(_,(MlyValue.G_RULE G_RULE1,_,G_RULE1right))::(_,( MlyValue.G_RULE_LIST G_RULE_LIST1,G_RULE_LIST1left,_))::rest671) => let val result=MlyValue.G_RULE_LIST(fn _ => let val G_RULE_LIST as G_RULE_LIST1=G_RULE_LIST1 () val G_RULE as G_RULE1=G_RULE1 () in (G_RULE@G_RULE_LIST) end ) in (LrTable.NT 10,(result,G_RULE_LIST1left,G_RULE1right),rest671) end | (33,(_,(MlyValue.G_RULE G_RULE1,G_RULE1left,G_RULE1right))::rest671) => let val result=MlyValue.G_RULE_LIST(fn _ => let val G_RULE as G_RULE1=G_RULE1 () in (G_RULE) end ) in (LrTable.NT 10,(result,G_RULE1left,G_RULE1right),rest671) end | (34,(_,(MlyValue.ID_LIST ID_LIST1,_,ID_LIST1right))::(_,(MlyValue.ID ID1,ID1left,_))::rest671) => let val result=MlyValue.ID_LIST(fn _ => let val ID as ID1=ID1 () val ID_LIST as ID_LIST1=ID_LIST1 () in (symbolMake ID :: ID_LIST) end ) in (LrTable.NT 2,(result,ID1left,ID_LIST1right),rest671) end | (35,rest671) => let val result=MlyValue.ID_LIST(fn _ => (nil)) in (LrTable.NT 2,(result,defaultPos,defaultPos),rest671) end | (36,(_,(MlyValue.PROG PROG1,_,PROG1right))::(_,(MlyValue.G_RULE_PREC G_RULE_PREC1,_,_))::(_,(MlyValue.ID_LIST ID_LIST1,ID_LIST1left,_)):: rest671) => let val result=MlyValue.RHS_LIST(fn _ => let val ID_LIST as ID_LIST1=ID_LIST1 () val G_RULE_PREC as G_RULE_PREC1=G_RULE_PREC1 () val PROG as PROG1=PROG1 () in ([{rhs=ID_LIST,code=PROG,prec=G_RULE_PREC}]) end ) in (LrTable.NT 8,(result,ID_LIST1left,PROG1right),rest671) end | (37,(_,(MlyValue.PROG PROG1,_,PROG1right))::(_,(MlyValue.G_RULE_PREC G_RULE_PREC1,_,_))::(_,(MlyValue.ID_LIST ID_LIST1,_,_))::_::(_,( MlyValue.RHS_LIST RHS_LIST1,RHS_LIST1left,_))::rest671) => let val result=MlyValue.RHS_LIST(fn _ => let val RHS_LIST as RHS_LIST1= RHS_LIST1 () val ID_LIST as ID_LIST1=ID_LIST1 () val G_RULE_PREC as G_RULE_PREC1=G_RULE_PREC1 () val PROG as PROG1=PROG1 () in ({rhs=ID_LIST,code=PROG,prec=G_RULE_PREC}::RHS_LIST) end ) in (LrTable.NT 8,(result,RHS_LIST1left,PROG1right),rest671) end | (38,(_,(MlyValue.TYVAR TYVAR1,TYVAR1left,TYVAR1right))::rest671) => let val result=MlyValue.TY(fn _ => let val TYVAR as TYVAR1=TYVAR1 () in (TYVAR) end ) in (LrTable.NT 16,(result,TYVAR1left,TYVAR1right),rest671) end | (39,(_,(_,_,RBRACE1right))::(_,(MlyValue.RECORD_LIST RECORD_LIST1,_, _))::(_,(_,LBRACE1left,_))::rest671) => let val result=MlyValue.TY(fn _ => let val RECORD_LIST as RECORD_LIST1=RECORD_LIST1 () in ("{ "^RECORD_LIST^" } ") end ) in (LrTable.NT 16,(result,LBRACE1left,RBRACE1right),rest671) end | (40,(_,(_,_,RBRACE1right))::(_,(_,LBRACE1left,_))::rest671) => let val result=MlyValue.TY(fn _ => ("{}")) in (LrTable.NT 16,(result,LBRACE1left,RBRACE1right),rest671) end | (41,(_,(MlyValue.PROG PROG1,PROG1left,PROG1right))::rest671) => let val result=MlyValue.TY(fn _ => let val PROG as PROG1=PROG1 () in (" ( "^PROG^" ) ") end ) in (LrTable.NT 16,(result,PROG1left,PROG1right),rest671) end | (42,(_,(MlyValue.QUAL_ID QUAL_ID1,_,QUAL_ID1right))::(_,(MlyValue.TY TY1,TY1left,_))::rest671) => let val result=MlyValue.TY(fn _ => let val TY as TY1=TY1 () val QUAL_ID as QUAL_ID1=QUAL_ID1 () in (TY^" "^QUAL_ID) end ) in (LrTable.NT 16,(result,TY1left,QUAL_ID1right),rest671) end | (43,(_,(MlyValue.QUAL_ID QUAL_ID1,QUAL_ID1left,QUAL_ID1right)):: rest671) => let val result=MlyValue.TY(fn _ => let val QUAL_ID as QUAL_ID1=QUAL_ID1 () in (QUAL_ID) end ) in (LrTable.NT 16,(result,QUAL_ID1left,QUAL_ID1right),rest671) end | (44,(_,(MlyValue.TY TY2,_,TY2right))::_::(_,(MlyValue.TY TY1,TY1left ,_))::rest671) => let val result=MlyValue.TY(fn _ => let val TY1=TY1 () val TY2=TY2 () in (TY1^"*"^TY2) end ) in (LrTable.NT 16,(result,TY1left,TY2right),rest671) end | (45,(_,(MlyValue.TY TY2,_,TY2right))::_::(_,(MlyValue.TY TY1,TY1left ,_))::rest671) => let val result=MlyValue.TY(fn _ => let val TY1=TY1 () val TY2=TY2 () in (TY1 ^ " -> " ^ TY2) end ) in (LrTable.NT 16,(result,TY1left,TY2right),rest671) end | (46,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.LABEL LABEL1,_ ,_))::_::(_,(MlyValue.RECORD_LIST RECORD_LIST1,RECORD_LIST1left,_)):: rest671) => let val result=MlyValue.RECORD_LIST(fn _ => let val RECORD_LIST as RECORD_LIST1=RECORD_LIST1 () val LABEL as LABEL1=LABEL1 () val TY as TY1=TY1 () in (RECORD_LIST^","^LABEL^":"^TY) end ) in (LrTable.NT 7,(result,RECORD_LIST1left,TY1right),rest671) end | (47,(_,(MlyValue.TY TY1,_,TY1right))::_::(_,(MlyValue.LABEL LABEL1, LABEL1left,_))::rest671) => let val result=MlyValue.RECORD_LIST(fn _ => let val LABEL as LABEL1=LABEL1 () val TY as TY1=TY1 () in (LABEL^":"^TY) end ) in (LrTable.NT 7,(result,LABEL1left,TY1right),rest671) end | (48,(_,(MlyValue.ID ID1,ID1left,ID1right))::rest671) => let val result=MlyValue.QUAL_ID(fn _ => let val ID as ID1=ID1 () in ((fn (a,_) => a) ID) end ) in (LrTable.NT 6,(result,ID1left,ID1right),rest671) end | (49,(_,(MlyValue.QUAL_ID QUAL_ID1,_,QUAL_ID1right))::(_,( MlyValue.IDDOT IDDOT1,IDDOT1left,_))::rest671) => let val result= MlyValue.QUAL_ID(fn _ => let val IDDOT as IDDOT1=IDDOT1 () val QUAL_ID as QUAL_ID1=QUAL_ID1 () in (IDDOT^QUAL_ID) end ) in (LrTable.NT 6,(result,IDDOT1left,QUAL_ID1right),rest671) end | (50,(_,(MlyValue.ID ID1,ID1left,ID1right))::rest671) => let val result=MlyValue.LABEL(fn _ => let val ID as ID1=ID1 () in ((fn (a,_) => a) ID) end ) in (LrTable.NT 3,(result,ID1left,ID1right),rest671) end | (51,(_,(MlyValue.INT INT1,INT1left,INT1right))::rest671) => let val result=MlyValue.LABEL(fn _ => let val INT as INT1=INT1 () in (INT) end ) in (LrTable.NT 3,(result,INT1left,INT1right),rest671) end | (52,(_,(MlyValue.ID ID1,_,ID1right))::(_,(_,PREC_TAG1left,_)):: rest671) => let val result=MlyValue.G_RULE_PREC(fn _ => let val ID as ID1=ID1 () in (SOME (symbolMake ID)) end ) in (LrTable.NT 11,(result,PREC_TAG1left,ID1right),rest671) end | (53,rest671) => let val result=MlyValue.G_RULE_PREC(fn _ => (NONE)) in (LrTable.NT 11,(result,defaultPos,defaultPos),rest671) end | _ => raise (mlyAction i392) end val void = MlyValue.VOID val extract = fn a => (fn MlyValue.BEGIN x => x | _ => let exception ParseInternal in raise ParseInternal end) a () end end structure Tokens : Mlyacc_TOKENS = struct type svalue = ParserData.svalue type ('a,'b) token = ('a,'b) Token.token fun ARROW (p1,p2) = Token.TOKEN (ParserData.LrTable.T 0,( ParserData.MlyValue.VOID,p1,p2)) fun ASTERISK (p1,p2) = Token.TOKEN (ParserData.LrTable.T 1,( ParserData.MlyValue.VOID,p1,p2)) fun BLOCK (p1,p2) = Token.TOKEN (ParserData.LrTable.T 2,( ParserData.MlyValue.VOID,p1,p2)) fun BAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 3,( ParserData.MlyValue.VOID,p1,p2)) fun CHANGE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 4,( ParserData.MlyValue.VOID,p1,p2)) fun COLON (p1,p2) = Token.TOKEN (ParserData.LrTable.T 5,( ParserData.MlyValue.VOID,p1,p2)) fun COMMA (p1,p2) = Token.TOKEN (ParserData.LrTable.T 6,( ParserData.MlyValue.VOID,p1,p2)) fun DELIMITER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 7,( ParserData.MlyValue.VOID,p1,p2)) fun EOF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 8,( ParserData.MlyValue.VOID,p1,p2)) fun FOR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 9,( ParserData.MlyValue.VOID,p1,p2)) fun HEADER (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 10,( ParserData.MlyValue.HEADER (fn () => i),p1,p2)) fun ID (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 11,( ParserData.MlyValue.ID (fn () => i),p1,p2)) fun IDDOT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 12,( ParserData.MlyValue.IDDOT (fn () => i),p1,p2)) fun PERCENT_HEADER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 13,( ParserData.MlyValue.VOID,p1,p2)) fun INT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 14,( ParserData.MlyValue.INT (fn () => i),p1,p2)) fun KEYWORD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 15,( ParserData.MlyValue.VOID,p1,p2)) fun LBRACE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 16,( ParserData.MlyValue.VOID,p1,p2)) fun LPAREN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 17,( ParserData.MlyValue.VOID,p1,p2)) fun NAME (p1,p2) = Token.TOKEN (ParserData.LrTable.T 18,( ParserData.MlyValue.VOID,p1,p2)) fun NODEFAULT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 19,( ParserData.MlyValue.VOID,p1,p2)) fun NONTERM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 20,( ParserData.MlyValue.VOID,p1,p2)) fun NOSHIFT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 21,( ParserData.MlyValue.VOID,p1,p2)) fun OF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 22,( ParserData.MlyValue.VOID,p1,p2)) fun PERCENT_EOP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 23,( ParserData.MlyValue.VOID,p1,p2)) fun PERCENT_PURE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 24,( ParserData.MlyValue.VOID,p1,p2)) fun PERCENT_POS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 25,( ParserData.MlyValue.VOID,p1,p2)) fun PERCENT_ARG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 26,( ParserData.MlyValue.VOID,p1,p2)) fun PREC (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 27,( ParserData.MlyValue.PREC (fn () => i),p1,p2)) fun PREC_TAG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 28,( ParserData.MlyValue.VOID,p1,p2)) fun PREFER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 29,( ParserData.MlyValue.VOID,p1,p2)) fun PROG (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 30,( ParserData.MlyValue.PROG (fn () => i),p1,p2)) fun RBRACE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 31,( ParserData.MlyValue.VOID,p1,p2)) fun RPAREN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 32,( ParserData.MlyValue.VOID,p1,p2)) fun SUBST (p1,p2) = Token.TOKEN (ParserData.LrTable.T 33,( ParserData.MlyValue.VOID,p1,p2)) fun START (p1,p2) = Token.TOKEN (ParserData.LrTable.T 34,( ParserData.MlyValue.VOID,p1,p2)) fun TERM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 35,( ParserData.MlyValue.VOID,p1,p2)) fun TYVAR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 36,( ParserData.MlyValue.TYVAR (fn () => i),p1,p2)) fun VERBOSE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 37,( ParserData.MlyValue.VOID,p1,p2)) fun VALUE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 38,( ParserData.MlyValue.VOID,p1,p2)) fun UNKNOWN (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 39,( ParserData.MlyValue.UNKNOWN (fn () => i),p1,p2)) fun BOGUS_VALUE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 40,( ParserData.MlyValue.VOID,p1,p2)) end end (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:42 george * Version 109 * *) structure LrTable : LR_TABLE = struct open Array List infix 9 sub datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype term = T of int datatype nonterm = NT of int datatype state = STATE of int datatype action = SHIFT of state | REDUCE of int (* rulenum from grammar *) | ACCEPT | ERROR exception Goto of state * nonterm type table = {states: int, rules : int,initialState: state, action: ((term,action) pairlist * action) array, goto : (nonterm,state) pairlist array} val numStates = fn ({states,...} : table) => states val numRules = fn ({rules,...} : table) => rules val describeActions = fn ({action,...} : table) => fn (STATE s) => action sub s val describeGoto = fn ({goto,...} : table) => fn (STATE s) => goto sub s fun findTerm (T term,row,default) = let fun find (PAIR (T key,data,r)) = if key < term then find r else if key=term then data else default | find EMPTY = default in find row end fun findNonterm (NT nt,row) = let fun find (PAIR (NT key,data,r)) = if key < nt then find r else if key=nt then SOME data else NONE | find EMPTY = NONE in find row end val action = fn ({action,...} : table) => fn (STATE state,term) => let val (row,default) = action sub state in findTerm(term,row,default) end val goto = fn ({goto,...} : table) => fn (a as (STATE state,nonterm)) => case findNonterm(nonterm,goto sub state) of SOME state => state | NONE => raise (Goto a) val initialState = fn ({initialState,...} : table) => initialState val mkLrTable = fn {actions,gotos,initialState,numStates,numRules} => ({action=actions,goto=gotos, states=numStates, rules=numRules, initialState=initialState} : table) end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:43 george * Version 109 * *) (* Stream: a structure implementing a lazy stream. The signature STREAM is found in base.sig *) structure Stream :> STREAM = struct datatype 'a str = EVAL of 'a * 'a str ref | UNEVAL of (unit->'a) type 'a stream = 'a str ref fun get(ref(EVAL t)) = t | get(s as ref(UNEVAL f)) = let val t = (f(), ref(UNEVAL f)) in s := EVAL t; t end fun streamify f = ref(UNEVAL f) fun cons(a,s) = ref(EVAL(a,s)) end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/10/03 03:36:58 jhr * Qualified identifiers that are no-longer top-level (quot, rem, min, max). * * Revision 1.2 1996/02/26 15:02:29 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:42 george * Version 109 * *) (* parser.sml: This is a parser driver for LR tables with an error-recovery routine added to it. The routine used is described in detail in this article: 'A Practical Method for LR and LL Syntactic Error Diagnosis and Recovery', by M. Burke and G. Fisher, ACM Transactions on Programming Langauges and Systems, Vol. 9, No. 2, April 1987, pp. 164-197. This program is an implementation is the partial, deferred method discussed in the article. The algorithm and data structures used in the program are described below. This program assumes that all semantic actions are delayed. A semantic action should produce a function from unit -> value instead of producing the normal value. The parser returns the semantic value on the top of the stack when accept is encountered. The user can deconstruct this value and apply the unit -> value function in it to get the answer. It also assumes that the lexer is a lazy stream. Data Structures: ---------------- * The parser: The state stack has the type (state * (semantic value * line # * line #)) list The parser keeps a queue of (state stack * lexer pair). A lexer pair consists of a terminal * value pair and a lexer. This allows the parser to reconstruct the states for terminals to the left of a syntax error, and attempt to make error corrections there. The queue consists of a pair of lists (x,y). New additions to the queue are cons'ed onto y. The first element of x is the top of the queue. If x is nil, then y is reversed and used in place of x. Algorithm: ---------- * The steady-state parser: This parser keeps the length of the queue of state stacks at a steady state by always removing an element from the front when another element is placed on the end. It has these arguments: stack: current stack queue: value of the queue lexPair ((terminal,value),lex stream) When SHIFT is encountered, the state to shift to and the value are are pushed onto the state stack. The state stack and lexPair are placed on the queue. The front element of the queue is removed. When REDUCTION is encountered, the rule is applied to the current stack to yield a triple (nonterm,value,new stack). A new stack is formed by adding (goto(top state of stack,nonterm),value) to the stack. When ACCEPT is encountered, the top value from the stack and the lexer are returned. When an ERROR is encountered, fixError is called. FixError takes the arguments to the parser, fixes the error if possible and returns a new set of arguments. * The distance-parser: This parser includes an additional argument distance. It pushes elements on the queue until it has parsed distance tokens, or an ACCEPT or ERROR occurs. It returns a stack, lexer, the number of tokens left unparsed, a queue, and an action option. *) signature FIFO = sig type 'a queue val empty : 'a queue exception Empty val get : 'a queue -> 'a * 'a queue val put : 'a * 'a queue -> 'a queue end (* drt (12/15/89) -- the functor should be used in development work, but it wastes space in the release version. functor ParserGen(structure LrTable : LR_TABLE structure Stream : STREAM) : LR_PARSER = *) structure LrParser :> LR_PARSER = struct structure LrTable = LrTable structure Stream = Stream structure Token : TOKEN = struct structure LrTable = LrTable datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken = fn (TOKEN(t,_),TOKEN(t',_)) => t=t' end open LrTable open Token val DEBUG1 = false val DEBUG2 = false exception ParseError exception ParseImpossible of int structure Fifo :> FIFO = struct type 'a queue = ('a list * 'a list) val empty = (nil,nil) exception Empty fun get(a::x, y) = (a, (x,y)) | get(nil, nil) = raise Empty | get(nil, y) = get(rev y, nil) fun put(a,(x,y)) = (x,a::y) end type ('a,'b) elem = (state * ('a * 'b * 'b)) type ('a,'b) stack = ('a,'b) elem list type ('a,'b) lexv = ('a,'b) token type ('a,'b) lexpair = ('a,'b) lexv * (('a,'b) lexv Stream.stream) type ('a,'b) distanceParse = ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int -> ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int * action option type ('a,'b) ecRecord = {is_keyword : term -> bool, preferred_change : (term list * term list) list, error : string * 'b * 'b -> unit, errtermvalue : term -> 'a, terms : term list, showTerminal : term -> string, noShift : term -> bool} local val print = fn s => TextIO.output(TextIO.stdOut,s) val println = fn s => (print s; print "\n") val showState = fn (STATE s) => "STATE " ^ (Int.toString s) in fun printStack(stack: ('a,'b) stack, n: int) = case stack of (state,_) :: rest => (print("\t" ^ Int.toString n ^ ": "); println(showState state); printStack(rest, n+1)) | nil => () fun prAction showTerminal (stack as (state,_) :: _, next as (TOKEN (term,_),_), action) = (println "Parse: state stack:"; printStack(stack, 0); print(" state=" ^ showState state ^ " next=" ^ showTerminal term ^ " action=" ); case action of SHIFT state => println ("SHIFT " ^ (showState state)) | REDUCE i => println ("REDUCE " ^ (Int.toString i)) | ERROR => println "ERROR" | ACCEPT => println "ACCEPT") | prAction _ (_,_,action) = () end (* ssParse: parser which maintains the queue of (state * lexvalues) in a steady-state. It takes a table, showTerminal function, saction function, and fixError function. It parses until an ACCEPT is encountered, or an exception is raised. When an error is encountered, fixError is called with the arguments of parseStep (lexv,stack,and queue). It returns the lexv, and a new stack and queue adjusted so that the lexv can be parsed *) val ssParse = fn (table,showTerminal,saction,fixError,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(args as (lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue)) = let val nextAction = action (state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer val (_,newQueue) =Fifo.get(Fifo.put((newStack,newLexPair), queue)) in parseStep(newLexPair,(s,value)::stack,newQueue) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue) | _ => raise (ParseImpossible 197)) | ERROR => parseStep(fixError args) | ACCEPT => (case stack of (_,(topvalue,_,_)) :: _ => let val (token,restLexer) = lexPair in (topvalue,Stream.cons(token,restLexer)) end | _ => raise (ParseImpossible 202)) end | parseStep _ = raise (ParseImpossible 204) in parseStep end (* distanceParse: parse until n tokens are shifted, or accept or error are encountered. Takes a table, showTerminal function, and semantic action function. Returns a parser which takes a lexPair (lex result * lexer), a state stack, a queue, and a distance (must be > 0) to parse. The parser returns a new lex-value, a stack with the nth token shifted on top, a queue, a distance, and action option. *) val distanceParse = fn (table,showTerminal,saction,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(lexPair,stack,queue,0) = (lexPair,stack,queue,0,NONE) | parseStep(lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue,distance) = let val nextAction = action(state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer in parseStep(newLexPair,(s,value)::stack, Fifo.put((newStack,newLexPair),queue),distance-1) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue,distance) | _ => raise (ParseImpossible 240)) | ERROR => (lexPair,stack,queue,distance,SOME nextAction) | ACCEPT => (lexPair,stack,queue,distance,SOME nextAction) end | parseStep _ = raise (ParseImpossible 242) in parseStep : ('a,'b) distanceParse end (* mkFixError: function to create fixError function which adjusts parser state so that parse may continue in the presence of an error *) fun mkFixError({is_keyword,terms,errtermvalue, preferred_change,noShift, showTerminal,error,...} : ('a,'b) ecRecord, distanceParse : ('a,'b) distanceParse, minAdvance,maxAdvance) (lexv as (TOKEN (term,value as (_,leftPos,_)),_),stack,queue) = let val _ = if DEBUG2 then error("syntax error found at " ^ (showTerminal term), leftPos,leftPos) else () fun tokAt(t,p) = TOKEN(t,(errtermvalue t,p,p)) val minDelta = 3 (* pull all the state * lexv elements from the queue *) val stateList = let fun f q = let val (elem,newQueue) = Fifo.get q in elem :: (f newQueue) end handle Fifo.Empty => nil in f queue end (* now number elements of stateList, giving distance from error token *) val (_, numStateList) = List.foldr (fn (a,(num,r)) => (num+1,(a,num)::r)) (0, []) stateList (* Represent the set of potential changes as a linked list. Values of datatype Change hold information about a potential change. oper = oper to be applied pos = the # of the element in stateList that would be altered. distance = the number of tokens beyond the error token which the change allows us to parse. new = new terminal * value pair at that point orig = original terminal * value pair at the point being changed. *) datatype ('a,'b) change = CHANGE of {pos : int, distance : int, leftPos: 'b, rightPos: 'b, new : ('a,'b) lexv list, orig : ('a,'b) lexv list} val showTerms = concat o map (fn TOKEN(t,_) => " " ^ showTerminal t) val printChange = fn c => let val CHANGE {distance,new,orig,pos,...} = c in (print ("{distance= " ^ (Int.toString distance)); print (",orig ="); print(showTerms orig); print (",new ="); print(showTerms new); print (",pos= " ^ (Int.toString pos)); print "}\n") end val printChangeList = app printChange (* parse: given a lexPair, a stack, and the distance from the error token, return the distance past the error token that we are able to parse.*) fun parse (lexPair,stack,queuePos : int) = case distanceParse(lexPair,stack,Fifo.empty,queuePos+maxAdvance+1) of (_,_,_,distance,SOME ACCEPT) => if maxAdvance-distance-1 >= 0 then maxAdvance else maxAdvance-distance-1 | (_,_,_,distance,_) => maxAdvance - distance - 1 (* catList: concatenate results of scanning list *) fun catList l f = List.foldr (fn(a,r)=> f a @ r) [] l fun keywordsDelta new = if List.exists (fn(TOKEN(t,_))=>is_keyword t) new then minDelta else 0 fun tryChange{lex,stack,pos,leftPos,rightPos,orig,new} = let val lex' = List.foldr (fn (t',p)=>(t',Stream.cons p)) lex new val distance = parse(lex',stack,pos+length new-length orig) in if distance >= minAdvance + keywordsDelta new then [CHANGE{pos=pos,leftPos=leftPos,rightPos=rightPos, distance=distance,orig=orig,new=new}] else [] end (* tryDelete: Try to delete n terminals. Return single-element [success] or nil. Do not delete unshiftable terminals. *) fun tryDelete n ((stack,lexPair as (TOKEN(term,(_,l,r)),_)),qPos) = let fun del(0,accum,left,right,lexPair) = tryChange{lex=lexPair,stack=stack, pos=qPos,leftPos=left,rightPos=right, orig=rev accum, new=[]} | del(n,accum,left,right,(tok as TOKEN(term,(_,_,r)),lexer)) = if noShift term then [] else del(n-1,tok::accum,left,r,Stream.get lexer) in del(n,[],l,r,lexPair) end (* tryInsert: try to insert tokens before the current terminal; return a list of the successes *) fun tryInsert((stack,lexPair as (TOKEN(_,(_,l,_)),_)),queuePos) = catList terms (fn t => tryChange{lex=lexPair,stack=stack, pos=queuePos,orig=[],new=[tokAt(t,l)], leftPos=l,rightPos=l}) (* trySubst: try to substitute tokens for the current terminal; return a list of the successes *) fun trySubst ((stack,lexPair as (orig as TOKEN (term,(_,l,r)),lexer)), queuePos) = if noShift term then [] else catList terms (fn t => tryChange{lex=Stream.get lexer,stack=stack, pos=queuePos, leftPos=l,rightPos=r,orig=[orig], new=[tokAt(t,r)]}) (* do_delete(toks,lexPair) tries to delete tokens "toks" from "lexPair". If it succeeds, returns SOME(toks',l,r,lp), where toks' is the actual tokens (with positions and values) deleted, (l,r) are the (leftmost,rightmost) position of toks', lp is what remains of the stream after deletion *) fun do_delete(nil,lp as (TOKEN(_,(_,l,_)),_)) = SOME(nil,l,l,lp) | do_delete([t],(tok as TOKEN(t',(_,l,r)),lp')) = if t=t' then SOME([tok],l,r,Stream.get lp') else NONE | do_delete(t::rest,(tok as TOKEN(t',(_,l,r)),lp')) = if t=t' then case do_delete(rest,Stream.get lp') of SOME(deleted,l',r',lp'') => SOME(tok::deleted,l,r',lp'') | NONE => NONE else NONE fun tryPreferred((stack,lexPair),queuePos) = catList preferred_change (fn (delete,insert) => if List.exists noShift delete then [] (* should give warning at parser-generation time *) else case do_delete(delete,lexPair) of SOME(deleted,l,r,lp) => tryChange{lex=lp,stack=stack,pos=queuePos, leftPos=l,rightPos=r,orig=deleted, new=map (fn t=>(tokAt(t,r))) insert} | NONE => []) val changes = catList numStateList tryPreferred @ catList numStateList tryInsert @ catList numStateList trySubst @ catList numStateList (tryDelete 1) @ catList numStateList (tryDelete 2) @ catList numStateList (tryDelete 3) val findMaxDist = fn l => foldr (fn (CHANGE {distance,...},high) => Int.max(distance,high)) 0 l (* maxDist: max distance past error taken that we could parse *) val maxDist = findMaxDist changes (* remove changes which did not parse maxDist tokens past the error token *) val changes = catList changes (fn(c as CHANGE{distance,...}) => if distance=maxDist then [c] else []) in case changes of (l as change :: _) => let fun print_msg (CHANGE {new,orig,leftPos,rightPos,...}) = let val s = case (orig,new) of (_::_,[]) => "deleting " ^ (showTerms orig) | ([],_::_) => "inserting " ^ (showTerms new) | _ => "replacing " ^ (showTerms orig) ^ " with " ^ (showTerms new) in error ("syntax error: " ^ s,leftPos,rightPos) end val _ = (if length l > 1 andalso DEBUG2 then (print "multiple fixes possible; could fix it by:\n"; app print_msg l; print "chosen correction:\n") else (); print_msg change) (* findNth: find nth queue entry from the error entry. Returns the Nth queue entry and the portion of the queue from the beginning to the nth-1 entry. The error entry is at the end of the queue. Examples: queue = a b c d e findNth 0 = (e,a b c d) findNth 1 = (d,a b c) *) val findNth = fn n => let fun f (h::t,0) = (h,rev t) | f (h::t,n) = f(t,n-1) | f (nil,_) = let exception FindNth in raise FindNth end in f (rev stateList,n) end val CHANGE {pos,orig,new,...} = change val (last,queueFront) = findNth pos val (stack,lexPair) = last val lp1 = foldl(fn (_,(_,r)) => Stream.get r) lexPair orig val lp2 = foldr(fn(t,r)=>(t,Stream.cons r)) lp1 new val restQueue = Fifo.put((stack,lp2), foldl Fifo.put Fifo.empty queueFront) val (lexPair,stack,queue,_,_) = distanceParse(lp2,stack,restQueue,pos) in (lexPair,stack,queue) end | nil => (error("syntax error found at " ^ (showTerminal term), leftPos,leftPos); raise ParseError) end val parse = fn {arg,table,lexer,saction,void,lookahead, ec=ec as {showTerminal,...} : ('a,'b) ecRecord} => let val distance = 15 (* defer distance tokens *) val minAdvance = 1 (* must parse at least 1 token past error *) val maxAdvance = Int.max(lookahead,0)(* max distance for parse check *) val lexPair = Stream.get lexer val (TOKEN (_,(_,leftPos,_)),_) = lexPair val startStack = [(initialState table,(void,leftPos,leftPos))] val startQueue = Fifo.put((startStack,lexPair),Fifo.empty) val distanceParse = distanceParse(table,showTerminal,saction,arg) val fixError = mkFixError(ec,distanceParse,minAdvance,maxAdvance) val ssParse = ssParse(table,showTerminal,saction,fixError,arg) fun loop (lexPair,stack,queue,_,SOME ACCEPT) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,0,_) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,distance,SOME ERROR) = let val (lexPair,stack,queue) = fixError(lexPair,stack,queue) in loop (distanceParse(lexPair,stack,queue,distance)) end | loop _ = let exception ParseInternal in raise ParseInternal end in loop (distanceParse(lexPair,startStack,startQueue,distance)) end end; (* drt (12/15/89) -- needed only when the code above is functorized structure LrParser = ParserGen(structure LrTable=LrTable structure Stream=Stream); *) functor LexMLYACC(structure Tokens : Mlyacc_TOKENS structure Hdr : HEADER where type prec = Header.prec and type inputSource = Header.inputSource and type pos = int) : ARG_LEXER = struct structure UserDeclarations = struct (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi yacc.lex: Lexer specification *) structure Tokens = Tokens type svalue = Tokens.svalue type pos = int type ('a,'b) token = ('a,'b) Tokens.token type lexresult = (svalue,pos) token type lexarg = Hdr.inputSource type arg = lexarg open Tokens val error = Hdr.error val lineno = Hdr.lineno val text = Hdr.text val pcount = ref 0 val commentLevel = ref 0 val actionstart = ref 0 val eof = fn i => (if (!pcount)>0 then error i (!actionstart) " eof encountered in action beginning here !" else (); EOF(!lineno,!lineno)) val Add = fn s => (text := s::(!text)) local val dict = [("%prec",PREC_TAG),("%term",TERM), ("%nonterm",NONTERM), ("%eop",PERCENT_EOP),("%start",START), ("%prefer",PREFER),("%subst",SUBST),("%change",CHANGE), ("%keyword",KEYWORD),("%name",NAME), ("%verbose",VERBOSE), ("%nodefault",NODEFAULT), ("%value",VALUE), ("%noshift",NOSHIFT), ("%header",PERCENT_HEADER),("%pure",PERCENT_PURE), ("%arg",PERCENT_ARG), ("%pos",PERCENT_POS)] in val lookup = fn (s,left,right) => let fun f ((a,d)::b) = if a=s then d(left,right) else f b | f nil = UNKNOWN(s,left,right) in f dict end end fun inc (ri as ref i) = (ri := i+1) fun dec (ri as ref i) = (ri := i-1) end (* end of user routines *) exception LexError (* raised if illegal leaf action tried *) structure Internal = struct datatype yyfinstate = N of int type statedata = {fin : yyfinstate list, trans: string} (* transition & final state table *) val tab = let val s0 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s1 = "\015\015\015\015\015\015\015\015\015\015\021\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\019\015\015\017\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\ \\015" val s3 = "\022\022\022\022\022\022\022\022\022\065\067\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\065\022\022\022\022\045\022\043\041\022\040\022\039\037\022\022\ \\035\035\035\035\035\035\035\035\035\035\034\022\022\022\022\022\ \\022\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\ \\026\026\026\026\026\026\026\026\026\026\026\022\022\022\022\022\ \\022\026\026\026\026\026\031\026\026\026\026\026\026\026\026\029\ \\026\026\026\026\026\026\026\026\026\026\026\025\024\023\022\022\ \\022" val s5 = "\068\068\068\068\068\068\068\068\068\068\021\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\072\068\068\068\068\068\070\069\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068" val s7 = "\073\073\073\073\073\073\073\073\073\075\021\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\075\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\074\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\073\ \\073" val s9 = "\077\077\077\077\077\077\077\077\077\077\021\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\081\080\078\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077" val s11 = "\083\083\083\083\083\083\083\083\083\083\088\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\087\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\084\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083" val s13 = "\089\089\089\089\089\089\089\089\089\089\021\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\093\092\090\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089" val s15 = "\016\016\016\016\016\016\016\016\016\016\000\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\000\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016" val s17 = "\016\016\016\016\016\016\016\016\016\016\000\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\000\016\016\016\016\018\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\ \\016" val s19 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s26 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\027\000\000\000\000\000\000\028\000\ \\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\000\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\027\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\ \\000" val s29 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\027\000\000\000\000\000\000\028\000\ \\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\000\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\027\ \\000\027\027\027\027\027\030\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\ \\000" val s31 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\027\000\000\000\000\000\000\028\000\ \\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\000\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\027\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\032\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\ \\000" val s32 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\027\000\000\000\000\000\000\028\000\ \\027\027\027\027\027\027\027\027\027\027\000\000\000\000\000\000\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\000\000\000\000\027\ \\000\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\033\027\027\027\027\027\027\027\027\000\000\000\000\000\ \\000" val s35 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\036\036\036\036\036\036\036\036\036\036\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s37 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\038\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s41 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\042\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s43 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\044\000\000\000\000\000\000\000\000\ \\044\044\044\044\044\044\044\044\044\044\000\000\000\000\000\000\ \\000\044\044\044\044\044\044\044\044\044\044\044\044\044\044\044\ \\044\044\044\044\044\044\044\044\044\044\044\000\000\000\000\044\ \\000\044\044\044\044\044\044\044\044\044\044\044\044\044\044\044\ \\044\044\044\044\044\044\044\044\044\044\044\000\000\000\000\000\ \\000" val s45 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\064\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\060\046\052\046\ \\046\046\047\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s46 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s47 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\048\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s48 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\049\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s49 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\050\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s50 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\051\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s52 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\053\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s53 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\054\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s54 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\055\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s55 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\056\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s56 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\057\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s57 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\058\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s58 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\059\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s60 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\061\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s61 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\062\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s62 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\ \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ \\046\046\046\046\063\046\046\046\046\046\046\000\000\000\000\000\ \\000" val s65 = "\000\000\000\000\000\000\000\000\000\066\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\066\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s68 = "\068\068\068\068\068\068\068\068\068\068\000\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\000\068\068\068\068\068\000\000\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\068\ \\068" val s70 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\071\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s75 = "\000\000\000\000\000\000\000\000\000\076\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\076\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s77 = "\077\077\077\077\077\077\077\077\077\077\000\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\000\000\000\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\077\ \\077" val s78 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\079\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s81 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\082\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s83 = "\083\083\083\083\083\083\083\083\083\083\000\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\000\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\000\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\083\ \\083" val s84 = "\000\000\000\000\000\000\000\000\000\086\086\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\086\000\085\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s89 = "\089\089\089\089\089\089\089\089\089\089\000\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\000\000\000\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\089\ \\089" val s90 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\091\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" val s93 = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\094\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" in Vector.fromList [{fin = [], trans = s0}, {fin = [], trans = s1}, {fin = [], trans = s1}, {fin = [], trans = s3}, {fin = [], trans = s3}, {fin = [], trans = s5}, {fin = [], trans = s5}, {fin = [], trans = s7}, {fin = [], trans = s7}, {fin = [], trans = s9}, {fin = [], trans = s9}, {fin = [], trans = s11}, {fin = [], trans = s11}, {fin = [], trans = s13}, {fin = [], trans = s13}, {fin = [(N 11),(N 18)], trans = s15}, {fin = [(N 11)], trans = s15}, {fin = [(N 11),(N 18)], trans = s17}, {fin = [(N 2),(N 11)], trans = s15}, {fin = [(N 18)], trans = s19}, {fin = [(N 14)], trans = s0}, {fin = [(N 16)], trans = s0}, {fin = [(N 94)], trans = s0}, {fin = [(N 36),(N 94)], trans = s0}, {fin = [(N 87),(N 94)], trans = s0}, {fin = [(N 34),(N 94)], trans = s0}, {fin = [(N 90),(N 94)], trans = s26}, {fin = [(N 90)], trans = s26}, {fin = [(N 77)], trans = s0}, {fin = [(N 90),(N 94)], trans = s29}, {fin = [(N 28),(N 90)], trans = s26}, {fin = [(N 90),(N 94)], trans = s31}, {fin = [(N 90)], trans = s32}, {fin = [(N 32),(N 90)], trans = s26}, {fin = [(N 85),(N 94)], trans = s0}, {fin = [(N 80),(N 94)], trans = s35}, {fin = [(N 80)], trans = s35}, {fin = [(N 94)], trans = s37}, {fin = [(N 43)], trans = s0}, {fin = [(N 38),(N 94)], trans = s0}, {fin = [(N 40),(N 94)], trans = s0}, {fin = [(N 92),(N 94)], trans = s41}, {fin = [(N 5)], trans = s0}, {fin = [(N 73),(N 94)], trans = s43}, {fin = [(N 73)], trans = s43}, {fin = [(N 94)], trans = s45}, {fin = [(N 70)], trans = s46}, {fin = [(N 70)], trans = s47}, {fin = [(N 70)], trans = s48}, {fin = [(N 70)], trans = s49}, {fin = [(N 70)], trans = s50}, {fin = [(N 56),(N 70)], trans = s46}, {fin = [(N 70)], trans = s52}, {fin = [(N 70)], trans = s53}, {fin = [(N 70)], trans = s54}, {fin = [(N 70)], trans = s55}, {fin = [(N 70)], trans = s56}, {fin = [(N 70)], trans = s57}, {fin = [(N 70)], trans = s58}, {fin = [(N 66),(N 70)], trans = s46}, {fin = [(N 70)], trans = s60}, {fin = [(N 70)], trans = s61}, {fin = [(N 70)], trans = s62}, {fin = [(N 49),(N 70)], trans = s46}, {fin = [(N 83)], trans = s0}, {fin = [(N 25),(N 94)], trans = s65}, {fin = [(N 25)], trans = s65}, {fin = [(N 20)], trans = s0}, {fin = [(N 103)], trans = s68}, {fin = [(N 98)], trans = s0}, {fin = [(N 96)], trans = s70}, {fin = [(N 8)], trans = s0}, {fin = [(N 100)], trans = s0}, {fin = [(N 147)], trans = s0}, {fin = [(N 145),(N 147)], trans = s0}, {fin = [(N 143),(N 147)], trans = s75}, {fin = [(N 143)], trans = s75}, {fin = [(N 114)], trans = s77}, {fin = [(N 105)], trans = s78}, {fin = [(N 108)], trans = s0}, {fin = [(N 105)], trans = s0}, {fin = [(N 105)], trans = s81}, {fin = [(N 111)], trans = s0}, {fin = [(N 134)], trans = s83}, {fin = [(N 129)], trans = s84}, {fin = [(N 137)], trans = s0}, {fin = [(N 140)], trans = s0}, {fin = [(N 127)], trans = s0}, {fin = [(N 131)], trans = s0}, {fin = [(N 125)], trans = s89}, {fin = [(N 116)], trans = s90}, {fin = [(N 119)], trans = s0}, {fin = [(N 116)], trans = s0}, {fin = [(N 116)], trans = s93}, {fin = [(N 122)], trans = s0}] end structure StartStates = struct datatype yystartstate = STARTSTATE of int (* start state definitions *) val A = STARTSTATE 3; val CODE = STARTSTATE 5; val COMMENT = STARTSTATE 9; val EMPTYCOMMENT = STARTSTATE 13; val F = STARTSTATE 7; val INITIAL = STARTSTATE 1; val STRING = STARTSTATE 11; end type result = UserDeclarations.lexresult exception LexerError (* raised if illegal leaf action tried *) end fun makeLexer yyinput = let val yyb = ref "\n" (* buffer *) val yybl = ref 1 (*buffer length *) val yybufpos = ref 1 (* location of next character to use *) val yygone = ref 1 (* position in file of beginning of buffer *) val yydone = ref false (* eof found yet? *) val yybegin = ref 1 (*Current 'start state' for lexer *) val YYBEGIN = fn (Internal.StartStates.STARTSTATE x) => yybegin := x fun lex (yyarg as (inputSource)) = let fun continue() : Internal.result = let fun scan (s,AcceptingLeaves : Internal.yyfinstate list list,l,i0) = let fun action (i,nil) = raise LexError | action (i,nil::l) = action (i-1,l) | action (i,(node::acts)::l) = case node of Internal.N yyk => (let val yytext = substring(!yyb,i0,i-i0) val yypos = i0+ !yygone open UserDeclarations Internal.StartStates in (yybufpos := i; case yyk of (* Application actions *) 100 => (Add yytext; YYBEGIN STRING; continue()) | 103 => (Add yytext; continue()) | 105 => (Add yytext; continue()) | 108 => (Add yytext; dec commentLevel; if !commentLevel=0 then BOGUS_VALUE(!lineno,!lineno) else continue() ) | 11 => (Add yytext; continue()) | 111 => (Add yytext; inc commentLevel; continue()) | 114 => (Add yytext; continue()) | 116 => (continue()) | 119 => (dec commentLevel; if !commentLevel=0 then YYBEGIN A else (); continue ()) | 122 => (inc commentLevel; continue()) | 125 => (continue()) | 127 => (Add yytext; YYBEGIN CODE; continue()) | 129 => (Add yytext; continue()) | 131 => (Add yytext; error inputSource (!lineno) "unclosed string"; inc lineno; YYBEGIN CODE; continue()) | 134 => (Add yytext; continue()) | 137 => (Add yytext; continue()) | 14 => (YYBEGIN A; HEADER (concat (rev (!text)),!lineno,!lineno)) | 140 => (Add yytext; if substring(yytext,1,1)="\n" then inc lineno else (); YYBEGIN F; continue()) | 143 => (Add yytext; continue()) | 145 => (Add yytext; YYBEGIN STRING; continue()) | 147 => (Add yytext; error inputSource (!lineno) "unclosed string"; YYBEGIN CODE; continue()) | 16 => (Add yytext; inc lineno; continue()) | 18 => (Add yytext; continue()) | 2 => (Add yytext; YYBEGIN COMMENT; commentLevel := 1; continue() before YYBEGIN INITIAL) | 20 => (inc lineno; continue ()) | 25 => (continue()) | 28 => (OF(!lineno,!lineno)) | 32 => (FOR(!lineno,!lineno)) | 34 => (LBRACE(!lineno,!lineno)) | 36 => (RBRACE(!lineno,!lineno)) | 38 => (COMMA(!lineno,!lineno)) | 40 => (ASTERISK(!lineno,!lineno)) | 43 => (ARROW(!lineno,!lineno)) | 49 => (PREC(Hdr.LEFT,!lineno,!lineno)) | 5 => (YYBEGIN EMPTYCOMMENT; commentLevel := 1; continue()) | 56 => (PREC(Hdr.RIGHT,!lineno,!lineno)) | 66 => (PREC(Hdr.NONASSOC,!lineno,!lineno)) | 70 => (lookup(yytext,!lineno,!lineno)) | 73 => (TYVAR(yytext,!lineno,!lineno)) | 77 => (IDDOT(yytext,!lineno,!lineno)) | 8 => (Add yytext; YYBEGIN COMMENT; commentLevel := 1; continue() before YYBEGIN CODE) | 80 => (INT (yytext,!lineno,!lineno)) | 83 => (DELIMITER(!lineno,!lineno)) | 85 => (COLON(!lineno,!lineno)) | 87 => (BAR(!lineno,!lineno)) | 90 => (ID ((yytext,!lineno),!lineno,!lineno)) | 92 => (pcount := 1; actionstart := (!lineno); text := nil; YYBEGIN CODE; continue() before YYBEGIN A) | 94 => (UNKNOWN(yytext,!lineno,!lineno)) | 96 => (inc pcount; Add yytext; continue()) | 98 => (dec pcount; if !pcount = 0 then PROG (concat (rev (!text)),!lineno,!lineno) else (Add yytext; continue())) | _ => raise Internal.LexerError ) end ) val {fin,trans} = Vector.sub(Internal.tab, s) val NewAcceptingLeaves = fin::AcceptingLeaves in if l = !yybl then if trans = #trans(Vector.sub(Internal.tab,0)) then action(l,NewAcceptingLeaves ) else let val newchars= if !yydone then "" else yyinput 1024 in if (size newchars)=0 then (yydone := true; if (l=i0) then UserDeclarations.eof yyarg else action(l,NewAcceptingLeaves)) else (if i0=l then yyb := newchars else yyb := substring(!yyb,i0,l-i0)^newchars; yygone := !yygone+i0; yybl := size (!yyb); scan (s,AcceptingLeaves,l-i0,0)) end else let val NewChar = Char.ord(String.sub(!yyb,l)) val NewState = if NewChar<128 then Char.ord(String.sub(trans,NewChar)) else Char.ord(String.sub(trans,128)) in if NewState=0 then action(l,NewAcceptingLeaves) else scan(NewState,NewAcceptingLeaves,l+1,i0) end end (* val start= if substring(!yyb,!yybufpos-1,1)="\n" then !yybegin+1 else !yybegin *) in scan(!yybegin (* start *),nil,!yybufpos,!yybufpos) end in continue end in lex end end (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:42 george * Version 109 * *) (* functor Join creates a user parser by putting together a Lexer structure, an LrValues structure, and a polymorphic parser structure. Note that the Lexer and LrValues structure must share the type pos (i.e. the type of line numbers), the type svalues for semantic values, and the type of tokens. *) functor Join(structure Lex : LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = LrParser.Stream.streamify o Lex.makeLexer val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end (* functor JoinWithArg creates a variant of the parser structure produced above. In this case, the makeLexer take an additional argument before yielding a value of type unit -> (svalue,pos) token *) functor JoinWithArg(structure Lex : ARG_LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : ARG_PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type lexarg = Lex.UserDeclarations.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = fn s => fn arg => LrParser.Stream.streamify (Lex.makeLexer s arg) val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:38 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) functor ParseGenParserFun(S : sig structure Parser : ARG_PARSER structure Header : HEADER sharing type Parser.pos = Header.pos sharing type Parser.result = Header.parseResult sharing type Parser.arg = Header.inputSource = Parser.lexarg end where type Header.pos = int ) : PARSE_GEN_PARSER = struct open S structure Header = Header val parse = fn file => let val in_str = TextIO.openIn file val source = Header.newSource(file,in_str,TextIO.stdOut) val error = fn (s : string,i:int,_) => Header.error source i s val stream = Parser.makeLexer (fn i => (TextIO.inputN(in_str,i))) source val (result,_) = (Header.lineno := 1; Header.text := nil; Parser.parse(15,stream,error,source)) in (TextIO.closeIn in_str; (result,source)) end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:47 george * Version 109 * *) (* Implementation of ordered sets using ordered lists and red-black trees. The code for red-black trees was originally written by Norris Boyd, which was modified for use here. *) (* ordered sets implemented using ordered lists. Upper bound running times for functions implemented here: app = O(n) card = O(n) closure = O(n^2) difference = O(n+m), where n,m = the size of the two sets used here. empty = O(1) exists = O(n) find = O(n) fold = O(n) insert = O(n) is_empty = O(1) make_list = O(1) make_set = O(n^2) partition = O(n) remove = O(n) revfold = O(n) select_arb = O(1) set_eq = O(n), where n = the cardinality of the smaller set set_gt = O(n), ditto singleton = O(1) union = O(n+m) *) functor ListOrdSet(B : sig type elem val gt : elem * elem -> bool val eq : elem * elem -> bool end ) : ORDSET = struct type elem = B.elem val elem_gt = B.gt val elem_eq = B.eq type set = elem list exception Select_arb val empty = nil val insert = fn (key,s) => let fun f (l as (h::t)) = if elem_gt(key,h) then h::(f t) else if elem_eq(key,h) then key::t else key::l | f nil = [key] in f s end val select_arb = fn nil => raise Select_arb | a::b => a val exists = fn (key,s) => let fun f (h::t) = if elem_gt(key,h) then f t else elem_eq(h,key) | f nil = false in f s end val find = fn (key,s) => let fun f (h::t) = if elem_gt(key,h) then f t else if elem_eq(h,key) then SOME h else NONE | f nil = NONE in f s end fun revfold f lst init = List.foldl f init lst fun fold f lst init = List.foldr f init lst val app = List.app fun set_eq(h::t,h'::t') = (case elem_eq(h,h') of true => set_eq(t,t') | a => a) | set_eq(nil,nil) = true | set_eq _ = false fun set_gt(h::t,h'::t') = (case elem_gt(h,h') of false => (case (elem_eq(h,h')) of true => set_gt(t,t') | a => a) | a => a) | set_gt(_::_,nil) = true | set_gt _ = false fun union(a as (h::t),b as (h'::t')) = if elem_gt(h',h) then h::union(t,b) else if elem_eq(h,h') then h::union(t,t') else h'::union(a,t') | union(nil,s) = s | union(s,nil) = s val make_list = fn s => s val is_empty = fn nil => true | _ => false val make_set = fn l => List.foldr insert [] l val partition = fn f => fn s => fold (fn (e,(yes,no)) => if (f e) then (e::yes,no) else (e::no,yes)) s (nil,nil) val remove = fn (e,s) => let fun f (l as (h::t)) = if elem_gt(h,e) then l else if elem_eq(h,e) then t else h::(f t) | f nil = nil in f s end (* difference: X-Y *) fun difference (nil,_) = nil | difference (r,nil) = r | difference (a as (h::t),b as (h'::t')) = if elem_gt (h',h) then h::difference(t,b) else if elem_eq(h',h) then difference(t,t') else difference(a,t') fun singleton X = [X] fun card(S) = fold (fn (a,count) => count+1) S 0 local fun closure'(from, f, result) = if is_empty from then result else let val (more,result) = fold (fn (a,(more',result')) => let val more = f a val new = difference(more,result) in (union(more',new),union(result',new)) end) from (empty,result) in closure'(more,f,result) end in fun closure(start, f) = closure'(start, f, start) end end (* ordered set implemented using red-black trees: Upper bound running time of the functions below: app: O(n) card: O(n) closure: O(n^2 ln n) difference: O(n ln n) empty: O(1) exists: O(ln n) find: O(ln n) fold: O(n) insert: O(ln n) is_empty: O(1) make_list: O(n) make_set: O(n ln n) partition: O(n ln n) remove: O(n ln n) revfold: O(n) select_arb: O(1) set_eq: O(n) set_gt: O(n) singleton: O(1) union: O(n ln n) *) functor RbOrdSet (B : sig type elem val eq : (elem*elem) -> bool val gt : (elem*elem) -> bool end ) : ORDSET = struct type elem = B.elem val elem_gt = B.gt val elem_eq = B.eq datatype Color = RED | BLACK abstype set = EMPTY | TREE of (B.elem * Color * set * set) with exception Select_arb val empty = EMPTY fun insert(key,t) = let fun f EMPTY = TREE(key,RED,EMPTY,EMPTY) | f (TREE(k,BLACK,l,r)) = if elem_gt (key,k) then case f r of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll), TREE(rk,RED,rlr,rr))) | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr)) | r => TREE(k,BLACK,l,r) else if elem_gt(k,key) then case f l of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl), TREE(k,RED,lrr,r))) | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r))) | l => TREE(k,BLACK,l,r) else TREE(key,BLACK,l,r) | f (TREE(k,RED,l,r)) = if elem_gt(key,k) then TREE(k,RED,l, f r) else if elem_gt(k,key) then TREE(k,RED, f l, r) else TREE(key,RED,l,r) in case f t of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r) | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r) | t => t end fun select_arb (TREE(k,_,l,r)) = k | select_arb EMPTY = raise Select_arb fun exists(key,t) = let fun look EMPTY = false | look (TREE(k,_,l,r)) = if elem_gt(k,key) then look l else if elem_gt(key,k) then look r else true in look t end fun find(key,t) = let fun look EMPTY = NONE | look (TREE(k,_,l,r)) = if elem_gt(k,key) then look l else if elem_gt(key,k) then look r else SOME k in look t end fun revfold f t start = let fun scan (EMPTY,value) = value | scan (TREE(k,_,l,r),value) = scan(r,f(k,scan(l,value))) in scan(t,start) end fun fold f t start = let fun scan(EMPTY,value) = value | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value))) in scan(t,start) end fun app f t = let fun scan EMPTY = () | scan(TREE(k,_,l,r)) = (scan l; f k; scan r) in scan t end (* equal_tree : test if two trees are equal. Two trees are equal if the set of leaves are equal *) fun set_eq (tree1 as (TREE _),tree2 as (TREE _)) = let datatype pos = L | R | M exception Done fun getvalue(stack as ((a,position)::b)) = (case a of (TREE(k,_,l,r)) => (case position of L => getvalue ((l,L)::(a,M)::b) | M => (k,case r of EMPTY => b | _ => (a,R)::b) | R => getvalue ((r,L)::b) ) | EMPTY => getvalue b ) | getvalue(nil) = raise Done fun f (nil,nil) = true | f (s1 as (_ :: _),s2 as (_ :: _ )) = let val (v1,news1) = getvalue s1 and (v2,news2) = getvalue s2 in (elem_eq(v1,v2)) andalso f(news1,news2) end | f _ = false in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false end | set_eq (EMPTY,EMPTY) = true | set_eq _ = false (* gt_tree : Test if tree1 is greater than tree 2 *) fun set_gt (tree1,tree2) = let datatype pos = L | R | M exception Done fun getvalue(stack as ((a,position)::b)) = (case a of (TREE(k,_,l,r)) => (case position of L => getvalue ((l,L)::(a,M)::b) | M => (k,case r of EMPTY => b | _ => (a,R)::b) | R => getvalue ((r,L)::b) ) | EMPTY => getvalue b ) | getvalue(nil) = raise Done fun f (nil,nil) = false | f (s1 as (_ :: _),s2 as (_ :: _ )) = let val (v1,news1) = getvalue s1 and (v2,news2) = getvalue s2 in (elem_gt(v1,v2)) orelse (elem_eq(v1,v2) andalso f(news1,news2)) end | f (_,nil) = true | f (nil,_) = false in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false end fun is_empty S = (let val _ = select_arb S in false end handle Select_arb => true) fun make_list S = fold (op ::) S nil fun make_set l = List.foldr insert empty l fun partition F S = fold (fn (a,(Yes,No)) => if F(a) then (insert(a,Yes),No) else (Yes,insert(a,No))) S (empty,empty) fun remove(X, XSet) = let val (YSet, _) = partition (fn a => not (elem_eq (X, a))) XSet in YSet end fun difference(Xs, Ys) = fold (fn (p as (a,Xs')) => if exists(a,Ys) then Xs' else insert p) Xs empty fun singleton X = insert(X,empty) fun card(S) = fold (fn (_,count) => count+1) S 0 fun union(Xs,Ys)= fold insert Ys Xs local fun closure'(from, f, result) = if is_empty from then result else let val (more,result) = fold (fn (a,(more',result')) => let val more = f a val new = difference(more,result) in (union(more',new),union(result',new)) end) from (empty,result) in closure'(more,f,result) end in fun closure(start, f) = closure'(start, f, start) end end end (* signature TABLE = sig type 'a table type key val size : 'a table -> int val empty: 'a table val exists: (key * 'a table) -> bool val find : (key * 'a table) -> 'a option val insert: ((key * 'a) * 'a table) -> 'a table val make_table : (key * 'a ) list -> 'a table val make_list : 'a table -> (key * 'a) list val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b end *) functor Table (B : sig type key val gt : (key * key) -> bool end ) : TABLE = struct datatype Color = RED | BLACK type key = B.key abstype 'a table = EMPTY | TREE of ((B.key * 'a ) * Color * 'a table * 'a table) with val empty = EMPTY fun insert(elem as (key,data),t) = let val key_gt = fn (a,_) => B.gt(key,a) val key_lt = fn (a,_) => B.gt(a,key) fun f EMPTY = TREE(elem,RED,EMPTY,EMPTY) | f (TREE(k,BLACK,l,r)) = if key_gt k then case f r of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll), TREE(rk,RED,rlr,rr))) | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr)) | r => TREE(k,BLACK,l,r) else if key_lt k then case f l of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl), TREE(k,RED,lrr,r))) | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r))) | l => TREE(k,BLACK,l,r) else TREE(elem,BLACK,l,r) | f (TREE(k,RED,l,r)) = if key_gt k then TREE(k,RED,l, f r) else if key_lt k then TREE(k,RED, f l, r) else TREE(elem,RED,l,r) in case f t of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r) | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r) | t => t end fun exists(key,t) = let fun look EMPTY = false | look (TREE((k,_),_,l,r)) = if B.gt(k,key) then look l else if B.gt(key,k) then look r else true in look t end fun find(key,t) = let fun look EMPTY = NONE | look (TREE((k,data),_,l,r)) = if B.gt(k,key) then look l else if B.gt(key,k) then look r else SOME data in look t end fun fold f t start = let fun scan(EMPTY,value) = value | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value))) in scan(t,start) end fun make_table l = List.foldr insert empty l fun size S = fold (fn (_,count) => count+1) S 0 fun make_list table = fold (op ::) table nil end end; (* assumes that a functor Table with signature TABLE from table.sml is in the environment *) (* signature HASH = sig type table type elem val size : table -> int val add : elem * table -> table val find : elem * table -> int option val exists : elem * table -> bool val empty : table end *) (* hash: creates a hash table of size n which assigns each distinct member a unique integer between 0 and n-1 *) functor Hash(B : sig type elem val gt : elem * elem -> bool end) : HASH = struct type elem=B.elem structure HashTable = Table(type key=B.elem val gt = B.gt) type table = {count : int, table : int HashTable.table} val empty = {count=0,table=HashTable.empty} val size = fn {count,table} => count val add = fn (e,{count,table}) => {count=count+1,table=HashTable.insert((e,count),table)} val find = fn (e,{table,count}) => HashTable.find(e,table) val exists = fn (e,{table,count}) => HashTable.exists(e,table) end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:31 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:44 george * Version 109 * *) functor mkCore(structure IntGrammar : INTGRAMMAR) : CORE = struct open IntGrammar open Grammar structure IntGrammar = IntGrammar structure Grammar = Grammar datatype item = ITEM of { rule : rule, dot : int, rhsAfter : symbol list } val eqItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, ITEM{rule=RULE{num=m,...},dot=e,...}) => n=m andalso d=e val gtItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, ITEM{rule=RULE{num=m,...},dot=e,...}) => n>m orelse (n=m andalso d>e) structure ItemList = ListOrdSet (struct type elem = item val eq = eqItem val gt = gtItem end) open ItemList datatype core = CORE of item list * int val gtCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_gt(a,b) val eqCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_eq(a,b) (* functions for printing and debugging *) val prItem = fn (symbolToString,nontermToString,print) => let val printInt = print o (Int.toString : int -> string) val prSymbol = print o symbolToString val prNonterm = print o nontermToString fun showRest nil = () | showRest (h::t) = (prSymbol h; print " "; showRest t) fun showRhs (l,0) = (print ". "; showRest l) | showRhs (nil,_) = () | showRhs (h::t,n) = (prSymbol h; print " "; showRhs(t,n-1)) in fn (ITEM {rule=RULE {lhs,rhs,rulenum,num,...}, dot,rhsAfter,...}) => (prNonterm lhs; print " : "; showRhs(rhs,dot); case rhsAfter of nil => (print " (reduce by rule "; printInt rulenum; print ")") | _ => (); if DEBUG then (print " (num "; printInt num; print ")") else ()) end val prCore = fn a as (_,_,print) => let val prItem = prItem a in fn (CORE (items,state)) => (print "state "; print (Int.toString state); print ":\n\n"; app (fn i => (print "\t"; prItem i; print "\n")) items; print "\n") end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) functor mkCoreUtils(structure Core : CORE) : CORE_UTILS = struct open Array List infix 9 sub val DEBUG = true structure Core = Core structure IntGrammar = Core.IntGrammar structure Grammar = IntGrammar.Grammar open Grammar IntGrammar Core structure Assoc = SymbolAssoc structure NtList = ListOrdSet (struct type elem = nonterm val eq = eqNonterm val gt = gtNonterm end) val mkFuncs = fn (GRAMMAR {rules,terms,nonterms,...}) => let val derives=array(nonterms,nil : rule list) (* sort rules by their lhs nonterminal by placing them in an array indexed in their lhs nonterminal *) val _ = let val f = fn {lhs=lhs as (NT n), rhs, precedence,rulenum} => let val rule=RULE{lhs=lhs,rhs=rhs,precedence=precedence, rulenum=rulenum,num=0} in update(derives,n,rule::(derives sub n)) end in app f rules end (* renumber rules so that rule numbers increase monotonically with the number of their lhs nonterminal, and so that rules are numbered sequentially. **Functions below assume that this number is true**, i.e. productions for nonterm i are numbered from j to k, productions for nonterm i+1 are numbered from k+1 to m, and productions for nonterm 0 start at 0 *) val _ = let val f = fn (RULE{lhs,rhs,precedence,rulenum,num}, (l,i)) => (RULE{lhs=lhs,rhs=rhs, precedence=precedence, rulenum=rulenum, num=i}::l,i+1) fun g(i,num) = if i if DEBUG andalso (n<0 orelse n>=nonterms) then let exception Produces of int in raise (Produces n) end else derives sub n val memoize = fn f => let fun loop i = if i = nonterms then nil else f (NT i) :: (loop (i+1)) val data = Array.fromList(loop 0) in fn (NT i) => data sub i end (* compute nonterminals which must be added to a closure when a given nonterminal is added, i.e all nonterminals C for each nonterminal A such that A =*=> Cx *) val nontermClosure = let val collectNonterms = fn n => List.foldr (fn (r,l) => case r of RULE {rhs=NONTERM n :: _,...} => NtList.insert(n,l) | _ => l) NtList.empty (produces n) val closureNonterm = fn n => NtList.closure(NtList.singleton n, collectNonterms) in memoize closureNonterm end (* ntShifts: Take the items produced by a nonterminal, and sort them by their first symbol. For each first symbol, make sure the item list associated with the symbol is sorted also. ** This function assumes that the item list returned by produces is sorted ** Create a table of item lists keyed by symbols. Scan the list of items produced by a nonterminal, and insert those with a first symbol on to the beginning of the item list for that symbol, creating a list if necessary. Since produces returns an item list that is already in order, the list for each symbol will also end up in order. *) fun sortItems nt = let fun add_item (a as RULE{rhs=symbol::rest,...},r) = let val item = ITEM{rule=a,dot=1,rhsAfter=rest} in Assoc.insert((symbol,case Assoc.find (symbol,r) of SOME l => item::l | NONE => [item]),r) end | add_item (_,r) = r in List.foldr add_item Assoc.empty (produces nt) end val ntShifts = memoize sortItems (* getNonterms: get the nonterminals with a . before them in a core. Returns a list of nonterminals in ascending order *) fun getNonterms l = List.foldr (fn (ITEM {rhsAfter=NONTERM sym ::_, ...},r) => NtList.insert(sym,r) | (_,r) => r) [] l (* closureNonterms: compute the nonterminals that would have a . before them in the closure of the core. Returns a list of nonterminals in ascending order *) fun closureNonterms a = let val nonterms = getNonterms a in List.foldr (fn (nt,r) => NtList.union(nontermClosure nt,r)) nonterms nonterms end (* shifts: compute the core sets that result from shift/gotoing on the closure of a kernal set. The items in core sets are sorted, of course. (1) compute the core sets that result just from items added through the closure operation. (2) then add the shift/gotos on kernal items. We can do (1) the following way. Keep a table which for each shift/goto symbol gives the list of items that result from shifting or gotoing on the symbol. Compute the nonterminals that would have dots before them in the closure of the kernal set. For each of these nonterminals, we already have an item list in sorted order for each possible shift symbol. Scan the nonterminal list from back to front. For each nonterminal, prepend the shift/goto list for each shift symbol to the list already in the table. We end up with the list of items in correct order for each shift/goto symbol. We have kept the item lists in order, scanned the nonterminals from back to front (=> that the items end up in ascending order), and never had any duplicate items (each item is derived from only one nonterminal). *) fun shifts (CORE (itemList,_)) = let (* mergeShiftItems: add an item list for a shift/goto symbol to the table *) fun mergeShiftItems (args as ((k,l),r)) = case Assoc.find(k,r) of NONE => Assoc.insert args | SOME old => Assoc.insert ((k,l@old),r) (* mergeItems: add all items derived from a nonterminal to the table. We've kept these items sorted by their shift/goto symbol (the first symbol on their rhs) *) fun mergeItems (n,r) = Assoc.fold mergeShiftItems (ntShifts n) r (* nonterms: a list of nonterminals that are in a core after the closure operation *) val nonterms = closureNonterms itemList (* now create a table which for each shift/goto symbol gives the sorted list of closure items which would result from first taking all the closure items and then sorting them by the shift/goto symbols *) val newsets = List.foldr mergeItems Assoc.empty nonterms (* finally prepare to insert the kernal items of a core *) fun insertItem ((k,i),r) = case (Assoc.find(k,r)) of NONE => Assoc.insert((k,[i]),r) | SOME l => Assoc.insert((k,Core.insert(i,l)),r) fun shiftCores(ITEM{rule,dot,rhsAfter=symbol::rest},r) = insertItem((symbol, ITEM{rule=rule,dot=dot+1,rhsAfter=rest}),r) | shiftCores(_,r) = r (* insert the kernal items of a core *) val newsets = List.foldr shiftCores newsets itemList in Assoc.make_list newsets end (* nontermEpsProds: returns a list of epsilon productions produced by a nonterminal sorted by rule number. ** Depends on produces returning an ordered list **. It does not alter the order in which the rules were returned by produces; it only removes non-epsilon productions *) val nontermEpsProds = let val f = fn nt => List.foldr (fn (rule as RULE {rhs=nil,...},results) => rule :: results | (_,results) => results) [] (produces nt) in memoize f end (* epsProds: take a core and compute a list of epsilon productions for it sorted by rule number. ** Depends on closureNonterms returning a list of nonterminals sorted by nonterminal #, rule numbers increasing monotonically with their lhs production #, and nontermEpsProds returning an ordered item list for each production *) fun epsProds (CORE (itemList,state)) = let val prods = map nontermEpsProds (closureNonterms itemList) in List.concat prods end in {produces=produces,shifts=shifts,rules=rules,epsProds=epsProds} end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:34 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) functor mkGraph(structure IntGrammar : INTGRAMMAR structure Core : CORE structure CoreUtils : CORE_UTILS sharing IntGrammar = Core.IntGrammar = CoreUtils.IntGrammar sharing CoreUtils.Core = Core ) : LRGRAPH = struct open Array List infix 9 sub structure Core = Core structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar open Core Core.Grammar CoreUtils IntGrammar structure NodeSet = RbOrdSet (struct type elem = core val eq = eqCore val gt = gtCore end) open NodeSet exception Shift of int * symbol type graph = {edges: {edge:symbol,to:core} list array, nodes: core list,nodeArray : core array} val edges = fn (CORE (_,i),{edges,...}:graph) => edges sub i val nodes = fn ({nodes,...} : graph) => nodes val shift = fn ({edges,nodes,...} : graph) => fn a as (i,sym) => let fun find nil = raise (Shift a) | find ({edge,to=CORE (_,state)} :: r) = if gtSymbol(sym,edge) then find r else if eqSymbol(edge,sym) then state else raise (Shift a) in find (edges sub i) end val core = fn ({nodeArray,...} : graph) => fn i => nodeArray sub i val mkGraph = fn (g as (GRAMMAR {start,...})) => let val {shifts,produces,rules,epsProds} = CoreUtils.mkFuncs g fun add_goto ((symbol,a),(nodes,edges,future,num)) = case find(CORE (a,0),nodes) of NONE => let val core =CORE (a,num) val edge = {edge=symbol,to=core} in (insert(core,nodes),edge::edges, core::future,num+1) end | (SOME c) => let val edge={edge=symbol,to=c} in (nodes,edge::edges,future,num) end fun f (nodes,node_list,edge_list,nil,nil,num) = let val nodes=rev node_list in {nodes=nodes, edges=Array.fromList (rev edge_list), nodeArray = Array.fromList nodes } end | f (nodes,node_list,edge_list,nil,y,num) = f (nodes,node_list,edge_list,rev y,nil,num) | f (nodes,node_list,edge_list,h::t,y,num) = let val (nodes,edges,future,num) = List.foldr add_goto (nodes,[],y,num) (shifts h) in f (nodes,h::node_list, edges::edge_list,t,future,num) end in {graph= let val makeItem = fn (r as (RULE {rhs,...})) => ITEM{rule=r,dot=0,rhsAfter=rhs} val initialItemList = map makeItem (produces start) val orderedItemList = List.foldr Core.insert [] initialItemList val initial = CORE (orderedItemList,0) in f(empty,nil,nil,[initial],nil,1) end, produces=produces, rules=rules, epsProds=epsProds} end val prGraph = fn a as (nontermToString,termToString,print) => fn g => let val printCore = prCore a val printSymbol = print o nontermToString val nodes = nodes g val printEdges = fn n => List.app (fn {edge,to=CORE (_,state)} => (print "\tshift on "; printSymbol edge; print " to "; print (Int.toString state); print "\n")) (edges (n,g)) in List.app (fn c => (printCore c; print "\n"; printEdges c)) nodes end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) functor mkLook (structure IntGrammar : INTGRAMMAR) : LOOK = struct open Array List infix 9 sub structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar open Grammar IntGrammar structure TermSet = ListOrdSet (struct type elem = term val eq = eqTerm val gt = gtTerm end) val union = TermSet.union val make_set = TermSet.make_set val prLook = fn (termToString,print) => let val printTerm = print o termToString fun f nil = print " " | f (a :: b) = (printTerm a; print " "; f b) in f end structure NontermSet = ListOrdSet (struct type elem = nonterm val eq = eqNonterm val gt = gtNonterm end) val mkFuncs = fn {rules : rule list, nonterms : int, produces : nonterm -> rule list} => let (* nullable: create a function which tells if a nonterminal is nullable or not. Method: Keep an array of booleans. The nth entry is true if NT i is nullable. If is false if we don't know whether NT i is nullable. Keep a list of rules whose remaining rhs we must prove to be null. First, scan the list of rules and remove those rules whose rhs contains a terminal. These rules are not nullable. Now iterate through the rules that were left: (1) if there is no remaining rhs we have proved that the rule is nullable, mark the nonterminal for the rule as nullable (2) if the first element of the remaining rhs is nullable, place the rule back on the list with the rest of the rhs (3) if we don't know whether the nonterminal is nullable, place it back on the list (4) repeat until the list does not change. We have found all the possible nullable rules. *) val nullable = let fun ok_rhs nil = true | ok_rhs ((TERM _)::_) = false | ok_rhs ((NONTERM i)::r) = ok_rhs r fun add_rule (RULE {lhs,rhs,...},r) = if ok_rhs rhs then (lhs,map (fn (NONTERM (NT i)) => i) rhs)::r else r val items = List.foldr add_rule [] rules val nullable = array(nonterms,false) val f = fn ((NT i,nil),(l,_)) => (update(nullable,i,true); (l,true)) | (a as (lhs,(h::t)),(l,change)) => case (nullable sub h) of false => (a::l,change) | true => ((lhs,t)::l,true) fun prove(l,true) = prove(List.foldr f (nil,false) l) | prove(_,false) = () in (prove(items,true); fn (NT i) => nullable sub i) end (* scanRhs : look at a list of symbols, scanning past nullable nonterminals, applying addSymbol to the symbols scanned *) fun scanRhs addSymbol = let fun f (nil,result) = result | f ((sym as NONTERM nt) :: rest,result) = if nullable nt then f (rest,addSymbol(sym,result)) else addSymbol(sym,result) | f ((sym as TERM _) :: _,result) = addSymbol(sym,result) in f end (* accumulate: look at the start of the right-hand-sides of rules, looking past nullable nonterminals, applying addObj to the visible symbols. *) fun accumulate(rules, empty, addObj) = List.foldr (fn (RULE {rhs,...},r) =>(scanRhs addObj) (rhs,r)) empty rules val nontermMemo = fn f => let val lookup = array(nonterms,nil) fun g i = if i=nonterms then () else (update(lookup,i,f (NT i)); g (i+1)) in (g 0; fn (NT j) => lookup sub j) end (* first1: the FIRST set of a nonterminal in the grammar. Only looks at other terminals, but it is clever enough to move past nullable nonterminals at the start of a production. *) fun first1 nt = accumulate(produces nt, TermSet.empty, fn (TERM t, set) => TermSet.insert (t,set) | (_, set) => set) val first1 = nontermMemo(first1) (* starters1: given a nonterminal "nt", return the set of nonterminals which can start its productions. Looks past nullables, but doesn't recurse *) fun starters1 nt = accumulate(produces nt, nil, fn (NONTERM nt, set) => NontermSet.insert(nt,set) | (_, set) => set) val starters1 = nontermMemo(starters1) (* first: maps a nonterminal to its first-set. Get all the starters of the nonterminal, get the first1 terminal set of each of these, union the whole lot together *) fun first nt = List.foldr (fn (a,r) => TermSet.union(r,first1 a)) [] (NontermSet.closure (NontermSet.singleton nt, starters1)) val first = nontermMemo(first) (* prefix: all possible terminals starting a symbol list *) fun prefix symbols = scanRhs (fn (TERM t,r) => TermSet.insert(t,r) | (NONTERM nt,r) => TermSet.union(first nt,r)) (symbols,nil) fun nullable_string ((TERM t) :: r) = false | nullable_string ((NONTERM nt) :: r) = (case (nullable nt) of true => nullable_string r | f => f) | nullable_string nil = true in {nullable = nullable, first = prefix} end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/10/03 03:37:12 jhr * Qualified identifiers that are no-longer top-level (quot, rem, min, max). * * Revision 1.2 1996/02/26 15:02:35 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) functor mkLalr ( structure IntGrammar : INTGRAMMAR structure Core : CORE structure Graph : LRGRAPH structure Look: LOOK sharing Graph.Core = Core sharing Graph.IntGrammar = Core.IntGrammar = Look.IntGrammar = IntGrammar) : LALR_GRAPH = struct open Array List infix 9 sub open IntGrammar.Grammar IntGrammar Core Graph Look structure Graph = Graph structure Core = Core structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar datatype tmpcore = TMPCORE of (item * term list ref) list * int datatype lcore = LCORE of (item * term list) list * int val prLcore = fn a as (SymbolToString,nontermToString,termToString,print) => let val printItem = prItem (SymbolToString,nontermToString,print) val printLookahead = prLook(termToString,print) in fn (LCORE (items,state)) => (print "\n"; print "state "; print (Int.toString state); print " :\n\n"; List.app (fn (item,lookahead) => (print "{"; printItem item; print ","; printLookahead lookahead; print "}\n")) items) end exception Lalr of int structure ItemList = ListOrdSet (struct type elem = item * term list ref val eq = fn ((a,_),(b,_)) => eqItem(a,b) val gt = fn ((a,_),(b,_)) => gtItem(a,b) end) structure NontermSet = ListOrdSet (struct type elem = nonterm val gt = gtNonterm val eq = eqNonterm end) (* NTL: nonterms with lookahead *) structure NTL = RbOrdSet (struct type elem = nonterm * term list val gt = fn ((i,_),(j,_)) => gtNonterm(i,j) val eq = fn ((i,_),(j,_)) => eqNonterm(i,j) end) val DEBUG = false val addLookahead = fn {graph,nullable,first,eop, rules,produces,nonterms,epsProds, print,termToString,nontermToString} => let val eop = Look.make_set eop val symbolToString = fn (TERM t) => termToString t | (NONTERM t) => nontermToString t val print = if DEBUG then print else fn _ => () val prLook = if DEBUG then prLook (termToString,print) else fn _ => () val prNonterm = print o nontermToString val prRule = if DEBUG then prRule(symbolToString,nontermToString,print) else fn _ => () val printInt = print o (Int.toString : int -> string) val printItem = prItem(symbolToString,nontermToString,print) (* look_pos: position in the rhs of a rule at which we should start placing lookahead ref cells, i.e. the minimum place at which A -> x .B y, where B is a nonterminal and y =*=> epsilon, or A -> x. is true. Positions are given by the number of symbols before the place. The place before the first symbol is 0, etc. *) val look_pos = let val positions = array(length rules,0) (* rule_pos: calculate place in the rhs of a rule at which we should start placing lookahead ref cells *) val rule_pos = fn (RULE {rhs,...}) => case (rev rhs) of nil => 0 | (TERM t) :: r => length rhs | (l as (NONTERM n) :: r) => (* f assumes that everything after n in the rule has proven to be nullable so far. Remember that the rhs has been reversed, implying that this is true initially *) (* A -> .z t B y, where y is nullable *) let fun f (NONTERM b :: (r as (TERM _ :: _))) = (length r) (* A -> .z B C y *) | f (NONTERM c :: (r as (NONTERM b :: _))) = if nullable c then f r else (length r) (* A -> .B y, where y is nullable *) | f (NONTERM b :: nil) = 0 in f l end val check_rule = fn (rule as RULE {num,...}) => let val pos = rule_pos rule in (print "look_pos: "; prRule rule; print " = "; printInt pos; print "\n"; update(positions,num,rule_pos rule)) end in app check_rule rules; fn RULE{num,...} => (positions sub num) end (* rest_is_null: true for items of the form A -> x .B y, where y is nullable *) val rest_is_null = fn (ITEM{rule,dot, rhsAfter=NONTERM _ :: _}) => dot >= (look_pos rule) | _ => false (* map core to a new core including only items of the form A -> x. or A -> x. B y, where y =*=> epsilon. It also adds epsilon productions to the core. Each item is given a ref cell to hold the lookahead nonterminals for it.*) val map_core = let val f = fn (item as ITEM {rhsAfter=nil,...},r) => (item,ref nil) :: r | (item,r) => if (rest_is_null item) then (item,ref nil)::r else r in fn (c as CORE (items,state)) => let val epsItems = map (fn rule=>(ITEM{rule=rule,dot=0,rhsAfter=nil}, ref (nil : term list)) ) (epsProds c) in TMPCORE(ItemList.union(List.foldr f [] items,epsItems),state) end end val new_nodes = map map_core (nodes graph) exception Find (* findRef: state * item -> lookahead ref cell for item *) val findRef = let val states = Array.fromList new_nodes val dummy = ref nil in fn (state,item) => let val TMPCORE (l,_) = states sub state in case ItemList.find((item,dummy),l) of SOME (_,look_ref) => look_ref | NONE => (print "find failed: state "; printInt state; print "\nitem =\n"; printItem item; print "\nactual items =\n"; app (fn (i,_) => (printItem i; print "\n")) l; raise Find) end end (* findRuleRefs: state -> rule -> lookahead refs for rule. *) val findRuleRefs = let val shift = shift graph in fn state => (* handle epsilon productions *) fn (rule as RULE {rhs=nil,...}) => [findRef(state,ITEM{rule=rule,dot=0,rhsAfter=nil})] | (rule as RULE {rhs=sym::rest,...}) => let val pos = Int.max(look_pos rule,1) fun scan'(state,nil,pos,result) = findRef(state,ITEM{rule=rule, dot=pos, rhsAfter=nil}) :: result | scan'(state,rhs as sym::rest,pos,result) = scan'(shift(state,sym), rest, pos+1, findRef(state,ITEM{rule=rule, dot=pos, rhsAfter=rhs})::result) (* find first item of the form A -> x .B y, where y =*=> epsilon and x is not epsilon, or A -> x. use scan' to pick up all refs after this point *) fun scan(state,nil,_) = [findRef(state,ITEM{rule=rule,dot=pos,rhsAfter=nil})] | scan(state,rhs,0) = scan'(state,rhs,pos,nil) | scan(state,sym::rest,place) = scan(shift(state,sym),rest,place-1) in scan(shift(state,sym),rest,pos-1) end end (* function to compute for some nonterminal n the set of nonterminals A added through the closure of nonterminal n such that n =c*=> .A x, where x is nullable *) val nonterms_w_null = fn nt => let val collect_nonterms = fn n => List.foldr (fn (rule as RULE {rhs=rhs as NONTERM n :: _,...},r) => (case (rest_is_null(ITEM {dot=0,rhsAfter=rhs,rule=rule})) of true => n :: r | false => r) | (_,r) => r) [] (produces n) fun dfs(a as (n,r)) = if (NontermSet.exists a) then r else List.foldr dfs (NontermSet.insert(n,r)) (collect_nonterms n) in dfs(nt,NontermSet.empty) end val nonterms_w_null = let val data = array(nonterms,NontermSet.empty) fun f n = if n=nonterms then () else (update(data,n,nonterms_w_null (NT n)); f (n+1)) in (f 0; fn (NT nt) => data sub nt) end (* look_info: for some nonterminal n the set of nonterms A added through the closure of the nonterminal such that n =c+=> .Ax and the lookahead accumlated for each nonterm A *) val look_info = fn nt => let val collect_nonterms = fn n => List.foldr (fn (RULE {rhs=NONTERM n :: t,...},r) => (case NTL.find ((n,nil),r) of SOME (key,data) => NTL.insert((n,Look.union(data,first t)),r) | NONE => NTL.insert ((n,first t),r)) | (_,r) => r) NTL.empty (produces n) fun dfs(a as ((key1,data1),r)) = case (NTL.find a) of SOME (_,data2) => NTL.insert((key1,Look.union(data1,data2)),r) | NONE => NTL.fold dfs (collect_nonterms key1) (NTL.insert a) in dfs((nt,nil),NTL.empty) end val look_info = if not DEBUG then look_info else fn nt => (print "look_info of "; prNonterm nt; print "=\n"; let val info = look_info nt in (NTL.app (fn (nt,lookahead) => (prNonterm nt; print ": "; prLook lookahead; print "\n\n")) info; info) end) (* prop_look: propagate lookaheads for nonterms added in the closure of a nonterm. Lookaheads must be propagated from each nonterminal m to all nonterminals { n | m =c+=> nx, where x=*=>epsilon} *) val prop_look = fn ntl => let val upd_lookhd = fn new_look => fn (nt,r) => case NTL.find ((nt,new_look),r) of SOME (_,old_look) => NTL.insert((nt, Look.union(new_look,old_look)),r) | NONE => raise (Lalr 241) val upd_nonterm = fn ((nt,look),r) => NontermSet.fold (upd_lookhd look) (nonterms_w_null nt) r in NTL.fold upd_nonterm ntl ntl end val prop_look = if not DEBUG then prop_look else fn ntl => (print "prop_look =\n"; let val info = prop_look ntl in (NTL.app (fn (nt,lookahead) => (prNonterm nt; print ": "; prLook lookahead; print "\n\n")) info; info) end) (* now put the information from these functions together. Create a function which takes a nonterminal n and returns a list of triplets of (a nonterm added through closure, the lookahead for the nonterm, whether the nonterm should include the lookahead for the nonterminal whose closure is being taken (i.e. first(y) for an item j of the form A -> x .n y and lookahead(j) if y =*=> epsilon) *) val closure_nonterms = let val data = array(nonterms,nil: (nonterm * term list * bool) list) val do_nonterm = fn i => let val nonterms_followed_by_null = nonterms_w_null i val nonterms_added_through_closure = NTL.make_list (prop_look (look_info i)) val result = map (fn (nt,l) => (nt,l,NontermSet.exists (nt,nonterms_followed_by_null)) ) nonterms_added_through_closure in if DEBUG then (print "closure_nonterms = "; prNonterm i; print "\n"; app (fn (nt,look,nullable) => (prNonterm nt; print ":"; prLook look; case nullable of false => print "(false)\n" | true => print "(true)\n")) result; print "\n") else (); result end fun f i = if i=nonterms then () else (update(data,i,do_nonterm (NT i)); f (i+1)) val _ = f 0 in fn (NT i) => data sub i end (* add_nonterm_lookahead: Add lookahead to all completion items for rules added when the closure of a given nonterm in some state is taken. It returns a list of lookahead refs to which the given nonterm's lookahead should be propagated. For each rule, it must trace the shift/gotos in the LR(0) graph to find all items of the form A-> x .B y where y =*=> epsilon or A -> x. *) val add_nonterm_lookahead = fn (nt,state) => let val f = fn ((nt,lookahead,nullable),r) => let val refs = map (findRuleRefs state) (produces nt) val refs = List.concat refs val _ = app (fn r => r := (Look.union (!r,lookahead))) refs in if nullable then refs @ r else r end in List.foldr f [] (closure_nonterms nt) end (* scan_core: Scan a core for all items of the form A -> x .B y. Applies add_nonterm_lookahead to each such B, and then merges first(y) into the list of refs returned by add_nonterm_lookahead. It returns a list of ref * ref list for all the items where y =*=> epsilon *) val scan_core = fn (CORE (l,state)) => let fun f ((item as ITEM{rhsAfter= NONTERM b :: y, dot,rule})::t,r) = (case (add_nonterm_lookahead(b,state)) of nil => r | l => let val first_y = first y val newr = if dot >= (look_pos rule) then (findRef(state,item),l)::r else r in (app (fn r => r := Look.union(!r,first_y)) l; f (t,newr)) end) | f (_ :: t,r) = f (t,r) | f (nil,r) = r in f (l,nil) end (* add end-of-parse symbols to set of items consisting of all items immediately derived from the start symbol *) val add_eop = fn (c as CORE (l,state),eop) => let fun f (item as ITEM {rule,dot,...}) = let val refs = findRuleRefs state rule in (* first take care of kernal items. Add the end-of-parse symbols to the lookahead sets for these items. Epsilon productions of the start symbol do not need to be handled specially because they will be in the kernal also *) app (fn r => r := Look.union(!r,eop)) refs; (* now take care of closure items. These are all nonterminals C which have a derivation S =+=> .C x, where x is nullable *) if dot >= (look_pos rule) then case item of ITEM{rhsAfter=NONTERM b :: _,...} => (case add_nonterm_lookahead(b,state) of nil => () | l => app (fn r => r := Look.union(!r,eop)) l) | _ => () else () end in app f l end val iterate = fn l => let fun f lookahead (nil,done) = done | f lookahead (h::t,done) = let val old = !h in h := Look.union (old,lookahead); if (length (!h)) <> (length old) then f lookahead (t,false) else f lookahead(t,done) end fun g ((from,to)::rest,done) = let val new_done = f (!from) (to,done) in g (rest,new_done) end | g (nil,done) = done fun loop true = () | loop false = loop (g (l,true)) in loop false end val lookahead = List.concat (map scan_core (nodes graph)) (* used to scan the item list of a TMPCORE and remove the items not being reduced *) val create_lcore_list = fn ((item as ITEM {rhsAfter=nil,...},ref l),r) => (item,l) :: r | (_,r) => r in add_eop(Graph.core graph 0,eop); iterate lookahead; map (fn (TMPCORE (l,state)) => LCORE (List.foldr create_lcore_list [] l, state)) new_nodes end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/05/31 14:05:01 dbm * Rewrote definition of convert_to_pairlist to conform to value restriction. * * Revision 1.2 1996/02/26 15:02:36 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) functor mkMakeLrTable (structure IntGrammar : INTGRAMMAR structure LrTable : LR_TABLE sharing type LrTable.term = IntGrammar.Grammar.term sharing type LrTable.nonterm = IntGrammar.Grammar.nonterm ) : MAKE_LR_TABLE = struct open Array List infix 9 sub structure Core = mkCore(structure IntGrammar = IntGrammar) structure CoreUtils = mkCoreUtils(structure IntGrammar = IntGrammar structure Core = Core) structure Graph = mkGraph(structure IntGrammar = IntGrammar structure Core = Core structure CoreUtils = CoreUtils) structure Look = mkLook(structure IntGrammar = IntGrammar) structure Lalr = mkLalr(structure IntGrammar = IntGrammar structure Core = Core structure Graph = Graph structure Look = Look) structure LrTable = LrTable structure IntGrammar = IntGrammar structure Grammar = IntGrammar.Grammar structure GotoList = ListOrdSet (struct type elem = Grammar.nonterm * LrTable.state val eq = fn ((Grammar.NT a,_),(Grammar.NT b,_)) => a=b val gt = fn ((Grammar.NT a,_),(Grammar.NT b,_)) => a>b end) structure Errs : LR_ERRS = struct structure LrTable = LrTable datatype err = RR of LrTable.term * LrTable.state * int * int | SR of LrTable.term * LrTable.state * int | NOT_REDUCED of int | NS of LrTable.term * int | START of int val summary = fn l => let val numRR = ref 0 val numSR = ref 0 val numSTART = ref 0 val numNOT_REDUCED = ref 0 val numNS = ref 0 fun loop (h::t) = (case h of RR _ => numRR := !numRR+1 | SR _ => numSR := !numSR+1 | START _ => numSTART := !numSTART+1 | NOT_REDUCED _ => numNOT_REDUCED := !numNOT_REDUCED+1 | NS _ => numNS := !numNS+1; loop t) | loop nil = {rr = !numRR, sr = !numSR, start = !numSTART, not_reduced = !numNOT_REDUCED, nonshift = !numNS} in loop l end val printSummary = fn say => fn l => let val {rr,sr,start, not_reduced,nonshift} = summary l val say_plural = fn (i,s) => (say (Int.toString i); say " "; case i of 1 => (say s) | _ => (say s; say "s")) val say_error = fn (args as (i,s)) => case i of 0 => () | i => (say_plural args; say "\n") in say_error(rr,"reduce/reduce conflict"); say_error(sr,"shift/reduce conflict"); if nonshift<>0 then (say "non-shiftable terminal used on the rhs of "; say_plural(start,"rule"); say "\n") else (); if start<>0 then (say "start symbol used on the rhs of "; say_plural(start,"rule"); say "\n") else (); if not_reduced<>0 then (say_plural(not_reduced,"rule"); say " not reduced\n") else () end end open IntGrammar Grammar Errs LrTable Core (* rules for resolving conflicts: shift/reduce: If either the terminal or the rule has no precedence, a shift/reduce conflict is reported. A shift is chosen for the table. If both have precedences, the action with the higher precedence is chosen. If the precedences are equal, neither the shift nor the reduce is chosen. reduce/reduce: A reduce/reduce conflict is reported. The lowest numbered rule is chosen for reduction. *) (* method for filling tables - first compute the reductions called for in a state, then add the shifts for the state to this information. How to compute the reductions: A reduction initially is given as an item and a lookahead set calling for reduction by that item. The first reduction is mapped to a list of terminal * rule pairs. Each additional reduction is then merged into this list and reduce/reduce conflicts are resolved according to the rule given. Missed Errors: This method misses some reduce/reduce conflicts that exist because some reductions are removed from the list before conflicting reductions can be compared against them. All reduce/reduce conflicts, however, can be generated given a list of the reduce/reduce conflicts generated by this method. This can be done by taking the transitive closure of the relation given by the list. If reduce/reduce (a,b) and reduce/reduce (b,c) are true, then reduce/reduce (a,c) is true. The relation is symmetric and transitive. Adding shifts: Finally scan the list merging in shifts and resolving conflicts according to the rule given. Missed Shift/Reduce Errors: Some errors may be missed by this method because some reductions were removed as the result of reduce/reduce conflicts. For a shift/reduce conflict of term a, reduction by rule n, shift/reduce conficts exist for all rules y such that reduce/reduce (x,y) or reduce/reduce (y,x) is true. *) val mergeReduces = let val merge = fn state => let fun f (j as (pair1 as (T t1,action1)) :: r1, k as (pair2 as (T t2,action2)) :: r2,result,errs) = if t1 < t2 then f(r1,k,pair1::result,errs) else if t1 > t2 then f(j,r2,pair2::result,errs) else let val REDUCE num1 = action1 val REDUCE num2 = action2 val errs = RR(T t1,state,num1,num2) :: errs val action = if num1 < num2 then pair1 else pair2 in f(r1,r2,action::result,errs) end | f (nil,nil,result,errs) = (rev result,errs) | f (pair1::r,nil,result,errs) = f(r,nil,pair1::result,errs) | f (nil,pair2 :: r,result,errs) = f(nil,r,pair2::result,errs) in f end in fn state => fn ((ITEM {rule=RULE {rulenum,...},...}, lookahead), (reduces,errs)) => let val action = REDUCE rulenum val actions = map (fn a=>(a,action)) lookahead in case reduces of nil => (actions,errs) | _ => merge state (reduces,actions,nil,errs) end end val computeActions = fn (rules,precedence,graph,defaultReductions) => let val rulePrec = let val precData = array(length rules,NONE : int option) in app (fn RULE {rulenum=r,precedence=p,...} => update(precData,r,p)) rules; fn i => precData sub i end fun mergeShifts(state,shifts,nil) = (shifts,nil) | mergeShifts(state,nil,reduces) = (reduces,nil) | mergeShifts(state,shifts,reduces) = let fun f(shifts as (pair1 as (T t1,_)) :: r1, reduces as (pair2 as (T t2,action)) :: r2, result,errs) = if t1 < t2 then f(r1,reduces,pair1 :: result,errs) else if t1 > t2 then f(shifts,r2,pair2 :: result,errs) else let val REDUCE rulenum = action val (term1,_) = pair1 in case (precedence term1,rulePrec rulenum) of (SOME i,SOME j) => if i>j then f(r1,r2,pair1 :: result,errs) else if j>i then f(r1,r2,pair2 :: result,errs) else f(r1,r2,(T t1, ERROR)::result,errs) | (_,_) => f(r1,r2,pair1 :: result, SR (term1,state,rulenum)::errs) end | f (nil,nil,result,errs) = (rev result,errs) | f (nil,h::t,result,errs) = f (nil,t,h::result,errs) | f (h::t,nil,result,errs) = f (t,nil,h::result,errs) in f(shifts,reduces,nil,nil) end fun mapCore ({edge=symbol,to=CORE (_,state)}::r,shifts,gotos) = (case symbol of (TERM t) => mapCore (r,(t,SHIFT(STATE state))::shifts,gotos) | (NONTERM nt) => mapCore(r,shifts,(nt,STATE state)::gotos) ) | mapCore (nil,shifts,gotos) = (rev shifts,rev gotos) fun pruneError ((_,ERROR)::rest) = pruneError rest | pruneError (a::rest) = a :: pruneError rest | pruneError nil = nil in fn (Lalr.LCORE (reduceItems,state),c as CORE (shiftItems,state')) => if DEBUG andalso (state <> state') then let exception MkTable in raise MkTable end else let val (shifts,gotos) = mapCore (Graph.edges(c,graph),nil,nil) val tableState = STATE state in case reduceItems of nil => ((shifts,ERROR),gotos,nil) | h :: nil => let val (ITEM {rule=RULE {rulenum,...},...}, l) = h val (reduces,_) = mergeReduces tableState (h,(nil,nil)) val (actions,errs) = mergeShifts(tableState, shifts,reduces) val actions' = pruneError actions val (actions,default) = let fun hasReduce (nil,actions) = (rev actions,REDUCE rulenum) | hasReduce ((a as (_,SHIFT _)) :: r,actions) = hasReduce(r,a::actions) | hasReduce (_ :: r,actions) = hasReduce(r,actions) fun loop (nil,actions) = (rev actions,ERROR) | loop ((a as (_,SHIFT _)) :: r,actions) = loop(r,a::actions) | loop ((a as (_,REDUCE _)) :: r,actions) = hasReduce(r,actions) | loop (_ :: r,actions) = loop(r,actions) in if defaultReductions andalso length actions = length actions' then loop(actions,nil) else (actions',ERROR) end in ((actions,default), gotos,errs) end | l => let val (reduces,errs1) = List.foldr (mergeReduces tableState) (nil,nil) l val (actions,errs2) = mergeShifts(tableState,shifts,reduces) in ((pruneError actions,ERROR),gotos,errs1@errs2) end end end val mkTable = fn (grammar as GRAMMAR{rules,terms,nonterms,start, precedence,termToString,noshift, nontermToString,eop},defaultReductions) => let val symbolToString = fn (TERM t) => termToString t | (NONTERM nt) => nontermToString nt val {rules,graph,produces,epsProds,...} = Graph.mkGraph grammar val {nullable,first} = Look.mkFuncs{rules=rules,produces=produces,nonterms=nonterms} val lcores = Lalr.addLookahead {graph=graph, nullable=nullable, produces=produces, eop=eop, nonterms=nonterms, first=first, rules=rules, epsProds=epsProds, print=(fn s=>TextIO.output(TextIO.stdOut,s)), termToString = termToString, nontermToString = nontermToString} fun zip (h::t,h'::t') = (h,h') :: zip(t,t') | zip (nil,nil) = nil | zip _ = let exception MkTable in raise MkTable end fun unzip l = let fun f ((a,b,c)::r,j,k,l) = f(r,a::j,b::k,c::l) | f (nil,j,k,l) = (rev j,rev k,rev l) in f(l,nil,nil,nil) end val (actions,gotos,errs) = let val doState = computeActions(rules,precedence,graph, defaultReductions) in unzip (map doState (zip(lcores,Graph.nodes graph))) end (* add goto from state 0 to a new state. The new state has accept actions for all of the end-of-parse symbols *) val (actions,gotos,errs) = case gotos of nil => (actions,gotos,errs) | h :: t => let val newStateActions = (map (fn t => (t,ACCEPT)) (Look.make_set eop),ERROR) val state0Goto = GotoList.insert((start,STATE (length actions)),h) in (actions @ [newStateActions], state0Goto :: (t @ [nil]), errs @ [nil]) end val startErrs = List.foldr (fn (RULE {rhs,rulenum,...},r) => if (exists (fn NONTERM a => a=start | _ => false) rhs) then START rulenum :: r else r) [] rules val nonshiftErrs = List.foldr (fn (RULE {rhs,rulenum,...},r) => (List.foldr (fn (nonshift,r) => if (exists (fn TERM a => a=nonshift | _ => false) rhs) then NS(nonshift,rulenum) :: r else r) r noshift) ) [] rules val notReduced = let val ruleReduced = array(length rules,false) val test = fn REDUCE i => update(ruleReduced,i,true) | _ => () val _ = app (fn (actions,default) => (app (fn (_,r) => test r) actions; test default) ) actions; fun scan (i,r) = if i >= 0 then scan(i-1, if ruleReduced sub i then r else NOT_REDUCED i :: r) else r in scan(Array.length ruleReduced-1,nil) end handle Subscript => (if DEBUG then print "rules not numbered correctly!" else (); nil) val numstates = length actions val allErrs = startErrs @ notReduced @ nonshiftErrs @ (List.concat errs) fun convert_to_pairlist(nil : ('a * 'b) list): ('a,'b) pairlist = EMPTY | convert_to_pairlist ((a,b) :: r) = PAIR(a,b,convert_to_pairlist r) in (mkLrTable {actions=Array.fromList(map (fn (a,b) => (convert_to_pairlist a,b)) actions), gotos=Array.fromList (map convert_to_pairlist gotos), numRules=length rules,numStates=length actions, initialState=STATE 0}, let val errArray = Array.fromList errs in fn (STATE state) => errArray sub state end, fn print => let val printCore = prCore(symbolToString,nontermToString,print) val core = Graph.core graph in fn STATE state => printCore (if state=(numstates-1) then Core.CORE (nil,state) else (core state)) end, allErrs) end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:33 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) structure Grammar : GRAMMAR = struct (* define types term and nonterm using those in LrTable datatype term = T of int datatype nonterm = NT of int *) open LrTable datatype symbol = TERM of term | NONTERM of nonterm datatype grammar = GRAMMAR of {rules: {lhs: nonterm, rhs: symbol list, precedence: int option, rulenum: int} list, noshift : term list, eop : term list, terms: int, nonterms: int, start : nonterm, precedence : term -> int option, termToString : term -> string, nontermToString : nonterm -> string} end; structure IntGrammar : INTGRAMMAR = struct structure Grammar = Grammar open Grammar datatype rule = RULE of {lhs: nonterm, rhs: symbol list, num: int,(* internal # assigned by coreutils *) rulenum: int, precedence: int option} val eqTerm = (op =) val gtTerm = fn (T i,T j) => i>j val eqNonterm = (op =) val gtNonterm = fn (NT i,NT j) => i>j val eqSymbol = (op =) val gtSymbol = fn (TERM (T i),TERM (T j)) => i>j | (NONTERM (NT i),NONTERM (NT j)) => i>j | (TERM _,NONTERM _) => false | (NONTERM _,TERM _) => true structure SymbolAssoc = Table(type key = symbol val gt = gtSymbol) structure NontermAssoc = Table(type key = nonterm val gt = gtNonterm) val DEBUG = false val prRule = fn (a as symbolToString,nontermToString,print) => let val printSymbol = print o symbolToString fun printRhs (h::t) = (printSymbol h; print " "; printRhs t) | printRhs nil = () in fn (RULE {lhs,rhs,num,rulenum,precedence,...}) => ((print o nontermToString) lhs; print " : "; printRhs rhs; if DEBUG then (print " num = "; print (Int.toString num); print " rulenum = "; print (Int.toString rulenum); print " precedence = "; case precedence of NONE => print " none" | (SOME i) => print (Int.toString i); ()) else ()) end val prGrammar = fn (a as (symbolToString,nontermToString,print)) => fn (GRAMMAR {rules,terms,nonterms,start,...}) => let val printRule = let val prRule = prRule a in fn {lhs,rhs,precedence,rulenum} => (prRule (RULE {lhs=lhs,rhs=rhs,num=0, rulenum=rulenum, precedence=precedence}); print "\n") end in print "grammar = \n"; List.app printRule rules; print "\n"; print (" terms = " ^ (Int.toString terms) ^ " nonterms = " ^ (Int.toString nonterms) ^ " start = "); (print o nontermToString) start; () end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:39 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:47 george * Version 109 * *) functor mkVerbose(structure Errs : LR_ERRS) : VERBOSE = struct structure Errs = Errs open Errs Errs.LrTable val mkPrintAction = fn print => let val printInt = print o (Int.toString : int -> string) in fn (SHIFT (STATE i)) => (print "\tshift "; printInt i; print "\n") | (REDUCE rulenum) => (print "\treduce by rule "; printInt rulenum; print "\n") | ACCEPT => print "\taccept\n" | ERROR => print "\terror\n" end val mkPrintGoto = fn (printNonterm,print) => let val printInt = print o (Int.toString : int -> string) in fn (nonterm,STATE i) => (print "\t"; printNonterm nonterm; print "\tgoto "; printInt i; print "\n") end val mkPrintTermAction = fn (printTerm,print) => let val printAction = mkPrintAction print in fn (term,action) => (print "\t"; printTerm term; printAction action) end val mkPrintGoto = fn (printNonterm,print) => fn (nonterm,STATE i) => let val printInt = print o (Int.toString : int -> string) in (print "\t"; printNonterm nonterm; print "\tgoto "; printInt i; print "\n") end val mkPrintError = fn (printTerm,printRule,print) => let val printInt = print o (Int.toString : int -> string) val printState = fn STATE s => (print " state "; printInt s) in fn (RR (term,state,r1,r2)) => (print "error: "; printState state; print ": reduce/reduce conflict between rule "; printInt r1; print " and rule "; printInt r2; print " on "; printTerm term; print "\n") | (SR (term,state,r1)) => (print "error: "; printState state; print ": shift/reduce conflict "; print "(shift "; printTerm term; print ", reduce by rule "; printInt r1; print ")\n") | NOT_REDUCED i => (print "warning: rule <"; printRule i; print "> will never be reduced\n") | START i => (print "warning: start symbol appears on the rhs of "; print "<"; printRule i; print ">\n") | NS (term,i) => (print "warning: non-shiftable terminal "; printTerm term; print "appears on the rhs of "; print "<"; printRule i; print ">\n") end structure PairList : sig val app : ('a * 'b -> unit) -> ('a,'b) pairlist -> unit val length : ('a,'b) pairlist -> int end = struct val app = fn f => let fun g EMPTY = () | g (PAIR(a,b,r)) = (f(a,b); g r) in g end val length = fn l => let fun g(EMPTY,len) = len | g(PAIR(_,_,r),len) = g(r,len+1) in g(l,0) end end val printVerbose = fn {termToString,nontermToString,table,stateErrs,entries:int, print,printRule,errs,printCores} => let val printTerm = print o termToString val printNonterm = print o nontermToString val printCore = printCores print val printTermAction = mkPrintTermAction(printTerm,print) val printAction = mkPrintAction print val printGoto = mkPrintGoto(printNonterm,print) val printError = mkPrintError(printTerm,printRule print,print) val gotos = LrTable.describeGoto table val actions = LrTable.describeActions table val states = numStates table val gotoTableSize = ref 0 val actionTableSize = ref 0 val _ = if length errs > 0 then (printSummary print errs; print "\n"; app printError errs) else () fun loop i = if i=states then () else let val s = STATE i in (app printError (stateErrs s); print "\n"; printCore s; let val (actionList,default) = actions s val gotoList = gotos s in (PairList.app printTermAction actionList; print "\n"; PairList.app printGoto gotoList; print "\n"; print "\t."; printAction default; print "\n"; gotoTableSize:=(!gotoTableSize)+ PairList.length gotoList; actionTableSize := (!actionTableSize) + PairList.length actionList + 1 ) end; loop (i+1)) end in loop 0; print (Int.toString entries ^ " of " ^ Int.toString (!actionTableSize)^ " action table entries left after compaction\n"); print (Int.toString (!gotoTableSize)^ " goto table entries\n") end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/02/26 15:02:37 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) functor mkPrintStruct(structure LrTable : LR_TABLE structure ShrinkLrTable : SHRINK_LR_TABLE sharing LrTable = ShrinkLrTable.LrTable):PRINT_STRUCT = struct open Array List infix 9 sub structure LrTable = LrTable open ShrinkLrTable LrTable (* lineLength = approximately the largest number of characters to allow on a line when printing out an encode string *) val lineLength = 72 (* maxLength = length of a table entry. All table entries are encoded using two 16-bit integers, one for the terminal number and the other for the entry. Each integer is printed as two characters (low byte, high byte), using the ML ascii escape sequence. We need 4 characters for each escape sequence and 16 characters for each entry *) val maxLength = 16 (* number of entries we can fit on a row *) val numEntries = lineLength div maxLength (* convert integer between 0 and 255 to the three character ascii decimal escape sequence for it *) val chr = let val lookup = Array.array(256,"\000") val intToString = fn i => if i>=100 then "\\" ^ (Int.toString i) else if i>=10 then "\\0" ^ (Int.toString i) else "\\00" ^ (Int.toString i) fun loop n = if n=256 then () else (Array.update(lookup,n,intToString n); loop (n+1)) in loop 0; fn i => lookup sub i end val makeStruct = fn {table,name,print,verbose} => let val states = numStates table val rules = numRules table fun printPairList (prEntry : 'a * 'b -> unit) l = let fun f (EMPTY,_) = () | f (PAIR(a,b,r),count) = if count >= numEntries then (print "\\\n\\"; prEntry(a,b); f(r,1)) else (prEntry(a,b); f(r,(count+1))) in f(l,0) end val printList : ('a -> unit) -> 'a list -> unit = fn prEntry => fn l => let fun f (nil,_) = () | f (a :: r,count) = if count >= numEntries then (print "\\\n\\"; prEntry a; f(r,1)) else (prEntry a; f(r,count+1)) in f(l,0) end val prEnd = fn _ => print "\\000\\000\\\n\\" fun printPairRow prEntry = let val printEntries = printPairList prEntry in fn l => (printEntries l; prEnd()) end fun printPairRowWithDefault (prEntry,prDefault) = let val f = printPairRow prEntry in fn (l,default) => (prDefault default; f l) end fun printTable (printRow,count) = (print "\"\\\n\\"; let fun f i = if i=count then () else (printRow i; f (i+1)) in f 0 end; print"\"\n") val printChar = print o chr (* print an integer between 0 and 2^16-1 as a 2-byte character, with the low byte first *) val printInt = fn i => (printChar (i mod 256); printChar (i div 256)) (* encode actions as integers: ACCEPT => 0 ERROR => 1 SHIFT i => 2 + i REDUCE rulenum => numstates+2+rulenum *) val printAction = fn (REDUCE rulenum) => printInt (rulenum+states+2) | (SHIFT (STATE i)) => printInt (i+2) | ACCEPT => printInt 0 | ERROR => printInt 1 val printTermAction = fn (T t,action) => (printInt (t+1); printAction action) val printGoto = fn (NT n,STATE s) => (printInt (n+1); printInt s) val ((rowCount,rowNumbers,actionRows),entries)= shrinkActionList(table,verbose) val getActionRow = let val a = Array.fromList actionRows in fn i => a sub i end val printGotoRow : int -> unit = let val f = printPairRow printGoto val g = describeGoto table in fn i => f (g (STATE i)) end val printActionRow = let val f = printPairRowWithDefault(printTermAction,printAction) in fn i => f (getActionRow i) end in print "val "; print name; print "="; print "let val actionRows =\n"; printTable(printActionRow,rowCount); print "val actionRowNumbers =\n\""; printList (fn i => printInt i) rowNumbers; print "\"\n"; print "val gotoT =\n"; printTable(printGotoRow,states); print "val numstates = "; print (Int.toString states); print "\nval numrules = "; print (Int.toString rules); print "\n\ \val s = ref \"\" and index = ref 0\n\ \val string_to_int = fn () => \n\ \let val i = !index\n\ \in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256\n\ \end\n\ \val string_to_list = fn s' =>\n\ \ let val len = String.size s'\n\ \ fun f () =\n\ \ if !index < len then string_to_int() :: f()\n\ \ else nil\n\ \ in index := 0; s := s'; f ()\n\ \ end\n\ \val string_to_pairlist = fn (conv_key,conv_entry) =>\n\ \ let fun f () =\n\ \ case string_to_int()\n\ \ of 0 => EMPTY\n\ \ | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f())\n\ \ in f\n\ \ end\n\ \val string_to_pairlist_default = fn (conv_key,conv_entry) =>\n\ \ let val conv_row = string_to_pairlist(conv_key,conv_entry)\n\ \ in fn () =>\n\ \ let val default = conv_entry(string_to_int())\n\ \ val row = conv_row()\n\ \ in (row,default)\n\ \ end\n\ \ end\n\ \val string_to_table = fn (convert_row,s') =>\n\ \ let val len = String.size s'\n\ \ fun f ()=\n\ \ if !index < len then convert_row() :: f()\n\ \ else nil\n\ \ in (s := s'; index := 0; f ())\n\ \ end\n\ \local\n\ \ val memo = Array.array(numstates+numrules,ERROR)\n\ \ val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1))\n\ \ fun f i =\n\ \ if i=numstates then g i\n\ \ else (Array.update(memo,i,SHIFT (STATE i)); f (i+1))\n\ \ in f 0 handle Subscript => ()\n\ \ end\n\ \in\n\ \val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2))\n\ \end\n\ \val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT))\n\ \val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows)\n\ \val actionRowNumbers = string_to_list actionRowNumbers\n\ \val actionT = let val actionRowLookUp=\n\ \let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end\n\ \in Array.fromList(map actionRowLookUp actionRowNumbers)\n\ \end\n\ \in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules,\n\ \numStates=numstates,initialState=STATE "; print (Int.toString ((fn (STATE i) => i) (initialState table))); print "}\nend\n"; entries end end; (* ML-Yacc Parser Generator (c) 1991 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.2 1996/05/30 17:52:58 dbm * Lifted a let to a local in definition of createEquivalences to conform with * value restriction. * * Revision 1.1.1.1 1996/01/31 16:01:46 george * Version 109 * *) signature SORT_ARG = sig type entry val gt : entry * entry -> bool end signature SORT = sig type entry val sort : entry list -> entry list end signature EQUIV_ARG = sig type entry val gt : entry * entry -> bool val eq : entry * entry -> bool end signature EQUIV = sig type entry (* equivalences: take a list of entries and divides them into equivalence classes numbered 0 to n-1. It returns a triple consisting of: * the number of equivalence classes * a list which maps each original entry to an equivalence class. The nth entry in this list gives the equivalence class for the nth entry in the original entry list. * a list which maps equivalence classes to some representative element. The nth entry in this list is an element from the nth equivalence class *) val equivalences : entry list -> (int * int list * entry list) end (* An O(n lg n) merge sort routine *) functor MergeSortFun(A : SORT_ARG) : SORT = struct type entry = A.entry (* sort: an O(n lg n) merge sort routine. We create a list of lists and then merge these lists in passes until only one list is left.*) fun sort nil = nil | sort l = let (* merge: merge two lists *) fun merge (l as a::at,r as b::bt) = if A.gt(a,b) then b :: merge(l,bt) else a :: merge(at,r) | merge (l,nil) = l | merge (nil,r) = r (* scan: merge pairs of lists on a list of lists. Reduces the number of lists by about 1/2 *) fun scan (a :: b :: rest) = merge(a,b) :: scan rest | scan l = l (* loop: calls scan on a list of lists until only one list is left. It terminates only if the list of lists is nonempty. (The pattern match for sort ensures this.) *) fun loop (a :: nil) = a | loop l = loop (scan l) in loop (map (fn a => [a]) l) end end (* an O(n lg n) routine for placing items in equivalence classes *) functor EquivFun(A : EQUIV_ARG) : EQUIV = struct open Array List infix 9 sub (* Our algorithm for finding equivalence class is simple. The basic idea is to sort the entries and place duplicates entries in the same equivalence class. Let the original entry list be E. We map E to a list of a pairs consisting of the entry and its position in E, where the positions are numbered 0 to n-1. Call this list of pairs EP. We then sort EP on the original entries. The second elements in the pairs now specify a permutation that will return us to EP. We then scan the sorted list to create a list R of representative entries, a list P of integers which permutes the sorted list back to the original list and a list SE of integers which gives the equivalence class for the nth entry in the sorted list . We then return the length of R, R, and the list that results from permuting SE by P. *) type entry = A.entry val gt = fn ((a,_),(b,_)) => A.gt(a,b) structure Sort = MergeSortFun(type entry = A.entry * int val gt = gt) val assignIndex = fn l => let fun loop (index,nil) = nil | loop (index,h :: t) = (h,index) :: loop(index+1,t) in loop (0,l) end local fun loop ((e,_) :: t, prev, class, R , SE) = if A.eq(e,prev) then loop(t,e,class,R, class :: SE) else loop(t,e,class+1,e :: R, (class + 1) :: SE) | loop (nil,_,_,R,SE) = (rev R, rev SE) in val createEquivalences = fn nil => (nil,nil) | (e,_) :: t => loop(t, e, 0, [e],[0]) end val inversePermute = fn permutation => fn nil => nil | l as h :: _ => let val result = array(length l,h) fun loop (elem :: r, dest :: s) = (update(result,dest,elem); loop(r,s)) | loop _ = () fun listofarray i = if i < Array.length result then (result sub i) :: listofarray (i+1) else nil in loop (l,permutation); listofarray 0 end fun makePermutation x = map (fn (_,b) => b) x val equivalences = fn l => let val EP = assignIndex l val sorted = Sort.sort EP val P = makePermutation sorted val (R, SE) = createEquivalences sorted in (length R, inversePermute P SE, R) end end functor ShrinkLrTableFun(structure LrTable : LR_TABLE) : SHRINK_LR_TABLE = struct structure LrTable = LrTable open LrTable val gtAction = fn (a,b) => case a of SHIFT (STATE s) => (case b of SHIFT (STATE s') => s>s' | _ => true) | REDUCE i => (case b of SHIFT _ => false | REDUCE i' => i>i' | _ => true) | ACCEPT => (case b of ERROR => true | _ => false) | ERROR => false structure ActionEntryList = struct type entry = (term,action) pairlist * action val rec eqlist = fn (EMPTY,EMPTY) => true | (PAIR (T t,d,r),PAIR(T t',d',r')) => t=t' andalso d=d' andalso eqlist(r,r') | _ => false val rec gtlist = fn (PAIR _,EMPTY) => true | (PAIR(T t,d,r),PAIR(T t',d',r')) => t>t' orelse (t=t' andalso (gtAction(d,d') orelse (d=d' andalso gtlist(r,r')))) | _ => false val eq = fn ((l,a),(l',a')) => a=a' andalso eqlist(l,l') val gt = fn ((l,a),(l',a')) => gtAction(a,a') orelse (a=a' andalso gtlist(l,l')) end (* structure GotoEntryList = struct type entry = (nonterm,state) pairlist val rec eq = fn (EMPTY,EMPTY) => true | (PAIR (t,d,r),PAIR(t',d',r')) => t=t' andalso d=d' andalso eq(r,r') | _ => false val rec gt = fn (PAIR _,EMPTY) => true | (PAIR(NT t,STATE d,r),PAIR(NT t',STATE d',r')) => t>t' orelse (t=t' andalso (d>d' orelse (d=d' andalso gt(r,r')))) | _ => false end *) structure EquivActionList = EquivFun(ActionEntryList) val states = fn max => let fun f i=if i int = fn l => let fun g(EMPTY,len) = len | g(PAIR(_,_,r),len) = g(r,len+1) in g(l,0) end val size : (('a,'b) pairlist * 'c) list -> int = fn l => let val c = ref 0 in (app (fn (row,_) => c := !c + length row) l; !c) end val shrinkActionList = fn (table,verbose) => case EquivActionList.equivalences (map (describeActions table) (states (numStates table))) of result as (_,_,l) => (result,if verbose then size l else 0) end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:44 george * Version 109 * *) signature ABSYN = sig datatype exp = EVAR of string | EAPP of exp * exp | ETUPLE of exp list | EINT of int | FN of pat * exp | LET of decl list * exp | UNIT | SEQ of exp * exp | CODE of string and pat = PVAR of string | PAPP of string * pat | PTUPLE of pat list | PLIST of pat list | PINT of int | WILD | AS of pat * pat and decl = VB of pat * exp and rule = RULE of pat * exp val printRule : ((string -> unit) * (string -> unit)) -> rule -> unit end (* ML-Yacc Parser Generator (c) 1989, 1990 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/05/30 18:05:09 dbm * Made changes to generate code that conforms to the value restriction by * lifting lets to locals in the code generated to define errtermvalue and action. * * Revision 1.2 1996/02/26 15:02:40 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.1.1.1 1996/01/31 16:01:48 george * Version 109 * *) functor ParseGenFun(structure ParseGenParser : PARSE_GEN_PARSER where type Header.pos = int structure MakeTable : MAKE_LR_TABLE structure Verbose : VERBOSE structure PrintStruct : PRINT_STRUCT sharing MakeTable.LrTable = PrintStruct.LrTable sharing MakeTable.Errs = Verbose.Errs structure Absyn : ABSYN ) : PARSE_GEN = struct open Array List infix 9 sub structure Grammar = MakeTable.Grammar structure Header = ParseGenParser.Header open Header Grammar (* approx. maximum length of a line *) val lineLength = 70 (* record type describing names of structures in the program being generated *) datatype names = NAMES of {miscStruct : string, (* Misc{n} struct name *) tableStruct : string, (* LR table structure *) tokenStruct : string, (* Tokens{n} struct name *) actionsStruct : string, (* Actions structure *) valueStruct: string, (* semantic value structure *) ecStruct : string, (* error correction structure *) arg: string, (* user argument for parser *) tokenSig : string, (* TOKENS{n} signature *) miscSig :string, (* Signature for Misc structure *) dataStruct:string, (* name of structure in Misc *) (* which holds parser data *) dataSig:string (* signature for this structure *) } val DEBUG = true exception Semantic (* common functions and values used in printing out program *) datatype values = VALS of {say : string -> unit, saydot : string -> unit, sayln : string -> unit, pureActions: bool, pos_type : string, arg_type : string, ntvoid : string, termvoid : string, start : Grammar.nonterm, hasType : Grammar.symbol -> bool, (* actual (user) name of terminal *) termToString : Grammar.term -> string, symbolToString : Grammar.symbol -> string, (* type symbol comes from the HDR structure, and is now abstract *) term : (Header.symbol * ty option) list, nonterm : (Header.symbol * ty option) list, terms : Grammar.term list} structure SymbolHash = Hash(type elem = string val gt = (op >) : string*string -> bool) structure TermTable = Table(type key = Grammar.term val gt = fn (T i,T j) => i > j) structure SymbolTable = Table( type key = Grammar.symbol val gt = fn (TERM(T i),TERM(T j)) => i>j | (NONTERM(NT i),NONTERM(NT j)) => i>j | (NONTERM _,TERM _) => true | (TERM _,NONTERM _) => false) (* printTypes: function to print the following types in the LrValues structure and a structure containing the datatype svalue: type svalue -- it holds semantic values on the parse stack type pos -- the type of line numbers type result -- the type of the value that results from the parse The type svalue is set equal to the datatype svalue declared in the structure named by valueStruct. The datatype svalue is declared inside the structure named by valueStruct to deal with the scope of constructors. *) val printTypes = fn (VALS {say,sayln,term,nonterm,symbolToString,pos_type, arg_type, termvoid,ntvoid,saydot,hasType,start, pureActions,...}, NAMES {valueStruct,...},symbolType) => let val prConstr = fn (symbol,SOME s) => say (" | " ^ (symbolName symbol) ^ " of " ^ (if pureActions then "" else "unit -> ") ^ " (" ^ tyName s ^ ")" ) | _ => () in sayln "local open Header in"; sayln ("type pos = " ^ pos_type); sayln ("type arg = " ^ arg_type); sayln ("structure " ^ valueStruct ^ " = "); sayln "struct"; say ("datatype svalue = " ^ termvoid ^ " | " ^ ntvoid ^ " of" ^ (if pureActions then "" else " unit -> ") ^ " unit"); app prConstr term; app prConstr nonterm; sayln "\nend"; sayln ("type svalue = " ^ valueStruct ^ ".svalue"); say "type result = "; case symbolType (NONTERM start) of NONE => sayln "unit" | SOME t => (say (tyName t); sayln ""); sayln "end" end (* function to print Tokens{n} structure *) val printTokenStruct = fn (VALS {say, sayln, termToString, hasType,termvoid,terms, pureActions,...}, NAMES {miscStruct,tableStruct,valueStruct, tokenStruct,tokenSig,dataStruct,...}) => (sayln ("structure " ^ tokenStruct ^ " : " ^ tokenSig ^ " ="); sayln "struct"; sayln ("type svalue = " ^ dataStruct ^ ".svalue"); sayln "type ('a,'b) token = ('a,'b) Token.token"; let val f = fn term as T i => (say "fun "; say (termToString term); say " ("; if (hasType (TERM term)) then say "i," else (); say "p1,p2) = Token.TOKEN ("; say (dataStruct ^ "." ^ tableStruct ^ ".T "); say (Int.toString i); say ",("; say (dataStruct ^ "." ^ valueStruct ^ "."); if (hasType (TERM term)) then (say (termToString term); if pureActions then say " i" else say " (fn () => i)") else say termvoid; say ","; sayln "p1,p2))") in app f terms end; sayln "end") (* function to print signatures out - takes print function which does not need to insert line breaks *) val printSigs = fn (VALS {term,...}, NAMES {tokenSig,tokenStruct,miscSig, dataStruct, dataSig, ...}, say) => say ("signature " ^ tokenSig ^ " =\nsig\n\ \type ('a,'b) token\ntype svalue\n" ^ (List.foldr (fn ((s,ty),r) => String.concat [ "val ", symbolName s, (case ty of NONE => ": " | SOME l => ": (" ^ (tyName l) ^ ") * "), " 'a * 'a -> (svalue,'a) token\n", r]) "" term) ^ "end\nsignature " ^ miscSig ^ "=\nsig\nstructure Tokens : " ^ tokenSig ^ "\nstructure " ^ dataStruct ^ ":" ^ dataSig ^ "\nsharing type " ^ dataStruct ^ ".Token.token = Tokens.token\nsharing type " ^ dataStruct ^ ".svalue = Tokens.svalue\nend\n") (* function to print structure for error correction *) val printEC = fn (keyword : term list, preferred_change : (term list * term list) list, noshift : term list, value : (term * string) list, VALS {termToString, say,sayln,terms,saydot,hasType, termvoid,pureActions,...}, NAMES {ecStruct,tableStruct,valueStruct,...}) => let val sayterm = fn (T i) => (say "(T "; say (Int.toString i); say ")") val printBoolCase = fn ( l : term list) => (say "fn "; app (fn t => (sayterm t; say " => true"; say " | ")) l; sayln "_ => false") val printTermList = fn (l : term list) => (app (fn t => (sayterm t; say " :: ")) l; sayln "nil") fun printChange () = (sayln "val preferred_change = "; app (fn (d,i) => (say"("; printTermList d; say ","; printTermList i; sayln ")::" ) ) preferred_change; sayln "nil") val printErrValues = fn (l : (term * string) list) => (sayln "local open Header in"; sayln "val errtermvalue="; say "fn "; app (fn (t,s) => (sayterm t; say " => "; saydot valueStruct; say (termToString t); say "("; if pureActions then () else say "fn () => "; say "("; say s; say "))"; sayln " | " ) ) l; say "_ => "; say (valueStruct ^ "."); sayln termvoid; sayln "end") val printNames = fn () => let val f = fn term => (sayterm term; say " => "; say "\""; say (termToString term); sayln "\""; say " | ") in (sayln "val showTerminal ="; say "fn "; app f terms; sayln "_ => \"bogus-term\"") end val ecTerms = List.foldr (fn (t,r) => if hasType (TERM t) orelse exists (fn (a,_)=>a=t) value then r else t::r) [] terms in say "structure "; say ecStruct; sayln "="; sayln "struct"; say "open "; sayln tableStruct; sayln "val is_keyword ="; printBoolCase keyword; printChange(); sayln "val noShift = "; printBoolCase noshift; printNames (); printErrValues value; say "val terms = "; printTermList ecTerms; sayln "end" end val printAction = fn (rules, VALS {hasType,say,sayln,termvoid,ntvoid, symbolToString,saydot,start,pureActions,...}, NAMES {actionsStruct,valueStruct,tableStruct,arg,...}) => let val printAbsynRule = Absyn.printRule(say,sayln) val is_nonterm = fn (NONTERM i) => true | _ => false val numberRhs = fn r => List.foldl (fn (e,(r,table)) => let val num = case SymbolTable.find(e,table) of SOME i => i | NONE => 1 in ((e,num,hasType e orelse is_nonterm e)::r, SymbolTable.insert((e,num+1),table)) end) (nil,SymbolTable.empty) r val saySym = symbolToString val printCase = fn (i:int, r as {lhs=lhs as (NT lhsNum),prec, rhs,code,rulenum}) => (* mkToken: Build an argument *) let open Absyn val mkToken = fn (sym,num : int,typed) => let val symString = symbolToString sym val symNum = symString ^ (Int.toString num) in PTUPLE[WILD, PTUPLE[if not (hasType sym) then (if is_nonterm sym then PAPP(valueStruct^"."^ntvoid, PVAR symNum) else WILD) else PAPP(valueStruct^"."^symString, if num=1 andalso pureActions then AS(PVAR symNum,PVAR symString) else PVAR symNum), if num=1 then AS(PVAR (symString^"left"), PVAR(symNum^"left")) else PVAR(symNum^"left"), if num=1 then AS(PVAR(symString^"right"), PVAR(symNum^"right")) else PVAR(symNum^"right")]] end val numberedRhs = #1 (numberRhs rhs) (* construct case pattern *) val pat = PTUPLE[PINT i,PLIST(map mkToken numberedRhs @ [PVAR "rest671"])] (* remove terminals in argument list w/o types *) val argsWithTypes = List.foldr (fn ((_,_,false),r) => r | (s as (_,_,true),r) => s::r) nil numberedRhs (* construct case body *) val defaultPos = EVAR "defaultPos" val resultexp = EVAR "result" val resultpat = PVAR "result" val code = CODE code val rest = EVAR "rest671" val body = LET([VB(resultpat, EAPP(EVAR(valueStruct^"."^ (if hasType (NONTERM lhs) then saySym(NONTERM lhs) else ntvoid)), if pureActions then code else if argsWithTypes=nil then FN(WILD,code) else FN(WILD, let val body = LET(map (fn (sym,num:int,_) => let val symString = symbolToString sym val symNum = symString ^ Int.toString num in VB(if num=1 then AS(PVAR symString,PVAR symNum) else PVAR symNum, EAPP(EVAR symNum,UNIT)) end) (rev argsWithTypes), code) in if hasType (NONTERM lhs) then body else SEQ(body,UNIT) end)))], ETUPLE[EAPP(EVAR(tableStruct^".NT"),EINT(lhsNum)), case rhs of nil => ETUPLE[resultexp,defaultPos,defaultPos] | r =>let val (rsym,rnum,_) = hd(numberedRhs) val (lsym,lnum,_) = hd(rev numberedRhs) in ETUPLE[resultexp, EVAR (symbolToString lsym ^ Int.toString lnum ^ "left"), EVAR (symbolToString rsym ^ Int.toString rnum ^ "right")] end, rest]) in printAbsynRule (RULE(pat,body)) end val prRules = fn () => (sayln "fn (i392,defaultPos,stack,"; say " ("; say arg; sayln "):arg) =>"; sayln "case (i392,stack)"; say "of "; app (fn (rule as {rulenum,...}) => (printCase(rulenum,rule); say "| ")) rules; sayln "_ => raise (mlyAction i392)") in say "structure "; say actionsStruct; sayln " ="; sayln "struct "; sayln "exception mlyAction of int"; sayln "local open Header in"; sayln "val actions = "; prRules(); sayln "end"; say "val void = "; saydot valueStruct; sayln termvoid; say "val extract = "; say "fn a => (fn "; saydot valueStruct; if hasType (NONTERM start) then say (symbolToString (NONTERM start)) else say "ntVOID"; sayln " x => x"; sayln "| _ => let exception ParseInternal"; say "\tin raise ParseInternal end) a "; sayln (if pureActions then "" else "()"); sayln "end" end val make_parser = fn ((header, DECL {eop,change,keyword,nonterm,prec, term, control,value} : declData, rules : rule list),spec,error : pos -> string -> unit, wasError : unit -> bool) => let val verbose = List.exists (fn VERBOSE=>true | _ => false) control val defaultReductions = not (List.exists (fn NODEFAULT=>true | _ => false) control) val pos_type = let fun f nil = NONE | f ((POS s)::r) = SOME s | f (_::r) = f r in f control end val start = let fun f nil = NONE | f ((START_SYM s)::r) = SOME s | f (_::r) = f r in f control end val name = let fun f nil = NONE | f ((PARSER_NAME s)::r) = SOME s | f (_::r) = f r in f control end val header_decl = let fun f nil = NONE | f ((FUNCTOR s)::r) = SOME s | f (_::r) = f r in f control end val arg_decl = let fun f nil = ("()","unit") | f ((PARSE_ARG s)::r) = s | f (_::r) = f r in f control end val noshift = let fun f nil = nil | f ((NSHIFT s)::r) = s | f (_::r) = f r in f control end val pureActions = let fun f nil = false | f ((PURE)::r) = true | f (_::r) = f r in f control end val term = case term of NONE => (error 1 "missing %term definition"; nil) | SOME l => l val nonterm = case nonterm of NONE => (error 1 "missing %nonterm definition"; nil) | SOME l => l val pos_type = case pos_type of NONE => (error 1 "missing %pos definition"; "") | SOME l => l val termHash = List.foldr (fn ((symbol,_),table) => let val name = symbolName symbol in if SymbolHash.exists(name,table) then (error (symbolPos symbol) ("duplicate definition of " ^ name ^ " in %term"); table) else SymbolHash.add(name,table) end) SymbolHash.empty term val isTerm = fn name => SymbolHash.exists(name,termHash) val symbolHash = List.foldr (fn ((symbol,_),table) => let val name = symbolName symbol in if SymbolHash.exists(name,table) then (error (symbolPos symbol) (if isTerm name then name ^ " is defined as a terminal and a nonterminal" else "duplicate definition of " ^ name ^ " in %nonterm"); table) else SymbolHash.add(name,table) end) termHash nonterm fun makeUniqueId s = if SymbolHash.exists(s,symbolHash) then makeUniqueId (s ^ "'") else s val _ = if wasError() then raise Semantic else () val numTerms = SymbolHash.size termHash val numNonterms = SymbolHash.size symbolHash - numTerms val symError = fn sym => fn err => fn symbol => error (symbolPos symbol) (symbolName symbol^" in "^err^" is not defined as a " ^ sym) val termNum : string -> Header.symbol -> term = let val termError = symError "terminal" in fn stmt => let val stmtError = termError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; T ~1) | SOME i => T (if i Header.symbol -> nonterm = let val nontermError = symError "nonterminal" in fn stmt => let val stmtError = nontermError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; NT ~1) | SOME i => if i>=numTerms then NT (i-numTerms) else (stmtError symbol;NT ~1) end end val symbolNum : string -> Header.symbol -> Grammar.symbol = let val symbolError = symError "symbol" in fn stmt => let val stmtError = symbolError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; NONTERM (NT ~1)) | SOME i => if i>=numTerms then NONTERM(NT (i-numTerms)) else TERM(T i) end end (* map all symbols in the following values to terminals and check that the symbols are defined as terminals: eop : symbol list keyword: symbol list prec: (lexvalue * (symbol list)) list change: (symbol list * symbol list) list *) val eop = map (termNum "%eop") eop val keyword = map (termNum "%keyword") keyword val prec = map (fn (a,l) => (a,case a of LEFT => map (termNum "%left") l | RIGHT => map (termNum "%right") l | NONASSOC => map (termNum "%nonassoc") l )) prec val change = let val mapTerm = termNum "%prefer, %subst, or %change" in map (fn (a,b) => (map mapTerm a, map mapTerm b)) change end val noshift = map (termNum "%noshift") noshift val value = let val mapTerm = termNum "%value" in map (fn (a,b) => (mapTerm a,b)) value end val (rules,_) = let val symbolNum = symbolNum "rule" val nontermNum = nontermNum "rule" val termNum = termNum "%prec tag" in List.foldr (fn (RULE {lhs,rhs,code,prec},(l,n)) => ( {lhs=nontermNum lhs,rhs=map symbolNum rhs, code=code,prec=case prec of NONE => NONE | SOME t => SOME (termNum t), rulenum=n}::l,n-1)) (nil,length rules-1) rules end val _ = if wasError() then raise Semantic else () (* termToString: map terminals back to strings *) val termToString = let val data = array(numTerms,"") val unmap = fn (symbol,_) => let val name = symbolName symbol in update(data, case SymbolHash.find(name,symbolHash) of SOME i => i,name) end val _ = app unmap term in fn T i => if DEBUG andalso (i<0 orelse i>=numTerms) then "bogus-num" ^ (Int.toString i) else data sub i end val nontermToString = let val data = array(numNonterms,"") val unmap = fn (symbol,_) => let val name = symbolName symbol in update(data, case SymbolHash.find(name,symbolHash) of SOME i => i-numTerms,name) end val _ = app unmap nonterm in fn NT i => if DEBUG andalso (i<0 orelse i>=numNonterms) then "bogus-num" ^ (Int.toString i) else data sub i end (* create functions mapping terminals to precedence numbers and rules to precedence numbers. Precedence statements are listed in order of ascending (tighter binding) precedence in the specification. We receive a list composed of pairs containing the kind of precedence (left,right, or assoc) and a list of terminals associated with that precedence. The list has the same order as the corresponding declarations did in the specification. Internally, a tighter binding has a higher precedence number. We give precedences using multiples of 3: p+2 = right associative (force shift of symbol) p+1 = precedence for rule p = left associative (force reduction of rule) Nonassociative terminals are given also given a precedence of p+1. The table generator detects when the associativity of a nonassociative terminal is being used to resolve a shift/reduce conflict by checking if the precedences of the rule and the terminal are equal. A rule is given the precedence of its rightmost terminal *) val termPrec = let val precData = array(numTerms, NONE : int option) val addPrec = fn termPrec => fn term as (T i) => case precData sub i of SOME _ => error 1 ("multiple precedences specified for terminal " ^ (termToString term)) | NONE => update(precData,i,termPrec) val termPrec = fn ((LEFT,_) ,i) => i | ((RIGHT,_),i) => i+2 | ((NONASSOC,l),i) => i+1 val _ = List.foldl (fn (args as ((_,l),i)) => (app (addPrec (SOME (termPrec args))) l; i+3)) 0 prec in fn (T i) => if DEBUG andalso (i < 0 orelse i >= numTerms) then NONE else precData sub i end val elimAssoc = fn i => (i - (i mod 3) + 1) val rulePrec = let fun findRightTerm (nil,r) = r | findRightTerm (TERM t :: tail,r) = findRightTerm(tail,SOME t) | findRightTerm (_ :: tail,r) = findRightTerm(tail,r) in fn rhs => case findRightTerm(rhs,NONE) of NONE => NONE | SOME term => case termPrec term of SOME i => SOME (elimAssoc i) | a => a end val grammarRules = let val conv = fn {lhs,rhs,code,prec,rulenum} => {lhs=lhs,rhs =rhs,precedence= case prec of SOME t => (case termPrec t of SOME i => SOME(elimAssoc i) | a => a) | _ => rulePrec rhs, rulenum=rulenum} in map conv rules end (* get start symbol *) val start = case start of NONE => #lhs (hd grammarRules) | SOME name => nontermNum "%start" name val symbolType = let val data = array(numTerms+numNonterms,NONE : ty option) val unmap = fn (symbol,ty) => update(data, case SymbolHash.find(symbolName symbol,symbolHash) of SOME i => i,ty) val _ = (app unmap term; app unmap nonterm) in fn NONTERM(NT i) => if DEBUG andalso (i<0 orelse i>=numNonterms) then NONE else data sub (i+numTerms) | TERM (T i) => if DEBUG andalso (i<0 orelse i>=numTerms) then NONE else data sub i end val symbolToString = fn NONTERM i => nontermToString i | TERM i => termToString i val grammar = GRAMMAR {rules=grammarRules, terms=numTerms,nonterms=numNonterms, eop = eop, start=start,noshift=noshift, termToString = termToString, nontermToString = nontermToString, precedence = termPrec} val name' = case name of NONE => "" | SOME s => symbolName s val names = NAMES {miscStruct=name' ^ "LrValsFun", valueStruct="MlyValue", tableStruct="LrTable", tokenStruct="Tokens", actionsStruct="Actions", ecStruct="EC", arg= #1 arg_decl, tokenSig = name' ^ "_TOKENS", miscSig = name' ^ "_LRVALS", dataStruct = "ParserData", dataSig = "PARSER_DATA"} val (table,stateErrs,corePrint,errs) = MakeTable.mkTable(grammar,defaultReductions) val entries = ref 0 (* save number of action table entries here *) in let val result = TextIO.openOut (spec ^ ".sml") val sigs = TextIO.openOut (spec ^ ".sig") val pos = ref 0 val pr = fn s => TextIO.output(result,s) val say = fn s => let val l = String.size s val newPos = (!pos) + l in if newPos > lineLength then (pr "\n"; pos := l) else (pos := newPos); pr s end val saydot = fn s => (say (s ^ ".")) val sayln = fn t => (pr t; pr "\n"; pos := 0) val termvoid = makeUniqueId "VOID" val ntvoid = makeUniqueId "ntVOID" val hasType = fn s => case symbolType s of NONE => false | _ => true val terms = let fun f n = if n=numTerms then nil else (T n) :: f(n+1) in f 0 end val values = VALS {say=say,sayln=sayln,saydot=saydot, termvoid=termvoid, ntvoid = ntvoid, hasType=hasType, pos_type = pos_type, arg_type = #2 arg_decl, start=start,pureActions=pureActions, termToString=termToString, symbolToString=symbolToString,term=term, nonterm=nonterm,terms=terms} val (NAMES {miscStruct,tableStruct,dataStruct,tokenSig,tokenStruct,dataSig,...}) = names in case header_decl of NONE => (say "functor "; say miscStruct; sayln "(structure Token : TOKEN)"; say " : sig structure "; say dataStruct; say " : "; sayln dataSig; say " structure "; say tokenStruct; say " : "; sayln tokenSig; sayln " end") | SOME s => say s; sayln " = "; sayln "struct"; sayln ("structure " ^ dataStruct ^ "="); sayln "struct"; sayln "structure Header = "; sayln "struct"; sayln header; sayln "end"; sayln "structure LrTable = Token.LrTable"; sayln "structure Token = Token"; sayln "local open LrTable in "; entries := PrintStruct.makeStruct{table=table,print=pr, name = "table", verbose=verbose}; sayln "end"; printTypes(values,names,symbolType); printEC (keyword,change,noshift,value,values,names); printAction(rules,values,names); sayln "end"; printTokenStruct(values,names); sayln "end"; printSigs(values,names,fn s => TextIO.output(sigs,s)); TextIO.closeOut sigs; TextIO.closeOut result; MakeTable.Errs.printSummary (fn s => () (* commented out by sweeks so it runs silently TextIO.output(TextIO.stdOut,s) *)) errs end; if verbose then let val f = TextIO.openOut (spec ^ ".desc") val say = fn s=> TextIO.output(f,s) val printRule = let val rules = Array.fromList grammarRules in fn say => let val prRule = fn {lhs,rhs,precedence,rulenum} => ((say o nontermToString) lhs; say " : "; app (fn s => (say (symbolToString s); say " ")) rhs) in fn i => prRule (rules sub i) end end in Verbose.printVerbose {termToString=termToString,nontermToString=nontermToString, table=table, stateErrs=stateErrs,errs = errs,entries = !entries, print=say, printCores=corePrint,printRule=printRule}; TextIO.closeOut f end else () end val parseGen = fn spec => let val (result,inputSource) = ParseGenParser.parse spec in make_parser(getResult result,spec,Header.error inputSource, errorOccurred inputSource) end end; (* ML-Yacc Parser Generator (c) 1991 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.3 1996/02/26 15:02:30 george * print no longer overloaded. * use of makestring has been removed and replaced with Int.toString .. * use of IO replaced with TextIO * * Revision 1.2 1996/02/15 01:51:38 jhr * Replaced character predicates (isalpha, isnum) with functions from Char. * * Revision 1.1.1.1 1996/01/31 16:01:44 george * Version 109 * *) structure Absyn : ABSYN = struct datatype exp = CODE of string | EAPP of exp * exp | EINT of int | ETUPLE of exp list | EVAR of string | FN of pat * exp | LET of decl list * exp | SEQ of exp * exp | UNIT and pat = PVAR of string | PAPP of string * pat | PINT of int | PLIST of pat list | PTUPLE of pat list | WILD | AS of pat * pat and decl = VB of pat * exp and rule = RULE of pat * exp fun idchar #"'" = true | idchar #"_" = true | idchar c = Char.isAlpha c orelse Char.isDigit c fun code_to_ids s = let fun g(nil,r) = r | g(a as (h::t),r) = if Char.isAlpha h then f(t,[h],r) else g(t,r) and f(nil,accum,r)= implode(rev accum)::r | f(a as (h::t),accum,r) = if idchar h then f(t,h::accum,r) else g(a,implode (rev accum) :: r) in g(explode s,nil) end val simplifyRule : rule -> rule = fn (RULE(p,e)) => let val used : (string -> bool) = let fun f(CODE s) = code_to_ids s | f(EAPP(a,b)) = f a @ f b | f(ETUPLE l) = List.concat (map f l) | f(EVAR s) = [s] | f(FN(_,e)) = f e | f(LET(dl,e)) = (List.concat (map (fn VB(_,e) => f e) dl)) @ f e | f(SEQ(a,b)) = f a @ f b | f _ = nil val identifiers = f e in fn s => List.exists (fn a=>a=s) identifiers end val simplifyPat : pat -> pat = let fun f a = case a of (PVAR s) => if used s then a else WILD | (PAPP(s,pat)) => (case f pat of WILD => WILD | pat' => PAPP(s,pat')) | (PLIST l) => let val l' = map f l in if List.exists(fn WILD=>false | _ => true) l' then PLIST l' else WILD end | (PTUPLE l) => let val l' = map f l in if List.exists(fn WILD=>false | _ => true) l' then PTUPLE l' else WILD end | (AS(a,b)) => let val a'=f a val b'=f b in case(a',b') of (WILD,_) => b' | (_,WILD) => a' | _ => AS(a',b') end | _ => a in f end val simplifyExp : exp -> exp = let fun f(EAPP(a,b)) = EAPP(f a,f b) | f(ETUPLE l) = ETUPLE(map f l) | f(FN(p,e)) = FN(simplifyPat p,f e) | f(LET(dl,e)) = LET(map (fn VB(p,e) => VB(simplifyPat p,f e)) dl, f e) | f(SEQ(a,b)) = SEQ(f a,f b) | f a = a in f end in RULE(simplifyPat p,simplifyExp e) end fun printRule (say : string -> unit, sayln:string -> unit) = let val lp = ["("] val rp = [")"] val sp = [" "] val sm = [";"] val cm = [","] val cr = ["\n"] val unit = ["()"] fun printExp c = let fun f (CODE c) = ["(",c,")"] | f (EAPP(EVAR a,UNIT)) = [a," ","()"] | f (EAPP(EVAR a,EINT i)) = [a," ",Int.toString i] | f (EAPP(EVAR a,EVAR b)) = [a," ",b] | f (EAPP(EVAR a,b)) = List.concat[[a],lp,f b,rp] | f (EAPP(a,b)) = List.concat [lp,f a,rp,lp,f b,rp] | f (EINT i) = [Int.toString i] | f (ETUPLE (a::r)) = let fun scan nil = [rp] | scan (h :: t) = cm :: f h :: scan t in List.concat (lp :: f a :: scan r) end | f (ETUPLE _) = [""] | f (EVAR s) = [s] | f (FN (p,b)) = List.concat[["fn "],printPat p,[" => "],f b] | f (LET (nil,body)) = f body | f (LET (dl,body)) = let fun scan nil = [[" in "],f body,[" end"],cr] | scan (h :: t) = printDecl h :: scan t in List.concat(["let "] :: scan dl) end | f (SEQ (a,b)) = List.concat [lp,f a,sm,f b,rp] | f (UNIT) = unit in f c end and printDecl (VB (pat,exp)) = List.concat[["val "],printPat pat,["="],printExp exp,cr] and printPat c = let fun f (AS(PVAR a,PVAR b)) = [a," as ",b] | f (AS(a,b)) = List.concat [lp,f a,[") as ("],f b,rp] | f (PAPP(a,WILD)) = [a," ","_"] | f (PAPP(a,PINT i)) = [a," ",Int.toString i] | f (PAPP(a,PVAR b)) = [a," ",b] | f (PAPP(a,b)) = List.concat [lp,[a],sp,f b,rp] | f (PINT i) = [Int.toString i] | f (PLIST nil) = [""] | f (PLIST l) = let fun scan (h :: nil) = [f h] | scan (h :: t) = f h :: ["::"] :: scan t in List.concat (scan l) end | f (PTUPLE (a::r)) = let fun scan nil = [rp] | scan (h :: t) = cm :: f h :: scan t in List.concat (lp :: f a :: scan r) end | f (PTUPLE nil) = [""] | f (PVAR a) = [a] | f WILD = ["_"] in f c end fun oursay "\n" = sayln "" | oursay a = say a in fn a => let val RULE(p,e) = simplifyRule a in app oursay (printPat p); say " => "; app oursay (printExp e) end end end; (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi * * $Log$ * Revision 1.1.1.1 1996/01/31 16:01:45 george * Version 109 * *) local (* create parser *) structure LrVals = MlyaccLrValsFun(structure Token = LrParser.Token structure Hdr = Header) structure Lex = LexMLYACC(structure Tokens = LrVals.Tokens structure Hdr = Header) structure Parser = JoinWithArg(structure Lex=Lex structure ParserData = LrVals.ParserData structure LrParser= LrParser) structure ParseGenParser = ParseGenParserFun(structure Parser = Parser structure Header = Header) (* create structure for computing LALR table from a grammar *) structure MakeLrTable = mkMakeLrTable(structure IntGrammar =IntGrammar structure LrTable = LrTable) (* create structures for printing LALR tables: Verbose prints a verbose description of an lalr table PrintStruct prints an ML structure representing that is an lalr table *) structure Verbose = mkVerbose(structure Errs = MakeLrTable.Errs) structure PrintStruct = mkPrintStruct(structure LrTable = MakeLrTable.LrTable structure ShrinkLrTable = ShrinkLrTableFun(structure LrTable=LrTable)) in (* returns function which takes a file name, invokes the parser on the file, does semantic checks, creates table, and prints it *) structure ParseGen = ParseGenFun(structure ParseGenParser = ParseGenParser structure MakeTable = MakeLrTable structure Verbose = Verbose structure PrintStruct = PrintStruct structure Absyn = Absyn) end signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* main.sml *) structure Main : BMARK = struct val s = OS.FileSys.getDir() fun doit size = let fun loop n = if n = 0 then () else (ParseGen.parseGen(s^"/DATA/ml.grm"); loop(n - 1)) in loop size end fun testit _ = ParseGen.parseGen(s^"/DATA/ml.grm") end mlton-20100608/benchmark/tests/model-elimination.sml0000644000076600000240000112310311404435630020777 0ustar mtfstaff(* Benchmark from Joe Hurd on 2002-09-24. * * He writes: * * FYI: this benchmark attacks a bunch of non-trivial problems using the * model elimination first-order proof procedure. I've spent a fairly * long time optimizing this at a "high-level" (meaning data-structures * and algorithms optimizations, as well as exploiting domain knowledge, * but no tricks that speed things up for a particular ML * implementation). *) exception Empty (*#line 0.0 "$HOME/dev/sml/basic/src/PP.sig"*) (* PP -- pretty-printing -- from the SML/NJ library *) signature PP = sig type ppstream type ppconsumer = { consumer : string -> unit, linewidth : int, flush : unit -> unit } datatype break_style = CONSISTENT | INCONSISTENT val mk_ppstream : ppconsumer -> ppstream val dest_ppstream : ppstream -> ppconsumer val add_break : ppstream -> int * int -> unit val add_newline : ppstream -> unit val add_string : ppstream -> string -> unit val begin_block : ppstream -> break_style -> int -> unit val end_block : ppstream -> unit val clear_ppstream : ppstream -> unit val flush_ppstream : ppstream -> unit val with_pp : ppconsumer -> (ppstream -> unit) -> unit val pp_to_string : int -> (ppstream -> 'a -> unit) -> 'a -> string end (* This structure provides tools for creating customized Oppen-style pretty-printers, based on the type ppstream. A ppstream is an output stream that contains prettyprinting commands. The commands are placed in the stream by various function calls listed below. There following primitives add commands to the stream: begin_block, end_block, add_string, add_break, and add_newline. All calls to add_string, add_break, and add_newline must happen between a pair of calls to begin_block and end_block must be properly nested dynamically. All calls to begin_block and end_block must be properly nested (dynamically). [ppconsumer] is the type of sinks for pretty-printing. A value of type ppconsumer is a record { consumer : string -> unit, linewidth : int, flush : unit -> unit } of a string consumer, a specified linewidth, and a flush function which is called whenever flush_ppstream is called. A prettyprinter can be called outright to print a value. In addition, a prettyprinter for a base type or nullary datatype ty can be installed in the top-level system. Then the installed prettyprinter will be invoked automatically whenever a value of type ty is to be printed. [break_style] is the type of line break styles for blocks: [CONSISTENT] specifies that if any line break occurs inside the block, then all indicated line breaks occur. [INCONSISTENT] specifies that breaks will be inserted to only to avoid overfull lines. [mk_ppstream {consumer, linewidth, flush}] creates a new ppstream which invokes the consumer to output text, putting at most linewidth characters on each line. [dest_ppstream ppstrm] extracts the linewidth, flush function, and consumer from a ppstream. [add_break ppstrm (size, offset)] notifies the pretty-printer that a line break is possible at this point. * When the current block style is CONSISTENT: ** if the entire block fits on the remainder of the line, then output size spaces; else ** increase the current indentation by the block offset; further indent every item of the block by offset, and add one newline at every add_break in the block. * When the current block style is INCONSISTENT: ** if the next component of the block fits on the remainder of the line, then output size spaces; else ** issue a newline and indent to the current indentation level plus the block offset plus the offset. [add_newline ppstrm] issues a newline. [add_string ppstrm str] outputs the string str to the ppstream. [begin_block ppstrm style blockoffset] begins a new block and level of indentation, with the given style and block offset. [end_block ppstrm] closes the current block. [clear_ppstream ppstrm] restarts the stream, without affecting the underlying consumer. [flush_ppstream ppstrm] executes any remaining commands in the ppstream (that is, flushes currently accumulated output to the consumer associated with ppstrm); executes the flush function associated with the consumer; and calls clear_ppstream. [with_pp consumer f] makes a new ppstream from the consumer and applies f (which can be thought of as a producer) to that ppstream, then flushed the ppstream and returns the value of f. [pp_to_string linewidth printit x] constructs a new ppstream ppstrm whose consumer accumulates the output in a string s. Then evaluates (printit ppstrm x) and finally returns the string s. Example 1: A simple prettyprinter for Booleans: load "PP"; fun ppbool pps d = let open PP in begin_block pps INCONSISTENT 6; add_string pps (if d then "right" else "wrong"); end_block pps end; Now one may define a ppstream to print to, and exercise it: val ppstrm = PP.mk_ppstream {consumer = fn s => TextIO.output(TextIO.stdOut, s), linewidth = 72, flush = fn () => TextIO.flushOut TextIO.stdOut}; fun ppb b = (ppbool ppstrm b; PP.flush_ppstream ppstrm); - ppb false; wrong> val it = () : unit The prettyprinter may also be installed in the toplevel system; then it will be used to print all expressions of type bool subsequently computed: - installPP ppbool; > val it = () : unit - 1=0; > val it = wrong : bool - 1=1; > val it = right : bool See library Meta for a description of installPP. Example 2: Prettyprinting simple expressions (examples/pretty/ppexpr.sml): datatype expr = Cst of int | Neg of expr | Plus of expr * expr fun ppexpr pps e0 = let open PP fun ppe (Cst i) = add_string pps (Int.toString i) | ppe (Neg e) = (add_string pps "~"; ppe e) | ppe (Plus(e1, e2)) = (begin_block pps CONSISTENT 0; add_string pps "("; ppe e1; add_string pps " + "; add_break pps (0, 1); ppe e2; add_string pps ")"; end_block pps) in begin_block pps INCONSISTENT 0; ppe e0; end_block pps end val _ = installPP ppexpr; (* Some example values: *) val e1 = Cst 1; val e2 = Cst 2; val e3 = Plus(e1, Neg e2); val e4 = Plus(Neg e3, e3); val e5 = Plus(Neg e4, e4); val e6 = Plus(e5, e5); val e7 = Plus(e6, e6); val e8 = Plus(e3, Plus(e3, Plus(e3, Plus(e3, Plus(e3, Plus(e3, e7)))))); *) (*#line 0.0 "$HOME/dev/sml/basic/src/PP.sml"*) (* PP -- Oppen-style prettyprinters. * * Modified for Milton ML from SML/NJ Library version 0.2 * * COPYRIGHT (c) 1992 by AT&T Bell Laboratories. * See file mosml/copyrght/copyrght.att for details. *) (* the functions and data for actually doing printing. *) structure PP :> PP = struct open Array infix 9 sub (* the queue library, formerly in unit Ppqueue *) datatype Qend = Qback | Qfront exception QUEUE_FULL exception QUEUE_EMPTY exception REQUESTED_QUEUE_SIZE_TOO_SMALL local fun ++ i n = (i + 1) mod n fun -- i n = (i - 1) mod n in abstype 'a queue = QUEUE of {elems: 'a array, (* the contents *) front: int ref, back: int ref, size: int} (* fixed size of element array *) with fun is_empty (QUEUE{front=ref ~1, back=ref ~1,...}) = true | is_empty _ = false fun mk_queue n init_val = if (n < 2) then raise REQUESTED_QUEUE_SIZE_TOO_SMALL else QUEUE{elems=array(n, init_val), front=ref ~1, back=ref ~1, size=n} fun clear_queue (QUEUE{front,back,...}) = (front := ~1; back := ~1) fun queue_at Qfront (QUEUE{elems,front,...}) = elems sub !front | queue_at Qback (QUEUE{elems,back,...}) = elems sub !back fun en_queue Qfront item (Q as QUEUE{elems,front,back,size}) = if (is_empty Q) then (front := 0; back := 0; update(elems,0,item)) else let val i = --(!front) size in if (i = !back) then raise QUEUE_FULL else (update(elems,i,item); front := i) end | en_queue Qback item (Q as QUEUE{elems,front,back,size}) = if (is_empty Q) then (front := 0; back := 0; update(elems,0,item)) else let val i = ++(!back) size in if (i = !front) then raise QUEUE_FULL else (update(elems,i,item); back := i) end fun de_queue Qfront (Q as QUEUE{front,back,size,...}) = if (!front = !back) (* unitary queue *) then clear_queue Q else front := ++(!front) size | de_queue Qback (Q as QUEUE{front,back,size,...}) = if (!front = !back) then clear_queue Q else back := --(!back) size end (* abstype queue *) end (* local *) val magic: 'a -> 'a = fn x => x (* exception PP_FAIL of string *) datatype break_style = CONSISTENT | INCONSISTENT datatype break_info = FITS | PACK_ONTO_LINE of int | ONE_PER_LINE of int (* Some global values *) val INFINITY = 999999 abstype indent_stack = Istack of break_info list ref with fun mk_indent_stack() = Istack (ref([]:break_info list)) fun clear_indent_stack (Istack stk) = (stk := ([]:break_info list)) fun top (Istack stk) = case !stk of nil => raise Fail "PP-error: top: badly formed block" | x::_ => x fun push (x,(Istack stk)) = stk := x::(!stk) fun pop (Istack stk) = case !stk of nil => raise Fail "PP-error: pop: badly formed block" | _::rest => stk := rest end (* The delim_stack is used to compute the size of blocks. It is a stack of indices into the token buffer. The indices only point to BBs, Es, and BRs. We push BBs and Es onto the stack until a BR is encountered. Then we compute sizes and pop. When we encounter a BR in the middle of a block, we compute the Distance_to_next_break of the previous BR in the block, if there was one. We need to be able to delete from the bottom of the delim_stack, so we use a queue, treated with a stack discipline, i.e., we only add items at the head of the queue, but can delete from the front or back of the queue. *) abstype delim_stack = Dstack of int queue with fun new_delim_stack i = Dstack(mk_queue i ~1) fun reset_delim_stack (Dstack q) = clear_queue q fun pop_delim_stack (Dstack d) = de_queue Qfront d fun pop_bottom_delim_stack (Dstack d) = de_queue Qback d fun push_delim_stack(i,Dstack d) = en_queue Qfront i d fun top_delim_stack (Dstack d) = queue_at Qfront d fun bottom_delim_stack (Dstack d) = queue_at Qback d fun delim_stack_is_empty (Dstack d) = is_empty d end type block_info = { Block_size : int ref, Block_offset : int, How_to_indent : break_style } (* Distance_to_next_break includes Number_of_blanks. Break_offset is a local offset for the break. BB represents a sequence of contiguous Begins. E represents a sequence of contiguous Ends. *) datatype pp_token = S of {String : string, Length : int} | BB of {Pblocks : block_info list ref, (* Processed *) Ublocks : block_info list ref} (* Unprocessed *) | E of {Pend : int ref, Uend : int ref} | BR of {Distance_to_next_break : int ref, Number_of_blanks : int, Break_offset : int} (* The initial values in the token buffer *) val initial_token_value = S{String = "", Length = 0} (* type ppstream = General.ppstream; *) datatype ppstream_ = PPS of {consumer : string -> unit, linewidth : int, flush : unit -> unit, the_token_buffer : pp_token array, the_delim_stack : delim_stack, the_indent_stack : indent_stack, ++ : int ref -> unit, (* increment circular buffer index *) space_left : int ref, (* remaining columns on page *) left_index : int ref, (* insertion index *) right_index : int ref, (* output index *) left_sum : int ref, (* size of strings and spaces inserted *) right_sum : int ref} (* size of strings and spaces printed *) type ppstream = ppstream_ type ppconsumer = {consumer : string -> unit, linewidth : int, flush : unit -> unit} fun mk_ppstream {consumer,linewidth,flush} = if (linewidth<5) then raise Fail "PP-error: linewidth too_small" else let val buf_size = 3*linewidth in magic( PPS{consumer = consumer, linewidth = linewidth, flush = flush, the_token_buffer = array(buf_size, initial_token_value), the_delim_stack = new_delim_stack buf_size, the_indent_stack = mk_indent_stack (), ++ = fn i => i := ((!i + 1) mod buf_size), space_left = ref linewidth, left_index = ref 0, right_index = ref 0, left_sum = ref 0, right_sum = ref 0} ) : ppstream end fun dest_ppstream(pps : ppstream) = let val PPS{consumer,linewidth,flush, ...} = magic pps in {consumer=consumer,linewidth=linewidth,flush=flush} end local val space = " " fun mk_space (0,s) = String.concat s | mk_space (n,s) = mk_space((n-1), (space::s)) val space_table = Vector.tabulate(100, fn i => mk_space(i,[])) fun nspaces n = Vector.sub(space_table, n) handle General.Subscript => if n < 0 then "" else let val n2 = n div 2 val n2_spaces = nspaces n2 val extra = if (n = (2*n2)) then "" else space in String.concat [n2_spaces, n2_spaces, extra] end in fun cr_indent (ofn, i) = ofn ("\n"^(nspaces i)) fun indent (ofn,i) = ofn (nspaces i) end (* Print a the first member of a contiguous sequence of Begins. If there are "processed" Begins, then take the first off the list. If there are no processed Begins, take the last member off the "unprocessed" list. This works because the unprocessed list is treated as a stack, the processed list as a FIFO queue. How can an item on the unprocessed list be printable? Because of what goes on in add_string. See there for details. *) fun print_BB (_,{Pblocks = ref [], Ublocks = ref []}) = raise Fail "PP-error: print_BB" | print_BB (PPS{the_indent_stack,linewidth,space_left=ref sp_left,...}, {Pblocks as ref({How_to_indent=CONSISTENT,Block_size, Block_offset}::rst), Ublocks=ref[]}) = (push ((if (!Block_size > sp_left) then ONE_PER_LINE (linewidth - (sp_left - Block_offset)) else FITS), the_indent_stack); Pblocks := rst) | print_BB(PPS{the_indent_stack,linewidth,space_left=ref sp_left,...}, {Pblocks as ref({Block_size,Block_offset,...}::rst),Ublocks=ref[]}) = (push ((if (!Block_size > sp_left) then PACK_ONTO_LINE (linewidth - (sp_left - Block_offset)) else FITS), the_indent_stack); Pblocks := rst) | print_BB (PPS{the_indent_stack, linewidth, space_left=ref sp_left,...}, {Ublocks,...}) = let fun pr_end_Ublock [{How_to_indent=CONSISTENT,Block_size,Block_offset}] l = (push ((if (!Block_size > sp_left) then ONE_PER_LINE (linewidth - (sp_left - Block_offset)) else FITS), the_indent_stack); List.rev l) | pr_end_Ublock [{Block_size,Block_offset,...}] l = (push ((if (!Block_size > sp_left) then PACK_ONTO_LINE (linewidth - (sp_left - Block_offset)) else FITS), the_indent_stack); List.rev l) | pr_end_Ublock (a::rst) l = pr_end_Ublock rst (a::l) | pr_end_Ublock _ _ = raise Fail "PP-error: print_BB: internal error" in Ublocks := pr_end_Ublock(!Ublocks) [] end (* Uend should always be 0 when print_E is called. *) fun print_E (_,{Pend = ref 0, Uend = ref 0}) = raise Fail "PP-error: print_E" | print_E (istack,{Pend, ...}) = let fun pop_n_times 0 = () | pop_n_times n = (pop istack; pop_n_times(n-1)) in pop_n_times(!Pend); Pend := 0 end (* "cursor" is how many spaces across the page we are. *) fun print_token(PPS{consumer,space_left,...}, S{String,Length}) = (consumer String; space_left := (!space_left) - Length) | print_token(ppstrm,BB b) = print_BB(ppstrm,b) | print_token(PPS{the_indent_stack,...},E e) = print_E (the_indent_stack,e) | print_token (PPS{the_indent_stack,space_left,consumer,linewidth,...}, BR{Distance_to_next_break,Number_of_blanks,Break_offset}) = (case (top the_indent_stack) of FITS => (space_left := (!space_left) - Number_of_blanks; indent (consumer,Number_of_blanks)) | (ONE_PER_LINE cursor) => let val new_cursor = cursor + Break_offset in space_left := linewidth - new_cursor; cr_indent (consumer,new_cursor) end | (PACK_ONTO_LINE cursor) => if (!Distance_to_next_break > (!space_left)) then let val new_cursor = cursor + Break_offset in space_left := linewidth - new_cursor; cr_indent(consumer,new_cursor) end else (space_left := !space_left - Number_of_blanks; indent (consumer,Number_of_blanks))) fun clear_ppstream(pps : ppstream) = let val PPS{the_token_buffer, the_delim_stack, the_indent_stack,left_sum, right_sum, left_index, right_index,space_left,linewidth,...} = magic pps val buf_size = 3*linewidth fun set i = if (i = buf_size) then () else (update(the_token_buffer,i,initial_token_value); set (i+1)) in set 0; clear_indent_stack the_indent_stack; reset_delim_stack the_delim_stack; left_sum := 0; right_sum := 0; left_index := 0; right_index := 0; space_left := linewidth end (* Move insertion head to right unless adding a BB and already at a BB, or unless adding an E and already at an E. *) fun BB_inc_right_index(PPS{the_token_buffer, right_index, ++,...})= case (the_token_buffer sub (!right_index)) of (BB _) => () | _ => ++right_index fun E_inc_right_index(PPS{the_token_buffer,right_index, ++,...})= case (the_token_buffer sub (!right_index)) of (E _) => () | _ => ++right_index fun pointers_coincide(PPS{left_index,right_index,the_token_buffer,...}) = (!left_index = !right_index) andalso (case (the_token_buffer sub (!left_index)) of (BB {Pblocks = ref [], Ublocks = ref []}) => true | (BB _) => false | (E {Pend = ref 0, Uend = ref 0}) => true | (E _) => false | _ => true) fun advance_left (ppstrm as PPS{consumer,left_index,left_sum, the_token_buffer,++,...}, instr) = let val NEG = ~1 val POS = 0 fun inc_left_sum (BR{Number_of_blanks, ...}) = left_sum := (!left_sum) + Number_of_blanks | inc_left_sum (S{Length, ...}) = left_sum := (!left_sum) + Length | inc_left_sum _ = () fun last_size [{Block_size, ...}:block_info] = !Block_size | last_size (_::rst) = last_size rst | last_size _ = raise Fail "PP-error: last_size: internal error" fun token_size (S{Length, ...}) = Length | token_size (BB b) = (case b of {Pblocks = ref [], Ublocks = ref []} => raise Fail "PP-error: BB_size" | {Pblocks as ref(_::_),Ublocks=ref[]} => POS | {Ublocks, ...} => last_size (!Ublocks)) | token_size (E{Pend = ref 0, Uend = ref 0}) = raise Fail "PP-error: token_size.E" | token_size (E{Pend = ref 0, ...}) = NEG | token_size (E _) = POS | token_size (BR {Distance_to_next_break, ...}) = !Distance_to_next_break fun loop (instr) = if (token_size instr < 0) (* synchronization point; cannot advance *) then () else (print_token(ppstrm,instr); inc_left_sum instr; if (pointers_coincide ppstrm) then () else (* increment left index *) (* When this is evaluated, we know that the left_index has not yet caught up to the right_index. If we are at a BB or an E, we can increment left_index if there is no work to be done, i.e., all Begins or Ends have been dealt with. Also, we should do some housekeeping and clear the buffer at left_index, otherwise we can get errors when left_index catches up to right_index and we reset the indices to 0. (We might find ourselves adding a BB to an "old" BB, with the result that the index is not pushed onto the delim_stack. This can lead to mangled output.) *) (case (the_token_buffer sub (!left_index)) of (BB {Pblocks = ref [], Ublocks = ref []}) => (update(the_token_buffer,!left_index, initial_token_value); ++left_index) | (BB _) => () | (E {Pend = ref 0, Uend = ref 0}) => (update(the_token_buffer,!left_index, initial_token_value); ++left_index) | (E _) => () | _ => ++left_index; loop (the_token_buffer sub (!left_index)))) in loop instr end fun begin_block (pps : ppstream) style offset = let val ppstrm = magic pps : ppstream_ val PPS{the_token_buffer, the_delim_stack,left_index, left_sum, right_index, right_sum,...} = ppstrm in (if (delim_stack_is_empty the_delim_stack) then (left_index := 0; left_sum := 1; right_index := 0; right_sum := 1) else BB_inc_right_index ppstrm; case (the_token_buffer sub (!right_index)) of (BB {Ublocks, ...}) => Ublocks := {Block_size = ref (~(!right_sum)), Block_offset = offset, How_to_indent = style}::(!Ublocks) | _ => (update(the_token_buffer, !right_index, BB{Pblocks = ref [], Ublocks = ref [{Block_size = ref (~(!right_sum)), Block_offset = offset, How_to_indent = style}]}); push_delim_stack (!right_index, the_delim_stack))) end fun end_block(pps : ppstream) = let val ppstrm = magic pps : ppstream_ val PPS{the_token_buffer,the_delim_stack,right_index,...} = ppstrm in if (delim_stack_is_empty the_delim_stack) then print_token(ppstrm,(E{Pend = ref 1, Uend = ref 0})) else (E_inc_right_index ppstrm; case (the_token_buffer sub (!right_index)) of (E{Uend, ...}) => Uend := !Uend + 1 | _ => (update(the_token_buffer,!right_index, E{Uend = ref 1, Pend = ref 0}); push_delim_stack (!right_index, the_delim_stack))) end local fun check_delim_stack(PPS{the_token_buffer,the_delim_stack,right_sum,...}) = let fun check k = if (delim_stack_is_empty the_delim_stack) then () else case(the_token_buffer sub (top_delim_stack the_delim_stack)) of (BB{Ublocks as ref ((b as {Block_size, ...})::rst), Pblocks}) => if (k>0) then (Block_size := !right_sum + !Block_size; Pblocks := b :: (!Pblocks); Ublocks := rst; if (List.length rst = 0) then pop_delim_stack the_delim_stack else (); check(k-1)) else () | (E{Pend,Uend}) => (Pend := (!Pend) + (!Uend); Uend := 0; pop_delim_stack the_delim_stack; check(k + !Pend)) | (BR{Distance_to_next_break, ...}) => (Distance_to_next_break := !right_sum + !Distance_to_next_break; pop_delim_stack the_delim_stack; if (k>0) then check k else ()) | _ => raise Fail "PP-error: check_delim_stack.catchall" in check 0 end in fun add_break (pps : ppstream) (n, break_offset) = let val ppstrm = magic pps : ppstream_ val PPS{the_token_buffer,the_delim_stack,left_index, right_index,left_sum,right_sum, ++, ...} = ppstrm in (if (delim_stack_is_empty the_delim_stack) then (left_index := 0; right_index := 0; left_sum := 1; right_sum := 1) else ++right_index; update(the_token_buffer, !right_index, BR{Distance_to_next_break = ref (~(!right_sum)), Number_of_blanks = n, Break_offset = break_offset}); check_delim_stack ppstrm; right_sum := (!right_sum) + n; push_delim_stack (!right_index,the_delim_stack)) end fun flush_ppstream0(pps : ppstream) = let val ppstrm = magic pps : ppstream_ val PPS{the_delim_stack,the_token_buffer, flush, left_index,...} = ppstrm in (if (delim_stack_is_empty the_delim_stack) then () else (check_delim_stack ppstrm; advance_left(ppstrm, the_token_buffer sub (!left_index))); flush()) end end (* local *) fun flush_ppstream ppstrm = (flush_ppstream0 ppstrm; clear_ppstream ppstrm) fun add_string (pps : ppstream) s = let val ppstrm = magic pps : ppstream_ val PPS{the_token_buffer,the_delim_stack,consumer, right_index,right_sum,left_sum, left_index,space_left,++,...} = ppstrm fun fnl [{Block_size, ...}:block_info] = Block_size := INFINITY | fnl (_::rst) = fnl rst | fnl _ = raise Fail "PP-error: fnl: internal error" fun set(dstack,BB{Ublocks as ref[{Block_size,...}:block_info],...}) = (pop_bottom_delim_stack dstack; Block_size := INFINITY) | set (_,BB {Ublocks = ref(_::rst), ...}) = fnl rst | set (dstack, E{Pend,Uend}) = (Pend := (!Pend) + (!Uend); Uend := 0; pop_bottom_delim_stack dstack) | set (dstack,BR{Distance_to_next_break,...}) = (pop_bottom_delim_stack dstack; Distance_to_next_break := INFINITY) | set _ = raise (Fail "PP-error: add_string.set") fun check_stream () = if ((!right_sum - !left_sum) > !space_left) then if (delim_stack_is_empty the_delim_stack) then () else let val i = bottom_delim_stack the_delim_stack in if (!left_index = i) then set (the_delim_stack, the_token_buffer sub i) else (); advance_left(ppstrm, the_token_buffer sub (!left_index)); if (pointers_coincide ppstrm) then () else check_stream () end else () val slen = String.size s val S_token = S{String = s, Length = slen} in if (delim_stack_is_empty the_delim_stack) then print_token(ppstrm,S_token) else (++right_index; update(the_token_buffer, !right_index, S_token); right_sum := (!right_sum)+slen; check_stream ()) end (* Derived form. The +2 is for peace of mind *) fun add_newline (pps : ppstream) = let val PPS{linewidth, ...} = magic pps in add_break pps (linewidth+2,0) end (* Derived form. Builds a ppstream, sends pretty printing commands called in f to the ppstream, then flushes ppstream. *) fun with_pp ppconsumer ppfn = let val ppstrm = mk_ppstream ppconsumer in ppfn ppstrm; flush_ppstream0 ppstrm end handle Fail msg => (TextIO.print (">>>> Pretty-printer failure: " ^ msg ^ "\n")) fun pp_to_string linewidth ppfn ob = let val l = ref ([]:string list) fun attach s = l := (s::(!l)) in with_pp {consumer = attach, linewidth=linewidth, flush = fn()=>()} (fn ppstrm => ppfn ppstrm ob); String.concat(List.rev(!l)) end end (*#line 0.0 "$HOME/dev/sml/basic/src/Binarymap.sig"*) (* Binarymap -- applicative maps as balanced ordered binary trees *) (* From SML/NJ lib 0.2, copyright 1993 by AT&T Bell Laboratories *) (* Original implementation due to Stephen Adams, Southampton, UK *) signature Binarymap = sig type ('key, 'a) dict exception NotFound val mkDict : ('key * 'key -> order) -> ('key, 'a) dict val insert : ('key, 'a) dict * 'key * 'a -> ('key, 'a) dict val find : ('key, 'a) dict * 'key -> 'a val peek : ('key, 'a) dict * 'key -> 'a option val remove : ('key, 'a) dict * 'key -> ('key, 'a) dict * 'a val numItems : ('key, 'a) dict -> int val listItems : ('key, 'a) dict -> ('key * 'a) list val app : ('key * 'a -> unit) -> ('key,'a) dict -> unit val revapp : ('key * 'a -> unit) -> ('key,'a) dict -> unit val foldr : ('key * 'a * 'b -> 'b)-> 'b -> ('key,'a) dict -> 'b val foldl : ('key * 'a * 'b -> 'b) -> 'b -> ('key,'a) dict -> 'b val map : ('key * 'a -> 'b) -> ('key,'a) dict -> ('key, 'b) dict val transform : ('a -> 'b) -> ('key,'a) dict -> ('key, 'b) dict end (* [('key, 'a) dict] is the type of applicative maps from domain type 'key to range type 'a, or equivalently, applicative dictionaries with keys of type 'key and values of type 'a. They are implemented as ordered balanced binary trees. [mkDict ordr] returns a new, empty map whose keys have ordering ordr. [insert(m, i, v)] extends (or modifies) map m to map i to v. [find (m, k)] returns v if m maps k to v; otherwise raises NotFound. [peek(m, k)] returns SOME v if m maps k to v; otherwise returns NONE. [remove(m, k)] removes k from the domain of m and returns the modified map and the element v corresponding to k. Raises NotFound if k is not in the domain of m. [numItems m] returns the number of entries in m (that is, the size of the domain of m). [listItems m] returns a list of the entries (k, v) of keys k and the corresponding values v in m, in order of increasing key values. [app f m] applies function f to the entries (k, v) in m, in increasing order of k (according to the ordering ordr used to create the map or dictionary). [revapp f m] applies function f to the entries (k, v) in m, in decreasing order of k. [foldl f e m] applies the folding function f to the entries (k, v) in m, in increasing order of k. [foldr f e m] applies the folding function f to the entries (k, v) in m, in decreasing order of k. [map f m] returns a new map whose entries have form (k, f(k,v)), where (k, v) is an entry in m. [transform f m] returns a new map whose entries have form (k, f v), where (k, v) is an entry in m. *) (*#line 0.0 "$HOME/dev/sml/basic/src/Binarymap.sml"*) (* Binarymap -- modified for Milton ML * from SML/NJ library v. 0.2 file binary-dict.sml. * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. * See file mosml/copyrght/copyrght.att for details. * * This code was adapted from Stephen Adams' binary tree implementation * of applicative integer sets. * * Copyright 1992 Stephen Adams. * * This software may be used freely provided that: * 1. This copyright notice is attached to any copy, derived work, * or work including all or part of this software. * 2. Any derived work must contain a prominent notice stating that * it has been altered from the original. * * * Name(s): Stephen Adams. * Department, Institution: Electronics & Computer Science, * University of Southampton * Address: Electronics & Computer Science * University of Southampton * Southampton SO9 5NH * Great Britian * E-mail: sra@ecs.soton.ac.uk * * Comments: * * 1. The implementation is based on Binary search trees of Bounded * Balance, similar to Nievergelt & Reingold, SIAM J. Computing * 2(1), March 1973. The main advantage of these trees is that * they keep the size of the tree in the node, giving a constant * time size operation. * * 2. The bounded balance criterion is simpler than N&R's alpha. * Simply, one subtree must not have more than `weight' times as * many elements as the opposite subtree. Rebalancing is * guaranteed to reinstate the criterion for weight>2.23, but * the occasional incorrect behaviour for weight=2 is not * detrimental to performance. * *) structure Binarymap :> Binarymap = struct exception NotFound fun wt (i : int) = 3 * i datatype ('key, 'a) dict = DICT of ('key * 'key -> order) * ('key, 'a) tree and ('key, 'a) tree = E | T of {key : 'key, value : 'a, cnt : int, left : ('key, 'a) tree, right : ('key, 'a) tree} fun treeSize E = 0 | treeSize (T{cnt,...}) = cnt fun numItems (DICT(_, t)) = treeSize t local fun N(k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | N(k,v,E,r as T n) = T{key=k,value=v,cnt=1+(#cnt n),left=E,right=r} | N(k,v,l as T n,E) = T{key=k,value=v,cnt=1+(#cnt n),left=l,right=E} | N(k,v,l as T n,r as T n') = T{key=k,value=v,cnt=1+(#cnt n)+(#cnt n'),left=l,right=r} fun single_L (a,av,x,T{key=b,value=bv,left=y,right=z,...}) = N(b,bv,N(a,av,x,y),z) | single_L _ = raise Match fun single_R (b,bv,T{key=a,value=av,left=x,right=y,...},z) = N(a,av,x,N(b,bv,y,z)) | single_R _ = raise Match fun double_L (a,av,w,T{key=c,value=cv, left=T{key=b,value=bv,left=x,right=y,...}, right=z,...}) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_L _ = raise Match fun double_R (c,cv,T{key=a,value=av,left=w, right=T{key=b,value=bv,left=x,right=y,...},...},z) = N(b,bv,N(a,av,w,x),N(c,cv,y,z)) | double_R _ = raise Match fun T' (k,v,E,E) = T{key=k,value=v,cnt=1,left=E,right=E} | T' (k,v,E,r as T{right=E,left=E,...}) = T{key=k,value=v,cnt=2,left=E,right=r} | T' (k,v,l as T{right=E,left=E,...},E) = T{key=k,value=v,cnt=2,left=l,right=E} | T' (p as (_,_,E,T{left=T _,right=E,...})) = double_L p | T' (p as (_,_,T{left=E,right=T _,...},E)) = double_R p (* these cases almost never happen with small weight*) | T' (p as (_,_,E,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...})) = if ln < rn then single_L p else double_L p | T' (p as (_,_,T{left=T{cnt=ln,...},right=T{cnt=rn,...},...},E)) = if ln > rn then single_R p else double_R p | T' (p as (_,_,E,T{left=E,...})) = single_L p | T' (p as (_,_,T{right=E,...},E)) = single_R p | T' (p as (k,v,l as T{cnt=ln,left=ll,right=lr,...}, r as T{cnt=rn,left=rl,right=rr,...})) = if rn >= wt ln then (*right is too big*) let val rln = treeSize rl val rrn = treeSize rr in if rln < rrn then single_L p else double_L p end else if ln >= wt rn then (*left is too big*) let val lln = treeSize ll val lrn = treeSize lr in if lrn < lln then single_R p else double_R p end else T{key=k,value=v,cnt=ln+rn+1,left=l,right=r} local fun min (T{left=E,key,value,...}) = (key,value) | min (T{left,...}) = min left | min _ = raise Match fun delmin (T{left=E,right,...}) = right | delmin (T{key,value,left,right,...}) = T'(key,value,delmin left,right) | delmin _ = raise Match in fun delete' (E,r) = r | delete' (l,E) = l | delete' (l,r) = let val (mink,minv) = min r in T'(mink,minv,l,delmin r) end end in fun mkDict cmpKey = DICT(cmpKey, E) fun insert (DICT (cmpKey, t),x,v) = let fun ins E = T{key=x,value=v,cnt=1,left=E,right=E} | ins (T(set as {key,left,right,value,...})) = case cmpKey (key,x) of GREATER => T'(key,value,ins left,right) | LESS => T'(key,value,left,ins right) | _ => T{key=x,value=v,left=left,right=right,cnt= #cnt set} in DICT(cmpKey, ins t) end fun find (DICT(cmpKey, t), x) = let fun mem E = raise NotFound | mem (T(n as {key,left,right,...})) = case cmpKey (x,key) of GREATER => mem right | LESS => mem left | _ => #value n in mem t end fun peek arg = (SOME(find arg)) handle NotFound => NONE fun remove (DICT(cmpKey, t), x) = let fun rm E = raise NotFound | rm (set as T{key,left,right,value,...}) = (case cmpKey (key,x) of GREATER => let val (left', v) = rm left in (T'(key, value, left', right), v) end | LESS => let val (right', v) = rm right in (T'(key, value, left, right'), v) end | _ => (delete'(left,right),value)) val (newtree, valrm) = rm t in (DICT(cmpKey, newtree), valrm) end fun listItems (DICT(_, d)) = let fun d2l E res = res | d2l (T{key,value,left,right,...}) res = d2l left ((key,value) :: d2l right res) in d2l d [] end fun revapp f (DICT(_, d)) = let fun a E = () | a (T{key,value,left,right,...}) = (a right; f(key,value); a left) in a d end fun app f (DICT(_, d)) = let fun a E = () | a (T{key,value,left,right,...}) = (a left; f(key,value); a right) in a d end fun foldr f init (DICT(_, d)) = let fun a E v = v | a (T{key,value,left,right,...}) v = a left (f(key,value,a right v)) in a d init end fun foldl f init (DICT(_, d)) = let fun a E v = v | a (T{key,value,left,right,...}) v = a right (f(key,value,a left v)) in a d init end fun map f (DICT(cmpKey, d)) = let fun a E = E | a (T{key,value,left,right,cnt}) = let val left' = a left val value' = f(key,value) in T{cnt=cnt, key=key,value=value',left = left', right = a right} end in DICT(cmpKey, a d) end fun transform f (DICT(cmpKey, d)) = let fun a E = E | a (T{key,value,left,right,cnt}) = let val left' = a left in T{cnt=cnt, key=key, value=f value, left = left', right = a right} end in DICT(cmpKey, a d) end end end (*#line 0.0 "$HOME/dev/sml/basic/src/Susp.sig"*) (* Susp -- support for lazy evaluation *) signature Susp = sig type 'a susp val delay : (unit -> 'a) -> 'a susp val force : 'a susp -> 'a end (* ['a susp] is the type of lazily evaluated expressions with result type 'a. [delay (fn () => e)] creates a suspension for the expression e. The first time the suspension is forced, the expression e will be evaluated, and the result stored in the suspension. All subsequent forcing of the suspension will just return this result, so e is evaluated at most once. If the suspension is never forced, then e is never evaluated. [force su] forces the suspension su and returns the result of the expression e stored in the suspension. *) (*#line 0.0 "$HOME/dev/sml/basic/src/Susp.sml"*) (* Susp -- support for lazy evaluation 1995-05-22 *) structure Susp :> Susp = struct datatype 'a thunk = VAL of 'a | THUNK of unit -> 'a; type 'a susp = 'a thunk ref; fun delay (f : unit -> 'a) = ref (THUNK f); fun force (su : 'a susp) : 'a = case !su of VAL v => v | THUNK f => let val v = f () in su := VAL v; v end end (*#line 0.0 "$HOME/dev/sml/basic/src/Milton.sig"*) (* ========================================================================= *) (* MLton SPECIFIC FUNCTIONS *) (* Created by Joe Hurd, September 2002 *) (* ========================================================================= *) signature Milton = sig (* The ML implementation *) val ml : string (* Pointer equality using the run-time system *) (* Quotations a la Mosml *) datatype 'a frag = QUOTE of string | ANTIQUOTE of 'a (* Timing function applications a la Mosml.time *) val time : ('a -> 'b) -> 'a -> 'b (* Bring certain declarations to the top-level *) type ppstream = PP.ppstream (* Dummy versions of Mosml declarations to stop MLton barfing *) val quotation : bool ref val load : string -> unit val installPP : (ppstream -> 'a -> unit) -> unit end (*#line 0.0 "$HOME/dev/sml/basic/src/Milton.sml"*) (* ========================================================================= *) (* MLton SPECIFIC FUNCTIONS *) (* Created by Joe Hurd, September 2002 *) (* ========================================================================= *) structure Milton :> Milton = struct (* ------------------------------------------------------------------------- *) (* The ML implementation. *) (* ------------------------------------------------------------------------- *) val ml = "MLton"; (* ------------------------------------------------------------------------- *) (* Pointer equality using the run-time system. *) (* ------------------------------------------------------------------------- *) (* ------------------------------------------------------------------------- *) (* Quotations a la Mosml. *) (* ------------------------------------------------------------------------- *) datatype 'a frag = QUOTE of string | ANTIQUOTE of 'a; (* ------------------------------------------------------------------------- *) (* Timing function applications a la Mosml.time. *) (* ------------------------------------------------------------------------- *) fun time f x = let fun p t = let val s = Time.fmt 3 t in case size (List.last (String.fields (fn x => x = #".") s)) of 3 => s | 2 => s ^ "0" | 1 => s ^ "00" | _ => raise Fail "Milton.time" end val c = Timer.startCPUTimer () val r = Timer.startRealTimer () fun pt () = let val {usr, sys, ...} = Timer.checkCPUTimer c val real = Timer.checkRealTimer r in print ("User: " ^ p usr ^ " System: " ^ p sys ^ " Real: " ^ p real ^ "\n") end val y = f x handle e => (pt (); raise e) val () = pt () in y end; (* ------------------------------------------------------------------------- *) (* Bring certain declarations to the top-level. *) (* ------------------------------------------------------------------------- *) type ppstream = PP.ppstream; (* ------------------------------------------------------------------------- *) (* Dummy versions of Mosml declarations to stop MLton barfing. *) (* ------------------------------------------------------------------------- *) val quotation = ref false; val load = fn (_ : string) => (); val installPP = fn (_ : ppstream -> 'a -> unit) => (); end open Milton; (*#line 0.0 "basic/Useful.sig"*) (* ========================================================================= *) (* ML UTILITY FUNCTIONS *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) signature Useful = sig (* Exceptions, profiling and tracing *) exception ERR_EXN of {origin_function : string, message : string} exception BUG_EXN of {origin_function : string, message : string} val ERR : string -> string -> exn val BUG : string -> string -> exn val assert : bool -> exn -> unit val try : ('a -> 'b) -> 'a -> 'b val total : ('a -> 'b) -> 'a -> 'b option val can : ('a -> 'b) -> 'a -> bool val partial : exn -> ('a -> 'b option) -> 'a -> 'b val timed : ('a -> 'b) -> 'a -> real * 'b val tracing : int ref val traces : {module : string, alignment : int -> int} list ref val trace : {module : string, message : string, level : int} -> unit (* Combinators *) val C : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c val I : 'a -> 'a val K : 'a -> 'b -> 'a val N : int -> ('a -> 'a) -> 'a -> 'a val S : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c val W : ('a -> 'a -> 'b) -> 'a -> 'b val oo : ('a -> 'b) * ('c -> 'd -> 'a) -> 'c -> 'd -> 'b val ## : ('a -> 'b) * ('c -> 'd) -> 'a * 'c -> 'b * 'd (* Booleans *) val bool_to_string : bool -> string val non : ('a -> bool) -> 'a -> bool (* Pairs *) val D : 'a -> 'a * 'a val Df : ('a -> 'b) -> 'a * 'a -> 'b * 'b val fst : 'a * 'b -> 'a val snd : 'a * 'b -> 'b val pair : 'a -> 'b -> 'a * 'b val curry : ('a * 'b -> 'c) -> 'a -> 'b -> 'c val uncurry : ('a -> 'b -> 'c) -> 'a * 'b -> 'c val equal : ''a -> ''a -> bool (* State transformers *) val unit : 'a -> 's -> 'a * 's val bind : ('s -> 'a * 's) -> ('a -> 's -> 'b * 's) -> 's -> 'b * 's val mmap : ('a -> 'b) -> ('s -> 'a * 's) -> 's -> 'b * 's val join : ('s -> ('s -> 'a * 's) * 's) -> 's -> 'a * 's val mwhile : ('a -> bool) -> ('a -> 's -> 'a * 's) -> 'a -> 's -> 'a * 's (* Lists: note we count elements from 0 *) val cons : 'a -> 'a list -> 'a list val append : 'a list -> 'a list -> 'a list val wrap : 'a -> 'a list val unwrap : 'a list -> 'a val first : ('a -> 'b option) -> 'a list -> 'b option val index : ('a -> bool) -> 'a list -> int option val maps : ('a -> 's -> 'b * 's) -> 'a list -> 's -> 'b list * 's val partial_maps : ('a -> 's -> 'b option * 's) -> 'a list -> 's -> 'b list * 's val enumerate : int -> 'a list -> (int * 'a) list val cartwith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list val zipwith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list val zip : 'a list -> 'b list -> ('a * 'b) list val unzip : ('a * 'b) list -> 'a list * 'b list val split : 'a list -> int -> 'a list * 'a list (* Subscript *) val update_nth : ('a -> 'a) -> int -> 'a list -> 'a list (* Subscript *) (* Lists-as-sets *) val mem : ''a -> ''a list -> bool val insert : ''a -> ''a list -> ''a list val delete : ''a -> ''a list -> ''a list val union : ''a list -> ''a list -> ''a list val intersect : ''a list -> ''a list -> ''a list val subtract : ''a list -> ''a list -> ''a list val setify : ''a list -> ''a list val subset : ''a list -> ''a list -> bool val distinct : ''a list -> bool (* Comparisons *) val lex_compare : ('a * 'a -> order) -> ('a * 'a) list -> order (* Sorting and searching *) val min : ('a -> 'a -> bool) -> 'a list -> 'a val merge : ('a -> 'a -> bool) -> 'a list -> 'a list -> 'a list val sort : ('a -> 'a -> bool) -> 'a list -> 'a list (* Integers *) val int_to_string : int -> string val string_to_int : string -> int (* Overflow, Option *) val int_to_bits : int -> bool list val bits_to_int : bool list -> int (* Overflow *) val interval : int -> int -> int list val divides : int -> int -> bool val primes : int -> int list (* Strings *) val variant : string -> string list -> string val variant_num : string -> string list -> string val dest_prefix : string -> string -> string val is_prefix : string -> string -> bool val mk_prefix : string -> string -> string (* Reals *) val real_to_string : real -> string; (* Pretty-printing *) type 'a pp = ppstream -> 'a -> unit val LINE_LENGTH : int ref val unit_pp : 'a pp -> 'a -> unit pp val pp_unit_pp : unit pp pp val pp_map : ('a -> 'b) -> 'b pp -> 'a pp val pp_bracket : string * string -> 'a pp -> 'a pp val pp_sequence : string -> 'a pp -> 'a list pp val pp_unop : string -> 'a pp -> 'a pp val pp_binop : string -> 'a pp -> 'b pp -> ('a * 'b) pp val pp_nothing : 'a pp val pp_string : string pp val pp_unit : unit pp val pp_bool : bool pp val pp_int : int pp val pp_real : real pp val pp_order : order pp val pp_list : 'a pp -> 'a list pp val pp_pair : 'a pp -> 'b pp -> ('a * 'b) pp val pp_triple : 'a pp -> 'b pp -> 'c pp -> ('a * 'b * 'c) pp val pp_record : (string * unit pp) list -> unit pp val pp_option : 'a pp -> 'a option pp (* Sum datatype *) datatype ('a, 'b) sum = INL of 'a | INR of 'b val is_inl : ('a, 'b) sum -> bool val is_inr : ('a, 'b) sum -> bool (* Maplets *) datatype ('a, 'b) maplet = |-> of 'a * 'b val pp_maplet : 'a pp -> 'b pp -> ('a, 'b) maplet pp (* Trees *) datatype ('a, 'b) tree = BRANCH of 'a * ('a, 'b) tree list | LEAF of 'b val tree_size : ('a, 'b) tree -> int val tree_foldr : ('a -> 'c list -> 'c) -> ('b -> 'c) -> ('a, 'b) tree -> 'c val tree_foldl : ('a -> 'c -> 'c) -> ('b -> 'c -> 'd) -> 'c -> ('a, 'b) tree -> 'd list val tree_partial_foldl : ('a -> 'c -> 'c option) -> ('b -> 'c -> 'd option) -> 'c -> ('a, 'b) tree -> 'd list (* Useful imperative features *) val lazify_thunk : (unit -> 'a) -> unit -> 'a val new_int : unit -> int val new_ints : int -> int list val with_flag : 'r ref * ('r -> 'r) -> ('a -> 'b) -> 'a -> 'b (* Information about the environment *) val host : string val date : unit -> string end (*#line 0.0 "basic/Useful.sml"*) (* ========================================================================= *) (* ML UTILITY FUNCTIONS *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) structure Useful :> Useful = struct infixr 0 oo ## |->; (* ------------------------------------------------------------------------- *) (* Exceptions, profiling and tracing. *) (* ------------------------------------------------------------------------- *) exception ERR_EXN of {origin_function : string, message : string}; exception BUG_EXN of {origin_function : string, message : string}; fun ERR f s = ERR_EXN {origin_function = f, message = s}; fun BUG f s = BUG_EXN {origin_function = f, message = s}; fun ERR_to_string (ERR_EXN {origin_function, message}) = "\nERR in function " ^ origin_function ^ ":\n" ^ message ^ "\n" | ERR_to_string _ = raise BUG "ERR_to_string" "not a ERR_EXN"; fun BUG_to_string (BUG_EXN {origin_function, message}) = "\nBUG in function " ^ origin_function ^ ":\n" ^ message ^ "\n" | BUG_to_string _ = raise BUG "BUG_to_string" "not a BUG_EXN"; fun assert b e = if b then () else raise e; fun try f a = f a handle h as ERR_EXN _ => (print (ERR_to_string h); raise h) | b as BUG_EXN _ => (print (BUG_to_string b); raise b) | e => (print "\ntry: strange exception raised\n"; raise e); fun total f x = SOME (f x) handle ERR_EXN _ => NONE; fun can f = Option.isSome o total f; fun partial (e as ERR_EXN _) f x = (case f x of SOME y => y | NONE => raise e) | partial _ _ _ = raise BUG "partial" "must take a ERR_EXN"; fun timed f a = let val tmr = Timer.startCPUTimer () val res = f a val {usr, sys, ...} = Timer.checkCPUTimer tmr in (Time.toReal usr + Time.toReal sys, res) end; val tracing = ref 1; val traces : {module : string, alignment : int -> int} list ref = ref []; local val MAX = 10; val trace_printer = print; fun query m l = let val t = List.find (fn {module, ...} => module = m) (!traces) in case t of NONE => MAX | SOME {alignment, ...} => alignment l end; in fun trace {module = m, message = s, level = l} = if 0 < !tracing andalso (MAX <= !tracing orelse query m l <= !tracing) then trace_printer s else (); end; (* ------------------------------------------------------------------------- *) (* Combinators *) (* ------------------------------------------------------------------------- *) fun C f x y = f y x; fun I x = x; fun K x y = x; fun N 0 _ x = x | N n f x = N (n - 1) f (f x); fun S f g x = f x (g x); fun W f x = f x x; fun f oo g = fn x => f o (g x); (* ------------------------------------------------------------------------- *) (* Booleans *) (* ------------------------------------------------------------------------- *) fun bool_to_string true = "true" | bool_to_string false = "false"; fun non f = not o f; (* ------------------------------------------------------------------------- *) (* Pairs *) (* ------------------------------------------------------------------------- *) fun op## (f, g) (x, y) = (f x, g y); fun D x = (x, x); fun Df f = f ## f; fun fst (x,_) = x; fun snd (_,y) = y; fun pair x y = (x, y) (* Note: val add_fst = pair and add_snd = C pair; *) fun curry f x y = f (x, y); fun uncurry f (x, y) = f x y; fun equal x y = (x = y); (* ------------------------------------------------------------------------- *) (* State transformers. *) (* ------------------------------------------------------------------------- *) val unit : 'a -> 's -> 'a * 's = pair; fun bind f (g : 'a -> 's -> 'b * 's) = uncurry g o f; fun mmap f (m : 's -> 'a * 's) = bind m (unit o f); fun join (f : 's -> ('s -> 'a * 's) * 's) = bind f I; fun mwhile c b = let fun f a = if c a then bind (b a) f else unit a in f end; (* ------------------------------------------------------------------------- *) (* Lists. *) (* ------------------------------------------------------------------------- *) fun cons x y = x :: y; fun append xs ys = xs @ ys; fun wrap a = [a]; fun unwrap [a] = a | unwrap _ = raise ERR "unwrap" "not a singleton"; fun first f [] = NONE | first f (x :: xs) = (case f x of NONE => first f xs | s => s); fun index p = let fun idx _ [] = NONE | idx n (x :: xs) = if p x then SOME n else idx (n + 1) xs in idx 0 end; (* This is the pure version fun maps (_ : 'a -> 's -> 'b * 's) [] = unit [] | maps f (x :: xs) = bind (f x) (fn y => bind (maps f xs) (fn ys => unit (y :: ys))); *) (* This is an optimized version *) fun maps f = let fun g (x, (ys, s)) = let val (y, s) = f x s in (y :: ys, s) end in fn l => fn (s : 's) => (rev ## I) (foldl g ([], s) l) end; (* This is the pure version fun partial_maps (_ : 'a -> 's -> 'b option * 's) [] = unit [] | partial_maps f (x :: xs) = bind (f x) (fn yo => bind (partial_maps f xs) (fn ys => unit (case yo of NONE => ys | SOME y => y :: ys))); *) (* This is an optimized version *) fun partial_maps f = let fun g (x, (ys, s)) = let val (yo, s) = f x s in (case yo of NONE => ys | SOME y => y :: ys, s) end in fn l => fn (s : 's) => (rev ## I) (foldl g ([], s) l) end; fun enumerate n = fst o C (maps (fn x => fn m => ((m, x), m + 1))) n; fun zipwith f = let fun z l [] [] = l | z l (x :: xs) (y :: ys) = z (f x y :: l) xs ys | z _ _ _ = raise ERR "zipwith" "lists different lengths"; in fn xs => fn ys => rev (z [] xs ys) end; fun zip xs ys = zipwith pair xs ys; fun unzip ab = foldl (fn ((x, y), (xs, ys)) => (x :: xs, y :: ys)) ([], []) (rev ab); fun cartwith f = let fun aux _ res _ [] = res | aux xs_copy res [] (y :: yt) = aux xs_copy res xs_copy yt | aux xs_copy res (x :: xt) (ys as y :: _) = aux xs_copy (f x y :: res) xt ys in fn xs => fn ys => let val xs' = rev xs in aux xs' [] xs' (rev ys) end end; local fun aux res l 0 = (rev res, l) | aux _ [] _ = raise Subscript | aux res (h :: t) n = aux (h :: res) t (n - 1); in fun split l n = aux [] l n; end; fun update_nth f n l = let val (a, b) = split l n in case b of [] => raise Subscript | h :: t => a @ (f h :: t) end; (* ------------------------------------------------------------------------- *) (* Lists-as-sets. *) (* ------------------------------------------------------------------------- *) fun mem x = List.exists (equal x); fun insert x s = if mem x s then s else x :: s; fun delete x s = List.filter (not o equal x) s; (* Removes duplicates *) fun setify s = foldl (fn (v, x) => if mem v x then x else v :: x) [] s; (* For all three set operations: if s has duplicates, so may the result. *) fun union s t = foldl (fn (v, x) => if mem v x then x else v :: x) s t; fun intersect s t = foldl (fn (v, x) => if mem v t then v :: x else x) [] s; fun subtract s t = foldl (fn (v, x) => if mem v t then x else v :: x) [] s; fun subset s t = List.all (fn x => mem x t) s; fun distinct [] = true | distinct (x :: rest) = not (mem x rest) andalso distinct rest; (* ------------------------------------------------------------------------- *) (* Comparisons. *) (* ------------------------------------------------------------------------- *) fun lex_compare f = let fun lex [] = EQUAL | lex (x :: l) = case f x of EQUAL => lex l | y => y in lex end; (* ------------------------------------------------------------------------- *) (* Finding the minimal element of a list, wrt some order. *) (* ------------------------------------------------------------------------- *) fun min f = let fun min_acc best [] = best | min_acc best (h :: t) = min_acc (if f best h then best else h) t in fn [] => raise ERR "min" "empty list" | h :: t => min_acc h t end; (* ------------------------------------------------------------------------- *) (* Merge (for the following merge-sort, but generally useful too). *) (* ------------------------------------------------------------------------- *) fun merge f = let fun mrg res [] ys = foldl (op ::) ys res | mrg res xs [] = foldl (op ::) xs res | mrg res (xs as x :: xt) (ys as y :: yt) = if f x y then mrg (x :: res) xt ys else mrg (y :: res) xs yt in mrg [] end; (* ------------------------------------------------------------------------- *) (* Order function here should be <= for a stable sort... *) (* ...and I think < gives a reverse stable sort (but don't quote me). *) (* ------------------------------------------------------------------------- *) fun sort f = let fun srt [] = [] | srt (l as [x]) = l | srt l = let val halfway = length l div 2 in merge f (srt (List.take (l, halfway))) (srt (List.drop (l, halfway))) end in srt end; (* ------------------------------------------------------------------------- *) (* Integers. *) (* ------------------------------------------------------------------------- *) val int_to_string = Int.toString; val string_to_int = Option.valOf o Int.fromString; fun int_to_bits 0 = [] | int_to_bits n = (n mod 2 <> 0) :: (int_to_bits (n div 2)); fun bits_to_int [] = 0 | bits_to_int (h :: t) = (if h then curry op+ 1 else I) (2 * bits_to_int t); fun interval m 0 = [] | interval m len = m :: interval (m + 1) (len - 1); fun divides a b = if a = 0 then b = 0 else b mod (Int.abs a) = 0; local fun both f g n = f n andalso g n; fun next f = let fun nx x = if f x then x else nx (x + 1) in nx end; fun looking res 0 _ _ = rev res | looking res n f x = let val p = next f x val res' = p :: res val f' = both f (not o divides p) in looking res' (n - 1) f' (p + 1) end in fun primes n = looking [] n (K true) 2 end; (* ------------------------------------------------------------------------- *) (* Strings. *) (* ------------------------------------------------------------------------- *) fun variant x vars = if mem x vars then variant (x ^ "'") vars else x; fun variant_num x vars = let fun xn n = x ^ int_to_string n fun v n = let val x' = xn n in if mem x' vars then v (n + 1) else x' end in if mem x vars then v 1 else x end; fun dest_prefix p = let fun check s = assert (String.isPrefix p s) (ERR "dest_prefix" "") val size_p = size p in fn s => (check s; String.extract (s, size_p, NONE)) end; fun is_prefix p = can (dest_prefix p); fun mk_prefix p s = p ^ s; (* ------------------------------------------------------------------------- *) (* Reals. *) (* ------------------------------------------------------------------------- *) val real_to_string = Real.toString; (* ------------------------------------------------------------------------- *) (* Pretty-printing. *) (* ------------------------------------------------------------------------- *) type 'a pp = ppstream -> 'a -> unit; val LINE_LENGTH = ref 75; fun unit_pp pp_a a pp () = pp_a pp a; fun pp_unit_pp pp upp = upp pp (); fun pp_map f pp_a (ppstrm : ppstream) x : unit = pp_a ppstrm (f x); fun pp_bracket (l, r) pp_a pp a = (PP.begin_block pp PP.INCONSISTENT (size l); PP.add_string pp l; pp_a pp a; PP.add_string pp r; PP.end_block pp); fun pp_sequence sep pp_a = let fun pp_elt pp x = (PP.add_string pp sep; PP.add_break pp (1, 0); pp_a pp x) fun pp_seq pp [] = () | pp_seq pp (h :: t) = (pp_a pp h; app (pp_elt pp) t) in fn pp => fn l => (PP.begin_block pp PP.INCONSISTENT 0; pp_seq pp l; PP.end_block pp) end; fun pp_unop s pp_a pp a = (PP.begin_block pp PP.CONSISTENT 0; PP.add_string pp s; PP.add_break pp (1, 0); pp_a pp a; PP.end_block pp); fun pp_binop s pp_a pp_b pp (a, b) = (PP.begin_block pp PP.CONSISTENT 0; pp_a pp a; PP.add_string pp s; PP.add_break pp (1, 0); pp_b pp b; PP.end_block pp); fun pp_nothing pp _ = (PP.begin_block pp PP.CONSISTENT 0; PP.end_block pp); fun pp_string pp s = (PP.begin_block pp PP.CONSISTENT 0; PP.add_string pp s; PP.end_block pp); val pp_unit = fn z => (pp_map (K "()") pp_string) z; val pp_bool = pp_map bool_to_string pp_string; val pp_int = pp_map int_to_string pp_string; val pp_real = pp_map real_to_string pp_string; val pp_order = pp_map (fn LESS => "LESS" | EQUAL => "EQUAL" | GREATER => "GREATER") pp_string; fun pp_list pp_a = pp_bracket ("[", "]") (pp_sequence "," pp_a); fun pp_pair pp_a pp_b = pp_bracket ("(", ")") (pp_binop "," pp_a pp_b); fun pp_triple pp_a pp_b pp_c = pp_bracket ("(", ")") (pp_map (fn (a, b, c) => (a, (b, c))) (pp_binop "," pp_a (pp_binop "," pp_b pp_c))); local val pp_l = fn z => (pp_sequence "," (pp_binop " =" pp_string pp_unit_pp)) z; in fun pp_record l = pp_bracket ("{", "}") (unit_pp pp_l l); end; fun pp_option pp_a pp NONE = pp_string pp "NONE" | pp_option pp_a pp (SOME a) = pp_unop "SOME" pp_a pp a; (* ------------------------------------------------------------------------- *) (* Sums. *) (* ------------------------------------------------------------------------- *) datatype ('a, 'b) sum = INL of 'a | INR of 'b fun is_inl (INL _) = true | is_inl (INR _) = false; fun is_inr (INR _) = true | is_inr (INL _) = false; (* ------------------------------------------------------------------------- *) (* Maplets. *) (* ------------------------------------------------------------------------- *) datatype ('a, 'b) maplet = |-> of 'a * 'b; fun pp_maplet pp_a pp_b = pp_map (fn a |-> b => (a, b)) (pp_binop " |->" pp_a pp_b); (* ------------------------------------------------------------------------- *) (* Trees. *) (* ------------------------------------------------------------------------- *) datatype ('a, 'b) tree = BRANCH of 'a * ('a, 'b) tree list | LEAF of 'b; fun tree_size (LEAF _) = 1 | tree_size (BRANCH (_, t)) = foldl (op+ o (tree_size ## I)) 1 t; fun tree_foldr f_b f_l (LEAF l) = f_l l | tree_foldr f_b f_l (BRANCH (p, s)) = f_b p (map (tree_foldr f_b f_l) s); fun tree_foldl f_b f_l = let fun fold state (LEAF l, res) = f_l l state :: res | fold state (BRANCH (p, ts), res) = foldl (fold (f_b p state)) res ts in fn state => fn t => fold state (t, []) end; fun tree_partial_foldl f_b f_l = let fun fold state (LEAF l, res) = (case f_l l state of NONE => res | SOME x => x :: res) | fold state (BRANCH (p, ts), res) = (case f_b p state of NONE => res | SOME s => foldl (fold s) res ts) in fn state => fn t => fold state (t, []) end; (* ------------------------------------------------------------------------- *) (* Useful imperative features. *) (* ------------------------------------------------------------------------- *) fun lazify_thunk f = let val s = Susp.delay f in fn () => Susp.force s end; local val generator = ref 0 in fun new_int () = let val n = !generator val () = generator := n + 1 in n end; fun new_ints 0 = [] | new_ints k = let val n = !generator val () = generator := n + k in interval n k end; end; fun with_flag (r, update) f x = let val old = !r val () = r := update old val y = f x handle e => (r := old; raise e) val () = r := old in y end; (* ------------------------------------------------------------------------- *) (* Information about the environment. *) (* ------------------------------------------------------------------------- *) val host = Option.getOpt (OS.Process.getEnv "HOSTNAME", "unknown"); val date = Date.fmt "%H:%M:%S %d/%m/%Y" o Date.fromTimeLocal o Time.now; end (*#line 0.0 "basic/Queue.sig"*) (* ========================================================================= *) (* A QUEUE DATATYPE FOR ML *) (* Created by Joe Hurd, October 2001 *) (* ========================================================================= *) signature Queue = sig type 'a queue val empty : 'a queue val add : 'a -> 'a queue -> 'a queue val is_empty : 'a queue -> bool val hd : 'a queue -> 'a (* raises Empty *) val tl : 'a queue -> 'a queue (* raises Empty *) val length : 'a queue -> int val from_list : 'a list -> 'a queue val to_list : 'a queue -> 'a list val pp_queue : 'a Useful.pp -> 'a queue Useful.pp end (*#line 0.0 "basic/Queue.sml"*) (* ========================================================================= *) (* A QUEUE DATATYPE FOR ML *) (* Created by Joe Hurd, October 2001 *) (* ========================================================================= *) structure Queue :> Queue = struct type 'a queue = 'a list * 'a list; val empty : 'a queue = ([], []); fun norm ([], ys as _ :: _) = (rev ys, []) | norm q = q; fun add z (xs, ys) = norm (xs, z :: ys); fun is_empty ([], _) = true | is_empty (_ :: _, _) = false; fun hd ([], _) = raise Empty | hd (x :: _, _) = x; fun tl ([], _) = raise Empty | tl (_ :: xs, ys) = norm (xs, ys); val length = fn (xs, ys) => length xs + length ys; fun from_list l = (rev l, []); fun to_list (xs, ys) = xs @ rev ys; local open Useful; in fun pp_queue pp_a = pp_map to_list (pp_bracket ("Q[", "]") (pp_sequence "," pp_a)); end; end (*#line 0.0 "basic/Heap.sig"*) (* ========================================================================= *) (* A HEAP DATATYPE FOR ML *) (* Created by Joe Hurd, October 2001 *) (* Taken from Purely Functional Data Structures, by Chris Okasaki. *) (* ========================================================================= *) signature Heap = sig type 'a heap val empty : ('a * 'a -> order) -> 'a heap val add : 'a -> 'a heap -> 'a heap val is_empty : 'a heap -> bool val top : 'a heap -> 'a (* raises Empty *) val remove : 'a heap -> 'a * 'a heap (* raises Empty *) val size : 'a heap -> int val app : ('a -> unit) -> 'a heap -> unit val to_list : 'a heap -> 'a list val pp_heap : 'a Useful.pp -> 'a heap Useful.pp end (*#line 0.0 "basic/Heap.sml"*) (* ========================================================================= *) (* A HEAP DATATYPE FOR ML *) (* Created by Joe Hurd, October 2001 *) (* Taken from Purely Functional Data Structures, by Chris Okasaki. *) (* ========================================================================= *) (* *) structure Heap :> Heap = struct datatype 'a node = E | T of int * 'a * 'a node * 'a node; datatype 'a heap = Heap of ('a * 'a -> order) * int * 'a node; fun rank E = 0 | rank (T (r, _, _, _)) = r; fun makeT (x, a, b) = if rank a >= rank b then T (rank b + 1, x, a, b) else T (rank a + 1, x, b, a); fun merge f = let fun mrg (h, E) = h | mrg (E, h) = h | mrg (h1 as T (_, x, a1, b1), h2 as T (_, y, a2, b2)) = (case f (x, y) of GREATER => makeT (y, a2, mrg (h1, b2)) | _ => makeT (x, a1, mrg (b1, h2))) in mrg end; fun empty f = Heap (f, 0, E); fun add x (Heap (f, n, a)) = Heap (f, n + 1, merge f (T (1, x, E, E), a)); fun is_empty (Heap (_, _, E)) = true | is_empty (Heap (_, _, T _)) = false; fun top (Heap (_, _, E)) = raise Empty | top (Heap (_, _, T (_, x, _, _))) = x; fun remove (Heap (_, _, E)) = raise Empty | remove (Heap (f, n, T (_, x, a, b))) = (x, Heap (f, n - 1, merge f (a, b))); fun size (Heap (_, n, _)) = n; fun app f = let fun ap [] = () | ap (E :: rest) = ap rest | ap (T (_, d, a, b) :: rest) = (f d; ap (a :: b :: rest)) in fn Heap (_, _, a) => ap [a] end; local fun to_lst res h = if is_empty h then rev res else let val (x, h) = remove h in to_lst (x :: res) h end; in fun to_list h = to_lst [] h; end; local open Useful; in fun pp_heap pp_a = pp_map to_list (pp_bracket ("H[", "]") (pp_sequence "," pp_a)); end; end (*#line 0.0 "basic/Multiset.sig"*) (* ========================================================================= *) (* A MULTISET DATATYPE FOR ML *) (* Created by Joe Hurd, July 2002 *) (* ========================================================================= *) signature Multiset = sig type 'a mset val empty : ('a * 'a -> order) -> 'a mset val insert : 'a * int -> 'a mset -> 'a mset val count : 'a mset -> 'a -> int val union : 'a mset -> 'a mset -> 'a mset val compl : 'a mset -> 'a mset val subtract : 'a mset -> 'a mset -> 'a mset val subset : 'a mset -> 'a mset -> bool val compare : 'a mset * 'a mset -> order option val app : ('a * int -> unit) -> 'a mset -> unit val to_list : 'a mset -> ('a * int) list val pp_mset : 'a Useful.pp -> 'a mset Useful.pp end (*#line 0.0 "basic/Multiset.sml"*) (* ========================================================================= *) (* A MULTISET DATATYPE FOR ML *) (* Created by Joe Hurd, July 2002 *) (* ========================================================================= *) (* List.app load ["Binarymap", "Useful"]; *) (* *) structure Multiset :> Multiset = struct structure M = Binarymap; fun Mpurge m k = let val (m, _) = M.remove (m, k) in m end; fun Mall p = let exception Cut fun f (x, y, ()) = if p (x, y) then () else raise Cut in fn a => (M.foldl f () a; true) handle Cut => false end; type 'a mset = ('a, int) M.dict; fun empty ord : 'a mset = M.mkDict ord; fun insert (_, 0) a = a | insert (x, n) a = (case M.peek (a, x) of NONE => M.insert (a, x, n) | SOME n' => let val n'' = n + n' in if n'' = 0 then Mpurge a x else M.insert (a, x, n'') end); fun count m x = case M.peek (m, x) of SOME n => n | NONE => 0; local fun un a b = M.foldl (fn (x : 'a, n : int, d) => insert (x, n) d) a b; in fun union a b = if M.numItems a < M.numItems b then un b a else un a b; end; fun compl a : 'a mset = M.transform ~ a; fun subtract a b = union a (compl b); local fun sign a = (Mall (fn (_, n) => 0 <= n) a, Mall (fn (_, n) => n <= 0) a); in fun compare (a, b) = (case sign (subtract a b) of (true, true) => SOME EQUAL | (true, false) => SOME GREATER | (false, true) => SOME LESS | (false, false) => NONE); end; fun subset a b = (case compare (a, b) of SOME LESS => true | SOME EQUAL => true | _ => false); fun app f (a : 'a mset) = M.app f a; fun to_list (a : 'a mset) = M.listItems a; local open Useful; in fun pp_mset pp_a = pp_map (map Useful.|-> o to_list) (pp_bracket ("M[", "]") (pp_sequence "," (Useful.pp_maplet pp_a pp_int))); end; end (*#line 0.0 "basic/Stream.sig"*) (* ========================================================================= *) (* A POSSIBLY-INFINITE STREAM DATATYPE FOR ML *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) signature Stream = sig datatype 'a stream = NIL | CONS of 'a * (unit -> 'a stream) type 'a Sthk = unit -> 'a stream (* If you're wondering how to create an infinite stream: *) (* val stream4 = let fun s4 () = CONS 4 s4 in s4 () end; *) val cons : 'a -> (unit -> 'a stream) -> 'a stream val null : 'a stream -> bool val hd : 'a stream -> 'a (* raises Empty *) val tl : 'a stream -> 'a stream (* raises Empty *) val dest : 'a stream -> 'a * 'a stream (* raises Empty *) val repeat : 'a -> 'a stream val count : int -> int stream val fold : ('a -> (unit -> 'b) -> 'b) -> 'b -> 'a stream -> 'b val map : ('a -> 'b) -> 'a stream -> 'b stream val map_thk : ('a Sthk -> 'a Sthk) -> 'a Sthk -> 'a Sthk val partial_map : ('a -> 'b option) -> 'a stream -> 'b stream val maps : ('a -> 'c -> 'b * 'c) -> 'c -> 'a stream -> 'b stream val partial_maps : ('a -> 'c -> 'b option * 'c) -> 'c -> 'a stream -> 'b stream val filter : ('a -> bool) -> 'a stream -> 'a stream val flatten : 'a stream stream -> 'a stream val zipwith : ('a -> 'b -> 'c) -> 'a stream -> 'b stream -> 'c stream val zip : 'a stream -> 'b stream -> ('a * 'b) stream val take : int -> 'a stream -> 'a stream (* raises Subscript *) val drop : int -> 'a stream -> 'a stream (* raises Subscript *) val to_list : 'a stream -> 'a list val from_list : 'a list -> 'a stream val from_textfile : string -> string stream (* lines of the file *) end (*#line 0.0 "basic/Stream.sml"*) (* ========================================================================= *) (* A POSSIBLY-INFINITE STREAM DATATYPE FOR ML *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) structure Stream :> Stream = struct open Useful; infixr 0 oo ##; (* ------------------------------------------------------------------------- *) (* The datatype declaration encapsulates all the primitive operations. *) (* ------------------------------------------------------------------------- *) datatype 'a stream = NIL | CONS of 'a * (unit -> 'a stream); type 'a Sthk = unit -> 'a stream; (* ------------------------------------------------------------------------- *) (* Useful functions. *) (* ------------------------------------------------------------------------- *) val cons = fn z => curry CONS z; fun null NIL = true | null (CONS _) = false; fun hd NIL = raise Empty | hd (CONS (h, _)) = h; fun tl NIL = raise Empty | tl (CONS (_, t)) = t (); fun dest s = (hd s, tl s); fun repeat x = let fun rep () = CONS (x, rep) in rep () end; fun count n = CONS (n, fn () => count (n + 1)); fun fold b c = let fun f NIL = c | f (CONS (x, xs)) = b x (fn () => f (xs ())) in f end; fun map f = let fun m NIL = NIL | m (CONS (h, t)) = CONS (f h, fn () => m (t ())) in m end; fun map_thk f = let fun mt NIL = NIL | mt (CONS (h, t)) = CONS (h, mt' t) and mt' t = f (fn () => mt (t ())) in mt' end; fun partial_map f = let fun mp NIL = NIL | mp (CONS (h, t)) = case f h of NONE => mp (t ()) | SOME h' => CONS (h', fn () => mp (t ())) in mp end; fun maps f = let fun mm _ NIL = NIL | mm s (CONS (x, xs)) = let val (y, s') = f x s in CONS (y, fn () => mm s' (xs ())) end in mm end; fun partial_maps f = let fun mm _ NIL = NIL | mm s (CONS (x, xs)) = let val (yo, s') = f x s val t = mm s' o xs in case yo of NONE => t () | SOME y => CONS (y, t) end in mm end; fun filter f = partial_map (fn x => if f x then SOME x else NONE); fun flatten NIL = NIL | flatten (CONS (NIL, ss)) = flatten (ss ()) | flatten (CONS (CONS (x, xs), ss)) = CONS (x, fn () => flatten (CONS (xs (), ss))); fun zipwith f = let fun z NIL _ = NIL | z _ NIL = NIL | z (CONS (x, xs)) (CONS (y, ys)) = CONS (f x y, fn () => z (xs ()) (ys ())) in z end; fun zip s t = zipwith pair s t; fun take 0 s = NIL | take n NIL = raise Subscript | take 1 (CONS (x, _)) = CONS (x, K NIL) | take n (CONS (x, xs)) = CONS (x, fn () => take (n - 1) (xs ())); fun drop n s = N n tl s handle Empty => raise Subscript; local fun to_lst res NIL = res | to_lst res (CONS (x, xs)) = to_lst (x :: res) (xs ()); in val to_list = fn z => (rev o to_lst []) z end; fun from_list [] = NIL | from_list (x :: xs) = CONS (x, fn () => from_list xs); fun from_textfile filename = let open TextIO val fh = openIn filename fun res () = case inputLine fh of NONE => (closeIn fh; NIL) | SOME s => CONS (s, lazify_thunk res) in res () end; end (*#line 0.0 "basic/Parser.sig"*) (* ========================================================================= *) (* PARSER COMBINATORS *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) signature Parser = sig (* Recommended fixities infixr 9 >>++; infixr 8 ++; infixr 7 >>; infixr 6 ||; *) type 'a pp = 'a Useful.pp type 'a stream = 'a Stream.stream (* Generic *) exception Noparse val ++ : ('a -> 'b * 'a) * ('a -> 'c * 'a) -> 'a -> ('b * 'c) * 'a val >> : ('a -> 'b * 'a) * ('b -> 'c) -> 'a -> 'c * 'a val >>++ : ('a -> 'b * 'a) * ('b -> 'a -> 'c * 'a) -> 'a -> 'c * 'a val || : ('a -> 'b * 'a) * ('a -> 'b * 'a) -> 'a -> 'b * 'a val many : ('a -> 'b * 'a) -> 'a -> 'b list * 'a val atleastone : ('a -> 'b * 'a) -> 'a -> 'b list * 'a val nothing : 'a -> unit * 'a val optional : ('a -> 'b * 'a) -> 'a -> 'b option * 'a (* Stream-based *) type ('a, 'b) parser = 'a stream -> 'b * 'a stream val maybe : ('a -> 'b option) -> ('a, 'b) parser val finished : ('a, unit) parser val some : ('a -> bool) -> ('a, 'a) parser val any : ('a, 'a) parser val exact : ''a -> (''a, ''a) parser (* Parsing and pretty-printing for infix operators *) type infixities = {tok : string, prec : int, left_assoc : bool} list type 'a con = string * 'a * 'a -> 'a type 'a des = 'a -> (string * 'a * 'a) option type 'a iparser = (string, 'a) parser type 'a iprinter = ('a * bool) pp val optoks : infixities -> string list val parse_left_infix : string list -> 'a con -> 'a iparser -> 'a iparser val parse_right_infix : string list -> 'a con -> 'a iparser -> 'a iparser val parse_infixes : infixities -> 'a con -> 'a iparser -> 'a iparser val pp_left_infix : string list -> 'a des -> 'a iprinter -> 'a iprinter val pp_right_infix : string list -> 'a des -> 'a iprinter -> 'a iprinter val pp_infixes : infixities -> 'a des -> 'a iprinter -> 'a iprinter (* Lexing *) val space : char -> bool val digit : char -> bool val lower : char -> bool val upper : char -> bool val alpha : char -> bool val alphanum : char -> bool (* alpha + digit + _ + ' *) val symbol : char -> bool (* <>=-*+/\?@|!$%&~#^: *) val punct : char -> bool (* ()[]{}.,; *) (* Quotations *) type 'a quotation = 'a frag list val quotation_parser : (string -> 'a) -> 'b pp -> 'b quotation -> 'a end (*#line 0.0 "basic/Parser.sml"*) (* ========================================================================= *) (* PARSER COMBINATORS *) (* Created by Joe Hurd, April 2001 *) (* ========================================================================= *) (* app load ["Useful", "Stream"]; *) (* *) structure Parser :> Parser = struct open Useful; structure S = Stream; infixr 9 >>++; infixr 8 ++; infixr 7 >>; infixr 6 ||; infix ##; type 'a stream = 'a Stream.stream; val omap = Option.map; (* ------------------------------------------------------------------------- *) (* Generic. *) (* ------------------------------------------------------------------------- *) exception Noparse; fun op ++ (parser1, parser2) input = let val (result1, rest1) = parser1 input val (result2, rest2) = parser2 rest1 in ((result1, result2), rest2) end; fun op >> (parser, treatment) input = let val (result, rest) = parser input in (treatment result, rest) end; fun op >>++ (parser, treatment) input = let val (result, rest) = parser input in treatment result rest end; fun op || (parser1, parser2) input = parser1 input handle Noparse => parser2 input; fun many parser input = let val (result, next) = parser input val (results, rest) = many parser next in ((result :: results), rest) end handle Noparse => ([], input); fun atleastone p = (p ++ many p) >> op::; fun nothing input = ((), input); fun optional p = (p >> SOME) || (nothing >> K NONE); (* ------------------------------------------------------------------------- *) (* Stream-based. *) (* ------------------------------------------------------------------------- *) type ('a, 'b) parser = 'a stream -> 'b * 'a stream fun maybe p S.NIL = raise Noparse | maybe p (S.CONS (h, t)) = case p h of SOME r => (r, t ()) | NONE => raise Noparse; fun finished S.NIL = ((), S.NIL) | finished (S.CONS _) = raise Noparse; val finished: ('a, unit) parser = finished fun some p = maybe (fn x => if p x then SOME x else NONE); fun any input = some (K true) input; fun exact tok = some (fn item => item = tok); (* ------------------------------------------------------------------------- *) (* Parsing and pretty-printing for infix operators. *) (* ------------------------------------------------------------------------- *) type infixities = {tok : string, prec : int, left_assoc : bool} list; type 'a con = string * 'a * 'a -> 'a; type 'a des = 'a -> (string * 'a * 'a) option; type 'a iparser = (string, 'a) parser; type 'a iprinter = ('a * bool) pp; local val sort_ops : infixities -> infixities = let fun order {prec, tok = _, left_assoc = _} {prec = prec', tok = _, left_assoc = _} = prec < prec' in sort order end; fun unflatten ({tok, prec, left_assoc}, ([], _)) = ([(left_assoc, [tok])], prec) | unflatten ({tok, prec, left_assoc}, ((a, l) :: dealt, p)) = if p = prec then (assert (left_assoc = a) (BUG "infix parser/printer" "mixed assocs"); ((a, tok :: l) :: dealt, p)) else ((left_assoc, [tok]) :: (a, l) :: dealt, prec); in val layerops = fst o foldl unflatten ([], 0) o sort_ops; end; local fun chop (#" " :: chs) = (curry op+ 1 ## I) (chop chs) | chop chs = (0, chs); fun nspaces n = N n (curry op^ " ") ""; fun spacify tok = let val chs = explode tok val (r, chs) = chop (rev chs) val (l, chs) = chop (rev chs) in ((l, r), implode chs) end; fun lrspaces (l, r) = (if l = 0 then K () else C PP.add_string (nspaces l), if r = 0 then K () else C PP.add_break (r, 0)); in val op_spaces = (lrspaces ## I) o spacify; val op_clean = snd o spacify; end; val optoks : infixities -> string list = map (fn {tok, ...} => op_clean tok); fun parse_gen_infix update sof toks parse inp = let val (e, rest) = parse inp val continue = case rest of S.NIL => NONE | S.CONS (h, t) => if mem h toks then SOME (h, t) else NONE in case continue of NONE => (sof e, rest) | SOME (h, t) => parse_gen_infix update (update sof h e) toks parse (t ()) end; fun parse_left_infix toks con = parse_gen_infix (fn f => fn t => fn a => fn b => con (t, f a, b)) I toks; fun parse_right_infix toks con = parse_gen_infix (fn f => fn t => fn a => fn b => f (con (t, a, b))) I toks; fun parse_infixes ops = let val layeredops = map (I ## map op_clean) (layerops ops) fun iparser (a, t) = (if a then parse_left_infix else parse_right_infix) t val iparsers = map iparser layeredops in fn con => fn subparser => foldl (fn (p, sp) => p con sp) subparser iparsers end; fun pp_gen_infix left toks : 'a des -> 'a iprinter -> 'a iprinter = let val spc = map op_spaces toks in fn dest => fn pp_sub => let fun dest' tm = case dest tm of NONE => NONE | SOME (t, a, b) => omap (pair (a, b)) (List.find (equal t o snd) spc) open PP fun pp_go pp (tmr as (tm, r)) = case dest' tm of NONE => pp_sub pp tmr | SOME ((a, b), ((lspc, rspc), tok)) => ((if left then pp_go else pp_sub) pp (a, true); lspc pp; add_string pp tok; rspc pp; (if left then pp_sub else pp_go) pp (b, r)) in fn pp => fn tmr as (tm, _) => case dest' tm of NONE => pp_sub pp tmr | SOME _ => (begin_block pp INCONSISTENT 0; pp_go pp tmr; end_block pp) end end; fun pp_left_infix toks = pp_gen_infix true toks; fun pp_right_infix toks = pp_gen_infix false toks; fun pp_infixes ops = let val layeredops = layerops ops val toks = List.concat (map (map op_clean o snd) layeredops) fun iprinter (a, t) = (if a then pp_left_infix else pp_right_infix) t val iprinters = map iprinter layeredops in fn dest => fn pp_sub => let fun printer sub = foldl (fn (ip, p) => ip dest p) sub iprinters fun is_op t = case dest t of SOME (x, _, _) => mem x toks | _ => false open PP fun subpr pp (tmr as (tm, _)) = if is_op tm then (begin_block pp INCONSISTENT 1; add_string pp "("; printer subpr pp (tm, false); add_string pp ")"; end_block pp) else pp_sub pp tmr in fn pp => fn tmr => (begin_block pp INCONSISTENT 0; printer subpr pp tmr; end_block pp) end end; (* ------------------------------------------------------------------------- *) (* Lexing. *) (* ------------------------------------------------------------------------- *) val space = Char.isSpace; val digit = Char.isDigit; val lower = Char.isLower; val upper = Char.isUpper; val alpha = Char.isAlpha; val alphanum = fn c => alpha c orelse digit c orelse c = #"'" orelse c = #"_"; val symbol = Char.contains "<>=-*+/\\?@|!$%&~#^:"; val punct = Char.contains "()[]{}.,;"; (* ------------------------------------------------------------------------- *) (* Quotations. *) (* ------------------------------------------------------------------------- *) type 'a quotation = 'a frag list; fun quotation_parser parser pp_a = let val f = PP.pp_to_string (!LINE_LENGTH) pp_a in parser o foldl (fn (QUOTE q, s) => s ^ q | (ANTIQUOTE a, s) => s ^ f a) "" end; end (*#line 0.0 "fol/Term1.sig"*) (* ========================================================================= *) (* BASIC FIRST-ORDER LOGIC MANIPULATIONS *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) signature Term1 = sig type 'a pp = 'a Useful.pp type ('a, 'b) maplet = ('a, 'b) Useful.maplet type 'a quotation = 'a Parser.quotation type infixities = Parser.infixities (* Datatypes for terms and formulas *) datatype term = Var of string | Fn of string * term list datatype formula = True | False | Atom of term | Not of formula | And of formula * formula | Or of formula * formula | Imp of formula * formula | Iff of formula * formula | Forall of string * formula | Exists of string * formula (* Contructors and destructors *) val dest_var : term -> string val is_var : term -> bool val dest_fn : term -> string * term list val is_fn : term -> bool val fn_name : term -> string val fn_args : term -> term list val fn_arity : term -> int val fn_function : term -> string * int val mk_const : string -> term val dest_const : term -> string val is_const : term -> bool val mk_binop : string -> term * term -> term val dest_binop : string -> term -> term * term val is_binop : string -> term -> bool val dest_atom : formula -> term val is_atom : formula -> bool val list_mk_conj : formula list -> formula val strip_conj : formula -> formula list val flatten_conj : formula -> formula list val list_mk_disj : formula list -> formula val strip_disj : formula -> formula list val flatten_disj : formula -> formula list val list_mk_forall : string list * formula -> formula val strip_forall : formula -> string list * formula val list_mk_exists : string list * formula -> formula val strip_exists : formula -> string list * formula (* New variables *) val new_var : unit -> term val new_vars : int -> term list (* Sizes of terms and formulas *) val term_size : term -> int val formula_size : formula -> int (* Total comparison functions for terms and formulas *) val term_compare : term * term -> order val formula_compare : formula * formula -> order (* Operations on literals *) val mk_literal : bool * formula -> formula val dest_literal : formula -> bool * formula val is_literal : formula -> bool val literal_atom : formula -> formula (* Operations on formula negations *) val negative : formula -> bool val positive : formula -> bool val negate : formula -> formula (* Functions and relations in a formula *) val functions : formula -> (string * int) list val function_names : formula -> string list val relations : formula -> (string * int) list val relation_names : formula -> string list (* The equality relation has a special status *) val eq_rel : string * int val mk_eq : term * term -> formula val dest_eq : formula -> term * term val is_eq : formula -> bool val lhs : formula -> term val rhs : formula -> term val eq_occurs : formula -> bool val relations_no_eq : formula -> (string * int) list (* Free variables *) val FVT : term -> string list val FV : formula -> string list val FVL : formula list -> string list val specialize : formula -> formula val generalize : formula -> formula (* Subterms *) val subterm : int list -> term -> term val rewrite : (int list, term) maplet -> term -> term val literal_subterm : int list -> formula -> term val literal_rewrite : (int list, term) maplet -> formula -> formula (* The Knuth-Bendix ordering *) type Weight = string * int -> int type Prec = (string * int) * (string * int) -> order val kb_weight : Weight -> term -> int * string Multiset.mset val kb_compare : Weight -> Prec -> term * term -> order option (* A datatype to antiquote both terms and formulas *) datatype thing = Term of term | Formula of formula; (* Operators parsed and printed infix *) val infixes : infixities ref (* Deciding whether a string denotes a variable or constant *) val var_string : (string -> bool) ref (* Parsing *) val string_to_term' : infixities -> string -> term (* purely functional *) val string_to_formula' : infixities -> string -> formula val parse_term' : infixities -> thing quotation -> term val parse_formula' : infixities -> thing quotation -> formula val string_to_term : string -> term (* using !infixes *) val string_to_formula : string -> formula val parse_term : thing quotation -> term val parse_formula : thing quotation -> formula (* Pretty-printing *) val pp_term' : infixities -> term pp (* purely functional *) val pp_formula' : infixities -> formula pp val term_to_string' : infixities -> int -> term -> string val formula_to_string' : infixities -> int -> formula -> string val pp_term : term pp (* using !infixes *) val pp_formula : formula pp (* and !LINE_LENGTH *) val term_to_string : term -> string val formula_to_string : formula -> string end (*#line 0.0 "fol/Term1.sml"*) (* ========================================================================= *) (* BASIC FIRST-ORDER LOGIC MANIPULATIONS *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) (* app load ["Useful", "Stream", "Parser", "Mosml", "Binarymap"]; *) (* *) structure Term1 :> Term1 = struct open Parser Useful; infixr 8 ++; infixr 7 >>; infixr 6 ||; infixr |-> ::> @> oo ##; (* ------------------------------------------------------------------------- *) (* Datatypes for storing first-order terms and formulas. *) (* ------------------------------------------------------------------------- *) datatype term = Var of string | Fn of string * term list; datatype formula = True | False | Atom of term | Not of formula | And of formula * formula | Or of formula * formula | Imp of formula * formula | Iff of formula * formula | Forall of string * formula | Exists of string * formula; (* ------------------------------------------------------------------------- *) (* Constructors and destructors. *) (* ------------------------------------------------------------------------- *) (* Variables *) fun dest_var (Var v) = v | dest_var (Fn _) = raise ERR "dest_var" ""; val is_var = can dest_var; (* Functions *) fun dest_fn (Fn f) = f | dest_fn (Var _) = raise ERR "dest_fn" ""; val is_fn = can dest_fn; val fn_name = fst o dest_fn; val fn_args = snd o dest_fn; val fn_arity = length o fn_args; fun fn_function tm = (fn_name tm, fn_arity tm); (* Constants *) fun mk_const c = (Fn (c, [])); fun dest_const (Fn (c, [])) = c | dest_const _ = raise ERR "dest_const" ""; val is_const = can dest_const; (* Binary functions *) fun mk_binop f (a, b) = Fn (f, [a, b]); fun dest_binop f (Fn (x, [a, b])) = if x = f then (a, b) else raise ERR "dest_binop" "wrong binop" | dest_binop _ _ = raise ERR "dest_binop" "not a binop"; fun is_binop f = can (dest_binop f); (* Atoms *) fun dest_atom (Atom a) = a | dest_atom _ = raise ERR "dest_atom" ""; val is_atom = can dest_atom; (* Conjunctions *) fun list_mk_conj l = (case rev l of [] => True | h :: t => foldl And h t); local fun conj cs (And (a, b)) = conj (a :: cs) b | conj cs fm = rev (fm :: cs); in fun strip_conj True = [] | strip_conj fm = conj [] fm; end; val flatten_conj = let fun flat acc [] = acc | flat acc (And (p, q) :: fms) = flat acc (q :: p :: fms) | flat acc (True :: fms) = flat acc fms | flat acc (fm :: fms) = flat (fm :: acc) fms in fn fm => flat [] [fm] end; (* Disjunctions *) fun list_mk_disj l = (case rev l of [] => False | h :: t => foldl Or h t); local fun disj cs (Or (a, b)) = disj (a :: cs) b | disj cs fm = rev (fm :: cs); in fun strip_disj False = [] | strip_disj fm = disj [] fm; end; val flatten_disj = let fun flat acc [] = acc | flat acc (Or (p, q) :: fms) = flat acc (q :: p :: fms) | flat acc (False :: fms) = flat acc fms | flat acc (fm :: fms) = flat (fm :: acc) fms in fn fm => flat [] [fm] end; (* Universal quantifiers *) fun list_mk_forall ([], body) = body | list_mk_forall (v :: vs, body) = Forall (v, list_mk_forall (vs, body)); local fun dest vs (Forall (v, b)) = dest (v :: vs) b | dest vs tm = (rev vs, tm); in val strip_forall = dest []; end; (* Existential quantifiers *) fun list_mk_exists ([], body) = body | list_mk_exists (v :: vs, body) = Exists (v, list_mk_exists (vs, body)); local fun dest vs (Exists (v, b)) = dest (v :: vs) b | dest vs tm = (rev vs, tm); in val strip_exists = dest []; end; (* ------------------------------------------------------------------------- *) (* A datatype to antiquote both terms and formulas. *) (* ------------------------------------------------------------------------- *) datatype thing = Term of term | Formula of formula; (* ------------------------------------------------------------------------- *) (* Built-in infix operators and reserved symbols. *) (* ------------------------------------------------------------------------- *) val infixes : infixities ref = ref [(* ML style *) {tok = " / ", prec = 7, left_assoc = true}, {tok = " div ", prec = 7, left_assoc = true}, {tok = " mod ", prec = 7, left_assoc = true}, {tok = " * ", prec = 7, left_assoc = true}, {tok = " + ", prec = 6, left_assoc = true}, {tok = " - ", prec = 6, left_assoc = true}, {tok = " ^ ", prec = 6, left_assoc = true}, {tok = " @ ", prec = 5, left_assoc = false}, {tok = " :: ", prec = 5, left_assoc = false}, {tok = " = ", prec = 4, left_assoc = true}, (* may be interpreted *) {tok = " == ", prec = 4, left_assoc = true}, (* won't be interpreted *) {tok = " <> ", prec = 4, left_assoc = true}, {tok = " <= ", prec = 4, left_assoc = true}, {tok = " < ", prec = 4, left_assoc = true}, {tok = " >= ", prec = 4, left_assoc = true}, {tok = " > ", prec = 4, left_assoc = true}, {tok = " o ", prec = 8, left_assoc = true}, (* ML prec = 3 *) (* HOL style *) {tok = " % ", prec = 9, left_assoc = true}, (* function application *) {tok = " -> ", prec = 2, left_assoc = false}, (* HOL ty prec = 50 *) {tok = " : ", prec = 1, left_assoc = false}, (* not in HOL grammars *) {tok = ", ", prec = 0, left_assoc = false}, (* HOL tm prec = 50 *) (* Convenient alternative symbols *) {tok = " ** ", prec = 7, left_assoc = true}, {tok = " ++ ", prec = 6, left_assoc = true}, {tok = " -- ", prec = 6, left_assoc = true}]; val connectives = [{tok = " /\\ ", prec = ~1, left_assoc = false}, {tok = " \\/ ", prec = ~2, left_assoc = false}, {tok = " ==> ", prec = ~3, left_assoc = false}, {tok = " <=> ", prec = ~4, left_assoc = false}]; val reserved = ["!", "?", "(", ")", ".", "~"]; (* ------------------------------------------------------------------------- *) (* Deciding whether a string denotes a variable or constant. *) (* ------------------------------------------------------------------------- *) val var_string = ref (C mem [#"_",#"v",#"w",#"x",#"y",#"z"] o Char.toLower o hd o explode); (* ------------------------------------------------------------------------- *) (* Pretty-printing. *) (* ------------------------------------------------------------------------- *) (* Purely functional pretty-printing *) val pp_vname = pp_map (fn s => if !var_string s then s else "var->" ^ s ^ "<-var") pp_string; val pp_cname = pp_map (fn s => if !var_string s then "const->" ^ s ^ "<-const" else s) pp_string; val pp_fname = pp_map (fn s => if !var_string s then "fn->" ^ s ^ "<-fn" else s) pp_string; fun pp_term' ops = let val ops = ops @ connectives val iprinter = pp_infixes ops val itoks = optoks ops fun pp_uninfix pp_s pp s = if mem s itoks then PP.add_string pp ("(" ^ s ^ ")") else pp_s pp s fun idest (Fn (f, [a, b])) = SOME (f, a, b) | idest _ = NONE fun is_op t = case idest t of SOME (f, _, _) => mem f itoks | NONE => false fun is_q (Fn ("!", _)) = true | is_q (Fn ("?", _)) = true | is_q _ = false fun negs (Fn ("~", [a])) = (curry op+ 1 ## I) (negs a) | negs tm = (0, tm) fun binds s (tm as Fn (n, [Var v, b])) = if s = n then (cons v ## I) (binds s b) else ([], tm) | binds _ tm = ([], tm) open PP fun basic pp (Var v) = pp_vname pp v | basic pp (Fn (c, [])) = pp_uninfix pp_cname pp c | basic pp (Fn (f, a)) = (pp_uninfix pp_fname pp f; app (fn x => (add_break pp (1, 0); argument pp x)) a) and argument pp tm = if is_var tm orelse is_const tm then basic pp tm else pp_btm pp tm and quant pp (tm, r) = let fun pr pp (Fn (q, [Var v, tm])) = let val (vs, body) = binds q tm in add_string pp q; pp_vname pp v; app (fn a => (add_break pp (1, 0); pp_vname pp a)) vs; add_string pp "."; add_break pp (1, 0); if is_q body then pr pp body else pp_tm pp (body, false) end | pr pp tm = raise BUG "pp_term" "not a quantifier" fun pp_q pp t = (begin_block pp INCONSISTENT 2; pr pp t; end_block pp) in (if is_q tm then (if r then pp_bracket ("(", ")") else I) pp_q else basic) pp tm end and molecule pp (tm, r) = let val (n, x) = negs tm in begin_block pp INCONSISTENT n; N n (fn () => add_string pp "~") (); if is_op x then pp_btm pp x else quant pp (x, r); end_block pp end and pp_btm pp tm = pp_bracket ("(", ")") pp_tm pp (tm, false) and pp_tm pp tmr = iprinter idest molecule pp tmr in pp_map (C pair false) pp_tm end; local fun demote True = Fn ("T", [] ) | demote False = Fn ("F", [] ) | demote (Not a) = Fn ("~", [demote a] ) | demote (And (a, b)) = Fn ("/\\", [demote a, demote b]) | demote (Or (a, b)) = Fn ("\\/", [demote a, demote b]) | demote (Imp (a, b)) = Fn ("==>", [demote a, demote b]) | demote (Iff (a, b)) = Fn ("<=>", [demote a, demote b]) | demote (Forall (v, b)) = Fn ("!", [Var v, demote b]) | demote (Exists (v, b)) = Fn ("?", [Var v, demote b]) | demote (Atom t) = t; in fun pp_formula' ops = pp_map demote (pp_term' ops); end; fun term_to_string' ops len tm = PP.pp_to_string len (pp_term' ops) tm; fun formula_to_string' ops len fm = PP.pp_to_string len (pp_formula' ops) fm; (* Pretty-printing things is needed for parsing thing quotations *) fun pp_thing ops pp (Term tm) = pp_term' ops pp tm | pp_thing ops pp (Formula fm) = pp_formula' ops pp fm; fun pp_bracketed_thing ops pp th = (PP.begin_block pp PP.INCONSISTENT 1; PP.add_string pp "("; pp_thing ops pp th; PP.add_string pp ")"; PP.end_block pp); (* Pretty-printing using !infixes and !LINE_LENGTH *) fun pp_term pp tm = pp_term' (!infixes) pp tm; fun pp_formula pp fm = pp_formula' (!infixes) pp fm; fun term_to_string tm = term_to_string' (!infixes) (!LINE_LENGTH) tm; fun formula_to_string fm = formula_to_string' (!infixes) (!LINE_LENGTH) fm; (* ------------------------------------------------------------------------- *) (* Parsing. *) (* ------------------------------------------------------------------------- *) (* Lexing *) val lexer = (fn ((_, (toks, _)), _) => toks) o (many (some space) ++ (many ((((atleastone (some alphanum) || (some (fn c => symbol c andalso c <> #"~") ++ many (some symbol)) >> op ::) >> implode || some (fn c => c = #"~" orelse punct c) >> str) ++ many (some space)) >> fst)) ++ finished); val lex_str = lexer o Stream.from_list o explode; (* Purely functional parsing *) val vname_parser = some (fn tok => not (mem tok reserved) andalso !var_string tok); fun term_parser ops = let val ops = ops @ connectives val iparser = parse_infixes ops val itoks = optoks ops val avoid = itoks @ reserved fun fname tok = not (mem tok avoid) andalso not (!var_string tok) fun uninfix tok = mem tok itoks val uninfix_parser = (exact "(" ++ some uninfix ++ exact ")") >> (fst o snd) val fname_parser = some fname || uninfix_parser fun bind s (v, t) = Fn (s, [Var v, t]) fun basic inp = ((exact "(" ++ tm_parser ++ exact ")") >> (fn (_, (t, _)) => t) || (exact "!" ++ atleastone vname_parser ++ exact "." ++ tm_parser) >> (fn (_, (vs, (_, body))) => foldr (bind "!") body vs) || (exact "?" ++ atleastone vname_parser ++ exact "." ++ tm_parser) >> (fn (_, (vs, (_, body))) => foldr (bind "?") body vs) || fname_parser >> (fn f => Fn (f, [])) || vname_parser >> Var) inp and molecule inp = ((many (exact "~") ++ ((fname_parser ++ many basic) >> Fn || basic)) >> (fn (l, t) => N (length l) (fn x => Fn ("~", [x])) t)) inp and tm_parser inp = iparser (fn (f, a, b) => Fn (f, [a, b])) molecule inp in tm_parser end; local fun promote (Fn ("T", [] )) = True | promote (Fn ("F", [] )) = False | promote (Fn ("~", [a] )) = Not (promote a) | promote (Fn ("/\\", [a, b] )) = And (promote a, promote b) | promote (Fn ("\\/", [a, b] )) = Or (promote a, promote b) | promote (Fn ("==>", [a, b] )) = Imp (promote a, promote b) | promote (Fn ("<=>", [a, b] )) = Iff (promote a, promote b) | promote (Fn ("!", [Var v, b])) = Forall (v, promote b) | promote (Fn ("?", [Var v, b])) = Exists (v, promote b) | promote tm = Atom tm; in fun formula_parser ops = term_parser ops >> promote; end; fun string_to_term' ops = fst o ((term_parser ops ++ finished) >> fst) o Stream.from_list o lex_str; fun string_to_formula' ops = fst o ((formula_parser ops ++ finished) >> fst) o Stream.from_list o lex_str; fun parse_term' ops = quotation_parser (string_to_term' ops) (pp_bracketed_thing ops); fun parse_formula' ops = quotation_parser (string_to_formula' ops) (pp_bracketed_thing ops); (* Parsing using !infixes *) fun string_to_term s = string_to_term' (!infixes) s; fun string_to_formula s = string_to_formula' (!infixes) s; fun parse_term q = parse_term' (!infixes) q; fun parse_formula q = parse_formula' (!infixes) q; (* ------------------------------------------------------------------------- *) (* New variables. *) (* ------------------------------------------------------------------------- *) local val prefix = "_"; val num_var = Var o mk_prefix prefix o int_to_string; in val new_var = num_var o new_int; val new_vars = map num_var o new_ints; end; (* ------------------------------------------------------------------------- *) (* Sizes of terms and formulas. *) (* ------------------------------------------------------------------------- *) local fun szt n [] = n | szt n (Var _ :: tms) = szt (n + 1) tms | szt n (Fn (_, args) :: tms) = szt (n + 1) (args @ tms); fun sz n [] = n | sz n (True :: fms) = sz (n + 1) fms | sz n (False :: fms) = sz (n + 1) fms | sz n (Atom t :: fms) = sz (szt (n + 1) [t]) fms | sz n (Not p :: fms) = sz (n + 1) (p :: fms) | sz n (And (p, q) :: fms) = sz (n + 1) (p :: q :: fms) | sz n (Or (p, q) :: fms) = sz (n + 1) (p :: q :: fms) | sz n (Imp (p, q) :: fms) = sz (n + 1) (p :: q :: fms) | sz n (Iff (p, q) :: fms) = sz (n + 1) (p :: q :: fms) | sz n (Forall (_, p) :: fms) = sz (n + 1) (p :: fms) | sz n (Exists (_, p) :: fms) = sz (n + 1) (p :: fms); in val term_size = szt 0 o wrap; val formula_size = sz 0 o wrap; end; (* ------------------------------------------------------------------------- *) (* Total comparison functions for terms and formulas. *) (* ------------------------------------------------------------------------- *) local fun lex EQUAL f x = f x | lex x _ _ = x; fun cmt [] = EQUAL | cmt ((Var _, Fn _) :: _) = LESS | cmt ((Fn _, Var _) :: _) = GREATER | cmt ((Var v, Var w) :: l) = lex (String.compare (v, w)) cmt l | cmt ((Fn (f, a), Fn (g, b)) :: l) = (case lex (String.compare (f, g)) (Int.compare o Df length) (a, b) of EQUAL => cmt (zip a b @ l) | x => x); fun cm [] = EQUAL | cm ((True, True ) :: l) = cm l | cm ((True, _ ) :: _) = LESS | cm ((_, True ) :: _) = GREATER | cm ((False, False ) :: l) = cm l | cm ((False, _ ) :: _) = LESS | cm ((_, False ) :: _) = GREATER | cm ((Atom t, Atom u ) :: l) = lex (cmt [(t, u)]) cm l | cm ((Atom _, _ ) :: _) = LESS | cm ((_, Atom _ ) :: _) = GREATER | cm ((Not p, Not q ) :: l) = cm ((p, q) :: l) | cm ((Not _ , _ ) :: _) = LESS | cm ((_, Not _ ) :: _) = GREATER | cm ((And (p1, q1), And (p2, q2) ) :: l) = cm ((p1, p2) :: (q1, q2) :: l) | cm ((And _, _ ) :: _) = LESS | cm ((_, And _ ) :: _) = GREATER | cm ((Or (p1, q1), Or (p2, q2) ) :: l) = cm ((p1, p2) :: (q1, q2) :: l) | cm ((Or _, _ ) :: _) = LESS | cm ((_, Or _ ) :: _) = GREATER | cm ((Imp (p1, q1), Imp (p2, q2) ) :: l) = cm ((p1, p2) :: (q1, q2) :: l) | cm ((Imp _, _ ) :: _) = LESS | cm ((_, Imp _ ) :: _) = GREATER | cm ((Iff (p1, q1), Iff (p2, q2) ) :: l) = cm ((p1, p2) :: (q1, q2) :: l) | cm ((Iff _, _ ) :: _) = LESS | cm ((_, Iff _ ) :: _) = GREATER | cm ((Forall (v, p), Forall (w, q)) :: l) = lex (String.compare (v, w)) (cm o cons (p, q)) l | cm ((Forall _, Exists _ ) :: _) = LESS | cm ((Exists _, Forall _ ) :: _) = GREATER | cm ((Exists (v, p), Exists (w, q)) :: l) = lex (String.compare (v, w)) (cm o cons (p, q)) l; in val term_compare = cmt o wrap; val formula_compare = cm o wrap; end; (* ------------------------------------------------------------------------- *) (* Basic operations on literals. *) (* ------------------------------------------------------------------------- *) fun mk_literal (true, a) = a | mk_literal (false, a) = Not a; fun dest_literal (a as Atom _) = (true, a) | dest_literal (Not (a as Atom _)) = (false, a) | dest_literal _ = raise ERR "dest_literal" ""; val is_literal = can dest_literal; val literal_atom = snd o dest_literal; (* ------------------------------------------------------------------------- *) (* Dealing with formula negations. *) (* ------------------------------------------------------------------------- *) fun negative (Not p) = true | negative _ = false; val positive = non negative; fun negate (Not p) = p | negate p = Not p; (* ------------------------------------------------------------------------- *) (* Functions and relations in a formula. *) (* ------------------------------------------------------------------------- *) local fun fnc fs [] = fs | fnc fs (Var _ :: tms) = fnc fs tms | fnc fs (Fn (n, a) :: tms) = fnc (insert (n, length a) fs) (a @ tms); fun func fs [] = fs | func fs (True :: fms) = func fs fms | func fs (False :: fms) = func fs fms | func fs (Atom (Var _) :: fms) = func fs fms | func fs (Atom (Fn (_, tms)) :: fms) = func (fnc fs tms) fms | func fs (Not p :: fms) = func fs (p :: fms) | func fs (And (p, q) :: fms) = func fs (p :: q :: fms) | func fs (Or (p, q) :: fms) = func fs (p :: q :: fms) | func fs (Imp (p, q) :: fms) = func fs (p :: q :: fms) | func fs (Iff (p, q) :: fms) = func fs (p :: q :: fms) | func fs (Forall (_, p) :: fms) = func fs (p :: fms) | func fs (Exists (_, p) :: fms) = func fs (p :: fms); in val functions = func [] o wrap; end; val function_names = map fst o functions; local fun rel rs [] = rs | rel rs (True :: fms) = rel rs fms | rel rs (False :: fms) = rel rs fms | rel rs (Atom (Var _) :: fms) = rel rs fms | rel rs (Atom (f as Fn _) :: fms) = rel (insert (fn_function f) rs) fms | rel rs (Not p :: fms) = rel rs (p :: fms) | rel rs (And (p, q) :: fms) = rel rs (p :: q :: fms) | rel rs (Or (p, q) :: fms) = rel rs (p :: q :: fms) | rel rs (Imp (p, q) :: fms) = rel rs (p :: q :: fms) | rel rs (Iff (p, q) :: fms) = rel rs (p :: q :: fms) | rel rs (Forall (_, p) :: fms) = rel rs (p :: fms) | rel rs (Exists (_, p) :: fms) = rel rs (p :: fms); in val relations = rel [] o wrap; end; val relation_names = map fst o relations; (* ------------------------------------------------------------------------- *) (* The equality relation has a special status. *) (* ------------------------------------------------------------------------- *) val eq_rel = ("=", 2); fun mk_eq (a, b) = Atom (Fn ("=", [a, b])); fun dest_eq (Atom (Fn ("=", [a, b]))) = (a, b) | dest_eq _ = raise ERR "dest_eq" ""; val is_eq = can dest_eq; val lhs = fst o dest_eq; val rhs = snd o dest_eq; val eq_occurs = mem eq_rel o relations; val relations_no_eq = List.filter (non (equal eq_rel)) o relations; (* ------------------------------------------------------------------------- *) (* Free variables in terms and formulas. *) (* ------------------------------------------------------------------------- *) local fun fvt av = let val seen = if null av then mem else (fn v => fn vs => mem v av orelse mem v vs) fun f vs [] = vs | f vs (Var v :: tms) = f (if seen v vs then vs else v :: vs) tms | f vs (Fn (_, args) :: tms) = f vs (args @ tms) in f end; fun fv vs [] = vs | fv vs ((_ , True ) :: fms) = fv vs fms | fv vs ((_ , False ) :: fms) = fv vs fms | fv vs ((av, Atom t ) :: fms) = fv (fvt av vs [t]) fms | fv vs ((av, Not p ) :: fms) = fv vs ((av, p) :: fms) | fv vs ((av, And (p, q) ) :: fms) = fv vs ((av, p) :: (av, q) :: fms) | fv vs ((av, Or (p, q) ) :: fms) = fv vs ((av, p) :: (av, q) :: fms) | fv vs ((av, Imp (p, q) ) :: fms) = fv vs ((av, p) :: (av, q) :: fms) | fv vs ((av, Iff (p, q) ) :: fms) = fv vs ((av, p) :: (av, q) :: fms) | fv vs ((av, Forall (x, p)) :: fms) = fv vs ((insert x av, p) :: fms) | fv vs ((av, Exists (x, p)) :: fms) = fv vs ((insert x av, p) :: fms); in fun FVT tm = rev (fvt [] [] [tm]); fun FV fm = rev (fv [] [([], fm)]); fun FVL fms = rev (fv [] (map (pair []) fms)); end; val specialize = snd o strip_forall; fun generalize fm = list_mk_forall (FV fm, fm); (* ------------------------------------------------------------------------- *) (* Subterms. *) (* ------------------------------------------------------------------------- *) fun subterm [] tm = tm | subterm (_ :: _) (Var _) = raise ERR "subterm" "Var" | subterm (h :: t) (Fn (_, args)) = subterm t (List.nth (args, h)) handle Subscript => raise ERR "subterm" "bad path"; local fun update _ _ [] = raise ERR "rewrite" "bad path" | update f n (h :: t) = if n = 0 then f h :: t else h :: update f (n - 1) t; in fun rewrite ([] |-> res) _ = res | rewrite _ (Var _) = raise ERR "rewrite" "Var" | rewrite ((h :: t) |-> res) (Fn (f, args)) = Fn (f, update (rewrite (t |-> res)) h args); end; local fun atom_rewrite r = Atom o rewrite r o dest_atom; in fun literal_subterm p = subterm p o dest_atom o literal_atom; fun literal_rewrite r = mk_literal o (I ## atom_rewrite r) o dest_literal; end; (* ------------------------------------------------------------------------- *) (* The Knuth-Bendix ordering. *) (* ------------------------------------------------------------------------- *) type Weight = string * int -> int; type Prec = (string * int) * (string * int) -> order; val no_vars = Multiset.empty String.compare; fun one_var v = Multiset.insert (v, 1) no_vars; fun kb_weight w = let fun weight (Var v) = (0, one_var v) | weight (Fn (f, a)) = foldl wght (w (f, length a), no_vars) a and wght (t, (n, v)) = (curry op+ n ## Multiset.union v) (weight t) in weight end; (* The Knuth-Bendix ordering is partial when terms contain variables *) fun kb_compare w p = let fun kbo [] = SOME EQUAL | kbo (tu :: rest) = if op= tu then SOME EQUAL else let val ((wt, vt), (wu, vu)) = Df (kb_weight w) tu in kbo1 (Int.compare (wt, wu)) (Multiset.compare (vt, vu)) tu rest end and kbo1 _ NONE _ _ = NONE | kbo1 LESS (SOME LESS) _ _ = SOME LESS | kbo1 GREATER (SOME LESS) _ _ = NONE | kbo1 EQUAL (SOME LESS) _ _ = SOME LESS | kbo1 LESS (SOME GREATER) _ _ = NONE | kbo1 GREATER (SOME GREATER) _ _ = SOME GREATER | kbo1 EQUAL (SOME GREATER) _ _ = SOME GREATER | kbo1 LESS (SOME EQUAL) _ _ = SOME LESS | kbo1 GREATER (SOME EQUAL) _ _ = SOME GREATER | kbo1 EQUAL (SOME EQUAL) (t, u) rest = kbo2 t u rest and kbo2 (Fn (f, a)) (Fn (g, b)) rest = (case p ((f, length a), (g, length b)) of LESS => SOME LESS | GREATER => SOME GREATER | EQUAL => kbo (zip a b @ rest)) | kbo2 _ _ _ = raise BUG "kbo" "variable" in kbo o wrap end; end (*#line 0.0 "fol/Subst1.sig"*) (* ========================================================================= *) (* SUBSTITUTIONS ON FIRST-ORDER TERMS AND FORMULAS *) (* Created by Joe Hurd, June 2002 *) (* ========================================================================= *) signature Subst1 = sig type 'a pp = 'a Useful.pp type ('a, 'b) maplet = ('a, 'b) Useful.maplet type term = Term1.term type formula = Term1.formula type subst val |<>| : subst val ::> : (string, term) maplet * subst -> subst val @> : subst * subst -> subst val null : subst -> bool val term_subst : subst -> term -> term val formula_subst : subst -> formula -> formula val find_redex : string -> subst -> term option val norm : subst -> subst (* Removes identity substitutions *) val restrict : string list -> subst -> subst val refine : subst -> subst -> subst val is_renaming : subst -> bool val to_maplets : subst -> (string, term) maplet list val from_maplets : (string, term) maplet list -> subst val foldl : ((string, term) maplet -> 'a -> 'a) -> 'a -> subst -> 'a val foldr : ((string, term) maplet -> 'a -> 'a) -> 'a -> subst -> 'a val pp_subst : subst pp end (*#line 0.0 "fol/Subst1.sml"*) (* ========================================================================= *) (* SUBSTITUTIONS ON FIRST-ORDER TERMS AND FORMULAS *) (* Created by Joe Hurd, June 2002 *) (* ========================================================================= *) (* app load ["Binarymap", "Useful", "Term1"]; *) (* *) structure Subst1 :> Subst1 = struct open Useful Term1; infixr 8 ++; infixr 7 >>; infixr 6 ||; infixr |-> ::> @> oo ##; structure M = Binarymap; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) fun Mpurge (d, k) = fst (M.remove (d, k)) handle NotFound => d; (* ------------------------------------------------------------------------- *) (* The underlying representation. *) (* ------------------------------------------------------------------------- *) datatype subst = Subst of (string, term) M.dict; (* ------------------------------------------------------------------------- *) (* Operations. *) (* ------------------------------------------------------------------------- *) val |<>| = Subst (M.mkDict String.compare); fun (a |-> b) ::> (Subst d) = Subst (M.insert (d, a, b)); fun (Subst sub1) @> (Subst sub2) = Subst (M.foldl (fn (a, b, d) => M.insert (d, a, b)) sub2 sub1); fun null (Subst s) = M.numItems s = 0; fun find_redex r (Subst d) = M.peek (d, r); fun purge v (Subst d) = Subst (Mpurge (d, v)); local exception Unchanged; fun always f x = f x handle Unchanged => x; fun pair_unchanged f (x, y) = let val (c, x) = (true, f x) handle Unchanged => (false, x) val (c, y) = (true, f y) handle Unchanged => (c, y) in if c then (x, y) else raise Unchanged end; fun list_unchanged f = let fun g (x, (b, l)) = (true, f x :: l) handle Unchanged => (b, x :: l) fun h (true, l) = rev l | h (false, _) = raise Unchanged in h o foldl g (false, []) end; fun find_unchanged v r = case find_redex v r of SOME t => t | NONE => raise Unchanged; fun tm_subst r = let fun f (Var v) = find_unchanged v r | f (Fn (n, a)) = Fn (n, list_unchanged f a) in f end; fun fm_subst r = let fun f False = raise Unchanged | f True = raise Unchanged | f (Atom tm ) = Atom (tm_subst r tm) | f (Not p ) = Not (f p) | f (And pq ) = And (pair_unchanged f pq) | f (Or pq ) = Or (pair_unchanged f pq) | f (Imp pq ) = Imp (pair_unchanged f pq) | f (Iff pq ) = Iff (pair_unchanged f pq) | f (Forall vp) = fm_substq r Forall vp | f (Exists vp) = fm_substq r Exists vp in if null r then I else always f end and fm_substq r Q (v, p) = let val v' = variant v (FV (fm_subst (purge v r) p)) in Q (v', fm_subst ((v |-> Var v') ::> r) p) end; in fun term_subst env tm = if null env then tm else always (tm_subst env) tm; fun formula_subst env fm = fm_subst env fm; end; fun norm (sub as Subst dict) = let fun check (a, b, (c, d)) = if Var a = b then (true, fst (M.remove (d, a))) else (c, d) val (removed, dict') = M.foldl check (false, dict) dict in if removed then Subst dict' else sub end; fun to_maplets (Subst s) = map (op|->) (M.listItems s); fun from_maplets ms = foldl (op ::>) |<>| (rev ms); fun restrict vs = from_maplets o List.filter (fn (a |-> _) => mem a vs) o to_maplets; (* Note: this just doesn't work with cyclic substitutions! *) fun refine (Subst sub1) sub2 = let fun f ((a, b), s) = let val b' = term_subst sub2 b in if Var a = b' then s else (a |-> b') ::> s end in foldl f sub2 (M.listItems sub1) end; local exception QF fun rs (v, Var w, l) = if mem w l then raise QF else w :: l | rs (_, Fn _, _) = raise QF in fun is_renaming (Subst sub) = (M.foldl rs [] sub; true) handle QF => false; end; fun foldl f b (Subst sub) = M.foldl (fn (s, t, a) => f (s |-> t) a) b sub; fun foldr f b (Subst sub) = M.foldr (fn (s, t, a) => f (s |-> t) a) b sub; val pp_subst = pp_map to_maplets (fn pp => (fn [] => pp_string pp "|<>|" | l => pp_list (pp_maplet pp_string pp_term) pp l)); end (*#line 0.0 "fol/Kernel1.sig"*) (* ========================================================================= *) (* A LCF-STYLE LOGICAL KERNEL FOR FIRST-ORDER CLAUSES *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature Kernel1 = sig type term = Term1.term type formula = Term1.formula type subst = Subst1.subst (* An ABSTRACT type for theorems *) eqtype thm datatype inference = Axiom | Refl | Assume | Inst | Factor | Resolve | Equality (* Destruction of theorems is fine *) val dest_thm : thm -> formula list * (inference * thm list) (* But creation is only allowed by the primitive rules of inference *) val AXIOM : formula list -> thm val REFL : term -> thm val ASSUME : formula -> thm val INST : subst -> thm -> thm val FACTOR : thm -> thm val RESOLVE : formula -> thm -> thm -> thm val EQUALITY : formula -> int list -> term -> bool -> thm -> thm end (*#line 0.0 "fol/Kernel1.sml"*) (* ========================================================================= *) (* A LCF-STYLE LOGICAL KERNEL FOR FIRST-ORDER CLAUSES *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) structure Kernel1 :> Kernel1 = struct open Useful Term1; infixr |-> ::> oo; type subst = Subst1.subst; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* An ABSTRACT type for theorems. *) (* ------------------------------------------------------------------------- *) datatype inference = Axiom | Refl | Assume | Inst | Factor | Resolve | Equality; datatype thm = Thm of formula list * (inference * thm list); (* ------------------------------------------------------------------------- *) (* Destruction of theorems is fine. *) (* ------------------------------------------------------------------------- *) fun dest_thm (Thm th) = th; val clause = fst o dest_thm; (* ------------------------------------------------------------------------- *) (* But creation is only allowed by the primitive rules of inference. *) (* ------------------------------------------------------------------------- *) fun AXIOM cl = if List.all is_literal cl then Thm (cl, (Axiom, [])) else raise ERR "AXIOM" "argument not a list of literals"; fun REFL tm = Thm ([mk_eq (tm, tm)], (Refl, [])); fun ASSUME fm = if is_literal fm then Thm ([fm, negate fm], (Assume, [])) else raise ERR "ASSUME" "argument not a literal"; fun INST env (th as Thm (cl, pr)) = let val cl' = map (formula_subst env) cl in if cl' = cl then th else case pr of (Inst, [th']) => if cl' = clause th' then th' else Thm (cl', (Inst, [th'])) | _ => Thm (cl', (Inst, [th])) end; fun FACTOR th = let val cl = rev (setify (clause th)) in if cl = clause th then th else Thm (cl, (Factor, [th])) end; fun RESOLVE fm th1 th2 = let val cl1 = clause th1 val cl1' = List.filter (not o equal fm) cl1 val cl2 = clause th2 val cl2' = List.filter (not o equal (negate fm)) cl2 val () = assert (cl1 <> cl1' orelse cl2 <> cl2') (ERR "RESOLVE" "resolvant does not feature in either clause") in Thm (cl1' @ cl2', (Resolve, [th1, th2])) end; fun EQUALITY fm p res lr th = let val eq_lit = let val red = literal_subterm p fm in Not (mk_eq (if lr then (red, res) else (res, red))) end val other_lits = let val l = clause th in case index (equal fm) l of NONE => raise ERR "EQUALITY" "literal does not occur in clause" | SOME n => update_nth (literal_rewrite (p |-> res)) n l end in Thm (eq_lit :: other_lits, (Equality, [th])) end; end (*#line 0.0 "fol/Match1.sig"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature Match1 = sig type term = Term1.term type formula = Term1.formula type subst = Subst1.subst (* Matching *) val matchl : subst -> (term * term) list -> subst val match : term -> term -> subst val matchl_literals : subst -> (formula * formula) list -> subst val match_literals : formula -> formula -> subst (* Unification *) val unifyl : subst -> (term * term) list -> subst val unify : subst -> term -> term -> subst val unify_and_apply : term -> term -> term val unifyl_literals : subst -> (formula * formula) list -> subst val unify_literals : subst -> formula -> formula -> subst end (*#line 0.0 "fol/Match1.sml"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1"]; *) (* *) structure Match1 :> Match1 = struct open Useful Term1; infixr |-> ::>; type subst = Subst1.subst; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val term_subst = Subst1.term_subst; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Matching. *) (* ------------------------------------------------------------------------- *) fun raw_match env x tm = (case Subst1.find_redex x env of NONE => (x |-> tm) ::> env | SOME tm' => if tm = tm' then env else raise ERR "match" "one var trying to match two different terms"); fun matchl env [] = env | matchl env ((Var x, tm) :: rest) = matchl (raw_match env x tm) rest | matchl env ((Fn (f, args), Fn (f', args')) :: rest) = if f = f' andalso length args = length args' then matchl env (zip args args' @ rest) else raise ERR "match" "can't match two different functions" | matchl _ _ = raise ERR "match" "different structure"; fun match tm tm' = Subst1.norm (matchl |<>| [(tm, tm')]); local fun conv (Atom t, Atom t') = SOME (t, t') | conv (Not p, Not q) = conv (p, q) | conv (True, True) = NONE | conv (False, False) = NONE | conv _ = raise ERR "match_literals" "incompatible"; in fun matchl_literals sub = matchl sub o List.mapPartial conv; end; fun match_literals lit lit' = Subst1.norm (matchl_literals |<>| [(lit, lit')]); (* ------------------------------------------------------------------------- *) (* Unification. *) (* ------------------------------------------------------------------------- *) local fun occurs v tm = mem v (FVT tm); fun solve env [] = env | solve env ((tm1, tm2) :: rest) = solve' env (term_subst env tm1) (term_subst env tm2) rest and solve' env (Var x) tm rest = if Var x = tm then solve env rest else if occurs x tm then raise ERR "unify" "occurs check" else (case Subst1.find_redex x env of NONE => solve (Subst1.refine env ((x |-> tm) ::> |<>|)) rest | SOME tm' => solve' env tm' tm rest) | solve' env tm (tm' as Var _) rest = solve' env tm' tm rest | solve' env (Fn (f, args)) (Fn (f', args')) rest = if f = f' andalso length args = length args' then solve env (zip args args' @ rest) else raise ERR "unify" "different structure"; in val unifyl = solve; end; fun unify env tm tm' = unifyl env [(tm, tm')]; fun unify_and_apply tm tm' = term_subst (unify |<>| tm tm') tm; local fun conv (Atom t, Atom t') = SOME (t, t') | conv (Not p, Not q) = conv (p, q) | conv (True, True) = NONE | conv (False, False) = NONE | conv _ = raise ERR "unify_literals" "incompatible"; in fun unifyl_literals env = unifyl env o List.mapPartial conv; end; fun unify_literals env lit lit' = unifyl_literals env [(lit, lit')]; end (*#line 0.0 "fol/TermNet1.sig"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION FOR SETS OF TERMS *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature TermNet1 = sig type 'a pp = 'a Useful.pp type ('a, 'b) maplet = ('a, 'b) Useful.maplet type term = Term1.term type 'a term_map val empty : 'a term_map val insert : (term, 'a) maplet -> 'a term_map -> 'a term_map val match : 'a term_map -> term -> 'a list val matched : 'a term_map -> term -> 'a list val unify : 'a term_map -> term -> 'a list val size : 'a term_map -> int val from_maplets : (term, 'a) maplet list -> 'a term_map val to_list : 'a term_map -> 'a list val pp_term_map : 'a pp -> 'a term_map pp end (*#line 0.0 "fol/TermNet1.sml"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION FOR SETS OF TERMS *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1"]; *) (* *) structure TermNet1 :> TermNet1 = struct open Useful Term1; infixr |-> ::> oo; val flatten = List.concat; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) local fun fifo_order (m, _) (n, _) = m <= n; in fun restore_fifo_order l = map snd (sort fifo_order l); end; fun partition_find f l = let fun pf _ [] = (NONE, l) | pf dealt (x :: xs) = if f x then (SOME x, List.revAppend (dealt, xs)) else pf (x :: dealt) xs in pf [] l end; (* ------------------------------------------------------------------------- *) (* Term discrimination trees are optimized for match queries. *) (* ------------------------------------------------------------------------- *) datatype pattern = VAR | FN of string * int; type 'a map = (pattern, 'a) tree; datatype 'a term_map = MAP of int * (int * 'a) map list; val empty = MAP (0, []); fun size (MAP (i, _)) = i; fun to_list (MAP (_, n)) = restore_fifo_order (flatten (map (tree_foldr (K flatten) wrap) n)); fun pp_term_map pp_a = pp_map to_list (pp_list pp_a); local fun find_pat x (BRANCH (p, _)) = p = x | find_pat _ (LEAF _) = raise BUG "find_pat" "misplaced LEAF"; fun add a [] l = LEAF a :: l | add a (tm :: rest) l = let val (pat, rest) = case tm of Var _ => (VAR, rest) | Fn (f, args) => (FN (f, length args), args @ rest) val (this, others) = partition_find (find_pat pat) l val next = case this of NONE => [] | SOME (BRANCH (_, l)) => l | SOME (LEAF _) => raise BUG "add" "misplaced LEAF" in BRANCH (pat, add a rest next) :: others end; in fun insert (tm |-> a) (MAP (i, n)) = MAP (i + 1, add (i, a) [tm] n) handle ERR_EXN _ => raise BUG "insert" "should never fail"; end; fun from_maplets l = foldl (uncurry insert) empty l; local fun mat VAR (_ :: rest) = SOME rest | mat (FN (f, n)) (Fn (g, args) :: rest) = if f = g andalso n = length args then SOME (args @ rest) else NONE | mat (FN _) (Var _ :: _) = NONE | mat _ [] = raise BUG "match" "ran out of subterms"; fun final a [] = SOME a | final _ (_ :: _) = raise BUG "match" "too many subterms"; in fun match (MAP (_, n)) tm = restore_fifo_order (flatten (map (tree_partial_foldl mat final [tm]) n)) handle ERR_EXN _ => raise BUG "match" "should never fail"; end; local fun more VAR = 0 | more (FN (f, n)) = n; fun mat pat (0, Var _ :: rest) = SOME (more pat, rest) | mat VAR (0, Fn _ :: _) = NONE | mat (FN (f, n)) (0, Fn (g, args) :: rest) = if f = g andalso n = length args then SOME (0, args @ rest) else NONE | mat _ (0, []) = raise BUG "matched" "ran out of subterms" | mat pat (n, rest) = SOME (more pat + n - 1, rest); fun final a (0, []) = SOME a | final _ (0, _ :: _) = raise BUG "matched" "too many subterms" | final _ (n, _) = raise BUG "matched" "still skipping"; in fun matched (MAP (_, n)) tm = restore_fifo_order (flatten (map (tree_partial_foldl mat final (0,[tm])) n)) handle ERR_EXN _ => raise BUG "matched" "should never fail"; end; local fun more VAR = 0 | more (FN (f, n)) = n; fun mat pat (0, Var _ :: rest) = SOME (more pat, rest) | mat VAR (0, Fn _ :: rest) = SOME (0, rest) | mat (FN (f, n)) (0, Fn (g, args) :: rest) = if f = g andalso n = length args then SOME (0, args @ rest) else NONE | mat _ (0, []) = raise BUG "unify" "ran out of subterms" | mat pat (n, rest) = SOME (more pat + n - 1, rest); fun final a (0, []) = SOME a | final _ (0, _ :: _) = raise BUG "unify" "too many subterms" | final _ (n, _) = raise BUG "unify" "still skipping"; in fun unify (MAP (_, n)) tm = restore_fifo_order (flatten (map (tree_partial_foldl mat final (0,[tm])) n)) handle ERR_EXN _ => raise BUG "unify" "should never fail"; end; (* ------------------------------------------------------------------------- *) (* We can overlay the above type with a simple list type. *) (* ------------------------------------------------------------------------- *) (* type 'a simple = int * int * term list * 'a list; type 'a term_map = ('a simple, 'a term_map) sum; fun check (0, _, t, a) = INR (from_maplets (foldl (fn (x, xs) => op|-> x :: xs) [] (zip t a))) | check p = INL p; val empty : 'a term_map = INR empty; fun new n = check (n, 0, [], []); val insert = fn m => (fn INL (n, s, ts, xs) => (case m of t |-> x => check (n - 1, s + 1, t :: ts, x :: xs)) | INR d => INR (insert m d)); val match = fn INL (_, _, _, xs) => K (rev xs) | INR d => match d; val matched = fn INL (_, _, _, xs) => K (rev xs) | INR d => matched d; val unify = fn INL (_, _, _, xs) => K (rev xs) | INR d => unify d; val size = fn INL (_, s, _, _) => s | INR d => size d; val from_maplets = INR o from_maplets; val to_list = fn INL (_, _, _, xs) => rev xs | INR d => to_list d; val pp_term_map = fn pp_a => fn pp => (fn INL (_, _, _, xs) => pp_list pp_a pp xs | INR d => pp_term_map pp_a pp d); *) end (*#line 0.0 "fol/LiteralNet1.sig"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION FOR SETS OF LITERALS *) (* Created by Joe Hurd, June 2002 *) (* ========================================================================= *) signature LiteralNet1 = sig type 'a pp = 'a Useful.pp type formula = Term1.formula type ('a, 'b) maplet = ('a, 'b) Term1.maplet type 'a literal_map val empty : 'a literal_map val insert : (formula, 'a) maplet -> 'a literal_map -> 'a literal_map val match : 'a literal_map -> formula -> 'a list val matched : 'a literal_map -> formula -> 'a list val unify : 'a literal_map -> formula -> 'a list val size : 'a literal_map -> int val size_profile : 'a literal_map -> {t : int, f : int, p : int, n : int} val from_maplets : (formula, 'a) maplet list -> 'a literal_map val to_list : 'a literal_map -> 'a list val pp_literal_map : 'a pp -> 'a literal_map pp end (*#line 0.0 "fol/LiteralNet1.sml"*) (* ========================================================================= *) (* MATCHING AND UNIFICATION FOR SETS OF LITERALS *) (* Created by Joe Hurd, June 2002 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1"]; *) (* *) structure LiteralNet1 :> LiteralNet1 = struct open Useful Term1; infixr |-> ::> oo; structure T = TermNet1; (* ------------------------------------------------------------------------- *) (* Literal nets. *) (* ------------------------------------------------------------------------- *) type 'a literal_map = ('a T.term_map * 'a T.term_map) * ((int * 'a list) * (int * 'a list)); val empty = ((T.empty, T.empty), ((0, []), (0, []))); fun insert (Atom a |-> b) ((p, n), tf) = ((T.insert (a |-> b) p, n), tf) | insert (Not (Atom a) |-> b) ((p, n), tf) = ((p, T.insert (a |-> b) n), tf) | insert (True |-> b) (pn, ((n, l), f)) = (pn, ((n + 1, b :: l), f)) | insert (False |-> b) (pn, (t, (n, l))) = (pn, (t, (n + 1, b :: l))) | insert (f |-> _) _ = raise BUG "insert" ("not a lit: "^formula_to_string f); fun from_maplets l = foldl (uncurry insert) empty l; fun to_list ((pos, neg), ((_, t), (_, f))) = rev t @ rev f @ T.to_list pos @ T.to_list neg; fun pp_literal_map pp_a = pp_map to_list (pp_list pp_a); local fun pos ((pos, _ ), _ ) = T.size pos; fun neg ((_, neg), _ ) = T.size neg; fun truth (_, ((n, _), _ )) = n; fun falsity (_, (_, (n, _))) = n; in fun size l = truth l + falsity l + pos l + neg l; fun size_profile l = {t = truth l, f = falsity l, p = pos l, n = neg l}; end; fun match ((pos, _), _) (Atom a) = T.match pos a | match ((_, neg), _) (Not (Atom a)) = T.match neg a | match (_, ((_, t), _)) True = rev t | match (_, (_, (_, f))) False = rev f | match _ _ = raise BUG "match" "not a literal"; fun matched ((pos, _), _) (Atom a) = T.matched pos a | matched ((_, neg), _) (Not (Atom a)) = T.matched neg a | matched (_, ((_, t), _)) True = rev t | matched (_, (_, (_, f))) False = rev f | matched _ _ = raise BUG "matched" "not a literal"; fun unify ((pos, _), _) (Atom a) = T.unify pos a | unify ((_, neg), _) (Not (Atom a)) = T.unify neg a | unify (_, ((_, t), _)) True = rev t | unify (_, (_, (_, f))) False = rev f | unify _ _ = raise BUG "unify" "not a literal"; end (*#line 0.0 "fol/Subsume1.sig"*) (* ========================================================================= *) (* A TYPE FOR SUBSUMPTION CHECKING *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) signature Subsume1 = sig type 'a pp = 'a Useful.pp type ('a, 'b) maplet = ('a, 'b) Useful.maplet type formula = Term1.formula type subst = Subst1.subst type 'a subsume val empty : 'a subsume val add : (formula list, 'a) maplet -> 'a subsume -> 'a subsume val subsumed : 'a subsume -> formula list -> (subst * 'a) list val strictly_subsumed : 'a subsume -> formula list -> (subst * 'a) list val info : 'a subsume -> string val pp_subsum : 'a subsume pp end (*#line 0.0 "fol/Subsume1.sml"*) (* ========================================================================= *) (* A TYPE FOR SUBSUMPTION CHECKING *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) (* app load ["Thm1", "Match1"]; *) (* *) structure Subsume1 :> Subsume1 = struct infix |-> ::>; open Useful Term1 Match1; structure N = LiteralNet1; val ofilter = Option.filter; type subst = Subst1.subst; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val term_subst = Subst1.term_subst; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Subsume1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Subsume1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) val frozen_prefix = "FROZEN__"; fun mk_frozen v = Fn (frozen_prefix ^ v, []); local val chk = String.isPrefix frozen_prefix; val dest = let val l = size frozen_prefix in fn s => String.extract (s, l, NONE) end; in fun dest_frozen (Fn (s, [])) = (assert (chk s) (ERR "dest_frozen" "not a frozen var"); dest s) | dest_frozen _ = raise ERR "dest_frozen" "bad structure"; end; val is_frozen = can dest_frozen; fun freeze_vars fms = let val vars = FV (list_mk_disj fms) val sub = foldl (fn (v, s) => (v |-> mk_frozen v) ::> s) |<>| vars in map (formula_subst sub) fms end; local fun f (v |-> a) = (v |-> (if is_frozen a then Var (dest_frozen a) else a)); in val defrost_vars = Subst1.from_maplets o map f o Subst1.to_maplets; end; val lit_size = formula_size o literal_atom; val sort_literals_by_size = map snd o sort (fn (m, _) => fn (n, _) => m <= n) o map (fn lit => (lit_size lit, lit)); (* ------------------------------------------------------------------------- *) (* The core engine for subsumption checking. *) (* ------------------------------------------------------------------------- *) type 'a sinfo = {sub : subst, hd : formula, tl : formula list, fin : 'a}; type 'a subs = 'a sinfo N.literal_map; fun add_lits (i as {hd, ...}) (net : 'a subs) = N.insert (hd |-> i) net; local fun subsum strict lits = let val accept = (if strict then ofilter (non Subst1.is_renaming) else SOME) o defrost_vars val impossible = let val lit_net = N.from_maplets (map (fn l => (l |-> ())) lits) in List.exists (null o N.matched lit_net) end fun extend sub lits fin net = if impossible lits then net else case sort_literals_by_size lits of [] => raise BUG "extend" "null" | hd :: tl => add_lits {sub = sub, hd = hd, tl = tl, fin = fin} net fun examine lit ({sub, hd, tl, fin}, s as (net, res)) = case total (matchl_literals sub) [(hd, lit)] of NONE => s | SOME sub => if null tl then case accept sub of SOME sub => (net, (sub, fin) :: res) | NONE => s else (extend sub (map (formula_subst sub) tl) fin net, res) fun narrow1 net (lit, s) = foldl (examine lit) s (N.match net lit) fun narrow (net, res) = if N.size net = 0 then res else narrow (foldl (narrow1 net) (N.empty, res) lits) in narrow end; in fun subsumes strict net lits = subsum strict (freeze_vars lits) (net, []) handle ERR_EXN _ => raise BUG "subsumes" "shouldn't fail"; end; (* ------------------------------------------------------------------------- *) (* The user interface. *) (* ------------------------------------------------------------------------- *) type 'a subsume = ('a, 'a subs) sum; val empty : 'a subsume = INR N.empty; fun add _ (s as INL _) = s | add (fms |-> fin) (INR net) = case sort_literals_by_size fms of [] => INL fin | h :: t => INR (add_lits {sub = |<>|, hd = h, tl = t, fin = fin} net); fun subsumed (INL fin) _ = [(|<>|, fin)] | subsumed (INR _) [] = [] | subsumed (INR net) lits = subsumes false net lits; fun strictly_subsumed _ [] = [] | strictly_subsumed (INL fin) _ = [(|<>|, fin)] | strictly_subsumed (INR net) lits = subsumes true net lits; fun info ((INL _) : 'a subsume) = "*" | info (INR net) = int_to_string (N.size net); val pp_subsum = fn z => pp_map info pp_string z; (* Quick testing quotation := true; installPP pp_formula; installPP pp_term; installPP pp_subst; installPP pp_thm; freeze_vars (map parse [`x + y <= 0`, `x = __x()`]); val s = add_subsumer (AXIOM (map parse [`p(x,3)`, `p(2,y)`])) empty_subsum; subsumed s (map parse [`p(2,3)`]); *) end (*#line 0.0 "fol/Tptp1.sig"*) (* ========================================================================= *) (* INTERFACE TO TPTP PROBLEM FILES *) (* Created by Joe Hurd, December 2001 *) (* ========================================================================= *) signature Tptp1 = sig type term = Term1.term type formula = Term1.formula (* Maintaining different relation and function names in TPTP problems *) val renaming : {tptp : string, fol : string, arity : int} list ref (* Parsing: pass in a filename *) val parse_cnf : string -> formula end (*#line 0.0 "fol/Tptp1.sml"*) (* ========================================================================= *) (* INTERFACE TO TPTP PROBLEM FILES *) (* Created by Joe Hurd, December 2001 *) (* ========================================================================= *) (* app load ["Stream", "Useful", "Parser", "Term1"]; *) (* *) structure Tptp1 :> Tptp1 = struct open Parser Useful Term1; infixr 9 >>++; infixr 8 ++; infixr 7 >>; infixr 6 ||; infix |->; structure S = Stream; (* ------------------------------------------------------------------------- *) (* Abbreviating relation and function names in TPTP problems. *) (* ------------------------------------------------------------------------- *) type rename = {tptp : string, fol : string, arity : int}; val renaming : rename list ref = ref [{tptp = "equal", fol = "=", arity = 2}]; (* ------------------------------------------------------------------------- *) (* Parsing: pass in a filename. *) (* ------------------------------------------------------------------------- *) val comment = equal #"%" o hd o explode; val input_lines = S.filter (non comment) o S.from_textfile; val input_chars = S.flatten o S.map (S.from_list o explode); datatype tok_type = Lower | Upper | Symbol | Punct; val lexer = (many (some space) ++ (((some lower || some digit) ++ many (some alphanum) >> (fn (a, b) => (Lower, implode (a :: b)))) || (some upper ++ many (some alphanum) >> (fn (a, b) => (Upper, implode (a :: b)))) || (atleastone (some symbol) >> (fn l => (Symbol, implode l))) || (some punct >> (fn c => (Punct, str c))))) >> snd; val lex = many lexer ++ (many (some space) ++ finished) >> fst; val input_toks = S.from_list o fst o lex; fun Var' "T" = Var "T'" | Var' "F" = Var "F'" | Var' v = Var (if !var_string v then v else "v_" ^ v); local fun verify (f, a) = (if !var_string f then (if null a then "c_" else "f_") ^ f else f, a); fun mapped (f, a) (m : rename list) = let fun g {tptp, arity, fol = _} = tptp = f andalso arity = length a in case List.find g m of SOME {fol, ...} => (fol, a) | NONE => verify (f, a) end; in fun Fn' A = Fn (mapped A (!renaming)); end; fun term_parser input = ((some (equal Upper o fst) >> (Var' o snd)) || ((some (equal Lower o fst) >> snd) ++ (optional (exact (Punct, "(") ++ term_parser ++ many ((exact (Punct, ",") ++ term_parser) >> snd) ++ exact (Punct, ")")) >> (fn SOME (_, (t, (ts, _))) => t :: ts | NONE => [])) >> Fn')) input; val literal_parser = ((exact (Symbol, "++") >> K true || exact (Symbol, "--") >> K false) ++ term_parser) >> (fn (s, t) => mk_literal (s, Atom (case t of Var v => Fn (v, []) | _ => t))); val clause_parser = (exact (Lower, "input_clause") ++ exact (Punct, "(") ++ any ++ exact (Punct, ",") ++ any ++ exact (Punct, ",") ++ exact (Punct, "[") ++ literal_parser ++ many ((exact (Punct, ",") ++ literal_parser) >> snd) ++ exact (Punct, "]") ++ exact (Punct, ")") ++ exact (Punct, ".")) >> (fn (_, (_, (name, (_, (typ, (_, (_, (l, (ls, _))))))))) => (snd name, snd typ, l :: ls)); val cnf_parser = fst o ((many clause_parser ++ finished) >> fst); local fun cycle _ _ ([], _) = raise BUG "cycle" "" | cycle f v (h :: t, avoid) = let val h' = f h avoid in (h', (t @ [h], h' :: avoid)) end; in fun generalize_clause fm = let open Subst1 val vars = FV fm val nvars = length vars val var_fn = if nvars <= 15 then variant else variant_num val news = if nvars = 6 then ["x", "y", "z", "x'", "y'", "z'"] else fst (maps (cycle var_fn) vars (["x", "y", "z", "v", "w"], [])) val sub = from_maplets (zipwith (fn v => fn x => v |-> Var x) vars news) in generalize (formula_subst sub fm) end; end; val input_cnf = (fn (a, b) => Imp (a, Imp (b, False))) o Df (list_mk_conj o map (generalize_clause o list_mk_disj o #3)) o List.partition (not o equal "conjecture" o #2) o cnf_parser; val parse_cnf = input_cnf o input_toks o input_chars o input_lines; end (*#line 0.0 "fol/Thm1.sig"*) (* ========================================================================= *) (* INTERFACE TO THE LCF-STYLE LOGICAL KERNEL, PLUS SOME DERIVED RULES *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature Thm1 = sig type 'a pp = 'a Useful.pp include Kernel1 (* Annotated primitive inferences *) datatype inference' = Axiom' of formula list | Refl' of term | Assume' of formula | Inst' of subst * thm | Factor' of thm | Resolve' of formula * thm * thm | Equality' of formula * int list * term * bool * thm val primitive_inference : inference' -> thm (* User-friendly destructors *) val clause : thm -> formula list val inference : thm -> inference' val proof : thm -> (thm * inference') list (* Pretty-printing of theorems and inferences *) val pp_thm : thm pp val pp_inference : inference pp val pp_inference' : inference' pp val pp_proof : (thm * inference') list pp val thm_to_string' : int -> thm -> string (* purely functional *) val inference_to_string' : int -> inference' -> string val thm_to_string : thm -> string (* using !LINE_LENGTH *) val inference_to_string : inference' -> string (* A total comparison function for theorems *) val thm_compare : thm * thm -> order (* Contradictions and unit clauses *) val is_contradiction : thm -> bool val dest_unit : thm -> formula val is_unit : thm -> bool (* Derived rules and theorems *) val CONTR : formula -> thm -> thm val WEAKEN : formula list -> thm -> thm val FRESH_VARS : thm -> thm val FRESH_VARSL : thm list -> thm list val UNIT_SQUASH : thm -> thm val REFLEXIVITY : thm val SYMMETRY : thm val TRANSITIVITY : thm val FUN_CONGRUENCE : string * int -> thm val REL_CONGRUENCE : string * int -> thm end (*#line 0.0 "fol/Thm1.sml"*) (* ========================================================================= *) (* INTERFACE TO THE LCF-STYLE LOGICAL KERNEL, PLUS SOME DERIVED RULES *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* app load ["Useful", "Term1", "Kernel1", "Match1"]; *) (* *) structure Thm1 :> Thm1 = struct open Useful Term1 Kernel1 Match1; infixr |-> ::> oo ##; type subst = Subst1.subst; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val term_subst = Subst1.term_subst; val formula_subst = Subst1.formula_subst; val pp_subst = Subst1.pp_subst; (* ------------------------------------------------------------------------- *) (* Annotated primitive inferences. *) (* ------------------------------------------------------------------------- *) datatype inference' = Axiom' of formula list | Refl' of term | Assume' of formula | Inst' of subst * thm | Factor' of thm | Resolve' of formula * thm * thm | Equality' of formula * int list * term * bool * thm fun primitive_inference (Axiom' cl ) = AXIOM cl | primitive_inference (Refl' tm ) = REFL tm | primitive_inference (Assume' l ) = ASSUME l | primitive_inference (Inst' (s, th) ) = INST s th | primitive_inference (Factor' th ) = FACTOR th | primitive_inference (Resolve' (l, th1, th2) ) = RESOLVE l th1 th2 | primitive_inference (Equality' (l, p, t, s, th)) = EQUALITY l p t s th; val clause = fst o dest_thm; (* ------------------------------------------------------------------------- *) (* Pretty-printing of theorems *) (* ------------------------------------------------------------------------- *) fun pp_thm pp th = (PP.begin_block pp PP.INCONSISTENT 3; PP.add_string pp "|- "; pp_formula pp (list_mk_disj (clause th)); PP.end_block pp); local fun inf_to_string Axiom = "Axiom" | inf_to_string Refl = "Refl" | inf_to_string Assume = "Assume" | inf_to_string Inst = "Inst" | inf_to_string Factor = "Factor" | inf_to_string Resolve = "Resolve" | inf_to_string Equality = "Equality"; in val pp_inference = pp_map inf_to_string pp_string; end; local fun pp_inf (Axiom' a) = (Axiom, C (pp_list pp_formula) a) | pp_inf (Refl' a) = (Refl, C pp_term a) | pp_inf (Assume' a) = (Assume, C pp_formula a) | pp_inf (Inst' a) = (Inst, C (pp_pair pp_subst pp_thm) a) | pp_inf (Factor' a) = (Factor, C pp_thm a) | pp_inf (Resolve' a) = (Resolve, C (pp_triple pp_formula pp_thm pp_thm) a) | pp_inf (Equality' (lit, p, r, lr, th)) = (Equality, C (pp_record [("lit", unit_pp pp_formula lit), ("path", unit_pp (pp_list pp_int) p), ("res", unit_pp pp_term r), ("lr", unit_pp pp_bool lr), ("thm", unit_pp pp_thm th)]) ()); in fun pp_inference' pp inf = let open PP val (i, ppf) = pp_inf inf in (begin_block pp INCONSISTENT 0; pp_inference pp i; add_break pp (1, 0); ppf pp; end_block pp) end; end; val pp_proof = pp_list (pp_pair pp_thm pp_inference'); (* Purely functional pretty-printing *) fun thm_to_string' len = PP.pp_to_string len pp_thm; fun inference_to_string' len = PP.pp_to_string len pp_inference'; (* Pretty-printing using !LINE_LENGTH *) fun thm_to_string th = thm_to_string' (!LINE_LENGTH) th; fun inference_to_string inf = inference_to_string' (!LINE_LENGTH) inf; (* ------------------------------------------------------------------------- *) (* A total comparison function for theorems. *) (* ------------------------------------------------------------------------- *) local fun cmp Axiom Axiom = EQUAL | cmp Axiom _ = LESS | cmp _ Axiom = GREATER | cmp Refl Refl = EQUAL | cmp Refl _ = LESS | cmp _ Refl = GREATER | cmp Assume Assume = EQUAL | cmp Assume _ = LESS | cmp _ Assume = GREATER | cmp Inst Inst = EQUAL | cmp Inst _ = LESS | cmp _ Inst = GREATER | cmp Factor Factor = EQUAL | cmp Factor _ = LESS | cmp _ Factor = GREATER | cmp Resolve Resolve = EQUAL | cmp Resolve Equality = LESS | cmp Equality Resolve = GREATER | cmp Equality Equality = EQUAL; fun cm [] = EQUAL | cm ((th1, th2) :: l) = let val (l1, (p1, ths1)) = dest_thm th1 val (l2, (p2, ths2)) = dest_thm th2 in case Int.compare (length l1, length l2) of EQUAL => (case lex_compare formula_compare (zip l1 l2) of EQUAL => (case cmp p1 p2 of EQUAL => cm (zip ths1 ths2 @ l) | x => x) | x => x) | x => x end in val thm_compare = cm o wrap; end; (* ------------------------------------------------------------------------- *) (* Reconstructing proofs. *) (* ------------------------------------------------------------------------- *) fun reconstruct_resolvant cl1 cl2 (cl1', cl2') = case (subtract (setify cl1) cl1', subtract (setify cl2) cl2') of (_ :: _ :: _, _) => NONE | (_, _ :: _ :: _) => NONE | ([l], []) => SOME l | ([], [l']) => SOME (negate l') | ([l], [l']) => if negate l = l' then SOME l else NONE | ([], []) => NONE; fun reconstruct_equality l r = let fun recon_fn p (f, args) (f', args') rest = recon_tm (if f <> f' orelse length args <> length args' then rest else map (C cons p ## I) (enumerate 0 (zip args args')) @ rest) and recon_tm [] = NONE | recon_tm ((p, (tm, tm')) :: rest) = if tm = l andalso tm' = r then SOME (rev p) else case (tm, tm') of (Fn a, Fn a') => recon_fn p a a' rest | _ => recon_tm rest fun recon_lit (Not a) (Not a') = recon_lit a a' | recon_lit (Atom a) (Atom a') = if l <> r andalso a = a' then NONE else recon_tm [([], (a, a'))] | recon_lit _ _ = NONE in fn (lit, lit') => case recon_lit lit lit' of SOME p => SOME (lit, p) | NONE => NONE end; fun reconstruct (cl, (Axiom, [])) = Axiom' cl | reconstruct ([lit], (Refl, [])) = Refl' (lhs lit) | reconstruct ([fm, _], (Assume, [])) = Assume' fm | reconstruct (cl, (Inst, [th])) = Inst' (matchl_literals |<>| (zip (clause th) cl), th) | reconstruct (_, (Factor, [th])) = Factor' th | reconstruct (cl, (Resolve, [th1, th2])) = let val f = reconstruct_resolvant (clause th1) (clause th2) val l = case f (cl, cl) of SOME l => l | NONE => case first f (List.tabulate (length cl, split cl)) of SOME l => l | NONE => raise BUG "inference" "couldn't reconstruct resolvant" in Resolve' (l, th1, th2) end | reconstruct (Not fm :: cl, (Equality, [th])) = let val (tm1, tm2) = dest_eq fm in case first (reconstruct_equality tm1 tm2) (zip (clause th) cl) of SOME (l, p) => Equality' (l, p, tm2, true, th) | NONE => case first (reconstruct_equality tm2 tm1) (zip (clause th) cl) of SOME (l, p) => Equality' (l, p, tm1, false, th) | NONE => raise BUG "inference" "couldn't reconstruct equality step" end | reconstruct _ = raise BUG "inference" "malformed inference"; fun inference th = let val i = reconstruct (dest_thm th) val _ = (primitive_inference i = th) orelse raise BUG "inference" ("failed:\nth = " ^ thm_to_string th ^ "\ninf = " ^ inference_to_string i ^ "\ninf_th = " ^ thm_to_string (primitive_inference i)) in i end; local val empty = (Binarymap.mkDict thm_compare, []); fun contains (m, _) th = Option.isSome (Binarymap.peek (m, th)); fun add th (m, p) = (Binarymap.insert (m, th, ()), (th, inference th) :: p); val finalize = snd; fun reduce (th, pf) = if contains pf th then pf else add th (foldl reduce pf (snd (snd (dest_thm th)))); in fun proof th = finalize (reduce (th, empty)); end; (* ------------------------------------------------------------------------- *) (* Contradictions and unit clauses. *) (* ------------------------------------------------------------------------- *) val is_contradiction = null o clause; fun dest_unit th = case clause th of [lit] => lit | _ => raise ERR "dest_unit" "not a unit"; val is_unit = can dest_unit; (* ------------------------------------------------------------------------- *) (* Derived rules *) (* ------------------------------------------------------------------------- *) fun CONTR lit th = RESOLVE (negate lit) (ASSUME lit) th; fun WEAKEN lits th = foldl (uncurry CONTR) th (rev lits); fun FRESH_VARSL ths = let val fvs = FVL (List.concat (map clause ths)) val vvs = new_vars (length fvs) val sub = Subst1.from_maplets (zipwith (curry op |->) fvs vvs) in map (INST sub) ths end; val FRESH_VARS = unwrap o FRESH_VARSL o wrap; fun UNIT_SQUASH th = let fun squash env (x :: (xs as y :: _)) = squash (unify_literals env x y) xs | squash env _ = env in FACTOR (INST (squash |<>| (clause th)) th) end; val REFLEXIVITY = REFL (Var "x"); val SYMMETRY = EQUALITY (mk_eq (Var "x", Var "x")) [0] (Var "y") true REFLEXIVITY; val TRANSITIVITY = EQUALITY (mk_eq (Var "y", Var "z")) [0] (Var "x") false (ASSUME (Not (mk_eq (Var "y", Var "z")))); fun FUN_CONGRUENCE (function, arity) = let val xs = List.tabulate (arity, fn i => Var ("x" ^ int_to_string i)) val ys = List.tabulate (arity, fn i => Var ("y" ^ int_to_string i)) fun f (i, th) = EQUALITY (List.last (clause th)) [1,i] (List.nth (ys, i)) true th val refl = INST (("x" |-> Fn (function, xs)) ::> |<>|) REFLEXIVITY in foldl f refl (rev (interval 0 arity)) end; fun REL_CONGRUENCE (relation, arity) = let val xs = List.tabulate (arity, fn i => Var ("x" ^ int_to_string i)) val ys = List.tabulate (arity, fn i => Var ("y" ^ int_to_string i)) fun f (i, th) = EQUALITY (List.last (clause th)) [i] (List.nth (ys, i)) true th val refl = ASSUME (Not (Atom (Fn (relation, xs)))) in foldl f refl (rev (interval 0 arity)) end; end (*#line 0.0 "fol/Canon1.sig"*) (* ========================================================================= *) (* FIRST-ORDER LOGIC CANONICALIZATION *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) signature Canon1 = sig type term = Term1.term type formula = Term1.formula type thm = Thm1.thm (* Simplification *) val simplify : formula -> formula (* Negation normal form *) val nnf : formula -> formula (* Prenex normal form *) val prenex : formula -> formula val pnf : formula -> formula (* Skolemization *) val skolemize : formula -> formula val full_skolemize : formula -> formula (* A tautology filter for clauses *) val tautologous : formula list -> bool (* Conjunctive normal form *) val purecnf : formula -> formula list list val simpcnf : formula -> formula list list val clausal : formula -> formula list list val cnf : formula -> formula val axiomatize : formula -> thm list val eq_axiomatize : formula -> thm list (* Adds equality axioms *) val eq_axiomatize' : formula -> thm list (* Adds if equality occurs *) end (*#line 0.0 "fol/Canon1.sml"*) (* ========================================================================= *) (* FIRST-ORDER LOGIC CANONICALIZATION *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) (* app load ["Useful", "Term1"]; *) structure Canon1 :> Canon1 = struct open Useful Term1 Thm1; infixr |-> ::> oo; type subst = Subst1.subst; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val term_subst = Subst1.term_subst; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Simplification. *) (* ------------------------------------------------------------------------- *) fun simplify1 (Not False) = True | simplify1 (Not True) = False | simplify1 (Not (Not fm)) = fm | simplify1 (And (False, q)) = False | simplify1 (And (p, False)) = False | simplify1 (And (True, q)) = q | simplify1 (And (p, True)) = p | simplify1 (Or (False, q)) = q | simplify1 (Or (p, False)) = p | simplify1 (Or (True, q)) = True | simplify1 (Or (p, True)) = True | simplify1 (Imp (False, q)) = True | simplify1 (Imp (True, q)) = q | simplify1 (Imp (p, True)) = True | simplify1 (Imp (Not p, False)) = p | simplify1 (Imp (p, False)) = Not p | simplify1 (Iff (True, q)) = q | simplify1 (Iff (p, True)) = p | simplify1 (Iff (False, Not q)) = q | simplify1 (Iff (False, q)) = Not q | simplify1 (Iff (Not p, False)) = p | simplify1 (Iff (p, False)) = Not p | simplify1 (fm as Forall (x, p)) = if mem x (FV p) then fm else p | simplify1 (fm as Exists (x, p)) = if mem x (FV p) then fm else p | simplify1 fm = fm; fun simplify (Not p) = simplify1 (Not (simplify p)) | simplify (And (p, q)) = simplify1 (And (simplify p, simplify q)) | simplify (Or (p, q)) = simplify1 (Or (simplify p, simplify q)) | simplify (Imp (p, q)) = simplify1 (Imp (simplify p, simplify q)) | simplify (Iff (p, q)) = simplify1 (Iff (simplify p, simplify q)) | simplify (Forall (x, p)) = simplify1 (Forall (x, simplify p)) | simplify (Exists (x, p)) = simplify1 (Exists (x, simplify p)) | simplify fm = fm; (* ------------------------------------------------------------------------- *) (* Negation normal form. *) (* ------------------------------------------------------------------------- *) fun nnf (And (p, q)) = And (nnf p, nnf q) | nnf (Or (p, q)) = Or (nnf p, nnf q) | nnf (Imp (p, q)) = Or (nnf' p, nnf q) | nnf (Iff (p, q)) = Or (And (nnf p, nnf q), And (nnf' p, nnf' q)) | nnf (Forall (x, p)) = Forall (x, nnf p) | nnf (Exists (x, p)) = Exists (x, nnf p) | nnf (Not x) = nnf' x | nnf fm = fm and nnf' True = False | nnf' False = True | nnf' (And (p, q)) = Or (nnf' p, nnf' q) | nnf' (Or (p, q)) = And (nnf' p, nnf' q) | nnf' (Imp (p, q)) = And (nnf p, nnf' q) | nnf' (Iff (p, q)) = Or (And (nnf p, nnf' q), And (nnf' p, nnf q)) | nnf' (Forall (x, p)) = Exists (x, nnf' p) | nnf' (Exists (x, p)) = Forall (x, nnf' p) | nnf' (Not x) = nnf x | nnf' fm = Not fm; (* ------------------------------------------------------------------------- *) (* Prenex normal form. *) (* ------------------------------------------------------------------------- *) fun pullquants fm = (case fm of And (Forall (x, p), Forall (y, q)) => pullquant_2 fm Forall And x y p q | Or (Exists (x, p), Exists (y, q)) => pullquant_2 fm Exists Or x y p q | And (Forall (x, p), q) => pullquant_l fm Forall And x p q | And (p, Forall (x, q)) => pullquant_r fm Forall And x p q | Or (Forall (x, p), q) => pullquant_l fm Forall Or x p q | Or (p, Forall (x, q)) => pullquant_r fm Forall Or x p q | And (Exists (x, p), q) => pullquant_l fm Exists And x p q | And (p, Exists (x, q)) => pullquant_r fm Exists And x p q | Or (Exists (x, p), q) => pullquant_l fm Exists Or x p q | Or (p, Exists (x, q)) => pullquant_r fm Exists Or x p q | _ => fm) and pullquant_l fm Q C x p q = let val x' = variant x (FV fm) in Q (x', pullquants (C (formula_subst ((x |-> Var x') ::> |<>|) p, q))) end and pullquant_r fm Q C x p q = let val x' = variant x (FV fm) in Q (x', pullquants (C (p, formula_subst ((x |-> Var x') ::> |<>|) q))) end and pullquant_2 fm Q C x y p q = let val x' = variant x (FV fm) in Q (x', pullquants(C (formula_subst ((x |-> Var x') ::> |<>|) p, formula_subst ((x |-> Var x') ::> |<>|) q))) end; fun prenex (Forall (x, p)) = Forall (x, prenex p) | prenex (Exists (x, p)) = Exists (x, prenex p) | prenex (And (p, q)) = pullquants (And (prenex p, prenex q)) | prenex (Or (p, q)) = pullquants (Or (prenex p, prenex q)) | prenex fm = fm; val pnf = prenex o nnf o simplify; (* ------------------------------------------------------------------------- *) (* Skolemization function. *) (* ------------------------------------------------------------------------- *) fun skolem avoid (Exists (y, p)) = let val xs = subtract (FV p) [y] val f = variant (if xs = [] then "c_" ^ y else "f_" ^ y) avoid in skolem avoid (formula_subst ((y |-> Fn (f, map Var xs)) ::> |<>|) p) end | skolem avoid (Forall (x, p)) = Forall (x, skolem avoid p) | skolem avoid (And (p, q)) = skolem2 avoid And p q | skolem avoid (Or (p, q)) = skolem2 avoid Or p q | skolem _ fm = fm and skolem2 avoid C p q = let val p' = skolem avoid p val q' = skolem (union avoid (function_names p')) q in C (p', q') end; fun skolemize fm = skolem (function_names fm) fm; val full_skolemize = specialize o prenex o skolemize o nnf o simplify; (* ------------------------------------------------------------------------- *) (* A tautology filter for clauses. *) (* ------------------------------------------------------------------------- *) fun tautologous cls = let val (pos, neg) = List.partition positive cls in intersect pos (map negate neg) <> [] end; (* ------------------------------------------------------------------------- *) (* Conjunctive Normal Form. *) (* ------------------------------------------------------------------------- *) fun distrib s1 s2 = cartwith union s1 s2; fun purecnf (Or (p, q)) = distrib (purecnf p) (purecnf q) | purecnf (And (p, q)) = union (purecnf p) (purecnf q) | purecnf fm = [[fm]]; fun simpcnf True = [] | simpcnf False = [[]] | simpcnf fm = List.filter (non tautologous) (purecnf fm); val clausal = List.concat o map (simpcnf o specialize o prenex) o flatten_conj o skolemize o nnf o simplify val cnf = list_mk_conj o map list_mk_disj o clausal; val axiomatize = map AXIOM o clausal; fun eq_axiomatize fm = let val eqs = [REFLEXIVITY, SYMMETRY, TRANSITIVITY] val rels = map REL_CONGRUENCE (relations_no_eq fm) val funs = map FUN_CONGRUENCE (functions fm) in eqs @ funs @ rels @ axiomatize fm end; fun eq_axiomatize' fm = (if eq_occurs fm then eq_axiomatize else axiomatize) fm; end (*#line 0.0 "fol/Units1.sig"*) (* ========================================================================= *) (* A STORE IN WHICH TO CACHE UNIT THEOREMS *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) signature Units1 = sig type 'a pp = 'a Useful.pp type formula = Term1.formula type thm = Thm1.thm type units val empty : units val add : thm -> units -> units val addl : thm list -> units -> units val subsumes : units -> formula -> thm option val prove : units -> formula list -> thm list option val demod : units -> thm -> thm val info : units -> string val pp_units : units pp end (*#line 0.0 "fol/Units1.sml"*) (* ========================================================================= *) (* A STORE IN WHICH TO CACHE UNIT THEOREMS *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Match1"]; *) (* *) structure Units1 :> Units1 = struct open Useful Term1 Thm1 Match1; infix |-> ::> @> oo ##; structure N = LiteralNet1; (* ------------------------------------------------------------------------- *) (* Auxiliary functions. *) (* ------------------------------------------------------------------------- *) fun lift_options f = let fun g res [] = SOME (rev res) | g res (x :: xs) = case f x of SOME y => g (y :: res) xs | NONE => NONE in g [] end; (* ------------------------------------------------------------------------- *) (* Operations on the raw unit cache. *) (* ------------------------------------------------------------------------- *) type uns = thm N.literal_map; val uempty : uns = N.empty; fun uadd th uns = N.insert (dest_unit th |-> th) uns; fun usubsumes uns lit = List.find (can (C match_literals lit) o dest_unit) (rev (N.match uns lit)); fun uprove uns = let fun pr lit = Option.map (fn th => INST (match_literals (dest_unit th) lit) th) (usubsumes uns lit) in lift_options pr end; fun udemod uns = let fun demod (lit, th) = case uprove uns [negate lit] of NONE => th | SOME [dth] => RESOLVE lit th dth | SOME _ => raise BUG "unit_demod" "corrupt" in fn th => foldl demod th (clause th) end; (* ------------------------------------------------------------------------- *) (* The user interface. *) (* ------------------------------------------------------------------------- *) type units = (thm, uns) sum; val empty = INR uempty; fun subsumes (INL th) = K (SOME th) | subsumes (INR uns) = usubsumes uns; fun prove (INL th) = SOME o map (fn False => th | lit => CONTR lit th) | prove (INR uns) = uprove uns; fun demod (INL th) = K th | demod (INR uns) = udemod uns; fun info ((INL _) : units) = "*" | info (INR uns) = int_to_string (N.size uns); val pp_units = pp_map info pp_string; (* Adding a theorem involves squashing it to a unit, if possible. *) fun add _ (U as INL _) = U | add th (U as INR uns) = if List.exists (Option.isSome o usubsumes uns) (clause th) then U else let val th = udemod uns th in if is_contradiction th then INL th else case total UNIT_SQUASH th of NONE => U | SOME th => INR (uadd th uns) end; val addl = C (foldl (uncurry add)); end (*#line 0.0 "fol/Problem1.sig"*) (* ========================================================================= *) (* SOME SAMPLE PROBLEMS TO TEST PROOF PROCEDURES *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) signature Problem1 = sig type 'a quotation = 'a frag list type 'a problem = {name : string, goal : 'a quotation} (* Accessing individual problems *) val get : 'a problem list -> string -> 'a quotation (* The master collections *) val nonequality : 'a problem list val equality : 'a problem list val tptp : 'a problem list (* Some compilations *) (*val quick : 'a problem list *) end (*#line 0.0 "fol/Problem1.sml"*) (* ========================================================================= *) (* SOME SAMPLE PROBLEMS TO TEST PROOF PROCEDURES *) (* Created by Joe Hurd, September 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) structure Problem1 :> Problem1 = struct type 'a quotation = 'a frag list; type 'a problem = {name : string, goal : 'a quotation}; (* ========================================================================= *) (* Accessing individual problems. *) (* ========================================================================= *) fun extract (p : 'a problem list) n = Option.valOf (List.find (fn {name, ...} => name = n) p); fun get p = #goal o extract p; (* ========================================================================= *) (* Problems without equality. *) (* ========================================================================= *) val nonequality = [ (* ------------------------------------------------------------------------- *) (* Trivia (some of which demonstrate ex-bugs in provers). *) (* ------------------------------------------------------------------------- *) {name = "TRUE", goal = [ QUOTE "\nT"]}, {name = "P_or_not_P", goal = [ QUOTE "\np \\/ ~p"]}, {name = "JH_test", goal = [ QUOTE "\n!x y. ?z. p x \\/ p y ==> p z"]}, {name = "CYCLIC", goal = [ QUOTE "\n(!x. p (g (c x))) ==> ?z. p (g z)"]}, {name = "MN_bug", goal = [ QUOTE "\n(!x. ?y. f y x x) ==> ?z. f z 0 0"]}, {name = "ERIC", goal = [ QUOTE "\n!x. ?v w. !y z. p x /\\ q y ==> (p v \\/ r w) /\\ (r z ==> q v)"]}, (* ------------------------------------------------------------------------- *) (* Propositional Logic. *) (* ------------------------------------------------------------------------- *) {name = "PROP_1", goal = [ QUOTE "\np ==> q <=> ~q ==> ~p"]}, {name = "PROP_2", goal = [ QUOTE "\n~~p <=> p"]}, {name = "PROP_3", goal = [ QUOTE "\n~(p ==> q) ==> q ==> p"]}, {name = "PROP_4", goal = [ QUOTE "\n~p ==> q <=> ~q ==> p"]}, {name = "PROP_5", goal = [ QUOTE "\n(p \\/ q ==> p \\/ r) ==> p \\/ (q ==> r)"]}, {name = "PROP_6", goal = [ QUOTE "\np \\/ ~p"]}, {name = "PROP_7", goal = [ QUOTE "\np \\/ ~~~p"]}, {name = "PROP_8", goal = [ QUOTE "\n((p ==> q) ==> p) ==> p"]}, {name = "PROP_9", goal = [ QUOTE "\n(p \\/ q) /\\ (~p \\/ q) /\\ (p \\/ ~q) ==> ~(~q \\/ ~q)"]}, {name = "PROP_10", goal = [ QUOTE "\n(q ==> r) /\\ (r ==> p /\\ q) /\\ (p ==> q /\\ r) ==> (p <=> q)"]}, {name = "PROP_11", goal = [ QUOTE "\np <=> p"]}, {name = "PROP_12", goal = [ QUOTE "\n((p <=> q) <=> r) <=> p <=> q <=> r"]}, {name = "PROP_13", goal = [ QUOTE "\np \\/ q /\\ r <=> (p \\/ q) /\\ (p \\/ r)"]}, {name = "PROP_14", goal = [ QUOTE "\n(p <=> q) <=> (q \\/ ~p) /\\ (~q \\/ p)"]}, {name = "PROP_15", goal = [ QUOTE "\np ==> q <=> ~p \\/ q"]}, {name = "PROP_16", goal = [ QUOTE "\n(p ==> q) \\/ (q ==> p)"]}, {name = "PROP_17", goal = [ QUOTE "\np /\\ (q ==> r) ==> s <=> (~p \\/ q \\/ s) /\\ (~p \\/ ~r \\/ s)"]}, {name = "MATHS4_EXAMPLE", goal = [ QUOTE "\n(a \\/ ~k ==> g) /\\ (g ==> q) /\\ ~q ==> k"]}, {name = "XOR_ASSOC", goal = [ QUOTE "\n~(~(p <=> q) <=> r) <=> ~(p <=> ~(q <=> r))"]}, (* ------------------------------------------------------------------------- *) (* Monadic Predicate Logic. *) (* ------------------------------------------------------------------------- *) (* The drinker's principle *) {name = "P18", goal = [ QUOTE "\n?very_popular_guy. !whole_pub. drinks very_popular_guy ==> drinks whole_pub"]}, {name = "P19", goal = [ QUOTE "\n?x. !y z. (p y ==> q z) ==> p x ==> q x"]}, {name = "P20", goal = [ QUOTE "\n(!x y. ?z. !w. p x /\\ q y ==> r z /\\ u w) /\\ (!x y. p x /\\ q y) ==> ?z. r z"]}, {name = "P21", goal = [ QUOTE "\n(?x. p ==> q x) /\\ (?x. q x ==> p) ==> ?x. p <=> q x"]}, {name = "P22", goal = [ QUOTE "\n(!x. p <=> q x) ==> (p <=> !x. q x)"]}, {name = "P23", goal = [ QUOTE "\n(!x. p \\/ q x) <=> p \\/ !x. q x"]}, {name = "P24", goal = [ QUOTE "\n~(?x. u x /\\ q x) /\\ (!x. p x ==> q x \\/ r x) /\\ ~(?x. p x ==> ?x. q x) /\\\n(!x. q x /\\ r x ==> u x) ==> ?x. p x /\\ r x"]}, {name = "P25", goal = [ QUOTE "\n(?x. p x) /\\ (!x. u x ==> ~g x /\\ r x) /\\ (!x. p x ==> g x /\\ u x) /\\\n((!x. p x ==> q x) \\/ ?x. q x /\\ p x) ==> ?x. q x /\\ p x"]}, {name = "P26", goal = [ QUOTE "\n((?x. p x) <=> ?x. q x) /\\ (!x y. p x /\\ q y ==> (r x <=> u y)) ==>\n((!x. p x ==> r x) <=> !x. q x ==> u x)"]}, {name = "P27", goal = [ QUOTE "\n(?x. p x /\\ ~q x) /\\ (!x. p x ==> r x) /\\ (!x. u x /\\ s x ==> p x) /\\\n(?x. r x /\\ ~q x) ==> (!x. u x ==> ~r x) ==> !x. u x ==> ~s x"]}, {name = "P28", goal = [ QUOTE "\n(!x. p x ==> !x. q x) /\\ ((!x. q x \\/ r x) ==> ?x. q x /\\ r x) /\\\n((?x. r x) ==> !x. l x ==> m x) ==> !x. p x /\\ l x ==> m x"]}, {name = "P29", goal = [ QUOTE "\n(?x. p x) /\\ (?x. g x) ==>\n((!x. p x ==> h x) /\\ (!x. g x ==> j x) <=>\n !x y. p x /\\ g y ==> h x /\\ j y)"]}, {name = "P30", goal = [ QUOTE "\n(!x. p x \\/ g x ==> ~h x) /\\ (!x. (g x ==> ~u x) ==> p x /\\ h x) ==>\n!x. u x"]}, {name = "P31", goal = [ QUOTE "\n~(?x. p x /\\ (g x \\/ h x)) /\\ (?x. q x /\\ p x) /\\ (!x. ~h x ==> j x) ==>\n?x. q x /\\ j x"]}, {name = "P32", goal = [ QUOTE "\n(!x. p x /\\ (g x \\/ h x) ==> q x) /\\ (!x. q x /\\ h x ==> j x) /\\\n(!x. r x ==> h x) ==> !x. p x /\\ r x ==> j x"]}, {name = "P33", goal = [ QUOTE "\n(!x. p a /\\ (p x ==> p b) ==> p c) <=>\n(!x. p a ==> p x \\/ p c) /\\ (p a ==> p b ==> p c)"]}, (* This gives rise to 5184 clauses when converted to CNF! *) {name = "P34", goal = [ QUOTE "\n((?x. !y. p x <=> p y) <=> (?x. q x) <=> !y. q y) <=>\n(?x. !y. q x <=> q y) <=> (?x. p x) <=> !y. p y"]}, {name = "P35", goal = [ QUOTE "\n?x y. p x y ==> !x y. p x y"]}, (* ------------------------------------------------------------------------- *) (* Full predicate logic (without Identity and Functions) *) (* ------------------------------------------------------------------------- *) {name = "P36", goal = [ QUOTE "\n(!x. ?y. p x y) /\\ (!x. ?y. g x y) /\\\n(!x y. p x y \\/ g x y ==> !z. p y z \\/ g y z ==> h x z) ==> !x. ?y. h x y"]}, {name = "P37", goal = [ QUOTE "\n(!z. ?w. !x. ?y. (p x z ==> p y w) /\\ p y z /\\ (p y w ==> ?v. q v w)) /\\\n(!x z. ~p x z ==> ?y. q y z) /\\ ((?x y. q x y) ==> !x. r x x) ==>\n!x. ?y. r x y"]}, {name = "P38", goal = [ QUOTE "\n(!x. p a /\\ (p x ==> ?y. p y /\\ r x y) ==> ?z w. p z /\\ r x w /\\ r w z) <=>\n!x.\n (~p a \\/ p x \\/ ?z w. p z /\\ r x w /\\ r w z) /\\\n (~p a \\/ ~(?y. p y /\\ r x y) \\/ ?z w. p z /\\ r x w /\\ r w z)"]}, {name = "P39", goal = [ QUOTE "\n~?x. !y. p y x <=> ~p y y"]}, {name = "P40", goal = [ QUOTE "\n(?y. !x. p x y <=> p x x) ==> ~!x. ?y. !z. p z y <=> ~p z x"]}, {name = "P41", goal = [ QUOTE "\n(!z. ?y. !x. p x y <=> p x z /\\ ~p x x) ==> ~?z. !x. p x z"]}, {name = "P42", goal = [ QUOTE "\n~?y. !x. p x y <=> ~?z. p x z /\\ p z x"]}, {name = "P43", goal = [ QUOTE "\n(!x y. q x y <=> !z. p z x <=> p z y) ==> !x y. q x y <=> q y x"]}, {name = "P44", goal = [ QUOTE "\n(!x. p x ==> (?y. g y /\\ h x y) /\\ ?y. g y /\\ ~h x y) /\\\n(?x. j x /\\ !y. g y ==> h x y) ==> ?x. j x /\\ ~p x"]}, {name = "P45", goal = [ QUOTE "\n(!x. p x /\\ (!y. g y /\\ h x y ==> j x y) ==> !y. g y /\\ h x y ==> r y) /\\\n~(?y. l y /\\ r y) /\\\n(?x. p x /\\ (!y. h x y ==> l y) /\\ !y. g y /\\ h x y ==> j x y) ==>\n?x. p x /\\ ~?y. g y /\\ h x y"]}, {name = "P46", goal = [ QUOTE "\n(!x. p x /\\ (!y. p y /\\ h y x ==> g y) ==> g x) /\\\n((?x. p x /\\ ~g x) ==> ?x. p x /\\ ~g x /\\ !y. p y /\\ ~g y ==> j x y) /\\\n(!x y. p x /\\ p y /\\ h x y ==> ~j y x) ==> !x. p x ==> g x"]}, {name = "P50", goal = [ QUOTE "\n(!x. f0 a x \\/ !y. f0 x y) ==> ?x. !y. f0 x y"]}, (* ------------------------------------------------------------------------- *) (* Example from Manthey and Bry, CADE-9. *) (* ------------------------------------------------------------------------- *) {name = "P55", goal = [ QUOTE "\nlives agatha /\\ lives butler /\\ lives charles /\\\n(killed agatha agatha \\/ killed butler agatha \\/ killed charles agatha) /\\\n(!x y. killed x y ==> hates x y /\\ ~richer x y) /\\\n(!x. hates agatha x ==> ~hates charles x) /\\\n(hates agatha agatha /\\ hates agatha charles) /\\\n(!x. lives x /\\ ~richer x agatha ==> hates butler x) /\\\n(!x. hates agatha x ==> hates butler x) /\\\n(!x. ~hates x agatha \\/ ~hates x butler \\/ ~hates x charles) ==>\nkilled agatha agatha /\\ ~killed butler agatha /\\ ~killed charles agatha"]}, {name = "P57", goal = [ QUOTE "\np (f a b) (f b c) /\\ p (f b c) (f a c) /\\\n(!x y z. p x y /\\ p y z ==> p x z) ==> p (f a b) (f a c)"]}, (* ------------------------------------------------------------------------- *) (* See info-hol, circa 1500. *) (* ------------------------------------------------------------------------- *) {name = "P58", goal = [ QUOTE "\n!x. ?v w. !y z. p x /\\ q y ==> (p v \\/ r w) /\\ (r z ==> q v)"]}, {name = "P59", goal = [ QUOTE "\n(!x. p x <=> ~p (f x)) ==> ?x. p x /\\ ~p (f x)"]}, {name = "P60", goal = [ QUOTE "\n!x. p x (f x) <=> ?y. (!z. p z y ==> p z (f x)) /\\ p x y"]}, (* ------------------------------------------------------------------------- *) (* From Gilmore's classic paper. *) (* ------------------------------------------------------------------------- *) (* JRH: Amazingly, this still seems non-trivial... in HOL it works at depth 45! Joe: Confirmed (depth=45, inferences=263702, time=148s), though if lemmaizing is used then a lemma is discovered at depth 29 that allows a much quicker proof (depth=30, inferences=10039, time=5.5s). [13 Oct 2001] *) {name = "GILMORE_1", goal = [ QUOTE "\n?x. !y z.\n (f y ==> g y <=> f x) /\\ (f y ==> h y <=> g x) /\\\n ((f y ==> g y) ==> h y <=> h x) ==> f z /\\ g z /\\ h z"]}, (* JRH: This is not valid, according to Gilmore {name = "GILMORE_2", goal = ` ?x y. !z. (f x z <=> f z y) /\ (f z y <=> f z z) /\ (f x y <=> f y x) ==> (f x y <=> f x z)`}, *) {name = "GILMORE_3", goal = [ QUOTE "\n?x. !y z.\n ((f y z ==> g y ==> h x) ==> f x x) /\\ ((f z x ==> g x) ==> h z) /\\\n f x y ==> f z z"]}, {name = "GILMORE_4", goal = [ QUOTE "\n?x y. !z. (f x y ==> f y z /\\ f z z) /\\ (f x y /\\ g x y ==> g x z /\\ g z z)"]}, {name = "GILMORE_5", goal = [ QUOTE "\n(!x. ?y. f x y \\/ f y x) /\\ (!x y. f y x ==> f y y) ==> ?z. f z z"]}, {name = "GILMORE_6", goal = [ QUOTE "\n!x. ?y.\n (?w. !v. f w x ==> g v w /\\ g w x) ==>\n (?w. !v. f w y ==> g v w /\\ g w y) \\/\n !z v. ?w. g v z \\/ h w y z ==> g z w"]}, {name = "GILMORE_7", goal = [ QUOTE "\n(!x. k x ==> ?y. l y /\\ (f x y ==> g x y)) /\\\n(?z. k z /\\ !w. l w ==> f z w) ==> ?v w. k v /\\ l w /\\ g v w"]}, {name = "GILMORE_8", goal = [ QUOTE "\n?x. !y z.\n ((f y z ==> g y ==> !w. ?v. h w v x) ==> f x x) /\\\n ((f z x ==> g x) ==> !w. ?v. h w v z) /\\ f x y ==> f z z"]}, (* JRH: This is still a very hard goal Joe: With lemmaizing (in HOL): (depth=18, inferences=15632, time=21s) Without: gave up waiting after (depth=25, inferences=2125072, time=3000s) [13 Oct 2001] *) {name = "GILMORE_9", goal = [ QUOTE "\n!x. ?y. !z.\n ((!w. ?v. f y w v /\\ g y w /\\ ~h y x) ==>\n (!w. ?v. f x w v /\\ g z u /\\ ~h x z) ==>\n !w. ?v. f x w v /\\ g y w /\\ ~h x y) /\\\n ((!w. ?v. f x w v /\\ g y w /\\ ~h x y) ==>\n ~(!w. ?v. f x w v /\\ g z w /\\ ~h x z) ==>\n (!w. ?v. f y w v /\\ g y w /\\ ~h y x) /\\\n !w. ?v. f z w v /\\ g y w /\\ ~h z y)"]}, (* ------------------------------------------------------------------------- *) (* Translation of Gilmore procedure using separate definitions. *) (* ------------------------------------------------------------------------- *) {name = "GILMORE_9a", goal = [ QUOTE "\n(!x y. p x y <=> !w. ?v. f x w v /\\ g y w /\\ ~h x y) ==>\n!x. ?y. !z.\n (p y x ==> p x z ==> p x y) /\\ (p x y ==> ~p x z ==> p y x /\\ p z y)"]}, (* ------------------------------------------------------------------------- *) (* Example from Davis-Putnam papers where Gilmore procedure is poor. *) (* ------------------------------------------------------------------------- *) {name = "DAVIS_PUTNAM_EXAMPLE", goal = [ QUOTE "\n?x y. !z. (f x y ==> f y z /\\ f z z) /\\ (f x y /\\ g x y ==> g x z /\\ g z z)"]}, (* ------------------------------------------------------------------------- *) (* The interesting example where connections make the proof longer. *) (* ------------------------------------------------------------------------- *) {name = "BAD_CONNECTIONS", goal = [ QUOTE "\n~a /\\ (a \\/ b) /\\ (c \\/ d) /\\ (~b \\/ e \\/ f) /\\ (~c \\/ ~e) /\\ (~c \\/ ~f) /\\\n(~b \\/ g \\/ h) /\\ (~d \\/ ~g) /\\ (~d \\/ ~h) ==> F"]}, (* ------------------------------------------------------------------------- *) (* The classic Los puzzle. (Clausal version MSC006-1 in the TPTP library.) *) (* Note: this is actually in the decidable "AE" subset, though that doesn't *) (* yield a very efficient proof. *) (* ------------------------------------------------------------------------- *) {name = "LOS", goal = [ QUOTE "\n(!x y z. p x y ==> p y z ==> p x z) /\\\n(!x y z. q x y ==> q y z ==> q x z) /\\ (!x y. q x y ==> q y x) /\\\n(!x y. p x y \\/ q x y) ==> (!x y. p x y) \\/ !x y. q x y"]}, (* ------------------------------------------------------------------------- *) (* The steamroller. *) (* ------------------------------------------------------------------------- *) {name = "STEAM_ROLLER", goal = [ QUOTE "\n((!x. p1 x ==> p0 x) /\\ ?x. p1 x) /\\ ((!x. p2 x ==> p0 x) /\\ ?x. p2 x) /\\\n((!x. p3 x ==> p0 x) /\\ ?x. p3 x) /\\ ((!x. p4 x ==> p0 x) /\\ ?x. p4 x) /\\\n((!x. p5 x ==> p0 x) /\\ ?x. p5 x) /\\ ((?x. q1 x) /\\ !x. q1 x ==> q0 x) /\\\n(!x.\n p0 x ==>\n (!y. q0 y ==> r x y) \\/\n !y. p0 y /\\ s0 y x /\\ (?z. q0 z /\\ r y z) ==> r x y) /\\\n(!x y. p3 y /\\ (p5 x \\/ p4 x) ==> s0 x y) /\\\n(!x y. p3 x /\\ p2 y ==> s0 x y) /\\ (!x y. p2 x /\\ p1 y ==> s0 x y) /\\\n(!x y. p1 x /\\ (p2 y \\/ q1 y) ==> ~r x y) /\\\n(!x y. p3 x /\\ p4 y ==> r x y) /\\ (!x y. p3 x /\\ p5 y ==> ~r x y) /\\\n(!x. p4 x \\/ p5 x ==> ?y. q0 y /\\ r x y) ==>\n?x y. p0 x /\\ p0 y /\\ ?z. q1 z /\\ r y z /\\ r x y"]}, (* ------------------------------------------------------------------------- *) (* An incestuous example used to establish completeness characterization. *) (* ------------------------------------------------------------------------- *) {name = "MODEL_COMPLETENESS", goal = [ QUOTE "\n(!w x. sentence x ==> holds w x \\/ holds w (not x)) /\\\n(!w x. ~(holds w x /\\ holds w (not x))) ==>\n((!x.\n sentence x ==>\n (!w. models w s ==> holds w x) \\/\n !w. models w s ==> holds w (not x)) <=>\n !w v.\n models w s /\\ models v s ==>\n !x. sentence x ==> (holds w x <=> holds v x))"]} ]; (* ========================================================================= *) (* Problems with equality. *) (* ========================================================================= *) val equality = [ (* ------------------------------------------------------------------------- *) (* Trivia (some of which demonstrate ex-bugs in the prover). *) (* ------------------------------------------------------------------------- *) {name = "REFLEXIVITY", goal = [ QUOTE "\nc = c"]}, {name = "SYMMETRY", goal = [ QUOTE "\n!x y. x = y ==> y = x"]}, {name = "TRANSITIVITY", goal = [ QUOTE "\n!x y z. x = y /\\ y = z ==> x = z"]}, {name = "TRANS_SYMM", goal = [ QUOTE "\n!x y z. x = y /\\ y = z ==> z = x"]}, {name = "SUBSTITUTIVITY", goal = [ QUOTE "\n!x y. f x /\\ x = y ==> f y"]}, {name = "CYCLIC_SUBSTITUTION_BUG", goal = [ QUOTE "\n(!x. y = g (c x)) ==> ?z. y = g z"]}, (* ------------------------------------------------------------------------- *) (* Simple equality problems. *) (* ------------------------------------------------------------------------- *) {name = "P48", goal = [ QUOTE "\n(a = b \\/ c = d) /\\ (a = c \\/ b = d) ==> a = d \\/ b = c"]}, {name = "P49", goal = [ QUOTE "\n(?x y. !z. z = x \\/ z = y) /\\ p a /\\ p b /\\ ~(a = b) ==> !x. p x"]}, {name = "P51", goal = [ QUOTE "\n(?z w. !x y. f0 x y <=> x = z /\\ y = w) ==>\n?z. !x. (?w. !y. f0 x y <=> y = w) <=> x = z"]}, {name = "P52", goal = [ QUOTE "\n(?z w. !x y. f0 x y <=> x = z /\\ y = w) ==>\n?w. !y. (?z. !x. f0 x y <=> x = z) <=> y = w"]}, (* ------------------------------------------------------------------------- *) (* The Melham problem after an inverse skolemization step. *) (* ------------------------------------------------------------------------- *) {name = "UNSKOLEMIZED_MELHAM", goal = [ QUOTE "\n(!x y. g x = g y ==> f x = f y) ==> !y. ?w. !x. y = g x ==> w = f x"]}, (* ------------------------------------------------------------------------- *) (* The example always given for congruence closure. *) (* ------------------------------------------------------------------------- *) {name = "CONGRUENCE_CLOSURE_EXAMPLE", goal = [ QUOTE "\n!x. f (f (f (f (f x)))) = x /\\ f (f (f x)) = x ==> f x = x"]}, (* ------------------------------------------------------------------------- *) (* A simple example (see EWD1266a and the application to Morley's theorem). *) (* ------------------------------------------------------------------------- *) {name = "EWD", goal = [ QUOTE "\n(!x. f x ==> g x) /\\ (?x. f x) /\\ (!x y. g x /\\ g y ==> x = y) ==>\n!y. g y ==> f y"]}, {name = "EWD'", goal = [ QUOTE "\n(!x. f (f x) = f x) /\\ (!x. ?y. f y = x) ==> !x. f x = x"]}, (* ------------------------------------------------------------------------- *) (* Wishnu Prasetya's example. *) (* ------------------------------------------------------------------------- *) {name = "WISHNU", goal = [ QUOTE "\n(?x. x = f (g x) /\\ !x'. x' = f (g x') ==> x = x') <=>\n?y. y = g (f y) /\\ !y'. y' = g (f y') ==> y = y'"]}, (* ------------------------------------------------------------------------- *) (* An equality version of the Agatha puzzle. *) (* ------------------------------------------------------------------------- *) {name = "AGATHA", goal = [ QUOTE "\n(?x. lives x /\\ killed x agatha) /\\\n(lives agatha /\\ lives butler /\\ lives charles) /\\\n(!x. lives x ==> x = agatha \\/ x = butler \\/ x = charles) /\\\n(!x y. killed x y ==> hates x y) /\\ (!x y. killed x y ==> ~richer x y) /\\\n(!x. hates agatha x ==> ~hates charles x) /\\\n(!x. ~(x = butler) ==> hates agatha x) /\\\n(!x. ~richer x agatha ==> hates butler x) /\\\n(!x. hates agatha x ==> hates butler x) /\\ (!x. ?y. ~hates x y) /\\\n~(agatha = butler) ==>\nkilled agatha agatha /\\ ~killed butler agatha /\\ ~killed charles agatha"]}, (* ------------------------------------------------------------------------- *) (* Group theory examples. *) (* ------------------------------------------------------------------------- *) (* JRH: (Size 18, 61814 seconds.) *) {name = "GROUP_RIGHT_INVERSE", goal = [ QUOTE "\n(!x y z. x * (y * z) = x * y * z) /\\ (!x. e * x = x) /\\\n(!x. i x * x = e) ==> !x. x * i x = e"]}, {name = "GROUP_RIGHT_IDENTITY", goal = [ QUOTE "\n(!x y z. x * (y * z) = x * y * z) /\\ (!x. e * x = x) /\\\n(!x. i x * x = e) ==> !x. x * e = x"]}, {name = "KLEIN_GROUP_COMMUTATIVE", goal = [ QUOTE "\n(!x y z. x * (y * z) = x * y * z) /\\ (!x. e * x = x) /\\ (!x. x * e = x) /\\\n(!x. x * x = e) ==> !x y. x * y = y * x"]} ]; (* ========================================================================= *) (* Some sample problems from the TPTP archive. *) (* Note: for brevity some relation/function names have been shortened. *) (* ========================================================================= *) val tptp = [ (* ------------------------------------------------------------------------- *) (* TPTP problems that have demonstrated bugs in the prover. *) (* ------------------------------------------------------------------------- *) (* Solved trivially by meson without cache cutting, but not with. *) {name = "PUZ011-1", goal = [ QUOTE "\nocean atlantic /\\ ocean indian /\\ borders atlantic brazil /\\\nborders atlantic uruguay /\\ borders atlantic c_venesuela /\\\nborders atlantic c_zaire /\\ borders atlantic nigeria /\\\nborders atlantic angola /\\ borders indian india /\\\nborders indian pakistan /\\ borders indian iran /\\ borders indian somalia /\\\nborders indian kenya /\\ borders indian tanzania /\\ south_american brazil /\\\nsouth_american uruguay /\\ south_american c_venesuela /\\ african c_zaire /\\\nafrican nigeria /\\ african angola /\\ african somalia /\\ african kenya /\\\nafrican tanzania /\\ asian india /\\ asian pakistan /\\ asian iran ==>\n(!x y z.\n ~ocean x \\/ ~borders x y \\/ ~african y \\/ ~borders x z \\/ ~asian z) ==>\nF"]}, (* ------------------------------------------------------------------------- *) (* Problems used by the fol unit test to exercise the TPTP parser. *) (* ------------------------------------------------------------------------- *) {name = "PUZ001-1", goal = [ QUOTE "\nlives agatha /\\ lives butler /\\ lives charles /\\\n(!x y. ~killed x y \\/ ~richer x y) /\\\n(!x. ~hates agatha x \\/ ~hates charles x) /\\\n(!x. ~hates x agatha \\/ ~hates x butler \\/ ~hates x charles) /\\\nhates agatha agatha /\\ hates agatha charles /\\\n(!x y. ~killed x y \\/ hates x y) /\\\n(!x. ~hates agatha x \\/ hates butler x) /\\\n(!x. ~lives x \\/ richer x agatha \\/ hates butler x) ==>\nkilled butler agatha \\/ killed charles agatha ==> F"]}, {name = "PUZ020-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y. ~(x = y) \\/ statement_by x = statement_by y) /\\\n(!x. ~person x \\/ knight x \\/ knave x) /\\\n(!x. ~person x \\/ ~knight x \\/ ~knave x) /\\\n(!x y. ~says x y \\/ a_truth y \\/ ~a_truth y) /\\\n(!x y. ~says x y \\/ ~(x = y)) /\\ (!x y. ~says x y \\/ y = statement_by x) /\\\n(!x y. ~person x \\/ ~(x = statement_by y)) /\\\n(!x. ~person x \\/ ~a_truth (statement_by x) \\/ knight x) /\\\n(!x. ~person x \\/ a_truth (statement_by x) \\/ knave x) /\\\n(!x y. ~(x = y) \\/ ~knight x \\/ knight y) /\\\n(!x y. ~(x = y) \\/ ~knave x \\/ knave y) /\\\n(!x y. ~(x = y) \\/ ~person x \\/ person y) /\\\n(!x y z. ~(x = y) \\/ ~says x z \\/ says y z) /\\\n(!x y z. ~(x = y) \\/ ~says z x \\/ says z y) /\\\n(!x y. ~(x = y) \\/ ~a_truth x \\/ a_truth y) /\\\n(!x y. ~knight x \\/ ~says x y \\/ a_truth y) /\\\n(!x y. ~knave x \\/ ~says x y \\/ ~a_truth y) /\\ person husband /\\\nperson c_wife /\\ ~(husband = c_wife) /\\\nsays husband (statement_by husband) /\\\n(~a_truth (statement_by husband) \\/ ~knight husband \\/ knight c_wife) /\\\n(a_truth (statement_by husband) \\/ ~knight husband) /\\\n(a_truth (statement_by husband) \\/ knight c_wife) /\\\n(~knight c_wife \\/ a_truth (statement_by husband)) ==> ~knight husband ==>\nF"]}, {name = "NUM001-1", goal = [ QUOTE "\n(!x. x == x) /\\ (!x y z. ~(x == y) \\/ ~(y == z) \\/ x == z) /\\\n(!x y. x + y == y + x) /\\ (!x y z. x + (y + z) == x + y + z) /\\\n(!x y. x + y - y == x) /\\ (!x y. x == x + y - y) /\\\n(!x y z. x - y + z == x + z - y) /\\ (!x y z. x + y - z == x - z + y) /\\\n(!x y z v. ~(x == y) \\/ ~(z == x + v) \\/ z == y + v) /\\\n(!x y z v. ~(x == y) \\/ ~(z == v + x) \\/ z == v + y) /\\\n(!x y z v. ~(x == y) \\/ ~(z == x - v) \\/ z == y - v) /\\\n(!x y z v. ~(x == y) \\/ ~(z == v - x) \\/ z == v - y) ==>\n~(a + b + c == a + (b + c)) ==> F"]}, {name = "ALG005-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\\n(!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) /\\ (!x y. x + (y + x) = x) /\\\n(!x y. x + (x + y) = y + (y + x)) /\\\n(!x y z. x + y + z = x + z + (y + z)) /\\ (!x y. x * y = x + (x + y)) ==>\n~(a * b * c = a * (b * c)) ==> F"]}, {name = "GRP057-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z v. x * i (i (i y * (i x * z)) * v * i (y * v)) = z) /\\\n(!x y. ~(x = y) \\/ i x = i y) /\\ (!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) ==>\n~(i a1 * a1 = i b1 * b1) \\/ ~(i b2 * b2 * a2 = a2) \\/\n~(a3 * b3 * c3 = a3 * (b3 * c3)) ==> F"]}, {name = "LCL009-1", goal = [ QUOTE "\n(!x y. ~p (x - y) \\/ ~p x \\/ p y) /\\\n(!x y z. p (x - y - (z - y - (x - z)))) ==>\n~p (a - b - c - (a - (b - c))) ==> F"]}, (* ------------------------------------------------------------------------- *) (* Small problems that are tricky to prove. *) (* ------------------------------------------------------------------------- *) {name = "COL060-3", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. b % x % y % z = x % (y % z)) /\\ (!x y. t % x % y = y % x) /\\\n(!x y z. ~(x = y) \\/ x % z = y % z) /\\\n(!x y z. ~(x = y) \\/ z % x = z % y) ==>\n~(b % (b % (t % b) % b) % t % c_x % c_y % c_z = c_y % (c_x % c_z)) ==> F"]}, {name = "COL058-2", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y. r (r 0 x) y = r x (r y y)) /\\ (!x y z. ~(x = y) \\/ r x z = r y z) /\\\n(!x y z. ~(x = y) \\/ r z x = r z y) ==>\n~(r (r (r 0 (r (r 0 (r 0 0)) (r 0 (r 0 0)))) (r 0 (r 0 0)))\n (r (r 0 (r (r 0 (r 0 0)) (r 0 (r 0 0)))) (r 0 (r 0 0))) =\n r (r 0 (r (r 0 (r 0 0)) (r 0 (r 0 0)))) (r 0 (r 0 0))) ==> F"]}, {name = "LCL107-1", goal = [ QUOTE "\n(!x y. ~p (x - y) \\/ ~p x \\/ p y) /\\\n(!x y z v w x' y'.\n p\n (x - y - z - (v - w - (x' - w - (x' - v) - y')) -\n (z - (y - x - y')))) ==> ~p (a - b - c - (e - b - (a - e - c))) ==> F"]}, {name = "LDA007-3", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. f x (f y z) = f (f x y) (f x z)) /\\\n(!x y z. ~(x = y) \\/ f x z = f y z) /\\\n(!x y z. ~(x = y) \\/ f z x = f z y) /\\ tt = f t t /\\ ts = f t s /\\\ntt_ts = f tt ts /\\ tk = f t k /\\ tsk = f ts k ==>\n~(f t tsk = f tt_ts tk) ==> F"]}, {name = "GRP010-4", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\ (!x y. ~(x = y) \\/ i x = i y) /\\\n(!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) /\\ (!x y z. x * y * z = x * (y * z)) /\\\n(!x. 1 * x = x) /\\ (!x. i x * x = 1) /\\ c * b = 1 ==> ~(b * c = 1) ==> F"]}, {name = "ALG006-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\ (!x y. x + (y + x) = x) /\\\n(!x y. x + (x + y) = y + (y + x)) /\\\n(!x y z. x + y + z = x + z + (y + z)) ==> ~(a + c + b = a + b + c) ==> F"]}, {name = "BOO021-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\ (!x y. ~(x = y) \\/ i x = i y) /\\\n(!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) /\\ (!x y. (x + y) * y = y) /\\\n(!x y z. x * (y + z) = y * x + z * x) /\\ (!x. x + i x = 1) /\\\n(!x y. x * y + y = y) /\\ (!x y z. x + y * z = (y + x) * (z + x)) /\\\n(!x. x * i x = 0) ==> ~(b * a = a * b) ==> F"]}, {name = "GEO002-4", goal = [ QUOTE "\n(!x y z v. ~between x y z \\/ ~between y v z \\/ between x y v) /\\\n(!x y z. ~equidistant x y z z \\/ x == y) /\\\n(!x y z v w.\n ~between x y z \\/ ~between v z w \\/\n between x (outer_pasch y x v w z) v) /\\\n(!x y z v w.\n ~between x y z \\/ ~between v z w \\/\n between w y (outer_pasch y x v w z)) /\\\n(!x y z v. between x y (extension x y z v)) /\\\n(!x y z v. equidistant x (extension y x z v) z v) /\\\n(!x y z v. ~(x == y) \\/ ~between z v x \\/ between z v y) ==>\n~between a a b ==> F"]}, {name = "GRP057-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y z v. x * i (i (i y * (i x * z)) * v * i (y * v)) = z) /\\\n(!x y. ~(x = y) \\/ i x = i y) /\\ (!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) ==>\n~(i a1 * a1 = i b1 * b1) \\/ ~(i b2 * b2 * a2 = a2) \\/\n~(a3 * b3 * c3 = a3 * (b3 * c3)) ==> F"]}, {name = "HEN006-3", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\\n(!x y. ~(x <= y) \\/ x / y = 0) /\\ (!x y. ~(x / y = 0) \\/ x <= y) /\\\n(!x y. x / y <= x) /\\ (!x y z. x / y / (z / y) <= x / z / y) /\\\n(!x. 0 <= x) /\\ (!x y. ~(x <= y) \\/ ~(y <= x) \\/ x = y) /\\ (!x. x <= 1) /\\\n(!x y z. ~(x = y) \\/ x / z = y / z) /\\\n(!x y z. ~(x = y) \\/ z / x = z / y) /\\\n(!x y z. ~(x = y) \\/ ~(x <= z) \\/ y <= z) /\\\n(!x y z. ~(x = y) \\/ ~(z <= x) \\/ z <= y) /\\ a / b <= d ==>\n~(a / d <= b) ==> F"]}, {name = "RNG035-7", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\ (!x. 0 + x = x) /\\\n(!x. x + 0 = x) /\\ (!x. n x + x = 0) /\\ (!x. x + n x = 0) /\\\n(!x y z. x + (y + z) = x + y + z) /\\ (!x y. x + y = y + x) /\\\n(!x y z. x * (y * z) = x * y * z) /\\\n(!x y z. x * (y + z) = x * y + x * z) /\\\n(!x y z. (x + y) * z = x * z + y * z) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\ (!x y. ~(x = y) \\/ n x = n y) /\\\n(!x y z. ~(x = y) \\/ x * z = y * z) /\\\n(!x y z. ~(x = y) \\/ z * x = z * y) /\\ (!x. x * (x * (x * x)) = x) ==>\na * b = c /\\ ~(b * a = c) ==> F"]}, {name = "ROB001-1", goal = [ QUOTE "\n(!x. x = x) /\\ (!x y. ~(x = y) \\/ y = x) /\\\n(!x y z. ~(x = y) \\/ ~(y = z) \\/ x = z) /\\ (!x y. x + y = y + x) /\\\n(!x y z. x + y + z = x + (y + z)) /\\\n(!x y. n (n (x + y) + n (x + n y)) = x) /\\\n(!x y z. ~(x = y) \\/ x + z = y + z) /\\\n(!x y z. ~(x = y) \\/ z + x = z + y) /\\ (!x y. ~(x = y) \\/ n x = n y) ==>\n~(n (a + n b) + n (n a + n b) = b) ==> F"]}, {name = "GRP128-4.003", goal = [ QUOTE "\n(!x y.\n ~elt x \\/ ~elt y \\/ product e_1 x y \\/ product e_2 x y \\/\n product e_3 x y) /\\\n(!x y.\n ~elt x \\/ ~elt y \\/ product x e_1 y \\/ product x e_2 y \\/\n product x e_3 y) /\\ elt e_1 /\\ elt e_2 /\\ elt e_3 /\\ ~(e_1 == e_2) /\\\n~(e_1 == e_3) /\\ ~(e_2 == e_1) /\\ ~(e_2 == e_3) /\\ ~(e_3 == e_1) /\\\n~(e_3 == e_2) /\\\n(!x y.\n ~elt x \\/ ~elt y \\/ product x y e_1 \\/ product x y e_2 \\/\n product x y e_3) /\\\n(!x y z v. ~product x y z \\/ ~product x y v \\/ z == v) /\\\n(!x y z v. ~product x y z \\/ ~product x v z \\/ y == v) /\\\n(!x y z v. ~product x y z \\/ ~product v y z \\/ x == v) ==>\n(!x y z v. product x y z \\/ ~product x z v \\/ ~product z y v) /\\\n(!x y z v. product x y z \\/ ~product v x z \\/ ~product v y x) /\\\n(!x y z v. ~product x y z \\/ ~product z y v \\/ product x z v) ==> F"]}, {name = "NUM014-1", goal = [ QUOTE "\n(!x. product x x (square x)) /\\\n(!x y z. ~product x y z \\/ product y x z) /\\\n(!x y z. ~product x y z \\/ divides x z) /\\\n(!x y z v.\n ~prime x \\/ ~product y z v \\/ ~divides x v \\/ divides x y \\/\n divides x z) /\\ prime a /\\ product a (square c) (square b) ==>\n~divides a b ==> F"]} ]; (* ========================================================================= *) (* A FEW SAMPLE THEOREMS TO CHECK LARGE RUNS *) (* ========================================================================= *) (* val quick = * [extract nonequality "TRUE", * extract nonequality "P_or_not_P", * extract nonequality "JH_test", * extract nonequality "CYCLIC", * extract nonequality "MN_bug", * extract nonequality "ERIC", * extract nonequality "MATHS4_EXAMPLE", * extract nonequality "P18", * extract nonequality "P39", * extract nonequality "P59", * extract nonequality "DAVIS_PUTNAM_EXAMPLE", * extract nonequality "BAD_CONNECTIONS", * * extract equality "TRANS_SYMM", * extract equality "CYCLIC_SUBSTITUTION_BUG", * extract equality "P48"]; *) end (*#line 0.0 "src/Meter1.sig"*) (* ========================================================================= *) (* METERING TIME AND INFERENCES *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) signature Meter1 = sig type 'a pp = 'a Useful.pp (* Search limits *) type limit = {time : real option, infs : int option} val unlimited : limit val expired : limit val limit_to_string : limit -> string (* Meter readings *) type meter_reading = {time : real, infs : int} val zero_reading : meter_reading val add_readings : meter_reading -> meter_reading -> meter_reading val pp_meter_reading : meter_reading pp val meter_reading_to_string : meter_reading -> string (* Meters record time and inferences *) type meter val new_meter : limit -> meter val sub_meter : meter -> limit -> meter val record_infs : meter -> int -> unit val read_meter : meter -> meter_reading val check_meter : meter -> bool val pp_meter : meter pp end (*#line 0.0 "src/Meter1.sml"*) (* ========================================================================= *) (* METERING TIME AND INFERENCES *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Match1"]; *) (* *) structure Meter1 :> Meter1 = struct open Useful; infix |-> ::> @> oo ## ::* ::@; (* ------------------------------------------------------------------------- *) (* Search limits *) (* ------------------------------------------------------------------------- *) type limit = {time : real option, infs : int option}; val unlimited = {time = NONE, infs = NONE}; val expired = {time = SOME 0.0, infs = SOME 0}; fun limit_to_string {time, infs} = "{time = " ^ (case time of NONE => "unlimited" | SOME r => Real.fmt (StringCvt.FIX (SOME 3)) r ^ "s") ^ ", infs = " ^ (case infs of NONE => "unlimited" | SOME i => int_to_string i) ^ "}"; (* ------------------------------------------------------------------------- *) (* Meter readings. *) (* ------------------------------------------------------------------------- *) type meter_reading = {time : real, infs : int}; val zero_reading = {time = 0.0, infs = 0}; fun add_readings {time : real, infs} {time = time', infs = infs'} = {time = time + time', infs = infs + infs'}; fun pp_meter_reading pp {time, infs} = let open PP val () = begin_block pp INCONSISTENT 1 val () = add_string pp "{"; val () = begin_block pp INCONSISTENT 2 val () = add_string pp "time =" val () = add_break pp (1, 0) val () = add_string pp (Real.fmt (StringCvt.FIX (SOME 3)) time) val () = end_block pp val () = add_string pp "," val () = add_break pp (1, 0) val () = begin_block pp INCONSISTENT 2 val () = add_string pp "infs =" val () = add_break pp (1, 0) val () = pp_int pp infs val () = end_block pp val () = add_string pp "}" val () = end_block pp in () end; fun meter_reading_to_string r = PP.pp_to_string (!LINE_LENGTH) pp_meter_reading r; (* ------------------------------------------------------------------------- *) (* Meters record time and inferences. *) (* ------------------------------------------------------------------------- *) type meter = {read : unit -> meter_reading, log : (int -> unit), lim : limit}; fun new_time_meter () = let val tmr = Timer.startCPUTimer () fun read () = (fn {usr, sys, ...} => Time.toReal (Time.+ (usr, sys))) (Timer.checkCPUTimer tmr) in read end; fun new_inference_meter () = let val infs = ref 0 fun read () = !infs in (read, fn n => infs := !infs + n) end; fun new_meter lim : meter = let val tread = new_time_meter () val (iread, ilog) = new_inference_meter () in {read = (fn () => {time = tread (), infs = iread ()}), log = ilog, lim = lim} end; fun sub_meter {read, log, lim = _} lim = let val {time = init_time : real, infs = init_infs} = read () fun sub {time, infs} = {time = time - init_time, infs = infs - init_infs} in {read = sub o read, log = log, lim = lim} end; val read_meter = fn ({read, ...} : meter) => read (); val check_meter = fn ({read, lim = {time, infs}, ...} : meter) => let val {time = t, infs = i} = read () in (case time of NONE => true | SOME time => t < time) andalso (case infs of NONE => true | SOME infs => i < infs) end; val record_infs = fn ({log, ...} : meter) => log; val pp_meter = pp_map read_meter pp_meter_reading; end (*#line 0.0 "src/Solver1.sig"*) (* ========================================================================= *) (* PACKAGING UP SOLVERS TO ALLOW THEM TO COOPERATE UNIFORMLY *) (* Created by Joe Hurd, March 2002 *) (* ========================================================================= *) signature Solver1 = sig type 'a pp = 'a Useful.pp type 'a stream = 'a Stream.stream type formula = Term1.formula type thm = Thm1.thm type limit = Meter1.limit type meter = Meter1.meter type meter_reading = Meter1.meter_reading type units = Units1.units (* The type of a generic solver *) type solver = formula list -> thm list option stream val contradiction_solver : thm -> solver (* Filters to cut off searching or drop subsumed solutions *) val solved_filter : solver -> solver val subsumed_filter : solver -> solver (* User-friendly interface to generic solvers *) val solve : solver -> formula list -> thm list list val find : solver -> formula list -> thm list option val refute : solver -> thm option (* Solver nodes must construct themselves from the following form. *) type form = {slice : meter ref, (* A meter to stop after each slice *) units : units ref, (* Solvers share a unit cache *) thms : thm list, (* Context, assumed consistent *) hyps : thm list} (* Hypothesis, or set of support *) (* Solver nodes also incorporate a name. *) type node_data = {name : string, solver_con : form -> solver} type solver_node val mk_solver_node : node_data -> solver_node val pp_solver_node : solver_node pp (* At each step we schedule a time slice to the least cost solver node. *) val SLICE : limit ref type cost_fn = meter_reading -> real val time1 : cost_fn (* Time taken (in seconds) *) val time2 : cost_fn (* Time squared *) val infs1 : cost_fn (* Number of inferences made*) val infs2 : cost_fn (* Inferences squared *) (* This allows us to hierarchically arrange solver nodes. *) val combine : (cost_fn * solver_node) list -> solver_node (* Overriding the 'natural' set of support from the problem. *) val set_of_support : (thm -> bool) -> solver_node -> solver_node val everything : thm -> bool val one_negative : thm -> bool val one_positive : thm -> bool val all_negative : thm -> bool (* This one is used by Metis1.prove *) val all_positive : thm -> bool val nothing : thm -> bool (* Initializing a solver node makes it ready for action. *) type init_data = {limit : limit, thms : thm list, hyps : thm list} val initialize : solver_node -> init_data -> solver end (*#line 0.0 "src/Solver1.sml"*) (* ========================================================================= *) (* PACKAGING UP SOLVERS TO ALLOW THEM TO COOPERATE UNIFORMLY *) (* Created by Joe Hurd, March 2002 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Match1", "Meter1", "Units1", "Solver1"]; *) (* *) structure Solver1 :> Solver1 = struct open Useful Term1 Match1 Thm1 Meter1; infix |-> ::> @> oo ##; structure S = Stream; structure U = Units1; type 'a stream = 'a S.stream; type units = U.units; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Solver1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Solver1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) fun drop_after f = S.fold (fn x => fn xs => S.CONS (x, if f x then K S.NIL else xs)) S.NIL; fun time_to_string t = let val dp = if t < 10.0 then 2 else if t < 1000.0 then 1 else 0 in Real.fmt (StringCvt.FIX (SOME dp)) t end; fun infs_to_string i = if i < 10000 then int_to_string i else if i < 10000000 then int_to_string (i div 1000) ^ "K" else int_to_string (i div 1000000) ^ "M"; val name_to_string = str o hd o explode; fun option_case n _ NONE = n | option_case _ s (SOME _) = s; (* ------------------------------------------------------------------------- *) (* The type of a generic solver. *) (* ------------------------------------------------------------------------- *) type solver = formula list -> thm list option stream; local fun contr th [False] = [th] | contr th gs = map (C CONTR th) gs; in fun contradiction_solver th = (assert (is_contradiction th) (ERR "contradiction_solver" "thm not |- F"); fn gs => S.CONS (SOME (contr th gs), K S.NIL)); end; (* ------------------------------------------------------------------------- *) (* Filters to cut off searching or drop subsumed solutions. *) (* ------------------------------------------------------------------------- *) local fun concl [] = False | concl [lit] = lit | concl _ = raise BUG "concl" "not a literal"; in fun solved_filter solver goals = let fun solves goals' = can (matchl_literals |<>|) (zip goals' goals) fun final NONE = false | final (SOME ths) = solves (map (concl o clause) ths) in drop_after final (solver goals) end; end; local fun munge s n = "MUNGED__" ^ int_to_string n ^ "__" ^ s; fun munge_lit (n, Atom (Fn (p, a))) = Atom (Fn (munge p n, a)) | munge_lit (n, Not (Atom (Fn (p, a)))) = Not (Atom (Fn (munge p n, a))) | munge_lit _ = raise BUG "munge_lit" "bad literal"; fun distinctivize fms = map munge_lit (enumerate 0 fms); fun advance NONE s = (SOME NONE, s) | advance (SOME ths) s = let val fms = distinctivize (List.mapPartial (total dest_unit) ths) in if non null (Subsume1.subsumed s fms) then (NONE, s) else (SOME (SOME ths), Subsume1.add (fms |-> ()) s) end handle ERR_EXN _ => raise BUG "advance" "shouldn't fail"; in fun subsumed_filter s g = S.partial_maps advance Subsume1.empty (s g); end; (* ------------------------------------------------------------------------- *) (* User-friendly interface to generic solvers *) (* ------------------------------------------------------------------------- *) fun raw_solve s = S.partial_map I o (subsumed_filter (solved_filter s)); fun solve s = S.to_list o (raw_solve s); fun find s = (fn S.NIL => NONE | S.CONS (x, _) => SOME x) o raw_solve s; fun refute s = Option.map unwrap (find s [False]); (* ------------------------------------------------------------------------- *) (* Solver nodes must construct themselves from the following form. *) (* ------------------------------------------------------------------------- *) type form = {slice : meter ref, (* A meter to stop after each slice *) units : units ref, (* Solvers share a unit cache *) thms : thm list, (* Context, assumed consistent *) hyps : thm list}; (* Hypothesis, no assumptions *) (* ------------------------------------------------------------------------- *) (* Solver nodes also incorporate a name. *) (* ------------------------------------------------------------------------- *) type node_data = {name : string, solver_con : form -> solver}; datatype solver_node = Solver_node of {name : string, initial : string, solver_con : form -> solver}; fun mk_solver_node {name, solver_con} = Solver_node {name = name, initial = (str o hd o explode) name, solver_con = solver_con}; val pp_solver_node = pp_map (fn Solver_node {name, ...} => name) pp_string; (* ------------------------------------------------------------------------- *) (* At each step we schedule a time slice to the least cost solver node. *) (* ------------------------------------------------------------------------- *) val SLICE : limit ref = ref {time = SOME (1.0 / 3.0), infs = NONE}; type cost_fn = Meter1.meter_reading -> real; local fun sq x : real = x * x; in val time1 : cost_fn = fn {time, ...} => time; val time2 : cost_fn = fn {time, ...} => sq time; val infs1 : cost_fn = fn {infs, ...} => Real.fromInt infs; val infs2 : cost_fn = fn {infs, ...} => sq (Real.fromInt infs); end; (* ------------------------------------------------------------------------- *) (* This allows us to hierarchically arrange solver nodes. *) (* ------------------------------------------------------------------------- *) local fun name (Solver_node {name, ...}) = name; fun initial (Solver_node {initial, ...}) = initial; fun seq f [] = "" | seq f (h :: t) = foldl (fn (n, s) => s ^ "," ^ f n) (f h) t; in fun combine_names csolvers = "[" ^ seq (name o snd) csolvers ^ "]"; fun combine_initials csolvers = "[" ^ seq (initial o snd) csolvers ^ "]"; end; datatype subnode = Subnode of {name : string, used : meter_reading, cost : meter_reading -> real, solns : (unit -> thm list option stream) option}; fun init_subnode (cost, (name, solver : solver)) goal = Subnode {name = name, used = zero_reading, cost = cost, solns = SOME (fn () => solver goal)}; fun least_cost [] = K NONE | least_cost _ = (SOME o snd o min (fn (r, _) => fn (s, _) => r <= s) o map (fn (n, Subnode {used, cost, ...}) => (cost used, n))) val choose_subnode = W least_cost o List.filter (fn (_, Subnode {solns, ...}) => Option.isSome solns) o enumerate 0; fun subnode_info (Subnode {name, used = {time, infs}, solns, ...}) = name_to_string name ^ "(" ^ time_to_string time ^ "," ^ infs_to_string infs ^ ")" ^ (case solns of NONE => "*" | SOME _ => ""); local fun seq f [] = "" | seq f (h :: t) = foldl (fn (n, s) => s ^ "--" ^ f n) (f h) t; in fun status_info subnodes units = "[" ^ seq subnode_info subnodes ^ "]--u=" ^ U.info units ^ "--"; end; fun schedule check read stat = let fun sched nodes = (chat 2 (stat nodes); if not (check ()) then (chat 1 "?\n"; S.CONS (NONE, fn () => sched nodes)) else case choose_subnode nodes of NONE => (chat 1 "!\n"; S.NIL) | SOME n => let val Subnode {name, used, solns, cost} = List.nth (nodes, n) val () = chat 1 name val seq = (Option.valOf solns) () val r = read () val () = chat 2 ("--t=" ^ time_to_string (#time r) ^ "\n") val used = add_readings used r val (res, solns) = case seq of S.NIL => (NONE, NONE) | S.CONS (a, r) => (a, SOME r) val node = Subnode {name = name, used = used, cost = cost, solns = solns} val nodes = update_nth (K node) n nodes val () = case res of NONE => () | SOME _ => (chat 2 (stat nodes); chat 1 "$\n") in S.CONS (res, fn () => sched nodes) end) in sched end; fun combine_solvers (n, i) csolvers {slice, units, thms, hyps} = let val () = chat 2 (n ^ "--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ ".\n") val meter = ref (new_meter expired) fun f (Solver_node {initial, solver_con, ...}) = (initial, solver_con {slice = meter, units = units, thms = thms, hyps = hyps}) val cnodes = map (I ## f) csolvers fun check () = check_meter (!slice) andalso (meter := sub_meter (!slice) (!SLICE); true) fun read () = read_meter (!meter) fun stat s = status_info s (!units) in fn goal => schedule check read stat (map (C init_subnode goal) cnodes) end; fun combine csolvers = let val n = combine_names csolvers val i = combine_initials csolvers in Solver_node {name = n, initial = i, solver_con = combine_solvers (n, i) csolvers} end; (* ------------------------------------------------------------------------- *) (* Overriding the 'natural' set of support from the problem. *) (* ------------------------------------------------------------------------- *) fun sos_solver_con filt name solver_con {slice, units, thms, hyps} = let val () = chat 2 (name ^ "--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ ".\n") val (hyps', thms') = List.partition filt (thms @ hyps) in solver_con {slice = slice, units = units, thms = thms', hyps = hyps'} end; fun set_of_support filt (Solver_node {name, initial, solver_con}) = let val name' = "!" ^ name in Solver_node {name = name', initial = initial, solver_con = sos_solver_con filt name' solver_con} end; val everything : thm -> bool = K true; val one_negative = (fn x => null x orelse List.exists negative x) o clause; val one_positive = (fn x => null x orelse List.exists positive x) o clause; val all_negative = List.all negative o clause; val all_positive = List.all positive o clause; val nothing : thm -> bool = K false; (* ------------------------------------------------------------------------- *) (* Initializing a solver node makes it ready for action. *) (* ------------------------------------------------------------------------- *) type init_data = {limit : limit, thms : thm list, hyps : thm list} fun initialize (Solver_node {solver_con, ...}) {limit, thms, hyps} = case List.find is_contradiction (thms @ hyps) of SOME th => contradiction_solver th | NONE => let val meter = ref (new_meter expired) val units = ref U.empty val solver = solver_con {slice = meter, units = units, thms = thms, hyps = hyps} in fn g => let val () = meter := new_meter limit in drop_after (fn _ => not (check_meter (!meter))) (solver g) end end; end (*#line 0.0 "src/Meson1.sig"*) (* ========================================================================= *) (* THE MESON PROOF PROCEDURE *) (* Created by Joe Hurd, November 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) signature Meson1 = sig type solver_node = Solver1.solver_node (* Tuning parameters *) type parameters = {ancestor_pruning : bool, ancestor_cutting : bool, state_simplify : bool, cache_cutting : bool, divide_conquer : bool, unit_lemmaizing : bool} val defaults : parameters (* The meson solver *) val meson' : parameters -> solver_node val meson : solver_node (* Uses defaults *) (* The delta preprocessor as a solver *) val delta' : parameters -> solver_node val delta : solver_node (* Uses defaults *) (* The prolog solver *) val prolog' : parameters -> solver_node val prolog : solver_node (* Uses defaults *) end (*#line 0.0 "src/Meson1.sml"*) (* ========================================================================= *) (* THE MESON PROOF PROCEDURE *) (* Created by Joe Hurd, November 2001 *) (* Partly ported from the CAML-Light code accompanying John Harrison's book *) (* ========================================================================= *) (* app load ["Useful", "Stream", "Mosml", "Term1", "Thm1", "Canon1", "Match1", "Solver1", "Meter1", "Units1"]; *) (* *) structure Meson1 :> Meson1 = struct open Useful Term1 Match1 Thm1 Canon1 Meter1 Solver1; infix |-> ::> @> oo ##; structure S = Stream; structure N = LiteralNet1; structure U = Units1; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Meson1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Meson1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Tuning parameters. *) (* ------------------------------------------------------------------------- *) type parameters = {ancestor_pruning : bool, ancestor_cutting : bool, state_simplify : bool, cache_cutting : bool, divide_conquer : bool, unit_lemmaizing : bool}; val defaults = {ancestor_pruning = true, ancestor_cutting = true, state_simplify = true, cache_cutting = true, divide_conquer = true, unit_lemmaizing = true}; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) fun halves n = let val n1 = n div 2 in (n1, n - n1) end; fun splittable [] = false | splittable [_] = false | splittable _ = true; (* fun protect r f x = let val v = !r val y = f x handle e as ERR_EXN _ => (r := v; raise e) val () = r := v in y end; fun until p = let open Stream fun u NIL = NIL | u (CONS (x, xs)) = CONS (x, if p x then K NIL else fn () => u (xs ())) in u end; *) local val prefix = "_m"; in val mk_mvar = mk_prefix prefix o int_to_string; fun mk_mvars n i = map (Var o mk_mvar) (interval n i); val dest_mvar = string_to_int o dest_prefix prefix; end; datatype 'a choice = CHOICE of unit -> 'a * 'a choice; fun dest_choice (CHOICE c) = c; val no_choice = (fn () => raise ERR "no_choice" "always fails"); fun binary_choice f g = (fn () => let val (a, c) = f () in (a, CHOICE (binary_choice (dest_choice c) g)) end handle ERR_EXN _ => g ()); fun first_choice [] = no_choice | first_choice [f] = f | first_choice (f :: fs) = binary_choice f (first_choice fs); fun choice_stream f = let val (a, CHOICE c) = f () in S.CONS (a, fn () => choice_stream c) end handle ERR_EXN _ => S.NIL; fun swivel m n l = let val (l1, l') = split l m val (l2, l3) = split l' n in l2 @ l1 @ l3 end; fun thm_proves th False = is_contradiction th | thm_proves th goal = case clause th of [lit] => lit = goal | [] => true | _ => false; fun filter_meter meter = S.filter (fn a => Option.isSome a orelse not (check_meter (!meter))); (* ------------------------------------------------------------------------- *) (* Compiling the rule set used by meson. *) (* ------------------------------------------------------------------------- *) type rule = {asms : formula list, c : formula, thm : thm, asmn : int}; datatype rules = Rules of rule N.literal_map; fun dest_rules (Rules r) = r; val empty_rules = Rules N.empty; val num_all_rules = N.size o dest_rules; val num_initial_rules = #f o N.size_profile o dest_rules; fun num_rules r = num_all_rules r - num_initial_rules r; val rules_unify = N.unify o dest_rules; val pp_rules = pp_map dest_rules (N.pp_literal_map (pp_map (fn {asms, c, ...} => (asms, c)) (pp_binop " ==>" (pp_list pp_formula) pp_formula))); fun add_contrapositives chosen sos th (Rules ruls) = let val th = FRESH_VARS th val lits = clause th val lits' = map negate lits val base = map (fn l => (subtract lits' [negate l], l)) (chosen lits) val contrs = if sos then (lits', False) :: base else base fun f (a, c) = c |-> {asms = a, c = c, thm = th, asmn = length a} in Rules (foldl (fn (h, t) => N.insert (f h) t) ruls contrs) end; fun thms_to_rules chosen thms hyps = let val f = uncurry o add_contrapositives chosen in foldl (f true) (foldl (f false) empty_rules thms) hyps end; val meson_rules = thms_to_rules I; val prolog_rules = thms_to_rules (wrap o hd); (* ------------------------------------------------------------------------- *) (* Creating the delta goals. *) (* ------------------------------------------------------------------------- *) val thms_to_delta_goals = List.concat o map (fn (f,n) => [Atom (Fn (f,new_vars n)), Not (Atom (Fn (f,new_vars n)))]) o foldl (uncurry union) [] o map relations o List.concat o map clause; (* ------------------------------------------------------------------------- *) (* The state passed around by meson. *) (* ------------------------------------------------------------------------- *) type state = {env : subst, depth : int, proof : thm list, offset : int}; fun update_env f ({env, depth, proof, offset} : state) = {env = f env, depth = depth, proof = proof, offset = offset}; fun update_depth f ({env, depth, proof, offset} : state) = {env = env, depth = f depth, proof = proof, offset = offset}; fun update_proof f ({env, depth, proof, offset} : state) = {env = env, depth = depth, proof = f proof, offset = offset}; fun update_offset f ({env, depth, proof, offset} : state) = {env = env, depth = depth, proof = proof, offset = f offset}; (* ------------------------------------------------------------------------- *) (* Ancestor pruning. *) (* ------------------------------------------------------------------------- *) fun ancestor_prune false _ _ = K false | ancestor_prune true env g = let val g' = formula_subst env g fun check a' = a' = g' in List.exists (check o formula_subst env) end; (* ------------------------------------------------------------------------- *) (* Ancestor cutting. *) (* ------------------------------------------------------------------------- *) fun ancestor_cut false _ _ = K false | ancestor_cut true env g = let val g' = negate (formula_subst env g) fun check a' = a' = g' in List.exists (check o formula_subst env) end; (* ------------------------------------------------------------------------- *) (* Cache cutting. *) (* ------------------------------------------------------------------------- *) fun cache_cont c ({offset, ...} : state) = let fun f v = case total dest_mvar v of NONE => true | SOME n => n < offset val listify = Subst1.foldr (fn m as v |-> _ => if f v then cons m else I) [] val mem = ref [] fun purify (s as {env, depth = n, ...} : state) = let val l = listify env fun p (n', l') = n <= n' andalso l = l' in if List.exists p (!mem) then raise ERR "cache_cut" "repetition" else (mem := (n, l) :: (!mem); update_env (K (Subst1.from_maplets l)) s) end in c o purify end; fun cache_cut false = I | cache_cut true = fn f => fn a => fn g => fn c => fn s => f a g (cache_cont c s) s; (* ------------------------------------------------------------------------- *) (* Unit clause shortcut. *) (* ------------------------------------------------------------------------- *) fun grab_unit units (s as {proof = th :: _, ...} : state) = (units := U.add th (!units); s) | grab_unit _ {proof = [], ...} = raise BUG "grab_unit" "no thms"; fun use_unit units g c (s as {env, ...}) = let val prove = partial (ERR "use_unit" "NONE") (U.prove (!units)) in c (update_proof (cons (unwrap (prove [formula_subst env g]))) s) end; fun unit_cut false _ = I | unit_cut true units = fn f => fn a => fn g => fn c => fn s => use_unit units g c s handle ERR_EXN _ => f a g (c o grab_unit units) s; (* ------------------------------------------------------------------------- *) (* The core of meson: ancestor unification or Prolog-style extension. *) (* ------------------------------------------------------------------------- *) fun freshen_rule ({thm, asms, c, ...} : rule) i = let val fvs = FVL (c :: asms) val fvn = length fvs val mvs = mk_mvars i fvn val sub = Subst1.from_maplets (zipwith (curry op|->) fvs mvs) in ((INST sub thm, map (formula_subst sub) asms, formula_subst sub c), i + fvn) end; fun reward r = update_depth (fn n => n + r); fun spend m f c (s as {depth = n, ...} : state) = let val low = n - m val () = assert (0 <= low) (ERR "meson" "impossible divide and conquer") fun check (s' as {depth = n', ...} : state) = if n' <= low then s' else raise ERR "meson" "divide and conquer" in f (c o check) s end; local fun unify env (th, asms, c) g = (th, asms, unify_literals env c g) fun match env (th, asms, c) g = let val sub = match_literals c g in (INST sub th, map (formula_subst sub) asms, env) end; in fun next_state false env r g = unify env r g | next_state true env r g = match env r g handle ERR_EXN _ => unify env r g; end; local fun mp _ th [] p = FACTOR th :: p | mp env th (g :: gs) (th1 :: p) = mp env (RESOLVE (formula_subst env g) (INST env th1) th) gs p | mp _ _ (_ :: _) [] = raise BUG "modus_ponens" "fresh out of thms" in fun modus_ponens th gs (state as {env, ...}) = update_proof (mp env (INST env th) (rev gs)) state; end; fun swivelp m n = update_proof (swivel m n); fun meson_expand {parm : parameters, rules, cut, meter, saturated} = let fun expand ancestors g cont (state as {env, ...}) = if not (check_meter (!meter)) then (NONE, CHOICE (fn () => expand ancestors g cont state)) else if ancestor_prune (#ancestor_pruning parm) env g ancestors then raise ERR "meson" "ancestor pruning" else if ancestor_cut (#ancestor_cutting parm) env g ancestors then (record_infs (!meter) 1; cont (update_proof (cons (ASSUME g)) state)) else let (*val () = print ("meson: " ^ formula_to_string g ^ ".\n")*) fun reduction a () = let val state = update_env (K (unify_literals env g (negate a))) state val state = update_proof (cons (ASSUME g)) state in (record_infs (!meter) 1; cont state) end val expansion = expand_rule ancestors g cont state in first_choice (map reduction ancestors @ map expansion (rules_unify rules (formula_subst env g))) () end and expand_rule ancestors g cont {env, depth, proof, offset} r () = let val depth = depth - #asmn r val () = if 0 <= depth then () else (saturated := false; raise ERR "meson" "too deep") val (r, offset) = freshen_rule r offset val (th, asms, env) = next_state (#state_simplify parm) env r g val () = record_infs (!meter) 1 in expands (g :: ancestors) asms (cont o modus_ponens th asms) {env = env, depth = depth, proof = proof, offset = offset} end and expands ancestors g c (s as {depth = n, ...}) = if #divide_conquer parm andalso splittable g then let val (l1, l2) = halves (length g) val (g1, g2) = split g l1 val (f1, f2) = Df (expands ancestors) (g1, g2) val (n1, n2) = halves n val s = update_depth (K n1) s in binary_choice (fn () => f1 (f2 c o reward n2) s) (fn () => f2 (spend (n1 + 1) f1 (c o swivelp l1 l2) o reward n2) s) () end else foldl (uncurry (cut expand ancestors)) c (rev g) s in cut expand [] end; (* ------------------------------------------------------------------------- *) (* Full meson procedure. *) (* ------------------------------------------------------------------------- *) fun meson_finally g ({env, proof, ...} : state) = let val () = assert (length proof = length g) (BUG "meson" "bad final state") val g' = map (formula_subst env) g val proof' = map (INST env) (rev proof) (*val () = (print "meson_finally: "; printVal (g', proof'); print ".\n")*) val () = assert (List.all (uncurry thm_proves) (zip proof' g')) (BUG "meson" "did not prove goal list") in (SOME (FRESH_VARSL proof'), CHOICE no_choice) end; fun raw_meson system goals depth = choice_stream (fn () => foldl (uncurry (meson_expand system)) (meson_finally goals) (rev goals) {env = |<>|, depth = depth, proof = [], offset = 0}); (* ------------------------------------------------------------------------- *) (* Raw solvers. *) (* ------------------------------------------------------------------------- *) type 'a system = {parm : parameters, rules : rules, meter : meter ref, saturated : bool ref, cut : (formula list -> formula -> (state -> 'a) -> state -> 'a) -> formula list -> formula -> (state -> 'a) -> state -> 'a}; fun mk_system parm units meter rules : 'a system = let val {cache_cutting = caching, unit_lemmaizing = lemmaizing, ...} = parm in {parm = parm, rules = rules, meter = meter, saturated = ref false, cut = unit_cut lemmaizing units o cache_cut caching} end; fun meson' parm = mk_solver_node {name = "meson", solver_con = fn {slice, units, thms, hyps} => let val ruls = meson_rules thms hyps val () = chat 2 ("meson--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ "--#rules=" ^ int_to_string (num_rules ruls) ^ "--#initial_rules=" ^ int_to_string (num_initial_rules ruls) ^ ".\n") val system as {saturated = b, ...} = mk_system parm units slice ruls fun d n = if !b then S.NIL else (b := true; S.CONS (n, fn () => d (n + 1))) fun f q d = (chat 1 ("-" ^ int_to_string d); raw_meson system q d) fun unit_check goals NONE = U.prove (!units) goals | unit_check _ s = s in fn goals => filter_meter slice (S.map (unit_check goals) (S.flatten (S.map (f goals) (d 0)))) end}; val meson = meson' defaults; fun delta' parm = mk_solver_node {name = "delta", solver_con = fn {slice, units, thms, hyps} => let val ruls = meson_rules thms hyps val dgoals = thms_to_delta_goals hyps val () = chat 2 ("delta--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ "--#rules=" ^ int_to_string (num_rules ruls) ^ "--#delta_goals=" ^ int_to_string (length dgoals) ^ ".\n") val system as {saturated = b, ...} = mk_system parm units slice ruls val delta_goals = S.from_list dgoals fun d n = if !b then S.NIL else (b := true; S.CONS (n, fn () => d (n + 1))) fun f d g = (chat 1 "+"; S.map (K NONE) (raw_meson system [g] d)) fun g d = (chat 1 (int_to_string d); S.flatten (S.map (f d) delta_goals)) fun h () = S.flatten (S.map g (d 0)) fun unit_check goals NONE = U.prove (!units) goals | unit_check _ s = s in case delta_goals of S.NIL => K S.NIL | _ => fn goals => filter_meter slice (S.map (unit_check goals) (h ())) end}; val delta = delta' defaults; val prolog_depth = case Int.maxInt of NONE => 1000000 | SOME i => i; fun prolog' parm = mk_solver_node {name = "prolog", solver_con = fn {slice, units, thms, hyps} => let val system = mk_system parm units slice (prolog_rules thms hyps) fun comment S.NIL = "!\n" | comment (S.CONS (NONE, _)) = "-" | comment (S.CONS (SOME _, _)) = "$\n" fun f t () = let val x = t () in chat 1 (comment x); x end in fn goals => S.map_thk f (fn () => raw_meson system goals prolog_depth) () end}; val prolog = prolog' defaults; (* quick testing load "Problem1"; open Problem1; val time = Mosml.time; quotation := true; installPP pp_term; installPP pp_formula; installPP Subst1.pp_subst; installPP pp_rules; installPP pp_thm; val limit : limit ref = ref {infs = NONE, time = SOME 30.0}; fun prolog_solve d q = try (solve (initialize prolog {limit = !limit, thms = d, hyps = []})) q; fun meson_prove g = try (time refute) (initialize (set_of_support all_negative meson) {limit = !limit, thms = [], hyps = axiomatize (Not (generalize g))}); fun delta_prove g = try (time refute) (initialize (set_of_support all_negative delta) {limit = !limit, thms = [], hyps = eq_axiomatize (Not (generalize g))}); (* Testing the delta prover *) val p48 = parse_formula (get equality "P48"); delta_prove p48; (* Testing the prolog solver *) val database = (axiomatize o parse_formula) [ QUOTE "subset nil nil /\\\n (!v x y. subset x y ==> subset (v :: x) (v :: y)) /\\\n (!v x y. subset x y ==> subset x (v :: y))"]; try (prolog_solve database) [parse_formula [QUOTE "subset x (0 :: 1 :: 2 :: nil)"]]; (* takes ages try (prolog_solve database) [parse_formula `subset (0 :: 1 :: 2 :: nil) x`]; *) val database = (axiomatize o parse_formula) [ QUOTE "p 0 3 /\\\n (!x. p x 4) /\\\n (!x. p x 3 ==> p (s (s (s x))) 3) /\\\n (!x. p (s x) 3 ==> p x 3)"]; try (prolog_solve database) [parse_formula [QUOTE "p (s 0) 3"]]; (* Testing the meson prover *) meson_prove True; val p59 = parse_formula (get nonequality "P59"); val ths = axiomatize (Not (generalize p59)); val rules = meson_rules [] ths; rules_unify rules (parse_formula [QUOTE "~P 0"]); meson_prove p59; val p39 = parse_formula (get nonequality "P39"); clausal (Not (generalize p39)); axiomatize (Not (generalize p39)); meson_prove p39; val num14 = parse_formula (get tptp "NUM014-1"); meson_prove num14; val p55 = parse_formula (get nonequality "P55"); meson_prove p55; val p26 = parse_formula (get nonequality "P26"); clausal (Not (generalize p26)); meson_prove p26; val los = parse_formula (get nonequality "LOS"); meson_prove los; val reduced_num284 = parse_formula [ QUOTE "fibonacci 0 (s 0) /\\ fibonacci (s 0) (s 0) /\\\n (!x y z x' y' z'.\n ~sum x (s (s 0)) z \\/ ~sum y (s 0) z \\/\n ~fibonacci x x' \\/ ~fibonacci y y' \\/ ~sum x' y' z' \\/\n fibonacci z z') /\\ (!x. sum x 0 x) /\\\n (!x y z. ~sum x y z \\/ sum x (s y) (s z)) /\\\n (!x. ~fibonacci (s (s (s (s (s (s (s (s 0)))))))) x) ==> F"]; meson_prove reduced_num284; val p29 = parse_formula (get nonequality "P29"); clausal (Not (generalize p29)); meson_prove p29; val num1 = parse_formula (get tptp "NUM001-1"); meson_prove num1; val model_completeness = parse_formula (get nonequality "MODEL_COMPLETENESS"); meson_prove model_completeness; *) end (*#line 0.0 "src/Resolvers1.sig"*) (* ========================================================================= *) (* A TYPE TO FIND RESOLVANT CLAUSES *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) signature Resolvers1 = sig type 'a pp = 'a Useful.pp type formula = Term1.formula type subst = Subst1.subst type thm = Thm1.thm type resolvers type resolvant = {mate : thm, sub : subst, res : thm} val empty_resolvers : resolvers val add_resolver : thm -> resolvers -> resolvers val find_resolvants : resolvers -> thm -> resolvant list val resolvers_info : resolvers -> string val pp_resolvers : resolvers pp end (*#line 0.0 "src/Resolvers1.sml"*) (* ========================================================================= *) (* A TYPE TO FIND RESOLVANT CLAUSES *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) (* app load ["Thm1", "Match1"]; *) (* *) structure Resolvers1 :> Resolvers1 = struct infix |-> ::>; open Useful Term1 Match1 Thm1 Canon1; structure N = LiteralNet1; val |<>| = Subst1.|<>|; val op ::> = Subst1.::>; val formula_subst = Subst1.formula_subst; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Resolvers1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Resolvers1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Helper functions. *) (* ------------------------------------------------------------------------- *) fun trich l n = case split l n of (_, []) => raise ERR "trich" "no exact" | (l, h :: t) => (l, h, t); (* ------------------------------------------------------------------------- *) (* The type definition with some simple operations. *) (* ------------------------------------------------------------------------- *) type resolvers = (int * thm) N.literal_map; type resolvant = {mate : thm, sub : subst, res : thm}; val empty_resolvers : resolvers = N.empty; fun add_resolver th = let fun add_lit ((n, lit), net) = N.insert (lit |-> (n, th)) net in fn net => foldl add_lit net (enumerate 0 (clause th)) end; fun resolvers_info (net : resolvers) = int_to_string (N.size net); val pp_resolvers = pp_map resolvers_info pp_string; val dest_resolvers : resolvers -> thm list = map snd o List.filter (equal 0 o fst) o N.to_list; (* ------------------------------------------------------------------------- *) (* A reference implementation for debugging. *) (* ------------------------------------------------------------------------- *) fun canonize lits = let val nvars = enumerate 0 (FV (list_mk_conj lits)) val ms = map (fn (n, v) => v |-> Var ("__" ^ (int_to_string n))) nvars in map (formula_subst (Subst1.from_maplets ms)) lits end; local fun subs acc [] = acc | subs acc ((prev, []) :: others) = subs (prev :: acc) others | subs acc ((prev, h :: t) :: others) = subs acc ((h :: prev, t) :: (prev, t) :: others); in fun all_nonempty_subsets l = tl (subs [] [([], l)]); end; fun pairs [] = raise ERR "pairs" "empty" | pairs [h] = [] | pairs (h :: (t as h' :: _)) = (h, h') :: pairs t; fun sanity_resolve_on th th' s s' = let val sub = unifyl_literals |<>| (pairs (s @ s')) val lit = formula_subst sub (hd s) val res = FACTOR (RESOLVE lit (INST sub th) (INST sub th')) in {mate = th', sub = sub, res = res} end; fun sanity_resolve th th' = List.mapPartial I (cartwith (total o sanity_resolve_on th th') (all_nonempty_subsets (clause th)) (all_nonempty_subsets (map negate (clause th')))); fun sanity_resolvants net th = List.concat (map (sanity_resolve th) (dest_resolvers net)); fun sanity_check net th (res : resolvant list) = let val () = chat 1 "X" val f = PP.pp_to_string (!LINE_LENGTH) (pp_list (pp_map AXIOM pp_thm)) val fast = map (canonize o clause o #res) res val slow = map (canonize o clause o #res) (sanity_resolvants net th) val () = if subset fast slow then () else (print ("\nsanity_check: extra clauses:\nnet = " ^ f (map clause (dest_resolvers net)) ^ "\nth = " ^ thm_to_string th ^ "\nfast = " ^ f fast ^ "\nslow = " ^ f slow ^ "\nextra = " ^ f (subtract fast slow) ^ "\nmissing = " ^ f (subtract slow fast) ^ "\n"); raise BUG "find_resolvants" "extra clauses!") val () = if subset slow fast then () else (print ("\nsanity_check: missing clauses:\nnet = " ^ f (map clause (dest_resolvers net)) ^ "\nth = " ^ thm_to_string th ^ "\nfast = " ^ f fast ^ "\nslow = " ^ f slow ^ "\nmissing = " ^ f (subtract slow fast) ^ "\nextra = " ^ f (subtract fast slow) ^ "\n"); raise BUG "find_resolvants" "missing clauses") (* val () = (print ("\nsanity_check: ok:\nnet = " ^ f (map clause (dest_resolvers net)) ^ "\nth = " ^ thm_to_string th ^ "\nres = " ^ f fast ^ "\n")) *) in () end; (* ------------------------------------------------------------------------- *) (* The core engine for combined factor/resolution steps. *) (* ------------------------------------------------------------------------- *) fun resolve_on s r th th' = SOME (FACTOR (RESOLVE r (INST s th) (INST s th'))); fun resolve acc [] = acc | resolve acc ((avoid, sub, res, []) :: others) = resolve (if mem res (map (formula_subst sub) avoid) then acc else (res, sub) :: acc) others | resolve acc ((avoid, sub, res, x :: xs) :: others) = let fun f c = resolve acc (c ((x :: avoid, sub, res, xs) :: others)) in case total (unify_literals sub res) x of NONE => f I | SOME sub' => f (cons (avoid, Subst1.refine sub sub', formula_subst sub' res, xs)) end; fun resolve_from (n, th) (n', th') = let val (prev, lit, succ) = trich (clause th) n val (prev', lit', succ') = trich (map negate (clause th')) n' val sub = unify_literals |<>| lit lit' val res = formula_subst sub lit fun f (r, s) = Option.map (pair s) (resolve_on s r th th') in List.mapPartial f (resolve [] [(prev @ prev', sub, res, succ @ succ')]) end; fun resolvants net th = let fun g (_, mate) ((sub, res), l) = {mate = mate, sub = sub, res = res} :: l fun r m (u, acc) = case total (resolve_from (m, th)) u of NONE => acc | SOME l => foldl (g u) acc l fun f ((m, lit), acc) = foldl (r m) acc (N.unify net (negate lit)) val res = foldl f [] (enumerate 0 (clause th)) (*val () = sanity_check net th res*) in res end fun find_resolvants net th = List.filter (non tautologous o clause o #res) (resolvants net th) handle ERR_EXN _ => raise BUG "find_resolvants" "should never fail"; (* Quick testing quotation := true; installPP pp_formula; installPP pp_term; installPP pp_subst; installPP pp_thm; val th = AXIOM (map parse [`p(3, x, v)`, `q(x)`, `p(3, x, z)`]); val th' = AXIOM (map parse [`~p(3, f(y), w)`, `~q(y)`, `~p(3, f(y), 4)`]); try (resolve_from (0, th)) (0, th'); try (resolve_from (2, th)) (0, th'); try (resolve_from (0, th)) (2, th'); try (resolve_from (2, th)) (2, th'); val r = add_resolver th' empty_resolvers; map #res (find_resolvants r th); *) end (*#line 0.0 "src/Theap1.sig"*) (* ========================================================================= *) (* A TYPE TO STORE CLAUSES WAITING TO BE USED (THEAP = THEOREM HEAP) *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) signature Theap1 = sig type 'a subsume = 'a Subsume1.subsume type thm = Thm1.thm (* Tuning parameters *) type parameters = {fifo_skew : int, cleaning_freq : int} val defaults : parameters (* Theorem HEAPs *) type theap val new_theap : parameters -> theap val empty_theap : theap (* Uses defaults *) val theap_size : theap -> int val theap_add : thm -> theap -> theap val theap_addl : thm list -> theap -> theap val theap_remove : theap -> (thm * theap) option val theap_subsumers : theap -> thm subsume val theap_info : theap -> string (* Outputs "(size,weight)" *) end (*#line 0.0 "src/Theap1.sml"*) (* ========================================================================= *) (* A TYPE TO STORE CLAUSES WAITING TO BE USED (THEAP = THEOREM HEAP) *) (* Created by Joe Hurd, April 2002 *) (* ========================================================================= *) (* app load ["Heap", "Queue", "Thm1", "Subsumers1"]; *) (* *) structure Theap1 :> Theap1 = struct infix |->; open Useful Term1 Thm1; structure Q = Queue; structure H = Heap; structure S = Subsume1; type 'a queue = 'a Q.queue; type 'a heap = 'a H.heap; type 'a subsume = 'a S.subsume; (* ------------------------------------------------------------------------- *) (* Tuning parameters. *) (* ------------------------------------------------------------------------- *) type parameters = {fifo_skew : int, cleaning_freq : int} val defaults = {fifo_skew = 3, cleaning_freq = 1000}; (* ------------------------------------------------------------------------- *) (* Theorem HEAPs. *) (* ------------------------------------------------------------------------- *) type theap = ((int * int) * (int * int)) * thm queue * (int * (int * thm) heap) * thm subsume; local fun order ((m, _ : thm), (n, _ : thm)) = Int.compare (m, n); in val empty_theap_heap = H.empty order; end; fun new_theap {fifo_skew, cleaning_freq} = ((D cleaning_freq, D fifo_skew), Q.empty, (0, empty_theap_heap), S.empty); val empty_theap: theap = new_theap defaults; fun theap_size (_, _, (_, h), _) = H.size h; fun theap_weight (_, _, (w, _), _) = w; (* fun clean_theap (((_, C), F), Q, (_, H), _) = let val hash = Polyhash.mkPolyTable (10000, ERR "cleap_theap" "not found") fun mark (v, th) = Polyhash.insert hash (clause th, v) val () = H.app mark H fun add (v, th) (q, w, h, l) = (Q.add th q, w + v, H.add (v, th) h, S.add (clause th |-> th) l) fun check q n = if Q.is_empty q then n else let val th = Q.hd q in check (Q.tl q) (case total (Polyhash.remove hash) (clause th) of NONE => n | SOME v => add (v, th) n) end in (fn (q, w, h, l) => (((C, C), F), q, (w, h), l)) (check Q (Q.empty, 0, empty_theap_heap, S.empty)) end; *) (*fun theap_add th (h as (((0,_), _), _, _, _)) = theap_add th (clean_theap h)*) fun theap_add th (((c, cm), f), q, (w, h), l) = let val cl = clause th val v = formula_size (list_mk_disj cl) val h' = H.add (v, th) h in (((c - 1, cm), f), Q.add th q, (w + v, h'), S.add (clause th |-> th) l) end; fun theap_addl ths h = foldl (uncurry theap_add) h ths; fun theap_remove ((c, (0, f)), q, h, l) = if Q.is_empty q then NONE else SOME (Q.hd q, ((c, (f, f)), Q.tl q, h, l)) | theap_remove ((c, (n, f)), q, (w, h), l) = if H.is_empty h then NONE else let val ((v, x), h) = H.remove h in SOME (x, ((c, (n - 1, f)), q, (w - v, h), l)) end; fun theap_subsumers (_, _, _, l) = l; fun theap_info thp = "(" ^ int_to_string (theap_size thp) ^ "," ^ int_to_string (theap_weight thp) ^ ")"; end (*#line 0.0 "src/Resolution1.sig"*) (* ========================================================================= *) (* THE RESOLUTION PROOF PROCEDURE *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) signature Resolution1 = sig type solver_node = Solver1.solver_node (* Tuning parameters *) type parameters = {subsumption_checking : int, (* in the range 0..3 *) positive_refinement : bool, theap_parm : Theap1.parameters} val defaults : parameters (* Resolution *) val resolution' : parameters -> solver_node val resolution : solver_node (* Uses defaults *) end (*#line 0.0 "src/Resolution1.sml"*) (* ========================================================================= *) (* THE RESOLUTION PROOF PROCEDURE *) (* Created by Joe Hurd, November 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Theap1", "Stream", "Solver1", "Meter1", "Units1", "Resolvers1"]; *) (* *) structure Resolution1 :> Resolution1 = struct open Useful Term1 Thm1 Canon1 Meter1 Solver1 Resolvers1 Theap1; infix |-> ::> @> oo ## ::* ::@; structure S = Stream; structure U = Units1; type 'a subsume = 'a Subsume1.subsume; (* ------------------------------------------------------------------------- *) (* Chatting. *) (* ------------------------------------------------------------------------- *) val () = traces := {module = "Resolution1", alignment = K 1} :: !traces; fun chat l m = trace {module = "Resolution1", message = m, level = l}; (* ------------------------------------------------------------------------- *) (* Tuning parameters. *) (* ------------------------------------------------------------------------- *) type parameters = {subsumption_checking : int, (* in the range 0..3 *) positive_refinement : bool, theap_parm : Theap1.parameters} val defaults = {subsumption_checking = 1, positive_refinement = true, theap_parm = Theap1.defaults}; (* ------------------------------------------------------------------------- *) (* Clause stores. *) (* ------------------------------------------------------------------------- *) type store = thm subsume * resolvers; val empty_store : store = (Subsume1.empty, empty_resolvers); fun store_add th (s, r) = (Subsume1.add (clause th |-> th) s, add_resolver th r); fun store_resolvants ((_, r) : store) = find_resolvants r; fun store_subsumed ((s, _) : store) = Subsume1.subsumed s o clause; fun store_info (s, r) = "(" ^ Subsume1.info s ^ "," ^ resolvers_info r ^ ")"; (* ------------------------------------------------------------------------- *) (* Positive refinement. *) (* ------------------------------------------------------------------------- *) local val pos_th = List.all positive o clause; fun check true = K true | check false = fn ({mate, ...} : resolvant) => pos_th mate; in fun positive_check false = K (K true) | positive_check true = check o pos_th; end; (* ------------------------------------------------------------------------- *) (* Full resolution procedure. *) (* ------------------------------------------------------------------------- *) exception Contradiction of thm; fun unit_strengthen units th = (case first (U.subsumes units) (clause th) of SOME th => th | NONE => U.demod units th); fun subsumption_check store th = case store_subsumed store th of [] => SOME th | _ :: _ => NONE; fun theap_strengthen theap th = (case Subsume1.strictly_subsumed (theap_subsumers theap) (clause th) of [] => th | (_, th) :: _ => th); fun resolve (parm : parameters) = let fun feedback k r = int_to_string k ^ (if k = r then "" else "/" ^ int_to_string r) fun L n = n <= #subsumption_checking parm val pos_filt = Option.filter o positive_check (#positive_refinement parm) fun ftest b f = if b then Option.mapPartial (subsumption_check f) else I fun stest b s = if b then subsumption_check s else SOME fun wpass b w = if b then theap_strengthen w else I fun upass u = unit_strengthen u fun next_candidate u f s w = case theap_remove w of NONE => NONE | SOME (th, w) => (case (ftest (L 1) f o stest (L 1) s o wpass (L 2) w o upass u) th of NONE => next_candidate u f s w | SOME th => SOME (th, w)) fun retention_test u f s th = List.mapPartial (Option.mapPartial (ftest (L 3) f o stest (L 3) s o upass u o #res) o pos_filt th) fun check_add th = if is_contradiction th then raise Contradiction th else U.add th in fn record => fn (facts, used, unused) => fn units => (case next_candidate units facts used unused of NONE => NONE | SOME (th, unused) => let val units = check_add th units val used = store_add th used val th = FRESH_VARS th val resolvants = store_resolvants facts th @ store_resolvants used th val () = record (length resolvants) val units = foldl (uncurry check_add) units (map #res resolvants) val keep = retention_test units facts used th resolvants val () = chat 2 (feedback (length keep) (length resolvants)) val unused = theap_addl keep unused in SOME ((facts, used, unused), units) end) handle ERR_EXN _ => raise BUG "resolve" "shouldn't fail" end; fun raw_resolution parm = mk_solver_node {name = "resolution", solver_con = fn {slice, units, thms, hyps} => let val resolve' = resolve parm fun run wrap state = if not (check_meter (!slice)) then S.CONS (NONE, wrap state) else (chat 1 "+"; case resolve' (record_infs (!slice)) state (!units) of NONE => S.NIL | SOME (state, units') => (units := units'; run wrap state)) fun wrapper g (a as (_, _, w)) () = (chat 2 (theap_info w); run (wrapper g) a) handle Contradiction th => contradiction_solver th g val facts = foldl (fn (t, l) => store_add t l) empty_store thms val used = empty_store val unused = theap_addl hyps (new_theap (#theap_parm parm)) val () = chat 2 ("resolution--initializing--#thms=" ^ int_to_string (length thms) ^ "--#hyps=" ^ int_to_string (length hyps) ^ "--facts=" ^ store_info facts ^ "--unused=" ^ theap_info unused ^ ".\n") in fn goals => wrapper goals (facts, used, unused) () end}; fun resolution' parm = (if #positive_refinement parm then set_of_support everything else I) (raw_resolution parm); val resolution = resolution' defaults; (* quick testing load "Problem1"; open Problem1; val time = Mosml.time; quotation := true; installPP pp_term; installPP pp_formula; installPP Subst1.pp_subst; installPP pp_thm; (* Testing the resolution prover *) val limit : limit ref = ref {infs = NONE, time = SOME 30.0}; fun resolution_prove g = try (time refute) (initialize (set_of_support all_negative resolution) {limit = !limit, thms = [], hyps = axiomatize (Not (generalize g))}); axiomatize (Not (generalize True)); resolution_prove True; val prop13 = parse_formula (get nonequality "PROP_13"); axiomatize (Not (generalize prop13)); resolution_prove prop13; val p33 = parse_formula (get nonequality "P33"); axiomatize (Not (generalize p33)); resolution_prove p33; val p59 = parse_formula (get nonequality "P59"); val ths = axiomatize (Not (generalize p59)); resolution_prove p59; val p39 = parse_formula (get nonequality "P39"); clausal (Not (generalize p39)); axiomatize (Not (generalize p39)); resolution_prove p39; val num14 = parse_formula (get tptp "NUM014-1"); resolution_prove num14; val p55 = parse_formula (get nonequality "P55"); resolution_prove p55; val p26 = parse_formula (get nonequality "P26"); clausal (Not (generalize p26)); resolution_prove p26; val los = parse_formula (get nonequality "LOS"); resolution_prove los; val reduced_num284 = parse_formula [ QUOTE "fibonacci 0 (s 0) /\\ fibonacci (s 0) (s 0) /\\\n (!x y z x' y' z'.\n ~sum x (s (s 0)) z \\/ ~sum y (s 0) z \\/\n ~fibonacci x x' \\/ ~fibonacci y y' \\/ ~sum x' y' z' \\/\n fibonacci z z') /\\ (!x. sum x 0 x) /\\\n (!x y z. ~sum x y z \\/ sum x (s y) (s z)) /\\\n (!x. ~fibonacci (s (s (s (s (s (s (s (s 0)))))))) x) ==> F"]; resolution_prove reduced_num284; val p29 = parse_formula (get nonequality "P29"); clausal (Not (generalize p29)); resolution_prove p29; val num1 = parse_formula (get tptp "NUM001-1"); resolution_prove num1; val gilmore9 = parse_formula (get nonequality "GILMORE_9"); axiomatize (Not (generalize gilmore9)); resolution_prove gilmore9; val model_completeness = parse_formula (get nonequality "MODEL_COMPLETENESS"); resolution_prove model_completeness; *) end (*#line 0.0 "src/Metis1.sig"*) (* ========================================================================= *) (* THE METIS COMBINATION OF PROOF PROCEDURES FOR FIRST-ORDER LOGIC *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) signature Metis1 = sig type formula = Term1.formula type thm = Thm1.thm type limit = Meter1.limit type solver = Solver1.solver type solver_node = Solver1.solver_node (* Tuning parameters *) type Mparm = Meson1.parameters type Rparm = Resolution1.parameters type parameters = {meson : bool, delta : bool, resolution : bool, meson_parm : Mparm, resolution_parm : Rparm} val defaults : parameters val update_parm_meson : (bool -> bool) -> parameters -> parameters val update_parm_delta : (bool -> bool) -> parameters -> parameters val update_parm_resolution : (bool -> bool) -> parameters -> parameters val update_parm_meson_parm : (Mparm -> Mparm) -> parameters -> parameters val update_parm_resolution_parm : (Rparm -> Rparm) -> parameters -> parameters (* The metis combination of solvers *) val metis' : parameters -> solver_node val metis : solver_node (* Uses defaults *) (* A user-friendly interface *) val settings : parameters ref (* Starts off as defaults *) val limit : limit ref (* Starts off as 10 seconds *) val raw_prove : formula -> thm option (* Expects a ==> b ==> F *) val prove : formula -> thm option (* Adds eq axioms, converts to CNF *) val query : formula -> solver (* Prolog query engine *) end (*#line 0.0 "src/Metis1.sml"*) (* ========================================================================= *) (* THE METIS COMBINATION OF PROOF PROCEDURES FOR FIRST-ORDER LOGIC *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* app load ["Useful", "Mosml", "Term1", "Thm1", "Canon1", "Solver1", "Meson1", "Resolution1"]; *) (* *) structure Metis1 :> Metis1 = struct open Useful Term1 Thm1 Meter1 Canon1 Solver1 Meson1 Resolution1; infix |-> ::> @> oo ## ::* ::@; (* ------------------------------------------------------------------------- *) (* Tuning parameters. *) (* ------------------------------------------------------------------------- *) type Mparm = Meson1.parameters; type Rparm = Resolution1.parameters; type parameters = {meson : bool, delta : bool, resolution : bool, meson_parm : Mparm, resolution_parm : Rparm}; val defaults = {meson = true, delta = true, resolution = true, meson_parm = Meson1.defaults, resolution_parm = Resolution1.defaults}; fun update_parm_meson f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = f meson, delta = delta, resolution = resolution, meson_parm = meson_parm, resolution_parm = resolution_parm} end; fun update_parm_delta f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = meson, delta = f delta, resolution = resolution, meson_parm = meson_parm, resolution_parm = resolution_parm} end; fun update_parm_resolution f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = meson, delta = delta, resolution = f resolution, meson_parm = meson_parm, resolution_parm = resolution_parm} end; fun update_parm_meson_parm f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = meson, delta = delta, resolution = resolution, meson_parm = f meson_parm, resolution_parm = resolution_parm} end; fun update_parm_resolution_parm f parm = let val {meson, delta, resolution, meson_parm, resolution_parm} = parm in {meson = meson, delta = delta, resolution = resolution, meson_parm = meson_parm, resolution_parm = f resolution_parm} end; (* ------------------------------------------------------------------------- *) (* The metis combination of solvers. *) (* ------------------------------------------------------------------------- *) fun metis' {meson = m, delta = d, resolution = r, meson_parm, resolution_parm} = combine ((if m then cons (time1, meson' meson_parm) else I) ((if r then cons (time1, resolution' resolution_parm) else I) ((if d then cons (time2, delta' meson_parm) else I) []))); val metis = metis' defaults; (* ------------------------------------------------------------------------- *) (* A user-friendly interface. *) (* ------------------------------------------------------------------------- *) val settings = ref defaults; val limit : limit ref = ref {time = NONE, infs = NONE}; fun raw_prove (Imp (a, Imp (b, False))) = let val (thms, hyps) = (axiomatize a, axiomatize b) val solv = metis' (!settings) in refute (initialize solv {limit = !limit, thms = thms, hyps = hyps}) end | raw_prove _ = raise ERR "raw_prove" "formula not of type a ==> b ==> F"; fun prove g = let val hyps = eq_axiomatize' (Not (generalize g)) val solv = set_of_support all_negative (metis' (!settings)) in refute (initialize solv {limit = !limit, thms = [], hyps = hyps}) end; fun query database = initialize prolog {thms = axiomatize database, hyps = [], limit = unlimited}; (* quick testing val time = Mosml.time; quotation := true; installPP pp_term; installPP pp_formula; installPP Subst1.pp_subst; installPP pp_thm; (* Testing the metis prover *) prove True; val p59 = parse_formula [QUOTE "(!x. P(x) <=> ~P(f(x))) ==> (?x. P(x) /\\ ~P(f(x)))"]; val ths = axiomatize (Not (generalize p59)); prove p59; val p39 = parse_formula [QUOTE "~(?x. !y. P(y,x) <=> ~P(y,y))"]; clausal (Not (generalize p39)); axiomatize (Not (generalize p39)); prove p39; val num14 = parse_formula [ QUOTE "(!X. product(X, X, square(X))) /\\\n (!Z X Y. ~product(X, Y, Z) \\/ product(Y, X, Z)) /\\\n (!Z X Y. ~product(X, Y, Z) \\/ divides(X, Z)) /\\\n (!Y X V Z.\n ~prime(X) \\/ ~product(Y, Z, V) \\/ ~divides(X, V) \\/ divides(X, Y) \\/\n divides(X, Z)) /\\ prime(a) /\\\n product(a, square(c), square(b)) /\\ ~divides(a, b) ==> F"]; prove num14; val p26 = parse_formula [ QUOTE "((?x. P(x)) <=> (?x. Q(x))) /\\\n (!x y. P(x) /\\ Q(y) ==> (R(x) <=> U(y))) ==>\n ((!x. P(x) ==> R(x)) <=> (!x. Q(x) ==> U(x)))"]; clausal (Not (generalize p26)); prove p26; val los = parse_formula [ QUOTE "(!x y z. P x y ==> P y z ==> P x z) /\\\n (!x y z. Q x y ==> Q y z ==> Q x z) /\\ (!x y. Q x y ==> Q y x) /\\\n (!x y. P x y \\/ Q x y) ==> (!x y. P x y) \\/ !x y. Q x y"]; try prove los; val puz2 = parse_formula [ QUOTE "(!X. equal(X, X)) /\\ (!Y X. ~equal(X, Y) \\/ equal(Y, X)) /\\\n (!Z X Y. ~equal(X, Y) \\/ ~equal(Y, Z) \\/ equal(X, Z)) /\\\n (!B A. ~equal(A, B) \\/ equal(every_one_but(A), every_one_but(B))) /\\\n (!E C D. ~equal(C, D) \\/ ~hates(C, E) \\/ hates(D, E)) /\\\n (!H F_avoid G.\n ~equal(F_avoid, G) \\/ ~hates(H, F_avoid) \\/ hates(H, G)) /\\\n (!K I J. ~equal(I, J) \\/ ~killed(I, K) \\/ killed(J, K)) /\\\n (!N L M. ~equal(L, M) \\/ ~killed(N, L) \\/ killed(N, M)) /\\\n (!P O.\n ~equal(O, P) \\/ ~lives_at_dreadsbury(O) \\/ lives_at_dreadsbury(P)) /\\\n (!S Q R. ~equal(Q, R) \\/ ~richer(Q, S) \\/ richer(R, S)) /\\\n (!V T_avoid U.\n ~equal(T_avoid, U) \\/ ~richer(V, T_avoid) \\/ richer(V, U)) /\\\n lives_at_dreadsbury(someone()) /\\ killed(someone(), aunt_agatha()) /\\\n lives_at_dreadsbury(aunt_agatha()) /\\ lives_at_dreadsbury(butler()) /\\\n lives_at_dreadsbury(charles()) /\\\n (!Person.\n ~lives_at_dreadsbury(Person) \\/ equal(Person, aunt_agatha()) \\/\n equal(Person, butler()) \\/ equal(Person, charles())) /\\\n (!Victim Killer. ~killed(Killer, Victim) \\/ hates(Killer, Victim)) /\\\n (!Victim Killer. ~killed(Killer, Victim) \\/ ~richer(Killer, Victim)) /\\\n (!Person. ~hates(aunt_agatha(), Person) \\/ ~hates(charles(), Person)) /\\\n (!Person. equal(Person, butler()) \\/ hates(aunt_agatha(), Person)) /\\\n (!Person. richer(Person, aunt_agatha()) \\/ hates(butler(), Person)) /\\\n (!Person. ~hates(aunt_agatha(), Person) \\/ hates(butler(), Person)) /\\\n (!Person. ~hates(Person, every_one_but(Person))) /\\\n ~equal(aunt_agatha(), butler()) /\\\n ~killed(aunt_agatha(), aunt_agatha()) ==> F"]; prove puz2; val num284 = parse_formula [ QUOTE "fibonacci(0, successor(0)) /\\ fibonacci(successor(0), successor(0)) /\\\n (!N2 N1 N F1 FN F2.\n ~sum(N1, successor(0), N) \\/ ~sum(N2, successor(successor(0)), N) \\/\n ~fibonacci(N1, F1) \\/ ~fibonacci(N2, F2) \\/ ~sum(F1, F2, FN) \\/\n fibonacci(N, FN)) /\\ (!X. sum(X, 0, X)) /\\\n (!Z X Y. ~sum(X, Y, Z) \\/ sum(X, successor(Y), successor(Z))) /\\\n (!Result.\n ~fibonacci(successor(successor(successor(successor(successor(successor(successor(successor(0)))))))),\n Result)) ==> F"]; prove num284; val p29 = parse_formula [ QUOTE "(?x. P(x)) /\\ (?x. G(x)) ==>\n ((!x. P(x) ==> H(x)) /\\ (!x. G(x) ==> J(x)) <=>\n (!x y. P(x) /\\ G(y) ==> H(x) /\\ J(y)))"]; clausal (Not (generalize p29)); prove p29; val num27 = parse_formula [ QUOTE "(!A. equalish(add(A, 0), A)) /\\\n (!A B. equalish(add(A, successor(B)), successor(add(A, B)))) /\\\n (!A. equalish(multiply(A, 0), 0)) /\\\n (!A B. equalish(multiply(A, successor(B)), add(multiply(A, B), A))) /\\\n (!B A. ~equalish(successor(A), successor(B)) \\/ equalish(A, B)) /\\\n (!B A. ~equalish(A, B) \\/ equalish(successor(A), successor(B))) /\\\n (!C A B. ~less(A, B) \\/ ~less(C, A) \\/ less(C, B)) /\\\n (!C B A. ~equalish(add(successor(A), B), C) \\/ less(B, C)) /\\\n (!B A.\n ~less(A, B) \\/\n equalish(add(successor(predecessor_of_1st_minus_2nd(B, A)), A),\n B)) /\\ (!X. equalish(X, X)) /\\\n (!Y X. ~equalish(X, Y) \\/ equalish(Y, X)) /\\\n (!Z X Y. ~equalish(X, Y) \\/ ~equalish(Y, Z) \\/ equalish(X, Z)) /\\\n (!C A B. ~equalish(A, B) \\/ equalish(multiply(A, C), multiply(B, C))) /\\\n (!B A. ~less(A, B) \\/ ~equalish(A, B)) /\\\n (!B A. less(A, B) \\/ equalish(B, A) \\/ less(B, A)) /\\\n (!A. ~less(A, A)) /\\ (!A. ~equalish(successor(A), 0)) /\\\n (!C A B.\n ~less(A, B) \\/ equalish(C, 0) \\/\n less(multiply(A, C), multiply(B, C))) /\\ ~less(b(), a()) /\\\n less(multiply(b(), c()), multiply(a(), c())) /\\ ~equalish(c(), 0) ==>\n F"]; prove num27; val model_completeness = parse_formula [ QUOTE "(!M p. sentence(p) ==> holds(M,p) \\/ holds(M,not(p))) /\\\n (!M p. ~(holds(M,p) /\\ holds(M,not(p)))) ==>\n ((!p.\n sentence(p) ==>\n (!M. models(M,S) ==> holds(M,p)) \\/\n (!M. models(M,S) ==> holds(M,not(p)))) <=>\n (!M M'.\n models(M,S) /\\ models(M',S) ==>\n (!p. sentence(p) ==> (holds(M,p) <=> holds(M',p)))))"]; prove model_completeness; val agatha = parse_formula [ QUOTE "lives(agatha()) /\\ lives(butler()) /\\ lives(charles()) /\\\n (killed(agatha(),agatha()) \\/ killed(butler(),agatha()) \\/\n killed(charles(),agatha())) /\\\n (!x y. killed(x,y) ==> hates(x,y) /\\ ~richer(x,y)) /\\\n (!x. hates(agatha(),x) ==> ~hates(charles(),x)) /\\\n (hates(agatha(),agatha()) /\\ hates(agatha(),charles())) /\\\n (!x. lives(x) /\\ ~richer(x,agatha()) ==> hates(butler(),x)) /\\\n (!x. hates(agatha(),x) ==> hates(butler(),x)) /\\\n (!x. ~hates(x,agatha()) \\/ ~hates(x,butler()) \\/ ~hates(x,charles()))\n ==>\n killed(agatha(),agatha()) /\\ ~killed(butler(),agatha()) /\\\n ~killed(charles(),agatha())"]; prove agatha; val boo3 = parse_formula [ QUOTE "(!X. equal(X, X)) /\\ (!Y X. ~equal(X, Y) \\/ equal(Y, X)) /\\\n (!Z X Y. ~equal(X, Y) \\/ ~equal(Y, Z) \\/ equal(X, Z)) /\\\n (!Y X. sum(X, Y, add(X, Y))) /\\ (!Y X. product(X, Y, multiply(X, Y))) /\\\n (!Z X Y. ~sum(X, Y, Z) \\/ sum(Y, X, Z)) /\\\n (!Z X Y. ~product(X, Y, Z) \\/ product(Y, X, Z)) /\\\n (!X. sum(additive_identity(), X, X)) /\\\n (!X. sum(X, additive_identity(), X)) /\\\n (!X. product(multiplicative_identity(), X, X)) /\\\n (!X. product(X, multiplicative_identity(), X)) /\\\n (!Z X Y V1 V3 V4 V2.\n ~product(X, Y, V1) \\/ ~product(X, Z, V2) \\/ ~sum(Y, Z, V3) \\/\n ~product(X, V3, V4) \\/ sum(V1, V2, V4)) /\\\n (!Z X Y V1 V3 V4 V2.\n ~product(X, Y, V1) \\/ ~product(X, Z, V2) \\/ ~sum(Y, Z, V3) \\/\n ~sum(V1, V2, V4) \\/ product(X, V3, V4)) /\\\n (!Z Y X V1 V3 V4 V2.\n ~product(Y, X, V1) \\/ ~product(Z, X, V2) \\/ ~sum(Y, Z, V3) \\/\n ~product(V3, X, V4) \\/ sum(V1, V2, V4)) /\\\n (!Z Y X V1 V3 V4 V2.\n ~product(Y, X, V1) \\/ ~product(Z, X, V2) \\/ ~sum(Y, Z, V3) \\/\n ~sum(V1, V2, V4) \\/ product(V3, X, V4)) /\\\n (!Z X Y V1 V3 V4 V2.\n ~sum(X, Y, V1) \\/ ~sum(X, Z, V2) \\/ ~product(Y, Z, V3) \\/\n ~sum(X, V3, V4) \\/ product(V1, V2, V4)) /\\\n (!Z X Y V1 V3 V4 V2.\n ~sum(X, Y, V1) \\/ ~sum(X, Z, V2) \\/ ~product(Y, Z, V3) \\/\n ~product(V1, V2, V4) \\/ sum(X, V3, V4)) /\\\n (!Z Y X V1 V3 V4 V2.\n ~sum(Y, X, V1) \\/ ~sum(Z, X, V2) \\/ ~product(Y, Z, V3) \\/\n ~sum(V3, X, V4) \\/ product(V1, V2, V4)) /\\\n (!Z Y X V1 V3 V4 V2.\n ~sum(Y, X, V1) \\/ ~sum(Z, X, V2) \\/ ~product(Y, Z, V3) \\/\n ~product(V1, V2, V4) \\/ sum(V3, X, V4)) /\\\n (!X. sum(inverse(X), X, multiplicative_identity())) /\\\n (!X. sum(X, inverse(X), multiplicative_identity())) /\\\n (!X. product(inverse(X), X, additive_identity())) /\\\n (!X. product(X, inverse(X), additive_identity())) /\\\n (!V X Y U. ~sum(X, Y, U) \\/ ~sum(X, Y, V) \\/ equal(U, V)) /\\\n (!V X Y U. ~product(X, Y, U) \\/ ~product(X, Y, V) \\/ equal(U, V)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~sum(X, W, Z) \\/ sum(Y, W, Z)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~sum(W, X, Z) \\/ sum(W, Y, Z)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~sum(W, Z, X) \\/ sum(W, Z, Y)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~product(X, W, Z) \\/ product(Y, W, Z)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~product(W, X, Z) \\/ product(W, Y, Z)) /\\\n (!W X Y Z. ~equal(X, Y) \\/ ~product(W, Z, X) \\/ product(W, Z, Y)) /\\\n (!W X Y. ~equal(X, Y) \\/ equal(add(X, W), add(Y, W))) /\\\n (!W X Y. ~equal(X, Y) \\/ equal(add(W, X), add(W, Y))) /\\\n (!W X Y. ~equal(X, Y) \\/ equal(multiply(X, W), multiply(Y, W))) /\\\n (!W X Y. ~equal(X, Y) \\/ equal(multiply(W, X), multiply(W, Y))) /\\\n (!Y X. ~equal(X, Y) \\/ equal(inverse(X), inverse(Y))) /\\\n ~product(x(), x(), x()) ==> F"]; prove boo3; val fld5 = parse_formula [ QUOTE "(!Y X V W Z U.\n sum(X, V, W) \\/ ~sum(X, Y, U) \\/ ~sum(Y, Z, V) \\/ ~sum(U, Z, W)) /\\\n (!X U Z W V Y.\n sum(U, Z, W) \\/ ~sum(X, Y, U) \\/ ~sum(Y, Z, V) \\/ ~sum(X, V, W)) /\\\n (!X. sum(additive_identity(), X, X) \\/ ~defined(X)) /\\\n (!X. sum(additive_inverse(X), X, additive_identity()) \\/ ~defined(X)) /\\\n (!Z Y X. sum(Y, X, Z) \\/ ~sum(X, Y, Z)) /\\\n (!Y X V W Z U.\n product(X, V, W) \\/ ~product(X, Y, U) \\/ ~product(Y, Z, V) \\/\n ~product(U, Z, W)) /\\\n (!X U Z W V Y.\n product(U, Z, W) \\/ ~product(X, Y, U) \\/ ~product(Y, Z, V) \\/\n ~product(X, V, W)) /\\\n (!X. product(multiplicative_identity(), X, X) \\/ ~defined(X)) /\\\n (!X.\n product(multiplicative_inverse(X), X, multiplicative_identity()) \\/\n sum(additive_identity(), X, additive_identity()) \\/ ~defined(X)) /\\\n (!Z Y X. product(Y, X, Z) \\/ ~product(X, Y, Z)) /\\\n (!X C D B Z A Y.\n sum(C, D, B) \\/ ~sum(X, Y, A) \\/ ~product(A, Z, B) \\/\n ~product(X, Z, C) \\/ ~product(Y, Z, D)) /\\\n (!X A Z B C D Y.\n product(A, Z, B) \\/ ~sum(X, Y, A) \\/ ~product(X, Z, C) \\/\n ~product(Y, Z, D) \\/ ~sum(C, D, B)) /\\\n (!X Y. defined(add(X, Y)) \\/ ~defined(X) \\/ ~defined(Y)) /\\\n defined(additive_identity()) /\\\n (!X. defined(additive_inverse(X)) \\/ ~defined(X)) /\\\n (!X Y. defined(multiply(X, Y)) \\/ ~defined(X) \\/ ~defined(Y)) /\\\n defined(multiplicative_identity()) /\\\n (!X.\n defined(multiplicative_inverse(X)) \\/ ~defined(X) \\/\n sum(additive_identity(), X, additive_identity())) /\\\n (!Y X. sum(X, Y, add(X, Y)) \\/ ~defined(X) \\/ ~defined(Y)) /\\\n (!Y X. product(X, Y, multiply(X, Y)) \\/ ~defined(X) \\/ ~defined(Y)) /\\\n (!Y X.\n sum(additive_identity(), X, Y) \\/ ~less_or_equal(X, Y) \\/\n ~less_or_equal(Y, X)) /\\\n (!Y X Z.\n less_or_equal(X, Z) \\/ ~less_or_equal(X, Y) \\/\n ~less_or_equal(Y, Z)) /\\\n (!Y X.\n less_or_equal(X, Y) \\/ less_or_equal(Y, X) \\/ ~defined(X) \\/\n ~defined(Y)) /\\\n (!X U V Z Y.\n less_or_equal(U, V) \\/ ~less_or_equal(X, Y) \\/ ~sum(X, Z, U) \\/\n ~sum(Y, Z, V)) /\\\n (!X Z Y.\n less_or_equal(additive_identity(), Z) \\/\n ~less_or_equal(additive_identity(), X) \\/\n ~less_or_equal(additive_identity(), Y) \\/ ~product(X, Y, Z)) /\\\n ~sum(additive_identity(), additive_identity(),\n multiplicative_identity()) /\\ defined(a()) /\\ defined(b()) /\\\n (!X. ~sum(a(), X, b())) ==> F"]; prove fld5; *) end (*#line 0.0 "data/preamble.sml"*) (* ========================================================================= *) (* SETTING UP THE ENVIRONMENT IN WHICH WE CAN EXECUTE THE METIS PROVER *) (* Created by Joe Hurd, September 2001 *) (* ========================================================================= *) (* Loading the modules we use *) structure Main = struct fun main _ = let val () = app load ["CommandLine", "Milton", "Useful", "Term1", "Canon1", "Tptp1", "Metis1", "Problem1"]; (* Infix operators *) infixr ## |-> ::> @> oo; (* Pretty printers *) val () = installPP Term1.pp_term; val () = installPP Term1.pp_formula; val () = installPP Subst1.pp_subst; val () = installPP Thm1.pp_thm; (* Parsing quotations *) val () = quotation := true; (* Creating nice output *) local fun dup _ 0 l = l | dup x n l = dup x (n - 1) (x :: l); fun chs x n = implode (dup x n []); in fun advertize s = print ("==" ^ s ^ chs #"=" (77 - size s) ^ "\n\n"); fun separator () = print (chs #"-" 79 ^ "\n\n"); end; fun cutoff max = let fun cut feas sofa l = let val poss = sofa ^ " ... " ^ Useful.int_to_string (length l) ^ " more" in cut' (if size poss < max then poss else feas) sofa l end and cut' _ sofa [] = sofa | cut' feas sofa (h :: t) = let val sofa' = if sofa = "" then h else sofa ^ " " ^ h in if size sofa' < max then cut feas sofa' t else feas end in cut "" "" end; local fun b2s true = "on" | b2s false = "off"; val i2s = Useful.int_to_string; val l2s = Meter1.limit_to_string; in fun show (settings : Metis1.parameters) = let val {meson = Mactive, delta = Dactive, resolution = Ractive, meson_parm = Mparm, resolution_parm = Rparm} = settings in "resolution = " ^ b2s Ractive ^ "\n" ^ "meson = " ^ b2s Mactive ^ "\n" ^ "delta = " ^ b2s Dactive ^ "\n" ^ "\n" ^ "resolution_parm:\n" ^ " subsumption_checking = " ^ i2s (#subsumption_checking Rparm) ^ "\n" ^ " positive_refinement = " ^ b2s (#positive_refinement Rparm) ^ "\n" ^ " theap_parm:\n" ^ " fifo_skew = " ^ i2s (#fifo_skew (#theap_parm Rparm)) ^ "\n" ^ " theap_cleaning = " ^ i2s (#cleaning_freq (#theap_parm Rparm)) ^"\n"^ "\n" ^ "meson_parm:\n" ^ " ancestor_pruning = " ^ b2s (#ancestor_pruning Mparm) ^ "\n" ^ " ancestor_cutting = " ^ b2s (#ancestor_cutting Mparm) ^ "\n" ^ " state_simplify = " ^ b2s (#state_simplify Mparm) ^ "\n" ^ " cache_cutting = " ^ b2s (#cache_cutting Mparm) ^ "\n" ^ " divide_conquer = " ^ b2s (#divide_conquer Mparm) ^ "\n" ^ " unit_lemmaizing = " ^ b2s (#unit_lemmaizing Mparm) ^ "\n" ^ "\n" ^ "limit = " ^ l2s (!Metis1.limit) ^ "\n\n" end; end; (* The core proving function *) val cnf_normalization = ref false; fun with_cnf b = Useful.with_flag (cnf_normalization, Useful.K b); fun core_prove fm = let val prover = if !cnf_normalization then Metis1.prove else Metis1.raw_prove in case Useful.try prover fm of SOME _ => print "METIS: SUCCESSFULLY PROVED\nMETIS: " | NONE => print "METIS: FAILED TO PROVE\nMETIS: " end; fun process name goal = (print ("METIS: Problem " ^ name ^ "\n"); Milton.time core_prove goal; print "\n"); fun process_set (n, s) = let val () = advertize n fun f {name, goal} = process name (Term1.parse_formula goal) in case s of [] => () | p :: ps => (f p; app (fn x => (separator (); f x)) ps) end; (* Get options from the command line *) local open Useful Metis1; fun tlimit "-" = NONE | tlimit s = SOME (Real.fromInt (string_to_int s)); fun opts [] = 0 | opts (x :: xs) = if x = "-t" orelse x = "--time" then case xs of [] => raise Fail "options: last argument -t / --time" | y :: ys => (limit := {time = tlimit y, infs = NONE}; opts ys) else if x = "-m" orelse x = "--meson" then (settings := update_parm_meson not (!settings); opts xs) else if x = "-r" orelse x = "--resolution" then (settings := update_parm_resolution not (!settings); opts xs) else if x = "-d" orelse x = "--delta" then (settings := update_parm_delta not (!settings); opts xs) else if x = "--" then length xs else if hd (explode x) = #"-" then raise Fail ("unknown parameter: " ^ x) else 1 + length xs; in fun options () = let val () = settings := update_parm_resolution (K false) (!settings); val () = settings := update_parm_meson (K false) (!settings); val () = settings := update_parm_delta (K false) (!settings); val l = CommandLine.arguments () val n = opts l in split l (length l - n) end; end; val (opts, work) = if Milton.ml = "MLton" then options () else ([], []); (*#line 0.0 "data/benchmark.sml"*) val pure = null (CommandLine.arguments ()); local open Useful Metis1; in val () = if pure then settings:= update_parm_meson (K true) (!settings) else (); end; local open Useful Problem1; fun extract p n = (Option.valOf o List.find (fn {name, goal = _} => name = n)) p; val meson_prune = if pure then ["P29", "LDA007-3", "GRP010-4", "GEO002-4"] else ["GEO002-4"]; val prune = let val {meson, resolution, ...} = !Metis1.settings in (fn f => List.filter (not o f)) (case (meson, resolution) of (false, false) => K true | (false, true) => C mem ["COL060-3"] | (true, false) => C mem meson_prune | (true, true) => K false) end; val src0 = ["P26", "P29", "P46", "GILMORE_1", "LOS", "STEAM_ROLLER"]; val src1 = ["P48", "P49", "AGATHA"]; val src2 = ["LCL009-1", "COL060-3", "COL058-2", "LCL107-1", "LDA007-3", "GRP010-4", "BOO021-1", "GEO002-4", "GRP128-4.003"]; in val set0 = map (extract nonequality) (prune src0); val set1 = map (extract equality) (prune src1); val set2 = map (extract tptp) (prune src2); end; val program = "benchmark" ^ (if pure then "*" else ""); val () = advertize (program ^ "==starting"); val () = advertize "settings"; val () = print (show (!Metis1.settings)); val () = with_cnf true process_set ("nonequality", set0); val () = with_cnf true process_set ("equality", set1); val () = with_cnf false process_set ("tptp", set2); val () = advertize (program ^ "==finishing"); in () end; val doit = main end mlton-20100608/benchmark/tests/mpuz.sml0000644000076600000240000000736211404435630016373 0ustar mtfstaff(* * Written by sweeks@sweeks.com on 1999-08-31. * * A solution to mpuz. (Try M-x mpuz in emacs.) * This solution is very loosely based on an OCAML solution posted to * comp.lang.ml by Laurent Vaucher . *) (* override print so the benchmark is silent *) fun print _ = () structure List = struct open List fun exists(l, p) = List.exists p l fun map(l, f) = List.map f l fun fold(l, b, f) = let fun loop(l, b) = case l of [] => b | x :: l => loop(l, f(x, b)) in loop(l, b) end fun foreach(l, f) = fold(l, (), fn (x, ()) => f x) end structure String = struct open String fun fold(s, b, f) = let val n = size s fun loop(i, b) = if i = n then b else loop(i + 1, f(String.sub(s, i), b)) in loop(0, b) end end structure Mpuz = struct fun solve(a, b, c, d, e) = let fun printNewline() = print "\n" val sub = Array.sub val update = Array.update val letters = List.fold ([a, b, c, d, e], [], fn (s, letters) => String.fold (s, letters, fn (c, letters) => if List.exists(letters, fn c' => c = c') then letters else c :: letters)) val letterValues = Array.array(Char.ord Char.maxChar + 1, 0) fun letterValue(c) = Array.sub(letterValues, ord c) fun setLetterValue(c, v) = Array.update(letterValues, ord c, v) fun stringValue(s) = String.fold(s, 0, fn (c, v) => v * 10 + letterValue c) fun printResult() = (List.foreach (letters, fn c => print(concat[String.str(c), " = ", Int.toString(letterValue(c)), " "])) ; print "\n") fun testOk() = let val b0 = letterValue(String.sub(b, 1)) val b1 = letterValue(String.sub(b, 0)) val a = stringValue a val b = stringValue b val c = stringValue c val d = stringValue d val e = stringValue e in if a * b0 = c andalso a * b1 = d andalso a * b = e andalso c + d * 10 = e then printResult() else () end val values = List.map([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], fn v => (v, ref false)) (* Try all assignments of values to letters. *) fun loop(letters) = case letters of [] => testOk() | c :: letters => List.foreach (values, fn (v, r) => if !r then () else (r := true ; setLetterValue(c, v) ; loop(letters) ; r := false)) in loop(letters) end end structure Main = struct fun doit() = Mpuz.solve("AGH", "FB", "CBEE", "GHFD", "FGIJE") (* * Solution: * J = 0 I = 1 D = 8 E = 2 C = 5 B = 6 F = 4 H = 7 G = 3 A = 9 *) val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end mlton-20100608/benchmark/tests/nucleic.sml0000644000076600000240000046175711404435630017036 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) (* File: "nucleic.sml" *) structure Nucleic : sig val doit : unit -> unit end = struct type float = real type intg = int (* -- MATH UTILITIES --------------------------------------------------------*) val constant_pi = 3.14159265358979323846 val constant_minus_pi = ~3.14159265358979323846 val constant_pi2 = 1.57079632679489661923 val constant_minus_pi2 = ~1.57079632679489661923 fun math_atan2 y x = if (x > 0.0) then Math.atan (y / x) else if Real.==(x, 0.0) then if y < 0.0 then constant_minus_pi2 else Math.atan (y / x) + constant_minus_pi else if Real.==(x, 0.0) then constant_pi2 else (Math.atan (y / x) + constant_pi) (* -- POINTS ----------------------------------------------------------------*) type pt = float * float * float fun pt_sub ((x1,y1,z1):pt) (x2,y2,z2) = (x1 - x2, y1 - y2, z1 - z2) fun pt_dist (x1,y1,z1) (x2,y2,z2) = let val dx = x1 - x2 val dy = y1 - y2 val dz = z1 - z2 in Math.sqrt ((dx * dx) + (dy * dy) + (dz * dz)) end fun pt_phi (x,y,z) = let val b = math_atan2 x z in math_atan2 (((Math.cos b) * z + ((Math.sin b) * x))) y end fun pt_theta (x,y,z) = math_atan2 x z (* -- COORDINATE TRANSFORMATIONS --------------------------------------------*) (* The notation for the transformations follows "Paul, R.P. (1981) Robot || Manipulators. MIT Press." with the exception that our transformation || matrices don't have the perspective terms and are the transpose of || Paul's one. See also "M\"antyl\"a, M. (1985) An Introduction to || Solid Modeling, Computer Science Press" Appendix A. || || The components of a transformation matrix are named like this: || || a b c || d e f || g h i || tx ty tz || || The components tx, ty, and tz are the translation vector. *) type tfo = float*float*float*float*float*float*float*float*float*float*float*float val tfo_id = (1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0) (* The function "tfo-apply" multiplies a transformation matrix, tfo, by a || point vector, p. The result is a new point. || || Note: in the measured program, this function was coded in assembler. *) fun tfo_apply (a,b,c,d,e,f,g,h,i,tx,ty,tz) (x:real,y:real,z:real) = ( ((x * a) + (y * d) + (z * g) + tx) , ((x * b) + (y * e) + (z * h) + ty) , ((x * c) + (y * f) + (z * i) + tz) ) (* The function "tfo-combine" multiplies two transformation matrices A and B. || The result is a new matrix which cumulates the transformations described || by A and B. || || Note: in the measured program, this function was coded in assembler. *) fun tfo_combine (a_a:real,a_b:real,a_c:real,a_d:real,a_e:real,a_f:real,a_g:real,a_h:real,a_i:real,a_tx:real,a_ty:real,a_tz:real) (b_a:real,b_b:real,b_c:real,b_d:real,b_e:real,b_f:real,b_g:real,b_h:real,b_i:real,b_tx:real,b_ty:real,b_tz:real) = ( ((a_a * b_a) + (a_b * b_d) + (a_c * b_g)) , ((a_a * b_b) + (a_b * b_e) + (a_c * b_h)) , ((a_a * b_c) + (a_b * b_f) + (a_c * b_i)) , ((a_d * b_a) + (a_e * b_d) + (a_f * b_g)) , ((a_d * b_b) + (a_e * b_e) + (a_f * b_h)) , ((a_d * b_c) + (a_e * b_f) + (a_f * b_i)) , ((a_g * b_a) + (a_h * b_d) + (a_i * b_g)) , ((a_g * b_b) + (a_h * b_e) + (a_i * b_h)) , ((a_g * b_c) + (a_h * b_f) + (a_i * b_i)) , ((a_tx * b_a) + (a_ty * b_d) + (a_tz * b_g) + b_tx) , ((a_tx * b_b) + (a_ty * b_e) + (a_tz * b_h) + b_ty) , ((a_tx * b_c) + (a_ty * b_f) + (a_tz * b_i) + b_tz) ) (* The function "tfo-inv-ortho" computes the inverse of a homogeneous || transformation matrix. *) fun tfo_inv_ortho ((a,b,c,d,e,f,g,h,i,tx,ty,tz):tfo) = ( a,d,g, b,e,h, c,f,i, (~((a * tx) + (b * ty) + (c * tz))) , (~ ((d * tx) + (e * ty) + (f * tz))) , (~ ((g * tx) + (h * ty) + (i * tz))) ) (* Given three points p1, p2, and p3, the function "tfo-align" computes || a transformation matrix such that point p1 gets mapped to (0,0,0), p2 gets || mapped to the Y axis and p3 gets mapped to the YZ plane. *) fun tfo_align (x1:real,y1:real,z1:real) (x2:real,y2:real,z2:real) (x3,y3,z3) = let val x31 = x3 - x1 val y31 = y3 - y1 val z31 = z3 - z1 val rotpy = pt_sub (x2,y2,z2) (x1,y1,z1) val phi = pt_phi rotpy val theta = pt_theta rotpy val sinp = Math.sin phi val sint = Math.sin theta val cosp = Math.cos phi val cost = Math.cos theta val sinpsint = sinp * sint val sinpcost = sinp * cost val cospsint = cosp * sint val cospcost = cosp * cost val rotpz = ( ((cost * x31) - (sint * z31)) , ((sinpsint * x31) + (cosp * y31) + (sinpcost * z31)) , ((cospsint * x31) + (~ (sinp * y31)) + (cospcost * z31)) ) val rho = pt_theta rotpz val cosr = Math.cos rho val sinr = Math.sin rho val x = (~ (x1 * cost)) + (z1 * sint) val y = ((~ (x1 * sinpsint)) - (y1 * cosp)) - (z1 * sinpcost) val z = ((~ (x1 * cospsint) + (y1 * sinp))) - (z1 * cospcost) in ( ((cost * cosr) - (cospsint * sinr)) , sinpsint , ((cost * sinr + (cospsint * cosr))) , (sinp * sinr) , cosp , (~ (sinp * cosr)) , ((~ (sint * cosr)) - (cospcost * sinr)) , sinpcost , ((~ (sint * sinr) + (cospcost * cosr))) , ((x * cosr) - (z * sinr)) , y , ((x * sinr + (z * cosr))) ) end (* -- NUCLEIC ACID CONFORMATIONS DATA BASE ----------------------------------*) (* Numbering of atoms follows the paper: || || IUPAC-IUB Joint Commission on Biochemical Nomenclature (JCBN) || (1983) Abbreviations and Symbols for the Description of || Conformations of Polynucleotide Chains. Eur. J. Biochem 131, || 9-15. || || In the atom names, we have used "*" instead of "'". *) (* Define remaining atoms for each nucleotide type. *) datatype nuc_specific = A of pt*pt*pt*pt*pt*pt*pt*pt | C of pt*pt*pt*pt*pt*pt | G of pt*pt*pt*pt*pt*pt*pt*pt*pt | U of pt*pt*pt*pt*pt (* A N6 N7 N9 C8 H2 H61 H62 H8 || C N4 O2 H41 H42 H5 H6 || G N2 N7 N9 C8 O6 H1 H21 H22 H8 || U O2 O4 H3 H5 H6 *) (* Define part common to all 4 nucleotide types. *) type nuc = tfo*tfo*tfo*tfo* pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt* pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt*pt* pt*nuc_specific (* dgf-base-tfo ; defines the standard position for wc and wc-dumas || P-O3*-275-tfo ; defines the standard position for the connect function || P-O3*-180-tfo || P-O3*-60-tfo || P O1P O2P O5* C5* H5* H5** C4* H4* O4* C1* H1* C2* H2** O2* H2* C3* || H3* O3* N1 N3 C2 C4 C5 C6) *) fun is_A (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A _) = true | is_A x = false fun is_C (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C _) = true | is_C x = false fun is_G (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G _) = true | is_G x = false fun is_U (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U _) = true | is_U x = false fun nuc_C1' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c1' fun nuc_C2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c2 fun nuc_C2' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c2' fun nuc_C3' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c3' fun nuc_C4 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c4 fun nuc_C4' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c4' fun nuc_C5 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c5 fun nuc_C5' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c5' fun nuc_C6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = c6 fun nuc_H1' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h1' fun nuc_H2' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h2' fun nuc_H2'' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h2'' fun nuc_H3' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h3' fun nuc_H4' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h4' fun nuc_H5' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h5' fun nuc_H5'' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = h5'' fun nuc_N1 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = n1 fun nuc_N3 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = n3 fun nuc_O1P (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o1p fun nuc_O2P (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o2p fun nuc_O2' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o2' fun nuc_O3' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o3' fun nuc_O4' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o4' fun nuc_O5' (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = o5' fun nuc_P (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = p fun nuc_dgf_base_tfo (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = dgf_base_tfo fun nuc_p_o3'_180_tfo (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = p_o3'_180_tfo fun nuc_p_o3'_275_tfo (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = p_o3'_275_tfo fun nuc_p_o3'_60_tfo (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,_) = p_o3'_60_tfo fun rA_N6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = n6 fun rA_N7 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = n7 fun rA_N9 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = n9 fun rA_C8 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = c8 fun rA_H2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = h2 fun rA_H61 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = h61 fun rA_H62 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = h62 fun rA_H8 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,A (n6,n7,n9,c8,h2,h61,h62,h8)) = h8 fun rC_N4 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = n4 fun rC_O2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = o2 fun rC_H41 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = h41 fun rC_H42 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = h42 fun rC_H5 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = h5 fun rC_H6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,C (n4, o2, h41, h42, h5, h6)) = h6 fun rG_N2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = n2 fun rG_N7 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = n7 fun rG_N9 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = n9 fun rG_C8 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = c8 fun rG_O6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = o6 fun rG_H1 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = h1 fun rG_H21 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = h21 fun rG_H22 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = h22 fun rG_H8 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,G (n2,n7,n9,c8,o6,h1,h21,h22,h8)) = h8 fun rU_O2 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = o2 fun rU_O4 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = o4 fun rU_H3 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = h3 fun rU_H5 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = h5 fun rU_H6 (dgf_base_tfo,p_o3'_275_tfo,p_o3'_180_tfo,p_o3'_60_tfo, p,o1p,o2p,o5',c5',h5',h5'',c4',h4',o4',c1',h1',c2',h2'',o2',h2', c3',h3',o3',n1,n3,c2,c4,c5,c6,U (o2,o4,h3,h5,h6)) = h6 (* Database of nucleotide conformations: *) val rA = ( ( (~0.0018), (~0.8207), (0.5714), (* dgf-base-tfo *) (0.2679), (~0.5509), (~0.7904), (0.9634), (0.1517), (0.2209), (0.0073), (8.4030), (0.6232)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4550), (8.2120), (~2.8810)), (* C5' *) ( (5.4546), (8.8508), (~1.9978)), (* H5' *) ( (5.7588), (8.6625), (~3.8259)), (* H5'' *) ( (6.4970), (7.1480), (~2.5980)), (* C4' *) ( (7.4896), (7.5919), (~2.5214)), (* H4' *) ( (6.1630), (6.4860), (~1.3440)), (* O4' *) ( (6.5400), (5.1200), (~1.4190)), (* C1' *) ( (7.2763), (4.9681), (~0.6297)), (* H1' *) ( (7.1940), (4.8830), (~2.7770)), (* C2' *) ( (6.8667), (3.9183), (~3.1647)), (* H2'' *) ( (8.5860), (5.0910), (~2.6140)), (* O2' *) ( (8.9510), (4.7626), (~1.7890)), (* H2' *) ( (6.5720), (6.0040), (~3.6090)), (* C3' *) ( (5.5636), (5.7066), (~3.8966)), (* H3' *) ( (7.3801), (6.3562), (~4.7350)), (* O3' *) ( (4.7150), (0.4910), (~0.1360)), (* N1 *) ( (6.3490), (2.1730), (~0.6020)), (* N3 *) ( (5.9530), (0.9650), (~0.2670)), (* C2 *) ( (5.2900), (2.9790), (~0.8260)), (* C4 *) ( (3.9720), (2.6390), (~0.7330)), (* C5 *) ( (3.6770), (1.3160), (~0.3660)), (* C6 *) (A ( ( (2.4280), (0.8450), (~0.2360)), (* N6 *) ( (3.1660), (3.7290), (~1.0360)), (* N7 *) ( (5.3170), (4.2990), (~1.1930)), (* N9 *) ( (4.0100), (4.6780), (~1.2990)), (* C8 *) ( (6.6890), (0.1903), (~0.0518)), (* H2 *) ( (1.6470), (1.4460), (~0.4040)), (* H61 *) ( (2.2780), (~0.1080), (~0.0280)), (* H62 *) ( (3.4421), (5.5744), (~1.5482))) (* H8 *) ) ) val rA01 = ( ( (~0.0043), (~0.8175), (0.5759), (* dgf-base-tfo *) (0.2617), (~0.5567), (~0.7884), (0.9651), (0.1473), (0.2164), (0.0359), (8.3929), (0.5532)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4352), (8.2183), (~2.7757)), (* C5' *) ( (5.3830), (8.7883), (~1.8481)), (* H5' *) ( (5.7729), (8.7436), (~3.6691)), (* H5'' *) ( (6.4830), (7.1518), (~2.5252)), (* C4' *) ( (7.4749), (7.5972), (~2.4482)), (* H4' *) ( (6.1626), (6.4620), (~1.2827)), (* O4' *) ( (6.5431), (5.0992), (~1.3905)), (* C1' *) ( (7.2871), (4.9328), (~0.6114)), (* H1' *) ( (7.1852), (4.8935), (~2.7592)), (* C2' *) ( (6.8573), (3.9363), (~3.1645)), (* H2'' *) ( (8.5780), (5.1025), (~2.6046)), (* O2' *) ( (8.9516), (4.7577), (~1.7902)), (* H2' *) ( (6.5522), (6.0300), (~3.5612)), (* C3' *) ( (5.5420), (5.7356), (~3.8459)), (* H3' *) ( (7.3487), (6.4089), (~4.6867)), (* O3' *) ( (4.7442), (0.4514), (~0.1390)), (* N1 *) ( (6.3687), (2.1459), (~0.5926)), (* N3 *) ( (5.9795), (0.9335), (~0.2657)), (* C2 *) ( (5.3052), (2.9471), (~0.8125)), (* C4 *) ( (3.9891), (2.5987), (~0.7230)), (* C5 *) ( (3.7016), (1.2717), (~0.3647)), (* C6 *) (A ( ( (2.4553), (0.7925), (~0.2390)), (* N6 *) ( (3.1770), (3.6859), (~1.0198)), (* N7 *) ( (5.3247), (4.2695), (~1.1710)), (* N9 *) ( (4.0156), (4.6415), (~1.2759)), (* C8 *) ( (6.7198), (0.1618), (~0.0547)), (* H2 *) ( (1.6709), (1.3900), (~0.4039)), (* H61 *) ( (2.3107), (~0.1627), (~0.0373)), (* H62 *) ( (3.4426), (5.5361), (~1.5199))) (* H8 *) ) ) val rA02 = ( ( (0.5566), (0.0449), (0.8296), (* dgf-base-tfo *) (0.5125), (0.7673), (~0.3854), (~0.6538), (0.6397), (0.4041), (~9.1161), (~3.7679), (~2.9968)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.5778), (6.6594), (~4.0364)), (* C5' *) ( (4.9220), (7.1963), (~4.9204)), (* H5' *) ( (3.7996), (5.9091), (~4.1764)), (* H5'' *) ( (5.7873), (5.8869), (~3.5482)), (* C4' *) ( (6.0405), (5.0875), (~4.2446)), (* H4' *) ( (6.9135), (6.8036), (~3.4310)), (* O4' *) ( (7.7293), (6.4084), (~2.3392)), (* C1' *) ( (8.7078), (6.1815), (~2.7624)), (* H1' *) ( (7.1305), (5.1418), (~1.7347)), (* C2' *) ( (7.2040), (5.1982), (~0.6486)), (* H2'' *) ( (7.7417), (4.0392), (~2.3813)), (* O2' *) ( (8.6785), (4.1443), (~2.5630)), (* H2' *) ( (5.6666), (5.2728), (~2.1536)), (* C3' *) ( (5.1747), (5.9805), (~1.4863)), (* H3' *) ( (4.9997), (4.0086), (~2.1973)), (* O3' *) ( (10.3245), (8.5459), (1.5467)), (* N1 *) ( (9.8051), (6.9432), (~0.1497)), (* N3 *) ( (10.5175), (7.4328), (0.8408)), (* C2 *) ( (8.7523), (7.7422), (~0.4228)), (* C4 *) ( (8.4257), (8.9060), (0.2099)), (* C5 *) ( (9.2665), (9.3242), (1.2540)), (* C6 *) (A ( ( (9.0664), (10.4462), (1.9610)), (* N6 *) ( (7.2750), (9.4537), (~0.3428)), (* N7 *) ( (7.7962), (7.5519), (~1.3859)), (* N9 *) ( (6.9479), (8.6157), (~1.2771)), (* C8 *) ( (11.4063), (6.9047), (1.1859)), (* H2 *) ( (8.2845), (11.0341), (1.7552)), (* H61 *) ( (9.6584), (10.6647), (2.7198)), (* H62 *) ( (6.0430), (8.9853), (~1.7594))) (* H8 *) ) ) val rA03 = ( ( (~0.5021), (0.0731), (0.8617), (* dgf-base-tfo *) (~0.8112), (0.3054), (~0.4986), (~0.2996), (~0.9494), (~0.0940), (6.4273), (~5.1944), (~3.7807)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.1214), (6.7116), (~1.9049)), (* C5' *) ( (3.3465), (5.9610), (~2.0607)), (* H5' *) ( (4.0789), (7.2928), (~0.9837)), (* H5'' *) ( (5.4170), (5.9293), (~1.8186)), (* C4' *) ( (5.4506), (5.3400), (~0.9023)), (* H4' *) ( (5.5067), (5.0417), (~2.9703)), (* O4' *) ( (6.8650), (4.9152), (~3.3612)), (* C1' *) ( (7.1090), (3.8577), (~3.2603)), (* H1' *) ( (7.7152), (5.7282), (~2.3894)), (* C2' *) ( (8.5029), (6.2356), (~2.9463)), (* H2'' *) ( (8.1036), (4.8568), (~1.3419)), (* O2' *) ( (8.3270), (3.9651), (~1.6184)), (* H2' *) ( (6.7003), (6.7565), (~1.8911)), (* C3' *) ( (6.5898), (7.5329), (~2.6482)), (* H3' *) ( (7.0505), (7.2878), (~0.6105)), (* O3' *) ( (9.6740), (4.7656), (~7.6614)), (* N1 *) ( (9.0739), (4.3013), (~5.3941)), (* N3 *) ( (9.8416), (4.2192), (~6.4581)), (* C2 *) ( (7.9885), (5.0632), (~5.6446)), (* C4 *) ( (7.6822), (5.6856), (~6.8194)), (* C5 *) ( (8.5831), (5.5215), (~7.8840)), (* C6 *) (A ( ( (8.4084), (6.0747), (~9.0933)), (* N6 *) ( (6.4857), (6.3816), (~6.7035)), (* N7 *) ( (6.9740), (5.3703), (~4.7760)), (* N9 *) ( (6.1133), (6.1613), (~5.4808)), (* C8 *) ( (10.7627), (3.6375), (~6.4220)), (* H2 *) ( (7.6031), (6.6390), (~9.2733)), (* H61 *) ( (9.1004), (5.9708), (~9.7893)), (* H62 *) ( (5.1705), (6.6830), (~5.3167))) (* H8 *) ) ) val rA04 = ( ( (~0.5426), (~0.8175), (0.1929), (* dgf-base-tfo *) (0.8304), (~0.5567), (~0.0237), (0.1267), (0.1473), (0.9809), (~0.5075), (8.3929), (0.2229)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4352), (8.2183), (~2.7757)), (* C5' *) ( (5.3830), (8.7883), (~1.8481)), (* H5' *) ( (5.7729), (8.7436), (~3.6691)), (* H5'' *) ( (6.4830), (7.1518), (~2.5252)), (* C4' *) ( (7.4749), (7.5972), (~2.4482)), (* H4' *) ( (6.1626), (6.4620), (~1.2827)), (* O4' *) ( (6.5431), (5.0992), (~1.3905)), (* C1' *) ( (7.2871), (4.9328), (~0.6114)), (* H1' *) ( (7.1852), (4.8935), (~2.7592)), (* C2' *) ( (6.8573), (3.9363), (~3.1645)), (* H2'' *) ( (8.5780), (5.1025), (~2.6046)), (* O2' *) ( (8.9516), (4.7577), (~1.7902)), (* H2' *) ( (6.5522), (6.0300), (~3.5612)), (* C3' *) ( (5.5420), (5.7356), (~3.8459)), (* H3' *) ( (7.3487), (6.4089), (~4.6867)), (* O3' *) ( (3.6343), (2.6680), (2.0783)), (* N1 *) ( (5.4505), (3.9805), (1.2446)), (* N3 *) ( (4.7540), (3.3816), (2.1851)), (* C2 *) ( (4.8805), (3.7951), (0.0354)), (* C4 *) ( (3.7416), (3.0925), (~0.2305)), (* C5 *) ( (3.0873), (2.4980), (0.8606)), (* C6 *) (A ( ( (1.9600), (1.7805), (0.7462)), (* N6 *) ( (3.4605), (3.1184), (~1.5906)), (* N7 *) ( (5.3247), (4.2695), (~1.1710)), (* N9 *) ( (4.4244), (3.8244), (~2.0953)), (* C8 *) ( (5.0814), (3.4352), (3.2234)), (* H2 *) ( (1.5423), (1.6454), (~0.1520)), (* H61 *) ( (1.5716), (1.3398), (1.5392)), (* H62 *) ( (4.2675), (3.8876), (~3.1721))) (* H8 *) ) ) val rA05 = ( ( (~0.5891), (0.0449), (0.8068), (* dgf-base-tfo *) (0.5375), (0.7673), (0.3498), (~0.6034), (0.6397), (~0.4762), (~0.3019), (~3.7679), (~9.5913)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.5778), (6.6594), (~4.0364)), (* C5' *) ( (4.9220), (7.1963), (~4.9204)), (* H5' *) ( (3.7996), (5.9091), (~4.1764)), (* H5'' *) ( (5.7873), (5.8869), (~3.5482)), (* C4' *) ( (6.0405), (5.0875), (~4.2446)), (* H4' *) ( (6.9135), (6.8036), (~3.4310)), (* O4' *) ( (7.7293), (6.4084), (~2.3392)), (* C1' *) ( (8.7078), (6.1815), (~2.7624)), (* H1' *) ( (7.1305), (5.1418), (~1.7347)), (* C2' *) ( (7.2040), (5.1982), (~0.6486)), (* H2'' *) ( (7.7417), (4.0392), (~2.3813)), (* O2' *) ( (8.6785), (4.1443), (~2.5630)), (* H2' *) ( (5.6666), (5.2728), (~2.1536)), (* C3' *) ( (5.1747), (5.9805), (~1.4863)), (* H3' *) ( (4.9997), (4.0086), (~2.1973)), (* O3' *) ( (10.2594), (10.6774), (~1.0056)), (* N1 *) ( (9.7528), (8.7080), (~2.2631)), (* N3 *) ( (10.4471), (9.7876), (~1.9791)), (* C2 *) ( (8.7271), (8.5575), (~1.3991)), (* C4 *) ( (8.4100), (9.3803), (~0.3580)), (* C5 *) ( (9.2294), (10.5030), (~0.1574)), (* C6 *) (A ( ( (9.0349), (11.3951), (0.8250)), (* N6 *) ( (7.2891), (8.9068), (0.3121)), (* N7 *) ( (7.7962), (7.5519), (~1.3859)), (* N9 *) ( (6.9702), (7.8292), (~0.3353)), (* C8 *) ( (11.3132), (10.0537), (~2.5851)), (* H2 *) ( (8.2741), (11.2784), (1.4629)), (* H61 *) ( (9.6733), (12.1368), (0.9529)), (* H62 *) ( (6.0888), (7.3990), (0.1403))) (* H8 *) ) ) val rA06 = ( ( (~0.9815), (0.0731), (~0.1772), (* dgf-base-tfo *) (0.1912), (0.3054), (~0.9328), (~0.0141), (~0.9494), (~0.3137), (5.7506), (~5.1944), (4.7470)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.1214), (6.7116), (~1.9049)), (* C5' *) ( (3.3465), (5.9610), (~2.0607)), (* H5' *) ( (4.0789), (7.2928), (~0.9837)), (* H5'' *) ( (5.4170), (5.9293), (~1.8186)), (* C4' *) ( (5.4506), (5.3400), (~0.9023)), (* H4' *) ( (5.5067), (5.0417), (~2.9703)), (* O4' *) ( (6.8650), (4.9152), (~3.3612)), (* C1' *) ( (7.1090), (3.8577), (~3.2603)), (* H1' *) ( (7.7152), (5.7282), (~2.3894)), (* C2' *) ( (8.5029), (6.2356), (~2.9463)), (* H2'' *) ( (8.1036), (4.8568), (~1.3419)), (* O2' *) ( (8.3270), (3.9651), (~1.6184)), (* H2' *) ( (6.7003), (6.7565), (~1.8911)), (* C3' *) ( (6.5898), (7.5329), (~2.6482)), (* H3' *) ( (7.0505), (7.2878), (~0.6105)), (* O3' *) ( (6.6624), (3.5061), (~8.2986)), (* N1 *) ( (6.5810), (3.2570), (~5.9221)), (* N3 *) ( (6.5151), (2.8263), (~7.1625)), (* C2 *) ( (6.8364), (4.5817), (~5.8882)), (* C4 *) ( (7.0116), (5.4064), (~6.9609)), (* C5 *) ( (6.9173), (4.8260), (~8.2361)), (* C6 *) (A ( ( (7.0668), (5.5163), (~9.3763)), (* N6 *) ( (7.2573), (6.7070), (~6.5394)), (* N7 *) ( (6.9740), (5.3703), (~4.7760)), (* N9 *) ( (7.2238), (6.6275), (~5.2453)), (* C8 *) ( (6.3146), (1.7741), (~7.3641)), (* H2 *) ( (7.2568), (6.4972), (~9.3456)), (* H61 *) ( (7.0437), (5.0478), (~10.2446)), (* H62 *) ( (7.4108), (7.6227), (~4.8418))) (* H8 *) ) ) val rA07 = ( ( (0.2379), (0.1310), (~0.9624), (* dgf-base-tfo *) (~0.5876), (~0.7696), (~0.2499), (~0.7734), (0.6249), (~0.1061), (30.9870), (~26.9344), (42.6416)), ( (0.7529), (0.1548), (0.6397), (* P-O3'-275-tfo *) (0.2952), (~0.9481), (~0.1180), (0.5882), (0.2777), (~0.7595), (~58.8919), (~11.3095), (6.0866)), ( (~0.0239), (0.9667), (~0.2546), (* P-O3'-180-tfo *) (0.9731), (~0.0359), (~0.2275), (~0.2290), (~0.2532), (~0.9399), (3.5401), (~29.7913), (52.2796)), ( (~0.8912), (~0.4531), (0.0242), (* P-O3'-60-tfo *) (~0.1183), (0.1805), (~0.9764), (0.4380), (~0.8730), (~0.2145), (19.9023), (54.8054), (15.2799)), ( (41.8210), (8.3880), (43.5890)), (* P *) ( (42.5400), (8.0450), (44.8330)), (* O1P *) ( (42.2470), (9.6920), (42.9910)), (* O2P *) ( (40.2550), (8.2030), (43.7340)), (* O5' *) ( (39.3505), (8.4697), (42.6565)), (* C5' *) ( (39.1377), (7.5433), (42.1230)), (* H5' *) ( (39.7203), (9.3119), (42.0717)), (* H5'' *) ( (38.0405), (8.9195), (43.2869)), (* C4' *) ( (37.3687), (9.3036), (42.5193)), (* H4' *) ( (37.4319), (7.8146), (43.9387)), (* O4' *) ( (37.1959), (8.1354), (45.3237)), (* C1' *) ( (36.1788), (8.5202), (45.3970)), (* H1' *) ( (38.1721), (9.2328), (45.6504)), (* C2' *) ( (39.1555), (8.7939), (45.8188)), (* H2'' *) ( (37.7862), (10.0617), (46.7013)), (* O2' *) ( (37.3087), (9.6229), (47.4092)), (* H2' *) ( (38.1844), (10.0268), (44.3367)), (* C3' *) ( (39.1578), (10.5054), (44.2289)), (* H3' *) ( (37.0547), (10.9127), (44.3441)), (* O3' *) ( (34.8811), (4.2072), (47.5784)), (* N1 *) ( (35.1084), (6.1336), (46.1818)), (* N3 *) ( (34.4108), (5.1360), (46.7207)), (* C2 *) ( (36.3908), (6.1224), (46.6053)), (* C4 *) ( (36.9819), (5.2334), (47.4697)), (* C5 *) ( (36.1786), (4.1985), (48.0035)), (* C6 *) (A ( ( (36.6103), (3.2749), (48.8452)), (* N6 *) ( (38.3236), (5.5522), (47.6595)), (* N7 *) ( (37.3887), (7.0024), (46.2437)), (* N9 *) ( (38.5055), (6.6096), (46.9057)), (* C8 *) ( (33.3553), (5.0152), (46.4771)), (* H2 *) ( (37.5730), (3.2804), (49.1507)), (* H61 *) ( (35.9775), (2.5638), (49.1828)), (* H62 *) ( (39.5461), (6.9184), (47.0041))) (* H8 *) ) ) val rA08 = ( ( (0.1084), (~0.0895), (~0.9901), (* dgf-base-tfo *) (0.9789), (~0.1638), (0.1220), (~0.1731), (~0.9824), (0.0698), (~2.9039), (47.2655), (33.0094)), ( (0.7529), (0.1548), (0.6397), (* P-O3'-275-tfo *) (0.2952), (~0.9481), (~0.1180), (0.5882), (0.2777), (~0.7595), (~58.8919), (~11.3095), (6.0866)), ( (~0.0239), (0.9667), (~0.2546), (* P-O3'-180-tfo *) (0.9731), (~0.0359), (~0.2275), (~0.2290), (~0.2532), (~0.9399), (3.5401), (~29.7913), (52.2796)), ( (~0.8912), (~0.4531), (0.0242), (* P-O3'-60-tfo *) (~0.1183), (0.1805), (~0.9764), (0.4380), (~0.8730), (~0.2145), (19.9023), (54.8054), (15.2799)), ( (41.8210), (8.3880), (43.5890)), (* P *) ( (42.5400), (8.0450), (44.8330)), (* O1P *) ( (42.2470), (9.6920), (42.9910)), (* O2P *) ( (40.2550), (8.2030), (43.7340)), (* O5' *) ( (39.4850), (8.9301), (44.6977)), (* C5' *) ( (39.0638), (9.8199), (44.2296)), (* H5' *) ( (40.0757), (9.0713), (45.6029)), (* H5'' *) ( (38.3102), (8.0414), (45.0789)), (* C4' *) ( (37.7842), (8.4637), (45.9351)), (* H4' *) ( (37.4200), (7.9453), (43.9769)), (* O4' *) ( (37.2249), (6.5609), (43.6273)), (* C1' *) ( (36.3360), (6.2168), (44.1561)), (* H1' *) ( (38.4347), (5.8414), (44.1590)), (* C2' *) ( (39.2688), (5.9974), (43.4749)), (* H2'' *) ( (38.2344), (4.4907), (44.4348)), (* O2' *) ( (37.6374), (4.0386), (43.8341)), (* H2' *) ( (38.6926), (6.6079), (45.4637)), (* C3' *) ( (39.7585), (6.5640), (45.6877)), (* H3' *) ( (37.8238), (6.0705), (46.4723)), (* O3' *) ( (33.9162), (6.2598), (39.7758)), (* N1 *) ( (34.6709), (6.5759), (42.0215)), (* N3 *) ( (33.7257), (6.5186), (41.0858)), (* C2 *) ( (35.8935), (6.3324), (41.5018)), (* C4 *) ( (36.2105), (6.0601), (40.1932)), (* C5 *) ( (35.1538), (6.0151), (39.2537)), (* C6 *) (A ( ( (35.3088), (5.7642), (37.9649)), (* N6 *) ( (37.5818), (5.8677), (40.0507)), (* N7 *) ( (37.0932), (6.3197), (42.1810)), (* N9 *) ( (38.0509), (6.0354), (41.2635)), (* C8 *) ( (32.6830), (6.6898), (41.3532)), (* H2 *) ( (36.2305), (5.5855), (37.5925)), (* H61 *) ( (34.5056), (5.7512), (37.3528)), (* H62 *) ( (39.1318), (5.8993), (41.2285))) (* H8 *) ) ) val rA09 = ( ( (0.8467), (0.4166), (~0.3311), (* dgf-base-tfo *) (~0.3962), (0.9089), (0.1303), (0.3552), (0.0209), (0.9346), (~42.7319), (~26.6223), (~29.8163)), ( (0.7529), (0.1548), (0.6397), (* P-O3'-275-tfo *) (0.2952), (~0.9481), (~0.1180), (0.5882), (0.2777), (~0.7595), (~58.8919), (~11.3095), (6.0866)), ( (~0.0239), (0.9667), (~0.2546), (* P-O3'-180-tfo *) (0.9731), (~0.0359), (~0.2275), (~0.2290), (~0.2532), (~0.9399), (3.5401), (~29.7913), (52.2796)), ( (~0.8912), (~0.4531), (0.0242), (* P-O3'-60-tfo *) (~0.1183), (0.1805), (~0.9764), (0.4380), (~0.8730), (~0.2145), (19.9023), (54.8054), (15.2799)), ( (41.8210), (8.3880), (43.5890)), (* P *) ( (42.5400), (8.0450), (44.8330)), (* O1P *) ( (42.2470), (9.6920), (42.9910)), (* O2P *) ( (40.2550), (8.2030), (43.7340)), (* O5' *) ( (39.3505), (8.4697), (42.6565)), (* C5' *) ( (39.1377), (7.5433), (42.1230)), (* H5' *) ( (39.7203), (9.3119), (42.0717)), (* H5'' *) ( (38.0405), (8.9195), (43.2869)), (* C4' *) ( (37.6479), (8.1347), (43.9335)), (* H4' *) ( (38.2691), (10.0933), (44.0524)), (* O4' *) ( (37.3999), (11.1488), (43.5973)), (* C1' *) ( (36.5061), (11.1221), (44.2206)), (* H1' *) ( (37.0364), (10.7838), (42.1836)), (* C2' *) ( (37.8636), (11.0489), (41.5252)), (* H2'' *) ( (35.8275), (11.3133), (41.7379)), (* O2' *) ( (35.6214), (12.1896), (42.0714)), (* H2' *) ( (36.9316), (9.2556), (42.2837)), (* C3' *) ( (37.1778), (8.8260), (41.3127)), (* H3' *) ( (35.6285), (8.9334), (42.7926)), (* O3' *) ( (38.1482), (15.2833), (46.4641)), (* N1 *) ( (37.3641), (13.0968), (45.9007)), (* N3 *) ( (37.5032), (14.1288), (46.7300)), (* C2 *) ( (37.9570), (13.3377), (44.7113)), (* C4 *) ( (38.6397), (14.4660), (44.3267)), (* C5 *) ( (38.7473), (15.5229), (45.2609)), (* C6 *) (A ( ( (39.3720), (16.6649), (45.0297)), (* N6 *) ( (39.1079), (14.3351), (43.0223)), (* N7 *) ( (38.0132), (12.4868), (43.6280)), (* N9 *) ( (38.7058), (13.1402), (42.6620)), (* C8 *) ( (37.0731), (14.0857), (47.7306)), (* H2 *) ( (39.8113), (16.8281), (44.1350)), (* H61 *) ( (39.4100), (17.3741), (45.7478)), (* H62 *) ( (39.0412), (12.9660), (41.6397))) (* H8 *) ) ) val rA10 = ( ( (0.7063), (0.6317), (~0.3196), (* dgf-base-tfo *) (~0.0403), (~0.4149), (~0.9090), (~0.7068), (0.6549), (~0.2676), (6.4402), (~52.1496), (30.8246)), ( (0.7529), (0.1548), (0.6397), (* P-O3'-275-tfo *) (0.2952), (~0.9481), (~0.1180), (0.5882), (0.2777), (~0.7595), (~58.8919), (~11.3095), (6.0866)), ( (~0.0239), (0.9667), (~0.2546), (* P-O3'-180-tfo *) (0.9731), (~0.0359), (~0.2275), (~0.2290), (~0.2532), (~0.9399), (3.5401), (~29.7913), (52.2796)), ( (~0.8912), (~0.4531), (0.0242), (* P-O3'-60-tfo *) (~0.1183), (0.1805), (~0.9764), (0.4380), (~0.8730), (~0.2145), (19.9023), (54.8054), (15.2799)), ( (41.8210), (8.3880), (43.5890)), (* P *) ( (42.5400), (8.0450), (44.8330)), (* O1P *) ( (42.2470), (9.6920), (42.9910)), (* O2P *) ( (40.2550), (8.2030), (43.7340)), (* O5' *) ( (39.4850), (8.9301), (44.6977)), (* C5' *) ( (39.0638), (9.8199), (44.2296)), (* H5' *) ( (40.0757), (9.0713), (45.6029)), (* H5'' *) ( (38.3102), (8.0414), (45.0789)), (* C4' *) ( (37.7099), (7.8166), (44.1973)), (* H4' *) ( (38.8012), (6.8321), (45.6380)), (* O4' *) ( (38.2431), (6.6413), (46.9529)), (* C1' *) ( (37.3505), (6.0262), (46.8385)), (* H1' *) ( (37.8484), (8.0156), (47.4214)), (* C2' *) ( (38.7381), (8.5406), (47.7690)), (* H2'' *) ( (36.8286), (8.0368), (48.3701)), (* O2' *) ( (36.8392), (7.3063), (48.9929)), (* H2' *) ( (37.3576), (8.6512), (46.1132)), (* C3' *) ( (37.5207), (9.7275), (46.1671)), (* H3' *) ( (35.9985), (8.2392), (45.9032)), (* O3' *) ( (39.9117), (2.2278), (48.8527)), (* N1 *) ( (38.6207), (3.6941), (47.4757)), (* N3 *) ( (38.9872), (2.4888), (47.9057)), (* C2 *) ( (39.2961), (4.6720), (48.1174)), (* C4 *) ( (40.2546), (4.5307), (49.0912)), (* C5 *) ( (40.5932), (3.2189), (49.4985)), (* C6 *) (A ( ( (41.4938), (2.9317), (50.4229)), (* N6 *) ( (40.7195), (5.7755), (49.5060)), (* N7 *) ( (39.1730), (6.0305), (47.9170)), (* N9 *) ( (40.0413), (6.6250), (48.7728)), (* C8 *) ( (38.5257), (1.5960), (47.4838)), (* H2 *) ( (41.9907), (3.6753), (50.8921)), (* H61 *) ( (41.6848), (1.9687), (50.6599)), (* H62 *) ( (40.3571), (7.6321), (49.0452))) (* H8 *) ) ) val rAs = [rA01,rA02,rA03,rA04,rA05,rA06,rA07,rA08,rA09,rA10] val rC = ( ( (~0.0359), (~0.8071), (0.5894), (* dgf-base-tfo *) (~0.2669), (0.5761), (0.7726), (~0.9631), (~0.1296), (~0.2361), (0.1584), (8.3434), (0.5434)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2430), (~8.2420), (2.8260)), (* C5' *) ( (5.1974), (~8.8497), (1.9223)), (* H5' *) ( (5.5548), (~8.7348), (3.7469)), (* H5'' *) ( (6.3140), (~7.2060), (2.5510)), (* C4' *) ( (7.2954), (~7.6762), (2.4898)), (* H4' *) ( (6.0140), (~6.5420), (1.2890)), (* O4' *) ( (6.4190), (~5.1840), (1.3620)), (* C1' *) ( (7.1608), (~5.0495), (0.5747)), (* H1' *) ( (7.0760), (~4.9560), (2.7270)), (* C2' *) ( (6.7770), (~3.9803), (3.1099)), (* H2'' *) ( (8.4500), (~5.1930), (2.5810)), (* O2' *) ( (8.8309), (~4.8755), (1.7590)), (* H2' *) ( (6.4060), (~6.0590), (3.5580)), (* C3' *) ( (5.4021), (~5.7313), (3.8281)), (* H3' *) ( (7.1570), (~6.4240), (4.7070)), (* O3' *) ( (5.2170), (~4.3260), (1.1690)), (* N1 *) ( (4.2960), (~2.2560), (0.6290)), (* N3 *) ( (5.4330), (~3.0200), (0.7990)), (* C2 *) ( (2.9930), (~2.6780), (0.7940)), (* C4 *) ( (2.8670), (~4.0630), (1.1830)), (* C5 *) ( (3.9570), (~4.8300), (1.3550)), (* C6 *) (C ( ( (2.0187), (~1.8047), (0.5874)), (* N4 *) ( (6.5470), (~2.5560), (0.6290)), (* O2 *) ( (1.0684), (~2.1236), (0.7109)), (* H41 *) ( (2.2344), (~0.8560), (0.3162)), (* H42 *) ( (1.8797), (~4.4972), (1.3404)), (* H5 *) ( (3.8479), (~5.8742), (1.6480))) (* H6 *) ) ) val rC01 = ( ( (~0.0137), (~0.8012), (0.5983), (* dgf-base-tfo *) (~0.2523), (0.5817), (0.7733), (~0.9675), (~0.1404), (~0.2101), (0.2031), (8.3874), (0.4228)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2416), (~8.2422), (2.8181)), (* C5' *) ( (5.2050), (~8.8128), (1.8901)), (* H5' *) ( (5.5368), (~8.7738), (3.7227)), (* H5'' *) ( (6.3232), (~7.2037), (2.6002)), (* C4' *) ( (7.3048), (~7.6757), (2.5577)), (* H4' *) ( (6.0635), (~6.5092), (1.3456)), (* O4' *) ( (6.4697), (~5.1547), (1.4629)), (* C1' *) ( (7.2354), (~5.0043), (0.7018)), (* H1' *) ( (7.0856), (~4.9610), (2.8521)), (* C2' *) ( (6.7777), (~3.9935), (3.2487)), (* H2'' *) ( (8.4627), (~5.1992), (2.7423)), (* O2' *) ( (8.8693), (~4.8638), (1.9399)), (* H2' *) ( (6.3877), (~6.0809), (3.6362)), (* C3' *) ( (5.3770), (~5.7562), (3.8834)), (* H3' *) ( (7.1024), (~6.4754), (4.7985)), (* O3' *) ( (5.2764), (~4.2883), (1.2538)), (* N1 *) ( (4.3777), (~2.2062), (0.7229)), (* N3 *) ( (5.5069), (~2.9779), (0.9088)), (* C2 *) ( (3.0693), (~2.6246), (0.8500)), (* C4 *) ( (2.9279), (~4.0146), (1.2149)), (* C5 *) ( (4.0101), (~4.7892), (1.4017)), (* C6 *) (C ( ( (2.1040), (~1.7437), (0.6331)), (* N4 *) ( (6.6267), (~2.5166), (0.7728)), (* O2 *) ( (1.1496), (~2.0600), (0.7287)), (* H41 *) ( (2.3303), (~0.7921), (0.3815)), (* H42 *) ( (1.9353), (~4.4465), (1.3419)), (* H5 *) ( (3.8895), (~5.8371), (1.6762))) (* H6 *) ) ) val rC02 = ( ( (0.5141), (0.0246), (0.8574), (* dgf-base-tfo *) (~0.5547), (~0.7529), (0.3542), (0.6542), (~0.6577), (~0.3734), (~9.1111), (~3.4598), (~3.2939)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (4.3825), (~6.6585), (4.0489)), (* C5' *) ( (4.6841), (~7.2019), (4.9443)), (* H5' *) ( (3.6189), (~5.8889), (4.1625)), (* H5'' *) ( (5.6255), (~5.9175), (3.5998)), (* C4' *) ( (5.8732), (~5.1228), (4.3034)), (* H4' *) ( (6.7337), (~6.8605), (3.5222)), (* O4' *) ( (7.5932), (~6.4923), (2.4548)), (* C1' *) ( (8.5661), (~6.2983), (2.9064)), (* H1' *) ( (7.0527), (~5.2012), (1.8322)), (* C2' *) ( (7.1627), (~5.2525), (0.7490)), (* H2'' *) ( (7.6666), (~4.1249), (2.4880)), (* O2' *) ( (8.5944), (~4.2543), (2.6981)), (* H2' *) ( (5.5661), (~5.3029), (2.2009)), (* C3' *) ( (5.0841), (~6.0018), (1.5172)), (* H3' *) ( (4.9062), (~4.0452), (2.2042)), (* O3' *) ( (7.6298), (~7.6136), (1.4752)), (* N1 *) ( (8.6945), (~8.7046), (~0.2857)), (* N3 *) ( (8.6943), (~7.6514), (0.6066)), (* C2 *) ( (7.7426), (~9.6987), (~0.3801)), (* C4 *) ( (6.6642), (~9.5742), (0.5722)), (* C5 *) ( (6.6391), (~8.5592), (1.4526)), (* C6 *) (C ( ( (7.9033), (~10.6371), (~1.3010)), (* N4 *) ( (9.5840), (~6.8186), (0.6136)), (* O2 *) ( (7.2009), (~11.3604), (~1.3619)), (* H41 *) ( (8.7058), (~10.6168), (~1.9140)), (* H42 *) ( (5.8585), (~10.3083), (0.5822)), (* H5 *) ( (5.8197), (~8.4773), (2.1667))) (* H6 *) ) ) val rC03 = ( ( (~0.4993), (0.0476), (0.8651), (* dgf-base-tfo *) (0.8078), (~0.3353), (0.4847), (0.3132), (0.9409), (0.1290), (6.2989), (~5.2303), (~3.8577)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (3.9938), (~6.7042), (1.9023)), (* C5' *) ( (3.2332), (~5.9343), (2.0319)), (* H5' *) ( (3.9666), (~7.2863), (0.9812)), (* H5'' *) ( (5.3098), (~5.9546), (1.8564)), (* C4' *) ( (5.3863), (~5.3702), (0.9395)), (* H4' *) ( (5.3851), (~5.0642), (3.0076)), (* O4' *) ( (6.7315), (~4.9724), (3.4462)), (* C1' *) ( (7.0033), (~3.9202), (3.3619)), (* H1' *) ( (7.5997), (~5.8018), (2.4948)), (* C2' *) ( (8.3627), (~6.3254), (3.0707)), (* H2'' *) ( (8.0410), (~4.9501), (1.4724)), (* O2' *) ( (8.2781), (~4.0644), (1.7570)), (* H2' *) ( (6.5701), (~6.8129), (1.9714)), (* C3' *) ( (6.4186), (~7.5809), (2.7299)), (* H3' *) ( (6.9357), (~7.3841), (0.7235)), (* O3' *) ( (6.8024), (~5.4718), (4.8475)), (* N1 *) ( (7.9218), (~5.5700), (6.8877)), (* N3 *) ( (7.8908), (~5.0886), (5.5944)), (* C2 *) ( (6.9789), (~6.3827), (7.4823)), (* C4 *) ( (5.8742), (~6.7319), (6.6202)), (* C5 *) ( (5.8182), (~6.2769), (5.3570)), (* C6 *) (C ( ( (7.1702), (~6.7511), (8.7402)), (* N4 *) ( (8.7747), (~4.3728), (5.1568)), (* O2 *) ( (6.4741), (~7.3461), (9.1662)), (* H41 *) ( (7.9889), (~6.4396), (9.2429)), (* H42 *) ( (5.0736), (~7.3713), (6.9922)), (* H5 *) ( (4.9784), (~6.5473), (4.7170))) (* H6 *) ) ) val rC04 = ( ( (~0.5669), (~0.8012), (0.1918), (* dgf-base-tfo *) (~0.8129), (0.5817), (0.0273), (~0.1334), (~0.1404), (~0.9811), (~0.3279), (8.3874), (0.3355)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2416), (~8.2422), (2.8181)), (* C5' *) ( (5.2050), (~8.8128), (1.8901)), (* H5' *) ( (5.5368), (~8.7738), (3.7227)), (* H5'' *) ( (6.3232), (~7.2037), (2.6002)), (* C4' *) ( (7.3048), (~7.6757), (2.5577)), (* H4' *) ( (6.0635), (~6.5092), (1.3456)), (* O4' *) ( (6.4697), (~5.1547), (1.4629)), (* C1' *) ( (7.2354), (~5.0043), (0.7018)), (* H1' *) ( (7.0856), (~4.9610), (2.8521)), (* C2' *) ( (6.7777), (~3.9935), (3.2487)), (* H2'' *) ( (8.4627), (~5.1992), (2.7423)), (* O2' *) ( (8.8693), (~4.8638), (1.9399)), (* H2' *) ( (6.3877), (~6.0809), (3.6362)), (* C3' *) ( (5.3770), (~5.7562), (3.8834)), (* H3' *) ( (7.1024), (~6.4754), (4.7985)), (* O3' *) ( (5.2764), (~4.2883), (1.2538)), (* N1 *) ( (3.8961), (~3.0896), (~0.1893)), (* N3 *) ( (5.0095), (~3.8907), (~0.0346)), (* C2 *) ( (3.0480), (~2.6632), (0.8116)), (* C4 *) ( (3.4093), (~3.1310), (2.1292)), (* C5 *) ( (4.4878), (~3.9124), (2.3088)), (* C6 *) (C ( ( (2.0216), (~1.8941), (0.4804)), (* N4 *) ( (5.7005), (~4.2164), (~0.9842)), (* O2 *) ( (1.4067), (~1.5873), (1.2205)), (* H41 *) ( (1.8721), (~1.6319), (~0.4835)), (* H42 *) ( (2.8048), (~2.8507), (2.9918)), (* H5 *) ( (4.7491), (~4.2593), (3.3085))) (* H6 *) ) ) val rC05 = ( ( (~0.6298), (0.0246), (0.7763), (* dgf-base-tfo *) (~0.5226), (~0.7529), (~0.4001), (0.5746), (~0.6577), (0.4870), (~0.0208), (~3.4598), (~9.6882)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (4.3825), (~6.6585), (4.0489)), (* C5' *) ( (4.6841), (~7.2019), (4.9443)), (* H5' *) ( (3.6189), (~5.8889), (4.1625)), (* H5'' *) ( (5.6255), (~5.9175), (3.5998)), (* C4' *) ( (5.8732), (~5.1228), (4.3034)), (* H4' *) ( (6.7337), (~6.8605), (3.5222)), (* O4' *) ( (7.5932), (~6.4923), (2.4548)), (* C1' *) ( (8.5661), (~6.2983), (2.9064)), (* H1' *) ( (7.0527), (~5.2012), (1.8322)), (* C2' *) ( (7.1627), (~5.2525), (0.7490)), (* H2'' *) ( (7.6666), (~4.1249), (2.4880)), (* O2' *) ( (8.5944), (~4.2543), (2.6981)), (* H2' *) ( (5.5661), (~5.3029), (2.2009)), (* C3' *) ( (5.0841), (~6.0018), (1.5172)), (* H3' *) ( (4.9062), (~4.0452), (2.2042)), (* O3' *) ( (7.6298), (~7.6136), (1.4752)), (* N1 *) ( (8.5977), (~9.5977), (0.7329)), (* N3 *) ( (8.5951), (~8.5745), (1.6594)), (* C2 *) ( (7.7372), (~9.7371), (~0.3364)), (* C4 *) ( (6.7596), (~8.6801), (~0.4476)), (* C5 *) ( (6.7338), (~7.6721), (0.4408)), (* C6 *) (C ( ( (7.8849), (~10.7881), (~1.1289)), (* N4 *) ( (9.3993), (~8.5377), (2.5743)), (* O2 *) ( (7.2499), (~10.8809), (~1.9088)), (* H41 *) ( (8.6122), (~11.4649), (~0.9468)), (* H42 *) ( (6.0317), (~8.6941), (~1.2588)), (* H5 *) ( (5.9901), (~6.8809), (0.3459))) (* H6 *) ) ) val rC06 = ( ( (~0.9837), (0.0476), (~0.1733), (* dgf-base-tfo *) (~0.1792), (~0.3353), (0.9249), (~0.0141), (0.9409), (0.3384), (5.7793), (~5.2303), (4.5997)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (3.9938), (~6.7042), (1.9023)), (* C5' *) ( (3.2332), (~5.9343), (2.0319)), (* H5' *) ( (3.9666), (~7.2863), (0.9812)), (* H5'' *) ( (5.3098), (~5.9546), (1.8564)), (* C4' *) ( (5.3863), (~5.3702), (0.9395)), (* H4' *) ( (5.3851), (~5.0642), (3.0076)), (* O4' *) ( (6.7315), (~4.9724), (3.4462)), (* C1' *) ( (7.0033), (~3.9202), (3.3619)), (* H1' *) ( (7.5997), (~5.8018), (2.4948)), (* C2' *) ( (8.3627), (~6.3254), (3.0707)), (* H2'' *) ( (8.0410), (~4.9501), (1.4724)), (* O2' *) ( (8.2781), (~4.0644), (1.7570)), (* H2' *) ( (6.5701), (~6.8129), (1.9714)), (* C3' *) ( (6.4186), (~7.5809), (2.7299)), (* H3' *) ( (6.9357), (~7.3841), (0.7235)), (* O3' *) ( (6.8024), (~5.4718), (4.8475)), (* N1 *) ( (6.6920), (~5.0495), (7.1354)), (* N3 *) ( (6.6201), (~4.5500), (5.8506)), (* C2 *) ( (6.9254), (~6.3614), (7.4926)), (* C4 *) ( (7.1046), (~7.2543), (6.3718)), (* C5 *) ( (7.0391), (~6.7951), (5.1106)), (* C6 *) (C ( ( (6.9614), (~6.6648), (8.7815)), (* N4 *) ( (6.4083), (~3.3696), (5.6340)), (* O2 *) ( (7.1329), (~7.6280), (9.0324)), (* H41 *) ( (6.8204), (~5.9469), (9.4777)), (* H42 *) ( (7.2954), (~8.3135), (6.5440)), (* H5 *) ( (7.1753), (~7.4798), (4.2735))) (* H6 *) ) ) val rC07 = ( ( (0.0033), (0.2720), (~0.9623), (* dgf-base-tfo *) (0.3013), (~0.9179), (~0.2584), (~0.9535), (~0.2891), (~0.0850), (43.0403), (13.7233), (34.5710)), ( (0.9187), (0.2887), (0.2694), (* P-O3'-275-tfo *) (0.0302), (~0.7316), (0.6811), (0.3938), (~0.6176), (~0.6808), (~48.4330), (26.3254), (13.6383)), ( (~0.1504), (0.7744), (~0.6145), (* P-O3'-180-tfo *) (0.7581), (0.4893), (0.4311), (0.6345), (~0.4010), (~0.6607), (~31.9784), (~13.4285), (44.9650)), ( (~0.6236), (~0.7810), (~0.0337), (* P-O3'-60-tfo *) (~0.6890), (0.5694), (~0.4484), (0.3694), (~0.2564), (~0.8932), (12.1105), (30.8774), (46.0946)), ( (33.3400), (11.0980), (46.1750)), (* P *) ( (34.5130), (10.2320), (46.4660)), (* O1P *) ( (33.4130), (12.3960), (46.9340)), (* O2P *) ( (31.9810), (10.3390), (46.4820)), (* O5' *) ( (30.8152), (11.1619), (46.2003)), (* C5' *) ( (30.4519), (10.9454), (45.1957)), (* H5' *) ( (31.0379), (12.2016), (46.4400)), (* H5'' *) ( (29.7081), (10.7448), (47.1428)), (* C4' *) ( (28.8710), (11.4416), (47.0982)), (* H4' *) ( (29.2550), (9.4394), (46.8162)), (* O4' *) ( (29.3907), (8.5625), (47.9460)), (* C1' *) ( (28.4416), (8.5669), (48.4819)), (* H1' *) ( (30.4468), (9.2031), (48.7952)), (* C2' *) ( (31.4222), (8.9651), (48.3709)), (* H2'' *) ( (30.3701), (8.9157), (50.1624)), (* O2' *) ( (30.0652), (8.0304), (50.3740)), (* H2' *) ( (30.1622), (10.6879), (48.6120)), (* C3' *) ( (31.0952), (11.2399), (48.7254)), (* H3' *) ( (29.1076), (11.1535), (49.4702)), (* O3' *) ( (29.7883), (7.2209), (47.5235)), (* N1 *) ( (29.1825), (5.0438), (46.8275)), (* N3 *) ( (28.8008), (6.2912), (47.2263)), (* C2 *) ( (30.4888), (4.6890), (46.7186)), (* C4 *) ( (31.5034), (5.6405), (47.0249)), (* C5 *) ( (31.1091), (6.8691), (47.4156)), (* C6 *) (C ( ( (30.8109), (3.4584), (46.3336)), (* N4 *) ( (27.6171), (6.5989), (47.3189)), (* O2 *) ( (31.7923), (3.2301), (46.2638)), (* H41 *) ( (30.0880), (2.7857), (46.1215)), (* H42 *) ( (32.5542), (5.3634), (46.9395)), (* H5 *) ( (31.8523), (7.6279), (47.6603))) (* H6 *) ) ) val rC08 = ( ( (0.0797), (~0.6026), (~0.7941), (* dgf-base-tfo *) (0.7939), (0.5201), (~0.3150), (0.6028), (~0.6054), (0.5198), (~36.8341), (41.5293), (1.6628)), ( (0.9187), (0.2887), (0.2694), (* P-O3'-275-tfo *) (0.0302), (~0.7316), (0.6811), (0.3938), (~0.6176), (~0.6808), (~48.4330), (26.3254), (13.6383)), ( (~0.1504), (0.7744), (~0.6145), (* P-O3'-180-tfo *) (0.7581), (0.4893), (0.4311), (0.6345), (~0.4010), (~0.6607), (~31.9784), (~13.4285), (44.9650)), ( (~0.6236), (~0.7810), (~0.0337), (* P-O3'-60-tfo *) (~0.6890), (0.5694), (~0.4484), (0.3694), (~0.2564), (~0.8932), (12.1105), (30.8774), (46.0946)), ( (33.3400), (11.0980), (46.1750)), (* P *) ( (34.5130), (10.2320), (46.4660)), (* O1P *) ( (33.4130), (12.3960), (46.9340)), (* O2P *) ( (31.9810), (10.3390), (46.4820)), (* O5' *) ( (31.8779), (9.9369), (47.8760)), (* C5' *) ( (31.3239), (10.6931), (48.4322)), (* H5' *) ( (32.8647), (9.6624), (48.2489)), (* H5'' *) ( (31.0429), (8.6773), (47.9401)), (* C4' *) ( (31.0779), (8.2331), (48.9349)), (* H4' *) ( (29.6956), (8.9669), (47.5983)), (* O4' *) ( (29.2784), (8.1700), (46.4782)), (* C1' *) ( (28.8006), (7.2731), (46.8722)), (* H1' *) ( (30.5544), (7.7940), (45.7875)), (* C2' *) ( (30.8837), (8.6410), (45.1856)), (* H2'' *) ( (30.5100), (6.6007), (45.0582)), (* O2' *) ( (29.6694), (6.4168), (44.6326)), (* H2' *) ( (31.5146), (7.5954), (46.9527)), (* C3' *) ( (32.5255), (7.8261), (46.6166)), (* H3' *) ( (31.3876), (6.2951), (47.5516)), (* O3' *) ( (28.3976), (8.9302), (45.5933)), (* N1 *) ( (26.2155), (9.6135), (44.9910)), (* N3 *) ( (27.0281), (8.8961), (45.8192)), (* C2 *) ( (26.7044), (10.3489), (43.9595)), (* C4 *) ( (28.1088), (10.3837), (43.7247)), (* C5 *) ( (28.8978), (9.6708), (44.5535)), (* C6 *) (C ( ( (25.8715), (11.0249), (43.1749)), (* N4 *) ( (26.5733), (8.2371), (46.7484)), (* O2 *) ( (26.2707), (11.5609), (42.4177)), (* H41 *) ( (24.8760), (10.9939), (43.3427)), (* H42 *) ( (28.5089), (10.9722), (42.8990)), (* H5 *) ( (29.9782), (9.6687), (44.4097))) (* H6 *) ) ) val rC09 = ( ( (0.8727), (0.4760), (~0.1091), (* dgf-base-tfo *) (~0.4188), (0.6148), (~0.6682), (~0.2510), (0.6289), (0.7359), (~8.1687), (~52.0761), (~25.0726)), ( (0.9187), (0.2887), (0.2694), (* P-O3'-275-tfo *) (0.0302), (~0.7316), (0.6811), (0.3938), (~0.6176), (~0.6808), (~48.4330), (26.3254), (13.6383)), ( (~0.1504), (0.7744), (~0.6145), (* P-O3'-180-tfo *) (0.7581), (0.4893), (0.4311), (0.6345), (~0.4010), (~0.6607), (~31.9784), (~13.4285), (44.9650)), ( (~0.6236), (~0.7810), (~0.0337), (* P-O3'-60-tfo *) (~0.6890), (0.5694), (~0.4484), (0.3694), (~0.2564), (~0.8932), (12.1105), (30.8774), (46.0946)), ( (33.3400), (11.0980), (46.1750)), (* P *) ( (34.5130), (10.2320), (46.4660)), (* O1P *) ( (33.4130), (12.3960), (46.9340)), (* O2P *) ( (31.9810), (10.3390), (46.4820)), (* O5' *) ( (30.8152), (11.1619), (46.2003)), (* C5' *) ( (30.4519), (10.9454), (45.1957)), (* H5' *) ( (31.0379), (12.2016), (46.4400)), (* H5'' *) ( (29.7081), (10.7448), (47.1428)), (* C4' *) ( (29.4506), (9.6945), (47.0059)), (* H4' *) ( (30.1045), (10.9634), (48.4885)), (* O4' *) ( (29.1794), (11.8418), (49.1490)), (* C1' *) ( (28.4388), (11.2210), (49.6533)), (* H1' *) ( (28.5211), (12.6008), (48.0367)), (* C2' *) ( (29.1947), (13.3949), (47.7147)), (* H2'' *) ( (27.2316), (13.0683), (48.3134)), (* O2' *) ( (27.0851), (13.3391), (49.2227)), (* H2' *) ( (28.4131), (11.5507), (46.9391)), (* C3' *) ( (28.4451), (12.0512), (45.9713)), (* H3' *) ( (27.2707), (10.6955), (47.1097)), (* O3' *) ( (29.8751), (12.7405), (50.0682)), (* N1 *) ( (30.7172), (13.1841), (52.2328)), (* N3 *) ( (30.0617), (12.3404), (51.3847)), (* C2 *) ( (31.1834), (14.3941), (51.8297)), (* C4 *) ( (30.9913), (14.8074), (50.4803)), (* C5 *) ( (30.3434), (13.9610), (49.6548)), (* C6 *) (C ( ( (31.8090), (15.1847), (52.6957)), (* N4 *) ( (29.6470), (11.2494), (51.7616)), (* O2 *) ( (32.1422), (16.0774), (52.3606)), (* H41 *) ( (31.9392), (14.8893), (53.6527)), (* H42 *) ( (31.3632), (15.7771), (50.1491)), (* H5 *) ( (30.1742), (14.2374), (48.6141))) (* H6 *) ) ) val rC10 = ( ( (0.1549), (0.8710), (~0.4663), (* dgf-base-tfo *) (0.6768), (~0.4374), (~0.5921), (~0.7197), (~0.2239), (~0.6572), (25.2447), (~14.1920), (50.3201)), ( (0.9187), (0.2887), (0.2694), (* P-O3'-275-tfo *) (0.0302), (~0.7316), (0.6811), (0.3938), (~0.6176), (~0.6808), (~48.4330), (26.3254), (13.6383)), ( (~0.1504), (0.7744), (~0.6145), (* P-O3'-180-tfo *) (0.7581), (0.4893), (0.4311), (0.6345), (~0.4010), (~0.6607), (~31.9784), (~13.4285), (44.9650)), ( (~0.6236), (~0.7810), (~0.0337), (* P-O3'-60-tfo *) (~0.6890), (0.5694), (~0.4484), (0.3694), (~0.2564), (~0.8932), (12.1105), (30.8774), (46.0946)), ( (33.3400), (11.0980), (46.1750)), (* P *) ( (34.5130), (10.2320), (46.4660)), (* O1P *) ( (33.4130), (12.3960), (46.9340)), (* O2P *) ( (31.9810), (10.3390), (46.4820)), (* O5' *) ( (31.8779), (9.9369), (47.8760)), (* C5' *) ( (31.3239), (10.6931), (48.4322)), (* H5' *) ( (32.8647), (9.6624), (48.2489)), (* H5'' *) ( (31.0429), (8.6773), (47.9401)), (* C4' *) ( (30.0440), (8.8473), (47.5383)), (* H4' *) ( (31.6749), (7.6351), (47.2119)), (* O4' *) ( (31.9159), (6.5022), (48.0616)), (* C1' *) ( (31.0691), (5.8243), (47.9544)), (* H1' *) ( (31.9300), (7.0685), (49.4493)), (* C2' *) ( (32.9024), (7.5288), (49.6245)), (* H2'' *) ( (31.5672), (6.1750), (50.4632)), (* O2' *) ( (31.8416), (5.2663), (50.3200)), (* H2' *) ( (30.8618), (8.1514), (49.3749)), (* C3' *) ( (31.1122), (8.9396), (50.0850)), (* H3' *) ( (29.5351), (7.6245), (49.5409)), (* O3' *) ( (33.1890), (5.8629), (47.7343)), (* N1 *) ( (34.4004), (4.2636), (46.4828)), (* N3 *) ( (33.2062), (4.8497), (46.7851)), (* C2 *) ( (35.5600), (4.6374), (47.0822)), (* C4 *) ( (35.5444), (5.6751), (48.0577)), (* C5 *) ( (34.3565), (6.2450), (48.3432)), (* C6 *) (C ( ( (36.6977), (4.0305), (46.7598)), (* N4 *) ( (32.1661), (4.5034), (46.2348)), (* O2 *) ( (37.5405), (4.3347), (47.2259)), (* H41 *) ( (36.7033), (3.2923), (46.0706)), (* H42 *) ( (36.4713), (5.9811), (48.5428)), (* H5 *) ( (34.2986), (7.0426), (49.0839))) (* H6 *) ) ) val rCs = [rC01,rC02,rC03,rC04,rC05,rC06,rC07,rC08,rC09,rC10] val rG = ( ( (~0.0018), (~0.8207), (0.5714), (* dgf-base-tfo *) (0.2679), (~0.5509), (~0.7904), (0.9634), (0.1517), (0.2209), (0.0073), (8.4030), (0.6232)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4550), (8.2120), (~2.8810)), (* C5' *) ( (5.4546), (8.8508), (~1.9978)), (* H5' *) ( (5.7588), (8.6625), (~3.8259)), (* H5'' *) ( (6.4970), (7.1480), (~2.5980)), (* C4' *) ( (7.4896), (7.5919), (~2.5214)), (* H4' *) ( (6.1630), (6.4860), (~1.3440)), (* O4' *) ( (6.5400), (5.1200), (~1.4190)), (* C1' *) ( (7.2763), (4.9681), (~0.6297)), (* H1' *) ( (7.1940), (4.8830), (~2.7770)), (* C2' *) ( (6.8667), (3.9183), (~3.1647)), (* H2'' *) ( (8.5860), (5.0910), (~2.6140)), (* O2' *) ( (8.9510), (4.7626), (~1.7890)), (* H2' *) ( (6.5720), (6.0040), (~3.6090)), (* C3' *) ( (5.5636), (5.7066), (~3.8966)), (* H3' *) ( (7.3801), (6.3562), (~4.7350)), (* O3' *) ( (4.7150), (0.4910), (~0.1360)), (* N1 *) ( (6.3490), (2.1730), (~0.6020)), (* N3 *) ( (5.9530), (0.9650), (~0.2670)), (* C2 *) ( (5.2900), (2.9790), (~0.8260)), (* C4 *) ( (3.9720), (2.6390), (~0.7330)), (* C5 *) ( (3.6770), (1.3160), (~0.3660)), (* C6 *) (G ( ( (6.8426), (0.0056), (~0.0019)), (* N2 *) ( (3.1660), (3.7290), (~1.0360)), (* N7 *) ( (5.3170), (4.2990), (~1.1930)), (* N9 *) ( (4.0100), (4.6780), (~1.2990)), (* C8 *) ( (2.4280), (0.8450), (~0.2360)), (* O6 *) ( (4.6151), (~0.4677), (0.1305)), (* H1 *) ( (6.6463), (~0.9463), (0.2729)), (* H21 *) ( (7.8170), (0.2642), (~0.0640)), (* H22 *) ( (3.4421), (5.5744), (~1.5482))) (* H8 *) ) ) val rG01 = ( ( (~0.0043), (~0.8175), (0.5759), (* dgf-base-tfo *) (0.2617), (~0.5567), (~0.7884), (0.9651), (0.1473), (0.2164), (0.0359), (8.3929), (0.5532)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4352), (8.2183), (~2.7757)), (* C5' *) ( (5.3830), (8.7883), (~1.8481)), (* H5' *) ( (5.7729), (8.7436), (~3.6691)), (* H5'' *) ( (6.4830), (7.1518), (~2.5252)), (* C4' *) ( (7.4749), (7.5972), (~2.4482)), (* H4' *) ( (6.1626), (6.4620), (~1.2827)), (* O4' *) ( (6.5431), (5.0992), (~1.3905)), (* C1' *) ( (7.2871), (4.9328), (~0.6114)), (* H1' *) ( (7.1852), (4.8935), (~2.7592)), (* C2' *) ( (6.8573), (3.9363), (~3.1645)), (* H2'' *) ( (8.5780), (5.1025), (~2.6046)), (* O2' *) ( (8.9516), (4.7577), (~1.7902)), (* H2' *) ( (6.5522), (6.0300), (~3.5612)), (* C3' *) ( (5.5420), (5.7356), (~3.8459)), (* H3' *) ( (7.3487), (6.4089), (~4.6867)), (* O3' *) ( (4.7442), (0.4514), (~0.1390)), (* N1 *) ( (6.3687), (2.1459), (~0.5926)), (* N3 *) ( (5.9795), (0.9335), (~0.2657)), (* C2 *) ( (5.3052), (2.9471), (~0.8125)), (* C4 *) ( (3.9891), (2.5987), (~0.7230)), (* C5 *) ( (3.7016), (1.2717), (~0.3647)), (* C6 *) (G ( ( (6.8745), (~0.0224), (~0.0058)), (* N2 *) ( (3.1770), (3.6859), (~1.0198)), (* N7 *) ( (5.3247), (4.2695), (~1.1710)), (* N9 *) ( (4.0156), (4.6415), (~1.2759)), (* C8 *) ( (2.4553), (0.7925), (~0.2390)), (* O6 *) ( (4.6497), (~0.5095), (0.1212)), (* H1 *) ( (6.6836), (~0.9771), (0.2627)), (* H21 *) ( (7.8474), (0.2424), (~0.0653)), (* H22 *) ( (3.4426), (5.5361), (~1.5199))) (* H8 *) ) ) val rG02 = ( ( (0.5566), (0.0449), (0.8296), (* dgf-base-tfo *) (0.5125), (0.7673), (~0.3854), (~0.6538), (0.6397), (0.4041), (~9.1161), (~3.7679), (~2.9968)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.5778), (6.6594), (~4.0364)), (* C5' *) ( (4.9220), (7.1963), (~4.9204)), (* H5' *) ( (3.7996), (5.9091), (~4.1764)), (* H5'' *) ( (5.7873), (5.8869), (~3.5482)), (* C4' *) ( (6.0405), (5.0875), (~4.2446)), (* H4' *) ( (6.9135), (6.8036), (~3.4310)), (* O4' *) ( (7.7293), (6.4084), (~2.3392)), (* C1' *) ( (8.7078), (6.1815), (~2.7624)), (* H1' *) ( (7.1305), (5.1418), (~1.7347)), (* C2' *) ( (7.2040), (5.1982), (~0.6486)), (* H2'' *) ( (7.7417), (4.0392), (~2.3813)), (* O2' *) ( (8.6785), (4.1443), (~2.5630)), (* H2' *) ( (5.6666), (5.2728), (~2.1536)), (* C3' *) ( (5.1747), (5.9805), (~1.4863)), (* H3' *) ( (4.9997), (4.0086), (~2.1973)), (* O3' *) ( (10.3245), (8.5459), (1.5467)), (* N1 *) ( (9.8051), (6.9432), (~0.1497)), (* N3 *) ( (10.5175), (7.4328), (0.8408)), (* C2 *) ( (8.7523), (7.7422), (~0.4228)), (* C4 *) ( (8.4257), (8.9060), (0.2099)), (* C5 *) ( (9.2665), (9.3242), (1.2540)), (* C6 *) (G ( ( (11.6077), (6.7966), (1.2752)), (* N2 *) ( (7.2750), (9.4537), (~0.3428)), (* N7 *) ( (7.7962), (7.5519), (~1.3859)), (* N9 *) ( (6.9479), (8.6157), (~1.2771)), (* C8 *) ( (9.0664), (10.4462), (1.9610)), (* O6 *) ( (10.9838), (8.7524), (2.2697)), (* H1 *) ( (12.2274), (7.0896), (2.0170)), (* H21 *) ( (11.8502), (5.9398), (0.7984)), (* H22 *) ( (6.0430), (8.9853), (~1.7594))) (* H8 *) ) ) val rG03 = ( ( (~0.5021), (0.0731), (0.8617), (* dgf-base-tfo *) (~0.8112), (0.3054), (~0.4986), (~0.2996), (~0.9494), (~0.0940), (6.4273), (~5.1944), (~3.7807)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.1214), (6.7116), (~1.9049)), (* C5' *) ( (3.3465), (5.9610), (~2.0607)), (* H5' *) ( (4.0789), (7.2928), (~0.9837)), (* H5'' *) ( (5.4170), (5.9293), (~1.8186)), (* C4' *) ( (5.4506), (5.3400), (~0.9023)), (* H4' *) ( (5.5067), (5.0417), (~2.9703)), (* O4' *) ( (6.8650), (4.9152), (~3.3612)), (* C1' *) ( (7.1090), (3.8577), (~3.2603)), (* H1' *) ( (7.7152), (5.7282), (~2.3894)), (* C2' *) ( (8.5029), (6.2356), (~2.9463)), (* H2'' *) ( (8.1036), (4.8568), (~1.3419)), (* O2' *) ( (8.3270), (3.9651), (~1.6184)), (* H2' *) ( (6.7003), (6.7565), (~1.8911)), (* C3' *) ( (6.5898), (7.5329), (~2.6482)), (* H3' *) ( (7.0505), (7.2878), (~0.6105)), (* O3' *) ( (9.6740), (4.7656), (~7.6614)), (* N1 *) ( (9.0739), (4.3013), (~5.3941)), (* N3 *) ( (9.8416), (4.2192), (~6.4581)), (* C2 *) ( (7.9885), (5.0632), (~5.6446)), (* C4 *) ( (7.6822), (5.6856), (~6.8194)), (* C5 *) ( (8.5831), (5.5215), (~7.8840)), (* C6 *) (G ( ( (10.9733), (3.5117), (~6.4286)), (* N2 *) ( (6.4857), (6.3816), (~6.7035)), (* N7 *) ( (6.9740), (5.3703), (~4.7760)), (* N9 *) ( (6.1133), (6.1613), (~5.4808)), (* C8 *) ( (8.4084), (6.0747), (~9.0933)), (* O6 *) ( (10.3759), (4.5855), (~8.3504)), (* H1 *) ( (11.6254), (3.3761), (~7.1879)), (* H21 *) ( (11.1917), (3.0460), (~5.5593)), (* H22 *) ( (5.1705), (6.6830), (~5.3167))) (* H8 *) ) ) val rG04 = ( ( (~0.5426), (~0.8175), (0.1929), (* dgf-base-tfo *) (0.8304), (~0.5567), (~0.0237), (0.1267), (0.1473), (0.9809), (~0.5075), (8.3929), (0.2229)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (5.4352), (8.2183), (~2.7757)), (* C5' *) ( (5.3830), (8.7883), (~1.8481)), (* H5' *) ( (5.7729), (8.7436), (~3.6691)), (* H5'' *) ( (6.4830), (7.1518), (~2.5252)), (* C4' *) ( (7.4749), (7.5972), (~2.4482)), (* H4' *) ( (6.1626), (6.4620), (~1.2827)), (* O4' *) ( (6.5431), (5.0992), (~1.3905)), (* C1' *) ( (7.2871), (4.9328), (~0.6114)), (* H1' *) ( (7.1852), (4.8935), (~2.7592)), (* C2' *) ( (6.8573), (3.9363), (~3.1645)), (* H2'' *) ( (8.5780), (5.1025), (~2.6046)), (* O2' *) ( (8.9516), (4.7577), (~1.7902)), (* H2' *) ( (6.5522), (6.0300), (~3.5612)), (* C3' *) ( (5.5420), (5.7356), (~3.8459)), (* H3' *) ( (7.3487), (6.4089), (~4.6867)), (* O3' *) ( (3.6343), (2.6680), (2.0783)), (* N1 *) ( (5.4505), (3.9805), (1.2446)), (* N3 *) ( (4.7540), (3.3816), (2.1851)), (* C2 *) ( (4.8805), (3.7951), (0.0354)), (* C4 *) ( (3.7416), (3.0925), (~0.2305)), (* C5 *) ( (3.0873), (2.4980), (0.8606)), (* C6 *) (G ( ( (5.1433), (3.4373), (3.4609)), (* N2 *) ( (3.4605), (3.1184), (~1.5906)), (* N7 *) ( (5.3247), (4.2695), (~1.1710)), (* N9 *) ( (4.4244), (3.8244), (~2.0953)), (* C8 *) ( (1.9600), (1.7805), (0.7462)), (* O6 *) ( (3.2489), (2.2879), (2.9191)), (* H1 *) ( (4.6785), (3.0243), (4.2568)), (* H21 *) ( (5.9823), (3.9654), (3.6539)), (* H22 *) ( (4.2675), (3.8876), (~3.1721))) (* H8 *) ) ) val rG05 = ( ( (~0.5891), (0.0449), (0.8068), (* dgf-base-tfo *) (0.5375), (0.7673), (0.3498), (~0.6034), (0.6397), (~0.4762), (~0.3019), (~3.7679), (~9.5913)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.5778), (6.6594), (~4.0364)), (* C5' *) ( (4.9220), (7.1963), (~4.9204)), (* H5' *) ( (3.7996), (5.9091), (~4.1764)), (* H5'' *) ( (5.7873), (5.8869), (~3.5482)), (* C4' *) ( (6.0405), (5.0875), (~4.2446)), (* H4' *) ( (6.9135), (6.8036), (~3.4310)), (* O4' *) ( (7.7293), (6.4084), (~2.3392)), (* C1' *) ( (8.7078), (6.1815), (~2.7624)), (* H1' *) ( (7.1305), (5.1418), (~1.7347)), (* C2' *) ( (7.2040), (5.1982), (~0.6486)), (* H2'' *) ( (7.7417), (4.0392), (~2.3813)), (* O2' *) ( (8.6785), (4.1443), (~2.5630)), (* H2' *) ( (5.6666), (5.2728), (~2.1536)), (* C3' *) ( (5.1747), (5.9805), (~1.4863)), (* H3' *) ( (4.9997), (4.0086), (~2.1973)), (* O3' *) ( (10.2594), (10.6774), (~1.0056)), (* N1 *) ( (9.7528), (8.7080), (~2.2631)), (* N3 *) ( (10.4471), (9.7876), (~1.9791)), (* C2 *) ( (8.7271), (8.5575), (~1.3991)), (* C4 *) ( (8.4100), (9.3803), (~0.3580)), (* C5 *) ( (9.2294), (10.5030), (~0.1574)), (* C6 *) (G ( ( (11.5110), (10.1256), (~2.7114)), (* N2 *) ( (7.2891), (8.9068), (0.3121)), (* N7 *) ( (7.7962), (7.5519), (~1.3859)), (* N9 *) ( (6.9702), (7.8292), (~0.3353)), (* C8 *) ( (9.0349), (11.3951), (0.8250)), (* O6 *) ( (10.9013), (11.4422), (~0.9512)), (* H1 *) ( (12.1031), (10.9341), (~2.5861)), (* H21 *) ( (11.7369), (9.5180), (~3.4859)), (* H22 *) ( (6.0888), (7.3990), (0.1403))) (* H8 *) ) ) val rG06 = ( ( (~0.9815), (0.0731), (~0.1772), (* dgf-base-tfo *) (0.1912), (0.3054), (~0.9328), (~0.0141), (~0.9494), (~0.3137), (5.7506), (~5.1944), (4.7470)), ( (~0.8143), (~0.5091), (~0.2788), (* P-O3'-275-tfo *) (~0.0433), (~0.4257), (0.9038), (~0.5788), (0.7480), (0.3246), (1.5227), (6.9114), (~7.0765)), ( (0.3822), (~0.7477), (0.5430), (* P-O3'-180-tfo *) (0.4552), (0.6637), (0.5935), (~0.8042), (0.0203), (0.5941), (~6.9472), (~4.1186), (~5.9108)), ( (0.5640), (0.8007), (~0.2022), (* P-O3'-60-tfo *) (~0.8247), (0.5587), (~0.0878), (0.0426), (0.2162), (0.9754), (6.2694), (~7.0540), (3.3316)), ( (2.8930), (8.5380), (~3.3280)), (* P *) ( (1.6980), (7.6960), (~3.5570)), (* O1P *) ( (3.2260), (9.5010), (~4.4020)), (* O2P *) ( (4.1590), (7.6040), (~3.0340)), (* O5' *) ( (4.1214), (6.7116), (~1.9049)), (* C5' *) ( (3.3465), (5.9610), (~2.0607)), (* H5' *) ( (4.0789), (7.2928), (~0.9837)), (* H5'' *) ( (5.4170), (5.9293), (~1.8186)), (* C4' *) ( (5.4506), (5.3400), (~0.9023)), (* H4' *) ( (5.5067), (5.0417), (~2.9703)), (* O4' *) ( (6.8650), (4.9152), (~3.3612)), (* C1' *) ( (7.1090), (3.8577), (~3.2603)), (* H1' *) ( (7.7152), (5.7282), (~2.3894)), (* C2' *) ( (8.5029), (6.2356), (~2.9463)), (* H2'' *) ( (8.1036), (4.8568), (~1.3419)), (* O2' *) ( (8.3270), (3.9651), (~1.6184)), (* H2' *) ( (6.7003), (6.7565), (~1.8911)), (* C3' *) ( (6.5898), (7.5329), (~2.6482)), (* H3' *) ( (7.0505), (7.2878), (~0.6105)), (* O3' *) ( (6.6624), (3.5061), (~8.2986)), (* N1 *) ( (6.5810), (3.2570), (~5.9221)), (* N3 *) ( (6.5151), (2.8263), (~7.1625)), (* C2 *) ( (6.8364), (4.5817), (~5.8882)), (* C4 *) ( (7.0116), (5.4064), (~6.9609)), (* C5 *) ( (6.9173), (4.8260), (~8.2361)), (* C6 *) (G ( ( (6.2717), (1.5402), (~7.4250)), (* N2 *) ( (7.2573), (6.7070), (~6.5394)), (* N7 *) ( (6.9740), (5.3703), (~4.7760)), (* N9 *) ( (7.2238), (6.6275), (~5.2453)), (* C8 *) ( (7.0668), (5.5163), (~9.3763)), (* O6 *) ( (6.5754), (2.9964), (~9.1545)), (* H1 *) ( (6.1908), (1.1105), (~8.3354)), (* H21 *) ( (6.1346), (0.9352), (~6.6280)), (* H22 *) ( (7.4108), (7.6227), (~4.8418))) (* H8 *) ) ) val rG07 = ( ( (0.0894), (~0.6059), (0.7905), (* dgf-base-tfo *) (~0.6810), (0.5420), (0.4924), (~0.7268), (~0.5824), (~0.3642), (34.1424), (45.9610), (~11.8600)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (33.8709), (0.7918), (47.2113)), (* C5' *) ( (34.1386), (0.5870), (46.1747)), (* H5' *) ( (34.0186), (~0.0095), (47.9353)), (* H5'' *) ( (34.7297), (1.9687), (47.6685)), (* C4' *) ( (35.7723), (1.6845), (47.8113)), (* H4' *) ( (34.6455), (2.9768), (46.6660)), (* O4' *) ( (34.1690), (4.1829), (47.2627)), (* C1' *) ( (35.0437), (4.7633), (47.5560)), (* H1' *) ( (33.4145), (3.7532), (48.4954)), (* C2' *) ( (32.4340), (3.3797), (48.2001)), (* H2'' *) ( (33.3209), (4.6953), (49.5217)), (* O2' *) ( (33.2374), (5.6059), (49.2295)), (* H2' *) ( (34.2724), (2.5970), (48.9773)), (* C3' *) ( (33.6373), (1.8935), (49.5157)), (* H3' *) ( (35.3453), (3.1884), (49.7285)), (* O3' *) ( (34.0511), (7.8930), (43.7791)), (* N1 *) ( (34.9937), (6.3369), (45.3199)), (* N3 *) ( (35.0882), (7.3126), (44.4200)), (* C2 *) ( (33.7190), (5.9650), (45.5374)), (* C4 *) ( (32.5845), (6.4770), (44.9458)), (* C5 *) ( (32.7430), (7.5179), (43.9914)), (* C6 *) (G ( ( (36.3030), (7.7827), (44.1036)), (* N2 *) ( (31.4499), (5.8335), (45.4368)), (* N7 *) ( (33.2760), (4.9817), (46.4043)), (* N9 *) ( (31.9235), (4.9639), (46.2934)), (* C8 *) ( (31.8602), (8.1000), (43.3695)), (* O6 *) ( (34.2623), (8.6223), (43.1283)), (* H1 *) ( (36.5188), (8.5081), (43.4347)), (* H21 *) ( (37.0888), (7.3524), (44.5699)), (* H22 *) ( (31.0815), (4.4201), (46.7218))) (* H8 *) ) ) val rG08 = ( ( (0.2224), (0.6335), (0.7411), (* dgf-base-tfo *) (~0.3644), (~0.6510), (0.6659), (0.9043), (~0.4181), (0.0861), (~47.6824), (~0.5823), (~31.7554)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (32.5924), (2.3488), (48.2255)), (* C5' *) ( (33.3674), (2.1246), (48.9584)), (* H5' *) ( (31.5994), (2.5917), (48.6037)), (* H5'' *) ( (33.0722), (3.5577), (47.4258)), (* C4' *) ( (33.0310), (4.4778), (48.0089)), (* H4' *) ( (34.4173), (3.3055), (47.0316)), (* O4' *) ( (34.5056), (3.3910), (45.6094)), (* C1' *) ( (34.7881), (4.4152), (45.3663)), (* H1' *) ( (33.1122), (3.1198), (45.1010)), (* C2' *) ( (32.9230), (2.0469), (45.1369)), (* H2'' *) ( (32.7946), (3.6590), (43.8529)), (* O2' *) ( (33.5170), (3.6707), (43.2207)), (* H2' *) ( (32.2730), (3.8173), (46.1566)), (* C3' *) ( (31.3094), (3.3123), (46.2244)), (* H3' *) ( (32.2391), (5.2039), (45.7807)), (* O3' *) ( (39.3337), (2.7157), (44.1441)), (* N1 *) ( (37.4430), (3.8242), (45.0824)), (* N3 *) ( (38.7276), (3.7646), (44.7403)), (* C2 *) ( (36.7791), (2.6963), (44.7704)), (* C4 *) ( (37.2860), (1.5653), (44.1678)), (* C5 *) ( (38.6647), (1.5552), (43.8235)), (* C6 *) (G ( ( (39.5123), (4.8216), (44.9936)), (* N2 *) ( (36.2829), (0.6110), (44.0078)), (* N7 *) ( (35.4394), (2.4314), (44.9931)), (* N9 *) ( (35.2180), (1.1815), (44.5128)), (* C8 *) ( (39.2907), (0.6514), (43.2796)), (* O6 *) ( (40.3076), (2.8048), (43.9352)), (* H1 *) ( (40.4994), (4.9066), (44.7977)), (* H21 *) ( (39.0738), (5.6108), (45.4464)), (* H22 *) ( (34.3856), (0.4842), (44.4185))) (* H8 *) ) ) val rG09 = ( ( (~0.9699), (~0.1688), (~0.1753), (* dgf-base-tfo *) (~0.1050), (~0.3598), (0.9271), (~0.2196), (0.9176), (0.3312), (45.6217), (~38.9484), (~12.3208)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (33.8709), (0.7918), (47.2113)), (* C5' *) ( (34.1386), (0.5870), (46.1747)), (* H5' *) ( (34.0186), (~0.0095), (47.9353)), (* H5'' *) ( (34.7297), (1.9687), (47.6685)), (* C4' *) ( (34.5880), (2.8482), (47.0404)), (* H4' *) ( (34.3575), (2.2770), (49.0081)), (* O4' *) ( (35.5157), (2.1993), (49.8389)), (* C1' *) ( (35.9424), (3.2010), (49.8893)), (* H1' *) ( (36.4701), (1.2820), (49.1169)), (* C2' *) ( (36.1545), (0.2498), (49.2683)), (* H2'' *) ( (37.8262), (1.4547), (49.4008)), (* O2' *) ( (38.0227), (1.6945), (50.3094)), (* H2' *) ( (36.2242), (1.6797), (47.6725)), (* C3' *) ( (36.4297), (0.8197), (47.0351)), (* H3' *) ( (37.0289), (2.8480), (47.4426)), (* O3' *) ( (34.3005), (3.5042), (54.6070)), (* N1 *) ( (34.7693), (3.7936), (52.2874)), (* N3 *) ( (34.4484), (4.2541), (53.4939)), (* C2 *) ( (34.9354), (2.4584), (52.2785)), (* C4 *) ( (34.8092), (1.5915), (53.3422)), (* C5 *) ( (34.4646), (2.1367), (54.6085)), (* C6 *) (G ( ( (34.2514), (5.5708), (53.6503)), (* N2 *) ( (35.0641), (0.2835), (52.9337)), (* N7 *) ( (35.2669), (1.6690), (51.1915)), (* N9 *) ( (35.3288), (0.3954), (51.6563)), (* C8 *) ( (34.3151), (1.5317), (55.6650)), (* O6 *) ( (34.0623), (3.9797), (55.4539)), (* H1 *) ( (33.9950), (6.0502), (54.5016)), (* H21 *) ( (34.3512), (6.1432), (52.8242)), (* H22 *) ( (35.5414), (~0.6006), (51.2679))) (* H8 *) ) ) val rG10 = ( ( (~0.0980), (~0.9723), (0.2122), (* dgf-base-tfo *) (~0.9731), (0.1383), (0.1841), (~0.2083), (~0.1885), (~0.9597), (17.8469), (38.8265), (37.0475)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (32.5924), (2.3488), (48.2255)), (* C5' *) ( (33.3674), (2.1246), (48.9584)), (* H5' *) ( (31.5994), (2.5917), (48.6037)), (* H5'' *) ( (33.0722), (3.5577), (47.4258)), (* C4' *) ( (34.0333), (3.3761), (46.9447)), (* H4' *) ( (32.0890), (3.8338), (46.4332)), (* O4' *) ( (31.6377), (5.1787), (46.5914)), (* C1' *) ( (32.2499), (5.8016), (45.9392)), (* H1' *) ( (31.9167), (5.5319), (48.0305)), (* C2' *) ( (31.1507), (5.0820), (48.6621)), (* H2'' *) ( (32.0865), (6.8890), (48.3114)), (* O2' *) ( (31.5363), (7.4819), (47.7942)), (* H2' *) ( (33.2398), (4.8224), (48.2563)), (* C3' *) ( (33.3166), (4.5570), (49.3108)), (* H3' *) ( (34.2528), (5.7056), (47.7476)), (* O3' *) ( (28.2782), (6.3049), (42.9364)), (* N1 *) ( (30.4001), (5.8547), (43.9258)), (* N3 *) ( (29.6195), (6.1568), (42.8913)), (* C2 *) ( (29.7005), (5.7006), (45.0649)), (* C4 *) ( (28.3383), (5.8221), (45.2343)), (* C5 *) ( (27.5519), (6.1461), (44.0958)), (* C6 *) (G ( ( (30.1838), (6.3385), (41.6890)), (* N2 *) ( (27.9936), (5.5926), (46.5651)), (* N7 *) ( (30.2046), (5.3825), (46.3136)), (* N9 *) ( (29.1371), (5.3398), (47.1506)), (* C8 *) ( (26.3361), (6.3024), (44.0495)), (* O6 *) ( (27.8122), (6.5394), (42.0833)), (* H1 *) ( (29.7125), (6.5595), (40.8235)), (* H21 *) ( (31.1859), (6.2231), (41.6389)), (* H22 *) ( (28.9406), (5.1504), (48.2059))) (* H8 *) ) ) val rGs = [rG01,rG02,rG03,rG04,rG05,rG06,rG07,rG08,rG09,rG10] val rU = ( ( (~0.0359), (~0.8071), (0.5894), (* dgf-base-tfo *) (~0.2669), (0.5761), (0.7726), (~0.9631), (~0.1296), (~0.2361), (0.1584), (8.3434), (0.5434)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2430), (~8.2420), (2.8260)), (* C5' *) ( (5.1974), (~8.8497), (1.9223)), (* H5' *) ( (5.5548), (~8.7348), (3.7469)), (* H5'' *) ( (6.3140), (~7.2060), (2.5510)), (* C4' *) ( (7.2954), (~7.6762), (2.4898)), (* H4' *) ( (6.0140), (~6.5420), (1.2890)), (* O4' *) ( (6.4190), (~5.1840), (1.3620)), (* C1' *) ( (7.1608), (~5.0495), (0.5747)), (* H1' *) ( (7.0760), (~4.9560), (2.7270)), (* C2' *) ( (6.7770), (~3.9803), (3.1099)), (* H2'' *) ( (8.4500), (~5.1930), (2.5810)), (* O2' *) ( (8.8309), (~4.8755), (1.7590)), (* H2' *) ( (6.4060), (~6.0590), (3.5580)), (* C3' *) ( (5.4021), (~5.7313), (3.8281)), (* H3' *) ( (7.1570), (~6.4240), (4.7070)), (* O3' *) ( (5.2170), (~4.3260), (1.1690)), (* N1 *) ( (4.2960), (~2.2560), (0.6290)), (* N3 *) ( (5.4330), (~3.0200), (0.7990)), (* C2 *) ( (2.9930), (~2.6780), (0.7940)), (* C4 *) ( (2.8670), (~4.0630), (1.1830)), (* C5 *) ( (3.9570), (~4.8300), (1.3550)), (* C6 *) (U ( ( (6.5470), (~2.5560), (0.6290)), (* O2 *) ( (2.0540), (~1.9000), (0.6130)), (* O4 *) ( (4.4300), (~1.3020), (0.3600)), (* H3 *) ( (1.9590), (~4.4570), (1.3250)), (* H5 *) ( (3.8460), (~5.7860), (1.6240))) (* H6 *) ) ) val rU01 = ( ( (~0.0137), (~0.8012), (0.5983), (* dgf-base-tfo *) (~0.2523), (0.5817), (0.7733), (~0.9675), (~0.1404), (~0.2101), (0.2031), (8.3874), (0.4228)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2416), (~8.2422), (2.8181)), (* C5' *) ( (5.2050), (~8.8128), (1.8901)), (* H5' *) ( (5.5368), (~8.7738), (3.7227)), (* H5'' *) ( (6.3232), (~7.2037), (2.6002)), (* C4' *) ( (7.3048), (~7.6757), (2.5577)), (* H4' *) ( (6.0635), (~6.5092), (1.3456)), (* O4' *) ( (6.4697), (~5.1547), (1.4629)), (* C1' *) ( (7.2354), (~5.0043), (0.7018)), (* H1' *) ( (7.0856), (~4.9610), (2.8521)), (* C2' *) ( (6.7777), (~3.9935), (3.2487)), (* H2'' *) ( (8.4627), (~5.1992), (2.7423)), (* O2' *) ( (8.8693), (~4.8638), (1.9399)), (* H2' *) ( (6.3877), (~6.0809), (3.6362)), (* C3' *) ( (5.3770), (~5.7562), (3.8834)), (* H3' *) ( (7.1024), (~6.4754), (4.7985)), (* O3' *) ( (5.2764), (~4.2883), (1.2538)), (* N1 *) ( (4.3777), (~2.2062), (0.7229)), (* N3 *) ( (5.5069), (~2.9779), (0.9088)), (* C2 *) ( (3.0693), (~2.6246), (0.8500)), (* C4 *) ( (2.9279), (~4.0146), (1.2149)), (* C5 *) ( (4.0101), (~4.7892), (1.4017)), (* C6 *) (U ( ( (6.6267), (~2.5166), (0.7728)), (* O2 *) ( (2.1383), (~1.8396), (0.6581)), (* O4 *) ( (4.5223), (~1.2489), (0.4716)), (* H3 *) ( (2.0151), (~4.4065), (1.3290)), (* H5 *) ( (3.8886), (~5.7486), (1.6535))) (* H6 *) ) ) val rU02 = ( ( (0.5141), (0.0246), (0.8574), (* dgf-base-tfo *) (~0.5547), (~0.7529), (0.3542), (0.6542), (~0.6577), (~0.3734), (~9.1111), (~3.4598), (~3.2939)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (4.3825), (~6.6585), (4.0489)), (* C5' *) ( (4.6841), (~7.2019), (4.9443)), (* H5' *) ( (3.6189), (~5.8889), (4.1625)), (* H5'' *) ( (5.6255), (~5.9175), (3.5998)), (* C4' *) ( (5.8732), (~5.1228), (4.3034)), (* H4' *) ( (6.7337), (~6.8605), (3.5222)), (* O4' *) ( (7.5932), (~6.4923), (2.4548)), (* C1' *) ( (8.5661), (~6.2983), (2.9064)), (* H1' *) ( (7.0527), (~5.2012), (1.8322)), (* C2' *) ( (7.1627), (~5.2525), (0.7490)), (* H2'' *) ( (7.6666), (~4.1249), (2.4880)), (* O2' *) ( (8.5944), (~4.2543), (2.6981)), (* H2' *) ( (5.5661), (~5.3029), (2.2009)), (* C3' *) ( (5.0841), (~6.0018), (1.5172)), (* H3' *) ( (4.9062), (~4.0452), (2.2042)), (* O3' *) ( (7.6298), (~7.6136), (1.4752)), (* N1 *) ( (8.6945), (~8.7046), (~0.2857)), (* N3 *) ( (8.6943), (~7.6514), (0.6066)), (* C2 *) ( (7.7426), (~9.6987), (~0.3801)), (* C4 *) ( (6.6642), (~9.5742), (0.5722)), (* C5 *) ( (6.6391), (~8.5592), (1.4526)), (* C6 *) (U ( ( (9.5840), (~6.8186), (0.6136)), (* O2 *) ( (7.8505), (~10.5925), (~1.2223)), (* O4 *) ( (9.4601), (~8.7514), (~0.9277)), (* H3 *) ( (5.9281), (~10.2509), (0.5782)), (* H5 *) ( (5.8831), (~8.4931), (2.1028))) (* H6 *) ) ) val rU03 = ( ( (~0.4993), (0.0476), (0.8651), (* dgf-base-tfo *) (0.8078), (~0.3353), (0.4847), (0.3132), (0.9409), (0.1290), (6.2989), (~5.2303), (~3.8577)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (3.9938), (~6.7042), (1.9023)), (* C5' *) ( (3.2332), (~5.9343), (2.0319)), (* H5' *) ( (3.9666), (~7.2863), (0.9812)), (* H5'' *) ( (5.3098), (~5.9546), (1.8564)), (* C4' *) ( (5.3863), (~5.3702), (0.9395)), (* H4' *) ( (5.3851), (~5.0642), (3.0076)), (* O4' *) ( (6.7315), (~4.9724), (3.4462)), (* C1' *) ( (7.0033), (~3.9202), (3.3619)), (* H1' *) ( (7.5997), (~5.8018), (2.4948)), (* C2' *) ( (8.3627), (~6.3254), (3.0707)), (* H2'' *) ( (8.0410), (~4.9501), (1.4724)), (* O2' *) ( (8.2781), (~4.0644), (1.7570)), (* H2' *) ( (6.5701), (~6.8129), (1.9714)), (* C3' *) ( (6.4186), (~7.5809), (2.7299)), (* H3' *) ( (6.9357), (~7.3841), (0.7235)), (* O3' *) ( (6.8024), (~5.4718), (4.8475)), (* N1 *) ( (7.9218), (~5.5700), (6.8877)), (* N3 *) ( (7.8908), (~5.0886), (5.5944)), (* C2 *) ( (6.9789), (~6.3827), (7.4823)), (* C4 *) ( (5.8742), (~6.7319), (6.6202)), (* C5 *) ( (5.8182), (~6.2769), (5.3570)), (* C6 *) (U ( ( (8.7747), (~4.3728), (5.1568)), (* O2 *) ( (7.1154), (~6.7509), (8.6509)), (* O4 *) ( (8.7055), (~5.3037), (7.4491)), (* H3 *) ( (5.1416), (~7.3178), (6.9665)), (* H5 *) ( (5.0441), (~6.5310), (4.7784))) (* H6 *) ) ) val rU04 = ( ( (~0.5669), (~0.8012), (0.1918), (* dgf-base-tfo *) (~0.8129), (0.5817), (0.0273), (~0.1334), (~0.1404), (~0.9811), (~0.3279), (8.3874), (0.3355)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2416), (~8.2422), (2.8181)), (* C5' *) ( (5.2050), (~8.8128), (1.8901)), (* H5' *) ( (5.5368), (~8.7738), (3.7227)), (* H5'' *) ( (6.3232), (~7.2037), (2.6002)), (* C4' *) ( (7.3048), (~7.6757), (2.5577)), (* H4' *) ( (6.0635), (~6.5092), (1.3456)), (* O4' *) ( (6.4697), (~5.1547), (1.4629)), (* C1' *) ( (7.2354), (~5.0043), (0.7018)), (* H1' *) ( (7.0856), (~4.9610), (2.8521)), (* C2' *) ( (6.7777), (~3.9935), (3.2487)), (* H2'' *) ( (8.4627), (~5.1992), (2.7423)), (* O2' *) ( (8.8693), (~4.8638), (1.9399)), (* H2' *) ( (6.3877), (~6.0809), (3.6362)), (* C3' *) ( (5.3770), (~5.7562), (3.8834)), (* H3' *) ( (7.1024), (~6.4754), (4.7985)), (* O3' *) ( (5.2764), (~4.2883), (1.2538)), (* N1 *) ( (3.8961), (~3.0896), (~0.1893)), (* N3 *) ( (5.0095), (~3.8907), (~0.0346)), (* C2 *) ( (3.0480), (~2.6632), (0.8116)), (* C4 *) ( (3.4093), (~3.1310), (2.1292)), (* C5 *) ( (4.4878), (~3.9124), (2.3088)), (* C6 *) (U ( ( (5.7005), (~4.2164), (~0.9842)), (* O2 *) ( (2.0800), (~1.9458), (0.5503)), (* O4 *) ( (3.6834), (~2.7882), (~1.1190)), (* H3 *) ( (2.8508), (~2.8721), (2.9172)), (* H5 *) ( (4.7188), (~4.2247), (3.2295))) (* H6 *) ) ) val rU05 = ( ( (~0.6298), (0.0246), (0.7763), (* dgf-base-tfo *) (~0.5226), (~0.7529), (~0.4001), (0.5746), (~0.6577), (0.4870), (~0.0208), (~3.4598), (~9.6882)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (4.3825), (~6.6585), (4.0489)), (* C5' *) ( (4.6841), (~7.2019), (4.9443)), (* H5' *) ( (3.6189), (~5.8889), (4.1625)), (* H5'' *) ( (5.6255), (~5.9175), (3.5998)), (* C4' *) ( (5.8732), (~5.1228), (4.3034)), (* H4' *) ( (6.7337), (~6.8605), (3.5222)), (* O4' *) ( (7.5932), (~6.4923), (2.4548)), (* C1' *) ( (8.5661), (~6.2983), (2.9064)), (* H1' *) ( (7.0527), (~5.2012), (1.8322)), (* C2' *) ( (7.1627), (~5.2525), (0.7490)), (* H2'' *) ( (7.6666), (~4.1249), (2.4880)), (* O2' *) ( (8.5944), (~4.2543), (2.6981)), (* H2' *) ( (5.5661), (~5.3029), (2.2009)), (* C3' *) ( (5.0841), (~6.0018), (1.5172)), (* H3' *) ( (4.9062), (~4.0452), (2.2042)), (* O3' *) ( (7.6298), (~7.6136), (1.4752)), (* N1 *) ( (8.5977), (~9.5977), (0.7329)), (* N3 *) ( (8.5951), (~8.5745), (1.6594)), (* C2 *) ( (7.7372), (~9.7371), (~0.3364)), (* C4 *) ( (6.7596), (~8.6801), (~0.4476)), (* C5 *) ( (6.7338), (~7.6721), (0.4408)), (* C6 *) (U ( ( (9.3993), (~8.5377), (2.5743)), (* O2 *) ( (7.8374), (~10.6990), (~1.1008)), (* O4 *) ( (9.2924), (~10.3081), (0.8477)), (* H3 *) ( (6.0932), (~8.6982), (~1.1929)), (* H5 *) ( (6.0481), (~6.9515), (0.3446))) (* H6 *) ) ) val rU06 = ( ( (~0.9837), (0.0476), (~0.1733), (* dgf-base-tfo *) (~0.1792), (~0.3353), (0.9249), (~0.0141), (0.9409), (0.3384), (5.7793), (~5.2303), (4.5997)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (3.9938), (~6.7042), (1.9023)), (* C5' *) ( (3.2332), (~5.9343), (2.0319)), (* H5' *) ( (3.9666), (~7.2863), (0.9812)), (* H5'' *) ( (5.3098), (~5.9546), (1.8564)), (* C4' *) ( (5.3863), (~5.3702), (0.9395)), (* H4' *) ( (5.3851), (~5.0642), (3.0076)), (* O4' *) ( (6.7315), (~4.9724), (3.4462)), (* C1' *) ( (7.0033), (~3.9202), (3.3619)), (* H1' *) ( (7.5997), (~5.8018), (2.4948)), (* C2' *) ( (8.3627), (~6.3254), (3.0707)), (* H2'' *) ( (8.0410), (~4.9501), (1.4724)), (* O2' *) ( (8.2781), (~4.0644), (1.7570)), (* H2' *) ( (6.5701), (~6.8129), (1.9714)), (* C3' *) ( (6.4186), (~7.5809), (2.7299)), (* H3' *) ( (6.9357), (~7.3841), (0.7235)), (* O3' *) ( (6.8024), (~5.4718), (4.8475)), (* N1 *) ( (6.6920), (~5.0495), (7.1354)), (* N3 *) ( (6.6201), (~4.5500), (5.8506)), (* C2 *) ( (6.9254), (~6.3614), (7.4926)), (* C4 *) ( (7.1046), (~7.2543), (6.3718)), (* C5 *) ( (7.0391), (~6.7951), (5.1106)), (* C6 *) (U ( ( (6.4083), (~3.3696), (5.6340)), (* O2 *) ( (6.9679), (~6.6901), (8.6800)), (* O4 *) ( (6.5626), (~4.3957), (7.8812)), (* H3 *) ( (7.2781), (~8.2254), (6.5350)), (* H5 *) ( (7.1657), (~7.4312), (4.3503))) (* H6 *) ) ) val rU07 = ( ( (~0.9434), (0.3172), (0.0971), (* dgf-base-tfo *) (0.2294), (0.4125), (0.8816), (0.2396), (0.8539), (~0.4619), (8.3625), (~52.7147), (1.3745)), ( (0.2765), (~0.1121), (~0.9545), (* P-O3'-275-tfo *) (~0.8297), (0.4733), (~0.2959), (0.4850), (0.8737), (0.0379), (~14.7774), (~45.2464), (21.9088)), ( (0.1063), (~0.6334), (~0.7665), (* P-O3'-180-tfo *) (~0.5932), (~0.6591), (0.4624), (~0.7980), (0.4055), (~0.4458), (43.7634), (4.3296), (28.4890)), ( (0.7136), (~0.5032), (~0.4873), (* P-O3'-60-tfo *) (0.6803), (0.3317), (0.6536), (~0.1673), (~0.7979), (0.5791), (~17.1858), (41.4390), (~27.0751)), ( (21.3880), (15.0780), (45.5770)), (* P *) ( (21.9980), (14.5500), (46.8210)), (* O1P *) ( (21.1450), (14.0270), (44.5420)), (* O2P *) ( (22.1250), (16.3600), (44.9460)), (* O5' *) ( (21.5037), (16.8594), (43.7323)), (* C5' *) ( (20.8147), (17.6663), (43.9823)), (* H5' *) ( (21.1086), (16.0230), (43.1557)), (* H5'' *) ( (22.5654), (17.4874), (42.8616)), (* C4' *) ( (22.1584), (17.7243), (41.8785)), (* H4' *) ( (23.0557), (18.6826), (43.4751)), (* O4' *) ( (24.4788), (18.6151), (43.6455)), (* C1' *) ( (24.9355), (19.0840), (42.7739)), (* H1' *) ( (24.7958), (17.1427), (43.6474)), (* C2' *) ( (24.5652), (16.7400), (44.6336)), (* H2'' *) ( (26.1041), (16.8773), (43.2455)), (* O2' *) ( (26.7516), (17.5328), (43.5149)), (* H2' *) ( (23.8109), (16.5979), (42.6377)), (* C3' *) ( (23.5756), (15.5686), (42.9084)), (* H3' *) ( (24.2890), (16.7447), (41.2729)), (* O3' *) ( (24.9420), (19.2174), (44.8923)), (* N1 *) ( (25.2655), (20.5636), (44.8883)), (* N3 *) ( (25.1663), (21.2219), (43.8561)), (* C2 *) ( (25.6911), (21.1219), (46.0494)), (* C4 *) ( (25.8051), (20.4068), (47.2048)), (* C5 *) ( (26.2093), (20.9962), (48.2534)), (* C6 *) (U ( ( (25.4692), (19.0221), (47.2053)), (* O2 *) ( (25.0502), (18.4827), (46.0370)), (* O4 *) ( (25.9599), (22.1772), (46.0966)), (* H3 *) ( (25.5545), (18.4409), (48.1234)), (* H5 *) ( (24.7854), (17.4265), (45.9883))) (* H6 *) ) ) val rU08 = ( ( (~0.0080), (~0.7928), (0.6094), (* dgf-base-tfo *) (~0.7512), (0.4071), (0.5197), (~0.6601), (~0.4536), (~0.5988), (44.1482), (30.7036), (2.1088)), ( (0.2765), (~0.1121), (~0.9545), (* P-O3'-275-tfo *) (~0.8297), (0.4733), (~0.2959), (0.4850), (0.8737), (0.0379), (~14.7774), (~45.2464), (21.9088)), ( (0.1063), (~0.6334), (~0.7665), (* P-O3'-180-tfo *) (~0.5932), (~0.6591), (0.4624), (~0.7980), (0.4055), (~0.4458), (43.7634), (4.3296), (28.4890)), ( (0.7136), (~0.5032), (~0.4873), (* P-O3'-60-tfo *) (0.6803), (0.3317), (0.6536), (~0.1673), (~0.7979), (0.5791), (~17.1858), (41.4390), (~27.0751)), ( (21.3880), (15.0780), (45.5770)), (* P *) ( (21.9980), (14.5500), (46.8210)), (* O1P *) ( (21.1450), (14.0270), (44.5420)), (* O2P *) ( (22.1250), (16.3600), (44.9460)), (* O5' *) ( (23.5096), (16.1227), (44.5783)), (* C5' *) ( (23.5649), (15.8588), (43.5222)), (* H5' *) ( (23.9621), (15.4341), (45.2919)), (* H5'' *) ( (24.2805), (17.4138), (44.7151)), (* C4' *) ( (25.3492), (17.2309), (44.6030)), (* H4' *) ( (23.8497), (18.3471), (43.7208)), (* O4' *) ( (23.4090), (19.5681), (44.3321)), (* C1' *) ( (24.2595), (20.2496), (44.3524)), (* H1' *) ( (23.0418), (19.1813), (45.7407)), (* C2' *) ( (22.0532), (18.7224), (45.7273)), (* H2'' *) ( (23.1307), (20.2521), (46.6291)), (* O2' *) ( (22.8888), (21.1051), (46.2611)), (* H2' *) ( (24.0799), (18.1326), (46.0700)), (* C3' *) ( (23.6490), (17.4370), (46.7900)), (* H3' *) ( (25.3329), (18.7227), (46.5109)), (* O3' *) ( (22.2515), (20.1624), (43.6698)), (* N1 *) ( (22.4760), (21.0609), (42.6406)), (* N3 *) ( (23.6229), (21.3462), (42.3061)), (* C2 *) ( (21.3986), (21.6081), (42.0236)), (* C4 *) ( (20.1189), (21.3012), (42.3804)), (* C5 *) ( (19.1599), (21.8516), (41.7578)), (* C6 *) (U ( ( (19.8919), (20.3745), (43.4387)), (* O2 *) ( (20.9790), (19.8423), (44.0440)), (* O4 *) ( (21.5235), (22.3222), (41.2097)), (* H3 *) ( (18.8732), (20.1200), (43.7312)), (* H5 *) ( (20.8545), (19.1313), (44.8608))) (* H6 *) ) ) val rU09 = ( ( (~0.0317), (0.1374), (0.9900), (* dgf-base-tfo *) (~0.3422), (~0.9321), (0.1184), (0.9391), (~0.3351), (0.0765), (~32.1929), (25.8198), (~28.5088)), ( (0.2765), (~0.1121), (~0.9545), (* P-O3'-275-tfo *) (~0.8297), (0.4733), (~0.2959), (0.4850), (0.8737), (0.0379), (~14.7774), (~45.2464), (21.9088)), ( (0.1063), (~0.6334), (~0.7665), (* P-O3'-180-tfo *) (~0.5932), (~0.6591), (0.4624), (~0.7980), (0.4055), (~0.4458), (43.7634), (4.3296), (28.4890)), ( (0.7136), (~0.5032), (~0.4873), (* P-O3'-60-tfo *) (0.6803), (0.3317), (0.6536), (~0.1673), (~0.7979), (0.5791), (~17.1858), (41.4390), (~27.0751)), ( (21.3880), (15.0780), (45.5770)), (* P *) ( (21.9980), (14.5500), (46.8210)), (* O1P *) ( (21.1450), (14.0270), (44.5420)), (* O2P *) ( (22.1250), (16.3600), (44.9460)), (* O5' *) ( (21.5037), (16.8594), (43.7323)), (* C5' *) ( (20.8147), (17.6663), (43.9823)), (* H5' *) ( (21.1086), (16.0230), (43.1557)), (* H5'' *) ( (22.5654), (17.4874), (42.8616)), (* C4' *) ( (23.0565), (18.3036), (43.3915)), (* H4' *) ( (23.5375), (16.5054), (42.4925)), (* O4' *) ( (23.6574), (16.4257), (41.0649)), (* C1' *) ( (24.4701), (17.0882), (40.7671)), (* H1' *) ( (22.3525), (16.9643), (40.5396)), (* C2' *) ( (21.5993), (16.1799), (40.6133)), (* H2'' *) ( (22.4693), (17.4849), (39.2515)), (* O2' *) ( (23.0899), (17.0235), (38.6827)), (* H2' *) ( (22.0341), (18.0633), (41.5279)), (* C3' *) ( (20.9509), (18.1709), (41.5846)), (* H3' *) ( (22.7249), (19.3020), (41.2100)), (* O3' *) ( (23.8580), (15.0648), (40.5757)), (* N1 *) ( (25.1556), (14.5982), (40.4523)), (* N3 *) ( (26.1047), (15.3210), (40.7448)), (* C2 *) ( (25.3391), (13.3315), (40.0020)), (* C4 *) ( (24.2974), (12.5148), (39.6749)), (* C5 *) ( (24.5450), (11.3410), (39.2610)), (* C6 *) (U ( ( (22.9633), (12.9979), (39.8053)), (* O2 *) ( (22.8009), (14.2648), (40.2524)), (* O4 *) ( (26.3414), (12.9194), (39.8855)), (* H3 *) ( (22.1227), (12.3533), (39.5486)), (* H5 *) ( (21.7989), (14.6788), (40.3650))) (* H6 *) ) ) val rU10 = ( ( (~0.9674), (0.1021), (~0.2318), (* dgf-base-tfo *) (~0.2514), (~0.2766), (0.9275), (0.0306), (0.9555), (0.2933), (27.8571), (~42.1305), (~24.4563)), ( (0.2765), (~0.1121), (~0.9545), (* P-O3'-275-tfo *) (~0.8297), (0.4733), (~0.2959), (0.4850), (0.8737), (0.0379), (~14.7774), (~45.2464), (21.9088)), ( (0.1063), (~0.6334), (~0.7665), (* P-O3'-180-tfo *) (~0.5932), (~0.6591), (0.4624), (~0.7980), (0.4055), (~0.4458), (43.7634), (4.3296), (28.4890)), ( (0.7136), (~0.5032), (~0.4873), (* P-O3'-60-tfo *) (0.6803), (0.3317), (0.6536), (~0.1673), (~0.7979), (0.5791), (~17.1858), (41.4390), (~27.0751)), ( (21.3880), (15.0780), (45.5770)), (* P *) ( (21.9980), (14.5500), (46.8210)), (* O1P *) ( (21.1450), (14.0270), (44.5420)), (* O2P *) ( (22.1250), (16.3600), (44.9460)), (* O5' *) ( (23.5096), (16.1227), (44.5783)), (* C5' *) ( (23.5649), (15.8588), (43.5222)), (* H5' *) ( (23.9621), (15.4341), (45.2919)), (* H5'' *) ( (24.2805), (17.4138), (44.7151)), (* C4' *) ( (23.8509), (18.1819), (44.0720)), (* H4' *) ( (24.2506), (17.8583), (46.0741)), (* O4' *) ( (25.5830), (18.0320), (46.5775)), (* C1' *) ( (25.8569), (19.0761), (46.4256)), (* H1' *) ( (26.4410), (17.1555), (45.7033)), (* C2' *) ( (26.3459), (16.1253), (46.0462)), (* H2'' *) ( (27.7649), (17.5888), (45.6478)), (* O2' *) ( (28.1004), (17.9719), (46.4616)), (* H2' *) ( (25.7796), (17.2997), (44.3513)), (* C3' *) ( (25.9478), (16.3824), (43.7871)), (* H3' *) ( (26.2154), (18.4984), (43.6541)), (* O3' *) ( (25.7321), (17.6281), (47.9726)), (* N1 *) ( (25.5136), (18.5779), (48.9560)), (* N3 *) ( (25.2079), (19.7276), (48.6503)), (* C2 *) ( (25.6482), (18.1987), (50.2518)), (* C4 *) ( (25.9847), (16.9266), (50.6092)), (* C5 *) ( (26.0918), (16.6439), (51.8416)), (* C6 *) (U ( ( (26.2067), (15.9515), (49.5943)), (* O2 *) ( (26.0713), (16.3497), (48.3080)), (* O4 *) ( (25.4890), (18.9105), (51.0618)), (* H3 *) ( (26.4742), (14.9310), (49.8682)), (* H5 *) ( (26.2346), (15.6394), (47.4975))) (* H6 *) ) ) val rUs = [rU01,rU02,rU03,rU04,rU05,rU06,rU07,rU08,rU09,rU10] val rG' = ( ( (~0.2067), (~0.0264), (0.9780), (* dgf-base-tfo *) (0.9770), (~0.0586), (0.2049), (0.0519), (0.9979), (0.0379), (1.0331), (~46.8078), (~36.4742)), ( (~0.8644), (~0.4956), (~0.0851), (* P-O3'-275-tfo *) (~0.0427), (0.2409), (~0.9696), (0.5010), (~0.8345), (~0.2294), (4.0167), (54.5377), (12.4779)), ( (0.3706), (~0.6167), (0.6945), (* P-O3'-180-tfo *) (~0.2867), (~0.7872), (~0.5460), (0.8834), (0.0032), (~0.4686), (~52.9020), (18.6313), (~0.6709)), ( (0.4155), (0.9025), (~0.1137), (* P-O3'-60-tfo *) (0.9040), (~0.4236), (~0.0582), (~0.1007), (~0.0786), (~0.9918), (~7.6624), (~25.2080), (49.5181)), ( (31.3810), (0.1400), (47.5810)), (* P *) ( (29.9860), (0.6630), (47.6290)), (* O1P *) ( (31.7210), (~0.6460), (48.8090)), (* O2P *) ( (32.4940), (1.2540), (47.2740)), (* O5' *) ( (32.1610), (2.2370), (46.2560)), (* C5' *) ( (31.2986), (2.8190), (46.5812)), (* H5' *) ( (32.0980), (1.7468), (45.2845)), (* H5'' *) ( (33.3476), (3.1959), (46.1947)), (* C4' *) ( (33.2668), (3.8958), (45.3630)), (* H4' *) ( (33.3799), (3.9183), (47.4216)), (* O4' *) ( (34.6515), (3.7222), (48.0398)), (* C1' *) ( (35.2947), (4.5412), (47.7180)), (* H1' *) ( (35.1756), (2.4228), (47.4827)), (* C2' *) ( (34.6778), (1.5937), (47.9856)), (* H2'' *) ( (36.5631), (2.2672), (47.4798)), (* O2' *) ( (37.0163), (2.6579), (48.2305)), (* H2' *) ( (34.6953), (2.5043), (46.0448)), (* C3' *) ( (34.5444), (1.4917), (45.6706)), (* H3' *) ( (35.6679), (3.3009), (45.3487)), (* O3' *) ( (37.4804), (4.0914), (52.2559)), (* N1 *) ( (36.9670), (4.1312), (49.9281)), (* N3 *) ( (37.8045), (4.2519), (50.9550)), (* C2 *) ( (35.7171), (3.8264), (50.3222)), (* C4 *) ( (35.2668), (3.6420), (51.6115)), (* C5 *) ( (36.2037), (3.7829), (52.6706)), (* C6 *) (G ( ( (39.0869), (4.5552), (50.7092)), (* N2 *) ( (33.9075), (3.3338), (51.6102)), (* N7 *) ( (34.6126), (3.6358), (49.5108)), (* N9 *) ( (33.5805), (3.3442), (50.3425)), (* C8 *) ( (35.9958), (3.6512), (53.8724)), (* O6 *) ( (38.2106), (4.2053), (52.9295)), (* H1 *) ( (39.8218), (4.6863), (51.3896)), (* H21 *) ( (39.3420), (4.6857), (49.7407)), (* H22 *) ( (32.5194), (3.1070), (50.2664))) (* H8 *) ) ) val rU' = ( ( (~0.0109), (0.5907), (0.8068), (* dgf-base-tfo *) (0.2217), (~0.7853), (0.5780), (0.9751), (0.1852), (~0.1224), (~1.4225), (~11.0956), (~2.5217)), ( (~0.8313), (~0.4738), (~0.2906), (* P-O3'-275-tfo *) (0.0649), (0.4366), (~0.8973), (0.5521), (~0.7648), (~0.3322), (1.6833), (6.8060), (~7.0011)), ( (0.3445), (~0.7630), (0.5470), (* P-O3'-180-tfo *) (~0.4628), (~0.6450), (~0.6082), (0.8168), (~0.0436), (~0.5753), (~6.8179), (~3.9778), (~5.9887)), ( (0.5855), (0.7931), (~0.1682), (* P-O3'-60-tfo *) (0.8103), (~0.5790), (0.0906), (~0.0255), (~0.1894), (~0.9816), (6.1203), (~7.1051), (3.1984)), ( (2.6760), (~8.4960), (3.2880)), (* P *) ( (1.4950), (~7.6230), (3.4770)), (* O1P *) ( (2.9490), (~9.4640), (4.3740)), (* O2P *) ( (3.9730), (~7.5950), (3.0340)), (* O5' *) ( (5.2430), (~8.2420), (2.8260)), (* C5' *) ( (5.1974), (~8.8497), (1.9223)), (* H5' *) ( (5.5548), (~8.7348), (3.7469)), (* H5'' *) ( (6.3140), (~7.2060), (2.5510)), (* C4' *) ( (5.8744), (~6.2116), (2.4731)), (* H4' *) ( (7.2798), (~7.2260), (3.6420)), (* O4' *) ( (8.5733), (~6.9410), (3.1329)), (* C1' *) ( (8.9047), (~6.0374), (3.6446)), (* H1' *) ( (8.4429), (~6.6596), (1.6327)), (* C2' *) ( (9.2880), (~7.1071), (1.1096)), (* H2'' *) ( (8.2502), (~5.2799), (1.4754)), (* O2' *) ( (8.7676), (~4.7284), (2.0667)), (* H2' *) ( (7.1642), (~7.4416), (1.3021)), (* C3' *) ( (7.4125), (~8.5002), (1.2260)), (* H3' *) ( (6.5160), (~6.9772), (0.1267)), (* O3' *) ( (9.4531), (~8.1107), (3.4087)), (* N1 *) ( (11.5931), (~9.0015), (3.6357)), (* N3 *) ( (10.8101), (~7.8950), (3.3748)), (* C2 *) ( (11.1439), (~10.2744), (3.9206)), (* C4 *) ( (9.7056), (~10.4026), (3.9332)), (* C5 *) ( (8.9192), (~9.3419), (3.6833)), (* C6 *) (U ( ( (11.3013), (~6.8063), (3.1326)), (* O2 *) ( (11.9431), (~11.1876), (4.1375)), (* O4 *) ( (12.5840), (~8.8673), (3.6158)), (* H3 *) ( (9.2891), (~11.2898), (4.1313)), (* H5 *) ( (7.9263), (~9.4537), (3.6977))) (* H6 *) ) ) (* -- PARTIAL INSTANTIATIONS ------------------------------------------------*) type var = intg*tfo*nuc fun atom_pos atom (i,t,n) = tfo_apply t (atom n) fun get_var id ((i,t,n)::rest) = if id = i then (i,t,n) else get_var id rest (* -- SEARCH ----------------------------------------------------------------*) (* Queue operations (to efficiently append two lists of solutions) *) fun queue_to_list q = q val make_empty_queue = [] fun make_singleton_queue item = [item] fun append_queues q1 q2 = q1 @ q2 (* Sequential backtracking algorithm *) fun search partial_inst [] constraint = make_singleton_queue partial_inst | search partial_inst (h::t) constraint = search_aux partial_inst t constraint (h partial_inst) and search_aux partial_inst domains constraint [] = make_empty_queue | search_aux partial_inst domains constraint (h::t) = if constraint h partial_inst then append_queues (search (h::partial_inst) domains constraint) (search_aux partial_inst domains constraint t) else search_aux partial_inst domains constraint t (* -- DOMAINS ---------------------------------------------------------------*) (* Primary structure: strand A CUGCCACGUCUG, strand B CAGACGUGGCAG || || Secondary structure: strand A CUGCCACGUCUG || |||||||||||| || GACGGUGCAGAC strand B || || Tertiary structure: || || 5' end of strand A C1----G12 3' end of strand B || U2-------A11 || G3-------C10 || C4-----G9 || C5---G8 || A6 || G6-C7 || C5----G8 || A4-------U9 || G3--------C10 || A2-------U11 || 5' end of strand B C1----G12 3' end of strand A || || "helix", "stacked" and "connected" describe the spatial relationship || between two consecutive nucleotides. E.g. the nucleotides C1 and U2 || from the strand A. || || "wc" (stands for Watson-Crick and is a type of base-pairing), || and "wc-dumas" describe the spatial relationship between || nucleotides from two chains that are growing in opposite directions. || E.g. the nucleotides C1 from strand A and G12 from strand B. *) (* Dynamic Domains *) (* Given, || "ref" a nucleotide which is already positioned, || "nuc" the nucleotide to be placed, || and "tfo" a transformation matrix which expresses the desired || relationship between "ref" and "nuc", || the function "dgf-base" computes the transformation matrix that || places the nucleotide "nuc" in the given relationship to "ref". *) fun dgf_base tfo (i,t,n) nuc = let val x = if is_A n then tfo_align (tfo_apply t (nuc_C1' n)) (tfo_apply t (rA_N9 n)) (tfo_apply t (nuc_C4 n)) else if is_C n then tfo_align (tfo_apply t (nuc_C1' n)) (tfo_apply t (nuc_N1 n)) (tfo_apply t (nuc_C2 n)) else if is_G n then tfo_align (tfo_apply t (nuc_C1' n)) (tfo_apply t (rG_N9 n)) (tfo_apply t (nuc_C4 n)) else tfo_align (tfo_apply t (nuc_C1' n)) (tfo_apply t (nuc_N1 n)) (tfo_apply t (nuc_C2 n)) in tfo_combine (nuc_dgf_base_tfo nuc) (tfo_combine tfo (tfo_inv_ortho x)) end (* Placement of first nucleotide. *) fun reference nuc i partial_inst = [ (i,tfo_id,nuc) ] (* The transformation matrix for wc is from: || || Chandrasekaran R. et al (1989) A Re-Examination of the Crystal || Structure of A-DNA Using Fiber Diffraction Data. J. Biomol. || Struct. & Dynamics 6(6):1189-1202. *) val wc_tfo = ( (~1.0000), (0.0028), (~0.0019), (0.0028), (0.3468), (~0.9379), (~0.0019), (~0.9379), (~0.3468), (~0.0080), (6.0730), (8.7208) ) fun wc nuc i j partial_inst = [ (i,(dgf_base wc_tfo (get_var j partial_inst) nuc),nuc) ] val wc_Dumas_tfo = ( (~0.9737), (~0.1834), (0.1352), (~0.1779), (0.2417), (~0.9539), (0.1422), (~0.9529), (~0.2679), (0.4837), (6.2649), (8.0285) ) fun wc_Dumas nuc i j partial_inst = [ (i,(dgf_base wc_Dumas_tfo (get_var j partial_inst) nuc),nuc) ] val helix5'_tfo = ( (0.9886), (~0.0961), (0.1156), (0.1424), (0.8452), (~0.5152), (~0.0482), (0.5258), (0.8492), (~3.8737), (0.5480), (3.8024) ) fun helix5' nuc i j partial_inst = [ (i,(dgf_base helix5'_tfo (get_var j partial_inst) nuc),nuc) ] val helix3'_tfo = ( (0.9886), (0.1424), (~0.0482), (~0.0961), (0.8452), (0.5258), (0.1156), (~0.5152), (0.8492), (3.4426), (2.0474), (~3.7042) ) fun helix3' nuc i j partial_inst = [ (i,(dgf_base helix3'_tfo (get_var j partial_inst) nuc),nuc) ] val g37_a38_tfo = ( (0.9991), (0.0164), (~0.0387), (~0.0375), (0.7616), (~0.6470), (0.0189), (0.6478), (0.7615), (~3.3018), (0.9975), (2.5585) ) fun g37_a38 nuc i j partial_inst = (i,(dgf_base g37_a38_tfo (get_var j partial_inst) nuc),nuc) fun stacked5' nuc i j partial_inst = (g37_a38 nuc i j partial_inst) :: (helix5' nuc i j partial_inst) val a38_g37_tfo = ( (0.9991), (~0.0375), (0.0189), (0.0164), (0.7616), (0.6478), (~0.0387), (~0.6470), (0.7615), (3.3819), (0.7718), (~2.5321) ) fun a38_g37 nuc i j partial_inst = (i,(dgf_base a38_g37_tfo (get_var j partial_inst) nuc),nuc) fun stacked3' nuc i j partial_inst = (a38_g37 nuc i j partial_inst) :: (helix3' nuc i j partial_inst) fun p_o3' nucs i j partial_inst = let val (k,t,n) = get_var j partial_inst val align = tfo_inv_ortho (tfo_align (tfo_apply t (nuc_O3' n)) (tfo_apply t (nuc_C3' n)) (tfo_apply t (nuc_C4' n))) in List.concat (map (fn nuc => [ (i,(tfo_combine (nuc_p_o3'_60_tfo nuc) align),nuc), (i,(tfo_combine (nuc_p_o3'_180_tfo nuc) align),nuc), (i,(tfo_combine (nuc_p_o3'_275_tfo nuc) align),nuc) ]) nucs) end (* -- PROBLEM STATEMENT -----------------------------------------------------*) (* Define anticodon problem -- Science 253:1255 Figure 3a, 3b and 3c *) fun anticodon_domains () = [ reference rC 27, helix5' rC 28 27, helix5' rA 29 28, helix5' rG 30 29, helix5' rA 31 30, wc rU 39 31, helix5' rC 40 39, helix5' rU 41 40, helix5' rG 42 41, helix5' rG 43 42, stacked3' rA 38 39, stacked3' rG 37 38, stacked3' rA 36 37, stacked3' rA 35 36, stacked3' rG 34 35, (*<-. Distan, *) p_o3' rCs 32 31, (* | Constraint *) p_o3' rUs 33 32 (*<-' 3.0 Angstrom *) ] (* Anticodon constraint *) fun anticodon_constraint (i,t,n) partial_inst = if i = 33 then let val p = atom_pos nuc_P (get_var 34 partial_inst) val o3' = atom_pos nuc_O3' (i,t,n) in (pt_dist p o3') <= 3.0 end else true (* Anticodon*) fun anticodon () = queue_to_list (search [] (anticodon_domains ()) anticodon_constraint) fun anticodon_length () = length(anticodon()) fun pseudoknot_domains () = [ reference rA 23, wc_Dumas rU 8 23, helix3' rG 22 23, wc_Dumas rC 9 22, helix3' rG 21 22, wc_Dumas rC 10 21, helix3' rC 20 21, wc_Dumas rG 11 20, helix3' rU' 19 20, (* <-. *) wc_Dumas rA 12 19, (* | Distance *) (* | Constraint *) (* ; Helix 1 ; | 4.0 Angstroms *) helix3' rC 3 19, (* | *) wc_Dumas rG 13 3, (* | *) helix3' rC 2 3, (* | *) wc_Dumas rG 14 2, (* | *) helix3' rC 1 2, (* | *) wc_Dumas rG' 15 1, (* | *) (* | *) (* L2 LOOP | *) p_o3' rUs 16 15, (* | *) p_o3' rCs 17 16, (* | *) p_o3' rAs 18 17, (* <-' *) (* *) (* L1 LOOP *) helix3' rU 7 8, (* <-. *) p_o3' rCs 4 3, (* | Constraint *) stacked5' rU 5 4, (* | 4.5 Angstroms *) stacked5' rC 6 5 (* <-' *) ] fun pseudoknot_constraint (i, t, n) partial_inst = case i of 18 => let val p = atom_pos nuc_P (get_var 19 partial_inst) val o3' = atom_pos nuc_O3' (i, t, n) in pt_dist p o3' <= 4.0 end | 6 => let val p = atom_pos nuc_P (get_var 7 partial_inst) val o3' = atom_pos nuc_O3' (i, t, n) in pt_dist p o3' <= 4.5 end | _ => true fun pseudoknot () = search [] (pseudoknot_domains ()) pseudoknot_constraint fun maximum (xs: real list) = let fun loop (m, l) = case l of [] => m | x :: l => loop (if x > m then x else m, l) in case xs of [] => raise Fail "bug" | x :: xs => loop (x, xs) end fun list_of_common_atoms n = [ nuc_P n, nuc_O1P n, nuc_O2P n, nuc_O5' n, nuc_C5' n, nuc_H5' n, nuc_H5'' n, nuc_C4' n, nuc_H4' n, nuc_O4' n, nuc_C1' n, nuc_H1' n, nuc_C2' n, nuc_H2'' n, nuc_O2' n, nuc_H2' n, nuc_C3' n, nuc_H3' n, nuc_O3' n, nuc_N1 n, nuc_N3 n, nuc_C2 n, nuc_C4 n, nuc_C5 n, nuc_C6 n ] fun list_of_specific_atoms n = if is_A n then [ rA_N6 n, rA_N7 n, rA_N9 n, rA_C8 n, rA_H2 n, rA_H61 n, rA_H62 n, rA_H8 n ] else if is_C n then [ rC_N4 n, rC_O2 n, rC_H41 n, rC_H42 n, rC_H5 n, rC_H6 n ] else if is_G n then [ rG_N2 n, rG_N7 n, rG_N9 n, rG_C8 n, rG_O6 n, rG_H1 n, rG_H21 n, rG_H22 n, rG_H8 n ] else [ rU_O2 n, rU_O4 n, rU_H3 n, rU_H5 n, rU_H6 n ] fun list_of_atoms n = List.@ (list_of_common_atoms n, list_of_specific_atoms n) fun var_most_distant_atom (i, t, n) = let fun distance pos = let val (x, y, z) = tfo_apply t pos in Real.Math.sqrt (x * x + y * y + z * z) end in maximum (List.map distance (list_of_atoms n)) end fun sol_most_distant_atom s = maximum (List.map var_most_distant_atom s) fun most_distant_atom sols = maximum (List.map sol_most_distant_atom sols) fun doit () = let val result = most_distant_atom (pseudoknot ()) val x = result / 33.797594890762724 val _ = if x > 0.999999 andalso x < 1.000001 then () else raise Fail "bug" in () end end; signature BMARK = sig val doit : int -> unit end; (* main.sml * * COPYRIGHT (c) 1996 AT&T Research. *) structure Main : BMARK = struct val doit = Nucleic.doit val doit = fn size => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop size end end; mlton-20100608/benchmark/tests/output1.sml0000644000076600000240000000076311404435630017017 0ustar mtfstaffstructure Main = struct fun once () = let val count = 1000000000 open TextIO val out = openOut "/dev/null" fun loop n = if n = 0 then () else (output1 (out, #"a"); loop (n - 1)) val _ = loop count val _ = closeOut out in () end fun doit n = if n = 0 then () else (once (); doit (n - 1)) end mlton-20100608/benchmark/tests/peek.sml0000644000076600000240000000250611404435630016317 0ustar mtfstaff(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Plist: sig type t val new: unit -> t val addPeek: unit -> {add: t * 'a -> unit, peek: t -> 'a option} end = struct datatype t = T of exn list ref fun new () = T (ref []) fun addPeek () = let exception E of 'a fun add (T r, x) = r := E x :: !r fun peek (T r) = let val rec loop = fn [] => NONE | E x :: _ => SOME x | _ :: l => loop l in loop (!r) end in {add = add, peek = peek} end end structure Main = struct fun inner () = let val l = Plist.new () val {add, peek} = Plist.addPeek () val _ = add (l, 13) fun loop (i, ac) = if i = 0 then ac else loop (i - 1, ac + valOf (peek l)) val n = loop (10000000, 0) val _ = print (concat [Int.toString n, "\n"]) in () end fun doit size = let fun loop i = if i = 0 then () else (inner (); loop (i - 1)) in loop 1000 end end mlton-20100608/benchmark/tests/psdes-random.sml0000644000076600000240000000366011404435630017771 0ustar mtfstaff(* Written by Stephen Weeks (sweeks@sweeks.com). *) (* * Random number generator based on page 302 of Numerical Recipes in C. *) fun once () = let fun natFold (start, stop, ac, f) = let fun loop (i, ac) = if i = stop then ac else loop (i + 1, f (i, ac)) in loop (start, ac) end val niter: int = 4 open Word32 fun make (l: word list) = let val a = Array.fromList l in fn i => Array.sub (a, i) end val c1 = make [0wxbaa96887, 0wx1e17d32c, 0wx03bdcd3c, 0wx0f33d1b2] val c2 = make [0wx4b0f3b58, 0wxe874f0c3, 0wx6955c5a6, 0wx55a7ca46] val half: Word.word = 0w16 fun reverse w = orb (>> (w, half), << (w, half)) fun psdes (lword: word, irword: word): word * word = natFold (0, niter, (lword, irword), fn (i, (lword, irword)) => let val ia = xorb (irword, c1 i) val itmpl = andb (ia, 0wxffff) val itmph = >> (ia, half) val ib = itmpl * itmpl + notb (itmph * itmph) in (irword, xorb (lword, itmpl * itmph + xorb (c2 i, reverse ib))) end) val zero: word = 0wx13 val lword: word ref = ref 0w13 val irword: word ref = ref 0w14 val needTo = ref true fun word () = if !needTo then let val (l, i) = psdes (!lword, !irword) val _ = lword := l val _ = irword := i val _ = needTo := false in l end else (needTo := true ; !irword) fun loop (i, w) = if i = 0 then if w = 0wx132B1B67 then () else raise Fail "bug" else loop (Int.- (i, 1), w + word()) in loop (150000000, 0w0) end structure Main = struct fun doit n = if n = 0 then () else (once () ; doit (n - 1)) end val _ = Main.doit 2 mlton-20100608/benchmark/tests/ratio-regions.sml0000644000076600000240000007345611404435630020171 0ustar mtfstaff(* * Translated from Jeff Siskind's Scheme code by Stephen Weeks * (sweeks@sweeks.com). * Here is the description from Jeff Siskind (qobi@research.nj.nec.com) * * It is an implementation of Ratio * Regions, an image segmentation/contour finding technique due to Ingemar Cox, * Satish Rao, and Yu Zhong. The algorithm is a reduction to max flow, an * unpublished technique that Satish described to me. Peter Blicher originally * implemented this via a translation to Andrew Goldberg's generic max-flow code. * I've reimplemented it, specializing the max-flow algorithm to the particular * graphs that are produced by Satish's reduction instead of using Andrew's code. * The max-flow algorithm is preflow-push with periodic relabeling and a * wave-based heuristic for scheduling pushes and lifts due to Sebastien Roy. *) fun print _ = () local fun doo(max: int, f: int -> unit): unit = let fun loop i = if i >= max then () else (f i; loop(i + 1)) in loop 0 end fun zero x = x = 0 val cons = op :: val make_vector = Array.array val vector_length = Array.length val vector_ref = Array.sub val vector_set = Array.update val map_n_vector = Array.tabulate val string_length = String.size val string_ref = String.sub fun write_char c = () (* TextIO.output1(TextIO.stdOut, c) *) val modulo = Int.mod val quotient = Int.quot fun for_each(l, f) = List.app f l fun negative x = x < 0 fun positive x = x > 0 fun min l = case l of x :: l => let fun loop(l, min) = case l of [] => min | x :: l => loop(l, Int.min(min, x)) in loop(l, x) end | _ => raise Fail "min" fun every_n(n, p) = let fun loop i = i >= n orelse (p i andalso loop(i + 1)) in loop 0 end fun some(l, p) = List.exists p l fun some_n(n, p) = let fun loop i = i < n andalso (p i orelse loop(i + 1)) in loop 0 end fun some_vector(v, p) = let fun loop i = i < vector_length v andalso (p(vector_ref(v, i)) orelse loop(i + 1)) in loop 0 end fun x(x, _) = x fun y(_, y) = y datatype 'a matrix = Matrix of 'a array array fun make_matrix(m: int, n: int, a: 'a): 'a matrix = Matrix(map_n_vector(m, fn i => make_vector(n, a))) fun matrix_rows(Matrix a) = vector_length a fun matrix_columns(Matrix a) = vector_length(vector_ref(a, 0)) fun matrix_ref(Matrix a, i, j) = vector_ref(vector_ref(a, i), j) fun matrix_set(Matrix a, i, j, x) = vector_set(vector_ref(a, i), j, x) datatype pormatValue = Int of int | String of string fun pormat(control_string: string, values: pormatValue list): unit = let fun loop(i: int, values: pormatValue list): unit = if not(i = string_length control_string) then let val c = string_ref(control_string, i) in if c = #"~" then let val c2 = string_ref(control_string, i + 1) in case (c2, values) of (#"s", Int n :: values) => (print(Int.toString n) ; loop(i + 2, values)) | (#"a", String s :: values) => (print s ; loop(i + 2, values)) | (#"%", _) => (print "\n"; loop(i + 2, values)) | _ => (write_char c; loop(i + 1, values)) end else (write_char c ; loop(i + 1, values)) end else () in loop(0, values) end (* The vertices are s, t, and (y,x). * C_RIGHT[y,x] is the capacity from (y,x) to (y,x+1) which is the same as the * capacity from (y,x+1) to (y,x). * C_DOWN[y,x] is the capacity from (y,x) to (y+1,x) which is the same as the * capacity from (y+1,x) to (y,x). * The capacity from s to (y,0), (0,x), (y,Y_1), (0,X_1) is implicitly * infinite. * The capacity from (x,y) to t is V*W[y,x]. * F_RIGHT[y,x] is the preflow from (y,x) to (y,x+1) which is the negation of * the preflow from (y,x+1) to (y,x). * F_DOWN[y,x] is the preflow from (y,x) to (y+1,x) which is the negation of * the preflow from (y+1,x) to (y,x). * We do not record the preflow from s to (y,X_1), (y,0), (Y_1,x), and (0,x) * and from (y,X_1), (y,0), (Y_1,x), and (0,x) to s. * F_T[y,x] is the preflow from (y,x) to t. * We do not record the preflow from t to (y,x). * {C,F}_RIGHT[0:Y_1,0:X_2]. * {C,F}_DOWN[0:Y_2,0:X_1]. * F_T[0:Y_1,0:X_1] * For now, we will keep all capacities (and thus all preflows) as integers. * (CF_RIGHT y x) is the residual capacity from (y,x) to (y,x+1). * (CF_LEFT y x) is the residual capacity from (y,x) to (y,x_1). * (CF_DOWN y x) is the residual capacity from (y,x) to (y+1,x). * (CF_UP y x) is the residual capacity from (y,x) to (y_1,x). * We do not compute the residual capacities from s to (y,X_1), (y,0), * (Y_1,x), and (0,x) because they are all infinite. * We do not compute the residual capacities from (y,X_1), (y,0), (Y_1,x), * and (0,x) to s because they will never be used. * (CF_T y x) is the residual capacity from (y,x) to t. * We do not compute the residual capacity from t to (y,x) because it will * be used. * (EF_RIGHT? y x) is true if there is an edge from (y,x) to (y,x+1) in the * residual network. * (EF_LEFT? y x) is true if there is an edge from (y,x) to (y,x_1) in the * residual network. * (EF_DOWN? y x) is true if there is an edge from (y,x) to (y+1,x) in the * residual network. * (EF_UP? y x) is true if there is an edge from (y,x) to (y_1,x) in the * residual network. * (EF_T? y x) is true if there is an edge from (y,x) to t in the * residual network. * There are always edges in the residual network from s to (y,X_1), (y,0), * (Y_1,x), and (0,x). * We don't care whether there are edges in the residual network from * (y,X_1), (y,0), (Y_1,x), and (0,x) to s because they will never be used. * We don't care whether there are edges in the residual network from t to * (y,x) because they will never be used. *) fun positive_min(x, y) = if negative x then y else Int.min(x, y) fun positive_minus(x, y) = if negative x then x else x - y fun positive_plus(x, y) = if negative x then x else x + y fun rao_ratio_region(c_right, c_down, w, lg_max_v) = let val height = matrix_rows w val width = matrix_columns w val f_right = make_matrix(height, width - 1, 0) val f_down = make_matrix(height - 1, width, 0) val f_t = make_matrix(height, width, 0) val h = make_matrix(height, width, 0) val e = make_matrix(height, width, 0) val marked = make_matrix(height, width, false) val m1 = height * width + 2 val m2 = 2 * height * width + 2 val q = make_vector(2 * height * width + 3, []) fun cf_right(y, x) = matrix_ref(c_right, y, x) - matrix_ref(f_right, y, x) fun cf_left(y, x) = matrix_ref(c_right, y, x - 1) + matrix_ref(f_right, y, x - 1) fun cf_down(y, x) = matrix_ref(c_down, y, x) - matrix_ref(f_down, y, x) fun cf_up(y, x) = matrix_ref(c_down, y - 1, x) + matrix_ref(f_down, y - 1, x) fun ef_right(y, x) = positive(cf_right(y, x)) fun ef_left(y, x) = positive(cf_left(y, x)) fun ef_down(y, x) = positive(cf_down(y, x)) fun ef_up(y, x) = positive(cf_up(y, x)) fun preflow_push v = let fun enqueue(y, x) = if not(matrix_ref(marked, y, x)) then (vector_set(q, matrix_ref(h, y, x), (cons((x, y), vector_ref(q, matrix_ref(h, y, x))))) ; matrix_set(marked, y, x, true)) else () fun cf_t(y, x) = v * matrix_ref(w, y, x) - matrix_ref(f_t, y, x) fun ef_t(y, x) = positive(cf_t(y, x)) fun can_push_right(y, x) = x < width - 1 andalso not(zero(matrix_ref(e, y, x))) andalso ef_right(y, x) andalso matrix_ref(h, y, x) = matrix_ref(h, y, x + 1) + 1 fun can_push_left(y, x) = x > 0 andalso not(zero(matrix_ref(e, y, x))) andalso ef_left(y, x) andalso matrix_ref(h, y, x) = matrix_ref(h, y, x - 1) + 1 fun can_push_down(y, x) = y < height - 1 andalso not(zero(matrix_ref(e, y, x))) andalso ef_down(y, x) andalso matrix_ref(h, y, x) = matrix_ref(h, y + 1, x) + 1 fun can_push_up(y, x) = y > 0 andalso not(zero(matrix_ref(e, y, x))) andalso ef_up(y, x) andalso matrix_ref(h, y, x) = matrix_ref(h, y - 1, x) + 1 fun can_push_t(y, x) = not(zero(matrix_ref(e, y, x))) andalso ef_t(y, x) andalso matrix_ref(h, y, x) = 1 fun can_lift(y, x) = not(zero(matrix_ref(e, y, x))) andalso (if x = width - 1 then matrix_ref(h, y, x) <= m1 else (not(ef_right(y, x)) orelse matrix_ref(h, y, x) <= matrix_ref(h, y, x + 1))) andalso (if x = 0 then matrix_ref(h, y, x) <= m1 else (not(ef_left(y, x)) orelse matrix_ref(h, y, x) <= matrix_ref(h, y, x - 1))) andalso (if y = height - 1 then matrix_ref(h, y, x) <= m1 else (not(ef_down(y, x)) orelse matrix_ref(h, y, x) <= matrix_ref(h, y + 1, x))) andalso (if y = 0 then matrix_ref(h, y, x) <= m1 else (not(ef_up(y, x)) orelse matrix_ref(h, y, x) <= matrix_ref(h, y - 1, x))) andalso (not(ef_t(y, x)) orelse matrix_ref(h, y, x) = 0) fun push_right(y, x) = (* (pormat "Push right ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_right(y, x)) in matrix_set(f_right, y, x, matrix_ref(f_right, y, x) + df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) ; matrix_set(e, y, x + 1, positive_plus(matrix_ref(e, y, x + 1), df_u_v)) ; enqueue(y, x + 1) end fun push_left(y, x) = (* (pormat "Push left ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_left(y, x)) in matrix_set(f_right, y, x - 1, matrix_ref(f_right, y, x - 1) - df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) ; matrix_set(e, y, x - 1, positive_plus(matrix_ref(e, y, x - 1), df_u_v)) ; enqueue(y, x - 1) end fun push_down(y, x) = (* (pormat "Push down ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_down(y, x)) in matrix_set(f_down, y, x, matrix_ref(f_down, y, x) + df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) ; matrix_set(e, y + 1, x, positive_plus(matrix_ref(e, y + 1, x), df_u_v)) ; enqueue(y + 1, x) end fun push_up(y, x) = (* ;;(pormat "Push up ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_up(y, x)) in matrix_set(f_down, y - 1, x, matrix_ref(f_down, y - 1, x) - df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) ; matrix_set(e, y - 1, x, positive_plus(matrix_ref(e, y - 1, x), df_u_v)) ; enqueue(y - 1, x) end fun push_t(y, x) = (* ;;(pormat "Push t ~s ~s~%" y x) *) let val df_u_v = positive_min(matrix_ref(e, y, x), cf_t(y, x)) in matrix_set(f_t, y, x, matrix_ref(f_t, y, x) + df_u_v) ; matrix_set(e, y, x, positive_minus(matrix_ref(e, y, x), df_u_v)) end fun lift(y, x) = (* ;;(pormat "Lift ~s ~s~%" y x) *) matrix_set (h, y, x, 1 + min[if x = width - 1 then m1 else if ef_right(y, x) then matrix_ref(h, y, x + 1) else m2, if x = 0 then m1 else if ef_left(y, x) then matrix_ref(h, y, x - 1) else m2, if y = height - 1 then m1 else if ef_down(y, x) then matrix_ref(h, y + 1, x) else m2, if y = 0 then m1 else if ef_up(y, x) then matrix_ref(h, y - 1, x) else m2, if ef_t(y, x) then 0 else m2]) fun relabel() = (* ;;(pormat "Relabel~%") *) let datatype 'a queue = Nil | Cons of 'a * 'a queue ref fun null(q: 'q queue ref) = case !q of Nil => true | _ => false val q: (int * int) queue ref = ref Nil val tail: (int * int) queue ref = ref Nil fun enqueue(y, x, value) = if value < matrix_ref(h, y, x) then (matrix_set(h, y, x, value) ; if not(matrix_ref(marked, y, x)) then (matrix_set(marked, y, x, true) ; (case !tail of Nil => (tail := Cons((x, y), ref Nil) ; q := !tail) | Cons(_, cdr) => (cdr := Cons((x, y), ref Nil) ; tail := !cdr))) else ()) else () fun dequeue() = case !q of Nil => raise Fail "dequeue" | Cons(p, rest) => (matrix_set(marked, y p, x p, false) ; q := !rest ; if null q then tail := Nil else () ; p) in doo(height, fn y => doo(width, fn x => (matrix_set(h, y, x, m1) ; matrix_set(marked, y, x, false)))) ; doo(height, fn y => doo(width, fn x => if ef_t(y, x) andalso matrix_ref(h, y, x) > 1 then enqueue(y, x, 1) else ())) ; let fun loop() = if not(null q) then (let val p = dequeue() val x = x p val y = y p val value = matrix_ref(h, y, x) + 1 in if x > 0 andalso ef_right(y, x - 1) then enqueue(y, x - 1, value) else () ; if x < width - 1 andalso ef_left(y, x + 1) then enqueue(y, x + 1, value) else () ; if y > 0 andalso ef_down(y - 1, x) then enqueue(y - 1, x, value) else () ; if y < height - 1 andalso ef_up(y + 1, x) then enqueue(y + 1, x, value) else () end ; loop()) else () in loop() end end (* relabel *) in doo(height, fn y => doo(width, fn x => (matrix_set(e, y, x, 0) ; matrix_set(f_t, y, x, 0)))) ; doo(height, fn y => doo(width - 1, fn x => matrix_set(f_right, y, x, 0))) ; doo(height - 1, fn y => doo(width, fn x => matrix_set(f_down, y, x, 0))) ; doo(height, fn y => (matrix_set(e, y, width - 1, ~1) ; matrix_set(e, y, 0, ~1))) ; doo(width - 1, fn x => (matrix_set(e, height - 1, x, ~1) ; matrix_set(e, 0, x, ~1))) ; let val pushes = ref 0 val lifts = ref 0 val relabels = ref 0 fun loop(i, p) = if zero(modulo(i, 6)) andalso not p then (relabel() ; relabels := !relabels + 1 ; if every_n(height, fn y => every_n(width, fn x => zero(matrix_ref(e, y, x)) orelse matrix_ref(h, y, x) = m1)) then (* Every vertex with excess capacity is not reachable from the sink in * the inverse residual network. So terminate early because we have * already found a min cut. In this case, the preflows and excess * capacities will not be correct. But the cut is indicated by the * heights. Vertices reachable from the source have height * HEIGHT * WIDTH + 2 while vertices reachable from the sink have * smaller height. Early termination is necessary with relabeling to * prevent an infinite loop. The loop arises because vertices that are * not reachable from the sink in the inverse residual network have * their height reset to HEIGHT * WIDTH + 2 by the relabeling * process. If there are such vertices with excess capacity, this is * not high enough for the excess capacity to be pushed back to the * perimeter. So after relabeling, vertices get lifted to try to push * excess capacity back to the perimeter but then a relabeling happens * to soon and foils this lifting. Terminating when all vertices with * excess capacity are not reachable from the sink in the inverse * residual network eliminates this problem. *) (pormat ("~s push~a, ~s lift~a, ~s relabel~a, ~s wave~a, terminated early~%", [Int(! pushes), String(if !pushes = 1 then "" else "es"), Int(! lifts), String(if !lifts = 1 then "" else "s"), Int(! relabels), String(if !relabels = 1 then "" else "s"), Int i, String(if i = 1 then "" else "s")])) else (* We need to rebuild the priority queue after relabeling since the * heights might have changed and the priority queue is indexed by * height. This also assumes that a relabel is done before any pushes * or lifts. *) (doo(vector_length q, fn k => vector_set(q, k, [])) ; doo(height, fn y => doo(width, fn x => matrix_set(marked, y, x, false))) ; doo(height, fn y => doo(width, fn x => if not(zero(matrix_ref(e, y, x))) then enqueue(y, x) else ())) ; loop(i, true))) else if some_vector(q, fn ps => some(ps, fn p => let val x = x p val y = y p in can_push_right(y, x) orelse can_push_left(y, x) orelse can_push_down(y, x) orelse can_push_up(y, x) orelse can_push_t(y, x) orelse can_lift(y, x) end)) then ( let fun loop k = if not(negative k) then ( let val ps = vector_ref(q, k) in vector_set(q, k, []) ; (for_each (ps, fn p => matrix_set(marked, y p, x p, false))) ; (for_each (ps, fn p => let val x = x p val y = y p in if can_push_right(y, x) then (pushes := !pushes + 1 ; push_right(y, x)) else () ; if can_push_left(y, x) then (pushes := !pushes + 1 ; push_left(y, x)) else () ; if can_push_down(y, x) then (pushes := !pushes + 1 ; push_down(y, x)) else () ; if can_push_up(y, x) then (pushes := !pushes + 1 ; push_up(y, x)) else () ; if can_push_t(y, x) then (pushes := !pushes + 1 ; push_t(y, x)) else () ; if can_lift(y, x) then (lifts := !lifts + 1 ; lift(y, x)) else () ; if not(zero(matrix_ref(e, y, x))) then enqueue(y, x) else () end)) end ; loop(k - 1)) else () in loop(vector_length q - 1) end ; loop(i + 1, false)) else (* This is so MIN_CUT and MIN_CUT_INCLUDES_EVERY_EDGE_TO_T work. *) (relabel() ; relabels := !relabels + 1 ; (pormat("~s push~a, ~s lift~a, ~s relabel~a, ~s wave~a~%", [Int(! pushes), String(if !pushes = 1 then "" else "es"), Int(! lifts), String(if !lifts = 1 then "" else "s"), Int(! relabels), String(if !relabels = 1 then "" else "s"), Int i, String(if i = 1 then "" else "s")]))) in loop(0, false) end end fun min_cut_includes_every_edge_to_t() = (* This requires that a relabel was done immediately before returning from * PREFLOW_PUSH. *) every_n(height, fn y => every_n(width, fn x => matrix_ref(h, y, x) = m1)) fun min_cut() = (* This requires that a relabel was done immediately before returning from * PREFLOW_PUSH *) map_n_vector (height, fn y => map_n_vector(width, fn x => not(matrix_ref(h, y, x) = m1))) fun loop(lg_v, v_max) = if negative lg_v then (pormat("V-MAX=~s~%",[Int v_max]) ; preflow_push(v_max + 1) ; min_cut()) else let val v = v_max + let fun loop(i, c) = if (zero i) then c else loop(i - 1, c + c) in loop(lg_v, 1) end in pormat("LG-V=~s, V-MAX=~s, V=~s~%", [Int lg_v, Int v_max, Int v]) ; preflow_push v ; loop(lg_v - 1, if min_cut_includes_every_edge_to_t() then v else v_max) end in loop(lg_max_v, 0) end in fun doit n = let val height = n val width = n val lg_max_v = 15 val c_right = make_matrix(height, width - 1, ~1) val c_down = make_matrix(height - 1, width, ~1) in doo(height, fn y => doo(width - 1, fn x => matrix_set (c_right, y, x, if (y >= quotient(height, 4) andalso y < quotient(3 * height, 4) andalso (x = quotient(width, 4) - 1 orelse x = quotient(3 * width, 4) - 1)) then 1 else 128))) ; doo(height - 1, fn y => doo(width, fn x => matrix_set (c_down, y, x, if (x >= quotient(width, 4) andalso x < quotient(3 * width, 4) andalso (y = quotient(height, 4) - 1 orelse y = quotient(3 * height, 4) - 1)) then 1 else 128))) ; rao_ratio_region(c_right, c_down, make_matrix(height, width, 1), lg_max_v) end end structure Main = struct val doit = doit end mlton-20100608/benchmark/tests/ray.sml0000644000076600000240000003437111404435630016173 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) (* objects.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories * * Type declarations for the various objects in the ray tracer. *) structure Objects = struct datatype point = PT of {x : real, y : real, z : real} datatype vector = VEC of {l : real, m : real, n : real} datatype ray = Ray of {s : point, d : vector} datatype camera = Camera of { vp : point, ul : point, ur : point, ll : point, lr : point } datatype color = Color of {red : real, grn : real, blu : real} datatype sphere = Sphere of {c : point, r : real, color : color} datatype hit = Miss | Hit of {t : real, s : sphere} datatype visible = Visible of {h : point, s : sphere} datatype object = TOP | NUMBER of real | NAME of string | LIST of object list | OPERATOR of object list -> object list | MARK | LITERAL of string | UNMARK | POINT of point | VECTOR of vector | RAY of ray | CAMERA of camera | COLOR of color | SPHERE of sphere | HIT | VISIBLE end (* Objects *) (* interp.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories *) structure Interp = struct local val exit = OS.Process.exit fun ordof(s, i) = Char.ord(String.sub(s, i)) exception NotAChar exception NotAReal fun fromStr x = (case Char.fromString x of SOME c => c | NONE => raise NotAChar) fun strToReal s = (case Real.fromString s of SOME r => r | _ => raise NotAReal) fun intToReal x = (strToReal ((Int.toString x) ^ ".0")) val explode = (fn x => map Char.toString (explode x)) val implode = (fn x => implode (map fromStr x)) open Objects val dict = ref ([] : {key : string, value : object} list) fun dictInsert (NAME key, value) = let fun find [] = [{key=key, value=value}] | find (x::r) = if (key = #key x) then {key=key, value=value}::r else x :: (find r) in dict := find(!dict) end | dictInsert _ = raise Fail "dictInsert" fun prObj outStrm obj = let fun printf args = TextIO.output(outStrm, implode args) fun pr (NUMBER n) = printf[" ", Real.toString n, "\n"] | pr (NAME s) = printf[" ", s, "\n"] | pr (LITERAL s) = printf[" ", s, "\n"] | pr (LIST l) = app pr l | pr MARK = printf[" MARK\n"] | pr (OPERATOR _) = printf[" \n"] | pr TOP = printf[" TOP OF STACK\n"] | pr _ = printf[" \n"] in pr obj end in exception Stop fun error opName stk = let fun prStk ([], _) = () | prStk (_, 0) = () | prStk (obj::r, i) = (prObj TextIO.stdErr obj; prStk(r, i-1)) in TextIO.output(TextIO.stdErr, "ERROR: "^opName^"\n"); prStk (stk, 10); raise (Fail opName) end fun installOperator (name, rator) = dictInsert (NAME name, OPERATOR rator) fun ps_def (v::k::r) = (dictInsert(k, v); r) | ps_def stk = error "ps_def" stk local fun binOp (f, opName) = let fun g ((NUMBER arg1)::(NUMBER arg2)::r) = NUMBER(f(arg2, arg1)) :: r | g stk = error opName stk in g end in val ps_add = binOp (op +, "add") val ps_sub = binOp (op -, "sub") val ps_mul = binOp (op *, "mul") val ps_div = binOp (op /, "div") end fun ps_rand stk = (NUMBER 0.5)::stk (** ??? **) fun ps_print (obj::r) = (prObj TextIO.stdOut obj; r) | ps_print stk = error "print" stk fun ps_dup (obj::r) = (obj::obj::r) | ps_dup stk = error "dup" stk fun ps_stop _ = raise Stop (* initialize dictionary and begin parsing input *) fun parse inStrm = let fun getc () = case TextIO.input1 inStrm of NONE => "" | SOME c => Char.toString c fun peek () = case TextIO.lookahead inStrm of SOME x => Char.toString x | _ => "" (* parse one token from inStrm *) fun toke deferred = let fun doChar "" = exit OS.Process.success | doChar "%" = let fun lp "\n" = doChar(getc()) | lp "" = exit OS.Process.success | lp _ = lp(getc()) in lp(getc()) end | doChar "{" = (MARK, deferred+1) | doChar "}" = (UNMARK, deferred-1) | doChar c = if Char.isSpace (fromStr c) then doChar(getc()) else let fun lp buf = (case peek() of "{" => buf | "}" => buf | "%" => buf | c => if Char.isSpace(fromStr c) then buf else (getc(); lp(c::buf)) (* end case *)) val tok = implode (rev (lp [c])) val hd = ordof(tok, 0) in if (hd = ord (#"/")) then (LITERAL(substring(tok, 1, size tok - 1)), deferred) else if ((Char.isDigit (chr hd)) orelse (hd = ord (#"-"))) then (NUMBER(strToReal(tok)), deferred) else (NAME tok, deferred) end in doChar(getc()) end (* execute a token (if not deferred) *) fun exec (UNMARK, stk, _) = let fun lp ([], _) = raise Fail "MARK" | lp (MARK::r, l) = (LIST l)::r | lp (x::r, l) = lp (r, x::l) in lp (stk, []) end | exec (OPERATOR f, stk, 0) = f stk | exec (LIST l, stk, 0) = let fun execBody ([], stk) = stk | execBody (obj::r, stk) = (exec(obj, stk, 0); execBody(r, stk)) in execBody (l, stk) end | exec (NAME s, stk, 0) = let fun find [] = raise Fail "undefined name" | find ({key, value}::r) = if (key = s) then value else find r in exec (find (!dict), stk, 0) end | exec (obj, stk, _) = obj::stk fun lp (stk, level) = let val (obj, level) = toke level val stk = exec (obj, stk, level) in lp (stk, level) end in installOperator ("add", ps_add); installOperator ("def", ps_def); installOperator ("div", ps_div); installOperator ("dup", ps_dup); installOperator ("mul", ps_mul); installOperator ("print", ps_print); installOperator ("rand", ps_rand); installOperator ("stop", ps_stop); installOperator ("sub", ps_sub); (lp ([], 0)) handle Stop => () end (* parse *) end (* local *) end (* Interp *) (* ray.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories *) structure Ray = struct local open Objects in (** basic operations on points and vectors **) fun scaleVector (s, VEC{l, m, n}) = VEC{l=s*l, m=s*m, n=s*n} fun vecPlusVec (VEC{l, m, n}, VEC{l=l', m=m', n=n'}) = VEC{l=l+l', m=m+m', n=n+n'} fun vecPlusPt (VEC{l, m, n}, PT{x, y, z}) = PT{x=x+l, y=y+m, z=z+n} fun ptMinusPt (PT{x, y, z}, PT{x=x', y=y', z=z'}) = VEC{l=x-x', m=y-y', n=z-z'} fun wave (PT{x, y, z}, PT{x=x', y=y', z=z'}, w) = PT{ x = w * (x' - x) + x, y = w * (y' - y) + y, z = w * (z' - z) + z } fun dotProd (VEC{l, m, n}, VEC{l=l', m=m', n=n'}) = ((l*l') + (m*m') + (n*n')) (* normal vector to sphere *) fun normalSphere (Visible{h, s as Sphere{c, ...}}) = let val n = ptMinusPt(h, c) val norm = Math.sqrt(dotProd(n, n)) in scaleVector(1.0 / norm, n) end (* intersect a ray with a sphere *) fun intersectSphere (Ray ray, s as Sphere sphere) = let val a = dotProd(#d ray, #d ray) val sdiffc = ptMinusPt(#s ray, #c sphere) val b = 2.0 * dotProd(sdiffc, #d ray) val c = dotProd(sdiffc, sdiffc) - (#r sphere * #r sphere) val d = b*b - 4.0*a*c in if (d <= 0.0) then Miss else let val d = Math.sqrt(d) val t1 = (~b - d) / (2.0 * a) val t2 = (~b + d) / (2.0 * a) val t = if ((t1 > 0.0) andalso (t1 < t2)) then t1 else t2 in Hit{t=t, s=s} end end (* simple shading function *) fun shade {light, phi} (visible as Visible{h, s}) = let val l = ptMinusPt(light, h) val n = normalSphere(visible) val irradiance = phi * dotProd(l,n) / dotProd(l,l); val irradiance = (if (irradiance < 0.0) then 0.0 else irradiance) + 0.05 val Sphere{color=Color{red, grn, blu}, ...} = s in Color{red=red*irradiance, grn=grn*irradiance, blu=blu*irradiance} end fun trace (ray as (Ray ray'), objList) = let fun closest (Miss, x) = x | closest (x, Miss) = x | closest (h1 as Hit{t=t1, ...}, h2 as Hit{t=t2, ...}) = if (t2 < t1) then h2 else h1 fun lp ([], Hit{t, s}) = Visible{ h = vecPlusPt(scaleVector(t, #d ray'), #s ray'), s = s } | lp (s :: r, closestHit) = lp (r, closest (closestHit, intersectSphere (ray, s))) | lp _ = raise Fail "trace" in lp (objList, Miss) end fun camera (Camera cam) (x, y) = let val l = wave (#ul cam, #ll cam, y) val r = wave (#ur cam, #lr cam, y) val image_point = wave(l, r, x) in Ray{d = ptMinusPt(image_point, #vp cam), s = #vp cam} end val shade = shade {light = PT{x = 10.0, y = ~10.0, z = ~10.0}, phi = 16.0} val camera = camera (Camera{ vp = PT{x = 0.0, y = 0.0, z = ~3.0}, ul = PT{x = ~1.0, y = ~1.0, z = 0.0}, ur = PT{x = 1.0, y = ~1.0, z = 0.0}, ll = PT{x = ~1.0, y = 1.0, z = 0.0}, lr = PT{x = 1.0, y = 1.0, z = 0.0} }) fun image objList (x, y) = shade (trace(camera(x, y), objList)) fun picture (picName, objList) = let val outStrm = TextIO.openOut picName val image = image objList val print = fn x => TextIO.output (outStrm, x) fun putc c = TextIO.output1(outStrm, chr c) fun doPixel (i, j) = let val x = (real i) / 512.0 val y = (real j) / 512.0 val (Color c) = image (x, y) fun cvt x = if (x >= 1.0) then 255 else floor(256.0*x) in putc (cvt (#red c)); putc (cvt (#grn c)); putc (cvt (#blu c)) end fun lp_j j = if (j < 512) then let fun lp_i i = if (i < 512) then (doPixel(i, j); lp_i(i+1)) else () in lp_i 0; lp_j(j+1) end else () in print "TYPE=dump\n"; print "WINDOW=0 0 512 512\n"; print "NCHAN=3\n"; print "CHAN=rgb\n"; print "\n"; lp_j 0; TextIO.closeOut outStrm end end (* local *) end; (* Ray *) (* interface.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories * * The interface between the interpreter and the ray tracer. *) structure Interface = struct local open Objects in (* color pops three numbers and pushes a color object. * usage: red-value green-value blue-value color *) fun ps_color ((NUMBER blu)::(NUMBER grn)::(NUMBER red)::r) = (COLOR(Color{red=red, grn=grn, blu=blu})) :: r | ps_color stk = Interp.error "color" stk (* pop radius, coordinates of center, and a color and push a sphere * usage: radius x y z color-value sphere *) fun ps_sphere ( (COLOR c)::(NUMBER z)::(NUMBER y)::(NUMBER x)::(NUMBER rad)::r ) = SPHERE(Sphere{c=PT{x=x, y=y, z=z}, r=rad, color=c}) :: r | ps_sphere stk = Interp.error "sphere" stk (* build an object list from solids on the stack, then invoke raytracer *) fun ps_raytrace ((LITERAL picName)::r) = let fun mkObjList ([], l) = l | mkObjList ((SPHERE s)::r, l) = mkObjList(r, s::l) | mkObjList (_::r, l) = mkObjList(r, l) in Ray.picture(picName, mkObjList(r, [])); [] end | ps_raytrace stk = Interp.error "raytrace" stk (* add ray tracing operations to interpreter dictionary *) fun rtInit () = ( Interp.installOperator("color", ps_color); Interp.installOperator("sphere", ps_sphere); Interp.installOperator("raytrace", ps_raytrace)) end (* local *) end; signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* main.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories * * Main structure for running raytracer as benchmark. *) structure Main : BMARK = struct fun doit n = let fun loop n = if n = 0 then () else let val strm = TextIO.openIn "DATA/ray" val _ = Interface.rtInit() val _ = Interp.parse strm val _ = TextIO.closeIn strm in loop (n - 1) end in loop n end fun testit _ = () end mlton-20100608/benchmark/tests/raytrace.sml0000644000076600000240000022621111404435630017206 0ustar mtfstaff(* * Translated by Stephen Weeks (sweeks@sweeks.com) 2000-10-11 from the * PLClub OCaml winning entry to the 2000 ICFP programming contest. *) (* raytrace.sml *) signature CAML = sig type float = real type int = int end structure Caml = struct type int = int type float = real val op div = Int.div exception Not_found exception Failure of string fun failwith s = raise(Failure s) structure Char = struct open Char val code = ord val chr = chr val unsafe_chr = chr val lowercase = toLower val uppercase = toUpper end local open TextIO in type out_channel = outstream val open_out = openOut val open_out_bin = open_out fun output_string (out, s) = output(out, s) val close_out = closeOut end type float = real structure Array = struct local open Array in val array = array val copy = copy val of_list = fromList val length = length val sub = sub val update = update val unsafe_get = Array.sub val unsafe_set = Array.update val make = array fun map f a = Array.tabulate(length a, fn i => f(Array.sub(a, i))) val init = tabulate end end fun for(a: int, b, f) = let fun loop a = if a > b then () else (f a; loop(a + 1)) in loop a end fun forDown(b: int, a, f) = let fun loop b = if b < a then () else (f b; loop(b - 1)) in loop b end local open Real open Math in val abs_float = abs val acos = acos val asin = asin val cos = cos val float = fromInt val float_of_int = float val sin = sin val sqrt = sqrt val tan = tan val truncate = trunc val ** = Math.pow infix 8 ** end (* A hack for hash tables with string domain where performance doesn't matter. *) structure Hashtbl: sig type ('a, 'b) t val add: ('a, 'b) t -> string -> 'b -> unit val create: int -> ('a, 'b) t val find: ('a, 'b) t -> string -> 'b end = struct datatype ('a, 'b) t = T of (string * 'b) list ref fun create _ = T (ref []) fun add (T t) k d = t := (k, d) :: !t fun find (T (ref t)) k = case List.find (fn (k', _) => k = k') t of NONE => raise Not_found | SOME(_, d) => d end structure List = struct local open List in val iter = app val map = map val filter = filter val nth = nth val rev = rev end end fun exit i = Posix.Process.exit(Word8.fromInt i) end structure Math = struct open Caml val epsilon = 1E~5 val dtr = acos (~1.0) / 180.0 val rtd = 180.0 / acos (~1.0) fun dcos t = cos (t * dtr) fun dsin t = sin (t * dtr) fun dtan t = tan (t * dtr) fun dacos x = rtd * acos x val infinity = Real.posInf val minus_infinity = Real.negInf fun max_float (x, y : float) = if x >= y then x else y end signature MATRIX = sig include CAML (**** Matrix arithmetic ****) type t = float array (* 4-dimension matrix *) type v = float * float * float * float (* 4-dimension vector *) (* Basic matrices *) val identity : t val translate : (*x:*)float * (*y:*)float * (*z:*)float -> t val scale : (*x:*)float * (*y:*)float * (*z:*)float -> t val uscale : float -> t val unscale : (*x:*)float * (*y:*)float * (*z:*)float -> t val unuscale : float -> t val rotatex : float -> t val rotatey : float -> t val rotatez : float -> t (* Operations on matrices *) val mul : t * t -> t val vmul : t * v -> v val transpose : t -> t val add_scaled : v * float * v -> v val add : v * v -> v val sub : v * v -> v val prod : v * v -> float val square : v -> float val normalize : v -> v val neg : v -> v end structure Matrix: MATRIX = struct open Caml open Math type t = float array type v = float * float * float * float (**** Basic matrices ****) val identity = Array.of_list[1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0] fun translate(x, y, z) = Array.of_list[1.0, 0.0, 0.0, ~ x, 0.0, 1.0, 0.0, ~ y, 0.0, 0.0, 1.0, ~ z, 0.0, 0.0, 0.0, 1.0] fun unscale(x, y, z) = Array.of_list[ x, 0.0, 0.0, 0.0, 0.0, y, 0.0, 0.0, 0.0, 0.0, z, 0.0, 0.0, 0.0, 0.0, 1.0] fun scale(x, y, z) = unscale (1.0 / x, 1.0 / y, 1.0 / z) fun unuscale s = unscale (s, s, s) fun uscale s = scale (s, s, s) fun rotatex t = let val co = dcos t val si = dsin t in Array.of_list[ 1.0, 0.0, 0.0, 0.0, 0.0, co, si, 0.0, 0.0, ~ si, co, 0.0, 0.0, 0.0, 0.0, 1.0 ] end fun rotatey t = let val co = dcos t val si = dsin t in Array.of_list[ co, 0.0, ~ si, 0.0, 0.0, 1.0, 0.0, 0.0, si, 0.0, co, 0.0, 0.0, 0.0, 0.0, 1.0 ] end fun rotatez t = let val co = dcos t val si = dsin t in Array.of_list[ co, si, 0.0, 0.0, ~ si, co, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] end (*** Operations on matrices ***) fun get (m : t, i, j) = Array.unsafe_get (m, i * 4 + j) fun set (m : t, i, j, v) = Array.unsafe_set (m, i * 4 + j, v) fun mul (m, m') = let val m'' = Array.make (16, 0.0) in for(0, 3, fn i => for(0, 3, fn j => let fun lp (4, s) = s | lp (k, s) = lp (k+1, s + get(m, i, k) * get(m', k, j)) in set(m'', i, j, lp(0, 0.0)) end)) ; m'' end fun transpose m = let val m' = Array.make (16, 0.0) in for(0, 3, fn i => for(0, 3, fn j => set (m', i, j, get (m, j, i)))) ; m' end fun vmul (m, (x, y, z, t)) = (x * get(m, 0, 0) + y * get(m, 0, 1) + z * get(m, 0, 2) + t * get(m, 0, 3), x * get(m, 1, 0) + y * get(m, 1, 1) + z * get(m, 1, 2) + t * get(m, 1, 3), x * get(m, 2, 0) + y * get(m, 2, 1) + z * get(m, 2, 2) + t * get(m, 2, 3), x * get(m, 3, 0) + y * get(m, 3, 1) + z * get(m, 3, 2) + t * get(m, 3, 3)) fun add_scaled (x: v, t, v: v) : v = ( #1 x + t * #1 v, #2 x + t * #2 v, #3 x + t * #3 v, #4 x + t * #4 v ) fun add (x: v, y: v) : v = ( #1 x + #1 y, #2 x + #2 y, #3 x + #3 y, #4 x + #4 y ) fun sub (x: v, y: v) : v = (#1 x - #1 y, #2 x - #2 y, #3 x - #3 y, #4 x - #4 y) fun prod (x: v, y: v) : real = #1 x * #1 y + #2 x * #2 y + #3 x * #3 y + #4 x * #4 y fun square (vx, vy, vz, vt) : real = vx * vx + vy * vy + vz * vz + vt * vt fun normalize (x: v): v = let val nx = sqrt (prod (x, x)) in (#1 x / nx, #2 x / nx, #3 x / nx, #4 x / nx) end fun neg (x: v) : v = (~(#1 x), ~(#2 x), ~(#3 x), ~(#4 x)) end signature LEX_TOKEN_STRUCTS = sig end signature LEX_TOKEN = sig include LEX_TOKEN_STRUCTS datatype t = Binder of string | Bool of bool | Eof | Identifier of string | Int of int | Lbrace | Lbracket | Rbrace | Rbracket | Real of real | String of string end functor LexToken(S: LEX_TOKEN_STRUCTS): LEX_TOKEN = struct open S datatype t = Binder of string | Bool of bool | Eof | Identifier of string | Int of int | Lbrace | Lbracket | Rbrace | Rbracket | Real of real | String of string end type int = Int.int functor Lex(structure Token: LEX_TOKEN)= struct structure UserDeclarations = struct val chars: char list ref = ref [] type lexarg = unit type lexresult = Token.t val eof: lexarg -> lexresult = fn () => Token.Eof fun fail s = raise Fail s end (* end of user routines *) exception LexError (* raised if illegal leaf action tried *) structure Internal = struct datatype yyfinstate = N of int type statedata = {fin : yyfinstate list, trans: string} (* transition & final state table *) val tab = let val s = [ (0, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (1, "\000\000\000\000\000\000\000\000\000\026\026\026\000\026\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\026\000\025\000\000\024\000\000\000\000\000\000\000\023\000\021\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ \\009\009\009\009\009\009\009\009\009\009\009\011\000\010\000\000\ \\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ \\009\009\009\009\009\009\009\009\009\009\009\008\000\007\000\000\ \\000" ), (3, "\000\000\000\000\000\000\000\000\000\027\029\029\000\028\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\ \\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\000\ \\000" ), (5, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\030\030\031\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\000\ \\000" ), (9, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\009\000\000\ \\009\009\009\009\009\009\009\009\009\009\000\000\000\000\000\000\ \\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ \\009\009\009\009\009\009\009\009\009\009\009\000\000\000\000\009\ \\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ \\009\009\009\009\009\009\009\009\009\009\009\000\000\000\000\000\ \\000" ), (12, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\000\000\000\000\013\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\013\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (13, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\015\000\000\ \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (14, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (16, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\017\017\017\017\017\017\017\017\017\017\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (17, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\017\017\017\017\017\017\017\017\017\017\000\000\000\000\000\000\ \\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (18, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\ \\019\019\019\019\019\019\019\019\019\019\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (19, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\019\019\019\019\019\019\019\019\019\019\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (21, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\000\000\000\000\000\ \\000\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\000\000\000\000\000\ \\000" ), (22, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\022\000\000\ \\022\022\022\022\022\022\022\022\022\022\000\000\000\000\000\000\ \\000\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\000\000\000\000\022\ \\000\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\ \\022\022\022\022\022\022\022\022\022\022\022\000\000\000\000\000\ \\000" ), (23, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (28, "\000\000\000\000\000\000\000\000\000\000\029\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ \\000" ), (0, "")] fun f x = x val s = map f (rev (tl (rev s))) exception LexHackingError fun look ((j,x)::r, i) = if i = j then x else look(r, i) | look ([], i) = raise LexHackingError fun g {fin=x, trans=i} = {fin=x, trans=look(s,i)} in Vector.fromList(map g [{fin = [], trans = 0}, {fin = [], trans = 1}, {fin = [], trans = 1}, {fin = [], trans = 3}, {fin = [], trans = 3}, {fin = [], trans = 5}, {fin = [], trans = 5}, {fin = [(N 13)], trans = 0}, {fin = [(N 11)], trans = 0}, {fin = [(N 49)], trans = 9}, {fin = [(N 9)], trans = 0}, {fin = [(N 7)], trans = 0}, {fin = [(N 39)], trans = 12}, {fin = [], trans = 13}, {fin = [(N 35)], trans = 14}, {fin = [], trans = 14}, {fin = [], trans = 16}, {fin = [(N 35)], trans = 17}, {fin = [], trans = 18}, {fin = [(N 35)], trans = 19}, {fin = [], trans = 19}, {fin = [], trans = 21}, {fin = [(N 20)], trans = 22}, {fin = [], trans = 23}, {fin = [(N 43)], trans = 0}, {fin = [(N 41)], trans = 0}, {fin = [(N 5)], trans = 0}, {fin = [(N 58)], trans = 0}, {fin = [(N 55)], trans = 28}, {fin = [(N 55)], trans = 0}, {fin = [(N 62)], trans = 0}, {fin = [(N 60),(N 62)], trans = 0}]) end structure StartStates = struct datatype yystartstate = STARTSTATE of int (* start state definitions *) val C = STARTSTATE 3; val INITIAL = STARTSTATE 1; val S = STARTSTATE 5; end type result = UserDeclarations.lexresult exception LexerError (* raised if illegal leaf action tried *) end type int = Int.int fun makeLexer (yyinput: int -> string) = let val yygone0:int=1 val yyb = ref "\n" (* buffer *) val yybl: int ref = ref 1 (*buffer length *) val yybufpos: int ref = ref 1 (* location of next character to use *) val yygone: int ref = ref yygone0 (* position in file of beginning of buffer *) val yydone = ref false (* eof found yet? *) val yybegin: int ref = ref 1 (*Current 'start state' for lexer *) val YYBEGIN = fn (Internal.StartStates.STARTSTATE x) => yybegin := x fun lex (yyarg as (())) = let fun continue() : Internal.result = let fun scan (s,AcceptingLeaves : Internal.yyfinstate list list,l,i0: int) = let fun action (i: int,nil) = raise LexError | action (i,nil::l) = action (i-1,l) | action (i,(node::acts)::l) = case node of Internal.N yyk => (let fun yymktext() = String.substring(!yyb,i0,i-i0) val yypos: int = i0+ !yygone fun REJECT() = action(i,acts::l) open UserDeclarations Internal.StartStates in (yybufpos := i; case yyk of (* Application actions *) 11 => (Token.Lbrace) | 13 => (Token.Rbrace) | 20 => let val yytext=yymktext() in Token.Binder(String.extract(yytext, 1, NONE)) end | 35 => let val yytext=yymktext() in Token.Real(case Real.fromString yytext of NONE => fail(concat["bad real constant ", yytext]) | SOME r => r) end | 39 => let val yytext=yymktext() in Token.Int(case Int.fromString yytext of NONE => fail(concat["bad int constant ", yytext]) | SOME i => i) end | 41 => (chars := []; YYBEGIN S; continue()) | 43 => (YYBEGIN C; continue()) | 49 => let val yytext=yymktext() in Token.Identifier yytext end | 5 => (continue()) | 55 => (YYBEGIN INITIAL; continue()) | 58 => (continue()) | 60 => (let val s = (implode(rev(!chars)) before chars := nil) in YYBEGIN INITIAL ; Token.String s end) | 62 => let val yytext=yymktext() in chars := String.sub(yytext, 0) :: !chars ; continue() end | 7 => (Token.Lbracket) | 9 => (Token.Rbracket) | _ => raise Internal.LexerError ) end ) val {fin,trans} = Vector.sub(Internal.tab, s) val NewAcceptingLeaves = fin::AcceptingLeaves in if l = !yybl then if trans = #trans(Vector.sub(Internal.tab,0)) then action(l,NewAcceptingLeaves ) else let val newchars= if !yydone then "" else yyinput 1024 in if (String.size newchars)=0 then (yydone := true; if (l=i0) then UserDeclarations.eof yyarg else action(l,NewAcceptingLeaves)) else (if i0=l then yyb := newchars else yyb := String.substring(!yyb,i0,l-i0)^newchars; yygone := !yygone+i0; yybl := String.size (!yyb); scan (s,AcceptingLeaves,l-i0,0)) end else let val NewChar = Char.ord(CharVector.sub(!yyb,l)) val NewChar = if NewChar<128 then NewChar else 128 val NewState = Char.ord(CharVector.sub(trans,NewChar)) in if NewState=0 then action(l,NewAcceptingLeaves) else scan(NewState,NewAcceptingLeaves,l+1,i0) end end (* val start= if String.substring(!yyb,!yybufpos-1,1)="\n" then !yybegin+1 else !yybegin *) in scan(!yybegin (* start *),nil,!yybufpos,!yybufpos) end in continue end in lex end end signature PROGRAM = sig include CAML (**** Basic types: programs, values, ... ****) datatype k = Acos | Addi | Addf | Apply | Asin | Clampf | Cone | Cos | Cube | Cylinder | Difference | Divi | Divf | Eqi | Eqf | Floor | Frac | Get | Getx | Gety | Getz | If | Intersect | Length | Lessi | Lessf | Light | Modi | Muli | Mulf | Negi | Negf | Plane | Point | Pointlight | Real | Render | Rotatex | Rotatey | Rotatez | Scale | Sin | Sphere | Spotlight | Sqrt | Subi | Subf | Translate | Union | Uscale (* Program tokens *) datatype t = Fun of t list | Arr of t list | Ident of string | Binder of string | Int of int | Float of float | Bool of bool | String of string | Prim of k (* internal representation of program tokens *) datatype t' = Fun' of t' list | Arr' of t' list | Ident' of int (* index to environment stack *) | Binder' (* | Int' of int | Float' of float | Bool' of bool | String' of string *) | Prim' of k | Val' of v (* inlined value *) (* Values *) and v = VInt of int | VFloat of float | VBool of bool | VStr of string | VClos of v list * t' list | VFun of (v list -> v list) (* XXX for the compiler *) | VArr of v array | VPoint of v * v * v (* XXX Maybe these should be floats? *) | VObj of obj | VLight of v * v | VPtLight of v * v | VStLight of v * v * v * v * v and obj = OObj of kind * closure ref | OTransform of obj * Matrix.t * (* World to object *) Matrix.t * (* Object to world *) float * (* Scale factor *) bool (* Isometry? *) | OUnion of obj * obj | OInter of obj * obj | ODiff of obj * obj and kind = OSphere | OCube | OCylind | OCone | OPlane and closure = Unopt of v (* Unoptimized function *) | Opt of v | Cst of (float * float * float * float * float * float) (* Translation of an identifier *) val translate : string -> t (* Get the name of an identifier *) (* val name : t' -> string *) exception Stuck_computation of v list * v list * t' list exception Stuck_computation' (* for compiler *) val read: TextIO.instream -> t list end structure Program: PROGRAM = struct open Caml datatype k = Acos | Addi | Addf | Apply | Asin | Clampf | Cone | Cos | Cube | Cylinder | Difference | Divi | Divf | Eqi | Eqf | Floor | Frac | Get | Getx | Gety | Getz | If | Intersect | Length | Lessi | Lessf | Light | Modi | Muli | Mulf | Negi | Negf | Plane | Point | Pointlight | Real | Render | Rotatex | Rotatey | Rotatez | Scale | Sin | Sphere | Spotlight | Sqrt | Subi | Subf | Translate | Union | Uscale datatype t = Fun of t list | Arr of t list | Ident of string | Binder of string | Int of int | Float of float | Bool of bool | String of string | Prim of k datatype t' = Fun' of t' list | Arr' of t' list | Ident' of int (* index to environment stack *) | Binder' (* | Int' of int | Float' of float | Bool' of bool | String' of string *) | Prim' of k | Val' of v (* inlined value *) and v = VInt of int | VFloat of float | VBool of bool | VStr of string | VClos of v list * t' list | VFun of (v list -> v list) (* XXX for the compiler *) | VArr of v array | VPoint of v * v * v | VObj of obj | VLight of v * v | VPtLight of v * v | VStLight of v * v * v * v * v and obj = OObj of kind * closure ref | OTransform of obj * Matrix.t * (* World to object *) Matrix.t * (* Object to world *) float * (* Scale factor *) bool (* Isometry? *) | OUnion of obj * obj | OInter of obj * obj | ODiff of obj * obj and kind = OSphere | OCube | OCylind | OCone | OPlane and closure = Unopt of v | Opt of v | Cst of (float * float * float * float * float * float) fun create_hashtables size init = let val tbl: (string, t) Hashtbl.t = Hashtbl.create size (* val tbl' = Hashtbl.create size *) in List.iter (fn (key, data) => Hashtbl.add tbl key data) init; (* List.iter (fn (data, key) -> Hashtbl.add tbl' key data) init; *) tbl (*, tbl' *) end val keywords(*, keyword_name)*) = create_hashtables 101 (* Booleans are either the literal true or the literal false. *) [ ("true", Bool true), ("false", Bool false), (* Operators (see appendix) *) ("acos", Prim Acos), ("addi", Prim Addi), ("addf", Prim Addf), ("apply", Prim Apply), ("asin", Prim Asin), ("clampf", Prim Clampf), ("cone", Prim Cone), ("cos", Prim Cos), ("cube", Prim Cube), ("cylinder", Prim Cylinder), ("difference", Prim Difference), ("divi", Prim Divi), ("divf", Prim Divf), ("eqi", Prim Eqi), ("eqf", Prim Eqf), ("floor", Prim Floor), ("frac", Prim Frac), ("get", Prim Get), ("getx", Prim Getx), ("gety", Prim Gety), ("getz", Prim Getz), ("if", Prim If), ("intersect", Prim Intersect), ("length", Prim Length), ("lessi", Prim Lessi), ("lessf", Prim Lessf), ("light", Prim Light), ("modi", Prim Modi), ("muli", Prim Muli), ("mulf", Prim Mulf), ("negi", Prim Negi), ("negf", Prim Negf), ("plane", Prim Plane), ("point", Prim Point), ("pointlight", Prim Pointlight), ("real", Prim Real), ("render", Prim Render), ("rotatex", Prim Rotatex), ("rotatey", Prim Rotatey), ("rotatez", Prim Rotatez), ("scale", Prim Scale), ("sin", Prim Sin), ("sphere", Prim Sphere), ("spotlight", Prim Spotlight), ("sqrt", Prim Sqrt), ("subi", Prim Subi), ("subf", Prim Subf), ("translate", Prim Translate), ("union", Prim Union), ("uscale", Prim Uscale)] fun translate i = Hashtbl.find keywords i handle Not_found => Ident i (* fun name token = * Hashtbl.find keyword_name * (match token with * Prim' k -> Prim k * | _ -> raise Not_found) * *) exception Stuck_computation of v list * v list * t' list exception Stuck_computation' (* for compiler *) structure LexToken = LexToken() structure Lex = Lex(structure Token = LexToken) fun read(ins: TextIO.instream): t list = let val lex: unit -> LexToken.t = Lex.makeLexer(fn n => TextIO.inputN(ins, n))() local val next: LexToken.t option ref = ref NONE in fun token(): LexToken.t = case !next of NONE => lex() | SOME t => (next := NONE; t) fun save(t: LexToken.t): unit = next := SOME t end fun bad() = failwith "invalid input" fun many(done: LexToken.t -> bool): t list = let fun loop(ac: t list) = case one() of NONE => if done(token()) then rev ac else bad() | SOME t => loop(t :: ac) in loop [] end and one(): t option = let fun tok t = SOME t in case token() of LexToken.Binder x => tok(Binder x) | LexToken.Bool b => tok(Bool b) | LexToken.Identifier x => tok(translate x) | LexToken.Int i => tok(Int i) | LexToken.Lbrace => SOME(Fun(many(fn LexToken.Rbrace => true | _ => false))) | LexToken.Lbracket => SOME(Arr(many(fn LexToken.Rbracket => true | _ =>false))) | LexToken.Real r => tok(Float r) | LexToken.String s => tok(String s) | t => (save t; NONE) end in many(fn LexToken.Eof => true | _ => false) end end signature PPM = sig include CAML type pixmap val init : (*width:*)int * (*height:*)int -> pixmap val dump : string * pixmap -> unit (* val load : string -> pixmap *) val width : pixmap -> int val height : pixmap -> int val get : pixmap * int * int * int -> int val set : pixmap * int * int * int * int -> unit val setp : pixmap * int * int * int * int * int -> unit end structure Ppm: PPM = struct open Caml structure Array = Word8Array structure Word = Word8 type pixmap = Array.array * int fun get ((img, width), i, j, k) = Word.toInt (Array.sub (img, ((j * width) + i) * 3 + k)) fun set ((img, width), i, j, k, v) = Array.update (img, ((j * width) + i) * 3 + k, Word.fromInt v) fun setp ((img, width), i, j, r, g, b) = let val p = ((j * width) + i) * 3 in Array.update(img, p, Word.fromInt r) ; Array.update(img, p + 1, Word.fromInt g) ; Array.update(img, p + 2, Word.fromInt b) end fun init (width, height) = (Array.array(height * width * 3, 0w0), width) fun width (s, width) = width fun height (s, width) = Array.length s div width div 3 fun dump (file, (img, width)) = let val sz = Array.length img val height = sz div 3 div width val f = open_out_bin file in output_string (f, "P6\n# PL Club - translated to SML\n") ; output_string (f, concat[Int.toString width, " ", Int.toString height, "\n255\n"]) ; output_string (f, Byte.unpackString (Word8ArraySlice.slice (img, 0, NONE))) ; close_out f end (* fun load file = * let f = open_in_bin file in * assert (input_line f = "P6"); * assert ((input_line f).[0] = '#'); * let s = input_line f in * let i = ref 0 in * while s.[!i] >= '0' && s.[!i] <= '9' do incr i done; * let width = int_of_string (String.sub s 0 !i) in * let height = * int_of_string (String.sub s (!i + 1) (String.length s - !i - 1)) in * assert (input_line f = "255"); * let (s, _) as img = init width height in * really_input f s 0 (String.length s); * close_in f; * img *) end signature RENDER = sig include CAML val apply : (Program.v * Program.v list -> Program.v list) ref val inline_closure : (Program.v -> Program.v) ref val f : (*amb:*)(float * float * float) * (*lights:*) Program.v array * (*obj:*)Program.obj * (*depth:*)int * (*fov:*)float * (*wid:*)int * (*ht:*)int * (*file:*)string -> unit end structure Render: RENDER = struct open Caml infix 9 ** open Program (* Scene description *) datatype kind = (* section 3.2 *) SSphere of Matrix.v (* Center *) * float (* Square of the radius *) | SEllips | SCube of Matrix.v (* Normal x = 0 *) * Matrix.v (* Normal y = 0 *) * Matrix.v (* Normal z = 0 *) | SCylind of Matrix.v (* Normal *) | SCone of Matrix.v (* Normal *) | SPlane of Matrix.v (* Equation *) * Matrix.v (* Normal *) datatype scene = (* section 3.7 *) SObj of kind * closure ref (* surface function *) * Matrix.t | SBound of scene * Matrix.v (* Center *) * float (* Square of the radius *) | SUnion of scene * scene | SInter of scene * scene | SDiff of scene * scene datatype light = (* section 3.5 *) Light of Matrix.v (* negated & normalized *) * (float * float * float) | PtLight of Matrix.v * (float * float * float) | StLight of Matrix.v * Matrix.v (* negated & normalized *) * (float * float * float) * float (* cos *) * float type desc = { amb : float * float * float, lights : light array, scene : scene } open Math open Matrix (**** Scene calculation ****) (* Plane equation and normal in world coordinates *) fun plane_eq(m, v) = let val n = vmul (transpose m, v ) in (n, normalize(#1 n, #2 n, #3 n, 0.0)) end val origin = ( 0.0, 0.0, 0.0, 1.0 ) val cube_center = ( 0.5, 0.5, 0.5, 1.0 ) val cylinder_center = ( 0.0, 0.5, 0.0, 1.0 ) val cone_center = ( 0.0, 1.0, 0.0, 1.0 ) fun intern_obj(m, m1, scale, isom, ob) = (* apply transformations *) case ob of OObj (OSphere, f) => if isom then let val center = vmul (m1, origin) val radius = scale * scale in SBound (SObj (SSphere (center, radius), f, m), center, radius) end else let val center = vmul (m1, origin) val radius = scale * scale in SBound (SObj (SEllips, f, m), center, radius) end | OObj (OCube, f) => let val (nx, nx') = plane_eq(m, (1.0, 0.0, 0.0, 0.0)) val (ny, ny') = plane_eq(m, (0.0, 1.0, 0.0, 0.0)) val (nz, nz') = plane_eq(m, (0.0, 0.0, 1.0, 0.0)) val c = SObj (SCube (nx', ny', nz'), f, m) in SBound (c, vmul (m1, cube_center), scale * scale * 0.75) end | OObj (OCylind, f) => let val (n, n') = plane_eq(m, (0.0, 1.0, 0.0, 0.0)) val c = SObj (SCylind n', f, m) in SBound (c, vmul(m1, cylinder_center), scale * scale * 1.25) end | OObj (OCone, f) => let val (n, n') = plane_eq(m, (0.0, 1.0, 0.0, 0.0)) val c = SObj (SCone n', f, m) in SBound (c, vmul(m1, cone_center), scale * scale) end | OObj (OPlane, f) => let val (n, n') = plane_eq(m, (0.0, 1.0, 0.0, 0.0)) in SObj (SPlane (n, n'), f, m) end | OTransform (o', m', m'1, scale', isom') => intern_obj (Matrix.mul(m', m), Matrix.mul(m1, m'1), scale * scale', isom andalso isom', o') | OUnion (o1, o2) => SUnion (intern_obj(m, m1, scale, isom, o1), intern_obj(m, m1, scale, isom, o2)) | OInter (o1, o2) => SInter (intern_obj(m, m1, scale, isom, o1), intern_obj(m, m1, scale, isom, o2)) | ODiff (ODiff (o1, o2), o3) => (* Better to have unions that diffs for introducing bounds *) intern_obj(m, m1, scale, isom, (ODiff (o1, OUnion (o2, o3)))) | ODiff (o1, o2) => SDiff (intern_obj(m, m1, scale, isom, o1), intern_obj(m, m1, scale, isom, o2)) fun intern_lights a = Array.map (fn VLight (VPoint (VFloat x, VFloat y, VFloat z), VPoint (VFloat r, VFloat g, VFloat b)) => Light (normalize (neg (x, y, z, 0.0)), (r, g, b)) | VPtLight (VPoint (VFloat x, VFloat y, VFloat z), VPoint (VFloat r, VFloat g, VFloat b)) => PtLight ((x, y, z, 1.0), (r, g, b)) | VStLight (VPoint (VFloat x, VFloat y, VFloat z), VPoint (VFloat x', VFloat y', VFloat z'), VPoint (VFloat r, VFloat g, VFloat b), VFloat cutoff, VFloat exp) => StLight ((x, y, z, 1.0), normalize (x - x', y - y', z - z', 0.0), (r, g, b), dcos cutoff, exp) | _ => raise(Fail "assert false")) a (**** Scene optimization ****) fun flatten_rec(sc, rem) = case sc of SUnion (sc1, sc2) => flatten_rec(sc1, flatten_rec(sc2, rem)) | sc => sc :: rem fun flatten_union sc = flatten_rec(sc, []) fun object_cost k : int = case k of SSphere _ => 1 | SEllips => 2 | SCube _ => 4 | SCylind _ => 2 | SCone _ => 2 | SPlane _ => 0 (* Planes do not have a bounding box anyway *) fun add_bound (r0, (x, r, cost, sc)) = if r0 < 0.0 then if r < 0.0 orelse cost <= 1 then (cost, sc) else (1, SBound (sc, x, r)) else (* Cost of bounds *) let val c0 = r0 + r * float cost (* Cost ofout bounds *) val c1 = r0 * float cost in if c0 < c1 then (1, SBound (sc, x, r)) else (cost, sc) end fun union_bound (dsc1 as (x1, r1, cost1, sc1), dsc2 as (x2, r2, cost2, sc2)) = if r1 < 0.0 then let val (cost2', sc2') = add_bound(r1, dsc2) in (x1, r1, cost1, SUnion (sc1, sc2')) end else if r2 < 0.0 then let val (cost1', sc1') = add_bound (r2, dsc1) in (x2, r2, cost2, SUnion (sc1', sc2)) end else let val d = sqrt (square (sub(x2, x1))) val r1' = sqrt r1 val r2' = sqrt r2 in if d + r2' <= r1' then let val (cost2', sc2') = add_bound (r1, dsc2) in (x1, r1, cost1 + cost2', SUnion (sc1, sc2')) end else if d + r1' <= r2' then let val (cost1', sc1') = add_bound (r2, dsc1) in (x2, r2, cost1' + cost2, SUnion (sc1', sc2)) end else let val r' = (r1' + r2' + d) * 0.5 val r = r' * r' val x = add_scaled (x1, (r' - r1') / d, sub(x2, x1)) val (cost1', sc1') = add_bound (r, dsc1) val (cost2', sc2') = add_bound (r, dsc2) in (x, r, cost1' + cost2', SUnion (sc1', sc2')) end end fun union_radius (dsc1 as (x1, r1, cost1, sc1), dsc2 as (x2, r2, cost2, sc2)) = let val d = sqrt (square (sub (x2, x1))) val r1' = sqrt r1 val r2' = sqrt r2 in if d + r2' <= r1' then r1 else if d + r1' <= r2' then r2 else let val r' = (r1' + r2' + d) * 0.5 in r' * r' end end fun merge2 l = case l of sc1 :: sc2 :: r => union_bound (sc1, sc2) :: merge2 r | _ => l fun merge_union l = case l of [] => raise(Fail "assert false") | [sc1] => sc1 | l => merge_union (merge2 l) fun opt_union l = case l of [] => l | [_] => l | [sc1, sc2] => [union_bound(sc1, sc2)] | _ => let val c = Array.of_list l val n = Array.length c val m = Array2.array(n, n, infinity) val _ = for(0, n - 1, fn i => for(0, n - 1, fn j => if i <> j then Array2.update(m, i, j, union_radius (Array.sub(c, i), Array.sub(c, j))) else ())) val remain = Array.init (n, fn i => i) val _ = forDown (n - 1, 1, fn k => let val gain = ref infinity val i0 = ref 0 val j0 = ref 0 val _ = for(0, k, fn i => for(0, k, fn j => let val i' = Array.sub(remain, i) val j' = Array.sub(remain, j) in if Array2.sub(m, i', j') < !gain then (gain := Array2.sub(m, i', j') ; i0 := i ; j0 := j) else () end)) val i = Array.sub(remain, !i0) val j = Array.sub(remain, !j0) in Array.update(remain, !j0, Array.sub(remain, k)); Array.update(c, i, union_bound (Array.sub(c, i), Array.sub(c, j))); for(0, k - 1, fn j0 => let val j = Array.sub(remain, j0) in if i <> j then ( Array2.update (m, i, j, union_radius (Array.sub(c, i), Array.sub(c, j))); Array2.update (m, j, i, union_radius (Array.sub(c, i), Array.sub(c, j)))) else () end) end) in [Array.sub(c, Array.sub(remain, 0))] end fun optimize_rec sc = case sc of SObj (kind, _, _) => (origin, ~1.0, object_cost kind, sc) | SUnion _ => let val l = List.map optimize_rec (flatten_union sc) val unbounded = List.filter (fn (_, r, _, _) => r < 0.0) l val bounded = List.filter (fn (_, r, _, _) => r >= 0.0) l in merge_union (opt_union bounded @ unbounded) end | SInter (sc1, sc2) => let val (x1, r1, cost1, sc1) = optimize_rec sc1 val (x2, r2, cost2, sc2) = optimize_rec sc2 in (* XXX We could have a tighter bound... *) if r2 < 0.0 then (x2, r2, cost2, SInter (sc1, sc2)) else if r1 < 0.0 then (x1, r1, cost1, SInter (sc2, sc1)) else if r1 < r2 then (x1, r1, cost1, SInter (sc1, sc2)) else (x2, r2, cost1, SInter (sc2, sc1)) end | SDiff (sc1, sc2) => let val (x1, r1, cost1, sc1) = optimize_rec sc1 val dsc2 as (x2, r2, cost2, sc2) = optimize_rec sc2 val (cost2', sc2') = add_bound (r1, dsc2) in (x1, r1, cost1, SDiff (sc1, sc2')) end | SBound (sc1, x, r) => let val (_, _, cost1, sc1) = optimize_rec sc1 in (x, r, cost1, sc1) end fun optimize sc = #2 (add_bound (~1.0, optimize_rec sc)) (**** Rendering ****) (* operations for intervals *) fun union (l1, l2) : (float * scene * float * scene) list = (* ES: checked *) case (l1, l2) of ([], _) => l2 | (_, []) => l1 | ((i1 as (t1, o1, t1', o1')) :: r1, (i2 as (t2, o2, t2', o2')) :: r2) => if t1' < t2 then i1 :: union(r1, l2) else if t2' < t1 then i2 :: union(l1, r2) else if t1 < t2 then if t1' < t2' then union(r1, (t1, o1, t2', o2')::r2) else union((t1, o1, t1', o1')::r1, r2) else if t1' < t2' then union(r1, ((t2, o2, t2', o2')::r2)) else union((t2, o2, t1', o1')::r1, r2) fun inter (l1, l2) : (float * scene * float * scene) list = (* ES: checked *) case (l1, l2) of ([], _) => [] | (_, []) => [] | ((i1 as (t1, o1, t1', o1')) :: r1, (i2 as (t2, o2, t2', o2')) :: r2) => if t1' <= t2 then inter(r1, l2) else if t2' <= t1 then inter(l1, r2) else if t1 < t2 then if t1' < t2' then (t2, o2, t1', o1') :: inter(r1, l2) else i2 :: inter(l1, r2) else if t1' < t2' then i1 :: inter(r1, l2) else (t1, o1, t2', o2') :: inter(l1, r2) fun diff (l1, l2) : (float * scene * float * scene) list = (* ES: checked *) case (l1, l2) of ([], _) => [] | (_, []) => l1 | ((i1 as (t1, o1, t1', o1')) :: r1, (i2 as (t2, o2, t2', o2')) :: r2) => if t1' <= t2 then i1 :: diff(r1, l2) else if t2' <= t1 then diff(l1, r2) else if t1 < t2 then if t1' < t2' then (t1, o1, t2, o2) :: diff(r1, l2) else (t1, o1, t2, o2) :: diff((t2', o2', t1', o1') :: r1, r2) else if t1' < t2' then diff(r1, l2) else diff((t2', o2', t1', o1') :: r1, r2) (* intersection of ray and object *) fun plane (orig, dir, scene, eq) : (float * scene * float * scene) list = (* XXX Need to be checked *) let val porig = prod (eq, orig) val pdir = prod (eq, dir) val t = ~ porig / pdir in if porig < 0.0 then if t > 0.0 then [(0.0, scene, t, scene)] else [(0.0, scene, infinity, scene)] else if t > 0.0 then [(t, scene, infinity, scene)] else [] end fun band (obj, x, v, i) : (float * scene * float * scene) list = (* ES: checked *) let val t1 = ~ (i x) / (i v) val t2 = (1.0 - (i x)) / (i v) val t2' = if t1 >= t2 then t1 else t2 in if t2' < 0.0 then [] else let val t1' = if t1 <= t2 then t1 else t2 in if t1' < 0.0 then [(0.0, obj, t2', obj)] else [(t1', obj, t2', obj)] end end fun cube (orig, dir, scene, m): (float * scene * float * scene) list = (* ES: checked *) let val x = vmul (m, orig) val v = vmul (m, dir) in case band (scene, x, v, #1) of [] => [] | l0 => case inter (l0, band (scene, x, v, #2)) of [] => [] | l1 => inter (l1, band (scene, x, v, #3)) end fun sphere (orig, dir, scene, x, r2): (float * scene * float * scene) list = let val v = sub (x, orig) (* Square of the distance between the origin and the center of the sphere *) val v2 = square v val dir2 = square dir val p = prod (v, dir) (* Square of the distance between the ray and the center *) val d2 = v2 - p * p / dir2 val delta = r2 - d2 in if delta <= 0.0 then [] else let val sq = sqrt (delta / dir2) val t1 = p / dir2 - sq val t2 = p / dir2 + sq in if t2 < 0.0 then [] else [(max_float (0.0, t1), scene, t2, scene)] end end fun ellipsoid (orig, dir, scene, m): (float * scene * float * scene) list = (* ES: checked *) let val x = vmul (m, orig) val v = vmul (m, dir) val x2 = square x val v2 = square v val xv = prod (x, v) val delta = xv * xv - v2 * (x2 - 2.0) in if delta <= 0.0 then [] else let val sq = sqrt delta val t1 = (~ xv - sq) / v2 val t2 = (~ xv + sq) / v2 in if t2 < 0.0 then [] else [(max_float (0.0, t1), scene, t2, scene)] end end fun cylinder (orig, dir, scene, m): (float * scene * float * scene) list = let val x = vmul (m, orig) val v = vmul (m, dir) val x2 = #1 x * #1 x + #3 x * #3 x - 1.0 val v2 = #1 v * #1 v + #3 v * #3 v val xv = #1 x * #1 v + #3 x * #3 v val delta = xv * xv - v2 * x2 in if delta <= 0.0 then [] else let val sq = sqrt delta val t1 = (~ xv - sq) / v2 val t2 = (~ xv + sq) / v2 in if t2 < 0.0 then [] else inter ([(max_float (0.0, t1), scene, t2, scene)], band (scene, x, v, #2)) end end fun cone (orig, dir, scene, m): (float * scene * float * scene) list = let val x = vmul (m, orig) val v = vmul (m, dir) val x2 = #1 x * #1 x + #3 x * #3 x - #2 x * #2 x val v2 = #1 v * #1 v + #3 v * #3 v - #2 v * #2 v val xv = #1 x * #1 v + #3 x * #3 v - #2 x * #2 v val delta = xv * xv - v2 * x2 in if delta <= 0.0 then [] else let val sq = sqrt delta val t1 = (~ xv - sq) / v2 val t2 = (~ xv + sq) / v2 in if t1 <= t2 then if t2 < 0.0 then [] else inter ([(max_float(0.0, t1), scene, t2, scene)], band (scene, x, v, #2)) else inter (if t1 <= 0.0 then [(0.0, scene, infinity, scene)] else if t2 <= 0.0 then [(t1, scene, infinity, scene)] else [(0.0, scene, t2, scene), (t1, scene, infinity, scene)], band (scene, x, v, #2)) end end (* XXX Maybe we should check whether the sphere is completely behind us ? *) fun intersect (orig, dir, x, r2) = let val (vx, vy, vz, vt) = sub (x, orig) (* Square of the distance between the origin and the center of the sphere *) val v2 = vx * vx + vy * vy + vz * vz + vt * vt val (dx, dy, dz, dt) = dir val dir2 = dx * dx + dy * dy + dz * dz + dt * dt val p = vx * dx + vy * dy + vz * dz + vt * dt (* Square of the distance between the ray and the center *) val d2 = v2 - p * p / dir2 in r2 > d2 end fun find_all (orig, dir, scene) = case scene of SObj (SSphere (x, r2), _, m) => sphere (orig, dir, scene, x, r2) | SObj (SEllips, _, m) => ellipsoid (orig, dir, scene, m) | SObj (SCube _, _, m) => cube (orig, dir, scene, m) | SObj (SCylind _, _, m) => cylinder (orig, dir, scene, m) | SObj (SCone _, _, m) => cone (orig, dir, scene, m) | SObj (SPlane (eq, _), _, m) => plane (orig, dir, scene, eq) | SBound (sc, x, r2) => if intersect (orig, dir, x, r2) then find_all (orig, dir, sc) else [] | SUnion (sc1, sc2) => union (find_all (orig, dir, sc1), find_all (orig, dir, sc2)) | SInter (sc1, sc2) => let val l1 = find_all (orig, dir, sc1) in case l1 of [] => [] | _ => inter(l1, find_all (orig, dir, sc2)) end | SDiff (sc1, sc2) => let val l1 = find_all(orig, dir, sc1) in case l1 of [] => [] | _ => diff(l1, find_all(orig, dir, sc2)) end fun filter_inter_list l = case l of (t, _, _, _)::r => if t < epsilon then filter_inter_list r else l | _ => l fun hit_from_inter bounded l0 = let val l = filter_inter_list l0 in case l of [] => false | (t, _, _, _)::r => (not bounded orelse t <= 1.0) end fun hit(orig, dir, scene, bounded) = case scene of SObj (kind, _, m) => (case (case kind of SSphere (x, r2) => sphere (orig, dir, scene, x, r2) | SEllips => ellipsoid (orig, dir, scene, m) | SCube _ => cube (orig, dir, scene, m) | SCylind _ => cylinder (orig, dir, scene, m) | SCone _ => cone (orig, dir, scene, m) | SPlane (eq, _) => plane (orig, dir, scene, eq)) of [] => false | [(t, _, _, _)] => if bounded andalso t > 1.0 then false else if t < epsilon then false else true | _ => true) | SBound (sc, x, r2) => intersect (orig, dir, x, r2) andalso hit (orig, dir, sc, bounded) | SUnion (sc1, sc2) => hit (orig, dir, sc1, bounded) orelse hit (orig, dir, sc2, bounded) | SInter (sc1, sc2) => let val l1 = find_all (orig, dir, sc1) in case l1 of [] => false | _ => hit_from_inter bounded (inter(l1, find_all (orig, dir, sc2))) end | SDiff (sc1, sc2) => let val l1 = find_all(orig, dir, sc1) in case l1 of [] => false | _ => hit_from_inter bounded (diff(l1, find_all(orig, dir, sc2))) end fun visible (desc: desc, orig, dir, bounded) = not (hit(orig, dir, #scene desc, bounded)) val black = (0.0, 0.0, 0.0) val apply : ((Program.v * Program.v list) -> Program.v list) ref = ref (fn _ => raise(Fail "assert false")) val inline_closure : (Program.v -> Program.v) ref = ref (fn _ => raise(Fail "assert false")) (* Value between 0 and 1 from the sinus and cosinus *) (* Actually, only the sign of the sinus is used *) fun angle (si, co) = let val u = dacos co / 360.0 in if si > 0.0 then u else 1.0 - u end (* XXX Check that 0 <= u,v <= 1 *) fun texture_coord (kind, x: v) = (* section 3.6 *) (* ES: checked *) let fun ellipsOrSphere() = let val y = #2 x val v = (y + 1.0) * 0.5 in if v < epsilon then [VFloat v, VFloat 0.0, VInt 0] else let val u = angle (#1 x, #3 x / sqrt (1.0 - y * y)) in [VFloat v, VFloat u, VInt 0] end end in (* [v; u; face] *) case kind of SEllips => ellipsOrSphere() | SSphere _ => ellipsOrSphere() | SCube _ => if abs_float (#3 x) < epsilon then [VFloat (#2 x), VFloat (#1 x), VInt 0] else if abs_float ((#3 x) - 1.0) < epsilon then [VFloat (#2 x), VFloat (#1 x), VInt 1] else if abs_float (#1 x) < epsilon then [VFloat (#2 x), VFloat (#3 x), VInt 2] else if abs_float ((#1 x) - 1.0) < epsilon then [VFloat (#2 x), VFloat (#3 x), VInt 3] else if abs_float ((#2 x) - 1.0) < epsilon then [VFloat (#3 x), VFloat (#1 x), VInt 4] else (* if abs_float (#2 x) < epsilon then *) [VFloat (#3 x), VFloat (#1 x), VInt 5] | SCylind _ => if abs_float (#2 x) < epsilon then [VFloat (((#3 x) + 1.0) * 0.5), VFloat (((#1 x) + 1.0) * 0.5), VInt 2] else if abs_float ((#2 x) - 1.0) < epsilon then [VFloat (((#3 x) + 1.0) * 0.5), VFloat (((#1 x) + 1.0) * 0.5), VInt 1] else let val u = angle (#1 x, #3 x) in [VFloat (#2 x), VFloat u, VInt 0] end | SCone _ => let val v = (#2 x) in if abs_float v < epsilon then [VFloat v, VFloat 0.0, VInt 0] else if abs_float ((#2 x) - 1.0) < epsilon then [VFloat (((#3 x) + 1.0) * 0.5), VFloat (((#1 x) + 1.0) * 0.5), VInt 1] else let val u = angle (#1 x, (#3 x) / v) in [VFloat v, VFloat u, VInt 0] end end | SPlane _ => [VFloat (#3 x), VFloat (#1 x), VInt 0] end fun normal (kind, m, x', x) = case kind of SSphere (x0, _) => normalize (sub (x, x0)) | SEllips => let val (n0, n1, n2, _) = vmul (transpose m, x') in normalize(n0, n1, n2, 0.0) end | SCylind n => if abs_float (#2 x') < epsilon orelse abs_float (#2 x') - 1.0 < epsilon then n else (* XXX Could be optimized... *) let val (n0, n1, n2, _) = vmul (transpose m, (#1 x', 0.0, #3 x', 0.0)) in normalize(n0, n1, n2, 0.0) end | SCone n => if abs_float (#2 x') - 1.0 < epsilon then n else let val (n0, n1, n2, _) = vmul (transpose m, (#1 x', ~(#2 x'), #3 x', 0.0)) in normalize(n0, n1, n2, 0.0) end | SCube (nx, ny, nz) => if abs_float (#3 x') < epsilon orelse abs_float (#3 x') - 1.0 < epsilon then nz else if abs_float (#1 x') < epsilon orelse abs_float (#1 x') - 1.0 < epsilon then nx else ny | SPlane (_, n) => n fun apply_surface_fun (f, v) = case !apply(f, v) of [VFloat n, VFloat ks, VFloat kd, VPoint (VFloat cr, VFloat cg, VFloat cb)] => (n, ks, kd, cr, cg, cb) | _ => failwith "A surface function returns some incorrect values" fun trace (desc: desc, depth: int, orig, dir) = let val dir = normalize dir in case filter_inter_list (find_all(orig, dir, #scene desc)) of [] => black | (t, ob, _, _) :: _ => trace_2(desc, depth, orig, dir, t, ob) end and trace_2 (desc, depth: int, orig, dir, t, obj) = let val x = add_scaled (orig, t, dir) in case obj of SObj (kind, f, m) => let val x' = vmul (m, x) val (n, ks, kd, cr, cg, cb) = (case !f of Unopt g => (* First we check whether the function would fail *) let val res = apply_surface_fun(g, texture_coord(kind, x')) fun stuck() = f := Opt (!inline_closure g) in (* Then, we check whether it is a constant function *) ((ignore (apply_surface_fun(g, [VInt 0, VInt 0, VFloat 0.0])) ; f := Cst res) handle Stuck_computation _ => stuck() | Stuck_computation' => stuck()) ; res end | Opt g => apply_surface_fun (g, texture_coord (kind, x')) | Cst res => res) val nm = normal (kind, m, x', x) val p = prod (dir, nm) val nm = if p > 0.0 then neg nm else nm val p = ~(abs_float p) (* Ambient composant *) val (ar, ag, ab) = #amb desc val r = ref (kd * ar) val g = ref (kd * ag) val b = ref (kd * ab) (* Lights *) val lights = #lights desc val _ = for(0, Array.length lights - 1, fn i => case (Array.sub(lights, i)) of Light (ldir, (lr, lg, lb)) => let val p' = prod (ldir, nm) in if p' > 0.0 andalso visible (desc, x, ldir, false) then let val int = if ks > epsilon then kd * p' + ks * prod (normalize (sub (ldir, dir)), nm) ** n else kd * p' in r := !r + int * lr; g := !g + int * lg; b := !b + int * lb end else () end | PtLight (src, (lr, lg, lb)) => let val ldir = sub (src, x) val ldir' = normalize ldir val p' = prod (ldir', nm) in if p' > 0.0 andalso visible(desc, x, ldir, true) then let val int = if ks > epsilon then kd * p' + ks * prod (normalize (sub (ldir', dir)), nm) ** n else kd * p' val int = 100.0 * int / (99.0 + square ldir) in r := !r + int * lr; g := !g + int * lg; b := !b + int * lb end else () end | StLight (src, maindir, (lr, lg, lb), cutoff, exp) => let val ldir = sub (src, x) val ldir' = normalize ldir val p' = prod (ldir', nm) val p'' = prod (ldir', maindir) in if p' > 0.0 andalso p'' > cutoff andalso visible(desc, x, ldir, true) then let val int = if ks > epsilon then kd * p' + ks * prod (normalize (sub(ldir', dir)), nm) ** n else kd * p' val int = 100.0 * int / (99.0 + square ldir) * (p'' ** exp) in r := !r + int * lr; g := !g + int * lg; b := !b + int * lb end else () end) val _ = (* Reflexion *) if ks > epsilon andalso depth > 0 then let val dir' = add_scaled (dir, ~2.0 * p, nm) val (r', g', b') = trace(desc, depth - 1, x, dir') in r := !r + ks * r'; g := !g + ks * g'; b := !b + ks * b' end else () in (!r * cr, !g * cg, !b * cb) end | _ => raise(Fail "assert false") end fun conv c : int = let val i = truncate (c * 256.0) in if i < 0 then 0 else if i >= 256 then 255 else i end fun f (amb, lights, obj, depth: int, fov, wid, ht, file) = let val scene = intern_obj(Matrix.identity, Matrix.identity, 1.0, true, obj) val scene = optimize scene val img = Ppm.init (wid, ht) val orig = ( 0.0, 0.0, ~1.0, 1.0 ) val width = 2.0 * dtan (0.5 * fov) val delta = width / float wid val x0 = ~ width / 2.0 val y0 = delta * float ht / 2.0 val desc = { amb = amb, lights = intern_lights lights, scene = scene } in for(0, ht - 1, fn j => for(0, wid - 1, fn i => let val dir = (x0 + (float i + 0.5) * delta, y0 - (float j + 0.5) * delta, 1.0, 0.0) val (r, g, b) = trace(desc, depth, orig, dir) in Ppm.setp (img, i, j, conv r, conv g, conv b) end)) ; Ppm.dump (file, img) end end signature EVAL = sig val f : Program.t list -> unit end structure Eval: EVAL = struct open Caml open Program val rtd = 180.0 / acos (~1.0) val dtr = acos (~1.0) / 180.0 fun deg x = rtd * x fun rad x = dtr * x val zero = VFloat 0.0 val one = VFloat 1.0 fun lookup (env, s) : int = case env of [] => failwith ("Unbound variable \"" ^ s ^ "\"") | s' :: env' => if s = s' then 0 else 1 + (lookup(env', s)) (* XXX embed values *) fun conv (absenv, p) = case p of [] => [] | Float x :: Float y :: Float z :: Prim Point :: r => Val' (VPoint (VFloat x, VFloat y, VFloat z)) :: conv(absenv, r) | t :: r => (case t of Fun p' => Fun' (conv(absenv, p')) :: conv(absenv, r) | Arr p' => Arr' (conv(absenv, p')) :: conv(absenv, r) | Ident s => Ident' (lookup(absenv, s)) :: conv(absenv, r) | Binder s => Binder' :: conv (s :: absenv, r) | Int i => Val' (VInt i) :: conv(absenv, r) | Float f => Val' (VFloat f) :: conv(absenv, r) | Bool b => Val' (VBool b) :: conv(absenv, r) | String s => Val' (VStr s) :: conv(absenv, r) | Prim k => Prim' k :: conv(absenv, r)) fun inline (offset, env, p) = case p of [] => [] | t :: r => let fun normal() = t :: inline(offset, env, r) in case t of Fun' p' => Fun' (inline(offset, env, p')) :: inline(offset, env, r) | Arr' p' => Arr' (inline(offset, env, p')) :: inline(offset, env, r) | Ident' i => if i >= offset then Val' (List.nth (env, i - offset)) :: inline(offset, env, r) else normal() | Binder' => Binder' :: inline (1 + offset, env, r) | Prim' _ => normal() | Val' _ => normal() end val inline_closure = fn (VClos (env, p)) => VClos ([], inline(0, env, p)) | _ => failwith "a surface function was actually not a function" val _ = Render.inline_closure := inline_closure fun eval (env, st, p) = case (st, p) of (* inlined value *) (_, Val' v :: r) => eval(env, (v :: st), r) (* Rule 1 *) (* Rule 2 *) | (v::st', Binder' :: r) => eval((v :: env), st', r) (* Rule 3 *) | (_, Ident' i :: r) => let val v = List.nth(env, i) in eval(env, (v :: st), r) end (* Rule 4 *) | (_, Fun' f :: r) => eval(env, (VClos (env, f) :: st), r) (* Rule 5 *) | (VClos (env', f) :: st', Prim' Apply :: r) => eval(env, eval(env', st', f), r) (* Rule 6 *) | (_, Arr' a :: r) => eval(env, (VArr (Array.of_list (List.rev (eval(env, [], a))))) :: st, r) (* Rules 7 and 8 *) | (VClos _ :: VClos (env', iftrue) :: VBool true :: st', Prim' If :: r) => eval(env, eval(env', st', iftrue), r) | (VClos (env', iffalse) :: VClos _ :: VBool false :: st', Prim' If :: r) => eval(env, eval(env', st', iffalse), r) (* Operations on numbers *) | (VInt n2 :: VInt n1 :: st', Prim' Addi :: r) => eval(env, (VInt (n1 + n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Addf :: r) => eval(env, (VFloat (f1 + f2) :: st'), r) | (VFloat f :: st', Prim' Acos :: r) => eval(env, (VFloat (deg (acos f)) :: st'), r) | (VFloat f :: st', Prim' Asin :: r) => eval(env, (VFloat (deg (asin f)) :: st'), r) | ((vf as VFloat f):: st', Prim' Clampf :: r) => let val f' = if f < 0.0 then zero else if f > 1.0 then one else vf in eval(env, (f' :: st'), r) end | (VFloat f :: st', Prim' Cos :: r) => eval(env, (VFloat (cos (rad f)) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Divi :: r) => eval(env, (VInt (n1 div n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Divf :: r) => eval(env, (VFloat (f1 / f2) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Eqi :: r) => eval(env, (VBool (n1 = n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Eqf :: r) => eval(env, (VBool (Real.==(f1, f2)) :: st'), r) | (VFloat f :: st', Prim' Floor :: r) => eval(env, (VInt (Real.floor f) :: st'), r) | (VFloat f :: st', Prim' Frac :: r) => eval(env, (VFloat (Real.realMod f) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Lessi :: r) => eval(env, (VBool (n1 < n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Lessf :: r) => eval(env, (VBool (f1 < f2) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Modi :: r) => eval(env, (VInt (n1 mod n2) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Muli :: r) => eval(env, (VInt (n1 * n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Mulf :: r) => eval(env, (VFloat (f1 * f2) :: st'), r) | (VInt n :: st', Prim' Negi :: r) => eval(env, (VInt (~ n) :: st'), r) | (VFloat f :: st', Prim' Negf :: r) => eval(env, (VFloat (~ f) :: st'), r) | (VInt n :: st', Prim' Real :: r) => eval(env, (VFloat (float n) :: st'), r) | (VFloat f :: st', Prim' Sin :: r) => eval(env, (VFloat (sin (rad f)) :: st'), r) | (VFloat f :: st', Prim' Sqrt :: r) => eval(env, (VFloat (sqrt f) :: st'), r) | (VInt n2 :: VInt n1 :: st', Prim' Subi :: r) => eval(env, (VInt (n1 - n2) :: st'), r) | (VFloat f2 :: VFloat f1 :: st', Prim' Subf :: r) => eval(env, (VFloat (f1 - f2) :: st'), r) (* Operations on points *) | (VPoint (x, _, _) :: st', Prim' Getx :: r ) => eval(env, (x :: st'), r) | (VPoint (_, y, _) :: st', Prim' Gety :: r ) => eval(env, (y :: st'), r) | (VPoint (_, _, z) :: st', Prim' Getz :: r ) => eval(env, (z :: st'), r) | ((z as VFloat _) :: (y as VFloat _) :: (x as VFloat _) :: st', Prim' Point :: r) => eval(env, (VPoint (x, y, z) :: st'), r) | (VInt i :: VArr a :: st', Prim' Get :: r) => (* if compiled of "-unsafe" *) if i < 0 orelse i >= Array.length a then failwith "illegal access beyond array boundary" else eval(env, (Array.sub(a, i) :: st'), r) | (VArr a :: st', Prim' Length :: r) => eval(env, (VInt (Array.length a) :: st'), r) (* Geometric primitives *) | ((f as VClos _) :: st', Prim' Sphere :: r ) => eval(env, (VObj (OObj (OSphere, ref (Unopt f))) :: st'), r) | ((f as VClos _) :: st', Prim' Cube :: r ) => eval(env, (VObj (OObj (OCube, ref (Unopt f))) :: st'), r) | ((f as VClos _) :: st', Prim' Cylinder :: r) => eval(env, (VObj (OObj (OCylind, ref (Unopt f))) :: st'), r) | ((f as VClos _) :: st', Prim' Cone :: r ) => eval(env, (VObj (OObj (OCone, ref (Unopt f))) :: st'), r) | ((f as VClos _) :: st', Prim' Plane :: r ) => eval(env, (VObj (OObj (OPlane, ref (Unopt f))) :: st'), r) (* Transformations *) | (VFloat z :: VFloat y :: VFloat x :: VObj ob :: st', Prim' Translate :: r) => eval(env, (VObj (OTransform (ob, Matrix.translate (x, y, z), Matrix.translate (~ x, ~ y, ~ z), 1.0, true)) :: st'), r) | (VFloat z :: VFloat y :: VFloat x :: VObj ob :: st', Prim' Scale :: r) => eval( env, (VObj (OTransform (ob, Matrix.scale (x, y, z), Matrix.unscale (x, y, z), Real.max (abs_float x, (Real.max (abs_float y, abs_float z))), false)) :: st'), r) | (VFloat s :: VObj ob :: st', Prim' Uscale :: r) => eval(env, (VObj (OTransform (ob, Matrix.uscale s, Matrix.unuscale s, abs_float s, true)) :: st'), r) | (VFloat t :: VObj ob :: st', Prim' Rotatex :: r) => eval(env, (VObj (OTransform (ob, Matrix.rotatex t, Matrix.rotatex (~ t), 1.0, true)) :: st'), r) | (VFloat t :: VObj ob :: st', Prim' Rotatey :: r) => eval(env, (VObj (OTransform (ob, Matrix.rotatey t, Matrix.rotatey (~ t), 1.0, true)) :: st'), r) | (VFloat t :: VObj ob :: st', Prim' Rotatez :: r) => eval(env, (VObj (OTransform (ob, Matrix.rotatez t, Matrix.rotatez (~ t), 1.0, true)) :: st'), r) (* Lights *) | ((color as VPoint _) :: (dir as VPoint _) :: st', Prim' Light :: r) => eval(env, (VLight (dir, color) :: st'), r) | ((color as VPoint _) :: (pos as VPoint _) :: st', Prim' Pointlight :: r) => eval(env, (VPtLight (pos, color) :: st'), r) | ((expon as VFloat _) :: (cutoff as VFloat _) :: (color as VPoint _) :: (at as VPoint _) :: (pos as VPoint _) :: st', Prim' Spotlight :: r) => eval(env, (VStLight (pos, at, color, cutoff, expon) :: st'), r) (* Constructive geometry *) | ((VObj o2) :: (VObj o1) :: st', Prim' Union :: r) => eval(env, (VObj (OUnion (o1, o2)) :: st'), r) | ((VObj o2) :: (VObj o1) :: st', Prim' Intersect :: r) => eval(env, (VObj (OInter (o1, o2)) :: st'), r) | ((VObj o2) :: (VObj o1) :: st', Prim' Difference :: r) => eval(env, (VObj (ODiff (o1, o2)) :: st'), r) (* Rendering *) | (VStr file :: VInt ht :: VInt wid :: VFloat fov :: VInt depth :: VObj obj :: VArr lights :: VPoint (VFloat ax, VFloat ay, VFloat az) :: st', Prim' Render :: r) => (* amb the intensity of ambient light (a point). lights is an array of lights used to illuminate the scene. obj is the scene to render. depth is an integer limit on the recursive depth of the ray tracing. fov is the horizontal field of view in degrees (a real number). wid is the width of the rendered image in pixels (an integer). ht is the height of the rendered image in pixels (an integer). file is a string specifying output file for the rendered image. *) (Render.f ((ax, ay, az), lights, obj, depth, fov, wid, ht, file) ; eval(env, st', r)) (* Termination *) | (_, []) => st (* Failure *) | _ => raise (Stuck_computation (env, st, p)) fun apply (f, st) = case f of VClos (env, p) => eval(env, st, p) | _ => raise Fail "assert false" val _ = Render.apply := apply fun f p = let val st = eval([], [], (conv([], p))) in case st of [] => () | _ => failwith "error" end handle Stuck_computation (env, st, p) => failwith "stuck" end structure Main = struct fun doit () = Eval.f (Program.read (TextIO.openIn "DATA/chess.gml")) handle _ => () val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop n end end mlton-20100608/benchmark/tests/simple.sml0000644000076600000240000010762011404435630016667 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) fun print _ = () structure Control = struct val trace = ref false end; structure Array2 : sig type 'a array2 exception Subscript val array: (int*int) * 'a -> 'a array2 val sub : 'a array2 * (int*int) -> 'a val update : 'a array2 * (int*int) * 'a -> unit val length : 'a array2 -> (int*int) end = struct type 'a array2 = {size : (int*int), value : 'a Array.array} exception Subscript = Subscript fun index ((i1:int,i2:int),(s1,s2)) = if i1>=0 andalso i1=0 andalso i2 unit val testit : TextIO.outstream -> unit end; (* Simple * error: grid_max < 5 *) functor Simple(val grid_max: int val step_count: int) : BMARK = struct fun fold f [] = (fn b => b) | fold f (a::r) = (fn b => let fun f2(e,[]) = f(e,b) | f2(e,a::r) = f(e,f2(a,r)) in f2(a,r) end) fun min (x:real,y:real) = if x0 andalso endd>=start then let fun f x = if x > endd then () else (body x; f(x+delta)) in f start end else if endd<=start then let fun f x = if x < endd then () else (body x; f(x+delta)) in f start end else () fun from(n,m) = if n>m then [] else n::from(n+1,m) fun flatten [] = [] | flatten (x::xs) = x @ flatten xs fun pow(x:real,y:int) = if y = 0 then 1.0 else x * pow(x,y-1) fun array2(bounds as ((l1,u1),(l2,u2)),v) = (Array2.array((u1-l1+1, u2-l2+1),v), bounds) fun sub2((A,((lb1:int,ub1:int),(lb2:int,ub2:int))),(k,l)) = Array2.sub(A, (k-lb1, l-lb2)) fun update2((A,((lb1,_),(lb2,_))),(k,l), v) = Array2.update(A,(k-lb1,l-lb2),v) fun bounds2(_,b) = b fun printarray2 (A as (M:real Array2.array2,((l1,u1),(l2,u2)))) = for {from=l1,step=1,to=u1} (fn i => (print "["; for {from=l2,step=1,to=u2-1} (fn j => print (Real.toString (sub2(A,(i,j))) ^ ", ")); print (Real.toString (sub2(A,(i,u2))) ^ "]\n"))) fun array1((l,u),v) = (Array.array(u-l+1,v),(l,u)) fun sub1((A,(l:int,u:int)),i:int) = Array.sub(A,i-l) fun update1((A,(l,_)),i,v) = Array.update(A,i-l,v) fun bounds1(_,b) = b (* * Specification of the state variable computation *) val grid_size = ((2,grid_max), (2,grid_max)) fun north (k,l) = (k-1,l) fun south (k,l) = (k+1,l) fun east (k,l) = (k,l+1) fun west (k,l) = (k,l-1) val northeast = north o east val southeast = south o east val northwest = north o west val southwest = south o west fun farnorth x = (north o north ) x fun farsouth x = (south o south) x fun fareast x = (east o east) x fun farwest x = (west o west) x fun zone_A(k,l) = (k,l) fun zone_B(k,l) = (k+1,l) fun zone_C(k,l) = (k+1,l+1) fun zone_D(k,l) = (k,l+1) val zone_corner_northeast = north val zone_corner_northwest = northwest fun zone_corner_southeast zone = zone val zone_corner_southwest = west val ((kmin,kmax),(lmin,lmax)) = grid_size val dimension_all_nodes = ((kmin-1,kmax+1),(lmin-1,lmax+1)) fun for_all_nodes f = for {from=kmin-1, step=1, to=kmax+1} (fn k => for {from=lmin-1, step=1, to=lmax+1} (fn l => f k l)) val dimension_interior_nodes = ((kmin,kmax),(lmin,lmax)) fun for_interior_nodes f = for {from=kmin, step=1, to=kmax} (fn k => for {from=lmin, step=1, to=lmax} (fn l => f k l)) val dimension_all_zones = ((kmin,kmax+1),(lmin,lmax+1)) fun for_all_zones f = for {from=kmin, step=1, to=kmax+1} (fn k => for {from=lmin, step=1, to=lmax+1} (fn l => f (k,l))) val dimension_interior_zones = ((kmin+1,kmax),(lmin+1,lmax)) fun for_interior_zones f = for {from=kmin+1, step=1, to=kmax} (fn k => for {from=lmin+1, step=1, to=lmax} (fn l => f (k,l))) fun map_interior_nodes f = flatten(map (fn k => (map (fn l => f (k,l)) (from(lmin,lmax)))) (from(kmin,kmax))) fun map_interior_zones f = flatten(map (fn k => (map (fn l => f (k,l)) (from(lmin+1,lmax)))) (from(kmin+1,kmax))) fun for_north_ward_interior_zones f = for {from=kmax, step= ~1, to=kmin+1} (fn k => for {from=lmin+1, step=1, to=lmax} (fn l => f (k,l))) fun for_west_ward_interior_zones f = for {from=kmin+1, step=1, to=kmax} (fn k => for {from=lmax, step= ~1, to=lmin+1} (fn l => f (k,l))) fun for_north_zones f = for {from=lmin, step=1, to=lmax+1} (fn l => f (kmin,l)) fun for_south_zones f = for {from=lmin+1, step=1, to=lmax} (fn l => f (kmax+1,l)) fun for_east_zones f = for {from=kmin+1, step=1, to=kmax+1}(fn k => f (k,lmax+1)) fun for_west_zones f = for {from=kmin+1, step=1, to=kmax+1}(fn k => f (k,lmin)) fun reflect dir node A = sub2(A, dir node) val reflect_north = fn x => reflect north x val reflect_south = fn x => reflect south x val reflect_east = fn x => reflect east x val reflect_west = fn x => reflect west x fun for_north_nodes f = for {from=lmin, step=1, to=lmax-1} (fn l => f (kmin-1,l)) fun for_south_nodes f = for {from=lmin, step=1, to=lmax-1} (fn l => f (kmax+1,l)) fun for_east_nodes f = for {from=kmin, step=1, to=kmax-1} (fn k => f (k,lmax+1)) fun for_west_nodes f = for {from=kmin, step=1, to=kmax-1} (fn k => f (k,lmin-1)) val north_east_corner = (kmin-1,lmax+1) val north_west_corner = (kmin-1,lmin-1) val south_east_corner = (kmax+1,lmax+1) val south_west_corner = (kmax+1,lmin-1) val west_of_north_east = (kmin-1, lmax) val west_of_south_east = (kmax+1, lmax) val north_of_south_east = (kmax, lmax+1) val north_of_south_west = (kmax, lmin-1) (* * Initialization of parameters *) val constant_heat_source = 0.0 val deltat_maximum = 0.01 val specific_heat = 0.1 val p_coeffs = let val M = array2(((0,2),(0,2)), 0.0) in update2(M, (1,1), 0.06698); M end val e_coeffs = let val M = array2(((0,2),(0,2)), 0.0) in update2(M, (0,1), 0.1); M end val p_poly = array2(((1,4),(1,5)),p_coeffs) val e_poly = array2(((1,4),(1,5)), e_coeffs) val rho_table = let val V = array1((1,3), 0.0) in update1(V,2,1.0); update1(V,3,100.0); V end val theta_table = let val V = array1((1,4), 0.0) in update1(V,2,3.0); update1(V,3,300.0); update1(V,4,3000.0); V end val extract_energy_tables_from_constants = (e_poly,2,rho_table,theta_table) val extract_pressure_tables_from_constants = (p_poly,2,rho_table,theta_table) val nbc = let val M = array2(dimension_all_zones, 1) in for {from=lmin+1,step=1,to=lmax} (fn j => update2(M,(kmax+1, j),2)); update2(M,(kmin,lmin),4); update2(M,(kmin,lmax+1),4); update2(M,(kmax+1,lmin),4); update2(M,(kmax+1,lmax+1),4); M end val pbb = let val A = array1((1,4), 0.0) in update1(A,2,6.0); A end val pb = let val A = array1((1,4), 1.0) in update1(A,2,0.0); update1(A,3,0.0); A end val qb = pb val all_zero_nodes = array2(dimension_all_nodes, 0.0) val all_zero_zones = array2(dimension_all_zones, 0.0) (* * Positional Coordinates. (page 9-10) *) fun make_position_matrix interior_function = let val r' = array2(dimension_all_nodes, 0.0) val z' = array2(dimension_all_nodes, 0.0) fun boundary_position (rx,zx,ry,zy,ra,za) = let val (rax, zax) = (ra - rx, za - zx) val (ryx, zyx) = (ry - rx, zy - zx) val omega = 2.0*(rax*ryx + zax*zyx)/(ryx*ryx + zyx*zyx) val rb = rx - rax + omega*ryx val zb = zx - zax + omega*zyx in (rb, zb) end fun reflect_node (x_dir, y_dir, a_dir, node) = let val rx = reflect x_dir node r' val zx = reflect x_dir node z' val ry = reflect y_dir node r' val zy = reflect y_dir node z' val ra = reflect a_dir node r' val za = reflect a_dir node z' in boundary_position (rx, zx, ry, zy, ra, za) end fun u2 (rv,zv) n = (update2(r',n,rv); update2(z',n,zv)) in for_interior_nodes (fn k => fn l => u2 (interior_function (k,l)) (k,l)); for_north_nodes(fn n => u2 (reflect_node(south,southeast,farsouth,n)) n); for_south_nodes (fn n => u2(reflect_node(north,northeast,farnorth,n)) n); for_east_nodes (fn n => u2(reflect_node(west, southwest, farwest, n)) n); for_west_nodes (fn n => u2(reflect_node(east, southeast, fareast, n)) n); u2 (reflect_node(south, southwest, farsouth, west_of_north_east)) west_of_north_east; u2 (reflect_node(north, northwest, farnorth, west_of_south_east)) west_of_south_east; u2 (reflect_node(west, northwest, farwest, north_of_south_east)) north_of_south_east; u2 (reflect_node(east, northeast, fareast, north_of_south_west)) north_of_south_west; u2 (reflect_node(southwest, west, farwest, north_east_corner)) north_east_corner; u2 (reflect_node(northwest, west, farwest, south_east_corner)) south_east_corner; u2 (reflect_node(southeast, south, farsouth, north_west_corner)) north_west_corner; u2 (reflect_node(northeast, east, fareast, south_west_corner)) south_west_corner; (r',z') end (* * Physical Properties of a Zone (page 10) *) fun zone_area_vol ((r,z), zone) = let val (r1,z1)=(sub2(r,zone_corner_southwest zone), sub2(z,zone_corner_southwest zone)) val (r2,z2)=(sub2(r,zone_corner_southeast zone), sub2(z,zone_corner_southeast zone)) val (r3,z3)=(sub2(r,zone_corner_northeast zone), sub2(z,zone_corner_northeast zone)) val (r4,z4)=(sub2(r,zone_corner_northwest zone), sub2(z,zone_corner_northwest zone)) val area1 = (r2-r1)*(z3-z1) - (r3-r2)*(z3-z2) val radius1 = 0.3333 *(r1+r2+r3) val volume1 = area1 * radius1 val area2 = (r3-r1)*(z4-z3) - (r4-r3)*(z3-z1) val radius2 = 0.3333 *(r1+r3+r4) val volume2 = area2 * radius2 in (area1+area2, volume1+volume2) end (* * Velocity (page 8) *) fun make_velocity((u,w),(r,z),p,q,alpha,rho,delta_t) = let fun line_integral (p,z,node) : real = sub2(p,zone_A node)*(sub2(z,west node) - sub2(z,north node)) + sub2(p,zone_B node)*(sub2(z,south node) - sub2(z,west node)) + sub2(p,zone_C node)*(sub2(z,east node) - sub2(z,south node)) + sub2(p,zone_D node)*(sub2(z,north node) - sub2(z,east node)) fun regional_mass node = 0.5 * (sub2(rho, zone_A node)*sub2(alpha,zone_A node) + sub2(rho, zone_B node)*sub2(alpha,zone_B node) + sub2(rho, zone_C node)*sub2(alpha,zone_C node) + sub2(rho, zone_D node)*sub2(alpha,zone_D node)) fun velocity node = let val d = regional_mass node val n1 = ~(line_integral(p,z,node)) - line_integral(q,z,node) val n2 = line_integral(p,r,node) + line_integral(q,r,node) val u_dot = n1/d val w_dot = n2/d in (sub2(u,node)+delta_t*u_dot, sub2(w,node)+delta_t*w_dot) end val U = array2(dimension_interior_nodes,0.0) val W = array2(dimension_interior_nodes,0.0) in for_interior_nodes (fn k => fn l => let val (uv,wv) = velocity (k,l) in update2(U,(k,l),uv); update2(W,(k,l),wv) end); (U,W) end fun make_position ((r,z),delta_t,(u',w')) = let fun interior_position node = (sub2(r,node) + delta_t*sub2(u',node), sub2(z,node) + delta_t*sub2(w',node)) in make_position_matrix interior_position end fun make_area_density_volume(rho, s, x') = let val alpha' = array2(dimension_all_zones, 0.0) val s' = array2(dimension_all_zones, 0.0) val rho' = array2(dimension_all_zones, 0.0) fun interior_area zone = let val (area, vol) = zone_area_vol (x', zone) val density = sub2(rho,zone)*sub2(s,zone) / vol in (area,vol,density) end fun reflect_area_vol_density reflect_function = (reflect_function alpha',reflect_function s',reflect_function rho') fun update_asr (zone,(a,s,r)) = (update2(alpha',zone,a); update2(s',zone,s); update2(rho',zone,r)) fun r_area_vol_den (reflect_dir,zone) = let val asr = reflect_area_vol_density (reflect_dir zone) in update_asr(zone, asr) end in for_interior_zones (fn zone => update_asr(zone, interior_area zone)); for_south_zones (fn zone => r_area_vol_den(reflect_north, zone)); for_east_zones (fn zone => r_area_vol_den(reflect_west, zone)); for_west_zones (fn zone => r_area_vol_den(reflect_east, zone)); for_north_zones (fn zone => r_area_vol_den(reflect_south, zone)); (alpha', rho', s') end (* * Artifical Viscosity (page 11) *) fun make_viscosity(p,(u',w'),(r',z'), alpha',rho') = let fun interior_viscosity zone = let fun upper_del f = 0.5 * ((sub2(f,zone_corner_southeast zone) - sub2(f,zone_corner_northeast zone)) + (sub2(f,zone_corner_southwest zone) - sub2(f,zone_corner_northwest zone))) fun lower_del f = 0.5 * ((sub2(f,zone_corner_southeast zone) - sub2(f,zone_corner_southwest zone)) + (sub2(f,zone_corner_northeast zone) - sub2(f,zone_corner_northwest zone))) val xi = pow(upper_del r',2) + pow(upper_del z',2) val eta = pow(lower_del r',2) + pow(lower_del z',2) val upper_disc = (upper_del r')*(lower_del w') - (upper_del z')*(lower_del u') val lower_disc = (upper_del u')*(lower_del z') - (upper_del w') * (lower_del r') val upper_ubar = if upper_disc<0.0 then upper_disc/xi else 0.0 val lower_ubar = if lower_disc<0.0 then lower_disc/eta else 0.0 val gamma = 1.6 val speed_of_sound = gamma*sub2(p,zone)/sub2(rho',zone) val ubar = pow(upper_ubar,2) + pow(lower_ubar,2) val viscosity = sub2(rho',zone)*(1.5*ubar + 0.5*speed_of_sound*(Math.sqrt ubar)) val length = Math.sqrt(pow(upper_del r',2) + pow(lower_del r',2)) val courant_delta = 0.5* sub2(alpha',zone)/(speed_of_sound*length) in (viscosity, courant_delta) end val q' = array2(dimension_all_zones, 0.0) val d = array2(dimension_all_zones, 0.0) fun reflect_viscosity_cdelta (direction, zone) = sub2(q',direction zone) * sub1(qb, sub2(nbc,zone)) fun do_zones (dir,zone) = update2(q',zone,reflect_viscosity_cdelta (dir,zone)) in for_interior_zones (fn zone => let val (qv,dv) = interior_viscosity zone in update2(q',zone,qv); update2(d,zone,dv) end); for_south_zones (fn zone => do_zones(north,zone)); for_east_zones (fn zone => do_zones(west,zone)); for_west_zones (fn zone => do_zones(east,zone)); for_north_zones (fn zone => do_zones(south,zone)); (q', d) end (* * Pressure and Energy Polynomial (page 12) *) fun polynomial(G,degree,rho_table,theta_table,rho_value,theta_value) = let fun table_search (table, value) = let val (low, high) = bounds1 table fun search_down i = if value > sub1(table,i-1) then i else search_down (i-1) in if value>sub1(table,high) then high+1 else if value <= sub1(table,low) then low else search_down high end val rho_index = table_search(rho_table, rho_value) val theta_index = table_search(theta_table, theta_value) val A = sub2(G, (rho_index, theta_index)) fun from(n,m) = if n>m then [] else n::from(n+1,m) fun f(i,j) = sub2(A,(i,j))*pow(rho_value,i)*pow(theta_value,j) in sum_list (map (fn i => sum_list(map (fn j => f (i,j)) (from(0,degree)))) (from (0,degree))) end fun zonal_pressure (rho_value:real, theta_value:real) = let val (G,degree,rho_table,theta_table) = extract_pressure_tables_from_constants in polynomial(G, degree, rho_table, theta_table, rho_value, theta_value) end fun zonal_energy (rho_value, theta_value) = let val (G, degree, rho_table, theta_table) = extract_energy_tables_from_constants in polynomial(G, degree, rho_table, theta_table, rho_value, theta_value) end val dx = 0.000001 val tiny = 0.000001 fun newton_raphson (f,x) = let fun iter (x,fx) = if fx > tiny then let val fxdx = f(x+dx) val denom = fxdx - fx in if denom < tiny then iter(x,tiny) else iter(x-fx*dx/denom, fxdx) end else x in iter(x, f x) end (* * Temperature (page 13-14) *) fun make_temperature(p,epsilon,rho,theta,rho_prime,q_prime) = let fun interior_temperature zone = let val qkl = sub2(q_prime,zone) val rho_kl = sub2(rho,zone) val rho_prime_kl = sub2(rho_prime,zone) val tau_kl = (1.0 /rho_prime_kl - 1.0/rho_kl) fun energy_equation epsilon_kl theta_kl = epsilon_kl - zonal_energy(rho_kl,theta_kl) val epsilon_0 = sub2(epsilon,zone) fun revised_energy pkl = epsilon_0 - (pkl + qkl) * tau_kl fun revised_temperature epsilon_kl theta_kl = newton_raphson ((energy_equation epsilon_kl), theta_kl) fun revised_pressure theta_kl = zonal_pressure(rho_kl, theta_kl) val p_0 = sub2(p,zone) val theta_0 = sub2(theta,zone) val epsilon_1 = revised_energy p_0 val theta_1 = revised_temperature epsilon_1 theta_0 val p_1 = revised_pressure theta_1 val epsilon_2 = revised_energy p_1 val theta_2 = revised_temperature epsilon_2 theta_1 in theta_2 end val M = array2(dimension_all_zones, constant_heat_source) in for_interior_zones (fn zone => update2(M, zone, interior_temperature zone)); M end (* * Heat conduction *) fun make_cc(alpha_prime, theta_hat) = let fun interior_cc zone = (0.0001 * pow(sub2(theta_hat,zone),2) * (Math.sqrt (abs(sub2(theta_hat,zone)))) / sub2(alpha_prime,zone)) handle Sqrt => (print (Real.toString (sub2(theta_hat, zone))); print ("\nzone =(" ^ Int.toString (#1 zone) ^ "," ^ Int.toString (#2 zone) ^ ")\n"); printarray2 theta_hat; raise Sqrt) val cc = array2(dimension_all_zones, 0.0) in for_interior_zones(fn zone => update2(cc,zone, interior_cc zone)); for_south_zones(fn zone => update2(cc,zone, reflect_north zone cc)); for_west_zones(fn zone => update2(cc,zone,reflect_east zone cc)); for_east_zones(fn zone => update2(cc,zone,reflect_west zone cc)); for_north_zones(fn zone => update2(cc,zone, reflect_south zone cc)); cc end fun make_sigma(deltat, rho_prime, alpha_prime) = let fun interior_sigma zone = sub2(rho_prime,zone)*sub2(alpha_prime,zone)*specific_heat/ deltat val M = array2(dimension_interior_zones, 0.0) fun ohandle zone = (print (Real.toString (sub2(rho_prime, zone)) ^ " "); print (Real.toString (sub2(alpha_prime, zone)) ^ " "); print (Real.toString specific_heat ^ " "); print (Real.toString deltat ^ "\n"); raise Overflow) in if !Control.trace then print ("\t\tmake_sigma:deltat = " ^ Real.toString deltat ^ "\n") else (); (*** for_interior_zones(fn zone => update2(M,zone, interior_sigma zone)) **) for_interior_zones(fn zone => (update2(M,zone, interior_sigma zone) handle Overflow => ohandle zone)); M end fun make_gamma ((r_prime,z_prime), cc, succeeding, adjacent) = let fun interior_gamma zone = let val r1 = sub2(r_prime, zone_corner_southeast zone) val z1 = sub2(z_prime, zone_corner_southeast zone) val r2 = sub2(r_prime, zone_corner_southeast (adjacent zone)) val z2 = sub2(z_prime, zone_corner_southeast (adjacent zone)) val cross_section = 0.5*(r1+r2)*(pow(r1 - r2,2)+pow(z1 - z2,2)) val (c1,c2) = (sub2(cc, zone), sub2(cc, succeeding zone)) val specific_conductivity = 2.0 * c1 * c2 / (c1 + c2) in cross_section * specific_conductivity end val M = array2(dimension_all_zones, 0.0) in for_interior_zones(fn zone => update2(M,zone,interior_gamma zone)); M end fun make_ab(theta, sigma, Gamma, preceding) = let val a = array2(dimension_all_zones, 0.0) val b = array2(dimension_all_zones, 0.0) fun interior_ab zone = let val denom = sub2(sigma, zone) + sub2(Gamma, zone) + sub2(Gamma, preceding zone) * (1.0 - sub2(a, preceding zone)) val nume1 = sub2(Gamma,zone) val nume2 = sub2(Gamma,preceding zone)*sub2(b,preceding zone) + sub2(sigma,zone) * sub2(theta,zone) in (nume1/denom, nume2 / denom) end val f = fn zone => update2(b,zone,sub2(theta,zone)) in for_north_zones f; for_south_zones f; for_west_zones f; for_east_zones f; for_interior_zones(fn zone => let val ab = interior_ab zone in update2(a,zone,#1 ab); update2(b,zone,#2 ab) end); (a,b) end fun make_theta (a, b, succeeding, int_zones) = let val theta = array2(dimension_all_zones, constant_heat_source) fun interior_theta zone = sub2(a,zone) * sub2(theta,succeeding zone)+ sub2(b,zone) in int_zones (fn (k,l) => update2(theta, (k,l), interior_theta (k,l))); theta end fun compute_heat_conduction(theta_hat, deltat, x', alpha', rho') = let val sigma = make_sigma(deltat, rho', alpha') val _ = if !Control.trace then print "\tdone make_sigma\n" else () val cc = make_cc(alpha', theta_hat) val _ = if !Control.trace then print "\tdone make_cc\n" else () val Gamma_k = make_gamma( x', cc, north, east) val _ = if !Control.trace then print "\tdone make_gamma\n" else () val (a_k,b_k) = make_ab(theta_hat, sigma, Gamma_k, north) val _ = if !Control.trace then print "\tdone make_ab\n" else () val theta_k = make_theta(a_k,b_k,south,for_north_ward_interior_zones) val _ = if !Control.trace then print "\tdone make_theta\n" else () val Gamma_l = make_gamma(x', cc, west, south) val _ = if !Control.trace then print "\tdone make_gamma\n" else () val (a_l,b_l) = make_ab(theta_k, sigma, Gamma_l, west) val _ = if !Control.trace then print "\tdone make_ab\n" else () val theta_l = make_theta(a_l,b_l,east,for_west_ward_interior_zones) val _ = if !Control.trace then print "\tdone make_theta\n" else () in (theta_l, Gamma_k, Gamma_l) end (* * Final Pressure and Energy calculation *) fun make_pressure(rho', theta') = let val p = array2(dimension_all_zones, 0.0) fun boundary_p(direction, zone) = sub1(pbb, sub2(nbc, zone)) + sub1(pb,sub2(nbc,zone)) * sub2(p, direction zone) in for_interior_zones (fn zone => update2(p,zone,zonal_pressure(sub2(rho',zone), sub2(theta',zone)))); for_south_zones(fn zone => update2(p,zone,boundary_p(north,zone))); for_east_zones(fn zone => update2(p,zone,boundary_p(west,zone))); for_west_zones(fn zone => update2(p,zone,boundary_p(east,zone))); for_north_zones(fn zone => update2(p,zone,boundary_p(south,zone))); p end fun make_energy(rho', theta') = let val epsilon' = array2(dimension_all_zones, 0.0) in for_interior_zones (fn zone => update2(epsilon', zone, zonal_energy(sub2(rho',zone), sub2(theta',zone)))); for_south_zones (fn zone => update2(epsilon',zone, reflect_north zone epsilon')); for_west_zones (fn zone => update2(epsilon',zone, reflect_east zone epsilon')); for_east_zones (fn zone => update2(epsilon',zone, reflect_west zone epsilon')); for_north_zones (fn zone => update2(epsilon',zone, reflect_south zone epsilon')); epsilon' end (* * Energy Error Calculation (page 20) *) fun compute_energy_error ((u',w'),(r',z'),p',q',epsilon',theta',rho',alpha', Gamma_k,Gamma_l,deltat) = let fun mass zone = sub2(rho',zone) * sub2(alpha',zone):real val internal_energy = sum_list (map_interior_zones (fn z => sub2(epsilon',z)*(mass z))) fun kinetic node = let val average_mass = 0.25*((mass (zone_A node)) + (mass (zone_B node)) + (mass (zone_C node)) + (mass (zone_D node))) val v_square = pow(sub2(u',node),2) + pow(sub2(w',node),2) in 0.5 * average_mass * v_square end val kinetic_energy = sum_list (map_interior_nodes kinetic) fun work_done (node1, node2) = let val (r1, r2) = (sub2(r',node1), sub2(r',node2)) val (z1, z2) = (sub2(z',node1), sub2(z',node2)) val (u1, u2) = (sub2(p',node1), sub2(p',node2)) val (w1, w2) = (sub2(z',node1), sub2(z',node2)) val (p1, p2) = (sub2(p',node1), sub2(p',node2)) val (q1, q2) = (sub2(q',node1), sub2(q',node2)) val force = 0.5*(p1+p2+q1+q2) val radius = 0.5* (r1+r2) val area = 0.5* ((r1-r2)*(u1-u2) - (z1-z2)*(w1-w2)) in force * radius * area * deltat end fun from(n,m) = if n > m then [] else n::from(n+1,m) val north_line = map (fn l => (west(kmin,l),(kmin,l))) (from(lmin+1,lmax)) val south_line = map (fn l => (west(kmax,l),(kmax,l))) (from(lmin+1,lmax)) val east_line = map (fn k => (south(k,lmax),(k,lmax))) (from(kmin+1,kmax)) val west_line = map (fn k => (south(k,lmin+1),(k,lmin+1))) (from(kmin+1,kmax)) val w1 = sum_list (map work_done north_line) val w2 = sum_list (map work_done south_line) val w3 = sum_list (map work_done east_line) val w4 = sum_list (map work_done west_line) val boundary_work = w1 + w2 + w3 + w4 fun heat_flow Gamma (zone1,zone2) = deltat * sub2(Gamma, zone1) * (sub2(theta',zone1) - sub2(theta',zone2)) val north_flow = let val k = kmin+1 in map (fn l => (north(k,l),(k,l))) (from(lmin+1,lmax)) end val south_flow = let val k = kmax in map (fn l => (south(k,l),(k,l))) (from(lmin+2,lmax-1)) end val east_flow = let val l = lmax in map (fn k => (east(k,l),(k,l))) (from(kmin+2,kmax)) end val west_flow = let val l = lmin+1 in map (fn k => (west(k,l),(k,l))) (from(kmin+2,kmax)) end val h1 = sum_list (map (heat_flow Gamma_k) north_flow) val h2 = sum_list (map (heat_flow Gamma_k) south_flow) val h3 = sum_list (map (heat_flow Gamma_l) east_flow) val h4 = sum_list (map (heat_flow Gamma_l) west_flow) val boundary_heat = h1 + h2 + h3 + h4 in internal_energy + kinetic_energy - boundary_heat - boundary_work end fun compute_time_step(d, theta_hat, theta') = let val deltat_courant = min_list (map_interior_zones (fn zone => sub2(d,zone))) val deltat_conduct = max_list (map_interior_zones (fn z => (abs(sub2(theta_hat,z) - sub2(theta', z))/ sub2(theta_hat,z)))) val deltat_minimum = min (deltat_courant, deltat_conduct) in min (deltat_maximum, deltat_minimum) end fun compute_initial_state () = let val v = (all_zero_nodes, all_zero_nodes) val x = let fun interior_position (k,l) = let val pi = 3.1415926535898 val rp = real (lmax - lmin) val z1 = real(10 + k - kmin) val zz = (~0.5 + real(l - lmin) / rp) * pi in (z1 * Math.cos zz, z1 * Math.sin zz) end in make_position_matrix interior_position end val (alpha,s) = let val (alpha_prime,s_prime) = let val A = array2(dimension_all_zones, 0.0) val S = array2(dimension_all_zones, 0.0) fun reflect_area_vol f = (f A, f S) fun u2 (f,z) = let val (a,s) = reflect_area_vol(f z) in update2(A,z,a); update2(S,z,s) end in for_interior_zones (fn z => let val (a,s) = zone_area_vol(x, z) in update2(A,z,a); update2(S,z,s) end); for_south_zones (fn z => u2 (reflect_north, z)); for_east_zones (fn z => u2 (reflect_west, z)); for_west_zones (fn z => u2 (reflect_east, z)); for_north_zones (fn z => u2 (reflect_south, z)); (A,S) end in (alpha_prime,s_prime) end val rho = let val R = array2(dimension_all_zones, 0.0) in for_all_zones (fn z => update2(R,z,1.4)); R end val theta = let val T = array2(dimension_all_zones, constant_heat_source) in for_interior_zones(fn z => update2(T,z,0.0001)); T end val p = make_pressure(rho, theta) val q = all_zero_zones val epsilon = make_energy(rho, theta) val deltat = 0.01 val c = 0.0 in (v,x,alpha,s,rho,p,q,epsilon,theta,deltat,c) end fun compute_next_state state = let val (v,x,alpha,s,rho,p,q,epsilon,theta,deltat,c) = state val v' = make_velocity (v, x, p, q, alpha, rho, deltat) val _ = if !Control.trace then print "done make_velocity\n" else () val x' = make_position(x,deltat,v') handle Overflow =>(printarray2 (#1 v'); printarray2 (#2 v'); raise Overflow) val _ = if !Control.trace then print "done make_position\n" else () val (alpha',rho',s') = make_area_density_volume (rho, s , x') val _ = if !Control.trace then print "done make_area_density_volume\n" else () val (q',d) = make_viscosity (p, v', x', alpha', rho') val _ = if !Control.trace then print "done make_viscosity\n" else () val theta_hat = make_temperature (p, epsilon, rho, theta, rho', q') val _ = if !Control.trace then print "done make_temperature\n" else () val (theta',Gamma_k,Gamma_l) = compute_heat_conduction (theta_hat, deltat, x', alpha', rho') val _ = if !Control.trace then print "done compute_heat_conduction\n" else () val p' = make_pressure(rho', theta') val _ = if !Control.trace then print "done make_pressure\n" else () val epsilon' = make_energy (rho', theta') val _ = if !Control.trace then print "done make_energy\n" else () val c' = compute_energy_error (v', x', p', q', epsilon', theta', rho', alpha', Gamma_k, Gamma_l, deltat) val _ = if !Control.trace then print "done compute_energy_error\n" else () val deltat' = compute_time_step (d, theta_hat, theta') val _ = if !Control.trace then print "done compute_time_step\n\n" else () in (v',x',alpha',s',rho',p',q', epsilon',theta',deltat',c') end fun runit () = let fun iter (i,state) = if i = 0 then state else (print "."; iter(i-1, compute_next_state state)) in iter(step_count, compute_initial_state()) end fun print_state ((v1,v2),(r,z),alpha,s,rho,p,q,epsilon,theta,deltat,c) = ( print "Velocity matrices = \n"; printarray2 v1; print "\n\n"; printarray2 v2; print "\n\nPosition matrices = \n"; printarray2 r; print "\n\n"; printarray2 z; print "\n\nalpha = \n"; printarray2 alpha; print "\n\ns = \n"; printarray2 s; print "\n\nrho = \n"; printarray2 rho; print "\n\nPressure = \n"; printarray2 p; print "\n\nq = \n"; printarray2 q; print "\n\nepsilon = \n"; printarray2 epsilon; print "\n\ntheta = \n"; printarray2 theta; print ("delatat = " ^ Real.toString (deltat : real)^ "\n"); print ("c = " ^ Real.toString (c : real) ^ "\n")) fun testit outstrm = print_state (runit()) fun doit () = let val (_, _, _, _, _, _, _, _, _, delta', c') = runit() val delta = Real.trunc delta' val c = Real.trunc (c' * 10000.0) in if (c = 6787 andalso delta = ~33093) then () else TextIO.output (TextIO.stdErr, "*** ERROR ***\n") end val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop n end end; (* functor Simple *) structure Main = Simple (val grid_max=100 val step_count=1); mlton-20100608/benchmark/tests/smith-normal-form.sml0000644000076600000240000006402111404435630020746 0ustar mtfstaff(* Written by Henry Cejtin (henry@sourcelight.com). *) signature MATRIX = sig type 'entry matrix val make: int * int * (int * int -> 'entry) -> 'entry matrix val height: 'entry matrix -> int val width: 'entry matrix -> int val fetch: 'entry matrix * int * int -> 'entry val fetchRow: 'entry matrix * int -> int -> 'entry val fetchCol: 'entry matrix * int -> int -> 'entry val store: 'entry matrix * int * int * 'entry -> unit val storeRow: 'entry matrix * int -> int * 'entry -> unit val storeCol: 'entry matrix * int -> int * 'entry -> unit val rowSwap: 'entry matrix * int * int -> unit val colSwap: 'entry matrix * int * int -> unit val rowOp: 'entry matrix * int * int * ('entry * 'entry -> 'entry) -> unit val colOp: 'entry matrix * int * int * ('entry * 'entry -> 'entry) -> unit val copy: 'entry matrix -> 'entry matrix val map: 'entry1 matrix * ('entry1 -> 'entry2) -> 'entry2 matrix val toString: 'entry matrix * ('entry -> string) -> string end structure Matrix:> MATRIX = struct type 'entry matrix = int * int * 'entry array exception sizeError exception index exception foldError fun make (height: int, width: int, generator: int * int -> 'entry) : 'entry matrix = if height < 0 orelse width < 0 then raise sizeError else (height, width, Array.tabulate (height*width, fn z => generator (z div width, z mod width))) fun height (height, _, _) = height fun width (width, _, _) = width fun fetch ((height, width, mat), row, col) = if 0 <= row andalso row < height andalso 0 <= col andalso col < width then Array.sub (mat, col + width*row) else raise index fun fetchRow ((height, width, mat), row) = if 0 <= row andalso row < height then let val offset = width * row in fn col => if 0 <= col andalso col < width then Array.sub (mat, col + offset) else raise index end else raise index fun fetchCol ((height, width, mat), col) = if 0 <= col andalso col < width then fn row => if 0 <= row andalso row < height then Array.sub (mat, col + width*row) else raise index else raise index fun store ((height, width, mat), row, col, entry) = if 0 <= row andalso row < height andalso 0 <= col andalso col < width then Array.update (mat, col + width*row, entry) else raise index fun storeRow ((height, width, mat), row) = if 0 <= row andalso row < height then let val offset = width * row in fn (col, entry) => if 0 <= col andalso col < width then Array.update (mat, col + offset, entry) else raise index end else raise index fun storeCol ((height, width, mat), col) = if 0 <= col andalso col < width then fn (row, entry) => if 0 <= row andalso row < height then Array.update (mat, col + width*row, entry) else raise index else raise index fun swapLoop (from1: int -> 'entry, to1: int * 'entry -> unit, from2: int -> 'entry, to2: int * 'entry -> unit, limit: int): unit = let fun loop (i: int): unit = if i = limit then () else let val tmp = from1 i in to1 (i, from2 i); to2 (i, tmp); loop (i + 1) end in loop 0 end fun rowSwap (mat as (height, width, _), row1, row2): unit = if 0 <= row1 andalso row1 < height andalso 0 <= row2 andalso row2 < height then if row1 = row2 then () else swapLoop (fetchRow (mat, row1), storeRow (mat, row1), fetchRow (mat, row2), storeRow (mat, row2), width) else raise index fun colSwap (mat as (height, width, _), col1, col2): unit = if 0 <= col1 andalso col1 < width andalso 0 <= col2 andalso col2 < width then if col1 = col2 then () else swapLoop (fetchCol (mat, col1), storeCol (mat, col1), fetchCol (mat, col2), storeCol (mat, col2), height) else raise index fun opLoop (from1: int -> 'entry, from2: int -> 'entry, to2: int * 'entry -> unit, limit: int, f: 'entry * 'entry -> 'entry): unit = let fun loop (i: int): unit = if i = limit then () else ( to2 (i, f (from1 i, from2 i)); loop (i + 1)) in loop 0 end fun rowOp (mat as (height, width, _), row1, row2, f: 'entry * 'entry -> 'entry): unit = if 0 <= row1 andalso row1 < height andalso 0 <= row2 andalso row2 < height andalso row1 <> row2 then opLoop (fetchRow (mat, row1), fetchRow (mat, row2), storeRow (mat, row2), width, f) else raise index fun colOp (mat as (height, width, _), col1, col2, f: 'entry * 'entry -> 'entry): unit = if 0 <= col1 andalso col1 < width andalso 0 <= col2 andalso col2 < width andalso col1 <> col2 then opLoop (fetchCol (mat, col1), fetchCol (mat, col2), storeCol (mat, col2), height, f) else raise index fun copy ((height, width, mat)) = (height, width, Array.tabulate (Array.length mat, fn i => Array.sub (mat, i))) fun map ((height, width, mat: 'entry1 Array.array), f: 'entry1 -> 'entry2) : 'entry2 matrix = (height, width, Array.tabulate (Array.length mat, fn i => f (Array.sub (mat, i)))) (* Natural fold a range of integers in reverse. *) fun naturalFold (limit: int, state: 'state, folder: int * 'state -> 'state): 'state = let fun loop (i: int, state: 'state) = if i = 0 then state else loop (i - 1, folder (i - 1, state)) in if limit < 0 then raise foldError else loop (limit, state) end local val blank8 = Byte.charToByte #" " fun makeBlanks size = let val blanks = Word8Vector.tabulate (size, fn _ => blank8) in Byte.bytesToString blanks end in fun toString (mat: 'entry matrix, f: 'entry -> string): string = let val mat as (height, width, _) = map (mat, f) fun maxSize from (i, width) = Int.max (String.size (from i), width) fun colWidth col = naturalFold (height, 0, maxSize (fetchCol (mat, col))) val widths = Vector.tabulate (width, colWidth) fun doRow (row: int, ac: string list): string list = let val from = fetchRow (mat, row) fun loop (col: int, ac: string list) = let val next = from col val ac = next::ac val s = String.size next val pad = Vector.sub (widths, col) - s val ac = if pad <= 0 then ac else (makeBlanks pad)::ac in if col = 0 then ac else loop (col - 1, " "::ac) end val ac = "\n"::ac in if width = 0 then ac else loop (width - 1, ac) end val pieces = naturalFold (height, [], doRow) in String.concat pieces end end end val zero = IntInf.fromInt 0 fun smaller (a: IntInf.int, b: IntInf.int): bool = (not (a = zero)) andalso (b = zero orelse IntInf.< (IntInf.abs a , IntInf.abs b)) fun smithNormalForm (mat: IntInf.int Matrix.matrix): IntInf.int Matrix.matrix = let val height = Matrix.height mat val width = Matrix.width mat val mat = Matrix.copy mat val range = Int.min (width, height) fun dd pos = let val matCol = Matrix.fetchCol (mat, pos) val matRow = Matrix.fetchRow (mat, pos) val _ = print ("dd: pos = " ^ (Int.toString pos) ^ "\n") fun swapRowLoop (best, bestRow, bestCol, row) = if row >= height then (Matrix.rowSwap (mat, pos, bestRow); Matrix.colSwap (mat, pos, bestCol)) else let val matRow = Matrix.fetchRow (mat, row) fun swapColLoop (best, bestRow, bestCol, col) = if col >= width then swapRowLoop (best, bestRow, bestCol, row + 1) else let val next = matRow col in if smaller (next, best) then swapColLoop (next, row, col, col + 1) else swapColLoop (best, bestRow, bestCol, col + 1) end in swapColLoop (best, bestRow, bestCol, pos) end fun rowLoop row = if row < height then if (matCol row) = zero then rowLoop (row + 1) else (Matrix.rowOp (mat, pos, row, let val x = IntInf.~ (IntInf.quot(matCol row, matCol pos)) in fn (lhs, rhs) => IntInf.+ (IntInf.* (lhs, x), rhs) end); if (matCol row) = zero then rowLoop (row + 1) else hitPosAgain ()) else let fun colLoop col = if col < width then if (matRow col) = zero then colLoop (col + 1) else (Matrix.colOp (mat, pos, col, let val x = IntInf.~ (IntInf.quot (matRow col, matRow pos)) in fn (lhs, rhs) => IntInf.+ (IntInf.* (lhs, x), rhs) end); if (matRow col) = zero then colLoop (col + 1) else hitPosAgain ()) else () in colLoop (pos + 1) end and hitPosAgain () = (swapRowLoop (zero, pos, pos, pos); rowLoop (pos + 1)) in hitPosAgain () end fun loop pos = if pos = range then mat else (dd pos; loop (pos + 1)) in loop 0 end val table = [[ 8, ~3, 1, 3, 6, 9, ~2, 4, ~9, ~9, 2, 3, 8, ~1, 3, ~5, 4, ~3, ~5, ~6, 8, 1, 4, ~5, 7, ~4, ~4, ~7, 7, 1, 4, ~3, 8, 4, ~4, ~8, 5, ~9, 3, ~4, 1, 9, ~8, ~6, ~2, 8, ~9, ~5, ~3, ~3], [ 0, 8, ~6, ~2, ~3, 4, 5, ~2, 7, ~7, ~6, ~7, ~3, ~4, 9, 7, ~3, 3, 0, 3, 3, ~8, ~8, 2, 3, 8, 3, ~2, ~4, 3, ~6, ~6, ~2, 6, 5, ~1, ~3, 1, 8, ~8, 2, 1, ~7, ~7, ~7, ~3, ~6, 6, ~4, ~9], [ 0, ~5, 8, ~9, 2, 4, 2, 7, ~4, 9, ~3, 6, ~2, 3, ~3, 0, ~9, 5, 8, ~1, 2, ~8, 3, 4, ~6, 5, ~6, ~5, ~8, 0, ~5, 3, ~2, ~5, 8, 7, ~1, 1, ~1, 7, 6, 3, 6, 5, 6, 8, 7, 9, 7, ~3], [ 5, 4, 7, 2, 3, ~9, 7, ~7, 3, ~8, 7, 5, 5, ~2, ~6, ~3, 6, 5, 3, ~1, ~1, 4, 5, ~5, 5, 9, 9, 3, 8, ~3, ~1, 9, ~9, 6, ~7, 7, 4, 6, ~8, ~9, 0, ~3, ~2, ~7, 1, ~2, ~6, 7, 7, 7], [ 2, 9, 9, 3, ~4, 0, 9, 2, 5, 3, ~5, ~3, ~1, 1, 8, ~6, 2, ~4, ~8, ~7, ~8, 4, 5, 8, ~1, ~1, 7, 2, 5, 5, ~4, ~7, ~3, ~7, 6, ~4, ~5, ~8, ~5, ~9, ~8, 5, ~5, ~5, 0, 8, 8, 6, 4, ~1], [ 5, 5, 1, ~7, 3, ~5, 4, 9, 3, 4, 4, ~5, 7, ~1, 7, 4, ~7, 7, ~7, ~2, 9, ~9, 0, ~4, ~4, 0, 2, 6, 3, ~1, 6, 6, 8, ~6, ~4, ~9, 3, ~2, ~5, 5, ~3, 2, ~1, ~6, 9, 3, ~3, ~8, ~9, 7], [ 7, 1, 2, 7, 6, 5, ~6, ~3, ~4, ~8, 0, 9, 6, 1, 2, ~5, 4, 4, 4, ~6, ~7, ~9, ~6, 2, ~4, 5, ~2, 1, 0, 1, ~8, 7, ~7, ~5, 4, 1, ~5, 4, ~4, ~2, ~3, 1, 1, 3, 4, ~4, ~5, 9, 8, ~2], [ 6, 2, ~1, ~8, 4, ~7, 7, ~3, ~2, ~5, 3, 0, 3, ~9, 3, 3, 9, ~1, 4, 8, ~9, 6, ~5, 9, 5, ~1, ~1, ~9, 7, ~2, 3, 9, 8, 9, 2, 7, 7, 6, ~1, ~1, ~2, ~2, ~7, 3, ~6, 0, ~9, 4, 3, 7], [ 0, ~6, ~3, ~7, ~1, 5, ~2, 8, ~5, ~3, ~8, 7, ~2, ~2, 0, ~8, 4, 8, 9, ~5, ~4, ~8, ~1, 7, 1, 1, 6, ~9, ~4, 0, 8, 4, 3, ~7, 6, 0, 1, 8, 6, ~1, ~1, ~7, 9, ~9, ~5, ~2, ~2, ~1, 1, 0], [~4, 9, 6, ~3, ~2, ~6, ~3, 4, 8, ~8, 1, ~5, 9, 7, 9, 7, ~9, ~6, 6, 1, ~3, 3, ~3, ~7, 1, 7, ~7, 0, ~2, 7, ~4, ~6, 0, 1, ~3, ~5, ~9, ~7, 8, 4, 9, ~8, ~8, ~7, ~6, 7, 6, ~3, ~8, 5], [ 6, 7, ~5, ~9, 6, 1, 8, 4, ~2, 7, ~7, ~1, ~9, 1, ~6, ~5, 4, 9, 6, 0, ~8, ~3, 1, ~3, 8, ~3, 2, 9, ~3, ~9, ~1, ~3, 4, 3, 2, ~9, ~5, ~3, 8, ~4, 8, 5, ~4, 7, 6, ~8, 7, 6, ~5, 5], [ 1, 7, ~8, ~9, ~7, ~3, 8, 9, ~7, ~1, ~7, 4, 0, 0, 1, ~5, 9, ~8, ~1, ~2, 3, 5, 9, ~9, 5, 4, ~9, 1, ~4, ~2, 3, ~4, 8, ~6, ~4, ~8, ~5, ~5, 4, ~2, ~4, ~1, ~9, ~5, 2, ~9, 2, ~9, ~2, ~3], [~5, ~4, ~4, 9, 2, 7, ~2, 6, 7, 2, ~9, 4, 2, 7, 8, ~9, 2, 5, 3, 9, 6, 3, 0, ~7, ~6, ~7, 6, ~2, 9, ~3, ~6, 9, ~9, 2, 2, ~6, ~1, 4, ~3, 3, 0, 6, ~3, 4, 9, 9, ~6, 5, 5, ~5], [ 5, ~7, 8, ~4, 8, 8, ~4, ~9, 6, 0, ~3, 6, 0, 8, 8, ~6, ~2, 5, 4, ~1, ~8, 1, ~3, ~1, 2, 3, ~9, ~9, ~5, 1, 8, ~5, ~3, 0, ~4, ~9, 0, ~6, 3, ~1, ~7, 0, 8, 9, ~6, ~1, ~9, 1, ~6, 2], [ 7, ~5, ~1, 5, ~2, 7, 0, ~7, ~1, 8, 8, ~3, 9, ~5, 7, ~8, ~8, ~4, 3, 2, ~1, 8, ~2, 1, 2, 5, 0, ~6, 7, 3, 3, 7, ~5, 5, ~1, 1, 0, ~8, 1, 0, 0, ~4, 6, 9, ~5, ~6, 3, ~5, 8, 5], [~4, ~2, 3, ~3, ~1, 2, ~2, ~1, ~9, ~5, 1, 0, 0, 2, 9, ~3, ~9, 2, 9, 3, 8, ~3, 4, 8, 8, 3, ~3, ~1, ~4, 4, ~6, ~9, 5, ~2, 1, 3, ~7, ~5, ~6, ~5, ~8, 4, ~8, ~3, 5, 0, 7, ~9, 6, 2], [ 5, 1, 4, ~3, ~1, ~9, 5, ~8, ~8, 6, 1, 1, ~2, 7, 5, 6, ~4, 2, ~7, 0, ~7, ~3, ~5, 9, 3, 4, ~6, 8, ~4, 3, 6, 0, 2, 3, ~6, 3, 9, 4, 1, ~4, 6, ~5, ~7, 0, ~1, ~8, ~3, ~9, 9, 7], [ 2, ~6, ~1, 8, 4, ~3, ~1, ~6, ~2, ~8, ~2, ~1, ~1, ~5, ~9, ~8, 9, ~9, 5, 1, 9, ~1, ~6, 9, ~7, 2, 8, ~7, 4, ~9, 7, 6, ~2, 1, ~2, ~7, 8, 0, 5, 0, ~5, ~7, ~6, 0, 4, 0, 3, ~8, 5, 4], [~2, 9, ~9, ~6, 1, ~8, 8, 4, ~6, 8, 1, ~3, ~7, 8, ~5, 2, ~8, 1, 3, ~2, 6, 6, 6, 1, 0, 0, ~7, 7, ~3, ~3, 0, ~4, 3, ~7, ~6, 7, 5, 9, ~5, 7, ~8, 2, 3, ~8, ~7, 6, ~5, ~5, ~8, ~9], [~7, ~4, 4, 1, ~1, ~3, ~8, 3, 7, 9, 8, 3, 0, 4, 4, ~1, ~5, 4, 2, 2, 0, 6, ~6, 2, ~9, 8, ~9, 3, ~2, 2, 6, 6, 1, 7, 1, 0, ~8, 2, 3, ~3, 8, 9, 5, 5, ~6, 4, ~7, ~4, ~2, ~3], [~5, 8, 6, 1, ~6, ~6, 6, 1, 1, ~3, ~9, ~6, 2, ~7, 2, ~1, 6, ~6, 0, 2, ~7, 8, ~8, 4, 9, ~3, 9, ~7, ~9, ~6, ~4, ~4, ~5, 8, 2, ~5, ~4, ~3, 5, 2, 1, ~3, ~3, ~7, ~9, 3, 7, ~7, 3, ~8], [~4, ~7, ~2, 2, ~4, ~2, 6, ~3, ~1, ~4, 0, ~5, 9, 7, ~6, ~9, 7, ~9, ~6, 2, ~3, 1, 5, ~9, 4, ~5, 4, ~9, 1, ~2, ~2, 4, 0, 4, ~8, ~8, 3, ~1, ~5, ~4, ~9, ~7, 7, 6, 3, ~9, 6, 4, ~4, ~7], [~9, 6, 6, ~5, ~1, ~7, 4, ~9, 4, ~1, 6, ~4, 7, 2, 8, 7, 3, 1, ~7, 7, 7, 9, 8, ~9, 7, 2, 1, 2, ~8, 4, 5, 6, 7, 2, ~7, 6, 8, 4, ~9, 7, ~5, 6, 9, ~1, 9, 2, 0, 9, 3, 6], [ 4, ~3, 8, 0, ~2, ~2, 2, ~3, 8, 3, 1, ~8, ~5, ~2, 5, 6, 8, 0, ~3, 4, ~2, 4, ~9, ~5, 7, 6, ~4, ~7, 2, 4, ~3, ~8, ~9, 9, 8, ~9, 3, ~7, 4, ~7, ~5, 4, 9, 3, ~6, ~3, ~7, 4, 2, ~2], [~8, ~8, 6, ~2, ~6, 8, ~3, 3, ~1, ~7, 1, 9, 1, 7, ~6, 8, ~2, ~9, ~1, 3, ~4, 7, 8, ~1, 9, ~9, 6, ~3, 5, 0, 2, 5, ~1, ~6, ~6, 1, 8, 6, ~3, ~9, ~1, 9, ~2, 9, ~8, ~7, ~3, 6, ~3, ~3], [ 5, ~2, 3, 0, ~9, ~8, ~6, 1, 8, 0, 1, 2, ~8, ~2, 0, ~9, ~8, 0, 5, ~3, ~4, 5, 6, ~2, ~5, 0, ~9, 9, ~9, ~5, 9, 9, ~5, ~2, 4, 3, 8, ~8, ~7, 5, ~3, ~2, 2, 3, 9, 7, ~1, 0, 4, ~1], [~4, 5, ~5, 7, 8, 9, 7, ~3, 1, 9, ~7, ~1, 8, ~5, ~1, 2, ~8, 1, 0, 9, ~8, ~1, 6, ~1, 9, ~8, 7, 4, ~8, 7, 0, ~6, 2, 3, 7, 4, ~3, ~5, 9, ~3, 0, 6, ~9, 2, 4, ~8, 6, ~7, 9, 1], [ 7, 0, ~9, 6, 8, 2, 2, 5, ~6, ~6, 9, ~5, 9, 2, 2, ~8, 0, ~6, ~9, ~6, ~4, ~9, 8, ~2, 9, 7, ~5, ~1, 7, 2, ~7, 7, ~1, ~3, 6, 6, 1, ~4, 0, ~1, ~6, ~5, 6, ~7, ~3, ~2, 8, 2, ~9, 8], [ 8, ~7, ~9, ~6, 9, ~7, ~7, 6, ~8, 9, 5, ~4, 1, ~7, ~8, ~6, ~3, 8, ~8, 1, ~8, 6, 9, ~3, ~7, 7, 1, 6, 1, 0, 8, ~5, ~8, 8, ~9, 0, 4, 4, 3, ~4, 6, ~3, ~9, 0, 4, ~4, ~5, ~9, ~5, ~8], [~3, ~2, 8, 1, ~1, ~1, ~4, 3, 7, ~2, ~9, 9, ~8, ~9, 6, ~4, 7, ~1, ~5, ~3, ~9, 0, ~3, 0, 7, 9, 1, ~2, 7, ~9, ~6, 3, 3, ~4, ~7, ~3, ~4, ~8, ~2, ~3, ~9, ~2, ~6, 3, ~6, ~4, 7, ~5, ~8, ~1], [~9, ~9, ~2, ~9, ~9, 9, 6, 6, 7, 5, ~1, ~2, 1, 5, 2, ~3, ~4, 1, ~6, 0, ~3, ~9, ~1, 7, 0, ~9, 5, ~2, ~2, 5, 3, 4, ~1, 6, ~6, 3, ~6, 7, ~1, 5, ~8, ~4, ~2, ~2, ~6, ~5, ~6, 3, ~1, 4], [ 7, 7, 8, 7, 6, 1, ~2, 5, ~6, 9, 4, 8, 5, 0, ~4, ~2, ~2, ~5, ~2, ~6, 9, ~8, ~2, ~5, ~9, 3, ~6, ~3, ~4, ~5, ~2, 6, 1, 6, ~5, 0, ~3, ~2, 4, ~6, 1, 6, ~1, 3, ~9, 2, ~3, 1, 5, ~6], [ 6, 4, ~7, 3, ~7, 9, 1, ~7, ~8, 0, ~6, 8, 4, 1, 9, 6, 8, 3, 0, 9, 0, 4, 9, ~7, ~7, 1, 5, 1, ~5, 6, 9, 2, 4, 1, ~9, 8, 4, 5, 8, 3, 2, ~9, ~6, ~9, 9, ~9, 7, ~6, ~4, 3], [~3, ~9, ~4, 2, 3, 9, ~9, 8, ~9, 9, ~4, ~9, ~5, 5, 0, 7, 3, ~5, ~8, 2, ~3, 0, ~9, ~3, 1, 9, 4, 5, ~1, 8, 0, ~4, ~2, 9, ~4, ~1, 3, 5, 9, ~1, 1, 4, ~8, ~2, ~3, 5, 1, 5, ~6, 7], [ 9, ~3, 2, ~9, 3, 4, 0, 7, ~5, 9, 0, ~6, 7, ~2, 3, ~7, 2, ~5, ~2, 6, 3, ~9, ~5, ~9, 5, 2, ~5, ~3, 8, ~5, 6, 2, 9, ~7, ~7, ~7, ~6, 9, ~3, 6, 0, 6, ~6, ~9, 4, ~3, ~9, 0, ~4, ~9], [~4, ~8, 8, ~7, 7, 0, ~6, ~6, 8, ~9, ~4, 5, ~3, ~1, 7, ~5, ~6, ~1, 8, 6, ~2, 1, ~1, 5, ~9, 1, ~1, ~7, ~6, ~6, ~6, ~4, 6, 3, ~5, ~5, ~6, 2, 3, ~6, ~8, ~3, 8, ~2, ~5, ~4, ~3, 1, 4, ~4], [ 4, ~6, 2, 6, 2, ~8, 8, 5, 8, ~2, 0, ~6, ~1, ~6, ~2, 2, 6, ~9, ~7, ~6, ~4, ~4, ~7, ~2, 8, 6, 3, ~7, ~6, 8, 2, 3, 4, 5, 3, 4, ~6, 8, 8, ~1, 4, ~5, 6, 2, 8, ~3, ~9, ~2, 6, 7], [ 3, ~4, 0, ~3, ~5, 0, ~2, ~6, ~2, 8, 5, ~9, ~4, ~8, ~6, 0, 8, 9, 1, ~2, 8, 2, ~2, 8, 9, 3, 3, 5, ~9, ~3, ~2, 7, 2, 9, 0, 4, 8, ~9, 0, ~6, 9, ~9, 9, ~4, 8, ~8, ~8, 2, ~3, 2], [~1, 3, ~9, ~8, ~7, 6, ~6, 3, 0, 5, ~5, 1, 2, ~2, ~3, 7, 7, 3, ~4, ~2, ~9, ~5, ~1, 9, 6, 8, 2, 8, 7, ~3, 4, 6, 6, 0, ~2, 2, ~7, ~7, 6, ~3, 8, 2, 1, 0, 8, ~1, 3, 9, 8, 6], [ 1, ~2, ~3, 6, 5, 5, ~6, ~4, ~5, 1, 1, 6, ~7, ~4, ~3, 4, 4, ~8, ~9, 7, ~2, ~3, ~7, ~2, 1, 2, 0, 8, ~6, ~5, ~5, 7, 8, 5, ~2, 3, 9, 0, 5, 1, 3, ~4, ~6, 1, 4, ~9, ~2, 5, 4, 3], [ 3, 3, 9, ~2, 6, 9, 4, 9, 4, ~8, 5, ~1, 3, ~2, 1, ~7, ~3, 2, 2, 0, ~3, 3, 8, 2, 0, ~5, 7, 1, 4, ~8, 8, ~9, ~1, 1, ~9, ~4, 5, 2, 2, 8, 6, 1, 6, ~2, 2, 7, 1, ~6, ~1, ~1], [ 4, ~2, 4, ~1, ~5, ~1, 5, ~2, 3, ~4, ~5, 0, 2, ~4, 6, 4, ~3, 2, 2, 5, ~6, ~7, ~9, ~1, ~9, ~9, 6, 0, 6, 5, 9, ~1, 3, ~3, ~8, 8, ~8, 8, 4, 5, ~1, ~5, 1, 0, 3, ~2, 5, 6, 6, 5], [~4, 9, 6, 8, ~9, 5, 5, ~3, ~7, 7, 6, 8, ~8, 0, 4, ~1, 9, 5, ~7, 0, ~1, ~2, 3, 6, 0, 4, ~3, 1, 4, 6, 4, 0, 5, ~1, 7, ~7, ~6, ~8, ~3, ~6, 7, ~1, ~3, ~2, ~3, ~5, 3, 1, ~8, ~9], [~6, 4, ~5, 9, 9, ~7, ~1, ~8, ~4, 2, ~6, 0, ~6, ~6, 7, 6, 0, 1, 7, ~7, 0, ~4, ~6, ~8, ~9, 5, ~6, ~9, 2, ~7, ~2, ~6, 9, 4, ~5, 0, 4, ~4, ~5, 6, 9, 1, ~6, ~5, 3, ~1, 7, ~7, ~6, 7], [~8, 7, 7, ~6, 7, ~4, 8, 0, ~9, ~8, ~3, 7, ~3, 3, 8, ~7, ~2, ~7, 5, 5, ~5, 4, 6, 2, 4, 1, 4, ~9, ~3, 8, 8, ~9, ~4, ~2, 1, ~3, 1, 3, 9, ~5, ~8, ~2, 7, 8, 9, 2, 0, 1, ~9, 6], [~7, 1, ~9, 5, ~5, ~5, 7, 6, ~5, ~9, ~6, ~8, ~6, 9, 7, 9, 0, ~5, 7, 7, ~6, 4, 5, ~9, ~1, ~2, ~7, 3, ~5, ~2, ~5, 5, ~3, ~4, ~2, ~8, 2, ~8, 0, ~8, 0, ~8, 9, 8, ~5, ~5, 1, 3, 5, ~4], [~8, ~8, 0, ~5, ~8, ~6, 3, ~6, ~4, 6, 1, ~5, ~6, ~8, ~4, ~6, ~2, ~6, 6, ~4, 8, 8, 4, ~5, ~1, 0, 9, ~8, ~3, ~1, ~8, 7, ~3, 0, ~7, 1, ~7, ~1, ~7, 3, ~7, 3, ~4, ~8, 8, ~7, ~9, ~8, 3, 2], [ 3, 6, 8, ~9, 7, 1, ~9, 9, 3, 8, 6, 4, ~2, 1, ~8, 4, ~7, ~4, ~3, 3, ~5, ~6, ~7, ~2, 0, ~4, 5, 2, 5, 6, 3, ~8, 2, ~5, ~7, 6, 8, ~2, ~5, ~4, 9, 9, 2, ~2, ~2, 7, 4, 4, ~2, 3], [ 6, 6, ~5, ~2, ~8, ~2, ~9, 0, 2, 4, ~6, ~9, 9, 0, ~8, ~3, ~1, ~2, ~1, 6, 8, 2, ~9, 5, ~2, 1, 7, ~6, 5, 1, ~1, 4, ~4, ~7, ~6, ~3, ~8, 2, 2, 5, 5, ~6, 5, 3, 3, 7, 4, 7, ~3, ~9], [~9, 6, ~4, 1, 3, ~8, ~8, ~8, ~1, 5, 1, 1, ~1, 6, 5, 1, ~1, 5, ~8, 8, ~7, ~5, ~1, ~1, 6, ~8, ~3, ~1, ~2, ~6, ~5, ~5, ~6, 0, 2, 2, 7, ~1, ~5, ~7, ~1, ~3, 7, 6, 0, 2, 4, ~5, 0, ~4]] fun f (x, y) = List.nth (List.nth (table, x), y) fun show m = print (Matrix.toString (m, IntInf.toString)) structure Main = struct fun snf() = let val dim = 35 val big = Matrix.map (Matrix.make (dim, dim, f), IntInf.fromInt) val entry = Matrix.fetch(smithNormalForm big, dim - 1, dim - 1) (* val _ = print (concat [IntInf.toString entry, "\n"]) *) in if entry = valOf (IntInf.fromString "~1027954043102083189860753402541358641712697245") then () else raise Fail "bug" end fun doit n = let val rec loop = fn 0 => () | n => (snf(); loop(n - 1)) in loop n end end mlton-20100608/benchmark/tests/tailfib.sml0000644000076600000240000000065511404435630017010 0ustar mtfstaff fun fib'(0,a,b) = a | fib'(n,a,b) = fib'(n-1,a+b,a) fun fib n = fib'(n,0,1) structure Main = struct fun doit() = if 701408733 <> fib 44 then raise Fail "bug" else () val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop (n * 1000000) end end mlton-20100608/benchmark/tests/tak.sml0000644000076600000240000000040711404435630016150 0ustar mtfstafffun tak (x,y,z) = if not (y < x) then z else tak (tak (x - 1, y, z), tak (y - 1, z, x), tak (z - 1, x, y)) val rec f = fn 0 => () | n => (tak (33,22,11); f (n-1)) structure Main = struct val doit = f end mlton-20100608/benchmark/tests/tensor.sml0000644000076600000240000031534111404435630016711 0ustar mtfstaff(* Obtained at http://www.arrakis.es/~worm/ *) signature MONO_VECTOR = sig type vector type elem val maxLen : int val fromList : elem list -> vector val tabulate : (int * (int -> elem)) -> vector val length : vector -> int val sub : (vector * int) -> elem val extract : (vector * int * int option) -> vector val concat : vector list -> vector val mapi : ((int * elem) -> elem) -> (vector * int * int option) -> vector val map : (elem -> elem) -> vector -> vector val appi : ((int * elem) -> unit) -> (vector * int * int option) -> unit val app : (elem -> unit) -> vector -> unit val foldli : ((int * elem * 'a) -> 'a) -> 'a -> (vector * int * int option) -> 'a val foldri : ((int * elem * 'a) -> 'a) -> 'a -> (vector * int * int option) -> 'a val foldl : ((elem * 'a) -> 'a) -> 'a -> vector -> 'a val foldr : ((elem * 'a) -> 'a) -> 'a -> vector -> 'a end (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) (* COPYRIGHT Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by Juan Jose Garcia Ripoll. 4. The name of Juan Jose Garcia Ripoll may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY JUAN JOSE GARCIA RIPOLL ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL HE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *) structure EvalTimer = struct local val TIME = ref (Time.now()) in fun timerOn () = (TIME := Time.now(); ()) fun timerRead () = Time.toMilliseconds(Time.-(Time.now(),!TIME)) fun timerOff () = let val delta = timerRead() in print "Elapsed: "; print (LargeInt.toString delta); print " ms\n" end fun time f = (timerOn(); f(); timerOff()) end end structure Loop = struct fun all (a, b, f) = if a > b then true else if f a then all (a+1, b, f) else false fun any (a, b, f) = if a > b then false else if f a then true else any (a+1, b, f) fun app (a, b, f) = if a < b then (f a; app (a+1, b, f)) else () fun app' (a, b, d, f) = if a < b then (f a; app' (a+d, b, d, f)) else () fun appi' (a, b, d, f) = if a < b then (f a; appi' (a+d, b, d, f)) else () end (* INDEX -Signature- Indices are a enumerable finite set of data with an order and a map to a continous nonnegative interval of integers. In the sample implementation, Index, each index is a list of integers, [i1,...,in] and each set of indices is defined by a shape, which has the same shape of an index but with each integer incremented by one shape = [k1,...,kn] 0 <= i1 < k1 type storage = RowMajor | ColumnMajor order : storage Identifies: 1) the underlying algorithms for this structure 2) the most significant index 3) the index that varies more slowly 4) the total order RowMajor means that first index is most significant and varies more slowly, while ColumnMajor means that last index is the most significant and varies more slowly. For instance RowMajor => [0,0]<[0,1]<[1,0]<[1,1] (C, C++, Pascal) ColumnMajor => [0,0]>[1,0]>[0,1]>[1,1] (Fortran) last shape first shape Returns the last/first index that belongs to the sed defined by 'shape'. inBounds shape index Checkes whether 'index' belongs to the set defined by 'shape'. toInt shape index As we said, indices can be sorted and mapped to a finite set of integers. 'toInt' obtaines the integer number that corresponds to a certain index. indexer shape It is equivalent to the partial evaluation 'toInt shape' but optimized for 'shape'. next shape index prev shape index next' shape index prev' shape index Obtain the following or previous index to the one we supply. next and prev return an object of type 'index option' so that if there is no such following/previous, the output is NONE. On the other hand, next'/prev' raise an exception when the output is not well defined and their output is always of type index. next/prev/next'/prev' raise an exception if 'index' does not belong to the set of 'shape'. all shape f any shape f app shape f Iterates 'f' over every index of the set defined by 'shape'. 'all' stops when 'f' first returns false, 'any' stops when 'f' first returns true and 'app' does not stop and discards the output of 'f'. compare(a,b) Returns LESS/GREATER/EQUAL according to the total order which is defined in the set of all indices. <,>,eq,<=,>=,<> Reduced comparisons which are defined in terms of 'compare'. validShape t validIndex t Checks whether 't' conforms a valid shape or index. iteri shape f *) signature INDEX = sig type t type indexer = t -> int datatype storage = RowMajor | ColumnMajor exception Index exception Shape val order : storage val toInt : t -> t -> int val length : t -> int val first : t -> t val last : t -> t val next : t -> t -> t option val prev : t -> t -> t option val next' : t -> t -> t val prev' : t -> t -> t val indexer : t -> (t -> int) val inBounds : t -> t -> bool val compare : t * t -> order val < : t * t -> bool val > : t * t -> bool val eq : t * t -> bool val <= : t * t -> bool val >= : t * t -> bool val <> : t * t -> bool val - : t * t -> t val validShape : t -> bool val validIndex : t -> bool val all : t -> (t -> bool) -> bool val any : t -> (t -> bool) -> bool val app : t -> (t -> unit) -> unit end structure Index : INDEX = struct type t = int list type indexer = t -> int datatype storage = RowMajor | ColumnMajor exception Index exception Shape val order = ColumnMajor fun validShape shape = List.all (fn x => x > 0) shape fun validIndex index = List.all (fn x => x >= 0) index fun toInt shape index = let fun loop ([], [], accum, _) = accum | loop ([], _, _, _) = raise Index | loop (_, [], _, _) = raise Index | loop (i::ri, l::rl, accum, fac) = if (i >= 0) andalso (i < l) then loop (ri, rl, i*fac + accum, fac*l) else raise Index in loop (index, shape, 0, 1) end (* ----- CACHED LINEAR INDEXER ----- An indexer is a function that takes a list of indices, validates it and produces a nonnegative integer number. In short, the indexer is the mapper from indices to element positions in arrays. 'indexer' builds such a mapper by optimizing the most common cases, which are 1d and 2d tensors. *) local fun doindexer [] _ = raise Shape | doindexer [a] [dx] = let fun f [x] = if (x > 0) andalso (x < a) then x else raise Index | f _ = raise Index in f end | doindexer [a,b] [dx, dy] = let fun f [x,y] = if ((x > 0) andalso (x < a) andalso (y > 0) andalso (y < b)) then x + dy * y else raise Index | f _ = raise Index in f end | doindexer [a,b,c] [dx,dy,dz] = let fun f [x,y,z] = if ((x > 0) andalso (x < a) andalso (y > 0) andalso (y < b) andalso (z > 0) andalso (z < c)) then x + dy * y + dz * z else raise Index | f _ = raise Index in f end | doindexer shape memo = let fun f [] [] accum [] = accum | f _ _ _ [] = raise Index | f (fac::rf) (ndx::ri) accum (dim::rd) = if (ndx >= 0) andalso (ndx < dim) then f rf ri (accum + ndx * fac) rd else raise Index in f shape memo 0 end in fun indexer shape = let fun memoize accum [] = [] | memoize accum (dim::rd) = accum :: (memoize (dim * accum) rd) in if validShape shape then doindexer shape (memoize 1 shape) else raise Shape end end fun length shape = let fun prod (a,b) = if b < 0 then raise Shape else a * b in foldl prod 1 shape end fun first shape = map (fn x => 0) shape fun last [] = [] | last (size :: rest) = if size < 1 then raise Shape else size - 1 :: last rest fun next' [] [] = raise Subscript | next' _ [] = raise Index | next' [] _ = raise Index | next' (dimension::restd) (index::resti) = if (index + 1) < dimension then (index + 1) :: resti else 0 :: (next' restd resti) fun prev' [] [] = raise Subscript | prev' _ [] = raise Index | prev' [] _ = raise Index | prev' (dimension::restd) (index::resti) = if (index > 0) then index - 1 :: resti else dimension - 1 :: prev' restd resti fun next shape index = (SOME (next' shape index)) handle Subscript => NONE fun prev shape index = (SOME (prev' shape index)) handle Subscript => NONE fun inBounds shape index = ListPair.all (fn (x,y) => (x >= 0) andalso (x < y)) (index, shape) fun compare ([],[]) = EQUAL | compare (_, []) = raise Index | compare ([],_) = raise Index | compare (a::ra, b::rb) = case Int.compare (a,b) of EQUAL => compare (ra,rb) | LESS => LESS | GREATER => GREATER local fun iterator a inner = let fun loop accum f = let fun innerloop i = if i < a then if inner (i::accum) f then innerloop (i+1) else false else true in innerloop 0 end in loop end fun build_iterator [a] = let fun loop accum f = let fun innerloop i = if i < a then if f (i::accum) then innerloop (i+1) else false else true in innerloop 0 end in loop end | build_iterator (a::rest) = iterator a (build_iterator rest) in fun all shape = build_iterator shape [] end local fun iterator a inner = let fun loop accum f = let fun innerloop i = if i < a then if inner (i::accum) f then true else innerloop (i+1) else false in innerloop 0 end in loop end fun build_iterator [a] = let fun loop accum f = let fun innerloop i = if i < a then if f (i::accum) then true else innerloop (i+1) else false in innerloop 0 end in loop end | build_iterator (a::rest) = iterator a (build_iterator rest) in fun any shape = build_iterator shape [] end local fun iterator a inner = let fun loop accum f = let fun innerloop i = if i < a then (inner (i::accum) f; innerloop (i+1)) else () in innerloop 0 end in loop end fun build_iterator [a] = let fun loop accum f = let fun innerloop i = if i < a then (f (i::accum); innerloop (i+1)) else () in innerloop 0 end in loop end | build_iterator (a::rest) = iterator a (build_iterator rest) in fun app shape = build_iterator shape [] end fun a < b = compare(a,b) = LESS fun a > b = compare(a,b) = GREATER fun eq (a, b) = compare(a,b) = EQUAL fun a <> b = not (a = b) fun a <= b = not (a > b) fun a >= b = not (a < b) fun a - b = ListPair.map Int.- (a,b) end (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) (* TENSOR - Signature - Polymorphic tensors of any type. With 'tensor' we denote a (mutable) array of any rank, with as many indices as one wishes, and that may be traversed (map, fold, etc) according to any of those indices. type 'a tensor Polymorphic tensor whose elements are all of type 'a. val storage = RowMajor | ColumnMajor RowMajor = data is stored in consecutive cells, first index varying fastest (FORTRAN convention) ColumnMajor = data is stored in consecutive cells, last index varying fastest (C,C++,Pascal,CommonLisp convention) new ([i1,...,in],init) Build a new tensor with n indices, each of sizes i1...in, filled with 'init'. fromArray (shape,data) fromList (shape,data) Use 'data' to fill a tensor of that shape. An exception is raised if 'data' is too large or too small to properly fill the vector. Later use of a 'data' array is disregarded -- one must think that the tensor now owns the array. length tensor rank tensor shape tensor Return the number of elements, the number of indices and the shape (size of each index) of the tensor. toArray tensor Return the data of the tensor in the form of an array. Mutation of this array may lead to unexpected behavior. sub (tensor,[i1,...,in]) update (tensor,[i1,...,in],new_value) Access the element that is indexed by the numbers [i1,..,in] app f a appi f a The same as 'map' and 'mapi' but the function 'f' outputs nothing and no new array is produced, i.e. one only seeks the side effect that 'f' may produce. map2 operation a b Apply function 'f' to pairs of elements of 'a' and 'b' and build a new tensor with the output. Both operands must have the same shape or an exception is raised. The procedure is sequential, as specified by 'storage'. foldl operation a n Fold-left the elements of tensor 'a' along the n-th index. all test a any test a Folded boolean tests on the elements of the tensor. *) signature TENSOR = sig structure Array : ARRAY structure Index : INDEX type index = Index.t type 'a tensor val new : index * 'a -> 'a tensor val tabulate : index * (index -> 'a) -> 'a tensor val length : 'a tensor -> int val rank : 'a tensor -> int val shape : 'a tensor -> (index) val reshape : index -> 'a tensor -> 'a tensor val fromList : index * 'a list -> 'a tensor val fromArray : index * 'a array -> 'a tensor val toArray : 'a tensor -> 'a array val sub : 'a tensor * index -> 'a val update : 'a tensor * index * 'a -> unit val map : ('a -> 'b) -> 'a tensor -> 'b tensor val map2 : ('a * 'b -> 'c) -> 'a tensor -> 'b tensor -> 'c tensor val app : ('a -> unit) -> 'a tensor -> unit val appi : (int * 'a -> unit) -> 'a tensor -> unit val foldl : ('c * 'a -> 'c) -> 'c -> 'a tensor -> int -> 'c tensor val all : ('a -> bool) -> 'a tensor -> bool val any : ('a -> bool) -> 'a tensor -> bool end (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure Tensor : TENSOR = struct structure Array = Array structure Index = Index type index = Index.t type 'a tensor = {shape : index, indexer : Index.indexer, data : 'a array} exception Shape exception Match exception Index local (*----- LOCALS -----*) fun make' (shape, data) = {shape = shape, indexer = Index.indexer shape, data = data} fun toInt {shape, indexer, data} index = indexer index fun array_map f a = let fun apply index = f(Array.sub(a,index)) in Array.tabulate(Array.length a, apply) end fun splitList (l as (a::rest), place) = let fun loop (left,here,right) 0 = (List.rev left,here,right) | loop (_,_,[]) place = raise Index | loop (left,here,a::right) place = loop (here::left,a,right) (place-1) in if place <= 0 then loop ([],a,rest) (List.length rest - place) else loop ([],a,rest) (place - 1) end in (*----- STRUCTURAL OPERATIONS & QUERIES ------*) fun new (shape, init) = if not (Index.validShape shape) then raise Shape else let val length = Index.length shape in {shape = shape, indexer = Index.indexer shape, data = Array.array(length,init)} end fun toArray {shape, indexer, data} = data fun length {shape, indexer, data} = Array.length data fun shape {shape, indexer, data} = shape fun rank t = List.length (shape t) fun reshape new_shape tensor = if Index.validShape new_shape then case (Index.length new_shape) = length tensor of true => make'(new_shape, toArray tensor) | false => raise Match else raise Shape fun fromArray (s, a) = case Index.validShape s andalso ((Index.length s) = (Array.length a)) of true => make'(s, a) | false => raise Shape fun fromList (s, a) = fromArray (s, Array.fromList a) fun tabulate (shape,f) = if Index.validShape shape then let val last = Index.last shape val length = Index.length shape val c = Array.array(length, f last) fun dotable (c, indices, i) = (Array.update(c, i, f indices); case i of 0 => c | i => dotable(c, Index.prev' shape indices, i-1)) in make'(shape,dotable(c, Index.prev' shape last, length-1)) end else raise Shape (*----- ELEMENTWISE OPERATIONS -----*) fun sub (t, index) = Array.sub(#data t, toInt t index) fun update (t, index, value) = Array.update(toArray t, toInt t index, value) fun map f {shape, indexer, data} = {shape = shape, indexer = indexer, data = array_map f data} fun map2 f t1 t2= let val {shape, indexer, data} = t1 val {shape=shape2, indexer=indexer2, data=data2} = t2 fun apply i = f (Array.sub(data,i), Array.sub(data2,i)) val len = Array.length data in if Index.eq(shape, shape2) then {shape = shape, indexer = indexer, data = Array.tabulate(len, apply)} else raise Match end fun appi f tensor = Array.appi f (toArray tensor) fun app f tensor = Array.app f (toArray tensor) fun all f tensor = let val a = toArray tensor in Loop.all(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun any f tensor = let val a = toArray tensor in Loop.any(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun foldl f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Array.update(c, ic, f(Array.sub(c,ic), Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end end end (* Tensor *) (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) (* MONO_TENSOR - signature - Monomorphic tensor of arbitrary data (not only numbers). Operations should be provided to run the data in several ways, according to one index. type tensor The type of the tensor itself type elem The type of every element val storage = RowMajor | ColumnMajor RowMajor = data is stored in consecutive cells, first index varying fastest (FORTRAN convention) ColumnMajor = data is stored in consecutive cells, last index varying fastest (C,C++,Pascal,CommonLisp convention) new ([i1,...,in],init) Build a new tensor with n indices, each of sizes i1...in, filled with 'init'. fromArray (shape,data) fromList (shape,data) Use 'data' to fill a tensor of that shape. An exception is raised if 'data' is too large or too small to properly fill the vector. Later use of a 'data' array is disregarded -- one must think that the tensor now owns the array. length tensor rank tensor shape tensor Return the number of elements, the number of indices and the shape (size of each index) of the tensor. toArray tensor Return the data of the tensor in the form of an array. Mutation of this array may lead to unexpected behavior. The data in the array is stored according to `storage'. sub (tensor,[i1,...,in]) update (tensor,[i1,...,in],new_value) Access the element that is indexed by the numbers [i1,..,in] map f a mapi f a Produce a new array by mapping the function sequentially as specified by 'storage', to each element of tensor 'a'. In 'mapi' the function receives a (indices,value) tuple, while in 'map' it only receives the value. app f a appi f a The same as 'map' and 'mapi' but the function 'f' outputs nothing and no new array is produced, i.e. one only seeks the side effect that 'f' may produce. map2 operation a b Apply function 'f' to pairs of elements of 'a' and 'b' and build a new tensor with the output. Both operands must have the same shape or an exception is raised. The procedure is sequential, as specified by 'storage'. foldl operation a n Fold-left the elements of tensor 'a' along the n-th index. all test a any test a Folded boolean tests on the elements of the tensor. map', map2', foldl' Polymorphic versions of map, map2, foldl. *) signature MONO_TENSOR = sig structure Array : MONO_ARRAY structure Index : INDEX type index = Index.t type elem type tensor type t = tensor val new : index * elem -> tensor val tabulate : index * (index -> elem) -> tensor val length : tensor -> int val rank : tensor -> int val shape : tensor -> (index) val reshape : index -> tensor -> tensor val fromList : index * elem list -> tensor val fromArray : index * Array.array -> tensor val toArray : tensor -> Array.array val sub : tensor * index -> elem val update : tensor * index * elem -> unit val map : (elem -> elem) -> tensor -> tensor val map2 : (elem * elem -> elem) -> tensor -> tensor -> tensor val app : (elem -> unit) -> tensor -> unit val appi : (int * elem -> unit) -> tensor -> unit val foldl : (elem * 'a -> 'a) -> 'a -> tensor -> tensor val foldln : (elem * elem -> elem) -> elem -> tensor -> int -> tensor val all : (elem -> bool) -> tensor -> bool val any : (elem -> bool) -> tensor -> bool val map' : (elem -> 'a) -> tensor -> 'a Tensor.tensor val map2' : (elem * elem -> 'a) -> tensor -> tensor -> 'a Tensor.tensor val foldl' : ('a * elem -> 'a) -> 'a -> tensor -> int -> 'a Tensor.tensor end (* NUMBER - Signature - Guarantees a structure with a minimal number of mathematical operations so as to build an algebraic structure named Tensor. *) signature NUMBER = sig type t val zero : t val one : t val ~ : t -> t val + : t * t -> t val - : t * t -> t val * : t * t -> t val / : t * t -> t val toString : t -> string end signature NUMBER = sig type t val zero : t val one : t val + : t * t -> t val - : t * t -> t val * : t * t -> t val *+ : t * t * t -> t val *- : t * t * t -> t val ** : t * int -> t val ~ : t -> t val abs : t -> t val signum : t -> t val == : t * t -> bool val != : t * t -> bool val toString : t -> string val fromInt : int -> t val scan : (char,'a) StringCvt.reader -> (t,'a) StringCvt.reader end signature INTEGRAL_NUMBER = sig include NUMBER val quot : t * t -> t val rem : t * t -> t val mod : t * t -> t val div : t * t -> t val compare : t * t -> order val < : t * t -> bool val > : t * t -> bool val <= : t * t -> bool val >= : t * t -> bool val max : t * t -> t val min : t * t -> t end signature FRACTIONAL_NUMBER = sig include NUMBER val pi : t val e : t val / : t * t -> t val recip : t -> t val ln : t -> t val pow : t * t -> t val exp : t -> t val sqrt : t -> t val cos : t -> t val sin : t -> t val tan : t -> t val sinh : t -> t val cosh : t -> t val tanh : t -> t val acos : t -> t val asin : t -> t val atan : t -> t val asinh : t -> t val acosh : t -> t val atanh : t -> t val atan2 : t * t -> t end signature REAL_NUMBER = sig include FRACTIONAL_NUMBER val compare : t * t -> order val < : t * t -> bool val > : t * t -> bool val <= : t * t -> bool val >= : t * t -> bool val max : t * t -> t val min : t * t -> t end signature COMPLEX_NUMBER = sig include FRACTIONAL_NUMBER structure Real : REAL_NUMBER type real = Real.t val make : real * real -> t val split : t -> real * real val realPart : t -> real val imagPart : t -> real val abs2 : t -> real end structure INumber : INTEGRAL_NUMBER = struct open Int type t = Int.int val zero = 0 val one = 1 infix ** fun i ** n = let fun loop 0 = 1 | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if n < 0 then raise Domain else loop n end fun signum i = case compare(i, 0) of GREATER => 1 | EQUAL => 0 | LESS => ~1 infix == infix != fun a == b = a = b fun a != b = (a <> b) fun *+(b,c,a) = b * c + a fun *-(b,c,a) = b * c - b fun scan getc = Int.scan StringCvt.DEC getc end structure RNumber : REAL_NUMBER = struct open Real open Real.Math type t = Real.real val zero = 0.0 val one = 1.0 fun signum x = case compare(x,0.0) of LESS => ~1.0 | GREATER => 1.0 | EQUAL => 0.0 fun recip x = 1.0 / x infix ** fun i ** n = let fun loop 0 = one | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if Int.<(n, 0) then raise Domain else loop n end fun max (a, b) = if a < b then b else a fun min (a, b) = if a < b then a else b fun asinh x = ln (x + sqrt(1.0 + x * x)) fun acosh x = ln (x + (x + 1.0) * sqrt((x - 1.0)/(x + 1.0))) fun atanh x = ln ((1.0 + x) / sqrt(1.0 - x * x)) end (* Complex(R) - Functor - Provides support for complex numbers based on tuples. Should be highly efficient as most operations can be inlined. *) structure CNumber : COMPLEX_NUMBER = struct structure Real = RNumber type t = Real.t * Real.t type real = Real.t val zero = (0.0,0.0) val one = (1.0,0.0) val pi = (Real.pi, 0.0) val e = (Real.e, 0.0) fun make (r,i) = (r,i) : t fun split z = z fun realPart (r,_) = r fun imagPart (_,i) = i fun abs2 (r,i) = Real.+(Real.*(r,r),Real.*(i,i)) (* FIXME!!! *) fun arg (r,i) = Real.atan2(i,r) fun modulus z = Real.sqrt(abs2 z) fun abs z = (modulus z, 0.0) fun signum (z as (r,i)) = let val m = modulus z in (Real./(r,m), Real./(i,m)) end fun ~ (r1,i1) = (Real.~ r1, Real.~ i1) fun (r1,i1) + (r2,i2) = (Real.+(r1,r2), Real.+(i1,i2)) fun (r1,i1) - (r2,i2) = (Real.-(r1,r2), Real.-(i1,i1)) fun (r1,i1) * (r2,i2) = (Real.-(Real.*(r1,r2),Real.*(i1,i2)), Real.+(Real.*(r1,i2),Real.*(r2,i1))) fun (r1,i1) / (r2,i2) = let val modulus = abs2(r2,i2) val (nr,ni) = (r1,i1) * (r2,i2) in (Real./(nr,modulus), Real./(ni,modulus)) end fun *+((r1,i1),(r2,i2),(r0,i0)) = (Real.*+(Real.~ i1, i2, Real.*+(r1,r2,r0)), Real.*+(r2, i2, Real.*+(r1,i2,i0))) fun *-((r1,i1),(r2,i2),(r0,i0)) = (Real.*+(Real.~ i1, i2, Real.*-(r1,r2,r0)), Real.*+(r2, i2, Real.*-(r1,i2,i0))) infix ** fun i ** n = let fun loop 0 = one | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if Int.<(n, 0) then raise Domain else loop n end fun recip (r1, i1) = let val modulus = abs2(r1, i1) in (Real./(r1, modulus), Real./(Real.~ i1, modulus)) end fun ==(z, w) = Real.==(realPart z, realPart w) andalso Real.==(imagPart z, imagPart w) fun !=(z, w) = Real.!=(realPart z, realPart w) andalso Real.!=(imagPart z, imagPart w) fun fromInt i = (Real.fromInt i, 0.0) fun toString (r,i) = String.concat ["(",Real.toString r,",",Real.toString i,")"] fun exp (x, y) = let val expx = Real.exp x in (Real.*(x, (Real.cos y)), Real.*(x, (Real.sin y))) end local val half = Real.recip (Real.fromInt 2) in fun sqrt (z as (x,y)) = if Real.==(x, 0.0) andalso Real.==(y, 0.0) then zero else let val m = Real.+(modulus z, Real.abs x) val u' = Real.sqrt (Real.*(m, half)) val v' = Real./(Real.abs y , Real.+(u',u')) val (u,v) = if Real.<(x, 0.0) then (v',u') else (u',v') in (u, if Real.<(y, 0.0) then Real.~ v else v) end end fun ln z = (Real.ln (modulus z), arg z) fun pow (z, n) = let val l = ln z in exp (l * n) end fun sin (x, y) = (Real.*(Real.sin x, Real.cosh y), Real.*(Real.cos x, Real.sinh y)) fun cos (x, y) = (Real.*(Real.cos x, Real.cosh y), Real.~ (Real.*(Real.sin x, Real.sinh y))) fun tan (x, y) = let val (sx, cx) = (Real.sin x, Real.cos x) val (shy, chy) = (Real.sinh y, Real.cosh y) val a = (Real.*(sx, chy), Real.*(cx, shy)) val b = (Real.*(cx, chy), Real.*(Real.~ sx, shy)) in a / b end fun sinh (x, y) = (Real.*(Real.cos y, Real.sinh x), Real.*(Real.sin y, Real.cosh x)) fun cosh (x, y) = (Real.*(Real.cos y, Real.cosh x), Real.*(Real.sin y, Real.sinh x)) fun tanh (x, y) = let val (sy, cy) = (Real.sin y, Real.cos y) val (shx, chx) = (Real.sinh x, Real.cosh x) val a = (Real.*(cy, shx), Real.*(sy, chx)) val b = (Real.*(cy, chx), Real.*(sy, shx)) in a / b end fun asin (z as (x,y)) = let val w = sqrt (one - z * z) val (x',y') = ln ((Real.~ y, x) + w) in (y', Real.~ x') end fun acos (z as (x,y)) = let val (x', y') = sqrt (one + z * z) val (x'', y'') = ln (z + (Real.~ y', x')) in (y'', Real.~ x'') end fun atan (z as (x,y)) = let val w = sqrt (one + z*z) val (x',y') = ln ((Real.-(1.0, y), x) / w) in (y', Real.~ x') end fun atan2 (y, x) = atan(y / x) fun asinh x = ln (x + sqrt(one + x * x)) fun acosh x = ln (x + (x + one) * sqrt((x - one)/(x + one))) fun atanh x = ln ((one + x) / sqrt(one - x * x)) fun scan getc = let val scanner = Real.scan getc in fn stream => case scanner stream of NONE => NONE | SOME (a, rest) => case scanner rest of NONE => NONE | SOME (b, rest) => SOME (make(a,b), rest) end end (* ComplexNumber *) (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure INumberArray = struct open Array type array = INumber.t array type vector = INumber.t vector type elem = INumber.t structure Vector = struct open Vector type vector = INumber.t Vector.vector type elem = INumber.t end fun map f a = tabulate(length a, fn x => (f (sub(a,x)))) fun mapi f a = tabulate(length a, fn x => (f (x,sub(a,x)))) fun map2 f a b = tabulate(length a, fn x => (f(sub(a,x),sub(b,x)))) end structure RNumberArray = struct open Real64Array val sub = Unsafe.Real64Array.sub val update = Unsafe.Real64Array.update fun map f a = tabulate(length a, fn x => (f (sub(a,x)))) fun mapi f a = tabulate(length a, fn x => (f (x,sub(a,x)))) fun map2 f a b = tabulate(length a, fn x => (f(sub(a,x),sub(b,x)))) end (*--------------------- COMPLEX ARRAY -------------------------*) structure BasicCNumberArray = struct structure Complex : COMPLEX_NUMBER = CNumber structure Array : MONO_ARRAY = RNumberArray type elem = Complex.t type array = Array.array * Array.array val maxLen = Array.maxLen fun length (a,b) = Array.length a fun sub ((a,b),index) = Complex.make(Array.sub(a,index),Array.sub(b,index)) fun update ((a,b),index,z) = let val (re,im) = Complex.split z in Array.update(a, index, re); Array.update(b, index, im) end local fun makeRange (a, start, NONE) = makeRange(a, start, SOME (length a - 1)) | makeRange (a, start, SOME last) = let val len = length a val diff = last - start in if (start >= len) orelse (last >= len) then raise Subscript else if diff < 0 then (a, start, 0) else (a, start, diff + 1) end in fun array (size,z:elem) = let val realsize = size * 2 val r = Complex.realPart z val i = Complex.imagPart z in (Array.array(size,r), Array.array(size,i)) end fun zeroarray size = (Array.array(size,Complex.Real.zero), Array.array(size,Complex.Real.zero)) fun tabulate (size,f) = let val a = array(size, Complex.zero) fun loop i = case i = size of true => a | false => (update(a, i, f i); loop (i+1)) in loop 0 end fun fromList list = let val length = List.length list val a = zeroarray length fun loop (_, []) = a | loop (i, z::rest) = (update(a, i, z); loop (i+1, rest)) in loop(0,list) end fun extract range = let val (a, start, len) = makeRange range fun copy i = sub(a, i + start) in tabulate(len, copy) end fun concat array_list = let val total_length = foldl (op +) 0 (map length array_list) val a = array(total_length, Complex.zero) fun copy (_, []) = a | copy (pos, v::rest) = let fun loop i = case i = 0 of true => () | false => (update(a, i+pos, sub(v, i)); loop (i-1)) in (loop (length v - 1); copy(length v + pos, rest)) end in copy(0, array_list) end fun copy {src : array, si : int, len : int option, dst : array, di : int } = let val (a, ia, la) = makeRange (src, si, len) val (b, ib, lb) = makeRange (dst, di, len) fun copy i = case i < 0 of true => () | false => (update(b, i+ib, sub(a, i+ia)); copy (i-1)) in copy (la - 1) end val copyVec = copy fun modifyi f range = let val (a, start, len) = makeRange range val last = start + len fun loop i = case i >= last of true => () | false => (update(a, i, f(i, sub(a,i))); loop (i+1)) in loop start end fun modify f a = let val last = length a fun loop i = case i >= last of true => () | false => (update(a, i, f(sub(a,i))); loop (i+1)) in loop 0 end fun app f a = let val size = length a fun loop i = case i = size of true => () | false => (f(sub(a,i)); loop (i+1)) in loop 0 end fun appi f range = let val (a, start, len) = makeRange range val last = start + len fun loop i = case i >= last of true => () | false => (f(i, sub(a,i)); loop (i+1)) in loop start end fun map f a = let val len = length a val c = zeroarray len fun loop ~1 = c | loop i = (update(a, i, f(sub(a,i))); loop (i-1)) in loop (len-1) end fun map2 f a b = let val len = length a val c = zeroarray len fun loop ~1 = c | loop i = (update(c, i, f(sub(a,i),sub(b,i))); loop (i-1)) in loop (len-1) end fun mapi f range = let val (a, start, len) = makeRange range fun rule i = f (i+start, sub(a, i+start)) in tabulate(len, rule) end fun foldli f init range = let val (a, start, len) = makeRange range val last = start + len - 1 fun loop (i, accum) = case i > last of true => accum | false => loop (i+1, f(i, sub(a,i), accum)) in loop (start, init) end fun foldri f init range = let val (a, start, len) = makeRange range val last = start + len - 1 fun loop (i, accum) = case i < start of true => accum | false => loop (i-1, f(i, sub(a,i), accum)) in loop (last, init) end fun foldl f init a = foldli (fn (_, a, x) => f(a,x)) init (a,0,NONE) fun foldr f init a = foldri (fn (_, x, a) => f(x,a)) init (a,0,NONE) end end (* BasicCNumberArray *) structure CNumberArray = struct structure Vector = struct open BasicCNumberArray type vector = array end : MONO_VECTOR type vector = Vector.vector open BasicCNumberArray end (* CNumberArray *) structure INumber : INTEGRAL_NUMBER = struct open Int type t = Int.int val zero = 0 val one = 1 infix ** fun i ** n = let fun loop 0 = 1 | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if n < 0 then raise Domain else loop n end fun signum i = case compare(i, 0) of GREATER => 1 | EQUAL => 0 | LESS => ~1 infix == infix != fun a == b = a = b fun a != b = (a <> b) fun *+(b,c,a) = b * c + a fun *-(b,c,a) = b * c - b fun scan getc = Int.scan StringCvt.DEC getc end structure RNumber : REAL_NUMBER = struct open Real open Real.Math type t = Real.real val zero = 0.0 val one = 1.0 fun signum x = case compare(x,0.0) of LESS => ~1.0 | GREATER => 1.0 | EQUAL => 0.0 fun recip x = 1.0 / x infix ** fun i ** n = let fun loop 0 = one | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if Int.<(n, 0) then raise Domain else loop n end fun max (a, b) = if a < b then b else a fun min (a, b) = if a < b then a else b fun asinh x = ln (x + sqrt(1.0 + x * x)) fun acosh x = ln (x + (x + 1.0) * sqrt((x - 1.0)/(x + 1.0))) fun atanh x = ln ((1.0 + x) / sqrt(1.0 - x * x)) end (* Complex(R) - Functor - Provides support for complex numbers based on tuples. Should be highly efficient as most operations can be inlined. *) structure CNumber : COMPLEX_NUMBER = struct structure Real = RNumber type t = Real.t * Real.t type real = Real.t val zero = (0.0,0.0) val one = (1.0,0.0) val pi = (Real.pi, 0.0) val e = (Real.e, 0.0) fun make (r,i) = (r,i) : t fun split z = z fun realPart (r,_) = r fun imagPart (_,i) = i fun abs2 (r,i) = Real.+(Real.*(r,r),Real.*(i,i)) (* FIXME!!! *) fun arg (r,i) = Real.atan2(i,r) fun modulus z = Real.sqrt(abs2 z) fun abs z = (modulus z, 0.0) fun signum (z as (r,i)) = let val m = modulus z in (Real./(r,m), Real./(i,m)) end fun ~ (r1,i1) = (Real.~ r1, Real.~ i1) fun (r1,i1) + (r2,i2) = (Real.+(r1,r2), Real.+(i1,i2)) fun (r1,i1) - (r2,i2) = (Real.-(r1,r2), Real.-(i1,i1)) fun (r1,i1) * (r2,i2) = (Real.-(Real.*(r1,r2),Real.*(i1,i2)), Real.+(Real.*(r1,i2),Real.*(r2,i1))) fun (r1,i1) / (r2,i2) = let val modulus = abs2(r2,i2) val (nr,ni) = (r1,i1) * (r2,i2) in (Real./(nr,modulus), Real./(ni,modulus)) end fun *+((r1,i1),(r2,i2),(r0,i0)) = (Real.*+(Real.~ i1, i2, Real.*+(r1,r2,r0)), Real.*+(r2, i2, Real.*+(r1,i2,i0))) fun *-((r1,i1),(r2,i2),(r0,i0)) = (Real.*+(Real.~ i1, i2, Real.*-(r1,r2,r0)), Real.*+(r2, i2, Real.*-(r1,i2,i0))) infix ** fun i ** n = let fun loop 0 = one | loop 1 = i | loop n = let val x = loop (Int.div(n, 2)) val m = Int.mod(n, 2) in if m = 0 then x * x else x * x * i end in if Int.<(n, 0) then raise Domain else loop n end fun recip (r1, i1) = let val modulus = abs2(r1, i1) in (Real./(r1, modulus), Real./(Real.~ i1, modulus)) end fun ==(z, w) = Real.==(realPart z, realPart w) andalso Real.==(imagPart z, imagPart w) fun !=(z, w) = Real.!=(realPart z, realPart w) andalso Real.!=(imagPart z, imagPart w) fun fromInt i = (Real.fromInt i, 0.0) fun toString (r,i) = String.concat ["(",Real.toString r,",",Real.toString i,")"] fun exp (x, y) = let val expx = Real.exp x in (Real.*(x, (Real.cos y)), Real.*(x, (Real.sin y))) end local val half = Real.recip (Real.fromInt 2) in fun sqrt (z as (x,y)) = if Real.==(x, 0.0) andalso Real.==(y, 0.0) then zero else let val m = Real.+(modulus z, Real.abs x) val u' = Real.sqrt (Real.*(m, half)) val v' = Real./(Real.abs y , Real.+(u',u')) val (u,v) = if Real.<(x, 0.0) then (v',u') else (u',v') in (u, if Real.<(y, 0.0) then Real.~ v else v) end end fun ln z = (Real.ln (modulus z), arg z) fun pow (z, n) = let val l = ln z in exp (l * n) end fun sin (x, y) = (Real.*(Real.sin x, Real.cosh y), Real.*(Real.cos x, Real.sinh y)) fun cos (x, y) = (Real.*(Real.cos x, Real.cosh y), Real.~ (Real.*(Real.sin x, Real.sinh y))) fun tan (x, y) = let val (sx, cx) = (Real.sin x, Real.cos x) val (shy, chy) = (Real.sinh y, Real.cosh y) val a = (Real.*(sx, chy), Real.*(cx, shy)) val b = (Real.*(cx, chy), Real.*(Real.~ sx, shy)) in a / b end fun sinh (x, y) = (Real.*(Real.cos y, Real.sinh x), Real.*(Real.sin y, Real.cosh x)) fun cosh (x, y) = (Real.*(Real.cos y, Real.cosh x), Real.*(Real.sin y, Real.sinh x)) fun tanh (x, y) = let val (sy, cy) = (Real.sin y, Real.cos y) val (shx, chx) = (Real.sinh x, Real.cosh x) val a = (Real.*(cy, shx), Real.*(sy, chx)) val b = (Real.*(cy, chx), Real.*(sy, shx)) in a / b end fun asin (z as (x,y)) = let val w = sqrt (one - z * z) val (x',y') = ln ((Real.~ y, x) + w) in (y', Real.~ x') end fun acos (z as (x,y)) = let val (x', y') = sqrt (one + z * z) val (x'', y'') = ln (z + (Real.~ y', x')) in (y'', Real.~ x'') end fun atan (z as (x,y)) = let val w = sqrt (one + z*z) val (x',y') = ln ((Real.-(1.0, y), x) / w) in (y', Real.~ x') end fun atan2 (y, x) = atan(y / x) fun asinh x = ln (x + sqrt(one + x * x)) fun acosh x = ln (x + (x + one) * sqrt((x - one)/(x + one))) fun atanh x = ln ((one + x) / sqrt(one - x * x)) fun scan getc = let val scanner = Real.scan getc in fn stream => case scanner stream of NONE => NONE | SOME (a, rest) => case scanner rest of NONE => NONE | SOME (b, rest) => SOME (make(a,b), rest) end end (* ComplexNumber *) (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure PrettyPrint :> sig datatype modifier = Int of int | Real of real | Complex of CNumber.t | String of string val list : ('a -> string) -> 'a list -> unit val intList : int list -> unit val realList : real list -> unit val stringList : string list -> unit val array : ('a -> string) -> 'a array -> unit val intArray : int array -> unit val realArray : real array -> unit val stringArray : string array -> unit val sequence : int -> ((int * 'a -> unit) -> 'b -> unit) -> ('a -> string) -> 'b -> unit val print : modifier list -> unit end = struct datatype modifier = Int of int | Real of real | Complex of CNumber.t | String of string fun list _ [] = print "[]" | list cvt (a::resta) = let fun loop a [] = (print(cvt a); print "]") | loop a (b::restb) = (print(cvt a); print ", "; loop b restb) in print "["; loop a resta end fun boolList a = list Bool.toString a fun intList a = list Int.toString a fun realList a = list Real.toString a fun stringList a = list (fn x => x) a fun array cvt a = let val length = Array.length a - 1 fun print_one (i,x) = (print(cvt x); if not(i = length) then print ", " else ()) in Array.appi print_one a end fun boolArray a = array Bool.toString a fun intArray a = array Int.toString a fun realArray a = array Real.toString a fun stringArray a = array (fn x => x) a fun sequence length appi cvt seq = let val length = length - 1 fun print_one (i:int,x) = (print(cvt x); if not(i = length) then print ", " else ()) in print "["; appi print_one seq; print "]\n" end fun print b = let fun printer (Int a) = INumber.toString a | printer (Real a) = RNumber.toString a | printer (Complex a) = CNumber.toString a | printer (String a) = a in List.app (fn x => (TextIO.print (printer x))) b end end (* PrettyPrint *) fun print' x = List.app print x (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure INumberArray = struct open Array type array = INumber.t array type vector = INumber.t vector type elem = INumber.t structure Vector = struct open Vector type vector = INumber.t Vector.vector type elem = INumber.t end fun map f a = tabulate(length a, fn x => (f (sub(a,x)))) fun mapi f a = tabulate(length a, fn x => (f (x,sub(a,x)))) fun map2 f a b = tabulate(length a, fn x => (f(sub(a,x),sub(b,x)))) end structure RNumberArray = struct open Real64Array val sub = Unsafe.Real64Array.sub val update = Unsafe.Real64Array.update fun map f a = tabulate(length a, fn x => (f (sub(a,x)))) fun mapi f a = tabulate(length a, fn x => (f (x,sub(a,x)))) fun map2 f a b = tabulate(length a, fn x => (f(sub(a,x),sub(b,x)))) end (*--------------------- COMPLEX ARRAY -------------------------*) structure BasicCNumberArray = struct structure Complex : COMPLEX_NUMBER = CNumber structure Array : MONO_ARRAY = RNumberArray type elem = Complex.t type array = Array.array * Array.array val maxLen = Array.maxLen fun length (a,b) = Array.length a fun sub ((a,b),index) = Complex.make(Array.sub(a,index),Array.sub(b,index)) fun update ((a,b),index,z) = let val (re,im) = Complex.split z in Array.update(a, index, re); Array.update(b, index, im) end local fun makeRange (a, start, NONE) = makeRange(a, start, SOME (length a - 1)) | makeRange (a, start, SOME last) = let val len = length a val diff = last - start in if (start >= len) orelse (last >= len) then raise Subscript else if diff < 0 then (a, start, 0) else (a, start, diff + 1) end in fun array (size,z:elem) = let val realsize = size * 2 val r = Complex.realPart z val i = Complex.imagPart z in (Array.array(size,r), Array.array(size,i)) end fun zeroarray size = (Array.array(size,Complex.Real.zero), Array.array(size,Complex.Real.zero)) fun tabulate (size,f) = let val a = array(size, Complex.zero) fun loop i = case i = size of true => a | false => (update(a, i, f i); loop (i+1)) in loop 0 end fun fromList list = let val length = List.length list val a = zeroarray length fun loop (_, []) = a | loop (i, z::rest) = (update(a, i, z); loop (i+1, rest)) in loop(0,list) end fun extract range = let val (a, start, len) = makeRange range fun copy i = sub(a, i + start) in tabulate(len, copy) end fun concat array_list = let val total_length = foldl (op +) 0 (map length array_list) val a = array(total_length, Complex.zero) fun copy (_, []) = a | copy (pos, v::rest) = let fun loop i = case i = 0 of true => () | false => (update(a, i+pos, sub(v, i)); loop (i-1)) in (loop (length v - 1); copy(length v + pos, rest)) end in copy(0, array_list) end fun copy {src : array, si : int, len : int option, dst : array, di : int } = let val (a, ia, la) = makeRange (src, si, len) val (b, ib, lb) = makeRange (dst, di, len) fun copy i = case i < 0 of true => () | false => (update(b, i+ib, sub(a, i+ia)); copy (i-1)) in copy (la - 1) end val copyVec = copy fun modifyi f range = let val (a, start, len) = makeRange range val last = start + len fun loop i = case i >= last of true => () | false => (update(a, i, f(i, sub(a,i))); loop (i+1)) in loop start end fun modify f a = let val last = length a fun loop i = case i >= last of true => () | false => (update(a, i, f(sub(a,i))); loop (i+1)) in loop 0 end fun app f a = let val size = length a fun loop i = case i = size of true => () | false => (f(sub(a,i)); loop (i+1)) in loop 0 end fun appi f range = let val (a, start, len) = makeRange range val last = start + len fun loop i = case i >= last of true => () | false => (f(i, sub(a,i)); loop (i+1)) in loop start end fun map f a = let val len = length a val c = zeroarray len fun loop ~1 = c | loop i = (update(a, i, f(sub(a,i))); loop (i-1)) in loop (len-1) end fun map2 f a b = let val len = length a val c = zeroarray len fun loop ~1 = c | loop i = (update(c, i, f(sub(a,i),sub(b,i))); loop (i-1)) in loop (len-1) end fun mapi f range = let val (a, start, len) = makeRange range fun rule i = f (i+start, sub(a, i+start)) in tabulate(len, rule) end fun foldli f init range = let val (a, start, len) = makeRange range val last = start + len - 1 fun loop (i, accum) = case i > last of true => accum | false => loop (i+1, f(i, sub(a,i), accum)) in loop (start, init) end fun foldri f init range = let val (a, start, len) = makeRange range val last = start + len - 1 fun loop (i, accum) = case i < start of true => accum | false => loop (i-1, f(i, sub(a,i), accum)) in loop (last, init) end fun foldl f init a = foldli (fn (_, a, x) => f(a,x)) init (a,0,NONE) fun foldr f init a = foldri (fn (_, x, a) => f(x,a)) init (a,0,NONE) end end (* BasicCNumberArray *) structure CNumberArray = struct structure Vector = struct open BasicCNumberArray type vector = array end : MONO_VECTOR type vector = Vector.vector open BasicCNumberArray end (* CNumberArray *) structure ITensor = struct structure Number = INumber structure Array = INumberArray (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure MonoTensor = struct (* PARAMETERS structure Array = Array *) structure Index = Index type elem = Array.elem type index = Index.t type tensor = {shape : index, indexer : Index.indexer, data : Array.array} type t = tensor exception Shape exception Match exception Index local (*----- LOCALS -----*) fun make' (shape, data) = {shape = shape, indexer = Index.indexer shape, data = data} fun toInt {shape, indexer, data} index = indexer index fun splitList (l as (a::rest), place) = let fun loop (left,here,right) 0 = (List.rev left,here,right) | loop (_,_,[]) place = raise Index | loop (left,here,a::right) place = loop (here::left,a,right) (place-1) in if place <= 0 then loop ([],a,rest) (List.length rest - place) else loop ([],a,rest) (place - 1) end in (*----- STRUCTURAL OPERATIONS & QUERIES ------*) fun new (shape, init) = if not (Index.validShape shape) then raise Shape else let val length = Index.length shape in {shape = shape, indexer = Index.indexer shape, data = Array.array(length,init)} end fun toArray {shape, indexer, data} = data fun length {shape, indexer, data} = Array.length data fun shape {shape, indexer, data} = shape fun rank t = List.length (shape t) fun reshape new_shape tensor = if Index.validShape new_shape then case (Index.length new_shape) = length tensor of true => make'(new_shape, toArray tensor) | false => raise Match else raise Shape fun fromArray (s, a) = case Index.validShape s andalso ((Index.length s) = (Array.length a)) of true => make'(s, a) | false => raise Shape fun fromList (s, a) = fromArray (s, Array.fromList a) fun tabulate (shape,f) = if Index.validShape shape then let val last = Index.last shape val length = Index.length shape val c = Array.array(length, f last) fun dotable (c, indices, i) = (Array.update(c, i, f indices); if i <= 1 then c else dotable(c, Index.prev' shape indices, i-1)) in make'(shape,dotable(c, Index.prev' shape last, length-2)) end else raise Shape (*----- ELEMENTWISE OPERATIONS -----*) fun sub (t, index) = Array.sub(#data t, toInt t index) fun update (t, index, value) = Array.update(toArray t, toInt t index, value) fun map f {shape, indexer, data} = {shape = shape, indexer = indexer, data = Array.map f data} fun map2 f t1 t2= let val {shape=shape1, indexer=indexer1, data=data1} = t1 val {shape=shape2, indexer=indexer2, data=data2} = t2 in if Index.eq(shape1,shape2) then {shape = shape1, indexer = indexer1, data = Array.map2 f data1 data2} else raise Match end fun appi f tensor = Array.appi f (toArray tensor) fun app f tensor = Array.app f (toArray tensor) fun all f tensor = let val a = toArray tensor in Loop.all(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun any f tensor = let val a = toArray tensor in Loop.any(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun foldl f init tensor = Array.foldl f init (toArray tensor) fun foldln f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Array.update(c, ic, f(Array.sub(c,ic), Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end (* --- POLYMORPHIC ELEMENTWISE OPERATIONS --- *) fun array_map' f a = let fun apply index = f(Array.sub(a,index)) in Tensor.Array.tabulate(Array.length a, apply) end fun map' f t = Tensor.fromArray(shape t, array_map' f (toArray t)) fun map2' f t1 t2 = let val d1 = toArray t1 val d2 = toArray t2 fun apply i = f (Array.sub(d1,i), Array.sub(d2,i)) val len = Array.length d1 in if Index.eq(shape t1, shape t2) then Tensor.fromArray(shape t1, Tensor.Array.tabulate(len,apply)) else raise Match end fun foldl' f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Tensor.Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Tensor.Array.update(c,ic,f(Tensor.Array.sub(c,ic),Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end end end (* MonoTensor *) open MonoTensor local (* LEFT INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(a(k,i2,...,jn)*b(k,j2,...jn)) forall k MEANINGFUL VARIABLES: lk = i1 = j1 li = i2*...*in lj = j2*...*jn *) fun do_fold_first a b c lk lj li = let fun loopk (0, _, _, accum) = accum | loopk (k, ia, ib, accum) = let val delta = Number.*(Array.sub(a,ia),Array.sub(b,ib)) in loopk (k-1, ia+1, ib+1, Number.+(delta,accum)) end fun loopj (0, ib, ic) = c | loopj (j, ib, ic) = let fun loopi (0, ia, ic) = ic | loopi (i, ia, ic) = (Array.update(c, ic, loopk(lk, ia, ib, Number.zero)); loopi(i-1, ia+lk, ic+1)) in loopj(j-1, ib+lk, loopi(li, 0, ic)) end in loopj(lj, 0, 0) end in fun +* ta tb = let val (rank_a,lk::rest_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,lk2::rest_b,b) = (rank tb, shape tb, toArray tb) in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(rest_a @ rest_b, do_fold_first a b c lk li lj) end end end local (* LAST INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(mult(a(i1,i2,...,k),b(j1,j2,...,k))) forall k MEANINGFUL VARIABLES: lk = in = jn li = i1*...*i(n-1) lj = j1*...*j(n-1) *) fun do_fold_last a b c lk lj li = let fun loopi (0, ia, ic, fac) = () | loopi (i, ia, ic, fac) = let val old = Array.sub(c,ic) val inc = Number.*(Array.sub(a,ia),fac) in Array.update(c,ic,Number.+(old,inc)); loopi(i-1, ia+1, ic+1, fac) end fun loopj (j, ib, ic) = let fun loopk (0, ia, ib) = () | loopk (k, ia, ib) = (loopi(li, ia, ic, Array.sub(b,ib)); loopk(k-1, ia+li, ib+lj)) in case j of 0 => c | _ => (loopk(lk, 0, ib); loopj(j-1, ib+1, ic+li)) end (* loopj *) in loopj(lj, 0, 0) end in fun *+ ta tb = let val (rank_a,shape_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,shape_b,b) = (rank tb, shape tb, toArray tb) val (lk::rest_a) = List.rev shape_a val (lk2::rest_b) = List.rev shape_b in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(List.rev rest_a @ List.rev rest_b, do_fold_last a b c lk li lj) end end end (* ALGEBRAIC OPERATIONS *) infix ** infix == infix != fun a + b = map2 Number.+ a b fun a - b = map2 Number.- a b fun a * b = map2 Number.* a b fun a ** i = map (fn x => (Number.**(x,i))) a fun ~ a = map Number.~ a fun abs a = map Number.abs a fun signum a = map Number.signum a fun a == b = map2' Number.== a b fun a != b = map2' Number.!= a b fun toString a = raise Domain fun fromInt a = new([1], Number.fromInt a) (* TENSOR SPECIFIC OPERATIONS *) fun *> n = map (fn x => Number.*(n,x)) fun print t = (PrettyPrint.intList (shape t); TextIO.print "\n"; PrettyPrint.sequence (length t) appi Number.toString t) fun normInf a = let fun accum (y,x) = Number.max(x,Number.abs y) in foldl accum Number.zero a end end (* NumberTensor *) structure RTensor = struct structure Number = RNumber structure Array = RNumberArray (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure MonoTensor = struct (* PARAMETERS structure Array = Array *) structure Index = Index type elem = Array.elem type index = Index.t type tensor = {shape : index, indexer : Index.indexer, data : Array.array} type t = tensor exception Shape exception Match exception Index local (*----- LOCALS -----*) fun make' (shape, data) = {shape = shape, indexer = Index.indexer shape, data = data} fun toInt {shape, indexer, data} index = indexer index fun splitList (l as (a::rest), place) = let fun loop (left,here,right) 0 = (List.rev left,here,right) | loop (_,_,[]) place = raise Index | loop (left,here,a::right) place = loop (here::left,a,right) (place-1) in if place <= 0 then loop ([],a,rest) (List.length rest - place) else loop ([],a,rest) (place - 1) end in (*----- STRUCTURAL OPERATIONS & QUERIES ------*) fun new (shape, init) = if not (Index.validShape shape) then raise Shape else let val length = Index.length shape in {shape = shape, indexer = Index.indexer shape, data = Array.array(length,init)} end fun toArray {shape, indexer, data} = data fun length {shape, indexer, data} = Array.length data fun shape {shape, indexer, data} = shape fun rank t = List.length (shape t) fun reshape new_shape tensor = if Index.validShape new_shape then case (Index.length new_shape) = length tensor of true => make'(new_shape, toArray tensor) | false => raise Match else raise Shape fun fromArray (s, a) = case Index.validShape s andalso ((Index.length s) = (Array.length a)) of true => make'(s, a) | false => raise Shape fun fromList (s, a) = fromArray (s, Array.fromList a) fun tabulate (shape,f) = if Index.validShape shape then let val last = Index.last shape val length = Index.length shape val c = Array.array(length, f last) fun dotable (c, indices, i) = (Array.update(c, i, f indices); if i <= 1 then c else dotable(c, Index.prev' shape indices, i-1)) in make'(shape,dotable(c, Index.prev' shape last, length-2)) end else raise Shape (*----- ELEMENTWISE OPERATIONS -----*) fun sub (t, index) = Array.sub(#data t, toInt t index) fun update (t, index, value) = Array.update(toArray t, toInt t index, value) fun map f {shape, indexer, data} = {shape = shape, indexer = indexer, data = Array.map f data} fun map2 f t1 t2= let val {shape=shape1, indexer=indexer1, data=data1} = t1 val {shape=shape2, indexer=indexer2, data=data2} = t2 in if Index.eq(shape1,shape2) then {shape = shape1, indexer = indexer1, data = Array.map2 f data1 data2} else raise Match end fun appi f tensor = Array.appi f (toArray tensor) fun app f tensor = Array.app f (toArray tensor) fun all f tensor = let val a = toArray tensor in Loop.all(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun any f tensor = let val a = toArray tensor in Loop.any(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun foldl f init tensor = Array.foldl f init (toArray tensor) fun foldln f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Array.update(c, ic, f(Array.sub(c,ic), Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end (* --- POLYMORPHIC ELEMENTWISE OPERATIONS --- *) fun array_map' f a = let fun apply index = f(Array.sub(a,index)) in Tensor.Array.tabulate(Array.length a, apply) end fun map' f t = Tensor.fromArray(shape t, array_map' f (toArray t)) fun map2' f t1 t2 = let val d1 = toArray t1 val d2 = toArray t2 fun apply i = f (Array.sub(d1,i), Array.sub(d2,i)) val len = Array.length d1 in if Index.eq(shape t1, shape t2) then Tensor.fromArray(shape t1, Tensor.Array.tabulate(len,apply)) else raise Match end fun foldl' f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Tensor.Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Tensor.Array.update(c,ic,f(Tensor.Array.sub(c,ic),Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end end end (* MonoTensor *) open MonoTensor local (* LEFT INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(a(k,i2,...,jn)*b(k,j2,...jn)) forall k MEANINGFUL VARIABLES: lk = i1 = j1 li = i2*...*in lj = j2*...*jn *) fun do_fold_first a b c lk lj li = let fun loopk (0, _, _, accum) = accum | loopk (k, ia, ib, accum) = let val delta = Number.*(Array.sub(a,ia),Array.sub(b,ib)) in loopk (k-1, ia+1, ib+1, Number.+(delta,accum)) end fun loopj (0, ib, ic) = c | loopj (j, ib, ic) = let fun loopi (0, ia, ic) = ic | loopi (i, ia, ic) = (Array.update(c, ic, loopk(lk, ia, ib, Number.zero)); loopi(i-1, ia+lk, ic+1)) in loopj(j-1, ib+lk, loopi(li, 0, ic)) end in loopj(lj, 0, 0) end in fun +* ta tb = let val (rank_a,lk::rest_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,lk2::rest_b,b) = (rank tb, shape tb, toArray tb) in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(rest_a @ rest_b, do_fold_first a b c lk li lj) end end end local (* LAST INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(mult(a(i1,i2,...,k),b(j1,j2,...,k))) forall k MEANINGFUL VARIABLES: lk = in = jn li = i1*...*i(n-1) lj = j1*...*j(n-1) *) fun do_fold_last a b c lk lj li = let fun loopi (0, ia, ic, fac) = () | loopi (i, ia, ic, fac) = let val old = Array.sub(c,ic) val inc = Number.*(Array.sub(a,ia),fac) in Array.update(c,ic,Number.+(old,inc)); loopi(i-1, ia+1, ic+1, fac) end fun loopj (j, ib, ic) = let fun loopk (0, ia, ib) = () | loopk (k, ia, ib) = (loopi(li, ia, ic, Array.sub(b,ib)); loopk(k-1, ia+li, ib+lj)) in case j of 0 => c | _ => (loopk(lk, 0, ib); loopj(j-1, ib+1, ic+li)) end (* loopj *) in loopj(lj, 0, 0) end in fun *+ ta tb = let val (rank_a,shape_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,shape_b,b) = (rank tb, shape tb, toArray tb) val (lk::rest_a) = List.rev shape_a val (lk2::rest_b) = List.rev shape_b in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(List.rev rest_a @ List.rev rest_b, do_fold_last a b c lk li lj) end end end (* ALGEBRAIC OPERATIONS *) infix ** infix == infix != fun a + b = map2 Number.+ a b fun a - b = map2 Number.- a b fun a * b = map2 Number.* a b fun a ** i = map (fn x => (Number.**(x,i))) a fun ~ a = map Number.~ a fun abs a = map Number.abs a fun signum a = map Number.signum a fun a == b = map2' Number.== a b fun a != b = map2' Number.!= a b fun toString a = raise Domain fun fromInt a = new([1], Number.fromInt a) (* TENSOR SPECIFIC OPERATIONS *) fun *> n = map (fn x => Number.*(n,x)) fun print t = (PrettyPrint.intList (shape t); TextIO.print "\n"; PrettyPrint.sequence (length t) appi Number.toString t) fun a / b = map2 Number./ a b fun recip a = map Number.recip a fun ln a = map Number.ln a fun pow (a, b) = map (fn x => (Number.pow(x,b))) a fun exp a = map Number.exp a fun sqrt a = map Number.sqrt a fun cos a = map Number.cos a fun sin a = map Number.sin a fun tan a = map Number.tan a fun sinh a = map Number.sinh a fun cosh a = map Number.cosh a fun tanh a = map Number.tanh a fun asin a = map Number.asin a fun acos a = map Number.acos a fun atan a = map Number.atan a fun asinh a = map Number.asinh a fun acosh a = map Number.acosh a fun atanh a = map Number.atanh a fun atan2 (a,b) = map2 Number.atan2 a b fun normInf a = let fun accum (y,x) = Number.max(x,Number.abs y) in foldl accum Number.zero a end fun norm1 a = let fun accum (y,x) = Number.+(x,Number.abs y) in foldl accum Number.zero a end fun norm2 a = let fun accum (y,x) = Number.+(x, Number.*(y,y)) in Number.sqrt(foldl accum Number.zero a) end end (* RTensor *) structure CTensor = struct structure Number = CNumber structure Array = CNumberArray (* Copyright (c) Juan Jose Garcia Ripoll. All rights reserved. Refer to the COPYRIGHT file for license conditions *) structure MonoTensor = struct (* PARAMETERS structure Array = Array *) structure Index = Index type elem = Array.elem type index = Index.t type tensor = {shape : index, indexer : Index.indexer, data : Array.array} type t = tensor exception Shape exception Match exception Index local (*----- LOCALS -----*) fun make' (shape, data) = {shape = shape, indexer = Index.indexer shape, data = data} fun toInt {shape, indexer, data} index = indexer index fun splitList (l as (a::rest), place) = let fun loop (left,here,right) 0 = (List.rev left,here,right) | loop (_,_,[]) place = raise Index | loop (left,here,a::right) place = loop (here::left,a,right) (place-1) in if place <= 0 then loop ([],a,rest) (List.length rest - place) else loop ([],a,rest) (place - 1) end in (*----- STRUCTURAL OPERATIONS & QUERIES ------*) fun new (shape, init) = if not (Index.validShape shape) then raise Shape else let val length = Index.length shape in {shape = shape, indexer = Index.indexer shape, data = Array.array(length,init)} end fun toArray {shape, indexer, data} = data fun length {shape, indexer, data} = Array.length data fun shape {shape, indexer, data} = shape fun rank t = List.length (shape t) fun reshape new_shape tensor = if Index.validShape new_shape then case (Index.length new_shape) = length tensor of true => make'(new_shape, toArray tensor) | false => raise Match else raise Shape fun fromArray (s, a) = case Index.validShape s andalso ((Index.length s) = (Array.length a)) of true => make'(s, a) | false => raise Shape fun fromList (s, a) = fromArray (s, Array.fromList a) fun tabulate (shape,f) = if Index.validShape shape then let val last = Index.last shape val length = Index.length shape val c = Array.array(length, f last) fun dotable (c, indices, i) = (Array.update(c, i, f indices); if i <= 1 then c else dotable(c, Index.prev' shape indices, i-1)) in make'(shape,dotable(c, Index.prev' shape last, length-2)) end else raise Shape (*----- ELEMENTWISE OPERATIONS -----*) fun sub (t, index) = Array.sub(#data t, toInt t index) fun update (t, index, value) = Array.update(toArray t, toInt t index, value) fun map f {shape, indexer, data} = {shape = shape, indexer = indexer, data = Array.map f data} fun map2 f t1 t2= let val {shape=shape1, indexer=indexer1, data=data1} = t1 val {shape=shape2, indexer=indexer2, data=data2} = t2 in if Index.eq(shape1,shape2) then {shape = shape1, indexer = indexer1, data = Array.map2 f data1 data2} else raise Match end fun appi f tensor = Array.appi f (toArray tensor, 0, NONE) fun app f tensor = Array.app f (toArray tensor) fun all f tensor = let val a = toArray tensor in Loop.all(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun any f tensor = let val a = toArray tensor in Loop.any(0, length tensor - 1, fn i => f (Array.sub(a, i))) end fun foldl f init tensor = Array.foldl f init (toArray tensor) fun foldln f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Array.update(c, ic, f(Array.sub(c,ic), Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end (* --- POLYMORPHIC ELEMENTWISE OPERATIONS --- *) fun array_map' f a = let fun apply index = f(Array.sub(a,index)) in Tensor.Array.tabulate(Array.length a, apply) end fun map' f t = Tensor.fromArray(shape t, array_map' f (toArray t)) fun map2' f t1 t2 = let val d1 = toArray t1 val d2 = toArray t2 fun apply i = f (Array.sub(d1,i), Array.sub(d2,i)) val len = Array.length d1 in if Index.eq(shape t1, shape t2) then Tensor.fromArray(shape t1, Tensor.Array.tabulate(len,apply)) else raise Match end fun foldl' f init {shape, indexer, data=a} index = let val (head,lk,tail) = splitList(shape, index) val li = Index.length head val lj = Index.length tail val c = Tensor.Array.array(li * lj,init) fun loopi (0, _, _) = () | loopi (i, ia, ic) = (Tensor.Array.update(c,ic,f(Tensor.Array.sub(c,ic),Array.sub(a,ia))); loopi (i-1, ia+1, ic+1)) fun loopk (0, ia, _) = ia | loopk (k, ia, ic) = (loopi (li, ia, ic); loopk (k-1, ia+li, ic)) fun loopj (0, _, _) = () | loopj (j, ia, ic) = loopj (j-1, loopk(lk,ia,ic), ic+li) in loopj (lj, 0, 0); make'(head @ tail, c) end end end (* MonoTensor *) open MonoTensor local (* LEFT INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(a(k,i2,...,jn)*b(k,j2,...jn)) forall k MEANINGFUL VARIABLES: lk = i1 = j1 li = i2*...*in lj = j2*...*jn *) fun do_fold_first a b c lk lj li = let fun loopk (0, _, _, r, i) = Number.make(r,i) | loopk (k, ia, ib, r, i) = let val (ar, ai) = Array.sub(a,ia) val (br, bi) = Array.sub(b,ib) val dr = ar * br - ai * bi val di = ar * bi + ai * br in loopk (k-1, ia+1, ib+1, r+dr, i+di) end fun loopj (0, ib, ic) = c | loopj (j, ib, ic) = let fun loopi (0, ia, ic) = ic | loopi (i, ia, ic) = (Array.update(c, ic, loopk(lk, ia, ib, RNumber.zero, RNumber.zero)); loopi(i-1, ia+lk, ic+1)) in loopj(j-1, ib+lk, loopi(li, 0, ic)) end in loopj(lj, 0, 0) end in fun +* ta tb = let val (rank_a,lk::rest_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,lk2::rest_b,b) = (rank tb, shape tb, toArray tb) in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(rest_a @ rest_b, do_fold_first a b c lk li lj) end end end local (* LAST INDEX CONTRACTION: a = a(i1,i2,...,in) b = b(j1,j2,...,jn) c = c(i2,...,in,j2,...,jn) = sum(mult(a(i1,i2,...,k),b(j1,j2,...,k))) forall k MEANINGFUL VARIABLES: lk = in = jn li = i1*...*i(n-1) lj = j1*...*j(n-1) *) fun do_fold_last a b c lk lj li = let fun loopi(0, _, _, _, _) = () | loopi(i, ia, ic, br, bi) = let val (cr,ci) = Array.sub(c,ic) val (ar,ai) = Array.sub(a,ia) val dr = (ar * br - ai * bi) val di = (ar * bi + ai * br) in Array.update(c,ic,Number.make(cr+dr,ci+di)); loopi(i-1, ia+1, ic+1, br, bi) end fun loopj(j, ib, ic) = let fun loopk(0, _, _) = () | loopk(k, ia, ib) = let val (br, bi) = Array.sub(b,ib) in loopi(li, ia, ic, br, bi); loopk(k-1, ia+li, ib+lj) end in case j of 0 => c | _ => (loopk(lk, 0, ib); loopj(j-1, ib+1, ic+li)) end (* loopj *) in loopj(lj, 0, 0) end in fun *+ ta tb = let val (rank_a,shape_a,a) = (rank ta, shape ta, toArray ta) val (rank_b,shape_b,b) = (rank tb, shape tb, toArray tb) val (lk::rest_a) = List.rev shape_a val (lk2::rest_b) = List.rev shape_b in if not(lk = lk2) then raise Match else let val li = Index.length rest_a val lj = Index.length rest_b val c = Array.array(li*lj,Number.zero) in fromArray(List.rev rest_a @ List.rev rest_b, do_fold_last a b c lk li lj) end end end (* ALGEBRAIC OPERATIONS *) infix ** infix == infix != fun a + b = map2 Number.+ a b fun a - b = map2 Number.- a b fun a * b = map2 Number.* a b fun a ** i = map (fn x => (Number.**(x,i))) a fun ~ a = map Number.~ a fun abs a = map Number.abs a fun signum a = map Number.signum a fun a == b = map2' Number.== a b fun a != b = map2' Number.!= a b fun toString a = raise Domain fun fromInt a = new([1], Number.fromInt a) (* TENSOR SPECIFIC OPERATIONS *) fun *> n = map (fn x => Number.*(n,x)) fun print t = (PrettyPrint.intList (shape t); TextIO.print "\n"; PrettyPrint.sequence (length t) appi Number.toString t) fun a / b = map2 Number./ a b fun recip a = map Number.recip a fun ln a = map Number.ln a fun pow (a, b) = map (fn x => (Number.pow(x,b))) a fun exp a = map Number.exp a fun sqrt a = map Number.sqrt a fun cos a = map Number.cos a fun sin a = map Number.sin a fun tan a = map Number.tan a fun sinh a = map Number.sinh a fun cosh a = map Number.cosh a fun tanh a = map Number.tanh a fun asin a = map Number.asin a fun acos a = map Number.acos a fun atan a = map Number.atan a fun asinh a = map Number.asinh a fun acosh a = map Number.acosh a fun atanh a = map Number.atanh a fun atan2 (a,b) = map2 Number.atan2 a b fun normInf a = let fun accum (y,x) = RNumber.max(x, Number.realPart(Number.abs y)) in foldl accum RNumber.zero a end fun norm1 a = let fun accum (y,x) = RNumber.+(x, Number.realPart(Number.abs y)) in foldl accum RNumber.zero a end fun norm2 a = let fun accum (y,x) = RNumber.+(x, Number.abs2 y) in RNumber.sqrt(foldl accum RNumber.zero a) end end (* CTensor *) structure MathFile = struct type file = TextIO.instream exception Data fun assert NONE = raise Data | assert (SOME a) = a (* ------------------ INPUT --------------------- *) fun intRead file = assert(TextIO.scanStream INumber.scan file) fun realRead file = assert(TextIO.scanStream RNumber.scan file) fun complexRead file = assert(TextIO.scanStream CNumber.scan file) fun listRead eltScan file = let val length = intRead file fun eltRead file = assert(TextIO.scanStream eltScan file) fun loop (0,accum) = accum | loop (i,accum) = loop(i-1, eltRead file :: accum) in if length < 0 then raise Data else List.rev(loop(length,[])) end fun intListRead file = listRead INumber.scan file fun realListRead file = listRead RNumber.scan file fun complexListRead file = listRead CNumber.scan file fun intTensorRead file = let val shape = intListRead file val length = Index.length shape val first = intRead file val a = ITensor.Array.array(length, first) fun loop 0 = ITensor.fromArray(shape, a) | loop j = (ITensor.Array.update(a, length-j, intRead file); loop (j-1)) in loop (length - 1) end fun realTensorRead file = let val shape = intListRead file val length = Index.length shape val first = realRead file val a = RTensor.Array.array(length, first) fun loop 0 = RTensor.fromArray(shape, a) | loop j = (RTensor.Array.update(a, length-j, realRead file); loop (j-1)) in loop (length - 1) end fun complexTensorRead file = let val shape = intListRead file val length = Index.length shape val first = complexRead file val a = CTensor.Array.array(length, first) fun loop j = if j = length then CTensor.fromArray(shape, a) else (CTensor.Array.update(a, j, complexRead file); loop (j+1)) in loop 1 end (* ------------------ OUTPUT -------------------- *) fun linedOutput(file, x) = (TextIO.output(file, x); TextIO.output(file, "\n")) fun intWrite file x = linedOutput(file, INumber.toString x) fun realWrite file x = linedOutput(file, RNumber.toString x) fun complexWrite file x = let val (r,i) = CNumber.split x in linedOutput(file, concat [RNumber.toString r, " ", RNumber.toString i]) end fun listWrite converter file x = (intWrite file (length x); List.app (fn x => (linedOutput(file, converter x))) x) fun intListWrite file x = listWrite INumber.toString file x fun realListWrite file x = listWrite RNumber.toString file x fun complexListWrite file x = listWrite CNumber.toString file x fun intTensorWrite file x = (intListWrite file (ITensor.shape x); ITensor.app (fn x => (intWrite file x)) x) fun realTensorWrite file x = (intListWrite file (RTensor.shape x); RTensor.app (fn x => (realWrite file x)) x) fun complexTensorWrite file x = (intListWrite file (CTensor.shape x); CTensor.app (fn x => (complexWrite file x)) x) end fun loop 0 _ = () | loop n f = (f(); loop (n-1) f) fun test_operator new list_op list_sizes = let fun test_many list_op size = let fun test_op (times,f) = let val a = new size in (EvalTimer.timerOn(); loop times (fn _ => f(a,a)); let val t = LargeInt.toInt(EvalTimer.timerRead()) div times val i = StringCvt.padLeft #" " 6 (Int.toString t) in print i end) end in print (Int.toString size); print " "; List.app test_op list_op; print "\n" end in List.app (test_many list_op) list_sizes end structure Main = struct fun one() = let val _ = let val operators = [(20, RTensor.+), (20, RTensor.* ), (20, RTensor./), (4, fn (a,b) => RTensor.+* a b), (4, fn (a,b) => RTensor.*+ a b)] fun constructor size = RTensor.new([size,size],1.0) in print "Real tensors: (+, *, /, +*, *+)\n"; test_operator constructor operators [100,200,300,400,500]; print "\n\n" end val _ = let val operators = [(20, CTensor.+), (20, CTensor.* ), (20, CTensor./), (4, fn (a,b) => CTensor.+* a b), (4, fn (a,b) => CTensor.*+ a b)] fun constructor size = CTensor.new([size,size],CNumber.one) in print "Real tensors: (+, *, /, +*, *+)\n"; test_operator constructor operators [100,200,300,400,500]; print "\n\n" end in () end fun doit n = if n = 0 then () else (one () ; doit (n - 1)) end mlton-20100608/benchmark/tests/tsp.sml0000644000076600000240000003702511404435630016205 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) (* tree.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. * * Trees for the TSP program. *) structure Tree = struct datatype tree = NULL | ND of { left : tree, right : tree, x : real, y : real, sz : int, prev : tree ref, next : tree ref } fun mkNode (l, r, x, y, sz) = ND{ left = l, right = r, x = x, y = y, sz = sz, prev = ref NULL, next = ref NULL } fun printTree (outS, NULL) = () | printTree (outS, ND{x, y, left, right, ...}) = ( TextIO.output(outS, String.concat [ Real.toString x, " ", Real.toString y, "\n"]); printTree (outS, left); printTree (outS, right)) fun printList (outS, NULL) = () | printList (outS, start as ND{next, ...}) = let fun cycle (ND{next=next', ...}) = (next = next') | cycle _ = false fun prt (NULL) = () | prt (t as ND{x, y, next, ...}) = ( TextIO.output(outS, String.concat [ Real.toString x, " ", Real.toString y, "\n" ]); if (cycle (!next)) then () else prt (!next)) in prt start end end; (* tsp.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. *) structure TSP : sig val tsp : (Tree.tree * int) -> Tree.tree end = struct structure T = Tree fun setPrev (T.ND{prev, ...}, x) = prev := x fun setNext (T.ND{next, ...}, x) = next := x fun link (a as T.ND{next, ...}, b as T.ND{prev, ...}) = ( next := b; prev := a) fun sameNd (T.ND{next, ...}, T.ND{next=next', ...}) = (next = next') | sameNd (T.NULL, T.NULL) = true | sameNd _ = false (* Find Euclidean distance from a to b *) fun distance (T.ND{x=ax, y=ay, ...}, T.ND{x=bx, y=by, ...}) = Math.sqrt(((ax-bx)*(ax-bx)+(ay-by)*(ay-by))) | distance _ = raise Fail "distance" (* sling tree nodes into a list -- requires root to be tail of list, and * only fills in next field, not prev. *) fun makeList T.NULL = T.NULL | makeList (t as T.ND{left, right, next = t_next, ...}) = let val retVal = (case (makeList left, makeList right) of (T.NULL, T.NULL) => t | (l as T.ND{...}, T.NULL) => (setNext(left, t); l) | (T.NULL, r as T.ND{...}) => (setNext(right, t); r) | (l as T.ND{...}, r as T.ND{...}) => ( setNext(right, t); setNext(left, r); l) (* end case *)) in t_next := T.NULL; retVal end (* reverse orientation of list *) fun reverse T.NULL = () | reverse (t as T.ND{next, prev, ...}) = let fun rev (_, T.NULL) = () | rev (back, tmp as T.ND{prev, next, ...}) = let val tmp' = !next in next := back; setPrev(back, tmp); rev (tmp, tmp') end in setNext (!prev, T.NULL); prev := T.NULL; rev (t, !next) end (* Use closest-point heuristic from Cormen Leiserson and Rivest *) fun conquer (T.NULL) = T.NULL | conquer t = let val (cycle as T.ND{next=cycle_next, prev=cycle_prev, ...}) = makeList t fun loop (T.NULL) = () | loop (t as T.ND{next=ref doNext, prev, ...}) = let fun findMinDist (min, minDist, tmp as T.ND{next, ...}) = if (sameNd(cycle, tmp)) then min else let val test = distance(t, tmp) in if (test < minDist) then findMinDist (tmp, test, !next) else findMinDist (min, minDist, !next) end val (min as T.ND{next=ref min_next, prev=ref min_prev, ...}) = findMinDist (cycle, distance(t, cycle), !cycle_next) val minToNext = distance(min, min_next) val minToPrev = distance(min, min_prev) val tToNext = distance(t, min_next) val tToPrev = distance(t, min_prev) in if ((tToPrev - minToPrev) < (tToNext - minToNext)) then ( (* insert between min and min_prev *) link (min_prev, t); link (t, min)) else ( link (min, t); link (t, min_next)); loop doNext end val t' = !cycle_next in (* Create initial cycle *) cycle_next := cycle; cycle_prev := cycle; loop t'; cycle end (* Merge two cycles as per Karp *) fun merge (a as T.ND{next, ...}, b, t) = let fun locateCycle (start as T.ND{next, ...}) = let fun findMin (min, minDist, tmp as T.ND{next, ...}) = if (sameNd(start, tmp)) then (min, minDist) else let val test = distance(t, tmp) in if (test < minDist) then findMin (tmp, test, !next) else findMin (min, minDist, !next) end val (min as T.ND{next=ref next', prev=ref prev', ...}, minDist) = findMin (start, distance(t, start), !next) val minToNext = distance(min, next') val minToPrev = distance(min, prev') val tToNext = distance(t, next') val tToPrev = distance(t, prev') in if ((tToPrev - minToPrev) < (tToNext - minToNext)) (* would insert between min and prev *) then (prev', tToPrev, min, minDist) (* would insert between min and next *) else (min, minDist, next', tToNext) end (* Compute location for first cycle *) val (p1, tToP1, n1, tToN1) = locateCycle a (* compute location for second cycle *) val (p2, tToP2, n2, tToN2) = locateCycle b (* Now we have 4 choices to complete: * 1:t,p1 t,p2 n1,n2 * 2:t,p1 t,n2 n1,p2 * 3:t,n1 t,p2 p1,n2 * 4:t,n1 t,n2 p1,p2 *) val n1ToN2 = distance(n1, n2) val n1ToP2 = distance(n1, p2) val p1ToN2 = distance(p1, n2) val p1ToP2 = distance(p1, p2) fun choose (testChoice, test, choice, minDist) = if (test < minDist) then (testChoice, test) else (choice, minDist) val (choice, minDist) = (1, tToP1+tToP2+n1ToN2) val (choice, minDist) = choose(2, tToP1+tToN2+n1ToP2, choice, minDist) val (choice, minDist) = choose(3, tToN1+tToP2+p1ToN2, choice, minDist) val (choice, minDist) = choose(4, tToN1+tToN2+p1ToP2, choice, minDist) in case choice of 1 => ( (* 1:p1,t t,p2 n2,n1 -- reverse 2! *) reverse n2; link (p1, t); link (t, p2); link (n2, n1)) | 2 => ( (* 2:p1,t t,n2 p2,n1 -- OK *) link (p1, t); link (t, n2); link (p2, n1)) | 3 => ( (* 3:p2,t t,n1 p1,n2 -- OK *) link (p2, t); link (t, n1); link (p1, n2)) | 4 => ( (* 4:n1,t t,n2 p2,p1 -- reverse 1! *) reverse n1; link (n1, t); link (t, n2); link (p2, p1)) (* end case *); t end (* merge *) (* Compute TSP for the tree t -- use conquer for problems <= sz * *) fun tsp (t as T.ND{left, right, sz=sz', ...}, sz) = if (sz' <= sz) then conquer t else merge (tsp(left, sz), tsp(right, sz), t) | tsp (T.NULL, _) = T.NULL end; (* rand-sig.sml * * COPYRIGHT (c) 1993 by AT&T Bell Laboratories. See COPYRIGHT file for details. * COPYRIGHT (c) 1998 by AT&T Laboratories. * * Signature for a simple random number generator. * *) signature RAND = sig type rand = Word.word val randMin : rand val randMax : rand val random : rand -> rand (* Given seed, return value randMin <= v <= randMax * Iteratively using the value returned by random as the * next seed to random will produce a sequence of pseudo-random * numbers. *) val mkRandom : rand -> unit -> rand (* Given seed, return function generating a sequence of * random numbers randMin <= v <= randMax *) val norm : rand -> real (* Map values in the range [randMin,randMax] to (0.0,1.0) *) val range : (int * int) -> rand -> int (* Map v, randMin <= v <= randMax, to integer range [i,j] * Exception - * Fail if j < i *) end (* RAND *) (* rand.sml * * COPYRIGHT (c) 1991 by AT&T Bell Laboratories. See COPYRIGHT file for details * COPYRIGHT (c) 1998 by AT&T Laboratories. See COPYRIGHT file for details * * Random number generator taken from Paulson, pp. 170-171. * Recommended by Stephen K. Park and Keith W. Miller, * Random number generators: good ones are hard to find, * CACM 31 (1988), 1192-1201 * Updated to include the new preferred multiplier of 48271 * CACM 36 (1993), 105-110 * Updated to use on Word. * * Note: The Random structure provides a better generator. *) structure Rand : RAND = struct type rand = Word.word type rand' = Int.int (* internal representation *) val a : rand' = 48271 val m : rand' = valOf Int.maxInt (* 2^31 - 1 *) val m_1 = m - 1 val q = m div a val r = m mod a val extToInt = Word.toInt val intToExt = Word.fromInt val randMin : rand = 0w1 val randMax : rand = intToExt m_1 fun chk 0w0 = 1 | chk 0wx7fffffff = m_1 | chk seed = extToInt seed fun random' seed = let val hi = seed div q val lo = seed mod q val test = a * lo - r * hi in if test > 0 then test else test + m end val random = intToExt o random' o chk fun mkRandom seed = let val seed = ref (chk seed) in fn () => (seed := random' (!seed); intToExt (!seed)) end val real_m = Real.fromInt m fun norm s = (Real.fromInt (Word.toInt s)) / real_m fun range (i,j) = if j < i then raise Fail "Random.range: hi < lo" else if j = i then fn _ => i else let val R = Int.fromInt j - Int.fromInt i val cvt = Word.toIntX o Word.fromInt in if R = m then Word.toIntX else fn s => i + cvt ((extToInt s) mod (R+1)) end end (* Rand *) (* build.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. * * Build a two-dimensional tree for TSP. *) structure BuildTree : sig datatype axis = X_AXIS | Y_AXIS val buildTree : { n : int, dir : axis, min_x : real, min_y : real, max_x : real, max_y : real } -> Tree.tree end = struct structure T = Tree val m_e = 2.7182818284590452354 val m_e2 = 7.3890560989306502274 val m_e3 = 20.08553692318766774179 val m_e6 = 403.42879349273512264299 val m_e12 = 162754.79141900392083592475 datatype axis = X_AXIS | Y_AXIS (* builds a 2D tree of n nodes in specified range with dir as primary axis *) fun buildTree arg = let val rand = Rand.mkRandom 0w314 fun drand48 () = Rand.norm (rand ()) fun median {min, max, n} = let val t = drand48(); (* in [0.0..1.0) *) val retval = if (t > 0.5) then Math.ln(1.0-(2.0*(m_e12-1.0)*(t-0.5)/m_e12))/12.0 else ~(Math.ln(1.0-(2.0*(m_e12-1.0)*t/m_e12))/12.0) in min + ((retval + 1.0) * (max - min)/2.0) end fun uniform {min, max} = min + (drand48() * (max - min)) fun build {n = 0, ...} = T.NULL | build {n, dir=X_AXIS, min_x, min_y, max_x, max_y} = let val med = median{min=min_y, max=max_y, n=n} fun mkTree (min, max) = build{ n=n div 2, dir=Y_AXIS, min_x=min_x, max_x=max_x, min_y=min, max_y=max } in T.mkNode( mkTree(min_y, med), mkTree(med, max_y), uniform{min=min_x, max=max_x}, med, n) end | build {n, dir=Y_AXIS, min_x, min_y, max_x, max_y} = let val med = median{min=min_x, max=max_x, n=n} fun mkTree (min, max) = build{ n=n div 2, dir=X_AXIS, min_x=min, max_x=max, min_y=min_y, max_y=max_y } in T.mkNode( mkTree(min_x, med), mkTree(med, max_x), med, uniform{min=min_y, max=max_y}, n) end in build arg end end; (* Build *) signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; (* main.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. * *) structure Main : sig include BMARK val dumpPS : TextIO.outstream -> unit end = struct val name = "TSP" val problemSz = ref 32767 val divideSz = ref 150 fun printLength (outS, Tree.NULL) = print "(* 0 points *)\n" | printLength (outS, start as Tree.ND{next, x, y, ...}) = let fun cycle (Tree.ND{next=next', ...}) = (next = next') | cycle _ = false fun distance (ax, ay, bx, by) = let val dx = ax-bx and dy = ay-by in Math.sqrt (dx*dx + dy*dy) end fun length (Tree.NULL, px, py, n, len) = (n, len+distance(px, py, x, y)) | length (t as Tree.ND{x, y, next, ...}, px, py, n, len) = if (cycle t) then (n, len+distance(px, py, x, y)) else length(!next, x, y, n+1, len+distance(px, py, x, y)) in if (cycle(!next)) then TextIO.output (outS, "(* 1 point *)\n") else let val (n, len) = length(!next, x, y, 1, 0.0) in TextIO.output (outS, concat[ "(* ", Int.toString n, "points, cycle length = ", Real.toString len, " *)\n" ]) end end fun mkTree n = BuildTree.buildTree { n=n, dir=BuildTree.X_AXIS, min_x=0.0, max_x=1.0, min_y=0.0, max_y=1.0 } fun doit' n = TSP.tsp (mkTree n, !divideSz) fun dumpPS outS = ( TextIO.output (outS, "newgraph\n"); TextIO.output (outS, "newcurve pts\n"); Tree.printList (outS, doit' (!problemSz)); TextIO.output (outS, "linetype solid\n")) fun testit strm = printLength (strm, doit' (!problemSz)) val _ = problemSz := 2097151 fun doit () = doit' (!problemSz) val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop n end end mlton-20100608/benchmark/tests/tyan.sml0000644000076600000240000011146411404435630016352 0ustar mtfstaff(* Modified by sweeks@sweeks.com 2001-10-03 to go in the MLton benchmark suite. * Hardwired in the u6 list of polynomials and added a loop. *) (* tyan.sml * A Grobner Basis calculation for polynomials over F17 * Adapted from the TIL benchmark suite by Allyn Dimock: * update to SML '97, Standard Basis Library, comment out unreachable code * Original code from Thomas Yan, who has given his permission for this * code be used as a benchmarking code for SML compilers * (e-mail message Tue, 10 Apr 2001 13:07:44 -0400 (EDT)) * * The data structure for the intermediate results is described in * @article{Yan:1998:GBSP, * author = {Yan, Thomas}, * title = {The Geobucked Data Structure For Polynomials}, * journal = {Journal Of Symbolic Computation}, * volume = 23, * number = 3, * pages = {285 -- 293}, * year = 1998, * } *) val print : string -> unit = print type 'a array1 = 'a Array.array val sub1 = Array.sub val update1 = Array.update val array1 = Array.array val length1 = Array.length val op && = fn (i1, i2) => (Word.toInt (Word.andb (Word.fromInt (i1), Word.fromInt (i2)))) val op || = fn (i1, i2) => (Word.toInt (Word.orb (Word.fromInt (i1), Word.fromInt (i2)))) val op << = fn (i1, i2) => (Word.toInt (Word.<< (Word.fromInt (i1), Word.fromInt (i2)))) val op >> = fn (i1, i2) => (Word.toInt (Word.>> (Word.fromInt (i1), Word.fromInt (i2)))) infix && || << >> fun fold f l b = List.foldl f b l fun revfold f l b = List.foldr f b l val input_line = TextIO.inputLine val end_of_stream = TextIO.endOfStream val open_in = TextIO.openIn val close_in = TextIO.closeIn nonfix smlnj_mod nonfix smlnj_div val smlnj_mod = op mod val smlnj_div = op div infix 7 smlnj_mod infix 7 smlnj_div exception Tabulate fun tabulate (i,f) = if i <= 0 then raise Tabulate else let val a = array1(i,f 0) fun tabify j = if j < i then (update1(a,j,f j); tabify (j+1)) else a in tabify 1 end exception ArrayofList fun arrayoflist (hd::tl) = let val a = array1((length tl) + 1,hd) fun al([],_) = a | al(hd::tl,i) = (update1(a,i,hd); al(tl,i+1)) in al(tl,1) end | arrayoflist ([]) = raise ArrayofList structure Util = struct datatype relation = Less | Equal | Greater exception NotImplemented of string exception Impossible of string (* flag "impossible" condition *) exception Illegal of string (* flag function use violating precondition *) fun error exn msg = raise (exn msg) fun notImplemented msg = error NotImplemented msg fun impossible msg = error Impossible msg fun illegal msg = error Illegal msg (* arr[i] := obj :: arr[i]; extend non-empty arr if necessary *) fun insert (obj,i,arr) = let val len = length1 arr val res = if i length l + n) ls 0,obj0) fun ins (i,[]) = i | ins (i,x::l) = (update1(a,i,x); ins(i+1,l)) fun insert (i,[]) = a | insert (i,l::ll) = insert(ins(i,l),ll) in insert(0,ls) end *) (* given compare and array a, return list of contents of a sorted in * ascending order, with duplicates stripped out; which copy of a duplicate * remains is random. NOTE that a is modified. *) fun stripSort compare = fn a => let infix sub val op sub = sub1 and update = update1 fun swap (i,j) = let val ai = a sub i in update(a,i,a sub j); update(a,j,ai) end (* sort all a[k], 0<=i<=k (swap (lo,k); partition (lo+1,k+1,hi)) | Equal => partition (lo,k+1,hi) | Greater => (swap (k,hi-1); partition (lo,k,hi-1)) val (lo,hi) = partition (i,i,j) in s(i,lo,pivot::s(hi,j,acc)) end val res = s(0,length1 a,[]) in res end end structure F = struct val p = 17 datatype field = F of int (* for (F n), always 0<=n

=p then F(k-p) else F k end fun subtract (F n,F m) = if n>=m then F(n-m) else F(n-m+p) fun negate (F 0) = F 0 | negate (F n) = F(p-n) fun multiply (F n,F m) = F ((n*m) smlnj_mod p) fun reciprocal (F 0) = raise Div | reciprocal (F n) = let (* consider euclid gcd alg on (a,b) starting with a=p, b=n. * if maintain a = a1 n + a2 p, b = b1 n + b2 p, a>b, * then when 1 = a = a1 n + a2 p, have a1 = inverse of n mod p * note that it is not necessary to keep a2, b2 around. *) fun gcd ((a,a1),(b,b1)) = if b=1 then (* by continued fraction expansion, 0<|b1|

> *) (* unused code fun power(n,k) = if k<=3 then case k of 0 => one | 1 => n | 2 => multiply(n,n) | 3 => multiply(n,multiply(n,n)) | _ => reciprocal (power (n,~k)) (* know k<0 *) else if andb(k,1)=0 then power(multiply(n,n),rshift(k,1)) else multiply(n,power(multiply(n,n),rshift(k,1))) *) fun isZero (F n) = n=0 (* unused codeunless P.display is used fun equal (F n,F m) = n=m fun display (F n) = if n<=p smlnj_div 2 then Int.toString n else "-" ^ Int.toString (p-n) *) end structure M = struct (* MONO *) local val andb = op && infix sub << >> andb (* val op << = Bits.lshift and op >> = Bits.rshift and op andb = Bits.andb *) in (* encode (var,pwr) as a long word: hi word is var, lo word is pwr masks 0xffff for pwr, mask ~0x10000 for var, rshift 16 for var note that encoded pairs u, v have same var if u>=v, u andb ~0x10000 (print (Int.toString i); print ",")) x; print">") *) exception DoesntDivide (* unused code val numVars = 32 *) val one = M [] fun x_i v = M [(v<<16)+1] fun explode (M l) = map (fn v => (v>>16,v andb 65535)) l fun implode l = M (map (fn (v,p) => (v<<16)+p) l) val deg = let fun d([],n) = n | d(u::ul,n) = d(ul,(u andb 65535) + n) in fn (M l) => d(l,0) end (* x^k > y^l if x>k or x=y and k>l *) val compare = let fun cmp ([],[]) = Util.Equal | cmp (_::_,[]) = Util.Greater | cmp ([],_::_) = Util.Less | cmp ((u::us), (v::vs)) = if u=v then cmp (us,vs) else if uv *) Util.Greater in fn (M m,M m') => cmp(m,m') end fun display (M (l : int list)) : string = let fun dv v = if v<26 then chr (v+ord #"a") else chr (v-26+ord #"A") fun d (vv,acc) = let val v = vv>>16 and p = vv andb 65535 in if p=1 then dv v::acc else (dv v)::(String.explode (Int.toString p)) @ acc end in String.implode(fold d l []) end val multiply = let fun mul ([],m) = m | mul (m,[]) = m | mul (u::us, v::vs) = let val uu = u andb ~65536 in if uu = (v andb ~65536) then let val w = u + (v andb 65535) in if uu = (w andb ~65536) then w::mul(us,vs) else (Util.illegal (String.concat ["Mono.multiply overflow: ", display (M(u::us)),", ", display (M(v::vs))])) end else if u>v then u :: mul(us,v::vs) else (* u M (mul (m,m')) end val lcm = let fun lcm ([],m) = m | lcm (m,[]) = m | lcm (u::us, v::vs) = if u>=v then if (u andb ~65536) M (lcm (m,m')) end val tryDivide = let fun rev([],l) = l | rev(x::xs,l)=rev(xs,x::l) fun d (m,[],q) = SOME(M(rev(q,m))) | d ([],_::_,_) = NONE | d (u::us,v::vs,q) = if u d (m,m',[]) end fun divide (m,m') = case tryDivide(m,m') of SOME q => q | NONE => raise DoesntDivide end end (* local, structure M *) structure MI = struct (* MONO_IDEAL *) (* trie: * index first by increasing order of vars * children listed in increasing degree order *) datatype 'a mono_trie = MT of 'a option * (int * 'a mono_trie) list (* tag, encoded (var,pwr) and children *) datatype 'a mono_ideal = MI of (int * 'a mono_trie) ref (* int maxDegree = least degree > all elements *) fun rev ([],l) = l | rev (x::xs,l) = rev(xs,x::l) (* unused code fun tl (_::l) = l | tl [] = raise (Util.Impossible "MONO_IDEAL.tl") fun hd (x::_) = x | hd [] = raise (Util.Impossible "MONO_IDEAL.hd") *) val emptyTrie = MT(NONE,[]) fun mkEmpty () = MI(ref (0,emptyTrie)) (* unused code unless searchDeg is used fun maxDeg (MI(x)) = #1(!x) *) val lshift = op << (* unused code unless decode is used val rshift = op >> *) val andb = op && (* unused code val orb = op || *) fun encode (var,pwr) = lshift(var,16)+pwr (* unused code fun decode vp = (rshift(vp,16),andb(vp,65535)) *) fun grabVar vp = andb(vp,~65536) fun grabPwr vp = andb(vp,65535) fun smallerVar (vp,vp') = vp < andb(vp',~65536) exception Found fun search (MI(x),M.M m') = let val (d,mt) = !x val result = ref NONE (* exception Found of M.mono * '_a *) (* s works on remaining input mono, current output mono, tag, trie *) fun s (_,m,MT(SOME a,_)) = raise(result := SOME (M.M m,a); Found) | s (m',m,MT(NONE,trie)) = s'(m',m,trie) and s'([],_,_) = NONE | s'(_,_,[]) = NONE | s'(vp'::m',m,trie as (vp,child)::children) = if smallerVar(vp',vp) then s'(m',m,trie) else if grabPwr vp = 0 then (s(vp'::m',m,child); s'(vp'::m',m,children)) else if smallerVar(vp,vp') then NONE else if vp<=vp' then (s(m',vp::m,child); s'(vp'::m',m,children)) else NONE in s(rev(m',[]),[],mt) handle Found (* (m,a) => SOME(m,a) *) => !result end (* assume m is a new generator, i.e. not a multiple of an existing one *) fun insert (MI (mi),m,a) = let val (d,mt) = !mi fun i ([],MT (SOME _,_)) = Util.illegal "MONO_IDEAL.insert duplicate" | i ([],MT (NONE,children)) = MT(SOME a,children) | i (vp::m,MT(a',[])) = MT(a',[(vp,i(m,emptyTrie))]) | i (vp::m,mt as MT(a',trie as (vp',_)::_)) = let fun j [] = [(vp,i(m,emptyTrie))] | j ((vp',child)::children) = if vp M.compare (m,m')) msa val buckets = revfold ins ms (array1(0,[])) val n = length1 buckets val mi = mkEmpty() fun sort i = if i>=n then mi else let fun redundant (m,_) = case search(mi,m) of NONE => false | SOME _ => true fun filter ([],l) = app (fn (m,a) => insert(mi,m,a)) l | filter (x::xx,l) = if redundant x then filter(xx,l) else filter(xx,x::l) in filter(sub1(buckets,i),[]); update1(buckets,i,[]); sort(i+1) end in sort 0 end fun fold g (MI(x)) init = let val (_,mt) = !x fun f(acc,m,MT(NONE,children)) = f'(acc,m,children) | f(acc,m,MT(SOME a,children)) = f'(g((M.M m,a),acc),m,children) and f'(acc,m,[]) = acc | f'(acc,m,(vp,child)::children) = if grabPwr vp=0 then f'(f(acc,m,child),m,children) else f'(f(acc,vp::m,child),m,children) in f(init,[],mt) end (* unused code fun searchDeg (mi,d) = if d>maxDeg mi then [] else fold (fn ((m,a),l) => if M.deg m=d then (m,a)::l else l) mi [] *) end (* structure MI *) val log = let fun log(n,l) = if n<=1 then l else log((n >> 1),1+l) in fn n => log(n,0) end val maxLeft = ref 0 val maxRight = ref 0 val counts = tabulate(20,fn _ => array1(20,0)) val indices = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19] (* unused code fun resetCounts() = app(fn i => app (fn j => update1(sub1(counts,i),j,0)) indices) indices *) fun pair(l,r) = let val l = log l and r = log r val _ = maxLeft := Int.max(!maxLeft,l) and _ = maxRight := Int.max(!maxRight,r) val a = sub1(counts,l) in update1(a,r,sub1(a,r)+1) end (* unused code unless printCounts is used fun getCounts () = map (fn i => map (fn j => sub1(sub1(counts,i),j)) indices) indices *) structure P = struct datatype poly = P of (F.field*M.mono) list (* descending mono order *) (* fun show (P x) = (print "[ "; app (fn (f, m) => (print "("; F.show f; print ","; M.show m; print ") ")) x; print " ]") *) val zero = P [] (* unused code unless power is used val one = P [(F.one,M.one)] *) (* unused code fun coerceInt n = P [(F.coerceInt n,M.one)] fun coerceField a = P [(a,M.one)] fun coerceMono m = P [(F.one,m)] *) fun coerce (a,m) = P [(a,m)] fun implode p = P p fun cons (am,P p) = P (am::p) local fun neg p = (map (fn (a,m) => (F.negate a,m)) p) fun plus ([],p2) = p2 | plus (p1,[]) = p1 | plus ((a,m)::ms,(b,n)::ns) = case M.compare(m,n) of Util.Less => (b,n) :: plus ((a,m)::ms,ns) | Util.Greater => (a,m) :: plus (ms,(b,n)::ns) | Util.Equal => let val c = F.add(a,b) in if F.isZero c then plus(ms,ns) else (c,m)::plus(ms,ns) end fun minus ([],p2) = neg p2 | minus (p1,[]) = p1 | minus ((a,m)::ms,(b,n)::ns) = case M.compare(m,n) of Util.Less => (F.negate b,n) :: minus ((a,m)::ms,ns) | Util.Greater => (a,m) :: minus (ms,(b,n)::ns) | Util.Equal => let val c = F.subtract(a,b) in if F.isZero c then minus(ms,ns) else (c,m)::minus(ms,ns) end fun termMult (a,m,p) = (map (fn (a',m') => (F.multiply(a,a'),M.multiply(m,m'))) p) in (* unused code fun negate (P p) = P (neg p) *) fun add (P p1,P p2) = (pair(length p1,length p2); P (plus(p1,p2))) fun subtract (P p1,P p2) = (pair(length p1,length p2); P (minus(p1,p2))) (* unused code unless power is used val multiply = let fun times (p1,p2) = revfold (fn ((a,m),tot) => plus (termMult(a,m,p2),tot)) p1 [] in fn (P p1,P p2) => if length p1 > length p2 then P(times (p2,p1)) else P(times (p1,p2)) end *) (* unused code fun singleReduce (P y,a,m,P x) = (pair(length y,length x); P(minus(y,termMult(a,m,x)))) *) fun spair (a,m,P f,b,n,P g) = (pair(length f,length g); P(minus(termMult(a,m,f),termMult(b,n,g)))) val termMult = fn (a,m,P f) => P(termMult(a,m,f)) end (* unused code unless power is used val rshift = op >> val lshift = op << *) (* unused code val andb = op && val orb = op || *) fun scalarMult (a,P p) = P (map (fn (b,m) => (F.multiply(a,b),m)) p) (* unused code fun power(p,k) = if k<=3 then case k of 0 => one | 1 => p | 2 => multiply(p,p) | 3 => multiply(p,multiply(p,p)) | _ => Util.illegal "POLY.power with k<0" else if andb(k,1)=0 then power(multiply(p,p),rshift(k,1)) else multiply(p,power(multiply(p,p),rshift(k,1))) *) fun isZero (P []) = true | isZero (P (_::_)) = false (* unused code val equal = let fun eq ([],[]) = true | eq (_::_,[]) = false | eq ([],_::_) = false | eq ((a,m)::p,(b,n)::q) = F.equal(a,b) andalso M.compare(m,n)=Util.Equal andalso eq (p,q) in fn (P p,P q) => eq (p,q) end *) (* these should only be called if there is a leading term, i.e. poly<>0 *) (* unused code fun leadTerm (P(am::_)) = am | leadTerm (P []) = Util.illegal "POLY.leadTerm" *) fun leadMono (P((_,m)::_)) = m | leadMono (P []) = Util.illegal "POLY.leadMono" fun leadCoeff (P((a,_)::_)) = a | leadCoeff (P []) = Util.illegal "POLY.leadCoeff" fun rest (P (_::p)) = P p | rest (P []) = Util.illegal "POLY.rest" fun leadAndRest (P (lead::rest)) = (lead,P rest) | leadAndRest (P []) = Util.illegal "POLY.leadAndRest" fun deg (P []) = Util.illegal "POLY.deg on zero poly" | deg (P ((_,m)::_)) = M.deg m (* homogeneous poly *) fun numTerms (P p) = length p (* only used if r is used fun display (P []) = F.display F.zero | display (P p) = let fun dsp (a,m) = let val s = if M.deg m = 0 then F.display a else if F.equal(F.one,F.negate a) then "-" ^ M.display m else if F.equal(F.one,a) then M.display m else F.display a ^ M.display m in if substring(s,0,1)="-" then s else "+" ^ s end in String.concat(map dsp p) end *) end structure HP = struct datatype hpoly = HP of P.poly array1 val log = let fun log(n,l) = if n<8 then l else log((n >> 2),1+l) in fn n => log(n,0) end fun mkHPoly p = let val l = log(P.numTerms p) in HP(tabulate(l+1,fn i => if i=l then p else P.zero)) end fun add(p,HP ps) = let val l = log(P.numTerms p) in if l>=length1 ps then let val n = length1 ps in HP(tabulate(n+n, fn i => if i=n then lar'(m,indices) else let val p = sub1(ps,i) in if P.isZero p then lar(m,indices,i+1) else if null indices then lar(P.leadMono p,[i],i+1) else case M.compare(m,P.leadMono p) of Util.Less => lar(P.leadMono p,[i],i+1) | Util.Equal => lar(m,i::indices,i+1) | Util.Greater => lar(m,indices,i+1) end and lar' (_,[]) = NONE | lar' (m,i::is) = let fun extract i = case P.leadAndRest(sub1(ps,i)) of ((a,_),rest) => (update1(ps,i,rest); a) val a = revfold (fn (j,b) => F.add(extract j,b)) is (extract i) in if F.isZero a then lar(M.one,[],0) else SOME(a,m,HP ps) end in lar(M.one,[],0) end end structure G = struct val autoReduce = ref true val maxDeg = ref 10000 val maybePairs = ref 0 val primePairs = ref 0 val usedPairs = ref 0 val newGens = ref 0 fun reset () = (maybePairs:=0; primePairs:=0; usedPairs:=0; newGens:=0) fun inc r = r := !r + 1 fun reduce (f,mi) = if P.isZero f then f else let (* use accumulator and reverse at end? *) fun r hp = case HP.leadAndRest hp of NONE => [] | (SOME(a,m,hp)) => case MI.search(mi,m) of NONE => (a,m)::(r hp) | SOME (m',p) => r (HP.add(P.termMult(F.negate a,M.divide(m,m'),!p),hp)) in P.implode(r (HP.mkHPoly f)) end (* assume f<>0 *) fun mkMonic f = P.scalarMult(F.reciprocal(P.leadCoeff f),f) (* given monic h, a monomial ideal mi of m's tagged with g's representing * an ideal (g1,...,gn): a poly g is represented as (lead mono m,rest of g). * update pairs to include new s-pairs induced by h on g's: * 1) compute minimal gi1...gik so that generate , i.e. * compute monomial ideal for gi:h's tagged with gi * 2) toss out gij's whose lead mono is rel. prime to h's lead mono (why?) * 3) put (h,gij) pairs into degree buckets: for h,gij with lead mono's m,m' * deg(h,gij) = deg lcm(m,m') = deg (lcm/m) + deg m = deg (m':m) + deg m * 4) store list of pairs (h,g1),...,(h,gn) as vector (h,g1,...,gn) *) fun addPairs (h,mi,pairs) = let val m = P.leadMono h val d = M.deg m fun tag ((m' : M.mono,g' : P.poly ref),quots) = (inc maybePairs; (M.divide(M.lcm(m,m'),m),(m',!g'))::quots) fun insert ((mm,(m',g')),arr) = (* recall mm = m':m *) if M.compare(m',mm)=Util.Equal then (* rel. prime *) (inc primePairs; arr) else (inc usedPairs; Util.insert(P.cons((F.one,m'),g'),M.deg mm+d,arr)) val buckets = MI.fold insert (MI.mkIdeal (MI.fold tag mi [])) (array1(0,[])) fun ins (~1,pairs) = pairs | ins (i,pairs) = case sub1(buckets,i) of [] => ins(i-1,pairs) | gs => ins(i-1,Util.insert(arrayoflist(h::gs),i,pairs)) in ins(length1 buckets - 1,pairs) end fun grobner fs = let fun pr l = print (String.concat (l@["\n"])) val fs = revfold (fn (f,fs) => Util.insert(f,P.deg f,fs)) fs (array1(0,[])) (* pairs at least as long as fs, so done when done w/ all pairs *) val pairs = ref(array1(length1 fs,[])) val mi = MI.mkEmpty() val newDegGens = ref [] val addGen = (* add and maybe auto-reduce new monic generator h *) if not(!autoReduce) then fn h => MI.insert (mi,P.leadMono h,ref (P.rest h)) else fn h => let val ((_,m),rh) = P.leadAndRest h fun autoReduce f = if P.isZero f then f else let val ((a,m'),rf) = P.leadAndRest f in case M.compare(m,m') of Util.Less => P.cons((a,m'),autoReduce rf) | Util.Equal => P.subtract(rf,P.scalarMult(a,rh)) | Util.Greater => f end val rrh = ref rh in MI.insert (mi,P.leadMono h,rrh); app (fn f => f:=autoReduce(!f)) (!newDegGens); newDegGens := rrh :: !newDegGens end val tasksleft = ref 0 fun feedback () = let val n = !tasksleft in if (n && 15)=0 then print (Int.toString n) else (); print "."; TextIO.flushOut TextIO.stdOut; tasksleft := n-1 end fun try h = let val _ = feedback () val h = reduce(h,mi) in if P.isZero h then () else let val h = mkMonic h val _ = (print "#"; TextIO.flushOut TextIO.stdOut) in pairs := addPairs(h,mi,!pairs); addGen h; inc newGens end end fun tryPairs fgs = let val ((a,m),f) = P.leadAndRest (sub1(fgs,0)) fun tryPair i = if i=0 then () else let val ((b,n),g) = P.leadAndRest (sub1(fgs,i)) val k = M.lcm(m,n) in try (P.spair(b,M.divide(k,m),f,a,M.divide(k,n),g)); tryPair (i-1) end in tryPair (length1 fgs -1) end fun numPairs ([],n) = n | numPairs (p::ps,n) = numPairs(ps,n-1+length1 p) fun gb d = if d>=length1(!pairs) then mi else (* note: i nullify entries to reclaim space *) ( pr ["DEGREE ",Int.toString d," with ", Int.toString(numPairs(sub1(!pairs,d),0))," pairs ", if d>=length1 fs then "0" else Int.toString(length(sub1(fs,d))), " generators to do"]; tasksleft := numPairs(sub1(!pairs,d),0); if d>=length1 fs then () else tasksleft := !tasksleft + length (sub1(fs,d)); if d>(!maxDeg) then () else ( reset(); newDegGens := []; app tryPairs (sub1(!pairs,d)); update1(!pairs,d,[]); if d>=length1 fs then () else (app try (sub1(fs,d)); update1(fs,d,[])); pr ["maybe ",Int.toString(!maybePairs)," prime ", Int.toString (!primePairs), " using ",Int.toString (!usedPairs), "; found ",Int.toString (!newGens)] ); gb(d+1) ) in gb 0 end local (* grammar: dig ::= 0 | ... | 9 var ::= a | ... | z | A | ... | Z sign ::= + | - nat ::= dig | nat dig mono ::= | var mono | var num mono term ::= nat mono | mono poly ::= term | sign term | poly sign term *) datatype char = Dig of int | Var of int | Sign of int fun char ch = let val och = ord ch in if ord #"0"<=och andalso och<=ord #"9" then Dig (och - ord #"0") else if ord #"a"<=och andalso och<=ord #"z" then Var (och - ord #"a") else if ord #"A"<=och andalso och<=ord #"Z" then Var (och - ord #"A" + 26) else if och = ord #"+" then Sign 1 else if och = ord #"-" then Sign ~1 else Util.illegal ("bad ch in poly: " ^ (Char.toString(ch))) end fun nat (n,Dig d::l) = nat(n*10+d,l) | nat (n,l) = (n,l) fun mono (m,Var v::Dig d::l) = let val (n,l) = nat(d,l) in mono(M.multiply(M.implode[(v,n)],m),l) end | mono (m,Var v::l) = mono(M.multiply(M.x_i v,m),l) | mono (m,l) = (m,l) fun term l = let val (n,l) = case l of (Dig d::l) => nat(d,l) | _ => (1,l) val (m,l) = mono(M.one,l) in ((F.coerceInt n,m),l) end fun poly (p,[]) = p | poly (p,l) = let val (s,l) = case l of Sign s::l => (F.coerceInt s,l) | _ => (F.one,l) val ((a,m),l) = term l in poly(P.add(P.coerce(F.multiply(s,a),m),p),l) end in fun parsePoly s = poly (P.zero,map char(String.explode s)) (* unused code fun readIdeal stream = let fun readLine () = let val s = input_line stream val n = size s val n = if n>0 andalso substring(s,n-1,1)="\n" then n-1 else n fun r i = if i>=n then [] else case substring(s,i,1) of ";" => r(i+1) | " " => r(i+1) | _ => map char (String.explode(substring(s,i,n-i))) in r 0 end fun r () = if end_of_stream stream then [] else poly(P.zero,readLine()) :: r() fun num() = if end_of_stream stream then Util.illegal "missing #" else case nat(0,readLine()) of (_,_::_) => Util.illegal "junk after #" | (n,_) => n val _ = 1=num() orelse Util.illegal "stream doesn't start w/ `1'" val n = num() val i = r() val _ = length i = n orelse Util.illegal "wrong # poly's" in i end *) (* unused code fun read filename = let val stream = open_in filename val i = readIdeal stream val _ = close_in stream in i end *) end (* local *) end (* structure G *) val _ = G.maxDeg:=1000000 fun grab mi = MI.fold (fn ((m,g),l) => P.cons((F.one,m),!g)::l) mi [] (* unused code fun r mi s = let val p = G.parsePoly s in print (P.display p); print "\n"; print (P.display(G.reduce(p,mi))); print "\n" end *) (* unused code unless printCounts is used fun p6 i= let val s= Int.toString (i:int) val n= size s in print(substring(" ",0,6-n)); print s end *) (* unused code fun hex n = let fun h n = if n=0 then "" else h(n smlnj_div 16) ^ substring("0123456789ABCDEF",n smlnj_mod 16,1) in if n=0 then "0" else h n end fun printCounts () = map (fn l => (map p6 l; print "\n")) (getCounts()) fun totalCount () = revfold (fn (l,c) => revfold op + l c) (getCounts()) 0 *) (* unused code fun maxCount () = revfold (fn (l,m) => revfold Int.max l m) (getCounts()) 0 *) (* unused code unless analyze is used fun terms (p,tt) = if P.isZero p then tt else terms(P.rest p,P.leadMono p::tt) fun tails ([],tt) = tt | tails (t as _::t',tt) = tails (t',t::tt) *) (* Unused code unless sort (analyze) is used local val a = 16807.0 and m = 2147483647.0 in val seed = ref 1.0 fun random n = let val t = a*(!seed) in seed := t - m * real(floor(t/m)); floor(real n * !seed/m) end end *) (* Unused code unless analyze is used fun sort [] = [] | sort a = let val a = arrayoflist a val b = tabulate(length1 a,fn i => i) val sub = sub1 and update = update1 infix sub fun swap (i,j) = let val ai = a sub i in update(a,i,a sub j); update(a,j,ai) end (* sort all k, 0<=i<=k (swap (lo,k); partition (dup,lo+1,k+1,hi)) | Util.Equal => partition (dup+1,lo,k+1,hi) | Util.Greater => (swap (k,hi-1); partition (dup,lo,k,hi-1))) val (dup,lo,hi) = partition (0,i,i,j) in s(i,lo,(dup,pivot)::s(hi,j,acc)) end in s(0,length1 a,[]) end *) (* Unused code unless analyze is used fun sum f l = revfold op + (map f l) 0 *) (* Unused code included in the benchmark fun analyze gb = let val aa = revfold terms gb [] val bb = map M.explode aa val aa = sort aa fun len m = length (M.explode m) fun prt (s:string) (i:int) = (print s; print(Int.toString i); print "\n"; i) val m= sum #1 aa val u= length aa val cm =sum (fn (d,l) => d*len l) aa val cu =sum (len o #2) aa val for=length(sort(map M.implode (revfold tails bb []))) val bak=length(sort(map (M.implode o rev) (revfold tails (map rev bb) []))) in {m=prt "m = " m, u=prt "u = " u, cm =prt "cm = " cm, cu =prt "cu = " cu, for=prt "for= " for, bak=prt "bak= " bak} end *) fun gb fs = let val g = G.grobner fs handle (Util.Illegal s) => (print s; raise Div) val fs = grab g fun info f = app print [M.display(P.leadMono f), " + ", Int.toString(P.numTerms f - 1), " terms\n"] in app info fs end fun report (e as Tabulate) = (print "exn: Tabulate\n"; raise e) | report (e as ArrayofList) = (print "exn: ArrayofList\n"; raise e) | report (e as (Util.NotImplemented s)) = (print ("exn: NotImplemented " ^ s ^ "\n"); raise e) | report (e as (Util.Impossible s)) = (print ("exn: Impossible " ^ s ^ "\n"); raise e) | report (e as (Util.Illegal s)) = (print ("exn: Illegal " ^ s ^ "\n"); raise e) | report (e as (M.DoesntDivide)) = (print ("exn: DoesntDivide\n"); raise e) | report (e as (MI.Found)) = (print ("exn: Found\n"); raise e) (* rather long running test case *) (* val fs = map G.parsePoly * ["-El-Dh-Cd+Bo+xn+tm","-Fo+Ep-Ek-Dg-Cc+Ao+wn+sm","-Fn-Ej+Dp-Df-Cb+zo+vn+rm", * "-Fm-Ei-De+Cp-Ca+yo+un+qm","Fl-Bp+Bk-Al-zh-yd+xj+ti","El-Bo-zg-yc+wj+si", * "Dl-Bn-Aj+zk-zf-yb+vj+ri","Cl-Bm-Ai-ze+yk-ya+uj+qi", * "Fh+Bg-xp+xf-wl-vh-ud+te","Eh+Ag-xo-wk+wf-vg-uc+se","Dh+zg-xn-wj-ub+re", * "Ch+yg-xm-wi-ve+uf-ua+qe","Fd+Bc+xb-tp+ta-sl-rh-qd", * "Ed+Ac+wb-to-sk+sa-rg-qc","Dd+zc+vb-tn-sj-rf+ra-qb","Cd+yc+ub-tm-si-re"] *) (* rather long running test case *) (* val u7 = map G.parsePoly * ["abcdefg-h7","a+b+c+d+e+f+g","ab+bc+cd+de+ef+fg+ga", * "abc+bcd+cde+def+efg+fga+gab","abcd+bcde+cdef+defg+efga+fgab+gabc", * "abcde+bcdef+cdefg+defga+efgab+fgabc+gabcd", * "abcdef+bcdefg+cdefga+defgab+efgabc+fgabcd+gabcde"] *) (* val u5 = map G.parsePoly ["abcde-f5","a+b+c+d+e","ab+bc+cd+de+ea", * "abc+bcd+cde+dea+eab","abcd+bcde+cdea+deab+eabc"] * * val u4 = map G.parsePoly ["abcd-e4","a+b+c+d","ab+bc+cd+da","abc+bcd+cda+dab"] * *) (* fun runit () = * let * val _ = (print "Enter fs, u7, u6, u5, or u4: "; * TextIO.flushOut TextIO.stdOut) * val s = TextIO.inputN(TextIO.stdIn,2) * val data = * if (s = "fs") then fs else if (s = "u7") then u7 * else if (s = "u6") then u6 else if (s = "u5") then u5 * else if (s = "u4") then u4 else * (print "no such data\n"; raise (Util.Impossible "no such data")) * in * gb data handle e => report e * end *) structure Main = struct fun doit n = let val u6 = map G.parsePoly ["abcdef-g6","a+b+c+d+e+f","ab+bc+cd+de+ef+fa", "abc+bcd+cde+def+efa+fab", "abcd+bcde+cdef+defa+efab+fabc", "abcde+bcdef+cdefa+defab+efabc+fabcd"] fun loop n = if n = 0 then () else (gb u6; loop (n - 1)) in loop n end end mlton-20100608/benchmark/tests/vector-concat.sml0000644000076600000240000000101611404435630020135 0ustar mtfstaff(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct fun doit n = let val len = 20000 val sum = len * (len - 1) val v = Vector.tabulate (len, fn i => i) fun loop n = if n < 0 then () else if sum = Vector.foldl (op +) 0 (Vector.concat [v, v]) then loop (n - 1) else raise Fail "bug" in loop (n * 10000) end end mlton-20100608/benchmark/tests/vector-rev.sml0000644000076600000240000000112411404435630017462 0ustar mtfstaff(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct open Vector fun rev v = let val n = length v in tabulate (n, fn i => sub (v, n - 1 - i)) end fun doit n = let val v = tabulate (200000, fn i => i) fun loop n = if n < 0 then () else if 0 = sub (rev (rev v), 0) then loop (n - 1) else raise Fail "bug" in loop (n * 1000) end end mlton-20100608/benchmark/tests/vliw.sml0000644000076600000240000036053711404435630016367 0ustar mtfstaff(* From the SML/NJ benchmark suite. *) fun print _ = () signature BMARK = sig val doit : int -> unit val testit : TextIO.outstream -> unit end; open Array (* List *) infix 9 sub fun fold f x y = List.foldr f y x fun revfold f x y = List.foldl f y x val makestring = Int.toString local open Real in val realEq = == val realNe = != end exception NotAChar fun fromStr x = (case Char.fromString x of SOME c => c | NONE => raise NotAChar) fun ordof(s, i) = Char.ord(String.sub(s, i)) val explode = (fn x => map Char.toString (explode x)) val implode = (fn x => implode (map fromStr x)) fun ord s = Char.ord (fromStr s) val output = TextIO.output val std_out = TextIO.stdOut val open_in = TextIO.openIn val open_out = TextIO.openOut val close_in = TextIO.closeIn val close_out = TextIO.closeOut val input_line = fn ins => case TextIO.inputLine ins of NONE => "" | SOME s => s type instream = TextIO.instream type outstream = TextIO.outstream fun outputc f x = TextIO.output(f, x) exception NotAReal fun strToReal s = (case Real.fromString s of SOME r => r | _ => raise NotAReal) fun intToReal x = (strToReal ((Int.toString x) ^ ".0")) structure Bits = struct fun wrap (f : Word.word * Word.word -> Word.word) = (fn (x : int, y : int) => Word.toInt(f(Word.fromInt x, Word.fromInt y))) val orb = wrap Word.orb val andb = wrap Word.andb val xorb = wrap Word.xorb val lshift = wrap Word.<< val rshift = wrap Word.>> end structure Ref = struct val inc = fn x => (x := !x + 1) val dec = fn x => (x := !x - 1) end (* stringmap.sml *) signature STRINGMAP = sig type 'a stringmap exception Stringmap val new : unit -> 'a stringmap val add : 'a stringmap -> string * 'a -> unit val rm : 'a stringmap -> string -> unit val map : 'a stringmap -> string -> 'a val app : (string * 'a -> unit) -> 'a stringmap -> unit val isin : 'a stringmap -> string -> bool val extract : 'a stringmap -> 'a list end structure Stringmap : STRINGMAP = struct type 'a stringmap = (string * 'a) list array exception Stringmap val hashFactor = 32 and tableSize = 2357 (* a string hashing function returns a number between 0 and tableSize-1 *) fun hash(str: string) : int = let val nchars = String.size str fun loop(i,n,r) = if i < n then loop(i+1,n,(hashFactor * r + ordof(str,i)) mod tableSize) else r in loop(0,nchars,0) (* while !i < nchars do (n := (hashFactor * !n + ordof(str, !i)) mod tableSize; i := !i + 1); !n *) end (* create a new stringmap *) fun new (): 'a stringmap = array(tableSize,nil) (* add a mapping pair s +-> x to the stringmap a *) fun add a (s,x) = let val index = hash s in update(a,index,(s,x)::(a sub index)) end (* apply the stringmap a to the index string s *) fun map a s = let fun find ((s',x)::r) = if s=s' then x else find r | find nil = raise Stringmap in find (a sub (hash s)) end (* return true if the string is in the map, false otherwise *) fun isin a s = ((map a s; true) handle Stringmap => false) (* remove all pairs mapping string s from stringmap a *) fun rm a s = let fun f ((b as (s',j))::r) = if s=s' then f r else b :: f r | f nil = nil val index = hash s in update(a,index, f(a sub index)) end (* apply a function f to all mapping pairs in stringmap a *) fun app (f: string * 'a -> unit) a = let fun zap 0 = () | zap n = let val m = n-1 in List.app f (a sub m); zap m end in zap tableSize end (* extract the stringmap items as a list *) fun extract a = let fun atol n = if n < Array.length a then (a sub n) :: atol (n + 1) else nil val al = atol 0 fun flatten (a, b) = a @ b val fal = fold flatten al nil fun strip (s, v) = v val answer = List.map strip fal in answer end end (* Stringmap *) structure StrPak : sig val stringListString : string list -> string end = struct fun sl nil = "]" | sl (h::nil) = h ^ "]" | sl (h::n::t) = h ^ "," ^ sl (n::t) fun stringListString l = "[" ^ sl l end signature SortObjSig = sig type obj val gt : obj * obj -> bool end functor Sort ( objfun : SortObjSig ) : sig type obj val sort : obj list -> obj list end = struct open objfun type obj = objfun.obj fun sort l = let fun m2 (nil, b) = b | m2 (a, nil) = a | m2 (ha::ta, hb::tb) = if gt(ha, hb) then hb::(m2(ha::ta, tb)) else ha::(m2(ta, hb::tb)) fun ml (nil) = nil | ml (h::nil) = h | ml (h1::h2::nil) = m2(h1, h2) | ml (h1::h2::l) = ml [m2(h1, h2), (ml l)] in ml (map (fn x => [x]) l) end end structure IntImp = struct type obj = int fun gt(a:obj, b:obj) = a > b end structure INTSort = Sort ( IntImp ) structure Set : sig exception SET exception LISTUNION type 'a set val make : ''a set val makeEQ : ('a * 'a -> bool) -> 'a set val listToSet : ''a list -> ''a set val listToSetEQ : ('a * 'a -> bool) * 'a list -> 'a set val add : 'a set * 'a -> 'a set val union : 'a set * 'a set -> 'a set val listUnion : 'a set list -> 'a set val listUnionEQ : ('a * 'a -> bool) * 'a set list -> 'a set val rm : 'a set * 'a -> 'a set val intersect : 'a set * 'a set -> 'a set val diff : 'a set * 'a set -> 'a set val member : 'a set * 'a -> bool val set : 'a set -> 'a list val mag : 'a set -> int val empty : 'a set -> bool end = struct datatype 'a set = S of ('a*'a->bool) * 'a list exception SET exception LISTUNION fun eqf (x, y) = x = y val make = S (eqf, nil) fun makeEQ eqf = S (eqf, nil) fun set (S (eqf, a)) = a fun member (S (eqf, nil), e) = false | member (S (eqf, (s::t)), e) = eqf(e, s) orelse member(S (eqf, t), e) fun add(st as (S (eqf, s)), e) = if member(st, e) then st else S(eqf, e::s) fun listToSetEQ (eqf, l) = let fun f (nil, s) = s | f (h::t, s) = f(t, add(s, h)) in f(l, makeEQ eqf) end fun listToSet l = listToSetEQ (eqf, l) fun union (a, S (eqf, nil)) = a | union (S (eqf, nil), b) = b | union (S (eqf, e::a), b) = union(S (eqf, a), add(b, e)) fun listUnion (h::t) = fold union t h | listUnion _ = raise LISTUNION fun listUnionEQ (eqf, l) = fold union l (makeEQ eqf) fun rm (S (eqf, nil), x) = raise SET | rm (S (eqf, s::t), x) = if eqf(s, x) then S (eqf, t) else S(eqf, s :: set(rm(S (eqf, t), x))) fun intersect1 (a, S (eqf, nil), c) = S (eqf, c) | intersect1 (S (eqf, nil), b, c) = S (eqf, c) | intersect1 (S (eqf, a::t), b, c) = if member(b, a) then intersect1(S (eqf, t), b, a::c) else intersect1(S (eqf, t), b, c) fun intersect (a, b) = intersect1 (a, b, nil) fun diff (S (eqf, nil), b) = S (eqf, nil) | diff (S (eqf, a::t), b) = if member(b, a) then diff(S (eqf, t), b) else S (eqf, a :: set(diff(S (eqf, t), b))) fun mag s = List.length (set s) (* fun empty s = set s = nil *) fun empty (S(eqf, nil)) = true | empty (S(eqf, _)) = false end (* Copyright 1989 by AT&T Bell Laboratories *) (* updated by John Danskin at Princeton *) structure AbsMach = struct type reg = (int*string) type label = (int*string) datatype values = INT of int | REAL of real | LABVAL of int * int datatype arithop = imul | iadd | isub | idiv | orb | andb | xorb | rshift | lshift | fadd | fdiv | fmul | fsub | real | floor | logb datatype comparison = ilt | ieq | igt | ile | ige | ine | flt | feq | fgt | fle | fge | fne | inrange | outofrange datatype opcode = FETCH of {immutable: bool, offset: int, ptr: reg, dst: reg} (* dst := M[ptr+offset] if immutable then unaffected by any STORE other than through the allocptr *) | STORE of {offset: int, src: reg, ptr: reg} (* M[ptr+offset] := src *) | GETLAB of {lab: label, dst: reg} | GETREAL of {value: string, dst: reg} | ARITH of {oper: arithop, src1: reg, src2: reg, dst: reg} | ARITHI of {oper: arithop, src1: reg, src2: int, dst: reg} | MOVE of {src: reg, dst: reg} | BRANCH of {test: comparison, src1: reg, src2: reg, dst: label, live: reg list} | JUMP of {dst: reg, live: reg list} | LABEL of {lab:label, live: reg list} | WORD of {value: int} | LABWORD of {lab: label} | NOP | BOGUS of {reads: reg list, writes: reg list} val opcodeEq : opcode * opcode -> bool = (op =) end structure AbsMachImp : sig type reg type operation val oeq : operation * operation -> bool type comparison val ceq : comparison * comparison -> bool val write_o : operation -> reg Set.set val read_o : operation -> reg Set.set val write_c : comparison -> reg Set.set val read_c : comparison -> reg Set.set val resources_ok : operation list * comparison list -> bool datatype codetypes = ASSIGNMENT of operation | LABELREF of int * operation | COMPARISON of int * operation | FLOW of int * operation | TARGET of int * operation | EXIT of operation | JUNK of operation | NERGLE val classify : operation -> codetypes val maxreg : AbsMach.opcode list -> int end = struct type reg = int (* register strings will gum up set operations etc *) type operation = AbsMach.opcode type comparison = AbsMach.opcode fun oeq (a, b) = AbsMach.opcodeEq(a, b) fun ceq (a, b) = AbsMach.opcodeEq(a, b) fun reg(i, s) = i fun label(i, s) = i fun srl rl = Set.listToSet((map reg) rl) fun sr r = srl [r] val immutableMem = ~1 val mutableMem = ~2 val flowControl = ~3 (* comparisons are limited to one because of difficulty writing larger trees *) fun resources_ok(ops, c) = (List.length ops) <= 4 andalso (List.length c) <= 1 fun allocptr r = reg r = 1 fun write_o i = let open Set open AbsMach val f = fn FETCH{dst, ...} => sr dst | STORE{ptr, ...} => if allocptr ptr then listToSet [immutableMem, mutableMem] else listToSet [mutableMem] | GETLAB {dst, ...} => sr dst | GETREAL {dst, ...} => sr dst | ARITH {dst, ...} => sr dst | ARITHI {dst, ...} => sr dst | MOVE {dst, ...} => sr dst | JUMP _ => listToSet [flowControl] | BOGUS {writes, ...} => srl writes | _ => make in f i end fun write_c c = Set.listToSet [flowControl] val std_reg_list = [(1, ""), (2, ""), (3, ""), (4, ""), (5, "")] fun read i = let open Set open AbsMach val f = fn FETCH {immutable, ptr, ...} => let val mem = if immutable then immutableMem else mutableMem in add(sr ptr, mem) end | STORE {src, ptr, ...} => srl [src, ptr] | ARITH {src1, src2, ...} => srl [src1, src2] | ARITHI {src1, ...} => sr src1 | MOVE {src, ...} => sr src | BRANCH {src1, src2, ...} => srl [src1, src2] | JUMP {dst, ...} => srl (dst :: std_reg_list) | BOGUS {reads, ...} => srl reads | _ => make in f i end fun read_o i = read i fun read_c i = read i datatype codetypes = ASSIGNMENT of operation | LABELREF of int * operation | COMPARISON of int * operation | FLOW of int * operation | TARGET of int * operation | EXIT of operation | JUNK of operation | NERGLE fun maxreg li = let fun f (a, b) = Int.max(a, b) val r = (Set.set (Set.listUnion((map write_o li) @ (map read li)))) in fold f r 0 end fun classify i = let open AbsMach val f = fn FETCH _ => ASSIGNMENT i | STORE _ => ASSIGNMENT i | GETLAB{lab, dst} => LABELREF(label lab, i) | GETREAL _ => ASSIGNMENT i | ARITH _ => ASSIGNMENT i | ARITHI _ => ASSIGNMENT i | MOVE{src, dst} => if reg src = reg dst then NERGLE else ASSIGNMENT i | BRANCH{test,src1,src2,dst,live} => if test = ieq andalso (reg src1) = (reg src2) then FLOW (label dst, i) else COMPARISON (label dst, i) | JUMP _ => EXIT i | LABEL {lab, ...} => TARGET(label lab, i) | WORD _ => JUNK i | LABWORD _ => JUNK i | NOP => JUNK i | BOGUS _ => ASSIGNMENT i in f i end end structure ReadAbs : sig val read: instream -> AbsMach.opcode list end = struct open AbsMach exception ReadError fun readline(i,f) = let fun error s = (print("Error in line "^makestring i^": "^s^"\n"); raise ReadError) fun b(" "::rest) = b rest | b rest = rest val aop = fn "i"::"m"::"u"::"l"::l => (imul,l) | "i"::"a"::"d"::"d"::l => (iadd,l) | "i"::"s"::"u"::"b"::l => (isub,l) | "i"::"d"::"i"::"v"::l => (idiv,l) | "o"::"r"::"b"::" "::l=> (orb,l) | "a"::"n"::"d"::"b"::l => (andb,l) | "x"::"o"::"r"::"b"::l => (xorb,l) | "r"::"s"::"h"::"i"::"f"::"t"::l => (rshift,l) | "l"::"s"::"h"::"i"::"f"::"t"::l => (lshift,l) | "f"::"a"::"d"::"d"::l => (fadd,l) | "f"::"d"::"i"::"v"::l => (fdiv,l) | "f"::"m"::"u"::"l"::l => (fmul,l) | "f"::"s"::"u"::"b"::l => (fsub,l) | "r"::"e"::"a"::"l"::l => (real,l) | "f"::"l"::"o"::"o"::"r"::l => (floor,l) | "l"::"o"::"g"::"b"::l => (logb,l) | _ => error "illegal arithmetic operator" val com = fn "i"::"l"::"t"::l => (ilt,l) | "i"::"e"::"q"::l => (ieq,l) | "i"::"g"::"t"::l => (igt,l) | "i"::"l"::"e"::l => (ile,l) | "i"::"g"::"e"::l => (ige,l) | "i"::"n"::"e"::l => (ine,l) | "f"::"l"::"t"::l => (flt,l) | "f"::"e"::"q"::l => (feq,l) | "f"::"g"::"t"::l => (fgt,l) | "f"::"l"::"e"::l => (fle,l) | "f"::"g"::"e"::l => (fge,l) | "f"::"n"::"e"::l => (fne,l) | "i"::"n"::"r"::"a"::"n"::"g"::"e"::l => (inrange,l) | "o"::"u"::"t"::"o"::"f"::"r"::"a"::"n"::"g"::"e"::l => (outofrange,l) | _ => error "illegal comparison operator" fun immut("i"::l) = (true,l) | immut("m"::l) = (false,l) | immut _ = error "i or m required" fun int l = let val z = ord "0" fun f(n,l0 as d::l) = if d>="0" andalso d<="9" then f(n*10+ord(d)-z, l) else (n,l0) | f _ = error "in readabs.int" in f(0,l) end fun string l = let fun f("/"::l) = (nil,l) | f(a::l) = let val (s,l') = f l in (a::s, l') end | f _ = error "name not terminated by \"/\"" val (s,l') = f l in (implode s, l') end fun realc s = let val (sign,s) = case explode s of "~"::rest => (~1.0,rest) | s => (1.0,s) fun j(exp,d::dl,mant) = j(exp,dl,mant * 0.1 + intToReal(d)) | j(0,nil,mant) = mant*sign | j(exp,nil,mant) = if exp>0 then j(exp-1,nil,mant*10.0) else j(exp+1,nil,mant*0.1) fun h(esign,wholedigits,diglist,exp,nil) = j(esign*exp+wholedigits-1,diglist,0.0) | h(es,fd,dl,exp,d::s) = h(es,fd,dl,exp*10+(ord d - ord "0"),s) fun g(i,r,"E"::"~"::s)=h(~1,i,r,0,s) | g(i,r,"E"::s)=h(1,i,r,0,s) | g(i,r,d::s) = if d>="0" andalso d<="9" then g(i, (ord d - ord "0")::r, s) else h(1,i,r,0,nil) | g(i,r,nil) = h(1,i,r,0,nil) fun f(i,r,"."::s)=g(i,r,s) | f(i,r,s as "E"::_)=g(i,r,s) | f(i,r,d::s) = f(i+1,(ord(d)-ord("0"))::r,s) | f _ = error "bad in readdabs" in f(0,nil,s) end handle Overflow => error ("real constant "^s^" out of range") fun require((a:string)::ar, b::br) = if a=b then require(ar,br) else error(a^" required") | require(nil, br) = br | require(a::_,_) = error(a^" required") fun reg l = let val (s,l) = string l val l = require(["R"],l) val (i,l) = int l in ((i,s),l) end fun lab l = let val (s,l) = string l val l = require(["L"],l) val (i,l) = int l in ((i,s),l) end fun live l = let fun f(")"::_) = nil | f l = let val (r,l) = reg l in r::f(b l) end in f(b(require(["("],l))) end val opcode = fn "F"::"E"::"T"::"C"::"H"::l => let val (imm,l) = immut(b l) val (dst,l) = reg(b l) val (ptr,l) = reg(b(require(["M","["],b(require([":","="],b l))))) val (offset,l) = int(b(require(["+"],b l))) in require(["]"], b l); FETCH{immutable=imm,dst=dst,ptr=ptr,offset=offset} end | "S"::"T"::"O"::"R"::"E"::l => let val (ptr,l) = reg(b(require(["M","["],b l))) val (offset,l) = int(b(require(["+"],b l))) val (src,l) = reg(b(require([":","="],b(require(["]"], b l))))) in STORE{src=src,ptr=ptr,offset=offset} end | "G"::"E"::"T"::"L"::"A"::"B"::l => let val (dst,l) = reg(b l) val (lab,l) = lab(b(require([":","="],b l))) in GETLAB{dst=dst,lab=lab} end | "G"::"E"::"T"::"R"::"E"::"A"::"L"::l => let val (dst,l) = reg(b l) val r = realc(implode(b(require([":","="],b l)))) in GETREAL{dst=dst,value=Real.toString r} end | "A"::"R"::"I"::"T"::"H"::"I"::l => let val (dst,l) = reg(b l) val (s1,l) = reg(b(require([":","="],b l))) val (oper,l) = aop(b l) val (s2,l) = int(b l) in ARITHI{oper=oper,src1=s1,src2=s2,dst=dst} end | "A"::"R"::"I"::"T"::"H"::l => let val (dst,l) = reg(b l) val (s1,l) = reg(b(require([":","="],b l))) val (oper,l) = aop(b l) val (s2,l) = reg(b l) in ARITH{oper=oper,src1=s1,src2=s2,dst=dst} end | "M"::"O"::"V"::"E"::l => let val (dst,l) = reg(b l) val (s1,l) = reg(b(require([":","="],b l))) in MOVE{src=s1,dst=dst} end | "B"::"R"::"A"::"N"::"C"::"H"::l => let val (s1,l) = reg(b(require(["I","F"],b l))) val (test,l) = com(b l) val (s2,l) = reg(b l) val (dst,l) = lab(b(require(["G","O","T","O"],b l))) val liv = live(b l) in BRANCH{test=test,src1=s1,src2=s2,dst=dst,live=liv} end | "J"::"U"::"M"::"P"::l => let val (dst,l) = reg(b l) val live = live(b l) in JUMP{dst=dst,live=live} end | "L"::"A"::"B"::"E"::"L"::l => let val (lab,l) = lab(b l) val live = live(b(require([":"],l))) in LABEL{lab=lab,live=live} end | "W"::"O"::"R"::"D"::l => let val (i,l) = int(b l) in WORD{value=i} end | "L"::"A"::"B"::"W"::"O"::"R"::"D"::l => let val (i,l) = lab(b l) in LABWORD{lab=i} end | "N"::"O"::"P"::_ => NOP | _ => error "illegal opcode name" in case explode(input_line f) of nil => nil | l => opcode(b l)::readline(i+1,f) end fun read f = readline(0,f) end structure PrintAbs : sig val show: outstream -> AbsMach.opcode list -> unit val str: AbsMach.opcode list -> string end = struct open AbsMach fun xstr prog = let val outstr = ref "" fun pr s = outstr := !outstr ^ s val aop = fn imul => "imul" | iadd => "iadd" | isub => "isub" | idiv => "idiv" | orb => "orb" | andb => "andb" | xorb => "xorb" | rshift => "rshift" | lshift => "lshift" | fadd => "fadd" | fdiv => "fdiv" | fmul => "fmul" | fsub => "fsub" | real => "real" | floor => "floor" | logb => "logb" val com = fn ilt => "ilt" | ieq => "ieq" | igt => "igt" | ile => "ile" | ige => "ige" | ine => "ine" | flt => "flt" | feq => "feq" | fgt => "fgt" | fle => "fle" | fge => "fge" | fne => "fne" | inrange => "inrange" | outofrange => "outofrange" fun bo true = "t" | bo false = "f" fun reg(i,s) = (pr(s); pr "/R"; pr(makestring i)) fun label(i,s) = (pr(s); pr "/L"; pr(makestring i)) val p = fn FETCH{immutable,offset,ptr,dst} => (pr "FETCH"; if immutable then pr "i " else pr "m "; reg dst; pr " := M[ "; reg ptr; pr " + "; pr (makestring offset); pr(" ]\n")) | STORE{offset,ptr,src} => (pr "STORE "; pr "M[ "; reg ptr; pr " + "; pr (makestring offset); pr(" ] := "); reg src; pr "\n") | GETLAB{lab, dst} => (pr "GETLAB "; reg dst; pr " := "; label lab; pr "\n") | GETREAL{value,dst} => (pr "GETREAL "; reg dst; pr " := "; pr value; pr "\n") | ARITH{oper,src1,src2,dst} => (pr "ARITH "; reg dst; pr " := "; reg src1; pr " "; pr(aop oper); pr " "; reg src2; pr "\n") | ARITHI{oper,src1,src2,dst} => (pr "ARITHI "; reg dst; pr " := "; reg src1; pr " "; pr(aop oper); pr " "; pr(makestring src2); pr "\n") | MOVE{src,dst} => (pr "MOVE "; reg dst; pr " := "; reg src; pr "\n") | BRANCH{test,src1,src2,dst,live} => (pr "BRANCH "; pr "IF "; reg src1; pr " "; pr(com test); pr " "; reg src2; pr " GOTO "; label dst; pr " ( "; List.app (fn r => (reg r; pr " ")) live; pr ")\n") | JUMP{dst,live} => (pr "JUMP "; reg dst; pr " ( "; List.app (fn r => (reg r; pr " ")) live; pr ")\n") | LABEL{lab, live} => (pr "LABEL "; label lab; pr ": ( "; List.app (fn r => (reg r; pr " ")) live; pr ")\n") | WORD{value} => (pr "WORD "; pr (makestring value); pr "\n") | LABWORD{lab} => (pr "LABWORD "; label lab; pr "\n") | NOP => pr "NOP\n" | BOGUS{reads, writes} => (pr "BOGUS"; pr " ( "; List.app (fn r => (reg r; pr " ")) writes; pr ") := ("; List.app (fn r => (reg r; pr " ")) reads; pr ")\n") in (List.app p prog; !outstr) end fun str prog = let fun cat (a, b) = (xstr [a]) ^ b in fold cat prog "" end fun show out prog = let fun f nil = () | f (h::t) = (outputc out (xstr [h]); f t) in f prog end end structure HM = AbsMachImp structure BreakInst : sig val breaki : AbsMach.opcode list -> AbsMach.opcode list end = struct open AbsMach open HM val maxreg = AbsMachImp.maxreg fun reg(i:int, s:string) = i fun rstr(i:int, s:string) = s val new_reg_val = ref 0 val new_reg_pairs:(AbsMach.reg * AbsMach.reg) list ref = ref nil fun new_reg_init li = (new_reg_val := maxreg li; new_reg_pairs := nil) fun new_reg (r:AbsMach.reg) = let fun f nil = let val nr = (new_reg_val := !new_reg_val + 1; (!new_reg_val, rstr r)) in (new_reg_pairs := (r, nr) :: !new_reg_pairs; nr) end | f ((a, b)::t) = if r = a then b else f t in f (!new_reg_pairs) end fun breaki l = let fun f i = let val g = fn ARITH{oper, src1, src2, dst} => if reg dst = reg src1 orelse reg dst = reg src2 then let val nr = new_reg(dst) in [ARITH{oper=oper, src1=src2, src2=src2, dst=nr}, MOVE{src=nr, dst=dst}] end else [i] | ARITHI{oper, src1, src2, dst} => if reg dst = reg src1 then let val nr = new_reg(dst) in [ARITHI{oper=oper, src1=src1, src2=src2, dst=nr}, MOVE{src=nr, dst=dst}] end else [i] | FETCH{immutable, offset, ptr, dst} => if reg ptr = reg dst then let val nr = new_reg(dst) in [FETCH{immutable=immutable, offset=offset, ptr=ptr, dst=nr}, MOVE{src=nr, dst=dst}] end else [i] | MOVE{src, dst} => if reg src = reg dst then nil else [i] | _ => [i] in g i end fun h (a, b) = f a @ b val foo = new_reg_init l in fold h l nil end end structure OutFilter : sig val remnops : AbsMach.opcode list -> AbsMach.opcode list end = struct open AbsMach fun remnops ol = let fun f (NOP, NOP::b) = NOP::b | f (a, b) = a::b in fold f ol nil end end structure Delay : sig val init: AbsMach.opcode list -> unit val add_delay: AbsMach.opcode list -> AbsMach.opcode list val rm_bogus: AbsMach.opcode list -> AbsMach.opcode list val is_bogus_i : AbsMach.opcode -> bool val is_bogus_reg : AbsMach.reg -> bool val idempotency : int ref end = struct open AbsMach val maxreg = ref 0 val maxdelay = 12 val idempotency = ref 0 fun is_bogus_i (BOGUS _ ) = true | is_bogus_i _ = false fun bogus_reg ((i, s), which) = (!maxreg + maxdelay * i + which, s) fun is_bogus_reg (i, s) = i > !maxreg fun unbogus_reg (i, s) = if is_bogus_reg (i, s) then (i div maxdelay, s) else (i, s) val max_bog_reg = ref 0 val curr_idem_reg = ref 0 fun idem_reg() = (curr_idem_reg := !curr_idem_reg + 1; (!curr_idem_reg, "idem")) fun init il = ( maxreg := AbsMachImp.maxreg il; max_bog_reg := (!maxreg + 1) * maxdelay; curr_idem_reg := !max_bog_reg + 1 ) exception DELAY fun delay i = let fun opdelay oper = let val f = fn imul => 5 | iadd => 2 | isub => 2 | idiv => 12 | orb => 2 | andb => 2 | xorb => 2 | rshift => 2 | lshift => 2 | fadd => 2 | fdiv => 12 | fmul => 4 | fsub => 2 | real => 2 | floor => 2 | logb => 2 in f oper end val id = fn FETCH{immutable,offset,ptr,dst} => 2 | STORE{offset,ptr,src} => 2 | GETLAB{lab, dst} => 2 | GETREAL{value,dst} => 2 | ARITH{oper,src1,src2,dst} => opdelay oper | ARITHI{oper,src1,src2,dst} => opdelay oper | MOVE{src,dst} => 1 | BRANCH{test,src1,src2,dst,live} => 5 | JUMP{dst,live} => 1 | LABEL{lab, live} => 0 | NOP => 1 | _ => raise DELAY in id i end fun b_idemx (0, r, w) = nil | b_idemx (1, r, w) = BOGUS{reads=r @ w, writes = [idem_reg()]} :: nil | b_idemx (n, r, w) = let val ir = idem_reg() in BOGUS{reads=r @ w, writes = [ir]} :: b_idemx(n-1, r, [ir]) end fun b_idem (n, r, w) = let fun fil ((i, s), b) = if i = 0 then b else (i, s) :: b val nr = fold fil r nil in if null nr then nil else b_idemx(n, nr, w) end fun b_assx (0, r) = nil | b_assx (1, r) = BOGUS{reads=[bogus_reg(r, 1)], writes=[r]} :: nil | b_assx (n, r) = BOGUS{reads=[bogus_reg(r, n)], writes=[bogus_reg(r, n-1)]} :: b_assx(n-1, r) fun b_ass(n, r) = BOGUS{reads=[r], writes=[bogus_reg(r, n-1)]} :: b_assx(n-1, r) fun b_brxx (0, rl) = nil | b_brxx (1, rl) = let fun b r = bogus_reg(r, 1) in BOGUS{reads=rl, writes=map b rl} :: nil end | b_brxx (n, rl) = let fun br r = bogus_reg(r, n - 1) fun bw r = bogus_reg(r, n) in BOGUS{reads=map br rl, writes=map bw rl} :: b_brxx (n - 1, rl) end fun b_brx (n, rl) = let fun br r = bogus_reg(r, n-1) in BOGUS{reads=map br rl, writes=rl} :: b_brxx(n-1, rl) end fun b_br (b, n, rl) = rev (b :: b_brx(n, rl)) fun is_flow i = let open AbsMachImp fun f (FLOW _) = true | f _ = false in f (classify i) end fun add_delay il = let fun idem (r, w) = b_idem (!idempotency, r, w) fun g i = let val d = delay i val f = fn FETCH{immutable,offset,ptr,dst} => i :: (idem([ptr], [dst]) @ b_ass(d, dst)) | STORE{offset,ptr,src} => [i] | GETLAB{lab, dst} => i :: b_ass(d, dst) | GETREAL{value,dst} => i :: b_ass(d, dst) | ARITH{oper,src1,src2,dst} => i :: (idem([src1, src2], [dst]) @ b_ass(d, dst)) | ARITHI{oper,src1,src2,dst} => i :: (idem([src1], [dst]) @ b_ass(d, dst)) | MOVE{src,dst} => i :: idem([src], [dst]) | BRANCH{test,src1,src2,dst,live} => if is_flow i then [i] else b_br (BRANCH{test=test, src1=src1,src2=src2,dst=dst, live=live}, d, [src1, src2]) | _ => [i] in f i end fun apnd (nil, b) = b | apnd (a::t, b) = a :: apnd(t, b) fun fld(a, b) = apnd(g a, b) in fold fld il nil end fun rm_bogus il = let fun g nil = nil | g (i::t) = let val f = fn FETCH{immutable,offset,ptr,dst} => FETCH{immutable=immutable, offset=offset, ptr=ptr, dst= unbogus_reg dst} :: g t | STORE{offset,ptr,src} => i :: g t | GETLAB{lab, dst} => GETLAB{lab=lab, dst= unbogus_reg dst} :: g t | GETREAL{value,dst} => GETREAL{value=value, dst=unbogus_reg dst} :: g t | ARITH{oper,src1,src2,dst} => ARITH{oper=oper,src1=src1,src2=src2,dst=unbogus_reg dst} :: g t | ARITHI{oper,src1,src2,dst} => ARITHI{oper=oper,src1=src1,src2=src2,dst=unbogus_reg dst} :: g t | MOVE{src,dst} => i :: g t | BRANCH{test,src1,src2,dst,live} => BRANCH{test=test, src1=unbogus_reg src1, src2=unbogus_reg src2, dst=dst, live=live } :: g t | BOGUS _ => g t | _ => i :: g t in f i end in g il end end structure Ntypes : sig type name val init_names : unit -> unit val new_name : name -> name val prime_name : name -> name val name_prefix_eq : (name * name) -> bool type test val teq : test * test -> bool type reg type assignment val aeq : assignment * assignment -> bool datatype test_or_name = TEST of test | NAME of name | NEITHER val toneq : test_or_name * test_or_name -> bool datatype test_or_assign = TST of test | ASS of assignment val toaeq : test_or_assign * test_or_assign -> bool end = struct type test = HM.comparison val teq = HM.ceq type reg = int*string type assignment = HM.operation val aeq = HM.oeq type name = string val ct = ref 0 fun init_names () = ct := 0 fun nn() = (ct := !ct + 1; !ct - 1) fun pref nil = nil | pref ("_" :: t) = nil | pref (h :: t) = h :: pref t val name_prefix = implode o pref o explode fun name_prefix_eq(a, b) = (name_prefix a) = (name_prefix b) (* fun new_name n = n ^ "_" ^ (makestring (nn())) *) fun new_name n = name_prefix n ^ "_" ^ (makestring (nn())) fun prime_name n = (new_name n) ^ "'" datatype test_or_name = TEST of test | NAME of name | NEITHER fun toneq (TEST a, TEST b) = teq (a, b) | toneq (NAME a, NAME b) = a = b | toneq _ = false datatype test_or_assign = TST of test | ASS of assignment fun toaeq (TST a, TST b) = teq (a, b) | toaeq (ASS a, ASS b) = aeq (a, b) | toaeq _ = false end structure Dag : sig exception DAG exception DAGnotfound type dag val make : dag val tests_of : dag -> Ntypes.test Set.set val sel_of : dag -> ((Ntypes.test * bool) -> Ntypes.test_or_name) val root_of : dag -> Ntypes.test_or_name val succ_of : dag -> Ntypes.name Set.set val attach : Ntypes.test * dag * dag -> dag val reach : dag * Ntypes.test_or_name -> dag val replace_edge : dag * Ntypes.name list -> dag val newdag : (Ntypes.test Set.set * ((Ntypes.test * bool) -> Ntypes.test_or_name) * Ntypes.test_or_name * Ntypes.name Set.set) -> dag val dagToString : dag -> string end = struct open Ntypes; exception DAGnotfound exception DAG datatype dag = D of test Set.set * ((test * bool) -> test_or_name) * test_or_name * name Set.set fun tonToString (TEST t) = "TEST t" | tonToString (NAME n) = "NAME " ^ n | tonToString NEITHER = "NEITHER" fun sep (a, b) = a ^ ", " ^ b fun dagToString (D(t, sel, rt, s)) = "D([" ^ PrintAbs.str (Set.set t) ^ "]" ^ "fn, " ^ (tonToString rt) ^ ", " ^ (fold sep (Set.set s) ")") val make = D(Set.makeEQ teq, fn x => raise DAGnotfound, NEITHER, Set.make) fun newdag x = D x fun tests_of(D (b, sel, r, h)) = b fun sel_of(D (b, sel, r, h)) = sel fun root_of(D (b, sel, r, h)) = r fun succ_of(D (b, sel, r, h)) = h fun attach (t, D dt, D df) = let open Set val (b1, sel1, r1, h1) = dt val (b2, sel2, r2, h2) = df in D(add(union(b1, b2), t), (fn(x, y) => if teq(x, t) then if y then r1 else r2 else sel1(x, y) handle DAGnotfound => sel2(x, y)), TEST t, union(h1,h2) ) end fun reach (D d, tn) = let open Set val (b, sel, r, h) = d fun f (TEST t) = if not (member(b, t)) then raise DAGnotfound else attach(t, reach(D d, sel(t, true)), reach(D d, sel(t, false))) | f (NAME n) = D(makeEQ teq, fn x => raise DAGnotfound, NAME n, listToSet [n]) | f (_) = raise DAGnotfound in f tn end fun replace_edge (D d, nil) = D d | replace_edge (D d, old::new::tl) = let open Set val (b, sel, r, h) = d val nh = if member(h, old) then add(rm(h, old), new) else h val nr = if toneq(r, NAME old) then NAME new else r val nsel = fn(x, y) => let val v = sel(x, y) in if toneq(v, NAME old) then NAME new else v end in D (b, nsel, nr, nh) end | replace_edge _ = raise DAG end structure Node : sig type node type program val delete_debug : bool ref val move_op_debug : bool ref val move_test_debug : bool ref val rw_debug : bool ref val ntn_debug : bool ref val prog_node_debug : bool ref val prog_node_debug_verbose : bool ref val closure_progs_debug : bool ref val cpsiCheck : bool ref val makeProg : unit -> program val make : Ntypes.name * Ntypes.assignment Set.set * Dag.dag * Ntypes.name Set.set-> node val name_of : node -> Ntypes.name val assignment_of : node -> Ntypes.assignment Set.set val dag_of : node -> Dag.dag val succ : program * node -> Ntypes.name Set.set val prednm : program * Ntypes.name -> Ntypes.name Set.set val pred : program * node -> Ntypes.name Set.set val succNodes : program * node -> node Set.set val predNodes : program * node -> node Set.set val readNode : node -> int Set.set val writeNode : node -> int Set.set val unreachable : program * node -> bool val num_ops_node : node -> int val num_tests_node : node -> int val num_things_node : node -> int val replace_edge_node : node * string list -> node exception NAMETONODE val nameToNode : program * Ntypes.name -> node val nameSetToNodeSet : program * Ntypes.name Set.set -> node Set.set val eqn : node * node -> bool val n00 : node val fin : node val delete : program * node -> program val move_op : program * Ntypes.assignment * node Set.set * node -> program val move_test : program * Ntypes.test * node * node -> program val nodeToString : node -> string val progToString : program -> string val entries : program -> node list val programs : program -> program list val addPredInfo : program -> program val closure : program * node -> program val sortNodes : node list -> node list val updateNode : program * node -> program val addNode : program * node -> program val rmNode : program * node -> program end = struct open Ntypes open Dag open StrPak datatype node = N of name * assignment Set.set * dag * name Set.set type program = node Stringmap.stringmap * node * node type debug_fun = unit -> string val delete_debug = ref false val move_op_debug = ref false val dead_set_debug = ref false val move_test_debug = ref false val rw_debug = ref false val prog_node_debug = ref false val prog_node_debug_verbose = ref false val closure_progs_debug = ref false fun name_of(N(n, a, d, prd)) = n fun assignment_of(N(n, a, d, prd)) = a fun dag_of(N(n, a, d, prd)) = d fun pred_of(N(n, a, d, prd)) = prd fun eqn(n1, n2) = name_of n1 = name_of n2 val start:name = "START" val finish:name = "FINISH" fun printstringlist sl = stringListString sl val psl = printstringlist fun nodeToString (N(n, a, d, prd)) = "\nN(" ^ n ^ ", [" ^ PrintAbs.str (Set.set a) ^ "], " ^ Dag.dagToString d ^ "pred(" ^ psl (Set.set prd) ^ "))" fun progToString (ns, n0, F) = "P (" ^ (psl o (map nodeToString) o Stringmap.extract) ns ^ ",\n" ^ nodeToString n0 ^ ",\n" ^ nodeToString F ^ ")\n" fun make (n, a, t, prd) = N(n, a, t, prd) val n00 = make(start, Set.makeEQ aeq, Dag.make, Set.make) val fin = make(finish, Set.makeEQ aeq, Dag.make, Set.make) fun makeProg() = (Stringmap.new():node Stringmap.stringmap, n00, fin) fun addPredNode (N(n, a, t, prd), p) = (N(n, a, t, Set.add(prd, p))) fun unionPredNode (N(n, a, t, prd), ps) = (N(n, a, t, Set.union(prd, ps))) fun setPredNode (N(n, a, t, prd), p) = (N(n, a, t, p)) fun rmPredNode (N(n, a, t, prd), p) = (N(n, a, t, Set.rm(prd, p))) fun p_n_debug (f:debug_fun) = if !prog_node_debug then print ("p_n:" ^ f() ^ "\n") else () fun updateNode(P as (ns, n0, F), new_node) = let val answer = (Stringmap.rm (ns:node Stringmap.stringmap) ((name_of new_node):string); Stringmap.add ns ((name_of new_node), new_node); if name_of new_node = name_of n0 then (ns, new_node, F) else if name_of new_node = name_of F then (ns, n0, new_node) else P) val foo = p_n_debug (fn () => ("updateNode n=" ^ nodeToString new_node ^ "=>" ^ (if !prog_node_debug_verbose then progToString answer else "(program)"))) in answer end fun addNode(P as (ns, n0, F), new_node) = let val answer = if Stringmap.isin ns (name_of new_node) then updateNode(P, new_node) else (Stringmap.add ns ((name_of new_node), new_node); P) val foo = p_n_debug (fn () => ("addNode n=" ^ nodeToString new_node ^ "=>" ^ (if !prog_node_debug_verbose then progToString answer else "(program)"))) in answer end fun rmNode(P as (ns, n0, F), node) = let val answer = (Stringmap.rm ns (name_of node); P) val foo = p_n_debug (fn () => ("rmNode n=" ^ nodeToString node ^ "=>" ^ (if !prog_node_debug_verbose then progToString answer else "(program)"))) in answer end fun succ(p, n) = (succ_of o dag_of) n fun pred(p, n) = pred_of n val ntn_debug = ref true fun ntnPrint (f:debug_fun) = if !ntn_debug then print ("ntn:" ^ f() ^ "\n") else () exception NAMETONODE fun nameToNode(P as (ns, n0, F), nm) = Stringmap.map ns nm handle Stringmap => (ntnPrint (fn () => ("nameToNode " ^ nm ^ "not found")); raise NAMETONODE) exception NAMESETTONODESET fun nameSetToNodeSet(P, ns) = Set.listToSetEQ(eqn, map (fn x => nameToNode(P, x)) (Set.set ns)) handle NAMETONODE => raise NAMESETTONODESET fun prednm(p, nm) = pred(p, nameToNode(p, nm)) fun succNodes (p, n) = nameSetToNodeSet(p, succ(p, n)) fun predNodes (p, n) = nameSetToNodeSet(p, pred(p, n)) (* a correctness assertion *) exception CPSI val cpsiCheck = ref false fun checkPredSuccInfo(from, P as (ns, n0, F)) = let val nl = Stringmap.extract ns val badnode = ref n0 fun fail s = (print ("CPSI:" ^ s ^ " failed\nfrom " ^ from ^ "\nbadnode=" ^ nodeToString (!badnode) ^ "\nprogram=" ^ progToString P ^ "\n"); raise CPSI) fun chk (xpred, xsuccN, n) = let val foo = badnode := n val s = Set.set(xsuccN(P, n)) handle NAMESETTONODESET => fail "NAMESETTONODESET" fun cs x = Set.member(xpred x, name_of n) fun fs (x, b) = b andalso cs x in fold fs s true end fun cp (x, b) = b andalso chk(pred_of, succNodes, x) fun cs (x, b) = b andalso chk((succ_of o dag_of), predNodes, x) in if not (fold cp nl true) then fail "cp" else if not (fold cs nl true) then fail "cs" else () end fun cpsi x = if !cpsiCheck then checkPredSuccInfo x else () fun empty n = let open Set in empty (assignment_of n) andalso empty ((tests_of o dag_of) n) end fun unreachable(P as (ns, n0, F), n) = not (eqn (n0, n)) andalso Set.empty (pred(P, n)) fun read (TST(t)) = HM.read_c t | read (ASS(a)) = HM.read_o a fun write (TST(t)) = HM.write_c t | write (ASS(a)) = HM.write_o a fun read_write_debug (f:debug_fun) = if !rw_debug then print (f() ^ "\n") else () fun readNode n = let open Set val answer = union (listUnion (make::(map (read o ASS) ((set o assignment_of) n))), listUnion (make::(map (read o TST) ((set o tests_of o dag_of) n)))) val foo = read_write_debug (fn () => ("readNode " ^ nodeToString n ^ "=>" ^ stringListString (map makestring (set answer)))) in answer end fun writeNode n = let open Set val answer = union (listUnion (make::(map (write o ASS) ((set o assignment_of) n))), listUnion (make::(map (write o TST) ((set o tests_of o dag_of) n)))) val foo = read_write_debug (fn () => ("writeNode " ^ nodeToString n ^ "=>" ^ stringListString (map makestring (set answer)))) in answer end fun no_write_conflict (ta, n) = let open Set in empty (intersect(writeNode n, (union(read ta, write ta)))) end fun no_read_conflict (ta, n) = let open Set in empty (intersect (write ta, readNode n)) end fun empty n = let open Set in (empty o assignment_of) n andalso (empty o tests_of o dag_of) n end fun replace_edge_node(N (n, a, d, p), nl) = N(n, a, replace_edge(d, nl), p) fun except_bogus nil = nil | except_bogus (h::t) = if Delay.is_bogus_i h then except_bogus t else h :: except_bogus t val num_ops_node = List.length o except_bogus o Set.set o assignment_of val num_tests_node = List.length o Set.set o tests_of o dag_of fun num_things_node n = (num_ops_node n) + (num_tests_node n) fun dead_debug (f:debug_fun) = if !dead_set_debug then print ("dead" ^ f() ^ "\n") else () exception DEAD fun dead(P:program, r:HM.reg, n:node, done: name Set.set) = let val foo = dead_debug (fn () => "(P, " ^ makestring r ^ ", " ^ nodeToString n ^ ")") val new_done = Set.add(done, name_of n) fun nfil(a, b) = if Set.member(new_done, a) then b else a::b fun drl nil = true | drl (h::t) = dead(P, r, h, new_done) andalso drl t fun ntn n = nameToNode (P, n) handle NAMETONODE => raise DEAD val next = fold nfil (Set.set (succ(P, n))) nil val answer = ( not (Set.member(readNode n, r)) andalso (Set.member(writeNode n, r) orelse drl (map ntn next)) ) val foo = dead_debug(fn () => "=>" ^ Bool.toString answer) in answer end fun deadset(P, rs, n) = let val foo = dead_debug (fn () => "deadset(" ^ stringListString (map makestring (Set.set rs)) ^ ",\n" ^ nodeToString n ^ ")") fun f nil = true | f (r::t) = dead(P, r, n, Set.make) andalso f t val answer = f (Set.set rs) val foo = dead_debug(fn () => "deadset=>" ^ Bool.toString answer ^ "\n") in answer end fun del_debug (f:debug_fun) = if !delete_debug then print ("delete:" ^ f() ^ "\n") else () exception DELETE exception DELETE_HD exception DELETE_WIERDSUCC fun delete (P as (ns, n0, F), n) = let val foo = cpsi("delete enter", P) val em = empty n val un = unreachable(P, n) fun ntn n = nameToNode(P, n) handle NAMETONODE => raise DELETE val p = Set.listToSetEQ(eqn, (map ntn (Set.set (pred(P, n))))) open Set val foo = del_debug (fn () => "delete( n=" ^ (name_of n) ^ "\n" ^ "em=" ^ (Bool.toString em) ^ "\n" ^ "un=" ^ (Bool.toString un) ^ "\n" ^ "p =" ^ (psl (map name_of (Set.set p))) ^ "\n" ^ ")") in if (em orelse un) andalso not (eqn(n, F)) then if not un then let val foo = del_debug (fn () => "complex deletion") val s0 = Set.set (succ(P, n)) val nprime = if List.length s0 = 1 then hd s0 else (print (Int.toString (List.length s0)); raise DELETE_WIERDSUCC) val new_nprime = rmPredNode(unionPredNode(ntn nprime, pred_of n), name_of n) fun ren x = replace_edge_node(x, [name_of n, name_of new_nprime]) val pprime = map ren (set p) fun updt(n, p) = updateNode(p, n) val Nprime = fold updt (new_nprime :: pprime) P val foo = del_debug (fn () => "nprime=" ^ nprime) val foo = del_debug (fn () => "pprime=" ^ (psl (map nodeToString pprime))) val answer = rmNode(Nprime, n) val foo = cpsi("delete leave cd", answer) in answer end else (del_debug (fn () => "simple_deletion"); let val s = Set.set(nameSetToNodeSet(P, (succ(P, n)))) fun updt(s, p) = updateNode(p, rmPredNode(s, name_of n)) val np = rmNode(fold updt s P, n) val foo = cpsi("delete leave sd", np) in np end) else (del_debug (fn () => "No deletion"); P) end handle Hd => raise DELETE_HD fun mop_debug (f:debug_fun) = if !move_op_debug then (dead_set_debug := true; print ("mop:" ^ f() ^ "\n")) else dead_set_debug := false fun can_move_op1(P as (ns, n0, F), x, move_set, m) = let open Set val foo = mop_debug (fn () => "can_move_op") val rok = HM.resources_ok(set (add(assignment_of m, x)), set ((tests_of o dag_of) m)) val foo = mop_debug(fn () => "1") val p = diff(nameSetToNodeSet(P, succ(P, m)), move_set) val foo = mop_debug(fn () => "2") val l = (write o ASS) x val foo = mop_debug(fn () => "3") fun dlpf nil = true | dlpf (pj::t) = deadset(P, l, pj) andalso dlpf t fun cond nil = true | cond (nj::t) = (not o eqn)(nj, F) andalso (* no_read_conflict(ASS x, nj) andalso *) (* change ex model so it can run on a sequential machine *) no_read_conflict(ASS x, m) andalso no_write_conflict(ASS x, m) andalso cond t val foo = mop_debug(fn () => "4") val answer = rok andalso cond (set move_set) andalso dlpf (set p) val foo = mop_debug (fn () => "can_move_op=>" ^ Bool.toString answer) in answer end fun can_move_op(P, x, move_set, m) = let open Set val ms = set move_set fun pf n = pred(P, n) val ps = set(listUnion (map pf ms)) fun all (x, b) = b andalso can_move_op1(P, x, move_set, m) in if List.length ps > 1 then if List.length ms > 1 then false else fold all ((set o assignment_of o hd) ms) true else can_move_op1(P, x, move_set, m) end fun move_op (P as (ns, n0, F), x, move_set, m) = let val foo = cpsi("move_op enter", P) val foo = mop_debug (fn () => "move_op(x=" ^ PrintAbs.str [x] ^ "move_set\n" ^ (stringListString (map nodeToString (Set.set move_set))) ^ "\nm=" ^ nodeToString m ^"\n)\n") in if not (can_move_op(P, x, move_set, m)) then P else let open Set exception NOTFOUND val primed_pairs = ref nil fun pnf nm = let fun f nil = let val nn = prime_name nm in (primed_pairs := (nm, nn) :: !primed_pairs; nn) end | f ((a, b)::t) = if nm = a then b else f t val answer = f (!primed_pairs) val foo = mop_debug (fn () => "pnf " ^ nm ^ "=>" ^ answer) in answer end val foo = mop_debug(fn () => "1") fun njp nil = nil | njp ((N(n, a, d, prd))::t) = N(pnf n, rm(a, x), d, listToSet [name_of m]) :: njp t fun ojp l = map (fn x => rmPredNode(x, name_of m)) l fun replist nil = nil | replist (h::t) = h :: pnf h :: replist t val rlist = replist (map name_of (set move_set)) val foo = mop_debug(fn () => "2") val mprime = let val aprime = add(assignment_of m, x) val dprime = replace_edge(dag_of m, rlist) in N(name_of m, aprime, dprime, pred_of m) end val foo = mop_debug(fn () => "3") val nj = njp(set move_set) val foo = mop_debug(fn () => "nj=" ^ stringListString (map name_of nj)) fun uptd(n, p) = updateNode(p, n) val np = fold uptd (mprime :: (ojp (set move_set))) P fun addnpi(n, p) = let val s = set (succNodes(p, n)) fun ap x = addPredNode(x, name_of n) fun updt(x, p) = updateNode(p, ap x) in fold updt s p end fun addn(n, p) = addnpi(n, addNode(p, n)) val nnp = fold addn nj np val foo = mop_debug(fn () => "4") val answer = nnp val foo = mop_debug(fn () => "5") val foo = cpsi("move_op leave", answer) in mop_debug(fn () => "6"); answer end end fun updt_sel (d, nsel) = let val tst = tests_of d val rt = root_of d val s = succ_of d in newdag(tst, nsel, rt, s) end fun mt_debug (f:debug_fun) = if !move_test_debug then print ("move_test" ^ f() ^ "\n") else () fun can_move_test(P as (ns, n0, F):program, x:test, n:node, m:node) = let val foo = cpsi("move_test enter", P) val foo = mt_debug (fn () => "can_move_test") val answer = no_write_conflict(TST x, m) andalso (* hack because sel can't distinguish xj *) not (Set.member(tests_of(dag_of m), x)) andalso HM.resources_ok(Set.set (assignment_of m), Set.set (Set.add((tests_of o dag_of) m, x))) val foo = mt_debug (fn () => "can_move_test=>" ^ Bool.toString answer) in answer end fun move_test (P as (ns, n0, F):program, x:test, n:node, m:node) = if not (can_move_test(P, x, n, m)) then P else let val foo = mt_debug (fn () => "move_test" ^ name_of n ^ " " ^ name_of m) open Set val d_n = dag_of n val sel_n = sel_of d_n val rt_n = root_of d_n val nt = let val newname = (new_name o name_of) n ^ "tt" fun nsel (z, b) = let val v = sel_n(z, b) in if toneq(v, TEST x) then sel_n(x, true) else v end val nC = if TEST x = rt_n then reach(updt_sel(d_n, nsel), sel_n(x, true)) else reach(updt_sel(d_n, nsel), rt_n) in N(newname, assignment_of n, nC, listToSet [name_of m]) end val foo = mt_debug (fn () => "got nt") val nf = let val newname = ((new_name o name_of) n) ^ "ff" fun nsel (z, b) = let val v = sel_n(z, b) in if toneq(v, TEST x) then sel_n(x, false) else v end val nC = if TEST x = rt_n then reach(updt_sel(d_n, nsel), sel_n(x, false)) else reach(updt_sel(d_n, nsel), rt_n) in N(newname, assignment_of n, nC, listToSet [name_of m]) end val foo = mt_debug (fn () => "got nf") val d_m = dag_of m val sel_m = sel_of d_m fun nton n = NAME( name_of n) fun nsel (z, b) = if teq(z, x) then if b then nton nt else nton nf else let val v = sel_m(z, b) in if toneq(v, NAME(name_of n)) then TEST x else v end val nb = add(tests_of d_m, x) val nh = add(add(rm(succ_of d_m, name_of n), name_of nt), name_of nf) fun new_rt (NAME rt) = TEST x | new_rt t = t val nc = newdag(nb, nsel, (new_rt o root_of) d_m, nh) val new_m = N(name_of m, assignment_of m, nc, pred_of m) fun updt_t s = addPredNode(s, name_of nt) fun updt_f s = addPredNode(s, name_of nf) val upt = map updt_t (set (nameSetToNodeSet(P, succ(P, nt)))) val upf = map updt_f (set (nameSetToNodeSet(P, succ(P, nf)))) fun updtl(n, p) = updateNode(p, n) val np = fold updtl ([rmPredNode(n, name_of m), new_m] @ upt @ upf) P val answer = np val foo = mt_debug (fn () => "mtst done") val foo = cpsi("move_test leave", answer) in answer end fun entries (P as (ns, n0, F)) = let val nl = Stringmap.extract ns fun f (a, b) = if unreachable(P, a) then a::b else b in n0 :: (fold f nl nil) end fun addPredInfo(P as (ns, n0, F)) = let fun rmpi n = setPredNode (n, Set.make) val nl = map rmpi (Stringmap.extract ns) fun updt(n, p) = updateNode(p, n) val np = fold updt nl P fun addpi (n, p) = let val s = Set.set (succNodes(p, n)) fun api(s, p) = updateNode(p, addPredNode(s, name_of n)) in fold api s p end in fold addpi nl np end fun cp_debug (f:debug_fun) = if !closure_progs_debug then print ("cp:" ^ f() ^ "\n") else () fun closure (P as (ns, n0, F), entry) = let open Set val foo = cp_debug (fn () => "closure:entry=" ^ name_of entry ^ "\nprogram=" ^ progToString P) val isin = Stringmap.isin fun dfs(p, parent, nil) = p | dfs(p as (ns, n0, F), parent, cur::todo) = if not (isin ns (name_of cur)) then let val np = dfs(addNode(p, cur), cur, set(succNodes(P, cur))) in dfs(np, parent, todo) end else dfs(p, parent, todo) val prog:program = (Stringmap.new(), entry, F) val answer = dfs(addNode(prog, entry), entry, set(succNodes(P, entry))) val foo = cp_debug (fn () => "\nclosure=>" ^ progToString answer) in answer end fun programs(P as (ns, n0, F):program) = let val foo = cp_debug (fn () => "programs") val l = entries (addPredInfo P) (* make sure preds are in closure*) fun cf e = addPredInfo(closure(P, e)) val answer = map cf l val foo = cp_debug (fn () => "programs done") in answer end structure ns = struct type obj = node fun int l = let val z = ord "0" fun f(n, nil) = n | f (n, d::l) = if d>="0" andalso d<="9" then f(n*10+ord(d)-z, l) else n in f(0,l) end fun gt (a, b) = let val a = explode(name_of a) val b = explode(name_of b) in (int a) > (int b) end end structure sortN = Sort(ns) val sortNodes = sortN.sort end structure Compress : sig val compress_debug : bool ref val compress : (int * Node.program) -> Node.program val move_things_node : Node.program * Ntypes.name * Ntypes.name Set.set -> Node.program val do_move_tests : bool ref val do_move_ops : bool ref val dbg_p : Node.program ref end = struct open Ntypes open Dag open Node val do_move_tests = ref false val do_move_ops = ref true exception COMPRESS fun error (s:string) = (print (s ^ "\n"); raise COMPRESS) val compress_debug = ref false val dbg_p = ref (makeProg()) type debug_fun = unit -> string fun debug (f:debug_fun) = if !compress_debug then print (f() ^ "\n") else () exception FILTERSUCC fun filterSucc(P, nm, fence_set) = let open Set val s = set(succ(P, nameToNode(P, nm))) handle NAMETONODE => raise FILTERSUCC fun f (nm, l) = if member(fence_set, nm) then l else nm::l in fold f s nil end (* val inP = ref false val finP = ref makeProg val foutP = ref makeProg fun chinP (p, from) = let val nm = "11_100'_110tt_119'" val prd = prednm(p, nm) val pe = Set.empty(prd) in if !inP then if pe then (foutP := p; error ("chinP gone -" ^ from)) else () else if pe then () else (inP := true; print ("chinP found it -" ^ from ^ "\n"); finP := p; nameToNode(p, nm); ()) end *) exception MOVETHINGSNODE fun move_things_node(P, nm, fence_set) = let open Set (* val foo = debug (fn () => "move_things_node(\n" ^ progToString P ^ ",\n" ^ nm ^ ", [" ^ fold (fn (a, b) => a ^ ", " ^ b) (set fence_set) "]" ^ ")") *) fun ntn (p, nm) = ((* chinP (p, "ntn");*) nameToNode (p, nm)) handle NAMETONODE => (dbg_p := P; raise MOVETHINGSNODE) fun s_nm_list p = filterSucc(p, nm, fence_set) fun nd nm = ntn(P, nm) handle MOVETHINGSNODE => error "nd nm" val au = listUnionEQ(aeq, map (assignment_of o nd) (s_nm_list P)) val tu = listUnionEQ(teq, map (tests_of o dag_of o nd) (s_nm_list P)) fun ms (p, a) = let fun f(nm, l) = ((*chinP (p, "ms"); *) if member(assignment_of(ntn(p, nm)), a) then nm::l else l ) handle MOVETHINGSNODE => (dbg_p := p; error "ms") in fold f (s_nm_list p) nil end fun move_a1(a, p) = let val msl = ms (p, a) val ms_set = nameSetToNodeSet(p, listToSet msl) fun dms(a, p) = delete(p, ntn(p, a)) fun mop() = let val foo = debug (fn () => "mop start " ^ nm) val new_p = move_op(p, a, ms_set, ntn(p, nm)) handle MOVETHINGSNODE => error "move_a move_op" val foo = debug (fn () => "mop end") in new_p end val mpa = mop() (* val foo = chinP(mpa, "a_move_a amop " ^ nm ^ StrPak.stringListString (map name_of (set ms_set))) *) val answer = fold dms msl mpa (* val foo = chinP(answer, "a_move_a adel") *) in answer end fun move_a(a, p) = if !do_move_ops then move_a1(a, p) else p fun tset (p, t) = let fun f(nm, l) = ((*chinP (p, "tset");*) if member(tests_of(dag_of(ntn(p, nm))), t) then nm::l else l ) handle MOVETHINGSNODE => error "tset" in fold f (s_nm_list p) nil end fun move_t1(t, p) = let val ts = tset (p, t) val answer = if List.length ts > 0 then move_test(p, t, (ntn(p, hd ts) handle MOVETHINGSNODE => error "move_t 1"), (ntn(p, nm) handle MOVETHINGSNODE => error "move_t 2")) else p (*val foo = chinP(answer, "a_move_t")*) in answer end fun move_t(t, p) = if !do_move_tests then move_t1(t, p) else p in debug (fn () => "movethingsnode " ^ nm ^ "\n"); fold move_t (set tu) (fold move_a (set au) P) end exception MOVETHINGSWINDOW fun move_things_window(P, w, nm, fence_set) = let open Set (* val foo = debug (fn () => "move_things_window(\n" ^ progToString P ^ ",\n" ^ (makestring w) ^ ", " ^ nm ^ ", [" ^ fold (fn (a, b) => a ^ ", " ^ b) (set fence_set) "]" ^ ")\n") *) fun ntn (P, nm) = (nameToNode (P, nm)) handle NAMETONODE => raise MOVETHINGSWINDOW val node = ntn(P, nm) val things = num_things_node node val s_nm_list = filterSucc(P, nm, fence_set) fun nxt(nm, p) = move_things_window(p, w - things, nm, fence_set) val child_p = if w > things then fold nxt s_nm_list P else P in debug (fn () => "movethingswindow " ^ nm ^ "\n"); move_things_node(child_p, nm, fence_set) end exception CPRESS exception CPRESS1 exception CPRESS2 exception CPRESS3 exception CPRESS4 exception CPRESS5 fun cpress(window, P, fence_set, everin_fence_set) = let open Set fun nxt(nm, p:program) = ((* dbg_p := p; *) move_things_window(p, window, nm, fence_set)) handle MOVETHINGSWINDOW => raise CPRESS1 val filled = fold nxt (set fence_set) P handle CPRESS1 => raise CPRESS2 fun succf nm = succ(filled, nameToNode(filled, nm)) handle NAMETONODE => raise CPRESS val nfence_set = listUnion(make::(map succf (set fence_set))) fun filt(a, l) = if member(everin_fence_set, a) then l else a::l val f_fence_set = listToSet(fold filt (set nfence_set) nil) val n_everin_fc = fold (fn (a, s) => add(s, a)) (set f_fence_set) everin_fence_set in debug (fn () => "cpress: fence_set=" ^ StrPak.stringListString (set fence_set) ^ "\n f_fence_set =" ^ StrPak.stringListString (set f_fence_set)); if not (empty f_fence_set) then cpress(window, filled, f_fence_set, n_everin_fc) handle CPRESS => raise CPRESS3 handle CPRESS1 => raise CPRESS4 handle CPRESS2 => raise CPRESS5 else filled end fun clean_up (P as (ns, n0, F):program) = let val foo = debug (fn () => "cleanup") val clos = closure(P, n0) val (ns, n0, F) = clos val l = (map name_of (Stringmap.extract ns)) fun f (n, p) = (debug (fn () => "cleanup deleting " ^ n); delete(p, nameToNode(p, n))) val answer = fold f l clos val foo = debug (fn () => "exiting cleanup") in answer end fun compress(window, P as (ns, n0, F)) = let open Set val fence = n0 val fence_set = add(make, name_of n0) val everin_fence_set = add(makeEQ(name_prefix_eq), name_of n0) val uc = cpress(window, P, fence_set, everin_fence_set) val cu = clean_up uc in debug (fn () => "compress"); cu end end structure ReadI : sig val readI : HM.operation list -> (HM.operation list * Node.program list) val writeI : (HM.operation list * Node.program list) -> HM.operation list val progMap : Node.program -> string val read_debug : bool ref val write_debug : bool ref val live_debug : bool ref end = struct val read_debug = ref false val write_debug = ref false val live_debug = ref false fun read_dbg f = if !read_debug then print ("readI.read:" ^ f() ^ "\n") else () fun write_dbg f = if !write_debug then print ("writeI.read:" ^ f() ^ "\n") else () fun write_dbg_s s = write_dbg (fn () => s) exception BTARGET fun btarget (nil, n) = (fn x => raise BTARGET) | btarget (h::t, n) = let open HM val rf = btarget(t, n + 1) fun g lbl x = if lbl = x then n else rf x fun f (TARGET(lbl, inst)) = (g lbl) | f _ = rf in f h end val programs = Node.programs exception BNODES fun buildNodes l = let open HM open Ntypes val t = btarget(l, 0) fun f (nil, n) = nil | f (ci::rest, n) = let open Dag open AbsMach val nm = makestring n val nxtnm = makestring (n + 1) fun asn i = Set.listToSetEQ(aeq, i) val edag = reach(Dag.make, NAME nxtnm) fun tgtnm tgt = makestring (t tgt) fun edagt tgt = reach(Dag.make, NAME (tgtnm tgt)) val finDag = reach(Dag.make, NAME (Node.name_of Node.fin)) fun cdag (tgt,tst) = attach(tst, edagt tgt, edag) val g = fn ASSIGNMENT i => Node.make(nm, asn [i], edag, Set.make) | NERGLE => Node.make(nm, asn [], edag, Set.make) | LABELREF (tgt, i as GETLAB{lab, dst}) => Node.make(nm, asn [GETLAB{lab=(t tgt, tgtnm tgt), dst=dst}], edag, Set.make) | COMPARISON (tgt, tst) => Node.make(nm, asn nil, cdag(tgt, tst), Set.make) | FLOW (tgt, i) => Node.make(nm, asn nil, edagt tgt, Set.make) | EXIT i => Node.make(nm, asn [i], finDag, Set.make) | TARGET (lbl, i) => Node.make(nm, asn nil, edag, Set.make) | _ => raise BNODES in (g ci)::Node.fin::(f (rest, n + 1)) end fun addn(n, p) = Node.addNode(p, n) val prog = fold addn (Node.fin :: f(l, 0)) (Node.makeProg()) in prog end exception READI exception READI_NTN fun readI ol = let open HM fun junkfil (JUNK a, (junk, other)) = (JUNK a :: junk, other) | junkfil (x, (junk, other)) = (junk, x::other) val cl = map HM.classify ol val (junk, other) = fold junkfil cl (nil, nil) fun ntn x = (Node.nameToNode x ) handle NAMETONODE => raise READI_NTN val (ns, foo, fin) = buildNodes other val nn = (ns, ntn((ns, foo, fin), "0"), fin) fun unjunk (JUNK i) = i | unjunk _ = raise READI val progs = programs nn val foo = read_dbg (fn () => ("progs =>" ^ (StrPak.stringListString (map Node.progToString progs)))) in (map unjunk junk, progs) end structure ps = struct open Ntypes type obj = Node.program fun int l = let val z = ord "0" fun f(n, nil) = n | f (n, d::l) = if d>="0" andalso d<="9" then f(n*10+ord(d)-z, l) else n in f(0,l) end fun gt((nsa, n0a, Fa), (nsb, n0b, Fb)) = let val a = explode (Node.name_of n0a) val b = explode (Node.name_of n0b) in (int a) > (int b) end end structure sortP = Sort (ps) fun live_dbg f = if !live_debug then print ("live:" ^ f() ^ "\n") else () fun build_live_tab(P as (ns, n0, F): Node.program) = let open Ntypes open Node open Set fun fil (a, b) = if a < 0 orelse Delay.is_bogus_reg (a, "") then b else add(b, a) fun fil_lset s = fold fil (set s) make val lt:(int set) Stringmap.stringmap = Stringmap.new() val finset = listToSet [0, 1, 2, 3, 4, 5] fun flive f n = if Stringmap.isin lt (name_of n) then Stringmap.map lt (name_of n) else f n fun dfs cur = let fun fl n = flive dfs n val nm = name_of cur val gen = (fil_lset o readNode) cur val kill = writeNode cur val foo = Stringmap.add lt (nm, gen) val children = succNodes(P, cur) val ch_live = if empty children then finset else listUnion (map fl (set children)) val live = union(diff(ch_live, kill), gen) val foo = Stringmap.rm lt nm val foo = Stringmap.add lt (nm, live) in live end in dfs n0; (fn nm => let val ans = Stringmap.map lt nm val foo = live_dbg (fn () => nm ^ "=>" ^ StrPak.stringListString (map makestring (set ans))) in ans end) end (* live is the union of live in successors *) fun branch_live (P, tab, nm) = let open Node val s = Set.set (succ(P, nameToNode(P, nm))) val l:int Set.set = Set.listUnion (map tab s) val foo = live_dbg (fn()=>("branch_live " ^ nm ^ " s=" ^ StrPak.stringListString s ^ " -> " ^ StrPak.stringListString (map makestring (Set.set l)))) in l end exception WRITEP exception WRITEP1 exception WRITEP_NTN fun writeP (entry_map, lbl_fun, P as (ns, n0, F):Node.program) = let open Ntypes open Node open Set open HM open AbsMach val foo = write_dbg(fn () => "program:" ^ progToString P) fun blblmap nil = (fn x => (print ("blblmap_" ^ x); raise WRITEP)) | blblmap (nm::t) = let val mp = blblmap t val mylab = lbl_fun() in (fn x => if x = nm then mylab else mp x) end val lblmap = blblmap(map name_of (Stringmap.extract ns)) val live_tab = build_live_tab P fun label_list nm = map (fn r => (r, "")) (set (live_tab nm)) fun br_list nm = map (fn r => (r, "")) (set (branch_live(P, live_tab, nm))) fun getlab (GETLAB{lab=(i,s), dst}) = GETLAB{lab=(entry_map s, "node" ^ s), dst=dst} | getlab _ = raise WRITEP1 fun dogetlabs (i as GETLAB _, l) = (getlab i) :: l | dogetlabs (i, l) = i :: l fun ubranch (frm, nm) = BRANCH{test=ieq, src1=(0, "zero"), src2=(0, "zero"), dst=(lblmap nm, "node" ^ nm), live=br_list frm} fun cbranch (BRANCH{test, src1, src2, dst, live}, frm, nm) = BRANCH{test=test, src1=src1, src2=src2, dst=(lblmap nm, "node" ^ nm), live=br_list frm} | cbranch _ = (print "cbranch"; raise Match) fun label nm = LABEL{lab=(lblmap nm, "node" ^ nm), live=label_list nm} fun entry_label nm = LABEL{lab=(entry_map nm, "entry"), live=label_list nm} fun f (done, lastnm, nm) = let val foo = write_dbg (fn () => "f (" ^ StrPak.stringListString (set done) ^ "," ^ nm ^ ")") in if nm = name_of F then (write_dbg_s "fin"; (done, [NOP])) else if member(done, nm) then (write_dbg_s "already"; (done, [NOP, ubranch(lastnm, nm)])) else let open Dag val foo = write_dbg_s "doing" val node = nameToNode(P, nm) handle NAMETONODE => raise WRITEP_NTN val needlabel = let val pd = set (pred (P, node)) val foo = write_dbg (fn () => ("needlabel pd=" ^ StrPak.stringListString pd)) fun f nil = false | f ((p::nil):Ntypes.name list) = let val pn = nameToNode(P, p:Ntypes.name) val foo = write_dbg (fn () => ("ndlbl: pn=" ^ nodeToString pn)) val d = dag_of pn val sel = sel_of d val rt = root_of d fun istst (TEST t) = (write_dbg_s "ist true\n"; true) | istst (NAME n) = (write_dbg_s "ist false\n"; false) | istst NEITHER = (write_dbg_s "ist false\n"; false) fun untst (TEST t) = t | untst _ = (print "needlabel1"; raise Match) fun unnm (NAME nm) = nm | unnm _ = (print "needlabel2"; raise Match) val foo = if istst rt then write_dbg (fn () => ("sel=" ^ unnm(sel(untst rt, true)) ^ "\n")) else () in istst rt andalso (sel(untst rt, true) = NAME nm) end | f (a::b::c) = true val answer = f pd val foo = write_dbg (fn () => ("needlabel=>" ^ Bool.toString answer)) in answer end val nodelabel = if needlabel then [label nm] else nil val nodeNOP = [NOP] val a = fold dogetlabs (set (assignment_of node)) nil val d = dag_of node val sel = sel_of d val rt = root_of d (* only works for <= 1 test *) fun dag_code NEITHER = (nil, nil) | dag_code (NAME n) = ([n], nil) | dag_code (TEST t) = let fun unnm (NAME x) = x | unnm _ = (print "dag_code"; raise Match) val t_n = unnm(sel(t, true)) val f_n = unnm(sel(t, false)) in ([f_n, t_n], [cbranch(t, nm, t_n)]) end val (nl, cd) = dag_code rt exception DFS_SURPRISE fun dfs (done, nil) = (write_dbg_s "dfs nil"; (done, nil)) | dfs (done, h::nil) = (write_dbg_s "dfs 1"; f(done, nm, h)) | dfs (done, h::nxt::nil) = let val foo = write_dbg_s "dfs 2" val (dn1, cd1) = f(done, nm, h) val (dn2, cd2) = if member(dn1, nxt) then (dn1, nil) else dfs(dn1, nxt::nil) val lbl = if nxt = name_of F orelse member(dn2, nxt) then [NOP] else [NOP, label nxt] in (dn2, cd1 @ lbl @ cd2) end | dfs _ = raise DFS_SURPRISE val (dn, dcd) = dfs(add(done, nm), nl) in (dn, NOP :: nodelabel @ a @ cd @ dcd) end end val (done, code) = f (Set.make, "badname", name_of n0) in (entry_label (name_of n0)) :: (label (name_of n0)) :: code end exception WRITEI fun progMap(p as (ns, n0, F)) = let val l = Node.sortNodes (Stringmap.extract ns) val outstr = ref "" fun pr s = outstr := !outstr ^ s fun ntn n = Node.nameToNode(p, n) val n0nm = Node.name_of n0 val nFnm = Node.name_of F fun f n = let val s = Set.set (Node.succ(p, n)) val nm = Node.name_of n val pre = if nm = n0nm then "->\t" else "\t" val post = if nm = nFnm then "\t->\n" else "\n" in pr (pre ^ Node.name_of n ^ "\t->\t" ^ StrPak.stringListString s ^ post) end in List.app f l; !outstr end fun writeI(j:AbsMach.opcode list, p:Node.program list) = let val labelid = ref 0 fun newlabel () = (labelid := !labelid + 1; !labelid - 1) fun bentrymap nil = (fn x => (print ("bentrymap_" ^ x); raise WRITEI)) | bentrymap ((ns, n0, F)::t) = let val mp = bentrymap t val mylab = newlabel() in (fn x => if x = Node.name_of n0 then mylab else mp x) end val entry_map = bentrymap p val sp = sortP.sort p fun wp p = writeP (entry_map, newlabel, p) fun f(a, b) = (wp a) @ b val i = fold f sp nil in i @ j end end signature SIMLABS = sig exception Data_dependency_checked exception End_of_Program exception Simulator_error_1 exception Simulator_error_2 exception illegal_branch_within_branchdelay exception illegal_jump_within_branchdelay exception illegal_operator_or_operand exception negative_label_offset exception no_address_in_register exception no_label_in_register exception no_memory_address_in_register exception runtime_error_in_labwords exception runtime_error_in_words_or_labwords exception type_mismatch_in_comparison exception wrong_label val breakptr : int -> unit val clock : int ref val d_m : int * int -> unit val d_ms : int list -> unit val d_pc : unit -> unit val d_r : unit -> unit val d_regs : int list -> unit val init : AbsMach.opcode list -> unit val mcell : int -> AbsMach.values val pc : unit -> AbsMach.opcode list val pinit : int * (AbsMach.arithop -> int) * int * AbsMach.opcode list -> unit val pptr : unit -> int val prun : unit -> unit val pstep : unit -> unit val regc : int -> AbsMach.values val run : unit -> unit val runcount : int ref val step : unit -> unit val vinit : int * AbsMach.opcode list -> unit val vpc : unit -> unit val vrun1 : unit -> unit val vrun2 : unit -> unit val vrun3 : unit -> unit val vstep1 : unit -> unit val vstep2 : unit -> unit val vstep3 : unit -> unit val Memory : (AbsMach.values array) ref end; structure SetEnv : SIMLABS= struct open AbsMach; val codes : (opcode list ref)=ref nil; val RegN=ref 0 and LabN=ref 0 and memorysize=ref 10000; (*RegN = (pointer to) number of registers needed; LabN = (pointer to) number of labels; memorysize=(pointer to) memory space size. *) val IP: (opcode list) ref =ref nil; val inivalue=(INT 0); (*IP = Program Pointer; inivalue = zero- initial value of memory and registers. *) val Reg=ref (array(0,inivalue)) and Memory=ref (array(0,inivalue)) and Lab_Array=ref (array(0, (0,IP) )); (*Reg = register array; Memory = memory cell array; Lab_Array = label-opcode list array. *) fun max(n1:int,n2:int)=if (n1>n2) then n1 else n2; (* hvnop tests whether the instruction is not a real machine instruction, but only useful in simulation. *) fun hvnop(LABEL{...})=true | hvnop(LABWORD{...})=true | hvnop(WORD{...})=true | hvnop(_)=false; (*count_number is used to take into account register references and label declarations, and change RegN or LabN. *) fun count_number(FETCH {ptr=(n1,_),dst=(n2,_),...})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(STORE {src=(n1,_),ptr=(n2,_),...})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(ARITHI {src1=(n1,_),dst=(n2,_),...})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(MOVE {src=(n1,_),dst=(n2,_)})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(BRANCH {src1=(n1,_),src2=(n2,_),...})= (RegN:=max((!RegN),max(n1,n2)) ) | count_number(GETLAB {dst=(n,_),...})= (RegN:=max((!RegN),n) ) | count_number(GETREAL {dst=(n,_),...})= (RegN:=max((!RegN),n) ) | count_number(ARITH{src1=(n1,_),src2=(n2,_),dst=(n3,_),...})= (RegN:=max((!RegN),max(n1,max(n2,n3)) ) ) | count_number(LABEL{...})= ( Ref.inc(LabN) ) | count_number(_)=(); (* scan is used to scan the opcode list for the first time, to determine the size of Reg and Lab_Array, i.e. number of registers and labels. *) fun scan(nil)=() | scan(h::t)=(count_number(h);scan(t)); (* setlabels is used to set the label array, of which each item is a pair (label, codep), codep points to the codes containing the LABEL statement and afterwards codes. *) fun setlabels(nil,_)= () | setlabels(codel as ((LABEL {lab=(l,_),...})::t),k)= (update((!Lab_Array),k,(l,ref codel)); setlabels(t,k+1) ) | setlabels(h::t,k)=setlabels(t,k) ; (* initializing the enviroment of the simulation. *) fun init(l)=(RegN:=0; LabN:=0; IP:=l; codes:=l; scan(!IP); Ref.inc(RegN); Reg:=array( (!RegN), inivalue ) ; Memory:=array( (!memorysize), inivalue ) ; Lab_Array:=array( (!LabN), (0,IP)); setlabels(!IP,0) ); exception wrong_label; exception runtime_error_in_labwords; exception runtime_error_in_words_or_labwords; exception negative_label_offset; exception no_label_in_register; exception illegal_operator_or_operand; exception type_mismatch_in_comparison ; exception no_address_in_register; exception no_memory_address_in_register; (* getresult gives the results of arithmtic operations *) fun getresult(iadd,INT (n1:int),INT (n2:int))=INT (n1+n2) | getresult(isub,INT (n1:int),INT (n2:int))=INT (n1-n2) | getresult(imul,INT (n1:int),INT (n2:int))=INT (n1*n2) | getresult(idiv,INT (n1:int),INT (n2:int))=INT (n1 div n2) | getresult(fadd,REAL (r1:real),REAL (r2:real))=REAL (r1+r2) | getresult(fsub,REAL (r1:real),REAL (r2:real))=REAL (r1-r2) | getresult(fmul,REAL (r1:real),REAL (r2:real))=REAL (r1*r2) | getresult(fdiv,REAL (r1:real),REAL (r2:real))=REAL (r1/r2) | getresult(iadd,INT (n1:int),LABVAL (l,k))=LABVAL (l,k+n1) | getresult(iadd,LABVAL (l,k),INT (n1:int))=LABVAL (l,k+n1) | getresult(isub,LABVAL (l,k),INT (n1:int))=LABVAL (l,k-n1) | getresult(orb,INT n1,INT n2)=INT (Bits.orb(n1,n2)) | getresult(andb,INT n1,INT n2)=INT (Bits.andb(n1,n2)) | getresult(xorb,INT n1,INT n2)=INT (Bits.xorb(n1,n2)) | getresult(rshift,INT n1,INT n2)=INT (Bits.rshift(n1,n2)) | getresult(lshift,INT n1,INT n2)=INT (Bits.lshift(n1,n2)) | getresult(real,INT n,_)=REAL (intToReal(n)) | getresult(floor,REAL r,_)=INT (Real.floor(r)) | (* getresult(logb,REAL r,_)=INT (System.Unsafe.Assembly.A.logb(r))| *) getresult(_)=raise illegal_operator_or_operand; (* compare gives the results of comparisons in BRANCH statement. *) fun compare(ilt,INT n1,INT n2)= (n1n2) | compare(ile,INT n1,INT n2)= (n1<=n2) | compare(ige,INT n1,INT n2)= (n1>=n2) | compare(ine,INT n1,INT n2)= (n1<>n2) | compare(flt,REAL r1,REAL r2)= (r1r2) | compare(fle,REAL r1,REAL r2)= (r1<=r2) | compare(fge,REAL r1,REAL r2)= (r1>=r2) | compare(fne,REAL r1,REAL r2)= (realNe(r1,r2)) | compare(inrange,INT a,INT b)= (a>=0) andalso (ab) | compare(inrange,REAL a,REAL b)= (a>=0.0) andalso (ab) | compare(_)=raise type_mismatch_in_comparison ; (* findjmp_place returns the pointer to the codes corresponding to the given label (the codes containing the LABEL statement itself). *) fun findjmp_place lab = let val ipp=ref (ref nil) and i=ref 0 and flag=ref true; val none=(while ( (!i < !LabN) andalso (!flag) ) do ( let val (l,p)=((!Lab_Array) sub (!i)) in if (l=lab) then (ipp:=p;flag:=false) else Ref.inc(i) end ) ) in if (!flag) then raise wrong_label else (!ipp) end; (* findjmp_word returns the content of the k th labword in a code stream. *) fun findjmp_word(k,ip)=if (k<0) then raise negative_label_offset else let fun f2(1,LABWORD{lab=(herepos,_)}::t) =herepos | f2(k,LABWORD{...}::t)=f2(k-1,t) | f2(_)=raise runtime_error_in_labwords ; in f2(k, (!ip) ) end; (* inst_word returns the content of the k'th word or labword in a code stream. *) fun inst_word(k,ip)=if (k<0) then raise negative_label_offset else let fun f(1,LABWORD{lab=(herepos,_)}::t) =LABVAL (herepos,0) | f(1,WORD{value=n}::t)=INT n | f(k,LABWORD{...}::t)=f(k-1,t) | f(k,WORD{...}::t)=f(k-1,t) | f(_)=raise runtime_error_in_words_or_labwords in f(k,(!ip)) end; (* execjmp changes IP, makes it point to the codes of the given label. *) fun execjmp(LABVAL (l,0))= (IP:= !(findjmp_place l) ) | execjmp(LABVAL (l,k))= (IP:= ! (findjmp_place (findjmp_word(k,findjmp_place(l) ) ) ) ) | execjmp(_) = raise no_label_in_register; (* addrplus returns the result of address+offset. *) fun addrplus(INT n,ofst)= n+ofst | addrplus(_,_)=raise no_memory_address_in_register; (* content gives the content of the fetched word. *) fun content(INT n,ofst)= (!Memory) sub (n+ofst) | content(LABVAL (l,k),ofst)=inst_word(k+ofst,findjmp_place(l)) | content(_,_)=raise no_address_in_register; (* exec executes the given instruction. *) fun exec(FETCH{immutable=_,offset=ofst,ptr=(p,_),dst=(d,_)})= update((!Reg),d,content((!Reg) sub p,ofst) ) | exec(STORE{offset=ofst,src=(s,_),ptr=(p,_)})= update((!Memory),addrplus((!Reg) sub p,ofst),(!Reg) sub s) | exec(GETLAB {lab=(l,_),dst=(d,_)})= update((!Reg),d,(LABVAL (l,0)) ) | exec(GETREAL {value=v,dst=(d,_)})= update((!Reg),d,(REAL (strToReal v))) | exec(MOVE{src=(s,_),dst=(d,_)})= update((!Reg),d, (!Reg) sub s ) | exec(LABEL {...})= () | exec(LABWORD {...}) = () | exec(WORD{...})= () | exec(JUMP {dst=(d,_),...})= execjmp((!Reg) sub d) | exec(ARITH {oper=opn,src1=(s1,_),src2=(s2,_),dst=(d,_)})= update((!Reg),d,getresult(opn,(!Reg) sub s1,(!Reg) sub s2) ) | exec(ARITHI {oper=opn,src1=(s1,_),src2=n1,dst=(d,_)})= update((!Reg),d,getresult(opn,(!Reg) sub s1,(INT n1) ) ) | exec(BRANCH{test=comp,src1=(s1,_),src2=(s2,_),dst=(labnum,_),...})= if compare(comp,(!Reg) sub s1,(!Reg) sub s2) then (IP:= !(findjmp_place(labnum) ) ) else () | exec(NOP)= () | exec(BOGUS _)= raise Match ; exception End_of_Program; fun step () =let val Instruction=(hd(!IP) handle Hd=> raise End_of_Program) in (IP:=tl(!IP) handle Tl=>raise End_of_Program; exec(Instruction) ) end; fun run () =(step();run() ) handle End_of_Program =>output(std_out,"End of program\n"); (* bms, ims, rms are simply abbreviations. *) val bms : bool -> string = Bool.toString and ims : int -> string = Int.toString and rms : real -> string = Real.toString (* dispv shows the content of a register, dispm shows the content of a memory word. *) fun dispv(n,INT k)=output(std_out,"Register "^ims(n)^": "^ "INT "^ims(k)^"\n") | dispv(n,REAL r)=output(std_out,"Register "^ims(n)^": "^ "REAL "^rms(r)^"\n") | dispv(n,LABVAL (l,0))=output(std_out, "Register "^ims(n)^": "^ "LABEL "^ims(l)^"\n") | dispv(n,LABVAL (l,k))=output(std_out, "Register "^ims(n)^": "^ "LABWORD "^ims(k)^" after"^ "LABEL "^ims(l)^"\n") ; fun dispm(n,INT k)=output(std_out,"Memory "^ims(n)^": "^ "INT "^ims(k)^"\n") | dispm(n,REAL r)=output(std_out,"Memory "^ims(n)^": "^ "REAL "^rms(r)^"\n") | dispm(n,LABVAL (l,0))=output(std_out, "Memory "^ims(n)^": "^ "LABEL "^ims(l)^"\n") | dispm(n,LABVAL (l,k))=output(std_out, "Memory "^ims(n)^": "^ "LABWORD "^ims(k)^" after"^ "LABEL "^ims(l)^"\n") ; (* oms and cms give the strings of the functions and comparisions. *) fun oms(iadd)="iadd" | oms(isub)="isub" | oms(imul)="imul" | oms(idiv)="idiv" | oms(fadd)="fadd" | oms(fsub)="fsub" | oms(fmul)="fmul" | oms(fdiv)="fdiv" | oms(real)="real" | oms(floor)="floor" | oms(logb)="logb" | oms(orb)="orb" | oms(andb)="andb" | oms(xorb)="xorb" | oms(rshift)="rshift" | oms(lshift)="lshift" ; fun cms(ilt)="ilt" | cms(igt)="igt" | cms(ieq)="ieq" | cms(ile)="ile" | cms(ige)="ige" | cms(ine)="ine" | cms(flt)="flt" | cms(fgt)="fgt" | cms(feq)="feq" | cms(fle)="fle" | cms(fge)="fge" | cms(fne)="fne" | cms(outofrange)="outofrange" | cms(inrange)="inrange" ; (* lms gives the string of the live register list. *) fun lms(nil)="" | lms((h,s)::nil)="("^ims(h)^","^s^")" | lms((h,s)::t)="("^ims(h)^","^s^"),"^lms(t); (* disp gives the string for the instruction. *) fun disp(FETCH{immutable=b,offset=ofst,ptr=(p,s1),dst=(d,s2)}) = "FETCH{immutable="^bms(b)^",offset="^ims(ofst) ^",ptr=("^ims(p)^","^s1 ^"),dst=("^ims(d)^","^s2^")}\n" | disp(STORE{offset=ofst,src=(s,s1),ptr=(p,s2)}) = "STORE{offset="^ims(ofst)^",src=("^ims(s)^","^s1^"),ptr=(" ^ims(p)^","^s2^")}\n" | disp(GETLAB{lab=(l,ls),dst=(d,ds)}) = "GETLAB{lab=("^ims(l)^","^ls^"),dst=("^ims(d)^","^ds^")}\n" | disp(GETREAL{value=r,dst=(d,ds)}) = "GETREAL{value="^r^",dst=("^ims(d)^","^ds^")}\n" | disp(ARITH{oper=opn,src1=(s1,ss1),src2=(s2,ss2),dst=(d,ds)})= "ARITH{oper="^oms(opn)^",src1=("^ims(s1)^","^ss1^"),src2=("^ims(s2) ^","^ss2^"),dst=("^ims(d)^","^ds^")}\n" | disp(ARITHI{oper=opn,src1=(s1,ss1),src2=n,dst=(d,ds)})= "ARITH{oper="^oms(opn)^",src1=("^ims(s1)^","^ss1^"),src2="^ims(n)^ ",dst=("^ims(d)^","^ds^")}\n" | disp(MOVE{src=(s,ss),dst=(d,ds)})= "MOVE{src=("^ims(s)^","^ss^"),dst=("^ims(d)^","^ds^")}\n" | disp(BRANCH{test=comp,src1=(s1,ss1),src2=(s2,ss2),dst=(labnum,ss3), live=lt})= "BRANCH{test="^cms(comp)^",src1=("^ims(s1)^","^ss1^"),src2=("^ims(s2) ^","^ss2^"),dst=("^ims(labnum)^","^ss3^"),live=["^lms(lt)^"]}\n" | disp(JUMP{dst=(d,ds),live=lt}) = "JUMP{dst=("^ims(d)^","^ds^"),live=["^lms(lt)^"]}\n" | disp(LABWORD{lab=(l,s)})="LABWORD{lab=("^ims(l)^","^s^")}\n" | disp(LABEL{lab=(l,s),live=lt})= "LABEL{lab=("^ims(l)^","^s^"),live=["^lms(lt)^"]}\n" | disp(WORD{value=n})="WORD{value="^ims(n)^"}\n" | disp(NOP)="NOP" | disp(BOGUS _) = raise Match ; fun d_pc () =output(std_out,disp(hd(!IP)) handle Hd=>"No More Instruction\n"); fun pc () = (!IP); fun pptr () =(List.length(!codes)-List.length(!IP))+1; fun breakptr k=let fun goon (LABEL {lab=(l,_),...})=(l<>k) | goon (_)=true in while goon(hd(!IP)) do step() end; fun regc n=((!Reg) sub n); fun d_r () =let val i=ref 0 in (while ( !i < !RegN) do (dispv((!i),(!Reg) sub (!i)); Ref.inc(i) ) ) end; fun d_regs (nil)=() | d_regs (h::t)=(dispv(h,(!Reg) sub h);d_regs(t)); fun mcell n=((!Memory) sub n); fun d_m (n,m)=let val i=ref n in while ( !i <=m) do (dispm(!i,(!Memory) sub !i); Ref.inc(i) ) end; fun d_ms nil =() | d_ms (h::t)=(dispm(h,(!Memory) sub h); d_ms(t) ); (* This part for the VLIW mode execution. *) val runcount=ref 0 and sizen=ref 0 and flag=ref true; exception Simulator_error_1; exception Simulator_error_2; exception Data_dependency_checked; (* member tests whether element a is in a list. *) fun member(a,nil)=false | member(a,h::t)=if (a=h) then true else member(a,t); (* hvcom tests whether the intersection of two list isnot nil. *) fun hvcom(nil,l)=false | hvcom(h::t,l)=member(h,l) orelse hvcom(t,l); (* gset returns the list of registers refered in a instruction. gwset returns the list of the register being written in a instruction. *) fun gset(FETCH{ptr=(p,_),dst=(d,_),...})=[p,d] | gset(STORE{src=(s,_),ptr=(p,_),...})=[s,p] | gset(GETLAB{dst=(d,_),...})=[d] | gset(GETREAL{dst=(d,_),...})=[d] | gset(ARITH{src1=(s1,_),src2=(s2,_),dst=(d,_),...})=[s1,s2,d] | gset(ARITHI{src1=(s1,_),dst=(d,_),...})=[s1,d] | gset(MOVE{src=(s,_),dst=(d,_)})=[s,d] | gset(BRANCH{src1=(s1,_),src2=(s2,_),...})=[s1,s2] | gset(JUMP{dst=(d,_),...})=[d] | gset(_)=nil ; fun gwset(FETCH{dst=(d,_),...})=[d] | gwset(GETLAB{dst=(d,_),...})=[d] | gwset(GETREAL{dst=(d,_),...})=[d] | gwset(ARITH{dst=(d,_),...})=[d] | gwset(ARITHI{dst=(d,_),...})=[d] | gwset(MOVE{dst=(d,_),...})=[d] | gwset(_)=nil ; (* fetchcode returns the instruction word which contains the next k instruction. fetchcode3 is used in version 3 of VLIW mode, in which case labels within instruction words are OK. *) fun fetchcode(0)=nil | fetchcode(k)=let val h=hd(!IP) in (IP:=tl(!IP); if hvnop(h) then (output(std_out, "Warning: labels within the instruction word\n"); fetchcode(k) ) else h::fetchcode(k-1) ) end handle Hd=>nil; fun fetchcode3(0)=nil | fetchcode3(k)=let val h=hd(!IP) in (IP:=tl(!IP); if hvnop(h) then fetchcode3(k) else h::fetchcode3(k-1) ) end handle Hd=>nil; (* allnop tests if all instructions left mean no operation. *) fun allnop(nil)=true | allnop(NOP::t)=allnop(t) | allnop(_)=false; (* nopcut cut the instruction stream in a way that the first half are all NOP instruction. *) fun nopcut(nil)=(nil,nil) | nopcut(NOP::t)=let val (l1,l2)=nopcut(t) in (NOP::l1,l2) end | nopcut(l)=(nil,l); (* cmdd tests the data dependency on memory cells and IP. *) fun cmdd(_,nil)=false | cmdd(wset,STORE{ptr=(p,_),offset=ofst,...}::t)= cmdd(addrplus((!Reg) sub p,ofst)::wset,t) | cmdd(wset,FETCH{ptr=(p,_),offset=ofst,...}::t)= member(addrplus((!Reg) sub p,ofst),wset) orelse cmdd(wset,t) | cmdd(wset,BRANCH{...}::t)=if allnop(t) then false else true | cmdd(wset,JUMP{...}::t)=if allnop(t) then false else true | cmdd(wset,h::t)=cmdd(wset,t); (* crdd test the data dependency on registers. *) fun crdd(_,nil)=false | crdd(wset,h::t)=if hvcom(gset(h),wset) then true else crdd(gwset(h)@wset,t) ; (* check_dd checks whether there is data dependency in instruction stream l. *) fun check_dd(l)= crdd(nil,l) orelse cmdd(nil,l); (* rddcut seperate the longest part of the instruction stream that have no data dependency on registers , from the left. *) fun rddcut(_,nil)= (nil,nil) | rddcut(wset,l as (h::t))= if hvcom(gset(h),wset) then (nil,l) else let val (l1,l2)=rddcut(gwset(h)@wset,t) in (h::l1,l2) end ; (* mddcut seperate the longest part of the instruction stream that have no data dependency on memory cells and IP, from the left. *) fun mddcut(_,nil)= (nil,nil) | mddcut(wset,(h as STORE{ptr=(p,_),offset=ofst,...})::t)= let val (l1,l2)=mddcut(addrplus((!Reg) sub p,ofst)::wset,t) in (h::l1,l2) end | mddcut(wset,(h as FETCH{ptr=(p,_),offset=ofst,...})::t)= if member(addrplus((!Reg) sub p,ofst),wset) then (nil,h::t) else let val (l1,l2)=mddcut(wset,t) in (h::l1,l2) end | mddcut(wset,(h as BRANCH{...})::t)= let val (l1,l2)=nopcut(t) in (h::l1,l2) end | mddcut(wset,(h as JUMP{...})::t)= let val (l1,l2)=nopcut(t) in (h::l1,l2) end | mddcut(wset,h::t)= let val (l1,l2)=mddcut(wset,t) in (h::l1,l2) end ; (* calcult returns the necessary value list corresponding to a instruction stream. And change the IP when necessary. *) fun calcult(nil)=nil | calcult(FETCH{ptr=(p,_),offset=ofst,...}::t)= content((!Reg) sub p,ofst)::calcult(t) | calcult(STORE{src=(s,_),...}::t)=((!Reg) sub s )::calcult(t) | calcult(MOVE{src=(s,_),...}::t)=((!Reg) sub s)::calcult(t) | calcult(ARITH{oper=opn,src1=(s1,_),src2=(s2,_),...}::t)= getresult(opn,(!Reg) sub s1,(!Reg) sub s2)::calcult(t) | calcult(ARITHI{oper=opn,src1=(s1,_),src2=n1,...}::t)= getresult(opn,(!Reg) sub s1,(INT n1))::calcult(t) | calcult(JUMP{dst=(d,_),...}::t)=((!Reg) sub d)::calcult(t) | calcult(h::t)=calcult(t); (* dowr does the actual writing operations. *) fun dowr(nil,nil)=() | dowr(nil,h::t)=raise Simulator_error_1 | dowr(FETCH{...}::t,nil)=raise Simulator_error_2 | dowr(STORE{...}::t,nil)=raise Simulator_error_2 | dowr(MOVE{...}::t,nil)=raise Simulator_error_2 | dowr(ARITH{...}::t,nil)=raise Simulator_error_2 | dowr(ARITHI{...}::t,nil)=raise Simulator_error_2 | dowr(JUMP{...}::t,nil)=raise Simulator_error_2 | dowr(FETCH{dst=(d,_),...}::t,vh::vt)=(update((!Reg),d,vh); dowr(t,vt) ) | dowr(STORE{ptr=(p,_),offset=ofst,...}::t,vh::vt)= (update((!Memory),addrplus((!Reg) sub p,ofst),vh); dowr(t,vt) ) | dowr(GETLAB{lab=(l,_),dst=(d,_)}::t,vt)= (update((!Reg),d,(LABVAL (l,0)) ); dowr(t,vt) ) | dowr(GETREAL{value=v,dst=(d,_)}::t,vt)= (update((!Reg),d,(REAL (strToReal v)) ); dowr(t,vt) ) | dowr(MOVE{dst=(d,_),...}::t,vh::vt)= (update((!Reg),d,vh); dowr(t,vt) ) | dowr(ARITH{dst=(d,_),...}::t,vh::vt)= (update((!Reg),d,vh); dowr(t,vt) ) | dowr(ARITHI{dst=(d,_),...}::t,vh::vt)= (update((!Reg),d,vh); dowr(t,vt) ) | dowr(JUMP{...}::t,vh::vt)= (execjmp(vh); flag:=false; dowr(t,vt) ) | dowr(BRANCH{test=comp,src1=(s1,_),src2=(s2,_), dst=(labnum,_),...}::t,vt)= if compare(comp,(!Reg) sub s1,(!Reg) sub s2) then (IP:= !(findjmp_place(labnum)); flag:=false; dowr(t,vt) ) else dowr(t,vt) | dowr(h::t,vt)=dowr(t,vt) ; (* vv3 executes an instruction word in version 3 mode. *) fun vv3(nil)= () | vv3(l)=let val (l1,l2)=rddcut(nil,l); val (l3,l4)=mddcut(nil,l1) in (flag:=true; dowr(l3,calcult(l3)); Ref.inc(runcount); if (!flag) then vv3(l4@l2) else () ) end; fun vinit(k,l)=(init(l); sizen:=k; runcount:=0 ) ; fun vstep1()=let val f=(while hvnop(hd(!IP)) do IP:=tl(!IP)) handle Hd=>raise End_of_Program; val codel=fetchcode(!sizen) in (dowr(codel,calcult(codel)); Ref.inc(runcount) ) end; fun vstep2()=let val f=(while hvnop(hd(!IP)) do IP:=tl(!IP)) handle Hd=>raise End_of_Program; val codel=fetchcode(!sizen) in if check_dd(codel) then (output(std_out,"Data dependency checked in:\n"); let fun f(nil)=() | f(h::t)=(output(std_out,":"^disp(h)); f(t)) in f(codel) end; raise Data_dependency_checked ) else (dowr(codel,calcult(codel)); Ref.inc(runcount) ) end; fun vstep3()=let val f=if (!IP)=nil then raise End_of_Program else (); val codel=fetchcode3(!sizen) in vv3(codel) end; fun vrun1()=(vstep1();vrun1()) handle End_of_Program => output(std_out,"End of program.\nTotal runtime: " ^ims(!runcount)^" steps.\n"); fun vrun2()=(vstep2(); vrun2()) handle End_of_Program => output(std_out,"End of program.\nTotal runtime: " ^ims(!runcount)^" steps.\n")| Data_dependency_checked=> output(std_out,"Program halted.\n") ; fun vrun3()=(vstep3(); vrun3()) handle End_of_Program => output(std_out,"End of program.\nTotal runtime: " ^ims(!runcount)^" substeps.\n"); fun vpc()=let val codel=(!IP) ; fun f (_,nil)=() | f (0,_)= () | f (k,h::l)=if k<=0 then () else (output(std_out,disp(h) ); if hvnop(h) then f(k,l) else f(k-1,l) ) in f((!sizen),codel) end; (* This part for Pipeline mode *) exception illegal_jump_within_branchdelay; exception illegal_branch_within_branchdelay; exception illegal_label_within_branchdelay; exception illegal_labword_within_branchdelay; exception illegal_word_within_branchdelay; (* Rdelay points to the timing array of registers. *) val Rdelay=ref ( array(0,0) ); (* clock records run time. withindelay is a flag used in BRANCH and JUMP delays. *) val clock=ref 0 and withindelay=ref false; val fdelay=ref 1 and ardelay: ((arithop->int) ref)=ref (fn k=>1) and jdelay=ref 1; (* pexec executes one instruction, increasing the clock when necessary, which corresponding to the holding down of instruction streams. *) fun pexec(FETCH{immutable=_,offset=ofst,ptr=(p,_),dst=(d,_)})= (let val t=(!Rdelay) sub p in if (!clock) (i:=(!jdelay) ) ; (IP:=tl(!IP)) handle Tl=>() ) end; execjmp((!Reg) sub d) ) | pexec(BRANCH{test=comp,src1=(s1,_),src2=(s2,_),dst=(labnum,_),...})= if (!withindelay) then raise illegal_branch_within_branchdelay else (let val t1=((!Rdelay) sub s1) and t2=((!Rdelay) sub s2); val t=Int.max(t1,t2) in if (!clock) (i:=(!jdelay) ) ; (IP:=tl(!IP)) handle Tl=>() ) end; if compare(comp,(!Reg) sub s1,(!Reg) sub s2) then (IP:= !(findjmp_place(labnum) ) ) else () ) | pexec(NOP)=Ref.inc(clock) | pexec(LABEL{...})=if (!withindelay) then raise illegal_label_within_branchdelay else () | pexec(LABWORD{...})=if (!withindelay) then raise illegal_labword_within_branchdelay else () | pexec(WORD{...})=if (!withindelay) then raise illegal_word_within_branchdelay else () ; fun pinit(fetchdelay,arithdelay,jumpdelay,l)= (init(l); Rdelay:=array((!RegN),0); clock:=0; fdelay:=fetchdelay; ardelay:=arithdelay; jdelay:=jumpdelay ); fun pstep()= let val Instruction=(hd(!IP) handle Hd=>raise End_of_Program) in (IP:=tl(!IP) handle Tl=>raise End_of_Program; withindelay:=false; pexec(Instruction) ) end; fun prun()=(pstep(); prun() ) handle End_of_Program=> (output(std_out,"End of program.\n"); output(std_out,"Total time used: "^ims(!clock)^" cycles.\n") ); end; structure SimStuff = struct fun read file = let val if1 = (open_in "simprelude.s") val if2 = (open_in file) val if3 = (open_in "simpostlude.s") val prelude = ReadAbs.read if1 val prog = ReadAbs.read if2 val postlude = ReadAbs.read if3 in close_in if1; close_in if2; close_in if3; prelude @ prog @ postlude end fun init file = SetEnv.init (read file) val runcount = ref 0 fun run ()= let open AbsMach val foo = runcount := 0 fun updc NOP = runcount := !runcount + 1 | updc _ = () open SetEnv fun f () = (step(); (updc o hd o pc)(); f()) in f() end fun srun () = let open SetEnv in d_pc(); step(); srun() end; fun memsave () = !SetEnv.Memory fun memcmp(a:AbsMach.values array, b:AbsMach.values array) = let open AbsMach fun cmp (INT a, INT b) = a = b | cmp (REAL a, REAL b) = realEq(a, b) | cmp (LABVAL _, LABVAL _) = true | cmp _ = false fun f 0 = ~1 | f n = if cmp((a sub n), (b sub n)) then f (n - 1) else n val al = Array.length a val bl = Array.length b in if al = bl then f (al - 1) else (print "size\n"; 0) end fun copyarray a = let val la = Array.length a val na = array(la, a sub 0) fun f n = if n > 0 then (update(na, n, a sub n) ; f (n - 1)) else () val foo = f (la - 1) in na end exception PROG_NO_END local open AbsMach in fun vstring (INT i) = "INT " ^ makestring i | vstring (REAL i) = "REAL " ^ Real.toString i | vstring (LABVAL(i, j)) = "LABVAL(" ^ makestring i ^ ", " ^ makestring j ^ ")" end fun runf f = ((init f; run (); raise PROG_NO_END)) handle End_of_Program => (print "eop\n"; SetEnv.regc 4) fun cmprog(f1, f2) = let open AbsMach fun intof (INT i) = i fun ptsat p = SetEnv.mcell (intof p) val p1 = runf f1 (* val foo = print ("cmprog1:" ^ vstring p1 ^ "\n") *) val v1 = ptsat p1 val r1 = !runcount val p2 = runf f2 (* val foo = print ("cmprog2:" ^ vstring p2 ^ "\n") *) val v2 = ptsat p2 val r2 = !runcount in (f1 ^ " ct " ^ makestring r1 ^ " ptr " ^ vstring p1 ^ " val " ^ vstring v1 ^ f2 ^ " ct " ^ makestring r2 ^ " ptr " ^ vstring p2 ^ " val " ^ vstring v2 ^ "\n") end end fun time str f = let (* open System.Timer val s = start_timer() *) val v = f() (* val e = check_timer s val foo = print (str ^ " took " ^ makestring e ^ "sec.usec\n") *) in v end fun writeprog(file, j, p) = let val ot = (open_out file) val prog = ReadI.writeI(j, p) val filp = (Delay.rm_bogus o OutFilter.remnops) prog val xxx = PrintAbs.show ot filp in close_out ot end; fun wp(file, prog) = let val ot = (open_out file) val filp = Delay.rm_bogus prog val xxx = PrintAbs.show ot filp in close_out ot end; fun dodelay i = (Delay.init i; Delay.add_delay i); val _ = ( Node.move_test_debug := false; Node.move_op_debug := false; Node.rw_debug := false; Node.delete_debug := false; Node.ntn_debug := true; Node.prog_node_debug := false; Node.prog_node_debug_verbose := false; Node.closure_progs_debug := false; Node.cpsiCheck := false; Compress.compress_debug := false; ReadI.read_debug := false; ReadI.write_debug := false; ReadI.live_debug := false ) fun pm pl = print (StrPak.stringListString (map ReadI.progMap pl)); fun pp pl = print (StrPak.stringListString (map PrintAbs.str pl)); fun ndnm nil = raise Node.NAMETONODE | ndnm(h::t) = (fn (nm) => Node.nameToNode(h, nm) handle Node.NAMETONODE => ndnm t nm); exception ERROR; fun err (s:string) = (print s; raise ERROR); fun pmem nil = (err "oh well") | pmem ((ns, n0, f)::t) = fn n => if Set.member(ns, n) then (ns, n0, f) else pmem t n; structure Main = struct fun doitx (ifile:string, ofile:string, c_ofile:string, ws:int) = let val foo = Ntypes.init_names() val ins = open_in ifile val i = (dodelay o BreakInst.breaki o ReadAbs.read) ins val _ = close_in ins val (j, p) = time "Building Nodes" (fn () => ReadI.readI i) val x = time "writing unopt" (fn () => writeprog(ofile, j, p)) fun cwin p = Compress.compress(ws, p) val cp = time "compressing program" (fn () => map cwin p) val xx = time "writing opt program" (fn () => writeprog(c_ofile, j, cp)) val answer = "" (* SimStuff.cmprog(ofile, c_ofile) *) val code_motions = Ntypes.new_name "0" in print (answer ^ "code_motions " ^ code_motions ^ " \n") end fun main(s:string list, env:string list) = let val idemp = ref 0 val ws = ref 0 val ifile = ref "/dev/null" val ofile = ref "/dev/null" val c_ofile = ref "/dev/null" val gotifile = ref false val gotofile = ref false fun digit d = if ord d >= ord "0" andalso ord d <= ord "9" then ord d - ord "0" else err ("expected digit. got " ^ d) val parse = fn ("-" :: "i" :: "d" :: "e" :: "m" :: d :: nil) => idemp := digit d | ("-" :: "w" :: "s" :: d :: nil) => ws := digit d | ("-" :: t) => (print ("usage: comp [-ws#] [-idem#]" ^ "input_file temp_file compressed_file\n"); print ("ws is the window size\nidem is the idempotency\n"); err "exiting") | s => if !gotofile then c_ofile := implode s else if !gotifile then (gotofile := true; ofile := implode s) else (gotifile := true; ifile := implode s) val foo = List.app (parse o explode) (tl s) val foo = print ("compressing " ^ !ifile ^ " into (uncompressed)" ^ !ofile ^ " and (compressed)" ^ !c_ofile ^ " with idempotency " ^ makestring (!idemp) ^ " and window size " ^ makestring (!ws) ^ "\n") in Delay.idempotency := !idemp; doitx(!ifile, !ofile, !c_ofile, !ws) end val s = OS.FileSys.getDir() fun doit() = main(["foobar", "-ws9", s^"/DATA/ndotprod.s", s^"/DATA/tmp.s", s^"/DATA/cmp.s"], nil) fun testit _ = () end structure Main : BMARK = struct open Main val doit = fn n => let fun loop n = if n = 0 then () else (doit(); loop(n-1)) in loop n end end mlton-20100608/benchmark/tests/wc-input1.sml0000644000076600000240000000213011404435630017213 0ustar mtfstaff(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct fun doit n = let open TextIO val f = OS.FileSys.tmpName () val out = openOut f val _ = output (out, String.implode (List.tabulate (1000000, fn i => if i mod 10 = 0 then #"\n" else #"a"))) val _ = closeOut out fun wc f = let val ins = openIn f fun loop (i: int): int = case input1 ins of NONE => i | SOME c => loop (if c = #"\n" then i + 1 else i) val n = loop 0 val _ = if n <> 100000 then raise Fail "bug" else () val _ = closeIn ins in n end val rec loop = fn 0 => () | n => (wc f; loop (n - 1)) val _ = loop n val _ = OS.FileSys.remove f in () end end mlton-20100608/benchmark/tests/wc-scanStream.sml0000644000076600000240000000257211404435630020105 0ustar mtfstaff(* Written by Stephen Weeks (sweeks@sweeks.com). *) structure Main = struct fun doit n = let open TextIO val f = OS.FileSys.tmpName () val out = openOut f val _ = output (out, String.implode (List.tabulate (1000000, fn i => if i mod 10 = 0 then #"\n" else #"a"))) val _ = closeOut out fun wc f = let val ins = openIn f in TextIO.scanStream (fn reader => fn s => let fun loop (s, ns) = case reader s of NONE => (closeIn ins ; if ns <> 100000 then raise Fail "bug" else () ; NONE) | SOME (c, s') => loop (s', if c = #"\n" then ns + 1 else ns) in loop (s, 0) end) ins end val rec loop = fn 0 => () | n => (wc f; loop (n - 1)) val _ = loop n val _ = OS.FileSys.remove f in () end end mlton-20100608/benchmark/tests/zebra.sml0000644000076600000240000002247011404435630016500 0ustar mtfstaff(* Copyright Stephen Weeks (sweeks@sweeks.com). 1999-6-21. * * This code solves the following "zebra" puzzle, and prints the solution. * There are 120^5 ~= 24 billion possibilities, so exhaustive search should * work fine, but I decided to write something that was a bit more clever. * It took me longer to write (2.5 hours) than to write exhaustive search, but * it runs fast (0.06 seconds on my 400MhZ P6). The code only needs to explore * 3342 posibilites to solve the puzzle. * * Here is the puzzle. * * This word problem has 25 variables and 24 are given values. You must * solve * the 25th. * * The trick is HOW? * * If you look at the problem mathematically, no sweat. If you get lost * in the * English, you are dead. * * You will know you are right by checking the answer with all the * conditions. * * Less than 1 percent of the population can solve this problem. * * The question is: Based on the following clues, who owns the zebra? * * **There are five houses. * * **Each house has its own unique color. * * **All house owners are of different nationalities. * * **They all have different pets. * * **They all drink different drinks. * * **They all smoke different cigarettes. * * **The Englishman lives in the red house. * * **The Swede has a dog. * * **The Dane drinks tea. * * **The green house is adjacent to the white house on the left. * * **In the green house they drink coffee. * * **The man who smokes Pall Malls has birds. * * **In the yellow house they smoke Dunhills. * * **In the middle house they drink milk. * * **The Norwegian lives in the first house. * * **The man who smokes Blends lives in a house next to the house with * cats. * * **In a house next to the house where they have a horse, they smoke * Dunhills. * * **The man who smokes Blue Masters drinks beer. * * **The German smokes Princes. * * **The Norwegian lives next to the blue house. * * **They drink water in a house next to the house where they smoke * Blends. * * Who owns the zebra? *) fun peek (l, p) = List.find p l fun map (l, f) = List.map f l fun fold (l, b, f) = List.foldl f b l datatype cigarette = Blend | BlueMaster | Dunhill | PallMall | Prince val cigaretteToString = fn Blend => "Blend" | BlueMaster => "BlueMaster" | Dunhill => "Dunhill" | PallMall => "PallMall" | Prince => "Prince" datatype color = Blue | Green | Red | White | Yellow val colorToString = fn Blue => "Blue" | Green => "Green" | Red => "Red" | White => "White" | Yellow => "Yellow" datatype drink = Beer | Coffee | Milk | Tea | Water val drinkToString = fn Beer => "Beer" | Coffee => "Coffee" | Milk => "Milk" | Tea => "Tea" | Water => "Water" datatype nationality = Dane | English | German | Norwegian | Swede val nationalityToString = fn Dane => "Dane" | English => "English" | German => "German" | Norwegian => "Norwegian" | Swede => "Swede" datatype pet = Bird | Cat | Dog | Horse | Zebra val petToString = fn Bird => "Bird" | Cat => "Cat" | Dog => "Dog" | Horse => "Horse" | Zebra => "Zebra" type pos = int val poss = [1, 2, 3, 4, 5] val first = SOME 1 val middle = SOME 3 type 'a attribute = {poss: pos list, unknown: 'a list, known: (pos * 'a) list} exception Done fun 'a fluidLet (r: 'a ref, x: 'a, f: unit -> 'b): 'b = let val old = !r in r := x ; (f () before r := old) handle Done => raise Done | e => (r := old; raise e) end fun search () = let fun init (unknown: 'a list): 'a attribute ref = ref {poss = poss, unknown = unknown, known = []} val cigarettes = init [Blend, BlueMaster, Dunhill, PallMall, Prince] val colors = init [Blue, Green, Red, White, Yellow] val drinks = init [Beer, Coffee, Milk, Tea, Water] val nationalities = init [Dane, English, German, Norwegian, Swede] val pets = init [Bird, Cat, Dog, Horse, Zebra] fun ''a find (r: ''a attribute ref) (x: ''a): pos option = Option.map #1 (peek (#known (!r), fn (_, y) => x = y)) val smoke = find cigarettes val color = find colors val drink = find drinks val nat = find nationalities val pet = find pets fun display () = let fun loop (r: 'a attribute ref, toString) = (List.app (fn i => let val x = #2 (valOf (peek (#known (!r), fn (j, _) => i = j))) val s = toString x in print s ; print (CharVector.tabulate (12 - size s, fn _ => #" ")) end) poss ; print "\n") in loop (cigarettes, cigaretteToString) ; loop (colors, colorToString) ; loop (drinks, drinkToString) ; loop (nationalities, nationalityToString) ; loop (pets, petToString) end fun make f = fn (SOME x, SOME y) => f (x, y) | _ => true val same = make (op =) val adjacent = make (fn (x, y) => x = y - 1 orelse y = x - 1) val left = make (fn (x, y) => x = y - 1) val num = ref 0 fun isConsistent (): bool = (num := !num + 1 ; same (nat English, color Red) andalso same (nat Swede, pet Dog) andalso same (nat Dane, drink Tea) andalso left (color Green, color White) andalso same (color Green, drink Coffee) andalso same (smoke PallMall, pet Bird) andalso same (color Yellow, smoke Dunhill) andalso same (middle, drink Milk) andalso same (nat Norwegian, first) andalso adjacent (smoke Blend, pet Cat) andalso adjacent (pet Horse, smoke Dunhill) andalso same (drink Beer, smoke BlueMaster) andalso same (nat German, smoke Prince) andalso adjacent (nat Norwegian, color Blue) andalso adjacent (drink Water, smoke Blend) ) fun tryEach (l, f) = let fun loop (l, ac) = case l of [] => () | x :: l => (f (x, l @ ac); loop (l, x :: ac)) in loop (l, []) end fun try (r: 'a attribute ref, f: unit -> (('a attribute -> unit) * ( unit -> unit))) = let val {poss, unknown, known} = !r in case unknown of [] => () | _ => tryEach (unknown, fn (x, unknown) => let val (each, done) = f () in tryEach (poss, fn (p, poss) => let val attr = {known = (p, x) :: known, unknown = unknown, poss = poss} in fluidLet (r, attr, fn () => if isConsistent () then each attr else ()) end) ; done () end) end (* loop takes the current state and either * - terminates in the same state if there is no consistent extension * - raises Done with the state set at the consistent extension *) exception Inconsistent exception Continue of unit -> unit fun loop (): unit = let fun test r = try (r, fn () => let datatype 'a attrs = None | One of 'a | Many val attrs = ref None fun each a = case !attrs of None => attrs := One a | One _ => attrs := Many | Many => () fun done () = case !attrs of None => raise Inconsistent | One a => raise (Continue (fn () => fluidLet (r, a, loop))) | Many => () in (each, done) end) fun explore r = try (r, fn () => let fun each _ = loop () fun done () = raise Inconsistent in (each, done) end) in (test cigarettes ; test colors ; test drinks ; test nationalities ; test pets ; explore cigarettes ; explore colors ; explore drinks ; explore nationalities ; explore pets ; raise Done) handle Inconsistent => () | Continue f => f () end val _ = loop () handle Done => () val _ = if 3342 = !num then () else raise Fail "bug" (* val _ = display () *) in () end structure Main = struct fun doit n = let fun loop n = if n < 0 then () else (search () ; loop (n - 1)) in loop (n * 1000) end end mlton-20100608/benchmark/tests/zern.sml0000644000076600000240000004770311404435630016361 0ustar mtfstaff(* * From David McClain's language study. * http://www.azstarnet.com/~dmcclain/LanguageStudy.html * * Stephen Weeks replaced Unsafe.Real64Array with Real64Array. *) fun print _ = () (* array2.sml * * COPYRIGHT (c) 1998 D.McClain/MCFA * COPYRIGHT (c) 1997 AT&T Research. *) structure FastRealArray2 : sig type array type region = {base : array, row : int, col : int, nrows : int option, ncols : int option} datatype traversal = RowMajor | ColMajor val array : int * int * real -> array val fromList : real list list -> array val tabulate : traversal -> (int * int * (int * int -> real)) -> array val sub : array * int * int -> real val update : array * int * int * real -> unit val dimensions : array -> int * int val size : array -> int val nCols : array -> int val nRows : array -> int val row : array * int -> real Vector.vector val column : array * int -> real Vector.vector val copy : region * array * int * int -> unit val appi : traversal -> (int * int * real -> unit) -> region -> unit val app : traversal -> (real -> unit) -> array -> unit val modifyi : traversal -> (int * int * real -> real) -> region -> unit val modify : traversal -> (real -> real) -> array -> unit val foldi : traversal -> (int*int*real*'a -> 'a) -> 'a -> region -> 'a val fold : traversal -> (real * 'a -> 'a) -> 'a -> array -> 'a val rmSub : array * int -> real val rmUpdate : array * int * real -> unit val unop : array * array * (real -> real) -> unit val unopi : array * array * (real * int -> real) -> unit val binop : array * array * array * (real * real -> real) -> unit val binopi : array * array * array * (real * real * int -> real) -> unit val fill : array * real -> unit val fillf : array * (int -> real) -> unit val transpose : array -> array val extract : region -> array (* val shift : array * int * int -> array *) end = struct structure A = (*Unsafe.*)Real64Array type rawArray = A.array val unsafeUpdate = A.update val unsafeSub = A.sub fun mkRawArray n = A.array (n, 0.0) type array = {data : rawArray, nrows : int, ncols : int, nelts : int} type region = {base : array, row : int, col : int, nrows : int option, ncols : int option} datatype traversal = RowMajor | ColMajor fun dotimes n f = let (* going forward is twice as fast as backward! *) fun iter k = if k >= n then () else (f(k); iter(k+1)) in iter 0 end fun mkArray(n,v) = let val arr = mkRawArray n in dotimes n (fn ix => unsafeUpdate(arr,ix,v)); arr end (* compute the index of an array element *) fun ltu(i,limit) = (i >= 0) andalso (i < limit) fun unsafeIndex ({nrows, ncols, ...} : array, i, j) = (i*ncols + j) fun index (arr, i, j) = if (ltu(i, #nrows arr) andalso ltu(j, #ncols arr)) then unsafeIndex (arr, i, j) else raise General.Subscript (* row major index checking *) fun rmIndex ({nelts,...}: array, ix) = if ltu(ix, nelts) then ix else raise General.Subscript val max_length = 4096 * 4096; (* arbitrary - but this is 128 MB *) fun chkSize (nrows, ncols) = if (nrows <= 0) orelse (ncols <= 0) then raise General.Size else let val n = nrows*ncols handle Overflow => raise General.Size in if (max_length < n) then raise General.Size else n end fun array (nrows, ncols, v) = let val nelts = chkSize (nrows, ncols) in {data = mkArray (nelts, v), nrows = nrows, ncols = ncols, nelts = nelts} end fun fromList [] = raise General.Size | fromList (row1 :: rest) = let val ncols = List.length row1 fun chk ([], nrows, l) = (nrows, l) | chk (row::rest, nrows, l) = let fun chkRow ([], n, revCol) = ( if (n <> ncols) then raise General.Size else (); List.revAppend (revCol, l)) | chkRow (x::r, n, revCol) = chkRow (r, n+1, x::revCol) in chk (rest, nrows+1, chkRow(row, 0, [])) end val (nrows, flatList) = chk (rest, 1, []) val nelts = chkSize(nrows, ncols) val arr = mkRawArray nelts fun upd(_,nil) = arr | upd(k,v::vs) = (unsafeUpdate(arr,k,v); upd(k+1,vs)) in { data = upd(0,List.@(row1, flatList)), nrows = nrows, ncols = ncols, nelts = nelts } end fun tabulateRM (nrows, ncols, f) = let val nelts = chkSize(nrows, ncols) val arr = mkRawArray nelts fun lp1 (i, j, k) = if (i < nrows) then lp2 (i, 0, k) else () and lp2 (i, j, k) = if (j < ncols) then ( unsafeUpdate(arr, k, f(i, j)); lp2 (i, j+1, k+1)) else lp1 (i+1, 0, k) in lp2 (0, 0, 0); {data = arr, nrows = nrows, ncols = ncols, nelts = nelts} end fun tabulateCM (nrows, ncols, f) = let val nelts = chkSize(nrows,ncols) val arr = mkRawArray nelts val delta = nelts - 1 fun lp1 (i, j, k) = if (j < ncols) then lp2 (0, j, k) else () and lp2 (i, j, k) = if (i < nrows) then ( unsafeUpdate(arr, k, f(i, j)); lp2 (i+1, j, k+ncols)) else lp1 (0, j+1, k-delta) in lp2 (0, 0, 0); {data = arr, nrows = nrows, ncols = ncols, nelts = nelts} end fun tabulate RowMajor = tabulateRM | tabulate ColMajor = tabulateCM fun sub (a, i, j) = unsafeSub(#data a, index(a, i, j)) fun update (a, i, j, v) = unsafeUpdate(#data a, index(a, i, j), v) fun dimensions ({nrows, ncols, ...}: array) = (nrows, ncols) fun size ({nelts,...}: array) = nelts fun nCols (arr : array) = #ncols arr fun nRows (arr : array) = #nrows arr fun row ({data, nrows, ncols, ...}: array, i) = if ltu(i, nrows) then let val stop = i*ncols fun mkVec (j, l) = if (j < stop) then Vector.fromList l else mkVec(j-1, unsafeSub(data, j)::l) in if ltu(nrows, i) then raise General.Subscript else mkVec (stop+ncols-1, []) end else raise General.Subscript fun column ({data, ncols, nelts, ...}: array, j) = if ltu(j, ncols) then let fun mkVec (i, l) = if (i < 0) then Vector.fromList l else mkVec(i-ncols, unsafeSub(data, i)::l) in if ltu(ncols, j) then raise General.Subscript else mkVec ((nelts - ncols) + j, []) end else raise General.Subscript datatype index = DONE | INDX of {i:int, r:int, c:int} fun chkRegion {base={data, nrows, ncols, ...}: array, row, col, nrows=nr, ncols=nc} = let fun chk (start, n, NONE) = if ((start < 0) orelse (n < start)) then raise General.Subscript else n-start | chk (start, n, SOME len) = if ((start < 0) orelse (len < 0) orelse (n < start+len)) then raise General.Subscript else len val nr = chk (row, nrows, nr) val nc = chk (col, ncols, nc) in {data = data, i = (row*ncols + col), r=row, c=col, nr=nr, nc=nc} end fun copy (region, dst, dst_row, dst_col) = raise Fail "Array2.copy unimplemented" (* this function generates a stream of indices for the given region in * row-major order. *) fun iterateRM arg = let val {data, i, r, c, nr, nc} = chkRegion arg val ii = ref i and ri = ref r and ci = ref c fun mkIndx (r, c) = let val i = !ii in ii := i+1; INDX{i=i, c=c, r=r} end fun iter () = let val r = !ri and c = !ci in if (c < nc) then (ci := c+1; mkIndx(r, c)) else if (r+1 < nr) then (ci := 0; ri := r+1; iter()) else DONE end in (data, iter) end (* this function generates a stream of indices for the given region in * col-major order. *) fun iterateCM (arg as {base={ncols, ...}, ...}) = let val {data, i, r, c, nr, nc} = chkRegion arg val delta = nr * ncols - 1 val ii = ref i and ri = ref r and ci = ref c fun mkIndx (r, c) = let val i = !ii in ii := i+ncols; INDX{i=i, c=c, r=r} end fun iter () = let val r = !ri and c = !ci in if (r < nr) then (ri := r+1; mkIndx(r, c)) else if (c+1 < nc) then (ii := !ii-delta; ri := 0; ci := c+1; iter()) else DONE end in (data, iter) end fun appi order f region = let val (data, iter) = (case order of RowMajor => iterateRM region | ColMajor => iterateCM region (* end case *)) fun app () = (case iter() of DONE => () | INDX{i, r, c} => (f(r, c, unsafeSub(data, i)); app()) (* end case *)) in app () end fun appRM f ({data, nelts, ...}: array) = let fun appf k = if k < nelts then (f(unsafeSub(data,k)); appf(k+1)) else () in appf 0 end fun appCM f {data, ncols, nrows, nelts} = let val delta = nelts - 1 fun appf (i, k) = if (i < nrows) then (f(unsafeSub(data, k)); appf(i+1, k+ncols)) else let val k = k-delta in if (k < ncols) then appf (0, k) else () end in appf (0, 0) end fun app RowMajor = appRM | app ColMajor = appCM fun modifyi order f region = let val (data, iter) = (case order of RowMajor => iterateRM region | ColMajor => iterateCM region (* end case *)) fun modify () = (case iter() of DONE => () | INDX{i, r, c} => ( unsafeUpdate (data, i, f(r, c, unsafeSub(data, i))); modify()) (* end case *)) in modify () end fun modifyRM f ({data, nelts, ...}: array) = let fun modf k = if k < nelts then (unsafeUpdate(data,k,f(unsafeSub(data,k))); modf (k+1)) else () in modf 0 end fun modifyCM f {data, ncols, nrows, nelts} = let val delta = nelts - 1 fun modf (i, k) = if (i < nrows) then (unsafeUpdate(data, k, f(unsafeSub(data, k))); modf(i+1, k+ncols)) else let val k = k-delta in if (k < ncols) then modf (0, k) else () end in modf (0, 0) end fun modify RowMajor = modifyRM | modify ColMajor = modifyCM fun foldi order f init region = let val (data, iter) = (case order of RowMajor => iterateRM region | ColMajor => iterateCM region (* end case *)) fun fold accum = (case iter() of DONE => accum | INDX{i, r, c} => fold(f(r, c, unsafeSub(data, i), accum)) (* end case *)) in fold init end fun foldRM f init ({data, nelts, ...}: array) = let fun foldf (k, accum) = if k < nelts then foldf(k+1,f(unsafeSub(data,k),accum)) else accum in foldf (0,init) end fun foldCM f init {data, ncols, nrows, nelts} = let val delta = nelts - 1 fun foldf (i, k, accum) = if (i < nrows) then foldf (i+1, k+ncols, f(unsafeSub(data, k), accum)) else let val k = k-delta in if (k < ncols) then foldf (0, k, accum) else accum end in foldf (0, 0, init) end fun fold RowMajor = foldRM | fold ColMajor = foldCM fun transpose {data, nrows, ncols, nelts} = let val dst = mkRawArray nelts val delta = nelts - 1 fun iter (k,k') = if k >= nelts then {data = dst, nrows = ncols, ncols = nrows, nelts = nelts} else (if k' >= nelts then iter(k,k' - delta) else (unsafeUpdate(dst,k',unsafeSub(data,k)); iter(k+1,k'+nrows))) in iter(0,0) end fun extract (region as {base,row,col,nrows,ncols}) = let fun chk (start,limit,NONE) = if ltu(start,limit) then limit - start else raise General.Subscript | chk (start, limit, SOME len) = if ltu(start + len - 1, limit) then len else raise General.Subscript val nr = chk(row, nRows(base), nrows) val nc = chk(col, nCols(base), ncols) val n = nr * nc val dst = mkRawArray n val (data, iter) = iterateRM region fun app (k) = (case iter() of DONE => {data = dst, nrows = nr, ncols = nc, nelts = n} | INDX{i,...} => (unsafeUpdate(dst,k,unsafeSub(data,i)); app(k+1))) in app (0) end fun rmSub (arr as {data,...}: array,ix) = unsafeSub(data,rmIndex(arr, ix)) fun rmUpdate(arr as {data,...}: array,ix,v) = unsafeUpdate(data,rmIndex(arr, ix),v) fun binop ({data=dst,nelts=nelts,...}: array, {data=src1,...}: array, {data=src2,...}: array, f) = dotimes nelts (fn (ix) => unsafeUpdate(dst,ix,f(unsafeSub(src1,ix), unsafeSub(src2,ix)))) fun unop ({data=dst,nelts=nelts,...}: array, {data=src,...}: array, f) = dotimes nelts (fn (ix) => unsafeUpdate(dst,ix,f(unsafeSub(src,ix)))) fun binopi ({data=dst,nelts=nelts,...}: array, {data=src1,...}: array, {data=src2,...}: array, f) = dotimes nelts (fn ix => unsafeUpdate(dst,ix,f(unsafeSub(src1,ix), unsafeSub(src2,ix), ix))) fun unopi ({data=dst,nelts=nelts,...}: array, {data=src,...}: array, f) = dotimes nelts (fn ix => unsafeUpdate(dst,ix,f(unsafeSub(src,ix),ix))) fun fill ({data=dst,nelts=nelts,...}: array,v) = dotimes nelts (fn ix => unsafeUpdate(dst,ix,v)) fun fillf ({data=dst,nelts=nelts,...}: array,f) = dotimes nelts (fn ix => unsafeUpdate(dst,ix,f(ix))) end (* test of Zernick phase screen E-field generation *) (* This is 1.9 times faster than IDL!!!! *) structure MSpeed = struct structure F = FastRealArray2 val sin = Math.sin val cos = Math.cos val fromInt = LargeReal.fromInt (* setup working vectors and arrays *) fun collect n f = let fun g 0 l = l | g n l = g (n-1) ((f n) :: l) in g n nil end val ncoefs = 15 val nx = 128 val ny = nx val nel = nx * ny (* generate an array from a scaled vector *) fun mulsv (dst, sf, a) = F.unop(dst,a,fn(vsrc) => sf * vsrc) (* compute the complex exponential of an array *) fun cisv (a, rpart, ipart) = (F.unop(rpart,a,cos); F.unop(ipart,a,sin); (rpart,ipart)) (* accumulate scaled vectors into an array *) fun mpadd dst (sf, src) = F.binop(dst,dst,src,fn(vdst,vsrc) => vdst + sf * vsrc) (* compute an E-field from a set of Zernike screens *) fun zern (dst, rpart, ipart, coefs, zerns) = (mulsv (dst, hd coefs, hd zerns); ListPair.app (mpadd dst) (tl coefs, tl zerns); cisv (dst, rpart, ipart)) (* timing tests and reporting *) fun report_times(niter, nel, (start, stop)) = let val secs = Time.-(stop,start) val dur = Time.toReal(secs) * 1.0E6 val ops_per_us = ((fromInt niter) * (fromInt nel)) / dur val ns_per_op = 1000.0 / ops_per_us in print(Time.toString (Time.-(stop,start))); print("\n"); { ops_per_us = ops_per_us, ns_per_op = ns_per_op} end fun time_iterations f niter = let fun iter 0 = Time.now() | iter n = (ignore (f()); iter (n-1)) in (Time.now(), iter niter) end fun ztest niter = report_times(niter, nel, time_iterations (fn () => let val sum = F.array(ny,nx, 0.0) val rpart = F.array(ny,nx, 0.0) val ipart = F.array(ny,nx, 0.0) val coefs = collect ncoefs (fn(x) => real(1 + x)) val zerns = collect ncoefs (fn(x) => F.tabulate F.RowMajor (ny, nx, fn(r,c) => 0.01 * real(nx * r + c))) val (rpart, _) = zern (sum, rpart, ipart, coefs, zerns) in if Real.abs(FastRealArray2.sub(rpart, 0, 1) - 0.219) < 0.001 then () else raise Fail "compiler bug" end) niter) end structure Main = struct fun doit n = MSpeed.ztest n end mlton-20100608/bin/0000755000076600000240000000000011404470406012327 5ustar mtfstaffmlton-20100608/bin/add-cross0000755000076600000240000001051111404435642014135 0ustar mtfstaff#!/usr/bin/env bash set -e # This script adds a new crosscompiler target for MLton. # # It takes four arguments. # # 1. , which is what MLton would pass via the -b flag to the GCC # cross-compiler tools. You don't need to have installed these tools in order # to run this script, since it uses ssh and the native gcc on the target. # Examples of $crossTarget are i386-pc-cygwin and sparc-sun-solaris. # # 2. specifies the target architecture. # # 3. specifies the target OS. # # 4. specifies a remote machine of the target type. This script # will ssh to $machine to compile the runtime and to compile and run the # program that will print the values of all the constants that the MLton # basis library needs. # # Here are some example uses of this script. # # add-cross i386-pc-cygwin x86 cygwin cygwin # add-cross sparc-sun-solaris sparc solaris blade # # (Here cygwin happens to be the name of my Cygwin machine and blade # happens to be the name of my Sparc machine.) # # You also may need to set $libDir, which determines where the # cross-compiler target will be installed. die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name " } case "$#" in 4) crossTarget="$1" crossArch="$2" crossOS="$3" machine="$4" ;; *) usage ;; esac name=`basename "$0"` original=`pwd` dir=`dirname "$0"` src=`cd "$dir/.." && pwd` PATH="$dir":$PATH # libDir is the mlton lib directory where you would like the # cross-compiler information to be installed. If you have installed # from the rpms, this will usually be /usr/lib/mlton. You must have # write permission there. lib="$src/build/lib" # You shouldn't need to change anything below this line. rm -rf "$lib/$crossTarget" mkdir -p "$lib/$crossTarget" || die "Cannot write to $lib." tmp='/tmp/mlton-add-cross' ( cd "$src" && mmake TARGET=$crossTarget TARGET_ARCH=$crossArch TARGET_OS=$crossOS \ dirs ) ssh $machine "rm -rf $tmp && mkdir $tmp" echo "Copying files." ( cd "$src" && tar cf - --exclude '*.o' --exclude '*.a' Makefile basis-library bin include runtime ) | ssh $machine "cd $tmp && tar xf - && if [ ! $crossArch == \`./bin/host-arch\` ]; then echo $machine is \`./bin/host-arch\`, not $crossArch; exit 1; fi && if [ ! $crossOS == \`./bin/host-os\` ]; then echo $machine is \`./bin/host-os\`, not $crossOS; exit 1; fi" echo "Making runtime on $machine." ssh $machine "cd $tmp && ./bin/mmake CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\" COMPILE_FAST=yes OMIT_BYTECODE=yes clean dirs runtime" ssh $machine "cd $tmp/build/lib/self && tar cf - ." | ( cd "$lib/$crossTarget" && tar xf - ) ssh $machine "cd $tmp/basis-library/config/c && tar cf - $crossArch-$crossOS" | ( cd "$lib/sml/basis/config/c" && tar xf - ) ( cd "$src" && mmake TARGET=$crossTarget TARGET_ARCH=$crossArch TARGET_OS=$crossOS \ mlbpathmap targetmap ) case "$crossOS" in mingw) suf='.exe' ;; *) suf='' ;; esac # Copied from mlton-script case "$crossArch" in amd64) archOpts='-m64' ;; hppa) archOpts='' ;; ia64) archOpts='-mlp64' ;; sparc) archOpts='-m32' ;; x86) archOpts='' ;; esac case "$crossOS" in aix) osOpts='-maix64' ;; cygwin) osOpts='' ;; darwin) osOpts='-I/usr/local/include -I/opt/local/include -I/sw/include -L/usr/local/lib -L/opt/local/lib -L/sw/lib' ;; freebsd) osOpts='-I/usr/local/include -L/usr/local/lib/' ;; hurd) osOpts='' ;; hpux) osOpts='' ;; linux) osOpts='' ;; mingw) libs='-lws2_32 -lkernel32 -lpsapi -lnetapi32 -lwinmm' ;; netbsd) osOpts='-I/usr/pkg/include -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/' ;; openbsd) osOpts='-I/usr/local/include -L/usr/local/lib/' ;; solaris) osOpts='-lnsl -lsocket -lrt' ;; esac exe='print-constants' echo "Compiling and running print-constants on $machine." "$src/build/bin/mlton" -target $crossTarget -build-constants true | ssh $machine "cd $tmp/runtime && cat >$exe.c && gcc $archOpts $osOpts $CPPFLAGS -I. -o $exe $exe.c libmlton.a libgdtoa.a $LDFLAGS -lgmp -lm" ssh $machine "$tmp/runtime/$exe$suf" >"$lib/$crossTarget/constants" ssh $machine "rm -rf $tmp" mlton-20100608/bin/build-cross-gcc0000755000076600000240000001272511404435642015247 0ustar mtfstaff#!/usr/bin/env bash # This script builds and installs a gcc cross compiler. # It has been used to build cross compilers from Linux to Cygwin, # MinGW, and Solaris. It is unlikely that this script will work # out-of-the-box. It is only intended as a template. You should read # through it and understand what it does, and make changes as # necessary. Feel free to add another targetType if you modify this # script for another target. # Notes from Anoq about the mingw target: # I downloaded the following files from www.mingw.org: # *) binutils-2.13.90-20030111-1-src.tar.gz which I unpacked to # binutils-2.13.90-20030111-1-src.tar # This script unpacks the .tar to binutils-2.13.90-20030111-1-src # *) gcc-3.2.3-20030504-1-src.tar.gz which I unpacked to # gcc-3.2.3-20030504-1-src.tar # This script unpacks the .tar to gcc-3.2.3-20030504-1 # However when running make on gcc it complains about missing files # stdlib.h and unistd.h set -e die () { echo >&2 "$1" exit 1 } root=`pwd` name=`basename "$0"` usage () { die "usage: $name {cygwin|mingw|sun}" } case "$#" in 1) case "$1" in cygwin|mingw|sun) targetType="$1" ;; *) usage ;; esac ;; *) usage esac # You may want to change the installation prefix, which is where the # script will install the cross-compiler tools. prefix='/usr' # You must have have the sources to binutils and gcc, and place the # tarfiles in the current directory. You can find ftp sites to # download binutils and gcc-core at gnu.org. You may need to change # the version numbers below to match what you download. binutils='binutils-2.12' gccVers='2.95.3' gccTar="gcc-core-$gccVers.tar" # You may want to set the target. case "$targetType" in cygwin) target='i386-pc-cygwin' configureGCCFlags='' makeGCCFlags='' # For Cygwin, we also need the cygwin and w32api packages, # which contain necessary header files and libraries. I got # them by installing cygwin in a Windows machine (using # # Cygwin's setup.exe program) and then getting the bzip'ed tar # files out of their Cygwin packages dir. I had problems with # cygwin-1.3.18-1, since its libcygwin.a contained a file, # pseudo-reloc.o, with some strangeness that binutils didn't # correctly handle. cygwin='cygwin-1.3.17-1' w32api='w32api-2.1-1' ;; mingw) target='i386-pc-mingw32' # target='mingw32' # These flags are from build-cross.sh from www.libsdl.org except: # I added --disable-nls because of undefined references to dcgettext__ configureGCCFlags='--with-headers=$prefix/$target/include --with-gnu-as --with-gnu-ld --without-newlib --disable-multilib --disable-nls' makeGCCFlags='LANGUAGES=c' # For MinGW, we also need the mingw-runtime and w32api packages, # which contain necessary header files and libraries. I got # them from www.mingw.org. mingw='mingw-runtime-3.2' w32api='w32api-2.4' ;; sun) target='sparc-sun-solaris' configureGCCFlags='' makeGCCFlags='' # For sun, we assume that you have already copied the includes # and libraries from a Solaris machine to the host machine. if ! [ -d "$prefix/$target/include" -a -d "$prefix/$target/lib" ]; then die "Must create $prefix/$target/{include,lib}." fi # The GCC tools expect limits.h to be in sys-include, not include. ( cd "$prefix/$target" && mkdir -p sys-include && mv include/limits.h sys-include ) ;; esac exists () { if [ ! -r "$1" ]; then die "$1 does not exist" fi } echo 'Checking that needed files exist.' exists $binutils.tar exists $gccTar case "$targetType" in cygwin) exists $cygwin.tar exists $w32api.tar echo 'Copying include files and libraries needed by cross compiler.' cd "$root" mkdir -p cygwin cd cygwin tar x <../$cygwin.tar tar x <../$w32api.tar mkdir -p "$prefix/$target" || die "Cannot create $prefix/$target." (cd usr && tar c include lib) | (cd "$prefix/$target/" && tar x) ;; mingw) exists $mingw.tar exists $w32api.tar echo 'Copying include files and libraries needed by cross compiler.' cd "$root" mkdir -p mingw cd mingw tar x <../$mingw.tar tar x <../$w32api.tar mkdir -p "$prefix/$target" || die "Cannot create $prefix/$target." (tar c include lib) | (cd "$prefix/$target/" && tar x) ;; *) ;; esac echo 'Building binutils.' cd "$root" if [ ! -d "$binutils" ]; then tar x <$binutils.tar fi mkdir -p build-binutils cd build-binutils "../$binutils/configure" "--prefix=$prefix" "--target=$target" \ >"$root/configure-binutils-log" 2>&1 || die "Configure of binutils failed." make all install >"$root/build-binutils-log" 2>&1 || die "Build of binutils failed." echo 'Building gcc.' cd "$root" tar x <"$gccTar" mkdir -p build-gcc cd build-gcc eval "../gcc-$gccVers/configure" -v $configureGCCFlags \ --enable-languages=c \ "--prefix=$prefix" \ "--target=$target" \ >"$root/configure-gcc-log" 2>&1 || die "Configure of gcc failed." eval make $makeGCCFlags all install >"$root/build-gcc-log" 2>&1 || die "Build of gcc failed." echo 'Success.' mlton-20100608/bin/clean0000755000076600000240000000231311404435642013341 0ustar mtfstaff#!/usr/bin/env bash set -e dir=`dirname "$0"` root=`cd "$dir/.." && pwd` bin="$root/bin" case `"$bin/host-os"` in cygwin|freebsd|linux) grepFlags='-q' ;; sun) grepFlags='' ;; esac ignore='.ignore' doit () { rm -rf '.#'* .*~ *~ *.a *.o .cm core mlmon.out svn-commit.* if [ -r "$ignore" ]; then # xargs allows us to have quoted strings for filenames xargs -n 1 find . -maxdepth 1 -name < "$ignore" | xargs rm -rf fi for f in *; do if [ -d "$f" ]; then cd "$f" if [ -r Makefile ]; then "$bin/mmake" clean || doit else doit fi cd .. fi done } doit # This script removes all the junk files created when compiling with MLton's # various -keep flags. #/bin/rm -f *.basis *.chunks *.const *.core-ml *.dot *.flat *.flow \ # *.inline *.local-flatten *.mono *.o *.once-graph *.once-vars \ # *.post-useless *.raise-to-jump *.redundant *.reg *.rep *.ssa \ # *.sxml *.sxml.poly *.threshold[0-9] *.unused-args *.useless *.xml # #/bin/rm -f *~ core mlmon.out mlton-20100608/bin/grab-wiki0000755000076600000240000000474211404435642014143 0ustar mtfstaff#!/bin/bash set -e name=`basename "$0"` dir=`dirname "$0"` src=`cd "$dir/.." && pwd` bin="$src/bin" die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac TIMEFORMAT=' Took %lR.' base='http://mlton.org' index='.index' script='.script' tmp='.tmp' useLocal='false' version=`date +%Y%m%d` cd "$src/doc/guide" rm -f * drop='\(Download\|Experimental\|.*MoinEditorBackup\|OldPages\|Preferences\|RecentChanges\|TemporaryUpload\|WikiSandBox\)' if $useLocal; then (cd "$HOME/mlton/guide-in" && tar.write .) | tar.read; else echo "Getting index:" lynx -dump "$base/Index?action=titleindex" | \ grep -v >"$index" -e '^$' -e "^$drop$" echo "Getting pages:" wget -B "$base" -nv -i "$index" echo "Getting CSS:" for f in common screen print; do wget "$base/wiki/mlton/css/$f.css" done echo "Getting images:" for f in bottom email ftp news top www; do wget "$base/wiki/mlton/img/moin-$f.png" done fi echo "Fixing pages:" # Eliminate ungrabbed pages from Index. grep -v ">$drop<" Index >"$tmp" mv "$tmp" Index wwwImg='[WWW]' # Write sed script to file. cat >"$script" </,+6d # Replace highlight actions with no-op. s;"\([^"]*\).action=highlight[^"]*";"\1";g # Delete Index actions. / and actions. s;]* href *= *"[^"]*?action[^"]*">.*;;g s;]* href *= *"[^"]*?action[^"]*">;;g # Add version stamp in upper left. s;MLton;MLton MLTONWIKIVERSION; # Replace ViewSVN references to trunk with references to release tag. s;\(]*/mlton/\)trunk\([^>]*\)>;\1tags/on-MLTONWIKIVERSION-release\2>;g # Fix wiki hrefs and srcs s; \(href\|src\) *= *"\(/pages/[^"]*\)"; \1="$base\2";g s; \(href\|src\) *= *"/\([^"]\+\)"; \1="\2";g s; href *= *"/"; href="Home";g s; href *= *"$drop"; href="$base/\1";g s; \(href\|src\) *= *"wiki/mlton/[^/]\+/\([^"]*\)"; \1="\2";g s;\(]*>\);\1$wwwImg;g EOF for f in $(cat "$index"); do echo "$f" l=`wc -l < "$f"` let l-=19 head -n $l <"$f" >"$tmp" ( "$bin/msed" -f "$script" <"$tmp" echo '' ) >"$f" done rm -f "$tmp" "$index" "$script" cp Home index.html echo $version > MLTONWIKIVERSION mlton-20100608/bin/host-arch0000755000076600000240000000041311404435642014146 0ustar mtfstaff#!/usr/bin/env bash set -e name=`basename "$0"` dir=`dirname "$0"` bin=`cd "$dir" && pwd` die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac eval `"$bin/platform"` echo $HOST_ARCH mlton-20100608/bin/host-os0000755000076600000240000000041111404435642013650 0ustar mtfstaff#!/usr/bin/env bash set -e name=`basename "$0"` dir=`dirname "$0"` bin=`cd "$dir" && pwd` die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac eval `"$bin/platform"` echo $HOST_OS mlton-20100608/bin/make-pdf-guide0000755000076600000240000000452111404435642015041 0ustar mtfstaff#!/bin/sh set -e name=`basename "$0"` dir=`dirname "$0"` src=`cd "$dir/.." && pwd` bin="$src/bin" die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac book='mlton.book' pages='.pages' pdf='mlton-guide.pdf' script='.script' titlepage='title.html' tmp="/tmp/mlton-guide.$$" version=`cat $src/doc/guide/MLTONWIKIVERSION` rm -rf "$tmp" mkdir "$tmp" cd "$tmp" ( cd "$src/doc/guide" && tar -cf - . ) | tar -xf - # The grep -v takes out files that aren't wiki pages. # Hope that no files contain spaces or other specials -> `cat "$pages"` dies ls -1 | grep -v '\.' | grep -v "MLTONWIKIVERSION" >"$pages" echo 'Massaging HTML.' for f in `cat "$pages"`; do cat >"$script" <$f; s;]*>;;g s;;;g s;\(

]*\)>;image;g s;MLTONWIKIVERSION;$version;g EOF "$bin/msed" -f "$script" <"$f" >.tmp mv .tmp "$f" done echo 'Generating PDF titlepage.' cat >"$titlepage" < MLton Guide ($version)

MLton Guide

This is the guide for MLton, an open-source, whole-program, optimizing Standard ML compiler.

This guide was generated automatically from the MLton wiki, available online at http://mlton.org. It is up to date for MLton $version.

EOF echo 'Generating htmldoc script.' ( cat <"$book" echo 'Running htmldoc.' htmldoc --batch "$book" || true mv "$pdf" "$src/doc/guide" rm -rf "$tmp" mlton-20100608/bin/Makefile0000644000076600000240000000044411404435642013774 0ustar mtfstaff## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../bin/clean mlton-20100608/bin/mlton-script0000644000076600000240000001173411404435642014716 0ustar mtfstaff#!/usr/bin/env bash # This script calls MLton. set -e dir=`dirname "$0"` lib=`cd "$dir/../lib" && pwd` eval `"$lib/platform"` gcc='gcc' case "$HOST_OS" in mingw) exe='.exe' ;; hpux) ia64hpux="-mlp64" ;; *) exe='' ;; esac mlton="$lib/mlton-compile$exe" smlnj='sml' if $smlnj -h >/dev/null 2>&1; then smlnj_heap_suffix=`echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | $smlnj 2>&1 1> /dev/null` mlton_smlnj_heap="$lib/mlton-smlnj.$smlnj_heap_suffix" else mlton_smlnj_heap="" fi mlton_polyml="$lib/mlton-polyml$exe" declare -a rargs case "$1" in @MLton) shift while [ "$#" -gt 0 -a "$1" != "--" ]; do rargs[${#rargs[@]}]="$1" shift done if [ "$#" -gt 0 -a "$1" == "--" ]; then shift else echo '@MLton missing --' exit 1 fi ;; esac doitMLton () { exec "$mlton" @MLton ram-slop 0.5 "${rargs[@]}" -- "$@" } doitSMLNJ () { exec "$smlnj" @SMLload="$mlton_smlnj_heap" "$@" } doitPolyML () { exec "$mlton_polyml" "$@" } doit () { if [ -x "$mlton" ]; then doitMLton "$@" elif [ -s "$mlton_smlnj_heap" ]; then doitSMLNJ "$@" elif [ -x "$mlton_polyml" ]; then doitPolyML "$@" fi echo 'Unable to run MLton. Check that lib is set properly.' >&2 exit 1 } # For align-{functions,jumps,loops}, we use -m for now instead of # -f because old gcc's will barf on -f, while newer ones only warn # about -m. Someday, when we think we won't run into older gcc's, # these should be changed to -f. # You may need to add a line with -cc-opt 'I/path/to/gmp.h' so the # C compiler can find gmp.h # You may need to add a line with -link-opt '-L/path/to/libgmp' so # that the linker can find libgmp. # The darwin linker complains (loudly) about non-existent library # search paths. darwinLinkOpts='' if [ -d '/usr/local/lib' ]; then darwinLinkOpts="$darwinLinkOpts -L/usr/local/lib" fi if [ -d '/opt/local/lib' ]; then darwinLinkOpts="$darwinLinkOpts -L/opt/local/lib" fi if [ -d '/sw/lib' ]; then darwinLinkOpts="$darwinLinkOpts -L/sw/lib" fi doit "$lib" \ -ar-script "$lib/static-library" \ -cc "$gcc" \ -cc-opt-quote "-I$lib/include" \ -cc-opt '-O1 -fno-common' \ -cc-opt '-fno-strict-aliasing -fomit-frame-pointer -w' \ -link-opt '-lm -lgmp' \ -mlb-path-map "$lib/mlb-path-map" \ -target-as-opt amd64 '-m64' \ -target-as-opt x86 '-m32' \ -target-cc-opt alpha \ '-mieee -mbwx -mtune=ev6 -mfp-rounding-mode=d' \ -target-cc-opt amd64 '-m64' \ -target-cc-opt darwin \ '-I/usr/local/include -I/opt/local/include -I/sw/include' \ -target-cc-opt freebsd '-I/usr/local/include' \ -target-cc-opt netbsd '-I/usr/pkg/include' \ -target-cc-opt openbsd '-I/usr/local/include' \ -target-cc-opt aix '-maix64' \ -target-cc-opt ia64 "$ia64hpux -mtune=itanium2" \ -target-cc-opt sparc '-m32 -mcpu=v8 -Wa,-xarch=v8plusa' \ -target-cc-opt x86 \ '-m32 -fno-strength-reduce -fschedule-insns -fschedule-insns2 -malign-functions=5 -malign-jumps=2 -malign-loops=2' \ -target-link-opt amd64 '-m64' \ -target-link-opt alpha \ '-mieee -mbwx -mtune=ev6 -mfp-rounding-mode=d' \ -target-link-opt darwin "$darwinLinkOpts" \ -target-link-opt freebsd '-L/usr/local/lib/' \ -target-link-opt aix '-maix64' \ -target-link-opt ia64 "$ia64hpux" \ -target-link-opt mingw \ '-lws2_32 -lkernel32 -lpsapi -lnetapi32 -lwinmm' \ -target-link-opt mingw '-Wl,--enable-stdcall-fixup' \ -target-link-opt netbsd \ '-Wl,-R/usr/pkg/lib -L/usr/pkg/lib/' \ -target-link-opt openbsd '-L/usr/local/lib/' \ -target-link-opt solaris '-lnsl -lsocket -lrt' \ -target-link-opt x86 '-m32' \ -profile-exclude '\$\(SML_LIB\)' \ "$@" mlton-20100608/bin/mmake0000755000076600000240000000050211404435642013347 0ustar mtfstaff#!/usr/bin/env bash set -e die () { echo "$1" >&2 exit 1 } if gmake -v >/dev/null 2>&1; then make='gmake' elif gnumake -v >/dev/null 2>&1; then make='gnumake' elif make -v 2>&1 | grep -q GNU; then make=`which make` else die 'Can'\''t find GNU make' fi exec "$make" "$@" mlton-20100608/bin/msed0000755000076600000240000000051411404435642013210 0ustar mtfstaff#!/usr/bin/env bash set -e die () { echo "$1" >&2 exit 1 } if gsed --version >/dev/null 2>&1; then sed='gsed' elif gnused --version >/dev/null 2>&1; then sed='gnused' elif sed --version 2>&1 | grep -q GNU; then sed=`which sed` else die 'Can'\''t find GNU sed' fi exec "$sed" "$@" mlton-20100608/bin/patch-mingw0000755000076600000240000000043111404435642014474 0ustar mtfstaff#!/usr/bin/env sh set -e dir=`dirname "$0"` for f in `find "$dir" -type f | grep -v '\.svn' | grep -v '~'`; do if head -n 1 "$f" | grep -q '#!/usr/bin/env bash'; then echo "Processing $f" sed 's;#!/usr/bin/env bash;#!/usr/bin/env sh;' <"$f" >.tmp; mv .tmp "$f"; fi done mlton-20100608/bin/platform0000755000076600000240000000337111404435642014110 0ustar mtfstaff#!/usr/bin/env bash set -e name=`basename "$0"` dir=`dirname "$0"` bin=`cd "$dir" && pwd` die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac uname=`uname` arch= case "$uname" in AIX) HOST_OS='aix' arch=`/usr/sbin/lsattr -a type -F deflt -l proc0` case $arch in POWER) arch=powerpc64 ;; esac ;; CYGWIN*) HOST_OS='cygwin' ;; Darwin) HOST_OS='darwin' ;; *FreeBSD*) HOST_OS='freebsd' ;; GNU) HOST_OS='hurd' ;; HP-UX) HOST_OS='hpux' ;; Linux) HOST_OS='linux' ;; MINGW*) HOST_OS='mingw' ;; NetBSD*) HOST_OS='netbsd' ;; OpenBSD*) HOST_OS='openbsd' ;; SunOS) HOST_OS='solaris' for arch in sparc amd64 i386 `uname -m`; do optisa $arch > /dev/null && break done ;; *) die "Unknown OS $uname." ;; esac if [ -z "$arch" ]; then arch=`uname -m` fi case "$arch" in alpha*) # not certain about this one; no alpha access HOST_ARCH=alpha ;; x86_64*) HOST_ARCH=amd64 ;; i?86_64) HOST_ARCH=amd64 ;; amd64) HOST_ARCH=amd64 ;; arm*) HOST_ARCH=arm ;; parisc*) HOST_ARCH=hppa ;; 9000/*) HOST_ARCH=hppa ;; ia64*) HOST_ARCH=ia64 ;; m68k*) HOST_ARCH=m68k ;; mips*) # big-endian and little-endian detect via headers HOST_ARCH=mips ;; powerpc64) HOST_ARCH=powerpc64 ;; powerpc) HOST_ARCH=powerpc ;; ppc*) HOST_ARCH=powerpc ;; Power*) HOST_ARCH=powerpc ;; s390*) HOST_ARCH=s390 ;; sparc*) HOST_ARCH=sparc ;; sun*) HOST_ARCH=sparc ;; i?86*) HOST_ARCH=x86 ;; *) die "Unknown arch $arch." ;; esac echo "HOST_OS=$HOST_OS HOST_ARCH=$HOST_ARCH" mlton-20100608/bin/regression0000755000076600000240000002134111404435642014441 0ustar mtfstaff#!/usr/bin/env bash # This script runs the regression tests in src/regression. # It also compiles the tests in benchmark/tests # set -e name=`basename "$0"` usage () { echo >&2 "usage: $name [-cross target] [-resume test] [-run-only target] [-short] [-test-reg reg] [mlton flags ...]" exit 1 } cross='false' fail='false' resume='true' resumeTest='nil' runOnly='false' short='false' testReg='false' declare -a testRegs declare -a flags declare -a extraFlags flags[${#flags[@]}]="-type-check" flags[${#flags[@]}]="true" while [ "$#" -gt 0 ]; do case "$1" in -cross) cross='true' shift if [ "$#" = 0 ]; then usage fi crossTarget="$1" shift ;; -fail) fail='true' shift ;; -resume) resume='false' shift if [ "$#" = 0 ]; then usage fi resumeTest="$1" shift ;; -run-only) runOnly='true' shift if [ "$#" = 0 ]; then usage fi crossTarget="$1" shift ;; -short) short='true' shift ;; -test-reg) testReg='true' shift if [ "$#" = 0 ]; then usage fi testRegs[${#testRegs[@]}]="$1" shift ;; *) flags[${#flags[@]}]="$1" shift ;; esac done dir=`dirname "$0"` src=`cd "$dir/.." && pwd` bin="$src/build/bin" lib="$src/build/lib" mlton="$bin/mlton" if $cross; then flags[${#flags[@]}]="-target" flags[${#flags[@]}]="$crossTarget" flags[${#flags[@]}]="-stop" flags[${#flags[@]}]="g" fi cont='callcc.sml callcc2.sml callcc3.sml once.sml' flatArray='finalize.sml flat-array.sml flat-array.2.sml' intInf='conv.sml conv2.sml fixed-integer.sml harmonic.sml int-inf.*.sml slow.sml slower.sml smith-normal-form.sml' signal='finalize.sml signals.sml signals2.sml signals3.sml signals4.sml suspend.sml weak.sml' thread='thread0.sml thread1.sml thread2.sml mutex.sml prodcons.sml same-fringe.sml timeout.sml' world='world1.sml world2.sml world3.sml world4.sml world5.sml world6.sml' tmp=/tmp/z.regression.$$ PATH="$bin:$src/bin/.:$PATH" eval `"$lib/platform"` compFail () { echo "compilation of $f failed with ${flags[*]}" } "$mlton" -verbose 1 || echo 'no mlton present' echo "flags = ${flags[*]}" cd "$src/regression" if $fail; then for f in fail/*.sml; do echo "testing $f" ( "$mlton" "${flags[@]}" -stop tc "$f" >/dev/null 2>&1 && echo "compilation of $f should have failed but did not" ) || true done exit 0 fi forMinGW='false' if [ `host-os` = mingw ]; then forMinGW='true' fi case $crossTarget in *mingw) forMinGW='true' ;; esac for f in *.sml; do f=`basename "$f" .sml` if ! ($resume); then if [ "$f" == "$resumeTest" ]; then resume='true' else continue fi fi if ($testReg); then skip='true' for (( i = 0 ; $i < ${#testRegs[@]} ; i++ )); do if [ "$f" = "${testRegs[$i]}" ]; then skip='false' fi done if ($skip); then continue fi fi case `host-os` in cygwin) case "$f" in textio.2) continue ;; esac ;; hurd) # Work-around hurd bug (http://bugs.debian.org/551470) case "$f" in mutex|prodcons|signals|signals2|signals3|signals4|suspend|thread2|timeout|world5) continue ;; esac ;; mingw) case "$f" in cmdline|command-line|echo|filesys|posix-exit|signals|signals2|signals3|signals4|socket|suspend|textio.2|unixpath|world*) continue ;; esac ;; esac case "$f" in serialize) continue ;; esac echo "testing $f" unset extraFlags case "$f" in exn-history*) extraFlags[${#extraFlags[@]}]="-const" extraFlags[${#extraFlags[@]}]="Exn.keepHistory true" ;; esac if (! $runOnly); then mlb="$f.mlb" echo "\$(SML_LIB)/basis/basis.mlb \$(SML_LIB)/basis/mlton.mlb \$(SML_LIB)/basis/sml-nj.mlb ann \"allowFFI true\" \"allowOverload true\" \"nonexhaustiveMatch ignore\" \"redundantMatch ignore\" in $f.sml end" >"$mlb" "$mlton" "${flags[@]}" "${extraFlags[@]}" -output "$f" "$mlb" if [ "$?" -ne '0' ] || ((! $cross) && [ ! -x "$f" ]); then compFail "$f" fi rm "$mlb" else case "$crossTarget" in *mingw) libs='-lws2_32 -lkernel32 -lpsapi -lnetapi32' ;; *solaris) libs='-lnsl -lsocket -lrt' ;; *) libs='' ;; esac libs="-lmlton -lgmp $libs -lgdtoa -lm" # Must use $f.[0-9].[cS], not $f.*.[cS], because the # latter will include other files, e.g. for finalize, # it will also include finalize.2. This happens only # when running cross regressions, which builds all the # C files and saves them in this directory. files="$f.[0-9].[cS]" if [ 0 -ne `ls $f.[0-9][0-9].[cS] 2>/dev/null | wc -l` ]; then files="$files $f.[0-9][0-9].[cS]" fi gcc -o "$f" -w -O1 \ -I "../build/lib/include" \ -I "../build/lib/$crossTarget/include" \ -L"../build/lib/$crossTarget" \ -L/usr/pkg/lib \ -L/usr/local/lib \ $files $libs fi if [ ! -r "$f".nonterm -a $cross = 'false' -a -x "$f" ]; then nonZeroMsg='Nonzero exit status.' if $forMinGW; then nonZeroMsg="$nonZeroMsg"'\r' fi ( "./$f" || echo -e "$nonZeroMsg" ) >$tmp 2>&1 if [ -r "$f.ok" ]; then compare="$f.$HOST_ARCH-$HOST_OS.ok" if [ ! -r $compare ]; then compare="$f.ok" fi if $forMinGW; then newcompare="$f.sed.ok" sed $'s/$/\r/' <"$compare" > "$newcompare" compare="$newcompare" fi if ! diff "$compare" "$tmp"; then echo "difference with ${flags[*]} ${extraFlags[*]}" fi fi fi done if $cross || $runOnly || $short || $testReg ; then exit 0 fi mmake clean >/dev/null cd "$src/benchmark/tests" for f in *.sml; do f=`basename "$f" .sml` tmpf="/tmp/$f.$$" case "$f" in fxp|hamlet) echo "skipping $f" ;; *) echo "testing $f" echo "val _ = Main.doit 0" | cat "$f.sml" - > "$tmpf.sml" $mlton -output "$tmpf" "${flags[@]}" \ -default-ann 'nonexhaustiveMatch ignore'\ -default-ann 'redundantMatch ignore' \ "$tmpf.sml" if [ $? -ne 0 ]; then compFail "$f" fi rm -f "$tmpf" "$tmpf.sml" ;; esac done mmake clean >/dev/null cd "$src" for f in mllex mlyacc mlprof; do tmpf="/tmp/$f.$$" cd "$src/$f" echo "testing $f" mmake -W "$f" >/dev/null "$mlton" "${flags[@]}" -output "$tmpf" "$f.mlb" if [ $? -ne 0 ]; then compFail "$f" fi rm -f "$tmpf" done rm -f "$tmp" mlton-20100608/bin/static-library0000755000076600000240000000465411404435642015222 0ustar mtfstaff#! /usr/bin/env bash # This script creates a static library (archive). # It is invoked as: static-library TARGET OS OUTPUT objects* libraries* # eg: static-library self mingw foo.a /tmp/obj1.o /tmp/obj2.o /lib/libmlton.a # A safe fallback for unsupported platforms is: # rm -f foo.a # ar rc foo.a /tmp/obj1.o /tmp/obj2.o # ranlib foo.a # However, this script tries to mimic the behaviour of shared libraries as # closely as possible. It links in the required bits of dependent libraries, # links together the given objects, and then hides all non-public symbols. # # The end result of this process is that two MLton produced static libraries # can safely be used at the same time since their symbols don't overlap. It # is even possible to use libraries produced using different versions of the # runtime. set -e target="$1" shift os="$1" shift output="$1" shift if [ "$target" = "self" ]; then target=""; else target="$target-"; fi # Change this to false is partial linking does not work on your platform partialLink='true' rm -f "${output}" if "$partialLink"; then # Localize all but export symbols. Platform dependent. if [ "$os" = "darwin" ]; then "${target}ld" -r -o "$output.o" "$@" # The osx linker already makes hidden symbols local elif [ "$os" = "mingw" -o "$os" = "cygwin" ]; then # Link allowing _address of stdcall function fixups # Preserve the export list (.drectve section) "${target}ld" -r --unique=.drectve --enable-stdcall-fixup -o "$output.o" "$@" # Extract the list of exports to make only them global "${target}dlltool" --output-def "$output.def" "$output.o" grep '@' "$output.def" \ | sed 's/^[[:space:]]*\([^[:space:]]*\).*$/_\1/' \ > "$output.globals" "${target}objcopy" --keep-global-symbols "$output.globals" "$output.o" rm "$output.def" "$output.globals" else "${target}ld" -r -o "$output.o" "$@" # ELF systems are all the same... localize hidden symbols # Be careful not to localize gcc PIC's common section thunks "${target}objdump" -t "$output.o" \ | grep ' \.hidden ' \ | grep -v get_pc_thunk \ | sed 's/^.* \.hidden //' \ > "$output.locals" "${target}objcopy" --localize-symbols "$output.locals" "$output.o" rm "$output.locals" fi # Create the final archive "${target}ar" rc "$output" "$output.o" "${target}ranlib" "$output" rm "$output.o" else "${target}ar" rc "$output" "$@" "${target}ranlib" "$output" fi mlton-20100608/bin/static-library.bat0000644000076600000240000000003511404435642015751 0ustar mtfstaff@bash %~dp0static-library %* mlton-20100608/bin/sync-ignore0000755000076600000240000000125411404435642014517 0ustar mtfstaff#!/bin/sh set -e name=`basename "$0"` dir=`dirname "$0"` root=`cd "$dir/.." && pwd` die () { echo >&2 "$1" exit 1 } usage () { die "usage: $name" } case "$#" in 0) ;; *) usage ;; esac p='svn:ignore' for i in `find "$root" -type f -name .ignore`; do d=`dirname "$i"` tmp='/tmp/z.ign' l=`svn propget "$p" "$d" | wc -l` let l-=1 if [ $l -ge 0 ]; then svn propget "$p" "$d" | head -n $l >"$tmp" else svn propget "$p" "$d" >"$tmp" fi if ! diff -q "$i" "$tmp" >/dev/null; then svn propset "$p" -F "$i" "$d" fi rm $tmp done mlton-20100608/bin/upgrade-basis0000755000076600000240000000570511404435642015015 0ustar mtfstaff#!/usr/bin/env bash set -e die () { echo >&2 "$1" exit 1 } bin=`dirname "$0"` name=`basename "$0"` usage () { die "usage: $name " } case "$#" in 3) PATH="$1" ARCH="$2" OS="$3" ;; *) usage ;; esac tmp="$$.sml" echo "val () = print \"I work\"" >"$tmp" if ! mlton "$tmp" 1>&2; then die "Error: cannot upgrade basis because the compiler doesn't work" fi feature () { feature="$1" sml="$2" echo "$feature" >"$tmp" if ! mlton -stop tc "$tmp" >/dev/null 2>&1; then echo "$sml" fi } feature 'fun f x : string option = TextIO.inputLine x' ' structure TextIO = struct open TextIO fun inputLine ins = case TextIO.inputLine ins of "" => NONE | s => SOME s end' feature 'fun f x : string option = OS.FileSys.readDir x' ' structure OS = struct open OS structure FileSys = struct open FileSys fun readDir d = case FileSys.readDir d of "" => NONE | s => SOME s end end' feature 'val _ = IntInf.~>>' ' structure IntInf = struct open IntInf val ~>> : int * Word.word -> int = fn _ => raise Fail "IntInf.~>>" end' feature 'val _ = Real32.+' 'structure Real32 = Real64' feature 'val _ = Word8.~' ' structure Word8 = struct open Word8 fun ~ w = 0w0 - w end' feature 'val _ = Word.~' ' structure Word = struct open Word fun ~ w = 0w0 - w end structure Word32 = Word structure LargeWord = Word' feature 'val _ = PackWord64Big.bytesPerElem' ' structure PackWord64Big : PACK_WORD = struct val bytesPerElem = 0 val isBigEndian = true fun subVec _ = raise Fail "PackWord64Big.subVec" fun subVecX _ = raise Fail "PackWord64Big.subVecX" fun subArr _ = raise Fail "PackWord64Big.subArr" fun subArrX _ = raise Fail "PackWord64Big.subArrX" fun update _ = raise Fail "PackWord64Big.update" end' feature 'val _ = PackWord64Little.bytesPerElem' ' structure PackWord64Little : PACK_WORD = struct val bytesPerElem = 0 val isBigEndian = false fun subVec _ = raise Fail "PackWord64Little.subVec" fun subVecX _ = raise Fail "PackWord64Little.subVecX" fun subArr _ = raise Fail "PackWord64Little.subArr" fun subArrX _ = raise Fail "PackWord64Little.subArrX" fun update _ = raise Fail "PackWord64Little.update" end' cat <<-EOF structure MLton = struct open MLton structure Platform = struct structure Arch = struct type t = string val host = "$ARCH" val toString = fn s => s end structure OS = struct type t = string val host = "$OS" val toString = fn s => s end end end EOF rm -f "$tmp" rm -f `basename "$tmp" .sml` mlton-20100608/doc/0000755000076600000240000000000011404470406012324 5ustar mtfstaffmlton-20100608/doc/changelog0000644000076600000240000026314411404435635014215 0ustar mtfstaffHere are the changes from version 20070826 to version 20100608. Summary: + New platforms. o ia64-hpux o powerpc64-aix + Compiler. o Command-line switches. * Added: -mlb-path-var ' ' * Removed: -keep sml, -stop sml o Improved constant folding of floating-point operations. o Experimental: Support for compiling to a C library; see wiki documentation. o Extended -show-def-use output to include types of variable definitions. o Deprecated features (to be removed in a future release) * Bytecode codegen: The bytecode codegen has not seen significant use and it is not well understood by any of the active developers. * Support for .cm files as input: The ML Basis system provides much better infrastructure for "programming in the very large" than the (very) limited support for CM. The cm2mlb tool (available in the source distribution) can be used to convert CM projects to MLB projects, preserving the CM scoping of module identifiers. o Bug fixes: see changelog + Runtime. o @MLton switches. * Added: may-page-heap {false|true} o may-page-heap: By default, MLton will not page the heap to disk when unable to grow the heap to accomodate an allocation. (Previously, this behavior was the default, with no means to disable, with security an least-surprise issues.) o Bug fixes: see changelog + Language. o Allow numeric characters in ML Basis path variables. + Libraries. o Basis Library. * Bug fixes: see changelog. o MLton structure. * Added: MLton.equal, MLton.hash, MLton.Cont.isolate, MLton.GC.Statistics, MLton.Pointer.sizeofPointer, MLton.Socket.Address.toVector * Changed: * Deprecated: MLton.Socket o Unsafe structure. * Added versions of all of the monomorphic array and vector structures. o Other libraries. * Updated: ckit library, MLRISC library, SML/NJ library. + Tools. o mllex * Eliminated top-level 'type int = Int.int' in output. * Include (*#line line:col "file.lex" *) directives in output. * Added %posint command, to set the yypos type and allow the lexing of multi-gigabyte files. o mlnlffigen * Added command-line switches -linkage archive and -linkage shared. * Deprecated command-line switch -linkage static. * Added support for ia64 and hppa targets. o mlyacc * Eliminated top-level 'type int = Int.int' in output. * Include (*#line line:col "file.grm" *) directives in output. * 2010-05-12 - Fixed bug in the mark-compact garbage collector where the C library's memcpy was used to move objects during the compaction phase; this could lead to heap corruption and segmentation faults with newer versions of gcc and/or glibc, which assume that src and dst in a memcpy do not overlap. * 2010-03-12 - Fixed bug in elaboration of datatype declarations with withtype bindings. * 2009-12-11 - Fixed performance bug in ref flatten SSA2 optimization. * 2009-12-09 - Fixed performance bug in simplify types SSA optimization. * 2009-12-02 - Fixed bug in amd64 codegen register allocation of indirect C calls. * 2009-09-17 - Fixed bug in IntInf.scan and IntInf.fromString where leading spaces were only accepted if the stream had an explicit sign character. * 2009-07-10 - Added combine conversions SSA optimization. * 2009-06-09 - Removed deprecated command line switch -show-anns {false, true}. * 2009-04-18 - Removed command line switches -keep sml and -stop sml. Their meaning was unclear with .mlb files; their effect with .cm files can be achieved with -stop f. * 2009-04-16 - Fixed bug in IntInf.~>> that could cause a glibc assertion failure. * 2009-04-01 - Fixed exported type of MLton.Process.reap. * 2009-01-27 - Added MLton.Socket.Address.toVector to get the network-byte-order representation of an IP address. * 2008-11-10 - Fixed bug in MLton.size and MLton.share when tracing the current stack. * 2008-10-27 - Fixed phantom typing of sockets by hiding the representation of socket types. Previously the representation of sockets was revealed rendering the phantom types useless. * 2008-10-10 - Fixed bug in nexted _export/_import functions. * 2008-09-12 - Improved constant folding of floating point operations. * 2008-08-20 - Store the card/cross map at the end of the allocated ML heap; avoids possible out of memory errors when resizing the ML heap cannot be followed by a card/cross map allocation. * 2008-07-24 - Added support for compiling to a C library. The relevant new compiler options are '-ar' and '-format'. Libraries are named based on the name of the -export-header file. Libraries have two extra methods: * NAME_open(argc, argv) initializes the library and runs the SML code until it reaches the end of the program. If the SML code exits or raises an uncaught exception, the entire program will terminate. * NAME_close() will execute any registered atExit functions, any outstanding finalizers, and frees the ML heap. * 2008-07-16 - Fixed bug in the name mangling of _import-ed functions with the stdcall convention. * 2008-06-12 - Added MLton.Pointer.sizeofPointer. * 2008-06-06 - Added expert command line switch -emit-main {true|false}. * 2008-05-17 - Fixed bug in Windows code to page the heap to disk when unable to grow the heap to a desired size. Thanks to Sami Evangelista for the bug report. * 2008-05-10 - Implemented MLton.Cont.isolate. * 2008-04-20 - Fixed bug in *NIX code to page the heap to disk when unable to grow the heap to a desired size. Thanks to Nicolas Bertolotti for the bug report and patch. * 2008-04-07 - More flexible active/paused stack resizing policy. Removed thread-shrink-ratio runtime option. Added stack-current-grow-ratio, stack-current-max-reserved-ratio, stack-current-permit-ratio, stack-current-shrink-ratio, stack-max-reserved-ratio, and stack-shrink-ratio runtime options. * 2008-04-07 - Fixed bugs in Basis Library where the representations of OS.IO.iodesc, Posix.IO.file_desc, Posix.Signal.signal, Socket.sock, Socket.SOGK.sock_type as integers were exposed. * 2008-03-14 - Added unsafe versions of all of the monomorphic array and vector structures. * 2008-03-02 - Fixed bug in Basis Library where the representation of OS.Process.status as an integer was exposed. * 2008-02-13 - Fixed space-safety bug in pass to flatten refs into containing data structure. Thanks to Daniel Spoonhower for the bug report and initial diagnosis and patch. * 2008-01-25 - Various updates to GC statistics gathering. Some basic GC statistics can be accessed from SML by MLton.GC.Statistics.* functions. * 2008-01-24 - Added primitive (structural) polymorphic hash. * 2008-01-21 - Fixed frontend to accept "op longvid" patterns and expressions. Thanks to Florian Weimer for the bug report. * 2008-01-17 - Extended -show-def-use output to include types of variable definitions. * 2008-01-09 - Extended MLton_equal to be a structural equality on all types, including real and -> types. * 2007-12-18 - Changed ML-Yacc and ML-Lex to output line directives so that MLton's def-use information points to the source files (.grm and .lex) instead of the generated implementations (.grm.sml and .lex.sml). * 2007-12-14 - Added runtime option 'may-page-heap {false|true}'. By default, MLton will not page the heap to disk when unable to grow the heap to a desired size. (Previously, this behavior was the default, with no means to disable, with security and least-surprise concerns.) Thanks to Wesley Terpstra for the patch. - Fixed bug the FFI visible representation of Int16.int ref (and references of other primitive types smaller than 32-bits) on big-endian platforms. Thanks to Dave Herman for the bug report. * 2007-12-13 - Fixed bug in ImperativeIOExtra.canInput (TextIO.canInput). Thanks to Ville Laurikari for the bug report. * 2007-12-09 - Better constant folding of IntInf operations. * 2007-12-07 - Fixed bug in algebraic simplification of real primitives. Real.<= (x, x) is false when x is NaN. * 2007-11-29 - Fixed bug in type inference of flexible records. This would later cause the compiler to raise the TypeError exception. Thanks to Wesley Terpstra for the bug report. * 2007-11-28 - Fixed bug in cross-compilation of gdtoa library. Thanks to Wesley Terpstra for the bug report and patch. * 2007-11-20 - Fixed bug in pass to flatten refs into containing data structure. Thanks to Ruy LeyWild for the bug report. * 2007-11-19 - Fixed bug in the handling of weak pointers by the mark-compact garbage collector. Thanks to Sean McLaughlin for the bug report and Florian Weimer for the initial diagnosis. * 2007-11-07 - Added %posint command to ml-lex, to set the yypos type and allow the lexing of multi-gigabyte input files. Thanks to Florian Weimer for the feature concept and original patch. * 2007-11-07 - Added command-line switch -mlb-path-var ' ' for specifying MLB path variables. * 2007-11-06 - Allow numeric characters in MLB path variables. * 2007-09-20 - Fixed bug in elaboration of structures with signature constraints. This would later cause the compiler to raise the TypeError exception. Thanks to Vesa Karvonen for the bug report. * 2007-09-11 - Fixed bug in interaction of _export-ed functions and signal handlers. Thanks to Sean McLaughlin for the bug report. * 2007-09-03 - Fixed bug in implementation of _export-ed functions using 'char' type. Thanks to Katsuhiro Ueno for the bug report. -------------------------------------------------------------------------------- Here are the changes from version 20051202 to version 20070826. Summary: + New platforms: o amd64-linux, amd64-freebsd o hppa-hpux o powerpc-aix o x86-darwin (Mac OS X) + Compiler. o Support for 64-bit platforms. * Native amd64 codegen. o Command-line switches. * Added: -codegen amd64, -codegen x86, -default-type , -profile-val {false|true}. * Changed: -stop f (file listing now includes .mlb files) o Bytecode codegen. * Support for profiling. * Support for exception history. + Language. o ML Basis annotations. * Removed: allowExport, allowImport, sequenceUnit, warnMatch. + Libraries. o Basis Library. * Added: PackWord16Big, PackWord16Little, PackWord64Big, PackWord64Little. * Bug Fixes: see changelog. o MLton structure. * Added: MLTON_MONO_ARRAY, MLTON_MONO_VECTOR, MLTON_REAL, MLton.BinIO.tempPrefix, MLton.CharArray, MLton.CharVector, MLton.IntInf.BigWord, MLton.IntInf.SmallInt, MLton.Exn.defaultTopLevelHandler, MLton.Exn.getTopLevelHandler, MLton.Exn.setTopLevelHandler, MLton.LargeReal, MLton.LargeWord, MLton.Real, MLton.Real32, MLton.Real64, MLton.Rlimit.Rlim, MLton.TextIO.tempPrefix, MLton.Vector.create, MLton.Word.bswap, MLton.Word8.bswap, MLton.Word16, MLton.Word32, MLton.Word64, MLton.Word8Array, MLton.Word8Vector. * Changed: MLton.Array.unfoldi, MLton.IntInf.rep, MLton.Rlimit, MLton.Vector.unfoldi. * Deprecated: MLton.Socket o Other libraries. * Added: MLRISC libary. * Updated: ckit library, SML/NJ library. + Tools. * 2007-08-12 - Removed deprecated ML Basis annotations. * 2007-08-06 - Fixed bug in treatment of Real.{scan,fromString} operations. Real.{scan,fromString} were using TO_NEAREST semantics, but should obey current rounding mode. (Only Real.fromDecimal is specified to always have TO_NEAREST semantics.) Thanks to Sean McLaughlin for the bug report. * 2007-07-27 - Fixed bugs in constant-folding of floating-point operations with C codegen. * 2007-07-26 - Fixed bug in treatment of floating-point operations. Floating-point operations depend on the current rounding mode, but were being treated as pure. Thanks to Sean McLaughlin for the bug report. * 2007-07-13 - Added MLton.Exn.{default,get,set}TopLevelHandler. * 2007-07-12 - Restored native option to -codegen flag. * 2007-07-11 - Fixed bug in Real32.toInt: conversion of real values close to Int.maxInt could be incorrect. * 2007-07-07 - Updates to bytecode code generator: support for amd64-* targets, support for profiling (including exception history). - Fixed bug in Socket module of Basis Library; unmarshalling of socket options (for get* functions) used andb rather than orb. Thanks to Anders Petersson for the bug report (and patch). * 2007-07-06 - Fixed bug in Date module of Basis Library; some functions would erroneously raise Date when given a year <= 1900. Thanks to Joe Hurd for the bug report. - Fixed a long-standing bug in monomorphisation pass. Thanks to Vesa Karvonen for the bug report. * 2007-05-18 - Native amd64 code generator for amd64-* targets. - Eliminate native option from -codegen flag. - Add x86 and amd64 options to -codegen flag. * 2007-04-29 - Improved type checking of RSSA and Machine ILs. * 2007-04-14 - Fixed aliasing issues with basis/Real/*.c files. - Added real/word casts in MLton structure. * 2007-04-12 - Added primitives for bit cast of word to/from real. - Implement PackReal{Big,Little} using PackWord{Big,Little} and bit casts. * 2007-04-11 - Move all system header #include-s to platform/ os headers. - Use C99 , rather than custom "assert.{h,c}". * 2007-03-13 - Implement PackWord{Big,Little} entirely in ML, using an ML byte swap function. * 2007-02-25 - Change amd64-* target platforms from 32-bit compatability mode (i.e., -m32) to 64-bit mode (i.e., -m64). Currently, only the C codegen is able to generate 64-bit executables. * 2007-02-23 - Removed expert command line switch -coalesce . - Added expert command line switch -chunkify {coalesce|func|one}. * 2007-02-20 - Fixed bug in PackReal.toBytes. Thanks to Eric McCorkle for the bug report (and patch). * 2007-02-18 - Added command line switch -profile-val, to profile the evaluation of val bindings; this is particularly useful with exception history for debugging uncaught exceptions at the top-level. * 2006-12-29 - Added command line switch -show {anns|path-map} and deprecated command line switch -show-anns {false|true}. Use -show path-map to see the complete MLB path map as seen by the compiler. * 2006-12-20 - Changed the output of command line switch -stop f to include mlb-files. This is useful for generating Makefile dependencies. The old output is easy to recover if necessary (e.g. grep -v '\.mlb$'). * 2006-12-8 - Added command line switches -{,target}-{as,cc,link}-opt-quote, which pass their argument as a single argument to gcc (i.e., without tokenization at spaces). These options support using headers and libraries (including the MLton runtime headers and libraries) from a path with spaces. * 2006-12-02 - Extensive reorganization of garbage collector, runtime system, and Basis Library implementation. (This is in preparation for future 64bit support.) They should be more C standards compliant and easier to port to new systems. - FFI revisions Disallow nested indirect types (e.g., int array array). * 2006-11-30 - Fixed a bug in elaboration of FFI forms; unary FFI types (e.g., array, ref, vector) could be used in places where MLton.Pointer.t was required. This would later cause the compiler to raise the TypeError exception, along with a lot of XML IL. * 2006-11-19 - On *-darwin, work with GnuMP installed via Fink or MacPorts. * 2006-10-30 - Ported to x86-darwin. * 2006-09-23 - Added missing specification of find to the MONO_VECTOR signature. * 2006-08-03 - Fixed a bug in the "useless" SSA optimization, caused by calling an imported C function and then ignoring the result. * 2006-06-24 - Fixed a bug in pass to flatten data structures. Thanks to Joe Hurd for the bug report. * 2006-06-08 - Fixed a bug in the native codegen's implementation of the C-calling convention. * 2006-05-11 - Ported to PowerPC-AIX. - Fixed a bug in the runtime for the cases where nonblocking IO with sockets was implemented using MSG_DONTWAIT. This flag does not exist on AIX, Cygwin, HPUX, and MinGW and was previously just ignored. Now the runtime simulates the flag for these platforms (except MinGW, yet, where it's still ignored). * 2006-05-06 - Added -default-type '' for specifying the binding of default types in the Basis Library (e.g., Int.int). * 2006-04-25 - Ported to HPPA-HPUX. - Fixed PackReal{,32,64}{Big,Little} to follow the Basis Library specification. * 2006-04-19 - Fixed a bug in MLton.share that could cause a segfault. * 2006-03-30 - Changed MLton.Vector.unfoldi to return the state in addition to the result vector. * 2006-03-30 - Added MLton.Vector.create, a more powerful vector-creation function than is available in the basis library. * 2006-03-04 - Added MLRISC from SML/NJ 110.57 to standard distribution. * 2006-03-03 - Fixed bug in SSA simplifier that could eliminate an irredundant test. * 2006-03-02 - Ported a bugfix from SML/NJ for a bug with the combination of withNack and never in CML. * 2006-02-09 - Support compiler specific annotations in ML Basis files. If an annotation contains ":", then the text preceding the ":" is meant to denote a compiler. For MLton, if the text preceding the ":" is equal to "mlton", then the remaining annotation is scanned as a normal annotation. If the text preceding the ":" is not-equal to "mlton", then the annotation is ignored, and no warning is issued. * 2006-02-04 - Fixed bug in elaboration of functors; a program with a very large number of functors could exhibit the error "ElaborateEnv.functorClosure: firstTycons". -------------------------------------------------------------------------------- Here are the changes from version 20041109 to version 20051202. Summary: + New license: BSD-style instead of GPL. + New platforms: o hppa: Debian Linux. o x86: MinGW. + Compiler. o improved exception history. o Command-line switches. * Added: -as-opt, -mlb-path-map, -target-as-opt, -target-cc-opt. * Deprecated: none. * Removed: -native, -sequence-unit, -warn-match, -warn-unused. + Language. o FFI syntax changes and extensions. * Added: _symbol. * Changed: _export, _import. * Removed: _ffi. o ML Basis annotations. * Added: allowFFI, nonexhaustiveExnMatch, nonexhaustiveMatch, redundantMatch, sequenceNonUnit. * Deprecated: allowExport, allowImport, sequenceUnit, warnMatch. + Libraries. o Basis Library. * Added: Int1, Word1. o MLton structure. * Added: Process.create, ProcEnv.setgroups, Rusage.measureGC, Socket.fdToSock Socket.Ctl.getError. * Changed: MLton.Platform.Arch. o Other libraries. * Added: ckit library, ML-NLFFI library, SML/NJ library. + Tools. o updates of mllex and mlyacc from SML/NJ. o added mlnlffigen. o profiling supports better inclusion/exclusion of code. * 2005-11-19 - Updated SML/NJ Library and CKit Library from SML/NJ 110.57. * 2005-11-15 - Fixed a bug in MLton.ProcEnv.setgroups. * 2005-11-11 - Fixed a bug in the interleaving of lexing/parsing and elaborating of ML Basis files, which would raise an unhandled Force exception on cyclic basis references. Thanks to John Dias for the bug report. * 2005-11-10 - Fixed two bugs in Time.scan. One would raise Time on a string with a large fractional component. Thanks to Carsten Varming for the bug report. The other failed to scan strings with an explicit sign followed by a decimal point. * 2005-11-03 - Removed MLton.GC.setRusage. - Added MLton.Rusage.measureGC. * 2005-09-11 - Fixed bug in display of types with large numbers of type variables, which could cause unhandled exception Chr. * 2005-09-08 - Fixed bug in type inference of flexible records that would show up as "Type error: variable applied to wrong number of type args". * 2005-09-06 - Fixed bug in Real.signBit, which had assumed that the underlying C signbit returned 0 or 1, when in fact any nonzero value is allowed to indicate the signbit is set. * 2005-09-05 - Added -mlb-path-map switch. * 2005-08-25 - Fixed bug in MLton.Finalizable.touch, which was not keeping alive finalizable values in all cases. * 2005-08-18 - Added SML/NJ Library and CKit Library from SML/NJ 110.55 to standard distribution. - Fixed bug in Socket.Ctl.*, which got the endianness wrong on big-endian machines. Thanks to Wesley Terpstra for the bug report and fix. - Added MLton.GC.setRusage. - Fixed bug in mllex, which had file positions starting at 2. They now start at zero. * 2005-08-15 - Fixed bug in LargeInt.scan, which should skip leading "0x" and "0X". Thanks to Wesley Terpstra for the bug report and fix. * 2005-08-06 - Additional revisions of FFI. Deprecated _export with incomplete annotation. Added _address for address of C objects. Eliminated address component of _symbol. Changed the type of the _symbol* expression. See documentation for more detail. * 2005-08-06 - Annotation changes. Deprecated: sequenceUnit Added: sequenceNonUnit * 2005-08-03 - Annotation changes. Deprecated: allowExport, allowImport, warnMatch Added: allowFFI, nonexhaustiveExnMatch, nonexhaustiveMatch, redundantMatch * 2005-08-01 - Update mllex and mlyacc with SML/NJ 110.55+ versions. This incorporates a small number of minor bug fixes. * 2005-07-23 - Fixed bug in pass to flatten refs into containing data structure. * 2005-07-23 - Overhaul of FFI. Deprecated _import of C base types. Added _symbol for address, getter, and setter of C base types. See documentation for more detail. * 2005-07-21 - Update mllex and mlyacc with SML/NJ 110.55 versions. This incorporates a small number of minor bug fixes. * 2005-07-20 - Fixed bug in front end that allowed unary constructors to be used without an argument in patterns. * 2005-07-19 - Eliminated _ffi, which has been deprecated for some time. * 2005-07-14 - Fixed bug in runtime that caused getrusage to be called on every GC, even if timing info isn't needed. * 2005-07-13 - Fixed bug in closure conversion tickled by making a weak pointer to a closure. * 2005-07-12 - Changed {OS,Posix}.Process.sleep to call nanosleep() instead of sleep(). - Added MLton.ProcEnv.setgroups. * 2005-07-11 - InetSock.{any,toAddr} raise SysErr if port is not in [0, 2^16). * 2005-07-02 - Fixed bug in Socket.recvVecFrom{,',NB,NB'}. The type was too polymorphic and allowed the creation of a bogus sock_addr. * 2005-06-28 - The front end now reports errors on encountering undefined or cyclicly defined MLB path variables. * 2005-05-22 - Fixed bug in Posix.IO.{getlk,setlk,setlkw} that caused a link-time error: undefined reference to Posix_IO_FLock_typ. - Improved exception history so that the first entry in the history is the source position of the raise, and the rest is the call stack. * 2005-05-19 - Improved exception history for Overflow exceptions. * 2005-04-20 - Fixed a bug in pass to flatten refs into containing data structure. * 2005-04-14 - Fixed a front-end bug that could cause an internal bug message of the form "missing flexInst". * 2005-04-13 - Fixed a bug in the representation of flat arrays/vectors that caused incorrect behavior when the element size was 2 or 4 bytes and there were multiple components to the element (e.g. (char * char) vector). * 2005-04-01 - Fixed a bug in GC_arrayAllocate that could cause a segfault. * 2005-03-22 - Added structures Int1, Word1. * 2005-03-19 - Fixed a bug that caused Socket.Ctl.{get,set}LINGER to raise Subscript. The problem was in the use of PackWord32Little.update, which scales the supplied index by bytesPerElem. * 2005-03-13 - Fixed a bug in CML mailboxes. * 2005-02-26 - Fixed an off-by-one error in mkstemp defined in mingw.c. * 2005-02-13 - Added mlnlffigen tool (heavily adapted from SML/NJ). * 2005-02-12 - Added MLNLFFI Library (heavily adapted from SML/NJ) to standard distribution. * 2005-02-04 - Fixed a bug in OS.path.toString, which did not raise InvalidArc when needed. * 2005-02-03 - Fixed a bug in OS.Path.joinDirFile, which did not raise InvalidArc when passed a file that was not an arc. * 2005-01-26 - Fixed a front end bug that incorrectly rejected expansive valbinds with useless bound type variables. * 2005-01-22 - Fixed x86 codegen bug which failed to account for the possibility that a 64-bit move could interfere with itself (as simulated by 32-bit moves). * 2004-12-22 - Fixed Real32.fmt StringCvt.EXACT, which had been producing too many digits of precision because it was converting to a Real64.real. * 2004-12-15 - Replaced MLB path variable MLTON_ROOT with SML_LIB, to use a more compiler-independent name. We will keep MLTON_ROOT aliased to SML_LIB until after the next release. * 2004-12-02 - Unix.create now works on all platforms (including Cygwin and MinGW). * 2004-11-24 - Added support for MLton.Process.create, which works on all platforms (including Windows-based ones like Cygwin and MinGW) and allows better control over std{in,out,err} for child process. -------------------------------------------------------------------------------- Here are the changes from version 20040227 to 20041109. Summary: + New platforms: o x86: FreeBSD 5.x, OpenBSD o PowerPC: Darwin (MacOSX) + Support for MLBasis files. + Support for dynamic libraries. + Support for Concurrent ML (CML). + New structures: Int2, Int3, ..., Int31 and Word2, Word3, ..., Word31. + A new form of profiling, -profile count. + A bytecode generator. + Data representation improvements. + MLton structure changes. o Added: share, shareAll o Changed: Exn, IntInf, Signal, Thread. + Command-line switch changes. o Deprecated: -native (use -codegen) -sequence-unit (use -default-ann) -warn-match (use -default-ann) -warn-unused (use -default-ann) o Removed: -detect-overflow -exn-history (use -const) -safe -show-basis-used o Added: -codegen -const -default-ann -disable-ann -profile-branch -target-link-opt * 2004-09-22 - Extended _import to support indirect function calls. * 2004-09-13 - Made Date.{fromString,scan} accept a space (treated as zero) in the first character of the day of the month. * 2004-09-12 - Fixed bug in IntInf that could cause a seg fault. - Remove MLton.IntInf.size. * 2004-09-05 - Made -detect-overflow and -safe expert options. * 2004-08-30 - Added val MLton.share: 'a -> unit, which maximizes sharing in a heap object. * 2004-08-27 - Fixed bug in Real.toLargeInt. It would incorrectly raise Option instead of Overflow in the case when the real was not an INF, but rounding produced an INF. - Fixed bugs in Date.{fmt,fromString,scan,toString}. They incorrectly allowed a space for the first character in the day of the month. * 2004-08-18 - Changed MLton.{Thread,Signal,World} to distinguish between implicitly and explicitly paused threads. * 2004-07-28 - Added support for programming in the large using the ML Basis system. * 2004-07-11 - Fixed bugs in ListPair.*Eq functions, which incorrectly raised the UnequalLengths exception. * 2004-07-01 - Added val MLton.Exn.addExnMessager: (exn -> string option) -> unit * 2004-06-23 - Runtime system options that take memory sizes now accept a "g" suffix indicating gigabytes. They also now take a real instead of an integer, e.g. fixed-heap 0.5g. They also now accept uppercase, e.g. 150M. * 2004-06-12 - Added support for OpenBSD. * 2004-06-10 - Added support for FreeBSD 5.x. * 2004-05-28 - Deprecated the -native flag. Instead, use the new flag -codegen {native|bytecode|C}. This is in anticipation of adding a bytecode compiler. * 2004-05-26 - Fixed a front-end bug that could cause cascading error to print a very large and unreadable internal bug message of the form "datatype ... realized with scheme Unknown". * 2004-05-17 - Automatically restart functions in the Basis Library that correspond directly to interruptable system calls. * 2004-05-13 - Added -profile count, for dynamic counts of function calls and branches. - Equate the types Posix.Signal.signal and Unix.signal. * 2004-05-11 - Fixed a bug with -basis 1997 that would cause type errors due to differences between types in the MLton structure and types in the rest of the basis library. * 2004-05-01 - Fixed a bug with sharing constraints in signatures that would sometimes mistakenly treat two structures as identical when they shouldn't have been. This would cause some programs to be mistakenly rejected. * 2004-04-30 - Added MLton.Signal.{handled,restart}. * 2004-04-23 - Added Timer.checkCPUTimes, and updated the Timer structure to match the latest basis spec. Also fixed totalCPUTimer and totalRealTimer, which were wrong. * 2004-04-13 - Added MLton.Signal.Mask.{getBlocked,isMember}. * 2004-04-12 - Fix bug that mistakenly generalized variable types containing unknown types when matching against a signature. - Reasonable front-end error message when unification causes recursive (circular) type. * 2004-04-03 - Fixed bug in sharing constraints so that A = B = C means that all pairs AB, AC, BC are shared, not just AB and BC. This matters in some situations. * 2004-03-20 - Fixed Time.now which was treating microseconds as nanoseconds. * 2004-03-14 - Fixed SSA optimizer bug that could cause the error " has no tyconInfo property". * 2004-03-11 - Fixed Time.fromReal to raise Time, not Overflow, on unrepresentable times. * 2004-03-04 - Added structures Word2, Word3, ..., Word31. * 2004-03-03 - Added structures Int2, Int3, ..., Int31. - Fixed bug in elaboration of "and" with signatures, structures, and functors so that it now evaluates all right-hand sides before binding any left-hand sides. -------------------------------------------------------------------------------- Here are the changes from version 20030716 to 20040227. Summary: + The front end now follows the Definition of SML and produces readable error messages. + Added support for NetBSD. + Basis library changes tracking revisions to the specification. + Added structures: Int64, Real32, Word64. + File positions use Int64. + Major improvements to -show-basis, which now displays the basis in a very readable way with full type information. + Command-line switch changes. o Deprecated: -basis. o Removed: -lib-search, -link, -may-load-world, -static. o Added: -link-opt, -runtime, -sequence-unit, -show-def-use, -stop tc, -warn-match, -warn-unused. o Changed: -export-header, -show-basis, -show-basis-used. o Renamed: -host to -target. + FFI changes. o Renamed _ffi as _import. o Added cdecl and stdcall attributes to _import and _export expressions. + MLton structure changes. o Added: Pointer. o Removed: Ptrace. o Changed: Finalizable, IntInf, Platform, Random, Signal, Word. * 2004-02-16 - Changed -export-header, -show-basis, -show-basis-used to take a file name argument, and they no longer force compilation to halt. - Added -show-def-use and -warn-unused, which deal with def-use information. * 2004-02-13 - Added flag -sequence-unit, which imposes the constraint that in the sequence expression (e1; e2), e1 must be of type unit. * 2004-02-10 - Lots of changes to MLton.Signal: name changes, removal of superfluous functions, additional functions. * 2004-02-09 - Extended -show-basis so that when used with an input program, it shows the basis defined by the input program. - Added "stop" runtime argument. - Made -call-graph {false|true} an option to mlprof that determines whether or not a call graph file is written. * 2004-01-20 - Fixed a bug in IEEEReal.{fromString,scan}, which would improperly return INF instead of ZERO for things like "0.0000e123456789012345". - Fixed a bug in Real.{fromDecimal,fromString,scan}, which didn't return an appropriately signed zero for ~0.0. - Fixed a bug in Real.{toDecimal,fmt}, which didn't correctly handle ~0.0. - Report a compile-time error on unrepresentable real constants. * 2004-01-05 - Removed option -may-load-world. You can now use -runtime no-load-world instead. - Removed option -static. You can now use -link-opt -static instead. - Changed MLton.IntInf.size to return 0 instead of 1 on small ints. * 2003-12-28 - Fixed horrible bug in MLton.Random.alphaNumString that caused it to return 0 for all characters beyond position 11. * 2003-12-17 - Removed -basis as a normal flag. It is still available as an expert flag, but its use is deprecated. It will almost certainly disappear after the next release. * 2003-12-10 - Allow multiple @MLton -- runtime args in sequnce. This makes it easier for scripts to prefix @MLton args without having to splice them with other ones. * 2003-12-04 - Added support for files larger than 2G. This included changing Position from Int32 to Int64. * 2003-12-01 - Added structure MLton.Pointer, which includes a type t for pointers (memory addresses, not SML heap pointers) and operations for loading from and storing to memory. * 2003-11-03 - Fixed Timer.checkGCTime so that only the GC user time is included, not GC system time. * 2003-10-13 - Added -warn-match to control display nonexhaustive and redundant match warnings. - Fixed space leak in StreamIO causing the entire stream to be retained. Thanks to Jared Showalter for the bug report and fix. * 2003-10-10 - Added "-stop tc" switch to stop after type checking. * 2003-09-25 - Fixed Posix.IO.getfl, which had mistakenly called fcntl with F_GETFD instead of F_GETFL. - Tracking basis library changes: o Socket module datagram functions no longer return amount written, since they always write the entire amount or fail. So, send{Arr,Vec}To{,'} now return unit instead of int. o Added nonblocking versions of all the send and recv functions, as well as accept and connect. So, we now have: acceptNB, connectNB, recv{Arr,Vec}{,From}NB{,'}, send{Arr,Vec}{,To}NB{,'} * 2003-09-24 - Tracking basis library changes: o TextIO.inputLine now returns a string option. o Slices used in Byte, PRIM_IO, PrimIO, Posix.IO, StreamIO o Posix.IO.readVec raises Size, not Subscript, with negative argument. * 2003-09-22 - Fixed Real.toManExp so that the mantissa is in [0.5, 1), not [1, 2). The spec says that 1.0 <= man * radix < radix, which since radix is 2, implies that the mantissa is in [0.5, 1). - Added Time.{from,to}Nanoseconds. * 2003-09-11 - Added Real.realRound. - Added Char{Array,Vector}Slice to Text. * 2003-09-11 - OS.IO.poll and Socket.select now raise errors on negative timeouts. - Time.time is now implemented using IntInf instead of Int, which means that a much larger range of time values is representable. * 2003-09-10 - Word64 is now there. * 2003-09-09 - Replaced Pack32{Big,Little} with PackWord32{Big,Little}. - Fixed bug in OS.FileSys.fullPath, which mistakenly stopped as soon as it hit a symbolic link. * 2003-09-08 - Fixed @MLton max-heap, which was mistakenly ignored. Cleaned up @MLton fixed-heap. Both fixed-heap and max-heap can use copying or mark-compact collection. * 2003-09-06 - Int64 is completely there. - Fixed OS.FileSys.tmpName so that it creates the file, and doesn't use tmpnam. This eliminates an annoying linker warning message. * 2003-09-05 - Added structures {LargeInt,LargeReal,LargeWord,Word} {Array,Array2,ArraySlice,Vector,VectorSlice} - Fixed bug in Real.toDecimal, which return class NORMAL for subnormals. - Fixed bug in Real.toLargeInt, which didn't return as precise an integer as possible. * 2003-09-03 - Lots of fixes to Real functions. o Real32 is now completely in place, except for Real32.nextAfter on SunOS. o Fixed Real.Math.exp on x86 to return the right value when applied to posInf and negInf. o Changed Real.Math.{cos,sin,tan} on x86 to always use a call to the C math library instead of using the x86 instruction. This eliminates some anomalies between compiling -native false and -native true. o Change Real.Math.pow to handle exceptional cases in the SML code. o Fixed Real.signBit on Sparcs. * 2003-08-28 - Fixed PackReal{,64}Little to work correctly on Sparc. - Added PackReal{,64}Big, PackReal32{Big,Little}. - Added -runtime switch, which passes arguments to the runtime via @MLton. These arguments are processed before command line switches. - Eliminated MLton switch -may-load-world. Can use -runtime combined with new runtime switch -no-load-world to disable load world in an executable. * 2003-08-26 - Changed -host to -target. - Split MLton.Platform.{arch,os} into MLton.Platform.{Arch,OS}.t. * 2003-08-21 - Fixed bug in C codegen that would cause undefined references to Real_{fetch,move,store} when compiling on Sparcs with -align 4. * 2003-08-17 - Eliminated -link and -lib-search, which are no longer needed. Eliminated support for passing -l*, -L*, and *.a on the command line. Use -link-opt instead. * 2003-08-16 - Added -link-opt, for passing options to gcc when linking. * 2003-07-19 - Renamed _ffi as _import. The old _ffi will remain for a while, but is deprecated and should be replaced with _import. - Added attributes to _export and _import. For now, the only attributes are "cdecl" and "stdcall". -------------------------------------------------------------------------------- Here are the changes from version 20030711 to 20030716. Summary: + Fixed several serious bugs with the 20030711 release. * 2003-07-15 - Fixed bug that caused a segfault when attempting to create an array that was too large, e.g 1 + Array.sub (Array.tabulate (valOf Int.maxInt, fn i => i), 0) - mlton now checks the command line arguments following the file to compile that are passed to the linker to make sure they are reasonable. * 2003-07-14 - Fixed packaging for Cygwin and Sparc to include libgmp.a. - Eliminated bootstrap target. The Makefile automatically determines whether to bootstrap or not. - Fixed XML type checker bug that could cause error: empty tyvars in PolyVal dec. * 2003-07-12 - Turned off FORCE_GENERATIONAL in gc. It had been set, which caused the gc to always use generational collection. This could seriously slow apps down that don't need it. -------------------------------------------------------------------------------- Here are the changes from version 20030312 to 20030711. Summary: + Added support for Sparc/SunOS using the C code generator. + Completed the basis library implementation. At this point, the only missing basis library function is "use". + Added _export, which allows one to call SML functions from C. + Added weak pointers (via MLton.Weak) and finalization (via MLton.Finalizable). + Added new integer modules: Int8, Int16. + Better profiling call graphs + Fixed conversions between reals and their decimal representations to be correct using the gdtoa library. * 2003-07-07 - Profiling improvements o Eliminated mlton -profile-split. Added mlprof -split. Now the profiling infrastructure keeps track of the splits and allows one to decide which splits to make (if any) when mlprof is run, which is much better than having to decide at compile time. o Changed mlprof -graph to mlprof -keep, and changed the behavior so that -keep also controls which functions are displayed in the table. o Eliminated mlprof -ignore: it's behavior is now subsumed by -keep, whose meaning has changed to be more like -ignore on nodes that are not kept. - When calling gcc for linking, put -link args in same order as they appeared on the MLton command line (they used to be reversed). * 2003-07-03 - Making OS.Process.{atExit,exit} conform to the basis library spec in that exceptions raised during cleaners are caught and ignored. Also, calls to exit from cleaners cause the rest of cleaners to run. * 2003-07-02 - Fixed bug with negative IntInf constants that could cause compile time error message: "x86Translate.translateChunk ... strange Offset: base: ..." - Changed argument type of MLton.IntInf.Small from word to int. - Added fix to profiling so that the mlmon.out file is written even when the program terminates due to running out of memory. * 2003-06-25 - Added {Int{8,16},Word8}{,Array,ArraySlice,Vector,VectorSlice,Array2} structures. * 2003-06-25 - Fixed bug in IntInf.sign, which returned the wrong value for zero. * 2003-06-24 - Added _export, for calling from C to SML. * 2003-06-18 - Regularization of options. -diag --> -diag-pass -drop-pass takes a regexp * 2003-06-06 - Fixed bug in OS.IO.poll that caused it to return the input event types polled for instead of what was actually available. * 2003-06-04 - Fixed bug in known case SSA optimization that could case incorrect results in compiled programs. * 2003-06-03 - Fixed bug in SSA optimizer that could cause the error message Type error: Type.equals {from = char vector, to = unit vector} Type error: analyze raised exception loopStatement: ... unhandled exception: TypeError * 2003-06-02 - Fixed Real.rem to work correctly on infs and nans. - Fixed bug in profiling that caused the function name to be omitted on functions defined by val rec. * 2003-05-31 - Fixed Real.{fmt,fromString,scan,toString} to match the basis library spec. - Added IEEEReal.{fromString,scan}. - Added Real.{from,to}Decimal. * 2003-05-25 - Added Real.nextAfter. - Added OS.Path.{from,to}UnixPath, which are the identity function on Unix. * 2003-05-20 - Added type MLton.pointer, the type of C pointers, for use with the FFI. * 2003-05-18 - Fixed two bugs in type inference that could cause the compiler to raise the TypeError exception, along with a lot of XML IL. The type-check.sml regression contains simple examples of what failed. - Fixed a bug in the simplifier that could cause the message: shrinker raised Prim.apply raised assertion failure: SmallIntInf.fromWord * 2003-05-15 - Fixed bug in Real.class introduced on 04-28 that cause many regression failures with reals when using newer gccs. - Replaced MLton.Finalize with MLton.Finalizable, which has a more robust approach to finalization. * 2003-05-13 - Fixed bug in MLton.FFI on Cygwin that caused Thread_returnToC to be undefined. * 2003-05-12 - Added support for finalization with MLton.Finalize. * 2003-05-09 - Fixed a runtime system bug that could cause a segfault. This bug would happen after a GC during heap resizing when copying a heap, if the heap was allocated at a very low (<10M) address. The bug actually showed up on a Cygwin system. * 2003-05-08 - Fixed bug in HashType that raised "Vector.forall2" when the arity of a type constructor is changed by simplifyTypes, but a newly constructed type has the same hash value. * 2003-05-02 - Switched over to new layered IO implementation, which completes the implementation of the BinIO and TextIO modules. * 2003-04-28 - Fixed bug that caused an assertion failure when generating a jump table for a case dispatch on a non-word sized index with non-zero lower bound on the range. * 2003-04-24 - Added -align {4|8}, which controls alignment of objects. With -align 8, memory accesses to doubles are guaranteed to be aligned mod 8, and so don't need special routines to load or store. * 2003-04-22 - Fixed bug that caused a total failure of time profiling with -native false. The bug was introduced with the C codegen improvements that split the C into multiple files. Now, the C codegen declares all profile labels used in each file so that they are global symbols. * 2003-04-18 - Added MLton.Weak, which supports weak pointers. * 2003-04-10 - Replaced the basis library's MLton.hostType with MLton.Platform.arch and MLton.Platform.os. * 2003-04 - Added support for SPARC/SunOS using the C codegen. * 2003-03-25 - Added MLton.FFI, which allows callbacks to SML from C. * 2003-03-21 - Fixed mlprof so that the default -graph arg for data from -profile-stack true is '(thresh-stack x)', not '(thresh x)'. -------------------------------------------------------------------------------- Here are the changes from version 20020923 to 20030312. Summary: + Added source-level profiling of both time and allocation. + Updated basis library to 2002 specification. To obtain the old library, compile with -basis 1997. + Added many modules to basis library: BinPrimIO, GenericSock, ImperativeIO, INetSock, NetHostDB, NetProtDB, NetServDB, Socket, StreamIO, TextPrimIO, UnixSock. + Completed implementation of IntInf and OS.IO. * 2003-02-23 - Replaced -profile-combine wih -profile-split. * 2003-02-11 - Regularization of options. -l --> -link -L --> -lib-search -o --> -output -v --> -verbose * 2003-02-10 - Added option to mlton: -profile-combine {false|true} * 2003-02-09 - Added options to mlprof: -graph-title, -gray, -ignore, -mlmon, -tolerant. * 2002-11 - 2003-01 - Added source-level allocation and time profiling. This includes the new options to mlton: -profile and -profile-stack. * 2002-12-28 - Added NetHostDB,NetProtDB,NetServDB structures. - Added Socket,GenericSock,INetSock,UnixSock structures. * 2002-12-19 - Fixed bug in signal check insertion that could cause some signals to be missed. The fix was to add a signal check on entry to each function in addition to at each loop header. * 2002-12-10 - Fixed bug in runtime that might cause the message Unable to set cardMapForMutator. * 2002-11-23 - Added support for the latest Basis Library specification. - Added option -basis to choose Basis Library version. Currently available basis libraries are 2002, 2002-strict, 1997, and none. - Added IntInf.{orb,xorb,andb,notb,<<,~>>} values. - Added OS.IO.{poll_desc,poll_info} types. - Added OS.IO.{pollDesc,pollToIODesc,infoToPollDesc,Poll} values. - Added OS.IO.{pollIn,pollOut,pollPri,poll,isIn,isOut,isPri} values. - Added BinPrimIO,TextPrimIO structures. - Added StreamIO,ImperativeIO functors. * 2002-11-22 - Fixed bug that caused time profiling to fail (with a segfault) when resuming a saved world. * 2002-11-07 - Fixed bug in MLton.eq that could arise when using eq on functions. * 2002-11-05 - Improvements to polymorphic equality. Equality on IntInfs, vectors, and dataypes all do an eq test first before a more expensive comparison. * 2002-11-01 - Added allocation profiling. Now, can compile with either -profile alloc or -profile time. Renamed MLton.Profile as MLton.ProfileTime. Added MLton.ProfileAlloc. Cleaned up and changed most mlprof option names. * 2002-10-31 - Eliminated MLton.debug. - Fixed bug in the optimizer that affected IntInf.fmt. The optimizer had been always using base 10, instead of the passed in radix. * 2002-10-22 - Fixed Real.toManExp so that the mantissa is in [1, 2), not [0.5, 1). - Added Real.fromLargeInt, Real.toLargeInt. - Fixed Real.split, which would return an incorrect whole part due to the underlying primitive, Real_modf, being treated as functional instead of side-effecting. * 2002-09-30 - Fixed rpath problem with packaging. All executables in packages previously made had included a setting for RPATH. -------------------------------------------------------------------------------- Here are the changes from version 20020410 to 20020923. Summary: + MLton now runs on FreeBSD. + Major runtime system improvements. The runtime now implements mark-compact and generational collection, in addition to the copying collection that was there before. It automatically switches between the the collection strategies to improve performance and to try to avoid paging. + Performance when compiling "-exn-history true" has been improved. + Added IntInf.log2, MLton.GC.pack, MLton.GC.unpack. + Fixed bug in load world that could cause "sread failed" on Cygwin. + Fixed optimizer bug that could cause "no analyze var value property" message. * 2002-09 - Integrated Sam Rushing's changes to port MLton to FreeBSD. * 2002-08-25 - Changed the implementation of exception history to be completely functional. Now, the extra field in exceptions (when compiling -exn-history true) is a string list instead of a string list ref, and raise conses a new exception with a new element in the list instead of assigning to the list. This changes the semantics of exception history (for the better) on some programs. See regression/exnHistory3.sml for an example. It also significantly improves performance when compiling -exn-history true. * 2002-07 and 2002-08 - Added generational GC, and code to the runtime that automatically turns it on and off. * 2002-08-20 - Fixed SSA optimizer bug that could cause the following error message x_0 has no analyze var value property * 2002-07-28 - Added MLton.GC.{pack,unpack}. pack shrinks the heap so that other processes can use the RAM, and its dual, unpack, resizes the heap to the desired size. * 2002-06 and 2002-07 - Added mark compact GC. - Changed array layout so that arrays have three, not two header words. The new word is a counter word that preceeds the array length and header. - Changed all header words to be indices into an array of object descriptors. * 2002-06-27 - Added patches from Michael Neumann to port runtime to FreeBSD 4.5. * 2002-06-05 - Output file and intermediate file are now saved in the current directory instead of in the directory containing the input file. * 2002-05-31 - Fixed bug in overloading of / so that the following now type checks: fun f (x, y) = x + y / y * 2002-04-26 - Added back max-heap runtime option. * 2002-04-25 - Fixed load/save world so that they use binary mode. This should fix the "sread failed" problem that Byron Hale saw on Cygwin that caused mlton to fail to start. - Added IntInf.log2. - Changed call to linker to use libgmp.a (if it exists) instead of libgmp.so. This is because the linker adds a dependency to a shared library even if there are no references to it * 2002-04-23 - Rewrote heap resizing code. This fixed bug that was triggered with large heaps and could cause a spurious out of memory error. - Removed gmp from MLton sources (again :-). -------------------------------------------------------------------------------- Here are the changes from version 20011006 to version 20020410. * 2002-03-28 - Added BinIO. * 2002-03-27 - Regularization of options -g --> -degug {false|true} -h n --> -fixed-heap n -p --> -profile {false|true} * 2002-03-22 - Set up the stubs so that MLton can be compiled in the standard basis library, with no MLton structure. Thus it is now easy to compile MLton with an older (or newer) version of itself that has a different MLton structure. * 2002-03-17 - Added MLton.Process.{spawn,spawne,spawnp}, which use primitives when running on Cygwin and fork/exec when running on Linux. * 2002-02 - 2002-03 - Added the ability to cross-compile to Cygwin/Windows. * 2002-02-24 - Added gmp back for use with Cygwin. * 2002-02-10 - Reworked object header words so that Array.maxLen = valOf Int.maxInt. Also fixed a long-standing minor bug in MLton, where Array.array (Array.maxLen, ...) would raise Size instead of attempting to allocate the array. It was an off-by-one error in the meaning of Array.maxLen. * 2002-02-08 - Modifications to runtime to behave better in situations where the amount of live data is a signifant fraction of the amount of RAM, based on code from PolySpace. MLton executables by default can now use more than the available amount of RAM. Executables will still respect the max-heap runtime arg if it is set. * 2002-02-04 - Improvements to runtime so that it fails to get space, it attempts to get less space instead of failing. Based on PolySpace's modifications. - Added MLton.eq. * 2002-02-03 - Added MLton.IntInf.gcd. - Removed gmp from MLton sources. We now link with /usr/lib/gmp.a. - Added TextIO.getPosOut. - Renamed type MLton.Itimer.which to MLton.Itimer.t and MLton.Itimer.whichSignal to MLton.Itimer.signal. - Added -coalesce flag, for use with the C backend. * 2002-01-26 - Added -show-basis-used, which prints out the parts of the basis library that the input program uses. - Changed several other flags (-print-at-fun-entry, -show-basis, -static) to follow the {false|true} convention. * 2002-01-22 - Improved MLton.profile so that multiple profile arrays can exist simultaneously and so that the current one being used can be set from the SML side. * 2002-01-18 - The MACHINE IL has been replaced with an RSSA (representation explicit SSA) IL and an improved MACHINE IL. * 2002-01-16 - Added known case SSA optimization * 2002-01-14 - Added rudimentary profiling control from with a MLton compile program via the MLton.Profile structure. * 2002-01-09 - Fixed bug in match compiler that caused case expressions on datatypes with redundant cases to be compiled incorrectly. * 2002-01-08 - Added redundant tuple construction elimination to SSA shrinker. - Improved flatten SSA optimization. * 2001-12-06 - Changed the interface for MLton.Signal. There is no longer a separate Handler substructure. This was done so that programs that just use default and ignore signal handlers don't bring in the entire thread mechanism. * 2001-12-05 - Added local ref elimination SSA optimization. * 2001-11-19 - The CPS IL has been replaced with an SSA (static-single assignment) IL. All of the optimizations have been ported from CPS to SSA. * 2001-10-24 - Fixed bug in Thread_atomicEnd -- limit was mistakenly set to base instead of to 0. This caused assertion failures when for executables compiled -g because GC_enter didn't reset the limit. - Fixed bug in register allocation of byte registers. * 2001-10-23 - Added -D option to cmcat for preprocessor defines. Thanks to Anoq for sending the code. - Changed limit check insertion so that limit checks are only coalesced within a single basic block -- not across blocks. This slows many benchmarks down, but is needed to fix a bug in the way that limit checks were coalesced across blocks. Hopefully we will figure out a better fix soon. * 2001-10-18 - Fixed type inference of flexrecord so that it now follows the Definition. Many programs containing flexrecords were incorrectly rejected. Added many new tests to regression/flexrecord.sml. - Changed the behavior of -keep dot combined with -keep pass for SSA passes. Dot files are now saved for the program before and after, instead of just after. * 2001-10-11 - Fixed a bug in the type inference that caused type variables to be mistakenly generalized. The bug was exposed in Norman Ramsey's sled.sml. Added a test to regression/flexrecord.sml to catch the problem. -------------------------------------------------------------------------------- Here are the changes from version 20010806 to version 20011006. Summary: + Added MLton.Exn.history, which is similar to SMLofNJ.exnHistory. + Support for #line directives of the form (*#line line.col "file"*). + Performance improvements in native codegenerator. + Bug fixes in front-end, optimizer, register allocator, Real.{maxFinite, minPos, toManExp}, and in heap save and restore. * 2001-10-5 - Fixed a bug in polymorphic layered patterns, like val 'a a as b = [] These would always fail due to the variable "a" not being handled correctly. - Fixed the syntax of "val rec" so that a pattern is allowed on the left-hand side of the =. Thus, we used to reject, but now accept, the following. val rec a as b as c = fn _ => () val rec a : unit -> unit : unit -> unit = fn () => () Thanks again to Andreas Rossberg's test files. This is now tested for in valrec.sml. - Fixed dynamic semantics of "val rec" so that if "val rec" is used to override constructor status, then at run time, the Bind exception is raised as per rule 126 of the Definition. So, for example, the following program type checks and compiles, but raises Bind at run time. val rec NONE = fn () => () val _ = NONE () Again, this is checked in valrec.sml. - Added '\r\n' to ml.lex so that Windows style newlines are acceptable in input files. * 2001-10-4 - Fixed bug in the implementation of "open" declarations, which in the case of "open A B" had opened A and then looked up B in the resulting environment. The correct behaviour (see rule 22 of the Definition) is to lookup each longstrid in the current environment, and then open them all in sequence. This is now checked for in the open.sml regression test. Thanks to Andreas Rossberg for pointing this bug out. - Fixed bug that caused tyvars of length 1 (i.e. ') to be rejected. This is now checked in the id.sml regression test. Again, thanks to Andreas Rossberg for the test. * 2001-10-2 - Fixed bugs in Real.toManExp (which always returned the wrong result because the call to frexp was not treated as side-effecting by the optimizer) and in Real.minPos, which was zero because of a mistake with extra precision bits. * 2001-10-1 - Added MLton.Exn.history. - Fixed register allocation bug with fucom instruction. Was allowing fucomp when the first source was not removable. - Changed Real.isFinite to use the C math.h finite function. This fixed the nontermination bug which occurred in any program that used Real.maxFinite. * 2001-9-22 - Bug fixes found from Ramsey's lrtl in contify.fun and unused-args.fun, both of which caused compile-time exceptions to be raised. * 2001-9-21 - Fixed MLton.World.{load,save} so that the saved world does not store the max heap size. Instead, the max heap size is computed upon load world in exactly the same way as at program startup. This fixes a long-standing (but only recently noticed) problem in which mlton (which uses a saved world) would attempt to use as much memory as was on the machine used to build world.mlton. * 2001-8-29 - Overlow checking is now on by default in the C backend. This is a huge performance hit, but who cares, since we never use the C backend except for testing anyways. * 2001-8-22 - Added support for #line directives of the form (*#line line.col "file"*) These directives only affect error messages produced by the parser and elaborator. * 2001-8-17 - Fixed bug in removeUnused optimzation that caused the following program to fail to compile. fun f l = case l of [] => f l | _ :: l => f l val _ = f [13] * 2001-8-14 - New x86-codegen infrastructure. o support for tracking liveness of stack slots and carrying them in registers across basic blocks o more specific Entry and Transfer datatypes to make calling convention distinctions more explicit o new heuristic for carrying values in registers across basic blocks (look Ma, no Overflows!) o new "predict" model for generating register allocation hints o additional bug fixes * 2001-8-7 - MLton.Socket.shutdownWrite flushes the outstream. -------------------------------------------------------------------------------- Here are the changes from version 20010706 to version 20010806. Summary: + Word.andb (w, 0xFF) now works correctly + MLton.Rusage.rusage has a patch to work around a linux kernel bug + Programs of the form "exp ; program" are now accepted + Added the "MLton.Rlimit" structure + Added the "-keep dot" flag, which produces call graphs, intraprocedural control-flow graphs, and dominator trees * 2001-8-6 - Added simple common block elimination CPS optimization. * 2001-8-2 - Took out -keep il. * 2001-7-31 - Performance improvements to TextIO.{input, output, output1} * 2001-7-25 - Added redundant-test elimination CPS optimization. * 2001-7-21 - Added common-subexpression elimination CPS optimization. * 2001-7-20 - Bug fix to x86 codegen. The commuteBinALMD peephole optimization would rewrite mov 2,Y; add Y,Y as mov Y,Y; add 2,Y. Now the appropriate interference checks are made. - Added intraprocedural unused argument removal. - Added intraprocedural flattener. This avoids some stupid tuple allocations in loops. Decent speedup on a few benchmarks (count-graphs, psdes-random, wc-scanStream) and no noticeable slowdowns. - Added -keep dot flag. * 2001-7-17 - Modified grammar to properly handle val rec. There were several problems. o MLton had accepted "val rec 'a ..." instead of "val 'a rec ..." o MLton had not accepted "val x = 13 and rec f = fn () => ()" o MLton had not accepted "val rec rec f = fn () => ()" o MLton had not accepted "val rec f = fn () => () and rec g = fn () => ()" * 2001-7-16 - Workaround for Linux kernel bug that can cause getrusage to return a wrong system time value (low by one second). See fixedGetrusage in gc.c. - Bug fix to x86 codegen. The register allocator could get confused when doing comparisons of floating point numbers and use the wrong operand. The bug seems to have never been detected because it only happens when both of the operands are already on the floating point stack, which is rare, since one is almost always in memory since we don't carry floating point values in the stack across basic blocks. - Added production to the grammar on page 58 of the Definition that had been missing from MLton since day one. program ::= exp ; Also updated docs to reflect change. - Modified grammar to accept the empty program. - Added -type-check expert flag to turn on type checking in ILs. * 2001-7-15 - Bug fix to the algebraic simplifier. It had been rewriting Word32.andb (w, 0wxFF) to w instead of Word32.andb (w, 0wxFFFFFFFF) to w. * 2001-7-13 - Improved CPS shrinker so that if-tests where the then and else branch jump to the same label is turned into a direct jump. - Improved CPS shrinker (Prim.apply) to handle constructors A = A --> true A = B --> false A x = B y --> false - Rewrote a lot of loops in the basis library to use inequalities instead of equality for the loop termination test so that the (forthcoming) overflow detection elimination will work on the loop index variable. * 2001-7-11 - Fixed minor bugs in Array2.{array,tabulate}, Substring.{slice} that caused the Overflow exception to be raised instead of Size or Subscript - Fixed bug in Pack32Big.update that caused the wrong location to be updated. - Fixed several bugs in Pack32{Big,Little}.{subArr,subVec,update} that caused Overflow to be raised instead of Subscript. Also, improved the implementation so that bounds checking only occurs once per call (instead of four times, which was sometimes happening. - Fixed bugs in Time.{toMilliseconds,toMicroseconds} that could cause a spurious Overflow exception. - Fixed bugs in Time.{fromMilliseconds,fromMicroseconds} that could cause a spurious Time exception. - Improved Pack32.sub* by reordering the orbs. - Improved {Int,IntInf}.mod to increase chances of constant folding. - Switched many uses of +, -, * in basis library to the non-overflow checked versions. Modules changed were: Array, Array2, Byte, Char, Int, IntInf, List, Pack32{Big,Little}, Util, String, StringCvt, Substring, TextIO, Time, Vector. - Added regression tests for Array2, Int (overflow checking), Pack32, Substring, Time. - Changed CPS output so that it includes a dot graph for each CPS function. * 2001-7-9 - Change OS.Process.exit so that it raises an exception if the exit status is not in [0, 256). - Added MLton.Rlimit to provide access to getrlimit and setrlimit. -------------------------------------------------------------------------------- Here are the changes from the 20000906 version to the 20010706 version. Summary: + Native X86 code generator (instead of using gcc) + Significantly improved compile times + Significantly improved run times for generated executables + Many bug fixes + Correct raising of the Overflow exception for integer arithmetic + New modules in the MLton structure * 2001-7-6 - GC mods from Henry. Mostly adding inline declarations. * 2001-7-5 - Fixed several runtime bugs involving threads, critical sections, and signals. * 2001-6-29 - Fixed performance bug in cps/two-point-lattice.fun that caused quadratic behavior. This affects the raise-to-jump and useless analayses. In particular, the useless analysis was blowing up when compiling fxp. * 2001-6-27 - Henry improved wordAlign -- this sped up GC by 27% (during a self compile). * 2001-6-20 - Moved MLton.random to MLton.Random.rand and added other stuff to MLton.Random - Added MLton.TextIO.mkstemp. - Made Int.{div,quot} respect the -detect-overflow switch. * 2001-6-20 - Added MLton.Syslog. * 2001-6-7 - Fixed bug in MLton.Socket.accept that was in the runtime implementation Socket_accept. It did a setsockopt SO_REUSEADDR after the accept. It should have been after the call to socket in Socket_listen. Thanks to Doug Bagley for the fix. * 2001-5-30 - Fixed bug in remove-unused that caused polymorphic equality to return true sometimes when constructors were never used in a pattern match. For example, the following (in which A and B are not used as patterns): datatype t = A | B datatype u = C of t val _ = if C A = C B then raise Fail "bug" else () * 2001-3-27 - Fixed bug that caused all of the following to fail {LargeWord,Word,SysWord}.{toLargeInt,toLargeIntX,fromLargeInt} The problem was the basis library file integer/patch.sml which fixed Word32 but not the other structures that are the same. * 2001-2-12 - Fixed bug in match compiler that caused it to spend a lot of extra time in deep patterns. It still could be exponential however. Hopefully this will get fixed in the release after next. This bug could cause very slow compile times in some cases. Anyways, this fix cut the "finish infer" time of a self compile down from 22 to under 4 seconds. I.E. most of the time used to be spent due to this bug. * 2001-2-6 - Fixed bug in frontend that caused the wrong file and line number to be reported with errors in functor bodys. * 2001-1-3 - 2000-2-5 - Changes to CoreML, XML, SXML, and CPS ILs to replace lists by vectors in order to decrease space usage. * 2001-1-16 - Fixed a bug in constant propagation where the length of vectors was not propagated properly. * 2000-12-11 - 2001-1-3 - Major rewrite of elaborator to use a single hash table for each namespace instead of a hash table for every environment. * 2000-12-20 - Fixed some bugs in the SML/NJ compatibility library, src/lib/mlton-subs-in-smlnj. * 2000-12-8 - More careful removal of tracing code when compiling MLton_debug=0. This cut down self compile data size by 100k and compile time by a few seconds. - Added built in character and word cases propagated throughout all ILs. * 2000-12-6 - Added max stack size information to gc-summary. * 2000-12-5 - Added src/benchmark, which contains an SML program that benchmarks all of the SML compilers I have my hands on. The script has lots of hardwired paths for now. * 2000-12-4 - Fixed bug in Posix.ProcEnv.environ, which did not work correctly in a saved world (the original environ was saved). In fact, it did not work at all because the ML primitive expected a constant and the C was a nullary function. This caused a segfault with any program using Posix.ProcEnv.environ. - Added MLton.ProcEnv.setenv, since there doesn't seem to be any setenv in the basis library. * 2000-11-29 - Changed backend so that it should no longer generate machine programs with void operands. - Added -detect-overflow and -safe flags. * 2000-11-27 - 2000-11-28 - Changes in many places to use List.revMap instead of List.map to cut down on allocation. * 2000-11-21 - Added MLton.Word.~ and MLton.Word8.~ to the MLton basis library structure. * 2000-11-20 - Fixed a bug in the CPS shrinker that could cause a compile-time failure. It was maintaining occurrence counts incorrectly. * 2000-11-15 - Fixed a (performance) bug in constant propagation that caused the hashing to be bad. - Improved translation to XML so that the match compiler isn't called on tuple or if expressions. This should speed up the translation and make the output smaller. - Fixed a bug in the match compiler that caused it to not generate integer case statements. This should speed up the mlyacc benchmark and the MLton front end. * 2000-11-9 - Added IntInf_equal and IntInf_compare primitives. - Took out the automatic -keep c when compiling -g. * 2000-11-8 - Added a whole bunch of algebraic laws to the CPS shrinker, including some specifically targeted to IntInf primitives. * 2000-11-3 - Improved implementation of properties so that sets don't allocate. - Improved implementation of type homomorphism in type inference. What was there before appears to have been a bug -- it didn't use the property on types. * 2000-11-2 - Fixed timers used with -v option to use user + sys time. * 2000-10-27 - Split the runtime basis library C files into many separate files so that only the needed code would be included by the linker. - Fixed several bugs in the front end grammar and elaborator that caused type specifications to be handled incorrectly. The following three programs used to be handled incorrectly, but are now handled correctly. signature S = sig type t and u = int end (* reject *) signature S = sig type t = int and u = t end (* accept *) signature S = sig eqtype t and u = int end (* reject *) * 2000-10-25 - Changes to main.sml to run complete compiles with -native switch. * 2000-10-24 - Removed defunctorizer. * 2000-10-20 - Fixed bug in cps-tree.fun PrimExp.maySideEffect. This bug could cause no operand failures in the backend. - Fixed bug in the runtime implementation of MLton.size. The size for stack objects was using the used instead of reserved, and so was too low. * 2000-10-19 - Replaced automatically generated dependencies in src/runtime/Makefile with hand generated ones. Took out make depend from src/Makefile. makedepend was behaving really badly on RHAT 7.0. - Tweaked compiler to shorten width of C output lines to work around bug in RHAT 7.0 cpp which silently truncates (very) long lines. - Fixed bug in grammar that didn't allow "op" to occur in datatype and exception bindings, causing the following to fail datatype t = op T exception op E = op Fail - Improved error messages in CM processor. Fixed bug in CM Alias handling. * 2000-10-18 - Fixed two bugs in the gc that did comparisons with (s->limit - s->frontier), which of course doesn't work if frontier is beyond limit, since these are unsigned. This could have caused segfaults, except that the mutator checks the frontier upon return from the GC. * 2000-10-17 - Fixed bug in backend in the calculation of maxFrameSize. It could be wrong (low) in some situations. - Improved CPS inliner's estimate of function sizes. The size of a function now takes into account other inlined functions that the function calls. This also changed the meaning of the size argument to the -inline switch. It now corresponds (roughly) to the product of the size of the function and the number of calls. In general, it should be larger than before. * 2000-10-13 - Made some calls to Array.sub unsafe in the implementation of Array2. - Integrated Matthew's new x86 backend with floating point support. * 2000-10-9 - Fixed CM file processor so that MLton works if it is run from a different directory than the main CM file. * 2000-10-4 - Changed LimitCheck so it loops on the frontier > limit check. This fixed a potential bug in threads caused when there is enough space available for a thread, t, before switching to another thread but not enough space when it resumes. This could have caused a segfault. * 2000-10-3 - More rewrites of TextIO.StreamIO to improve speed. - Changed TextIO so that only TextIO.stdErr is unbuffered. - Changed TextIO so that FIFOs and sockets are buffered. * 2000-10-2 - Combined remove-unused-constructors, remove-unused-functions, and remove-unused-globals into a single pass that runs to fixed-point and produces results at least as good as running the previous three in (any) sequence. * 2000-9-29 - Added GC_FIRST_CHECK, which does a gc at each limit check the first time it reached. - Reimplemented TextIO.StreamIO (from 2000-9-12) to use lists of strings instead of lists of characters so that the per char space overhead is small. * 2000-9-21 - Fixed bug in profiling labels in C code. The label was always the basic block label instead of the cps function label. - Added -b switch to mlprof to gather data at the basic block level. - Improved performance of TextIO.input1 by about 3X. * 2000-9-15 - 2000-9-19 - Added overflow exceptions to CPS and Machine ILs. * 2000-9-12 - Fixed TextIO.scanStream. It was very broken. - Added TextIO.{getInstream,mkInstream,setInstream} TextIO.StreamIO.{canInput,closeIn,endOfStream,input1,input,inputAll, inputLine,inputN} * 2000-9-11 - Fixed Real_qequal in mlton-lib.h. It was missing a paren that caused code using it to not even compile. It was also semantically incorrect. - Noted that Real_{equal,lt,le,gt,ge} may not follow basis library spec, since ANSI does not require IEEE compliance, and hence these could return wrong results when nans are involved. -------------------------------------------------------------------------------- Here are the changes from the 20000712 version to the 20000906 version. Version 20000906 is mostly a bugfix release over 20000712. The other major changes are that mllex and mlyacc are now included and that mlton can now process a limited subset of CM files as input. * 2000-9-6 - Fixed Socket_listen in mlton-lib.c so that it closes the socket if the bind, listen, or getsockname fails. This could have caused a file descriptor leak. * 2000-9-5 - Added -static commandline switch. - Changed default max heap size to .85 RAM from .95 RAM. - Added PackRealLittle structure to basis library. * 2000-8-25 - Added cases on integers to ILs (instead of using sequences of tests) so that backend can emit more efficient test (jump table, binary tree, ...). * 2000-8-24 - Fixed bug in gc.c. dfsInitializeStack would smummap a NULL pointer whenver toSpace was NULL. This could gause MLton.size to segfault. - Fixed bug in Popt that caused -k to fail with no keeps. * 2000-8-22 - 2000-8-23 - Ported mllex and mlyacc from SML/NJ * 2000-8-20 - 2000-8-21 - Added ability to us a .cm file as input to MLton. * 2000-8-16 - Ported mlprof to SML. - Fixed bug in library/basic/assert.sml that caused asserts to be run even when MLton.debug = false. * 2000-8-15 - Fixed bug in backend -- computation of maxFrameSize was wrong. It didn't count slots in frames that didn't make nontail calls. This could lead to the stack being overwritten because a stack limit check didn't guarantee enough space, and lead to a seg fault. - Fixed bug in gc.c newThreadOfSize. If the thread allocation caused a gc, then the stack wasn't forwarded, leading to a seg fault. The solution was to ensure enough memory all at once, and then fill in both objects. * 2000-8-14 - Changed limit checks so that checks < 512 bytes are replaced by a check for 0. The runtime also moves the limit down by 512. This is done so that the common case, a small limit check, has less code and is faster. - Fixed bug in cps/cps-tree.fun Program.hasPrim returned true for any program that had *any* primapp, not just programs satisfying the predicate. This caused cps/once.fun to be overly conservative, since it thought that every program used continuations. * 2000-8-10 - Fixed bug in CPS typechecker. It didn't enforce that handlers should be defined before any reference to them -- including implicit references in HandlerPops. This caused an evil bug in the liveness analysis where a variable that was only live in the handler was missed in a continuation because the liveness for the handler wasn't computed yet. - Limited the size for moving up limit checks for arrays whose size is known at compile time to avoid huge limit checks getting moved into loops. - added -indent, -kp, -show-types switches. - Put optimization in CPS IL suggested by Neal Glew. It determines for each toplevel function if it can raise an exception to its caller. Also, it removes HanderPush and HandlerPop for handlers that are not on top of the stack for any nontail call. * 2000-8-8 - Changed register allocator so that continuation formals can be allocated in pseudo registers -- they aren't necessarily forced to the stack. * 2000-8-3 - Fixed bug in constant folding. Word8.>> had been used to implement Word8.~>>. - Fixed bug in allocate registers that was not forcing the size argument to Primitive.Array.array to be a stack slot. This could cause problems if there was a thread switch in the limit check, since upon return the size pseudo register would have a bogus value. * 2000-8-1 - Turned back on Xml simplification after monomorphisation. * 2000-7-31 - Fixed bug in MLton.Itimer.set that caused the time to be doubled. - Fixed bug in MLton.Thread that made it look like asynchronous exceptions were allowed by throw'ing an exception raising thunk to an interrupted thread obtained via a signal handler. Attempting asynchronous exceptions will now cause process death, with a helpful error message. * 2000-7-27 - Updated docs to include structure World: MLTON_WORLD in MLton structure. - Added toplevel signatures MLTON_{CONT, ..., WORLD} to basis library. - Fixed broken link in docs to CM in cmcat section. * 2000-7-26 - Eliminated GC_switchToThread and Thread_switchTo1, since the inlined version Thread_switchTo is all that's needed, and Matt's X86 backend now handles it. - Added MLton.Signal.vtalrm, needed for Itimer.Set{which = Itimer.Virtual, ...} * 2000-7-25 Added MLton.Socket.shutdownWrite. * 2000-7-21 Updated mlton-lib.c MLton_bug with new email (MLton@sourcelight.com). * 2000-7-19 Fixed Posix.Process.kill to check for errors. * 2000-7-18 Fixed the following Posix.ProcEnv functions to check for errors: setgid, setpgid, setsid, setuid. Fixed doc/examples/callcc.sml. -------------------------------------------------------------------------------- Here are the changes from the 1999-7-12 to the 20000712 version. * 2000-6-10 - 2000-7-12 Too many changes to count: bug fixes, new basis library modules, optimizer improvements. * 2000-6-30 Fixed bug in monomorphiser that caused programs with non-value carrying exception declarations in polymorphic functions to have a compile-time error because of a duplicate label. The problem was that the exception constructor wasn't duplicated. * 2000-5-22 - 2000-6-10 Finished the changes for the new Cps IL. * 2000-1-1 Fixed some errors in the basis library. Real.copySign Posix.FileSys.fpathconf Posix.IO.{lseek, getlk, setlk, setlkw} Posix.ProcEnv.setpgid Posix.TTY.getattr System.FileSys.realPath * 1999-12-22 Fixed bug in src/closure-convert/abstract-value.fun that caused a compiler failure whenever a program had a vector where the element type contained an ->. * 1999-12-10 - Changed dead code elimination in core-ml/dead-code.fun so that wildcard declarations (val _ = ...) in the basis are kept. Changed places in the basis library to take advantage of this - Added setTopLevelHander primitive so that the basis library code can define the toplevel handler. - Changed basis-library/misc/suffix.sml to call OS.Process.exit. Took out Halt transfer from Cps, since the program never should reach it. - Cleaned up basis-library/system/{process.sml, unix.sml} to use the new signal handling stuff. * 1999-11-28 - 1999-12-20 Added support for threads and cleaned up signal handling. This involved a number of changes. - The stack is now allocated as just another kind of heap object. - Limit checks are inserted at all loop headers, whether or not there is any allocation. This is to ensure that the signal handler always has a chance to get called. - The register allocator puts more variables in stack slots. The new rule is that a variable goes in a stack slot if it is ever live across a nontail call, in a handler, or (this is the new part) across a limit check. - Arguments are passed on the stack, with the convention determined by argument types. - The "locals" array of pointers that was copied to/from for GC is now gone, because no registers (in particular no pointer valued registers) can be live at a limit check point. * 1999-11-21 - Runtime system o Fixed a bug introduced by the signal code (presumably on 1999-8-9) that caused a gc to *not* be performed when doing a save world. This caused the heaps created by save world to be the same size as the heap -- not the live data. This was quite bad. o Cleaned up the Makefile. Add make depend. o Added max gc pause to gc-summary info. o Move heap translation variables that had been file statics into the GC_state. - Made structure Position available at toplevel. - Basis Library o Added MLton.loadWorld - Added Primitive.usesCallcc - Added Primitive.safe - Removed special size functions from cps/save-world -- they are no longer necessary since size doesn't do a gc. - Fixed another (sigh) bug in cps/simplify-types.fun that could cause it to not terminate. * 1999-11-16 - Cleaned up backend/machine.fun a bit so that it spits out macros for allocation of objects and bumping of frontier. Added macros MLTON_object and MLTON_incFrontier to include/mlton-lib.h. - Fixed a bug in backend/limit-check.fun that caused loops to not be detected if they were only reached by a case branch. This could cause there to be loop that allocates with no limit check. Needless to say, this could cause a segfault if the loop ran for long enough. * 1999-10-18 Added basis library function Array2.copy. * 1999-8-15 Turned off globalization of ref cells (closure-convert/globalize.fun) because it interacts badly with serialization. * 1999-8-13 Fixed bug in mlton-lib.h in MLTON_allocArrayNoPointers that was triggered when bytesPerElt == 0. The problem was that it wasn't reserving space for the forwarding pointer. This could cause a seg fault. * 1999-8-8 and 1999-8-9 Added support for signal handling. * 1999-8-7 Fixed bugs in Array.tabulate (and other tabulate variants) caused if the function argument used callcc. * 1999-8-1 Added serialization, which was mostly code in src/runtime/gc.c. GC_serialize converts an object to a Word8Vector.vector. GC_deserialize undoes the conversion. (de)Serialization should work for all objects except for functions, because I haven't yet added the support in the flow analysis. * 1999-7-31 - Cleaned up the GC. Changed headers, by stealing a bit from the number of non pointers and making it a mark bit (used in GC_size). - Rewrote GC_size so that it runs in time proportional to the number of pointers in the object. It does a depth-first-search now, using toSpace to hold the stack. * 1999-7-30 - Fixed bug in SUBSTRING. getc had the wrong type. This bug wasn't noticed because MLton doesn't do enough type checking. - Fixed bug (seg fault) caused when a GC immediately followed a throw. * 1999-7-29 Fixed bug in Date.fmt (basis-library/system/date.sml). It was not setting Tm.buf, and hence the time was always 0 unless there had been a previous call to setTmBuf. * 1999-7-28 - Fixed bugs in Posix.IO.FLock.{getlk,setlk,setlkw}, which would cause compilation to fail because FLock.toInt was defined as the C castInt, which no longer exists. Instead, expand FLock.toInt to MLTON_pointerToInt, which was added to include/mlton-lib.h. - Changed Posix.Primitive.Flock to Posix.Primitive.FLock. - Added MLTON_chown, MLTON_ftruncate to include/mlton-posix.h. They were missing. This would cause compilation of any program using Posix.FileSys.{chown,ftruncate} to fail. Also made it so all of the primitives in basis-library/posix/primitive.sml use MLTON_ versions of functions, even if a wrapper is unnecessary. * 1999-7-25 Added some other missing signature definitions to toplevel. * 1999-7-24 Added missing OS_* signature definitions to basis-library/top-level/top-level.sml. * 1999-7-19 Fixed bug in basis-library/arrays-and-vectors/mono-array.sml. Used :> instead of : so that the monomorphic array types are abstract. -------------------------------------------------------------------------------- Here are the changes from the 1999-3-19 version to the 1999-7-12 version. * 1999-7-12 Changed src/backend/machine.fun so that the 'pointer locals' array is only as large as neccessary in order to copy all pointer-valued locals, not as large as the number of pointer-valued locals. * 1999-7-11 Rewrote src/backend/allocate-registers.fun so that it does a better job of sharing "registers" (i.e. C local variables) and stack slots. This should cut down on the amount of copying that has to happen before and after a gc. It should also cut down on the size of stack slots. * 1999-7-10 Fixed a bug in src/backend/parallel-move.fun that should have been triggered on most any parallel move. I guess parallel moves almost never happened due to the old register allocation strategy -- but, with the new one (see note for 1999-7-12) parallel moves will be frequent. * 1999-6-27 Fixed src/main.sml so that when compiling -p, the .c file is compiled -g and the .o is linked -p. In bakend/machine.fun, added profiling comments before chunkswitches and put in an optimization to avoid printing repeated profiling comments. Also, profiling comments are only output when compiling -p. * 1999-6-17 Changed -i to -inline, -f to -flatten, -np to -no-polyvariance, -u to -unsafe. Added -i, -I, -l, -L flags for includes and libraries. Updated documentation for these options and for ffi. * 1999-6-16 Hardwired version number in src/control/control.sml. As it stood, the version number was computed when MLton was built after someone downloaded it, which was clearly wrong. * 1999-6-16 Fixed undefined variable time in GC_done in src/runtime/gc.c. * 1999-6-8 in include/mlton-lib.h, removed #include added #include and deleted all of the function signatures I had copied from math.h Changed Real.{minNormalPos, minPos, maxFinite} so that they are computed in real.sml instead of appearing as constants in the C. * 1999-6-7 IntInf.pow added to basis library. * 1999-6-4 bin/mlton changed to use .arch-n-opsys if it exists. * 1999-6-3 src/Makefile changed to use sml-cm instead of sml * 1999-5-10 Patch to src/atoms/small-int-inf.fun to work around a bug in the SML/NJ implementation of bignums. This bug was causing some hex bignum constants to be lexed incorrectly. * 1999-4-15 Comments emitted in C code for profiling. The comments identify the Cps function responsible for each C statement. * 1999-4-15 callcc and throw added. * 1999-4-15 Bug in src/cps/simplify-types fixed. The bug caused nontermination whenever there was a circular datatype with a vector on the rhs. E.g. datatype t = T of t vector -------------------------------------------------------------------------------- Here are the changes from the 1998-8-26 version to the 1999-3-19 version. * Compile time and code size have decreased. * Runtime performance of executables has improved. * Large programs can now be compiled. * MLton is self hosting. * The basis library is mostly complete and many bugs have been fixed. * The monomorphiser (-m) is no longer available. * The heap and stack are automatically resized. * There are now facilities for heap checkpointing (MLton.saveWorld) and object size computation (MLton.size). * MLton uses the GNU multiprecision library to provide a fast implemenation of IntInf. mlton-20100608/doc/examples/0000755000076600000240000000000011404470406014142 5ustar mtfstaffmlton-20100608/doc/examples/ffi/0000755000076600000240000000000011404470406014706 5ustar mtfstaffmlton-20100608/doc/examples/ffi/.ignore0000644000076600000240000000007511404435635016201 0ustar mtfstaffexport export.h iimport import import2 test_quot test_quot.h mlton-20100608/doc/examples/ffi/c_quot.c0000644000076600000240000000035111404435635016350 0ustar mtfstaff#include "test_quot.h" #include PRIVATE Int8 c_quot(Int8 x, Int8 y) { Int8 z = x / y; return z; } PUBLIC void call_sml_quot() { Int8 x = -1; Int8 y = 10; Int8 z = sml_quot(x, y); printf(" sml_z = %i\n", z); } mlton-20100608/doc/examples/ffi/export.sml0000644000076600000240000000214411404435635016752 0ustar mtfstaffval e = _export "f": (int * real * char -> char) -> unit; val _ = e (fn (i, r, _) => (print (concat ["i = ", Int.toString i, " r = ", Real.toString r, "\n"]) ; #"g")) val g = _import "g" public: unit -> unit; val _ = g () val _ = g () val e = _export "f2": (Word8.word -> word array) -> unit; val _ = e (fn w => Array.tabulate (10, fn _ => Word.fromLargeWord (Word8.toLargeWord w))) val g2 = _import "g2" public: unit -> word array; val a = g2 () val _ = print (concat ["0wx", Word.toString (Array.sub (a, 0)), "\n"]) val e = _export "f3": (unit -> unit) -> unit; val _ = e (fn () => print "hello\n"); val g3 = _import "g3" public: unit -> unit; val _ = g3 () (* This example demonstrates mutual recursion between C and SML. *) val e = _export "f4": (int -> unit) -> unit; val g4 = _import "g4" public: int -> unit; val _ = e (fn i => if i = 0 then () else g4 (i - 1)) val _ = g4 13 val (_, zzzSet) = _symbol "zzz" alloc: (unit -> int) * (int -> unit); val () = zzzSet 42 val g5 = _import "g5" public: unit -> unit; val _ = g5 () val _ = print "success\n" mlton-20100608/doc/examples/ffi/ffi-export.c0000644000076600000240000000135311404435635017144 0ustar mtfstaff#include #include "export.h" /* Functions in C are by default PUBLIC symbols */ void g () { Char8 c; fprintf (stderr, "g starting\n"); c = f (13, 17.15, 'a'); fprintf (stderr, "g done char = %c\n", c); } Pointer g2 () { Pointer res; fprintf (stderr, "g2 starting\n"); res = f2 (0xFF); fprintf (stderr, "g2 done\n"); return res; } void g3 () { fprintf (stderr, "g3 starting\n"); f3 (); fprintf (stderr, "g3 done\n"); } void g4 (Int32 i) { fprintf (stderr, "g4 (%d)\n", i); f4 (i); } void g5 () { fprintf (stderr, "g5 ()\n"); fprintf (stderr, "zzz = %i\n", zzz); fprintf (stderr, "g5 done\n"); } mlton-20100608/doc/examples/ffi/ffi-import.c0000644000076600000240000000076511404435635017143 0ustar mtfstaff#include "export.h" Int32 FFI_INT = 13; Word32 FFI_WORD = 0xFF; Bool FFI_BOOL = 1; Real64 FFI_REAL = 3.14159; Char8 ffi (Pointer a1, Int32 a1len, Pointer a2, Pointer a3, Int32 n) { double *ds = (double*)a1; int *pi = (int*)a2; char *pc = (char*)a3; int i; double sum; sum = 0.0; for (i = 0; i < a1len; ++i) { sum += ds[i]; ds[i] += n; } *pi = (int)sum; *pc = 'c'; return 'c'; } mlton-20100608/doc/examples/ffi/iimport.sml0000644000076600000240000000673211404435635017123 0ustar mtfstaffsignature DYN_LINK = sig type hndl type mode type fptr val dlopen : string * mode -> hndl val dlsym : hndl * string -> fptr val dlclose : hndl -> unit val RTLD_LAZY : mode val RTLD_NOW : mode end structure DynLink :> DYN_LINK = struct type hndl = MLton.Pointer.t type mode = Word32.word type fptr = MLton.Pointer.t (* These symbols come from a system libray, so the default import scope * of external is correct. *) val dlopen = _import "dlopen" : string * mode -> hndl; val dlerror = _import "dlerror": unit -> MLton.Pointer.t; val dlsym = _import "dlsym" : hndl * string -> fptr; val dlclose = _import "dlclose" : hndl -> Int32.int; val RTLD_LAZY = 0wx00001 (* Lazy function call binding. *) val RTLD_NOW = 0wx00002 (* Immediate function call binding. *) val dlerror = fn () => let val addr = dlerror () in if addr = MLton.Pointer.null then NONE else let fun loop (index, cs) = let val w = MLton.Pointer.getWord8 (addr, index) val c = Byte.byteToChar w in if c = #"\000" then SOME (implode (rev cs)) else loop (index + 1, c::cs) end in loop (0, []) end end val dlopen = fn (filename, mode) => let val filename = filename ^ "\000" val hndl = dlopen (filename, mode) in if hndl = MLton.Pointer.null then raise Fail (case dlerror () of NONE => "???" | SOME s => s) else hndl end val dlsym = fn (hndl, symbol) => let val symbol = symbol ^ "\000" val fptr = dlsym (hndl, symbol) in case dlerror () of NONE => fptr | SOME s => raise Fail s end val dlclose = fn hndl => if MLton.Platform.OS.host = MLton.Platform.OS.Darwin then () (* Darwin reports the following error message if you * try to close a dynamic library. * "dynamic libraries cannot be closed" * So, we disable dlclose on Darwin. *) else let val res = dlclose hndl in if res = 0 then () else raise Fail (case dlerror () of NONE => "???" | SOME s => s) end end val dll = let open MLton.Platform.OS in case host of Cygwin => "cygwin1.dll" | Darwin => "libm.dylib" | _ => "libm.so" end val hndl = DynLink.dlopen (dll, DynLink.RTLD_LAZY) local val double_to_double = _import * : DynLink.fptr -> real -> real; val cos_fptr = DynLink.dlsym (hndl, "cos") in val cos = double_to_double cos_fptr end val _ = print (concat [" Math.cos(2.0) = ", Real.toString (Math.cos 2.0), "\n", "libm.so::cos(2.0) = ", Real.toString (cos 2.0), "\n"]) val _ = DynLink.dlclose hndl mlton-20100608/doc/examples/ffi/import.sml0000644000076600000240000000121311404435635016737 0ustar mtfstaff(* main.sml *) (* Declare ffi to be implemented by calling the C function ffi. *) val ffi = _import "ffi" public: real array * int * int ref * char ref * int -> char; open Array val size = 10 val a = tabulate (size, fn i => real i) val ri = ref 0 val rc = ref #"0" val n = 17 (* Call the C function *) val c = ffi (a, Array.length a, ri, rc, n) (* FFI_INT is declared as public in ffi-import.c *) val (nGet, nSet) = _symbol "FFI_INT" public: (unit -> int) * (int -> unit); val _ = print (concat [Int.toString (nGet ()), "\n"]) val _ = print (if c = #"c" andalso !ri = 45 andalso !rc = c then "success\n" else "fail\n") mlton-20100608/doc/examples/ffi/import2.sml0000644000076600000240000000527311404435635017033 0ustar mtfstaff(* main.sml *) (* Declare ffi to be implemented by calling the C function ffi. *) val ffi_addr = _address "ffi" public: MLton.Pointer.t; val ffi_schema = _import * : MLton.Pointer.t -> real array * int * int ref * char ref * int -> char; open Array val size = 10 val a = tabulate (size, fn i => real i) val ri = ref 0 val rc = ref #"0" val n = 17 (* Call the C function *) val c = ffi_schema ffi_addr (a, Array.length a, ri, rc, n) val _ = print (if c = #"c" andalso !ri = 45 andalso !rc = c then "success\n" else "fail\n") val n = #1 (_symbol "FFI_INT" public: (unit -> int) * (int -> unit);) () val _ = print (concat [Int.toString n, "\n"]) val w = #1 (_symbol "FFI_WORD" public: (unit -> word) * (word -> unit);) () val _ = print (concat [Word.toString w, "\n"]) val b = #1 (_symbol "FFI_BOOL" public: (unit -> bool) * (bool -> unit);) () val _ = print (concat [Bool.toString b, "\n"]) val r = #1 (_symbol "FFI_REAL" public: (unit -> real) * (real -> unit);) () val _ = print (concat [Real.toString r, "\n"]) signature OPAQUE = sig type t val toString : t -> string end structure OpaqueInt :> OPAQUE = struct type t = Int.int val toString = Int.toString end structure OpaqueWord :> OPAQUE = struct type t = Word.word val toString = Word.toString end structure OpaqueBool :> OPAQUE = struct type t = Bool.bool val toString = Bool.toString end structure OpaqueReal :> OPAQUE = struct type t = Real.real val toString = Real.toString end val (n, _) = _symbol "FFI_INT" public: (unit -> OpaqueInt.t) * (OpaqueInt.t -> unit); val _ = print (concat [OpaqueInt.toString (n ()), "\n"]) val (w, _) = _symbol "FFI_WORD" public: (unit -> OpaqueWord.t) * (OpaqueWord.t -> unit); val _ = print (concat [OpaqueWord.toString (w ()), "\n"]) val (b, _) = _symbol "FFI_BOOL" public: (unit -> OpaqueBool.t) * (OpaqueBool.t -> unit); val _ = print (concat [OpaqueBool.toString (b ()), "\n"]) val (r, _) = _symbol "FFI_REAL" public: (unit -> OpaqueReal.t) * (OpaqueReal.t -> unit); val _ = print (concat [OpaqueReal.toString (r ()), "\n"]) val n_addr = _address "FFI_INT" public: MLton.Pointer.t; val n = MLton.Pointer.getInt32 (n_addr, 0); val _ = print (concat [Int.toString n, "\n"]) val w_addr = _address "FFI_WORD" public: MLton.Pointer.t; val w = MLton.Pointer.getWord32 (w_addr, 0); val _ = print (concat [Word.toString w, "\n"]) val b_addr = _address "FFI_BOOL" public: MLton.Pointer.t; val b = (MLton.Pointer.getInt32 (n_addr, 0)) <> 0 val _ = print (concat [Bool.toString b, "\n"]) val r_addr = _address "FFI_REAL" public: MLton.Pointer.t; val r = MLton.Pointer.getReal64 (r_addr, 0) val _ = print (concat [Real.toString r, "\n"]) mlton-20100608/doc/examples/ffi/Makefile0000644000076600000240000000166611404435635016364 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## PATH := ../../../build/bin:$(shell echo $$PATH) mlton := mlton -default-ann 'allowFFI true' .PHONY: all all-win32 all-win32: import import2 export test_quot ./import ./import2 ./export ./test_quot all: all-win32 iimport ./iimport export: export.sml ffi-export.o import: import.sml ffi-import.o import2: import2.sml ffi-import.o test_quot : test_quot.sml c_quot.o ffi-import.o: export.h ffi-export.o: export.h c_quot.o : test_quot.h iimport: iimport.sml $(mlton) \ -target-link-opt linux -ldl \ -target-link-opt solaris -ldl \ iimport.sml %.o: %.c gcc -Wall -c -o $@ $< %.h: %.sml $(mlton) -export-header $@ -stop tc $< %: $(mlton) -output $@ $^ clean: ../../../bin/clean mlton-20100608/doc/examples/ffi/test_quot.sml0000644000076600000240000000164611404435635017466 0ustar mtfstaff(* By default _import is external *) val c_quot = _import "c_quot" private: Int8.int * Int8.int -> Int8.int; (* By default _export is public *) val sml_quot = _export "sml_quot": (Int8.int * Int8.int -> Int8.int) -> unit; val _ = sml_quot Int8.quot val call_sml_quot = _import "call_sml_quot" public: unit -> unit; val x : Int8.int = ~1 val y : Int8.int = 10 val z = Int8.quot (x, y) val c_z = c_quot (x, y) val bad_z = let val x : Int8.int = ~1 val x : Word8.word = 0wxFF val x : Int32.int = Word8.toInt x val y : Int8.int = 10 val y : Word8.word = 0wx0A val y : Int32.int = Word8.toInt y val z : Int32.int = Int32.quot (x, y) val z = Int8.fromInt z in z end val () = print (concat [" bad_z = ", Int8.toString bad_z, "\n", " z = ", Int8.toString z, "\n", " c_z = ", Int8.toString c_z, "\n"]) val () = call_sml_quot () mlton-20100608/doc/examples/finalizable/0000755000076600000240000000000011404470406016422 5ustar mtfstaffmlton-20100608/doc/examples/finalizable/.ignore0000644000076600000240000000002311404435635017706 0ustar mtfstaffcons.o finalizable mlton-20100608/doc/examples/finalizable/cons.c0000644000076600000240000000156211404435635017541 0ustar mtfstaff#include typedef unsigned int uint; typedef struct Cons { struct Cons *next; int value; } *Cons; Cons listCons (int n, Cons c) { Cons res; res = (Cons) malloc (sizeof(*res)); fprintf (stderr, "0x%08x = listCons (%d)\n", (uint)res, n); res->next = c; res->value = n; return res; } Cons listSing (int n) { Cons res; res = (Cons) malloc (sizeof(*res)); fprintf (stderr, "0x%08x = listSing (%d)\n", (uint)res, n); res->next = NULL; res->value = n; return res; } void listFree (Cons p) { fprintf (stderr, "listFree (0x%08x)\n", (uint)p); free (p); } int listSum (Cons c) { int res; fprintf (stderr, "listSum\n"); res = 0; for (; c != NULL; c = c->next) res += c->value; return res; } mlton-20100608/doc/examples/finalizable/finalizable.sml0000644000076600000240000000474711404435635021440 0ustar mtfstaffsignature CLIST = sig type t val cons: int * t -> t val sing: int -> t val sum: t -> int end functor CList (structure F: MLTON_FINALIZABLE structure Prim: sig val cons: int * Word32.word -> Word32.word val free: Word32.word -> unit val sing: int -> Word32.word val sum: Word32.word -> int end): CLIST = struct type t = Word32.word F.t fun cons (n: int, l: t) = F.withValue (l, fn w' => let val c = F.new (Prim.cons (n, w')) val _ = F.addFinalizer (c, Prim.free) val _ = F.finalizeBefore (c, l) in c end) fun sing n = let val c = F.new (Prim.sing n) val _ = F.addFinalizer (c, Prim.free) in c end fun sum c = F.withValue (c, Prim.sum) end functor Test (structure CList: CLIST structure MLton: sig structure GC: sig val collect: unit -> unit end end) = struct fun f n = if n = 1 then () else let val a = Array.tabulate (n, fn i => i) val _ = Array.sub (a, 0) + Array.sub (a, 1) in f (n - 1) end val l = CList.sing 2 val l = CList.cons (2,l) val l = CList.cons (2,l) val l = CList.cons (2,l) val l = CList.cons (2,l) val l = CList.cons (2,l) val l = CList.cons (2,l) val _ = MLton.GC.collect () val _ = f 100 val _ = print (concat ["listSum(l) = ", Int.toString (CList.sum l), "\n"]) val _ = MLton.GC.collect () val _ = f 100 end structure CList = CList (structure F = MLton.Finalizable structure Prim = struct val cons = _import "listCons": int * Word32.word -> Word32.word; val free = _import "listFree": Word32.word -> unit; val sing = _import "listSing": int -> Word32.word; val sum = _import "listSum": Word32.word -> int; end) structure S = Test (structure CList = CList structure MLton = MLton) mlton-20100608/doc/examples/finalizable/Makefile0000644000076600000240000000060511404435635020070 0ustar mtfstaff## Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## PATH := ../../../build/bin:$(shell echo $$PATH) mlton := mlton -default-ann 'allowFFI true' all: $(mlton) finalizable.sml cons.c ./finalizable .PHONY: clean clean: ../../../bin/clean mlton-20100608/doc/examples/Makefile0000644000076600000240000000050211404435635015604 0ustar mtfstaff## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: %: %.sml mlton $< .PHONY: clean: ../../bin/clean rm -f *.sml mlton-20100608/doc/examples/profiling/0000755000076600000240000000000011404470406016133 5ustar mtfstaffmlton-20100608/doc/examples/profiling/.ignore0000644000076600000240000000005311404435635017422 0ustar mtfstaff*.dot *.ps mlmon*.out fib-tak list-rev tak mlton-20100608/doc/examples/profiling/fib-tak.sml0000644000076600000240000000140111404435635020166 0ustar mtfstaffstructure Profile = MLton.Profile val fibData = Profile.Data.malloc () val takData = Profile.Data.malloc () fun wrap (f, d) x = Profile.withData (d, fn () => f x) val rec fib = fn 0 => 0 | 1 => 1 | n => fib (n - 1) + fib (n - 2) val fib = wrap (fib, fibData) fun tak (x,y,z) = if not (y < x) then z else tak (tak (x - 1, y, z), tak (y - 1, z, x), tak (z - 1, x, y)) val tak = wrap (tak, takData) val rec f = fn 0 => () | n => (fib 38; f (n-1)) val _ = f 2 val rec g = fn 0 => () | n => (tak (18,12,6); g (n-1)) val _ = g 500 fun done (data, file) = (Profile.Data.write (data, file) ; Profile.Data.free data) val _ = done (fibData, "mlmon.fib.out") val _ = done (takData, "mlmon.tak.out") mlton-20100608/doc/examples/profiling/list-rev.sml0000644000076600000240000000034611404435635020425 0ustar mtfstafffun append (l1, l2) = case l1 of [] => l2 | x :: l1 => x :: append (l1, l2) fun rev l = case l of [] => [] | x :: l => append (rev l, [x]) val l = List.tabulate (1000, fn i => i) val _ = 1 + hd (rev l) mlton-20100608/doc/examples/profiling/Makefile0000644000076600000240000000275411404435635017610 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## mlton := mlton mlprof := mlprof ALLOC_EX := list-rev COUNT_EX := tak MULT_EX := fib-tak TIME_EX := tak PATH := ../../../build/bin:$(shell echo $$PATH) .PHONY: all all: profile-time profile-alloc profile-count profile-stack profile-multiple .PHONY: clean clean: ../../../bin/clean .PHONY: profile-alloc profile-alloc: $(mlton) -profile alloc $(ALLOC_EX).sml ./$(ALLOC_EX) $(mlprof) -show-line true $(ALLOC_EX) mlmon.out .PHONY: profile-count profile-count: $(mlton) -profile count $(COUNT_EX).sml ./$(COUNT_EX) $(mlprof) -raw true -show-line true $(COUNT_EX) mlmon.out .PHONE: profile-multiple profile-multiple: $(mlton) -profile time $(MULT_EX).sml ./$(MULT_EX) $(mlprof) $(MULT_EX) mlmon.fib.out $(mlprof) $(MULT_EX) mlmon.tak.out $(mlprof) $(MULT_EX) mlmon.fib.out mlmon.tak.out mlmon.out .PHONY: profile-stack profile-stack: $(mlton) -profile alloc -profile-stack true $(ALLOC_EX).sml ./$(ALLOC_EX) $(mlprof) -call-graph $(ALLOC_EX).dot -show-line true \ $(ALLOC_EX) mlmon.out dot -Tps $(ALLOC_EX).dot >$(ALLOC_EX).ps || true .PHONY: profile-time profile-time: $(mlton) -profile time $(TIME_EX).sml ./$(TIME_EX) $(mlprof) $(TIME_EX) mlmon.out $(mlprof) -raw true $(TIME_EX) mlmon.out $(mlprof) -show-line true $(TIME_EX) mlmon.out mlton-20100608/doc/examples/profiling/tak.sml0000644000076600000240000000124111404435635017432 0ustar mtfstaffstructure Tak = struct fun tak1 (x, y, z) = let fun tak2 (x, y, z) = if y >= x then z else tak1 (tak2 (x - 1, y, z), tak2 (y - 1, z, x), tak2 (z - 1, x, y)) in if y >= x then z else tak1 (tak2 (x - 1, y, z), tak2 (y - 1, z, x), tak2 (z - 1, x, y)) end end val rec f = fn 0 => () | ~1 => print "this branch is not taken\n" | n => (Tak.tak1 (18, 12, 6) ; f (n-1)) val _ = f 5000 fun uncalled () = () mlton-20100608/doc/examples/save-world/0000755000076600000240000000000011404470406016225 5ustar mtfstaffmlton-20100608/doc/examples/save-world/.ignore0000644000076600000240000000002111404435635017507 0ustar mtfstaffsave-world world mlton-20100608/doc/examples/save-world/Makefile0000644000076600000240000000101111404435635017663 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## PATH := ../../../build/bin:$(shell echo $$PATH) mlton := mlton all: test .PHONY: test test: world ./save-world @MLton load-world world -- world: save-world ./save-world save-world: save-world.sml $(mlton) save-world.sml .PHONY: clean clean: ../../../bin/clean mlton-20100608/doc/examples/save-world/save-world.sml0000644000076600000240000000021011404435635021023 0ustar mtfstaffopen MLton.World val _ = case save "world" of Original => print "I am the original\n" | Clone => print "I am the clone\n" mlton-20100608/doc/guide/0000755000076600000240000000000011404470406013421 5ustar mtfstaffmlton-20100608/doc/guide/.ignore0000644000076600000240000000002011404435635014702 0ustar mtfstaffmlton-guide.pdf mlton-20100608/doc/guide/AccessControl0000644000076600000240000000504111404435634016112 0ustar mtfstaff AccessControl - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION AccessControl
Home  Index  
MoinMoin supports a lot of [WWW]access control features.

Because people download binaries from the MLton web site, and we are worried about malicious users either changing those binaries, or changing the links that should point at those binaries, we allow editing of some pages (in particular, Home, [WWW]Download, [WWW]Experimental, and ReleaseYYYYMMDD pages) only by TrustedGroup members.

All other pages are freely editable by any user with an account.


Last edited on 2007-08-24 20:29:18 by MatthewFluet. mlton-20100608/doc/guide/AdamGoode0000644000076600000240000000400111404435634015163 0ustar mtfstaff AdamGoode - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION AdamGoode
Home  Index  
  • I maintain the Fedora package of MLton, in [WWW]Fedora.

  • I have contributed some patches for Makefiles and PDF documentation building.


Last edited on 2007-09-19 00:57:59 by AdamGoode. mlton-20100608/doc/guide/AdmitsEquality0000644000076600000240000003300411404435635016310 0ustar mtfstaff AdmitsEquality - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION AdmitsEquality
Home  Index  
A TypeConstructor admits equality if whenever it is applied to equality types, the result is an EqualityType. This notion enables one to determine whether a type constructor application yields an equality type solely from the application, without looking at the definition of the type constructor. It helps to ensure that PolymorphicEquality is only applied to sensible values.

The definition of admits equality depends on whether the type constructor was declared by a type definition or a datatype declaration.

Type definitions

For type definition

type ('a1, ..., 'an) t = ...

type constructor t admits equality if the right-hand side of the definition is an equality type after replacing 'a1, ..., 'an by equality types (it doesn't matter which equality types are chosen).

For a nullary type definition, this amounts to the right-hand side being an equality type. For example, after the definition

type t = bool * int

type constructor t admits equality because bool * int is an equality type. On the other hand, after the definition

type t = bool * int * real

type constructor t does not admit equality, because real is not an equality type.

For another example, after the definition

type 'a t = bool * 'a

type constructor t admits equality because bool * int is an equality type (we could have chosen any equality type other than int).

On the other hand, after the definition

type 'a t = real * 'a

type constructor t does not admit equality because real * int is not equality type.

We can check that a type constructor admits equality using an eqtype specification.

structure Ok: sig eqtype 'a t end = 
   struct 
      type 'a t = bool * 'a
   end

structure Bad: sig eqtype 'a t end = 
   struct 
      type 'a t = real * int * 'a
   end

On structure Bad, MLton reports the following error.

Type t admits equality in signature but not in structure.
  not equality: [real] * _ * _
The not equality section provides an explanation of why the type did not admit equality, highlighting the problematic component (real).

Datatype declarations

For a type constructor declared by a datatype declaration to admit equality, every variant of the datatype must admit equality. For example, the following datatype admits equality because bool and char * int are equality types.

datatype t = A of bool | B of char * int

Nullary constructors trivially admit equality, so that the following datatype admits equality.

datatype t = A | B | C

For a parameterized datatype constructor to admit equality, we consider each variant as a type definition, and require that the definition admit equality. For example, for the datatype

datatype 'a t = A of bool * 'a | B of 'a

the type definitions

type 'a tA = bool * 'a
type 'a tB = 'a 

both admit equality. Thus, type constructor t admits equality.

On the other hand, the following datatype does not admit equality.

datatype 'a t = A of bool * 'a | B of real * 'a

As with type definitions, we can check using an eqtype specification.

structure Bad: sig eqtype 'a t end =
   struct
      datatype 'a t = A of bool * 'a | B of real * 'a
   end

MLton reports the following error.

Type t admits equality in signature but not in structure.
  not equality: B of [real] * _

MLton indicates the problematic constructor (B), as well as the problematic component of the constructor's argument.

Recursive datatypes

A recursive datatype like

datatype t = A | B of int * t

introduces a new problem, since in order to decide whether t admits equality, we need to know for the B variant whether t admits equality. The Definition answers this question by requiring a type constructor to admit equality if it is consistent to do so. So, in our above example, if we assume that t admits equality, then the variant B of int * t admits equality. Then, since the A variant trivially admits equality, so does the type constructor t. Thus, it was consistent to assume that t admits equality, and so, t does admit equality.

On the other hand, in the following declaration

datatype t = A | B of real * t
if we assume that t admits equality, then the B variant does not admit equality. Hence, the type constructor t does not admit equality, and our assumption was inconsistent. Hence, t does not admit equality.

The same kind of reasoning applies to mutually recursive datatypes as well. For example, the following defines both t and u to admit equality.

datatype t = A | B of u
and u = C | D of t

But the following defines neither t nor u to admit equality.

datatype t = A | B of u * real
and u = C | D of t

As always, we can check whether a type admits equality using an eqtype specification.

structure Bad: sig eqtype t eqtype u end =
   struct
      datatype t = A | B of u * real
      and u = C | D of t
   end

MLton reports the following error.

Error: z.sml 1.16.
  Type t admits equality in signature but not in structure.
    not equality: B of [u] * [real]
Error: z.sml 1.16.
  Type u admits equality in signature but not in structure.
    not equality: D of [t]


Last edited on 2007-07-08 22:57:33 by MatthewFluet. mlton-20100608/doc/guide/Alice0000644000076600000240000000353611404435634014374 0ustar mtfstaff Alice - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Alice
Home  Index  
[WWW]Alice ML is an extension of SML with concurrency, dynamic typing, components, distribution, and constraint solving.


Last edited on 2007-11-08 17:42:55 by AndreasRossberg. mlton-20100608/doc/guide/AllocateRegisters0000644000076600000240000000515611404435634016773 0ustar mtfstaff AllocateRegisters - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION AllocateRegisters
Home  Index  
AllocateRegisters is an analysis pass for the RSSA IntermediateLanguage, invoked from ToMachine.

Description

Computes an allocation of RSSA variables as Machine register or stack operands.

Implementation

[WWW]allocate-registers.sig [WWW]allocate-registers.fun

Details and Notes


Last edited on 2006-11-02 17:36:11 by MatthewFluet. mlton-20100608/doc/guide/AndreiFormiga0000644000076600000240000000373411404435634016066 0ustar mtfstaff AndreiFormiga - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION AndreiFormiga
Home  Index  
I'm a graduate student just back in academia. I study concurrent and parallel systems, with a great deal of interest in programming languages (theory, design, implementation). I happen to like functional languages.

I use the nickname tautologico on #sml and my email is andrei DOT formiga AT gmail DOT com.


Last edited on 2004-11-20 18:17:19 by AndreiFormiga. mlton-20100608/doc/guide/ArrayLiteral0000644000076600000240000001415111404435634015745 0ustar mtfstaff ArrayLiteral - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ArrayLiteral
Home  Index  
Standard ML does not have a syntax for array literals or vector literals. The only way to write down an array is like
Array.fromList [w, x, y, z]

No SML compiler produces efficient code for the above expression. The generated code allocates a list and then converts it to an array. To alleviate this, one could write down the same array using Array.tabulate, or even using Array.array and Array.update, but that is syntactically unwieldy.

Fortunately, using Fold, it is possible to define constants A, and ` so that one can write down an array like:

A `w `x `y `z $

This is as syntactically concise as the fromList expression. Furthermore, MLton, at least, will generate the efficient code as if one had written down a use of Array.array followed by four uses of Array.update.

Along with A and `, one can define a constant V that makes it possible to define vector literals with the same syntax, e.g.,

V `w `x `y `z $

Note that the same element indicator, `, serves for both array and vector literals. Of course, the $ is the end-of-arguments marker always used with Fold. The only difference between an array literal and vector literal is the A or V at the beginning.

Here is the implementation of A, V, and `. We place them in a structure and use signature abstraction to hide the type of the accumulator. See Fold for more on this technique.

structure Literal:>
   sig
      type 'a z
      val A: ('a z, 'a z, 'a array, 'd) Fold.t
      val V: ('a z, 'a z, 'a vector, 'd) Fold.t
      val ` : ('a, 'a z, 'a z, 'b, 'c, 'd) Fold.step1
   end =
   struct
      type 'a z = int * 'a option * ('a array -> unit)

      val A =
         fn z =>
         Fold.fold
         ((0, NONE, ignore),
          fn (n, opt, fill) =>
          case opt of
             NONE =>
                Array.tabulate (0, fn _ => raise Fail "array0")
           | SOME x =>
                let
                   val a = Array.array (n, x)
                   val () = fill a
                in
                   a
                end)
         z

      val V = fn z => Fold.post (A, Array.vector) z

      val ` = 
         fn z => 
         Fold.step1
         (fn (x, (i, opt, fill)) =>
          (i + 1, 
           SOME x, 
           fn a => (Array.update (a, i, x); fill a)))
         z
   end

The idea of the code is for the fold to accumulate a count of the number of elements, a sample element, and a function that fills in all the elements. When the fold is complete, the finishing function allocates the array, applies the fill function, and returns the array. The only difference between A and V is at the very end; A just returns the array, while V converts it to a vector using post-composition, which is further described on the Fold page.


Last edited on 2007-08-15 22:05:16 by MatthewFluet. mlton-20100608/doc/guide/AST0000644000076600000240000002226111404435635014003 0ustar mtfstaff AST - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION AST
Home  Index  
AST is the IntermediateLanguage produced by the FrontEnd and translated by Elaborate to CoreML.

Description

The abstract syntax tree produced by the FrontEnd.

Implementation

[WWW]ast-programs.sig [WWW]ast-programs.fun
[WWW]ast-modules.sig [WWW]ast-modules.fun
[WWW]ast-core.sig [WWW]ast-core.fun
[WWW]ast

Type Checking

The AST IntermediateLanguage has no independent type checker. Type inference is performed on an AST program as part of Elaborate.

Details and Notes

  • Source locations. MLton makes use of a relatively clean method for annotating the abstract syntax tree with source location information. Every source program phrase is "wrapped" with the WRAPPED interface:

    signature WRAPPED =
       sig
          type node'
          type obj
    
          val dest: obj -> node' * Region.t
          val makeRegion': node' * SourcePos.t * SourcePos.t -> obj
          val makeRegion: node' * Region.t -> obj
          val node: obj -> node'
          val region: obj -> Region.t
       end
    
    The key idea is that node' is the type of an unannotated syntax phrase and obj is the type of its annotated counterpart. In the implementation, every node' is annotated with a Region.t ([WWW]region.sig,[WWW]region.sml), which describes the syntax phrase's left source position and right source position, where SourcePos.t ([WWW]source-pos.sig,[WWW]source-pos.sml) denotes a particular file, line, and column. A typical use of the WRAPPED interface is illustrated by the following code:
                datatype node =
                   App of Longcon.t * t
                 | Const of Const.t
                 | Constraint of t * Type.t
                 | FlatApp of t vector
                 | Layered of {constraint: Type.t option,
                               fixop: Fixop.t,
                               pat: t,
                               var: Var.t}
                 | List of t vector
                 | Record of {flexible: bool,
                              items: (Record.Field.t * Item.t) vector}
                 | Tuple of t vector
                 | Var of {fixop: Fixop.t,
                           name: Longvid.t}
                 | Wild
    
                include WRAPPED sharing type node' = node
                                sharing type obj = t
    
    Thus, AST nodes are cleanly separated from source locations. By way of contrast, consider the approach taken by SML/NJ (and also by the CKit Library). Each datatype denoting a syntax phrase dedicates a special constructor for annotating source locations:
    datatype pat = WildPat                          (* empty pattern *)
            | AppPat of {constr:pat,argument:pat}   (* application *)
            | MarkPat of pat * region       (* mark a pattern *)
    
    The main drawback of this approach is that static type checking is not sufficient to guarantee that the AST emitted from the front-end is properly annotated.


Last edited on 2010-05-13 19:55:19 by MatthewFluet. mlton-20100608/doc/guide/BasisLibrary0000644000076600000240000005132611404435634015745 0ustar mtfstaff BasisLibrary - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION BasisLibrary
Home  Index  
The Standard ML Basis Library is a collection of modules dealing with basic types, input/output, OS interfaces, and simple datatypes. It is intended as a portable library usable across all implementations of SML. The official online version of the Basis Library specification is at [WWW]http://www.standardml.org/Basis/. We keep a copy at [WWW]http://mlton.org/basis/. There is a book that includes all of the online version and more. For a reverse chronological list of changes to the specification, see [WWW]http://www.standardml.org/Basis/history.html.

MLton implements all of the required portions of the Basis Library. MLton also implements many of the optional structures. You can obtain a complete and current list of what's available using mlton -show-basis (see ShowBasis). By default, MLton makes the Basis Library available to user programs. You can also access the Basis Library from ML Basis files.

Below is a complete list of what MLton implements.

  1. Top-level types and constructors
  2. Top-level exception constructors
  3. Top-level values
  4. Overloaded identifiers
  5. Top-level signatures
  6. Top-level structures
  7. Top-level functors
  8. Type equivalences
  9. Real and Math functions

Top-level types and constructors

eqtype 'a array
datatype bool = false | true
eqtype char
type exn
eqtype int
datatype 'a list = nil | :: of ('a * 'a list)
datatype 'a option = NONE | SOME of 'a
datatype order = EQUAL | GREATER | LESS
type real
datatype 'a ref = ref of 'a
eqtype string
type substring
eqtype unit
eqtype 'a vector
eqtype word

Top-level exception constructors

Bind
Chr
Div
Domain
Empty
Fail of string
Match
Option
Overflow
Size
Span
Subscript

Top-level values

MLton does not implement the optional top-level value use: string -> unit, which conflicts with whole-program compilation because it allows new code to be loaded dynamically. MLton implements all other top-level values:

!, :=, <>, =, @, ^, app, before, ceil, chr, concat, exnMessage, exnName, explode, floor, foldl, foldr, getOpt, hd, ignore, implode, isSome, length, map, not, null, o, ord, print, real, rev, round, size, str, substring, tl, trunc, valOf, vector.

Overloaded identifiers

*, +, -, /, <, <=, >, >=, ~, abs, div, mod.

Top-level signatures

ARRAY
ARRAY2
ARRAY_SLICE
BIN_IO
BIT_FLAGS
BOOL
BYTE
CHAR
COMMAND_LINE
DATE
GENERAL
GENERIC_SOCK
IEEE_REAL
IMPERATIVE_IO
INET_SOCK
INTEGER
INT_INF
IO
LIST
LIST_PAIR
MATH
MONO_ARRAY
MONO_ARRAY2
MONO_ARRAY_SLICE
MONO_VECTOR
MONO_VECTOR_SLICE
NET_HOST_DB
NET_PROT_DB
NET_SERV_DB
OPTION
OS
OS_FILE_SYS
OS_IO
OS_PATH
OS_PROCESS
PACK_REAL
PACK_WORD
POSIX
POSIX_ERROR
POSIX_FILE_SYS
POSIX_IO
POSIX_PROCESS
POSIX_PROC_ENV
POSIX_SIGNAL
POSIX_SYS_DB
POSIX_TTY
PRIM_IO
REAL
SOCKET
STREAM_IO
STRING
STRING_CVT
SUBSTRING
TEXT
TEXT_IO
TEXT_STREAM_IO
TIME
TIMER
UNIX
UNIX_SOCK
VECTOR
VECTOR_SLICE
WORD

Top-level structures

structure Array: ARRAY
structure Array2: ARRAY2
structure ArraySlice: ARRAY_SLICE
structure BinIO: BIN_IO
structure BinPrimIO: PRIM_IO
structure Bool: BOOL
structure BoolArray: MONO_ARRAY
structure BoolArray2: MONO_ARRAY2
structure BoolArraySlice: MONO_ARRAY_SLICE
structure BoolVector: MONO_VECTOR
structure BoolVectorSlice: MONO_VECTOR_SLICE
structure Byte: BYTE
structure Char: CHAR

  • Char characters correspond to ISO-8859-1. The Char functions do not depend on locale.

structure CharArray: MONO_ARRAY
structure CharArray2: MONO_ARRAY2
structure CharArraySlice: MONO_ARRAY_SLICE
structure CharVector: MONO_VECTOR
structure CharVectorSlice: MONO_VECTOR_SLICE
structure CommandLine: COMMAND_LINE
structure Date: DATE

  • Date.fromString and Date.scan accept a space in addition to a zero for the first character of the day of the month. The Basis Library specification only allows a zero.

structure FixedInt: INTEGER
structure General: GENERAL
structure GenericSock: GENERIC_SOCK
structure IEEEReal: IEEE_REAL
structure INetSock: INET_SOCK
structure IO: IO
structure Int: INTEGER
structure Int1: INTEGER
structure Int2: INTEGER
structure Int3: INTEGER
structure Int4: INTEGER
...
structure Int31: INTEGER
structure Int32: INTEGER
structure Int64: INTEGER
structure IntArray: MONO_ARRAY
structure IntArray2: MONO_ARRAY2
structure IntArraySlice: MONO_ARRAY_SLICE
structure IntVector: MONO_VECTOR
structure IntVectorSlice: MONO_VECTOR_SLICE
structure Int8: INTEGER
structure Int8Array: MONO_ARRAY
structure Int8Array2: MONO_ARRAY2
structure Int8ArraySlice: MONO_ARRAY_SLICE
structure Int8Vector: MONO_VECTOR
structure Int8VectorSlice: MONO_VECTOR_SLICE
structure Int16: INTEGER
structure Int16Array: MONO_ARRAY
structure Int16Array2: MONO_ARRAY2
structure Int16ArraySlice: MONO_ARRAY_SLICE
structure Int16Vector: MONO_VECTOR
structure Int16VectorSlice: MONO_VECTOR_SLICE
structure Int32: INTEGER
structure Int32Array: MONO_ARRAY
structure Int32Array2: MONO_ARRAY2
structure Int32ArraySlice: MONO_ARRAY_SLICE
structure Int32Vector: MONO_VECTOR
structure Int32VectorSlice: MONO_VECTOR_SLICE
structure Int64Array: MONO_ARRAY
structure Int64Array2: MONO_ARRAY2
structure Int64ArraySlice: MONO_ARRAY_SLICE
structure Int64Vector: MONO_VECTOR
structure Int64VectorSlice: MONO_VECTOR_SLICE
structure IntInf: INT_INF
structure LargeInt: INTEGER
structure LargeIntArray: MONO_ARRAY
structure LargeIntArray2: MONO_ARRAY2
structure LargeIntArraySlice: MONO_ARRAY_SLICE
structure LargeIntVector: MONO_VECTOR
structure LargeIntVectorSlice: MONO_VECTOR_SLICE
structure LargeReal: REAL
structure LargeRealArray: MONO_ARRAY
structure LargeRealArray2: MONO_ARRAY2
structure LargeRealArraySlice: MONO_ARRAY_SLICE
structure LargeRealVector: MONO_VECTOR
structure LargeRealVectorSlice: MONO_VECTOR_SLICE
structure LargeWord: WORD
structure LargeWordArray: MONO_ARRAY
structure LargeWordArray2: MONO_ARRAY2
structure LargeWordArraySlice: MONO_ARRAY_SLICE
structure LargeWordVector: MONO_VECTOR
structure LargeWordVectorSlice: MONO_VECTOR_SLICE
structure List: LIST
structure ListPair: LIST_PAIR
structure Math: MATH
structure NetHostDB: NET_HOST_DB
structure NetProtDB: NET_PROT_DB
structure NetServDB: NET_SERV_DB
structure OS: OS
structure Option: OPTION
structure PackReal32Big: PACK_REAL
structure PackReal32Little: PACK_REAL
structure PackReal64Big: PACK_REAL
structure PackReal64Little: PACK_REAL
structure PackRealBig: PACK_REAL
structure PackRealLittle: PACK_REAL
structure PackWord16Big: PACK_WORD
structure PackWord16Little: PACK_WORD
structure PackWord32Big: PACK_WORD
structure PackWord32Little: PACK_WORD
structure PackWord64Big: PACK_WORD
structure PackWord64Little: PACK_WORD
structure Position: INTEGER
structure Posix: POSIX
structure Real: REAL
structure RealArray: MONO_ARRAY
structure RealArray2: MONO_ARRAY2
structure RealArraySlice: MONO_ARRAY_SLICE
structure RealVector: MONO_VECTOR
structure RealVectorSlice: MONO_VECTOR_SLICE
structure Real32: REAL
structure Real32Array: MONO_ARRAY
structure Real32Array2: MONO_ARRAY2
structure Real32ArraySlice: MONO_ARRAY_SLICE
structure Real32Vector: MONO_VECTOR
structure Real32VectorSlice: MONO_VECTOR_SLICE
structure Real64: REAL
structure Real64Array: MONO_ARRAY
structure Real64Array2: MONO_ARRAY2
structure Real64ArraySlice: MONO_ARRAY_SLICE
structure Real64Vector: MONO_VECTOR
structure Real64VectorSlice: MONO_VECTOR_SLICE
structure Socket: SOCKET

  • The Basis Library specification requires functions like Socket.sendVec to raise an exception if they fail. However, on some platforms, sending to a socket that hasn't yet been connected causes a SIGPIPE signal, which invokes the default signal handler for SIGPIPE and causes the program to terminate. If you want the exception to be raised, you can ignore SIGPIPE by adding the following to your program.

    let
       open MLton.Signal
    in
       setHandler (Posix.Signal.pipe, Handler.ignore)
    end
    

structure String: STRING

  • The String functions do not depend on locale.

structure StringCvt: STRING_CVT
structure Substring: SUBSTRING
structure SysWord: WORD
structure Text: TEXT
structure TextIO: TEXT_IO
structure TextPrimIO: PRIM_IO
structure Time: TIME
structure Timer: TIMER
structure Unix: UNIX
structure UnixSock: UNIX_SOCK
structure Vector: VECTOR
structure VectorSlice: VECTOR_SLICE
structure Word: WORD
structure Word1: WORD
structure Word2: WORD
structure Word3: WORD
structure Word4: WORD
...
structure Word31: WORD
structure Word32: WORD
structure Word64: WORD
structure WordArray: MONO_ARRAY
structure WordArray2: MONO_ARRAY2
structure WordArraySlice: MONO_ARRAY_SLICE
structure WordVectorSlice: MONO_VECTOR_SLICE
structure WordVector: MONO_VECTOR
structure Word8Array: MONO_ARRAY
structure Word8Array2: MONO_ARRAY2
structure Word8ArraySlice: MONO_ARRAY_SLICE
structure Word8Vector: MONO_VECTOR
structure Word8VectorSlice: MONO_VECTOR_SLICE
structure Word16Array: MONO_ARRAY
structure Word16Array2: MONO_ARRAY2
structure Word16ArraySlice: MONO_ARRAY_SLICE
structure Word16Vector: MONO_VECTOR
structure Word16VectorSlice: MONO_VECTOR_SLICE
structure Word32Array: MONO_ARRAY
structure Word32Array2: MONO_ARRAY2
structure Word32ArraySlice: MONO_ARRAY_SLICE
structure Word32Vector: MONO_VECTOR
structure Word32VectorSlice: MONO_VECTOR_SLICE
structure Word64Array: MONO_ARRAY
structure Word64Array2: MONO_ARRAY2
structure Word64ArraySlice: MONO_ARRAY_SLICE
structure Word64Vector: MONO_VECTOR
structure Word64VectorSlice: MONO_VECTOR_SLICE

Top-level functors

ImperativeIO
PrimIO
StreamIO

  • MLton's StreamIO functor takes structures ArraySlice and VectorSlice in addition to the arguments specified in the Basis Library specification.

Type equivalences

The following types are equivalent.

FixedInt = Int64.int
LargeInt = IntInf.int
LargeReal.real = Real64.real
LargeWord = Word64.word

The default int, real, and word types may be set by the -default-type type compiler option. By default, the following types are equivalent:

int = Int.int = Int32.int
real = Real.real = Real64.real
word = Word.word = Word32.word

Real and Math functions

The Real, Real32, and Real64 modules are implemented using the C math library, so the SML functions will reflect the behavior of the underlying library function. We have made some effort to unify the differences between the math libraries on different platforms, and in particular to handle exceptional cases according to the Basis Library specification. However, there will be differences due to different numerical algorithms and cases we may have missed. Please submit a bug report if you encounter an error in the handling of an exceptional case.

On x86, real arithmetic is implemented internally using 80 bits of precision. Using higher precision for intermediate results in computations can lead to different results than if all the computation is done at 32 or 64 bits. If you require strict IEEE compliance, you can compile with -ieee-fp true, which will cause intermediate results to be stored after each operation. This may cause a substantial performance penalty.


Last edited on 2007-08-23 03:19:17 by MatthewFluet. mlton-20100608/doc/guide/Bug0000644000076600000240000000503111404435634014064 0ustar mtfstaff Bug - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Bug
Home  Index  
To report a bug, please send mail to [MAILTO]MLton@mlton.org. Please include the complete SML program that caused the problem and a log of a compile of the program with -verbose 2. For large messages (over 256K), please send an email containing the discussion text and a link to any large files. You may use our [WWW]TemporaryUpload page for uploading large files.

There are some UnresolvedBugs that we don't plan to fix.

We also maintain a list of bugs found with each release.


Last edited on 2006-08-10 12:26:17 by VesaKarvonen. mlton-20100608/doc/guide/Bugs200411090000644000076600000240000002415711404435634015102 0ustar mtfstaff Bugs20041109 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Bugs20041109
Home  Index  
Here are the known bugs in MLton 20041109, listed in reverse chronological order of date reported.

  • MLton.Finalizable.touch doesn't necessarily keep values alive long enough. Our SVN has a patch to the compiler. You must rebuild the compiler in order for the patch to take effect.

    Thanks to Florian Weimer for reporting this bug.

  • A bug in an optimization pass may incorrectly transform a program to flatten ref cells into their containing data structure, yielding a type-error in the transformed program. Our CVS has a [WWW]patch to the compiler. You must rebuild the compiler in order for the patch to take effect.

    Thanks to VesaKarvonen for reporting this bug.

  • A bug in the front end mistakenly allows unary constructors to be used without an argument in patterns. For example, the following program is accepted, and triggers a large internal error.

     fun f x = case x of SOME => true | _ => false
    We have fixed the problem in our CVS.

    Thanks to William Lovas for reporting this bug.

  • A bug in Posix.IO.{getlk,setlk,setlkw} causes a link-time error: undefined reference to Posix_IO_FLock_typ Our CVS has a [WWW]patch to the Basis Library implementation.

    Thanks to Adam Chlipala for reporting this bug.

  • A bug can cause programs compiled with -profile alloc to segfault. Our CVS has a [WWW]patch to the compiler. You must rebuild the compiler in order for the patch to take effect.

    Thanks to John Reppy for reporting this bug.

  • A bug in an optimization pass may incorrectly flatten ref cells into their containing data structure, breaking the sharing between the cells. Our CVS has a [WWW]patch to the compiler. You must rebuild the compiler in order for the patch to take effect.

    Thanks to Paul Govereau for reporting this bug.

  • Some arrays or vectors, such as (char * char) vector, are incorrectly implemented, and will conflate the first and second components of each element. Our CVS has a [WWW]patch to the compiler. You must rebuild the compiler in order for the patch to take effect.

    Thanks to Scott Cruzen for reporting this bug.

  • Socket.Ctl.getLINGER and Socket.Ctl.setLINGER mistakenly raise Subscript. Our CVS has a [WWW]patch to the Basis Library implementation.

    Thanks to Ray Racine for reporting the bug.

  • CML Mailbox.send makes a call in the wrong atomic context. Our CVS has a [WWW]patch to the CML implementation.

  • OS.Path.joinDirFile and OS.Path.toString did not raise InvalidArc when they were supposed to. They now do. Our CVS has a [WWW]patch to the Basis Library implementation.

    Thanks to Andreas Rossberg for reporting the bug.

  • The front end incorrectly disallows sequences of expressions (separated by semicolons) after a topdec has already been processed. For example, the following is incorrectly rejected.

     val x = 0;
     ignore x;
     ignore x;
    We have fixed the problem in our CVS.

    Thanks to Andreas Rossberg for reporting the bug.

  • The front end incorrectly disallows expansive val declarations that bind a type variable that doesn't occur in the type of the value being bound. For example, the following is incorrectly rejected.

     val 'a x = let exception E of 'a in () end
    We have fixed the problem in our CVS.

    Thanks to Andreas Rossberg for reporting this bug.

  • The x86 codegen fails to account for the possibility that a 64-bit move could interfere with itself (as simulated by 32-bit moves). We have fixed the problem in our CVS.

    Thanks to Scott Cruzen for reporting this bug.

  • NetHostDB.scan and NetHostDB.fromString incorrectly raise an exception on internet addresses whose last component is a zero, e.g 0.0.0.0. Our CVS has a [WWW]patch to the Basis Library implementation.

    Thanks to Scott Cruzen for reporting this bug.

  • StreamIO.inputLine has an off-by-one error causing it to drop the first character after a newline in some situations. Our CVS has a [WWW]patch. to the Basis Library implementation.

    Thanks to Scott Cruzen for reporting this bug.

  • BinIO.getInstream and TextIO.getInstream are implemented incorrectly. This also impacts the behavior of BinIO.scanStream and TextIO.scanStream. If you (directly or indirectly) realize a TextIO.StreamIO.instream and do not (directly or indirectly) call TextIO.setInstream with a derived stream, you may lose input data. We have fixed the problem in our CVS.

    Thanks to WesleyTerpstra for reporting this bug.

  • Posix.ProcEnv.setpgid doesn't work. If you compile a program that uses it, you will get a link time error

    undefined reference to `Posix_ProcEnv_setpgid'
    The bug is due to Posix_ProcEnv_setpgid being omitted from the MLton runtime. We fixed the problem in our CVS by adding the following definition to runtime/Posix/ProcEnv/ProcEnv.c
     Int Posix_ProcEnv_setpgid (Pid p, Gid g) {
            return setpgid (p, g);
    }
    

    Thanks to Tom Murphy for reporting this bug.


Last edited on 2007-08-24 20:21:00 by MatthewFluet. mlton-20100608/doc/guide/Bugs200512020000644000076600000240000002313511404435634015070 0ustar mtfstaff Bugs20051202 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Bugs20051202
Home  Index  
Here are the known bugs in MLton 20051202, listed in reverse chronological order of date reported.

  • Bug in the [WWW]Real<N>.fmt, [WWW]Real<N>.fromString, [WWW]Real<N>.scan, and [WWW]Real<N>.toString functions of the basis library implementation. These functions were using TO_NEAREST semantics, but should obey the current rounding mode. (Only Real<N>.fmt StringCvt.EXACT, Real<N>.fromDecimal, and Real<N>.toDecimal are specified to override the current rounding mode with TO_NEAREST semantics.) Thanks to Sean McLaughlin for the bug report. Fixed by revision [WWW]5827.

  • Bug in the treatment of floating-point operations. Floating-point operations depend on the current rounding mode, but were being treated as pure. Thanks to Sean McLaughlin for the bug report. Fixed by revision [WWW]5794.

  • Bug in the [WWW]Real32.toInt function of the basis library implementation could lead incorrect results when applied to a Real.real value numerically close to valOf(Int.maxInt). Fixed by revision [WWW]5764.

  • The [WWW]Socket structure of the basis library implementation used andb rather than orb to unmarshal socket options (for Socket.Ctl.get<OPT> functions). Thanks to Anders Petersson for the bug report and patch. Fixed by revision [WWW]5735.

  • Bug in the [WWW]Date structure of the basis library implementation yielded some functions that would erroneously raise Date when applied to a year before 1900. Thanks to Joe Hurd for the bug report. Fixed by revision [WWW]5732.

  • Bug in monomorphisation pass could exhibit the error Type error: type mismatch. Thanks to Vesa Karvonen for the bug report. Fixed by revision [WWW]5731.

  • The [WWW]PackReal<N>.toBytes function in the basis library implementation incorrectly shared (and mutated) the result vector. Thanks to Eric McCorkle for the bug report and patch. Fixed by revision [WWW]5281.

  • Bug in elaboration of FFI forms. Using a unary FFI types (e.g., array, ref, vector) in places where MLton.Pointer.t was required would lead to an internal error TypeError. Fixed by revision [WWW]4890.

  • The optimizer reports an internal error (TypeError) when an imported C function is called but not used. Thanks to jq for the bug report. Fixed by revision [WWW]4690.

  • Bug in pass to flatten data structures. Thanks to Joe Hurd for the bug report. Fixed by revision [WWW]4662.

  • The native codegen's implementation of the C-calling convention failed to widen 16-bit arguments to 32-bits. Fixed by revision [WWW]4631.

  • MLton.share could cause a segmentation fault. Fixed by revision [WWW]4400.

  • The SSA simplifier could eliminate an irredundant test. Fixed by revision [WWW]4370.

  • A program with a very large number of functors could exhibit the error ElaborateEnv.functorClosure: firstTycons. Fixed by revision [WWW]4344.


Last edited on 2007-08-24 20:21:04 by MatthewFluet. mlton-20100608/doc/guide/Bugs200708260000644000076600000240000003100311404435634015076 0ustar mtfstaff Bugs20070826 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Bugs20070826
Home  Index  
Here are the known bugs in MLton 20070826, listed in reverse chronological order of date reported.

  • Bug in the mark-compact garbage collector where the C library's memcpy was used to move objects during the compaction phase; this could lead to heap corruption and segmentation faults with newer versions of gcc and/or glibc, which assume that src and dst in a memcpy do not overlap. Fixed by revision [WWW]7461.

  • Bug in elaboration of datatype declarations with withtype bindings. Fixed by revision [WWW]7434.

  • Performance bug in RefFlatten optimization pass. Thanks to Reactive Systems for the bug report. Fixed by revision [WWW]7379.

  • Performance bug in SimplifyTypes optimization pass. Thanks to Reactive Systems for the bug report. Fixed by revisions [WWW]7377 and [WWW]7378.

  • Bug in amd64 codegen register allocation of indirect C calls. Thanks to David Hansel for the bug report. Fixed by revision [WWW]7368.

  • Bug in IntInf.scan and IntInf.fromString where leading spaces were only accepted if the stream had an explicit sign character. Thanks to David Hansel for the bug report. Fixed by revisions [WWW]7227 and [WWW]7230.

  • Bug in IntInf.~>> that could cause a glibc assertion. Fixed by revisions [WWW]7083, [WWW]7084, and [WWW]7085.

  • Bug in the return type of MLton.Process.reap. Thanks to Risto Saarelma for the bug report. Fixed by revision [WWW]7029.

  • Bug in MLton.size and MLton.share when tracing the current stack. Fixed by revisions [WWW]6978, [WWW]6981, [WWW]6988, [WWW]6989, and [WWW]6990.

  • Bug in nested _export/_import functions. Fixed by revision [WWW]6919.

  • Bug in the name mangling of _import-ed functions with the stdcall convention. Thanks to Lars Bergstrom for the bug report. Fixed by revision [WWW]6672.

  • Bug in Windows code to page the heap to disk when unable to grow the heap to a desired size. Thanks to Sami Evangelista for the bug report. Fixed by revisions [WWW]6600 and [WWW]6624.

  • Bug in *NIX code to page the heap to disk when unable to grow the heap to a desired size. Thanks to Nicolas Bertolotti for the bug report and patch. Fixed by revisions [WWW]6596 and [WWW]6600.

  • Space-safety bug in pass to flatten refs into containing data structure. Thanks to Daniel Spoonhower for the bug report and initial diagnosis and patch. Fixed by revision [WWW]6395.

  • Bug in the frontend that rejected op longvid patterns and expressions. Thanks to Florian Weimer for the bug report. Fixed by revision [WWW]6347.

  • Bug in algebraic simplification of real primitives. [WWW]Real<N>.<=(x, x) is false when x is NaN. Fixed by revision [WWW]6242.

  • Bug in the FFI visible representation of Int16.int ref (and references of other primitive types smaller than 32-bits) on big-endian platforms. Thanks to Dave Herman for the bug report. Fixed by revision [WWW]6267.

  • Bug in type inference of flexible records. This would later cause the compiler to raise the TypeError exception. Thanks to Wesley Terpstra for the bug report. Fixed by revision [WWW]6229.

  • Bug in cross-compilation of gdtoa library. Thanks to Wesley Terpstra for the bug report and patch. Fixed by revision [WWW]6620.

  • Bug in pass to flatten refs into containing data structure. Thanks to Ruy Ley-Wild for the bug report. Fixed by revision [WWW]6191.

  • Bug in the handling of weak pointers by the mark-compact garbage collector. Thanks to Sean McLaughlin for the bug report and Florian Weimer for the initial diagnosis. Fixed by revision [WWW]6183.

  • Bug in the elaboration of structures with signature constraints. This would later cause the compiler to raise the TypeError exception. Thanks to Vesa Karvonen for the bug report. Fixed by revision [WWW]6046.

  • Bug in the interaction of _export-ed functions and signal handlers. Thanks to Sean McLaughlin for the bug report. Fixed by revision [WWW]6013.

  • Bug in the implementation of _export-ed functions using the char type, leading to a linker error. Thanks to Katsuhiro Ueno for the bug report. Fixed by revision [WWW]5999.


Last edited on 2010-05-13 13:28:40 by MatthewFluet. mlton-20100608/doc/guide/Bugs201006080000644000076600000240000000343211404435634015073 0ustar mtfstaff Bugs20100608 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Bugs20100608
Home  Index  
Here are the known bugs in MLton 20100608, listed in reverse chronological order of date reported.


Last edited on 2010-06-08 14:31:31 by MatthewFluet. mlton-20100608/doc/guide/CallGraph0000644000076600000240000001625611404435634015217 0ustar mtfstaff CallGraph - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CallGraph
Home  Index  
For easier visualization of profiling data, mlprof can create a call graph of the program in dot format, from which you can use the [WWW]graphviz software package to create a postscript graph. For example,
mlprof -call-graph foo.dot foo mlmon.out
will create foo.dot with a complete call graph. For each source function, there will be one node in the graph that contains the function name (and source position with -show-line true), as well as the percentage of ticks. If you want to create a call graph for your program without any profiling data, you can simply call mlprof without any mlmon.out files, as in
mlprof -call-graph foo.dot foo

Because SML has higher-order functions, the call graph is is dependent on MLton's analysis of which functions call each other. This analysis depends on many implementation details and might display spurious edges that a human could conclude are impossible. However, in practice, the call graphs tend to be very accurate.

Because call graphs can get big, mlprof provides the -keep option to specify the nodes that you would like to see. This option also controls which functions appear in the table that mlprof prints. The argument to -keep is an expression describing a set of source functions (i.e. graph nodes). The expression e should be of the following form.

  • all

  • "s"

  • (and e ...)

  • (from e)

  • (not e)

  • (or e)

  • (pred e)

  • (succ e)

  • (thresh x)

  • (thresh-gc x)

  • (thresh-stack x)

  • (to e)

In the grammar, all denotes the set of all nodes. "s" is a regular expression denoting the set of functions whose name (followed by a space and the source position) has a prefix matching the regexp. The and, not, and or expressions denote intersection, complement, and union, respectively. The pred and succ expressions add the set of immediate predecessors or successors to their argument, respectively. The from and to expressions denote the set of nodes that have paths from or to the set of nodes denoted by their arguments, respectively. Finally, thresh, thresh-gc, and thresh-stack denote the set of nodes whose percentage of ticks, gc ticks, or stack ticks, respectively, is greater than or equal to the real number x.

For example, if you want to see the entire call graph for a program, you can use -keep all (this is the default). If you want to see all nodes reachable from function foo in your program, you would use -keep '(from "foo")'. Or, if you want to see all the functions defined in subdirectory bar of your project that used at least 1% of the ticks, you would use

-keep '(and ".*/bar/" (thresh 1.0))'
To see all functions with ticks above a threshold, you can also use -thresh x, which is an abbreviation for -keep '(thresh x)'. You can not use multiple -keep arguments or both -keep and -thresh. When you use -keep to display a subset of the functions, mlprof will add dashed edges to the call graph to indicate a path in the original call graph from one function to another.

When compiling with -profile-stack true, you can use mlprof -gray true to make the nodes darker or lighter depending on whether their stack percentage is higher or lower.

MLton's optimizer may duplicate source functions for any of a number of reasons (functor duplication, monomorphisation, polyvariance, inlining). By default, all duplicates of a function are treated as one. If you would like to treat the duplicates separately, you can use mlprof -split regexp, which will cause all duplicates of functions whose name has a prefix matching the regular expression to be treated separately. This can be especially useful for higher-order utility functions like General.o.

Caveats

Technically speaking, mlprof produces a call-stack graph rather than a call graph, because it describes the set of possible call stacks. The difference is in how tail calls are displayed. For example if f nontail calls g and g tail calls h, then the call-stack graph has edges from f to g and f to h, while the call graph has edges from f to g and g to h. That is, a tail call from g to h removes g from the call stack and replaces it with h.


Last edited on 2005-11-30 23:11:25 by StephenWeeks. mlton-20100608/doc/guide/CallingFromCToSML0000644000076600000240000002376411404435635016544 0ustar mtfstaff CallingFromCToSML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CallingFromCToSML
Home  Index  
MLton's ForeignFunctionInterface allows programs to export SML functions to be called from C. Suppose you would like export from SML a function of type real * char -> int as the C function foo. MLton extends the syntax of SML to allow expressions like the following:
_export "foo": (real * char -> int) -> unit;
The above expression exports a C function named foo, with prototype
Int32 foo (Real64 x0, Char x1);
The _export expression denotes a function of type (real * char -> int) -> unit that when called with a function f, arranges for the exported foo function to call f when foo is called. So, for example, the following exports and defines foo.
val e = _export "foo": (real * char -> int) -> unit;
val _ = e (fn (x, c) => 13 + Real.floor x + Char.ord c)

The general form of an _export expression is

_export "C function name" attr... : cFuncTy -> unit;

The type and the semicolon are not optional. As with _import, a sequence of attributes may follow the function name.

MLton's -export-header option generates a C header file with prototypes for all of the functions exported from SML. Include this header file in your C files to type check calls to functions exported from SML. This header file includes typedefs for the types that can be passed between SML and C.

Example

Suppose that export.sml is

val e = _export "f": (int * real * char -> char) -> unit;
val _ = e (fn (i, r, _) =>
           (print (concat ["i = ", Int.toString i,
                           "  r = ", Real.toString r, "\n"])
            ; #"g"))
val g = _import "g" public: unit -> unit;
val _ = g ()
val _ = g ()

val e = _export "f2": (Word8.word -> word array) -> unit;
val _ = e (fn w =>
           Array.tabulate (10, fn _ => Word.fromLargeWord (Word8.toLargeWord w)))
val g2 = _import "g2" public: unit -> word array;
val a = g2 ()
val _ = print (concat ["0wx", Word.toString (Array.sub (a, 0)), "\n"])

val e = _export "f3": (unit -> unit) -> unit;
val _ = e (fn () => print "hello\n");
val g3 = _import "g3" public: unit -> unit;
val _ = g3 ()

(* This example demonstrates mutual recursion between C and SML. *)
val e = _export "f4": (int -> unit) -> unit;
val g4 = _import "g4" public: int -> unit;
val _ = e (fn i => if i = 0 then () else g4 (i - 1))
val _ = g4 13

val (_, zzzSet) = _symbol "zzz" alloc: (unit -> int) * (int -> unit);
val () = zzzSet 42
val g5 = _import "g5" public: unit -> unit;
val _ = g5 ()

val _ = print "success\n"

Create the header file with -export-header.

% mlton -default-ann 'allowFFI true'    \
        -export-header export.h         \
        -stop tc                        \
        export.sml

export.h now contains the following C prototypes.

Int8 f (Int32 x0, Real64 x1, Int8 x2);
Pointer f2 (Word8 x0);
void f3 ();
void f4 (Int32 x0);
extern Int32 zzz;

Use export.h in a C program, ffi-export.c, as follows.

#include <stdio.h>
#include "export.h"

/* Functions in C are by default PUBLIC symbols */
void g () {
        Char8 c;

        fprintf (stderr, "g starting\n");
        c = f (13, 17.15, 'a');
        fprintf (stderr, "g done  char = %c\n", c);
}

Pointer g2 () {
        Pointer res;
        fprintf (stderr, "g2 starting\n");
        res = f2 (0xFF);
        fprintf (stderr, "g2 done\n");
        return res;
}

void g3 () {
        fprintf (stderr, "g3 starting\n");
        f3 ();
        fprintf (stderr, "g3 done\n");
}

void g4 (Int32 i) {
        fprintf (stderr, "g4 (%d)\n", i);
        f4 (i);
}

void g5 () {
        fprintf (stderr, "g5 ()\n");
        fprintf (stderr, "zzz = %i\n", zzz);
        fprintf (stderr, "g5 done\n");
}

Compile ffi-export.c and export.sml.

% gcc -c ffi-export.c
% mlton -default-ann 'allowFFI true' \
         export.sml ffi-export.o

Finally, run export.

% ./export
g starting
...
g4 (0)
success

Download


Last edited on 2006-11-02 17:34:21 by MatthewFluet. mlton-20100608/doc/guide/CallingFromSMLToC0000644000076600000240000001616211404435635016536 0ustar mtfstaff CallingFromSMLToC - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CallingFromSMLToC
Home  Index  
MLton's ForeignFunctionInterface allows an SML program to import C functions. Suppose you would like to import from C a function with the following prototype:
int foo (double d, char c);
MLton extends the syntax of SML to allow expressions like the following:
_import "foo": real * char -> int;
This expression denotes a function of type real * char -> int whose behavior is implemented by calling the C function whose name is foo. Thinking in terms of C, imagine that there are C variables d of type double, c of type unsigned char, and i of type int. Then, the C statement i = foo (d, c) is executed and i is returned.

The general form of an _import expression is:

_import "C function name" attr... : cFuncTy;
The type and the semicolon are not optional.

The function name is followed by a (possibly empty) sequence of attributes, analogous to C __attribute__ specifiers. For now, the only attributes supported are cdecl and stdcall. These specify the calling convention of the C function on Cygwin/Windows, and are ignored on all other platforms. The default is cdecl. You must use stdcall in order to correctly call Windows API functions.

Example

import.sml imports the C function ffi and the C variable FFI_INT as follows.

(* main.sml *)

(* Declare ffi to be implemented by calling the C function ffi. *)
val ffi = _import "ffi" public: real array * int * int ref * char ref * int -> char;
open Array

val size = 10
val a = tabulate (size, fn i => real i)
val ri = ref 0
val rc = ref #"0"
val n = 17

(* Call the C function *)
val c = ffi (a, Array.length a, ri, rc, n)

(* FFI_INT is declared as public in ffi-import.c *)
val (nGet, nSet) = _symbol "FFI_INT" public: (unit -> int) * (int -> unit);

val _ = print (concat [Int.toString (nGet ()), "\n"])

val _ =
   print (if c = #"c" andalso !ri = 45 andalso !rc = c
             then "success\n"
          else "fail\n")

ffi-import.c is

#include "export.h"

Int32 FFI_INT = 13;
Word32 FFI_WORD = 0xFF;
Bool FFI_BOOL = 1;
Real64 FFI_REAL = 3.14159;

Char8 ffi (Pointer a1, Int32 a1len, Pointer a2, Pointer a3, Int32 n) {
        double *ds = (double*)a1;
        int *pi = (int*)a2;
        char *pc = (char*)a3;
        int i;
        double sum;

        sum = 0.0;
        for (i = 0; i < a1len; ++i) {
                sum += ds[i];
                ds[i] += n;
        }
        *pi = (int)sum;
        *pc = 'c';
        return 'c';
}

Compile and run the program.

% mlton -default-ann 'allowFFI true' import.sml ffi-import.c
% ./import
13
success

Download

Next Steps


Last edited on 2006-11-14 01:25:50 by MatthewFluet. mlton-20100608/doc/guide/CallingFromSMLToCFunctionPointer0000644000076600000240000003033111404435634021576 0ustar mtfstaff CallingFromSMLToCFunctionPointer - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CallingFromSMLToCFunctionPointer
Home  Index  
Just as MLton can directly call C functions, it is possible to make indirect function calls; that is, function calls through a function pointer. MLton extends the syntax of SML to allow expressions like the following:
_import * : MLton.Pointer.t -> real * char -> int;

This expression denotes a function of type

MLton.Pointer.t -> real * char -> int
whose behavior is implemented by calling the C function at the address denoted by the MLton.Pointer.t argument, and supplying the C function two arguments, a double and an int. The C function pointer may be obtained, for example, by the dynamic linking loader (dlopen, dlsym, ...).

The general form of an indirect _import expression is:

_import * attr... : cPtrTy -> cFuncTy;

The type and the semicolon are not optional.

Example

This example uses dlopen and friends (imported using normal _import) to dynamically load the math library (libm) and call the cos function. Suppose iimport.sml contains the following.

signature DYN_LINK =
   sig
      type hndl
      type mode
      type fptr

      val dlopen : string * mode -> hndl
      val dlsym : hndl * string -> fptr
      val dlclose : hndl -> unit

      val RTLD_LAZY : mode
      val RTLD_NOW : mode
   end

structure DynLink :> DYN_LINK =
   struct
      type hndl = MLton.Pointer.t
      type mode = Word32.word
      type fptr = MLton.Pointer.t

      (* These symbols come from a system libray, so the default import scope
       * of external is correct.
       *)
      val dlopen =
         _import "dlopen" : string * mode -> hndl;
      val dlerror =
         _import "dlerror": unit -> MLton.Pointer.t;
      val dlsym =
         _import "dlsym" : hndl * string -> fptr;
      val dlclose =
         _import "dlclose" : hndl -> Int32.int;

      val RTLD_LAZY = 0wx00001 (* Lazy function call binding.  *)
      val RTLD_NOW  = 0wx00002 (* Immediate function call binding.  *)

      val dlerror = fn () =>
         let
            val addr = dlerror ()
         in
            if addr = MLton.Pointer.null
               then NONE
               else let
                       fun loop (index, cs) =
                          let
                             val w = MLton.Pointer.getWord8 (addr, index)
                             val c = Byte.byteToChar w
                          in
                             if c = #"\000"
                                then SOME (implode (rev cs))
                                else loop (index + 1, c::cs)
                          end
                    in
                       loop (0, [])
                    end
         end

      val dlopen = fn (filename, mode) =>
         let
            val filename = filename ^ "\000"
            val hndl = dlopen (filename, mode)
         in
            if hndl = MLton.Pointer.null
               then raise Fail (case dlerror () of
                                   NONE => "???"
                                 | SOME s => s)
               else hndl
         end

      val dlsym = fn (hndl, symbol) =>
         let
            val symbol = symbol ^ "\000"
            val fptr = dlsym (hndl, symbol)
         in
            case dlerror () of
               NONE => fptr
             | SOME s => raise Fail s
         end

      val dlclose = fn hndl =>
         if MLton.Platform.OS.host = MLton.Platform.OS.Darwin
            then ()  (* Darwin reports the following error message if you
                      * try to close a dynamic library.
                      *   "dynamic libraries cannot be closed"
                      * So, we disable dlclose on Darwin.
                      *)
         else
            let
               val res = dlclose hndl
            in
               if res = 0
                  then ()
               else raise Fail (case dlerror () of
                                   NONE => "???"
                                 | SOME s => s)
            end
   end

val dll =
   let
      open MLton.Platform.OS
   in
      case host of
         Cygwin => "cygwin1.dll"
       | Darwin => "libm.dylib"
       | _ => "libm.so"
   end

val hndl = DynLink.dlopen (dll, DynLink.RTLD_LAZY)

local
   val double_to_double =
      _import * : DynLink.fptr -> real -> real;
   val cos_fptr = DynLink.dlsym (hndl, "cos")
in
   val cos = double_to_double cos_fptr
end

val _ = print (concat ["    Math.cos(2.0) = ", Real.toString (Math.cos 2.0), "\n",
                       "libm.so::cos(2.0) = ", Real.toString (cos 2.0), "\n"])

val _ = DynLink.dlclose hndl

Compile and run iimport.sml.

% mlton -default-ann 'allowFFI true'    \
        -target-link-opt linux -ldl     \
        -target-link-opt solaris -ldl   \
         iimport.sml
% iimport
    Math.cos(2.0) = ~0.416146836547
libm.so::cos(2.0) = ~0.416146836547

This example also shows the -target-link-opt option, which uses the switch when linking only when on the specified platform. Compile with -verbose 1 to see in more detail what's being passed to gcc.

Download


Last edited on 2006-11-02 17:49:16 by MatthewFluet. mlton-20100608/doc/guide/Changelog0000644000076600000240000027010611404435634015245 0ustar mtfstaff Changelog - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Changelog
Home  Index  
Here are the changes from version 20070826 to version YYYYMMDD.

Summary:
  + New platforms.
   o ia64-hpux
   o powerpc64-aix
  + Compiler.
   o Command-line switches.
    * Added: -mlb-path-var '<name> <value>'
    * Removed: -keep sml, -stop sml
   o Improved constant folding of floating-point operations.
   o Experimental: Support for compiling to a C library; see wiki
       documentation.
   o Extended -show-def-use output to include types of variable
       definitions.
   o Deprecated features (to be removed in a future release)
    * Bytecode codegen: The bytecode codegen has not seen significant
        use and it is not well understood by any of the active
        developers.
    * Support for .cm files as input: The ML Basis system provides
        much better infrastructure for "programming in the very large"
        than the (very) limited support for CM.  The cm2mlb tool
        (available in the source distribution) can be used to convert
        CM projects to MLB projects, preserving the CM scoping of
        module identifiers.
   o Bug fixes: see changelog
  + Runtime.
   o @MLton switches.
    * Added: may-page-heap {false|true}
   o may-page-heap: By default, MLton will not page the heap to disk
       when unable to grow the heap to accomodate an allocation.
       (Previously, this behavior was the default, with no means to
       disable, with security an least-surprise issues.)
   o Bug fixes: see changelog
  + Language.
   o Allow numeric characters in ML Basis path variables.
  + Libraries.
   o Basis Library.
    * Bug fixes: see changelog.
   o MLton structure.
    * Added: MLton.equal, MLton.hash, MLton.Cont.isolate,
        MLton.GC.Statistics, MLton.Pointer.sizeofPointer,
        MLton.Socket.Address.toVector
    * Changed:
    * Deprecated: MLton.Socket
   o Unsafe structure.
    * Added versions of all of the monomorphic array and vector
      structures.
   o Other libraries.
    * Updated: ckit library, MLRISC library, SML/NJ library.
  + Tools.
   o mllex
    * Eliminated top-level 'type int = Int.int' in output.
    * Include (*#line line:col "file.lex" *) directives in output.
    * Added %posint command, to set the yypos type and allow the
      lexing of multi-gigabyte files.
   o mlnlffigen
    * Added command-line switches -linkage archive and -linkage shared.
    * Deprecated command-line switch -linkage static.
    * Added support for ia64 and hppa targets.
   o mlyacc
    * Eliminated top-level 'type int = Int.int' in output.
    * Include (*#line line:col "file.grm" *) directives in output.

* 2010-05-12
  - Fixed bug in the mark-compact garbage collector where the C
    library's memcpy was used to move objects during the compaction
    phase; this could lead to heap corruption and segmentation faults
    with newer versions of gcc and/or glibc, which assume that src and
    dst in a memcpy do not overlap.

* 2010-03-12
  - Fixed bug in elaboration of datatype declarations with withtype
    bindings.

* 2009-12-11
  - Fixed performance bug in ref flatten SSA2 optimization.

* 2009-12-09
  - Fixed performance bug in simplify types SSA optimization.

* 2009-12-02
  - Fixed bug in amd64 codegen register allocation of indirect C calls.

* 2009-09-17
  - Fixed bug in IntInf.scan and IntInf.fromString where leading
    spaces were only accepted if the stream had an explicit sign
    character.

* 2009-07-10
  - Added combine conversions SSA optimization.

* 2009-06-09
   - Removed deprecated command line switch -show-anns {false, true}.

* 2009-04-18
   - Removed command line switches -keep sml and -stop sml.  Their
     meaning was unclear with .mlb files; their effect with .cm files
     can be achieved with -stop f.

* 2009-04-16
   - Fixed bug in IntInf.~>> that could cause a glibc assertion
     failure.

* 2009-04-01
   - Fixed exported type of MLton.Process.reap.

* 2009-01-27
   - Added MLton.Socket.Address.toVector to get the network-byte-order
     representation of an IP address.

* 2008-11-10
   - Fixed bug in MLton.size and MLton.share when tracing the current
     stack.

* 2008-10-27
   - Fixed phantom typing of sockets by hiding the representation of socket
     types.  Previously the representation of sockets was revealed rendering
     the phantom types useless.

* 2008-10-10
   - Fixed bug in nexted _export/_import functions.

* 2008-09-12
   - Improved constant folding of floating point operations.

* 2008-08-20
   - Store the card/cross map at the end of the allocated ML heap;
     avoids possible out of memory errors when resizing the ML heap
     cannot be followed by a card/cross map allocation.

* 2008-07-24
   - Added support for compiling to a C library. The relevant new compiler
     options are '-ar' and '-format'. Libraries are named based on the
     name of the -export-header file. Libraries have two extra methods:
       * NAME_open(argc, argv) initializes the library and runs the SML code
         until it reaches the end of the program. If the SML code exits or
         raises an uncaught exception, the entire program will terminate.
       * NAME_close() will execute any registered atExit functions, any
         outstanding finalizers, and frees the ML heap.

* 2008-07-16
   - Fixed bug in the name mangling of _import-ed functions with the
     stdcall convention.

* 2008-06-12
   - Added MLton.Pointer.sizeofPointer.

* 2008-06-06
   - Added expert command line switch -emit-main {true|false}.

* 2008-05-17
   - Fixed bug in Windows code to page the heap to disk when unable to
     grow the heap to a desired size.
     Thanks to Sami Evangelista for the bug report.

* 2008-05-10
   - Implemented MLton.Cont.isolate.

* 2008-04-20
   - Fixed bug in *NIX code to page the heap to disk when unable to
     grow the heap to a desired size.
     Thanks to Nicolas Bertolotti for the bug report and patch.

* 2008-04-07
   - More flexible active/paused stack resizing policy.
     Removed thread-shrink-ratio runtime option.
     Added stack-current-grow-ratio, stack-current-max-reserved-ratio,
     stack-current-permit-ratio, stack-current-shrink-ratio,
     stack-max-reserved-ratio, and stack-shrink-ratio runtime options.

* 2008-04-07
   - Fixed bugs in Basis Library where the representations of
     OS.IO.iodesc, Posix.IO.file_desc, Posix.Signal.signal,
     Socket.sock, Socket.SOGK.sock_type as integers were exposed.

* 2008-03-14
   - Added unsafe versions of all of the monomorphic array and vector
     structures.

* 2008-03-02
   - Fixed bug in Basis Library where the representation of
     OS.Process.status as an integer was exposed.

* 2008-02-13
   - Fixed space-safety bug in pass to flatten refs into containing
     data structure. Thanks to Daniel Spoonhower for the bug report
     and initial diagnosis and patch.

* 2008-01-25
   - Various updates to GC statistics gathering.  Some basic GC
     statistics can be accessed from SML by MLton.GC.Statistics.*
     functions.

* 2008-01-24
   - Added primitive (structural) polymorphic hash.

* 2008-01-21
   - Fixed frontend to accept "op longvid" patterns and expressions.
     Thanks to Florian Weimer for the bug report.

* 2008-01-17
   - Extended -show-def-use output to include types of variable
     definitions.

* 2008-01-09
   - Extended MLton_equal to be a structural equality on all types,
     including real and -> types.

* 2007-12-18
   - Changed ML-Yacc and ML-Lex to output line directives so that
     MLton's def-use information points to the source files (.grm
     and .lex) instead of the generated implementations (.grm.sml
     and .lex.sml).

* 2007-12-14
   - Added runtime option 'may-page-heap {false|true}'.  By default,
     MLton will not page the heap to disk when unable to grow the heap
     to a desired size.  (Previously, this behavior was the default,
     with no means to disable, with security and least-surprise
     concerns.)
     Thanks to Wesley Terpstra for the patch.
   - Fixed bug the FFI visible representation of Int16.int ref (and
     references of other primitive types smaller than 32-bits) on
     big-endian platforms.
     Thanks to Dave Herman for the bug report.

* 2007-12-13
   - Fixed bug in ImperativeIOExtra.canInput (TextIO.canInput).
     Thanks to Ville Laurikari for the bug report.

* 2007-12-09
   - Better constant folding of IntInf operations.

* 2007-12-07
   - Fixed bug in algebraic simplification of real primitives.
     Real.<= (x, x) is false when x is NaN.

* 2007-11-29
   - Fixed bug in type inference of flexible records.  This would
     later cause the compiler to raise the TypeError exception.
     Thanks to Wesley Terpstra for the bug report.

* 2007-11-28
   - Fixed bug in cross-compilation of gdtoa library.  Thanks to
     Wesley Terpstra for the bug report and patch.

* 2007-11-20
   - Fixed bug in pass to flatten refs into containing data structure.
     Thanks to Ruy LeyWild for the bug report.

* 2007-11-19
   - Fixed bug in the handling of weak pointers by the mark-compact
     garbage collector.  Thanks to Sean McLaughlin for the bug report
     and Florian Weimer for the initial diagnosis.

* 2007-11-07
   - Added %posint command to ml-lex, to set the yypos type and allow
     the lexing of multi-gigabyte input files.  Thanks to Florian
     Weimer for the feature concept and original patch.

* 2007-11-07
   - Added command-line switch -mlb-path-var '<name> <value>' for
     specifying MLB path variables.

* 2007-11-06
  - Allow numeric characters in MLB path variables.

* 2007-09-20
   - Fixed bug in elaboration of structures with signature
     constraints.  This would later cause the compiler to raise the
     TypeError exception.  Thanks to Vesa Karvonen for the bug report.

* 2007-09-11
   - Fixed bug in interaction of _export-ed functions and signal
     handlers.  Thanks to Sean McLaughlin for the bug report.

* 2007-09-03
   - Fixed bug in implementation of _export-ed functions using 'char'
     type.  Thanks to Katsuhiro Ueno for the bug report.

--------------------------------------------------------------------------------

Here are the changes from version 20051202 to version 20070826.

Summary:
  + New platforms:
   o amd64-linux, amd64-freebsd
   o hppa-hpux
   o powerpc-aix
   o x86-darwin (Mac OS X)
  + Compiler.
   o Support for 64-bit platforms.
    * Native amd64 codegen.
   o Command-line switches.
    * Added: -codegen amd64, -codegen x86, -default-type <type>,
        -profile-val {false|true}.
    * Changed: -stop f (file listing now includes .mlb files)
   o Bytecode codegen.
    * Support for profiling.
    * Support for exception history.
  + Language.
   o ML Basis annotations.
    * Removed: allowExport, allowImport, sequenceUnit, warnMatch.
  + Libraries.
   o Basis Library.
    * Added: PackWord16Big, PackWord16Little, PackWord64Big,
        PackWord64Little.
    * Bug Fixes: see changelog.
   o MLton structure.
    * Added: MLTON_MONO_ARRAY, MLTON_MONO_VECTOR, MLTON_REAL,
        MLton.BinIO.tempPrefix, MLton.CharArray, MLton.CharVector,
        MLton.IntInf.BigWord, MLton.IntInf.SmallInt,
        MLton.Exn.defaultTopLevelHandler,
        MLton.Exn.getTopLevelHandler, MLton.Exn.setTopLevelHandler,
        MLton.LargeReal, MLton.LargeWord, MLton.Real, MLton.Real32,
        MLton.Real64, MLton.Rlimit.Rlim, MLton.TextIO.tempPrefix,
        MLton.Vector.create, MLton.Word.bswap, MLton.Word8.bswap,
        MLton.Word16, MLton.Word32, MLton.Word64, MLton.Word8Array,
        MLton.Word8Vector.
    * Changed: MLton.Array.unfoldi, MLton.IntInf.rep, MLton.Rlimit,
        MLton.Vector.unfoldi.
    * Deprecated: MLton.Socket
   o Other libraries.
    * Added: MLRISC libary.
    * Updated: ckit library, SML/NJ library.
  + Tools.

* 2007-08-12
   - Removed deprecated ML Basis annotations.

* 2007-08-06
   - Fixed bug in treatment of Real<N>.{scan,fromString} operations.
     Real<N>.{scan,fromString} were using TO_NEAREST semantics, but
     should obey current rounding mode.  (Only Real<N>.fromDecimal is
     specified to always have TO_NEAREST semantics.)  Thanks to Sean
     McLaughlin for the bug report.

* 2007-07-27
   - Fixed bugs in constant-folding of floating-point operations with C
     codegen.

* 2007-07-26
   - Fixed bug in treatment of floating-point operations.  Floating-point
     operations depend on the current rounding mode, but were being
     treated as pure.  Thanks to Sean McLaughlin for the bug report.

* 2007-07-13
   - Added MLton.Exn.{default,get,set}TopLevelHandler.

* 2007-07-12
   - Restored native option to -codegen flag.

* 2007-07-11
   - Fixed bug in Real32.toInt: conversion of real values close to
     Int.maxInt could be incorrect.

* 2007-07-07
   - Updates to bytecode code generator: support for amd64-* targets,
     support for profiling (including exception history).
   - Fixed bug in Socket module of Basis Library; unmarshalling of
     socket options (for get* functions) used andb rather than orb.
     Thanks to Anders Petersson for the bug report (and patch).

* 2007-07-06
   - Fixed bug in Date module of Basis Library; some functions would
     erroneously raise Date when given a year <= 1900.  Thanks to Joe
     Hurd for the bug report.
   - Fixed a long-standing bug in monomorphisation pass.  Thanks to
     Vesa Karvonen for the bug report.

* 2007-05-18
   - Native amd64 code generator for amd64-* targets.
   - Eliminate native option from -codegen flag.
   - Add x86 and amd64 options to -codegen flag.

* 2007-04-29
   - Improved type checking of RSSA and Machine ILs.

* 2007-04-14
   - Fixed aliasing issues with basis/Real/*.c files.
   - Added real/word casts in MLton structure.

* 2007-04-12
   - Added primitives for bit cast of word to/from real.
   - Implement PackReal<N>{Big,Little} using PackWord<N>{Big,Little}
     and bit casts.

* 2007-04-11
   - Move all system header #include-s to platform/ os headers.
   - Use C99 <assert.h>, rather than custom "assert.{h,c}".

* 2007-03-13
   - Implement PackWord<N>{Big,Little} entirely in ML, using an ML
     byte swap function.

* 2007-02-25
   - Change amd64-* target platforms from 32-bit compatability mode
     (i.e., -m32) to 64-bit mode (i.e., -m64).  Currently, only the C
     codegen is able to generate 64-bit executables.

* 2007-02-23
   - Removed expert command line switch -coalesce <n>.
   - Added expert command line switch -chunkify {coalesce<n>|func|one}.

* 2007-02-20
   - Fixed bug in PackReal<N>.toBytes.  Thanks to Eric McCorkle for the
     bug report (and patch).

* 2007-02-18
   - Added command line switch -profile-val, to profile the evaluation of
     val bindings; this is particularly useful with exception history for
     debugging uncaught exceptions at the top-level.

* 2006-12-29
   - Added command line switch -show {anns|path-map} and deprecated command
     line switch -show-anns {false|true}.  Use -show path-map to see the
     complete MLB path map as seen by the compiler.

* 2006-12-20
   - Changed the output of command line switch -stop f to include mlb-files.
     This is useful for generating Makefile dependencies.  The old output is
     easy to recover if necessary (e.g. grep -v '\.mlb$').

* 2006-12-8
   - Added command line switches -{,target}-{as,cc,link}-opt-quote, which
     pass their argument as a single argument to gcc (i.e., without
     tokenization at spaces).  These options support using headers and
     libraries (including the MLton runtime headers and libraries) from a
     path with spaces.

* 2006-12-02
   - Extensive reorganization of garbage collector, runtime system, and
     Basis Library implementation. (This is in preparation for future
     64bit support.)  They should be more C standards compliant and easier
     to port to new systems.
   - FFI revisions
     Disallow nested indirect types (e.g., int array array).

* 2006-11-30
   - Fixed a bug in elaboration of FFI forms; unary FFI types (e.g.,
     array, ref, vector) could be used in places where MLton.Pointer.t was
     required.  This would later cause the compiler to raise the TypeError
     exception, along with a lot of XML IL.

* 2006-11-19
   - On *-darwin, work with GnuMP installed via Fink or MacPorts.

* 2006-10-30
   - Ported to x86-darwin.

* 2006-09-23
   - Added missing specification of find to the MONO_VECTOR signature.

* 2006-08-03
   - Fixed a bug in the "useless" SSA optimization, caused by calling
     an imported C function and then ignoring the result.

* 2006-06-24
   - Fixed a bug in pass to flatten data structures.  Thanks to Joe Hurd
     for the bug report.

* 2006-06-08
  - Fixed a bug in the native codegen's implementation of the C-calling
    convention.

* 2006-05-11
  - Ported to PowerPC-AIX.
  - Fixed a bug in the runtime for the cases where nonblocking IO with
    sockets was implemented using MSG_DONTWAIT.  This flag does not
    exist on AIX, Cygwin, HPUX, and MinGW and was previously just
    ignored.  Now the runtime simulates the flag for these platforms
    (except MinGW, yet, where it's still ignored).

* 2006-05-06
  - Added -default-type '<ty><N>' for specifying the binding of default
    types in the Basis Library (e.g., Int.int).

* 2006-04-25
  - Ported to HPPA-HPUX.
  - Fixed PackReal{,32,64}{Big,Little} to follow the Basis Library
    specification.

* 2006-04-19
  - Fixed a bug in MLton.share that could cause a segfault.

* 2006-03-30
  - Changed MLton.Vector.unfoldi to return the state in addition to the
    result vector.

* 2006-03-30
  - Added MLton.Vector.create, a more powerful vector-creation function
    than is available in the basis library.

* 2006-03-04
  - Added MLRISC from SML/NJ 110.57 to standard distribution.

* 2006-03-03
  - Fixed bug in SSA simplifier that could eliminate an irredundant test.

* 2006-03-02
  - Ported a bugfix from SML/NJ for a bug with the combination of withNack
    and never in CML.

* 2006-02-09
  - Support compiler specific annotations in ML Basis files.  If an
    annotation contains ":", then the text preceding the ":" is meant to
    denote a compiler.  For MLton, if the text preceding the ":" is equal
    to "mlton", then the remaining annotation is scanned as a normal
    annotation.  If the text preceding the ":" is not-equal to "mlton",
    then the annotation is ignored, and no warning is issued.

* 2006-02-04
  - Fixed bug in elaboration of functors; a program with a very large
    number of functors could exhibit the error
    "ElaborateEnv.functorClosure: firstTycons".

--------------------------------------------------------------------------------

Here are the changes from version 20041109 to version 20051202.

Summary:
  + New license: BSD-style instead of GPL.
  + New platforms:
   o hppa: Debian Linux.
   o x86: MinGW.
  + Compiler.
   o improved exception history.
   o Command-line switches.
    * Added: -as-opt, -mlb-path-map, -target-as-opt, -target-cc-opt.
    * Deprecated: none.
    * Removed: -native, -sequence-unit, -warn-match, -warn-unused.
  + Language.
   o FFI syntax changes and extensions.
    * Added: _symbol.
    * Changed: _export, _import.
    * Removed: _ffi.
   o ML Basis annotations.
    * Added: allowFFI, nonexhaustiveExnMatch, nonexhaustiveMatch,
        redundantMatch, sequenceNonUnit.
    * Deprecated: allowExport, allowImport, sequenceUnit, warnMatch.
  + Libraries.
   o Basis Library.
    * Added: Int1, Word1.
   o MLton structure.
    * Added: Process.create, ProcEnv.setgroups, Rusage.measureGC,
        Socket.fdToSock Socket.Ctl.getError.
    * Changed: MLton.Platform.Arch.
   o Other libraries.
    * Added: ckit library, ML-NLFFI library, SML/NJ library.
  + Tools.
   o updates of mllex and mlyacc from SML/NJ.
   o added mlnlffigen.
   o profiling supports better inclusion/exclusion of code.

* 2005-11-19
  - Updated SML/NJ Library and CKit Library from SML/NJ 110.57.

* 2005-11-15
  - Fixed a bug in MLton.ProcEnv.setgroups.

* 2005-11-11
  - Fixed a bug in the interleaving of lexing/parsing and elaborating of
    ML Basis files, which would raise an unhandled Force exception on
    cyclic basis references.  Thanks to John Dias for the bug report.

* 2005-11-10
  - Fixed two bugs in Time.scan.  One would raise Time on a string with a
    large fractional component.  Thanks to Carsten Varming for the bug
    report.  The other failed to scan strings with an explicit sign
    followed by a decimal point.

* 2005-11-03
  - Removed MLton.GC.setRusage.
  - Added MLton.Rusage.measureGC.

* 2005-09-11
  - Fixed bug in display of types with large numbers of type
    variables, which could cause unhandled exception Chr.

* 2005-09-08
  - Fixed bug in type inference of flexible records that would show up
    as "Type error: variable applied to wrong number of type args".

* 2005-09-06
  - Fixed bug in Real.signBit, which had assumed that the underlying
    C signbit returned 0 or 1, when in fact any nonzero value is
    allowed to indicate the signbit is set.

* 2005-09-05
  - Added -mlb-path-map switch.

* 2005-08-25
  - Fixed bug in MLton.Finalizable.touch, which was not keeping alive
    finalizable values in all cases.

* 2005-08-18
  - Added SML/NJ Library and CKit Library from SML/NJ 110.55 to
    standard distribution.
  - Fixed bug in Socket.Ctl.*, which got the endianness wrong on
    big-endian machines.  Thanks to Wesley Terpstra for the bug report
    and fix.
  - Added MLton.GC.setRusage.
  - Fixed bug in mllex, which had file positions starting at 2.  They
    now start at zero.

* 2005-08-15
  - Fixed bug in LargeInt.scan, which should skip leading "0x" and
    "0X".  Thanks to Wesley Terpstra for the bug report and fix.

* 2005-08-06
  - Additional revisions of FFI.
    Deprecated _export with incomplete annotation.
    Added _address for address of C objects.
    Eliminated address component of _symbol.
    Changed the type of the _symbol* expression.
    See documentation for more detail.

* 2005-08-06
  - Annotation changes.
    Deprecated: sequenceUnit
    Added: sequenceNonUnit

* 2005-08-03
  - Annotation changes.
    Deprecated: allowExport, allowImport, warnMatch
    Added: allowFFI, nonexhaustiveExnMatch, nonexhaustiveMatch,
      redundantMatch

* 2005-08-01
  - Update mllex and mlyacc with SML/NJ 110.55+ versions.  This
    incorporates a small number of minor bug fixes.

* 2005-07-23
  - Fixed bug in pass to flatten refs into containing data structure.

* 2005-07-23
  - Overhaul of FFI.
    Deprecated _import of C base types.
    Added _symbol for address, getter, and setter of C base types.
    See documentation for more detail.

* 2005-07-21
  - Update mllex and mlyacc with SML/NJ 110.55 versions.  This
    incorporates a small number of minor bug fixes.

* 2005-07-20
  - Fixed bug in front end that allowed unary constructors to be used
    without an argument in patterns.

* 2005-07-19
  - Eliminated _ffi, which has been deprecated for some time.

* 2005-07-14
  - Fixed bug in runtime that caused getrusage to be called on every
    GC, even if timing info isn't needed.

* 2005-07-13
  - Fixed bug in closure conversion tickled by making a weak pointer
    to a closure.

* 2005-07-12
  - Changed {OS,Posix}.Process.sleep to call nanosleep() instead of
    sleep().
  - Added MLton.ProcEnv.setgroups.

* 2005-07-11
  - InetSock.{any,toAddr} raise SysErr if port is not in [0, 2^16).

* 2005-07-02
  - Fixed bug in Socket.recvVecFrom{,',NB,NB'}.  The type was too
    polymorphic and allowed the creation of a bogus sock_addr.

* 2005-06-28
  - The front end now reports errors on encountering undefined or
    cyclicly defined MLB path variables.

* 2005-05-22
  - Fixed bug in Posix.IO.{getlk,setlk,setlkw} that caused a link-time
    error: undefined reference to Posix_IO_FLock_typ.
  - Improved exception history so that the first entry in the history
    is the source position of the raise, and the rest is the call
    stack.

* 2005-05-19
  - Improved exception history for Overflow exceptions.

* 2005-04-20
  - Fixed a bug in pass to flatten refs into containing data structure.

* 2005-04-14
  - Fixed a front-end bug that could cause an internal bug message of the
    form "missing flexInst".

* 2005-04-13
  - Fixed a bug in the representation of flat arrays/vectors that
    caused incorrect behavior when the element size was 2 or 4 bytes
    and there were multiple components to the element (e.g. (char *
    char) vector).

* 2005-04-01
  - Fixed a bug in GC_arrayAllocate that could cause a segfault.

* 2005-03-22
  - Added structures Int1, Word1.

* 2005-03-19
  - Fixed a bug that caused Socket.Ctl.{get,set}LINGER to raise
    Subscript.  The problem was in the use of PackWord32Little.update,
    which scales the supplied index by bytesPerElem.

* 2005-03-13
  - Fixed a bug in CML mailboxes.

* 2005-02-26
  - Fixed an off-by-one error in mkstemp defined in mingw.c.

* 2005-02-13
  - Added mlnlffigen tool (heavily adapted from SML/NJ).

* 2005-02-12
  - Added MLNLFFI Library (heavily adapted from SML/NJ) to standard
    distribution.

* 2005-02-04
  - Fixed a bug in OS.path.toString, which did not raise InvalidArc
    when needed.

* 2005-02-03
  - Fixed a bug in OS.Path.joinDirFile, which did not raise InvalidArc
    when passed a file that was not an arc.

* 2005-01-26
  - Fixed a front end bug that incorrectly rejected expansive valbinds
    with useless bound type variables.

* 2005-01-22
  - Fixed x86 codegen bug which failed to account for the possibility that
    a 64-bit move could interfere with itself (as simulated by 32-bit
    moves).

* 2004-12-22
  - Fixed Real32.fmt StringCvt.EXACT, which had been producing too
    many digits of precision because it was converting to a
    Real64.real.

* 2004-12-15
  - Replaced MLB path variable MLTON_ROOT with SML_LIB, to use a more
    compiler-independent name.  We will keep MLTON_ROOT aliased to
    SML_LIB until after the next release.

* 2004-12-02
  - Unix.create now works on all platforms (including Cygwin and MinGW).

* 2004-11-24
  - Added support for MLton.Process.create, which works on all
    platforms (including Windows-based ones like Cygwin and MinGW) and
    allows better control over std{in,out,err} for child process.

--------------------------------------------------------------------------------

Here are the changes from version 20040227 to 20041109.

Summary:
  + New platforms:
   o x86: FreeBSD 5.x, OpenBSD
   o PowerPC: Darwin (MacOSX)
  + Support for MLBasis files.
  + Support for dynamic libraries.
  + Support for Concurrent ML (CML).
  + New structures: Int2, Int3, ..., Int31 and Word2, Word3, ..., Word31.
  + A new form of profiling, -profile count.
  + A bytecode generator.
  + Data representation improvements.
  + MLton structure changes.
    o Added: share, shareAll
    o Changed: Exn, IntInf, Signal, Thread.
  + Command-line switch changes.
    o Deprecated:
        -native (use -codegen)
        -sequence-unit (use -default-ann)
        -warn-match (use -default-ann)
        -warn-unused (use -default-ann)
    o Removed:
        -detect-overflow
        -exn-history (use -const)
        -safe
        -show-basis-used
    o Added:
        -codegen
        -const
        -default-ann
        -disable-ann
        -profile-branch
        -target-link-opt

* 2004-09-22
  - Extended _import to support indirect function calls.

* 2004-09-13
  - Made Date.{fromString,scan} accept a space (treated as zero) in
    the first character of the day of the month.

* 2004-09-12
  - Fixed bug in IntInf that could cause a seg fault.
  - Remove MLton.IntInf.size.

* 2004-09-05
  - Made -detect-overflow and -safe expert options.

* 2004-08-30
  - Added val MLton.share: 'a -> unit, which maximizes sharing in a
    heap object.

* 2004-08-27
  - Fixed bug in Real.toLargeInt.  It would incorrectly raise Option
    instead of Overflow in the case when the real was not an INF, but
    rounding produced an INF.
  - Fixed bugs in Date.{fmt,fromString,scan,toString}.  They
    incorrectly allowed a space for the first character in the day of
    the month.

* 2004-08-18
  - Changed MLton.{Thread,Signal,World} to distinguish between
    implicitly and explicitly paused threads.

* 2004-07-28
  - Added support for programming in the large using the ML Basis
    system.

* 2004-07-11
  - Fixed bugs in ListPair.*Eq functions, which incorrectly raised
    the UnequalLengths exception.

* 2004-07-01
  - Added val MLton.Exn.addExnMessager: (exn -> string option) -> unit

* 2004-06-23
  - Runtime system options that take memory sizes now accept a "g"
    suffix indicating gigabytes.  They also now take a real instead of
    an integer, e.g. fixed-heap 0.5g.  They also now accept uppercase,
    e.g. 150M.

* 2004-06-12
  - Added support for OpenBSD.

* 2004-06-10
  - Added support for FreeBSD 5.x.

* 2004-05-28
  - Deprecated the -native flag.  Instead, use the new flag
    -codegen {native|bytecode|C}.  This is in anticipation of adding a
    bytecode compiler.

* 2004-05-26
  - Fixed a front-end bug that could cause cascading error to print a
    very large and unreadable internal bug message of the form
    "datatype ... realized with scheme Unknown".

* 2004-05-17
  - Automatically restart functions in the Basis Library that correspond
    directly to interruptable system calls.

* 2004-05-13
  - Added -profile count, for dynamic counts of function calls and branches.
  - Equate the types Posix.Signal.signal and Unix.signal.

* 2004-05-11
  - Fixed a bug with -basis 1997 that would cause type errors due to
    differences between types in the MLton structure and types in the
    rest of the basis library.

* 2004-05-01
  - Fixed a bug with sharing constraints in signatures that would
    sometimes mistakenly treat two structures as identical when they
    shouldn't have been.  This would cause some programs to be
    mistakenly rejected.

* 2004-04-30
  - Added MLton.Signal.{handled,restart}.

* 2004-04-23
  - Added Timer.checkCPUTimes, and updated the Timer structure to
    match the latest basis spec.  Also fixed totalCPUTimer and
    totalRealTimer, which were wrong.

* 2004-04-13
  - Added MLton.Signal.Mask.{getBlocked,isMember}.

* 2004-04-12
  - Fix bug that mistakenly generalized variable types containing
    unknown types when matching against a signature.
  - Reasonable front-end error message when unification causes
    recursive (circular) type.

* 2004-04-03
  - Fixed bug in sharing constraints so that A = B = C means that all
    pairs AB, AC, BC are shared, not just AB and BC.  This matters in
    some situations.

* 2004-03-20
  - Fixed Time.now which was treating microseconds as nanoseconds.

* 2004-03-14
  - Fixed SSA optimizer bug that could cause the error "<type> has no
    tyconInfo property".

* 2004-03-11
  - Fixed Time.fromReal to raise Time, not Overflow, on
    unrepresentable times.

* 2004-03-04
  - Added structures Word2, Word3, ..., Word31.

* 2004-03-03
  - Added structures Int2, Int3, ..., Int31.
  - Fixed bug in elaboration of "and" with signatures, structures, and
    functors so that it now evaluates all right-hand sides before
    binding any left-hand sides.

--------------------------------------------------------------------------------
Here are the changes from version 20030716 to 20040227.

Summary:
  + The front end now follows the Definition of SML and produces
    readable error messages.
  + Added support for NetBSD.
  + Basis library changes tracking revisions to the specification.
  + Added structures: Int64, Real32, Word64.
  + File positions use Int64.
  + Major improvements to -show-basis, which now displays the basis in
    a very readable way with full type information.
  + Command-line switch changes.
    o Deprecated: -basis.
    o Removed: -lib-search, -link, -may-load-world, -static.
    o Added: -link-opt, -runtime, -sequence-unit, -show-def-use,
             -stop tc, -warn-match, -warn-unused.
    o Changed: -export-header, -show-basis, -show-basis-used.
    o Renamed: -host to -target.
  + FFI changes.
    o Renamed _ffi as _import.
    o Added cdecl and stdcall attributes to _import and _export
      expressions.
  + MLton structure changes.
    o Added: Pointer.
    o Removed: Ptrace.
    o Changed: Finalizable, IntInf, Platform, Random, Signal, Word.

* 2004-02-16
  - Changed -export-header, -show-basis, -show-basis-used to take a
    file name argument, and they no longer force compilation to halt.
  - Added -show-def-use and -warn-unused, which deal with def-use
    information.

* 2004-02-13
  - Added flag -sequence-unit, which imposes the constraint that in
    the sequence expression (e1; e2), e1 must be of type unit.

* 2004-02-10
  - Lots of changes to MLton.Signal: name changes, removal of
    superfluous functions, additional functions.

* 2004-02-09
  - Extended -show-basis so that when used with an input program, it
    shows the basis defined by the input program.
  - Added "stop" runtime argument.
  - Made -call-graph {false|true} an option to mlprof that determines
    whether or not a call graph file is written.

* 2004-01-20
  - Fixed a bug in IEEEReal.{fromString,scan}, which would improperly
    return INF instead of ZERO for things like "0.0000e123456789012345".
  - Fixed a bug in Real.{fromDecimal,fromString,scan}, which didn't
    return an appropriately signed zero for ~0.0.
  - Fixed a bug in Real.{toDecimal,fmt}, which didn't correctly handle
    ~0.0.
  - Report a compile-time error on unrepresentable real constants.

* 2004-01-05
  - Removed option -may-load-world.  You can now use -runtime
    no-load-world instead.
  - Removed option -static.  You can now use -link-opt -static
    instead.
  - Changed MLton.IntInf.size to return 0 instead of 1 on small ints.

* 2003-12-28
  - Fixed horrible bug in MLton.Random.alphaNumString that caused it
    to return 0 for all characters beyond position 11.

* 2003-12-17
  - Removed -basis as a normal flag.  It is still available as an
    expert flag, but its use is deprecated.  It will almost certainly
    disappear after the next release.

* 2003-12-10
  - Allow multiple @MLton -- runtime args in sequnce.  This makes it
    easier for scripts to prefix @MLton args without having to splice
    them with other ones.

* 2003-12-04
  - Added support for files larger than 2G.  This included changing
    Position from Int32 to Int64.

* 2003-12-01
  - Added structure MLton.Pointer, which includes a type t for
    pointers (memory addresses, not SML heap pointers) and operations
    for loading from and storing to memory.

* 2003-11-03
  - Fixed Timer.checkGCTime so that only the GC user time is included,
    not GC system time.

* 2003-10-13
  - Added -warn-match to control display nonexhaustive and redundant
    match warnings.
  - Fixed space leak in StreamIO causing the entire stream to be
    retained.   Thanks to Jared Showalter for the bug report and fix.

* 2003-10-10
  - Added "-stop tc" switch to stop after type checking.

* 2003-09-25
  - Fixed Posix.IO.getfl, which had mistakenly called fcntl with
    F_GETFD instead of F_GETFL.
  - Tracking basis library changes:
    o Socket module datagram functions no longer return amount
      written, since they always write the entire amount or fail.  So,
      send{Arr,Vec}To{,'} now return unit instead of int.
    o Added nonblocking versions of all the send and recv functions,
      as well as accept and connect.  So, we now have:
      acceptNB, connectNB, recv{Arr,Vec}{,From}NB{,'},
      send{Arr,Vec}{,To}NB{,'}

* 2003-09-24
  - Tracking basis library changes:
    o TextIO.inputLine now returns a string option.
    o Slices used in Byte, PRIM_IO, PrimIO, Posix.IO, StreamIO
    o Posix.IO.readVec raises Size, not Subscript, with negative
      argument.

* 2003-09-22
  - Fixed Real.toManExp so that the mantissa is in [0.5, 1),
    not [1, 2).  The spec says that 1.0 <= man * radix < radix, which
    since radix is 2, implies that the mantissa is in [0.5, 1).
  - Added Time.{from,to}Nanoseconds.

* 2003-09-11
  - Added Real.realRound.
  - Added Char{Array,Vector}Slice to Text.

* 2003-09-11
  - OS.IO.poll and Socket.select now raise errors on negative
    timeouts.
  - Time.time is now implemented using IntInf instead of Int, which
    means that a much larger range of time values is representable.

* 2003-09-10
  - Word64 is now there.

* 2003-09-09
  - Replaced Pack32{Big,Little} with PackWord32{Big,Little}.
  - Fixed bug in OS.FileSys.fullPath, which mistakenly stopped as soon
    as it hit a symbolic link.

* 2003-09-08
  - Fixed @MLton max-heap, which was mistakenly ignored.  Cleaned up
    @MLton fixed-heap.  Both fixed-heap and max-heap can use copying
    or mark-compact collection.

* 2003-09-06
  - Int64 is completely there.
  - Fixed OS.FileSys.tmpName so that it creates the file, and doesn't
    use tmpnam.  This eliminates an annoying linker warning message.

* 2003-09-05
  - Added structures {LargeInt,LargeReal,LargeWord,Word}
                     {Array,Array2,ArraySlice,Vector,VectorSlice}
  - Fixed bug in Real.toDecimal, which return class NORMAL for
    subnormals.
  - Fixed bug in Real.toLargeInt, which didn't return as precise an
    integer as possible.

* 2003-09-03
  - Lots of fixes to Real functions.
    o Real32 is now completely in place, except for Real32.nextAfter
      on SunOS.
    o Fixed Real.Math.exp on x86 to return the right value when
      applied to posInf and negInf.
    o Changed Real.Math.{cos,sin,tan} on x86 to always use a call to
      the C math library instead of using the x86 instruction.  This
      eliminates some anomalies between compiling -native false and
      -native true.
    o Change Real.Math.pow to handle exceptional cases in the SML
      code.
    o Fixed Real.signBit on Sparcs.

* 2003-08-28
  - Fixed PackReal{,64}Little to work correctly on Sparc.
  - Added PackReal{,64}Big, PackReal32{Big,Little}.
  - Added -runtime switch, which passes arguments to the runtime via
    @MLton.  These arguments are processed before command line
    switches.
  - Eliminated MLton switch -may-load-world.  Can use -runtime
    combined with new runtime switch -no-load-world to disable load
    world in an executable.

* 2003-08-26
  - Changed -host to -target.
  - Split MLton.Platform.{arch,os} into MLton.Platform.{Arch,OS}.t.

* 2003-08-21
  - Fixed bug in C codegen that would cause undefined references to
    Real_{fetch,move,store} when compiling on Sparcs with -align 4.

* 2003-08-17
  - Eliminated -link and -lib-search, which are no longer needed.
    Eliminated support for passing -l*, -L*, and *.a on the command
    line.  Use -link-opt instead.

* 2003-08-16
  - Added -link-opt, for passing options to gcc when linking.

* 2003-07-19
  - Renamed _ffi as _import.  The old _ffi will remain for a while,
    but is deprecated and should be replaced with _import.
  - Added attributes to _export and _import.  For now, the only
    attributes are "cdecl" and "stdcall".

--------------------------------------------------------------------------------
Here are the changes from version 20030711 to 20030716.

Summary:
  + Fixed several serious bugs with the 20030711 release.

* 2003-07-15
  - Fixed bug that caused a segfault when attempting to create an
    array that was too large, e.g
       1 + Array.sub (Array.tabulate (valOf Int.maxInt, fn i => i), 0)
  - mlton now checks the command line arguments following the file to
    compile that are passed to the linker to make sure they are
    reasonable.

* 2003-07-14
  - Fixed packaging for Cygwin and Sparc to include libgmp.a.
  - Eliminated bootstrap target.  The Makefile automatically
    determines whether to bootstrap or not.
  - Fixed XML type checker bug that could cause error: empty tyvars in
    PolyVal dec.

* 2003-07-12
  - Turned off FORCE_GENERATIONAL in gc.  It had been set, which
    caused the gc to always use generational collection.  This could
    seriously slow apps down that don't need it.

--------------------------------------------------------------------------------
Here are the changes from version 20030312 to 20030711.

Summary:
  + Added support for Sparc/SunOS using the C code generator.
  + Completed the basis library implementation.  At this point, the
    only missing basis library function is "use".
  + Added _export, which allows one to call SML functions from C.
  + Added weak pointers (via MLton.Weak) and finalization (via
    MLton.Finalizable).
  + Added new integer modules: Int8, Int16.
  + Better profiling call graphs
  + Fixed conversions between reals and their decimal representations
    to be correct using the gdtoa library.

* 2003-07-07
  - Profiling improvements
    o Eliminated mlton -profile-split.  Added mlprof -split.  Now the
      profiling infrastructure keeps track of the splits and allows
      one to decide which splits to make (if any) when mlprof is run,
      which is much better than having to decide at compile time.
    o Changed mlprof -graph to mlprof -keep, and changed the behavior
      so that -keep also controls which functions are displayed in the
      table.
    o Eliminated mlprof -ignore: it's behavior is now subsumed by
      -keep, whose meaning has changed to be more like -ignore on
      nodes that are not kept.
  - When calling gcc for linking, put -link args in same order as they
    appeared on the MLton command line (they used to be reversed).

* 2003-07-03
  - Making OS.Process.{atExit,exit} conform to the basis library spec
    in that exceptions raised during cleaners are caught and ignored.
    Also, calls to exit from cleaners cause the rest of cleaners to
    run.

* 2003-07-02
  - Fixed bug with negative IntInf constants that could cause compile
    time error message:
    "x86Translate.translateChunk ... strange Offset: base: ..."
  - Changed argument type of MLton.IntInf.Small from word to int.
  - Added fix to profiling so that the mlmon.out file is written even
    when the program terminates due to running out of memory.

* 2003-06-25
  - Added {Int{8,16},Word8}{,Array,ArraySlice,Vector,VectorSlice,Array2}
    structures.

* 2003-06-25
  - Fixed bug in IntInf.sign, which returned the wrong value for zero.

* 2003-06-24
  - Added _export, for calling from C to SML.

* 2003-06-18
  - Regularization of options.
        -diag --> -diag-pass
        -drop-pass takes a regexp

* 2003-06-06
  - Fixed bug in OS.IO.poll that caused it to return the input event
    types polled for instead of what was actually available.

* 2003-06-04
  - Fixed bug in known case SSA optimization that could case incorrect
    results in compiled programs.

* 2003-06-03
  - Fixed bug in SSA optimizer that could cause the error message
        Type error: Type.equals
        {from = char vector, to = unit vector}
        Type error: analyze raised exception loopStatement: ...
        unhandled exception: TypeError

* 2003-06-02
  - Fixed Real.rem to work correctly on infs and nans.
  - Fixed bug in profiling that caused the function name to be omitted
    on functions defined by val rec.

* 2003-05-31
  - Fixed Real.{fmt,fromString,scan,toString} to match the basis
    library spec.
  - Added IEEEReal.{fromString,scan}.
  - Added Real.{from,to}Decimal.

* 2003-05-25
  - Added Real.nextAfter.
  - Added OS.Path.{from,to}UnixPath, which are the identity function
    on Unix.

* 2003-05-20
  - Added type MLton.pointer, the type of C pointers, for use with the
    FFI.

* 2003-05-18
  - Fixed two bugs in type inference that could cause the compiler to
    raise the TypeError exception, along with a lot of XML IL.
    The type-check.sml regression contains simple examples of what
    failed.
  - Fixed a bug in the simplifier that could cause the message:
    shrinker raised Prim.apply raised assertion failure: SmallIntInf.fromWord

* 2003-05-15
  - Fixed bug in Real.class introduced on 04-28 that cause many
    regression failures with reals when using newer gccs.
  - Replaced MLton.Finalize with MLton.Finalizable, which has a more
    robust approach to finalization.

* 2003-05-13
  - Fixed bug in MLton.FFI on Cygwin that caused Thread_returnToC to
    be undefined.

* 2003-05-12
  - Added support for finalization with MLton.Finalize.

* 2003-05-09
  - Fixed a runtime system bug that could cause a segfault.  This bug
    would happen after a GC during heap resizing when copying a heap,
    if the heap was allocated at a very low (<10M) address.  The bug
    actually showed up on a Cygwin system.

* 2003-05-08
  - Fixed bug in HashType that raised "Vector.forall2" when the
    arity of a type constructor is changed by simplifyTypes, but
    a newly constructed type has the same hash value.

* 2003-05-02
  - Switched over to new layered IO implementation, which completes
    the implementation of the BinIO and TextIO modules.

* 2003-04-28
  - Fixed bug that caused an assertion failure when generating a jump
    table for a case dispatch on a non-word sized index with non-zero
    lower bound on the range.

* 2003-04-24
  - Added -align {4|8}, which controls alignment of objects.  With
    -align 8, memory accesses to doubles are guaranteed to be aligned
    mod 8, and so don't need special routines to load or store.

* 2003-04-22
  - Fixed bug that caused a total failure of time profiling with
    -native false.  The bug was introduced with the C codegen
    improvements that split the C into multiple files.  Now, the C
    codegen declares all profile labels used in each file so that they
    are global symbols.

* 2003-04-18
  - Added MLton.Weak, which supports weak pointers.

* 2003-04-10
  - Replaced the basis library's MLton.hostType with
    MLton.Platform.arch and MLton.Platform.os.

* 2003-04
  - Added support for SPARC/SunOS using the C codegen.

* 2003-03-25
  - Added MLton.FFI, which allows callbacks to SML from C.

* 2003-03-21
  - Fixed mlprof so that the default -graph arg for data from
    -profile-stack true is '(thresh-stack x)', not '(thresh x)'.

--------------------------------------------------------------------------------
Here are the changes from version 20020923 to 20030312.

Summary:
  + Added source-level profiling of both time and allocation.
  + Updated basis library to 2002 specification.  To obtain the old
    library, compile with -basis 1997.
  + Added many modules to basis library:
    BinPrimIO, GenericSock, ImperativeIO, INetSock, NetHostDB,
    NetProtDB, NetServDB, Socket, StreamIO, TextPrimIO, UnixSock.
  + Completed implementation of IntInf and OS.IO.

* 2003-02-23
  - Replaced -profile-combine wih -profile-split.

* 2003-02-11
  - Regularization of options.
        -l --> -link
        -L --> -lib-search
        -o --> -output
        -v --> -verbose

* 2003-02-10
  - Added option to mlton: -profile-combine {false|true}

* 2003-02-09
  - Added options to mlprof: -graph-title, -gray, -ignore, -mlmon,
        -tolerant.

* 2002-11 - 2003-01
  - Added source-level allocation and time profiling.  This includes
        the new options to mlton: -profile and -profile-stack.

* 2002-12-28
  - Added NetHostDB,NetProtDB,NetServDB structures.
  - Added Socket,GenericSock,INetSock,UnixSock structures.

* 2002-12-19
  - Fixed bug in signal check insertion that could cause some signals
    to be missed.  The fix was to add a signal check on entry to each
    function in addition to at each loop header.

* 2002-12-10
  - Fixed bug in runtime that might cause the message
        Unable to set cardMapForMutator.

* 2002-11-23
  - Added support for the latest Basis Library specification.
  - Added option -basis to choose Basis Library version.  Currently available
    basis libraries are 2002, 2002-strict, 1997, and none.
  - Added IntInf.{orb,xorb,andb,notb,<<,~>>} values.
  - Added OS.IO.{poll_desc,poll_info} types.
  - Added OS.IO.{pollDesc,pollToIODesc,infoToPollDesc,Poll} values.
  - Added OS.IO.{pollIn,pollOut,pollPri,poll,isIn,isOut,isPri} values.
  - Added BinPrimIO,TextPrimIO structures.
  - Added StreamIO,ImperativeIO functors.

* 2002-11-22
  - Fixed bug that caused time profiling to fail (with a segfault) when resuming
    a saved world.

* 2002-11-07
  - Fixed bug in MLton.eq that could arise when using eq on functions.

* 2002-11-05
  - Improvements to polymorphic equality.  Equality on IntInfs, vectors,
    and dataypes all do an eq test first before a more expensive comparison.

* 2002-11-01
  - Added allocation profiling.  Now, can compile with either -profile alloc
    or -profile time.  Renamed MLton.Profile as MLton.ProfileTime.  Added
    MLton.ProfileAlloc.  Cleaned up and changed most mlprof option names.

* 2002-10-31
  - Eliminated MLton.debug.
  - Fixed bug in the optimizer that affected IntInf.fmt.  The optimizer
    had been always using base 10, instead of the passed in radix.

* 2002-10-22
  - Fixed Real.toManExp so that the mantissa is in [1, 2), not [0.5, 1).
  - Added Real.fromLargeInt, Real.toLargeInt.
  - Fixed Real.split, which would return an incorrect whole part due to
    the underlying primitive, Real_modf, being treated as functional instead
    of side-effecting.

* 2002-09-30
  - Fixed rpath problem with packaging.  All executables in packages previously
    made had included a setting for RPATH.

--------------------------------------------------------------------------------

Here are the changes from version 20020410 to 20020923.

Summary:
  + MLton now runs on FreeBSD.
  + Major runtime system improvements.  The runtime now implements
    mark-compact and generational collection, in addition to the copying
    collection that was there before.  It automatically switches between
    the the collection strategies to improve performance and to try to avoid
    paging.
  + Performance when compiling "-exn-history true" has been improved.
  + Added IntInf.log2, MLton.GC.pack, MLton.GC.unpack.
  + Fixed bug in load world that could cause "sread failed" on Cygwin.
  + Fixed optimizer bug that could cause "no analyze var value property"
    message.

* 2002-09
  - Integrated Sam Rushing's changes to port MLton to FreeBSD.

* 2002-08-25
  - Changed the implementation of exception history to be completely functional.
    Now, the extra field in exceptions (when compiling -exn-history true) is a
    string list instead of a string list ref, and raise conses a new exception
    with a new element in the list instead of assigning to the list.  This
    changes the semantics of exception history (for the better) on some
    programs. See regression/exnHistory3.sml for an example.  It also
    significantly improves performance when compiling -exn-history true.

* 2002-07 and 2002-08
  - Added generational GC, and code to the runtime that automatically turns it
    on and off.

* 2002-08-20
  - Fixed SSA optimizer bug that could cause the following error message
        x_0 has no analyze var value property

* 2002-07-28
  - Added MLton.GC.{pack,unpack}.  pack shrinks the heap so that other processes
    can use the RAM, and its dual, unpack, resizes the heap to the desired size.

* 2002-06 and 2002-07
  - Added mark compact GC.
  - Changed array layout so that arrays have three, not two header words.
      The new word is a counter word that preceeds the array length and header.
  - Changed all header words to be indices into an array of object descriptors.

* 2002-06-27
  - Added patches from Michael Neumann to port runtime to FreeBSD 4.5.

* 2002-06-05
  - Output file and intermediate file are now saved in the current directory
    instead of in the directory containing the input file.

* 2002-05-31
  - Fixed bug in overloading of / so that the following now type checks:
        fun f (x, y) = x + y / y

* 2002-04-26
  - Added back max-heap runtime option.

* 2002-04-25
  - Fixed load/save world so that they use binary mode.  This should fix the
    "sread failed" problem that Byron Hale saw on Cygwin that caused mlton to
    fail to start.
  - Added IntInf.log2.
  - Changed call to linker to use libgmp.a (if it exists) instead of libgmp.so.
    This is because the linker adds a dependency to a shared library even if
    there are no references to it

* 2002-04-23
  - Rewrote heap resizing code.  This fixed bug that was triggered with large
    heaps and could cause a spurious out of memory error.
  - Removed gmp from MLton sources (again :-).

--------------------------------------------------------------------------------

Here are the changes from version 20011006 to version 20020410.

* 2002-03-28
  - Added BinIO.

* 2002-03-27
  - Regularization of options
        -g      -->     -degug {false|true}
        -h n    -->     -fixed-heap n
        -p      -->     -profile {false|true}

* 2002-03-22
  - Set up the stubs so that MLton can be compiled in the standard basis
    library, with no MLton structure.  Thus it is now easy to compile MLton
    with an older (or newer) version of itself that has a different MLton
    structure.

* 2002-03-17
  - Added MLton.Process.{spawn,spawne,spawnp}, which use primitives when
    running on Cygwin and fork/exec when running on Linux.

* 2002-02 - 2002-03
  - Added the ability to cross-compile to Cygwin/Windows.

* 2002-02-24
  - Added gmp back for use with Cygwin.

* 2002-02-10
  - Reworked object header words so that Array.maxLen = valOf Int.maxInt.
    Also fixed a long-standing minor bug in MLton, where
    Array.array (Array.maxLen, ...) would raise Size instead of attempting
    to allocate the array.  It was an off-by-one error in the meaning of
    Array.maxLen.

* 2002-02-08
  - Modifications to runtime to behave better in situations where the amount of
    live data is a signifant fraction of the amount of RAM, based on code from
    PolySpace.  MLton executables by default can now use more than the
    available amount of RAM.  Executables will still respect the max-heap
    runtime arg if it is set.

* 2002-02-04
  - Improvements to runtime so that it fails to get space, it attempts to get
    less space instead of failing.  Based on PolySpace's modifications.
  - Added MLton.eq.

* 2002-02-03
  - Added MLton.IntInf.gcd.
  - Removed gmp from MLton sources.  We now link with /usr/lib/gmp.a.
  - Added TextIO.getPosOut.
  - Renamed type MLton.Itimer.which to MLton.Itimer.t and
    MLton.Itimer.whichSignal to MLton.Itimer.signal.
  - Added -coalesce flag, for use with the C backend.

* 2002-01-26
  - Added -show-basis-used, which prints out the parts of the basis library
    that the input program uses.
  - Changed several other flags (-print-at-fun-entry, -show-basis, -static)
    to follow the {false|true} convention.

* 2002-01-22
  - Improved MLton.profile so that multiple profile arrays can exist
    simultaneously and so that the current one being used can be set from
    the SML side.

* 2002-01-18
  - The MACHINE IL has been replaced with an RSSA (representation explicit SSA)
    IL and an improved MACHINE IL.

* 2002-01-16
  - Added known case SSA optimization

* 2002-01-14
  - Added rudimentary profiling control from with a MLton compile program via the
    MLton.Profile structure.

* 2002-01-09
  - Fixed bug in match compiler that caused case expressions on datatypes
    with redundant cases to be compiled incorrectly.

* 2002-01-08
  - Added redundant tuple construction elimination to SSA shrinker.
  - Improved flatten SSA optimization.

* 2001-12-06
  - Changed the interface for MLton.Signal.  There is no longer a separate
    Handler substructure.  This was done so that programs that just use
    default and ignore signal handlers don't bring in the entire thread
    mechanism.

* 2001-12-05
  - Added local ref elimination SSA optimization.

* 2001-11-19
  - The CPS IL has been replaced with an SSA (static-single assignment) IL.
    All of the optimizations have been ported from CPS to SSA.

* 2001-10-24
  - Fixed bug in Thread_atomicEnd -- limit was mistakenly set to base instead of
    to 0.  This caused assertion failures when for executables compiled -g
    because GC_enter didn't reset the limit.
  - Fixed bug in register allocation of byte registers.

* 2001-10-23
  - Added -D option to cmcat for preprocessor defines.  Thanks to Anoq for
    sending the code.
  - Changed limit check insertion so that limit checks are only coalesced within
    a single basic block -- not across blocks.  This slows many benchmarks down,
    but is needed to fix a bug in the way that limit checks were coalesced across
    blocks.  Hopefully we will figure out a better fix soon.

* 2001-10-18
  - Fixed type inference of flexrecord so that it now follows the Definition.
    Many programs containing flexrecords were incorrectly rejected.  Added many
    new tests to regression/flexrecord.sml.
  - Changed the behavior of -keep dot combined with -keep pass for SSA passes.
    Dot files are now saved for the program before and after, instead of just
    after.

* 2001-10-11
  - Fixed a bug in the type inference that caused type variables to be
    mistakenly generalized.  The bug was exposed in Norman Ramsey's sled.sml.
    Added a test to regression/flexrecord.sml to catch the problem.

--------------------------------------------------------------------------------

Here are the changes from version 20010806 to version 20011006.

Summary:
   + Added MLton.Exn.history, which is similar to SMLofNJ.exnHistory.
   + Support for #line directives of the form (*#line line.col "file"*).
   + Performance improvements in native codegenerator.
   + Bug fixes in front-end, optimizer, register allocator,
     Real.{maxFinite, minPos, toManExp}, and in heap save and restore.

* 2001-10-5
  - Fixed a bug in polymorphic layered patterns, like
        val 'a a as b = []
    These would always fail due to the variable "a" not being handled correctly.
  - Fixed the syntax of "val rec" so that a pattern is allowed on the left-hand
    side of the =.  Thus, we used to reject, but now accept, the following.
        val rec a as b as c = fn _ => ()
        val rec a : unit -> unit : unit -> unit = fn () => ()
    Thanks again to Andreas Rossberg's test files.  This is now tested for in
    valrec.sml.
  - Fixed dynamic semantics of "val rec" so that if "val rec" is used to
    override constructor status, then at run time, the Bind exception is raised
    as per rule 126 of the Definition.  So, for example, the following program
    type checks and compiles, but raises Bind at run time.
        val rec NONE = fn () => ()
        val _ = NONE ()
    Again, this is checked in valrec.sml.
  - Added '\r\n' to ml.lex so that Windows style newlines are acceptable in
    input files.

* 2001-10-4
  - Fixed bug in the implementation of "open" declarations, which in the case of
    "open A B" had opened A and then looked up B in the resulting environment.
    The correct behaviour (see rule 22 of the Definition) is to lookup each
    longstrid in the current environment, and then open them all in sequence.
    This is now checked for in the open.sml regression test.  Thanks to Andreas
    Rossberg for pointing this bug out.
  - Fixed bug that caused tyvars of length 1 (i.e. ') to be rejected.  This is
    now checked in the id.sml regression test.  Again, thanks to Andreas
    Rossberg for the test.

* 2001-10-2
  - Fixed bugs in Real.toManExp (which always returned the wrong result because
    the call to frexp was not treated as side-effecting by the optimizer) and
    in Real.minPos, which was zero because of a mistake with extra precision
    bits.

* 2001-10-1
  - Added MLton.Exn.history.
  - Fixed register allocation bug with fucom instruction.  Was
    allowing fucomp when the first source was not removable.
  - Changed Real.isFinite to use the C math.h finite function.  This fixed the
    nontermination bug which occurred in any program that used Real.maxFinite.

* 2001-9-22
  - Bug fixes found from Ramsey's lrtl in contify.fun and unused-args.fun, both
    of which caused compile-time exceptions to be raised.

* 2001-9-21
  - Fixed MLton.World.{load,save} so that the saved world does not store the
    max heap size.  Instead, the max heap size is computed upon load world in
    exactly the same way as at program startup.  This fixes a long-standing (but
    only recently noticed) problem in which mlton (which uses a saved world)
    would attempt to use as much memory as was on the machine used to build
    world.mlton.

* 2001-8-29
  - Overlow checking is now on by default in the C backend.  This is a huge
    performance hit, but who cares, since we never use the C backend except for
    testing anyways.

* 2001-8-22
  - Added support for #line directives of the form
        (*#line line.col "file"*)
    These directives only affect error messages produced by the parser and
    elaborator.

* 2001-8-17
  - Fixed bug in removeUnused optimzation that caused the following program to
    fail to compile.
        fun f l = case l of [] => f l | _ :: l => f l
        val _ = f [13]

* 2001-8-14
  - New x86-codegen infrastructure.
    o support for tracking liveness of stack slots and carrying them
       in registers across basic blocks
    o more specific Entry and Transfer datatypes to make calling convention
       distinctions more explicit
    o new heuristic for carrying values in registers across basic blocks
       (look Ma, no Overflows!)
    o new "predict" model for generating register allocation hints
    o additional bug fixes

* 2001-8-7
  - MLton.Socket.shutdownWrite flushes the outstream.

--------------------------------------------------------------------------------

Here are the changes from version 20010706 to version 20010806.

Summary:
    + Word.andb (w, 0xFF) now works correctly
    + MLton.Rusage.rusage has a patch to work around a linux kernel bug
    + Programs of the form "exp ; program" are now accepted
    + Added the "MLton.Rlimit" structure
    + Added the "-keep dot" flag, which produces call graphs,
      intraprocedural control-flow graphs, and dominator trees

* 2001-8-6
  - Added simple common block elimination CPS optimization.

* 2001-8-2
  - Took out -keep il.

* 2001-7-31
  - Performance improvements to TextIO.{input, output, output1}

* 2001-7-25
  - Added redundant-test elimination CPS optimization.

* 2001-7-21
  - Added common-subexpression elimination CPS optimization.

* 2001-7-20
  - Bug fix to x86 codegen.  The commuteBinALMD peephole optimization would
    rewrite  mov 2,Y; add Y,Y  as  mov Y,Y; add 2,Y.  Now the appropriate
    interference checks are made.
  - Added intraprocedural unused argument removal.
  - Added intraprocedural flattener.  This avoids some stupid tuple
    allocations in loops.  Decent speedup on a few benchmarks
    (count-graphs, psdes-random, wc-scanStream) and no noticeable
    slowdowns.
  - Added -keep dot flag.

* 2001-7-17
  - Modified grammar to properly handle val rec.  There were several problems.
    o MLton had accepted "val rec 'a ..." instead of "val 'a rec ..."
    o MLton had not accepted "val x = 13 and rec f = fn () => ()"
    o MLton had not accepted "val rec rec f = fn () => ()"
    o MLton had not accepted "val rec f = fn () => () and rec g = fn () => ()"

* 2001-7-16
  - Workaround for Linux kernel bug that can cause getrusage to return a wrong
    system time value (low by one second).  See fixedGetrusage in gc.c.
  - Bug fix to x86 codegen.  The register allocator could get confused when
    doing comparisons of floating point numbers and use the wrong operand.
    The bug seems to have never been detected because it only happens when both
    of the operands are already on the floating point stack, which is rare,
    since one is almost always in memory since we don't carry floating point
    values in the stack across basic blocks.
  - Added production to the grammar on page 58 of the Definition that had been
    missing from MLton since day one.
                program ::= exp ; <program>
    Also updated docs to reflect change.
  - Modified grammar to accept the empty program.
  - Added -type-check expert flag to turn on type checking in ILs.

* 2001-7-15
  - Bug fix to the algebraic simplifier.  It had been rewriting
                Word32.andb (w, 0wxFF) to w
    instead of  Word32.andb (w, 0wxFFFFFFFF) to w.

* 2001-7-13
  - Improved CPS shrinker so that if-tests where the then and else branch jump
    to the same label is turned into a direct jump.
  - Improved CPS shrinker (Prim.apply) to handle constructors
        A = A --> true
        A = B --> false
        A x = B y --> false
  - Rewrote a lot of loops in the basis library to use inequalities instead of
    equality for the loop termination test so that the (forthcoming) overflow
    detection elimination will work on the loop index variable.

* 2001-7-11
  - Fixed minor bugs in Array2.{array,tabulate}, Substring.{slice} that caused
    the Overflow exception to be raised instead of Size or Subscript
  - Fixed bug in Pack32Big.update that caused the wrong location to be updated.
  - Fixed several bugs in Pack32{Big,Little}.{subArr,subVec,update} that caused
    Overflow to be raised instead of Subscript.  Also, improved the
    implementation so that bounds checking only occurs once per call (instead of
    four times, which was sometimes happening.
  - Fixed bugs in Time.{toMilliseconds,toMicroseconds} that could cause
    a spurious Overflow exception.
  - Fixed bugs in Time.{fromMilliseconds,fromMicroseconds} that could cause
    a spurious Time exception.
  - Improved Pack32.sub* by reordering the orbs.
  - Improved {Int,IntInf}.mod to increase chances of constant folding.
  - Switched many uses of +, -, * in basis library to the non-overflow checked
    versions.  Modules changed were: Array, Array2, Byte, Char, Int, IntInf,
    List, Pack32{Big,Little}, Util, String, StringCvt, Substring, TextIO, Time,
    Vector.
  - Added regression tests for Array2, Int (overflow checking), Pack32,
    Substring, Time.
  - Changed CPS output so that it includes a dot graph for each CPS function.

* 2001-7-9
  - Change OS.Process.exit so that it raises an exception if the exit status
    is not in [0, 256).
  - Added MLton.Rlimit to provide access to getrlimit and setrlimit.

--------------------------------------------------------------------------------

Here are the changes from the 20000906 version to the 20010706 version.

Summary:
    + Native X86 code generator (instead of using gcc)
    + Significantly improved compile times
    + Significantly improved run times for generated executables
    + Many bug fixes
    + Correct raising of the Overflow exception for integer arithmetic
    + New modules in the MLton structure

* 2001-7-6
  - GC mods from Henry.  Mostly adding inline declarations.

* 2001-7-5
  - Fixed several runtime bugs involving threads, critical sections, and
    signals.

* 2001-6-29
  - Fixed performance bug in cps/two-point-lattice.fun that caused quadratic
    behavior.  This affects the raise-to-jump and useless analayses.  In
    particular, the useless analysis was blowing up when compiling fxp.

* 2001-6-27
  - Henry improved wordAlign -- this sped up GC by 27% (during a self compile).

* 2001-6-20
  - Moved MLton.random to MLton.Random.rand and added other stuff to
    MLton.Random
  - Added MLton.TextIO.mkstemp.
  - Made Int.{div,quot} respect the -detect-overflow switch.

* 2001-6-20
  - Added MLton.Syslog.

* 2001-6-7
  - Fixed bug in MLton.Socket.accept that was in the runtime implementation
    Socket_accept.  It did a setsockopt SO_REUSEADDR after the accept.  It
    should have been after the call to socket in Socket_listen.  Thanks to
    Doug Bagley for the fix.

* 2001-5-30
  - Fixed bug in remove-unused that caused polymorphic equality to return
    true sometimes when constructors were never used in a pattern match.
    For example, the following (in which A and B are not used as patterns):
        datatype t = A | B
        datatype u = C of t
        val _ = if C A = C B then raise Fail "bug" else ()

* 2001-3-27
  - Fixed bug that caused all of the following to fail
        {LargeWord,Word,SysWord}.{toLargeInt,toLargeIntX,fromLargeInt}
    The problem was the basis library file integer/patch.sml which fixed Word32
    but not the other structures that are the same.

* 2001-2-12
  - Fixed bug in match compiler that caused it to spend a lot of extra time in
        deep patterns.  It still could be exponential however.  Hopefully this
        will get fixed in the release after next.
        This bug could cause very slow compile times in some cases.
        Anyways, this fix cut the "finish infer" time of a self compile down
        from 22 to under 4 seconds.  I.E. most of the time used to be spent due
        to this bug.

* 2001-2-6
  - Fixed bug in frontend that caused the wrong file and line number to be
        reported with errors in functor bodys.

* 2001-1-3 - 2000-2-5
  - Changes to CoreML, XML, SXML, and CPS ILs to replace lists by vectors in
        order to decrease space usage.

* 2001-1-16
  - Fixed a bug in constant propagation where the length of vectors was not
        propagated properly.

* 2000-12-11 - 2001-1-3
  - Major rewrite of elaborator to use a single hash table for each namespace
        instead of a hash table for every environment.

* 2000-12-20
  - Fixed some bugs in the SML/NJ compatibility library,
        src/lib/mlton-subs-in-smlnj.

* 2000-12-8
  - More careful removal of tracing code when compiling MLton_debug=0.
    This cut down self compile data size by 100k and compile time by a few
    seconds.
  - Added built in character and word cases propagated throughout all ILs.

* 2000-12-6
  - Added max stack size information to gc-summary.

* 2000-12-5
  - Added src/benchmark, which contains an SML program that benchmarks all of
    the SML compilers I have my hands on.  The script has lots of hardwired
    paths for now.

* 2000-12-4
  - Fixed bug in Posix.ProcEnv.environ, which did not work correctly in a saved
    world (the original environ was saved).  In fact, it did not work at all
    because the ML primitive expected a constant and the C was a nullary
    function. This caused a segfault with any program using
    Posix.ProcEnv.environ.
  - Added MLton.ProcEnv.setenv, since there doesn't seem to be any setenv in
    the basis library.

* 2000-11-29
  - Changed backend so that it should no longer generate machine programs with
    void operands.
  - Added -detect-overflow and -safe flags.

* 2000-11-27 - 2000-11-28
  - Changes in many places to use List.revMap instead of List.map to cut down
    on allocation.

* 2000-11-21
  - Added MLton.Word.~ and MLton.Word8.~ to the MLton basis library structure.

* 2000-11-20
  - Fixed a bug in the CPS shrinker that could cause a compile-time failure.
    It was maintaining occurrence counts incorrectly.

* 2000-11-15
  - Fixed a (performance) bug in constant propagation that caused the hashing
        to be bad.
  - Improved translation to XML so that the match compiler isn't called on
        tuple or if expressions.  This should speed up the translation and
        make the output smaller.
  - Fixed a bug in the match compiler that caused it to not generate integer
        case statements.  This should speed up the mlyacc benchmark and the
        MLton front end.

* 2000-11-9
  - Added IntInf_equal and IntInf_compare primitives.
  - Took out the automatic -keep c when compiling -g.

* 2000-11-8
  - Added a whole bunch of algebraic laws to the CPS shrinker, including
    some specifically targeted to IntInf primitives.

* 2000-11-3
  - Improved implementation of properties so that sets don't allocate.
  - Improved implementation of type homomorphism in type inference.  What
    was there before appears to have been a bug -- it didn't use the property
    on types.

* 2000-11-2
  - Fixed timers used with -v option to use user + sys time.

* 2000-10-27
  - Split the runtime basis library C files into many separate files so that
    only the needed code would be included by the linker.
  - Fixed several bugs in the front end grammar and elaborator that caused
    type specifications to be handled incorrectly.  The following three programs
    used to be handled incorrectly, but are now handled correctly.
      signature S = sig type t and u = int end (* reject *)
      signature S = sig type t = int and u = t end (* accept *)
      signature S = sig eqtype t and u = int end (* reject *)

* 2000-10-25
  - Changes to main.sml to run complete compiles with -native switch.

* 2000-10-24
  - Removed defunctorizer.

* 2000-10-20
  - Fixed bug in cps-tree.fun PrimExp.maySideEffect.  This bug could cause
    no operand failures in the backend.
  - Fixed bug in the runtime implementation of MLton.size.  The size for stack
    objects was using the used instead of reserved, and so was too low.

* 2000-10-19
  - Replaced automatically generated dependencies in src/runtime/Makefile with
    hand generated ones.  Took out make depend from src/Makefile.  makedepend
    was behaving really badly on RHAT 7.0.
  - Tweaked compiler to shorten width of C output lines to work around
        bug in RHAT 7.0 cpp which silently truncates (very) long lines.
  - Fixed bug in grammar that didn't allow "op" to occur in datatype and
    exception bindings, causing the following to fail
        datatype t = op T
        exception op E = op Fail
  - Improved error messages in CM processor.  Fixed bug in CM Alias handling.

* 2000-10-18
  - Fixed two bugs in the gc that did comparisons with (s->limit - s->frontier),
    which of course doesn't work if frontier is beyond limit, since these are
    unsigned.  This could have caused segfaults, except that the mutator
    checks the frontier upon return from the GC.

* 2000-10-17
  - Fixed bug in backend in the calculation of maxFrameSize.  It could be
    wrong (low) in some situations.
  - Improved CPS inliner's estimate of function sizes.  The size of a function
    now takes into account other inlined functions that the function calls.
    This also changed the meaning of the size argument to the -inline switch.
    It now corresponds (roughly) to the product of the size of the function
    and the number of calls.  In general, it should be larger than before.

* 2000-10-13
  - Made some calls to Array.sub unsafe in the implementation of Array2.
  - Integrated Matthew's new x86 backend with floating point support.

* 2000-10-9
  - Fixed CM file processor so that MLton works if it is run from a different
    directory than the main CM file.

* 2000-10-4
  - Changed LimitCheck so it loops on the frontier > limit check.  This fixed
    a potential bug in threads caused when there is enough space available for
    a thread, t, before switching to another thread but not enough space when it
    resumes.  This could have caused a segfault.

* 2000-10-3
  - More rewrites of TextIO.StreamIO to improve speed.
  - Changed TextIO so that only TextIO.stdErr is unbuffered.
  - Changed TextIO so that FIFOs and sockets are buffered.

* 2000-10-2
  - Combined remove-unused-constructors, remove-unused-functions, and
    remove-unused-globals into a single pass that runs to fixed-point and
    produces results at least as good as running the previous three in (any)
    sequence.

* 2000-9-29
  - Added GC_FIRST_CHECK, which does a gc at each limit check the first time it
    reached.
  - Reimplemented TextIO.StreamIO (from 2000-9-12) to use lists of strings
    instead of lists of characters so that the per char space overhead is small.

* 2000-9-21
  - Fixed bug in profiling labels in C code.  The label was always the basic
    block label instead of the cps function label.
  - Added -b switch to mlprof to gather data at the basic block level.
  - Improved performance of TextIO.input1 by about 3X.

* 2000-9-15 - 2000-9-19
  - Added overflow exceptions to CPS and Machine ILs.

* 2000-9-12
  - Fixed TextIO.scanStream.  It was very broken.
  - Added TextIO.{getInstream,mkInstream,setInstream}
          TextIO.StreamIO.{canInput,closeIn,endOfStream,input1,input,inputAll,
                           inputLine,inputN}

* 2000-9-11
  - Fixed Real_qequal in mlton-lib.h.  It was missing a paren that caused
    code using it to not even compile.  It was also semantically incorrect.
  - Noted that Real_{equal,lt,le,gt,ge} may not follow basis library spec, since
    ANSI does not require IEEE compliance, and hence these could return wrong
    results when nans are involved.

--------------------------------------------------------------------------------

Here are the changes from the 20000712 version to the 20000906 version.

    Version 20000906 is mostly a bugfix release over 20000712.  The other major
    changes are that mllex and mlyacc are now included and
    that mlton can now process a limited subset of CM files as input.

* 2000-9-6
  - Fixed Socket_listen in mlton-lib.c so that it closes the socket if the
        bind, listen, or getsockname fails.  This could have caused a file
        descriptor leak.

* 2000-9-5
  - Added -static commandline switch.
  - Changed default max heap size to .85 RAM from .95 RAM.
  - Added PackRealLittle structure to basis library.

* 2000-8-25
  - Added cases on integers to ILs (instead of using sequences of tests) so that
    backend can emit more efficient test (jump table, binary tree, ...).

* 2000-8-24
  - Fixed bug in gc.c.  dfsInitializeStack would smummap a NULL pointer whenver
    toSpace was NULL.  This could gause MLton.size to segfault.
  - Fixed bug in Popt that caused -k to fail with no keeps.

* 2000-8-22 - 2000-8-23
  - Ported mllex and mlyacc from SML/NJ

* 2000-8-20 - 2000-8-21
  - Added ability to us a .cm file as input to MLton.

* 2000-8-16
  - Ported mlprof to SML.
  - Fixed bug in library/basic/assert.sml that caused asserts to be run even
    when MLton.debug = false.

* 2000-8-15
  - Fixed bug in backend -- computation of maxFrameSize was wrong.  It didn't
    count slots in frames that didn't make nontail calls.  This could lead to
    the stack being overwritten because a stack limit check didn't guarantee
    enough space, and lead to a seg fault.
  - Fixed bug in gc.c newThreadOfSize.  If the thread allocation caused a gc,
    then the stack wasn't forwarded, leading to a seg fault.  The solution was
    to ensure enough memory all at once, and then fill in both objects.

* 2000-8-14
  - Changed limit checks so that checks < 512 bytes are replaced by a check for
    0.  The runtime also moves the limit down by 512.  This is done so that the
    common case, a small limit check, has less code and is faster.
  - Fixed bug in cps/cps-tree.fun Program.hasPrim returned true for any program
    that had *any* primapp, not just programs satisfying the predicate.  This
    caused cps/once.fun to be overly conservative, since it thought that every
    program used continuations.

* 2000-8-10
  - Fixed bug in CPS typechecker.  It didn't enforce that handlers should be
    defined before any reference to them -- including implicit references in
    HandlerPops.  This caused an evil bug in the liveness analysis where a
    variable that was only live in the handler was missed in a continuation
    because the liveness for the handler wasn't computed yet.
  - Limited the size for moving up limit checks for arrays whose size is known
    at compile time to avoid huge limit checks getting moved into loops.
  - added -indent, -kp, -show-types switches.
  - Put optimization in CPS IL suggested by Neal Glew.  It determines for each
    toplevel function if it can raise an exception to its caller.  Also, it
    removes HanderPush and HandlerPop for handlers that are not on top of the
    stack for any nontail call.

* 2000-8-8
  - Changed register allocator so that continuation formals can be allocated in
    pseudo registers -- they aren't necessarily forced to the stack.

* 2000-8-3
  - Fixed bug in constant folding.
        Word8.>> had been used to implement Word8.~>>.
  - Fixed bug in allocate registers that was not forcing the size argument to
    Primitive.Array.array to be a stack slot.  This could cause problems if
    there was a thread switch in the limit check, since upon return the size
    pseudo register would have a bogus value.

* 2000-8-1
  - Turned back on Xml simplification after monomorphisation.

* 2000-7-31
  - Fixed bug in MLton.Itimer.set that caused the time to be doubled.
  - Fixed bug in MLton.Thread that made it look like asynchronous exceptions
    were allowed by throw'ing an exception raising thunk to an interrupted
    thread obtained via a signal handler.  Attempting asynchronous exceptions
    will now cause process death, with a helpful error message.

* 2000-7-27
  - Updated docs to include structure World: MLTON_WORLD in MLton structure.
  - Added toplevel signatures MLTON_{CONT, ..., WORLD} to basis library.
  - Fixed broken link in docs to CM in cmcat section.

* 2000-7-26
  - Eliminated GC_switchToThread and Thread_switchTo1, since the inlined
    version Thread_switchTo is all that's needed, and Matt's X86 backend
    now handles it.
  - Added MLton.Signal.vtalrm, needed for
    Itimer.Set{which = Itimer.Virtual, ...}

* 2000-7-25
  Added MLton.Socket.shutdownWrite.

* 2000-7-21
  Updated mlton-lib.c MLton_bug with new email (MLton@sourcelight.com).

* 2000-7-19
  Fixed Posix.Process.kill to check for errors.

* 2000-7-18
  Fixed the following Posix.ProcEnv functions to check for errors:
    setgid, setpgid, setsid, setuid.
  Fixed doc/examples/callcc.sml.

--------------------------------------------------------------------------------

Here are the changes from the 1999-7-12 to the 20000712 version.

* 2000-6-10 - 2000-7-12
  Too many changes to count: bug fixes, new basis library modules,
        optimizer improvements.
* 2000-6-30
  Fixed bug in monomorphiser that caused programs with non-value
  carrying exception declarations in polymorphic functions to have a
  compile-time error because of a duplicate label.  The problem was
  that the exception constructor wasn't duplicated.
* 2000-5-22 - 2000-6-10
  Finished the changes for the new Cps IL.
* 2000-1-1
  Fixed some errors in the basis library.
        Real.copySign
        Posix.FileSys.fpathconf
        Posix.IO.{lseek, getlk, setlk, setlkw}
        Posix.ProcEnv.setpgid
        Posix.TTY.getattr
        System.FileSys.realPath
* 1999-12-22
  Fixed bug in src/closure-convert/abstract-value.fun that caused a
  compiler failure whenever a program had a vector where the element
  type contained an ->.
* 1999-12-10
  - Changed dead code elimination in core-ml/dead-code.fun so that
    wildcard declarations (val _ = ...) in the basis are kept.
    Changed places in the basis library to take advantage of this
  - Added setTopLevelHander primitive so that the basis library code
    can define the toplevel handler.
  - Changed basis-library/misc/suffix.sml to call OS.Process.exit.
    Took out Halt transfer from Cps, since the program never should
    reach it.
  - Cleaned up basis-library/system/{process.sml, unix.sml} to use
    the new signal handling stuff.
* 1999-11-28 - 1999-12-20
  Added support for threads and cleaned up signal handling.
  This involved a number of changes.
  - The stack is now allocated as just another kind of heap object.
  - Limit checks are inserted at all loop headers, whether or not there
    is any allocation.  This is to ensure that the signal handler
    always has a chance to get called.
  - The register allocator puts more variables in stack slots.  The new
    rule is that a variable goes in a stack slot if it is ever live
    across a nontail call, in a handler, or (this is the new part)
    across a limit check.
  - Arguments are passed on the stack, with the convention determined by
    argument types.
  - The "locals" array of pointers that was copied to/from for GC is now
    gone, because no registers (in particular no pointer valued
    registers) can be live at a limit check point.
* 1999-11-21
  - Runtime system
    o Fixed a bug introduced by the signal code
        (presumably on 1999-8-9) that caused a gc to *not* be performed when
        doing a save world.  This caused the heaps created by save world to
        be the same size as the heap -- not the live data.  This was quite
        bad.
    o Cleaned up the Makefile.  Add make depend.
    o Added max gc pause to gc-summary info.
    o Move heap translation variables that had been file statics into
        the GC_state.
  - Made structure Position available at toplevel.
  - Basis Library
    o Added MLton.loadWorld
  - Added Primitive.usesCallcc
  - Added Primitive.safe
  - Removed special size functions from cps/save-world -- they are no
    longer necessary since size doesn't do a gc.
  - Fixed another (sigh) bug in cps/simplify-types.fun that could
    cause it to not terminate.
* 1999-11-16
  - Cleaned up backend/machine.fun a bit so that it spits out macros
    for allocation of objects and bumping of frontier.  Added macros
    MLTON_object and MLTON_incFrontier to include/mlton-lib.h.
  - Fixed a bug in backend/limit-check.fun that caused loops to not be
    detected if they were only reached by a case branch.  This could
    cause there to be loop that allocates with no limit check.
    Needless to say, this could cause a segfault if the loop ran for
    long enough.
* 1999-10-18
  Added basis library function Array2.copy.
* 1999-8-15
  Turned off globalization of ref cells
  (closure-convert/globalize.fun) because it interacts badly with
  serialization.
* 1999-8-13
  Fixed bug in mlton-lib.h in MLTON_allocArrayNoPointers that was
  triggered when bytesPerElt == 0.  The problem was that it wasn't
  reserving space for the forwarding pointer.  This could cause a seg
  fault.
* 1999-8-8 and 1999-8-9
  Added support for signal handling.
* 1999-8-7
  Fixed bugs in Array.tabulate (and other tabulate variants) caused if
  the function argument used callcc.
* 1999-8-1
  Added serialization, which was mostly code in src/runtime/gc.c.
  GC_serialize converts an object to a Word8Vector.vector.
  GC_deserialize undoes the conversion.
  (de)Serialization should work for all objects except for functions,
  because I haven't yet added the support in the flow analysis.
* 1999-7-31
  - Cleaned up the GC.  Changed headers, by stealing a bit from the
    number of non pointers and making it a mark bit (used in GC_size).
  - Rewrote GC_size so that it runs in time proportional to the number
    of pointers in the object.  It does a depth-first-search now,
    using toSpace to hold the stack.
* 1999-7-30
  - Fixed bug in SUBSTRING.  getc had the wrong type.  This bug wasn't
    noticed because MLton doesn't do enough type checking.
  - Fixed bug (seg fault) caused when a GC immediately followed a throw.
* 1999-7-29
  Fixed bug in Date.fmt (basis-library/system/date.sml).  It was not
  setting Tm.buf, and hence the time was always 0 unless there had
  been a previous call to setTmBuf.
* 1999-7-28
  - Fixed bugs in Posix.IO.FLock.{getlk,setlk,setlkw}, which would
    cause compilation to fail because FLock.toInt was defined as the C
    castInt, which no longer exists.  Instead, expand FLock.toInt to
    MLTON_pointerToInt, which was added to include/mlton-lib.h.
  - Changed Posix.Primitive.Flock to Posix.Primitive.FLock.
  - Added MLTON_chown, MLTON_ftruncate to include/mlton-posix.h.  They were
    missing.  This would cause compilation of any program using
    Posix.FileSys.{chown,ftruncate} to fail.  Also made it so all of the
    primitives in basis-library/posix/primitive.sml use MLTON_ versions
    of functions, even if a wrapper is unnecessary.
* 1999-7-25
  Added some other missing signature definitions to toplevel.
* 1999-7-24
  Added missing OS_* signature definitions to
  basis-library/top-level/top-level.sml.
* 1999-7-19
  Fixed bug in basis-library/arrays-and-vectors/mono-array.sml.  Used
  :> instead of : so that the monomorphic array types are abstract.

--------------------------------------------------------------------------------

Here are the changes from the 1999-3-19 version to the 1999-7-12 version.

* 1999-7-12
  Changed src/backend/machine.fun so that the 'pointer locals' array is
  only as large as neccessary in order to copy all pointer-valued
  locals, not as large as the number of pointer-valued locals.
* 1999-7-11
  Rewrote src/backend/allocate-registers.fun so that it does a better
  job of sharing "registers" (i.e. C local variables) and stack slots.
  This should cut down on the amount of copying that has to happen
  before and after a gc.  It should also cut down on the size of stack
  slots.
* 1999-7-10
  Fixed a bug in src/backend/parallel-move.fun that should have been
  triggered on most any parallel move.  I guess parallel moves almost
  never happened due to the old register allocation strategy -- but,
  with the new one (see note for 1999-7-12) parallel moves will be
  frequent.
* 1999-6-27
  Fixed src/main.sml so that when compiling -p, the .c file is compiled
        -g and the .o is linked -p.
  In bakend/machine.fun, added profiling comments before chunkswitches
        and put in an optimization to avoid printing repeated profiling
        comments.  Also, profiling comments are only output when
        compiling -p.
* 1999-6-17
  Changed -i to -inline, -f to -flatten, -np to -no-polyvariance,
        -u to -unsafe.
  Added -i, -I, -l, -L flags for includes and libraries.
  Updated documentation for these options and for ffi.
* 1999-6-16
  Hardwired version number in src/control/control.sml.  As it stood,
  the version number was computed when MLton was built after someone
  downloaded it, which was clearly wrong.
* 1999-6-16
  Fixed undefined variable time in GC_done in src/runtime/gc.c.
* 1999-6-8
  in include/mlton-lib.h,
     removed #include <huge_val.h>
     added #include <math.h>
     and deleted all of the function signatures I had copied from math.h
  Changed Real.{minNormalPos, minPos, maxFinite} so that they are
        computed in real.sml instead of appearing as constants in the C.
* 1999-6-7
  IntInf.pow added to basis library.
* 1999-6-4
  bin/mlton changed to use .arch-n-opsys if it exists.
* 1999-6-3
  src/Makefile changed to use sml-cm instead of sml
* 1999-5-10
  Patch to src/atoms/small-int-inf.fun to work around a bug in the SML/NJ
  implementation of bignums.  This bug was causing some hex bignum
  constants to be lexed incorrectly.
* 1999-4-15
  Comments emitted in C code for profiling.  The comments identify the
  Cps function responsible for each C statement.
* 1999-4-15
  callcc and throw added.
* 1999-4-15
  Bug in src/cps/simplify-types fixed.  The bug caused nontermination
   whenever there was a circular datatype with a vector on the rhs.
   E.g.  datatype t = T of t vector

--------------------------------------------------------------------------------

Here are the changes from the 1998-8-26 version to the 1999-3-19 version.

* Compile time and code size have decreased.
* Runtime performance of executables has improved.
* Large programs can now be compiled.
* MLton is self hosting.
* The basis library is mostly complete and many bugs have been fixed.
* The monomorphiser (-m) is no longer available.
* The heap and stack are automatically resized.
* There are now facilities for heap checkpointing (MLton.saveWorld)
  and object size computation (MLton.size).
* MLton uses the GNU multiprecision library to provide a fast
  implemenation of IntInf.


Last edited on 2007-08-21 04:50:41 by MatthewFluet. mlton-20100608/doc/guide/ChrisClearwater0000644000076600000240000000326711404435634016442 0ustar mtfstaff ChrisClearwater - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ChrisClearwater
Home  Index  


Last edited on 2005-11-30 23:18:55 by StephenWeeks. mlton-20100608/doc/guide/Chunkify0000644000076600000240000000536111404435634015135 0ustar mtfstaff Chunkify - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Chunkify
Home  Index  
Chunkify is an analysis pass for the RSSA IntermediateLanguage, invoked from ToMachine.

Description

It partitions all the labels (function and block) in an RSSA program into disjoint sets, referred to as chunks.

Implementation

[WWW]chunkify.sig [WWW]chunkify.fun

Details and Notes

Breaking large RSSA functions into chunks is necessary for reasonable gcc compile times with the CCodegen.


Last edited on 2006-11-02 17:32:41 by MatthewFluet. mlton-20100608/doc/guide/CKitLibrary0000644000076600000240000001161511404435635015534 0ustar mtfstaff CKitLibrary - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CKitLibrary
Home  Index  
The [WWW]ckit Library is a C front end written in SML that translates C source code (after preprocessing) into abstract syntax represented as a set of SML datatypes. The ckit Library is distributed with SML/NJ. Due to differences between SML/NJ and MLton, this library will not work out-of-the box with MLton.

As of 20100402, MLton includes a port of the ckit Library synchronized with SML/NJ version 110.72.

Usage

  • You can import the ckit Library into an MLB file with:

    MLB file Description
    $(SML_LIB)/ckit-lib/ckit-lib.mlb
  • If you are porting a project from SML/NJ's CompilationManager to MLton's ML Basis system using cm2mlb, note that the following map is included by default:

    $ckit-lib.cm/ckit-lib.cm   $(SML_LIB)/ckit-lib/ckit-lib.mlb
    
    This will automatically convert a $/ckit-lib.cm import in an input .cm file into a $(SML_LIB)/ckit-lib/ckit-lib.mlb import in the output .mlb file.

Details

The following changes were made to the ckit Library, in addition to deriving the .mlb file from the .cm files:

  • parser/parse-tree-sig.sml (modified): Rewrote use of (sequential) withtype in signature.

  • parser/parse-tree.sml (modified): Rewrote use of (sequential) withtype.

  • parser/grammar/c.lex.sml (modified): Rewrote use of vector literal.

  • ast/ast-sig.sml (modified): Rewrote use of withtype in signature.

  • ast/pp/pp-lib.sml (modified): Rewrote use of or-patterns.

  • ast/pp/pp-ast-ext-sig.sml (modified): Rewrote use of signature in local.

  • ast/pp/pp-ast-adornment-sig.sml (modified): Rewrote use of signature in local.

  • ast/type-util-sig.sml (modified): Rewrote use of signature in local.

  • ast/type-util.sml (modified): Rewrote use of or-patterns.

  • ast/sizeof.sml (modified): Rewrote use of or-patterns.

  • ast/initializer-normalizer.sml (modified): Rewrote use of or-patterns.

  • ast/build-ast.sml (modified): Rewrote use of or-patterns.

Patch


Last edited on 2010-04-02 19:22:13 by MatthewFluet. mlton-20100608/doc/guide/Closure0000644000076600000240000000633011404435634014766 0ustar mtfstaff Closure - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Closure
Home  Index  
A closure is a data structure that is the run-time representation of a function.

Typical Implementation

In a typical implementation, a closure consists of a code pointer (indicating what the function does) and an environment containing the values of the free variables of the function. For example, in the expression

let
   val x = 5
in
   fn y => x + y
end

the closure for fn y => x + y contains a pointer to a piece of code that knows to take its argument and add the value of x to it, plus the environment recording the value of x as 5.

To call a function, the code pointer is extracted and jumped to, passing in some agreed upon location the environment and the argument.

MLton's Implementation

MLton does not implement closures traditionally. Instead, based on whole-program higher-order control-flow analysis, MLton represents a function as an element of a sum type, where the variant indicates which function it is and carries the free variables as arguments. See ClosureConvert and CejtinEtAl00 for details.


Last edited on 2005-11-30 23:25:36 by StephenWeeks. mlton-20100608/doc/guide/ClosureConvert0000644000076600000240000000564511404435634016337 0ustar mtfstaff ClosureConvert - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ClosureConvert
Home  Index  
ClosureConvert is a translation pass from the SXML IntermediateLanguage to the SSA IntermediateLanguage.

Description

It converts an SXML program into an SSA program.

Defunctionalization is the technique used to eliminate Closures (see CejtinEtAl00).

Uses Globalize and LambdaFree analyses.

Implementation

[WWW]closure-convert.sig [WWW]closure-convert.fun

Details and Notes


Last edited on 2006-11-02 17:57:14 by MatthewFluet. mlton-20100608/doc/guide/CMinusMinus0000644000076600000240000000451611404435635015571 0ustar mtfstaff CMinusMinus - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CMinusMinus
Home  Index  
[WWW]C-- is a portable assembly language intended to make it easy for compilers for different high-level languages to share the same backend. An experimental version of MLton has been made to generate C--.

Also see


Last edited on 2006-09-04 20:25:21 by StephenWeeks. mlton-20100608/doc/guide/CombineConversions0000644000076600000240000001226511404435634017163 0ustar mtfstaff CombineConversions - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CombineConversions
Home  Index  
Combine conversions is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass looks for and simplifies nested calls to (signed) extension/truncation.

Implementation

[WWW]combine-conversions.sig [WWW]combine-conversions.fun

Details and Notes

It processes each block in dfs order (visiting definitions before uses):

  • If the statement is not a PrimApp Word_extdToWord, skip it.

  • After processing a conversion, it tags the Var for subsequent use.

  • When inspecting a conversion, check if the Var operand on is also the result of a conversion. If it is, try to combine the two operations. Repeatedly simplify until hitting either a non-conversion Var or a case where the conversion cannot be simplified.

The optimization rules are very simple:

    x1 = ...
    x2 = Word_extdToWord (W1, W2, {signed=s1}) x1
    x3 = Word_extdToWord (W2, W3, {signed=s2}) x2
    
  • If W1 = W2, then there is no conversions before x_1.

    • This is guaranteed because W2 = W3 will always trigger optimization.
  • Case W1 <= W3 <= W2:

    • x3 = Word_extdToWord (W1, W3, {signed=s1}) x1
      
  • Case W1 <  W2 <  W3 AND (NOT s1 OR s2):

    • x3 = Word_extdToWord (W1, W3, {signed=s1}) x1
      
  • Case W1 =  W2 <  W3:

    • unoptimized because there are no conversions past W1 and x2 = x1
  • Case W3 <= W2 <= W1:

  • Case W3 <= W1 <= W2:

    • x_3 = Word_extdToWord (W1, W3, {signed=_}) x1
      
      because W3 <= W1 && W3 <= W2, just clip x1
  • Case W2 < W1 <= W3:

  • Case W2 < W3 <= W1:

    • unoptimized because W2 < W1 && W2 < W3, has truncation effect
  • Case W1 < W2 < W3 AND s1 AND (NOT s2):

    • unoptimized because each conversion affects the result separately


Last edited on 2009-08-02 22:19:10 by MatthewFluet. mlton-20100608/doc/guide/common.css0000644000076600000240000000305111404435634015426 0ustar mtfstaff/* common.css - MoinMoin Default Styles Copyright (c) 2001, 2002, 2003 by Jürgen Hermann */ /* content styles */ /* survey */ input[type="checkbox"] { vertical-align: middle; } input[type="radio"] { vertical-align: 10%; } div.improvements table { border-width: 0px; } div.improvements td { border-width: 0px; text-align: center; width: 1.5em; } div.improvements td.improvement-description { padding-left: 1em; text-align: left; width: 20em; } span.importance { color: red; font-size: 75%; vertical-align: middle; } span.improvement-group { font-weight: bold; } div.lines table { border-width: 0px; } div.lines td { border-width: 0px; text-align: center; width: 4em; } div.years table { border-width: 0px; } div.years td { border-width: 0px; text-align: center; width: 3em; } /* end survey */ html { background-color: white; color: black; } h2 { font-size: 130%; } h3 { font-size: 1.3em; } h4, h5, h6 { font-size: 1em; } li p { margin: .2em 0; } li.gap { margin-top: 8pt; } a img { border: 0; } img.drawing { border: 0; } dt { font-weight: bold; } pre { padding: .5em; white-space: pre-wrap; } #content { /* style for content generated by wiki markup */ } .footnotes ul { padding: 0 2em; margin: 0 0 1em; } .footnotes li { list-style: none; } /* eye catchers */ .warning { color: #000000; background-color: #EDD097; padding: 1pt; } .error { color: #FF0000; background-color: #EDD097; padding: 1pt; } strong.highlight { background-color: #FFAA00; padding: 1pt; } mlton-20100608/doc/guide/CommonArg0000644000076600000240000003553011404435634015240 0ustar mtfstaff CommonArg - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CommonArg
Home  Index  
CommonArg is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

It optimizes instances of Goto transfers that pass the same arguments to the same label; e.g.

L_1 ()
  ... 
  z1 = ? 
  ... 
  L_3 (x, y, z1)
L_2 ()
  ... 
  z2 = ? 
  ...
  L_3 (x, y, z2)
L_3 (a, b, c)
  ...
This code can be simplified to:
L_1 ()
  ... 
  z1 = ? 
  ... 
  L_3 (z1)
L_2 ()
  ... 
  z2 = ? 
  ...
  L_3 (z2)
L_3 (c)
  a = x
  b = y
which saves a number of resources: time of setting up the arguments for the jump to L_3, space (either stack or pseudo-registers) for the arguments of L_3, etc. It may also expose some other optimizations, if more information is known about x or y.

Implementation

[WWW]common-arg.sig [WWW]common-arg.fun

Details and Notes

Three analyses were originally proposed to drive the optimization transformation. Only the Dominator Analysis is currently implemented. (Implementations of the other analyses are available in the Subversion repository.)

Syntactic Analysis

The simplest analysis I could think of maintains

varInfo: Var.t -> Var.t option list ref
initialized to [].

For each variable v bound in a Statement.t or in the Function.t args, then List.push(varInfo v, NONE). For each L (x1, ..., xn) transfer where (a1, ..., an) are the formals of L, then List.push(varInfo ai, SOME xi). For each block argument a used in an unknown context (e.g., arguments of blocks used as continuations, handlers, arith success, runtime return, or case switch labels), then List.push(varInfo a, NONE).

Now, any block argument a such that varInfo a = xs, where all of the elements of xs are equal to SOME x, can be optimized by setting a = x at the beginning of the block and dropping the argument from Goto transfers.

That takes care of the example above. We can clearly do slightly better, by changing the transformation criteria to the following: any block argument a such that varInfo a = xs, where all of the elements of xs are equal to SOME x or are equal to SOME a, can be optimized by setting a = x at the beginning of the block and dropping the argument from Goto transfers. This optimizes a case like:

L_1 () 
  ... z1 = ? ... 
  L_3 (x, y, z1)
L_2 () 
  ... z2 = ? ...
  L_3(x, y, z2)
L_3 (a, b, c)
  ... w = ? ...
  case w of 
    true => L_4 | false => L_5
L_4 ()
   ...
   L_3 (a, b, w)
L_5 () 
   ...
where a common argument is passed to a loop (and is invariant through the loop). Of course, the LoopInvariant optimization pass would normally introduce a local loop and essentially reduce this to the first example, but I have seen this in practice, which suggests that some optimizations after LoopInvariant do enough simplifications to introduce (new) loop invariant arguments.

Fixpoint Analysis

However, the above analysis and transformation doesn't cover the cases where eliminating one common argument exposes the opportunity to eliminate other common arguments. For example:

L_1 () 
  ...
  L_3 (x)
L_2 ()
  ...
  L_3 (x)
L_3 (a) 
  ...
  L_5 (a)
L_4 () 
  ...
  L_5 (x)
L_5 (b)
  ...
One pass of analysis and transformation would eliminate the argument to L_3 and rewrite the L_5(a) transfer to L_5 (x), thereby exposing the opportunity to eliminate the common argument to L_5.

The interdependency the arguments to L_3 and L_5 suggest performing some sort of fixed-point analysis. This analysis is relatively simple; maintain

varInfo: Var.t -> VarLattice.t
where
VarLattice.t ~=~ Bot | Point of Var.t | Top
(but is implemented by the FlatLattice functor with a lessThan list and value ref under the hood), initialized to Bot.

For each variable v bound in a Statement.t or in the Function.t args, then VarLattice.<= (Point v, varInfo v) For each L (x1, ..., xn) transfer where (a1, ..., an) are the formals of L}, then VarLattice.<= (varInfo xi, varInfo ai). For each block argument a used in an unknown context, then VarLattice.<= (Point a, varInfo a).

Now, any block argument a such that varInfo a = Point x can be optimized by setting a = x at the beginning of the block and dropping the argument from Goto transfers.

Now, with the last example, we introduce the ordering constraints:

    varInfo x <= varInfo a
    varInfo a <= varInfo b
    varInfo x <= varInfo b
    

Assuming that varInfo x = Point x, then we get varInfo a = Point x and varInfo b = Point x, and we optimize the example as desired.

But, that is a rather weak assumption. It's quite possible for varInfo x = Top. For example, consider:

G_1 () 
  ... n = 1 ...
  L_0 (n)
G_2 () 
  ... m = 2 ...
  L_0 (m)
L_0 (x) 
  ...
L_1 () 
  ...
  L_3 (x)
L_2 ()
  ...
  L_3 (x)
L_3 (a)
  ...
  L_5(a)
L_4 ()
  ...
  L_5(x)
L_5 (b) 
   ...
Now varInfo x = varInfo a = varInfo b = Top. What went wrong here? When varInfo x went to Top, it got propagated all the way through to a and b, and prevented the elimination of any common arguments. What we'd like to do instead is when varInfo x goes to Top, propagate on Point x -- we have no hope of eliminating x, but if we hold x constant, then we have a chance of eliminating arguments for which x is passed as an actual.

Dominator Analysis

Does anyone see where this is going yet? Pausing for a little thought, MatthewFluet realized that he had once before tried proposing this kind of "fix" to a fixed-point analysis -- when we were first investigating the Contify optimization in light of John Reppy's CWS paper. Of course, that "fix" failed because it defined a non-monotonic function and one couldn't take the fixed point. But, StephenWeeks suggested a dominator based approach, and we were able to show that, indeed, the dominator analysis subsumed both the previous call based analysis and the cont based analysis. And, a moment's reflection reveals further parallels: when varInfo: Var.t -> Var.t option list ref, we have something analogous to the call analysis, and when varInfo: Var.t -> VarLattice.t, we have something analogous to the cont analysis. Maybe there is something analogous to the dominator approach (and therefore superior to the previous analyses).

And this turns out to be the case. Construct the graph G as follows:

    nodes(G) = {Root} U Var.t
    edges(G) = {Root -> v | v bound in a Statement.t or
                                    in the Function.t args} U
               {xi -> ai | L(x1, ..., xn) transfer where (a1, ..., an) 
                                          are the formals of L} U
               {Root -> a | a is a block argument used in an unknown context}
    

Let idom(x) be the immediate dominator of x in G with root Root. Now, any block argument a such that idom(a) = x <> Root can be optimized by setting a = x at the beginning of the block and dropping the argument from Goto transfers.

Furthermore, experimental evidence suggests (and we are confident that a formal presentation could prove) that the dominator analysis subsumes the "syntactic" and "fixpoint" based analyses in this context as well and that the dominator analysis gets "everything" in one go.

Final Thoughts

I must admit, I was rather surprised at this progression and final result. At the outset, I never would have thought of a connection between Contify and CommonArg optimizations. They would seem to be two completely different optimizations. Although, this may not really be the case. As one of the reviewers of the ICFP paper said:

    I understand that such a form of CPS might be convenient in some cases, but when we're talking about analyzing code to detect that some continuation is constant, I think it makes a lot more sense to make all the continuation arguments completely explicit.

    I believe that making all the continuation arguments explicit will show that the optimization can be generalized to eliminating constant arguments, whether continuations or not.

What I think the common argument optimization shows is that the dominator analysis does slightly better than the reviewer puts it: we find more than just constant continuations, we find common continuations. And I think this is further justified by the fact that I have observed common argument eliminate some env_X arguments which would appear to correspond to determining that while the closure being executed isn't constant it is at least the same as the closure being passed elsewhere.

At first, I was curious whether or not we had missed a bigger picture with the dominator analysis. When we wrote the contification paper, I assumed that the dominator analysis was a specialized solution to a specialized problem; we never suggested that it was a technique suited to a larger class of analyses. After initially finding a connection between Contify and CommonArg (and thinking that the only connection was the technique), I wondered if the dominator technique really was applicable to a larger class of analyses. That is still a question, but after writing up the above, I'm suspecting that the "real story" is that the dominator analysis is a solution to the common argument optimization, and that the Contify optimization is specializing CommonArg to the case of continuation arguments (with a different transformation at the end). (Note, a whole-program, inter-procedural common argument analysis doesn't really make sense (in our SSA IntermediateLanguage), because the only way of passing values between functions is as arguments. (Unless of course in the case that the common argument is also a constant argument, in which case ConstantPropagation could lift it to a global.) The inter-procedural Contify optimization works out because there we move the function to the argument.)

Anyways, it's still unclear to me whether or not the dominator based approach solves other kinds of problems.

Phase Ordering

On the downside, the optimization doesn't have a huge impact on runtime, although it does predictably saved some code size. I stuck it in the optimization sequence after Flatten and (the third round of) LocalFlatten, since it seems to me that we could have cases where some components of a tuple used as an argument are common, but the whole tuple isn't. I think it makes sense to add it after IntroduceLoops and LoopInvariant (even though CommonArg get some things that LoopInvariant gets, it doesn't get all of them). I also think that it makes sense to add it before CommonSubexp, since identifying variables could expose more common subexpressions. I would think a similar thought applies to RedundantTests.


Last edited on 2007-08-15 22:05:26 by MatthewFluet. mlton-20100608/doc/guide/CommonBlock0000644000076600000240000000704611404435634015562 0ustar mtfstaff CommonBlock - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CommonBlock
Home  Index  
CommonBlock is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

It eliminates equivalent blocks in a SSA function. The equivalence criteria requires blocks to have no arguments or statements and transfer via Raise, Return, or Goto of a single global variable.

Implementation

[WWW]common-block.sig [WWW]common-block.fun

Details and Notes

  • Rewrites

     L_X ()
       raise (global_Y)
    
    to
     L_X ()
       L_Y' ()
    
    and adds
     L_Y' ()
       raise (global_Y)
    
    to the SSA function.

  • Rewrites

     L_X ()
       return (global_Y)
    
    to
     L_X ()
       L_Y' ()
    
    and adds
     L_Y' ()
       return (global_Y)
    
    to the SSA function.

  • Rewrites

     L_X ()
       L_Z (global_Y)
    
    to
     L_X ()
       L_Y' ()
    
    and adds
     L_Y' ()
       L_Z (global_Y)
    
    to the SSA function.

The Shrink pass rewrites all uses of L_X to L_Y' and drops L_X.

For example, all uncaught Overflow exceptions in a SSA function share the same raising block.


Last edited on 2006-11-02 17:56:13 by MatthewFluet. mlton-20100608/doc/guide/CommonSubexp0000644000076600000240000000672111404435634015775 0ustar mtfstaff CommonSubexp - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CommonSubexp
Home  Index  
CommonSubexp is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

It eliminates instances of common subexpressions.

Implementation

[WWW]common-subexp.sig [WWW]common-subexp.fun

Details and Notes

In addition to getting the usual sorts of things like

  •  (w + 0wx1) + (w + 0wx1)
    
    rewritten to
     let val w' = w + 0wx1 in w' + w' end
    

it also gets things like

  •  val a = Array_array n
     val b = Array_length a
    
    rewritten to
     val a = Array_array n
     val b = n
    

Arith transfers are handled specially. The result of an Arith transfer can be used in common Arith transfers that it dominates:

  •   val l = (n + m) + (n + m)
    
      val k = (l + n) + ((l + m) handle Overflow => ((l + m) 
                                 handle Overflow => l + n)) 
    
    is rewritten so that (n + m) is computed exactly once, as are (l + n) and (l + m).


Last edited on 2007-08-23 03:59:21 by MatthewFluet. mlton-20100608/doc/guide/CompilationManager0000644000076600000240000001651111404435634017125 0ustar mtfstaff CompilationManager - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CompilationManager
Home  Index  
The [WWW]Compilation Manager (CM) is SML/NJ's mechanism for supporting programming-in-the-very-large. To aid in porting code from SML/NJ and in developing code simultaneously with MLton and SML/NJ, MLton supports a very limited subset of CM files. From MLton's point of view, a CM file foo.cm defines a list of SML source files. The call
mlton foo.cm
is equivalent to compiling an SML program consisting of the concatenation of these files. As always with MLton, the concatenation must be the whole program you wish to compile.

In its simplest form, a CM file contains the keywords Group is followed by an explicit list of sml files. For example, if foo.cm contains

Group is
bar.sig
bar.fun
main.sml
then a call mlton foo.cm is equivalent to concatenating the three files together and calling MLton on that SML file. The list of files defined by a CM file is the same as the order in which the filenames appear in the CM file. Thus, to MLton, order in a CM file matters. In the above example, if main.sml refers to a structure defined in bar.fun, then main.sml must appear after bar.fun in the file list.

CM files can also refer to other CM files. A reference to bar.cm from within foo.cm means to include all of the SML files defined by bar.cm before any of the subsequent files in foo.cm. For example if foo.cm contains

Group is
bar.cm
main.sml
and bar.cm contains
Group is
bar.sig
bar.fun
then a call to mlton foo.cm is equivalent to compiling the concatenation of bar.sig, bar.fun, and main.sml.

CM also has a preprocessor mechanism that allows files to be conditionally included. This can be useful when developing code with SML/NJ and MLton. In SML/NJ, the preprocessor defines the symbol SMLNJ_VERSION. In MLton, no symbols are defined. So, to conditionally include foo.sml when compiling under SML/NJ, one can use the following pattern.

# if (defined(SMLNJ_VERSION))
foo.sml
# endif
To conditionally include foo.sml when compiling under MLton, one can negate the test.
# if (! defined(SMLNJ_VERSION))
foo.sml
# endif

The filenames listed in a CM file can be either absolute paths or relative paths, in which case they are interpreted relative to the directory containing the CM file. If a CM file refers either directly or indirectly to an SML source file in more than one way, only the first occurrence of the file is included. Finally, the only valid file suffixes in a CM file are .cm, .fun, .sig, and .sml.

Comparison with CM

If you are unfamiliar with CM under SML/NJ, then you can skip this section.

MLton supports the full syntax of CM as of SML/NJ version 110.9.1. Extensions since then are unsupported. Also, many of the syntactic constructs are ignored. The most important difference between the two is that order in CM files matters to MLton but not to SML/NJ, which performs automatic dependency analysis. Also, CM supports export filters, which restricts the visibility of modules. MLton ignores export filters. As a consequence, it is possible that a program that is accepted by SML/NJ's CM might not be accepted by MLton's CM. In this case, you will have to manually reorder the files and possibly rename modules so that the concatenation of the files is the program you intend.

CM performs cutoff recompilation to avoid recompiling the entire program, while MLton always compiles the entire program. CM makes a distinction between groups and libraries, which MLton does not. CM supports other tools like lex and yacc, while MLton does not. MLton relies on traditional makefiles to use other tools.

Porting SML/NJ CM files to MLton

If you have already created large projects using SML/NJ and CM, there may be a large number of file dependencies implicit in your sources that are not reflected in your CM files. Because MLton relies on ordering in CM files, your CM files probably will not work with MLton. To help in porting CM files to MLton, the MLton distribution includes the sources for a utility, cmcat, that will print an ordered list of files corresponding to a CM file. See util/cmcat/cmcat.sml for details. Building cmcat requires that you have already installed a recent version of SML/NJ.

Alternatively, you can convert your CM files to .mlb files. The MLton distribution includes the sources for a utility, cm2mlb, that will print an ML Basis file with essentially the same semantics as the CM file -- handling the full syntax of CM supported by your installed SML/NJ version and correctly handling export filters. When cm2mlb encounters a .cm import, it attempts to convert it to a corresponding .mlb import. CM anchored paths are translated to paths according to a default configuration file (cm2mlb-map). For example, the default configuration includes

$basis.cm/basis.cm  $(SML_LIB)/basis/basis.mlb
to ensure that a $/basis.cm import is translated to a $(SML_LIB)/basis/basis.mlb import. See util/cm2mlb for details. Building cm2mlb requires that you have already installed a recent version of SML/NJ.


Last edited on 2005-11-30 23:40:40 by StephenWeeks. mlton-20100608/doc/guide/CompilerOverview0000644000076600000240000001526711404435634016664 0ustar mtfstaff CompilerOverview - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CompilerOverview
Home  Index  
The following table shows the overall structure of the compiler. IntermediateLanguages are shown in the center column. The names of compiler passes are listed in the left and right columns.

The Compile functor ([WWW]compile.sig,[WWW]compile.fun), controls the high-level view of the compiler passes, from FrontEnd to code generation.


Last edited on 2006-11-02 17:44:37 by MatthewFluet. mlton-20100608/doc/guide/CompilerPassTemplate0000644000076600000240000000651311404435635017453 0ustar mtfstaff CompilerPassTemplate - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CompilerPassTemplate
Home  Index  
An analysis pass for the ZZZ IntermediateLanguage, invoked from ZZZOtherPass. An implementation pass for the ZZZ IntermediateLanguage, invoked from ZZZSimplify. An optimization pass for the ZZZ IntermediateLanguage, invoked from ZZZSimplify. A rewrite pass for the ZZZ IntermediateLanguage, invoked from ZZZOtherPass. A translation pass from the ZZA IntermediateLanguage to the ZZB IntermediateLanguage.

Description

A short description of the pass.

Implementation

[WWW]ZZZ.sig [WWW]ZZZ.fun

Details and Notes

Relevant details and notes.


Last edited on 2006-11-02 17:39:45 by MatthewFluet. mlton-20100608/doc/guide/CompileTimeOptions0000644000076600000240000003243211404435634017137 0ustar mtfstaff CompileTimeOptions - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CompileTimeOptions
Home  Index  
MLton's compile-time options control the name of the output file, the verbosity of compile-time messages, and whether or not certain optimizations are performed. They also can specify which intermediate files are saved and can stop the compilation process early, at some intermediate pass, in which case compilation can be resumed by passing the generated files to MLton. MLton uses the input file suffix to determine the type of input program. The possibilities are .c, .mlb, .o, .s, and .sml.

With no arguments, MLton prints the version number and exits. For a usage message, run MLton with an invalid switch, e.g. mlton -z. In the explanation below and in the usage message, for flags that take a number of choices (e.g. {true|false}), the first value listed is the default.

Options

  • -align {4|8}
    Aligns object sizes and doubles in memory by the specified alignment. The default varies depending on architecture.

  • -as-opt option
    Pass option to gcc when assembling.

  • -cc-opt option
    Pass option to gcc when compiling C code.

  • -codegen {native|x86|amd64|c}
    Generate native code or C code. With -codegen native (-codegen x86 or -codegen amd64), MLton typically compiles more quickly and generates better code.

  • -const 'name value'
    Set the value of a compile-time constant. Here is a list of available constants, their default values, and what they control.

    • Exn.keepHistory {false|true}
      Enable MLton.Exn.history. See MLtonExn for details. There is a performance cost to setting this to true, both in memory usage of exceptions and in run time, because of additional work that must be performed at each exception construction, raise, and handle.

  • -default-ann ann
    Specify default ML Basis annotations. For example, -default-ann 'warnUnused true' causes unused variable warnings to be enabled by default. A default is overridden by the corresponding annotation in an ML Basis file.

  • -default-type type
    Specify the default binding for a primitive type. For example, -default-type word64 causes the top-level type word and the top-level structure Word in the Basis Library to be equal to Word64.word and Word64:WORD, respectively. Similarly, -default-type intinf causes the top-level type int and the top-level structure Int in the Basis Library to be equal to IntInf.int and IntInf:INTEGER, respectively.

  • -disable-ann ann
    Ignore the specified ML Basis annotation in every ML Basis file. For example, to see all match and unused warnings, compile with

    -default-ann 'warnUnused true'
    -disable-ann forceUsed 
    -disable-ann nonexhaustiveMatch
    -disable-ann redundantMatch
    -disable-ann warnUnused
    

  • -export-header file
    Write C prototypes to file for all of the functions in the program exported from SML to C.

  • -ieee-fp {false|true}
    Cause the native code generator to be pedantic about following the IEEE floating point standard. By default, it is not, because of the performance cost. This only has an effect with -codegen x86.

  • -inline n
    Set the inlining threshold used in the optimizer. The threshold is an approximate measure of code size of a procedure. The default is 320.

  • -keep {g|o}
    Save intermediate files. If no -keep argument is given, then only the output file is saved.

    g generated .c and .s files passed to gcc and the assembler
    o object (.o) files
  • -link-opt option
    Pass option to gcc when linking. You can use this to specify library search paths, e.g. -link-opt -Lpath, and libraries to link with, e.g. -link-opt -lfoo, or even both at the same time, e.g. -link-opt '-Lpath -lfoo'. If you wish to pass an option to the linker, you must use gcc's -Wl, syntax, e.g., -link-opt '-Wl,--export-dynamic'.

  • -mlb-path-map file
    Use file as an ML Basis path map to define additional MLB path variables. Multiple uses of -mlb-path-map and -mlb-path-var are allowed, with variable definitions in later path maps taking precedence over earlier ones.

  • -mlb-path-var 'name value'
    Define an additional MLB path variable. Multiple uses of -mlb-path-map and -mlb-path-var are allowed, with variable definitions in later path maps taking precedence over earlier ones.

  • -output file
    Specify the name of the final output file. The default name is the input file name with its suffix removed and an appropriate, possibly empty, suffix added.

  • -profile {no|alloc|count|time}
    Produce an executable that gathers Profiling data. When such an executable is run, it produces an mlmon.out file.

  • -profile-branch {false|true}
    If true, the profiler will separately gather profiling data for each branch of a function definition, case expression, and if expression.

  • -profile-stack {false|true}
    If true, the executable will gather profiling data for all functions on the stack, not just the currently executing function. See ProfilingTheStack.

  • -profile-val {false|true}
    If true, the profiler will separately gather profiling data for each (expansive) val declaration.

  • -runtime arg
    Pass argument to the runtime system via @MLton. See RunTimeOptions. The argument will be processed before other @MLton command line switches. Multiple uses of -runtime are allowed, and will pass all the arguments in order. If the same runtime switch occurs more than once, then the last setting will take effect. There is no need to supply the leading @MLton or the trailing --; these will be supplied automatically.

    An argument to -runtime may contain spaces, which will cause the argument to be treated as a sequence of words by the runtime. For example the command line:

    mlton -runtime 'ram-slop 0.4' foo.sml

    will cause foo to run as if it had been called like:

    foo @MLton ram-slop 0.4 --

    An executable created with -runtime stop doesn't process any @MLton arguments. This is useful to create an executable, e.g. echo, that must treat @MLton like any other command-line argument.

    % mlton -runtime stop echo.sml
    % echo @MLton --
    @MLton --
  • -show-basis file
    Pretty print to file the basis defined by the input program. See ShowBasis.

  • -show-def-use file
    Output def-use information to file. Each identifier that is defined appears on a line, followed on subsequent lines by the position of each use.

  • -stop {f|g|o|tc}
    Specify when to stop.

    f list of files on stdout (only makes sense when input is foo.mlb)
    g generated .c and .s files
    o object (.o) files
    tc after type checking

    If you compile with -stop g or -stop o, you can resume compilation by running MLton on the generated .c and .s or .o files.

  • -target {self|...}
    Generate an executable that runs on the specified platform. The default is self, which means to compile for the machine that MLton is running on. To use any other target, you must first install a cross compiler.

  • -target-as-opt target option
    Like -as-opt, this passes option to gcc when assembling, except it only passes option when the target architecture or operating system is target. Valid values for target are: amd64, hppa, powerpc, sparc, x86, cygwin, darwin, freebsd, hpux, linux, mingw, netbsd, openbsd, solaris.

  • -target-cc-opt target option
    Like -cc-opt, this passes option to gcc when compiling C code, except it only passes option when the target architecture or operating system is target. Valid values for target are as for -target-as-opt.

  • -target-link-opt target option
    Like -link-opt, this passes option to gcc when linking, except it only passes option when the target architecture or operating system is target. Valid values for target are as for -target-as-opt.

  • -verbose {0|1|2|3}
    How verbose to be about what passes are running. The default is 0.

    0 silent
    1 calls to compiler, assembler, and linker
    2 1, plus intermediate compiler passes
    3 2, plus some data structure sizes


Last edited on 2010-04-06 17:50:15 by MatthewFluet. mlton-20100608/doc/guide/CompilingWithSMLNJ0000644000076600000240000000746511404435635016746 0ustar mtfstaff CompilingWithSMLNJ - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CompilingWithSMLNJ
Home  Index  
You can compile MLton with SML/NJ, however the resulting compiler will run much more slowly than MLton compiled by itself. We don't recommend using SML/NJ as a means of porting MLton to a new platform or bootstrapping on a new platform.

If you do want to build MLton with SML/NJ, it is best to have a binary MLton package installed. If you don't, here are some issues you may encounter when you run make nj-mlton.

You will get (many copies of) the error message:

/bin/sh: mlton: not found

The Makefile calls mlton to determine dependencies, and can proceed in spite of this error.

If you don't have a mlton executable, you will get the error message:

Error: cannot upgrade basis because the compiler doesn't work

We use upgrade-basis.sml to work around basis library differences, allowing a version of MLton written for a newer basis library to be compiled by an older version of MLton. The file isn't necessary when building with SML/NJ, but is listed in $(SOURCES), so the Makefile is attempting to build it. Building upgrade-basis.sml requires the old version of MLton to be around so that the right stubs can be built.

To work around this problem, do one of the following.

  • Manually tweak sources to remove $(UP) until you're finished building MLton with SML/NJ and have a working MLton.

  • Build upgrade-basis.sml on some other machine with a working MLton and copy it over.

If you don't have an mllex executable, you will get the error message:

mllex: Command not found

Building MLton requires mllex and mlyacc executables, which are distributed with a binary package of MLton. The easiest solution is to copy the front-end lexer/parser files from a different machine (ml.grm.sml, ml.grm.sig, ml.lex.sml, mlb.grm.sig, mlb.grm.sml).


Last edited on 2006-10-19 17:06:01 by StephenWeeks. mlton-20100608/doc/guide/ConcurrentML0000644000076600000240000001104211404435635015722 0ustar mtfstaff ConcurrentML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ConcurrentML
Home  Index  
[WWW]Concurrent ML is an SML concurrency library based on synchronous message passing. MLton has an initial port of CML from SML/NJ, but is missing a thread-safe wrapper around the Basis Library and event-based equivalents to IO and OS functions.

All of the core CML functionality is present.

structure CML: CML
structure SyncVar: SYNC_VAR
structure Mailbox: MAILBOX
structure Multicast: MULTICAST
structure SimpleRPC: SIMPLE_RPC
structure RunCML: RUN_CML

The RUN_CML signature is minimal.

signature RUN_CML =
   sig
      val isRunning: unit -> bool
      val doit: (unit -> unit) * Time.time option -> OS.Process.status
      val shutdown: OS.Process.status -> 'a
   end
MLton's RunCML structure does not include all of the cleanup and logging operations of SML/NJ's RunCML structure. However, the implementation does include the CML.timeOutEvt and CML.atTimeEvt functions, and a preemptive scheduler that knows to sleep when there are no ready threads and some threads blocked on time events.

Because MLton does not wrap the Basis Library for CML, the "right" way to call a Basis Library function that is stateful is to wrap the call with MLton.Thread.atomically.

Usage

  • You can import the CML Library into an MLB file with:

    MLB file Description
    $(SML_LIB)/cml/cml.mlb
  • If you are porting a project from SML/NJ's CompilationManager to MLton's ML Basis system using cm2mlb, note that the following map is included by default:

    $cml/cml.cm  $(SML_LIB)/cml/cml.mlb
    
    This will automatically convert a $cml/cml.cm import in an input .cm file into a $(SML_LIB)/cml/cml.mlb import in the output .mlb file.

Also see


Last edited on 2007-08-23 17:24:44 by MatthewFluet. mlton-20100608/doc/guide/ConcurrentMLImplementation0000644000076600000240000004033511404435635020637 0ustar mtfstaff ConcurrentMLImplementation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ConcurrentMLImplementation
Home  Index  
Here are some notes on MLton's implementation of ConcurrentML.

Concurrent ML was originally implemented for SML/NJ. It was ported to MLton in the summer of 2004. The main difference between the implementations is that SML/NJ uses continuations to implement CML threads, while MLton uses its underlying thread package. Presently, MLton's threads are a little more heavyweight than SML/NJ's continuations, but it's pretty clear that there is some fat there that could be trimmed.

The implementation of CML in SML/NJ is built upon the first-class continuations of the SMLofNJ.Cont module.

type 'a cont
val callcc: ('a cont -> 'a) -> 'a
val isolate: ('a -> unit) -> 'a cont
val throw: 'a cont -> 'a -> 'b

The implementation of CML in MLton is built upon the first-class threads of the MLtonThread module.

type 'a t
val new: ('a -> unit) -> 'a t
val prepare: 'a t * 'a -> Runnable.t
val switch: ('a t -> Runnable.t) -> 'a

The port is relatively straightforward, because CML always throws to a continuation at most once. Hence, an "abstract" implementation of CML could be built upon first-class one-shot continuations, which map equally well to SML/NJ's continuations and MLton's threads.

The "essence" of the port is to transform:

callcc (fn k => ... throw k' v')
to
switch (fn t => ... prepare (t', v'))
which suffices for the vast majority of the CML implementation.

There was only one complicated transformation: blocking multiple base events. In SML/NJ CML, the representation of base events is given by:

datatype 'a event_status
  = ENABLED of {prio: int, doFn: unit -> 'a}
  | BLOCKED of {
        transId: trans_id ref, 
        cleanUp: unit -> unit, 
        next: unit -> unit
      } -> 'a
type 'a base_evt = unit -> 'a event_status

When synchronizing on a set of base events, which are all blocked, we must invoke each BLOCKED function with the same transId and cleanUp (the transId is (checked and) set to CANCEL by the cleanUp function, which is invoked by the first enabled event; this "fizzles" every other event in the synchronization group that later becomes enabled). However, each BLOCKED function is implemented by a callcc, so that when the event is enabled, it throws back to the point of synchronization. Hence, the next function (which doesn't return) is invoked by the BLOCKED function to escape the callcc and continue in the thread performing the synchronization. In SML/NJ this is implemented as follows:

fun ext ([], blockFns) = callcc (fn k => let
      val throw = throw k
      val (transId, setFlg) = mkFlg()
      fun log [] = S.atomicDispatch ()
        | log (blockFn:: r) =
            throw (blockFn {
                transId = transId,
                cleanUp = setFlg,
                next = fn () => log r
              })
      in
        log blockFns; error "[log]"
      end)
(Note that S.atomicDispatch invokes the continuation of the next continuation on the ready queue.) This doesn't map well to the MLton thread model. Although it follows the
callcc (fn k => ... throw k v)
model, the fact that blockFn will also attempt to do
callcc (fn k' => ... next ())
means that the naive transformation will result in nested switch-es.

We need to think a little more about what this code is trying to do. Essentially, each blockFn wants to capture this continuation, hold on to it until the event is enabled, and continue with next; when the event is enabled, before invoking the continuation and returning to the synchronization point, the cleanUp and other event specific operations are performed.

To accomplish the same effect in the MLton thread implementation, we have the following:

datatype 'a status =
   ENABLED of {prio: int, doitFn: unit -> 'a}
 | BLOCKED of {transId: trans_id,
               cleanUp: unit -> unit,
               next: unit -> rdy_thread} -> 'a

type 'a base = unit -> 'a status 

fun ext ([], blockFns): 'a =
     S.atomicSwitch
     (fn (t: 'a S.thread) =>
      let
         val (transId, cleanUp) = TransID.mkFlg ()
         fun log blockFns: S.rdy_thread =
            case blockFns of
               [] => S.next ()
             | blockFn::blockFns =>
                  (S.prep o S.new)
                  (fn _ => fn () =>
                   let 
                      val () = S.atomicBegin ()
                      val x = blockFn {transId = transId,
                                       cleanUp = cleanUp,
                                       next = fn () => log blockFns}
                   in S.switch(fn _ => S.prepVal (t, x))
                   end)
      in
         log blockFns
      end)

To avoid the nested switch-es, I run the blockFn in it's own thread, whose only purpose is to return to the synchronization point. This corresponds to the throw (blockFn {...}) in the SML/NJ implementation. I'm worried that this implementation might be a little expensive, starting a new thread for each blocked event (when there are only multiple blocked events in a synchronization group). But, I don't see another way of implementing this behavior in the MLton thread model.

Note that another way of thinking about what is going on is to consider each blockFn as prepending a different set of actions to the thread t. It might be possible to give a MLton.Thread.unsafePrepend.

fun unsafePrepend (T r: 'a t, f: 'b -> 'a): 'b t =
   let
      val t =
         case !r of
            Dead => raise Fail "prepend to a Dead thread"
          | New g => New (g o f)
          | Paused (g, t) => Paused (fn h => g (f o h), t)
   in (* r := Dead; *)
      T (ref t)
   end

I have commented out the r := Dead, which would allow multiple prepends to the same thread (i.e., not destroying the original thread in the process). Of course, only one of the threads could be run: if the original thread were in the Paused state, then multiple threads would share the underlying runtime/primitive thread. Now, this matches the "one-shot" nature of CML continuations/threads, but I'm not comfortable with extending MLton.Thread with such an unsafe operation.

Other than this complication with blocking multiple base events, the port was quite routine. (As a very pleasant surprise, the CML implementation in SML/NJ doesn't use any SML/NJ-isms.) There is a slight difference in the way in which critical sections are handled in SML/NJ and MLton; since MLton.Thread.switch _always_ leaves a critical section, it is sometimes necessary to add additional atomicBegin/Ends to ensure that we remain in a critical section after a thread switch.

While looking at virtually every file in the core CML implementation, I took the liberty of simplifying things where it seemed possible; in terms of style, the implementation is about half-way between Reppy's original and MLton's.

Some changes of note:

  • util/ contains all pertinent data-structures: (functional and imperative) queues, (functional) priority queues. Hence, it should be easier to switch in more efficient or real-time implementations.

  • core-cml/scheduler.sml: in both implementations, this is where most of the interesting action takes place. I've made the connection between MLton.Thread.ts and ThreadId.thread_ids more abstract than it is in the SML/NJ implementation, and encapsulated all of the MLton.Thread operations in this module.

  • eliminated all of the "by hand" inlining

Future Extensions

The CML documentation says the following:

CML.joinEvt: thread_id -> unit event

    joinEvt tid
      creates an event value for synchronizing on the termination of the thread with the ID tid. There are three ways that a thread may terminate: the function that was passed to spawn (or spawnc) may return; it may call the exit function, or it may have an uncaught exception. Note that joinEvt does not distinguish between these cases; it also does not become enabled if the named thread deadlocks (even if it is garbage collected).

I believe that the MLton.Finalizable might be able to relax that last restriction. Upon the creation of a 'a Scheduler.thread, we could attach a finalizer to the underlying 'a MLton.Thread.t that enables the joinEvt (in the associated ThreadID.thread_id) when the 'a MLton.Thread.t becomes unreachable.

I don't know why CML doesn't have

CML.kill: thread_id -> unit

which has a fairly simple implementation -- setting a kill flag in the thread_id and adjusting the scheduler to discard any killed threads that it takes off the ready queue. The fairness of the scheduler ensures that a killed thread will eventually be discarded. The semantics are little murky for blocked threads that are killed, though. For example, consider a thread blocked on SyncVar.mTake mv and a thread blocked on SyncVar.mGet mv. If the first thread is killed while blocked, and a third thread does SyncVar.mPut (mv, x), then we might expect that we'll enable the second thread, and never the first. But, when only the ready queue is able to discard killed threads, then the SyncVar.mPut could enable the first thread (putting it on the ready queue, from which it will be discarded) and leave the second thread blocked. We could solve this by adjusting the TransID.trans_id types and the "cleaner" functions to look for both canceled transactions and transactions on killed threads.

John Reppy says that MarlowEtAl01 and FlattFindler04 explain why CML.kill would be a bad idea.

Between CML.timeOutEvt and CML.kill, one could give an efficient solution to the recent comp.lang.ml post about terminating a function that doesn't complete in a given time.

  fun timeOut (f: unit -> 'a, t: Time.time): 'a option =
    let
       val iv = SyncVar.iVar ()
       val tid = CML.spawn (fn () => SyncVar.iPut (iv, f ()))
    in
       CML.select 
       [CML.wrap (CML.timeOutEvt t, fn () => (CML.kill tid; NONE)),
        CML.wrap (SyncVar.iGetEvt iv, fn x => SOME x)]
    end

Space Safety

There are some CML related posts on the MLton mailing list

that discuss concerns that SML/NJ's implementation is not space efficient, because multi-shot continuations can be held indefinitely on event queues. MLton is better off because of the one-shot nature -- when an event enables a thread, all other copies of the thread waiting in other event queues get turned into dead threads (of zero size).


Last edited on 2007-08-15 22:05:31 by MatthewFluet. mlton-20100608/doc/guide/ConstantPropagation0000644000076600000240000000527111404435635017353 0ustar mtfstaff ConstantPropagation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ConstantPropagation
Home  Index  
ConstantPropagation is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This is whole-program constant propagation, even through data structures. It also performs globalization of (small) values computed once.

Uses Multi.

Implementation

[WWW]constant-propagation.sig [WWW]constant-propagation.fun

Details and Notes


Last edited on 2009-08-02 21:45:51 by MatthewFluet. mlton-20100608/doc/guide/Contact0000644000076600000240000001176611404435635014757 0ustar mtfstaff Contact - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Contact
Home  Index  

Mailing lists

There are two mailing lists available.

In addition to the pipermail archive at mlton.org, there are archives of both [WWW]MLton and [WWW]MLton-user that use [WWW]Lurker.

Mailing list policy

  • Both mailing lists are unmoderated. However, we use a whitelist to prevent spam. So, the first time you send to the list, your mail will be delayed until we add you to the whitelist.

  • Large messages (over 256K) should not be sent. Rather, please send an email containing the discussion text and a link to any large files. You may use our [WWW]TemporaryUpload page for uploading these files.

  • Very active MLton@mlton.org list members who might otherwise be expected to provide a fast response should send a message when they will be offline for more than a few days. The convention is to put "userid offline until date" in the subject line to make it easy to scan.

  • Discussions started on the mailing lists should stay on the mailing lists. Private replies may be bounced to the mailing list for the benefit of those following the discussion.

  • Discussions started on MLton-user@mlton.org may be migrated to MLton@mlton.org, particularly when the discussion shifts from how to use MLton to how to modify MLton (e.g., to fix a bug identified by the initial discussion).

IRC


Last edited on 2008-11-12 15:40:32 by MatthewFluet. mlton-20100608/doc/guide/Contify0000644000076600000240000000572511404435635014775 0ustar mtfstaff Contify - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Contify
Home  Index  
Contify is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

Contification is a compiler optimization that turns a function that always returns to the same place into a continuation. This exposes control-flow information that is required by many optimizations, including traditional loop optimizations.

Implementation

[WWW]contify.sig [WWW]contify.fun

Details and Notes

See Contification Using Dominators. The intermediate language described in that paper has since evolved to the SSA IntermediateLanguage; hence, the complication described in Section 6.1 is no longer relevant.


Last edited on 2006-11-02 17:35:17 by MatthewFluet. mlton-20100608/doc/guide/CoreML0000644000076600000240000000543511404435634014500 0ustar mtfstaff CoreML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CoreML
Home  Index  
Core ML is an IntermediateLanguage, translated from AST by Elaborate, optimized by CoreMLSimplify, and translated by Defunctorize to XML.

Description

CoreML is polymorphic, higher-order, and has nested patterns.

Implementation

[WWW]core-ml.sig [WWW]core-ml.fun

Type Checking

The CoreML IntermediateLanguage has no independent type checker.

Details and Notes


Last edited on 2006-11-02 17:56:39 by MatthewFluet. mlton-20100608/doc/guide/CoreMLSimplify0000644000076600000240000000421511404435634016210 0ustar mtfstaff CoreMLSimplify - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CoreMLSimplify
Home  Index  
The single optimization pass for the CoreML IntermediateLanguage is controlled by the Compile functor ([WWW]compile.fun).

The following optimization pass is implemented:


Last edited on 2006-11-02 17:56:03 by MatthewFluet. mlton-20100608/doc/guide/CreatingPages0000644000076600000240000000451711404435634016073 0ustar mtfstaff CreatingPages - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CreatingPages
Home  Index  
To create a page on this WebSite, edit an existing page, and add the name of the new page, like FooBar, to the page contents. When you view the new version of the existing page, a link will have been automatically created, and if you click on it, you will be given the option to create the new page.

You can also go directly to a new page by entering the page name as a URL into your browser, like http://mlton.org/FooBar.

You can also type in the page name here to go directly to that page.


Last edited on 2005-12-01 03:02:19 by StephenWeeks. mlton-20100608/doc/guide/Credits0000644000076600000240000002200211404435634014741 0ustar mtfstaff Credits - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Credits
Home  Index  
MLton was designed and implemented by HenryCejtin, MatthewFluet, SureshJagannathan, and StephenWeeks.
  • HenryCejtin wrote the IntInf implementation, the original profiler, the original man pages, the .spec files for the RPMs, and lots of little hacks to speed stuff up.

  • MatthewFluet implemented the X86 and AMD64 native code generators, ported mlprof to work with the native code generator, did a lot of work on the SSA optimizer, both adding new optimizations and improving or porting existing optimizations, updated the Basis Library implementation, ported ConcurrentML and ML-NLFFI to MLton, implemented the ML Basis system, and ported MLton to 64-bit platforms.

  • SureshJagannathan implemented some early inlining and uncurrying optimizations.

  • StephenWeeks implemented most of the original version of MLton, and continues to keep his fingers in most every part.

Many people have helped us over the years. Here is an alphabetical list.

  • JesperLouisAndersen sent several patches to improve the runtime on FreeBSD and ported MLton to run on NetBSD and OpenBSD.

  • JohnnyAndersen implemented BinIO, modified MLton so it could cross compile to MinGW, and provided useful discussion about cross-compilation.

  • Alain Deutsch and [WWW]PolySpace Technologies provided many bug fixes and runtime system improvements, code to help the Sparc/Solaris port, and funded a number of improvements to MLton.

  • Martin Elsman provided helpful discussions in the development of the ML Basis system.

  • Brent Fulgham ported MLton most of the way to MinGW.

  • AdamGoode provided the script to build the PDF MLton Guide.

  • Simon Helsen provided bug reports, suggestions, and helpful discussions.

  • Joe Hurd provided useful discussion and feedback on source-level profiling.

  • VesaKarvonen contributed esml-mode.el and esml-mlb-mode.el (see Emacs), contributed patches for improving match warnings, contributed esml-du-mlton.el and extended def-use output to include types of variable definitions (see EmacsDefUseMode), and improved constant folding of floating-point operations.

  • Richard Kelsey provided helpful discussions.

  • Ville Laurikari ported MLton to IA64/HPUX, HPPA/HPUX, PowerPC/AIX, PowerPC64/AIX.

  • Geoffrey Mainland helped with FreeBSD packaging.

  • Eric McCorkle ported MLton to Intel Mac.

  • TomMurphy wrote the original version of MLton.Syslog as part of his mlftpd project, and has sent many useful bug reports and suggestions.

  • Michael Neumann helped to patch the runtime to compile under FreeBSD.

  • Barak Pearlmutter built the original [WWW]Debian package for MLton, and helped us to take over the process.

  • Filip Pizlo ported MLton to (PowerPC) Darwin.

  • John Reppy assisted in porting MLton to Intel Mac.

  • Sam Rushing ported MLton to FreeBSD.

  • Jeffrey Mark Siskind provided helpful discussions and inspiration with his Stalin Scheme compiler.

  • WesleyTerpstra added support for MLton.Process.create, made a number of contributions to the ForeignFunctionInterface, contributed a number of other runtime system patches, and added support for compiling to a C library.

  • Luke Ziarek assisted in porting MLton to (PowerPC) Darwin.

We have also benefited from other software development tools and used code from other sources.

  • MLton was developed using Standard ML of New Jersey and the Compilation Manager (CM)

  • MLton's lexer (mlton/frontend/ml.lex), parser (mlton/frontend/ml.grm), and precedence-parser (mlton/elaborate/precedence-parse.fun) are modified versions of code from SML/NJ.

  • The MLton Basis Library implementation of conversions between binary and decimal representations of reals uses David Gay's [WWW]gdtoa library.

  • The MLton Basis Library implementation uses modified versions of portions of the the SML/NJ Basis Library implementation modules OS.IO, Posix.IO, Process, and Unix.

  • The MLton Basis Library implementation uses modified versions of portions of the ML Kit Version 4.1.4 Basis Library implementation modules Path, Time, and Date.

  • Many of the benchmarks come from the SML/NJ benchmark suite.

  • Many of the regression tests come from the ML Kit Version 4.1.4 distribution, which borrowed them from the [WWW]Moscow ML distribution.

  • MLton uses the [WWW]GNU multiprecision library for its implementation of IntInf.

  • MLton's implementation of mllex, mlyacc, the ckit Library, the MLRISC Library, the SML/NJ Library, Concurrent ML, mlnlffigen and ML-NLFFI are modified versions of code from SML/NJ.


Last edited on 2010-04-07 17:33:02 by MatthewFluet. mlton-20100608/doc/guide/CrossCompiling0000644000076600000240000001060711404435634016307 0ustar mtfstaff CrossCompiling - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION CrossCompiling
Home  Index  
MLton's -target flag directs MLton to cross compile an application for another platform. By default, MLton is only able to compile for the machine it is running on. In order to use MLton as a cross compiler, you need to do two things.
  1. Install the GCC cross-compiler tools on the host so that GCC can compile to the target.

  2. Cross compile the MLton runtime system to build the runtime libraries for the target.

To make the terminology clear, we refer to the host as the machine MLton is running on and the target as the machine that MLton is compiling for.

To build a GCC cross-compiler toolset on the host, you can use the script bin/build-cross-gcc, available in the MLton sources, as a template. The value of the target variable in that script is important, since that is what you will pass to MLton's -target flag. Once you have the toolset built, you should be able to test it by cross compiling a simple hello world program on your host machine.

% gcc -b i386-pc-cygwin -o hello-world hello-world.c
You should now be able to run hello-world on the target machine, in this case, a Cygwin machine.

Next, you must cross compile the MLton runtime system and inform MLton of the availability of the new target. The script bin/add-cross from the MLton sources will help you do this. Please read the comments at the top of the script. Here is a sample run adding a Solaris cross compiler.

% add-cross sparc-sun-solaris sun blade
Making runtime.
Building print-constants executable.
Running print-constants on blade.
Running add-cross uses ssh to compile the runtime on the target machine and to create print-constants, which prints out all of the constants that MLton needs in order to implement the Basis Library. The script runs print-constants on the target machine (blade in this case), and saves the output.

Once you have done all this, you should be able to cross compile SML applications. For example,

mlton -target i386-pc-cygwin hello-world.sml
will create hello-world, which you should be able to run from a Cygwin shell on your Windows machine.

Cross-compiling alternatives

Building and maintaining cross-compiling gcc's is complex. You may find it simpler to use mlton -keep g to generate the files on the host, then copy the files to the target, and then use gcc or mlton on the target to compile the files.


Last edited on 2005-12-02 04:19:16 by StephenWeeks. mlton-20100608/doc/guide/DeadCode0000644000076600000240000000671111404435634015005 0ustar mtfstaff DeadCode - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION DeadCode
Home  Index  
Dead-code elimination is an optimization pass for the CoreML IntermediateLanguage, invoked from CoreMLSimplify.

Description

This pass eliminates declarations from the Basis Library not needed by the user program.

Implementation

[WWW]dead-code.sig [WWW]dead-code.fun

Details and Notes

In order to compile small programs rapidly, a pass of dead code elimination is run in order to eliminate as much of the Basis Library as possible. The dead code elimination algorithm used is not safe in general, and only works because the Basis Library implementation has special properties:

  • it terminates

  • it performs no I/O

The dead code elimination includes the minimal set of declarations from the Basis Library so that there are no free variables in the user program (or remaining Basis Library implementation). It has a special hack to include all bindings of the form:

 val _ = ...

There is an ML Basis annotation, deadCode true, that governs which code is subject to this unsafe dead-code elimination.


Last edited on 2006-11-02 17:56:56 by MatthewFluet. mlton-20100608/doc/guide/DeepFlatten0000644000076600000240000001006711404435635015550 0ustar mtfstaff DeepFlatten - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION DeepFlatten
Home  Index  
Deep flatten is an optimization pass for the SSA2 IntermediateLanguage, invoked from SSA2Simplify.

Description

This pass flattens into mutable fields of objects and into vectors.

For example, an (int * int) ref is represented by a 2 word object, and an (int * int) array contains pairs of ints, rather than pointers to pairs of ints.

Implementation

[WWW]deep-flatten.sig [WWW]deep-flatten.fun

Details and Notes

There are some performance issues with the deep flatten pass, where it consumes an excessive amount of memory.

A number of applications require compilation with -drop-pass deepFlatten to avoid exceeding available memory. It is often asked whether the deep flatten pass usually has a significant impact on performance. The standard benchmark suite was run with and without the deep flatten pass enabled when the pass was first introduced:

The conclusion is that it does not have a significant impact. However, these are micro benchmarks; other applications may derive greater benefit from the pass.


Last edited on 2010-06-01 17:13:13 by MatthewFluet. mlton-20100608/doc/guide/DefineTypeBeforeUse0000644000076600000240000001065411404435634017212 0ustar mtfstaff DefineTypeBeforeUse - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION DefineTypeBeforeUse
Home  Index  
Standard ML requires types to be defined before they are used. Because of type inference, the use of a type can be implicit; hence, this requirement is more subtle than it might appear. For example, the following program is not type correct, because the type of r is t option ref, but t is defined after r.
val r = ref NONE
datatype t = A | B
val () = r := SOME A

MLton reports the following error, indicating that the type defined on line 2 is used on line 1.

Error: z.sml 1.1.
  Type escapes the scope of its definition at z.sml 2.10.
    type: t
    in: val r = ref NONE

While the above example is benign, the following example shows how to cast an integer to a function by (implicitly) using a type before it is defined. In the example, the ref cell r is of type t option ref, where t is defined after r, as a parameter to functor F. This example causes PolyML 4.1.3 to seg fault.

val r = ref NONE
functor F (type t
           val x: t) =
   struct
      val () = r := SOME x
      fun get () = valOf (!r)
   end
structure S1 = F (type t = unit -> unit
                  val x = fn () => ())
structure S2 = F (type t = int
                  val x = 13)
val () = S1.get () ()

MLton reports the following error.

Warning: z.sml 1.1.
  Unable to locally determine type of variable: r.
    type: ??? option ref
    in: val r = ref NONE
Error: z.sml 1.1.
  Type escapes the scope of its definition at z.sml 2.17.
    type: t
    in: val r = ref NONE


Last edited on 2005-12-01 03:38:39 by StephenWeeks. mlton-20100608/doc/guide/DefinitionOfStandardML0000644000076600000240000000453211404435635017644 0ustar mtfstaff DefinitionOfStandardML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION DefinitionOfStandardML
Home  Index  
The Definition of Standard ML (Revised) is a terse and formal specification of Standard ML's syntax and semantics. The language specified by this book is often referred to as SML 97.

There is an older version of the definition, published in 1990, which has an accompanying commentary that introduces and explains the notation and approach. The same notation is used in the SML 97 definition, so it is worth purchasing the older definition and commentary if you intend a close study of the definition.


Last edited on 2004-12-28 19:55:24 by StephenWeeks. mlton-20100608/doc/guide/Defunctorize0000644000076600000240000001337111404435634016016 0ustar mtfstaff Defunctorize - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Defunctorize
Home  Index  
Defunctorize is a translation pass from the CoreML IntermediateLanguage to the XML IntermediateLanguage.

Description

This pass converts a CoreML program to an XML program by performing:

  • linearization

  • MatchCompile

  • polymorphic val dec expansion

  • datatype lifting (to the top-level)

Implementation

[WWW]defunctorize.sig [WWW]defunctorize.fun

Details and Notes

This pass is grossly misnamed and does not perform defunctorization.

Datatype Lifting

This pass moves all datatype declarations to the top level.

Standard ML datatype declarations can contain type variables that are not bound in the declaration itself. For example, the following program is valid.

fun 'a f (x: 'a) =
   let
      datatype 'b t = T of 'a * 'b
      val y: int t = T (x, 1)
   in 
      13
   end

Unfortunately, the datatype declaration can not be immediately moved to the top level, because that would leave 'a free.

datatype 'b t = T of 'a * 'b
fun 'a f (x: 'a) =
   let 
      val y: int t = T (x, 1)
   in 
      13
   end
In order to safely move datatypes, this pass must close them, as well as add any free type variables as extra arguments to the type constructor. For example, the above program would be translated to the following.
datatype ('a, 'b) t = T of 'a * 'b
fun 'a f (x: 'a) = 
   let 
      val y: ('a * int) t = T (x, 1)
   in 
      13
   end

Historical Notes

The Defunctorize pass originally eliminated Standard ML functors by duplicating their body at each application. These duties have been adopted by the Elaborate pass.


Last edited on 2009-12-18 11:24:10 by MatthewFluet. mlton-20100608/doc/guide/Developers0000644000076600000240000000617511404435634015471 0ustar mtfstaff Developers - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Developers
Home  Index  
Here is a picture of the MLton team at a meeting in Chicago in August 2003. From left to right we have:

StephenWeeks MatthewFluet HenryCejtin SureshJagannathan

team.jpg

Also see the Credits for a list of specific contributions.

Developers list

A number of people read the developers mailing list, [MAILTO]MLton@mlton.org, and make contributions there. Here's a list of those who have a page here.


Last edited on 2007-08-23 04:24:19 by MatthewFluet. mlton-20100608/doc/guide/Development0000644000076600000240000000544411404435635015642 0ustar mtfstaff Development - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Development
Home  Index  
This page is the central point for MLton development.

Notes


Last edited on 2007-11-22 15:12:01 by MatthewFluet. mlton-20100608/doc/guide/Documentation0000644000076600000240000001026511404435635016166 0ustar mtfstaff Documentation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Documentation
Home  Index  


Last edited on 2007-07-08 22:59:04 by MatthewFluet. mlton-20100608/doc/guide/Drawbacks0000644000076600000240000000513611404435635015257 0ustar mtfstaff Drawbacks - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Drawbacks
Home  Index  
MLton has several drawbacks due to its use of whole-program compilation.
  • Large compile-time memory requirement.

    • Because MLton performs whole-program analysis and optimization, compilation requires a large amount of memory. For example, compiling MLton (over 140K lines) requires at least 512M RAM.
  • Long compile times.

    • Whole-program compilation can take a long time. For example, compiling MLton (over 140K lines) on a 1.6GHz machine takes five to ten minutes.
  • No interactive top level.

    • Because of whole-program compilation, MLton does not provide an interactive top level. In particular, it does not implement the optional Basis Library function use.


Last edited on 2005-12-02 04:19:39 by StephenWeeks. mlton-20100608/doc/guide/Eclipse0000644000076600000240000000443411404435634014741 0ustar mtfstaff Eclipse - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Eclipse
Home  Index  
[WWW]Eclipse is an open, extensible IDE.

[WWW]ML-Dev is a plug-in for Eclipse, based on SML/NJ.

There has been some talk on the MLton mailing list about adding support to Eclipse for MLton/SML, and in particular, using http://eclipsefp.sourceforge.net/. We are unaware of any progress along those lines.


Last edited on 2006-02-09 19:33:33 by StephenWeeks. mlton-20100608/doc/guide/EditingPages0000644000076600000240000000533011404435634015714 0ustar mtfstaff EditingPages - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION EditingPages
Home  Index  
You can help maintain this WebSite and improve a page's contents by using the "Edit" link found at the bottom of that page. Pages are written using MoinMoin's [WWW]wiki markup language. You can practice editing in the [WWW]WikiSandBox.

Before you begin editing, you must [WWW]create a user account. When you do so, please also create a home page (like StephenWeeks) so we know who you are. See our AccessControl policy for who is allowed to edit what.

By contributing to this web site, you agree to dedicate your contribution to the public domain. For more details, please see our License.


Last edited on 2005-12-01 20:16:41 by StephenWeeks. mlton-20100608/doc/guide/Elaborate0000644000076600000240000003365311404435634015260 0ustar mtfstaff Elaborate - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Elaborate
Home  Index  
Elaborate is a translation pass from the AST IntermediateLanguage to the CoreML IntermediateLanguage.

Description

This pass performs type inference and type checking according to the Definition. It also defunctorizes the program, eliminating all module-level constructs.

Implementation

[WWW]elaborate.sig [WWW]elaborate.fun
[WWW]elaborate-env.sig [WWW]elaborate-env.fun
[WWW]elaborate-modules.sig [WWW]elaborate-modules.fun
[WWW]elaborate-core.sig [WWW]elaborate-core.fun
[WWW]elaborate

Details and Notes

At the modules level, the Elaborate pass:

  • elaborates signatures with interfaces (see [WWW]interface.sig and [WWW]interface.fun).

    • The main trick is to use disjoint sets to efficiently handle sharing of tycons and of structures and then to copy signatures as dags rather than as trees.
  • checks functors at the point of definition, using functor summaries to speed up checking of functor applications.

    • When a functor is first type checked, we keep track of the dummy argument structure and the dummy result structure, as well as all the tycons that were created while elaborating the body. Then, if we later need to type check an application of the functor (as opposed to defunctorize an application), we pair up tycons in the dummy argument structure with the actual argument structure and then replace the dummy tycons with the actual tycons in the dummy result structure, yielding the actual result structure. We also generate new tycons for all the tycons that we created while originally elaborating the body.
  • handles opaque signature constraints.

    • This is implemented by building a dummy structure realized from the signature, just as we would for a functor argument when type checking a functor. The dummy structure contains exactly the type information that is in the signature, which is what opacity requires. We then replace the variables (and constructors) in the dummy structure with the corresponding variables (and constructors) from the actual structure so that the translation to CoreML uses the right stuff. For each tycon in the dummy structure, we keep track of the corresponding type structure in the actual structure. This is used when producing the CoreML types (see expandOpaque in [WWW]type-env.sig and [WWW]type-env.fun).

Then, within each structure or functor body, for each declaration (<dec> in the Standard ML grammar), the Elaborate pass does three steps:

  1. ScopeInference

  2. Overloaded {constant, function, record pattern} resolution

Defunctorization

The Elaborate pass performs a number of duties historically assigned to the Defunctorize pass.

As part of the Elaborate pass, all module level constructs (open, signature, structure, functor, long identifiers) are removed. This works because the Elaborate pass assigns a unique name to every type and variable in the program. This also allows the Elaborate pass to eliminate local declarations, which are purely for namespace management.

Examples

Here are a number of examples of elaboration.
  • All variables bound in val declarations are renamed.

    val x = 13
    val y = x
    
    val x_0 = 13 
    val y_0 = x_0
    

  • All variables in fun declarations are renamed.

    fun f x = g x
    and g y = f y
    
    fun f_0 x_0 = g_0 x_0
    and g_0 y_0 = f_0 y_0
    

  • Type abbreviations are removed, and the abbreviation is expanded wherever it is used.

    type 'a u = int * 'a
    type 'b t = 'b u * real
    fun f (x : bool t) = x
    
    fun f_0 (x_0 : (int * bool) * real) = x_0
    

  • Exception declarations create a new constructor and rename the type.

    type t = int
    exception E of t * real
    
    exception E_0 of int * real
    

  • The type and value constructors in datatype declarations are renamed.

    datatype t = A of int | B of real * t
    
    datatype t_0 = A_0 of int | B_0 of real * t_0
    

  • Local declarations are moved to the top-level. The environment keeps track of the variables in scope.

    val x = 13
    local val x = 14
    in val y = x
    end
    val z = x
    
    val x_0 = 13
    val x_1 = 14
    val y_0 = x_1
    val z_0 = x_0
    

  • Structure declarations are eliminated, with all declarations moved to the top level. Long identifiers are renamed.

    structure S =
       struct
          type t = int
          val x : t = 13
       end
    val y : S.t = S.x
    
    val x_0 : int = 13
    val y_0 : int = x_0
    

  • Open declarations are eliminated.

    val x = 13
    val y = 14
    structure S =
       struct
         val x = 15
       end
    open S
    val z = x + y
    
    val x_0 = 13
    val y_0 = 14
    val x_1 = 15
    val z_0 = x_1 + y_0
    

  • Functor declarations are eliminated, and the body of a functor is duplicated wherever the functor is applied.

    functor F(val x : int) =
       struct
         val y = x
       end
    structure F1 = F(val x = 13)
    structure F2 = F(val x = 14)
    val z = F1.y + F2.y
    
    val x_0 = 13
    val y_0 = x_0
    val x_1 = 14
    val y_1 = x_1
    val z_0 = y_0 + y_1
    

  • Signature constraints are eliminated. Note that signatures do affect how subsequent variables are renamed.

    val y = 13
    structure S : sig
                     val x : int
                  end =
       struct
          val x = 14
          val y = x
       end
    open S
    val z = x + y
    
    val y_0 = 13
    val x_0 = 14
    val y_1 = x_0
    val z_0 = x_0 + y_0
    


Last edited on 2007-08-15 22:05:40 by MatthewFluet. mlton-20100608/doc/guide/Emacs0000644000076600000240000001326211404435635014405 0ustar mtfstaff Emacs - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Emacs
Home  Index  

SML Modes

There are a few Emacs modes for SML.

MLB modes

There is a mode for editing ML Basis files.

Definitions and uses

There is a mode that supports the precise def-use information that MLton can output. It highlights definitions and uses and provides commands for navigation (e.g. jump-to-def, jump-to-next, list-all-refs). It can be handy, for example, for navigating in the MLton compiler source code. See EmacsDefUseMode for further information.

Building on the background

Tired of manually starting/stopping/restarting builds after editing files? Now you don't have to. See EmacsBgBuildMode for further information.

Error messages

MLton's error messages are not in the format that the Emacs next-error parser natively understands. There are a couple of ways to fix this. The easiest way is to add the following to your .emacs to cause Emacs to recognize MLton's error messages.

    (require 'compile)
    (add-to-list 'compilation-error-regexp-alist
                 '("^Error: \\([^\t\n]*\\) \\([0-9]+\\)\\.\\([0-9]+\\)\\.$"
                   1 2 3))
    

Alternatively, you could use a sed script to rewrite MLton's errors. Here is one such script:

    sed -e 's/^\([W|E].*\): \([^ ]*\) \([0-9][0-9]*\)\.\([0-9][0-9]*\)\./\2:\3:\1:\4/'
    


Last edited on 2008-08-16 18:45:47 by VesaKarvonen. mlton-20100608/doc/guide/EmacsBgBuildMode0000644000076600000240000002202011404435634016432 0ustar mtfstaff EmacsBgBuildMode - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION EmacsBgBuildMode
Home  Index  
Do you really want to think about starting a build of you project? What if you had a personal slave that would restart a build of your project whenever you save any file belonging to that project? The bg-build mode does just that. Just save the file, a compile is started (silently!), you can continue working without even thinking about starting a build, and if there are errors, you are notified (with a message), and can then jump to errors.

This mode is not specific to MLton per se, but is particularly useful for working with MLton due to the longer compile times. By the time you start wondering about possible errors, the build is already on the way.

Functionality and Features

  • Each time a file is saved, and after a user configurable delay period has been exhausted, a build is started silently in the background.

  • When the build is finished, a status indicator (message) is displayed non-intrusively.

  • At any time, you can switch to a build process buffer where all the messages from the build are shown.

  • After a build has finished, you can jump to locations of warnings and errors from the build process buffer or by using the first-error and next-error commands.

  • When a build fails, bg-build mode can optionally execute a user specified command. By default, bg-build mode executes first-error.

  • When starting a build of a particular project, a possible previous live build of the same project is interrupted first.

  • A project configuration file specifies the commands required to build a project.

  • Multiple projects can be loaded into bg-build mode and bg-build mode can build a given maximum number of projects concurrently.

  • Supports both [WWW]Gnu Emacs and [WWW]XEmacs.

Download

There is no package for the mode at the moment. To install the mode you need to fetch the Emacs lisp, *.el, files from the MLton repository: [WWW]emacs.

Setup

The easiest way to load the mode is to first tell Emacs where to find the files. For example, add

    (add-to-list 'load-path (file-truename "path-to-the-el-files"))
    

to your ~/.emacs or ~/.xemacs/init.el. You'll probably also want to start the mode automatically by adding

    (require 'bg-build-mode)
    (bg-build-mode)
    

to your Emacs init file. Once the mode is activated, you should see the BGB indicator on the mode line.

MLton and Compilation-Mode

At the time of writing, neither Gnu Emacs nor XEmacs contain an error regexp that would match MLton's messages.

If you use Gnu Emacs, insert the following code into your .emacs file:

    (require 'compile)
    (add-to-list
     'compilation-error-regexp-alist
     '("^\\(Warning\\|Error\\): \\(.+\\) \\([0-9]+\\)\\.\\([0-9]+\\)\\.$"
       2 3 4))
    

If you use XEmacs, insert the following code into your init.el file:

    (require 'compile)
    (add-to-list
     'compilation-error-regexp-alist-alist
     '(mlton
       ("^\\(Warning\\|Error\\): \\(.+\\) \\([0-9]+\\)\\.\\([0-9]+\\)\\.$"
        2 3 4)))
    (compilation-build-compilation-error-regexp-alist)
    

Usage

Typically projects are built (or compiled) using a tool like [WWW]make, but the details vary. The bg-build mode needs a project configuration file to know how to build your project. A project configuration file basically contains an Emacs Lisp expression calling a function named bg-build that returns a project object. A simple example of a project configuration file would be the ([WWW]Build.bgb) file used with smlbot:

    (bg-build
     :name  "SML-Bot"
     :shell "nice -n5 make all")
    

The bg-build function takes a number of keyword arguments:

  • :name specifies the name of the project. This can be any expression that evaluates to a string or to a nullary function that returns a string.

  • :shell specifies a shell command to execute. This can be any expression that evaluates to a string, a list of strings, or to a nullary function returning a list of strings.

  • :build? specifies a predicate to determine whether the project should be built after some files have been modified. The predicate is given a list of filenames and should return a non-nil value when the project should be built and nil otherwise.

All of the keyword arguments, except :shell, are optional and can be left out.

Note the use of the nice command above. It means that background build process is given a lower priority by the system process scheduler. Assuming your machine has enough memory, using nice ensures that your computer remains responsive. (You probably won't even notice when a build is started.)

Once you have written a project file for bg-build mode. Use the bg-build-add-project command to load the project file for bg-build mode. The bg-build mode can also optionally load recent project files automatically at startup.

After the project file has been loaded and bg-build mode activated, each time you save a file in Emacs, the bg-build mode tries to build your project.

The bg-build-status command creates a buffer that displays some status information on builds and allows you to manage projects (start builds explicitly, remove a project from bg-build, ...) as well as visit buffers created by bg-build. Notice the count of started builds. At the end of the day it can be in the hundreds or thousands. Imagine the number of times you've been relieved of starting a build explicitly!


Last edited on 2007-07-07 04:01:31 by VesaKarvonen. mlton-20100608/doc/guide/EmacsDefUseMode0000644000076600000240000001643011404435634016305 0ustar mtfstaff EmacsDefUseMode - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION EmacsDefUseMode
Home  Index  
MLton provides an option, -show-def-use file, to output precise (giving exact source locations) and accurate (including all uses and no false data) whole-program def-use information to a file. Unlike typical tags facilities, the information includes local variables and distinguishes between different definitions even when they have the same name. The def-use Emacs mode uses the information to provide navigation support, which can be particularly useful while reading SML programs compiled with MLton (such as the MLton compiler itself).

Screen Capture

Note the highlighting and the type displayed in the minibuffer.

def-use-capture.png

Features

  • Highlights definitions and uses. Different colors for definitions, unused definitions, and uses.

  • Shows types (with highlighting) of variable definitions in the minibuffer.

  • Navigation: jump-to-def, jump-to-next, and jump-to-prev. These work precisely (no searching involved).

  • Can list, visit and mark all references to a definition (within a program).

  • Automatically reloads updated def-use files.

  • Automatically loads previously used def-use files at startup.

  • Supports both [WWW]Gnu Emacs and [WWW]XEmacs.

Download

There is no separate package for the def-use mode although the mode has been relatively stable for some time already. To install the mode you need to get the Emacs lisp, *.el, files from MLton's repository: [WWW]emacs. The easiest way to get the files is to use Subversion to access MLton's sources. If you only want the Emacs lisp files, you can use the following command:

svn co svn://mlton.org/mlton/trunk/ide/emacs mlton-emacs-ide

Setup

The easiest way to load def-use mode is to first tell Emacs where to find the files. For example, add

(add-to-list 'load-path (file-truename "path-to-the-el-files"))
to your ~/.emacs or ~/.xemacs/init.el. You'll probably also want to start def-use-mode automatically by adding
(require 'esml-du-mlton)
(def-use-mode)
to your Emacs init file. Once the def-use mode is activated, you should see the DU indicator on the mode line.

Usage

To use def-use mode one typically first sets up the program's makefile or build script so that the def-use information is saved each time the program is compiled. In addition to the -show-def-use file option, the -prefer-abs-paths true expert option is required. Note that the time it takes to save the information is small (compared to type-checking), so it is recommended to simply add the options to the MLton invocation that compiles the program. However, it is only necessary to type check the program (or library), so one can specify the -stop tc option. For example, suppose you have a program defined by an MLB file named my-prg.mlb, you can save the def-use information to the file my-prg.du by invoking MLton as:

mlton -prefer-abs-paths true -show-def-use my-prg.du -stop tc my-prg.mlb

Finally, one needs to tell the mode where to find the def-use information. This is done with the esml-du-mlton command. For example, to load the my-prg.du file, one would type:

M-x esml-du-mlton my-prg.du

After doing all of the above, find an SML file covered by the previously saved and loaded def-use information, and place the cursor at some variable (definition or use, it doesn't matter). You should see the variable being highlighted. (Note that specifications in signatures do not define variables.)

You might also want to setup and use the Bg-Build mode to start builds automatically.

Types

-show-def-use output was extended to include types of variable definitions in revision [WWW]6333. To get good type names, the types must be in scope at the end of the program. If you are using the ML Basis system, this means that the root MLB-file for your application should not wrap the libraries used in the application inside local ... in, because that would remove them from the scope before the end of the program.


Last edited on 2009-04-08 07:48:56 by VesaKarvonen. mlton-20100608/doc/guide/Enscript0000644000076600000240000002344211404435634015144 0ustar mtfstaff Enscript - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Enscript
Home  Index  
[WWW]GNU Enscript converts ASCII files to PostScript, HTML, and other output languages, applying language sensitive highlighting (similar to Emacs's font lock mode). Here are a few states files for highlighting Standard ML.
  • [WWW]sml_simple.st -- Provides highlighting of keywords, string and character constants, and (nested) comments.

    (* Comments (* can be nested *) *)
    structure S = struct
      val x = (1, 2, "three")
    end
    

  • [WWW]sml_verbose.st -- Supersedes the above, adding highlighting of numeric constants. Due to the limited parsing available, numeric record labels are highlighted as numeric constants, in all contexts. Likewise, a binding precedence separated from infix or infixr by a newline is highlighted as a numeric constant and a numeric record label selector separated from # by a newline is highlighted as a numeric constant.

    structure S = struct
      (* These look good *)
      val x = (1, 2, "three")
      val z = #2 x
    
      (* Although these look bad (not all the numbers are constants),       *
       * they never occur in practice, as they are equivalent to the above. *)
      val x = {1 = 1, 3 = "three", 2 = 2}
      val z = #
                2 x
    end
    

  • [WWW]sml_fancy.st -- Supersedes the above, adding highlighting of type and constructor bindings, highlighting of explicit binding of type variables at val and fun declarations, and separate highlighting of core and modules level keywords. Due to the limited parsing available, it is assumed that the input is a syntactically correct, top-level declaration.

    structure S = struct
      val x = (1, 2, "three")
      datatype 'a t = T of 'a
           and u = U of v * v
      withtype v = {left: int t, right: int t}
      exception E1 of int and E2
      fun 'a id (x: 'a) : 'a = x
    
      (* Although this looks bad (the explicitly bound type variable 'a is *
       * not highlighted), it is unlikely to occur in practice.            *)
      val 
          'a id = fn (x : 'a) => x
    end
    

  • [WWW]sml_gaudy.st -- Supersedes the above, adding highlighting of type annotations, in both expressions and signatures. Due to the limited parsing available, it is assumed that the input is a syntactically correct, top-level declaration.

    signature S = sig
      type t
      val x : t
      val f : t * int -> int
    end
    structure S : S = struct
      datatype t = T of int
      val x : t = T 0
      fun f (T x, i : int) : int = x + y
      fun 'a id (x: 'a) : 'a = x
    end
    

Install and use

  • Version 1.6.3 of [WWW]GNU Enscript

    • Copy all files to /usr/share/enscript/hl/ or .enscript/ in your home directory.

    • Invoke enscript with --highlight=sml_simple (or --highlight=sml_verbose or --highlight=sml_fancy or --highlight=sml_gaudy).

  • Version 1.6.1 of [WWW]GNU Enscript

    • Append [WWW]sml_all.st to /usr/share/enscript/enscript.st

    • Invoke enscript with --pretty-print=sml_simple (or --pretty-print=sml_verbose or --pretty-print=sml_fancy or --pretty-print=sml_gaudy).

This WebSite uses sml_fancy to pretty-print Standard ML source code. Comments and suggestions should be directed to MatthewFluet.


Last edited on 2006-11-02 17:41:43 by MatthewFluet. mlton-20100608/doc/guide/EqualityType0000644000076600000240000000763611404435635016024 0ustar mtfstaff EqualityType - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION EqualityType
Home  Index  
An equality type is a type to which PolymorphicEquality can be applied. The Definition and the Basis Library precisely spell out which types are equality types.
  • bool, char, IntInf.int, Int<N>.int, string, and Word<N>.word are equality types.

  • for any t, both t array and t ref are equality types.

  • if t is an equality type, then t list, and t vector are equality types.

  • if t1, ..., tn are equality types, then t1 * ... * tn and {l1: t1, ..., ln: tn}  are equality types.

  • if t1, ..., tn are equality types and t AdmitsEquality, then (t1, ..., tn) t is an equality type.

To check that a type t is an equality type, use the following idiom.

structure S: sig eqtype t end =
   struct
      type t = ...
   end

Notably, exn and real are not equality types. Neither is t1 -> t2, for any t1 and t2.

Equality on arrays and ref cells is by identity, not structure. For example, ref 13 = ref 13 is false. On the other hand, equality for lists, strings, and vectors is by structure, not identity. For example, the following equalities hold.

[1, 2, 3] = 1 :: [2, 3]
"foo" = concat ["f", "o", "o"]
Vector.fromList [1, 2, 3] = Vector.tabulate (3, fn i => i + 1)


Last edited on 2007-08-15 22:05:47 by MatthewFluet. mlton-20100608/doc/guide/EqualityTypeVariable0000644000076600000240000002013111404435634017452 0ustar mtfstaff EqualityTypeVariable - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION EqualityTypeVariable
Home  Index  
An equality type variable is a type variable that starts with two or more primes, as in ''a or ''b. The canonical use of equality type variables is in specifying the type of the PolymorphicEquality function, which is ''a * ''a -> bool. Equality type variables ensure that polymorphic equality is only used on equality types, by requiring that at every use of a polymorphic value, equality type variables are instantiated by equality types.

For example, the following program is type correct because polymorphic equality is applied to variables of type ''a.

fun f (x: ''a, y: ''a): bool = x = y

On the other hand, the following program is not type correct, because polymorphic equality is applied to variables of type 'a, which is not an equality type.

fun f (x: 'a, y: 'a): bool = x = y

MLton reports the following error, indicating that polymorphic equality expects equality types, but didn't get them.

Error: z.sml 1.32.
  Function applied to incorrect argument.
    expects: [<equality>] * [<equality>]
    but got: [<non-equality>] * [<non-equality>]
    in: = (x, y)

As an example of using such a function that requires equality types, suppose that f has polymorphic type ''a -> unit. Then, f 13 is type correct because int is an equality type. On the other hand, f 13.0 and f (fn x => x) are not type correct, because real and arrow types are not equality types. We can test these facts with the following short programs. First, we verify that such an f can be applied to integers.

functor Ok (val f: ''a -> unit): sig end =
   struct
      val () = f 13
      val () = f 14
   end

We can do better, and verify that such an f can be applied to any integer.

functor Ok (val f: ''a -> unit): sig end =
   struct
      fun g (x: int) = f x
   end

Even better, we don't need to introduce a dummy function name; we can use a type constraint.

functor Ok (val f: ''a -> unit): sig end =
   struct
      val _ = f: int -> unit
   end

Even better, we can use a signature constraint.

functor Ok (S: sig val f: ''a -> unit end):
   sig val f: int -> unit end = S

This functor concisely verifies that a function of polymorphic type ''a -> unit can be safely used as a function of type int -> unit.

As above, we can verify that such an f can not be used at non equality types.

functor Bad (S: sig val f: ''a -> unit end):
   sig val f: real -> unit end = S

functor Bad (S: sig val f: ''a -> unit end):
   sig val f: ('a -> 'a) -> unit end = S

For each of these programs, MLton reports the following error.

Error: z.sml 2.4.
  Variable type in structure disagrees with signature.
    variable: f
    structure: [<equality>] -> _
    signature: [<non-equality>] -> _

Equality type variables in type and datatype declarations

Equality type variables can be used in type and datatype declarations; however they play no special role. For example,

type 'a t = 'a * int

is completely identical to

type ''a t = ''a * int

In particular, such a definition does not require that t only be applied to equality types.

Similarly,

datatype 'a t = A | B of 'a

is completely identical to

datatype ''a t = A | B of ''a


Last edited on 2005-12-01 04:00:38 by StephenWeeks. mlton-20100608/doc/guide/EtaExpansion0000644000076600000240000000507611404435634015756 0ustar mtfstaff EtaExpansion - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION EtaExpansion
Home  Index  
Eta expansion is a simple syntactic change used to work around the ValueRestriction in Standard ML.

The eta expansion of an expression e is the expression fn z => e z, where z does not occur in e. This only makes sense if e denotes a function, i.e. is of arrow type. Eta expansion delays the evaluation of e until the function is applied, and will re-evaluate e each time the function is applied.

The name "eta expansion" comes from the eta-conversion rule of the lambda calculus. Expansion refers to the directionality of the equivalence being used, namely taking e to fn z => e z rather than fn z => e z to e (eta contraction).


Last edited on 2006-03-28 00:57:50 by StephenWeeks. mlton-20100608/doc/guide/eXene0000644000076600000240000000412711404435634014420 0ustar mtfstaff eXene - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION eXene
Home  Index  
[WWW]eXene is a multi-threaded X Window System toolkit written in ConcurrentML.

There is a group at K-State working toward [WWW]eXene 2.0.


Last edited on 2005-12-01 04:04:43 by StephenWeeks. mlton-20100608/doc/guide/FAQ0000644000076600000240000001075111404435634013763 0ustar mtfstaff FAQ - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION FAQ
Home  Index  
Feel free to ask questions and to update answers by editing this page. Since we try to make as much information as possible available on the web site and we like to avoid duplication, many of the answers are simply links to a web page that answers the question.

How do you pronounce MLton?

Pronounce

What SML software has been ported to MLton?

Libraries

What graphical libraries are available for MLton?

Libraries

How does MLton's performance compare to other SML compilers and to other languages?

MLton has excellent performance.

Does MLton treat monomorphic arrays and vectors specially?

MLton implements monomorphic arrays and vectors (e.g. BoolArray, Word8Vector) exactly as instantiations of their polymorphic counterpart (e.g. bool array, Word8.word vector). Thus, there is no need to use the monomorphic versions except when required to interface with the Basis Library or for portability with other SML implementations.

Why do I get a Segfault/Bus error in a program that uses IntInf/LargeInt to calculate numbers with several hundred thousand digits?

GnuMP

How can I decrease compile-time memory usage?

  • Compile with -verbose 3 to find out if the problem is due to an SSA optimization pass. If so, compile with -drop-pass pass to skip that pass.

  • Compile with @MLton hash-cons 0.5 --, which will instruct the runtime to hash cons the heap every other GC.

  • Compile with -polyvariance false, which is an undocumented option that causes less code duplication.

Also, please Contact us to let us know the problem to help us better understand MLton's limitations.

How do I see what has changed recently in the wiki?

[WWW]RecentChanges

How portable is SML code across SML compilers?

StandardMLPortability


Last edited on 2005-12-02 01:19:12 by StephenWeeks. mlton-20100608/doc/guide/Features0000644000076600000240000002752011404435635015135 0ustar mtfstaff Features - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Features
Home  Index  
MLton has the following features.

Portability

Robustness

  • Supports the full SML 97 language as given in The Definition of Standard ML (Revised).
    If there is a program that is valid according to The Definition that is rejected by MLton, or a program that is invalid according to the Definition that is accepted by MLton, it is a bug. For a list of known bugs, see UnresolvedBugs.

  • A complete implementation of the Basis Library.
    MLton's implementation matches latest Basis Library specification, and includes a complete implementation of all the required modules, as well as many of the optional modules.

  • Generates standalone executables.
    No additional code or libraries are necessary in order to run an executable, except for the standard shared libraries. MLton can also generate statically linked executables.

  • Compiles large programs.
    MLton is sufficiently efficient and robust that it can compile large programs, including itself (over 140K lines). The distributed version of MLton was compiled by MLton.

  • Support for large amounts of memory (up to 4G on 32-bit systems; more on 64-bit systems).

  • Support for large array lengths (up to 231 - 1 on 32-bit systems; up to 263 - 1 on 64-bit systems).

  • Support for large files, using 64-bit file positions.

Performance

  • Executables have excellent running times.

  • Generates small executables.
    MLton takes advantage of whole-program compilation to perform very aggressive dead-code elimination, which often leads to smaller executables than with other SML compilers.

  • Untagged and unboxed native integers, reals, and words.
    In MLton, integers and words are 8 bits, 16 bits, 32 bits, and 64 bits and arithmetic does not have any overhead due to tagging or boxing. Also, reals (32-bit and 64-bit) are stored unboxed, avoiding any overhead due to boxing.

  • Unboxed native arrays.
    In MLton, an array (or vector) of integers, reals, or words uses the natural C-like representation. This is fast and supports easy exchange of data with C. Monomorphic arrays (and vectors) use the same C-like representations as their polymorphic counterparts.

  • Multiple garbage collection strategies.

  • Fast arbitrary precision arithmetic (IntInf) based on the GnuMP.
    For IntInf intensive programs, MLton can be an order of magnitude or more faster than Poly/ML or SML/NJ.

Tools

Extensions

  • A simple and fast C ForeignFunctionInterface that supports calling from SML to C and from C to SML.

  • The ML Basis system for programming in the very large, separate delivery of library sources, and more.

  • A number of extension libraries that provide useful functionality that cannot be implemented with the Basis Library. See below for an overview and MLtonStructure for details.

    • continuations
      MLton supports continuations via callcc and throw.

    • finalization
      MLton supports finalizable values of arbitrary type.

    • interval timers
      MLton supports the functionality of the C setitimer function.

    • random numbers
      MLton has functions similar to the C rand and srand functions, as well as support for access to /dev/random and /dev/urandom.

    • resource limits
      MLton has functions similar to the C getrlimit and setrlimit functions.

    • resource usage
      MLton supports a subset of the functionality of the C getrusage function.

    • signal handlers
      MLton supports signal handlers written in SML. Signal handlers run in a separate MLton thread, and have access to the thread that was interrupted by the signal. Signal handlers can be used in conjunction with threads to implement preemptive multitasking.

    • size primitive
      MLton includes a primitive that returns the size (in bytes) of any object. This can be useful in understanding the space behavior of a program.

    • system logging
      MLton has a complete interface to the C syslog function.

    • threads
      MLton has support for its own threads, upon which either preemptive or non-preemptive multitasking can be implemented. MLton also has support for Concurrent ML (CML).

    • weak pointers
      MLton supports weak pointers, which allow the garbage collector to reclaim objects that it would otherwise be forced to keep. Weak pointers are also used to provide finalization.

    • world save and restore
      MLton has a facility for saving the entire state of a computation to a file and restarting it later. This facility can be used for staging and for checkpointing computations. It can even be used from within signal handlers, allowing interrupt driven checkpointing.


Last edited on 2010-06-08 14:13:42 by MatthewFluet. mlton-20100608/doc/guide/FirstClassPolymorphism0000644000076600000240000001406111404435635020053 0ustar mtfstaff FirstClassPolymorphism - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION FirstClassPolymorphism
Home  Index  
First-class polymorphism is the ability to treat polymorphic functions just like other values: pass them as arguments, store them in data structures, etc. Although Standard ML does have polymorphic functions, it does not support first-class polymorphism.

For example, the following declares and uses the polymorphic function id.

val id = fn x => x
val _ = id 13
val _ = id "foo"

If SML supported first-class polymorphism, we could write the following.

fun useId id = (id 13; id "foo")

However, this does not type check. MLton reports the following error.

Error: z.sml 1.24.
  Function applied to incorrect argument.
    expects: [int]
    but got: [string]
    in: id "foo"

The error message arises because MLton infers from id 13 that id accepts an integer argument, but that id "foo" is passing a string. Using explicit types sheds some light on the problem.

fun useId (id: 'a -> 'a) = (id 13; id "foo")

On this, MLton reports the following errors.

Error: z.sml 1.29.
  Function applied to incorrect argument.
    expects: ['a]
    but got: [int]
    in: id 13
Error: z.sml 1.36.
  Function applied to incorrect argument.
    expects: ['a]
    but got: [string]
    in: id "foo"

The errors arise because the argument id is not polymorphic; rather, it is monomorphic, with type 'a -> 'a. It is perfectly valid to apply id to a value of type 'a, as in the following

fun useId (id: 'a -> 'a, x: 'a) = id x  (* type correct *)

So, what is the difference between the type specification on id in the following two declarations?

val id: 'a -> 'a = fn x => x
fun useId (id: 'a -> 'a) = (id 13; id "foo")

While the type specifications on id look identical, they mean different things. The difference can be made clearer by explicitly scoping the type variables.

val 'a id: 'a -> 'a = fn x => x
fun 'a useId (id: 'a -> 'a) = (id 13; id "foo")  (* type error *)

In val 'a id, the type variable scoping means that for any 'a, id has type 'a -> 'a. Hence, id can be applied to arguments of type int, real, etc. Similarly, in fun 'a useId, the scoping means that useId is a polymorphic function that for any 'a takes a function of type 'a -> 'a and does something. Thus, useId could be applied to a function of type int -> int, real -> real, etc.

One could imagine an extension of SML that allowed scoping of type variables at places other than fun or val declarations, as in the following.

fun useId (id: ('a).'a -> 'a) = (id 13; id "foo")  (* not SML *)

Such an extension would need to be thought through very carefully, as it could cause significant complications with TypeInference, possible even undecidability.


Last edited on 2005-12-01 04:14:09 by StephenWeeks. mlton-20100608/doc/guide/Fixpoints0000644000076600000240000003412211404435634015335 0ustar mtfstaff Fixpoints - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Fixpoints
Home  Index  
This page discusses a framework that makes it possible to compute fixpoints over arbitrary products of abstract types. The code is from an Extended Basis library ([WWW]README).

First the signature of the framework ([WWW]tie.sig):

(**
 * A framework for computing fixpoints.
 *
 * In a strict language you sometimes want to provide a fixpoint
 * combinator for an abstract type {t} to make it possible to write
 * recursive definitions.  Unfortunately, a single combinator {fix} of the
 * type {(t -> t) -> t} does not support mutual recursion.  To support
 * mutual recursion, you would need to provide a family of fixpoint
 * combinators having types of the form {(u -> u) -> u} where {u} is a
 * type of the form {t * ... * t}.  Unfortunately, even such a family of
 * fixpoint combinators does not support mutual recursion over different
 * abstract types.
 *)
signature TIE = sig
   include ETAEXP'
   type 'a t = 'a etaexp
   (** The type of fixpoint witnesses. *)

   val fix : 'a t -> 'a Fix.t
   (**
    * Produces a fixpoint combinator from the given witness.  For example,
    * one can make a mutually recursive definition of functions:
    *
    *> val isEven & isOdd =
    *>     let open Tie in fix (function *` function) end
    *>        (fn isEven & isOdd =>
    *>            (fn 0 => true
    *>              | 1 => false
    *>              | n => isOdd (n-1)) &
    *>            (fn 0 => false
    *>              | 1 => true
    *>              | n => isEven (n-1)))
    *)

   (** == Making New Witnesses == *)

   val pure : ('a * 'a UnOp.t) Thunk.t -> 'a t
   (**
    * {pure} is a more general version of {tier}.  It is mostly useful for
    * computing fixpoints in a non-imperative manner.
    *)

   val tier : ('a * 'a Effect.t) Thunk.t -> 'a t
   (**
    * {tier} is used to define fixpoint witnesses for new abstract types
    * by providing a thunk whose instantiation allocates a mutable proxy
    * and a procedure for updating it with the result.
    *)

   val id : 'a -> 'a t
   (** {id x} is equivalent to {pure (const (x, id))}. *)

   (** == Combining Existing Witnesses == *)

   val iso : 'b t -> ('a, 'b) Iso.t -> 'a t
   (**
    * Given an isomorphism between {'a} and {'b} and a witness for {'b},
    * produces a witness for {'a}.  This is useful when you have a new
    * type that is isomorphic to some old type for which you already have
    * a witness.
    *)

   val product : 'a t * ('a -> 'b t) -> ('a, 'b) Product.t t
   (**
    * Dependent product combinator.  Given a witness for {'a} and a
    * constructor from a {'a} to witness for {'b}, produces a witness for
    * the product {('a, 'b) Product.t}.  The constructor for {'b} should
    * not access the (proxy) value {'a} before it has been fixed.
    *)

   val *` : 'a t * 'b t -> ('a, 'b) Product.t t
   (** {a *` b} is equivalent to {product (a, const b)}. *)

   val tuple2 : 'a t * 'b t -> ('a * 'b) t
   (**
    * Given witnesses for {'a} and {'b} produces a witness for the product
    * {'a * 'b}.
    *)

   (** == Particular Witnesses == *)

   val function : ('a -> 'b) t
   (** Witness for functions. *)
end

fix is a type-indexed function. The type-index parameter to fix is called a "witness". To compute fixpoints over products, one uses the *` operator to combine witnesses. To provide a fixpoint combinator for an abstract type, one implements a witness providing a thunk whose instantiation allocates a fresh, mutable proxy and a procedure for updating the proxy with the solution. Naturally this means that not all possible ways of computing a fixpoint of a particular type are possible under the framework. The pure combinator is a generalization of tier. The iso combinator is provided for reusing existing witnesses.

Note that instead of using an infix operator, we could alternatively employ an interface using Fold. Also, witnesses are eta-expanded to work around the value restriction, while maintaining abstraction.

Here is the implementation ([WWW]tie.sml):

structure Tie :> TIE = struct
   open Product
   infix &
   type 'a etaexp_dom = Unit.t
   type 'a etaexp_cod = ('a * 'a UnOp.t) Thunk.t
   type 'a etaexp = 'a etaexp_dom -> 'a etaexp_cod
   type 'a t = 'a etaexp
   fun fix aT f = let val (a, ta) = aT () () in ta (f a) end
   val pure = Thunk.mk
   fun iso bT (iso as (_, b2a)) () () = let
      val (b, fB) = bT () ()
   in
      (b2a b, Fn.map iso fB)
   end
   fun product (aT, a2bT) () () = let
      val (a, fA) = aT () ()
      val (b, fB) = a2bT a () ()
   in
      (a & b, Product.map (fA, fB))
   end
   (* The rest are not primitive operations. *)
   fun op *` (aT, bT) = product (aT, Fn.const bT)
   fun tuple2 ab = iso (op *` ab) Product.isoTuple2
   fun tier th = pure ((fn (a, ua) => (a, Fn.const a o ua)) o th)
   fun id x = pure (Fn.const (x, Fn.id))
   fun function ? =
       pure (fn () => let
                   val r = ref (Basic.raising Fix.Fix)
                in
                   (fn x => !r x, fn f => (r := f ; f))
                end) ?
end

Let's then take a look at a couple of additional examples.

Here is a naive implementation of lazy promises:

structure Promise :> sig
   type 'a t
   val lazy : 'a Thunk.t -> 'a t
   val force : 'a t -> 'a
   val Y : 'a t Tie.t
end = struct
   datatype 'a t' =
      EXN of exn
    | THUNK of 'a Thunk.t
    | VALUE of 'a
   type 'a t = 'a t' Ref.t
   fun lazy f = ref (THUNK f)
   fun force t =
      case !t
       of EXN e   => raise e
        | THUNK f => (t := VALUE (f ()) handle e => t := EXN e ; force t)
        | VALUE v => v
   fun Y ? = Tie.tier (fn () => let
                             val r = lazy (raising Fix.Fix)
                          in
                             (r, r <\ op := o !)
                          end) ?
end

An example use of our naive lazy promises is to implement equally naive lazy streams:

structure Stream :> sig
   type 'a t
   val cons : 'a * 'a t -> 'a t
   val get : 'a t -> ('a * 'a t) Option.t
   val Y : 'a t Tie.t
end = struct
   datatype 'a t = IN of ('a * 'a t) Option.t Promise.t
   fun cons (x, xs) = IN (Promise.lazy (fn () => SOME (x, xs)))
   fun get (IN p) = Promise.force p
   fun Y ? = Tie.iso Promise.Y (fn IN p => p, IN) ?
end

Note that above we make use of the iso combinator. Here is a finite representation of an infinite stream of ones:

val ones = let
   open Tie Stream
in
   fix Y (fn ones => cons (1, ones))
end


Last edited on 2007-08-25 21:26:24 by VesaKarvonen. mlton-20100608/doc/guide/Flatten0000644000076600000240000000640211404435634014747 0ustar mtfstaff Flatten - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Flatten
Home  Index  
Flatten is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass flattens arguments to SSA constructors, blocks, and functions.

If a tuple is explicitly available at all uses of a function (resp. block), then:

  • The formals and call sites are changed so that the components of the tuple are passed.

  • The tuple is reconstructed at the beginning of the body of the function (resp. block).

Similarly, if a tuple is explicitly available at all uses of a constructor, then:

  • The constructor argument datatype is changed to flatten the tuple type.

  • The tuple is passed flat at each ConApp.

  • The tuple is reconstructed at each Case transfer target.

Implementation

[WWW]flatten.sig [WWW]flatten.fun

Details and Notes


Last edited on 2006-11-02 17:52:58 by MatthewFluet. mlton-20100608/doc/guide/Fold0000644000076600000240000013736411404435634014252 0ustar mtfstaff Fold - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Fold
Home  Index  
This page describes a technique that enables convenient syntax for a number of language features that are not explicitly supported by Standard ML, including: variable number of arguments, optional arguments and labeled arguments, array and vector literals, functional record update, and (seemingly) dependently typed functions like printf and scanf.

The key idea to fold is to define functions fold, step0, and $ such that the following equation holds.

fold (a, f) (step0 h1) (step0 h2) ... (step0 hn) $
= f (hn (... (h2 (h1 a))))

The name fold comes because this is like a traditional list fold, where a is the base element, and each step function, step0 hi, corresponds to one element of the list and does one step of the fold. The name $ is chosen to mean end of arguments from its common use in regular-expression syntax.

Unlike the usual list fold in which the same function is used to step over each element in the list, this fold allows the step functions to be different from each other, and even to be of different types. Also unlike the usual list fold, this fold includes a finishing function, f, that is applied to the result of the fold. The presence of the finishing function may seem odd because there is no analogy in list fold. However, the finishing function is essential; without it, there would be no way for the folder to perform an arbitrary computation after processing all the arguments. The examples below will make this clear.

The functions fold, step0, and $ are easy to define.

fun $ (a, f) = f a
fun id x = x
structure Fold =
   struct
      fun fold (a, f) g = g (a, f)
      fun step0 h (a, f) = fold (h a, f)
   end

We've placed fold and step0 in the Fold structure but left $ at the toplevel because it is convenient in code to always have $ in scope. We've also defined the identity function, id, at the toplevel since we use it so frequently.

Plugging in the definitions, it is easy to verify the equation from above.

fold (a, f) (step0 h1) (step0 h2) ... (step0 hn) $
= step0 h1 (a, f) (step0 h2) ... (step0 hn) $
= fold (h1 a, f) (step0 h2) ... (step0 hn) $
= step0 h2 (h1 a, f) ... (step0 hn) $
= fold (h2 (h1 a), f) ... (step0 hn) $
...
= fold (hn (... (h2 (h1 a))), f) $
= $ (hn (... (h2 (h1 a))), f)
= f (hn (... (h2 (h1 a))))

Example: variable number of arguments

The simplest example of fold is accepting a variable number of (curried) arguments. We'll define a function f and argument a such that all of the following expressions are valid.

f $
f a $
f a a $
f a a a $
f a a a ... a a a $ (* as many a's as we want *)

Off-hand it may appear impossible that all of the above expressions are type correct SML -- how can a function f accept a variable number of curried arguments? What could the type of f be? We'll have more to say later on how type checking works. For now, once we have supplied the definitions below, you can check that the expressions are type correct by feeding them to your favorite SML implementation.

It is simple to define f and a. We define f as a folder whose base element is () and whose finish function does nothing. We define a as the step function that does nothing. The only trickiness is that we must eta expand the definition of f and a to work around the ValueRestriction; we frequently use eta expansion for this purpose without mention.

val base = ()
fun finish () = ()
fun step () = ()
val f = fn z => Fold.fold (base, finish) z
val a = fn z => Fold.step0 step z

One can easily apply the fold equation to verify by hand that f applied to any number of a's evaluates to ().

f a ... a $
= finish (step (... (step base)))
= finish (step (... ()))
...
= finish ()
= ()

Example: variable-argument sum

Let's look at an example that computes something: a variable-argument function sum and a stepper a such that

sum (a i1) (a i2) ... (a im) $ = i1 + i2 + ... + im

The idea is simple -- the folder starts with a base accumulator of 0 and the stepper adds each element to the accumulator, s, which the folder simply returns at the end.

val sum = fn z => Fold.fold (0, fn s => s) z
fun a i = Fold.step0 (fn s => i + s)

Using the fold equation, one can verify the following.

sum (a 1) (a 2) (a 3) $ = 6

Step1

It is sometimes syntactically convenient to omit the parentheses around the steps in a fold. This is easily done by defining a new function, step1, as follows.

structure Fold =
   struct
      open Fold
      fun step1 h (a, f) b = fold (h (b, a), f)
   end

From the definition of step1, we have the following equivalence.

fold (a, f) (step1 h) b
= step1 h (a, f) b
= fold (h (b, a), f)

Using the above equivalence, we can compute the following equation for step1.

fold (a, f) (step1 h1) b1 (step1 h2) b2 ... (step1 hn) bn $
= fold (h1 (b1, a), f) (step1 h2) b2 ... (step1 hn) bn $
= fold (h2 (b2, h1 (b1, a)), f) ... (step1 hn) bn $
= fold (hn (bn, ... (h2 (b2, h1 (b1, a)))), f) $
= f (hn (bn, ... (h2 (b2, h1 (b1, a)))))

Here is an example using step1 to define a variable-argument product function, prod, with a convenient syntax.

val prod = fn z => Fold.fold (1, fn p => p) z
val ` = fn z => Fold.step1 (fn (i, p) => i * p) z

The functions prod and ` satisfy the following equation.

prod `i1 `i2 ... `im $ = i1 * i2 * ... * im

Note that in SML, `i1 is two different tokens, ` and i1. We often use ` for an instance of a step1 function because of its syntactic unobtrusiveness and because no space is required to separate it from an alphanumeric token.

Also note that there are no parenthesis around the steps. That is, the following expression is not the same as the above one (in fact, it is not type correct).

prod (`i1) (`i2) ... (`im) $

Example: list literals

SML already has a syntax for list literals, e.g. [w, x, y, z]. However, using fold, we can define our own syntax.

val list = fn z => Fold.fold ([], rev) z
val ` = fn z => Fold.step1 (op ::) z

The idea is that the folder starts out with the empty list, the steps accumulate the elements into a list, and then the finishing function reverses the list at the end.

With these definitions one can write a list like:

list `w `x `y `z $

While the example is not practically useful, it does demonstrate the need for the finishing function to be incorporated in fold. Without a finishing function, every use of list would need to be wrapped in rev, as follows.

rev (list `w `x `y `z $)

The finishing function allows us to incorporate the reversal into the definition of list, and to treat list as a truly variable argument function, performing an arbitrary computation after receiving all of its arguments.

See ArrayLiteral for a similar use of fold that provides a syntax for array and vector literals, which are not built in to SML.

Fold right

Just as fold is analogous to a fold left, in which the functions are applied to the accumulator left-to-right, we can define a variant of fold that is analogous to a fold right, in which the functions are applied to the accumulator right-to-left. That is, we can define functions foldr and step0 such that the following equation holds.

foldr (a, f) (step0 h1) (step0 h2) ... (step0 hn) $
= f (h1 (h2 (... (hn a))))

The implementation of fold right is easy, using fold. The idea is for the fold to start with f and for each step to precompose the next hi. Then, the finisher applies the composed function to the base value, a. Here is the code.

structure Foldr =
   struct
      fun foldr (a, f) = Fold.fold (f, fn g => g a)
      fun step0 h = Fold.step0 (fn g => g o h)
   end

Verifying the fold-right equation is straightforward, using the fold-left equation.

foldr (a, f) (Foldr.step0 h1) (Foldr.step0 h2) ... (Foldr.step0 hn) $
= fold (f, fn g => g a) 
    (Fold.step0 (fn g => g o h1))
    (Fold.step0 (fn g => g o h2))
    ...
    (Fold.step0 (fn g => g o hn)) $
= (fn g => g a)
  ((fn g => g o hn) (... ((fn g => g o h2) ((fn g => g o h1) f))))
= (fn g => g a)
  ((fn g => g o hn) (... ((fn g => g o h2) (f o h1))))
= (fn g => g a) ((fn g => g o hn) (... (f o h1 o h2)))
= (fn g => g a) (f o h1 o h2 o ... o hn)
= (f o h1 o h2 o ... o hn) a
= f (h1 (h2 (... (hn a))))

One can also define the fold-right analogue of step1.

structure Foldr =
   struct
      open Foldr
      fun step1 h = Fold.step1 (fn (b, g) => g o (fn a => h (b, a)))
   end

Example: list literals via fold right

Revisiting the list literal example from earlier, we can use fold right to define a syntax for list literals that doesn't do a reversal.

val list = fn z => Foldr.foldr ([], fn l => l) z
val ` = fn z => Foldr.step1 (op ::) z

As before, with these definitions, one can write a list like:

list `w `x `y `z $

The difference between the fold-left and fold-right approaches is that the fold-right approach does not have to reverse the list at the end, since it accumulates the elements in the correct order. In practice, MLton will simplify away all of the intermediate function composition, so the the fold-right approach will be more efficient.

Mixing steppers

All of the examples so far have used the same step function throughout a fold. This need not be the case. For example, consider the following.

val n = fn z => Fold.fold (0, fn i => i) z
val I = fn z => Fold.step0 (fn i => i * 2) z
val O = fn z => Fold.step0 (fn i => i * 2 + 1) z

Here we have one folder, n, that can be used with two different steppers, I and O. By using the fold equation, one can verify the following equations.

n O $ = 0
n I $ = 1
n I O $ = 2
n I O I $ = 5
n I I I O $ = 14

That is, we've defined a syntax for writing binary integer constants.

Not only can one use different instances of step0 in the same fold, one can also intermix uses of step0 and step1. For example, consider the following.

val n = fn z => Fold.fold (0, fn i => i) z
val O = fn z => Fold.step0 (fn i => n * 8) z
val ` = fn z => Fold.step1 (fn (i, n) => n * 8 + i) z

Using the straightforward generalization of the fold equation to mixed steppers, one can verify the following equations.

n 0 $ = 0
n `3 O $ = 24
n `1 O `7 $ = 71

That is, we've defined a syntax for writing octal integer constants, with a special syntax, O, for the zero digit (admittedly contrived, since one could just write `0 instead of O).

See NumericLiteral for a practical extension of this approach that supports numeric constants in any base and of any type.

(Seemingly) dependent types

A normal list fold always returns the same type no matter what elements are in the list or how long the list is. Variable-argument fold is more powerful, because the result type can vary based both on the arguments that are passed and on their number. This can provide the illusion of dependent types.

For example, consider the following.

val f = fn z => Fold.fold ((), id) z
val a = fn z => Fold.step0 (fn () => "hello") z
val b = fn z => Fold.step0 (fn () => 13) z
val c = fn z => Fold.step0 (fn () => (1, 2)) z

Using the fold equation, one can verify the following equations.

f a $ = "hello": string
f b $ = 13: int
f c $ = (1, 2): int * int

That is, f returns a value of a different type depending on whether it is applied to argument a, argument b, or argument c.

The following example shows how the type of a fold can depend on the number of arguments.

val grow = fn z => Fold.fold ([], fn l => l) z
val a = fn z => Fold.step0 (fn x => [x]) z

Using the fold equation, one can verify the following equations.

grow $ = []: 'a list
grow a $ = [[]]: 'a list list
grow a a $ = [[[]]]: 'a list list list

Clearly, the result type of a call to the variable argument grow function depends on the number of arguments that are passed.

As a reminder, this is well-typed SML. You can check it out in any implementation.

(Seemingly) dependently-typed functional results

Fold is especially useful when it returns a curried function whose arity depends on the number of arguments. For example, consider the following.

val makeSum = fn z => Fold.fold (id, fn f => f 0) z
val I = fn z => Fold.step0 (fn f => fn i => fn x => f (x + i)) z

The makeSum folder constructs a function whose arity depends on the number of I arguments and that adds together all of its arguments. For example, makeSum I $ is of type int -> int and makeSum I I $ is of type int -> int -> int.

One can use the fold equation to verify that the makeSum works correctly. For example, one can easily check by hand the following equations.

makeSum I $ 1 = 1
makeSum I I $ 1 2 = 3
makeSum I I I $ 1 2 3 = 6

Returning a function becomes especially interesting when there are steppers of different types. For example, the following makeSum folder constructs functions that sum integers and reals.

val makeSum = fn z => Foldr.foldr (id, fn f => f 0.0) z
val I = fn z => Foldr.step0 (fn f => fn x => fn i => f (x + real i)) z
val R = fn z => Foldr.step0 (fn f => fn x: real => fn r => f (x + r)) z

With these definitions, makeSum I R $ is of type int -> real -> real and makeSum R I I $ is of type real -> int -> int -> real. One can use the foldr equation to check the following equations.

makeSum I $ 1 = 1.0
makeSum I R $ 1 2.5 = 3.5
makeSum R I I $ 1.5 2 3 = 6.5

We used foldr instead of fold for this so that the order in which the specifiers I and R appear is the same as the order in which the arguments appear. Had we used fold, things would have been reversed.

An extension of this idea is sufficient to define Printf-like functions in SML.

An idiom for combining steps

It is sometimes useful to combine a number of steps together and name them as a single step. As a simple example, suppose that one often sees an integer follower by a real in the makeSum example above. One can define a new compound step IR as follows.

val IR = fn u => Fold.fold u I R

With this definition in place, one can verify the following.

makeSum IR IR $ 1 2.2 3 4.4 = 10.6

In general, one can combine steps s1, s2, ... sn as

fn u => Fold.fold u s1 s2 ... sn

The following calculation shows why a compound step behaves as the composition of its constituent steps.

fold u (fn u => fold u s1 s2 ... sn)
= (fn u => fold u s1 s2 ... sn) u
= fold u s1 s2 ... sn

Post composition

Suppose we already have a function defined via fold, w = fold (a, f), and we would like to construct a new fold function that is like w, but applies g to the result produced by w. This is similar to function composition, but we can't just do g o w, because we don't want to use g until w has been applied to all of its arguments and received the end-of-arguments terminator $.

More precisely, we want to define a post-composition function post that satisfies the following equation.

post (w, g) s1 ... sn $ = g (w s1 ... sn $)

Here is the definition of post.

structure Fold =
   struct
      open Fold
      fun post (w, g) s = w (fn (a, h) => s (a, g o h))
   end  

The following calculations show that post satisfies the desired equation, where w = fold (a, f).

post (w, g) s
= w (fn (a, h) => s (a, g o h))
= fold (a, f) (fn (a, h) => s (a, g o h))
= (fn (a, h) => s (a, g o h)) (a, f)
= s (a, g o f)
= fold (a, g o f) s

Now, suppose si = step0 hi for i from 1 to n.

post (w, g) s1 s2 ... sn $
= fold (a, g o f) s1 s2 ... sn $
= (g o f) (hn (... (h1 a)))
= g (f (hn (... (h1 a))))
= g (fold (a, f) s1 ... sn $)
= g (w s1 ... sn $)

For a practical example of post composition, see ArrayLiteral.

Lift

We now define a peculiar-looking function, lift0, that is, equationally speaking, equivalent to the identity function on a step function.

fun lift0 s (a, f) = fold (fold (a, id) s $, f)

Using the definitions, we can prove the following equation.

fold (a, f) (lift0 (step0 h)) = fold (a, f) (step0 h)

Here is the proof.

fold (a, f) (lift0 (step0 h))
= lift0 (step0 h) (a, f)
= fold (fold (a, id) (step0 h) $, f)
= fold (step0 h (a, id) $, f)
= fold (fold (h a, id) $, f)
= fold ($ (h a, id), f)
= fold (id (h a), f)
= fold (h a, f)
= step0 h (a, f)
= fold (a, f) (step0 h)

If lift0 is the identity, then why even define it? The answer lies in the typing of fold expressions, which we have, until now, left unexplained.

Typing

Perhaps the most surprising aspect of fold is that it can be checked by the SML type system. The types involved in fold expressions are complex; fortunately type inference is able to deduce them. Nevertheless, it is instructive to study the types of fold functions and steppers. More importantly, it is essential to understand the typing aspects of fold in order to write down signatures of functions defined using fold and step.

Here is the FOLD signature, and a recapitulation of the entire Fold structure, with additional type annotations.

signature FOLD =
   sig
      type ('a, 'b, 'c, 'd) step = 'a * ('b -> 'c) -> 'd
      type ('a, 'b, 'c, 'd) t = ('a, 'b, 'c, 'd) step -> 'd
      type ('a1, 'a2, 'b, 'c, 'd) step0 =
         ('a1, 'b, 'c, ('a2, 'b, 'c, 'd) t) step
      type ('a11, 'a12, 'a2, 'b, 'c, 'd) step1 =
         ('a12, 'b, 'c, 'a11 -> ('a2, 'b, 'c, 'd) t) step
         
      val fold: 'a * ('b -> 'c) -> ('a, 'b, 'c, 'd) t
      val lift0: ('a1, 'a2, 'a2, 'a2, 'a2) step0
                 -> ('a1, 'a2, 'b, 'c, 'd) step0
      val post: ('a, 'b, 'c1, 'd) t * ('c1 -> 'c2)
                -> ('a, 'b, 'c2, 'd) t
      val step0: ('a1 -> 'a2) -> ('a1, 'a2, 'b, 'c, 'd) step0
      val step1: ('a11 * 'a12 -> 'a2)
                 -> ('a11, 'a12, 'a2, 'b, 'c, 'd) step1
   end

structure Fold:> FOLD =
   struct
      type ('a, 'b, 'c, 'd) step = 'a * ('b -> 'c) -> 'd

      type ('a, 'b, 'c, 'd) t = ('a, 'b, 'c, 'd) step -> 'd

      type ('a1, 'a2, 'b, 'c, 'd) step0 =
         ('a1, 'b, 'c, ('a2, 'b, 'c, 'd) t) step

      type ('a11, 'a12, 'a2, 'b, 'c, 'd) step1 =
         ('a12, 'b, 'c, 'a11 -> ('a2, 'b, 'c, 'd) t) step

      fun fold (a: 'a, f: 'b -> 'c)
               (g: ('a, 'b, 'c, 'd) step): 'd =
         g (a, f)

      fun step0 (h: 'a1 -> 'a2)
                (a1: 'a1, f: 'b -> 'c): ('a2, 'b, 'c, 'd) t =
         fold (h a1, f)

      fun step1 (h: 'a11 * 'a12 -> 'a2)
                (a12: 'a12, f: 'b -> 'c)
                (a11: 'a11): ('a2, 'b, 'c, 'd) t =
         fold (h (a11, a12), f)

      fun lift0 (s: ('a1, 'a2, 'a2, 'a2, 'a2) step0)
                (a: 'a1, f: 'b -> 'c): ('a2, 'b, 'c, 'd) t =
         fold (fold (a, id) s $, f)
            
      fun post (w: ('a, 'b, 'c1, 'd) t,
                g: 'c1 -> 'c2)
               (s: ('a, 'b, 'c2, 'd) step): 'd =
         w (fn (a, h) => s (a, g o h))
   end

That's a lot to swallow, so let's walk through it one step at a time. First, we have the definition of type Fold.step.

type ('a, 'b, 'c, 'd) step = 'a * ('b -> 'c) -> 'd

As a fold proceeds over its arguments, it maintains two things: the accumulator, of type 'a, and the finishing function, of type 'b -> 'c. Each step in the fold is a function that takes those two pieces (i.e. 'a * ('b -> 'c) and does something to them (i.e. produces 'd). The result type of the step is completely left open to be filled in by type inference, as it is an arrow type that is capable of consuming the rest of the arguments to the fold.

A folder, of type Fold.t, is a function that consumes a single step.

type ('a, 'b, 'c, 'd) t = ('a, 'b, 'c, 'd) step -> 'd

Expanding out the type, we have:

type ('a, 'b, 'c, 'd) t = ('a * ('b -> 'c) -> 'd) -> 'd

This shows that the only thing a folder does is to hand its accumulator ('a) and finisher ('b -> 'c) to the next step ('a * ('b -> 'c) -> 'd). If SML had first-class polymorphism, we would write the fold type as follows.

type ('a, 'b, 'c) t = Forall 'd. ('a, 'b, 'c, 'd) step -> 'd

This type definition shows that a folder had nothing to do with the rest of the fold, it only deals with the next step.

We now can understand the type of fold, which takes the initial value of the accumulator and the finishing function, and constructs a folder, i.e. a function awaiting the next step.

val fold: 'a * ('b -> 'c) -> ('a, 'b, 'c, 'd) t
fun fold (a: 'a, f: 'b -> 'c)
         (g: ('a, 'b, 'c, 'd) step): 'd =
   g (a, f)

Continuing on, we have the type of step functions.

type ('a1, 'a2, 'b, 'c, 'd) step0 = 
   ('a1, 'b, 'c, ('a2, 'b, 'c, 'd) t) step

Expanding out the type a bit gives:

type ('a1, 'a2, 'b, 'c, 'd) step0 = 
   'a1 * ('b -> 'c) -> ('a2, 'b, 'c, 'd) t

So, a step function takes the accumulator ('a1) and finishing function ('b -> 'c), which will be passed to it by the previous folder, and transforms them to a new folder. This new folder has a new accumulator ('a2) and the same finishing function.

Again, imagining that SML had first-class polymorphism makes the type clearer.

type ('a1, 'a2) step0 = 
   Forall ('b, 'c). ('a1, 'b, 'c, ('a2, 'b, 'c) t) step

Thus, in essence, a step0 function is a wrapper around a function of type 'a1 -> 'a2, which is exactly what the definition of step0 does.

val step0: ('a1 -> 'a2) -> ('a1, 'a2, 'b, 'c, 'd) step0
fun step0 (h: 'a1 -> 'a2)
          (a1: 'a1, f: 'b -> 'c): ('a2, 'b, 'c, 'd) t =
   fold (h a1, f)

It is not much beyond step0 to understand step1.

type ('a11, 'a12, 'a2, 'b, 'c, 'd) step1 =
   ('a12, 'b, 'c, 'a11 -> ('a2, 'b, 'c, 'd) t) step

A step1 function takes the accumulator ('a12) and finisher ('b -> 'c) passed to it by the previous folder and transforms them into a function that consumes the next argument ('a11) and produces a folder that will continue the fold with a new accumulator ('a2) and the same finisher.

fun step1 (h: 'a11 * 'a12 -> 'a2)
          (a12: 'a12, f: 'b -> 'c)
          (a11: 'a11): ('a2, 'b, 'c, 'd) t =
   fold (h (a11, a12), f)

With first-class polymorphism, a step1 function is more clearly seen as a wrapper around a binary function of type 'a11 * 'a12 -> 'a2.

type ('a11, 'a12, 'a2) step1 =
   Forall ('b, 'c). ('a12, 'b, 'c, 'a11 -> ('a2, 'b, 'c) t) step

The type of post is clear: it takes a folder with a finishing function that produces type 'c1, and a function of type 'c1 -> 'c2 to postcompose onto the folder. It returns a new folder with a finishing function that produces type 'c2.

val post: ('a, 'b, 'c1, 'd) t * ('c1 -> 'c2)
          -> ('a, 'b, 'c2, 'd) t
fun post (w: ('a, 'b, 'c1, 'd) t,
          g: 'c1 -> 'c2)
         (s: ('a, 'b, 'c2, 'd) step): 'd =
   w (fn (a, h) => s (a, g o h))

We will return to lift0 after an example.

An example typing

Let's type check our simplest example, a variable-argument fold. Recall that we have a folder f and a stepper a defined as follows.

val f = fn z => Fold.fold ((), fn () => ()) z
val a = fn z => Fold.step0 (fn () => ()) z

Since the accumulator and finisher are uninteresting, we'll use some abbreviations to simplify things.

type 'd step = (unit, unit, unit, 'd) Fold.step
type 'd fold = 'd step -> 'd

With these abbreviations, f and a have the following polymorphic types.

f: 'd fold
a: 'd step

Suppose we want to type check

f a a a $: unit
As a reminder, the fully parenthesized expression is
((((f a) a) a) a) $
The observation that we will use repeatedly is that for any type z, if f: z fold and s: z step, then f s: z. So, if we want
(f a a a) $: unit
then we must have
f a a a: unit fold
$: unit step
Applying the observation again, we must have
f a a: unit fold fold
a: unit fold step

Applying the observation two more times leads to the following type derivation.

f: unit fold fold fold fold  a: unit fold fold fold step
f a: unit fold fold fold     a: unit fold fold step
f a a: unit fold fold        a: unit fold step
f a a a: unit fold           $: unit step
f a a a $: unit

So, each application is a fold that consumes the next step, producing a fold of one smaller type.

One can expand some of the type definitions in f to see that it is indeed a function that takes four curried arguments, each one a step function.

f: unit fold fold fold step 
   -> unit fold fold step
   -> unit fold step
   -> unit step
   -> unit

This example shows why we must eta expand uses of fold and step0 to work around the value restriction and make folders and steppers polymorphic. The type of a fold function like f depends on the number of arguments, and so will vary from use to use. Similarly, each occurrence of an argument like a has a different type, depending on the number of remaining arguments.

This example also shows that the type of a folder, when fully expanded, is exponential in the number of arguments: there are as many nested occurrences of the fold type constructor as there are arguments, and each occurrence duplicates its type argument. One can observe this exponential behavior in a type checker that doesn't share enough of the representation of types (e.g. one that represents types as trees rather than directed acyclic graphs).

Generalizing this type derivation to uses of fold where the accumulator and finisher are more interesting is straightforward. One simply includes the type of the accumulator, which may change, for each step, and the type of the finisher, which doesn't change from step to step.

Typing lift

The lack of first-class polymorphism in SML causes problems if one wants to use a step in a first-class way. Consider the following double function, which takes a step, s, and produces a composite step that does s twice.

fun double s = fn u => Fold.fold u s s

The definition of double is not type correct. The problem is that the type of a step depends on the number of remaining arguments but that the parameter s is not polymorphic, and so can not be used in two different positions.

Fortunately, we can define a function, lift0, that takes a monotyped step function and lifts it into a polymorphic step function. This is apparent in the type of lift0.

val lift0: ('a1, 'a2, 'a2, 'a2, 'a2) step0
           -> ('a1, 'a2, 'b, 'c, 'd) step0
fun lift0 (s: ('a1, 'a2, 'a2, 'a2, 'a2) step0)
          (a: 'a1, f: 'b -> 'c): ('a2, 'b, 'c, 'd) t =
   fold (fold (a, id) s $, f)

The following definition of double uses lift0, appropriately eta wrapped, to fix the problem.

fun double s =
   let
      val s = fn z => Fold.lift0 s z
   in
      fn u => Fold.fold u s s
   end

With that definition of double in place, we can use it as in the following example.

val f = fn z => Fold.fold ((), fn () => ()) z
val a = fn z => Fold.step0 (fn () => ()) z
val a2 = fn z => double a z
val () = f a a2 a a2 $

Of course, we must eta wrap the call double in order to use its result, which is a step function, polymorphically.

Hiding the type of the accumulator

For clarity and to avoid mistakes, it can be useful to hide the type of the accumulator in a fold. Reworking the simple variable-argument example to do this leads to the following.

structure S:>
  sig
     type ac
     val f: (ac, ac, unit, 'd) Fold.t
     val s: (ac, ac, 'b, 'c, 'd) Fold.step0
  end =
  struct
     type ac = unit
     val f = fn z => Fold.fold ((), fn () => ()) z
     val s = fn z => Fold.step0 (fn () => ()) z
  end

The idea is to name the accumulator type and use opaque signature matching to make it abstract. This can prevent improper manipulation of the accumulator by client code and ensure invariants that the folder and stepper would like to maintain.

For a practical example of this technique, see ArrayLiteral.

Also see

Fold has a number of practical applications. Here are some of them.

There are a number of related techniques. Here are some of them.


Last edited on 2009-06-10 19:19:58 by MatthewFluet. mlton-20100608/doc/guide/Fold01N0000644000076600000240000001777411404435635014534 0ustar mtfstaff Fold01N - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Fold01N
Home  Index  
A common use pattern of Fold is to define a variable-arity function that combines multiple arguments together using a binary function. It is slightly tricky to do this directly using fold, because of the special treatment required for the case of zero or one argument. Here is a structure, Fold01N, that solves the problem once and for all, and eases the definition of such functions.
structure Fold01N =
   struct
      fun fold {finish, start, zero} =
         Fold.fold ((id, finish, fn () => zero, start),
                    fn (finish, _, p, _) => finish (p ()))
      
      fun step0 {combine, input} =
         Fold.step0 (fn (_, finish, _, f) =>
                     (finish,
                      finish,
                      fn () => f input,
                      fn x' => combine (f input, x')))
         
      fun step1 {combine} z input =
         step0 {combine = combine, input = input} z
   end

If one has a value zero, and functions start, c, and finish, then one can define a variable-arity function f and stepper ` as follows.

val f = fn z => Fold01N.fold {finish = finish, start = start, zero = zero} z
val ` = fn z => Fold01N.step1 {combine = c} z

One can then use the fold equation to prove the following equations.

f $ = zero
f `a1 $ = finish (start a1)
f `a1 `a2 $ = finish (c (start a1, a2))
f `a1 `a2 `a3 $ = finish (c (c (start a1, a2), a3))
...

For an example of Fold01N, see VariableArityPolymorphism.

Typing Fold01N

Here is the signature for Fold01N. We use a trick to avoid having to duplicate the definition of some rather complex types in both the signature and the structure. We first define the types in a structure. Then, we define them via type re-definitions in the signature, and via open in the full structure.

structure Fold01N =
   struct
      type ('input, 'accum1, 'accum2, 'answer, 'zero,
            'a, 'b, 'c, 'd, 'e) t =
         (('zero -> 'zero)
          * ('accum2 -> 'answer)
          * (unit -> 'zero)
          * ('input -> 'accum1),
          ('a -> 'b) * 'c * (unit -> 'a) * 'd,
          'b,
          'e) Fold.t

       type ('input1, 'accum1, 'input2, 'accum2,
            'a, 'b, 'c, 'd, 'e, 'f) step0 =
         ('a * 'b * 'c * ('input1 -> 'accum1),
          'b * 'b * (unit -> 'accum1) * ('input2 -> 'accum2),
          'd, 'e, 'f) Fold.step0

      type ('accum1, 'input, 'accum2,
            'a, 'b, 'c, 'd, 'e, 'f, 'g) step1 =
         ('a,
          'b * 'c * 'd * ('a -> 'accum1),
          'c * 'c * (unit -> 'accum1) * ('input -> 'accum2),
          'e, 'f, 'g) Fold.step1
   end

signature FOLD_01N =
   sig
      type ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j) t =
         ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j) Fold01N.t
      type ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j) step0 =
         ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j) Fold01N.step0
      type ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j) step1 =
         ('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j) Fold01N.step1
      
      val fold:
         {finish: 'accum2 -> 'answer,
          start: 'input -> 'accum1,
          zero: 'zero}
         -> ('input, 'accum1, 'accum2, 'answer, 'zero,
             'a, 'b, 'c, 'd, 'e) t

      val step0:
         {combine: 'accum1 * 'input2 -> 'accum2,
          input: 'input1}
         -> ('input1, 'accum1, 'input2, 'accum2,
             'a, 'b, 'c, 'd, 'e, 'f) step0
         
      val step1:
         {combine: 'accum1 * 'input -> 'accum2}
         -> ('accum1, 'input, 'accum2,
             'a, 'b, 'c, 'd, 'e, 'f, 'g) step1
   end

structure Fold01N: FOLD_01N =
   struct
      open Fold01N
      
      fun fold {finish, start, zero} =
         Fold.fold ((id, finish, fn () => zero, start),
                    fn (finish, _, p, _) => finish (p ()))
      
      fun step0 {combine, input} =
         Fold.step0 (fn (_, finish, _, f) =>
                     (finish,
                      finish,
                      fn () => f input,
                      fn x' => combine (f input, x')))
         
      fun step1 {combine} z input =
         step0 {combine = combine, input = input} z
   end


Last edited on 2006-03-21 23:10:39 by VesaKarvonen. mlton-20100608/doc/guide/ForeignFunctionInterface0000644000076600000240000000570111404435635020274 0ustar mtfstaff ForeignFunctionInterface - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ForeignFunctionInterface
Home  Index  
MLton's foreign function interface (FFI) extends Standard ML and makes it easy to take the address of C global objects, access C global variables, call from SML to C, and call from C to SML. MLton also provides ML-NLFFI, which is a higher-level FFI for calling C functions and manipulating C data from SML.

Overview

Importing Code into SML

Exporting Code from SML

Building System Libraries


Last edited on 2009-06-10 19:26:13 by MatthewFluet. mlton-20100608/doc/guide/ForeignFunctionInterfaceSyntax0000644000076600000240000001775411404435635021516 0ustar mtfstaff ForeignFunctionInterfaceSyntax - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ForeignFunctionInterfaceSyntax
Home  Index  
MLton extends the syntax of SML with expressions that enable a ForeignFunctionInterface to C. The following description of the syntax uses some abbreviations.
C base type cBaseTy Foreign Function Interface types
C argument type cArgTy cBaseTy1 * ... * cBaseTyn or unit
C return type cRetTy cBaseTy or unit
C function type cFuncTy cArgTy -> cRetTy
C pointer type cPtrTy MLton.Pointer.t

The type annotation and the semicolon are not optional in the syntax of ForeignFunctionInterface expressions. However, the type is lexed, parsed, and elaborated as an SML type, so any type (including type abbreviations) may be used, so long as it elaborates to a type of the correct form.

Address

_address "CFunctionOrVariableName" attr... : cPtrTy;

Denotes the address of the C function or variable.

attr... denotes a (possibly empty) sequence of attributes. The following attributes are recognized:

See MLtonPointer for functions that manipulate C pointers.

Symbol

_symbol "CVariableName" attr... : (unit -> cBaseTy) * (cBaseTy -> unit);

Denotes the getter and setter for a C variable. The cBaseTys must be identical.

attr... denotes a (possibly empty) sequence of attributes. The following attributes are recognized:

  • alloc : allocate storage (and export a symbol) for the C variable.

  • external : import or export with external symbol scope (see LibrarySupport) (default if not alloc).

  • private : import or export with private symbol scope (see LibrarySupport).

  • public : import or export with public symbol scope (see LibrarySupport) (default if alloc).

_symbol * : cPtrTy -> (unit -> cBaseTy) * (cBaseTy -> unit);

Denotes the getter and setter for a C pointer to a variable. The cBaseTys must be identical.

Import

_import "CFunctionName" attr... : cFuncTy;

Denotes an SML function whose behavior is implemented by calling the C function. See Calling from SML to C for more details.

attr... denotes a (possibly empty) sequence of attributes. The following attributes are recognized:

  • cdecl : call with the cdecl calling convention (default).

  • external : import with external symbol scope (see LibrarySupport) (default).

  • private : import with private symbol scope (see LibrarySupport).

  • public : import with public symbol scope (see LibrarySupport).

  • stdcall : call with the stdcall calling convention (ignored except on Cygwin and MinGW).

_import * attr... : cPtrTy -> cFuncTy;

Denotes an SML function whose behavior is implemented by calling a C function through a C function pointer.

attr... denotes a (possibly empty) sequence of attributes. The following attributes are recognized:

  • cdecl : call with the cdecl calling convention (default).

  • stdcall : call with the stdcall calling convention (ignored except on Cygwin and MinGW).

See Calling from SML to C function pointer for more details.

Export

_export "CFunctionName" attr... : cFuncTy -> unit;

Exports a C function with the name CFunctionName that can be used to call an SML function of the type cFuncTy. When the function denoted by the export expression is applied to an SML function f, subsequent C calls to CFunctionName will call f. It is an error to call CFunctionName before the export has been applied. The export may be applied more than once, with each application replacing any previous definition of CFunctionName.

attr... denotes a (possibly empty) sequence of attributes. The following attributes are recognized:

  • cdecl : call with the cdecl calling convention (default).

  • private : export with private symbol scope (see LibrarySupport).

  • public : export with public symbol scope (see LibrarySupport) (default).

  • stdcall : call with the stdcall calling convention (ignored except on Cygwin and MinGW).

See Calling from C to SML for more details.


Last edited on 2009-06-22 16:17:40 by MatthewFluet. mlton-20100608/doc/guide/ForeignFunctionInterfaceTypes0000644000076600000240000001553311404435634021324 0ustar mtfstaff ForeignFunctionInterfaceTypes - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ForeignFunctionInterfaceTypes
Home  Index  
MLton's ForeignFunctionInterface only allows values of certain SML types to be passed between SML and C. The following types are allowed: bool, char, int, real, word. All of the different sizes of (fixed-sized) integers, reals, and words are supported as well: Int8.int, Int16.int, Int32.int, Int64.int, Real32.real, Real64.real, Word8.word, Word16.word, Word32.word, Word64.word. There is a special type, MLton.Pointer.t, for passing C pointers -- see MLtonPointer for details.

Arrays, refs, and vectors of the above types are also allowed. Because in MLton monomorphic arrays and vectors are exactly the same as their polymorphic counterpart, these are also allowed. Hence, string, char vector, and CharVector.vector are also allowed. Strings are not null terminated, unless you manually do so from the SML side.

Unfortunately, passing tuples or datatypes is not allowed because that would interfere with representation optimizations.

The C header file that -export-header generates includes typedefs for the C types corresponding to the SML types. Here is the mapping between SML types and C types.

SML type C typedef C type Note
array Pointer unsigned char *
bool Bool int32_t
char Char8 uint8_t
Int8.int Int8 int8_t
Int16.int Int16 int16_t
Int32.int Int32 int32_t
Int64.int Int64 int64_t
int Int32 int32_t (default)
MLton.Pointer.t Pointer unsigned char *
Real32.real Real32 float
Real64.real Real64 double
real Real64 double (default)
ref Pointer unsigned char *
string Pointer unsigned char * (read only)
vector Pointer unsigned char * (read only)
Word8.word Word8 uint8_t
Word16.word Word16 uint16_t
Word32.word Word32 uint32_t
Word64.word Word64 uint64_t
word Word32 uint32_t (default)

Note (default): The default int, real, and word types may be set by the -default-type type compiler option. The given C typedef and C types correspond to the default behavior.

Note (read only): Because MLton assumes that vectors and strings are read-only (and will perform optimizations that, for instance, cause them to share space), you must not modify the data pointed to by the unsigned char * in C code.

Although the C type of an array, ref, or vector is always Pointer, in reality, the object has the natural C representation. Your C code should cast to the appropriate C type if you want to keep the C compiler from complaining.

When calling an imported C function from SML that returns an array, ref, or vector result or when calling an exported SML function from C that takes an array, ref, or string argument, then the object must be an ML object allocated on the ML heap. (Although an array, ref, or vector object has the natural C representation, the object also has an additional header used by the SML runtime system.)


Last edited on 2007-08-16 01:14:48 by MatthewFluet. mlton-20100608/doc/guide/ForLoops0000644000076600000240000003437511404435634015127 0ustar mtfstaff ForLoops - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ForLoops
Home  Index  
A for-loop is typically used to iterate over a range of consecutive integers that denote indices of some sort. For example, in OCaml a for-loop takes either the form
for <name> = <lower> to <upper> do <body> done
or the form
for <name> = <upper> downto <lower> do <body> done
Some languages provide considerably more flexible for-loop or foreach-constructs.

A bit surprisingly, Standard ML provides special syntax for while-loops, but not for for-loops. Indeed, in SML, many uses of for-loops are better expressed using app, foldl/foldr, map and many other higher-order functions provided by the Basis Library for manipulating lists, vectors and arrays. However, the Basis Library does not provide a function for iterating over a range of integer values. Fortunately, it is very easy to write one.

A fairly simple design

The following implementation imitates both the syntax and semantics of the OCaml for-loop.

datatype for = to of int * int
             | downto of int * int

infix to downto

val for =
    fn lo to up =>
       (fn f => let fun loop lo = if lo > up then ()
                                  else (f lo; loop (lo+1))
                in loop lo end)
     | up downto lo =>
       (fn f => let fun loop up = if up < lo then ()
                                  else (f up; loop (up-1))
                in loop up end)

For example,

for (1 to 9)
    (fn i => print (Int.toString i))
would print 123456789 and
for (9 downto 1)
    (fn i => print (Int.toString i))
would print 987654321.

Straightforward formatting of nested loops

for (a to b)
    (fn i =>
        for (c to d)
            (fn j =>
                ...))
is fairly readable, but tends to cause the body of the loop to be indented quite deeply.

Off-by-one

The above design has an annoying feature. In practice, the upper bound of the iterated range is almost always excluded and most loops would subtract one from the upper bound:

for (0 to n-1) ...
for (n-1 downto 0) ...
It is probably better to break convention and exclude the upper bound by default, because it leads to more concise code and becomes idiomatic with very little practice. The iterator combinators described below exclude the upper bound by default.

Iterator combinators

While the simple for-function described in the previous section is probably good enough for many uses, it is a bit cumbersome when one needs to iterate over a Cartesian product. One might also want to iterate over more than just consecutive integers. It turns out that one can provide a library of iterator combinators that allow one to implement iterators more flexibly.

Since the types of the combinators may be a bit difficult to infer from their implementations, let's first take a look at a signature of the iterator combinator library:

signature ITER =
  sig
    type 'a t = ('a -> unit) -> unit

    val return : 'a -> 'a t
    val >>= : 'a t * ('a -> 'b t) -> 'b t

    val none : 'a t

    val to : int * int -> int t
    val downto : int * int -> int t

    val inList : 'a list -> 'a t
    val inVector : 'a vector -> 'a t
    val inArray : 'a array -> 'a t

    val using : ('a, 'b) StringCvt.reader -> 'b -> 'a t

    val when : 'a t * ('a -> bool) -> 'a t
    val by : 'a t * ('a -> 'b) -> 'b t
    val @@ : 'a t * 'a t -> 'a t
    val ** : 'a t * 'b t -> ('a, 'b) product t

    val for : 'a -> 'a
  end

Several of the above combinators are meant to be used as infix operators. Here is a set of suitable infix declarations:

infix 2 to downto
infix 1 @@ when by
infix 0 >>= **

A few notes are in order:

  • The 'a t type constructor with the return and >>= operators forms a monad.

  • The to and downto combinators will omit the upper bound of the range.

  • for is the identity function. It is purely for syntactic sugar and is not strictly required.

  • The @@ combinator produces an iterator for the concatenation of the given iterators.

  • The ** combinator produces an iterator for the Cartesian product of the given iterators.

    • See ProductType for the type constructor ('a, 'b) product used in the type of the iterator produced by **.

  • The using combinator allows one to iterate over slices, streams and many other kinds of sequences.

  • when is the filtering combinator. The name when is inspired by OCaml's guard clauses.

  • by is the mapping combinator.

The below implementation of the ITER-signature makes use of the following basic combinators:

fun const x _ = x
fun flip f x y = f y x
fun id x = x
fun opt fno fso = fn NONE => fno () | SOME ? => fso ?
fun pass x f = f x

Here is an implementation the ITER-signature:

structure Iter :> ITER =
  struct
    type 'a t = ('a -> unit) -> unit

    val return = pass
    fun (iA >>= a2iB) f = iA (flip a2iB f)

    val none = ignore

    fun (l to u) f = let fun `l = if l<u then (f l; `(l+1)) else () in `l end
    fun (u downto l) f = let fun `u = if u>l then (f (u-1); `(u-1)) else () in `u end

    fun inList ? = flip List.app ?
    fun inVector ? = flip Vector.app ?
    fun inArray ? = flip Array.app ?

    fun using get s f = let fun `s = opt (const ()) (fn (x, s) => (f x; `s)) (get s) in `s end

    fun (iA when p) f = iA (fn a => if p a then f a else ())
    fun (iA by g) f = iA (f o g)
    fun (iA @@ iB) f = (iA f : unit; iB f)
    fun (iA ** iB) f = iA (fn a => iB (fn b => f (a & b)))

    val for = id
  end

Note that some of the above combinators (e.g. **) could be expressed in terms of the other combinators, most notably return and >>=. Another implementation issue worth mentioning is that downto is written specifically to avoid computing l-1, which could cause an Overflow.

To use the above combinators the Iter-structure needs to be opened

open Iter
and one usually also wants to declare the infix status of the operators as shown earlier.

Here is an example that illustrates some of the features:

for (0 to 10 when (fn x => x mod 3 <> 0) ** inList ["a", "b"] ** 2 downto 1 by real)
    (fn x & y & z =>
       print ("("^Int.toString x^", \""^y^"\", "^Real.toString z^")\n"))

Using the Iter combinators one can easily produce more complicated iterators. For example, here is an iterator over a "triangle":

fun triangle (l, u) = l to u >>= (fn i => i to u >>= (fn j => return (i, j)))


Last edited on 2007-08-15 22:06:21 by MatthewFluet. mlton-20100608/doc/guide/FrontEnd0000644000076600000240000000622411404435634015073 0ustar mtfstaff FrontEnd - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION FrontEnd
Home  Index  
FrontEnd is a translation pass from source to the AST IntermediateLanguage.

Description

This pass performs lexing and parsing to produce an abstract syntax tree.

Implementation

[WWW]front-end.sig [WWW]front-end.fun

Details and Notes

The lexer is produced by MLLex from [WWW]ml.lex.

The parser is produced by MLYacc from [WWW]ml.grm.

The specifications for the lexer and parser were originally taken from SML/NJ (version 109.32), but have been heavily modified since then.


Last edited on 2006-11-02 17:41:18 by MatthewFluet. mlton-20100608/doc/guide/FSharp0000644000076600000240000000405111404435634014533 0ustar mtfstaff FSharp - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION FSharp
Home  Index  
[WWW]F# is a functional programming language developed at Microsoft Research. F# was partly inspired by the OCaml language and shares some common core constructs with it. F# is integrated with Visual Studio 2010 as a first-class language.


Last edited on 2010-05-27 21:02:24 by MatthewFluet. mlton-20100608/doc/guide/FunctionalRecordUpdate0000644000076600000240000003123111404435634017754 0ustar mtfstaff FunctionalRecordUpdate - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION FunctionalRecordUpdate
Home  Index  
Functional record update is the copying of a record while replacing the values of some of the fields. Standard ML does not have explicit syntax for functional record update. We will show below how to implement functional record update in SML, with a little boilerplate code.

As an example, the functional update of the record

{a = 13, b = 14, c = 15} 
with c = 16 yields a new record
{a = 13, b = 14, c = 16}
Functional record update also makes sense with multiple simultaneous updates. For example, the functional update of the record above with a = 18, c = 19 yields a new record
{a = 18, b = 14, c = 19}

One could easily imagine an extension of the SML that supports functional record update. For example

e with {a = 16, b = 17}
would create a copy of the record denoted by e with field a replaced with 16 and b replaced with 17.

Since there is no such syntax in SML, we now show how to implement functional record update directly. We first give a simple implementation that has a number of problems. We then give an advanced implementation, that, while complex underneath, is a reusable library that admits simple use.

Simple implementation

To support functional record update on the record type

{a: 'a, b: 'b, c: 'c} 
first, define an update function for each component.
fun withA ({a = _, b, c}, a) = {a = a, b = b, c = c}
fun withB ({a, b = _, c}, b) = {a = a, b = b, c = c}
fun withC ({a, b, c = _}, c) = {a = a, b = b, c = c}
Then, one can express e with {a = 16, b = 17}  as
withB (withA (e, 16), 17)
With infix notation
infix withA withB withC
the syntax is almost as concise as a language extension.
e withA 16 withB 17

This approach suffers from the fact that the amount of boilerplate code is quadratic in the number of record fields. Furthermore, changing, adding, or deleting a field requires time proportional to the number of fields (because each with function must be changed). It is also annoying to have to define a with function, possibly with a fixity declaration, for each field.

Fortunately, there is a solution to these problems.

Advanced implementation

Using Fold one can define a family of makeUpdate<N> functions and single update operator U so that one can define a functional record update function for any record type simply by specifying a (trivial) isomorphism between that type and function argument list. For example, suppose that we would like to do functional record update on records with fields a and b. Then one defines a function updateAB as follows.

val updateAB =
   fn z =>
   let
      fun from v1 v2 = {a = v1, b = v2}
      fun to f {a = v1, b = v2} = f v1 v2
   in
      makeUpdate2 (from, from, to)
   end
   z

The functions from (think from function arguments) and to (think to function arguements) specify an isomorphism between a,b records and function arguments. There is a second use of from to work around the lack of first-class polymorphism in SML.

With the definition of updateAB in place, the following expressions are valid.

updateAB {a = 13, b = "hello"} (set#b "goodbye") $
updateAB {a = 13.5, b = true} (set#b false) (set#a 12.5) $

As another example, suppose that we would like to do functional record update on records with fields b, c, and d. Then one defines a function updateBCD as follows.

val updateBCD =
   fn z =>
   let
      fun from v1 v2 v3 = {b = v1, c = v2, d = v3}
      fun to f {b = v1, c = v2, d = v3} = f v1 v2 v3
   in
      makeUpdate3 (from, from, to)
   end
   z

With the definition of updateBCD in place, the following expression is valid.

updateBCD {b = 1, c = 2, d = 3} (set#c 4) (set#c 5) $

Note that not all fields need be updated and that the same field may be updated multiple times. Further note that the same set operator is used for all update functions (in the above, for both updateAB and updateBCD).

In general, to define a functional-record-update function on records with fields f1, f2, ..., fN, use the following template.

val update =
   fn z =>
   let 
      fun from v1 v2 ... vn = {f1 = v1, f2 = v2, ..., fn = vn}
      fun to f {f1 = v1, f2 = v2, ..., fn = vn} = v1 v2 ... vn
   in
      makeUpdateN (from, from, to)
   end
   z

With this, one can update a record as follows.

update {f1 = v1, ..., fn = vn} (set#fi1 vi1) ... (set#fim vim) $

The FunctionalRecordUpdate structure

Here is the implementation of functional record update.

structure FunctionalRecordUpdate =
   struct
      local
         fun next g (f, z) x = g (f x, z)
         fun f1 (f, z) x = f (z x)
         fun f2  z = next f1  z
         fun f3  z = next f2  z

         fun c0  from = from
         fun c1  from = c0  from f1
         fun c2  from = c1  from f2
         fun c3  from = c2  from f3

         fun makeUpdate cX (from, from', to) record =
            let
               fun ops () = cX from'
               fun vars f = to f record
            in
               Fold.fold ((vars, ops), fn (vars, _) => vars from)
            end
      in
         fun makeUpdate0  z = makeUpdate c0  z
         fun makeUpdate1  z = makeUpdate c1  z
         fun makeUpdate2  z = makeUpdate c2  z
         fun makeUpdate3  z = makeUpdate c3  z

         fun upd z = Fold.step2 (fn (s, f, (vars, ops)) => (fn out => vars (s (ops ()) (out, f)), ops)) z
         fun set z = Fold.step2 (fn (s, v, (vars, ops)) => (fn out => vars (s (ops ()) (out, fn _ => v)), ops)) z
      end
   end

The idea of makeUpdate is to build a record of functions which can replace the contents of one argument out of a list of arguments. The functions fX replace the 0th, 1st, ... argument with their argument z. The cX functions pass the first X f functions to the record constructor.

The #field notation of Standard ML allows us to select the map function which replaces the corresponding argument. By converting the record to an argument list, feeding that list through the selected map function and piping the list into the record constructor, functional record update is achieved.

Efficiency

With MLton, the efficiency of this approach is as good as one would expect with the special syntax. Namely a sequence of updates will be optimized into a single record construction that copies the unchanged fields and fills in the changed fields with their new values.

Before Sep 14, 2009, this page advocated an alternative implementation of FunctionalRecordUpdate. However, the old structure caused exponentially increasing compile times. We advise you to switch to the newer version.

Applications

Functional record update can be used to implement labelled optional arguments.


Last edited on 2009-09-14 20:23:55 by WesleyTerpstra. mlton-20100608/doc/guide/fxp0000644000076600000240000000405111404435635014146 0ustar mtfstaff fxp - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION fxp
Home  Index  
[WWW]fxp is an XML parser written in Standard ML.

It has a [WWW]patch to compile with MLton.


Last edited on 2005-09-09 19:15:51 by StephenWeeks. mlton-20100608/doc/guide/GarbageCollection0000644000076600000240000000537011404435634016721 0ustar mtfstaff GarbageCollection - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION GarbageCollection
Home  Index  
For a good introduction and overview to garbage collection, see Jones99.

MLton's garbage collector uses copying, mark-compact, and generational collection, automatically switching between them at run time based on the amount of live data relative to the amount of RAM. The runtime system tries to keep the heap within RAM if at all possible.

MLton's copying collector is a simple, two-space, breadth-first, Cheney-style collector. The design for the generational and mark-compact GC is based on Sansom91.

Design notes

Also see


Last edited on 2005-09-06 23:28:47 by MatthewFluet. mlton-20100608/doc/guide/GenerativeDatatype0000644000076600000240000000715711404435634017147 0ustar mtfstaff GenerativeDatatype - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION GenerativeDatatype
Home  Index  
In Standard ML, datatype declarations are said to be generative, because each time a datatype declaration is evaluated, it yields a new type. Thus, any attempt to mix the types will lead to a type error at compile-time. The following program, which does not type check, demonstrates this.
functor F () =
   struct
      datatype t = T
   end
structure S1 = F ()
structure S2 = F ()
val _: S1.t -> S2.t = fn x => x

Generativity also means that two different datatype declarations define different types, even if they define identical constructors. The following program does not type check due to this.

datatype t = A | B
val a1 = A
datatype t = A | B
val a2 = A
val _ = if true then a1 else a2

Also see


Last edited on 2010-03-02 15:11:35 by MatthewFluet. mlton-20100608/doc/guide/GenerativeException0000644000076600000240000001476611404435634017336 0ustar mtfstaff GenerativeException - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION GenerativeException
Home  Index  
In Standard ML, exception declarations are said to be generative, because each time an exception declaration is evaluated, it yields a new exception.

The following program demonstrates the generativity of exceptions.

exception E
val e1 = E
fun isE1 (e: exn): bool =
   case e of
      E => true
    | _ => false
exception E
val e2 = E
fun isE2 (e: exn): bool =
   case e of
      E => true
    | _ => false
fun pb (b: bool): unit =
   print (concat [Bool.toString b, "\n"])
val () = (pb (isE1 e1)
          ;pb (isE1 e2)
          ; pb (isE2 e1)
          ; pb (isE2 e2))
In the above program, two different exception declarations declare an exception E and a corresponding function that returns true only on that exception. Although declared by syntactically identical exception declarations, e1 and e2 are different exceptions. The program, when run, prints true, false, false, true.

A slight modification of the above program shows that even a single exception declaration yields a new exception each time it is evaluated.

fun f (): exn * (exn -> bool) =
   let
      exception E
   in
      (E, fn E => true | _ => false)
   end
val (e1, isE1) = f ()
val (e2, isE2) = f ()
fun pb (b: bool): unit =
   print (concat [Bool.toString b, "\n"])
val () = (pb (isE1 e1)
          ; pb (isE1 e2)
          ; pb (isE2 e1)
          ; pb (isE2 e2))
Each call to f yields a new exception and a function that returns true only on that exception. The program, when run, prints true, false, false, true.

Type Safety

Exception generativity is required for type safety. Consider the following valid SML program.

fun f (): ('a -> exn) * (exn -> 'a) =
   let
      exception E of 'a
   in
      (E, fn E x => x | _ => raise Fail "f")
   end
fun cast (a: 'a): 'b =
   let
      val (make: 'a -> exn, _) = f ()
      val (_, get: exn -> 'b) = f ()
   in
      get (make a)
   end
val _ = ((cast 13): int -> int) 14

If exceptions weren't generative, then each call f () would yield the same exception constructor E. Then, our cast function could use make: 'a -> exn to convert any value into an exception and then get: exn -> 'b to convert that exception to a value of arbitrary type. If cast worked, then we could cast an integer as a function and apply. Of course, because of generative exceptions, this program raises Fail "f".

Applications

The exn type is effectively a universal type.

Also see


Last edited on 2010-03-02 15:11:39 by MatthewFluet. mlton-20100608/doc/guide/Glade0000644000076600000240000000424111404435634014365 0ustar mtfstaff Glade - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Glade
Home  Index  
[WWW]Glade is a tool for generating Gtk user interfaces.

WesleyTerpstra is working on a Glade->mGTK converter.


Last edited on 2005-12-02 07:11:13 by StephenWeeks. mlton-20100608/doc/guide/Globalize0000644000076600000240000000522311404435634015262 0ustar mtfstaff Globalize - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Globalize
Home  Index  
Globalize is an analysis pass for the SXML IntermediateLanguage, invoked from ClosureConvert.

Description

This pass marks values that are constant, allowing ClosureConvert to move them out to the top level so they are only evaluated once and do not appear in closures.

Implementation

[WWW]globalize.sig [WWW]globalize.fun

Details and Notes


Last edited on 2006-11-02 17:37:56 by MatthewFluet. mlton-20100608/doc/guide/GnuMP0000644000076600000240000001252511404435634014343 0ustar mtfstaff GnuMP - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION GnuMP
Home  Index  
The [WWW]GnuMP library (GNU multiprecision library) is a library for arbitrary precision integer arithmetic. MLton uses the GnuMP library to implement the Basis Library IntInf module.

Known issues

  • There is a known problem with the GnuMP library (prior to version 4.2.x), where it requires a lot of stack space for some computations, e.g. IntInf.toString of a million digit number. If you run with stack size limited, you may see a segfault in such programs. This problem is mentioned in the [WWW]GnuMP FAQ, where they describe two solutions.

    • Increase (or unlimit) your stack space. From your program, use setrlimit, or from the shell, use ulimit.

    • Configure and rebuild libgmp with --disable-alloca, which will cause it to allocate temporaries using malloc instead of on the stack.

  • On some platforms, the GnuMP library may be configured to use one of multiple ABIs (Application Binary Interfaces). For example, on some 32-bit architectures, GnuMP may be configured to represent a limb as either a 32-bit long or as a 64-bit long long. Similarly, GnuMP may be configured to use specific CPU features.

    In order to efficiently use the GnuMP library, MLton represents an IntInf.int value in a manner compatible with the GnuMP library's representation of a limb. Hence, it is important that MLton and the GnuMP library agree upon the representation of a limb.

    • When using a source package of MLton, building will detect the GnuMP library's representation of a limb.

    • When using a binary package of MLton that is dynamically linked against the GnuMP library, the build machine and the install machine must have the GnuMP library configured with the same representation of a limb. (On the other hand, the build machine need not have the GnuMP library configured with CPU features compatible with the install machine.)

    • When using a binary package of MLton that is statically linked against the GnuMP library, the build machine and the install machine need not have the GnuMP library configured with the same representation of a limb. (On the other hand, the build machine must have the GnuMP library configured with CPU features compatible with the install machine.)

      However, MLton will be configured with the representation of a limb from the GnuMP library of the build machine. Executables produced by MLton will be incompatible with the GnuMP library of the install machine. To reconfigure MLton with the representation of a limb from the GnuMP library of the install machine, one must edit:

      /usr/lib/mlton/self/sizes
      changing the
      mplimb = ??
      entry so that ?? corresponds to the bytes in a limb; and, one must edit:
      /usr/lib/mlton/sml/basis/config/c/arch-os/c-types.sml
      changing the
      (* from "gmp.h" *)
      structure C_MPLimb = struct open Word?? type t = word end
      functor C_MPLimb_ChooseWordN (A: CHOOSE_WORDN_ARG) = ChooseWordN_Word?? (A)
      
      entries so that ?? corresponds to the bits in a limb.


Last edited on 2007-12-17 16:36:16 by MatthewFluet. mlton-20100608/doc/guide/HaMLet0000644000076600000240000000375711404435634014476 0ustar mtfstaff HaMLet - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION HaMLet
Home  Index  
[WWW]HaMLet is a Standard ML Implementation. It is intended as reference implementation of The Definition of Standard ML and not for serious practical work.


Last edited on 2007-08-15 22:06:37 by MatthewFluet. mlton-20100608/doc/guide/HenryCejtin0000644000076600000240000000356011404435634015576 0ustar mtfstaff HenryCejtin - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION HenryCejtin
Home  Index  
I was one of the original developers of Mathematica (actually employee #1). My background is a combination of mathematics and computer science. Currently I am doing various things in Chicago.


Last edited on 2005-12-01 03:27:33 by HenryCejtin. mlton-20100608/doc/guide/History0000644000076600000240000000774311404435635015025 0ustar mtfstaff History - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION History
Home  Index  
In April 1997, Stephen Weeks wrote a defunctorizer for Standard ML and integrated it with SML/NJ. The defunctorizer used SML/NJ's visible compiler and operated on the Ast intermediate representation produced by the SML/NJ front end. Experiments showed that defunctorization gave a speedup of up to six times over separate compilation and up to two times over batch compilation without functor expansion.

In August 1997, we began development of an independent compiler for SML. At the time the compiler was called smlc. By October, we had a working monomorphiser. By November, we added a polyvariant higher-order control-flow analysis. At that point, MLton was about 10,000 lines of code.

Over the next year and half, smlc morphed into a full-fledged compiler for SML. It was renamed MLton, and first released in March 1999.

From the start, MLton has been driven by whole-program optimization and an emphasis on performance. Also from the start, MLton has had a fast C FFI and IntInf based on the GNU multiprecision library. At its first release, MLton was 48,006 lines.

Between the March 1999 and January 2002, MLton grew to 102,541 lines, as we added a native code generator, mllex, mlyacc, a profiler, many optimizations, and many libraries including threads and signal handling.

During 2002, MLton grew to 112,204 lines and we had releases in April and September. We added support for cross compilation and used this to enable MLton to run on Cygwin/Windows and FreeBSD. We also made improvements to the garbage collector, so that it now works with large arrays and up to 4G of memory and so that it automatically uses copying, mark-compact, or generational collection depending on heap usage and RAM size. We also continued improvements to the optimizer and libraries.

During 2003, MLton grew to 122,299 lines and we had releases in March and July. We extended the profiler to support source-level profiling of time and allocation and to display call graphs. We completed the Basis Library implementation, and added new MLton-specific libraries for weak pointers and finalization. We extended the FFI to allow callbacks from C to SML. We added support for the Sparc/Solaris platform, and made many improvements to the C code generator.


Last edited on 2005-12-02 04:23:16 by MatthewFluet. mlton-20100608/doc/guide/Home0000644000076600000240000000535011404435635014244 0ustar mtfstaff Home - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Home
Home  Index  

What is MLton?

MLton is an open-source, whole-program, optimizing Standard ML compiler.

What's new?

Next steps


Last edited on 2010-06-08 14:36:16 by MatthewFluet. mlton-20100608/doc/guide/HowProfilingWorks0000644000076600000240000001406411404435634017012 0ustar mtfstaff HowProfilingWorks - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION HowProfilingWorks
Home  Index  
Here's how Profiling works. If profiling is on, the front end (elaborator) inserts Enter and Leave statements into the source program for function entry and exit. For example,
fun f n = if n = 0 then 0 else 1 + f (n - 1)

becomes

fun f n = 
   let
      val () = Enter "f"
      val res = (if n = 0 then 0 else 1 + f (n - 1))
                handle e => (Leave "f"; raise e)
      val () = Leave "f"
   in 
      res
   end
Actually there is a bit more information than just the source function name; there is also lexical nesting and file position.

Most of the middle of the compiler ignores, but preserves, Enter and Leave. However, so that profiling preserves tail calls, the Ssa shrinker has an optimization that notices when the only operations that cause a call to be a nontail call are profiling operations, and if so, moves them before the call, turning it into a tail call. If you observe a program that has a tail call that appears to be turned into a nontail when compiled with profiling, please report a bug.

There is the checkProf function in [WWW]type-check.fun, which checks that the Enter/Leave statements match up.

In the backend, just before translating to the Machine IL, the profiler uses the Enter/Leave statements to infer the "local" portion of the control stack at each program point. The profiler then removes the Enters/Leaves and inserts different information depending on which kind of profiling is happening. For time profiling (with the native codegen), the profiler inserts labels that cover the code (i.e. each statement has a unique label in its basic block that prefixes it) and associates each label with the local control stack. For time profiling (with the C and bytecode codegens), the profiler inserts code that sets a global field that records the local control stack. For allocation profiling, the profiler inserts calls to a C function that will maintain byte counts. With stack profiling, the profiler also inserts a call to a C function at each nontail call in order to maintain information at runtime about what SML functions are on the stack.

At run time, the profiler associates counters (either clock ticks or byte counts) with source functions. When the program finishes, the profiler writes the counts out to the mlmon.out file. Then, mlprof uses source information stored in the executable to associate the counts in the mlmon.out file with source functions.

For time profiling, the profiler catches the SIGPROF signal 100 times per second and increments the appropriate counter, determined by looking at the label prefixing the current program counter and mapping that to the current source function.

Caveats

There may be a few missed clock ticks or bytes allocated at the very end of the program after the data is written.

Profiling has not been tested with signals or threads. In particular, stack profiling may behave strangely.


Last edited on 2007-08-01 22:54:41 by MatthewFluet. mlton-20100608/doc/guide/HowToAttachFile0000644000076600000240000000506111404435634016337 0ustar mtfstaff HowToAttachFile - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION HowToAttachFile
Home  Index  
To attach a file to a page you should:
  1. [WWW]Create an account and login.

  2. Click on the AttachFile link at the bottom of the page to which you wish to attach the file.

  3. Enter the file name in the "File to upload" box and click upload.

Once you have done this, you can refer to the file on the page using the attachment:filename wiki syntax.

Here is an [WWW]example.


Last edited on 2006-10-30 18:59:17 by StephenWeeks. mlton-20100608/doc/guide/Identifier0000644000076600000240000000616611404435634015443 0ustar mtfstaff Identifier - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Identifier
Home  Index  
In Standard ML, there are syntactically two kinds of identifiers.
  • Alphanumeric: starts with a letter or prime (') and is followed by letters, digits, primes and underbars (_).

    Examples: abc, ABC123, Abc_123, 'a.

  • Symbolic: a sequence of the following

     ! % & $ # + - / : < = > ? @ | ~ ` ^ | *

    Examples: +=, <=, >>, $.

With the exception of =, reserved words can not be identifiers.

There are a number of different classes of identifiers, some of which have additional syntactic rules.

  • Identifiers not starting with a prime.

    • value identifier (includes variables and constructors)

    • type constructor

    • structure identifier

    • signature identifier

    • functor identifier

  • Identifiers starting with a prime.

    • type variable (must start with prime)

  • Identifiers + numeric labels (1, 2, ...).

    • record label


Last edited on 2005-01-18 15:02:21 by MatthewFluet. mlton-20100608/doc/guide/Immutable0000644000076600000240000000365011404435634015273 0ustar mtfstaff Immutable - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Immutable
Home  Index  
Immutable means not mutable, and is an adjective meaning "can not be modified". Most values in Standard ML are immutable. For example, constants, tuples, records, lists, and vectors are all immutable.


Last edited on 2004-12-08 18:51:10 by StephenWeeks. mlton-20100608/doc/guide/ImperativeTypeVariable0000644000076600000240000000407711404435634017775 0ustar mtfstaff ImperativeTypeVariable - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ImperativeTypeVariable
Home  Index  
In Standard ML, an imperative type variable is a type variable whose second character is a digit, as in '1a or '2b. Imperative type variables were used as an alternative to the ValueRestriction in an earlier version of SML, but no longer play a role. They are treated exactly as other type variables.


Last edited on 2004-11-29 22:58:32 by StephenWeeks. mlton-20100608/doc/guide/ImplementExceptions0000644000076600000240000000503011404435634017342 0ustar mtfstaff ImplementExceptions - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ImplementExceptions
Home  Index  
ImplementExceptions is a pass for the SXML IntermediateLanguage, invoked from SXMLSimplify.

Description

This pass implements exceptions.

Implementation

[WWW]implement-exceptions.sig [WWW]implement-exceptions.fun

Details and Notes


Last edited on 2006-11-02 17:54:18 by MatthewFluet. mlton-20100608/doc/guide/ImplementHandlers0000644000076600000240000000505611404435634016771 0ustar mtfstaff ImplementHandlers - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ImplementHandlers
Home  Index  
ImplementHandlers is a pass for the RSSA IntermediateLanguage, invoked from RSSASimplify.

Description

This pass implements the (threaded) exception handler stack.

Implementation

[WWW]implement-handlers.sig [WWW]implement-handlers.fun

Details and Notes


Last edited on 2006-11-02 17:54:11 by MatthewFluet. mlton-20100608/doc/guide/ImplementProfiling0000644000076600000240000000505111404435635017156 0ustar mtfstaff ImplementProfiling - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ImplementProfiling
Home  Index  
ImplementProfiling is a pass for the RSSA IntermediateLanguage, invoked from RSSASimplify.

Description

This pass implements profiling.

Implementation

[WWW]profile.sig [WWW]profile.fun

Details and Notes

See HowProfilingWorks.


Last edited on 2006-11-02 17:50:48 by MatthewFluet. mlton-20100608/doc/guide/ImplementSuffix0000644000076600000240000000712211404435635016472 0ustar mtfstaff ImplementSuffix - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ImplementSuffix
Home  Index  
ImplementSuffix is a pass for the SXML IntermediateLanguage, invoked from SXMLSimplify.

Description

This pass implements the TopLevel_setSuffix primitive, which installs a function to exit the program.

Implementation

[WWW]implement-suffix.sig [WWW]implement-suffix.fun

Details and Notes

ImplementSuffix works by introducing a new ref cell to contain the function of type unit -> unit that should be called on program exit.

  • The following code (appropriately alpha-converted) is appended to the beginning of the SXML program:

        val z_0 = 
          fn a_0 => 
          let
             val x_0 = 
                "toplevel suffix not installed"
             val x_1 = 
                MLton_bug (x_0)
          in
             x_1
          end
       val topLevelSuffixCell = 
          Ref_ref (z_0)
    

  • Any occurrence of

       val x_0 = 
          TopLevel_setSuffix (f_0)
    
    is rewritten to
       val x_0 = 
          Ref_assign (topLevelSuffixCell, f_0)
    

  • The following code (appropriately alpha-converted) is appended to the end of the SXML program:

       val f_0 = 
          Ref_deref (topLevelSuffixCell)
       val z_0 = 
          ()
       val x_0 = 
          f_0 z_0
    


Last edited on 2006-11-02 17:53:06 by MatthewFluet. mlton-20100608/doc/guide/Index0000644000076600000240000004267511404435634014435 0ustar mtfstaff Index - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Index
Home  Index  
There are 351 pages.

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | R | S | T | U | V | W | X | Z

A

AccessControl
AdamGoode
AdmitsEquality
Alice
AllocateRegisters
AndreiFormiga
ArrayLiteral
AST

B

BasisLibrary
Bug
Bugs20041109
Bugs20051202
Bugs20070826
Bugs20100608

C

CallGraph
CallingFromCToSML
CallingFromSMLToC
CallingFromSMLToCFunctionPointer
Changelog
ChrisClearwater
Chunkify
CKitLibrary
Closure
ClosureConvert
CMinusMinus
CombineConversions
CommonArg
CommonBlock
CommonSubexp
CompilationManager
CompilerOverview
CompileTimeOptions
CompilingWithSMLNJ
ConcurrentML
ConcurrentMLImplementation
ConstantPropagation
Contact
Contify
CoreML
CoreMLSimplify
CreatingPages
Credits
CrossCompiling

D

DeadCode
DeepFlatten
DefineTypeBeforeUse
DefinitionOfStandardML
Defunctorize
Developers
Development
Documentation
Drawbacks

E

Eclipse
EditingPages
Elaborate
Emacs
EmacsBgBuildMode
EmacsDefUseMode
Enscript
EqualityType
EqualityTypeVariable
EtaExpansion
eXene

F

FAQ
Features
FirstClassPolymorphism
Fixpoints
Flatten
Fold
Fold01N
ForeignFunctionInterface
ForeignFunctionInterfaceSyntax
ForeignFunctionInterfaceTypes
ForLoops
FrontEnd
FSharp
FunctionalRecordUpdate
fxp

G

GarbageCollection
GenerativeDatatype
GenerativeException
Glade
Globalize
GnuMP

H

HaMLet
HenryCejtin
History
Home
HowProfilingWorks
HowToAttachFile

I

Identifier
Immutable
ImperativeTypeVariable
ImplementExceptions
ImplementHandlers
ImplementProfiling
ImplementSuffix
Index
InfixingOperators
Inline
InsertLimitChecks
InsertSignalChecks
Installation
IntermediateLanguage
IntroduceLoops

J

JesperLouisAndersen
JohnnyAndersen

K

KnownCase

L

LambdaCalculus
LambdaFree
LanguageChanges
Lazy
Libraries
LibrarySupport
License
LineDirective
LLVM
LocalFlatten
LocalRef
LoopInvariant

M

Machine
ManualPage
MatchCompilation
MatchCompile
MatthewFluet
mGTK
MichaelNorrish
MikeThomas
ML
MLBasis
MLBasisAnnotationExamples
MLBasisAnnotations
MLBasisAvailableLibraries
MLBasisExamples
MLBasisPathMap
MLBasisSyntaxAndSemantics
MLj
MLKit
MLLex
MLmon
MLNLFFI
MLNLFFIGen
MLNLFFIImplementation
MLRISCLibrary
MLtonArray
MLtonBinIO
MLtonCont
MLtonContIsolateImplementation
MLtonExn
MLtonFinalizable
MLtonGC
MLtonIntInf
MLtonIO
MLtonItimer
MLtonMonoArray
MLtonMonoVector
MLtonPlatform
MLtonPointer
MLtonProcEnv
MLtonProcess
MLtonProfile
MLtonRandom
MLtonReal
MLtonRlimit
MLtonRusage
MLtonSignal
MLtonSocket
MLtonStructure
MLtonSyslog
MLtonTextIO
MLtonThread
MLtonVector
MLtonWeak
MLtonWord
MLtonWorld
MLYacc
MoinMoin
Monomorphise
MoscowML
Multi
Mutable

N

NeedsReview
NumericLiteral

O

ObjectOrientedProgramming
OCaml
OpenGL
OperatorPrecedence
OptionalArguments
OrphanedPages
OtherSites
Overloading

P

PackedRepresentation
PageSize
ParallelMove
Performance
PhantomType
PlatformSpecificNotes
PolyEqual
PolyHash
PolyML
PolymorphicEquality
Polyvariance
Poplog
PortingMLton
PrecedenceParse
Printf
PrintfGentle
ProductType
Profiling
ProfilingAllocation
ProfilingCounts
ProfilingTheStack
ProfilingTime
Projects
Pronounce
PropertyList

R

RayRacine
Reachability
Redundant
RedundantTests
References
RefFlatten
Regions
Release20041109
Release20051202
Release20070826
Release20100608
ReleaseChecklist
RemoveUnused
Restore
ReturnStatement
RSSA
RSSAShrink
RSSASimplify
RunningOnAIX
RunningOnAlpha
RunningOnAMD64
RunningOnARM
RunningOnCygwin
RunningOnDarwin
RunningOnFreeBSD
RunningOnHPPA
RunningOnHPUX
RunningOnIA64
RunningOnLinux
RunningOnMinGW
RunningOnNetBSD
RunningOnOpenBSD
RunningOnPowerPC
RunningOnPowerPC64
RunningOnS390
RunningOnSolaris
RunningOnSparc
RunningOnX86
RunTimeOptions

S

ScopeInference
SelfCompiling
Serialization
ShowBasis
ShowProf
Shrink
SimplifyTypes
SMLNET
SMLNJ
SMLNJDeviations
SMLNJLibrary
SMLofNJStructure
SMLSharp
Sources
SpaceSafety
SSA
SSA2
SSA2Simplify
SSASimplify
Stabilizers
StandardML
StandardMLBooks
StandardMLGotchas
StandardMLHistory
StandardMLImplementations
StandardMLPortability
StandardMLTutorials
StaticSum
StephenWeeks
StyleGuide
Subversion
SuccessorML
SureshJagannathan
Swerve
SXML
SXMLShrink
SXMLSimplify
SyntacticConventions
SystemInfo

T

Talk
TalkDiveIn
TalkFolkLore
TalkFromSMLTo
TalkHowHigherOrder
TalkHowModules
TalkHowPolymorphism
TalkMLtonApproach
TalkMLtonFeatures
TalkMLtonHistory
TalkStandardML
TalkWholeProgram
TILT
TipsForWritingConciseSML
TitleIndex
ToMachine
TomMurphy
ToRSSA
ToSSA2
TrustedGroup
TypeChecking
TypeConstructor
TypeIndexedValues
TypeVariableScope

U

Unicode
UniversalType
UnresolvedBugs
UnsafeStructure
Useless
Users
Utilities

V

ValueRestriction
VariableArityPolymorphism
Variant
VesaKarvonen

W

WantedPages
WarnUnusedAnomalies
WebSite
WesleyTerpstra
WholeProgramOptimization
WikiMacros
WikiName
WikiTool
WishList

X

XML
XMLShrink
XMLSimplify
XMLSimplifyTypes

Z

Zone
ZZZOrphanedPages


mlton-20100608/doc/guide/index.html0000644000076600000240000000535011404435634015425 0ustar mtfstaff Home - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Home
Home  Index  

What is MLton?

MLton is an open-source, whole-program, optimizing Standard ML compiler.

What's new?

Next steps


Last edited on 2010-06-08 14:36:16 by MatthewFluet. mlton-20100608/doc/guide/InfixingOperators0000644000076600000240000003257511404435634017036 0ustar mtfstaff InfixingOperators - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION InfixingOperators
Home  Index  
Fixity specifications are not part of signatures in Standard ML. When one wants to use a module that provides functions designed to be used as infix operators there are several obvious alternatives:
  • Use only prefix applications. Unfortunately there are situations where infix applications lead to considerably more readable code.

  • Make the fixity declarations at the top-level. This may lead to collisions and may be unsustainable in a large project. Pollution of the top-level should be avoided.

  • Make the fixity declarations at each scope where you want to use infix applications. The duplication becomes inconvenient if the operators are widely used. Duplication of code should be avoided.

  • Use non-standard extensions, such as the ML Basis system to control the scope of fixity declarations. This has the obvious drawback of reduced portability.

  • Reuse existing infix operator symbols (^, +, -, ...). This can be convenient when the standard operators aren't needed in the same scope with the new operators. On the other hand, one is limited to the standard operator symbols and the code may appear confusing.

None of the obvious alternatives is best in every case. The following describes a slightly less obvious alternative that can sometimes be useful. The idea is to approximate Haskell's special syntax for treating any identifier enclosed in grave accents (backquotes) as an infix operator. In Haskell, instead of writing the prefix application f x y one can write the infix application x `f` y.

Infixing operators

Let's first take a look at the definitions of the operators:

infix  3 <\     fun x <\ f = fn y => f (x, y)     (* Left section      *)
infix  3 \>     fun f \> y = f y                  (* Left application  *)
infixr 3 />     fun f /> y = fn x => f (x, y)     (* Right section     *)
infixr 3 </     fun x </ f = f x                  (* Right application *)

infix  2 o  (* See motivation below *)
infix  0 := 
The left and right sectioning operators, <\ and />, are useful in SML for partial application of infix operators. ML For the Working Programmer describes curried functions secl and secr for the same purpose on pages 179-181. For example,
List.map (op- /> y) 
is a function for subtracting y from a list of integers and
List.exists (x <\ op=) 
is a function for testing whether a list contains an x.

Together with the left and right application operators, \> and </, the sectioning operators provide a way to treat any binary function (i.e. a function whose domain is a pair) as an infix operator. In general,

x0 <\f1\> x1 <\f2\> x2 ... <\fN\> xN  =  fN (... f2 (f1 (x0, x1), x2) ..., xN)
and
xN </fN/> ... x2 </f2/> x1 </f1/> x0  =  fN (xN, ... f2 (x2, f1 (x1, x0)) ...) 

Examples

As a fairly realistic example, consider providing a function for sequencing comparisons:

structure Order (* ... *) =
   struct
      (* ... *)
      val orWhenEq = fn (EQUAL, th) => th ()
                      | (other,  _) => other
      (* ... *)
   end 
Using orWhenEq and the infixing operators, one can write a compare function for triples as
fun compare (fad, fbe, fcf) ((a, b, c), (d, e, f)) =
    fad (a, d) <\Order.orWhenEq\> `fbe (b, e) <\Order.orWhenEq\> `fcf (c, f)
where ` is defined as
fun `f x = fn () => f x
Although orWhenEq can be convenient (try rewriting the above without it), it is probably not useful enough to be defined at the top level as an infix operator. Fortunately we can use the infixing operators and don't have to.

Another fairly realistic example would be to use the infixing operators with the technique described on the Printf page. Assuming that you would have a Printf module binding printf, `, and formatting combinators named int and string, you could write

let open Printf in
  printf (`"Here's an int "<\int\>" and a string "<\string\>".") 13 "foo" end 
without having to duplicate the fixity declarations. Alternatively, you could write
P.printf (P.`"Here's an int "<\P.int\>" and a string "<\P.string\>".") 13 "foo" 
assuming you have the made the binding
structure P = Printf

Application and piping operators

The left and right application operators may also provide some notational convenience on their own. In general,

f \> x1 \> ... \> xN = f x1 ... xN 
and
xN </ ... </ x1 </ f = f x1 ... xN 

If nothing else, both of them can eliminate parentheses. For example,

foo (1 + 2) = foo \> 1 + 2 

The left and right application operators are related to operators that could be described as the right and left piping operators:

infix  1 >|     val op>| = op</      (* Left pipe *)
infixr 1 |<     val op|< = op\>      (* Right pipe *) 

As you can see, the left and right piping operators, >| and |<, are the same as the right and left application operators, respectively, except the associativities are reversed and the binding strength is lower. They are useful for piping data through a sequence of operations. In general,

  x >| f1 >| ... >| fN
= fN (... (f1 x) ...)
= (fN o ... o f1) x 
and
  fN |< ... |< f1 |< x
= fN (... (f1 x) ...)
= (fN o ... o f1) x 

The right piping operator, |<, is provided by the Haskell prelude as $. It can be convenient in CPS or continuation passing style.

A use for the left piping operator is with parsing combinators. In a strict language, like SML, eta-reduction is generally unsafe. Using the left piping operator, parsing functions can be formatted conveniently as

fun parsingFunc input =
   input >| (* ... *)
         || (* ... *)
         || (* ... *) 
where || is supposed to be a combinator provided by the parsing combinator library.

About precedences

You probably noticed that we redefined the precedences of the function composition operator o and the assignment operator :=. Doing so is not strictly necessary, but can be convenient and should be relatively safe. Consider the following motivating examples from Wesley W. Terpstra relying on the redefined precedences:

Word8.fromInt o Char.ord o s <\String.sub
(* Combining sectioning and composition *)

x := s <\String.sub\> i
(* Assigning the result of an infixed application *) 

In imperative languages, assignment usually has the lowest precedence (ignoring statement separators). The precedence of := in the Basis library is perhaps unnecessarily high, because an expression of the form r := x always returns a unit, which makes little sense to combine with anything. Dropping := to the lowest precedence level makes it behave more like in other imperative languages.

The case for o is different. With the exception of before and :=, it doesn't seem to make much sense to use o with any of the operators defined by the Basis library in an unparenthesized expression. This is simply because none of the other operators deal with functions. It would seem that the precedence of o could be chosen completely arbitrarily from the set {1, ..., 9} without having any adverse effects with respect to other infix operators defined by the Basis library.

Design of the symbols

The closest approximation of Haskell's x `f` y syntax achievable in Standard ML would probably be something like x `f^ y, but ^ is already used for string concatenation by the Basis library. Other combinations of the characters ` and ^ would be possible, but none seems clearly the best visually. The symbols <\, \>, </ and /> are reasonably concise and have a certain self-documenting appearance and symmetry, which can help to remember them. As the names suggest, the symbols of the piping operators >| and |< are inspired by Unix shell pipelines.

Also see


Last edited on 2009-10-22 12:20:45 by RanAriGur. mlton-20100608/doc/guide/Inline0000644000076600000240000000614111404435635014571 0ustar mtfstaff Inline - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Inline
Home  Index  
Inline is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass inlines SSA functions using a size-based metric.

Implementation

[WWW]inline.sig [WWW]inline.fun

Details and Notes

The Inline pass can be invoked to use one of three metrics:

  • NonRecursive(product, small) -- inline any function satisfying (numCalls - 1) * (size - small) <= product, where numCalls is the static number of calls to the function and size is the size of the function.

  • Leaf(size) -- inline any leaf function smaller than size

  • LeafNoLoop(size) -- inline any leaf function without loops smaller than size


Last edited on 2006-11-02 17:31:06 by MatthewFluet. mlton-20100608/doc/guide/InsertLimitChecks0000644000076600000240000000476511404435635016751 0ustar mtfstaff InsertLimitChecks - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION InsertLimitChecks
Home  Index  
InsertLimitChecks is a pass for the RSSA IntermediateLanguage, invoked from RSSASimplify.

Description

This pass inserts limit checks.

Implementation

[WWW]limit-check.sig [WWW]limit-check.fun

Details and Notes


Last edited on 2006-11-02 17:51:39 by MatthewFluet. mlton-20100608/doc/guide/InsertSignalChecks0000644000076600000240000000477111404435634017104 0ustar mtfstaff InsertSignalChecks - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION InsertSignalChecks
Home  Index  
InsertSignalChecks is a pass for the RSSA IntermediateLanguage, invoked from RSSASimplify.

Description

This pass inserts signal checks.

Implementation

[WWW]limit-check.sig [WWW]limit-check.fun

Details and Notes


Last edited on 2006-11-02 17:36:04 by MatthewFluet. mlton-20100608/doc/guide/Installation0000644000076600000240000001167011404435635016017 0ustar mtfstaff Installation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Installation
Home  Index  
MLton runs on a variety of platforms and is distributed in both source and binary form. The format for the binary package depends on the platform. The binary package will install under /usr or /usr/local, depending on the platform. A .tgz or .tbz binary package should be extracted in the root directory. If you install MLton somewhere else, you must set the lib variable in the /usr/bin/mlton script to the directory that contains the libraries (/usr/lib/mlton by default).

MLton requires that you have the GNU multiprecision library installed on your machine. MLton must be able to find both the gmp.h include file and the libgmp.a (or libgmp.so or libgmp.dylib) library. If you see the error message gmp.h: No such file or directory, you should copy gmp.h to /usr/lib/mlton/self/include. If you see the error message /usr/bin/ld: cannot find -lgmp, you should add a -link-opt -L argument in the /usr/bin/mlton script so that the linker can find libgmp. If, for example, libgmp.a is in /tmp, then add -link-opt -L/tmp.

Installation of MLton creates the following files and directories.

  • /usr/bin/mllex
    The MLLex lexer generator.

  • /usr/bin/mlnlffigen
    The ML-NLFFI tool.

  • /usr/bin/mlprof
    A Profiling tool.

  • /usr/bin/mlton
    A script to call the compiler. This script may be moved anywhere, however, it makes use of files in /usr/lib/mlton.

  • /usr/bin/mlyacc
    The MLYacc parser generator.

  • /usr/lib/mlton
    Directory containing libraries and include files needed during compilation.

  • /usr/share/man/man1/mllex.1, mlnlffigen.1, mlprof.1, mlton.1, mlyacc.1
    Man pages.

  • /usr/share/doc/mlton
    Directory containing the user guide for MLton, mllex, and mlyacc, as well as example SML programs (in the examples dir), and license information.

Hello, World!

Once you have installed MLton, create a file called hello-world.sml with the following contents.

print "Hello, world!\n";
Now create an executable, hello-world, with the following command.
mlton hello-world.sml
You can now run hello-world to verify that it works. There are more small examples in /usr/share/doc/mlton/examples.

Installation on Cygwin

When installing the Cygwin tgz, you should use Cygwin's bash and tar. The use of an archiving tool that is not aware of Cygwin's mounts will put the files in the wrong place.


Last edited on 2007-08-30 20:06:41 by MatthewFluet. mlton-20100608/doc/guide/IntermediateLanguage0000644000076600000240000000547011404435635017435 0ustar mtfstaff IntermediateLanguage - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION IntermediateLanguage
Home  Index  
MLton uses a number of intermediate languages in translating from the input source program to low-level code. Here is a list in the order which they are translated to.


Last edited on 2004-11-29 02:16:14 by MatthewFluet. mlton-20100608/doc/guide/IntroduceLoops0000644000076600000240000000566611404435634016336 0ustar mtfstaff IntroduceLoops - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION IntroduceLoops
Home  Index  
IntroduceLoops is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass rewrites any SSA function that calls itself in tail position into one with a local loop and no self tail calls.

A SSA function like

fun F (arg_0, arg_1) = L_0 ()
  ...
  L_16 (x_0)
    ...
    F (z_0, z_1) Tail
  ...
becomes
fun F (arg_0', arg_1') = loopS_0 ()
  loopS_0 ()
    loop_0 (arg_0', arg_1')
  loop_0 (arg_0, arg_1)
    L_0 ()
  ...
  L_16 (x_0)
    ...
    loop_0 (z_0, z_1)
  ...

Implementation

[WWW]introduce-loops.sig [WWW]introduce-loops.fun

Details and Notes


Last edited on 2006-11-02 17:35:30 by MatthewFluet. mlton-20100608/doc/guide/JesperLouisAndersen0000644000076600000240000000763111404435634017303 0ustar mtfstaff JesperLouisAndersen - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION JesperLouisAndersen
Home  Index  

Jesper Louis Andersen

Jesper Louis Andersen is an undergraduate student at DIKU, the department of computer science, Copenhagen university. His contributions to MLton are few, though he has made the port of MLton to the NetBSD and OpenBSD platforms.

His general interests in computer science are compiler theory, language theory, algorithms and datastructures and programming. His assets are his general knowledge of UNIX systems, knowledge of system administration, knowledge of operating system kernels; NetBSD in particular.

He was employed by the university as a system administrator for 2 years, which has set him back somewhat in his studies. Currently he is trying to learn mathematics (real analysis, general topology, complex functional analysis and algebra).


Projects using MLton

A register allocator

For internal use at a compiler course at DIKU. It is written in the literate programming style and implements the Iterated Register Coalescing algorithm by Lal George and Andrew Appel [WWW]http://citeseer.ist.psu.edu/george96iterated.html. The status of the project is that it is unfinished. Most of the basic parts of the algorithm is done, but the interface to the students (simple) datatype takes some conversion.

A configuration management system in SML

At this time, only loose plans exists for this. The plan is to build a Configuration Management system on the principles of the OpenCM system, see [WWW]http://www.opencm.org/docs.html. The basic idea is to unify "naming" and "identity" into one by uniquely identifying all objects managed in the repository by the use of cryptographic checksums. This mantra guides the rest of the system, providing integrity, accessibility and confidentiality.


Last edited on 2004-12-06 13:45:22 by JesperLouisAndersen. mlton-20100608/doc/guide/JohnnyAndersen0000644000076600000240000000376411404435634016307 0ustar mtfstaff JohnnyAndersen - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION JohnnyAndersen
Home  Index  
Johnny Andersen (aka Anoq of the Sun)

Here is a picture in front of the academy building at the University of Athens, Greece, taken in September 2003.

anoq.jpg


Last edited on 2004-10-27 18:12:11 by eponym. mlton-20100608/doc/guide/KnownCase0000644000076600000240000001021011404435634015232 0ustar mtfstaff KnownCase - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION KnownCase
Home  Index  
KnownCase is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass duplicates and simplifies Case transfers when the constructor of the scrutinee is known.

Uses Restore.

For example, the program

val rec last =
   fn [] => 0
    | [x] => x
    | _ :: l => last l

val _ = 1 + last [2, 3, 4, 5, 6, 7]
gives rise to the SSA function
fun last_0 (x_142) = loopS_1 ()
  loopS_1 ()
    loop_11 (x_142)
  loop_11 (x_143)
    case x_143 of
      nil_1 => L_73 | ::_0 => L_74
  L_73 ()
    return global_5
  L_74 (x_145, x_144)
    case x_145 of
      nil_1 => L_75 | _ => L_76
  L_75 ()
    return x_144
  L_76 ()
    loop_11 (x_145)
which is simplified to
fun last_0 (x_142) = loopS_1 ()
  loopS_1 ()
    case x_142 of
      nil_1 => L_73 | ::_0 => L_118
  L_73 ()
    return global_5
  L_118 (x_230, x_229)
    L_74 (x_230, x_229, x_142)
  L_74 (x_145, x_144, x_232)
    case x_145 of
      nil_1 => L_75 | ::_0 => L_114
  L_75 ()
    return x_144
  L_114 (x_227, x_226)
    L_74 (x_227, x_226, x_145)

Implementation

[WWW]known-case.sig [WWW]known-case.fun

Details and Notes

One interesting aspect of KnownCase, is that it often has the effect of unrolling list traversals by one iteration, moving the nil/:: check to the end of the loop, rather than the beginning.


Last edited on 2006-11-02 17:54:28 by MatthewFluet. mlton-20100608/doc/guide/LambdaCalculus0000644000076600000240000000363011404435634016226 0ustar mtfstaff LambdaCalculus - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LambdaCalculus
Home  Index  
The [WWW]lambda calculus is the formal system underlying Standard ML.


Last edited on 2006-03-28 00:58:46 by StephenWeeks. mlton-20100608/doc/guide/LambdaFree0000644000076600000240000000660511404435635015342 0ustar mtfstaff LambdaFree - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LambdaFree
Home  Index  
LambdaFree is an analysis pass for the SXML IntermediateLanguage, invoked from ClosureConvert.

Description

This pass descends the entire SXML program and attaches a property to each Lambda PrimExp.t in the program. Then, you can use lambdaFree and lambdaRec to get free variables of that Lambda.

Implementation

[WWW]lambda-free.sig [WWW]lambda-free.fun

Details and Notes

For Lambdas bound in a Fun dec, lambdaFree gives the union of the frees of the entire group of mutually recursive functions. Hence, lambdaFree for every Lambda in a single Fun dec is the same. Furthermore, for a Lambda bound in a Fun dec, lambdaRec gives the list of other functions bound in the same dec defining that Lambda. For example:

val rec f = fn x => ... y ... g ... f ...
and g = fn z => ... f ... w ...
 * lambdaFree(fn x =>) = [y, w]
 * lambdaFree(fn z =>) = [y, w]
 * lambdaRec(fn x =>) = [g, f]
 * lambdaRec(fn z =>) = [f]


Last edited on 2006-11-02 17:37:38 by MatthewFluet. mlton-20100608/doc/guide/LanguageChanges0000644000076600000240000001063411404435634016370 0ustar mtfstaff LanguageChanges - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LanguageChanges
Home  Index  
We are sometimes asked to modify MLton to change the language it compiles. In short, we are very conservative about making such changes. There are a number of reasons for this.
  • The Definition of Standard ML is an extremely high standard of specification. The value of the Definition would be significantly diluted by changes that are not specified at an equally high level, and the dilution increases with the complexity of the language change and its interaction with other language features.

  • The SML community is small and there are a number of SML implementations. Without an agreed-upon standard, it becomes very difficult to port programs between compilers, and the community would be balkanized.

  • Our main goal is to enable programmers to be as effective as possible with MLton/SML. There are a number of improvements other than language changes that we could spend our time on that would provide more benefit to programmers.

  • The more the language that MLton compiles changes over time, the more difficult it is to use MLton as a stable platform for serious program development.

Despite these drawbacks, we have extended SML in a couple of cases.

We allow these language extensions because they provide functionality that is impossible to achieve without them. The Definition does not define a foreign function interface. So, we must either extend the language or greatly restrict the class of programs that can be written. Similarly, the Definition does not provide a mechanism for namespace control at the module level, making it impossible to deliver packaged libraries and have a hope of users using them without name clashes. The ML Basis system addresses this problem. We have also provided a formal specification of the ML Basis system at the level of the Definition.

Also see


Last edited on 2007-08-15 22:06:40 by MatthewFluet. mlton-20100608/doc/guide/Lazy0000644000076600000240000000726611404435635014303 0ustar mtfstaff Lazy - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Lazy
Home  Index  
In a lazy (or non-strict) language, the arguments to a function are not evaluated before calling the function. Instead, the arguments are suspended and only evaluated by the function if needed.

Standard ML is an eager (or strict) language, not a lazy language. However, it is easy to delay evaluation of an expression in SML by creating a thunk, which is a nullary function. In SML, a thunk is written fn () => e. Another essential feature of laziness is memoization, meaning that once a suspended argument is evaluated, subsequent references look up the value. We can express this in SML with a function that maps a thunk to a memoized thunk.

signature LAZY =
   sig
      val lazy: (unit -> 'a) -> unit -> 'a
   end

This is easy to implement in SML.

structure Lazy: LAZY =
   struct
      fun lazy (th: unit -> 'a): unit -> 'a =
         let
            val r: 'a option ref = ref NONE
         in
            fn () =>
            case !r of
               NONE =>
                  let
                     val a = th ()
                     val () = r := SOME a
                  in
                     a
                  end
             | SOME a => a
         end
   end


Last edited on 2005-01-26 20:33:55 by MatthewFluet. mlton-20100608/doc/guide/Libraries0000644000076600000240000001432011404435634015264 0ustar mtfstaff Libraries - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Libraries
Home  Index  
In theory every strictly conforming Standard ML program should run on MLton. However, often large SML projects use implementation specific features so some "porting" is required. Here is a partial list of software that is known to run on MLton.
  • Concurrency: ConcurrentML - distributed with MLton

  • Graphics

  • Lex-like lexer generator: MLLex - distributed with MLton.

  • Regular expressions

    • The SMLNJLibrary has a regexp module.

    • The internal MLton library has a regexp module which we hope to cleanup and make more accessible someday. See [WWW]regexp.sig [WWW]regexp.sml

  • SMLNJLibrary - distributed with MLton

  • CKitLibrary - distributed with MLton

  • ML-NLFFI - distributed with MLton

  • MLRISCLibrary - distributed with MLton

  • [WWW]sml-ext, a grab bag of libraries for MLton and other SML implementations (by Sean McLaughlin)

  • [WWW]sml-lib, a grab bag of libraries for MLton and other SML implementations (by TomMurphy)

  • Swerve, an HTTP server.

  • [WWW]Twelf. The version in CVS should compile out of the box.

  • XML: fxp

  • Yacc-like parser generator: MLYacc - distributed with MLton.

Ports in progress

Contact us for details on any of these.

More

More projects using MLton can be seen on the Users page.

Software for SML implementations other than MLton


Last edited on 2008-12-13 20:42:20 by MatthewFluet. mlton-20100608/doc/guide/LibrarySupport0000644000076600000240000002777211404435634016370 0ustar mtfstaff LibrarySupport - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LibrarySupport
Home  Index  
MLton supports both linking to and creating system-level libraries. While Standard ML libraries should be designed with the [MLBasis] system to work with other Standard ML programs, system-level library support allows MLton to create libraries for use by other programming languages. Even more importantly, system-level library support allows MLton to access libraries from other languages. This article will explain how to use libraries portably with MLton.

The Basics

A Dynamic Shared Object (DSO) is a piece of executable code written in a format understood by the operating system. Executable programs and dynamic libraries are the two most common examples of a DSO. They are called shared because if they are used more than once, they are only loaded once into main memory. For example, if you start two instances of your web browser (an executable), there may be two processes running, but the program code of the executable is only loaded once. A dynamic library, for example a graphical toolkit, might be used by several different executable programs, each possibly running multiple times. Nevertheless, the dynamic library is only loaded once and it's program code is shared between all of the processes.

In addition to program code, DSOs contain a table of textual strings called symbols. These are used in order to make the DSO do something useful, like execute. For example, on linux the symbol _start refers to the point in the program code where the operating system should start executing the program. Dynamic libraries generally provide many symbols, corresponding to functions which can be called and variables which can be read or written. Symbols can be used by the DSO itself, or by other DSOs which require services.

When a DSO creates a symbol, this is called 'exporting'. If a DSO needs to use a symbol, this is called 'importing'. A DSO might need to use symbols defined within itself or perhaps from another DSO. In both cases, it is importing that symbol, but the scope of the import differs. Similarly, a DSO might export a symbol for use only within itself, or it might export a symbol for use by other DSOs. Some symbols are resolved at compile time by the linker (those used within the DSO) and some are resolved at runtime by the dynamic link loader (symbols accessed between DSOs).

Symbols in MLton

Symbols in MLton are both imported and exported via the [ForeignFunctionInterface]. The notation _import "symbolname" imports functions, _symbol "symbolname" imports variables, and _address "symbolname" imports an address. To create and export a symbol, _export "symbolname" creates a function symbol and _symbol "symbolname" 'alloc' creates and exports a variable. For details of the syntax and restrictions on the supported FFI types, read the [ForeignFunctionInterface] page. In this discussion it only matters that every FFI use is either an import or an export.

When exporting a symbol, MLton supports controlling the export scope. If the symbol should only be used within the same DSO, that symbol has 'private' scope. Conversely, if the symbol should also be available to other DSOs the symbol has 'public' scope. Generally, one should have as few public exports as possible. Since they are public, other DSOs will come to depend on them, limiting your ability to change them. You specify the export scope in MLton by putting private or public after the symbol's name in an FFI directive. eg: _export "foo" private: int->int; or _export "bar" public: int->int; .

For technical reasons, the linker and loader on various platforms need to know the scope of a symbol being imported. If the symbol is exported by the same DSO, use public or private as appropriate. If the symbol is exported by a different DSO, then the scope 'external' should be used to import it. Within a DSO, all references to a symbol must use the same scope. MLton will check this at compile time, reporting: symbol "foo" redeclared as public (previously external). This may cause linker errors. However, MLton can only check usage within Standard ML. All objects being linked into a resulting DSO must agree, and it is the programmer's responsibility to ensure this.

A summary symbol scopes:

  • private: used for symbols exported within a DSO only for use within that DSO

  • public: used for symbols exported within a DSO that may also be used outside that DSO

  • external: used for importing symbols from another DSO

  • All uses of a symbol within a DSO (both imports and exports) must agree on the symbol scope

Output Formats

MLton can create executables (-format executable) and dynamic shared libraries (-format library). To link a shared library, use -link-opt -l<dso_name>. The default output format is executable.

MLton can also create archives. An archive is not a DSO, but it does have a collection of symbols. When an archive is linked into a DSO, it is completely absorbed. Other objects being compiled into the DSO should refer to the public symbols in the archive as public, since they are still in the same DSO. However, in the interest of modular programming, private symbols in an archive cannot be used outside of that archive, even within the same DSO.

Although both executables and libraries are DSOs, some implementation details differ on some platforms. For this reason, MLton can create two types or archives. A normal archive (-format archive) is appropriate for linking into an executable. Conversely, a libarchive (-format libarchive) should be used if it will be linked into a dynamic library.

When MLton does not create an executable, it creates two special symbols. The symbol libname_open is a function which must be called before any other symbols are accessed. The libname is controlled by the -libname compile option and defaults to the name of the output, with any prefixing lib stripped (eg: foo -> foo, libfoo -> foo). The symbol libname_close is a function which should be called to clean up memory once done.

Summary of -format options:

  • executable: create an executable (a DSO)

  • library: create a dynamic shared library (a DSO)

  • archive: create an archive of symbols (not a DSO) that can be linked into an executable

  • libarchive: create an archive of symbols (not a DSO) that can be linked into a library

Related options:

  • -libname x: controls the name of the special _open and _close functions.

Interfacing with C

MLton can generate a C header file. When the output format is not an executable, it creates one by default named libname.h. This can be overridden with -export-header foo.h. This header file should be included by any C files using the exported Standard ML symbols.

If C is being linked with Standard ML into the same output archive or DSO, then the C code should #define PART_OF_LIBNAME before it includes the header file. This ensures that the C code is using the symbols with correct scope. Any symbols exported from C should also be marked using the PRIVATE/PUBLIC/EXTERNAL macros defined in the Standard ML export header. The declared C scope on exported C symbols should match the import scope used in Standard ML.

An example:

#define PART_OF_FOO
#include "foo.h"

PUBLIC int cFoo() {
  return smlFoo();
}

val () = _export "smlFoo" private: unit -> int; (fn () => 5)
val cFoo = _import "cFoo" public: unit -> int;

Operating specific details

On Windows, libarchive and archive are the same. However, depending on this will lead to portability problems. Windows is also especially sensitive to mixups of 'public' and 'external'. If an archive is linked, make sure it's symbols are imported as public. If a DLL is linked, make sure it's symbols are imported as external. Using external instead of public will result in link errors that __imp__foo is undefined. Using public instead of external will result in inconsistent function pointer addresses and failure to update the imported variables.

On Linux, libarchive and archive are different. Libarchives are quite rare, but necessary if creating a library from an archive. It is common for a library to provide both an archive and a dynamic library on this platform. The linker will pick one or the other, usually preferring the dynamic library. While a quirk of the operating system allows external import to work for both archives and libraries, portable projects should not depend on this behaviour. On other systems it can matter how the library is linked (static or dynamic).


Last edited on 2008-10-17 05:15:49 by VesaKarvonen. mlton-20100608/doc/guide/License0000644000076600000240000000771711404435634014746 0ustar mtfstaff License - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION License
Home  Index  

Web Site

In order to allow the maximum freedom for the future use of the content in this web site, we require that contributions to the web site be dedicated to the public domain. That means that you can only add works that are already in the public domain, or that you must hold the copyright on the work that you agree to dedicate the work to the public domain.

By contributing to this web site, you agree to dedicate your contribution to the public domain.

Software

As of 20050812, MLton software is licensed under the BSD-style license below. By contributing code to the project, you agree to release the code under this license. Contributors can retain copyright to their contributions by asserting copyright in their code. Contributors may also add to the list of copyright holders in doc/license/MLton-LICENSE, which appears below.

This is the license for MLton, a whole-program optimizing compiler for
the Standard ML programming language.  Send comments and questions to
MLton@mlton.org.

MLton COPYRIGHT NOTICE, LICENSE AND DISCLAIMER.

Copyright (C) 1999-2010 Henry Cejtin, Matthew Fluet, Suresh
   Jagannathan, and Stephen Weeks.
Copyright (C) 1997-2000 by the NEC Research Institute

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both the copyright notice and this permission notice and warranty
disclaimer appear in supporting documentation, and that the name of
the above copyright holders, or their entities, not be used in
advertising or publicity pertaining to distribution of the software
without specific, written prior permission.

The above copyright holders disclaim all warranties with regard to
this software, including all implied warranties of merchantability and
fitness. In no event shall the above copyright holders be liable for
any special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether in an
action of contract, negligence or other tortious action, arising out
of or in connection with the use or performance of this software.


Last edited on 2006-11-02 17:39:56 by MatthewFluet. mlton-20100608/doc/guide/LineDirective0000644000076600000240000000525411404435634016104 0ustar mtfstaff LineDirective - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LineDirective
Home  Index  
To aid in the debugging of code produced by program generators such as [WWW]Noweb, MLton supports comments with line directives of the form  (*#line line.col "file"*). Here, line and col are sequences of decimal digits and file is the source file. The first character of a source file has the position 1.1. A line directive causes the front end to believe that the character following the right parenthesis is at the line and column of the specified file. A line directive only affects the reporting of error messages and does not affect program semantics (except for functions like MLton.Exn.history that report source file positions). Syntactically invalid line directives are ignored. To prevent incompatibilities with SML, the file name may not contain the character sequence *).


Last edited on 2007-11-07 19:07:39 by VesaKarvonen. mlton-20100608/doc/guide/LLVM0000644000076600000240000000526611404435634014133 0ustar mtfstaff LLVM - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LLVM
Home  Index  
[WWW]LLVM (Low Level Virtual Machine) is an abstract machine, optimizer, and code generator. It might make a nice backend for MLton, and there has been some discussion about this on the MLton list.

The latest is that LLVM's gcc variant has been used in place of gcc, and so there has been no work toward changing MLton to target LLVM's IL directly.

Also see


Last edited on 2006-09-04 20:25:17 by StephenWeeks. mlton-20100608/doc/guide/LocalFlatten0000644000076600000240000000524111404435634015722 0ustar mtfstaff LocalFlatten - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LocalFlatten
Home  Index  
LocalFlatten is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass flattens arguments to SSA blocks.

A block argument is flattened as long as it only flows to selects and there is some tuple constructed in this function that flows to it.

Implementation

[WWW]local-flatten.sig [WWW]local-flatten.fun

Details and Notes


Last edited on 2006-11-02 17:52:44 by MatthewFluet. mlton-20100608/doc/guide/LocalRef0000644000076600000240000001034311404435634015040 0ustar mtfstaff LocalRef - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LocalRef
Home  Index  
LocalRef is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pas optimizes ref cells local to a SSA function:

  • global refs only used in one function are moved to the function

  • refs only created, read from, and written to (i.e., don't escape) are converted into function local variables

Uses Multi and Restore.

Implementation

[WWW]local-ref.sig [WWW]local-ref.fun

Details and Notes

Moving a global ref requires the Multi analysis, because a global ref can only be moved into a function that is executed at most once.

Conversion of non-escaping refs is structured in three phases:

  • analysis -- a variable r = Ref_ref x escapes if

    • r is used in any context besides Ref_assign (r, _) or Ref_deref r

    • all uses r reachable from a (direct or indirect) call to Thread_copyCurrent are of the same flavor (either Ref_assign or Ref_deref); this also requires the Multi analysis.

  • transformation

    • rewrites r = Ref_ref x to r = x

    • rewrites _ = Ref_assign (r, y) to r = y

    • rewrites z = Ref_deref r to z = r Note that the resulting program violates the SSA condition.

  • Restore -- restore the SSA condition.


Last edited on 2006-11-02 17:46:41 by MatthewFluet. mlton-20100608/doc/guide/LoopInvariant0000644000076600000240000000525611404435634016145 0ustar mtfstaff LoopInvariant - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION LoopInvariant
Home  Index  
LoopInvariant is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass removes loop invariant arguments to local loops.

  loop (x, y)
    ...
  ... 
    loop (x, z) 
  ...
becomes
  loop' (x, y)
    loop (y)
  loop (y)
    ...
  ...
    loop (z)
  ...

Implementation

[WWW]loop-invariant.sig [WWW]loop-invariant.fun

Details and Notes


Last edited on 2006-11-02 17:57:42 by MatthewFluet. mlton-20100608/doc/guide/Machine0000644000076600000240000000641311404435635014721 0ustar mtfstaff Machine - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Machine
Home  Index  
Machine is an IntermediateLanguage, translated from RSSA by ToMachine and used as input by the Codegen.

Description

Machine is an Untyped IntermediateLanguage, corresponding to a abstract register machine.

Implementation

[WWW]machine.sig [WWW]machine.fun

Type Checking

The Machine IntermediateLanguage has a primitive type checker, which only checks some liveness properties.

[WWW]machine.sig [WWW]machine.fun

Details and Notes


Last edited on 2006-11-02 17:45:41 by MatthewFluet. mlton-20100608/doc/guide/ManualPage0000644000076600000240000000543311404435634015367 0ustar mtfstaff ManualPage - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ManualPage
Home  Index  
MLton is run from the command line with a collection of options followed by a file name and a list of files to compile, assemble, and link with.
mlton [option ...] file.{c|mlb|o|sml} [file.{c|o|s|S} ...]
The simplest case is to run mlton foo.sml, where foo.sml contains a valid SML program, in which case MLton compiles the program to produce an executable foo. Since MLton does not support separate compilation, the program must be the entire program you wish to compile. However, the program may refer to signatures and structures defined in the Basis Library.

Larger programs, spanning many files, can be compiled with the ML Basis system. In this case, mlton foo.mlb will compile the complete SML program described by the basis foo.mlb, which may specify both SML files and additional bases.

Next Steps


Last edited on 2010-04-06 17:48:05 by MatthewFluet. mlton-20100608/doc/guide/MatchCompilation0000644000076600000240000000446611404435634016615 0ustar mtfstaff MatchCompilation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MatchCompilation
Home  Index  
Match compilation is the process of translating an SML match into a nested tree (or dag) of simple case expressions and tests.

MLton's match compiler is described here.

Match compilation in other compilers


Last edited on 2005-07-26 18:19:23 by StephenWeeks. mlton-20100608/doc/guide/MatchCompile0000644000076600000240000001137611404435634015725 0ustar mtfstaff MatchCompile - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MatchCompile
Home  Index  
MatchCompile is a translation pass, agnostic in the IntermediateLanguages between which it translates.

Description

Match compilation converts a case expression with nested patterns into a case expression with flat patterns.

Implementation

[WWW]match-compile.sig [WWW]match-compile.fun

Details and Notes

val matchCompile:
   {caseType: Type.t, (* type of entire expression *)
    cases: (NestedPat.t * ((Var.t -> Var.t) -> Exp.t)) vector,
    conTycon: Con.t -> Tycon.t,
    region: Region.t,
    test: Var.t,
    testType: Type.t,
    tyconCons: Tycon.t -> {con: Con.t, hasArg: bool} vector}
   -> Exp.t * (unit -> ((Layout.t * {isOnlyExns: bool}) vector) vector)

matchCompile is complicated by the desire for modularity between the match compiler and its caller. Its caller is responsible for building the right hand side of a rule p => e. On the other hand, the match compiler is responsible for destructing the test and binding new variables to the components. In order to connect the new variables created by the match compiler with the variables in the pattern p, the match compiler passes an environment back to its caller that maps each variable in p to the corresponding variable introduced by the match compiler.

The match compiler builds a tree of n-way case expressions by working from outside to inside and left to right in the patterns. For example,

case x of
  (_, C1 a) => e1
| (C2 b, C3 c) => e2
is translated to
let
   fun f1 a = e1
   fun f2 (b, c) = e2
in 
  case x of
     (x1, x2) =>
       (case x1 of
          C2 b' => (case x2 of
                      C1 a' => f1 a'
                    | C3 c' => f2(b',c')
                    | _ => raise Match)
        | _ => (case x2 of
                  C1 a'' => f1 a''
                | _ => raise Match))
end

Here you can see the necessity of abstracting out the ride hand sides of the cases in order to avoid code duplication. Right hand sides are always abstracted. The simplifier cleans things up. You can also see the new (primed) variables introduced by the match compiler and how the renaming works. Finally, you can see how the match compiler introduces the necessary default clauses in order to make a match exhaustive, i.e. cover all the cases.

The match compiler uses numCons and tyconCons to determine the exhaustivity of matches against constructors.


Last edited on 2006-11-02 17:35:55 by MatthewFluet. mlton-20100608/doc/guide/MatthewFluet0000644000076600000240000003041111404435634015760 0ustar mtfstaff MatthewFluet - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MatthewFluet
Home  Index  
Matthew Fluet ( [MAILTO]Matthew.Fluet@acm.org , [WWW]http://www.cs.rit.edu/~mtf ) is an Assistant Professor at the [WWW]Rochester Institute of Technology.

Current MLton projects:

  • general maintenance

  • release new version


Misc. and underspecified TODOs:


Last edited on 2010-04-02 20:55:52 by MatthewFluet. mlton-20100608/doc/guide/mGTK0000644000076600000240000000504211404435634014153 0ustar mtfstaff mGTK - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION mGTK
Home  Index  
[WWW]mGTK is a wrapper for [WWW]GTK+, a GUI toolkit.

We recommend using mGTK 0.93, which is not listed on their home page, but is available at the [WWW]file release page. To test it, after unpacking, do cd examples; make mlton, after which you should be able to run the many examples (signup-mlton, listview-mlton, ...).

Also see


Last edited on 2005-12-02 03:33:24 by StephenWeeks. mlton-20100608/doc/guide/MichaelNorrish0000644000076600000240000000463011404435634016262 0ustar mtfstaff MichaelNorrish - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MichaelNorrish
Home  Index  
I am a researcher at [WWW]NICTA, with a web-page [WWW]here.

I'm interested in MLton because of the chance that it might be a good vehicle for future implementations of the [WWW]HOL theorem-proving system. It's beginning to look as if one route forward will be to embed an SML interpreter into a MLton-compiled executable. I don't know if an extensible interpreter of the kind we're looking for already exists.


Last edited on 2005-04-05 06:48:34 by MichaelNorrish. mlton-20100608/doc/guide/MikeThomas0000644000076600000240000000374011404435634015415 0ustar mtfstaff MikeThomas - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MikeThomas
Home  Index  
Here is a picture at home in Brisbane, Queensland, Australia, taken in January 2004.

picture.jpg


Last edited on 2004-10-27 18:15:50 by StephenWeeks. mlton-20100608/doc/guide/ML0000644000076600000240000000370711404435634013667 0ustar mtfstaff ML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ML
Home  Index  
ML stands for meta language. ML was originally designed in the 1970s as a programming language to assist theorem proving in the logic LCF. In the 1980s, ML split into two variants, Standard ML and OCaml, both of which are still used today.


Last edited on 2004-12-06 06:00:35 by StephenWeeks. mlton-20100608/doc/guide/MLBasis0000644000076600000240000001041311404435634014641 0ustar mtfstaff MLBasis - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLBasis
Home  Index  
The ML Basis system extends Standard ML to support programming-in-the-very-large, namespace management at the module level, separate delivery of library sources, and more. While Standard ML modules are a sophisticated language for programming-in-the-large, it is difficult, if not impossible, to accomplish a number of routine namespace management operations when a program draws upon multiple libraries provided by different vendors.

The ML Basis system is a simple, yet powerful, approach that builds upon the programmer's intuitive notion (and The Definition of Standard ML's formal notion) of the top-level environment (a basis). The system is designed as a natural extension of Standard ML; the formal specification of the ML Basis system ([WWW]pdf) is given in the style of the Definition.

Here are some of the key features of the ML Basis system:

  1. Explicit file order: The order of files (and, hence, the order of evaluation) in the program is explicit. The ML Basis system's semantics are structured in such a way that for any well-formed project, there will be exactly one possible interpretation of the project's syntax, static semantics, and dynamic semantics.

  2. Implicit dependencies: A source file (corresponding to an SML top-level declaration) is elaborated in the environment described by preceding declarations. It is not necessary to explicitly list the dependencies of a file.

  3. Scoping and renaming: The ML Basis system provides mechanisms for limiting the scope of (i.e, hiding) and renaming identifiers.

  4. No naming convention for finding the file that defines a module. To import a module, its defining file must appear in some ML Basis file.

Next steps


Last edited on 2007-08-23 04:24:53 by MatthewFluet. mlton-20100608/doc/guide/MLBasisAnnotationExamples0000644000076600000240000001007311404435634020375 0ustar mtfstaff MLBasisAnnotationExamples - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLBasisAnnotationExamples
Home  Index  
Here are some example uses of MLBasisAnnotations.

Eliminate spurious warnings in automatically generated code

Programs that automatically generate source code can often produce nonexhaustive matches, relying on invariants of the generated code to ensure that the matches never fail. A programmer may wish to elide the nonexhaustive match warnings from this code, in order that legitimate warnings are not missed in a flurry of false positives. To do so, the programmer simply annotates the generated code with the nonexhaustiveMatch ignore annotation:

local
  $(GEN_ROOT)/gen-lib.mlb

  ann "nonexhaustiveMatch ignore" in
    foo.gen.sml
  end
in
  signature FOO
  structure Foo
end

Deliver a library

Standard ML libraries can be delivered via .mlb files. Authors of such libraries should strive to be mindful of the ways in which programmers may choose to compile their programs. For example, although the defaults for sequenceNonUnit and warnUnused are ignore and false, periodically compiling with these annotations defaulted to warn and true can help uncover likely bugs. However, a programmer is unlikely to be interested in unused modules from an imported library, and the behavior of sequenceNonUnit error may be incompatible with some libraries. Hence, a library author may choose to deliver a library as follows:

ann 
  "nonexhaustiveMatch warn" "redundantMatch warn"
  "sequenceNonUnit warn"
  "warnUnused true" "forceUsed"
in
  local
    file1.sml
    ...
    filen.sml
  in
    functor F1
    ...
    signature S1
    ...
    structure SN
    ...
  end
end

The annotations nonexhaustiveMatch warn, redundantMatch warn, and sequenceNonUnit warn have the obvious effect on elaboration. The annotations warnUnused true and forceUsed work in conjunction --- warning on any identifiers that do not contribute to the exported modules, and preventing warnings on exported modules that are not used in the remainder of the program. Many of the available libraries are delivered with these annotations.


Last edited on 2005-12-01 19:45:40 by StephenWeeks. mlton-20100608/doc/guide/MLBasisAnnotations0000644000076600000240000001163011404435634017061 0ustar mtfstaff MLBasisAnnotations - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLBasisAnnotations
Home  Index  
ML Basis annotations control options that affect the elaboration of SML source files. Conceptually, a basis file is elaborated in a default annotation environment (just as it is elaborated in an empty basis). The declaration ann "ann" in basdec end merges the annotation ann with the "current" annotation environment for the elaboration of basdec. To allow for future expansion, "ann" is lexed as a single SML string constant. To conveniently specify multiple annotations, the following derived form is provided:
ann "ann" ("ann")+ in basdec end ==>  ann "ann" in ann ("ann")+ in basdec end end

Here are the available annotations. In the explanation below, for annotations that take an argument, the first value listed is the default.

  • allowFFI {false|true} 
    If true, allow _address, _export, _import, and _symbol expressions to appear in source files. See ForeignFunctionInterface.

  • forceUsed 
    Force all identifiers in the basis denoted by the body of the ann to be considered used; use in conjunction with warnUnused true.

  • nonexhaustiveExnMatch {default|ignore} 
    If ignore, suppress errors and warnings about nonexhaustive matches that arise solely from unmatched exceptions. If default, follow the behavior of nonexhaustiveMatch.

  • nonexhaustiveMatch {warn|error|ignore} 
    If error or warn, report nonexhaustive matches. An error will abort a compile, while a warning will not.

  • redundantMatch {warn|error|ignore} 
    If error or warn, report redundant matches. An error will abort a compile, while a warning will not.

  • sequenceNonUnit {ignore|error|warn} 
    If error or warn, report when e1 is not of type unit in the sequence expression (e1; e2). This can be helpful in detecting curried applications that are mistakenly not fully applied. To silence spurious messages, you can use ignore e1.

  • warnUnused {false|true} 
    Report unused identifiers.

Next Steps


Last edited on 2010-06-01 20:12:20 by MatthewFluet. mlton-20100608/doc/guide/MLBasisAvailableLibraries0000644000076600000240000001150411404435635020302 0ustar mtfstaff MLBasisAvailableLibraries - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLBasisAvailableLibraries
Home  Index  
MLton comes with the following ML Basis files available.
  • $(SML_LIB)/basis/basis.mlb
    The Basis Library.

  • $(SML_LIB)/basis/basis-1997.mlb
    The (deprecated) 1997 version of the Basis Library.

  • $(SML_LIB)/basis/mlton.mlb
    The MLton structure and signatures.

  • $(SML_LIB)/basis/sml-nj.mlb
    The SMLofNJ structure and signature.

  • $(SML_LIB)/basis/unsafe.mlb
    The Unsafe structure and signature.

  • $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb
    Modules used by parsers built with MLYacc.

  • $(SML_LIB)/cml/cml.mlb
    ConcurrentML, a library for message-passing concurrency.

  • $(SML_LIB)/mlnlffi-lib/mlnlffi-lib.mlb
    ML-NLFFI, a library for foreign function interfaces.

  • $(SML_LIB)/mlrisc-lib/...
    MLRISCLibrary, a library for retargetable and optimizing compiler back ends.

  • $(SML_LIB)/smlnj-lib/...
    SMLNJLibrary, a collection of libraries distributed with SML/NJ.

  • $(SML_LIB)/ckit-lib/ckit-lib.mlb
    CKitLibrary, a library for C source code.

Basis fragments

There are a number of specialized ML Basis files for importing fragments of the Basis Library that can not be expressed within SML.

  • $(SML_LIB)/basis/pervasive-types.mlb
    The top-level types and constructors of the Basis Library.

  • $(SML_LIB)/basis/pervasive-exns.mlb
    The top-level exception constructors of the Basis Library.

  • $(SML_LIB)/basis/pervasive-vals.mlb
    The top-level values of the Basis Library, without infix status.

  • $(SML_LIB)/basis/overloads.mlb
    The top-level overloaded values of the Basis Library, without infix status.

  • $(SML_LIB)/basis/equal.mlb
    The polymorphic equality = and inequality <> values, without infix status.

  • $(SML_LIB)/basis/infixes.mlb
    The infix declarations of the Basis Library.

  • $(SML_LIB)/basis/pervasive.mlb
    The entire top-level value and type environment of the Basis Library, with infix status. This is the same as importing the above six MLB files.


Last edited on 2007-08-23 17:13:23 by MatthewFluet. mlton-20100608/doc/guide/MLBasisExamples0000644000076600000240000002056311404435634016347 0ustar mtfstaff MLBasisExamples - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLBasisExamples
Home  Index  
Here are some example uses of ML Basis files.

Complete program

Suppose your complete program consists of the files file1.sml, ..., filen.sml, which depend upon libraries lib1.mlb, ..., libm.mlb.
(* import libraries *)
lib1.mlb
...
libm.mlb

(* program files *)
file1.sml
...
filen.sml

The bases denoted by lib1.mlb, ..., libm.mlb are merged (bindings of names in later bases take precedence over bindings of the same name in earlier bases), producing a basis in which file1.sml, ..., filen.sml are elaborated, adding additional bindings to the basis.

Export filter

Suppose you only want to export certain structures, signatures, and functors from a collection of files.

local
  file1.sml
  ...
  filen.sml
in
  (* export filter here *)
  functor F
  structure S
end

While file1.sml, ..., filen.sml may declare top-level identifiers in addition to F and S, such names are not accessible to programs and libraries that import this .mlb.

Export filter with renaming

Suppose you want an export filter, but want to rename one of the modules.

local
  file1.sml
  ...
  filen.sml
in
  (* export filter, with renaming, here *)
  functor F
  structure S' = S
end

Note that functor F is an abbreviation for functor F = F, which simply exports an identifier under the same name.

Import filter

Suppose you only want to import a functor F from one library and a structure S from another library.

local
  lib1.mlb
in
  (* import filter here *)
  functor F
end
local
  lib2.mlb
in
  (* import filter here *)
  structure S
end
file1.sml
...
filen.sml

Import filter with renaming

Suppose you want to import a structure S from one library and another structure S from another library.

local
  lib1.mlb
in
  (* import filter, with renaming, here *)
  structure S1 = S
end
local
  lib2.mlb
in
  (* import filter, with renaming, here *)
  structure S2 = S
end
file1.sml
...
filen.sml

Full Basis

Since the Modules level of SML is the natural means for organizing program and library components, MLB files provide convenient syntax for renaming Modules level identifiers (in fact, renaming of functor identifiers provides a mechanism that is not available in SML). However, please note that .mlb files elaborate to full bases including top-level types and values (including infix status), in addition to structures, signatures, and functors. For example, suppose you wished to extend the Basis Library with an ('a, 'b) either datatype corresponding to a disjoint sum; the type and some operations should be available at the top-level; additionally, a signature and structure provide the complete interface.

We could use the following files.

either-sigs.sml

    signature EITHER_GLOBAL =
      sig
        datatype ('a, 'b) either = Left of 'a | Right of 'b
        val &  : ('a -> 'c) * ('b -> 'c) -> ('a, 'b) either -> 'c
        val && : ('a -> 'c) * ('b -> 'd) -> ('a, 'b) either -> ('c, 'd) either
      end
    
    signature EITHER =
      sig
        include EITHER_GLOBAL
        val isLeft  : ('a, 'b) either -> bool
        val isRight : ('a, 'b) either -> bool
        ...
      end
    

either-strs.sml

    structure Either : EITHER =
      struct
        datatype ('a, 'b) either = Left of 'a | Right of 'b
        fun f & g = fn x =>
          case x of Left z => f z | Right z => g z
        fun f && g = (Left o f) & (Right o g)
        fun isLeft x = ((fn _ => true) & (fn _ => false)) x
        fun isRight x = (not o isLeft) x
        ...
      end
    structure EitherGlobal : EITHER_GLOBAL = Either
    

either-infixes.sml

    infixr 3 & &&
    

either-open.sml

    open EitherGlobal
    

either.mlb

    either-infixes.sml
    local
      (* import Basis Library *)
      $(SML_LIB)/basis/basis.mlb
      either-sigs.sml
      either-strs.sml
    in
      signature EITHER
      structure Either
      either-open.sml
    end
    

A client that imports either.mlb will have access to neither EITHER_GLOBAL nor EitherGlobal, but will have access to the type either and the values & and && (with infix status) in the top-level environment. Note that either-infixes.sml is outside the scope of the local, because we want the infixes available in the implementation of the library and to clients of the library.


Last edited on 2005-12-02 04:21:48 by StephenWeeks. mlton-20100608/doc/guide/MLBasisPathMap0000644000076600000240000000641411404435634016122 0ustar mtfstaff MLBasisPathMap - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLBasisPathMap
Home  Index  
An ML Basis path map describes a map from ML Basis path variables (of the form $(VAR)) to file system paths. ML Basis path variables provide a flexible way to refer to libraries while allowing them to be moved without changing their clients.

The format of an mlb-path-map file is a sequence of lines; each line consists of two, white-space delimited tokens. The first token is a path variable VAR and the second token is the path to which the variable is mapped. The path may include path variables, which are recursively expanded.

The mapping from path variables to paths is initialized by reading a system-wide configuration file: /usr/lib/mlton/mlb-path-map. Additional path maps can be specified with -mlb-path-map and individual path variable mappings can be specified with -mlb-path-var (see CompileTimeOptions). Configuration files are processed from first to last and from top to bottom, later mappings take precedence over earlier mappings.

The compiler and system-wide configuration file makes the following path variables available.

    MLB path variable Description
    SML_LIB path to system-wide libraries, usually /usr/lib/mlton/sml
    TARGET_ARCH string representation of target architecture
    TARGET_OS string representation of target operating system


Last edited on 2010-04-06 17:43:43 by MatthewFluet. mlton-20100608/doc/guide/MLBasisSyntaxAndSemantics0000644000076600000240000001375611404435634020357 0ustar mtfstaff MLBasisSyntaxAndSemantics - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLBasisSyntaxAndSemantics
Home  Index  
An ML Basis (MLB) file should have the .mlb suffix and should contain a basis declaration.

Syntax

A basis declaration (basdec) must be one of the following forms.

  • basis basid = basexp (and basid = basexp)*

  • open basid1 ... basidn

  • local basdec in basdec end

  • basdec [;] basdec

  • structure strid [strid] (and strid[strid])*

  • signature sigid [sigid] (and sigid [sigid])*

  • functor funid [funid] (and funid [funid])*

  • path.sml, path.sig, or path.fun

  • path.mlb

  • ann "ann" in basdec end

A basis expression (basexp) must be of one the following forms.

  • bas basdec end

  • basid

  • let basdec in basexp end

Nested SML-style comments (enclosed with (* and *)) are ignored (but LineDirectives are recognized).

Paths can be relative or absolute. Relative paths are relative to the directory containing the MLB file. Paths may include path variables and are expanded according to a path map. Unquoted paths may include alpha-numeric characters and the symbols "-" and "_", along with the arc separator "/" and extension separator ".". More complicated paths, including paths with spaces, may be included by quoting the path with ". A quoted path is lexed as an SML string constant.

Annotations allow a library author to control options that affect the elaboration of SML source files.

Semantics

There is a [WWW]formal semantics for ML Basis files in the style of the Definition. Here, we give an informal explanation.

An SML structure is a collection of types, values, and other structures. Similarly, a basis is a collection, but of more kinds of objects: types, values, structures, fixities, signatures, functors, and other bases.

A basis declaration denotes a basis. A structure, signature, or functor declaration denotes a basis containing the corresponding module. Sequencing of basis declarations merges bases, with later definitions taking precedence over earlier ones, just like sequencing of SML declarations. Local declarations provide name hiding, just like SML local declarations. A reference to an SML source file causes the file to be elaborated in the basis extant at the point of reference. A reference to an MLB file causes the basis denoted by that MLB file to be imported -- the basis at the point of reference does not affect the imported basis.

Basis expressions and basis identifiers allow binding a basis to a name.

An MLB file is elaborated starting in an empty basis. Each MLB file is elaborated and evaluated only once, with the result being cached. Subsequent references use the cached value. Thus, any observable effects due to evaluation are not duplicated if the MLB file is referred to multiple times.


Last edited on 2007-08-23 04:22:13 by MatthewFluet. mlton-20100608/doc/guide/MLj0000644000076600000240000000413211404435635014033 0ustar mtfstaff MLj - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLj
Home  Index  
[WWW]MLj is a Standard ML Compiler that targets Java bytecode. It is no longer maintained. It has morphed into SML.NET.

BentonEtAl98 and BentonKennedy99 describe MLj.


Last edited on 2004-12-30 20:11:59 by StephenWeeks. mlton-20100608/doc/guide/MLKit0000644000076600000240000000603111404435634014330 0ustar mtfstaff MLKit - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLKit
Home  Index  
The [WWW]ML Kit is a Standard ML Compiler.

MLKit supports:

At the time of writing, MLKit does not support:

  • concurrent programming / threads,

  • calling from C to SML.


Last edited on 2007-09-12 12:08:36 by VesaKarvonen. mlton-20100608/doc/guide/MLLex0000644000076600000240000000733011404435634014334 0ustar mtfstaff MLLex - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLLex
Home  Index  
MLLex is a lexical analyzer generator for Standard ML modeled after the Lex lexical analyzer generator.

A version of MLLex, ported from the SML/NJ sources, is distributed with MLton.

Description

MLLex takes as input the lex language as defined in the ML-Lex manual, and outputs a lexical analyzer in SML.

Implementation

[WWW]lexgen.sml
[WWW]main.sml
[WWW]call-main.sml

Details and Notes

There are 3 main passes in the MLLex tool:

  • Source parsing. In this pass, lex source program are parsed into internal representations. The core part of this pass is a hand-written lexer and an LL(1) parser. The output of this pass is a record of user code, rules (along with start states) and actions. (MLlex definitions are wiped off.)

  • DFA construction. In this pass, a DFA is constructed by the algorithm of H. Yamada et. al.

  • Output. In this pass, the generated DFA is written out as a transition table, along with a table-driven algorithm, to an SML file.

Also see


Last edited on 2010-05-13 19:35:18 by MatthewFluet. mlton-20100608/doc/guide/MLmon0000644000076600000240000000722211404435634014375 0ustar mtfstaff MLmon - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLmon
Home  Index  
An mlmon.out file records dynamic profiling counts.

File format

An mlmon.out file is a text file with a sequence of lines.

  • The string "MLton prof".

  • The string "alloc", "count", or "time", depending on the kind of profiling information, corresponding to the command-line argument supplied to mlton -profile.

  • The string "current" or "stack" depending on whether profiling data was gathered for only the current function (the top of the stack) or for all functions on the stack. This corresponds to whether the executable was compiled with -profile-stack false or -profile-stack true.

  • The magic number of the executable.

  • The number of non-gc ticks, followed by a space, then the number of GC ticks.

  • The number of (split) functions for which data is recorded.

  • A line for each (split) function with counts. Each line contains an integer count of the number of ticks while the function was current. In addition, if stack data was gathered (-profile-stack true), then the line contains two additional tick counts:

    • the number of ticks while the function was on the stack.

    • the number of ticks while the function was on the stack and a GC was performed.

  • The number of (master) functions for which data is recorded.

  • A line for each (master) function with counts. The lines have the same format and meaning as with split-function counts.


Last edited on 2006-10-23 22:02:16 by StephenWeeks. mlton-20100608/doc/guide/MLNLFFI0000644000076600000240000000674311404435634014451 0ustar mtfstaff MLNLFFI - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLNLFFI
Home  Index  
ML-NLFFI is the no-longer-foreign-function interface library for SML.

As of 20050212, MLton has an initial port of ML-NLFFI from SML/NJ to MLton. All of the ML-NLFFI functionality is present.

Additionally, MLton has an initial port of the mlnlffigen tool from SML/NJ to MLton. Due to low-level details, the code generated by SML/NJ's ml-nlffigen is not compatible with MLton, and vice-versa. However, the generated code has the same interface, so portable client code can be written. MLton's mlnlffigen does not currently support C functions with struct or union arguments.

Usage

  • You can import the ML-NLFFI Library into an MLB file with

    MLB file Description
    $(SML_LIB)/mlnlffi-lib/mlnlffi-lib.mlb
  • If you are porting a project from SML/NJ's CompilationManager to MLton's ML Basis system using cm2mlb, note that the following maps are included by default:

    $c/c.mlb  $(SML_LIB)/mlnlffi-lib/mlnlffi-lib.mlb
    
    This will automatically convert a $/c.cm import in an input .cm file into a $(SML_LIB)/mlnlffi-lib/mlnlffi-lib.mlb import in the output .mlb file.

Also see


Last edited on 2010-06-07 14:33:26 by MatthewFluet. mlton-20100608/doc/guide/MLNLFFIGen0000644000076600000240000000473011404435635015076 0ustar mtfstaff MLNLFFIGen - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLNLFFIGen
Home  Index  
mlnlffigen generates a MLNLFFI binding from a collection of .c files. It is based on the CKitLibrary, which is primarily designed to handle standardized C and thus does not understand many (any?) compiler extensions; however, it attempts to recover from errors when seeing unrecognized definitions.

In order to work around common gcc extensions, it may be useful to add -cppopt options to the command line; for example -cppopt '-D__extension__' may be occasionally useful. Fortunately, most portable libraries largely avoid the use of these types of extensions in header files.

mlnlffigen will normally not generate bindings for #included files; see -match and -allSU if this is desirable.


Last edited on 2010-06-07 14:32:31 by MatthewFluet. mlton-20100608/doc/guide/MLNLFFIImplementation0000644000076600000240000002722511404435634017355 0ustar mtfstaff MLNLFFIImplementation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLNLFFIImplementation
Home  Index  
MLton's implementation(s) of the MLNLFFI library differs from the SML/NJ implementation in two important ways:
  • MLton cannot utilize the Unsafe.cast "cheat" described in Section 3.7 of Blume01. (MLton's representation of closures and aggressive representation optimizations make an Unsafe.cast even more "unsafe" than in other implementations.) We have considered two solutions:

    • One solution is to utilize an additional type parameter (as described in Section 3.7 of Blume01):

      • signature C = sig
            type ('t, 'f, 'c) obj
            eqtype ('t, 'f, 'c) obj'
            ...
            type ('o, 'f) ptr   
            eqtype ('o, 'f) ptr'
            ...
            type 'f fptr
            type 'f ptr'
            ...
            structure T : sig
                type ('t, 'f) typ
                ...
            end
        end
        

        The rule for ('t, 'f, 'c) obj,('t, 'f, 'c) ptr, and also ('t, 'f) T.typ is that whenever F fptr occurs within the instantiation of 't, then 'f must be instantiated to F. In all other cases, 'f will be instantiated to unit. (In the actual MLton implementation, an abstract type naf (not-a-function) is used instead of unit.)

      While this means that type-annotated programs may not type-check under both the SML/NJ implementation and the MLton implementation, this should not be a problem in practice. Tools, like ml-nlffigen, which are necessarily implementation dependent (in order to make calls through a C function pointer), may be easily extended to emit the additional type parameter. Client code which uses such generated glue-code (e.g., Section 1 of Blume01) need rarely write type-annotations, thanks to the magic of type inference.
    • The above implementation suffers from two disadvantages. First, it changes the MLNLFFI Library interface, meaning that the same program may not type-check under both the SML/NJ implementation and the MLton implementation (though, in light of type inference and the richer MLRep structure provided by MLton, this point is mostly moot).

      Second, it appears to unnecessarily duplicate type information. For example, an external C variable of type int (* f[3])(int) (that is, an array of three function pointers), would be represented by the SML type (((sint -> sint) fptr, dec dg3) arr, sint -> sint, rw) obj. One might well ask why the 'f instantiation (sint -> sint in this case) cannot be extracted from the 't instantiation (((sint -> sint) fptr, dec dg3) arr in this case), obviating the need for a separate function-type type argument. There are a number of components to an complete answer to this question. Foremost is the fact that Standard ML supports neither (general) type-level functions nor intensional polymorphism.

      A more direct answer for MLNLFFI is that in the SML/NJ implemention, the definition of the types ('t, 'c) obj and ('t, 'c) ptr are made in such a way that the type variables 't and 'c are phantom (not contributing to the run-time representation of an ('t, 'c) obj or ('t, 'c) ptr value), despite the fact that the types ((sint -> sint) fptr, rw) ptr and ((double -> double) fptr, rw) ptr necessarily carry distinct (and type incompatible) run-time (C-)type information (RTTI), corresponding to the different calling conventions of the two C functions. The Unsafe.cast "cheat" overcomes the type incompatibility without introducing a new type variable (as in the first solution above).

      Hence, the reason that function-type type cannot be extracted from the 't type variable instantiation is that the type of the representation of RTTI doesn't even see the (phantom) 't type variable. The solution which presents itself is to give up on the phantomness of the 't type variable, making it available to the representation of RTTI.

      This is not without some small drawbacks. Because many of the types used to instantiate 't carry more structure than is strictly necessary for 't's RTTI, it is sometimes necessary to wrap and unwrap RTTI to accommodate the additional structure. (In the other implementations, the corresponding operations can pass along the RTTI unchanged.) However, these coercions contribute minuscule overhead; in fact, in a majority of cases, MLton's optimizations will completely eliminate the RTTI from the final program.

    The implementation distributed with MLton uses the second solution.

    Bonus question: Why can't one use a universal type to eliminate the use of Unsafe.cast?

    • Answer: ???

  • MLton (in both of the above implementations) provides a richer MLRep structure, utilizing Int<N> and Word<N> structures.

    structure MLRep = struct
        structure Char =
           struct
              structure Signed = Int8
              structure Unsigned = Word8
              (* word-style bit-operations on integers... *)
              structure SignedBitops = IntBitOps(structure I = Signed
                                                 structure W = Unsigned)
           end
        structure Short =
           struct
              structure Signed = Int16
              structure Unsigned = Word16
              (* word-style bit-operations on integers... *)
              structure SignedBitops = IntBitOps(structure I = Signed
                                                 structure W = Unsigned)
           end
        structure Int =
           struct
              structure Signed = Int32
              structure Unsigned = Word32
              (* word-style bit-operations on integers... *)
              structure SignedBitops = IntBitOps(structure I = Signed
                                                 structure W = Unsigned)
           end  
        structure Long =
           struct
              structure Signed = Int32
              structure Unsigned = Word32
              (* word-style bit-operations on integers... *)
              structure SignedBitops = IntBitOps(structure I = Signed
                                                 structure W = Unsigned)
           end
        structure LongLong =
           struct
              structure Signed = Int64
              structure Unsigned = Word64
              (* word-style bit-operations on integers... *)
              structure SignedBitops = IntBitOps(structure I = Signed
                                                 structure W = Unsigned)
           end
        structure Float = Real32
        structure Double = Real64
    end
    
    This would appear to be a better interface, even when an implementation must choose Int32 and Word32 as the representation for smaller C-types.


Last edited on 2007-08-15 22:06:50 by MatthewFluet. mlton-20100608/doc/guide/MLRISCLibrary0000644000076600000240000001423211404435635015671 0ustar mtfstaff MLRISCLibrary - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLRISCLibrary
Home  Index  
The [WWW]MLRISC Library is a framework for retargetable and optimizing compiler back ends. The MLRISC Library is distributed with SML/NJ. Due to differences between SML/NJ and MLton, this library will not work out-of-the box with MLton.

As of 20100402, MLton includes a port of the MLRISC Library synchronized with SML/NJ version 110.72.

Usage

  • You can import a sub-library of the MLRISC Library into an MLB file with:

    MLB file Description
    $(SML_LIB)/mlrisc-lib/mlb/ALPHA.mlb The ALPHA backend
    $(SML_LIB)/mlrisc-lib/mlb/AMD64.mlb The AMD64 backend
    $(SML_LIB)/mlrisc-lib/mlb/AMD64-Peephole.mlb The AMD64 peephole optimizer
    $(SML_LIB)/mlrisc-lib/mlb/CCall.mlb
    $(SML_LIB)/mlrisc-lib/mlb/CCall-sparc.mlb
    $(SML_LIB)/mlrisc-lib/mlb/CCall-x86-64.mlb
    $(SML_LIB)/mlrisc-lib/mlb/CCall-x86.mlb
    $(SML_LIB)/mlrisc-lib/mlb/Control.mlb
    $(SML_LIB)/mlrisc-lib/mlb/Graphs.mlb
    $(SML_LIB)/mlrisc-lib/mlb/HPPA.mlb The HPPA backend
    $(SML_LIB)/mlrisc-lib/mlb/IA32.mlb The IA32 backend
    $(SML_LIB)/mlrisc-lib/mlb/IA32-Peephole.mlb The IA32 peephole optimizer
    $(SML_LIB)/mlrisc-lib/mlb/Lib.mlb
    $(SML_LIB)/mlrisc-lib/mlb/MLRISC.mlb
    $(SML_LIB)/mlrisc-lib/mlb/MLTREE.mlb
    $(SML_LIB)/mlrisc-lib/mlb/Peephole.mlb
    $(SML_LIB)/mlrisc-lib/mlb/PPC.mlb The PPC backend
    $(SML_LIB)/mlrisc-lib/mlb/RA.mlb
    $(SML_LIB)/mlrisc-lib/mlb/SPARC.mlb The Sparc backend
    $(SML_LIB)/mlrisc-lib/mlb/StagedAlloc.mlb
    $(SML_LIB)/mlrisc-lib/mlb/Visual.mlb
  • If you are porting a project from SML/NJ's CompilationManager to MLton's ML Basis system using cm2mlb, note that the following map is included by default:

    $SMLNJ-MLRISC   $(SML_LIB)/mlrisc-lib/mlb
    
    This will automatically convert a $SMLNJ-MLRISC/MLRISC.cm import in an input .cm file into a $(SML_LIB)/mlrisc-lib/mlb/MLRISC.mlb import in the output .mlb file.

Details

The following changes were made to the MLRISC Library, in addition to deriving the .mlb file from the .cm files:

  • eliminate or-patterns: Duplicate the whole match (p => e) at each of the patterns.

  • eliminate vector constants: Change #[ to Vector.fromList [.

  • eliminate withtype in signatures.

  • eliminate sequential withtype expansions: Most could be rewritten as a sequence of type definitions and datatype definitions.

  • eliminate higher-order functors: Every higher-order functor definition and application could be uncurried in the obvious way.

  • eliminate where <str> = <str>: Quite painful to expand out all the flexible types in the respective structures. Furthermore, many of the implied type equalities aren't needed, but it's too hard to pick out the right ones.

Patch


Last edited on 2010-04-02 19:28:52 by MatthewFluet. mlton-20100608/doc/guide/MLtonArray0000644000076600000240000000440611404435635015405 0ustar mtfstaff MLtonArray - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonArray
Home  Index  
signature MLTON_ARRAY =
   sig
      val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a array * 'b
   end

  • unfoldi (n, b, f)
    constructs an array a of length n, whose elements ai are determined by the equations b0 = b and (ai, bi+1) = f (i, bi).


Last edited on 2007-08-23 03:43:43 by MatthewFluet. mlton-20100608/doc/guide/MLtonBinIO0000644000076600000240000000350411404435634015264 0ustar mtfstaff MLtonBinIO - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonBinIO
Home  Index  
signature MLTON_BIN_IO = MLTON_IO

See MLtonIO.


Last edited on 2005-12-01 21:00:20 by StephenWeeks. mlton-20100608/doc/guide/MLtonCont0000644000076600000240000000761611404435634015237 0ustar mtfstaff MLtonCont - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonCont
Home  Index  
signature MLTON_CONT =
   sig
      type 'a t

      val callcc: ('a t -> 'a) -> 'a
      val isolate: ('a -> unit) -> 'a t
      val prepend: 'a t * ('b -> 'a) -> 'b t
      val throw: 'a t * 'a -> 'b
      val throw': 'a t * (unit -> 'a) -> 'b
   end

  • type 'a t
    the type of continuations that expect a value of type 'a.

  • callcc f
    applies f to the current continuation. This copies the entire stack; hence, callcc takes time proportional to the size of the current stack.

  • isolate f
    creates a continuation that evaluates f in an empty context. This is a constant time operation, and yields a constant size stack.

  • prepend (k, f)
    composes a function f with a continuation k to create a continuation that first does f and then does k. This is a constant time operation.

  • throw (k, v)
    throws value v to continuation k. This copies the entire stack of k; hence, throw takes time proportional to the size of this stack.

  • throw' (k, th)
    a generalization of throw that evaluates th () in the context of k. Thus, for example, if th () raises an exception or captures another continuation, it will see k, not the current continuation.

Also see


Last edited on 2008-05-10 11:52:41 by MatthewFluet. mlton-20100608/doc/guide/MLtonContIsolateImplementation0000644000076600000240000007061111404435634021461 0ustar mtfstaff MLtonContIsolateImplementation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonContIsolateImplementation
Home  Index  
As noted before, it is fairly easy to get the operational behavior of isolate with just callcc and throw, but establishing the right space behavior is trickier. Here, we show how to start from the obvious, but inefficient, implementation of isolate using only callcc and throw, and 'derive' an equivalent, but more efficient, implementation of isolate using MLton's primitive stack capture and copy operations. This isn't a formal derivation, as we are not formally showing the equivalence of the programs (though I believe that they are all equivalent, modulo the space behavior).

Here is a direct implementation of isolate using only callcc and throw:

val isolate: ('a -> unit) -> 'a t =
  fn (f: 'a -> unit) =>
  callcc
  (fn k1 =>
   let
      val x = callcc (fn k2 => throw (k1, k2))
      val _ = (f x ; Exit.topLevelSuffix ())
              handle exn => MLtonExn.topLevelHandler exn
   in
      raise Fail "MLton.Cont.isolate: return from (wrapped) func"
   end)

We use the standard nested callcc trick to return a continuation that is ready to receive an argument, execute the isolated function, and exit the program. Both Exit.topLevelSuffix and MLtonExn.topLevelHandler will terminate the program.

Throwing to an isolated function will execute the function in a 'semantically' empty context, in the sense that we never re-execute the 'original' continuation of the call to isolate (i.e., the context that was in place at the time isolate was called). However, we assume that the compiler isn't able to recognize that the 'original' continuation is unused; for example, while we (the programmer) know that Exit.topLevelSuffix and MLtonExn.topLevelHandler will terminate the program, the compiler may only see opaque calls to unknown foreign-functions. So, that original continuation (in its entirety) is part of the continuation returned by isolate and throwing to the continuation returned by isolate will execute f x (with the exit wrapper) in the context of that original continuation. Thus, the garbage collector will retain everything reachable from that original continuation during the evaluation of f x, even though it is 'semantically' garbage.

Note that this space-leak is independent of the implementation of continuations (it arises in both MLton's stack copying implementation of continuations and would arise in SML/NJ's CPS-translation implementation); we are only assuming that the implementation can't 'see' the program termination, and so must retain the original continuation (and anything reachable from it).

So, we need an 'empty' continuation in which to execute f x. (No surprise there, as that is the written description of isolate.) To do this, we capture a top-level continuation and throw to that in order to execute f x:

local
val base: (unit -> unit) t =
  callcc
  (fn k1 =>
   let
      val th = callcc (fn k2 => throw (k1, k2))
      val _ = (th () ; Exit.topLevelSuffix ())
              handle exn => MLtonExn.topLevelHandler exn
   in
      raise Fail "MLton.Cont.isolate: return from (wrapped) func"
   end)
in
val isolate: ('a -> unit) -> 'a t =
  fn (f: 'a -> unit) =>
  callcc
  (fn k1 =>
   let
      val x = callcc (fn k2 => throw (k1, k2))
   in
      throw (base, fn () => f x)
   end)
end

We presume that base is evaluated 'early' in the program. There is a subtlety here, because one needs to believe that this base continuation (which technically corresponds to the entire rest of the program evaluation) 'works' as an empty context; in particular, we want it to be the case that executing f x in the base context retains less space than executing f x in the context in place at the call to isolate (as occurred in the previous implementation of isolate). This isn't particularly easy to believe if one takes a normal substitution-based operational semantics, because it seems that the context captured and bound to base is arbitrarily large. However, this context is mostly unevaluated code; the only heap-allocated values that are reachable from it are those that were evaluated before the evaluation of base (and used in the program after the evaluation of base). Assuming that base is evaluated 'early' in the program, we conclude that there are few heap-allocated values reachable from its continuation. In contrast, the previous implementation of isolate could capture a context that has many heap-allocated values reachable from it (because we could evaluate isolate f 'late' in the program and 'deep' in a call stack), which would all remain reachable during the evaluation of f x. [We'll return to this point later, as it is taking a slightly MLton-esque view of the evaluation of a program, and may not apply as strongly to other implementations (e.g., SML/NJ).]

Now, once we throw to base and begin executing f x, only the heap-allocated values reachable from f and x and the few heap-allocated values reachable from base are retained by the garbage collector. So, it seems that base 'works' as an empty context.

But, what about the continuation returned from isolate f? Note that the continuation returned by isolate is one that receives an argument x and then throws to base to evaluate f x. If we used a CPS-translation implementation (and assume sufficient beta-contractions to eliminate administrative redexes), then the original continuation passed to isolate (i.e., the continuation bound to k1) will not be free in the continuation returned by isolate f. Rather, the only free variables in the continuation returned by isolate f will be base and f, so the only heap-allocated values reachable from the continuation returned by isolate f will be those values reachable from base (assumed to be few) and those values reachable from f (necessary in order to execute f at some later point).

But, MLton doesn't use a CPS-translation implementation. Rather, at each call to callcc in the body of isolate, MLton will copy the current execution stack. Thus, k2 (the continuation returned by isolate f) will include execution stack at the time of the call to isolate f -- that is, it will include the 'original' continuation of the call to isolate f. Thus, the heap-allocated values reachable from the continuation returned by isolate f will include those values reachable from base, those values reachable from f, and those values reachable from the original continuation of the call to isolate f. So, just holding on to the continuation returned by isolate f will retain all of the heap-allocated values live at the time isolate f was called. This leaks space, since, 'semantically', the continuation returned by isolate f only needs the heap-allocated values reachable from f (and base).

In practice, this probably isn't a significant issue. A common use of isolate is implement abort:

fun abort th = throw (isolate th, ())
The continuation returned by isolate th is dead immediately after being thrown to -- the continuation isn't retained, so neither is the 'semantic' garbage it would have retained.

But, it is easy enough to 'move' onto the 'empty' context base the capturing of the context that we want to be returned by isolate f:

local
val base: (unit -> unit) t =
  callcc
  (fn k1 =>
   let
      val th = callcc (fn k2 => throw (k1, k2))
      val _ = (th () ; Exit.topLevelSuffix ())
              handle exn => MLtonExn.topLevelHandler exn
   in
      raise Fail "MLton.Cont.isolate: return from (wrapped) func"
   end)
in
val isolate: ('a -> unit) -> 'a t =
  fn (f: 'a -> unit) =>
  callcc
  (fn k1 =>
   throw (base, fn () =>
          let
             val x = callcc (fn k2 => throw (k1, k2))
          in
             throw (base, fn () => f x)
          end))
end

This implementation now has the right space behavior; the continuation returned by isolate f will only retain the heap-allocated values reachable from f and from base. (Technically, the continuation will retain two copies of the stack that was in place at the time base was evaluated, but we are assuming that that stack small.)

One minor inefficiency of this implementation (given MLton's implementation of continuations) is that every callcc and throw entails copying a stack (albeit, some of them are small). We can avoid this in the evaluation of base by using a reference cell, because base is evaluated at the top-level:

local
val base: (unit -> unit) option t =
  let
     val baseRef: (unit -> unit) option t option ref = ref NONE
     val th = callcc (fn k => (base := SOME k; NONE))
  in
     case th of
        NONE => (case !baseRef of
                    NONE => raise Fail "MLton.Cont.isolate: missing base"
                  | SOME base => base)
      | SOME th => let
                      val _ = (th () ; Exit.topLevelSuffix ())
                              handle exn => MLtonExn.topLevelHandler exn
                   in
                      raise Fail "MLton.Cont.isolate: return from (wrapped)
                      func"
                   end
  end
in
val isolate: ('a -> unit) -> 'a t =
  fn (f: 'a -> unit) =>
  callcc
  (fn k1 =>
   throw (base, SOME (fn () =>
          let
             val x = callcc (fn k2 => throw (k1, k2))
          in
             throw (base, SOME (fn () => f x))
          end)))
end

Now, to evaluate base, we only copy the stack once (instead of 3 times). Because we don't have a dummy continuation around to initialize the reference cell, the reference cell holds a continuation option. To distinguish between the original evaluation of base (when we want to return the continuation) and the subsequent evaluations of base (when we want to evaluate a thunk), we capture a (unit -> unit) option continuation.

This seems to be as far as we can go without exploiting the concrete implementation of continuations in MLtonCont. Examining the implementation, we note that the type of continuations is given by

type 'a t = (unit -> 'a) -> unit
and the implementation of throw is given by
fun ('a, 'b) throw' (k: 'a t, v: unit -> 'a): 'b =
  (k v; raise Fail "MLton.Cont.throw': return from continuation")

fun ('a, 'b) throw (k: 'a t, v: 'a): 'b = throw' (k, fn () => v)

Suffice to say, a continuation is simply a function that accepts a thunk to yield the thrown value and the body of the function performs the actual throw. Using this knowledge, we can create a dummy continuation to initialize baseRef and greatly simplify the body of isolate:

local
val base: (unit -> unit) option t =
  let
     val baseRef: (unit -> unit) option t ref =
        ref (fn _ => raise Fail "MLton.Cont.isolate: missing base")
     val th = callcc (fn k => (baseRef := k; NONE))
  in
     case th of
        NONE => !baseRef
      | SOME th => let
                      val _ = (th () ; Exit.topLevelSuffix ())
                              handle exn => MLtonExn.topLevelHandler exn
                   in
                      raise Fail "MLton.Cont.isolate: return from (wrapped)
                      func"
                   end
  end
in
val isolate: ('a -> unit) -> 'a t =
  fn (f: 'a -> unit) =>
  fn (v: unit -> 'a) =>
  throw (base, SOME (f o v))
end

Note that this implementation of isolate makes it clear that the continuation returned by isolate f only retains the heap-allocated values reachable from f and base. It also retains only one copy of the stack that was in place at the time base was evaluated. Finally, it completely avoids making any copies of the stack that is in place at the time isolate f is evaluated; indeed, isolate f is a constant-time operation.

Next, suppose we limited ourselves to capturing unit continuations with callcc. We can't pass th thunk to be evaluated in the 'empty' context directly, but we can use a reference cell.

local
val thRef: (unit -> unit) option ref = ref NONE
val base: unit t =
  let
     val baseRef: unit t ref =
        ref (fn _ => raise Fail "MLton.Cont.isolate: missing base")
     val () = callcc (fn k => baseRef := k)
  in
     case !thRef of
        NONE => !baseRef
      | SOME th =>
           let
              val _ = thRef := NONE
              val _ = (th () ; Exit.topLevelSuffix ())
                      handle exn => MLtonExn.topLevelHandler exn
           in
              raise Fail "MLton.Cont.isolate: return from (wrapped) func"
           end
  end
in
val isolate: ('a -> unit) -> 'a t =
  fn (f: 'a -> unit) =>
  fn (v: unit -> 'a) =>
  let
     val () = thRef := SOME (f o v)
  in
     throw (base, ())
  end
end

Note that it is important to set thRef to NONE before evaluating the thunk, so that the garbage collector doesn't retain all the heap-allocated values reachable from f and v during the evaluation of f (v ()). This is because thRef is still live during the evaluation of the thunk; in particular, it was allocated before the evaluation of base (and used after), and so is retained by continuation on which the thunk is evaluated.

This implementation can be easily adapted to use MLton's primitive stack copying operations.

local
val thRef: (unit -> unit) option ref = ref NONE
val base: Thread.preThread =
   let
      val () = Thread.copyCurrent ()
   in
      case !thRef of
         NONE => Thread.savedPre ()
       | SOME th =>
            let
               val () = thRef := NONE
               val _ = (th () ; Exit.topLevelSuffix ())
                       handle exn => MLtonExn.topLevelHandler exn
            in
               raise Fail "MLton.Cont.isolate: return from (wrapped) func"
            end
   end
in
val isolate: ('a -> unit) -> 'a t =
   fn (f: 'a -> unit) =>
   fn (v: unit -> 'a) =>
   let
      val () = thRef := SOME (f o v)
      val new = Thread.copy base
   in
      Thread.switchTo new
   end
end

In essence, Thread.copyCurrent copies the current execution stack and stores it in an implicit reference cell in the runtime system, which is fetchable with Thread.savedPre. When we are ready to throw to the isolated function, Thread.copy copies the saved execution stack (because the stack is modified in place during execution, we need to retain a pristine copy in case the isolated function itself throws to other isolated functions) and Thread.switchTo abandons the current execution stack, installing the newly copied execution stack.

The actual implementation of MLton.Cont.isolate simply adds some Thread.atomicBegin and Thread.atomicEnd commands, which effectively protect the global thRef and accommodate the fact that Thread.switchTo does an implicit Thread.atomicEnd (used for leaving a signal handler thread).

local
val thRef: (unit -> unit) option ref = ref NONE
val base: Thread.preThread =
   let
      val () = Thread.copyCurrent ()
   in
      case !thRef of
         NONE => Thread.savedPre ()
       | SOME th =>
            let
               val () = thRef := NONE
               val _ = MLton.atomicEnd (* Match 1 *)
               val _ = (th () ; Exit.topLevelSuffix ())
                       handle exn => MLtonExn.topLevelHandler exn
            in
               raise Fail "MLton.Cont.isolate: return from (wrapped) func"
            end
   end
in
val isolate: ('a -> unit) -> 'a t =
   fn (f: 'a -> unit) =>
   fn (v: unit -> 'a) =>
   let
      val _ = MLton.atomicBegin (* Match 1 *)
      val () = thRef := SOME (f o v)
      val new = Thread.copy base
      val _ = MLton.atomicBegin (* Match 2 *)
   in
      Thread.switchTo new (* Match 2 *)
   end
end

It is perhaps interesting to note that the above implementation was originally 'derived' by specializing implementations of the MLtonThread new, prepare, and switch functions as if their only use was in the following implementation of isolate:

val isolate: ('a -> unit) -> 'a t =
   fn (f: 'a -> unit) =>
   fn (v: unit -> 'a) =>
   let
      val th = (f (v ()) ; Exit.topLevelSuffix ())
               handle exn => MLtonExn.topLevelHandler exn
      val t = MLton.Thread.prepare (MLton.Thread.new th, ())
   in
      MLton.Thread.switch (fn _ => t)
   end

It was pleasant to discover that it could equally well be 'derived' starting from the callcc and throw implementation.

As a final comment, we noted that the degree to which the context of base could be considered 'empty' (i.e., retaining few heap-allocated values) depended upon a slightly MLton-esque view. In particular, MLton does not heap allocate executable code. So, although the base context keeps a lot of unevaluated code 'live', such code is not heap allocated. In a system like SML/NJ, that does heap allocate executable code, one might want it to be the case that after throwing to an isolated function, the garbage collector retains only the code necessary to evaluate the function, and not any code that was necessary to evaluate the base context.


Last edited on 2008-05-02 03:05:42 by MatthewFluet. mlton-20100608/doc/guide/MLtonExn0000644000076600000240000000732711404435634015065 0ustar mtfstaff MLtonExn - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonExn
Home  Index  
signature MLTON_EXN =
   sig
      val addExnMessager: (exn -> string option) -> unit
      val history: exn -> string list

      val defaultTopLevelHandler: exn -> 'a
      val getTopLevelHandler: unit -> (exn -> unit)
      val setTopLevelHandler: (exn -> unit) -> unit
      val topLevelHandler: exn -> 'a
   end

  • addExnMessager f
    adds f as a pretty-printer to be used by General.exnMessage for converting exceptions to strings. Messagers are tried in order from most recently added to least recently added.

  • history e
    returns call stack at the point that e was first raised. Each element of the list is a file position. The elements are in reverse chronological order, i.e. the function called last is at the front of the list.

    history e will return [] unless the program is compiled with -const 'Exn.keepHistory true'.

  • defaultTopLevelHandler e
    function that behaves as the default top level handler; that is, print out the unhandled exception message for e and exit.

  • getTopLevelHandler ()
    get the top level handler.

  • setTopLevelHandler f
    set the top level handler to the function f. The function f should not raise an exception or return normally.

  • topLevelHandler e
    behaves as if the top level handler received the exception e.


Last edited on 2007-08-23 03:43:53 by MatthewFluet. mlton-20100608/doc/guide/MLtonFinalizable0000644000076600000240000003177211404435634016554 0ustar mtfstaff MLtonFinalizable - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonFinalizable
Home  Index  
signature MLTON_FINALIZABLE =
   sig
      type 'a t

      val addFinalizer: 'a t * ('a -> unit) -> unit
      val finalizeBefore: 'a t * 'b t -> unit
      val new: 'a -> 'a t
      val touch: 'a t -> unit
      val withValue: 'a t * ('a -> 'b) -> 'b
   end

A finalizable value is a container to which finalizers can be attached. A container holds a value, which is reachable as long as the container itself is reachable. A finalizer is a function that runs at some point after garbage collection determines that the container to which it is attached has become unreachable. A finalizer is treated like a signal handler, in that it runs asynchronously in a separate thread, with signals blocked, and will not interrupt a critical section (see MLtonThread).

  • addFinalizer (v, f)
    adds f as a finalizer to v. This means that sometime after the last call to withValue on v completes and v becomes unreachable, f will be called with the value of v.

  • finalizeBefore (v1, v2)
    ensures that v1 will be finalized before v2. A cycle of values v = v1, ..., vn = v with finalizeBefore (vi, vi+1) will result in none of the vi being finalized.

  • new x
    creates a new finalizable value, v, with value x. The finalizers of v will run sometime after the last call to withValue on v when the garbage collector determines that v is unreachable.

  • touch v
    ensures that v's finalizers will not run before the call to touch.

  • withValue (v, f)
    returns the result of applying f to the value of v and ensures that v's finalizers will not run before f completes. The call to f is a nontail call.

Example

Suppose that finalizable.sml contains the following.

signature CLIST =
   sig
      type t

      val cons: int * t -> t
      val sing: int -> t
      val sum: t -> int
   end

functor CList (structure F: MLTON_FINALIZABLE
               structure Prim:
                  sig
                     val cons: int * Word32.word -> Word32.word
                     val free: Word32.word -> unit
                     val sing: int -> Word32.word
                     val sum: Word32.word -> int
                  end): CLIST =
   struct
      type t = Word32.word F.t

      fun cons (n: int, l: t) =
         F.withValue
         (l, fn w' =>
          let
             val c = F.new (Prim.cons (n, w'))
             val _ = F.addFinalizer (c, Prim.free)
             val _ = F.finalizeBefore (c, l)
          in
             c
          end)
      
      fun sing n =
         let
            val c = F.new (Prim.sing n)
            val _ = F.addFinalizer (c, Prim.free)
         in
            c
         end

      fun sum c = F.withValue (c, Prim.sum)
   end

functor Test (structure CList: CLIST
              structure MLton: sig
                                  structure GC:
                                     sig
                                        val collect: unit -> unit
                                     end
                               end) =
   struct
      fun f n =
         if n = 1
            then ()
         else
            let
               val a = Array.tabulate (n, fn i => i)
               val _ = Array.sub (a, 0) + Array.sub (a, 1)
            in
               f (n - 1)
            end
            
      val l = CList.sing 2
      val l = CList.cons (2,l)
      val l = CList.cons (2,l)
      val l = CList.cons (2,l)
      val l = CList.cons (2,l)
      val l = CList.cons (2,l)
      val l = CList.cons (2,l)
      val _ = MLton.GC.collect ()
      val _ = f 100
      val _ = print (concat ["listSum(l) = ",
                             Int.toString (CList.sum l),
                             "\n"])
      val _ = MLton.GC.collect ()
      val _ = f 100
   end

structure CList =
   CList (structure F = MLton.Finalizable
          structure Prim =
             struct
                val cons = _import "listCons": int * Word32.word -> Word32.word;
                val free = _import "listFree": Word32.word -> unit;
                val sing = _import "listSing": int -> Word32.word;
                val sum = _import "listSum": Word32.word -> int;
             end)

structure S = Test (structure CList = CList
                    structure MLton = MLton)

Suppose that cons.c contains the following.

#include <stdio.h>

typedef unsigned int uint;

typedef struct Cons {
        struct Cons *next;
        int value;
} *Cons;

Cons listCons (int n, Cons c) {
        Cons res;

        res = (Cons) malloc (sizeof(*res));
        fprintf (stderr, "0x%08x = listCons (%d)\n", (uint)res, n);
        res->next = c;
        res->value = n;
        return res;
}

Cons listSing (int n) {
        Cons res;

        res = (Cons) malloc (sizeof(*res));
        fprintf (stderr, "0x%08x = listSing (%d)\n", (uint)res, n);
        res->next = NULL;
        res->value = n;
        return res;
}

void listFree (Cons p) {
        fprintf (stderr, "listFree (0x%08x)\n", (uint)p);
        free (p);
}

int listSum (Cons c) {
        int res;

        fprintf (stderr, "listSum\n");
        res = 0;
        for (; c != NULL; c = c->next)
                res += c->value;
        return res;
}

We can compile these to create an executable with

% mlton -default-ann 'allowFFI true' finalizable.sml cons.c

Running this executable will create output like the following.

% finalizable
0x08072890 = listSing (2)
0x080728a0 = listCons (2)
0x080728b0 = listCons (2)
0x080728c0 = listCons (2)
0x080728d0 = listCons (2)
0x080728e0 = listCons (2)
0x080728f0 = listCons (2)
listSum
listSum(l) = 14
listFree (0x080728f0)
listFree (0x080728e0)
listFree (0x080728d0)
listFree (0x080728c0)
listFree (0x080728b0)
listFree (0x080728a0)
listFree (0x08072890)

Synchronous Finalizers

Finalizers in MLton are asynchronous. That is, they run at an unspecified time, interrupting the user program. It is also possible, and sometimes useful, to have synchronous finalizers, where the user program explicitly decides when to run enabled finalizers. We have considered this in MLton, and it seems possible, but there are some unresolved design issues. See the thread at

Also see


Last edited on 2007-08-23 03:44:00 by MatthewFluet. mlton-20100608/doc/guide/MLtonGC0000644000076600000240000001134211404435635014615 0ustar mtfstaff MLtonGC - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonGC
Home  Index  
signature MLTON_GC =
   sig
      val collect: unit -> unit
      val pack: unit -> unit
      val setMessages: bool -> unit
      val setSummary: bool -> unit
      val unpack: unit -> unit
      structure Statistics :
         sig
            val bytesAllocated: unit -> IntInf.int
            val lastBytesLive: unit -> IntInf.int
            val numCopyingGCs: unit -> IntInf.int
            val numMarkCompactGCs: unit -> IntInf.int
            val numMinorGCs: unit -> IntInf.int
            val maxBytesLive: unit -> IntInf.int
         end
   end

  • collect ()
    causes a garbage collection to occur.

  • pack ()
    shrinks the heap as much as possible so that other processes can use available RAM.

  • setMessages b
    controls whether diagnostic messages are printed at the beginning and end of each garbage collection. It is the same as the gc-messages runtime system option.

  • setSummary b
    controls whether a summary of garbage collection statistics is printed upon termination of the program. It is the same as the gc-summary runtime system option.

  • unpack ()
    resizes a packed heap to the size desired by the runtime.

  • Statistics.bytesAllocated ()
    returns bytes allocated (as of the most recent garbage collection).

  • Statistics.lastBytesLive ()
    returns bytes live (as of the most recent garbage collection).

  • Statistics.numCopyingGCs ()
    returns number of (major) copying garbage collections performed (as of the most recent garbage collection).

  • Statistics.numMarkCompactGCs ()
    returns number of (major) mark-compact garbage collections performed (as of the most recent garbage collection).

  • Statistics.numMinorGCs ()
    returns number of minor garbage collections performed (as of the most recent garbage collection).

  • Statistics.maxBytesLive ()
    returns maximum bytes live (as of the most recent garbage collection).


Last edited on 2009-06-05 22:16:09 by MatthewFluet. mlton-20100608/doc/guide/MLtonIntInf0000644000076600000240000001126111404435635015513 0ustar mtfstaff MLtonIntInf - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonIntInf
Home  Index  
signature MLTON_INT_INF =
   sig
      type t = IntInf.int

      val areSmall: t * t -> bool
      val gcd: t * t -> t
      val isSmall: t -> bool

      structure BigWord : WORD
      structure SmallInt : INTEGER
      datatype rep =
         Big of BigWord.word vector
       | Small of SmallInt.int
      val rep: t -> rep
      val fromRep : rep -> t
   end

MLton represents an arbitrary precision integer either as an unboxed word with the bottom bit set to 1 and the top bits representing a small signed integer, or as a pointer to a vector of words, where the first word indicates the sign and the rest are the limbs of a GnuMP big integer.

  • type t
    the same as type IntInf.int.

  • areSmall (a, b)
    returns true iff both a and b are small.

  • gcd (a, b)
    uses the GnuMP's fast gcd implementation.

  • isSmall a
    returns true iff a is small.

  • BigWord : WORD
    representation of a big IntInf.int as a vector of words; on 32-bit platforms, BigWord is likely to be equivalent to Word32, and on 64-bit platforms, BigWord is likely to be equivalent to Word64.

  • SmallInt : INTEGER
    representation of a small IntInf.int as a signed integer; on 32-bit platforms, SmallInt is likely to be equivalent to Int32, and on 64-bit platforms, SmallInt is likely to be equivalent to Int64.

  • datatype rep
    the underlying representation of an IntInf.int.

  • rep i
    returns the underlying representation of i.

  • fromRep r
    converts from the underlying representation back to i. If the input is not identical to the result of rep, the result is undefined.


Last edited on 2009-09-11 15:13:38 by WesleyTerpstra. mlton-20100608/doc/guide/MLtonIO0000644000076600000240000000741611404435634014641 0ustar mtfstaff MLtonIO - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonIO
Home  Index  
signature MLTON_IO =
   sig
      type instream
      type outstream

      val inFd: instream -> Posix.IO.file_desc
      val mkstemp: string -> string * outstream
      val mkstemps: {prefix: string, suffix: string} -> string * outstream
      val newIn: Posix.IO.file_desc * string -> instream
      val newOut: Posix.IO.file_desc * string -> outstream
      val outFd: outstream -> Posix.IO.file_desc
      val tempPrefix: string -> string
   end

  • inFd ins
    returns the file descriptor corresponding to ins.

  • mkstemp s
    like the C mkstemp function, generates and open a temporary file with prefix s.

  • mkstemps {prefix, suffix} 
    like mkstemp, except it has both a prefix and suffix.

  • newIn (fd, name)
    creates a new instream from file descriptor fd, with name used in any Io exceptions later raised.

  • newOut (fd, name)
    creates a new outstream from file descriptor fd, with name used in any Io exceptions later raised.

  • outFd out
    returns the file descriptor corresponding to out.

  • tempPrefix s
    adds a suitable system or user specific prefix (directory) for temp files.


Last edited on 2007-08-23 03:44:14 by MatthewFluet. mlton-20100608/doc/guide/MLtonItimer0000644000076600000240000000527611404435634015565 0ustar mtfstaff MLtonItimer - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonItimer
Home  Index  
signature MLTON_ITIMER =
   sig
      datatype t =
         Prof
       | Real
       | Virtual

      val set: t * {interval: Time.time, value: Time.time} -> unit
      val signal: t -> Posix.Signal.signal
   end

  • set (t, {interval, value})
    sets the interval timer (using setitimer) specified by t to the given interval and value.

  • signal t
    returns the signal corresponding to t.


Last edited on 2007-08-23 03:44:18 by MatthewFluet. mlton-20100608/doc/guide/MLtonMonoArray0000644000076600000240000000533011404435634016232 0ustar mtfstaff MLtonMonoArray - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonMonoArray
Home  Index  
signature MLTON_MONO_ARRAY =
   sig
      type t
      type elem
      val fromPoly: elem array -> t
      val toPoly: t -> elem array
   end

  • type t
    type of monomorphic array

  • type elem
    type of array elements

  • fromPoly a
    type cast a polymorphic array to its monomorphic counterpart; the argument and result arrays share the same identity

  • toPoly a
    type cast a monomorphic array to its polymorphic counterpart; the argument and result arrays share the same identity


Last edited on 2007-08-23 03:44:22 by MatthewFluet. mlton-20100608/doc/guide/MLtonMonoVector0000644000076600000240000000531311404435635016420 0ustar mtfstaff MLtonMonoVector - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonMonoVector
Home  Index  
signature MLTON_MONO_VECTOR =
   sig
      type t
      type elem
      val fromPoly: elem vector -> t
      val toPoly: t -> elem vector
   end

  • type t
    type of monomorphic vector

  • type elem
    type of vector elements

  • fromPoly v
    type cast a polymorphic vector to its monomorphic counterpart; in MLton, this is a constant-time operation

  • toPoly v
    type cast a monomorphic vector to its polymorphic counterpart; in MLton, this is a constant-time operation


Last edited on 2007-08-23 03:44:26 by MatthewFluet. mlton-20100608/doc/guide/MLtonPlatform0000644000076600000240000001227011404435634016110 0ustar mtfstaff MLtonPlatform - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonPlatform
Home  Index  
signature MLTON_PLATFORM =
   sig
      structure Arch:
         sig
            datatype t = Alpha | AMD64 | ARM | HPPA | IA64 | m68k 
                       | MIPS | PowerPC | S390 | Sparc | X86

            val fromString: string -> t option
            val host: t
            val toString: t -> string
         end
         
      structure OS:
         sig
            datatype t = AIX | Cygwin | Darwin | FreeBSD | HPUX 
                       | Linux | MinGW | NetBSD | OpenBSD | Solaris

            val fromString: string -> t option
            val host: t
            val toString: t -> string
         end
   end

  • datatype Arch.t
    processor architectures

  • Arch.fromString a
    converts from string to architecture. Case insensitive.

  • Arch.host
    the architecture for which the program is compiled.

  • Arch.toString
    string for architecture.

  • datatype OS.t
    operating systems

  • OS.fromString
    converts from string to operating system. Case insensitive.

  • OS.host
    the operating system for which the program is compiled.

  • OS.toString
    string for operating system.


Last edited on 2007-08-23 03:44:30 by MatthewFluet. mlton-20100608/doc/guide/MLtonPointer0000644000076600000240000001333511404435634015747 0ustar mtfstaff MLtonPointer - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonPointer
Home  Index  
signature MLTON_POINTER =
   sig
      eqtype t

      val add: t * word -> t
      val compare: t * t -> order
      val diff: t * t -> word
      val getInt8: t * int -> Int8.int
      val getInt16: t * int -> Int16.int
      val getInt32: t * int -> Int32.int
      val getInt64: t * int -> Int64.int
      val getPointer: t * int -> t
      val getReal32: t * int -> Real32.real
      val getReal64: t * int -> Real64.real
      val getWord8: t * int -> Word8.word
      val getWord16: t * int -> Word16.word
      val getWord32: t * int -> Word32.word
      val getWord64: t * int -> Word64.word
      val null: t
      val setInt8: t * int * Int8.int -> unit
      val setInt16: t * int * Int16.int -> unit
      val setInt32: t * int * Int32.int -> unit
      val setInt64: t * int * Int64.int -> unit
      val setPointer: t * int * t -> unit
      val setReal32: t * int * Real32.real -> unit
      val setReal64: t * int * Real64.real -> unit
      val setWord8: t * int * Word8.word -> unit
      val setWord16: t * int * Word16.word -> unit
      val setWord32: t * int * Word32.word -> unit
      val setWord64: t * int * Word64.word -> unit
      val sizeofPointer: word
      val sub: t * word -> t
   end

  • eqtype t
    the type of pointers, i.e. machine addresses.

  • add (p, w)
    returns the pointer w bytes after than p. Does not check for overflow.

  • compare (p1, p2)
    compares the pointer p1 to the pointer p2 (as addresses).

  • diff (p1, p2)
    returns the number of bytes w such that add (p2, w) = p1. Does not check for overflow.

  • getX (p, i)
    returns the object stored at index i of the array of X objects pointed to by p. For example, getWord32 (p, 7) returns the 32-bit word stored 28 bytes beyond p.

  • null
    the null pointer, i.e. 0.

  • setX (p, i, v)
    assigns v to the object stored at index i of the array of X objects pointed to by p. For example, setWord32 (p, 7, w) stores the 32-bit word w at the address 28 bytes beyond p.

  • sizeofPointer
    size, in bytes, of a pointer.

  • sub (p, w)
    returns the pointer w bytes before p. Does not check for overflow.


Last edited on 2009-06-05 23:27:00 by MatthewFluet. mlton-20100608/doc/guide/MLtonProcEnv0000644000076600000240000000464011404435634015702 0ustar mtfstaff MLtonProcEnv - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonProcEnv
Home  Index  
signature MLTON_PROC_ENV =
   sig
      type gid

      val setenv: {name: string, value: string} -> unit
      val setgroups: gid list -> unit
  end

  • setenv {name, value}
    like the C setenv function. Does not require name or value to be null terminated.

  • setgroups grps
    like the C setgroups function.


Last edited on 2007-08-23 03:44:40 by MatthewFluet. mlton-20100608/doc/guide/MLtonProcess0000644000076600000240000004316311404435634015747 0ustar mtfstaff MLtonProcess - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonProcess
Home  Index  
signature MLTON_PROCESS =
   sig
      type pid

      val spawn: {args: string list, path: string} -> pid
      val spawne: {args: string list, env: string list, path: string} -> pid
      val spawnp: {args: string list, file: string} -> pid

      type ('stdin, 'stdout, 'stderr) t

      type input
      type output

      type none
      type chain
      type any

      exception MisuseOfForget
      exception DoublyRedirected

      structure Child:
        sig
          type ('use, 'dir) t

          val binIn: (BinIO.instream, input) t -> BinIO.instream
          val binOut: (BinIO.outstream, output) t -> BinIO.outstream
          val fd: (Posix.FileSys.file_desc, 'dir) t -> Posix.FileSys.file_desc
          val remember: (any, 'dir) t -> ('use, 'dir) t
          val textIn: (TextIO.instream, input) t -> TextIO.instream
          val textOut: (TextIO.outstream, output) t -> TextIO.outstream
        end

      structure Param:
        sig
          type ('use, 'dir) t

          val child: (chain, 'dir) Child.t -> (none, 'dir) t
          val fd: Posix.FileSys.file_desc -> (none, 'dir) t
          val file: string -> (none, 'dir) t
          val forget: ('use, 'dir) t -> (any, 'dir) t
          val null: (none, 'dir) t
          val pipe: ('use, 'dir) t
          val self: (none, 'dir) t
        end

      val create:
         {args: string list,
          env: string list option,
          path: string,
          stderr: ('stderr, output) Param.t,
          stdin: ('stdin, input) Param.t,
          stdout: ('stdout, output) Param.t}
         -> ('stdin, 'stdout, 'stderr) t
      val getStderr: ('stdin, 'stdout, 'stderr) t -> ('stderr, input) Child.t
      val getStdin:  ('stdin, 'stdout, 'stderr) t -> ('stdin, output) Child.t
      val getStdout: ('stdin, 'stdout, 'stderr) t -> ('stdout, input) Child.t
      val kill: ('stdin, 'stdout, 'stderr) t * Posix.Signal.signal -> unit
      val reap: ('stdin, 'stdout, 'stderr) t -> Posix.Process.exit_status
   end

Spawn

The spawn functions provide an alternative to the fork/exec idiom that is typically used to create a new process. On most platforms, the spawn functions are simple wrappers around fork/exec. However, under Windows, the spawn functions are primitive. All spawn functions return the process id of the spawned process. They differ in how the executable is found and the environment that it uses.

  • spawn {args, path} 
    starts a new process running the executable specified by path with the arguments args. Like Posix.Process.exec.

  • spawne {args, env, path} 
    starts a new process running the executable specified by path with the arguments args and environment env. Like Posix.Process.exece.

  • spawnp {args, file} 
    search the PATH environment variable for an executable named file, and start a new process running that executable with the arguments args. Like Posix.Process.execp.

Create

MLton.Process.create provides functionality similar to Unix.executeInEnv, but provides more control control over the input, output, and error streams. In addition, create works on all platforms, including Cygwin and MinGW (Windows) where Posix.fork is unavailable. For greatest portability programs should still use the standard Unix.execute, Unix.executeInEnv, and OS.Process.system.

The following types and sub-structures are used by the create function. They provide static type checking of correct stream usage.

Child

  • ('use, 'dir) Child.t
    This represents a handle to one of a child's standard streams. The 'dir is viewed with respect to the parent. Thus a ('a, input) Child.t handle means that the parent may input the output from the child.

  • Child.{bin,text}{In,Out} h
    These functions take a handle and bind it to a stream of the named type. The type system will detect attempts to reverse the direction of a stream or to use the same stream in multiple, incompatible ways.

  • Child.fd h
    This function behaves like the other Child.* functions; it opens a stream. However, it does not enforce that you read or write from the handle. If you use the descriptor in an inappropriate direction, the behavior is undefined. Furthermore, this function may potentially be unavailable on future MLton host platforms.

  • Child.remember h
    This function takes a stream of use any and resets the use of the stream so that the stream may be used by Child.*. An any stream may have had use none or 'use prior to calling Param.forget. If the stream was none and is used, MisuseOfForget is raised.

Param

  • ('use, 'dir) Param.t
    This is a handle to an input/output source and will be passed to the created child process. The 'dir is relative to the child process. Input means that the child process will read from this stream.

  • Param.child h
    Connect the stream of the new child process to the stream of a previously created child process. A single child stream should be connected to only one child process or else DoublyRedirected will be raised.

  • Param.fd fd
    This creates a stream from the provided file descriptor which will be closed when create is called. This function may not be available on future MLton host platforms.

  • Param.forget h
    This hides the type of the actual parameter as any. This is useful if you are implementing an application which conditionally attaches the child process to files or pipes. However, you must ensure that your use after Child.remember matches the original type.

  • Param.file s
    Open the given file and connect it to the child process. Note that the file will be opened only when create is called. So any exceptions will be raised there and not by this function. If used for input, the file is opened read-only. If used for output, the file is opened read-write.

  • Param.null
    In some situations, the child process should have its output discarded. The null param when passed as stdout or stderr does this. When used for stdin, the child process will either receive EOF or a failure condition if it attempts to read from stdin.

  • Param.pipe
    This will connect the input/output of the child process to a pipe which the parent process holds. This may later form the input to one of the Child.* functions and/or the Param.child function.

  • Param.self
    This will connect the input/output of the child process to the corresponding stream of the parent process.

Process

  • type ('stdin, 'stdout, 'stderr) t
    represents a handle to a child process. The type arguments capture how the named stream of the child process may be used.

  • type any
    bypasses the type system in situations where an application does not want the it to enforce correct usage. See Child.remember and Param.forget.

  • type chain
    means that the child process's stream was connected via a pipe to the parent process. The parent process may pass this pipe in turn to another child, thus chaining them together.

  • type input, output
    record the direction that a stream flows. They are used as a part of Param.t and Child.t and is detailed there.

  • type none
    means that the child process's stream my not be used by the parent process. This happens when the child process is connected directly to some source.

The types BinIO.instream, BinIO.outstream, TextIO.instream, TextIO.outstream, and Posix.FileSys.file_desc are also valid types with which to instantiate child streams.

  • exception MisuseOfForget
    may be raised if Child.remember and Param.forget are used to bypass the normal type checking. This exception will only be raised in cases where the forget mechanism allows a misuse that would be impossible with the type-safe versions.

  • exception DoublyRedirected
    raised if a stream connected to a child process is redirected to two separate child processes. It is safe, though bad style, to use the a Child.t with the same Child.* function repeatedly.

  • create {args, path, env, stderr, stdin, stdout} 
    starts a child process with the given command-line args (excluding the program name). path should be an absolute path to the executable run in the new child process; relative paths work, but are less robust. Optionally, the environment may be overridden with env where each string element has the form "key=value". The std* options must be provided by the Param.* functions documented above.

    Processes which are created must be either reaped or killed.

  • getStd{in,out,err} proc
    gets a handle to the specified stream. These should be used by the Child.* functions. Failure to use a stream connected via pipe to a child process may result in runtime dead-lock and elicits a compiler warning.

  • kill (proc, sig)
    terminates the child process immediately. The signal may or may not mean anything depending on the host platform. A good value is Posix.Signal.term.

  • reap proc
    waits for the child process to terminate and return its exit status.

Important usage notes

When building an application with many pipes between child processes, it is important to ensure that there are no cycles in the undirected pipe graph. If this property is not maintained, deadlocks are a very serious potential bug which may only appear under difficult to reproduce conditions.

The danger lies in that most operating systems implement pipes with a fixed buffer size. If process A has two output pipes which process B reads, it can happen that process A blocks writing to pipe 2 because it is full while process B blocks reading from pipe 1 because it is empty. This same situation can happen with any undirected cycle formed between processes (vertexes) and pipes (undirected edges) in the graph.

It is possible to make this safe using low-level I/O primitives for polling. However, these primitives are not very portable and difficult to use properly. A far better approach is to make sure you never create a cycle in the first place.

For these reasons, the Unix.executeInEnv is a very dangerous function. Be careful when using it to ensure that the child process only operates on either stdin or stdout, but not both.

Example use of MLton.Process.create

The following example program launches the ipconfig utility, pipes its output through grep, and then reads the result back into the program.

open MLton.Process
val p = 
        create {args = [ "/all" ],
                env = NONE,
                path = "C:\\WINDOWS\\system32\\ipconfig.exe",
                stderr = Param.self,
                stdin = Param.null,
                stdout = Param.pipe}
val q =
        create {args = [ "IP-Ad" ],
                env = NONE,
                path = "C:\\msys\\bin\\grep.exe",
                stderr = Param.self,
                stdin = Param.child (getStdout p),
                stdout = Param.pipe}
fun suck h =
        case TextIO.inputLine h of
                NONE => ()
                | SOME s => (print ("'" ^ s ^ "'\n"); suck h)

val () = suck (Child.textIn (getStdout q))


Last edited on 2009-06-15 22:22:05 by MatthewFluet. mlton-20100608/doc/guide/MLtonProfile0000644000076600000240000002114511404435634015725 0ustar mtfstaff MLtonProfile - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonProfile
Home  Index  
signature MLTON_PROFILE =
   sig
      structure Data:
         sig
            type t

            val equals: t * t -> bool
            val free: t -> unit
            val malloc: unit -> t
            val write: t * string -> unit
         end

      val isOn: bool
      val withData: Data.t * (unit -> 'a) -> 'a
   end

MLton.Profile provides Profiling control from within the program, allowing you to profile individual portions of your program. With MLton.Profile, you can create many units of profiling data (essentially, mappings from functions to counts) during a run of a program, switch between them while the program is running, and output multiple mlmon.out files.

  • isOn
    a compile-time constant that is false only when compiling -profile no.

  • type Data.t
    the type of a unit of profiling data. In order to most efficiently execute non-profiled programs, when compiling -profile no (the default), Data.t is equivalent to unit ref.

  • Data.equals (x, y)
    returns true if the x and y are the same unit of profiling data.

  • Data.free x
    frees the memory associated with the unit of profiling data x. It is an error to free the current unit of profiling data or to free a previously freed unit of profiling data. When compiling -profile no, Data.free x is a no-op.

  • Data.malloc ()
    returns a new unit of profiling data. Each unit of profiling data is allocated from the process address space (but is not in the MLton heap) and consumes memory proportional to the number of source functions. When compiling -profile no, Data.malloc () is equivalent to allocating a new unit ref.

  • write (x, f)
    writes the accumulated ticks in the unit of profiling data x to file f. It is an error to write a previously freed unit of profiling data. When compiling -profile no, write (x, f) is a no-op. A profiled program will always write the current unit of profiling data at program exit to a file named mlmon.out.

  • withData (d, f)
    runs f with d as the unit of profiling data, and returns the result of f after restoring the current unit of profiling data. When compiling -profile no, withData (d, f) is equivalent to f ().

Example

Here is an example, taken from the examples/profiling directory, showing how to profile the executions of the fib and tak functions separately. Suppose that fib-tak.sml contains the following.

structure Profile = MLton.Profile
   
val fibData = Profile.Data.malloc ()
val takData = Profile.Data.malloc ()

fun wrap (f, d) x =
   Profile.withData (d, fn () => f x)

val rec fib =
   fn 0 => 0
    | 1 => 1
    | n => fib (n - 1) + fib (n - 2)
val fib = wrap (fib, fibData)

fun tak (x,y,z) =
   if not (y < x)
      then z
   else tak (tak (x - 1, y, z),
             tak (y - 1, z, x),
             tak (z - 1, x, y))
val tak = wrap (tak, takData)

val rec f =
   fn 0 => ()
    | n => (fib 38; f (n-1))
val _ = f 2

val rec g =
   fn 0 => ()
    | n => (tak (18,12,6); g (n-1))
val _ = g 500

fun done (data, file) =
   (Profile.Data.write (data, file)
    ; Profile.Data.free data)
    
val _ = done (fibData, "mlmon.fib.out")
val _ = done (takData, "mlmon.tak.out")

Compile and run the program.

% mlton -profile time fib-tak.sml
% ./fib-tak

Separately display the profiling data for fib

% mlprof fib-tak mlmon.fib.out
5.77 seconds of CPU time (0.00 seconds GC)
function   cur 
--------- -----
fib       96.9%
<unknown>  3.1%

and for tak

% mlprof fib-tak mlmon.tak.out
0.68 seconds of CPU time (0.00 seconds GC)
function  cur  
-------- ------
tak      100.0%

Combine the data for fib and tak by calling mlprof with multiple mlmon.out files.

% mlprof fib-tak mlmon.fib.out mlmon.tak.out mlmon.out
6.45 seconds of CPU time (0.00 seconds GC)
function   cur 
--------- -----
fib       86.7%
tak       10.5%
<unknown>  2.8%


Last edited on 2007-08-23 03:44:58 by MatthewFluet. mlton-20100608/doc/guide/MLtonRandom0000644000076600000240000000664611404435635015557 0ustar mtfstaff MLtonRandom - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonRandom
Home  Index  
signature MLTON_RANDOM =
   sig
      val alphaNumChar: unit -> char
      val alphaNumString: int -> string
      val rand: unit -> word
      val seed: unit -> word option
      val srand: word -> unit
      val useed: unit -> word option
   end

  • alphaNumChar ()
    returns a random alphanumeric character.

  • alphaNumString n
    returns a string of length n of random alphanumeric characters.

  • rand ()
    returns the next pseudo-random number.

  • seed ()
    returns a random word from /dev/random. Useful as an arg to srand. If /dev/random can not be read from, seed () returns NONE. A call to seed may block until enough random bits are available.

  • srand w
    sets the seed used by rand to w.

  • useed ()
    returns a random word from /dev/urandom. Useful as an arg to srand. If /dev/urandom can not be read from, useed () returns NONE. A call to useed will never block -- it will instead return lower quality random bits.


Last edited on 2007-08-23 03:45:02 by MatthewFluet. mlton-20100608/doc/guide/MLtonReal0000644000076600000240000000746411404435634015220 0ustar mtfstaff MLtonReal - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonReal
Home  Index  
signature MLTON_REAL =
   sig
      type t

      val fromWord: word -> t
      val fromLargeWord: LargeWord.word -> t
      val toWord: IEEEReal.rounding_mode -> t -> word
      val toLargeWord: IEEEReal.rounding_mode -> t -> LargeWord.word
   end

  • type t
    the type of reals. For MLton.LargeReal this is LargeReal.real, for MLton.Real this is Real.real, for MLton.Real32 this is Real32.real, for MLton.Real64 this is Real64.real.

  • fromWord w

  • fromLargeWord w
    convert the word w to a real value. If the value of w is larger than (the appropriate) REAL.maxFinite, then infinity is returned. If w cannot be exactly represented as a real value, then the current rounding mode is used to determine the resulting value.

  • toWord mode r

  • toLargeWord mode r
    convert the argument r to a word type using the specified rounding mode. They raise Overflow if the result is not representable, in particular, if r is an infinity. They raise Domain if r is NaN.

  • MLton.Real32.castFromWord w

  • MLton.Real64.castFromWord w
    convert the argument w to a real type as a bit-wise cast.

  • MLton.Real32.castToWord r

  • MLton.Real64.castToWord r
    convert the argument r to a word type as a bit-wise cast.


Last edited on 2007-08-23 03:45:07 by MatthewFluet. mlton-20100608/doc/guide/MLtonRlimit0000644000076600000240000001142311404435634015563 0ustar mtfstaff MLtonRlimit - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonRlimit
Home  Index  
signature MLTON_RLIMIT =
   sig
      structure RLim : sig
                          type t
                          val castFromSysWord: SysWord.word -> t
                          val castToSysWord: t -> SysWord.word
                       end

      val infinity: RLim.t

      type t
               
      val coreFileSize: t        (* CORE    max core file size *)
      val cpuTime: t             (* CPU     CPU time in seconds *)
      val dataSize: t            (* DATA    max data size *)
      val fileSize: t            (* FSIZE   Maximum filesize *)
      val numFiles: t            (* NOFILE  max number of open files *)  
      val lockedInMemorySize: t  (* MEMLOCK max locked address space *)
      val numProcesses: t        (* NPROC   max number of processes *)
      val residentSetSize: t     (* RSS     max resident set size *)
      val stackSize: t           (* STACK   max stack size *)
      val virtualMemorySize: t   (* AS      virtual memory limit *)

      val get: t -> {hard: rlim, soft: rlim}
      val set: t * {hard: rlim, soft: rlim} -> unit
   end

MLton.Rlimit provides a wrapper around the C getrlimit and setrlimit functions.

  • type Rlim.t
    the type of resource limits.

  • infinity
    indicates that a resource is unlimited.

  • type t
    the types of resources that can be inspected and modified.

  • get r
    returns the current hard and soft limits for resource r. May raise OS.SysErr.

  • set (r, {hard, soft})
    sets the hard and soft limits for resource r. May raise OS.SysErr.


Last edited on 2007-08-23 03:20:15 by MatthewFluet. mlton-20100608/doc/guide/MLtonRusage0000644000076600000240000000701411404435635015553 0ustar mtfstaff MLtonRusage - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonRusage
Home  Index  
signature MLTON_RUSAGE =
   sig
      type t = {utime: Time.time, (* user time *)
                stime: Time.time} (* system time *)

      val measureGC: bool -> unit         
      val rusage: unit -> {children: t, gc: t, self: t}
   end

  • type t
    corresponds to a subset of the C struct rusage.

  • measureGC b
    controls whether garbage collection time is separately measured during program execution. This affects the behavior of both rusage and Timer.checkCPUTimes, both of which will return gc times of zero with measureGC false. Garbage collection time is always measured when either gc-messages or gc-summary is given as a runtime system option.

  • rusage ()
    corresponds to the C getrusage function. It returns the resource usage of the exited children, the garbage collector, and the process itself. The self component includes the usage of the gc component, regardless of whether measureGC is true or false. If rusage is used in a program, either directly, or indirectly via the Timer structure, then measureGC true is automatically called at the start of the program (it can still be disable by user code later).


Last edited on 2007-08-23 03:45:11 by MatthewFluet. mlton-20100608/doc/guide/MLtonSignal0000644000076600000240000002401511404435634015541 0ustar mtfstaff MLtonSignal - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonSignal
Home  Index  
signature MLTON_SIGNAL =
   sig
      type t = Posix.Signal.signal
      type signal = t

      structure Handler:
         sig
            type t

            val default: t
            val handler: (Thread.Runnable.t -> Thread.Runnable.t) -> t
            val ignore: t
            val isDefault: t -> bool
            val isIgnore: t -> bool
            val simple: (unit -> unit) -> t
         end

      structure Mask:
         sig
            type t
               
            val all: t
            val allBut: signal list -> t
            val block: t -> unit
            val getBlocked: unit -> t
            val isMember: t * signal -> bool
            val none: t
            val setBlocked: t -> unit
            val some: signal list -> t
            val unblock: t -> unit
         end

      val getHandler: t -> Handler.t
      val handled: unit -> Mask.t
      val prof: t
      val restart: bool ref
      val setHandler: t * Handler.t -> unit
      val suspend: Mask.t -> unit
      val vtalrm: t
   end

Signals handlers are functions from (runnable) threads to (runnable) threads. When a signal arrives, the corresponding signal handler is invoked, its argument being the thread that was interrupted by the signal. The signal handler runs asynchronously, in its own thread. The signal handler returns the thread that it would like to resume execution (this is often the thread that it was passed). It is an error for a signal handler to raise an exception that is not handled within the signal handler itself.

A signal handler is never invoked while the running thread is in a critical section (see MLtonThread). Invoking a signal handler implicitly enters a critical section and the normal return of a signal handler implicitly exits the critical section; hence, a signal handler is never interrupted by another signal handler.

  • type t
    the type of signals.

  • type Handler.t
    the type of signal handlers.

  • Handler.default
    handles the signal with the default action.

  • Handler.handler f
    returns a handler h such that when a signal s is handled by h, f will be passed the thread that was interrupted by s and should return the thread that will resume execution.

  • Handler.ignore
    is a handler that will ignore the signal.

  • Handler.isDefault
    returns true if the handler is the default handler.

  • Handler.isIgnore
    returns true if the handler is the ignore handler.

  • Handler.simple f
    returns a handler that executes f () and does not switch threads.

  • type Mask.t
    the type of signal masks, which are sets of blocked signals.

  • Mask.all
    a mask of all signals.

  • Mask.allBut l
    a mask of all signals except for those in l.

  • Mask.block m
    blocks all signals in m.

  • Mask.getBlocked ()
    gets the signal mask m, i.e. a signal is blocked if and only if it is in m.

  • Mask.isMember (m, s)
    returns true if the signal s is in m.

  • Mask.none
    a mask of no signals.

  • Mask.setBlocked m
    sets the signal mask to m, i.e. a signal is blocked if and only if it is in m.

  • Mask.some l
    a mask of the signals in l.

  • Mask.unblock m
    unblocks all signals in m.

  • getHandler s
    returns the current handler for signal s.

  • handled ()
    returns the signal mask m corresponding to the currently handled signals; i.e., a signal is handled if and only if it is in m.

  • prof
    SIGPROF, the profiling signal.

  • restart
    dynamically determines the behavior of interrupted system calls; when true, interrupted system calls are restarted; when false, interrupted system calls raise OS.SysError.

  • setHandler (s, h)
    sets the handler for signal s to h.

  • suspend m
    temporarily sets the signal mask to m and suspends until an unmasked signal is received and handled, at which point suspend resets the mask and returns.

  • vtalrm
    SIGVTALRM, the signal for virtual timers.

Interruptible System Calls

Signal handling interacts in a non-trivial way with those functions in the Basis Library that correspond directly to interruptible system calls (a subset of those functions that may raise OS.SysError). The desire is that these functions should have predictable semantics. The principal concerns are:

  1. System calls that are interrupted by signals should, by default, be restarted; the alternative is to raise

     OS.SysError (Posix.Error.errorMsg Posix.Error.intr, 
                  SOME Posix.Error.intr)
    This behavior is determined dynamically by the value of Signal.restart.

  2. Signal handlers should always get a chance to run (when outside a critical region). If a system call is interrupted by a signal, then the signal handler will run before the call is restarted or OS.SysError is raised; that is, before the Signal.restart check.

  3. A system call that must be restarted while in a critical section will be restarted with the handled signals blocked (and the previously blocked signals remembered). This encourages the system call to complete, allowing the program to make progress towards leaving the critical section where the signal can be handled. If the system call completes, the set of blocked signals are restored to those previously blocked.


Last edited on 2007-12-01 21:41:45 by MatthewFluet. mlton-20100608/doc/guide/MLtonSocket0000644000076600000240000001426511404435635015563 0ustar mtfstaff MLtonSocket - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonSocket
Home  Index  
signature MLTON_SOCKET =
   sig
      structure Address:
         sig
            type t = NetHostDB.in_addr
         end
      structure Ctl:
         sig
            val getERROR: ('af, 'sock_type) Socket.sock -> (string * Posix.Error.syserror option) option
         end
      structure Host:
         sig
            type t = {name: string}

            val getByAddress: Address.t -> t option
            val getByName: string -> t option
         end
      structure Port:
         sig
            type t = int
         end

      type t

      val accept: t -> Address.t * Port.t * TextIO.instream * TextIO.outstream
      val connect: string * Port.t -> TextIO.instream * TextIO.outstream
      val listen: unit -> Port.t * t
      val listenAt: Port.t -> t
      val shutdownRead: TextIO.instream -> unit
      val shutdownWrite: TextIO.outstream -> unit

      val fdToSock: Posix.FileSys.file_desc -> ('a, 'b) Socket.sock
   end

This module contains a bare minimum of functionality to do TCP/IP programming. This module is implemented on top of the Socket module of the Basis Library. We encourage you to use the standard Socket module, since MLton.Socket is deprecated.

  • type Address.t
    the type of IP addresses.

  • Ctl.getERROR s
    like the Basis Library's Socket.Ctl.getERROR, except that it returns more information. NONE means that there was no error, and SOME means that there was an error, and provides the error message and error code, if any.

  • Host.getByAddress a
    looks up the hostname (using gethostbyaddr) corresponding to a.

  • Host.getByName s
    looks up the hostname (using gethostbyname) corresponding to s.

  • type Port.t
    the type of TCP ports.

  • type t
    the type of sockets.

  • accept s
    accepts a connection on socket s and return the address port of the connecting socket, as well as streams corresponding to the connection.

  • connect (h, p)
    connects to host h on port p, returning the streams corresponding to the connection.

  • listen ()
    listens to a port chosen by the system. Returns the port and the socket.

  • listenAt p
    listens to port p. Returns the socket.

  • shutdownRead ins
    causes the read part of the socket associated with ins to be shutdown.

  • shutdownWrite out
    causes the write part of the socket associated with out to be shutdown.

  • fdToSock fd
    coerces a file descriptor to a socket.


Last edited on 2007-08-23 03:45:24 by MatthewFluet. mlton-20100608/doc/guide/MLtonStructure0000644000076600000240000004377511404435634016342 0ustar mtfstaff MLtonStructure - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonStructure
Home  Index  
The MLton structure contains a lot of functionality that is not available in the Basis Library. As a warning, please keep in mind that the MLton structure and its substructures do change from release to release of MLton.
structure MLton:
   sig
      val eq: 'a * 'a -> bool
      val equal: 'a * 'a -> bool
      val hash: 'a -> Word32.word
      val isMLton: bool
      val share: 'a -> unit
      val shareAll: unit -> unit
      val size: 'a -> int

      structure Array: MLTON_ARRAY
      structure BinIO: MLTON_BIN_IO
      structure CharArray: MLTON_MONO_ARRAY where type t = CharArray.array
                                            where type elem = CharArray.elem
      structure CharVector: MLTON_MONO_VECTOR where type t = CharVector.vector
                                              where type elem = CharVector.elem
      structure Cont: MLTON_CONT
      structure Exn: MLTON_EXN
      structure Finalizable: MLTON_FINALIZABLE
      structure GC: MLTON_GC
      structure IntInf: MLTON_INT_INF
      structure Itimer: MLTON_ITIMER
      structure LargeReal: MLTON_REAL where type t = LargeReal.real
      structure LargeWord: MLTON_WORD where type t = LargeWord.word
      structure Platform: MLTON_PLATFORM
      structure Pointer: MLTON_POINTER
      structure ProcEnv: MLTON_PROC_ENV
      structure Process: MLTON_PROCESS
      structure Profile: MLTON_PROFILE
      structure Random: MLTON_RANDOM
      structure Real: MLTON_REAL where type t = Real.real
      structure Real32: sig
                           include MLTON_REAL
                           val castFromWord: Word32.word -> t
                           val castToWord: t -> Word32.word
                        end where type t = Real32.real
      structure Real64: sig
                           include MLTON_REAL
                           val castFromWord: Word64.word -> t
                           val castToWord: t -> Word64.word
                        end where type t = Real64.real
      structure Rlimit: MLTON_RLIMIT
      structure Rusage: MLTON_RUSAGE
      structure Signal: MLTON_SIGNAL
      structure Socket: MLTON_SOCKET
      structure Syslog: MLTON_SYSLOG
      structure TextIO: MLTON_TEXT_IO
      structure Thread: MLTON_THREAD
      structure Vector: MLTON_VECTOR
      structure Weak: MLTON_WEAK
      structure Word: MLTON_WORD where type t = Word.word
      structure Word8: MLTON_WORD where type t = Word8.word
      structure Word16: MLTON_WORD where type t = Word16.word
      structure Word32: MLTON_WORD where type t = Word32.word
      structure Word64: MLTON_WORD where type t = Word64.word
      structure Word8Array: MLTON_MONO_ARRAY where type t = Word8Array.array
                                             where type elem = Word8Array.elem
      structure Word8Vector: MLTON_MONO_VECTOR where type t = Word8Vector.vector
                                               where type elem = Word8Vector.elem
      structure World: MLTON_WORLD
   end

Substructures

Values

  • eq (x, y)
    returns true if x and y are equal as pointers. For simple types like char, int, and word, this is the same as equals. For arrays, datatypes, strings, tuples, and vectors, this is a simple pointer equality. The semantics is a bit murky.

  • equal (x, y)
    returns true if x and y are structurally equal. For equality types, this is the same as PolymorphicEquality. For other types, it is a conservative approximation of equivalence.

  • hash x
    returns a structural hash of x. The hash function is consistent between execution of the same program, but may not be consistent between different programs.

  • isMLton
    is always true in a MLton implementation, and is always false in a stub implementation.

  • share x
    maximizes sharing in the heap for the object graph reachable from x.

  • shareAll ()
    maximizes sharing in the heap by sharing space for equivalent immutable objects. A call to shareAll performs a major garbage collection, and takes time proportional to the size of the heap.

  • size x
    returns the amount of heap space (in bytes) taken by the value of x, including all objects reachable from x by following pointers. It takes time proportional to the size of x. See below for an example.

Example of MLton.size

This example, size.sml, demonstrates the application of MLton.size to many different kinds of objects.

fun 'a printSize (name: string, min: int, value: 'a): unit=
   if MLton.size value >= min
      then
         (print "The size of "
          ; print name
          ; print " is >= "
          ; print (Int.toString min)
          ; print " bytes.\n")
   else ()

val l = [1, 2, 3, 4]

val _ =
   (
    printSize ("a char", 0, #"c")
    ; printSize ("an int list of length 4", 48, l)
    ; printSize ("a string of length 10", 24, "0123456789")
    ; printSize ("an int array of length 10", 52, Array.tabulate (10, fn _ => 0))
    ; printSize ("a double array of length 10",
                 92, Array.tabulate (10, fn _ => 0.0))
    ; printSize ("an array of length 10 of 2-ples of ints",
                 92, Array.tabulate (10, fn i => (i, i + 1)))
    ; printSize ("a useless function", 0, fn _ => 13)
    )

(* This is here so that the list is "useful".
 * If it were removed, then the optimizer (remove-unused-constructors)
 * would remove l entirely.
 *)
val _ = if 10 = foldl (op +) 0 l
           then ()
        else raise Fail "bug"
   
local
   open MLton.Cont
in
   val rc: int option t option ref = ref NONE
   val _ =
      case callcc (fn k: int option t => (rc := SOME k; throw (k, NONE))) of
         NONE => ()
       | SOME i => print (concat [Int.toString i, "\n"])
end

val _ =
   (print "The size of a continuation option ref is "
    ; if MLton.size rc > 1000
         then print "> 1000.\n"
      else print "< 1000.\n")

val _ =
   case !rc of
      NONE => ()
    | SOME k => (rc := NONE; MLton.Cont.throw (k, SOME 13))

Compile and run as usual.

% mlton size.sml
% ./size
The size of a char is >= 0 bytes.
The size of an int list of length 4 is >= 48 bytes.
The size of a string of length 10 is >= 24 bytes.
The size of an int array of length 10 is >= 52 bytes.
The size of a double array of length 10 is >= 92 bytes.
The size of an array of length 10 of 2-ples of ints is >= 92 bytes.
The size of a useless function is >= 0 bytes.
The size of a continuation option ref is > 1000.
13
The size of a continuation option ref is < 1000.


Last edited on 2009-06-06 01:21:46 by MatthewFluet. mlton-20100608/doc/guide/MLtonSyslog0000644000076600000240000001205311404435634015603 0ustar mtfstaff MLtonSyslog - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonSyslog
Home  Index  
signature MLTON_SYSLOG =
   sig
      type openflag
         
      val CONS     : openflag
      val NDELAY   : openflag
      val NOWAIT   : openflag
      val ODELAY   : openflag
      val PERROR   : openflag
      val PID      : openflag

      type facility

      val AUTHPRIV : facility
      val CRON     : facility
      val DAEMON   : facility
      val KERN     : facility
      val LOCAL0   : facility
      val LOCAL1   : facility
      val LOCAL2   : facility
      val LOCAL3   : facility
      val LOCAL4   : facility
      val LOCAL5   : facility
      val LOCAL6   : facility
      val LOCAL7   : facility
      val LPR      : facility
      val MAIL     : facility
      val NEWS     : facility
      val SYSLOG   : facility
      val USER     : facility
      val UUCP     : facility

      type loglevel

      val EMERG    : loglevel
      val ALERT    : loglevel
      val CRIT     : loglevel
      val ERR      : loglevel
      val WARNING  : loglevel
      val NOTICE   : loglevel
      val INFO     : loglevel
      val DEBUG    : loglevel

      val closelog: unit -> unit
      val log: loglevel * string -> unit
      val openlog: string * openflag list * facility -> unit
   end

MLton.Syslog is a complete interface to the system logging facilities. See man 3 syslog for more details.

  • closelog ()
    closes the connection to the system logger.

  • log (l, s)
    logs message s at a loglevel l.

  • openlog (name, flags, facility)
    opens a connection to the system logger. name will be prefixed to each message, and is typically set to the program name.


Last edited on 2007-08-23 03:45:37 by MatthewFluet. mlton-20100608/doc/guide/MLtonTextIO0000644000076600000240000000350711404435635015504 0ustar mtfstaff MLtonTextIO - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonTextIO
Home  Index  
signature MLTON_TEXT_IO = MLTON_IO

See MLtonIO.


Last edited on 2005-12-01 23:11:52 by StephenWeeks. mlton-20100608/doc/guide/MLtonThread0000644000076600000240000004154511404435634015542 0ustar mtfstaff MLtonThread - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonThread
Home  Index  
signature MLTON_THREAD =
   sig
      structure AtomicState:
         sig
            datatype t = NonAtomic | Atomic of int
         end

      val atomically: (unit -> 'a) -> 'a
      val atomicBegin: unit -> unit
      val atomicEnd: unit -> unit
      val atomicState: unit -> AtomicState.t

      structure Runnable:
         sig
            type t
         end

      type 'a t

      val atomicSwitch: ('a t -> Runnable.t) -> 'a
      val new: ('a -> unit) -> 'a t
      val prepend: 'a t * ('b -> 'a) -> 'b t
      val prepare: 'a t * 'a -> Runnable.t
      val switch: ('a t -> Runnable.t) -> 'a
   end

MLton.Thread provides access to MLton's user-level thread implementation (i.e. not OS-level threads). Threads are lightweight data structures that represent a paused computation. Runnable threads are threads that will begin or continue computing when switched to. MLton.Thread does not include a default scheduling mechanism, but it can be used to implement both preemptive and non-preemptive threads.

  • type AtomicState.t
    the type of atomic states.

  • atomically f
    runs f in a critical section.

  • atomicBegin ()
    begins a critical section.

  • atomicEnd ()
    ends a critical section.

  • atomicState ()
    returns the current atomic state.

  • type Runnable.t
    the type of threads that can be resumed.

  • type 'a t
    the type of threads that expect a value of type 'a.

  • atomicSwitch f
    like switch, but assumes an atomic calling context. Upon switching back to the current thread, an implicit atomicEnd is performed.

  • new f
    creates a new thread that, when run, applies f to the value given to the thread. f must terminate by switching to another thread or exiting the process.

  • prepend (t, f)
    creates a new thread (destroying t in the process) that first applies f to the value given to the thread and then continues with t. This is a constant time operation.

  • prepare (t, v)
    prepares a new runnable thread (destroying t in the process) that will evaluate t on v.

  • switch f
    applies f to the current thread to get rt, and then start running thread rt. It is an error for f to perform another switch. f is guaranteed to run atomically.

Example of non-preemptive threads

structure Queue:
   sig
      type 'a t

      val new: unit -> 'a t
      val enque: 'a t * 'a -> unit
      val deque: 'a t -> 'a option
   end =
   struct
      datatype 'a t = T of {front: 'a list ref, back: 'a list ref}

      fun new() = T{front = ref [], back = ref []}

      fun enque(T{back, ...}, x) = back := x :: !back

      fun deque(T{front, back}) =
         case !front of
            [] => (case !back of
                      [] => NONE
                    | l => let val l = rev l
                           in case l of
                              [] => raise Fail "deque"
                            | x :: l => (back := []; front := l; SOME x)
                           end)
          | x :: l => (front := l; SOME x) 
   end

structure Thread:
   sig
      val exit: unit -> 'a
      val run: unit -> unit
      val spawn: (unit -> unit) -> unit
      val yield: unit -> unit
   end =
   struct
      open MLton
      open Thread

      val topLevel: Thread.Runnable.t option ref = ref NONE

      local
         val threads: Thread.Runnable.t Queue.t = Queue.new()
      in
         fun ready (t: Thread.Runnable.t) : unit = 
            Queue.enque(threads, t)
         fun next () : Thread.Runnable.t =
            case Queue.deque threads of
               NONE => valOf(!topLevel)
             | SOME t => t
      end
   
      fun 'a exit(): 'a = switch(fn _ => next())
      
      fun new(f: unit -> unit): Thread.Runnable.t =
         Thread.prepare
         (Thread.new (fn () => ((f() handle _ => exit())
                                ; exit())),
          ())
         
      fun schedule t = (ready t; next())

      fun yield(): unit = switch(fn t => schedule (Thread.prepare (t, ())))

      val spawn = ready o new

      fun run(): unit =
         (switch(fn t =>
                 (topLevel := SOME (Thread.prepare (t, ()))
                  ; next()))
          ; topLevel := NONE)
   end

val rec loop =
   fn 0 => ()
    | n => (print(concat[Int.toString n, "\n"])
            ; Thread.yield()
            ; loop(n - 1))

val rec loop' =
   fn 0 => ()
    | n => (Thread.spawn(fn () => loop n); loop'(n - 2))

val _ = Thread.spawn(fn () => loop' 10)

val _ = Thread.run()

val _ = print "success\n"

Example of preemptive threads

structure Queue:
   sig
      type 'a t

      val new: unit -> 'a t
      val enque: 'a t * 'a -> unit
      val deque: 'a t -> 'a option
   end =
   struct
      datatype 'a t = T of {front: 'a list ref, back: 'a list ref}

      fun new () = T {front = ref [], back = ref []}

      fun enque (T {back, ...}, x) = back := x :: !back

      fun deque (T {front, back}) =
         case !front of
            [] => (case !back of
                      [] => NONE
                    | l => let val l = rev l
                           in case l of
                              [] => raise Fail "deque"
                            | x :: l => (back := []; front := l; SOME x)
                           end)
          | x :: l => (front := l; SOME x) 
   end

structure Thread:
   sig
      val exit: unit -> 'a
      val run: unit -> unit
      val spawn: (unit -> unit) -> unit
      val yield: unit -> unit
   end =
   struct
      open Posix.Signal
      open MLton
      open Itimer Signal Thread

      val topLevel: Thread.Runnable.t option ref = ref NONE

      local
         val threads: Thread.Runnable.t Queue.t = Queue.new ()
      in
         fun ready t = Queue.enque (threads, t)
         fun next () =
            case Queue.deque threads of
               NONE => valOf (!topLevel)
             | SOME t => t
      end
   
      fun 'a exit (): 'a = switch (fn _ => next ())
      
      fun new (f: unit -> unit): Thread.Runnable.t =
         Thread.prepare
         (Thread.new (fn () => ((f () handle _ => exit ())
                                ; exit ())),
          ())
         
      fun schedule t = (ready t; next ())

      fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ())))

      val spawn = ready o new

      fun setItimer t =
         Itimer.set (Itimer.Real,
                     {value = t,
                      interval = t})

      fun run (): unit =
         (switch (fn t =>
                  (topLevel := SOME (Thread.prepare (t, ()))
                   ; new (fn () => (setHandler (alrm, Handler.handler schedule)
                                    ; setItimer (Time.fromMilliseconds 20)))))
          ; setItimer Time.zeroTime
          ; ignore alrm
          ; topLevel := NONE)
   end

val rec delay =
   fn 0 => ()
    | n => delay (n - 1)
         
val rec loop =
   fn 0 => ()
    | n => (delay 500000; loop (n - 1))

val rec loop' =
   fn 0 => ()
    | n => (Thread.spawn (fn () => loop n); loop' (n - 1))

val _ = Thread.spawn (fn () => loop' 10)

val _ = Thread.run ()

val _ = print "success\n"


Last edited on 2007-08-23 03:45:45 by MatthewFluet. mlton-20100608/doc/guide/MLtonVector0000644000076600000240000000674711404435635015603 0ustar mtfstaff MLtonVector - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonVector
Home  Index  
signature MLTON_VECTOR =
   sig
      val create: int -> {done: unit -> 'a vector,
                          sub: int -> 'a,
                          update: int * 'a -> unit}
      val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a vector * 'b
   end

  • create n
    initiates the construction a vector v of length n, returning functions to manipulate the vector. The done function may be called to return the created vector; it is an error to call done before all entries have been initialized; it is an error to call done after having called done. The sub function may be called to return an initialized vector entry; it is not an error to call sub after having called done. The update function may be called to initialize a vector entry; it is an error to call update after having called done. One must initialize vector entries in order from lowest to highest; that is, before calling update (i, x), one must have already called update (j, x) for all j in [0, i). The done, sub, and update functions are all constant-time operations.

  • unfoldi (n, b, f)
    constructs a vector v of length n, whose elements vi are determined by the equations b0 = b and (vi, bi+1) = f (i, bi).


Last edited on 2007-08-23 03:45:50 by MatthewFluet. mlton-20100608/doc/guide/MLtonWeak0000644000076600000240000000575411404435634015224 0ustar mtfstaff MLtonWeak - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonWeak
Home  Index  
signature MLTON_WEAK =
   sig
      type 'a t

      val get: 'a t -> 'a option
      val new: 'a -> 'a t
   end

A weak pointer is a pointer to an object that is nulled if the object becomes unreachable due to garbage collection. The weak pointer does not itself cause the object it points to be retained by the garbage collector -- only other strong pointers can do that. For objects that are not allocated in the heap, like integers, a weak pointer will always be nulled. So, if w: int Weak.t then Weak.get w = NONE.

  • type 'a t
    the type of weak pointers to objects of type 'a

  • get w
    returns NONE if the object pointed to by w no longer exists. Otherwise, returns SOME of the object pointed to by w.

  • new x
    returns a weak pointer to x.


Last edited on 2007-08-23 03:45:54 by MatthewFluet. mlton-20100608/doc/guide/MLTONWIKIVERSION0000644000076600000240000000001111404435634015763 0ustar mtfstaff20100608 mlton-20100608/doc/guide/MLtonWord0000644000076600000240000000545011404435634015241 0ustar mtfstaff MLtonWord - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonWord
Home  Index  
signature MLTON_WORD =
   sig
      type t

      val bswap: t -> t
      val rol: t * word -> t
      val ror: t * word -> t
   end

  • type t
    the type of words. For MLton.LargeWord this is LargeWord.word, for MLton.Word this is Word.word, for MLton.Word8 this is Word8.word, for MLton.Word16 this is Word16.word, for MLton.Word32 this is Word32.word, for MLton.Word64 this is Word64.word.

  • bswap w
    byte swap.

  • rol (w, w')
    rotates left (circular).

  • ror (w, w')
    rotates right (circular).


Last edited on 2008-02-20 15:28:17 by MatthewFluet. mlton-20100608/doc/guide/MLtonWorld0000644000076600000240000001024411404435634015412 0ustar mtfstaff MLtonWorld - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLtonWorld
Home  Index  
signature MLTON_WORLD =
   sig
      datatype status = Clone | Original

      val load: string -> 'a
      val save: string -> status
      val saveThread: string * Thread.Runnable.t -> unit
   end

  • datatype status
    specifies whether a world is original or restarted (a clone).

  • load f
    loads the saved computation from file f.

  • save f
    saves the entire state of the computation to the file f. The computation can then be restarted at a later time using World.load or the load-world runtime option. The call to save in the original computation returns Original and the call in the restarted world returns Clone.

  • saveThread (f, rt)
    saves the entire state of the computation to the file f that will resume with thread rt upon restart.

Example

Suppose that save-world.sml contains the following.

open MLton.World
val _ =
   case save "world" of
      Original => print "I am the original\n"
    | Clone => print "I am the clone\n"

Then, if we compile save-world.sml and run it, the Original branch will execute, and a file named world will be created.

% mlton save-world.sml
% save-world
I am the original

We can then load world using the load-world run time option.

% save-world @MLton load-world world --
I am the clone


Last edited on 2007-08-23 03:46:03 by MatthewFluet. mlton-20100608/doc/guide/MLYacc0000644000076600000240000000421511404435634014462 0ustar mtfstaff MLYacc - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MLYacc
Home  Index  
MLYacc is a parser generator for Standard ML modeled after the Yacc parser generator.

A version of MLYacc, ported from the SML/NJ sources, is distributed with MLton.

Also see


Last edited on 2010-05-13 19:32:23 by MatthewFluet. mlton-20100608/doc/guide/moin-bottom.png0000644000076600000240000000020111404435634016370 0ustar mtfstaff‰PNG  IHDR ¾ý„PLTEÿÿÝp¹Þ9tRNSÿå·0JbKGDˆHIDATxÚcøó‡àax ÃðÁ†áG ]9ØÃÃIEND®B`‚mlton-20100608/doc/guide/moin-email.png0000644000076600000240000000023711404435634016164 0ustar mtfstaff‰PNG  IHDR v÷rôPLTEÿÿÿúû¿êë—ÄÅ £¤}~IJƒûWïBIDATxÚcHƒ†0gHRRRRugHPÒA@Z)HIU D»*…€h¥P%'w†D' ¼Š;C² ¸3¤—ƒ—ÌáXiñIEND®B`‚mlton-20100608/doc/guide/moin-ftp.png0000644000076600000240000000042011404435634015660 0ustar mtfstaff‰PNG  IHDR žr‡WPLTEÿÿÿùø›ôø£¾Ýý¶Øý¯àÿ¡¢£––ˆŒŽ‚{{{_`a]ŸÙY__N¡÷B•ï@D>36;26;/38-39,29+29!*3 !##'",!)&6LwŸ—tRNS@æØfbKGDœAZIDATxÚEÍË@0 EÑÔUô>Åÿ§¤ÎhgÝAÈî÷y<ë@\ÒÚð/IÏÆY 1.ŠÈø*삾y£„'!’­l¥”˜?ÀuªsHl[ý8¾ÚH£›¾IEND®B`‚mlton-20100608/doc/guide/moin-news.png0000644000076600000240000000027511404435634016053 0ustar mtfstaff‰PNG  IHDR ´@+PLTEÿÿÿÿ÷ÜÜÜÂìÿ¸¸¸£££hÐÿ]bdLLLÆöÚœtRNS@æØfbKGD ñÙ¥ì@IDATxÚcðèèèhahRRRÒdh*//÷dh*66‘‚é@², D‚Å[\\\<8€ê'0´†††F2xΜ9s ¬‚¸ëNåIEND®B`‚mlton-20100608/doc/guide/moin-top.png0000644000076600000240000000020211404435634015667 0ustar mtfstaff‰PNG  IHDR ¾ý„PLTEÿÿÝp¹Þ9tRNSÿå·0JbKGDˆHIDATxÚcøó‡áG Æ2 x€\$ã&92¹¸IEND®B`‚mlton-20100608/doc/guide/moin-www.png0000644000076600000240000000022611404435634015717 0ustar mtfstaff‰PNG  IHDR ÔŸµ PLTEÿ¿¿¿ÿ´0`tRNSÿå·0JbKGDf |d-IDATxÚceÂ) LK²V0di-`Èb€à( XX׆ÐU! ¡¡!ñK Ïï©Ô'IEND®B`‚mlton-20100608/doc/guide/MoinMoin0000644000076600000240000000370411404435634015101 0ustar mtfstaff MoinMoin - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MoinMoin
Home  Index  
[WWW]MoinMoin is the wiki engine used to implement this site.

You can find out technical specifics about this particular instance of MoinMoin at the SystemInfo page.


Last edited on 2004-10-25 20:51:11 by StephenWeeks. mlton-20100608/doc/guide/Monomorphise0000644000076600000240000002053311404435635016033 0ustar mtfstaff Monomorphise - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Monomorphise
Home  Index  
Monomorphise is a translation pass from the XML IntermediateLanguage to the SXML IntermediateLanguage.

Description

Monomorphisation eliminates polymorphic values and datatype declarations by duplicating them for each type at which they are used.

Consider the following XML program.

datatype 'a t = T of 'a
fun 'a f (x: 'a) = T x
val a = f 1
val b = f 2
val z = f (3, 4)
The result of monomorphising this program is the following SXML program:
datatype t1 = T1 of int
datatype t2 = T2 of int * int
fun f1 (x: t1) = T1 x
fun f2 (x: t2) = T2 x
val a = f1 1
val b = f1 2
val z = f2 (3, 4)

Implementation

[WWW]monomorphise.sig [WWW]monomorphise.fun

Details and Notes

The monomorphiser works by making one pass over the entire program. On the way down, it creates a cache for each variable declared in a polymorphic declaration that maps a lists of type arguments to a new variable name. At a variable reference, it consults the cache (based on the types the variable is applied to). If there is already an entry in the cache, it is used. If not, a new entry is created. On the way up, the monomorphiser duplicates a variable declaration for each entry in the cache.

As with variables, the monomorphiser records all of the type at which constructors are used. After the entire program is processed, the monomorphiser duplicates each datatype declaration and its associated constructors.

The monomorphiser duplicates all of the functions declared in a fun declaration as a unit. Consider the following program

fun 'a f (x: 'a) = g x
and g (y: 'a) = f y
val a = f 13
val b = g 14
val c = f (1, 2)
and its monomorphisation
fun f1 (x: int) = g1 x
and g1 (y: int) = f1 y
fun f2 (x : int * int) = g2 x
and g2 (y : int * int) = f2 y
val a = f1 13
val b = g1 14
val c = f2 (1, 2)

Pathological datatype declarations

SML allows a pathological polymorphic datatype declaration in which recursive uses of the defined type constructor are applied to different type arguments than the definition. This has been disallowed by others on type theoretic grounds. A canonical example is the following.

datatype 'a t = A of 'a | B of ('a * 'a) t
val z : int t = B (B (A ((1, 2), (3, 4))))
The presence of the recursion in the datatype declaration might appear to cause the need for the monomorphiser to create an infinite number of types. However, due to the absence of polymorphic recursion in SML, there are in fact only a finite number of instances of such types in any given program. The monomorphiser translates the above program to the following one.
datatype t1 = B1 of t2
datatype t2 = B2 of t3
datatype t3 = A3 of (int * int) * (int * int)
val z : int t = B1 (B2 (A3 ((1, 2), (3, 4))))
It is crucial that the monomorphiser be allowed to drop unused constructors from datatype declarations in order for the translation to terminate.


Last edited on 2009-12-18 11:00:50 by BaojianHua. mlton-20100608/doc/guide/MoscowML0000644000076600000240000000377311404435634015062 0ustar mtfstaff MoscowML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION MoscowML
Home  Index  
[WWW]Moscow ML is a Standard ML Compiler. It is a byte-code compiler, so it compiles code quickly, but the code runs slowly. See Performance.


Last edited on 2004-12-30 20:11:52 by StephenWeeks. mlton-20100608/doc/guide/Multi0000644000076600000240000000542611404435635014452 0ustar mtfstaff Multi - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Multi
Home  Index  
Multi is an analysis pass for the SSA IntermediateLanguage, invoked from ConstantPropagation and LocalRef.

Description

This pass analyzes the control flow of a SSA program to determine which SSA functions and blocks might be executed more than once or by more than one thread. It also determines when a program uses threads and when functions and blocks directly or indirectly invoke Thread_copyCurrent.

Implementation

[WWW]multi.sig [WWW]multi.fun

Details and Notes


Last edited on 2006-11-02 17:37:26 by MatthewFluet. mlton-20100608/doc/guide/Mutable0000644000076600000240000000354311404435634014746 0ustar mtfstaff Mutable - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Mutable
Home  Index  
Mutable is an adjective meaning can be modified. In Standard ML, ref cells and arrays are mutable, while all other values are immutable.


Last edited on 2004-12-08 18:51:14 by StephenWeeks. mlton-20100608/doc/guide/NeedsReview0000644000076600000240000000635011404435634015574 0ustar mtfstaff NeedsReview - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION NeedsReview
Home  Index  
This page documents some patches and bug fixes that need additional review by experienced developers:


Last edited on 2007-11-22 15:46:20 by MatthewFluet. mlton-20100608/doc/guide/NumericLiteral0000644000076600000240000001550011404435634016270 0ustar mtfstaff NumericLiteral - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION NumericLiteral
Home  Index  
Numeric literals in Standard ML can be written in either decimal or hexadecimal notation. Sometimes it can be convenient to write numbers down in other bases. Fortunately, using Fold, it is possible to define a concise syntax for numeric literals that allows one to write numeric constants in any base and of various types (int, IntInf.int, word, and more).

We will define constants I, II, W, and ` so that, for example,

I 10 `1`2`3 $

denotes 123:int in base 10, while

II 8 `2`3 $

denotes 19:IntInf.int in base 8, and

W 2 `1`1`0`1 $

denotes 0w13: word.

Here is the code.

structure Num =
   struct
      fun make (op *, op +, i2x) iBase =
          let
             val xBase = i2x iBase
          in
             Fold.fold
                ((i2x 0,
                  fn (i, x) =>
                     if 0 <= i andalso i < iBase then
                        x * xBase + i2x i
                     else
                        raise Fail (concat
                                       ["Num: ", Int.toString i,
                                        " is not a valid\
                                        \ digit in base ",
                                        Int.toString iBase])),
                 fst)
          end

      fun I  ? = make (op *, op +, id) ?
      fun II ? = make (op *, op +, IntInf.fromInt) ?
      fun W  ? = make (op *, op +, Word.fromInt) ?

      fun ` ? = Fold.step1 (fn (i, (x, step)) =>
                               (step (i, x), step)) ?

      val a = 10
      val b = 11
      val c = 12
      val d = 13
      val e = 14
      val f = 15
   end

where

fun fst (x, _) = x

The idea is for the fold to start with zero and to construct the result one digit at a time, with each stepper multiplying the previous result by the base and adding the next digit. The code is abstracted in two different ways for extra generality. First, the make function abstracts over the various primitive operations (addition, multiplication, etc) that are needed to construct a number. This allows the same code to be shared for constants I, II, W used to write down the various numeric types. It also allows users to add new constants for additional numeric types, by supplying the necessary arguments to make.

Second, the step function, `, is abstracted over the actual construction operation, which is created by make, and passed along the fold. This allows the same constant, `, to be used for all numeric types. The alternative approach, having a different step function for each numeric type, would be more painful to use.

On the surface, it appears that the code checks the digits dynamically to ensure they are valid for the base. However, MLton will simplify everything away at compile time, leaving just the final numeric constant.


Last edited on 2006-05-28 08:52:54 by VesaKarvonen. mlton-20100608/doc/guide/ObjectOrientedProgramming0000644000076600000240000005031711404435634020461 0ustar mtfstaff ObjectOrientedProgramming - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ObjectOrientedProgramming
Home  Index  
Standard ML does not have explicit support for object-oriented programming. Here are some papers that show how to express certain object-oriented concepts in SML.

The question of OO programming in SML comes up every now and then. The following discusses a simple object-oriented (OO) programming technique in Standard ML. The reader is assumed to be able to read Java and SML code.

Motivation

SML doesn't provide subtyping, but it does provide parametric polymorphism, which can be used to encode some forms of subtyping. Most articles on OO programming in SML concentrate on such encoding techniques. While those techniques are interesting --- and it is recommended to read such articles --- and sometimes useful, it seems that basically all OO gurus agree that (deep) subtyping (or inheritance) hierarchies aren't as practical as they were thought to be in the early OO days. "Good", flexible, "OO" designs tend to have a flat structure

         Interface
             ^
             |
- - -+-------+-------+- - -
     |       |       |
   ImplA   ImplB   ImplC

and deep inheritance hierarchies

ClassA
  ^
  |
ClassB
  ^
  |
ClassC
  ^
  |

tend to be signs of design mistakes. There are good underlying reasons for this, but a thorough discussion is not in the scope of this article. However, the point is that perhaps the encoding of subtyping is not as important as one might believe. In the following we ignore subtyping and rather concentrate on a very simple and basic dynamic dispatch technique.

Dynamic Dispatch Using a Recursive Record of Functions

Quite simply, the basic idea is to implement a "virtual function table" using a record that is wrapped inside a (possibly recursive) datatype. Let's first take a look at a simple concrete example.

Consider the following Java interface:

public interface Counter {
  public void inc();
  public int get();
}

We can translate the Counter interface to SML as follows:

datatype counter = Counter of {inc : unit -> unit, get : unit -> int}

Each value of type counter can be thought of as an object that responds to two messages inc and get. To actually send messages to a counter, it is useful to define auxiliary functions

local
   fun mk m (Counter t) = m t ()
in
   val cGet = mk#get
   val cInc = mk#inc
end

that basically extract the "function table" t from a counter object and then select the specified method m from the table.

Let's then implement a simple function that increments a counter until a given maximum is reached:

fun incUpto counter max = while cGet counter < max do cInc counter

You can easily verify that the above code compiles even without any concrete implementation of a counter, thus it is clear that it doesn't depend on a particular counter implementation.

Let's then implement a couple of counters. First consider the following Java class implementing the Counter interface given earlier.

public class BasicCounter implements Counter {
  private int cnt;
  public BasicCounter(int initialCnt) { this.cnt = initialCnt; }
  public void inc() { this.cnt += 1; }
  public int get() { return this.cnt; }
}

We can translate the above to SML as follows:

fun newBasicCounter initialCnt = let
       val cnt = ref initialCnt
    in
       Counter {inc = fn () => cnt := !cnt + 1,
                get = fn () => !cnt}
    end

The SML function newBasicCounter can be described as a constructor function for counter objects of the BasicCounter "class". We can also have other counter implementations. Here is the constructor for a counter decorator that logs messages:

fun newLoggedCounter counter =
    Counter {inc = fn () => (print "inc\n" ; cInc counter),
             get = fn () => (print "get\n" ; cGet counter)}

The incUpto function works just as well with objects of either class:

val aCounter = newBasicCounter 0
val () = incUpto aCounter 5
val () = print (Int.toString (cGet aCounter) ^"\n")

val aCounter = newLoggedCounter (newBasicCounter 0)
val () = incUpto aCounter 5
val () = print (Int.toString (cGet aCounter) ^"\n")

In general, a dynamic dispatch interface is represented as a record type wrapped inside a datatype. Each field of the record corresponds to a public method or field of the object:

datatype interface =
   Interface of {method : t1 -> t2,
                 immutableField : t,
                 mutableField : t ref}

The reason for wrapping the record inside a datatype is that records, in SML, can not be recursive. However, SML datatypes can be recursive. A record wrapped in a datatype can contain fields that contain the datatype. For example, an interface such as Cloneable

datatype cloneable = Cloneable of {clone : unit -> cloneable}

can be represented using recursive datatypes.

Like in OO languages, interfaces are abstract and can not be instantiated to produce objects. To be able to instantiate objects, the constructors of a concrete class are needed. In SML, we can implement constructors as simple functions from arbitrary arguments to values of the interface type. Such a constructor function can encapsulate arbitrary private state and functions using lexical closure. It is also easy to share implementations of methods between two or more constructors.

While the Counter example is rather trivial, it should not be difficult to see that this technique quite simply doesn't require a huge amount of extra verbiage and is more than usable in practice.

SML Modules and Dynamic Dispatch

One might wonder about how SML modules and the dynamic dispatch technique work together. Let's investigate! Let's use a simple dispenser framework as a concrete example. (Note that this isn't intended to be an introduction to the SML module system.)

Programming with SML Modules

Using SML signatures we can specify abstract data types (ADTs) such as dispensers. Here is a signature for an "abstract" functional (as opposed to imperative) dispenser:

signature ABSTRACT_DISPENSER = sig
   type 'a t
   val isEmpty : 'a t -> bool
   val push : 'a * 'a t -> 'a t
   val pop : 'a t -> ('a * 'a t) option
end

The term "abstract" in the name of the signature refers to the fact that the signature gives no way to instantiate a dispenser. It has nothing to do with the concept of abstract data types.

Using SML functors we can write "generic" algorithms that manipulate dispensers of an unknown type. Here are a couple of very simple algorithms:

functor DispenserAlgs (D : ABSTRACT_DISPENSER) = struct
   open D

   fun pushAll (xs, d) = foldl push d xs

   fun popAll d = let
          fun lp (xs, NONE) = rev xs
            | lp (xs, SOME (x, d)) = lp (x::xs, pop d)
       in
          lp ([], pop d)
       end

   fun cp (from, to) = pushAll (popAll from, to)
end

As one can easily verify, the above compiles even without any concrete dispenser structure. Functors essentially provide a form a static dispatch that one can use to break compile-time dependencies.

We can also give a signature for a concrete dispenser

signature DISPENSER = sig
   include ABSTRACT_DISPENSER
   val empty : 'a t
end

and write any number of concrete structures implementing the signature. For example, we could implement stacks

structure Stack :> DISPENSER = struct
   type 'a t = 'a list
   val empty = []
   val isEmpty = null
   val push = op ::
   val pop = List.getItem
end

and queues

structure Queue :> DISPENSER = struct
   datatype 'a t = T of 'a list * 'a list
   val empty = T ([], [])
   val isEmpty = fn T ([], _) => true | _ => false
   val normalize = fn ([], ys) => (rev ys, []) | q => q
   fun push (y, T (xs, ys)) = T (normalize (xs, y::ys))
   val pop = fn (T (x::xs, ys)) => SOME (x, T (normalize (xs, ys))) | _ => NONE
end

One can now write code that uses either the Stack or the Queue dispenser. One can also instantiate the previously defined functor to create functions for manipulating dispensers of a type:

structure S = DispenserAlgs (Stack)
val [4,3,2,1] = S.popAll (S.pushAll ([1,2,3,4], Stack.empty))

structure Q = DispenserAlgs (Queue)
val [1,2,3,4] = Q.popAll (Q.pushAll ([1,2,3,4], Queue.empty))

There is no dynamic dispatch involved at the module level in SML. An attempt to do dynamic dispatch

val q = Q.push (1, Stack.empty)

will give a type error.

Combining SML Modules and Dynamic Dispatch

Let's then combine SML modules and the dynamic dispatch technique introduced in this article. First we define an interface for dispensers:

structure Dispenser = struct
   datatype 'a t =
      I of {isEmpty : unit -> bool,
            push : 'a -> 'a t,
            pop : unit -> ('a * 'a t) option}

   fun O m (I t) = m t

   fun isEmpty t = O#isEmpty t ()
   fun push (v, t) = O#push t v
   fun pop t = O#pop t ()
end

The Dispenser module, which we can think of as an interface for dispensers, implements the ABSTRACT_DISPENSER signature using the dynamic dispatch technique, but we leave the signature ascription until later.

Then we define a DispenserClass functor that makes a "class" out of a given dispenser module:

functor DispenserClass (D : DISPENSER) : DISPENSER = struct
   open Dispenser

   fun make d =
       I {isEmpty = fn () => D.isEmpty d,
          push = fn x => make (D.push (x, d)),
          pop = fn () =>
                   case D.pop d of
                      NONE => NONE
                    | SOME (x, d) => SOME (x, make d)}

   val empty =
       I {isEmpty = fn () => true,
          push = fn x => make (D.push (x, D.empty)),
          pop = fn () => NONE}
end

Finally we seal the Dispenser module:

structure Dispenser : ABSTRACT_DISPENSER = Dispenser

This isn't necessary for type safety, because the unsealed Dispenser module does not allow one to break encapsulation, but makes sure that only the DispenserClass functor can create dispenser classes (because the constructor Dispenser.I is no longer accessible).

Using the DispenserClass functor we can turn any concrete dispenser module into a dispenser class:

structure StackClass = DispenserClass (Stack)
structure QueueClass = DispenserClass (Queue)

Each dispenser class implements the same dynamic dispatch interface and the ABSTRACT_DISPENSER -signature.

Because the dynamic dispatch Dispenser module implements the ABSTRACT_DISPENSER -signature, we can use it to instantiate the DispenserAlgs -functor:

structure D = DispenserAlgs (Dispenser)

The resulting D module, like the Dispenser module, works with any dispenser class and uses dynamic dispatch:

val [4, 3, 2, 1] = D.popAll (D.pushAll ([1, 2, 3, 4], StackClass.empty))
val [1, 2, 3, 4] = D.popAll (D.pushAll ([1, 2, 3, 4], QueueClass.empty))


Last edited on 2008-10-20 11:18:45 by VesaKarvonen. mlton-20100608/doc/guide/OCaml0000644000076600000240000001264211404435634014350 0ustar mtfstaff OCaml - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION OCaml
Home  Index  
[WWW]OCaml is a variant of ML and is similar to Standard ML.

OCaml and SML

Here's a comparison of some aspects of the OCaml and SML languages.

  • Standard ML has a formal Definition, while OCaml is specified by its lone implementation and informal documentation.

  • Standard ML has a number of compilers, while OCaml has only one.

  • OCaml has built-in support for object-oriented programming, while Standard ML does not (however, see ObjectOrientedProgramming).

  • Andreas Rossberg has a [WWW]side-by-side comparison of the syntax of SML and OCaml.

OCaml and MLton

Here's a comparison of some aspects of OCaml and MLton.

  • Performance

    • Both OCaml and MLton have excellent performance.

    • MLton performs extensive WholeProgramOptimization, which can provide substantial improvements in large, modular programs.

    • MLton uses native types, like 32-bit integers, without any penalty due to tagging or boxing. OCaml uses 31-bit integers with a penalty due to tagging, and 32-bit integers with a penalty due to boxing.

    • MLton uses native types, like 64-bit floats, without any penalty due to boxing. OCaml, in some situations, boxes 64-bit floats.

    • MLton represents arrays of all types unboxed. In OCaml, only arrays of 64-bit floats are unboxed, and then only when it is syntactically apparent.

    • MLton represents records compactly by reordering and packing the fields.

    • In MLton, polymorphic and monomorphic code have the same performance. In OCaml, polymorphism can introduce a performance penalty.

    • In MLton, module boundaries have no impact on performance. In OCaml, moving code between modules can cause a performance penalty.

  • MLton's ForeignFunctionInterface is simpler than OCaml's.

  • Tools

    • OCaml has a debugger, while MLton does not.

    • OCaml supports separate compilation, while MLton does not.

    • OCaml compiles faster than MLton.

    • MLton supports profiling of both time and allocation.

  • Libraries

    • OCaml has more available libraries.

  • Community

    • OCaml has a larger community than MLton.

    • MLton has a very responsive [WWW]developer list.


Last edited on 2009-09-20 00:47:19 by RanAriGur. mlton-20100608/doc/guide/OpenGL0000644000076600000240000000535211404435635014502 0ustar mtfstaff OpenGL - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION OpenGL
Home  Index  
There are at least two interfaces to OpenGL for MLton/SML, both of which should be considered alpha quality.

Contact us for more information or an update on the status of these projects.


Last edited on 2006-11-02 17:31:46 by MatthewFluet. mlton-20100608/doc/guide/OperatorPrecedence0000644000076600000240000000447011404435634017126 0ustar mtfstaff OperatorPrecedence - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION OperatorPrecedence
Home  Index  
Standard ML has a built in notion of precedence for certain symbols. Every program that includes the Basis Library automatically gets the following infix declarations. Higher number indicates higher precedence.
infix 7 * / mod div
infix 6 + - ^
infixr 5 :: @
infix 4 = <> > >= < <=
infix 3 := o
infix 0 before


Last edited on 2005-12-02 04:23:19 by StephenWeeks. mlton-20100608/doc/guide/OptionalArguments0000644000076600000240000002632511404435634017033 0ustar mtfstaff OptionalArguments - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION OptionalArguments
Home  Index  
Standard ML does not have built-in support for optional arguments. Nevertheless, using Fold, it is easy to define functions that take optional arguments.

For example, suppose that we have the following definition of a function f.

fun f (i, r, s) =
   concat [Int.toString i, ", ", Real.toString r, ", ", s]

Using the OptionalArg structure described below, we can define a function f', an optionalized version of f, that takes 0, 1, 2, or 3 arguments. Embedded within f' will be default values for i, r, and s. If f' gets no arguments, then all the defaults are used. If f' gets one argument, then that will be used for i. Two arguments will be used for i and r respectively. Three arguments will override all default values. Calls to f' will look like the following.

f' $
f' `2 $
f' `2 `3.0 $
f' `2 `3.0 `"four" $

The optional argument indicator, "`", is not special syntax -- it is a normal SML value, defined in the OptionalArg structure below.

Here is the definition of f' using the OptionalArg structure, in particular, OptionalArg.make and OptionalArg.D.

val f' =
   fn z =>
   let open OptionalArg in
      make (D 1) (D 2.0) (D "three") $
   end (fn i & r & s => f (i, r, s))
   z

The definition of f' is eta expanded as with all uses of fold. A call to OptionalArg.make is supplied with a variable number of defaults (in this case, three), the end-of-arguments terminator, $, and the function to run, taking its arguments as an n-ary product. In this case, the function simply converts the product to an ordinary tuple and calls f. Often, the function body will simply be written directly.

In general, the definition of an optional-argument function looks like the following.

val f =
   fn z =>
   let open OptionalArg in
      make (D <default1>) (D <default2>) ... (D <defaultn>) $
   end (fn x1 & x2 & ... & xn =>
        <function code goes here>)
   z

Here is the definition of OptionalArg.

structure OptionalArg =
   struct
      val make =
         fn z =>
         Fold.fold
         ((id, fn (f, x) => f x),
          fn (d, r) => fn func =>
          Fold.fold ((id, d ()), fn (f, d) =>
                     let
                        val d & () = r (id, f d)
                     in
                        func d
                     end))
         z
         
      fun D d = Fold.step0 (fn (f, r) =>
                            (fn ds => f (d & ds),
                             fn (f, a & b) => r (fn x => f a & x, b)))

      val ` =
         fn z =>
         Fold.step1 (fn (x, (f, _ & d)) => (fn d => f (x & d), d))
         z
   end

OptionalArg.make uses a nested fold. The first fold accumulates the default values in a product, associated to the right, and a reversal function that converts a product (of the same arity as the number of defaults) from right associativity to left associativity. The accumulated defaults are used by the second fold, which recurs over the product, replacing the appropriate component as it encounters optional arguments. The second fold also constructs a "fill" function, f, that is used to reconstruct the product once the end-of-arguments is reached. Finally, the finisher reconstructs the product and uses the reversal function to convert the product from right associative to left associative, at which point it is passed to the user-supplied function.

Much of the complexity comes from the fact that while recurring over a product from left to right, one wants it to be right-associative, e.g. look like

a & (b & (c & d))
but the user function in the end wants the product to be left associative, so that the product argument pattern can be written without parentheses (since & is left associative).

Labelled optional arguments

In addition to the positional optional arguments described above, it is sometimes useful to have labelled optional arguments. These allow one to define a function, f, with defaults, say a and b. Then, a caller of f can supply values for a and b by name. If no value is supplied then the default is used.

Labelled optional arguments are a simple extension of FunctionalRecordUpdate using post composition. Suppose, for example, that one wants a function f with labelled optional arguments a and b with default values 0 and 0.0 respectively. If one has a functional-record-update function updateAB for records with a and b fields, then one can define f in the following way.

val f =
   fn z =>
   Fold.post
   (updateAB {a = 0, b = 0.0},
    fn {a, b} => print (concat [Int.toString a, " ",
                                Real.toString b, "\n"]))
   z

The idea is that f is the post composition (using Fold.post) of the actual code for the function with a functional-record updater that starts with the defaults.

Here are some example calls to f.

val () = f $
val () = f (U#a 13) $
val () = f (U#a 13) (U#b 17.5) $
val () = f (U#b 17.5) (U#a 13) $

Notice that a caller can supply neither of the arguments, either of the arguments, or both of the arguments, and in either order. All that matter is that the arguments be labelled correctly (and of the right type, of course).

Here is another example.

val f =
   fn z =>
   Fold.post
   (updateBCD {b = 0, c = 0.0, d = "<>"},
    fn {b, c, d} =>
    print (concat [Int.toString b, " ",
                   Real.toString c, " ",
                   d, "\n"]))
   z

Here are some example calls.

val () = f $
val () = f (U#d "goodbye") $
val () = f (U#d "hello") (U#b 17) (U#c 19.3) $


Last edited on 2007-08-15 22:06:57 by MatthewFluet. mlton-20100608/doc/guide/OrphanedPages0000644000076600000240000000372711404435635016102 0ustar mtfstaff OrphanedPages - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION OrphanedPages
Home  Index  
Pages that are not linked to by any other page.

  1. Index
  2. ZZZOrphanedPages

Also see


Last edited on 2010-03-02 15:11:43 by MatthewFluet. mlton-20100608/doc/guide/OtherSites0000644000076600000240000000653611404435634015453 0ustar mtfstaff OtherSites - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION OtherSites
Home  Index  
Other sites that have a MLton page (or more).


Last edited on 2010-06-07 14:36:40 by MatthewFluet. mlton-20100608/doc/guide/Overloading0000644000076600000240000001073211404435634015624 0ustar mtfstaff Overloading - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Overloading
Home  Index  
In Standard ML, constants (like 13, 0w13, 13.0) are overloaded, meaning that they can denote a constant of the appropriate type as determined by context. SML defines the overloading classes Int, Real, and Word, which denote the sets of types that integer, real, and word constants may take on. In MLton, these are defined as follows.
    Int Int2.int, Int3.int, ... Int32.int, Int64.int, Int.int, IntInf.int, LargeInt.int, FixedInt.int, Position.int
    Real Real32.real, Real64.real, Real.real, LargeReal.real
    Word Word2.word, Word3.word, ... Word32.word, Word64.word, Word.word, LargeWord.word, SysWord.word

The Definition allows flexibility in how much context is used to resolve overloading. It says that the context is no larger than the smallest enclosing structure-level declaration, but that an implementation may require that a smaller context determines the type. MLton uses the largest possible context allowed by SML in resolving overloading. If the type of a constant is not determined by context, then it takes on a default type. In MLton, these are defined as follows.

    Int Int.int
    Real Real.real
    Word Word.word

Other implementations may use a smaller context or different default types.

Also see

Examples

  • The following program is rejected.

    structure S: 
       sig 
          val x: Word8.word 
       end =
       struct
          val x = 0w0
       end
    
    The smallest enclosing structure declaration for 0w0 is val x = 0w0. Hence, 0w0 receives the default type for words, which is Word.word.


Last edited on 2007-08-15 22:07:01 by MatthewFluet. mlton-20100608/doc/guide/PackedRepresentation0000644000076600000240000000535211404435634017467 0ustar mtfstaff PackedRepresentation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PackedRepresentation
Home  Index  
PackedRepresentation is an analysis pass for the SSA2 IntermediateLanguage, invoked from ToRSSA.

Description

This pass analyzes a SSA2 program to compute a packed representation for each object.

Implementation

[WWW]representation.sig [WWW]packed-representation.fun

Details and Notes

Has a special case to make sure that true is represented as 1 and false is represented as 0.


Last edited on 2006-11-02 17:36:23 by MatthewFluet. mlton-20100608/doc/guide/PageSize0000644000076600000240000007326711404435634015076 0ustar mtfstaff PageSize - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PageSize
Home  Index  

List of all pages, sorted by their size:

  1.  32369 References
  2.  30352 Fold
  3.  18835 TypeIndexedValues
  4.  17714 MLtonContIsolateImplementation
  5.  14401 BasisLibrary
  6.  11983 Performance
  7.  11626 MLtonProcess
  8.  11501 ObjectOrientedProgramming
  9.  11188 CommonArg
  10.  10814 ConcurrentMLImplementation
  11.   9165 CompileTimeOptions
  12.   9129 StaticSum
  13.   8855 LibrarySupport
  14.   8843 SyntacticConventions
  15.   8380 ValueRestriction
  16.   8363 PrintfGentle
  17.   8354 SMLNJDeviations
  18.   8275 InfixingOperators
  19.   7218 FunctionalRecordUpdate
  20.   7144 MLtonStructure
  21.   6796 ForLoops
  22.   6777 MLtonThread
  23.   6638 Features
  24.   6442 PortingMLton
  25.   6424 MLNLFFIImplementation
  26.   6401 Bugs20041109
  27.   6206 Elaborate
  28.   5995 PolymorphicEquality
  29.   5977 OptionalArguments
  30.   5849 MLtonFinalizable
  31.   5779 AdmitsEquality
  32.   5742 EmacsBgBuildMode
  33.   5688 MLtonSignal
  34.   5326 CompilationManager
  35.   5321 Bugs20070826
  36.   5274 Release20070826
  37.   5234 XML
  38.   5170 TipsForWritingConciseSML
  39.   5121 Credits
  40.   5000 StandardMLGotchas
  41.   4709 Regions
  42.   4702 CallGraph
  43.   4670 TypeChecking
  44.   4588 ForeignFunctionInterfaceSyntax
  45.   4456 TypeVariableScope
  46.   4454 Users
  47.   4441 ReleaseChecklist
  48.   4440 MLBasisExamples
  49.   4350 EmacsDefUseMode
  50.   4301 SelfCompiling
  51.   4293 Bugs20051202
  52.   4245 MatthewFluet
  53.   4244 Fold01N
  54.   4194 MLtonProfile
  55.   4104 Printf
  56.   4091 [WWW]MatthewFluet/MoinEditorBackup
  57.   3992 SMLNJLibrary
  58.   3961 UniversalType
  59.   3919 Release20100608
  60.   3776 [WWW]WesleyTerpstra/MoinEditorBackup
  61.   3758 ReturnStatement
  62.   3753 ForeignFunctionInterfaceTypes
  63.   3619 Release20051202
  64.   3593 VariableArityPolymorphism
  65.   3557 Enscript
  66.   3518 EqualityTypeVariable
  67.   3294 UnresolvedBugs
  68.   3209 MLBasisSyntaxAndSemantics
  69.   3175 GnuMP
  70.   3171 RunTimeOptions
  71.   3092 HowProfilingWorks
  72.   3085 MLRISCLibrary
  73.   3063 Monomorphise
  74.   3026 Fixpoints
  75.   2997 NumericLiteral
  76.   2995 ArrayLiteral
  77.   2971 FirstClassPolymorphism
  78.   2856 UnsafeStructure
  79.   2855 PropertyList
  80.   2816 Stabilizers
  81.   2677 Installation
  82.   2646 MLtonSocket
  83.   2621 GenerativeException
  84.   2598 CompilerOverview
  85.   2525 MatchCompile
  86.   2495 CrossCompiling
  87.   2472 Emacs
  88.   2463 ProfilingTime
  89.   2433 ShowBasis
  90.   2393 MLBasisAnnotations
  91.   2390 CallingFromCToSML
  92.   2363 AST
  93.   2361 MLtonPointer
  94.   2356 OCaml
  95.   2328 RunningOnMinGW
  96.   2288 History
  97.   2278 MLBasisAvailableLibraries
  98.   2236 RefFlatten
  99.   2224 VesaKarvonen
  100.   2216 CKitLibrary
  101.   2159 MLBasisAnnotationExamples
  102.   2158 ProfilingCounts
  103.   2117 LanguageChanges
  104.   2082 WarnUnusedAnomalies
  105.   2071 Libraries
  106.   2030 MLtonGC
  107.   2025 SimplifyTypes
  108.   1949 SMLofNJStructure
  109.   1942 XMLShrink
  110.   1921 MLBasis
  111.   1917 CompilingWithSMLNJ
  112.   1915 WikiTool
  113.   1910 CombineConversions
  114.   1907 Contact
  115.   1893 ProductType
  116.   1893 Overloading
  117.   1883 FAQ
  118.   1872 ConcurrentML
  119.   1859 Unicode
  120.   1846 CallingFromSMLToC
  121.   1843 Projects
  122.   1835 RunningOnNetBSD
  123.   1819 MLtonIntInf
  124.   1813 Defunctorize
  125.   1751 JesperLouisAndersen
  126.   1689 CallingFromSMLToCFunctionPointer
  127.   1672 MLtonSyslog
  128.   1645 MLtonRlimit
  129.   1632 WikiMacros
  130.   1627 SSA2
  131.   1562 DefineTypeBeforeUse
  132.   1547 Shrink
  133.   1547 ScopeInference
  134.   1494 Zone
  135.   1487 MLmon
  136.   1484 MLtonWorld
  137.   1465 KnownCase
  138.   1433 EqualityType
  139.   1432 MLtonReal
  140.   1428 MLtonExn
  141.   1416 LocalRef
  142.   1415 ProfilingAllocation
  143.   1411 SSA
  144.   1407 MLtonCont
  145.   1401 MLtonVector
  146.   1370 MLBasisPathMap
  147.   1362 ToMachine
  148.   1348 TypeConstructor
  149.   1329 Sources
  150.   1328 PolyEqual
  151.   1314 [WWW]Preferences
  152.   1314 DeepFlatten
  153.   1310 MLtonRusage
  154.   1296 MLNLFFI
  155.   1285 ShowProf
  156.   1280 Utilities
  157.   1272 MLtonIO
  158.   1271 ProfilingTheStack
  159.   1266 Restore
  160.   1258 WishList
  161.   1227 Useless
  162.   1218 ImplementSuffix
  163.   1210 MLtonPlatform
  164.   1205 SSASimplify
  165.   1201 StandardMLPortability
  166.   1191 WebSite
  167.   1174 StandardML
  168.   1174 RunningOnSparc
  169.   1160 MLLex
  170.   1157 DeadCode
  171.   1134 LambdaFree
  172.   1130 CommonBlock
  173.   1126 MLtonRandom
  174.   1116 Lazy
  175.   1111 Release20041109
  176.   1104 Closure
  177.   1095 RunningOnCygwin
  178.   1074 SXML
  179.   1049 RunningOnDarwin
  180.   1048 RSSA
  181.   1029 CommonSubexp
  182.   1005 RunningOnFreeBSD
  183.   1002 [WWW]WikiSandBox
  184.    998 WholeProgramOptimization
  185.    940 Identifier
  186.    923 ManualPage
  187.    921 License
  188.    888 [WWW]Experimental
  189.    887 LineDirective
  190.    885 Flatten
  191.    876 MLtonWeak
  192.    856 Documentation
  193.    851 SXMLSimplify
  194.    837 SSA2Simplify
  195.    808 XMLSimplifyTypes
  196.    799 GenerativeDatatype
  197.    784 WesleyTerpstra
  198.    784 TalkMLtonHistory
  199.    781 Inline
  200.    775 Profiling
  201.    766 ForeignFunctionInterface
  202.    765 RemoveUnused
  203.    748 MLNLFFIGen
  204.    744 Contify
  205.    736 EtaExpansion
  206.    723 RayRacine
  207.    722 Drawbacks
  208.    718 Reachability
  209.    713 RunningOnHPPA
  210.    710 IntroduceLoops
  211.    703 PolyHash
  212.    702 Redundant
  213.    701 RSSASimplify
  214.    682 GarbageCollection
  215.    669 CompilerPassTemplate
  216.    668 ToSSA2
  217.    661 FrontEnd
  218.    657 RunningOnSolaris
  219.    655 Swerve
  220.    654 EditingPages
  221.    648 NeedsReview
  222.    642 MLtonWord
  223.    638 RunningOnIA64
  224.    634 MLKit
  225.    631 XMLSimplify
  226.    629 OtherSites
  227.    629 OpenGL
  228.    624 Machine
  229.    614 StandardMLBooks
  230.    607 RunningOnPowerPC64
  231.    599 RunningOnPowerPC
  232.    590 PlatformSpecificNotes
  233.    590 DefinitionOfStandardML
  234.    585 RedundantTests
  235.    578 Developers
  236.    575 Multi
  237.    551 SureshJagannathan
  238.    550 MLtonMonoArray
  239.    548 StandardMLImplementations
  240.    543 Bug
  241.    536 MLtonMonoVector
  242.    527 ClosureConvert
  243.    524 AccessControl
  244.    523 LLVM
  245.    521 IntermediateLanguage
  246.    520 CreatingPages
  247.    514 SMLNJ
  248.    513 RunningOnAMD64
  249.    503 Chunkify
  250.    501 RSSAShrink
  251.    501 PackedRepresentation
  252.    494 PhantomType
  253.    487 LoopInvariant
  254.    486 CoreML
  255.    485 mGTK
  256.    480 MichaelNorrish
  257.    474 RunningOnAlpha
  258.    466 Home
  259.    465 MLtonItimer
  260.    462 LocalFlatten
  261.    457 Globalize
  262.    455 Serialization
  263.    454 ConstantPropagation
  264.    441 RunningOnOpenBSD
  265.    435 Development
  266.    422 StandardMLTutorials
  267.    422 HowToAttachFile
  268.    421 Poplog
  269.    412 SMLSharp
  270.    410 Polyvariance
  271.    406 PrecedenceParse
  272.    404 RunningOnS390
  273.    402 RunningOnARM
  274.    400 TalkStandardML
  275.    400 [WWW]RecentChanges
  276.    397 TalkMLtonFeatures
  277.    391 ParallelMove
  278.    385 ToRSSA
  279.    382 AllocateRegisters
  280.    379 MLtonProcEnv
  281.    376 Eclipse
  282.    371 SXMLShrink
  283.    370 TalkWholeProgram
  284.    364 OperatorPrecedence
  285.    358 [WWW]TemporaryUpload
  286.    348 ImplementHandlers
  287.    346 SuccessorML
  288.    340 MatchCompilation
  289.    329 ImperativeTypeVariable
  290.    327 MLtonArray
  291.    326 ImplementProfiling
  292.    319 ImplementExceptions
  293.    313 CMinusMinus
  294.    313 FSharp
  295.    309 AndreiFormiga
  296.    308 InsertSignalChecks
  297.    306 TalkMLtonApproach
  298.    305 InsertLimitChecks
  299.    277 TalkFolkLore
  300.    270 TalkHowHigherOrder
  301.    267 MLYacc
  302.    266 Pronounce
  303.    265 ML
  304.    261 MLj
  305.    259 Subversion
  306.    257 SMLNET
  307.    254 StandardMLHistory
  308.    244 TalkFromSMLTo
  309.    242 TalkHowPolymorphism
  310.    242 HaMLet
  311.    236 TomMurphy
  312.    234 eXene
  313.    232 CoreMLSimplify
  314.    230 TalkHowModules
  315.    230 Immutable
  316.    218 MoscowML
  317.    209 fxp
  318.    209 Glade
  319.    207 SpaceSafety
  320.    200 Talk
  321.    196 MoinMoin
  322.    195 AdamGoode
  323.    192 HenryCejtin
  324.    190 Variant
  325.    176 TalkDiveIn
  326.    175 TrustedGroup
  327.    175 JohnnyAndersen
  328.    169 StephenWeeks
  329.    165 Mutable
  330.    152 ZZZOrphanedPages
  331.    152 StyleGuide
  332.    149 Alice
  333.    149 RunningOnX86
  334.    136 TalkTemplate
  335.    129 PolyML
  336.    127 LambdaCalculus
  337.    120 WikiName
  338.    118 Bugs20100608
  339.    112 MikeThomas
  340.    105 WantedPages
  341.     97 OrphanedPages
  342.     92 TILT
  343.     89 RunningOnAIX
  344.     86 [WWW]OldPages
  345.     73 MLtonTextIO
  346.     72 MLtonBinIO
  347.     69 PageSize
  348.     61 RunningOnHPUX
  349.     59 [WWW]Download
  350.     47 Changelog
  351.     30 SystemInfo
  352.     26 RunningOnLinux
  353.     15 TitleIndex
  354.     15 Index
  355.      1 ChrisClearwater


(last modified 2004-10-25 16:35:07) mlton-20100608/doc/guide/ParallelMove0000644000076600000240000000503611404435634015737 0ustar mtfstaff ParallelMove - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ParallelMove
Home  Index  
ParallelMove is a rewrite pass, agnostic in the IntermediateLanguage which it produces.

Description

This function computes a sequence of individual moves to effect a parallel move (with possibly overlapping froms and tos).

Implementation

[WWW]parallel-move.sig [WWW]parallel-move.fun

Details and Notes


Last edited on 2006-11-02 17:53:17 by MatthewFluet. mlton-20100608/doc/guide/Performance0000644000076600000240000012360111404435634015614 0ustar mtfstaff Performance - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Performance
Home  Index  
This page compares the performance of a number of SML compilers on a range of benchmarks. For a [WWW]performance comparison of many different languages, including [WWW]MLton, see the [WWW]Computer Language Shootout.

This page compares the following SML compiler versions.

There are tables for run time, code size, and compile time.

Setup

All benchmarks were compiled and run on a 2.6 GHz Celeron with 2G of RAM. The benchmarks were compiled with the default settings for all the compilers, except for Moscow ML, which was passed the -orthodox -standalone -toplevel switches. The Poly/ML executables were produced by use'ing the file, followed by a PolyML.commit. The SML/NJ executables were produced by wrapping the entire program in a local declaration whose body performs an SMLofNJ.exportFn.

For more details, or if you want to run the benchmarks yourself, please see the [WWW]benchmark directory of our Sources.

All of the benchmarks are available for download from this page. Some of the benchmarks were obtained from the SML/NJ benchmark suite. Some of the benchmarks expect certain input files to exist in the [WWW]DATA subdirectory.

Run-time ratio

The following table gives the ratio of the run time of each benchmark when compiled by another compiler to the run time when compiled by MLton. That is, the larger the number, the slower the generated code runs. A number larger than one indicates that the corresponding compiler produces code that runs more slowly than MLton. If an entry is *, that means that the corresponding compiler failed to compile the benchmark or that the benchmark failed to run.

benchmark MLton ML-Kit MosML Poly/ML SML/NJ
[WWW]barnes-hut 1.0 * * * 1.6
[WWW]boyer 1.0 * 10.1 1.9 3.1
[WWW]checksum 1.0 * * * *
[WWW]count-graphs 1.0 7.3 60.7 4.2 3.8
[WWW]DLXSimulator 1.0 * * * *
[WWW]fft 1.0 1.2 * 24.2 0.8
[WWW]fib 1.0 0.9 5.0 1.2 1.3
[WWW]flat-array 1.0 2.2 35.0 1041.6 13.4
[WWW]hamlet 1.0 * * * 3.1
[WWW]imp-for 1.0 2.8 63.0 5.1 5.6
[WWW]knuth-bendix 1.0 * 19.8 4.8 4.6
[WWW]lexgen 1.0 2.5 5.0 1.7 1.5
[WWW]life 1.0 1.7 30.6 7.7 1.4
[WWW]logic 1.0 * 9.4 1.2 2.1
[WWW]mandelbrot 1.0 4.2 34.0 51.1 1.3
[WWW]matrix-multiply 1.0 8.3 42.5 13.2 5.3
[WWW]md5 1.0 * * * *
[WWW]merge 1.0 * * 1.1 7.9
[WWW]mlyacc 1.0 1.5 8.2 1.2 2.2
[WWW]model-elimination 1.0 * * * 2.6
[WWW]mpuz 1.0 2.3 78.2 4.6 4.1
[WWW]nucleic 1.0 * * 23.5 0.8
[WWW]output1 1.0 30.7 61.4 16.2 14.4
[WWW]peek 1.0 15.2 176.9 17.9 11.3
[WWW]psdes-random 1.0 5.0 * * 2.7
[WWW]ratio-regions 1.0 2.0 34.7 2.1 5.4
[WWW]ray 1.0 * 14.8 22.3 0.8
[WWW]raytrace 1.0 * * * 3.3
[WWW]simple 1.0 1.7 19.3 7.3 2.4
[WWW]smith-normal-form 1.0 * * * >1000
[WWW]tailfib 1.0 1.0 51.9 3.2 1.4
[WWW]tak 1.0 1.2 17.0 1.3 2.0
[WWW]tensor 1.0 * * * 7.4
[WWW]tsp 1.0 3.4 31.8 * 17.7
[WWW]tyan 1.0 * 15.7 1.0 1.6
[WWW]vector-concat 1.0 1.2 20.4 2.0 20.4
[WWW]vector-rev 1.0 2.2 41.9 2.3 152.4
[WWW]vliw 1.0 * * * 2.5
[WWW]wc-input1 1.0 11.1 * 7.5 17.2
[WWW]wc-scanStream 1.0 22.1 * 203.7 11.5
[WWW]zebra 1.0 3.9 30.2 3.4 8.5
[WWW]zern 1.0 * * * 2.6

Note: for SML/NJ, the smith-normal-form benchmark was killed after running for over 25,000 seconds.

Code size

The following table gives the code size of each benchmark in bytes. The size for MLton and the ML Kit is the sum of text and data for the standalone executable as reported by size. The size for Moscow ML is the size in bytes of the executable a.out. The size for Poly/ML is the difference in size of the database before the session start and after the commit. The size for SML/NJ is the size of the heap file created by exportFn and does not include the size of the SML/NJ runtime system (approximately 100K). A * in an entry means that the compiler failed to compile the benchmark.

benchmark MLton ML-Kit MosML Poly/ML SML/NJ
[WWW]barnes-hut 103,231 * * * 433,216
[WWW]boyer 138,518 163,204 116,300 122,880 526,376
[WWW]checksum 52,794 * * * *
[WWW]count-graphs 66,838 84,124 84,613 98,304 454,776
[WWW]DLXSimulator 129,398 * * * *
[WWW]fft 64,797 80,240 84,046 65,536 434,256
[WWW]fib 47,738 18,588 79,892 49,152 415,488
[WWW]flat-array 47,762 23,820 80,034 49,152 410,680
[WWW]hamlet 1,256,813 * * * 1,412,360
[WWW]imp-for 47,626 19,372 80,040 57,344 400,424
[WWW]knuth-bendix 109,126 93,400 88,439 180,224 431,144
[WWW]lexgen 203,559 208,332 104,883 196,608 501,824
[WWW]life 66,130 78,084 83,390 65,536 414,760
[WWW]logic 106,614 116,880 87,251 114,688 440,360
[WWW]mandelbrot 47,690 77,004 81,340 57,344 404,520
[WWW]matrix-multiply 49,181 87,016 82,417 57,344 435,256
[WWW]md5 77,646 * * * *
[WWW]merge 49,318 24,296 80,090 49,152 400,432
[WWW]mlyacc 507,431 473,748 148,286 2,850,816 820,336
[WWW]model-elimination 638,084 * * * 1,009,880
[WWW]mpuz 50,594 73,232 82,382 81,920 408,616
[WWW]nucleic 199,181 258,552 * 221,184 487,480
[WWW]output1 80,720 63,336 80,187 49,152 399,400
[WWW]peek 76,302 62,092 81,621 57,344 403,544
[WWW]psdes-random 48,402 25,196 * * 421,944
[WWW]ratio-regions 73,914 95,924 87,482 73,728 443,448
[WWW]ray 183,243 108,848 89,859 147,456 493,712
[WWW]raytrace 265,332 * * * 636,112
[WWW]simple 222,914 192,032 94,396 475,136 756,840
[WWW]smith-normal-form 181,686 * * 131,072 558,224
[WWW]tailfib 47,434 18,804 79,943 57,344 399,400
[WWW]tak 47,818 18,580 79,908 57,344 411,392
[WWW]tensor 97,677 * * * 450,672
[WWW]tsp 82,190 97,716 86,146 * 425,024
[WWW]tyan 134,910 137,800 91,586 196,608 477,272
[WWW]vector-concat 49,018 23,924 80,194 49,152 410,680
[WWW]vector-rev 48,246 24,104 80,078 57,344 410,680
[WWW]vliw 393,762 * * * 731,304
[WWW]wc-input1 101,850 129,212 85,771 49,152 404,520
[WWW]wc-scanStream 109,106 129,708 85,947 49,152 405,544
[WWW]zebra 141,146 41,532 83,422 90,112 419,896
[WWW]zern 91,087 * * * 479,384

Compile time

The following table gives the compile time of each benchmark in seconds. A * in an entry means that the compiler failed to compile the benchmark.

benchmark MLton ML-Kit MosML Poly/ML SML/NJ
[WWW]barnes-hut 8.28 * * * 1.37
[WWW]boyer 8.14 8.99 0.39 0.12 3.20
[WWW]checksum 5.45 * * * *
[WWW]count-graphs 6.12 2.06 0.14 0.05 0.90
[WWW]DLXSimulator 9.81 * * * *
[WWW]fft 5.95 1.32 0.11 0.05 0.69
[WWW]fib 5.45 0.60 0.05 0.02 0.22
[WWW]flat-array 5.33 0.61 0.04 0.01 0.25
[WWW]hamlet 85.70 * * * 88.87
[WWW]imp-for 5.37 0.73 0.05 0.01 0.25
[WWW]knuth-bendix 7.09 4.11 0.19 0.12 1.60
[WWW]lexgen 11.02 7.21 0.40 0.26 3.63
[WWW]life 5.84 2.16 0.10 0.04 0.64
[WWW]logic 7.02 4.82 0.22 0.09 1.68
[WWW]mandelbrot 5.41 0.75 0.06 0.02 0.29
[WWW]matrix-multiply 5.39 0.77 0.06 0.01 0.30
[WWW]md5 6.01 * * * *
[WWW]merge 5.41 0.62 0.06 0.02 0.26
[WWW]mlyacc 24.70 40.69 3.35 1.08 18.04
[WWW]model-elimination 25.04 * * * 28.79
[WWW]mpuz 5.41 1.07 0.07 0.03 0.45
[WWW]nucleic 14.24 24.79 * 0.36 2.78
[WWW]output1 6.05 0.68 0.05 0.01 0.23
[WWW]peek 6.04 0.70 0.05 0.02 0.25
[WWW]psdes-random 5.39 0.75 * * 64.13
[WWW]ratio-regions 6.63 4.02 0.21 0.11 1.50
[WWW]ray 9.51 3.02 0.15 0.08 1.03
[WWW]raytrace 13.92 * * * 5.08
[WWW]simple 11.40 13.19 0.43 0.21 3.76
[WWW]smith-normal-form 8.90 * * 0.10 2.25
[WWW]tailfib 5.35 0.64 0.05 0.02 0.24
[WWW]tak 5.36 0.62 0.05 0.01 0.22
[WWW]tensor 8.75 * * * 2.81
[WWW]tsp 6.50 1.93 0.15 * 0.66
[WWW]tyan 8.86 6.25 0.30 0.17 2.28
[WWW]vector-concat 5.52 0.68 0.05 0.01 0.25
[WWW]vector-rev 5.33 0.64 0.05 0.02 0.26
[WWW]vliw 18.28 * * * 13.12
[WWW]wc-input1 6.85 0.68 0.07 0.02 0.27
[WWW]wc-scanStream 7.07 0.69 0.06 0.02 0.29
[WWW]zebra 8.57 2.30 0.09 0.04 0.78
[WWW]zern 6.20 * * * 0.65


Last edited on 2006-11-02 17:55:30 by MatthewFluet. mlton-20100608/doc/guide/PhantomType0000644000076600000240000000477411404435634015634 0ustar mtfstaff PhantomType - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PhantomType
Home  Index  
A phantom type is a type that has no run-time representation, but is used to force the type checker to ensure invariants at compile time. This is done by augmenting a type with additional arguments (phantom type variables) and expressing constraints by choosing phantom types to stand for the phantom types in the types of values.

References


Last edited on 2005-12-02 04:23:48 by StephenWeeks. mlton-20100608/doc/guide/PlatformSpecificNotes0000644000076600000240000000607611404435635017625 0ustar mtfstaff PlatformSpecificNotes - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PlatformSpecificNotes
Home  Index  
Here are notes about using MLton on the following platforms.

Operating Systems

Architectures

Also see


Last edited on 2009-06-18 22:56:09 by MatthewFluet. mlton-20100608/doc/guide/PolyEqual0000644000076600000240000000731711404435635015274 0ustar mtfstaff PolyEqual - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PolyEqual
Home  Index  
PolyEqual is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass implements polymorphic equality.

Implementation

[WWW]poly-equal.sig [WWW]poly-equal.fun

Details and Notes

For each datatype, tycon, and vector type, it builds and equality function and translates calls to MLton_equal into calls to that function.

Also generates calls to IntInf_equal and Word_equal.

For tuples, it does the equality test inline; i.e., it does not create a separate equality function for each tuple type.

All equality functions are created only if necessary, i.e., if equality is actually used at a type.

Optimizations:

  • for datatypes that are enumerations, do not build a case dispatch, just use MLton_eq, as the backend will represent these as ints

  • deep equality always does an MLton_eq test first

  • If one argument to = is a constant and the type will get translated to an IntOrPointer, then just use eq instead of the full equality. This is important for implementing code like the following efficiently:

    if x = 0  ...    (where x is an IntInf.int)
    

  • Also convert pointer equality on scalar types to type specific primitives.


Last edited on 2009-07-11 17:10:54 by MatthewFluet. mlton-20100608/doc/guide/PolyHash0000644000076600000240000000565311404435634015110 0ustar mtfstaff PolyHash - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PolyHash
Home  Index  
PolyHash is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass implements polymorphic, structural hashing.

Implementation

[WWW]poly-hash.sig [WWW]poly-hash.fun

Details and Notes

For each datatype, tycon, and vector type, it builds and equality function and translates calls to MLton_hash into calls to that function.

For tuples, it does the equality test inline; i.e., it does not create a separate equality function for each tuple type.

All equality functions are created only if necessary, i.e., if equality is actually used at a type.

Optimizations:


Last edited on 2009-07-11 17:13:45 by MatthewFluet. mlton-20100608/doc/guide/PolyML0000644000076600000240000000400411404435634014522 0ustar mtfstaff PolyML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PolyML
Home  Index  


Last edited on 2006-09-04 20:25:25 by StephenWeeks. mlton-20100608/doc/guide/PolymorphicEquality0000644000076600000240000002554211404435635017404 0ustar mtfstaff PolymorphicEquality - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PolymorphicEquality
Home  Index  
Polymorphic equality is a built-in function in Standard ML that compares two values of the same type for equality. It is specified as
val = : ''a * ''a -> bool

The ''a in the specification are equality type variables, and indicate that polymorphic equality can only be applied to values of an equality type. It is not allowed in SML to rebind =, so a programmer is guaranteed that = always denotes polymorphic equality.

  1. Equality of ground types
  2. Equality of reals
  3. Equality of functions
  4. Equality of immutable types
  5. Equality of mutable values
  6. Equality of datatypes
  7. Implementation
  8. Also see

Equality of ground types

Ground types like char, int, and word may be compared (to values of the same type). For example, 13 = 14 is type correct and yields false.

Equality of reals

The one ground type that can not be compared is real. So, 13.0 = 14.0 is not type correct. One can use Real.== to compare reals for equality, but beware that this has different algebraic properties than polymorphic equality.

See [WWW]http://mlton.org/basis/real.html for a discussion of why real is not an equality type.

Equality of functions

Comparison of functions is not allowed.

Equality of immutable types

Polymorphic equality can be used on immutable values like tuples, records, lists, and vectors. For example,

(1, 2, 3) = (4, 5, 6)

is a type-correct expression yielding false, while

[1, 2, 3] = [1, 2, 3]

is type correct and yields true.

Equality on immutable values is computed by structure, which means that values are compared by recursively descending the data structure until ground types are reached, at which point the ground types are compared with primitive equality tests (like comparison of characters). So, the expression

[1, 2, 3] = [1, 1 + 1, 1 + 1 + 1]

is guaranteed to yield true, even though the lists may occupy different locations in memory.

Because of structural equality, immutable values can only be compared if their components can be compared. For example, [1, 2, 3] can be compared, but [1.0, 2.0, 3.0] can not. The SML type system uses equality types to ensure that structural equality is only applied to valid values.

Equality of mutable values

In contrast to immutable values, polymorphic equality of mutable values (like ref cells and arrays) is performed by pointer comparison, not by structure. So, the expression

ref 13 = ref 13

is guaranteed to yield false, even though the ref cells hold the same contents.

Because equality of mutable values is not structural, arrays and refs can be compared even if their components are not equality types. Hence, the following expression is type correct (and yields true).

let
   val r = ref 13.0
in
   r = r
end

Equality of datatypes

Polymorphic equality of datatypes is structural. Two values of the same datatype are equal if they are of the same variant and if the variant's arguments are equal (recursively). So, with the datatype

datatype t = A | B of t

then B (B A) = B A is type correct and yields false, while A = A and B A = B A yield true.

As polymorphic equality descends two values to compare them, it uses pointer equality whenever it reaches a mutable value. So, with the datatype

datatype t = A of int ref | ...

then A (ref 13) = A (ref 13) is type correct and yields false, because the pointer equality on the two ref cells yields false.

One weakness of the SML type system is that datatypes do not inherit the special property of the ref and array type constructors that allows them to be compared regardless of their component type. For example, after declaring

datatype 'a t = A of 'a ref
one might expect to be able to compare two values of type real t, because pointer comparison on a ref cell would suffice. Unfortunately, the type system can only express that a user-defined datatype admits equality or not. In this case, t admits equality, which means that int t can be compared but that real t can not. We can confirm this with the program
datatype 'a t = A of 'a ref
fun f (x: real t, y: real t) = x = y
on which MLton reports the following error.
Error: z.sml 2.34.
  Function applied to incorrect argument.
    expects: [<equality>] * [<equality>]
    but got: [<non-equality>] * [<non-equality>]
    in: = (x, y)

Implementation

Polymorphic equality is implemented by recursively descending the two values being compared, stopping as soon as they are determined to be unequal, or exploring the entire values to determine that they are equal. Hence, polymorphic equality can take time proportional to the size of the smaller value.

MLton uses some optimizations to improve performance.

  • When computing structural equality, first do a pointer comparison. If the comparison yields true, then stop and return true, since the structural comparison is guaranteed to do so. If the pointer comparison fails, then recursively descend the values.

  • If a datatype is an enum (e.g. datatype t = A | B | C), then a single comparison suffices to compare values of the datatype. No case dispatch is required to determine whether the two values are of the same variant.

  • When comparing a known constant non-value-carrying variant, use a single comparison. For example, the following code will compile into a single comparison for A = x.

     datatype t = A | B | C of ...
     ... if A = x then ...

  • When comparing a small constant IntInf.int to another IntInf.int, use a single comparison against the constant. No case dispatch is required.

Also see


Last edited on 2007-07-08 22:57:41 by MatthewFluet. mlton-20100608/doc/guide/Polyvariance0000644000076600000240000000513111404435634016004 0ustar mtfstaff Polyvariance - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Polyvariance
Home  Index  
Polyvariance is an optimization pass for the SXML IntermediateLanguage, invoked from SXMLSimplify.

Description

This pass duplicates a higher-order, let bound function at each variable reference, if the cost is smaller than some threshold.

Implementation

[WWW]polyvariance.sig [WWW]polyvariance.fun

Details and Notes


Last edited on 2006-11-02 17:48:41 by MatthewFluet. mlton-20100608/doc/guide/Poplog0000644000076600000240000000444611404435634014620 0ustar mtfstaff Poplog - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Poplog
Home  Index  
[WWW]POPLOG is a development environment that includes implementations of a number of languages, including Standard ML.

While POPLOG is actively developed, the ML support predates SML'97, and there is no support for the BasisLibrary.

Here is a document on [WWW]Mixed-language programming in ML and Pop-11.


Last edited on 2005-10-09 23:12:14 by StephenWeeks. mlton-20100608/doc/guide/PortingMLton0000644000076600000240000002501011404435634015742 0ustar mtfstaff PortingMLton - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PortingMLton
Home  Index  
Porting MLton to a new target platform (architecture or OS) involves the following steps.
  1. Make the necessary changes to the scripts, runtime system, Basis Library implementation, and compiler.

  2. Get the regressions working using a cross compiler.

  3. Cross compile MLton and bootstrap on the target.

MLton has a native code generator only for AMD64 and X86, so, if you are porting to another architecture, you must use the C code generator. These notes do not cover building a new native code generator.

Some of the following steps will not be necessary if MLton already supports the architecture or operating system you are porting to.

What code to change

  • Scripts.

    • In bin/platform, add new cases to define $HOST_OS and $HOST_ARCH.

  • Runtime system.

    The goal of this step is to be able to successfully run make in the runtime directory on the target machine.

    • In platform.h, add a new case to include platform/<arch>.h and platform/<os>.h.

    • In platform/<arch>.h:

      • define MLton_Platform_Arch_host.

    • In platform/<os>.h:

      • include platform-specific includes.

      • define MLton_Platform_OS_host.

      • define all of the HAS_* macros.

    • In platform/<os>.c implement any platform-dependent functions that the runtime needs.

    • Add rounding mode control to basis/Real/IEEEReal.c for the new arch (if not HAS_FEROUND)

    • Compile and install the GnuMP. This varies from platform to platform. In platform/<os>.h, you need to include the appropriate gmp.h.

  • Basis Library implementation (basis-library/*)

    • In primitive/prim-mlton.sml,

      • Add a new variant to the MLton.Platform.Arch.t datatype.

      • modify the constants that define MLton.Platform.Arch.host to match with MLton_Platform_Arch_host, as set in runtime/platform/<arch>.h.

      • Add a new variant to the MLton.Platform.OS.t datatype.

      • modify the constants that define MLton.Platform.OS.host to match with MLton_Platform_OS_host, as set in runtime/platform/<os>.h.

    • In mlton/platform.{sig,sml}  add a new variant.

    • In sml-nj/sml-nj.sml, modify getOSKind.

    • Look at all the uses of MLton.Platform in the Basis Library implementation and see if you need to do anything special. You might use the following command to see where to look.

         find basis-library -type f | xargs grep 'MLton\.Platform'
      If in doubt, leave the code alone and wait to see what happens when you run the regression tests.

  • Compiler.

    • In lib/stubs/mlton-stubs/platform.sig add any new variants, as was done in the Basis Library.

    • In lib/stubs/mlton-stubs/mlton.sml add any new variants in MLton.Platform, as was done in the Basis Library.

The string used to identify a particular architecture or operating system must be the same (except for possibly case of letters) in the scripts, runtime, Basis Library implementation, and compiler (stubs). In mlton/main/main.fun, MLton itself uses the conversions to and from strings:

    MLton.Platform.{Arch,OS}.{from,to}String

If the there is a mismatch, you may see the error message strange arch or strange os.

Running the regressions with a cross compiler

When porting to a new platform, it is always best to get all (or as many as possible) of the regressions working before moving to a self compile. It is easiest to do this by modifying and rebuilding the compiler on a working machine and then running the regressions with a cross compiler. It is not easy to build a gcc cross compiler, so we recommend generating the C and assembly on a working machine (using MLton's -target and -stop g flags, copying the generated files to the target machine, then compiling and linking there.

  1. Remake the compiler on a working machine.

  2. Use bin/add-cross to add support for the new target. In particular, this should create build/lib/<target>/ with the platform-specific necessary cross-compilation information.

  3. Run the regression tests with the cross-compiler. To cross-compile all the tests, do

     bin/regression -cross <target>
    This will create all the executables. Then, copy bin/regression and the regression directory to the target machine, and do
     bin/regression -run-only <target>
    This should run all the tests.

Repeat this step, interleaved with appropriate compiler modifications, until all the regressions pass.

Bootstrap

Once you've got all the regressions working, you can build MLton for the new target. As with the regressions, the idea for bootstrapping is to generate the C and assembly on a working machine, copy it to the target machine, and then compile and link there. Here's the sequence of steps.

  1. On a working machine, with the newly rebuilt compiler, in the mlton directory, do:

     mlton -stop g -target <target> mlton.mlb

  2. Copy to the target machine.

  3. On the target machine, move the libraries to the right place. That is, in build/lib, do:

     rm -rf self target-map
     mv <target> self

  4. On the target machine, compile and link MLton. That is, in the mlton directory, do something like:

     gcc -c -Ibuild/lib/include -Ibuild/lib/self/include -O1 -w mlton/mlton.*.[cS]
     gcc -o build/lib/mlton-compile \
            -Lbuild/lib/self \
            -L/usr/local/lib \
            mlton.*.o \
            -lmlton -lgmp -lgdtoa -lm

  5. At this point, MLton should be working and you can finish the rest of a usual make on the target machine.

     make basis-no-check script mlbpathmap targetmap constants libraries tools

There are other details to get right, like making sure that the tools directories were clean so that the tools are rebuilt on the new platform, but hopefully this structure works. Once you've got a compiler on the target machine, you should test it by running all the regressions normally (i.e. without the -cross flag) and by running a couple rounds of self compiles.

Also see

The above description is based on the following emails sent to the MLton list.


Last edited on 2009-06-10 18:37:14 by MatthewFluet. mlton-20100608/doc/guide/PrecedenceParse0000644000076600000240000000520611404435634016403 0ustar mtfstaff PrecedenceParse - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PrecedenceParse
Home  Index  
PrecedenceParse is an analysis/rewrite pass for the AST IntermediateLanguage, invoked from Elaborate.

Description

This pass rewrites AST function clauses, expressions, and patterns to resolve OperatorPrecedence.

Implementation

[WWW]precedence-parse.sig [WWW]precedence-parse.fun

Details and Notes


Last edited on 2006-11-02 17:51:45 by MatthewFluet. mlton-20100608/doc/guide/print.css0000644000076600000240000000236111404435634015275 0ustar mtfstaff/* print.css - MoinMoin Default Styles Copyright (c) 2001, 2002, 2003 by Jürgen Hermann */ /* content styles */ h2, h3, h4, h5, h6 { border-bottom: solid 1pt black; } a { background-color: inherit; color: inherit; } pre { border: 1pt solid black; background-color: inherit color: black; } hr { clear: both; border-style: none; background-color: black; color: black; height: 1pt; } td { border: 1pt solid gray; } a.interwiki:before, a.badinterwiki:before { content: attr(title) ":"; } a.interwiki img, a.badinterwiki img { display: none; } .footnotes div { width: 5em; border-top: 1pt solid black; } /* user interface styles */ h1 { padding: .2em 1em; } #logo { float: left; margin: 0 .5em; } *[dir="rtl"] #logo { float: right; } #title a { text-decoration: none; } #username, #navibar, #pagetrail, #iconbar, #message, #footer, #timings { display: none; } table.recentchanges { width: 100%; } .recentchanges td { padding: 0 .3em; } .rcdaybreak td { background-color: #CCCCFF; padding: .2em; } .rcicon1, .rcicon2 { text-align: center; } .rcpagelink { width: 33%; } .rctime { font-size: .9em; color: #4D4D4D; } .rceditor { color: green; } .rccomment { color: red; width: 66%; } .rcrss { float: right; } mlton-20100608/doc/guide/Printf0000644000076600000240000002130511404435634014613 0ustar mtfstaff Printf - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Printf
Home  Index  
Programmers coming from C or Java often ask if Standard ML has a printf function. It does not. However, it is possible to implement your own version with only a few lines of code.

Here is a definition for printf and fprintf, along with format specifiers for booleans, integers, and reals.

structure Printf =
   struct
      fun $ (_, f) = f (fn p => p ()) ignore
      fun fprintf out f = f (out, id)
      val printf = fn z => fprintf TextIO.stdOut z
      fun one ((out, f), make) g =
         g (out, fn r =>
            f (fn p =>
               make (fn s => 
                     r (fn () => (p (); TextIO.output (out, s))))))
      fun ` x s = one (x, fn f => f s)
      fun spec to x = one (x, fn f => f o to)
      val B = fn z => spec Bool.toString z
      val I = fn z => spec Int.toString z
      val R = fn z => spec Real.toString z
   end

Here's an example use.

val () = printf `"Int="I`"  Bool="B`"  Real="R`"\n" $ 1 false 2.0

This prints the following.

Int=1  Bool=false  Real=2.0

In general, a use of printf looks like

printf <spec1> ... <specn> $ <arg1> ... <argm>

where each <speci> is either a specifier like B, I, or R, or is an inline string, like `"foo". A backtick (`) must precede each inline string. Each <argi> must be of the appropriate type for the corresponding specifier.

SML printf is more powerful than its C counterpart in a number of ways. In particular, the function produced by printf is a perfectly ordinary SML function, and can be passed around, used multiple times, etc. For example:

val f: int -> bool -> unit = printf `"Int="I`"  Bool="B`"\n" $
val () = f 1 true
val () = f 2 false

The definition of printf is even careful to not print anything until it is fully applied. So, examples like the following will work as expected.

val f: int -> bool -> unit = printf `"Int="I`"  Bool="B`"\n" $ 13
val () = f true
val () = f false

It is also easy to define new format specifiers. For example, suppose we wanted format specifiers for characters and strings.

val C = fn z => spec Char.toString z
val S = fn z => spec (fn s => s) z

One can define format specifiers for more complex types, e.g. pairs of integers.

val I2 = 
   fn z => 
   spec (fn (i, j) => 
         concat ["(", Int.toString i, ", ", Int.toString j, ")"])
   z

Here's an example use.

val () = printf `"Test "I2`"  a string "S`"\n" $ (1, 2) "hello"

Printf via fold

Printf is best viewed as a special case of variable-argument Fold that inductively builds a function as it processes its arguments. Here is the definition of a Printf structure in terms of fold. The structure is equivalent to the above one, except that it uses the standard $ instead of a specialized one.

structure Printf =
   struct
      fun fprintf out =
         Fold.fold ((out, id), fn (_, f) => f (fn p => p ()) ignore)

      val printf = fn z => fprintf TextIO.stdOut z

      fun one ((out, f), make) =
         (out, fn r =>
          f (fn p =>
             make (fn s =>
                   r (fn () => (p (); TextIO.output (out, s))))))
         
      val ` =
         fn z => Fold.step1 (fn (s, x) => one (x, fn f => f s)) z

      fun spec to = Fold.step0 (fn x => one (x, fn f => f o to))

      val B = fn z => spec Bool.toString z
      val I = fn z => spec Int.toString z
      val R = fn z => spec Real.toString z
   end

Viewing printf as a fold opens up a number of possibilities. For example, one can name parts of format strings using the fold idiom for naming sequences of steps.

val IB = fn u => Fold.fold u `"Int="I`" Bool="B
val () = printf IB`"  "IB`"\n" $ 1 true 3 false

One can even parametrize over partial format strings.

fun XB X = fn u => Fold.fold u `"X="X`" Bool="B
val () = printf (XB I)`"  "(XB R)`"\n" $ 1 true 2.0 false

Also see


Last edited on 2007-08-15 22:07:07 by MatthewFluet. mlton-20100608/doc/guide/PrintfGentle0000644000076600000240000004737111404435634015765 0ustar mtfstaff PrintfGentle - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PrintfGentle
Home  Index  
This page provides a gentle introduction and derivation of Printf, with sections and arrangement more suitable to a talk.

Introduction

SML does not have printf. Could we define it ourselves?

val () = printf ("here's an int %d and a real %f.\n", 13, 17.0)
val () = printf ("here's three values (%d, %f, %f).\n", 13, 17.0, 19.0)

What could the type of printf be?

This obviously can't work, because SML functions take a fixed number of arguments. Actually they take one argument, but if that's a tuple, it can only have a fixed number of components.

From tupling to currying

What about currying to get around the typing problem?

val () = printf "here's an int %d and a real %f.\n" 13 17.0
val () = printf "here's three values (%d, %f, %f).\n" 13 17.0 19.0

That fails for a similar reason. We need two types for printf.

val printf: string -> int -> real -> unit
val printf: string -> int -> real -> real -> unit

This can't work, because printf can only have one type. SML doesn't support programmer-defined overloading.

Overloading and dependent types

Even without worrying about number of arguments, there is another problem. The type of printf depends on the format string.

val () = printf "here's an int %d and a real %f.\n" 13 17.0
val () = printf "here's a real %f and an int %d.\n" 17.0 13

Now we need

val printf: string -> int -> real -> unit
val printf: string -> real -> int -> unit

Again, this can't possibly working because SML doesn't have overloading, and types can't depend on values.

Idea: express type information in the format string

If we express type information in the format string, then different uses of printf can have different types.

type 'a t  (* the type of format strings *)
val printf: 'a t -> 'a
infix D F
val fs1: (int -> real -> unit) t = "here's an int "D" and a real "F".\n"
val fs2: (int -> real -> real -> unit) t = 
   "here's three values ("D", "F", "F").\n"
val () = printf fs1 13 17.0
val () = printf fs2 13 17.0 19.0

Now, our two calls to printf type check, because the format string specializes printf to the appropriate type.

The types of format characters

What should the type of format characters D and F be? Each format character requires an additional argument of the appropriate type to be supplied to printf.

Idea: guess the final type that will be needed for printf the format string and verify it with each format character.

type ('a, 'b) t   (* 'a = rest of type to verify, 'b = final type *)
val ` : string -> ('a, 'a) t  (* guess the type, which must be verified *)
val D: (int -> 'a, 'b) t * string -> ('a, 'b) t  (* consume an int *)
val F: (real -> 'a, 'b) t * string -> ('a, 'b) t  (* consume a real *)
val printf: (unit, 'a) t -> 'a

Don't worry. In the end, type inference will guess and verify for us.

Understanding guess and verify

Now, let's build up a format string and a specialized printf.

infix D F
val f0 = `"here's an int "
val f1 = f0 D " and a real "
val f2 = f1 F ".\n"
val p = printf f2

These definitions yield the following types.

val f0: (int -> real -> unit, int -> real -> unit) t
val f1: (real -> unit, int -> real -> unit) t
val f2: (unit, int -> real -> unit) t
val p: int -> real -> unit

So, p is a specialized printf function. We could use it as follows

val () = p 13 17.0
val () = p 14 19.0

Type checking this using a functor

signature PRINTF =
   sig
      type ('a, 'b) t
      val ` : string -> ('a, 'a) t
      val D: (int -> 'a, 'b) t * string -> ('a, 'b) t
      val F: (real -> 'a, 'b) t * string -> ('a, 'b) t
      val printf: (unit, 'a) t -> 'a
   end

functor Test (P: PRINTF) =
   struct
      open P
      infix D F
         
      val () = printf (`"here's an int "D" and a real "F".\n") 13 17.0
      val () = printf (`"here's three values ("D", "F ", "F").\n") 13 17.0 19.0
   end

Implementing Printf

Think of a format character as a formatter transformer. It takes the formatter for the part of the format string before it and transforms it into a new formatter that first does the left hand bit, then does its bit, then continues on with the rest of the format string.

structure Printf: PRINTF =
   struct
      datatype ('a, 'b) t = T of (unit -> 'a) -> 'b

      fun printf (T f) = f (fn () => ())

      fun ` s = T (fn a => (print s; a ()))

      fun D (T f, s) =
         T (fn g => f (fn () => fn i => 
                       (print (Int.toString i); print s; g ())))

      fun F (T f, s) =
         T (fn g => f (fn () => fn i => 
                       (print (Real.toString i); print s; g ())))
   end

Testing printf

structure Z = Test (Printf)

User-definable formats

The definition of the format characters is pretty much the same. Within the Printf structure we can define a format character generator.

val newFormat: ('a -> string) -> ('a -> 'b, 'c) t * string -> ('b, 'c) t =
   fn toString => fn (T f, s) =>
   T (fn th => f (fn () => fn a => (print (toString a); print s ; th ())))
val D = fn z => newFormat Int.toString z
val F = fn z => newFormat Real.toString z

A core Printf

We can now have a very small PRINTF signature, and define all the format strings externally to the core module.

signature PRINTF =
   sig
      type ('a, 'b) t
      val ` : string -> ('a, 'a) t
      val newFormat: ('a -> string) -> ('a -> 'b, 'c) t * string -> ('b, 'c) t
      val printf: (unit, 'a) t -> 'a
   end

structure Printf: PRINTF =
   struct
      datatype ('a, 'b) t = T of (unit -> 'a) -> 'b

      fun printf (T f) = f (fn () => ())

      fun ` s = T (fn a => (print s; a ()))

      fun newFormat toString (T f, s) =
         T (fn th =>
            f (fn () => fn a =>
               (print (toString a)
                ; print s
                ; th ())))
   end

Extending to fprintf

One can implement fprintf by threading the outstream through all the transformers.

signature PRINTF =
   sig
      type ('a, 'b) t
      val ` : string -> ('a, 'a) t
      val fprintf: (unit, 'a) t * TextIO.outstream -> 'a
      val newFormat: ('a -> string) -> ('a -> 'b, 'c) t * string -> ('b, 'c) t
      val printf: (unit, 'a) t -> 'a
   end

structure Printf: PRINTF =
   struct
      type out = TextIO.outstream
      val output = TextIO.output
         
      datatype ('a, 'b) t = T of (out -> 'a) -> out -> 'b

      fun fprintf (T f, out) = f (fn _ => ()) out

      fun printf t = fprintf (t, TextIO.stdOut)

      fun ` s = T (fn a => fn out => (output (out, s); a out))

      fun newFormat toString (T f, s) =
         T (fn g =>
            f (fn out => fn a =>
               (output (out, toString a)
                ; output (out, s)
                ; g out)))
   end

Notes

  • Lesson: instead of using dependent types for a function, express the the dependency in the type of the argument.

  • If printf is partially applied, it will do the printing then and there. Perhaps this could be fixed with some kind of terminator.

    A syntactic or argument terminator is not necessary. A formatter can either be eager (as above) or lazy (as below). A lazy formatter accumulates enough state to print the entire string. The simplest lazy formatter concatenates the strings as they become available:

    structure PrintfLazyConcat: PRINTF =
       struct
          datatype ('a, 'b) t = T of (string -> 'a) -> string -> 'b
    
          fun printf (T f) = f print ""
    
          fun ` s = T (fn th => fn s' => th (s' ^ s))
    
          fun newFormat toString (T f, s) =
             T (fn th =>
                f (fn s' => fn a =>
                   th (s' ^ toString a ^ s)))
       end
    

    It is somewhat more efficient to accumulate the strings as a list:
    structure PrintfLazyList: PRINTF =
       struct
          datatype ('a, 'b) t = T of (string list -> 'a) -> string list -> 'b
    
          fun printf (T f) = f (List.app print o List.rev) []
    
          fun ` s = T (fn th => fn ss => th (s::ss))
    
          fun newFormat toString (T f, s) =
             T (fn th =>
                f (fn ss => fn a =>
                   th (s::toString a::ss)))
       end
    

Also see


Last edited on 2007-07-08 20:54:24 by MatthewFluet. mlton-20100608/doc/guide/ProductType0000644000076600000240000001030611404435634015632 0ustar mtfstaff ProductType - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ProductType
Home  Index  
Standard ML has special syntax for products (tuples). A product type is written as
t1 * t2 * ... * tN
and a product pattern is written as
(p1, p2, ..., pN)

In most situations the syntax is quite convenient. However, there are situations where the syntax is cumbersome. There are also situations in which it is useful to construct and destruct n-ary products inductively, especially when using Fold.

In such situations, it is useful to have a binary product datatype with an infix constructor defined as follows.

datatype ('a, 'b) product = & of 'a * 'b
infix &

With these definitions, one can write an n-ary product as a nested binary product quite conveniently.

x1 & x2 & ... & xn

Because of left associativity, this is the same as

(((x1 & x2) & ...) & xn)

Because & is a constructor, the syntax can also be used for patterns.

The symbol & is inspired by the Curry-Howard isomorphism: the proof of a conjunction (A & B) is a pair of proofs (a, b).

Example: parser combinators

A typical parser combinator library provides a combinator that has a type of the form.

'a parser * 'b parser -> ('a * 'b) parser

and produces a parser for the concatenation of two parsers. When more than two parsers are concatenated, the result of the resulting parser is a nested structure of pairs

(...((p1, p2), p3)..., pN)

which is somewhat cumbersome.

By using a product type, the type of the concatenation combinator then becomes

'a parser * 'b parser -> ('a, 'b) product parser

While this doesn't stop the nesting, it makes the pattern significantly easier to write. Instead of

(...((p1, p2), p3)..., pN)
the pattern is written as
p1 & p2 & p3 & ... & pN
which is considerably more concise.

Also see


Last edited on 2007-08-26 19:59:19 by MatthewFluet. mlton-20100608/doc/guide/Profiling0000644000076600000240000000570411404435634015307 0ustar mtfstaff Profiling - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Profiling
Home  Index  
With MLton and mlprof, you can profile your program to find out bytes allocated, execution counts, or time spent in each function. To profile you program, compile with -profile kind, where kind is one of alloc, count, or time. Then, run the executable, which will write an mlmon.out file when it finishes. You can then run mlprof on the executable and the mlmon.out file to see the performance data.

Here are the three kinds of profiling that MLton supports.

Going further


Last edited on 2007-07-08 20:58:34 by MatthewFluet. mlton-20100608/doc/guide/ProfilingAllocation0000644000076600000240000000742411404435634017316 0ustar mtfstaff ProfilingAllocation - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ProfilingAllocation
Home  Index  
With MLton and mlprof, you can profile your program to find out how many bytes each function allocates. To do so, compile your program with -profile alloc. For example, suppose that list-rev.sml is the following.

fun append (l1, l2) =
   case l1 of
      [] => l2
    | x :: l1 => x :: append (l1, l2)

fun rev l =
   case l of
      [] => []
    | x :: l => append (rev l, [x])

val l = List.tabulate (1000, fn i => i)
val _ = 1 + hd (rev l)

Compile and run list-rev as follows.

% mlton -profile alloc list-rev.sml
% ./list-rev
% mlprof -show-line true list-rev mlmon.out
6,030,136 bytes allocated (108,336 bytes by GC)
       function          cur 
----------------------- -----
append  list-rev.sml: 1 97.6%
<gc>                     1.8%
<main>                   0.4%
rev  list-rev.sml: 6     0.2%

The data shows that most of the allocation is done by the append function defined on line 1 of list-rev.sml. The table also shows how special functions like gc and main are handled: they are printed with surrounding brackets. C functions are displayed similarly. In this example, the allocation done by the garbage collector is due to stack growth, which is usually the case.

The run-time performance impact of allocation profiling is noticeable, because it inserts additional C calls for object allocation.

Compile with -profile alloc -profile-branch true to find out how much allocation is done in each branch of a function; see ProfilingCounts for more details on -profile-branch.


Last edited on 2006-11-02 17:51:52 by MatthewFluet. mlton-20100608/doc/guide/ProfilingCounts0000644000076600000240000001342311404435634016500 0ustar mtfstaff ProfilingCounts - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ProfilingCounts
Home  Index  
With MLton and mlprof, you can profile your program to find out how many times each function is called and how many times each branch is taken. To do so, compile your program with -profile count -profile-branch true. For example, suppose that tak.sml contains the following.

structure Tak =
   struct
      fun tak1 (x, y, z) =
         let
            fun tak2 (x, y, z) =
               if y >= x
                  then z
               else
                  tak1 (tak2 (x - 1, y, z),
                        tak2 (y - 1, z, x),
                        tak2 (z - 1, x, y))
         in
            if y >= x
               then z
            else
               tak1 (tak2 (x - 1, y, z),
                     tak2 (y - 1, z, x),
                     tak2 (z - 1, x, y))
         end
   end

val rec f =
   fn 0 => ()
    | ~1 => print "this branch is not taken\n"
    | n => (Tak.tak1 (18, 12, 6) ; f (n-1))

val _ = f 5000

fun uncalled () = ()

Compile with count profiling and run the program.

% mlton -profile count -profile-branch true tak.sml
% ./tak

Display the profiling data, along with raw counts and file positions.

% mlprof -raw true -show-line true tak mlmon.out
623,610,002 ticks
            function               cur       raw     
--------------------------------- ----- -------------
Tak.tak1.tak2  tak.sml: 5         38.2% (238,530,000)
Tak.tak1.tak2.<true>  tak.sml: 7  27.5% (171,510,000)
Tak.tak1  tak.sml: 3              10.7%  (67,025,000)
Tak.tak1.<true>  tak.sml: 14      10.7%  (67,025,000)
Tak.tak1.tak2.<false>  tak.sml: 9 10.7%  (67,020,000)
Tak.tak1.<false>  tak.sml: 16      2.0%  (12,490,000)
f  tak.sml: 23                     0.0%       (5,001)
f.<branch>  tak.sml: 25            0.0%       (5,000)
f.<branch>  tak.sml: 23            0.0%           (1)
uncalled  tak.sml: 29              0.0%           (0)
f.<branch>  tak.sml: 24            0.0%           (0)

Branches are displayed with lexical nesting followed by <branch> where the function name would normally be, or <true> or <false> for if-expressions. It is best to run mlprof with -show-line true to help identify the branch.

One use of -profile count is as a code-coverage tool, to help find code in your program that hasn't been tested. For this reason, mlprof displays functions and branches even if they have a count of zero. As the above output shows, the branch on line 24 was never taken and the function defined on line 29 was never called. To see zero counts, it is best to run mlprof with -raw true, since some code (e.g. the branch on line 23 above) will show up with 0.0% but may still have been executed and hence have a nonzero raw count.


Last edited on 2007-08-21 03:44:16 by MatthewFluet. mlton-20100608/doc/guide/ProfilingTheStack0000644000076600000240000000712611404435634016736 0ustar mtfstaff ProfilingTheStack - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ProfilingTheStack
Home  Index  
For all forms of Profiling, you can gather counts for all functions on the stack, not just the currently executing function. To do so, compile your program with -profile-stack true. For example, suppose that list-rev.sml contains the following.

fun append (l1, l2) =
   case l1 of
      [] => l2
    | x :: l1 => x :: append (l1, l2)

fun rev l =
   case l of
      [] => []
    | x :: l => append (rev l, [x])

val l = List.tabulate (1000, fn i => i)
val _ = 1 + hd (rev l)

Compile with stack profiling and then run the program.

% mlton -profile alloc -profile-stack true list-rev.sml
% ./list-rev

Display the profiling data.

% mlprof -show-line true list-rev mlmon.out
6,030,136 bytes allocated (108,336 bytes by GC)
       function          cur  stack  GC 
----------------------- ----- ----- ----
append  list-rev.sml: 1 97.6% 97.6% 1.4%
<gc>                     1.8%  0.0% 1.8%
<main>                   0.4% 98.2% 1.8%
rev  list-rev.sml: 6     0.2% 97.6% 1.8%

In the above table, we see that rev, defined on line 6 of list-rev.sml, is only responsible for 0.2% of the allocation, but is on the stack while 97.6% of the allocation is done by the user program and while 1.8% of the allocation is done by the garbage collector.

The run-time performance impact of -profile-stack true can be noticeable since there is some extra bookkeeping at every nontail call and return.


Last edited on 2006-11-02 17:42:31 by MatthewFluet. mlton-20100608/doc/guide/ProfilingTime0000644000076600000240000001436011404435634016124 0ustar mtfstaff ProfilingTime - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ProfilingTime
Home  Index  
With MLton and mlprof, you can profile your program to find out how much time is spent in each function over an entire run of the program. To do so, compile your program with -profile time. For example, suppose that tak.sml contains the following.

structure Tak =
   struct
      fun tak1 (x, y, z) =
         let
            fun tak2 (x, y, z) =
               if y >= x
                  then z
               else
                  tak1 (tak2 (x - 1, y, z),
                        tak2 (y - 1, z, x),
                        tak2 (z - 1, x, y))
         in
            if y >= x
               then z
            else
               tak1 (tak2 (x - 1, y, z),
                     tak2 (y - 1, z, x),
                     tak2 (z - 1, x, y))
         end
   end

val rec f =
   fn 0 => ()
    | ~1 => print "this branch is not taken\n"
    | n => (Tak.tak1 (18, 12, 6) ; f (n-1))

val _ = f 5000

fun uncalled () = ()

Compile with time profiling and run the program.

% mlton -profile time tak.sml
% ./tak

Display the profiling data.

% mlprof tak mlmon.out
6.00 seconds of CPU time (0.00 seconds GC)
function     cur 
------------- -----
Tak.tak1.tak2 75.8%
Tak.tak1      24.2%

This example shows how mlprof indicates lexical nesting: as a sequence of period-separated names indicating the structures and functions in which a function definition is nested. The profiling data shows that roughly three-quarters of the time is spent in the Tak.tak1.tak2 function, while the rest is spent in Tak.tak1.

Display raw counts in addition to percentages with -raw true.

% mlprof -raw true tak mlmon.out
6.00 seconds of CPU time (0.00 seconds GC)
  function     cur    raw  
------------- ----- -------
Tak.tak1.tak2 75.8% (4.55s)
Tak.tak1      24.2% (1.45s)

Display the file name and line number for each function in addition to its name with -show-line true.

% mlprof -show-line true tak mlmon.out
6.00 seconds of CPU time (0.00 seconds GC)
        function           cur 
------------------------- -----
Tak.tak1.tak2  tak.sml: 5 75.8%
Tak.tak1  tak.sml: 3      24.2%

Time profiling is designed to have a very small performance impact. However, in some cases there will be a run-time performance cost, which may perturb the results. There is more likely to be an impact with -codegen c than -codegen native.

You can also compile with -profile time -profile-branch true to find out how much time is spent in each branch of a function; see ProfilingCounts for more details on -profile-branch.

Caveats

With -profile time, use of the following in your program will cause a run-time error, since they would interfere with the profiler signal handler.

  • MLton.Itimer.set (MLton.Itimer.Prof, ...)

  • MLton.Signal.setHandler (MLton.Signal.prof, ...)

Also, because of the random sampling used to implement -profile time, it is best to have a long running program (at least tens of seconds) in order to get reasonable time


Last edited on 2006-11-02 17:38:19 by MatthewFluet. mlton-20100608/doc/guide/Projects0000644000076600000240000001174711404435634015153 0ustar mtfstaff Projects - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Projects
Home  Index  
We have lots of ideas for projects to improve MLton, many of which we do not have time to implement, or at least haven't started on yet. Here is a list of some of those improvements, ranging from the easy (1 week) to the difficult (several months). If you have any interest in working on one of these, or some other improvement to MLton not listed here, please send mail to [MAILTO]MLton@mlton.org.


Last edited on 2008-02-26 03:27:21 by AdamGoode. mlton-20100608/doc/guide/Pronounce0000644000076600000240000000425311404435634015324 0ustar mtfstaff Pronounce - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Pronounce
Home  Index  
Here is [WWW]how "MLton" sounds.

"MLton" is pronounced in two syllables, with stress on the first syllable. The first syllable sounds like the word mill (as in "steel mill"), the second like the word tin (as in "cookie tin").


Last edited on 2005-12-02 00:54:13 by StephenWeeks. mlton-20100608/doc/guide/PropertyList0000644000076600000240000001511211404435634016030 0ustar mtfstaff PropertyList - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION PropertyList
Home  Index  
A property list is a dictionary-like data structure into which properties (name-value pairs) can be inserted and from which properties can be looked up by name. The term comes from the Lisp language, where every symbol has a property list for storing information, and where the names are typically symbols and keys can be any type of value.

Here is an SML signature for property lists such that for any type of value a new property can be dynamically created to manipulate that type of value in a property list.

signature PROPERTY_LIST =
   sig
      type t

      val new: unit -> t
      val newProperty: unit -> {add: t * 'a -> unit,
                                peek: t -> 'a option}
   end

Here is a functor demonstrating the use of property lists. It first creates a property list, then two new properties (of different types), and adds a value to the list for each property.

functor Test (P: PROPERTY_LIST) =
   struct
      val pl = P.new ()

      val {add = addInt: P.t * int -> unit, peek = peekInt} = P.newProperty ()
      val {add = addReal: P.t * real -> unit, peek = peekReal} = P.newProperty ()

      val () = addInt (pl, 13)
      val () = addReal (pl, 17.0)
      val s1 = Int.toString (valOf (peekInt pl))
      val s2 = Real.toString (valOf (peekReal pl))
      val () = print (concat [s1, " ", s2, "\n"])
   end

Applied to an appropriate implementation PROPERTY_LIST, the Test functor will produce the following output.

13 17.0

Implementation

Because property lists can hold values of any type, their implementation requires a UniversalType. Given that, a property list is simply a list of elements of the universal type. Adding a property adds to the front of the list, and looking up a property scans the list.

functor PropertyList (U: UNIVERSAL_TYPE): PROPERTY_LIST =
   struct
      datatype t = T of U.t list ref

      fun new () = T (ref [])

      fun 'a newProperty () =
         let
            val (inject, out) = U.embed ()
            fun add (T r, a: 'a): unit = r := inject a :: (!r)
            fun peek (T r) =
               Option.map (valOf o out) (List.find (isSome o out) (!r))
         in
            {add = add, peek = peek}
         end
   end

If U: UNIVERSAL_TYPE, then we can test our code as follows.

structure Z = Test (PropertyList (U))

Of course, a serious implementation of property lists would have to handle duplicate insertions of the same property, as well as the removal of elements in order to avoid space leaks.

Also see

MLton relies heavily on property lists for attaching information to syntax tree nodes in its intermediate languages. See [WWW]property-list.sig [WWW]property-list.fun.

The MLRISCLibrary uses property lists extensively.


Last edited on 2010-03-02 15:17:55 by MatthewFluet. mlton-20100608/doc/guide/RayRacine0000644000076600000240000000511611404435635015231 0ustar mtfstaff RayRacine - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RayRacine
Home  Index  
Using SML in some Semantic Web stuff. Anyone interested in similar, please contact me. GreyLensman on #sml on IRC or rracine at this domain adelphia with a dot here net.

Current areas of coding.

  1. Pretty solid, high performance Rete implementation - base functionality is complete.

  2. N3 parser - mostly complete

  3. RDF parser based on fxg - not started.

  4. Swerve HTTP server - 1/2 done.

  5. SPARQL implementation - not started.

  6. Persistent engine based on BerkelyDB - not started.

  7. Native implementation of Postgresql protocol - underway, ways to go.

  8. I also have a small change to the MLton compiler to add PackWord<N> - changes compile but needs some more work, clean-up and unit tests.


Last edited on 2007-07-08 21:14:28 by MatthewFluet. mlton-20100608/doc/guide/Reachability0000644000076600000240000000506711404435634015760 0ustar mtfstaff Reachability - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Reachability
Home  Index  
Reachability is a notion dealing with the graph of heap objects maintained at runtime. Nodes in the graph are heap objects and edges correspond to the pointers between heap objects. As the program runs, it allocates new objects (adds nodes to the graph), and those new objects can contain pointers to other objects (new edges in the graph). If the program uses mutable objects (refs or arrays), it can also change edges in the graph.

At any time, the program has access to some finite set of root nodes, and can only ever access nodes that are reachable by following edges from these root nodes. Nodes that are unreachable can be garbage collected.

Also see


Last edited on 2006-08-21 19:41:42 by StephenWeeks. mlton-20100608/doc/guide/Redundant0000644000076600000240000000561211404435634015300 0ustar mtfstaff Redundant - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Redundant
Home  Index  
Redundant is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

???

Implementation

[WWW]redundant.sig [WWW]redundant.fun

Details and Notes

The reason Redundant got put in was due to some output of the ClosureConvert pass converter where the environment record, or components of it, were passed around in several places. That may have been more relevant with polyvariant analyses (which are long gone). But it still seems possibly relevant, especially with more aggressive flattening, which should reveal some fields in nested closure records that are redundant.


Last edited on 2006-11-02 17:53:25 by MatthewFluet. mlton-20100608/doc/guide/RedundantTests0000644000076600000240000000543511404435634016326 0ustar mtfstaff RedundantTests - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RedundantTests
Home  Index  
RedundantTests is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass simplifies conditionals whose results are implied by a previous conditional test.

Implementation

[WWW]redundant-tests.sig [WWW]redundant-tests.fun

Details and Notes

An additional test will sometimes eliminate the overflow test when adding or subtracting 1. In particular, it will eliminate it in the following cases:

if x < y
  then ... x + 1 ...
else ... y - 1 ...


Last edited on 2006-11-02 17:37:46 by MatthewFluet. mlton-20100608/doc/guide/References0000644000076600000240000015606711404435634015450 0ustar mtfstaff References - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION References
Home  Index  
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

Abbreviations

  • ACSD = International Conference on Application of Concurrency to System Design

  • BABEL = Workshop on multi-language infrastructure and interoperability

  • CC = International Conference on Compiler Construction

  • DPCOOL = Workshop on Declarative Programming in the Context of OO Languages

  • ESOP = European Symposium on Programming

  • FLOPS = Symposium on Functional and Logic Programming

  • FPCA = Conference on Functional Programming Languages and Computer Architecture

  • HOSC = Higher-Order and Symbolic Computation

  • IC = Information and Computation

  • ICCL = IEEE International Conference on Computer Languages

  • ICFP = International Conference on Functional Programming

  • IFL = International Workshop on Implementation and Application of Functional Languages

  • IVME = Workshop on Interpreters, Virtual Machines and Emulators

  • JFLA = Journees Francophones des Langages Applicatifs

  • JFP = Journal of Functional Programming

  • LASC = Lisp and Symbolic Computation

  • LFP = Lisp and Functional Programming

  • ML = Workshop on ML

  • PLDI = Conference on Programming Language Design and Implementation

  • POPL = Symposium on Principles of Programming Languages

  • PPDP = International Conference on Principles and Practice of Declarative Programming

  • PPoPP = Principles and Practice of Parallel Programming

  • TCS = IFIP International Conference on Theoretical Computer Science

  • TIC = Types in Compilation

  • TLDI = Workshop on Types in Language Design and Implementation

  • TOPLAS = Transactions on Programming Languages and Systems

  • TPHOLs = International Conference on Theorem Proving in Higher Order Logics


Last edited on 2010-06-08 14:23:39 by MatthewFluet. mlton-20100608/doc/guide/RefFlatten0000644000076600000240000001102411404435634015400 0ustar mtfstaff RefFlatten - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RefFlatten
Home  Index  
RefFlatten is an optimization pass for the SSA2 IntermediateLanguage, invoked from SSA2Simplify.

Description

This pass flattens a ref cell into its containing object. The idea is to replace, where possible, a type like

   (int ref * real)
with a type like
   (int[m] * real)
where the [m] indicates a mutable field of a tuple.

Implementation

[WWW]ref-flatten.sig [WWW]ref-flatten.fun

Details and Notes

The savings is obvious, I hope. We avoid an extra heap-allocated object for the ref, which in the above case saves two words. We also save the time and code for the extra indirection at each get and set. There are lots of useful data structures (singly-linked and doubly-linked lists, union-find, Fibonacci heaps, ...) that I believe we are paying through the nose right now because of the absence of ref flattening.

The idea is to compute for each occurrence of a ref type in the program whether or not that ref can be represented as an offset of some object (constructor or tuple). As before, a unification-based whole-program with deep abstract values makes sure the analysis is consistent.

The only syntactic part of the analysis that remains is the part that checks that for a variable bound to a value constructed by Ref_ref:

  • the object allocation is in the same block. This is pretty draconian, and it would be nice to generalize it some day to allow flattening as long as the ref allocation and object allocation "line up one-to-one" in the same loop-free chunk of code.

  • updates occur in the same block (and hence it is safe-for-space because the containing object is still alive). It would be nice to relax this to allow updates as long as it can be proved that the container is live.

Prevent flattening of unit refs.

RefFlatten is safe for space. The idea is to prevent a ref being flattened into an object that has a component of unbounded size (other than possibly the ref itself) unless we can prove that at each point the ref is live, then the containing object is live too. I used a pretty simple approximation to liveness.


Last edited on 2009-12-11 14:55:23 by MatthewFluet. mlton-20100608/doc/guide/Regions0000644000076600000240000001564311404435635014770 0ustar mtfstaff Regions - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Regions
Home  Index  
In region-based memory management, the heap is divided into a collection of regions into which objects are allocated. At compile time, either in the source program or through automatic inference, allocation points are annotated with the region in which the allocation will occur. Typically, although not always, the regions are allocated and deallocated according to a stack discipline.

MLton does not use region-based memory management; it uses traditional GarbageCollection. We have considered integrating regions with MLton, but in our opinion it is far from clear that regions would provide MLton with improved performance, while they would certainly add a lot of complexity to the compiler and complicate reasoning about and achieving SpaceSafety. Region-based memory management and garbage collection have different strengths and weaknesses; it's pretty easy to come up with programs that do significantly better under regions than under GC, and vice versa. We believe that it is the case that common SML idioms tend to work better under GC than under regions.

One common argument for regions is that the region operations can all be done in (approximately) constant time; therefore, you eliminate GC pause times, leading to a real-time GC. However, because of space safety concerns (see below), we believe that region-based memory management for SML must also include a traditional garbage collector. Hence, to achieve real-time memory management for MLton/SML, we believe that it would be both easier and more efficient to implement a traditional real-time garbage collector than it would be to implement a region system.

Regions, the ML Kit, and space safety

The ML Kit pioneered the use of regions for compiling Standard ML. The ML Kit maintains a stack of regions at run time. At compile time, it uses region inference to decide when data can be allocated in a stack-like manner, assigning it to an appropriate region. The ML Kit has put a lot of effort into improving the supporting analyses and representations of regions, which are all necessary to improve the performance.

Unfortunately, under a pure stack-based region system, space leaks are inevitable in theory, and costly in practice. Data for which region inference can not determine the lifetime is moved into the global region whose lifetime is the entire program. There are two ways in which region inference will place an object to the global region.

  • When the inference is too conservative, that is, when the data is used in a stack-like manner but the region inference can't figure it out.

  • When data is not used in a stack-like manner. In this case, correctness requires region inference to place the object

This global region is a source of space leaks. No matter what region system you use, there are some programs such that the global region must exist, and its size will grow to an unbounded multiple of the live data size. For these programs one must have a GC to achieve space safety.

To solve this problem, the ML Kit has undergone work to combine garbage collection with region-based memory management. HallenbergEtAl02 and Elsman03 describe the addition of a garbage collector to the ML Kit's region-based system. These papers provide convincing evidence for space leaks in the global region. They show a number of benchmarks where the memory usage of the program running with just regions is a large multiple (2, 10, 50, even 150) of the program running with regions plus GC.

These papers also give some numbers to show the ML Kit with just regions does better than either a system with just GC or a combined system. Unfortunately, a pure region system isn't practical because of the lack of space safety. And the other performance numbers are not so convincing, because they compare to an old version of SML/NJ and not at all with MLton. It would be interesting to see a comparison with a more serious collector.

Regions, Garbage Collection, and Cyclone

One possibility is to take Cyclone's approach, and provide both region-based memory management and garbage collection, but at the programmer's option (GrossmanEtAl02, HicksEtAl03).

One might ask whether we might do the same thing -- i.e., provide a MLton.Regions structure with explicit region based memory management operations, so that the programmer could use them when appropriate. MatthewFluet has thought about this question

Unfortunately, his conclusion is that the SML type system is too weak to support this option, although there might be a "poor-man's" version with dynamic checks.


Last edited on 2005-09-06 23:20:00 by MatthewFluet. mlton-20100608/doc/guide/Release200411090000644000076600000240000000701111404435634015550 0ustar mtfstaff Release20041109 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Release20041109
Home  Index  

This is an archived public release of MLton, version 20041109.

Changes since the last public release

  • New platforms:

    • x86: FreeBSD 5.x, OpenBSD

    • PowerPC: Darwin (MacOSX)

  • Support for the ML Basis system, a new mechanism supporting programming in the very large, separate delivery of library sources, and more.

  • Support for dynamic libraries.

  • Support for ConcurrentML (CML).

  • New structures: Int2, Int3, ..., Int31 and Word2, Word3, ..., Word31.

  • Front-end bug fixes and improvements.

  • A new form of profiling with -profile count, which can be used to test code coverage.

  • A bytecode generator, available via -codegen bytecode.

  • Representation improvements:

    • Tuples and datatypes are packed to decrease space usage.

    • Ref cells may be unboxed into their containing object.

    • Arrays of tuples may represent the tuples unboxed.

For a complete list of changes and bug fixes since 20040227, see the [WWW]changelog.

Also see


Last edited on 2007-08-24 20:25:55 by MatthewFluet. mlton-20100608/doc/guide/Release200512020000644000076600000240000002353011404435635015550 0ustar mtfstaff Release20051202 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Release20051202
Home  Index  

This is an archived public release of MLton, version 20051202.

Changes since the last public release

  • The MLton license is now BSD-style instead of the GPL.

  • New platforms: X86/MinGW and HPPA/Linux.

  • Improved and expanded documentation, based on the MLton wiki.

  • Compiler.

    • improved exception history.

    • Command-line switches.

      • Added: -as-opt, -mlb-path-map, -target-as-opt, -target-cc-opt.

      • Removed: -native, -sequence-unit, -warn-match, -warn-unused.

  • Language.

    • FFI syntax changes and extensions.

      • Added: _symbol.

      • Changed: _export, _import.

      • Removed: _ffi.

    • ML Basis annotations.

      • Added: allowFFI, nonexhaustiveExnMatch, nonexhaustiveMatch, redundantMatch, sequenceNonUnit.

      • Deprecated: allowExport, allowImport, sequenceUnit, warnMatch.

  • Libraries.

    • o Basis Library.
      • Added: Int1, Word1.

      o MLton structure.
      • Added: Process.create, ProcEnv.setgroups, Rusage.measureGC, Socket.fdToSock, Socket.Ctl.getError.

      • Changed: MLton.Platform.Arch.

      o Other libraries.
  • Tools.

    • Updates of mllex and mlyacc from SML/NJ.

    • Added mlnlffigen.

    • Profiling supports better inclusion/exclusion of code.

For a complete list of changes and bug fixes since Release20041109, see the [WWW]changelog and Bugs20041109.

20051202 binary packages

20051202 source packages

Packages available at other sites

Also see


Last edited on 2007-08-26 19:56:57 by MatthewFluet. mlton-20100608/doc/guide/Release200708260000644000076600000240000003220511404435635015564 0ustar mtfstaff Release20070826 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Release20070826
Home  Index  

This is an archived public release of MLton, version 20070826.

Changes since the last public release

  • New platforms:

  • Compiler.

    • Support for 64-bit platforms.

      • Native amd64 codegen.

    • Compile-time options.

      • Added: -codegen amd64, -codegen x86, -default-type type, -profile-val {false|true}.

      • Changed: -stop f (file listing now includes .mlb files).

    • Bytecode codegen.

      • Support for exception history.

      • Support for profiling.

  • Language.

  • Libraries.

    • Basis Library.

      • Added: PackWord16Big, PackWord16Little, PackWord64Big, PackWord64Little.

      • Bug Fixes: see [WWW]changelog.

    • MLton structure.

      • Added: MLTON_MONO_ARRAY, MLTON_MONO_VECTOR, MLTON_REAL, MLton.BinIO.tempPrefix, MLton.CharArray, MLton.CharVector, MLton.Exn.defaultTopLevelHandler, MLton.Exn.getTopLevelHandler, MLton.Exn.setTopLevelHandler, MLton.IntInf.BigWord, Mlton.IntInf.SmallInt, MLton.LargeReal, MLton.LargeWord, MLton.Real, MLton.Real32, MLton.Real64, MLton.Rlimit.Rlim, MLton.TextIO.tempPrefix, MLton.Vector.create, MLton.Word.bswap, MLton.Word8.bswap, MLton.Word16, MLton.Word32, MLton.Word64, MLton.Word8Array, MLton.Word8Vector.

      • Changed: MLton.Array.unfoldi, MLton.IntInf.rep, MLton.Rlimit, MLton.Vector.unfoldi.

      • Deprecated: MLton.Socket.

    • Other libraries.

  • Tools.

For a complete list of changes and bug fixes since Release20051202, see the [WWW]changelog and Bugs20051202.

20070826 binary packages

20070826 source packages

Packages available at other sites

Also see


Last edited on 2010-06-08 14:35:09 by MatthewFluet. mlton-20100608/doc/guide/Release201006080000644000076600000240000002266111404435634015560 0ustar mtfstaff Release20100608 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Release20100608
Home  Index  
Here you can download the latest public release of MLton, version 20100608. Elsewhere you can download newer, [WWW]Experimental releases.

Changes since the last public release

  • New platforms.

  • Compiler.

    • Command-line switches.

      • Added: -mlb-path-var '<name> <value>'

      • Removed: -keep sml, -stop sml

    • Improved constant folding of floating-point operations.

    • Experimental: Support for compiling to a C library; see documentation.

    • Extended -show-def-use output to include types of variable definitions.

    • Deprecated features (to be removed in a future release)

      • Bytecode codegen: The bytecode codegen has not seen significant use and it is not well understood by any of the active developers.

      • Support for .cm files as input: The ML Basis system provides much better infrastructure for "programming in the very large" than the (very) limited support for CM. The cm2mlb tool (available in the source distribution) can be used to convert CM projects to MLB projects, preserving the CM scoping of module identifiers.

    • Bug fixes: see [WWW]changelog

  • Runtime.

    • @MLton switches.

      • Added: may-page-heap {false|true}

    • may-page-heap: By default, MLton will not page the heap to disk when unable to grow the heap to accomodate an allocation. (Previously, this behavior was the default, with no means to disable, with security an least-surprise issues.)

    • Bug fixes: see [WWW]changelog

  • Language.

    • Allow numeric characters in ML Basis path variables.

  • Libraries.

  • Tools.

    • mllex

      • Eliminated top-level type int = Int.int in output.

      • Include (*#line line:col "file.lex" *) directives in output.

      • Added %posint command, to set the yypos type and allow the lexing of multi-gigabyte files.

    • mlnlffigen

      • Added command-line switches -linkage archive and -linkage shared.

      • Deprecated command-line switch -linkage static.

      • Added support for IA64 and HPPA targets.

    • mlyacc

      • Eliminated top-level type int = Int.int in output.

      • Include (*#line line:col "file.grm" *) directives in output.

For a complete list of changes and bug fixes since Release20070826, see the [WWW]changelog and Bugs20070826.

20100608 binary packages

20100608 source packages

Packages available at other sites

Also see


Last edited on 2010-06-08 14:33:07 by MatthewFluet. mlton-20100608/doc/guide/ReleaseChecklist0000644000076600000240000002464511404435634016575 0ustar mtfstaff ReleaseChecklist - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ReleaseChecklist
Home  Index  

Advance preparation for release

  • Catch up on doc/changelog documentation.

    • Write summary of changes from previous release.

  • Update doc/README with relevant changes.

  • Update man/{mlton,mlprof}.1 with relevant changes and set dates.

  • Wiki

    • Check OrphanedPages and WantedPages.

    • Features page should by synchronized with doc/README.

    • Catch up on Credits acknowledgements.

    • Create ReleaseYYYYMM?? (i.e., forthcoming release) based on ReleaseXXXXLLCC (i.e., previous release).

      • Update summary from doc/changelog.

      • Update attachment, SVN, and Wiki links to estimated release date.

      • Comment out lists and attachment links under YYYYMM?? binary packages and YYYYMM?? sources.

      • Ensure page has #acl All:

    • Create BugsYYYYMM?? based on BugsXXXXLLCC.

      • Update SVN and Wiki links to estimated release date.

    • Spell check pages.

Prepare Wiki for tagging

This ensures that the guide distributed with the release looks updated for the release.

  • Rename ReleaseYYYYMM?? to ReleaseYYYYMMDD with proper release date.

    • Update attachment, SVN, and Wiki links to proper release date.

  • Rename BugsYYYYMM?? to BugsYYYYMMDD with proper release date.

    • Update SVN and Wiki links to proper release date.

  • Update ReleaseXXXXLLCC.

    • Change intro to "This is an archived public release of MLton, version XXXXLLCC."

  • Update [WWW]Download.

    • Change Include(ReleaseXXXXLLCC, "Release XXXXLLCC") to Include(ReleaseYYYYMMDD,"Release YYYYMMDD").

  • Update Home with note of new release.

    • Change What's new? text to Please try out our new release, [:ReleaseYYYYMMDD:MLton YYYYMMDD].

  • Clear [WWW]Experimental.

  • Clear [WWW]TemporaryUpload

Prepare sources for tagging

  • Run bin/grab-wiki to update doc/guide.

    • Check that doc/guide/MLTONWIKIVERSION has proper release date.

    • Make sure that ReleaseYYYYMMDD and BugsYYYYMMDD are added to the repository.

    • Make sure that ReleaseYYYYMM?? and BugsYYYYMM?? are removed from the repository (if they were added during the advanced preparation).

    • Commit changes to doc/guide.

  • Check that doc/changelog has proper date.

Tag sources

  • Shell commands:

    svn copy -m "Tagging YYYYMMDD release" svn+ssh://mlton.org/svnroot/mlton/trunk svn+ssh://mlton.org/svnroot/mlton/tags/on-YYYYMMDD-release
    

Packaging

Source release

  • Shell commands:

    svn checkout svn+ssh://mlton.org/svnroot/mlton/tags/on-YYYYMMDD-release mlton-YYYYMMDD
    cd mlton-YYYYMMDD
    make clean clean-svn version VERSION=YYYYMMDD RELEASE=1
    cd ..
    tar -czpvf mlton-YYYYMMDD-1.src.tgz mlton-YYYYMMDD
    

  • Update ReleaseYYYYMMDD with mlton-YYYYMMDD-1.src.tgz attachment.

Binary releases

  • Download source release (mlton-YYYYMMDD-1.src.tgz from [WWW]Download).

  • Shell commands:

    tar -xzpvf mlton-YYYYMMDD-1.src.tgz
    cd mlton-YYYYMMDD
    make
    

  • If your platform doesn't have htmldoc, please build or get mlton-guide.pdf and copy to doc/guide.

  • Shell commands:

    make install
    cd install
    tar -czpvf ../mlton-YYYYMMDD-1.ARCH-OS.tgz *
    

  • Update ReleaseYYYYMMDD with mlton-YYYYMMDD-1.ARCH-OS.tgz attachment.

Package releases

  • Debian: ???

Website

  • basis gets a snapshot of [WWW]http://standardml.org/Basis (if any relevant changes).

  • changelog gets a copy of doc/changelog.

  • guide/YYYYMMDD gets a copy of doc/guide.

    • Need to run sed to replace MLTONWIKIVERSION with YYYYMMDD.

    • Copy guide/YYYYMMDD/Home to guide/YYYYMMDD/index.html.

    • Upload guide/guide-YYYYMMDD.tgz and unpack.

    • Add <Directory /var/www/html/mlton.org/guide/YYYYMMDD> DefaultType text/html </Directory> to /etc/apache2/sites-available/mlton.org

    • Restart apache2 service.

Announce release

Misc.

  • dupload Debian package.

  • Generate new Performance numbers.


Last edited on 2010-06-08 14:25:52 by MatthewFluet. mlton-20100608/doc/guide/RemoveUnused0000644000076600000240000000706611404435635016003 0ustar mtfstaff RemoveUnused - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RemoveUnused
Home  Index  
RemoveUnused is an optimization pass for both the SSA and SSA2 IntermediateLanguages, invoked from SSASimplify and SSA2Simplify.

Description

This pass aggressively removes unused:

  • datatypes

  • datatype constructors

  • datatype constructor arguments

  • functions

  • function arguments

  • function returns

  • blocks

  • block arguments

  • statements (variable bindings)

  • handlers from non-tail calls (mayRaise analysis)

  • continuations from non-tail calls (mayReturn analysis)

Implementation

[WWW]remove-unused.sig [WWW]remove-unused.fun [WWW]remove-unused2.sig [WWW]remove-unused2.fun

Details and Notes


Last edited on 2006-11-02 17:51:34 by MatthewFluet. mlton-20100608/doc/guide/Restore0000644000076600000240000000754711404435634015010 0ustar mtfstaff Restore - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Restore
Home  Index  
Restore is a rewrite pass for the SSA and SSA2 IntermediateLanguages, invoked from KnownCase and LocalRef.

Description

This pass restores the SSA condition for a violating SSA or SSA2 program; the program must satisfy:

    Every path from the root to a use of a variable (excluding globals) passes through a def of that variable.

Implementation

[WWW]restore.sig [WWW]restore.fun
[WWW]restore2.sig [WWW]restore2.fun

Details and Notes

Based primarily on Section 19.1 of Modern Compiler Implementation in ML.

The main deviation is the calculation of liveness of the violating variables, which is used to predicate the insertion of phi arguments. This is due to the algorithm's bias towards imperative languages, for which it makes the assumption that all variables are defined in the start block and all variables are "used" at exit.

This is "optimized" for restoration of functions with small numbers of violating variables -- use bool vectors to represent sets of violating variables.

Also, we use a Promise.t to suspend part of the dominance frontier computation.


Last edited on 2010-03-02 15:18:03 by MatthewFluet. mlton-20100608/doc/guide/ReturnStatement0000644000076600000240000002502611404435634016521 0ustar mtfstaff ReturnStatement - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ReturnStatement
Home  Index  
Programmers coming from languages that have a return statement, such as C, Java, and Python, often ask how one can translate functions that return early into SML. This page briefly describes a number of ways to translate uses of return to SML.

Conditional iterator function

A conditional iterator function, such as [WWW]find, [WWW]exists, or [WWW]all is probably what you want in most cases. Unfortunately, it might be the case that the particular conditional iteration pattern that you want isn't provided for your data structure. Usually the best alternative in such a case is to implement the desired iteration pattern as a higher-order function. For example, to implement a find function for arrays (which already [WWW]exists) one could write

fun find predicate array = let
   fun loop i =
       if i = Array.length array then
          NONE
       else if predicate (Array.sub (array, i)) then
          SOME (Array.sub (array, i))
       else
          loop (i+1)
in
   loop 0
end

Of course, this technique, while probably the most common case in practice, applies only if you are essentially iterating over some data structure.

Escape handler

Probably the most direct way to translate code using return statements is to basically implement return using exception handling. The mechanism can be packaged into a reusable module with the signature ([WWW]exit.sig):

(**
 * Signature for exit (or escape) handlers.
 *
 * Note that the implementation necessarily uses exception handling.  This
 * is to make proper resource handling possible.  Exceptions raised by the
 * implementation can be caught by wildcard exception handlers.  Wildcard
 * exception handlers should generally reraise exceptions after performing
 * their effects.
 *)
signature EXIT = sig
   type 'a t
   (** The type of exits. *)

   val within : ('a t, 'a) CPS.t
   (**
    * Sets up an exit and passes it to the given function.  The function
    * may then return normally or by calling {to} with the exit and a
    * return value.  For example,
    *
    *> Exit.within
    *>    (fn l =>
    *>        if condition then
    *>           Exit.to l 1
    *>        else
    *>           2)
    *
    * evaluates either to {1} or to {2} depending on the {condition}.
    *
    * Note that the function receiving the exit is called from a non-tail
    * position.
    *)

   val to : 'a t -> 'a -> 'b
   (**
    * {to l v} returns from the {within} invocation that introduced the
    * exit {l} with the value {v}.  Evaluating {to l v} outside of the
    * {within} invocation that introduced {l} is a programming error and
    * raises an exception.
    *
    * Note that the type variable {'b} only appears as the return type.
    * This means that {to} doesn't return normally to the caller and can
    * be called from a context of any type.
    *)

   val call : ('a -> 'b, 'a) CPS.t
   (**
    * Simpler, but less flexibly typed, interface to {within} and {to}.
    * Specifically, {call f} is equivalent to {within (f o to)}.
    *)
end

( Typing First-Class Continuations in ML discusses the typing of a related construct.) The implementation ([WWW]exit.sml) is straightforward:

structure Exit :> EXIT = struct
   type 'a t = 'a -> exn

   fun within block = let
      exception EscapedExit of 'a
   in
      block EscapedExit
      handle EscapedExit value => value
   end

   fun to exit value = raise exit value

   fun call block = within (block o to)
end

Here is an example of how one could implement a find function given an app function:

fun appToFind (app : ('a -> unit) -> 'b -> unit)
              (predicate : 'a -> bool)
              (data : 'b) =
    Exit.call
       (fn return =>
           (app (fn x =>
                    if predicate x then
                       return (SOME x)
                    else
                       ())
                data
          ; NONE))

In the above, as soon as the expression predicate x evaluates to true the app invocation is terminated.

Continuation-passing Style (CPS)

A general way to implement complex control patterns is to use [WWW]CPS. In CPS, instead of returning normally, functions invoke a function passed as an argument. In general, multiple continuation functions may be passed as arguments and the ordinary return continuation may also be used. As an example, here is a function that finds the leftmost element of a binary tree satisfying a given predicate:

datatype 'a tree = LEAF | BRANCH of 'a tree * 'a * 'a tree

fun find predicate = let
   fun recurse continue =
       fn LEAF =>
          continue ()
        | BRANCH (lhs, elem, rhs) =>
          recurse
             (fn () =>
                 if predicate elem then
                    SOME elem
                 else
                    recurse continue rhs)
             lhs
in
   recurse (fn () => NONE)
end

Note that the above function returns as soon as the leftmost element satisfying the predicate is found.


Last edited on 2007-03-06 06:55:52 by VesaKarvonen. mlton-20100608/doc/guide/RSSA0000644000076600000240000000656311404435634014132 0ustar mtfstaff RSSA - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RSSA
Home  Index  
RSSA is an IntermediateLanguage, translated from SSA2 by ToRSSA, optimized by RSSASimplify, and translated by ToMachine to Machine.

Description

RSSA is a IntermediateLanguage that makes representation decisions explicit.

Implementation

[WWW]rssa.sig [WWW]rssa.fun

Type Checking

The new type language is aimed at expressing bit-level control over layout and associated packing of data representations. There are singleton types that denote constants, other atomic types for things like integers and reals, and arbitrary sum types and sequence (tuple) types. The big change to the type system is that type checking is now based on subtyping, not type equality. So, for example, the singleton type 0xFFFFEEBB whose only inhabitant is the eponymous constant is a subtype of the type Word32.

Details and Notes

SSA is an abbreviation for Static Single Assignment. The RSSA IntermediateLanguage is a variant of SSA.


Last edited on 2006-11-02 17:35:24 by MatthewFluet. mlton-20100608/doc/guide/RSSAShrink0000644000076600000240000000600411404435634015277 0ustar mtfstaff RSSAShrink - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RSSAShrink
Home  Index  
RSSAShrink is an optimization pass for the RSSA IntermediateLanguage.

Description

This pass implements a whole family of compile-time reductions, like:

  • constant folding, copy propagation

  • inline the Goto to a block with a unique predecessor

Implementation

[WWW]shrink.sig [WWW]shrink.fun
[WWW]shrink.sig [WWW]shrink.fun

Details and Notes


Last edited on 2006-11-02 17:48:32 by MatthewFluet. mlton-20100608/doc/guide/RSSASimplify0000644000076600000240000000616211404435634015642 0ustar mtfstaff RSSASimplify - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RSSASimplify
Home  Index  
The optimization passes for the RSSA IntermediateLanguage are collected and controlled by the Backend functor ([WWW]backend.sig,[WWW]backend.fun).

The following optimization pass is implemented:

The following implementation passes are implemented:

The optimization passes can be controlled from the command-line by the options

  • -diag-pass <pass> -- keep diagnostic info for pass

  • -drop-pass <pass> -- omit optimization pass

  • -keep-pass <pass> -- keep the results of pass


Last edited on 2006-11-02 17:52:35 by MatthewFluet. mlton-20100608/doc/guide/RunningOnAIX0000644000076600000240000000366311404435634015637 0ustar mtfstaff RunningOnAIX - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnAIX
Home  Index  
MLton runs fine on AIX.

Also see


Last edited on 2009-06-18 23:07:39 by MatthewFluet. mlton-20100608/doc/guide/RunningOnAlpha0000644000076600000240000000443311404435634016237 0ustar mtfstaff RunningOnAlpha - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnAlpha
Home  Index  
MLton runs fine on the Alpha architecture.

Notes

  • When compiling for Alpha, MLton doesn't support native code generation (-codegen native). Hence, performance is not as good as it might be and compile times are longer. Also, the quality of code generated by gcc is important. By default, MLton calls gcc -O1. You can change this by calling MLton with -cc-opt -O2.

  • When compiling for Alpha, MLton uses -align 8 by default.


Last edited on 2010-06-07 19:32:19 by MatthewFluet. mlton-20100608/doc/guide/RunningOnAMD640000644000076600000240000000500211404435635015757 0ustar mtfstaff RunningOnAMD64 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnAMD64
Home  Index  
MLton runs fine on the AMD64 (x86-64) architecture.

Notes

  • When compiling for AMD64, MLton targets the 64-bit ABI.

  • On AMD64, MLton supports native code generation (-codegen native or -codegen amd64).

  • When compiling for AMD64, MLton uses -align 8 by default. Using -align 4 may be incompatible with optimized builds of the GnuMP library, which assume 8-byte alignment. (See the thread at [WWW]http://mlton.org/pipermail/mlton/2009-October/030674.html for more details.)


Last edited on 2010-05-31 19:56:08 by MatthewFluet. mlton-20100608/doc/guide/RunningOnARM0000644000076600000240000000424511404435634015632 0ustar mtfstaff RunningOnARM - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnARM
Home  Index  
MLton runs fine on the ARM architecture.

Notes

  • When compiling for ARM, MLton doesn't support native code generation (-codegen native). Hence, performance is not as good as it might be and compile times are longer. Also, the quality of code generated by gcc is important. By default, MLton calls gcc -O1. You can change this by calling MLton with -cc-opt -O2.


Last edited on 2010-06-07 20:11:52 by MatthewFluet. mlton-20100608/doc/guide/RunningOnCygwin0000644000076600000240000000636611404435634016461 0ustar mtfstaff RunningOnCygwin - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnCygwin
Home  Index  
MLton runs on the [WWW]Cygwin emulation layer, which provides a Posix-like environment while running on Windows. To run MLton with Cygwin, you must first install Cygwin on your Windows machine. To do this, visit the Cygwin site from your Windows machine and run their setup.exe script. Then, you can unpack the MLton binary tgz in your Cygwin environment.

To run MLton cross-compiled executables on Windows, you must install the Cygwin dll on the Windows machine.

Known issues

  • Time profiling is disabled.

  • Cygwin's mmap emulation is less than perfect. Sometimes it interacts badly with Posix.Process.fork.

  • The [WWW]socket.sml regression test fails. We suspect this is not a bug and is simply due to our test relying on a certain behavior when connecting to a socket that has not yet accepted, which is handled differently on OpenBSD than other platforms. Any help in understanding and resolving this issue is appreciated.

Also see


Last edited on 2010-06-07 21:29:55 by MatthewFluet. mlton-20100608/doc/guide/RunningOnDarwin0000644000076600000240000000704011404435634016433 0ustar mtfstaff RunningOnDarwin - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnDarwin
Home  Index  
MLton runs fine on Darwin (and on Mac OS X).

Notes

  • MLton requires the GnuMP library, which is available via [WWW]Fink or [WWW]MacPorts.

  • For Intel-based Macs, MLton targets the AMD64 architecture on Darwin 10 (Mac OS X Snow Leopard) and higher and targets the x86 architecture on Darwin 8 (Mac OS X Tiger) and Darwin 9 (Mac OS X Leopard).

Known issues

  • ProfilingTime may give inaccurate results on multi-processor machines. The SIGPROF signal, used to sample the profiled program, is supposed to be delivered 100 times a second (i.e., at 10000us intervals), but there can be delays of over 1 minute between the delivery of consecutive SIGPROF signals. A more complete description may be found [WWW]here and [WWW]here.

Also see


Last edited on 2010-05-31 19:56:17 by MatthewFluet. mlton-20100608/doc/guide/RunningOnFreeBSD0000644000076600000240000000621711404435634016426 0ustar mtfstaff RunningOnFreeBSD - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnFreeBSD
Home  Index  
MLton runs fine on [WWW]FreeBSD.

Notes

Known issues

  • Executables often run more slowly than on a comparable Linux machine. We conjecture that part of this is due to costs due to heap resizing and kernel zeroing of pages. Any help in solving the problem would be appreciated.

  • FreeBSD defaults to a datasize limit of 512M, even if you have more than that amount of memory in the computer. Hence, your MLton process will be limited in the amount of memory it has. To fix this problem, turn up the datasize and the default datasize available to a process: Edit /boot/loader.conf to set the limits. For example, the setting

       kern.maxdsiz="671088640"
       kern.dfldsiz="671088640"
       kern.maxssiz="134217728"
    will give a process 640M of datasize memory, default to 640M available and set 128M of stack size memory.


Last edited on 2010-05-31 19:56:20 by MatthewFluet. mlton-20100608/doc/guide/RunningOnHPPA0000644000076600000240000000506211404435635015742 0ustar mtfstaff RunningOnHPPA - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnHPPA
Home  Index  
MLton runs fine on the HPPA architecture.

Notes

  • When compiling for HPPA, MLton targets the 32-bit HPPA architecture.

  • When compiling for HPPA, MLton doesn't support native code generation (-codegen native). Hence, performance is not as good as it might be and compile times are longer. Also, the quality of code generated by gcc is important. By default, MLton calls gcc -O1. You can change this by calling MLton with -cc-opt -O2.

  • When compiling for HPPA, MLton uses -align 8 by default. While this speeds up reals, it also may increase object sizes. If your program does not make significant use of reals, you might see a speedup with -align 4.


Last edited on 2010-05-31 19:56:23 by MatthewFluet. mlton-20100608/doc/guide/RunningOnHPUX0000644000076600000240000000354011404435634015774 0ustar mtfstaff RunningOnHPUX - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnHPUX
Home  Index  
MLton runs fine on HPUX.

Also see


Last edited on 2007-07-08 20:27:02 by MatthewFluet. mlton-20100608/doc/guide/RunningOnIA640000644000076600000240000000504111404435634015651 0ustar mtfstaff RunningOnIA64 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnIA64
Home  Index  
MLton runs fine on the IA64 architecture.

Notes

  • When compiling for IA64, MLton targets the 64-bit ABI.

  • When compiling for IA64, MLton doesn't support native code generation (-codegen native). Hence, performance is not as good as it might be and compile times are longer. Also, the quality of code generated by gcc is important. By default, MLton calls gcc -O1. You can change this by calling MLton with -cc-opt -O2.

  • When compiling for IA64, MLton uses -align 8 by default.

  • On the IA64, the GnuMP library supports multiple ABIs. See the GnuMP page for more details.


Last edited on 2010-05-31 19:56:26 by MatthewFluet. mlton-20100608/doc/guide/RunningOnLinux0000644000076600000240000000331011404435634016302 0ustar mtfstaff RunningOnLinux - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnLinux
Home  Index  
MLton runs fine on Linux.


Last edited on 2007-07-08 20:20:04 by MatthewFluet. mlton-20100608/doc/guide/RunningOnMinGW0000644000076600000240000001422611404435634016174 0ustar mtfstaff RunningOnMinGW - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnMinGW
Home  Index  
MLton runs on [WWW]MinGW, a library for porting Unix applications to Windows. Some library functionality is missing or changed.

Notes

  • To compile MLton on MinGW:

    • The GnuMP library is required.

    • The Bash shell is required. If you are using a prebuilt MSYS, you probably want to symlink bash to sh.

Known issues

  • Many functions are unimplemented and will raise SysErr.

    • MLton.Itimer.set

    • MLton.ProcEnv.setgroups

    • MLton.Process.kill

    • MLton.Process.reap

    • MLton.World.load

    • OS.FileSys.readLink

    • OS.IO.poll

    • OS.Process.terminate

    • Posix.FileSys.chown

    • Posix.FileSys.fchown

    • Posix.FileSys.fpathconf

    • Posix.FileSys.link

    • Posix.FileSys.mkfifo

    • Posix.FileSys.pathconf

    • Posix.FileSys.readlink

    • Posix.FileSys.symlink

    • Posix.IO.dupfd

    • Posix.IO.getfd

    • Posix.IO.getfl

    • Posix.IO.getlk

    • Posix.IO.setfd

    • Posix.IO.setfl

    • Posix.IO.setlkw

    • Posix.IO.setlk

    • Posix.ProcEnv.ctermid

    • Posix.ProcEnv.getegid

    • Posix.ProcEnv.geteuid

    • Posix.ProcEnv.getgid

    • Posix.ProcEnv.getgroups

    • Posix.ProcEnv.getlogin

    • Posix.ProcEnv.getpgrp

    • Posix.ProcEnv.getpid

    • Posix.ProcEnv.getppid

    • Posix.ProcEnv.getuid

    • Posix.ProcEnv.setgid

    • Posix.ProcEnv.setpgid

    • Posix.ProcEnv.setsid

    • Posix.ProcEnv.setuid

    • Posix.ProcEnv.sysconf

    • Posix.ProcEnv.times

    • Posix.ProcEnv.ttyname

    • Posix.Process.exece

    • Posix.Process.execp

    • Posix.Process.exit

    • Posix.Process.fork

    • Posix.Process.kill

    • Posix.Process.pause

    • Posix.Process.waitpid_nh

    • Posix.Process.waitpid

    • Posix.SysDB.getgrgid

    • Posix.SysDB.getgrnam

    • Posix.SysDB.getpwuid

    • Posix.TTY.TC.drain

    • Posix.TTY.TC.flow

    • Posix.TTY.TC.flush

    • Posix.TTY.TC.getattr

    • Posix.TTY.TC.getpgrp

    • Posix.TTY.TC.sendbreak

    • Posix.TTY.TC.setattr

    • Posix.TTY.TC.setpgrp

    • Unix.kill

    • Unix.reap

    • UnixSock.fromAddr

    • UnixSock.toAddr


Last edited on 2010-05-31 19:56:31 by MatthewFluet. mlton-20100608/doc/guide/RunningOnNetBSD0000644000076600000240000001034011404435634016263 0ustar mtfstaff RunningOnNetBSD - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnNetBSD
Home  Index  
MLton runs fine on [WWW]NetBSD.

Installing the correct packages for NetBSD

The NetBSD system installs 3rd party packages by a mechanism known as pkgsrc. This is a tree of Makefiles which when invoked downloads the source code, builds a package and installs it on the system. In order to run MLton on NetBSD, you will have to install several packages for it to work:

  • shells/bash

  • devel/gmp

  • devel/gmake

In order to get graphical call-graphs of profiling information, you will need the additional package

  • graphics/graphviz

To build the documentation for MLton, you need htmldoc.

Tips for compiling and using MLton on NetBSD

MLton can be a memory-hog on computers with little memory. While 640Mb of RAM ought to be enough to self-compile MLton one might want to do some tuning to the NetBSD VM subsystem in order to succeed. The notes presented here is what JesperLouisAndersen uses for compiling MLton on his laptop.

The NetBSD VM subsystem

NetBSD uses a VM subsystem named [WWW]UVM. [WWW]Tuning the VM system can be done via the sysctl(8)-interface with the "VM" MIB set.

Tuning the NetBSD VM subsystem for MLton

MLton uses a lot of anonymous pages when it is running. Thus, we will need to tune up the default of 80 for anonymous pages. Setting

sysctl -w vm.anonmax=95
sysctl -w vm.anonmin=50
sysctl -w vm.filemin=2
sysctl -w vm.execmin=2
sysctl -w vm.filemax=4
sysctl -w vm.execmax=4

makes it less likely for the VM system to swap out anonymous pages. For a full explanation of the above flags, see the documentation.

The result is that my laptop goes from a MLton compile where it swaps a lot to a MLton compile with no swapping.


Last edited on 2006-07-20 19:36:43 by StephenWeeks. mlton-20100608/doc/guide/RunningOnOpenBSD0000644000076600000240000000463711404435634016452 0ustar mtfstaff RunningOnOpenBSD - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnOpenBSD
Home  Index  
MLton runs fine on [WWW]OpenBSD.

Known issues

  • The [WWW]socket.sml regression test fails. We suspect this is not a bug and is simply due to our test relying on a certain behavior when connecting to a socket that has not yet accepted, which is handled differently on OpenBSD than other platforms. Any help in understanding and resolving this issue is appreciated.


Last edited on 2010-06-07 21:30:30 by MatthewFluet. mlton-20100608/doc/guide/RunningOnPowerPC0000644000076600000240000000472611404435634016536 0ustar mtfstaff RunningOnPowerPC - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnPowerPC
Home  Index  
MLton runs fine on the PowerPC architecture.

Notes

  • When compiling for PowerPC, MLton targets the 32-bit PowerPC architecture.

  • When compiling for PowerPC, MLton doesn't support native code generation (-codegen native). Hence, performance is not as good as it might be and compile times are longer. Also, the quality of code generated by gcc is important. By default, MLton calls gcc -O1. You can change this by calling MLton with -cc-opt -O2.

  • On the PowerPC, the GnuMP library supports multiple ABIs. See the GnuMP page for more details.


Last edited on 2010-05-31 19:56:34 by MatthewFluet. mlton-20100608/doc/guide/RunningOnPowerPC640000644000076600000240000000474211404435634016706 0ustar mtfstaff RunningOnPowerPC64 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnPowerPC64
Home  Index  
MLton runs fine on the PowerPC64 architecture.

Notes

  • When compiling for PowerPC64, MLton targets the 64-bit PowerPC architecture.

  • When compiling for PowerPC64, MLton doesn't support native code generation (-codegen native). Hence, performance is not as good as it might be and compile times are longer. Also, the quality of code generated by gcc is important. By default, MLton calls gcc -O1. You can change this by calling MLton with -cc-opt -O2.

  • On the PowerPC64, the GnuMP library supports multiple ABIs. See the GnuMP page for more details.


Last edited on 2010-05-31 19:56:37 by MatthewFluet. mlton-20100608/doc/guide/RunningOnS3900000644000076600000240000000425111404435635015647 0ustar mtfstaff RunningOnS390 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnS390
Home  Index  
MLton runs fine on the S390 architecture.

Notes

  • When compiling for S390, MLton doesn't support native code generation (-codegen native). Hence, performance is not as good as it might be and compile times are longer. Also, the quality of code generated by gcc is important. By default, MLton calls gcc -O1. You can change this by calling MLton with -cc-opt -O2.


Last edited on 2010-06-07 20:12:23 by MatthewFluet. mlton-20100608/doc/guide/RunningOnSolaris0000644000076600000240000000560511404435634016630 0ustar mtfstaff RunningOnSolaris - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnSolaris
Home  Index  
MLton runs fine on Solaris.

Notes

  • You must install the binutils, gcc, and make packages. You can find out how to get these at [WWW]sunfreeware.com.

  • Making the documentation requires that you install latex and dvips, which are available in the tetex package.

Known issues

  • Bootstrapping on the Sparc architecture is so slow as to be impractical (many hours on a 500MHz UltraSparc). For this reason, we strongly recommend building with a cross compiler.

Also see


Last edited on 2010-06-01 01:02:46 by MatthewFluet. mlton-20100608/doc/guide/RunningOnSparc0000644000076600000240000000641511404435634016264 0ustar mtfstaff RunningOnSparc - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnSparc
Home  Index  
MLton runs fine on the Sparc architecture.

Notes

  • When compiling for Sparc, MLton targets the 32-bit Sparc architecture (i.e., Sparc V8).

  • When compiling for Sparc, MLton doesn't support native code generation (-codegen native). Hence, performance is not as good as it might be and compile times are longer. Also, the quality of code generated by gcc is important. By default, MLton calls gcc -O1. You can change this by calling MLton with -cc-opt -O2. We have seen this speed up some programs by as much as 30%, especially those involving floating point; however, it can also more than double compile times.

  • When compiling for Sparc, MLton uses -align 8 by default. While this speeds up reals, it also may increase object sizes. If your program does not make significant use of reals, you might see a speedup with -align 4.

Known issues

  • Bootstrapping on the Sparc architecture is so slow as to be impractical (many hours on a 500MHz UltraSparc). For this reason, we strongly recommend building with a cross compiler.

Also see


Last edited on 2010-06-01 01:02:32 by MatthewFluet. mlton-20100608/doc/guide/RunningOnX860000644000076600000240000000363511404435635015603 0ustar mtfstaff RunningOnX86 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunningOnX86
Home  Index  
MLton runs fine on the x86 architecture.

Notes

  • On x86, MLton supports native code generation (-codegen native or -codegen x86).


Last edited on 2010-05-31 19:56:47 by MatthewFluet. mlton-20100608/doc/guide/RunTimeOptions0000644000076600000240000001305411404435634016312 0ustar mtfstaff RunTimeOptions - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION RunTimeOptions
Home  Index  
Executables produced by MLton take command line arguments that control the runtime system. These arguments are optional, and occur before the executable's usual arguments. To use these options, the first argument to the executable must be @MLton. The optional arguments then follow, must be terminated by --, and are followed by any arguments to the program. The optional arguments are not made available to the SML program via CommandLine.arguments. For example, a valid call to hello-world is:
hello-world @MLton gc-summary fixed-heap 10k -- a b c
In the above example, CommandLine.arguments () = ["a", "b", "c"].

It is allowed to have a sequence of @MLton arguments, as in:

hello-world @MLton gc-summary -- @MLton fixed-heap 10k -- a b c

Run-time options can also control MLton, as in

mlton @MLton fixed-heap 0.5g -- foo.sml

Options

  • fixed-heap x{k|K|m|M|g|G}
    Use a fixed size heap of size x, where x is a real number and the trailing letter indicates its units.

    k or K 1024
    m or M 1,048,576
    g or G 1,073,741,824
    A value of 0 means to use almost all the RAM present on the machine.

    The heap size used by fixed-heap includes all memory allocated by SML code, including memory for the stack (or stacks, if there are multiple threads). It does not, however, include any memory used for code itself or memory used by C globals, the C stack, or malloc.

  • gc-messages
    Print a message at the start and end of every garbage collection.

  • gc-summary
    Print a summary of garbage collection statistics upon program termination.

  • load-world world
    Restart the computation with the file specified by world, which must have been created by a call to MLton.World.save by the same executable. See MLtonWorld.

  • max-heap x{k|K|m|M|g|G}
    Run the computation with an automatically resized heap that is never larger than x, where x is a real number and the trailing letter indicates the units as with fixed-heap. The heap size for max-heap is accounted for as with fixed-heap.

  • may-page-heap {false|true}
    Enable paging the heap to disk when unable to grow the heap to a desired size.

  • no-load-world
    Disable load-world. This can be used as an argument to the compiler via -runtime no-load-world to create executables that will not load a world. This may be useful to ensure that set-uid executables do not load some strange world.

  • ram-slop x
    Multiply x by the amount of RAM on the machine to obtain what the runtime views as the amount of RAM it can use. Typically x is less than 1, and is used to account for space used by other programs running on the same machine.

  • stop
    Causes the runtime to stop processing @MLton arguments once the next -- is reached. This can be used as an argument to the compiler via -runtime stop to create executables that don't process any @MLton arguments.


Last edited on 2007-12-15 05:18:52 by MatthewFluet. mlton-20100608/doc/guide/ScopeInference0000644000076600000240000000743211404435634016246 0ustar mtfstaff ScopeInference - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ScopeInference
Home  Index  
Scope inference is an analysis/rewrite pass for the AST IntermediateLanguage, invoked from Elaborate.

Description

This pass adds free type variables to the val or fun declaration where they are implicitly scoped.

Implementation

[WWW]scope.sig [WWW]scope.fun

Details and Notes

Scope inference determines for each type variable, the declaration where it is bound. Scope inference is a direct implementation of the specification given in section 4.6 of the Definition. Recall that a free occurrence of a type variable 'a in a declaration d is unguarded in d if 'a is not part of a smaller declaration. A type variable 'a is implicitly scoped at d if 'a is unguarded in d and 'a does not occur unguarded in any declaration containing d.

The first pass of scope inference walks down the tree and renames all explicitly bound type variables in order to avoid name collisions. It then walks up the tree and adds to each declaration the set of unguarded type variables occurring in that declaration. At this point, if declaration d contains an unguarded type variable 'a and the immediately containing declaration does not contain 'a, then 'a is implicitly scoped at d. The final pass walks down the tree leaving a 'a at the a declaration where it is scoped and removing it from all enclosed declarations.


Last edited on 2006-11-02 17:55:41 by MatthewFluet. mlton-20100608/doc/guide/screen.css0000644000076600000240000000656311404435634015430 0ustar mtfstaff/* screen.css - MoinMoin Default Styles Copyright (c) 2001, 2002, 2003 by Jürgen Hermann */ /* content styles */ a.mltona:link { color: darkblue; text-decoration: none; } a.mltona:visited { color: darkblue; text-decoration: none; } a.entaina:link { color: #888888; text-decoration: none; } a.entaina:visited { color: #888888; text-decoration: none; } a.sweeksa:link { color: darkblue; text-decoration: none; } a.sweeksa:visited { color: darkblue; text-decoration: none; } a.nonexistent, a.badinterwiki { background-color: inherit; color: #404040; } pre { border: 1px solid #CBCBCB; background-color: #FFF8ED; color: black; } hr { clear: both; border-style: none; background-color: #CBCBCB; color: #CBCBCB; } table { border: 2px; border-spacing: 0px; border-style: ridge; } table.title { background-color: lightblue; width: 100%; } td { border: 1px; border-style: ridge; padding: 5px; } .footnotes div { width: 5em; border-top: 1px solid #CBCBCB; } /* user interface styles */ h1 { padding: .2em 1em; } #logo { float: left; margin: 0 .5em; } *[dir="rtl"] #logo { float: right; } #username { float: right; margin: 1em .3em; text-align: right; } *[dir="rtl"] #username { float: left; } #navibar { clear: left; } *[dir="rtl"] #navibar { clear: right; } #pagetrail { clear: left; } *[dir="rtl"] #pagetrail { clear: right; } #navibar, #pagetrail, #iconbar { margin: .5em 0; padding: 0; } #navibar a, #pagetrail a { text-decoration: none; } #navibar li, #pagetrail li, #iconbar li { display: inline; padding: 0 2px; margin: 0; } #navibar li { border: 3px solid #CBCBCB; background-color: #E5E5E5; color: black; line-height: 2em; } #pagetrail li span { border: 1px solid #EEEECC; background-color: #FFFFDD; color: black; } #pagetrail li:before { content: "» "; } *[dir="rtl"] #pagetrail li:before { content: " «"; } #pagetrail li:first-child:before { content: ""; } #iconbar { clear: both; float: right; text-align: right; width: 30%; white-space: nowrap; } *[dir="rtl"] #iconbar { float: left; text-align: left; } #message, #footer { clear: both; border: 1px solid #CBCBCB; background-color: #E5E5E5; color: black; margin: .5em 0; padding: .5em; } #footer p, #footer form { margin: 0; } #credits { float: right; text-align: right; max-width: 30%; } *[dir="rtl"] #credits { float: left; text-align: left; } #timings { padding: 0; font-size: 0.8em; } #timings li { display: inline; background-color: #E5E5E5; color: black; } #preview { border: 2px solid #CBCBCB; padding: .5em; background: url(../img/draft.png); } /* .recentchanges table { width: 100%; } */ #pageinfo td, .recentchanges td { padding: 0 .3em; } .rcdaybreak td { background-color: #CCCCFF; padding: .2em; } .rcicon1, .rcicon2 { text-align: center; } .rcpagelink { width: 33%; } .rctime { font-size: .9em; color: #4D4D4D; } .rceditor { color: green; } .rccomment { color: red; width: 66%; } .rcrss { float: right; } .recentchanges[dir="rtl"] .rcrss { float: left; } .diff { width:99%; } .diff-title { background-color: #C0C0C0; } .diff-added { background-color: #E0FFE0; vertical-align: sub; } .diff-removed { background-color: #FFFFE0; vertical-align: sub; } .diff-added span { background-color: #80FF80; } .diff-removed span { background-color: #FFFF80; } .searchresult dd span { font-weight: bold; } mlton-20100608/doc/guide/SelfCompiling0000644000076600000240000001467211404435634016115 0ustar mtfstaff SelfCompiling - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SelfCompiling
Home  Index  
If you want to compile MLton, you must first get the Sources. You can compile with either MLton or SML/NJ, but we strongly recommend using MLton, since it generates a much faster and more robust executable.

Compiling with MLton

To compile with MLton, you need the binary versions of mlton, mllex, and mlyacc that come with the MLton binary package. To be safe, you should use the same version of MLton that you are building. However, older versions may work, as long as they don't go back too far. To build MLton, run make from within the root directory of the sources. This will build MLton first with the already installed binary version of MLton and will then rebuild MLton with itself.

First, the Makefile calls mllex and mlyacc to build the lexer and parser, and then calls mlton to compile itself. When making MLton using another version the Makefile automatically uses mlton-stubs.cm, which will put in enough stubs to emulate the MLton structure. Once MLton is built, the Makefile will rebuild MLton with itself, this time using mlton.cm and the real MLton structure from the Basis Library. This second round of compilation is essential in order to achieve a fast and robust MLton.

Compiling MLton requires at least 512M of actual RAM, and 1G is preferable. If your machine has less than 512M, self-compilation will likely fail, or at least take a very long time due to paging. Even if you have enough memory, there simply may not be enough available, due to memory consumed by other processes. In this case, you may see an Out of memory message, or self-compilation may become extremely slow. The only fix is to make sure that enough memory is available.

Possible Errors

  • If you have errors running latex, you can skip building the documentation by using make all-no-docs.

  • The C compiler may not be able to find the GnuMP header file, gmp.h leading to an error like the following.

     platform/darwin.h:26:36: /usr/local/include/gmp.h: No such file or directory
    The solution is to install (or build) the GnuMP on your machine. If you install it at a different location, put the new path in runtime/platform/<os>.h.

  • The following error indicates that a binary version of MLton could not be found in your path.

    .../upgrade-basis: mlton: command not found
    Error: cannot upgrade basis because the compiler doesn't work
    make[3]: *** [upgrade-basis.sml] Error 1
    
    You need to have mlton in your path to build MLton from source.

    During the build process, there are various times that the Makefiles look for a mlton in your path and in src/build/bin. It is OK if the latter doesn't exist when the build starts; it is the target being built. While not finding build/bin/mlton also results in mlton: command not found error messages, such errors are benign and will not abort the build. Failure to find a mlton in your path will abort the build.

  • Mac OS X executables do not seem to like static libraries to have a different path location at runtime compared to when the executable was built. For example, the binary package for Mac OS X unpacks to /usr. If you try to install it in /usr/local you may get the following errors:

    /usr/bin/ld: table of contents for archive:
    /usr/local/lib/mlton/self/libmlton.a is out of date;
    rerun ranlib(1) (can't load from it)
    
    Although running ranlib seems like the right thing to do, it doesn't actually resolve the problem. Best bet is to install in /usr and then either live with this location, or build MLton yourself and install in /usr/local.

Compiling with SML/NJ

To compile with SML/NJ, run make nj-mlton from within the root directory of the sources. You must use a recent version of SML/NJ. First, the Makefile calls mllex and mlyacc to build the lexer and parser. Then, it calls SML/NJ with the appropriate sources.cm file. Building with SML/NJ takes some time (roughly 10 minutes on a 1.6GHz machine). Unless you are doing compiler development and need rapid recompilation, we recommend compiling with MLton.


Last edited on 2005-12-02 01:44:46 by StephenWeeks. mlton-20100608/doc/guide/Serialization0000644000076600000240000000474311404435635016176 0ustar mtfstaff Serialization - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Serialization
Home  Index  
Standard ML does not have built-in support for serialization. Here are papers that describe user-level approaches:

The MLton repository also contains an experimental generic programming library (see [WWW]README) that includes a pickling (serialization) generic (see [WWW]pickle.sig).


Last edited on 2007-08-26 01:29:29 by VesaKarvonen. mlton-20100608/doc/guide/ShowBasis0000644000076600000240000001377411404435634015266 0ustar mtfstaff ShowBasis - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ShowBasis
Home  Index  
MLton has a flag, -show-basis  file, that causes MLton to pretty print to file the basis defined by the input program. For example, if foo.sml contains
fun f x = x + 1

then mlton -show-basis foo.basis foo.sml will create foo.basis with the following contents.

val f: int -> int
If you only want to see the basis and do not wish to compile the program, you can call MLton with -stop tc.

Displaying signatures

When displaying signatures, MLton prefixes types defined in the signature them with ?. to distinguish them from types defined in the environment. For example,

signature SIG =
   sig
      type t
      val x: t * int -> unit
   end
is displayed as
signature SIG = 
   sig
      type t = ?.t
      val x: (?.t * int) -> unit
   end
Notice that int occurs without the ?. prefix.

MLton also uses a canonical name for each type in the signature, and that name is used everywhere for that type, no matter what the input signature looked like. For example:

signature SIG =
   sig
      type t
      type u = t
      val x: t
      val y: u
   end
is displayed as
signature SIG = 
   sig
      type t = ?.t
      type u = ?.t
      val x: ?.t
      val y: ?.t
   end

Canonical names are always relative to the "top" of the signature, even when used in nested substructures. For example:

signature S =
   sig
      type t
      val w: t
      structure U:
         sig
            type u
            val x: t
            val y: u
         end
      val z: U.u
   end
is displayed as
signature S = 
   sig
      type t = ?.t
      val w: ?.t
      val z: ?.U.u
      structure U:
         sig
            type u = ?.U.u
            val x: ?.t
            val y: ?.U.u
         end
   end

Displaying structures

When displaying structures, MLton uses signature constraints wherever possible, combined with where type clauses to specify the meanings of the types defined within the signature.

signature SIG =
   sig
      type t
      val x: t
   end
structure S: SIG =
   struct
      type t = int
      val x = 13
   end
structure S2:> SIG = S

is displayed as

structure S: SIG
             where type t = int
structure S2: SIG
              where type t = S2.t
signature SIG = 
   sig
      type t = ?.t
      val x: ?.t
   end


Last edited on 2005-12-02 01:48:03 by StephenWeeks. mlton-20100608/doc/guide/ShowProf0000644000076600000240000000621711404435634015125 0ustar mtfstaff ShowProf - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ShowProf
Home  Index  
If an executable is compiled for profiling, then it accepts a special command-line runtime system argument, show-prof, that outputs information about the source functions that are profiled. Normally, this information is used by mlprof. This page documents the show-prof output format, and is intended for those working on the profiler internals.

The show-prof output is ASCII, and consists of a sequence of lines.

  • The magic number of the executable.

  • The number of source names in the executable.

  • A line for each source name giving the name of the function, a tab, the filename of the file containing the function, a colon, a space, and the line number that the function starts on in that file.

  • The number of (split) source functions.

  • A line for each (split) source function, where each line consists of a source-name index (into the array of source names) and a successors index (into the array of split-source sequences, defined below).

  • The number of split-source sequences.

  • A line for each split-source sequence, where each line is a space separated list of (split) source functions.

The latter two arrays, split sources and split-source sequences, define a directed graph, which is the call-graph of the program.


Last edited on 2006-10-23 23:29:54 by StephenWeeks. mlton-20100608/doc/guide/Shrink0000644000076600000240000001051011404435634014603 0ustar mtfstaff Shrink - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Shrink
Home  Index  
Shrink is a rewrite pass for the SSA and SSA2 IntermediateLanguages, invoked from every optimization pass (see SSASimplify and SSA2Simplify).

Description

This pass implements a whole family of compile-time reductions, like:

  • #1(a, b) --> a

  • case C x of C y => e  --> let y = x in e

  • constant folding, copy propagation

  • eta blocks

  • tuple reconstruction elimination

Implementation

[WWW]shrink.sig [WWW]shrink.fun
[WWW]shrink2.sig [WWW]shrink2.fun

Details and Notes

The Shrink pass is run after every SSA and SSA2 optimization pass.

The Shrink implementation also includes functions to eliminate unreachable blocks from a SSA or SSA2 program or function. The Shrink pass does not guarantee to eliminate all unreachable blocks. Doing so would unduly complicate the implementation, and it is almost always the case that all unreachable blocks are eliminated. However, a small number of optimization passes require that the input have no unreachable blocks (essentially, when the analysis works on the control flow graph and the rewrite iterates on the vector of blocks). These passes explicitly call eliminateDeadBlocks.

The Shrink pass has a special case to turn a non-tail call where the continuation and handler only do Profile statements into a tail call where the Profile statements precede the tail call.


Last edited on 2006-11-02 17:52:51 by MatthewFluet. mlton-20100608/doc/guide/SimplifyTypes0000644000076600000240000001263111404435634016174 0ustar mtfstaff SimplifyTypes - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SimplifyTypes
Home  Index  
SimplifyTypes is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass computes a "cardinality" of each datatype, which is an abstraction of the number of values of the datatype.

  • Zero means the datatype has no values (except for bottom).

  • One means the datatype has one value (except for bottom).

  • Many means the datatype has many values.

This pass removes all datatypes whose cardinality is Zero or One and removes:

  • components of tuples

  • function args

  • constructor args

which are such datatypes.

This pass marks constructors as one of:

  • Useless: it never appears in a ConApp.

  • Transparent: it is the only variant in its datatype and its argument type does not contain any uses of array or vector.

  • Useful: otherwise

This pass also removes Useless and Transparent constructors.

Implementation

[WWW]simplify-types.sig [WWW]simplify-types.fun

Details and Notes

This pass must happen before polymorphic equality is implemented because

  1. it will make polymorphic equality faster because some types are simpler

  2. it removes uses of polymorphic equality that must return true

We must keep track of Transparent constructors whose argument type uses array because of datatypes like the following:

  datatype t = T of t array
Such a datatype has Cardinality.Many, but we cannot eliminate the datatype and replace the lhs by the rhs, i.e. we must keep the circularity around.

Must do similar things for vectors.

Also, to eliminate as many Transparent constructors as possible, for something like the following,

  datatype t = T of u array
       and u = U of t vector
we (arbitrarily) expand one of the datatypes first. The result will be something like
  datatype u = U of u array array
where all uses of t are replaced by u array.


Last edited on 2009-12-11 14:54:29 by MatthewFluet. mlton-20100608/doc/guide/SMLNET0000644000076600000240000000410111404435634014346 0ustar mtfstaff SMLNET - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SMLNET
Home  Index  
[WWW]SML.NET is a Standard ML Compiler that targets the .NET Common Language Runtime.

SML.NET is based on the MLj compiler.

BentonEtAl04 describes SML.NET.


Last edited on 2004-12-30 20:11:30 by StephenWeeks. mlton-20100608/doc/guide/SMLNJ0000644000076600000240000000476411404435634014246 0ustar mtfstaff SMLNJ - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SMLNJ
Home  Index  
[WWW]SML/NJ is a Standard ML Compiler. It is a native code compiler that runs on a variety of platforms and has a number of libraries and tools.

We maintain a list of SML/NJ's deviations from The Definition of Standard ML.

MLton has support for some features of SML/NJ in order to ease porting between MLton and SML/NJ.


Last edited on 2007-08-15 22:07:16 by MatthewFluet. mlton-20100608/doc/guide/SMLNJDeviations0000644000076600000240000005065411404435634016273 0ustar mtfstaff SMLNJDeviations - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SMLNJDeviations
Home  Index  
Here are some deviations of SML/NJ from The Definition of Standard ML. Some of these are documented in the [WWW]SML '97 Conversion Guide. Since MLton does not deviate from the Definition, you should look here if you are having trouble porting a program from MLton to SML/NJ or vice versa. If you discover other deviations of SML/NJ that aren't listed here, please send mail to [MAILTO]MLton@mlton.org.
  • SML/NJ allows spaces in long identifiers, as in S . x. Section 2.5 of the Definition implies that S . x should be treated as three separate lexical items.

  • SML/NJ allows op to appear in val specifications:

    signature FOO = sig
       val op + : int * int -> int
    end
    
    The grammar on page 14 of the Definition does not allow it. Recent versions of SML/NJ do give a warning.

  • SML/NJ rejects

    (op *)
    
    as an unmatched close comment.

  • SML/NJ allows = to be rebound by the declaration:

    val op = = 13
    
    This is explicitly forbidden on page 5 of the Definition. Recent versions of SML/NJ do give a warning.

  • SML/NJ allows rebinding true, false, nil, ::, and ref by the declarations:

    fun true () = ()
    fun false () = ()
    fun nil () = ()
    fun op :: () = ()
    fun ref () = ()
    
    This is explicitly forbidden on page 9 of the Definition.

  • SML/NJ extends the syntax of the language to allow vector expressions and patterns like the following:

    val v = #[1,2,3]
    val #[x,y,z] = v
    

  • SML/NJ extends the syntax of the language to allow or patterns like the following:

    datatype foo = Foo of int | Bar of int
    val (Foo x | Bar x) = Foo 13
    

  • SML/NJ allows higher-order functors, that is, functors can be components of structures and can be passed as functor arguments and returned as functor results. As a consequence, SML/NJ allows abbreviated functor definitions, as in the following:

    signature S =
      sig
        type t
        val x: t
      end
    functor F (structure A: S): S = 
      struct
        type t = A.t * A.t
        val x = (A.x, A.x)
      end
    functor G = F
    

  • SML/NJ extends the syntax of the language to allow functor and signature definitions to occur within the scope of local and structure declarations.

  • SML/NJ allows duplicate type specifications in signatures when the duplicates are introduced by include, as in the following:

    signature SIG1 =
       sig
          type t
          type u
       end
    signature SIG2 =
       sig
          type t
          type v
       end
    signature SIG =
       sig
          include SIG1
          include SIG2
       end
    
    This is disallowed by rule 77 of the Definition.

  • SML/NJ allows sharing constraints between type abbreviations in signatures, as in the following:

    signature SIG =
       sig
          type t = int * int
          type u = int * int
          sharing type t = u
       end
    
    These are disallowed by rule 78 of the Definition. Recent versions of SML/NJ correctly disallow sharing constraints between type abbreviations in signatures.

  • SML/NJ disallows multiple where type specifications of the same type name, as in the following

    signature S =
      sig
         type t
         type u = t
      end
      where type u = int
    
    This is allowed by rule 84 of the Definition.

  • SML/NJ allows and in sharing specs in signatures, as in

    signature S =
       sig
          type t
          type u
          type v
          sharing type t = u
          and type u = v
       end
    

  • SML/NJ does not expand the withtype derived form as described by the Definition. According to page 55 of the Definition, the type bindings of a withtype declaration are substituted simultaneously in the connected datatype. Consider the following program.

    type u = real ;
    datatype a =
        A of t
      | B of u
    withtype u = int
    and t = u
    
    According to the Definition, it should be expanded to the following.
    type u = real ;
    datatype a =
        A of u
      | B of int ;
    type u = int
    and t = u 
    
    However, SML/NJ expands withtype bindings sequentially, meaning that earlier bindings are expanded within later ones. Hence, the above program is expanded to the following.
    type u = real ;
    datatype a =
        A of int
      | B of int ;
    type u = int
    type t = int
    

  • SML/NJ allows withtype specifications in signatures.

  • SML/NJ allows a where structure specification that is similar to a where type specification. For example:

    structure S = struct type t = int end
    signature SIG =
      sig
         structure T : sig type t end
      end where T = S
    
    This is equivalent to:
    structure S = struct type t = int end
    signature SIG =
      sig
         structure T : sig type t end
      end where type T.t = S.t
    
    SML/NJ also allows a definitional structure specification that is similar to a definitional type specification. For example:
    structure S = struct type t = int end
    signature SIG =
      sig
         structure T : sig type t end = S
      end
    
    This is equivalent to the previous examples and to:
    structure S = struct type t = int end
    signature SIG =
      sig
         structure T : sig type t end where type t = S.t
      end
    

  • SML/NJ disallows binding non-datatypes with datatype replication. For example, it rejects the following program that should be allowed according to the Definition.

    type ('a, 'b) t = 'a * 'b
    datatype u = datatype t
    
    This idiom can be useful when one wants to rename a type without rewriting all the type arguments. For example, the above would have to be written in SML/NJ as follows.
    type ('a, 'b) t = 'a * 'b
    type ('a, 'b) u = ('a, 'b) t
    

  • SML/NJ disallows sharing a structure with one of its substructures. For example, SML/NJ disallows the following.

    signature SIG =
       sig
          structure S:
             sig
                type t
                structure T: sig type t end
             end
          sharing S = S.T
       end
    
    This signature is allowed by the Definition.

  • SML/NJ disallows polymorphic generalization of refutable patterns. For example, SML/NJ disallows the following.

    val [x] = [[]]
    val _ = (1 :: x, "one" :: x)
    
    Recent versions of SML/NJ correctly allow polymorphic generalization of refutable patterns.

  • SML/NJ uses an overly restrictive context for type inference. For example, SML/NJ rejects both of the following.

    structure S =
    struct
      val z = (fn x => x) []
      val y = z :: [true] :: nil
    end
    
    structure S : sig val z : bool list end =
    struct
      val z = (fn x => x) []
    end
    
    These structures are allowed by the Definition.

Deviations from the Basis Library Specification

Here are some deviations of SML/NJ from the Basis Library Specification.

  • SML/NJ exposes the equality of the vector type in structures such as Word8Vector that abstractly match MONO_VECTOR, which says type vector, not eqtype vector. So, for example, SML/NJ accepts the following program:

    fun f (v: Word8Vector.vector) = v = v
    

  • SML/NJ exposes the equality property of the type status in OS.Process. This means that programs which directly compare two values of type status will work with SML/NJ but not MLton.

  • Under SML/NJ on Windows, OS.Path.validVolume incorrectly considers absolute empty volumes to be valid. In other words, when the expression

    OS.Path.validVolume { isAbs = true, vol = "" }
    
    is evaluated by SML/NJ on Windows, the result is true. MLton, on the other hand, correctly follows the Basis Library Specification, which states that on Windows, OS.Path.validVolume should return false whenever isAbs = true and vol = "".

    This incorrect behavior causes other OS.Path functions to behave differently. For example, when the expression
    OS.Path.toString (OS.Path.fromString "\\usr\\local")
    

    is evaluated by SML/NJ on Windows, the result is "\\usr\\local", whereas under MLton on Windows, evaluating this expression (correctly) causes an OS.Path.Path exception to be raised.


Last edited on 2010-05-20 18:27:00 by MatthewFluet. mlton-20100608/doc/guide/SMLNJLibrary0000644000076600000240000001562011404435635015565 0ustar mtfstaff SMLNJLibrary - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SMLNJLibrary
Home  Index  
The [WWW]SML/NJ Library is a collection of libraries that are distributed with SML/NJ. Due to differences between SML/NJ and MLton, these libraries will not work out-of-the box with MLton.

As of 20100402, MLton includes a port of the SML/NJ Library synchronized with SML/NJ version 110.72.

Usage

  • You can import a sub-library of the SML/NJ Library into an MLB file with:

    MLB file Description
    $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb Various utility modules, included collections, simple formating, ...
    $(SML_LIB)/smlnj-lib/Controls/controls-lib.mlb A library for managing control flags in an application.
    $(SML_LIB)/smlnj-lib/HashCons/hash-cons-lib.mlb Support for implementing hash-consed data structures.
    $(SML_LIB)/smlnj-lib/HTML/html-lib.mlb HTML parsing and pretty-printing library.
    $(SML_LIB)/smlnj-lib/INet/inet-lib.mlb Networking utilities; supported on both Unix and Windows systems.
    $(SML_LIB)/smlnj-lib/PP/pp-lib.mlb Pretty-printing library.
    $(SML_LIB)/smlnj-lib/Reactive/reactive-lib.mlb Reactive scripting library.
    $(SML_LIB)/smlnj-lib/RegExp/regexp-lib.mlb Regular expression library.
    $(SML_LIB)/smlnj-lib/Unix/unix-lib.mlb Utilities for Unix-based operating systems.
  • If you are porting a project from SML/NJ's CompilationManager to MLton's ML Basis system using cm2mlb, note that the following maps are included by default:

    $smlnj-lib.cm       $(SML_LIB)/smlnj-lib/Util
    $controls-lib.cm    $(SML_LIB)/smlnj-lib/Controls
    $hash-cons-lib.cm   $(SML_LIB)/smlnj-lib/HashCons
    $html-lib.cm        $(SML_LIB)/smlnj-lib/HTML
    $inet-lib.cm        $(SML_LIB)/smlnj-lib/INet
    $pp-lib.cm          $(SML_LIB)/smlnj-lib/PP
    $reactive-lib.cm    $(SML_LIB)/smlnj-lib/Reactive
    $regexp-lib.cm      $(SML_LIB)/smlnj-lib/RegExp
    $unix-lib.cm        $(SML_LIB)/smlnj-lib/Unix
    
    This will automatically convert a $/smlnj-lib.cm import in an input .cm file into a $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb import in the output .mlb file.

Details

The following changes were made to the SML/NJ Library, in addition to deriving the .mlb files from the .cm files:

  • Util/redblack-set-fn.sml (modified): Rewrote use of where structure specification.

  • Util/redblack-map-fn.sml (modified): Rewrote use of where structure specification.

  • Util/graph-scc-fn.sml (modified): Rewrote use of where structure specification.

  • Util/bit-array.sml (modified): The computation of the maxLen is given by:

    val maxLen = 8*Word8Array.maxLen
    
    This is fine in SML/NJ where Word8Array.maxLen is 16777215, but in MLton, Word8Array.maxLen is equal to valOf(Int.maxInt), so the computation overflows. To accommodate both SML/NJ and MLton, the computation is replaced by
    val maxLen = (8*Word8Array.maxLen) handle Overflow => Word8Array.maxLen
    

  • Util/engine.mlton.sml (added, not exported): Implements structure Engine, providing time-limited, resumable computations using MLtonThread, MLtonSignal, and MLtonItimer.

  • Util/time-limit.mlton.sml (added): Implements structure TimeLimit using structure Engine. The SML/NJ implementation of structure TimeLimit uses SML/NJ's first-class continuations, signals, and interval timer.

  • Util/time-limit.mlb (added): Exports structure TimeLimit, which is not exported by smlnj-lib.mlb. Since MLton is very conservative in the presence of threads and signals, program performance may be adversely affected by unnecessarily including structure TimeLimit.

  • HTML/html-elements-fn.sml (modified): Rewrote use of or-patterns.

  • HTML/html-attrs-fn.sml (modified): Rewrote use of or-patterns.

Patch


Last edited on 2010-06-08 14:42:48 by MatthewFluet. mlton-20100608/doc/guide/SMLofNJStructure0000644000076600000240000001260111404435634016501 0ustar mtfstaff SMLofNJStructure - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SMLofNJStructure
Home  Index  
signature SML_OF_NJ =
   sig
      structure Cont:
         sig
            type 'a cont
            val callcc: ('a cont -> 'a) -> 'a
            val isolate: ('a -> unit) -> 'a cont
            val throw: 'a cont -> 'a -> 'b
         end
      structure SysInfo:
         sig
            exception UNKNOWN
            datatype os_kind = BEOS | MACOS | OS2 | UNIX | WIN32

            val getHostArch: unit -> string
            val getOSKind: unit -> os_kind
            val getOSName: unit -> string
         end

      val exnHistory: exn -> string list
      val exportFn: string * (string * string list -> OS.Process.status) -> unit
      val exportML: string -> bool
      val getAllArgs: unit -> string list
      val getArgs: unit -> string list
      val getCmdName: unit -> string
   end

SMLofNJ implements a subset of the structure of the same name provided in Standard ML of New Jersey. It is included to make it easier to port programs between the two systems. The semantics of these functions may be different than in SML/NJ.

  • structure Cont
    implements continuations.

  • SysInfo.getHostArch ()
    returns the string for the architecture.

  • SysInfo.getOSKind
    returns the OS kind.

  • SysInfo.getOSName ()
    returns the string for the host.

  • exnHistory
    the same as MLton.Exn.history.

  • getCmdName ()
    the same as CommandLine.name ().

  • getArgs ()
    the same as CommandLine.arguments ().

  • getAllArgs ()
    the same as getCmdName()::getArgs().

  • exportFn f
    saves the state of the computation to a file that will apply f to the command-line arguments upon restart.

  • exportML f
    saves the state of the computation to file f and continue. Returns true in the restarted computation and false in the continuing computation.


Last edited on 2008-05-10 11:43:49 by MatthewFluet. mlton-20100608/doc/guide/SMLSharp0000644000076600000240000000452111404435635015004 0ustar mtfstaff SMLSharp - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SMLSharp
Home  Index  
[WWW]SML# is an implementation of an extension of SML.

It includes some [WWW]generally useful SML tools including a pretty printer generator, a document generator, and a regression testing framework, and [WWW]scripting library.


Last edited on 2006-10-30 12:51:22 by VesaKarvonen. mlton-20100608/doc/guide/Sources0000644000076600000240000000756011404435634015003 0ustar mtfstaff Sources - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Sources
Home  Index  
We maintain our sources with Subversion. You can [WWW]view them on the web or access them with a subversion client. Anonymous read access is available via
svn://mlton.org/mlton

We use the [WWW]standard repository layout, so you can check out the latest revision with

svn co svn://mlton.org/mlton/trunk mlton

Committers (you know who you are) can access via
svn+ssh://mlton.org/svnroot/
Committers can check out the trunk with
svn co svn+ssh://mlton.org/svnroot/mlton/trunk mlton

Commit email

All commits are sent to MLton-commit@mlton.org ([WWW]subscribe, [WWW]archive), which is only for commit email. Discussion should go to [MAILTO]MLton@mlton.org.

If the first line of a commit log message begins with "MAIL ", then the commit message will be sent with the subject as the rest of that first line, and will also be sent to [MAILTO]MLton@mlton.org.

Changelog

See the [WWW]changelog for a list of changes and bug fixes.

CVS

Prior to 20050730, we used CVS. We left the CVS server up until 20060809, at which point it was taken down.


Last edited on 2009-04-16 16:13:29 by MatthewFluet. mlton-20100608/doc/guide/SpaceSafety0000644000076600000240000000402311404435635015557 0ustar mtfstaff SpaceSafety - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SpaceSafety
Home  Index  
Informally, space safety is a property of a language implementation that asymptotically bounds the space used by a running program.

References


Last edited on 2007-07-14 14:05:22 by VesaKarvonen. mlton-20100608/doc/guide/SSA0000644000076600000240000001107211404435634013777 0ustar mtfstaff SSA - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SSA
Home  Index  
SSA is an IntermediateLanguage, translated from SXML by ClosureConvert, optimized by SSASimplify, and translated by ToSSA2 to SSA2.

Description

SSA is a FirstOrder, SimplyTyped IntermediateLanguage. It is the main IntermediateLanguage used for optimizations.

An SSA program consists of a collection of datatype declarations, a sequence of global statements, and a collection of functions, along with a distinguished "main" function. Each function consists of a collection of basic blocks, where each basic block is a sequence of statements ending with some control transfer.

Implementation

[WWW]ssa.sig [WWW]ssa.fun
[WWW]ssa-tree.sig [WWW]ssa-tree.fun

Type Checking

Type checking of a SSA program verifies the following:

  • no duplicate definitions (tycons, cons, vars, labels, funcs)

  • no out of scope references (tycons, cons, vars, labels, funcs)

  • variable definitions dominate variable uses

  • case transfers are exhaustive and irredundant

  • Enter/Leave profile statements match

  • "traditional" well-typedness

[WWW]type-check.sig [WWW]type-check.fun

Details and Notes

SSA is an abbreviation for Static Single Assignment.


Last edited on 2006-11-02 17:31:56 by MatthewFluet. mlton-20100608/doc/guide/SSA20000644000076600000240000001160511404435634014063 0ustar mtfstaff SSA2 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SSA2
Home  Index  
SSA2 is an IntermediateLanguage, translated from SSA by ToSSA2, optimized by SSA2Simplify, and translated by ToRSSA to RSSA.

Description

SSA2 is a FirstOrder, SimplyTyped IntermediateLanguage, a slight variant of the SSA IntermediateLanguage,

Like SSA, a SSA program consists of a collection of datatype declarations, a sequence of global statements, and a collection of functions, along with a distinguished "main" function. Each function consists of a collection of basic blocks, where each basic block is a sequence of statements ending with some control transfer.

Unlike SSA, SSA2 includes mutable fields in objects and makes the vector type constructor n-ary instead of unary. This allows optimizations like RefFlatten and DeepFlatten to be expressed.

Implementation

[WWW]ssa2.sig [WWW]ssa2.fun
[WWW]ssa-tree2.sig [WWW]ssa-tree2.fun

Type Checking

Type checking of a SSA2 program verifies the following:

  • no duplicate definitions (tycons, cons, vars, labels, funcs)

  • no out of scope references (tycons, cons, vars, labels, funcs)

  • variable definitions dominate variable uses

  • case transfers are exhaustive and irredundant

  • Enter/Leave profile statements match

  • "traditional" well-typedness

[WWW]type-check2.sig [WWW]type-check2.fun

Details and Notes

SSA is an abbreviation for Static Single Assignment.


Last edited on 2007-08-15 22:07:25 by MatthewFluet. mlton-20100608/doc/guide/SSA2Simplify0000644000076600000240000000651411404435634015603 0ustar mtfstaff SSA2Simplify - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SSA2Simplify
Home  Index  
The optimization passes for the SSA2 IntermediateLanguage are collected and controlled by the Simplify2 functor ([WWW]simplify2.sig,[WWW]simplify2.fun).

The following optimization passes are implemented:

There are additional analysis and rewrite passes that augment many of the other optimization passes:

The optimization passes can be controlled from the command-line by the options

  • diag-pass <pass> -- keep diagnostic info for pass

  • drop-pass <pass> -- omit optimization pass

  • keep-pass <pass> -- keep the results of pass

  • loop-passes <n> -- loop optimization passes

  • ssa2-passes <passes> -- ssa optimization passes


Last edited on 2006-11-02 17:30:30 by MatthewFluet. mlton-20100608/doc/guide/SSASimplify0000644000076600000240000001072611404435634015521 0ustar mtfstaff SSASimplify - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SSASimplify
Home  Index  
The optimization passes for the SSA IntermediateLanguage are collected and controlled by the Simplify functor ([WWW]simplify.sig,[WWW]simplify.fun).

The following optimization passes are implemented:

The following implementation pass is implemented:

There are additional analysis and rewrite passes that augment many of the other optimization passes:

The optimization passes can be controlled from the command-line by the options:

  • diag-pass <pass> -- keep diagnostic info for pass

  • drop-pass <pass> -- omit optimization pass

  • keep-pass <pass> -- keep the results of pass

  • loop-passes <n> -- loop optimization passes

  • ssa-passes <passes> -- ssa optimization passes


Last edited on 2009-08-02 21:41:23 by MatthewFluet. mlton-20100608/doc/guide/Stabilizers0000644000076600000240000001503411404435635015647 0ustar mtfstaff Stabilizers - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Stabilizers
Home  Index  

Installation

  • Stabilizers currently require the MLton sources, this should be fixed by the next release

License

  • Stabilizers are released under the MLton License

Instructions

  • Download and build a source copy of MLton

  • Extract the tar.gz file attached to this wiki page

  • Some examples are provided in the "examples/" sub directory, more examples will be added to this page in the following week

Bug reports / Suggestions

  • Please send any errors you encounter to schatzp and lziarek at cs.purdue.edu

  • We are looking to expand the usability of stabilizers

  • Please send any suggestions and desired functionality to the above email addresses

Note

  • This is an alpha release. We expect to have another release shortly with added functionality soon

  • More documentation, such as signatures and descriptions of functionality, will be forthcoming

Documentation

signature STABLE =
  sig
     type checkpoint

     val stable: ('a -> 'b) -> ('a -> 'b)
     val stabilize: unit -> 'a

     val stableCP: (('a -> 'b) * (unit -> unit)) -> 
                    (('a -> 'b) *  checkpoint)
     val stabilizeCP: checkpoint -> unit

     val unmonitoredAssign: ('a ref * 'a) -> unit
     val monitoredAssign: ('a ref * 'a) -> unit
  end

Stable provides functions to manage stable sections.

  • type checkpoint
    handle used to stabilize contexts other than the current one.

  • stable f
    returns a function identical to f that will execute within a stable section.

  • stabilize ()
    unrolls the effects made up to the current context to at least the nearest enclosing {{stable}}} section. These effects may have propagated to other threads, so all affected threads are returned to a globally consistent previous state. The return is undefined because control cannot resume after stabilize is called.

  • stableCP (f, comp)
    returns a function f' and checkpoint tag cp. Function f' is identical to f but when applied will execute within a stable section. comp will be executed if f' is later stabilized. cp is used by stabilizeCP to stabilize a given checkpoint.

  • stabilizeCP cp
    same as stabilize except that the (possibly current) checkpoint to stabilize is provided.

  • unmonitoredAssign (r, v)
    standard assignment (:=). The version of CML distributed rebinds := to a monitored version so interesting effects can be recorded.

  • monitoredAssign (r, v)
    the assignment operator that should be used in programs that use stabilizers. := is rebound to this by including CML.

Download

Also see


Last edited on 2007-08-23 04:40:21 by MatthewFluet. mlton-20100608/doc/guide/StandardML0000644000076600000240000001203511404435634015342 0ustar mtfstaff StandardML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StandardML
Home  Index  
Standard ML (SML) is a programming language that combines excellent support for rapid prototyping, modularity, and development of large programs, with performance approaching that of C.

SML Resources

Aspects of SML

Using SML

Programming in SML

Notes

Related Languages


Last edited on 2010-05-27 21:03:12 by MatthewFluet. mlton-20100608/doc/guide/StandardMLBooks0000644000076600000240000000575111404435634016347 0ustar mtfstaff StandardMLBooks - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StandardMLBooks
Home  Index  


Last edited on 2005-05-19 19:50:12 by StephenWeeks. mlton-20100608/doc/guide/StandardMLGotchas0000644000076600000240000002425511404435634016662 0ustar mtfstaff StandardMLGotchas - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StandardMLGotchas
Home  Index  
This page contains brief explanations of some recurring sources of confusion and problems that SML newbies encounter.

Many confusions about the syntax of SML seem to arise from the use of an interactive REPL (Read-Eval Print Loop) while trying to learn the basics of the language. While writing your first SML programs, you should keep the source code of your programs in a form that is accepted by an SML compiler as a whole.

The {{{and}}} keyword

It is a common mistake to misuse the and keyword or to not know how to introduce mutually recursive definitions. The purpose of the and keyword is to introduce mutually recursive definitions of functions and datatypes. For example,

fun isEven 0w0 = true
  | isEven 0w1 = false
  | isEven n = isOdd (n-0w1)
and isOdd 0w0 = false
  | isOdd 0w1 = true
  | isOdd n = isEven (n-0w1)

and

datatype decl = VAL of id * pat * expr
           (* | ... *)
     and expr = LET of decl * expr
           (* | ... *)

You can also use and as a shorthand in a couple of other places, but it is not necessary.

Constructed patterns

It is a common mistake to forget to parenthesize constructed patterns in fun bindings. Consider the following invalid definition:

fun length nil = 0
  | length h :: t = 1 + length t

The pattern h :: t needs to be parenthesized:

fun length nil = 0
  | length (h :: t) = 1 + length t

The parentheses are needed, because a fun definition may have multiple consecutive constructed patterns through currying.

The same applies to nonfix constructors. For example, the parentheses in

fun valOf NONE = raise Option
  | valOf (SOME x) = x

are required. However, the outermost constructed pattern in a fn or case expression need not be parenthesized, because in those cases there is always just one constructed pattern. So, both

val valOf = fn NONE => raise Option
             | SOME x => x

and

fun valOf x = case x of
                 NONE => raise Option
               | SOME x => x

are fine.

Declarations and expressions

It is a common mistake to confuse expressions and declarations. Normally an SML source file should only contain declarations. The following are declarations:

datatype dt = ...
fun f ... = ...
functor Fn (...) = ...
infix ...
infixr ...
local ... in ... end
nonfix ...
open ...
signature SIG = ...
structure Struct = ...
type t = ...
val v = ...

Note that

let ... in ... end

isn't a declaration.

To specify a side-effecting computation in a source file, you can write:

val () = ...

Equality types

SML has a fairly intricate built-in notion of equality. See EqualityType and EqualityTypeVariable for a thorough discussion.

Nested cases

It is a common mistake to write nested case expressions without the necessary parentheses. See UnresolvedBugs for a discussion.

(op *)

It used to be a common mistake to parenthesize op * as (op *). Before SML'97, *) was considered a comment terminator in SML and caused a syntax error. At the time of writing, SML/NJ still rejects the code. An extra space may be used for portability: (op * ). However, parenthesizing op is redundant, even though it is a widely used convention.

Overloading

A number of standard operators (+, -, ~, *, <, >, ...) and numeric constants are overloaded for some of the numeric types (int, real, word). It is a common surprise that definitions using overloaded operators such as

fun min (x, y) = if y < x then y else x

are not overloaded themselves. SML doesn't really support (user-defined) overloading or other forms of ad hoc polymorphism. In cases such as the above where the context doesn't resolve the overloading, expressions using overloaded operators or constants get assigned a default type. The above definition gets the type

val min : int * int -> int

See Overloading and TypeIndexedValues for further discussion.

Semicolons

It is a common mistake to use redundant semicolons in SML code. This is probably caused by the fact that in an SML REPL, a semicolon (and enter) is used to signal the REPL that it should evaluate the preceding chunk of code as a unit. In SML source files, semicolons are really needed in only two places. Namely, in expressions of the form

(exp ; ... ; exp)

and

let ... in exp ; ... ; exp end

Note that semicolons act as expression (or declaration) separators rather than as terminators.

Stale bindings

Unresolved records

Value restriction

See ValueRestriction.

Type Variable Scope

See TypeVariableScope.


Last edited on 2007-08-23 04:25:03 by MatthewFluet. mlton-20100608/doc/guide/StandardMLHistory0000644000076600000240000000377711404435634016741 0ustar mtfstaff StandardMLHistory - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StandardMLHistory
Home  Index  
Standard ML grew out of ML in the early 1980s.

For an excellent overview of SML's history, see Appendix F of the Definition.

For an overview if its history before 1982, see How ML Evolved.


Last edited on 2005-06-20 21:44:44 by StephenWeeks. mlton-20100608/doc/guide/StandardMLImplementations0000644000076600000240000000567211404435635020445 0ustar mtfstaff StandardMLImplementations - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StandardMLImplementations
Home  Index  
There are a number of implementations of Standard ML, from interpreters, to byte-code compilers, to incremental compilers, to whole-program compilers.

Not Actively Maintained


Last edited on 2007-11-08 17:41:33 by AndreasRossberg. mlton-20100608/doc/guide/StandardMLPortability0000644000076600000240000000576511404435634017601 0ustar mtfstaff StandardMLPortability - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StandardMLPortability
Home  Index  
Technically, SML'97 as defined in the Definition requires only a minimal initial basis, which, while including the types int, real, char, and string, need have no operations on those base types. Hence, the only observable output of an SML'97 program is termination or raising an exception. Most SML compilers should agree there, to the degree each agrees with the Definition. See UnresolvedBugs for MLton's very few corner cases.

Realistically, a program needs to make use of the Basis Library. Within the Basis Library, there are numerous places where the behavior is implementation dependent. For a trivial example:

val _ = valOf (Int.maxInt)

may either raise the Option exception (if Int.maxInt == NONE) or may terminate normally. The default Int/Real/Word sizes are the biggest implementation dependent aspect; so, one implementation may raise Overflow while another can accommodate the result. Also, maximum array and vector lengths are implementation dependent. Interfacing with the operating system is a bit murky, and implementations surely differ in handling of errors there.


Last edited on 2009-05-07 18:10:58 by MatthewFluet. mlton-20100608/doc/guide/StandardMLTutorials0000644000076600000240000000503511404435634017253 0ustar mtfstaff StandardMLTutorials - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StandardMLTutorials
Home  Index  


Last edited on 2007-09-28 10:15:26 by VictorAnyakin. mlton-20100608/doc/guide/StaticSum0000644000076600000240000004267011404435634015275 0ustar mtfstaff StaticSum - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StaticSum
Home  Index  
While SML makes it impossible to write functions whose types would depend on the values of their arguments, or so called dependently typed functions, it is possible, and arguably commonplace, to write functions whose types depend on the types of their arguments. Indeed, the types of parametrically polymorphic functions like map and foldl can be said to depend on the types of their arguments. What is less commonplace, however, is to write functions whose behavior would depend on the types of their arguments. Nevertheless, there are several techniques for writing such functions. Type-indexed values and fold are two such techniques. This page presents another such technique dubbed static sums.

Ordinary Sums

Consider the sum type as defined below:

structure Sum = struct
   datatype ('a, 'b) t = INL of 'a | INR of 'b
end
While a generic sum type such as defined above is very useful, it has a number of limitations. As an example, we could write the function out to extract the value from a sum as follows:
fun out (s : ('a, 'a) Sum.t) : 'a =
    case s
     of Sum.INL a => a
      | Sum.INR a => a
As can be seen from the type of out, it is limited in the sense that it requires both variants of the sum to have the same type. So, out cannot be used to extract the value of a sum of two different types, such as the type (int, real) Sum.t. As another example of a limitation, consider the following attempt at a succ function:
fun succ (s : (int, real) Sum.t) : ??? =
    case s
     of Sum.INL i => i + 1
      | Sum.INR r => Real.nextAfter (r, Real.posInf)
The above definition of succ cannot be typed, because there is no type for the codomain within SML.

Static Sums

Interestingly, it is possible to define values inL, inR, and match that satisfy the laws

match (inL x) (f, g) = f x
match (inR x) (f, g) = g x
and do not suffer from the same limitions. The definitions are actually quite trivial:
structure StaticSum = struct
   fun inL x (f, _) = f x
   fun inR x (_, g) = g x
   fun match x = x
end

Now, given the succ function defined as

fun succ s =
    StaticSum.match s
       (fn i => i + 1,
        fn r => Real.nextAfter (r, Real.posInf))
we get
succ (StaticSum.inL 1) = 2
succ (StaticSum.inR Real.maxFinite) = Real.posInf

To better understand how this works, consider the following signature for static sums:

structure StaticSum :> sig
   type ('dL, 'cL, 'dR, 'cR, 'c) t
   val inL : 'dL -> ('dL, 'cL, 'dR, 'cR, 'cL) t
   val inR : 'dR -> ('dL, 'cL, 'dR, 'cR, 'cR) t
   val match : ('dL, 'cL, 'dR, 'cR, 'c) t -> ('dL -> 'cL) * ('dR -> 'cR) -> 'c
end = struct
   type ('dL, 'cL, 'dR, 'cR, 'c) t = ('dL -> 'cL) * ('dR -> 'cR) -> 'c
   open StaticSum
end
Above, 'd stands for domain and 'c for codomain. The key difference between an ordinary sum type, like (int, real) Sum.t, and a static sum type, like (int, real, real, int, real) StaticSum.t, is that the ordinary sum type says nothing about the type of the result of deconstructing a sum while the static sum type specifies the type.

With the sealed static sum module, we get the type

val succ : (int, int, real, real, 'a) StaticSum.t -> 'a
for the previously defined succ function. The type specifies that succ maps a left int to an int and a right real to a real. For example, the type of StaticSum.inL 1 is (int, 'cL, 'dR, 'cR, 'cL) StaticSum.t. Unifying this with the argument type of succ gives the type (int, int, real, real, int) StaticSum.t -> int.

The out function is quite useful on its own. Here is how it can be defined:

structure StaticSum = struct
   open StaticSum
   val out : ('a, 'a, 'b, 'b, 'c) t -> 'c =
    fn s => match s (fn x => x, fn x => x)
end

Due to the value restriction, lack of first class polymorphism and polymorphic recursion, the usefulness and convenience of static sums is somewhat limited in SML. So, don't throw away the ordinary sum type just yet. Static sums can nevertheless be quite useful.

Example: Send and Receive with Argument Type Dependent Result Types

In some situations it would seem useful to define functions whose result type would depend on some of the arguments. Traditionally such functions have been thought to be impossible in SML and the solution has been to define multiple functions. For example, the [WWW]Socket structure of the Basis library defines 16 send and 16 recv functions. In contrast, the Net structure ([WWW]net.sig) of the Basic library designed by Stephen Weeks defines only a single send and a single receive and the result types of the functions depend on their arguments. The implementation ([WWW]net.sml) uses static sums (with a slighly different signature: [WWW]static-sum.sig).

Example: Picking Monad Results

Suppose that we need to write a parser that accepts a pair of integers and returns their sum given a monadic parsing combinator library. A part of the signature of such library could look like this

signature PARSING = sig
   include MONAD
   val int : int t
   val lparen : unit t
   val rparen : unit t
   val comma : unit t
   (* ... *)
end
where the MONAD signature could be defined as
signature MONAD = sig
   type 'a t
   val return : 'a -> 'a t
   val >>= : 'a t * ('a -> 'b t) -> 'b t
end
infix >>=

The straightforward, but tedious, way to write the desired parser is:

val p = lparen >>= (fn _ =>
        int    >>= (fn x =>
        comma  >>= (fn _ =>
        int    >>= (fn y =>
        rparen >>= (fn _ =>
        return (x + y))))))
In Haskell, the parser could be written using the do notation considerably less verbosely as:
p = do { lparen ; x <- int ; comma ; y <- int ; rparen ; return $ x + y }
SML doesn't provide a do notation, so we need another solution.

Suppose we would have a "pick" notation for monads that would allows us to write the parser as

val p = `lparen ^ \int ^ `comma ^ \int ^ `rparen @ (fn x & y => x + y)
using four auxiliary combinators: `, \, ^, and @. Roughly speaking

  • `p means that the result of p is dropped,

  • \p means that the result of p is taken,

  • p ^ q means that results of p and q are taken as a product, and

  • p @ a means that the results of p are passed to the function a and that result is returned.

The difficulty is in implementing the concatenation combinator ^. The type of the result of the concatenation depends on the types of the arguments.

Using static sums and the product type, the pick notation for monads can be implemented as follows:

functor MkMonadPick (include MONAD) = let
   open StaticSum
in
   struct
      fun `a = inL (a >>= (fn _ => return ()))
      val \ = inR
      fun a @ f = out a >>= (return o f)
      fun a ^ b =
          (match b o match a)
             (fn a =>
                 (fn b => inL (a >>= (fn _ => b)),
                  fn b => inR (a >>= (fn _ => b))),
              fn a =>
                 (fn b => inR (a >>= (fn a => b >>= (fn _ => return a))),
                  fn b => inR (a >>= (fn a => b >>= (fn b => return (a & b))))))
   end
end
The above implementation is inefficient, however. It uses many more bind operations, >>=, than necessary. That can be solved with an additional level of abstraction:
functor MkMonadPick (include MONAD) = let
   open StaticSum
in
   struct
      fun `a = inL (fn b => a >>= (fn _ => b ()))
      fun \a = inR (fn b => a >>= b)
      fun a @ f = out a (return o f)
      fun a ^ b =
          (match b o match a)
             (fn a => (fn b => inL (fn c => a (fn () => b c)),
                       fn b => inR (fn c => a (fn () => b c))),
              fn a => (fn b => inR (fn c => a (fn a => b (fn () => c a))),
                       fn b => inR (fn c => a (fn a => b (fn b => c (a & b))))))
   end
end

After instantiating and opening either of the above monad pick implementations, the previously given definition of p can be compiled and results in a parser whose result is of type int. Here is a functor to test the theory:

functor Test (Arg : PARSING) = struct
   local
      structure Pick = MkMonadPick (Arg)
      open Pick Arg
   in
      val p : int t =
          `lparen ^ \int ^ `comma ^ \int ^ `rparen @ (fn x & y => x + y)
   end
end

Also see

There are a number of related techniques. Here are some of them.


Last edited on 2009-06-10 19:23:13 by MatthewFluet. mlton-20100608/doc/guide/StephenWeeks0000644000076600000240000000427011404435634015760 0ustar mtfstaff StephenWeeks - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StephenWeeks
Home  Index  
I live in the New York City area and work at [WWW]Jane Street Capital.

My [WWW]home page.

You can email me at sweeks@sweeks.com.


Last edited on 2007-05-17 01:40:45 by StephenWeeks. mlton-20100608/doc/guide/StyleGuide0000644000076600000240000000362611404435635015436 0ustar mtfstaff StyleGuide - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION StyleGuide
Home  Index  
These conventions are chosen so that inertia is towards modularity, code reuse and finding bugs early, not to save typing.


Last edited on 2004-11-14 23:23:24 by StephenWeeks. mlton-20100608/doc/guide/Subversion0000644000076600000240000000421311404435634015507 0ustar mtfstaff Subversion - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Subversion
Home  Index  
[WWW]Subversion is a version control system designed to replace CVS. The MLton project uses Subversion to maintain its source code.


Last edited on 2007-08-10 19:45:51 by MatthewFluet. mlton-20100608/doc/guide/SuccessorML0000644000076600000240000000413211404435634015552 0ustar mtfstaff SuccessorML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SuccessorML
Home  Index  
The purpose of [WWW]successor ML, or sML for short, is to provide a vehicle for the continued evolution of ML, using Standard ML as a starting point. The intention is for successor ML to be a living, evolving dialect of ML that is responsive to community needs and advances in language design, implementation, and semantics.


Last edited on 2007-07-08 22:53:36 by MatthewFluet. mlton-20100608/doc/guide/SureshJagannathan0000644000076600000240000000465311404435634016764 0ustar mtfstaff SureshJagannathan - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SureshJagannathan
Home  Index  
I am an Associate Professor at the [WWW]Department of Computer Science at Purdue University. My research focus is in programming language design and implementation, concurrency, and distributed systems. I am interested in various aspects of MLton, mostly related to (in no particular order): (1) control-flow analysis (2) representation strategies (e.g., flattening), (3) IR formats, and (4) extensions for distributed programming.

Please see my [WWW]Home page for more details.


Last edited on 2004-11-20 21:09:49 by SureshJagannathan. mlton-20100608/doc/guide/Swerve0000644000076600000240000000532411404435634014627 0ustar mtfstaff Swerve - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Swerve
Home  Index  
[WWW]Swerve is an HTTP server written in SML, originally developed with SML/NJ. RayRacine ported Swerve to MLton in January 2005.

[WWW]download the port

Excerpt from the included README:

    Total testing of this port consisted of a successful compile, startup, and serving one html page with one gif image. Given that the original code was throughly designed and implemented in a thoughtful manner and I expect it is quite usable modulo a few minor bugs introduced by my porting effort.

Swerve is described in Shipman02.


Last edited on 2006-11-15 01:50:36 by StephenWeeks. mlton-20100608/doc/guide/SXML0000644000076600000240000000710011404435634014131 0ustar mtfstaff SXML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SXML
Home  Index  
SXML is an IntermediateLanguage, translated from XML by Monomorphise, optimized by SXMLSimplify, and translated by ClosureConvert to SSA.

Description

SXML is a simply-typed version of XML.

Implementation

[WWW]sxml.sig [WWW]sxml.fun
[WWW]sxml-tree.sig

Type Checking

SXML shares the type checker for XML.

Details and Notes

There are only two differences between XML and SXML. First, SXML val, fun, and datatype declarations always have an empty list of type variables. Second, SXML variable references always have an empty list of type arguments. Constructors uses can only have a nonempty list of type arguments if the constructor is a primitive.

Although we could rely on the type system to enforce these constraints by parameterizing the XML signature, StephenWeeks did so in a previous version of the compiler, and the software engineering gains were not worth the effort.


Last edited on 2006-11-02 17:47:41 by MatthewFluet. mlton-20100608/doc/guide/SXMLShrink0000644000076600000240000000511311404435634015312 0ustar mtfstaff SXMLShrink - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SXMLShrink
Home  Index  
SXMLShrink is an optimization pass for the SXML IntermediateLanguage, invoked from SXMLSimplify.

Description

This pass performs optimizations based on a reduction system.

Implementation

[WWW]shrink.sig [WWW]shrink.fun

Details and Notes

SXML shares the XMLShrink simplifier.


Last edited on 2006-11-02 17:50:28 by MatthewFluet. mlton-20100608/doc/guide/SXMLSimplify0000644000076600000240000000663511404435634015662 0ustar mtfstaff SXMLSimplify - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SXMLSimplify
Home  Index  
The optimization passes for the SXML IntermediateLanguage are collected and controlled by the SxmlSimplify functor ([WWW]sxml-simplify.sig,[WWW]sxml-simplify.fun).

The following optimization passes are implemented:

The following implementation passes are implemented:

The following optimization passes are not implemented, but might prove useful:

The optimization passes can be controlled from the command-line by the options

  • diag-pass <pass> -- keep diagnostic info for pass

  • drop-pass <pass> -- omit optimization pass

  • keep-pass <pass> -- keep the results of pass

  • sxml-passes <passes> -- sxml optimization passes


Last edited on 2006-11-02 17:39:21 by MatthewFluet. mlton-20100608/doc/guide/SyntacticConventions0000644000076600000240000004274311404435635017552 0ustar mtfstaff SyntacticConventions - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SyntacticConventions
Home  Index  
Here are a number of syntactic conventions useful for programming in SML.

  1. General
  2. Identifiers
  3. Types
  4. Core
  5. Signatures
  6. Structures
  7. Functors

General

  • A line of code never exceeds 80 columns.

  • Only split a syntactic entity across multiple lines if it doesn't fit on one line within 80 columns.

  • Use alphabetical order wherever possible.

  • Avoid redundant parentheses.

  • When using :, there is no space before the colon, and a single space after it.

Identifiers

  • Variables, record labels and type constructors begin with and use small letters, using capital letters to separate words.

    cost
    maxValue

  • Variables that represent collections of objects (lists, arrays, vectors, ...) are often suffixed with an s.

    xs
    employees

  • Constructors, structure identifiers, and functor identifiers begin with a capital letter.

    Queue
    LinkedList

  • Signature identifiers are in all capitals, using _ to separate words.

    LIST
    BINARY_HEAP

Types

  • Alphabetize record labels. In a record type, there are spaces after colons and commas, but not before colons or commas, or at the delimiters { and .

    {bar: int, foo: int}
    

  • Only split a record type across multiple lines if it doesn't fit on one line. If a record type must be split over multiple lines, put one field per line.

    {bar: int,
     foo: real * real, 
     zoo: bool} 

  • In a tuple type, there are spaces before and after each *.

    int * bool * real
    

  • Only split a tuple type across multiple lines if it doesn't fit on one line. In a tuple type split over multiple lines, there is one type per line, and the *s go at the beginning of the lines.

    int
    * bool
    * real
    
    It may also be useful to parenthesize to make the grouping more apparent.
    (int
     * bool
     * real)
    

  • In an arrow type split over multiple lines, put the arrow at the beginning of its line.

    int * real
    -> bool
    
    It may also be useful to parenthesize to make the grouping more apparent.
    (int * real
     -> bool)
    

  • Avoid redundant parentheses.

    • Arrow types associate to the right, so write

      a -> b -> c
      not
      a -> (b -> c)

    • Type constructor application associates to the left, so write

      int ref list
      not
      (int ref) list

    • Type constructor application binds more tightly than a tuple type, so write

      int list * bool list
      not
      (int list) * (bool list)

    • Tuple types bind more tightly than arrow types, so write

      int * bool -> real
      
      not
      (int * bool) -> real

Core

  • A core expression or declaration split over multiple lines does not contain any blank lines.

  • A record field selector has no space between the # and the record label. So, write

    #foo
    
    not
    # foo
    

  • A tuple has a space after each comma, but not before, and not at the delimiters ( ).

    (e1, e2, e3)
    

  • A tuple split over multiple lines has one element per line, and the commas go at the end of the lines.

    (e1,
     e2,
     e3)
    

  • A list has a space after each comma, but not before, and not at the delimiters [ ].

    [e1, e2, e3]
    

  • A list split over multiple lines has one element per line, and the commas at the end of the lines.

    [e1,
     e2,
     e3]
    

  • A record has spaces before and after =, a space after each comma, and no space at the delimiters. Field names appear in alphabetical order.

    {bar = 13, foo = true} 
    

  • A sequence expression has a space after each semicolon, but not before.

    (e1; e2; e3)
    

  • A sequence expression split over multiple lines has one expression per line, and the semicolons at the beginning of lines. Lisp and Scheme programmers may find this hard to read at first.

    (e1
     ; e2
     ; e3)
    
    Rationale: this makes it easy to visually spot the beginning of each expression, which becomes more valuable as the expressions themselves are split across multiple lines.

  • An application expression has a space between the function and the argument. There are no parens unless the argument is a tuple (in which case the parens are really part of the tuple, not the application).

    f a
    f (a1, a2, a3)
    

  • Avoid redundant parentheses. Application associates to left, so write

    f a1 a2 a3
    
    not
    ((f a1) a2) a3
    

  • Infix operators have a space before and after the operator.

    x + y
    x * y - z
    

  • Avoid redundant parentheses. Use OperatorPrecedence. So, write

    x + y * z
    
    not
    x + (y * z)
    

  • An andalso expression split over multiple lines has the andalso at the beginning of subsequent lines.

    e1
    andalso e2
    andalso e3
    

  • A case expression is indented as follows

    case e1 of
       p1 => e1
     | p2 => e2
     | p3 => e3
    

  • A datatype's constructors are alphabetized.

    datatype t = A | B | C
    

  • A datatype declaration has a space before and after each |.

    datatype t = A | B of int | C
    

  • A datatype split over multiple lines has one constructor per line, with the | at the beginning of lines and the constructors beginning 3 columns to the right of the datatype.

    datatype t = 
       A 
     | B 
     | C
    

  • A fun declaration may start its body on the subsequent line, indented 3 spaces.

    fun f x y =
       let
          val z = x + y + z
       in
          z
       end
    

  • An if expression is indented as follows.

    if e1
       then e2
    else e3
    

  • A sequence of if-then-elses is indented as follows.

    if e1
       then e2
    else if e3
       then e4
    else if e5
       then e6
    else e7
    

  • A let expression has the let, in, and end on their own lines, starting in the same column. Declarations and the body are indented 3 spaces.

    let
       val x = 13
       val y = 14
    in
       x + y
    end
    

  • A local declaration has the local, in, and end on their own lines, starting in the same column. Declarations are indented 3 spaces.

    local
       val x = 13
    in
       val y = x
    end
    

  • An orelse expression split over multiple lines has the orelse at the beginning of subsequent lines.

    e1
    orelse e2
    orelse e3
    

  • A val declaration has a space before and after the =.

    val p = e
    

  • A val declaration can start the expression on the subsequent line, indented 3 spaces.

    val p =
       if e1 then e2 else e3
    

Signatures

  • A signature declaration is indented as follows.

    signature FOO =
       sig
          val x: int
       end
    
    Exception: a signature declaration in a file to itself can omit the indentation to save horizontal space.
    signature FOO =
    sig
    
    val x: int
    
    end
    
    In this case, there should be a blank line after the sig and before the end.

  • A val specification has a space after the colon, but not before.

    val x: int
    
    Exception: in the case of operators (like +), there is a space before the colon to avoid lexing the colon as part of the operator.
    val + : t * t -> t
    

  • Alphabetize specifications in signatures.

    sig 
       val x: int 
       val y: bool 
    end
    

Structures

  • A structure declaration has a space on both sides of the =.

    structure Foo = Bar
    

  • A structure declaration split over multiple lines is indented as follows.

    structure S =
       struct
          val x = 13
       end
    
    Exception: a structure declaration in a file to itself can omit the indentation to save horizontal space.
    structure S =
    struct
    
    val x = 13
    
    end
    
    In this case, there should be a blank line after the struct and before the end.

  • Declarations in a struct are separated by blank lines.

    struct
       val x =
          let
             y = 13
          in 
             y + 1
          end
    
       val z = 14
    end
    

Functors

  • A functor declaration has spaces after each : (or :>) but not before, and a space before and after the =. It is indented as follows

    functor Foo (S: FOO_ARG): FOO =
       struct
           val x = S.x
       end
    
    Exception: a functor declaration in a file to itself can omit the indentation to save horizontal space.
    functor Foo (S: FOO_ARG): FOO =
    struct
    
    val x = S.x
    
    end
    
    In this case, there should be a blank line after the struct and before the end.


Last edited on 2009-01-08 15:44:46 by MatthewFluet. mlton-20100608/doc/guide/SystemInfo0000644000076600000240000000536311404435634015457 0ustar mtfstaff SystemInfo - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION SystemInfo
Home  Index  

Python Version
2.3.5 (#2, Sep 4 2005, 22:01:42) [GCC 3.3.5 (Debian 1:3.3.5-13)]
MoinMoin Version
Release 1.2.3 [Revision 1.186]
Number of pages
355
Number of system pages
2
Number of backup versions
2660
Accumulated page sizes
768715
Entries in edit log
3499 (349091 bytes)
Event log
100898383 bytes
Global extension macros
AbandonedPages, BR, FootNote, Form, FullSearch, GetText, Include, Navigation, OrphanedPages, PageHits, PageSize, RandomPage, RandomQuote, RecentChanges, ShowSmileys, StatsChart, SystemAdmin, TableOfContents, TeudView, WantedPages
Local extension macros
Cite, Div, DownloadSVN, Form, Improvement, IncludeSVN, Input, Span, TextArea, ViewCVS, ViewCVSDir, ViewSVN, ViewSVNDir, ViewSVNRev
Global extension actions
AttachFile, DeletePage, LikePages, LocalSiteMap, RenamePage, SpellCheck, links, rss_rc, titleindex
Local extension actions
AllLinks
Installed processors
CSV, Colorize


Last edited on 2004-10-26 01:42:46 by StephenWeeks. mlton-20100608/doc/guide/Talk0000644000076600000240000000403611404435634014246 0ustar mtfstaff Talk - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Talk
Home  Index  

The MLton Standard ML Compiler

Henry Cejtin, Matthew Fluet, Suresh Jagannathan, Stephen Weeks






Last edited on 2004-12-01 16:48:10 by MatthewFluet. mlton-20100608/doc/guide/TalkDiveIn0000644000076600000240000000433611404435635015351 0ustar mtfstaff TalkDiveIn - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkDiveIn
Home  Index  


Last edited on 2005-11-14 23:13:23 by MatthewFluet. mlton-20100608/doc/guide/TalkFolkLore0000644000076600000240000000430711404435635015706 0ustar mtfstaff TalkFolkLore - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkFolkLore
Home  Index  

Folk Lore

  • Defunctorization and monomorphisation are feasible

  • Global control-flow analysis is feasible

  • Early closure conversion is feasible






Last edited on 2004-12-01 18:35:55 by MatthewFluet. mlton-20100608/doc/guide/TalkFromSMLTo0000644000076600000240000000420011404435634015742 0ustar mtfstaff TalkFromSMLTo - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkFromSMLTo
Home  Index  

From Standard ML to S-T F-O IL

  • What issues arise when translating from Standard ML into an intermediate language?






Last edited on 2004-12-01 18:39:02 by MatthewFluet. mlton-20100608/doc/guide/TalkHowHigherOrder0000644000076600000240000000432711404435634017052 0ustar mtfstaff TalkHowHigherOrder - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkHowHigherOrder
Home  Index  

Higher-order Functions

  • How does one represent SML's higher-order functions?

  • MLton's answer: defunctionalize





See ClosureConvert.


Last edited on 2004-12-01 18:36:01 by MatthewFluet. mlton-20100608/doc/guide/TalkHowModules0000644000076600000240000000424211404435634016254 0ustar mtfstaff TalkHowModules - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkHowModules
Home  Index  

Modules

  • How does one represent SML's modules?

  • MLton's answer: defunctorize





See Elaborate.


Last edited on 2004-12-01 18:36:07 by MatthewFluet. mlton-20100608/doc/guide/TalkHowPolymorphism0000644000076600000240000000427311404435634017352 0ustar mtfstaff TalkHowPolymorphism - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkHowPolymorphism
Home  Index  

Polymorphism

  • How does one represent SML's polymorphism?

  • MLton's answer: monomorphise





See Monomorphise.


Last edited on 2004-12-01 18:36:12 by MatthewFluet. mlton-20100608/doc/guide/TalkMLtonApproach0000644000076600000240000000432711404435634016701 0ustar mtfstaff TalkMLtonApproach - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkMLtonApproach
Home  Index  

MLton's Approach

  • whole-program optimization using a simply-typed, first-order intermediate language

  • ensures programs are not penalized for exploiting abstraction and modularity






Last edited on 2004-12-01 18:36:17 by MatthewFluet. mlton-20100608/doc/guide/TalkMLtonFeatures0000644000076600000240000000474411404435635016726 0ustar mtfstaff TalkMLtonFeatures - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkMLtonFeatures
Home  Index  

MLton Features

  • Supports full Standard ML language and Basis Library

  • Generates standalone executables

  • Extensions

    • Foreign function interface (SML to C, C to SML)

    • ML Basis system for programming in the very large

    • Extension libraries





See Features.


Last edited on 2005-01-28 21:49:50 by MatthewFluet. mlton-20100608/doc/guide/TalkMLtonHistory0000644000076600000240000000566211404435634016610 0ustar mtfstaff TalkMLtonHistory - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkMLtonHistory
Home  Index  

MLton History

    April 1997 Stephen Weeks wrote a defunctorizer for SML/NJ
    Aug. 1997 Begin independent compiler (smlc)
    Oct. 1997 Monomorphiser
    Nov. 1997 Polyvariant higher-order control-flow analysis (10,000 lines)
    March 1999 First release of MLton (48,006 lines)
    Jan. 2002 MLton at 102,541 lines
    Jan. 2003 MLton at 112,204 lines
    Jan. 2004 MLton at 122,299 lines
    Nov. 2004 MLton at 141,311 lines





See History.


Last edited on 2004-12-01 18:42:32 by MatthewFluet. mlton-20100608/doc/guide/TalkStandardML0000644000076600000240000000505711404435634016164 0ustar mtfstaff TalkStandardML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkStandardML
Home  Index  

Standard ML

  • a high-level language makes

    • a programmer's life easier

    • a compiler writer's life harder

  • perceived overheads of features discourage their use

    • higher-order functions

    • polymorphic datatypes

    • separate modules





Also see Standard ML.


Last edited on 2005-01-18 15:02:29 by MatthewFluet. mlton-20100608/doc/guide/TalkTemplate0000644000076600000240000000411311404435634015736 0ustar mtfstaff TalkTemplate - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkTemplate
Home  Index  

Title

  • Bullet

  • Bullet






Last edited on 2004-12-01 18:59:26 by MatthewFluet. mlton-20100608/doc/guide/TalkWholeProgram0000644000076600000240000000462311404435634016577 0ustar mtfstaff TalkWholeProgram - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TalkWholeProgram
Home  Index  

Whole Program Compiler

  • Each of these techniques requires whole-program analysis

  • But, additional benefits:

    • eliminate (some) variability in programming styles

    • specialize representations

    • simplifies and improves runtime system






Last edited on 2007-08-15 22:07:28 by MatthewFluet. mlton-20100608/doc/guide/TILT0000644000076600000240000000353711404435634014134 0ustar mtfstaff TILT - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TILT
Home  Index  


Last edited on 2006-08-18 18:34:10 by StephenWeeks. mlton-20100608/doc/guide/TipsForWritingConciseSML0000644000076600000240000003215511404435634020170 0ustar mtfstaff TipsForWritingConciseSML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TipsForWritingConciseSML
Home  Index  
SML is a rich enough language that there are often several ways to express things. This page contains miscellaneous tips (ideas not rules) for writing concise SML. The metric that we are interested in here is the number of tokens or words (rather than the number of lines, for example).

Datatypes in Signatures

A seemingly frequent source of repetition in SML is that of datatype definitions in signatures and structures. Actually, it isn't repetition at all. A datatype specification in a signature, such as,

    signature EXP = sig
       datatype exp = Fn of id * exp | App of exp * exp | Var of id
    end
    

is just a specification of a datatype that may be matched by multiple (albeit identical) datatype declarations. For example, in

    structure AnExp : EXP = struct
       datatype exp = Fn of id * exp | App of exp * exp | Var of id
    end
    
    structure AnotherExp : EXP = struct
       datatype exp = Fn of id * exp | App of exp * exp | Var of id
    end
    

the types AnExp.exp and AnotherExp.exp are two distinct types. If such generativity isn't desired or needed, you can avoid the repetition:

    structure Exp = struct
       datatype exp = Fn of id * exp | App of exp * exp | Var of id
    end
    
    signature EXP = sig
       datatype exp = datatype Exp.exp
    end
    
    structure Exp : EXP = struct
       open Exp
    end
    

Keep in mind that this isn't semantically equivalent to the original.

Clausal Function Definitions

The syntax of clausal function definitions is rather repetitive. For example,

    fun isSome NONE = false
      | isSome (SOME _) = true
    

is more verbose than

    val isSome =
     fn NONE => false
      | SOME _ => true
    

For recursive functions the break-even point is one clause higher. For example,

    fun fib 0 = 0
      | fib 1 = 1
      | fib n = fib (n-1) + fib (n-2)
    

isn't less verbose than

    val rec fib =
     fn 0 => 0
      | 1 => 1
      | n => fib (n-1) + fib (n-2)
    

It is quite often the case that a curried function primarily examines just one of its arguments. Such functions can be written particularly concisely by making the examined argument last. For example, instead of

    fun eval (Fn (v, b)) env => ...
      | eval (App (f, a) env => ...
      | eval (Var v) env => ...
    

consider writing

    fun eval env =
     fn Fn (v, b) => ...
      | App (f, a) => ...
      | Var v => ...
    

Parentheses

It is a good idea to avoid using lots of irritating superfluous parentheses. An important rule to know is that prefix function application in SML has higher precedence than any infix operator. For example, the outer parentheses in

    (square (5 + 1)) + (square (5 * 2))
    

are superfluous.

People trained in other languages often use superfluous parentheses in a number of places. In particular, the parentheses in the following examples are practically always superfluous and are best avoided:

    if (condition) then ... else ...
    while (condition) do ...
    

The same basically applies to case expressions:

    case (expression) of ...
    

It is not uncommon to match a tuple of two or more values:

    case (a, b) of
       (A1, B1) => ...
     | (A2, B2) => ...
    

Such case expressions can be written more concisely with an infix product constructor:

    case a & b of
       A1 & B1 => ...
     | A2 & B2 => ...
    

Conditionals

Repeated sequences of conditionals such as

    if x < y then ...
    else if x = y then ...
    else ...
    

can often be written more concisely as case expressions such as

    case Int.compare (x, y) of
       LESS => ...
     | EQUAL => ...
     | GREATER => ...
    

For a custom comparison, you would then define an appropriate datatype and a reification function. An alternative to using datatypes is to use dispatch functions

    comparing (x, y)
    {lt = fn () => ...,
     eq = fn () => ...,
     gt = fn () => ...}
    

where

    fun comparing (x, y) {lt, eq, gt} =
        (case Int.compare (x, y) of
            LESS => lt
          | EQUAL => eq
          | GREATER => gt) ()
    

An advantage is that no datatype definition is needed. A disadvantage is that you can't combine multiple dispatch results easily.

Command-Query Fusion

Many are familiar with the [WWW]Command-Query Separation Principle. Adhering to the principle, a signature for an imperative stack might contain specifications

    val isEmpty : 'a t -> bool
    val pop : 'a t -> 'a
    

and use of a stack would look like

    if isEmpty stack
    then ... pop stack ...
    else ...
    

or, when the element needs to be named,

    if isEmpty stack
    then let val elem = pop stack in ... end
    else ...
    

For efficiency, correctness, and conciseness, it is often better to combine the query and command and return the result as an option:

    val pop : 'a t -> 'a option
    

A use of a stack would then look like this:

    case pop stack of
       NONE => ...
     | SOME elem => ...
    


Last edited on 2007-02-12 07:34:53 by VesaKarvonen. mlton-20100608/doc/guide/TitleIndex0000644000076600000240000004472111404435634015431 0ustar mtfstaff TitleIndex - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TitleIndex
Home  Index  
There are 351 pages.

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | R | S | T | U | V | W | X | Z
Include system pages |  |

A

AccessControl
AdamGoode
AdmitsEquality
Alice
AllocateRegisters
AndreiFormiga
ArrayLiteral
AST

B

BasisLibrary
Bug
Bugs20041109
Bugs20051202
Bugs20070826
Bugs20100608

C

CallGraph
CallingFromCToSML
CallingFromSMLToC
CallingFromSMLToCFunctionPointer
Changelog
ChrisClearwater
Chunkify
CKitLibrary
Closure
ClosureConvert
CMinusMinus
CombineConversions
CommonArg
CommonBlock
CommonSubexp
CompilationManager
CompilerOverview
CompileTimeOptions
CompilingWithSMLNJ
ConcurrentML
ConcurrentMLImplementation
ConstantPropagation
Contact
Contify
CoreML
CoreMLSimplify
CreatingPages
Credits
CrossCompiling

D

DeadCode
DeepFlatten
DefineTypeBeforeUse
DefinitionOfStandardML
Defunctorize
Developers
Development
Documentation
[WWW]Download
Drawbacks

E

Eclipse
EditingPages
Elaborate
Emacs
EmacsBgBuildMode
EmacsDefUseMode
Enscript
EqualityType
EqualityTypeVariable
EtaExpansion
eXene
[WWW]Experimental

F

FAQ
Features
FirstClassPolymorphism
Fixpoints
Flatten
Fold
Fold01N
ForeignFunctionInterface
ForeignFunctionInterfaceSyntax
ForeignFunctionInterfaceTypes
ForLoops
FrontEnd
FSharp
FunctionalRecordUpdate
fxp

G

GarbageCollection
GenerativeDatatype
GenerativeException
Glade
Globalize
GnuMP

H

HaMLet
HenryCejtin
History
Home
HowProfilingWorks
HowToAttachFile

I

Identifier
Immutable
ImperativeTypeVariable
ImplementExceptions
ImplementHandlers
ImplementProfiling
ImplementSuffix
Index
InfixingOperators
Inline
InsertLimitChecks
InsertSignalChecks
Installation
IntermediateLanguage
IntroduceLoops

J

JesperLouisAndersen
JohnnyAndersen

K

KnownCase

L

LambdaCalculus
LambdaFree
LanguageChanges
Lazy
Libraries
LibrarySupport
License
LineDirective
LLVM
LocalFlatten
LocalRef
LoopInvariant

M

Machine
ManualPage
MatchCompilation
MatchCompile
MatthewFluet
mGTK
MichaelNorrish
MikeThomas
ML
MLBasis
MLBasisAnnotationExamples
MLBasisAnnotations
MLBasisAvailableLibraries
MLBasisExamples
MLBasisPathMap
MLBasisSyntaxAndSemantics
MLj
MLKit
MLLex
MLmon
MLNLFFI
MLNLFFIGen
MLNLFFIImplementation
MLRISCLibrary
MLtonArray
MLtonBinIO
MLtonCont
MLtonContIsolateImplementation
MLtonExn
MLtonFinalizable
MLtonGC
MLtonIntInf
MLtonIO
MLtonItimer
MLtonMonoArray
MLtonMonoVector
MLtonPlatform
MLtonPointer
MLtonProcEnv
MLtonProcess
MLtonProfile
MLtonRandom
MLtonReal
MLtonRlimit
MLtonRusage
MLtonSignal
MLtonSocket
MLtonStructure
MLtonSyslog
MLtonTextIO
MLtonThread
MLtonVector
MLtonWeak
MLtonWord
MLtonWorld
MLYacc
MoinMoin
Monomorphise
MoscowML
Multi
Mutable

N

NeedsReview
NumericLiteral

O

ObjectOrientedProgramming
OCaml
[WWW]OldPages
OpenGL
OperatorPrecedence
OptionalArguments
OrphanedPages
OtherSites
Overloading

P

PackedRepresentation
PageSize
ParallelMove
Performance
PhantomType
PlatformSpecificNotes
PolyEqual
PolyHash
PolyML
PolymorphicEquality
Polyvariance
Poplog
PortingMLton
PrecedenceParse
[WWW]Preferences
Printf
PrintfGentle
ProductType
Profiling
ProfilingAllocation
ProfilingCounts
ProfilingTheStack
ProfilingTime
Projects
Pronounce
PropertyList

R

RayRacine
Reachability
[WWW]RecentChanges
Redundant
RedundantTests
References
RefFlatten
Regions
Release20041109
Release20051202
Release20070826
Release20100608
ReleaseChecklist
RemoveUnused
Restore
ReturnStatement
RSSA
RSSAShrink
RSSASimplify
RunningOnAIX
RunningOnAlpha
RunningOnAMD64
RunningOnARM
RunningOnCygwin
RunningOnDarwin
RunningOnFreeBSD
RunningOnHPPA
RunningOnHPUX
RunningOnIA64
RunningOnLinux
RunningOnMinGW
RunningOnNetBSD
RunningOnOpenBSD
RunningOnPowerPC
RunningOnPowerPC64
RunningOnS390
RunningOnSolaris
RunningOnSparc
RunningOnX86
RunTimeOptions

S

ScopeInference
SelfCompiling
Serialization
ShowBasis
ShowProf
Shrink
SimplifyTypes
SMLNET
SMLNJ
SMLNJDeviations
SMLNJLibrary
SMLofNJStructure
SMLSharp
Sources
SpaceSafety
SSA
SSA2
SSA2Simplify
SSASimplify
Stabilizers
StandardML
StandardMLBooks
StandardMLGotchas
StandardMLHistory
StandardMLImplementations
StandardMLPortability
StandardMLTutorials
StaticSum
StephenWeeks
StyleGuide
Subversion
SuccessorML
SureshJagannathan
Swerve
SXML
SXMLShrink
SXMLSimplify
SyntacticConventions
SystemInfo

T

Talk
TalkDiveIn
TalkFolkLore
TalkFromSMLTo
TalkHowHigherOrder
TalkHowModules
TalkHowPolymorphism
TalkMLtonApproach
TalkMLtonFeatures
TalkMLtonHistory
TalkStandardML
TalkWholeProgram
[WWW]TemporaryUpload
TILT
TipsForWritingConciseSML
TitleIndex
ToMachine
TomMurphy
ToRSSA
ToSSA2
TrustedGroup
TypeChecking
TypeConstructor
TypeIndexedValues
TypeVariableScope

U

Unicode
UniversalType
UnresolvedBugs
UnsafeStructure
Useless
Users
Utilities

V

ValueRestriction
VariableArityPolymorphism
Variant
VesaKarvonen

W

WantedPages
WarnUnusedAnomalies
WebSite
WesleyTerpstra
WholeProgramOptimization
WikiMacros
WikiName
[WWW]WikiSandBox
WikiTool
WishList

X

XML
XMLShrink
XMLSimplify
XMLSimplifyTypes

Z

Zone
ZZZOrphanedPages


Last edited on 2007-11-08 03:13:02 by MatthewFluet. mlton-20100608/doc/guide/ToMachine0000644000076600000240000000733411404435634015226 0ustar mtfstaff ToMachine - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ToMachine
Home  Index  
ToMachine is a translation pass from the RSSA IntermediateLanguage to the Machine IntermediateLanguage.

Description

This pass converts from a RSSA program into a Machine program.

It uses AllocateRegisters, Chunkify, and ParallelMove.

Implementation

[WWW]backend.sig [WWW]backend.fun

Details and Notes

Because the MLton runtime system is shared by all codegens, it is most convenient to decide on stack layout before any codegen takes over. In particular, we compute all the stack frame info for each RSSA function, including stack size, garbage collector masks for each frame, etc. To do so, the Machine IntermediateLanguage imagines an abstract machine with an infinite number of (pseudo-)registers of every size. A liveness analysis determines, for each variable, whether or not it is live across a point where the runtime system might take over (for example, any garbage collection point) or a non-tail call to another RSSA function. Those that are live go on the stack, while those that aren't live go into psuedo-registers. From this information, we know all we need to about each stack frame. On the downside, nothing further on is allowed to change this stack info; it is set in stone.


Last edited on 2006-11-28 21:24:34 by JakeDonham. mlton-20100608/doc/guide/TomMurphy0000644000076600000240000000376311404435634015325 0ustar mtfstaff TomMurphy - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TomMurphy
Home  Index  
Tom Murphy VII is a long time MLton user and occasional contributor. He works on programming languages for his PhD work at Carnegie Mellon in Pittsburgh, USA. AdamGoode lives on the same floor of Wean Hall.

[WWW]Home page


Last edited on 2007-01-23 21:57:44 by TomMurphy. mlton-20100608/doc/guide/ToRSSA0000644000076600000240000000522411404435635014427 0ustar mtfstaff ToRSSA - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ToRSSA
Home  Index  
ToRSSA is a translation pass from the SSA2 IntermediateLanguage to the RSSA IntermediateLanguage.

Description

This pass converts a SSA2 program into a RSSA program.

It uses PackedRepresentation.

Implementation

[WWW]ssa-to-rssa.sig [WWW]ssa-to-rssa.fun

Details and Notes


Last edited on 2006-11-02 17:34:03 by MatthewFluet. mlton-20100608/doc/guide/ToSSA20000644000076600000240000000603611404435635014371 0ustar mtfstaff ToSSA2 - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ToSSA2
Home  Index  
ToSSA2 is a translation pass from the SSA IntermediateLanguage to the SSA2 IntermediateLanguage.

Description

This pass is a simple conversion from a SSA program into a SSA2 program.

The only interesting portions of the translation are:

  • an SSA ref type becomes an object with a single mutable field

  • array, vector, and ref are eliminated in favor of select and updates

  • Case transfers separate discrimination and constructor argument selects

Implementation

[WWW]ssa-to-ssa2.sig [WWW]ssa-to-ssa2.fun

Details and Notes


Last edited on 2006-11-02 17:56:30 by MatthewFluet. mlton-20100608/doc/guide/TrustedGroup0000644000076600000240000000436211404435635016025 0ustar mtfstaff TrustedGroup - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TrustedGroup
Home  Index  


Last edited on 2008-08-20 20:26:55 by MatthewFluet. mlton-20100608/doc/guide/TypeChecking0000644000076600000240000002060211404435635015726 0ustar mtfstaff TypeChecking - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TypeChecking
Home  Index  
MLton's type checker follows the Definition closely, so you may find differences between MLton and other SML compilers that do not follow the Definition so closely. In particular, SML/NJ has many deviations from the Definition -- please see SMLNJDeviations for those that we are aware of.

In some respects MLton's type checker is more powerful than other SML compilers, so there are programs that MLton accepts that are rejected by some other SML compilers. These kinds of programs fall into a few simple categories.

  • MLton resolves flexible record patterns using a larger context than many other SML compilers. For example, MLton accepts the following.

    fun f {x, ...} = x
    val _ = f {x = 13, y = "foo"}
    

  • MLton uses as large a context as possible to resolve the type of variables constrained by the value restriction to be monotypes. For example, MLton accepts the following.

    structure S:
       sig
          val f: int -> int
       end =
       struct
          val f = (fn x => x) (fn y => y)
       end
    

Type error messages

To aid in the understanding of type errors, MLton's type checker displays type errors differently than other SML compilers. In particular, when two types are different, it is important for the programmer to easily understand why they are different. So, MLton displays only the differences between two types that don't match, using underscores for the parts that match. For example, if a function expects real * int but gets real * real, the type error message would look like

expects: _ * [int]
but got: _ * [real]

As another aid to spotting differences, MLton places brackets [] around the parts of the types that don't match. A common situation is when a function receives a different number of arguments than it expects, in which case you might see an error like

expects: [int * real]
but got: [int * real * string]

The brackets make it easy to see that the problem is that the tuples have different numbers of components -- not that the components don't match. Contrast that with a case where a function receives the right number of arguments, but in the wrong order.

expects: [int] * [real]
but got: [real] * [int]

Here the brackets make it easy to see that the components do not match.

We appreciate feedback on any type error messages that you find confusing, or suggestions you may have for improvements to error messages.

The shortest/most-recent rule for type names

In a type error message, MLton often has a number of choices in deciding what name to use for a type. For example, in the following type-incorrect program

type t = int
fun f (x: t) = x
val _ = f "foo"

MLton reports

Error: z.sml 3.9.
  Function applied to incorrect argument.
    expects: [t]
    but got: [string]
    in: f "foo"

MLton could have reported expects: [int] instead of expects: [t]. However, MLton uses the shortest/most-recent rule in order to decide what type name to display. This rule means that, at the point of the error, MLton first looks for the shortest name for a type in terms of number of structure identifiers (e.g. foobar is shorter than A.t). Next, if there are multiple names of the same length, then MLton uses the most recently defined name. It is this tiebreaker that causes MLton to prefer t to int in the above example.

In signature matching, most recently defined is taken to include all of the definitions introduced by the structure. For example

structure S:
   sig
      val x: int
   end =
   struct
      type t = int
      val x = "foo"
   end

MLton reports the error message

Error: z.sml 2.4.
  Variable type in structure disagrees with signature.
    variable: x
    structure: [string]
    signature: [t]

in which the [t] refers to the type defined in the structure, since that is more recent than the definition of int.

In signatures with type equations, this can be somewhat confusing. For example.

structure S:
   sig
      type t
      type u = t
   end =
   struct
      type t = int
      type u = char
   end

MLton reports the error

Error: z.sml 2.4.
  Type definition in structure disagrees with signature.
    type: u
    structure: [u]
    signature: [t]

This error reflects the fact that the signature requires type u to equal t, but that in the structure, u is defined to be char, whose most-recent name is u, while the signature requires u to be int, whose most-recent name is t.


Last edited on 2007-08-15 22:07:31 by MatthewFluet. mlton-20100608/doc/guide/TypeConstructor0000644000076600000240000001010411404435634016533 0ustar mtfstaff TypeConstructor - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TypeConstructor
Home  Index  
In Standard ML, a type constructor is a function from types to types. Type constructors can be nullary, meaning that they take no arguments, as in char, int, and real. Type constructors can be unary, meaning that they take one argument, as in array, list, and vector. A program can define a new type constructor in two ways: a type definition or a datatype declaration. User-defined type constructors can can take any number of arguments.
datatype t = T of int * real            (* 0 arguments *)
type 'a t = 'a * int                    (* 1 argument *)
datatype ('a, 'b) t = A | B of 'a * 'b  (* 2 arguments *)
type ('a, 'b, 'c) t = 'a * ('b  -> 'c)  (* 3 arguments *)

Here are the syntax rules for type constructor application.

  • Type constructor application is written in postfix. So, one writes int list, not list int.

  • Unary type constructors drop the parens, so one writes int list, not (int) list.

  • Nullary type constructors drop the argument entirely, so one writes int, not () int.

  • N-ary type constructors use tuple notation; for example, (int, real) t.

  • Type constructor application associates to the left. So, int ref list is the same as (int ref) list.


Last edited on 2005-12-02 04:26:23 by StephenWeeks. mlton-20100608/doc/guide/TypeIndexedValues0000644000076600000240000011336011404435634016756 0ustar mtfstaff TypeIndexedValues - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TypeIndexedValues
Home  Index  
Standard ML does not support ad hoc polymorphism. This presents a challenge to programmers. The problem is that at first glance there seems to be no practical way to implement something like a function for converting a value of any type to a string or a function for computing a hash value for a value of any type. Fortunately there are ways to implement type-indexed values in SML as discussed in Yang98. Various articles such as Danvy98, Ramsey03, Elsman04, Kennedy04, and Benton05 also contain examples of type-indexed values.

NOTE: The technique used in the following example uses an early (and somewhat broken) variation of the basic technique used in an experimental generic programming library (see [WWW]README) that can be found from the MLton repository. The generic programming library also includes a more advanced generic pretty printing function (see [WWW]pretty.sig).

Example: Converting any SML value to (roughly) SML syntax

Consider the problem of converting any SML value to a textual presentation that matches the syntax of SML as closely as possible. One solution is a type-indexed function that maps a given type to a function that maps any value (of the type) to its textual presentation. A type-indexed function like this can be useful for a variety of purposes. For example, one could use it to show debugging information. We'll call this function "show".

We'll do a fairly complete implementation of show. We do not distinguish infix and nonfix constructors, but that is not an intrinsic property of SML datatypes. We also don't reconstruct a type name for the value, although it would be particularly useful for functional values. To reconstruct type names, some changes would be needed and the reader is encouraged to consider how to do that. A more realistic implementation would use some pretty printing combinators to compute a layout for the result. This should be a relatively easy change (given a suitable pretty printing library). Cyclic values (through references and arrays) do not have a standard textual presentation and it is impossible to convert arbitrary functional values (within SML) to a meaningful textual presentation. Finally, it would also make sense to show sharing of references and arrays. We'll leave these improvements to an actual library implementation.

The following code uses the fixpoint framework and other utilities from an Extended Basis library (see [WWW]README).

Signature

Let's consider the design of the SHOW signature:

infixr -->

signature SHOW = sig
   type 'a t       (* complete type-index *)
   type 'a s       (* incomplete sum *)
   type ('a, 'k) p (* incomplete product *)
   type u          (* tuple or unlabelled product *)
   type l          (* record or labelled product *)

   val show : 'a t -> 'a -> string

   (* user-defined types *)
   val inj : ('a -> 'b) -> 'b t -> 'a t

   (* tuples and records *)
   val * : ('a, 'k) p * ('b, 'k) p -> (('a, 'b) product, 'k) p

   val U :           'a t -> ('a, u) p
   val L : string -> 'a t -> ('a, l) p

   val tuple  : ('a, u) p -> 'a t
   val record : ('a, l) p -> 'a t

   (* datatypes *)
   val + : 'a s * 'b s -> (('a, 'b) sum) s

   val C0 : string -> unit s
   val C1 : string -> 'a t -> 'a s

   val data : 'a s -> 'a t

   val Y : 'a t Tie.t

   (* exceptions *)
   val exn : exn t
   val regExn : (exn -> ('a * 'a s) option) -> unit

   (* some built-in type constructors *)
   val refc : 'a t -> 'a ref t
   val array : 'a t -> 'a array t
   val list : 'a t -> 'a list t
   val vector : 'a t -> 'a vector t
   val --> : 'a t * 'b t -> ('a -> 'b) t

   (* some built-in base types *)
   val string : string t
   val unit : unit t
   val bool : bool t
   val char : char t
   val int : int t
   val word : word t
   val real : real t
end

While some details are shaped by the specific requirements of show, there are a number of (design) patterns that translate to other type-indexed values. The former kind of details are mostly shaped by the syntax of SML values that show is designed to produce. To this end, abstract types and phantom types are used to distinguish incomplete record, tuple, and datatype type-indices from each other and from complete type-indices. Also, names of record labels and datatype constructors need to be provided by the user.

Arbitrary user-defined datatypes

Perhaps the most important pattern is how the design supports arbitrary user-defined datatypes. A number of combinators together conspire to provide the functionality. First of all, to support new user-defined types, a combinator taking a conversion function to a previously supported type is provided:

val inj : ('a -> 'b) -> 'b t -> 'a t

An injection function is sufficient in this case, but in the general case, an embedding with injection and projection functions may be needed.

To support products (tuples and records) a product combinator is provided:

val * : ('a, 'k) p * ('b, 'k) p -> (('a, 'b) product, 'k) p

The second (phantom) type variable 'k is there to distinguish between labelled and unlabelled products and the type p distinguishes incomplete products from complete type-indices of type t. Most type-indexed values do not need to make such distinctions.

To support sums (datatypes) a sum combinator is provided:

val + : 'a s * 'b s -> (('a, 'b) sum) s

Again, the purpose of the type s is to distinguish incomplete sums from complete type-indices of type t, which usually isn't necessary.

Finally, to support recursive datatypes, including sets of mutually recursive datatypes, a fixpoint tier is provided:

val Y : 'a t Tie.t

Together these combinators (with the more domain specific combinators U, L, tuple, record, C0, C1, and data) enable one to encode a type-index for any user-defined datatype.

Exceptions

The exn type in SML is a universal type into which all types can be embedded. SML also allows a program to generate new exception variants at run-time. Thus a mechanism is required to register handlers for particular variants:

val exn : exn t
val regExn : (exn -> ('a * 'a s) option) -> unit

The universal exn type-index then makes use of the registered handlers. The above particular form of handler, which converts an exception value to a value of some type and a type-index for that type (essentially an existential type) is designed to make it convenient to write handlers. To write a handler, one can conveniently reuse existing type-indices:

exception Int of int

local
   open Show
in
   val () = regExn (fn Int v => SOME (v, C1"Int" int)
                     | _     => NONE)
end

Note that a single handler may actually handle an arbitrary number of different exceptions.

Other types

Some built-in and standard types typically require special treatment due to their special nature. The most important of these are arrays and references, because cyclic data (ignoring closures) and observable sharing can only be constructed through them.

When arrow types are really supported, unlike in this case, they usually need special treatment due to the contravariance of arguments.

Lists and vectors require special treatment in the case of show, because of their special syntax. This isn't usually the case.

The set of base types to support also needs to be considered unless one exports an interface for constructing type-indices for entirely new base types.

Usage

Before going to the implementation, let's look at some examples. For the following examples, we'll assume a structure binding Show :> SHOW. If you want to try the examples immediately, just skip forward to the implementation.

To use show, one first needs a type-index, which is then given to show. To show a list of integers, one would use the type-index list int, which has the type int list Show.t:

val "[3, 1, 4]" =
    let open Show in show (list int) end
       [3, 1, 4]

Likewise, to show a list of lists of characters, one would use the type-index list (list char), which has the type char list list Show.t:

val "[[#\"a\"], [#\"b\", #\"c\"], []]" =
    let open Show in show (list (list char)) end
       [[#"a"], [#"b", #"c"], []]

Handling standard types is not particularly interesting. It is more interesting to see how user-defined types can be handled. Although the option datatype is a standard type, it requires no special support, so we can treat it as a user-defined type. Options can be encoded easily using a sum:

fun option t = let
   open Show
in
   inj (fn NONE => INL ()
         | SOME v => INR v)
       (data (C0"NONE" + C1"SOME" t))
end

val "SOME 5" =
    let open Show in show (option int) end
       (SOME 5)

Readers new to type-indexed values might want to type annotate each subexpression of the above example as an exercise. (Use a compiler to check your annotations.)

Using a product, user specified records can be also be encoded easily:

val abc = let
   open Show
in
   inj (fn {a, b, c} => a & b & c)
       (record (L"a" (option int) *
                L"b" real *
                L"c" bool))
end

val "{a = SOME 1, b = 3.0, c = false}" =
    let open Show in show abc end
       {a = SOME 1, b = 3.0, c = false}

As you can see, both of the above use inj to inject user-defined types to the general purpose sum and product types.

Of particular interest is whether recursive datatypes and cyclic data can be handled. For example, how does one write a type-index for a recursive datatype such as a cyclic graph?

datatype 'a graph = VTX of 'a * 'a graph list ref
fun arcs (VTX (_, r)) = r

Using the Show combinators, we could first write a new type-index combinator for graph:

fun graph a = let
   open Tie Show
in
   fix Y (fn graph_a =>
             inj (fn VTX (x, y) => x & y)
                 (data (C1"VTX"
                          (tuple (U a *
                                  U (refc (list graph_a)))))))
end

To show a graph with integer labels

val a_graph = let
   val a = VTX (1, ref [])
   val b = VTX (2, ref [])
   val c = VTX (3, ref [])
   val d = VTX (4, ref [])
   val e = VTX (5, ref [])
   val f = VTX (6, ref [])
in
   arcs a := [b, d]
 ; arcs b := [c, e]
 ; arcs c := [a, f]
 ; arcs d := [f]
 ; arcs e := [d]
 ; arcs f := [e]
 ; a
end

we could then simply write

val "VTX (1, ref [VTX (2, ref [VTX (3, ref [VTX (1, %0), \
    \VTX (6, ref [VTX (5, ref [VTX (4, ref [VTX (6, %3)])])] as %3)]), \
    \VTX (5, ref [VTX (4, ref [VTX (6, ref [VTX (5, %2)])])] as %2)]), \
    \VTX (4, ref [VTX (6, ref [VTX (5, ref [VTX (4, %1)])])] as %1)] as %0)" =
    let open Show in show (graph int) end
       a_graph

There is a subtle gotcha with cyclic data. Consider the following code:

exception ExnArray of exn array

val () = let
   open Show
in
   regExn (fn ExnArray a =>
              SOME (a, C1"ExnArray" (array exn))
            | _ => NONE)
end

val a_cycle = let
   val a = Array.fromList [Empty]
in
   Array.update (a, 0, ExnArray a) ; a
end

Although the above looks innocent enough, the evaluation of

val "[|ExnArray %0|] as %0" =
    let open Show in show (array exn) end
       a_cycle

goes into an infinite loop. To avoid this problem, the type-index array exn must be evaluated only once, as in the following:

val array_exn = let open Show in array exn end

exception ExnArray of exn array

val () = let
   open Show
in
   regExn (fn ExnArray a =>
              SOME (a, C1"ExnArray" array_exn)
            | _ => NONE)
end

val a_cycle = let
   val a = Array.fromList [Empty]
in
   Array.update (a, 0, ExnArray a) ; a
end

val "[|ExnArray %0|] as %0" =
    let open Show in show array_exn end
       a_cycle

Cyclic data (excluding closures) in Standard ML can only be constructed imperatively through arrays and references (combined with exceptions or recursive datatypes). Before recursing to a reference or an array, one needs to check whether that reference or array has already been seen before. When ref or array is called with a type-index, a new cyclicity checker is instantiated.

Implementation

structure SmlSyntax = struct
   local
      structure CV = CharVector and C = Char
   in
      val isSym = Char.contains "!%&$#+-/:<=>?@\\~`^|*"

      fun isSymId s = 0 < size s andalso CV.all isSym s

      fun isAlphaNumId s =
          0 < size s
          andalso C.isAlpha (CV.sub (s, 0))
          andalso CV.all (fn c => C.isAlphaNum c
                                  orelse #"'" = c
                                  orelse #"_" = c) s

      fun isNumLabel s =
          0 < size s
          andalso #"0" <> CV.sub (s, 0)
          andalso CV.all C.isDigit s

      fun isId s = isAlphaNumId s orelse isSymId s

      fun isLongId s = List.all isId (String.fields (#"." <\ op =) s)

      fun isLabel s = isId s orelse isNumLabel s
   end
end

structure Show :> SHOW = struct
   datatype 'a t = IN of exn list * 'a -> bool * string
   type 'a s = 'a t
   type ('a, 'k) p = 'a t
   type u = unit
   type l = unit

   fun show (IN t) x = #2 (t ([], x))

   (* user-defined types *)
   fun inj inj (IN b) = IN (b o Pair.map (id, inj))

   local
      fun surround pre suf (_, s) = (false, concat [pre, s, suf])
      fun parenthesize x = if #1 x then surround "(" ")" x else x
      fun construct tag =
          (fn (_, s) => (true, concat [tag, " ", s])) o parenthesize
      fun check p m s = if p s then () else raise Fail (m^s)
   in
      (* tuples and records *)
      fun (IN l) * (IN r) =
          IN (fn (rs, a & b) =>
                 (false, concat [#2 (l (rs, a)),
                                 ", ",
                                 #2 (r (rs, b))]))

      val U = id
      fun L l = (check SmlSyntax.isLabel "Invalid label: " l
               ; fn IN t => IN (surround (l^" = ") "" o t))

      fun tuple (IN t) = IN (surround "(" ")" o t)
      fun record (IN t) = IN (surround "{" "}" o t)

      (* datatypes *)
      fun (IN l) + (IN r) = IN (fn (rs, INL a) => l (rs, a)
                                 | (rs, INR b) => r (rs, b))

      fun C0 c = (check SmlSyntax.isId "Invalid constructor: " c
                ; IN (const (false, c)))
      fun C1 c (IN t) = (check SmlSyntax.isId "Invalid constructor: " c
                       ; IN (construct c o t))

      val data = id

      fun Y ? = Tie.iso Tie.function (fn IN x => x, IN) ?

      (* exceptions *)
      local
         val handlers = ref ([] : (exn -> unit t option) list)
      in
         val exn = IN (fn (rs, e) => let
                             fun lp [] =
                                 C0(concat ["<exn:",
                                            General.exnName e,
                                            ">"])
                               | lp (f::fs) =
                                 case f e
                                  of NONE => lp fs
                                   | SOME t => t
                             val IN f = lp (!handlers)
                          in
                             f (rs, ())
                          end)
         fun regExn f =
             handlers := (Option.map
                             (fn (x, IN f) =>
                                 IN (fn (rs, ()) =>
                                        f (rs, x))) o f)
                         :: !handlers
      end

      (* some built-in type constructors *)
      local
         fun cyclic (IN t) = let
            exception E of ''a * bool ref
         in
            IN (fn (rs, v : ''a) => let
                      val idx = Int.toString o length
                      fun lp (E (v', c)::rs) =
                          if v' <> v then lp rs
                          else (c := false ; (false, "%"^idx rs))
                        | lp (_::rs) = lp rs
                        | lp [] = let
                             val c = ref true
                             val r = t (E (v, c)::rs, v)
                          in
                             if !c then r
                             else surround "" (" as %"^idx rs) r
                          end
                   in
                      lp rs
                   end)
         end

         fun aggregate pre suf toList (IN t) =
             IN (surround pre suf o
                 (fn (rs, a) =>
                     (false,
                      String.concatWith
                         ", "
                         (map (#2 o curry t rs)
                              (toList a)))))
      in
         fun refc ? = (cyclic o inj ! o C1"ref") ?
         fun array ? = (cyclic o aggregate "[|" "|]" (Array.foldr op:: [])) ?
         fun list ? = aggregate "[" "]" id ?
         fun vector ? = aggregate "#[" "]" (Vector.foldr op:: []) ?
      end

      fun (IN _) --> (IN _) = IN (const (false, "<fn>"))

      (* some built-in base types *)
      local
         fun mk toS = (fn x => (false, x)) o toS o (fn (_, x) => x)
      in
         val string =
             IN (surround "\"" "\"" o mk (String.translate Char.toString))
         val unit = IN (mk (fn () => "()"))
         val bool = IN (mk Bool.toString)
         val char = IN (surround "#\"" "\"" o mk Char.toString)
         val int = IN (mk Int.toString)
         val word = IN (surround "0wx" "" o mk Word.toString)
         val real = IN (mk Real.toString)
      end
   end
end

(* Handlers for standard top-level exceptions *)
val () = let
   open Show
   fun E0 name = SOME ((), C0 name)
in
   regExn (fn Bind => E0"Bind"
            | Chr => E0"Chr"
            | Div => E0"Div"
            | Domain => E0"Domain"
            | Empty => E0"Empty"
            | Match => E0"Match"
            | Option => E0"Option"
            | Overflow  => E0"Overflow"
            | Size => E0"Size"
            | Span => E0"Span"
            | Subscript => E0"Subscript"
            | _ => NONE)
 ; regExn (fn Fail s => SOME (s, C1"Fail" string)
            | _ => NONE)
end

Also see

There are a number of related techniques. Here are some of them.


Last edited on 2009-06-10 19:24:04 by MatthewFluet. mlton-20100608/doc/guide/TypeVariableScope0000644000076600000240000002356611404435634016745 0ustar mtfstaff TypeVariableScope - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION TypeVariableScope
Home  Index  
In Standard ML, every type variable is scoped (or bound) at a particular point in the program. A type variable can be either implicitly scoped or explicitly scoped. For example, 'a is implicitly scoped in
val id: 'a -> 'a = fn x => x

and is implicitly scoped in

val id = fn x: 'a => x

On the other hand, 'a is explicitly scoped in

val 'a id: 'a -> 'a = fn x => x

and is explicitly scoped in

val 'a id = fn x: 'a => x

A type variable can be scoped at a val or fun declaration. An SML type checker performs scope inference on each top-level declaration to determine the scope of each implicitly scoped type variable. After scope inference, every type variable is scoped at exactly one enclosing val or fun declaration. Scope inference shows that the first and second example above are equivalent to the third and fourth example, respectively.

Section 4.6 of the Definition specifies precisely the scope of an implicitly scoped type variable. A free occurrence of a type variable 'a in a declaration d is said to be unguarded in d if 'a is not part of a smaller declaration. A type variable 'a is implicitly scoped at d if 'a is unguarded in d and 'a does not occur unguarded in any declaration containing d.

Scope inference examples

  • In this example,

     val id: 'a -> 'a = fn x => x
    
    'a is unguarded in val id and does not occur unguarded in any containing declaration. Hence, 'a is scoped at val id and the declaration is equivalent to the following.
     val 'a id: 'a -> 'a = fn x => x
    

  • In this example,

     val f = fn x => let exception E of 'a in E x end
    
    'a is unguarded in val f and does not occur unguarded in any containing declaration. Hence, 'a is scoped at val f and the declaration is equivalent to the following.
     val 'a f = fn x => let exception E of 'a in E x end
    

  • In this example (taken from the Definition),

     val x: int -> int = let val id: 'a -> 'a = fn z => z in id id end
    
    'a occurs unguarded in val id, but not in val x. Hence, 'a is implicitly scoped at val id, and the declaration is equivalent to the following.
     val x: int -> int = let val 'a id: 'a -> 'a = fn z => z in id id end
    

  • In this example,

     val f = (fn x: 'a => x) (fn y => y)
    
    'a occurs unguarded in val f and does not occur unguarded in any containing declaration. Hence, 'a is implicitly scoped at val f, and the declaration is equivalent to the following.
     val 'a f = (fn x: 'a => x) (fn y => y)
    
    This does not type check due to the ValueRestriction.

  • In this example,

     fun f x =
       let
          fun g (y: 'a) = if true then x else y
       in
          g x
       end
    
    'a occurs unguarded in fun g, not in fun f. Hence, 'a is implicitly scoped at fun g, and the declaration is equivalent to
     fun f x =
       let
          fun 'a g (y: 'a) = if true then x else y
       in
          g x
       end
    
    This fails to type check because x and y must have the same type, and hence 'a can not be generalized at fun g. MLton reports
    Error: scope.sml 3.7.
      Unable to generalize 'a.
        in: fun 'a g ((y): 'a) = (if true then x else y)
    This problem could be fixed either by adding an explicit type constraint, as in fun f (x: 'a), or by explicitly scoping 'a, as in fun 'a f x.

Restrictions on type variable scope

It is not allowed to scope a type variable within a declaration in which it is already in scope (see the last restriction listed on page 9 of the Definition). For example, the following program is invalid.

fun 'a f (x: 'a) =
   let
      fun 'a g (y: 'a) = y
   in
      ()
   end

MLton reports

Error: z.sml 3.11.
  Type variable 'a scoped at an outer declaration.

This is an error even if the scoping is implicit. That is, the following program is invalid as well.

fun f (x: 'a) =
   let
      fun 'a g (y: 'a) = y
   in
      ()
   end


Last edited on 2005-12-02 03:01:09 by StephenWeeks. mlton-20100608/doc/guide/Unicode0000644000076600000240000001030411404435634014734 0ustar mtfstaff Unicode - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Unicode
Home  Index  
The current release of MLton does not support Unicode. We are working on adding support.
  • WideChar structure.

  • UTF-8 encoded source files.

There is no real support for Unicode in the Definition; there are only a few throw-away sentences along the lines of "ASCII must be a subset of the character set in programs".

Neither is there real support for Unicode in the Basis Library. The general consensus (which includes the opinions of the editors of the Basis Library) is that the WideChar structure is insufficient for the purposes of Unicode. There is no LargeChar structure, which in itself is a deficiency, since a programmer can not program against the largest supported character size.

MLton has some preliminary support for 16 and 32 bit characters and strings. It is even possible to include arbitrary Unicode characters in 32-bit strings using a \Uxxxxxxxx escape sequence. (This longer escape sequence is a minor extension over the Definition which only allows \uxxxx.) This is by no means completely satisfactory in terms of support for Unicode, but it is what is currently available.

There are periodic flurries of questions and discussion about Unicode in MLton/SML. In December 2004, there was a discussion that led to some seemingly sound design decisions. The discussion started at:

There is a good summary of points at:

In November 2005, there was a followup discussion and the beginning of some coding.

We are optimistic that support will appear in the next MLton release.

Also see

The fxp XML parser has some support for dealing with Unicode documents.


Last edited on 2007-08-15 22:07:35 by MatthewFluet. mlton-20100608/doc/guide/UniversalType0000644000076600000240000002326511404435634016172 0ustar mtfstaff UniversalType - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION UniversalType
Home  Index  
A universal type is a type into which all other types can be embedded. Here's a Standard ML signature for a universal type.
signature UNIVERSAL_TYPE =
   sig
      type t

      val embed: unit -> ('a -> t) * (t -> 'a option)
   end

The idea is that type t is the universal type and that each call to embed returns a new pair of functions (inject, project), where inject embeds a value into the universal type and project extracts the value from the universal type. A pair (inject, project) returned by embed works together in that project u will return SOME v if and only if u was created by inject v. If u was created by a different function inject', then project returns NONE.

Here's an example embedding integers and reals into a universal type.

functor Test (U: UNIVERSAL_TYPE): sig end =
   struct
      val (intIn: int -> U.t, intOut) = U.embed ()
      val r: U.t ref = ref (intIn 13)
      val s1 =
         case intOut (!r) of
            NONE => "NONE"
          | SOME i => Int.toString i
      val (realIn: real -> U.t, realOut) = U.embed ()
      val () = r := realIn 13.0
      val s2 =
         case intOut (!r) of
            NONE => "NONE"
          | SOME i => Int.toString i
      val s3 =
         case realOut (!r) of
            NONE => "NONE"
          | SOME x => Real.toString x
      val () = print (concat [s1, " ", s2, " ", s3, "\n"])
   end

Applying Test to an appropriate implementation will print

13 NONE 13.0

Note that two different calls to embed on the same type return different embeddings.

Standard ML does not have explicit support for universal types; however, there are at least two ways to implement them.

Implementation Using Exceptions

While the intended use of SML exceptions is for exception handling, an accidental feature of their design is that the exn type is a universal type. The implementation relies on being able to declare exceptions locally to a function and on the fact that exceptions are generative.

structure U:> UNIVERSAL_TYPE =
   struct
      type t = exn

      fun 'a embed () =
         let
            exception E of 'a
            fun project (e: t): 'a option =
               case e of
                  E a => SOME a
                | _ => NONE
         in
            (E, project)
         end
   end

Implementation Using Functions and References

structure U:> UNIVERSAL_TYPE =
   struct
      datatype t = T of {clear: unit -> unit,
                         store: unit -> unit}

      fun 'a embed () =
         let
            val r: 'a option ref = ref NONE
            fun inject (a: 'a): t =
               T {clear = fn () => r := NONE,
                  store = fn () => r := SOME a}
            fun project (T {clear, store}): 'a option =
               let
                  val () = store ()
                  val res = !r
                  val () = clear ()
               in
                  res
               end
         in
            (inject, project)
         end
   end

Note that due to the use of a shared ref cell, the above implementation is not thread safe.

One could try to simplify the above implementation by eliminating the clear function, making type t = unit -> unit.

structure U:> UNIVERSAL_TYPE =
   struct
      type t = unit -> unit

      fun 'a embed () =
         let
            val r: 'a option ref = ref NONE
            fun inject (a: 'a): t = fn () => r := SOME a
            fun project (f: t): 'a option = (r := NONE; f (); !r)
         in
            (inject, project)
         end
   end

While correct, this approach keeps the contents of the ref cell alive longer than necessary, which could cause a space leak. The problem is in project, where the call to f stores some value in some ref cell r'. Perhaps r' is the same ref cell as r, but perhaps not. If we do not clear r' before returning from project, then r' will keep the value alive, even though it is useless.

Also see

  • PropertyList: Lisp-style property lists implemented with a universal type.


Last edited on 2005-05-29 03:04:34 by VesaKarvonen. mlton-20100608/doc/guide/UnresolvedBugs0000644000076600000240000002103611404435634016321 0ustar mtfstaff UnresolvedBugs - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION UnresolvedBugs
Home  Index  
Here are the places where MLton deviates from The Definition of Standard ML. In general, MLton complies with the Definition quite closely, typically much more closely than other SML compilers (see, e.g., our list of SML/NJ's deviations). In fact, the four deviations listed here are the only known deviations, and we have no plans to fix them. If you find a deviation not listed here, please report a Bug.

We don't plan to fix these bugs because one of them (parsing nested cases) has historically never been accepted by any SML compiler, while the other three clearly indicate problems in the Definition.

  • MLton does not correctly parse case expressions nested within other matches. For example, the following fails.

    fun f 0 y =
          case x of
             1 => 2
           | _ => 3
      | f _ y = 4
    
    To do this in a program, simply parenthesize the case expression.

    Allowing such expressions, although compliant with the Definition, would be a mistake, since using parentheses is clearer and no SML compiler has ever allowed them. Furthermore, implementing this would require serious yacc grammar rewriting followed by postprocessing.

  • MLton rejects rebinding of constructors with val rec declarations, as in

     val rec NONE = fn () => ()
    
    The Definition (bizarrely) requires this program to type check, but to raise Bind.

    We have no plans to change this behavior, as the Definition's behavior is clearly an error, a mismatch between the static semantics and the dynamic semantics.

  • MLton does not hide the equality aspect of types declared in abstype declarations. So, MLton accepts programs like the following, while the Definition rejects them.

    abstype t = T with end
    val _ = fn (t1, t2 : t) => t1 = t2
    
    abstype t = T with val a = T end
    val _ = a = a
    
    One consequence of this choice is that MLton accepts the following program, in accordance with the Definition.
     abstype t = T with val eq = op = end
     val _ = fn (t1, t2 : t) => eq (t1, t2)
    
    Other implementations will typically reject this program, because they make an early choice for the type of eq to be ''a * ''a -> bool instead of t * t -> bool. The choice is understandable, since the Definition accepts the following program.
     abstype t = T with val eq = op = end
     val _ = eq (1, 2)
    

  • MLton (re-)type checks each functor definition at every corresponding functor application (the compilation technique of defunctorization). One consequence of this implementation is that MLton accepts the following program, while the Definition rejects it.

    functor F (X: sig type t end) = struct
        val f = id id
    end
    structure A = F (struct type t = int end)
    structure B = F (struct type t = bool end)
    val _ = A.f 10
    val _ = B.f "dude"
    
    On the other hand, other implementations will typically reject the following program, while MLton and the Definition accept it.
    functor F (X: sig type t end)
    = struct
        val f = id id
    end
    structure A = F (struct type t = int end)
    structure B = F (struct type t = bool end)
    val _ = A.f 10
    val _ = B.f false
    
    See DreyerBlume07 for more details.


Last edited on 2009-10-23 04:21:00 by RanAriGur. mlton-20100608/doc/guide/UnsafeStructure0000644000076600000240000001627111404435634016521 0ustar mtfstaff UnsafeStructure - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION UnsafeStructure
Home  Index  
This module is a subset of the Unsafe module provided by SML/NJ, with a few extract operations for Pack{Word,Real}.
signature UNSAFE_MONO_ARRAY =
   sig
      type array
      type elem

      val create: int -> array
      val sub: array * int -> elem
      val update: array * int * elem -> unit
   end

signature UNSAFE_MONO_VECTOR =
   sig
      type elem
      type vector

      val sub: vector * int -> elem
   end

signature UNSAFE =
   sig
      structure Array:
         sig
            val create: int * 'a -> 'a array
            val sub: 'a array * int -> 'a
            val update: 'a array * int * 'a -> unit
         end
      structure CharArray: UNSAFE_MONO_ARRAY
      structure CharVector: UNSAFE_MONO_VECTOR
      structure IntArray: UNSAFE_MONO_ARRAY
      structure IntVector: UNSAFE_MONO_VECTOR
      structure Int8Array: UNSAFE_MONO_ARRAY
      structure Int8Vector: UNSAFE_MONO_VECTOR
      structure Int16Array: UNSAFE_MONO_ARRAY
      structure Int16Vector: UNSAFE_MONO_VECTOR
      structure Int32Array: UNSAFE_MONO_ARRAY
      structure Int32Vector: UNSAFE_MONO_VECTOR
      structure Int64Array: UNSAFE_MONO_ARRAY
      structure Int64Vector: UNSAFE_MONO_VECTOR
      structure IntInfArray: UNSAFE_MONO_ARRAY
      structure IntInfVector: UNSAFE_MONO_VECTOR
      structure LargeIntArray: UNSAFE_MONO_ARRAY
      structure LargeIntVector: UNSAFE_MONO_VECTOR
      structure LargeRealArray: UNSAFE_MONO_ARRAY
      structure LargeRealVector: UNSAFE_MONO_VECTOR
      structure LargeWordArray: UNSAFE_MONO_ARRAY
      structure LargeWordVector: UNSAFE_MONO_VECTOR
      structure RealArray: UNSAFE_MONO_ARRAY
      structure RealVector: UNSAFE_MONO_VECTOR
      structure Real32Array: UNSAFE_MONO_ARRAY
      structure Real32Vector: UNSAFE_MONO_VECTOR
      structure Real64Array: UNSAFE_MONO_ARRAY
      structure Vector:
         sig
            val sub: 'a vector * int -> 'a
         end
      structure Word8Array: UNSAFE_MONO_ARRAY
      structure Word8Vector: UNSAFE_MONO_VECTOR
      structure Word16Array: UNSAFE_MONO_ARRAY
      structure Word16Vector: UNSAFE_MONO_VECTOR
      structure Word32Array: UNSAFE_MONO_ARRAY
      structure Word32Vector: UNSAFE_MONO_VECTOR
      structure Word64Array: UNSAFE_MONO_ARRAY
      structure Word64Vector: UNSAFE_MONO_VECTOR

      structure PackReal32Big : PACK_REAL
      structure PackReal32Little : PACK_REAL
      structure PackReal64Big : PACK_REAL
      structure PackReal64Little : PACK_REAL
      structure PackRealBig : PACK_REAL
      structure PackRealLittle : PACK_REAL
      structure PackWord16Big : PACK_WORD
      structure PackWord16Little : PACK_WORD
      structure PackWord32Big : PACK_WORD
      structure PackWord32Little : PACK_WORD
      structure PackWord64Big : PACK_WORD
      structure PackWord64Little : PACK_WORD
   end


Last edited on 2009-09-11 16:43:43 by WesleyTerpstra. mlton-20100608/doc/guide/Useless0000644000076600000240000000706711404435634015005 0ustar mtfstaff Useless - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Useless
Home  Index  
Useless is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

This pass:

  • removes components of tuples that are constants (use unification)

  • removes function arguments that are constants

  • builds some kind of dependence graph where

    • - a value of ground type is useful if it is an arg to a primitive - a tuple is useful if it contains a useful component - a constructor is useful if it contains a useful component or is used in a Case transfer

If a useful tuple is coerced to another useful tuple, then all of their components must agree (exactly). It is trivial to convert a useful value to a useless one.

Implementation

[WWW]useless.sig [WWW]useless.fun

Details and Notes

It is also trivial to convert a useful tuple to one of its useful components -- but this seems hard.

Suppose that you have a ref/array/vector that is useful, but the components aren't -- then the components are converted to type unit, and any primitive args must be as well.

Unify all handler arguments so that raise/handle has a consistent calling convention.


Last edited on 2006-11-02 17:56:21 by MatthewFluet. mlton-20100608/doc/guide/Users0000644000076600000240000002377711404435634014471 0ustar mtfstaff Users - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Users
Home  Index  
Here is a list of companies, projects, and courses that use or have used MLton. If you use MLton and are not here, please add your project with a brief description and a link. Thanks.

Companies

Projects

  • [WWW]ADATE, Automatic Design of Algorithms Through Evolution, a system for automatic programming i.e., inductive inference of algorithms. ADATE can automatically generate non-trivial and novel algorithms written in Standard ML.

  • [WWW]CIL, a compiler for SML based on intersection and union types.

  • [WWW]ConCert, a project investigating certified code for grid computing.

  • [WWW]Cooperative Internet hosting tools

  • [WWW]DesynchFS, a programming model and distributed file system for large clusters

  • [WWW]Guugelhupf, a simple search engine.

  • [WWW]HaMLet, a model implementation of Standard ML.

  • [WWW]KeplerCode, independent verification of the computational aspects of proofs of the Kepler conjecture and the Dodecahedral conjecture.

  • [WWW]Metis, a first-order prover used in the [WWW]HOL4 theorem proving system.

  • [WWW]mlftpd, an ftp daemon written in SML. TomMurphy is also working on [WWW]replacements for standard network services in SML. He also uses MLton to build his entries ([WWW]2001, [WWW]2002, [WWW]2004, [WWW]2005) in the annual ICFP programming contest.

  • [WWW]MLOPE, an offline partial evaluator for Standard ML.

  • [WWW]RML, a system for developing, compiling and debugging and teaching structural operational semantics (SOS) and natural semantics specifications.

  • [WWW]SMLNJtrans, a program for generating SML/NJ transcripts in LaTeX.

  • [WWW]SSA PRE, an implementation of Partial Redundancy Elimination for MLton.

  • Stabilizers, a modular checkpointing abstraction for concurrent functional programs.

  • [WWW]STING, self-adjusting computation, a paradigm of computing where programs can automatically adjust to changes to their data.

  • [WWW]Tina (Time Petri net Analyzer)

  • [WWW]Twelf an implementation of the LF logical framework.

  • [WWW]WaveScript, part of the [WWW]WaveScope sensor network project. Produces MLton code in backend. [WWW]Used on embedded devices.

Courses


Last edited on 2009-08-18 14:39:02 by SteveSims. mlton-20100608/doc/guide/Utilities0000644000076600000240000001304311404435634015324 0ustar mtfstaff Utilities - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Utilities
Home  Index  
This page is a collection of basic utilities used in the examples on various pages. See

for longer discussions on some of these utilities.

(* Operator precedence table *)
infix   8  * / div mod        (* +1 from Basis Library *)
infix   7  + - ^              (* +1 from Basis Library *)
infixr  6  :: @               (* +1 from Basis Library *)
infix   5  = <> > >= < <=     (* +1 from Basis Library *)
infix   4  <\ \>
infixr  4  </ />
infix   3  o
infix   2  >|
infixr  2  |<
infix   1  :=                 (* -2 from Basis Library *)
infix   0  before &

(* Some basic combinators *)
fun const x _ = x
fun cross (f, g) (x, y) = (f x, g y)
fun curry f x y = f (x, y)
fun fail e _ = raise e
fun id x = x

(* Product type *)
datatype ('a, 'b) product = & of 'a * 'b

(* Sum type *)
datatype ('a, 'b) sum = INL of 'a | INR of 'b

(* Some type shorthands *)
type 'a uop = 'a -> 'a
type 'a fix = 'a uop -> 'a
type 'a thunk = unit -> 'a
type 'a effect = 'a -> unit
type ('a, 'b) emb = ('a -> 'b) * ('b -> 'a)

(* Infixing, sectioning, and application operators *)
fun x <\ f = fn y => f (x, y)
fun f \> y = f y
fun f /> y = fn x => f (x, y)
fun x </ f = f x

(* Piping operators *)
val op>| = op</
val op|< = op\>


Last edited on 2006-08-13 14:40:14 by VesaKarvonen. mlton-20100608/doc/guide/ValueRestriction0000644000076600000240000004034411404435634016657 0ustar mtfstaff ValueRestriction - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ValueRestriction
Home  Index  
The value restriction is a rule that governs when type inference is allowed to polymorphically generalize a value declaration. In short, the value restriction says that generalization can only occur if the right-hand side of an expression is syntactically a value. For example, in
val f = fn x => x
val _ = (f "foo"; f 13)

the expression fn x => x is syntactically a value, so f has polymorphic type 'a -> 'a and both calls to f type check. On the other hand, in

val f = let in fn x => x end
val _ = (f "foo"; f 13)

the expression let in fn x => end end is not syntactically a value and so f can either have type int -> int or string -> string, but not 'a -> 'a. Hence, the program does not type check.

The Definition of Standard ML spells out precisely which expressions are syntactic values (it refers to such expressions as non-expansive). An expression is a value if it is of one of the following forms.

  • a constant (13, "foo", 13.0, ...)

  • a variable (x, y, ...)

  • a function (fn x => e)

  • the application of a constructor other than ref to a value (Foo v)

  • a type constrained value (v: t)

  • a tuple in which each field is a value (v1, v2, ...)

  • a record in which each field is a value {l1 = v1, l2 = v2, ...} 

  • a list in which each element is a value [v1, v2, ...]

Why the value restriction exists

The value restriction prevents a ref cell (or an array) from holding values of different types, which would allow a value of one type to be cast to another and hence would break type safety. If the restriction were not in place, the following program would type check.

val r: 'a option ref = ref NONE
val r1: string option ref = r
val r2: int option ref = r
val () = r1 := SOME "foo"
val v: int = valOf (!r2)

The first line violates the value restriction because ref NONE is not a value. All other lines are type correct. By its last line, the program has cast the string "foo" to an integer. This breaks type safety, because now we can add a string to an integer with an expression like v + 13. We could even be more devious, by adding the following two lines, which allow us to threat the string "foo" as a function.

val r3: (int -> int) option ref = r
val v: int -> int = valOf (!r3)

Eliminating the explicit ref does nothing to fix the problem. For example, we could replace the declaration of r with the following.

val f: unit -> 'a option ref = fn () => ref NONE
val r: 'a option ref = f ()

The declaration of f is well typed, while the declaration of r violates the value restriction because f () is not a value.

Unnecessarily rejected programs

Unfortunately, the value restriction rejects some programs that could be accepted.

val id: 'a -> 'a = fn x => x
val f: 'a -> 'a = id id

The type constraint on f requires f to be polymorphic, which is disallowed because id id is not a value. MLton reports the following type error.

Error: z.sml 2.19.
  Can't bind type variable: 'a.
    in: val 'a (f): ('a -> 'a) = id id

MLton indicates the inability to make f polymorphic by saying that it can't bind the type variable 'a at the declaration. MLton doesn't explicitly mention the value restriction, but that is the reason. If we leave the type constraint off of f

val id: 'a -> 'a = fn x => x
val f = id id

then the program succeeds; however, MLton gives us the following warning.

Warning: z.sml 2.1.
  Unable to locally determine type of variable: f.
    type: ??? -> ???
    in: val f = id id

This warning indicates that MLton couldn't polymorphically generalize f, nor was there enough context using f to determine its type. This in itself is not a type error, but it it is a hint that something is wrong with our program. Using f provides enough context to eliminate the warning.

val id: 'a -> 'a = fn x => x
val f = id id
val _ = f 13

But attempting to use f as a polymorphic function will fail.

val id: 'a -> 'a = fn x => x
val f = id id
val _ = f 13
val _ = f "foo"

Alternatives to the value restriction

There would be nothing wrong with treating f as polymorphic in

val id: 'a -> 'a = fn x => x
val f = id id

One might think that the value restriction could be relaxed, and that only types involving ref should be disallowed. Unfortunately, the following example shows that even the type 'a -> 'a can cause problems. If this program were allowed, then we could cast an integer to a string (or any other type).

val f: 'a -> 'a =
   let
      val r: 'a option ref = ref NONE
   in
      fn x =>
      let
         val y = !r
         val () = r := SOME x
      in
         case y of
            NONE => x
          | SOME y => y
      end
   end
val _ = f 13
val _ = f "foo"

The previous version of Standard ML took a different approach (MilnerEtAl90, Tofte90, ImperativeTypeVariable) than the value restriction. It encoded information in the type system about when ref cells would be created, and used this to prevent a ref cell from holding multiple types. Although it allowed more programs to be type checked, this approach had significant drawbacks. First, it was significantly more complex, both for implementers and for programmers. Second, it had an unfortunate interaction with the modularity, because information about ref usage was exposed in module signatures. This either prevented the use of references for implementing a signature, or required information that one would like to keep hidden to propagate across modules.

In the early nineties, Andrew Wright studied about 250,000 lines of existing SML code and discovered that it did not make significant use of the extended typing ability, and proposed the value restriction as a simpler alternative (Wright95). This was adopted in the revised Definition.

Working with the value restriction

One technique that works with the value restriction is EtaExpansion. We can use eta expansion to make our id id example type check follows.

val id: 'a -> 'a = fn x => x
val f: 'a -> 'a = fn z => (id id) z
This solution means that the computation (in this case id id) will be performed each time f is applied, instead of just once when f is declared. In this case, that is not a problem, but it could be if the declaration of f performs substantial computation or creates a shared data structure.

Another technique that sometimes works is to move a monomorphic computation prior to a (would-be) polymorphic declaration so that the expression is a value. Consider the following program, which fails due to the value restriction.

datatype 'a t = A of string | B of 'a
val x: 'a t = A (if true then "yes" else "no")
It is easy to rewrite this program as
datatype 'a t = A of string | B of 'a
local
   val s = if true then "yes" else "no"
in 
   val x: 'a t = A s
end

The following example (taken from Wright95) creates a ref cell to count the number of times a function is called.

val count: ('a -> 'a) -> ('a -> 'a) * (unit -> int) =
   fn f =>
   let
      val r = ref 0
   in
      (fn x => (r := 1 + !r; f x), fn () => !r)
   end
val id: 'a -> 'a = fn x => x
val (countId: 'a -> 'a, numCalls) = count id

The example does not type check, due to the value restriction. However, it is easy to rewrite the program, staging the ref cell creation before the polymorphic code.

datatype t = T of int ref
val count1: unit -> t = fn () => T (ref 0)
val count2: t * ('a -> 'a) -> (unit -> int) * ('a -> 'a) =
   fn (T r, f) => (fn () => !r, fn x => (r := 1 + !r; f x))
val id: 'a -> 'a = fn x => x
val t = count1 ()
val countId: 'a -> 'a = fn z => #2 (count2 (t, id)) z
val numCalls = #1 (count2 (t, id))

Of course, one can hide the constructor T inside a local or behind a signature.

Also see


Last edited on 2007-08-15 22:07:43 by MatthewFluet. mlton-20100608/doc/guide/VariableArityPolymorphism0000644000076600000240000001764211404435634020543 0ustar mtfstaff VariableArityPolymorphism - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION VariableArityPolymorphism
Home  Index  
Standard ML programmers often face the problem of how to provide a variable-arity polymorphic function. For example, suppose one is defining a combinator library, e.g. for parsing or pickling. The signature for such a library might look something like the following.
signature COMBINATOR =
   sig
      type 'a t

      val int: int t
      val real: real t
      val string: string t
      val unit: unit t
      val tuple2: 'a1 t * 'a2 t -> ('a1 * 'a2) t
      val tuple3: 'a1 t * 'a2 t * 'a3 t -> ('a1 * 'a2 * 'a3) t
      val tuple4: 'a1 t * 'a2 t * 'a3 t * 'a4 t 
                  -> ('a1 * 'a2 * 'a3 * 'a4) t
      ...
   end

The question is how to define a variable-arity tuple combinator. Traditionally, the only way to take a variable number of arguments in SML is to put the arguments in a list (or vector) and pass that. So, one might define a tuple combinator with the following signature.

val tupleN: 'a list -> 'a list t

The problem with this approach is that as soon as one places values in a list, they must all have the same type. So, programmers often take an alternative approach, and define a family of tuple<N> functions, as we see in the COMBINATOR signature above.

The family-of-functions approach is ugly for many reasons. First, it clutters the signature with a number of functions when there should really only be one. Second, it is closed, in that there are a fixed number of tuple combinators in the interface, and should a client need a combinator for a large tuple, he is out of luck. Third, this approach often requires a lot of duplicate code in the implementation of the combinators.

Fortunately, using Fold01N and products, one can provide an interface and implementation that solves all these problems. Here is a simple pickling module that converts values to strings.

structure Pickler =
   struct
      type 'a t = 'a -> string

      val unit = fn () => ""

      val int = Int.toString

      val real = Real.toString

      val string = id

      type 'a accum = 'a * string list -> string list
         
      val tuple =
         fn z =>
         Fold01N.fold
         {finish = fn ps => fn x => concat (rev (ps (x, []))),
          start = fn p => fn (x, l) => p x :: l,
          zero = unit}
         z

      val ` =
         fn z =>
         Fold01N.step1
         {combine = (fn (p, p') => fn (x & x', l) => p' x' :: "," :: p (x, l))}
         z
   end

If one has n picklers of types

val p1: a1 Pickler.t
val p2: a2 Pickler.t
...
val pn: an Pickler.t

then one can construct a pickler for n-ary products as follows.

tuple `p1 `p2 ... `pn $ : (a1 & a2 & ... & an) Pickler.t

For example, with Pickler in scope, one can prove the following equations.

"" = tuple $ ()
"1" = tuple `int $ 1
"1,2.0" = tuple `int `real $ (1 & 2.0)
"1,2.0,three" = tuple `int `real `string $ (1 & 2.0 & "three")

Here is the signature for Pickler. It shows why the accum type is useful.

signature PICKLER =
   sig
      type 'a t
         
      val int: int t
      val real: real t
      val string: string t
      val unit: unit t

      type 'a accum
      val ` : ('a accum, 'b t, ('a, 'b) prod accum,
               'z1, 'z2, 'z3, 'z4, 'z5, 'z6, 'z7) Fold01N.step1
      val tuple: ('a t, 'a accum, 'b accum, 'b t, unit t,
                  'z1, 'z2, 'z3, 'z4, 'z5) Fold01N.t
   end      

structure Pickler: PICKLER = Pickler


Last edited on 2006-03-21 22:06:02 by StephenWeeks. mlton-20100608/doc/guide/Variant0000644000076600000240000000433511404435634014761 0ustar mtfstaff Variant - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Variant
Home  Index  
A variant is an arm of a datatype declaration. For example, the datatype
datatype t = A | B of int | C of real

has three variants: A, B, and C.


Last edited on 2005-12-02 03:13:02 by StephenWeeks. mlton-20100608/doc/guide/VesaKarvonen0000644000076600000240000001445211404435634015760 0ustar mtfstaff VesaKarvonen - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION VesaKarvonen
Home  Index  
Vesa Karvonen is a student at the [WWW]University of Helsinki. His interests lie in programming techniques that allow complex programs to be expressed clearly and concisely and the design and implementation of programming languages.

vesa-in-mlton-t-shirt.jpg

Things he'd like to see for SML and hopes to be able to contribute towards:

  • A practical tool for documenting libraries. Preferably one that is based on extracting the documentation from source code comments.

  • A good IDE. Possibly an enhanced SML mode (esml-mode) for Emacs. Google for [WWW]SLIME video to get an idea of what he'd like to see. Some specific notes:

    • show type at point

    • robust, consistent indentation

    • show documentation

    • jump to definition (see EmacsDefUseMode)

    EmacsBgBuildMode has also been written for working with MLton.
  • Documented and cataloged libraries. Perhaps something like [WWW]Boost, but for SML libraries. Here is a partial list of libraries, tools, and frameworks Vesa is or has been working on:

    • Asynchronous Programming Library ([WWW]README)

    • Extended Basis Library ([WWW]README)

    • Generic Programming Library ([WWW]README)

    • Pretty Printing Library ([WWW]README)

    • Random Generator Library ([WWW]README)

    • RPC (Remote Procedure Call) Library ([WWW]README)

    • [WWW]SDL Binding ([WWW]README)

    • Unit Testing Library ([WWW]README)

    • Use Library ([WWW]README)

    • Windows Library ([WWW]README)

    Note that most of these libraries have been ported to several SML implementations.


Last edited on 2008-10-20 06:09:05 by VesaKarvonen. mlton-20100608/doc/guide/WantedPages0000644000076600000240000001020311404435634015546 0ustar mtfstaff WantedPages - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WantedPages
Home  Index  


Last edited on 2010-03-02 15:11:48 by MatthewFluet. mlton-20100608/doc/guide/WarnUnusedAnomalies0000644000076600000240000001513111404435634017275 0ustar mtfstaff WarnUnusedAnomalies - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WarnUnusedAnomalies
Home  Index  
The warnUnused MLBasis annotation can be used to report unused identifiers. This can be useful for catching bugs and for code maintenance (e.g., eliminating dead code). However, the warnUnused annotation can sometimes behave in counter-intuitive ways. This page gives some of the anomalies that have been reported.
  • Functions whose only uses are recursive uses within their bodies are not warned as unused:

    local
    fun foo () = foo () : unit
    val bar = let fun baz () = baz () : unit in baz end
    in
    end
    

    Warning: z.sml 3.5.
      Unused variable: bar.
    
  • Components of actual functor argument that are necessary to match the functor argument signature but are unused in the body of the functor are warned as unused:

    functor Warning (type t val x : t) = struct
       val y = x
    end
    structure X = Warning (type t = int val x = 1)
    

    Warning: z.sml 4.29.
      Unused type: t.
    
  • No component of a functor result is warned as unused. In the following, the only uses of f2 are to match the functor argument signatures of functor G and functor H and there are no uses of z:

    functor F(structure X : sig type t end) = struct
       type t = X.t
       fun f1 (_ : X.t) = ()
       fun f2 (_ : X.t) = ()
       val z = ()
    end
    functor G(structure Y : sig
                               type t
                               val f1 : t -> unit
                               val f2 : t -> unit
                               val z : unit
                            end) = struct
       fun g (x : Y.t) = Y.f1 x
    end
    functor H(structure Y : sig
                               type t
                               val f1 : t -> unit
                               val f2 : t -> unit
                               val z : unit
                            end) = struct
       fun h (x : Y.t) = Y.f1 x
    end
    functor Z() = struct
       structure S = F(structure X = struct type t = unit end)
       structure SG = G(structure Y = S)
       structure SH = H(structure Y = S)
    end
    structure U = Z()
    val _ = U.SG.g ()
    val _ = U.SH.h ()
    


Last edited on 2007-11-01 18:32:19 by MatthewFluet. mlton-20100608/doc/guide/WebSite0000644000076600000240000001072111404435635014714 0ustar mtfstaff WebSite - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WebSite
Home  Index  
This web site is a Wiki and is implemented using MoinMoin. If you're new to Wikis or to MoinMoin, they have a lot of [WWW]help pages. We have customized the look and feel, so some of their descriptions may not apply.

Next Steps

Site Maintenance

  • OrphanedPages. Pages that no other page links to. Please help by linking to these.

  • WantedPages. Pages that don't exist and the pages that link to them. Please help fill these in.

  • [WWW]OldPages. Pages with the oldest modification times.

  • PageSize. Pages sorted in decreasing order of size.

  • [WWW]RecentChanges. Pages that have been changed recently.

Navigation

The box in the upper-right corner is to Google search the entire web site. Also in the upper right is a link to a TitleIndex of all pages.

You can also do a search of just the wiki.

Wiki full-text search

 
Display context of search results
Case-sensitive searching

Wiki title search

 


Last edited on 2007-11-08 03:31:18 by MatthewFluet. mlton-20100608/doc/guide/WesleyTerpstra0000644000076600000240000000524611404435634016354 0ustar mtfstaff WesleyTerpstra - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WesleyTerpstra
Home  Index  
Wesley W. Terpstra is a PhD student at the Technische Universität Darmstadt (Germany).

Research interests

  • Distributed systems (P2P)

  • Number theory (Error-correcting codes)

My interest in SML is centered on the fact the the language is able to directly express ideas from number theory which are important for my work. Modules and Functors seem to be a very natural basis for implementing many algebraic structures. MLton provides an ideal platform for actual implementation as it is fast and has unboxed words.

Things I would like from MLton in the future:

  • Some better optimization of mathematical expressions

  • IPv6 and multicast support

  • A complete GUI toolkit like mGTK

  • More supported platforms so that applications written under MLton have a wider audience


Last edited on 2004-12-19 03:55:34 by WesleyTerpstra. mlton-20100608/doc/guide/WholeProgramOptimization0000644000076600000240000000527111404435635020373 0ustar mtfstaff WholeProgramOptimization - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WholeProgramOptimization
Home  Index  
Whole-program optimization is a compilation technique in which optimizations operate over the entire program. This allows the compiler many optimization opportunities that are not available when analyzing modules separately (as with separate compilation).

Most of MLton's optimizations are whole-program optimizations. Because MLton compiles the whole program at once, it can perform optimization across module boundaries. As a consequence, MLton often reduces or eliminates the run-time penalty that arises with separate compilation of SML features such as functors, modules, polymorphism, and higher-order functions. MLton takes advantage of having the entire program to perform transformations such as: defunctorization, monomorphisation, higher-order control-flow analysis, inlining, unboxing, argument flattening, redundant-argument removal, constant folding, and representation selection. Whole-program compilation is an integral part of the design of MLton and is not likely to change.


Last edited on 2004-12-06 06:01:10 by StephenWeeks. mlton-20100608/doc/guide/WikiMacros0000644000076600000240000001135611404435634015426 0ustar mtfstaff WikiMacros - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WikiMacros
Home  Index  
Here are the wiki macros available in addition to the usual MoinMoin ones.
  • [[Cite(anchor[,text])]] displays text as a link to the corresponding reference on the References page.
    Examples: a paper

  • [[DownloadSVN(pathToFile)]] displays a download link to the ViewSVN page for pathToFile.
    Examples: [WWW]Makefile, [WWW]main.sml

  • [[IncludeSVN(pathToFile[,type][,[start]:[end]...])]] textually includes the latest contents of pathToFile. The contents are formatted with Enscript using highlighting mode type, as in the !#syntax processor; if type is omitted, the macro uses the extension of pathToFile. A sequence of ranges may be used to specify the lines to be formatted; in each range, the absence of start implicitly denotes the start of the file and the absence of end implicitly denotes the end of the file; furthermore, negative start and end may be used to index relative to the end of the file.
    Example:

    (* Copyright (C) 2009 Matthew Fluet.
     * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh
     *    Jagannathan, and Stephen Weeks.
     * Copyright (C) 1997-2000 NEC Research Institute.
     *
     * MLton is released under a BSD-style license.
     * See the file MLton-LICENSE for details.
     *)
    
    structure Main = Main ()
    

  • [[ViewSVN(pathToFile)]] displays a link to the ViewSVN page for pathToFile.
    Examples: [WWW]Makefile, [WWW]main.sml

  • [[ViewSVNDir(pathToDir)]] displays a link to the ViewSVN page for pathToDir.
    Example: [WWW]main

  • [[ViewSVNRev(rev)]] displays a link to the ViewSVN page for revision rev.
    Example: [WWW]4242


Last edited on 2007-07-30 18:04:50 by MatthewFluet. mlton-20100608/doc/guide/WikiName0000644000076600000240000000343611404435634015062 0ustar mtfstaff WikiName - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WikiName
Home  Index  
A WikiName is a word that uses capitalized words. WikiNames automatically become hyperlinks to the WikiName's page.


Last edited on 2005-12-02 03:20:19 by StephenWeeks. mlton-20100608/doc/guide/WikiTool0000644000076600000240000001047211404435634015115 0ustar mtfstaff WikiTool - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WikiTool
Home  Index  
We have written a simple command-line tool that makes it possible to edit wiki pages using your favorite text editor instead of within a browser text box. The tool provides a CVS/SVN-like command-line interface that can be used to update local copies of files from the web and to commit local modifications to the web.

The tool is written in SML (of course) and is available in the MLton Sources ([WWW]wiki). To compile it, you need to have the latest SVN of the MLton library sources, and point the MLB path variable MLTON_SRC_LIB at the lib/mlton dir in the sources.

Here's a quick tutorial on how to use the tool

  1. Create a new directory for your local copy of the wiki files.

  2. In that directory, login.

     wiki login http://mlton.org StephenWeeks <my password>

  3. Checkout (the raw wiki markup) files with commands like:

     wiki checkout Home
     wiki checkout Index Documentation

  4. Edit the files using your favorite text editor.

  5. Commit your changes with a command like

     wiki commit UserGuide

  6. Logout.

     wiki logout

That's it for the simple use. There are also other commands like CVS/SVN.

  • Download the new version of a file from the web if there is one.

     wiki update UserGuide

  • Schedule a new file to be added (must be later committed, just like CVS/SVN) .

     wiki add NewFile

  • Rename a page

     wiki rename OldFile NewFile

  • Remove a page

     wiki remove DeletedFile

  • Attach files to a page

     wiki attach <file> <attachment>

  • Detach files to a page

     wiki detach <file> <attachment>

rename and remove shouldn't work for most people on mlton.org because of the way our AccessControl is set up.

This code is a two-day hack and is not widely used. But we've found it useful. Please send bug reports to [MAILTO]MLton@mlton.org.


Last edited on 2007-08-13 18:33:50 by MatthewFluet. mlton-20100608/doc/guide/WishList0000644000076600000240000000663411404435634015127 0ustar mtfstaff WishList - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION WishList
Home  Index  
This page is mainly for recording recurring feature requests. If you have a new feature request, you probably want to query interest on one of the mailing lists first.

Please be aware of MLton's policy on language changes. Nonetheless, we hope to provide support for some of the "immediate" SuccessorML proposals in a future release.

Support for link options in ML Basis files

Introduce a mechanism to specify link options in ML Basis files. For example, generalizing a bit, a ML Basis declaration of the form

option "option"

could be introduced whose semantics would be the same (as closely as possible) as if the option string were specified on the compiler command line.

The main motivation for this is that a MLton library that would introduce bindings (through FFI) to an external library could be packaged conveniently as a single MLB file. For example, to link with library foo the MLB file would simply contain:

option "-link-opt -lfoo"

Similar feature requests have been discussed previously on the mailing lists:


Last edited on 2007-07-08 22:53:40 by MatthewFluet. mlton-20100608/doc/guide/XML0000644000076600000240000002025211404435634014011 0ustar mtfstaff XML - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION XML
Home  Index  
XML is an IntermediateLanguage, translated from CoreML by Defunctorize, optimized by XMLSimplify, and translated by Monomorphise to SXML.

Description

XML is polymorphic, higher-order, with flat patterns. Every XML expression is annotated with its type. Polymorphic generalization is made explicit through type variables annotating val and fun declarations. Polymorphic instantiation is made explicit by specifying type arguments at variable references. XML patterns can not be nested and can not contain wildcards, constraints, flexible records, or layering.

Implementation

[WWW]xml.sig [WWW]xml.fun
[WWW]xml-tree.sig [WWW]xml-tree.fun

Type Checking

XML also has a type checker, used for debugging. At present, the type checker is also the best specification of the type system of XML. If you need more details, the type checker ([WWW]type-check.sig,[WWW]type-check.fun), is pretty short.

Since the type checker does not affect the output of the compiler (unless it reports an error), it can be turned off. The type checker recursively descends the program, checking that the type annotating each node is the same as the type synthesized from the types of the expressions subnodes.

Details and Notes

XML uses the same atoms as Core ML, hence all identifiers (constructors, variables, etc.) are unique and can have properties attached to them. Finally, XML has a simplifier (XMLShrink), which implements a reduction system.

Types

XML types are either type variables or applications of n-ary type constructors. There are many utility functions for constructing and destructing types involving built-in type constructors.

A type scheme binds list of type variables in a type. The only interesting operation on type schemes is the application of a type scheme to a list of types, which performs a simultaneous substitution of the type arguments for the bound type variables of the scheme. For the purposes of type checking, it is necessary to know the type scheme of variables, constructors, and primitives. This is done by associating the scheme with the identifier using its property list. This approach is used instead of the more traditional environment approach for reasons of speed.

XmlTree

Before defining XML, the signature for language XML, we need to define an auxiliary signature XML_TREE, that contains the datatype declarations for the expression trees of XML. This is done solely for the purpose of modularity -- it allows the simplifier and type checker to be defined by separate functors (which take a structure matching XML_TREE). Then, Xml is defined as the signature for a module containing the expression trees, the simplifier, and the type checker.

Both constructors and variables can have type schemes, hence both constructor and variable references specify the instance of the scheme at the point of references. An instance is specified with a vector of types, which corresponds to the type variables in the scheme.

XML patterns are flat (i.e. not nested). A pattern is a constructor with an optional argument variable. Patterns only occur in case expressions. To evaluate a case expression, compare the test value sequentially against each pattern. For the first pattern that matches, destruct the value if necessary to bind the pattern variables and evaluate the corresponding expression. If no pattern matches, evaluate the default. All patterns of a case statement are of the same variant of Pat.t, although this is not enforced by ML's type system. The type checker, however, does enforce this. Because tuple patterns are irrefutable, there will only ever be one tuple pattern in a case expression and there will be no default.

XML contains value, exception, and mutually recursive function declarations. There are no free type variables in XML. All type variables are explicitly bound at either a value or function declaration. At some point in the future, exception declarations may go away, and exceptions may be represented with a single datatype containing a unit ref component to implement genericity.

XML expressions are like those of CoreML, with the following exceptions. There are no records expressions. After type inference, all records (some of which may have originally been tuples in the source) are converted to tuples, because once flexible record patterns have been resolved, tuple labels are superfluous. Tuple components are ordered based on the field ordering relation. XML eta expands primitives and constructors so that there are always fully applied. Hence, the only kind of value of arrow type is a lambda. This property is useful for flow analysis and later in code generation.

An XML program is a list of toplevel datatype declarations and a body expression. Because datatype declarations are not generative, the defunctorizer can safely move them to toplevel.


Last edited on 2006-11-02 17:35:47 by MatthewFluet. mlton-20100608/doc/guide/XMLShrink0000644000076600000240000001060611404435634015172 0ustar mtfstaff XMLShrink - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION XMLShrink
Home  Index  
XMLShrink is an optimization pass for the XML IntermediateLanguage, invoked from XMLSimplify.

Description

This pass performs optimizations based on a reduction system.

Implementation

[WWW]shrink.sig [WWW]shrink.fun

Details and Notes

The simplifier is based on Shrinking Lambda Expressions in Linear Time.

The source program may contain functions that are only called once, or not even called at all. Match compilation introduces many such functions. In order to reduce the program size, speed up later phases, and improve the flow analysis, a source to source simplifier is run on XML after type inference and match compilation.

The simplifier implements the reductions shown below. The reductions eliminate unnecessary declarations (see the side constraint in the figure), applications where the function is immediate, and case statements where the test is immediate. Declarations can be eliminated only when the expression is nonexpansive (see Section 4.7 of the Definition), which is a syntactic condition that ensures that the expression has no effects (assignments, raises, or nontermination). The reductions on case statements do not show the other irrelevant cases that may exist. The reductions were chosen so that they were strongly normalizing and so that they never increased tree size.

  • let x = e1 in e2
    
    reduces to
    e2 [x -> e1] 
    
    if e1 is a constant or variable or if e1 is nonexpansive and x occurs zero or one time in e2

  • (fn x => e1) e2
    
    reduces to
    let x = e2 in e1
    

  • e1 handle e2
    
    reduces to
    e1
    
    if e1 is nonexpansive

  • case let d in e end of p1 => e1 ...
    
    reduces to
    let d in case e of p1 => e1 ... end
    

  • case C e1 of C x => e2
    
    reduces to
    let x = e1 in e2
    


Last edited on 2006-11-02 17:33:47 by MatthewFluet. mlton-20100608/doc/guide/XMLSimplify0000644000076600000240000000563211404435635015534 0ustar mtfstaff XMLSimplify - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION XMLSimplify
Home  Index  
The optimization passes for the XML IntermediateLanguage are collected and controlled by the XmlSimplify functor ([WWW]xml-simplify.sig,[WWW]xml-simplify.fun).

The following optimization passes are implemented:

The optimization passes can be controlled from the command-line by the options

  • diag-pass <pass> -- keep diagnostic info for pass

  • drop-pass <pass> -- omit optimization pass

  • keep-pass <pass> -- keep the results of pass

  • xml-passes <passes> -- xml optimization passes


Last edited on 2006-11-02 17:40:39 by MatthewFluet. mlton-20100608/doc/guide/XMLSimplifyTypes0000644000076600000240000000606511404435634016561 0ustar mtfstaff XMLSimplifyTypes - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION XMLSimplifyTypes
Home  Index  
XMLSimplifyTypes is an optimization pass for the XML IntermediateLanguage, invoked from XMLSimplify.

Description

This pass simplifies types in an XML program, eliminating all unused type arguments.

Implementation

[WWW]simplify-types.sig [WWW]simplify-types.fun

Details and Notes

It first computes a simple fixpoint on all the datatype declarations to determine which datatype tycon args are actually used. Then it does a single pass over the program to determine which polymorphic declaration type variables are used, and rewrites types to eliminate unused type arguments.

This pass should eliminate any spurious duplication that the Monomorphise pass might perform due to phantom types.


Last edited on 2006-11-02 17:56:47 by MatthewFluet. mlton-20100608/doc/guide/Zone0000644000076600000240000000732211404435634014267 0ustar mtfstaff Zone - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION Zone
Home  Index  
Zone is an optimization pass for the SSA2 IntermediateLanguage, invoked from SSA2Simplify.

Description

This pass breaks large SSA2 functions into zones, which are connected subgraphs of the dominator tree. For each zone, at the node that dominates the zone (the "zone root"), it places a tuple collecting all of the live variables at that node. It replaces any variables used in that zone with offsets from the tuple. The goal is to decrease the liveness information in large SSA functions.

Implementation

[WWW]zone.sig [WWW]zone.fun

Details and Notes

Compute strongly-connected components to avoid put tuple constructions in loops.

There are two (expert) flags that govern the use of this pass

  -max-function-size <n>
  -zone-cut-depth <n> 
Zone splitting only works when the number of basic blocks in a function is > n. The n used to cut the dominator tree is set by -zone-cut-depth.

There is currently no attempt to be safe-for-space. That is, the tuples are not restricted to containing only "small" values.

In the HOL program, the particular problem is the main function, which has 161,783 blocks and 257,519 variables -- the product of those two numbers being about 41 billion. Now, we're not likely going to need that much space since we use a sparse representation. But even 1/100th would really hurt. And of course this rules out bit vectors.


Last edited on 2006-11-02 17:31:40 by MatthewFluet. mlton-20100608/doc/guide/ZZZOrphanedPages0000644000076600000240000000367011404435634016514 0ustar mtfstaff ZZZOrphanedPages - MLton Standard ML Compiler (SML Compiler)
MLton MLTONWIKIVERSION ZZZOrphanedPages
Home  Index  
The contents of these pages have been moved to other pages.

These templates are used by other pages.


Last edited on 2009-06-19 16:14:27 by MatthewFluet. mlton-20100608/doc/hacker-guide/0000755000076600000240000000000011404470406014654 5ustar mtfstaffmlton-20100608/doc/hacker-guide/.ignore0000644000076600000240000000021111404435633016135 0ustar mtfstaff*~ TAGS core macros.aux main main.aux main.bbl main.blg main.dvi main.idx main.log main.pdf main.ps main.ps.gz main.toc old structure.ps mlton-20100608/doc/hacker-guide/abstract.tex0000644000076600000240000000072511404435633017210 0ustar mtfstaffThis document describes how to hack {\mlton}, a whole-program optimizing compiler for the \htmladdnormallink{Standard ML} {http://cm.bell-labs.com/cm/cs/what/smlnj/sml.html} programming language. The {\mlton} homepage is \absolutelink{}. The document contains an overview of the source tree, a description of the programming style used in {\mlton}, and delves into the bowels of the compiler and associated tools. This document is very incomplete. mlton-20100608/doc/hacker-guide/backend.tex0000644000076600000240000000031711404435633016771 0ustar mtfstaffFor limit checks, when the fixed size allocations that follow a variable size allocation are stored in the ``bytesAllocated'' field of the limitCheck field in the AllocateArray variant of machine-output.sig mlton-20100608/doc/hacker-guide/basis-library.tex0000644000076600000240000001423511404435633020151 0ustar mtfstaff\chap{The basis library}{basis-library} The basis library is implemented with about 12,000 lines of SML code. There is roughly one file for each signature and structure that the library specification defines. The files are grouped in directories in the same way that the corresponding modules are grouped in the basis library documentation. Here is an overview of the {\tt basis-library} directory. \begin{description} \place{arrays-and-vectors general integer io list posix real system text} SML code for basis library modules. \place{basis.sml} Automatically constructed by {\tt bin/check-basis}. Used to type check the basis libary under {\smlnj}. \place{bind-basis} A list of the files (in order) that define what is exported by the basis library. \place{build-basis} A list of the files (in order) used to construct the basis library. \place{Makefile} Only has a target to clean the directory. \place{misc} SML code that didn't fit anywhere else. In particular, the {\tt Primitive} structure. \place{mlton} The {\tt MLton} structure, which is not part of the standard basis library. For more details on what {\tt MLton} provides, see the {\userguide}. \place{sml-nj} The {\tt SMLofNJ} and {\tt Unsafe} structures, which are not part of the standard basis library. \place{top-level} Files describing the overloads, infixes, modules, types, and values that the basis library makes available to user programs. \end{description} \subsec{How {\mlton} builds the basis environment}{build-basis-env} The {\tt forceBasisLibrary} function in \code{\tt mlton/main/compile.sml} builds the basis environment that is used to compile user programs. Conceptually, the basis environment is constructed in two steps. First, all of the files in {\tt build-basis} are concatenated together and evaluated to produce an environment $E$. Then, all of the files in {\tt bind-basis} are concatenated and evaluated in environment $E$ to produce a new environment $E'$, which is the top-level environment. Another way to view it is that every user program is prefixed by the following. \begin{verbatim} local in end \end{verbatim} This view is not strictly accurate because some of the files are not SML (they use the {\tt \_prim}, {\tt \_ffi}, and {\tt \_overload} syntaxes) and because SML does not allow local functor or signature declarations. Here is a description of the basis files that are not SML. \begin{description} \place{misc/primitive.sml} Defines the {\tt Primitive} structure, which binds (via the {\tt \_prim} syntax) all of the primitives provided by the compiler that the basis library uses. \place{mlton/syslog.sml} Defines constants and FFI routines used to implement {\tt MLton.Syslog}. \place{posix/primitive.sml} Defines the {\tt PosixPrimitive} structrue, which binds the constants and FFI routines used to implement the {\tt Posix} structure. \place{top-level/overloads.sml} Defines the overloaded variables available at the top-level the {\tt \_overload} syntax: {\tt \_overload $x$: $ty$ as $y_0$ and $y_1$ and ...} \end{description} \subsection{Modifying the basis library} If you modify the basis library, you should first check that your modifications are type correct using the {\tt bin/check-basis} script. Since this {\mlton} does not have a proper typechecker, this script uses {\smlnj}. First, it concatenates the files as described in \secref{build-basis-env} into one file, {\tt basis.sml}. It also replaces the nonstandard syntax ({\tt \_prim}, etc.) and declares the toplevel types to match {\mlton}'s (necessary since {\smlnj} uses 31 bits while {\mlton} uses 32). It then feeds {\tt basis.sml} to {\smlnj}. If there are no type errors, a message like the following will appear. \begin{verbatim} stdIn:12213.1-12213.14 Error: operator is not a function [tycon mismatch] operator: unit in expression: () () \end{verbatim} This error message is intentionally introduced by {\tt check-basis} at the end of {\tt basis.sml} to make it clear that {\smlnj} reached the end of {\tt basis.sml} and has hence type checked the entire basis. Once you have a basis library that type checks, you need to create a new version of {\mlton} that uses this library. {\mlton} preprocess the basis library to create a {\tt world.mlton} file that contains the basis environment. The {\tt world.mlton} file is stored in the {\tt lib} directory and is loaded by {\tt mlton} when compiling a user program (see the {\tt bin/mlton} script). To build a new {\tt world.mlton}, run {\tt make world} from within the sources directory. \subsection{The {\tt misc} directory} \begin{description} \place{cleaner.sig} Functions for register ``cleaning'' functions to be run at certain times, in particular at program exit. The {\tt TextIO} module uses these cleaners to ensure that IO buffers are flushed upon exit. \place{suffix.sml} Code that is (conceptually) concatenated on to the end of every user program. It just calls {\tt OS.Process.exit}. The {\tt forceBasisLibrary} function ensures that {\tt suffix.sml} is elaborated in an environment where the basis library {\tt OS} structure is available. \place{top-level-handler.sml} This defines the top level exception handler that is installed (via a special compiler primitive) in the basis library, before any user code is run. \end{description} \subsection{Dead-code elimination} In order to compile small programs rapidly and to cut down on executable size, {\tt mlton} runs a pass of dead-code elimination ({\tt mlton/core-ml/dead-code.sig}) to eliminate as much of the basis library as possible. The dead-code elimination algorithm used is not safe in general, and only works because the basis library implementation has special properties: \begin{itemize} \item it terminates \item it performs no I/O \item it doesn't side-effect top-level variables \end{itemize} The dead code elimination simply includes the minimal set of declarations from the basis so that their are no free variables in the user program (or basis). Hence, if you do something like the following in the basis, it will break. \begin{verbatim} val r = ref 13 val _ = r := 14 \end{verbatim} The dead code elimination will remove the {\tt val \_ = ...} binding. mlton-20100608/doc/hacker-guide/macros.tex0000644000076600000240000000345511404435633016674 0ustar mtfstaff\newcommand{\absolutelink}[1]{\link{\makeurl{#1}}} \newcommand{\addr}{mlton.org} \newcommand{\chaplab}[1]{\label{chapter:#1}} \newcommand{\chapref}[1]{Chapter~\ref{chapter:#1}} \newcommand{\chap}[2]{\chapter{#1}{\chaplab{#2}}} \newcommand{\code}[1]{\htmladdnormallink{{\tt #1}}{../../#1}} \newcommand{\deflab}[1]{\label{definition:#1}} \newcommand{\defref}[1]{Definition~\ref{definition:#1}} \newcommand{\figBegin}{\begin{figure}\begin{boxit}} \newcommand{\figEnd}[2]{\caption{#1}\figlab{#2}\end{boxit}\end{figure}} \newcommand{\figlab}[1]{\label{figure:#1}} \newcommand{\figref}[1]{Figure~\ref{figure:#1}} \newcommand{\lemlab}[1]{\label{lemma:#1}} \newcommand{\lemref}[1]{Lemma~\ref{lemma:#1}} \newcommand{\link}[1]{\htmladdnormallink{{\tt #1}}{#1}} \newcommand{\mailto}[1]{\htmladdnormallink{{\tt #1}}{mailto:#1}} \newcommand{\makeurl}[1]{http://www.\addr/MLton/#1} \newcommand{\mltonmail}{\mailto{MLton@\addr}} \newcommand{\mlton}{MLton} \newcommand{\mosml}{Moscow ML} \newcommand{\place}[1]{\item[\tt #1]\hspace{1in}\\} \newcommand{\seclab}[1]{\label{section:#1}} \newcommand{\secref}[1]{Section~\ref{section:#1}} \newcommand{\smlnj}{SML/NJ} \newcommand{\subsecc}[2]{\subsubsection{#1}\seclab{#2}} \newcommand{\subsec}[2]{\subsection{#1}\seclab{#2}} \newcommand{\subsubsec}[2]{\subsubsection{#1}\label{section:#2}} \newcommand{\tabBegin}{\begin{table}} \newcommand{\tablab}[1]{\label{table:#1}} \newcommand{\tabref}[1]{Table~\ref{table:#1}} \newcommand{\thmlab}[1]{\label{theorem:#1}} \newcommand{\thmref}[1]{Theorem~\ref{theorem:#1}} \newcommand{\userguide}{{\mlton} User Guide} \newcommand{\version}{VERSION} \renewcommand{\sec}[2]{\section{#1}\seclab{#2}} \newenvironment{boxit}{\vbox\bgroup\hrule\hbox\bgroup\vrule\kern3pt\vbox\bgroup\kern3pt\advance\hsize by -6.8pt\relax}{\par\kern3pt\egroup\kern3pt\vrule\egroup\hrule\egroup} mlton-20100608/doc/hacker-guide/main.tex0000644000076600000240000000133111404435633016323 0ustar mtfstaff\documentclass[12pt,openany]{report} \usepackage{alltt,epsfig,html,latexsym,longtable,makeidx,moreverb} \setlength\topmargin{-0.5in} \setlength\textheight{8.5in} \setlength\textwidth{7.0in} \setlength\oddsidemargin{-0.3in} \setlength\evensidemargin{-0.3in} \hyphenation{} \title{{\mlton} Hacker Guide} \author{Stephen Weeks} \date{\today} \include{macros} \makeindex \begin{document} \maketitle \input{abstract} \tableofcontents \input{sources} \input{basis-library} \input{runtime} \input{mlton} \input{notes} \chap{Todo}{todo} native backend vs x86 backend To unpackage debian, do \begin{verbatim} dpkg -x ../mlton_20010806-2_i386.deb . \end{verbatim} \printindex \bibliographystyle{alpha} \bibliography{bib} \end{document} mlton-20100608/doc/hacker-guide/Makefile0000644000076600000240000000173611404435633016326 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## TEX_FILES := \ abstract.tex \ basis-library.tex \ main.tex \ macros.tex \ mlton.tex \ notes.tex \ runtime.tex \ sources.tex \ FIG_FILES := \ structure.ps \ all: main.ps # -verbosity 0 be quieter (but not quiet enough for my taste) # -address '' puts no author address at the bottom of each page main/main.html: $(TEX_FILES) latex2html -verbosity 1 -address '' -local_icons main.tex cd main && rm -f WARNINGS images.* *.pl cd main && rm -f index.html && ln -s main.html index.html main.dvi: $(TEX_FILES) $(FIG_FILES) latex main; bibtex main; latex main; latex main main.ps: main.dvi dvips -o main.ps main %.ps: %.fig fig2dev -Leps $< $@ .PHONY: clean clean: ../../bin/clean .PHONY: tags tags: etags *.tex mlton-20100608/doc/hacker-guide/mlton.tex0000644000076600000240000001274611404435633016544 0ustar mtfstaff\chap{MLton}{mlton} This chapter describes the compiler proper, which is found in the {\tt mlton} directory. \section{Sources} \begin{description} \place{ast} Abstract syntax trees produced by the front end. \place{atoms} Common atomic pieces of syntax trees used throughout the compiler, like constants, primitives, variables, and types. \place{backend} The backend translates from the {\tt Cps} IL to a machine independent IL called {\tt Machine}. It decides data representations, stack frame layouts, and creates runtime system information like limit checks and bitmasks. \place{call-main.sml} A one-line file that is the last line of the compiler sources. It calls the main function. \place{closure-convert} The closure converter, which converts from {\tt Sxml}, the higher-order simply-typed IL, to {\tt Cps}, the first-order simply-typed IL. \place{cm} Support for {\smlnj}-style compilation manager (CM) files. \place{codegen} Both the C and the native X86 code generator. \place{control} Compiler switches used throughout the rest of the compiler. \place{core-ml} The implicitly typed IL that results from defunctorization. Contains a pass of dead code elimination for eliminating basis library code. Also contains the pass that replaces constants defined by {\tt \_prim} with their values. \place{elaborate} The elaborator, which matches variable uses with bindings in the AST IL and defunctorizes to produce a {\tt CoreML} program. It does not do type checking yet, but will someday. \place{front-end} The lexer and parser, which turn files into ASTs. \place{main} The two main structures in the compiler, one ({\tt Main}) for handling all the command line switches and one ({\tt Compile}) which is a high-level view of the the compiler passes, from front end to code generation. \place{Makefile} To make the compiler. \place{mlton.cm} An automatically generated file ({\tt make mlton.cm}) that lists all of the files (in order) that make up the compiler. \place{mlton.sml} An automatically generated file ({\tt make mlton.sml}) that contains all of the compiler sources concatenated together. \place{rcps} An experimental IL, similar to CPS, but with more expressive types for describing representations (hence the ``r''). Not yet in use. \place{sources.cm} For compiling with {\smlnj}. \place{ssa} Static-Single-Assignment form, the first-order simply-typed IL on which most optimization is performed. There are roughly 20 different optimization passes (some of which run several times). \place{type-inference} The type inference pass, which translates from {\tt CoreML} to {\tt Xml}. \place{xml} The {\tt Xml} and {\tt Sxml} intermediate languages. Also, the passes that monomorphise, do polvariance, and implement exceptions. \end{description} \section{Compiler Overview} \figref{structure} shows the overall structure of the compiler. Intermediate languages (ILs) are shown in ovals. The names of compiler passes adorn arrows between ILs. In this section I give a brief description of each pass and a pointer to a later section that covers the pass in detail. Each IL also has a separate section devoted to it. \figBegin \centerline{\epsfig{file=structure.ps,width=5.0in}} \figEnd{Compiler structure} {structure} The front end (\chapref{front-end}) takes SML source code (a complete program) and performs lexing and parsing, producing an abstract syntax tree (\chapref{ast}). The lexer is produced by ml-lex\cite{AppelEtAl94} and the parser is produced by ml-yacc\cite{TarditiAppel94}. The specifications for the lexer and parser were originally taken from \smlnj 109.32. The lexer is unchanged. I have substantially modified the actions in the grammar to produce my own version of abstract syntax trees (similar to, but different from {\smlnj}). Defunctorization (\chapref{defunctorization}), translates abstract syntax trees to a small implicitly typed core language, called Core ML (\chapref{core-ml}). Its primary task is to eliminate all uses of the module system (signatures, structures, functors). It does this by applying all functors and flattening all structures, moving declarations to the top level. This phase also performs precedence parsing of infix expressions and patterns (the code to do this was taken from \smlnj). Finally, it does some amount of "macro expansion", so that the core language is smaller. Type inference (\chapref{type-inference}) translates implicitly typed Core ML to an explicitly typed core language, XML (\chapref{xml}), with explicit type abstraction and application. XML is based on the language ``Core-XML'' described in \cite{HarperMitchell93}. Type inference consists of two passes. The first pass determines the binding sites of type variables that are not explicitly bound (section 4.6 of the Definition). The second pass is a pretty standard unification based Hindley-Milner type inference\cite{DamasMilner82}. The type inference pass also performs overloading resolution and resolution of flexible record patterns. This pass also performs match compilation, by which I mean the translation of case statements with nested patterns to (nested) case statements with flat patterns. Monomorphisation (\chapref{monomorphisation}) translates XML to its simply-typed subset, called SXML (\chapref{sxml}), by duplicating all polymorphic functions and datatypes for each type at which they are instantiated. Monomorphisation is only possible because SML has ``let-style'' polymorphism, in which all uses of a polymorphic value are syntactically apparent (after functors are eliminated). mlton-20100608/doc/hacker-guide/notes.tex0000644000076600000240000000365311404435633016540 0ustar mtfstaff \chap{Notes}{notes} This chapter contains random notes (usually old emails) on various subtle issues. \section{IntInf and Flattener} \begin{verbatim} From: "Stephen T. Weeks" Date: Tue, 27 Jun 2000 18:52:19 -0700 (PDT) To: MLton@research.nj.nec.com Subject: safe for space ... and IntInf \end{verbatim} Your mail also came at a fortunate time, as I was trying to track down a seg fault I was getting in the smith-normal-form regression test. For stress testing, I turned off all the cps simplify passes (except for poly equal) and ran the regressions. smith-normal-form failed with a seg fault when compiled normally, and failed with an assertion failure in \verb+IntInf_do_neg+ when compiled -g. The assertion failure was right at the beginning, checking that the frontier is in the expected place. \begin{verbatim} assert(frontier == (pointer)&bp->limbs[bp->card - 1]); \end{verbatim} I'd been tracking this bug for a couple hours when I received your mail about the flattener. Do you see the connection? :-) As a reminder, here is the code for \verb+bigNegate+ \begin{verbatim} fun bigNegate (arg: bigInt): bigInt = if Prim.isSmall arg then let val argw = Prim.toWord arg in if argw = badw then negBad else Prim.fromWord (Word.- (0w2, argw)) end else Prim.~ (arg, allocate (1 + bigSize arg)) \end{verbatim} The problem is, when the flattener is turned off, there is an allocation in between the call to allocate and the \verb+Prim.~+ call. The argument tuple allocation screws everything up. So, we are relying on the flattener for correctness of the IntInf implementation. Any ideas on how to improve the implementation to remove this reliance, or at least put an assert somewhere to avoid falling prey to this bug again? mlton-20100608/doc/hacker-guide/runtime.tex0000644000076600000240000000075411404435633017072 0ustar mtfstaff\chap{The runtime}{runtime} There are multiple, possibly orthogonal issues. Limit checks and garbage collections are a little overloaded in their roles, because they also support preemptive thread switching and interupt handling. Forcing frontier to be 0 and hitting a limit check (even a zero byte limit check) will invoke the GC, which will switch to the pending thread. Recall that a limit check with bytes = 0 really means a check for LIMIT\_SLOP bytes (currently LIMIT\_SLOP = 512). mlton-20100608/doc/hacker-guide/sources.tex0000644000076600000240000000272211404435633017067 0ustar mtfstaff\chap{The sources}{sources} This section is an overview of the sources to the compiler and all of the associated tools. Here is a brief description of each element of the root source directory. Throughout the rest of this document, we will use pathnames that are relative to the source directory. \begin{description} \place{basis-library} The basis library implementation. \place{benchmark} Code and tests used for benchmarking {\mlton}, {\smlnj}, and {\mosml}. \place{bin} Scripts for type checking the basis library, making rpms, running {\mlton}, and running regression tests. \place{doc} Sources for the user guide, hacker guide, web site, announcements, README. \place{include} Include files needed for compiling C files generated by {\mlton}. \place{lib} SML library code, which is used in {\tt mlton}, {\tt mlprof}, and {\tt benchmark}. There are also many generally useful libraries. \place{Makefile} To make everything. This is only used when building rpms. \place{man} Manual pages for {\tt mlton} and {\tt mlprof}. \place{mllex} Lexer generator, taken and slightly modified from {\smlnj}. \place{mlprof} Profiler. \place{mlton} Compiler. \place{mlyacc} Parser generator, taken and slightly modified from {\smlnj}. \place{regression} Regression tests, about 150 SML files that are used to test the compiler. \place{runtime} Runtime system, which includes the garbage collector and C libraries used in the basis (including the GMP used for {\tt IntInf}). \end{description} mlton-20100608/doc/hacker-guide/structure.fig0000644000076600000240000000560511404435633017414 0ustar mtfstaff#FIG 3.2 Landscape Center Inches Letter 100.00 Single -2 1200 2 1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 5340 1500 1110 300 6450 1800 4230 1200 1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 5340 2700 1110 300 6450 3000 4230 2400 1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 5340 3870 1110 300 6450 4170 4230 3570 1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 5340 5070 1110 300 6450 5370 4230 4770 1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 5340 7485 1110 300 6450 7785 4230 7185 1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 5340 6285 1110 300 6450 6585 4230 5985 1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 5340 8685 1110 300 6450 8985 4230 8385 1 2 0 1 0 7 50 0 -1 0.000 1 0.0000 5340 9930 1110 300 6450 10230 4230 9630 2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 2.00 60.00 150.00 5355 4200 5355 4785 2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 2.00 60.00 150.00 5355 5400 5355 5985 2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 2.00 60.00 150.00 5355 6570 5355 7155 2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 2.00 60.00 150.00 5355 3015 5355 3600 2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 2.00 60.00 150.00 5355 1815 5355 2400 2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 2.00 60.00 150.00 5325 9030 5325 9615 2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 2.00 60.00 150.00 5325 7815 5325 8400 2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 2.00 60.00 150.00 5355 615 5355 1200 3 2 0 2 0 7 50 0 -1 0.000 0 1 0 4 1 1 2.00 60.00 150.00 4440 3675 3315 3510 3315 3990 4230 3930 0.000 -1.000 -1.000 0.000 3 2 0 2 0 7 50 0 -1 0.000 0 1 0 4 1 1 2.00 60.00 150.00 4440 4881 3315 4716 3315 5196 4230 5136 0.000 -1.000 -1.000 0.000 3 2 0 2 0 7 50 0 -1 0.000 0 1 0 4 1 1 2.00 60.00 150.00 4440 6103 3315 5938 3315 6418 4230 6358 0.000 -1.000 -1.000 0.000 3 2 0 2 0 7 50 0 -1 0.000 0 1 0 4 1 1 2.00 60.00 150.00 4440 8487 3315 8322 3315 8802 4230 8742 0.000 -1.000 -1.000 0.000 4 0 0 50 0 0 24 0.0000 4 255 690 4965 1635 AST\001 4 0 0 50 0 0 24 0.0000 4 255 1245 4740 2835 CoreML\001 4 0 0 50 0 0 24 0.0000 4 255 810 4920 3990 XML\001 4 0 0 50 0 0 24 0.0000 4 255 1005 4830 5205 SXML\001 4 0 0 50 0 0 24 0.0000 4 255 660 4935 6435 CPS\001 4 0 0 50 0 0 24 0.0000 4 255 1305 4695 7620 Machine\001 4 0 0 50 0 0 24 0.0000 4 255 630 4980 8835 X86\001 4 0 0 50 0 0 24 0.0000 4 330 1365 4695 10035 assembly\001 4 0 0 50 0 0 24 0.0000 4 330 1830 1260 8655 optimization\001 4 0 0 50 0 0 24 0.0000 4 330 1830 1260 6270 optimization\001 4 0 0 50 0 0 24 0.0000 4 330 1830 1245 5055 optimization\001 4 0 0 50 0 0 24 0.0000 4 330 1830 1275 3840 optimization\001 4 0 0 50 0 0 24 0.0000 4 330 2835 5595 1005 Lexing and parsing\001 4 0 0 50 0 0 24 0.0000 4 300 4275 5595 2220 Elaboration, defunctorization\001 4 0 0 50 0 0 24 0.0000 4 330 5160 5580 3405 Type inference, match compilation\001 4 0 0 50 0 0 24 0.0000 4 330 4875 5625 4605 Monomorphisation, polyvariance\001 4 0 0 50 0 0 24 0.0000 4 255 2835 5595 5790 Closure conversion\001 4 0 0 50 0 0 24 0.0000 4 330 2880 5595 6990 Data representation\001 mlton-20100608/doc/library-guide/0000755000076600000240000000000011404470406015063 5ustar mtfstaffmlton-20100608/doc/library-guide/.ignore0000644000076600000240000000017411404435632016353 0ustar mtfstaff*~ TAGS core macros.aux main main.aux main.bbl main.blg main.dvi main.idx main.log main.pdf main.ps main.ps.gz main.toc old mlton-20100608/doc/library-guide/abstract.tex0000644000076600000240000000026011404435632017410 0ustar mtfstaffThis document describes the {\mlton} SML Library, which is a collection of modules that are used in {\mlton}, but are also generally useful. This document is very incomplete. mlton-20100608/doc/library-guide/macros.tex0000644000076600000240000000345511404435632017102 0ustar mtfstaff\newcommand{\absolutelink}[1]{\link{\makeurl{#1}}} \newcommand{\addr}{mlton.org} \newcommand{\chaplab}[1]{\label{chapter:#1}} \newcommand{\chapref}[1]{Chapter~\ref{chapter:#1}} \newcommand{\chap}[2]{\chapter{#1}{\chaplab{#2}}} \newcommand{\code}[1]{\htmladdnormallink{{\tt #1}}{../../#1}} \newcommand{\deflab}[1]{\label{definition:#1}} \newcommand{\defref}[1]{Definition~\ref{definition:#1}} \newcommand{\figBegin}{\begin{figure}\begin{boxit}} \newcommand{\figEnd}[2]{\caption{#1}\figlab{#2}\end{boxit}\end{figure}} \newcommand{\figlab}[1]{\label{figure:#1}} \newcommand{\figref}[1]{Figure~\ref{figure:#1}} \newcommand{\lemlab}[1]{\label{lemma:#1}} \newcommand{\lemref}[1]{Lemma~\ref{lemma:#1}} \newcommand{\link}[1]{\htmladdnormallink{{\tt #1}}{#1}} \newcommand{\mailto}[1]{\htmladdnormallink{{\tt #1}}{mailto:#1}} \newcommand{\makeurl}[1]{http://www.\addr/MLton/#1} \newcommand{\mltonmail}{\mailto{MLton@\addr}} \newcommand{\mlton}{MLton} \newcommand{\mosml}{Moscow ML} \newcommand{\place}[1]{\item[\tt #1]\hspace{1in}\\} \newcommand{\seclab}[1]{\label{section:#1}} \newcommand{\secref}[1]{Section~\ref{section:#1}} \newcommand{\smlnj}{SML/NJ} \newcommand{\subsecc}[2]{\subsubsection{#1}\seclab{#2}} \newcommand{\subsec}[2]{\subsection{#1}\seclab{#2}} \newcommand{\subsubsec}[2]{\subsubsection{#1}\label{section:#2}} \newcommand{\tabBegin}{\begin{table}} \newcommand{\tablab}[1]{\label{table:#1}} \newcommand{\tabref}[1]{Table~\ref{table:#1}} \newcommand{\thmlab}[1]{\label{theorem:#1}} \newcommand{\thmref}[1]{Theorem~\ref{theorem:#1}} \newcommand{\userguide}{{\mlton} User Guide} \newcommand{\version}{VERSION} \renewcommand{\sec}[2]{\section{#1}\seclab{#2}} \newenvironment{boxit}{\vbox\bgroup\hrule\hbox\bgroup\vrule\kern3pt\vbox\bgroup\kern3pt\advance\hsize by -6.8pt\relax}{\par\kern3pt\egroup\kern3pt\vrule\egroup\hrule\egroup} mlton-20100608/doc/library-guide/main.tex0000644000076600000240000000072511404435632016537 0ustar mtfstaff\documentclass[12pt]{article} \usepackage{alltt,epsfig,html,latexsym,longtable,makeidx,moreverb} \setlength\topmargin{-0.5in} \setlength\textheight{8.5in} \setlength\textwidth{7.0in} \setlength\oddsidemargin{-0.3in} \setlength\evensidemargin{-0.3in} \hyphenation{} \title{{\mlton} Library Guide} \author{Stephen Weeks} \date{\today} \include{macros} \makeindex \begin{document} \maketitle \input{abstract} \bibliographystyle{alpha} \bibliography{bib} \end{document} mlton-20100608/doc/library-guide/Makefile0000644000076600000240000000157411404435632016534 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## TEX_FILES := \ abstract.tex \ main.tex \ macros.tex \ FIG_FILES := \ all: main.ps # -verbosity 0 be quieter (but not quiet enough for my taste) # -address '' puts no author address at the bottom of each page main/main.html: $(TEX_FILES) latex2html -verbosity 1 -address '' -local_icons main.tex cd main && rm -f WARNINGS images.* *.pl cd main && rm -f index.html && ln -s main.html index.html main.dvi: $(TEX_FILES) $(FIG_FILES) latex main; bibtex main; latex main; latex main main.ps: main.dvi dvips -o main.ps main %.ps: %.fig fig2dev -Leps $< $@ .PHONY: clean clean: ../../bin/clean .PHONY: tags tags: etags *.tex mlton-20100608/doc/license/0000755000076600000240000000000011404470406013746 5ustar mtfstaffmlton-20100608/doc/license/.ignore0000644000076600000240000000002211404435632015226 0ustar mtfstaffSMLNJ-LIB-LICENSE mlton-20100608/doc/license/gdtoa-LICENSE0000644000076600000240000000226211404435632016053 0ustar mtfstaff/**************************************************************** The author of this software is David M. Gay. Copyright (C) 1998 by Lucent Technologies All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ mlton-20100608/doc/license/gmp-LICENSE0000644000076600000240000006364411404435632015553 0ustar mtfstaff GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. ^L Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. ^L GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. ^L 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. ^L 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. ^L 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. ^L 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ^L How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! mlton-20100608/doc/license/MLKit-LICENSE0000644000076600000240000000262711404435632015742 0ustar mtfstaff2. License and Copyright ------------------------ The ML Kit compiler is distributed under the GNU Public License. See the file copyright for details. The runtime system (kit/src/Runtime/) and libraries (kit/basislib/) is distributed nder the more liberal MIT License. ====================================================================== The MIT License Copyright (c) 2004 IT University of Copenhagen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mlton-20100608/doc/license/MLton-LICENSE0000644000076600000240000000250411404435632016005 0ustar mtfstaffThis is the license for MLton, a whole-program optimizing compiler for the Standard ML programming language. Send comments and questions to MLton@mlton.org. MLton COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. Copyright (C) 1999-2010 Henry Cejtin, Matthew Fluet, Suresh Jagannathan, and Stephen Weeks. Copyright (C) 1997-2000 by the NEC Research Institute Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the above copyright holders, or their entities, not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The above copyright holders disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the above copyright holders be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. mlton-20100608/doc/license/NEC-LICENSE0000644000076600000240000000237411404435632015366 0ustar mtfstaffThis is the license for MLton, a whole-program optimizing compiler for the Standard ML programming language. Send comments and questions to MLton@mlton.org. MLton COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh Jagannathan, and Stephen Weeks. Copyright (C) 1997-2000 by the NEC Research Institute Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of NEC, or any NEC entity not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. NEC disclaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall NEC be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. mlton-20100608/doc/license/NJ-LICENSE0000644000076600000240000000205611404435632015265 0ustar mtfstaffSTANDARD ML OF NEW JERSEY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. Copyright (c) 1989-1998 by Lucent Technologies Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent Technologies, Bell Labs or any Lucent entity not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Lucent disclaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall Lucent be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. mlton-20100608/doc/license/README0000644000076600000240000000225011404435632014627 0ustar mtfstaffpackage license use -------------- ------------------------------ ------------ MLton MLton-LICENSE (BSD-style) SML/NJ NJ-LICENSE (BSD-style) front-end mllex specification front-end mlyacc specification precedence parser CM lexer and parser OS.IO, Posix.IO, Process, Unix mllex mlyacc and MLYacc Library Concurrent ML Library CKit Library mlnlffigen and MLNLFFI Library MLRISC Library SML/NJ Lib SMLNJ-LIB-LICENSE (BSD-style) SML/NJ Library ML Kit MLKit-LICENSE (MIT) Path, Time, Date gdtoa gdtoa-LICENSE (BSD-style) Real binary <-> decimal conversions gmp gmp-LICENSE (LGPL) IntInf mlton-20100608/doc/mlb-formal/0000755000076600000240000000000011404470406014354 5ustar mtfstaffmlton-20100608/doc/mlb-formal/.ignore0000644000076600000240000000016311404435633015643 0ustar mtfstaff*~ *.aux *.bbl *.blg *.log *.toc TAGS core mlb-formal mlb-formal.dvi mlb-formal.pdf mlb-formal.ps mlb-formal.ps.gz mlton-20100608/doc/mlb-formal/bib.bib0000644000076600000240000000051711404435633015574 0ustar mtfstaff@string{and = " and "} @string{harper = "Robert Harper"} @string{macqueen = "David~B. MacQueen"} @string{milner = "Robin Milner"} @string{tofte = "Mads Tofte"} @book(MTHM97, author = milner # and # tofte # and # harper # and # macqueen, title = "The Definition of Standard ML (Revised)", publisher = "MIT Press", year = 1997) mlton-20100608/doc/mlb-formal/macros.tex0000644000076600000240000000003311404435633016361 0ustar mtfstaff\newcommand{\mlton}{MLton} mlton-20100608/doc/mlb-formal/Makefile0000644000076600000240000000116211404435633016017 0ustar mtfstaff## Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## TEX_FILES := \ bib.bib \ mlb-formal.tex all: mlb-formal.ps mlb-formal.pdf mlb-formal.dvi: $(TEX_FILES) latex mlb-formal; bibtex mlb-formal; latex mlb-formal; latex mlb-formal mlb-formal.pdf: $(TEX_FILES) latex mlb-formal bibtex mlb-formal latex mlb-formal pdflatex mlb-formal mlb-formal.ps: mlb-formal.dvi dvips -o mlb-formal.ps mlb-formal .PHONY: clean clean: ../../bin/clean .PHONY: tags tags: etags *.tex mlton-20100608/doc/mlb-formal/mlb-formal.tex0000644000076600000240000006425311404435633017143 0ustar mtfstaff\documentclass[draft]{article} \usepackage{fullpage} \usepackage{amsmath} \usepackage{amssymb} \include{macros} % math fonts \newcommand{\mbb}[1]{\mathbb{#1}} \newcommand{\mbf}[1]{\mathbf{#1}} \renewcommand{\mit}[1]{\mathit{#1}} \newcommand{\mrm}[1]{\mathrm{#1}} \newcommand{\mtt}[1]{\mathtt{#1}} \newcommand{\mcal}[1]{\mathcal{#1}} \newcommand{\msf}[1]{\mathsf{#1}} % text fonts \newcommand{\ttt}[1]{\texttt{#1}} % formatting \newenvironment{stackAux}[2]{% \setlength{\arraycolsep}{0pt} \begin{array}[#1]{#2}}{ \end{array}} \newenvironment{stackCC}{ \begin{stackAux}{c}{c}}{\end{stackAux}} \newenvironment{stackCL}{ \begin{stackAux}{c}{l}}{\end{stackAux}} \newenvironment{stackTL}{ \begin{stackAux}{t}{l}}{\end{stackAux}} \newenvironment{stackTR}{ \begin{stackAux}{t}{r}}{\end{stackAux}} \newenvironment{stackBC}{ \begin{stackAux}{b}{c}}{\end{stackAux}} \newenvironment{stackBL}{ \begin{stackAux}{b}{l}}{\end{stackAux}} \newcommand{\stagger}[2]{% \begin{array}{ccc}% \multicolumn{2}{l}{#1}&\\% &\multicolumn{2}{r}{#2}% \end{array}} \newcommand{\axiom}[1]{{\displaystyle\strut{#1}}} \newcommand{\infrule}[2]{{\frac{\displaystyle\strut{#1}}{\displaystyle\strut{#2}}}} \newcommand{\judge}[2]{\infrule{#1}{#2}} \begin{document} \title{Formal Specification of the ML Basis system} \author{Copyright \copyright\ 2004\\ Henry Cejtin, Matthew Fluet, Suresh Jagannathan, and Stephen Weeks} \date{\today} \maketitle % This document formally specifies the ML Basis system (MLB) in {\mlton} used to program in the large. The system has been designed to be a natural extension of Standard ML, and the specification is given in the style of The Definition of Standard ML~\cite{MTHM97} (henceforeth, the Definition). This section adopts (often silently) abbreviations, conventions, definitions, and notation from the Definition. % \section{Syntax of MLB} For MLB there are further reserved words, identifier classes and derived forms. There are no further special constants; comments and lexical analysis are as for the Core and Modules. The derived forms appear in Appendix~\ref{sec:mlb:DerivedForms}. % \subsection{Reserved Words} The following are the additional reserved words used in MLB. \begin{displaymath} \mtt{bas} \quad\quad \mtt{basis} \end{displaymath} Note that many of the reserved words from the Core and Modules are not used by the grammar of MLB. However, as the grammar includes identifiers from the grammars of the Core and Modules, it is useful to consider the reserved words from the Core and Modules to be reserved in MLB as well. % \subsection{Identifiers} The additional identifier class for MLB are $\mrm{BasId}$ (basis identifiers). Basis identifiers must be alphanumeric, not starting with a prime. The class of each identifier occurence is determined by the grammatical rules which follow. Henceforth, therefore, we consider all identifier classes to be disjoint. % \subsection{Infixed operators} The grammar of MLB does not directly admit fixity directives. However, the static and dynamic semantics for MLB will import source files that must be parsed in the scope of fixity directives and that may introduce additional fixity directives into scope. Figure~\ref{fig:mlb:S:FixityEnv} formalizes the Definition's notion of \emph{infix status} as a \emph{fixity environment}. \begin{figure}[h] \begin{displaymath} \begin{array}{rcl} & & \mrm{InfixStatus} = \{\mtt{nonfix}\} \cup \bigcup_{d \in \{0,\ldots,9\}} \{\mtt{infix}~d, \mtt{infixr}~d\} \\ \mit{FE} & \in & \mrm{FixEnv} = \mrm{VId} \xrightarrow{\mrm{fin}} \mrm{InfixStatus} \end{array} \end{displaymath} \caption{Fixity Environment}\label{fig:mlb:S:FixityEnv} \end{figure} % \subsection{Grammar for MLB} The phrase classes for MLB are shown in Figure~\ref{fig:mlb:S:PhraseClasses}. \begin{figure}[h] \begin{displaymath} \begin{array}{ll} \mrm{BasExp} & \mbox{basis expressions} \\ \mrm{BasDec} & \mbox{basis-level declaration} \\ \mrm{BasBind} & \mbox{basis bindings} \\ \mrm{BStrBind} & \mbox{(basis) structure bindings} \\ \mrm{BSigBind} & \mbox{(basis) signature bindings} \\ \mrm{BFunBind} & \mbox{(basis) functor bindings} \end{array} \end{displaymath} \caption{MLB Phrase Classes}\label{fig:mlb:S:PhraseClasses} \end{figure} We use the variable $\mit{basexp}$ to range over $\mrm{BasExp}$, etc. The conventions adopted in presenting the grammatical rulse for MLB are the same as for the Core and Modules. The grammatical rules are showin in Figure~\ref{fig:mlb:S:GrammaticalRules}. \begin{figure}[h] \begin{displaymath} \begin{array}{rcll} \mit{basexp} & ::= & \mtt{bas}~ \mit{basdec} ~\mtt{end} & \mbox{basic} \\&& \mit{basid} & \mbox{basis identifier} \\&& \mtt{let}~ \mit{basdec} ~\mtt{in}~ \mit{basexp} ~\mtt{end} & \mbox{local declaration} \\ \mit{basdec} & ::= & \mtt{basis}~ \mit{basbind} & \mbox{basis} \\&& \mtt{local}~ \mit{basdec}_1 ~\mtt{in}~ \mit{basdec}_2 ~\mtt{end} & \mbox{local} \\&& \mtt{open}~ \mit{basid}_1 \cdots \mit{basid}_n & \mbox{open ($n \geq 1$)} \\&& \mtt{structure}~ \mit{bstrbind} & \mbox{(basis) structure binding} \\&& \mtt{signature}~ \mit{bsigbind} & \mbox{(basis) signature binding} \\&& \mtt{functor}~ \mit{bfunbind} & \mbox{(basis) functor binding} \\&& \quad & \mbox{empty} \\&& \mit{basdec}_1~\langle\mtt{;}\rangle~\mit{basdec}_2 & \mbox{sequential} \\&& \msf{path.mlb} & \mbox{import ML basis} \\&& \msf{path.sml} & \mbox{import source} \\ \mit{basbind} & ::= & \mit{basid} ~\mtt{=}~ \mit{basexp} ~\langle\mtt{and}~ \mit{basbind}\rangle \\ \mit{bstrbind} & ::= & \mit{strid}_1 ~\mtt{=}~ \mit{strid}_2 ~\langle\mtt{and}~ \mit{bstrbind}\rangle \\ \mit{bsigbind} & ::= & \mit{sigid}_1 ~\mtt{=}~ \mit{sigid}_2 ~\langle\mtt{and}~ \mit{bsigbind}\rangle \\ \mit{bfunbind} & ::= & \mit{funid}_1 ~\mtt{=}~ \mit{funid}_2 ~\langle\mtt{and}~ \mit{bfunbind}\rangle \end{array} \end{displaymath} \caption{Grammar: Basis Expressions, Declarations, and Bindings}\label{fig:mlb:S:GrammaticalRules} \end{figure} % \subsection{Syntactic Restrictions} \begin{itemize} \item No binding $\mit{basbind}$ may bind the same identifier twice. \item No binding $\mit{bstrbind}$, $\mit{bsigbind}$ or $\mit{bfunbind}$ may bind the same identifier twice. \item MLB may not be cyclic; i.e., successively replacing $\msf{path.mlb}$ with it's parsed $\mrm{BasDec}$ must terminate. \end{itemize} % \subsection{Parsing} The static and dynamic semantics for MLB will interpret $\msf{path.sml}$ as a parsed $\mrm{TopDec}$ and $\msf{path.mlb}$ as a parsed $\mrm{BasDec}$. Parsing a $\mrm{TopDec}$ takes a fixity environment as input and returns a fixity environment as output; the output fixity environment corresponds to fixity directives introduced by and whose scope is not limited by the parsed $\mrm{TopDec}$. Paths and parsers are given in Figure~\ref{fig:mlb:S:PathsParser}. A (fixed) $\mrm{Parser}$ $\mcal{P}$ provides the interpretation of $\msf{path.sml}$ and $\msf{path.mlb}$ imports. \begin{figure}[h] \begin{displaymath} \begin{array}{c} \begin{array}{rcl} \msf{path.sml} & \in & \mrm{SourcePath} \\ \msf{path.mlb} & \in & \mrm{MLBasisPath} \end{array} \\ \begin{array}{rcl} \mcal{P} & \in & \mrm{Parser} = ((\mrm{FixEnv} \times \mrm{SourcePath}) \xrightarrow{\mrm{fin}} (\mrm{FixEnv} \times \mrm{TopDec})) \times (\mrm{MLBasisPath} \xrightarrow{\mrm{fin}} \mrm{BasDec}) \end{array} \end{array} \end{displaymath} \caption{Parser}\label{fig:mlb:S:PathsParser} \end{figure} % For a file extension $\msf{.ext}$, $\msf{path.ext}$ denotes either an absolute path or a relative path (relative to the $\mrm{BasDec}$ being parsed) to a file in the underlying file system. Paths that denote the same file in the underlying file system are considered equal, though they may have distinct textual representations. An implementation may allow additional extensions (e.g., $\mtt{.ML}$, $\mtt{.fun}$, $\mtt{.sig}$) in elements of $\mrm{SourcePath}$. An implementation may additionally allow path variables to appear in paths. $\mrm{Parser}$ could be refined by a \emph{current working directory}, to formally specify the interpretation of relative paths, and an \emph{path map}, to formally specify the interpretation of path variables, but the above suffices for the development in the following sections. % \section{Static Semantics for MLB} % \subsection{Semantic Objects} The simple objects for the MLB static semantics are exactly as for Modules. The compound objects are those for Modules, augmented by those in Figure~\ref{fig:mlb:SS:CompoundObjects}. \begin{figure}[h] \begin{displaymath} \begin{array}{rcl} \mit{BE} & \in & \mrm{BasEnv} = \mrm{BasId} \xrightarrow{\mrm{fin}} \mrm{MBasis} \\ \mit{M} ~\mrm{or}~ \mit{FE},\mit{BE},\mit{B} & \in & \mrm{MBasis} = \mrm{FixEnv} \times \mrm{BasEnv} \times \mrm{Basis} \\ \Psi & \in & \mrm{BasCache} = \mrm{MLBasisPath} \xrightarrow{\mrm{fin}} \mrm{MBasis} \end{array} \end{displaymath} \caption{Compound Semantic Objects}\label{fig:mlb:SS:CompoundObjects} \end{figure} The operations of projection, injection and modification are as for Modules. % \subsection{Inference Rules} As for the Core and for Modules, the rules for MLB static semantics allow sentences of the form \begin{displaymath} A \vdash \mit{phrase} \longrightarrow A' \end{displaymath} to be inferred. Some hypotheses in rules are not of this form; they are called \emph{side-conditions}. The convention for options is as in the Core and Modules semantics. \vspace{2\parsep} {\large\noindent \textbf{Basis Expressions} \hfill \fbox{$\mit{M}, \Psi \vdash \mit{basexp} \longrightarrow \mit{M}', \Psi'$} }\nopagebreak \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basdec} \longrightarrow \mit{M}', \Psi' }{ \mit{M}, \Psi \vdash \mtt{bas}~ \mit{basdec} ~\mtt{end} \longrightarrow \mit{M}', \Psi' } \end{equation} \begin{equation} \judge{ \mit{M}(\mit{basid}) = \mit{M}' }{ \mit{M}, \Psi \vdash \mit{basid} \longrightarrow \mit{M}', \Psi } \end{equation} \begin{equation} \label{eqn:mlb:SS:localDeclaration} \judge{ \mit{M}, \Psi \vdash \mit{basdec} \longrightarrow \mit{M}_1, \Psi_1 \quad \mit{M} \oplus \mit{M}_1, \Psi_1 \vdash \mit{basexp} \longrightarrow \mit{M}_2, \Psi_2 }{ \mit{M}, \Psi \vdash \mtt{let}~ \mit{basdec} ~\mtt{in}~ \mit{basexp} ~\mtt{end} \longrightarrow \mit{M}_2, \Psi_2 } \end{equation} \begin{samepage} \noindent \textit{Comments}: \begin{itemize} \item[(\ref{eqn:mlb:SS:localDeclaration})] The use of $\oplus$, here and elsewhere, ensures that the type names generated by the first sub-phrase are distinct from the names generated by the second sub-phrase. \end{itemize} \end{samepage} \vspace{2\parsep} {\large\noindent \textbf{Basis-level Declarations} \hfill \fbox{$\mit{M}, \Psi \vdash \mit{basdec} \longrightarrow \mit{M}', \Psi'$} }\nopagebreak \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basbind} \longrightarrow \mit{BE}', \Psi' }{ \mit{M}, \Psi \vdash \msf{basis}~ \mit{basbind} \longrightarrow \mit{BE}' ~\mrm{in}~ \mrm{MBasis}, \Psi' } \end{equation} \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basdec}_1 \longrightarrow \mit{M}_1, \Psi_1 \quad \mit{M} \oplus \mit{M}_1, \Psi_1 \vdash \mit{basdec}_2 \longrightarrow \mit{M}_2, \Psi_2 \quad }{ \mit{M}, \Psi \vdash \mtt{local}~ \mit{basdec}_1 ~\mtt{in}~ \mit{basdec}_2 ~\mtt{end} \longrightarrow \mit{M}_2, \Psi_2 } \end{equation} \begin{equation} \judge{ \mit{M}(\mit{basid}_1) = \mit{M}_1 \quad \cdots \quad \mit{M}(\mit{basid}_n) = \mit{M}_n }{ \mit{M}, \Psi \vdash \mtt{open}~ \mit{basid}_1 \cdots \mit{basid}_n \longrightarrow \mit{M}_1 \oplus \cdots \oplus \mit{M}_n, \Psi } \end{equation} \begin{equation} \judge{ \mit{B}~\mrm{of}~\mit{M} \vdash \mit{bstrbind} \longrightarrow SE }{ \mit{M}, \Psi \vdash \mtt{structure}~ \mit{bstrbind} \longrightarrow \mit{SE} ~\mrm{in}~ \mrm{MBasis}, \Psi } \end{equation} \begin{equation} \judge{ \mit{B}~\mrm{of}~\mit{M} \vdash \mit{bsigbind} \longrightarrow G }{ \mit{M}, \Psi \vdash \mtt{signature}~ \mit{bsigbind} \longrightarrow \mit{G } ~\mrm{in}~ \mrm{MBasis}, \Psi } \end{equation} \begin{equation} \judge{ \mit{B}~\mrm{of}~\mit{M} \vdash \mit{bfunbind} \longrightarrow F }{ \mit{M}, \Psi \vdash \mtt{functor}~ \mit{bfunbind} \longrightarrow \mit{F} ~\mrm{in}~ \mrm{MBasis}, \Psi } \end{equation} \begin{equation} \judge{ }{ \mit{M}, \Psi \vdash \quad \longrightarrow \{\} ~\mrm{in}~ \mrm{MBasis}, \Psi } \end{equation} \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basdec}_1 \longrightarrow \mit{M}_1, \Psi_1 \quad \mit{M} \oplus \mit{M}_1, \Psi_1 \vdash \mit{basdec}_2 \longrightarrow \mit{M}_2, \Psi_2 }{ \mit{M}, \Psi \vdash \mit{basdec}_1 ~\langle\mtt{;}\rangle~ \mit{basdec}_2 \longrightarrow \mit{M}_1 \oplus \mit{M}_2, \Psi_2 } \end{equation} \begin{equation} \label{eqn:mlb:SS:path.sml} \judge{ \mcal{P}(\mit{FE}~\mrm{of}~\mit{M}, \msf{path.sml}) = (\mit{FE}', \mit{topdec}) \quad \mit{B}~\mrm{of}~\mit{M} \vdash \mit{topdec} \Rightarrow \mit{B}' }{ \mit{M}, \Psi \vdash \msf{path.sml} \longrightarrow (\mit{FE}',\{\},\mit{B}'), \Psi } \end{equation} \begin{equation} \judge{ \Psi(\msf{path.mlb}) = \mit{M}' }{ \mit{M}, \Psi \vdash \msf{path.mlb} \longrightarrow \mit{M}', \Psi } \end{equation} \begin{equation} \judge{ \msf{path.mlb} \notin \mrm{Dom}~\Psi \quad \mcal{P}(\msf{path.mlb}) = \mit{basdec} \quad \{\} ~\mrm{in}~ \mrm{MBasis}, \Psi \vdash \mit{basdec} \longrightarrow \mit{M}', \Psi' }{ \mit{M}, \Psi \vdash \msf{path.mlb} \longrightarrow \mit{M}', \Psi' + \{\msf{path.mlb} \mapsto \mit{M}'\} } \end{equation} \begin{samepage} \noindent \textit{Comments}: \begin{itemize} \item[(\ref{eqn:mlb:SS:path.sml})] Note the use of the Definition's $\mit{B} \vdash \mit{topdec} \Rightarrow \mit{B}'$. \end{itemize} \end{samepage} \vspace{2\parsep} {\large\noindent \textbf{Basis Bindings} \hfill \fbox{$\mit{M}, \Psi \vdash \mit{basbind} \longrightarrow \mit{BE}', \Psi'$} }\nopagebreak \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basexp} \longrightarrow \mit{M}', \Psi' \quad \langle\mit{M} + \mrm{tynames}~\mit{M}', \Psi' \vdash \mit{basbind} \longrightarrow \mit{BE}'', \Psi''\rangle }{ \mit{M}, \Psi \vdash \mit{basid} ~\mtt{=}~ \mit{basexp} ~\langle\mtt{and}~\mit{basbind}\rangle \longrightarrow \{\mit{basid} \mapsto \mit{M}'\} \langle+ \mit{BE}''\rangle, \Psi'\langle'\rangle } \end{equation} \vspace{2\parsep} {\large\noindent \textbf{(Basis) Structure Bindings} \hfill \fbox{$\mit{B} \vdash \mit{bstrbind} \longrightarrow \mit{SE}$} }\nopagebreak \begin{equation} \label{eqn:mlb:SS:bstrbind} \judge{ \mit{B}(\mit{strid}_2) = E \quad \langle\mit{B} + \mrm{tynames}~\mit{E} \vdash \mit{bstrbind} \longrightarrow \mit{SE}\rangle }{ \mit{B} \vdash \mit{strid}_1 ~\mtt{=}~ \mit{strid}_2 ~\langle\mtt{and}~\mit{bstrbind}\rangle \longrightarrow \{\mit{strid}_1 \mapsto \mit{E}\} \langle+ \mit{SE}\rangle } \end{equation} \begin{samepage} \noindent \textit{Comments}: \begin{itemize} \item[(\ref{eqn:mlb:SS:bstrbind})] Note that $\mit{bstrbind} \subset \mit{strbind}$. Hence, this rule can be derived from the Definition's $\mit{B} \vdash \mit{strbind} \Rightarrow \mit{SE}$. \end{itemize} \end{samepage} \vspace{2\parsep} {\large\noindent \textbf{(Basis) Signature Bindings} \hfill \fbox{$\mit{B} \vdash \mit{bsigbind} \longrightarrow \mit{G}$} }\nopagebreak \begin{equation} \label{eqn:mlb:SS:bsigbind} \judge{ \begin{stackCC} \mit{B}(\mit{sigid}_2) = \Sigma \quad \Sigma = (\mit{T})\mit{E} \quad \mit{T} \cap (\mit{T}~\mrm{of}~\mit{B}) = \emptyset \\ \mit{T} = \mrm{tynames}~\mit{E} \setminus (\mit{T}~\mrm{of}~\mit{B}) \quad \langle\mit{B} \vdash \mit{bsigbind} \longrightarrow \mit{G}\rangle \end{stackCC} }{ \mit{B} \vdash \mit{sigid}_1 ~\mtt{=}~ \mit{sigid}_2 ~\langle\mtt{and}~\mit{bsigbind}\rangle \longrightarrow \{\mit{sigid}_1 \mapsto \Sigma\} \langle+ \mit{G}\rangle } \end{equation} \begin{samepage} \noindent \textit{Comments}: \begin{itemize} \item[(\ref{eqn:mlb:SS:bsigbind})] Note that $\mit{bsigbind} \subset \mit{sigbind}$. Hence, this rule can be derived from the Definition's $\mit{B} \vdash \mit{sigbind} \Rightarrow \mit{G}$. As such, the following comment from the Definition applies: \begin{quote} The bound names of $\mit{B}(\mit{sigid}_2)$ can always be renamed to satisfy $\mit{T} \cap (\mit{T}~\mrm{of}~\mit{B}) = \emptyset$, if necessary. \end{quote} \end{itemize} \end{samepage} \vspace{2\parsep} {\large\noindent \textbf{(Basis) Functor Bindings} \hfill \fbox{$\mit{B} \vdash \mit{bfunbind} \longrightarrow \mit{F}$} }\nopagebreak \begin{equation} \judge{ \begin{stackCC} \mit{B}(\mit{funid}_2) = \Phi \quad \Phi = (\mit{T})(\mit{E},(\mit{T}')\mit{E}') \quad \mit{T} \cap (\mit{T}~\mrm{of}~\mit{B}) = \emptyset \\ \mit{T}' = \mrm{tynames}~\mit{E}' \setminus ((\mit{T}~\mrm{of}~\mit{B}) \cup \mit{T}) \quad \langle\mit{B} \vdash \mit{bfunbind} \longrightarrow \mit{F}\rangle \end{stackCC} }{ \mit{B} \vdash \mit{funid}_1 ~\mtt{=}~ \mit{funid}_2 ~\langle\mtt{and}~\mit{bfunbind}\rangle \longrightarrow \{\mit{funid}_1 \mapsto \Phi\} \langle+ \mit{F}\rangle } \end{equation} % \section{Dynamic Semantics for MLB} % \subsection{Reduced Syntax} The syntax of MLB is unchanged for the purposes of the dynamic semantics for MLB. However, the $\mrm{Parser}$ $\mcal{P}$ returns a $\mit{topdec}$ in the reduced syntax of Modules. % \subsection{Compound Objects} The compound objects for the MLB dynamic semantics, extra to those for the Modules dynamic semantics, are shown in Figure~\ref{fig:mlb:DS:CompoundObjects}. \begin{figure}[h] \begin{displaymath} \begin{array}{rcl} \mit{BE} & \in & \mrm{BasEnv} = \mrm{BasId} \xrightarrow{\mrm{fin}} \mrm{MBasis} \\ \mit{M} ~\mrm{or}~ \mit{FE},\mit{BE},\mit{B} & \in & \mrm{MBasis} = \mrm{FixEnv} \times \mrm{BasEnv} \times \mrm{Basis} \\ \Psi & \in & \mrm{BasCache} = \mrm{MLBasisPath} \xrightarrow{\mrm{fin}} \mrm{MBasis} \end{array} \end{displaymath} \caption{Compound Semantic Objects}\label{fig:mlb:DS:CompoundObjects} \end{figure} % \subsection{Inference Rules} The semantic rules allow sentences of the form \begin{displaymath} s, A \vdash \mit{phrase} \longrightarrow A', s' \end{displaymath} to be inferred, where $s$, $s'$ are the states before and after the evaluation represented by the sentence. Some hypotheses in rules are not of this form; they are called \emph{side-conditions}. The convention for options is as in the Core and Modules semantics. The state and exception conventions are adopted as in the Core and Modules dynamic semantics. However, it can be shown that the only MLB phrases whose evaluation may cause a side-effect or generate an exception packet are of the form $\mit{basexp}$, $\mit{basdec}$ or $\mit{basbind}$. \vspace{2\parsep} {\large\noindent \textbf{Basis Expressions} \hfill \fbox{$\mit{M}, \Psi \vdash \mit{basexp} \longrightarrow \mit{M}', \Psi' / p$} }\nopagebreak \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basdec} \longrightarrow \mit{M}', \Psi' }{ \mit{M}, \Psi \vdash \mtt{bas}~ \mit{basdec} ~\mtt{end} \longrightarrow \mit{M}', \Psi' } \end{equation} \begin{equation} \judge{ \mit{M}(\mit{basid}) = \mit{M}' }{ \mit{M}, \Psi \vdash \mit{basid} \longrightarrow \mit{M}', \Psi } \end{equation} \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basdec} \longrightarrow \mit{M}_1, \Psi_1 \quad \mit{M} \oplus \mit{M}_1, \Psi_1 \vdash \mit{basexp} \longrightarrow \mit{M}_2, \Psi_2 }{ \mit{M}, \Psi \vdash \mtt{let}~ \mit{basdec} ~\mtt{in}~ \mit{basexp} ~\mtt{end} \longrightarrow \mit{M}_2, \Psi_2 } \end{equation} \vspace{2\parsep} {\large\noindent \textbf{Basis-level Declarations} \hfill \fbox{$\mit{M}, \Psi \vdash \mit{basdec} \longrightarrow \mit{M}', \Psi' / p$} }\nopagebreak \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basbind} \longrightarrow \mit{BE}', \Psi' }{ \mit{M}, \Psi \vdash \msf{basis}~ \mit{basbind} \longrightarrow \mit{BE}' ~\mrm{in}~ \mrm{MBasis}, \Psi' } \end{equation} \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basdec}_1 \longrightarrow \mit{M}_1, \Psi_1 \quad \mit{M} + \mit{M}_1, \Psi_1 \vdash \mit{basdec}_2 \longrightarrow \mit{M}_2, \Psi_2 \quad }{ \mit{M}, \Psi \vdash \mtt{local}~ \mit{basdec}_1 ~\mtt{in}~ \mit{basdec}_2 ~\mtt{end} \longrightarrow \mit{M}_2, \Psi_2 } \end{equation} \begin{equation} \judge{ \mit{M}(\mit{basid}_1) = \mit{M}_1 \quad \cdots \quad \mit{M}(\mit{basid}_n) = \mit{M}_n }{ \mit{M}, \Psi \vdash \mtt{open}~ \mit{basid}_1 \cdots \mit{basid}_n \longrightarrow \mit{M}_1 + \cdots + \mit{M}_n, \Psi } \end{equation} \begin{equation} \judge{ \mit{B}~\mrm{of}~\mit{M} \vdash \mit{bstrbind} \longrightarrow SE }{ \mit{M}, \Psi \vdash \mtt{structure}~ \mit{bstrbind} \longrightarrow \mit{SE} ~\mrm{in}~ \mrm{MBasis}, \Psi } \end{equation} \begin{equation} \judge{ \mrm{Inter}~(\mit{B}~\mrm{of}~\mit{M}) \vdash \mit{bsigbind} \longrightarrow G }{ \mit{M}, \Psi \vdash \mtt{signature}~ \mit{bsigbind} \longrightarrow \mit{G } ~\mrm{in}~ \mrm{MBasis}, \Psi } \end{equation} \begin{equation} \judge{ \mit{B}~\mrm{of}~\mit{M} \vdash \mit{bfunbind} \longrightarrow F }{ \mit{M}, \Psi \vdash \mtt{functor}~ \mit{bfunbind} \longrightarrow \mit{F} ~\mrm{in}~ \mrm{MBasis}, \Psi } \end{equation} \begin{equation} \judge{ }{ \mit{M}, \Psi \vdash \quad \longrightarrow \{\} ~\mrm{in}~ \mrm{MBasis}, \Psi } \end{equation} \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basdec}_1 \longrightarrow \mit{M}_1, \Psi_1 \quad \mit{M} + \mit{M}_1, \Psi_1 \vdash \mit{basdec}_2 \longrightarrow \mit{M}_2, \Psi_2 }{ \mit{M}, \Psi \vdash \mit{basdec}_1 ~\langle\mtt{;}\rangle~ \mit{basdec}_2 \longrightarrow \mit{M}_1 \oplus \mit{M}_2, \Psi_2 } \end{equation} \begin{equation} \label{eqn:mlb:DS:path.sml} \judge{ \mcal{P}(\mit{FE}~\mrm{of}~\mit{M}, \msf{path.sml}) = (\mit{FE}', \mit{topdec}) \quad \mit{B}~\mrm{of}~\mit{M} \vdash \mit{topdec} \Rightarrow \mit{B}' }{ \mit{M}, \Psi \vdash \msf{path.sml} \longrightarrow (\mit{FE}',\{\},\mit{B}'), \Psi } \end{equation} \begin{equation} \judge{ \Psi(\msf{path.mlb}) = \mit{M}' }{ \mit{M}, \Psi \vdash \msf{path.mlb} \longrightarrow \mit{M}', \Psi } \end{equation} \begin{equation} \judge{ \msf{path.mlb} \notin \mrm{Dom}~\Psi \quad \mcal{P}(\msf{path.mlb}) = \mit{basdec} \quad \{\} ~\mrm{in}~ \mrm{MBasis}, \Psi \vdash \mit{basdec} \longrightarrow \mit{M}', \Psi' }{ \mit{M}, \Psi \vdash \msf{path.mlb} \longrightarrow \mit{M}', \Psi' + \{\msf{path.mlb} \mapsto \mit{M}'\} } \end{equation} \begin{samepage} \noindent \textit{Comments}: \begin{itemize} \item[(\ref{eqn:mlb:DS:path.sml})] Note the use of the Definition's $\mit{B} \vdash \mit{topdec} \Rightarrow \mit{B}'$. \end{itemize} \end{samepage} \vspace{2\parsep} {\large\noindent \textbf{Basis Bindings} \hfill \fbox{$\mit{M}, \Psi \vdash \mit{basbind} \longrightarrow \mit{BE}', \Psi' / p$} }\nopagebreak \begin{equation} \judge{ \mit{M}, \Psi \vdash \mit{basexp} \longrightarrow \mit{M}', \Psi' \quad \langle\mit{M}, \Psi' \vdash \mit{basbind} \longrightarrow \mit{BE}'', \Psi''\rangle }{ \mit{M}, \Psi \vdash \mit{basid} ~\mtt{=}~ \mit{basexp} ~\langle\mtt{and}~\mit{basbind}\rangle \longrightarrow \{\mit{basid} \mapsto \mit{M}'\} \langle+ \mit{BE}''\rangle, \Psi'\langle'\rangle } \end{equation} \vspace{2\parsep} {\large\noindent \textbf{(Basis) Structure Bindings} \hfill \fbox{$\mit{B} \vdash \mit{bstrbind} \longrightarrow \mit{SE}$} }\nopagebreak \begin{equation} \label{eqn:mlb:DS:bstrbind} \judge{ \mit{B}(\mit{strid}_2) = E \quad \langle\mit{B} \vdash \mit{bstrbind} \longrightarrow \mit{SE}\rangle }{ \mit{B} \vdash \mit{strid}_1 ~\mtt{=}~ \mit{strid}_2 ~\langle\mtt{and}~\mit{bstrbind}\rangle \longrightarrow \{\mit{strid}_1 \mapsto \mit{E}\} \langle+ \mit{SE}\rangle } \end{equation} \begin{samepage} \noindent \textit{Comments}: \begin{itemize} \item[(\ref{eqn:mlb:DS:bstrbind})] Note that $\mit{bstrbind} \subset \mit{strbind}$. Hence, this rule can be derived from the Definition's $\mit{B} \vdash \mit{strbind} \Rightarrow \mit{SE} / p$, noting that the derivation may neither cause a side-effect nor generate an exception packet. \end{itemize} \end{samepage} \vspace{2\parsep} {\large\noindent \textbf{(Basis) Signature Bindings} \hfill \fbox{$\mit{IB} \vdash \mit{bsigbind} \longrightarrow \mit{G}$} }\nopagebreak \begin{equation} \label{eqn:mlb:DS:bsigbind} \judge{ \mit{IB}(\mit{sigid}_2) = I \quad \langle\mit{IB} \vdash \mit{bsigbind} \longrightarrow \mit{G}\rangle }{ \mit{IB} \vdash \mit{sigid}_1 ~\mtt{=}~ \mit{sigid}_2 ~\langle\mtt{and}~\mit{bsigbind}\rangle \longrightarrow \{\mit{sigid}_1 \mapsto I\} \langle+ \mit{G}\rangle } \end{equation} \begin{samepage} \noindent \textit{Comments}: \begin{itemize} \item[(\ref{eqn:mlb:DS:bsigbind})] Note that $\mit{bsigbind} \subset \mit{sigbind}$. Hence, this rule can be derived from the Definition's $\mit{IB} \vdash \mit{sigbind} \Rightarrow \mit{G}$, noting that the derivation may neither cause a side-effect nor generate an exception packet. \end{itemize} \end{samepage} \vspace{2\parsep} {\large\noindent \textbf{(Basis) Functor Bindings} \hfill \fbox{$\mit{B} \vdash \mit{bfunbind} \longrightarrow \mit{F}$} }\nopagebreak \begin{equation} \judge{ \mit{B}(\mit{funid}_2) = (\mit{strid}:\mit{I},\mit{strexp},\mit{B}) \quad \langle\mit{B} \vdash \mit{bfunbind} \longrightarrow \mit{F}\rangle }{ \mit{B} \vdash \mit{funid}_1 ~\mtt{=}~ \mit{funid}_2 ~\langle\mtt{and}~\mit{bfunbind}\rangle \longrightarrow \{\mit{funid}_1 \mapsto (\mit{strid}:\mit{I},\mit{strexp},\mit{B})\} \langle+ \mit{F}\rangle } \end{equation} \appendix \section{Derived Forms} \label{sec:mlb:DerivedForms} Figure~\ref{fig:mlb:DF:bindings} shows derived forms for structure, signature, and functor bindings in MLB. These derived forms are a useful shorthand for specifying import and export filters. \begin{figure}[h] \begin{center} \begin{tabular}{|l|l|} \multicolumn{1}{c}{Derived Form} & \multicolumn{1}{c}{Equivalent Form} \\ \multicolumn{2}{c}{} \\ \multicolumn{2}{l}{\textbf{(Basis) Structure Bindings} $\mit{bstrbind}$} \\ \hline $\mit{strid} ~\langle\mtt{and}~ \mit{bstrbind}\rangle$ & $\mit{strid} ~\mtt{=}~ \mit{strid} ~\langle\mtt{and}~ \mit{bstrbind}\rangle$ \\ \hline \multicolumn{2}{c}{} \\ \multicolumn{2}{l}{\textbf{(Basis) Signature Bindings} $\mit{bsigbind}$} \\ \hline $\mit{sigid} ~\langle\mtt{and}~ \mit{bsigbind}\rangle$ & $\mit{sigid} ~\mtt{=}~ \mit{sigid} ~\langle\mtt{and}~ \mit{bsigbind}\rangle$ \\ \hline \multicolumn{2}{c}{} \\ \multicolumn{2}{l}{\textbf{(Basis) Functor Bindings} $\mit{bfunbind}$} \\ \hline $\mit{funid} ~\langle\mtt{and}~ \mit{bfunbind}\rangle$ & $\mit{funid} ~\mtt{=}~ \mit{funid} ~\langle\mtt{and}~ \mit{bfunbind}\rangle$ \\ \hline \end{tabular} \end{center} \caption{Derived forms of (Basis) Structure, Signature, and Functor Bindings}\label{fig:mlb:DF:bindings} \end{figure} \bibliographystyle{alpha} \bibliography{bib} \end{document} mlton-20100608/doc/README0000644000076600000240000000572211404435635013217 0ustar mtfstaffMLton is a whole-program optimizing compiler for the Standard ML programming language. MLton has the following features. + Portability. Runs on the following platforms. o ARM: Linux (Debian). o Alpha: Linux (Debian). o AMD64: Darwin (Mac OS X), FreeBSD, Linux (Debian, Fedora, ...), Solaris (10 and above). o HPPA: HPUX (11.11 and above), Linux (Debian). o IA64: HPUX (11.11 and above), Linux (Debian). o PowerPC: AIX (5.2 and above), Darwin (Mac OS X), Linux (Debian, Fedora). o PowerPC64: AIX (5.2 and above). o S390: Linux (Debian). o Sparc: Linux (Debian), Solaris (8 and above). o X86: Cygwin/Windows, Darwin (Mac OS X), FreeBSD, Linux (Debian, Fedora, ...), MinGW/Windows, NetBSD, OpenBSD, Solaris (10 and above). + Robustness. o Supports the full SML 97 language as given in The Definition of Standard ML (Revised). o A complete implementation of the Basis Library. o Generates standalone executables. o Compiles large programs. o Support for large amounts of memory (up to 4G on 32-bit systems; more on 64-bit systems). o Support for large array lengths (up to 2^31 - 1 on 32-bit systems; up to 2^63-1 on 64-bit systems). o Support for large files, using 64-bit file positions. + Performance. o Executables have excellent running times. o Generates small executables. o Untagged and unboxed native integers, reals, and words. o Unboxed native arrays. o Multiple garbage collection strategies. o Fast arbitrary-precision arithmetic based on the GnuMP. + Tools. o Source-level profiling for both time and allocation. o MLLex lexer generator. o MLYacc parser generator. o ML-NLFFIGEN foreign-function-interface generator. + Extensions. o A simple and fast C FFI that supports calling from SML to C and from C to SML. o The ML Basis system for programming in the very large. o Libraries for continuations, finalization, interval timers, random numbers, resource limits, resource usage, signal handlers, object size, system logging, threads, weak pointers, and world save and restore. For more information, go to the MLton home page. http://mlton.org/ There are two mailing lists available. * MLton@mlton.org MLton developers * MLton-user@mlton.org MLton user community doc directory contents: README this file changelog changelog cm2mlb/ a utility for producing ML Basis programs in SML/NJ cmcat/ a utility for producing whole programs in SML/NJ examples/ example SML programs guide/ HTML MLton guide (copy of the MLton wiki) license/ license information mllex.pdf user guide for mllex lexer generator mlton-guide.pdf PDF version of MLton guide mlyacc.pdf user guide for mlyacc parser generator mlton-20100608/doc/style-guide/0000755000076600000240000000000011404470406014557 5ustar mtfstaffmlton-20100608/doc/style-guide/.ignore0000644000076600000240000000017411404435633016050 0ustar mtfstaff*~ TAGS core macros.aux main main.aux main.bbl main.blg main.dvi main.idx main.log main.pdf main.ps main.ps.gz main.toc old mlton-20100608/doc/style-guide/abstract.tex0000644000076600000240000000034711404435633017113 0ustar mtfstaffThis section describes the programming style used in {\mlton}. There are high-level structuring conventions for how the program is broken into modules and low-level formatting conventions for how syntactic constructs are written. mlton-20100608/doc/style-guide/macros.tex0000644000076600000240000000345511404435633016577 0ustar mtfstaff\newcommand{\absolutelink}[1]{\link{\makeurl{#1}}} \newcommand{\addr}{mlton.org} \newcommand{\chaplab}[1]{\label{chapter:#1}} \newcommand{\chapref}[1]{Chapter~\ref{chapter:#1}} \newcommand{\chap}[2]{\chapter{#1}{\chaplab{#2}}} \newcommand{\code}[1]{\htmladdnormallink{{\tt #1}}{../../#1}} \newcommand{\deflab}[1]{\label{definition:#1}} \newcommand{\defref}[1]{Definition~\ref{definition:#1}} \newcommand{\figBegin}{\begin{figure}\begin{boxit}} \newcommand{\figEnd}[2]{\caption{#1}\figlab{#2}\end{boxit}\end{figure}} \newcommand{\figlab}[1]{\label{figure:#1}} \newcommand{\figref}[1]{Figure~\ref{figure:#1}} \newcommand{\lemlab}[1]{\label{lemma:#1}} \newcommand{\lemref}[1]{Lemma~\ref{lemma:#1}} \newcommand{\link}[1]{\htmladdnormallink{{\tt #1}}{#1}} \newcommand{\mailto}[1]{\htmladdnormallink{{\tt #1}}{mailto:#1}} \newcommand{\makeurl}[1]{http://www.\addr/MLton/#1} \newcommand{\mltonmail}{\mailto{MLton@\addr}} \newcommand{\mlton}{MLton} \newcommand{\mosml}{Moscow ML} \newcommand{\place}[1]{\item[\tt #1]\hspace{1in}\\} \newcommand{\seclab}[1]{\label{section:#1}} \newcommand{\secref}[1]{Section~\ref{section:#1}} \newcommand{\smlnj}{SML/NJ} \newcommand{\subsecc}[2]{\subsubsection{#1}\seclab{#2}} \newcommand{\subsec}[2]{\subsection{#1}\seclab{#2}} \newcommand{\subsubsec}[2]{\subsubsection{#1}\label{section:#2}} \newcommand{\tabBegin}{\begin{table}} \newcommand{\tablab}[1]{\label{table:#1}} \newcommand{\tabref}[1]{Table~\ref{table:#1}} \newcommand{\thmlab}[1]{\label{theorem:#1}} \newcommand{\thmref}[1]{Theorem~\ref{theorem:#1}} \newcommand{\userguide}{{\mlton} User Guide} \newcommand{\version}{VERSION} \renewcommand{\sec}[2]{\section{#1}\seclab{#2}} \newenvironment{boxit}{\vbox\bgroup\hrule\hbox\bgroup\vrule\kern3pt\vbox\bgroup\kern3pt\advance\hsize by -6.8pt\relax}{\par\kern3pt\egroup\kern3pt\vrule\egroup\hrule\egroup} mlton-20100608/doc/style-guide/main.tex0000644000076600000240000003677011404435633016245 0ustar mtfstaff\documentclass[12pt]{article} \usepackage{alltt,epsfig,html,latexsym,longtable,makeidx,moreverb} \setlength\topmargin{-0.5in} \setlength\textheight{8.5in} \setlength\textwidth{7.0in} \setlength\oddsidemargin{-0.3in} \setlength\evensidemargin{-0.3in} \hyphenation{} \title{{\mlton} SML Style Guide} \author{Stephen Weeks} \date{\today} \include{macros} \makeindex \begin{document} \maketitle \input{abstract} % conventions chosen so that inertia is towards modularity and reuse % not to type fewer characters \sec{High-level structure}{high-level-structure} Code is structured in {\mlton} so that signatures are closed. Thus, in {\mlton}, one would never write the following. \begin{verbatim} signature SIG = sig val f: Foo.t -> int end \end{verbatim} Instead, one would write the following. \begin{verbatim} signature SIG = sig structure Foo: FOO val f: Foo.t -> int end \end{verbatim} The benefit of this approach is that one can first understand the specifications (i.e. signatures) of all of the modules in {\mlton} before having to look at any implementations (i.e. structures or functors). That is, the signatures are self-contained. We deviate from this only in allowing references to top level types (like {\tt int}), basis library modules, and {\mlton} library modules. So, the following signature is fine, because structure {\tt Regexp} is part of the {\mlton} library. \begin{verbatim} signature SIG = sig val f: Regexp.t -> int end \end{verbatim} We also use signatures to express (some of) the dependencies between modules. For every module {\tt Foo}, we write two signatures in a file named {\tt foo.sig}. The signature {\tt FOO} specifies what is implemented by {\tt Foo}. The signature {\tt FOO\_STRUCTS} specifies the modules that are needed in order to specify {\tt Foo}, but that are not implemented by {\tt Foo}. As an example, consider {\mlton}'s closure conversion pass (in {\tt mlton/closure-convert}), which converts from {\tt Sxml}, {\mlton}'s higher-order simply-typed intermediate language, to {\tt Cps}, {\mlton}'s first-order simply-typed intermediate language. The file {\tt closure-convert.sig} contains the following. \begin{verbatim} signature CLOSURE_CONVERT_STRUCTS = sig structure Sxml: SXML structure Cps: CPS sharing Sxml.Atoms = Cps.Atoms end signature CLOSURE_CONVERT = sig include CLOSURE_CONVERT_STRUCTS val closureConvert: Sxml.Program.t -> Cps.Program.t end \end{verbatim} These signatures say that the {\tt ClosureConvert} module implements a function {\tt closureConvert} that transforms an {\tt Sxml} program into a {\tt Cps} program. They also say that {\tt ClosureConvert} does not implement {\tt Sxml} or {\tt Cps}. Rather, it expects some other modules to implement these and for them to be provided to {\tt ClosureConvert}. The sharing constraint expresses that the ILs must share some basic atoms, like constants, variables, and primitives. Given the two signatures that specify a module, the module definition always has the same structure. A module {\tt Foo} is implemented in a file named {\tt foo.fun}, which defines a functor named {\tt Foo} that takes as an argument a structure matching {\tt FOO\_STRUCTS} and returns as a result a structure matching {\tt FOO}. For example, {\tt closure-convert.fun} contains the following. \begin{verbatim} functor ClosureConvert (S: CLOSURE_CONVERT_STRUCTS): CLOSURE_CONVERT = struct open S fun closureConvert ... end \end{verbatim} Although the signatures for {\tt ClosureConvert} express the dependence on the {\tt Sxml} and {\tt Cps} ILs, they do not express the dependence on other modules that are only used internally to closure conversion. For example, closure conversion uses an auxiliary module {\tt AbstractValue} as part of its higher-order control-flow analysis. Because {\tt AbstractValue} is only used internally to closure conversion, it does not appear in the signatures that specify closure conversion. So, helper functors (like {\tt AbstractValue}) are analogous to helper functions in that they are not visible to clients. We do not put helper functors lexically in scope because SML only allows top level functor definitions and, more importantly, because files would become unmanageably large. Instead, helper functors get their own {\tt .sig} and {\tt .fun} file, which follow exactly the convention above. \section{General conventions} \begin{itemize} \item A line of code never exceeds 80 columns. \item Use alphabetical order wherever possible. \begin{itemize} \item record field names \item datatype constructors \item value specs in signatures \item file lists in CM files \item export lists in CM files \end{itemize} \end{itemize} %------------------------------------------------------ % Signature conventions %------------------------------------------------------ \sec{Signatures}{signature-conventions} We now enumerate the conventions we follow in writing signatures. \begin{enumerate} \item Signature identifiers are in all capitals, using ``\_'' to separate words. \item A signature typically contains a single type specification that defines a type constructor {\tt t}, which is the type of interest in the specification. For oexample, here are signature fragments for integers, lists, and maps. \begin{verbatim} signature INTEGER = sig type t val + : t * t -> t ... end signature LIST = sig type 'a t val map: 'a t * ('a -> 'b) -> 'b t ... end signature MAP sig type ('a, 'b) t val extend: ('a, 'b) t * 'a * 'b -> ('a, 'b) t ... end \end{verbatim} Although at first it might appear confusing to name every type {\tt t}, in fact there is never ambiguity, because at any point in the program there is at most one unqualified {\tt t} in scope, and all other types will be named with long identifiers (like {\tt Int.t} or {\tt Int.t List.t}). For example, the code for a function {\tt foo} within the {\tt Map} module might look like the following. \begin{verbatim} fun foo (l: 'a List.t, n: Int.t): ('a, Int.t) t = ... \end{verbatim} In practice, for pervasive types like {\tt int}, {\tt 'a list}, we often use the standard pervasive name instead of the {\tt t} name. \item Signatures should not contain free types or structures, other than pervasives, basis library modules, or {\mlton} library modules. This was explained in \secref{high-level-structure}. \item If additional abstract types (other than pervasive types) are needed to specify operations, they are included as substructures of the signature, and have a signature in their own right. For example, the following signature is good. \begin{verbatim} signature FOO = sig structure Var: VAR type t val fromVar: Var.t -> t val toVar: t -> Var.t end \end{verbatim} \item Signatures do not use substructures or multiple structures to group different operations on the same type. This makes you waste energy remembering where the operations are. For exmample, the following signature is bad. \begin{verbatim} signature REAL = sig type t val + : t * t -> t structure Trig: sig val sin: t -> t val cos: t -> t end end \end{verbatim} \item Signatures usually should not contain datatypes. This exposes the implementation of what should be an abstract type. For example, the following signature is bad. \begin{verbatim} signature COMPLEX = sig datatype t = T of real * real end \end{verbatim} A common exception to this rule is abstract syntax trees. \item Use structure sharing to express type sharing. For example, in {\tt closure-convert.sig}, a single structure sharing equation expresses a number of type sharing equations. \end{enumerate} %------------------------------------------------------ % Value specifications %------------------------------------------------------ \subsec{Value specifications}{val-specs} Here are the conventions that we use for individual value specifications in signatures. Of course, many of these conventions directly impact the way in which we write the core language expressions that implement the specifications. \begin{enumerate} \item In a datatype specification, if there is a single constructor, then that constructor is called {\tt T}. \begin{verbatim} datatype t = T of int \end{verbatim} \item In a datatype specification, if a constructor carries multiple values of the same type, use a record to name them to avoid confusion. \begin{verbatim} datatype t = T of {length: int, start: int} \end{verbatim} \item Identifiers begin with and use small letters, using capital letters to separate words. \begin{verbatim} val helloWorld: unit -> unit \end{verbatim} \item There is no space before the colon, and a single space after it. In the case of operators (like {\tt +}), there is a space before the colon to avoid lexing the colon as part of the operator. \item Pass multiple arguments as tuple, not curried. \begin{verbatim} val eval: Exp.t * Env.t -> Val.t \end{verbatim} \item Currying is only used when there staging of a computation, i.e., if precomputation is done on one of the arguments. \begin{verbatim} val match: Regexp.t -> string -> bool \end{verbatim} \item Functions which take a single element of the abstract type of a signature take the element as the first argument, and auxiliary arguments after. \begin{verbatim} val push: t * int -> unit val map: 'a t * ('a -> 'b) -> 'b t \end{verbatim} \item $n$-ary operations take the $n$ elements first, and auxilary arguments after. \begin{verbatim} val merge: 'a t * 'a t * ('a * 'a -> 'b) -> 'b t \end{verbatim} \item If two arguments to a function are of the same type, and the operation is not commutative, pass them using a record. This names the arguments and ensures they are not confused. Exceptions are the standard numerical and algebraic operators. \begin{verbatim} val fromTo: {start: int, step: int, stop: int} -> int list val substring: t * {length: int, start: int} -> t val - : t * t -> t \end{verbatim} \item Field names in record types are written in alphabetical order. \item Return multiple results as a tuple, or as a record if there is the potential for confusion. \begin{verbatim} val parse: string -> t * string val quotRem: t * t -> t * t val partition: 'a t * ('a -> bool) -> {no: 'a t, yes: 'a t} \end{verbatim} \item If a function returns multiple results, at least two of which are of the same type, and the name of the function does not clearly indicate which result is which, use a record to name the results. \begin{verbatim} val vars: t -> {frees : Vars.t, bound : Vars.t} val partition: 'a t * ('a -> bool) -> {yes : 'a t, no : 'a t} \end{verbatim} \item Use the same names and argument orders for similar functions in different signatures. This is especially common in the {\mlton} library. \begin{verbatim} val < : t * t -> bool val equals: t * t -> bool val forall: 'a t * ('a -> bool) -> bool \end{verbatim} \item Use {\tt is}, {\tt are}, {\tt can}, etc. to name predicates. One exception is {\tt equals}. \begin{verbatim} val isEven: int -> bool val canRead: t -> bool \end{verbatim} \end{enumerate} %------------------------------------------------------ % Signature example %------------------------------------------------------ \subsection{Example} Here is the complete specification of a simple interpreter. This demonstrates the {\tt t}-convention, the closed-signature convention, and the use of sharing constraints. \begin{verbatim} signature VAR = sig type t end signature EXP = sig structure Var: VAR datatype t = Var of Var.t | Lam of Var.t * t | App of t * t end signature VAL = sig structure Var: VAR type t val var: Var.t -> t val lam: Var.t * t -> t val app: t * t -> t end signature INTERP = sig structure Exp: EXP structure Val: VAL sharing Exp.Var = Val.Var val eval: Exp.t -> Val.t end signature ENV = sig structure Var: VAR type 'a t val lookup: 'a t * Var.t -> 'a val extend: 'a t * Var.t * 'a -> 'a t end \end{verbatim} %------------------------------------------------------ % Functors and structures %------------------------------------------------------ \section{Functors and structures} We now enumerate the conventions we follow in writing functors and structures. There is some repetition with \secref{high-level-structure}. \begin{enumerate} \item Functor identifiers begin with capital letters, use mixed case, and use capital letters to separate words. \item Functor definitions look like the following. \begin{verbatim} functor Foo (S: FOO_STRUCTS): FOO = struct open S ... end \end{verbatim} \item The name of the functor is the same as the name of the signature describing the structure it produces. \item The functor result is constrained by a signature. \item A functor takes as arguments any structures that occur in the signature of the result that it does not implement. \item Structure identifiers begin with capital letters, and use capital letters to separate words. \item The name of the structure is the same as the name of the functor that produces it. \item A structure definition looks like one of the following. \begin{verbatim} structure Foo = Foo (S) structure Foo = struct ... end \end{verbatim} \item Avoid the use of {\tt open} except within tightly constrained scopes. The use of {\tt open} makes it hard to look at code later and understand where things come from. \end{enumerate} %------------------------------------------------------ % Core expressions %------------------------------------------------------ \section{Core expressions} We now enumerate the conventions we follow in writing core expressions. We do not repeat the conventions of \secref{val-spec}, although many of them apply here. \begin{enumerate} \item Tuples are written with spaces after commas, like {\tt (a, b, c)}. \item Records are written with spaces on both sides of equals and with spaces after commas, like {\tt \{bar = 1, foo = 2\}}. \item Record field names are written in alphabetical order, both in expressions and types. \item Function application is written with a space between the function and the argument. If there is one untupled argument, it looks like {\tt f x}. If there is a tupleg argument, it looks like {\tt f (x, y, z)}. \item When you want to mix declarations with side-effecting statements, use a declaration like {\tt val \_ = sideEffectingProcedure()}. \item In sequence expressions {\tt (e1; e2)} that span multiple lines, place the semicolon at the beginning of lines. \begin{verbatim} (e1 ; e2 ; e3) \end{verbatim} \item Never write nonexhaustive matches. Always handle the default case and raise an error message. Your error message will be better than the compiler's. Also, if you have lots of uncaught cases, then you are probably not using the type system in a strong enough way - your types are not expressing as much as they could. \item Never use the syntax for declaring functions that repeats the function name. Use {\tt case} or {\tt fn} instead. That is, do not write the following. \begin{verbatim} fun f 0 = 1 | f n = n + 1 \end{verbatim} Instead, write the following. \begin{verbatim} val f = fn 0 => 1 | n => n + 1 \end{verbatim} Or, write the following. \begin{verbatim} fun f n = case n of 0 => 1 | _ => n + 1 \end{verbatim} \end{enumerate} \bibliographystyle{alpha} \bibliography{bib} \end{document} mlton-20100608/doc/style-guide/Makefile0000644000076600000240000000157411404435633016231 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## TEX_FILES := \ abstract.tex \ main.tex \ macros.tex \ FIG_FILES := \ all: main.ps # -verbosity 0 be quieter (but not quiet enough for my taste) # -address '' puts no author address at the bottom of each page main/main.html: $(TEX_FILES) latex2html -verbosity 1 -address '' -local_icons main.tex cd main && rm -f WARNINGS images.* *.pl cd main && rm -f index.html && ln -s main.html index.html main.dvi: $(TEX_FILES) $(FIG_FILES) latex main; bibtex main; latex main; latex main main.ps: main.dvi dvips -o main.ps main %.ps: %.fig fig2dev -Leps $< $@ .PHONY: clean clean: ../../bin/clean .PHONY: tags tags: etags *.tex mlton-20100608/doc/x86_64-port-notes/0000755000076600000240000000000011404470406015372 5ustar mtfstaffmlton-20100608/doc/x86_64-port-notes/bench-20060527.txt0000644000076600000240000006503411404435632020127 0ustar mtfstaff Now that the refactoring on the x86_64 branch as mostly quiesced, I ran the benchmark suite to verify that there weren't any major regressions in performance. It is to be expected that there will be some variability between HEAD and the x86_64 branch, since lots of code has been tweaked -- both in the runtime and in the implementation of the Basis Library. I've run the benchmark suite on the following two systems: * FedoraCore 4; gcc 4.0.2; AMD Opteron 2GHz; 4GB memory * RedHat; gcc 3.2.2; Intel Pentium 1.1GHz; 2GB memory Overall, there don't appear to be any significant (unexplained) regressions, but the x86_64 branch does appear to be running a little bit slower. I'll go over some of the highlights, but if anyone sees anything that they believe deserves more investigation, let me know. Reminder: on the AMD Opteron system, these are 32-bit executables (running on a 64-bit kernel). However, I will note that on the Opteron we compile the runtime and C-codegen generated files with the '-mopteron' option. Run-time ratio: Across the board, the 'checksum' benchmark performs poorly under the x86_64 branch; this is easily explained by the fact that the 'checksum' benchmark is dominated by PackWord32Little.subArr, which is a primitive on HEAD, but is a C-call on the x86_64 branch. See revision 4418. We should eventually turn the PackWord operations into a more general primitives; see: http://mlton.org/pipermail/mlton-user/2004-November/000556.html http://mlton.org/pipermail/mlton/2004-November/026246.html This should also partially explain the performance of 'md5', which also makes use of PackWord32Little operations. For the native-codegen on HEAD vs x86_64 on Opteron, the outliers are: checksum 2.31 count-graphs 1.63 md5 1.41 ray 1.08 The 'count-graphs' benchmark deserves further investigation, since it seems to perform badly on the configurations as well. For the native-codegen on HEAD vs x86_64 on i686, the outliers are: checksum 2.18 count-graphs 1.74 md5 1.47 tyan 1.25 logic 1.20 DLXSimulator 1.13 zebra 1.12 zern 1.12 model-elimination 1.11 hamlet 1.09 wc-input1 1.09 life 1.09 mlyacc 1.08 flat-array 1.08 lexgen 1.08 smith-normal-form 1.07 For the C-codegen on HEAD vs x86_64 on Opteron, the outliers are: checksum 4.61 mpuz 2.05 count-graphs 1.68 md5 1.60 tailfib 1.53 zern 1.40 imp-for 1.40 simple 1.26 matrix-multiply 1.24 mandelbrot 1.18 vector-concat 1.15 vliw 1.12 tyan 1.11 fib 1.10 hamlet 1.09 flat-array 1.07 For the C-codegen on HEAD vs x86_64 on i686, the outliers are: checksum 3.80 count-graphs 1.68 md5 1.61 zern 1.24 ray 1.19 logic 1.18 mpuz 1.18 tyan 1.16 vliw 1.14 barnes-hut 1.13 fft 1.13 zebra 1.12 DLXSimulator 1.12 smith-normal-form 1.08 knuth-bendix 1.07 model-elimination 1.06 mlyacc 1.06 wc-scanStream 1.06 hamlet 1.06 psdes-random 1.06 Since quite a few of our platforms are using the C-codegen, its probably worth investigating whether there is some low-hanging fruit to improve its performance. Size: Generally, the size of executables on the x86_64 branch are larger than those on HEAD. Size x86_64 - Size HEAD: system codegen mean min max Opteron native 33K 0K 37K Opteron C 32K 0K 37K Opteron byte 56K 0K 66K Pentium native 20K 0K 24K Pentium C 18K -18K 38K Much of the size can probably be attributed to the refactored runtime code and aggressive inlining with the garbage collector. On the Opteron system: text data bss dec hex filename 54485 1 352 54838 d636 mlton.svn.x86_64/runtime/gc.o 33175 4 52 33231 81cf mlton.svn.HEAD/runtime/gc.o 52318 1004 31040 84362 1498a mlton.svn.x86_64/runtime/bytecode/interpret.o 34381 1004 31040 66425 10379 mlton.svn.HEAD/bytecode/interpret.o 129625 1185 34399 165209 28559 mlton.svn.x86_64/build/lib/self/libmlton.a 91606 1136 33303 126045 1ec5d mlton.svn.HEAD/build/lib/self/libmlton.a and on the Pentium system: text data bss dec hex filename 37098 16 400 37514 928a mlton.svn.x86_64/runtime/gc.o 29645 16 36 29697 7401 mlton.svn.HEAD/runtime/gc.o 35451 1004 31424 67879 10927 mlton.svn.x86_64/runtime/bytecode/interpret.o 32041 1004 31040 64085 fa55 mlton.svn.HEAD/bytecode/interpret.o 91314 1232 82490 175036 2abbc mlton.svn.x86_64/build/lib/self/libmlton.a 78982 1172 33239 113393 1baf1 mlton.svn.HEAD/build/lib/self/libmlton.a Compile time: On the Opteron system, compile times are on average 1.7s longer on the x86_64 branch than on HEAD (for all codegens), with no compile time more than 2s longer. I believe that this is mainly explained by the revised Basis Library, which is nearly 10000 lines longer (39419 lines for x86_64, 29604 lines for HEAD), and makes aggressive use of functors. When compiling the program "val () = ()", which includes type-checking the Basis Library, the x86_64 branch (on Opteron) requires parseAndElaborate starting parseAndElaborate finished in 2.47 + 1.50 (38% GC) while HEAD requires parseAndElaborate starting parseAndElaborate finished in 1.33 + 0.97 (42% GC) Benchmark Data: FedoraCore 4; gcc 4.0.2; AMD Opteron 2GHz; 4GB memory MLton0 -- /home/fluet/mlton/mlton.svn.HEAD/build/bin/mlton -codegen native MLton1 -- /home/fluet/mlton/mlton.svn.HEAD/build/bin/mlton -codegen c MLton2 -- /home/fluet/mlton/mlton.svn.HEAD/build/bin/mlton -codegen bytecode MLton3 -- /home/fluet/mlton/mlton.svn.x86_64/build/bin/mlton -codegen native MLton4 -- /home/fluet/mlton/mlton.svn.x86_64/build/bin/mlton -codegen c MLton5 -- /home/fluet/mlton/mlton.svn.x86_64/build/bin/mlton -codegen bytecode run time ratio benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 barnes-hut 1.00 1.05 35.52 0.99 1.05 39.91 boyer 1.00 1.45 48.58 0.90 1.34 54.04 checksum 1.00 0.94 74.71 2.31 4.35 109.26 count-graphs 1.00 1.05 71.94 1.63 1.77 118.20 DLXSimulator 1.00 1.13 42.71 1.04 1.19 47.86 fft 1.00 1.06 11.10 0.98 1.06 12.40 fib 1.00 1.49 45.77 1.00 1.63 51.21 flat-array 1.00 2.38 * 0.97 2.54 139.95 hamlet 1.00 2.46 52.35 1.01 2.68 58.79 imp-for 1.00 0.92 111.76 1.01 1.30 124.50 knuth-bendix 1.00 1.97 82.38 1.01 2.02 92.02 lexgen 1.00 1.25 63.31 0.97 1.15 69.67 life 1.00 1.03 79.25 0.97 1.02 89.04 logic 1.00 1.49 44.24 1.00 1.51 49.64 mandelbrot 1.00 1.24 76.40 1.01 1.46 86.30 matrix-multiply 1.00 1.34 71.18 1.00 1.66 79.63 md5 1.00 1.31 33.23 1.41 2.10 43.49 merge 1.00 1.17 29.43 0.96 1.12 32.95 mlyacc 1.00 1.28 37.96 1.02 1.29 42.41 model-elimination 1.00 1.61 39.69 1.00 1.54 44.53 mpuz 1.00 1.02 71.92 1.01 2.08 84.50 nucleic 1.00 1.09 34.95 0.98 1.09 39.47 output1 1.00 2.34 117.37 1.00 1.72 131.77 peek 1.00 0.58 86.42 1.01 0.58 96.18 psdes-random 1.00 1.53 137.87 1.04 1.54 153.87 ratio-regions 1.00 1.21 55.21 0.99 1.22 61.90 ray 1.00 1.15 28.64 1.08 1.20 32.52 raytrace 1.00 1.56 55.36 1.01 1.52 62.11 simple 1.00 1.59 50.06 0.99 2.00 56.12 smith-normal-form 1.00 1.00 1.55 1.00 1.00 1.65 tailfib 1.00 2.16 125.85 1.00 3.29 141.95 tak 1.00 1.21 44.07 1.00 1.26 49.04 tensor 1.00 2.73 221.51 1.00 2.34 249.18 tsp 1.00 1.07 32.75 0.99 1.10 36.47 tyan 1.00 1.23 49.00 0.99 1.36 54.39 vector-concat 1.00 2.10 117.04 1.00 2.41 131.42 vector-rev 1.00 2.20 108.94 1.00 2.22 123.01 vliw 1.00 1.58 38.45 0.95 1.77 42.15 wc-input1 1.00 1.45 66.78 1.00 1.01 72.56 wc-scanStream 1.00 1.38 85.70 1.01 1.29 96.10 zebra 1.00 0.79 59.80 1.02 0.81 69.07 zern 1.00 1.37 51.00 0.99 1.93 57.92 size benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 barnes-hut 105,267 104,417 165,416 139,837 138,215 232,889 boyer 140,514 159,758 235,153 177,957 197,533 291,874 checksum 56,054 56,294 95,329 89,801 93,425 153,298 count-graphs 68,882 76,202 127,057 106,213 111,337 182,690 DLXSimulator 135,234 146,354 229,221 169,092 176,216 287,985 fft 67,065 75,089 119,474 100,762 108,282 175,074 fib 49,670 56,438 95,369 86,841 92,845 151,778 flat-array 49,710 56,514 95,425 86,913 92,665 151,906 hamlet 1,257,401 1,436,385 2,205,344 1,278,403 1,468,331 2,251,676 imp-for 49,542 56,306 95,497 86,713 92,393 151,938 knuth-bendix 115,194 124,202 187,597 150,372 155,792 247,873 lexgen 208,859 220,971 322,626 242,029 254,149 383,194 life 68,046 74,486 124,033 105,377 110,749 180,674 logic 108,498 123,142 198,321 146,089 159,877 255,202 mandelbrot 49,606 56,666 95,385 86,921 92,777 151,938 matrix-multiply 50,146 56,970 96,281 87,413 92,977 152,818 md5 83,618 85,762 131,941 120,604 123,072 194,257 merge 51,274 57,790 97,689 88,469 94,061 154,178 mlyacc 511,891 565,983 795,250 546,353 602,813 856,506 model-elimination 643,424 768,560 1,045,115 662,174 784,430 1,096,923 mpuz 52,582 59,982 100,817 89,649 96,245 157,218 nucleic 200,330 159,021 226,891 237,861 195,196 286,321 output1 86,748 90,724 136,647 121,316 120,832 196,545 peek 82,330 84,514 130,445 117,076 117,056 190,769 psdes-random 50,302 57,286 96,545 87,489 93,189 153,026 ratio-regions 75,846 83,366 136,993 112,873 120,301 192,674 ray 189,999 206,069 294,804 210,841 221,443 345,525 raytrace 269,012 311,606 437,745 292,472 324,700 490,412 simple 229,022 252,368 336,575 262,402 287,880 398,698 smith-normal-form 187,722 210,750 264,629 223,784 245,772 330,081 tailfib 49,334 56,242 94,961 86,505 92,329 151,394 tak 49,750 56,386 95,377 86,953 92,561 151,842 tensor 103,625 112,809 174,708 139,227 145,515 239,952 tsp 88,194 89,620 142,687 122,964 124,362 207,232 tyan 140,858 155,018 234,685 176,684 184,844 295,409 vector-concat 50,934 57,954 97,505 88,137 94,241 153,986 vector-rev 50,194 57,094 96,289 87,397 93,365 152,770 vliw 400,590 475,066 682,121 415,992 492,872 727,701 wc-input1 107,822 111,206 171,417 142,588 144,564 235,201 wc-scanStream 115,102 121,150 183,745 149,936 151,548 247,521 zebra 147,134 149,246 256,645 181,800 183,968 316,545 zern 96,747 104,479 153,564 113,951 121,011 198,699 compile time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 barnes-hut 3.67 5.91 3.54 5.39 7.62 5.40 boyer 4.03 8.59 3.65 5.66 10.19 5.28 checksum 2.73 2.91 2.74 4.41 4.59 4.48 count-graphs 3.08 4.21 3.00 4.73 5.85 4.66 DLXSimulator 4.23 7.94 3.89 5.89 9.70 5.64 fft 2.96 3.49 2.92 4.66 5.17 4.65 fib 2.72 2.91 2.73 4.37 4.55 4.40 flat-array 2.72 2.92 2.74 4.42 4.57 4.40 hamlet 46.21 100.44 42.05 45.03 98.89 40.30 imp-for 2.76 2.94 2.75 4.44 4.61 4.46 knuth-bendix 3.52 6.53 3.31 5.20 8.28 5.05 lexgen 4.92 11.05 4.24 6.63 12.94 6.05 life 2.98 4.07 2.89 4.66 5.73 4.61 logic 3.59 6.10 3.26 5.21 7.76 4.92 mandelbrot 2.73 2.93 2.73 4.42 4.64 4.45 matrix-multiply 2.76 2.97 2.74 4.43 4.66 4.49 md5 3.07 4.14 3.01 4.80 6.09 4.80 merge 2.75 2.98 2.74 4.39 4.65 4.42 mlyacc 10.98 28.62 8.40 12.62 30.30 9.86 model-elimination 11.25 36.90 8.95 12.91 38.79 10.63 mpuz 2.79 3.13 2.76 4.45 4.81 4.45 nucleic 5.88 12.55 5.40 7.36 14.18 7.08 output1 3.04 4.26 2.99 4.74 6.03 4.73 peek 2.98 4.03 2.95 4.76 5.89 4.73 psdes-random 2.73 2.94 2.74 4.40 4.62 4.43 ratio-regions 3.27 4.71 3.11 4.89 6.32 4.81 ray 4.39 9.19 3.95 6.14 11.10 5.78 raytrace 6.15 15.08 5.24 7.86 16.82 7.11 simple 5.07 11.42 4.42 6.76 13.30 6.15 smith-normal-form 4.37 11.58 3.92 6.14 13.51 5.73 tailfib 2.72 2.89 2.72 4.36 4.56 4.40 tak 2.72 2.89 2.71 4.38 4.59 4.40 tensor 3.78 6.03 3.63 5.55 8.00 5.50 tsp 3.19 4.47 3.11 4.93 6.39 4.88 tyan 4.13 8.46 3.77 5.83 10.41 5.55 vector-concat 2.73 2.98 2.73 4.41 4.62 4.41 vector-rev 2.72 2.93 2.71 4.37 4.59 4.39 vliw 8.26 22.55 6.72 9.85 24.40 8.39 wc-input1 3.39 5.73 3.26 5.10 7.46 5.06 wc-scanStream 3.50 5.91 3.32 5.20 7.66 5.13 zebra 4.13 8.83 3.62 5.75 10.52 5.34 zern 3.04 3.80 2.99 4.74 5.63 4.78 run time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 barnes-hut 14.30 15.05 507.90 14.21 14.99 570.63 boyer 18.04 26.23 876.42 16.21 24.16 974.97 checksum 42.48 40.08 3173.59 97.97 184.62 4641.33 count-graphs 20.80 21.87 1496.06 33.84 36.84 2458.24 DLXSimulator 17.77 20.10 758.85 18.52 21.07 850.44 fft 14.48 15.29 160.74 14.16 15.32 179.61 fib 34.68 51.60 1587.41 34.68 56.67 1776.10 flat-array 7.43 17.68 * 7.23 18.84 1039.24 hamlet 16.43 40.33 860.05 16.55 44.09 965.80 imp-for 28.83 26.66 3222.03 29.07 37.34 3589.23 knuth-bendix 17.29 34.10 1424.23 17.51 34.84 1590.71 lexgen 20.57 25.65 1302.31 19.97 23.67 1433.19 life 8.93 9.23 707.85 8.65 9.12 795.25 logic 18.82 27.99 832.67 18.76 28.49 934.14 mandelbrot 24.40 30.33 1864.51 24.71 35.64 2105.89 matrix-multiply 3.30 4.43 234.57 3.30 5.48 262.39 md5 32.37 42.48 1075.62 45.56 67.87 1407.68 merge 14.47 16.89 425.70 13.82 16.20 476.70 mlyacc 16.48 21.16 625.73 16.84 21.25 699.21 model-elimination 28.66 46.19 1137.74 28.66 44.12 1276.43 mpuz 21.92 22.26 1576.65 22.08 45.68 1852.59 nucleic 14.80 16.06 517.07 14.48 16.16 584.01 output1 7.19 16.79 843.77 7.20 12.40 947.25 peek 34.60 19.99 2990.07 34.79 19.96 3327.80 psdes-random 15.90 24.29 2192.78 16.47 24.48 2447.26 ratio-regions 24.02 28.99 1325.99 23.87 29.37 1486.63 ray 15.73 18.14 450.44 17.05 18.88 511.61 raytrace 16.37 25.59 906.21 16.55 24.86 1016.67 simple 20.16 32.05 1009.38 20.03 40.41 1131.65 smith-normal-form 10.32 10.32 15.96 10.31 10.32 17.07 tailfib 19.36 41.81 2436.39 19.36 63.77 2748.18 tak 12.92 15.70 569.51 12.92 16.24 633.76 tensor 17.30 47.15 3831.05 17.30 40.45 4309.63 tsp 19.84 21.15 649.58 19.54 21.86 723.41 tyan 18.70 22.97 916.13 18.60 25.49 1016.87 vector-concat 30.16 63.24 3530.57 30.21 72.83 3964.18 vector-rev 18.61 40.95 2027.41 18.54 41.38 2289.30 vliw 18.69 29.49 718.62 17.68 33.00 787.79 wc-input1 27.42 39.70 1830.85 27.33 27.72 1989.39 wc-scanStream 14.00 19.33 1200.10 14.12 18.02 1345.82 zebra 26.26 20.82 1570.44 26.68 21.17 1814.11 zern 17.18 23.60 876.26 16.94 33.15 995.14 RedHat; gcc 3.2.2; Intel Pentium 1.1GHz; 2GB memory MLton0 -- /home/fluet/mlton/mlton.svn.HEAD/build/bin/mlton -codegen native MLton1 -- /home/fluet/mlton/mlton.svn.HEAD/build/bin/mlton -codegen c MLton2 -- /home/fluet/mlton/mlton.svn.x86_64/build/bin/mlton -codegen native MLton3 -- /home/fluet/mlton/mlton.svn.x86_64/build/bin/mlton -codegen c run time ratio benchmark MLton0 MLton1 MLton2 MLton3 barnes-hut 1.00 1.03 1.05 1.16 boyer 1.00 1.17 1.04 1.22 checksum 1.00 0.83 2.18 3.15 count-graphs 1.00 1.44 1.74 2.42 DLXSimulator 1.00 1.07 1.13 1.20 fft 1.00 1.04 1.01 1.17 fib 1.00 1.35 1.00 1.32 flat-array 1.00 1.49 1.08 1.50 hamlet 1.00 2.01 1.09 2.13 imp-for 1.00 1.67 1.00 1.30 knuth-bendix 1.00 1.98 1.00 2.12 lexgen 1.00 1.34 1.08 1.39 life 1.00 1.25 1.09 1.30 logic 1.00 1.30 1.20 1.53 mandelbrot 1.00 1.08 1.00 1.04 matrix-multiply 1.00 1.08 1.00 0.99 md5 1.00 1.39 1.47 2.24 merge 1.00 1.00 1.00 1.00 mlyacc 1.00 1.30 1.08 1.38 model-elimination 1.00 1.35 1.11 1.43 mpuz 1.00 1.63 0.97 1.91 nucleic 1.00 1.06 1.02 1.10 output1 1.00 1.73 0.94 1.57 peek 1.00 1.98 1.00 1.39 psdes-random 1.00 0.93 1.00 0.98 ratio-regions 1.00 1.39 1.01 1.42 ray 1.00 1.05 0.99 1.25 raytrace 1.00 1.44 1.00 1.49 simple 1.00 1.53 0.82 1.60 smith-normal-form 1.00 1.00 1.07 1.08 tailfib 1.00 2.42 1.00 2.40 tak 1.00 1.12 1.01 1.05 tensor 1.00 2.87 1.00 1.83 tsp 1.00 1.46 1.04 1.51 tyan 1.00 1.18 1.25 1.36 vector-concat 1.00 1.48 0.99 1.20 vector-rev 1.00 1.20 0.93 1.01 vliw 1.00 1.36 1.04 1.55 wc-input1 1.00 1.90 1.09 1.55 wc-scanStream 1.00 1.38 1.04 1.46 zebra 1.00 1.20 1.12 1.34 zern 1.00 1.24 1.12 1.54 size benchmark MLton0 MLton1 MLton2 MLton3 barnes-hut 97,508 97,306 120,294 116,848 boyer 136,927 142,863 160,418 165,470 checksum 51,663 51,311 71,706 73,842 count-graphs 65,295 73,315 88,674 95,194 DLXSimulator 127,763 136,771 149,829 154,097 fft 62,846 70,210 82,509 88,137 fib 46,083 51,327 69,286 72,846 flat-array 46,123 51,323 69,358 73,914 hamlet 1,254,374 1,363,870 1,264,408 1,344,664 imp-for 45,955 51,099 69,158 72,738 knuth-bendix 107,539 125,899 130,949 146,065 lexgen 202,036 233,364 223,350 243,438 life 64,491 67,455 87,870 89,438 logic 104,943 99,311 128,614 121,806 mandelbrot 46,019 51,251 69,318 72,890 matrix-multiply 46,559 51,859 69,810 73,490 md5 76,019 75,419 100,965 99,785 merge 47,679 52,663 70,914 74,478 mlyacc 505,988 610,056 528,634 649,166 model-elimination 635,421 712,925 643,211 701,051 mpuz 48,987 55,991 72,110 77,310 nucleic 196,751 149,485 220,274 171,076 output1 79,133 77,813 101,909 98,473 peek 74,683 77,835 97,653 98,825 psdes-random 46,715 52,127 69,934 73,782 ratio-regions 72,275 87,903 95,350 106,166 ray 180,588 193,178 190,398 206,080 raytrace 260,753 317,931 272,662 323,609 simple 220,727 257,329 242,305 269,807 smith-normal-form 180,099 188,743 204,361 211,045 tailfib 45,747 51,067 68,950 72,730 tak 46,163 51,307 69,398 72,890 tensor 95,986 105,482 119,796 127,380 tsp 80,579 81,508 103,501 104,954 tyan 133,243 143,675 157,293 170,973 vector-concat 47,379 52,643 70,582 74,330 vector-rev 46,607 51,767 69,842 73,342 vliw 391,203 452,871 395,557 450,293 wc-input1 100,239 107,207 123,197 128,853 wc-scanStream 107,511 107,671 130,497 129,437 zebra 139,535 137,751 162,385 159,665 zern 88,236 95,996 95,376 101,680 compile time benchmark MLton0 MLton1 MLton2 MLton3 barnes-hut 9.28 13.52 14.43 19.60 boyer 9.55 28.24 15.23 34.07 checksum 6.51 6.88 11.99 12.31 count-graphs 7.30 9.48 12.74 14.96 DLXSimulator 10.03 18.45 15.63 23.99 fft 6.98 7.97 12.60 13.52 fib 6.43 6.80 11.88 12.50 flat-array 6.45 6.78 11.96 14.45 hamlet 114.74 240.97 144.92 274.80 imp-for 6.57 6.88 12.00 12.28 knuth-bendix 8.31 14.22 14.11 20.17 lexgen 11.86 25.81 17.46 31.33 life 7.10 9.10 12.50 14.70 logic 8.52 14.08 14.15 19.53 mandelbrot 6.44 6.86 12.02 12.35 matrix-multiply 6.57 6.92 12.08 12.48 md5 7.29 9.64 12.99 15.69 merge 6.55 6.93 11.98 12.49 mlyacc 27.38 74.39 34.33 79.63 model-elimination 28.79 85.30 36.07 89.53 mpuz 6.60 7.31 12.11 12.71 nucleic 13.67 39.16 19.36 44.77 output1 7.26 9.64 12.94 15.49 peek 7.10 9.18 12.86 14.92 psdes-random 6.49 6.80 12.00 12.47 ratio-regions 7.77 10.97 13.27 16.10 ray 10.59 20.62 16.37 26.32 raytrace 14.88 36.18 21.19 42.23 simple 12.83 30.33 18.15 33.79 smith-normal-form 10.53 79.19 16.41 97.25 tailfib 6.69 7.00 13.06 13.25 tak 7.41 9.00 14.06 12.38 tensor 9.42 14.23 16.44 20.07 tsp 7.68 10.41 13.33 16.61 tyan 10.74 20.20 16.64 26.49 vector-concat 6.56 7.31 12.01 12.41 vector-rev 6.96 8.09 15.08 12.44 vliw 24.07 52.93 27.06 57.14 wc-input1 8.39 13.38 15.94 23.38 wc-scanStream 8.23 13.28 14.53 20.53 zebra 11.06 17.77 15.57 23.29 zern 7.45 8.66 13.06 16.02 run time benchmark MLton0 MLton1 MLton2 MLton3 barnes-hut 44.53 45.98 46.83 51.87 boyer 55.60 65.19 57.62 68.05 checksum 97.34 80.59 211.83 306.25 count-graphs 40.15 57.72 69.80 97.06 DLXSimulator 85.24 91.25 96.11 102.38 fft 35.98 37.38 36.41 42.09 fib 70.23 94.84 70.23 92.87 flat-array 24.93 37.08 26.86 37.37 hamlet 50.91 102.55 55.62 108.50 imp-for 46.81 78.06 46.80 61.02 knuth-bendix 38.03 75.16 37.99 80.62 lexgen 44.15 58.97 47.56 61.29 life 14.89 18.63 16.18 19.41 logic 53.38 69.48 64.10 81.84 mandelbrot 55.98 60.45 55.97 58.03 matrix-multiply 7.47 8.07 7.50 7.37 md5 53.16 73.84 78.02 118.96 merge 77.94 77.81 77.99 77.71 mlyacc 40.97 53.38 44.35 56.66 model-elimination 77.74 104.80 86.44 111.25 mpuz 41.84 68.04 40.67 80.00 nucleic 42.22 44.77 43.24 46.29 output1 16.02 27.75 15.08 25.12 peek 44.63 88.53 44.52 62.01 psdes-random 38.86 36.12 38.85 38.19 ratio-regions 51.77 71.99 52.52 73.43 ray 33.97 35.83 33.70 42.58 raytrace 42.30 61.08 42.47 63.03 simple 60.46 92.79 49.83 96.88 smith-normal-form 35.23 35.25 37.70 38.20 tailfib 43.77 105.75 43.79 104.84 tak 27.60 30.86 27.76 28.95 tensor 58.98 169.31 59.06 107.94 tsp 59.66 87.04 62.28 90.29 tyan 59.12 69.47 73.83 80.61 vector-concat 85.93 126.95 85.20 102.89 vector-rev 122.82 147.47 113.88 123.68 vliw 53.94 73.27 56.20 83.77 wc-input1 39.13 74.19 42.66 60.60 wc-scanStream 32.78 45.37 34.23 48.01 zebra 43.41 51.91 48.45 58.28 zern 43.72 54.23 48.77 67.33 mlton-20100608/doc/x86_64-port-notes/bench-20070317.txt0000644000076600000240000015164011404435632020124 0ustar mtfstaffSHADOW (Dual-processor AMD Opteron 2.0GHz, 8GB Memory, Fedora Core 5) Linux shadow 2.6.20-1.2925.fc6 #1 SMP Sat Mar 10 18:38:39 EST 2007 x86_64 x86_64 x86_64 GNU/Linux gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. MLton0 -- /home/fluet/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen native -align 4 (* 32-bit *) MLton1 -- /home/fluet/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen native -align 8 (* 32-bit *) MLton2 -- /home/fluet/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen c -align 4 (* 32-bit *) MLton3 -- /home/fluet/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen c -align 8 (* 32-bit *) MLton4 -- /home/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen native -align 4 (* 32-bit *) MLton5 -- /home/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen native -align 8 (* 32-bit *) MLton6 -- /home/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen c -align 4 (* 32-bit *) MLton7 -- /home/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen c -align 8 (* 32-bit *) MLton8 -- /home/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen c -align 4 (* 64-bit *) MLton9 -- /home/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen c -align 8 (* 64-bit *) run time ratio benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 MLton8 MLton9 barnes-hut 1.00 0.95 1.02 0.97 0.81 0.77 0.83 0.78 0.93 0.75 boyer 1.00 1.10 1.46 1.27 1.00 0.99 1.43 1.20 1.86 1.56 checksum 1.00 1.13 0.78 0.80 2.30 2.29 4.22 4.45 3.23 3.10 count-graphs 1.00 1.00 1.03 1.06 1.63 1.65 1.79 1.79 2.66 1.93 DLXSimulator 1.00 1.27 1.18 1.38 1.05 1.33 1.18 1.42 1.84 2.09 fft 1.00 0.89 1.10 0.96 1.01 0.89 1.12 1.00 1.00 0.92 fib 1.00 1.00 1.42 1.37 1.00 1.00 1.38 1.38 1.50 1.35 flat-array 1.00 0.96 0.00 0.00 0.96 1.00 0.00 0.00 0.00 0.00 hamlet 1.00 1.22 2.34 2.85 1.05 1.25 2.56 2.79 3.54 3.28 imp-for 1.00 0.99 0.83 0.83 0.98 0.94 0.94 0.95 0.78 0.78 knuth-bendix 1.00 0.97 2.08 2.12 1.00 1.05 1.86 1.91 2.21 1.99 lexgen 1.00 1.05 1.95 1.49 1.05 1.10 1.35 1.46 1.67 1.27 life 1.00 1.06 1.11 1.15 1.06 1.06 1.10 1.31 1.53 1.12 logic 1.00 1.06 1.45 1.46 1.01 1.09 1.56 1.51 2.00 1.69 mandelbrot 1.00 0.99 1.14 1.14 1.03 1.03 1.19 1.32 0.93 0.93 matrix-multiply 1.00 0.90 1.60 1.56 1.14 0.83 1.58 1.66 0.89 0.72 md5 1.00 1.00 1.28 1.24 1.40 1.39 2.09 2.08 2.19 2.26 merge 1.00 1.23 1.15 1.31 0.98 1.20 1.10 1.32 1.78 1.79 mlyacc 1.00 1.26 1.32 1.50 1.06 1.21 1.32 1.58 1.89 1.84 model-elimination 1.00 0.94 1.38 1.39 0.94 0.97 1.40 1.42 1.64 1.50 mpuz 1.00 1.00 1.24 1.26 1.00 1.00 2.02 2.03 2.56 2.35 nucleic 1.00 0.88 1.05 0.92 0.89 0.83 0.94 0.89 1.01 0.93 output1 1.00 1.07 1.83 1.74 1.13 1.08 1.77 1.67 3.20 1.46 peek 1.00 0.95 0.94 0.94 1.63 1.64 0.70 0.70 0.94 0.70 psdes-random 1.00 1.00 1.11 1.07 0.98 0.97 1.28 1.35 0.78 0.85 ratio-regions 1.00 0.97 1.17 1.24 1.00 0.96 1.17 1.18 1.51 1.22 ray 1.00 0.97 1.20 1.20 1.11 1.01 1.26 1.21 1.04 1.02 raytrace 1.00 0.95 1.49 1.49 1.02 0.95 1.55 1.35 1.50 1.18 simple 1.00 0.95 1.61 1.55 1.00 0.95 1.92 1.89 1.84 1.85 smith-normal-form 1.00 0.95 0.89 0.89 0.93 0.88 0.87 0.87 0.77 0.72 tailfib 1.00 1.00 2.62 2.35 1.01 1.00 2.15 2.12 1.69 1.68 tak 1.00 1.00 1.19 1.12 1.00 1.00 1.15 1.21 1.37 1.17 tensor 1.00 0.99 2.12 2.04 0.99 0.99 2.27 2.27 2.19 2.35 tsp 1.00 0.98 1.07 1.03 0.98 0.95 1.08 1.04 1.05 1.06 tyan 1.00 1.11 1.20 1.35 1.04 1.14 1.46 1.54 1.84 1.67 vector-concat 1.00 1.00 2.09 2.23 1.02 1.01 2.20 2.22 0.96 0.85 vector-rev 1.00 1.03 2.03 2.05 1.02 1.01 1.94 2.04 1.22 1.21 vliw 1.00 0.99 1.46 1.64 1.27 1.31 2.08 2.07 2.34 1.95 wc-input1 1.00 0.99 1.02 1.01 1.01 0.99 1.00 0.99 1.21 1.00 wc-scanStream 1.00 0.96 1.24 1.23 0.99 0.97 1.23 1.20 1.10 1.17 zebra 1.00 1.03 0.77 0.80 1.02 1.03 0.78 0.82 0.90 0.79 zern 1.00 0.91 1.34 1.22 1.00 0.92 1.77 1.92 2.03 1.86 size benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 MLton8 MLton9 barnes-hut 119,286 120,246 119,248 121,136 139,718 141,190 138,628 140,452 167,989 166,037 boyer 144,693 152,213 169,841 184,657 174,300 181,772 196,200 211,720 221,641 221,673 checksum 65,421 65,549 66,009 66,105 88,076 88,156 92,008 92,120 100,977 100,977 count-graphs 76,645 77,029 85,497 86,105 103,032 103,384 109,700 110,324 123,609 123,881 DLXSimulator 144,113 146,033 157,445 157,797 166,827 169,355 175,359 179,711 205,852 207,052 fft 74,932 75,156 84,580 84,900 97,713 97,905 105,425 105,713 116,898 116,930 fib 57,853 57,949 65,913 66,041 85,100 85,148 90,680 91,080 100,833 100,817 flat-array 57,901 57,997 65,865 65,993 85,084 85,164 90,584 90,648 100,673 100,673 hamlet 1,246,544 1,270,480 1,416,924 1,466,428 1,274,940 1,299,164 1,447,104 1,497,408 1,595,029 1,608,789 imp-for 57,757 57,853 65,817 65,945 84,956 85,052 90,520 90,984 100,449 100,433 knuth-bendix 124,125 125,885 136,425 139,273 148,763 151,099 154,343 157,943 179,948 181,420 lexgen 216,438 219,542 242,762 249,130 240,122 243,738 262,810 269,946 320,907 323,123 life 75,973 77,061 84,513 86,721 103,364 104,452 109,408 111,680 121,841 121,825 logic 115,429 119,077 133,565 141,725 143,532 147,132 159,092 167,220 177,761 177,745 mandelbrot 57,837 57,933 65,897 66,025 85,036 85,132 90,616 90,968 100,545 100,545 matrix-multiply 59,364 59,524 67,488 67,744 85,532 85,612 91,224 91,704 101,105 101,105 md5 93,173 93,909 95,457 96,705 119,007 120,319 121,051 123,003 133,612 134,732 merge 59,453 59,581 67,513 67,673 86,720 86,816 92,524 92,684 102,673 102,705 mlyacc 516,342 525,178 584,530 595,922 541,822 551,114 610,110 625,662 718,787 721,795 model-elimination 646,075 660,219 768,459 771,339 669,961 683,593 785,393 792,817 881,478 882,886 mpuz 60,701 60,893 69,625 69,977 87,656 87,864 94,340 94,692 105,185 105,313 nucleic 207,616 212,160 169,103 179,759 234,268 238,716 193,211 203,819 221,004 221,116 output1 96,343 97,175 98,179 99,779 119,811 121,251 119,519 121,599 138,016 139,296 peek 91,793 92,657 93,853 95,293 115,175 116,535 115,491 117,427 133,076 134,196 psdes-random 58,525 58,621 66,681 66,873 85,692 85,804 91,416 91,608 101,377 101,457 ratio-regions 83,853 84,109 95,177 95,593 110,912 111,152 121,084 121,452 137,689 137,529 ray 198,014 200,126 211,760 214,992 212,986 215,642 230,300 232,476 264,293 266,437 raytrace 278,011 282,587 319,461 325,349 288,521 293,769 319,865 333,177 387,678 391,070 simple 236,729 240,473 272,727 278,999 260,197 264,517 291,595 298,491 354,540 356,252 smith-normal-form 192,213 206,453 219,277 251,533 217,963 233,003 242,771 277,507 281,708 317,436 tailfib 57,565 57,629 65,753 65,849 84,764 84,844 90,408 90,808 100,369 100,369 tak 57,965 57,997 65,929 66,057 85,196 85,212 90,664 91,032 100,801 100,801 tensor 113,236 114,228 119,792 121,712 136,650 138,282 143,422 145,966 165,587 167,075 tsp 97,613 98,349 99,307 100,683 120,691 122,067 120,609 122,465 137,242 138,314 tyan 149,417 151,561 163,541 168,213 173,155 175,971 185,575 189,143 217,460 219,396 vector-concat 59,125 59,221 67,633 67,761 86,340 86,436 92,176 92,304 102,161 102,177 vector-rev 58,369 58,465 66,717 66,813 85,588 85,668 91,440 91,472 101,601 101,601 vliw 406,561 412,481 493,425 505,297 419,069 425,053 499,805 521,037 624,558 627,102 wc-input1 117,457 118,513 119,837 121,597 140,985 142,585 143,397 145,317 169,282 170,658 wc-scanStream 124,593 125,681 128,957 130,941 148,273 149,937 150,637 153,181 177,762 179,186 zebra 156,149 157,429 158,701 161,165 179,467 181,371 181,075 183,843 209,500 211,756 zern 104,070 104,358 112,458 112,874 111,818 112,074 118,690 119,170 133,567 133,631 compile time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 MLton8 MLton9 barnes-hut 5.29 4.28 7.80 8.18 7.41 6.90 10.96 9.92 15.31 14.98 boyer 4.86 4.56 18.71 21.97 6.49 7.37 21.23 23.96 25.60 25.74 checksum 3.10 3.09 3.33 3.28 5.09 5.42 5.61 5.69 9.63 9.30 count-graphs 3.44 3.38 4.91 4.79 5.93 5.44 6.99 7.16 11.53 11.90 DLXSimulator 5.00 5.00 9.98 9.76 7.24 7.10 12.14 12.91 17.33 18.22 fft 3.28 3.42 4.16 4.03 5.72 5.82 6.01 6.19 10.13 10.32 fib 3.10 3.05 3.30 3.29 5.04 5.06 5.55 5.41 9.36 9.34 flat-array 3.17 3.15 3.29 3.25 5.10 5.15 5.47 5.47 9.69 9.43 hamlet 47.67 47.02 128.86 132.85 28.82 29.79 118.70 121.28 138.67 141.10 imp-for 3.42 3.93 3.96 3.68 5.40 5.57 5.45 5.57 9.41 9.52 knuth-bendix 4.10 3.99 8.53 8.34 6.20 6.38 10.19 10.40 15.64 14.95 lexgen 6.71 6.90 14.68 16.23 8.64 9.00 16.17 17.09 22.51 22.29 life 3.49 3.38 4.99 5.07 5.69 5.81 7.15 8.51 12.49 12.20 logic 4.79 4.09 8.52 9.22 7.95 6.99 10.80 11.44 15.24 14.60 mandelbrot 3.17 3.04 3.36 3.47 5.36 5.27 5.35 5.77 9.83 9.62 matrix-multiply 3.09 3.29 3.76 3.77 5.63 5.49 5.84 6.04 10.93 9.94 md5 3.44 3.50 4.93 5.15 5.86 5.73 7.53 7.78 11.83 12.17 merge 3.07 3.03 3.60 3.40 5.89 5.12 5.91 5.69 10.08 9.73 mlyacc 12.78 13.23 38.28 39.23 14.91 14.55 47.21 42.38 52.54 53.28 model-elimination 15.50 12.90 49.08 49.58 15.00 15.58 51.92 55.94 63.56 63.19 mpuz 3.08 3.05 3.74 3.78 5.31 5.35 5.59 5.72 9.74 9.72 nucleic 5.70 5.79 18.07 20.02 7.76 7.98 19.74 21.67 24.68 25.03 output1 3.50 3.49 5.06 5.14 6.25 6.77 7.58 7.51 12.58 12.07 peek 4.26 3.44 4.81 4.98 5.83 5.62 7.32 7.44 11.15 11.82 psdes-random 3.04 3.08 3.36 3.60 5.19 5.67 5.73 5.55 11.12 9.52 ratio-regions 4.33 3.86 6.10 6.83 5.79 6.25 8.18 8.31 12.92 13.05 ray 5.17 5.33 11.28 11.36 7.23 7.38 15.41 14.50 20.59 20.70 raytrace 6.94 6.93 20.04 21.07 9.63 9.39 21.91 23.15 29.63 29.25 simple 5.75 5.98 15.01 15.44 8.38 8.15 17.93 18.70 23.59 24.01 smith-normal-form 6.03 7.00 58.15 78.16 7.62 7.80 59.34 69.91 65.44 75.12 tailfib 3.01 2.91 3.22 3.20 5.27 5.20 5.51 5.39 9.20 9.31 tak 3.00 3.03 3.27 3.22 5.15 5.11 5.43 5.50 9.34 9.16 tensor 4.33 4.31 7.09 7.16 6.78 6.39 9.70 9.78 14.75 14.79 tsp 3.55 3.58 5.28 5.45 5.79 5.75 7.64 7.78 12.05 11.91 tyan 4.50 4.61 9.82 9.81 6.77 6.86 12.43 12.61 17.48 17.70 vector-concat 3.04 3.00 3.36 3.27 5.11 5.14 5.43 5.49 9.29 9.43 vector-rev 3.03 3.10 3.24 3.27 5.13 5.12 5.61 5.34 9.38 9.51 vliw 9.24 9.59 30.01 30.75 12.00 11.86 33.30 33.64 40.30 40.23 wc-input1 4.28 3.77 6.67 6.56 5.88 6.00 9.04 9.18 13.74 13.76 wc-scanStream 3.88 3.91 7.03 7.33 6.16 6.03 9.21 9.54 14.54 15.04 zebra 4.54 4.55 9.71 10.13 6.74 6.79 12.10 12.31 17.14 17.54 zern 3.25 3.38 4.33 4.33 5.56 5.57 6.60 6.66 11.33 11.05 run time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 MLton8 MLton9 barnes-hut 19.66 18.72 20.05 19.01 15.97 15.16 16.36 15.38 18.19 14.81 boyer 16.62 18.33 24.32 21.03 16.61 16.40 23.81 19.89 30.88 25.97 checksum 43.69 49.45 33.86 34.78 100.41 99.94 184.57 194.50 141.31 135.46 count-graphs 21.40 21.29 22.14 22.60 34.95 35.32 38.33 38.35 56.84 41.20 DLXSimulator 18.54 23.56 21.96 25.52 19.38 24.63 21.79 26.29 34.07 38.79 fft 15.95 14.20 17.48 15.29 16.18 14.15 17.93 16.03 16.01 14.61 fib 31.57 31.55 44.88 43.34 31.62 31.66 43.57 43.71 47.51 42.47 flat-array 10.49 10.09 0.02 0.02 10.05 10.49 0.02 0.02 0.02 0.02 hamlet 16.53 20.09 38.74 47.05 17.35 20.72 42.30 46.11 58.53 54.18 imp-for 30.93 30.54 25.54 25.53 30.34 29.12 29.01 29.23 24.23 24.27 knuth-bendix 18.25 17.68 38.01 38.66 18.27 19.25 33.97 34.80 40.27 36.28 lexgen 22.38 23.43 43.55 33.37 23.52 24.62 30.28 32.61 37.45 28.52 life 8.48 9.01 9.45 9.73 8.96 9.03 9.36 11.10 12.94 9.52 logic 19.09 20.20 27.71 27.93 19.31 20.76 29.80 28.88 38.11 32.21 mandelbrot 24.30 23.96 27.77 27.78 24.95 25.05 28.91 31.96 22.49 22.54 matrix-multiply 3.84 3.44 6.14 5.99 4.36 3.20 6.04 6.37 3.42 2.76 md5 32.69 32.79 41.74 40.65 45.64 45.61 68.32 68.10 71.45 73.95 merge 16.24 19.98 18.60 21.25 15.88 19.49 17.93 21.42 28.86 29.01 mlyacc 19.33 24.35 25.46 28.93 20.39 23.44 25.55 30.54 36.61 35.52 model-elimination 31.92 30.02 44.21 44.30 30.02 31.03 44.73 45.19 52.20 47.87 mpuz 22.24 22.29 27.66 28.12 22.30 22.29 44.83 45.11 56.91 52.21 nucleic 17.12 15.15 17.99 15.76 15.15 14.22 16.17 15.21 17.30 15.89 output1 7.26 7.79 13.27 12.63 8.19 7.84 12.81 12.09 23.23 10.56 peek 21.57 20.45 20.28 20.19 35.21 35.29 15.13 15.15 20.36 15.16 psdes-random 16.46 16.51 18.22 17.69 16.17 15.91 21.06 22.23 12.90 14.02 ratio-regions 26.75 25.90 31.26 33.28 26.79 25.60 31.27 31.61 40.51 32.52 ray 16.44 15.91 19.73 19.66 18.21 16.67 20.70 19.91 17.11 16.83 raytrace 16.62 15.81 24.73 24.81 17.00 15.84 25.83 22.37 24.94 19.65 simple 21.06 20.08 33.83 32.67 21.01 20.05 40.43 39.83 38.81 38.90 smith-normal-form 12.44 11.87 11.07 11.03 11.51 10.91 10.82 10.83 9.58 8.99 tailfib 19.59 19.54 51.27 45.97 19.70 19.67 42.20 41.49 33.06 32.96 tak 13.51 13.50 16.02 15.16 13.56 13.56 15.53 16.40 18.45 15.77 tensor 17.62 17.45 37.30 35.90 17.44 17.48 39.91 40.06 38.62 41.37 tsp 21.62 21.20 23.14 22.27 21.15 20.55 23.29 22.55 22.70 22.81 tyan 18.81 20.86 22.62 25.39 19.53 21.36 27.41 29.04 34.62 31.39 vector-concat 31.32 31.19 65.34 69.85 32.06 31.59 68.92 69.54 30.11 26.69 vector-rev 21.10 21.67 42.86 43.25 21.58 21.32 40.99 42.98 25.80 25.49 vliw 21.93 21.78 31.94 36.08 27.94 28.68 45.56 45.48 51.43 42.80 wc-input1 28.39 28.17 28.88 28.75 28.62 28.04 28.47 27.98 34.40 28.37 wc-scanStream 15.39 14.84 19.02 18.91 15.21 14.89 18.86 18.46 16.86 18.08 zebra 26.57 27.25 20.41 21.15 27.09 27.50 20.64 21.76 23.94 21.05 zern 18.09 16.46 24.16 22.03 18.03 16.57 31.94 34.72 36.64 33.73 CFS29 (Dual-processor Intel Pentium III 1.2GHz, 2GB Memory, Red Hat Enterprise Linux 4) Linux cfs29.cs.cornell.edu 2.6.9-42.0.10.ELsmp #1 SMP Fri Feb 16 17:17:21 EST 2007 i686 i686 i386 GNU/Linux gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-3) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. MLton0 -- /home/fluet/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen native -align 4 (* 32-bit *) MLton1 -- /home/fluet/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen native -align 8 (* 32-bit *) MLton2 -- /home/fluet/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen c -align 4 (* 32-bit *) MLton3 -- /home/fluet/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen c -align 8 (* 32-bit *) MLton4 -- /home/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen native -align 4 (* 32-bit *) MLton5 -- /home/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen native -align 8 (* 32-bit *) MLton6 -- /home/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen c -align 4 (* 32-bit *) MLton7 -- /home/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen c -align 8 (* 32-bit *) MLton8 -- /home/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen native -align 4 (* 32-bit *) MLton9 -- /home/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen native -align 8 (* 32-bit *) MLton10 -- /home/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen c -align 4 (* 32-bit *) MLton11 -- /home/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen c -align 8 (* 32-bit *) run time ratio benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 MLton8 MLton9 MLton10 MLton11 barnes-hut 1.00 0.96 1.07 1.04 0.91 0.90 0.98 0.95 0.91 0.90 0.98 0.95 boyer 1.00 1.19 1.21 1.26 1.01 1.11 1.22 1.20 0.97 1.21 1.18 1.29 checksum 1.00 1.00 0.90 0.93 2.27 2.28 3.35 3.28 1.11 1.11 1.84 1.85 count-graphs 1.00 1.04 1.33 1.37 1.65 1.66 2.47 2.44 1.68 1.67 2.40 2.49 DLXSimulator 1.00 1.33 1.07 1.36 1.04 1.33 1.12 1.40 1.05 1.34 1.12 1.39 fft 1.00 0.89 1.06 0.95 1.01 0.89 1.06 0.95 0.99 0.89 1.05 0.95 fib 1.00 1.02 1.26 1.31 1.00 1.02 1.38 1.38 1.00 1.02 1.32 1.36 flat-array 1.00 1.00 1.36 1.42 1.00 1.00 1.28 1.25 1.00 1.00 1.25 1.36 hamlet 1.00 1.07 2.07 2.21 1.02 1.10 2.01 2.13 1.02 1.10 1.98 2.08 imp-for 1.00 1.00 1.99 1.66 1.00 1.00 1.60 1.41 1.00 1.00 1.66 1.62 knuth-bendix 1.00 1.03 1.97 2.04 1.01 1.11 2.01 2.09 1.04 1.13 2.05 2.13 lexgen 1.00 1.05 1.92 1.44 1.03 1.08 1.24 1.38 1.03 1.09 1.23 1.42 life 1.00 1.11 1.22 1.32 1.07 1.13 1.28 1.30 1.01 1.13 1.22 1.31 logic 1.00 1.13 1.30 1.45 1.05 1.17 1.36 1.51 1.05 1.17 1.37 1.50 mandelbrot 1.00 0.65 1.16 0.72 0.68 0.68 0.75 0.74 0.68 0.68 0.74 0.75 matrix-multiply 1.00 0.93 1.09 1.14 1.00 0.93 1.01 0.92 1.00 0.93 1.01 0.92 md5 1.00 1.00 1.29 1.31 1.48 1.48 2.16 2.17 1.02 1.02 1.63 1.62 merge 1.00 1.21 1.00 1.24 0.99 1.18 0.99 1.20 0.98 1.19 0.98 1.21 mlyacc 1.00 1.20 1.28 1.51 1.01 1.22 1.30 1.48 1.01 1.22 1.30 1.49 model-elimination 1.00 1.10 1.36 1.43 1.03 1.11 1.41 1.45 1.03 1.11 1.41 1.45 mpuz 1.00 1.00 1.44 1.42 0.97 0.97 1.94 1.93 0.97 0.97 1.91 1.93 nucleic 1.00 0.89 1.09 1.00 0.93 0.84 0.98 0.92 0.95 0.85 1.01 0.93 output1 1.00 0.95 1.84 1.80 0.95 0.95 1.58 1.57 0.95 0.95 1.58 1.58 peek 1.00 1.00 1.25 1.25 1.25 1.25 2.25 1.75 1.25 1.25 1.75 1.75 psdes-random 1.00 1.00 1.02 0.97 1.00 1.00 1.06 1.03 1.00 1.00 1.02 1.01 ratio-regions 1.00 1.03 1.14 1.17 1.01 1.03 1.15 1.19 1.00 1.03 1.18 1.18 ray 1.00 0.98 1.23 1.21 1.02 1.00 1.26 1.24 1.04 1.01 1.27 1.25 raytrace 1.00 0.92 1.41 1.45 1.01 0.92 1.61 1.31 1.02 0.93 1.58 1.31 simple 1.00 0.86 1.51 1.44 0.86 0.85 1.63 1.58 0.85 0.85 1.62 1.60 smith-normal-form 1.00 1.01 1.00 1.01 1.00 1.01 1.00 1.01 1.00 1.01 1.00 1.01 tailfib 1.00 1.00 3.12 2.44 1.00 1.00 2.39 2.22 1.00 1.00 2.21 2.23 tak 1.00 1.00 1.10 1.10 1.00 1.01 1.14 1.12 1.00 1.01 1.06 1.11 tensor 1.00 1.00 1.62 1.74 1.00 1.00 1.62 1.70 1.00 1.00 1.53 1.74 tsp 1.00 0.93 1.44 1.35 0.98 0.92 1.43 1.37 0.98 0.92 1.42 1.36 tyan 1.00 1.23 1.24 1.49 1.03 1.25 1.34 1.55 1.03 1.25 1.34 1.53 vector-concat 1.00 1.00 1.52 1.30 1.02 1.01 1.25 1.26 1.04 1.00 1.27 1.29 vector-rev 1.00 1.04 1.20 1.18 1.00 1.05 1.25 1.23 1.02 0.92 1.25 1.24 vliw 1.00 1.15 1.42 1.57 1.22 1.40 1.75 1.90 1.26 1.40 1.78 1.91 wc-input1 1.00 0.98 1.51 1.53 1.05 1.05 1.29 1.31 1.05 1.06 1.28 1.23 wc-scanStream 1.00 0.97 1.57 1.54 1.00 0.97 1.55 1.31 1.00 0.97 1.42 1.38 zebra 1.00 1.04 1.22 1.25 1.05 1.03 1.26 1.29 1.03 1.08 1.25 1.25 zern 1.00 0.97 1.22 1.21 1.00 0.98 1.47 1.46 1.00 0.98 1.48 1.47 size benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 MLton8 MLton9 MLton10 MLton11 barnes-hut 120,111 121,007 121,681 123,473 136,095 137,551 135,621 137,949 136,991 138,415 136,461 139,021 boyer 148,730 156,026 159,434 172,650 176,184 183,448 181,908 195,020 177,048 184,312 182,788 195,956 checksum 65,410 65,538 65,502 65,598 85,204 85,284 87,768 87,872 85,228 85,308 87,812 87,924 count-graphs 77,066 77,322 87,462 88,038 101,224 101,480 107,736 108,352 102,152 102,376 108,632 109,216 DLXSimulator 145,270 147,062 158,626 159,746 163,691 165,963 175,067 179,003 164,571 166,827 175,987 179,899 fft 75,113 75,337 84,757 85,077 95,483 95,707 101,491 101,819 96,331 96,555 102,307 102,627 fib 57,950 58,046 65,658 65,754 83,020 83,068 86,812 86,916 83,884 83,932 87,684 87,780 flat-array 57,974 58,070 65,622 65,718 83,012 83,092 86,792 86,904 83,908 83,988 87,688 87,808 hamlet 1,267,029 1,288,405 1,472,553 1,524,009 1,290,920 1,312,264 1,490,332 1,538,556 1,291,832 1,313,160 1,494,692 1,532,420 imp-for 57,854 57,950 65,414 65,510 82,876 82,972 86,536 86,648 83,740 83,836 87,392 87,496 knuth-bendix 125,206 126,710 145,162 147,754 145,531 147,515 161,435 165,435 146,443 148,411 162,307 166,291 lexgen 219,223 221,847 264,071 266,919 238,618 241,554 274,902 279,886 239,514 242,450 275,726 280,758 life 76,342 77,430 82,474 84,586 101,620 102,708 103,796 105,908 102,484 103,572 104,660 106,772 logic 116,826 120,410 132,754 141,074 142,748 146,300 154,716 163,028 143,612 147,164 155,556 163,868 mandelbrot 57,918 58,014 65,446 65,542 82,940 83,036 86,584 86,688 83,836 83,932 87,480 87,592 matrix-multiply 59,489 59,617 67,029 67,221 83,464 83,544 87,176 87,288 84,328 84,408 88,024 88,136 md5 93,630 94,366 94,138 95,642 114,867 116,115 115,539 117,691 113,483 114,715 115,235 116,947 merge 59,530 59,658 67,050 67,178 84,664 84,744 88,412 88,548 85,528 85,608 89,284 89,420 mlyacc 522,167 530,715 636,515 674,115 543,542 552,490 661,986 684,474 544,406 553,354 662,858 685,314 model-elimination 653,580 666,668 779,544 779,384 672,486 685,038 787,878 800,942 673,382 685,918 787,430 801,878 mpuz 60,838 60,998 69,730 70,050 85,636 85,812 91,272 91,616 86,532 86,708 92,144 92,488 nucleic 211,873 216,545 171,103 181,215 236,352 240,960 191,354 201,114 237,344 241,968 192,258 202,074 output1 96,992 97,664 97,212 98,716 116,143 117,439 113,451 115,715 117,039 118,335 114,355 116,627 peek 92,334 93,102 94,442 96,298 111,435 112,635 113,299 115,451 112,347 113,531 114,195 116,339 psdes-random 58,614 58,742 66,322 66,514 83,668 83,780 87,476 87,652 84,532 84,644 88,332 88,508 ratio-regions 84,094 84,318 94,794 95,210 109,036 109,212 116,940 117,324 109,900 110,076 117,788 118,180 ray 199,819 201,611 222,509 225,901 209,758 212,014 233,516 233,484 210,654 212,910 234,300 234,292 raytrace 281,712 286,288 364,342 374,422 287,701 292,653 371,237 382,317 288,565 293,533 371,965 382,989 simple 239,082 243,018 291,716 299,268 258,003 262,379 309,493 307,525 258,923 263,291 310,437 308,469 smith-normal-form 197,782 211,478 203,574 234,998 219,275 233,755 222,367 254,375 220,091 234,555 223,351 255,951 tailfib 57,662 57,726 65,414 65,510 82,684 82,764 86,488 86,600 83,548 83,628 87,368 87,480 tak 58,046 58,078 65,598 65,694 83,100 83,116 86,768 86,880 83,996 84,012 87,664 87,776 tensor 113,917 114,781 121,249 122,913 133,006 134,462 140,486 143,070 133,918 135,358 141,422 143,990 tsp 98,190 98,862 100,187 101,627 116,955 118,187 117,640 119,584 117,819 119,035 118,544 120,472 tyan 150,910 152,702 170,602 175,082 170,307 172,827 187,475 191,339 171,219 173,723 188,067 191,899 vector-concat 59,246 59,342 66,798 66,958 84,268 84,380 88,032 88,168 85,164 85,276 88,832 89,016 vector-rev 58,474 58,538 66,050 66,178 83,528 83,608 87,332 87,444 84,392 84,472 88,212 88,316 vliw 410,426 415,930 487,442 505,810 417,597 423,581 492,913 509,129 418,493 424,477 493,321 509,297 wc-input1 118,330 119,258 119,038 120,926 137,585 139,025 137,669 140,757 138,449 139,889 138,549 141,637 wc-scanStream 125,586 126,578 128,710 130,790 144,949 146,469 145,845 148,725 145,829 147,349 146,749 149,629 zebra 157,130 158,442 158,190 160,206 176,119 177,991 175,443 177,499 177,015 178,855 176,123 178,123 zern 104,403 104,659 114,707 115,091 109,114 109,386 115,618 116,106 109,962 116,858 122,626 123,106 compile time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 MLton8 MLton9 MLton10 MLton11 barnes-hut 9.08 9.12 13.78 13.94 14.67 14.78 19.40 19.61 14.85 14.89 19.58 19.79 boyer 9.94 10.10 27.11 31.02 15.27 15.40 32.78 36.32 15.40 15.49 33.03 36.43 checksum 6.62 6.65 6.98 6.99 11.94 11.95 12.37 12.35 12.10 12.10 12.46 12.46 count-graphs 7.51 7.46 9.49 9.55 12.78 12.81 14.71 14.71 12.91 13.06 14.86 14.86 DLXSimulator 10.46 10.54 18.05 18.32 15.87 16.02 23.70 24.16 16.02 16.02 23.88 24.33 fft 7.21 7.23 8.16 8.22 12.51 12.53 13.53 13.50 12.71 12.69 13.61 13.67 fib 6.63 6.66 6.96 6.99 11.93 11.95 12.31 12.28 12.15 12.08 12.42 12.55 flat-array 6.63 6.64 6.97 7.07 12.03 11.99 12.40 12.38 12.17 12.12 12.65 12.48 hamlet 111.67 112.34 225.62 226.66 68.44 69.08 177.88 179.51 69.14 69.76 178.58 180.40 imp-for 6.74 6.77 7.11 7.06 12.00 12.05 12.37 12.41 12.21 12.14 12.58 12.59 knuth-bendix 8.70 8.74 14.14 14.43 14.17 14.32 19.95 20.26 14.43 14.42 20.15 20.42 lexgen 12.30 12.35 24.39 25.43 17.87 17.90 30.54 30.79 18.07 18.14 30.61 30.87 life 7.39 7.41 9.39 9.64 12.78 12.68 14.71 15.01 12.83 12.82 14.91 15.17 logic 8.86 9.07 14.29 14.75 14.23 14.38 19.70 20.23 14.34 14.45 19.78 20.29 mandelbrot 6.80 6.91 7.10 7.12 12.11 12.21 12.53 12.49 12.29 12.42 12.61 12.60 matrix-multiply 6.88 6.90 7.27 7.31 12.15 12.22 12.64 12.63 12.29 12.32 12.66 12.71 md5 7.66 7.71 9.69 9.83 13.25 13.29 15.90 16.11 13.31 13.39 15.87 16.01 merge 6.85 6.81 7.25 7.25 12.18 12.20 12.61 12.61 12.27 12.30 12.79 12.85 mlyacc 28.31 28.51 69.10 69.87 33.52 34.03 74.44 74.00 33.88 33.68 74.53 73.97 model-elimination 29.95 30.26 80.24 80.43 36.06 36.29 86.67 87.45 36.26 36.55 86.82 87.67 mpuz 7.03 6.97 7.53 7.59 12.35 12.33 12.97 12.99 12.49 12.44 13.08 13.10 nucleic 13.33 13.49 30.26 32.34 18.54 18.75 33.84 35.61 18.71 18.84 34.15 35.75 output1 7.69 7.66 9.93 10.11 13.28 13.23 15.74 15.88 13.30 13.38 15.81 16.04 peek 7.64 7.66 9.49 9.64 13.21 13.23 15.35 15.46 13.24 13.33 15.42 15.59 psdes-random 6.91 6.94 7.28 7.26 12.31 12.33 12.65 12.67 12.46 12.53 12.80 12.84 ratio-regions 8.23 8.23 10.95 10.98 13.71 13.59 16.26 16.29 13.68 13.71 16.34 16.41 ray 11.22 11.32 20.66 20.79 17.06 17.20 27.31 27.50 17.26 17.31 27.53 27.61 raytrace 15.90 15.98 35.97 36.02 21.57 21.80 41.82 42.16 21.70 21.98 42.11 42.48 simple 13.22 13.15 27.32 27.59 18.54 18.64 33.07 33.23 18.66 18.86 33.29 33.41 smith-normal-form 11.36 11.60 58.07 70.69 17.10 17.38 67.65 80.49 17.17 17.53 68.00 80.53 tailfib 6.96 6.91 7.21 7.32 12.20 12.20 12.61 12.62 12.36 12.32 12.72 12.74 tak 6.93 6.92 7.30 7.24 12.31 12.17 12.62 12.66 12.39 12.38 12.76 12.71 tensor 9.93 9.83 14.46 14.36 15.28 15.36 20.29 20.58 15.46 15.52 20.38 20.57 tsp 8.18 8.20 10.79 10.89 13.75 13.84 16.66 16.84 13.88 13.94 16.85 17.02 tyan 10.59 10.63 19.24 19.51 16.06 16.18 24.89 25.36 16.14 16.28 25.15 25.44 vector-concat 7.06 7.07 7.41 7.45 12.39 12.38 12.85 12.80 12.52 12.54 12.95 12.91 vector-rev 7.10 7.04 7.39 7.42 12.33 12.33 12.75 12.90 12.46 12.55 12.89 12.87 vliw 21.76 21.83 50.81 50.95 27.62 27.78 55.96 55.97 27.72 27.96 56.64 56.73 wc-input1 8.81 8.85 13.33 13.50 14.30 14.35 19.15 18.69 14.51 14.46 19.26 19.01 wc-scanStream 9.10 9.11 13.62 13.85 14.66 14.62 19.40 19.70 14.77 14.81 19.53 19.85 zebra 10.64 10.70 18.31 18.62 16.13 16.10 24.17 24.43 16.33 16.37 24.46 24.60 zern 7.89 7.87 9.37 9.46 13.30 13.30 15.05 15.14 13.53 13.98 15.42 15.45 run time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 MLton8 MLton9 MLton10 MLton11 barnes-hut 49.41 47.20 52.96 51.18 45.06 44.50 48.44 47.15 45.01 44.31 48.22 47.11 boyer 50.71 60.10 61.48 63.84 51.39 56.46 61.82 60.68 49.09 61.42 59.87 65.46 checksum 97.61 97.60 87.51 90.82 221.72 222.12 327.06 320.66 108.77 108.81 179.19 180.62 count-graphs 40.62 42.34 53.90 55.82 67.17 67.62 100.40 98.97 68.29 67.64 97.44 101.10 DLXSimulator 84.82 112.77 90.75 115.50 88.33 113.21 94.58 119.02 89.14 113.46 94.59 117.96 fft 33.01 29.48 34.88 31.26 33.18 29.26 35.04 31.44 32.67 29.38 34.60 31.32 fib 70.49 71.60 88.51 92.59 70.49 71.61 97.51 97.04 70.47 71.62 93.39 96.12 flat-array 25.15 25.15 34.30 35.62 25.15 25.16 32.07 31.50 25.15 25.15 31.53 34.19 hamlet 50.59 53.88 104.64 111.75 51.39 55.65 101.83 107.88 51.82 55.71 100.31 105.05 imp-for 46.93 46.94 93.27 77.93 46.93 46.94 75.23 66.40 46.94 46.94 77.94 76.17 knuth-bendix 37.93 39.18 74.53 77.40 38.48 42.13 76.21 79.14 39.46 42.73 77.65 80.61 lexgen 42.97 45.24 82.43 61.85 44.07 46.50 53.33 59.26 44.28 46.89 52.96 61.10 life 13.75 15.21 16.82 18.09 14.77 15.56 17.57 17.92 13.90 15.57 16.77 17.99 logic 51.91 58.44 67.57 75.38 54.75 60.84 70.44 78.19 54.53 60.59 71.34 78.07 mandelbrot 82.62 53.91 95.47 59.48 55.99 56.05 61.73 60.94 56.09 56.08 60.87 62.27 matrix-multiply 7.55 7.01 8.21 8.58 7.53 7.00 7.63 6.92 7.53 6.99 7.63 6.91 md5 53.38 53.45 69.08 69.91 78.87 78.94 115.18 115.92 54.49 54.51 87.17 86.71 merge 77.06 93.11 76.90 95.30 76.05 91.31 75.92 92.63 75.78 91.51 75.83 93.25 mlyacc 41.89 50.06 53.42 63.07 42.22 51.14 54.60 62.20 42.34 51.05 54.51 62.28 model-elimination 78.38 86.43 106.69 112.44 81.03 87.07 110.86 113.57 81.03 87.33 110.82 113.92 mpuz 41.96 41.89 60.36 59.68 40.90 40.70 81.59 81.06 40.82 40.77 80.25 80.85 nucleic 45.49 40.34 49.54 45.39 42.44 38.26 44.78 41.79 43.37 38.84 46.02 42.31 output1 15.31 14.49 28.23 27.59 14.47 14.48 24.17 24.08 14.48 14.48 24.24 24.14 peek 35.54 35.53 44.43 44.42 44.43 44.44 79.94 62.19 44.46 44.45 62.18 62.16 psdes-random 38.97 38.96 39.78 37.81 38.99 38.98 41.49 39.98 38.98 38.98 39.66 39.49 ratio-regions 52.59 53.91 59.73 61.44 52.88 54.34 60.26 62.53 52.82 54.27 61.86 62.25 ray 37.12 36.44 45.56 44.90 37.77 36.95 46.91 45.88 38.67 37.62 47.29 46.33 raytrace 42.52 39.21 59.91 61.69 42.96 39.12 68.53 55.87 43.45 39.34 67.28 55.78 simple 58.90 50.49 88.92 84.78 50.56 50.09 95.73 93.28 50.14 50.17 95.15 94.40 smith-normal-form 35.52 35.85 35.57 35.90 35.65 35.96 35.67 36.03 35.61 35.89 35.64 35.96 tailfib 43.89 43.88 136.76 107.29 43.88 43.91 104.81 97.34 43.91 43.89 97.18 97.71 tak 27.74 27.77 30.62 30.62 27.70 28.07 31.51 31.15 27.70 28.05 29.50 30.84 tensor 59.15 59.14 95.81 102.89 59.16 59.14 95.90 100.79 59.15 59.16 90.75 102.77 tsp 64.30 59.84 92.49 86.90 62.72 59.16 92.09 88.37 62.77 59.12 91.04 87.33 tyan 54.58 67.13 67.79 81.14 56.42 68.25 73.07 84.71 56.38 68.20 72.90 83.59 vector-concat 85.64 85.59 129.75 111.69 87.22 86.19 107.42 107.90 89.19 85.38 108.62 110.29 vector-rev 105.55 109.37 126.80 124.03 105.94 110.68 132.39 129.87 107.49 97.11 131.69 130.63 vliw 51.62 59.27 73.38 81.17 62.96 72.33 90.55 98.15 65.07 72.22 92.00 98.61 wc-input1 40.43 39.71 60.96 61.67 42.63 42.64 52.16 53.04 42.58 42.69 51.89 49.85 wc-scanStream 34.12 32.98 53.41 52.40 34.23 33.19 52.78 44.63 34.29 33.05 48.56 47.07 zebra 42.75 44.37 51.99 53.26 44.67 44.14 54.01 55.21 44.01 46.00 53.40 53.34 zern 42.32 41.13 51.70 51.05 42.49 41.43 62.19 61.91 42.42 41.43 62.49 62.01 FENRIR (Dual-processor dual-core Intel Xeon 2.66GHz, 2GB Memory, MacOS X 10.4.9) Darwin fenrir.uchicago.edu 8.9.1 Darwin Kernel Version 8.9.1: Thu Feb 22 20:55:00 PST 2007; root:xnu-792.18.15~1/RELEASE_I386 i386 i386 i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367) Copyright (C) 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. MLton0 -- /Users/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen native -align 4 (* 32-bit *) MLton1 -- /Users/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen native -align 8 (* 32-bit *) MLton2 -- /Users/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen c -align 4 (* 32-bit *) MLton3 -- /Users/fluet/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen c -align 8 (* 32-bit *) MLton4 -- /Users/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen native -align 4 (* 32-bit *) MLton5 -- /Users/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen native -align 8 (* 32-bit *) MLton6 -- /Users/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen c -align 4 (* 32-bit *) MLton7 -- /Users/fluet/devel/mlton/mlton.svn.x86_64/build/bin/mlton -codegen c -align 8 (* 32-bit *) run time ratio benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 barnes-hut 1.00 0.89 0.96 0.86 1.02 0.90 0.96 0.86 boyer 1.00 0.98 1.10 1.17 0.96 1.12 1.03 1.25 checksum 1.00 0.90 1.07 1.02 0.40 0.40 0.59 0.58 count-graphs 1.00 1.02 1.21 1.23 1.00 1.02 1.21 1.21 DLXSimulator 1.00 1.27 1.17 1.42 0.99 1.26 1.19 1.41 fft 1.00 0.95 1.04 0.98 1.00 0.94 1.03 0.98 fib 1.00 1.02 1.25 1.31 1.15 1.15 1.26 1.33 flat-array 1.00 1.00 1.60 1.60 1.00 1.00 1.60 1.60 hamlet 1.00 1.37 2.80 3.29 1.01 1.37 2.87 3.23 imp-for 1.00 1.00 0.79 1.08 1.00 1.00 0.80 1.08 knuth-bendix 1.00 1.10 2.19 2.34 1.01 1.16 2.27 2.46 lexgen 1.00 1.08 1.47 1.46 1.02 1.10 1.49 1.50 life 1.00 1.02 1.18 1.20 0.91 1.00 1.14 1.22 logic 1.00 1.08 1.90 1.96 0.96 1.04 1.78 1.83 mandelbrot 1.00 1.00 1.29 1.30 1.00 1.00 1.29 1.30 matrix-multiply 1.00 0.69 1.15 0.82 1.00 0.70 1.15 0.83 md5 1.00 1.00 0.86 0.88 0.74 0.76 0.69 0.87 merge 1.00 1.35 1.20 1.37 1.01 1.36 1.18 1.38 mlyacc 1.00 1.18 1.39 1.53 0.87 1.17 1.23 1.53 model-elimination 1.00 1.04 1.65 1.59 1.00 1.03 1.63 1.61 mpuz 1.00 0.95 1.78 1.72 0.95 0.95 1.75 1.73 nucleic 1.00 0.86 1.05 0.93 1.15 0.85 1.20 0.93 output1 1.00 1.03 1.48 1.36 1.00 1.02 1.48 1.40 peek 1.00 1.08 0.73 0.73 1.06 1.07 0.73 0.73 psdes-random 1.00 1.00 0.95 1.12 1.08 1.08 0.95 1.12 ratio-regions 1.00 1.07 1.21 1.20 1.03 1.00 1.20 1.25 ray 1.00 0.97 1.00 0.99 1.03 0.98 1.03 0.97 raytrace 1.00 0.83 1.63 1.23 1.00 0.82 1.65 1.18 simple 1.00 0.96 2.32 2.12 0.97 0.96 2.36 2.05 smith-normal-form 1.00 1.00 1.00 1.00 1.00 0.99 1.00 0.99 tailfib 1.00 1.00 1.73 1.73 1.00 1.00 1.73 1.73 tak 1.00 0.83 1.07 1.18 0.89 0.89 1.04 0.94 tensor 1.00 1.00 1.20 1.10 1.00 1.00 1.15 1.15 tsp 1.00 0.95 0.90 0.85 1.00 0.95 0.90 0.85 tyan 1.00 1.09 1.55 1.62 1.00 1.10 1.53 1.63 vector-concat 1.00 1.00 1.27 1.26 1.00 1.00 1.26 1.29 vector-rev 1.00 1.00 1.91 1.92 1.00 1.00 1.92 1.92 vliw 1.00 0.98 1.92 1.88 1.02 1.02 1.89 1.90 wc-input1 1.00 1.01 0.92 0.98 1.00 1.01 0.93 0.98 wc-scanStream 1.00 0.99 1.26 1.25 1.00 1.00 1.25 1.26 zebra 1.00 1.01 1.02 1.10 1.01 1.03 1.04 1.12 zern 1.00 0.92 1.57 1.39 1.00 0.91 1.56 1.40 size benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 barnes-hut 159,744 163,840 163,840 163,840 163,840 163,840 167,936 167,936 boyer 200,704 204,800 225,280 237,568 200,704 208,896 225,280 241,664 checksum 102,400 102,400 106,496 106,496 102,400 102,400 106,496 106,496 count-graphs 122,880 122,880 131,072 131,072 122,880 122,880 131,072 131,072 DLXSimulator 188,416 192,512 212,992 217,088 192,512 192,512 217,088 221,184 fft 118,784 118,784 126,976 126,976 118,784 118,784 126,976 126,976 fib 102,400 102,400 106,496 106,496 102,400 102,400 106,496 106,496 flat-array 102,400 102,400 106,496 106,496 102,400 102,400 106,496 106,496 hamlet 1,355,776 1,384,448 1,757,184 1,769,472 1,359,872 1,384,448 1,761,280 1,777,664 imp-for 102,400 102,400 106,496 106,496 102,400 102,400 106,496 106,496 knuth-bendix 167,936 172,032 184,320 188,416 172,032 172,032 184,320 188,416 lexgen 266,240 270,336 315,392 311,296 270,336 270,336 315,392 315,392 life 122,880 126,976 131,072 135,168 126,976 126,976 135,168 135,168 logic 163,840 167,936 200,704 204,800 167,936 172,032 200,704 204,800 mandelbrot 102,400 102,400 106,496 106,496 102,400 102,400 106,496 106,496 matrix-multiply 102,400 102,400 106,496 106,496 102,400 102,400 110,592 110,592 md5 135,168 139,264 143,360 143,360 135,168 135,168 143,360 143,360 merge 102,400 102,400 106,496 110,592 102,400 102,400 110,592 110,592 mlyacc 581,632 589,824 720,896 729,088 581,632 593,920 720,896 729,088 model-elimination 720,896 733,184 954,368 937,984 720,896 733,184 954,368 950,272 mpuz 102,400 102,400 110,592 110,592 110,592 110,592 110,592 110,592 nucleic 274,432 282,624 221,184 233,472 278,528 282,624 225,280 237,568 output1 135,168 139,264 143,360 147,456 139,264 139,264 143,360 147,456 peek 131,072 135,168 135,168 139,264 135,168 135,168 139,264 139,264 psdes-random 102,400 102,400 106,496 106,496 102,400 102,400 106,496 110,592 ratio-regions 131,072 131,072 139,264 139,264 131,072 131,072 143,360 143,360 ray 237,568 237,568 278,528 282,624 237,568 241,664 278,528 282,624 raytrace 315,392 323,584 380,928 389,120 319,488 323,584 385,024 389,120 simple 282,624 286,720 327,680 335,872 282,624 286,720 331,776 335,872 smith-normal-form 253,952 266,240 282,624 315,392 253,952 266,240 282,624 315,392 tailfib 102,400 102,400 106,496 106,496 102,400 102,400 106,496 106,496 tak 102,400 102,400 106,496 106,496 102,400 102,400 106,496 106,496 tensor 159,744 159,744 172,032 176,128 159,744 159,744 176,128 176,128 tsp 139,264 139,264 143,360 143,360 139,264 139,264 143,360 147,456 tyan 196,608 200,704 229,376 229,376 196,608 200,704 229,376 229,376 vector-concat 102,400 102,400 106,496 110,592 102,400 102,400 110,592 110,592 vector-rev 102,400 102,400 106,496 106,496 102,400 102,400 110,592 110,592 vliw 450,560 462,848 589,824 602,112 454,656 462,848 593,920 610,304 wc-input1 159,744 163,840 172,032 180,224 163,840 163,840 176,128 180,224 wc-scanStream 167,936 172,032 192,512 192,512 167,936 172,032 192,512 192,512 zebra 204,800 208,896 225,280 229,376 204,800 208,896 225,280 229,376 zern 131,072 131,072 139,264 139,264 135,168 135,168 143,360 143,360 compile time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 barnes-hut 5.17 4.97 6.66 6.73 5.05 5.05 6.68 6.72 boyer 5.12 5.18 9.48 9.90 5.09 5.18 9.53 9.98 checksum 4.14 4.11 4.22 4.23 4.09 4.09 4.31 4.24 count-graphs 4.30 4.29 5.07 5.08 4.34 4.33 5.11 5.14 DLXSimulator 5.28 5.30 8.01 8.16 5.32 5.38 8.09 8.22 fft 4.23 4.20 4.55 4.55 4.24 4.23 4.59 4.58 fib 4.07 4.03 4.19 4.20 4.07 4.06 4.23 4.25 flat-array 4.04 4.02 4.19 4.19 4.08 4.07 4.25 4.24 hamlet 20.56 21.27 60.83 61.23 19.94 20.90 60.24 60.79 imp-for 4.05 4.03 4.19 4.19 4.08 4.08 4.23 4.24 knuth-bendix 4.75 4.79 6.88 6.99 4.77 4.79 6.94 7.06 lexgen 5.91 5.92 10.51 10.54 5.98 5.99 10.61 10.63 life 4.25 4.25 5.02 5.07 4.30 4.28 5.04 5.11 logic 4.71 4.74 7.13 7.37 4.76 4.76 7.19 7.42 mandelbrot 4.06 4.06 4.22 4.22 4.11 4.08 4.25 4.27 matrix-multiply 4.08 4.07 4.24 4.24 4.17 4.11 4.29 4.29 md5 4.40 4.40 5.31 5.38 4.44 4.43 5.32 5.37 merge 4.06 4.04 4.25 4.25 4.09 4.08 4.33 4.36 mlyacc 10.62 10.36 23.96 24.04 10.72 10.78 24.09 24.17 model-elimination 10.49 10.91 30.41 30.59 11.27 11.32 31.14 31.42 mpuz 4.10 4.11 4.35 4.35 4.14 4.13 4.38 4.38 nucleic 6.07 6.09 10.19 11.00 6.08 6.12 10.31 11.05 output1 4.36 4.37 5.35 5.43 4.40 4.40 5.39 5.47 peek 4.34 4.35 5.18 5.24 4.38 4.38 5.21 5.29 psdes-random 4.07 4.06 4.22 4.23 4.09 4.09 4.27 4.27 ratio-regions 4.48 4.47 5.48 5.50 4.51 4.50 5.53 5.53 ray 5.55 5.57 9.43 9.55 5.62 5.64 9.48 9.62 raytrace 7.10 7.14 13.65 13.82 7.01 7.02 13.71 13.90 simple 5.88 6.03 10.91 11.06 5.95 5.95 10.98 11.13 smith-normal-form 5.49 5.61 18.98 21.34 5.60 5.67 19.04 21.61 tailfib 4.04 4.03 4.18 4.18 4.07 4.05 4.22 4.23 tak 4.03 4.02 4.20 4.20 4.07 4.07 4.22 4.23 tensor 5.03 5.03 6.81 6.85 5.05 5.05 6.88 6.93 tsp 4.51 4.50 5.50 5.56 4.54 4.54 5.57 5.60 tyan 5.28 5.29 8.50 8.59 5.30 5.31 8.56 8.65 vector-concat 4.10 4.06 4.26 4.26 4.10 4.09 4.29 4.29 vector-rev 4.05 4.05 4.22 4.23 4.08 4.07 4.26 4.27 vliw 8.31 8.46 19.56 19.74 8.73 8.70 19.83 20.03 wc-input1 4.68 4.68 6.51 6.36 4.70 4.71 6.57 6.43 wc-scanStream 4.75 4.75 6.65 6.73 4.79 4.79 6.72 6.80 zebra 5.24 5.26 8.85 8.92 5.26 5.26 8.92 8.99 zern 4.35 4.33 4.94 4.97 4.38 4.37 4.98 5.01 run time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 barnes-hut 11.88 10.64 11.35 10.16 12.16 10.66 11.36 10.17 boyer 10.99 10.76 12.05 12.80 10.57 12.26 11.31 13.78 checksum 77.57 70.04 83.23 79.36 30.82 31.31 45.69 45.22 count-graphs 19.89 20.38 24.01 24.48 19.88 20.26 24.07 24.14 DLXSimulator 11.15 14.12 13.10 15.84 11.08 14.11 13.25 15.68 fft 12.58 11.92 13.03 12.27 12.55 11.88 13.00 12.31 fib 18.63 18.95 23.36 24.44 21.35 21.41 23.40 24.74 flat-array 4.62 4.62 7.37 7.37 4.62 4.62 7.37 7.37 hamlet 10.80 14.76 30.21 35.48 10.91 14.81 31.03 34.92 imp-for 13.37 13.37 10.62 14.42 13.37 13.37 10.66 14.42 knuth-bendix 11.56 12.74 25.35 27.02 11.62 13.40 26.19 28.39 lexgen 10.99 11.86 16.15 16.01 11.16 12.09 16.32 16.52 life 6.14 6.27 7.22 7.35 5.60 6.16 6.98 7.46 logic 11.87 12.84 22.51 23.28 11.45 12.37 21.10 21.72 mandelbrot 16.56 16.56 21.43 21.44 16.56 16.56 21.43 21.44 matrix-multiply 1.91 1.32 2.20 1.57 1.91 1.33 2.20 1.58 md5 32.33 32.45 27.91 28.46 24.01 24.44 22.26 28.25 merge 8.32 11.26 10.02 11.42 8.37 11.28 9.84 11.46 mlyacc 13.88 16.39 19.31 21.20 12.10 16.29 17.10 21.18 model-elimination 22.89 23.70 37.67 36.51 22.87 23.66 37.41 36.82 mpuz 12.97 12.35 23.03 22.37 12.34 12.35 22.67 22.39 nucleic 11.65 10.04 12.18 10.88 13.37 9.94 14.00 10.85 output1 6.65 6.83 9.81 9.02 6.65 6.81 9.83 9.30 peek 20.51 22.13 15.05 15.05 21.64 21.87 15.05 15.05 psdes-random 13.32 13.34 12.66 14.88 14.37 14.36 12.71 14.88 ratio-regions 10.97 11.74 13.29 13.17 11.29 10.98 13.20 13.67 ray 13.80 13.37 13.79 13.60 14.15 13.58 14.17 13.32 raytrace 11.78 9.72 19.17 14.50 11.81 9.65 19.47 13.87 simple 11.79 11.28 27.39 24.95 11.49 11.31 27.87 24.18 smith-normal-form 18.42 18.39 18.45 18.41 18.44 18.31 18.46 18.33 tailfib 13.62 13.62 23.54 23.54 13.62 13.62 23.54 23.54 tak 8.40 6.98 9.02 9.93 7.46 7.50 8.77 7.89 tensor 20.93 20.93 25.03 23.02 20.93 20.93 24.02 24.02 tsp 23.16 21.97 20.76 19.59 23.20 21.95 20.85 19.57 tyan 12.16 13.31 18.84 19.65 12.21 13.41 18.61 19.83 vector-concat 16.48 16.45 20.89 20.72 16.52 16.41 20.85 21.31 vector-rev 9.67 9.67 18.52 18.56 9.67 9.65 18.54 18.57 vliw 14.47 14.18 27.81 27.13 14.69 14.73 27.40 27.46 wc-input1 16.43 16.58 15.08 16.11 16.37 16.61 15.21 16.07 wc-scanStream 9.39 9.31 11.82 11.78 9.38 9.37 11.75 11.85 zebra 15.49 15.70 15.84 17.04 15.57 15.97 16.09 17.34 zern 14.72 13.48 23.13 20.44 14.80 13.42 23.04 20.62 mlton-20100608/doc/x86_64-port-notes/bench-20070619.txt0000644000076600000240000003471311404435632020132 0ustar mtfstaffSHADOW (Dual-processor AMD Opteron 2.0GHz, 8GB Memory, Fedora Core 6) Linux shadow 2.6.20-1.2952.fc6 #1 SMP Wed May 16 18:18:22 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51) MLton0 -- ~/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen native -align 4 (* 32-bit *) MLton1 -- ~/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen native -align 8 (* 32-bit *) MLton2 -- ~/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen c -align 4 (* 32-bit *) MLton3 -- ~/devel/mlton/mlton-20051202-1.i386-linux/build/bin/mlton -codegen c -align 8 (* 32-bit *) MLton4 -- ~/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen amd64 -align 4 (* 64-bit *) MLton5 -- ~/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen amd64 -align 8 (* 64-bit *) MLton6 -- ~/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen c -align 4 (* 64-bit *) MLton7 -- ~/devel/mlton/mlton.svn.trunk/build/bin/mlton -codegen c -align 8 (* 64-bit *) run time ratio benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 barnes-hut 1.00 0.93 1.07 0.94 0.96 0.86 0.97 0.91 boyer 1.00 1.08 1.42 1.18 1.38 1.37 1.50 1.45 checksum 1.00 1.01 0.75 0.80 0.61 0.61 3.17 3.18 count-graphs 1.00 0.99 1.01 1.03 2.19 1.70 2.42 1.85 DLXSimulator 1.00 1.24 1.21 1.33 1.69 1.99 1.77 1.99 fft 1.00 0.83 0.98 0.88 1.04 0.94 1.12 0.91 fib 1.00 1.00 1.41 1.38 1.19 1.09 1.46 1.38 flat-array 1.00 0.95 0.00 0.00 0.88 1.02 0.00 0.00 hamlet 1.00 1.19 2.36 2.82 1.73 1.49 3.37 3.31 imp-for 1.00 0.98 0.83 0.84 0.90 0.89 0.82 0.82 knuth-bendix 1.00 1.04 2.13 2.14 1.57 1.06 2.35 1.86 lexgen 1.00 1.01 1.87 1.45 1.47 1.10 1.57 1.21 life 1.00 1.07 1.12 1.15 1.68 1.11 1.68 1.05 logic 1.00 1.05 1.41 1.47 1.43 1.28 1.83 1.67 mandelbrot 1.00 1.02 1.17 1.17 0.86 0.87 0.93 0.93 matrix-multiply 1.00 0.80 1.65 1.41 0.92 0.94 0.77 0.74 md5 1.00 1.01 1.27 1.26 1.92 1.33 2.77 2.23 merge 1.00 1.19 1.17 1.32 1.67 1.98 1.80 1.80 mlyacc 1.00 1.19 1.31 1.44 1.66 1.50 1.87 1.77 model-elimination 1.00 1.06 1.54 1.54 1.44 1.22 1.81 1.65 mpuz 1.00 1.01 1.27 1.29 1.67 1.29 2.81 2.46 nucleic 1.00 0.90 1.07 0.94 1.16 0.94 1.15 0.95 output1 1.00 1.00 1.82 1.69 1.07 1.07 1.37 1.57 peek 1.00 0.98 1.00 0.99 1.72 1.73 1.24 0.74 psdes-random 1.00 1.00 1.10 1.06 1.08 0.96 0.87 0.77 ratio-regions 1.00 1.01 1.18 1.18 1.21 1.06 1.45 1.28 ray 1.00 0.95 1.15 1.13 1.08 0.97 1.17 0.96 raytrace 1.00 0.98 1.56 1.48 1.17 1.01 1.39 1.19 simple 1.00 0.96 1.63 1.57 1.38 0.96 2.11 1.74 smith-normal-form 1.00 1.00 1.01 1.00 0.82 0.83 0.81 0.83 tailfib 1.00 0.99 2.58 2.31 1.33 1.34 1.67 1.66 tak 1.00 1.01 1.29 1.23 1.28 1.16 1.45 1.25 tensor 1.00 1.01 2.13 2.08 1.46 1.48 2.29 2.23 tsp 1.00 1.00 1.09 1.06 1.10 1.09 1.10 1.06 tyan 1.00 1.09 1.19 1.33 1.59 1.37 1.89 1.66 vector-concat 1.00 0.98 2.03 2.08 0.78 0.78 0.85 0.79 vector-rev 1.00 1.12 2.29 2.29 1.39 1.15 1.68 1.61 vliw 1.00 1.02 1.55 1.67 2.04 1.49 2.63 2.06 wc-input1 1.00 0.99 1.01 1.04 1.25 1.00 1.23 1.00 wc-scanStream 1.00 1.01 1.23 1.23 1.03 0.97 1.23 1.19 zebra 1.00 1.04 0.78 0.81 1.56 1.02 1.15 0.79 zern 1.00 0.91 1.31 1.23 1.21 1.10 2.02 1.88 size benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 barnes-hut 119,286 120,246 119,248 121,136 168,054 168,566 164,877 169,181 boyer 144,693 152,213 169,841 184,657 213,241 213,305 222,577 222,625 checksum 65,421 65,549 66,009 66,105 93,721 93,721 100,809 100,809 count-graphs 76,645 77,029 85,497 86,105 118,473 118,601 123,601 123,873 DLXSimulator 144,113 146,033 157,445 157,797 193,780 194,324 205,812 207,172 fft 74,932 75,156 84,580 84,900 115,581 115,613 116,810 116,842 fib 57,853 57,949 65,913 66,041 93,769 93,737 100,665 100,649 flat-array 57,901 57,997 65,865 65,993 93,753 93,753 100,537 100,537 hamlet 1,246,544 1,270,480 1,416,924 1,466,428 1,556,989 1,569,901 1,595,557 1,615,045 imp-for 57,757 57,853 65,817 65,945 93,641 93,641 100,313 100,297 knuth-bendix 124,125 125,885 136,425 139,273 168,980 169,700 179,748 181,492 lexgen 216,438 219,542 242,762 249,130 281,843 282,979 311,467 315,859 life 75,973 77,061 84,513 86,721 117,545 117,513 121,673 121,657 logic 115,429 119,077 133,565 141,725 165,273 165,113 174,265 174,249 mandelbrot 57,837 57,933 65,897 66,025 93,609 93,609 100,377 100,377 matrix-multiply 59,364 59,524 67,488 67,744 94,265 94,265 100,937 100,937 md5 93,173 93,909 95,457 96,705 126,084 126,516 133,444 134,564 merge 59,453 59,581 67,513 67,673 95,881 95,865 102,505 102,537 mlyacc 516,342 525,178 584,530 595,922 642,579 646,195 716,251 706,243 model-elimination 646,075 660,219 768,459 771,339 862,550 864,854 904,246 906,614 mpuz 60,701 60,893 69,625 69,977 97,481 97,449 105,033 105,161 nucleic 207,616 212,160 169,103 179,759 270,792 270,904 220,836 220,932 output1 96,343 97,175 98,179 99,779 133,016 133,560 137,912 139,192 peek 91,793 92,657 93,853 95,293 125,140 125,588 133,084 134,156 psdes-random 58,525 58,621 66,681 66,873 94,601 94,633 101,209 101,289 ratio-regions 83,853 84,109 95,177 95,593 126,857 126,729 137,505 137,377 ray 198,014 200,126 211,760 214,992 260,054 260,934 268,021 267,813 raytrace 278,011 282,587 319,461 325,349 378,506 379,882 394,166 394,694 simple 236,729 240,473 272,727 278,999 330,145 330,993 356,460 358,268 smith-normal-form 192,213 206,453 219,277 251,533 264,916 276,356 281,812 317,540 tailfib 57,565 57,629 65,753 65,849 93,369 93,369 100,233 100,233 tak 57,965 57,997 65,929 66,057 93,801 93,769 100,633 100,633 tensor 113,236 114,228 119,792 121,712 153,819 154,459 165,443 166,779 tsp 97,613 98,349 99,307 100,683 138,019 138,547 137,074 138,178 tyan 149,417 151,561 163,541 168,213 203,124 203,972 217,484 219,308 vector-concat 59,125 59,221 67,633 67,761 95,337 95,337 101,993 102,009 vector-rev 58,369 58,465 66,717 66,813 94,649 94,649 101,465 101,465 vliw 406,561 412,481 493,425 505,297 524,814 526,174 625,246 625,102 wc-input1 117,457 118,513 119,837 121,597 162,194 162,898 168,810 173,786 wc-scanStream 124,593 125,681 128,957 130,941 171,426 172,114 180,714 179,898 zebra 156,149 157,429 158,701 161,165 210,356 211,124 209,588 212,852 zern 104,070 104,358 112,458 112,874 134,458 134,458 133,415 133,463 compile time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 barnes-hut 4.40 4.60 8.01 7.47 10.25 9.65 13.22 13.39 boyer 4.42 4.45 20.37 19.73 10.78 10.68 25.89 23.69 checksum 3.19 3.25 3.72 3.81 7.41 7.33 7.67 7.74 count-graphs 3.96 3.86 5.31 5.26 8.13 8.08 9.53 9.17 DLXSimulator 4.79 4.68 10.63 10.30 10.83 11.20 14.71 15.26 fft 3.29 3.22 4.26 4.50 7.96 8.10 8.80 8.89 fib 3.07 3.72 3.33 4.04 8.12 8.10 8.45 8.29 flat-array 3.31 3.58 4.21 3.61 7.35 7.84 7.72 8.23 hamlet 46.34 47.68 133.15 136.87 52.05 52.54 125.08 129.56 imp-for 3.62 3.13 3.50 3.39 7.79 7.14 7.46 7.60 knuth-bendix 3.84 3.87 8.11 9.07 9.06 9.12 13.73 12.38 lexgen 5.88 5.39 13.41 14.76 12.40 12.97 20.01 20.45 life 3.90 3.77 4.74 5.25 8.28 7.74 9.03 9.90 logic 4.10 4.03 8.37 8.24 9.63 9.86 12.32 12.48 mandelbrot 3.68 3.71 3.57 3.19 7.76 7.29 8.50 7.93 matrix-multiply 3.59 3.03 3.49 3.87 7.30 8.24 8.45 7.80 md5 3.64 3.71 5.20 5.30 8.50 8.99 9.56 9.96 merge 3.11 2.99 3.29 3.86 7.17 7.35 8.14 7.72 mlyacc 13.02 12.13 39.42 38.34 27.17 27.51 45.66 44.65 model-elimination 13.31 14.06 50.06 54.54 27.20 26.60 57.92 61.22 mpuz 3.65 3.40 4.14 4.55 8.01 8.19 7.94 8.80 nucleic 6.22 6.96 16.82 19.56 10.68 10.94 21.58 24.39 output1 3.77 3.36 4.90 6.29 8.47 8.10 9.59 10.37 peek 4.19 4.14 5.34 5.62 8.64 8.65 10.48 10.73 psdes-random 3.73 2.96 3.60 3.82 7.40 7.37 8.00 7.87 ratio-regions 4.08 3.68 5.46 5.53 8.74 9.63 10.88 11.32 ray 5.55 5.58 11.84 12.97 12.49 12.30 17.54 18.95 raytrace 7.57 7.32 20.99 20.90 15.07 16.44 27.17 26.83 simple 5.63 6.30 14.93 15.30 13.35 13.34 21.15 20.56 smith-normal-form 5.15 5.17 62.38 61.63 11.06 11.50 58.08 82.66 tailfib 3.69 3.72 4.09 3.54 8.02 8.17 8.29 8.45 tak 3.22 3.48 3.83 3.72 7.48 8.38 8.73 8.63 tensor 4.89 4.40 6.98 8.75 10.54 10.61 13.92 12.95 tsp 4.37 3.98 6.34 6.01 8.97 8.98 10.73 10.72 tyan 5.15 5.78 11.26 11.22 10.98 11.15 16.59 15.86 vector-concat 3.11 3.85 4.05 3.44 7.51 8.03 8.56 7.74 vector-rev 2.97 3.15 3.23 4.03 7.71 8.00 8.15 8.12 vliw 9.98 9.90 31.02 30.40 19.01 19.31 35.75 37.56 wc-input1 4.15 4.62 7.16 7.82 9.12 9.13 12.77 12.97 wc-scanStream 4.43 4.57 8.00 7.57 9.55 10.16 12.86 14.06 zebra 5.47 5.00 11.71 11.07 11.91 11.66 16.41 14.77 zern 3.83 3.65 4.41 5.16 8.76 8.67 10.22 9.51 run time benchmark MLton0 MLton1 MLton2 MLton3 MLton4 MLton5 MLton6 MLton7 barnes-hut 17.54 16.35 18.71 16.49 16.87 15.15 17.05 16.00 boyer 17.25 18.68 24.42 20.29 23.77 23.62 25.93 25.02 checksum 43.40 43.83 32.50 34.75 26.35 26.34 137.75 138.01 count-graphs 21.82 21.58 21.95 22.41 47.73 36.99 52.84 40.31 DLXSimulator 17.07 21.18 20.64 22.65 28.89 34.04 30.15 33.97 fft 15.77 13.10 15.43 13.88 16.44 14.85 17.71 14.30 fib 34.85 34.80 49.21 48.15 41.32 37.84 50.78 48.21 flat-array 11.33 10.82 0.03 0.03 10.00 11.59 0.02 0.02 hamlet 16.45 19.55 38.91 46.33 28.46 24.51 55.52 54.39 imp-for 29.29 28.82 24.45 24.55 26.25 26.17 24.15 24.08 knuth-bendix 17.76 18.45 37.84 38.01 27.86 18.75 41.69 33.04 lexgen 20.21 20.49 37.83 29.26 29.80 22.18 31.73 24.40 life 8.39 8.97 9.36 9.68 14.06 9.35 14.13 8.83 logic 18.42 19.43 25.92 27.09 26.41 23.51 33.73 30.83 mandelbrot 23.96 24.34 27.93 28.02 20.66 20.83 22.37 22.28 matrix-multiply 3.63 2.89 6.01 5.13 3.33 3.42 2.80 2.68 md5 32.51 32.75 41.32 41.06 62.40 43.24 90.08 72.38 merge 14.18 16.86 16.61 18.68 23.73 28.05 25.46 25.46 mlyacc 17.39 20.71 22.73 24.99 28.79 26.03 32.53 30.79 model-elimination 28.16 29.74 43.28 43.35 40.62 34.44 51.10 46.49 mpuz 21.83 21.98 27.67 28.14 36.42 28.07 61.37 53.72 nucleic 16.55 14.95 17.68 15.49 19.17 15.62 19.02 15.74 output1 7.18 7.21 13.04 12.10 7.67 7.69 9.87 11.26 peek 20.25 19.93 20.25 20.10 34.81 35.10 25.18 14.97 psdes-random 16.44 16.43 18.03 17.40 17.77 15.76 14.30 12.64 ratio-regions 24.81 24.94 29.36 29.40 29.91 26.23 35.86 31.80 ray 15.91 15.06 18.23 17.99 17.21 15.51 18.60 15.31 raytrace 16.37 15.98 25.47 24.27 19.22 16.61 22.69 19.44 simple 20.42 19.55 33.27 31.99 28.27 19.61 43.11 35.61 smith-normal-form 10.32 10.29 10.38 10.28 8.48 8.52 8.40 8.54 tailfib 19.70 19.56 50.80 45.53 26.28 26.32 32.94 32.72 tak 12.92 13.09 16.69 15.94 16.54 15.01 18.72 16.16 tensor 17.30 17.40 36.88 35.90 25.23 25.53 39.57 38.65 tsp 20.68 20.75 22.51 21.96 22.66 22.56 22.79 21.95 tyan 18.44 20.07 21.99 24.56 29.34 25.27 34.76 30.70 vector-concat 31.23 30.62 63.44 64.93 24.25 24.49 26.70 24.70 vector-rev 18.84 21.01 43.21 43.22 26.16 21.64 31.71 30.42 vliw 20.10 20.45 31.12 33.50 41.07 30.04 52.89 41.38 wc-input1 27.51 27.22 27.84 28.48 34.39 27.47 33.88 27.58 wc-scanStream 14.62 14.78 17.97 18.02 15.05 14.21 17.93 17.40 zebra 26.27 27.37 20.41 21.28 41.07 26.86 30.14 20.70 zern 17.83 16.17 23.42 21.97 21.60 19.58 36.06 33.49 mlton-20100608/doc/x86_64-port-notes/exec-summary.0.txt0000644000076600000240000000351711404435632020720 0ustar mtfstaff Notes on the status of the x86_64 port of MLton. ======================================================================= Summary: The runtime system (i.e., garbage collector and related services) has been rewritten to be configurable along two independent axes: the native pointer size and the ML heap object pointer size. There are no known functionality or performance regressions with respect to the rewritten runtime and the mainline runtime. The next step will be modify the Basis Library implementation (on both the SML and C sides) to be agnostic to the native representation of primitive C-types (e.g., int, long); this is important for getting the right representation for file descriptors, etc. This step ensures that the Basis Library implementation may be shared between 32-bit and 64-bit systems. Following that, it should be possible to push changes through the compiler proper to support a C-codegen in which all pointers are 64-bit. After shaking out bugs there, we should be able to consider supporting smaller ML-pointer representations and a simple native codegen. Timetable: It is expected that the Basis Library changes and the C-codegen will be completed by March 1. Technical Question: One of the native representations that changes from a 32-bit system to a 64-bit system is the GNU MP representation of arbitrary precision integers. Hence, the MLton.IntInf representation datatype datatype rep = Big of Word.word Vector.vector | Small of Int.int may not suffice (in the situations where Int.int and/or Word.word are 32-bit but the host system is 64-bit). We are considering the best way to accomodate IntInf in the 64-bit setting, but we recall that Polyspace has used MLton.IntInf.rep in the past, and wanted to ask if there were any particular requirements on maintaining or changing the interface. mlton-20100608/doc/x86_64-port-notes/exec-summary.1.txt0000644000076600000240000000513011404435632020712 0ustar mtfstaff Notes on the status of the x86_64 port of MLton. ======================================================================= Summary: The runtime system (i.e., garbage collector and related services) has been rewritten to be configurable along two independent axes: the native pointer size and the ML heap object pointer size. There are no known functionality or performance regressions with respect to the rewritten runtime and the mainline runtime. The Basis Library has been refactored so that it is compile-time configurable on the following axes: OBJPTR -- size of an object pointer (32-bits or 64-bits) HEADER -- size of an object header (32-bits or 64-bits) SEQINDEX -- size of an array/vector length (32-bits or 64-bits) DEFAULT_CHAR -- size of Char.char (8-bits; no choice according to spec) DEFAULT_INT -- size of Int.int (32-bits, 64-bits, and IntInf.int) DEFAULT_REAL -- size of Real.real (32-bits, 64-bits) DEFAULT_WORD -- size of Word.word (32-bits, 64-bits) C_TYPES -- sizes of various primitive C types The object pointer and object header are needed for the IntInf implemention. Configuring the default sizes support both adopting 64-bit integers and words as the default on 64-bit platforms, but also supports retaining 32-bit integers and words as the default on 64-bit platforms. The sizes of primitive C types are determined by the target architecture and operating system. This ensures that the Basis Library uses the right representation for file descriptors, etc., and ensures that the implementation may be shared between 32-bit and 64-bit systems. There are no known functionality or performance regressions with respect to the refactored Basis Library implementation and the mainline implementation. The next step is to push changes through the compiler proper to support a C-codegen in which all pointers are 64-bit. After shaking out bugs there, we should be able to consider supporting smaller ML-pointer representations and a simple native codegen. MLton.IntInf changes: As noted above, the object pointer size is needed by the IntInf implementation, which represents an IntInf.int either as a pointer to a vector of GNU MP mp_limb_t objects or as the upper bits of a pointer. Since the representation of mp_limb_t changes from a 32-bit system to a 64-bit system, and the size of an object pointer may be compile-time configurable, we have changed the MLTON_INTINF signature to have the following: structure BigWord : WORD structure SmallInt : INTEGER datatype rep = Big of BigWord.word vector | Small of SmallInt.int val rep: t -> rep mlton-20100608/doc/x86_64-port-notes/mltongc.txt0000644000076600000240000003240411404435632017603 0ustar mtfstaff Notes on the MLton garbage collection system. Until the "Thoughts on 64-bits" section, a word is considered to be 32-bits. Garbage Collector ================= MLton implements a relatively simple garbage collection strategy, that nonetheless adapts itself readily to different scenarios of memory usage. All ML objects (including ML execution stacks) are allocated in a contiguous heap. The heap has the following general layout: --------------------------------------------------- | old generation | to space | nursery | --------------------------------------------------- ^ ^ ^ ^ start back frontier limit New ML objects are allocated in the nursery at the frontier. Upon exhausting the nursery (i.e., when limit - frontier is insufficient for the next object allocation), a garbage collection is initiated. It should be noted that in the absence of memory pressure, the to-space is of zero size and the old-generation is simply the live data from the last garbage collection. Hence, generational garbage collection is only enabled when the program display sufficiently high memory usage. In the common, non-generational scenario, a garbage collection involves one of two major garbage collection strategies. If there is sufficient memory to allocate a second heap of approximately the same size as the current heap, then a Cheney Copy garbage collection is performed. (In practice, the second heap is already allocated and the two semi-spaces are swapped at each Cheney Copy.) If there is insufficient memory for a second semi-space, then a Mark Compact garbage collection is performed. After a Mark Compact garbage collection, or if the live ratio is low enough, the runtime switches to a generational collection. In this scenario, the current live data becomes the old-generation, while the remaining space is split into the to-space and the nursery. A minor garbage collection copies live objects from the nursery to the beginning of to-space, thereby extending the old-generation and shrinking the space available for the to-space and the nursery. Eventually, the nursery becomes too small to accomodate new object allocations, and a major garbage collection is intiated. The MLton garbage collector additionally supports weak pointers and object finalizers, hash-consing (sharing) of both the entire heap and the heap reachable from individual objects, computing the dynamic size of objects, and provides some runtime support for profiling. In the sequel we will refer to pointers to objects in the ML heap as "heap pointers". Note that a valid heap pointer is always bounded by the start pointer and the limit pointer of the current heap. Hence, heap pointers admit representations other than the native pointer representation. Furthermore, precise garbage collection requires identifying all heap pointers in ML objects. There are four kinds of ML objects: array, normal (fixed size), stack, and weak. Each object has a header (currently, a 32-bit word), which immediately precedes the object data. A heap pointer always denotes the address following the header (i.e., the first data word); there are no heap pointers to object interiors. A header word has the following bit layout: 00 : 1 01 - 19 : type index bits 20 - 30 : counter bits, used by mark compact GC 31 : mark bit, used by mark compact GC Normal objects have the following layout: header word :: (non heap-pointers)* :: (heap pointers)* Note that the non heap-pointers denote a sequence of primitive data values. These data values need not map directly to values of the native word size. MLton's aggressive representation strategies may pack multiple primitive values into the same native word. Likewise, a primitive value may span multiple native words (e.g., Word64.word). Array objects have the following layout: counter word :: length word :: header word :: ( (non heap-pointers)* :: (heap pointers)* )* The counter word is used by mark compact GC. The length word is the number of elements in the array. Array elements have the same individual layout as normal objects, omitting the header word. Stack objects have the following layout: header word :: markTop pointer :: markIndex word :: reserved word :: used word :: ... reserved bytes ... The markTop pointer and markIndex word are used by mark compact GC. The reserved word gives the number of bytes for the stack (before the next ML object). The used word gives the number of bytes currently used by the stack. The sequence of reserved bytes correspond to ML stack frames, which will be discussed in more detail below. Weak objects have the following layout: header word :: unused word :: link word :: heap-pointer The type index of a header word is an index into an array, where each element describes the layout of an object. The 19 bits available for the type index means that there are only 2^19 different object layouts per program. The "hello-world" program yields 37 object types in the array, though there are only 19 distinct object types. The type index array is declared as follows: typedef enum { ARRAY_TAG, NORMAL_TAG, STACK_TAG, WEAK_TAG, } GC_ObjectTypeTag; typedef struct { GC_ObjectTypeTag tag; Bool hasIdentity; ushort numNonPointers; ushort numPointers; } GC_ObjectType; GC_ObjectType *objectTypes; /* Array of object types. */ The objectTypes pointer is initialized to point to a static array of object types that is emitted for each compiled program. The hasIdentity field indicates whether or not the object has mutable fields, in which case it may not be hash-cons-ed. In a normal object, the numNonPointers field indicates the number of 32-bit words of non heap-pointer data, while the numPointers field indicates the number of heap pointers. In an array object, the numNonPointers field indicates the number of bytes of non heap-pointer data, while the numPointers field indicates the number of heap pointers. In a stack object, the numNonPointers and numPointers fields are irrelevant. In a weak object, the numNonPointers and numPointers fields are interpreted as in a normal object. As an example, here is a portion of the static data emitted for the "hello-world" program: static GC_ObjectType objectTypes[] = { { 2, FALSE, 0, 0 }, { 0, FALSE, 1, 0 }, { 1, TRUE, 2, 1 }, { 3, FALSE, 3, 0 }, { 0, FALSE, 4, 0 }, ... } The "... reserved bytes ..." of a stack object constitute a linear sequence of frames. For the purposes of garbage collection, we must be able to recover the size and offsets of live heap-pointers for each frame. This data is declared as follows: typedef ushort *GC_offsets; typedef struct GC_frameLayout { char isC; ushort numBytes; GC_offsets offsets; } GC_frameLayout; GC_frameLayout *frameLayouts; The frameLayouts pointer is initialized to point to a static array of frame layouts that is emitted for each compiled program. The isC field identified whether or not the frame is for a C call. (Note: The ML stack is distinct from the system stack. A C call executes on the system stack. The frame left on the ML stack is just a marker.) The numBytes field indicates the size of the frame, including space for the return address. The offsets field points to an array (the zeroeth element recording the size of the array) whose elements record byte offsets from the bottom of the frame at which live heap pointers are located. As an example, here is a portion of the static data emitted for the "hello-world" program: static ushort frameOffsets0[] = {0}; static ushort frameOffsets1[] = {2,0,4}; static ushort frameOffsets2[] = {1,0}; static ushort frameOffsets3[] = {2,4,16}; static ushort frameOffsets4[] = {1,4}; ... static GC_frameLayout frameLayouts[] = { {TRUE, 4, frameOffsets0}, {FALSE, 4, frameOffsets0}, {TRUE, 20, frameOffsets1}, {TRUE, 20, frameOffsets2}, {FALSE, 12, frameOffsets0}, ... Thoughts on 64-bits: * At this high level, I don't see obvious difficulties with adapting the garbage collector to a 64-bit platform. However, there are certainly a number of design decisions. * What representation for heap pointers? There is a preliminary proposal from Stephen: http://mlton.org/pipermail/mlton/2004-October/026162.html Certainly, it would appear to be easiest to begin with a scenario where heap pointers share the same representation as native pointers (i.e., 64-bits). However this means that ML objects will be quite a bit bigger in the 64-bit world. Ultimately, it would be appropriate to have multiple strategies at hand. Assuming that per-compile representation strategies are available, the question arises as to how to best integrate with the runtime system. The compiler proper can handle internalizing/externalizing heap pointers in the code it emits. However, it seems likely that we would want multiple libmlton.a libraries available, corresponding to the different strategies. The overhead of consulting a flag in the runtime state to determine the representation of heap pointers at every heap pointer dereference would appear to much much too high. The implementation may certainly make use of inline functions or macros to unify the different strategies, but it seems as though we will want to compile different specializations of the runtime system. Also, I think it makes sense to ensure that heap pointers passed through the FFI are externalized -- that is, C code will only ever see 64-bit pointers, regardless of the representation strategy. However, there is an argument against this. Currently, int ref ref is a valid FFI type, and we currently claim that it has the "natural C representation." This claim would be broken if the inner ref had a different heap pointer representation. We could provide {extern,intern}HeapPointer functions for C, but then it is not clear how to compile the C code, not knowing what representation will be chosen for heap pointers. * How big should arrays be? We currently allow arrays of size up to Int.maxInt, where Int.int is a 32-bit integer. It is a separate issue to decide how the Basis Library should change in the presence of a 64-bit port, but if we were to allow arrays of size up to Int64.maxInt, then the representation of array objects would need to change, as the counter word and the length word would need to be larger to accomodate very large arrays. * Another big design decision concerns how best to accomodate both the 32-bit garbage collector and the 64-bit garbage collection with (much) the same code. Sharing as much code as possible would be desirable, as we do not wish the two systems to vary in any significant way. I think that this strongly suggests that all sizes and offsets are measured in (8-bit) bytes. I can't remember why array and normal objects treat the numNonPointers field of a GC_ObjectType differently. I think that it also strongly suggests that we avoid the C types int and long, and instead use more specific C99 types. I also think that it is a fairly safe assumption to assume that the programs compiled on 64-bit architectures are essentially the same as those compiled on 32-bit architectures. In particular, 2^19 object types should remain viable for some time to come. Likewise, the 10 counter bits in the header word (used to implement the mark stack) should continue to be sufficient for the number of heap pointers in a normal heap object. Finally, 16-bits for the numNonPointers and numPointers fields of a GC_ObjectType will continue to suffice. (For a truly absurd example, the currently active exception handler is represented by a 32-bit offset from the bottom of the stack. If an ML execution stack were to grow to more than 4GB, this representation would no longer suffice.) On the other hand, it is not safe to assume that the parameters of a 64-bit host system are essentially the same as a 32-bit host system. For example, in order to make decisions regarding garbage collection strategies, the runtime must query the amount of available RAM. Likewise, garbage collection statistics, such as bytesAllocated, bytesCopied, bytesLive, etc., could potentially be an order of magnitude larger on 64-bit systems. And, most importantly, the actual size of the heap could be much larger on a 64-bit system. * Finally, I note that gc.c weighs in at 4826 lines, which is significantly larger than almost any SML file in the compiler. (The exceptions are the x86 native codegen register allocator and the elaborator for the core language.) Since we'll be going over the garbage collector with a fine tooth comb anyway, it might be time to start breaking it into separate implementation files. Those are some intial thoughts, and may provide a starting point for some discussion. _______________________________________________ MLton mailing list MLton@mlton.org http://mlton.org/mailman/listinfo/mlton mlton-20100608/doc/x86_64-port-notes/semantics.txt0000644000076600000240000000261411404435632020126 0ustar mtfstaffStructure Val From To Semantics ------------------------------------------------------------------------------- Word fromInt int word lowbits or sign-extend Word fromIntZ int word lowbits of zero-extend Word fromWord word word lowbits or zero-extend Word fromWordX word word lowbits of sign-extend Word toInt word int overflow check, unsigned Word toIntX word int overflow check, signed Word toWord word word lowbits or zero-extend Word toWordX word word lowbits or sign-extend Int fromInt int int overflow check, signed Int fromWord word int overflow check, unsigned Int fromWordX word int overflow check, signed Int toInt int int overflow check, signed Int toWord int word lowbits or zero-extend Int toWordX int word lowbits or sign-extend From: int, word To: int, word Semantics: lowbits or sign-extend, lowbits or zero-extend, overflow check, unsigned overflow check, signed Primitives are all: lowbits or sign-extend, lowbits or zero-extend mlton-20100608/doc/x86_64-port-notes/status.0.txt0000644000076600000240000000712111404435632017617 0ustar mtfstaff Notes on the status of the x86_64 port of MLton. ======================================================================= Sources: Work is progressing on the x86_64 branch; interested parties may check out the latest revision with: svn co svn://mlton.org/mlton/branches/on-20050822-x86_64-branch mlton.x86_64 and view the sources on the web at: http://mlton.org/cgi-bin/viewsvn.cgi/mlton/branches/on-20050822-x86_64-branch/ Background: (* Representing 64-bit pointers. *) http://mlton.org/pipermail/mlton/2004-October/026162.html (* MLton GC overview *) http://mlton.org/pipermail/mlton/2005-July/027585.html Summary: Thus far, the garbage collector (and related services) have been rewritten to be native pointer size agnostic with configurable heap object pointer representation. There are no known regressions with respect to the rewritten GC and the present 32-bit compiler. The next step will be to make the Basis Library implementation agnostic to the native representation of primitive C-types (e.g., int, char*, etc.). This will ensure that the Basis Library implementation may be shared among 32-bit and 64-bit systems. Following that, I believe that it will be possible to push changes through the compiler proper to support a C-codegen in which all pointers are 64-bit. After shaking out bugs there, we should be able to consider supporting smaller ML-pointer representations. Details: Thus far, code modifications have been limited to the runtime/ directory: http://mlton.org/cgi-bin/viewsvn.cgi/mlton/branches/on-20050822-x86_64-branch/runtime/ The new gc/ sub-directory breaks down the GC implementation into smaller pieces. For efficiency, they are #include-ed together to form a single compilation unit to feed to the C compiler. A key design decision has been to implement the GC in a manner that is agnostic to the native pointer size and to the desired ML-pointer representation. The file model.h encapsulates the key attributes that describe an ML-pointer representation, and the files objptr.{h,c} encapsulate the conversions between native pointers and ML-pointers. In most places, such conversions are relatively routine. One major exception is that some care must be taken with threading of internal pointers for the Jonker's mark-compact GC, since it must compensate for the possibility that an ML-pointer is not the same size as an ML-header. Similarly, any assumptions about the native WORD_SIZE has been removed. All object sizes are measured in 8-bit bytes and stored in size_t variables. Statistics are gathered in uintmax_t and intmax_t variables. The C-side of the Basis Library implementation is entirely agnostic to the representation of ML-objects (pointers, headers, etc.). That is, the FFI assumes that all ML-objects are passed by their native pointer representation. Consequently, all functions exported by the GC to the Basis Library are expressed in terms of native pointers. The one, and only, exception is that basis/IntInf.c requires some additional information about ML-header sizes, the layout of the GC_state struct, etc. It isn't clear that there is signficant benefit to be had by making the implementation agnostic to these decisions. Some decisions need to be made about the representation and implementation of IntInf.int. The salient point is that on a 64-bit system, a GMP limb is represented as a 64-bit object. With regards to the next step, I believe it will be worthwile to follow the technique used in the MLNLFFI-library implemantation. There, we use two ML Basis path variables (TARGET_ARCH, TARGET_OS) to choose the correct ML representation for primitive C types. mlton-20100608/doc/x86_64-port-notes/status.1.txt0000644000076600000240000002475711404435632017636 0ustar mtfstaff Notes on the status of the x86_64 port of MLton. ======================================================================= Sources: Work is progressing on the x86_64 branch; interested parties may check out the latest revision with: svn co svn://mlton.org/mlton/branches/on-20050822-x86_64-branch mlton.x86_64 and view the sources on the web at: http://mlton.org/cgi-bin/viewsvn.cgi/mlton/branches/on-20050822-x86_64-branch/ Background: (* Representing 64-bit pointers. *) http://mlton.org/pipermail/mlton/2004-October/026162.html (* MLton GC overview *) http://mlton.org/pipermail/mlton/2005-July/027585.html (* Runtime rewrite *) http://mlton.org/pipermail/mlton/2005-December/028421.html Summary: Since the last summary, the Basis Library has been refactored so that it is compile-time configurable on the following axes: OBJPTR -- size of an object pointer (32-bits or 64-bits) HEADER -- size of an object header (32-bits or 64-bits) SEQINDEX -- size of an array/vector length (32-bits or 64-bits) DEFAULT_CHAR -- size of Char.char (8-bits; no choice according to spec) DEFAULT_INT -- size of Int.int (32-bits, 64-bits, and IntInf.int) DEFAULT_REAL -- size of Real.real (32-bits, 64-bits) DEFAULT_WORD -- size of Word.word (32-bits, 64-bits) C_TYPES -- sizes of various primitive C types The object pointer and object header are needed for the IntInf implemention. Configuring the default sizes support both adopting 64-bit integers and words as the default on 64-bit platforms, but also supports retaining 32-bit integers and words as the default on 64-bit platforms. The sizes of primitive C types are determined by the target architecture and operating system. This ensures that the Basis Library uses the right representation for file descriptors, etc., and ensures that the implementation may be shared between 32-bit and 64-bit systems. MLton.IntInf changes: As noted above, the object pointer size is needed by the IntInf implementation, which represents an IntInf.int either as a pointer to a vector of GNU MP mp_limb_t objects or as the upper bits of a pointer. Since the representation of mp_limb_t changes from a 32-bit system to a 64-bit system, and the size of an object pointer may be compile-time configurable, we have changed the MLTON_INTINF signature to have the following: structure BigWord : WORD structure SmallInt : INTEGER datatype rep = Big of BigWord.word vector | Small of SmallInt.int val rep: t -> rep Technical Details: The key techniques used in the refactoring of the Basis Library is aggressive use of ML Basis path variables, successive rebindings of structures, and special 'Choose' functors. I'll describe each of these a little below. The Basis Library implementation is organized as a large ML Basis project. In order to establish the appropriate mappings between C primitive types (int, long long int, etc.) and ML types (Int32.int, Int64.int, etc), we use the $(TARGET_ARCH) and $(TARGET_OS) path variables to elaborate a target specific c-types.sml file: /config/c/$(TARGET_ARCH)-$(TARGET_OS)/c-types.sml The c-types.sml file is generated automatically for each target system, using the runtime/gen/gen-types.c program, and looks something like: (* C *) structure C_Char = struct open Int8 type t = int end functor C_Char_ChooseIntN (A: CHOOSE_INTN_ARG) = ChooseIntN_Int8 (A) structure C_SChar = struct open Int8 type t = int end functor C_SChar_ChooseIntN (A: CHOOSE_INTN_ARG) = ChooseIntN_Int8 (A) structure C_UChar = struct open Word8 type t = word end ... structure C_Size = struct open Word32 type t = word end functor C_Size_ChooseWordN (A: CHOOSE_WORDN_ARG) = ChooseWordN_Word32 (A) ... structure C_Off = struct open Int64 type t = int end functor C_Off_ChooseIntN (A: CHOOSE_INTN_ARG) = ChooseIntN_Int64 (A) ... structure C_UId = struct open Word32 type t = word end functor C_UId_ChooseWordN (A: CHOOSE_WORDN_ARG) = ChooseWordN_Word32 (A) ... (* from "gmp.h" *) structure C_MPLimb = struct open Word32 type t = word end functor C_MPLimb_ChooseWordN (A: CHOOSE_WORDN_ARG) = ChooseWordN_Word32 (A) Note that each C type has a corresponding structure which is bound to an Int or Word structure of the appropriate signedness and size. The extra binding of "type t = int" or "type t = word" ensures that the Basis Library may refer to C_TYPE.t, rather than C_TYPE.int or C_TYPE.word, for types whose signedness isn't specified by the standard. (For example, uid_t and gid_t are only required to be integral types; in glibc, they happen to be unsigned.) When elaborating the MLB file that implements the Basis Library, we include /config/c/$(TARGET_ARCH)-$(TARGET_OS)/c-types.sml multiple times, to rebind the C_TYPE structures to successively more complete implementations of the ML structures. (For example, we need C_MPLimb to implement IntInf, but we need IntInf to implement Word32.toLargeInt. Hence, we first bind C_MPLimb to a minimal, primitive structure, which provides enough to implement a little bit of IntInf, which in turn provides enough to implement Word32.toLargeInt, which we then rebind to C_MPLimb.) In a similar manner, we successively bind the default Int structure via: /config/default/$(DEFAULT_INT) where the $(DEFAULT_INT) path variable denotes a file that looks something like: structure Int = Int32 type int = Int.int functor Int_ChooseInt (A: CHOOSE_INT_ARG) : sig val f : Int.int A.t end = ChooseInt_Int32 (A) The 'Choose' functors are the mechanism by which we ensure that the majority of the Basis Library implemenation may be shared, while remaining "parametric" in the primitive C types and the default ML types. Consider, for example, the INTEGER signature: signature INTEGER = sig type int val fromInt: Int.int -> int val toInt: int -> Int.int ... end How may we efficiently implement the Int8, Int16, Int32, and Int64 structures, when the bindings for Int.{from,to}Int must be different for the different choices of Int.int? The solution adopted is to ensure that each "pre-implementation" of Int knows how to convert to and from each possible choice of Int.int. That is, we have signature PRE_INTEGER = sig type int val fromInt8: Primitive.Int8.int -> int val fromInt16: Primitive.Int16.int -> int val fromInt32: Primitive.Int32.int -> int val fromInt64: Primitive.Int64.int -> int val fromIntInf: Primitive.IntInf.int -> int val toInt8: int -> Primitive.Int8.int val toInt16: int -> Primitive.Int16.int val toInt32: int -> Primitive.Int32.int val toInt64: int -> Primitive.Int64.int val toIntInf: int -> Primitive.IntInf.int ... end We use a functor to convert each PRE_INTEGER to an INTEGER; within this functor, we use the Int_ChooseInt functor to select the appropriate conversion: functor Int (structure I : PRE_INTEGER) : INTEGER = struct type int = I.int local structure S = Int_ChooseInt (type 'a = 'a -> int val fInt8 = I.fromInt8 val fInt16 = I.fromInt16 val fInt32 = I.fromInt32 val fInt64 = I.fromInt64 val fIntInf = I.fromIntInf) in val fromInt = S.f end local structure S = Int_ChooseInt (type 'a = int -> 'a val fInt8 = I.toInt8 val fInt16 = I.toInt16 val fInt32 = I.toInt32 val fInt64 = I.toInt64 val fIntInf = I.toIntInf) in val toInt = S.f end ... end The implementation of the 'Choose' functors is the obvious one: signature CHOOSE_INT_ARG = sig type 'a t val fInt8: Int8.int t val fInt16: Int16.int t val fInt32: Int32.int t val fInt64: Int64.int t val fIntInf: IntInf.int t end functor ChooseInt_Int8 (A : CHOOSE_INT_ARG) : sig val f : Int8.int A.t end = struct val f = A.fInt8 end functor ChooseInt_Int16 (A : CHOOSE_INT_ARG) : sig val f : Int16.int A.t end = struct val f = A.fInt16 end functor ChooseInt_Int32 (A : CHOOSE_INT_ARG) : sig val f : Int32.int A.t end = struct val f = A.fInt32 end functor ChooseInt_Int64 (A : CHOOSE_INT_ARG) : sig val f : Int64.int A.t end = struct val f = A.fInt64 end functor ChooseInt_IntInf (A : CHOOSE_INT_ARG) : sig val f : IntInf.int A.t end = struct val f = A.fIntInf end As a convenience mechanism, the $(DEFAULT_CHAR), $(DEFAULT_INT), $(DEFAULT_REAL), and $(DEFAULT_WORD) path variables are set by the compiler, and may be controlled by a compiler flag: -default-type type Specify the default binding for a primitive type. For example, '-default-type word64' causes the top-level type word and the top-level structure Word in the Basis Library to be equal to Word64.word and Word64:WORD, respectively. Similarly, '-default-type intinf' causes the top-level type int and the top-level structure Int in the Basis Library to be equal to IntInf.int and IntInf:INTEGER, respectively. As should be evident from the above, we only support power-of-two sized defaults. Also, the Basis Library specification doesn't allow Char.char to be larger than 8bits, so '-default-type char8' is the only option allowed for char. While '-default-int int8' is allowed, it probably isn't a good idea to set the default integer and word sizes to less than 32-bits, but it ought to be useful to set integers to IntInf.int. Platform Porters/Maintainers: Before merging the runtime and Basis Library changes in to HEAD, we would like to ensure that things are too broken on other platforms; I only have easy access to x86-linux and amd64-linux. It would be very helpful if individuals on other platforms (BSD and Darwin and Solaris particularly) could checkout the x86_64 branch and try to compile the runtime: make runtime I'm specifically interested in the files c-types.h and c-types.sml (automatically copied to basis-library/config/c/$(TARGET_ARCH)-$(TARGET_OS)/), where the sizes and signedness of the C typedefs might be different from x86-linux. Second, I'm interested in any constants that aren't present on different platforms. I've been following the Single UNIX Specification (as a superset of Posix, XOpen, and other standards). I'm guessing that we'll have to drop a few more things to get to the intersection of our platforms. Finally, the platform/* specific stuff will need to be ported. Most of that should be straightforward, following what I've done to linux; essentially, changed some naming schemes, discharge all the gcc warnings, etc. Cygwin and MinGW will be the biggest challenges. mlton-20100608/doc/x86_64-port-notes/TODO0000644000076600000240000000147111404435632016067 0ustar mtfstaff(* drop ML 'bool' from FFI and add C 'bool' *) http://mlton.org/pipermail/mlton/2006-June/028927.html + http://mlton.org/pipermail/mlton/2006-June/028940.html + Revision 4658 -- convert 'int' to 'bool' by comparision with zero -- revert when dropping 'bool' from FFI; comparision with zero will happen on the ML side. (* Add basis-ffi.h to SVN; create .PHONY target to regenerate. *) http://mlton.org/pipermail/mlton/2006-June/028946.html + http://mlton.org/pipermail/mlton/2006-June/028947.html (* auto-gen GC specific runtime imports *) http://mlton.org/pipermail/mlton/2006-July/028975.html Another minor thing I think we should do: * rename arch amd64 to x86_64, to be consistent with gcc target * Why does hash-table use malloc/free while generational maps use mmap/munmap? mlton-20100608/ide/0000755000076600000240000000000011404470406012320 5ustar mtfstaffmlton-20100608/ide/emacs/0000755000076600000240000000000011404470406013410 5ustar mtfstaffmlton-20100608/ide/emacs/bg-build-mode.el0000644000076600000240000007041211404435631016346 0ustar mtfstaff;; Copyright (C) 2007-2008 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'compile) (require 'bg-build-util) (if (string-match "XEmacs" emacs-version) (require 'overlay)) ;; This is a minor mode for ``handsfree'' background batch building. See ;; http://mlton.org/EmacsBgBuildMode for further information. ;; XXX: Cleanup. ;; XXX: Combinators for making common project configurations: ;; - E.g. grep for saved files from given file ;; XXX: Locate project file(s) automatically ;; XXX: Context menu to the mode line indicator ;; XXX: `mode-line-format' (XEmacs 21.4) support ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Prelude (defvar bg-build-load-time t) (defun bg-build-set-custom-and-update (sym val) (custom-set-default sym val) (unless bg-build-load-time (bg-build-update))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Customization (defgroup bg-build nil "A minor mode for ``handsfree'' background batch builds." :group 'compilation) (defcustom bg-build-action-on-failure (function first-error) "Optional action to perform when build fails." :type `(choice (const :tag "None" ,(function (lambda () nil))) (function :tag "Action")) :group 'bg-build) (defcustom bg-build-action-on-messages (function first-error) "Optional action to perform when build does not fail, but produces messages (typically warnings)." :type `(choice (const :tag "None" ,(function (lambda () nil))) (function :tag "Action")) :group 'bg-build) (defcustom bg-build-delay 1.0 "Idle time in seconds to delay before automatically starting a build after a save or nil if you wish to disable automatic builds." :type '(choice (const :tag "disable" nil) (number :tag "seconds")) :group 'bg-build) (defcustom bg-build-key-bindings '() "Key bindings for the bg-build mode. The key specifications must be in a format accepted by the function `define-key'. Hint: You might want to type `M-x describe-function bg-build ' to see the available commands." :type '(repeat (cons :tag "Key Binding" (string :tag "Key") (function :tag "Command"))) :set (function bg-build-set-custom-and-update) :group 'bg-build) (defcustom bg-build-highlighting-overlay-priority 500 "Priority of highlighting overlays." :type 'integer :group 'bg-build) (defcustom bg-build-max-live-builds 1 "Maximum number of live build processes to run concurrently or nil for unlimited." :type '(choice (const :tag "Unlimited" nil) (number :tag "Number")) :group 'bg-build) (defface bg-build-message-sexp-face '((((class color)) (:background "orange")) (t (:background "gray"))) "Face for highlighting sexps that are referred to in messages." :group 'faces :group 'bg-build) (defcustom bg-build-message-highlighting '(sexp) "How to highlight source locations corresponding to messages. Unselect all to disable highlighting." :type '(set (const :tag "Sexp" sexp)) :group 'bg-build) (defcustom bg-build-notify '(messages failure) "When to notify about completed builds." :type '(set (const :tag "Success" success) (const :tag "Messages" messages) (const :tag "Failure" failure)) :group 'bg-build) (defcustom bg-build-projects-auto-load nil "Automatic loading of `bg-build-projects-recent' at startup." :type '(choice (const :tag "Disabled" nil) (const :tag "Enabled" t)) :group 'bg-build) (defcustom bg-build-projects-recent '() "Automatically updated list of BGB files currently or previously loaded. This customization variable is not usually manipulated directly by the user." :type '(repeat (file :tag "BGB file" :must-match t)) :group 'bg-build) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Project Object (defun* bg-build-prj (file &key name build? shell) "Creates a project object for bg-build." (list (cons 'name (cond ((functionp name) name) ((stringp name) (bg-build-const name)) (t (bg-build-const (file-name-nondirectory file))))) (cons 'build? (cond ((functionp build?) build?) (t (bg-build-const t)))) (cons 'shell (cond ((functionp shell) shell) ((consp shell) (bg-build-const shell)) ((stringp shell) (bg-build-const (split-string shell "[ \n\t]+"))) (t (compat-error "Shell command required!")))) (cons 'attr (file-attributes file)))) (defun bg-build-call-prj (project fun &rest args) (let* ((file (car project)) (directory (file-name-directory file))) (with-temp-buffer (setq default-directory directory) (apply (bg-build-assoc-cdr fun project) args)))) (defun bg-build-prj-name (project) (bg-build-call-prj project 'name)) (defun bg-build-prj-build? (project saved-files) (bg-build-call-prj project 'build? saved-files)) (defun bg-build-prj-shell (project) (bg-build-call-prj project 'shell)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Active Projects (defvar bg-build-projects nil) (defun bg-build-set-projects (projects &optional dont-save) (setq bg-build-projects projects) (when (and (not dont-save) bg-build-projects-auto-load) (customize-save-variable 'bg-build-projects-recent (mapcar (function car) projects)))) (defvar bg-build-add-project-history nil) (add-to-list 'auto-mode-alist '("\\.bgb$" . emacs-lisp-mode)) (defun bg-build-add-project (&optional file dont-save) "Adds a project file to bg-build minor mode. This basically reads and evaluates the first Emacs Lisp expression from specified file. The expression should evaluate to a bg-build project object." (interactive) (cond ((not file) (bg-build-add-project (compat-read-file-name "Specify bg-build -file: " nil nil t nil 'bg-build-add-project-history) dont-save)) ((not (and (file-readable-p file) (file-regular-p file))) (compat-error "Specified file is not a regular readable file")) (t (let* ((file (compat-abbreviate-file-name (file-truename file))) (directory (file-name-directory file)) (data (with-temp-buffer (buffer-disable-undo) (insert-file-contents file) (setq default-directory directory) (goto-char (point-min)) (eval `(labels ((bg-build (&rest args) (apply (function bg-build-prj) ,file args))) ,(read (current-buffer))))))) (bg-build-set-projects (bg-build-replace-in-assoc bg-build-projects file data) dont-save)) (bg-build-status-update)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Running Builds (defvar bg-build-finished-builds nil) (defvar bg-build-live-builds nil) (defun bg-build-interrupt-build (project) (let* ((file (car project)) (proc (bg-build-assoc-cdr file bg-build-live-builds))) (cond ((and proc (compat-process-live-p proc)) ;; Ok. We interrupt the build. (interrupt-process proc)) (proc ;; Hmm... Shouldn't normally happen. The sentinel is supposed ;; to remove the build from the live list, so probably something ;; unexpected occurred in the sentinel. (setq bg-build-live-builds (bg-build-remove-from-assoc bg-build-live-builds file)))) (bg-build-check-build-queue))) (defvar bg-build-messages nil) (defun bg-build-parse-messages () (let ((original-display-message (when (fboundp 'display-message) (symbol-function 'display-message)))) (when (fboundp 'display-message) (fset 'display-message (function (lambda (label &rest args) (unless (eq label 'progress) (apply original-display-message label args)))))) (unwind-protect (compat-compilation-parse-errors) (when (fboundp 'display-message) (fset 'display-message original-display-message))))) ;; XXX: The following advice depends on the internals of the compilation mode. (defadvice next-error (after bg-build-next-error activate) (with-current-buffer compilation-last-buffer (bg-build-highlight-messages))) (defadvice compile-goto-error (after bg-build-compile-goto-error activate) (with-current-buffer compilation-last-buffer (bg-build-highlight-messages))) (defvar bg-build-highlighting-overlays nil) (defun bg-build-parse-message (message) (cond ((consp message) (let ((message (cdr message))) (cond ((markerp message) (let* ((buffer (marker-buffer message)) (file (buffer-file-name buffer)) (point (marker-position message)) (pos (bg-build-point-to-pos point))) (list (cons file pos)))) ((consp message) (list (cons (caar message) (cons (cadr message) (1- (or (caddr message) 1))))))))) ((vectorp message) (list (cons (aref message 0) (cons (aref message 1) (aref message 2))))))) (defun bg-build-delete-highlighting-overlays () (mapc (function (lambda (maybe-overlay) (when (overlayp maybe-overlay) (delete-overlay maybe-overlay)))) bg-build-highlighting-overlays) (setq bg-build-highlighting-overlays nil)) (defun bg-build-highlight-messages () (when (and bg-build-messages bg-build-message-highlighting) (let ((file-to-buffer (bg-build-make-hash-table))) (mapc (function (lambda (buffer) (puthash (buffer-file-name buffer) buffer file-to-buffer))) (buffer-list)) (setq bg-build-highlighting-overlays (mapcar (function (lambda (info-or-overlay) (if (overlayp info-or-overlay) info-or-overlay (let* ((info info-or-overlay) (file (car info)) (pos (cdr info)) (buffer (gethash file file-to-buffer))) (if (not buffer) info-or-overlay (with-current-buffer buffer (let* ((begin (bg-build-pos-to-point pos)) (beyond (save-excursion (goto-char begin) (condition-case () (sml-user-forward-sexp) ;; XXX (error (condition-case () (forward-sexp) (error (condition-case () (forward-word 1) (error )))))) (point))) (overlay (make-overlay begin beyond))) (overlay-put overlay 'priority bg-build-highlighting-overlay-priority) (overlay-put overlay 'face 'bg-build-message-sexp-face) overlay))))))) bg-build-highlighting-overlays))))) (defun bg-build-process-sentinel (project) (lexical-let ((project project)) (lambda (process event) (let ((event (upcase event)) (file (car project)) (buffer (process-buffer process))) (when (buffer-live-p buffer) (with-current-buffer buffer (compilation-mode) (compat-add-local-hook 'kill-buffer-hook (bg-build-kill-buffer-hook project)) (setq buffer-read-only nil) (let ((point (point))) (goto-char (point-max)) (insert "\n" event) (goto-char point)) (setq buffer-read-only t) (let ((previous (assoc file bg-build-finished-builds))) (when previous (kill-buffer (cdr previous)))) (push (cons file buffer) bg-build-finished-builds) (bg-build-parse-messages) (set (make-local-variable 'bg-build-messages) (or (and (boundp 'compilation-locs) (hash-table-p compilation-locs) (let ((entries nil)) (maphash (function (lambda (key value) (let* ((file (file-truename (caar value))) (lines (cddr value))) (mapc (function (lambda (line) (let ((locs (cdr line))) (mapc (function (lambda (loc) (push (vector file (or (cadr loc) 0) (or (car loc) 0)) entries))) locs)))) lines)))) compilation-locs) entries)) (and (consp compilation-error-list) compilation-error-list))) (set (make-local-variable 'bg-build-highlighting-overlays) (apply (function append) (mapcar (function bg-build-parse-message) bg-build-messages))))) (setq bg-build-live-builds (bg-build-remove-from-assoc bg-build-live-builds file)) (bg-build-check-build-queue) (when (buffer-live-p buffer) (with-current-buffer buffer (bg-build-highlight-messages))) (cond ((string-match "EXITED ABNORMALLY WITH CODE \\([^\n]+\\)\n" event) (with-current-buffer buffer (condition-case () (funcall bg-build-action-on-failure) (error ))) (when (memq 'failure bg-build-notify) (message "FAILED, %d MESSAGE(S): %s" (with-current-buffer buffer (length bg-build-messages)) (bg-build-prj-name project)))) ((and (when (buffer-live-p buffer) (with-current-buffer buffer bg-build-messages)) (memq 'messages bg-build-notify) (string-match "FINISHED\n" event)) (with-current-buffer buffer (funcall bg-build-action-on-messages)) (message "%d MESSAGE(S): %s" (with-current-buffer buffer (length bg-build-messages)) (bg-build-prj-name project))) ((and (memq 'success bg-build-notify) (string-match "FINISHED\n" event)) (message "SUCCEEDED: %s" (bg-build-prj-name project)))))))) (defun bg-build-kill-buffer-hook (project) (lexical-let ((project project)) (lambda () (let ((file (car project))) (setq bg-build-finished-builds (bg-build-remove-from-assoc bg-build-finished-builds file))) (bg-build-delete-highlighting-overlays) (bg-build-status-update)))) (defvar bg-build-counter 0) (defun bg-build-start-build (project) (setq bg-build-counter (1+ bg-build-counter)) (let* ((file (car project)) (directory (file-name-directory file)) (name (format "*%s (bg-build: %d)*" (bg-build-prj-name project) bg-build-counter)) (shell (bg-build-prj-shell project))) (when (and name shell) (let* ((buffer (generate-new-buffer name)) (process (with-current-buffer buffer (buffer-disable-undo) (compat-add-local-hook 'kill-buffer-hook (bg-build-kill-buffer-hook project)) (insert "Compiling \"" file "\":\n\n") (setq buffer-read-only t) (setq default-directory directory) (apply (function start-process-shell-command) name buffer shell)))) (set-process-sentinel process (bg-build-process-sentinel project)) (push (cons file process) bg-build-live-builds))))) (defvar bg-build-build-queue nil) (defun bg-build-check-build-queue () (bg-build-status-update) (run-with-idle-timer 0.01 nil (function (lambda () (when (and bg-build-build-queue (or (not bg-build-max-live-builds) (< (length bg-build-live-builds) bg-build-max-live-builds))) (bg-build-start-build (car (last bg-build-build-queue))) (setq bg-build-build-queue (butlast bg-build-build-queue)) (bg-build-check-build-queue)))))) (defun bg-build-build-project (project) (setq bg-build-build-queue (bg-build-cons-once project bg-build-build-queue)) (bg-build-interrupt-build project)) (defun bg-build-switch-to-messages (&optional other-window) "Switches to the latest finished build buffer with messages." (interactive "P") (let ((builds bg-build-finished-builds)) (while (and builds (not (with-current-buffer (cdar builds) bg-build-messages))) (pop builds)) (if builds (let ((buffer (cdar builds))) (if other-window (switch-to-buffer-other-window buffer) (switch-to-buffer buffer))) (message "No messages")))) (defun bg-build-switch-to-live (&optional other-window) "Switches to the latest live build buffer." (interactive "P") (if bg-build-live-builds (let ((buffer (process-buffer (cdar bg-build-live-builds)))) (if other-window (switch-to-buffer-other-window buffer) (switch-to-buffer buffer))) (message "No live builds"))) (defun bg-build-switch-to-finished (&optional other-window) "Switches to the latest finished build buffer." (interactive "P") (if bg-build-finished-builds (let ((buffer (cdar bg-build-finished-builds))) (if other-window (switch-to-buffer-other-window buffer) (switch-to-buffer buffer))) (message "No finished builds"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Automatic Build Triggering (defvar bg-build-saved-files nil) (defun bg-build-files-saved-timeout () (mapc (function (lambda (project) (let ((file (car project)) (data (cdr project))) (when (bg-build-attr-newer? (file-attributes file) (bg-build-assoc-cdr 'attr data)) (bg-build-add-project file t))))) bg-build-projects) (let ((saved-files bg-build-saved-files)) (setq bg-build-saved-files nil) (mapc (function (lambda (project) (when (bg-build-prj-build? project saved-files) (bg-build-build-project project)))) bg-build-projects))) (defvar bg-build-timer nil) (defun bg-build-delete-timer () (when bg-build-timer (compat-delete-timer bg-build-timer) (setq bg-build-timer nil))) (defun bg-build-create-timer () (bg-build-delete-timer) (when bg-build-delay (setq bg-build-timer (run-with-idle-timer bg-build-delay nil (function bg-build-files-saved-timeout))))) (defun bg-build-after-save-hook () (setq bg-build-saved-files (bg-build-cons-once (compat-abbreviate-file-name (file-truename (buffer-file-name))) bg-build-saved-files)) (bg-build-create-timer)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Status Mode (defconst bg-build-status-buffer-name "<:Bg-Build Status:>") (defconst bg-build-status-mode-map (let ((result (make-sparse-keymap))) (mapc (function (lambda (key-command) (define-key result (read (car key-command)) (cdr key-command)))) `(("[(b)]" . ,(function bury-buffer)) ("[(q)]" . ,(function bg-build-kill-current-buffer)) ("[(a)]" . ,(function bg-build-add-project)) ("[(r)]" . ,(function bg-build-status-rem-project)) ("[(p)]" . ,(function bg-build-status-visit-project-file)) ("[(f)]" . ,(function bg-build-status-visit-finished-build)) ("[(l)]" . ,(function bg-build-status-visit-live-build)) ("[(return)]" . ,(function bg-build-status-start-build)))) result)) (define-derived-mode bg-build-status-mode fundamental-mode "Bg-Build-Status" "Major mode for browsing bg-build related data." :group 'bg-build-status) (defun bg-build-status () "Show a buffer with bg-build mode related data." (interactive) (let ((buffer (get-buffer-create bg-build-status-buffer-name))) (with-current-buffer buffer (buffer-disable-undo) (setq buffer-read-only t) (bg-build-status-mode)) (switch-to-buffer buffer)) (bg-build-status-update)) (defvar bg-build-status "" "Mode line status indicator for BGB mode") (defun bg-build-status-update () (let ((buffer (get-buffer bg-build-status-buffer-name))) (when buffer (with-current-buffer buffer (let ((point (point))) (setq buffer-read-only nil) (goto-char 1) (delete-char (buffer-size)) (insert "Status | Project -------+------------------------------------------------------------------\n") (mapc (function (lambda (project) (let ((file (car project))) (insert (let ((n (length (member project bg-build-build-queue)))) (if (zerop n) " " (format "%2d" n))) (if (assoc file bg-build-live-builds) "L" " ") (let ((buffer (bg-build-assoc-cdr file bg-build-finished-builds))) (cond ((and buffer (with-current-buffer buffer bg-build-messages)) "FM") (buffer "F ") (t " "))) " | " (bg-build-prj-name project) " (" file ")" "\n")))) bg-build-projects) (insert "\nTotal of " (number-to-string bg-build-counter) " builds started.\n") (setq buffer-read-only t) (goto-char point))))) (setq bg-build-status (labels ((fmt (label n) (cond ((= n 0) "") ((= n 1) label) (t (format "%s%d" label n))))) (let* ((queued (fmt "Q" (length bg-build-build-queue))) (live (fmt "L" (length bg-build-live-builds))) (messages (let ((n (reduce (function (lambda (n build) (with-current-buffer (cdr build) (+ n (length bg-build-messages))))) bg-build-finished-builds :initial-value 0))) (if (and (= 0 n) bg-build-finished-builds) "F" (fmt "M" n)))) (str (concat "[" queued live messages "] "))) (if (string= str "[] ") "" str))))) (defun bg-build-status-the-project () (let ((idx (- (bg-build-current-line) 3))) (when (and (<= 0 idx) (< idx (length bg-build-projects))) (nth idx bg-build-projects)))) (defun bg-build-status-rem-project () "Removes the project from bg-build." (interactive) (let ((project (bg-build-status-the-project))) (when project (bg-build-set-projects (bg-build-remove-from-assoc bg-build-projects (car project))) (bg-build-status-update)))) (defun bg-build-status-visit-project-file () "Visits the project file of the project." (interactive) (let ((project (bg-build-status-the-project))) (when project (find-file (car project))))) (defun bg-build-status-visit-finished-build () "Visits the buffer of the finished build of the project." (interactive) (let ((project (bg-build-status-the-project))) (when project (let ((build (assoc (car project) bg-build-finished-builds))) (if build (switch-to-buffer (cdr build)) (message "That project has no finished builds.")))))) (defun bg-build-status-visit-live-build () "Visits the buffer of the live build of the project." (interactive) (let ((project (bg-build-status-the-project))) (when project (let ((build (assoc (car project) bg-build-live-builds))) (if build (switch-to-buffer (process-buffer (cdr build))) (message "That project has no live builds.")))))) (defun bg-build-status-start-build () "Starts a new build of the project." (interactive) (let ((project (bg-build-status-the-project))) (when project (bg-build-build-project project)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Mode (defun bg-build-mode-enabled-in-some-buffer () (loop for buffer in (buffer-list) do (if (with-current-buffer buffer bg-build-mode) (return t)))) (defvar bg-build-mode-map (make-sparse-keymap) "Keymap for Background-Build mode. This variable is updated by `bg-build-build-mode-map'.") (defun bg-build-build-mode-map () (let ((result (make-sparse-keymap))) (mapc (function (lambda (key-command) (define-key result (read (car key-command)) (cdr key-command)))) bg-build-key-bindings) (setq bg-build-mode-map result)) (let ((cons (assoc 'bg-build-mode minor-mode-map-alist))) (when cons (setcdr cons bg-build-mode-map)))) (define-minor-mode bg-build-mode "Minor mode for performing builds on the background. \\{bg-build-mode-map} " :group 'bg-build :global t (remove-hook 'after-save-hook (function bg-build-after-save-hook)) (when (boundp 'mode-line-modes) (setq mode-line-modes (remove '(t bg-build-status) mode-line-modes))) (when (bg-build-mode-enabled-in-some-buffer) (add-hook 'after-save-hook (function bg-build-after-save-hook)) (when (boundp 'mode-line-modes) (add-to-list 'mode-line-modes '(t bg-build-status))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Finalization (setq bg-build-load-time nil) (defun bg-build-update () "Update data based on customization variables." (bg-build-build-mode-map)) (bg-build-update) (run-with-idle-timer 1.0 nil (function (lambda () (when bg-build-projects-auto-load (mapc (function (lambda (file) (when (and (file-readable-p file) (file-regular-p file)) (bg-build-add-project file t)))) bg-build-projects-recent))))) (provide 'bg-build-mode) mlton-20100608/ide/emacs/bg-build-util.el0000644000076600000240000000532011404435631016373 0ustar mtfstaff;; Copyright (C) 2007 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'cl) (require 'compat) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Utils (defun bg-build-cons-once (entry list) (cons entry (remove* entry list :test (function equal)))) (defun bg-build-flatmap (fn list) (apply (function append) (mapcar fn list))) (defun bg-build-remove-from-assoc (alist key) (remove* nil alist :test (function (lambda (_ key-value) (equal key (car key-value)))))) (defun bg-build-replace-in-assoc (alist key value) (cons (cons key value) (bg-build-remove-from-assoc alist key))) (defun bg-build-assoc-cdr (key alist) "Same as (cdr (assoc key alist)) except that doesn't attempt to call cdr on nil." (let ((key-value (assoc key alist))) (when key-value (cdr key-value)))) (defun bg-build-const (value) "Returns a function that returns the given value." (lexical-let ((value value)) (lambda (&rest _) value))) (defun bg-build-kill-current-buffer () "Kills the current buffer." (interactive) (kill-buffer (current-buffer))) (defun bg-build-make-hash-table () "Makes a hash table with `equal' semantics." (make-hash-table :test 'equal :size 1)) (defun bg-build-point-at-current-line () "Returns point at the beginning of the current line." (save-excursion (beginning-of-line) (point))) (defun bg-build-current-line () "Returns the current line number counting from 1." (+ 1 (count-lines 1 (bg-build-point-at-current-line)))) (defun bg-build-time-to-double (time) "Converts a time to a double." (+ (* (car time) 65536.0) (cadr time) (if (cddr time) (* (caddr time) 1e-06) 0))) (defun bg-build-attr-newer? (attr1 attr2) "Returns non-nil iff the modification time of `attr1' is later than the modification time of `attr2'. Note that this also returns nil when either one of the modification times is nil." (and attr1 attr2 (> (bg-build-time-to-double (nth 5 attr1)) (bg-build-time-to-double (nth 5 attr2))))) (defun bg-build-pos-to-point (pos) "Returns the value of point in the current buffer at the position given as a (line . col) pair." (save-excursion (goto-line (car pos)) (+ (point) (cdr pos)))) (defun bg-build-point-to-pos (point) "Returns the position as a (line . col) pair corresponding to the specified point in the current buffer." (save-excursion (goto-char point) (beginning-of-line) (let ((line (+ (count-lines 1 (point)) 1)) (col (- point (point)))) (cons line col)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'bg-build-util) mlton-20100608/ide/emacs/bg-job.el0000644000076600000240000000531211404435631015074 0ustar mtfstaff;; Copyright (C) 2007 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'cl) (require 'compat) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Customization (defgroup bg-job nil "The background job module allows emacs to perform time consuming processing jobs in the background while allowing the user to continue editing. See the documentation of the `bg-job-start' function for details.") (defcustom bg-job-period 0.10 "Timer period in seconds for background processing interrupts. Must be positive." :type 'number :group 'bg-job) (defcustom bg-job-cpu-ratio 0.15 "Ratio of CPU time allowed for background processing. Must be positive and less than 1." :type 'number :group 'bg-job) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Background Processor (defun bg-job-start (done? step finalize &rest args) "Starts a background job. The job is considered active as longs as (apply done? args) returns nil. While the job is active, (apply step args) will be called periodically to perform a (supposedly small) computation step. After the job becomes inactive, (apply finalize args) will be called once and the job will be discarded. A job may call `bg-job-start' to start new jobs and multiple background jobs may be active simultaneously." (let ((job (cons args (cons done? (cons step finalize))))) (push job bg-job-queue)) (bg-job-timer-start)) (defun bg-job-done? (job) (apply (cadr job) (car job))) (defun bg-job-step (job) (apply (caddr job) (car job))) (defun bg-job-finalize (job) (apply (cdddr job) (car job))) (defvar bg-job-queue nil) (defvar bg-job-timer nil) (defun bg-job-timer-start () (unless bg-job-timer (setq bg-job-timer (run-with-timer bg-job-period bg-job-period (function bg-job-quantum))))) (defun bg-job-timer-stop () (when bg-job-timer (compat-delete-timer bg-job-timer) (setq bg-job-timer nil))) (defun bg-job-quantum () (let ((end-time (+ (bg-job-time-to-double (current-time)) (* bg-job-period bg-job-cpu-ratio)))) (while (and (< (bg-job-time-to-double (current-time)) end-time) bg-job-queue) (let ((job (pop bg-job-queue))) (if (bg-job-done? job) (bg-job-finalize job) (bg-job-step job) (setq bg-job-queue (nconc bg-job-queue (list job))))))) (unless bg-job-queue (bg-job-timer-stop))) (defun bg-job-time-to-double (time) (+ (* (car time) 65536.0) (cadr time) (* (caddr time) 1e-06))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'bg-job) mlton-20100608/ide/emacs/compat.el0000644000076600000240000000375411404435631015227 0ustar mtfstaff;; Copyright (C) 2007-2008 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Gnu Emacs / XEmacs compatibility workarounds (if (string-match "XEmacs" emacs-version) (defun compat-replace-regexp-in-string (str regexp rep) (replace-in-string str regexp rep t)) (defun compat-replace-regexp-in-string (str regexp rep) (replace-regexp-in-string regexp rep str t t))) (if (string-match "XEmacs" emacs-version) (defun compat-error (str &rest objs) (error 'error (concat "Error: " (apply (function format) str objs) "."))) (defalias 'compat-error (function error))) (if (string-match "XEmacs" emacs-version) (defalias 'compat-add-local-hook (function add-local-hook)) (defun compat-add-local-hook (hook fn) (add-hook hook fn nil t))) (if (string-match "XEmacs" emacs-version) (defun compat-abbreviate-file-name (file) (abbreviate-file-name file t)) (defalias 'compat-abbreviate-file-name (function abbreviate-file-name))) (if (string-match "XEmacs" emacs-version) (defalias 'compat-delete-timer (function delete-itimer)) (defalias 'compat-delete-timer (function cancel-timer))) (if (string-match "XEmacs" emacs-version) (defalias 'compat-read-file-name (function read-file-name)) (defun compat-read-file-name (&optional a b c d e f) (funcall (function read-file-name) a b c d e))) (if (string-match "XEmacs" emacs-version) (defalias 'compat-process-live-p (function process-live-p)) (defun compat-process-live-p (process) (case (process-status process) ((run stop) t)))) (if (string-match "XEmacs" emacs-version) (defun compat-compilation-parse-errors () (funcall compilation-parse-errors-function nil nil)) (defun compat-compilation-parse-errors () (compilation-compat-parse-errors (point-max)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'compat) mlton-20100608/ide/emacs/def-use-data.el0000644000076600000240000001450211404435631016174 0ustar mtfstaff;; Copyright (C) 2007 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'def-use-sym) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Data records (defalias 'def-use-pos (function cons)) (defalias 'def-use-pos-line (function car)) (defalias 'def-use-pos-col (function cdr)) (defun def-use-pos< (lhs rhs) (or (< (def-use-pos-line lhs) (def-use-pos-line rhs)) (and (equal (def-use-pos-line lhs) (def-use-pos-line rhs)) (< (def-use-pos-col lhs) (def-use-pos-col rhs))))) (defalias 'def-use-ref (function cons)) (defalias 'def-use-ref-src (function car)) (defalias 'def-use-ref-pos (function cdr)) (defun def-use-ref< (lhs rhs) (or (string< (def-use-ref-src lhs) (def-use-ref-src rhs)) (and (equal (def-use-ref-src lhs) (def-use-ref-src rhs)) (def-use-pos< (def-use-ref-pos lhs) (def-use-ref-pos rhs))))) (defun def-use-sym (class msg name ref &optional face) "Symbol constructor." (cons ref (cons name (cons class (cons msg face))))) (defalias 'def-use-sym-face (function cddddr)) (defalias 'def-use-sym-msg (function cadddr)) (defalias 'def-use-sym-class (function caddr)) (defalias 'def-use-sym-name (function cadr)) (defalias 'def-use-sym-ref (function car)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Def-use sources (defun def-use-add-dus (title sym-at-ref sym-to-uses finalize attr &rest args) (push `(,args ,sym-at-ref ,sym-to-uses ,attr ,title . ,finalize) def-use-dus-list) (def-use-show-dus-update)) (defun def-use-rem-dus (dus) (setq def-use-dus-list (remove dus def-use-dus-list)) (def-use-dus-finalize dus) (def-use-show-dus-update)) (defun def-use-dus-sym-at-ref (dus ref) (apply (cadr dus) ref (car dus))) (defun def-use-dus-sym-to-uses (dus sym) (apply (caddr dus) sym (car dus))) (defun def-use-dus-attr (dus) (apply (cadddr dus) (car dus))) (defun def-use-dus-title (dus) (apply (cadddr (cdr dus)) (car dus))) (defun def-use-dus-finalize (dus) (apply (cddddr (cdr dus)) (car dus))) (defvar def-use-dus-list nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Def-Use Sources -mode (defconst def-use-show-dus-buffer-name "<:Def-Use Sources:>") (defconst def-use-show-dus-mode-map (let ((result (make-sparse-keymap))) (mapc (function (lambda (key-command) (define-key result (read (car key-command)) (cdr key-command)))) `(("[(q)]" . ,(function def-use-kill-current-buffer)) ("[(k)]" . ,(function def-use-show-dus-del)))) result)) (define-derived-mode def-use-show-dus-mode fundamental-mode "Def-Use-DUS" "Major mode for browsing def-use sources." :group 'def-use-dus) (defun def-use-show-dus () "Show a list of def-use sources." (interactive) (let ((buffer (get-buffer-create def-use-show-dus-buffer-name))) (with-current-buffer buffer (buffer-disable-undo) (setq buffer-read-only t) (def-use-show-dus-mode)) (switch-to-buffer buffer)) (def-use-show-dus-update)) (defun def-use-show-dus-update () (let ((buffer (get-buffer def-use-show-dus-buffer-name))) (when buffer (with-current-buffer buffer (let ((point (point))) (setq buffer-read-only nil) (goto-char 1) (delete-char (buffer-size)) (insert "Def-Use Sources\n" "\n") (mapc (function (lambda (dus) (insert (def-use-dus-title dus) "\n"))) def-use-dus-list) (setq buffer-read-only t) (goto-char point)))))) (defun def-use-show-dus-del () "Kill the def-use source on the current line." (interactive) (let ((idx (- (def-use-current-line) 3))) (when (and (<= 0 idx) (< idx (length def-use-dus-list))) (def-use-rem-dus (nth idx def-use-dus-list))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Queries (defun def-use-attrs () (sort (mapcar (function def-use-dus-attr) def-use-dus-list) (function def-use-attr-newer?))) (defun def-use-query (fn) "Queries the def-use -sources with the given function and moves the satisfied dus to the front." (let ((prev nil) (work def-use-dus-list) (result nil)) (while (and work (not (setq result (funcall fn (car work))))) (setq prev work) (setq work (cdr work))) (when (and prev work) (setcdr prev (cdr work)) (setcdr work def-use-dus-list) (setq def-use-dus-list work) (def-use-show-dus-update)) result)) (defun def-use-sym-at-ref (ref &optional no-apology) (when ref (let ((sym (def-use-query (function (lambda (dus) (def-use-dus-sym-at-ref dus ref))))) (name (def-use-extract-sym-name-at-ref ref))) (if (and sym name (string= (def-use-sym-name sym) name)) sym (unless no-apology (cond ((not name) (message "Point does not appear to be on a symbol.")) ((and sym (not (string= (def-use-sym-name sym) name))) (message "Symbol at point, %s, does not match, %s, in info. Check mode." name (def-use-sym-name sym))) (t (let* ((attrs (def-use-attrs)) (file (def-use-ref-src ref)) (attr (file-attributes file)) (buffer (def-use-find-buffer-visiting-file file))) (message "Sorry, no valid info on the symbol: %s. Possible reason: %s." name (cond ((not attrs) "There are no def-use sources") ((def-use-attr-newer? attr (car attrs)) "The file is newer than any def-use source") ((buffer-modified-p buffer) "The buffer has been modified") (t "The symbol may not be in any def-use source"))))))) nil)))) (defun def-use-sym-to-uses (sym) (when sym (def-use-query (function (lambda (dus) (def-use-dus-sym-to-uses dus sym)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'def-use-data) mlton-20100608/ide/emacs/def-use-mode.el0000644000076600000240000004243611404435631016216 0ustar mtfstaff;; Copyright (C) 2007 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. ;; This is a minor mode to support precisely identified definitions and ;; uses. See http://mlton.org/EmacsDefUseMode for further information. ;; XXX def-use-apropos ;; XXX mode specific on-off switching ;; XXX rename-variable (require 'def-use-data) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Prelude (defvar def-use-load-time t) (defun def-use-set-custom-and-update (sym val) (custom-set-default sym val) (unless def-use-load-time (def-use-update))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Customization (defgroup def-use nil "Minor mode to support precisely identified definitions and uses." :group 'matching) (defface def-use-def-face '((((class color)) (:background "darkseagreen3")) (t (:background "gray"))) "Face for highlighting definitions." :group 'faces :group 'def-use) (defface def-use-unused-def-face '((((class color)) (:background "pink")) (t (:background "gray"))) "Face for highlighting definitions that have no uses." :group 'faces :group 'def-use) (defface def-use-use-face '((((class color)) (:background "paleturquoise3")) (t (:background "gray"))) "Face for highlighting uses." :group 'faces :group 'def-use) (defface def-use-mark-face '((((class color)) (:background "orchid1")) (t (:background "gray"))) "Face for marking definitions and uses." :group 'faces :group 'def-use) (defface def-use-view-face '((((class color)) (:background "chocolate1")) (t (:background "gray"))) "Face for marking the definition or use currently being viewed." :group 'faces :group 'def-use) (defcustom def-use-delay 0.125 "Idle time in seconds to delay before updating highlighting or nil if you wish to disable highlighting. Note that because highlighting runs on an idle timer, it may take a while before highlighting is first applied after it has been enabled by changing this customization variable. " :type '(choice (const :tag "disable" nil) (number :tag "seconds")) :set (function def-use-set-custom-and-update) :group 'def-use) (defcustom def-use-priority 1000 "Priority of highlighting overlays." :type 'integer :group 'def-use) (defcustom def-use-marker-ring-length 16 "*Length of marker ring `def-use-marker-ring'." :type 'integer :set (function def-use-set-custom-and-update) :group 'def-use) (defcustom def-use-auto-show-symbol-messages t "Whether to show messages attached to symbols implicitly." :type '(choice (const :tag "disable" nil) (const :tag "enable" t)) :group 'def-use) (defcustom def-use-key-bindings '(("[(control c) (control d)]" . def-use-jump-to-def) ("[(control c) (control l)]" . def-use-list-all-refs) ("[(control c) (control m)]" . def-use-pop-ref-mark) ("[(control c) (control n)]" . def-use-jump-to-next) ("[(control c) (control p)]" . def-use-jump-to-prev) ("[(control c) (control s)]" . def-use-show-dus) ("[(control c) (control t)]" . def-use-show-msg) ("[(control c) (control v)]" . def-use-show-info)) "Key bindings for the def-use mode. The key specifications must be in a format accepted by the function `define-key'. Hint: You might want to type `M-x describe-function def-use ' to see the available commands." :type '(repeat (cons :tag "Key Binding" (string :tag "Key") (function :tag "Command"))) :set (function def-use-set-custom-and-update) :group 'def-use) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; High-level symbol lookup (defun def-use-sym-at-point (point &optional no-apology) "Returns symbol information for the symbol at the specified point." (let ((ref (def-use-ref-at-point point))) (when ref (def-use-sym-at-ref ref no-apology)))) (defun def-use-current-sym (&optional no-apology) "Returns symbol information for the symbol at the current point." (def-use-sym-at-point (point) no-apology)) (defun def-use-current-ref () "Returns a reference to the symbol at the current point." (def-use-ref-at-point (point))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Navigation (defvar def-use-marker-ring (make-ring def-use-marker-ring-length) "Ring of markers which are locations from which \\[def-use-jump-to-def], \\[def-use-jump-to-next], or \\[def-use-jump-to-prev] was invoked.") (defun def-use-create-marker-ring () (setq def-use-marker-ring (make-ring def-use-marker-ring-length))) (defun def-use-pop-ref-mark () "Pop back to where \\[def-use-jump-to-def], \\[def-use-jump-to-next], or \\[def-use-jump-to-prev] was last invoked." (interactive) (if (ring-empty-p def-use-marker-ring) (compat-error "No previous jump locations for invocation")) (let ((marker (ring-remove def-use-marker-ring 0))) (switch-to-buffer (or (marker-buffer marker) (compat-error "The marked buffer has been deleted"))) (goto-char (marker-position marker)) (set-marker marker nil nil))) (defun def-use-jump-to-def (&optional other-window) "Jumps to the definition of the symbol under the cursor." (interactive "P") (let ((sym (def-use-current-sym))) (when sym (ring-insert def-use-marker-ring (point-marker)) (def-use-goto-ref (def-use-sym-ref sym) other-window)))) (defun def-use-jump-to-next (&optional other-window reverse) "Jumps to the next use (or def) of the symbol under the cursor." (interactive "P") (let* ((ref (def-use-current-ref)) (sym (def-use-sym-at-ref ref))) (when sym (let* ((refs (def-use-all-refs-sorted sym)) (refs (if reverse (reverse refs) refs)) (refs (append refs refs))) (while (not (equal (pop refs) ref))) (ring-insert def-use-marker-ring (point-marker)) (def-use-goto-ref (car refs) other-window))))) (defun def-use-jump-to-prev (&optional other-window) "Jumps to the prev use (or def) of the symbol under the cursor." (interactive "P") (def-use-jump-to-next other-window t)) (defun def-use-goto-ref (ref &optional other-window) "Finds the referenced source and moves point to the referenced position." (cond ((not (file-readable-p (def-use-ref-src ref))) (compat-error "Referenced file %s can not be read" (def-use-ref-src ref))) (other-window (def-use-find-file (def-use-ref-src ref) t)) ((not (equal (def-use-buffer-file-truename) (def-use-ref-src ref))) (def-use-find-file (def-use-ref-src ref)))) (def-use-goto-pos (def-use-ref-pos ref))) (defun def-use-goto-pos (pos) "Moves point to the specified position." (goto-char (def-use-pos-to-point pos))) (defun def-use-all-refs-sorted (sym) "Returns a sorted list of all references (including definition) to the symbol." (sort (cons (def-use-sym-ref sym) (copy-list (def-use-sym-to-uses sym))) (function def-use-ref<))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; List mode (defconst def-use-ref-regexp "\\([^ ]+\\):\\([0-9]+\\)\\.\\([0-9]+\\)") (defconst def-use-list-mode-map (let ((result (make-sparse-keymap))) (mapc (function (lambda (key-command) (define-key result (read (car key-command)) (cdr key-command)))) `(("[(b)]" . ,(function bury-buffer)) ("[(m)]" . ,(function def-use-list-view-mark-all)) ("[(u)]" . ,(function def-use-list-view-unmark-all)) ("[(q)]" . ,(function def-use-kill-current-buffer)) ("[(return)]" . ,(function def-use-list-view-ref)))) result)) (define-derived-mode def-use-list-mode fundamental-mode "Def-Use-List" "Major mode for browsing def-use lists." :group 'def-use-list) (defvar def-use-list-ref-to-overlay-alist nil) (defvar def-use-list-sym nil) (defun def-use-list-all-refs (&optional reverse) "Lists all references to the symbol under the cursor." (interactive "P") (let* ((ref (def-use-current-ref)) (sym (def-use-sym-at-ref ref))) (when sym (let* ((name (concat "<:" (def-use-format-sym sym) ":>")) (buffer (get-buffer name))) (if buffer (switch-to-buffer-other-window buffer) (setq buffer (get-buffer-create name)) (switch-to-buffer-other-window buffer) (buffer-disable-undo) (def-use-list-mode) (compat-add-local-hook 'kill-buffer-hook (function def-use-list-view-unmark-all)) (set (make-local-variable 'def-use-list-sym) sym) (insert (def-use-format-sym sym) "\n" "\n") (let* ((refs (def-use-all-refs-sorted sym)) (refs (if reverse (reverse refs) refs))) (set (make-local-variable 'def-use-list-ref-to-overlay-alist) (mapcar (function list) refs)) (mapc (function (lambda (ref) (insert (def-use-format-ref ref) "\n"))) refs)) (goto-line 3) (setq buffer-read-only t)))))) (defun def-use-list-view-ref () "Finds references on the current line and shows in another window." (interactive) (beginning-of-line) (let ((b (current-buffer)) (idx (- (def-use-current-line) 3))) (when (and (<= 0 idx) (< idx (length def-use-list-ref-to-overlay-alist))) (forward-line) (def-use-goto-ref (car (nth idx def-use-list-ref-to-overlay-alist)) t) (switch-to-buffer-other-window b)))) (defun def-use-list-view-mark-all () "Visits all the references and marks them." (interactive) (when (and def-use-list-ref-to-overlay-alist def-use-list-sym) (save-window-excursion (let ((length (length (def-use-sym-name def-use-list-sym)))) (mapc (function (lambda (ref-overlay) (unless (cdr ref-overlay) (def-use-goto-ref (car ref-overlay) t) (setcdr ref-overlay (def-use-create-overlay length (def-use-ref-pos (car ref-overlay)) (- def-use-priority 1) 'def-use-mark-face))))) def-use-list-ref-to-overlay-alist))))) (defun def-use-list-view-unmark-all () "Kills all the marks associated with the list view." (interactive) (when def-use-list-ref-to-overlay-alist (mapc (function (lambda (ref-overlay) (when (cdr ref-overlay) (delete-overlay (cdr ref-overlay)) (setcdr ref-overlay nil)))) def-use-list-ref-to-overlay-alist))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Info (defun def-use-show-msg (&optional copy-to-kill-ring) "Shows the message for the symbol under the cursor. With a prefix argument the message is also inserted to the `kill-ring'." (interactive "P") (let ((sym (def-use-current-sym))) (when sym (message "%s" (or (def-use-sym-msg sym) "Sorry, no message attached to the symbol.")) (when (and (def-use-sym-msg sym)) (kill-new (def-use-sym-msg sym)))))) (defun def-use-show-info () "Shows info on the symbol under the cursor." (interactive) (let ((sym (def-use-current-sym))) (when sym (message "%s" (def-use-format-sym sym))))) (defun def-use-format-sym (sym) "Formats a string with some basic info on the symbol." (concat (def-use-format-sym-title sym) ", " (number-to-string (length (def-use-sym-to-uses sym))) " uses, defined at: " (def-use-format-ref (def-use-sym-ref sym)))) (defun def-use-format-sym-title (sym) "Formats a title for the symbol" (concat (def-use-add-face 'font-lock-keyword-face (copy-sequence (def-use-sym-class sym))) " " (def-use-add-face (def-use-sym-face sym) (copy-sequence (def-use-sym-name sym))) (if (def-use-sym-msg sym) (concat " : " (def-use-sym-msg sym)) ""))) (defun def-use-format-ref (ref) "Formats a references." (let ((pos (def-use-ref-pos ref))) (concat (def-use-ref-src ref) ":" (def-use-add-face 'font-lock-constant-face (number-to-string (def-use-pos-line pos))) "." (def-use-add-face 'font-lock-constant-face (number-to-string (def-use-pos-col pos)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Highlighting (defvar def-use-highlighted-sym nil) (defvar def-use-highlighted-buffer-file-truename nil) (defvar def-use-highlighted-overlays nil) (defun def-use-delete-highlighting () (mapc (function delete-overlay) def-use-highlighted-overlays) (setq def-use-highlighted-overlays nil def-use-highlighted-sym nil def-use-highlighted-buffer-file-truename nil)) (defun def-use-highlight-ref (sym ref face-attr) (push (def-use-create-overlay sym ref def-use-priority face-attr) def-use-highlighted-overlays)) (defun def-use-create-overlay (length pos priority face-attr) (let* ((begin (def-use-pos-to-point pos)) (beyond (+ begin length)) (overlay (make-overlay begin beyond))) (overlay-put overlay 'priority priority) (overlay-put overlay 'face face-attr) overlay)) (defun def-use-highlight-sym (sym) "Highlights the specified symbol." (let ((buffer-file-truename (def-use-buffer-file-truename))) (unless (and (equal def-use-highlighted-sym sym) (equal def-use-highlighted-buffer-file-truename buffer-file-truename)) (def-use-delete-highlighting) (when sym (setq def-use-highlighted-sym sym def-use-highlighted-buffer-file-truename buffer-file-truename) (let ((length (length (def-use-sym-name sym))) (file-to-poss (def-use-make-hash-table))) (mapc (function (lambda (ref) (puthash (def-use-ref-src ref) (cons (def-use-ref-pos ref) (gethash (def-use-ref-src ref) file-to-poss)) file-to-poss))) (def-use-sym-to-uses sym)) (mapc (function (lambda (buffer) (set-buffer buffer) (mapc (function (lambda (pos) (def-use-highlight-ref length pos 'def-use-use-face))) (gethash (def-use-buffer-file-truename) file-to-poss)))) (buffer-list)) (let* ((ref (def-use-sym-ref sym)) (buffer (def-use-find-buffer-visiting-file (def-use-ref-src ref)))) (when buffer (set-buffer buffer) (def-use-highlight-ref length (def-use-ref-pos ref) (if (def-use-sym-to-uses sym) 'def-use-def-face 'def-use-unused-def-face))))) (when def-use-auto-show-symbol-messages (let ((msg (def-use-sym-msg sym))) (when msg (message "%s" msg)))))))) (defun def-use-highlight-current () "Highlights the symbol at the point." (interactive) (save-excursion (save-window-excursion (def-use-highlight-sym (def-use-current-sym t))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Highlighting timer (defvar def-use-highlight-timer nil) (defun def-use-delete-highlight-timer () (when def-use-highlight-timer (compat-delete-timer def-use-highlight-timer) (setq def-use-highlight-timer nil))) (defun def-use-create-highlight-timer () (def-use-delete-highlight-timer) (when (and def-use-delay (def-use-mode-enabled-in-some-buffer)) (setq def-use-highlight-timer (run-with-idle-timer def-use-delay t (function def-use-highlight-current))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Mode (defun def-use-mode-enabled-in-some-buffer () (loop for buffer in (buffer-list) do (if (with-current-buffer buffer def-use-mode) (return t)))) (defvar def-use-mode-map (make-sparse-keymap) "Keymap for Def-Use mode. This variable is updated by `def-use-build-mode-map'.") (defun def-use-build-mode-map () (let ((result (make-sparse-keymap))) (mapc (function (lambda (key-command) (define-key result (read (car key-command)) (cdr key-command)))) def-use-key-bindings) (setq def-use-mode-map result)) (let ((cons (assoc 'def-use-mode minor-mode-map-alist))) (when cons (setcdr cons def-use-mode-map)))) (define-minor-mode def-use-mode "Minor mode for highlighting and navigating definitions and uses. \\{def-use-mode-map} " :lighter " DU" :group 'def-use :global t (def-use-delete-highlighting) (def-use-create-highlight-timer)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Finalization (setq def-use-load-time nil) (defun def-use-update () "Update data based on customization variables." (def-use-create-marker-ring) (def-use-create-highlight-timer) (def-use-build-mode-map)) (def-use-update) (provide 'def-use-mode) mlton-20100608/ide/emacs/def-use-sym.el0000644000076600000240000000567611404435631016107 0ustar mtfstaff;; Copyright (C) 2007 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'def-use-util) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Points and Positions (defun def-use-pos-to-point (pos) "Returns the value of point in the current buffer at the position." (save-excursion (def-use-goto-line (def-use-pos-line pos)) (+ (point) (def-use-pos-col pos)))) (defun def-use-point-to-pos (point) "Returns the position corresponding to the specified point in the current buffer." (save-excursion (goto-char point) (beginning-of-line) (let ((line (+ (count-lines 1 (point)) 1)) (col (- point (point)))) (def-use-pos line col)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Basic symbol lookup support (defvar def-use-mode-to-move-to-symbol-start-alist nil "Association list mapping modes to functions that move the point backwards to the start of the symbol at the point.") (defvar def-use-mode-to-move-to-symbol-end-alist nil "Association list mapping modes to functions that move the point to the end of the symbol at the point.") (defun def-use-move-to-symbol-start () (let ((mode-move (assoc major-mode def-use-mode-to-move-to-symbol-start-alist))) (if mode-move (funcall (cdr mode-move)) (skip-syntax-backward "w_" (def-use-point-at-current-line))))) (defun def-use-move-to-symbol-end () (let ((mode-move (assoc major-mode def-use-mode-to-move-to-symbol-end-alist))) (if mode-move (funcall (cdr mode-move)) (skip-syntax-forward "w_" (def-use-point-at-next-line))))) (defun def-use-ref-at-point (point) "Returns a reference for the symbol at the specified point in the current buffer." (let ((src (def-use-buffer-file-truename))) (when src (def-use-ref src (def-use-point-to-pos (save-excursion (goto-char point) (def-use-move-to-symbol-start) (point))))))) (defun def-use-extract-sym-name-at-point (point) "Tries to extracts what looks like the name of the symbol at point. This doesn't really understand the syntax of the language, so the result is only valid when there really is a symbol at the point." (save-excursion (goto-char point) (let* ((start (progn (def-use-move-to-symbol-start) (point))) (end (progn (def-use-move-to-symbol-end) (point)))) (when (and (<= start point) (<= point end) (< start end)) (buffer-substring start end))))) (defun def-use-extract-sym-name-at-ref (ref) "Tries to extract what looks like the name of the symbol at ref." (save-window-excursion (def-use-find-file (def-use-ref-src ref)) (def-use-extract-sym-name-at-point (def-use-pos-to-point (def-use-ref-pos ref))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'def-use-sym) mlton-20100608/ide/emacs/def-use-util.el0000644000076600000240000001320711404435631016241 0ustar mtfstaff;; Copyright (C) 2007 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'cl) (require 'compat) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Utilities ;; In Gnu Emacs, `buffer-file-truename' is abbreviated while in XEmacs it ;; isn't. This isn't in compat.el, because we want to use our cached ;; version of `file-truename', namely `def-use-file-truename'. (defun def-use-buffer-file-truename (&rest buffer) "Returns the true filename of the current buffer." (let ((name (apply (function buffer-file-name) buffer))) (when name (def-use-file-truename name)))) (defvar def-use-file-truename-table (make-hash-table :test 'equal :weakness 'key) "Weak hash table private to `def-use-file-truename'.") (defun def-use-file-truename (file) "Cached version of `file-truename' combined with `abbreviate-file-name'." (def-use-gethash-or-put file (function (lambda () (def-use-intern (def-use-add-face 'font-lock-keyword-face (compat-abbreviate-file-name (file-truename file)))))) def-use-file-truename-table)) (defun def-use-find-buffer-visiting-file (file) "Tries to find a buffer visiting the specified file." (let ((truename (def-use-file-truename file))) (loop for buffer in (buffer-list) do (if (with-current-buffer buffer (string= (def-use-buffer-file-truename) truename)) (return buffer))))) (defun def-use-find-file (file &optional other-window) "Roughly as `find-file' or `find-file-other-window' except that will not open the file a second time if a buffer is editing a file by the same true file name." (let ((buffer (def-use-find-buffer-visiting-file file))) (cond (buffer (let ((window (get-buffer-window buffer))) (cond (other-window (switch-to-buffer-other-window buffer)) (window (set-frame-selected-window nil window)) (t (switch-to-buffer buffer))))) (other-window (find-file-other-window file)) (t (find-file file))))) (defun def-use-point-at-next-line () "Returns point at the beginning of the next line." (save-excursion (end-of-line) (+ 1 (point)))) (defun def-use-point-at-current-line () "Returns point at the beginning of the current line." (save-excursion (beginning-of-line) (point))) (defun def-use-current-line () "Returns the current line number counting from 1." (+ 1 (count-lines 1 (def-use-point-at-current-line)))) (defun def-use-gethash-or-put (key_ mk-value_ table_) (or (gethash key_ table_) (puthash key_ (funcall mk-value_) table_))) (defvar def-use-intern-table (make-hash-table :test 'equal :weakness 'key-and-value) "Weak hash table private to `def-use-intern'.") (defun def-use-intern (value) "Hashes the given value to itself. The assumption is that the value being interned is not going to be mutated." (def-use-gethash-or-put value (function (lambda () value)) def-use-intern-table)) (defun def-use-hash-table-to-assoc-list (hash-table) "Returns an assoc list containing all the keys and values of the hash table." (let ((result nil)) (maphash (function (lambda (key value) (push (cons key value) result))) hash-table) result)) (defun def-use-hash-table-to-key-list (hash-table) "Returns a list of the keys of hash-table." (mapcar (function car) (def-use-hash-table-to-assoc-list hash-table))) (defun def-use-hash-table-to-value-list (hash-table) "Returns a list of the values of the hash-table." (mapcar (function cdr) (def-use-hash-table-to-assoc-list hash-table))) (defun def-use-set-to-list (set) "Returns a list of the keys of the set (identity hash-table)." (def-use-hash-table-to-key-list set)) (defun def-use-make-hash-table () "Makes a hash table with `equal' semantics." (make-hash-table :test 'equal :size 1)) (defun def-use-kill-current-buffer () "Kills the current buffer." (interactive) (kill-buffer (current-buffer))) (defun def-use-add-face (face string) "Adds the face as a property to the entire string and returns the string." (add-text-properties 0 (length string) `(face ,face) string) string) (defun def-use-time-to-double (time) "Converts a time to a double." (+ (* (car time) 65536.0) (cadr time) (if (cddr time) (* (caddr time) 1e-06) 0))) (defun def-use-attr-newer? (attr1 attr2) "Returns non-nil iff the modification time of `attr1' is later than the modification time of `attr2'. Note that this also returns nil when either one of the modification times is nil." (and attr1 attr2 (> (def-use-time-to-double (nth 5 attr1)) (def-use-time-to-double (nth 5 attr2))))) (defun def-use-attr-changed? (attr1 attr2) "Returns non-nil iff the file attributes of `attr1' are different than the file attributes of `attr2'. Note that this also returns nil when either one of the file attributes is nil." (labels ((nequal (i) (not (equal (nth i attr1) (nth i attr2))))) (and attr1 attr2 (or (def-use-attr-newer? attr1 attr2) (nequal 7) ;; size (nequal 6) ;; status change time (nequal 8) ;; file modes (nequal 10) ;; inode )))) (defun def-use-goto-line (line) "Goes to specified line quietly without setting mark. By default, the standard `goto-line' function in latest Gnu Emacs sets the mark displaying the message \"Mark set\"." (save-restriction (widen) (goto-char 1) (forward-line (1- line)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'def-use-util) mlton-20100608/ide/emacs/esml-du-mlton.el0000644000076600000240000003772511404435631016446 0ustar mtfstaff;; Copyright (C) 2007-2008 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'def-use-mode) (require 'bg-job) (require 'esml-util) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Customization (defgroup esml-du nil "MLton def-use info plugin for `def-use-mode'." :group 'sml) (defcustom esml-du-notify 'never "Notify certain events, such as when a def-use -file has been (re)loaded." :type '(choice (const :tag "Never" never) (const :tag "Always" always)) :group 'esml-du) (defcustom esml-du-dufs-auto-load nil "Automatic loading of `esml-du-dufs-recent' at startup." :type '(choice (const :tag "Disabled" nil) (const :tag "Enabled" t)) :group 'esml-du) (defcustom esml-du-dufs-recent '() "Automatically updated list of def-use -files currently or previously loaded. This customization variable is not usually manipulated directly by the user." :type '(repeat (file :tag "Def-Use file" :must-match t)) :group 'esml-du) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Interface (defvar esml-du-mlton-history nil) (defun esml-du-mlton (&optional duf dont-save) "Gets def-use information from a def-use file produced by MLton." (interactive) (cond ((not duf) (esml-du-mlton (compat-read-file-name "Specify def-use -file: " nil nil t nil 'esml-du-mlton-history) dont-save)) ((not (and (file-readable-p duf) (file-regular-p duf))) (compat-error "Specified file is not a regular readable file")) ((run-with-idle-timer 0.5 nil (function (lambda (duf dont-save) (let ((duf (def-use-file-truename duf))) (unless (member duf esml-du-live-dufs) (let ((ctx (esml-du-ctx duf))) (esml-du-load ctx) (esml-du-set-live-dufs (cons duf esml-du-live-dufs) dont-save) (def-use-add-dus (function esml-du-title) (function esml-du-sym-at-ref) (function esml-du-sym-to-uses) (function esml-du-finalize) (function esml-du-ctx-attr) ctx)))))) duf dont-save)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Move to symbol (defun esml-du-character-class (c) (cond ((find c esml-sml-symbolic-chars) 'symbolic) ((and c (<= ?0 c) (<= c ?9)) 'numeric) ((find c esml-sml-alphanumeric-chars) 'alpha))) (defun esml-du-extract-following-symbol (chars) (save-excursion (let ((start (point))) (skip-chars-forward chars) (buffer-substring start (point))))) (defun esml-du-move-to-symbol-start () "Moves to the start of the SML symbol at point. If the point is between two symbols, one symbolic and other alphanumeric (e.g. !x) the symbol following the point is preferred. This ensures that the symbol does not change surprisingly after a jump." (let ((point (point))) (let ((bef (esml-du-character-class (char-before))) (aft (esml-du-character-class (char-after)))) (cond ((and (or (eq bef 'alpha) (eq bef 'numeric)) (eq aft 'symbolic) (find (esml-du-extract-following-symbol esml-sml-symbolic-chars) esml-sml-symbolic-keywords :test 'equal)) (skip-chars-backward esml-sml-alphanumeric-chars)) ((and (eq bef 'symbolic) (or (eq aft 'numeric) (and (eq aft 'alpha) (find (esml-du-extract-following-symbol esml-sml-alphanumeric-chars) esml-sml-alphanumeric-keywords :test 'equal)))) (skip-chars-backward esml-sml-symbolic-chars)) ((and (eq bef 'symbolic) (not (eq aft 'alpha))) (skip-chars-backward esml-sml-symbolic-chars)) ((and (or (eq bef 'alpha) (eq bef 'numeric)) (not (eq aft 'symbolic))) (skip-chars-backward esml-sml-alphanumeric-chars)))) (when (let ((c (char-after))) (and c (<= ?0 c) (<= c ?9))) (search-forward-regexp esml-sml-numeric-literal-regexp point t)))) (loop for mode in esml-sml-modes do (add-to-list 'def-use-mode-to-move-to-symbol-start-alist (cons mode (function esml-du-move-to-symbol-start)))) (defun esml-du-move-to-symbol-end () "Moves to the end of the SML symbol at point assuming that we are at the beginning of the symbol." (let ((limit (def-use-point-at-next-line))) (when (zerop (skip-chars-forward esml-sml-alphanumeric-chars limit)) (skip-chars-forward esml-sml-symbolic-chars limit)))) (loop for mode in esml-sml-modes do (add-to-list 'def-use-mode-to-move-to-symbol-end-alist (cons mode (function esml-du-move-to-symbol-end)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Methods (defun esml-du-title (ctx) (concat (esml-du-ctx-duf ctx) " [loaded " (int-to-string (esml-du-ctx-load-cnt ctx)) " times]")) (defun esml-du-sym-at-ref (ref ctx) (esml-du-reload ctx) (unless (or (let ((buffer (def-use-find-buffer-visiting-file (def-use-ref-src ref)))) (and buffer (buffer-modified-p buffer))) (def-use-attr-newer? (file-attributes (def-use-ref-src ref)) (esml-du-ctx-attr ctx))) (or (gethash ref (esml-du-ctx-ref-to-sym-table ctx)) (and (esml-du-try-to-read-symbol-at-ref ref ctx) (gethash ref (esml-du-ctx-ref-to-sym-table ctx)))))) (defun esml-du-sym-to-uses (sym ctx) (esml-du-reload ctx) (let ((file-to-poss (def-use-make-hash-table))) ;; Process by buffer/file as it avoids repeated work (mapc (function (lambda (ref) (puthash (def-use-ref-src ref) (cons ref (gethash (def-use-ref-src ref) file-to-poss)) file-to-poss))) (gethash sym (esml-du-ctx-sym-to-uses-table ctx))) ;; Remove references to modified buffers (mapc (function (lambda (buffer) (when (buffer-modified-p buffer) (remhash (def-use-buffer-file-truename buffer) file-to-poss)))) (buffer-list)) ;; Remove references to modified files (mapc (function (lambda (file) (when (def-use-attr-newer? (file-attributes file) (esml-du-ctx-attr ctx)) (remhash file file-to-poss)))) (def-use-hash-table-to-key-list file-to-poss)) (apply (function nconc) (def-use-hash-table-to-value-list file-to-poss)))) (defun esml-du-stop-parsing (ctx) (let ((buffer (esml-du-ctx-buf ctx))) (when buffer (kill-buffer buffer)))) (defvar esml-du-live-dufs nil) (defun esml-du-set-live-dufs (dufs &optional dont-save) (setq esml-du-live-dufs dufs) (when (and (not dont-save) esml-du-dufs-auto-load) (customize-save-variable 'esml-du-dufs-recent (copy-list dufs)))) (defun esml-du-finalize (ctx) (esml-du-stop-parsing ctx) (let ((timer (esml-du-ctx-poll-timer ctx))) (when timer (compat-delete-timer timer) (esml-du-ctx-set-poll-timer nil ctx))) (let ((timer (esml-du-ctx-reload-timer ctx))) (when timer (compat-delete-timer timer) (esml-du-ctx-set-reload-timer nil ctx))) (esml-du-set-live-dufs (remove* (esml-du-ctx-duf ctx) esml-du-live-dufs :test (function equal)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Context (defun esml-du-ctx (duf) (vector (def-use-make-hash-table) (def-use-make-hash-table) duf nil nil nil 0 nil nil)) (defun esml-du-ctx-reload-timer (ctx) (aref ctx 7)) (defun esml-du-ctx-load-cnt (ctx) (aref ctx 6)) (defun esml-du-ctx-poll-timer (ctx) (aref ctx 5)) (defun esml-du-ctx-buf (ctx) (aref ctx 4)) (defun esml-du-ctx-attr (ctx) (aref ctx 3)) (defun esml-du-ctx-duf (ctx) (aref ctx 2)) (defun esml-du-ctx-ref-to-sym-table (ctx) (aref ctx 1)) (defun esml-du-ctx-sym-to-uses-table (ctx) (aref ctx 0)) (defun esml-du-ctx-inc-load-cnt (ctx) (aset ctx 6 (1+ (aref ctx 6)))) (defun esml-du-ctx-set-reload-timer (timer ctx) (aset ctx 7 timer)) (defun esml-du-ctx-set-poll-timer (timer ctx) (aset ctx 5 timer)) (defun esml-du-ctx-set-buf (buf ctx) (aset ctx 4 buf)) (defun esml-du-ctx-set-attr (attr ctx) (aset ctx 3 attr)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Parsing (defun esml-du-read (taking skipping) (let ((start (point))) (skip-chars-forward taking) (let ((result (buffer-substring start (point)))) (skip-chars-forward skipping) result))) (defun esml-du-read-opt-str () (when (= (char-after) ?\") (forward-char 1) (esml-du-read "^\"" "\""))) (defconst esml-du-classes ;; XXX Needs customization `((,(def-use-intern "variable") . ,font-lock-variable-name-face) (,(def-use-intern "type") . ,font-lock-variable-name-face) (,(def-use-intern "constructor") . ,font-lock-variable-name-face) (,(def-use-intern "structure") . ,font-lock-variable-name-face) (,(def-use-intern "signature") . ,font-lock-variable-name-face) (,(def-use-intern "functor") . ,font-lock-variable-name-face) (,(def-use-intern "exception") . ,font-lock-variable-name-face))) (defun esml-du-reload (ctx) "Schedules a reload of the def-use file if it has been modified." (let ((attrs (file-attributes (esml-du-ctx-duf ctx)))) (when (def-use-attr-changed? attrs (esml-du-ctx-attr ctx)) (when (esml-du-ctx-reload-timer ctx) (compat-delete-timer (esml-du-ctx-reload-timer ctx))) (esml-du-ctx-set-reload-timer (run-with-idle-timer 0.5 nil (function (lambda (ctx attrs) (if (def-use-attr-changed? (file-attributes (esml-du-ctx-duf ctx)) attrs) (esml-du-reload ctx) (esml-du-ctx-set-reload-timer nil ctx) (esml-du-load ctx)))) ctx attrs) ctx)))) (defun esml-du-try-to-read-symbol-at-ref-once (ref ctx) (when (search-forward (esml-du-ref-to-appx-syntax ref) nil t) (beginning-of-line) (while (= ?\ (char-after)) (forward-line -1)) (esml-du-read-one-symbol ctx))) (defun esml-du-try-to-read-all-symbols-at-ref (ref ctx) (let ((syms nil)) (goto-char 1) (while (let ((sym (esml-du-try-to-read-symbol-at-ref-once ref ctx))) (when sym (push sym syms)))) syms)) (defun esml-du-try-to-read-symbol-at-ref (ref ctx) "Tries to read the symbol at the specified ref from the duf. Returns non-nil if something was actually read." (let ((buffer (esml-du-ctx-buf ctx))) (when buffer (bury-buffer buffer) (with-current-buffer buffer (let ((syms (esml-du-try-to-read-all-symbols-at-ref ref ctx))) (when syms (while syms (let* ((sym (pop syms)) (more-syms (esml-du-try-to-read-all-symbols-at-ref (def-use-sym-ref sym) ctx))) (when more-syms (setq syms (nconc more-syms syms))))) t)))))) (defun esml-du-ref-to-appx-syntax (ref) (let ((pos (def-use-ref-pos ref))) (concat (file-name-nondirectory (def-use-ref-src ref)) " " (int-to-string (def-use-pos-line pos)) "." (int-to-string (1+ (def-use-pos-col pos)))))) (defconst esml-du-highlight-type-map ;; XXX Needs customization `(("\\([a-zA-Z0-9_]+\\)[:]" . ,font-lock-constant-face) ("\\([a-zA-Z0-9_]+\\)\\>\\(?:[^:]\\|$\\)" . ,font-lock-type-face) ("\\(\\\\)" . ,font-lock-keyword-face) (,(concat "\\<\\(" (regexp-opt '("array" "bool" "char" "exn" "int" "list" "option" "order" "real" "ref" "string" "substring" "unit" "vector" "word")) "\\)\\>") . ,font-lock-builtin-face) ("\\('[a-zA-Z0-9_]+\\)" . ,font-lock-variable-name-face))) (defun esml-du-highlight-type (string) (when string (loop for pat-face in esml-du-highlight-type-map do (let ((pat (car pat-face)) (prop `(face ,(cdr pat-face))) (start 0)) (while (string-match pat string start) (add-text-properties (match-beginning 1) (match-end 1) prop string) (setq start (match-end 0)))))) string) (defun esml-du-read-one-symbol (ctx) "Reads one symbol from the current buffer starting at the current point. Returns the symbol read and deletes the read symbol from the buffer." (let* ((start (point)) (ref-to-sym (esml-du-ctx-ref-to-sym-table ctx)) (sym-to-uses (esml-du-ctx-sym-to-uses-table ctx)) (class (def-use-intern (esml-du-read "^ " " "))) (name (def-use-intern (esml-du-read "^ " " "))) (src (def-use-file-truename (esml-du-read "^ " " "))) (line (string-to-int (esml-du-read "^." "."))) (col (1- (string-to-int (esml-du-read "^ \n" " ")))) (msg (esml-du-highlight-type (def-use-intern (esml-du-read-opt-str)))) (pos (def-use-pos line col)) (ref (def-use-ref src pos)) (sym (def-use-sym class msg name ref (cdr (assoc class esml-du-classes)))) (uses nil)) (let ((old-sym (gethash ref ref-to-sym))) (when old-sym (setq sym old-sym)) (puthash ref sym ref-to-sym)) (skip-chars-forward "\n") (while (< 0 (skip-chars-forward " ")) (let* ((src (def-use-file-truename (esml-du-read "^ " " "))) (line (string-to-int (esml-du-read "^." "."))) (col (1- (string-to-int (esml-du-read "^\n" "\n")))) (pos (def-use-pos line col)) (ref (def-use-ref src pos))) (let ((old-sym (gethash ref ref-to-sym))) (when old-sym (let ((old-uses (gethash old-sym sym-to-uses))) (remhash old-sym sym-to-uses) (mapc (function (lambda (ref) (puthash ref sym ref-to-sym))) old-uses) (setq uses (nconc uses old-uses))))) (puthash ref sym ref-to-sym) (push ref uses))) (puthash sym uses sym-to-uses) (setq buffer-read-only nil) (delete-backward-char (- (point) start)) (setq buffer-read-only t) sym)) (defun esml-du-load (ctx) "Loads the def-use file to a buffer for performing queries." (esml-du-ctx-set-attr (file-attributes (esml-du-ctx-duf ctx)) ctx) (if (esml-du-ctx-buf ctx) (with-current-buffer (esml-du-ctx-buf ctx) (goto-char 1) (setq buffer-read-only nil) (delete-char (1- (point-max)))) (esml-du-ctx-set-buf (generate-new-buffer (concat "** " (esml-du-ctx-duf ctx) " **")) ctx) (with-current-buffer (esml-du-ctx-buf ctx) (buffer-disable-undo) (compat-add-local-hook 'kill-buffer-hook (lexical-let ((ctx ctx)) (function (lambda () (esml-du-ctx-set-buf nil ctx))))))) (bury-buffer (esml-du-ctx-buf ctx)) (with-current-buffer (esml-du-ctx-buf ctx) (insert-file-contents (esml-du-ctx-duf ctx)) (setq buffer-read-only t) (goto-char 1)) (clrhash (esml-du-ctx-ref-to-sym-table ctx)) (clrhash (esml-du-ctx-sym-to-uses-table ctx)) (garbage-collect) (when (memq esml-du-notify '(always)) (message "Loaded %s" (esml-du-ctx-duf ctx))) (esml-du-ctx-inc-load-cnt ctx)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (run-with-idle-timer 1.0 nil (function (lambda () (when esml-du-dufs-auto-load (mapc (function (lambda (file) (when (and (file-readable-p file) (file-regular-p file)) (esml-du-mlton file t)))) esml-du-dufs-recent))))) (provide 'esml-du-mlton) mlton-20100608/ide/emacs/esml-gen.el0000644000076600000240000001713611404435631015452 0ustar mtfstaff;; Copyright (C) 2005 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'esml-util) ;; Installation ;; ============ ;; ;; Push the path to this file (and `esml-util.el') to `load-path' and use ;; (require 'esml-gen). ;; ;; Ideas for future development ;; ============================ ;; ;; - ? ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defgroup esml-gen nil "Code generation functions for Standard ML." :group 'sml) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Prelude ;; TBD: Consider moving these to another place if/when it makes sense. (defun esml-extract-field-names (pattern-or-type) (let ((fields nil)) (with-temp-buffer (insert pattern-or-type) (goto-char 0) (skip-chars-forward " \t\n{},") (while (not (eobp)) (let ((start (point))) (if (find (char-after) esml-sml-symbolic-chars) (skip-chars-forward esml-sml-symbolic-chars) (skip-chars-forward esml-sml-alphanumeric-chars)) (push (buffer-substring start (point)) fields)) (skip-chars-forward " \t\n") (when (and (not (eobp)) (= ?\: (char-after))) (let ((open-parens 0)) (while (not (or (eobp) (and (zerop open-parens) (= ?\, (char-after))))) (cond ((or (= ?\( (char-after)) (= ?\{ (char-after))) (setq open-parens (1+ open-parens))) ((or (= ?\) (char-after)) (= ?\} (char-after))) (setq open-parens (1- open-parens)))) (forward-char 1) (skip-chars-forward "^,(){}")))) (skip-chars-forward " \t\n{},"))) fields)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functional Record Update (see http://mlton.org/FunctionalRecordUpdate) (defcustom esml-gen-fru-setter-template '("fun set f =\nlet\nfun t2r (%1) = {%2}\nfun r2t {%3} = (%4) in\nRecords.wrapSet (Tuples.set%n, t2r, t2r, r2t) f\nend\n" "v%i, " "%f = v%i, " "%f = v%i, " "v%i, ") "Template for `esml-gen-fru-setter'. Indentation is automatic. The last two characters of a pattern are deleted at the end." :type '(list :tag "Template" (string :tag "Code (`%1' = 1., `%2' = 2., ..., `%n' = n)") (string :tag "1. pattern (`%i' = index, `%f' = field)") (string :tag "2. pattern (`%i' = index, `%f' = field)") (string :tag "3. pattern (`%i' = index, `%f' = field)") (string :tag "4. pattern (`%i' = index, `%f' = field)")) :group 'esml-gen) (defun esml-gen-fru-setter (pattern-or-type) "Generates a functional record update function. The parameter must be in the format `[{]id[: ty][,] ...[,] id[}]' where `[]' marks optional parts." (interactive "sSimple record pattern or type: ") (let* ((fields (esml-extract-field-names pattern-or-type)) (n (length fields))) (if (< n 2) (compat-error "%s" "Record must have at least two fields") (let ((fields (sort fields 'string-lessp)) (start (point))) (labels ((format-fields (fmt) (with-temp-buffer (loop for f in fields for i from 1 to n do (insert (let* ((result fmt) (result (compat-replace-regexp-in-string result "\\%f" f)) (result (compat-replace-regexp-in-string result "\\%i" (int-to-string i)))) result))) (delete-char -2) ;; TBD (buffer-string)))) (insert (let* ((result (nth 0 esml-gen-fru-setter-template)) (result (compat-replace-regexp-in-string result "%1" (format-fields (nth 1 esml-gen-fru-setter-template)))) (result (compat-replace-regexp-in-string result "%2" (format-fields (nth 2 esml-gen-fru-setter-template)))) (result (compat-replace-regexp-in-string result "%3" (format-fields (nth 3 esml-gen-fru-setter-template)))) (result (compat-replace-regexp-in-string result "%4" (format-fields (nth 4 esml-gen-fru-setter-template)))) (result (compat-replace-regexp-in-string result "%n" (int-to-string n)))) result)) (indent-region start (point) nil)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functional Tuple Update (see http://mlton.org/FunctionalRecordUpdate) (defcustom esml-gen-ftu-setters-template '("fun set%n f v (%1) =\nlet\ndatatype (%2) t =\n%3 fun g h v =\n(%4)\nin\nf (%5) v\nend\n" "v%i, " "'v%i, " " V%i of 'v%i |" "case h v of V%i v%i => v%i | _ => v%i,\n" "g V%i, ") "Template for `esml-gen-ftu-setters'. Indentation is automatic. The last two characters of a pattern are deleted at the end." :type '(list :tag "Format" (string :tag "Code (`%1' = 1., `%2' = 2., ..., `%n' = n)") (string :tag "1. pattern (`%i' = index)") (string :tag "2. pattern (`%i' = index)") (string :tag "3. pattern (`%i' = index)") (string :tag "4. pattern (`%i' = index)") (string :tag "5. pattern (`%i' = index)")) :group 'esml-gen) (defun esml-gen-ftu-setters (n) "Generates functional tuple update, or `set', functions." (interactive "nMaximum number of fields [2-100]: ") (if (not (and (<= 2 n) (<= n 100))) (compat-error "%s" "Number of fields must be between 2 and 100") (labels ((format-fields (fmt n) (with-temp-buffer (loop for i from 1 to n do (insert (let* ((result fmt) (result (compat-replace-regexp-in-string result "%i" (int-to-string i)))) result))) (delete-char -2) ;; TBD (buffer-string)))) (let ((start (point))) (loop for i from 2 to n do (unless (= i 2) (insert "\n")) (insert (let* ((result (nth 0 esml-gen-ftu-setters-template)) (result (compat-replace-regexp-in-string result "%1" (format-fields (nth 1 esml-gen-ftu-setters-template) i))) (result (compat-replace-regexp-in-string result "%2" (format-fields (nth 2 esml-gen-ftu-setters-template) i))) (result (compat-replace-regexp-in-string result "%3" (format-fields (nth 3 esml-gen-ftu-setters-template) i))) (result (compat-replace-regexp-in-string result "%4" (format-fields (nth 4 esml-gen-ftu-setters-template) i))) (result (compat-replace-regexp-in-string result "%5" (format-fields (nth 5 esml-gen-ftu-setters-template) i))) (result (compat-replace-regexp-in-string result "%n" (int-to-string i)))) result))) (indent-region start (point) nil))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'esml-gen) mlton-20100608/ide/emacs/esml-mlb-mode.el0000644000076600000240000007102511404435631016372 0ustar mtfstaff;; Copyright (C) 2005-2007 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'esml-util) ;; Emacs mode for editing ML Basis files ;; ;; Installation ;; ============ ;; ;; - Push the path to this file (and `esml-util.el') to `load-path' and ;; either ;; (require 'esml-mlb-mode) ;; or ;; (autoload 'esml-mlb-mode "esml-mlb-mode") ;; (add-to-list 'auto-mode-alist '("\\.mlb\\'" . esml-mlb-mode)) ;; in your Emacs initialization file. ;; ;; Alternatively you could use `load-file'. ;; ;; Beware that (at least) Tuareg mode may already be associated to .mlb ;; files. You need to add ML Basis mode to `auto-mode-alist' after ;; Tuareg mode. ;; ;; - Check the `esml-mlb' customization group. ;; ;; Ideas for future development ;; ============================ ;; ;; - customisable indentation ;; - movement ;; - type-check / compile / compile-and-run ;; - find-structure / find-signature / find-functor ;; - highlight only binding occurances of basids ;; - find-binding-occurance (of a basid) ;; - support doc strings in mlb files ;; TBD: ;; - fix indentation bugs ;; - use something more robust than `shell-command' to run shell commands ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Prelude (defvar esml-mlb-load-time t) (defun esml-mlb-set-custom-and-update (sym val) (custom-set-default sym val) (unless esml-mlb-load-time (esml-mlb-update))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Customization (defgroup esml-mlb nil "Major mode for editing ML Basis files." :group 'sml) (defcustom esml-mlb-additional-annotations '() "Additional annotations accepted by your compiler(s). Note that ML Basis mode runs the `esml-mlb-show-annotations-command' to query available annotations automatically." :type '(repeat (cons :tag "Annotation" (string :tag "Name") (repeat :tag "Values starting with the default" string))) :set 'esml-mlb-set-custom-and-update :group 'esml-mlb) (defcustom esml-mlb-additional-path-variables '() "Additional path variables that can not be found in the path map files specified by `esml-mlb-mlb-path-map-files' or by running the command `esml-mlb-show-path-map-command'." :type '(repeat (cons (string :tag "Name") (string :tag "Value"))) :set 'esml-mlb-set-custom-and-update :group 'esml-mlb) (defcustom esml-mlb-completion-ignored-files-regexp "\\.[^.].*\\|CVS/\\|.*~" "Completion ignores files (and directories) whose names match this regexp." :type 'regexp :group 'esml-mlb) (defcustom esml-mlb-indentation-offset 3 "Basic offset for indentation." :type 'integer :group 'esml-mlb) (defcustom esml-mlb-key-bindings '(("[tab]" . esml-mlb-indent-line-or-complete) ("[(control c) (control f)]" . esml-mlb-find-file-at-point) ("[(control c) (control s)]" . esml-mlb-show-basis)) "Key bindings for the ML Basis mode. The key specifications must be in a format accepted by the function `define-key'. Hint: You might want to type `M-x describe-function esml-mlb ' to see the available commands." :type '(repeat (cons :tag "Key Binding" (string :tag "Key") (function :tag "Command"))) :group 'esml-mlb) (defcustom esml-mlb-mlb-path-map-files '("~/.mlton/mlb-path-map" "/usr/lib/mlton/mlb-path-map") "Files to search for definitions of path variables." :type '(repeat file) :set 'esml-mlb-set-custom-and-update :group 'esml-mlb) (defcustom esml-mlb-path-suffix-regexp "fun\\|mlb\\|sig\\|sml" "Regexp for matching valid path name suffices. Completion only considers files whose extension matches this regexp." :type 'regexp :set 'esml-mlb-set-custom-and-update :group 'esml-mlb) (defcustom esml-mlb-show-annotations-command "mlton -expert true -show anns" "Shell command used to query the available annotations." :type 'string :set 'esml-mlb-set-custom-and-update :group 'esml-mlb) (defcustom esml-mlb-show-basis-command "mlton -stop tc -show-basis %t %f" "Shell command used to pretty print the basis defined by an MLB file. `%t' is replaced by the name of a temporary file and `%f' is replaced by the name of the MLB file." :type 'string :group 'esml-mlb) (defcustom esml-mlb-show-path-map-command "mlton -expert true -show path-map" "Shell command used to query the available path variables." :type 'string :set 'esml-mlb-set-custom-and-update :group 'esml-mlb) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Faces (defface font-lock-interface-def-face '((t (:bold t))) "Font Lock mode face used to highlight interface definitions." :group 'font-lock-highlighting-faces) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Annotations (defvar esml-mlb-annotations nil "An association list of known annotations. This variable is updated by `esml-mlb-update'.") (defun esml-mlb-parse-annotations () (setq esml-mlb-annotations (remove-duplicates (sort (append esml-mlb-additional-annotations (when (not (string= "" esml-mlb-show-annotations-command)) (mapcar (function (lambda (s) (esml-split-string s "[ \t]*[{}|][ \t]*"))) (esml-split-string (with-temp-buffer (save-window-excursion (shell-command esml-mlb-show-annotations-command (current-buffer)) (buffer-string))) "[ \t]*\n+[ \t]*")))) (function (lambda (a b) (string-lessp (car a) (car b))))) :test (function (lambda (a b) (string= (car a) (car b))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Path variables (defvar esml-mlb-path-variables nil "An association list of known path variables. This variable is updated by `esml-mlb-update'.") (defun esml-mlb-parse-path-variables-from-string (path-map-string) (mapcar (function (lambda (s) (apply (function cons) (esml-split-string s "[ \t]+")))) (esml-split-string path-map-string "[ \t]*\n+[ \t]*"))) (defun esml-mlb-parse-path-variables () (setq esml-mlb-path-variables (remove-duplicates (sort (append esml-mlb-additional-path-variables (esml-mlb-parse-path-variables-from-string (with-temp-buffer (save-window-excursion (shell-command esml-mlb-show-path-map-command (current-buffer)) (buffer-string)))) (loop for file in esml-mlb-mlb-path-map-files append (when (file-readable-p file) (esml-mlb-parse-path-variables-from-string (with-temp-buffer (insert-file-contents file) (buffer-string)))))) (function (lambda (a b) (string-lessp (car a) (car b))))) :test (function (lambda (a b) (string= (car a) (car b))))))) (defun esml-mlb-expand-path (path) "Expands path variable references in the given path." (let ((parts nil)) (with-temp-buffer (insert path) (goto-char 0) (while (not (eobp)) (if (looking-at "\\$(\\([^)]+\\))") (let* ((name (match-string 1)) (name-value (assoc name esml-mlb-path-variables))) (unless name-value (compat-error "Unknown path variable: %s" name)) (delete-char (length (match-string 0))) (insert (cdr name-value))) (forward-char 1) (skip-chars-forward "^$") (push (buffer-substring 1 (point)) parts) (delete-char (- 1 (point)))) (goto-char 0))) (apply (function concat) (reverse parts)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Syntax and highlighting (defconst esml-mlb-string-continue-regexp "\\(?:\\\\[ \t\n]+\\\\\\)") (defconst esml-mlb-string-char-regexp (concat "\\(?:" esml-mlb-string-continue-regexp "*\\(?:[^\n\"\\]\\|\\\\[^ \t\n]\\)\\)")) (defconst esml-mlb-inside-string-regexp (concat "\"" esml-mlb-string-char-regexp "*" esml-mlb-string-continue-regexp "*")) (defconst esml-mlb-string-regexp (concat esml-mlb-inside-string-regexp "\"")) (defconst esml-mlb-inside-comment-regexp "(\\*\\(?:[^*]\\|\\*[^)]\\)*") (defconst esml-mlb-comment-regexp (concat esml-mlb-inside-comment-regexp "\\*)")) (defconst esml-mlb-path-var-chars "A-Za-z0-9_") (defconst esml-mlb-unquoted-path-chars "-A-Za-z0-9_/.") (defconst esml-mlb-unquoted-path-or-ref-chars (concat esml-mlb-unquoted-path-chars "()$")) (defconst esml-mlb-compiler-ann-prefix (concat "\\(?:" esml-mlb-string-char-regexp "*:[ \t]*\\)")) (defun esml-mlb--to-regexp () (let* ((-to-regexp '(("" . "[A-Za-z0-9_]*"))) (-regexp (assoc -to-regexp))) (if -regexp (cdr -regexp) ))) (defconst esml-mlb-keywords '("and" "ann" "bas" "basis" "end" "functor" "in" "let" "local" "open" "signature" "structure") "Keywords of ML Basis syntax.") (defconst esml-mlb-keywords-usually-followed-by-space '("and" "functor" "open" "signature" "structure") "Keywords of ML Basis syntax that are under most circumstances followed by a space.") (defconst esml-mlb-mode-syntax-table (let ((table (make-syntax-table))) (mapc (function (lambda (char-flags) (modify-syntax-entry (car char-flags) (cdr char-flags) table))) '((?\( . "()1") (?\* . ". 23") (?\) . ")(4") (?\" . "$") ;; not '"' to allow custom highlighting of ann (?\\ . "/") ;; not '\' due to class of '"' (?/ . "_") (?- . "_") (?_ . "w") ;; not "_" due to variables regexp (?. . "_") (?$ . "_") (?\; . ".") (?= . "."))) table) "Syntax table for ML Basis mode.") (defvar esml-mlb-font-lock-table nil) (defun esml-mlb-build-font-lock-table () "Builds the font-lock table for ML Basis mode." (setq esml-mlb-font-lock-table `(;; quoted path names (,(concat esml-mlb-inside-string-regexp "\\.\\(" esml-mlb-path-suffix-regexp "\\)\"") . font-lock-constant-face) ;; annotations (,(apply (function concat) "\"[ \t]*" esml-mlb-compiler-ann-prefix "?\\(" (reduce (function (lambda (regexps name-values) (if (cdr regexps) (push "\\|" regexps)) (cons (if (cdr name-values) (concat (car name-values) "[ \t]+\\(" (reduce (function (lambda (r s) (concat r "\\|\\(" (esml-mlb--to-regexp s) "\\)"))) (cddr name-values) :initial-value (concat "\\(" (esml-mlb--to-regexp (cadr name-values)) "\\)")) "\\)") (car name-values)) regexps))) esml-mlb-annotations :initial-value '("\\)[ \t]*\""))) . font-lock-string-face) (,esml-mlb-string-regexp . font-lock-warning-face) ;; path variables (,(concat "\\$(\\(" (regexp-opt (mapcar 'car esml-mlb-path-variables)) "\\))") . font-lock-reference-face) ("\\$([^)]*?)" . font-lock-warning-face) ;; unquoted path names (,(concat "[-A-Za-z0-9_/.]*[.]\\(" esml-mlb-path-suffix-regexp "\\)[ \t\n]") . font-lock-constant-face) ("[.][-A-Za-z0-9_]+[ \t\n]" . font-lock-warning-face) ("[A-Za-z0-9_]*[-/.][-A-Za-z0-9_/]*" . font-lock-constant-face) ;; keywords (,(concat "\\<\\(" (regexp-opt esml-mlb-keywords) "\\)\\>") . font-lock-keyword-face) ;; basids ("[A-Za-z][A-Za-z0-9_']*" . font-lock-interface-def-face)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Indentation (defconst esml-mlb-indent-sync-keywords-regexp (concat "\\(" (regexp-opt '("ann" "bas" "basis" "end" "functor" "in" "let" "local" "open" "signature" "structure")) "\\)[ \t\n]") "Regexp for synchronizing indentation.") (defun esml-mlb-previous-indentation () "Finds the previous indentation level and evidence." (let ((result nil)) (save-excursion (beginning-of-line) (while (not (or (consp result) (bobp))) (forward-line -1) (beginning-of-line) (skip-chars-forward " \t;") (cond ((looking-at esml-mlb-indent-sync-keywords-regexp) (setq result (let ((start (point)) (indentation (current-column))) (forward-word 1) (cons indentation (intern (buffer-substring start (point))))))) ((looking-at "(\\*") (setq result (cons (current-column) '*))) (t (setq result (if result (min result (current-indentation)) (current-indentation))))))) (cond ((consp result) result) ((numberp result) (cons result 'min)) (t '(0 . min))))) (defun esml-mlb-indent-line () "Indent current line as ML Basis code." (interactive) (let* ((indent-evidence (esml-mlb-previous-indentation)) (indent (car indent-evidence)) (evidence (cdr indent-evidence))) (save-excursion (beginning-of-line) (skip-chars-forward " \t") (cond ((looking-at ";") (case evidence ((in bas) (indent-line-to (max 0 (+ indent -2 esml-mlb-indentation-offset)))) (t (indent-line-to (max 0 (- indent 2)))))) ((looking-at "end[ \t\n]") (case evidence ((ann bas in let local) (indent-line-to indent)) (t (indent-line-to (max 0 (- indent esml-mlb-indentation-offset)))))) ((looking-at "in[ \t\n]") (case evidence ((ann let local) (indent-line-to indent)) (t (indent-line-to (- indent esml-mlb-indentation-offset))))) ((looking-at "and[ \t\n]") (case evidence ((basis functor signature structure) (indent-line-to (+ indent -3 (length (symbol-name evidence))))) (t (indent-line-to indent)))) ((looking-at "\\*") (case evidence ((*) (indent-line-to (+ indent 1))) (t (indent-line-to indent)))) (t (case evidence ((ann bas in let local) (indent-line-to (+ indent esml-mlb-indentation-offset))) (t (indent-line-to indent)))))) (if (< (current-column) (current-indentation)) (forward-char (- (current-indentation) (current-column)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Completion (defun esml-mlb-filter-file-completions (completions &optional allow-dots) "Removes the directories `./' and `../' as well as files whose suffix does not appear in `esml-mlb-path-suffix-regexp' from the list of file name completions." (let ((ignored-files-regexp (concat "^\\(" esml-mlb-completion-ignored-files-regexp "\\)$")) (valid-suffices-regexp (concat "^\\(" esml-mlb-path-suffix-regexp "\\)$"))) (remove* nil completions :test (function (lambda (_ x) (or (and (not allow-dots) (member x '("./" "../"))) (string-match ignored-files-regexp x) (not (or (file-name-directory x) (let ((ext (file-name-extension x))) (when ext (string-match valid-suffices-regexp ext))))))))))) (defun esml-mlb-complete () "Performs context sensitive completion at point." (interactive) (cond ;; no completion inside comments ((esml-point-preceded-by esml-mlb-inside-comment-regexp)) ;; annotation values ((esml-point-preceded-by (concat "\"[ \t\n]*" esml-mlb-compiler-ann-prefix "?\\(" (regexp-opt (mapcar 'car esml-mlb-annotations)) "\\)[ \t\n]+\\(" esml-mlb-string-char-regexp "*\\)")) (let* ((annot (assoc (match-string 1) esml-mlb-annotations)) (all-values (cdr annot)) (values (remove* nil all-values :test (function (lambda (_ s) (and (< 0 (length s)) (= ?< (aref s 0))))))) (value-prefix (match-string 2)) (value-completion (try-completion value-prefix (mapcar 'list values))) (value (if (eq t value-completion) value-prefix value-completion))) (message "Annotation: %s %s" (car annot) (if all-values all-values "")) (when (stringp value-completion) (esml-insert-or-skip-if-looking-at (substring value (length value-prefix)))) (when (and value (eq t (try-completion value (mapcar 'list values)))) (esml-insert-or-skip-if-looking-at "\"")))) ;; annotation names ((and (esml-point-preceded-by (concat "\\ %s]" name value expanded))) (message "Path variables: %s" (all-completions name-prefix esml-mlb-path-variables)))))) ;; filenames and keywords ((or (esml-point-preceded-by (concat "\\(\"\\)\\(" esml-mlb-string-char-regexp "+\\)")) (esml-point-preceded-by (concat "\\([ \t\n]\\|^\\)\\([" esml-mlb-unquoted-path-or-ref-chars "]+\\)"))) ;; TBD: escape sequences in quoted pathnames (let* ((quoted (string= "\"" (match-string 1))) (path-prefix (match-string 2)) (path-expanded (esml-mlb-expand-path path-prefix)) (dir (if (file-name-directory path-expanded) (file-name-directory path-expanded) "")) (nondir-prefix (file-name-nondirectory path-expanded)) (nondir-completions (mapcar 'list (let ((files (esml-mlb-filter-file-completions (file-name-all-completions nondir-prefix dir) t))) (if (string= "" dir) (if quoted files (append (all-completions nondir-prefix (mapcar 'list esml-mlb-keywords)) files)) (esml-mlb-filter-file-completions files (esml-string-matches-p "\\(\.\./\\)+" dir)))))) (nondir-completion (try-completion nondir-prefix nondir-completions)) (nondir (if (eq t nondir-completion) nondir-prefix nondir-completion))) (if (not nondir-completion) (if (string= path-prefix path-expanded) (message "No completions for %s" path-prefix) (message "No completions for %s ==> %s" path-prefix path-expanded)) (when (stringp nondir-completion) (esml-insert-or-skip-if-looking-at (substring nondir (length nondir-prefix)))) (if (eq t (try-completion nondir nondir-completions)) (cond ((file-name-directory nondir) (message "Completions: %s" (sort (let ((dir (concat dir nondir))) (esml-mlb-filter-file-completions (file-name-all-completions "" dir) (esml-string-matches-p "\\(\.\./\\)+" dir))) 'string-lessp))) ((member nondir esml-mlb-keywords) (esml-mlb-indent-line) (message "Keyword: %s" nondir) (when (member nondir esml-mlb-keywords-usually-followed-by-space) (esml-insert-or-skip-if-looking-at " "))) (t (message "Expanded path: %s%s" dir nondir))) (message "Completions: %s" (sort (mapcar 'car nondir-completions) 'string-lessp)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Commands (defun esml-mlb-indent-line-or-complete () "Indents the current line. If indentation does not change, attempts to perform context sensitive completion. This command is not idempotent." (interactive) (let ((old-indentation (current-indentation))) (esml-mlb-indent-line) (when (= old-indentation (current-indentation)) (esml-mlb-complete)))) (defun esml-mlb-find-file-at-point () "Grabs the path surrounding point and attempts to find the file." (interactive) (let ((file (esml-mlb-expand-path (save-excursion (if (and (not (bobp)) (= ?\" (char-before))) (let ((end (point))) (backward-sexp) (buffer-substring (+ (point) 1) (- end 1))) (skip-chars-backward esml-mlb-unquoted-path-or-ref-chars) (let ((start (point))) (skip-chars-forward esml-mlb-unquoted-path-or-ref-chars) (buffer-substring start (point)))))))) (if (file-readable-p file) (find-file file) (message (if (file-exists-p file) "Not readable: %s" "Does not exists: %s") file)))) (defconst esml-mlb-show-basis-process-name "*mlb-show-basis*") (defun esml-mlb-show-basis () "Shows the basis defined by the MLB file in the current buffer." (interactive) ;; TBD: find-error / error output mode (unless (eq major-mode 'esml-mlb-mode) (compat-error "show-basis is only meaningful on MLB files")) (when (get-process esml-mlb-show-basis-process-name) (compat-error "show-basis already running")) (save-some-buffers) (lexical-let ((tmp-file (concat (file-name-directory (buffer-file-name)) "." (file-name-nondirectory (buffer-file-name)) ".basis")) (buffer (get-buffer-create esml-mlb-show-basis-process-name))) (when (file-exists-p tmp-file) (compat-error "Temporary basis file already exists: %s" tmp-file)) (save-excursion (set-buffer buffer) (delete-region (point-min) (point-max))) (let ((process (start-process-shell-command esml-mlb-show-basis-process-name buffer (compat-replace-regexp-in-string (compat-replace-regexp-in-string esml-mlb-show-basis-command "%t" tmp-file) "%f" (buffer-file-name))))) (set-process-sentinel process (function (lambda (process event) (if (and (esml-string-matches-p "finished\n" event) (file-readable-p tmp-file)) (save-excursion (set-buffer (find-file-other-window tmp-file)) (toggle-read-only) (delete-file tmp-file)) (switch-to-buffer buffer)) (message "%S" event))))) (message "%s" "show-basis running..."))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Key Map (defvar esml-mlb-mode-map (make-sparse-keymap) "Keymap for ML Basis mode. This variable is updated by `esml-mlb-update'.") (defun esml-mlb-build-mode-map () "Builds the key map for ML Basis mode." (let ((result (make-sparse-keymap))) (mapc (function (lambda (key-command) (define-key result (read (car key-command)) (cdr key-command)))) esml-mlb-key-bindings) (setq esml-mlb-mode-map result))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Define mode (defvar esml-mlb-mode-hook nil "Hook run when entering ML Basis mode.") (define-derived-mode esml-mlb-mode fundamental-mode "MLB" "Major mode for editing ML Basis files. Provides syntax highlighting, indentation, and context sensitive completion. See the customization group `esml-mlb'." :group 'esml-mlb (set (make-local-variable 'font-lock-defaults) '(esml-mlb-font-lock-table)) (set (make-local-variable 'indent-line-function) 'esml-mlb-indent-line)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Finalization (setq esml-mlb-load-time nil) (defun esml-mlb-update () "Updates data based on customization variables." (interactive) ;; Warning: order dependencies (esml-mlb-parse-path-variables) (esml-mlb-parse-annotations) (esml-mlb-build-font-lock-table) (esml-mlb-build-mode-map)) ;; We are finally ready to update everything the first time. (esml-mlb-update) (add-to-list 'auto-mode-alist '("\\.mlb\\'" . esml-mlb-mode)) (add-to-list 'auto-mode-alist '("\\.basis\\'" . sml-mode)) (provide 'esml-mlb-mode) mlton-20100608/ide/emacs/esml-util.el0000644000076600000240000000623411404435631015653 0ustar mtfstaff;; Copyright (C) 2005 Vesa Karvonen ;; ;; MLton is released under a BSD-style license. ;; See the file MLton-LICENSE for details. (require 'cl) (require 'compat) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; SML metadata (defconst esml-sml-symbolic-chars "-!%&$#+/:<=>?@~`^|*\\\\" "A string of all Standard ML symbolic characters as defined in section 2.4 of the Definition.") (defconst esml-sml-alphanumeric-chars "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'_" "A string of all Standard ML alphanumeric characters as defined in section 2.4 of the Definition.") (defconst esml-sml-symbolic-keywords '("#" "*" "->" ":" "::" ":>" "=" "=>" "|") "A list of symbolic keywords or reserved words as defined in sections 2.1 and section 3.1 and including the special symbol * mentioned in 2.4 as well as the symbol :: mentioned in section 2.9 of the Definition.") (defconst esml-sml-alphanumeric-keywords '("_" "abstype" "and" "andalso" "as" "case" "datatype" "do" "else" "end" "eqtype" "exception" "false" "fn" "fun" "functor" "handle" "if" "in" "include" "infix" "infixr" "let" "local" "nil" "nonfix" "of" "op" "open" "orelse" "raise" "rec" "ref" "sharing" "sig" "signature" "struct" "structure" "then" "true" "type" "val" "where" "while" "with" "withtype") "A list of alphanumeric keywords or reserved words as well as non-bindable identifiers defined in various sections of the Definition") (defconst esml-sml-numeric-literal-regexp "\\(?:\\(?:0w\\)?[0-9]+\\|0w?x[0-9a-fA-F]+\\)" "Regexp matching the syntax of Standard ML numeric literals.") (defconst esml-sml-modes '(sml-mode sml-lex-mode sml-yacc-mode) "List of Emacs modes dealing with SML code.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Some general purpose Emacs Lisp utility functions (defun esml-point-preceded-by (regexp) "Determines whether point is immediately preceded by the given regexp. If the result is non-nil, the regexp match data will contain the corresponding match. As with `re-search-backward' the beginning of the match is as close to the starting point as possible. The end of the match is always the same as the starting point." (save-excursion (let ((limit (point)) (start (re-search-backward regexp 0 t))) (when start (re-search-forward regexp limit t) (= limit (match-end 0)))))) (defun esml-insert-or-skip-if-looking-at (str) "Inserts the specified string unless it already follows the point. The point is moved to the end of the string." (if (string= str (buffer-substring (point) (min (+ (point) (length str)) (point-max)))) (forward-char (length str)) (insert str))) (defun esml-split-string (string separator) (remove* "" (split-string string separator) :test 'equal)) (defun esml-string-matches-p (regexp str) "Non-nil iff the entire string matches the regexp." (and (string-match regexp str) (= 0 (match-beginning 0)) (= (length str) (match-end 0)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'esml-util) mlton-20100608/ide/emacs/mlton.el0000644000076600000240000001056611404435631015074 0ustar mtfstaff;; This code defines a few functions for invoking MLton's type checker and ;; visiting the resulting errors. The intended use is: ;; ;; 1. Call mlton-set-main while visiting your main .mlb file. ;; 2. Call mlton-compile to invoke MLton and visit the first error. ;; 3. Repeatedly call mlton-next-error to visit each error. ;; ;; Calling mlton-compile waits until MLton's type checker completes before ;; visiting the first error. One nice thing is that mlton-parse-errors uses ;; markers so that file edits don't interfere with locating subsequent errros. (setq mlton-command "mlton") (setq mlton-flags "") (setq mlton-main-file "mlton-main-file undefined") (setq mlton-output-buffer "*mlton-output*") (setq mlton-errors nil) (setq mlton-error-regexp "^\\(Error\\|Warning\\): \\(.+\\) \\([0-9]+\\)\\.\\([0-9]+\\).") (defun mlton-parse-errors (prefix buffer) "Parse a sequence of MLton error messages in buffer. prefix is the path relative to which files in the error messages should be interpreted. Returns a list of pairs of the form (pos . marker), where pos is a position in buffer at the start of the second line of an error message (i.e. after the file, line, and column info) and marker is at the point of the error in the source file." (if (not (get-buffer buffer)) (message "No errors.") (let ((errors ())) (set-buffer buffer) (goto-char 0) (condition-case () (while t (re-search-forward mlton-error-regexp) (let* ((match (lambda (i) (buffer-substring (match-beginning i) (match-end i)))) (file (funcall match 2)) (file (if (file-name-absolute-p file) file (concat prefix (funcall match 2)))) (line (string-to-int (funcall match 3))) (col (string-to-int (funcall match 4))) (marker (save-excursion (find-file file) (goto-line line) (forward-char (- col 1)) (set-marker (make-marker) (point))))) (beginning-of-line) (forward-line) (setq errors (cons (cons (point) marker) errors)))) (error)) (setq mlton-errors (reverse errors))))) (defun mlton-next-error () (interactive) (if (or (not (get-buffer mlton-output-buffer)) (null mlton-errors)) (message "No more errors.") (let ((error (caar mlton-errors)) (marker (cdar mlton-errors))) (setq mlton-errors (cdr mlton-errors)) (set-window-start (display-buffer mlton-output-buffer) error) (switch-to-buffer (marker-buffer marker)) (goto-char marker)))) (defun mlton-set-main () (interactive) (setq mlton-main-file (buffer-file-name))) (defvar sml-filename-regexp "\\(\\([-a-zA-Z0-9/.]\\)+\\)\\(\\.\\)\\(\\(cm\\)\\|\\(fun\\)\\|\\(grm\\)\\|\\(lex\\)\\|\\(mlb\\)\\|\\(sig\\)\\|\\(sml\\)\\|\\(ML\\)\\)") (defmacro save-buffer-excursion (&rest exps) `(let ((old-buffer (current-buffer))) (,@ exps) (set-buffer old-buffer))) (defun sml-save-buffers () (save-buffer-excursion (let ((l (buffer-list))) (while (not (null l)) (let* ((b (car l)) (n (buffer-name b))) (if (and n (string-match sml-filename-regexp n)) (progn (set-buffer b) (if (buffer-modified-p) (save-buffer))))) (setq l (cdr l)))))) (defun mlton-compile () (interactive) (let ((buffer (current-buffer))) (sml-save-buffers) (if (get-buffer mlton-output-buffer) (kill-buffer mlton-output-buffer)) (find-file mlton-main-file) (shell-command (concat mlton-command " " mlton-flags " " " -stop tc " (file-name-nondirectory mlton-main-file)) mlton-output-buffer) (mlton-parse-errors (file-name-directory mlton-main-file) mlton-output-buffer) (switch-to-buffer buffer) (mlton-next-error))) (defun mlton-parse-errors-this-buffer () (interactive) (if (get-buffer mlton-output-buffer) (kill-buffer mlton-output-buffer)) (rename-buffer mlton-output-buffer) (mlton-parse-errors (file-name-directory mlton-main-file) (current-buffer))) (provide 'sml-mlton) mlton-20100608/ide/enscript/0000755000076600000240000000000011404470406014147 5ustar mtfstaffmlton-20100608/ide/enscript/sml_all.st0000644000076600000240000010060311404435631016143 0ustar mtfstaff/** * Name: sml_simple * Description: Standard ML programming language. * Author: Matthew Fluet */ /* builtin_face --- comment_face --- comments function_name_face --- highlight_face --- keyword_face --- keywords reference_face --- string_face --- strings type_face --- variable_name_face --- */ sml_keywords_re = /* Keywords: (build-re '(; Core abstype and andalso as case do datatype else end exception fn fun handle if in infix infixr let local nonfix of op open orelse raise rec then type val with withtype while ; Modules eqtype functor include sharing sig signature struct structure where)) ;' */ /\b(a(bstype|nd(|also)|s)|case|d(atatype|o)|e(lse|nd|qtype|xception)|f(n|un(|ctor))|handle|i(f|n(|clude|fix(|r)))|l(et|ocal)|nonfix|o(f|p(|en)|relse)|r(aise|ec)|s(haring|ig(|nature)|truct(|ure))|t(hen|ype)|val|w(h(ere|ile)|ith(|type)))\b/; state sml_simple { BEGIN { header (); } END { trailer (); } /* * Keywords */ sml_keywords_re { keyword_face (true); language_print ($0); keyword_face (false); } /* * Special constants (strings) */ /\"/ { string_face (true); language_print ($0); call (sml_string); string_face (false); } /* * Special constants (chars) */ /(#)(\")/ { language_print ($1); string_face (true); language_print ($2); call (sml_string); string_face (false); } /* * Comments */ /\(\*/ { comment_face (true); language_print ($0); call (sml_comment); comment_face (false); } LANGUAGE_SPECIALS { language_print ($0); } } /* * Strings */ state sml_string { /\\\\./ { language_print ($0); } /\"/ { language_print ($0); return; } LANGUAGE_SPECIALS { language_print ($0); } } /* * Nested comments */ state sml_comment { BEGIN { sml_comment_depth = 1; } /\(\*/ { sml_comment_depth += 1; language_print ($0); } /\*\)/ { sml_comment_depth -= 1; language_print ($0); if (sml_comment_depth == 0) return; } LANGUAGE_SPECIALS { language_print ($0); } } /* Local variables: mode: c End: */ /** * Name: sml_verbose * Description: Standard ML programming language. * Author: Matthew Fluet */ /* builtin_face --- comment_face --- comments function_name_face --- highlight_face --- keyword_face --- keywords reference_face --- special constants (nums) string_face --- strings type_face --- variable_name_face --- */ /* require_state (sml_simple); */ /* formatting = [\ \t\n\011\012\013]+; */ sml_formatting_str = "[ \\t\\n\\011\\012\\013]+"; sml_formatting_re = regexp(sml_formatting_str); /* letter = [A-Za-z]; */ sml_letter_str = "[A-Za-z]"; sml_letter_re = regexp(sml_letter_str); /* symbol = [-!%&$#+/:<=>?@\\~`|*^]; */ sml_symbol_str = "[-!%&$#+/:<=>?@\\\\~`|*^]"; sml_symbol_re = regexp(sml_symbol_str); /* digit = [0-9]; */ sml_digit_str = "[0-9]"; sml_digit_re = regexp(sml_digit_str); /* hexdigit = [0-9a-fA-F]; */ sml_hexdigit_str = "[0-9a-fA-F]"; sml_hexdigit_re = regexp(sml_hexdigit_str); /* posdecint = {digit}+; */ sml_posdecint_str = sprintf("(%s)+",sml_digit_str); sml_posdecint_re = regexp(sml_posdecint_str); /* poshexint = "0x"{hexdigit}+; */ sml_poshexint_str = sprintf("0x(%s)+",sml_hexdigit_str); sml_poshexint_re = regexp(sml_poshexint_str); /* negdecint = "~"{posdecint}; */ sml_negdecint_str = sprintf("~(%s)",sml_posdecint_str); sml_negdecint_re = regexp(sml_negdecint_str); /* neghexint = "~"{poshexint}; */ sml_neghexint_str = sprintf("~(%s)",sml_poshexint_str); sml_neghexint_re = regexp(sml_neghexint_str); /* decint = {posdecint} | {negdecint}; */ sml_decint_str = sprintf("(%s)|(%s)",sml_posdecint_str,sml_negdecint_str); sml_decint_re = regexp(sml_decint_str); /* hexint = {poshexint} | {neghexint}; */ sml_hexint_str = sprintf("(%s)|(%s)",sml_poshexint_str,sml_negdecint_str); sml_hexint_re = regexp(sml_hexint_str); /* decword = "0w"{digit}+; */ sml_decword_str = sprintf("0w(%s)+",sml_digit_str); sml_decword_re = regexp(sml_decword_str); /* hexword = "0wx"{hexdigit}+; */ sml_hexword_str = sprintf("0wx(%s)+",sml_hexdigit_str); sml_hexword_re = regexp(sml_hexword_str); /* exp = "E" | "e"; */ sml_exp_str = "E|e"; sml_exp_re = regexp(sml_exp_str); /* real = ({decint}"."{digit}+ ({exp}{decint})?) | ({decint}{exp}{decint}); */ sml_real_str = sprintf("((%s)\\.(%s)+((%s)(%s))?)|((%s)(%s)(%s))", sml_decint_str,sml_digit_str,sml_exp_str,sml_decint_str, sml_decint_str,sml_exp_str,sml_decint_str); sml_real_re = regexp(sml_real_str); /* scon_num = {decint} | {hexint} | {decword} | {hexword} | {real} */ sml_scon_num_str = sprintf("\\b((%s)|(%s)|(%s)|(%s)|(%s))\\b", sml_decint_str,sml_hexint_str, sml_decword_str,sml_hexword_str, sml_real_str); sml_scon_num_re = regexp(sml_scon_num_str); /* numericlab = [1-9]{digit}*; */ sml_numericlab_str = sprintf("[1-9](%s)*",sml_digit_str); sml_numericlab_re = regexp(sml_numericlab_str); /* alphanumid = {letter}({letter} | {digit} | [_'])*; */ sml_alphanumid_str = sprintf("(%s)((%s)|(%s)|[_'])*", sml_letter_str,sml_letter_str,sml_digit_str); /* symbolicid = {symbol}+; */ sml_symbolicid_str = sprintf("(%s)+",sml_symbol_str); sml_symbolicid_re = regexp(sml_symbolicid_str); /* id = {alphanumid} | {symbolicid}; */ sml_id_str = sprintf("(%s)|(%s)",sml_alphanumid_str,sml_symbolicid_str); sml_id_re = regexp(sml_id_str); /* tyvar = "'"({letter} | {digit} | [_'])*; */ sml_tyvar_str = sprintf("'((%s)|(%s)|[_'])*",sml_letter_str,sml_digit_str); sml_tyvar_re = regexp(sml_tyvar_str); /* longid = ({alphanumid}".")+ {id}; */ sml_longid_str = sprintf("((%s)\\.)+(%s)",sml_alphanumid_str,sml_id_str); sml_longid_re = regexp(sml_longid_str); /* lab = {id} | {numericlab} */ sml_lab_str = sprintf("(%s)|(%s)",sml_id_str,sml_numericlab_str); sml_lab_re = regexp(sml_lab_str); /* sel = "#" {formatting} {lab} */ sml_sel_str = sprintf("#(%s)(%s)",sml_formatting_str,sml_lab_str); sml_sel_re = regexp(sml_sel_str); /* infix = "infix"("r")? {formatting} ({digit})? */ sml_infix_str = sprintf("(infix(r?))(%s)(%s)?",sml_formatting_str,sml_digit_str); sml_infix_re = regexp(sml_infix_str); /* val_with_tyvar = "val" {formatting} {tyvar} val_with_tyvarseq = "val" {formatting} "(" {formatting} {tyvar} fun_with_tyvar = "fun" {formatting} {tyvar} fun_with_tyvarseq = "fun" {formatting} "(" {formatting} {tyvar} */ sml_val_with_tyvar_str = sprintf("(val)(%s)(%s)",sml_formatting_str,sml_tyvar_str); sml_val_with_tyvar_re = regexp(sml_val_with_tyvar_str); sml_val_with_tyvarseq_str = sprintf("(val)(%s)(\\\()(%s)(%s)",sml_formatting_str,sml_formatting_str,sml_tyvar_str); sml_val_with_tyvarseq_re = regexp(sml_val_with_tyvarseq_str); sml_fun_with_tyvar_str = sprintf("(fun)(%s)(%s)",sml_formatting_str,sml_tyvar_str); sml_fun_with_tyvar_re = regexp(sml_fun_with_tyvar_str); sml_fun_with_tyvarseq_str = sprintf("(fun)(%s)(\\\()(%s)(%s)",sml_formatting_str,sml_formatting_str,sml_tyvar_str); sml_fun_with_tyvarseq_re = regexp(sml_fun_with_tyvarseq_str); state sml_verbose /* extends sml_simple */ { sml_infix_re { keyword_face (true); language_print ($1); keyword_face (false); language_print ($3); language_print ($4); } sml_sel_re { language_print ($0); } /* * Special constants (nums) */ sml_scon_num_re { reference_face (true); language_print ($0); reference_face (false); } /* extend sml_simple */ BEGIN { header (); } END { trailer (); } /* * Keywords */ sml_keywords_re { keyword_face (true); language_print ($0); keyword_face (false); } /* * Special constants (strings) */ /\"/ { string_face (true); language_print ($0); call (sml_string); string_face (false); } /* * Special constants (chars) */ /(#)(\")/ { language_print ($1); string_face (true); language_print ($2); call (sml_string); string_face (false); } /* * Comments */ /\(\*/ { comment_face (true); language_print ($0); call (sml_comment); comment_face (false); } LANGUAGE_SPECIALS { language_print ($0); } } /* * Binding tyvar seqs */ state sml_tyvarseq { /,/ { language_print($0); } sml_tyvar_re { type_face(true); language_print($0); type_face(false); } /\)/ { language_print($0); return; } LANGUAGE_SPECIALS { language_print ($0); } } /* Local variables: mode: c End: */ /** * Name: sml_fancy * Description: Standard ML programming language. * Author: Matthew Fluet */ /* builtin_face --- comment_face --- comments function_name_face --- modules keywords highlight_face --- keyword_face --- core keywords reference_face --- special constants (nums) string_face --- strings type_face --- type bindings variable_name_face --- constructor bindings */ /* require_state (sml_verbose); */ TRUE = 1; FALSE = 0; sml_typctxt = -1; sml_typctxt_expected_eqs = -1; SML_DATBIND_UNKNOWN = 1; SML_DATBIND_REPL = 2; SML_DATBIND_DECL = 3; sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; SML_AND_NUL = -1; SML_AND_VALBIND = 1; SML_AND_TYPBIND = 2; SML_AND_DATBIND = 3; SML_AND_EXBIND = 4; SML_AND_STRBIND = 5; SML_AND_SIGBIND = 6; SML_AND_FUNBIND = 7; SML_AND_WHERETYPE = 8; sml_andbind = list (SML_AND_NUL); SML_CORE_LEVEL = 0; SML_MODULES_LEVEL = 1; sml_endmatch = list (SML_MODULES_LEVEL); sml_last_keyword = ""; sub sml_keyword (s, lvl) { sml_last_keyword = s; if (lvl == SML_CORE_LEVEL) keyword_face (true); else if (lvl = SML_MODULES_LEVEL) function_name_face (true); language_print (s); if (lvl == SML_CORE_LEVEL) keyword_face (false); else if (lvl = SML_MODULES_LEVEL) function_name_face (false); } sml_scopes = list (list ("",SML_MODULES_LEVEL)); sml_scope = 0; sub sml_enter_scope (s, lvl) { sml_andbind = list(SML_AND_NUL, sml_andbind); sml_endmatch = list(-1, sml_endmatch); sml_scopes = list (list (s,lvl), sml_scopes); sml_scope++; return; } sub sml_leave_scope () { sml_scope--; sml_scopes = sml_scopes[1]; sml_endmatch = sml_endmatch[1]; sml_andbind = sml_andbind[1]; return; } sub sml_let_level () { local scopes = sml_scopes; if (sml_andbind[0] == SML_AND_STRBIND || sml_andbind[0] == SML_AND_FUNBIND) { return TRUE; } if ((strcmp(scopes[0][0],"let") == 0 || strcmp(scopes[0][0],"(") == 0) && scopes[0][1] == SML_MODULES_LEVEL) return TRUE; return FALSE; } sub sml_local_level () { local scopes = sml_scopes; if ((strcmp(scopes[0][0],"let") == 0 || strcmp(scopes[0][0],"(") == 0) && scopes[0][1] == SML_MODULES_LEVEL) return TRUE; while (length(scopes) == 2) { if (strcmp(scopes[0][0],"local") == 0 && scopes[0][1] == SML_MODULES_LEVEL) scopes = scopes[1]; else if (strcmp(scopes[0][0],"let") == 0 && scopes[0][1] == SML_MODULES_LEVEL) return TRUE; else return FALSE; } return TRUE; } sub sml_start_typctxt (eqs) { type_face(true); sml_typctxt = sml_scope; sml_typctxt_expected_eqs = eqs; return; } sub sml_start_typbind () { sml_start_typctxt (1); sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_eqtyp () { sml_start_typctxt (0); sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_wheretyp () { sml_start_typctxt (1); sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_sharingtyp () { sml_start_typctxt (-1); sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_datbind () { sml_start_typctxt (1); sml_datbind = SML_DATBIND_UNKNOWN; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_exbind () { sml_start_typctxt (1); sml_datbind = FALSE; sml_exbind = TRUE; sml_conbind = TRUE; } sub sml_finish_typctxt () { if (sml_typctxt == sml_scope) { sml_typctxt = -1; sml_typctxt_expected_eqs = -1; if (sml_datbind) {sml_datbind = FALSE; sml_conbind = FALSE;} if (sml_exbind) {sml_exbind = FALSE; sml_conbind = FALSE;} type_face (false); } return; } state sml_fancy /* extends sml_verbose */ { /* * Keywords */ /(:|,|_|->)/ { language_print ($0); } /[\({[]/ { sml_enter_scope ($0,sml_scopes[0][1]); language_print ($0); } /[]}\)]/ { sml_finish_typctxt (); language_print ($0); sml_leave_scope (); } /(\.\.\.|;|=>)/ { sml_finish_typctxt (); sml_andbind[0] = SML_AND_NUL; language_print ($0); } /\|/ { if (sml_datbind == SML_DATBIND_DECL) { type_face (false); language_print ($0); sml_conbind = TRUE; type_face (true); } else { language_print ($0); } } /=/ { if (sml_typctxt != -1) { type_face (false); language_print ($0); type_face (true); if (sml_typctxt_expected_eqs == 0) { sml_finish_typctxt (); } else { sml_typctxt_expected_eqs--; if (sml_datbind == SML_DATBIND_UNKNOWN) { sml_conbind = TRUE; } if (sml_exbind) { sml_conbind = TRUE; } } } else { language_print ($0); } } sml_sel_re { language_print ($0); } /\b(abstype)\b/ { sml_finish_typctxt (); sml_enter_scope ($0,SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_DATBIND; sml_endmatch[0] = SML_CORE_LEVEL; sml_start_datbind (); } /\b(and)\b/ { sml_finish_typctxt (); if (sml_andbind[0] == SML_AND_VALBIND) { sml_keyword ($0, SML_CORE_LEVEL); } else if (sml_andbind[0] == SML_AND_TYPBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_typbind (); } else if (sml_andbind[0] == SML_AND_DATBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_datbind (); } else if (sml_andbind[0] == SML_AND_EXBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_exbind (); } else if (sml_andbind[0] == SML_AND_STRBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_SIGBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_FUNBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_WHERETYPE) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "where"; } } /\b(andalso)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(as)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(case)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(datatype)\b/ { if (sml_datbind == SML_DATBIND_UNKNOWN) { sml_datbind = SML_DATBIND_REPL; sml_conbind = FALSE; sml_keyword ($0, SML_CORE_LEVEL); } else { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_DATBIND; sml_start_datbind (); } } /\b(do)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(else)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(end)\b/ { sml_finish_typctxt (); sml_keyword ($0, sml_endmatch[0]); sml_leave_scope (); } /\b(eqtype)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_start_eqtyp (); } /\b(exception)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_EXBIND; sml_start_exbind (); } /\b(fn)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } sml_fun_with_tyvar_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); type_face(true); language_print ($3); type_face(false); sml_andbind[0] = SML_AND_VALBIND; } sml_fun_with_tyvarseq_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); language_print ($3); language_print ($4); type_face(true); language_print ($5); type_face(false); call (sml_tyvarseq); sml_andbind[0] = SML_AND_VALBIND; } /\b(fun)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_VALBIND; } /\b(functor)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_FUNBIND; } /\b(handle)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(if)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(in)\b/ { sml_finish_typctxt (); sml_andbind[0] = SML_AND_NUL; sml_keyword ($0, sml_endmatch[0]); } /\b(include)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } sml_infix_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($3); language_print ($4); } /\b(let)\b/ { sml_finish_typctxt (); if (sml_let_level()) { sml_enter_scope ($0,SML_MODULES_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } else { sml_enter_scope ($0,SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_endmatch[0] = SML_CORE_LEVEL; } } /\b(local)\b/ { sml_finish_typctxt (); if (sml_local_level ()) { sml_enter_scope ($0, SML_MODULES_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } else { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_endmatch[0] = SML_CORE_LEVEL; } } /\b(nonfix)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); } /\b(of)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(op)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(open)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } /\b(orelse)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(raise)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(rec)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(sharing)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } /\b(sig)\b/ { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } /\b(signature)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_SIGBIND; } /\b(struct)\b/ { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } /\b(structure)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_STRBIND; } /\b(then)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(type)\b/ { if (strcmp(sml_last_keyword,"where") == 0) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "where type"; sml_andbind[0] = SML_AND_WHERETYPE; sml_start_wheretyp (); } else if (strcmp(sml_last_keyword,"sharing") == 0) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "sharing type"; sml_andbind[0] = SML_AND_NUL; sml_start_sharingtyp (); } else { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_TYPBIND; sml_start_typbind (); } } sml_val_with_tyvar_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); type_face(true); language_print ($3); type_face(false); sml_andbind[0] = SML_AND_VALBIND; } sml_val_with_tyvarseq_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); language_print ($3); language_print ($4); type_face(true); language_print ($5); type_face(false); call (sml_tyvarseq); sml_andbind[0] = SML_AND_VALBIND; } /\b(val)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_VALBIND; } /\b(where)\b/ { sml_keyword ($0, SML_MODULES_LEVEL); } /\b(while)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(with)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); } /\b(withtype)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_TYPBIND; sml_start_typbind (); } sml_longid_re { if (sml_conbind) { sml_conbind = FALSE; variable_name_face (true); language_print ($0); variable_name_face (false); } else { language_print ($0); } } sml_id_re { if (sml_conbind) { if (sml_datbind == SML_DATBIND_UNKNOWN) sml_datbind = SML_DATBIND_DECL; sml_conbind = FALSE; variable_name_face (true); language_print ($0); variable_name_face (false); } else { language_print ($0); } } /* extends sml_verbose */ sml_infix_re { keyword_face (true); language_print ($1); keyword_face (false); language_print ($3); language_print ($4); } sml_sel_re { language_print ($0); } /* * Special constants (nums) */ sml_scon_num_re { reference_face (true); language_print ($0); reference_face (false); } /* extend sml_simple */ BEGIN { header (); } END { sml_finish_typctxt (); trailer (); } /* * Keywords */ sml_keywords_re { keyword_face (true); language_print ($0); keyword_face (false); } /* * Special constants (strings) */ /\"/ { string_face (true); language_print ($0); call (sml_string); string_face (false); } /* * Special constants (chars) */ /(#)(\")/ { language_print ($1); string_face (true); language_print ($2); call (sml_string); string_face (false); } /* * Comments */ /\(\*/ { comment_face (true); language_print ($0); call (sml_comment); comment_face (false); } LANGUAGE_SPECIALS { language_print ($0); } } /* Local variables: mode: c End: */ /** * Name: sml_gaudy * Description: Standard ML programming language. * Author: Matthew Fluet */ /* builtin_face --- comment_face --- comments function_name_face --- modules keywords highlight_face --- keyword_face --- core keywords reference_face --- special constants (nums) string_face --- strings type_face --- type bindings, type annotations variable_name_face --- constructor bindings */ /* require_state (sml_fancy); */ state sml_gaudy /* extends sml_fancy */ { /* * Keywords */ /,/ { sml_finish_typctxt (); language_print ($0); } /:/ { if (sml_andbind[0] == SML_AND_STRBIND || sml_andbind[0] == SML_AND_FUNBIND) { language_print ($0); } else { language_print ($0); if (sml_typctxt == -1) sml_start_typctxt (0); } } /* extends sml_fancy */ /* * Keywords */ /(:|,|_|->)/ { language_print ($0); } /[\({[]/ { sml_enter_scope ($0,sml_scopes[0][1]); language_print ($0); } /[]}\)]/ { sml_finish_typctxt (); language_print ($0); sml_leave_scope (); } /(\.\.\.|;|=>)/ { sml_finish_typctxt (); sml_andbind[0] = SML_AND_NUL; language_print ($0); } /\|/ { if (sml_datbind == SML_DATBIND_DECL) { type_face (false); language_print ($0); sml_conbind = TRUE; type_face (true); } else { language_print ($0); } } /=/ { if (sml_typctxt != -1) { type_face (false); language_print ($0); type_face (true); if (sml_typctxt_expected_eqs == 0) { sml_finish_typctxt (); } else { sml_typctxt_expected_eqs--; if (sml_datbind == SML_DATBIND_UNKNOWN) { sml_conbind = TRUE; } if (sml_exbind) { sml_conbind = TRUE; } } } else { language_print ($0); } } sml_sel_re { language_print ($0); } /\b(abstype)\b/ { sml_finish_typctxt (); sml_enter_scope ($0,SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_DATBIND; sml_endmatch[0] = SML_CORE_LEVEL; sml_start_datbind (); } /\b(and)\b/ { sml_finish_typctxt (); if (sml_andbind[0] == SML_AND_VALBIND) { sml_keyword ($0, SML_CORE_LEVEL); } else if (sml_andbind[0] == SML_AND_TYPBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_typbind (); } else if (sml_andbind[0] == SML_AND_DATBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_datbind (); } else if (sml_andbind[0] == SML_AND_EXBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_exbind (); } else if (sml_andbind[0] == SML_AND_STRBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_SIGBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_FUNBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_WHERETYPE) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "where"; } } /\b(andalso)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(as)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(case)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(datatype)\b/ { if (sml_datbind == SML_DATBIND_UNKNOWN) { sml_datbind = SML_DATBIND_REPL; sml_conbind = FALSE; sml_keyword ($0, SML_CORE_LEVEL); } else { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_DATBIND; sml_start_datbind (); } } /\b(do)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(else)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(end)\b/ { sml_finish_typctxt (); sml_keyword ($0, sml_endmatch[0]); sml_leave_scope (); } /\b(eqtype)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_start_eqtyp (); } /\b(exception)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_EXBIND; sml_start_exbind (); } /\b(fn)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } sml_fun_with_tyvar_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); type_face(true); language_print ($3); type_face(false); sml_andbind[0] = SML_AND_VALBIND; } sml_fun_with_tyvarseq_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); language_print ($3); language_print ($4); type_face(true); language_print ($5); type_face(false); call (sml_tyvarseq); sml_andbind[0] = SML_AND_VALBIND; } /\b(fun)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_VALBIND; } /\b(functor)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_FUNBIND; } /\b(handle)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(if)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(in)\b/ { sml_finish_typctxt (); sml_andbind[0] = SML_AND_NUL; sml_keyword ($0, sml_endmatch[0]); } /\b(include)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } sml_infix_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($3); language_print ($4); } /\b(let)\b/ { sml_finish_typctxt (); if (sml_let_level()) { sml_enter_scope ($0,SML_MODULES_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } else { sml_enter_scope ($0,SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_endmatch[0] = SML_CORE_LEVEL; } } /\b(local)\b/ { sml_finish_typctxt (); if (sml_local_level ()) { sml_enter_scope ($0, SML_MODULES_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } else { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_endmatch[0] = SML_CORE_LEVEL; } } /\b(nonfix)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); } /\b(of)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(op)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(open)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } /\b(orelse)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(raise)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(rec)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(sharing)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } /\b(sig)\b/ { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } /\b(signature)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_SIGBIND; } /\b(struct)\b/ { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } /\b(structure)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_STRBIND; } /\b(then)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(type)\b/ { if (strcmp(sml_last_keyword,"where") == 0) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "where type"; sml_andbind[0] = SML_AND_WHERETYPE; sml_start_wheretyp (); } else if (strcmp(sml_last_keyword,"sharing") == 0) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "sharing type"; sml_andbind[0] = SML_AND_NUL; sml_start_sharingtyp (); } else { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_TYPBIND; sml_start_typbind (); } } sml_val_with_tyvar_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); type_face(true); language_print ($3); type_face(false); sml_andbind[0] = SML_AND_VALBIND; } sml_val_with_tyvarseq_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); language_print ($3); language_print ($4); type_face(true); language_print ($5); type_face(false); call (sml_tyvarseq); sml_andbind[0] = SML_AND_VALBIND; } /\b(val)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_VALBIND; } /\b(where)\b/ { sml_keyword ($0, SML_MODULES_LEVEL); } /\b(while)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(with)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); } /\b(withtype)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_TYPBIND; sml_start_typbind (); } sml_longid_re { if (sml_conbind) { sml_conbind = FALSE; variable_name_face (true); language_print ($0); variable_name_face (false); } else { language_print ($0); } } sml_id_re { if (sml_conbind) { if (sml_datbind == SML_DATBIND_UNKNOWN) sml_datbind = SML_DATBIND_DECL; sml_conbind = FALSE; variable_name_face (true); language_print ($0); variable_name_face (false); } else { language_print ($0); } } /* extends sml_verbose */ sml_infix_re { keyword_face (true); language_print ($1); keyword_face (false); language_print ($3); language_print ($4); } sml_sel_re { language_print ($0); } /* * Special constants (nums) */ sml_scon_num_re { reference_face (true); language_print ($0); reference_face (false); } /* extend sml_simple */ BEGIN { header (); } END { sml_finish_typctxt (); trailer (); } /* * Keywords */ sml_keywords_re { keyword_face (true); language_print ($0); keyword_face (false); } /* * Special constants (strings) */ /\"/ { string_face (true); language_print ($0); call (sml_string); string_face (false); } /* * Special constants (chars) */ /(#)(\")/ { language_print ($1); string_face (true); language_print ($2); call (sml_string); string_face (false); } /* * Comments */ /\(\*/ { comment_face (true); language_print ($0); call (sml_comment); comment_face (false); } LANGUAGE_SPECIALS { language_print ($0); } } /* Local variables: mode: c End: */ mlton-20100608/ide/enscript/sml_fancy.st0000644000076600000240000003066311404435631016503 0ustar mtfstaff/** * Name: sml_fancy * Description: Standard ML programming language. * Author: Matthew Fluet */ /* builtin_face --- comment_face --- comments function_name_face --- modules keywords highlight_face --- keyword_face --- core keywords reference_face --- special constants (nums) string_face --- strings type_face --- type bindings variable_name_face --- constructor bindings */ require_state (sml_verbose); TRUE = 1; FALSE = 0; sml_typctxt = -1; sml_typctxt_expected_eqs = -1; SML_DATBIND_UNKNOWN = 1; SML_DATBIND_REPL = 2; SML_DATBIND_DECL = 3; sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; SML_AND_NUL = -1; SML_AND_VALBIND = 1; SML_AND_TYPBIND = 2; SML_AND_DATBIND = 3; SML_AND_EXBIND = 4; SML_AND_STRBIND = 5; SML_AND_SIGBIND = 6; SML_AND_FUNBIND = 7; SML_AND_WHERETYPE = 8; sml_andbind = list (SML_AND_NUL); SML_CORE_LEVEL = 0; SML_MODULES_LEVEL = 1; sml_endmatch = list (SML_MODULES_LEVEL); sml_last_keyword = ""; sub sml_keyword (s, lvl) { sml_last_keyword = s; if (lvl == SML_CORE_LEVEL) keyword_face (true); else if (lvl = SML_MODULES_LEVEL) function_name_face (true); language_print (s); if (lvl == SML_CORE_LEVEL) keyword_face (false); else if (lvl = SML_MODULES_LEVEL) function_name_face (false); } sml_scopes = list (list ("",SML_MODULES_LEVEL)); sml_scope = 0; sub sml_enter_scope (s, lvl) { sml_andbind = list(SML_AND_NUL, sml_andbind); sml_endmatch = list(-1, sml_endmatch); sml_scopes = list (list (s,lvl), sml_scopes); sml_scope++; return; } sub sml_leave_scope () { sml_scope--; sml_scopes = sml_scopes[1]; sml_endmatch = sml_endmatch[1]; sml_andbind = sml_andbind[1]; return; } sub sml_let_level () { local scopes = sml_scopes; if (sml_andbind[0] == SML_AND_STRBIND || sml_andbind[0] == SML_AND_FUNBIND) { return TRUE; } if ((strcmp(scopes[0][0],"let") == 0 || strcmp(scopes[0][0],"(") == 0) && scopes[0][1] == SML_MODULES_LEVEL) return TRUE; return FALSE; } sub sml_local_level () { local scopes = sml_scopes; if ((strcmp(scopes[0][0],"let") == 0 || strcmp(scopes[0][0],"(") == 0) && scopes[0][1] == SML_MODULES_LEVEL) return TRUE; while (length(scopes) == 2) { if (strcmp(scopes[0][0],"local") == 0 && scopes[0][1] == SML_MODULES_LEVEL) scopes = scopes[1]; else if (strcmp(scopes[0][0],"let") == 0 && scopes[0][1] == SML_MODULES_LEVEL) return TRUE; else return FALSE; } return TRUE; } sub sml_start_typctxt (eqs) { type_face(true); sml_typctxt = sml_scope; sml_typctxt_expected_eqs = eqs; return; } sub sml_start_typbind () { sml_start_typctxt (1); sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_eqtyp () { sml_start_typctxt (0); sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_wheretyp () { sml_start_typctxt (1); sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_sharingtyp () { sml_start_typctxt (-1); sml_datbind = FALSE; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_datbind () { sml_start_typctxt (1); sml_datbind = SML_DATBIND_UNKNOWN; sml_exbind = FALSE; sml_conbind = FALSE; } sub sml_start_exbind () { sml_start_typctxt (1); sml_datbind = FALSE; sml_exbind = TRUE; sml_conbind = TRUE; } sub sml_finish_typctxt () { if (sml_typctxt == sml_scope) { sml_typctxt = -1; sml_typctxt_expected_eqs = -1; if (sml_datbind) {sml_datbind = FALSE; sml_conbind = FALSE;} if (sml_exbind) {sml_exbind = FALSE; sml_conbind = FALSE;} type_face (false); } return; } state sml_fancy extends sml_verbose { END { sml_finish_typctxt (); } /* * Keywords */ /(:|,|_|->)/ { language_print ($0); } /[\({[]/ { sml_enter_scope ($0,sml_scopes[0][1]); language_print ($0); } /[]}\)]/ { sml_finish_typctxt (); language_print ($0); sml_leave_scope (); } /(\.\.\.|;|=>)/ { sml_finish_typctxt (); sml_andbind[0] = SML_AND_NUL; language_print ($0); } /\|/ { if (sml_datbind == SML_DATBIND_DECL) { type_face (false); language_print ($0); sml_conbind = TRUE; type_face (true); } else { language_print ($0); } } /=/ { if (sml_typctxt != -1) { type_face (false); language_print ($0); type_face (true); if (sml_typctxt_expected_eqs == 0) { sml_finish_typctxt (); } else { sml_typctxt_expected_eqs--; if (sml_datbind == SML_DATBIND_UNKNOWN) { sml_conbind = TRUE; } if (sml_exbind) { sml_conbind = TRUE; } } } else { language_print ($0); } } sml_sel_re { language_print ($0); } /\b(abstype)\b/ { sml_finish_typctxt (); sml_enter_scope ($0,SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_DATBIND; sml_endmatch[0] = SML_CORE_LEVEL; sml_start_datbind (); } /\b(and)\b/ { sml_finish_typctxt (); if (sml_andbind[0] == SML_AND_VALBIND) { sml_keyword ($0, SML_CORE_LEVEL); } else if (sml_andbind[0] == SML_AND_TYPBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_typbind (); } else if (sml_andbind[0] == SML_AND_DATBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_datbind (); } else if (sml_andbind[0] == SML_AND_EXBIND) { sml_keyword ($0, SML_CORE_LEVEL); sml_start_exbind (); } else if (sml_andbind[0] == SML_AND_STRBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_SIGBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_FUNBIND) { sml_keyword ($0, SML_MODULES_LEVEL); } else if (sml_andbind[0] == SML_AND_WHERETYPE) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "where"; } } /\b(andalso)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(as)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(case)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(datatype)\b/ { if (sml_datbind == SML_DATBIND_UNKNOWN) { sml_datbind = SML_DATBIND_REPL; sml_conbind = FALSE; sml_keyword ($0, SML_CORE_LEVEL); } else { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_DATBIND; sml_start_datbind (); } } /\b(do)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(else)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(end)\b/ { sml_finish_typctxt (); sml_keyword ($0, sml_endmatch[0]); sml_leave_scope (); } /\b(eqtype)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_start_eqtyp (); } /\b(exception)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_EXBIND; sml_start_exbind (); } /\b(fn)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } sml_fun_with_tyvar_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); type_face(true); language_print ($3); type_face(false); sml_andbind[0] = SML_AND_VALBIND; } sml_fun_with_tyvarseq_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); language_print ($3); language_print ($4); type_face(true); language_print ($5); type_face(false); call (sml_tyvarseq); sml_andbind[0] = SML_AND_VALBIND; } /\b(fun)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_VALBIND; } /\b(functor)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_FUNBIND; } /\b(handle)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(if)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(in)\b/ { sml_finish_typctxt (); sml_andbind[0] = SML_AND_NUL; sml_keyword ($0, sml_endmatch[0]); } /\b(include)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } sml_infix_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($3); language_print ($4); } /\b(let)\b/ { sml_finish_typctxt (); if (sml_let_level()) { sml_enter_scope ($0,SML_MODULES_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } else { sml_enter_scope ($0,SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_endmatch[0] = SML_CORE_LEVEL; } } /\b(local)\b/ { sml_finish_typctxt (); if (sml_local_level ()) { sml_enter_scope ($0, SML_MODULES_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } else { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_CORE_LEVEL); sml_endmatch[0] = SML_CORE_LEVEL; } } /\b(nonfix)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); } /\b(of)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(op)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(open)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } /\b(orelse)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(raise)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(rec)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(sharing)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } /\b(sig)\b/ { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } /\b(signature)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_SIGBIND; } /\b(struct)\b/ { sml_enter_scope ($0, SML_CORE_LEVEL); sml_keyword ($0, SML_MODULES_LEVEL); sml_endmatch[0] = SML_MODULES_LEVEL; } /\b(structure)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); sml_andbind[0] = SML_AND_STRBIND; } /\b(then)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(type)\b/ { if (strcmp(sml_last_keyword,"where") == 0) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "where type"; sml_andbind[0] = SML_AND_WHERETYPE; sml_start_wheretyp (); } else if (strcmp(sml_last_keyword,"sharing") == 0) { sml_keyword ($0, SML_MODULES_LEVEL); sml_last_keyword = "sharing type"; sml_andbind[0] = SML_AND_NUL; sml_start_sharingtyp (); } else { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_TYPBIND; sml_start_typbind (); } } sml_val_with_tyvar_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); type_face(true); language_print ($3); type_face(false); sml_andbind[0] = SML_AND_VALBIND; } sml_val_with_tyvarseq_re { sml_finish_typctxt (); sml_keyword ($1, SML_CORE_LEVEL); language_print ($2); language_print ($3); language_print ($4); type_face(true); language_print ($5); type_face(false); call (sml_tyvarseq); sml_andbind[0] = SML_AND_VALBIND; } /\b(val)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_VALBIND; } /\b(where)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_MODULES_LEVEL); } /\b(while)\b/ { sml_keyword ($0, SML_CORE_LEVEL); } /\b(with)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); } /\b(withtype)\b/ { sml_finish_typctxt (); sml_keyword ($0, SML_CORE_LEVEL); sml_andbind[0] = SML_AND_TYPBIND; sml_start_typbind (); } sml_longid_re { if (sml_conbind) { sml_conbind = FALSE; variable_name_face (true); language_print ($0); variable_name_face (false); } else { language_print ($0); } } sml_id_re { if (sml_conbind) { if (sml_datbind == SML_DATBIND_UNKNOWN) sml_datbind = SML_DATBIND_DECL; sml_conbind = FALSE; variable_name_face (true); language_print ($0); variable_name_face (false); } else { language_print ($0); } } } /* * Binding tyvar seqs */ state sml_tyvarseq extends Highlight { /,/ { language_print($0); } sml_tyvar_re { type_face(true); language_print($0); type_face(false); } /\)/ { language_print($0); return; } } /* Local variables: mode: c End: */ mlton-20100608/ide/enscript/sml_gaudy.st0000644000076600000240000000160411404435631016505 0ustar mtfstaff/** * Name: sml_gaudy * Description: Standard ML programming language. * Author: Matthew Fluet */ /* builtin_face --- comment_face --- comments function_name_face --- modules keywords highlight_face --- keyword_face --- core keywords reference_face --- special constants (nums) string_face --- strings type_face --- type bindings, type annotations variable_name_face --- constructor bindings */ require_state (sml_fancy); state sml_gaudy extends sml_fancy { /* * Keywords */ /,/ { sml_finish_typctxt (); language_print ($0); } /:/ { if (sml_andbind[0] == SML_AND_STRBIND || sml_andbind[0] == SML_AND_FUNBIND) { language_print ($0); } else { language_print ($0); if (sml_typctxt == -1) sml_start_typctxt (0); } } } /* Local variables: mode: c End: */ mlton-20100608/ide/enscript/sml_simple.st0000644000076600000240000000417711404435631016675 0ustar mtfstaff/** * Name: sml_simple * Description: Standard ML programming language. * Author: Matthew Fluet */ /* builtin_face --- comment_face --- comments function_name_face --- highlight_face --- keyword_face --- keywords reference_face --- string_face --- strings type_face --- variable_name_face --- */ sml_keywords_re = /* Keywords: (build-re '(; Core abstype and andalso as case do datatype else end exception fn fun handle if in infix infixr let local nonfix of op open orelse raise rec then type val with withtype while ; Modules eqtype functor include sharing sig signature struct structure where)) ;' */ /\b(a(bstype|nd(|also)|s)|case|d(atatype|o)|e(lse|nd|qtype|xception)|f(n|un(|ctor))|handle|i(f|n(|clude|fix(|r)))|l(et|ocal)|nonfix|o(f|p(|en)|relse)|r(aise|ec)|s(haring|ig(|nature)|truct(|ure))|t(hen|ype)|val|w(h(ere|ile)|ith(|type)))\b/; state sml_simple extends HighlightEntry { /* * Keywords */ sml_keywords_re { keyword_face (true); language_print ($0); keyword_face (false); } /* * Special constants (strings) */ /\"/ { string_face (true); language_print ($0); call (sml_string); string_face (false); } /* * Special constants (chars) */ /(#)(\")/ { language_print ($1); string_face (true); language_print ($2); call (sml_string); string_face (false); } /* * Comments */ /\(\*/ { comment_face (true); language_print ($0); call (sml_comment); comment_face (false); } } /* * Strings */ state sml_string extends Highlight { /\\\\./ { language_print ($0); } /\"/ { language_print ($0); return; } } /* * Nested comments */ state sml_comment extends Highlight { BEGIN { sml_comment_depth = 1; } /\(\*/ { sml_comment_depth += 1; language_print ($0); } /\*\)/ { sml_comment_depth -= 1; language_print ($0); if (sml_comment_depth == 0) return; } } /* Local variables: mode: c End: */ mlton-20100608/ide/enscript/sml_verbose.st0000644000076600000240000001267211404435631017050 0ustar mtfstaff/** * Name: sml_verbose * Description: Standard ML programming language. * Author: Matthew Fluet */ /* builtin_face --- comment_face --- comments function_name_face --- highlight_face --- keyword_face --- keywords reference_face --- special constants (nums) string_face --- strings type_face --- variable_name_face --- */ require_state (sml_simple); /* formatting = [\ \t\n\011\012\013]+; */ sml_formatting_str = "[ \\t\\n\\011\\012\\013]+"; sml_formatting_re = regexp(sml_formatting_str); /* letter = [A-Za-z]; */ sml_letter_str = "[A-Za-z]"; sml_letter_re = regexp(sml_letter_str); /* symbol = [-!%&$#+/:<=>?@\\~`|*^]; */ sml_symbol_str = "[-!%&$#+/:<=>?@\\\\~`|*^]"; sml_symbol_re = regexp(sml_symbol_str); /* digit = [0-9]; */ sml_digit_str = "[0-9]"; sml_digit_re = regexp(sml_digit_str); /* hexdigit = [0-9a-fA-F]; */ sml_hexdigit_str = "[0-9a-fA-F]"; sml_hexdigit_re = regexp(sml_hexdigit_str); /* posdecint = {digit}+; */ sml_posdecint_str = sprintf("(%s)+",sml_digit_str); sml_posdecint_re = regexp(sml_posdecint_str); /* poshexint = "0x"{hexdigit}+; */ sml_poshexint_str = sprintf("0x(%s)+",sml_hexdigit_str); sml_poshexint_re = regexp(sml_poshexint_str); /* negdecint = "~"{posdecint}; */ sml_negdecint_str = sprintf("~(%s)",sml_posdecint_str); sml_negdecint_re = regexp(sml_negdecint_str); /* neghexint = "~"{poshexint}; */ sml_neghexint_str = sprintf("~(%s)",sml_poshexint_str); sml_neghexint_re = regexp(sml_neghexint_str); /* decint = {posdecint} | {negdecint}; */ sml_decint_str = sprintf("(%s)|(%s)",sml_posdecint_str,sml_negdecint_str); sml_decint_re = regexp(sml_decint_str); /* hexint = {poshexint} | {neghexint}; */ sml_hexint_str = sprintf("(%s)|(%s)",sml_poshexint_str,sml_negdecint_str); sml_hexint_re = regexp(sml_hexint_str); /* decword = "0w"{digit}+; */ sml_decword_str = sprintf("0w(%s)+",sml_digit_str); sml_decword_re = regexp(sml_decword_str); /* hexword = "0wx"{hexdigit}+; */ sml_hexword_str = sprintf("0wx(%s)+",sml_hexdigit_str); sml_hexword_re = regexp(sml_hexword_str); /* exp = "E" | "e"; */ sml_exp_str = "E|e"; sml_exp_re = regexp(sml_exp_str); /* real = ({decint}"."{digit}+ ({exp}{decint})?) | ({decint}{exp}{decint}); */ sml_real_str = sprintf("((%s)\\.(%s)+((%s)(%s))?)|((%s)(%s)(%s))", sml_decint_str,sml_digit_str,sml_exp_str,sml_decint_str, sml_decint_str,sml_exp_str,sml_decint_str); sml_real_re = regexp(sml_real_str); /* scon_num = {decint} | {hexint} | {decword} | {hexword} | {real} */ sml_scon_num_str = sprintf("\\b((%s)|(%s)|(%s)|(%s)|(%s))\\b", sml_decint_str,sml_hexint_str, sml_decword_str,sml_hexword_str, sml_real_str); sml_scon_num_re = regexp(sml_scon_num_str); /* numericlab = [1-9]{digit}*; */ sml_numericlab_str = sprintf("[1-9](%s)*",sml_digit_str); sml_numericlab_re = regexp(sml_numericlab_str); /* alphanumid = {letter}({letter} | {digit} | [_'])*; */ sml_alphanumid_str = sprintf("(%s)((%s)|(%s)|[_'])*", sml_letter_str,sml_letter_str,sml_digit_str); /* symbolicid = {symbol}+; */ sml_symbolicid_str = sprintf("(%s)+",sml_symbol_str); sml_symbolicid_re = regexp(sml_symbolicid_str); /* id = {alphanumid} | {symbolicid}; */ sml_id_str = sprintf("(%s)|(%s)",sml_alphanumid_str,sml_symbolicid_str); sml_id_re = regexp(sml_id_str); /* tyvar = "'"({letter} | {digit} | [_'])*; */ sml_tyvar_str = sprintf("'((%s)|(%s)|[_'])*",sml_letter_str,sml_digit_str); sml_tyvar_re = regexp(sml_tyvar_str); /* longid = ({alphanumid}".")+ {id}; */ sml_longid_str = sprintf("((%s)\\.)+(%s)",sml_alphanumid_str,sml_id_str); sml_longid_re = regexp(sml_longid_str); /* lab = {id} | {numericlab} */ sml_lab_str = sprintf("(%s)|(%s)",sml_id_str,sml_numericlab_str); sml_lab_re = regexp(sml_lab_str); /* sel = "#" {formatting} {lab} */ sml_sel_str = sprintf("#(%s)(%s)",sml_formatting_str,sml_lab_str); sml_sel_re = regexp(sml_sel_str); /* infix = "infix"("r")? {formatting} ({digit})? */ sml_infix_str = sprintf("(infix(r?))(%s)(%s)?",sml_formatting_str,sml_digit_str); sml_infix_re = regexp(sml_infix_str); /* val_with_tyvar = "val" {formatting} {tyvar} val_with_tyvarseq = "val" {formatting} "(" {formatting} {tyvar} fun_with_tyvar = "fun" {formatting} {tyvar} fun_with_tyvarseq = "fun" {formatting} "(" {formatting} {tyvar} */ sml_val_with_tyvar_str = sprintf("(val)(%s)(%s)",sml_formatting_str,sml_tyvar_str); sml_val_with_tyvar_re = regexp(sml_val_with_tyvar_str); sml_val_with_tyvarseq_str = sprintf("(val)(%s)(\\\()(%s)(%s)",sml_formatting_str,sml_formatting_str,sml_tyvar_str); sml_val_with_tyvarseq_re = regexp(sml_val_with_tyvarseq_str); sml_fun_with_tyvar_str = sprintf("(fun)(%s)(%s)",sml_formatting_str,sml_tyvar_str); sml_fun_with_tyvar_re = regexp(sml_fun_with_tyvar_str); sml_fun_with_tyvarseq_str = sprintf("(fun)(%s)(\\\()(%s)(%s)",sml_formatting_str,sml_formatting_str,sml_tyvar_str); sml_fun_with_tyvarseq_re = regexp(sml_fun_with_tyvarseq_str); state sml_verbose extends sml_simple { sml_infix_re { keyword_face (true); language_print ($1); keyword_face (false); language_print ($3); language_print ($4); } sml_sel_re { language_print ($0); } /* * Special constants (nums) */ sml_scon_num_re { reference_face (true); language_print ($0); reference_face (false); } } /* Local variables: mode: c End: */ mlton-20100608/include/0000755000076600000240000000000011404470406013202 5ustar mtfstaffmlton-20100608/include/amd64-main.h0000644000076600000240000001250311404435622015212 0ustar mtfstaff/* Copyright (C) 2000-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _AMD64_MAIN_H_ #define _AMD64_MAIN_H_ #include "common-main.h" /* Globals */ PRIVATE Word64 applyFFTempFun; PRIVATE Word64 applyFFTempStackArg; PRIVATE Word64 applyFFTempRegArg[6]; PRIVATE Real32 applyFFTempXmmsRegArgD[8]; PRIVATE Real64 applyFFTempXmmsRegArgS[8]; PRIVATE Word32 checkTemp; PRIVATE Word64 cReturnTemp[16]; PRIVATE Pointer c_stackP; PRIVATE Word64 fpcvtTemp; PRIVATE Word32 fpeqTemp; PRIVATE Word64 divTemp; PRIVATE Word64 indexTemp; PRIVATE Word64 raTemp1; PRIVATE Word64 spill[32]; PRIVATE Word64 stackTopTemp; #ifndef DEBUG_AMD64CODEGEN #define DEBUG_AMD64CODEGEN FALSE #endif static GC_frameIndex returnAddressToFrameIndex (GC_returnAddress ra) { return *((GC_frameIndex*)(ra - sizeof(GC_frameIndex))); } #define MLtonCallFromC \ PRIVATE void MLton_jumpToSML (pointer jump); \ static void MLton_callFromC () { \ pointer jump; \ GC_state s; \ \ if (DEBUG_AMD64CODEGEN) \ fprintf (stderr, "MLton_callFromC() starting\n"); \ s = &gcState; \ GC_setSavedThread (s, GC_getCurrentThread (s)); \ s->atomicState += 3; \ if (s->signalsInfo.signalIsPending) \ s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; \ /* Return to the C Handler thread. */ \ GC_switchToThread (s, GC_getCallFromCHandlerThread (s), 0); \ jump = *(pointer*)(s->stackTop - GC_RETURNADDRESS_SIZE); \ MLton_jumpToSML(jump); \ s->atomicState += 1; \ GC_switchToThread (s, GC_getSavedThread (s), 0); \ s->atomicState -= 1; \ if (0 == s->atomicState && s->signalsInfo.signalIsPending) \ s->limit = 0; \ if (DEBUG_AMD64CODEGEN) \ fprintf (stderr, "MLton_callFromC() done\n"); \ return; \ } #define MLtonMain(al, mg, mfs, mmc, pk, ps, ml) \ MLtonCallFromC \ PUBLIC int MLton_main (int argc, char* argv[]) { \ pointer jump; \ extern pointer ml; \ \ Initialize (al, mg, mfs, mmc, pk, ps); \ if (gcState.amOriginal) { \ real_Init(); \ jump = (pointer)&ml; \ } else { \ jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ } \ MLton_jumpToSML(jump); \ return 1; \ } #define MLtonLibrary(al, mg, mfs, mmc, pk, ps, ml) \ MLtonCallFromC \ PUBLIC void LIB_OPEN(LIBNAME) (int argc, char* argv[]) { \ pointer jump; \ extern pointer ml; \ \ Initialize (al, mg, mfs, mmc, pk, ps); \ if (gcState.amOriginal) { \ real_Init(); \ jump = (pointer)&ml; \ } else { \ jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ } \ MLton_jumpToSML(jump); \ } \ PUBLIC void LIB_CLOSE(LIBNAME) () { \ pointer jump; \ jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ MLton_jumpToSML(jump); \ GC_done(&gcState); \ } #endif /* #ifndef _AMD64_MAIN_H_ */ mlton-20100608/include/bytecode-main.h0000644000076600000240000001150211404435622016073 0ustar mtfstaff/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _BYTECODE_MAIN_H_ #define _BYTECODE_MAIN_H_ #include "common-main.h" #include "interpret.h" #ifndef DEBUG_CODEGEN #define DEBUG_CODEGEN FALSE #endif PRIVATE extern struct Bytecode MLton_bytecode; static GC_frameIndex returnAddressToFrameIndex (GC_returnAddress ra) { return *((GC_frameIndex*)(MLton_bytecode.code + ra - sizeof(GC_frameIndex))); } #define MLtonCallFromC \ static void MLton_callFromC () { \ uintptr_t nextFun; \ GC_state s; \ \ if (DEBUG_CODEGEN) \ fprintf (stderr, "MLton_callFromC() starting\n"); \ s = &gcState; \ GC_setSavedThread (s, GC_getCurrentThread (s)); \ s->atomicState += 3; \ if (s->signalsInfo.signalIsPending) \ s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; \ /* Switch to the C Handler thread. */ \ GC_switchToThread (s, GC_getCallFromCHandlerThread (s), 0); \ nextFun = *(uintptr_t*)(s->stackTop - GC_RETURNADDRESS_SIZE); \ MLton_Bytecode_interpret (&MLton_bytecode, nextFun); \ s->atomicState += 1; \ GC_switchToThread (s, GC_getSavedThread (s), 0); \ s->atomicState -= 1; \ if (0 == s->atomicState \ && s->signalsInfo.signalIsPending) \ s->limit = 0; \ if (DEBUG_CODEGEN) \ fprintf (stderr, "MLton_callFromC done\n"); \ } \ #define MLtonMain(al, mg, mfs, mmc, pk, ps, ml) \ MLtonCallFromC \ PUBLIC int MLton_main (int argc, char* argv[]) { \ uintptr_t nextFun; \ Initialize (al, mg, mfs, mmc, pk, ps); \ if (gcState.amOriginal) { \ real_Init(); \ nextFun = ml; \ } else { \ /* Return to the saved world */ \ nextFun = *(uintptr_t*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ } \ MLton_Bytecode_interpret (&MLton_bytecode, nextFun); \ return 1; \ } #define MLtonLibrary(al, mg, mfs, mmc, pk, ps, ml) \ MLtonCallFromC \ PUBLIC void LIB_OPEN(LIBNAME) (int argc, char* argv[]) { \ uintptr_t nextFun; \ Initialize (al, mg, mfs, mmc, pk, ps); \ if (gcState.amOriginal) { \ real_Init(); \ nextFun = ml; \ } else { \ /* Return to the saved world */ \ nextFun = *(uintptr_t*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ } \ MLton_Bytecode_interpret (&MLton_bytecode, nextFun); \ } \ PUBLIC void LIB_CLOSE(LIBNAME) () { \ uintptr_t nextFun; \ nextFun = *(uintptr_t*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ MLton_Bytecode_interpret (&MLton_bytecode, nextFun); \ GC_done(&gcState); \ } #endif /* #ifndef _BYTECODE_MAIN_H */ mlton-20100608/include/bytecode.h0000644000076600000240000000046211404435622015154 0ustar mtfstaff/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #include #include "ml-types.h" #include "c-types.h" #include "export.h" #include "interpret.h" mlton-20100608/include/c-chunk.h0000644000076600000240000003575611404435622014724 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _C_CHUNK_H_ #define _C_CHUNK_H_ #include #include "ml-types.h" #include "c-types.h" #include "c-common.h" #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef DEBUG_CCODEGEN #define DEBUG_CCODEGEN FALSE #endif #define GCState ((Pointer)&gcState) #define ExnStack *(size_t*)(GCState + ExnStackOffset) #define FrontierMem *(Pointer*)(GCState + FrontierOffset) #define Frontier frontier #define StackBottom *(Pointer*)(GCState + StackBottomOffset) #define StackTopMem *(Pointer*)(GCState + StackTopOffset) #define StackTop stackTop /* ------------------------------------------------- */ /* Memory */ /* ------------------------------------------------- */ #define C(ty, x) (*(ty*)(x)) #define G(ty, i) (global##ty [i]) #define GPNR(i) G(ObjptrNonRoot, i) #define O(ty, b, o) (*(ty*)((b) + (o))) #define X(ty, b, i, s, o) (*(ty*)((b) + ((i) * (s)) + (o))) #define S(ty, i) *(ty*)(StackTop + (i)) /* ------------------------------------------------- */ /* Tests */ /* ------------------------------------------------- */ #define IsInt(p) (0x3 & (int)(p)) #define BZ(x, l) \ do { \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "%s:%d: BZ(%d, %s)\n", \ __FILE__, __LINE__, (x), #l); \ if (0 == (x)) goto l; \ } while (0) #define BNZ(x, l) \ do { \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "%s:%d: BNZ(%d, %s)\n", \ __FILE__, __LINE__, (x), #l); \ if (x) goto l; \ } while (0) #define FlushFrontier() \ do { \ FrontierMem = Frontier; \ } while (0) #define FlushStackTop() \ do { \ StackTopMem = StackTop; \ } while (0) #define CacheFrontier() \ do { \ Frontier = FrontierMem; \ } while (0) #define CacheStackTop() \ do { \ StackTop = StackTopMem; \ } while (0) /* ------------------------------------------------- */ /* Chunk */ /* ------------------------------------------------- */ #if (defined (__sun__) && defined (REGISTER_FRONTIER_STACKTOP)) #define Chunk(n) \ DeclareChunk(n) { \ struct cont cont; \ register unsigned int frontier asm("g5"); \ uintptr_t l_nextFun = nextFun; \ register unsigned int stackTop asm("g6"); #else #define Chunk(n) \ DeclareChunk(n) { \ struct cont cont; \ Pointer frontier; \ uintptr_t l_nextFun = nextFun; \ Pointer stackTop; #endif #define ChunkSwitch(n) \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "%s:%d: entering chunk %d l_nextFun = %d\n", \ __FILE__, __LINE__, n, (int)l_nextFun); \ CacheFrontier(); \ CacheStackTop(); \ while (1) { \ top: \ switch (l_nextFun) { #define EndChunk \ default: \ /* interchunk return */ \ nextFun = l_nextFun; \ cont.nextChunk = (void*)nextChunks[nextFun]; \ leaveChunk: \ FlushFrontier(); \ FlushStackTop(); \ return cont; \ } /* end switch (l_nextFun) */ \ } /* end while (1) */ \ } /* end chunk */ /* ------------------------------------------------- */ /* Calling SML from C */ /* ------------------------------------------------- */ #define Thread_returnToC() \ do { \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "%s:%d: Thread_returnToC()\n", \ __FILE__, __LINE__); \ returnToC = TRUE; \ return cont; \ } while (0) /* ------------------------------------------------- */ /* farJump */ /* ------------------------------------------------- */ #define FarJump(n, l) \ do { \ PrepFarJump(n, l); \ goto leaveChunk; \ } while (0) /* ------------------------------------------------- */ /* Stack */ /* ------------------------------------------------- */ #define Push(bytes) \ do { \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "%s:%d: Push (%d)\n", \ __FILE__, __LINE__, bytes); \ StackTop += (bytes); \ } while (0) #define Return() \ do { \ l_nextFun = *(uintptr_t*)(StackTop - sizeof(void*)); \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "%s:%d: Return() l_nextFun = %d\n", \ __FILE__, __LINE__, (int)l_nextFun); \ goto top; \ } while (0) #define Raise() \ do { \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "%s:%d: Raise\n", \ __FILE__, __LINE__); \ StackTop = StackBottom + ExnStack; \ Return(); \ } while (0) \ /* ------------------------------------------------- */ /* Primitives */ /* ------------------------------------------------- */ #ifndef MLTON_CODEGEN_STATIC_INLINE #define MLTON_CODEGEN_STATIC_INLINE static inline #endif /* Declare inlined math functions, since isn't included. */ #ifndef MLTON_CODEGEN_MATHFN #define MLTON_CODEGEN_MATHFN(decl) decl #endif /* WordS_quot and WordS_rem can't be inlined with the C-codegen, * because the gcc optimizer sometimes produces incorrect results when * one of the arguments is a constant. */ #ifndef MLTON_CODEGEN_WORDSQUOTREM #define MLTON_CODEGEN_WORDSQUOTREM(func) PRIVATE #endif #ifndef MLTON_CODEGEN_WORDSQUOTREM_IMPL #define MLTON_CODEGEN_WORDSQUOTREM_IMPL(func) #endif /* Declare memcpy, since isn't included. */ #ifndef MLTON_CODEGEN_MEMCPY #define MLTON_CODEGEN_MEMCPY(decl) #endif MLTON_CODEGEN_MEMCPY(void * memcpy(void *, const void*, size_t);) #include "basis-ffi.h" #include "basis/coerce.h" #include "basis/cpointer.h" #include "basis/Real/Real-ops.h" #include "basis/Real/Math-fns.h" #include "basis/Word/Word-ops.h" #include "basis/Word/Word-consts.h" #include "basis/Word/Word-check.h" /* ------------------------------------------------- */ /* Word */ /* ------------------------------------------------- */ #define WordS_addCheckCX(size, dst, cW, xW, l) \ do { \ WordS##size c = cW; \ WordS##size x = xW; \ WordS_addCheckBodyCX(size, c, x, goto l, dst = c + x); \ } while (0) #define WordS8_addCheckCX(dst, c, x, l) WordS_addCheckCX(8, dst, c, x, l) #define WordS16_addCheckCX(dst, c, x, l) WordS_addCheckCX(16, dst, c, x, l) #define WordS32_addCheckCX(dst, c, x, l) WordS_addCheckCX(32, dst, c, x, l) #define WordS64_addCheckCX(dst, c, x, l) WordS_addCheckCX(64, dst, c, x, l) #define WordS8_addCheckXC(dst, x, c, l) WordS8_addCheckCX(dst, c, x, l) #define WordS16_addCheckXC(dst, x, c, l) WordS16_addCheckCX(dst, c, x, l) #define WordS32_addCheckXC(dst, x, c, l) WordS32_addCheckCX(dst, c, x, l) #define WordS64_addCheckXC(dst, x, c, l) WordS64_addCheckCX(dst, c, x, l) #define WordS8_addCheck WordS8_addCheckXC #define WordS16_addCheck WordS16_addCheckXC #define WordS32_addCheck WordS32_addCheckXC #define WordS64_addCheck WordS64_addCheckXC #define WordU_addCheckCX(size, dst, cW, xW, l) \ do { \ WordU##size c = cW; \ WordU##size x = xW; \ WordU_addCheckBodyCX(size, c, x, goto l, dst = c + x); \ } while (0) #define WordU8_addCheckCX(dst, c, x, l) WordU_addCheckCX(8, dst, c, x, l) #define WordU16_addCheckCX(dst, c, x, l) WordU_addCheckCX(16, dst, c, x, l) #define WordU32_addCheckCX(dst, c, x, l) WordU_addCheckCX(32, dst, c, x, l) #define WordU64_addCheckCX(dst, c, x, l) WordU_addCheckCX(64, dst, c, x, l) #define WordU8_addCheckXC(dst, x, c, l) WordU8_addCheckCX(dst, c, x, l) #define WordU16_addCheckXC(dst, x, c, l) WordU16_addCheckCX(dst, c, x, l) #define WordU32_addCheckXC(dst, x, c, l) WordU32_addCheckCX(dst, c, x, l) #define WordU64_addCheckXC(dst, x, c, l) WordU64_addCheckCX(dst, c, x, l) #define WordU8_addCheck WordU8_addCheckXC #define WordU16_addCheck WordU16_addCheckXC #define WordU32_addCheck WordU32_addCheckXC #define WordU64_addCheck WordU64_addCheckXC #define WordS_negCheck(size, dst, xW, l) \ do { \ WordS##size x = xW; \ WordS_negCheckBody(size, x, goto l, dst = -x); \ } while (0) #define Word8_negCheck(dst, x, l) WordS_negCheck(8, dst, x, l) #define Word16_negCheck(dst, x, l) WordS_negCheck(16, dst, x, l) #define Word32_negCheck(dst, x, l) WordS_negCheck(32, dst, x, l) #define Word64_negCheck(dst, x, l) WordS_negCheck(64, dst, x, l) #define WordS_subCheckCX(size, dst, cW, xW, l) \ do { \ WordS##size c = cW; \ WordS##size x = xW; \ WordS_subCheckBodyCX(size, c, x, goto l, dst = c - x); \ } while (0) #define WordS8_subCheckCX(dst, c, x, l) WordS_subCheckCX(8, dst, c, x, l) #define WordS16_subCheckCX(dst, c, x, l) WordS_subCheckCX(16, dst, c, x, l) #define WordS32_subCheckCX(dst, c, x, l) WordS_subCheckCX(32, dst, c, x, l) #define WordS64_subCheckCX(dst, c, x, l) WordS_subCheckCX(64, dst, c, x, l) #define WordS_subCheckXC(size, dst, xW, cW, l) \ do { \ WordS##size x = xW; \ WordS##size c = cW; \ WordS_subCheckBodyXC(size, x, c, goto l, dst = x - c); \ } while (0) #define WordS8_subCheckXC(dst, x, c, l) WordS_subCheckXC(8, dst, x, c, l) #define WordS16_subCheckXC(dst, x, c, l) WordS_subCheckXC(16, dst, x, c, l) #define WordS32_subCheckXC(dst, x, c, l) WordS_subCheckXC(32, dst, x, c, l) #define WordS64_subCheckXC(dst, x, c, l) WordS_subCheckXC(64, dst, x, c, l) #define WordS8_subCheck WordS8_subCheckXC #define WordS16_subCheck WordS16_subCheckXC #define WordS32_subCheck WordS32_subCheckXC #define WordS64_subCheck WordS64_subCheckXC #define WordS_mulCheck(size, dst, xW, yW, l) \ do { \ WordS##size x = xW; \ WordS##size y = yW; \ WordS_mulCheckBody(size, x, y, goto l, dst = x * y); \ } while (0) #define WordS8_mulCheck(dst, x, y, l) WordS_mulCheck(8, dst, x, y, l) #define WordS16_mulCheck(dst, x, y, l) WordS_mulCheck(16, dst, x, y, l) #define WordS32_mulCheck(dst, x, y, l) WordS_mulCheck(32, dst, x, y, l) #define WordS64_mulCheck(dst, x, y, l) WordS_mulCheck(64, dst, x, y, l) #define WordU_mulCheck(size, dst, xW, yW, l) \ do { \ WordU##size x = xW; \ WordU##size y = yW; \ WordU_mulCheckBody(size, x, y, goto l, dst = x * y); \ } while (0) #define WordU8_mulCheck(dst, x, y, l) WordU_mulCheck(8, dst, x, y, l) #define WordU16_mulCheck(dst, x, y, l) WordU_mulCheck(16, dst, x, y, l) #define WordU32_mulCheck(dst, x, y, l) WordU_mulCheck(32, dst, x, y, l) #define WordU64_mulCheck(dst, x, y, l) WordU_mulCheck(64, dst, x, y, l) #endif /* #ifndef _C_CHUNK_H_ */ mlton-20100608/include/c-common.h0000644000076600000240000000173411404435622015071 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _C_COMMON_H_ #define _C_COMMON_H_ #ifndef DEBUG_CCODEGEN #define DEBUG_CCODEGEN FALSE #endif #include "export.h" struct cont { void *nextChunk; }; PRIVATE extern uintptr_t nextFun; PRIVATE extern int returnToC; PRIVATE extern struct cont (*nextChunks []) (void); #define ChunkName(n) Chunk ## n #define DeclareChunk(n) \ PRIVATE struct cont ChunkName(n)(void) #define Chunkp(n) &(ChunkName(n)) #define PrepFarJump(n, l) \ do { \ cont.nextChunk = (void*)ChunkName(n); \ nextFun = l; \ } while (0) #endif /* #ifndef _C_COMMON_H_ */ mlton-20100608/include/c-main.h0000644000076600000240000001522111404435622014521 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _C_MAIN_H_ #define _C_MAIN_H_ #include "common-main.h" #include "c-common.h" static GC_frameIndex returnAddressToFrameIndex (GC_returnAddress ra) { return (GC_frameIndex)ra; } #define MLtonCallFromC \ /* Globals */ \ PRIVATE uintptr_t nextFun; \ PRIVATE int returnToC; \ static void MLton_callFromC () { \ struct cont cont; \ GC_state s; \ \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "MLton_callFromC() starting\n"); \ s = &gcState; \ GC_setSavedThread (s, GC_getCurrentThread (s)); \ s->atomicState += 3; \ if (s->signalsInfo.signalIsPending) \ s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; \ /* Switch to the C Handler thread. */ \ GC_switchToThread (s, GC_getCallFromCHandlerThread (s), 0); \ nextFun = *(uintptr_t*)(s->stackTop - GC_RETURNADDRESS_SIZE); \ cont.nextChunk = nextChunks[nextFun]; \ returnToC = FALSE; \ do { \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ } while (not returnToC); \ returnToC = FALSE; \ s->atomicState += 1; \ GC_switchToThread (s, GC_getSavedThread (s), 0); \ s->atomicState -= 1; \ if (0 == s->atomicState \ && s->signalsInfo.signalIsPending) \ s->limit = 0; \ if (DEBUG_CCODEGEN) \ fprintf (stderr, "MLton_callFromC done\n"); \ } #define MLtonMain(al, mg, mfs, mmc, pk, ps, mc, ml) \ MLtonCallFromC \ PUBLIC int MLton_main (int argc, char* argv[]) { \ struct cont cont; \ Initialize (al, mg, mfs, mmc, pk, ps); \ if (gcState.amOriginal) { \ real_Init(); \ PrepFarJump(mc, ml); \ } else { \ /* Return to the saved world */ \ nextFun = *(uintptr_t*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ cont.nextChunk = nextChunks[nextFun]; \ } \ /* Trampoline */ \ while (1) { \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ } \ return 1; \ } #define MLtonLibrary(al, mg, mfs, mmc, pk, ps, mc, ml) \ MLtonCallFromC \ PUBLIC void LIB_OPEN(LIBNAME) (int argc, char* argv[]) { \ struct cont cont; \ Initialize (al, mg, mfs, mmc, pk, ps); \ if (gcState.amOriginal) { \ real_Init(); \ PrepFarJump(mc, ml); \ } else { \ /* Return to the saved world */ \ nextFun = *(uintptr_t*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ cont.nextChunk = nextChunks[nextFun]; \ } \ /* Trampoline */ \ returnToC = FALSE; \ do { \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ } while (not returnToC); \ } \ PUBLIC void LIB_CLOSE(LIBNAME) () { \ struct cont cont; \ nextFun = *(uintptr_t*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ cont.nextChunk = nextChunks[nextFun]; \ returnToC = FALSE; \ do { \ cont=(*(struct cont(*)(void))cont.nextChunk)(); \ } while (not returnToC); \ GC_done(&gcState); \ } #endif /* #ifndef _C_MAIN_H */ mlton-20100608/include/common-main.h0000644000076600000240000000744511404435622015600 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _COMMON_MAIN_H_ #define _COMMON_MAIN_H_ #include "mlton-main.h" #define MLTON_GC_INTERNAL_TYPES #define MLTON_GC_INTERNAL_BASIS #include "platform.h" /* The label must be declared as weak because gcc's optimizer may prove that * the code that declares the label is dead and hence eliminate the declaration. */ #define DeclareProfileLabel(l) \ extern char l __attribute__ ((weak)) #define BeginIntInfInits static struct GC_intInfInit intInfInits[] = { #define IntInfInitElem(g, n) { g, n }, #define EndIntInfInits }; #define BeginVectorInits static struct GC_vectorInit vectorInits[] = { #define VectorInitElem(a, b, c, d) { (pointer)a, b, c, d }, #define EndVectorInits }; #define LoadArray(a, f) if (fread (a, sizeof(*a), cardof(a), f) != cardof(a)) return -1; #define SaveArray(a, f) if (fwrite(a, sizeof(*a), cardof(a), f) != cardof(a)) return -1; PRIVATE Pointer gcStateAddress; #define Initialize(al, mg, mfs, mmc, pk, ps) \ gcStateAddress = (pointer)&gcState; \ gcState.alignment = al; \ gcState.atMLtons = atMLtons; \ gcState.atMLtonsLength = cardof(atMLtons); \ gcState.frameLayouts = frameLayouts; \ gcState.frameLayoutsLength = cardof(frameLayouts); \ gcState.globals = (objptr*)globalObjptr; \ gcState.globalsLength = cardof(globalObjptr); \ gcState.intInfInits = intInfInits; \ gcState.intInfInitsLength = cardof(intInfInits); \ gcState.loadGlobals = loadGlobals; \ gcState.magic = mg; \ gcState.maxFrameSize = mfs; \ gcState.mutatorMarksCards = mmc; \ gcState.objectTypes = objectTypes; \ gcState.objectTypesLength = cardof(objectTypes); \ gcState.returnAddressToFrameIndex = returnAddressToFrameIndex; \ gcState.saveGlobals = saveGlobals; \ gcState.vectorInits = vectorInits; \ gcState.vectorInitsLength = cardof(vectorInits); \ gcState.sourceMaps.frameSources = frameSources; \ gcState.sourceMaps.frameSourcesLength = cardof(frameSources); \ gcState.sourceMaps.sourceLabels = sourceLabels; \ gcState.sourceMaps.sourceLabelsLength = cardof(sourceLabels); \ gcState.sourceMaps.sourceNames = sourceNames; \ gcState.sourceMaps.sourceNamesLength = cardof(sourceNames); \ gcState.sourceMaps.sourceSeqs = sourceSeqs; \ gcState.sourceMaps.sourceSeqsLength = cardof(sourceSeqs); \ gcState.sourceMaps.sources = sources; \ gcState.sourceMaps.sourcesLength = cardof(sources); \ gcState.profiling.kind = pk; \ gcState.profiling.stack = ps; \ MLton_init (argc, argv, &gcState); \ #define LIB_PASTE(x,y) x ## y #define LIB_OPEN(x) LIB_PASTE(x, _open) #define LIB_CLOSE(x) LIB_PASTE(x, _close) static void MLton_callFromC (); #endif /* #ifndef _COMMON_MAIN_H_ */ mlton-20100608/include/Makefile0000644000076600000240000000044511404435622014646 0ustar mtfstaff## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../bin/clean mlton-20100608/include/mlton-main.h0000644000076600000240000000056711404435622015437 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_MAIN_H_ #define _MLTON_MAIN_H_ int MLton_main(int argc, char* argv[]); #endif /* #ifndef _MLTON_MAIN_H_ */ mlton-20100608/include/x86-main.h0000644000076600000240000001306311404435622014726 0ustar mtfstaff/* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2000-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _X86_MAIN_H_ #define _X86_MAIN_H_ #include "common-main.h" /* Globals */ PRIVATE Word32 applyFFTempFun; PRIVATE Word32 applyFFTempArg; PRIVATE Word32 checkTemp; PRIVATE Word32 cReturnTemp[16]; PRIVATE Pointer c_stackP; PRIVATE Word32 divTemp; PRIVATE Word32 fildTemp; PRIVATE Word32 fpswTemp; PRIVATE Word32 indexTemp; PRIVATE Word32 raTemp1; PRIVATE Real64 raTemp2; PRIVATE Real64 realTemp1D; PRIVATE Real64 realTemp2D; PRIVATE Real64 realTemp3D; PRIVATE Real32 realTemp1S; PRIVATE Real32 realTemp2S; PRIVATE Real32 realTemp3S; PRIVATE Word32 spill[16]; PRIVATE Word32 stackTopTemp; PRIVATE Word8 wordTemp1B; PRIVATE Word16 wordTemp1W; PRIVATE Word32 wordTemp1L; #ifndef DEBUG_X86CODEGEN #define DEBUG_X86CODEGEN FALSE #endif static GC_frameIndex returnAddressToFrameIndex (GC_returnAddress ra) { return *((GC_frameIndex*)(ra - sizeof(GC_frameIndex))); } #define MLtonCallFromC \ PRIVATE void MLton_jumpToSML (pointer jump); \ static void MLton_callFromC () { \ pointer jump; \ GC_state s; \ \ if (DEBUG_X86CODEGEN) \ fprintf (stderr, "MLton_callFromC() starting\n"); \ s = &gcState; \ GC_setSavedThread (s, GC_getCurrentThread (s)); \ s->atomicState += 3; \ if (s->signalsInfo.signalIsPending) \ s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; \ /* Return to the C Handler thread. */ \ GC_switchToThread (s, GC_getCallFromCHandlerThread (s), 0); \ jump = *(pointer*)(s->stackTop - GC_RETURNADDRESS_SIZE); \ MLton_jumpToSML(jump); \ s->atomicState += 1; \ GC_switchToThread (s, GC_getSavedThread (s), 0); \ s->atomicState -= 1; \ if (0 == s->atomicState \ && s->signalsInfo.signalIsPending) \ s->limit = 0; \ if (DEBUG_X86CODEGEN) \ fprintf (stderr, "MLton_callFromC() done\n"); \ return; \ } #define MLtonMain(al, mg, mfs, mmc, pk, ps, ml) \ MLtonCallFromC \ PUBLIC int MLton_main (int argc, char* argv[]) { \ pointer jump; \ extern pointer ml; \ \ Initialize (al, mg, mfs, mmc, pk, ps); \ if (gcState.amOriginal) { \ real_Init(); \ jump = (pointer)&ml; \ } else { \ jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ } \ MLton_jumpToSML(jump); \ return 1; \ } #define MLtonLibrary(al, mg, mfs, mmc, pk, ps, ml) \ MLtonCallFromC \ PUBLIC void LIB_OPEN(LIBNAME) (int argc, char* argv[]) { \ pointer jump; \ extern pointer ml; \ \ Initialize (al, mg, mfs, mmc, pk, ps); \ if (gcState.amOriginal) { \ real_Init(); \ jump = (pointer)&ml; \ } else { \ jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ } \ MLton_jumpToSML(jump); \ } \ PUBLIC void LIB_CLOSE(LIBNAME) () { \ pointer jump; \ jump = *(pointer*)(gcState.stackTop - GC_RETURNADDRESS_SIZE); \ MLton_jumpToSML(jump); \ GC_done(&gcState); \ } #endif /* #ifndef _X86_MAIN_H_ */ mlton-20100608/lib/0000755000076600000240000000000011404470406012325 5ustar mtfstaffmlton-20100608/lib/ckit-lib/0000755000076600000240000000000011404470406014023 5ustar mtfstaffmlton-20100608/lib/ckit-lib/.ignore0000644000076600000240000000000511404435641015304 0ustar mtfstaffckit mlton-20100608/lib/ckit-lib/ckit.patch0000644000076600000240000016363711404435641016020 0ustar mtfstaffdiff -N -C 2 -r ckit/README.mlton ckit-mlton/README.mlton *** ckit/README.mlton 1969-12-31 19:00:00.000000000 -0500 --- ckit-mlton/README.mlton 2010-02-18 11:59:02.000000000 -0500 *************** *** 0 **** --- 1,14 ---- + The following changes were made to the ckit Library, in addition to + deriving the {{{.mlb}}} file from the {{{.cm}}} files: + * {{{parser/parse-tree-sig.sml}}} (modified): Rewrote use of (sequential) {{{withtype}}} in signature. + * {{{parser/parse-tree.sml}}} (modified): Rewrote use of (sequential) {{{withtype}}}. + * {{{parser/grammar/c.lex.sml}}} (modified): Rewrote use of vector literal. + * {{{ast/ast-sig.sml}}} (modified): Rewrote use of {{{withtype}}} in signature. + * {{{ast/pp/pp-lib.sml}}} (modified): Rewrote use of ''or-patterns''. + * {{{ast/pp/pp-ast-ext-sig.sml}}} (modified): Rewrote use of {{{signature}}} in {{{local}}}. + * {{{ast/pp/pp-ast-adornment-sig.sml}}} (modified): Rewrote use of {{{signature}}} in {{{local}}}. + * {{{ast/type-util-sig.sml}}} (modified): Rewrote use of {{{signature}}} in {{{local}}}. + * {{{ast/type-util.sml}}} (modified): Rewrote use of ''or-patterns''. + * {{{ast/sizeof.sml}}} (modified): Rewrote use of ''or-patterns''. + * {{{ast/initializer-normalizer.sml}}} (modified): Rewrote use of ''or-patterns''. + * {{{ast/build-ast.sml}}} (modified): Rewrote use of ''or-patterns''. diff -N -C 2 -r ckit/ckit-lib.mlb ckit-mlton/ckit-lib.mlb *** ckit/ckit-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- ckit-mlton/ckit-lib.mlb 2009-03-27 18:24:18.000000000 -0400 *************** *** 0 **** --- 1 ---- + src/ckit-lib.mlb diff -N -C 2 -r ckit/src/ast/ast-sig.sml ckit-mlton/src/ast/ast-sig.sml *** ckit/src/ast/ast-sig.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/ast-sig.sml 2009-03-27 18:28:04.000000000 -0400 *************** *** 68,72 **** = TypeDecl of {shadow: {strct:bool} option, tid:tid} (* placeholder to indicate where typedefs/enums/structs should be printed *) ! | VarDecl of id * initExpression option --- 68,77 ---- = TypeDecl of {shadow: {strct:bool} option, tid:tid} (* placeholder to indicate where typedefs/enums/structs should be printed *) ! | VarDecl of ! (* id *) {name: Symbol.symbol, uid: Pid.uid, ! location: SourceMap.location, ctype: ctype, ! stClass: storageClass, status: declStatus, ! global: bool, kind: idKind} * ! initExpression option *************** *** 107,112 **** | Comma of expression * expression | Sub of expression * expression ! | Member of expression * member ! | Arrow of expression * member | Deref of expression | AddrOf of expression --- 112,125 ---- | Comma of expression * expression | Sub of expression * expression ! | Member of ! expression * ! (* member *) {name: Symbol.symbol, uid : Pid.uid, ! location : SourceMap.location, ! ctype: ctype, kind: memberKind} ! | Arrow of ! expression * ! (* member *) {name: Symbol.symbol, uid : Pid.uid, ! location : SourceMap.location, ! ctype: ctype, kind: memberKind} | Deref of expression | AddrOf of expression *************** *** 114,119 **** | Unop of unop * expression | Cast of ctype * expression ! | Id of id ! | EnumId of member * LargeInt.int | SizeOf of ctype (* not used in compiler mode; sizeof expr becomes sizeof (typeof expr) *) | ExprExt of (expression, statement, binop, unop) AstExt.expressionExt --- 127,140 ---- | Unop of unop * expression | Cast of ctype * expression ! | Id of ! (* id *) {name: Symbol.symbol, uid: Pid.uid, ! location: SourceMap.location, ctype: ctype, ! stClass: storageClass, status: declStatus, ! global: bool, kind: idKind} ! | EnumId of ! (* member *) {name: Symbol.symbol, uid : Pid.uid, ! location : SourceMap.location, ! ctype: ctype, kind: memberKind} * ! LargeInt.int | SizeOf of ctype (* not used in compiler mode; sizeof expr becomes sizeof (typeof expr) *) | ExprExt of (expression, statement, binop, unop) AstExt.expressionExt *************** *** 132,136 **** | Array of (LargeInt.int * expression) option * ctype | Pointer of ctype ! | Function of ctype * (ctype * id option) list | StructRef of tid (* reference to a tid bound by a struct decl *) | UnionRef of tid (* reference to a tid bound by a union decl *) --- 153,163 ---- | Array of (LargeInt.int * expression) option * ctype | Pointer of ctype ! | Function of ! ctype * ! (ctype * ! (* id *) {name: Symbol.symbol, uid: Pid.uid, ! location: SourceMap.location, ctype: ctype, ! stClass: storageClass, status: declStatus, ! global: bool, kind: idKind} option) list | StructRef of tid (* reference to a tid bound by a struct decl *) | UnionRef of tid (* reference to a tid bound by a union decl *) *************** *** 152,156 **** | ENUMmem of LargeInt.int ! withtype member = {name: Symbol.symbol, (* the name of the member *) uid : Pid.uid, (* unique identifier *) --- 179,183 ---- | ENUMmem of LargeInt.int ! type member = {name: Symbol.symbol, (* the name of the member *) uid : Pid.uid, (* unique identifier *) diff -N -C 2 -r ckit/src/ast/build-ast.sml ckit-mlton/src/ast/build-ast.sml *** ckit/src/ast/build-ast.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/build-ast.sml 2009-03-27 18:28:04.000000000 -0400 *************** *** 291,295 **** | _ => false ! fun isPartialTy(Ast.StructRef tid | Ast.UnionRef tid) = isPartial tid | isPartialTy _ = false --- 291,296 ---- | _ => false ! fun isPartialTy(Ast.StructRef tid) = isPartial tid ! | isPartialTy(Ast.UnionRef tid) = isPartial tid | isPartialTy _ = false *************** *** 444,448 **** of Ast.Member(Ast.EXPR (expr'', aid, _), _) => isLval (expr'', lookAid aid) ! | (Ast.Id _ | Ast.Sub _ | Ast.Arrow _ | Ast.Deref _) => true | _ => false --- 445,452 ---- of Ast.Member(Ast.EXPR (expr'', aid, _), _) => isLval (expr'', lookAid aid) ! | Ast.Id _ => true ! | Ast.Sub _ => true ! | Ast.Arrow _ => true ! | Ast.Deref _ => true | _ => false *************** *** 603,607 **** ! fun TCInitializer(ctype as (Ast.TypeRef _ | Ast.Qual _), expr) = TCInitializer(getCoreType ctype, expr) (* the following TCInitializer cases expect coretypes *) | TCInitializer (Ast.Array(opt, ctype), Ast.Aggregate exprs) = --- 607,613 ---- ! fun TCInitializer(ctype as Ast.TypeRef _, expr) = ! TCInitializer(getCoreType ctype, expr) (* the following TCInitializer cases expect coretypes *) ! | TCInitializer(ctype as Ast.Qual _, expr) = TCInitializer(getCoreType ctype, expr) (* the following TCInitializer cases expect coretypes *) | TCInitializer (Ast.Array(opt, ctype), Ast.Aggregate exprs) = *************** *** 651,655 **** | NONE => bug "TCInitializer: lookTid failed" | _ => error "TCInitializer: ill-formed UnionRef type") ! | TCInitializer (ty as (Ast.StructRef _ | Ast.UnionRef _), Ast.Simple(Ast.EXPR(coreExp, aid, _))) = if isAssignableTys {lhsTy=ty, rhsTy=lookAid aid, rhsExprOpt=SOME coreExp} then () --- 657,665 ---- | NONE => bug "TCInitializer: lookTid failed" | _ => error "TCInitializer: ill-formed UnionRef type") ! | TCInitializer (ty as Ast.StructRef _, Ast.Simple(Ast.EXPR(coreExp, aid, _))) = ! if isAssignableTys {lhsTy=ty, rhsTy=lookAid aid, rhsExprOpt=SOME coreExp} ! then () ! else error "type of initializer is incompatible with type of lval" ! | TCInitializer (ty as Ast.UnionRef _, Ast.Simple(Ast.EXPR(coreExp, aid, _))) = if isAssignableTys {lhsTy=ty, rhsTy=lookAid aid, rhsExprOpt=SOME coreExp} then () *************** *** 805,809 **** *) (* Note: should really reduce constants arith exprs to simple constants *) ! fun constCheck(Ast.EXPR((Ast.StringConst _ | Ast.IntConst _ | Ast.RealConst _),_,_)) = true | constCheck(Ast.EXPR(Ast.QuestionColon(e1, e2, e3), _, _)) = constCheck e1 andalso constCheck e2 andalso constCheck e3 --- 815,821 ---- *) (* Note: should really reduce constants arith exprs to simple constants *) ! fun constCheck(Ast.EXPR(Ast.StringConst _,_,_)) = true ! | constCheck(Ast.EXPR(Ast.IntConst _,_,_)) = true ! | constCheck(Ast.EXPR(Ast.RealConst _,_,_)) = true | constCheck(Ast.EXPR(Ast.QuestionColon(e1, e2, e3), _, _)) = constCheck e1 andalso constCheck e2 andalso constCheck e3 *************** *** 2372,2376 **** of PT.Signed => (case !kind ! of SOME (Ast.FLOAT | Ast.DOUBLE | Ast.LONGDOUBLE) => error "illegal combination of signed with float/double/long double" | _ => (); --- 2384,2392 ---- of PT.Signed => (case !kind ! of SOME Ast.FLOAT => ! error "illegal combination of signed with float/double/long double" ! | SOME Ast.DOUBLE => ! error "illegal combination of signed with float/double/long double" ! | SOME Ast.LONGDOUBLE => error "illegal combination of signed with float/double/long double" | _ => (); *************** *** 2380,2384 **** | PT.Unsigned => (case !kind ! of SOME (Ast.FLOAT | Ast.DOUBLE | Ast.LONGDOUBLE) => error "illegal combination of unsigned with float/double/long double" | _ => (); --- 2396,2404 ---- | PT.Unsigned => (case !kind ! of SOME Ast.FLOAT => ! error "illegal combination of unsigned with float/double/long double" ! | SOME Ast.DOUBLE => ! error "illegal combination of unsigned with float/double/long double" ! | SOME Ast.LONGDOUBLE => error "illegal combination of unsigned with float/double/long double" | _ => (); *************** *** 2395,2399 **** | PT.Short => (case !kind ! of (NONE | SOME Ast.INT) => (kind := SOME Ast.SHORT) | SOME ct => error (case ct --- 2415,2420 ---- | PT.Short => (case !kind ! of NONE => (kind := SOME Ast.SHORT) ! | SOME Ast.INT => (kind := SOME Ast.SHORT) | SOME ct => error (case ct *************** *** 2403,2407 **** (case !kind of NONE => (kind := SOME Ast.INT) ! | SOME (Ast.SHORT | Ast.LONG | Ast.LONGLONG) => () | SOME ct => error (case ct --- 2424,2430 ---- (case !kind of NONE => (kind := SOME Ast.INT) ! | SOME Ast.SHORT => () ! | SOME Ast.LONG => () ! | SOME Ast.LONGLONG => () | SOME ct => error (case ct *************** *** 2688,2692 **** of SOME(TAG{ctype=ty,location=loc',...}) => (case ty ! of (Ast.UnionRef tid | Ast.StructRef tid) => if isPartial tid then SOME{tid=tid, alreadyDefined=false} --- 2711,2725 ---- of SOME(TAG{ctype=ty,location=loc',...}) => (case ty ! of Ast.UnionRef tid => ! if isPartial tid ! then SOME{tid=tid, alreadyDefined=false} ! else if repeated_declarations_ok ! then SOME{tid=tid, alreadyDefined=true} ! else (error("Redeclaration of type tag `" ! ^ tagname ! ^ "'; previous declaration at " ! ^ SM.locToString loc'); ! NONE) ! | Ast.StructRef tid => if isPartial tid then SOME{tid=tid, alreadyDefined=false} diff -N -C 2 -r ckit/src/ast/initializer-normalizer.sml ckit-mlton/src/ast/initializer-normalizer.sml *** ckit/src/ast/initializer-normalizer.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/initializer-normalizer.sml 2009-03-27 18:28:04.000000000 -0400 *************** *** 157,161 **** | SOME _ => fail "Incomplete type for union ref" | NONE => fail "Inconsistent table for union ref") ! | (Ast.Numeric _ | Ast.Pointer _ | Ast.Function _ | Ast.EnumRef _) => feed (scalarNorm ctype, inits) | Ast.Void => fail "Incomplete type: void" --- 157,167 ---- | SOME _ => fail "Incomplete type for union ref" | NONE => fail "Inconsistent table for union ref") ! | Ast.Numeric _ => ! feed (scalarNorm ctype, inits) ! | Ast.Pointer _ => ! feed (scalarNorm ctype, inits) ! | Ast.Function _ => ! feed (scalarNorm ctype, inits) ! | Ast.EnumRef _ => feed (scalarNorm ctype, inits) | Ast.Void => fail "Incomplete type: void" diff -N -C 2 -r ckit/src/ast/pp/pp-ast-adornment-sig.sml ckit-mlton/src/ast/pp/pp-ast-adornment-sig.sml *** ckit/src/ast/pp/pp-ast-adornment-sig.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/pp/pp-ast-adornment-sig.sml 2009-03-27 18:29:56.000000000 -0400 *************** *** 1,9 **** (* Copyright (c) 1998 by Lucent Technologies *) ! local type 'a pp = Tables.tidtab -> OldPrettyPrint.ppstream -> 'a -> unit type ('aidinfo,'a,'b) adornment_pp = ('aidinfo -> 'a) -> 'aidinfo -> 'b ! in signature PPASTADORNMENT = sig type aidinfo --- 1,9 ---- (* Copyright (c) 1998 by Lucent Technologies *) ! (* local *) type 'a pp = Tables.tidtab -> OldPrettyPrint.ppstream -> 'a -> unit type ('aidinfo,'a,'b) adornment_pp = ('aidinfo -> 'a) -> 'aidinfo -> 'b ! (* in *) signature PPASTADORNMENT = sig type aidinfo *************** *** 12,14 **** val ppExternalDeclAdornment: (aidinfo,Ast.coreExternalDecl pp,Ast.externalDecl pp) adornment_pp end ! end --- 12,14 ---- val ppExternalDeclAdornment: (aidinfo,Ast.coreExternalDecl pp,Ast.externalDecl pp) adornment_pp end ! (* end *) diff -N -C 2 -r ckit/src/ast/pp/pp-ast-ext-sig.sml ckit-mlton/src/ast/pp/pp-ast-ext-sig.sml *** ckit/src/ast/pp/pp-ast-ext-sig.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/pp/pp-ast-ext-sig.sml 2009-03-27 18:29:56.000000000 -0400 *************** *** 1,5 **** (* Copyright (c) 1998 by Lucent Technologies *) ! local type 'a pp = Tables.tidtab -> OldPrettyPrint.ppstream -> 'a -> unit type ('a, 'aidinfo) ppExt = --- 1,5 ---- (* Copyright (c) 1998 by Lucent Technologies *) ! (* local *) type 'a pp = Tables.tidtab -> OldPrettyPrint.ppstream -> 'a -> unit type ('a, 'aidinfo) ppExt = *************** *** 8,12 **** -> 'aidinfo -> Tables.tidtab -> OldPrettyPrint.ppstream -> 'a -> unit ! in signature PPASTEXT = sig --- 8,12 ---- -> 'aidinfo -> Tables.tidtab -> OldPrettyPrint.ppstream -> 'a -> unit ! (* in *) signature PPASTEXT = sig *************** *** 25,27 **** end ! end --- 25,27 ---- end ! (* end *) diff -N -C 2 -r ckit/src/ast/pp/pp-lib.sml ckit-mlton/src/ast/pp/pp-lib.sml *** ckit/src/ast/pp/pp-lib.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/pp/pp-lib.sml 2009-03-27 18:29:56.000000000 -0400 *************** *** 116,120 **** fun ppId pps ({name,uid,kind,stClass,global,...}: Ast.id) = case (stClass,global) ! of ((Ast.EXTERN,_) | (_, true)) => (* globals *) if !suppressPidGlobalUnderscores then ppSymbol' pps name else ppSymbol pps (name,uid) --- 116,123 ---- fun ppId pps ({name,uid,kind,stClass,global,...}: Ast.id) = case (stClass,global) ! of (Ast.EXTERN,_) => (* globals *) ! if !suppressPidGlobalUnderscores then ppSymbol' pps name ! else ppSymbol pps (name,uid) ! | (_, true) => (* globals *) if !suppressPidGlobalUnderscores then ppSymbol' pps name else ppSymbol pps (name,uid) diff -N -C 2 -r ckit/src/ast/sizeof.sml ckit-mlton/src/ast/sizeof.sml *** ckit/src/ast/sizeof.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/sizeof.sml 2009-03-27 18:28:04.000000000 -0400 *************** *** 322,326 **** case ty of Ast.TypeRef tid => processTid sizesErrWarnBug tidtab tid ! | (Ast.StructRef tid | Ast.UnionRef tid) => processTid sizesErrWarnBug tidtab tid | Ast.EnumRef _ => --- 322,328 ---- case ty of Ast.TypeRef tid => processTid sizesErrWarnBug tidtab tid ! | Ast.StructRef tid => ! processTid sizesErrWarnBug tidtab tid ! | Ast.UnionRef tid => processTid sizesErrWarnBug tidtab tid | Ast.EnumRef _ => diff -N -C 2 -r ckit/src/ast/type-util-sig.sml ckit-mlton/src/ast/type-util-sig.sml *** ckit/src/ast/type-util-sig.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/type-util-sig.sml 2009-03-27 18:28:04.000000000 -0400 *************** *** 1,9 **** (* Copyright (c) 1998 by Lucent Technologies *) ! local type 'a type_util = Tables.tidtab -> Ast.ctype -> 'a type 'a type_mem_util = Tables.tidtab -> Ast.ctype * Ast.member -> 'a type 'a type_type_util = Tables.tidtab -> Ast.ctype * Ast.ctype -> 'a ! in signature TYPE_UTIL = --- 1,9 ---- (* Copyright (c) 1998 by Lucent Technologies *) ! (* local *) type 'a type_util = Tables.tidtab -> Ast.ctype -> 'a type 'a type_mem_util = Tables.tidtab -> Ast.ctype * Ast.member -> 'a type 'a type_type_util = Tables.tidtab -> Ast.ctype * Ast.ctype -> 'a ! (* in *) signature TYPE_UTIL = *************** *** 146,148 **** end (* signature TYPE_UTIL *) ! end (* local *) --- 146,148 ---- end (* signature TYPE_UTIL *) ! (* end (* local *) *) diff -N -C 2 -r ckit/src/ast/type-util.sml ckit-mlton/src/ast/type-util.sml *** ckit/src/ast/type-util.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/ast/type-util.sml 2009-03-27 18:28:04.000000000 -0400 *************** *** 283,287 **** case reduceTypedef tidtab ty of Ast.Qual (_,ty) => isStructOrUnion tidtab ty ! | (Ast.StructRef tid | Ast.UnionRef tid) => SOME tid | _ => NONE --- 283,288 ---- case reduceTypedef tidtab ty of Ast.Qual (_,ty) => isStructOrUnion tidtab ty ! | Ast.StructRef tid => SOME tid ! | Ast.UnionRef tid => SOME tid | _ => NONE *************** *** 554,558 **** (SOME ct, eml) => (SOME(Pointer ct), eml) | (NONE, eml) => (NONE, eml)) ! | ((StructRef tid1, StructRef tid2) | (UnionRef tid1, UnionRef tid2)) => if Tid.equal (tid1, tid2) then (SOME ty1, nil) else (NONE, nil) | _ => (NONE, nil) --- 555,561 ---- (SOME ct, eml) => (SOME(Pointer ct), eml) | (NONE, eml) => (NONE, eml)) ! | (StructRef tid1, StructRef tid2) => ! if Tid.equal (tid1, tid2) then (SOME ty1, nil) else (NONE, nil) ! | (UnionRef tid1, UnionRef tid2) => if Tid.equal (tid1, tid2) then (SOME ty1, nil) else (NONE, nil) | _ => (NONE, nil) *************** *** 652,657 **** (case (usualUnaryCnv tidtab ty1, exp1Zero, usualUnaryCnv tidtab ty2, exp2Zero) of (Ast.Numeric _, _, Ast.Numeric _, _) => usualBinaryCnv tidtab (ty1, ty2) (* get common type *) ! | ((Ast.StructRef tid1, _, Ast.StructRef tid2, _) | ! (Ast.UnionRef tid1, _, Ast.UnionRef tid2, _)) => if Tid.equal (tid1, tid2) then SOME ty1 else NONE --- 655,662 ---- (case (usualUnaryCnv tidtab ty1, exp1Zero, usualUnaryCnv tidtab ty2, exp2Zero) of (Ast.Numeric _, _, Ast.Numeric _, _) => usualBinaryCnv tidtab (ty1, ty2) (* get common type *) ! | (Ast.StructRef tid1, _, Ast.StructRef tid2, _) => ! if Tid.equal (tid1, tid2) then SOME ty1 ! else NONE ! | (Ast.UnionRef tid1, _, Ast.UnionRef tid2, _) => if Tid.equal (tid1, tid2) then SOME ty1 else NONE *************** *** 746,752 **** * is a function of no args *) *) ! | ((_, nil, _) | (_, _, nil)) => ( ["Type Warning: function call has too few args"] ! , nil ! ) | (nil, argl, _) => (["Type Warning: function call has too many args"] , List.map (functionArgConv tidtab) argl --- 751,760 ---- * is a function of no args *) *) ! | (_, nil, _) => (["Type Warning: function call has too few args"] ! , nil ! ) ! | (_, _, nil) => (["Type Warning: function call has too few args"] ! , nil ! ) | (nil, argl, _) => (["Type Warning: function call has too many args"] , List.map (functionArgConv tidtab) argl diff -N -C 2 -r ckit/src/ckit-lib.mlb ckit-mlton/src/ckit-lib.mlb *** ckit/src/ckit-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- ckit-mlton/src/ckit-lib.mlb 2010-04-02 16:08:40.000000000 -0400 *************** *** 0 **** --- 1,888 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb + end + basis l24 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l71 = + bas + (* $/pp-lib.cm ====> *) $(SML_LIB)/smlnj-lib/PP/pp-lib.mlb + end + basis l96 = + bas + (* $/ml-yacc-lib.cm ====> *) $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = TextIO + end + local + variants/type-check-control-sig.sml + in + signature gs_1 = TYPECHECKCONTROL + end + local + variants/parse-control-sig.sml + in + signature gs_2 = PARSECONTROL + end + local + signature PARSECONTROL = gs_2 + signature TYPECHECKCONTROL = gs_1 + variants/config-sig.sml + in + signature gs_3 = CONFIG + end + local + signature CONFIG = gs_3 + signature PARSECONTROL = gs_2 + signature TYPECHECKCONTROL = gs_1 + structure TextIO = gs_0 + variants/ansic/config.sml + in + structure gs_4 = Config + end + local + open l24 + in + functor gs_5 = HashTableFn + end + local + ast/uidtabimp-sig.sml + in + signature gs_6 = UIDTABIMP + end + local + open l4 + in + structure gs_7 = Word + end + local + structure Word = gs_7 + ast/uid-sig.sml + in + signature gs_8 = UID + end + local + functor HashTableFn = gs_5 + signature UID = gs_8 + signature UIDTABIMP = gs_6 + ast/uidtabimp-fn.sml + in + functor gs_9 = UidtabImpFn + end + local + open l4 + in + structure gs_10 = Int + end + local + structure Int = gs_10 + signature UID = gs_8 + structure Word = gs_7 + ast/uid-fn.sml + in + functor gs_11 = UidFn + end + local + signature UID = gs_8 + functor UidFn = gs_11 + ast/aid.sml + in + structure gs_12 = Aid + end + local + structure Aid = gs_12 + functor UidtabImpFn = gs_9 + ast/aidtab.sml + in + structure gs_13 = Aidtab + end + local + open l24 + in + structure gs_14 = Format + end + local + open l4 + in + structure gs_15 = String + end + local + parser/util/sourcemap-sig.sml + in + signature gs_16 = SOURCE_MAP + end + local + structure Config = gs_4 + structure Format = gs_14 + structure Int = gs_10 + signature SOURCE_MAP = gs_16 + structure String = gs_15 + parser/util/sourcemap.sml + in + structure gs_17 = SourceMap + end + local + open l71 + in + functor gs_18 = PPStreamFn + end + local + open l71 + in + structure gs_19 = StringToken + end + local + open l4 + in + structure gs_20 = StringCvt + end + local + open l4 + in + structure gs_21 = List + end + local + structure List = gs_21 + functor PPStreamFn = gs_18 + structure String = gs_15 + structure StringCvt = gs_20 + structure StringToken = gs_19 + parser/util/old-pp.sml + in + signature gs_22 = OLD_PRETTYPRINT + structure gs_23 = OldPrettyPrint + end + local + structure Format = gs_14 + signature OLD_PRETTYPRINT = gs_22 + structure OldPrettyPrint = gs_23 + structure SourceMap = gs_17 + structure TextIO = gs_0 + parser/util/error-sig.sml + in + signature gs_24 = ERROR + end + local + signature ERROR = gs_24 + structure Format = gs_14 + signature OLD_PRETTYPRINT = gs_22 + structure OldPrettyPrint = gs_23 + structure SourceMap = gs_17 + structure TextIO = gs_0 + parser/util/error.sml + in + structure gs_25 = Error + end + local + open l96 + in + functor gs_26 = Join + functor gs_27 = JoinWithArg + end + local + open l96 + in + structure gs_28 = LrParser + end + local + open l4 + in + structure gs_29 = LargeInt + end + local + parser/extensions/c/parse-tree-ext.sml + in + structure gs_30 = ParseTreeExt + end + local + structure LargeInt = gs_29 + structure ParseTreeExt = gs_30 + structure SourceMap = gs_17 + parser/parse-tree-sig.sml + in + signature gs_31 = PARSETREE + end + local + structure LargeInt = gs_29 + signature PARSETREE = gs_31 + structure ParseTreeExt = gs_30 + structure SourceMap = gs_17 + parser/parse-tree.sml + in + structure gs_32 = ParseTree + end + local + structure Error = gs_25 + structure ParseTree = gs_32 + parser/parser-sig.sml + in + signature gs_33 = PARSER + end + local + open l4 + in + structure gs_34 = IO + end + local + open l4 + in + structure gs_35 = TextPrimIO + end + local + open l4 + in + structure gs_36 = IntInf + end + local + open l4 + in + structure gs_37 = CharVector + end + local + open l4 + in + structure gs_38 = Vector + end + local + open l4 + in + structure gs_39 = Real + end + local + open l4 + in + structure gs_40 = Char + end + local + open l24 + in + structure gs_41 = AtomTable + end + local + open l24 + in + structure gs_42 = Atom + end + local + structure Atom = gs_42 + structure AtomTable = gs_41 + structure Config = gs_4 + parser/grammar/tdefs.sml + in + signature gs_43 = TYPEDEFS + structure gs_44 = TypeDefs + end + local + open l96 + in + signature gs_45 = ARG_LEXER + signature gs_46 = ARG_PARSER + signature gs_47 = LEXER + signature gs_48 = LR_PARSER + signature gs_49 = LR_TABLE + signature gs_50 = PARSER + signature gs_51 = PARSER_DATA + signature gs_52 = STREAM + signature gs_53 = TOKEN + end + local + signature ARG_LEXER = gs_45 + signature ARG_PARSER = gs_46 + signature LEXER = gs_47 + signature LR_PARSER = gs_48 + signature LR_TABLE = gs_49 + structure LargeInt = gs_29 + signature PARSER = gs_50 + signature PARSER_DATA = gs_51 + signature STREAM = gs_52 + signature TOKEN = gs_53 + parser/grammar/c.grm.sig + in + signature gs_54 = C_LRVALS + signature gs_55 = C_TOKENS + end + local + structure Atom = gs_42 + structure AtomTable = gs_41 + signature C_LRVALS = gs_54 + signature C_TOKENS = gs_55 + structure Config = gs_4 + signature TYPEDEFS = gs_43 + structure TypeDefs = gs_44 + parser/grammar/tokentable.sml + in + signature gs_56 = TOKENTABLE + functor gs_57 = TokenTable + end + local + signature C_LRVALS = gs_54 + signature C_TOKENS = gs_55 + structure Char = gs_40 + structure CharVector = gs_37 + structure IO = gs_34 + structure Int = gs_10 + structure IntInf = gs_36 + structure LargeInt = gs_29 + structure Real = gs_39 + structure SourceMap = gs_17 + structure String = gs_15 + structure StringCvt = gs_20 + signature TOKENTABLE = gs_56 + structure TextIO = gs_0 + structure TextPrimIO = gs_35 + functor TokenTable = gs_57 + structure Vector = gs_38 + parser/grammar/c.lex.sml + in + functor gs_58 = CLexFun + end + local + open l4 + in + structure gs_59 = Array + end + local + signature ARG_LEXER = gs_45 + signature ARG_PARSER = gs_46 + structure Array = gs_59 + signature C_LRVALS = gs_54 + signature C_TOKENS = gs_55 + structure Char = gs_40 + structure Error = gs_25 + signature LEXER = gs_47 + signature LR_PARSER = gs_48 + signature LR_TABLE = gs_49 + structure LargeInt = gs_29 + structure List = gs_21 + signature PARSER = gs_50 + signature PARSER_DATA = gs_51 + structure ParseTree = gs_32 + signature STREAM = gs_52 + structure SourceMap = gs_17 + structure String = gs_15 + signature TOKEN = gs_53 + signature TYPEDEFS = gs_43 + structure TypeDefs = gs_44 + parser/grammar/c.grm.sml + in + functor gs_60 = LrValsFun + end + local + functor CLexFun = gs_58 + structure Error = gs_25 + functor Join = gs_26 + functor JoinWithArg = gs_27 + structure LrParser = gs_28 + functor LrValsFun = gs_60 + signature PARSER = gs_33 + structure SourceMap = gs_17 + signature TOKENTABLE = gs_56 + signature TYPEDEFS = gs_43 + structure TextIO = gs_0 + functor TokenTable = gs_57 + structure TypeDefs = gs_44 + parser/parser.sml + in + structure gs_61 = Parser + end + local + open l24 + in + structure gs_62 = HashString + end + local + signature UID = gs_8 + functor UidFn = gs_11 + ast/tid.sml + in + structure gs_63 = Tid + end + local + structure Tid = gs_63 + ast/symbol-sig.sml + in + signature gs_64 = SYMBOL + end + local + structure HashString = gs_62 + structure Int = gs_10 + signature SYMBOL = gs_64 + structure String = gs_15 + structure Tid = gs_63 + structure Word = gs_7 + ast/symbol.sml + in + structure gs_65 = Symbol + end + local + signature UID = gs_8 + functor UidFn = gs_11 + ast/pid.sml + in + structure gs_66 = Pid + end + local + ast/extensions/c/ast-ext.sml + in + structure gs_67 = AstExt + end + local + structure Aid = gs_12 + structure AstExt = gs_67 + structure LargeInt = gs_29 + structure Pid = gs_66 + structure SourceMap = gs_17 + structure Symbol = gs_65 + structure Tid = gs_63 + ast/ast-sig.sml + in + signature gs_68 = AST + end + local + signature AST = gs_68 + structure Aid = gs_12 + structure AstExt = gs_67 + structure LargeInt = gs_29 + structure Pid = gs_66 + structure SourceMap = gs_17 + structure Symbol = gs_65 + structure Tid = gs_63 + ast/ast.sml + in + structure gs_69 = Ast + end + local + structure Ast = gs_69 + structure LargeInt = gs_29 + structure Pid = gs_66 + structure SourceMap = gs_17 + structure Symbol = gs_65 + structure Tid = gs_63 + ast/bindings.sml + in + structure gs_70 = Bindings + end + local + open l24 + in + functor gs_71 = BinaryMapFn + end + local + open l24 + in + signature gs_72 = ORD_MAP + end + local + structure Tid = gs_63 + functor UidtabImpFn = gs_9 + ast/tidtab.sml + in + structure gs_73 = Tidtab + end + local + structure Aidtab = gs_13 + structure Ast = gs_69 + structure Bindings = gs_70 + structure Tidtab = gs_73 + ast/tables.sml + in + structure gs_74 = Tables + end + local + structure Aid = gs_12 + structure Ast = gs_69 + structure Bindings = gs_70 + structure Error = gs_25 + structure LargeInt = gs_29 + signature ORD_MAP = gs_72 + structure SourceMap = gs_17 + structure Symbol = gs_65 + structure Tables = gs_74 + structure Tid = gs_63 + ast/state-sig.sml + in + signature gs_75 = STATE + end + local + structure Aid = gs_12 + structure Aidtab = gs_13 + structure Ast = gs_69 + functor BinaryMapFn = gs_71 + structure Bindings = gs_70 + structure Error = gs_25 + structure LargeInt = gs_29 + structure List = gs_21 + structure Pid = gs_66 + signature STATE = gs_75 + structure SourceMap = gs_17 + structure Symbol = gs_65 + structure Tables = gs_74 + structure Tid = gs_63 + structure Tidtab = gs_73 + ast/state.sml + in + structure gs_76 = State + end + local + ast/sizes-sig.sml + in + signature gs_77 = SIZES + end + local + signature SIZES = gs_77 + ast/sizes.sml + in + structure gs_78 = Sizes + end + local + structure Ast = gs_69 + structure Bindings = gs_70 + structure Sizes = gs_78 + structure State = gs_76 + structure Tables = gs_74 + structure TextIO = gs_0 + structure Tidtab = gs_73 + ast/parse-to-ast-sig.sml + in + signature gs_79 = PARSE_TO_AST + end + local + open l4 + in + structure gs_80 = ListPair + end + local + open l4 + in + structure gs_81 = Option + end + local + structure Ast = gs_69 + structure Bindings = gs_70 + structure Error = gs_25 + structure ParseTree = gs_32 + structure Sizes = gs_78 + structure State = gs_76 + structure Tables = gs_74 + structure Tidtab = gs_73 + ast/build-ast-sig.sml + in + signature gs_82 = BUILD_AST + end + local + structure Ast = gs_69 + structure ParseTree = gs_32 + structure ParseTreeExt = gs_30 + structure State = gs_76 + ast/cnv-ext-sig.sml + in + signature gs_83 = CNVEXT + end + local + structure Ast = gs_69 + signature CNVEXT = gs_83 + structure ParseTree = gs_32 + structure ParseTreeExt = gs_30 + structure State = gs_76 + ast/extensions/c/cnv-ext.sml + in + structure gs_84 = CnvExt + end + local + structure Ast = gs_69 + structure Bindings = gs_70 + structure Pid = gs_66 + structure Symbol = gs_65 + ast/simplify-assign-ops.sml + in + structure gs_85 = SimplifyAssignOps + end + local + structure Ast = gs_69 + structure Bindings = gs_70 + signature OLD_PRETTYPRINT = gs_22 + structure OldPrettyPrint = gs_23 + structure Tables = gs_74 + structure Tid = gs_63 + ast/pp/pp-ast-sig.sml + in + signature gs_86 = PP_AST + end + local + open l4 + in + structure gs_87 = Int32 + end + local + structure Ast = gs_69 + structure Int = gs_10 + structure Int32 = gs_87 + structure LargeInt = gs_29 + signature OLD_PRETTYPRINT = gs_22 + structure OldPrettyPrint = gs_23 + structure Pid = gs_66 + structure Real = gs_39 + structure String = gs_15 + structure Symbol = gs_65 + structure Tables = gs_74 + structure TextIO = gs_0 + structure Tid = gs_63 + structure Tidtab = gs_73 + ast/pp/pp-lib.sml + in + structure gs_88 = PPLib + end + local + structure Ast = gs_69 + structure AstExt = gs_67 + signature OLD_PRETTYPRINT = gs_22 + structure OldPrettyPrint = gs_23 + structure Tables = gs_74 + ast/pp/pp-ast-ext-sig.sml + in + signature gs_89 = PPASTEXT + end + local + signature PPASTEXT = gs_89 + ast/extensions/c/pp-ast-ext-fn.sml + in + functor gs_90 = PPAstExtFn + end + local + structure Ast = gs_69 + signature OLD_PRETTYPRINT = gs_22 + structure OldPrettyPrint = gs_23 + structure Tables = gs_74 + ast/pp/pp-ast-adornment-sig.sml + in + signature gs_91 = PPASTADORNMENT + end + local + structure Ast = gs_69 + structure Bindings = gs_70 + structure Int = gs_10 + structure LargeInt = gs_29 + structure List = gs_21 + signature OLD_PRETTYPRINT = gs_22 + structure OldPrettyPrint = gs_23 + structure Option = gs_81 + signature PPASTADORNMENT = gs_91 + functor PPAstExtFn = gs_90 + structure PPLib = gs_88 + signature PP_AST = gs_86 + structure Pid = gs_66 + structure SourceMap = gs_17 + structure Tid = gs_63 + structure Tidtab = gs_73 + ast/pp/pp-ast-fn.sml + in + functor gs_92 = PPAstFn + end + local + structure Ast = gs_69 + signature PPASTADORNMENT = gs_91 + functor PPAstFn = gs_92 + ast/pp/pp-ast.sml + in + structure gs_93 = PPAst + end + local + structure Ast = gs_69 + ast/ctype-eq.sml + in + structure gs_94 = CTypeEq + end + local + structure Ast = gs_69 + structure Sizes = gs_78 + structure Tables = gs_74 + ast/sizeof-sig.sml + in + signature gs_95 = SIZEOF + end + local + structure Ast = gs_69 + structure LargeInt = gs_29 + structure Tables = gs_74 + ast/type-util-sig.sml + in + signature gs_96 = TYPE_UTIL + end + local + structure Ast = gs_69 + structure Bindings = gs_70 + structure Config = gs_4 + structure Int = gs_10 + structure List = gs_21 + structure PPAst = gs_93 + structure PPLib = gs_88 + structure Pid = gs_66 + structure Symbol = gs_65 + signature TYPE_UTIL = gs_96 + structure Tables = gs_74 + structure Tid = gs_63 + structure Tidtab = gs_73 + ast/type-util.sml + in + structure gs_97 = TypeUtil + end + local + structure Ast = gs_69 + functor BinaryMapFn = gs_71 + structure Bindings = gs_70 + structure Config = gs_4 + structure Int = gs_10 + structure LargeInt = gs_29 + structure List = gs_21 + structure Pid = gs_66 + signature SIZEOF = gs_95 + structure Sizes = gs_78 + structure Tables = gs_74 + structure TextIO = gs_0 + structure Tid = gs_63 + structure Tidtab = gs_73 + structure TypeUtil = gs_97 + ast/sizeof.sml + in + structure gs_98 = Sizeof + end + local + structure ParseTree = gs_32 + structure Real = gs_39 + structure Tid = gs_63 + ast/anonymous-structs.sml + in + structure gs_99 = AnonymousStructs + structure gs_100 = TyEq + end + local + structure Aid = gs_12 + structure Ast = gs_69 + structure Bindings = gs_70 + structure Tid = gs_63 + ast/initializer-normalizer-sig.sml + in + signature gs_101 = INITIALIZER_NORMALIZER + end + local + structure Aid = gs_12 + structure Ast = gs_69 + structure Bindings = gs_70 + signature INITIALIZER_NORMALIZER = gs_101 + structure LargeInt = gs_29 + structure SourceMap = gs_17 + structure String = gs_15 + structure Tid = gs_63 + ast/initializer-normalizer.sml + in + structure gs_102 = InitializerNormalizer + end + local + structure Aid = gs_12 + structure Aidtab = gs_13 + structure AnonymousStructs = gs_99 + structure Ast = gs_69 + signature BUILD_AST = gs_82 + functor BinaryMapFn = gs_71 + structure Bindings = gs_70 + structure CTypeEq = gs_94 + structure CnvExt = gs_84 + structure Config = gs_4 + structure Error = gs_25 + structure InitializerNormalizer = gs_102 + structure Int = gs_10 + structure LargeInt = gs_29 + structure List = gs_21 + structure ListPair = gs_80 + structure Option = gs_81 + structure PPAst = gs_93 + structure PPLib = gs_88 + structure ParseTree = gs_32 + structure ParseTreeExt = gs_30 + structure Pid = gs_66 + structure SimplifyAssignOps = gs_85 + structure Sizeof = gs_98 + structure Sizes = gs_78 + structure SourceMap = gs_17 + structure State = gs_76 + structure String = gs_15 + structure Symbol = gs_65 + structure Tables = gs_74 + structure TextIO = gs_0 + structure Tid = gs_63 + structure Tidtab = gs_73 + structure TyEq = gs_100 + structure TypeUtil = gs_97 + structure Word = gs_7 + ast/build-ast.sml + in + structure gs_103 = BuildAst + end + local + structure Ast = gs_69 + structure Bindings = gs_70 + structure BuildAst = gs_103 + structure Error = gs_25 + signature PARSE_TO_AST = gs_79 + structure PPAst = gs_93 + structure PPLib = gs_88 + structure Parser = gs_61 + structure Sizes = gs_78 + structure State = gs_76 + structure Tables = gs_74 + structure TextIO = gs_0 + structure Tidtab = gs_73 + ast/parse-to-ast.sml + in + structure gs_104 = ParseToAst + end + in + signature AST = gs_68 + structure Aidtab = gs_13 + structure Ast = gs_69 + structure Bindings = gs_70 + signature CONFIG = gs_3 + structure Config = gs_4 + signature PARSECONTROL = gs_2 + signature PARSER = gs_33 + signature PARSETREE = gs_31 + signature PARSE_TO_AST = gs_79 + structure PPAst = gs_93 + signature PP_AST = gs_86 + structure ParseToAst = gs_104 + structure ParseTree = gs_32 + structure Parser = gs_61 + structure Pid = gs_66 + signature SOURCE_MAP = gs_16 + structure Sizeof = gs_98 + structure Sizes = gs_78 + structure SourceMap = gs_17 + structure State = gs_76 + structure Symbol = gs_65 + signature TYPECHECKCONTROL = gs_1 + structure Tables = gs_74 + structure Tid = gs_63 + structure Tidtab = gs_73 + structure TypeUtil = gs_97 + signature UID = gs_8 + signature UIDTABIMP = gs_6 + end + end + + end diff -N -C 2 -r ckit/src/parser/grammar/c.lex.sml ckit-mlton/src/parser/grammar/c.lex.sml *** ckit/src/parser/grammar/c.lex.sml 2010-02-03 11:40:52.000000000 -0500 --- ckit-mlton/src/parser/grammar/c.lex.sml 2009-03-27 18:29:56.000000000 -0400 *************** *** 230,234 **** val yytable = ! #[ ] --- 230,234 ---- val yytable = ! Vector.fromList [ ] diff -N -C 2 -r ckit/src/parser/parse-tree-sig.sml ckit-mlton/src/parser/parse-tree-sig.sml *** ckit/src/parser/parse-tree-sig.sml 2010-02-03 11:40:53.000000000 -0500 --- ckit-mlton/src/parser/parse-tree-sig.sml 2009-03-27 18:28:04.000000000 -0400 *************** *** 28,33 **** | LshiftAssign | RshiftAssign | Uplus ! | SizeofType of ctype ! | OperatorExt of operatorExt and expression --- 28,35 ---- | LshiftAssign | RshiftAssign | Uplus ! | SizeofType of ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list} ! | OperatorExt of ! ParseTreeExt.operatorExt and expression *************** *** 41,48 **** | QuestionColon of expression * expression * expression | Call of expression * expression list ! | Cast of ctype * expression | InitList of expression list | MARKexpression of (SourceMap.location * expression) ! | ExprExt of expressionExt and specifier --- 43,57 ---- | QuestionColon of expression * expression * expression | Call of expression * expression list ! | Cast of ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list} * ! expression | InitList of expression list | MARKexpression of (SourceMap.location * expression) ! | ExprExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.expressionExt and specifier *************** *** 61,69 **** | Saturate | Nonsaturate ! | Array of expression * ctype ! | Pointer of ctype | Function of ! {retType : ctype, ! params : (decltype * declarator) list} | Enum of {tagOpt : string option, --- 70,82 ---- | Saturate | Nonsaturate ! | Array of ! expression * ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list} ! | Pointer of ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list} | Function of ! {retType : (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! params : ((* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list} * ! declarator) list} | Enum of {tagOpt : string option, *************** *** 73,77 **** {isStruct : bool, (* struct or union; true => struct *) tagOpt : string option, (* optional tag *) ! members: (ctype * (declarator * expression) list) list} (* member specs *) | TypedefName of string | StructTag of --- 86,91 ---- {isStruct : bool, (* struct or union; true => struct *) tagOpt : string option, (* optional tag *) ! members: ((* ctype *) {qualifiers : qualifier list, specifiers : specifier list} * ! (declarator * expression) list) list} (* member specs *) | TypedefName of string | StructTag of *************** *** 79,83 **** name : string} | EnumTag of string ! | SpecExt of specifierExt and declarator (* constructor suffix: "Decr" *) --- 93,102 ---- name : string} | EnumTag of string ! | SpecExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.specifierExt and declarator (* constructor suffix: "Decr" *) *************** *** 88,94 **** | PointerDecr of declarator | QualDecr of qualifier * declarator ! | FuncDecr of declarator * (decltype * declarator) list | MARKdeclarator of (SourceMap.location * declarator) ! | DecrExt of declaratorExt (* supports extensions of C in which expressions contain statements *) --- 107,121 ---- | PointerDecr of declarator | QualDecr of qualifier * declarator ! | FuncDecr of ! declarator * ! ((* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list} * ! declarator) list | MARKdeclarator of (SourceMap.location * declarator) ! | DecrExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.declaratorExt (* supports extensions of C in which expressions contain statements *) *************** *** 111,120 **** | Switch of expression * statement | MARKstatement of (SourceMap.location * statement) ! | StatExt of statementExt and declaration ! = Declaration of decltype * (declarator * expression) list | MARKdeclaration of (SourceMap.location * declaration) ! | DeclarationExt of declarationExt (* the top-level constructs in a translation unit (i.e. source file) *) --- 138,159 ---- | Switch of expression * statement | MARKstatement of (SourceMap.location * statement) ! | StatExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.statementExt and declaration ! = Declaration of ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list} * ! (declarator * expression) list | MARKdeclaration of (SourceMap.location * declaration) ! | DeclarationExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.declarationExt (* the top-level constructs in a translation unit (i.e. source file) *) *************** *** 122,133 **** = ExternalDecl of declaration | FunctionDef of ! {retType : decltype, (* return type *) ! funDecr : declarator, (* function name declarator *) ! krParams : declaration list, (* K&R-style parameter declarations *) ! body : statement} (* function body *) | MARKexternalDecl of (SourceMap.location * externalDecl) ! | ExternalDeclExt of externalDeclExt ! withtype ctype = {qualifiers : qualifier list, specifiers : specifier list} --- 161,177 ---- = ExternalDecl of declaration | FunctionDef of ! {retType : (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, (* return type *) ! funDecr : declarator, (* function name declarator *) ! krParams : declaration list, (* K&R-style parameter declarations *) ! body : statement (* function body *)} | MARKexternalDecl of (SourceMap.location * externalDecl) ! | ExternalDeclExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.externalDeclExt ! type ctype = {qualifiers : qualifier list, specifiers : specifier list} *************** *** 138,142 **** (* extension types for basic constructs *) ! and externalDeclExt = (specifier, declarator, ctype, decltype, operator, expression, statement) ParseTreeExt.externalDeclExt --- 182,186 ---- (* extension types for basic constructs *) ! type externalDeclExt = (specifier, declarator, ctype, decltype, operator, expression, statement) ParseTreeExt.externalDeclExt diff -N -C 2 -r ckit/src/parser/parse-tree.sml ckit-mlton/src/parser/parse-tree.sml *** ckit/src/parser/parse-tree.sml 2010-02-03 11:40:53.000000000 -0500 --- ckit-mlton/src/parser/parse-tree.sml 2009-03-27 18:28:04.000000000 -0400 *************** *** 24,29 **** | LshiftAssign | RshiftAssign | Uplus ! | SizeofType of ctype ! | OperatorExt of operatorExt and expression --- 24,31 ---- | LshiftAssign | RshiftAssign | Uplus ! | SizeofType of ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list} ! | OperatorExt of ! ParseTreeExt.operatorExt and expression *************** *** 37,44 **** | QuestionColon of expression * expression * expression | Call of expression * expression list ! | Cast of ctype * expression | InitList of expression list | MARKexpression of (SourceMap.location * expression) ! | ExprExt of expressionExt and specifier --- 39,53 ---- | QuestionColon of expression * expression * expression | Call of expression * expression list ! | Cast of ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list} * ! expression | InitList of expression list | MARKexpression of (SourceMap.location * expression) ! | ExprExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.expressionExt and specifier *************** *** 57,65 **** | Saturate | Nonsaturate ! | Array of expression * ctype ! | Pointer of ctype | Function of ! {retType : ctype, ! params : (decltype * declarator) list} | Enum of {tagOpt : string option, --- 66,78 ---- | Saturate | Nonsaturate ! | Array of ! expression * ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list} ! | Pointer of ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list} | Function of ! {retType : (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! params : ((* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list} * ! declarator) list} | Enum of {tagOpt : string option, *************** *** 69,73 **** {isStruct : bool, (* struct or union; true => struct *) tagOpt : string option, (* optional tag *) ! members: (ctype * (declarator * expression) list) list} (* member specs *) | TypedefName of string | StructTag of --- 82,87 ---- {isStruct : bool, (* struct or union; true => struct *) tagOpt : string option, (* optional tag *) ! members: ((* ctype *) {qualifiers : qualifier list, specifiers : specifier list} * ! (declarator * expression) list) list} (* member specs *) | TypedefName of string | StructTag of *************** *** 75,79 **** name : string} | EnumTag of string ! | SpecExt of specifierExt and declarator (* constructor suffix: "Decr" *) --- 89,98 ---- name : string} | EnumTag of string ! | SpecExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.specifierExt and declarator (* constructor suffix: "Decr" *) *************** *** 84,90 **** | PointerDecr of declarator | QualDecr of qualifier * declarator ! | FuncDecr of declarator * (decltype * declarator) list | MARKdeclarator of (SourceMap.location * declarator) ! | DecrExt of declaratorExt (* supports extensions of C in which expressions contain statements *) --- 103,117 ---- | PointerDecr of declarator | QualDecr of qualifier * declarator ! | FuncDecr of ! declarator * ! ((* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list} * ! declarator) list | MARKdeclarator of (SourceMap.location * declarator) ! | DecrExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.declaratorExt (* supports extensions of C in which expressions contain statements *) *************** *** 107,128 **** | Switch of expression * statement | MARKstatement of (SourceMap.location * statement) ! | StatExt of statementExt and declaration ! = Declaration of decltype * (declarator * expression) list | MARKdeclaration of (SourceMap.location * declaration) ! | DeclarationExt of declarationExt and externalDecl = ExternalDecl of declaration | FunctionDef of (* record? *) ! {retType : decltype, (* return type *) ! funDecr : declarator, (* function name declarator *) ! krParams : declaration list, (* K&R-style parameter declarations *) ! body : statement} (* function body *) | MARKexternalDecl of (SourceMap.location * externalDecl) ! | ExternalDeclExt of externalDeclExt ! withtype ctype = {qualifiers : qualifier list, specifiers : specifier list} --- 134,172 ---- | Switch of expression * statement | MARKstatement of (SourceMap.location * statement) ! | StatExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.statementExt and declaration ! = Declaration of ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list} * ! (declarator * expression) list | MARKdeclaration of (SourceMap.location * declaration) ! | DeclarationExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.declarationExt and externalDecl = ExternalDecl of declaration | FunctionDef of (* record? *) ! {retType : (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, (* return type *) ! funDecr : declarator, (* function name declarator *) ! krParams : declaration list, (* K&R-style parameter declarations *) ! body : statement (* function body *)} | MARKexternalDecl of (SourceMap.location * externalDecl) ! | ExternalDeclExt of ! (specifier, declarator, ! (* ctype *) {qualifiers : qualifier list, specifiers : specifier list}, ! (* decltype *) {qualifiers : qualifier list, specifiers : specifier list, storage : storage list}, ! operator, expression, statement) ! ParseTreeExt.externalDeclExt ! type ctype = {qualifiers : qualifier list, specifiers : specifier list} *************** *** 132,136 **** storage : storage list} ! and externalDeclExt = (specifier, declarator, ctype, decltype, operator, expression, statement) ParseTreeExt.externalDeclExt --- 176,180 ---- storage : storage list} ! type externalDeclExt = (specifier, declarator, ctype, decltype, operator, expression, statement) ParseTreeExt.externalDeclExt mlton-20100608/lib/ckit-lib/ckit.tgz0000644000076600000240000060472611404435641015524 0ustar mtfstaff‹w§iKì]msÛF’ö×̯˜Õ‡‹´G–(ÅÆQ,Ó‰®dÙgÑ•M¥RW 0ã…‹IÜ”ÿû=Ý3 @R’%˹l„ÍÚ0èééîé·y(¢²ÿäa¯§¸žíïãïݽý=Ø{ö”ï›ë îvñ¿ý§Ïž<ÝÙÙì?‘ûÌ_UQú¹”O~Ë#5‹×+Ê*Tiù%Xú’W@ú³à!màÓõ¿;xºû¨ÿ/qÕú/³0{ 9HÁßìí­ÓÿÎþ³Zÿ{»·3Øy¶÷D>} ~Z×_\ÿ;ž„ö«K“ÔBÑyê—U® é§¡ÌÊ™Êå4ŠU!„”s?/T.þSšÛe®Ô6ÞñŠ$–r“oJº)s5õË(K·šwr;¾!دÊ(æ*ϳfÝ)²*TâÏÝ×ü¢ìÏç4a®Êr!çy”–QzN¶ð„çÛøÜy‡Ÿ8·¥¹6ýIQæ~PÊb†¯Ö3¿]f-ºüvéO Ÿ¡,£°'çô‡OY"ó, ‰3=h‹8)ò€_ÔK+¼ Bìzx!Fç4âÂÏ#?- ×7«ÜpBïé[-Šè_ªhÝÑìbh™gqëI¹˜ãÁL– 1ð¤º*UZ`¶Fåýæ^ÿªOk¾’ßË '=ÏÛr¦csÀØ®®Z¯×ZX1P¯/½è>‹Õ ñ?x|Òã<Ü6ŸÎóD/.û R-lþyREqH*k‰ŠøÆb·×_ò'Ê7°ˆÝgrg¸»?ÜÛ•;ß~û­\ÿŽ/íV¶Cÿ´jYª¢„‘f ±µ<šýÞøæªýv¡ò‹H]z³2¹Æ ÞåºÞÿï~3À³¶ÿߺ·ÿèÿ¿Äõüo/ß~;’?Ž_ŸÈ·ï_œÉí~ÿx4~Õï¿¿ä'ýþètã@<'ë8À>z>S~xÀêy•±: K’oŒ=ïë›4²¯‡ÒÇI.@$€ UNÔvøµ¡<”¯rø"9BÌ™f¹<’Q*Ï^ŸàåŒë7o ²~€×'pÝ•*ĨžÍÄ›TVéÜQr¹Ø„Ì•q´=¹È*Y̲*eå“+–a”« Ìòü6Ãæ† èËw£Ã—¯G*pkža[Oâ… v|DS„j®´Ç§}±%šTì¿=ærŒÛ­™É¥—~”üÆ4‹ãì’HÕÄ!>ÏCÿyX˜¸‰Ïᜠ˜`¾ønO6a¸ðx8»VÛ t+± K?™¾ñ]ˆUÅS$Ió؇-ÁƒÇ’Í¡X– óè‚–>­Ò ! .’,¬àÇžY¨Ë‹¥r~Qpz½"ÝÝ2rj9¨B™ BUpt¤òD‰ K’,…¬ÈnØ ×¼xÆ÷`Žðæ]^š]9”ä;1Ïökå`éE•†±2\Ã~÷ŒgŦ´MàPë9ôµ#gƒÍ!Œ@-Yƒø‰6Ÿ?ŸÇ‘bŸä[>6‰p½I˜Pê'd½QiÉAÔbÂìÉl ‘“E²1Ól˜zÁÝU ͆6)º¬ŸËï…)T~÷I&F=ñ*¤ºCù"âSx¸a>Ë1?ó*þ c¹´:ʪàNpf•bdëž_]Eqäç‹cð=ä ÇdÀC9æ†&>NCu5f¢_}%R•ëG¨ôbH‘ºT^±HÀÌÇÖ+]"|*¬9sÆÑA#k‘F›«|«ç¾¢eÑy‹QâM#¸). ðÄ/aó¢ûœö)Ô7£\&ÊOY¨î,;3t4ìDZ.c ©R¾‹5†‰?iÅÔ/MT³Nª5‹«™ëæ1ãî1“Õ¯3‹o¤ÍMM ±@¡ªñjdÐÌ“[éÒxx&SûtÄ—^83±kÁÀÏ‘Q"ÏãlâÇPr2ÉâÖæÁf&Ç"“*.·yçÕ+¤øÖµôµ5ÿ²»Ö¿I×½TpÁKîä­|mŸÑtL™W€#³pÏN;hMë:L:"ëðØFx[Ðô]?GÖMU3R…ø¥ bGE›?ä<çªk³ ! ‰_¦“¯T[=¹¯áÎ Ò%‘71@;ÙÆ±"øröãl^–¥eã:9JÍ'µmêœb«ãO[9/›^²²!„áëä •Qtº-ÆJ³ù¶‰‡ÍkdÅÂIMhV¶³ÎŠÛѲ\7Pƒ%Q¶R³%šDˆ»ZýVGK“1MfF`]{Ðá‘Ó5˜ÑgÇp yPc®IÖ8›ŽRð²*´„Ó*™P<Õ¹RáéÁQN}ΞÚã9‰3š–›—yT‚(ö'É2‰!Ã+^>.ü $i û”ÃÚ¤ «ÊyUj—ÙÝ åRÛ…åßín vÅ<ª H¢äê7k$¯D»ë Îó,Lî¡}aC³}]JYu†f)…ÕXFR0WÈŽÊÚœõ? #A8t’bqÃále®ßî꺪Iv”ì_'uʬ÷Ÿ›¿PFH©•GåZ 4¹7ߥ[ºK _šR~8E8ùÌ<0zíéôáÆY›f¿º©o^'Ð’S7_&0øþØO(¼ˆ™—P>n„AEÊ×~ºpžA phNæ©È“Mt"‡ÐT<¯XOÊ;o¿lªhcÐ>[z2‰ÒVF%ÈM¯Lâó-ý³(‰°ý©àJ2l"È8´EEQ™ßÃ\×8–C—;T®oRpw¨¹ŽF:w€K`âǤaH~æSζ†'*ðÉïš· è¦4égª.çQ² Cè‹*Dzè‚êFmõ3Îß*óSŽIA„MÔÓãÌ"ŒhRÊtý¢ÈZPôFPY”;úì!-¹ØÉYJoiü—fHã•OÝ54åT.R`g")‹¦tlË£§ ÜK^)Q¥6 îWQ1å¥ÂÓ–³×vIr“ )È‘…Ô±h÷NLë5Yu0ósyõ}œnnÉßuVmX¦ÔÆ<”ö‘”WòïõÍ‚ÿ0©ëŠƆz<ÌÄ» k Nó°„äCæ÷S¸ª ¤¦TçÔ]ù1»Dœ2Bœ©†+ÒYBá"„‹Õr+ç8?S9¥(ísTn„Õôž`2~É}j×6¢ô"‹/ØÑ¡¬+c¥©ù:Ì[´Û;‚´À“ó,WAvžÒ©„Ùˆ´Š~´è:ßæ²‰Ö‡ì+ Ú\˜À­› ìøéG'ƒ7%pš]’óJÌZåͳá íTeœe|ê=Êz«´Í9‚çaÞ:o:–ÈNÕ$ÀéE± ß)Â}YÇÀ›ùðÓŠû4ÆÊ!‰ãö¦¸TÚ3ÄpA¥hxÂB³T™DW¿6…¨{z«±û½ÌrÄ!ë8ߤñàî?«ˆ,LÔÌ€¥ìø •DACkt’Á›[˜¤ÐòšTÓ)I4Ó‚ö-1yINa¢´„`KñÂiMÔHi—ö¶°>ŒŒ”zâ4+M©Õ¸œÈ3Ò&œ½ÇX]à¡°»Ö´ƒŠÌ±)Ár7±k"têa Ë tmT›Ü¥µKsBäÙÁ§PWQÉ*;Lu#×µ[oqZÆæŒí¹@Q/’FEBÓØ`\o,E­µµZ^´P'¯ÈÌMjMY‰“ÛÜ1;ÝìH6Ù‘N3\c.' ­‘ Îu‰žYmM†W}3ˆ}ømÿ\9'‡lÑb 2žÅ}îîóžpûÅÙª$C¹ñ2L%´=̺ý(l÷; µØhLÕ‰nþPb–_h[[ãØ´7ë96Ww%­­cÏnk×Poeð5rÖ­ ,ÿ,㢚Ï3:³‘½bOƺFÔ7@hCPjκ˸!±N¶KyŸpNX×´pŸ ÖöšUn¨dŽZ¶~wCLu»5 ©ãx¤ULua1”K‡¦.t-¸'›|âJçMÝÔÎZtÒã’´ªNPͱ®9ãh]“왊ß}Ÿ+®%Ä@¯Ô<Ùæ†[yÆÙ:’­"®§}BMÊzÒk«åª;œôד‡¶l8ÓeÃØÀœ¿>Û‚# ¥íj7E½÷AÍÙÖ©ö×r()Ûþ†ÄÅã ÚÒK]éúàçëb ^’û):ù·1®iIÉãšùíÌÂmŽÛ8¢ü`fÃBâÿFU×äÏù0 Ĩ֥,¤è '¥Ó[έ׷t¤õ©GóÏJÙ¤I7¥ÊŠ,ˆ8 ¸ŒÊM›x¦¢Vh`¼›m6Õã[Ý%~ÕðÚïQvEyæn%Ê ‡)õŒ8ò8"%2úl¤ž•v°>¶œü¦(,ošöŸ³Q3µÇFÙºQ›ì° ¶tœdwÑÇìY*&‘Ò¹¨)σukºÔo‰"rLÅŠ »n+TlΣ°ØòtuÃñ‡íìÑÓ”›ÒR:…–=÷0©W(U4Ÿàœ9¥ ®kŽ×êÊaߢË÷Rÿv³d¦Ûû¦®jÛBéèP5‹MïùLWLC·tr$¿Ä½•4Õ$´AÁ(Ö…¦ì'²Ô`•Gf3 å« ÌáéÙñ‘pSy†ÂŽìÕt•iººñKÒ:‡Áå¾NeFËc„;ys†GM[*·¹O?æ:¯b8àw­Ä¡0ø‹0Sº' É K®VÁ–«'^FK1 ŠUàÇØñ¤Dj`”‘s!õHÓqU§~Ùt F4ÁlEHÃÌLÖKÊa¸wδnÌ””TçÁ €¶;ÓXš#æ¶›d»l@¯rû“~lŒ°°áC[¯6ŠU†-¯7ìÆ¸Ž)i‚\þežRÌÀGS­[æ|Š…”ɨyGhüB ƒ QÄQ¢òmáš¶–£~u¢Î£Ô!V¯.5Ó³G¯g(ê˜2 Ýçó‹H—e\°B=ñcÆÝŠõù,|ÎfﺔÖ:ôi5ÊSÚÓ·ù›ßAÉMöí·!½äYN³Rp§„ku} 8­ìaͤ:?çF`•ÏQÃ}pWÓø¡¨¨ûo¹\aŽÚÎ$5\øÁ”î £µY{òbÊRÑ…"c}Œ6†>˜`éxr½ÆÐ„Ú&5ii@¯Íx¡ÜÀ,v™{“oßžDÏÆø·Qø©qŽ,&§ÊÍ)Þ¨ C«ßýs®ÛQ`Q›¤ÕxéDÇ·aˆ$äÙîjw÷6꟦͖›™Ü‡#ÚÒ§l[÷‹²C¡p,¾ûZ o¿ã: €î{ð´í ü0Ë9”­œÆì²®ûp‰yQïKƒ«g‚˜äº†{¢ë$ÃßéóeÑèóJñ–6ížG;tûýøøäLþrjóŒ_k UþÚÔ¥+\ì6•ËpIÙ|¡½}²«lÊýf$ö>ziFÛŸ¬æV¾R—"ÿHãš{Ίø :1u½$L Øß¯÷¹æ™Ïr:"EDq‹P·íɦVÝÒ uŠ)å&_ëÆ ]OjïÁ¶X7zTm#ŸQŸêÀìw[[ëàM}ÀAÚ”«FÅò¶Ób\ê„xB#vg¹îšS¯ƒç¾œåjúýFâGq™ ÃIò_ÄåHÞDÅñvŒz0ƒ—TŒ¿öƒÿ©Q?ïûø¿!#žÿm{[é¦<²Tš/U å3¹³3ă]9:[½>›%%eJHUøæ )4ÉBN¥ÚDö‡ƒo‡;ƒšˆK€ºßô:!Ž Î¸¯ÑÊ4Æúÿóµ„ÿ€9nÀÿï=]Âÿï=}öˆÿÿ"W ¿÷æt,G§/å«7ïä‘<>%üõußá/¼4Ÿþ ÏÆ‡ïÆ£—+^XþÝ1ùÂô¼‡R.a¡;P|ÉðM¾îį¿6”wAàß|߯Ýßq3ØþO³¿ aÏßÝ{F{`üãHï$l¤Õ{GZcM4]è\ízÔ4&Ú®”èM@iŠöŽ^‹‡–ëðТt2Ÿ+ÑÏ賆nÜþÌã— Ð|w ZoÑOƒBK÷º-W]«pÒ!­«„ëÐFŸøìHìóáœ[ÿœ°fi5ô (fÒσ–±³wWxö-ÙEéRˆ¥ )¾|Xþ½ 5EšžÐ{Ò½$š[º¼N -IÌønke5ÇtÂÆ nó%”Zö&¦¥ÿŸdÄñ‚!Ê«nˆ7ø`Ý®¯¿YQ÷·MqG[Ò]ùÔrùC²£Íü}÷ÛŸêS¾²NÒO†Ë²ýHß§0䬰¯fóuO–Ý€ü~uÝÜ ÏŽÍ"Öº’ éÒíRâ)Gƒ±®ÑÒâ¨}þ ¡¿¢{•sbå8’3Ít•ë‰eXz ³„}шtSîsÿ’ aÁbBIݾ6)—þ®|lè’Õ÷\[Þ²’sñ÷ZhY øvÎøk¶9ípºÂ5HÓ6èRý•ù³ŸÏÆ£×Hß½?¿7ZûÅ#^ûO‚׆Fw8•;ýcôN¢(z{øîlôN<â³??>ûœýWg ʶˆì%8¶Æb×@ìY±_óMo}õY!Ö†ú¨êGHõ#¤úRý¹!ÕA<õçS»®äÎ`꺹L-n¦–Ÿ¦kÁÔëø¿L-,˜Zþq`jnI:`jj%Z,uý›Ïn¢ÊÔ5µUøé¡¼<Ýúl7B§‡òzÜt›Ú:ÔôP®‡LSò½+_ ”:<£°:þCŽßFg J ù‹÷Ç'/·qC<£ÿ­áÑØèÏŽ–·EFc?ïx÷FEkˆ’la£qk×»0Z:Àh§¹ÿéèhÙFG^? "݈j·¬)}"NZÖ8isÂq[´ôM R¦v Ä´¼bºùêìzØ´ì¦͚ðçÀ»7rº7»|Z¶áÓÖî‚¡–Kj«ÅORË@êŽ o¦–-0µ9×úDDµÝᆃ»¢ªëðaéÜYm¬èîøj¼¿çÝ\-kpµ5À;!¬…j2÷ÃY3‰Ï¶62¾-äºNlí¯q]´îf±× ¬5‘V7”wXËe€õêØkQ×Ò©¸Ìï©íK:»xÝüÖD)™£ók|õâFÎQÙ&Ɖ=®Œ§I¹\éð–6&Z·ÇÕ)þÞŹ73xÅæÁ5…=r¿ŽOS”§×ë…v:súƒ-Э Q­œ`CPÄL{ÜÛc>¸ã‡ÖG¶øUðQßÓóø<áݺ€iXY‚>‘uߤ¢B}œHЬtl²qjOáx)ÒŸâ¥æQ’¤’Á-¿À¤DgÓ¡èÄÍ™äçv|yDœ=æpǵVM¾Ú®ÚhÔÉŽ&ãИš·¶.Ÿ•ûh¬<„½|Ù¼>q¤qÅ7schëlhl‘'¦“¼Ÿì6Ù<1€¼^ÇPâhq{ÖŸæ\#ª«*øâp:Á:º†Õä]Ú›@­¿Ü¿–c„çÒcý*nlzâBž]ÏÛdà‘ã5ÂÖ {r–ƒììíuv:fÈEt/ø‘@柉‚ÔÜŽ&Røàð`W.x¾Ø5ïëšt<éôP4ä±^'lf¿¶¹¥ˆÕå¯óý4÷ÀBÜf™lU–;à¯"oÈ™ÔWí†/Ê`‚cå†Ú­ƒ~6Ì µk†{#÷Mÿmš&­‡ýˆBÖ@EšDŸ ÔaÏÒõJƧYžøúÑb¼CâÿiûÕÞöÓýÝÑU>ÙéÇyÞÆ6à2x÷ïÝWÔÂÌZ¤²oƒ@ˆ%ëØ™•2Ó¦No±<ág —N5гØbLFè±OuƒªûÛOw÷‚œpÏvŸ•Üþ¾ºLÄz3Ÿ|xgµ³€2·¦é5ZtË®ˆBmÌ–á LfšöZ@CàÏU¯ÜS«špQG2® ‘á¤ö˜ip&b SÕ£BWЙ†}KÍtØ "Àé'—6“p$ó(,kgè=RÄk™Ô4ðÄRGÑÚ29*žÃ9a¥jäå³W°¨i¡×â0§W6oa<&E1³ ÷±]f€§\îóÔµØÜc—âÓ¤_Ä«Ça^+4Î꓃÷"A/Ðà» h Aþ„[É$ÜJè'í#½àìv43¤¢ bÔqBh¢ ûpÈ5 v4 NdBTuüš8©&ˆNÅRP-¤=ªRZiï1r•Ò2YYÐCê"‰O fxÌ­rùoõ©Ðÿw¬r‹û1m,Êÿ}ÿAAÿ·ukó‹þï³|,ÝÉF—cÈ4hÅ¡:„Uú ˜0íO!çªé$Ý‹aÖÏÎÁ‚ X'ÙÜ•!mßÒê@„­ÅinãkqcÍ29G€'ß½§úuú£®BÄX1,°‡™í£Îö³ÃW/à,Ó›i‹«­Š˜ºëìÿ¶¥Ñ–eMÜ`ÝÀÊ|)[Ÿ&úIØcûHŒ¸hSÛ•йz0ò®òîŸßoÀõù¿ä3ƒÿ«ôë߯"þÿÍæ£ÂýÏ·÷áþï ÿÿôŸ?˜ÿ{ößpü¼NÜÍg=î_Áz×M©DÈA×WWJ%NÓa6šU}ÊïÜyCí7êÑ-Gm·ªâ^eO`ów©cÛ#ÀJË„]µÏ°·ðNmOÓ9åOÓr¿¿a-9 G!º!r“ ‡·º4“h.èQ8Ëåš¿›ösrQóz›¼C@gõï–þ wÿ'ÓÏ;jc>ÿtóÑýÿÿæþ£/òÿgùܘÿ£‹]6®•Ožñ‚ÖY ØGZÐ ¥ð:>9±œ• Í :¨Õ°ÿ†Æøôeñi…I‚~ÿÔ¾–N…ŠÛÛxaª;[,±+%ìú„Aj–\ªÜ”õü¸f‹î§§0Ìl” ùÿ¯»'Ø»QnQ¿å· êzA†ÆÍpßžIavbç— ± 8ÄE꿲.+:ÑêþE³D­5§vpõê0Øoë÷ŒƒÞóúÛ*AÕ ]bñĈÅÎs“¹Yí¿ŒÇÉßú‹¦ZTóe^Í(Sw÷ƒçÉd‡Ä$¹vhtáwIÛ¯Ý<§ùËÌ®Õô½¿{î-êÌV>^C¨å¯O„ò<¡˜áˆ—å @IW¡ŠŸ¡>òešÛ§í'¥¹øºæ5¼Ì‹t+ÊmÔPí×IÁ«¥ªÀ:x–¾M{IU{TàEÖ3Õ]ùÿ¨À÷3£À*°?³ÀßB2 B[@Ì*ñ7.±ûfV#m.q¼™Qâ+.~–Õ%þüg*q8žÕʇTâi:BU%\h§ªWàïvÿ¨(ð;##¿HÏ&•È`„¾šYâ Ï Ø6:JÏ 3F ˜¬"³¶¢³9åÖÛŽÜ\³•D×vT7·ÜÿÇå,¦æ–û½-ç‹UNŽ'¹ðþÜÖsÀE+g¢­§bvÁ'Bâî@rÊ«Ñîrê˜RÅBŸ9žÁf¦e.3&sÁ®CtUޝèxï_½Úýl§^áKHÔ‘ƒC¢{½}Ü9ÄWîɳÝçÛÇû~8gHðñ#ÃðD !ç52û²8¶½ïvŸ»ó]9>àçðt:ä#Kàù9‡~"D(pfŸÌì¾,ôè9„úÙ;<ØÞ§N9y?ÿp¸¿{püb1®I [ƒ¨Oñd6šâIKÛãWÛ]ÆSÎà|‡,5K™%ûdYÍp=«õõÌΤ¯‹ ç‡íW܈–èºpôÃá«÷ï"OÜ‹½ƒïg5»ÊÜãýÃïùq?žÏ ïLPàùþá67tÖÏbñÙáñS^›½lzÚO˜ê-”"K¬Ý×U»P”öG“F>yíOœÞŠ®ŸYQ ²ìûmã—ßêÚî¯ÄNÙ€  ª?èúpû7gõV ¬?pHQ™óáóǪ[hÕ«aÆp Ç­g4 S¡Xª?Öö/„ÐÇd¨öŒÙ™3[Œ(m`æÜ Å5W–æ-å“EØu&¡ƒñ¦Q½¢¿ÕæŒÉDÑŒ vÀ‰¤½Üâ´ŽÃãññðÎxxù&þ"‚ÇZ†;d w}mgÀZF }Û£ÑN 3¡¡"Ø·k 2^lqoŽÛø{Ì¿ëô›ŒƒÁwžÛa,Š,>P#4»×ÃÓ»i"¸vA‚™ÓìG¶Qš=+4Fš‹'gOÙPtaŸ4ìÛY`¢Z™šf‚JÕÍ¥CÕa\÷Ì'0Dáèh&§Å)8ÛÍ,? †0£8”vŠž%€ž`_ê%kä9àë¾×@C÷çð7Z¬ÃaF29]‚Ù!šðéª,¥Ÿ2ОâJ fç­}Žh~ ¾…£ÇU>vÞ[.Þ»vÚúÊ»S×µ¥k?Éz”}†¨](WJÒç57ìæ—­} !-›ÄFpñ4H ›×•CšGÆþ¹…ôÁa9úà‹;s?µ‹••*ÿH|@Mí™ý=ØCù †úŒÙDuˆ[zö®@‘ €„ÖdÑ?GNé16$/uÇ‹ô]–Ýø6L4T!hºàñ×jF+-ñúÁÎòÔ¹S°£Kâ4¡*¾Œ¿(òªæ÷³Ð£±ÃÒÃi÷L¡l0 QšZ ¦Dˆ¨tçÃbª|!/,´kþ¹¢t÷PW¤':P¥YÛKH;•˜QÔ ;+ܤ"!ÙÒ7rPw˜ :&Y3j«~Hó)ÆßÆ„ŒÝž'‹î“¼NaÆžDdž¹›µJwJŠ@è’駪> Ê\åq/{G>fPâZ¹»-”!ªË<bȤ„Té s¤Ðãev¦ˆ«^ @kvOF¯ŒÁ¤&ZI+„dlªUŒ¨ŸöZµß+ÓÈy­t * ïFZzý¸æŽnŠxÀØ•e¢Ý ú_«IõE­f¸–0éuõâ¡×Ÿ¢£¤¥^ØSÇù>mGŠÇ¸–ìÂUßU@z ‡ŒnM×e”WgèŒMxaËjp‚­÷²›5±,"?.Êë2òF´†î7èï&ÿÝr#Ÿ1pиî}Äâ½?kõš;¾ù)oÝ9Ña, HÁ‡Q#*ioN´¥ÿÚZHa:\¶1c­?*8Ó¼fo_Ucݱ¼Œ:õÓO0ÔàÎ øf8ãêHøGaàÅ©'$äð±ã73FÃ!ñ?à¾Ï&‘Ö¦y…j· Ë2 {:Nâ×Uvª§ðâqMoþ ­œVòwù.ÿ ÄW *º.%’¿ †²ô ÷Î:è³Ì•žÝí.bnÍݨ׻è#=¿ÿnþ÷Àý1¸Ó[ôf9GïÒI÷"œÒɹè 9i—ÒÙ#óšÑ_¹ÁRë÷45Ã¥XŒîº¹6#y«—QƒØRƒíÿd{^¯ìvâ/‰Í2jóv|rªîÚሠ®²i4’ ÎNz(•“$BJ‡(xèQ{bú Úý'¥MMq±¸OǾœªµNT4÷ETÐP½y÷ûD«ö¿àU˜,T!-¦ÅPáìö´_3hÀ¶˜Ä•¥Æñd;7ÿ,0wó«7y|-Ì‹ÿoSÛK ;˜¶9J¬àleæ-µ^ÏÓ™Ú——ÆÎ,©Ø|gn¾ìgIÁ¦u `[®Æ«êQ*\±O!éVšÓ‘™(jÏÕltoÞ`P;Ù`—ÇTìÆ-Øó¬5înÊë%YâhzZ5AACsØÕÌNÿrwþ­Ôi¾BäTîpýÍÜ)›¡œWqµüê°›â»?b OînÏp>²m{ÀÌÎWºØÞnTK¡¸×~D÷þüi»G®ÏÅþ°UQ ³Y_®¯7èÒ}We¾³õÍ!ß„q¢f4å±Ò(Íœa ò¿w Çà(öÕ Ç¸A_¡—óœ@ëÔ¢øíÏ/|#,Õe,•h2eÍÄÑ@K‡¨“®Úæ[-<'}Úßë™´çåÌ D0°áNÍž”Ù•.Ù\íZg‹§9ŒtÆ€)_îG£­¶jˆ±pÆIôé' £ôÑÇ »p\“ëÀÈÅž¨ùà µ\/Ü”ÄCÎ)âÝZ•iEÕY¯X ßîה兿\úžÑÉÜ-'>¥À´˜½–n7v`‚Mâü|LÎÙ8W—¥å£ÈÜn/} ¹ª>…\—O!®WÞ»m§•±j|pwĈC´á} §êSY\4 /¸eóý lYìRM{yA'%÷·W Èט%îwƒ’Ä_Œä!팄´ûÊŠŒ®“½iú8™t.©^ç’Í‘lY»Í !y¼¼ż³`Õá+°½vŽ!´ýPG0;û_Q ÚBè-EU·0o¶M—uX<ôa©•'¸F>]dBr&c©´%SîåïQ¯K6ãx-=Û·(Äü‡°1Õ=·?±¼7(J|MË,ù FöAžÁE~ Æ‹öÈŒX25U•ö_È9£ú¨NhTsXôµìÞôÊp®ž’™ çñ³WbIë'"ÉÐäêq•‘e©˜Ç£®lýBSRSHu{²ͼԎ©KzÁξüø½Gyä.ɯLIûV¤ö&,Ð÷sÞÏ(¥FoËç´ÒÐ—æ Øêª$ó*¦Ç¶»&RIÕj !»•2ûÉۤ߀í Y£dÕÐu#É|ú ©@ò®wã³pO2sž¾M Mv6ÄtÈÆe@€2`Qëz =TÉ\Ü2Ý_õ›|9ïK¬*<+› ôG×S“ð z¥¡Ï­3«Ë* ¦íw®êšþݱ~¥wQ_D=]-Å­ôÅØb†Þïñ]™oYSŒ¿)…ªp=€\Y«¨ª.Õ …ë’~Zh¤ªxñ«²«qBŒ»/Á¤ÿû~fÄÿ¼³ØÏðYÿùÁýÍRüÏ­­/ñ??ËçÆñ?uÜbŠå Šq,Wo›´ ?-ÊÄ5NÎÙëõ£S£âƒm°.Ñ)†jîPø)DëWR$CÍCÉ2Ø!4|e¹ÔTÄÝ[÷A¢ê“–ƒåÃL)>4‰GÇ®Äл+»‚¹vav%C¯g*yVð„ö`÷i[p©ösÇŽÑÁÜ9giWLÙð/DŠzÅLM\É‚*ˆfÙùÒáÁCiáf0¦T±ˆžªR•WbùÎèˆè3¤“刯°¢J‚Y¶OA÷Y‚ͲڭVPø,, «”z¦¤¡e{äÛ¨–ÖÅX5¨í|b‚ÏbP1:=Qäñ/òÙÿÒOµü÷9ó¿ßßÜúf³”ÿýÑæùïs|n$ÿ­BTËP%òî"í^˜Ôø—Æ ˜ô-^ ÷i®†YCòe£Å£ò›J㡾%]äE¯ *Ûy©“p•Þ¾|e‡ÍÅ'òÊY™_×™t©ÜØG‡z@>AâhSêÁ"w·Ö¶²»‘y!E¶_“ùz;Uw•¯Òayæ%ŠþóáÌ íðgý‹"áî?ÿÇeœž]Ú-Ù(¿‹˜ü·Íàÿ›¾½ÿ ˜ÿéÑ£/ùŸ>ËçÆç[a™XNÄ‹8º‹Å–+L愇#¸IÌ^o§½ÞZf¾Á Ô7ÆÇûY·ªõ}Ò¬Û³Xïèrp½jæ}¢Ñ8ëÚ=€.6L66Ì•ÝG×#s“þlÕ¹§ôÑµÌÆ†º ËLúà,»O÷"±«exNž¤Ó´ßÃXÏdrÙöƘé ÆãKÈüÁÇ9_{ …á6®3}±ü"›ö{6Ý>âHx§‰ý’Ûä´?ñpÔ'iž7Í×_¿·E»äH(ÎCôµ`G\Åß7Ìf}6°÷_·“›AK* ‚1yÉŒ1ö²¡ÝæÏ@´X4º÷_½LÄ¿¼0hR,Ž»ñ89›ö9z†d³M “w{GENÏÍŸ<Âãj.8pÀÜlÙO‡“_üöØ\›õÑcU¬i?êçhã •MûúkWî<!°€É€;Œ6-Ø|ÙzŒ?Û‚¶±HJEà <Øâ ¼Ì·;?¾:j™ƒä­Eý‰ýÏÄDÃîÅ¿B‚èxܽhž&ýþF?>Íí} ¢óôY˼€•6»ñá9´ Nd9*PÄig±uUÅ`¢ù‚»¿ÄbÝÇ^çˆ^{½Š‡GÓÓŠ§h}Zñ :«žg+©Û—æ,ÃEêø8YІ~ɵ#H‘Å…”¿n˜Ñ4¿è F?ÅãüzÅço¡úšy‘ÿ$JÀäÒ…3vEl‰tH&B*J´&Û JáùZôÞ.å÷[a™¥zHcŽiM!У·©qD<8*Z§nh$Î } vÝ …Ý2ïî{v† Þ£MC€¸Þ­|8š,‚ E,/ƒRóЏÐìÆ#ªì‹ëŒÅ ¼é\F39}Lñ;ñpmbþÜÆ.µqÖ³¢Ø ÂÍ8œâ&—-Ë /Ñ8Dz£~rn§Þî¶½ÌDA^:Èr`ó!f^oae ¦ân6´ oÂï1á;½ÌŽ{ÃÖ ¶Zv/ž$Æ©Ès†ýÒ®Õ!D+©ÀòÁAË•†ÀÀ¥ ðu È É`”aw,ô»à6˜v-ÆìÐ!Y&Ý•£¹“B&¼´-˜Õ`érüO˜øÖ!“Rx#>ù¹öÜPFAï‹Å'—¾$˜\ºÙwû [äát‚…‚] Þ[v•àN'A6‹ÿÔi †8|`9ãhE‘Ñž›_€&/§Y¿™þ#@4XM•ÁÔo”y>†2•\p` ÙõÚ÷IшÙ‡«++:Ï¡½!AÿϹ˜zÇ“©JqiÄk¸ Çv­=?>°œ®ŸÆp.¬.ª_«ÎB~,Åñ¼«¼d¾áPÜY©¢€§ƒä…°-í®|*‘f®háäX'*×!vyÈÌfëu—”Òîf{VkºÔÖÌR„ Ť9½%Ææª'D™¸‹ ±AìÔkPÓðõšY^)6$áU—7#”4yƒ´…Û e1¤6DÑk ^/ÙHÎÎ,]Â#% *j÷«•‰¯-¹û] 4+VfWHc£aAey4P'e#7‡©ÍFdÐûͶÁF  z±¥^l]à •OÄõxKwÙ‘À(sFÏ¥›<=ðOÌóßO«‡³9Ò–‡´¥ mÍ€´å!1€Â  ï¤4R_¡ˆ‘H ,®‡ˆõN©ÀiÝ!8X™d½ 䆡gФ?ÁꄃQˆ_ÅænáB(>Öë1d¶nmŽÜâ”ýÁõEɈ§^‚ʆaŠØ²HûÌnÐMß^°ÿ7Œè€Õ™°êÕí£ÈJí\»ìÌ´ 9+OGÏhsk¹FÁÏ5éÔ ÕM“ëC Õ'.ya¹Uíž\)ƒþ„|#vyÂ/³vî67ã&5X skmùZÁ tRœöšYG)‘*öœþ„äÊ)æ6Bß/Z@³"ah7g»àºÝ©]Óa,е¢@+³ö»aÆŒ<‚A( Xna[T‡¬ÙJ+Q¤¸2!EÔ;í?‘=s›úc+é}Ý6Ã/þâw© ój¿E@I;6ó¨èÐÂãšk¬ÄFî Z"᮸6cÚá?áBØjÈ‹±z½²•Y\Ñ6Ç…t½3+ä÷¹fp”sX *9þ®€; ÿÕ‡ #‚_nêEg5{îßýõcC3ßîb®çnÍ~ix A¯®|<¬Ì%­jòp½Ú\D+7§‹•åH¢êéV£pÜg „Ázý¶ô³ (S䳊Oí¥ÿïð,v·ÆŸÿ²ðþëáÃGÅûÿo·î¹ÿùŸÛÜÿüøçW–È·77›vÉì8ç ÕG7‡ÌœeÓ±Á  yÓÙ—X5>§‰@ßKíÑjŒ¹××]z ñÉ$ä@ZÆl„ðdš³ï„-áªdi«s‘äò €ÚÒ-PÁ¢nA+…FÂ2cçY/!¤1 e<œä^m½Õ¤Ønþfçm+>G­¹Sç hlÆ·¾Þæ?jâ°¨²¥ÀÛ´7…„M¹Q£:)úeÙßpGœŒÂûÃoÖ±þœ~:ƒO;4) PÇG†³¦ùù"!™é2›BÒ‚×Æò÷˜[nàS¼=x=ÌÞ©N&—M³wïdù-UuÏ]‡£ú÷O÷q—:rÀkû‘t:‡OÿïîNü0ó$$½°}y¶û¼¬Ž_P®Òfûéî>¼Ýþ>ÈiÛñ¹kx18¥_`ƒ‡ª«VŽ| *¥–ïÉ5XâqM^€œ TdP+s×l8p¹PºI]h]•Sj.g·©^e¹lÜKÆ2 Š Ç “7b±ë¬À›W–Ÿ™E–åœ"°²È8|6”øÜ,hˆŸŠˆ%øz¹ðÿóÆ‘ûÿÝÿýËbÿo7÷ÿ͇_öÿÏòùÃöàî~ÿ˜ý U‰¸ÿkSû·¦ˆ -ÜDhh!‚¶×¼( Ø*3¤‹}õL̺õDm{îæ¹bçãħÛý䦯mwq~ÑúÙn$ÍwöŸÒö× ŒÃ\µ,á\ËfÕ,¬ìò|o^¸¯¢Aq5e4ôi³ƒéUÀrVûÌ%3 ž\6ËMloŒ/°U* Yb&9ß<0_cB%8î?{ú¢eÎ; ý!„º‡á e[}á±Oh¾vA7èòŒÞÛˆ^_²ý:œŠ¶ïÒ75! x"¡·¸¹ (Ñ-ƒgRŒD¸Ûä ûgË—–ÓñŸ°»PÓ­ºŸ[uP‰öàêø!øŠÁ3[»ªN¡8•T×ô(--î4ªü‘î]?Œ††@Ùý·ãí}Œè‚õö†U-I£8 nDâUBQ\Ý•t=ü¾Ž±T軌—:I‘p5¡µ Ñ"¼æš(ç©zójÊꔺš/ªË WªzÁP*ϮꖴT& Wwzve\î®ÃVÖ Æ:¯ÃÛßK5–?1”¨Ï©æyÃ5 ¤ÀJ»€å·ÙÿùoŠVÜé`´q6¼C)p‘ÿǃ‡ß”ü7¿ø|–Ïmä?K (ÎØ}ŽM²,N+K§…âÒ=êÀà5Î[ôè~Ãaªî˜b‰~’±¥ [rÆÿŸÐÿ/çÉÆ$»cÀEúÿoÏÿßl~ñÿø<`Ë…Y/8¿„×ln/·_ížt%òƒc°ÍlòÔ.HËØI¾²ZâkÌ&dä)Öòæoö—Ü€Ìu¨<^Ûï€Åw Ô ü”C®•žÇÓ÷i?µ[ÎÞð,kÙpkì3ä£?x§ÖM'y©œ©ú$÷- }Ÿ4­ÄfË]»CÒhœC¼6 >u%É™‚Nµ¹O ßl@^7 FÖky,úµvÔÙîìZ°¶v›aÇð:xm÷íºa!+žÞ§‰\¬ÚSÂ< þ Þ 3oâ2‰LUç¿¿.:ÿU’ ë ŠNWÏÒafûéÛØDü™ïsˆ{¾¡׎ÝrxaïýÇî«“ƒÃW/è«©>ð‘¯ù6®<ÿô)0LAVÁU3A/ÍâYŒÝ}?tÜ#NûfŸÃAàÇc3ŽÓ< *€åŽEV/ƒ=ï"Ås)$|¯ŽÎ²—±9ž×ÈcÄ¡û—&Æ8“j’E»-§ÃnbÂ} H3%ÏŽuôG¹Htg¼C±]°ÿ—Ö¤×TÚch bDQÝÅQ„p\ñ…€» {€Ø1âh»süÊÊ% øýó‡û ZÃG{ßì>ï{÷hûèèøÅî3¼{oýø@ÁßùaûUE¢=l€ïï:·Nçš”£ë£¢ÄÌÀÝBtEÒÞÚÀdeCX¼§»Û’ùÊÀÙ™3µI 0Ôªgq£ð“—Þç™}O .hòÞγ%ÔH„ ášo©iÌÞÄO1 ‰ÐcÔâ;êA·¾$ì•ëoGK å®/33"[*" ¾ ¼šT¹ð%X·Ið/o‰íÔ«^Ùî=9Ç–%s Ö,Ïêå=F-Š™ö›y¤aË6޲鏛¼ˆG–Ð~<8üù ®7nÖá¾Þ¹2]/©£udv)¼a"—÷)ÚÇç ¨úÏÆÙ2ÎGÙØv«Þ¾@ð©O|\žø´å°/(Üè~ç† ù ÐõËo|'%/Ñm°ë^«±KvG¶õn«ÕÅxÑ+­V±T.N‚£¸×OtD¶tŸ™èm›ÜpŒ¿Ú=ðÄÏÌ™]£j‰ÇÞ:ð¿‘]0¿ìnì4̨ùíÖÆ·~óŽwñ!™È~!ÏU «Ãë§Žóܰ«ëý¡%›ÌîƒÐu8&`–ŽÐÓOìkåS†ÊXÄȪî|{•œ´8«=pk€Ëî.¯{ðrXçÒteÄ+YòŸã‡3ˆ_ Ùýžbƒp½‚÷4ø:Gt‘¾—Ú*Ü¡!½!ܘ§9¸P²~WB'@§]öjT0çÇìØ'ž©Ÿ¸É)Æ#^ è=ä?Ãõ‹ ¶[-Ë8&þs:Jºàà‰˜ƒþÁê´,V)sEe=óî]f犄¥ôð:ä¶ñìlìøÚlb3ðÓNBWlŠxÊÐö(†£v‡æÒ½cÚM·r'0†¾¸iÚæˆ¥Ž‰-ag§~Ph é0¥;FG¸ªýjíš«C“õÉ ÑtºŸõ`,«+)í~¦"ŸoÁ4+öÌ™†K‚NõBiñ[&Œb?Uþ:ÔãìܲE²†•ÐY6ŠÒÎu.nz´@&„¶m°ÎÝùMй2ˆYgäžô“@oŒˆïÐÃ\P„7?\°²ÔÉ}¥5¨ý²í½©€É¨Ò¡¯×jyFà²hTÏ“!Y“¶¢û ‡šo5ê¢QÝQÓ¼JÙ@H¬¦©¦ï4è³4éCò$òd A* Ïb[#ûc$BPw­~jiÕž´ÀõÝ Ùwí&‰[Ì$c£T¸óC”éã„rÿ æÈÚÄbnÝ\Äo“Â.cû‰ÇÎp­ÔTU/GiVÓ¢~:"Â3¨ÈCõd$“ëêURwÕ½Q˜ªÊÝ«¢&5×+.ÑLð z’ýŠS zÊÒ0ʤ¥( í ˆ°ðëLºùˆØ:¾Gë Ènñ„Rt˜Úî`4¹$˜fâð‰sÍtru]C•žî,0¿HÔ>ôqˆñf% \«u" Œn2½ÃèÅX…¸_ ßÄ­øiBÚ ë,E›D]>Â=ÄÏÁ’ˆ6ELÄ3ï+Ñ„gꪖq¸»\<À>6Q˜8§L˜(ÿlk3€uMs'MUòÓv [ÙÇ£Á,Ä€Ú‹?´ßlü¾ ?ÒêÂƇĸ‘ß. Ž<€´„€¯OÝ<½…ýN‘Õ„¼Z3GÕ2oíëš+¼Ûï§#0Xwvâ!8²{~i¹3•QµðFt^, Ö0¨êê¢Y„hâì6)ê´ßŸUìn3`pÈÑdßn^ÜÔÖ 'NÊùØ-æ€[ƒ^Ñpã²Ö§C¯¤ÿîêl÷à™Òi®×+îÔª/¾Ñ'¸ÿ‹‡ÙðrMó BßD]xÿwÿ›o¿-Æ}ðí7_îÿ>ÇÊU³Î&›¨c9W+ -!ˆãËh4‚uh† Ž/rÕ„0Y°ñÐÕö8I w|ËÝ7þæ%w ŽWr¾:Ì;ïL陼1Ñ{Ð1¿ï7Ì%|¹DGƒä È»t6þAy(ÚU¤z1Líûƒ°Ä š„`XÝ—q ‰Ìß@Œ†7[uI<=+ÆCÔ…Ë­:uh_\nê>mEï·°ˆ†È¹£÷΋æ@æã´%o$•H6ŽðTkî[iº8ï;TCý˜Wé§x EL¾Ùp_1"E”o‚åúV½ªJ•P8êmBŽú†QO¶ bÇIÖAU[¡·¥±l?J6¡RUS¼ócÏlÝàçÍA z8`ÿìœö ÇþÁÔÁØó›-Õ»¥`ƒ4‚=²§PK ú'ÅÛ"‚Št¥S`¼# E—«+ÅD„ðjE7<%³Žà=Ýc®»ä¾¾  C¼b¤‘ULÇàµ= ÿ|qù?+Ñ•øs”eH”i„­$Vhr­îH“]Õ\%°jH<üuY.•ýüN÷ÓµmÉËžj`¸d“˜¿ôÔ6O…?ºyÝ8/cŠþá¾––$–t÷|öÄå¾ÿWcÚþG=,ü*‰û®´ÿñ}+‚R ¼Ÿ!{–³´OÆ¥v‡KK<…f˜o¥ ö>šÙˆØ€â\ÀþS,™– pÕ¡„Ñkÿhž­iÖÁ3Âu¨X™w j©nØE–Q ªà`근ɷn×…MRùvËÁ»øoS@œ w²~6 ˜ÑŸ. WEI×a.[îø-ºfLU¡® cÂìØ³ƒn¥o‘ëŸq×ú7èZä6o уÅúL±uËB™­0IùGš¤S œ'¨aj0ü½F0æô,„ÿ@¶Þ“†Ë'gS'j¨¢(Ž_±uÑ(k™<Ÿ¾κöàtNF¶D#yÃeí?Ýl<‡¾ÓéDâ…8ÆÄï¾ó׿P3ºòAnÛ Ç»Sþ 'é«I|~8š´sº8d7ç̾Î! 4è~Ãh›@Zk ­ (E9]bù¢œyÁ숅(B¡à{@ýD,))ˆ®Òœ¾´O&7)þóv·gô0`ã>sÇ]‚»Ö°À] †ÓÌ©Z UèÛDŠ¥ ðg,9'ù`úã@£¸Œ1Â$íq„êõº³»‹ †e˜ãúi£êND¦e"wcc¯u1«£+—0 °êœgÍÃDÿ­hv›­6¾´û£rP ÃanÏPkE“˵¹ÎÛ3`¿xäÕDú„xD¶¬×'Ó ?ª,¡º·@}þéôü¨£›õ’–G6’QÍrÌì­­¢R´t£”öLÍün¢ú²HÄM0œßMí×a­þX5ŠrE§r÷ˆ”¾¨ù<°õɋۗcm6ET†?‘ß! æDþ¥;¥-¶…ļ‚>â‹à!G5j‡ˆoìXšMÃq >¨Þº ß.ÆÞçz@Gv³Ð ÂÙ¤ÙDì˜õ‚ÙÍ9ØzP+üˆµM 2óB&új&ÝUXõÅ=¤<ÐÁócÁžZó¯-V—hº4wôuoJl²ÄïB‡Yôÿ¾[Ïoú,òÿ¾¿UŠÿg+|Ñÿ}ŽÏmü¿cçh‹ösã$Æé`E EϳqJ)e8z[Ú+¹wƒc7Y–£r]øÜ:§ÐÉYú^Âw‰ËwÙå¼£¡¶³UGˆ|Yl¿9;sðLƼ»©—hmûŽ[”¬o0©ûŠ«”6j¸8ah°oݳñapU©·F„¨kÉ[·=€Ò€† ;™µÉ+·k“c¹-‰ñEØz¸UÅ⤶؀Ù+ïè=Ë·‡0ùõǶgj ö˜¬ÉGáæ¨i‡þF¾Ý磹ZÎÊÝÑÞì>wgYú«wð¬ÖÁ~ÏôWWPÁŒxMä`XVu2›¤£b/GG“±ü6Ѽ—Ä0Û‡ýøÓPÜþà‘~îÑþÁC†è;qZÈœµ·¬àØ%HÒ{F€ÛG£,ÏSp^¬hà]Òïû™ï.*9ìÁ¯o¹?1Ï™¸dlx:ûpõ>¹ŒT2ÐñœÜÔYë?ynz)œGÆ)^_Ø©CêªûV޲ç ®jB“Ŷ“ï²Ã¹?­[Ê~?±L½…_b,Aœ¢C|ÖEMk„DÉ3s¿¾ZÜž¶È"5eî» ;è]ˆL™ûÐ/±Ó ¡)ãºÕUÝ¥Ž_µ±ß›ÉL Ï$€ÿà©!–@W%}<˜EÌJïå0€·›Åé:$ÚÍm³‰ìîq÷­M—¼fcˆ(²Õ,àÎуø}>åö`}€p#Æ­=~ZD÷Ò·ÔÊßžÒݳ§÷ÖMÚLš†¹bб@! Æ"§5k^7¶~O½Å=׈œÛBùÒaîa“'„¢Vü†fÃ~Ôt¿n›Sì1n¡¶»§¦ 'oÛ"ÌonŒºo›Kuž8 „| ùHŽù3³ËÞq®¦-*¼søâåþÞÎ6§úMsˆÑ‘c ƒA½…¬ü†à8IS¦ª#Iêê“fƒQôã󛈦!Æ"Öˆ]n½Y(°wf`˶=ž& "ÚxÈÞÆÀŽÀù¥g Õ~èדÅ(kIÍ[9x7b ðiÓ<Ë\`±‘žN'tsSÅ¿x/B¶Ç— .Žh?1ýn·¾²sº½ô íè°lÅì×Ó¢’×#c<;ð„RFeÈÀÑ,ª8Jè 6A/`©Âf&ÀlýtL+yn^šAX9ÍóŠ§øa-óßÍdë/édýžÿ^>¾6¬œ”,§T v®‡&b§ŸŠ©ÛišmÈM• ÕˆFq÷uÂlÖ=ý®ÐÃÍ­(­…‹(œ…âã¥-$3»†e4Y¹&a}ûÝéª÷‡°œÌòg1/#yãGãäm –ÛÌ2c½Xœ‹Ä”ÜÏ‚_À÷?[æ`¸ Å­€ã¿0¾Wed;[-³‡ä“/ý Hl(ôÞRŒ/i#爦rlçbÃÏE|†Fl aî]ƒÜA&tµbWO?±]wÞ»p1‹÷Bp×b,‡%± 7Oºb,$Í'Ùh¡v¬ø– -«œNP˜¸ÐvÙ­KÎ÷Š@°]86+7:4®{âý }>ÆäÍÞWÌao„€9 ÝòãàpxÑäi¯øÿ!Ï Þz4I+ÇÌæƒ¿Sá¯v„×?(PƨA¦êurîÌî_À"ã¡^ïLD@D0Ï0Œ™G g$0ä·åÄÄ‚‚ÐRÀ!€ršœÃ)„X ‰]²‡Ç#ÒBÊiÕÊ„Qmۿã5Ó€¿Ù:›Žì³îÂì4˜T\;vz7pÁµ{ÓžÐ-œŸ?Ÿ…ÎGï.R{d±ý g±iíèû=Óí"¶Ïíß^V‡ýôãpì°©{ã‘DT’Õ‹¡ã,„G¥Bã€ÞÃ3`×`w@÷—¢ÌSLFönX‚bÒIb*iÎúß‹˜÷²º+{†Út :…lš“4‡m"w9°+¡Å¡A„·Žî;ùÂáª`Æ#4’0?þù,G÷ëv<ò8¯º,œ ‰Y”à¾äx53¿Ü\q}Ó2“.àØ÷ù–8µ¶ðÁ5œ½×,™%¸°bäª*™EáÊÁñù+¦(9ÂÉÁþç²ßÀ œ”W3µ9tvÐȸ’žÑ¡å‰‘S‡S‚^ ©1K¦m‰‹KGš3ì“ ^ k½biCT޶êŸÊïÉ EÆ`Õ@-¦qó,ߦµ„¹´䵴в»ïepa½ Ï)8#éÓÎáuæzÓ †ˆæÐHÄîÕ7˜hQfW’*×,… s;sKÎ÷ gMfLúû5LËO³&­rÂðtT°9(nþàÿ.Œ'ú>ˆþ4H‡'¹šÂz+ÌYpÎÙ´‹Ý'oT;\‡zÙÂ_þ9cÓEà-à¹ë—ãŒ<ïF²|Uaô’Ö šX3¾| R aè̉×ðNÁ­b|Ú&ME˜º :`â\áÖ)¢˜}n¥éX¹SHâY m´‰¶lÅØöè¾4PÖÔc«^¿˜yº%3L:ßàkõGÍt4 =u„¿bT,Žr ˜R"ۯʶ‹äºÍ°%2ª$Ó{b‚u*–-¢W­§Q’õy%Q³œINÇh¹ƒµ¡‡ý3Õ™e8Î^ÁT$Q²¤5³vÈÖE Ö Û¶(ƒB -#Uß@iøN…÷ì.Z·à·)ÌâD¯£h¨\ÝKbE5}*¨7w‰ ú¤1¹TXXdð0¹œ—bJ̪²Žpæ§î SFÌLƒÑê!rO°ª5¼b"»øW5qÀøía=yнMnÏÙŠ¶uÕ\Ë®ÅS¢ßbË Ò<[“Ò5¼ýºA9š7mØ º|Ô‘J;jäV’´{¿j0Ë+#c„Qáõ) 9äµ7b´žp ÿ@Hl.[ˆ{®8ú,"L{>^s³»ÃZÅ_r`ÈæXtѺ’±\‘’=!k:bK ùÉå²ë0Œ³Ž pˆFy £ØgꯪüŸj!.ÓXÕ°D£ìæ†u³n\ U£ÅNS¶007‘*`£fH–+ñÝE–Óe*h„¦Cw©Ð"i* Ëib ù¸jÚ–4ðrCFÏaaÜø‹²¿„Iq5IœcŒü탊—§©@Zâïú‘äå² Šgúº¡C–ûöÑôˆL$á®Lðü‚6é ¾>ðVÞˆMá†mÇÓ«„«?}í6Hg5fàPû jéÕ{ Î¶Óø;W.°wÐ1#_ƒ….½†~W¿Ç2\¢ºšñ#DE¹YËCBMuC¾”Gâí'WŤ_̫\dùÕÒ_½Á/Ûʪlî¶!I¹µ$tdéЖ…,h‰E—UxMq ©LÂ˺A×\˜•§—lèSؤ¢½? ¿Ô î> Oÿ‹œhP-úˆÕøKËcüà­ÝûÑ@&oo{¬®0‡‘Àϧ¶:ì÷‡g³™[Iu+©ø#4š·5bØõÇþvzk÷¾ìÿ#}O'Ÿ¿ënÊÅYÉwxfGQ®'­åœf\_ÿD4-ì˜; ®ª0p #ï¶Jï|¤Ç—i¯‰ð"¥ÇÛyBZ›Yòœ‰¸%Ìáéýôpåù{Å3 XÌÄàU½zÓd=ïýk‰õèÚ-bDÚS*c'àûhö„¶—]¶Áˆ/Fsm¢Ž§Vú¹Öp㸮ëžN,#P³æàrmNxF¤È –A9Žûÿ÷È@øÿEîøo÷7=,Åûö‹ÿÿgùÜÔÿÙ\à¬<° 1Ýì—½r ‡÷öq»Ú/øüÑcýò)‚õ?úƒÖÿÃoÊëÿKü¯Ïò¹yü/·¶_.±ö_ÒÚÿ£Gùå3ëîÿ ãœNÒþçŒÿ·¹¹ùmqÿÿæÁÃ/ñ_?ËçÆëŸb­r¼—µÿžÑV(wrµ Î5;<üØW¶~”•ŸÜ\Pë:œÈ P¾kK€¢ï ’ëùÐZ¹{rÜÙÛ÷‘“":æ~…ucägÊq>.âüÇaönx4ÉÆñ9žñ%`œëG+ ;´†~€9Õk¨ÆõP“t©iU, ߣjÃ\ÐñÑïjØÚNl5ÑgrÙr]»Æ×öØ‚nÞ­º¤@Ó«r)ÎnNº—K=²²¥“÷6Ð\m6¶®1j·§£q´®=¸`š‹®uŠbv¼¤PQ˜/²‡‘ØÙÕФù­û(ûÍ’à³á$N‡dîŽÆ©Æ¥s€LñÌ9¾«Þ§«e<{Ôä]µTO÷ }ȤïAØÆqÜ¿{ؘx£x6õb#²ÆÊÀáÀŸB÷ä:µ/©*ñþo ±ÁCâ]Ši4©4¨<ÐË÷ ‡—F‰ò ÂS{1gnâUèþ”+x?Áç×Õ#\WÁen‚EçìªvÞjðEÆpÛÆÒÜiµ?–"ÏP‰&¥‰—ãl’Mˆ™,ÓúL9°#W;XN,Íü À› ³~© n=œÕLé­(*îKiÏѱŽÒt#ªöHÕdÍ‘©(/Yì¬s®3Ÿ):oJð’ÔæpL¼,'j03ºeƒ5—ö7è69cŸq㾡პ_‘9¨+˜ë,=›Ï¡ËuÄü€nÜÁPüº°;o‹; Ân@‚æéˆ»â/ea3 PömÎ,W÷Š;åûCÝsj82°›)“>S•ÇìTã“áñ@_€"‚·1p.æn.ØhUN€@Ò¿È=+²½*ý„LD÷‰+΄oy)2y-´0¨« Ø` )Ä/ñŸ>t^ÊØî„4cßrãÁL.7uïmë›ÿ‘Œ3bºÎer¹U(µåJU1Z‰H|8ÿa# Ç}‹§å°¾\WWnÑÑE½9 ¢?B—éjE?ƒ.U÷an¶{½¥Z¿EÓ‹ª O'Øx‹½;šžNÆqw²,‚n‹¢;è,®±çÃ…$7óÈ…;Î:qã¾NU6£&¥¡jpVá”èì•4€°:çxX-F,ÀO±åJnáöKm{6>Ç ^Ü‚û‹gx{Ô) %…=Žº)I÷”x‹a’{™_[ЦÒãíñ¹•*ßÎ?g¡ïkžN–äf•Ó¶{ºÉt)êïÆýxÖá&%f'ÌWÄç¡vQ0ë(P”é²Ái:„øIC Œ `EÍ‹ {øU(&'N¾2žVTðFãdþ|é0æ9x(2½L7¥" S÷´;|+f'cÉvKÉœ‹[ÔB>éõXK«ƒ‚ó‹°´ƒ»²¸0+5Ÿ ̪WÓGŒuÏ›Í{ôЭ™`È]Œ¨>e®ÖÃx-ÃI®jB;&¿œf}}—kùM!÷¡´Ë¬ôœ6fø¹:>›Õ‰Os”)mCÃIü+Äi£ìHb—ëŸB‰•X]™È• à îÉßl?žOA Y-†9ú_LG#öðíNµaß8ˆXå^Ê)0{¤¶P:ãåG„ó¡ÀGýKLŠf• išSDG„%i”)Nzv ànÿ‘D¦: ë_²ñè ]R¥iÌÓ)Ç ‚4©f_±ږ?›ö%|áÙ¤F¡PÀÜÒÎe7vÆÈÊYÙdÞ¦††ð™%’7ø¦‰xvýµ`¦}ˆ 6ºˆí1e£Á( =y³AÒÜÆ å5ØWEªWH¿åñ@FýP<Ìû´¶1RŠJ/ƒ‹LÂÔÚ•XVô5; _I&\9úöU=âdü9•lXT“Ë( ”qFWP“ ÂÙFÆ8Y)e|SB.qég0æÆÕ•ÐÆ2ÑW®ú½ZêÙÈô“· sÀäÆ$Ó]òÇ8ý6ìP…°\x¸sÉvÖSé«}±{½{3 ¡¢ÐìÌÂfð$7»ŒZ×¼ˆiWª(Ü]¦ßÝEýî.êw·²O¸+þÑRË—Ï]}ù¿°ßU äÿGÊö÷ï?ø"ÿŽ?«ïü´ûw•Ë‘ÕMãdÇ¥|>æ…ûjuÅà6ƒO\~CyFùƒéð<é\>Kºc­ˆY÷YÎ$ÝÞ7žT(øXeÓ€ða–2•r­D 7|#ðí&vúvÏkˆ]—Ù­d[“§UÊ.ÿ–àXñfLÉÝS†á¸¶}N·Ö¬\o\·”ÿ qðnvÿþòU€Nüf'i·zëá öÂ9ê¼è°êÆV>šÛy(ÿlwgß—ß]Ðg[éÚ‘oÝVÿC…4v 7LY觬‹.O<^QøÇ¤k ëª)¬š±™‘$\YÛñf0 78ä“­Ø—ÛpeÎÈôÔ¬ùéüÔc»óá•ç.ŒŸ>ÈÿäéScpó=ýä“wÇSŒ-FipŸ’¥|ÎÑxŠÁe»¥ªW°A¿µ uÁ–ÅíÚºÀä[!Ã*s{_üi:ÌlcW§ô7踠Â~oÀ½Ø&ì>Õ[*¾ßšý¾úút¹S§‹;øiÚ·ô"“™½—«9jµÃH󣋸—½#¯] "†F0×·›¶É€ÌšîÇ3·@ZÁØC6²UàV%¯Âòeê)÷’^wW¯‰V•XjÁ §â6Š$ÜÝÒc¹‚Opþ T?wׯÜó߃ßLþtn·¿dܤqñUÄ5·R@<‘$"EûbjzoAúá6…(\L>¢f³YGt³1H¼Á#0ÄŒû8\,4{žÀ<51£ÉYhìÌé ¦qsÔS©³HdÖÏL=»©úc¸ùy_4Ŧ®  à2¥¸·* ¹¯€ÿž@CíèY2Z௚˜ î£à>3…ô.½i×çwu}. b‹¹g¥*›s¤M'ÙÆÈ²”L9/‹Sôá” xÅ&qòf ®vF-Šðcñ¸Á«¶3Ê|ñ3œs 6&Ö¹2z!õnB&¤¾Z>¹³]-ôâñI=X²d¹ŒÆD¶mXk6el5UR6(mÖU¶—̽gþÌÀ¡M`y}Ê…,i. žP.·‚x_HW¼•Q²]œèv£ªä ¤CËI?µ‹ì Ôæù³^2yU!»h=aÊÚœ‡R¿i®2gÚÁ¥„¨i©b’BHN c¶Gã´o6íáÀüõ¯ŒñódbÆdê.ÞÝKû•¬e£}¸9»wÞÏN! ¦'ƒìmâ^Ò`Dǵa9䘃Ü-§Àñ‰mSGU¶yØá·ñüñôxoÿÙÉöQÇå«wU˘ŸNaŽ9Æ•}@ç‡Øs$P§ä®CCþ.¡2éޞˣUà¤9¢”ßô”³°—žÇÓ÷i?µÔ³7<Ëì*Ã‚Æ 9<…ã]h“ŠÊ•Î7Ø£á[§à¾Ør×לéÛÊÆ@q–éÜ ÍÐöÖ]"O •UqB^ØÃÿQ6w“ñh5x· á÷àßàiŸv O_âÓ—)ÅTÏ;ðXŽ—aÓ—hN‚Oíc™ÊØË}€ör?= !@^ðôgûôçl\èý1tÞÖ1Y#ª7Y¨*,t ÅçDçJ³¥vÐ"§Y|Ã3I&‰jgM›{ñìé‹–Á gÉÙ™¥&Ø•ù8 +–OÂlQ "mar÷zvN ™¶„ýî}ç]Ž´[÷N^'—§ AÊKg6!µS~’½æ"àÔ´*ž’¡ô„<_N0ÏŽ†³Jᥰ©ç¶¥ÐP$á’¢Ù8iqŠAZ@Ä8Õ¯CtÌx«Q,QD¼‡Qòëì{N°Fã)ð&ÃSð+F§Þ–W~Y›*P54=ô…cËqÛèd¼}üÏ™À¥G)LÊ#µE®'©!/lPÈ`kÊ ?ƒ?¹¸D7írÊÍÊ‚ÌSÄo°mÏ…¡;Éc¼Is<ö†¯]F.Ÿ“Öu";;køÔ¹Ýût¤pѧ½T2bUv=°•)·ß0seÑ}¥í®Óžæ ~Á›Uð&™t›ÚbH‡UË5ÒÞ ypTà©¢˜Ç’=¢Â Ω˜·MŠŠ§"'´@R»>¤Ö–ÁεÓ+‘4O!î{xr=‡ÃóŠyÆóN-šÎØüir¿M3òËu>tàûp"ç€8_žL²çþàƕƼ°r5ØË6Ï'çV‚'C::e;&´hKù>š ¿Á‰w§Qd ^†„†ÖgRà1$VÆŽ˜\ÙçN¶gNWÕ‰R Î*Þ»ŒYÖ„ « …SE6åRgêôv^”â´s˜ñÑÄÍK ï1X¦ž&•ÓÊCJwKn¯`ºŠ]²‹í»ƒ IG/ Lù{2´/zªâ_Êò.6òª¡ß v… cñ³‡!«S“‘PkPu2¤ÏÏÇÉ9&—,¢{u>+s¬îÑ0— óÏyaϱ\LQ@¸øõŒò’|PÊGÈhœŒ8–Ÿ(Ű¼ƒ¬‚'Ε3›¸PŽé™ùª¸« z'â¼°˜Ð–b¹"SnpNdÙ7{ÉéôüåXä×ryµXônˆÝ­•uAPäB>Œd„–ß&ª‘µ¾/^3¿€dÿF(ñ—°Dg—ÿÓæ‹ÝOw_QÝš¡_<öƒ}ÙÙþ^ÞØ¯þñ¿¿Ü}¶ûܽ¢ŸîõÞ3y³÷¬æ,]~7µ_‡µz}•°¥xQ[1¢ùÇWzMÑu÷zÞÔš0=0äÈŠÿÍIF‡ʶ!hžlA¢-K¢á´£ö+-\ŸK•kWViû¯×NBáö`:0)0›mVmwŽ_mwvðûç÷wŽ_ࣽïvŸAØmù…™ÁwŸÉx%§õ-áÌmAù×ùq“ž¨à¯L€ûY7Ú¹‚EÚYNê`äâòC©ÚÞ³Wa»y½íïçÔ‘åšOs§Èh“wQ]¿:m†{…1ˆáoÍAy!¤ƒË® ϬØVm¸ÆµžÅÎ͇?¸³"]n·}í†y É]èÉQçÕñNg ®Iæ<´(A®ý‹e¯¿cæýLsð›ß}?Bk>¢–=cîSÄ÷:à†l€KWeÞà˜F¯vȰ¬ -Câ8M`,¡ººWÕ)øÉ\CCaÓ|p 5—÷?'vÏIzkx—L.!Ç1è)S´OX‡ƒæœÅô¬iÐÆÔY‚TÔÅðíù‘¿C¡Ø1 4ïÄçK])NBa•_vœeO=Dl¢f‘-CK,Œ´Oh[!¼ùB®cNR·)RŽ©ä=îÝTÊ÷‹ajÚ®³‘Ý­D•Ù˜,ž1$ÓñÎOçñë4´QUÒ[´è!ÉQÓý5 Êרï0-ƒ$ÝôEžvÕ…AD£Œ=¼dW,žsžuº£½Š ÓŠ;ÁPQ/ žP¶LÕ,ê|t§ S®’h§ ÃìP(ÁôUýšÃ²ëh‰Eû¾ÂƒZsj"G[ö@Ú¢öÕ”E1üãTI×§œ;vÔÉì{y Mj… 5Óæzû8בr¦[ê¶LüŠT Ž«ü”ª­®\¦ù…ܰþÿÚõŒâZ b»vlÍnÇyPÕrÛE¬d_UÉÁè';ëaaz&åé—¯’ û9—‹Û/ê`Üß¾•^ò†s<$"ø!éáØ½‘Ÿðëu30㳃¥WžïÍ©ë À؆,:PÛ~ióßû¾#¯ìî6ÀnÏÝý§mòÆÎéXi ~?>µDÖ€{küŠß¾·Ç·ë†£èÜó»6ð‘T¶ˆ Xêþæ3 >ð=ÅÄôµíiÊí¬SPjÐBïžTB §‚æ°Rüy§ý¨öÜ.‹¾y:=o)‡N¯3ð| $À$Mº{‡C ^Þ^&“¯jNòÄ>ôð›Lñ[ !Ie®Ñ«šåk;hrß¼±dØ fVð®æš˜kRE£ÊYPñeíL.W]"Φ—:SZásLÏÓ1é®m4|nÐûÀ—a&Iù2m-gñY ,g2‹º¤@íVV¡s&U¡GhW›‹.WÓ!6–7!5._Â,˜îLÁÚt‰îÌ5@­î‰ûs;h‹øÕ½œµªð™7½·m|åYÕ{ÿùŠzM¿ý{bª€<ðEŽ %è·î€"À 'ú¹ê’#!Ý/ÿЗT“¬Šê§å²€¢ŠÂøØb äÛ4ï&ý~–/ìŸí“§áìpøR™ þÒ5…Ät”Í?CL¨À”úY¡WåÓwÍ=Q% ÑK±láYPÚ…Kä’î·*UŒˆˆE‹+™0]àhþ…ª§£ÛË‚r°œ;^KÔÅhr¹‰a6ëáNÇc¡B¸|IÜù¢1h÷†i¿Î)Ê)µî˜“¿íÉY]r{Úzá½Ëlk¸%P•¢RõB \E/Äâê·ž¬¹‘iþæ Pèã¨O˜ëGœ' ‹Ÿ{D.îƒI…Ã{z÷}™Rî¿èW½¦†pu`àkQ½®›7ùˆ=äÉ+°Êe^ ŠºÝ"˜%Z&]ýQ¬Â¯ £•œ‹ˆ±¸–$‹`4¸À¸¼d]´v·ëÚz<úsƒ Æë•x —j`%䢥Ù>ÀŽÖ…ðUöœŠI†â£ÁR¹öŒã`ƒõE`áÐ\«;h±u@Ãsò! C =LmtŸð{\œ½Ô ¯Ð—¯Å-Ók˜g°×U;ñ”D«ô̼Kìÿlj3úfK°oÀK²æ(F p2Á(lœÝà+øg±‚^‘·Ö¨w:k(ÅÙw‹h›>S¦mXý)Óœ‰bü]ÐNƒª(Z#pœOUÖRŠB}¢±âQñY³Tj®*窠–mhæÚVߎæÛò¥áôÔç¶h¿EÿÜöŠhV%·EÙl”J»­¾»ËäÁk!jåí4¾Vªè\ª,’QzV-¬byä¼x•Aì¸öJEß×þ<]óN“P\¶‡Æ_c8ªÃfI ½mK>ÑËìfäÆ ÖÆܪÚíÈòÄ!ð™Èòøº*¦É„ŒC=\l[…ÞD"íº½+rÍùí¥Îà)ç=t³¢ø\Fç åÙ¥Ð`%8ŽpšýÕ†7c°$v¤¢Ì7Ïîè ¶ôö…;çÓ¥{>¡À4|þ„D]~êü ‰Û¶cÔ¯ð®¼ÄëÝ}1­yôøkd¬Æ\ (‚p;$€PcŒ…†\I°LŽc¡gä (ªÐ2bŠ0 9mó.€Üï<ƒYÄý;¸7>õ÷Åàp”ŒðÐ @DwÏö?°2æÛDÅh ¦Ÿ"ÓN(Ø÷˜­aG–1}ç÷v%{|Iè]Òº@?Á@‘p’LÕv§IÀ"w½Ø€"JXíé;94z<ÚÁAe kx+¸V¯{.d×Ú°ÈÝ7ö0ƒß"Å8#¥eY«üûFlZs8>O†MrQGÅæ9Z7ßÞÛú뽿þµe±<´¨|B)PÁä£é8µºqºõ–ÙYƒm7JÝ'¸V¿¼M7ü7äp…½â7@ÔÀ©íoE-zÆÚW³Í¢‰5­8äØ77užbœ IAeW¢j a» ‹t<§"bh>g9[V£àƃ+e£?aoQZá¦Ê$Ni¡Û>9t[Ý·]žè6æŠfá¹®LUöÑÏõ³ ÃDCÎyÆÙ®C«‘µ5Eù'jÑkÐkk MÌ0ÐŒ¥gy )2­°å¾ÛÎJJò %0>G[Š<Íg% GfRµ‹KŽŸw”d…ì×)Fi Mt·®”zÆÒ'¦^)Ƶ·”›,S'îÕE¼Š­¼çã;/ƒÕ‚¨‹j¸RQc×Â%Â5çÔ熄À|BçG‘6€Z`Õš5Þ×k@ýY«×ƒå©)æK“‚¹Š¾»ÊÈD«¯öÜåôŠ(ƒ‰EUdf©³övÞ˜ ZqBäCñ0yD²£xkm¨¾T±ŸCìÝ4œß¨wnyº™ áÀŽ;v`·…œìú4éâ!Ð]×u`Ø„·^œ0¤3œLH$eQ°ñÀJh!Æ/œdíõol5˨²¤D#ŸöÙ ¥í‡Ó‡t¿-_ä‚W±¾Â‚ÄDïÑLgz®ƒ=ÐNMTÄì{^j+‚#˜Ô¶V«#l¢ÆáZX v؉zP!,?f€©ã"õÄ5Ö‰‡€Jl5¡W0 P‚ú¬tEP †CÔeyåóÒôOËø”ö • ÂìMéÎâ¼Ú†¹BTÁ‚#iÒð¤ÖjxS1ùÔG&&ìa»ØÏ¶¦…ÂàÝZcãÕ芭Œéªm†‘ “¶Þ‹Î†PN,®yÇ ö›ºK׉*¶†³rhŽ"ãŠX³áŠ”¢ÙOÎ/úo<Þ‚oÃ)0äUÙ0ÑŽ++ž­ñ™/í÷“sÔ#ã™O̾WGKøK´_®8 é¡UÃhÜÉP?ÅÖBcˆªÜ… hæî`4¹U<å+Å5Ñv2rÒ>¾{ŒõÝ=/ÅìùQÆ1NØVÏŸà¬ÊÌÙu—ŒÀ æ)#ñ~ra¹svú¤;)¦Mqò;¶eí{½W®‰Í…A0^±ÿµºÊ–Žxá=¨>ém¥Û}PIÈ¡o0 QÍU›X`°¸Ñ˜Øî/ö8ÙD£f¸q5¿3åÔÿ:4Ó!y Ò¶%ç!çŽTâ €â*G/àÊϳ¾¬[÷÷žeƒò?¦çœµîF×væ¾ãó%»ìî³ê@÷ÀäH².H‡šÆ‰‹ðbÇK° :µ²›%{0z gµÕ[\´¢0® GaI‡âlA~`[-ˆi.µò:&ï€÷Û?pîžæ-gaC¿æŠì`Ù,úZôç¾HÕkÝD`ã?U¹&ƒ "Zxr`nŠª:HVØ9È7¢Ë>´í™–; ´Óp®Ø+xkG9…ãP@Ž¥ÎØmÚm¥’\©›,»P£`BXIÑ.Æõªî ª@mC÷ Ï÷À E}§~AIwµhÇ‚ÉãÎÏv:SïÄUvŸp•‰ó"ÔT6 µB¥êu”¨Z€¤ì‰}î*¿©ryÆtQ¡€Ó±Ò®K;ª?v8ÌOð.B'Þ^rP¨WXY‘%šÝU=Ѐè­ž„EOŠD2»¨Ü`m¿*€¥GÕpéÝüÂ'òvïÅËý½½¼•›-)Ðé2µkÏ_øĠp¡²& ¿cQVæÀºÀÜ=-W£ZnZ…A@Ïž Â©t†¢ T«leÞ–¤Íªeê+‰Ê>¯aä)rêËq¤$!1 ¨¦ Éku=æ8úzHWU è¨vš3YoS@ø\œ—Ñn¼ÏC|i]¯Ì^Ð+~%/Âþ¯®‚ùu6ö¢_á@¥D¿•^SÔ©á[&Ä@ê™Ùºì8Qpd‹¥Z%FPÉ4¤À€(D„\ÎT|ι~wcZ€©- TÕ…ÌmÄ,Ãþ^s* b²FÊÜY=¼IëÎ䕃¤ÐøÐ;ϧ£ï#ø™WN{Å힯|àsñ¸*Wl—Úæ¿ Q™·ÅqF­)èÞËB;ðŽ|mhðZ:ïcYèn·„lj•3óôm‚Û]ÞMŽ“WûZ #†$¬æºÎ¿{ Ϥ+rp>:7 IpÃò¡P:b]||Y)»AMÕɘ`[‚ ;¹ÂÖ~X¸x‹A—€ýdx–ÂX‡˜HªhM*~ÇŠðät¨ÅS·r/w詜UN/íÚx÷]M<6#<.¾§Û‰Ë:ƪlž_‰'#2øJd¦Xïo\ouHSèèiܳÏ)„©×zyÀÞ` Ÿ_'YF1:Tɼ6g­AƒÀ¦’a6=¿›6Œ³F¨K€EVб%;Ëñh2Pyƒ ÇCXÔgw¸½ªÍXÄÏ"ÌÀ50Ëy‚íòY¹@@#€HqGêu±Ö<Š¡„%ÝËÅ ±Õ2}¾Ïmµ|/@ q¨jâòÅ`rõÜmúà)^À“a Wöâ›yœÔc H&6by ”Ú=¹ ô" Ç2bw³ Ò½¾Ž¨b2™gqj9ÄÀý¼zXF±ÁÝU”†ÄsÈW{X܉!L¤0!Àp«5‹Þü]]®–²ý <û­¼<T¾tfÌXz”£a9¼Á gwØ#qÍÿª·><Èl'-™©èÐf±ÍÅM% yÖjušß6M€Î‹;S@7H±¥Ú'%-O0s(ËvE„OŠ"8'¼Û¢Õ]âMCø¢ÆÝ½£qÈ ]ÕVÝ©Lä6­­îáõÍ¡’Á^‹÷Lj㳂ØS>IA¸ÁšÃÀÅ 4ˆ­rÒ€ÿ¡ÆÛ¯pNµ³CŒC - ·ê'Ê‚å üÖrôËRˆþM¡Zœ.aÛMgÀŸ©çN…šŒP¸åt°ªÃ- 9ó¹ÈQÁºƒû"º3ªÀãI‘%›ü|ÀógæÓм`|Y|ß¶•Nù]ÄzN\½ˆ9{50Vyâdu…"“R‰51È4¬'“xiV “……ë¦iÇ)y]:̉º-˜ ¸$b1<­Jw\)’ªù©ôüÃÍ:´=³Hcu ­¸ÃÒh:et‡ê€ˆ6™®S,ó˜ÊÐM!Æj×bMeàY²{õ¸g²)fkî_nœŽÁ¬[×&þÆÉ‡•é܃{›÷ïÝ¿oG±î§4*’NíúJT˜\±ÈššuÆ ,c¾Ü^®ü¦çfý nz®<:q:½£ #4o”}‚õÁtx¥Óe—/þŸÐõx¬Ž5e0bJä¬Tô‹MK’¡Þò±Ë"aã’„·E[¾>ž©ŒV´7bãQ0b.ÊSª´¯éPÛVû>-2°ô35ZÄ ‹YšÊðœìl“XŸè±‚¢hêŒÙßß5“(õz $Ó:×…§¸AŠqJͯµ«_kµÇŠ5x¦ƒï\SÐÚ(g5Á¬‘žÐ­‚54±+Øû©*ÕÊâ-.çè¾ë®8¥œmo„–HóÃ×5ТÁëÞäXø6C£ ¨LÕ÷³n%L'Ê+ž1¯-[° aU˜¼_~ÓÕÛ¿Ø¿]#J¡VÜë¡2éM¡Ö›V«ºý Àž:¡‘c X~¸ò²Óü)ã0:nÂÈHý¾á=—íØâ,æ¹*t«S…$mäëÀfZo¼á!#´è}#ÿg}I´>¢üŸ Z‚ n´ŸO–…*ÞWèM€ÚÒQS2äm æºÔL µóF&}NCn&l@£A¡}Â’y0Äíªça·ßOGy’»4 õ¦A&µõõ„Ÿ¬¯×ê³à½Ø~õ£_^ZbèE 4ߤݨ#õ[·"1(z”)¶ }‡0'3‡¬c:€NAûèCß)¥«W/öëF~úL0èð‹³zªfD±ô\¯z¹ù„¿øfA¬„#l©íؓﹷ¾4!ƒDJh±¯D²…œ&•ïË:¨‘¢OtRNÅd×+#üÔ¥þ‰PZ°2y)r §ãY\tTQ¸pA3¹^±VÇ çKyç¼BLÓ©lˆŒ»‘=Íz—\¿i°äö™Xæ+²ó£à-­€Ý§Šœ?®ÿèÐŒ¾… ffF¹³Çv±ÖÓ3ZÝ1R!…Þ‡4¬·¦…;a«dt)q§IL…&þ¾ÆàÁJ%Ì+G}•­¥7¥Ñ¹Ó—ªŽ gt.“§ÉI:Ü89©\ÁÂŽÄWÖþ=IG-2Ÿ`{Ê/óY[ã«òà•mŸŸÔA£ëóÝRxºOrtÄÎú°!lÚ hËþ÷ . ÐVL² Œcè§[•O,êdÃã96~›†5qìZ¨{5VxôOü8Xü½Š!©TcïÛVÛîõÆ·¨¶9@T¶ñ†˜Wn™ªœ“´ú¼ŸYÒªÈHiÞ¡™H/«»Ó€ˆW|·M×Hoñ é]hµ©øW]ÎàEZLÖ¢v9“‡qç‹pt*[i¡íí®)åšSéIuzÒõ»ɾ£XTS¤ÙÇ}0Џ$Gî8P 9ƒÙèwPUO«:Ês“ú=ø¾ 'ﺀêÀáKi L¡ag¦ÈzôZ ð»PTÛãÛ†@µ˜¡R‚R62a‰ÍšœÅÄëËCËí»ë¯r–\®+Ί$®"y ¹ Äq_> OP@Šr@ Ì”îí÷?ï ¿€i‚# ¨Iqμó‰ËEG)æ6[ÅsGÖ`x<ÊŒ˜a$¢éCWdl`Ö¾ºâã )Hš-M©(ÑÉ ßoˆ§Ós³ùWee஘ñï {êHPY¡kÑ@Êv\”½*° ï¸ ¥>˜YÏR£ëb'ÁyÐJöIð:JÖ,Û_ÃScÁ˜ˆüEØj$¨Da™¼"TûrÙZk>Š Ž<Š$þS ª&Kcc ‰ž lQ™±žâR+Ê\˜ñ4e‡á"©Á¡”½ºÜ6ŽF¸S4ÄB¯±U¸Ã?ìß»k7€h·'¿%µøvÐDÛµÅ×Ôd1ÄÍ¶Ãæ¥ývØ6÷F A§ÚØ3ê•—~n½¬{; ü¿*ì5€XÑô,rl{˶sÈÕS©4-Ô‚aèî·ó§~ HxM;™ñº:°lÀäHžHu-h,ñ2‰Çý|N“n ñ*pób:W:;Ã@¡V Ñù‘¤I•­«Èøõ¹âD(*ò’ê0„´—cà^úc®¦f–æ‘—¤:e˜/>¨Îj&ªi<Ùºÿ‰þ†æwãÜÎÔ*øÝÔÖä¨OùN#æ‚Côþ¢×D;©â¡¸©V¼L]¯†×Á#!7Âþ>x㉩¼íÝxÂ6¶ë tê[P<^âö†¹X{iÞ…`|C8+ž&“wI¢¯2"QüÇäÃ(Šý¯a¨‰zx¿'½\Òÿ‚ ¡0N Þg‘ANV¬Å~QhNñWËD‡K]ú:C=ˆ4”{AÅê Wƒ¼E‚^U~ÄÆÔ^TÞ J ÜÊU¿>è*°VùÊÑÎ[Ž’@Wvû§JLè€Ûb43`ŠQC$fŠpÏîù™$Ù"Ð’qŸ8ÏMèÄAÜÏNþ¬ä²Dä?œ2³¤Å¢íÚ¢Ú«¢ç« ü?kÞ«–·míñçW,Vö€]c®Žn¤EË8ÕÃ¥úWÝ»¥ú6³gÔ!ç‡ËÝCtº#<Ýb‡wØþO6¥“ôÂr¿8÷iWõ*ºJêÀgO`tËpd¹…žÄäÀ‹ì¨)¾ŠüõÒ¦Õ®l¦Ð‰Ónø†:.ê·ÝUwœ`®BØØq¡õص§î,Év«jøø†À‰-˜îdŠeG@œ²xùmPÄ/Á÷àODz £ÎHÔ$+Ô„êBváµ9²Æ—MÏZ}Ê_»^-Ž*ì¶ŽtÒ¡È…ñÇXu28/VÑP”.‰³ô#b1Ðñå† ü·dãÁ²`ÊêTL•ÚA±71R»†&eÊÄk¹ ”­ÏÚ®Îø”aªy8œÑéç]æªxå§N!nJSmh7ÜÊV »XÕ>6w'3K—€GÜÕvfÌÌmeÞ^¶xå­ø•îW,?­\‰ôî†ËhåîVPq ­Üñò1·_?æÓ, â`AK6Ý ÎPÇ$rØZ¼xËöx†Lò8T 4ŠØYX-_ŸÖ‰2H5…£¶»Ê ƒýíóRû¹ÔÁ¬Èø:´»¶0ØüµÁQÅÇÊôÚȧd|ÝcÃß`$ÊÏhã¶¢©5šÍ‚ ”»·S~ÔÀ#ëmd*Ž-¥öèn¾QÉò3ÄØqÿSN´-Ók\DÇš9¯YDMŠ–1Åâ%ó! ãc׉߯ºÜ°Jä‚blEPýYÛ|åa¢ûp ÙŽ¯fàWÜ7böß0-Gô‚Y;"ÜY¶ËN€ŽìY¿Îf½‰wCÐ3Ò›P€ø½ž2†®rœ°B3u·Ñ€¥)¸(@tõPeÍeÉßa¯g€]Ɇ£ì‡Ê˜:`…6Å¿ª`Š+¦¨­²õ=‚~Ì Á5ž_º2PïÃQºLpÙ8qécD|­ –Uý¨É R,¸ú*¬YQiŽ;hÃ8/.¹"ÂOoç0(S•eíëTª‹N ƒÍqac1†>5ûì—Çã$etþdÿh-äåÀîýéb{xÉÉÎr{Ž´pÑ$‚õ˜Žb/lÜ}Šç>¥\‰QØt°é•Qh&áØ{ww#„ É{Í /¹Þ­B×€ ‚9²y-¸Q÷J‰ZÝOÉëˆl–û$"¼2ü@óÃi_š¥&:PtþØüò[1ÉL9ËçfAº; en{6î#+]š°GÖ²ý¿ÁºuÁëàÇUŽéëÛ|âK{í÷×@Ð/ÐêEíô\Œ.1'Qæ†!Çqäà“_a£2@‡UrÞáÂ’Nlå_K8¬,sõœA†0ù”¯ªL†ØõøÐ™5Ù£m×.àF3yñ,!_ ?‹aÿÑR‹²L­ºÓsâ4јÕ6ð‡`Elw‘¤AéèßþÎ ðí‚æzp%Ö‘VŽý/ú€ðŽ$Æœ÷ȾÓYÑÄ0 €_m9íådŸƒÉž9xXëÐÑÆžÒ!Ú×Åš÷•H‡gƒw”o=[YÊ*  J{ ûo8©“ÄN46©,4й/8WÊÃÑRûÒRÈ|µê%w9[É•W¥¨rÏÚWv<Ý ™m"™+S‡\¿0¬X›ŒçV)¼:º¸KÇ,"‘~χ°ùx&§MËLªQé g3òw ôÔQcaO+ÎZMâi`ð²KoJ#À4xPOÌ/7c¢¥bmûŸe¿Q þ:ä|" ƒ=$Ô²ïíóÝEÊ×S\=1ñEÈŸÍ­X©ÛPL©KãþDÁÌLììª%eúj$BÀ2¡%”jôæÕx=~‰q=#È:°é7ÐMYåÈÛ‘2= ¹)éœ%à$>GýŽý¹?SÅÃhH·Xn±,݃!(Oãþ2,>Ç˰ø\½ ƒ7LþíTÙîzÀCì÷Jõ­¼"p©(ÝÞÑV¿æqøñqCußhR·W:‡šl7Óâú7‰è§ÀÓ+¿|é®Wew‘€rjÝŒ{WÞ0HÀ/¿éà¿üvM¡!år_« ø•”D·[Æ™¬Ð_¾,AÝfcO)&Thú!7&'B `2ã_à³5¾6›ù0Üæƒv ž)qØ5Äå=+vâ˜ªÈÆ}~Õîþê 5i¨¦ øOyÙ8!ö–éðŸéèA„>W óOŠê½Ü!ý}ß°ÿý_R-ÓwÞga‡£÷«À¬_þÙtC £0R4OIt5è'ör6X¨­‡QyßiЈ­ÁÌÛÓ¼²$èè;sÔ$çj´ ÉíìP ”©Œ@Q=ü”èöûµr,ü  (Ç;7p蘰ÕíÞ À…çt“ª6«cÙ@Ÿüªüó+^Èät,Ð-ÝܪÄAèï LFÌW|+ïîÙܺáƒjÜß¾E{.G ,-&ápOªLt;Eå©&R²J1Þ”%I/ç`=È3æÚð›’N;=XÓ1ªš×}#]”ÝH8dë iþÞ1ŽÖ.7DÚQV´Ã ˜¢ø³àÆ\î%sox/ùû3“¤nözps U‹{½\á¹,¡˜ ºѽPî×a”#=ãÛ¾¶n¡ò¸3¹²t^›éÕç!aü¨K\a!,Z„¸0¼G)rHÍ^üÖ/Qq‹ù)K{¿5Lø¦~ÑFžÔ12,·&|cŽÅpvfǶ !ÁœEhUh®pß!S Ky–y¡ºû& Û®b¸OF%Ä;H~~ê­ó‹l<À XC@|iî^hf¯géŸ ¹C¤ˆ©!óÌ<„¸…ÜcYIð¨ÛH1EO½1ÁÌ¥È ŒèUL%‰ø$i¡‰®n0+ÅŸ .b¼¿8ãÅA<±;!çoqœ Á\×€d= Ûvè†Ë]¥^ÑÁ±8nϥܞk‘&Ü NöZåÇÕ!4ðð䊲ßK‰ÑŒ\èƒô={‰h.Gæ—“ Wc>¹´Ì…_©=¶FÔ`Ï“ôŒ”ªìÌ@< =7ª@x+¢¬´†ÝU¥eË *å÷R¶„wá~I×ç¡Ó®Õ]J!b4Š b{k®AÒRRFšq”õª'¡å‹©¨›ŠhOgÍj{>‘c‡NŠH7 »FºªÛ¤Q‰Š‚Êv"Þ©¾ª5—ÁDuqER7‹úm¼´úÍÌÑH7æÃÙÊÊ,Å€\8ó¨ÈÁSÔš$/Ô4…½×æRFG›i-åÄK”¤Ò ‹ÂœžuÅø3‘˜”jDÅÄÎàš9¢N5òºàÔV ÓÝPEž¤h€¦òÖrò¸±ž*ûñ­ˆ…gtÒ`f×8©Ú´4#Œ}öÑXBRð‰9.²>³žQ@FîcíwÛìcç3Q×-PœX6Ìôc¡óÎ\Á]äÈèê„§FÞÓO~|uâªfj«zû¤VœlÇéõn£»Éåù4VŽ˜VQo!{Ø P9þM–„ôay/Y“ÖqY)ž>ìÕµ¼QÞ„¸žl~GGƒ 0gæªÄÈ­ì×,ª5^ÛåÒê'lsøÄÁ‘Á©?߉zÐ2*ÎÓú ]ã ¢¸4»”ü\.ë 0 >>øñàðçǡᾓ÷j—Ñ´Z-¬iÅè`éƒq„›ó‘–qÞ3à©q"yQùœ4»Žë»¯â½Ø¾ûN<Õ«@œx÷4^‡àFƒGõÂ!]{êØ dþðܬ)SF‡ƒr»%”ç•Pqc±ÏŠïëÍ]ÙÚ4˜/æeœŽ›x44<Ó§DÝæÚVíÁÑEr>%r«:oÙ²/AÍÝ­¢0%’%3·BÑ”QS|Á‹O'[î¨á7ø£Ý–NQ ž ý¸Ë¾Md€':Y½ƒ¦qì8ìyɉõgëÅS!›Ì¡Zàß2Ž…‰osO%: ÊæÞ¾ÔÅÀšŒ‰½ë²2˜&»ú•¾—¶e]YìòÝ®²Ïb¼`šÎ‚5ÖµôÈi§Êþ*>ÈOߊ>¨èç²Ã½’®Bª•Éi»ÀÝ;s¯¤Âç]$ƒ@{-tY^tž‘¹fÝlí¾ê´BŠ Shà žq„¢loE½¡['¨ÿ„ªíÌœJsÍ)­Kç'p¯ÜâÆ¥Í ¿¼•ðË Òmù(ÐyšûáC ÖEûÌŠ¦Ùa;°õR‚×àñ5t¤‡™q;fí¨ˆØQ®ƒG²§†ô¤:éå­´¬ éöü€RkqŒVŸ]¢|\ Ô-ÅbÿÕ†ìш™¸¦JŠÌÅÑú–‰ô.Qç…aˆW'–yÂ.EŽæ^ÑWûYäæ]ÂZ^[ÓŠä˜Au’$ ëúŒƒîÔ‡Qàh `´ð•Ó×åÉÕr®9+qLÀ¤*êǧ ›‘#y^ôu¶ÖsÏØiA ÈsY¾ëw ÃîjhØE£@·•'¸;ÙB9^Ïå¤ÄÙÈz—G“ÁD´õlc„ϱyÆ3\ñ‚º…<çÁ?ÿ5†&Ä8S¤~ÂÝÒ-©þº|Œ—µ¨™{ޞɰTÆÊíµÞ8ã§ Ûú,Pú*Y;ƒ€¢ÐKW¼©c5‚5 žµE)úع]á’Þ§)}†?"y‡œgìl:ñÓIÊ(>6)§­Á™7#Sȧ{¦nASÿÝÔ(ñt‚Ì”/Л5X[‹h†…E](£nþ¯dõzŽp™6„­6ÕÀ¬;$̻Ƥ°Àú! Å>y†V>UaAR„Å5VWæDžkEÅ6jجouçà§Êf>ý¢_bÚxÑ/¶\ô°[ãËrøXhÀè+j£Eÿ4°Q$@‹ —´Q$pj­BQÂŒ­Ù5<`ìjÆ÷Æ]+ 24¹Æ-¥ŸeHi÷‚ ¡£rvfeÛ¼ØYäô¸ƒ|–òzU($äÓµ…ç?Pžªƒ|Ýšv/.Ü”áTÎÄN@S"œ3T*ÄhcR°‡Wrˆ&UðBEé~­zr[ÌéÉ]ç{¯¦¢i̶-FÑ^('Öc8ðÍ5æ4ZèÜ£s‘OŠa00 ŒÐê϶±3–O×5IPЕ‹${/}âáƒxüš°c›ÀŽF¤ÄŒ 0pÇ@úÈÆÍ 31hö“°ìA-†ÜÁƒ`Ž:/:Œ X¢±Nât˜»³“§ú\_aBÛ/ÒÁÀ÷ŠI“£å¡#„æ§c±Ì"²¯µh(…±Ãíu‹1æz™‚P’…Á«×VÆ»åÕ/Y b•C@zò{Ò³SÄ&ç±’ñH[ŒQé9ðq–…¯¤çµªûŸÆè90'Äê–ŒxáÏ®¸=Ê'hýH´E[Ÿ…>3ʬƒ¢=dD¦” ¦`€†É73všz1üåsÌØö7[#¶uÄ´è{ ü΂Ašpæ™ÞžÈb¿¨Çn>šÄjò,1 Üeó ~lƒ¦­‹ªäœ­1^]tñÁöŽ ‹½w6È+³ eŽom„¼bnw2ÙäãUŽÅJz1#yí*MŽE³# ÃÇsµ—1@^¹‘õ1ߨ˜9ÇwÍ0,HÐUa¾)2Úbo`í³rì¶`œ¸m¹ˆ É›aÉQ Ï™È.8ï…vy †®ï?Ãû&´Uë‰gQNB©”†>Ž!´Xá*±¡Yš+*Ç.ßOª³~<™$Ã0]‰»}¨¤f¸¯…9ô–s_ó(ʈY¢7E‹añùì×UÇœ–„ ¸*‰S¬:cÈT²Æâ„Žo*Îe°‚’ïíyåA ¯ƒpvVE[vX±$7Å¡gMiÞ@§;²~'¸êÆ[£@¬.`áü²3ù—ƒ‘åà¹{=Œz%ÿCËÁGžƒ3ÇFpD±×ªAºÊÍ÷ÓÌ„ ›ð÷¯Òëu-ãÂÊ]üIaÜÁr•9"!Öá½à%a#ˆ9Y·;?¶^T/ßI. ˆ$ ѱð)ò¡ØÿL‡Éûô ÆhE›G¿@σy—×¶#ƒøÒ¼M!Ψ£Àž€T3^6eÓP4`ҋ݉ª!%ÓM(Ûyð?_€Þ)¢ˆ1ÐÀÑ*¼ë\R꽪E£’e!Øâ®fY\Vr¶b#x”`h, … {®œ NƒËiOÍ{ñÝGc º†'[ 4Gdà \ãŽ.ÐܼOé2 lÃôÁøA€5…£5$°x–ýGábLÝC  göžƒé¼ßÄLˆ[øïƒ† 2äÝXÎGˆöÉ7ÝX*`›ñ’ ÛŽãIäO[¦"™ãfݛкf·Ö$Û†ou릭ÒY H¾š2¶¨ÊígÝ›ÉøY—NÍž÷3NX3câÅN‡'#ÜSÚ,qLôLìþ|>¨À烻œÅÅY\¸®²õt¹ÆD”9ƒŒñFÖ²ú(oTrùsñjß”àO“—‹Ø÷q¯‡MFR' úR1 ×C¬Á̪$ÐØ© Ëåy,m(Æ&.'ö¯xžwƒl¸á"Ž‘¡4Ѭ=6÷©â>Ycès#­ñn©"¬Ùÿƒ£Gvö¼ï¬é©Dáæ7Á¢ùŠRžÐK^3.&[T£ç. 9MÚǃ85~Kº\ºÊl|©¡›)%–ŽÄIã ÝvR Û6q„9锥‡£wé¤{A³'ªá²é òso:fóå-O î°tëå09‹§ý U"Š/0ð…kP€"]Da,+ ÆRÞˆ•äÿ} £J½¶X_zUˆˆ*,\’ØÖ-väé8‰_—Ž8ø´îÎÃI:œ&¥RòB ¾¢[ë„Wåá„ÈR§”˜ÅÉ3=s'GÜ>½ÄJà³àB)VÈ?¼É¡ó‚Û@h)* Œaßa;žÎ%é3_ɯ(äö'<–™Û¦äõ“ HÀê={âÛ£ý›òîåK.Ô;—ùUÿ"ï\¶¥ $|°Ÿ1¾`$9~Ûaz}V\ÃøtÍy9¨íÂIïØCc“kku_( }ͳN—Ç·)_ÀÉ­;q!«>ìËÑ༧@9AséØŽ×>’Pš*,ìiB²Îɺéw»æ<}›p¿ëÙ-vAƒ„{ ¸ÙlÊk¡AQÝDø&z¨qS$DßL9} Þ,¡•·3ýÝÔš¿ú8‹;¨«ÍD * ª¸Áé©r¤¼ ÈŽK2(”xGDimݲ.+&öÎ:ä+›øïcÉJA6-”¦g}Ñx™!ÉQ‘] Èïd Mú³u7xܬBäf©ØVU±­FøN€w†tѵJ‹3@‚ÌݪOè´±$Êö†“ä|Ì'•ކU¡ qýÖÀìÌ{Æyo)¦¦4 =Ž÷ð+cEJn:ƒüAP‰ –64P,*1//nz ×è(êϘ3*5o@ pÓÁr¾Ý9ø s›Ên­÷Çûê[ˆ£(iß뫟¼RSÒ=fÝ·„ xòv¡y¥¤í+ÕãÓË™ÆSÆqzª-"MÙ nY¶¡×˱ 0-œ”¬ÆÊ6ml…F†m ¯ü—5jc3´³ÀŸÚfà4÷†fÁ<¿€UÍT Æhˆ“Ìø™±1vjÜ=Œ ‹Ø¬2r!í›)#îec2;3GÓÓ<±/†°<…ÑhÌ>ÉhÈòŠ/dÉû¨mì)šázZrÐÒp€ÆBÜïNûä45$¯<{=4ÍðÏ0“"÷È%|¿P#ÿ‹Öa1„`ã2/ °àŸNضØI Œwbùä <»=ÌÛGä«LÃy š9¸ƒt˜¦õsaæd„e!À¹uø–7Üx(óŒ›b”œNÓ¾Å4ßH‹¤ùTñRƒÍL ú|( J3œ&ãñDÍ'Ïp¾ßÅsÊA¡D˜PLEYˆ ³»$æ>;C 6×épTrij3Y‹¯Ê›í{8³c3û³¨;Ý(´ 7{) 6šb‹/s Yâ«T:`ýæ¨Êï·äÒÇ5¿n”|/ì©~6ÃrA|ì„0RŠ? —G‹'íd&äî$¤ù8"sÏßÀl*'4õØ#âëäSŒÁcON;`IìÛ¦ë S ©ÔW G– ~-56GÏËô¢) ÖÑ ëYXéi©Å>þzšNÞ¥yâ&3wŠ6w[Eú¶üÓ|ó…6˜öŸ¥o?nrޱj|ž©åÉ«`³ƒ™‹ÿk>µK‹Uá½É8í²*ý£À, €)Z™^úÖÍòí&×íe)„fUY†d#xLEpð+§œs\x\”&µ>”dl?¡Âu¥¬Ò6±"Ô1afZ Cs"ºÝ ´²ÿ¥>W‰ªzËbíÇu›+õÏà˜-׃(¯´*xrz'C¿ômÚKn‡ª  Y¯¥Š­WŽ/ë9GŸ7ÈZ *X»oÔAò±°,öý¤«ZP«‚òýD€ìßÈþÄ÷¤8Y7éJâûr{0û J!˜*©ª ÈöÐMúáø–0Çâi:)AY–ü°®TÓ ©aÙ_Ï>¢SÏ\¯öik¿(ªìLH?Ô«°QÖ ¸‚ֽȬgß [¦Ú _×Ìy~[%V;¿1±áZ¨kÞº ¹ 9¯=2P¡ ¾ÛÖÀ†çñŠQÏo¬šæ"S@6¸iËÒð]·å@6ü"óœä®[;,4æ9…]éwݘÙð¬(dwÝ¢†ÚðÍ„Ìâ®}Ul4d+‡|Z‹4¼~÷.xÀ’÷Æ¥8àkz”Jë"ŸRˆ¡ ™ü¡A œóÞtw#…hßøuïÍ©¤Wc7~y:Mû=4Ó'¾ßà$`ôçW™;…*Ð6Šäò¥ÚW-*Ô1i« ]’ÃŽŽÂº7Üpþ?p aaáPs,gš ^.§ÊÐÇ3‚\ßÀ.e†!ÈŠQV© ¯ƒ lÛTþ¯I×h|6ù† t=ÙäPòT)q>©òfI½Í\• [è„ U†ð¶ë,Ÿì »Ä&J÷ïNpc¥C7ÍMHœ–8ÉËqò‘í°q6ƒÀªZ±í?Kf5ã…›ŒÇ d ? m)ÑŒvŽG|BWl­†àyÜ܉M™¯k¾ÒArÓY¡P‹^̬–Md@™~Sõád_Íîy\³Ð½Ð­ý—´¦xr5K.qdË“«Y2ë÷—æÉ¬ñœ™¦ûþ6™`dgò±rÆGàõEfdTà]giIUxi¹QT*ué¥7–Z\„žaf`X‹åê‰í™2“tgž¸®`_²8s;·)§Aªt+ÇcYq­8“…Tƒõ¦7EÆU0tH5¬WV2 Çã%€=;<~º¿Ë‹¯©²./?Q.ºÁZÑW=r\ºL·ò½1>f ñÞi\GØåÇÖ48š™í1Ô½kầ|'™0X®JqËF:öѽ“I/µAǵ}[צö«Ô¡Œ#Lö`én™‘JIÁÑåâ/Ú{¥˜â QÛrcYg߃• NØ$r¯§RÅ—iôb÷ÅÓÝWÑ A¡%‰Ù*àF…+%ùdHɵŌë;gÊ…û J=™?Pf‹]û±ï¢èchÝ)49‡hàù(îb¢­CBŒn ±}^eoC\°Ç/ìØpx_þ2j {=FC#õi$xe#•t^ïtZË¥bâØŒJŒU.w½ uõǾÎr\µÔƒãƒ½ÃƒÙÀ`ÐwÖ¾'w«© ÷t¸V5 A Ë ‰ÊUf]Q‘*o–ÊDœ‘}JçêŒ&ȼ(óJÞ€{ñrog¯ã!”Ò¾èT .R͵ò{/$yÚÄ%­7ž6Ÿþß+ŒëË2кE­ÜæZF8J>˜“´wBS©\²×‹¨wè|@1ð©jM Î_óÚ5“½Ì]º R·Ô¨¸§Â͵)7:µß-³TÞÿ½ÄÖ|9æTQÞÄËãåçiK(W…Ìý¤mã$â;êCµQ«¨@E¬T€™8‰c]5y7„’‡gT¨_i­B½†ÅU<‘@`^ÈR_Xâc’¯i Œ@t'H¸Ï³ñó)†a‰¨.!@©ä|ÑeeÅË.ÀYÆì:ó5L˜vpÕ;ñÉ{ Ë¨î™å‡bçg èu±ð¦²"†W€AcpITÌ'‹µýÄø¢–tt¼”¹be)±¢ø"â¶<‚úWŽé2‹[¬,Í+V¼é'[³†yÅJ~ÀÅ„ø´ŒªÌ*ì3G!¤$ïõƇgnÃ7‡ç›ãÎÌŒ1·ç8bDUÚ¾}Im´ØðóBÊÜ#%l ¼ÓncNP¢xøjbx¡@ˆ’”‹F­S%°ÔÛ1CAK ’óÐ¥ìP#Ñ­xEªc ÜIj…ÒýA:gÉj¥T,‹*¨ÁPEsÌ",àÞS—‚@³F6̆}ñG ÖôyÊ«:P^ "®1‘ Crļ­ÛÉú=Œß²‚–%L1ЛÂO!@°t=`ÚöL2ìÉ:LŽYų}´˜`âùô±²âѳ2=ó&ÞslÁW8óÂè\ê<Í“L$õÉ':È!¶¸°hxr…0?SÕdµô÷ÔŠÈgé{2î?²g‘ü¢e¶î=¼÷׿¢ߛ¨«—€"¿6¹¬a¨HI‰Š~ßT­á5¼KDc`t/ã9‚'—ã ;6£.‚¥‰øSÃŽSûXpÚɸá-yÒá8w2~kGóºÑè4ñiÆ*rº>Âx³âº6ˆ/ƺ%NG!ýŒÇL6¸†Ü"¥Óͬ (.©õAÓöâý|¯çØ©®Œ»øÒmËêRžô`¯WëŠÚ‚Œ ƒñss¦‚Õn€3¤ ff?áÆt4‰ÇÁB7¾?Ç_ –úsrS²Qп4ù›iœ_˜õ3Š!+ÞìSx yê›ÒõƒÌr®Í•¸€¸CKÄÓI6ˆ1Š……Þë:DáiïÌìY­ŸQšW J„›Z$ôX,êReDyÉL¹ž”×Ń˜ ,‚5Ù:§k§ÔV8°­§žG2ˆ!EŒ\Qr?̘[œëV»iÍÞÂED€s?e¹C-»6Ma‹‡b¥š}M<½Í-qŹk†òj5dðÕ·´þfÒÈŠ)ŸýÙû¼ê6¼àé¶ ê¨ò–nsF<>ßtzï…ao¹ÇâY¤{¢NzUMWX{V„ò!§d{ùTFg²gÙÄÈ(  uh,ªü–É~?ÁÓ¥ýãÉìƒ*2—mR±àä*ãÙ‡E½=Ÿç^n̆ ²¾s<´“´'¹ÞéýÍ?æ$ïÂW}Ó#–²†«A¼ŽºA¢*s¾O¨‚=c~¾]VŠs‰Ú­Vž»æv IÖŸB®•†ˆB.H&Ÿpmi/ÈÉ–Téf€Ä Þ«(¹¶§(༌Çtûã’÷¢ªGKT´;¬M ÜqCJñ4é÷P!lî'¤¯b‰j%´0xÅ•Al3g°7Y]H̨žÇãSH]±Ñ'ƒ0òF½bN³óiþ‚0i–Ý>º9Õ€–¡ r’µïÛc}NÅh).¯¶O÷«Cî¯v¤Ó¡ˆGn` ‡E¥Uä§>ÂÇ;ýµ¼V÷ŠðÂÍ›Ðâ‹ †–zÃø$Ô„:ýY,¼û²–õ˜'—$Z´Ýö¼¹ZZê‘Zë”[&©>á#äÙ‹e¹eoæ®{¥Òš¹ôÃ%±Â:ÿ9  ÄnÁÌÍù€Yš˜J^P8TË•Tþ{M¢ëÅ|1¥Û4³ Ý€§T³”ÏÏQ˜ÏOަ§7):hÌ9È©»¤S"¢ôVY¡Ø,Û(ÑU¡ìVXv+(+ÜÅ)¾¼7š-þDs†¢c%^äv(á!Vàe' âÛc¦¢y¶Ô$ÀKôÀ™ˆ»UÄ«e‰ù¹UÄ‘5ŽwV˜^‡¤2ì®íܵô‚¢€”Â/1M¸qÑx$ÎæåÁjn´U¸õ…êi˜³0lŒ€Z%JÌK±û¦CI÷Ös%0Qjr6Qõ!Ú™Z¶È}Ølmmªã”ÌâÉŒ  ‹I‡ÂQ*¯ôà í×üñ'¤Ô7$§›&9w²¾;6h×öñƒÂáÀJD·ør›¨¢a V¾Ù,$f˜ˆõ o£‹ã›—!Œ,\nvÂs³j<kL.‚ Äútî%øàœ ÄäWÍ,‚2‚:°½/âQóøàǃßt9¡"¥Ç¬°óÒ5nnOFõ–¦Áke»@wëñÌV…Y†hÈa¸³2"ý—¯èJ{¯G¬ÉVs);´®Û_´½H๠…8þK^ºPÝ¢‰3€)ÞÆ˜ª„›åYQlWóïy©7‡ŽÁƒíñ¬A—qJ»‰ß¬p6ðâ H‰Jз}J_¯3ºæ^‰âñyç2÷›V}§c»„ÿ™ŽXß[ÝoÏsÚ !&É~L.sŸ¥p6)îÛ uéã åŒoßÂÎýÄ¥ÚWš–Œ·¾ö0í7Œý@Ú?áÛI¤Åw8Q#¯hÔ‘Ÿ‰³Z ƒí‰. „3bîhÂ{º™€C ´PÄ àÅåÇÖ`iKån„Nž{â ç—ÊÍDz‡ë©¨5{ÅüV8“±‰@0A6K^ö0­s×|—°=#&î¢Þ­ •c¨[dD‰ß™–4b>‡¨}F̉Uýànç"ÏÇ›ë ®Ýð.u¢;‘Ó +¨Hó?a©í¡*­õ¦ÀAAšfÏ2Üu<#Ìá3œK× Ã:ºÈÆ“ùã¢ÕüÁbTTôè‡ÃW[Žë†šcï–k±xq°bävSHq9ÂqE¾Û~Y¨¯ð!ê–(±’o€Ž°pû™8dÞ8²â˜fV™YºdCË!ODÌLÆ© ¹ÍÒ8,”."ñ9ð±g󨹌hî~s¯‚}ÖθôÜ!SŸƒSS‰TÁ*m !Qbo*P: §ÅòE¤>íàóc•· Û¡•·Ã›/Š—#rÞ•Ãù q,Oã¥ò%*wrcaR@ ¬ÂJ Ñ½ÚÆëˆíýå6c/©B,ÿwö kÏMÅ=ùg~~Û^‰Þ]öéˆ%å"ùÆ“J©Å.„`eÁ%Ei ÛS.ÿ,véÀ¿º]¯”ï⼎ݰg¾fTÛ«^¦xtò§#¶“3&8:ЉaLjôã_~“+zm:ø‘nÈ‚µm*? Û>®„¿6ÂÁ;ˆO䫃çbÒš¦Êê6„]CÜ yb‚‡BoT(Õ.Üêýˆ˜6¤¿uSî | /¹¢ˆ¿>æÇÜávȫ؟mîœ#0™ãN²óŠGë`ÁšEm€X››zöÖI*桼 E&WV ¤X_®Û¶Î\äšôCê<ÛÝÙß~E•üŒÂÊ‚Q‹³’\Ôª”†™`ÊCŒ»D4t‡áÜ’íûÐT{ÆÁä´²¢-Å(eönQíº:1âšþAžžÀJ†,Y´YÁ¸³÷¡heËVûUÍÅÚ¯öU?¥`ùmWqFeòëÜX#î]pÈÉú™B@š¸í½Bç€{Û75x^{ì.D|5VO÷ûéÈ6UU•ßqm)IèˆÈ ?¾3¡Ée½.@ht‚F+9ù·TÐÑ*ÉÑ·šûXŒTt±ê3œ©æ[4!  ¬äf%ŒÞàÀõ¦–tùÒ‰š€ÆåíûìÁ‡Ü{ô•ûg2ÎØß¿èq·T©º`q–%¶Úõ"Pw+q *Ü¡eØÜ}×\ÝhäN.תî’\ÔKŽl$ Si§Þ‰©XpF¶Ðy]/3Í\\ÅBX¦7ÒߨZ¹'îvð oéFIrÏ òë¥:&µ =sWžqÊ”B߀E=‹0ä$.‚9£8 [ï²–ì‰x/€N⦋f/ MÇüOWÁO“'î}½ ÝoïõavúYWÝ„û+-¾S=*Bë®.ßvô{¡/?enÝë°”¹2ÊZˆ/‡f`:dB m<v-ú•²:Ó½QPÞ-¼PfA²­%Ê‘¦ô[gŒ„£6ײˆxäÚ™uˆª\¼¹DtÈ$®‹´.*™…z"ù¶9v÷è&Ø”VÑa"ÔÒïú[´Þ•ôøf<}ñä÷i®ï=t’ôZT’l6ȓƾ–K)d~p€Â{1%á*¹+»Çò(ƒë-ÈÓ@ï† òËaòÖ.èÓ$ú–AIÏ$*X(‚™Œ¸æøŽI-Z¬y¦ò~c ²‰S‡„2xÇC×Ðp(—kœ„¶;N@ˆ±pxíÂu\òs[/ý¸Ó™Íâ0HüÎ5ô%Q“zĸåCóŸ±=9\Ù4_ãɲm·\§¨n©gKt‰jr¿*:dIÍqU (seɸŒÜÑfã¼aYTÚÇ€ŽƒA\à±”ZTÉu!¯˜žÏ†Œ6è‘ÎPaf1î®ö×=Ú×ëE °âàêV÷EEh±¯þDUÙRó%\V‹•fPko½¢j:ÐJ¡C)GXT÷¶¬³¯?qŸoÑ$É7k‘Ô?þ«fìàdÇ\žÑêð–ƒë…7ˆ}¼EÝ8K!̳=ç_æ–Ñ€yGAjplÑÑÇç´'(ßßp× ñÖœêÊØž?ïc#ì=/½m÷¾Ý<úG°Ngø v¶¿÷6e«iÛ/k.þWq±Nä·qª>˜œWàm¥<‘ÚÇB~ŒóG¹Ó^»ólyÊÅ…XÆÉsïDÍn~’½^*N+ NÔÖ^8ª¨ö*ÑÖ™Úþ¬Œµð(Sù»~X[{ ¹ß¦–#† –ÁÖ¢G/šÛŒ£ÔæëJ:qW™;¾Û²Óý_ÔyºÜñ™½~³½Û0è}ÍFJg+òŽqÞqt‡M9¸òAE½ Œ´¹ûptL]ï¤CE§NߎañhÙ-nÈåk-ÓB…âMËð‡ë çgš†Â^Ç {ÒQg¶VXQŸž°z møe¥ÈvÉŸåiYÖΛÁÈ’¿VA®èðmçx€÷43ÄZxsàI&l+óôr{×ÊÁRª`­»ñºóà{•Þ Î‚)1l^˜!ùó ðçdËâ#IGÁ¸[¹:ƒCÅÐj5(> h½ßVÞ@'Î:Rùü¡©/L®÷@"ÛÙDò Ï›g`9oÒï]WžªÝÃq¤˜¡:àÍêÊ|ÚBûÍR7âö¦4{iOójWÍÚ{®ÐW`ŸTJú´ˆ¸ ½pïÅãž!ä‚5^C ½[€94j,’ÊŠ÷Ú h¦…}YÅ DùvŽ›‘3¯›Ðô\^@’-¾Y¤›$î^§Bë=²¾Ò¢¥‰Ð¤ÞâMîD‡?4È¢/{ÆKr޶å a0°‹Âg–pÇ—b5LÞ“ˆ!²¾,3,z•l6’­Fò ý°‘<¼~<[‹ˆŠuÛ÷míö¦Ôo?š A §Z ã¦}g€oEëâë(‚Il$$G—\àPÝód3‰Ú! ¤¦g(ÆX+[©sA i:•êë¤Á‘-Ÿ÷•È„Á ùq॰ôTïdÛ¨Æ+E¦¥É-È5ØöÐ2qü–c2¡{ÑÆ$Û o¸Òš5i!P³q>á´JƒMÿGEÞL2(|D·ë»»Œ ®¸7“èÔ4âë*Sëº,Üs ýìø}Cèæk³6âÅëDâ½›Pž·%ûÎ1þ îõ^%§ovh`­µ ½©!KP8ÔÇ‚ ãžýWù'º]•Sʉ;/(¼{à]}ìì+—…Cc‡¿UǺ} aïZÆeÉ¢v-Ê6Ñ-`ð©«ÉâO! »69ã~<>Oìó&°F0ìù¯ÍºQçs×Y¼ùê1ŸÒ™»ƒË½d9lþÆBtIðü¬Ü`oÁNßšm'wt§#ö–é2Ô©¡•_, Ðn0@ÍLÝ×OÉ´éƒ<êÁX{ÚçTáˆE v Mµ`®$NÃfˆŠŠæj=3ÕõÚ9'u¤‚Š÷¼ó¶;q¯Ì?l¯üQçì@$¤{M˜,9hsD?ÓPèS}ç—7;‰s¥åÎãK· N庈oûKgY6¯‡³l(³ýÌ™z<÷,^,¼à4>ÿ<¾r³^ÿ^¥;X|7ˆš]:ƒßhl·9‰W¹þ@OX–ݪ=Ö`gºÍÂs·[óÝA—AS*鑊måN‹,Fíþ¸ˆ˜§!E—^€jçY/W{»¼©:ćï‹'zzÌ»”Þ¤H«:ÊßìàC TÒ‚ó{e8>Å„…/:ÔSÜ÷žê©‡·8ÙSßÖÅ5(<ßëšún|Ú¯:é}Ô/(?VÌâƒö úfÖ$ê NÎZ1‹z@›Î°¤=(P‚Y(à¹v«ä¬Y$LovzŸÉSù–Oð,Ř¹½áÏì§é„ãù“û:E©fO²§àMòοëÝÁW‚ëE®+˜[&²ðÆ ç>¿8­«0†ì|cŸ9©lÃùi{æÂ½\CÙœëÔ»]uÃó¤s þ¢t! ý¨»zpÆ $ª‚ µ5ë îçdؽhAøó_Yì“7ä„/vMÉHàåµ[½sí`üB)ø‰¼¡"=—‚ŠqIE³¨:E¸óÄh•€ Û@ñyЫV–VUåZ'°R­p÷rä꺳ÀðFÙÝ(ÉÀŸZäèEnž$OkZ0†šöÖ4ºç×´…”«ûRxÎñ~­°×´§í H®jBKê¨ívükÑÕ8:%^EÁP}@ÚE€R(Î ªŠ–ì”7[©<Ëõº'½s} 2,Û³J‰ÆüŒxNE…‰7¡¡WÞ„&œHÖ(Ñ/œf/J¾PÜÖÃ!“TJ•çÏ:I0P»„ãGšVú˜f{˜ôùÞîþ³ü;¥;—{%”àµ}îÐ̳iÙ5„‡{†…Ò;‰³®™Ê›çlùkU:Q¨»‰~±Škë’£›5æ5µ¬ÂP0xúwi óⶉ+m { žµnskàÐ+XŠR“X–S±ÛyærÁŠFƒœ Õ;.=ìp3"®£©ýÍÊ`¶ü‰¹ºò¡²û šoús²¸Èta#:2X¦ ¤ °ÐÅ <;˨Þ\ á­2=eË­My§Å—Bq»UØZUÐéãè Y<‰=åsIq\Ÿï^`é=¥C¿†8GElè:Ò¨¨C[¶¾­ùT´£WP ì3ì¨û*ƒwUio‘)”tŠA5SÖ©»¢‡ÔÒ¡´( WEuסx·ÈiéØDIâ²Ð ÆW½ià„„¹(ÐMÈë-Z zq/×)D‡ÝH†q .y3×"èÀ34eú#‚K;X…Ò”õ5Å…^*G<äè F…‹r »¹ûl÷¹ ÷¢OW,÷è%D5çCÑ]°ÚmòØð®YSú]-¨îçf®Ÿ+-*é ®‹³²œö´BÉ™‡/'—(‹sϪ⌇¦G»£†J:}Á6_‰¹=¡ƒDƒÄ%Îè„x œÇ¡ÏucÇìî|¬}åOC%­RÌ=Ó*ü§¼í:»î‡0µØ|‹U”Éǣ⨠nzÁ1_Kéì9˜eÈã¶Oíâ·ò"x±'ì†,Ѐ݀>ˆ\±8Ï%ñb…ô0B%õŒÈ@H›¯šüCÃÉ¥‰ß|2êÂ)E¿dÕä \¡b_j‘ZIóx•Hù“¹hAb.ˆzŸj™Ý|‘QpX±ÚUfÔ±¡ÐAí”MF[Nx®KdÆÆÆ.gDÌʦu+O‚“—2n–ÀEÞR;òî³ÿº3ßf‰wyQyYüÿÞÚ·óéÌÔÁÇc:&#n \ÅÉ­,ŸöÓü‚‚3)]˜ŠF¥eúG©`ภÁރЋŒÎ ~CÜ9øÉG̹BmË—oÃ?×!#óÑn¡ýU'Ñì^IPwˆÚç½Ï®ñø(vˆìß\IÍàS7Wæ€e,øt*]±LCuFõ£ üEB¹Sú¾\g[Ô1‡UvI»È)ÅëFÑÊG‡X… ve÷Úª§u…1ÐyæÝz%*íòúå7£>ñ*JB(–ãÎoT’‚yƒ¶ÝUá ùMÍ©ÿÓáþvgo÷·R}y3D¤@™~âÙŽG"§»gÎ7ÿ?ßfàÖÔOÖš–?/h‡ÃM¸ï'x{2³5TÐ-„~‚ ü?U@'Y¹.æ=×uEãºbGIÒ2{G‡;æˆ-fÔ4ß<$û$rŽ:„j*Ú,î.Grµ²ú)ÂÊÚ@œ‹[åH€Á #¸€E÷6 0xáà‰ŒÙ§§»v/%ÿ„äÄ´æ0› _œ…82ZúbÊmÅ´Ëy5;i›(ŸŽ,íPä´<Ì.T`ú胾©!äéëᇾ>·3ìÍI‚J °WÛÙÿüÊlÿ¥¹ù©B³É yŠ ¥íÉ̆ ¨c×ðÎo®0ý®.Kñß}Yú]]V2Ú »‘ßÕ¥·;‡¿©.Ãïê’|–µ……ßD… '߃ Öœé¦BE½ ûijÇ^”5ºÍCJ¢8Ek‹AféLSƒÙþµ`aø«%´ äÞl`zHˆ.){˜˜³ÞœÑ¿»^äî&È.q—Òo…ì ÷ŠÂªE­–œ¿ýÀ CP¤Ÿ'cw;’ó:e¶Ìi?yÌa*áØ€12ÑÚ |Ùý‚v7+—„×鄼ñŽqÈ¡%UXjH ¼i¶QlÖò—}G¬mÎü‹™Št S¬Nm!ïˆù;ÊÁ:éâ¢Î2[ÀË+²:ƒ˜½–‡}’u­¬uÛ@î7‡ ÏC Œ¼µÀõ&‘Æáµçƒ)Ü€$½#º„£ð…x¨ÊE †H®Ìã";h­¡S–t±ÁȇÊwéÓ9Jþ ů/¤N'§V üÅ îMª/" -UÒC@ÒŸ)e'Ås*4~<ŒÇVºö/‚:œ)Hršòˆ¨¦}ÇUƒ×AýbΔû ´-ç¸þšUPÜ'Á]îïîKc®À‚P2ºÀ¦+€+˜¢»öP=sQ¦Ý…¬ˆ¼ }‘²àH: ó, mó1Du‡ÓÛ{•¸¿¨­ ɵ(85¥w£Ê—ÉÄ©#ƒþ¯êxÚÜ’½œ4Lª¯™nÉV€pwsF‘ ,¾KÔÚ¢¼!ló€ ¾LîNêC'NMÇÈ‚š1é@œ‚?ŠAQ“¬ ûr­øvmu…↓F Ô CÔ þÑ«xY’¡/lztJÌðŒˆ×ôõUQf ½aÇó’ž½?͉J(B_j¾¶h6 ©/Ò!Q%6 %:é K¬J«F;ÿ“çÓ!Ø\aêFøÑvß^ͬ,ÛÑÙPY'†~Þ>›Û“ ó¡3Ëàb òVŽ"¦‘ŽÓ¨£]©êE.ëZ 2á;ug&À˜Ï¦{ƃe©*ùšcêõ2ÈÊüÎ… ØŠœç¤ÀñèD+®³¸›*wÖ5·ùo#xãÏ0íàWXÊ]Ò·õ"$Íß.üV%%GH[¾Þu^tÚò¥ðbµåË5ë&PuOICx7`»‡_ž’,k¿Ë—BŸ º¾MÀ2>TTðÓânvp`MXÔ»‚w$I¡ÍU$êš=Cr6+¡Ó·Çú t•_Á×àÒè%~Þû—ÇÅw †4ì…=p7Ü ù”Rѳ¨˜PYh1,Èzæ¯?KØ¢%_(U¾¥8!½’WÀ„̬ACSû™BÌ´Š&þÊÌTWJ,¿ Ƴz¦/|u‰—\â.€ŠŠÇƒ©.%ƒ÷c$žu2†E8buí§VXÜže°ßÅ4F é€®×ó¶ûÖ•\îRºÎÝáÛ¨~}­´ bQŠ)\Þ%n'' ô£ûNtd•§[®¸;3ƒ“‡«å‚XŽÃ^¢-ô‘Ñ[®_»EežNÓ~+ÿË—OÕ§û:ÜËÇÝ{–âî¡È±‘¼iæƒþ¶qß~¾yøÐþÝz¸¹ùþ>xøí}|n?·¶ý‹}þ`Ëþïá–-·ùèÁ7÷ÿÅÜ¿Ã>ÌüX†Ûö¿ücœ&sFO¦`.ò9ºô9?ˆÿ£Ëqz~šÎºÙüë_ÿâþþ´ ºþNÒ½fýì?Á"9ÞÒN.é®/õ{–Ðí¾Ï­l( -ý¢Ü]`÷Ýžé™]ù¸”·ñFÕÝoŽÔ]hU ÿâýìxšðÕR¡§N6ôw~Y¹*kù6¿<]Ù5 ý_Ö¥Õ•›¦y¥Q~ {7zwE±Ùþ)ñżu|›]X5HLÙ#Ýå~Š$5§¹) À—ô±³]RœÙ¥«»Giœ"nGJaÁCR3¢ØNa.˜Y… ã·¡D2Õ 5BÃp •ÙE|±¹E1mEÃPî‹Y…(™‚%Él4»Y)$Bª,^…Ìç:Wäs#Øú< Exa%‰ß0.‰ÁÜ UÝ8ÒI½"‰%ngNbý—H$¨ â£CÆrÕª:‚¼&‚0Üvidñ „@$Ò¶ås»º ¬¢èÍ&XÕmÖ†~nÁÏ-¸{ %{³Uwzba«R…l‰žþÞ¾vß·ÐÝâý¦ý÷}©ÆŽ(øõ&(¤_úÅ–¼ Ú’íô½’ÀÐøÞÿØ¢Ñί+þ_R }Sq}Á\V±‡ ŸGƒ+Ú üëm™à7a^À´ÂïBmízo+ëŸ ë*ÛM[UýZXþñ5Õ¯ÅmR.Tr¨$Հͯ’¾X!’ð|‚Ö„Tš÷dË›Ýjf>/u¦léjPB¯]+ÅÿÑBÑÿ¢O ÿ[R»cÑ? äÿû›ßläÿ‡ï?ú"ÿŽÏå/ȃyËï=³k÷8íArx¼-"Õ<ÜëÿoÏÿ››¿¬ÿÏñù~œMG`º·ú§ôLœX¢ƒÝŸOv^ÔñYtôbÿàÿžü´ûêÈž̺ټß|mè鋽ƒÃWîÝ“¶Ùܼ¿õ׺\SÓM•„q=!ì¹Óóîá#Ko««+ȉ£´ŸP<úÿcw¢á?îuù™+äÀõÓÓq<¾¤Â÷°ô†}ÿDW畯ø6U'uÓòø"Ë'˵_h}ØKϤU¯Þµ 6›÷è¡Z‰A/»ù~ÊW"aÍ·ñ8Ñ .b•piôœ®;OÏa«—ßøKs*l•«MÓž¯?Ά¾N|jw{&´ 'ñ{¬“,݆`dh"‡Éäá)”Q‰Õ•‰|±<È7ÂÚ#7D­œ¤fûñð| †ÁþÆlÎ!U+ÀïßnØ7"ÖÁ›2"Ÿ=R[(Œ‚ñò#µô‰”èTh¤¾OôwlG-Ññé)Älc³gè UUƒS •q2™\nà%•ôs4º7!]Qóø3À {T,áæ¢¢l€2õXæÛöÌ.8ÇEÿÒ “¤—ôZ.ëÅl³3ƒ°DSa¸[8»pH¹ÿ€Ë.¸,eýËA6]Ø#¯TiótÊ.x]¸Ä—`‰kËŸMûrÍ}6QïH1 Ĩqnr‰d dbü6§D¹$oðMñìúkÁLû™‰û£ Èõ1Œ`hhOÞlœ¢yãÆ å5ØWEªWH¿åñ@êìD`À‘™•=.ÞôŸI®Ö.üô_³³ðUvÆt+g:IÕ²w¨ˆt‰ƒä\M!PøVP“ ÉÞ62ÆÉÊ)ܽ„ôè… b‰?¶ÁñÓ¸qg㑌7†ÙxÀ_¸ê÷j©g#C—®¸\ÈÄ>Ó]òÉõÛ°w@Â^pááž(e¯îy°/v¯wo&!Tš]€YØìžäf—Qëš1íL…»Ëô»»¨ßÝEýîVôI¶Æ?Z ú_ö Ïÿn«ºÓ6ÿ·¬°_ÿïûåüÿY>N$±LðIVru«œü‹…“¶rÞ&‡%)7‘rrK¯£ãt‚ õû²ôÿ€Oxþ×âÅݵ±hýó¨tþôðËúÿ,Ÿ›ëÿ¬”#{8ÚûÝ#¼%°ÏdÍ÷ãËl OW§é$o¥`€d³ó!|½–RHhPÒ%·¸gæöô¦ØZúg?ã¼ðwñÙY?‹ƒJ”†¾X­ütD×[ú‘ûOˆûŸ¢÷¢~žÕ/ãîë§éä9†rå 0LFz<ÄØ#ò~°‡0*wÍ6Êì> &…"êS2Ç`ýkéÿÛX°þlÞ/êÿ=ÜüöËúÿŸªõÿ×9ëß–×T"&Atº†³¶¼ÀhœãV±4 ÖhÚ“ü»ycÕ€&ç4KGJw›ÃEÂ8%én.]PX@y²Ü8d‘6“&KTI‡Zv¦Khßï¾ !»Ùxœä£lØsʈF5ÌÞqšdl` Û‚¡ÈÎ"Ú„R”3QÔr”³—B–€Qð Ôæ‹k$,'áJ×É÷÷†Q˜ëè„¡³vì`—L¯!|!»pƒÎFŽâ*"µž×âè÷¿¨G3€ît’/ELJjj×áó(Ãá©&>ÝÖu]cŸ äD³ŽAÈJMhæT™’R˜h ܈”ÏVÃzŠ ÁiÝ66ÀÃ~mBÉa91¬ƒÆqÄ*¡l´¦Æq¥jÔ? Ãåäþ†9’O° 0ååkk‘œZÐ= „‘Kq †”âÖ“[øšáþ¯Í½î®ùûÿæ7ßnÝ/Ýÿ>øbÿýY>·9ÿßE('¸IÁð-+P@Ï?@‘Ž8yQ­Áx³7Eý6Þ6‰I!À‹+ldd]7£ +d4];|ï”ä­UŒ,½aÛå„KZk¢?KÀ PTïPËu_Éö¡ûÄîu ÊµÕññrµ½ý/…C'`¼ cC0GXÖ~)ƒ¡¾Z0•é,r+5¥=2ßiBتšNSÃ×\ª Hhuˆÿ+hFøØOôåÃß ¬‹-âm&¹ yc':w=VÂÖ0`\<¼T£ÁHg’1;@€ŠC€!ÎÙ:¹Æ¤Tc †RºæŒbÈ©ÑÁ˜3åã)Á÷]:±=Ë]ª)º¿4½Xôkß!À;Z8‚>m‹ÑÙîìÊ)"§ÀA6ÁfnYÉõŠÚ§;Vž;|õìäÅöKˆü1¹lfãÞÉëä’Ràø;” þÞRõõ­Ý*P—·Ü)¹ú(Œ©[Õ£ö‘¢„iK¤&¸_ÂÙƒ6 a^ðÂNˆBU­Ê-,P]ðRbë|¾dq¸>>¾ŠƒJqXI­ ’[Åš×T¯&÷µµ+ÓbP|ˆµ£ƒpÙzTžɰ<‹k ÇÉYƒ‡e—KgÔ—a\fÁV¼öOõoÁ,ÐûpZÆ.%ËýÀ¡. ǺpÃ;CføŠ½û›Bµx!yÜ›iqñ2ô£Î…5äœ¨É ìP8:íF1æQþ^5/ ŒÙ‚Òb!ÍÁØ¥ƒÑOb´v$a¢îK»%Åéxé®>qü¤ÝÃ)ä¢K†¤¸¥p¹˜îñ¿þºa©¢a¾nëa©ªqùg-¹I,Ž ïês<Å?+\ºð„ÞOò@qÇæ %¨Ó¡›8=åͳlgý7ü¾u_]G.ÜÁµ‡vørAÙmùÒ9ßyg“ uš¿¹^r! tß¹¬ž}\!'ë÷í¡u´MðæPšîâ.’«Á‰ŒOï' Z¥ß4`{Þ›X~ Cl¸#/æCÌ“fÄ öÞ]p˪d¼rbHÕÍwiJ…m ÀžsÙ°00*AË3Ý–gÀŒ~źZêGC¼áH;•C[â*ï²ñkD.Ë|ž[É¢RñP[¥©2¬Õ05Wk”ÆÔ0YŸÌ˜*—2 Fì±ßR3ÁCÖܧ¥É{½Œ[ÁO.¡–ÿ.MY­ð§´à×uKÿðÆäá]\´ º„¨mÚ®0àì Ú,²Xfåç]6#v„Çã1äÉÞ&cv‰×9°ÂÑÎRHþμ/)Èî&ó5¤lC#KÖñ9ItÞFb‚©‰ÒÑýĘŒ.ûœ–V$Nl¸« i©_NÔõ¯ý†Hü}R›”‡ÎÙË‘$‹ü½—Úww1À!Y­­®Â09Ç›©-Ó³;ÏØöá2þ`6 °M:Mê<ê Å]¸‚¤±ûY·zµoC:°þʰõÖ7›P¦»HˆÙYµÆ 4@Ó…|Úî--FEVS,땱§’ôì’²ECdwÐ)ØùÛN’8'jè8=€ïKÜëaO*X]µôí”a'¨ Іã;Æ É,¥žõãs‘aíG}ìW¡+ßC×oÜ“ÂìÙÜu¬q≔ÎL§ÕdÊú‘2‘‚ÈpêB!@ÓfIUˆs¡à2Lâ·É|0u Œ…8á¿®pÇ(¢ Eo¥.zì¤8Á›u}zGÜq¹U…2BMìt€l&…uüXOŸþÎ1™`}o·²ÿ'i®Y]ÊÙ²õ6Ôªm @«RÛ–LþoJÒµt1%¿Ýö¬äí.ÛX´þÝ/Çü²þ?Ïç6ëŸÖií˜Ü%÷ž9«‹ZÁY€ ªèStÝA;¿)§´%§½U—yHËbî9¥Ej« ¿Á°mÂn£|Ò¿Æt¼ã¤PÀŠ7èG %&ÙÏögK^Áæ;û{}„¢’+@’Óÿ ÞÅõ†>¼›6®ÿo‹öß<øæ›/ëÿs|>ÒÿÖƒòÝ–~gûéÞ‹—Þ5H8€|]‹Df€ú––Y#wqVæð²¥‡áÂ?-Sey[ŽžÒé†ËƒÊ|ÏŠ$y±’+ÎA‚ÂiEéHuŠCp5.ã9˜®JE«ÿ}–`ý«}wÙ¬ño=š¹þíÇ­ÿGö,ùŸÀÿïÑ]vbÖçùúŸ5ÿÝ;¤€[Ì?Ú™ÿOÿ™=ÿ…H ÑÆÂýÿaÁÿoëþíÍ/ûÿçøÜxÿ÷[üöQg÷ïðY…û)¤—ÝEÓ2Þ«Ý«éÌ7ÑšW4ÌšSØï§”xw *וá#¹7Ý!Ÿæ´Êü7?$Ì^ÿaháic¡ÿÿ7ŠëëáÿŸÏòñ:¸Ý7˜Úè7ô¢µË€û`_ ø¦–üô ~á©٠׬7 L>r°ˆW%ïÛnИ]ƒ+Dn¢$Ùl$É–$¢RÉ5]#·5rªþ›/çf¯Ãû#ÛXàÿ·Êþðüÿí7¿äý,•—sÛs+äw§}= û éw²!{ù“á«Y]¹Z] nÍŽ(I€šÛyÉïîËï.è³­äÝв[¤·¢ En˜*²ÐOi£0則ð+þ1]¨†uµLW1cÞ3±ðqeKÛYhîåÉO0¶b_n7•9#ÓcP³Vp?ÝØî|xå¹ ã§Oò?yúÔÜÀ|O?ùäÝñÔc †Qܧd)Ÿstžâ$2Ùn©êìÑïG­C]°eq»¶.0ùVȰÊÜÞ "w EáoÐqAÅ.xeÅãóMØ}ª·T|¿5û}E\®¥GtL=œ.îà§i?ÜÒ‹Lfö^®æD¨Õ#Í.â^öNòÚ "†&SÙó€ÌšîÇ3·@ZÁØC6²UÕVo >J^…åË0ÔS¬‡ä}7!¿K–TÑ´ ïaùG‹s ã4OLÄ%kà„ s9M2m‘R«+0°>nǺ`pÝÜ.°Ʊ€XÆtX‚Èh7BÕÃi0… KŽOn„,©vÒÓÝM€yª¬†ôr p!E€CãnÀ‰$3aû¾ ô©9,½oÁ+¢Š¶û¼P‹ËIf>Do3K>@ù_¡1èpîZ4ÛpoÙÁÙ¯*›+œÔ‡É†œቮœÍÅ#W£Ì¼ä#窆;5Ü™çZ2¢ÓOB]F C[TÓl6}4Š‹¤tælÒ׃3à¡ åͲ5z2éJ+{«®˜{skßM&Z»‚<ÑlV¼GÚ­, Û–çé°¼*VŽÒí° E³ÐoÄ£õÂG›.VM`4O%•Zü0ÁÐÆj·©ÚÞó‹úüZ ]c†ZcÞöè{÷ñz äÀrº‰%6Y2Ò˜t.9÷×ÁtŒÓ.é ޶;ǯ¶;»¨§ýù‡Ãý݃ãøãhïûƒÝgøuï S/íØw·gßÝ®}'ûöÝîÜÿ#öî;ß½o¿#›)0–ú­rýoõ™­ÿ/¥è¼u ó¿m–îÿ¿yô%þïgùÜøþ… »Î_¾¤8°Õ'Ûÿ´‡Æp-ûÆY‰\Â>ço¼àG£c6 xÿ6åÊ^ ª»ÒOÓYÅ•å*Þ¾™Æ½rMÉéëw‚ÕÕÔ¦n/<ýÏjqb ¸Ê(}þù_hÿóÉïÿîßTÊÿøí7¾¬ÿÏò¹¹ýwÚ)˜ |1úhTŽÿû¹ãÿ?xôèQÉÿïKüÿÏôùˆõ/‘¬\ìQÇT™Ë‹ Jª"°›÷!I[’#²Á"°Wâ=à—èIô½ TÆj|Ú)<Ý–„AÔƒj÷…è"Î/è{½ØX§CP)·µÜ!¸² ²Q~#•àH¹:ëp –@!42*4wÔ¡¨öý‹X%?2N-' *Ò*ZU!åýÄeä—/e™“t<«æôkïý ‚¿Îì™+ÅŠ½[åxaØØ;‰‹Ÿ¨"t,‘ûªŽkø%nì7VMRäÂ2Ö+§$úŸCtý¯kŒJú€ý_ý5*ÇzmXfŸû—*ýÀvCcQL‹Ø^64lÀC?ClØè ûÿhìWY¨ä±-Xü”!` [QR òUÅx•¢«Ú6ï3Æj%^0|› Sdøwqu~Õ›„G]êtVèRO¦7:ºDPM䷉عT(MǯÎ&ú¤fdš#«l"~?™¬®‚Šñt ©Ai•ÀwßmÄ›æb '7ûÔWé| í ¼RÀÓ¡X·8IyZižw§HÂZ¦Õ2_ñ#©æ¥ç¨îªÙ3O$ëæ49SÀHûå7ÙHàL÷Ê:u6ßòâZ$ñS)8wí“Ky/önŒ×絓Ð$Ÿ¿ý£™ÑèÛj×»†\‹Û »Zi4F£Ñh4H°¦¦ð¥©› Þ`†Q5!Þg/ Ò\ÂËôœW¡šúhÚüË(Ň.U„¾< ¶~2§ÆP#ÐYªáRû9öPÄâÌMÎ!‹%Æóõñ•7~ÜÆsyQÚQ;Jf4HZÂÜv,8 ÏCÄ‘€m±×'AFb;>ÞÁ{ºH¢‹bˆg2–_Fãwpí…a3‡ÖÅ݉·qluü¹yÚž¹ÅíÒ­©%ò°ùØŸÌ‹ YuŠ)}øà9 "µBÒòXƒ ç]E6Æ­ŒðfÚ®¯#*aa*Ê 0l…ZÉ…˜Ie)Ö&¹¬Å™A·g–ŠS/ýÀ:úO6èÍ-õ ô›†RÓîFp{0“u±^swùi î"dØ÷·À´O:3÷·ðžî/È£VkKáá¬[þ½r­kËŸ\2Ú|i“WPWãªüb°+é~Ô7¢%´/4JôõÑÈ„\XÒàœFå¶iAû_Œ† e]žÕ„ë r©¹•Åu‹qÞÜŒŸè#Ÿ€ ½Á º°ð™âž£¸C:Ëk{ñ&‚û²~Ì.îrœv¢¥ÅàŸA¨hÍqE ‚âž÷"oߥ°=ìî-B ÑêA Ðì”­6ߣÑ(%'™NRXIdCÞkòR fY-ÂJ,eL¥8 £âËM¯ ìæFÇè+¾}1õ%bÌWý–å06£— ÌUª?g Ó¦ÃÄ[rÖŽâ Gäþå sÄë9 ªtO=‹T„%À ¨B ÇcC9“€–gˆ8µn¼˜5ÐóTZn¨ì”Hª¡£O"JxX sM’MºkŒ@˜4Aÿ\|BÚ¶'ŸeãPï&¨«äàáÜâÆþ{.š=JH,^7»Qêm¶‚ÚšéÞzƒFXÜ5jjK T5½_£Uµmº¶¯âš$£xq«…”×6høÉŸ)gT¡öûbZNƒðΚ1ˆdaX5G;kU­pø¡PÃÇgO#0 xª@£CøOVÍ1dðÛ€ô_«§,jõØî*n6õ=Žöõ£g‚ZÕC…Þt®·=ý¡>6<`£0…êµç¬Àó½l2’Dâýæ-Æx”,¯ˆÆ íL*Y&L'dH1- K# ¢ J© >½é‰¤…ñ4B5 ×hð_–ZdËKº5eHVŠbyD¡êµÓ–r`9µ=ƒh®Ã%°¼kJWfãÌåÅ'w¶¹øœÅöÉnGte½Ëyl_›@KÔªU4†‡,oœ °.‹$Öò—\É»°94œÐeÚ‰y‚f¨nE“îÐLtötH‡ücŠ b\ö)DwZk£_¶ÚÏ7‘šbRƒ{mŒË±y@)1âa Ûß-‡¼³[XÙƒ6e^8M¦C¼<œ=ÝûC$^ œ¢›Iç `³²á`—ÂÁ«|6Â-@–œrbf#†àvW3þºó´`#½ºµ׎|a]$at52ju˜_LgúêHÕÿÒùANÑ–‡ïVÖÃ×tiÊ8ø²—®DI9énñ¬ÅrëfK>p²Ü;Û’œLzôßàDÜ8ÜÂ?컦ükÍú¥g?rqí°¥Ÿ Õւ%·´·Ìr¢Êa¾2\öže˜JØRª¢9ÍoY¯6UýÆxNÛâ'þÀòo‹ŸœrünÙïNi•Éz7!ãjËI0zü¹áÞc¾2Ñ ×T¦›2·Ø¨iÖJ䓉sG•èØ%:ª„xâjÙq”ë4ýF·LëœÑ”#íg¼qs²e¾qµ:ÛÒÆ(ý ¿[üÄhîš&§ZÛe[™4ƒ…ÜœvŠQ¿¹õµå$Ù¬ Œ-7ô´’o8™·³:Ge縞õ«ÿìû_Ó›¸î%ó›ÿ}uýÿ¥¹ÖjÞÝÿr+¿ðZ÷¿8—»”θæMïɉ>¨‰5-¼Ú;†óàñ I‡µ]%Íœ$ÒÙúëΡPYöþÞÙ;:G{ÏÛÇâìíN{G<ìî=Û~½ß©™`àÞH'ñð@4èsðóá¾(±¿'%U«h{ÜÆX'…4^Ð#5CçéDç¢B_­‰á`Œvúˆ(ð®¤ÈÊBpW¶!øÜ/5PoA½RDk§—ä v EƒËæÀ-€%—H*„12Ü>B¼áuûøøõKD]ªø_a5"HòbIøâð¨ƒ'®àßýÃçò||¶¸ _v_?Ýß“ßèEªŠOEðQUÑÙ8êÒÙd°JnÏŽ¶w:íÃí}ƒÃÇAqãC/Þ˜zª t¶J·¸}î'”ŽV“êM€UϨ™ƒÕ]‰:°Ú´Á`ýè,oÊÂ=öãhúr½9Lñ S¡)§àª×L/GKúÀr{wï Ó~ÖÞ;*Ò¼`ì·Ó9Cš¥j4ÃG—qf†O¬¡9ÒkÁâ©9zéÜ9µwJ½›æ‘ny%»õóÅêàu˜§´¿¿´_¾Úoï´;|´¹¡ì~WñD ÁàŽí †²dâð¾ÊèÏyÖ†áJEä^G)^BaÖ‡{ÛY= ¿……ûúxl½â`ƒNµ(!WuF¬Š`bƒå(k¯Å~oÑ•`ý 2I ÁvÏ^hŠ‹: %¢›xu·ÐbÀGnÈc2É"ùÙ+.¢Ôhæ°L0!ùm:H¾Ù_í‰qqxtì´CáȆ¼LSÜËþÿvú—1üÝí£{ºøô$þÏ' (&øã#ü»÷ ÓþÝ"èsp8–ùŸö'‡cúK_ÄÃßHÙO/úgèd~Àd;Èø¨7ÄJ½ ÜèY(ªo¢õ|¨VÂ@}>²_U¸2Ñ?òÖ"ä™c¦š˜¯GD̓d‚T9F¢á"…›9ŽÛÃ.<$éD>ãݘ“èéu…‰OõÒˆÚ†:vªSQ"1N0"%zèÈH埄ºÛl[ÉO0ÏoŠÿôé$بDÝø"ôÀó$ À8‚ž8p B•‚Ó‡ñpz™>$: Ò‹d:èÁ¬7‹ ÊÚbaÊÈà)<²Æ(òXÙP<*òRÈZn&8™è ¨`ÇyÙAnÝ…rÕßá3†aå—t,VœÁ†0ß#ã`JÎL*“w÷}-y+-”ù Ø@¬,î’™Yž%~Ü`ã­dš WFqOo‚e³€S-©D&븜§æ m—öw\Hr],&ÆqôN‘WHäá4–¯´Œ-êöYvÕgQ޲í Ò‚~ð£eæLèÀDr¬†fø1#ú˜ >6Í»MBÚ#òˉä}l½w|lŒq`\™-ÌÂÜ¿gbY†ýužâ‡ÑéÄíkÕ!Ñ@}ý6PGAõEÆfþ 2$4^Œ‘ò·iœŠ;bù’íÔœYV ïüBz_F³³OO‹P?ž‚âËÓØ÷ƒKLf Eç~(βÃ2;‹ïÇ{½ña‰üjB†Ç"7rãLо–¹§nf-&Z‘ödh÷HÂ3s‹é’¨Í¢ˆ‡ÅŽ…âFm"¸R}§}f0¼ ,äé8¸Lzñ±búw,Û/¦ñQh/2 ƒœÊoõ@Ï>Àôs Wû )c¼<TöL&Õ1ìs$÷àùù˜´ ”= òå8X¡-Üω&é`Ð¥qªÆO„CM/’ï%…B"£CËïã ÉY{ÝWéöJÏ\$ã|MëM¥#Ìø9kl="tm YŸñLÏ\f;^% PŒ“ðüÈFRƒ)C~ÒP^IgJœcTVŽhЉwIÎbr›“U„©´íƒš¶  “¿f©×CØ€2ÌJ8P`€˜@fC+–*ˆ ¾j°¤çâÎ+ÞƒŸ·ÚÛM jÛpQJW(¡q='½iÖkÊk‰O´£Ë¤Ö åžiçB¨ÍÑP¬“b3Ë¥è=+ü’®‰${ILk.>i¢bHZ§H¯hí½Ü#·)Øí²B&kú—{/ŸŠõ|°}°k®ï (¹ÐHÀz.ÔŠ½)mËt´ w˜gE‹"2ÔJF¯¥O°]íãCÐ"†=ðÃ]Q^‡’¨L¥¥*£$c-zÜ9z½ÓÉÌBaЯ`ro™)]|§Wì6)‘«š#X%{„´í#gmòÆ/¬¬ÞZ7¿tÙ4hôÅÉLß©óÔq`¹ÃN1t,uÔ×K ÕÜlkK¶·Jsa#9M“n7í֦4¨nö}òØn6 ;GQ“Þ{ä¬Í+Aý#s[”Œ:úî! U ¦öã…èç{Å â³\ÿEVÓ }h aæfê!®^ Wú‰•¦A *0²(n  Qžitºà·i,ݨÅ|Eæ›R¨=*ÂÃÂq)ö–Η6åV+uôiÿSÀ@%JûݶŽ2㥱!Ä¢RîI‘Ví´ÅÎsbÉeSËv÷rNµ&5n”°×ÎÄ·KŸÖԽ̢Té?vèãÊzU\òƒÞ;>Þ! n×9iüjûèxï¤sxb9&ÔŸŠ•æ@è¤ÉÑí›´V7ï&TÁ4£Ô™ÂãAtšŒ°ø<`VñE]²Aè"Vo]aƒŽ$Ú1b “þ]ÛÄ 3]¼é½÷‹î™–Wë îMáy“3VGK±Xd®‹Ø„Ž!ñúl"|M)‚ÔУ?Ðçͪ—¥B@IÐüªÀš@å×ê`£éÇþ ¯à"ÈMêFRQÙÃÕ¶y}°yë#ö„¤{MrxŸ¯g`úþáu?[É’©¹„®ê ±¾¢1ït§¸,ÇØGB¿ŒÅº#k†`qš‚¥l Ûõ‹Ø™Bwj/š¥MX¾‚Ñø´Ÿ ¤ÿG,ÙãXâßoRôˆ%yÑÝÔMéÈF²ª×9 '焯´Ô ÷DRÖíœ!̹S}o§Œ`«ÊÒ•Ÿi7BÎ5´a°ÆÊ@ª5ÙFWùM Ü@gî$bxݨIÒtDõíÃ%ˆoM–›ÊwÅx?]ÿߢSÁD –D§AuòÇù7Æ¡­`“ª¾ÇÔ„%ã”c­Ò[Y˜T²é©½ À[Y†ÖE¡ v:RŒ‰¤®1…â^ ©Ë쮦ÀóB„Ë4¸œBuídîÿÌÔxO&Wd~3,ÊZ­d}-©þ=ÆFùoøYúHÁÓIp³«Àbýoc}µÕr㿬m¬Ýé·ñ»Æúö^ f«Lÿñjïäu§½o¹‚ñÀœŒs–•üŠÝD­Ô»„Z©OE«Kvv¸bPÁ.ÿ8…§x::¬ûpŠ?vcÚû¯dø'gºU*–xm¸Ðd¢KðÛLÉøn)ä]6šíbLví“2èŸMÈŠ PÑEŽ“S¾ˆ!IÊEN[|"egÊ‹¿ÕE¨l£ákà/rj,€’½— ïMNH ™œ ;çÉ$9έ !—òs—Ý¡ äŒÑÛÇí@è÷†ŽÄúEo¤jR¸EÝ¿B§b!ê|‚ÚÆîñ+ÜÂi€g݇hˆ· ™EÞÅñH–º>>,Y¤3É&F:F˜„šè¾‹HL¾cc&´)@ž¬'ýá 6âqÒÅ€o3ˆ—[tNJ6¤¯­ô”ÕІ•ô¾%eÐjzíŸ#'pºÄj+Üî ªï~?½ï«­‰=6ö¬q fñ,Ô{ˆZ½*!£îZÀ!ÜëŸá.æÄÚFÃKú¨"QУÌV†Ñ`"þùÆŒ†œŒÐ –ë‡á£Éë2äìæÐÐ(‚`×S™îfv^ж÷‰EÎØìO}}Pýš} !§ÀVŠƒ+åw@r¨¼OHnk¾œ>/k¦“^an.x…áÞÀì€Not€ž…ØÒ‰ÒÅõs)×»“ßÅD&inxõj¿º4©¯á«Wf4ÚÁ5nX—ùëJ'‡kdp9(VlSØWQ›Ø4Ni6€‰) º´Ç·ê ‘F’ROx<ÁA9ª²7•üK(KïÞ99_/£w±\<HÆï–ÛŒ¦çpÇ(ù³\à¨mÃV~G:„{Q/‡Wü~ÃVr9c³7"‘ÁŒ)д4¢Èûth©7ê,(húÓpßÂxõO—6'p5P]^bô“ƒ«ì( óÔgŠ’:Óôâ(IÆ¢ù`…âMYê¢p:ë£dðž“f <Ò} Ž8‹*\þl):çp’ ¢2‡|FýèÔTxÝdŒèj\õ};°•;ŽÏRå_K›¨¸oz™¼©Ü|”}© ñ=Õ†9„3@è^D4Ϥ¥{¶¹~ôo(¬ÜÖZ·"¼ÄL‚]èoŒì_¥¿qjæÍuŸÞãúz zlˆ?BSkbáè©ÌL}¾ÜÑûMà¦x ꡃI¢t˾E·Yð­÷XÔ¶…ßø~™7Ùà¨82ÐÝÒ8« \<ì¹]£¡É{Jœ|AüA=ó=‹IMšD‚ÿ :c؋ؕt+ø#€2Æåí2ËÏÈõ^æ"ßsãŠ/Ái~Æ‘æS4&_c”ƒî¹ˆÒ¿Âæù1ùT€…ù ®Â«­Oå|QÇ=èd@t7ÉÁK`$&üXîÎK¯ 4J‘¡uàGÌdÒ°„i,æXô1«Å­ ›5³¶F0zEÂ7p)Ö‚^Ó¤?PaÖlf‚3ÌR@0ɬŸMe†f- Šñ ½'Cºå²2`* w6нE?¹T1ò²³¥ åqéûÈîŒrœ¹øŸŸõ×ÚB u@ê‚ø‡¡À”tÒ ¯ ¡ œÔûºóäL¨ó}µdž ƒ0Þ<% ÂôŠÎ a!%ëÆ5•R?ÅÚù~Åu£ÅŽÜ)¨¡XIêJ×_Ín÷åÅ5Ãî…À磴Ïûª‘fq<7-ÒÄ{të–‘ÔÐýšà…>a(ïSö Kúÿ&ƒ4Õ\ Š´Æ|9Ló§C꺣ª``y°÷¨Yƒ*o\U:† íc½ëX`ÆÕWñe—”Ñ$Ä žô:Qy2¢°K¨T7ú)-QŒu…X¬@R˜U×RLÑìzD­Wå$欙=EQðª>4„þBît±?S,8ä<ñÖš?:¬á¯[ÜÅÏÇpH½z“³e}mæiÃÓhû“Ýjû›ÿÒH,qà S÷±i@p б KáÎDõbhQ¬ZÂpÌWj¾’¸W`k*¥ÊÑ^Âuœa–,3Úå©êM¬—ÏÎ<›æqµS~æ0v`¯Ž½ òi<>_C傸:)«yWîôŒç¥ÞüD»=Iv}rÍK%´>W'‘S̡·ºŠñ]õé•ï«M)÷«Õn µÊ04ªšòŒÔR?aE_ÊÒÅ.¶E…k¦²kS¯Ç–Àš ¯×ÄÅ”úÿ‹ô«8`>äë }Jg?} ŸÜó·Áfö<ƒQÐ\ÝØ á§|Aú¶þ#F6Q ï  Á·‚jGÚ áŸu$p£ ë N ãEí%çðèØIçªÏ;W©b(;Õ*iñ1—7rúHs ¼+s·Ó!d&w-ØýÔÇWÆíŒ)Ù‘¾ÚˆIõ\aÓžÐeÏT··)âà[NsäiïKtBëæhœLŠçÃüLtnlRÉ?ÿ·Ÿ -~©ÊÙ_)ø9ÒÃ?̤ý›o’ÕâPýà.̺ÿË Þ€©•-è6D±Üq]Fè@ɾ¹eŠeRÁ,ê£9™?Çd)pÛVͱ-ÓæÀz}fí8Yë‡!êûÆ>CFðöS˜Õ…Ä‚N<ÒàÉäÎ~ò4ó šBÈÕŸòò}¯á5ZíÇÂ5ZXËßê›Ùi† Ÿ"<À‚*š-Øt,[oTâÍÙpú6¢l‰ÿîeÈ€p[ð¹æø7l+™"N´‘I¤ø£ø7%Ø(Äôþ¹‰>Ú#$Ž-”^r\û"‘ƒdÙ÷Ås8µ—.»[ºI‰ ¢…,>‘°¤5ʉ´gÚ¸X{üŒQ˜»×¿ SPÜÅíҥ‡¿ƒó‰ÞçÿgB̉áR¯ç¢)¥Ù·Ç©îŒ>k{"—ñõN¼ƒ|°(ËD#1q“Š 11Ah èBYYM߀<Íðy£{îÁ]Të pÛˆ ÐnetÓà¬ÑhÓXŸÜÿnÀbñ$íkÁÝ7kÓ½£ô^`×ÇÃ>º Çâ^è"/"ˆi‘ Ê4‹;Á‘ŠMò2ж,6‚ÕÉE°'dD*OŠ­-5›KÍ`Ô\ki_]l¸åË2¹jŠ.oÕ µ= zÚJEÌLÚW‰ÔP›À^Ü@?Ó°B ÑRü[³t'`Τ×¼¶êuݳ"‹¨å·V]m.¢ åÔð ÃI“,'M2ˆ?qgØ“ï*ލVÔa”kQ¹åkq¹–SŽð#ô 6VbÝ"aqªÌø@~€¯ HôDº¬P6]E^[Ž÷`ã’Êиxövï$Ñfí°ß¤Z"¶ù¡Õ tIu‘s«?›Ú¦MÝ„É)ZQiØ;’–^*óðz‹ë—V\ÖüøÛ3‘½fÿY€ŒF yДùu †l7«£UÊ_tqS¹_Í×r,Q|¶ÞËPš6Û9S”¾2 ‹Bª¼*Œùr …M3 žš*¿yÛxó K‡Ï”Ž@Oê››“+Ñ â­Åo(›¦%Ь¾ÃB˜Wƒ¨€…›Òs;ׯ~¯'jÕ'ë“á9FVR\2t­×.ð`Ó†7t¿Ñ†<>ç Œ)5‡ r ¡…tœ Yàèè6úøÔ­®ÎX—ɵ^š!¨±2Óõ‡Z€zÇ—<™óyìÁ• €ÿའ£:±]EQ i=³%ë‚ëK+Kk@“ÿsŒÂjcIë„l9ÛCHRK >êù’EOm¡*Ëáçà`ÙøQªœ¨“ËÓþ0>Ž&Òþboà·º< Áïr•g>áãúˆ„SÅ30Õ¡cù“¬ ìD8“‚Og*UŒ‘âc8%`Õ.9—­åÍeë³ç2c*{Úw: œŒÄ,;jY‹ÐÐßY¡—±šuÍ*Q¨k¾ ÝMVßZAüÛkBÁ†›Û·Bÿ’~%7¥éˆͰ ì2º:ëòÄÒkAMí!»‡Àî)åFÑ)4êlhÔLÞGÐ,æ½C\WLæÌèä1Üž¤vçT *Y ‰Y̬¼°âœJQ˜ä×IŸ¹Q}(,$qÄÂàoß{Ë>s”¹)Ï¥dÃûD¼Ý/AáÔ7ˆ#Á,›ê䉠.‘QäÄ,v !ä¬ò¢_|léå ª‹Úâ@qª&÷Ðæ± ù‰Ù§Fó0ÏÂLìŸ-ö€ÿró¹þüîãýî8ÈW§´Hñ}Íø¨§<¦ysÐ6„ “VŸ…jr&ÂA|6á~P¤ÆaŒ6El9vq̺äæ{tL,ÕÝ:Róиò—‚¬'ª%ü!K[ÂÉIÂ!«•%êô\'e$È>kÀ6̹'”"ecš+kóhÔ€ÀRg'>ã Î|£Ö=ö?ç“ß¿Q|3˜•9·+ƒ¢;ÓÐl†Éð«x^ï×!XPQ›ö» V¬”š†Š-í·ˆ/†*.ÙãH›z qvõÉKðvëÃYWµ5•QÆ<'{AR¤‘UnõZ ¨:*£Ã¢9G‡8•æMW+»*³m£Ý8¥vå×ô¯£Ê;žÜdÎSþ–f’¯%öŠéýZžÏ”¤rèÌêÊÆ³´´T÷ióø¡®))VMü©“ÈÌ­ÜMÎ0Wå5Hvù#/øôFdÝ¥¯ÊÌ{N³M«­ Ù¨¹Ö|Ð\[kx4´’ª0c’ö'E¦^Ö“ØàK¯hõë¼½#¥ó²gÙ7[ï?›&19’Qž‡§¤ ¸Î+£<Õ…¶-ct^éi¸Ê+œ (©üoÒ¢|ïÝSì`‹©ÏâÏ:ú¬=³¸ÆyIoΆՊÕIG4ƒË°\©hðΉ»'ìAL‡BÎ ®`öQK:]¼”¦å"ìšFªƒ€D2vˆwœwê5£›‰IbˆäN–\T.Ä¿µ…ÏæGÐ;°0|lf>bH œUúMÚ~“¿œÔRIRÙ.ƒJK»å1J6جå÷¾ív|{gBЮÐÂ~V@ZRšÊ[(;â›P1l•Ø*Ø€8È.›!à.jEØÌžŸhÔƒš2ü(Ì£ÙZ`A•Ç2Ɔb½Ó¸Á'}^^ÅáȰ碌L,g8‘ŒFÄ´= I ƒÌ /`à¥Åº&A«< Z×%Aó{#q¢5³ŸÆ-u·Õh_Éɇϡd-ýj€”1÷û¬ýÖ›eòÏl—È¥™1—ðÅUËÅýij»â–l5°’´ÕOšöÎT?q6iæ e“ô.˜c¡¬È_GªãV€ñå NÂO‰@î{ ¬^§Ì5Zr¸ð5Mš9`Œï3aQ•\¢• «U/Ü.óiS%´R‹±=ù¡98Ö¹ŒÓaVeÄ>Áæb \ÂÅÑ$&n2’á«Q3µT¤“?Ë+0A÷QzóDà¶ÎÂÛHÖ[n(«<¯-bÑ”<út8šA<<Ÿ\¤K‹àg K!ô‰7•¦yÏÞ€¶t÷!ŠßNÅbÒU©j4q§oz’YòP[P`4ùs`÷®æ )‰åÈkÊ)uNêo ›tÖ§h³‡ì„œ3Äð·hšÄGØÛYôõ—íæ6 Ý<Èš¿ÏFzwŽ]˜×(ŸÈijÍÛ°$CøV+UHÀœå¶‹Öqûîl@ã\‘ã•£º9.©uÕ4lJ+§ +(×› æ&S+‡LA :µ èÔº!:µJЩØÇB 9êŽ3'‹^E0J³Ý1êÒ)›?ÂÅ. k£"óÑEÃ:gÓ­è2a€)Œ­—Ôr@5ƒ¿PVƒ¤'Þ‰HÑZ•Ò­ƒõú×`;õ«áø×™\mu'¾°(8L|V)ûäžÄäžsϧ¥Ð`×£í{’}fŠ1¿ ãÖu'´Šb,‰ÑZÄáXpJ'¾ì›¼U¾KgQUa ã- Z¶ÚÚµðât´Ê:”ƒžv2 >6ÔmpW¼IW?\Ú éÓèuoj–®ZèäT<…úræ ¯n·N¶%¯×4z3Ýf¹4É Ó¢cy%U#׉(¥ëð;xÍŸ’®aÈ'˜Q[“ǤÑg+#вÀX‡¥§Ivüœ³#œ%»Â˜Í-g¶¹OÃ!#ä*Êœjº'Á·N5àøÐÚj#¸ì÷FÑy¼iä â¨{a,Gqâé—²î4š/3€x¯':·Z¢‘):ý'&I ã‹J ;ÉxL6ÊM» ô–À`‡gƒDüKf-³¼øYÖo*v—Ζð>7]¹b[Ö‘ ×í~ì ú—®gåyC9˜ÉóýýfªÏf>4Ùšló4«L¢å–êWèÈ“’m‚7‹¯åýº<©+ú.£I÷biñmêI>†×€J‹{1H-ï»Æ«rÀCk£;o³Åœ¶µ'^]Û0BñÎ|,òÓ(gFbcDÃȈ2„DŒº¢ œ¥ÿ"çèò3ô_ôülPáDñÍ¢å:”Y4§t«!\ƒ! ;)Ò•'ÏŒYÒ8Úf ج]>0v ì÷zwÇ4úÌÙgx2"2Ðõ¿‘ŧÁ…঱üîU]V‡5…œz’ãÅÿàAÇ !©Ø…d%aQž˜à«„!‹‚B¦µZ†ÇA"ZÒܤšjS#oÊ8I(>Ðj­®§@, *ð¸8¹D'–+xÎcŠÙe¬=)†eT“—l¤Z€Tì8™õÁ5+bè¸t‘ðÖ(h¿.lBÜûsÆx í8èCGàå †ÈâU$Aÿͪ÷ÿ*ŽC¼Âo,$¸ÓN°êá¸m&Ät:Jä÷™^ظIŽo/ؽR; ºŒH#`'ãóhØÿ7D÷èFYŒ‡5èãÔÆv•°e›²´‡„…aÁ ÐÞ?ÂËKÆ­sJç8)§<Æwdr¯;‘Åù¸àÐ}GÞ|ñ¦QRÈ×þeMÀ‘mKzQ„º žœ¡›†š÷ëÅ:§n¹9#X”iEPè3zX.ا1àNË›®í¶)CÆZý4 ])r6p3¹l|P—^¬’³4(5(À•j¬(Ð-*ÆpZ€CgQv̓­»™ëÅzÍS©IO«¼“©åÍtR·ÅE>­™Ô«ä±/<ø®z¨|Rм«ž–b-vB‹‹q+`Á'FµÜ‹»—ãÎŽûkr{-7OKæ±Ö¸MkyÛämžÐ¡M_ñ–U¼UPœk‡å X¥¡n!qÙ €Y`—P23Q-LÜø!x|Šò›¿çïA×ßS|bE# -d#T[6ü‹s5£ _e'Ò^ÚRl AœŒáZféØƒ³®*Ì("ïYM«ýìËÎyNÀó•÷Kܔѵ•ÃÁdfþµº$.*¦þlV-¯× EhO4µ $…˜ šÿ/'’(ⵯÀò\ÀÞo(äâßœ9ÇïlÍÉcÔ„ó>JêÎ9sGž3. g@^„/Ö®Fš}¼òÚ+@y ï-~’)çŠY¼UPÜ”a™ÚäÇbä4t”?RæÚµ Ôñ|‘ å²ûQ.ß¼jù=‚S´•rÜß~ÖÙ;ºowød ºÏGÛ'ÎöРµÂ/ajÉŠõ­ïÈmæFI¦Éè³<–àØ¬ØÃÒ4]©íÎÛ!Éc¾RÌhú ZŒl Û7k_cØT´×APul”8=ªåÙ?ZBMaa…IÀ™¬q)ÖϽ^vÚÙá÷j0MK¼¼áV<ȬWåG‹uÍ9Τë‰r¨“äöa OQÿŠ5fG…R'ª™'Ýý“JÆŽ8_àÃWãNbB­Ø¢W¦ÄÇ?*Ê)´fãÑôãÁÕUZVYßO§§xåC•a¨å•VFÇØÔ”€27se”¹—©­šZ’ä´ŒXEßUaYçntÈ\{¬øxœ°¢ñ,Cã¸)>½¦^Q•«ªk†e9«”^+¯g:B–Hë\k?Äqkˆîý YiÝuhw]Þ±¨aPæAg¨1owĺl~§ÿŠ»tH­û–ßr劢Fx9Ú¼Û½ÃÑ$5|Êðì^Õ%s*^F£àM§L&6‡ß·¼a”ßB`ƒ‚üéÕ)îEolüb[+¿L+„&tàà>î;aèê\ú~€'$tl”:&й[ƒû’Hªr*Ãý)Œ8-ý[u,cžûŽØ ·õ銬ñ¹ôhÓm1ãƒ` | &ðJi¶4›‰xoÆ8Â8ïË®Å]T›áðOͺ¬pÐÈTÂÎ]F6Þ¿GÛùy›[m³[Ž6Ònix_´Å¥€å¤˜7fõËô\Ô¸ø4êÙ– ¤ú 9©ƒC ÑË`-B÷ ÈÃXà=ËŠ<`Ȇ „jóvVyÌI¤ÏB€ènnª&-ñƒ0öÄ=Ùºs³èüŸ%·á?&ûá&3Öéôü¬ÿ1h¶þßhøpy™® W8ËÏ‚µ›kÿ5>|üÏë÷Äp‚-›`ПLèrÜâÊu½á’ýáýömJ̬‚I¨[!jÀEW@‹ôSQ?ÈMGF,--é†ká #êÆ›íæVm–”móþîç 5#™ƒV†r¤õ,®eNLÿ=!žÑ¾¥ŽÍÙ1C‘ã’$8‹?`‹o-W„d¥Ôf±„U¹º.áÈœQTSNÂÉìòÖ¬P°þ>Ï,÷²B¦) Lz¾¹¯Æ£¢ȹÈYSC„ÏaÁžÕ0áŽYLEâñ¢Ü–3îQÌVŒÑð×ÿ9‚(n°;ÊWg`ŠfAZq?ö aµÕ|´$•›6æ™ÊSoB9¡;Q~x ]'2AaƸ±öè(ÖK ƒ5‚?o6‚xÒ]âQ·Ýí&c¼Ç^ o‹tvæ1œ5n­ÂNl§<Þ˜N … ‚žÜ/±¤Øv¨v‚º‡UQîRQoá¥ãö¯Š}!CµÊ{§˜µó¾$×ä/’±1Áe’N|‡1£¡AÁñ0&5Iàº/É}fÎŽrJ"Wç:~‹~ðÆS:S…{ÇP+ÆA+a’¿‹fØSÒ½ª*íP©$ÿ>ìêFçã8NÙC§Ÿ> λ]Ì|ü¼ˆÇ^?Å<: l;+øÌ,÷ÍK6ÅÊ‘ÐqO/z¯ÊF,u Ûç9g\ü3ãN7ºõ1;°¿;‘am£ |i²ŒÔ›ƒ"ˆäÁOôož¥c~÷ë›ÿìÌÍ/sœ^Mð¨Ã3€ø X4Ý %]Â1‹Ç¨÷Ãô#K7ØK*È|–üIŽ=€<ó:9HÒÅ)S¼|ŒÒÍ>؈àq{ }¯ é n‹œ8Mâóð÷åWó²;²j’L°ûô妌P„++¡K]ÅúëÏÆ Õ§ý SæÛ“ÆÌõI`ÆêOü«ÁD· B¤ßòá' d{(4È '#rò "¬±5b—‚·3~”ª1Dšê&Oh$ùŠÅ˜U†å'W-“4aÀø*e‚Í»ÍʵÛêò²¥d(ÅÓpF¢ü×MÂßð§æÿP~:`’ßX[Ë›ÿá§æÿµå 1ÿ¯¬µšÖ¾2îï¿|þwû¥ÌR÷F똥ÿ­¬5 ýo ô?¡Þé·ñ{({ÓIr)´°M]‰égˆ¤<í\‚ûkµ?ö‡dƒøßtÒë'K?ÕjòjŽÐÿ)è^ZvŸ_‚Ëþð„’Ÿ¨l¾ßÍ…©:Ó (büüç|ë%SP•à™õw|ŸW¥OÎd Ÿ=;Þë„bõ‹¼…_qþù´°À¯ Ü•€öÀ3zb¥AðœàT§} >>Ñ`04×Y¸‹õ'Ö™û§³þQ\:4ªLâïp{(Løü¥ñëp±¡k§4äþ£†…WN‡)SÿŸðãÒi=xxÒ£º(.ð#2ì2‚PhõÚ'LàF •!ÀÙðà÷2JOÞó¸-u—Âõ'¡[´Ñ¨4Õ¤bþ‡ )HëNឦnЋ& ËÐ ºé”Ø~ÿ²O~ÒMo† h.ư8'#0¬Å)©TFåJé¤~|ƒ µ0à äb2X]¥“øÒj€ ($hôg¨º¯ï߸)õ‰–÷ñž-™* ";ˆÔº.-¹¸²n&`le+EÔb½cÏ» ™D´OZ)4¾2%=Él$4Ó´È$㘯ۤ ’áàêUÔ}÷TöQÊqÉ¢ÿ’qüzqzOÝn•gÞ~~¡²_î4JÿOÍÿ‘DLý—7^ÇŒùyyeÅ™ÿWÅÓÝü¿çãD¬T…«A´‰Áw#æ¿á§õñð`Ð?ý `ÆøI™ñ/²ßÿ[øí÷OÇÑ6µ´æÕöÑñÞIçðdû¸Ô¹ÉWÑ8; EÀtòwŽöö<™ÇqœÍ{”Í8¶r¹gj|•Åí•›éu{·³ý´ýò••¯ƒÖ?ºJ2˺¥ìÚœw2-ZIOûCØM¶…âÛ)àѪüøðõÑÎÞÉËmócÍ/£Q– ;‡£Ã}ëCç¯öv^ìíüÕ÷Q¤=k?·ÀÓU5»JPGí†Ê½²L¶ä¬¦g‘s˜UîæßÁOÉÿŽÂïÅþ·ÞZ¾³ÿÝÆÏíÿ¯a®Þÿ«kkwý?oÿGi·ß¿9€Yößæ²kÿ]_Ù¸[ÿÝʯòþ¿U ùøÑcȼÝùŸNð4 ‚ýè4G“d,óƒ3sùJH÷LAó†-‹ÆñdaA|x¼Š‰¶h 1qí‘‘xyaâªÎÙ‹˜Ôlmè´d0ˆÆ˜¼²n¤R5«FÒoÓdSF Ï7bâzS%‚ ð,Ž{T—J>ÇBÃO.¢!Ð_BÑîÆ·;ùh14XƒtO¨i7Ì4¢A³¹l&Nd⺙øoY“@œ¦ /€ù1Á]Õ©—ýá4¥Ä5•8Œ?@‚¬ó9mMã:ŠÇÀ?DJ#yÀP5~›Æã+"¯N›ÔZ³“™ZFnÜU§ÜFªÑ2MÙã½—mb'Àø±JO/¢ñˆðÕõ¥ƒ(½ ºéˆQ[ÑÔM Ö1€N$ß­êœb­A=«Súƒ·Uwâ”Y`}ÍL£Ž}¬ÉñïS¸7?èÌÿŽÇ Uþˆ|7Ér·î8hG†#"°ËñÓæÖQ ñ·°kŸÃnÕ;ƒ÷n§þ÷þóÎÿd¼ŒF7ã 8cþ_i-¯ÚóKä_¿›ÿoãç³:À -éÓ'˜ɘ¤t ³ ½vŸDžÓ“aí’ÇçðmKA¸¯žŠÌrO>Ä0åÉž¨ ~Å =m@8#à»ñfK€ÜG+ ÐÌ5àb)†K#ÿ+™˜ðƒGÄqtq+mû‡;æ¥@ŸÄÐx­;ò£‚\§ëá>l-£?“JÚINRóØI˜G&±7ÖçàõÁ_9`²ÄC¸÷3•—“èýF}þ+(äq˰?A@0iÀgÂD*“P¨·a—• ~ôØw!Ù©K™¾T2Au]$·mÕœÛ顂 »ÁPÁw­§[G@ÀÆŸ4nj îGÓy¦4¸„`£AlbŒœÒï^ ·ú…À@TÜ?“dàÁ9¬F‚™•Æèïwà×hœ*¦É˜ëV^—B *Ë¥äæ/à §(¥F ê„@tQÖ $–‚†÷ëˆòx½ ƒ·* Kmpü¤˜Þô4ÅÑl’âi3QêT òŽÝ-rëÆqz5tkø$ÀoÊjŒÙ¦ô7d7?¨…üDRÑVÔm!ò-ÅáKñ<Šà©>†O}K²§¤âå¡Ú”×ãĵ«Jåæ¾ãɈaiQ­ÝétØ(ž@“®AþšRK5ÜLä€O–È8ˆ ƈD*( nw:¿-Éi¡îrP…Ir@ ™z̲C é¢‘CAn¦5_(¬ª²Z¨dnjTõ1‘Q!±e¶OÈŽx¬äN…ü†¿býïfl@3ô¿õÌþ߯JënÿïV~ží%1¦] 4:3ûx†ÃÛ¯%–P¿7-Lë`&böd¾%)„Ñø}™@Êfn§ôö?k¨Vàì!s}âv†LÕüÑœ¯ZàÍ“ÕE<( ƒé¥„¿ÈS xæ„´hÂ’rN¢î;8)5 Š+ÃY<ˆ2J„žÕJAR#un"Ï@ úï4¼.^û/¦»3¾ÑSj³÷UàÒ±¸Û¿˜t¯¹4ßBHošo:cr)¿•.ðúÄá$„hôÕ:9;ƒù­eÆPd4%8î ­7oð¸ÕlHl¶«·š®LV*,j_Œæ`†ª ¾!K6 ¦&N9–t*ÙÂôÍÍà™ôDU(¾5ƒ?Ññ®ÈZœ§FÙP§fP︅øé‹F„I#*SdQ¸x¹)¦°’‡v˜~¾w…Y‚ ³ó,†â[?ñ£ºl„±ÔŒÈg#zÿƒÄ»†Q"è´/|IdÜM ÿS°¸¯ŸƒuRþÈÕ}¬Q‰ºå/Ø!²Š'œÁè³7‚¢o­²ÃàQ&«þr”ØTÉb¸ãº¡´Ñºêh*LãQðÇÅ`1à(ÿ&ŽŸåç_‹>ÿqFéaAé|Þâ{ø:Þ¤‹œ‚ …ÃÞÈâÐz"ˆÀe R›4Hcü8,Ž!#n®ýc–×´žÞ2øz‹¡ñŒ<.¯ §nçQªˆ²ªëû¸$'‰%tYÙ¡pKNßé+[±…Ô²¥IòNH$$™êMŽ<áo¡j¼] q€@&,Ï79”dW¤Ý2é»eŽL´ d›¼ZÛ¤ø<ÕA¨¡‘S¡Y&Ÿž*¤ÿ+0¯ UGŽ‘ÜÚ .zAÈÂHŒ'YŽŠÒ0üظ¢áÅCë¬?ìAÕ£†Dÿ¢€„µð&Ä °€éÑIsŒ‚ŸPv#OØìʓۖªÉÚMÓËá–XÞAé/fI¤Ældb•Aèq¯Àç¢öˆIΚ‘xÄ|ÙÜdx'Në²ÐXl†¢Gd©zÃGtWœBØøÃÎÞfð>¦ÛUÎðDÄ¥ÉsžŒH3Q§ TÜd*0™Ñþ‹žQx1̆­²„‘ @Ýa%:pù GÆ Ú™2öE/䉤îÉ/á6j·™§Ü„y5E3ô†Ör«i©jZùÕ\5®ÊV#ä&¨ó† ¿Å½bªZ—d3óÕu±ˆ°¾hÍ^”i9_¤‚/Ê´ôJR¸(S‰¶H(+0MŒ*Êð! !ë×Å?ÿùÏbŽ•Ë3Wh4½¡ÚØà65d„0Ê3ìM)=ZçA{W“V[šfüDú àÉôµq2g§Êk tÉ.Ü)jö†,$ãaØ0ÈBµý/QA´ðó³%iù”ù1ýuqóÇÞÒ½?öƒ78‹=[:î).¯íƒŽl—~C;£|iá̱ðVÅê)详jlÐèÒÈc^BßúØ’Ó üÞâU]tj\sÍ-šÆ¼öŸdÐ{0º!ãÏfÚÖ—WÖ\ÿŸµ»ø·óœ§{»Üÿv_ýã¨ýüEG;±o’Ç %Yp{ˆ7ÑÄp+âØ`°À?~¹ÿðàÿÞKƒW¯<(vuáz!; ÈáþîÉ«£½N篎`¤€¾û(XÀ3 IG—f «‚Lp”®¶ Þ<1`~è÷&Êt6˜¦þ ræVv Ü:9I'W(á ÅöqgO ù9hèW*Eq¯ ý¯^<Ûnïã@d¯ñ¼{ùî„Û³°i6D b52÷„jgg§GÊÌEUö¨×;AŒ¬`ó¹ÿš­åìÞc—Éd£†8¹<»+¢&’“S!Ü\TL‚JÌÜÂBz‹Z™ºƒ8ç‘ÆÊ‰½]*'l̉Œ ™~ Ý"õLÙÑníP4’í² Þ‹¬âôªÙC4û‰é'w8轪Êäê~ 6ò2ÒÞÞÐÐîÆïÕÚ@¢±€(ô„NÞ…ñb°(}á„`1Nl]ÆÇ˜z¢.,D[‚ÀC§‡u™šŒ²‰2¼ïÃH4 R0~3¦A“Á&bÜhÿéÐ n!Ë£4=à*<‰?N¨° =°b#ÂJJÎÿªSBšúwÞO–FQo?>›Yg,.ÊVðŠy¾ $n$ZR-Æ+­›¥eø^ôò˜Q°k„0«"…JÍ@B#ƤË_¯`âÕ«c@φ¡q¬*ÐGØ@z³ø’ØO<Ôy®Æ£(Ü9z Ú#šeàR¤½zµdÈå¯=II0Z l?Iû’ß⛼Qr-%£xx¬ŠÂ×/ ®5Ÿæ º—Ø´bÍ+PLÍ+²TÆÙÃa:j€i='’Ô‘ú$2l™¶èÏ º6•»ð±MÊj$>Xå˜Å3ÅR*(¿#"©*iLOž¢FŠu/ž*—­Ò¾øùiò‘†"é(È\ÌÉŸg€7YÂ[Áaq Ð5Eæ¬;HÒ˜Á¨bö¤é) hŒ#¸}ñYÔ‹vŒH¦4½¸·¨ÛslR˜K²¦…—œx_ƒ3^ Ó¼*fÐc D”f¡Xg¤ÔäuÖ9 ²Oè•©b"° ïÃéŘÄR=‘ðlqÝmœrÃ'|óVϪŒ-áÑd×Àö/·qLì¸ÍbP/#šJS¤}€0ó$S…؆õ­ŸBµôþ„C›¨¦Z@Y¾ Ìë²õÒ-jêF“à ã÷áòzk)~IùÖ‹“»ßWÿy×ÿ1ÄK½¹0 ³ü?6ZË®ÿGkåný+¿Vüî uØ?kx!jvÀár5‚§ã¨õA%O€—Ñø]°»¼èà¸p?ø¿èÒw´ìGã©ÈøÝ轟ÛKÁ/IÒcCA'ŽF úòöú 6O§G2‚Š}©®vK7¡` ƒóÁ?’ip]‰ÿÞÁm5#8m$Ô' öü¯’é8H> Ë,hIzý3pjKR.²d‚Ü ²ðúx±ø‚Iœéð“  “5#ƒÌ“)˜N$8ô,Ô f2à vÿ²cè3(8ä»à:'=ˆR% ˆ¡Šº-ä…J@4ò\À…ØG“¡‚9]Uz*Ì/’Q¨w^´ÅzçYç—í£½@<¿::ü¹½»·üÿßö±H¸w/Ø>Ø ~iw^¾îˆç{+Ñããàð(h¿|µßÞÛHÀÑöA§½wÜ=gÿõnûàyCÜo¿lw¶;íÆ¨tKÅ‚ÃgçåÞÑÎ ‘²ý´½ßîükÖî@ÏD•Ûpþ½ÓÞy½¿}¼z}ôêðx›C‡Õ,YÆ®ãå•àÁƒÁ«q‚wµÀóñçï{pìÌokåts Y{GG·-ˉñàãÿòâPÛ·{Ðßâ½cÀêq —‰‚³“t{¥1Åû@ÙOx³[r@]:4‚àW§¢D÷ Çq2\’t9$§ Â@0-u3JjxyP ¶¥½…÷.¸¬J×W1Z$„0Ü€ƒÝÔŠÚ„péù廽1Ñ nTÄ(—«J5°je5öÄÆëTo˜MÖE±Æo.‰Ñ¥-7ÙNÄ"2-LÒú&‰$!Ò°æ‚›°Ñ.ª &Ú»ýuÛ~»§)‰#³3Ìn–)©ÕÕ OÔCt3@ØL¢hø¾IO¬¼ê- ð5Ü5“\I–Ü!Xù¦ç&ÉÕJȱÊ˰Šà!£Rœ9ÔÄ ï@Èà4:·ºŽ?m¡Qñ}íÕ¸¤·ó$2u #ŒÓ†ÈܵÔÉ-N¾YàAôí윚L’©/o‘ð÷:^q5$ÙørV¥%âœ1—Î.''}RG«Àý•jq ¤³Ú {† ºDÑ¥vP•õAeh”¥âÙ$&/“qü 3±ËjfÉüý°j<«p–å#àC@è¼ÿ>šà¤éìWÆí9&xyk™L ƒè,zðjHïZÎg’š Çk˜À“Ý[ЄÑgœ¿VçÊA/È5Ò–ñ”>j xlRÂ#÷¢d§DH¦q,ïÑ: ð¦Šñ.ŽGÁd,ó™V&ó;Ç,šà1îû¾  \<íFC¼V@OÉ—}”-­É2ºÒ/5Ør .]43å—uºâFû‹ËŽôœˆd›#s>soÿ`¼:¨,VæQ§ý„z(Vúj¸@kÃ>lþþÐþ4ŸaIÕ‹ó³>à¬h¸}Õ;]ŒWÓ ÅTQÔ§÷®Ôèq{{÷8[ÙCùµAŸ©ŽÆ8é11=½cî9>ìü},þ˜n?¦?¦pø-4h êàMCWððøå’é¼-žë é~NàéYT¥ÞÚ-£ A¨ÞF±ä/ßF‘¹A‹u§©¡l+ô€ÈÄ=m5`†¹m®on†ºÕâ*3ÍgqVPJC»À•î 2·nŸ!Öl8" a@v/ô˜Xñýà ãpVÈl*¼ø/q^$HêH'Œs.ê0EÕOŽôÃÌ*OQ¢£Æ D£©ÅÆd¥f¤¸·XW¶<ÕÊwùR³é{6?k ˆœÅ]A)R3÷æ´Ð€ø;¥øBࣹc¼Ö”÷ÑW³u¬ÓB^ Ny:©Z–Xî¢ÑYL@ñt,–+ý®xŒôV£¾XûA2‰7i¥t£ŒÒ±ÈÍãíÆB©QW-iU L%/úCÖ²B<Ï­ÌèXˆåÚ„aîU©Mé ë G³+3±#D•þÑ0ƒ†­Dd Ÿ•n´õ â?:ñüƒBΡ|À¯÷° bÙ#e³øƒ‚OÈ›´ê ÖçâgÁD¿09°¨Õ˜@#Jªa?Y ’>à:о9œ\¦,QR¡uxqÁ–^™±$í從3;.·ßì9qFïyä•&¤%­~·ô4-욨Yò1µrñS&ù±®Ík%g_Î\%ÉèWŒFÖ1Lö¨¿QÓÉÔñ×t´%˜µ§¦ 1ŒE© cú¡PÿŒ¼¦›ç£eåÓ©eº …¾Õ†{±ÄR¤ZnÅËÚçÕð’¦Ì\I¨Ï<¥@\ ÞäjzoÙ—=umÏZÓ‡Ûø&¾hWe;ÝqfÜŒz›#tUÜ:Q‹Ô ã>üž)Ú’¢)ß°Ö×I6B{N0G@` koý3öŠ0°64BG7ó`ÁßhÁX°• wp·”¶â¦ß}»nÜÜ“‡¥——4‚´¡áPÇDÒÆ14ŒL[‚3më’HÑćwÑ…¿þÏÝÿ¡?7·÷¿Yñÿ7ÖZîý¯ë+wñoåW9þ¿a®&w‘My§“)Ž,·ý¡ ípÒ9']KTaiQÒÀöÇ? ÕB¿áó©ï˜×þ˜ê\„ºmTix غà3¾¸@t #u€ììÇáè–øãA!SšIå"N `ãÿ¿IøKr±=>]zîBL]UN“U™$S¨z¾IJD³cMad‰˜í´g¼záZp¬®zÚÏÒ%”ó %RX °ÇØŒX²#¶mAX9:fÂÂEŪ¥MmÉø%^{IL>Ï 3‚©UÌ"ùUh+Òü• Ͱ!"M|¥7Öª#òvqÜU®¯¶øá ¤>÷„h¹à 8ÝÛM.÷ã÷1ŸGZn¨Å¡Ù[êYû>† Ì;Èd@ÂTÜÈV#š p[Ôë T#P—Æ.ú¢²¡È–jãô(¶‡Á™l^’¼‹.âìõÍ5Ýf‹«—H3”ç2aƒ7„±;/û˜7´ÈZ—T«¸Pð6†6 ^Q¯PÕÚ ºªïš€õ€ŠŸhÜñHY{(«©I{èHd’ÎT¼ZÔöJBL±½BÛL®xJ*¾Š­rx@¯GÜ.oÞŽ!®ÎU¥¼óÿQi|[çš«­Öª{þ§yÿÿv~sÝÿ#£f—$KÙu¤X®æ¹#R‹P›×p½Nÿ¬ãÖ®p^úçÃýíN{Oêé$ÃJ¿+VJ)œ$ ©Fèh­”Mîà ˆ»{Ïðísp ;òeïï½£ƒ@¾í=‡õò‘|Ý~Ý9”õžNûtИ£ñ.¢Nûø÷Šƒ €‹§K^‰Õ­ù®Ó;}ðùìöß÷{1|Hz²ÖçñÏþŸb|„÷~[^ ÿn‹Ê?‡c™ÿir8¦¿ôE<ü=”ýô¢€ŽðÛ|. ôzãÃ3@!,ÛB’|€¯ÓSø—.r¤¯ÆBžuá!I'òi,4N¢§¸„I–8@ñy„¸ „(e;F`°‚"”ÀtQoHõ&hd¤RßDCÕó¡~„°Š%Ôç#óUfy Wñ µ¿ƒýxt¡Cå—CÙ­{qYŸèWà¼%ŠÜotã½ËÑäjO¤Jíád'³”߯ç1¿dÇD\ ÔwðWý6–¬©Ž®. õ2I¯‡ÉÈDN¬ã¤ OŠ2ùJüm ~¢ Ä£çœì¾²;`ø/(*†ÊJ-G¢û`µ‡ý Wvà ^nýÕøa5½~º:OÅH‘=«?}›Žâ.J(Ùµ?'}¶{ƒA”ÊY8è|÷T‡¤æëŽP¶8ÛE2žh¾`vMT_>$Ñ„Ùr7™Š…‡ ´—Ê„_.’A<œ^2h¸ìc!›)bÈGW™^1™ýU‚»ÿîxÆj¦gÑ8žàxÙ¤¬@¨F0D—à2öâî@ö(ØåsšŒèYh›"後ñT— –P×CIo<¯†E‘¡SÝèÁ^|v7[¸R…ÚÔ‰ÎqÃ*§‘þóŸ 5¼C… 7z˜pû¶@CŽ;5ÄŒag4 Ý£A:BÝè}uvÖÿ¸,ŠYh¼È-‘BÒœái$ýá-ÓPü%‡žöÉfV23ðG­ÝÜÏf„!å­²hàâÎ(“+îŒâ,OD’ìú£¤;p, JE»'ñ0e§¯t»Ž&HÊ!XÉ  ñ@$_IW2J“½#*˜µjŠ‚vdKM8&2ÊéNÂ3éðË…ŒðjÉ3»j¡3³³HχšeÐT°p.æËËhüpÒ%œoäO}­ ¸`hNï. €2Ó¡™ðÊRf±¼!ÌDBÑ °¡BÜ—£‡‡TO2²=ì=ôOªeòâä+ºy½¥ó±ËÙ*SQ…n^…]Y!òÛ·–gw¿j?wþ§!šÞ¨0kþ_ÙpïÿY[_iÝÍÿ·ñÃù?øöó¿Q@ ÇÙ织]™ö»ÑrÚÃÉI:yP®Q·©\|S*«*ZVÝ)+wÊʲ2ÏÏþçæ|á7cþ_ÞXÍÜÿ·Ú¼óÿ½•_õó?ö¦‚æ˪³%›æ¹Ohei´öãôV;ÇTà&Ñ; ¼fFOä]ˆ¡t[Š‚pJ“.V" <–M >”ペÖhnÒZ[Έ€†ƒÏ®Y;qvì­héBfT¿¤ÁÇq0û´F÷’îÔ¸Vqh(.u|hAÿçûÿßZüÇæêZ33þ—×îÆÿmü®{þF0d÷~u°´‡~v ó{ðó;»ðß¹åß¹åß¹åß¹åß¹åßyåßyåßyåßyåßyåßyåßyåWôÊ¿!_zr•ï&ãÞŸ ›ögýmxÖ© ½à)†Êwè\O}Œxç5ç5ç5³^ó×n$º¬ÿ'í“Ýd¸Ç³¶–»ÿ#~Êþ»¶¼þŸ«ëÖn‰¼ß¹ý7¯ÿ_FïbØ­¸‰:fíÿµZûÿÆòÝýO·òÛÁKgú§»£Qíò}šŽv»©J¯EƒPaó< -ô¾l]üû$ø?¡(Z‚»»¸b`P¥VÂ1.êÑÌ]>å'³¾:e‰A®­ÎPþÓ©4èG¾¡Šî£Ÿ$_N¨éƒ+ŽH—O%#º¥Hw' ;ŠÉ”Þà̓1\&8Ëǰ» ïҼņ }HÒQÔåA8u“®ÎSï : I}ÄfºöAÈ éðè!÷†îC:šDlˆ~š¦±>vIý҆Ĥbó¾ŸLù /:è·=Hàï˜ÂvË­ ÁV| y$â·ð˜+~°­q'‚Œv¬É&bgzcö8”·ö˜iÓÅÙÎÓÝM8”ŽS蓉žeàŠÒb’ íg¼¢ÃÌIgô4(ß×ûéPЧ…¾¼KŽfR¯rJ‚HB öf¼L€ "öpÐ=¢È =)F-G¾Žу5Äàòñx°Ú%qÆéTõˆ­aBïÒ L:êÀ[( tÿIø) pÌÈeS÷1,› ò‡.­¡»U6ƒ¶Âi^L=ÄSuŒ¥{*R®x¤ EÜì×Å@…Ц=á <Ñ›N 4T‰í98„u5þ ïñ`ò âL›1Íþ)hÖµ€ª™L@Šù÷Ìöšàš¬ Åú/¨¸æ3ï~ßå/ÏþƒÆ¸ª£ÐþӄߊcÿYoÞÙnç'Çî¡PC;ܳþ|î€ÖÞß < ;ž™µP]ßœ…(–f[ _5Š<,…ñr{ðMB€ÇѤŸ^€?æ°7ŽÁúÃVóáãÇP@ä?|/$P\ôbtŽFBDFÝ‹Í@^ھ݅õZQp ":%18JÒ´5M`ºPždK&lÓ‰Îã%Œ¨³KKi¸œWˆiдè6ot@&ØX9^–‚C02ˆÕ…óAg-ºyƒH%ãwphcQjÇ‹C_â&8N.’T®ë….ýCQ¼yL•íd:1®çJë¢Þ3¸ÎKŒÝ†œáhn¢CŽŸBuAÞ Ž$ ËÑ0ÐQjÍ-hn€tˆ€ÀqcS¦™žVÀ*{Ïé€zl2| J\¦Ô:H{c(0íHfxªA }ƒÊ$Ô6JXþ(ñ{QbŠrw±Q}ŒÉþOò)!,ÊñVbƒÝkRß^‚ðXWÂXæ$c`ÁÁ•K!åñb›bŠa$°q\weŸD—»qJ—«Eƒ`:@üq(@&öB\bf .Ã? ›vÉTPÂvΠSNÈסГþú?GºùÔVÐÍtlw‘UIçÖ´q ÒëŸõ»ÓŽŒã>œÇ ö·÷ÂfKÀÉh}ã'ž÷EŸ‰qÅѱN;é±S± GÒËÈ‘ª¦+2½ :MĺÌF'Ûba-/­kïÏÑUMŠÙäÅ5$úÖJ¨½”ÑbK퇋‡Â~ŽÚ¨ 1¿p¡ø‹p &ªCÆRx`Gý“¢ušÀº>TŒ¶Á”"¶¦OëùÎνTÝŠe†ƒ[¢å_‡e*Æ2®>À|J‹‰SØ-ìB6× F¡š{!ð<ãa@£†‚y©Eå ß÷#™ TŒØ…’u ðu—†ÔÜŽ.ý¶Ï1¬ £÷}1…ÆcXjƒ‰øQô¨h©,ZBöèÀMÄ‚ʪÝI•‰b1>#Å‘Ùä”X;C&Eh-ƒ: 3Ç64ר>Ìçä„• ê¾P©¯œ´€’l‘…œœzÒqE_B#mÃB(¢G8ae X†ýØÑA(®[GLh. y‹¦Ê™O-ˆ/hÙ¦¤æ’ÒÁœV©Fà-8<š¤‰˜c3 djÊw;À åWõÕä¹é¶Ì9YÞâd~ÛRR,õ…Ìtô‘ ŒÒMÈW¤~D`½ÏU=jäG ÚǽæA̹}*êÌW¯9©’Ð nnjÍL«¢pŸ™áE&ÚôŠÂq¾€ëÔ!XP€Ë,Ob±Ã;âzA|6i  T–×…Öç>ËŒâ gTgº[ϬÍhëµ*£CÙº’ñ\U«ÁÏYÓ¼š”œ˜YQÀ5¥V‡)=wfUZÀU« `Óá»!„éÜ >I—à­7oÚßÞ´g±xû²É”8ˆpFí&=…Šsú„¦­§Át;Å»­Ô“Gç<Š{FÜ­ëŽ; ìÛቤP¤Áè5œŸ†“ó—†ÀÃÙ^Bâ½D¾.4ÉnG`6DäxûLrÒȇw‚ßœB¿mnúkß2a[ì΃Ñð¢}!1ÞùØÑGÚY¸5ä&’Ú92O}Ä»ú¼ä †…|HOd©7 0úSø±‘þ»> Ó7–LI1k€›e³€ñA>l°M¥[ ¼:(þƽ˜ _u ºîŽ5uæKQw»Œ Æ!0ÌC¨rrƒöðïßeÊýût‰=çãR'|Óбo-}hJžˆ#ŽÈÁëß¹Á>¦§j¨†-X´×Œ[bÁ4øi×ËK´OE¸ $|8qB,™"Rlÿ†-±µW¤..JÑ$&«S¡æïJ ¦x{¼4,EÒI³a—浑 ¿†]°elÙ[vAòv­±Ê7ÿ’!’캿É;57ÂB䊇Th ņ©(gÍÔÐ. 31?;°LÿXWÀÌä 40ÅëàÖA€à¯'ç‰Cî¦*¾óâáîÓ—oÖ6W>~üvSŠnä!¡= QoOº]¡íiòôzÇDÖð˜¢X’Û ³q»Ó?™R[° Ÿ…`IÕš!˜)-ü--…ÂUyúoýEugÙÄ@:®2ÖosÁa J‰?Rùy·ƒº>Ìþ[ð/ª‚s7…^ô/¡2¼L{ù`š‚‚-}{PÍ·îð”šm®æèª²šÓXZZúbžˆë÷ÌÀ8(ÌP!((ßȺЧ €˜KbìáÙPÌÛ¢þPˆU¼ë÷'}µµÜÂÆoJ|×ëPé;Rí†z!-†ùçœ.j´_ Õ»ž&„nyBO]¿fÌEº yÚ/Ô Ã‰œõJÒe·lƒ€t®óxB“Uw‚3nîš(97£ ;½—B•å’TQM*_œ[2§!²m,~ö´EiR²¯L."™¯¸9]@×T* >KwÏàVÑ•–ÞZU†F\…ž‚øžÂ‚¶¬Í‰2 ¥‡ íaTÀÉáòUgÉ<> ².:MqðÝ‹ÄB”á㽿ëߣ0V5ôÇAU1’kªc¼èëdß?RŽ7ßê 0(ñQÌxXú ‰$žB܇Wtºí¡¥-–‡Àãߦñ°Kn4|ò@w’½a/ü(ĉ†"#Œã÷ÁG‘öüÂ>&²èáH–E‡Ë^#ÓÌCz{ÆFóãß: Ôêœ GÑ?Šÿàp˜³q}$$ÛþøçhŠ> 7F´¾nÿî ¯1ê@¢¯~™ZpCüá³üv÷àxôÞË6?ï¿Ú>Úƒ‡#~Øßy}´ÿH¡(¹ÿôh{gÒøa÷°#a¾|¹ :ûë½ãNA¾Ú;ÚÙ;€KÛ/_Áôí#ˆ&ÑÞßÅ‚íŸÛøðjÿõ1@xÙ>x},Þ_lw0óÁsÌýr¿¶v Ðü»}ttø &î꽿½ÞÞ?–PÕ ‚Vo?<Ò_wå3”ÆÚÔ7¡zVE úƒ]•¾ü¢ý¬c€82bhãsüw¿ƒ°æøÄ^Á¤0(.|ðú¥7&±ÞÑÞö¾Ìf9Äá¸sÔÔ3j@QÀ+Ò‚ aEѪàʈfõ9- ¨ÿ :è2ËÞþ1¦=Ãæì˜àø—vgçÞ>Æß{¶ýz›õË ØÙ…:¯!z–Hz*ZòWª©#º ©vØ9DÔ_lÔ×O±Ô4XÔµˆ¬ÒFl süâð¨cÐç™àSàÇí}ø¸-ªÛ}1㚮ϖ¯wþëâê×Çíç{Ð_ô¹~>lSÂÿƒ1öY©}ûèHåýö«ã6ò„6Éë µ‡°CuÁ¸[ï5ÌŒÎs’±Îdšù$¤ |±‚%èh âK¢Þ8à 6Ã*žÍ#+èJóúqnEq&fV?ÊÆòàÜ¿P0žÌ7¼óœ#l™Á©à£àå)}=ñŸ$ºv¸‘ ±^3ˆ ûãI8:{nVD |ÈÄ„lX°ì@0"]E³]"'˜›íï¹Á(Ð,¹¹]­]‡¢EnÐ I_]¥ t)‡4yÄÐÃ7ɤIcV^B²DF¡(^u„®û®(«¬³8ŸSóL †\-öR+N‰“ëeÒËf2ªâñû¸·ëœSD­þÔB÷HÑñÀ4äãLöÔʇ[)âË¿cP0>æm¹þÚÕœ…›À vØ—çV{m–ôò„ØbÙÅùaõ8« w­*TžîVgš}¨<-W-æÖSqjpë+]Ü®×`»ÒQíòU‚½¦¾ˆ‚`©0å6\É~’î>¦Š¿G DcžÔ~|O“4)bWûü?'£úÕ~Œ“­Û„~H[Å[íÇwñÕ‡dÜÓË-¡Œ£*Š8jáB— 8ªßRù–š·Ô»IçV7êÛ?¢“¼¡£BØçö®À7Lc’{÷:’ï÷ßÅì!¾\öÉvÀçöL¿”_‡‹O‚ÅÓä|šÂfÁB’÷Á¤7&Õ½ ƒìÞ°9IKÍÚä¸#—^ÆrÏ\ì™ :½œÓ‹>½Tzug­í¬u¬›‰/ñ:<’„|K^ù$Vµüõå+ù$Öb (_D߈¥!,Åb‘ÓhA(—ƒ”-¥6Êl#/§åš›1¤Õ‡|%4, i•ÂUÐB^.ÿqe kz2=8ܸ kìÉtaa!TÖ ±Ý8™nÒùæ->u¹@ñˆá…д—x24( Ï~Ú„=ƒŸ JÜŸËõ^°’ Bر„©Ÿ‘wÄen•ßøN{åuZ.²I“ûŒ¾én&ÚÙ"Â.ÒÙÌÎ3s«ÔÔN¤ˆä ¹lÓ£¼i=2V‚È~§ˆgÉ8¤rÍýmÉ¿+ _I5CàCÎ ê›Ä[[$ºÆj²B,2Ô¥}X`EùxH™{MD(.â L¨ª|TÄ  ×í3è£:²­ÝdJ»‡„Žg C“1@r*Á8•/aa‹åCU“×lÀôRÃæÂùàåDé²{^HS2u]WD`ò«™¬™³¡=Ãö®ÊæCÎjäLZ]Si(§FV?2š©ÀÃÇí]DÇË’R q+Êã7#Îièc7—?Põ1¸=ÓÀBvWYgp=Ô’ƒÐÌ®) (¸ê $ÚÏ®‰©ŽU0‚p¯^¬šú±•Á_uÆT+Ïš3Ç 5 ]ŸNËÆ€SÆß‚jTÐ~C 3„œJè×3U¯–Ñ4&SÆÄü\·¡4]MH[„faf?Û›³¼yK§,ýÞ˜´Q à4ø ¨7 QÇûIQ*×Ä•µNjWŸ<úÞËûr`[4C­±f¡Ñ©Ó~Ö `=áíÒ"°dN{‰Y,ˆ†S<ìÕkƨðZöòL°å(¤à˜ÊydR•òPÉ¡•½»±¹ XÒÞ˰×.Ö7”(óÞ¼55a„dÀAæÞujM£v}Ƨ¶³£j60Äစh\Búƒ¿ì¦ ÑÃuø¢¨tÑ<Ò :wª2Sú&†-‘{¸Ú„‘±ãÙè*{íùÏŽ|Â" ÁÛW/mšê°·n×&$áG]MU²Y"ï (1 Ê¡V¡FAùûR\[;N@I±f_énœºÚ(jú$"3.ʃo‹©ëÍì.»‘E`ß;¤[oH!†-n‘^k0Y .Ã]3eÔÉh.øùÇÑ8îêLaޏu3 N͆HÏbvÆHLðÏŦ}߃…¼jñ ™P_ãÓÐ5—®Í4á@ÂŒڌ{‚æ©Î´•©Î¸ˆhžê´!ªLeꞣ¹©,]¥ÈÈW(ÍS•6¥•©JÝÐ4OU•j:¼FEÚX¦&u½Ôør7¥Œ('é:¿\-UÉÑÜ• ºY¦ PÃæVÀÊ«^s+]åÕ­9-Ø+Sݸ9W_H/×RÄJÊI=ž;aÇŽ´}ñ”ü5v5]É€0Â]¨°XªXÙ¹PÓ¼(ÐDÈ¥¡âÝ¡¨È®(`™Š3@ó U£*Šû Ú¾„_V€[¥¹‹)¬À*,ë±Ò|5JŸPªª@´a tèM%}0¥1W¹5iã®&W`¬Þ=õáš!ƒUà‚fäÔL•Ê<ÅõíìÈ<„a[5ZN¸,,w­á™­Ù˜R\5 Âãé)6®¡KœMp ã­ª’ZJø‘u@Û 0‰j°þfÌŒ+åžÕ\‘a¹s!ÍÄÜ÷Û»3i¶›C4Ú°éS7åË® ’|JÅË…KƒL•óI|U!¾Jôc_º"» ¥«ÊÛÉ­Mç4Çh¦Oé¸@åÕ-Ô³AX¦‹Çì,Ç' ü¿¼Šô}Ų|ƒsz6·êðˆAÔ)gCþEpôhNI»Ec‡Ø­ÈÊ@s›n6ûoUkö± /ŠÑIòAnˆâ³–-2a3ày•Ñg>9eQp#¡„r -Í.¸M„œA1ï8ÜÓÑÊSÌíÄ€/jµÀØh3gŽm…o’(Ó"ÞF1“ÒX4ÀdÐ Ò°\ë»jQFŠí m~'™™‘”àÅ$§"¤YŽ® ‘ÿK½Ày7{@Êö?6¥+â®s2ߨá„n;Þ}&s£Ñvv.òûö„ŒÍáJóÌ1iêÕu®*ªÐuÞ-®¯„<Zöï…•£%ˆ¡7«ŠÉ!ú³(ÃfùFʨ-& ]þóûË×É›ÖtãÌüVQ-šL¼_I\æÆ ð‰oè5ö‡Ùçt˜»°#ðHiyÚùÎ!TLò`zè5SÂoÆÐ«å÷F®üPç $îaD¼åÞ~1©jžpébÁ¶²ºñJœÉÛwb¶þb6hûðE!º6p« À¬ùdIôk²‡0ÃçÔÛ8ãâX‘Y§—ÅBú—™¢úÆFAÎ ðUZÏå¦*´²[ ·ðJh"¾e§;—`6_ΦҜHZáE,~ ÿð&uJƒõÏ®žƒ[s̆P6Hö…¢ÎäÖ“ç“­B˜°·¬&˜JÞiã y‹X“ráA­ò$"µî»i¿žPMJdh„¾©4Ë|)Ÿ›üs Z]A­) [å›°}§oT×1õ¦ÙÕ[¿5gö¶¥óX Z6¨Ö,íi&ÆߤͿ¸u@Œ,5>jNqGþÄíErﳋdZyÒ[e773 ärΫ5*3Þ³u‹…Пž«:À’×|73æ§…°C§¨p]¨ LNó´Î&˜¢ ú9é[¨c ü²sY5bØ4Oc_iÖïî ¦2[<Ç„ýdxnÇP øåÄú•Ç \¤íâíFÒŒ !°žþù» C*@òëa*?ð-m.Em É<)ÆüGÙ£û™N&~ê§ô°ej“èüp4Ù¢ˆ/t™Ÿ/†ç §Ž/8fr8üëË#X= 6ÓÞ­‚a.~úÄß×ASÁ¿l‡ ²úNtä¢g·Ú»åZ^¢*€0dÈÅô2._ìC̼„팮¹» ï×m¦Æá*CŒ÷«ë0Ú(yÍOÍK!²T¹_²ªN†¬8s{9“*5ÉÕÉÐðCªûPwZ¿¥Ì{ÜØ=œ”kËã§„M|ºÙÙ¹§àÀ²F F²!Þ;Å3;^æ:qÌ ìÀ³`»† c ¹~Ú>Œ¥r+µ.1²RT/æŸdœÏ>‰iyu?³,ËéµZ~CÍføs9mñg2[TÀó¶« £<ÝcìHЦg³èÚ/XØw1¨²‹'ÜÍÌLÊœCgÄÇ ¢"¸IÕQËDf1ŠxÀK,mÕã­#¡×ÀSB2Q¤*Ôƒä3øY›:—É=TJÎ|NT ;zr÷D¶O–¢  š“› ®aÃÛ²Þìi qÒzC ´/ñRm‘Ý?ebr>… Eиâ$†;7æWf¸š^«Â¸L]¶©[Žžž_Ͱ?(YK6„×›i`™Š3àJ¢¡c^§ÙÚÖrQlüðcãª÷Û(?˜Æ þ¦õºyŒY¡W7æ„ÌHÒZõŒ*„--WI‹ÌTê •ìdšj´ôñ—wHq-æè˜£®xf5ÖÀÐ5,dX$§5,Š+ÈsT™3 ŠÈŒ†9*–gã¾ö`ðÍÌ_wRñ*)6£qŸ¯¸ËçEU”åro=ñŒ*lÑ_ ‚½ÐŸ‹»½ÕåðvQå•8Û[©á°ñUùÚX1)ïiÄ Z핦/7LqŽ¹Ç‚×µ½?¢¡¤ÆZo+ì¸5'«©ÕŸ|¦ µ0Ôr[£WÝl)ðY.ä·FoÛÍÍÅÏød`2ѴćI3£¨θë Þ˜­ÝŒáèàk!©[]/³Ò…ô<8i¶wð¢;èjŠwµb÷s˜£sèI],ŠêÖy 5ŒQ‚qj^™×¢bˆVyqw:c8 %·÷¢¼—óàmÑ&îñ­Îp “ŽºÈÊR~Åfßq”UŸØtª¬¬*PN¨¾¹wïäCQ(ƒqž‹»âJff»ñ¸íê]³EžòyQ´zf›Ê…¦Ú½F˾vùÐöv_-4•T7Œz&SynÕm’Q˜t“Œ ˜ôJ‡ïÐ ¶‚?6]DŒ RœúD¾V6_Yüð÷n,o "'ÙJeO“ÞÝgSè‹Ü­öE¥weñW'oðÝÐ77”ÖM“={¦§Ãfeß©LsŽ-ïF“…0ï‹e¼Í-Îú†×<˜ œoØ<6Pe/`ᣘž³V殢½î°–æf·ßæïYQäBˆÝ¹WÇX(I½Á\˜äÌÙ˜˜U‰}•Ú2 r?ÖR@ßß+9™b¹Ë”F6{É6›8rku¹u‘žUA^k‚ uzÛXË$Ò0Œ›/r'hceb°vÌR©T·^-nñ Ïø\—éòÄW.g.ŸØç¹ðGGºrñ þ¼1z™—<×ßJ¿(«„ †ï~Ž…™ÂÖ^®ˆ™Â¦êé­œE¬˜_üÐ}ë_NÏrÈ—M-‡Š{×{¡I¾–g,/rÉ4Û‡=H•Š2Eç;T7«(×,úçç’äW:†ÍÚ´úÙÅ‚¬ʪ\OÑJ+‰W¹òšàrÌWƒÐrOc¼®#øׂûA4ŽÔy‚7w$RN ®‚Ñ`zpDVµ€°¸ÚcÄ®}¦î!ý×öÔ@½64—ÄX”à\Ä¢Î^‚Õ^F¼­>ñ€h/2ÁM)ÉV €« DS!9D6aQPŽÆp‹œ$T7ScÁ Â+ɆKé ™Ä›Á/1Þh¤WÃIô‘.WMƒAÿ]Œ7…øo’4àŸà4ë‹FÐ?÷Q*(2ˆ.Ç+]_wäØDŒõ¡g1…25o¡6ÇÔ¹ÿlFvæÜÕ o«U—‰Gã~JþÑŠWD¿Lu¼š¹SÿœÝºÜCøyà}gíg®yç¶V„£³pð4õšXøi¡ßoùVî¸?š’ZÐÁ©‘?Üý~¿î»þ䡘“ŽÀ#qüð\ÈH1½?ì. â7TDzø­¯®Š¿­Õfsþ®¬n,cºxn­­´þ ÒWZâ«­µ?,7×[Ëk–o¨þÂßîÿ ‚?ükÜ/ùùÒḚ́·ÒmþÄÔ°“Œ®è¢ª°[š? N¯‚ýiLɸ{1LÉyŸ&¡Áݹ€éc0H>€Ö2ŽGƒ¨K¡ÀaRAæ Ò‹d:èçý÷j¢Âíƒãv ´‡¨Nô»S!×Pƒè%Ã{¨C$ ü×½}sp,F§=H¼û×âþü|g'ˆºÝx4Iq‚£›×Ÿ·ƒ®ÐO’-¡KY1÷‰ù x4%Ð{¬!¹ úÑp²„:ú¸)]¹¶àíÞé½Ó7¸Fn /’ÃWÑÐqœN€cHù"K‹NàeúË/Ñx‹/ñ¸ îÃ?èÁOp „ÈâÿöEÕw·mÁ'ü~ü>›¨ã³FV±Nùf7ÿ-o ë™qCb“/®Æ7€WƒûB0¾^“gT'¯(®Èä*<\?Ü7î Øä‡/’ÜÔj¥„÷¢Æ½Óz€ÔÊÊw‹¨`5õðÊK¡øÁEîp¼r îç“¡–Òé©üZÇüb– Âþ‘PJUS ¥ˆŠ~€§zð hböþ°Tö?ÉìÝ‹qЇ›çeå“1ø\Âô:#¤¦¢€ç²Ä3þ8$½Xeý9†+è—Ęëi¶+tfÜ€µ]¸æ^¼¾y¤„ø¥,?¡u£Â©› »Ñ„Ó1ïEʉ֌Æx© ßMH†{;A׃Ëe?Ž#PQÍö3d /¨ú…­à¢VKC,Jn€¦bÒ†ìõ†bȆÁY æÁ/›ÄØ4¬“­4òàþôËècøƒQøO­†ÁÚÀ‹¯D^UdA¸?ã,øñùiÖ*Ã? Ę%ë†r#X:ò IÅšO2õb@7rHÎŽ‚"hÔ–Œ.ÙtïðY@à·xØ[@Šc¸ )!·»‘nRÅÀ_z@n ´ à$bËè],!¨¼¢e¯‡ãø½Q¢.ÖnB,ÇX0Ѻ|÷"þ(È ã$jœr?m2I¶Â’SwÞO–R±ˆàìó­öè"ñÙ‰g˜ØlÙ©CJ]¶SÇ”ºb§N0õ±øž²6]ë·$8ꥢYÍzžyÕçqM½‚Ñ;Aÿ/š’¡H%âÏ´ËüúçFðë¯â¿Eñß=Zõ'°Ðu%Î0I„ÈšÃUÐ?‚ž€]Õ@³6X•°Vã¹ÎWf¡6Ø‚öޱø"ñަ¤öA»ÓÞÞ<K¯Åàw„ ̆àÁèÜ£Ë&¥²ßÀ1íc<0¬KÃî3\Ê5N.!PJ»#êøÐŸ\‹hhݱJI}-SŒPÃbïC¨A¼€ n^þñ"Ž €Ý '£÷ãϦCy¸|*¨CÚ˜úwN:‡Ý;8ÆÂÀÊÐA‹÷f€:ÛO÷÷d&A@hgY’Àx© §JåÝÜEгVµ®úEý18~ˆÆô{bò}s²ýàÿEþý––<~{_|2¿×?ïO Ïòƒ·OjB{0RGζ<£ôáôR¤.¿ùø÷·Ÿ8Û—?½™¾ì¿ý³üC0eÎO >“ |)S¸ü9|Óè¼Aœêu7'‘… æùSøë=Ôÿ\ÿ¬_êá›xïí›?=…åç7âC -þºÜl-~~óëä×àmý¾ 0r{ DDaˆ:î½ùç¯Ã_}{ïIfBû믿Âwø*À¨±ü1\ªßÿuø„xç%c5v~úç§é—O*ëg <õ2 n» ˜^¦ç×ðê ÖWW1…„íÊ‹uC`£ö_‡ veÃøÃ@ @£•ð' f`,ÎôÓâÃû‹”åÿxº÷¼}ì¸ðv~Z¼ÿpq!°rÉòÙ¼KÙ Íú~•µ™«˜7‹‹oŸ–…b‹›Æõ»5(¦©3¹~£Ï¡g­Õ°‰Xߟš [¿p]I©–ôm±Î—9Îî9™1CÔyp—˜¿ù§˜×—ßGüÕU/QsO´YcŠÎÇycY4)§f0 ,ןdËhQóiåK^i°Ë„J7Óé)‘ ¤5‚f•nù^Ь7MùçOæW¥ÉC O3>BrFr­éÁ¨å`ÔºF¿þóÍ_œ¼ÍëVÀ…ôY{«þ,S‹Y̸¤{:¯q–zÇ­š§†ÀÙ”@ò8-Q2QA•ÿ‰_E**ÚeÈ9¨¨@Ý.p4³À§ôã**ðÖ©afON xl¡¨À§†™–컇ÂÜKK¶Àe9)YEWì¢ ·Ë_¾Ü.ªê¾ÏöåÿÁÎWƒeÿ§ýÅva»ÿdç†Û£Š²?°³ã]P…àøíƒ+{ËïÀ«æÂì?ÙÙñ‚Ž"t:àñ¨¢ÿ?/Sà}­EÅþl×Ã÷±ùìöòQQîÿqþòUQîN¦k©ŠJüï–3>;{Eñ““ýyqö-'ûÞß sû&Â(ä½­,o{J¹<µåañÙÅþéSWžúÑ­‹¯d-*tË#?f{¸•áýÙ…>;…Ê4êœ2ê¢Ô¢Bÿû¿þ^6¯>-’Á?ýä/T²üÿºì^ÄX?¹Ì^(½r3ûçÏ.Å iíʃÝb*;ÍDêl§­G9%t‘O´Æþâˆñƒ×/C¶ ³®eB±4-V´¹Ê˜…å'2ø«¤í‹¯’Œþ*Ñ~\ºÂ /‹]¡´5|a¯©.¡ë’Be«­\5ý©ý)pk7áÞ¯¿. ™fcåËâ½El>›ýñ`ÊÌU yîa+úC^ Ò%M¡4΃ ‰h,ˆf7§n;ÏRþš›b“x†c0ø‚»dø¸h,ž$ faÅ!Âj5"¨5صˆp]*ÌèX§¾X|Ð…¶k¹–ocr‰Àû0·åõRNÔÝÇ€öÅœ3¼Ý`/3=Ül¸Ká=•¿Ö´‡~¿÷…ÛÁò†,³Ý‹¸û±¶Æ¼UzÉ*j/[¿µgW¹_¾ÿßùør)íŸß@ÅþËë¦ÿß*øÿmˆ¤;ÿ¿[øAÐ÷w-ÔnÆVM$zü°Lß8ÜÕS‘B6ƒ}WîÁ½Hü+þyð“òˆ»1 ('—ý›%²âå°e2Êè“e²Ò%§erB<ÿr!Š~¹öTÉ+Vµ¥ªÇ8æ¥rnw^mwöÊä}v´½ëêíýRáƒ2á*ƒ2ùÚ¥Àáe2B Ù2ùèö„29áR‡2ùžvKÁ;<èˆõp©ºŸ Åô¯e2í‰/ÅE¿¼h—k·fÛ¯÷K}gû¸Èã_Ú座W–꙽ýrèu^ì•"a»¤T¡ Ø%y⸥9Ro9yQ€Ë䄨À¥‰A‡K5H¶Hûòô‡“rÓmiUœkäN”‚5^¹2´Öœ GZ—’ƒ¥sn”š.ʱüÁÞßJuh©\Ï˵´T®çåf¥ýrÙLÓTùÞ(Ÿ_ÙÝÊõLù¼ÊrXJ.iëd™ìÊZ&óß«`mØqËdׯâr¼X6'hk•¤îi”›óJÉËöA©lØo¥¦ùírÊÒ‹r:vSÙ*É­íÝrS(ìê”kr)9¶ýòU©†ÐnL™¬¼TnZ~ùr»œºRnöÆ-ÝR‚ªtNÚÄ-³tNÚÜ.³tNµ+_Žð%3–XáÅÃ^Í\þîý,ä ­~ ¼ýŒox‹Ãx7šD›¢¹Ç{G'»Ûí;ùázYç!_?:¼¤Ï–.yErN¢ê7³þŸaÿ¹,°ˆ”þÚÖš+«ëŽýgcyyãÎþs?vsÝÿ R£+;±’ÿªøáqÊä [Ù/ȧV—ƒ0‡ÁÁaÑÏ÷Ä «}<‹"pßÅXgýAŒQÎã!Ü¡ÂλÝp¦<ŠZùìj0Œ?°WpJ£I?½€CvÃÞ8jë[͇C‘<ßÇýŒÍ^ Ò"ˆF£qu/6á*!ÝÆ¨übŸÃA5:j*£Ž’4ퟂ“w‘”' œ0NH.oŽÎã%<ÒºKa9 *Çå|¢ñ¨W¡o½2ÁÆÊQºN!vG2H1ŽH:Ðp’¬Éøøf/ÊÓ·‹ÁŽÂ-ûK¢ÊÉ…È/þ˜t»Áƒh˜öE1ð@‡ƒ±Ø}‘gŠ¡;à 8ÖE½g"ÃTtyCFÙÐ\Ž<8ö ÇpbpüP UâÄöX’¯rôrû诛2-þ8‰ÇÃhä%H^ê±í tÀP'Éð(q™Rë ÂÖÄ= 0²#ƒ²i@©ŠÄ’Æ)d j%Œð i¿%¦Ø!§q%Èah€p6²Ð0xNGd½ÂêaÉS}x¥"qÀyeù™ª‡#ÎÉXppåRÈõÂÑXR¦œÑå OÎt<³"#ºDƒÑžˆi(@&ŽrµÄ (&ˆ b¨Ü®œ’© „ ¨A(:FŒ|ö‡Á_ÿçHç n$µ[¥•´UIçÖ´ñDC¯vGÆqd|÷áA°¿½6ë\"8` H¸œÇЇ2 ¤Ã‘® ;M’wHz(Þïêš® ^ä¡Ódra\À%Û%ž#=A1›t²UÇ1zñHÌÚ)£{Ep¢âÃE ŒC{GyÔjM êŽD(þ ¢ ÞfŠŒ¥ðÀŽú%.¢÷w1Ò“1¬H“Á»ašây28//¥¡9æ;»1]{ˆ²€¥b,_Æ1ˆÎuHN¡Ãj)çM ÁÕÅ¢½xžÆp G ûPÑx(Oø¾É„œŸ†Ð´(Y89!ãÓvŒ”ÁƒzÓ.A òE½ï‹A((4GÃsQSˆü(zT´T­cX%ŠpD“…Œl4xµ©¯î;J ¹ö¾ŸLSȉÀ©'éÜŒª`)ؤIÃB(¢G8aeɰç`G›;\·Œ† &ÀdÐÓæi ‡ÀhfÄûŠÅàr™Ô\C:8ƒ›ˆ!jÆŠMÒDHÌ1ƒT‡†X¾[Rº–¢_Kžë)Cçdy‹“ùmKýI±Ô‡›Òl}d£tSÀÈU?„V—ä«Èp¤}ü×kĜۧ‰^Û™W¯9©’Ð nnjÍL«¢BruÁ œ3|%( ê}F˜ƒ"@D|cØ©8ê Œ•G¡ð@g¥FªÉÔÆAÒµ±ÅAϨε=¯6£­×ªÌâ8³®d˜b¾ªÔ|jVÐ…k³Y³ ›Jó T²šÓXZZú²©¥7Är}À ŒƒBæ“-åY×[ˆÄT[cC´}Äø?B¬6NP^ª¸©Žâ"‡¦ø®×¡2*2ŒHixtG¹¢Ñb¾ß…¦‹êGX#t,Zf¶¬)¥ú fðÔE•õ\ä^ÿóOä¬!³ ˜!kª ƒ€t®óxB“Uw‚3LŠJ*¢.£ ‡àZ2.IÕ¤òŹ!s" @cè2.·-ú†ê èæ"’ùŠ›ÓtM¥Ò'ƒT Žöu¥%"ÒV9Xw7šÂ‚‚C9§îk=üDŠ’ 8 œ(xÕY2oeY1ˆaðÝ‹ <„Üû°¾x‡Uh ã¨@w`¬Àc•EŒäšêXëj¬”ãÍÇ·:ƒŠQÿ±¥¯Hâ)üðà ²mBt Àáª~@ |—  ¿;ÉÞ°~âDà ‘Æñûàãî*€/÷ë‡#Y.{eŒL3éíyÍçëBS¡"€ã(¢-ießS¹û»$ßÝÍiþ^ƒÅÝ Àå?«Ú}‹‘DؽGÉ1vj‹¿Ö~ýuy¹)þ[6þÚÿYYZø·¹þX¾¯Òß ™½Eß—WåßÖº|o*PdQ"¿–U»–Õ•ÒµlHP+Œ Ìº"AlÈ¿+2«Z1@¬É$‰ä†¬¥%ߨïèï#¦Á†nkÓFð#,A?âÉÚÉ¿­• ¹ZvçxÈÕâZò³P›DZ³))ühf'4+Y1šÅ ¡æŠ'A¨ï’Rꥂ ÔZË.²¶â¼¯:ïkÖ;‚pj]Û°ß%kè÷VĆSë†SëÆšó¾žáÔ*¹C¿;X<ÊbñÈÁ⑃Å#§¡’UÔ{Qm8=ÔtzhÃ页l5â÷Uç}Íz·zˆ³lØïª‡ø½•±áÔºáÔº±æ¼¯gA8µªâw‹GY,9XeC¯" Õä"R5%¢,ˆšä»Ä¦)—’@HÔdÁ$?5[,%–M`²J AÈZ›V››M–ç²Ö¦ÄrMöÄYIbÑ”ˆ2w"‹Ü©ÞW­w±ædYwÞ7œwÆRÓb±´XgÙ)i±.±Xæ¹Ob±¬i±.±µ¼.±àÎ\—X,KZ¬K,–5-äŒÚd’“rS ÿ¦ÝV†¹6Vw‡VëY¹xX©w‹GY,9X iÒbû€$[‹í’¬-Ã> )ÞZ¶Y¤µl³PkÙf±Ö²ana,¸Ódæ(ùà1Éy8I&x¬É)ió1HÉyIJÅVb)W¦ÍGšœrñÚ|$•ëÛæ#¶¥J,yA'õæ#MN¹`kòˆ“\Ùä)u´&ØU‰å#MÎU‰(ûù¹oùk=wÜwÇ}·Í}M$Û÷Ýqß7á¾µ;î»ã¾oÇ}¼ßpÇ}wÜwóÜÇ;ow+°·½(KÁƤ̲2›è+3q! >¤™èÃŒ€” ÎÞ µxmÖµxmÖÚ&ª™3\[‚¨fÎpmh›¨fÎp7ØDù=6ÕiÅäóˆ¬ØIn!ˆjäöR¼Z'¹=„ ªu’ÛCHñjT¥‡­Ì=¬îzè6zˆ&˜¦? »7Ù[ÙMî™=„=PÜIÿ]vÛ9:IöÀúÌ,­UgJ¿ë¤[î¤ÖZ‰,+³²ÐMåîÔZ+P’¸Y«¿Î¤•i¨…_\¤À·Ify\WÒ< Dš³j!ýµ8KËF¤DóH‹®X¤2›+²–;ð«ë„Lñ™ƒÜ÷‹³¬J†º“¦ßjÊ[›Ýkë³³°@y µæH¨£|½W^z0½ù‰*)²Z€3 ¯¸ïdÉ×–%ëΠY·ÛÄ Ô‰<iZggŽÿŠ— ¯´>òA—ü,ˬ.Ü‘ÏC›Çw´ÉvËj¥Ì²Úœ¥5;KÁò™þTÄöU9“•˜s”F23K«µ<+Ë2ϲLÚµüæp‘õ5»HÁäÇEçC½³ò\ÃÊ#«zLlZrr»£øWµ«ý÷Ðf6-ÖYoÊ—Æÿ9K\r4×¹ù¼£Èj#ïº1ô»m‹o3x›ë\mò1'# S9I™¹½™=YØÜÈÌÌÃIʘ%š™n3;–H[p’²Ø?Êbÿ(‹ý£,ö²Øg-ŽM¶0®SRsÝS]¶5²­y”mMÖÙdÓãÍ#·C ËžØk>vŒ†<†Ì,L-¹û~wžú?ï<5ÇŽ¸ëd³“¿þÔ4ƒ°“‹Yi!ˆbVšÅG8»9¬ôŸs ÚæØÇÙéíqvBxœg'„Ç™ \Ùœ¤ÌôF>qNRfz#Ï:'‰±g?®/BÇkÐuÄ_ÍkÐuDÕ¼]—AÕ¼Îw-åôßÚiŽŸ'‚¨æêéúyb¿Wsõtý<„ìÇ’®ž.«a¿Wã6—ÕD5n+d5–[w¬vÇj_™Õx>¼cµ;VûʬÆz֫ݱÚ×e5äƒ;V»cµ[`5^Þ±Ú«}eVc{ëݱÚWf5¶cݱÚ«}eVcûè«Ý±ÚWfµÿv»û«Ý«ÝíܱÚ-±Ú¼»6_!ŸTc-—¯D5Örù ù¤Úîá×ê¡kôȼFõ»)ì‘ =0¯­¹DSÜ%7’¯Å]r#ˆjwÉä«FñŠÛãêò…ïƒâÕ(ì kT‘Â.y‘\Õ(\HÞyÍŒòV#çïÈߣ9ç5¥ýdzÚàž×ô_J®yMß¹*¶uÞ5õï±­ó.ê~m½ÁUÅwßÖÔ×o¿­fCnPíý¦ á»(¾BCn@ù6ýzzÙ #:§Æ3ÇjЬuNÅášµÎ9ÿ^³Vž ¤ŒOzkeN¹zMÜæ”p׬uNqt½Z9ÜÎ-×:§ ¸f­ö¨Öwr82á]åÒé{ çÚʆ>h­®f“²Cl5;ÄV7²I²IÙckËÙ¤f6©•MÊbŸ 9¤“¤`ç;f–L鱕%®™EUI-ùßÝþƒq·ÿ AÜØþ[¼cµ;V»V[µXí¿û ª5¢EQ˜Ÿõ»‘y72ogdnܱÚ«Ý«=²XM‡…g(uh7z‡ âñ¯®ÂŒÜÕº Šs 8&9›wä¼IròrÎHZÉ&­f“Ö²IëÙ¤lÒ£lRvÔ´–³IÙÅh+‹}Kbÿ_Ó¹fÛWÿ‹ÛžåÇV–[å(dÉòk+˯+Y~]ÉòëJ–_W²£m%;ÚV²­[ɶn%;ÚV²Ø¯d±_Íb¿šÅ~5‹ýjûÕ,ö«Œ½ÓÓf–u'Kv]²šmÝj¶u«ÙÖ­e[·–mÝZ¶ukÙÖ­e[·–훵l߬1öÌåcºSuïT]|ÿªªî’;V»cµ¯Ëjë,}¹'2›(!íŽï¸ñ¸‘9ñŽÕîXí+³ZV{\ÏjëYíq=«=®gußuÖ%FžKcÖ;Y²;¼ËÀYÝxCŽ^ºyîÃÚ¸Û¬»X·3°6²£h#;Š6²£h#;Š6²+È 9jûeAÜ,Må穳<âåì(Jl±ñxÆ£ÁÌeƒíº;Œ3Ï ¶›³Ã¨ÖË¥ƒíí02m n y”B² ôGRèȱ×d㯙%Ë,²Ìò(Ë,6ØYùú(Ë<²æ‡ÇYûØVx›l¤–¬É7`™EZÕ‹Ø"Y™ùx?c#Û3W«Y³S‘j%bËYCÇãõêE¸7X\È¿ yùA˜Y2½×\Îô^3ëÕ\Îðfs93ý7—3¼Ø\Îðbs9ËÍåŒàj.gx¯™Ý|j6³Ø7³Øg7šÙM€fv ™Ýhf7šÙM€fv ™Ýhf7š-{äÜ©wjÆWR3šÙÍ¥f+;*ZÙQ‘ÝŠhf·"š­ì¨Èn54³[ Íì&B3»‰Ð\q$yî-ôLÛŒdŸ÷° +–2o‹Ý,bÏ/Ë,<ÛWÖ«ÉöFv뤙Ý:if·NšÙ­“fv뤙Ý:if·Nš«Y^â­u[hfU×Ìn•4³[%ÍìVI3»UÒÌn•4ÕVÉ,ÆpfZÏUA¼’Ý}ifw_šÙÝ—æšÛúÅÚûhDÝI?%¦—§ñ8 ¶j‹R±`YÖŸµXRl#%㹡ÄNKêÉ-5GÈ¿Ú#¥±;X~’nhm깡éàÒüµÅ3ºEO¹5´¤¬f/ð–\´´b‹ç!ÞW•»¹-½õÊ×òµ¤šßZeÕš–þˆ #óôbSŠqÊÂçÆx‰"»¤¥¯hñŽòc^¢°Ã†®ˆ7Ÿ’‘1OâÂsž¤«’ºÕ¤Ì7òr©©+âãȼ9§Çë™R’H¹or@;y ³0º²%L:yʳö«ºáW]žáV锿ÂÁdG0”‚¿,-ëMx#ØÀ2ë=²±|oðºF—CZÈ Vjv5çvÖªxBæå¡3[.«]å!»ªõžÖùb”&+:‹š…¸ñ ÅPÛ$ø>25ã«,¬/ð$Ï“»©'¬8Š ëLÚ¢Éj«O¬#w—°š¤†=+sZ2pÈ>a½•µÚ¯Z/cëšâ-Öšž,M•µö«vˆbÕLi@zðåZì+ÅWr­úï¿Ë Ö$sÈ33j­lðì2’Çz4Êñ#Ï*­\žeª±áeYšR–剶eydVö4 2™eÕf Ì"Ç‘äfóÖª¡Ú²BÍVÙgëÜ,ÊŸÚa¿|—Y´&Í:7׿NE3YØ”£Äã†Æ…~^ŠÉ¬:’_b¤Ö|ç²ÙÓ¬á8¸)›kjnäí¦‡Í5{'EiäËRY_–zü²ºuO-´ŽmM=ññ|lBlò¢tCX9u7ù²0¶¶®j-'1Ühƒ½Ù/Ž+8m.uÌÞ¬0IhZ­àËYbª[Èt£Õ.ûj5ýŒmDÝm¦®ÑS¼«¬ «öponhùÂ÷ùü"|–玑¥˜1å<Ä·J®+]j™oÎd]S‰E͘|m¦”œúVX=ñ±/äºéØÈKêÊÙžçkÅâJx´$_´Vyê’E Ò=²'º¦òÏÔ²nƒ?±Ä”}f\uçŒ#% qÈ÷Q²_%ǜףq™/ ]çùZvÀ†1•ó²Ež­ð«ºxà åØÖš^“ðå™Ä19Õ~Uwש;íTãµ.¥v#Xatµôæ»Iùœ.ŸÄ]Óâ°ÅJšM2óžÆ ^‹¬9Y´”" Åçy2I:¸âÄ/r”«[Éyµš1¨;êÔN w•£4²î²×8 Æ>ºLž®Ô C‚æAÍýg„Xµ ¡”o¶*qÎK6Ëê¶ÊÆ6ð$aï'© ^ !ÍÑj‹;k¹Ÿ÷qÝ®Œ©ÇÈ0éY‡tHÝbêÍ"]íWõ˜DÎ’å¤Cª$ H^!øs©%:/lyT3æð¬žž3l«öoøÝ=¶‘Ï“¼†žÅ“$âÁÄB_Öìñ¼Á‹Ýuͼ9Ë3!·y9K‚–“k†3»† x¶àþK¹ø`3›=ØxÀgy?†ÍTƧœéÊ礕ÃãßÓ|È”¢ùð;C¸9áïw^Ïf¹6gRb ì¬É`¹“Ûíxdkàz.ß»s¾2£d&| jà¸KáêäZc+4«XlÙË1ÞaÚ(\Uy¬¨×}-Q)ûŒ·vg,q å¢mä¬2mÌ~äxn­¹ÌR[P*_¶sÇÜdû\ü¥“‚ŠÀnþ)y†ÚU²N®ãzýÇÞ<£}‹žÒë¼w9§°“D%¼¸hžÚ|^™·cÙ5ÙEf…‘56kç›ÎØÂ˜ÎØ f®éì«RI?~ãe “Ÿiìv³0oääS…ýX»˜±u'}œ–®±åÚ«—ïjÝÐRëÿºAmšV\7”ìgžzËq¿êrÇšrK]þ•›&›FÕr¨e*ãMí­­·Œ¿7›ÑšQ´¨A¬™n~GÇç( ësˆ•Pçgõœ~T>§ì¡x“¦ÒrÖ-ö=ý¶nåôèÆ|ÂGSäôs{fܼ6ÌÁ•P/ÚkÚ×ópžC6yº€WßÀ’Îf >±”g¶`_o£¨³eWu¿n–1­ú°˜exS‡.øŸ<{õ•Æêµ¿›©:9É^Ü×qœ`—B§º‹ ‰êªsúcV ÊY—õÙ‘<ð²dÎL7è¹—cÄ&§°æÍ;¿ÌèC’á‰-“P⿜5"ªO…æ$¶UªãÑ~i._OPcòö¼,ØR\8šË×2¤Übsø€‘‘[¶ëIâ)ÃøuÙB½*ËôwÿQÜý¬%}[Ÿÿ£+¸sr•œ&Y!tæ@Ër¬–ÔSnÂ^íÌ8ÇOƒeÄïbÌ×7HȾÑl~Ï#)[öoX=üÚ¬=¹ÜeêÍÈöLgöÖf Ó%þëWì‡Ö¼Æ€cÙiZ‘æ·ì0Y¾¡ ¦¤ù¢É; ߣ­â?ï1‡íغ3lÇþo­02:+ß :¼?œ^¦“h§ÁV°ÚjrÚx:À¤Öê&Áó8> ƒhØ úÃ^üQ&-S†É¸?ßZkëµxØs°ôS‰FzO Q Ä1ÄCñ‰¡õÿ‹<˜~gÓap†¸«$ñëŸI܃ÿÅâ“ ñÕfQbs38 ëf±xÆÁ°?€4³ÑËOEÅßôÞ¬ ¾gÛ0ŠúcÝŽ°› ߟ¼‹¯ø'ã«:7 ÛæC½ Dõ×DttÒÞËWˆ†üj»}¤ª Âáƒfݨ<¸õ†h¾„.Z{FOùí:éÅgÑtP¦}Üuøiœ|E²ð¼jŒdHn%CÔ8èB™†™} …FFSTÔŠ„†ªÒ^RL¢ÓAl´?Ob#½—iz)®Í´F-3Y–¤8Õd_¨¬®;xt#(ˆ^Æ—‰Àt{<Ž®–"ø7TRæO,[{GG‡GuYä$Øb>ú[!•Žz¢LðýÆÑÞîë½°ÿ@«×Ÿç!ÊšE‡¾=xý--é¢+¶Û[ññ‹ö³Nw¶;{A*·j•&ÆÒ…Ž¢C§§iwÜM`Yôbõ‡ÈÈjÀ½“¸‡ãöÎÎÞ«Ž…Mœ@)ñò/ü„‚DìÂ=h <˜±0Ëå9'—û0*n =ç ÓÀæÕA@´¢Š¦[³að`; §aõ†TÏ WêJn7‡Q¬#ró˜PÙö“äÝëÑ–šl"— Rô·~ÒÄŒÄ\#û&pJ^F#·ž zÔ¢ìþ¸ôYº|'Ÿ‚O”7Ý’Ø#…Ó-¤sCð䌆-5,jâéÙT3l£?ìOúÑÓ·ˆ—¿`•jìÉH0õ‹8êÅcÑÀÚäj£H+D½Fãs ÉtÜ_F£¥ŸDûj‚úÓîd:Žƒ—ƒ«Ÿ£Ád’L­‰±aùô½üòóa{÷Lx‚Yd*0 ¼Ú;9Ø~¹i1z/wûã8+‹4#â®TÖèLŒ§Ò¹ƒü,ºê²•ÂêÍ@&C;.¢@[ðÈü“FÿZ¥}”8ús•êanŸ Íî÷rÙ@JÅ6J¼f1й÷½ÙO)G 2ì$——‘1M–ãsq8Ùs…À˜£ñÕáÈD5‘ouœÀFã_ øŽ¬HFPAæ“,è-ÒM.GÉtØC}PdA&_¥Ä“oz~RI õ¤0Êo”¯žÉÔ3K9)¨;L(\^ƒœÍHShé¶Íjö¥ÐWA²Dd@ ­¤ïíl±rŽj¿\kˆÈYÿc°üŸÿSƒ…ðGñ\ xW››qÕOÁ<ò!÷Ä l ÙD3€‹‰„µ 7á‘›ðX%Ô(e}ÙɲîB]o¹ + «n–57aÝMØÈq‘]l&œÀóY$ÖúHÁvgñx÷Nºbå~›A(HIªöý@=Kå[,ŠB´ حµzÃx}ô¨^ßܬA šQ“ã‹þ"R/`’^$:¢¶¾èvÕ7T`qïðÙb- æ]w÷T"ÑvñxïeÛþ@4^ܵ}´§S‰Î‹GvêšÌ»óúhÿ*u]æµS7dÞ§GÛ;{*õ‘Ìk§ýw;ºËÜŠ—/·uªlÛß^ïwÚF+š²}¯öŽvö 0²yÛ/_é4Ù¸§ÛG:M6­ÓÞßÕx5eÓvÛ?·ÍdÙ¶Wû¯u¢lÚËö™*›öb[ãÔZæúžëÄ&#ðrOoÉfµvtšl’Xæê4Ù¤í££Ã_tªlT{W'Éíýíõö¾QÑ"÷“Ù.÷›lÝßœ/+²/wÝ/fCÝo-Eo÷‹lt¶"nùA¦"æV4ι™i½™w;ºÏW$ž›i9Ÿ7ËœM'5™ä:I¶óÀLS-ÔIºm:Íj•N¶Ú£“7¯¼~©“y’ùD§Ë‘µE{‹h ÑÉܰ¿wöŽ !!·ýºs¨Wòv§­ùvåÌÞóö±€¢?¬ñð·j”­üùp_€Ù×=!'¤Å¶–‚rJZì¼0˜làÞþ±.,g¦Ågéåä$D’NbúK»³óB'Ë–íl› W™î϶_ì!§«Å_^˜Ø¯sçíu^„”3×âSÑMÕ©e:bHPdÛžtßà®{a» Õ¸×O 46d÷L–ØÍ{¶hˆ°U–KFsæ¡Á:²iÇ/Œ¬²eÏÄ,b|{_’Í;Þ´Ø6Û†æÍ×;Ô#ÙÀ׿tð¨É©Çíç{zø<âNt’W˜± Yùh•óþ?sz}ÄSÅ?^í‰þÕéë\çö‘žm0ǵ_·µŒyôHCAs(}Á)ñ49Ÿ¦@³Xô›nqo`<†¨²6 ¡*ÕQAÃÚÞxœŒ—.À³¸ß®‚n4MãÍà²/k±B ³Ÿ™ â¥_‡‹O$B‹uPhk'V hçU› €P*4$­ m¦ö#ˆ!ŸÖÕÓšzZUO+ê©¥žšuf™)äÓ#õ¤*ÙP•l¨Jç2˜ Uˆª††|R•¬«JÖU%bl2˜uU˺ªe]5e]U²®*YW•ÑÃ`ÖT-kª–5Õ”5UÉšªdMU"¤«£jYSµ¬ªÂ«ªðª*¼ª0ÓƒYÕ…V†+ Ã…ኪDL¼ fEÕ²¢jYQ®¨JVT%-U‰P<”­ji©ZZ tKn)Ð-º¥IÜT°›ªMº©@7•šª’¦&qSÕÒTµ4UTš!UoãC-DEZRWQ@á«@òÃrÝ^ÚmÓnQÀ ¼ ìÆhý .Wôš°«“+>"†BKþÊãïI¿JÒ†Xávß5pW2LÇݗѨ¾Ïq˨f«×ÈÔ°Ü@{à üQB,Ž'Ó†ø¯9ˆÏ&ø0îŸ_L긳,Ö³“õ ðÒ€­lÞšÓË\ ÆYG‡b}ÝIÐ(1™Š®]hµµvÐ!\Œ¯ò†ªe×g@¿)‹(„ ñ™ŠeüåhruŒv·ú¦Y½AVãÙ‹CËGBŸýߓրb5Ï“೺焲ժСõz‡£I'ÙöB/b¢‹fIa߀†FKSlÅG1sC¡g"bn5@uµ J­íH¬Ûù°r7Ÿ$i5bù:2¬Šùù2¿Û³ìG8è‚ÐJ4ÛR[À_àÿ9íäÜ*¿Û>Ñ?žZ[¶ùئSÃCo­}$þQF E¿Ï#¼D=8<؛ٞYxxÛ²æã7ÏvY6I”¨eS¡j`®ìÅ‹žRŠ'=ÅLÖ¼g°¦§‰š)]Æô·\ñåÌÜ¥¹4‡¢3siå“Äë¾~6ÌÇü„RW„UÇÔT’Õ!'>!Ìpü³‚¥>©ÍÌß²òÙkþüͼüðX3CŠG$\­®r—•sšLa ¸G[é™už%ãÑáfpóµq]q‡D«ØtörCËdn„Q² Ï7n±Ï=ýH]Só÷  ¸wð…%„§{ ûìþùå¢?ˆC1O§(|ªw‹Æ¾°ctÏ<ú®{†LBÜ5ôöõúæøCÒ½˜Ñ9¥ê½c4 d÷<¶'x¤ O¦ª2Ó¼AËZù>0Šù¥][œX0ü³{È}¶{(û«vó²n7™ÑW„†¡”ì'‰´Oqñ¬n–çï#,P£²hd²áK§{çë§<Ê=ÇÑ;Q³¤“ª:CªY”ÒxË Vóf¨ÅVZ&¿—¢YmnÛI†“þpk²™8T¦œ…pñj&«µ®O<¿î’3ŽÉpÎ4®Ñk5¶ÌR¸–Kâ£x2¥þRׄÖhTËÎeYtå©ÜÞ Ú»9Ô… ¦-<;„-½úͻϓI¶w ’rÝ•ùV!Z–šæU¡œu3ɤ\3i²âlzÎú¨V+A¶ ÀYTÈÃ̃rÁÌá]ò~%åK2¢àf¹öî×›š÷£Óx÷Dm¾y™ph¤Õ'‰p¹%GóÖ™¨êÐN¤ÒwèUåÚM+=dçD‡ÚøTWPMìKj¨Íïkmgô l+õ@<EÕ Jcêb}”1ªÞ1 ÿ²½ò}¯ëÚÏ”zV¦[js •öYç"ÎèB¥zHÄK £Ç%»ƒlNúUÍÉy´÷ÀȵCÕ*®½V+×c×è°½Aê·4õc+ÓüêÒnŽŽlåwdë{³zÁh;]§|½)tn£jM`긃|É퀖³PÔdVæ k—íùe»¢˜jµÊdÛƒ KZ´(;‘‰nu¢Íµ…ÒÊ®½[@y`k2_ì({+SÕ?‹÷ÌMCsÿ¯é!Â꣼±J„˜µyiœGñ¦ÖìJý™ÏûQ3¢÷³o¿Ó(<×ΧÕsa­?Lã1~€“JiN#Á›·õ'‚SàisgЏº†ÛF¡ñ¡®)O›^ ÿ§ü‘°ú8‡ R‹ª‹HéàÞå¨çHL6‰¤}-ûAõköSvÈv³2—©J1dU‹‚ÃU:^Cw ²å1ƒöÉ¢ŽL‚q8lXO$²cà°$–ÌábŽœž¨X!®Ç€¹}îå>ïŠ?÷PW-ï ±bÞW­Äçå(Í–úxŸ/ÑaJ•îáIõͯ<Ön% ô4GæQâ6øÒ¢K#•k3§MãÆÌî÷rh±Ù]O­·†±T„wW™ìViÙíœ3üÒ¬­˜ô)‹\ÍK ª”Ôt1“ã äª8°•_Ñë“äƒÌZ~¾í$Ùýá¹È.daü›®ÊǧÞnÈ]5ûÔ¸²Ëf{ÕÜ4WÍ•XÙÇ,lè¼Ò"r_'´ }=„\šv>.táó¬Vé4™š"è5ÏÆSËeîÄ¡\fƒÃ;àðuÞ‹Ì5:Çó ½Í»-šÝsÈß꣜AˆhÐ7Ë?NDÍqè!°Ó˜7ƒæ~?+³·F6ìîñ‰…Ï~êì.Î:2UìÝï¢s¾ÍeööËW²(<Í3×ÙǼÃí^o|xæAÚšù}ÕzÑuö3ñ€ ,IÏóìž9(‹~ÏB8¯b/ÒŽk+ ”Eññ¨üz4˜¦³pö×ëÅxÍÆÏuÊ¢ô|d>ˆÏËÏB:¯j/Úë.wìïî©N‚ç@ûirøt‡?üU{Ñްц3¿²(>Þ”ÀØ_«_¯ú†abåkŠOæŒ÷¹F»®ZLŽªøÇkÍ›íj?³Çž°BJç¿M‘°“ Úzi6L,±‰õ†®ßh³OL¯»–du˜Aó’Û«9ÎMî`^²9`rÉö´?LFá+!¶Å‡óaCSê=`ô½SëeøÈÕü=’«Ó¿Œ¿ ¹rÎ^}ßäÚí¿ÿ&Äòî\|ïÄz™ô¾ ±¼ÆüïXOÆß„X^Ûó÷N¬ÃoC+¯ô{§ÕöðÛŒB¯Ø÷N¬ýD}zÝìRà–èuôíèõ»Ôå¿¥Ö~—züḕnH¿Kí]ÈöÛ¥ÒïRiÚŸÜ67ý.õuA'¡…Þ²pú]*ë‚Rå†ÞMRêw©©ïýv»ïw©¢Ä·L¥ß§n>¹]"ý.òç·L¤ß¥¾?‰o•Jë¿K üùmSéw©‚“ÅàvUõߥ~ô-(õ»TÄaÇïv‡ÞïR Ç­¾Û¥ÓïRÇ=¾Û¥ÓïR ßí¿ï÷ÊÌy7) ~—ªøËävíNë¦..ýÛ;Ê™Q<{2*Ú4è %»'*òs½™Š õy’NÚÃ.…ˆ„ÍeÔ«PH7ÑK OH¨Ý=M ñüÝh7ΈQ¯B ÝDo¬¹bœ(OŠdšif:Kæc AÇ”qoõ¸–•!Ð8Ö $km(©A$ß仢ÿ ƒèAsõ†ZÃDc&…Ì64Œý#È», «uúÓ%Pù¢ð©ÀÜ!Áð5ÆŠè“_¯ÿ~¯¾žéø—0j®•¥Aõ¨ÇVÃ2ÕHP¢?ÏÚ04 Ó’ Í©pCœRgP‰ð´ÂŠ<é¯Ó7vßÀ~A•°Êžð°5tÃÓ§XÅ%4 ŒÈ(kc5c¿ Cj+>¬ŸàÅ™ÝJõ¼¼çˆњÅgÃħBP®Ç¹¦xOÇeÚiv›ÁÓUf€™Õ4/©- ¼q¤;ÃÜÌÍØÊšj,gÔ6—ç¶ÅŽ+ÊÃl‹ßBWÂÈç¦h™\i2òHE#¤3fº™ËAÍ¢ž%üaÿ9<æß¦Ñ(Ž¥?]ÌÞt9_ËÏVLèê Ôgk)ócêå>¯ÂŠé2êуlrf-›^tíö‹;µÔfÝd«h_ûc3»ð.Ðw’ÎŒ^ixš_÷±t•¾Ê¥œ·Ÿ¼º¦Èßǽ]O`X,¹_±óŠ2Æ.Ê銬·†ýÊ]U1v¡? 1J]ohWì\—[Ô8ØsKðµ¢¢…7³yµëï²÷2vµ¹Âñz£ñÎéXÀ ÛƒANÄÝZέÉ¿¼¥CârW ö*Š–;7—•¹ß¼VŽýÂéðÝ0ù0ôɸå9•Ôæ²w…’•’G3ß¼Àßh-šûÙš„ܽ¤ë ¼ÂΩ¤M•í búÓoÜÊ´¡Zž~ òéPÓlû^F©Îe h[^À[ú±‘ŠÙ):·Þ¼ý‚q¡¨` s ÜbúÔ!’tà6O• qg¯{—lÝÎ JSƒ¼ÉÒâùRx±Eas\±<(-Skæü:ƒã@RÁ”ç£Âòu®IyÆ(è?Ox×Ζü×É›ìh Š%Fþó¬ DeX3ô›·æ@~ãÅàí½›¹JP•fù í]½ÕœÀz“•¨wY³6“Ž>›bi:ZuÙD-I¿Ø×rè•<íNǯ‡ö´åOGç']ï×ÛdN? %¨{–ùéí?3œ^j2[o`93ßÙda¥}]þ´IiÕ\‚‚%±ÏãϜ͢*“©_Z—ås¯!ôÒERÖ ò¾ñVö¶Á ”&:dÖéšü˜þÅ«ú?¶ÙvÎ&û;!çj‚¯®Ñ|ûÕ Ù“ZcÉQX|å¼w —¾Ô¤rW5½V€o1ÿå›™“’Ëõ8yËw7»cž*K „ëÍŽMïn]!5O2-0UziäåäB6©ê“˜Ïß ëÐiÖͳ¶HþNð®èYM?ÎLc©^Íx>Zf-Ïw£»j7`“¬ºï·]ëscÁlŒ X 4ʸg)ï':Ò€½e5fsÓ¨Õ»¤ÿ’{S¾®ïš¢ò;ÃÏÞeö÷ÇÆNk`GgRÙ$¢[õKQ½¬UûžxK’L.Ëà/úc%Á—ò¹Ks³w×e^Ž^˶êcõ°@÷ëì-[n—7¸6½+îogpõ‘£ˆ}‹‡ý|þD…]ão[iÓr[¿5gŽ:ËæjjÙ Z³¬·UÇoÚü‹[Gó/PMΨ±yk6µç´»6½¦Œo¡úfåzèh®>Ù²|ƒz«×ÊPjºÉ诮B1k…}í¨jHöÓJÚÜÌ䘋¾¹íöÓØk™ø.Mº¶~zûÆíF®îvm;m3ǤðÚ ú!Ï$áM[þèßÀ˜èÐÇ8“,׳¶ÊhÓGŠ$É3‡¬®Ãàà#”%ôñч¡f5ÞÅ){ìÉãÖl9·òý|¨|ïñqVsj9®KYÑþœô½ÂÁr5ð×ïï/çÈÖ΋í#>,7ˆúÎ…÷ž>uý~ÔWmÔ_ñAz.@>÷èAòÇÉØëªgaŸ‡‚'ÔCû€‹Âӵǽƽí½#ׯÜW¹k'pÂþ¡r¸ÇÇd˜ýdx>qý~Ô0Ïö·¹Õô|ƒ ólD³Éž‡‚'2Àîáë§û,©äË ¶`7™ œg6! ¯}³åD;n??Øcq%_nràöχ~}ʹ¹Xø[áÞoüúÀ‚ ^sZRhÎiÉëaZ®-Ÿxƒ 5=—ùÚ—÷zMf¤$¾ò’tOj6Ü„k2°4.[;s”5kåR+osóë³aí?|ê§ô°åÔ=‰ÎG“­ƒÃ¡µ\Æ—§¸ì6î„÷4×»²ê\Ÿm’s°OÙp¯þ=¥ƒ:ضԜ®¬•îËò«Ðköåñ¡ÐE¡ ß¾;³gæo»;ó!äÊç¨åÏãÜDçMùö}ìõ7Ó£È^"|wôîDçA.͇bµÕÞõY±gÓη61éæ5fç±kfùèu…¯NÌŠ®MLÕŽùhZnÉêÞ½}Ü9z½£–.ô2f“7o> rmÕÒ½rëÎa‹ W÷j(ežoó³hÎF=¯j¯þ;#‹²ÒI™£Œ4}ÈÙIŸ¿íît✂ÌdòQçq–=³H{ZSD¶ãä ²ÔU ¸¸„ÈÂgÕ|Észäu:eéiž·ŒÏdF·Xç «tÍêrFy9Þ{ÙÞ9Ü·á ý%{få$¥. ÅïŸáOÎ?+9Ÿ[Z–ÃZîaÂ<Õ#É=*»nmb^siîï«ì ¯\_ \úz,ÿ÷[îq´™[_žýŸ›ë(†jÏ v'ÎFö¶½,ß*@a×êé|âÔe‘œÚõü½1ƒ NçåØãý7 »L˜áÊŒ Pá”3Éןoï¡{7O¬yös2gR4HrN Í$Wv¦±Iã ³á%CŒo®If ˆ S¢~ÎL“Œý•{ç™ÂÉŸfftŠwùä^AÍŸÞÈŽŒOÎ×y6¢ ä¥Ãâþœ>ºZö½k´ÄO_¿ÏÐÍ2ýµç“œ†Uj³8höh(ìsöÝÜ#ÃëdÓÓ}Ö3ÐîeX¥w=FÏpHhVWô†®ešdËàå_ÃθýÝGEë?5šx?E ˜ Ö­åz䨡Cön|–. Ê$^|þ±iP§^¯?‘vq;øªÎQž\¹¤òª»þKá¥@ɆQ¯x匦x(äEãU4NãÎ8Ž—ôòÏ×2k£¿\,÷æŒ;Û+¬yÜÆÏ? B~#/‚®¿‘³–v뎚¿÷÷ÎÞ¯ åË|Û¾!Aô)ú–# ¿È³îCG ±0à›BåË ¶‚ ÎlE>9­p´âí×CYçñÏiÀ›‰¿¿~?9jáÑÞóö±è6VDøužQŸÓ†9³ŸøWëŽ_ ̼»{ÏŒyÞn°5äÌÆ!’ÃUl4/¥ÎÚšzXËóÝiZÆ««v¯¾Þ9|ùr[Y%ày.ƒˆw޳”u^Í^´ýR÷‡}Óºd¿ŠÒNu9‰óO±A^`Mõv)¬½/ž.öEÔñNû3¨s’WE¾þéiw-›æ¶g¶.šËW>Bë -·EÙÜ^}¤€ôæöUò{••ÛÚ¼rº947,гu[ˆÌ·wå¿uêGƒþ¿cb<ù¬¹N&Ìd¹*Ö2èVÕë\²Ð üª“-Û¸ºø´mÜ|‰b©äK¶öÚ³%ݬ¸ó>@ùí™bÏ2(4 VÐÿônýߘt÷P<ÉûÓ˜k¬Ð :%W6æ•ñ †™½4§œônòÛœÎËü ÅÂt#K³ëírnxƒ7&X3d÷lÍåoVR—üÎT7Cì–"°Oúúhë¿:älªxÒàþ‹lªÄÀ÷ež…Š1ï…˜¾y–v¡ù"Z}—Î ½NšIœ›žþ[¢5mûãØvçËýdv–ó)Ûen†y4FŸ‡¹Uø¨Ùò³ÚœØûéë]ÓÌGß“"$í–šUÝ(éE¹@þmðÜË/ákÑh4¸zE€C®)¿;fö‡ãœÔ÷.iäøÈÞŸ®ÆY[ä|ßSÕ3»”àåd˜c?½«£ªt<ÉE¬hÛw>æ1‹ÏæÜT½|»RÀ·sÛ»¤EãË ©}‰bIåK–øx?ͳ¤B@}€}´Zµh•h­S?Ù¼K§*d;™Mž x—9k¸Ó#\ªúYÓKëÙͳ2}ë|§ýrï˜MÈø<Ä e#.cí†èm”u' ¾~à?‡0Uýv9j&=I2ú[/Ì¢eª¥òZâ·ñø¯¤Î°þ‰f122›0ÅÃÇ'2±ZÛmýÛþ{¥+¶¸2ƒe<ŠjÕ)6/')RÞ8-ý÷Z{½h´G €ÇëŒípu3V ™2ž7ÕÆ\¾2N× |ýñÏ’ÓÀݼaã迌.³#W=ÎÝcO WÛG{ÅçGKÛ¼,¹OÌ7Š H]Ò:`QÍÂÅjy+zBõ<=ÚÞÙË33•Á¼`ÁV°h¹qúÕ¶Çãç‚‚Ep±ñÏ&îÌõ°E:ï|ûØK'Cï|ï˜ZŽoæW6STuÞ¼v§Ä·Ö«%äÅï•ÿŸM‡ÝY”ö7AèIcÚãš>[0 <ºŒEåàš‡zB&e¶»òFGe~;ÝæñKÏë6½•Ñ‹‡“9ðc^7ýŽ$W™^Ò!.A+:ýó±qÕø7ÖË÷×6fèPTBàjgvEÈœ‹|o¼ã‹<ØÃö.«£Ò#²Ž‰Jÿ¬iOÔ¹ì}•ÕNáÔXxG‡µÁ_Òaõñ£yW‰]”›×%óˆWfÅ"Me-òq ­¦ð䢋sžÁ4Ïxx³3•”LŠÕFßÇyu”Ör6„ÑêŒ7jüw» œÊ\]«$Þ,õˬ(G¼­g±<@#ôN1UÈ:k~i-{ž·¤~—ÝR›Ù/åÀ›í$Ïjõëhß§ šÙ'5¼Š¾[Ö÷n¶Ÿ½ûkß‘AÒ»gõUm‘׿s£µìYò–ÔŠÊïÑåìZ]c¯­p*öâP¬ Y”,@Ö¤?T\kÙ³½IMÈÛ~/ [Ry‹k>²çê?7Iñ¹µŸïЇµ$÷bg+MIƒ&y”œky# ÏwÕµ]QN͹Ɏñ,^¿Ž’ó}‰—ýP[øV¦¬ì[ÿíæÆic<Ç›9Ò[Ífhzn‡9LjW,‡(­þd—Ÿ!ÅŸPº•(Äa¿šßÅœ:Â~÷›¤ÂÚ>ÂguÞXÕ›çpŽ¢êo 7ÄiŠá±%ó€C9 dòŒj½¡‘jäð2”M{ÿüHfx&s½õM?u¬£æ9847ÍrN$æ;ׯXþNäÊjjù/Ͼ±3 nkÖtætuÌÒ>Wãëż)(—²zä‰)ïú«' 㹡´‰7¨¨ãÒHSë0#MI 3Ÿ)2J‹;€çÀXhNæ 6[ ç¾8pÚ£¿Û× »Íñϫޘ:´–9,ïõžÌí”Lª‘?£´¹dvÞn‚5"Êß8•íM5"ªô¤ÙM ºàéE­j8ÈTë^ƒ"ç;ï¹µ¯´Éåѳ–a©]¬Õ9v±ZÍ¢í¥ògšã§Öüx³Zþ+ {ºCzFWœdϹ×üK9CX¨À!–œÖ©Æñt+}ÎòÌí]³/=å܆õªôf²Q¼é¿ŠºÜ¶y×ÌêÞ—IOönÍ—jµK¥Î¹èþæ£ÕßÂ9†nQ* _ÿ½ÛÝär”L‡½ãI4‰/…”2)Ôç™ä¢Nw©_s“0çzâLôÀP×ÇŽÖ˜Œœþ{¦ókO¡Oãxeà?6]Ä ¢@Ô†F‘¯•ÍTù½ XoÞV,{šô®D¹L‡øƒhZÖ?ÕsûÖÏGÞù×á#W;®9 “Éï‰ƒï† µ¥Ç¥ðï‹7½f’ç5kž3åÝJOÓÉ8rGä}F®ð YÓ’ù6‚%δ´¬«îõøAËívÇZÞ1ßä|QúEÞ÷›"_^3©vMÌýå·BÌAד]X+ϽEâÊ9ÑGñœóƹQ‘ç#|ÏçB~Ê&} ßÏ\޳õûÈwSD­–g—8o_^ü³OßTC+]@‘ßP½anÞÚQÜÇn¶‰Wžg ÙlÏ–îœîùÄ™E›Z9âxi“çApM²Ìï œ‹¾XËÜ7=L‡Œ\|*°Û¬éb¶oêÊWö þ ÓwUkà5»£‡ß@OT8wzâØ”€zO_ò Ϲåz"å6üw¿þäè£X#‹ÔW _×ÚߣÔÍE§CΓ3½ZWVoEÿC»hž!p=–°†P±{C†à´ÞuH#mæºÐcTÉráŒb÷ÝpfGí*‡`ÎåJv²·ß~uÜ>ž-( çC«êäì¡R³ƒgB¥OæµÔ{ƒA”ÆéÛ†q•õ›· Àî­fsš¼óIü%xrE‚04Ú8ÞæÝ]=»wlû½V¼ª šiøó%‚{€/wœ}ßÔtÍ÷UíÜz‹úö©k¥»×ççñÇf^Ã*ýrüÿØÊîs É#¤ãG’K5¿ÉZÓË'aÅýcÚ=¨ïä¶ØÏUÚea&sä9®ŒP+/IJ/\]VÓÿ¹|¶àc§R\V©(³dE¾–¿YŒL¹f1p~.ÙuÊ@ïLMåÙÚ ü\™Ÿç ${½\c«Þ¿'_¼K=‡uvp†µ¼ÝôÌ6«¯#,·ÔÂ-õ*Û¬«Þu'ŠžýJa§ýGtƒÝ¤kv‚—>þ.ðîtßÕrœPæÙÿð4ž…;HHY„¿Ÿ¢Þ=ßòÆöZ6ý?‚Á=¶ýëõL.üÝR÷+ þÛtâ)ÑE¾5UºâZ®5«ÞÍ×Ûßoo\shdú£âÈ`ËH¹u4{zYžÚý˃øú¼…µ”glÉ ™£,fʧćXkÄNqÔOEE—ƒ«môP ú+[”°{Ÿô{&j?¶wïá—ø#vøx6 "<Ÿ&TFñq˜°[_û“à#äøÈµBããÝx„UâÝ—mØ<FƒÚ‚hae¥ƒi¡.*BÔà?ÁÓîd:ŽƒNò.¦Áf°sÒ9üëÞÁq°%¿b°Ü }( Làx7šDK”FßÃ{QãÞi=˜‘ßî¦ÖΦÃ`ïð™Xë5£–èAù+ B2÷K'Xn„5ãƒMĪ#äÃýÃJ°›¥aï½lW‡ß* Ÿ¬ð•€¯”~TøjyÌñ$Z%àkå1¯|½<æ¸9V øFyÌ«Tøîa§äÇÆÐË—ÛÕÆPùú·×{ÇvÕ1Z~¾Ú;ÚÙ;¨Fšfù1ºýòU5ÐåGèÓí£j ËÏN{·6ËÏÝöÏíªÐËÐWû¯«Á.?>_¶ª/?>_lWdÂòôéöÁójsPùñ‰áÀ«/?8Û;Õ@—˜»{A—˜ÛGG‡¿T^~h¶wƒ°ß¨;od H} ôÞß^oïWìËjsž*Ïyª(?Hÿ~x4Oå‡êËÃÝ9*X©8^ç©¢ü¨~ž Êݹ:a¥Â>˜«*è¿Ç/ÚÏ:óÔQA ž»Ž Úp§Ú<¾R~0?¯ ºü Þ¯6Ñ®”½Ï«A^-?l÷þV rùÑzPt•qZ r¥Z tÕ±Y zÕQY zùñ(”šƒ×/+*«yƒRB³•„£½íý9êÈ ήä¸sÔ•µZyãTB³«ØÙ9<8îT¬b-oÀJhŽ>õ÷ÎÞQµ…ëZùq»ýºsX vù{ÜÙî´«éÇkLK{ÏÛÇ‚4Õà—Á²g«/?€>Ü´Ù¯69­•Âíj–εò3jçEE{ÞZù)uoÿ¸"EÊOªÏ*N#ëågÕÝj#h½‚í÷—vgçE5èåÇçÎvEr¯—»{϶_WT‘ÖËÎ_^T<ëf×½ÎëŠw½üÐ|*&«¿V^~t ¡Õë׊¤)?BŸVœ.Ö+€_T4EnT¢¯ŸVd˜òÃtU™*°ËÒgû‡MzåGi»¢Éz£‚|XÑZ¸Q~€¿8<ªˆxùñùìh{¶ ¶÷«ÕP~o ù²]qeºQ~ MõõNEú”¦¯ªî£<*?N_·ŸìU[–=ª0¡Î½üX…”j°ËÕãöÿ«ºý¨ÂVÍ?^í‰)»øòöõÁöQµ½ÔG嬎./£ñC¡üì¾Ü»™:–Åo}uUüm­6›+ðweucÓá·º¾ñ‘¾Òÿ[m­ýa¹¹Þ\YýC°|3Õÿ¦é$Áþ5îǃü|éd ön¥Ûüu.â`4î»ýQ4Îúƒ8¸ˆÇqÐOƒnoé||¹TëŸ ö‚=‰Ï½xÜ÷‚³qrô'Áû~tG#Ì•^$ÓA\ƒÓ8ˆ{ýIÜ[ªÕž%ã`g³4— „ †1J¦“à=ˆí»¯¶Ž÷jAk)x8èŸ>h^I$‚ŸÄ‚ ì”éá”…Ñ#É$Þ ¼Z Ò$˜\D“ — ïM‚óB+ 'ãdô‡gIÆKçKÁ!lb°H`ë¢-ÿùã¿»4ˆ?.¥—#¢ô¯pü·ZëkË-cü‹|ÍååæÝø¿FØ‚‘¹|6†EÞ~p'°2à*²`†Î6,Ý(ÓE$dʹʲ$Éù8­‹\ñð‘†zuÕŽ„\Ø ÒþyML"ÃÉ8Ž.k àyùîßDư/dÀƒŸà³¨´.UNQ*o'þ8i.Ñ»xè)«[Hˆ‚.à >†;¢MK]ñOp_&׃+U‰Q’Ze^êÛ@¨ƒÄÿ9ž’“§úz?°ÐÍ¢œqrf8M’}Déä—(=ØÏ~—Dz‹Cu›òb1„ò}>¦ïõj ÆçWªø«q>*=¡Vý'rÉîùd=°“Žž‘§áú=ñ¡‘î‚ð~äz|¸èw/$Ô4HÆýóþ0³ 2á}šœ&b‚K£KUùý:Á£¾€ô®úÇH2HŠ„Ôˆ~©ÕIÜht/Šv‹†ã³`\kk  “Bj»‚"úæ8ÏA¬_69õOAS`z%õ%ĺ{•ÀpiAc/„0N§çü-šôOûƒþä ÚBõ¨ÁЇ±s b´]뇌ôÝ"ú^¾k3ï×è^}¸t´+:Å8†:âm‹…óx¸HÇñºÓá»ãþ¿áËêòãuJÀz?Ç]èàCP›ýi{ ¡õö¬ìO3©"§“z*¨ýÎJéFC’fbô>êÀµ®ô@ÿoø&ÏŠQHTÕùÓl’è7é½ÐvήÜÔî Ic«®O+ö“Ý8íÊÜš˜_Áâbhö‡@xÙqŸd×Àˆé,™yÈ«[Ì fÕ­ ‰µi6Ýãb«3æÄPÀ†”õpµÀ|5nµ\ëY'JÐÐl‚ƒ*P#XZZú£#ìFiÌã^tjÑq8Xˆ  '÷ª:êú™Ø-ì6°Ô=ì‹]}0Ú«8Ûhø½Å‹¤öŠÿÔ”)H2¾¨öˇ?q”ɰ@ÿqñ×á"ÈœaÐ âhÓ²d “\¡ÊZ7˜ƒCŒxÕ@‘ûõº¦&à¦è‰”dê‰M¢¦rº¤¦w™_ÍâÈìÄŧ¯Ÿo²Š²D“I|9‚ g’hRö‡,¥<뤋ö ‡ÆÙa ³»3b¸×w‘óðÌDz˜f-Ýéœdô;'ú=ªùùê ”áÉI ñ@E‘ÚŒ-ñ_û Ýioï;ªÚk0™ècEЯ55²Pɬ¼“Œ®èŒ~Ø­Ãuʂӫ`Ú……['î^ “ArÞSœÍÂû5¡ûÀ¢ô, ’ DŽãÑ êRà[1{¸4áUæ¹X†ŠYq áY‚pûà¸]m /0éw§»Fð!–+¼€Bø”9˜@£Ó¤ Þýkñ ~¾³D]8<“ þé n=³ÍñóvÐí pc±Ä]ÈŠµòhœÀÊ –Ͱî<°Áƒ~4œ,Õ°yö1Ò…­#2,oå‰ÑPul)¤| ‘¥ÎEéÌ fÇã_¢1«ù$7Ò}ø´Ç?M… „Yüß¾¨£ñ¹€|ÈïÇïãéD Ú4²‘Òd:îÆD`38æç%J½ŒF û€ÌxçÁ¦Te|x4ûˆ$ä;³"‚”(ÆDw*úW|‘Åhå¿®ãHlòÃInjµ«Ä9$&*Ú“q†$*B¸i8Î&KbÌ˯dƒì å'ìÅgº)(°0ETô<‰JÐÄìBR”Éþ'™½{1ú4wcå“1/JDzRSQÀsYâ ’^¬² -L,—ĘëIŸSæçQQ‹˜Ù67áõÍÛ %Ä/eù µP8u“a7šp:æ½èA9Ñ03M‚E¾›,H âóJ̃Od?’ÀųØb É#²…TýÂVpQ«ñ*ÏÃ…ŠI²×Š!g5˜¿l#HAÔÈçiäµÅP½Œ>†?…ÿÔj¬ ¼S†ªG² ìb^úñùi™æœð1fÉz`nà$¾(Và Iö˜©ƒ:*/æD„!®%£K6Ý;|€N[$ÏâQ¯GÝ!ºQ¶»‘nòêx+ÐRLæxöN"ö¸ŒÞÅ‚Ê+:Pöz8Žß%꼨1ÁâEÛëÝ‹ø£ +Œ“¨qÊý´É$Ù I÷“œºó~²” Õž°/: Î&bb ó¼Øû{=‚0ùÿ³÷îmãÆÂèùÕú+P÷v#9²#R/?Öi³‰·Íw²É6öžö\¯«KK”ÍX‘òc³þþö‹< )Y2óX¢ÝXƒÁc`0b[±õtªG¿ùíÇªÞøU(~3œùs˜˜=œ!Àí°Þfí },¯JùUKªYPØwtð#8R‘Ž ²0e€Àˆ-j `8R¥)¸­¶tèÔR'ñ–©q©@%áÌ¥.`ldªd¸3ÐÕ×Ü úµKפ|4ƒ˜-E±5)1ZõžÛívO6ªh¥`fPÆ)V˧õB½ic]R¾¡âÍÿÑ΀‰Ìý8w'}wS NZØëÉÖ›þ¨zdìˆÝîÔpxÂ0³G˜öšã0Šyc½ë‡#§BÂÃÏ»—'_Ùà‰dñÑóðqÃÛ}-ãÆï‡Ž˜ŒáB:Z^½üÊF k‹÷®3z;?´= ;kЍî¬ò3¼ÐKÖž®MF”àÆNã!u†Ü²Ò„!AuàÜé_tyséÐ:uYõÑ-Ÿ3êÁ¸§ÊÌN°2´%„5CŸÕrcó×_M ¥[‹Áß <ÇÈ]=rˆ‘–­ÇNXlC±Ø¦bìžyÍ@­¸;/ÞਗÒjYµ4_¨>ϼ~8ºƒ¶p®hû×ŢɟÐXÖø¹®¿~ýküú+ýo“þ÷„­¼Ï©ºâOrÀÒ4‡;â]L@OÀ®ªãQá‡9Uæ´íq”­Ç`d€Ä£5€ƒº€R Ú;H.X–ûP"_’ímºôrÙñ߀/ØêÐÃÞ/÷ÌÀ•}LÇÕ›Õb±°¨ºàAk¾~{òú„–qã…—dÔQòRË%ŽãÙi˜íÙ©±¥_%kÙ=vÂþ¥X\Òˆ·ïz?½8yùŠèö»;ü™o?ìÈ£‡y”؈0ÏÖ?,õ0™O”»ý<±”ß‘+OF+ÛëÆŸÀqww!žüЩãϧ•3–À¤Móp+@ݦ}­á¢>ÚªI†5øºØpÀýÿýߎþþú-ÁÔ*Bæ j¯‚7v”]þf¶w¸‘@Ì ç½þ„i®Ð² Œ@– ·0£†ƒOV$-#„~ aØ£¶°•ÓÂUs}:'î H^…@¤"VºZ¦½d™tˆ§¡j>|¡¤¼Ì ³µ"n®e”Ð^_CtH¬º xº¹yv@´-þCÑ™¢RÇÕ鮩Áø–)»Z5loÖµ}Y¤ð©§f÷Ôdî3‹6Yn Ëg ˜$©t¼Ê{K‰Ë‡Š4:ƒ‹-ëhÇÚ$sÒDNžT ™c=TÐê '8ÚAzYyn=ý­× 4ÂñSUnAV©âÅFO••V›Ø[äßµm«VgÈÿ¤Š9­Nˆ7ãÒ˜£ÕªÇO udù9­»œÁÓÃO𥫗þ¥Û¿Â–Ѥ|:…ËêgF›•æ*ÛÑÞ‡S,S%’¼‰#:!É@’7 #õ=IÏG«Ø $¹ (vÿƒ ²®–\¨ØûE»‰†²Äˆ`6€Uo2U, 5–öК€ëƒç›1fGÓµ…ÊÁ1¦mÝ÷©è”òãJ™ÿäýðÊÃÂdé‚“œB‚D>P÷{JkС´e‹R¥xœ [ KåéÃÑ™dúÌ]âE›e9wwc¹lï­k '–èºN#»ëì½Å».ƒÜ´®Ë[FGÖ­ž'™£³õŒþÏïËu]×TÖƒºî4Se–gâïSÑ)åígÈ Ë4•›ŽVAáÏLP#@!û7{œw9ÂS«ú·õ´ÓšHŒËêÿo½£ÆŒN)¯—5s­Üø1A³ù@Þo©òo5Ò%+Mþån,–R§”:¥ÔÑЕRgE©“{Bd(L‹jÝíV’5+Ì“š(ZmM s+»ë:Öâ]—AnJ×åžàD–é­ž¿\«·M[jõ´õ6(Ù­Þî,(¥V_†wìH1 ‚ÌÖ[>mÐäí¯DÖ9ƒ&÷”x¹AÓ2‰… štVmg÷T«µ8«f›Öê‹îôµ2Ö¶¹{ê‘aE’\‚%¥ìÚ´Ìô®ËÙëê,1Af›6A®¹ÁÚíÇo°nŽTj/! Í¥(d|Ÿ) ;+bè¿ÌÖ[>­¿V†B”kz]ºIGÒ]I'C«ê®[«Z›¨þŸÌõAf9¦qjF§”÷Sîj)·LS¹éh•²ßä,*i_çȸìéI#îÁÕJÉâæ5P¹…qêÆë3ftJy£/º5æiÀŠ”-JUŠíæš–"§9¥ÈQЕ"gE‘³èúªcÒ’u/Ö¦é'xY¶zަßYFÓ7—¢ÑÈš9š~&)&r²J[ h¡{Z‹øPÎ#1Î` ö_KW/NUƒ­Í,'î_êa‘É4‘˜RéL 1ª…é‘]“R`Z‡¬ÍFa=²Úí%;ÄŒI)êi&ç·H›' +Çà]óYÁ77Aæ\/?e­ùàz!2°Û×8³¥G™ œsúè3ð0[á_Ý÷©è”òÜ/º5¾P}$×nþ‹ÑGv¿°¹!ž‡Î k¶^ZߦOb·dµ¼Ýr“ÀC6}r'%æ€EÊ7Ñ^¡c' P¡…òðZ6 $¡KWO™âr,ŸsI‰‹Íg¤£Í›^Õ†ÏTŠÚù3îQJ*sl+}¯+GXVpä*‰íäåË4•›Ž6oVë£›ÂÆÌjêÒk·øssPúnñj£iÅÝâ|ÇC¥®Rê**-¥®Rê*_´¤-uRê*¥®òíé*» fýî®[á1•%*¼N‹œ¬rLcp9yešÊ]EÎnž EórkÙêäZä¬Êå(\Rn-;fV“[Ÿ½5RåÖŠ”-JUšÜZ·àÚDNbpËËôY UæR2^dŽª¼Ù0oTÅÉI/-Ͼg­d™HË+u 9–@Ÿjï³öZ­Cìf.1V¦vO/Mm=ã*î‹h½UgêÉæZ倹… §P9UÚCõãús­µx¼9r5¦ZuŽüÂl¸“D²<Ä6cZÔ”4·8S‘Y3ÏÎÈrD¢ïa6f þ|p˜1åŠöG®£YX,Q背v×mœ°6õD¬fldF·0ßåí,¯Ï„{‘ý÷…÷Þóm $q¶Ãû,æ}ëî“/ßø.±cºÊâ-n.eáÍþÕ,ßVo¤/Ô&o·»èVe†?’Ýu_Â1•%*¼Î­Ê¬rLcp[•yešÊ]ÓVeÞH³ “—­NþVåêT.Gá’[•ËŽ™·*?wk¤/ÃV£lQªÒäÖš]—"§9¥Èù2Zã 9ݵ]_X·Èɱ@[vøäZ í®´øÉ>qrÒK[Þ0mÑa¢¡`ôŤ¢$téê)†i«’²Þ¥ê²c#½´åN“V³íŒåN“rÜá=º`Î1X[VάÃ`í!ªÍz Övó¼5fV3Xûc©6Ÿ›ƒÒU›ÕFÓŠªMþ³ÁïO¥qý×b\Ÿ8¡ê暯‡d¡:å* ËÚô?®µúÒ¦$_—©¶C²ÕËW3TNßý_¥[—¶[ùßÇ‘néh•²ÿ«P})Cé˾p½ÞÑŒ.KeÑZãs3ÖmªBµZ?­z`á·ù2ž´Ú]Ôwx–×÷5?‹Õ\›EÂ#”6Ž3Ë1c3:¥¼­Ì…AÞÓ|K/E>P—ê|7ïi¾%އ3¨JÇ{ ?Í–á£qom–<ë1™Kè·¢­÷¤ÌX¯)SkͦLöÚ–W‰5Æ„™åÄG±q‰±ÐÒB6ÞS†KN&Ë‘¿ ž‘¶(Yi\¸è}²f†Sù½¼ûdI+ýýÞ¢Ï×43æ¤æšRšÿhÐ^ŽžÓÌz4(Î%¹¯3$¼)j¤ä¬2I1 ÇÌÖ‹“Ô¥¾ñ³—sy)‡²E©Ja’æ¢Ú’5¾}˜¹•5ß-úE3æªÙ]3“¬íÍ—z¶â¶ìqftYŠ¢6ærvt›K¾·ùÙ"#gG7‡²E©J›2ò†Ȧ7Å\³]Ÿmz}åAc0½ÕsLìîu:¹i2háwh²Z}áwh2Þu·‹’ÒÉxÇjäÑR°êžØG_ä²Hîf|\âT×v-%™R⓼Í1ÚŸ¹k‚‡\ 1ž,ZïhcœŽšZãBôïëèV3µ~Yo¯>jýRo-‡*ýŠÐÚnóäôÀ5°ÕXtýÑÉVcm'•¥@Ê*qÔ,R)¾f´è‚±“±`´_˜SëãF ùH^¤­ÆÚ–ªëi‚„€{óš‘äIÈe;¿Á“”¯ƒF…î-É»ëñ[ž0¼Xœ ¹E÷i²y÷ »ËÿE ÜüwHò»-IYÎÀí~i7 Ü/ì,,cºÈ×ïÔ{_Ø„™1*óŽ•JY¿NÖ¥ð5–TøRí$èŠjÉZšQåZâ-Þ¬ËÖu1Ø4Ž´ò8RN%Ûm{k{eé±ÙÚZ¸5—cëæšÝUv×v¨÷kšÅíµìÍâî2§z)Å,Êý Ô:ÑCë«’÷kj;娠d³2µ©Œ»èYt;ã˜Í²µpigmÙ¯Ù~¾i*ëAƒ?M,PŽi›Ñ)å}—)ú­£¼æÞ’§uËПynDGÓJ¤-JVê`^Ø:#cj®Ùدµ¶3ãŒvϱ¬h-qLšAoª>¾`³7â`ÑÔÿeÍüÉI&R¼Ö£Ò—íi³ÿš-ÜÖ8û/ЫÍjëœÔìE톳¶5¬EÛG¿öšß µMrëA=š!Kr ìÝ%ÿÓéMé»…Ïþ³ºn;6.šeŠ.©F¤ [NW~ÈÕß ´jáaîéWŽ"󀻿¹úûk¦ ×Õ‰\ŠÀ8qZë1cSŠ#_pSü9ueµ Y ’”6Õ¬ÙÀ°”5¥¬)eÍçoŠ/RÖ,z\gÔû’µÈ«¸Ô¹»{=™ÎÃ×VÿT…U˜šOmÂ_wöÊ휙¤˜åîΙ]<°±ÖuPÑÊÙºÈêÙ¥0þ’5ô›+ý85é…eÎq²ìSìE$hþ´’JŸqˆÓ˜cǾ¨G¨Å&¡TRS'£8¹vžõ‚ô*T¯©£â­`>0ÖiM¥+õYC+%ê²™;ÜW’ôÉR¿Ï/5onL¸¦á“« ϻ̷|?¯YÀçñx5šy×%—Ñ W®BœüÌ[;Í»?÷ò·,,ψV£*oûè|“]hÞÁI‚Âfzxl»þ‘[ËmèµLv² k¹™w”[+2]||¤–uã.Ñ k‘h²AWž?¦Ö úàâÇÓ«ˆ®Äihçð µÌ#Ÿ«=w¸)&r²J[ hS}Ÿ¯­±½î\¾‡¸Ö®^ñYÅÏÚJÙ·#W$mQ²ÒDÈšÍU¬µ9|¸YæIºG!ë{¹q¡6¢]]„,é91—Äõ‰eºú±EÈc¶ÒŠ"d “d¥‰Eíž­ ×vöš­O×'‡üe«ç,–œi¥ý‡öçÏ~@3W6¨þqB›ð•; vØ(¸Ã*¤Ú.ÓAØüÈ›îä>ê½}AWBA°qd• Ô48ÐëW±Ô W'BŸ–Òyïï/_nám±'óÉÀ}æ>Ù¾¦¿`½*EŸÖË¡óªl÷­šÚ ÎüBkˆ‘V60Fò…Ðß¼{‘9§bH%õ*ÊE\: Y/ÿñBÐE…¬Rþ[läO.¢ø7ïÞþ]tߥ?SrÿãÝûÙ³0¨=ûþ——'²g)èÝúú2×¾§tøÿ¼{-:;ð~s}¥yŽ_ÿ¿GïDÁDB;.J9G;NŽC:'MÔQxò‹¤Áö/Äÿz Ë–xsé©Íø¯¼¦­x¦DäÐ"(dÿ’Pžõ‚ôz[„®Hào¯G¤\ä2˜Œ À1×|5N‹ymÄÓÑ@£'dвj¨ BLÁÄF$WØ ¦nßzî¬Nž øA´}à‘ü§ÀCº·Ó™!ôÖ¶.hn5ÅP˜DW@YŠ"*&~X±bºŒm¢8#°yPŠû–ÔÅ%äÿ6eñÍyò¿ÓhÇä¿Ýj”ò¿ðùßûw´”ì§¹ ià÷ç¸hÆ“\oo㊿?ŸÍh˜î€ÍëÏ/Þ¼?::ú÷ ?žÁ¥ÿ«~Ú'cçŽL\šÇý8wF-šq6nì@¡OW£ô/]}Ã8]ÃìE…ß÷ù¬³N!ÓM1óL!LA3KQS ;üŒü/å?ì8íô¥ŒùO;Šü§ëD«Ùj7Jù_D€}}2y“pX­T*c8¬ÖÈ§ŠˆÝü‡;ùäÆŸ¿N6)Ðý7£ý”Aò¿„ÛóЭqßO„å÷¨(÷ †þïS}p­ƒ`ùþoÛ°ÿSöÿㇴþ‡¶!î¡‹>%äÌÿ´¯;qû?»SÎÿ…„¥×ìÐLèÇŽ7臷`j'yÁýs‘úÄ!tQÝ™pÈíç‹ÿV0ª¿ÕTôgb‹@¼T¥õhU­æ)5^û’…QĸÆÆØzau­ ü:÷&þÍéGìè{‡{ŽÃµ ×6Õ"ÚC¹µ:ýúBÄ›¨+î—ï~þßÇ'¸Þ&l½&t¨Ñ€öEkÊîSàŽyS0@Ñ0&È£¨ZˆR~EÀ¸LJ— íUfEØ'ôkgNcúñi¨`´i¨¤K‚qº0Ã0Sà_ú3Wäað}“‘G ËP¢IphT<Î1zD†ˆžãô е:ö&ªËr¨ÕMÏñzâ…zÇè9°·¿¥]Ö/7äÍÿ«[ÿçÍÿ÷êó¿ÕmuÛåü_DxÈþï/°CúÈÒÀÅ‘yy@Ð0C»³k0ˆŸO¼sª( üÙ¤N°S‰¾äy?ë<•À¬íOÝ ”RQtªc$tŽ ·\¢ØÞM¥zÀ™qþá—¡ÌpU´6ºc'üUÕ“¯kj10Ûð4 ¿À$ŸIÏ‘2K(÷†ÅÃ\D?HU^%ó&Ìêb`FPU†®ÎÐqÓ&ÅÏ@µ&·½=°è¢ÿ8ìŒüyP'Á¥? `ƒ›¶ê9m(rãÌ&´þÊlÃXű^¸y yéÂÞ—Ïé®380X&÷ŽGÔ`Øÿvtk;~Àý«Ñ)Ï‹Yýï~\Ïpöþ¯mÑÔøùoòËýß"ÂÒû¿Ñ¾íÑGØö«ní“£¾8>Ùªéû¶ €â®ûŽï^ž‹}„ñG“)?ÿü†¦Ð½óXü Œpô‚ab³¯žR~–ûÆêsä¨Ä›°¯oTá§Xã»ý,#(™;ìC$…3§·^AB·bƒfdJ'ÍhÕá_ªmW¯­úµ­SªÌâŽlþ:y ×o½ÉÅ>‘î æ;Óé‰ÎÆtA>…Ý`DX£½t¾~·„ƒwsºØ±d‰‘ª !³Èì$2¦FD>a;È¡J&è¢R¼ÁªC´*¤züÎû@n?³Ìu–^ƒÍrŽÿDâuüyœè„i¸ak`î‡BAR…M÷:üƒ®5…5 ;3°êì/”«§³ÒRó÷`Ðàõöøˆc„!—á&eÀÆ]¯á—-FR|¥Ž,8aUÑâëÐl°ˆÕn8²Ó`D{èúW˜#wr^rÄzŒÍ÷‰ñ~¹ûQÝ.â#^Ô‚Ó‡xUxÊýˆ•g(+è8bl>Š%Hž¹`£Òãu›ó}‚ZýçXD-ª'¹pCQº$Pþ ”n‚Â(½rÄé$!dMMTa±"œcΖ(ŽÝˆLý}v.W"8¥;wÉлe'v̶€ß~x6äG’‡ý‡÷þ•ýïŒÂYÙØ“?;ÞŒñˆ±·T^ˆNQ Ū÷ê½Z]´12Õ²—BE¡’ù dÈœUÌêÄFf 5<ž‰&ŠhŠ@Ë*)e5åŒ?1‘ Ç…<…¨X}7ûÀBUDܱ“< <`g:ýUçEV=Ådð˜à~Œ7ËÆ êwRYpRdñÉ:$ŠRØ.6´:[’Ì6…\à.Ö„Tô~¢ÜUç°)¸÷÷¬&¼%‰Œv^F3Ú˜¸49ÏT‘€úT‚acºq÷Ri¬¯€q–´!z‘+Ê„RF"L=Q8J@?¥á]佶ਊ w YZ|$¹å¡OŒO%²øš¬%üË=uªsTŠbrÂ.OÝøÑ¥œ@úÅêûT: Ü™¸‹µ¿‰òRW5âuISbª¶dkˆGÓe–@Piª¶ÓP3´‰Ñ°¡Ž„ˆ¹Ò…†"y##$ogËóÆØOýŠöb‘ *…édf˜0ª˜3DûÅ”·åù(pÕကµÄ9*19PO@ÚqHÁó;¡îÇ×ѹªJ‚^C 3ã 6ë|Häk" Õ@ÓŒ6t®ÕF¬ÞM±Éuè}¢(ñœU-2êÃçI‘*¥S_ñCQ"·É¢ì¼u CDIa£$ÚÁ£¦üÍ$>LpÞ*‚a:6SUßÉ£ÐTX&ãôùCmkÏZÆT=—óÖ4 ü••™l!9ž¹žÃå"îaú±ž¼ñ«rú)¼OØ ÌÎÉq\+J«!WúB3hæ9‹ ð´Á1qìxÍ^t­ÇØÔ(|Z•Ã_׿#e `Ú@À¹M̘A|Ê¥r8e‹¸ÈK­!ŠRÕ…ìŠF«""òæï…ÚŸðKêø÷Ò¤‘G M˜ Àøè‰bõlù«É©¦øê °-m ls`eÈÅt¼DŠ® åŒ?Ò32FeÚËelFÄ®¯A¹:©´«j¯ ;^´ãM¥(²¸¯°ØôäédÇdŒ^Õ£9°µj!iÔbC”ƒ 6Ï^'‹ÄÍ-¬z"*ÒErŠŒÐþݧkMl1ñK•L³únžFZ—É™—-©Þ»°Ÿ3˜*䆈ÃCR¥‰3± ;ÆÇ\l¬|²lupüÒ e *ü"Õ¯@•¥„Å+ˆK¤ý}ÌŽ‚‰ýäÄ-ÁP!DåŽ*jµz<•NÔ7A{Óv EŸêè¨pÖœ‰•©°þൺŒ–(L-G!¬À¢DÌš `azö½&äŠyêFt (Q6S—´"2õ*®­/²g íÊD¹QÌ#+ Ò@ å?Þæ†iV=ú½hnÕ ûCô§š€£WéØˆÿX>*"\¬ÊKôxd°†äцblF°^òœ<7”›UaÅ´M”¤D)Eñ’ª¬‹_â­!~+²³,r^CÏ¿…2´8Y¯lÕÀþÚ 2–ûh2¿K?*³©¦ÅØuæzëE+*Aâ…K?—m±ßª6M…1u ²(G~̶.!Ð!²v8u]JWÕùp<ËN'ÕÖŽ¬òâ¥MÞ8äÛ­äúCžÿG»kÇýÿ6»¥ÿÇBŠþ?B¼‚ÝÅ ™mÅ–þ- ¹˜:á~t-±óIš©FÂwGÂë…î }2sr’í¸£÷Û±j“£BÕgÇŠt'vD1Ð/î­#>ÓÞaÛl _ô⭺śý¦p˜ ‹¶¿†E´à–hË$žø=Ójd{m)aƒÝÔÒ7ĺBŽüGåîqý?Y­ö1ûßf»ôÿPHXÉþmt¹ðKxÚ l€…;wÍàöïÞ ÿÅ cŽÅþ@ã„­CºÅ0Úì¾<ÑMvùž7äÞZò­¦±¸}Aý>ÙÛPº% Cùö§û‘8ý>]ÀÑuÛÔ’~q‹ÎÄÐÚßV}hÃ_Å:3‚«F° «1C Du”‘¨^?®êS¨CÕ öÜ÷Gü˜~ˆWw0"Z…ÑØ[fp<nˆ+»ÈÀ§]¾¬è‡šåÛA £½³ÿñ½Aþ©1š!ÊÑhäM7¨‹& RyCªa)iÁî~ÙôKßgÈ&“.G-Ì¢¡~1›9wì  ‘Ëï}´|H?û¸8#ýÖ—®Á+¬óD2l5*Ø %éEíï2(ÅŠ…ó{wÈ,’”¶ÀÛ!i¸SL‘Ž‘}%NíóáX—ê$Rõëá8AH”ÊÇråÒ½ªÑfõ c&Å™]°Ë5TdïCÆß¼©ÀQ;@³æ¨\•ä*C`íëÊyý±cѦ÷Ù9mæ w¥taq¢:¸á¹¶†òƒ=ïEs=IJáö†=ÇÃÎŽpÒd3R¢9Т Šü4Æ=Äßà14{3%1‹8nø Öæ;êØ+BÚüo±;Ð{Q¥\µÊA&ºˆi@+ÆX.%ÑH0"TzŸNL¢JÿvGóîzî,}ëZ¼Íãuy–X!>ý0èâeÞØáú>,„ÆlßÛÇY¾Þ«ñgë( mÄÇiyyÕ…±ÈÁ­²«œQé0Jº‘¥<ò-L6ÓäjDÌ{Öv¡¡H¢+ Z#ó®’]ƒ ²f {ã;(]ãýKÔøõ¯ÞjJïÕX·ê-¨¦ëº@kŠÞ\¶ÿ nïˆÑ±ÝaúM²•Œ7ú´w²©S›9b#`¤ÔÖÖ˜h¶~̦ÚàVûØ<'ìmYÞB¨Ý鑪¹±=#$&Õ±Rc$)“>SÎaÍ#ÎJ67J·or)Sݤ©ôßÿÀl¸úì$U–Ú6kh0ÛÐ:™¹×´¢˜ê“€‹'RേM>ÐpC“tMF³øŒÞã¦Oøä£æzM9¬þ)‚ZýVë¯ §ôúOyýVë?]­þ?G5‰Ëdý§¢þ±\Ox6YÿŸà½r^ÿT.$Šœ#qA‡¶4)§Qj1`n#@´[‹¸Êc´'±2´ ~o‘þ²Y*ݘŽI)h`mªÝv.·z”ô )h^?&À\A‚MÏG8óû((ãGš‚«y4æaõSË{;»3¯OhïÓQ¿Øb㡈yø‚Ôdõi&8ÐŒåizåU[‡rÔŠ{•…gš0]r¥¹š¼¥åBH²×’©(äâQ²7zÒZóD‡¼jrd®Hå§’C˜Ô}>ßýÈgxU½¯¿y·‘4UžEÚš¢Çààö1¦Éøh_+&ß J{~Þ¤?c.ÌÀþôðIJÒ„®çÝUpÁ$†y%¸yæMÔ«æŒ}4ÏûÈMâûhŸ ´HÃ9˜†üçpU-àÎÙ4¸úäÃ|_;3ÙÝxá¥WFh!ð›½o š…ìï°tÙ«ì¾Ð™„jÜtæQÕ{ 9hä6e:xÌI¤ |—uÆ¥s o|@Å·YÅUDXÆ¢¶Ÿ'ãNégjÜV æ»Øw@Å;kˆØßüùFÖˆ ¹Áh°i5òÆÞ„6¨VûOPÅ{Þ@Àå|h€à?º€QöB7„*àQ Š(Ê»£€Œç6‚ßïÏguÚ‘Sº6¾Æ·Ê¥lBú  ¡¢ „î&¡s+:‹æ:âýÅ«˜ÛÄc8(WÃNsÎ<ä èüØ‘u– Ž&—[¤C©×Å” h[lm+-“‘U-y[kMJ´F,géÄÄÚ0¾úó8Ü\ƒË‡±f„©^4" ·ÛÏï¶ŸÉÓCbÙR.Pž§³e å/m5àpCÆÃ…‚Šð=Œû gçEå ZâVíì*ÇP“"Õ¡jèÑQàጠ…4e&:ܦþÌ™Ýɉ ¢ Ò8MQ£SüÒèD‰œ«Ph0?±ËÈ?§­ "ùfæ…æÂ(b-ÿˆ’Hü5¥c®˜±•Ž_ÿôó›×?&_UÊõÎ o; ÏÍ•ÈG&Ñ-î„xt;QÍîÈ8¸ Ù™=ý-Ò†pÛ•¥Ue¢¸õ©àª ¯šŒ³Fw?0NÌÌÃ&^µ­‚Ƚƒ>;W0˹% á˜ê¹O5—ÝM‚Š ]ËÜÅ–@¥×»!<ø„blçü.tYÜ'¨Ê!üSwg³C ¾NûõÝKç—#ß¿šOñå °iT÷Re4wè&µ°)6)ýüˆŠcñøE[~Út  ×¢¤@é\îL‘Û‘ÔÅËQSá‹›[ƒŒÜŸ ú!¾÷…HÇ XWÇ ï£ŒÌ–6Ä™`hG‘‘Šj|DI÷Š<û»é‹8‡!Ð^À€ 1S&â¡)Ì Ç¨8ƒ¡¹cðc®f¡â™©µg #Zö~ßÏýÑÎH&CZ<ϱÖ¯ua,è†0Üýù¬ïþäLw~yûßoßýë-¤ßÇŠ|=`åñG¶ ¥úçètÍŠd9–~ÈË^¬hþB×!þË"‚ðåˆ öC8G|uôã‹_ÞœÔqD1mûwðX ̯óàÜ/¾xôŠå¿¢ÝpGO°øKèv¼@øpuÕ O¤ ˜yûòäõ»·Ÿ.@q+ÈŠºW-°ð˜ ²P. ¹­ç GAß™¢êË›N3:¨² çõj4>ÀÙ¼wË]_â’Óő͡ '«Àòxƒ’id”Óh‹ã+w± ÑìÉÿÚ~.Ò@/šEhp;‰•ž hÏ‹ã\f Ä=YêõªlüϨ=A˜S@ ‘r˜DY{Òå&¯Ôß݉;·^®6ð·s`*Ê×TÀ„w }‹Þ@{š1?'^¨W ò¯ªãWDå…Æ«öŒ\5âàºò€ üµîU”ç lV]|ògAá8˜ü™Åz:ppŒËÅw³¿ãx&ÕOêˆ?>yqòú%;eWP±[•¿'sâ\Üý¤~¼lÈ£yË‘+káÈ‘›ú¾Ÿùq?a~>Ÿ\Mü› »?„ mŠqSLH¿ Õª Çل5Ï| ðõï ÐÛB‡­'ðQdÚcLʨÃÿv*ºŽãv:ój‹è‚ý/Ø È+¬ªsº6ë X‹cE·–øjò¬Zì½´hìæ „Ê!.6áèø™S8fDAÓådg¨&£'VO‰¼šÚ1ã+*[¢¥ä©ÊfF§©¦eeSª%<«R é ß÷JÖ-Iôy˜­!kU<‘¡ÐÄ%„¡5¤ ^¹:6¤*„Gcy0âþêæ‡G—)w@„K—#×®|󯥋d„ý«.ØúøÌ³¸JJ7d—JŽ>ÂwøÅ}a$|{ycƒOeÉΫÆÞ’ÑÛŸ”ݘßjêC‡Ì¨'&;û {tõ)ØQçö`ÉCNÏ`¾`÷W(«ÿ.âñæÞþ>æ矂°ØÃ~" ~# xÄ· ¥ü³ndºÈSa;vž1×Ë FBŠIûš†˜í;` 0E Ñ€# ;ÀEyŒe ô†\”%â¨Âñ½}wr´ÏZiv%¶Ø÷tÌ|g2ÜAÔn‘ò¯d³©C‘GGÜÑßƦ ³©<ÞI@ðþ¬A²:%˜]%0þB‰VÎbh”T¶†R_¹á/#áôV¸êœÌ›öªIÑT«%Y‰¶Ë+.6Yç‚ô€è¤ø`q 0x_g¾Øì9°¢#äTGæÛ[Ò/o²gÝ$"ÏØ¿IþÆSÊQH1d9àvÅv]§•EY‰¢ nE‡àÀæe±v=c*ÛþˆD oÚ¿é ¤ÎæYâdà?¢,øqA¢òf$A9²`11°°€‚q’—R€YÖèr€–v‡ÑiÒàU²â™²`à/"þ"R`à爀“VPÿ«ümækä>ÙT*û VWùoQžq_ËÉÌãñüûhÔÁY¨ÂùñíØXDÉp‚ZZIÃÓHìÌJ¸É䈆ÀÊÕh¬5+4k’g쪪Ó~e/Eà5·EÅqù&š&w ñ¹’." )Ø—* š(lðµÔ!¶qÊŠ ’ ˜, “¥b²Ò1YL¶†ÉV1Ùé˜ìÕe5?­d¨ ±e*ö¢“ß5€èÜO @6££ ©œ ù©…žUÌSB\.«…‰†gB^WâÄ0–®(ê‹+’œpì4eÇ"hÓTTK–Ž  DjÁìè ÛÖ¾NNiVŽ+zK(Ä?p®CNùæcc4wâûÈsa,¸&KÙHËV'”ŒX²]´sç” eCL§[{Gi5²MåÊM–•ñvØ»ÜЈK¼­dÞZ•6­˜ê‚´áhdã)Ú>‹£Ž jʶ0>¾¤ްM<Þù £GoB+ë ¤©7èÈn?ð|;Ånão±Æ{Ym(ðƒEsEmõI¼µL­¨[#u¬4,€ÃpL‹/§ °[ 0œÎâÍ´m ØÚ±ù6]´#…êD´1šH§ø¼^2¥»FXàF€vËÒ:«eæ²1—Ëeë¹”}¥¬Æq0ãàCK>á-ÆÔÂBãQFƒ†Ã2ÖåG’ì,’Ã~ÓÏˣʩ<¼ » û*B™¿aþÅ·08÷;Œ[4XÊŠ2Æ–Úl3LNߎV&~N”ÖJì)ö/¾´Q£9c/ÞE_3eÈhŠÛB6†².ÂvÙçïÇ™Éf-j4IкûS«éBÄW·¶¶”Þ fïeb½|Ÿ$e³Ä+¦-$uäå ‹Pv#›*ï“ÊÙ< †…~ghûÑæ„`Ÿ;D_tqzcØXpÔ,Î`6LBY;ä–´‰è‡þùî6 dï€ë/æxa·ª·O¯j,ýE¸?¼+¸Sᇋ%b†$¶&Ŷ£!«~w[“ø¾„Ëàkí÷Ô;ÈܧޖÀ…¿5ê`C€;k¤ Жkx߬MéSðQzank«–?Ø’º“K,ÄÌÑlˆ~xĺ0º³Ï\êÈ•!q¨7÷i‹qñz Ý}gˆ;ÍÐA$U`ÄbyQÝ´"Rˆup?ÏhÂ>Ò<‡•8dâàŠÓ©RØšÑÁœ®&f3átHÇBe“4XG7pÑxMã÷$–kðn8DçÌ ›ŒOˆ^õ<ËÛ,Eðçs/dUŽK>-…x˜KýzTh-ª zèߨÀNøžá®þ<š(Õ•Bj5¥Wd^&Ì7T=÷>ØÕQ|àæ÷žœ÷˜ç &ñ“Ã’ùfr¨ÈPÖÁÃðÙϰk ¶o¢ÊMøÜd[›ðöÀfm©M¬M“nMmä#¶¢ùÎÀã‹/âjú†¡æ.á)He7«³œ #á(±œe40µ†rü©3*ë”ð˜~œf¦eÚØdñª¸h­«ÞÖE±BØ^%/†!]ÄIœRF ¡ÜoÒ;MÅDêQ©gLB‹ý'±yŠP÷â÷)Yày ŽøÁUgÏå/ôú¾;ãþö)¯¹a‚YÃK'â ¡’8w{[™xa~øyF¥nŸ€NŠ)~4 jµjhAó¼rsòüäMæÌLégʰP„š_²"84 Ï„Ž÷ Ò•¨? Ó‡Aÿ”³ã1¶<óˆØ”LN&Ù“ŒXàÁ[’šÔ ˜Ø»•É­G}Rb­¡ND™ Œ.ŒÜhßÓ<×Å&8ØOpà]žV~mÃ/ñVÕð‡3veU1kS·cWH |¾‚ù•¤c›¢€÷àq 99ÒiSŸyѤ׳^ÕmPý  .¬Yyô›N®•2C °ŒiÄ(Éy¾äÙ“Öœ(}%%±=e]'AÛ¨§ÉñØÙˆhQ“Öªlí³"™ª£ޤ–Y?ÒR«­‹ÙC*fénØßùÚ…-¯ ÷c­Š[*çx·éò3.cQÄ H0’}'Ò&L@WÞµ,M¡ ÞÀE˜Ÿü†& À¿ý™à/¤ióNÑ`Þ±ô“”B^p³Ç7Á¥7 y¤ Àæ}Ìû†OŠlS” ª‡)>ëÜ[7sºÏ|—³U0 ø^QÌyÿ ½s;ýñ*ed¿ÿÖh´ìvìý·FËê–ï¿þ>óáщ :ÙÙyFÿO‡ƒÒû•Êqÿ€äÛ¦|O&S0¶²¡¾Ç_¬TþL'‘ꀪcwP^À‹6àØ™JÉgƒgîGÄãÞ²\vÕ—®È~D €5BiÔ HŠv2ð†Ÿ›'‹ ‹¿ÿ(úpù2rø¿©¾ÿÉøŸþ²Jþ/",ýþ#{&2•x)˜Mm'ørßN(ÞZª£¥Ê·h ÏHéiÔlØNtåãNÌå²|#Œ}2åÂê͸åÄ7u]Ýï­RætåÉÂÜ@eüºâà ‹;ŒŠ“µÒ(úcÉÜò•"¢—,b·ùÖñ>$ƒ2ã̘ ¤‘„ •ïk²hŠf_Gw¯Õ5­øMv±h÷f(ø¾âM*PÝö VôîÕÑ¿ñé+ï"zð)îŘ}ñàÐ[b슲­)}U½·b5«EÑðâ€xî¤Z¿$iÓÇ%kª‘”Ñà$¥£ÅŠt?ªŽÖãjmÄÜGª ç¡Åª#Ì7%ÝÇ¢^÷øª9ž5¥ #æAfaì 6( –Š[$­Þl¿^Dš·É¡^‹D§¬,öåÂ"³H>`RœFdÏÿŠÊ´Â³ôûßv£CÁÊ÷¿  ÷ÿá#`ùþ·ÍvÙÿE„%ú?¾°Z¸ŒÜõ3¾þoYrý_HXZÿןeꦼh]Ñ^jD ±—Œçvx¶Æ"P1ªÁØo™Z>D„Úðp І·,´øÜS@X‚ÿM[& •‘Çÿ]ãÿ.M.ù¿€°,ÿ¦l´_q ‰PQ_ ÖóÝNØ+ßp/Q{! Ù›ÀÕd– Wás|û7ˆŽNfgjfg9ñ‰Xöuq t·"7eLÅ/B `2.m´þ2a}ðI‚ä|ïz®¤è§„¥õ?«eµKý¿ì‡Ž­”}CX¾ÿÛv»Qö!­ÿûþdøÐýþxÈÛÿï´m}þ·ºv³SÎÿE„¥õÌccΧN°ÃyñöøõËÄò È>yùîí¯ÿ;dR#€M²W?¾yñw¢¼¤eýÙ™øbËÌQ?¿x|D±œ¼÷·åbƒo·á£êoÜÉExI66‰ÝîÈÄyÝ Ž©¾ï U>ïÌì™üИàÅhä߸‡ ³îtDç^€Ñ,!¨ª2B× ã±óz†ðô ¯îñ÷Öá6 a¶l2çĽùq>òÒJ‡›yZ‚vHïié}°MÏ /Œ\S:h(מϟ< ­mÖÓq¾~·ãÏÃé<¬ò¯ ¼›‡õÍ_'Gïß¿{¿O‚Ó1A^’MòÄðBS7k²üWWîÝ?±}ÎxãNa,¼òfn?ô®Áö ¨$hãóòÒ™ fNtžÙÖ³½=±u Ù Uglðþ·(çùãÅü4÷£ùØeY¸!zù£—ÿ-‡3IŽgôéÖã6h½ã¼{Ò ýÞë·'¢u´c÷i.¸e7¦j3è¨^½ûå‡7G=oÒ›sgÔ›OœÙ]¯?¹Í ®ç@ü«(Ü x¡@s• úûœøð.ê š nÏÝÓ2÷>R‚EQ@‚ºîzÞ ‡œeʺ :Àsq˜Pˆ†r'I=gv@ßðƪcB„þ̹p{`ÄÞÃQ–Ussº3ð†ÖƒÊP@ϧbG´}nÉ/€l¯ßõνïÃõèÊ…®Æ°nq°!A 2ðéY|r{ÖÑž ã8¢@-á{0ŽzQzvÃc #ÈÁ:¡€rŽê.=<Õè)ޤzpèUÄØ˜Î  ybLêG›ìðâxž wé\»”½®&þÍ»:ŽÔ€‡[„¡ŠÏ¢àqæÿ¤þ—.þZFŽþ×µñý_Ëê4Ký¯ˆ&§&<Ò$h÷Î,jåD'ÞºÁ—`¼ÀÎ!Î8’³'±}rîûúëµ’'^ ½¡NpŠ"8Eq¹‹>‹„ –F܈®7QÔ8C¿:þ-uëäÆ%7tP+VÜW®;åYà%Qø±#Òø» ûL2 ½–ê0ç.åg~3'KL¬ ÔµN~|óîÅ 315ÓsÂð’ÁwÈ8™) sáTxÜÁÝ ~7R¶+eË ¶Leä5‚¡ 2ƒ¬j#ºÀ¹ ˜‘óÀÝîkEøØcH)Α¼—UuFá¥?¿¸ñ@¢\ZenÇÖ¤»Õã …g•-2ëØÐ@jÏ $U ÚW’àÑ<°UÈ\(jTK°øcµêTÊß-YJ‘`uiö®³ºA7Û_ˆÅ‰’nìÁí¿ syrP!òV>ïÇka4OÕnjVþ,WÌÇHkè^¸³xMÚ¹Ëë[MT¸¦ôIY|H¥`)õÐZѼzµè`nÖPÁ\UvÁÚÎ.æ°+ä \¹ð¯a²ûšr-¨ÅmkAâu‰{îG)íú­e76¤cŠlìsÑÅIŜ䒮c¯á2¸3¹S†<è¾—^ ç§%d·ÅÞ´…ßmc&UùŒ6{6ì ™Ôñ¸n‹—°%Pmè™PÊ­ÜݹKîü¹˜ØŽ¨!ÓîÁ{Ë_©š>2v”z-®YgŠ1Ôá'lÆF,Üêˆba8”9Žð¼Ïšæ;æ«Âìítr['wuò[⺎Îa®b9ø} ü 4°)ß…¹è÷#ñf\neô4¶òabÍuÀ4Å à¸'–,úì-Ýûl.Ó×l´cëÑu$:çÓÄ»î»`6xÀ 03¿çQ“ ðÂÒá7Ç z4½Ð¼Î½d ܤŠM ò>vÔ`©+Ê´¡g4sÍh Q¢•Ÿ¸šM{è¬<úäT2'<¬÷Aš‚‚ËfÈ |UiIx%.b]&s:;í{Ǫ“i§!”)U|¸'¥J´ø"˜ _X ZÞ¸£11.äkQ)aêJÐ$gLëgÖ”àˆõ¢¶ó&×þèÆ Ñ/4Âfå-¹#ûd÷ÀH.Ê**­ÉåtV§ÿ<ó/©^ŠllÉ/%³·ãJ ·î²x}r诓~Ÿ›zB–VB P¡Â²w`ìŠ*ÏgúMN‚k£VÿYmp2sXÀøi‡q,Èc;ZÏå·Æ#·mæcù`'ó­†äþÏÜ[ñÆŸòì:-+vþ×îØ¥ý_!ïÿU¨>Q!xO\Ä{{ô¯ÞËŸjìvÞñOoÞþŸÞÿ½?~ýî-Ù"V£AžûÓë·ïÞË´ç‡Ä²öžâl·3…ížÜÄ…ðÿ<Ã(¸b¨_é3æÚP€ñ¢ÿ‰.<-Šï[FÉé{› ;ù–ñé÷Ê!9P¯Â éDI•®¾Þ†ïX¥Âñc÷‚î"&ù=w~Õ°<ÿw¨(ù¿ˆ îÿ–ü_ò?ã½þë(#ÿíF'Îÿ]«¼ÿ[HˆÎ"3<õ‰LtøâeQ eM `ñ¹[á’üo¡+•‘Ãÿ–ÕIøÿ €%ÿ–¿ÿ#FÂ,ö¨/*q“<° Y´nŒÇˆÑOMŒ›àŶSÒlðö¹ îÕ <ü¸gxæwj¡Šå]}nÒÊP@@þÿá—¿?bÙüoµÛíFŒÿm›þ)ù¿€ýO~˜_7^VÕP9}nKæÓU½¨ÖÒ|Ö´ž5g•ÊöZBåí/?ýpô~ŸXVåø—~z}r_ÿí„—#×½àґ﯆øão37pYÿrÇ ÁuËøyåÕ‹“#šÝ~f5žííUNŽŽOöIåøäÅÉ/ÇûT× C42ûܘkä†àÉ_•WGÇ/ß¿þùäõ»·û•ÊÉ¥‹fƒ(yäfæ…no|ÇŸO†³^²5¬ö#˜:}·Ž'Ép6W«|¢ôxèù½BMá8 Ò¶@wí!08y¨Áoâà}VpóJµâÉjФ:¬oÞlÖßÍüâ}oÓž>»JÁpJuÆpHá§õÍ¿ 6ëßU•k§ÞÅq_©L¼Ÿ†—34žï¨Øóâ@›™ôû´Ñ¦p–M›cs€š¥?»k4vwú›uBõk—ìv:ûL¥«RžÝ­í«^¥ ‹r˜Èt¶CÛ?GMˆ«Hå廟~: Ò—ò5^ѧ´©B˜Î˜í ô6Í'‡¼àÜGS“ZÀ™< ¡Æ3@W;̈FõîTÖ?ÐÛê@1ro]ºÐ¢k«‰M¾wðûoý`çÆ ú;î`.Fxë™Õ¥œà0Z´1ÌŒg¢ƒÿJåEŸ®àÕj8Ðþ‡3;÷xíj2 Ç¡ëŽÐ a †Ó«eÕêšÑ·Å ¬Š°Œ¡±`7ñRØ’„d“.½hÌåŒ6ÉËBÞº˜©M0£Ù†M²M—{]SÐaT¡‹ iØ?޶>ÈÓy¸¿Á*ð ùbnuö-:ÞïÉ9„]9Úߨ¤ýGÀæ¾µco7wZ|8ŠÚÙ[lðzÞƒ‰¼lÃRC+ÂNQ¨ PÌÚ»¼óÈ]ÎöÚÔ>ÆLøV M¸@7ÇðêȤÏÙ®™»ÌlÏ!Á|JzìÁ/nÖWÎ}M˜©-ýõd@Ú‰æv&w7Îíè—€ GF€"eèÃoXd‹‹€ä˜€\D‘éì·(«?Û"ßoo“×£‘{!RŒ­SÙzÒpä;T¤#*#& uÿýØ}p?¶êÇ‚ÎL.`à¿FÞ ?8M„_·9áv¸ËÔ(˜*¤µ“!}>B&zǘH"l CYÖ¶mI†4…lkCµw¬½íf&è_ÿú×Í}"¶]à‰=Þ™,Ogw°“ Ïãô²Mu‡È 7¦•¥Q"ý lÇcri¼‚ ‘ä÷û -j· |—ñÖÐC“2x0oŽÌ3s&T{ˆÚ<š°P¹ óÌ9e;¸d8Fsîs— ˜­rs#˜ÃЧkèdPôWÓ&Û•Èx l {{‡vxÀA`1вžbÃÑSGQ/ÐUÐ¥F øãxwíΆ`+V/ê;t×ðJÍïœû×.sš¾C0|=bÝ+Pw_d„û¡óþ%™ÌAê¬ÀÀ;U¨`b{‹tre³¥¶^VuX]PÔ¨®¬´EÐ×:ƒÅCÅ(t¼žùž¹¾«GM†›b¹¤úÀÀí{c´Óáè£9”.ñÚÀ=Ò#¶qË_a Öó3ס“&E•mé»nLÒ¿ï†Uþªúu¸P}‚}UåÛCG"ý»F6énÖ*‡ÐÔ¨öj”#ô8¹®ýoÌ–ÙAÅn·+ø2 ú ­‘}¶I¸0E¬Ê‹ÓÃáS¨i<-ËRí²~a¿ûÈÂ^¹§síÌÀòžT_¿}ùîíÿ½}}ôöåQ-šÆa 2æ¹q™y8\&p‚;rãÏ®ªÐO|‘Âb–¾ _mU¨rºÎd ¾#4šG…L‚kÈ «2·‹×ÀÂJ½ªø¨ËM]´ë1òr/%œƒØ™Ê‡Á+¼*;—\Ñ3WXáu¥Ö”KZ-@ì m2¾SEh¦Ö̺PïWø"ièûU–=ÎÁÎLŸúÕ”ܘf6ɸIÓß»cgvÒ}² Fˆ¹ð®©Œàâ°û£94Á>Š$÷1ôÿ½‡Ž+»aWTJ¹ƒ:yõÃOp~  Âx!Ó¶ako@œE[@[œ„Þî“° `˜‘xî©ðañÊíϰÕqCP»óS‹ ãh•Å/!U^0!Ž’[¿.¤¨ŸÖNã¼É®ÅÐ~sBùÂäÛ£:,¿É¥#ÇzÀC; ÆÌätêñK$7x'‘M^Œä Õm]i¡‹Ã¬…»{ìª?…e—Ø•ðÃTOè0â®ÌÜ›žÛø…oÆ´Ðpé ©À„EQ¾¼Åšˆ‹<<[ÄuþÛË^Jz=|„âB«}¼™óm¬aaÄRp¾ÜåN«PÚa;¬3i‡‹gÔØ›#L_`5PëÈNˆØ’~ϲäŒ\Åኀ7àµÖfÉ"©­@NJÿñü<€íXh¬58®ÈtÎî& À/l2Œî¤ÖOÁ*JA;À☱vÒ`ö?TwÄ«çò6ª”w€†*C”µð< ´¦EWpË…_ ±êv½ ˈSÍÎfŸĹQoÕÛ÷¸r‚}ûtÜ€ÝañöŠÝ¹h´vÛU)™çT˜úÓ³²¿][¿„±“0ígö‚ËЮáŸJÅÚa @P£ØF ¨bB™’€¸#ó6†hOûªDrájö‚¤V-²{trÿ´/7%®M¬éc4 @M‰Ô¤È1í¤Mm]° ï³þ #¦ lá­`>•n¾Ù¬Óðß_ÞÐçCP)~_3ºö+|ËÂzóæûï[ʆ؟°àsãÙVô<©Üê€Õi¥¹CN¨`d/*NàêåíŸín·%2býßÕpÞr0¡gãh‚‰Ü (Á3C 1ÿ/ ¿ãŸÞ  C™øžö‰T* +³=œéR˜ŽÅzãÿŠ¡ëÞNý EúóŸm=xt¶Û ™Îgž?gÎt®œ ˜–äšo7ª›"°­…êEÚ:ûvKa›¿ä*Š»Go…Ÿ¬»¾ÙÜar,¨ÀwXÉOœŠ¨øÍ Œv°Ú;VG.£QðÂ$¨,8ån¦zÍYލž½Þsg@Y“ëV¼öJûÈzî7‡•xÚr?¾þ÷~%¸ò¦¸æ£ÓÆÄl— Ö{\_"/qŸ-ØÇ»ÇxsK›ü«ßOÜ›ús^*g»D´9:v³Oÿ«|¯mÃ"ARÝ·tNPNôêð`ö>•@uö¶ö>Ûyà)vdÏÁ‚6 ”ö,d»ítìN½cwcHYø=Ž_ðÕ""Sf6ÒHUÂ=—ÙÌeLùá¬ðŒsDÜ5Pb=#öx5NêŸZÆÙ†‘ÀË­ßõOÛg°;KUq28P¶ùˆ†¦g ¶O~™0ÕJ/]G ØÌ±½ [4›ÛÛ›¸atáN@zïSY+~3…‡É ¿ßŸSÙªhŸœåÔ‹Æx= ò\¹ìu]Ÿé-xk+² \¡"ØùbÓñüwæ^ðœGðþùÿÍ®Uú/$ÄûŸN'Þ`›.­.è=ØñÏ×àvùþï¶ìNÙÿE„ú?ìîôW*#×ÿw§«Ø4Áþ—~•öEÜcÝÚº=mÕÐ<¡Îÿ«ñUqu«ºuW£Ó´!¹Òf·é'ÎŒ[H&wøïo M6¥¢Î}š4q…ÍM„é¹3;€“D:‰ö1âBÿ¤H'yX«·OïžþƬ Ь–ù¤Z«°c`¨»•¨ái·v²Ò"më.=ß]j>¯þÓ·`ƒá» Ô‘[‹~@~ØôƒÒ…ôÿwÈ.ÀßAÒuJ•¦ â„-xFg«Þ®wˆI‰PâXs`3¨7¶àªh;ýd@Žý—ÕiØqþouJûÿB R‰¸ ˆÿ(5 eŠJI7a*FMUbI.ú"†ÔŠ «Z³$q‹TÐÐâçÆ1'dbüT…`¯çÁùo/<ÑrO‹&Îeê¢ER:¢h“Ké´Œ¥DP¼<§“*ɤ¿¦ý­¢ŠÈÄTY`‘`Bô³ý82õ€ÖÜ@gMTm‡áÔ"’xÚ†l™ 8ÄšoT@¡´QÊ`‹Ûk='ÅH].ŒlgC˽˜ö‚JåSvÃ^ÂIÞ-´llõ¦á RñçNàb–XJ¼?r`¡˜ážüøúÍQ¤À×´+}rv°¡'mõFNžÏ‡"^CM€šùÐÀÓx§gf  Ò < uzV§¿|ü¥i'3wì_»Uu—¡v À¶–P'fp¤{+O¡ÒUP)¢4Ö~4b«šÊöG~àVG"i8š—‰$VÜva– o8ssrÔI¼$¨ÊFàBgp*êÆ¶¢ ×I˜:s¸ÄØ 4­n̺3Ê¢²³³“ÈÆKÀsü¹p m>˜Àgl8SbS.%Ïuv«cã_kš›] %SEã–á…ö‘mH ªZ— ÀXÏ)-=žT³Ç#À) 4Ÿ‘ÿõLÙ4A* dúºždÈŽù©4âeì°AÙÑ ­PQýMË„è¼àEóŠþ£óWl^K@®{%a`¬“DÕ)†Š“Dˆè0tG£Do¡X™¹7Þd`Në\gæÎff©èúÔ´A7bœ²´X—©¹qžŒ„X-š–xê(€T­O7˜î¤ÈYØÆÞPÒ"hú ÉbâGäj¸èáÈï_áœb¬n8»K`ùç“L 0H{ ÆMö„`€"•O8ëE:*¬¤!ÓÄ ›¥¦ Ïjˆ46wb ªúc,è$ûÓ÷¢fÅ$ËÓ% ÍäÌ.4*h]ñ(lÑô(úM»ÕÉ æç@+w+I‹u1«œù†¢ÑUÔŒæ~®ú ÈSç;KM…¨º,Ø%” ›´¡tAúg寠D£¬_©iLI¡À¤ƒ$@ÁZDeu-ùJIH •RE¢vZšLE?EU£K+k™yR$=Èp…*¾B1 r÷ÊO%I` *—7é„‚8š"âíËdó„Ì¡.K"ã'úLCá«8LÚ9MØD“ïZ™Ê‚¤jt ôfAx óz/žƈ½YUXº´Ò©È͉(Ú´sRa¦JtK<ү㲠vI¬²qs s@µ»€JÉ_IT»êwlqÖ8«!ïÆÆFu{[‹Ý~+Hò=i`F>oÆò¡€ßŠç£²êéSšNjäO”–m«F`ovc\%=}ê‘çàJŠE m{áàWVgcãžð<´J‡äɯ“'5"S³ªˆ}\í×êDPfiõÔ¢ãe*d‡üh €L^óêVÖz@[ªÖ @û}åþ3Ÿ /rþcÛ«åÿXšÿ'vþÓ-Ï üLäü®“jí“~R€‰Õ­á´vþ‡ä;xÀ$ž¢àÂç®Eàÿi`;Aßó|”Íÿív§ÝŽñ¿Õn•÷ÿ Ùç '”HåRy€T •HåRy€T •HåRy€T •HåRy€T •H_Ø’žµÁAtèè+±.Fò™£È6màyðâ ü5BÀÒPÄ–êúM‡¿¸:ŽϬq66œÁJߨH&õE‘‹ß ¶d¤¦L/&~ ]´q°1Nb‰X7ZV@IÐë€O˜ôÁ…¾#!Öÿc¯?ƒbY£'¶3(U¼€ˆ^ö”Û'òCïÇoŽêôÇÉû_ŽÈ=:üv ÛMˆzQß´Øð ;Ò2ÿ©è[¼6ÆÎŸ·^"É›ˆ¤Ø &Fñ{càÆZ5§ß¸×±†VòÍíJ"£/iå„ ô«”â¦ñ\ên‘O»AŒ ¥Zÿ&«HVˆõ«K,òB‹Œ %YëÒ¨JŸa¹øî÷mïr0Ê©‡RS½%p˜ÒÔh'K/œJبp%/߆ÁØç0DOÇØ 5UÝkT6ÉÎGWýØfã†BÜ0Ƞ½¯lCêÎrk »!†µDžšÌPÇÚ†cnhf•(½Í§‘0Jéß‚›tWî]Ú¨ÃÉ„jmÆQGõ}Üq1FõQ:L u$‡(¢|câ°lòJ»¬?¡Ü ä‹,A46ðáKBÃA€£æ#‰%eW– qv×(™Îãtè 4yFÆÇãôûó±Nc4iΤÌ9ƒËXvWŸjÑF°¾_OC m2ÇGŸ=6dîXzŸ7‰§³YôFLÓÆ¢#O€Åè¨Í7ÔN1Gu¹A Ì?*»Gûîç^8I6p„.€ã"ˆæn«üd7xøB6Ž }²õ1RbcXùàRH´µ6ŠŠŽ>Uâ.Ô“šá4£5½®FEæÞ5Šÿä<¨«]B«“¥¡©uH]OÓP¦œ-Å@ç ÈHYy;èÓøþÒBί±£É”S=u¹Wv-v7Q©¹µ1½¼ œÁÌPVà üIMí¥¤òÚ㟌ÆIKGéBÿIKê™Ó°™pªNMìé©ü„¬÷qî hÓà0¸vF§6¶ÄšMµ£éä)¶If; ƒÞØ 2T„¹¡ççýGÓÁ—ó§J„‹þ àåðà´Z­Z »U{Z­rÃ5öv{UÂÖÈÙ­Õ¶­ZíYLœTîyÊydÚQ½ñ+[TdkìŽûÓ;¹×mÚ½Öwµ0 Ï-–‡- isA1ÙÛ+t’›…Þ GŸ›Qã~z+yÚAZ´ížú°%¦Ag·dƒÊÈl¹›zîFËÀO²ñ'Ébßõv8/Ýv—³êMuåå,F¶Ó¦‹íGKÔÓóÙÕr9§fibèÿ—ËúW9c\¶¹ØsÎomvø’R§QlÃ7Å”Á4ÕäŽ$öCõÑå†ñ$?RJ%Q•Á|jØ6´¢Üä‹c6òÍóŒLsIŠQ‹œîãAz“SÔW:áüa£Ä¿êÑoÚ½¤ÔW¶8Ï—•4xBqÞ÷AÒj€Ù~sg~5KÖoláb6‹eØ,.gr3Û é B¼ÀÑU²µcÓK'  ?¡0ð.¼0 àbæL/³àYÚdP¥0ßtɘO§Ù4Ü&ë©„¾R =AA]©Ä›Ì\Ó‹ }€ ÑK-¸+Y¤Åì z}àO´>Ê Ã8ˆ™fæ_ T6•?Îýð€ÿž¹cúóž ¼k}{(Ê‚ÒGäÁ‘i$r¥eKæ!ˆ0Ä8,fõµä«0øspèç„þ0Ý"’½”d¹¤0£^JöA|îˆÌJ„žÐšÄù®6¢’ëRÌ<_,7.ðœIüÜeh€ êj*>•ƒY¿_ÕíHb@Ù+´ñ„& f'¢ aššç˜sNW…I£Ú#î­Ç•ŒêVAÄŠ@Os_Åé ÝÉuƘ0Ÿôj䟳ʘõä_vƒ ¨MϯÃÇ@Ô„šÜr΃„…2üËÎ8µ‘ ‡Ýr—ҞŒEñO•Yqu!rú7ý*ߊÌ×ÜYž¸îg†»é‡þø\ªS¼Œ„.9>€†`q"xFš b ›‚FÑ532g 2&56À­ÝØøæ‰.OŒíÛ6Ïb¦T##vl´(Žq:Ž à`æ P˜4¢Íp‘ÄítÚáÁ©–ªœWî]JëŰlp…ˆ©Ô:´Ói¥Itöíö¯Ã*ë ¾†t[üOz¸ôEÚ$„R Hºåæ£ÝNC]/aàî|깚ԯ§r‹uZN¬SYBºEI³ÈaßÓ0@ꤠ!ä –šl˜:á¥qÞK,-]^Ñ ðÂD[ÄÔÇðŽêǦ¹‡ªÅ[˜‰ÛëØ”[@‰tù§í›GFDú׿ti)à8ušc€3î5eCMÒMÕ8Ö0Û¨ ú;,‰ËÆd5G¸“‰"¯¡QÆ.Õh…“Š„4ËSH¥ëhÛ0É©»3¨fX ¯ØOŒÃZ 2ltaq@;ßлÁsž¶^5SBñ¤ tM·LE:$S¢5ÆUÇÅpDYGrî'q@hR ‘ cúÈVÊ©ò2©‡‹çSvÑàÚÃפ…,ç0e°È$†VÙE¿Nè¿×5ôi ߤÂðC4¬Û>IGŸ‰¹·r5ño&x¦žH£Dám¸ÞNx#¢ëTŒáÝ|õI§Eü†«æÑí{r@ ìyÙªwhÁÛ²¬>ð¼lN"ßMˆjÂèåÑpWŸoc»xgõÍmZ³Í\ào0ü•Oô?­Æ¥¢4´\•¿ÏÂlD›Ò,&ôDÇÿ§(=½%h1€ÊcoŒÜCvÃF5Û¬¡×ƒÆBjñZÐGÇ! 5sƒE±ð©"ÍRppr¹¢‡“Ë5»8¹Œ4­–üÒS¿NÄ °Ž`‘ìßo~pýú+Œ.>Y¶<ÔG™h%9c°¬´ }=¦¶?~ÉcÇÜ^±¦‹j.(~ W%€a½Ã1.Po½ÆL誜"R0ÅPüúd¡FÛ\µÍ6×Ýd›‹µX¬¾ h˜tæ­nƒAZO2 —Ñ ¸ hÙ¥Txö®Ô‚Ô’ä)9[jN/%§ßVáGùð² èj2K¸Cg> %ø¯¿6¬üW.ƒDoÝçJ£ø°Û04Ï7Ø:¬®÷F1dÁXb?íèg3úÙJÌ[í(±ýì.*Û]Y¶ÿºvÙþë“øxb–ããë¢:‹rHe㛪ºØ:@½}é±û .À˜ÃX>ÖÉn#R—•ÆŽ¯ÂRºA[Åà2†TÏù6Gl"Zgj!ÑB™ÃULÐjÆÜÖ€UY"Õ[e-úôiÖLOWgÒW[µ¨bX­rëò”XµÓØÂùŽT¼óذIM¸¬ä½Äj„Ï ª0ŠÄÕ8ú9‰~ú¨”)9>Fi³ègý Ù‚‰OLÔw‹ÊÄÉÊ2q²v™8É×Þ”ªž?‘ãG\íZ *Õt¢žïG?ÑOWŽö=Œ’.¢Ÿ—ÑO/–áC”tý¼ý–öntÍT‰»—rKnFȽ–¯¾ò±ªñ?ÊN¦iÛÁ¼iYÑÄږʬ``Yu2Œ ÕCþWnËmÝCÉ·”ž±8á³/@Û<ÖËþT‘æ´}ǵ"v˜)JçN¡à1ì°qP‰ö^3v^Ù¾+“ÿ§iV¤ØU'kQXÊa£–:s«úÂ׬þhõgšÔ[÷Ђ}P¶ìÙ¤Ê oòhjWóVµ¶{úôycùþå6Œ©Ž5­ŽÛÛÏ­¯¼ŽËâ/ZzV6pxZÑ ¢í_Ÿ(]G§¢³vg?ijë¾v ²ÿ•oçÇõòpÁ*}ñ{®ñŠM®Ø®\Ç+†û½ßÂNJ¼b¸±›»íÁ·øô=§…Ož¾ðæÒô¸oEQ%W›iE7YýU×µ"tz¦?‚ÿïü¿÷ûýß¶•xÿ¡Õî–þß‹ ^&2ßÊóž¼ø®Qºo7zu(Ý·÷J÷í¡tß^ºo/Ý·—îÛK÷í¥ûöÒ}{é¾½tßnT“t’K÷í—¥ûöÒ}{é¾ý«wßN¾¹÷¥Fù–oÑ!{ÿ÷ÙZÊ€]Þn»úþ/ rÿ·ÝèþWÃêÀv1i¯¥ôœðßÿÍéÇZíég yï?·Ú¶¾ÿou›rÿ¿Àg,¶Q@ðÂ;>'qŒæM·VÜÚ•ûèÁg WΙ׮cnå¡ ¡ÁΫîɇqžŠÌ[ë30{ ¯Æs૵O¢{_±ù—Üinµ¹©”<·4`™P„7Dôq ¯vÀÒÙ¬èmoÍ#ñöûñصwÀEÿ?ðɧæÁ½¸šK1€YÚçî©Ç yü¿âÓïòø¿Ñ²’üo—ü_DÐØ™ö´uV'[(ïz_¥JS†%Bÿ7‹àÿv'Áÿ–Uò!âÆþ8yós§ïlþôx(eø¬!ÿ[ð¿e•óÿç Àó[C&„ÎNUv2sÃùlRýŽ+¿ª˜`GQRP «µROøjCÿ·‹˜ÿ»Éõ9ÿ’¬ãvLÁ5<¤ÉwßÁj¹døo$äñ§þo$ù¿Qò!Îê[žØ½Û’ûxh_çùž|(§ûo(äñ÷séÿí’ÿ‹¸ÙWàÙ^?ý¯©iÎg=æ×öª¸CHž?Ç-þR |¥!ÿw‹˜ÿ;ÝÿÛåü_HXŠÿAhµKnÿ†Bÿï1ÿ7Zåúÿ3äîƒúñ…Äö8—Xl—G„_yÈáÿó"Îÿ›Ýäüo•ö?…ñj´ï“OÀÚã0ö›~Jê½VBh-ÀŽÈw(TЭ‹8ȇĶ¢ >­O§¸¤Àƒˆ§¸ †?Óíçcå³:}ú´‹zútÚšÖv B ™ª_Õ­‹jM¦—¢+—ÿ‹8ÿ·Éý¿F9ÿ8žÓ6ø$Þâ6Ÿ܃, Nœ×I?n{¾Ň)û¹óÛA%Ý+%~öÃÿWÃ"æ+1ÿ·’ÿ‹•?‹lîì<£ÿÝ ¤"§¿™Œßy“þÎå¦î›bà„®êšâþzcWqÆxé—(O1N¦¼(îÌ\§ïx¶?Û@»óÂÏ*©@"ýÈJ‰]Kúft1äðX„ý³•´ÿk¶Jþ/"(Orgµh®Ç繤=}xé„þ?¼t‰;ÔÉøŽø“ÑÒ¦› Dü&Z ^ø¡¯»£¨Þü×~…y~}F §ˆ‰J±ñZ_z4J±òø¿ýßêø¿œÿ «óe?»Ãnöà!ßS4 ŒFd¾·5Ôècù¶ã€Ïå4ýe…<þ/Âþ—²}’ÿKûßB‚™ÿáÇ­%-níègó´y&¿¶n[âwuë¶]«²;îpqÍ…¨ZÎÞÚü›lñ˜g•ŒƒÙÉmó`ëÀ¶d<f%ܶá.a…̳-ú Õ­Sr&^¶«Dš½.Ë…<þ/Âþ·Ý2ð¹ÿ_H@NÕÜ;ÞEþotç°o‡y«¿ŠÎ…Í– ž™Wµ„R"U÷ê­v÷@•PÚ‹ òRqt“˜•_39âof¦¶3S»i©ÑCo˜¼eóËý/òø¿ûßf·à*Jþ/ Äwç˜<@>»;¸'SŸþâ't†¯Zðž ;¬Þ¶lxrœ§V;m·ÏjµÓNçì´Û=“ N ƒêV U‚:xÝÁð6Ñøn8Ÿô¹È¨³Òa«‹‚ù,Luk8eØ!,ë@¤n\ø¸«!••‘"\ã—͙ń<þ/Âþ¯ÕLžÿ5KûßB‚2™O˜t9k þw*´™B¯/üÔÅ"ÆÞN™£«~9Œ®üù9]öĉ?Âsû!n@Äʼª_=µéMœ6ùôßGÕ£²EþûC+•…§wO«E’BJ¶xá´¢âг‰U0üqDCÿaÿ—}ËýÿÏá•ÿØÜÌþüÆæYÎÖ ¼÷IZjRáCýS¤á®Á•ôôóÇäÔÇ ¹þ¿« €ÜýƒÿŸN¹ÿWHH±ÿnÀþRîhÊM¹ã)i¦Á<‡´.ƒ¿üËÿk0È·ÿOÎÿòþO!!yÿ·.nþ‚ÏÖûõœ;õ#Ïůïɇ§¥ íWrù rïÿµ“ûÿòü¿tìs@Uïr&ÿvC.ÿ¯Á(wýßIò·Üÿ/$<–þ$G›ïô7п°–'aYÄçôÏßõÏïôÏçÏõïï¿—ß`f€žrû=c±Ëÿk0ÊßÿKžÿuKý¿ðXü?ùNH̘ òåBõ ý‹Õà_dYú·ŠNF®jä÷ß!˜:(9z¥Ëÿk0ÊÕÿ;þ/÷ÿ ÿ¿‡‘ÙXè|Çvì·ªàŸ~7K~û¦B.ÿ¯Á(—ÿ ö?Ýrý_HH¸ú¤<¾ÇCMåx¨ÿAÙW¤tø„\þ_ƒÀüù?éÿ§[ÚÿØ­Zåùn›ûôß Ûò×wåFà7rù €ùó¿aÿ¯œÿ ùÿ6= RŠo"äòÿ bÿSîÿ¸Ýÿ¿%¯G×þ¢[·°ê×¶ÕÝB±%¨ ¼þùK)ñ…‡Ü÷ÿ °ÿ³ ÷;åþ_!aýü/1nÝÕÉÖoÑaÃGÿG¸aÑØð_ÏÉo¥AQá!—ÿ‹°ÿ3éÿ¥ÿ¿BÂ#ò?eÿ4îÿ­äó/$äòö¶ÁÿW©ÿ àfV8‹v“ÐãRNÿ¿c øó˜–¢â1C.ÿ`ÿgòÿß)÷ÿ ‚[Œî¹ÿ-Üy¡;¸Çšk½òÞWrù¿û?Û6Üÿ)ýÿqþÿÄ »µ…—>ç6p Ƚ€O§;èŒLÊwE‹¹ü_€ýŸÝ4èÿåü_Hàܪ¬­[Æð2BI eª¢0ˆ´ƒ Ñò(™@¸ÒC-=ˆÒUíâs·Î·rù¿û?«màÿrþ/$°×ý"V#«~W2º|$\ÐiÿÂNʆXõ­’Ÿ¿äËÿØÿY†÷Êõ1mÎѹ—ý¸Žô¶îpCN~ÞòM9EÓ/ë¾ËÿEØÿüÿ–÷Š Šß÷'{•çŽY’»ƒrAþ‡\þ/ÂþÏ`ÿSò1÷ÑýßHßÿ!ºú[QßÉÁTüjù¸Ç×òø¿Y„ÿ?Û ÿ—ö?…¦Ýgýœ™«,¥FªUöŽÇ°N5j¤¿" qÿç®O– ¹ü_„ýŸe8ÿ+í Kó‚ý‡ÕfÉù_mÈåÿìÿ,Ë`ÿSÞÿ+$ß³7?Ù/|\Wõ¬_í׸ÛùC—ßÌÏ?Zôa:øÜu)Ãò!—ÿ °ÿ³Mûÿåü_Hˆ¸¾ºU;=«Åïp;ðœÀ³?§mùî<郟ôÛ!‡ä «NM¾Ù!pRÀÖ™þR‡sJ‘5ÏÊÍ‚/!äòöVyþ÷¹‚òÇEUãSfÞ«¤3–¾¬ÖL<Âiá«›RY¨n)á²V­EA5/æÐÃê(åÀg ¹ü_€ý\ö+ý|ž Þÿ“q—þ,$¿ÿãÝû“ƒJ"5ÿ_^þãÅ{:çǬl°|à'ä`cƒ~äÀ)Ÿý‘ø …mPa0s&d÷@Ä„~Ï ¼Ù·[2nèF*ÌpæU¨{òÓß_ÿãÕûƒ¤ûï”û-aµ³r»B†\þ/Àþ¯Ù(í?WH08¾Ý÷Ë›woÿždðþô§ã—¯_!£¾Âë ö‰Õ©W66Hp3ñ÷É.þ~¥¿)«‘—?÷0_ïä>Š,_0 `-,ˆÅaã¹`[Œ›dî’™W ¹ü_„ý_Û0ÿ—çÿ…ªÇcƒO¿¼t&ƒ™CÎçuÒ~f·ŸííA³â¡€Ø,TöÙ"‰­xàÕ’E¿ÐËÿØÿYviÿÿ¹òÿ®™ÿ;Ïš‚ý#~vú³êÁAí“äöûضÁç®U ¹ü_€ý_³Qúÿû\ùOòÿ^péÎäôßü/WøLéîûóIxÚ„…4zöˆÉáM]{M·Ÿ3pïìéÓB ¹p'îÌ Ý€Ðe¿;›ù³¶‰¨€‚ç%£…ßý·ºÙXŠš5„<þoaÿ×4¼ÿ[êÿ…ÊUÇNH¹^ò¼%xž9ëRNlïtêdhi|޲`~>‡d‹ *%_~!—ÿ 8ÿot ú¹ÿ_HˆŸÌÅß>dÏü–Ìý†\þ/àüßj%ÏÿË÷ÿŠ ÙÿÃý¼”=Àø&àç®_²C.ÿáÿ§Ñ-Ïÿ>S@¾žÎ(/3öUÞNÿðjÀé“_ÿúä ŸñÉ ú>ÚüÑ¿° `_` Tòù×rù¿ˆ÷?Zåûߟ+ð}}¶Ç׊Ýÿe[€4úÜ|ÜÁU="dˆ¼a™€O›gâ=áÏ]Ç2¤‡\þ/âüϰþ/ÏÿŠ Ï¶Èd>‘á|Òé`«~w¨§~4¦ºE.|¿†®€jŸî•=4ù–Îÿ¾ÎËÿœÿ•þ??_X”ÿÉÖm|«¯ß@ÈåÿîÿÚ Ãú¿´ÿ+$èëzáÚË©“ó:é×É Žƒâüõ|¿ÿ×Á¾{€yQ±ñÆ›¸¤Í-÷«˜^"¹Ã“!µŠÙkjr“ËÂg ¹ü_ÀýßF;aÿÓj”ó!¦vçÔnÐ%>ûyvs×£ø÷-9õ› 9üZœÿÛIÿŸ­F9ÿÜ[ªìO¸…©*ûõ&ŸÕ@-àæÒ¹¤êmoóSÝnà€Û JÛ€¨7½Ã¿ ~lÖ½;(ˆ»+…Ëg¹ü_Àù¿áýß’ÿ ÂÁªýco|NÿT™{_Ýk'w¬šþT>|4B€.ÕˆêÖ°Æð±»`MÈJÁÏ>ýä ÂËp) ¹ü_Àù3éÿ£e•ú!Á0ÿ+Ú?ãpñâ:þ ³ÿaƒNôß[ðïÓ§R¸ñÂþ%M”»À%}/‹…ÞdîñøÀ:óQ¸OÎg®sÅbQ! …Q*¨ÆqHZ555Ò"¨ÈÈÑ#J²xÈåÿÎÿ›VÉÿŸ+,ÌÿÌÚüïÓ?EÌúô)ù¸õÂ}2´ˆ;¢|ϾšŒ{…DÚû¬ e³4‘0lîÇdÀ“„ (ùþa!—ÿ‹8ÿï&õ«´ÿ)$Äïÿ¥¬çë«nßçËøõÛÎ-ºþ1szÉ«_NÈáÿ¡ÓWÞÈãÿ¶;ÿ·aS äÿ"‚éþ/Q¼xÕUñ·êΡÊÿaçtmr‡—@²K9yK ‰t¤pjRVà\ï°Êã÷‡ÝôOŸ¦ÐÕ 0—0ðsð*4ì2:õRvµRî9ž¯S åÍÿÌ8|5 oÿÛ‰ó«Uîÿ„õ?^ý~özA›Ÿ;e‚gVþÈJbKF=½có9¤ªçdXµÊ·¿èwþo5V?ÌåÿfÂþ·Õ*í \ß¼ ÷ÚÅë¾|Gx>ôÆî¬×Ÿ¹NèVcd+vW@ß„ûÜõ*Ãb!ŸÿW?Ì?ÿ3ðùþw!ÁÌÇ$´mò‰L[íÞ½_¼9>‚Å|뵦­M;yÿ $YQʽòHˆDuîû#×™ôÂ^h7cBBK#J¹ñyC>ÿ¯~˜kÿ—|ÿ«Ôÿ Ìè¯wõ>mÛõm«Þ¨[÷qÀˆKSû¬dÔo'äóÿꀹó3¹ÿ_ò1kõ°~g7ÿxë÷@ûÙúªÅEotÑ♾kà`\Lj4Τ;!Q”¢U=àÃδ0……¼ý?7XÝ8wÿßnÅ÷ÿàI ’ÿ ñýq–gTøƒ€ÂúG=tØÉàùÁ=¸JI¹“)DZ4rOæJâµêwTš@±‡ÍöAÂÌX/<#õNK5¡\³ïëvX@ø×9ýj¶XÚœþ¾VM’ª›ì(€S„¯k·3þ_Ý ýŸ¼ÿÓ.ýÿ¤þÿl‹ð×›õÖýÖ3}J¿­3Köç·š2µß’§äŽþ÷›ñ¡oø€}´sR…eDþ‹NBÚuÐjô_ë¬VÞ!.4äóÿêrù¿•ÔÿÛåþ_!A=ÿ«n½èï+÷®&ùx뿎fü[uðû¡ìõ±ëwtæô&lÅx™•zCqžà=Ó=úûÿmAÂÕu!€>KQð¨!ŸÿWw{þ×NÚÿ¶Ký¿°øúŸì“–q \ÓÅ!ŸÿWw¯ÿ'÷ÿÛåù!ùÙ\ß÷'Îøø—Oø&…ž\û#';¹BbDi°ƒÐÒ£¶¢ Rýðׯþ‡í%¿!ŸÿW<÷ü¿™ôÿÑ.ïÿ…}ëVµÿÿÊö±Ëð°Ëÿkp”þŸðÿWÎÿÃý_ÅØÇT<|÷ä~¿ô¤ê Ѽ7À4†¦–q5°|C¬àÏÿØÿ6 çåý¿B—ÊÿÞ¶WJ€B>ÿ?¾ý¯ÕHêÿ­Rÿ/$˜Ýãïuq?^|ÀtÕ§dÒ¯>äóÿãÛÿZ„ÿÿ’ÿ [³³þ>ñkŸþq5jŠRN˜wa—ìÿ•‡|þ|û¿F'¹þ/÷ÿŠ ËNøí’ã¿©Ïÿoÿ×è”ö?Ÿ+Äôÿ|ð¡ßRÈçÿÇ·ÿkt ç%ÿø_¾Ïœ~oIkgvQû„®ú"!P)ýõk!Ÿÿßþ¯iØÿï”öÿ…eþ¿pCªo€ =ðì¢Ï®ýÐ_בc@´èy¶…Áè/¯Š&A ËYêd³¿ïì÷Ü߬‘?’m _¥ùà‰AéñOÉž–[d——…cqùò¸v€X**ù!ŸÿßþÏ2Ùÿ”þ œÿU3 á4ºí ÏÄìú·Ftö7x =(™ï+ yüo?¾ÿ?ˆLîÿ—ü_HPïÿpŸßÑï ×ïƒÊ|Oƒ0¥*Æ‚ú«?[AƒÎå›á¥výo3þ0P`Z{pùwó­²'ˆ© {'tIhûÔê0è<Ȧ„Ü<ï™n-A,G;ÖI'5!øc—–0¹ 7®7Kg:u'¹tg®ÄÒ=E/Fo,‹ëD€îÒŸÄÈvU•1 }jÔÅmȽõŒTpm ÅÿŸôýÙÌ¥ƒŸjUóÚ4¯°ývšFD˜ÔR“î”á„w"¿Ó¸?H±yf%ª ¹hqösp·9K°BÈçÿÇ·ÿku çåýŸBBÿ3w@ͳȣæÍ)ß?¸gû< ôo<‰m Õ?µéV½e×[­ºÕ¼ÇM#—ç÷¸u”P#¼:ùÀü ¨¯ Wï7×V«=³:5öâpE}¾KÊçp“ÈgDÅŠâÃ÷̓gãSeCþ‹ÕÍúo§ÞÙŽsúáŒæÜ¸£<çb¡ÎkòÙ±oHÈäóöíÒÿßç ©Ê<¼†Ç~ ÷ÎohÈ—A ùü_€ÿ?;yÿ§äÿbBœÿoÅ#Ò êßOŸ¢’/]x¡°ˆ/ð¯7äóÿãÛÿYÍÒþÿs…EøŸoéÛT‡oÞ/"ª·Ü»×ç®]òB>ÿàÿËpÿ¯´ÿ-&ðüÇó[qÄ_œÏ'ÊK ·%[S!—ÿ ðÿeZÿ—öÅ„˜¯¸ÿs[ç›ùwìñŽ’é¿ÑÏÿøÿjü•þ¿ Ï¶Èæùü‚X›ûì_äg`H?¯t€þäZu×®»Í{âjn½\ |»6þÛäûèXuôe•Âås†|þ|û;þþ_Éÿ……ÕùÿÐjŸ»ÖS`íC×~Z ƒ¯'äóïÿ–ö?Ÿ-¬ÿ­FÉý_QÈçÿÞÿl–ïÿ|®°ýE@³î¶í|î0]ИR |¦Ïÿ¼ÿiðÿ_Þÿ/&¬‘ÿ·›KðU…|þ|ûŸ¦éýß’ÿ qGƒþ»¤îƒ!ü·yPa§,1™Éé „_ è'`…eKN¦3û_aþ»Ë,~¹µ/§só/}ò—>HŠß;«ï¬&©R¤"Ù!Ÿÿ‹°ÿ)ýÿ|®:çpr;…Û›ªPÉy_IÈåûñÏÿ-Ãù_¹ÿWL0xøµäË>òÙªíG~ÏÙAúsW£  ùü_€ÿN¹ÿ÷¹B¶ÿÕÉŸÙ£ô¼ÃôÈD¼ÒOÊ7ý¾èÏÿœÿw ÷Jý¿ðl‹„nâ…YÜlÃF Nöq&æ™ìgléºÌáþ`âºp–øX^n¤*¥$YWÈçÿÎÿ[rþÿL!›3˜€ç¶Và¬N?©HˆêÖ°F‡˜r€ÒBû´˜¶P2ù#‡|þüó«a°ÿ)ïÿØ^]Ñ’'¿6žTxäáéÞ'¥².ù±()§á¯;äóçÿÿßåü_LXÇü/dÎþx‹žòøí€ÿ†O¿Ý$æÿr¢ÿü!Ÿÿÿüßîîÿ6Kþ/"HûŸ]÷Og®7éÏܱ ö?àQœ2(»ùë“©„J2(ôñÓÃHD'ˆàP !<zz ðä7¸ZßÞö÷~ÕÍ¿ ê„ý‡güý¿Eÿ³kñc‡ÏÝxß@ÈçÿÇ?ÿ·-Ãþ_ùþo!Aðÿ.²¿?öñMHœÙ̹ƒ×!oà’¿î/Âïì ±‡ï‡³ß¢ßº„¯èß×"¥qdŸxàÈ·\H|žÏÿ¼ÿeòÿQÎÿ…„uêÿŠ}ó¯Ôõ¿ØÏÿîÿÇnöÿÊù¿˜âÿ÷ßVäþ›½ìqpO#oO­Æ™ ÿÞc2c¿q@4`pþï½°Ãx§b¶9°„nrÔêf uK÷U.3!p+ŽºÍP4ãnÇpwtÜuä8r«£¥¡‚[8|WŠ]Ñ((X¸£d7”}~„,»½jÖ¥/«pIÅ*K¢k2Šöq­v°P®=%×Þ¹l%—½p®¦’«¹p®–’«µp®¶’«½p®Ž’«³p.«¡6}cá|]%[wá\»J®]ÌUNÆð;ÿ7Ýþ×jôÿviÿ[H ëÿÊÛ_~úáèý>±ìÊñ/?üôúä¾þÛ /G®;!?zÁ¥;#ß_ ñÇßèPqYÿrÇ Ã¾?~^yõâähŸ4ŸYígF¥ò/÷ɵKfó Û7t`cá|äŽÉ^qäæ’"¾qq‘„—.]t8pËèÚ…½á|Ò‡}ˆž3»z¡ß›úØQtCg€çQÌFs ½‹`<"CoäîTN—?ù7ð'Çû•ÊÖC%¼›ºwȶ3(Òsrwj‰uÏTE$¹©Uè|«ÙE£zÅvH`*Ž@A`C^”Á&®¯BÒzäÃŒ¸¼‰KæԼ߯“óyHùÁÑYޡ܇GÛ‰E.Zm9Yã 3œDåÒ¾4€lÁSíý¹™î ùò¿ûïvÒþ«¼ÿQLX€ÝjJ–û–B>ÿ?¾ý7åöÒÿóg Ϙ"!TÀ–ª¾¹·îyã_xÿš|ïà÷ßúÁÎôwÜÁ\¨~ö3«ªßÉÑñÉ>©Ÿ¼8ùå˜þxutüòýëŸO^¿{»O¥? ¼£zÆËHmˆ4‚Ûш ¨z@uÈ7º3Úì`-êŽIèõ2œùc2qo8®*j,tOÝ>(ˆò+¨;d•/fOAy]»ƒ8p&(»†¾M²çdLŸ™b¦pä<û´±½ý\hJªW¹H0{MÉ~séõ/áÙuN©Jt~‡ºV |ª Mü”AqÒ!ÕÈâDE’8.‡iyjRVÿçóöߥÿ—Ïèúï‡ù,SºïFÞµçÎÀ‘]MÐHÊTÞµ»ÏÞGãºÿ èîGì·?¥+ŒÉÎçgvG#ÈŸÈÖ$”é2™ÏÝÙäÿ™­©p€a®ÃøÝ"ìù©?MË­©bB>ÿáÿÍÀÿ¥ýw!ò?:r g®Ûëû—|r¬:qlú_óþ@½äÅAÆcRù$@EùðŸ}²K9÷@ÏC§°^?1›»É)ÛŠ&Õ$þÚbùÜóùüÿøöß–mðÿ^®ÿ ¸ÈŸG¦ÛÕ­i8c¦4ZìÌ'º‹ˆ†®qê$ÊåþWòùÿñí¿ƒýgÉÿ…öƳÜïÛÓLç äí?JÈçÿü¿µ ï¿—öŸ…ÔÇ·(§F~_z€ãLÏéèè¹çÞuoæNGNßëm–Tã ¦Ý\™|Ñ!Ÿÿßþ»Qòÿg êÖ…èÍñ“U·ë¸õüÝí}9çÃ!ŸÿÿýWËtÿ»´ÿ.$(üÏý¶ÜÚõæîü‰_ñUè[òWBÅÙ'Íz‹ÇÁ÷SÒ*%ÄWrø|ƒ­l”ÇÿÍøû¯6U Êó¿B»ÿQGÌå/åNnôOÜk*)>ýû°Y'ÿ ¯<ñ/~Û 3Fgw¸1òcjšØMœ w³PäÀ›øäyshÕÉñ¡}GƒpŸüM”á£1C2´Ðµœ„ÿÜ-ýe†øe <þïØÿS‘Pò!åþ¾íÂ,gfp¹szAàÈ÷vêOhs°Ã>Íhw|G3DqF†Ó%JN@Jnoo5jÌ™M¹1ûµ™€1ûw¬Ò‡.ÉGK©ïGïÇsÀ÷ÑNæhj9´,,O+™§C>vA`òj±¹!Dâ&íƒ"eÕü¿²@þýïf’ÿKÿO…óûxTOFþäçOtßB‡pà]€7ŒÿÀâÑ»¬˜gúËf‘ñIž®>ÔÊW¾´°ÿ¯lÇÿ­øú¿Ôÿ qþ7ÍäÒ ô‰/™/{âxnPG´Å]  Ž’9çþa¥RÿÓ6»ÁN%Íÿ–e·óÛ.Ïÿ ”1*¤âˆø#â `Ù~©E˜ŠQS•X’€‹¾ˆ!µbªÖ,IÜ"44†ø¹±AÌ ™?U)Üûɦݣò-’Š\£‰s™ºh‘”N59üKé´Œ¥DP¼<§“*ɤ¿¦˜|*¨"21U`Xd˜ý,dA?ŽL†D= 57à Z‚ªí°±1œúADOÛ-³á‡Xó ’ (”Ö!JìÄüÚé¼ NêrA_Øn¨c¹×ƒkн B5øÊ¥jc£×Ÿp’7dK-[½i8ƒ”Dü¹¸˜%–Òƒ[Ú†X(f¸'?¾~s{†ìéøÚ€öñÏO­FƒœlèI[½‘„çóáˆ×P f>t'ƒÐ9?=3m^àQ¨Ó³:ýå㯈h„™;ö¯ÝªòlÝVí@˜8c NÌàH÷V8žB¥« ?Ei¬ýhÅV5•3ìüÀ­ŽDÒp4.I¬¸¡?u'K7œ¹99ê$^Te#p¡38uc[Që$LÒ˜{‘^ƒÒêÆu-™E#dgg'‘!è;“%à9þ\8†6Là36œ)ƒ ±)—’ç:»Uˆ±ñ¯5MÍ®†’©¢qËð û‰ÈÆ6¤U­Ë`¬Ç燖OªÙãàŒ”ˆšÏÈ ‰z¦lš P²wzB!;æ¤Òˆ—±ÃeGg€´BEYdô7-ÓÍÌ …LZ4¯è?:ÉqÅæµTàºWf@ìÏ†Š“Dˆè0tG£Do¡X™¹p/ܜֹÎÌÍÌRœ™àê™㔥źLÍód$ÄjÑ´ÄSG¤j}ºÁt'EÎÂm¸­á%-‚¦˜,&~D®† ‰ŽüþÎ)Æê†³»T–>Éă´Ç`ÜdOˆ Rù„³^©ó ÂJ2M̰Yjºð¬†Hcs'¶ ª?Æ‚N²? y!jVL²<]’ÐLÎìB£‚FÑÑ¢ƒ;Eÿ¯i·:9Áü(bån%©bñ±.fÕ€+Ì¡ht5£¹O½ABòÔyàÎRSC—«. v %è&m(ÝÄF>äYyã+(Ñ(«ÇWAjSR¨0é Б7qUV×’ï ”„¤P)U$j§¥ÉTPôST5 ¹´²–™'EÒƒ W¨â+³ w¯ütP’– ry“>A(ˆ£)"Þ>¼H6OÈjá²$‚0~¢Ï4¾ŠÃ¤ÓôˆM4ùС•© HªöA— Ao„—0¯÷‚pàùiŒØ›UÕ¥K+M€‘ŠÜœˆ¢“² ­.‚nÍ ÁªÛxâÙî!=Àù1/¿Z¥QOï˜ñ–ê¼¢\–¼ûe‡ÎßÿCüüÇêv;¥ýw!!ÕþÎW•íöBª‡Ûèß[ÖAu‚OêRoÝB‡jUAPójThÜ6ù쮣–Q­jÇ :ø}¥¼CöH!ÎÿÀðÁ³õ–>ÞÚíôû_Èÿc»Ñý/p ÷¿Ûë%ÃþàüoîÿÀOGÞðn=aùþït)XÙÿ„œþ?¶QÆ ”òí¿ãú¿m·ÊûŸ…„‘ßwF ãSÅô¨†ÿÃÜ ^èÙÎ~ònµFHn‰_¹$˜Ï\píÌÐ ·#cðÿ´«üá|B™3 Hõ“„‡ðO=ôà·¾³³s_wØo[}/ 0v?*š«Ÿ¯'C¿FùŽÁÈ IeÈD|…’{Ì(d ¢ßU¥H^‘ÅÕ8F ŸÂñ/w2 «"ß%‡j ì'tôsBàçt™„S¼òf”ŒÍgôÿºö¼YÙ€éÏ e´ù(TÓXS²¿µ ÐQœ®“Çÿþ|Ö°ñ eäûiÅ×ÿ]«Ôÿ Ÿùó)ñÛl G]Žv܉ TÄ¿¥`æØê_ºý«µ(€ËëÝF³SêE„¼þ_Ç/ÿcþ?m«Ñ*ïÿrå¿ åð-†<þOvÿòeäîÿ6ë¿v£ôÿ[HˆÖ:'¢§åbgÙ¥NúBG]æT‡¶.Œ¯úhÔóÉ`äÒ5ßsX˜Õj¥¤yìçÿ÷G/^ýt´Þ2røßÒýP8«Õî–ë¿BÂ{Ùõ„u}¥ò“3GþÑ  oæöCvWÙN”Ôs¶©¤ž&âQr2Ž=…ñ,¿ãŸÓôÊñOo˜sñ¡?ƒWå&ð¾ÎS°Wi+#·‡|Ž ï¡\ŒñäàŸ0÷·€`J˦u+x GPµQÚèGÚv®CÛä%>O*^-åôÕõ9q^ NVxÕÝÇĪ„5"¶‘Ò¨Þ`uö]‡ÌΔŠKöª“§ ˆ±üšŸÈš„˜ÍŒJB¤[a[6ƒ/š=B ¹gì¸\Gó°–Áw¼øƒXTl;sÚ­P:./¼ ùx b•i¼xÔt fòSÖ0ðþ,¾ FÁYÁbÊ è 4à}Á¦EÚ„0¥«ÚË]ÿ\Ò–ƒxˆÏ¬:lüLB(Æ xuáµ2 ¾V© O—Pû0ÏSøƒ ‰e• ÄxÏ´v"ÛÏ `'L4ÀcLµ¨ðÓ9/xù#4¬Çx}'€±pMªîítlÔHeÞgùóf³¶¿OÿîÀß,Ï(:—ð;¤zæTIñï#ñá^Amé7Ó#àˆª7ºÞïÇwTœºh •‚ü#ߟ‚‡CQK¤_ÉC ó´PÍM âôL6 @UO¢Þ%­/¡F\xo˜ ë刀s—²„V2^SáEãa£8˜RÙA5½º². *äÉ1vúNߟô©úâ0Zg„`åN¶­©n’Íý}'NÔ„V’ÌKž€QùÎ8Eïr«M9­ÊË P {¾ÝF?±§'¼­&ä{š‚í$²ÍÏÙh¥‹{ ]oÔ­v-jgl@HøOU4BMÐ6žàXöN\l(L½ÉЧ¢ƒú~¤ËÞ {éÏÁ|ÿÆÁ9€±sá¨ðŸATžøÀPþ"U΋ÿÙ|¶ù^_ÆY ØøQ,+[$Ô;—'îmøúŽÉwT.TÃ*˜doTþùw¾C«èÓ†Ã7žnO‘„¯LM vàZ8-­ŠýRM«bΧ¼zÕF4p·DÅdUÕ꛿†§Á¼:þÙ&ë ʬžÈ Èœs“ü‡T_Sµ9ôY¯F£6Yë) †ñÃÈë£ò8JÊî‹ ŠYLlÞÔhÁ5lx^òï;.òߘ É»tPÊ‚@cÄUͤÁºÇœm2Ì$9 (ÅС¼Kˆ`>§½ôÇc˜Õ@^r.Þì÷ÉæÊØûÏ&Ùöq;î­»C—à7!>žù0dvØÅ(:õâœճóÉ熪K æf¤UÄAìXcŠŽØPæ•”¬Œ‡)‚¨+x3£ðÑ禠}Qˆæ¤MÛŸ‡¦ÞIöyžìZÞ¦Žjញ½lÏIJ/Ý3,?èâ«uP„gÕ~ÊÀ¤Ž~PáÒfÐà°E<Ú$”Ãà›vZ|¶`Gb²?êP><¬ïòŸ ýZix¢„œ6cŸò‰]µ¹¤ F­&ˆªA.ëʆ@uÀ ¾iŽj æ€_'›$‚ä8ÑHJ?I }ø°ˆÔµ†ÓF¨z¶º†‹ ;,ÒKlŒýØdléâj¢FZL6EzMmäw©¥a›ó¬A8“† ýb4B%8®@û™ŠJ0§ÃnvÇç&©âËñiŠ6¾ªƒ¢~·¿‹!Eù®ê$Ò¾”éÒÔ ?¾xýæèù×ë“£Ÿ¼?úéˆüüþèÿüòêõË#l¢ цX<–+âʸXS¨ÚèïtkT÷…øþßZ þb!ÿþ_üü§]ÚÿböÁ¬ÿŒ®CT#ê––´M§Ø‘Üt÷Ü™‹[D;‡)¹îËqþçgqk-ã÷lxÿ½´ÿ{üÒÿÎÊ~(!ïüßVú¿eÛ(ÿ¥ÿÏBó•{Ü ™ÿû[ë°Q‡¿öaÜøÆ¯usWÀÞæ·>Â9 ðžæA äCoÚ=>)zÓ]üMÿÂsBx•<¸ñÂþ%©B¤î BýÃ6*÷“q¶ŒkµÔÔ;tæ£0‘ N%Ðá”GLZà…úp>û“°7µ0­‚1'þ”F4°ˆµ£$,ÓbFh9’QÖПÓѹ[ˆF0˜¦DVQ2‹ˆ2› ØÕ è ØÕ °ŒØ±ƒ+¿ì¨ÖÍ4º$héàó‡4ù¿ò£/JÈÕÿ­„ü·Ê÷_ ÏEµµÛ>m Ù½õb:ðÉ~Q΀JþºCÿ7 äýþã»ôÿSH0ò?åñfws;ýVÛèiŒ´Jo>ßVHãÿ•}RBîý–ÿËù¿€ü¿¿´é¿eïñµýóûõH¿O楘 VÓ’ºCß —Hòƒ"…B¹¡ð(d‚ZVÊ›Ç iü¿ò£OJÈßÿOîÿXåûO…áîOçþfKp³Å¸?Éë¶#a;x½ë»ïØGɺ_AHãÿN‘üß´’ü_Þÿ,$Ùz xW]ý·š{âóŠ~µpÓ’ý¦g¾g€%ã=!ÿ»EêÿVÉÿŸ+°ó·¶w@ø·É‚0UZ(Ñ( :ÊiO«%Ï~@.´v…®ßÚ"£Õ}þü¶ôüCÿï9ÿwìäú¿´ÿ)$DŒ½·ÿï™ùù¿ÝjA»…ëù(½FZí’Ñ¿¸Æÿ{EÎÿûrþ/&0Æþw/ì4òùŸ%øŸEÃ|Þi¨‹„Ž%¤Aw÷¶ù!ƒ¬•Òà )ü^àùÌÿKyþWd»}Ÿr13Ã-aþåÄa>ÄO ÔÃàêX†-ra€ü`ÚUŒçœ‚¬Ø;H¦L!¥ÛˆŸ2t-ìÖÔBH´‰3w‰MS¢@ÛR/º–rx±¥FV«Ñgí©…U^‡ÚÎ!”o"É£Q…Ù/̧ªxP–r\O[5Q˜À¥”§DÉ"€\6”Ff5j@¥H%j™†`Êä—H–A“/xûG-ÞŠ«Q,s9Ó˜Cšü/Òþ£Õê$åyþSH¢:ì4¥ìŸ ìç çÎŒŠfí«ÀŽM0N"æ<ÓO5*;mŦx7(fò©ÅA”Ï$|  NÁ0þ0»ÂDë ¤¹$íu 鮈$î>AŲe×" •®²•R÷k iò¿Hûÿ†Áþ§YÚÿÒú¿@ûo«i'×ÿíÒþ£PašùÖíi묆óvÿÇw«[Õ­»Ú©ÕH&+ºÀ„¶¡!³ˆÆy»m5 ‰Üáo ÿ†¿í¸mH¦õOívŽœÐëcä…öEËš¨…u”ºJa»ñªþ)‡­=å€@^H«Ð^°€iÛD£ÈµŽš´uÇ2§CÜ¥%y˜±¥ØÕƒ¯4ñÉÌhL'ƒ‹7ÚË8ù¤M%a´°T¢ låŠXT;ˆÔÊÕV–[y5 ™‰ÜœÈrÚ8‹ì6€.(Ê&ÕV½]ïÈ#Z!¯è´,¼Òj–®¢"–ÚÇ2!Mþiÿßi%ÏÚåþO!!&Ä'&)¾åIAÛ¿¤µÕ׿ÇÞø=~ô!›v×yÈÍf}àÏÏG.àgKX}HÑ}…ñ 1Öjª’ Õd’‹’ÈáëüïS[þjÖ¸É1|)‚¡â‚“(‘±‰£Ù&Žæn4q4÷ÌG³û”Ãò‰£¹gœ8(“ymëHp·¸­¢Þ-»Ha–ÆÿEÚÿ·ÚÉû¥þWLX„ÿc ÒR4«–¢Yµ𕵠#´&FhK"ìӎˇ¶&Ú1ùжë¹øɆ¶­È††ÃÐx¥´o_¥HõÿÚXŸÈ·ÿJžÿ”ï¿äÅžfþõŸÿí…ÌüòŽCÝq¨»¦Ù[l„›ªùMd³e³¦¸.ØTn Bbe(M¿=¤òÿ Àrïÿ¶“öŸÒÿW!!ÕÿÇ®TÇÁýÇ®pò³ÛþÓaCþ~®'=?Ô¿¿¯â÷ÓªµÕ*¯û}‘!•ÿ×x0—ÿ†ù¿Ôÿ ).ü`[®ÙP%€Å<ú±_‡‡ dé¯;¤òÿ @s÷ÿë:ÿ—û…©ÿ[í…VçA+ŠÍ,u @q¡Ù€\؇c´ÙlJ¹C#Ð × "– ,ß_Κ9õ?™©¿g¦~—™úüyfò÷ßëɬ .?žVo¹N”Á=²æ”Êÿk4ÍÝÿëÄÏ;T'(ù¿ˆñw1þß}ÿwÙI_Kãÿ]¾×‘Ñï„ì„âÈcºº„hïÆ%D{/bÅ63&£aG¤´èÚwßIhú»ÊbŸ?gPµÚï¿ó Œiˆâ|÷#í[[Ƥòÿ @s÷ÿþÿéü_Þÿ($¤ùÿ·:‘oà†Žœ¤¹; «#·ÍÑ»%NóÙåÍïX‚âÞ‚fெp\V˜xWSðŽ-ÝNl©ù›ßû}öÊÿk4Ì]ÿw“ûV¹þ/$¤šQwäþLŠÌ{ð#cw%Ã)ûZ$gf.Þ:âé Ny9ãK©ü¿FÐ\þïÄßÿ*çÿ¢B:ÿGܼ'.^vöž²?5SÚvFÓÁ;¥kð/-¤òÿ sù¿™\ÿ—ü_L0¾ÿau¥6ßµ²Þÿ€É½+×è®tÛòU…Tþ_£`îú¿a8ÿ/ù¿ Ü9ÁÝžôw+ÿ·rÝÛŸß6¥ÑÀá-†&³æ?wnñå¢+„Tþ/Òþ¯›´ÿ+í‹ ò9Êi–úÈK@#l²u«¾óÂâ –‹¥°\à>›»VÂÑ­<1ç[îÃÚSiºP²ý×Rù¿Hÿ­äû¥ÿÏb‚‰ÿ[ ó+ÿ)ºÒ{ç×Rù¿Hÿÿßåù1AÞÿ;¿<ö{s7áΛŚ8^xþo²·×†âhžE•‚àË ©ü_ ýŸmø¿´ÿ+$¨\_ݪžgiðr³vÚ>SXœç!ä7TJ6úúC*ÿéÿ/ñþ;ÿËýÿB‚‰á/üÐ'CvL[&„IïàWh̉?…ïÖ>€‰ÈŒG—báë ©ü_ ý_Ë*íÿ>W‹x»]ÿíûóIÈöå4€­iªjmµlùJwØß²w…ÑzÖh(¯ÐD¼Â»5­í`yµSˆKñ(^F³W= ðOµgx©K#øcJ­4þoiÿ—¸ÿWžÿ*̵Îð°½CWÚüÃ2¯Àpu¸5¬)÷pK ¿¯;¤òçÿ–eÐÿËû?…„Ô÷­.ÈW¼ÿÙÝ•~Ð$<¶|Þ÷+©ü_àù£Sžÿ}®`ÜÕËØüÜô–a½!ÿÛŸ[ÿ/Ïÿ ¥þÿÇ)üïY *Ö$²ùß²»Éû¿M»Üÿ+$È£x`ø^þÛ´{a/ܵ’¦ f5# 4ÀK§…-r¶#Pú5 è7~uT •„E`T7_Ðøv3ð} ß^Jƒ€­ì5b1œú&X1JDÛ8d¿÷ì4@Âaš1K¬­k§7òHŠÌ4z½¡7r{´à½¶ÜÏíõ'aä5¹7 gÊ×¹¸ò³79ÊÅe2ØÐJùñõ›#úƒv{ºtNPÿü”Š’³dÚVoäáù|(“=ó¡;„Îùé™žÔ <š–ŒõõX¨ðÌû×.Žœcig,Óêqˆ@xNª)ÏÆ5:!•"2—1ìü€fŒÅÒ‡£ypiNWúSw²¥Ã™k­›Ð£¾¸Ðòjù ì8´ÝðÚ W§ÉõhäÇj7Ñ?Æl;;;1Ø ïLXÓÒ9¦ÔäXþT8OØuF-Mmym,>“B£qˆ]¸aß<‚øˆ@¢‚KŽtÊï£ew&H„, *&‘ ùÍü¤Rëø\ê1í³xJ Öù„Q›†7ÝÀ^Î@Ü‚U†½ú3ÅÍÌ Ýà}Mçm¨E³K:pÝ+ ¦£z¢i(Ü‚XÙtº£‘¹s±R3÷Æ› 2ú#×™¹³Y†XtýaVêlæ§äƦÀÔÛ8cÅdYb DÚˆPî€É[5r'7&~­t¥Õ¿b³Kj}ÃÙ]6Ã4Ÿäã‚¡Þc€nJ >RÀ²XŽ3³­sµÂ–:Fc{N3g:Ä•3¥Rzüi¨öHû¦`ÎìBËL£è؉GÑá¢ÿ—Ìϱ`½Pù7Ö[ŒLºÚrÃ9اc ™Æ"}¸³ŒôÐÕccR*n2GÁMzçóbÆWP™ÙÆWAz"Ó=(3§¨ è‘7q397¸ƒâR41&:;­„˜Zu–îÙÖ¾Àéò$tŒ$e-`Õî•¿| ^[X¤N ¶”R8›ô|`l9 )r1ÒOÙÔÑ2)èŽÃ\íÁ²Uº8 z³ ¼M „ÏOáÛž:™×ú½i·Õ<ˆ,gºÌµ=|}œ»ÁKq»Ò˜fæiDÛNµ›üDŽ¢æ5h¼wsIÛä¥O¹4 ñ*…ö{ÝV[ÚïɼUöK˜Òˆ2iŠB!åA™òœ.ëj]u3‡Ý„ð?B‡•Ïèlþ:Ù¬ðTZBî9bÖ,‡‡–Àªˆ¡8¬Ú$4‡Òï m]íXRýŽ/LÏØË?î(pµŠÄZ¹u Ä‹h‹Èê–ŠoÖÚÜÐ(_Û¶d;H<Ì * + UZ½ý½hX­[Xk¡À,Ri²âjåås [Ì ªÛî(I2ÒD7Ùj*°!]{`Iø“1"ªÑÁ¨aÛÒË$5ÎN\¬]DQví}%‘ †P²û0ÎzÑ"¶Zp´¶vÅheâÇØcņikÏ4LÉaÚH¦¬aÚл»‘9L)ôµÇ†)×Ä3k»Äø´LãÓ2œ>>‹ŽÏFúøŒU41î¬ìq‡ƒ!ٟȹž¼+KüÓa•voöh?í˜&eÿ?´Š|ÿ×`ÿc—çÿ…„´W;B›{üäïôÈŸÉW;têÖúÔj5m“Bã[15„F5£{1XM’ZæQ ”“Èò ò!!•ÿ ôÿ×´“öÿ%ÿ„sœñÆÞøÜë—>rX×à ¢å…@]vD¸ÜÞA,ºº5¬±jò˜©ïŒFݲ˜g¡CNÈ4Í&;@Ë2³ß4AÅPJeB*ÿèÿ¯ÛIÎÿÍÒÿg!!ÉÄò>O´I!nÖ0•”'jÑ5@šÔÑ® Òˆh¿!¸ñÂþ%î6ŽšiÿÿôÀ%}' B«{ BÜ¡3…:8+ë‡Ùdh+Û •XЦlpÊ[ªÖA‹æàLï{›m†¿ ~lÖE•Då#R%þ¨Ù¾ŠlcÙ¢¢x¾SÑÛÕDè÷rÃD*[]`”îg¦òöÿ­nòýŸfiÿSHÈàÿhÇQŒÛ¶¼ЭÁaFtüÝÜ£’«ü'æ¸w 3}¯sž±Mm„¥41…­+XDD ‡¶íZ$µ8å GgÀðë“$ŠoDÍHåÿíÿ)ß'õÿòþO!!ºÞÛnDÏÿ Æ¿ÓoSß?Yuûþ Cnt"fïH)}VÛ¹­eqhçb¯/>¤òþÿšVÒÿ]úÿ($˜ñŒÛ›ü5Ï6Tl±Äà.SÔ À]Eg¨Ä`ÚÜeSw¹øðÆÿvëÊ÷ÿ>SHéÿ6Öu$ïþG;ñþC·Q¾ÿZLH»ÿa¯nx± ¶zkÃxÄV¯lä\±SîlPZÔK vÚ­ JM∭ÞÛHà”AlõöF§~ÄVotï‚Øê…í2ˆ­^ãÐÛ)2€²÷Z©@‘A–½×N½bïu WBì½nwB v´oïíÆŒ¶hLúµHü²ï… …k»‚زn†ÄT¹Â!³.‡ÄJ0ÜAˆE®‡¨€ÚýÊ ™D´Œ97D²a¿ì+"í…߉õtÎ%ÓÐŒ[R¦Àį‰À2èRlËW¾(b@½ž›"1ÄÊ@O¹+BS´ßùhÌ÷E£Ø=ëCO™„2/0è…nd"NÞ1‰ý∠"~sÄT_åêˆ1Y½;b*c™Ë#†L·G²¤÷R÷GLô&.˜jm¸AbÄ•¼B’•‰;$),f¼D’Îé«ß"aͺì53Eå=’‡Ü#1„›Œ°ö›$q $ï*‰ä¥î’DÂOjä™êZîuMaK»ObbtýB £K]Nä_)Y<žC_ž,p­$§ÑT â7Kb5¯Œ´»%1Ø$ÚxÝ3Uý%î—'‡Ø#Ì:o˜XÝ®¥\1¡Ÿ¶\Á9øÝ„Xã,q©„&Åý¸vw-éù­k“”‹&4­ßáívuKÎj•Óöüp¯[ûî;ñùý¡eÛµÚï¿+¶°×¨ÕRî›H*ùq3¯,îWKš«üçÓȶ]4D„àL¿X%×"»yü¬U¯¬PÊåg“ÕD~ïÕ¤1|dÃ.SJÚsK±š× Þ Ñ>å<£JvC3I7ÝÆùKGmò›ãÒ²ÝGäé%*¶ù¦Z™³©•ÝÛÛ3÷g"ï}ü|€Ž´e¯ZÀ°6Þµ`¬¸äe Šm7yÛ‚ÆÊ;+]·D‹ß·hó… Ótã"¥Î±nM¿rAY¥¡—(ö3^ºà•ݺ¢2¯]ðaèZ~ñ˜8ÐU®^@rÖÝ _ðÉTÊþÿÐé‡k³Ï9ÿ±ZvÂþ«U¾ÿRLHsçÞ±ÚB pàKú‚elÕ±íxD¢)ì>(*Ê?¨B0Tâ+f9Ú±ö4ÃÑŽµ+¥¼ÌXe¿¶ÞZdnF)bÓ¿ \\e¿’•´¼¸A%…ûþ°c²§¤Äh6+À ¤# WUµ…j¬Ìd;~+¦c7cvt´e©X¢…dîZü|½c·Œïš%%)Yõî²U¯ |Ž-nKGÊ*l6jñŠìª‰ÊMÖb7Y‹/VR?NH;ÿgg;EœÿÒ/;îÿ³Ûh—öÿ…íüwèû°”¶ÔG¼ï¨Ói[ÑìP…3€ü|.^øñOy~à,?ýUà?îCŸ)¤ùÿEÿŸk*#ßÿoÒþ¯äÿb‚ºzcwÖëÓE4œ<ÉWtûLý‰ðÏ]2<0¤óÿú.çÎÿ†ûÿíÒÿw!¡âNæcÚv/ìà~Ï´ÕîýÐûñÅ›ã£ÃF#:4âäý/G‡–jö£f<÷ý‘ëLp½Ù »Iy‡ zÓ–z}¿#Ÿ%¤óÿú €óßÿHÎÿrÿ§€Œêœ¶Îð^O½YoÝgMöΩ}V2ê7Òù}€sçÿVÒþ¿]¾ÿWHF¸4^uN­èlxŠæ¾ðKXí*ÛNoÚ¶0:!+0¥ò".QôR©.ÐVuüÞ™–‚æñCÚþŸ¬ÏXÞùO£¿ÿÑi7Kÿ?…äLïoùyêeß讀#$Áyì>pîFŸ»ù9váú ÿ<¦kö^N4G\§¿DÜÞ³ÕÛ‰v§¡\dt¢‹Œç‰‹Œz‹Úz´µ8 wLÛ{»J4ÐܱÄÁç°oÚ°“ ט ‡ÐÚ’CÒD‚yÒŽ#vcEÄ9€àYGK¿<òT$º†ÝÞ+¯aÿBºþ·>¹ú_'!ÿRþäúOSê¨ l£-'ȲvýFíÆu¼*B>E¨ÚS1©{hYÛ›vÐ$€<ÂSÝÓ&X¯µÅoõ‰Ta¹Yw¨Iÿ±ÎJy´þÎÿës‘ëÿ¡?ÿ¥ü_®ÿ Úùouë}@_¹w½a/Ü«1a³¨×nœŽï¨nâM.ztµÀ–Œ&Ö§ë¹**8ʶmÊäŠë^·¥ì©)V££$Y =e‹–‘/ÙöîKéüß)îü·eØÿ-Ï Úþe¥lí·äPÚ.ÍKù­ÛÐù¯Û(·q¾èÎÿÝâø¿›Üÿ-ÏŠ ÈÓ¡˜èáß”KEÀÌMU(àû,âcëÚ9!ÜÝ‚÷„gÞßh)"g*—Òù·8ý¿iàÿÒÿS!!•×»*ŸËǨä-˜]aÝ—nšŠvw7~÷ ¯µ´[UzŠ ,T½hʈ¼DþeP'åew·Žyb*·[Ê—ÅC:ÿïgÿÑJÚuJÿ…y4cÙdëÖhúQrÓ7Rù@åÎÿVrÿ¿]Îÿ…“÷,Ý1ÇO|?iæ‰Í~ïÐj¤8#À§Y؉¬ø O¹ :ýF×±dª£huÒ÷Ê ÿÁ!ÿ‹³ÿ6ò¹þ/$Åÿ» ÿï.Ìÿ»%ÿ?rHçÿâì¿­Fòü¯´ÿ,&8Ý;lˆgáp7 Ë ¼ä½¯;¤óqöß–aÿ¯¼ÿYLH°6;ëïƒçš†|õ 7Cœû-mSGÚ¥HøzB:ÿgÿg¼ÿUžÿÊÿÒù¿8û¿F7ùþsiÿWLˆéÿ‹ ¥ø6B:ÿhÿgXÿ—öÿÅöþîÆqGãÎì‚*û–­žÿ¥ ‚F)¾êÎÿÅÙÿµåüÿ¹‚ééÍgàéÖbW‚è\´ºú­KK ±Í{‹¹M¸ ·1——–â‡3ZFIpY9”ÔGÄJBë›ý}g¸ÿãþ¦ðSIÉ¥y4J…sjk7ÓŸ/óRú­ˆ¿tþ/ÎþÏdÿß-çÿB‚|{H˜5ÉÖp*/[Ÿ;³^hµˆbí #ã}! ìÝo‰E¾éÆÿvqþ[vÓ ÿ—çÿ…íþÝÔŸ€Ž|G<?ŸÐáÁäÝJK^ ¶¶½©Ýèn†—^@ØUÀ̓T`P÷ÔÚ;;üÔÝ­[–U‡Ù¼iÓ?:LçVcÿèý -úwþ×F°½n”ÔhÜ' ±¡ÝS«# yÖºoðîI¼¬ÿanÞ2-šÏjȈ  ß4B×8p+Å¢FMf5OÛ´PÚBÒ—U¶ZHèikµÕ$£ÃcxæØ B,­‹Ãv´&H@b‘ª#Œ( ËÞS2ël…0åÏœ¨mëðS ˆ%r¦ÔÅ ~̹™d‡ÕÎn6i[ÒZ´†õO6Ö´þ©YoÒ¿UvXíöÃó#í‡çÇ*vÓòçå†qgïÆs7é¿ ‘ão·wjŸñ;û|S:ÉÜ|,ãU]v•@oˆ¢ ®ÆÙ,®£Æ¡€¦­FµXCk³¸®×Á¸†Vl×·›,bÏ@ »pL€ÉëÑÒ"YE{Zd“E¶µHS],¬ÌžV«c¢¨k¢h—E2”\p¨ d‰Úb<ÎV[‡Ç5 q-¥ÅxT[¥ÇuTòx\Wm/·«6ÛS[KÜP[KDZJk‰8Û@èÞzk±À(!(‰Ö~j j«1lðª1XV^\3Q0ó3i&rµdŒ°;·¢ts¥ï ˆ„q¾nœ1’X‹F‘¬™wõH$loO‰´xvÞ¤Q¬¥´~ËGœ]® éúqö¿­†]Úÿ|¦ ëÿíÅôÿÎâú¿TšÝHYàßI!Ã"cB†EÆ„ 42,¶2¦ÎÿÅÙÿ6M÷ÿJþ/$èüÏ\>"ÏÞŠ5áêQ€9‰˜sóv ¸°[¨Z°_â‰>ö¡ÃÞæÛŠÒøcˆà°ÐIËu^ÓïlMÿr ×8žZÉ㋆tþ/Îþ·mòÿUÚÿt6Þ]Œÿwü¿kↇrd[>x_¸añŠó.»ÍžóK$TYŒxø“¡ˆ^úd©º@¸ã^¬í#—÷•ˆŸtþ/Ìþ×jÚ†ù¿<ÿ/$èl¬8cæªz³¼¡ õá'Ø$„Aøÿ§O¶øÿítÁÙÖ4o+Y­zË®·hŠÕdŸvݾ‡ÿ‚MK ÖR~7ò~§ŸPÚù:úøŠ=fjwvc]ánü;« GωÚÌ™¡|¾ÔîD¯lJAá2 Vj&æEMÁ´—Äô«1 ›õßNQg;Î)Cz¦<ŠJé¦eDU”ÅVٯ䣨´límP÷}Óô&*¥K#éœKÁˆ¦s•–Î.{æS4¾hÌ*ûe ¥ÓŽ¿SJᾯZ­Ö3«S3“Tz—Z*¤Ëÿâì¿“ï–ç¿E…ôE[W>½%„IG•,ðoÇ~iË4®/±”ÚÓVML=ûõ´Yúx.6¤óqöß­F©ÿ}®`äXâD>ߦ3wH#v¥Ê«œî^ÍÇóÛ^Øl¨'»éß%4ðÖ2pÉW_eHçÿâü¿ZÿoåýÏbBŒÿ­þŸOïb⤚ÀÌ4JæÿZC*ÿèÿÕèÿ¡äÿB‚yÿrvÓRm›V“kéôSÑK–ÿB ÿOÛ úž·Ó_ƒÈä«Õj$öÿºÍN£äÿ"‚öþ[¯GÿmÚ½žsêDO½i³~¯7W ºÔÈŸ\°O§Å v xTй»Áê´ÐÏi@#ð®E`5'ŠaÀVN:ÄN; gÐ×q6SÚ&ð~sD+Ö.é°”vŒÙNÄù‡ÝIDª{oëÚé¼Óvå|¯7ôFn/€Øè€¿×Ÿ„ÂHg«7 gÊ×¹¸ò³79ÊE†º¡(ÚX̯ßÑ_͆ô%,c F¾xI>‘¸Õ9Ax>Ê4AÓ|èN¡s~z¦'õ¦%c}=*=sÇþµ+\Ôbig,Óêq…BާPWRç)µ¡J1™ öG~@3*ØbÃÑ<¸LPiúSw²µÃ™k€­K@o0 í¯Ñ(G»^§‚£ˆºÂ ±J “CÆpÐw&  ¼iéUjr,*œŽ' ì:«ž¦½6–ƒI!Ò8Ú.ܰŸ2–ø`@â‚^KšT1è£Cl˜]*X]"0˜ùK¥8Öýù¢öð1S=%í|ÂèME¬ tà6gÀ(§- ¤h¿óÑÜ̼Ð}Ñõt¦Ð‡ž2 %à×½Ò¡aÞª'š‰.Œ˜Í|¡;¥t6ÖnæÞx“ADä:3w6Ë’›®?ÌLžÍü´üXÆ”C˜NmqI—’:J4™<`"€œK§—‰ŸEïpä÷¯Ø,”^ëpv—ÆpÍ' `&è1H7­»‹)p™ìÈ9]×Y^aY¥¹Y§™“""Ë›€…¡¨g’ˆØ7sfZfE‡Q<ŠŽîxý¼Ô`~Žë…Ê¿±.cdÒU›¦ˆÉ>ýSÈĈéóÀe¤‡®¦Ç[“Rq“=n2/h|E™9o|¤'2=…²vš’y7›ƒ;(0Eyc2µÓJ ?©‘gªksq…-!íAzÇéR—F9î^ùÉ£çЗ'©óŦRÀæŽXÖ4¾2à4™™D¯{¦ª°IÉD†tpæ+—£óÐEgЛá%è½ x~ G÷ÔYJ[ÿÍQNB%›–a…\ú3ªÍàe§¬cçbYÜ4­tqZŸÃ¿ ¦_†:ƒ'£OêGiØy%Åw¦Ÿ¥ì¦/Ó§Ã ƒQvX•û¼6­FZmè‚×ë‡Þ˜)V­øžA4ÈÆ^ÆHiÙ© Ó Y"m?w2ú“yÍù¡÷ã‹7ÇG‡:~œ¼ÿ…þV—Óø¹ïSŇUªÕŽ5‰Ç¶"Zê6Ò%dì|ðYk¶ºi ÞD€¨›4êø ~oìx«$ÚÕï ÜkLk7ÒÌ9©m¥UÕXúq!>ìd*´¯Xj3™:9[éç½Ãú¬ÝN²–mÓ¾Ÿ¢®ñÑ)«²KÕÚKÃU®Óˆyž¹£4[D¹vg¡{Û»Œ”‰•Ù@áuï4ã-$w݆tâWTp²mßJÝ8ÃO ÖÑÁ¢x¢|tSùë|tÕ—ß·G$t/ ”Šð´oi†ˆ¥Y)¼"ŠcPv*+‰A5cå7Kj¥õÖT ÁnêXõ|JioÜWî‹ï Rm%Ä)ÕxøHë&œj®tŒAÚn#ž6qD¾]+žÖŸPv©*O³Z ASg cSvœ$SkAea=À Ú ¦‚+w;±–˜Î<–ÐM2N¿?3¨ÝÔ±Jñ"âûÖŒ\âϽ†ÞO}ª°KOäò~ÏŽõ”œŸöâ#«/[b/ο7R'ØkÇH€L¼{±aEñ\ݔƧªïOlÝ¿·«³}l»œœ{á„7èÞ^.(]û—݈5Útæ÷Ý ðy»ÛXÛ…¾Hˆ7ÝÖGÁ1v#!£™Â›!Jrc§O5´ ÔNÇ4œJ¨ŽyüSð]`Õ(i7É‘TÖ±4Ó¤ÂU¼ÊŠ5¡$Ò¶L*¢PþL\lj¶ü°­Œ‰e®€µ²p[•hS™„‹k4®‡YšiÈò™ZÚ7{O¶»•Ѷ½¨q³¢æ‘Jh«gPHÇ¥pÙ‡nê„gU[qÀ8;µÎLÇ,´5½¼ ж×¾çÆñ¶W¾ç=‘bÒqôÕm›Q42îE Û6µ#¦÷@3U#çóªm\É0ˆž‰š°÷qNWO4Š5$Â];£SÛØ– ´ø•8·ôÆN€²Õn¦ÎÈs ¬Ý~¥+9ã˜g ý zTܧM3}jöè÷®¾´EÆî¸?½“{ÅÉ-ãš!;[ _|R’°”ý‹j’ËEì„ !N€åU²oh/ëd òÀvÓí‚“5¥=Ú2’Q6À³a&I<æbÕCšïv8‹oÑå6ÊåLV0µ1”ιœ©çC©”ôƒiúÖk„nz>»Zláb+•þ¨ÐO'-j?¹åºXûñs…¬:Œ¢Mëøip`8©BŽ¡ÚWþÈ›˜áòHÌ ;®Z3õâÍ©lS›å§ Û2rk1Cóø¤Ie*ÊC³8ÄlW= „’<ºZZÏå]L;ïûËHÍóßÜ™o:K4®šÌƒ—CÌ2@PK œl%ûR¦—Ž1….‡9æ9Y°ÿœIâÌ’ÙаUéMÌ%ðúˆß'Õ”Ãýø!íÌ• [rZJ¢JÀÌ\”+êœsPó NèÞzbö«Â%„‰eg0&¹wá†îä:å4/åäS¸U 2äµö%” P‚Ç)ýÈŠ®‚ ›æ<>UGü ?Ù‘Àø 3ÂO%!âWüÍÒë:ª«ç¡C{TÝäÉ™åY6EãH»é‡þø\©…˜U™ñyôK¤" y¡ÈÀXf©Ó¹y`q11nlíÆ‡4OuEjl—##3¶‘¿ ŽqŽù8"Ùpú€À´QŸÆ-‚à ¯Ü»dƒÅ³Q@w‘z9–AJs¶wû×”ƒXk×90µÇd‘¶ ðE8ÅJaaã „§íNSD˜7¡ jè€m–*ÜѬG–ï´Ul xÞi0ËÕ¤pâS D`>˜:áeîÂÈ6Šæ@bžëPà ï¨:iœQ˜QO¢±¹Ð¿ÎšÖÄü kms)¡[ô/]Z†rKjê.û,îˆbÄ3‘Ç ³C(`(ù´‚R(z¼RÛT¿c÷gÌ᯿ptóõGKjjÎþh„-½ÞÅKPUˆÆˆMH1þ‰Ò¼ð³ºLÜܦ•âÏ ÂbLb:åPìŸâ 梣ñBQð; Öq¶)ɉƷò(%‚€žäO² u×9‚; \ ýIþ"Dù)/*˜[Î>«)tO;¼ ÷ ÛØ„*{°ÑÆÃ Àÿ£¡Ú²¦K—6œ wŸV*9…á{FÿÐÿ¼ UûqhîLƒ3Z²V […ZJܽìàHD0—”R@I^­òŸI¯”À±q·”ù}$Mž)-îv*’¶jÏÕà>íÿßÞ·÷·mc‰Î¿Ñ§Àøw·‘Yõ¶$?½£†4ÚfÐ<,‘—н;M6–Œ Ç’>éXb”°Þ5MIPg3jˆeWËal`LÆ(»a| ’ô±ýÜ$ŒwÙˆÐÉ ^Ej¥`’U]ÿ®¢Ð%iªfÒ¸u„6ÁˆÈIwd~ЇÑ8IèÆ'#B »Ð=É@Øq^Aý^*êG^çîÌN*¢§¡x ¹SC ­S9»,´Þ BƳ’Á‰Of}OÒžǸ8,¯9½iBU Êf¬ÌIcSV†ÎÑ^ÏÊÄD§vsN"vù°¨Tµ¢¢‘R1 `S.mÂÂD–ÅØ³bWÍÚSãÊ  V&J¿Œ ffKìŒÐ´C¥kÆ*–&:û[bjV²5«›8õ3V°6!4îÀÜì–½ú+lÆà$$A#,N““IJàžÖUBº®I‚¶6„Ø”N £ó%HPŒ9:Ù7íIðLzÅ©SJ\¶M{róRÁ0uÚ“ÎS©yííÙtÖ±l‹è¤²\ª„µ2ÑÑY±“ÜÔ&•#3R92UòP›‡–àë¨MgÇÔ&1ºñÚn1¦“Ë®ia£[{&†”Ù +**ÓHÙˆ¸l™6÷!†F^bØ0¢‚æ¦ÓŽeKÔ°‘É c k=`j('ÓV^rH‹ ‡æ=É!áT_C)öm’ÃVïîô&4–ç{¹¬~­¸ð›=œŒ!e^æ—=IyÙÕÏÈ|Šöú ^ŸËªIè¤Oºa®êš›49í4E€^dŽÐÐÅg<>¸Áâ’„ØF&Cœsüi;çêñÛjüÍÇ?yPãom?kÚ›¿ÀCY‘56Óø×¿êÆÝß`3~3,ª­(ò’Ⲛ†Ò‹Å¸Ó•’bØD1€Í Ÿ½l‰c KøðMyWí%4.¶Y_Éņ%2QÛR,†%Ç‚bY¿¨X¢)‡€òoSãùß}S6þ§Q©¤PМܸ‡H{põ4•õ­²?V´Juí[ß*ÛbU«lëÿªVÙ6÷U­² Ý«Z¥yisIbd;Óºâ ì™»ƒ{Î]¬Ó‘üQ>̨ßIù½Fõ½ZñOä‘)†ÕsÔ^)âlÙþ>ôn¶g«k7sØ#“áðî¸LX¶â:åÿÚ+íD\ºw·.ïò|(óˆF=GÓør%8Åvkýrz ss£Mv·‰d;›4ßI<ÉÞí˜Ó˜¦H³ lWܺ›O$ѳ¯D˽ ˆqJš"Ï&$i_ÖÖ½yÂßÕ—'BQ»¹vcÁ'qðËÈûØÕäÛÏ × û-!…9;ÓÍ(ž‹_’$WÑQ$wìnÀN„#Ô¼VÂQ_ÂwçÈ$+èTT£`ÏB” §§QD‰päÇœ»Ý{Ѩ»95vW'ãovw˜Œ:¿›Scw}2~x±ûÒ¬{95öÖ¤äï=´”ü½z^ú•œæëÝ!1?ÃÿJÐÌtjì¦&æßšy¨ Q¬M¨ÉQ5éOR“Þý8ž»Q“^ŠÄ¨S“^Š º5jÒÛ üW§&½¬ ßÈ‹}Yj’¡} ï?4j’›JNs’šd鮤&½O”ÍLjÒk¤Q“Än_þŽ˜šâ®ÁÔ¾`{˜ºAŒfS³¢3#/v½æ}p4ÃÊÞh8š#G}rj“Ø™m¹;c–IpÌÆÎÔã¶ÔgD²vù|€–V4ªÓˆ°ýO¨4JÓÜu£ñ!qeK¨ÉƒöQïð8è­ú™•Ô>¥RÒM" 㩸x‡ÓxNîËŠ`¹Ïi<'9Nã9ÙÇi<'÷8ç$çi<'[`U°lá4ž“§ñœ<ÔÓxN6`a°Ä— A(OîsÏIŒIé•4÷dåièÄÓÈ0Ón•xf׉§±*ÃxäeñLKLFPçOø ñLËú ]݇xöbÄ3ŒWÏ5–ózg+ìŽ*¤mº?p+ë”Çm؃F¸µéq¦ÚO#ÜJ=Êô‹h„[«1 ëPócßò|£6ÜÎ3êP:­|6€ïoâg³Õ­Óu,­zç/èZÆ_êF§ÕnÿEÔ·óøÕeáù@«Ä_Þ»¶u5É®çù‹‘5ó÷1¤}–’5[LÅ̺¶g~£Ý¢ ä¿ÎšUøøç™Q/}>-á>kóÇÔ´g¢Ìñnðwß‘ÞÌ]¸ 4çàßFÿšTmºø1ûægêl®z¢1Œì™ƒChË=ìÇ3£J_Þœ5àó3ѵ´ÿtó1µ›NÐMSuÓÊìæK¯Â—++ð¿±'ü7ê€ó ü7 üßG)y¾»úP°¦Ó$¬ñ®q}æÛžgžW¬Û¹3ƒI8Eª€™aAê .|º”í[§Z‡t…Ñ9¬t›Òo´ãDG···ø¥yÝëf>$í)ü˜dשϖ7é+ÿQc1d üy¢ÍÙGíy‘׉6ùØ€OdÖäå&þ4"=EºJíK6úØÂÏFü¶ä»x–%29Q"®èóÁŸœþË úßÚÿ0™ ÿFAÿ÷Q\ÝÄ™] DÃkº˜yöåÌñ÷tƒÃŠN•wÔÏðn¹Œ-+‚U,aµr9ÒuE4R¹Eîç‰lWP¨-—øßÞþ·ëF!ÿ}¡’ÊÆaN_Øíäç 棛Òf-Ó§µfv¯ÛÓº<¹W—'‚zÄT]Tì1ÛõãYÅ7g$ó†Sñu³Køï·kºËíŠiÔ†½¥üF£wÞz‹áдÁïá–L£¾AÕMên2„Æu›ÔmmP·½AÝÎu»ÔíQÝÓÙ³Ko]í“ü=o°›ÄFýn°ÈÆ‹ll°ÈÆ‹ll°ÈÆ‹lôò×Ý`Ê6˜± &lƒùÚ`º6˜­ &+?:äŸÖF~dhl@Pdž¤Žù¨BCÒǼµ[ÕÎ hdc٨燈æ&Ýn=¬ÝÄ´±TæGöF~dol°º,î‹iù—+ÿ\5ó/V3? 4ó¯ksƒ±æ_×fþumæ_×fþÅÊ?Ôü#Í?Ðüð—ÿrCß ÷âr¯ýøðìÚŽk_ h26í Ö›CßÈOæí »ÿ0Î;p±§–·ªïX}¯azCÛÞd4þˆ™{}IÆsÍŸŸŸ)ö ¶vߨ`g÷M6öVnÂçç†R?7Öû¹±ÞïÄ_*XöÜXîçÆr??|Xž¿ÁÚ°ÎFÕ7?6òoR}X‘*äÜÕY[—{"¹zn¢‰ÙµW”8y0Ûù÷øVþݸ•ØãlžÙVõ?ú¿oákô°‹Äí]£Yøì¥Dôÿð³qá_1t º4Ôq¥…VKó: !ýGýtZ\£™Ò^u¡Õm…u£cŸs.ð϶^-2ª§Ã×:+úžAõÙ]Õ§7ŒöÙ˘ÏþÝâ'±yÏî`8]d<Á< g<–? #³v¤ji“Ï×׿ÅÄöè^30á\\Œp\xx•ýûh‡h¯QÎáè­ý˜žü¤c´_ÐYšŸNô1Ò‹ƒY¬[ßrgá!Áë˜ ?qóðó“ ãàžÓblÍF¾9xû.zë³á^òª½Š/íZSçÚÊ?=vofNƒ{Õxm„ŸÎñ]EO¨ÄŠw¡§ô‡Œ‡G;H{‹UOÞUF} cgnÍrvìZ)u«©O ã<˧˜­Fâí–Q± ÷«6Ä^RÙÐRÖjµXeohÎrÖUýfÝ—]eÞŽµÏ¬í'«Úõª÷L›ÐëÔçÇêd 2Ú8n u¥%°ÊÓ´UËMóY['ì.³ÚŠq©ÛØC:~é#Ž-ÿúbêÚ¦žèŒn3ofÇ #¶™#9Ì€v'ò}}77®í[wëG-=ìQÐÓ6¡D}ϲ>Dkã¾UMLTÌÝ1ï|¾5™d,6½kÝØ³ÑªÉeº–뮢›–3^yÛu¬ö|Æ‹¬‘´µÅ)]¢ŠŒäÊ„’M1IÆÊ©˜ ÛËÌY5ÞñÄ~à](û­}w¹¦÷µ˜åè ‘à‚kZYË¥PL«·%¦kÕ£(¯¡l´Ëôi¯Ü©³u0ŒÈ™ûúÊ$;âßPÍt/#á€Qü@wüü?Õ[ èÁчŸ±%ãa‚Ôfùdr?¦P3Ñêþ³Ü÷}+ÂǤÎ&Œâf5$ܬù é|T:æM?xÙ7™OÔÎâ@Õñd­Õxì-ñÌÓÔN+IüŽ|%»†-ó3l‰Ú+¨=Rïø¸tq"•Ž[œ»´‰¶ˆŠ'™ûEîIÓGÀ{G¬iX5.aå,š™ì6þî+Y}¬›¤LZðóJ*GõÖð<)¡×}¡ïR›å]¾FƸK/Õ¹˜÷ÂóÀ8*¶Çg ð-q&È­—"DÇŽûˆÕ!/à\¡ˆÑ^¯Ĩb”©ölêFš*&5<Þ&ðçíÉèÕ`ðhmxj4²CyÔL)2¤È =¶U§Š‹L÷ß 'æ=þ>‰ỎôUîQpmúÄtbÓŽŒŠ‡ßû7ùåZþÖ´®O>$HðÜ2K›‚Nôa\ñP>ìogò-S'†òKÈQ_ cQîQ2ô¿Êr¸•g¬Ñÿ6:vÜÿ³ Õ ýïJ–þ·ÓÍ¡þíôÖh;'¹•¿Ý¸^TCWývt-m§—Püêñpñþµo·¹¢¿¨Ò·ÛZ£óí¶3T¾Ý¸ZÍMÈ”t»YUB>©ÛËÔöâ¶‘ÐÂöêûÐõÂS˜¥A>!Â?õŒlE/Ü{Øz^àÖÔ¼ØÙ*-oô¾6€<:^®¸JÅí>EËò(xµzýn·½R½«7[£Ý]Yõa+wõ¡ï]·]â5ªÝpŒË0éUâŠÝd­ì1mS­›ìy;ZÝh¿!tgèt»mýëº.Òõ¹ëûHQ樅»ËJU.ÕÍ¥É]ÑkR›BS¢jÜ” q-nÊ{jJÜ´»º7囨p“ݧip³)óFúÛ”±&Ô·)½Më)©¼MG½„î6RU·™È|Í-Í禊ÛÔñzÛ»èmS¡à&{ñ·®µ±ë”¶Éñn¤³ ÈœâªWñ^k¶:÷•¥¯MÁ쨺–†¤É땵y[DêG‹ŠÚ•3¥=<®¥¾oLœ‰èh£5]:Y}&yô ô³i”?¦žM«rgíl\;¼˜wøÐ©Žìð©ø+H$Øá|ðÌöbJÉNý$YÉP©:õ C˜á³ vø R˜ô¯So„ÊCÕ¶Ìߤª1x&«fÕƒ—pç)ˆu‰¤‚”à°Ã‰éWçÕ_"–F”槪/E" fúR¥»ŒÍKU›À0“ë3ƒý¬KªÍ“=Fb4ýgŽ—ÆÉù©çúdc}r'šç6¸˜'³çv3zFŸT$DêÅæ%–½šëݪ̛1J.?VŒ#K)Š-zh•'p#uÅêùÀ4<–DÇónLë`Z_¦ñ8ê«À´ÞÍÓ:çøU¼óÊ·ÍŸÑäëÁÅ´gÃg=/|Ö³á3ö¢q¸«÷VÃCr=±"yôv;HÍJ7W%fíðaW¥U•ÀºUƒMVþ—À½~ ÏX›ÿ©Q/ü¿¿P‰èÿÇåCi2ãÂ’°Xbæ¥v'd`°^"BüPg KÃbpý‰l¯¬±±l*ª:šq [äþËŠüOÛJÿ´>ÿSÿ;Ínÿ{)ÙùßÚmÚ¯è·Ì¢Þî*·ÜÕr»ÁFVç­2æ%õz7 ¸Ð ˜®0×ÛäVˆƒªêN> rجī¡I"s\¼~0Z_Ô«hã–_Ÿ„Ééâ.8ò¨§ 7ù›‘êo‚ïõG¤_qü·g׿ÄÍ]çÒ5§Þñž8Þm·3ñJ€ÿíz—öÿnó/¢½…g¯-rü_»þîýÓÀ¯åÿšzþ¯®§Èÿ·Ÿ" úo_[¥fZ’á¿$÷¸¯4V§Ì¹ñ‘eo=âÓŠ^ò·F_´€ä> N¥_PJ>—€F–‚‡^rÏA¿Ì –í‚ÜWYÿ÷—×á³ÑJâ‘ÿo/e3üjÛÀ݃ GE­@fô›|©!/kU†Ûö©Ì Œ¿á‡¡~Ãß‘#>5O?sk!éFA86(ëñ¿¹üOÙÿ üßKáä¸!úÛ ýßèÿg(ëñÿþǬÃÃ0’ø_øï¥$ØûC»*ìFU|xÛzfÖ>|O'½?•_ì†úöðîK¿HQîTÖãÿýX‡ÿõv þûÿ^JÿßK¼'f¾3ÆÒøWZÖãg÷øßj'ð¿Sìÿ{)ü:3ÏWÜ¿ï÷ÛîÕe=þw÷Àÿ7Šýÿ •±¦€gŽÏºÐ/Bj0ž8¦/FŠ0`ØŠ3.·+â¼X‰?fYÿ½Ýïÿݤþ¿Sàÿ^ÊZü瀵xˆ_`ü×QÖãÿÉî÷ÿz7‰ÿ…ý/e-þó¶ÿ¾ŠJ¾ÀD T°÷8)øã–µø¿…cà×á?ö›ÀÿVÿû(z ã¨ÝR"}XÄÓ¿²=ý+KX³QUL—™M–b “8©ëx@&Zé”0h?0ÝÍä]¶!¢ñ޽*Um-H…V©„–EúlÊ϶üìöK„|‹H@JØBõZ²~G~öäç‰ü4êý öÒÆÁ×h^\‹ÿt6Öýž±–ÿOúÿu…þo/åýböAÿ1â—+ŸJÅžþç(9üë»Æ£•ÄÿfÁÿï¥ÐAØÿ…œþ­Q· ø×, ôü¡;ÿÄ;K¸³„;KyGdûCbd“C> ‹@¡&xà%þß;`íþßIÈÿÝV±ÿï¥ÄUýèþs(]|þ*SJØâið….8ýÕ”øoÀzÿŸ”ý¿Ðÿï¥$Uý°Rú?-öñ¯·äÀÿ{¬ÇÿN±ÿ¡’Tõü·O_ñ¤°ñ%þß;`­üß­'ñ¿Èÿ°—"CzþKo1à ùòÆ?ƒÓ¤ô´¦¨Á ÉR‘:'%?|bÖ…[ñÍ7bY÷> ’ÿï°Þÿ')ÿ·ëþï£Äåÿ`ÏçL/Ožˆ'g¢ZÿÊòQÄè%þß;àþÝV§Àÿ}¥ÿG¹fHq¶Ï ÚËoB±ÿõ”ø¿sûJüo¡ÿÛS‰c¹ùÖ¨ñ‡å9þdGCdáM¼eÂJñ\>œWø{A þ %þß;`-þ7ñÅþ¿§¢ËÿÉ èô[ ªH_a•¥ëC%á,\†*•ZàHü¥_®(kKü¿wÀüÿ üßS)üÿÿÜ%Gþ¿ÝûÿuþÿÝV¡ÿÛKIìÿ·Áa4·à[““….]Á©rÖ:êÀ=1ýà¾nâéSº^ŒRràÿÎýÿÉüÝf±ÿï¥lÿƒ—Uqø{œÀߥ:« ¾ßгðI!5ì»äÀÿûÿiúÿ"þo/e‡øèŸýgx£@ô‡PràÿÎýÿÒâ ÿŸýMÖO™\]?Õ¾eVrøóqNX¾ô+eEÉÿ_Æÿ¯Qàÿ>Êæû?W5aÿ7íý’0Ô Ç¡TràÿÎýÿݤý¯]ìÿ{)c}}=qxÙú=ý®Ÿó®fDP÷NK"ÒFk´dïb6 u?Â]|éÉû Jüß¹ÿŸÑ*ü¿T¡-°ívôKÞÑK,”UR±>vOÏ&\`ê¡äÀÿÝûÿ¥íÿÿ¿—nÍ‘ \Gä5[vlÏNnÙ·âè)…š‡Wràÿîýÿ)ñ¿…ÿï^JíÓð>­K¢|x[©-O •ß¹äÀÿ=øÿ¥èÿ‹øÿ½>ÿ/©Æ <”?Dì_WÉqþçÎýÿZ)ù üßOÑõÿ‘h~„jÖú &”3X% Öó—ñ}£|Ââ–”€’nÜ2ÝÙÄY=¬[Ñ Ç‡Ú€>•±!âö–¸G¥Ãcu`Ù¸*>„EËC@âJx¦ñg´[ji ðøÐÅ`b…٠Х™ÞGWC:ƒOû+~t.þïÜÿ/5þ¯Àÿ½”ÅL3fÕÏ¢¡¹¯0èýñKüß¹ÿ_£ž‚ÿ…ÿß^Š<óïÚ™˜>¢ˆÛbìf¬Vð«ÿT§Èáô~çú±,èÆ/9ð÷ùÿ’çüÿžŠf¥×P_æÿYž5Šè¾¯»äÀÿûÿÕ;Éý¿ðÿÛOÑð_ô©ïßH ¾yO¤> ZðÕ•ø¿‡ü)ø_ðÿ{))ø¯qñqô‡+gMø,èÀ×Rràÿîýÿ:)þÿþï¥ÄóÿŽ0¼‚yb Ûª8¼zDê‘x<|Œž>5ü>Äo·H9nùÛÑS!¯dã¡•ø¿{ÿ¿v2þ·ðÿÝOÑQ‘ùp%‡OÕ¾ê¢iì# óüT çƒ8<.‰ùÙÇS!ðÂÀѪ|<Õ®¸ÿKüß½ÿŸQøÿ©3Ø—)`/ü™e¾×ÈFaü#—ø¿ÿ¿"ÿç—*Öÿ¹ËzüoíÜÿ/UÿWìÿ{)_O ¼RŒËÍ翞’ÿwïÿ×Lñÿ-ð/%ÎÿãÿÃHšï¡rôgÇÞRºA-ð>U:¨²Oð—~µ¢ä(9ð÷çÿvRøÿvÿû(ñó?0¨ïm#8¤|¸¬¼máOÌù'Î Ÿ½¯¬äÀÿÝçÿk¦Äÿø¿—B±=/ ÄÿÛ*¥í C~^4(æ§*ñ„>B5;¤ÐU›bƒ BñG*9ð÷ùÿZ…ÿß—*à?ó÷²A%v¡Q‰QˆqÙ,ô¿äÀÿûÿFÊùEþ¿½”Pê/VÞ¾‹*ðRë]³ùŽYyÛ~wZ ú¼äÀÿÝûÿ¥á±ÿ磻!{ M(ðÿ+-9ð÷þÍ”ó?Šü_{)köÿ[¢ + ƒYôà+M˜ñ••ø¿sÿ¿´øÿ"þw?…‘·Ìy|*@8Ó—~ Õÿ‘‹â/7ß)·Bþæ»0癃H4 "ñJüß¹ÿ_£žÿSàÿ^ÊÝñ¿@ÿ¯¡¬ÇÿöîÏÿm¤äÿ)ì{)qÿ¿l_‰Ã—•²<Ô§‚éñ8Q^Ù¨BÿKüß½ÿ_»ðÿùR…ñ? ù¿}Ûˆ)nao焜lØ7N)¾/ oëïÒi…ÍŽCØMAjÉÿ»?ÿ7åüïÂþ·ŸÆÿ‹’–,WåûT^¿Ì\Úžo¹afPÊ¢;¯ÝÊtaâ›yaøƒ•ø¿ûüݤÿ_qþß~Jÿ}™Ò;y‘"ðï«*9ð÷ùÿÒòñ¿{)$Ôˬù+ÐüOWràÿîóÿ¥áaÿßK ðŸb üÿ³•ø¿sÿ¿z7)ÿüÿ~ ëù`|{(V¥(¨ÂWYràÿÎýÿêiçÿù?÷R¥ÞúD ø Küß½ÿO+%ÿgÿ{)׎=á‘<¡`1óìË™5ÒÒÓá{œû#83ò…’mðÉ“òá“'ó ™ñÂaŠ'g¢\›?y~?:RßËðC«Š1ÄhU¸=-RﶬÇÿÎîýšÉüŸ…ý?%<.óF|b,¯.«¿ŸâßMqV;ÖÒˆ¾#ÒÊëxäfº½äÀÿûÿ¤íÿþï§ûÿŸ»äÀÿ=äÿJÉÿ]èÿöR²Rú–¤. ª)…Dɯõ,ì?cÉÿ»Ïÿe¤Øÿ ù/6ßÙb2ãÅl船o¹mÃÄ”€~-ÑN¨q Ÿ0%°¤_úeвqÉÿ;÷ÿiç|±Êÿ ¶_ø$á‡B@à(H Ô’"Ô™9XÖ+ÜLïHL—ð üÂ'¨¶¬“6ás)ªOàV@=ªõмÿ¥§ãOWràÿîóuSâ ÿŸ½=h‡tåÿ,€ƒUÂÏ[` f„ïæ[£N=‰ú˜É´údý/ýÞEá’ÿwïÿ“ÿSèÿöR4ÕßíÑÓ"i¬ÅߨýþßJÁÿBþßKy¿˜}Ášd/è¨ 7WöÄeCšÿ—ÿ‰…) |f½AÀåóV_Dý>ø²ÿÍFý¾ ÀÖûÿÅøÿÆø¿"±ùãÇÅ­Bi-×?½ŠÔ LÂ×RÖâÿÐY >øÈº5§ó‰uR°ÿÛõXüo£Ñ*âÿöS49¤}Žý-…€ÌåA‘þ.|‹òÔ<¨HíÈo1²Ææbâ÷ÚÓý׌ëBÅÇõ,®:4á[3Rów®‰çÆö‡W0˜Š –CõK?`@PŸ[©”QO~Ð#}¶åg·_z$ä›UNe{kwäw9’–¬ß‘Ÿ=ùy"?z?h M„qðG7|þÿòâÙ÷¯^ììkð¿Ý¬ëù¿ÛÀÿC½bÿßKÁõ¯ SŒ]ÐÜšY\ñ^¼yõcé?-·aÔêUÑ4Ä+˜+äÎJG+K©T¯‰çУ9D×!èrj¢u1£â¼À‘ ä1±g—bb{@FðÒÿ†É2ÝáUm`M&GsàÕ†Î[üd]Ã0ÿn2þnõÅlxµ¢ò÷ö̯'öµÙ~„ugïk3kT4¯-xÏáÿYXÖ¬/FƒiV¯¥’Qwn„ïˆÁžŒ„í§¼a©ô£å‹çÿxy.–ð¯,1²]kè;î«| µøÊxãù?`†ÎȪ•~YÐ àB„Õÿörlz~­ôâÖ.|K<U›š¬råô &Äù•í‰KûÚòÄÒYP§s¨®{lÁ¸ׄ~j0òF0ò·”q—ι˜X×ÖDŒ\ûG¨lÄž0] 6Fɺ?ò#–7À þÝšY®9™,KØùÏXáÜy·±â¥/¥Dè¾ w$œ±ð—sK|‡³‰Õ~f6ä%€Œúó }²#™ñÉD(Áz𥪴o|sÐßÙ³ Û«Áù]œÓ½Ú‚>‚–ë:îsdtú¸Û×oL—&厹¸@5Ý%ެ‘Ï<7Ë«™²ÿGd}ÆmmßKTéÅš]÷Åßô­š·œBÍÏŸeÕ³Ô Å]¾Ó*'D$àú¸ú."¢·`»åF,‡«3oBˆ)3œ(›„y´Îüˆ–¿ôößáÄt©¢W¥û.tîêØ]…eVŸÉ0 0$.öÍ+gB‹K°ϵ<Ë.%üÀ5„žJ°ùËÁ»æ™¾Yb)d€¬éh1´Fb°Ôà; ZLš9Ñ/ðGM»t&/M?À'_:èåëšç^/Hƒ½P§ç0(èägõ½ÆÜ’9ù&„gêL® ÕqkÔìD 홼2°0o,9Úã…oOŽ© ¾4¯k Ä€—à*Ò ®¢n³ÄLQ„©9O¢nIN-òlô¦÷ȳ/ñiUý"^èÇž®=Óƒn §&õ(€*Ü vŠ¥9 on í±=dè@ÇQ|5Ö9 whÁÃ'—ø¹ðeŽhÉ—™žLœ°/‰šaû`Êúü nî¸~„:•öqð6”Ä)þªi¸&r®(³~:¶Àn93ÐÑXWǶÅÈ6¼²`+ƒ1â¬9ˆ6R“FQ·ÌÇ ¾xÙC”Ãf—¸rsà˜‘A¶|É,'½&¼4ŒKšØf¸;{<ÝÃc!ŽŽÄh1.Û"@·öÒµéÚð@j¯desg6æÙê ¬â, Áļôh“r mÌ<ëê…ªÑ÷ƒõñ‡5œÿ#„zÂЙ/ÕæKš@5ÏÖLj›¾¬¡~©— ªyD?Ƕ%!ï…×'Z5ñ“ã[^¿âçØ¤ o1Ÿ»<·@ëFÀÖÀ†}—þ »äМô»¸Çñü]-° "6?ÿü£=¨©v?Û£_µ–ý3€Œ…uš¨wžQÆÝjæJ¥W  Dl¨)DoØæÍ,käø_Û¸ÊHÚ5q>~Æä%n•S ÏsÆåñÀÈ2¾Wc’u0›_Ã…ëBõÉRÀÖ ¼9[¢³÷ìÒRû² `^<_’ú¥ð®œ’÷YÐrn¹SÛ÷ÙyüšYHxì¦ñNå,{=„Bòßß_¾9ýË?wõŒÕò_·Ñj×ãò_§Yøí¥Ô4™‰Ò™VJ¥_¬‰…ºçD¼È]ª „Ãz v;£uüÆšûÇ''¢ ’Xe5²£ä¤˜ü`—™l 8Bëà¯9pîÑi<æPÐßð¤²ÜŸJyCsBP(ËU»|HèIŒU&2`< vΜ™ŽÈ=ÏþÝrÆ• ©Á˜g@æ¤ðÆŒêØAÒG;4½yj¾‡ Çéá('KÊOΘç°¢û Š)ü„ò¡Ð^g Ç}V$wÊow¡Þë"x/`´u-zv÷’êÆ‰½é³ÅÎvÛrI,…ÿI®“¢ŠÜÚu.©ÿË1íYUl4ãɲ.x /` Õ†`N<%^xÁZbèr¡²Ç«* ,|SʾòO†¡{5µ€oÒ:—cá%Kéûk>1Ñ”`N¤ÞÛCa;¾„®)â 9¤dÏÚ[f÷Ε°tJlŠ… E Á÷p[Ö{Ÿ.&¾}ìïÁ{²ïg u,=àè>°y¼Óûk™¸Ñ†l-÷«wŒòÈ+hÖ')O=åOìöÆă® 3ò„`h “È ŒçÎúL©V¨møeibí~·\‡ÖVÑ5—03£‘5ª‘hC♘²˜@t"×òe#‚A®Á@MÎó~´ù Éæ«RŠçëØžLdú:¼;œ µ"yR±z!Ô#u¦º©·ù NïÀw¢j ŠôHè§L+'g‚;¤^~CÜ¢¡@5gá¶yÑ.ÔäÈjÔŽ@žsXàáb"QÈ'œTâYGU0Ï}@=êjh#ÄÞX ‘G Þ3§H'Ô"ê>&ꉳ¿¶¼ùdàˆš&ëóx`€cÓv]\Ì&ö ¾ð¨hJ -½)ÅÛþ”@d'ŠßÔêò ±´Þ­™´Zev‡*O¹  Ö@^›LpÁl"Gýƒ}‹š%´Cw@†ì1N*7X d@©âÅ‘3{ìs/DC”xTRò¬GŠ:xÒ•=q€–%®€yG"s\º91ïìƒÉ3ñ!¨9 50jL£Oád`‘`ÀäNS€Ã›‚¬½š8ßãÅ$˜ˆðIe«vY ä Xƃ?ýúJîÖè ¢t›¬1ÄNfLášJ¢FZ…Ê ëÖr‡¶g©ivˆBf0?ú ^;RnÒã¡.Iy Ϥ·¬9 ò0ÓÉj Ä°KÈ=Fù…•~0›¡ 0¸ÉJäp*ƒº;u£*Œæñ˜³ã£sé»p¢ÀŸÁ~ñ êA‘˜+G&˜a\hœ[›Þi:m¿2Ý”NÃ>ûÀǃtnT›ÕvµSíVOªF½ôÊY’ë/¿!^~TB&'ðÊ0cæhEquñÌÞ?C` ”ì±A«&I#j€Ïö¡ˆ¦®U=hD“XBñ˜FÜ÷YòB¢;‘²( ).¤íM(EÔ^ƒ­÷°uàvì¹C´AÓÛ¼EË;2ÝÍzFæ›tïd¹…P{HZmnPVÈÿ'"})¦KÎ-Ù@¶ìY …•òÑàH–TIŠ£MÔ­(ߊ§¢”âï$YÐÌ™!Ê UÿUôàΫÚw“ÅÔ*E'‘U]Ìü ©Ñ+²Ãˆ”‰¬Cú†Ú*Þ– ãcuÙ[Ó½\ÐÄÚ¨4$+,gô2Šú€^ÏáóW˜¥ì–êÑ@ÿ¨€,L–Øë„VT2  ¨¿zà –ÌSu©?œ;ÇC"lä(¹Yîu¼mLì<°˜—D”iCŠÜÕð &ûl+E![ªþñÝ–Î-ô ˆ;2·êµa M© ³P®„z¿˜YÇ@AÐëËSö—hÚBRŽ9p~ZLÅóóÚ˟ΫÈE8sé—†STÅ|³$m$¨}ùÞ¾~=ÀÓ퉲Â3ÚŸØÀâÙS¶Oié™±*Ê5'¯çµÒ tŠQüЮ3íS«‘kf8¦i¬ð®èu >ï{ü\»*èÆ³¸£Õ¯×ûž8ª·¨Ð#È­¦ÏßÿŽR2Ðæmû´û# NÜ8ÈŽßr5²xïx4ž)³)ÞS°̆=cýçóÚwöÌ^ž…Ø êAŒ†Ñ¡¹[*‘FöCóv™/<ÀhnºËç³kô—À¥0pV°>zóúÕ ø-Ξ®_Q¬ÿHùkü7•énPâZqK®L{F ¶ùÄfwy•ÔÄŠC áƒ\à¢ä"g »ßl© €Îä*á€\Ì•<‰JŒ@ô uÕȬœ9¨À’ÒÑÂuÉ$8r\©Vä‡ððÆâL´kªÒ_Er=ÜÁœmâÏr”-)SÃ9èâ‘G µU^¢6»k•Ø=†¢ƒÿå·°–ÿ騣wU1³'ZpøÂ¿Htñž‘æo~Dh˜[´'1>J»+~‰ÁÎQ-ÞhkÖFk7t{2ºR¬|Œa7Cj Ü0ºã°I5ØJ€>›ž=$Ç*¡³ËÔËÌ ª‚ôð¢vY“ˆ#CöñC9í2À¸[ÑÖú7$øÞu+´áHÕm?ÆŸ_™¸—À>mÝà“=nü’¶öK‡;+FH¤A`éY“1K?Àù“º y#üqeº#`½a¡  L†W®ƒ‚1j8$„—ú™ R¸C¡ìdò8€ŠÞ°xA½™x„ö½b·KG’Û¯ížWt/Ò(|ú Ž’¨l¢64á\I lHBË•¹ Ëùk‚qg˜ AöjQõ¦øÅŒA¶QïÝ~»£ƒ,k£AÖë‘çBÐõ‹¬k@°H×M“Í-A“òéi…ÈÝz“1IÍ0â@âÈöcºµ\JåTµ¦»ß õC÷BRù¾¡¬¦ÁuF‡ý¿˜Îýå‹[ähH»º[Ȇ“lXcT‘†dN”ñ•Z-Õ=†µî0|[axÆ|êŠÁò¼ü í#ëHªcТ‰j QÌ8BDu$ëÁ¨VÓ¢$zH×ê'}£ÓovHZõº(¿øþ¼€â?Lÿj‚#øæžò·cú¦éû•Oy%x‘Q±¬^‚»08M?ˆëýä 0Ù–tbeÈí®j‡DÝøå®??zJ¶€·ö;h||H¡²Æ ±Ú°)êmSlüú\þªw\-ø À:À¬ úN½~³»OàæðÓIò¯Màe²Ô·EÞìÏŸ¿Dý$ôò;Ú^BÃq2ÕÐ IrÍù  ¤çp I”ŸMÈáÑŠ;Y[ÃE æ@0b䊙Ô]GŸ:]€à;@ã öŽ\›0z0ûwñŽUpÇ”5\àëD:…ήH]4[LIdÀ-€W¼¶hGðj•i.ÅœùD9ÒY%VE‘-Ðq>°‚Ôny5¢ˆŠUîVi¾"±Õå©Ð‚a‘[sè¦ÂiT›*­î†G޽µi×啸Qð³æ¾§6¬Ü0hÙè·Oî cÆZ{s¼æzkÍîÌl2Ù»•l:b5æ24ªàL“ Ñ&=*HÑUe1$KË›h–~Fš?\‹äU‚0ä't[7«-â6nˆ!Q"Â&Bñ÷h'`§ –àq÷ Ò†M¹m©¾M»)t‘ró“G¯Ý‡/¾;ôûhŸÿ,%þ*6íÃ? }¦×!„ÂÝIõñ en{†ÎŸ©ÑY Êçè;È™½==`%jJdö\ÑÅb†Û+õb‚NÉO`”LªÑ`JÐðPeúfŠœå߯~&¨·â÷iÑäÉŠV²Íð2DËÑÍÕRb·èpBŒCr#·Ø0oΖšy7íÐy5âƒÎºUSrœr¾¾h¤üÐ =–fäRبš;ðÚ{$SÎynh5¥›Ä@ZÊ{b\“Ô'7¬,&e-š‘µñ3ˆ’ÙÉ•=b¿âr¸êÈò‘Ô˜µr¤¿¤´)›0fÞªç R–‚`ûyLéF4ù»V¿Ù¸3h¬§rØÒÙˆƒ2å"ª‚•‡$ ìñ‘Õ¶¬œ7å–ÔMidõ€™2PfQ6§L‹/96*µRé|ƒÄ¬mÒÌa)ôÇÝ¡ãtm¢v†êB^to ™ï¿{ÕGúU okíÈ!«4XªÎ°7mû,ë=ƒLªßÛü1ÒBøqãšóç ´û$ƒ¶6Çð§%Âp×”KÆúiv·Ê“Åä\®.ÚTÐÙƒ$TµE:CÜŸ ­2¯qnøR´$ñ-5’^Üd¥¤×rÑSÎ9ùKгä@Mx"ÑQ  y©)ïc£Àz7¾Ñ<ÕŸ-4ù™îRÞ»¹Ñe'iùS.‡ýTÔõ@Üž:£Å„tÝS“ü7Eå rn–2ýt‡5Èüï@\{ÄŽ”¾‹´iH?Ŧiû?º!'jZΗ -ÚåZ(T6j·¢fç.€ˆŠ!X=Œrýy0¡OŽtöÏÑ v@«3¸FÂ5 ÜÚâÔ"ûÌNÎIà­}Z€ó$ÕÆÄA™eCd]D¥t… ôf&­ŒÑM‘nà9“…O–ZÖ F½`˜K"ïÉ„Ùefš‚bÖ,Ê4#»*zLý‚‚@èÿ EïŸB”º"*£Â1‘•݈¤Àÿéfa͆V°_Ó Ç{7tTÆ—'ù8¡…*@Sœ ©O'oÄ ˜X}ȭŨ߾¬¹h4VRÕ›wÞ› |j4”g´ÒH΂7xæ^>wf×ÒÇ‹Mm’âK™ä9)úNY.AVÖ[NÎDøˆ`¥RÈLV¨·–ÐN.ßÄs+f¨dúÕbÿŠ)¹ÏÛfï—1óïgM ÷‚Ї˜'›>ß6Q„æÜ€ÏÙ€tðh0Ä ôúÀÜÞ‰öæ¢Ð,)=!M¿_RlU z¬–hÛ<àJÒw@ý‹c =P^ÂRÀ:XcŸŽA@³Õo·ïAS“ RãAŒýWôÍБfDZ%{¬¼­:@ ;ŠŽb°b&„kïe.>I?²ê›$‚_9«¯€ƒ¡Yí’` ›¯H ¿ªCP›Ìn0™?3Që‹_¬ˆ€ xE{<¡òëå=Œ}Å,"óQ¯•ù ÂG˜Ã>Mü u¢€¨¥µaì>ã1¥hØD h£'?«JMnè9¡xð\ Z¦—£_¬ŒUž‘·ŒžÉ½7„Œ²)øF$‚VÖxt)€ÄµzÛX ò01E4ˆB˜)& °.ÌoÊ!–{LžÛ³#åcw#Æ{’k·C- ºB„¾HÒT¬Ô«F•”+”fD `°•¢¶.Zñ}µqø¾Ú<|­Œ#„ÊÑ(®¢Õ!д†qql71ZúÊòl¿µ˜Ð^.±d¸ÞºõÞG¼öÀh£ŽL\gëa´¡×€ÌØ3å˜NA°¡ý†‚*¬ÐAûGÛó߯"ƒÑ¥þèɈ(~™Íp‘±Gí¢=39þ¹.téé Ou¹Åhñ´!¢¬m¿Þ–†ˆ§ør)»"æ¶ö29G]Ui^˜!’¾¢¨ —NJbº^±¶¹ê’5³"gBÞE6wìY¬)) Ù´s‰Ý)Ÿ?t‰µ¬O }L]èÔ’Ïp<Ó»ŸR09Gb@O°¹¬˜DS#a4̘aàDµZ9 èÅ›ó~aKoΟÿú& Æñ{sFôò¿0úØ™›—4BÛû¿–ë¼@y5pÏ ¦ŽÄµƒý0#ÏæÀÆêU$d)4Ť/Ý€€}œ,FRzÔŒìA° nnåpWÈ`¨ºÚç)6þÅ«g/ì—66B0ü½BMžâˆIîBu´Ý6zýº´ÝŠ2Ì]…÷ZÚE#ú,¤¾kÁËÕÙ—qb]šÉc˜/Éý¶ÝÃ͋ƀ•Å¥ãT(kSåÓ笃îò» Aè˜[:8{ÇÞÔ\\_9S«u,göXúP“šà˜œïè{íjxÐoÕGÀûô;sTŠ˜“û´¤[•É@1#™LŒgÚ¦¹[>¬pÂ* µ¡9fÎàò :7IS^ç¥Îƒ3uÈò³*ζ527Ÿën1¢ôh¨¹šê:Ë7Úÿg3³óÜ™›1&²ag>'ü4³Ùe]2j˜'9õ Ôñ §(:<›X·ÖRüè\Ú3çZüͤßÿ{èÕnloX³F …o€žø ª±XÞè·`¶P,ï ìr¤Z&ÜQ2ÛÌsqp¼86'Ç CÇ$²¢D ½:“Úðà4‘MV½TpŒÜ ø6 ¾‚o”oÀߊ®>Gð¹ÑE|£sÀµ^µtİ)h¬'’BÐI)鸢ÏFRF^ Kn·äcyÞ^™ì¤§,93Ötï¥5´œ™SL#`Ž25la(Û5«F]\Nœ‰ÞPÈ\SÒ‘Š¤L?9ÊCóçAT0ÄÅÖÕ·Ä.YVÂØÛªøö¨ÏY?¨¿ò¤¶²Ü)»õE*£/%OØ/'äà ûFlVÑ·EÁ4ߪ®øÞjmà[½Èö¼ñÞ“UôC:un´»¡a+Ân/ÒÇg.w8”± ´—·äMvrÜ£†Lº0é!Ý(õF¯Ò×VŒíøÄK›áŠ^›“…•ë³Êïk[sYþ‰|RÑÉ~kË?ýú껿ô…Qzóëw¯^žŸã\;ö³ó}Ñ86êHc$ ³¹&r90þðÑà&´ø#) 4¹c™Ñáûožÿòòçó—¯BkÓ‹Ùbb«tS%Õ-I¨žDe=c¥á#ñdh¸ ?Ô©%se0‹>ž—GÎb0±*•2Y@*j ž/‹ñ\¨ªX… k×gEï¶l¤Ö³¹sÄKJ¹˜3HµÐàĆÙú•´Ðy’"‡PùC5I^æíÙ&%lG”!J TÒž£CÞâ£}Ñ#£HP«®…»Èm=æaƒnfF’˜å4…%ó5E¼¨®e–Škxž£Ú<ék-òöŒœãA™ùaÔ©©x• 3½’¬£9ä!øX¶õ3“ù•€æ`8²Æ—´3…Ûeü>ªlÛ{wöé¤[=éUO0¬ÿ ø×€Íj]Q®ÌßÐ&èïóQk€k6šx6Zl&´Äp•Ï åÖŒX-$ÂE·Þ\YÒ3à ·€X>Í—:ûð+HOì÷KäšC°%"$}¨Þ±[¬z9N^¥Á²«|àx¨U»%îW:EÞXLãpHž¿DâC )¤+šû½5¦dqstðx¡g‰ÄÀg2/í\’k;ëŠM™¿"L–ðo~Á題i1¼À4š4 Тó@Ú‘ˆ „†ˆ˜ÈÑyɃhfÝȾÊD·t͵¦è0gêp²O6½RF9&ó†0ãë82o¸~…Âü”pûôg…MÒO³¿¶j^ÑšÙA™S ï ÊaÈlÇÚ»Þ€}˜ÒÜeK¸Ü¼Jö†A„Öè+]½Lμ¹ÕOÌK6^°ùÊ» "Oà—U~ t®:*Jd½X ›tÚL¥æRƒÜ—Hѯ¡RtP"Ió‘Ê>šýà¸éžÒºc^˧Jsøÿ¸Æcæ2)¾“˜6Žë( {—’Áá¡{×)é¦Ù’ª›gâo l<•é°ø»ÍéÀèIÒrˆäM|B—ËJ|`sÄSy`ËÞµy"‘Ó€ÁT*•ž¿~õêÅOç}ö]A£0¥½¼qTæ!f³”£¤É>üDI ü«2ú©$î›äu«|‘PÉ8yd´ÑÏN꫼Сb9j×¶dj2|À¿ÿô+ô<ÀÀQT{ýf=F§ |€òÆ' ß R ¨h lø¼F)¨È¼­–TåÛA Ï=Àüµu P•Ê<†W ¦Œ€_ME ¸Ö”#NÄG©/•‘>ú®P>å Æ1s¨¼$ƒ‹Ø–¹ö(LWAêW@kºÈ ÅÄÂhž£#¨ç%²[Ô*âíh0­*”~·}¢ÕщÖ8W3LO6_Š¿½¿r3Lsé„kÒA”1ǪٶM¶-Cूž/j)xã‘ñèþƱñUÁô¯nQj&¨Ó:Âçc¡mS”ý'H–…€NÑø"’%úÚÆ¤yfŒ:rؾ¼Æ?ؽKmÓË£_Sçíy¸mªì¹åcÊ[!´ä˜¢·?cà™-#¬éñ85Á4µ‰YñTvAOÉÈcÊ7¡pR…ºj-âÝ«½ƒª¿X<²s¹À—‡Í(ö”DªÌáæ(y£h¨Æ#G3r6#;%|‘2¾g¿’‰µ‚Êl†$ˬ„ÓLx,øÈP¼I˜Í7HÆ^‚¨Æ¾r\òÛTˆ1㌈0}S8—e´Ó,Í)~ã€?Ê Ðݳçó¼óÏ‘úaòhû*‚È+êªËÞªxƒ@&õô‘z§+óFæMRJ¤Þá©ÏìqÅm©¬I/šÛgáÑU˜Kz>"‘ÃÔb¾Ñ£œ½Ð&6Ua8À^bÖ=50ÀeÈ[{F¾Ã¸í,#«¢šÔtˆ0ZÄBA×{æèšÿ< è fºDa8M{N÷o̡̙<ÕÊ7] ñö Zfæ—F<2‡•-›çKr¶V$˜ŸQì^BÈ]E0óœBÕ½dé㻵3MíŸéž/°j÷ÎRr/§”œ4¯ö dÝÑ-à$!x>þWý1ñd.'Ê…Ù{ W(…>™)(Å¥7¬{!=H.F%<úÌ–2Ȉ²%šZ@æåO?ÿzÞŒ÷Ã êøŒÆZº/È‘é ‡A}•‘ƒ¼oÃÜl|ýëyJŸg­^¬?yE뫤¢S¢Ù<¢"§Äð…¤^‹ær@ÒÛ(tר+E)®P×҈”‚Ä׺ LM`N^Üε >Ý‹^«¤µY1èZë-“4“ZféºâŒ–*A=ÕöäXHû$ñesŒZ=Êtó«LtSa½ÞÏ¿7rI‘ÊĪó=ÙArgF}mB´Ì‘%΢éhÍÈGÑ÷TjÃ@gŽÌ_2”¦¡Þ»)±ù^›ÂªJ}›I2æÜEbBð™ÚÔ•1qÈG4yˆÌüûJˆnì%­ˆtGÉ_0h-ÈR)•0Ò&Ì#ËÏÁ4~è©Ã‚ºîiÝð$F|Š X~Ò••PŸd{/>.LÚêmïÍb@'Á‰†ôdÞs9 –«J¿!÷œÃEC©ª«’[Š9ÎÅ5 ÁrÖ*}ö‘Öc(,ÞŸß߇ßmómóýz?Ç05C| ׿œ£=ÿ¥»«š´îõ“!e÷Zï‘ÎþÉ;â°¢=½sbÔ:ê´ÐÍ{Õ½^EÊš¦Ž"0_ðw€ µ§Å¢'ÏXHUú$¢&Ä£ú\S¢—oØ«ëL|pÎ>dÕ+)¦þ[¦˜ Z–ƒ¼ûX‰V.“ Œéèãˆ`_ôX0qæèÁ8 ˜ŸJ8‚GÁóÿ›~§<{Nz 4 U"[Æk´µ-\¦3òTbФ:>ô¨++§RêÀ­ bŽ`»QYN s­duV 5ëP)µ$øå¤p1²Œ8=ËvÕ€³õv°ƒÜuk4r²9ÍLKq\áHÇ%Œ>päð·îÞ;ñ’˜OÞ¼$ï¨o4öm'%!µ—ÀýËqœÇ!Õ #[P‡!”Ÿ)`‚S@ñ&ÐâÒöe¨ïóhyO9}GMöRBW&twÓÆÑ亲­‚ 7Nì®Éú>äm‰Ã+avæ¡ ‚¢ªÂ1Š—kMKtÀ{ü¯ÇäÆìkU ûÒù&*veô†¶-ìJ:ëG³qQOr|£mð¶‘¼×áV”f]ºÓ]Ë8¦rŽrHÈ*²ïç›À¬'êòXÞèÏZGÉ<—*s*ÉšúY§~ë³ÕK©Ù=k·“OïrÍÜk„¼= 9ŽG"Óàì<Êÿþ½C;¨ô£xÚ1ª …äéƒ áº¡1I P(´ª$LT2°1¿Fß…– ²¬ÂÛ‚šÔYœê8½a =-q¯ÇÌe~kŠ*éª;•V£)ÊŸŒjó³Êg0Ÿà‡©fbDîëbÂîBýŒúÉ_3'ù[ã(óÆ_` ßpá­8 Ù–ŒN˃MÅ¥­Ñ;†_@ä/vM»dQ™y:ÒOì(Ýp—¾Þ~j$ŒPq‚¬?]õÃ(Ý´%$ ­ŸŒÔâÉ;äxpáèÈæ*+P? ¥¨ƒ3£ú²ÚÆ™ýä‰ö»qf®·ZŸºM¢wÂHÚ–z– ÔԳĵHù}§¥Ñ¨µ2Ð Iþ…’R.еäÂw.”kžÌf$½s-Ÿí1œå¨) »g‘L•©ÕSI–aߟsEg›sµ„¹§Á±R:!1Ï[L™™þúñ–°’AtŒÔ9ÉtM@Ê€^PÚ=îz5)j_ 2Wæ¨DJ7™9Öà éaô5ÃcˆjÊö"C7Ja'%¶vÞÕù0qÎo¦‡w3Fz3Ô \FìÈôýá Í(ƒNÌËÒúGb¸$IHˆJ#K–¸ZÌÛü^q`§¥’•¨Žœ›óå[Ä!Ž˜E>œ/Š’Ú$>sd~Ìï<¬ŠØŽmï?&ƒÈ‚ÄäÆE±Ît8 êº{mrJ,ˆóA;²Î* ý×IB9"«2™F­yÔÓ£ÌÄê(3õÆ¥ìP³ ÊöI^Äí'‡m[œ®ÙÖBíœÑ’”­Y7Ö*¿þªyl…š+ 3>ãþ‡pø›otÖ‚î˜2cRiÚ“0×"Z‘¯'’”²æ­7­ˆiª 2à2¶srÞðÜš8þ•4ࡘÓ>ö×9Á¤ <¤Tç¼Y§ÈîR\Çá«‹¿ªœƒA‚À]°Awt»l]}“j%7)£sü˜TÛ¥TvrêbHò^¸qÂu†o xvúö—ÿ97«­ßP?¦ŽRéZcyô ã„]².ÑÀUÆ´Q®e¢WùÑš%‚¤5;˜NM&„Y°_òAЀ|*gM¼0¢{VÂý“õ’È]S6Ò·ßV(†Ôd+Mæ™ìË…ÌBfõÙÃútJ¹<ß-²¿qÆn†$!cµ`0¸—,(š„2)C Dckit.patch || exit 0 rm -rf ckit mv ckit-mlton ckit mlton-20100608/lib/cml/0000755000076600000240000000000011404470406013100 5ustar mtfstaffmlton-20100608/lib/cml/cml-lib/0000755000076600000240000000000011404470406014417 5ustar mtfstaffmlton-20100608/lib/cml/cml-lib/cml-lib.mlb0000644000076600000240000000057711404435636016451 0ustar mtfstaffann "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" in local $(SML_LIB)/basis/basis.mlb ../core-cml/core-cml.mlb multicast.sig multicast.sml simple-rpc.sig simple-rpc.sml in signature MULTICAST structure Multicast signature SIMPLE_RPC structure SimpleRPC end end mlton-20100608/lib/cml/cml-lib/multicast.sig0000644000076600000240000000212111404435636017132 0ustar mtfstaff(* multicast.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* multicast-sig.sml * * COPYRIGHT (c) 1990 by John H. Reppy. See COPYRIGHT file for details. * * Asynchronous multicast (one-to-many) channels. *) signature MULTICAST = sig type 'a mchan type 'a port type 'a event = 'a CML.event (* create a new multicast channel *) val mChannel : unit -> 'a mchan (* create a new output port on a channel *) val port : 'a mchan -> 'a port (* create a new output port on a channel that has the same state as the * given port. I.e., the stream of messages seen on the two ports will * be the same. * NOTE: if two (or more) independent threads are reading from the * same port, then the copy operation may not be accurate. *) val copy : 'a port -> 'a port (* receive a message from a port *) val recv : 'a port -> 'a val recvEvt : 'a port -> 'a event (* send a message to all of the ports of a channel *) val multicast : ('a mchan * 'a) -> unit end mlton-20100608/lib/cml/cml-lib/multicast.sml0000644000076600000240000000445211404435636017154 0ustar mtfstaff(* multicast.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* multicast.sml * * COPYRIGHT (c) 1994 AT&T Bell Laboratories. * * Asynchronous multicast (one-to-many) channels. This implementation * is based on a condition variable implementation of multicast channels. * See Chapter 5 of "Concurrent Programming in ML" for details. *) structure Multicast : MULTICAST = struct structure SV = SyncVar type 'a event = 'a CML.event datatype 'a request = Message of 'a | NewPort datatype 'a mc_state = MCState of ('a * 'a mc_state SV.ivar) datatype 'a port = Port of (('a * 'a mc_state SV.ivar) CML.chan * 'a mc_state SV.ivar SV.mvar) datatype 'a mchan = MChan of ('a request CML.chan * 'a port CML.chan) fun mkPort cv = let val outCh = CML.channel() val stateVar = SV.mVarInit cv fun tee cv = let val (MCState(v, nextCV)) = SV.iGet cv in CML.send (outCh, (v, nextCV)) ; tee nextCV end val _ = CML.spawn (fn () => tee cv) in Port(outCh, stateVar) end fun mChannel () = let val reqCh = CML.channel() and replyCh = CML.channel() fun server cv = case (CML.recv reqCh) of NewPort => (CML.send (replyCh, mkPort cv) ; server cv) | (Message m) => let val nextCV = SV.iVar() in SV.iPut (cv, MCState(m, nextCV)) ; server nextCV end val _ = CML.spawn (fn () => server (SV.iVar())) in MChan(reqCh, replyCh) end fun multicast (MChan(ch, _), m) = CML.send (ch, Message m) fun port (MChan(reqCh, replyCh)) = (CML.send (reqCh, NewPort) ; CML.recv replyCh) fun copy (Port(_, stateV)) = mkPort(SV.mGet stateV) fun recvMsg stateV (v, nextCV) = let val _ = SV.mSwap (stateV, nextCV) in v end fun recv (Port(ch, stateV)) = recvMsg stateV (CML.recv ch) fun recvEvt (Port(ch, stateV)) = CML.wrap(CML.recvEvt ch, recvMsg stateV) end mlton-20100608/lib/cml/cml-lib/result.sig0000644000076600000240000000063311404435636016451 0ustar mtfstaff(* result.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* result.sml * * COPYRIGHT (c) 1996 AT&T Research. * *) signature RESULT = sig type 'a result val result : unit -> 'a result val put : ('a result * 'a) -> unit val putExn : ('a result * exn) -> unit val get : 'a result -> 'a val getEvt : 'a result -> 'a CML.event end mlton-20100608/lib/cml/cml-lib/result.sml0000644000076600000240000000112711404435636016461 0ustar mtfstaff(* result.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* result.sml * * COPYRIGHT (c) 1996 AT&T Research. * *) structure Result :> RESULT = struct structure SV = SyncVar datatype 'a result_val = EXN of exn | RES of 'a type 'a result = 'a result_val SV.ivar fun result () = SV.iVar() fun put (iv, v) = SV.iPut(iv, RES v) fun putExn (iv, ex) = SV.iPut(iv, EXN ex) fun wrap (RES v) = v | wrap (EXN ex) = raise ex fun get iv = wrap(SV.iGet iv) fun getEvt iv = CML.wrap(SV.iGetEvt iv, wrap) end mlton-20100608/lib/cml/cml-lib/simple-rpc.sig0000644000076600000240000000131711404435636017206 0ustar mtfstaff(* simple-rpc.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* simple-rpc-sig.sml * * COPYRIGHT (c) 1997 AT&T Labs Research. * * Generators for simple RPC protocols. *) signature SIMPLE_RPC = sig type 'a event = 'a CML.event val mkRPC : ('a -> 'b) -> {call : 'a -> 'b, entryEvt : unit event} val mkRPC_In : (('a * 'c) -> 'b) -> {call : 'a -> 'b, entryEvt : 'c -> unit event} val mkRPC_Out : ('a -> ('b * 'c)) -> {call : 'a -> 'b, entryEvt : 'c event} val mkRPC_InOut : (('a * 'c) -> ('b * 'd)) -> {call : 'a -> 'b, entryEvt : 'c -> 'd event} end mlton-20100608/lib/cml/cml-lib/simple-rpc.sml0000644000076600000240000000371211404435636017220 0ustar mtfstaff(* simple-rpc.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* simple-rpc.sml * * COPYRIGHT (c) 1997 AT&T Labs Research. * * Generators for simple RPC protocols. *) structure SimpleRPC : SIMPLE_RPC = struct type 'a event = 'a CML.event fun call reqMB arg = let val replV = SyncVar.iVar() in Mailbox.send(reqMB, (arg, replV)) ; SyncVar.iGet replV end fun mkRPC f = let val reqMB = Mailbox.mailbox() val entryEvt = CML.wrap (Mailbox.recvEvt reqMB, fn (arg, replV) => SyncVar.iPut(replV, f arg)) in {call = call reqMB, entryEvt = entryEvt} end fun mkRPC_In f = let val reqMB = Mailbox.mailbox() val reqEvt = Mailbox.recvEvt reqMB fun entryEvt state = CML.wrap (reqEvt, fn (arg, replV) => SyncVar.iPut(replV, f(arg, state))) in {call = call reqMB, entryEvt = entryEvt} end fun mkRPC_Out f = let val reqMB = Mailbox.mailbox() val reqEvt = Mailbox.recvEvt reqMB val entryEvt = CML.wrap (reqEvt, fn (arg, replV) => let val (res, state') = f arg in SyncVar.iPut(replV, res); state' end) in {call = call reqMB, entryEvt = entryEvt} end fun mkRPC_InOut f = let val reqMB = Mailbox.mailbox() val reqEvt = Mailbox.recvEvt reqMB fun entryEvt state = CML.wrap (reqEvt, fn (arg, replV) => let val (res, state') = f(arg, state) in SyncVar.iPut(replV, res); state' end) in {call = call reqMB, entryEvt = entryEvt} end end mlton-20100608/lib/cml/cml-lib/trace-cml.cm0000644000076600000240000000154511404435636016622 0ustar mtfstaff(* trace-cml.cm * * COPYRIGHT (c) 1996 AT&T Research. * * The TraceCML library module needs access to CML internals, so we package * it up into a sub-group. *) Group (cm-descr/trace-cml.cm) (* Notice that the "owner" specification above gets ignored by the old * CM. Under the old CM clients use _this_ file to refer to the * trace library, under the new CM clients use the description file * in cm-descr/trace-cml.cm. * This is done to avoid a file-naming conflict for smlnj-lib.cm. * The conflict is caused by the old CM's path-search mechanism and * does not occur under the new CM. *) signature TRACE_CML structure TraceCML is #if defined (NEW_CM) $/smlnj-lib.cm $cml/basis.cm $cml/core-cml.cm $cml/cml.cm #else smlnj-lib.cm ../src/basis.cm ../src/core-cml.cm ../src/cml.cm #endif trace-cml-sig.sml trace-cml.sml mlton-20100608/lib/cml/cml-lib/trace-cml.sig0000644000076600000240000000634411404435636017007 0ustar mtfstaff(* trace-cml-sig.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories * * This module provides rudimentary debugging support in the form of mechanisms * to control debugging output, and to monitor thread termination. This * version of this module is adapted from Cliff Krumvieda's utility for tracing * CML programs. It provides three facilities: trace modules, for controlling * debugging output; thread watching, for detecting thread termination; and * a mechanism for reporting uncaught exceptions on a per thread basis. *) signature TRACE_CML = sig (** Trace modules ** * * The basic idea is that one defines a heirarchy of ``trace * modules,'' which provide valves for debugging output. *) type trace_module (* where to direct trace output to *) datatype trace_to = TraceToOut | TraceToErr | TraceToNull | TraceToFile of string | TraceToStream of TextIO.outstream val setTraceFile : trace_to -> unit (* Direct the destination of trace output. Note: TraceToStream * can only be specified as a destination if CML is running. *) val traceRoot : trace_module (* the root module of the trace hierarchy *) exception NoSuchModule val traceModule : (trace_module * string) -> trace_module val nameOf : trace_module -> string (* return the name of the module *) val moduleOf : string -> trace_module (* return the module specified by the given string, or raise * NoSuchModule if none exists. *) val traceOn : trace_module -> unit (* turn tracing on for a module and its descendents *) val traceOff : trace_module -> unit (* turn tracing off for a module and its descendents *) val traceOnly : trace_module -> unit (* turn tracing on for a module (but not for its descendents) *) val amTracing : trace_module -> bool (* return true if this module is being traced *) val status : trace_module -> (trace_module * bool) list (* return a list of the registered modules dominated by the given * module, and their status. *) val trace : (trace_module * (unit -> string list)) -> unit (* conditionally generate tracing output *) (** Thread watching **) val watcher : trace_module (* controls printing of thread watching messages; the module's name * is "/ThreadWatcher/" *) val watch : (string * CML.thread_id) -> unit (* watch the given thread for unexpected termination *) val unwatch : CML.thread_id -> unit (* stop watching the named thread *) (** Uncaught exception handling **) val setUncaughtFn : ((CML.thread_id * exn) -> unit) -> unit (* this sets the default uncaught exception action. *) val setHandleFn : ((CML.thread_id * exn) -> bool) -> unit (* add an additional uncaught exception action. If the action returns * true, then no further action is taken. This can be used to handle * application specific exceptions. *) val resetUncaughtFn : unit -> unit (* this resets the default uncaught exception action to the system default, * and removes any layered actions. *) end; (* TRACE_CML *) mlton-20100608/lib/cml/cml-lib/trace-cml.sml0000644000076600000240000003003011404435636017005 0ustar mtfstaff(* trace-cml.sml * * COPYRIGHT (c) 1992 AT&T Bell Laboratories * * This module provides rudimentary debugging support in the form of mechanisms * to control debugging output, and to monitor thread termination. This * version of this module is adapted from Cliff Krumvieda's utility for tracing * CML programs. It provides three facilities: trace modules, for controlling * debugging output; thread watching, for detecting thread termination; and * a mechanism for reporting uncaught exceptions on a per thread basis. *) structure TraceCML : TRACE_CML = struct structure SV = SyncVar (* where to direct trace output to *) datatype trace_to = TraceToOut | TraceToErr | TraceToNull | TraceToFile of string | TraceToStream of TextIO.outstream exception NoSuchModule (** Trace Modules **) datatype trace_module = TM of { full_name : string, label : string, tracing : bool ref, children : trace_module list ref } val traceRoot = TM{ full_name = "/", label = "", tracing = ref false, children = ref [] } fun forAll f = let fun for (tm as TM{children, ...}) = (f tm; forChildren(!children)) and forChildren [] = () | forChildren (tm::r) = (for tm; forChildren r) in for end structure SS = Substring fun findTraceModule name = let fun eq ss (TM{label, ...}) = (SS.compare(SS.all label, ss) = EQUAL) fun find ([], tm) = SOME tm | find (arc::rest, tm as TM{label, children, ...}) = let val eqArc = eq arc fun findChild [] = NONE | findChild (c::r) = if (eqArc c) then find(rest, c) else findChild r in findChild (!children) end in find ( SS.tokens (fn #"/" => true | _ => false) (SS.all name), traceRoot) end fun traceModule' (TM parent, name) = let fun checkChildren [] = let val tm = TM{ full_name = (#full_name parent ^ name), label = name, tracing = ref(!(#tracing parent)), children = ref [] } in (#children parent) := tm :: !(#children parent); tm end | checkChildren((tm as TM{label, ...})::r) = if (label = name) then tm else checkChildren r in checkChildren (! (#children parent)) end (* return the name of the module *) fun nameOf (TM{full_name, ...}) = full_name (* return the module specified by the given string *) fun moduleOf' name = (case findTraceModule name of NONE => raise NoSuchModule | (SOME tm) => tm (* end case *)) (* turn tracing on for a module and its descendents *) val traceOn' = forAll (fn (TM{tracing, ...}) => tracing := true) (* turn tracing off for a module and its descendents *) val traceOff' = forAll (fn (TM{tracing, ...}) => tracing := false) (* turn tracing on for a module (but not for its descendents) *) fun traceOnly' (TM{tracing, ...}) = tracing := true (* return true if this module is being traced *) fun amTracing (TM{tracing, ...}) = !tracing (* return a list of the registered modules dominated by the given * module, and their status. *) fun status' root = let fun list (tm as TM{tracing, children, ...}, l) = listChildren (!children, (tm, !tracing)::l) and listChildren ([], l) = l | listChildren (c::r, l) = listChildren(r, list(c, l)) in rev (list (root, [])) end (** Trace printing **) val traceDst = ref TraceToOut val traceCleanup = ref (fn () => ()) fun setTraceFile' t = traceDst := t (** NOTE: there are bookkeeping bugs, when changing the trace destination ** from TraceToStream to something else (where the original destination ** was TraceToFile). **) fun tracePrint s = let fun output strm = (TextIO.output(strm, s); TextIO.flushOut strm) in case !traceDst of TraceToOut => output TextIO.stdOut | TraceToErr => output TextIO.stdErr | TraceToNull => () | (TraceToFile fname) => let val dst = let val strm = TextIO.openOut fname in traceCleanup := (fn () => TextIO.closeOut strm); TraceToStream strm end handle _ => ( Debug.sayDebug(concat[ "TraceCML: unable to open \"", fname, "\", redirecting to stdout" ]); TraceToOut) in setTraceFile' dst; tracePrint s end | (TraceToStream strm) => output strm (* end case *) end (** Trace server **) val traceCh : (unit -> string list) CML.chan = CML.channel() val traceUpdateCh : (unit -> unit) CML.chan = CML.channel() fun traceServer () = let val evt = [ CML.wrap(CML.recvEvt traceCh, fn f => tracePrint(concat(f()))), CML.wrap(CML.recvEvt traceUpdateCh, fn f => f()) ] fun loop () = (CML.select evt; loop()) in loop() end (* traceServer *) fun tracerStart () = (CML.spawn traceServer; ()) fun tracerStop () = ((!traceCleanup)(); traceCleanup := (fn () => ())) val _ = ( RunCML.logChannel ("TraceCML:trace", traceCh); RunCML.logChannel ("TraceCML:trace-update", traceUpdateCh); RunCML.logServer ("TraceCML:trace-server", tracerStart, tracerStop)) local fun carefully f = if RunCML.isRunning() then CML.send(traceUpdateCh, f) else f() fun carefully' f = if RunCML.isRunning() then let val reply = SV.iVar() in CML.send (traceUpdateCh, fn () => (SV.iPut(reply, f()))); SV.iGet reply end else f() in fun traceModule arg = carefully' (fn () => traceModule' arg) fun moduleOf name = carefully' (fn () => moduleOf' name) fun traceOn tm = carefully (fn () => traceOn' tm) fun traceOff tm = carefully (fn () => traceOff' tm) fun traceOnly tm = carefully (fn () => traceOnly' tm) fun setTraceFile f = carefully (fn () => setTraceFile' f) fun status root = carefully' (fn () => status' root) end (* local *) fun trace (TM{tracing, ...}, prFn) = if (RunCML.isRunning() andalso (!tracing)) then CML.send(traceCh, prFn) else () (** Thread watching **) (* controls printing of thread watching messages *) val watcher = traceModule (traceRoot, "ThreadWatcher") val _ = traceOn watcher datatype watcher_msg = WATCH of (CML.thread_id * unit CML.chan) | UNWATCH of (CML.thread_id * unit SV.ivar) val watcherMb : watcher_msg Mailbox.mbox = Mailbox.mailbox () (* stop watching the named thread *) fun unwatch tid = let val ackV = SV.iVar() in Mailbox.send(watcherMb, UNWATCH(tid, ackV)); SV.iGet ackV end (* watch the given thread for unexpected termination *) fun watch (name, tid) = let val unwatchCh = CML.channel() fun handleTermination () = ( trace (watcher, fn () => [ "WARNING! Watched thread ", name, CML.tidToString tid, " has died.\n" ]); unwatch tid) fun watcherThread () = ( Mailbox.send (watcherMb, WATCH(tid, unwatchCh)); CML.select [ CML.recvEvt unwatchCh, CML.wrap (CML.joinEvt tid, handleTermination) ]) in CML.spawn (watcherThread); () end structure TidTbl = HashTableFn ( struct type hash_key = CML.thread_id val hashVal = CML.hashTid val sameKey = CML.sameTid end) (* the watcher server *) fun startWatcher () = let val tbl = TidTbl.mkTable (32, Fail "startWatcher") fun loop () = (case (Mailbox.recv watcherMb) of (WATCH arg) => TidTbl.insert tbl arg | (UNWATCH(tid, ack)) => ( (* notify the watcher that the thread is no longer being * watched, and then acknowledge the unwatch command. *) CML.send(TidTbl.remove tbl tid, ()) handle _ => (); (* acknowledge that the thread has been removed *) SV.iPut(ack, ())) (* end case *); loop ()) in CML.spawn loop; () end val _ = ( RunCML.logMailbox ("TraceCML:watcherMb", watcherMb); RunCML.logServer ("TraceCML:watcher-server", startWatcher, fn () => ())) (** Uncaught exception handling **) fun defaultHandlerFn (tid, ex) = let val raisedAt = (case (SMLofNJ.exnHistory ex) of [] => ["\n"] | l => [" raised at ", List.last l, "\n"] (* end case *)) in Debug.sayDebug (concat ([ CML.tidToString tid, " uncaught exception ", exnName ex, " [", exnMessage ex, "]" ] @ raisedAt)) end val defaultHandler = ref defaultHandlerFn val handlers = ref ([] : ((CML.thread_id * exn) -> bool) list) (* this sets the default uncaught exception action. *) fun setUncaughtFn' action = defaultHandler := action (* add an additional uncaught exception action. If the action returns * true, then no further action is taken. This can be used to handle * handle application specific exceptions. *) fun setHandleFn' action = handlers := action :: !handlers (* this resets the default uncaught exception action to the system default, * and removes any layered actions. *) fun resetUncaughtFn' () = (defaultHandler := defaultHandlerFn; handlers := []) val exnUpdateCh : (unit -> unit) CML.chan = CML.channel() fun exnServerStartup () = let val errCh = Mailbox.mailbox() (* this function is installed as the default handler for threads; * it sends the thread ID and uncaught exception to the ExnServer. *) fun threadHandler exn = Mailbox.send(errCh, (CML.getTid(), exn)) (* invoke the hsndler actions on the uncaught exception *) fun handleExn arg = let val hdlrList = !handlers and dfltHndlr = !defaultHandler fun loop [] = dfltHndlr arg | loop (hdlr::r) = if (hdlr arg) then () else loop r in CML.spawn (fn () => ((loop hdlrList) handle _ => (dfltHndlr arg))); () end val event = [ CML.wrap (CML.recvEvt exnUpdateCh, fn f => f()), CML.wrap (Mailbox.recvEvt errCh, handleExn) ] fun server () = (CML.select event; server()) in Thread.defaultExnHandler := threadHandler; CML.spawn server; () end val _ = ( RunCML.logChannel ("TraceCML:exnUpdateCh", exnUpdateCh); RunCML.logServer ("TraceCML", exnServerStartup, fn () => ())) local fun carefully f = if RunCML.isRunning() then CML.send(exnUpdateCh, f) else f() in fun setUncaughtFn arg = carefully (fn () => setUncaughtFn' arg) fun setHandleFn arg = carefully (fn () => setHandleFn' arg) fun resetUncaughtFn arg = carefully (fn () => resetUncaughtFn' arg) end (* local *) end; (* TraceCML *) mlton-20100608/lib/cml/cml.mlb0000644000076600000240000000011211404435636014347 0ustar mtfstaffann "forceUsed" in core-cml/core-cml.mlb cml-lib/cml-lib.mlb end mlton-20100608/lib/cml/core-cml/0000755000076600000240000000000011404470406014601 5ustar mtfstaffmlton-20100608/lib/cml/core-cml/channel.sig0000644000076600000240000000137711404435636016733 0ustar mtfstaff(* channel.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* channel-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * The representation of synchronous channels. *) signature CHANNEL = sig type 'a chan val channel : unit -> 'a chan val sameChannel : ('a chan * 'a chan) -> bool val send : ('a chan * 'a) -> unit val recv : 'a chan -> 'a val sendEvt : ('a chan * 'a) -> unit Event.event val recvEvt : 'a chan -> 'a Event.event val sendPoll : ('a chan * 'a) -> bool val recvPoll : 'a chan -> 'a option end signature CHANNEL_EXTRA = sig include CHANNEL (*val resetChan : 'a chan -> unit*) end mlton-20100608/lib/cml/core-cml/channel.sml0000644000076600000240000003646611404435636016753 0ustar mtfstaff(* channel.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* channel.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * The representation of synchronous channels. * * To ensure that we always leave the atomic region exactly once, we * require that the blocking operation be responsible for leaving the * atomic region (in the event case, it must also execute the clean-up * action). The doitFn always transfers control to the blocked thread * without leaving the atomic region. Note that the send (and sendEvt) * blockFns run using the receiver's thread ID. *) structure Channel : CHANNEL_EXTRA = struct structure Assert = LocalAssert(val assert = false) structure Debug = LocalDebug(val debug = false) structure Q = ImpQueue structure S = Scheduler structure E = Event fun debug msg = Debug.sayDebug ([S.atomicMsg, S.tidMsg], msg) fun debug' msg = debug (fn () => msg) datatype trans_id = datatype TransID.trans_id datatype trans_id_state = datatype TransID.trans_id_state datatype 'a chan = CHAN of {prio : int ref, inQ : (trans_id * 'a S.thread) Q.t, outQ : (trans_id * 'a S.thread S.thread) Q.t} (* fun resetChan (CHAN {prio, inQ, outQ}) = (prio := 1 ; Q.reset inQ ; Q.reset outQ) *) fun channel () = CHAN {prio = ref 1, inQ = Q.new (), outQ = Q.new ()} (* sameChannel : ('a chan * 'a chan) -> bool *) fun sameChannel (CHAN {prio = prio1, ...}, CHAN {prio = prio2, ...}) = prio1 = prio2 (* bump a priority value by one, returning the old value *) fun bumpPriority (p as ref n) = (p := n+1; n) (* functions to clean channel input and output queues *) local fun cleaner (TXID txst, _) = case !txst of CANCEL => true | _ => false in fun cleanAndChk (prio, q) : int = (Q.clean (q, cleaner) ; if Q.empty q then 0 else bumpPriority prio) fun cleanAndDeque q = Q.cleanAndDeque (q, cleaner) fun enqueAndClean (q, item) = Q.enqueAndClean (q, item, cleaner) end fun send (CHAN {prio, inQ, outQ}, msg) = let val () = Assert.assertNonAtomic' "Channel.send" val () = debug' "Chennel.send(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.send(1)" val () = S.atomicBegin () val () = debug' "Channel.send(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.send(2)", SOME 1) val () = case cleanAndDeque inQ of SOME (rtxid, rt) => let val () = debug' "Channel.send(3.1.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.send(3.1.1)", SOME 1) val () = S.readyAndSwitch (fn () => (prio := 1 ; TransID.force rtxid ; S.prepVal (rt, msg))) val () = debug' "Channel.send(3.1.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.send(3.1.2)" in () end | NONE => let val () = debug' "Channel.send(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.send(3.2.1)", SOME 1) val rt = S.atomicSwitchToNext (fn st => Q.enque (outQ, (TransID.mkTxId (), st))) val () = debug' "Channel.send(3.2.2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.send(3.2.2)", SOME 1) val () = S.atomicReadyAndSwitch (fn () => S.prepVal (rt, msg)) val () = debug' "Chanell.send(3.2.3)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.send(3.2.2)" in () end val () = debug' "Channel.send(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.send(4)" in () end fun sendEvt (CHAN {prio, inQ, outQ}, msg) = let fun doitFn () = let val () = Assert.assertAtomic' ("Channel.sendEvt.doitFn", NONE) val (rtxid, rt) = valOf (Q.deque inQ) val () = debug' "Channel.sendEvt(3.1.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.sendEvt(3.1.1)", SOME 1) val () = S.readyAndSwitch (fn () => (prio := 1 ; TransID.force rtxid ; S.prepVal (rt, msg))) val () = debug' "Channel.sendEvt(3.1.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.sendEvt(3.1.2)" in () end fun blockFn {transId, cleanUp, next} = let val () = Assert.assertAtomic' ("Channel.sendEvt.blockFn", NONE) val () = debug' "Channel.sendEvt(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.sendEvt(3.2.1)", SOME 1) val rt = S.atomicSwitch (fn st => (enqueAndClean (outQ, (transId, st)) ; next ())) val () = debug' "Channel.sendEvt(3.2.2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.sendEvt(3.2.2)", SOME 1) val () = cleanUp () val () = S.atomicReadyAndSwitch (fn () => S.prepVal (rt, msg)) val () = debug' "Channel.sendEvt(3.2.3)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.sendEvt(3.2.2)" in () end fun pollFn () = let val () = Assert.assertAtomic' ("Channel.sendEvt.pollFn", NONE) val () = debug' "Channel.sendEvt(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.sendEvt(2)", SOME 1) in case cleanAndChk (prio, inQ) of 0 => E.blocked blockFn | prio => E.enabled {prio = prio, doitFn = doitFn} end in E.bevt pollFn end fun sendPoll (CHAN {prio, inQ, ...}, msg) = let val () = Assert.assertNonAtomic' "Channel.sendPoll" val () = debug' "Channel.sendPoll(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.sendPoll(1)" val () = S.atomicBegin () val () = debug' "Channel.sendPoll(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.sendPoll(1)", SOME 1) val b = case cleanAndDeque inQ of SOME (rtxid, rt) => let val () = debug' "Channel.sendPoll(3.1.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.sendPoll(3.1.1)", SOME 1) val () = S.readyAndSwitch (fn () => (prio := 1 ; TransID.force rtxid ; S.prepVal (rt, msg))) val b = true val () = debug' "Channel.sendPoll(3.1.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.sendPoll(3.1.2)" in b end | NONE => let val () = debug' "Channel.sendPoll(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.sendPoll(3.2.1)", SOME 1) val b = false val () = debug' "Channel.sendPoll(3.2.2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.sendPoll(3.2.2)", SOME 1) val () = S.atomicEnd () val () = debug' "Channel.sendPoll(3.2.3)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.sendPoll(3.2.2)" in b end val () = debug' "Channel.sendPoll(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.sendPoll(4)" in b end fun recv (CHAN {prio, inQ, outQ}) = let val () = Assert.assertNonAtomic' "Channel.recv" val () = debug' "Channel.recv(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recv(1)" val () = S.atomicBegin () val () = debug' "Channel.recv(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recv(2)", SOME 1) val msg = case cleanAndDeque outQ of SOME (stxid, st) => let val () = debug' "Channel.recv(3.1.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recv(3.1.1)", SOME 1) val msg = S.switch (fn rt => (prio := 1 ; TransID.force stxid ; S.prepVal (st, rt))) val () = debug' "Channel.recv(3.1.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recv(3.1.1)" in msg end | NONE => let val () = debug' "Channel.recv(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recv(3.2.1)", SOME 1) val msg = S.atomicSwitchToNext (fn rt => enqueAndClean (inQ, (TransID.mkTxId (), rt))) val () = debug' "Channel.recv(3.2.2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recv(3.2.2)", SOME 1) val () = S.atomicEnd () val () = debug' "Channel.recv(3.2.3)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recv(3.2.3)" in msg end val () = debug' "Channel.recv(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recv(4)" in msg end fun recvEvt (CHAN {prio, inQ, outQ}) = let fun doitFn () = let val () = Assert.assertAtomic' ("Channel.recvEvt.doitFn", NONE) val (stxid, st) = valOf (Q.deque outQ) val () = debug' "Channel.recvEvt(3.1.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recvEvt(3.1.1)", SOME 1) val msg = S.switch (fn rt => (prio := 1 ; TransID.force stxid ; S.prepVal (st, rt))) val () = debug' "Channel.recvEvt(3.1.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recvEvt(3.1.1)" in msg end fun blockFn {transId, cleanUp, next} = let val () = Assert.assertAtomic' ("Channel.recvEvt.blockFn", NONE) val () = debug' "Channel.recvEvt(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recvEvt(3.2.1)", SOME 1) val msg = S.atomicSwitch (fn rt => (enqueAndClean (inQ, (transId, rt)) ; next ())) val () = debug' "Channel.recvEvt(3.2.2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recvEvt(3.2.2)", SOME 1) val () = cleanUp () val () = S.atomicEnd () val () = debug' "Channel.recvEvt(3.2.3)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recvEvt(3.2.3)" in msg end fun pollFn () = let val () = Assert.assertAtomic' ("Channel.recvEvt.pollFn", NONE) val () = debug' "Channel.recvEvt(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recvEvt(2)", SOME 1) in case cleanAndChk (prio, outQ) of 0 => E.blocked blockFn | prio => E.enabled {prio = prio, doitFn = doitFn} end in E.bevt pollFn end fun recvPoll (CHAN {prio, outQ, ...}) = let val () = Assert.assertNonAtomic' "Channel.recvPoll" val () = debug' "Channel.recvPoll(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recvPoll(1)" val () = S.atomicBegin () val () = debug' "Channel.recvPoll(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recvPoll(2)", SOME 1) val msg = case cleanAndDeque outQ of SOME (stxid, st) => let val () = debug' "Channel.recvPoll(3.1.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recvPoll(3.1.1)", SOME 1) val msg = S.switch (fn rt => (prio := 1 ; TransID.force stxid ; S.prepVal (st, rt))) val msg = SOME msg val () = debug' "Channel.recvPoll(3.1.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recvPoll(3.1.1)" in msg end | NONE => let val () = debug' "Channel.recv(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recv(3.2.1)", SOME 1) val msg = NONE val () = debug' "Channel.recvPoll(3.2.2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Channel.recvPoll(3.2.2)", SOME 1) val () = S.atomicEnd () val () = debug' "Channel.recvPoll(3.2.3)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recvPoll(3.2.3)" in msg end val () = debug' "Channel.recvPoll(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recvPoll(4)" in msg end end mlton-20100608/lib/cml/core-cml/cml.sig0000644000076600000240000000056411404435636016073 0ustar mtfstaff(* cml.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* cml-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * The interface to the core CML features. *) signature CML = sig include VERSION include THREAD include CHANNEL include EVENT include TIME_OUT end mlton-20100608/lib/cml/core-cml/cml.sml0000644000076600000240000000050111404435636016073 0ustar mtfstaff(* cml.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* cml.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) structure CML : CML = struct open Version open Thread open Channel open Event open TimeOut end mlton-20100608/lib/cml/core-cml/core-cml.mlb0000644000076600000240000000167211404435636017012 0ustar mtfstaffann "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" in local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/mlton.mlb ../util/util.mlb rep-types.sml running.sml trans-id.sig trans-id.sml cvar.sig cvar.sml thread-id.sig thread-id.sml scheduler-hooks.sig scheduler-hooks.sml scheduler.sig scheduler.sml event.sig event.sml thread.sig thread.sml channel.sig channel.sml timeout.sig timeout.sml version.sig version.sml cml.sig cml.sml mailbox.sig mailbox.sml sync-var.sig sync-var.sml run-cml.sig run-cml.sml rebind.sml in signature CML structure CML signature SYNC_VAR structure SyncVar signature MAILBOX structure Mailbox structure RunCML end end mlton-20100608/lib/cml/core-cml/cvar.sig0000644000076600000240000000053311404435636016247 0ustar mtfstaff(* cvar.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* ??? * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) signature CVAR = sig datatype cvar = datatype RepTypes.cvar datatype cvar_state = datatype RepTypes.cvar_state val new : unit -> cvar end mlton-20100608/lib/cml/core-cml/cvar.sml0000644000076600000240000000114411404435636016257 0ustar mtfstaff(* cvar.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* ??? * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) structure CVar : CVAR = struct structure R = RepTypes (* Condition variables are essentially unit valued ivars, and * are used for various internal synchronization conditions * (e.g., nack events, I/O synchronization, and thread termination). *) datatype cvar = datatype R.cvar datatype cvar_state = datatype R.cvar_state fun new () = CVAR (ref (CVAR_unset [])) end mlton-20100608/lib/cml/core-cml/event.sig0000644000076600000240000000226511404435636016441 0ustar mtfstaff(* event.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* events-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * The representation of event values and the event combinators. *) signature EVENT = sig type 'a event val never : 'a event val alwaysEvt : 'a -> 'a event val wrap : ('a event * ('a -> 'b)) -> 'b event val wrapHandler : ('a event * (exn -> 'a)) -> 'a event val guard : (unit -> 'a event) -> 'a event val withNack : (unit event -> 'a event) -> 'a event val choose : 'a event list -> 'a event val sync : 'a event -> 'a val select : 'a event list -> 'a end signature EVENT_EXTRA = sig include EVENT type 'a status val enabled : {prio : int, doitFn : unit -> 'a} -> 'a status val blocked : ({transId : TransID.trans_id, cleanUp : unit -> unit, next : unit -> Scheduler.rdy_thread} -> 'a) -> 'a status val bevt : (unit -> 'a status) -> 'a event val atomicCVarSet : CVar.cvar -> unit val cvarGetEvt : CVar.cvar -> unit event end mlton-20100608/lib/cml/core-cml/event.sml0000644000076600000240000007155011404435636016455 0ustar mtfstaff(* event.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* event.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * The representation of event values and the event combinators. * * Some important requirements on the implementation of base event values: * * 1) The pollFn, doitFn, and blockFn are always called from inside * atomic regions. * * 2) The pollFn returns an integer priority: this is 0 when not enabled, * ~1 for fixed priority, and a positive value for dynamic priority. * The standard scheme is to associate a counter with the underlying * synchronization object, and to increase it by one for each * synchronization attempt. * * 3) The blockFn is responsible for exiting the atomic region; the doitFns * should NOT leave the atomic region. * * 4) The blockFn is responsible for executing the "cleanUp" action * prior to leaving the atomic region. *) structure Event : EVENT_EXTRA = struct structure Assert = LocalAssert(val assert = false) structure Debug = LocalDebug(val debug = false) structure S = Scheduler fun debug msg = Debug.sayDebug ([S.atomicMsg, S.tidMsg], msg) fun debug' msg = debug (fn () => msg) datatype trans_id = datatype TransID.trans_id datatype trans_id_state = datatype TransID.trans_id_state datatype cvar = datatype CVar.cvar datatype cvar_state = datatype CVar.cvar_state datatype status = datatype RepTypes.status val enabled = ENABLED val blocked = BLOCKED type 'a base = 'a RepTypes.base datatype event = datatype RepTypes.event val bevt = fn pollFn => BEVT [pollFn] datatype 'a group = BASE of 'a base list | GRP of 'a group list | NACK of cvar * 'a group (** Condition variables. Because these variables are set inside atomic ** regions, we have to use different conventions for clean-up, etc. ** Instead of requiring the blockFn continuation to call the cleanUp ** action and to leave the atomic region, we call the cleanUp function ** when setting the condition variable (in atomicCVarSet), and have the ** invariant that the blockFn continuation is dispatched outside the ** atomic region. **) (* set a condition variable; * we assume that this function is always executed in an atomic region. *) fun atomicCVarSet (CVAR state) : unit = let val () = Assert.assertAtomic' ("Event.atomicCVarSet", NONE) val () = debug' "atomicCVarSet" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.atomicCVarSet", SOME 1) in case !state of CVAR_unset waiting => let fun add waiting : unit = case waiting of [] => () | ({transId = TXID txst, cleanUp: unit -> unit, thread}::waiting) => (case !txst of CANCEL => () | TRANS => (txst := CANCEL ; cleanUp () ; S.ready thread) ; add waiting) in state := CVAR_set 1 ; add waiting end | _ => raise Fail "atomicCVarSet" end (* the event constructor for waiting on a cvar. *) fun cvarGetEvt (CVAR state) : unit event = let fun doitFn () = let val () = Assert.assertAtomic' ("Event.cvarGetEvt.doitFn", NONE) val () = debug' "cvarGetEvt(3.1.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.cvarGetEvt(3.1.1)", SOME 1) val () = state := CVAR_set 1 val () = S.atomicEnd () val () = debug' "cvarGetEvt(3.1.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.cvarGetEvt(3.1.2)" in () end fun blockFn {transId, cleanUp, next} = let val () = Assert.assertAtomic' ("Event.cvarGetEvt.blockFn", NONE) val () = debug' "cvarGetEvt(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.cvarGetEvt(3.2.1)", SOME 1) val () = S.atomicSwitch (fn t => let val item = {transId = transId, cleanUp = cleanUp, thread = S.prep t} val waiting = case !state of CVAR_unset waiting => waiting | _ => raise Fail "cvarGetEvt:blockFn" in state := CVAR_unset (item::waiting) ; next () end) val () = debug' "cvarGetEvt(3.2.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.cvarGetEvt(3.2.2)" in () end fun pollFn () = let val () = Assert.assertAtomic' ("Event.cvarGetEvt.pollFn", NONE) val () = debug' "cvarGetEvt(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.cvarGetEvt(2)", SOME 1) in case !state of CVAR_set n => (state := CVAR_set (n + 1) ; enabled {prio = n, doitFn = doitFn}) | _ => blocked blockFn end in bevt pollFn end (* event combinators *) val never : 'a event = BEVT [] fun alwaysEvt (v : 'a) : 'a event = let fun doitFn () = let val () = Assert.assertAtomic' ("Event.alwaysEvt.doitFn", NONE) val () = debug' "alwaysEvt(3.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.alwaysEvt(3.1)", SOME 1) val () = S.atomicEnd () val () = debug' "alwaysEvt(3.2)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.alwaysEvt(3.2)" in v end fun pollFn () = let val () = Assert.assertAtomic' ("Event.alwaysEvt.pollFn", NONE) val () = debug' "alwaysEvt(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.alwaysEvt(2)", SOME 1) in enabled {prio = ~1, doitFn = doitFn} end in bevt pollFn end fun wrap (evt : 'a event, wfn : 'a -> 'b) : 'b event = let fun wrapF f x = wfn (f x) fun wrapBaseEvt pollFn () = case pollFn () of ENABLED {prio, doitFn} => ENABLED {prio = prio, doitFn = wrapF doitFn} | BLOCKED blockFn => BLOCKED (wrapF blockFn) fun wrap' evt = case evt of BEVT bevts => BEVT(List.map wrapBaseEvt bevts) | CHOOSE evts => CHOOSE(List.map wrap' evts) | GUARD g => GUARD(fn () => wrap (g (), wfn)) | WNACK f => WNACK(fn evt => wrap (f evt, wfn)) in wrap' evt end fun wrapHandler (evt : 'a event, hfn : exn -> 'a) : 'a event = let fun wrapF f x = (f x) handle exn => hfn exn fun wrapBaseEvt pollFn () = case pollFn () of ENABLED {prio, doitFn} => ENABLED {prio = prio, doitFn = wrapF doitFn} | BLOCKED blockFn => BLOCKED (wrapF blockFn) fun wrap' evt = case evt of BEVT bevts => BEVT(List.map wrapBaseEvt bevts) | CHOOSE evts => CHOOSE(List.map wrap' evts) | GUARD g => GUARD(fn () => wrapHandler (g (), hfn)) | WNACK f => WNACK(fn evt => wrapHandler (f evt, hfn)) in wrap' evt end val guard = GUARD val withNack = WNACK fun choose (evts : 'a event list) : 'a event = let val () = Assert.assertNonAtomic' "Event.choose" val () = debug' "choose(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.choose(1)" fun gatherBEvts (evts, bevts') = case (evts, bevts') of ([], bevts') => BEVT bevts' | ((BEVT bevts)::evts, bevts') => gatherBEvts (evts, bevts @ bevts') | (evts, []) => gather (evts, []) | (evts, bevts') => gather (evts, [BEVT bevts']) and gather (evts, evts') = case (evts, evts') of ([], [evt']) => evt' | ([], evts') => CHOOSE evts' | ((CHOOSE cevts)::evts, evts') => gather (evts, cevts @ evts') | ((BEVT [])::evts, evts') => gather (evts, evts') | ((BEVT bevts)::evts, (BEVT bevts')::evts') => gather (evts, BEVT (bevts @ bevts')::evts') | (evt::evts, evts') => gather (evts, evt::evts') val evt = gatherBEvts (List.rev evts, []) in evt end local val cnt = ref 0 fun random i = let val j = !cnt in if j = 1000000 then cnt := 0 else cnt := j + 1 ; Int.rem (j, i) end in fun selectDoitFn (doitFns : {prio : int, doitFn : 'a} list) : 'a = let val () = Assert.assertAtomic' ("Event.selectDoitFn", NONE) val () = debug' "selectDoitFn(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.selectDoitFn(2)", SOME 1) in case doitFns of [{doitFn, ...}] => doitFn | doitFns => let fun select (doitFns, maxP, doitFnsMaxP, numMaxP, doitFnsFixed, numFixed) = case doitFns of [] => (case (doitFnsMaxP, doitFnsFixed) of ([doitFn], []) => doitFn | ([], [doitFn]) => doitFn | (doitFnsMaxP, doitFnsFixed) => let val bias = 2 val num = numFixed + bias * numMaxP val k = random num in if k < numFixed then List.nth (doitFnsFixed, k) else List.nth (doitFnsMaxP, Int.mod(k - numFixed, numMaxP)) end) | {prio, doitFn}::doitFns => if prio = ~1 then select(doitFns, maxP, doitFnsMaxP, numMaxP, doitFn::doitFnsFixed, numFixed + 1) else if prio > maxP then select(doitFns, prio, [doitFn], 1, doitFnsFixed, numFixed) else if prio = maxP then select(doitFns, maxP, doitFn::doitFnsMaxP, numMaxP + 1, doitFnsFixed, numFixed) else select(doitFns, maxP, doitFnsMaxP, numMaxP, doitFnsFixed, numFixed) in select (doitFns, 0, [], 0, [], 0) end end end fun syncOnBEvt (pollFn : 'a base) : 'a = let val () = Assert.assertNonAtomic' "Event.syncOnBEvt" val () = debug' "syncOnBEvt(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.syncOnBEvt(1)" val () = S.atomicBegin () val () = debug' "syncOnBEvt(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.syncOnBEvt(2)", SOME 1) val x = case pollFn () of ENABLED {doitFn, ...} => doitFn () | BLOCKED blockFn => let val (transId, cleanUp) = TransID.mkFlg () in blockFn {transId = transId, cleanUp = cleanUp, next = S.next} end val () = debug' "syncOnBEvt(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.syncOnBEvt(4)" in x end (* this function handles the case of synchronizing on a list of * base events (w/o any negative acknowledgements). It also handles * the case of syncrhonizing on NEVER. *) fun syncOnBEvts (bevts : 'a base list) : 'a = let val () = Assert.assertNonAtomic' "Event.syncOnBEvts" val () = debug' "syncOnBEvts(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.syncOnBEvts(1)" fun ext (bevts, blockFns) : 'a = let val () = debug' "syncOnBEvts(2).ext" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.syncOnBEvts(2).ext", SOME 1) in case bevts of [] => let val () = debug' "syncOnBEvts(2).ext([])" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.syncOnBEvts(2).ext([])", SOME 1) in S.atomicSwitch (fn (t : 'a S.thread) => let val (transId, cleanUp) = TransID.mkFlg () fun log blockFns : S.rdy_thread = let val () = debug' "syncOnBEvts(2).ext([]).log" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.syncOnBEvts(2).ext([]).log", SOME 1) in case blockFns of [] => S.next () | blockFn::blockFns => (S.prep o S.new) (fn _ => fn () => let val () = S.atomicBegin () val x = blockFn {transId = transId, cleanUp = cleanUp, next = fn () => log blockFns} in S.switch(fn _ => S.prepVal (t, x)) end) end in log blockFns end) end | pollFn::bevts => (case pollFn () of ENABLED doitFn => extRdy (bevts, [doitFn]) | BLOCKED blockFn => ext (bevts, blockFn::blockFns)) end and extRdy (bevts, doitFns) : 'a = let val () = debug' "syncOnBEvts(2).extRdy" (* Atomic 1*) val () = Assert.assertAtomic' ("Event.syncOnBEvts(2).extRdy", SOME 1) in case bevts of [] => let val doitFn = selectDoitFn doitFns in doitFn () end | pollFn::bevts => (case pollFn () of ENABLED doitFn => extRdy (bevts, doitFn::doitFns) | _ => extRdy (bevts, doitFns)) end val x = case bevts of [] => S.switchToNext (fn _ => ()) | [bevt] => syncOnBEvt bevt | bevts => (S.atomicBegin (); ext (bevts, [])) val () = debug' "syncOnBEvts(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.syncOnBEvts(4)" in x end (* walk the event group tree, collecting the base events (with associated * ack flags), and a list of flag sets. A flag set is a (cvar * ack flag list) * pair, where the flags are those associated with the events covered by the * nack cvar. *) type ack_flg = bool ref type ack_flgs = ack_flg list type 'a back = 'a base * ack_flg type 'a backs = 'a back list type flg_set = cvar * ack_flg list type flg_sets = flg_set list fun collect (gevt : 'a group) : 'a backs * flg_sets = let fun gatherWrapped (gevt : 'a group, backs : 'a backs, flgSets : flg_sets) : 'a backs * flg_sets = let fun gather (gevt : 'a group, backs : 'a backs, ackFlgs : ack_flgs, flgSets : flg_sets) : 'a backs * ack_flgs * flg_sets = case gevt of BASE bevts => let fun append (bevts, backs, ackFlgs) = case bevts of [] => (backs, ackFlgs) | bevt::bevts => let val ackFlg = ref false in append (bevts, (bevt, ackFlg)::backs, ackFlg::ackFlgs) end val (backs', ackFlgs') = append (bevts, backs, ackFlgs) in (backs', ackFlgs', flgSets) end | GRP gevt => let fun f (gevt', (backs', ackFlgs', flgSets')) = gather (gevt', backs', ackFlgs', flgSets') in List.foldl f (backs, ackFlgs, flgSets) gevt end | NACK (cvar, gevt) => let val (backs', ackFlgs', flgSets') = gather (gevt, backs, [], flgSets) in (backs', ackFlgs' @ ackFlgs, (cvar, ackFlgs')::flgSets') end val (backs, _, flgSets) = gather (gevt, backs, [], flgSets) in (backs, flgSets) end in case gevt of GRP _ => let val ackFlg = ref false fun gather (gevt : 'a group, backs : 'a backs, flgSets : flg_sets) : 'a backs * flg_sets = case gevt of BASE bevts => let fun append (bevts, backs) = case bevts of [] => backs | bevt::bevts => append (bevts, (bevt, ackFlg)::backs) in (append (bevts, backs), flgSets) end | GRP gevt => let fun f (gevt', (backs', flgSets')) = gather(gevt', backs', flgSets') in List.foldl f (backs, flgSets) gevt end | NACK _ => gatherWrapped (gevt, backs, flgSets) in gather (gevt, [], []) end | gevt => gatherWrapped (gevt, [], []) end (* this function handles the more complicated case of synchronization * on groups of events where negative acknowledgements are involved. *) fun syncOnGrp (gevt : 'a group) : 'a = let val () = Assert.assertNonAtomic' "Event.syncOnGrp" val () = debug' "syncOnGrp(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.syncOnGrp(1)" val (backs, flgSets) = collect gevt fun chkCVars () = let val () = debug' "syncOnGrp.chkCVars" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.syncOnGrp.chkCVars", SOME 1) (* chkCVar checks the flags of a flag set. * If they are all false, then the corresponding cvar * is set to signal the negative ack. *) fun chkCVar (cvar, flgs) = if List.exists ! flgs then () else atomicCVarSet cvar in List.app chkCVar flgSets end fun ext (backs, blockFns) : 'a = let val () = debug' "syncOnGrp(2).ext" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.syncOnGrp(2).ext", SOME 1) in case backs of [] => let val () = debug' "syncOnGrp(2).ext([])" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.syncOnGrp(2).ext([])", SOME 1) in S.atomicSwitch (fn (t : 'a S.thread) => let val (transId, cleanUp) = TransID.mkFlg () val cleanUp = fn flg => fn () => (cleanUp () ; flg := true ; chkCVars ()) fun log blockFns : S.rdy_thread = let val () = debug' "syncOnGrp(2).ext([]).log" (* Atomic 1 *) val () = Assert.assertAtomic' ("Event.syncOnGrp(2).ext([]).log", SOME 1) in case blockFns of [] => S.next () | (blockFn,ackFlg)::blockFns => (S.prep o S.new) (fn _ => fn () => let val () = S.atomicBegin () val x = blockFn {transId = transId, cleanUp = cleanUp ackFlg, next = fn () => log blockFns} in S.switch(fn _ => S.prepVal (t, x)) end) end in log blockFns end) end | (pollFn,ackFlg)::backs => (case pollFn () of ENABLED {prio, doitFn} => extRdy (backs, [{prio = prio,doitFn = (doitFn, ackFlg)}]) | BLOCKED blockFn => ext (backs, (blockFn,ackFlg)::blockFns)) end and extRdy (backs, doitFns) : 'a = let val () = debug' "syncOnGrp.extRdy(2)" (* Atomic 1*) val () = Assert.assertAtomic' ("Event.syncOnGrp.extRdy(2)", SOME 1) in case backs of [] => let val (doitFn, flg) = selectDoitFn doitFns in flg := true ; chkCVars () ; doitFn () end | (pollFn,ackFlg)::backs => (case pollFn () of ENABLED {prio, doitFn} => extRdy (backs, {prio = prio, doitFn = (doitFn, ackFlg)}::doitFns) | _ => extRdy (backs, doitFns)) end val x = (S.atomicBegin (); ext (backs, [])) val () = debug' "syncOnGrp(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.syncOnGrp(4)" in x end local (* force the evaluation of any guards in an event collection, * returning an event group. *) fun forceBL (evts : 'a event list, bevts : 'a base list) : 'a group = case evts of [] => BASE bevts | evt::evts => (case force evt of BASE bevts' => forceBL (evts, bevts' @ bevts) | GRP gevts => forceGL (evts, if List.null bevts then gevts else gevts @ [BASE bevts]) | gevt => forceGL (evts, if List.null bevts then [gevt] else [gevt, BASE bevts])) and forceGL (evts : 'a event list, gevts : 'a group list) : 'a group = case (evts, gevts) of ([], [gevt]) => gevt | ([], gevts) => GRP gevts | (evt::evts, gevts) => (case (force evt, gevts) of (BASE [], gevts) => forceGL (evts, gevts) | (BASE bevts', (BASE bevts)::gevts) => forceGL (evts, BASE (bevts' @ bevts)::gevts) | (GRP gevts', gevts) => forceGL (evts, gevts' @ gevts) | (gevt, gevts) => forceGL (evts, gevt::gevts)) and force (evt : 'a event) : 'a group = let val gevt = case evt of BEVT bevts => BASE bevts | CHOOSE evts => forceBL (evts, []) | GUARD g => force (g ()) | WNACK f => let val cvar = CVar.new () in NACK(cvar, force (f (cvarGetEvt cvar))) end in gevt end in fun sync evt = let val () = Assert.assertNonAtomic' "Event.sync" val () = debug' "sync(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.sync(1)" val x = case force evt of BASE bevts => syncOnBEvts bevts | gevt => syncOnGrp gevt val () = debug' "sync(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.sync(4)" in x end fun select (evts : 'a event list) : 'a = let val () = Assert.assertNonAtomic' "Event.select" val () = debug' "select(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.select(1)" val x = case forceBL (evts, []) of BASE bevts => syncOnBEvts bevts | gevt => syncOnGrp gevt val () = debug' "select(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Event.select(4)" in x end end end mlton-20100608/lib/cml/core-cml/mailbox.sig0000644000076600000240000000123311404435636016745 0ustar mtfstaff(* mailbox.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* mailbox-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories * COPYRIGHT (c) 1989-1991 John H. Reppy * * Asynchronous channels (called mailboxes). *) signature MAILBOX = sig type 'a mbox val mailbox : unit -> 'a mbox val sameMailbox : ('a mbox * 'a mbox) -> bool val send : ('a mbox * 'a) -> unit val recv : 'a mbox -> 'a val recvEvt : 'a mbox -> 'a CML.event val recvPoll : 'a mbox -> 'a option end signature MAILBOX_EXTRA = sig include MAILBOX (*val resetMbox : 'a mbox -> unit*) end mlton-20100608/lib/cml/core-cml/mailbox.sml0000644000076600000240000001326611404435636016767 0ustar mtfstaff(* mailbox.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* mailbox.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories * COPYRIGHT (c) 1989-1991 John H. Reppy * * Asynchronous channels (called mailboxes). *) structure Mailbox : MAILBOX_EXTRA = struct structure Assert = LocalAssert(val assert = false) structure Debug = LocalDebug(val debug = false) structure Q = FunQueue structure S = Scheduler structure E = Event fun debug msg = Debug.sayDebug ([S.atomicMsg, S.tidMsg], msg) fun debug' msg = debug (fn () => msg) datatype trans_id = datatype TransID.trans_id datatype trans_id_state = datatype TransID.trans_id_state (* the state of a mailbox. The queue of the NONEMPTY constructor should * never be empty (use EMPTY instead). *) datatype 'a state = EMPTY of (TransID.trans_id * 'a S.thread) Q.t | NONEMPTY of (int * 'a Q.t) datatype 'a mbox = MB of 'a state ref (* fun resetMbox (MB state) = state := EMPTY (Q.new ()) *) fun mailbox () = MB (ref (EMPTY (Q.new ()))) fun sameMailbox (MB s1, MB s2) = (s1 = s2) local fun cleaner (TXID txst, _) = case !txst of CANCEL => true | _ => false in fun cleanAndDeque q = Q.cleanAndDeque (q, cleaner) end fun send (MB state, x) = let val () = Assert.assertNonAtomic' "Mailbox.send" val () = debug' "Mailbox.send(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Mailbox.send(1)" val () = S.atomicBegin () val () = debug' "Mailbox.send(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Mailbox.send(2)", SOME 1) val () = case !state of EMPTY q => let val () = debug' "Mailbox.send(3.1.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Mailbox.send(3.1.1)", SOME 1) in case (cleanAndDeque q) of (NONE, _) => (let val q = Q.new () in state := NONEMPTY (1, Q.enque (q, x)) end ; S.atomicEnd()) | (SOME (transId', t'), q') => S.readyAndSwitch (fn () => (state := EMPTY q' ; TransID.force transId' ; S.prepVal (t', x))) end | NONEMPTY (p, q) => (* we force a context switch here to prevent * a producer from outrunning a consumer. *) S.atomicReadyAndSwitchToNext (fn () => state := NONEMPTY (p, Q.enque (q, x))) val () = debug' "Mailbox.send(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.send(4)" in () end fun getMsg (state, q) = let val (msg, q') = case Q.deque q of SOME (msg, q') => (msg, q') | NONE => raise Fail "Mailbox:getMsg" val () = if Q.empty q' then state := EMPTY (Q.new ()) else state := NONEMPTY (1, q') val () = S.atomicEnd () in msg end fun recv (MB state) = let val () = Assert.assertNonAtomic' "Mailbox.recv" val () = debug' "Mailbox.recv(1)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Mailbox.recv(1)" val () = S.atomicBegin () val () = debug' "Mailbox.recv(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("Mailbox.recv(2)", SOME 1) val msg = case !state of EMPTY q => let val msg = S.atomicSwitchToNext (fn t => state := EMPTY (Q.enque (q, (TransID.mkTxId (), t)))) in S.atomicEnd() ; msg end | NONEMPTY (_, q) => getMsg (state, q) val () = debug' "Mailbox.recv(4)" (* NonAtomic *) val () = Assert.assertNonAtomic' "Channel.recv(4)" in msg end fun recvEvt (MB state) = let fun blockFn {transId, cleanUp: unit -> unit, next} = let val q = case !state of EMPTY q => q | _ => raise Fail "Mailbox:recvEvt:blockFn" val msg = S.atomicSwitch (fn t => (state := EMPTY (Q.enque (q, (transId, t))) ; next ())) in cleanUp() ; S.atomicEnd() ; msg end fun pollFn () = case !state of EMPTY _ => E.blocked blockFn | NONEMPTY (prio, q) => (state := NONEMPTY (prio + 1, q) ; E.enabled {prio = prio, doitFn = fn () => getMsg (state, q)}) in E.bevt pollFn end fun recvPoll (MB state) = (S.atomicBegin() ; case !state of EMPTY _ => (S.atomicEnd(); NONE) | NONEMPTY (_, q) => SOME (getMsg (state, q))) end mlton-20100608/lib/cml/core-cml/rebind.sml0000644000076600000240000000011511404435636016564 0ustar mtfstaffstructure Mailbox : MAILBOX = Mailbox structure SyncVar : SYNC_VAR = SyncVar mlton-20100608/lib/cml/core-cml/rep-types.sml0000644000076600000240000000425111404435636017256 0ustar mtfstaff(* rep-types.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* rep-types.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * These are the concrete representations of the various CML types. * These types are abstract (or not even visible) outside this library. *) structure RepTypes = struct (** transaction IDs -- see trans-id.sml *) datatype trans_id = TXID of trans_id_state ref and trans_id_state = CANCEL | TRANS (** condition variables --- see cvar.sml and events.sml *) datatype cvar = CVAR of cvar_state ref and cvar_state = CVAR_unset of {transId : trans_id, cleanUp : unit -> unit, thread : rdy_thread} list | CVAR_set of int (** thread IDs --- see thread-id.sml and threads.sml **) and thread_id = TID of { (* an unique ID *) id : int, (* true, if there is a pending alert on this thread *) alert : bool ref, (* set this whenever this thread does some concurrency operation. *) done_comm : bool ref, (* root-level exception handler hook *) exnHandler : (exn -> unit) ref, (* holds thread-local properties *) props : exn list ref, (* the cvar that becomes set when the thread dies *) dead : cvar } (** threads --- see scheduler.sml and threads.sml **) and 'a thread = THRD of thread_id * 'a MLton.Thread.t and rdy_thread = RTHRD of thread_id * MLton.Thread.Runnable.t (** events --- see events.sml **) datatype 'a status = ENABLED of {prio : int, doitFn : unit -> 'a} | BLOCKED of {transId : trans_id, cleanUp : unit -> unit, next : unit -> rdy_thread} -> 'a type 'a base = unit -> 'a status datatype 'a event = BEVT of 'a base list | CHOOSE of 'a event list | GUARD of unit -> 'a event | WNACK of unit event -> 'a event end mlton-20100608/lib/cml/core-cml/run-cml.sig0000644000076600000240000000057011404435636016672 0ustar mtfstaff(* run-cml.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* ??? * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) signature RUN_CML = sig val isRunning : unit -> bool val doit : (unit -> unit) * Time.time option -> OS.Process.status val shutdown : OS.Process.status -> 'a end mlton-20100608/lib/cml/core-cml/run-cml.sml0000644000076600000240000001067111404435636016706 0ustar mtfstaff(* run-cml.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* run-cml-fn.sml * * COPYRIGHT (c) 1996 AT&T Research. * COPYRIGHT (c) 1989-1991 John H. Reppy *) structure RunCML : RUN_CML = struct structure Assert = LocalAssert(val assert = false) structure Debug = LocalDebug(val debug = false) structure R = Running structure S = Scheduler structure SH = SchedulerHooks structure TID = ThreadID structure TO = TimeOut fun debug msg = Debug.sayDebug ([S.atomicMsg, S.tidMsg], msg) fun debug' msg = debug (fn () => msg) local structure Signal = MLton.Signal structure Itimer = MLton.Itimer fun getAlrmHandler () = Signal.getHandler Posix.Signal.alrm fun setAlrmHandler h = Signal.setHandler (Posix.Signal.alrm, h) fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) in fun prepareAlrmHandler tq = let val origAlrmHandler = getAlrmHandler () val tq = case tq of SOME tq => tq | NONE => Time.fromMilliseconds 20 in (fn alrmHandler => (setAlrmHandler (Signal.Handler.handler (S.unwrap alrmHandler)) ; setItimer tq), fn () => (setItimer Time.zeroTime ; setAlrmHandler origAlrmHandler)) end end fun isRunning () = !R.isRunning fun reset running = (S.reset running ; SH.reset () ; TID.reset () ; TO.reset ()) fun alrmHandler thrd = let val () = Assert.assertAtomic' ("RunCML.alrmHandler", NONE) val () = debug' "alrmHandler" (* Atomic 1 *) val () = Assert.assertAtomic' ("RunCML.alrmHandler", SOME 1) val () = S.preempt thrd val () = ignore (TO.preempt ()) in S.next () end (* Note that SH.pauseHook is only invoked by S.next * when there are no threads on the ready queue; * Furthermore, note that alrmHandler always * enqueues the preepted thread (via S.preempt). * Hence, the ready queue is never empty * at the S.next in alrmHandler. Therefore, * pauseHook is never run within alrmHandler. *) fun pauseHook () = let val () = Assert.assertAtomic' ("RunCML.pauseHook", NONE) val () = debug' "pauseHook" (* Atomic 1 *) val () = Assert.assertAtomic' ("RunCML.pauseHook", SOME 1) val to = TO.preempt () in case to of NONE => (* no waiting threads *) S.prepFn (!SH.shutdownHook, fn () => (true, OS.Process.failure)) | SOME NONE => (* enqueued a waiting thread *) S.next () | SOME (SOME t) => (* a waiting thread will be ready in t time *) (if Time.toSeconds t <= 0 then () else S.doMasked (fn () => OS.Process.sleep t) ; pauseHook ()) end fun doit (initialProc: unit -> unit, tq: Time.time option) = let val () = if isRunning () then raise Fail "CML is running" else () val (installAlrmHandler, restoreAlrmHandler) = prepareAlrmHandler tq val ((*cleanUp*)_, status) = S.switchToNext (fn thrd => let val () = R.isRunning := true val () = reset true val () = SH.shutdownHook := S.prepend (thrd, fn arg => (S.atomicBegin (); arg)) val () = SH.pauseHook := pauseHook val () = installAlrmHandler alrmHandler val () = ignore (Thread.spawn initialProc) in () end) val () = restoreAlrmHandler () val () = reset false val () = R.isRunning := false val () = S.atomicEnd () in status end fun shutdown status = if isRunning () then S.switch (fn _ => S.prepVal (!SH.shutdownHook, (true, status))) else raise Fail "CML is not running" end mlton-20100608/lib/cml/core-cml/running.sml0000644000076600000240000000057411404435636017012 0ustar mtfstaff(* running.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* running.sml * * COPYRIGHT (c) 1997 Bell Labs, Lucent Technologies. * * A flag to tell us if CML is running. This gets set and cleared in the * RunCMLFn functor, but other modules need to test it. *) structure Running = struct val isRunning = ref false end mlton-20100608/lib/cml/core-cml/scheduler-hooks.sig0000644000076600000240000000157611404435636020423 0ustar mtfstaff(* scheduler-hooks.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* scheduler.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) signature SCHEDULER_HOOKS = sig type 'a thread = 'a RepTypes.thread type rdy_thread = RepTypes.rdy_thread (* this hook gets invoked when the scheduler has nothing else to do; * it is invoked in an atomic region *) val pauseHook : (unit -> rdy_thread) ref (* this hook points to a thread that gets invoked when * the system is otherwise deadlocked. It takes two arguments: * the first is a boolean flag that says weather to do clean-up, * and the second is the exit status. *) val shutdownHook : (bool * OS.Process.status) thread ref val reset : unit -> unit end mlton-20100608/lib/cml/core-cml/scheduler-hooks.sml0000644000076600000240000000162311404435636020425 0ustar mtfstaff(* scheduler-hooks.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* scheduler.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) structure SchedulerHooks: SCHEDULER_HOOKS = struct datatype thread = datatype RepTypes.thread type rdy_thread = RepTypes.rdy_thread val pauseHookDefault : unit -> rdy_thread = fn _ => raise Fail "SchedulerHooks.pauseHook" val pauseHook = ref pauseHookDefault val shutdownHookDefault : (bool * OS.Process.status) thread = THRD (ThreadID.bogus "shutdownHook", MLton.Thread.new (fn _ => raise Fail "SchedulerHooks.shutdownHook")) val shutdownHook = ref shutdownHookDefault fun reset () = (pauseHook := pauseHookDefault ; shutdownHook := shutdownHookDefault ; ()) end mlton-20100608/lib/cml/core-cml/scheduler.sig0000644000076600000240000000273711404435636017302 0ustar mtfstaff(* scheduler.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* scheduler.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) signature SCHEDULER = sig include CRITICAL type thread_id = ThreadID.thread_id type 'a thread = 'a RepTypes.thread type rdy_thread = RepTypes.rdy_thread val prep : unit thread -> rdy_thread val prepVal : 'a thread * 'a -> rdy_thread val prepFn : 'a thread * (unit -> 'a) -> rdy_thread val getThreadId : 'a thread -> thread_id val getCurThreadId : unit -> thread_id val tidMsg : unit -> string val ready : rdy_thread -> unit val next : unit -> rdy_thread val switch : ('a thread -> rdy_thread) -> 'a val atomicSwitch : ('a thread -> rdy_thread) -> 'a val switchToNext : ('a thread -> unit) -> 'a val atomicSwitchToNext : ('a thread -> unit) -> 'a val readyAndSwitch : (unit -> rdy_thread) -> unit val atomicReadyAndSwitch : (unit -> rdy_thread) -> unit val readyAndSwitchToNext : (unit -> unit) -> unit val atomicReadyAndSwitchToNext : (unit -> unit) -> unit val new : (thread_id -> ('a -> unit)) -> 'a thread val prepend : 'a thread * ('b -> 'a) -> 'b thread val unwrap : (rdy_thread -> rdy_thread) -> (MLton.Thread.Runnable.t -> MLton.Thread.Runnable.t) val reset : bool -> unit val preempt : rdy_thread -> unit end mlton-20100608/lib/cml/core-cml/scheduler.sml0000644000076600000240000001614011404435636017304 0ustar mtfstaff(* scheduler.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* scheduler.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * This module implements the scheduling queues and preemption * mechanisms. *) structure Scheduler : SCHEDULER = struct structure Assert = LocalAssert(val assert = false) structure GlobalDebug = Debug structure Debug = LocalDebug(val debug = false) open Critical structure Q = ImpQueue structure T = MLton.Thread structure TID = ThreadID structure SH = SchedulerHooks type thread_id = ThreadID.thread_id datatype thread = datatype RepTypes.thread datatype rdy_thread = datatype RepTypes.rdy_thread fun prep (THRD (tid, t)) = RTHRD (tid, T.prepare (t, ())) fun prepVal (THRD (tid, t), v) = RTHRD (tid, T.prepare (t, v)) fun prepFn (THRD (tid, t), f) = RTHRD (tid, T.prepare (T.prepend (t, f), ())) (* the dummy thread Id; this is used when an ID is needed to get * the types right *) val dummyTid = TID.bogus "dummy" (* the error thread. This thread is used to trap attempts to run CML * without proper initialization (i.e., via RunCML). This thread is * enqueued by reset. *) val errorTid = TID.bogus "error" fun errorThrd () : unit thread = THRD (errorTid, T.new (fn () => (GlobalDebug.sayDebug ([fn () => "CML"], fn () => "**** Use RunCML.doit to run CML ****") ; raise Fail "CML not initialized"))) local val curTid : thread_id ref = ref dummyTid in fun getThreadId (THRD (tid, _)) = tid fun getCurThreadId () = let val tid = !curTid in tid end fun setCurThreadId tid = let val () = Assert.assertAtomic' ("Scheduler.setCurThreadId", NONE) in curTid := tid end end fun tidMsg () = TID.tidToString (getCurThreadId ()) fun debug msg = Debug.sayDebug ([atomicMsg, tidMsg], msg) fun debug' msg = debug (fn () => msg) (* The thread ready queues: * rdyQ1 is the primary queue and rdyQ2 is the secondary queue. *) val rdyQ1 : rdy_thread Q.t = Q.new () and rdyQ2 : rdy_thread Q.t = Q.new () (* enqueue a thread in the primary queue *) fun enque1 thrd = (Assert.assertAtomic' ("Scheduler.enque1", NONE) ; Q.enque (rdyQ1, thrd)) (* enqueue a thread in the secondary queue *) fun enque2 thrd = (Assert.assertAtomic' ("Scheduler.enque2", NONE) ; Q.enque (rdyQ2, thrd)) (* dequeue a thread from the primary queue *) fun deque1 () = (Assert.assertAtomic' ("Scheduler.deque1", NONE) ; case Q.deque rdyQ1 of NONE => deque2 () | SOME thrd => SOME thrd) (* dequeue a thread from the secondary queue *) and deque2 () = (Assert.assertAtomic' ("Scheduler.deque2", NONE) ; case Q.deque rdyQ2 of NONE => NONE | SOME thrd => SOME thrd) (* promote a thread from the secondary queue to the primary queue *) fun promote () = (Assert.assertAtomic' ("Scheduler.promote", NONE) ; case deque2 () of NONE => () | SOME thrd => enque1 thrd) fun next () = let val () = Assert.assertAtomic' ("Scheduler.next", NONE) val thrd = case deque1 () of NONE => !SH.pauseHook () | SOME thrd => thrd in thrd end fun ready thrd = let val () = Assert.assertAtomic' ("Scheduler.ready", NONE) val () = enque1 thrd in () end local fun atomicSwitchAux msg f = (Assert.assertAtomic (fn () => "Scheduler." ^ msg, NONE) ; T.atomicSwitch (fn t => let val tid = getCurThreadId () val () = TID.mark tid val RTHRD (tid',t') = f (THRD (tid, t)) val () = setCurThreadId tid' in t' end)) in fun atomicSwitch (f: 'a thread -> rdy_thread) = atomicSwitchAux "atomicSwitch" f fun switch (f: 'a thread -> rdy_thread) = (atomicBegin (); atomicSwitch f) fun atomicSwitchToNext (f: 'a thread -> unit) = atomicSwitchAux "atomicSwitchToNext" (fn thrd => (f thrd; next ())) fun switchToNext (f: 'a thread -> unit) = (atomicBegin (); atomicSwitchToNext f) fun atomicReadyAndSwitch (f: unit -> rdy_thread) = atomicSwitchAux "atomicReadyAndSwitch" (fn thrd => (ready (prep thrd); f ())) fun readyAndSwitch (f: unit -> rdy_thread) = (atomicBegin (); atomicReadyAndSwitch f) fun atomicReadyAndSwitchToNext (f: unit -> unit) = atomicSwitchAux "atomicReadyAndSwitchToNext" (fn thrd => (ready (prep thrd); f (); next ())) fun readyAndSwitchToNext (f: unit -> unit) = (atomicBegin (); atomicReadyAndSwitchToNext f) end fun new (f : thread_id -> ('a -> unit)) : 'a thread = let val () = Assert.assertAtomic' ("Scheduler.new", NONE) val tid = TID.new () val t = T.new (f tid) in THRD (tid, t) end fun prepend (thrd : 'a thread, f : 'b -> 'a) : 'b thread = let val () = Assert.assertAtomic' ("Scheduler.prepend", NONE) val THRD (tid, t) = thrd val t = T.prepend (t, f) in THRD (tid, t) end fun unwrap (f : rdy_thread -> rdy_thread) (t: T.Runnable.t) : T.Runnable.t = let val () = Assert.assertAtomic' ("Scheduler.unwrap", NONE) val tid = getCurThreadId () val RTHRD (tid', t') = f (RTHRD (tid, t)) val () = setCurThreadId tid' in t' end (* reset various pieces of state *) fun reset running = (atomicBegin () ; setCurThreadId dummyTid ; Q.reset rdyQ1; Q.reset rdyQ2 ; if not running then ready (prep (errorThrd ())) else () ; atomicEnd ()) (* what to do at a preemption (with the current thread) *) fun preempt (thrd as RTHRD (tid, _)) = let val () = Assert.assertAtomic' ("Scheduler.preempt", NONE) val () = debug' "Scheduler.preempt" (* Atomic 1 *) val () = Assert.assertAtomic' ("Scheduler.preempt", SOME 1) val () = if TID.isMarked tid then (TID.unmark tid ; promote () ; enque1 thrd) else enque2 thrd in () end val _ = reset false end mlton-20100608/lib/cml/core-cml/sync-var.sig0000644000076600000240000000246611404435636017065 0ustar mtfstaff(* sync-var.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* sync-var-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * The implementation of Id-style synchronizing memory cells (I-structures * and M-structures). *) signature SYNC_VAR = sig type 'a ivar (* I-structure variable *) type 'a mvar (* M-structure variable *) exception Put (* raised on put operations to full cells *) val iVar : unit -> 'a ivar val iPut : ('a ivar * 'a) -> unit val iGet : 'a ivar -> 'a val iGetEvt : 'a ivar -> 'a CML.event val iGetPoll : 'a ivar -> 'a option val sameIVar : ('a ivar * 'a ivar) -> bool val mVar : unit -> 'a mvar val mVarInit : 'a -> 'a mvar val mPut : ('a mvar * 'a) -> unit val mTake : 'a mvar -> 'a val mTakeEvt : 'a mvar -> 'a CML.event val mTakePoll : 'a mvar -> 'a option val mGet : 'a mvar -> 'a val mGetEvt : 'a mvar -> 'a CML.event val mGetPoll : 'a mvar -> 'a option val mSwap : ('a mvar * 'a) -> 'a val mSwapEvt : ('a mvar * 'a) -> 'a CML.event val sameMVar : ('a mvar * 'a mvar) -> bool end signature SYNC_VAR_EXTRA = sig include SYNC_VAR end mlton-20100608/lib/cml/core-cml/sync-var.sml0000644000076600000240000003272711404435636017101 0ustar mtfstaff(* sync-var.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* sync-var.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * The implementation of Id-style synchronizing memory cells. *) structure SyncVar : SYNC_VAR_EXTRA = struct structure Assert = LocalAssert(val assert = false) structure Debug = LocalDebug(val debug = false) structure Q = ImpQueue structure S = Scheduler structure E = Event fun debug msg = Debug.sayDebug ([S.atomicMsg, S.tidMsg], msg) datatype trans_id = datatype TransID.trans_id datatype trans_id_state = datatype TransID.trans_id_state (* the underlying representation of both ivars and mvars is the same. *) datatype 'a cell = CELL of {prio : int ref, readQ : (trans_id * 'a S.thread) Q.t, value : 'a option ref} type 'a ivar = 'a cell type 'a mvar = 'a cell exception Put fun newCell () = CELL {prio = ref 0, readQ = Q.new(), value = ref NONE} (* sameCell : ('a cell * 'a cell) -> bool *) fun sameCell (CELL {prio = prio1, ...}, CELL {prio = prio2, ...}) = prio1 = prio2 (* bump a priority value by one, returning the old value *) fun bumpPriority (p as ref n) = (p := n+1; n) (* functions to clean channel input and output queues *) local fun cleaner (TXID txst, _) = case !txst of CANCEL => true | _ => false in fun cleanAndDeque q = Q.cleanAndDeque (q, cleaner) fun enqueAndClean (q, item) = Q.enqueAndClean (q, item, cleaner) end (* When a thread is resumed after being blocked on an iGet or mGet operation, * there may be other threads also blocked on the variable. This function * is used to propagate the message to all of the threads that are blocked * on the variable (or until one of them takes the value in the mvar case). * It must be called from an atomic region; when the readQ is finally empty, * we leave the atomic region. We must use "cleanAndDeque" to get items * from the readQ in the unlikely event that a single thread executes a * choice of multiple gets on the same variable. *) fun relayMsg (readQ, msg) = case (cleanAndDeque readQ) of NONE => S.atomicEnd() | SOME (txid, t) => S.readyAndSwitch (fn () => (TransID.force txid ; S.prepVal (t, msg))) (** G-variables **) (* Generalized synchronized variables, * to factor out the common operations. *) fun gPut (name, CELL {prio, readQ, value}, x) = let val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name]) val () = debug (fn () => concat [name, "(1)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(1)"]) val () = S.atomicBegin() val () = debug (fn () => concat [name, "(2)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(2)"], SOME 1) val () = case !value of NONE => let val () = debug (fn () => concat [name, "(3.1.1)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.1.1)"], SOME 1) val () = value := SOME x val () = case cleanAndDeque readQ of NONE => S.atomicEnd () | SOME (rtxid, rt) => S.readyAndSwitch (fn () => (prio := 1 ; TransID.force rtxid ; S.prepVal (rt, x))) val () = debug (fn () => concat [name, "(3.1.2)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(3.1.2)"]) in () end | SOME _ => let val () = debug (fn () => concat [name, "(3.2.1)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.1)"], SOME 1) val () = S.atomicEnd () val () = debug (fn () => concat [name, "(3.2.2)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(3.2.2)"]) in raise Put end val () = debug (fn () => concat [name, "(4)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(4)"]) in () end (* Swap the current contents of the cell with a new value; * it is guaranteed to be atomic. *) fun gSwap (name, doSwap, CELL {prio, readQ, value}) = let val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, ""]) val () = debug (fn () => concat [name, "(1)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(1)"]) val () = S.atomicBegin() val () = debug (fn () => concat [name, "(2)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(2)"], SOME 1) val msg = case !value of NONE => let val () = debug (fn () => concat [name, "(3.2.1)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.1)"], SOME 1) val msg = S.atomicSwitchToNext (fn rt => enqueAndClean (readQ, (TransID.mkTxId (), rt))) val () = debug (fn () => concat [name, "(3.2.2)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.2)"], SOME 1) val () = doSwap value val () = relayMsg (readQ, msg) val () = debug (fn () => concat [name, "(3.2.3)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(3.2.3)"]) in msg end | SOME x => let val () = debug (fn () => concat [name, "(3.2.1)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.1)"], SOME 1) val () = prio := 1 val () = doSwap value val () = S.atomicEnd () val () = debug (fn () => concat [name, "(3.2.2)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(3.2.2)"]) in x end val () = debug (fn () => concat [name, "(4)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(4)"]) in msg end fun gSwapEvt (name, doSwap, CELL{prio, readQ, value}) = let fun doitFn () = let val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, ".doitFn"], NONE) val x = valOf (!value) val () = debug (fn () => concat [name, "(3.2.1)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.1)"], SOME 1) val () = prio := 1 val () = doSwap value val () = S.atomicEnd () val () = debug (fn () => concat [name, "(3.2.2)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(3.2.2)"]) in x end fun blockFn {transId, cleanUp, next} = let val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, ".blockFn"], NONE) val () = debug (fn () => concat [name, "(3.2.1)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.1)"], SOME 1) val msg = S.atomicSwitch (fn rt => (enqueAndClean (readQ, (transId, rt)) ; next ())) val () = debug (fn () => concat [name, "(3.2.2)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.2)"], SOME 1) val () = cleanUp () val () = doSwap value val () = relayMsg (readQ, msg) val () = debug (fn () => concat [name, "(3.2.3)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(3.2.3)"]) in msg end fun pollFn () = let val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, ".pollFn"], NONE) val () = debug (fn () => concat [name, "(2)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(2)"], SOME 1) in case !value of NONE => E.blocked blockFn | SOME _ => E.enabled {prio = bumpPriority prio, doitFn = doitFn} end in E.bevt pollFn end fun gSwapPoll (name, doSwap, CELL{prio, value, ...}) = let val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, ""]) val () = debug (fn () => concat [name, "(1)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(1)"]) val () = S.atomicBegin() val () = debug (fn () => concat [name, "(2)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(2)"], SOME 1) val msg = case !value of NONE => let val () = debug (fn () => concat [name, "(3.2.1)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.1)"], SOME 1) val msg = NONE val () = debug (fn () => concat [name, "(3.2.2)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.2)"], SOME 1) val () = S.atomicEnd () val () = debug (fn () => concat [name, "(3.2.3)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(3.2.3)"]) in msg end | SOME x => let val () = debug (fn () => concat [name, "(3.2.1)"]) (* Atomic 1 *) val () = Assert.assertAtomic (fn () => concat ["SyncVar.", name, "(3.2.1)"], SOME 1) val () = prio := 1 val () = doSwap value val () = S.atomicEnd () val () = debug (fn () => concat [name, "(3.2.2)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(3.2.2)"]) in SOME x end val () = debug (fn () => concat [name, "(4)"]) (* NonAtomic *) val () = Assert.assertNonAtomic (fn () => concat ["SyncVar.", name, "(4)"]) in msg end (** I-variables **) val iVar = newCell val sameIVar = sameCell fun iPut (cell, x) = gPut ("iPut", cell, x) local fun doGetSwap _ = () in fun iGet cell = gSwap ("iGet", doGetSwap, cell) fun iGetEvt cell = gSwapEvt ("iGetEvt", doGetSwap, cell) fun iGetPoll cell = gSwapPoll ("iGetPoll", doGetSwap, cell) end (** M-variables **) val mVar = newCell fun mVarInit x = CELL {prio = ref 0, readQ = Q.new(), value = ref (SOME x)} val sameMVar = sameCell fun mPut (cell, x) = gPut ("mPut", cell, x) local fun doTakeSwap value = value := NONE in fun mTake cell = gSwap ("mTake", doTakeSwap, cell) fun mTakeEvt cell = gSwapEvt ("mTakeEvt", doTakeSwap, cell) fun mTakePoll cell = gSwapPoll ("mTakePoll", doTakeSwap, cell) end local fun doGetSwap _ = () in fun mGet cell = gSwap ("mGet", doGetSwap, cell) fun mGetEvt cell = gSwapEvt ("mGetEvt", doGetSwap, cell) fun mGetPoll cell = gSwapPoll ("mGetPoll", doGetSwap, cell) end local fun doSwapSwap x value = value := SOME x in fun mSwap (cell, x) = gSwap ("mSwap", doSwapSwap x, cell) fun mSwapEvt (cell, x) = gSwapEvt ("mSwap", doSwapSwap x, cell) end end mlton-20100608/lib/cml/core-cml/thread-id.sig0000644000076600000240000000150611404435636017156 0ustar mtfstaff(* thread-id.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* threads-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) signature THREAD_ID = sig type thread_id val sameTid : (thread_id * thread_id) -> bool val compareTid : (thread_id * thread_id) -> order val hashTid : thread_id -> word val tidToString : thread_id -> string end signature THREAD_ID_EXTRA = sig datatype thread_id' = datatype RepTypes.thread_id include THREAD_ID where type thread_id = thread_id' val new : unit -> thread_id val bogus : string -> thread_id val mark : thread_id -> unit val unmark : thread_id -> unit val isMarked : thread_id -> bool val reset : unit -> unit end mlton-20100608/lib/cml/core-cml/thread-id.sml0000644000076600000240000000344511404435636017173 0ustar mtfstaff(* thread.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* thread.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) structure ThreadID : THREAD_ID_EXTRA = struct structure Assert = LocalAssert(val assert = false) structure R = RepTypes datatype thread_id = datatype R.thread_id datatype thread_id' = datatype thread_id fun sameTid (TID{id=a, ...}, TID{id=b, ...}) = a = b fun compareTid (TID{id=a, ...}, TID{id=b, ...}) = Int.compare (a, b) fun hashTid (TID{id, ...}) = Word.fromInt id fun tidToString (TID{id, ...}) = concat["[", StringCvt.padLeft #"0" 6 (Int.toString id), "]"] fun exnHandler (_ : exn) = () val defaultExnHandler = ref exnHandler fun new' n = TID {id = n, alert = ref false, done_comm = ref false, exnHandler = ref (!defaultExnHandler), props = ref [], dead = CVar.new ()} local val tidCounter = ref 0 in fun new () = let val _ = Assert.assertAtomic' ("ThreadID.newTid", NONE) val n = !tidCounter val _ = tidCounter := n + 1 in new' n end fun reset () = tidCounter := 0 end fun bogus s = let val n = CharVector.foldr (fn (c, n) => 2 * n - Char.ord c) 0 s in new' n end fun mark (TID{done_comm, ...}) = (Assert.assertAtomic' ("ThreadID.mark", NONE) ; done_comm := true) fun unmark (TID{done_comm, ...}) = (Assert.assertAtomic' ("ThreadID.unmark", NONE) ; done_comm := false) fun isMarked (TID{done_comm, ...}) = !done_comm end mlton-20100608/lib/cml/core-cml/thread.sig0000644000076600000240000000242611404435636016566 0ustar mtfstaff(* thread.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* threads-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) signature THREAD = sig include THREAD_ID val getTid : unit -> thread_id val spawnc : ('a -> unit) -> 'a -> thread_id val spawn : (unit -> unit) -> thread_id val exit : unit -> 'a val yield : unit -> unit (* mostly for benchmarking *) val joinEvt : thread_id -> unit Event.event (* thread-local data *) val newThreadProp : (unit -> 'a) -> { clrFn : unit -> unit, (* clear's current thread's property *) getFn : unit -> 'a, (* get current thread's property; if *) (* the property is not defined, then *) (* it sets it using the initialization *) (* function. *) peekFn : unit -> 'a option, (* return the property's value, if any *) setFn : 'a -> unit (* set the property's value for the *) (* current thread. *) } val newThreadFlag : unit -> {getFn : unit -> bool, setFn : bool -> unit} end mlton-20100608/lib/cml/core-cml/thread.sml0000644000076600000240000001260411404435636016576 0ustar mtfstaff(* thread.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* thread.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) structure Thread : THREAD = struct structure Assert = LocalAssert(val assert = false) structure Debug = LocalDebug(val debug = false) structure S = Scheduler fun debug msg = Debug.sayDebug ([S.atomicMsg, S.tidMsg], msg) fun debug' msg = debug (fn () => msg) open ThreadID fun generalExit (tid', clr') = let val () = Assert.assertNonAtomic' "Thread.generalExit" val () = debug' "generalExit" (* NonAtomic *) val () = Assert.assertNonAtomic' "Thread.generalExit" in S.switchToNext (fn t => let val tid as TID {dead, props, ...} = S.getThreadId t val () = Assert.assert ([], fn () => concat ["Thread.generalExit ", Option.getOpt (Option.map tidToString tid', "NONE"), " <> ", tidToString tid], fn () => case tid' of NONE => true | SOME tid' => sameTid (tid', tid)) val () = if clr' then props := [] else () val () = Event.atomicCVarSet dead in () end) end fun doHandler (TID {exnHandler, ...}, exn) = (debug (fn () => concat ["Exception: ", exnName exn, " : ", exnMessage exn]) ; ((!exnHandler) exn) handle _ => ()) fun spawnc f x = let val () = S.atomicBegin () fun thread tid () = ((f x) handle ex => doHandler (tid, ex) ; generalExit (SOME tid, false)) val t = S.new thread val tid = S.getThreadId t val () = S.ready (S.prep t) val () = S.atomicEnd () val () = debug (fn () => concat ["spawnc ", tidToString tid]) (* NonAtomic *) in tid end fun spawn f = spawnc f () fun joinEvt (TID{dead, ...}) = Event.cvarGetEvt dead val getTid = S.getCurThreadId fun exit () = let val () = Assert.assertNonAtomic' "Thread.exit" val () = debug' "exit" (* NonAtomic *) val () = Assert.assertNonAtomic' "Thread.exit" in generalExit (NONE, true) end fun yield () = let val () = Assert.assertNonAtomic' "Thread.yield" val () = debug' "yield" (* NonAtomic *) val () = Assert.assertNonAtomic' "Thread.yield" in S.readyAndSwitchToNext (fn () => ()) end (* thread-local data *) local fun mkProp () = let exception E of 'a fun cons (a, l) = E a :: l fun peek [] = NONE | peek (E a :: _) = SOME a | peek (_ :: l) = peek l fun delete [] = [] | delete (E _ :: r) = r | delete (x :: r) = x :: delete r in {cons = cons, peek = peek, delete = delete} end fun mkFlag () = let exception E fun peek [] = false | peek (E :: _) = true | peek (_ :: l) = peek l fun set (l, flg) = let fun set ([], _) = if flg then E::l else l | set (E::r, xs) = if flg then l else List.revAppend(xs, r) | set (x::r, xs) = set (r, x::xs) in set (l, []) end in {set = set, peek = peek} end fun getProps () = let val TID {props, ...} = getTid () in props end in fun newThreadProp (init : unit -> 'b) = let val {peek, cons, delete} = mkProp() fun peekFn () = peek(!(getProps())) fun getF () = let val h = getProps() in case peek(!h) of NONE => let val b = init() in h := cons(b, !h); b end | (SOME b) => b end fun clrF () = let val h = getProps() in h := delete(!h) end fun setFn x = let val h = getProps() in h := cons(x, delete(!h)) end in {peekFn = peekFn, getFn = getF, clrFn = clrF, setFn = setFn} end fun newThreadFlag () = let val {peek, set} = mkFlag() fun getF ()= peek(!(getProps())) fun setF flg = let val h = getProps() in h := set(!h, flg) end in {getFn = getF, setFn = setF} end end end mlton-20100608/lib/cml/core-cml/timeout.sig0000644000076600000240000000136711404435636017010 0ustar mtfstaff(* timeout.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* timeout-sig.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * Exported interface for timeout synchronization. *) signature TIME_OUT = sig val timeOutEvt : Time.time -> unit Event.event val atTimeEvt : Time.time -> unit Event.event end signature TIME_OUT_EXTRA = sig include TIME_OUT val reset : unit -> unit (* preepmt () == NONE ==> no waiting threads * preepmt () == SOME NONE ==> enqueued a waiting thread * preepmt () == SOME (SOME t) ==> a waiting thread will be ready in t time *) val preempt : unit -> Time.time option option end mlton-20100608/lib/cml/core-cml/timeout.sml0000644000076600000240000001400411404435636017011 0ustar mtfstaff(* timeout.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* timeout.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * Events for synchronizing on timeouts. *) structure TimeOut : TIME_OUT_EXTRA = struct structure Assert = LocalAssert(val assert = false) structure Debug = LocalDebug(val debug = false) structure S = Scheduler structure E = Event fun debug msg = Debug.sayDebug ([S.atomicMsg, S.tidMsg], msg) fun debug' msg = debug (fn () => msg) datatype trans_id = datatype TransID.trans_id datatype trans_id_state = datatype TransID.trans_id_state (* this holds an approximation of the current time of day. It is * cleared at each pre-emption, and initialized on demand (by getTime). *) val clock = ref NONE (* returns an approximation of the current time of day * (this is at least as accurate as the time quantum). *) fun getTime () = case !clock of NONE => let val t = Time.now() in clock := SOME t; t end | SOME t => t fun preemptTime () = clock := NONE (* The queue of threads waiting for timeouts. * It is sorted in increasing order of time value. *) structure TQ = FunPriorityQueue(structure Key = struct open Time type t = time end) type item = trans_id * (unit -> unit) * S.rdy_thread val timeQ : item TQ.t ref = ref (TQ.new ()) fun cleaner (readied: unit -> unit) elt = let val now = getTime () val (TXID txst, cleanUp: unit -> unit, t) = TQ.Elt.value elt in case !txst of CANCEL => true | _ => if Time.<=(TQ.Elt.key elt, now) then (readied () ; S.ready t ; cleanUp () ; true) else false end fun timeWait (time, txid, cleanUp, t) = (Assert.assertAtomic' ("TimeOut.timeWait", NONE) ; timeQ := TQ.enqueAndClean(!timeQ, time, (txid, cleanUp, t), cleaner (fn () => ()))) (** NOTE: unlike for most base events, the block functions of time-out ** events do not have to exit the atomic region or execute the clean-up ** operation. This is done when they are removed from the waiting queue. **) fun timeOutEvt time = let fun blockFn {transId, cleanUp, next} = let val () = Assert.assertAtomic' ("TimeOut.timeOutEvt.blockFn", NONE) val () = debug' "timeOutEvt(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("TimeOut.timeOutEvt(3.2.1)", SOME 1) val () = S.atomicSwitch (fn t => (timeWait (Time.+(time, getTime ()), transId, cleanUp, S.prep t) ; next ())) val () = debug' "timeOutEvt(3.2.3)" (* NonAtomic *) val () = Assert.assertNonAtomic' "TimeOut.timeOutEvt(3.2.3)" in () end fun pollFn () = let val () = Assert.assertAtomic' ("TimeOut.timeOutEvt.pollFn", NONE) val () = debug' "timeOutEvt(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("TimeOut.timeOutEvt(2)", SOME 1) in if Time.<=(time, Time.zeroTime) then E.enabled {prio = ~1, doitFn = S.atomicEnd} else E.blocked blockFn end in E.bevt pollFn end fun atTimeEvt time = let fun blockFn {transId, cleanUp, next} = let val () = Assert.assertAtomic' ("TimeOut.atTimeEvt.blockFn", NONE) val () = debug' "atTimeEvt(3.2.1)" (* Atomic 1 *) val () = Assert.assertAtomic' ("TimeOut.atTimeEvt(3.2.1)", SOME 1) val () = S.atomicSwitch (fn t => (timeWait (time, transId, cleanUp, S.prep t) ; next ())) val () = debug' "atTimeEvt(3.2.3)" (* NonAtomic *) val () = Assert.assertNonAtomic' "TimeOut.atTimeEvt(3.2.3)" in () end fun pollFn () = let val () = Assert.assertAtomic' ("TimeOut.atTimeEvt.pollFn", NONE) val () = debug' "atTimeEvt(2)" (* Atomic 1 *) val () = Assert.assertAtomic' ("TimeOut.atTimeEvt(2)", SOME 1) in if Time.<=(time, getTime()) then E.enabled {prio = ~1, doitFn = S.atomicEnd} else E.blocked blockFn end in E.bevt pollFn end (* reset various pieces of state *) fun reset () = timeQ := TQ.new () (* what to do at a preemption *) fun preempt () : Time.time option option = let val () = Assert.assertAtomic' ("TimeOut.preempt", NONE) val () = debug' "TimeOut.preempt" (* Atomic 1 *) val () = Assert.assertAtomic' ("TimeOut.preempt", SOME 1) val () = preemptTime () val timeQ' = !timeQ in if TQ.empty timeQ' then NONE else let val readied = ref false val timeQ' = TQ.clean (timeQ', cleaner (fn () => readied := true)) val () = timeQ := timeQ' in if !readied then SOME NONE else case TQ.peek timeQ' of NONE => NONE | SOME elt => SOME(SOME(Time.-(TQ.Elt.key elt, getTime ()))) end end end mlton-20100608/lib/cml/core-cml/trans-id.sig0000644000076600000240000000123411404435636017034 0ustar mtfstaff(* trans-id.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* ??? * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) signature TRANS_ID = sig datatype trans_id = datatype RepTypes.trans_id datatype trans_id_state = datatype RepTypes.trans_id_state (* create a new transaction ID. *) val mkTxId : unit -> trans_id (* create a transaction flag (ID and cleanUp). *) val mkFlg : unit -> (trans_id * (unit -> unit)) (* given a transaction ID, mark it cancelled. *) val force : trans_id -> unit (*val toString : trans_id -> string*) end mlton-20100608/lib/cml/core-cml/trans-id.sml0000644000076600000240000000257211404435636017053 0ustar mtfstaff(* trans-id.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* ??? * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) structure TransID : TRANS_ID = struct structure Assert = LocalAssert(val assert = false) structure R = RepTypes (* Transaction IDs are used to mark blocked threads in the various waiting * queues. They are "cancelled" when some other event is selected. *) datatype trans_id = datatype R.trans_id datatype trans_id_state = datatype R.trans_id_state (* create a new transaction ID. *) fun mkTxId () = TXID(ref TRANS) (* create a transaction flag (ID and cleanUp). *) fun mkFlg () = let val txid as TXID txst = mkTxId () val cleanUp = fn () => (Assert.assertAtomic' ("TransID.mkFlg.cleanUp", NONE) ; txst := CANCEL) in (txid, cleanUp) end (* given a transaction ID, mark it cancelled. *) fun force (TXID txst) = (Assert.assertAtomic' ("TransID.force", NONE) ; case !txst of TRANS => txst := CANCEL | CANCEL => raise Fail "TransID.force") (* fun toString (TXID txst) = case !txst of TRANS => "TRANS" | CANCEL => "CANCEL" *) end mlton-20100608/lib/cml/core-cml/version.sig0000644000076600000240000000050611404435636017001 0ustar mtfstaff(* version.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* ??? * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy *) signature VERSION = sig val version : {system : string, version_id : int list, date : string} val banner : string end mlton-20100608/lib/cml/core-cml/version.sml0000644000076600000240000000130011404435636017003 0ustar mtfstaff(* version.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* version.sml * * COPYRIGHT (c) 1996 AT&T Research. *) structure Version : VERSION = struct val version = { system = "Concurrent ML (MLton)", version_id = [1, 0, 10], date = "March, 2004" } fun f ([], l) = l | f ([x], l) = (Int.toString x)::l | f (x::r, l) = (Int.toString x) :: "." :: f(r, l) val banner = concat ( #system version :: ", Version " :: f (#version_id version, [", ", #date version]) ) end mlton-20100608/lib/cml/tests/0000755000076600000240000000000011404470406014242 5ustar mtfstaffmlton-20100608/lib/cml/tests/.ignore0000644000076600000240000000006511404435636015535 0ustar mtfstaffexit ping-pong primes primes-multicast print timeout mlton-20100608/lib/cml/tests/exit.cm0000644000076600000240000000010511404435636015536 0ustar mtfstaffGroup structure Main is $cml/basis.cm $cml/cml.cm exit.sml mlton-20100608/lib/cml/tests/exit.mlb0000644000076600000240000000014311404435636015713 0ustar mtfstafflocal $(SML_LIB)/basis/basis.mlb ../cml.mlb print.mlb in exit.sml run-main.sml end mlton-20100608/lib/cml/tests/exit.sml0000644000076600000240000000011411404435636015732 0ustar mtfstaff structure Main = struct open CML fun doit _ = CML.exit () end mlton-20100608/lib/cml/tests/ping-pong.cm0000644000076600000240000000011211404435636016461 0ustar mtfstaffGroup structure Main is $cml/basis.cm $cml/cml.cm ping-pong.sml mlton-20100608/lib/cml/tests/ping-pong.mlb0000644000076600000240000000015011404435636016636 0ustar mtfstafflocal $(SML_LIB)/basis/basis.mlb ../cml.mlb print.mlb in ping-pong.sml run-main.sml end mlton-20100608/lib/cml/tests/ping-pong.sml0000644000076600000240000000147411404435636016671 0ustar mtfstaff structure Main = struct open CML fun pong ch = let fun loop () = let val () = recv ch in loop () end val _ = spawn (fn () => loop ()) in () end fun ping ch n = let fun loop i = if i > n then RunCML.shutdown OS.Process.success else let val () = send (ch, ()) in loop (i + 1) end val _ = spawn (fn () => loop 0) in () end fun doit n = RunCML.doit (fn () => let val ch = channel () val () = pong ch val () = ping ch n in () end, SOME (Time.fromMilliseconds 10)) end mlton-20100608/lib/cml/tests/primes-multicast.cm0000644000076600000240000000012111404435636020065 0ustar mtfstaffGroup structure Main is $cml/basis.cm $cml/cml.cm primes-multicast.sml mlton-20100608/lib/cml/tests/primes-multicast.mlb0000644000076600000240000000015711404435636020251 0ustar mtfstafflocal $(SML_LIB)/basis/basis.mlb ../cml.mlb print.mlb in primes-multicast.sml run-main.sml end mlton-20100608/lib/cml/tests/primes-multicast.sml0000644000076600000240000000512011404435636020265 0ustar mtfstaff structure Main = struct open CML structure MC = Multicast val print = TextIO.print fun makeNatStream c = let val mch = MC.mChannel () fun count i = (MC.multicast(mch, i) ; count(i+1)) val _ = spawn (fn () => (print (concat ["makeNatStream: ", tidToString (getTid ()), "\n"]) ; count c)) in mch end fun makeFilter (p, inMCh) = let val inP = MC.port inMCh val outMCh = MC.mChannel () fun loop () = let val i = sync (MC.recvEvt inP) in if ((i mod p) <> 0) then MC.multicast(outMCh, i) else () ; loop () end val _ = spawn loop in outMCh end fun makePrimes () = let val primes = MC.mChannel () fun head mch = let val p = MC.recv (MC.port mch) in MC.multicast(primes, p) ; head (makeFilter (p, mch)) end val _ = spawn (fn () => (print (concat ["makePrimes: ", tidToString (getTid ()), "\n"]) ; head (makeNatStream 2))) in primes end fun makeNatPrinter mch n = let val p = MC.port mch fun loop i = if i > n then RunCML.shutdown OS.Process.success else let val m = MC.recv p val m' = Int.toString m fun loop' j = if j > m then () else (print (m' ^ "\n") ; loop' (j + 1)) in loop' m ; loop (i + 1) end val _ = spawn (fn () => (print (concat ["makeNatPrinter: ", tidToString (getTid ()), "\n"]) ; loop 0)) in () end fun doit' n = RunCML.doit (fn () => let val mch = makePrimes () val _ = makeNatPrinter mch n in () end, SOME (Time.fromMilliseconds 10)) fun doit n = let val x = doit' n in x end end mlton-20100608/lib/cml/tests/primes.cm0000644000076600000240000000010711404435636016066 0ustar mtfstaffGroup structure Main is $cml/basis.cm $cml/cml.cm primes.sml mlton-20100608/lib/cml/tests/primes.mlb0000644000076600000240000000014511404435636016243 0ustar mtfstafflocal $(SML_LIB)/basis/basis.mlb ../cml.mlb print.mlb in primes.sml run-main.sml end mlton-20100608/lib/cml/tests/primes.sml0000644000076600000240000000466011404435636016272 0ustar mtfstaff structure Main = struct open CML val print = TextIO.print fun makeNatStream c = let val ch = channel () fun count i = (send(ch, i) ; count(i+1)) val _ = spawn (fn () => (print (concat ["makeNatStream: ", tidToString (getTid ()), "\n"]) ; count c)) in ch end fun makeFilter (p, inCh) = let val outCh = channel () fun loop () = let val i = sync (recvEvt inCh) in if ((i mod p) <> 0) then sync (sendEvt (outCh, i)) else () ; loop () end val _ = spawn loop in outCh end fun makePrimes () = let val primes = channel () fun head ch = let val p = recv ch in send(primes, p) ; head (makeFilter (p, ch)) end val _ = spawn (fn () => (print (concat ["makePrimes: ", tidToString (getTid ()), "\n"]) ; head (makeNatStream 2))) in primes end fun makeNatPrinter ch n = let fun loop i = if i > n then RunCML.shutdown OS.Process.success else let val m = recv ch val m' = Int.toString m fun loop' j = if j > m then () else (print (m' ^ "\n") ; loop' (j + 1)) in loop' m ; loop (i + 1) end val _ = spawn (fn () => (print (concat ["makeNatPrinter: ", tidToString (getTid ()), "\n"]) ; loop 0)) in () end fun doit' n = RunCML.doit (fn () => let val ch = makePrimes () val _ = makeNatPrinter ch n in () end, SOME (Time.fromMilliseconds 10)) fun doit n = let val x = doit' n in x end end mlton-20100608/lib/cml/tests/print.mlb0000644000076600000240000000012611404435636016077 0ustar mtfstafflocal $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/mlton.mlb in print.sml end mlton-20100608/lib/cml/tests/print.sml0000644000076600000240000000025011404435636016116 0ustar mtfstaffstructure TextIO = struct open TextIO fun print s = MLton.Thread.atomically (fn () => TextIO.print s) end val print = TextIO.print mlton-20100608/lib/cml/tests/run-main.sml0000644000076600000240000000074711404435636016523 0ustar mtfstaffval n = case CommandLine.arguments () of [] => 100 | s::_ => (case Int.fromString s of NONE => 100 | SOME n => n) val ts = Time.now () val _ = Main.doit n val te = Time.now () val d = Time.-(te, ts) val _ = TextIO.print (concat ["Time start: ", Time.toString ts, "\n"]) val _ = TextIO.print (concat ["Time end: ", Time.toString te, "\n"]) val _ = TextIO.print (concat ["Time diff: ", LargeInt.toString (Time.toMilliseconds d), "ms\n"]) mlton-20100608/lib/cml/tests/timeout.cm0000644000076600000240000000010711404435636016255 0ustar mtfstaffGroup structure Main is $cml/basis.cm $cml/cml.cm timeout.sml mlton-20100608/lib/cml/tests/timeout.mlb0000644000076600000240000000014611404435636016433 0ustar mtfstafflocal $(SML_LIB)/basis/basis.mlb ../cml.mlb print.mlb in timeout.sml run-main.sml end mlton-20100608/lib/cml/tests/timeout.sml0000644000076600000240000000154311404435636016456 0ustar mtfstaff structure Main = struct open CML val print = TextIO.print fun doit' n = RunCML.doit (fn () => let fun make m () = (print (concat ["make: ", Int.toString m, " ", tidToString (getTid ()), "\n"]) ; sync (timeOutEvt (Time.fromSeconds (Int.toLarge m))) ; print (concat ["finish: ", Int.toString m, " ", tidToString (getTid ()), "\n"])) fun loop m = if m <= 0 then () else let val _ = spawn (make m) in loop (m - 10) end in loop n end, SOME (Time.fromMilliseconds 10)) fun doit n = let val x = doit' n in x end end mlton-20100608/lib/cml/TODO0000644000076600000240000000027111404435636013576 0ustar mtfstaff * Implement Okasaki real-time data-structures. + mailbox.sml -- needs functional queue + scheduler.sml -- needs imperative queue + timeout.sml -- needs functional priority queue mlton-20100608/lib/cml/util/0000755000076600000240000000000011404470406014055 5ustar mtfstaffmlton-20100608/lib/cml/util/assert.sig0000644000076600000240000000072111404435636016070 0ustar mtfstaff(* assert.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) signature ASSERT = sig val assert: (unit -> string) list * (unit -> string) * (unit -> bool) -> unit val assert': string * (unit -> bool) -> unit val assertAtomic: (unit -> string) * int option -> unit val assertNonAtomic: (unit -> string) -> unit val assertAtomic': string * int option -> unit val assertNonAtomic': string -> unit end mlton-20100608/lib/cml/util/assert.sml0000644000076600000240000000305411404435636016103 0ustar mtfstaff(* assert.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) structure Assert: ASSERT = struct structure C = Critical val assertFlg = false fun fail msg = (C.atomicBegin (); TextIO.print (concat ["ASSERT: ", msg, "\n"]); OS.Process.exit OS.Process.failure) fun assert (msgs: (unit -> string) list, msg: unit -> string, f: unit -> bool): unit = if assertFlg andalso not (f () handle _ => false) then let val msgs = List.map (fn f => f ()) msgs val msg = concat [String.concatWith " " msgs, " :: ", msg ()] in fail msg end else () fun assert' (msg: string, f: unit -> bool): unit = assert ([], fn () => msg, f) datatype z = datatype MLton.Thread.AtomicState.t fun assertAtomic (msg: unit -> string, n: int option): unit = assert ([C.atomicMsg], msg, fn () => case MLton.Thread.atomicState () of Atomic m => (case n of NONE => true | SOME n => n = m) | NonAtomic => false) fun assertNonAtomic (msg: unit -> string): unit = assert ([C.atomicMsg], msg, fn () => case MLton.Thread.atomicState () of Atomic _ => false | NonAtomic => true) fun assertAtomic' (msg, n) = assertAtomic (fn () => msg, n) fun assertNonAtomic' msg = assertNonAtomic (fn () => msg) end mlton-20100608/lib/cml/util/critical.sig0000644000076600000240000000060611404435636016363 0ustar mtfstaff(* critical.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) signature CRITICAL = sig val atomicBegin : unit -> unit val atomicEnd : unit -> unit val atomicMsg : unit -> string val doAtomic : (unit -> unit) -> unit val maskBegin : unit -> unit val maskEnd : unit -> unit val doMasked : (unit -> unit) -> unit end mlton-20100608/lib/cml/util/critical.sml0000644000076600000240000000172011404435636016372 0ustar mtfstaff(* critical.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) structure Critical : CRITICAL = struct structure Thread = MLton.Thread structure AtomicState = MLton.Thread.AtomicState structure Signal = MLton.Signal structure Itimer = MLton.Itimer val atomicBegin = Thread.atomicBegin val atomicEnd = Thread.atomicEnd local datatype z = datatype Thread.AtomicState.t in fun atomicMsg () = case Thread.atomicState () of AtomicState.NonAtomic => "[NonAtomic]" | AtomicState.Atomic n => concat ["[ Atomic ", Int.toString n, "]"] end fun doAtomic (f: unit -> unit) = (atomicBegin (); f (); atomicEnd ()) val mask = Signal.Mask.some [Itimer.signal Itimer.Real] fun maskBegin () = Signal.Mask.block mask fun maskEnd () = Signal.Mask.unblock mask fun doMasked (f: unit -> unit) = (maskBegin (); f (); maskEnd ()) end mlton-20100608/lib/cml/util/debug.sig0000644000076600000240000000057011404435636015657 0ustar mtfstaff(* debug.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* debug.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * Debugging support for the CML core. *) signature DEBUG = sig val sayDebug : (unit -> string) list * (unit -> string) -> unit val sayDebug' : string -> unit end mlton-20100608/lib/cml/util/debug.sml0000644000076600000240000000154211404435636015670 0ustar mtfstaff(* debug.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) (* debug.sml * * COPYRIGHT (c) 1995 AT&T Bell Laboratories. * COPYRIGHT (c) 1989-1991 John H. Reppy * * Debugging support for the CML core. *) structure Debug : DEBUG = struct structure C = Critical val debugFlg = false fun sayDebug (msgs: (unit -> string) list, msg: unit -> string) = if debugFlg then let val msgs = List.map (fn f => f ()) msgs val msg = concat [String.concatWith " " msgs, " :: ", msg ()] in C.atomicBegin (); TextIO.print (concat [msg, "\n"]); C.atomicEnd () end else () fun sayDebug' (msg: string) = sayDebug ([], fn () => msg) end mlton-20100608/lib/cml/util/fun-priority-queue.fun0000644000076600000240000000367411404435636020400 0ustar mtfstaff(* fun-queue.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) functor FunPriorityQueue(S: FUN_PRIORITY_QUEUE_ARG) : FUN_PRIORITY_QUEUE where type Key.t = S.Key.t = struct open S structure Elt = struct datatype 'a t = T of Key.t * 'a fun key (T (k, _)) = k fun value (T (_, v)) = v end datatype 'a t = T of 'a Elt.t list local fun filterPrefix (xs, p) = case xs of [] => [] | y::ys => if p y then filterPrefix (ys, p) else xs fun filter (xs, p) = List.filter (not o p) xs in fun cleanPrefix (T xs, p) = T (filterPrefix (xs, p)) fun clean (T xs, p) = T (filter (xs, p)) end fun deque (T xs) = (case xs of [] => NONE | x::xs => SOME (x, T xs)) fun cleanAndDeque (q, p) = let val q = clean (q, p) in case deque q of NONE => (NONE, q) | SOME (x, q) => (SOME x, q) end fun empty (T xs) = (case xs of [] => true | _ => false) fun enque (T xs, k', v') = let val x' = Elt.T (k', v') fun loop (xs, ys) = case xs of [] => List.revAppend(ys, [x']) | (z as Elt.T (k, _))::zs => (case Key.compare (k, k') of GREATER => List.revAppend(ys, x'::xs) | _ => loop(zs, z::ys)) in T (loop (xs, [])) end fun enqueAndClean (q, k, v, p) = clean (enque (q, k, v), p) fun new () = T [] fun peek (T xs) = (case xs of [] => NONE | elt::_ => SOME elt) end mlton-20100608/lib/cml/util/fun-priority-queue.sig0000644000076600000240000000172111404435636020361 0ustar mtfstaff(* fun-prio-queue.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) signature FUN_PRIORITY_QUEUE_ARG = sig structure Key : sig type t val compare : t * t -> order end end signature FUN_PRIORITY_QUEUE = sig include FUN_PRIORITY_QUEUE_ARG structure Elt: sig type 'a t val key: 'a t -> Key.t val value: 'a t -> 'a end type 'a t val clean: 'a t * ('a Elt.t -> bool) -> 'a t val cleanAndDeque: 'a t * ('a Elt.t -> bool) -> 'a Elt.t option * 'a t val cleanPrefix: 'a t * ('a Elt.t -> bool) -> 'a t val deque: 'a t -> ('a Elt.t * 'a t) option val empty: 'a t -> bool val enque: 'a t * Key.t * 'a -> 'a t val enqueAndClean: 'a t * Key.t * 'a * ('a Elt.t -> bool) -> 'a t val new: unit -> 'a t val peek: 'a t -> 'a Elt.t option end mlton-20100608/lib/cml/util/fun-queue.sig0000644000076600000240000000105011404435636016475 0ustar mtfstaff(* fun-queue.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) signature FUN_QUEUE = sig type 'a t val clean: 'a t * ('a -> bool) -> 'a t val cleanAndDeque: 'a t * ('a -> bool) -> 'a option * 'a t val cleanPrefix: 'a t * ('a -> bool) -> 'a t val deque: 'a t -> ('a * 'a t) option val empty: 'a t -> bool val enque: 'a t * 'a -> 'a t val enqueAndClean: 'a t * 'a * ('a -> bool) -> 'a t val new: unit -> 'a t val peek: 'a t -> 'a option end mlton-20100608/lib/cml/util/fun-queue.sml0000644000076600000240000000712611404435636016520 0ustar mtfstaff(* fun-queue.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) structure FunQueue : FUN_QUEUE = struct datatype 'a t = T of {front: 'a list, back: 'a list} local fun filterPrefix (xs, p) = case xs of [] => [] | y::ys => if p y then filterPrefix (ys, p) else xs fun filter (xs, p) = List.filter (not o p) xs fun filterRevAcc ((xs, zs), p) = case xs of [] => zs | y::ys => if p y then filterRevAcc ((ys, zs), p) else filterRevAcc ((ys, y::zs), p) fun filterRev (xs, p) = filterRevAcc ((xs, []), p) in fun cleanPrefix (T {front, back}, p) = (case filterPrefix (front, p) of [] => T {front = filterPrefix (List.rev(back), p), back = []} | front' => T {front = front', back = back}) fun clean (T {front, back}, p) = (case filter (front, p) of [] => T {front = filterRev (back, p), back = []} | front' => T {front = front', back = filter (back, p)}) fun cleanAndDeque (T {front, back}, p) = (case filter (front, p) of [] => (case filterRev(back, p) of [] => (NONE, T {front = [], back = []}) | x::front' => (SOME x, T {front = front', back = []})) | [x] => (SOME x, T {front = filterRev (back, p), back = []}) | x::front' => (SOME x, T {front = front', back = filter (back, p)})) end fun deque (T {front, back}) = (case front of [] => (case back of [] => NONE | l => let val l = List.rev l in case l of [] => raise Fail "FunQueue.deque:impossible" | x::front' => SOME (x, T {front = front', back = []}) end) | x::front' => SOME (x, T {front = front', back = back})) fun empty (T {front, back}) = (case front of [] => (case back of [] => true | _ => false) | _ => false) fun enque (T {front, back, ...}, x) = T {front = front, back = x::back} fun enqueAndClean (q, y, p) = clean (enque (q, y), p) fun new () = T {front = [], back = []} fun peek (T {front, back}) = (case front of [] => (case back of [] => NONE | l => let val l = List.rev l in case l of [] => raise Fail "FunQueue.peek:impossible" | x::_ => SOME x end) | x::_ => SOME x) end mlton-20100608/lib/cml/util/imp-queue.sig0000644000076600000240000000104311404435636016474 0ustar mtfstaff(* imp-queue.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) signature IMP_QUEUE = sig type 'a t val clean: 'a t * ('a -> bool) -> unit val cleanAndDeque: 'a t * ('a -> bool) -> 'a option val cleanPrefix: 'a t * ('a -> bool) -> unit val deque: 'a t -> 'a option val empty: 'a t -> bool val enque: 'a t * 'a -> unit val enqueAndClean: 'a t * 'a * ('a -> bool) -> unit val new: unit -> 'a t val peek: 'a t -> 'a option val reset: 'a t -> unit end mlton-20100608/lib/cml/util/imp-queue.sml0000644000076600000240000001155111404435636016512 0ustar mtfstaff(* imp-queue.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) structure ImpQueue : IMP_QUEUE = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} local fun filterPrefix (xs, p) = case xs of [] => [] | y::ys => if p y then filterPrefix (ys, p) else xs fun filter (xs, p) = List.filter (not o p) xs fun filterRevAcc ((xs, zs), p) = case xs of [] => zs | y::ys => if p y then filterRevAcc ((ys, zs), p) else filterRevAcc ((ys, y::zs), p) fun filterRev (xs, p) = filterRevAcc ((xs, []), p) in fun cleanPrefix (T {front, back}, p) = (Assert.assertAtomic' ("ImpQueue.cleanPrefix", NONE) ; case filterPrefix (!front, p) of [] => (front := filterPrefix (List.rev(!back), p) ; back := []) | front' => front := front') fun clean (T {front, back}, p) = (Assert.assertAtomic' ("ImpQueue.clean", NONE) ; case filter (!front, p) of [] => (front := filterRev (!back, p) ; back := []) | front' => (front := front' ; back := filter (!back, p))) fun cleanAndDeque (T {front, back}, p) = (Assert.assertAtomic' ("ImpQueue.cleanAndDeque", NONE) ; case filter (!front, p) of [] => (case filterRev(!back, p) of [] => (front := [] ; back := [] ; NONE) | x::front' => (front := front' ; back := [] ; SOME x)) | [x] => (front := filterRev (!back, p) ; back := [] ; SOME x) | x::front' => (front := front' ; back := filter (!back, p) ; SOME x)) end fun deque (T {front, back}) = (Assert.assertAtomic' ("ImpQueue.deque", NONE) ; case !front of [] => (case !back of [] => NONE | l => let val l = List.rev l in case l of [] => raise Fail "ImpQueue.deque:impossible" | x :: front' => (front := front' ; back := [] ; SOME x) end) | x::front' => (front := front'; SOME x)) fun empty (T {front, back}) = (Assert.assertAtomic' ("ImpQueue.empty", NONE) ; case !front of [] => (case !back of [] => true | _ => false) | _ => false) fun enque (T {back, ...}, x) = (Assert.assertAtomic' ("ImpQueue.enque", NONE) ; back := x::(!back)) fun enqueAndClean (q, y, p) = (enque (q, y); clean (q, p)) fun new () = T {front = ref [], back = ref []} fun peek (T {front, back}) = (Assert.assertAtomic' ("ImpQueue.peek", NONE) ; case !front of [] => (case !back of [] => NONE | l => let val l = List.rev l in case l of [] => raise Fail "ImpQueue.peek:impossible" | x::front' => (front := x::front' ; back := [] ; SOME x) end) | x::_ => SOME x) fun reset (T {front, back}) = (Assert.assertAtomic' ("ImpQueue.reset", NONE) ; front := [] ; back := []) (* val clean = fn arg => TimeIt.timeit "ImpQueue.clean" clean arg val cleanAndDeque = fn arg => TimeIt.timeit "ImpQueue.cleanAndDeque" cleanAndDeque arg val cleanPrefix = fn arg => TimeIt.timeit "ImpQueue.cleanPrefix" cleanPrefix arg val deque = fn arg => TimeIt.timeit "ImpQueue.deque" deque arg val empty = fn arg => TimeIt.timeit "ImpQueue.empty" empty arg val enque = fn arg => TimeIt.timeit "ImpQueue.enque" enque arg val enqueAndClean = fn arg => TimeIt.timeit "ImpQueue.enqueAndClean" enqueAndClean arg val new = fn arg => TimeIt.timeit "ImpQueue.new" new arg val peek = fn arg => TimeIt.timeit "ImpQueue.peek" peek arg val reset = fn arg => TimeIt.timeit "ImpQueue.reset" reset arg *) end mlton-20100608/lib/cml/util/local-assert.fun0000644000076600000240000000100111404435636017156 0ustar mtfstaff(* local-assert.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) functor LocalAssert(val assert: bool): ASSERT = struct fun make f = if assert then f else fn _ => () val assert = make Assert.assert val assert' = make Assert.assert' val assertAtomic = make Assert.assertAtomic val assertNonAtomic = make Assert.assertNonAtomic val assertAtomic' = make Assert.assertAtomic' val assertNonAtomic' = make Assert.assertNonAtomic' end mlton-20100608/lib/cml/util/local-debug.fun0000644000076600000240000000045211404435636016754 0ustar mtfstaff(* local-debug.fun * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) functor LocalDebug(val debug: bool): DEBUG = struct fun make f = if debug then f else fn _ => () val sayDebug' = make Debug.sayDebug' val sayDebug = make Debug.sayDebug end mlton-20100608/lib/cml/util/timeit.sig0000644000076600000240000000025411404435636016063 0ustar mtfstaff(* timeit.sig * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) signature TIMEIT = sig val timeit : string -> ('a -> 'b) -> 'a -> 'b end mlton-20100608/lib/cml/util/timeit.sml0000644000076600000240000000165411404435636016101 0ustar mtfstaff(* timeit.sml * 2004 Matthew Fluet (mfluet@acm.org) * Ported to MLton threads. *) structure TimeIt : TIMEIT = struct val timeitFlg = true fun timeit (name: string) (f: 'a -> 'b) (a: 'a) : 'b = if timeitFlg then let val start = Time.now () fun done () = let val finish = Time.now () val diff = Time.-(finish, start) in Debug.sayDebug ([], fn () => concat [name, ": ", LargeInt.toString (Time.toMilliseconds diff), " ms"]) end in (f a before done ()) handle e => (done (); raise e) end else f a end mlton-20100608/lib/cml/util/util.mlb0000644000076600000240000000167011404435636015540 0ustar mtfstaffann "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused true" "forceUsed" in local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/mlton.mlb critical.sig critical.sml assert.sig assert.sml local-assert.fun debug.sig debug.sml local-debug.fun (* timeit.sig timeit.sml *) fun-queue.sig fun-queue.sml imp-queue.sig imp-queue.sml fun-priority-queue.sig fun-priority-queue.fun in signature CRITICAL structure Critical signature ASSERT structure Assert functor LocalAssert signature DEBUG structure Debug functor LocalDebug signature FUN_QUEUE structure FunQueue signature IMP_QUEUE structure ImpQueue signature FUN_PRIORITY_QUEUE_ARG signature FUN_PRIORITY_QUEUE functor FunPriorityQueue end end mlton-20100608/lib/Makefile0000644000076600000240000000044411404435641013771 0ustar mtfstaff## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../bin/clean mlton-20100608/lib/mlnlffi-lib/0000755000076600000240000000000011404470406014520 5ustar mtfstaffmlton-20100608/lib/mlnlffi-lib/.ignore0000644000076600000240000000004211404435637016007 0ustar mtfstaffgen-rtld-flags gen-rtld-flags.exe mlton-20100608/lib/mlnlffi-lib/c-debug.sig0000644000076600000240000000052211404435637016540 0ustar mtfstaff(* c-debug.sig * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * Encoding the C type system in SML. * * DEBUG VERSION with CHECKED POINTER DEREFERENCING. * * (C) 2002, Lucent Technologies, Bell Laboratories * * author: Matthias Blume *) signature C_DEBUG = sig exception NullPointer include C end mlton-20100608/lib/mlnlffi-lib/c.mlb0000644000076600000240000000152711404435637015452 0ustar mtfstaff(* c.mlb * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * A new foreign-function interface for SML. * This interface is actually an interface to C. It is based on * an encoding of C's type system in ML. * This library is a helper library for use by automatically generated * code. (An auxiliary tool produces this code directly from C code.) * * (C) 2001, Lucent Technologies, Bell Laboratories * * author: Matthias Blume (blume@research.bell-labs.com) *) ann "forceUsed" "sequenceNonUnit warn" "warnUnused true" in local internals/c-int.mlb in structure Tag structure MLRep signature C structure C signature C_DEBUG structure C_Debug signature ZSTRING structure ZString signature DYN_LINKAGE structure DynLinkage end end mlton-20100608/lib/mlnlffi-lib/c.sig0000644000076600000240000006543211404435637015467 0ustar mtfstaff(* c.sig * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * Encoding the C type system in SML. * * (C) 2001, Lucent Technologies, Bell Laboratories * * author: Matthias Blume *) signature C = sig exception OutOfMemory (* objects of type 't, constness 'c; * The 't type variable will be instantiated with the object's "witness" * type. The intention is that there be an isomorphism between such * witness types and corresponding C types. * * Witness types are often the same as the (abstract) type of the value * stored in the object. However, this is merely a coincidence. For * example, a constant object holding a pointer to a read-write integer * would have type * ((sint, rw) ptr, ro) obj * and the value itself has type * (sint, rw) ptr. * * However, in the case of the "light" version of this object (see below), * the object type is * ((sint, rw) ptr, ro) obj' * while fetching from this object gives a value of type * (sint, rw) ptr'. * * (In other words, we use the "heavy" versions of value types as witness * types -- even in the "light" case.) *) type ('t, 'c) obj (* an alternative "light-weight" version that does not carry RTTI at * the cost of requiring explicit passing of RTTI for certain operations *) eqtype ('t, 'c) obj' (* constness property, to be substituted for 'c *) type ro and rw (* Pointers come in two varieties in C: Pointers to things we * know and pointers to "incomplete" types. The "ptr" type constructor * below encodes both kinds using the following convention: * - in the case of complete target types, 'o will be instantiated * to some ('t, 'c) obj * - in the case of incomplete target types, 'o will be instantiated * to some fresh (abstract) type (see iptr.sig for what this will * look like in practice) *) (* pointer to 'o *) type 'o ptr (* light-weight alternative *) eqtype 'o ptr' (* 'n-sized array with 't elements *) type ('t, 'n) arr (* no values, admits equality *) eqtype void (* void* is really a base type, but it happens to take the * form of a light-weight pointer type (with an abstract target). * This design makes it possible to use those ptr-related * functions that "make sense" for void*. *) (* C's void* *) type voidptr = void ptr' (* function pointers *) (* a function pointer *) type 'f fptr (* light-weight alternative *) eqtype 'f fptr' (* structures and unions *) (* struct/union named 'tag; * 'tag is drawn from the types defined in the Tag module *) type 'tag su (* enumerations *) eqtype 'tag enum (* primtypes (signed/unsigned char, short, int, long, long long; float, double) *) eqtype schar and uchar eqtype sshort and ushort eqtype sint and uint eqtype slong and ulong eqtype slonglong and ulonglong type float and double (* going from abstract to concrete and vice versa; * (this shouldn't be needed except when calling functions through * function pointers) *) structure Cvt : sig (* ML -> C *) val c_schar : MLRep.Char.Signed.int -> schar val c_uchar : MLRep.Char.Unsigned.word -> uchar val c_sshort : MLRep.Short.Signed.int -> sshort val c_ushort : MLRep.Short.Unsigned.word -> ushort val c_sint : MLRep.Int.Signed.int -> sint val c_uint : MLRep.Int.Unsigned.word -> uint val c_slong : MLRep.Long.Signed.int -> slong val c_ulong : MLRep.Long.Unsigned.word -> ulong val c_slonglong : MLRep.LongLong.Signed.int -> slonglong val c_ulonglong : MLRep.LongLong.Unsigned.word -> ulonglong val c_float : MLRep.Float.real -> float val c_double : MLRep.Double.real -> double val i2c_enum : MLRep.Int.Signed.int -> 'e enum (* C -> ML *) val ml_schar : schar -> MLRep.Char.Signed.int val ml_uchar : uchar -> MLRep.Char.Unsigned.word val ml_sshort : sshort -> MLRep.Short.Signed.int val ml_ushort : ushort -> MLRep.Short.Unsigned.word val ml_sint : sint -> MLRep.Int.Signed.int val ml_uint : uint -> MLRep.Int.Unsigned.word val ml_slong : slong -> MLRep.Long.Signed.int val ml_ulong : ulong -> MLRep.Long.Unsigned.word val ml_slonglong : slonglong -> MLRep.LongLong.Signed.int val ml_ulonglong : ulonglong -> MLRep.LongLong.Unsigned.word val ml_float : float -> MLRep.Float.real val ml_double : double -> MLRep.Double.real val c2i_enum : 'e enum -> MLRep.Int.Signed.int end (* type-abbreviations for a bit more convenience. *) type 'c schar_obj = ( schar, 'c) obj type 'c uchar_obj = ( uchar, 'c) obj type 'c sshort_obj = ( sshort, 'c) obj type 'c ushort_obj = ( ushort, 'c) obj type 'c sint_obj = ( sint, 'c) obj type 'c uint_obj = ( uint, 'c) obj type 'c slong_obj = ( slong, 'c) obj type 'c ulong_obj = ( ulong, 'c) obj type 'c slonglong_obj = (slonglong, 'c) obj type 'c ulonglong_obj = (ulonglong, 'c) obj type 'c float_obj = ( float, 'c) obj type 'c double_obj = ( double, 'c) obj type 'c voidptr_obj = ( voidptr, 'c) obj type ('e, 'c) enum_obj = ( 'e enum, 'c) obj type ('f, 'c) fptr_obj = ( 'f fptr, 'c) obj type ('s, 'c) su_obj = ( 's su, 'c) obj (* light-weight alternatives *) type 'c schar_obj' = ( schar, 'c) obj' type 'c uchar_obj' = ( uchar, 'c) obj' type 'c sshort_obj' = ( sshort, 'c) obj' type 'c ushort_obj' = ( ushort, 'c) obj' type 'c sint_obj' = ( sint, 'c) obj' type 'c uint_obj' = ( uint, 'c) obj' type 'c slong_obj' = ( slong, 'c) obj' type 'c ulong_obj' = ( ulong, 'c) obj' type 'c slonglong_obj' = (slonglong, 'c) obj' type 'c ulonglong_obj' = (ulonglong, 'c) obj' type 'c float_obj' = ( float, 'c) obj' type 'c double_obj' = ( double, 'c) obj' type 'c voidptr_obj' = ( voidptr, 'c) obj' type ('e, 'c) enum_obj' = ( 'e enum, 'c) obj' type ('f, 'c) fptr_obj' = ( 'f fptr, 'c) obj' type ('s, 'c) su_obj' = ( 's su, 'c) obj' (* bitfields aren't "ordinary objects", so they have their own type *) eqtype 'c sbf and 'c ubf structure W : sig (* conversion "witness" values *) type ('from, 'to) witness (* A small calculus for generating new witnesses. * Since the only witness constructors that do anything real are * rw and ro, all this calculus gives you is a way of changing * "const" attributes at any level within a bigger type. * * (The calculus can express nonsensical witnesses -- which * fortunately are harmless because they can't be applied to any * values.) *) val trivial : ('t, 't) witness val pointer : ('from, 'to) witness -> ('from ptr, 'to ptr) witness val object : ('from, 'to) witness -> (('from, 'c) obj, ('to, 'c) obj) witness val arr : ('from, 'to) witness -> (('from, 'n) arr, ('to, 'n) arr) witness val ro : ('from, 'to) witness -> (('from, 'fc) obj, ('to, ro) obj) witness val rw : ('from, 'to) witness -> (('from, 'fc) obj, ('to, 'tc) obj) witness end (* Object conversions that rely on witnesses: *) val convert : (('st, 'sc) obj, ('tt, 'tc) obj) W.witness -> ('st, 'sc) obj -> ('tt, 'tc) obj val convert' : (('st, 'sc) obj, ('tt, 'tc) obj) W.witness -> ('st, 'sc) obj' -> ('tt, 'tc) obj' (* * A family of types and corresponding values representing natural numbers. * (An encoding in SML without using dependent types.) *) structure Dim : sig (* Internally, a value of type ('a, 'z) dim0 is just a number. * The trick here is to give each of these numbers a different unique * type. 'a will be a decimal encoding of the number's value in * "type digits". 'z keeps track of whether the number is zero or not. *) type ('a, 'z) dim0 (* We can always get the internal number back... *) val toInt : ('a, 'z) dim0 -> int (* These two types act as "flags". They will be substituted for 'z * and remember whether the value is zero or not. *) type zero type nonzero type 'a dim = ('a, nonzero) dim0 (* These are the "type digits". Type "dec" acts as a "terminator". * We chose its name so to remind us that the encoding is decimal. * If a nonzero value's decimal representation is "...", then * its type will be "(dec dg ... dg, nonzero) dim0", which * is the same as "dec dg ... dg dim". The type of the zero * value is "(dec, zero) dim0". *) type dec type 'a dg0 and 'a dg1 and 'a dg2 and 'a dg3 and 'a dg4 type 'a dg5 and 'a dg6 and 'a dg7 and 'a dg8 and 'a dg9 (* Here are the corresponding constructors for ('a, 'z) dim0 values. * The type for dg0 ensures that there will be no "leading zeros" in * any encoding. This guarantees a 1-1 correspondence of constructable * values and their types. * To construct the value corresponding to a nonzero number whose * decimal representation is "...", one must invoke * "dg' (... (dg' dec')...)", i.e., the least significant * digit appears leftmost. *) val dec' : (dec, zero) dim0 val dg0' : 'a dim -> 'a dg0 dim val dg1' : ('a, 'z) dim0 -> 'a dg1 dim val dg2' : ('a, 'z) dim0 -> 'a dg2 dim val dg3' : ('a, 'z) dim0 -> 'a dg3 dim val dg4' : ('a, 'z) dim0 -> 'a dg4 dim val dg5' : ('a, 'z) dim0 -> 'a dg5 dim val dg6' : ('a, 'z) dim0 -> 'a dg6 dim val dg7' : ('a, 'z) dim0 -> 'a dg7 dim val dg8' : ('a, 'z) dim0 -> 'a dg8 dim val dg9' : ('a, 'z) dim0 -> 'a dg9 dim (* Since having to reverse the sequence of digits seems unnatural, * here is another set of constructors for dim values. These * constructors use continuation-passing style and themselves * have more complicated types. But their use is easier: * To construct the value corresponding to a nonzero number whose * decimal representation is "...", one must invoke * "dec dg ... dg dim"; i.e., the least significant * digit appears rightmost -- just like in the usual decimal * notation for numbers that we are all familiar with. * [Moreover, for any 'a dim value we have the neat property that * it can be constructed by taking its type (expressed using "dim") * and interpreting it as an expression. For example, the dim * value representing 312 is "dec dg3 dg1 dg2 dim" and it can * be constructed by evaluating "dec dg3 dg1 dg2 dim".] *) val dec : ((dec, zero) dim0 -> 'b) -> 'b val dg0 : 'a dim -> ('a dg0 dim -> 'b) -> 'b val dg1 : ('a, 'z) dim0 -> ('a dg1 dim -> 'b) -> 'b val dg2 : ('a, 'z) dim0 -> ('a dg2 dim -> 'b) -> 'b val dg3 : ('a, 'z) dim0 -> ('a dg3 dim -> 'b) -> 'b val dg4 : ('a, 'z) dim0 -> ('a dg4 dim -> 'b) -> 'b val dg5 : ('a, 'z) dim0 -> ('a dg5 dim -> 'b) -> 'b val dg6 : ('a, 'z) dim0 -> ('a dg6 dim -> 'b) -> 'b val dg7 : ('a, 'z) dim0 -> ('a dg7 dim -> 'b) -> 'b val dg8 : ('a, 'z) dim0 -> ('a dg8 dim -> 'b) -> 'b val dg9 : ('a, 'z) dim0 -> ('a dg9 dim -> 'b) -> 'b val dim : ('a, 'z) dim0 -> ('a, 'z) dim0 end (* sub-structure for dealing with run-time type info (sizes only) *) structure S : sig (* Our size info itself is statically typed! * The size info for a value stored in ('t, 'c) obj has * the following type: *) type 't size (* get a number out *) val toWord : 't size -> word (* sizes for simple things *) val schar : schar size val uchar : uchar size val sshort : sshort size val ushort : ushort size val sint : sint size val uint : uint size val slong : slong size val ulong : ulong size val slonglong : slonglong size val ulonglong : ulonglong size val float : float size val double : double size val voidptr : voidptr size val ptr : 'o ptr size val fptr : 'f fptr size val enum : 'tag enum size end (* sub-structure for dealing with run-time type info *) structure T : sig (* Our RTTI itself is statically typed! * The RTTI for a value stored in ('t, 'c) obj has * the following type: *) type 't typ (* get the RTTI from an actual object *) val typeof : ('t, 'c) obj -> 't typ (* constructing new RTTI from existing RTTI *) val pointer : 't typ -> ('t, rw) obj ptr typ val target : ('t, 'c) obj ptr typ -> 't typ val arr : 't typ * 'n Dim.dim -> ('t, 'n) arr typ val elem : ('t, 'n) arr typ -> 't typ val ro : ('t, 'c) obj ptr typ -> ('t, ro) obj ptr typ (* calculating the size of an object given its RTTI *) val sizeof : 't typ -> 't S.size (* dimension of array type *) val dim : ('t, 'n) arr typ -> 'n Dim.dim (* RTTI for simple things *) val schar : schar typ val uchar : uchar typ val sshort : sshort typ val ushort : ushort typ val sint : sint typ val uint : uint typ val slong : slong typ val ulong : ulong typ val slonglong : slonglong typ val ulonglong : ulonglong typ val float : float typ val double : double typ val voidptr : voidptr typ val enum : 'tag enum typ end (* convert from regular (heavy) to alternative (light) versions *) structure Light : sig val obj : ('t, 'c) obj -> ('t, 'c) obj' val ptr : 'o ptr -> 'o ptr' val fptr : 'f fptr -> 'f fptr' end (* and vice versa *) structure Heavy : sig val obj : 't T.typ -> ('t, 'c) obj' -> ('t, 'c) obj val ptr : 'o ptr T.typ -> 'o ptr' -> 'o ptr val fptr : 'f fptr T.typ -> 'f fptr' -> 'f fptr end (* calculate size of an object *) val sizeof : ('t, 'c) obj -> 't S.size (* "fetch" methods for various types; * fetching does not care about constness *) structure Get : sig (* primitive types; the results are concrete here *) val schar : 'c schar_obj -> MLRep.Char.Signed.int val uchar : 'c uchar_obj -> MLRep.Char.Unsigned.word val sshort : 'c sshort_obj -> MLRep.Short.Signed.int val ushort : 'c ushort_obj -> MLRep.Short.Unsigned.word val sint : 'c sint_obj -> MLRep.Int.Signed.int val uint : 'c uint_obj -> MLRep.Int.Unsigned.word val slong : 'c slong_obj -> MLRep.Long.Signed.int val ulong : 'c ulong_obj -> MLRep.Long.Unsigned.word val slonglong : 'c slonglong_obj -> MLRep.LongLong.Signed.int val ulonglong : 'c ulonglong_obj -> MLRep.LongLong.Unsigned.word val float : 'c float_obj -> MLRep.Float.real val double : 'c double_obj -> MLRep.Double.real val enum : ('e, 'c) enum_obj -> MLRep.Int.Signed.int (* alt *) val schar' : 'c schar_obj' -> MLRep.Char.Signed.int val uchar' : 'c uchar_obj' -> MLRep.Char.Unsigned.word val sshort' : 'c sshort_obj' -> MLRep.Short.Signed.int val ushort' : 'c ushort_obj' -> MLRep.Short.Unsigned.word val sint' : 'c sint_obj' -> MLRep.Int.Signed.int val uint' : 'c uint_obj' -> MLRep.Int.Unsigned.word val slong' : 'c slong_obj' -> MLRep.Long.Signed.int val ulong' : 'c ulong_obj' -> MLRep.Long.Unsigned.word val slonglong' : 'c slonglong_obj' -> MLRep.LongLong.Signed.int val ulonglong' : 'c ulonglong_obj' -> MLRep.LongLong.Unsigned.word val float' : 'c float_obj' -> MLRep.Float.real val double' : 'c double_obj' -> MLRep.Double.real val enum' : ('e, 'c) enum_obj' -> MLRep.Int.Signed.int (* fetching pointers; results have to be abstract *) val ptr : ('o ptr, 'c) obj -> 'o ptr val fptr : ('f, 'c) fptr_obj -> 'f fptr val voidptr : 'c voidptr_obj -> voidptr (* alt *) val ptr' : ('o ptr, 'c) obj' -> 'o ptr' val fptr' : ('f, 'c) fptr_obj' -> 'f fptr' val voidptr' : 'c voidptr_obj' -> voidptr (* bitfields; concrete again *) val sbf : 'c sbf -> MLRep.Int.Signed.int val ubf : 'c ubf -> MLRep.Int.Unsigned.word end (* "store" methods; these require rw objects *) structure Set : sig (* primitive types; use concrete values *) val schar : rw schar_obj * MLRep.Char.Signed.int -> unit val uchar : rw uchar_obj * MLRep.Char.Unsigned.word -> unit val sshort : rw sshort_obj * MLRep.Short.Signed.int -> unit val ushort : rw ushort_obj * MLRep.Short.Unsigned.word -> unit val sint : rw sint_obj * MLRep.Int.Signed.int -> unit val uint : rw uint_obj * MLRep.Int.Unsigned.word -> unit val slong : rw slong_obj * MLRep.Long.Signed.int -> unit val ulong : rw ulong_obj * MLRep.Long.Unsigned.word -> unit val slonglong : rw slonglong_obj * MLRep.LongLong.Signed.int -> unit val ulonglong : rw ulonglong_obj * MLRep.LongLong.Unsigned.word -> unit val float : rw float_obj * MLRep.Float.real -> unit val double : rw double_obj * MLRep.Double.real -> unit val enum : ('e, rw) enum_obj * MLRep.Int.Signed.int -> unit (* alt *) val schar' : rw schar_obj' * MLRep.Char.Signed.int -> unit val uchar' : rw uchar_obj' * MLRep.Char.Unsigned.word -> unit val sshort' : rw sshort_obj' * MLRep.Short.Signed.int -> unit val ushort' : rw ushort_obj' * MLRep.Short.Unsigned.word -> unit val sint' : rw sint_obj' * MLRep.Int.Signed.int -> unit val uint' : rw uint_obj' * MLRep.Int.Unsigned.word -> unit val slong' : rw slong_obj' * MLRep.Long.Signed.int -> unit val ulong' : rw ulong_obj' * MLRep.Long.Unsigned.word -> unit val slonglong' : rw slonglong_obj' * MLRep.LongLong.Signed.int -> unit val ulonglong' : rw ulonglong_obj' * MLRep.LongLong.Unsigned.word -> unit val float' : rw float_obj' * MLRep.Float.real -> unit val double' : rw double_obj' * MLRep.Double.real -> unit val enum' : ('e, rw) enum_obj' * MLRep.Int.Signed.int -> unit (* storing pointers; abstract *) val ptr : ('o ptr, rw) obj * 'o ptr -> unit val fptr : ('f, rw) fptr_obj * 'f fptr -> unit val voidptr : rw voidptr_obj * voidptr -> unit (* alt *) val ptr' : ('o ptr, rw) obj' * 'o ptr' -> unit val fptr' : ('f, rw) fptr_obj' * 'f fptr' -> unit val voidptr' : rw voidptr_obj' * voidptr -> unit (* When storing, voidptr is compatible with any ptr type * (just like in C). This should eliminate most need for RTTI in * practice. *) val ptr_voidptr : ('o ptr, rw) obj * voidptr -> unit (* alt *) val ptr_voidptr' : ('o ptr, rw) obj' * voidptr -> unit (* bitfields; concrete *) val sbf : rw sbf * MLRep.Int.Signed.int -> unit val ubf : rw ubf * MLRep.Int.Unsigned.word -> unit end (* copying the contents of arbitrary objects *) val copy : { from: ('t, 'c) obj, to: ('t, rw) obj } -> unit (* alt *) val copy' : 't S.size -> { from: ('t, 'c) obj', to: ('t, rw) obj' } -> unit (* manipulating object constness * rw -> ro: this direction just accounts for the fact that * rw is conceptually a subtype of ro * ro -> rw: this is not safe, but C makes it so easy that we * might as well directly support it; * Concretely, we make both operations polymorphic in the argument * constness. Moreover, the second (unsafe) direction is also * polymorphic in the result. This can be used to effectively * implement a conversion to "whatever the context wants". * * Note: fun ro x = convert (W.ro W.trivial) x * etc. *) val ro : ('t, 'c) obj -> ('t, ro) obj val rw : ('t, 'sc) obj -> ('t, 'tc) obj (* alt *) val ro' : ('t, 'c) obj' -> ('t, ro) obj' val rw' : ('t, 'sc) obj' -> ('t, 'tc) obj' (* operations on (mostly) pointers *) structure Ptr : sig (* going from object to pointer and vice versa *) val |&| : ('t, 'c) obj -> ('t, 'c) obj ptr val |*| : ('t, 'c) obj ptr -> ('t, 'c) obj (* alt *) val |&! : ('t, 'c) obj' -> ('t, 'c) obj ptr' val |*! : ('t, 'c) obj ptr' -> ('t, 'c) obj' (* comparing pointers *) val compare : 'o ptr * 'o ptr -> order (* alt *) val compare' : 'o ptr' * 'o ptr' -> order (* going from pointer to void*; this also accounts for a conceptual * subtyping relation and is safe *) val inject : 'o ptr -> voidptr (* alt *) val inject' : 'o ptr' -> voidptr (* the opposite is not safe, but C makes it not only easy but also * almost necessary; we use our RTTI interface to specify the pointer * type (not the element type!) *) val cast : 'o ptr T.typ -> voidptr -> 'o ptr (* alt, needs explicit type constraint on result! *) val cast' : voidptr -> 'o ptr' (* NULL as void* *) val vnull : voidptr (* projecting vnull to given pointer type *) val null : 'o ptr T.typ -> 'o ptr (* the "light" NULL pointer is simply a polymorphic constant *) val null' : 'o ptr' (* fptr version of NULL *) val fnull : 'f fptr T.typ -> 'f fptr (* again, "light" version is simply a polymorphic constant *) val fnull' : 'f fptr' (* checking for NULL pointer *) val isVNull : voidptr -> bool (* combining inject and isVNull for convenience *) val isNull : 'o ptr -> bool (* alt *) val isNull' : 'o ptr' -> bool (* checking a function pointer for NULL *) val isFNull : 'f fptr -> bool (* alt *) val isFNull' : 'f fptr' -> bool (* pointer arithmetic *) val |+| : ('t, 'c) obj ptr * int -> ('t, 'c) obj ptr val |-| : ('t, 'c) obj ptr * ('t, 'c) obj ptr -> int (* alt; needs explicit size (for element) *) val |+! : 't S.size -> ('t, 'c) obj ptr' * int -> ('t, 'c) obj ptr' val |-! : 't S.size -> ('t, 'c) obj ptr' * ('t, 'c) obj ptr' -> int (* subscript through a pointer; this is unchecked *) val sub : ('t, 'c) obj ptr * int -> ('t, 'c) obj (* alt; needs explicit size (for element) *) val sub' : 't S.size -> ('t, 'c) obj ptr' * int -> ('t, 'c) obj' (* conversions that rely on witnesses *) val convert : (('st, 'sc) obj ptr, ('tt, 'tc) obj ptr) W.witness -> ('st, 'sc) obj ptr -> ('tt, 'tc) obj ptr val convert' : (('st, 'sc) obj ptr, ('tt, 'tc) obj ptr) W.witness -> ('st, 'sc) obj ptr' -> ('tt, 'tc) obj ptr' (* constness manipulation for pointers * Note: fun ro x = convert (W.pointer (W.ro W.trivial)) x * etc. *) val ro : ('t, 'c) obj ptr -> ('t, ro) obj ptr val rw : ('t, 'sc) obj ptr -> ('t, 'tc) obj ptr val ro' : ('t, 'c) obj ptr' -> ('t, ro) obj ptr' val rw' : ('t, 'sc) obj ptr' -> ('t, 'tc) obj ptr' end (* operations on (mostly) arrays *) structure Arr : sig (* array subscript; * since we have RTTI, we can actually make this safe: we raise * General.Subscript for out-of-bounds access; * for unchecked access, go through arr_decay and ptr_sub *) val sub : (('t, 'n) arr, 'c) obj * int -> ('t, 'c) obj (* alt; needs element size and array dimension *) val sub' : 't S.size * 'n Dim.dim -> (('t, 'n) arr, 'c) obj' * int -> ('t, 'c) obj' (* let an array object decay, yielding pointer to first element *) val decay : (('t, 'n) arr, 'c) obj -> ('t, 'c) obj ptr (* alt *) val decay' : (('t, 'n) arr, 'c) obj' -> ('t, 'c) obj ptr' (* reconstruct an array object from the pointer to its first element *) val reconstruct : ('t, 'c) obj ptr * 'n Dim.dim -> (('t, 'n) arr, 'c) obj (* alt *) val reconstruct': ('t, 'c) obj ptr' * 'n Dim.dim -> (('t, 'n) arr, 'c) obj' (* dimension of array object *) val dim : (('t, 'n) arr, 'c) obj -> 'n Dim.dim end (* allocating new objects *) val new : 't T.typ -> ('t, 'c) obj (* alt *) val new' : 't S.size -> ('t, 'c) obj' (* freeing objects that were allocated earlier *) val discard : ('t, 'c) obj -> unit (* alt *) val discard' : ('t, 'c) obj' -> unit (* allocating a dynamically-sized array *) val alloc : 't T.typ -> word -> ('t, 'c) obj ptr (* alt *) val alloc' : 't S.size -> word -> ('t, 'c) obj ptr' (* freeing through pointers *) val free : 'o ptr -> unit (* alt *) val free' : 'o ptr' -> unit (* perform function call through function-pointer *) val call : ('a -> 'b) fptr * 'a -> 'b (* alt; needs explicit type for the function pointer *) val call' : ('a -> 'b) fptr T.typ -> ('a -> 'b) fptr' * 'a -> 'b (* completely unsafe stuff that every C programmer just *loves* to do *) structure U : sig val fcast : 'a fptr' -> 'b fptr' val p2i : 'o ptr' -> ulong val i2p : ulong -> 'o ptr' end end mlton-20100608/lib/mlnlffi-lib/gen-rtld-flags.c0000644000076600000240000000063011404435637017500 0ustar mtfstaff#include #include #ifndef RTLD_LOCAL #define RTLD_LOCAL 0 #endif int main(int argc, char *argv[]) { printf("structure RTLDFlags = struct\n"); printf(" val RTLD_GLOBAL = 0wx%x\n", RTLD_GLOBAL); printf(" val RTLD_LAZY = 0wx%x\n", RTLD_LAZY); printf(" val RTLD_LOCAL = 0wx%x\n", RTLD_LOCAL); printf(" val RTLD_NOW = 0wx%x\n", RTLD_NOW); printf("end\n"); return 0; } mlton-20100608/lib/mlnlffi-lib/internals/0000755000076600000240000000000011404470406016517 5ustar mtfstaffmlton-20100608/lib/mlnlffi-lib/internals/c-debug.sml0000644000076600000240000000147411404435636020556 0ustar mtfstaff(* c-debug.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * Encoding C's type system in SML. This module provides the "public" * view of the implementation. * * DEBUG VERSION with CHECKED POINTER DEREFERENCING. * * (C) 2002, Lucent Technologies, Bell Laboratories * * author: Matthias Blume (blume@research.bell-labs.com) *) structure C_Debug : C_DEBUG = struct (* first of all, we look mostly like structure C... *) open C (* ... but then, we also check for NULL pointers... *) exception NullPointer (* ... which means that we have to re-implement some things: *) structure Ptr = struct open Ptr val |*! = fn p => if isNull' p then raise NullPointer else |*! p val |*| = fn p => if isNull p then raise NullPointer else |*| p end end mlton-20100608/lib/mlnlffi-lib/internals/c-int.mlb0000644000076600000240000000134011404435636020231 0ustar mtfstafflocal $(SML_LIB)/basis/basis.mlb ../memory/memory.mlb in ann "forceUsed" "sequenceNonUnit warn" "warnUnused true" in local ../c.sig ../c-debug.sig c-int.sig c-int.sml c.sml c-debug.sml ../zstring.sig zstring.sml tag.sml in structure Tag structure MLRep signature C structure C signature C_INT structure C_Int signature C_DEBUG structure C_Debug signature ZSTRING structure ZString signature DYN_LINKAGE structure DynLinkage signature CMEMORY structure CMemory end end end mlton-20100608/lib/mlnlffi-lib/internals/c-int.sig0000644000076600000240000000664611404435636020257 0ustar mtfstaff(* c-int.sig * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * A "private" extension to the encoding of C types in SML. * The routines here are for use by code that will be automatically * generated from corresponding C files. User code is not supposed * to access them because they are unsafe. (As if subverting the C * type system were such a big deal...) * * (C) 2001, Lucent Technologies, Bell Laboratories * * author: Matthias Blume (blume@research.bell-labs.com) *) signature C_INT = sig include C type addr = CMemory.addr (* make struct or union size from its size given as a word; * needs explicit type constraint *) val mk_su_size : word -> 's S.size (* make struct or union RTTI given its corresponding size *) val mk_su_typ : 's su S.size -> 's su T.typ (* make function pointer type give the ML function that * implements the calling protocol *) val mk_fptr_typ : (addr -> 'a -> 'b) -> ('a -> 'b) fptr T.typ (* mk_obj' makes light-weight objects *) val mk_obj' : addr -> ('t, 'c) obj' (* make a void* from an address *) val mk_voidptr : addr -> voidptr (* given the function that implements the calling protocol and the * functions raw address, make a function pointer *) val mk_fptr : (addr -> 'a -> 'b) * addr -> ('a -> 'b) fptr (* making normal and const-declared struct- or union-fields * given the field's type and its offset *) val mk_rw_field : 'm T.typ * int * ('s, 'c) su_obj -> ('m, 'c) obj val mk_ro_field : 'm T.typ * int * ('s, 'c) su_obj -> ('m, ro) obj (* light version *) (* NOTE: We do not pass RTTI to the light version (which would * internally throw it away anyway). This means that we * will need an explicit type constraint. *) val mk_field' : int * ('s, 'ac) su_obj' -> ('m, 'rc) obj' (* making normal signed bitfields *) val mk_rw_sbf : int * word * word -> (* offset * bits * shift *) ('s, 'c) su_obj -> 'c sbf val mk_ro_sbf : int * word * word -> (* offset * bits * shift *) ('s, 'c) su_obj -> ro sbf (* light versions *) val mk_rw_sbf' : int * word * word -> (* offset * bits * shift *) ('s, 'c) su_obj' -> 'c sbf val mk_ro_sbf' : int * word * word -> (* offset * bits * shift *) ('s, 'c) su_obj' -> ro sbf (* making normal unsigned bitfields *) val mk_rw_ubf : int * word * word -> (* offset * bits * shift *) ('s, 'c) su_obj -> 'c ubf val mk_ro_ubf : int * word * word -> (* offset * bits * shift *) ('s, 'c) su_obj -> ro ubf (* light versions *) val mk_rw_ubf' : int * word * word -> (* offset * bits * shift *) ('s, 'c) su_obj' -> 'c ubf val mk_ro_ubf' : int * word * word -> (* offset * bits * shift *) ('s, 'c) su_obj' -> ro ubf (* reveal address behind void*; this is used to * implement the function-call protocol for functions that have * pointer arguments *) val reveal : voidptr -> addr val freveal : 'f fptr' -> addr val vcast : addr -> voidptr val pcast : addr -> 'o ptr' val fcast : addr -> 'f fptr' (* unsafe low-level array subscript that does not require RTTI *) val unsafe_sub : int -> (* element size *) (('t, 'n) arr, 'c) obj' * int -> ('t, 'n) obj' end mlton-20100608/lib/mlnlffi-lib/internals/c-int.sml0000644000076600000240000005540411404435636020264 0ustar mtfstaff(* c-int.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * The implementation of the interface that encodes C's type system * in ML. This implementation includes its "private" extensions. * * (C) 2001, Lucent Technologies, Bell Laboratories * * author: Matthias Blume (blume@research.bell-labs.com) *) local (* We play some games here with first calling C_Int simply C and then * renaming it because they result in saner printing behavior. *) structure C :> C_INT = struct exception OutOfMemory = CMemory.OutOfMemory fun bug m = raise Fail ("impossible: " ^ m) type addr = CMemory.addr val null = CMemory.null local datatype 'f objt = BASE of word | PTR of 'f | FPTR of addr -> 'f | ARR of { typ: 'f objt, n: word, esz: word, asz: word } (* Bitfield: b bits wide, l bits from left corner, r bits from right. * The word itself is CMemory.int_bits wide and located at address a. * * MSB LSB * V |<---b--->| V * |<---l---> ......... <---r--->| * |<----------wordsize--------->| * * 0.......0 1.......1 0.......0 = m * 1.......1 0.......0 1.......1 = im * * l + r = lr *) type cword = MLRep.Int.Unsigned.word type bf = { a: addr, l: word, r: word, lr: word, m: cword, im: cword } (* fun pair_type_addr (t: 'f objt) (a: addr) = (a, t) *) fun strip_type (a: addr, _: 'f objt) = a fun p_strip_type (a: addr, _: 'f objt) = a fun strip_fun (a: addr, _: 'f) = a fun addr_type_id (x: addr * 'f objt) = x fun addr_id (x: addr) = x infix -- ++ val op -- = CMemory.-- val op ++ = CMemory.++ infix << >> ~>> && || ^^ val op << = MLRep.Int.Unsigned.<< val op >> = MLRep.Int.Unsigned.>> val op ~>> = MLRep.Int.Unsigned.~>> val op && = MLRep.Int.Unsigned.andb val op || = MLRep.Int.Unsigned.orb (* val op ^^ = MLRep.Int.Unsigned.xorb *) val ~~ = MLRep.Int.Unsigned.notb in type ('t, 'c) obj = addr * 't objt (* RTTI for stored value *) type ('t, 'c) obj' = addr type ro = unit type rw = unit type 'o ptr = addr * 'o objt (* RTTI for target value *) type 'o ptr' = addr type ('t, 'n) arr = 't type 'f fptr = addr * 'f type 'f fptr' = addr type void = unit type voidptr = void ptr' type 'tag su = unit type 'tag enum = MLRep.Int.Signed.int type schar = MLRep.Char.Signed.int type uchar = MLRep.Char.Unsigned.word type sshort = MLRep.Short.Signed.int type ushort = MLRep.Short.Unsigned.word type sint = MLRep.Int.Signed.int type uint = MLRep.Int.Unsigned.word type slong = MLRep.Long.Signed.int type ulong = MLRep.Long.Unsigned.word type slonglong = MLRep.LongLong.Signed.int type ulonglong = MLRep.LongLong.Unsigned.word type float = MLRep.Float.real type double = MLRep.Double.real type 'c schar_obj = ( schar, 'c) obj type 'c uchar_obj = ( uchar, 'c) obj type 'c sshort_obj = ( sshort, 'c) obj type 'c ushort_obj = ( ushort, 'c) obj type 'c sint_obj = ( sint, 'c) obj type 'c uint_obj = ( uint, 'c) obj type 'c slong_obj = ( slong, 'c) obj type 'c ulong_obj = ( ulong, 'c) obj type 'c slonglong_obj = (slonglong, 'c) obj type 'c ulonglong_obj = (ulonglong, 'c) obj type 'c float_obj = ( float, 'c) obj type 'c double_obj = ( double, 'c) obj type 'c voidptr_obj = ( voidptr, 'c) obj type ('e, 'c) enum_obj = ( 'e enum, 'c) obj type ('f, 'c) fptr_obj = ( 'f fptr, 'c) obj type ('s, 'c) su_obj = ( 's su, 'c) obj type 'c schar_obj' = ( schar, 'c) obj' type 'c uchar_obj' = ( uchar, 'c) obj' type 'c sshort_obj' = ( sshort, 'c) obj' type 'c ushort_obj' = ( ushort, 'c) obj' type 'c sint_obj' = ( sint, 'c) obj' type 'c uint_obj' = ( uint, 'c) obj' type 'c slong_obj' = ( slong, 'c) obj' type 'c ulong_obj' = ( ulong, 'c) obj' type 'c slonglong_obj' = (slonglong, 'c) obj' type 'c ulonglong_obj' = (ulonglong, 'c) obj' type 'c float_obj' = ( float, 'c) obj' type 'c double_obj' = ( double, 'c) obj' type 'c voidptr_obj' = ( voidptr, 'c) obj' type ('e, 'c) enum_obj' = ( 'e enum, 'c) obj' type ('f, 'c) fptr_obj' = ( 'f fptr, 'c) obj' type ('s, 'c) su_obj' = ( 's su, 'c) obj' type 'c ubf = bf type 'c sbf = bf structure W = struct type ('from, 'to) witness = 'from -> 'to fun convert (w : 's -> 't) (x : 's objt) : 't objt = case x of BASE b => BASE b | PTR x => PTR (w x) | FPTR f => FPTR (fn a => w (f a)) | ARR {typ, n, esz, asz} => ARR {typ = convert w typ, n = n, esz = esz, asz = asz} val trivial : ('t, 't) witness = fn x => x val pointer : ('from, 'to) witness -> ('from ptr, 'to ptr) witness = fn w => fn (a, t) => (a, convert w t) val object : ('from, 'to) witness -> (('from, 'c) obj, ('to, 'c) obj) witness = fn w => fn (a, t) => (a, convert w t) val arr : ('from, 'to) witness -> (('from, 'n) arr, ('to, 'n) arr) witness = fn w => w val ro : ('from, 'to) witness -> (('from, 'fc) obj, ('to, ro) obj) witness = fn w => fn (a, t) => (a, convert w t) val rw : ('from, 'to) witness -> (('from, 'fc) obj, ('to, 'tc) obj) witness = fn w => fn (a, t) => (a, convert w t) end val convert : (('st, 'sc) obj, ('tt, 'tc) obj) W.witness -> ('st, 'sc) obj -> ('tt, 'tc) obj = fn w => fn x => w x val convert' : (('st, 'sc) obj, ('tt, 'tc) obj) W.witness -> ('st, 'sc) obj' -> ('tt, 'tc) obj' = fn _ => fn x => x (* * A family of types and corresponding values representing natural numbers. * (An encoding in SML without using dependent types.) * This is the full implementation including an unsafe extension * ("fromInt"). *) structure Dim = struct type ('a, 'z) dim0 = int fun toInt d = d fun fromInt d = d type dec = unit type 'a dg0 = unit type 'a dg1 = unit type 'a dg2 = unit type 'a dg3 = unit type 'a dg4 = unit type 'a dg5 = unit type 'a dg6 = unit type 'a dg7 = unit type 'a dg8 = unit type 'a dg9 = unit type zero = unit type nonzero = unit type 'a dim = ('a, nonzero) dim0 local fun dg n d = 10 * d + n in val dec' = 0 val (dg0', dg1', dg2', dg3', dg4', dg5', dg6', dg7', dg8', dg9') = (dg 0, dg 1, dg 2, dg 3, dg 4, dg 5, dg 6, dg 7, dg 8, dg 9) fun dec k = k dec' fun dg0 d k = k (dg0' d) fun dg1 d k = k (dg1' d) fun dg2 d k = k (dg2' d) fun dg3 d k = k (dg3' d) fun dg4 d k = k (dg4' d) fun dg5 d k = k (dg5' d) fun dg6 d k = k (dg6' d) fun dg7 d k = k (dg7' d) fun dg8 d k = k (dg8' d) fun dg9 d k = k (dg9' d) fun dim d = d end end structure S = struct type 't size = word fun toWord (s: 't size) = s val schar = CMemory.char_size val uchar = CMemory.char_size val sint = CMemory.int_size val uint = CMemory.int_size val sshort = CMemory.short_size val ushort = CMemory.short_size val slong = CMemory.long_size val ulong = CMemory.long_size val slonglong = CMemory.longlong_size val ulonglong = CMemory.longlong_size val float = CMemory.float_size val double = CMemory.double_size val voidptr = CMemory.addr_size val ptr = CMemory.addr_size val fptr = CMemory.addr_size val enum = CMemory.int_size end structure T = struct type 't typ = 't objt val typeof : ('t, 'c) obj -> 't typ = fn (_, t) => t val sizeof : 't typ -> 't S.size = fn BASE b => b | PTR _ => S.ptr | FPTR _ => S.fptr | ARR a => #asz a (* use private (and unsafe) extension to Dim module here... *) val dim : ('t, 'n) arr typ -> 'n Dim.dim = fn ARR { n, ... } => Dim.fromInt (Word.toInt n) | _ => bug "T.dim (non-array type)" val pointer : 't typ -> ('t, rw) obj ptr typ = fn t => PTR (null, PTR (null, t)) val target : ('t, 'c) obj ptr typ -> 't typ = fn PTR (_, PTR (_, t)) => t | _ => bug "T.target (non-pointer type)" val arr : 't typ * 'n Dim.dim -> ('t, 'n) arr typ = fn (t, d) => let val n = Word.fromInt (Dim.toInt d) val s = sizeof t in ARR { typ = t, n = n, esz = s, asz = n * s } end val elem : ('t, 'n) arr typ -> 't typ = fn ARR a => #typ a | _ => bug "T.elem (non-array type)" val ro : ('t, 'c) obj ptr typ -> ('t, ro) obj ptr typ = fn t => t val schar : schar typ = BASE S.schar val uchar : uchar typ = BASE S.uchar val sshort : sshort typ = BASE S.sshort val ushort : ushort typ = BASE S.ushort val sint : sint typ = BASE S.sint val uint : uint typ = BASE S.uint val slong : slong typ = BASE S.slong val ulong : ulong typ = BASE S.ulong val slonglong : slonglong typ = BASE S.slonglong val ulonglong : ulonglong typ = BASE S.ulonglong val float : float typ = BASE S.float val double : double typ = BASE S.double val voidptr : voidptr typ = BASE S.voidptr val enum : 'tag enum typ = BASE S.sint end structure Light = struct val obj : ('t, 'c) obj -> ('t, 'c) obj' = fn (a, _) => a val ptr : 'o ptr -> 'o ptr' = fn (a, _) => a val fptr : 'f fptr -> 'f fptr' = fn (a, _) => a end structure Heavy = struct val obj : 't T.typ -> ('t, 'c) obj' -> ('t, 'c) obj = fn t => fn a => (a, t) val ptr : 'o ptr T.typ -> 'o ptr' -> 'o ptr = fn PTR (_, t) => (fn a => (a, t)) | _ => bug "Heavy.ptr (non-object-pointer-type)" val fptr : 'f fptr T.typ -> 'f fptr' -> 'f fptr = fn (FPTR mkf) => (fn a => (a, #2 (mkf a))) | _ => bug "Heavy.fptr (non-function-pointer-type)" end val sizeof : ('t, 'c) obj -> 't S.size = fn (_, t) => T.sizeof t structure Cvt = struct (* going between abstract and concrete; these are all identities *) fun c_schar (c: schar) = c fun c_uchar (c: uchar) = c fun c_sshort (s: sshort) = s fun c_ushort (s: ushort) = s fun c_sint (i: sint) = i fun c_uint (i: uint) = i fun c_slong (l: slong) = l fun c_ulong (l: ulong) = l fun c_slonglong (ll: slonglong) = ll fun c_ulonglong (ll: ulonglong) = ll fun c_float (f: float) = f fun c_double (d: double) = d fun i2c_enum (e: 'e enum) = e val ml_schar = c_schar val ml_uchar = c_uchar val ml_sshort = c_sshort val ml_ushort = c_ushort val ml_sint = c_sint val ml_uint = c_uint val ml_slong = c_slong val ml_ulong = c_ulong val ml_slonglong = c_slonglong val ml_ulonglong = c_ulonglong val ml_float = c_float val ml_double = c_double val c2i_enum = i2c_enum end structure Get = struct val uchar' = CMemory.load_uchar val schar' = CMemory.load_schar val uint' = CMemory.load_uint val sint' = CMemory.load_sint val ushort' = CMemory.load_ushort val sshort' = CMemory.load_sshort val ulong' = CMemory.load_ulong val slong' = CMemory.load_slong val ulonglong' = CMemory.load_ulonglong val slonglong' = CMemory.load_slonglong val float' = CMemory.load_float val double' = CMemory.load_double val enum' = CMemory.load_sint val ptr' = CMemory.load_addr val fptr' = CMemory.load_addr val voidptr' = CMemory.load_addr val uchar = uchar' o strip_type val schar = schar' o strip_type val uint = uint' o strip_type val sint = sint' o strip_type val ushort = ushort' o strip_type val sshort = sshort' o strip_type val ulong = ulong' o strip_type val slong = slong' o strip_type val ulonglong = ulonglong' o strip_type val slonglong = slonglong' o strip_type val float = float' o strip_type val double = double' o strip_type val voidptr = voidptr' o strip_type val enum = enum' o strip_type val ptr : ('o ptr, 'c) obj -> 'o ptr = fn (a, PTR (_, t)) => (ptr' a, t) | _ => bug "Get.ptr (non-pointer)" val fptr : ('f, 'c) fptr_obj -> 'f fptr = fn (a, FPTR mkf) => let val fa = fptr' a in (fa, #2 (mkf fa)) end | _ => bug "Get.fptr (non-function-pointer)" local val u2s = MLRep.Int.Signed.fromLarge o MLRep.Int.Unsigned.toLargeIntX in fun ubf ({ a, l, r=_, lr, m=_, im=_ } : bf) = (CMemory.load_uint a << l) >> lr fun sbf ({ a, l, r=_, lr, m=_, im=_ } : bf) = u2s ((CMemory.load_uint a << l) ~>> lr) end end structure Set = struct val uchar' = CMemory.store_uchar val schar' = CMemory.store_schar val uint' = CMemory.store_uint val sint' = CMemory.store_sint val ushort' = CMemory.store_ushort val sshort' = CMemory.store_sshort val ulong' = CMemory.store_ulong val slong' = CMemory.store_slong val ulonglong' = CMemory.store_ulonglong val slonglong' = CMemory.store_slonglong val float' = CMemory.store_float val double' = CMemory.store_double val enum' = CMemory.store_sint val ptr' = CMemory.store_addr val fptr' = CMemory.store_addr val voidptr' = CMemory.store_addr val ptr_voidptr' = CMemory.store_addr local infix $ fun (f $ g) (x, y) = f (g x, y) in val uchar = uchar' $ strip_type val schar = schar' $ strip_type val uint = uint' $ strip_type val sint = sint' $ strip_type val ushort = ushort' $ strip_type val sshort = sshort' $ strip_type val ulong = ulong' $ strip_type val slong = slong' $ strip_type val ulonglong = ulonglong' $ strip_type val slonglong = slonglong' $ strip_type val float = float' $ strip_type val double = double' $ strip_type val enum = enum' $ strip_type val ptr : ('o ptr, rw) obj * 'o ptr -> unit = fn (x, p) => ptr' (p_strip_type x, p_strip_type p) val voidptr = voidptr' $ strip_type val fptr : ('f, rw) fptr_obj * 'f fptr -> unit = fn (x, f) => fptr' (p_strip_type x, strip_fun f) val ptr_voidptr : ('o ptr, rw) obj * voidptr -> unit = fn (x, p) => ptr_voidptr' (p_strip_type x, p) end fun ubf ({ a, l=_, r, lr=_, m, im }, x) = CMemory.store_uint (a, (CMemory.load_uint a && im) || ((x << r) && m)) local val s2u = MLRep.Int.Unsigned.fromLargeInt o MLRep.Int.Signed.toLarge in fun sbf (f, x) = ubf (f, s2u x) end end fun copy' bytes { from, to } = CMemory.bcopy { from = from, to = to, bytes = bytes } fun copy { from = (from, t), to = (to, _: 'f objt) } = copy' (T.sizeof t) { from = from, to = to } val ro = addr_type_id val rw = addr_type_id val ro' = addr_id val rw' = addr_id structure Ptr = struct val |&| : ('t, 'c) obj -> ('t, 'c) obj ptr = fn (a, t) => (a, PTR (null, t)) val |*| : ('t, 'c) obj ptr -> ('t, 'c) obj = fn (a, PTR (_, t)) => (a, t) | _ => bug "Ptr.* (non-pointer)" val |&! : ('t, 'c) obj' -> ('t, 'c) obj ptr' = addr_id val |*! : ('t, 'c) obj ptr' -> ('t, 'c) obj' = addr_id fun compare (p, p') = CMemory.compare (p_strip_type p, p_strip_type p') val compare' = CMemory.compare val inject' = addr_id val cast' = addr_id val inject : 'o ptr -> voidptr = p_strip_type val cast : 'o ptr T.typ -> voidptr -> 'o ptr = fn PTR (_, t) => (fn p => (p, t)) | _ => bug "Ptr.cast (non-pointer-type)" val vnull : voidptr = CMemory.null val null : 'o ptr T.typ -> 'o ptr = fn t => cast t vnull val null' : 'o ptr' = vnull val fnull' : 'f ptr' = CMemory.null val fnull : 'f fptr T.typ -> 'f fptr = fn t => Heavy.fptr t fnull' val isVNull : voidptr -> bool = CMemory.isNull val isNull : 'o ptr -> bool = fn p => isVNull (inject p) val isNull' = CMemory.isNull val isFNull : 'f fptr -> bool = fn (a,_) => CMemory.isNull a val isFNull' = CMemory.isNull fun |+! s (p, i) = p ++ (Word.toInt s * i) fun |-! s (p, p') = (p -- p') div Word.toInt s val |+| : ('t, 'c) obj ptr * int -> ('t, 'c) obj ptr = fn ((p, t as PTR (_, t')), i) => (|+! (T.sizeof t') (p, i), t) | _ => bug "Ptr.|+| (non-pointer-type)" val |-| : ('t, 'c) obj ptr * ('t, 'c) obj ptr -> int = fn ((p, PTR (_, t')), (p', _)) => |-! (T.sizeof t') (p, p') | _ => bug "Ptr.|-| (non-pointer-type" val sub : ('t, 'c) obj ptr * int -> ('t, 'c) obj = fn (p, i) => |*| (|+| (p, i)) fun sub' t (p, i) = |*! (|+! t (p, i)) val convert : (('st, 'sc) obj ptr, ('tt, 'tc) obj ptr) W.witness -> ('st, 'sc) obj ptr -> ('tt, 'tc) obj ptr = fn w => fn x => w x val convert' : (('st, 'sc) obj ptr, ('tt, 'tc) obj ptr) W.witness -> ('st, 'sc) obj ptr' -> ('tt, 'tc) obj ptr' = fn _ => fn x => x val ro : ('t, 'c) obj ptr -> ('t, ro) obj ptr = fn x => convert (W.pointer (W.ro W.trivial)) x val rw : ('t, 'sc) obj ptr -> ('t, 'tc) obj ptr = fn x => convert (W.pointer (W.rw W.trivial)) x val ro' : ('t, 'c) obj ptr' -> ('t, ro) obj ptr' = addr_id val rw' : ('t, 'sc) obj ptr' -> ('t, 'tc) obj ptr' = addr_id end structure Arr = struct local fun asub (a, i, n, esz) = (* take advantage of wrap-around to avoid the >= 0 test... *) if Word.fromInt i < n then a ++ (Word.toIntX esz * i) else raise General.Subscript in val sub : (('t, 'n) arr, 'c) obj * int -> ('t, 'c) obj = fn ((a, ARR { typ, n, esz, ... }), i) => (asub (a, i, n, esz), typ) | _ => bug "Arr.sub (non-array)" val sub' : 't S.size * 'n Dim.dim -> (('t, 'n) arr, 'c) obj' * int -> ('t, 'c) obj' = fn (s, d) => fn (a, i) => asub (a, i, Word.fromInt (Dim.toInt d), s) end val decay : (('t, 'n) arr, 'c) obj -> ('t, 'c) obj ptr = fn (a, ARR { typ, ... }) => (a, PTR (null, typ)) | _ => bug "Arr.decay (non-array)" val decay' = addr_id val reconstruct : ('t, 'c) obj ptr * 'n Dim.dim -> (('t, 'n) arr, 'c) obj = fn ((a, PTR (_, t)), d) => (a, T.arr (t, d)) | _ => bug "Arr.reconstruct (non-pointer)" fun reconstruct' (a: addr, _: 'n Dim.dim) = a fun dim (_: addr, t) = T.dim t end fun new' s = CMemory.alloc s val new : 't T.typ -> ('t, 'c) obj = fn t => (new' (T.sizeof t), t) val discard' = CMemory.free val discard : ('t, 'c) obj -> unit = fn x => discard' (p_strip_type x) fun alloc' s i = CMemory.alloc (s * i) val alloc : 't T.typ -> word -> ('t, 'c) obj ptr = fn t => fn i => (alloc' (T.sizeof t) i, PTR (null, t)) val free' = CMemory.free val free : 'o ptr -> unit = fn x => free' (p_strip_type x) val call : ('a -> 'b) fptr * 'a -> 'b = fn ((_, f), x) => f x val call' : ('a -> 'b) fptr T.typ -> ('a -> 'b) fptr' * 'a -> 'b = fn (FPTR mkf) => (fn (a, x) => (#2 (mkf a)) x) | _ => bug "call' (non-function-pointer-type)" structure U = struct fun fcast (f : 'fa fptr') : 'fb fptr' = f fun p2i (a : 'o ptr') : ulong = CMemory.p2i a fun i2p (a : ulong) : 'o ptr' = CMemory.i2p a end (* ------------- internal stuff ------------- *) fun mk_obj' (a : addr) = a val mk_voidptr : addr -> voidptr = fn a => a local fun mk_field (t: 'f objt, i, (a, _)) = (a ++ i, t) in val mk_rw_field : 'm T.typ * int * ('s, 'c) su_obj -> ('m, 'c) obj = mk_field val mk_ro_field : 'm T.typ * int * ('s, 'c) su_obj -> ('m, ro) obj = mk_field fun mk_field' (i, a) = a ++ i end local fun mk_bf' (offset, bits, shift) a = let val a = a ++ offset val l = shift val lr = CMemory.int_bits - bits val r = lr - l val m = (~~0w0 << lr) >> l val im = ~~ m in { a = a, l = l, r = r, lr = lr, m = m, im = im } : bf end fun mk_bf acc (a, _) = mk_bf' acc a in val mk_rw_ubf = mk_bf val mk_ro_ubf = mk_bf val mk_rw_ubf' = mk_bf' val mk_ro_ubf' = mk_bf' val mk_rw_sbf = mk_bf val mk_ro_sbf = mk_bf val mk_rw_sbf' = mk_bf' val mk_ro_sbf' = mk_bf' end val mk_su_size : word -> 's S.size = fn sz => sz val mk_su_typ : 's su S.size -> 's su T.typ = fn sz => BASE sz val mk_fptr : (addr -> 'a -> 'b) * addr -> ('a -> 'b) fptr = fn (mkf, a) => (a, mkf a) val mk_fptr_typ : (addr -> 'a -> 'b) -> ('a -> 'b) fptr T.typ = fn mkf => FPTR (fn a => (null, mkf a)) val reveal : voidptr -> addr = addr_id val freveal : 'f fptr' -> addr = addr_id val vcast : addr -> voidptr = addr_id val pcast : addr -> 'o ptr' = addr_id val fcast : addr -> 'f fptr' = addr_id fun unsafe_sub esz (a, i) = a ++ esz * i end (* local *) end in structure C_Int = C end mlton-20100608/lib/mlnlffi-lib/internals/c-int.x86-linux.mlb0000644000076600000240000000002311404435636022007 0ustar mtfstaffc-int.x86-unix.mlb mlton-20100608/lib/mlnlffi-lib/internals/c.sml0000644000076600000240000000050611404435636017465 0ustar mtfstaff(* c.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * Encoding C's type system in SML. This module provides the "public" * view of the implementation. * * (C) 2001, Lucent Technologies, Bell Laboratories * * author: Matthias Blume (blume@research.bell-labs.com) *) structure C : C = C_Int mlton-20100608/lib/mlnlffi-lib/internals/tag.sml0000644000076600000240000000516611404435636020025 0ustar mtfstaff(* tag.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * This module provides an infinite family of mutually distinct types * where each type corresponds to a sequence of "letters" (taken * from [a-zA-Z0-9_']). There are no values that correspond to these * types. * * (C) 2001, Lucent Technologies, Bell Laboratories * * author: Matthias Blume (blume@research.bell-labs.com) *) structure Tag :> sig type 't t_0 type 't t_1 type 't t_2 type 't t_3 type 't t_4 type 't t_5 type 't t_6 type 't t_7 type 't t_8 type 't t_9 type 't t__ type 't t_' type 't t_a type 't t_b type 't t_c type 't t_d type 't t_e type 't t_f type 't t_g type 't t_h type 't t_i type 't t_j type 't t_k type 't t_l type 't t_m type 't t_n type 't t_o type 't t_p type 't t_q type 't t_r type 't t_s type 't t_t type 't t_u type 't t_v type 't t_w type 't t_x type 't t_y type 't t_z type 't t_A type 't t_B type 't t_C type 't t_D type 't t_E type 't t_F type 't t_G type 't t_H type 't t_I type 't t_J type 't t_K type 't t_L type 't t_M type 't t_N type 't t_O type 't t_P type 't t_Q type 't t_R type 't t_S type 't t_T type 't t_U type 't t_V type 't t_W type 't t_X type 't t_Y type 't t_Z type s type u type e end = struct type 't t_0 = unit type 't t_1 = unit type 't t_2 = unit type 't t_3 = unit type 't t_4 = unit type 't t_5 = unit type 't t_6 = unit type 't t_7 = unit type 't t_8 = unit type 't t_9 = unit type 't t__ = unit type 't t_' = unit type 't t_a = unit type 't t_b = unit type 't t_c = unit type 't t_d = unit type 't t_e = unit type 't t_f = unit type 't t_g = unit type 't t_h = unit type 't t_i = unit type 't t_j = unit type 't t_k = unit type 't t_l = unit type 't t_m = unit type 't t_n = unit type 't t_o = unit type 't t_p = unit type 't t_q = unit type 't t_r = unit type 't t_s = unit type 't t_t = unit type 't t_u = unit type 't t_v = unit type 't t_w = unit type 't t_x = unit type 't t_y = unit type 't t_z = unit type 't t_A = unit type 't t_B = unit type 't t_C = unit type 't t_D = unit type 't t_E = unit type 't t_F = unit type 't t_G = unit type 't t_H = unit type 't t_I = unit type 't t_J = unit type 't t_K = unit type 't t_L = unit type 't t_M = unit type 't t_N = unit type 't t_O = unit type 't t_P = unit type 't t_Q = unit type 't t_R = unit type 't t_S = unit type 't t_T = unit type 't t_U = unit type 't t_V = unit type 't t_W = unit type 't t_X = unit type 't t_Y = unit type 't t_Z = unit type s = unit type u = unit type e = unit end mlton-20100608/lib/mlnlffi-lib/internals/zstring.sml0000644000076600000240000000345711404435636020753 0ustar mtfstaff(* zstring.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * Functions for translating between 0-terminated C strings and native * ML strings. * * (C) 2001, Lucent Technologies, Bell Laboratories * * author: Matthias Blume (blume@research.bell-labs.com) *) structure ZString : ZSTRING = struct local open C fun get' p = Get.uchar' (Ptr.|*! p) fun set' (p, w) = Set.uchar' (Ptr.|*! p, w) fun nxt' p = Ptr.|+! S.uchar (p, 1) in type 'c zstring = (uchar, 'c) obj ptr type 'c zstring' = (uchar, 'c) obj ptr' fun length' p = let fun loop (n, p) = if get' p = 0w0 then n else loop (n + 1, nxt' p) in loop (0, p) end fun length p = length' (Light.ptr p) fun toML' p = let fun loop (l, p) = case get' p of 0w0 => String.implode (rev l) | c => loop ((Byte.byteToChar c) :: l, nxt' p) in loop ([], p) end fun toML p = toML' (Light.ptr p) fun cpML' { from, to } = let val n = String.size from fun loop (i, p) = if i >= n then set' (p, 0w0) else (set' (p, Byte.charToByte (String.sub (from, i))); loop (i+1, nxt' p)) in loop (0, to) end fun cpML { from, to } = cpML' { from = from, to = Light.ptr to } fun dupML' s = let val z = C.alloc' C.S.uchar (Word.fromInt (size s + 1)) in cpML' { from = s, to = z }; Ptr.rw' z end fun dupML s = let val z = C.alloc C.T.uchar (Word.fromInt (size s + 1)) in cpML { from = s, to = z }; Ptr.rw z end end end mlton-20100608/lib/mlnlffi-lib/Makefile0000644000076600000240000000107611404435637016173 0ustar mtfstaffPATH := ../bin:$(shell echo $$PATH) CC := gcc -std=gnu99 CFLAGS := -Wall EXE := TARGET_ARCH := $(shell ../../bin/host-arch) TARGET_OS := $(shell ../../bin/host-os) ifeq ($(TARGET_OS), cygwin) EXE := .exe endif ifeq ($(TARGET_OS), mingw) EXE := .exe endif .DELETE_ON_ERROR: all: memory/platform/rtld-flags.$(TARGET_OS).sml memory/platform/rtld-flags.$(TARGET_OS).sml: gen-rtld-flags.c $(CC) $(CFLAGS) -o gen-rtld-flags gen-rtld-flags.c ./gen-rtld-flags > memory/platform/rtld-flags.$(TARGET_OS).sml rm -f gen-rtld-flags$(EXE) .PHONY: clean clean: ../../bin/clean mlton-20100608/lib/mlnlffi-lib/memory/0000755000076600000240000000000011404470406016030 5ustar mtfstaffmlton-20100608/lib/mlnlffi-lib/memory/bitop-fn.sml0000644000076600000240000000433611404435637020300 0ustar mtfstaff(* bitop-fn.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* bitop-fn.sml * * Bit operations on integers as if they were words * (based on suggestions from Allen Leung). * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) functor IntBitOps (structure I : INTEGER structure W : WORD) : sig (* We use a functor to express this stuff generically. * If efficiency is a concern, it may be necessary to * expand this "by hand".... *) type int = I.int (* unsigned arithmetic. * non-overflow trapping *) val ++ : int * int -> int val -- : int * int -> int val ** : int * int -> int val udiv : int * int -> int val umod : int * int -> int val umin : int * int -> int val umax : int * int -> int (* bit ops *) val notb : int -> int val andb : int * int -> int val orb : int * int -> int val xorb : int * int -> int val << : int * Word.word -> int val >> : int * Word.word -> int val ~>> : int * Word.word -> int (* unsigned comparisons *) val ule : int * int -> bool val ulg : int * int -> bool val ugt : int * int -> bool val uge : int * int -> bool val ucompare : int * int -> order end = struct type int = I.int local val to = W.fromLargeInt o I.toLarge val from = I.fromLarge o W.toLargeIntX fun bop f (x, y) = from (f (to x, to y)) (* binary op *) fun uop f x = from (f (to x)) (* unary op *) fun sop f (x, y) = from (f (to x, y)) (* shift-like op *) fun cop f (x, y) = f (to x, to y) (* comparison-like op *) in val ++ = bop W.+ val -- = bop W.- val ** = bop W.* val udiv = bop W.div val umod = bop W.mod val andb = bop W.andb val orb = bop W.orb val xorb = bop W.xorb val notb = uop W.notb val umax = bop W.max val umin = bop W.min val << = sop W.<< val >> = sop W.>> val ~>> = sop W.~>> val ulg = cop W.< val ule = cop W.<= val ugt = cop W.> val uge = cop W.>= val ucompare = cop W.compare end end mlton-20100608/lib/mlnlffi-lib/memory/linkage-libdl.sml0000644000076600000240000001174511404435637021262 0ustar mtfstaff(* linkage-libdl.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* linkage-dlopen.sml * * This module implements a high-level interface for dlopen. * While addresses (those obtained by applying function "addr" below * or addresses derived from those) will not remain valid across * export{ML,Fn}/restart, handles *will* stay valid. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) structure DynLinkage :> DYN_LINKAGE = struct exception DynLinkError of string val () = MLton.Exn.addExnMessager (fn DynLinkError s => SOME (concat ["DynLinkError: ", s]) | _ => NONE) local type era = unit ref type addr = MLton.Pointer.t (* a handle remembers an address and the era of its creation as * well as a function to re-create the address when necessary *) type h = (addr * era) ref * (unit -> addr) in type lib_handle = h type addr_handle = h end type mode = C_UInt.word local open RTLDFlags in fun mk_mode {lazy: bool, global: bool} : mode= C_UInt.orb (if lazy then RTLD_LAZY else RTLD_NOW, if global then RTLD_GLOBAL else RTLD_LOCAL) end local (* low-level linkage via dlopen/dlsym *) local val dlopen = _import "dlopen": string * mode -> MLton.Pointer.t; val dlopen_null = _import "dlopen": MLton.Pointer.t * mode -> MLton.Pointer.t; val dlsym = _import "dlsym": MLton.Pointer.t * string -> MLton.Pointer.t; val dlerror = _import "dlerror": unit -> MLton.Pointer.t; val dlclose = _import "dlclose": MLton.Pointer.t -> Int32.int; in (* mid-level linkage *) val dlopen = fn (filename, lazy, global) => let val mode = mk_mode {lazy = lazy, global = global} in case filename of NONE => dlopen_null (MLton.Pointer.null, mode) | SOME filename => dlopen (filename ^ "\000", mode) end val dlsym = fn (hndl, symbol) => dlsym (hndl, symbol ^ "\000") val dlerror = fn () => let val addr = dlerror () in if addr = MLton.Pointer.null then NONE else let fun loop (index, cs) = let val w = MLton.Pointer.getWord8 (addr, index) val c = Byte.byteToChar w in if c = #"\000" then SOME (implode (rev cs)) else loop (index + 1, c::cs) end in loop (0, []) end end val dlclose = fn hndl => let val _ = dlclose hndl in () end end (* label used for CleanUp *) (* val label = "DynLinkNewEra" *) (* generate a new "era" indicator *) fun newEra () = ref () (* the current era *) val now = ref (newEra ()) (* make a handle, remember era of creation of its current value *) fun mkHandle f = (ref (f (), !now), f) (* fetch from a handle; use the stored address if it was created * in the current era, otherwise regenerate the address *) fun get (r as ref (a, e), f) = if e = !now then a else let val a = f () in r := (a, !now); a end (* call a dl-function and check for errors *) fun checked dlf x = let val r = dlf x in case dlerror () of NONE => r | SOME s => raise DynLinkError s end (* add a cleanup handler that causes a new era to start * every time the runtime system is started anew *) (* open SMLofNJ.Internals.CleanUp val _ = addCleaner (label, [AtInit, AtInitFn], fn _ => now := newEra ()) val _ = Cleaner.addNew (Cleaner.atLoadWorld, fn () => now := newEra ()) *) in val main_lib = mkHandle (fn () => checked dlopen (NONE, true, true)) fun open_lib' { name, lazy, global, dependencies } = mkHandle (fn () => (app (ignore o get) dependencies; checked dlopen (SOME name, lazy, global))) fun open_lib { name, lazy, global } = open_lib' { name = name, lazy = lazy, global = global, dependencies = [] } fun lib_symbol (lh, s) = mkHandle (fn () => checked dlsym (get lh, s)) val addr = get fun close_lib lh = checked dlclose (get lh) end end mlton-20100608/lib/mlnlffi-lib/memory/linkage.sig0000644000076600000240000000271011404435637020155 0ustar mtfstaff(* linkage.sig * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* linkage.sig * * This module defines a high-level interface for dlopen. * While addresses (those obtained by applying function "addr" below * or addresses derived from those) will not remain valid across * export{ML,Fn}/restart, handles *will* stay valid. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) signature DYN_LINKAGE = sig exception DynLinkError of string type lib_handle (* handle on dynamically linked library (DL) *) type addr_handle (* handle on address obtained from a DL *) val main_lib : lib_handle (* the runtime system itself *) (* link new library and return its handle *) val open_lib : { name: string, lazy: bool, global: bool } -> lib_handle val open_lib' : { name: string, lazy: bool, global: bool, dependencies: lib_handle list } -> lib_handle (* get the address handle of a symbol exported from a DL *) val lib_symbol : lib_handle * string -> addr_handle (* fetch the actual address from an address handle; the value obtained * is not valid across export{ML,Fn}/resume cycles *) val addr : addr_handle -> MLton.Pointer.t (* unlink previously linked DL; this immediately invalidates all * symbol addresses and handles associated with this library *) val close_lib : lib_handle -> unit end mlton-20100608/lib/mlnlffi-lib/memory/memaccess.sig0000644000076600000240000001112111404435637020477 0ustar mtfstaff(* memaccess.sig * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* memaccess.sig * * Primitives for "raw" memory access. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) signature CMEMACCESS = sig eqtype addr val null : addr val isNull : addr -> bool val ++ : addr * int -> addr val -- : addr * addr -> int val compare : addr * addr -> order val bcopy : { from: addr, to: addr, bytes: word } -> unit (* actual sizes of C types (not their ML representations) in bytes *) val addr_size : word val char_size : word val short_size : word val int_size : word val long_size : word val longlong_size : word val float_size : word val double_size : word (* fetching from memory *) val load_addr : addr -> addr val load_schar : addr -> MLRep.Char.Signed.int val load_uchar : addr -> MLRep.Char.Unsigned.word val load_sshort : addr -> MLRep.Short.Signed.int val load_ushort : addr -> MLRep.Short.Unsigned.word val load_sint : addr -> MLRep.Int.Signed.int val load_uint : addr -> MLRep.Int.Unsigned.word val load_slong : addr -> MLRep.Long.Signed.int val load_ulong : addr -> MLRep.Long.Unsigned.word val load_slonglong : addr -> MLRep.LongLong.Signed.int val load_ulonglong : addr -> MLRep.LongLong.Unsigned.word val load_float : addr -> MLRep.Float.real val load_double : addr -> MLRep.Double.real (* storing into memory *) val store_addr : addr * addr -> unit val store_schar : addr * MLRep.Char.Signed.int -> unit val store_uchar : addr * MLRep.Char.Unsigned.word -> unit val store_sshort : addr * MLRep.Short.Signed.int -> unit val store_ushort : addr * MLRep.Short.Unsigned.word -> unit val store_sint : addr * MLRep.Int.Signed.int -> unit val store_uint : addr * MLRep.Int.Unsigned.word -> unit val store_slong : addr * MLRep.Long.Signed.int -> unit val store_ulong : addr * MLRep.Long.Unsigned.word -> unit val store_slonglong : addr * MLRep.LongLong.Signed.int -> unit val store_ulonglong : addr * MLRep.LongLong.Unsigned.word -> unit val store_float : addr * MLRep.Float.real -> unit val store_double : addr * MLRep.Double.real -> unit val int_bits : word (* types used in C calling convention *) type cc_addr type cc_schar type cc_uchar type cc_sshort type cc_ushort type cc_sint type cc_uint type cc_slong type cc_ulong type cc_slonglong type cc_ulonglong type cc_float type cc_double (* wrapping and unwrapping for cc types *) val wrap_addr : addr -> cc_addr val wrap_schar : MLRep.Char.Signed.int -> cc_schar val wrap_uchar : MLRep.Char.Unsigned.word -> cc_uchar val wrap_sshort : MLRep.Short.Signed.int -> cc_sshort val wrap_ushort : MLRep.Short.Unsigned.word -> cc_ushort val wrap_sint : MLRep.Int.Signed.int -> cc_sint val wrap_uint : MLRep.Int.Unsigned.word -> cc_uint val wrap_slong : MLRep.Long.Signed.int -> cc_slong val wrap_ulong : MLRep.Long.Unsigned.word -> cc_ulong val wrap_slonglong : MLRep.LongLong.Signed.int -> cc_slonglong val wrap_ulonglong : MLRep.LongLong.Unsigned.word -> cc_ulonglong val wrap_float : MLRep.Float.real -> cc_float val wrap_double : MLRep.Double.real -> cc_double val unwrap_addr : cc_addr -> addr val unwrap_schar : cc_schar -> MLRep.Char.Signed.int val unwrap_uchar : cc_uchar -> MLRep.Char.Unsigned.word val unwrap_sshort : cc_sshort -> MLRep.Short.Signed.int val unwrap_ushort : cc_ushort -> MLRep.Short.Unsigned.word val unwrap_sint : cc_sint -> MLRep.Int.Signed.int val unwrap_uint : cc_uint -> MLRep.Int.Unsigned.word val unwrap_slong : cc_slong -> MLRep.Long.Signed.int val unwrap_ulong : cc_ulong -> MLRep.Long.Unsigned.word val unwrap_slonglong : cc_slonglong -> MLRep.LongLong.Signed.int val unwrap_ulonglong : cc_ulonglong -> MLRep.LongLong.Unsigned.word val unwrap_float : cc_float -> MLRep.Float.real val unwrap_double : cc_double -> MLRep.Double.real (* unsafe pointer <-> int conversion *) val p2i : addr -> MLRep.Long.Unsigned.word val i2p : MLRep.Long.Unsigned.word -> addr end mlton-20100608/lib/mlnlffi-lib/memory/memaccess.sml0000644000076600000240000002020111404435637020507 0ustar mtfstaff(* memaccess.sml * 2007 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. Make use of $(SML_LIB)/basis/c-types.mlb * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* memaccess-64-big.sml *) (* memaccess-64-little.sml *) (* memaccess-a4s2i4l4f4d8.sml * * Primitives for "raw" memory access. * * x86/Sparc/PPC version: * addr char short int long float double * 4 1 2 4 4 4 8 (bytes) * * (C) 2004 The Fellowship of SML/NJ * * author: Matthias Blume (blume@tti-c.org) *) structure CMemAccess : CMEMACCESS = struct structure Ptr = MLton.Pointer type addr = Ptr.t val null = Ptr.null : addr fun isNull a = a = null infix ++ -- (* rely on 2's-complement for the following... *) fun (a: addr) ++ i = Ptr.add (a, Word.fromInt i) val compare = Ptr.compare fun a1 -- a2 = Word.toIntX (Ptr.diff (a1, a2)) val addr_size = Word.fromInt (C_Size.wordSize div 8) val char_size = Word.fromInt (C_UChar.wordSize div 8) val short_size = Word.fromInt (C_UShort.wordSize div 8) val int_size = Word.fromInt (C_UInt.wordSize div 8) val long_size = Word.fromInt (C_ULong.wordSize div 8) val longlong_size = Word.fromInt (C_ULongLong.wordSize div 8) local structure RealNArg = struct type 'a t = int val fReal32 = 32 val fReal64 = 64 end structure Float = C_Float_ChooseRealN(RealNArg) structure Double = C_Double_ChooseRealN(RealNArg) in val float_size = Word.fromInt (Float.f div 8) val double_size = Word.fromInt (Double.f div 8) end local fun get g addr = g (addr, 0) structure IntNArg = struct type 'a t = Ptr.t * int -> 'a val fInt8 = Ptr.getInt8 val fInt16 = Ptr.getInt16 val fInt32 = Ptr.getInt32 val fInt64 = Ptr.getInt64 end structure RealNArg = struct type 'a t = Ptr.t * int -> 'a val fReal32 = Ptr.getReal32 val fReal64 = Ptr.getReal64 end structure WordNArg = struct type 'a t = Ptr.t * int -> 'a val fWord8 = Ptr.getWord8 val fWord16 = Ptr.getWord16 val fWord32 = Ptr.getWord32 val fWord64 = Ptr.getWord64 end structure UChar = C_UChar_ChooseWordN(WordNArg) structure SChar = C_SChar_ChooseIntN(IntNArg) structure UShort = C_UShort_ChooseWordN(WordNArg) structure SShort = C_SShort_ChooseIntN(IntNArg) structure UInt = C_UInt_ChooseWordN(WordNArg) structure SInt = C_SInt_ChooseIntN(IntNArg) structure ULong = C_ULong_ChooseWordN(WordNArg) structure SLong = C_SLong_ChooseIntN(IntNArg) structure ULongLong = C_ULongLong_ChooseWordN(WordNArg) structure SLongLong = C_SLongLong_ChooseIntN(IntNArg) structure Float = C_Float_ChooseRealN(RealNArg) structure Double = C_Double_ChooseRealN(RealNArg) in val load_addr = get Ptr.getPointer val load_uchar = get UChar.f val load_schar = get SChar.f val load_ushort = get UShort.f val load_sshort = get SShort.f val load_uint = get UInt.f val load_sint = get SInt.f val load_ulong = get ULong.f val load_slong = get SLong.f val load_ulonglong = get ULongLong.f val load_slonglong = get SLongLong.f val load_float = get Float.f val load_double = get Double.f end local fun set s (addr, x) = s (addr, 0, x) structure IntNArg = struct type 'a t = Ptr.t * int * 'a -> unit val fInt8 = Ptr.setInt8 val fInt16 = Ptr.setInt16 val fInt32 = Ptr.setInt32 val fInt64 = Ptr.setInt64 end structure RealNArg = struct type 'a t = Ptr.t * int * 'a -> unit val fReal32 = Ptr.setReal32 val fReal64 = Ptr.setReal64 end structure WordNArg = struct type 'a t = Ptr.t * int * 'a -> unit val fWord8 = Ptr.setWord8 val fWord16 = Ptr.setWord16 val fWord32 = Ptr.setWord32 val fWord64 = Ptr.setWord64 end structure UChar = C_UChar_ChooseWordN(WordNArg) structure SChar = C_SChar_ChooseIntN(IntNArg) structure UShort = C_UShort_ChooseWordN(WordNArg) structure SShort = C_SShort_ChooseIntN(IntNArg) structure UInt = C_UInt_ChooseWordN(WordNArg) structure SInt = C_SInt_ChooseIntN(IntNArg) structure ULong = C_ULong_ChooseWordN(WordNArg) structure SLong = C_SLong_ChooseIntN(IntNArg) structure ULongLong = C_ULongLong_ChooseWordN(WordNArg) structure SLongLong = C_SLongLong_ChooseIntN(IntNArg) structure Float = C_Float_ChooseRealN(RealNArg) structure Double = C_Double_ChooseRealN(RealNArg) in val store_addr = set Ptr.setPointer val store_uchar = set UChar.f val store_schar = set SChar.f val store_ushort = set UShort.f val store_sshort = set SShort.f val store_uint = set UInt.f val store_sint = set SInt.f val store_ulong = set ULong.f val store_slong = set SLong.f val store_ulonglong = set ULongLong.f val store_slonglong = set SLongLong.f val store_float = set Float.f val store_double = set Double.f end val int_bits = int_size * 0w8 (* this needs to be severely optimized... *) fun bcopy { from: addr, to: addr, bytes: word } = if bytes > 0w0 then (store_uchar (to, load_uchar from); bcopy { from = from ++ 1, to = to ++ 1, bytes = bytes - 0w1 }) else () (* types used in C calling convention *) type cc_addr = MLton.Pointer.t type cc_schar = C_SChar.int type cc_uchar = C_UChar.word type cc_sshort = C_SShort.int type cc_ushort = C_UShort.word type cc_sint = C_SInt.int type cc_uint = C_UInt.word type cc_slong = C_SLong.int type cc_ulong = C_ULong.word type cc_slonglong = C_SLongLong.int type cc_ulonglong = C_ULongLong.word type cc_float = C_Float.real type cc_double = C_Double.real (* wrapping and unwrapping for cc types *) fun wrap_addr (x : addr) = x : cc_addr fun wrap_schar (x : MLRep.Char.Signed.int) = x : cc_schar fun wrap_uchar (x : MLRep.Char.Unsigned.word) = x : cc_uchar fun wrap_sshort (x : MLRep.Short.Signed.int) = x : cc_sshort fun wrap_ushort (x : MLRep.Short.Unsigned.word) = x : cc_ushort fun wrap_sint (x : MLRep.Int.Signed.int) = x : cc_sint fun wrap_uint (x : MLRep.Int.Unsigned.word) = x : cc_uint fun wrap_slong (x : MLRep.Long.Signed.int) = x : cc_slong fun wrap_ulong (x : MLRep.Long.Unsigned.word) = x : cc_ulong fun wrap_slonglong (x : MLRep.LongLong.Signed.int) = x : cc_slonglong fun wrap_ulonglong (x : MLRep.LongLong.Unsigned.word) = x : cc_ulonglong fun wrap_float (x : MLRep.Float.real) = x : cc_float fun wrap_double (x : MLRep.Double.real) = x : cc_double fun unwrap_addr (x : cc_addr) = x : addr fun unwrap_schar (x : cc_schar) = x : MLRep.Char.Signed.int fun unwrap_uchar (x : cc_uchar) = x : MLRep.Char.Unsigned.word fun unwrap_sshort (x : cc_sshort) = x : MLRep.Short.Signed.int fun unwrap_ushort (x : cc_ushort) = x : MLRep.Short.Unsigned.word fun unwrap_sint (x : cc_sint) = x : MLRep.Int.Signed.int fun unwrap_uint (x : cc_uint) = x : MLRep.Int.Unsigned.word fun unwrap_slong (x : cc_slong) = x : MLRep.Long.Signed.int fun unwrap_ulong (x : cc_ulong) = x : MLRep.Long.Unsigned.word fun unwrap_slonglong (x : cc_slonglong) = x : MLRep.LongLong.Signed.int fun unwrap_ulonglong (x : cc_ulonglong) = x : MLRep.LongLong.Unsigned.word fun unwrap_float (x : cc_float) = x : MLRep.Float.real fun unwrap_double (x : cc_double) = x : MLRep.Double.real fun p2i (x : addr) : MLRep.Long.Unsigned.word = C_ULong.fromLarge (Word.toLarge (Ptr.diff (x, null))) fun i2p (x : MLRep.Long.Unsigned.word) : addr = Ptr.add (null, Word.fromLarge (C_ULong.toLarge x)) end mlton-20100608/lib/mlnlffi-lib/memory/memalloc-unix.sml0000644000076600000240000000255611404435637021336 0ustar mtfstaff(* memalloc-unix.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* memalloc-a4-unix.sml * * Memory allocation (via malloc) for Unix. * Size of address: 4 bytes. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) structure CMemAlloc : CMEMALLOC = struct exception OutOfMemory structure Ptr = MLton.Pointer type addr = Ptr.t type addr' = addr (* structure DL = DynLinkage fun main's s = DL.lib_symbol (DL.main_lib, s) val malloc_h = main's "malloc" val free_h = main's "free" fun sys_malloc (n : C_Size.word) = let val w_p = _import * : MLton.Pointer.t -> C_Size.word -> addr; val a = w_p (DL.addr malloc_h) n in if a = Ptr.null then raise OutOfMemory else a end fun sys_free (a : addr) = let val p_u = _import * : MLton.Pointer.t -> addr -> unit; in p_u (DL.addr free_h) a end *) fun sys_malloc (n : C_Size.word) = let val w_p = _import "malloc" : C_Size.word -> addr; val a = w_p n in if a = Ptr.null then raise OutOfMemory else a end fun sys_free (a : addr) = let val p_u = _import "free" : addr -> unit; in p_u a end fun alloc bytes = sys_malloc (C_Size.fromLarge (Word.toLarge bytes)) fun free a = sys_free a end mlton-20100608/lib/mlnlffi-lib/memory/memalloc.sig0000644000076600000240000000073611404435637020342 0ustar mtfstaff(* memalloc.sig * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* memalloc.sig * * Primitives for "raw" memory allocation. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) signature CMEMALLOC = sig exception OutOfMemory eqtype addr' (* to avoid clash with addr from CMEMACCESS *) val alloc : word -> addr' (* may raise OutOfMemory *) val free : addr' -> unit end mlton-20100608/lib/mlnlffi-lib/memory/memory.mlb0000644000076600000240000000004111404435637020036 0ustar mtfstaffplatform/memory.$(TARGET_OS).mlb mlton-20100608/lib/mlnlffi-lib/memory/memory.sig0000644000076600000240000000054311404435637020055 0ustar mtfstaff(* memory.sig * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* memory.sig * * Primitives for "raw" memory access and allocation. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) signature CMEMORY = sig include CMEMACCESS include CMEMALLOC where type addr' = addr end mlton-20100608/lib/mlnlffi-lib/memory/memory.sml0000644000076600000240000000052211404435637020063 0ustar mtfstaff(* memory.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* memory.sml * * Primitives for "raw" memory access and allocation. * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) structure CMemory : CMEMORY = struct open CMemAccess open CMemAlloc end mlton-20100608/lib/mlnlffi-lib/memory/memory.unix.mlb0000644000076600000240000000134011404435637021023 0ustar mtfstafflocal $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/mlton.mlb $(SML_LIB)/basis/c-types.mlb in ann "forceUsed" "sequenceNonUnit warn" "warnUnused true" in local linkage.sig ann "allowFFI true" in platform/rtld-flags.$(TARGET_OS).sml linkage-libdl.sml end bitop-fn.sml mlrep.sml memaccess.sig memaccess.sml memalloc.sig ann "allowFFI true" in memalloc-unix.sml end memory.sig memory.sml in signature CMEMORY structure CMemory signature DYN_LINKAGE structure DynLinkage structure MLRep end end end mlton-20100608/lib/mlnlffi-lib/memory/mlrep.sml0000644000076600000240000000411311404435637017672 0ustar mtfstaff(* mlrep.sml * 2007 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. Make use of $(SML_LIB)/basis/c-types.mlb * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* mlrep-i32f64.sml * * User-visible ML-side representation of certain primitive C types. * x86/Sparc/PPC version (all ints: 32 bit, all floats: 64 bit) * * Copyright (c) 2004 by The Fellowship of SML/NJ * * Author: Matthias Blume (blume@tti-c.org) *) structure MLRep = struct structure Char = struct structure Signed = C_SChar structure Unsigned = C_UChar (* word-style bit-operations on integers... *) structure SignedBitops = IntBitOps(structure I = Signed structure W = Unsigned) end structure Short = struct structure Signed = C_SShort structure Unsigned = C_UShort (* word-style bit-operations on integers... *) structure SignedBitops = IntBitOps(structure I = Signed structure W = Unsigned) end structure Int = struct structure Signed = C_SInt structure Unsigned = C_UInt (* word-style bit-operations on integers... *) structure SignedBitops = IntBitOps(structure I = Signed structure W = Unsigned) end structure Long = struct structure Signed = C_SLong structure Unsigned = C_ULong (* word-style bit-operations on integers... *) structure SignedBitops = IntBitOps(structure I = Signed structure W = Unsigned) end structure LongLong = struct structure Signed = C_SLongLong structure Unsigned = C_ULongLong (* word-style bit-operations on integers... *) structure SignedBitops = IntBitOps(structure I = Signed structure W = Unsigned) end structure Float = C_Float structure Double = C_Double end mlton-20100608/lib/mlnlffi-lib/memory/platform/0000755000076600000240000000000011404470406017654 5ustar mtfstaffmlton-20100608/lib/mlnlffi-lib/memory/platform/.ignore0000644000076600000240000000002111404435637021140 0ustar mtfstaffrtld-flags.*.sml mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.aix.mlb0000644000076600000240000000002311404435637022442 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.cygwin.mlb0000644000076600000240000000002311404435637023161 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.darwin.mlb0000644000076600000240000000002311404435637023145 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.freebsd.mlb0000644000076600000240000000002311404435637023273 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.hpux.mlb0000644000076600000240000000002311404435637022645 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.hurd.mlb0000644000076600000240000000002311404435637022623 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.linux.mlb0000644000076600000240000000002311404435636023017 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.mingw.mlb0000644000076600000240000000002311404435637023002 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.netbsd.mlb0000644000076600000240000000002311404435636023137 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.openbsd.mlb0000644000076600000240000000002311404435637023313 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/memory/platform/memory.solaris.mlb0000644000076600000240000000002311404435637023335 0ustar mtfstaff../memory.unix.mlb mlton-20100608/lib/mlnlffi-lib/mlnlffi-lib.mlb0000644000076600000240000000000611404435637017412 0ustar mtfstaffc.mlb mlton-20100608/lib/mlnlffi-lib/README0000644000076600000240000000115411404435637015410 0ustar mtfstaffThis is the ML-NLFFI Library, the core of a new foreign-function interface for SML/NJ. Library $c/c.cm provides: - an encoding of the C type system in ML - dynamic linking (an interface to dlopen/dlsym) - ML/C string conversion routines This is the (only) library to be used by user code. Library $c/c-int.cm (subdirectory "internals"): - implements all of $c/c.cm - implements low-level hooks to be used by ml-nlffigen-generated code Library $c/memory.cm (subdirectory "memory"): - encapsulates low-level details related to raw memory access User code should NOT directly refer to this library. mlton-20100608/lib/mlnlffi-lib/README.mlton0000644000076600000240000000035411404435637016541 0ustar mtfstaffML-NLFFI is a no-longer-foreign-function interface library for SML. This directory has an initial port of ML-NLFFI from SML/NJ to MLton. All of the ML-NLFFI functionality is present. See http://www.mlton.org/MLNLFFI for more details. mlton-20100608/lib/mlnlffi-lib/zstring.sig0000644000076600000240000000174111404435637016736 0ustar mtfstaff(* zstring.sig * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * Functions for translating between 0-terminated C strings and native * ML strings. * * (C) 2001, Lucent Technologies, Bell Laboratories * * author: Matthias Blume (blume@research.bell-labs.com) *) signature ZSTRING = sig type 'c zstring = (C.uchar, 'c) C.obj C.ptr type 'c zstring' = (C.uchar, 'c) C.obj C.ptr' (* the C strlen function *) val length : 'c zstring -> int val length' : 'c zstring' -> int (* make ML string from 0-terminated C string *) val toML : 'c zstring -> string val toML' : 'c zstring' -> string (* Copy contents of ML string into C string and add terminating 0. *) val cpML : { from: string, to: C.rw zstring } -> unit val cpML' : { from: string, to: C.rw zstring' } -> unit (* Make C-duplicate of ML string (allocate memory and then copy). *) val dupML : string -> 'c zstring val dupML' : string -> 'c zstring' end mlton-20100608/lib/mlrisc-lib/0000755000076600000240000000000011404470406014362 5ustar mtfstaffmlton-20100608/lib/mlrisc-lib/.ignore0000644000076600000240000000000711404435641015645 0ustar mtfstaffMLRISC mlton-20100608/lib/mlrisc-lib/Makefile0000644000076600000240000000127311404435641016027 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: MLRISC/README.mlton MLRISC/README.mlton: MLRISC.tgz MLRISC.patch rm -rf MLRISC gzip -dc MLRISC.tgz | tar xf - chmod -R a+r MLRISC chmod -R g-s MLRISC patch -s -d MLRISC -p1 < MLRISC.patch .PHONY: clean clean: ../../bin/clean .PHONY: patch patch: mv MLRISC MLRISC-mlton gzip -dc MLRISC.tgz | tar xf - diff -Naur MLRISC MLRISC-mlton >MLRISC.patch || exit 0 rm -rf MLRISC mv MLRISC-mlton MLRISC mlton-20100608/lib/mlrisc-lib/MLRISC.patch0000644000076600000240000523717411404435641016421 0ustar mtfstaffdiff -N -C 2 -r MLRISC/Doc/html/mltex2html MLRISC-mlton/Doc/html/mltex2html *** MLRISC/Doc/html/mltex2html 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/Doc/html/mltex2html 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,3 **** ! #!/usr/local/bin/perl # # This tool generates HTML pages in my own format given a stylized Latex file. --- 1,3 ---- ! #!/usr/bin/perl # # This tool generates HTML pages in my own format given a stylized Latex file. diff -N -C 2 -r MLRISC/README.mlton MLRISC-mlton/README.mlton *** MLRISC/README.mlton 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/README.mlton 2010-04-02 15:25:14.000000000 -0400 *************** *** 0 **** --- 1,8 ---- + The following changes were made to the MLRISC Library, in addition to + deriving the {{{.mlb}}} file from the {{{.cm}}} files: + * eliminate or-patterns: Duplicate the whole match ({{{p => e}}}) at each of the patterns. + * eliminate vector constants: Change {{{#[}}} to {{{Vector.fromList [}}}. + * eliminate {{{withtype}}} in signatures. + * eliminate sequential {{{withtype}}} expansions: Most could be rewritten as a sequence of type definitions and datatype definitions. + * eliminate higher-order functors: Every higher-order functor definition and application could be uncurried in the obvious way. + * eliminate {{{where = }}}: Quite painful to expand out all the flexible types in the respective structures. Furthermore, many of the implied type equalities aren't needed, but it's too hard to pick out the right ones. diff -N -C 2 -r MLRISC/Tools/Parser/mdl.grm.desc MLRISC-mlton/Tools/Parser/mdl.grm.desc *** MLRISC/Tools/Parser/mdl.grm.desc 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/Tools/Parser/mdl.grm.desc 2009-10-02 09:51:35.000000000 -0400 *************** *** 0 **** --- 1,28165 ---- + 31 shift/reduce conflicts + 5 rules not reduced + + warning: rule will never be reduced + warning: rule will never be reduced + warning: rule will never be reduced + warning: rule will never be reduced + warning: rule will never be reduced + error: state 126: shift/reduce conflict (shift SYMBOL, reduce by rule 311) + error: state 126: shift/reduce conflict (shift ID, reduce by rule 311) + error: state 126: shift/reduce conflict (shift CELLSET, reduce by rule 311) + error: state 126: shift/reduce conflict (shift NOT, reduce by rule 311) + error: state 126: shift/reduce conflict (shift DEREF, reduce by rule 311) + error: state 126: shift/reduce conflict (shift TIMES, reduce by rule 311) + error: state 262: shift/reduce conflict (shift SYMBOL, reduce by rule 373) + error: state 262: shift/reduce conflict (shift ID, reduce by rule 373) + error: state 262: shift/reduce conflict (shift INSTRUCTION, reduce by rule 373) + error: state 262: shift/reduce conflict (shift CELLSET, reduce by rule 373) + error: state 282: shift/reduce conflict (shift INT, reduce by rule 274) + error: state 282: shift/reduce conflict (shift WORD, reduce by rule 274) + error: state 282: shift/reduce conflict (shift SYMBOL, reduce by rule 274) + error: state 282: shift/reduce conflict (shift ID, reduce by rule 274) + error: state 282: shift/reduce conflict (shift CELLSET, reduce by rule 274) + error: state 282: shift/reduce conflict (shift LPAREN, reduce by rule 274) + error: state 412: shift/reduce conflict (shift BAR, reduce by rule 341) + error: state 428: shift/reduce conflict (shift RPAREN, reduce by rule 417) + error: state 493: shift/reduce conflict (shift SYMBOL, reduce by rule 379) + error: state 493: shift/reduce conflict (shift ID, reduce by rule 379) + error: state 493: shift/reduce conflict (shift INSTRUCTION, reduce by rule 379) + error: state 493: shift/reduce conflict (shift CELLSET, reduce by rule 379) + error: state 516: shift/reduce conflict (shift LDQUOTE, reduce by rule 186) + error: state 653: shift/reduce conflict (shift CONCAT, reduce by rule 50) + error: state 653: shift/reduce conflict (shift TIMES, reduce by rule 50) + error: state 661: shift/reduce conflict (shift AND, reduce by rule 165) + error: state 690: shift/reduce conflict (shift AND, reduce by rule 165) + error: state 704: shift/reduce conflict (shift AND, reduce by rule 165) + error: state 705: shift/reduce conflict (shift AND, reduce by rule 165) + error: state 712: shift/reduce conflict (shift LATENCY, reduce by rule 146) + error: state 725: shift/reduce conflict (shift PIPELINE, reduce by rule 148) + + state 0: + + architecture : . decls + + ARCHITECTURE shift 39 + LOCAL shift 38 + DATATYPE shift 37 + TYPE shift 36 + STORAGE shift 35 + LOCATIONS shift 34 + STRUCTURE shift 33 + FUNCTOR shift 32 + SIGNATURE shift 31 + SHARING shift 30 + INSTRUCTION shift 29 + VLIW shift 28 + SUPERSCALAR shift 27 + FUN shift 26 + VAL shift 25 + INCLUDE shift 24 + OPEN shift 23 + LITTLE shift 22 + BIG shift 21 + PIPELINE shift 20 + LOWERCASE shift 19 + UPPERCASE shift 18 + VERBATIM shift 17 + RTL shift 16 + NONFIX shift 15 + INFIX shift 14 + INFIXR shift 13 + DEBUG shift 12 + RESOURCE shift 11 + CPU shift 10 + LATENCY shift 9 + EXCEPTION shift 8 + EOF reduce by rule 1 + + architecture goto 756 + decls goto 7 + decl goto 6 + mldecl goto 5 + mymldecl goto 4 + mddecl goto 3 + mymddecl goto 2 + assemblycase goto 1 + + . error + + + state 1: + + mymddecl : assemblycase . ASSEMBLY + + ASSEMBLY shift 40 + + + . error + + + state 2: + + mddecl : mymddecl . (reduce by rule 11) + + ARCHITECTURE reduce by rule 11 + END reduce by rule 11 + LOCAL reduce by rule 11 + IN reduce by rule 11 + DATATYPE reduce by rule 11 + TYPE reduce by rule 11 + RPAREN reduce by rule 11 + SEMICOLON reduce by rule 11 + STORAGE reduce by rule 11 + LOCATIONS reduce by rule 11 + STRUCTURE reduce by rule 11 + FUNCTOR reduce by rule 11 + SIGNATURE reduce by rule 11 + SHARING reduce by rule 11 + INSTRUCTION reduce by rule 11 + VLIW reduce by rule 11 + SUPERSCALAR reduce by rule 11 + FUN reduce by rule 11 + VAL reduce by rule 11 + INCLUDE reduce by rule 11 + OPEN reduce by rule 11 + LITTLE reduce by rule 11 + BIG reduce by rule 11 + PIPELINE reduce by rule 11 + LOWERCASE reduce by rule 11 + UPPERCASE reduce by rule 11 + VERBATIM reduce by rule 11 + RTL reduce by rule 11 + NONFIX reduce by rule 11 + INFIX reduce by rule 11 + INFIXR reduce by rule 11 + DEBUG reduce by rule 11 + RESOURCE reduce by rule 11 + CPU reduce by rule 11 + LATENCY reduce by rule 11 + EXCEPTION reduce by rule 11 + EOF reduce by rule 11 + + + . error + + + state 3: + + decl : mddecl . optsemi + + ARCHITECTURE reduce by rule 5 + END reduce by rule 5 + LOCAL reduce by rule 5 + IN reduce by rule 5 + DATATYPE reduce by rule 5 + TYPE reduce by rule 5 + RPAREN reduce by rule 5 + SEMICOLON shift 42 + STORAGE reduce by rule 5 + LOCATIONS reduce by rule 5 + STRUCTURE reduce by rule 5 + FUNCTOR reduce by rule 5 + SIGNATURE reduce by rule 5 + SHARING reduce by rule 5 + INSTRUCTION reduce by rule 5 + VLIW reduce by rule 5 + SUPERSCALAR reduce by rule 5 + FUN reduce by rule 5 + VAL reduce by rule 5 + INCLUDE reduce by rule 5 + OPEN reduce by rule 5 + LITTLE reduce by rule 5 + BIG reduce by rule 5 + PIPELINE reduce by rule 5 + LOWERCASE reduce by rule 5 + UPPERCASE reduce by rule 5 + VERBATIM reduce by rule 5 + RTL reduce by rule 5 + NONFIX reduce by rule 5 + INFIX reduce by rule 5 + INFIXR reduce by rule 5 + DEBUG reduce by rule 5 + RESOURCE reduce by rule 5 + CPU reduce by rule 5 + LATENCY reduce by rule 5 + EXCEPTION reduce by rule 5 + EOF reduce by rule 5 + + optsemi goto 41 + + . error + + + state 4: + + mldecl : mymldecl . (reduce by rule 10) + + ARCHITECTURE reduce by rule 10 + END reduce by rule 10 + LOCAL reduce by rule 10 + IN reduce by rule 10 + DATATYPE reduce by rule 10 + TYPE reduce by rule 10 + RPAREN reduce by rule 10 + SEMICOLON reduce by rule 10 + STORAGE reduce by rule 10 + LOCATIONS reduce by rule 10 + STRUCTURE reduce by rule 10 + FUNCTOR reduce by rule 10 + SIGNATURE reduce by rule 10 + SHARING reduce by rule 10 + INSTRUCTION reduce by rule 10 + VLIW reduce by rule 10 + SUPERSCALAR reduce by rule 10 + FUN reduce by rule 10 + VAL reduce by rule 10 + INCLUDE reduce by rule 10 + OPEN reduce by rule 10 + LITTLE reduce by rule 10 + BIG reduce by rule 10 + PIPELINE reduce by rule 10 + LOWERCASE reduce by rule 10 + UPPERCASE reduce by rule 10 + VERBATIM reduce by rule 10 + RTL reduce by rule 10 + NONFIX reduce by rule 10 + INFIX reduce by rule 10 + INFIXR reduce by rule 10 + DEBUG reduce by rule 10 + RESOURCE reduce by rule 10 + CPU reduce by rule 10 + LATENCY reduce by rule 10 + EXCEPTION reduce by rule 10 + EOF reduce by rule 10 + + + . error + + + state 5: + + decl : mldecl . optsemi + + ARCHITECTURE reduce by rule 5 + END reduce by rule 5 + LOCAL reduce by rule 5 + IN reduce by rule 5 + DATATYPE reduce by rule 5 + TYPE reduce by rule 5 + RPAREN reduce by rule 5 + SEMICOLON shift 42 + STORAGE reduce by rule 5 + LOCATIONS reduce by rule 5 + STRUCTURE reduce by rule 5 + FUNCTOR reduce by rule 5 + SIGNATURE reduce by rule 5 + SHARING reduce by rule 5 + INSTRUCTION reduce by rule 5 + VLIW reduce by rule 5 + SUPERSCALAR reduce by rule 5 + FUN reduce by rule 5 + VAL reduce by rule 5 + INCLUDE reduce by rule 5 + OPEN reduce by rule 5 + LITTLE reduce by rule 5 + BIG reduce by rule 5 + PIPELINE reduce by rule 5 + LOWERCASE reduce by rule 5 + UPPERCASE reduce by rule 5 + VERBATIM reduce by rule 5 + RTL reduce by rule 5 + NONFIX reduce by rule 5 + INFIX reduce by rule 5 + INFIXR reduce by rule 5 + DEBUG reduce by rule 5 + RESOURCE reduce by rule 5 + CPU reduce by rule 5 + LATENCY reduce by rule 5 + EXCEPTION reduce by rule 5 + EOF reduce by rule 5 + + optsemi goto 43 + + . error + + + state 6: + + decls : decl . decls + + ARCHITECTURE shift 39 + END reduce by rule 1 + LOCAL shift 38 + IN reduce by rule 1 + DATATYPE shift 37 + TYPE shift 36 + RPAREN reduce by rule 1 + STORAGE shift 35 + LOCATIONS shift 34 + STRUCTURE shift 33 + FUNCTOR shift 32 + SIGNATURE shift 31 + SHARING shift 30 + INSTRUCTION shift 29 + VLIW shift 28 + SUPERSCALAR shift 27 + FUN shift 26 + VAL shift 25 + INCLUDE shift 24 + OPEN shift 23 + LITTLE shift 22 + BIG shift 21 + PIPELINE shift 20 + LOWERCASE shift 19 + UPPERCASE shift 18 + VERBATIM shift 17 + RTL shift 16 + NONFIX shift 15 + INFIX shift 14 + INFIXR shift 13 + DEBUG shift 12 + RESOURCE shift 11 + CPU shift 10 + LATENCY shift 9 + EXCEPTION shift 8 + EOF reduce by rule 1 + + decls goto 44 + decl goto 6 + mldecl goto 5 + mymldecl goto 4 + mddecl goto 3 + mymddecl goto 2 + assemblycase goto 1 + + . error + + + state 7: + + architecture : decls . (reduce by rule 0) + + EOF reduce by rule 0 + + + . error + + + state 8: + + mymldecl : EXCEPTION . exceptionbinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 47 + exceptionbind goto 46 + exceptionbinds goto 45 + + . error + + + state 9: + + mymddecl : LATENCY . latencybinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 55 + latencybinds goto 54 + latencybind goto 53 + latencyclauses goto 52 + latencyclause goto 51 + + . error + + + state 10: + + mymddecl : CPU . cpubinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 58 + cpubinds goto 57 + cpubind goto 56 + + . error + + + state 11: + + mymddecl : RESOURCE . resourcebinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 60 + resourcebinds goto 59 + + . error + + + state 12: + + mymddecl : DEBUG . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 61 + + . error + + + state 13: + + mymldecl : INFIXR . intopt syms + + TIMES reduce by rule 397 + DEREF reduce by rule 397 + NOT reduce by rule 397 + CELLSET reduce by rule 397 + ID reduce by rule 397 + SYMBOL reduce by rule 397 + INT shift 64 + + int goto 63 + intopt goto 62 + + . error + + + state 14: + + mymldecl : INFIX . intopt syms + + TIMES reduce by rule 397 + DEREF reduce by rule 397 + NOT reduce by rule 397 + CELLSET reduce by rule 397 + ID reduce by rule 397 + SYMBOL reduce by rule 397 + INT shift 64 + + int goto 63 + intopt goto 65 + + . error + + + state 15: + + mymldecl : NONFIX . syms + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 68 + symb goto 67 + syms goto 66 + + . error + + + state 16: + + mymldecl : RTL . id LBRACE labpats0 RBRACE EQ exp + mymldecl : RTL . asapat EQ exp + mymldecl : RTL . syms COLON ty + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 89 + sym goto 88 + symb goto 67 + ident2 goto 87 + syms goto 86 + path goto 85 + apat goto 84 + asapat goto 83 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 17: + + assemblycase : VERBATIM . (reduce by rule 115) + + ASSEMBLY reduce by rule 115 + + + . error + + + state 18: + + assemblycase : UPPERCASE . (reduce by rule 114) + + ASSEMBLY reduce by rule 114 + + + . error + + + state 19: + + assemblycase : LOWERCASE . (reduce by rule 113) + + ASSEMBLY reduce by rule 113 + + + . error + + + state 20: + + mymddecl : PIPELINE . pipelinebinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 108 + pipelinebinds goto 107 + pipelinebind goto 106 + pipelineclauses goto 105 + pipelineclause goto 104 + + . error + + + state 21: + + mymddecl : BIG . ENDIAN + + ENDIAN shift 109 + + + . error + + + state 22: + + mymddecl : LITTLE . ENDIAN + + ENDIAN shift 110 + + + . error + + + state 23: + + mymldecl : OPEN . idents + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 113 + ident2 goto 112 + idents goto 111 + path goto 85 + + . error + + + state 24: + + decl : INCLUDE . string optsemi + mymldecl : INCLUDE . sigexp + + CELLSET shift 50 + SIG shift 118 + ID shift 49 + SYMBOL shift 48 + STRING shift 91 + + id goto 114 + ident goto 117 + ident2 goto 112 + path goto 85 + string goto 116 + sigexp goto 115 + + . error + + + state 25: + + mymldecl : VAL . valbinds + mymldecl : VAL . syms COLON ty + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 126 + symb goto 67 + ident2 goto 87 + syms goto 125 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 121 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + valbind goto 120 + valbinds goto 119 + True goto 74 + False goto 73 + + . error + + + state 26: + + mymldecl : FUN . funbinds + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 133 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + funclause goto 132 + funclauses goto 131 + funbind goto 130 + funbinds goto 129 + True goto 74 + False goto 73 + + . error + + + state 27: + + mymddecl : SUPERSCALAR . (reduce by rule 16) + + ARCHITECTURE reduce by rule 16 + END reduce by rule 16 + LOCAL reduce by rule 16 + IN reduce by rule 16 + DATATYPE reduce by rule 16 + TYPE reduce by rule 16 + RPAREN reduce by rule 16 + SEMICOLON reduce by rule 16 + STORAGE reduce by rule 16 + LOCATIONS reduce by rule 16 + STRUCTURE reduce by rule 16 + FUNCTOR reduce by rule 16 + SIGNATURE reduce by rule 16 + SHARING reduce by rule 16 + INSTRUCTION reduce by rule 16 + VLIW reduce by rule 16 + SUPERSCALAR reduce by rule 16 + FUN reduce by rule 16 + VAL reduce by rule 16 + INCLUDE reduce by rule 16 + OPEN reduce by rule 16 + LITTLE reduce by rule 16 + BIG reduce by rule 16 + PIPELINE reduce by rule 16 + LOWERCASE reduce by rule 16 + UPPERCASE reduce by rule 16 + VERBATIM reduce by rule 16 + RTL reduce by rule 16 + NONFIX reduce by rule 16 + INFIX reduce by rule 16 + INFIXR reduce by rule 16 + DEBUG reduce by rule 16 + RESOURCE reduce by rule 16 + CPU reduce by rule 16 + LATENCY reduce by rule 16 + EXCEPTION reduce by rule 16 + EOF reduce by rule 16 + + + . error + + + state 28: + + mymddecl : VLIW . (reduce by rule 15) + + ARCHITECTURE reduce by rule 15 + END reduce by rule 15 + LOCAL reduce by rule 15 + IN reduce by rule 15 + DATATYPE reduce by rule 15 + TYPE reduce by rule 15 + RPAREN reduce by rule 15 + SEMICOLON reduce by rule 15 + STORAGE reduce by rule 15 + LOCATIONS reduce by rule 15 + STRUCTURE reduce by rule 15 + FUNCTOR reduce by rule 15 + SIGNATURE reduce by rule 15 + SHARING reduce by rule 15 + INSTRUCTION reduce by rule 15 + VLIW reduce by rule 15 + SUPERSCALAR reduce by rule 15 + FUN reduce by rule 15 + VAL reduce by rule 15 + INCLUDE reduce by rule 15 + OPEN reduce by rule 15 + LITTLE reduce by rule 15 + BIG reduce by rule 15 + PIPELINE reduce by rule 15 + LOWERCASE reduce by rule 15 + UPPERCASE reduce by rule 15 + VERBATIM reduce by rule 15 + RTL reduce by rule 15 + NONFIX reduce by rule 15 + INFIX reduce by rule 15 + INFIXR reduce by rule 15 + DEBUG reduce by rule 15 + RESOURCE reduce by rule 15 + CPU reduce by rule 15 + LATENCY reduce by rule 15 + EXCEPTION reduce by rule 15 + EOF reduce by rule 15 + + + . error + + + state 29: + + mymddecl : INSTRUCTION . FORMATS int BITS formatbinds + mymddecl : INSTRUCTION . FORMATS formatbinds + mymddecl : INSTRUCTION . consbinds + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + FORMATS shift 139 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 138 + symb goto 67 + consbinds goto 137 + consbind goto 136 + + . error + + + state 30: + + mymldecl : SHARING . sharingdecls + + TYPE shift 144 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 143 + ident2 goto 112 + path goto 85 + sharingdecl goto 142 + sharingdecls goto 141 + sharelist goto 140 + + . error + + + state 31: + + mymldecl : SIGNATURE . id EQ sigexp + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 145 + + . error + + + state 32: + + mymldecl : FUNCTOR . id LPAREN functorarg RPAREN EQ structexp + mymldecl : FUNCTOR . id LPAREN functorarg RPAREN sigcon EQ structexp + mymldecl : FUNCTOR . id EQ structexp + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 146 + + . error + + + state 33: + + mymldecl : STRUCTURE . id EQ structexp + mymldecl : STRUCTURE . id sigcon EQ structexp + mymldecl : STRUCTURE . id COLON sigexp + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 147 + + . error + + + state 34: + + mymddecl : LOCATIONS . locbinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 150 + locbind goto 149 + locbinds goto 148 + + . error + + + state 35: + + mymddecl : STORAGE . storagedecls + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 153 + storagedecl goto 152 + storagedecls goto 151 + + . error + + + state 36: + + mymldecl : TYPE . typebinds + mymldecl : TYPE . tyvarseq tid + + LPAREN shift 160 + CELLSET reduce by rule 199 + HASH shift 159 + BITS reduce by rule 199 + INSTRUCTION reduce by rule 199 + CELL reduce by rule 199 + ID reduce by rule 199 + SYMBOL reduce by rule 199 + TYVAR shift 158 + + typebinds goto 157 + typebind goto 156 + tyvar goto 155 + tyvarseq goto 154 + + . error + + + state 37: + + mymldecl : DATATYPE . datatypebinds withtypeclause + + LPAREN shift 160 + CELLSET reduce by rule 199 + HASH shift 159 + ID reduce by rule 199 + SYMBOL reduce by rule 199 + TYVAR shift 158 + + datatypebinds goto 163 + datatypebind goto 162 + tyvar goto 155 + tyvarseq goto 161 + + . error + + + state 38: + + mymldecl : LOCAL . scopeddecls IN scopeddecls END + + ARCHITECTURE reduce by rule 107 + LOCAL reduce by rule 107 + IN reduce by rule 107 + DATATYPE reduce by rule 107 + TYPE reduce by rule 107 + STORAGE reduce by rule 107 + LOCATIONS reduce by rule 107 + STRUCTURE reduce by rule 107 + FUNCTOR reduce by rule 107 + SIGNATURE reduce by rule 107 + SHARING reduce by rule 107 + INSTRUCTION reduce by rule 107 + VLIW reduce by rule 107 + SUPERSCALAR reduce by rule 107 + FUN reduce by rule 107 + VAL reduce by rule 107 + INCLUDE reduce by rule 107 + OPEN reduce by rule 107 + LITTLE reduce by rule 107 + BIG reduce by rule 107 + PIPELINE reduce by rule 107 + LOWERCASE reduce by rule 107 + UPPERCASE reduce by rule 107 + VERBATIM reduce by rule 107 + RTL reduce by rule 107 + NONFIX reduce by rule 107 + INFIX reduce by rule 107 + INFIXR reduce by rule 107 + DEBUG reduce by rule 107 + RESOURCE reduce by rule 107 + CPU reduce by rule 107 + LATENCY reduce by rule 107 + EXCEPTION reduce by rule 107 + + scopeddecls goto 165 + newScope goto 164 + + . error + + + state 39: + + mymddecl : ARCHITECTURE . id EQ STRUCT decls END + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 166 + + . error + + + state 40: + + mymddecl : assemblycase ASSEMBLY . (reduce by rule 17) + + ARCHITECTURE reduce by rule 17 + END reduce by rule 17 + LOCAL reduce by rule 17 + IN reduce by rule 17 + DATATYPE reduce by rule 17 + TYPE reduce by rule 17 + RPAREN reduce by rule 17 + SEMICOLON reduce by rule 17 + STORAGE reduce by rule 17 + LOCATIONS reduce by rule 17 + STRUCTURE reduce by rule 17 + FUNCTOR reduce by rule 17 + SIGNATURE reduce by rule 17 + SHARING reduce by rule 17 + INSTRUCTION reduce by rule 17 + VLIW reduce by rule 17 + SUPERSCALAR reduce by rule 17 + FUN reduce by rule 17 + VAL reduce by rule 17 + INCLUDE reduce by rule 17 + OPEN reduce by rule 17 + LITTLE reduce by rule 17 + BIG reduce by rule 17 + PIPELINE reduce by rule 17 + LOWERCASE reduce by rule 17 + UPPERCASE reduce by rule 17 + VERBATIM reduce by rule 17 + RTL reduce by rule 17 + NONFIX reduce by rule 17 + INFIX reduce by rule 17 + INFIXR reduce by rule 17 + DEBUG reduce by rule 17 + RESOURCE reduce by rule 17 + CPU reduce by rule 17 + LATENCY reduce by rule 17 + EXCEPTION reduce by rule 17 + EOF reduce by rule 17 + + + . error + + + state 41: + + decl : mddecl optsemi . (reduce by rule 8) + + ARCHITECTURE reduce by rule 8 + END reduce by rule 8 + LOCAL reduce by rule 8 + IN reduce by rule 8 + DATATYPE reduce by rule 8 + TYPE reduce by rule 8 + RPAREN reduce by rule 8 + STORAGE reduce by rule 8 + LOCATIONS reduce by rule 8 + STRUCTURE reduce by rule 8 + FUNCTOR reduce by rule 8 + SIGNATURE reduce by rule 8 + SHARING reduce by rule 8 + INSTRUCTION reduce by rule 8 + VLIW reduce by rule 8 + SUPERSCALAR reduce by rule 8 + FUN reduce by rule 8 + VAL reduce by rule 8 + INCLUDE reduce by rule 8 + OPEN reduce by rule 8 + LITTLE reduce by rule 8 + BIG reduce by rule 8 + PIPELINE reduce by rule 8 + LOWERCASE reduce by rule 8 + UPPERCASE reduce by rule 8 + VERBATIM reduce by rule 8 + RTL reduce by rule 8 + NONFIX reduce by rule 8 + INFIX reduce by rule 8 + INFIXR reduce by rule 8 + DEBUG reduce by rule 8 + RESOURCE reduce by rule 8 + CPU reduce by rule 8 + LATENCY reduce by rule 8 + EXCEPTION reduce by rule 8 + EOF reduce by rule 8 + + + . error + + + state 42: + + optsemi : SEMICOLON . optsemi + + ARCHITECTURE reduce by rule 5 + END reduce by rule 5 + LOCAL reduce by rule 5 + IN reduce by rule 5 + DATATYPE reduce by rule 5 + TYPE reduce by rule 5 + RPAREN reduce by rule 5 + SEMICOLON shift 42 + STORAGE reduce by rule 5 + LOCATIONS reduce by rule 5 + STRUCTURE reduce by rule 5 + FUNCTOR reduce by rule 5 + SIGNATURE reduce by rule 5 + SHARING reduce by rule 5 + INSTRUCTION reduce by rule 5 + VLIW reduce by rule 5 + SUPERSCALAR reduce by rule 5 + FUN reduce by rule 5 + VAL reduce by rule 5 + INCLUDE reduce by rule 5 + OPEN reduce by rule 5 + LITTLE reduce by rule 5 + BIG reduce by rule 5 + PIPELINE reduce by rule 5 + LOWERCASE reduce by rule 5 + UPPERCASE reduce by rule 5 + VERBATIM reduce by rule 5 + RTL reduce by rule 5 + NONFIX reduce by rule 5 + INFIX reduce by rule 5 + INFIXR reduce by rule 5 + DEBUG reduce by rule 5 + RESOURCE reduce by rule 5 + CPU reduce by rule 5 + LATENCY reduce by rule 5 + EXCEPTION reduce by rule 5 + EOF reduce by rule 5 + + optsemi goto 167 + + . error + + + state 43: + + decl : mldecl optsemi . (reduce by rule 7) + + ARCHITECTURE reduce by rule 7 + END reduce by rule 7 + LOCAL reduce by rule 7 + IN reduce by rule 7 + DATATYPE reduce by rule 7 + TYPE reduce by rule 7 + RPAREN reduce by rule 7 + STORAGE reduce by rule 7 + LOCATIONS reduce by rule 7 + STRUCTURE reduce by rule 7 + FUNCTOR reduce by rule 7 + SIGNATURE reduce by rule 7 + SHARING reduce by rule 7 + INSTRUCTION reduce by rule 7 + VLIW reduce by rule 7 + SUPERSCALAR reduce by rule 7 + FUN reduce by rule 7 + VAL reduce by rule 7 + INCLUDE reduce by rule 7 + OPEN reduce by rule 7 + LITTLE reduce by rule 7 + BIG reduce by rule 7 + PIPELINE reduce by rule 7 + LOWERCASE reduce by rule 7 + UPPERCASE reduce by rule 7 + VERBATIM reduce by rule 7 + RTL reduce by rule 7 + NONFIX reduce by rule 7 + INFIX reduce by rule 7 + INFIXR reduce by rule 7 + DEBUG reduce by rule 7 + RESOURCE reduce by rule 7 + CPU reduce by rule 7 + LATENCY reduce by rule 7 + EXCEPTION reduce by rule 7 + EOF reduce by rule 7 + + + . error + + + state 44: + + decls : decl decls . (reduce by rule 2) + + END reduce by rule 2 + IN reduce by rule 2 + RPAREN reduce by rule 2 + EOF reduce by rule 2 + + + . error + + + state 45: + + mymldecl : EXCEPTION exceptionbinds . (reduce by rule 82) + + ARCHITECTURE reduce by rule 82 + END reduce by rule 82 + LOCAL reduce by rule 82 + IN reduce by rule 82 + DATATYPE reduce by rule 82 + TYPE reduce by rule 82 + RPAREN reduce by rule 82 + SEMICOLON reduce by rule 82 + STORAGE reduce by rule 82 + LOCATIONS reduce by rule 82 + STRUCTURE reduce by rule 82 + FUNCTOR reduce by rule 82 + SIGNATURE reduce by rule 82 + SHARING reduce by rule 82 + INSTRUCTION reduce by rule 82 + VLIW reduce by rule 82 + SUPERSCALAR reduce by rule 82 + FUN reduce by rule 82 + VAL reduce by rule 82 + INCLUDE reduce by rule 82 + OPEN reduce by rule 82 + LITTLE reduce by rule 82 + BIG reduce by rule 82 + PIPELINE reduce by rule 82 + LOWERCASE reduce by rule 82 + UPPERCASE reduce by rule 82 + VERBATIM reduce by rule 82 + RTL reduce by rule 82 + NONFIX reduce by rule 82 + INFIX reduce by rule 82 + INFIXR reduce by rule 82 + DEBUG reduce by rule 82 + RESOURCE reduce by rule 82 + CPU reduce by rule 82 + LATENCY reduce by rule 82 + EXCEPTION reduce by rule 82 + EOF reduce by rule 82 + + + . error + + + state 46: + + exceptionbinds : exceptionbind . (reduce by rule 83) + exceptionbinds : exceptionbind . AND exceptionbinds + + ARCHITECTURE reduce by rule 83 + END reduce by rule 83 + LOCAL reduce by rule 83 + IN reduce by rule 83 + DATATYPE reduce by rule 83 + TYPE reduce by rule 83 + AND shift 168 + RPAREN reduce by rule 83 + SEMICOLON reduce by rule 83 + STORAGE reduce by rule 83 + LOCATIONS reduce by rule 83 + STRUCTURE reduce by rule 83 + FUNCTOR reduce by rule 83 + SIGNATURE reduce by rule 83 + SHARING reduce by rule 83 + INSTRUCTION reduce by rule 83 + VLIW reduce by rule 83 + SUPERSCALAR reduce by rule 83 + FUN reduce by rule 83 + VAL reduce by rule 83 + INCLUDE reduce by rule 83 + OPEN reduce by rule 83 + LITTLE reduce by rule 83 + BIG reduce by rule 83 + PIPELINE reduce by rule 83 + LOWERCASE reduce by rule 83 + UPPERCASE reduce by rule 83 + VERBATIM reduce by rule 83 + RTL reduce by rule 83 + NONFIX reduce by rule 83 + INFIX reduce by rule 83 + INFIXR reduce by rule 83 + DEBUG reduce by rule 83 + RESOURCE reduce by rule 83 + CPU reduce by rule 83 + LATENCY reduce by rule 83 + EXCEPTION reduce by rule 83 + EOF reduce by rule 83 + + + . error + + + state 47: + + exceptionbind : id . (reduce by rule 85) + exceptionbind : id . OF ty + exceptionbind : id . EQ ident + + ARCHITECTURE reduce by rule 85 + END reduce by rule 85 + LOCAL reduce by rule 85 + IN reduce by rule 85 + OF shift 170 + DATATYPE reduce by rule 85 + TYPE reduce by rule 85 + EQ shift 169 + AND reduce by rule 85 + RPAREN reduce by rule 85 + SEMICOLON reduce by rule 85 + STORAGE reduce by rule 85 + LOCATIONS reduce by rule 85 + STRUCTURE reduce by rule 85 + FUNCTOR reduce by rule 85 + SIGNATURE reduce by rule 85 + SHARING reduce by rule 85 + INSTRUCTION reduce by rule 85 + VLIW reduce by rule 85 + SUPERSCALAR reduce by rule 85 + FUN reduce by rule 85 + VAL reduce by rule 85 + INCLUDE reduce by rule 85 + OPEN reduce by rule 85 + LITTLE reduce by rule 85 + BIG reduce by rule 85 + PIPELINE reduce by rule 85 + LOWERCASE reduce by rule 85 + UPPERCASE reduce by rule 85 + VERBATIM reduce by rule 85 + RTL reduce by rule 85 + NONFIX reduce by rule 85 + INFIX reduce by rule 85 + INFIXR reduce by rule 85 + DEBUG reduce by rule 85 + RESOURCE reduce by rule 85 + CPU reduce by rule 85 + LATENCY reduce by rule 85 + EXCEPTION reduce by rule 85 + EOF reduce by rule 85 + + + . error + + + state 48: + + id : SYMBOL . (reduce by rule 414) + + ARCHITECTURE reduce by rule 414 + END reduce by rule 414 + LOCAL reduce by rule 414 + IN reduce by rule 414 + OF reduce by rule 414 + DATATYPE reduce by rule 414 + TYPE reduce by rule 414 + EQ reduce by rule 414 + DOLLAR reduce by rule 414 + TIMES reduce by rule 414 + AND reduce by rule 414 + DEREF reduce by rule 414 + NOT reduce by rule 414 + CONCAT reduce by rule 414 + LLBRACKET reduce by rule 414 + RRBRACKET reduce by rule 414 + LHASHBRACKET reduce by rule 414 + LPAREN reduce by rule 414 + RPAREN reduce by rule 414 + LBRACKET reduce by rule 414 + RBRACKET reduce by rule 414 + LBRACE reduce by rule 414 + RBRACE reduce by rule 414 + SEMICOLON reduce by rule 414 + LDQUOTE reduce by rule 414 + RMETA reduce by rule 414 + CELLSET reduce by rule 414 + STORAGE reduce by rule 414 + LOCATIONS reduce by rule 414 + HASH reduce by rule 414 + COMMA reduce by rule 414 + COLON reduce by rule 414 + COLONGREATER reduce by rule 414 + DOT reduce by rule 414 + AT reduce by rule 414 + BAR reduce by rule 414 + ARROW reduce by rule 414 + DARROW reduce by rule 414 + BITS reduce by rule 414 + THEN reduce by rule 414 + ELSE reduce by rule 414 + TRUE reduce by rule 414 + FALSE reduce by rule 414 + WILD reduce by rule 414 + HANDLE reduce by rule 414 + LET reduce by rule 414 + STRUCTURE reduce by rule 414 + FUNCTOR reduce by rule 414 + SIGNATURE reduce by rule 414 + WHERE reduce by rule 414 + SHARING reduce by rule 414 + INSTRUCTION reduce by rule 414 + CELL reduce by rule 414 + VLIW reduce by rule 414 + SUPERSCALAR reduce by rule 414 + SIGNED reduce by rule 414 + UNSIGNED reduce by rule 414 + AS reduce by rule 414 + WITHTYPE reduce by rule 414 + FUN reduce by rule 414 + VAL reduce by rule 414 + INCLUDE reduce by rule 414 + OPEN reduce by rule 414 + OP reduce by rule 414 + LITTLE reduce by rule 414 + BIG reduce by rule 414 + PIPELINE reduce by rule 414 + LOWERCASE reduce by rule 414 + UPPERCASE reduce by rule 414 + VERBATIM reduce by rule 414 + RTL reduce by rule 414 + SPAN reduce by rule 414 + DELAYSLOT reduce by rule 414 + ALWAYS reduce by rule 414 + NEVER reduce by rule 414 + NONFIX reduce by rule 414 + INFIX reduce by rule 414 + INFIXR reduce by rule 414 + DEBUG reduce by rule 414 + ASM_COLON reduce by rule 414 + MC_COLON reduce by rule 414 + RTL_COLON reduce by rule 414 + DELAYSLOT_COLON reduce by rule 414 + NULLIFIED_COLON reduce by rule 414 + PADDING_COLON reduce by rule 414 + RESOURCE reduce by rule 414 + CPU reduce by rule 414 + LATENCY reduce by rule 414 + EXCEPTION reduce by rule 414 + ID reduce by rule 414 + SYMBOL reduce by rule 414 + WORD reduce by rule 414 + INT reduce by rule 414 + INTINF reduce by rule 414 + REAL reduce by rule 414 + STRING reduce by rule 414 + CHAR reduce by rule 414 + EOF reduce by rule 414 + + + . error + + + state 49: + + id : ID . (reduce by rule 413) + + ARCHITECTURE reduce by rule 413 + END reduce by rule 413 + LOCAL reduce by rule 413 + IN reduce by rule 413 + OF reduce by rule 413 + DATATYPE reduce by rule 413 + TYPE reduce by rule 413 + EQ reduce by rule 413 + DOLLAR reduce by rule 413 + TIMES reduce by rule 413 + AND reduce by rule 413 + DEREF reduce by rule 413 + NOT reduce by rule 413 + CONCAT reduce by rule 413 + LLBRACKET reduce by rule 413 + RRBRACKET reduce by rule 413 + LHASHBRACKET reduce by rule 413 + LPAREN reduce by rule 413 + RPAREN reduce by rule 413 + LBRACKET reduce by rule 413 + RBRACKET reduce by rule 413 + LBRACE reduce by rule 413 + RBRACE reduce by rule 413 + SEMICOLON reduce by rule 413 + LDQUOTE reduce by rule 413 + RMETA reduce by rule 413 + CELLSET reduce by rule 413 + STORAGE reduce by rule 413 + LOCATIONS reduce by rule 413 + HASH reduce by rule 413 + COMMA reduce by rule 413 + COLON reduce by rule 413 + COLONGREATER reduce by rule 413 + DOT reduce by rule 413 + AT reduce by rule 413 + BAR reduce by rule 413 + ARROW reduce by rule 413 + DARROW reduce by rule 413 + BITS reduce by rule 413 + THEN reduce by rule 413 + ELSE reduce by rule 413 + TRUE reduce by rule 413 + FALSE reduce by rule 413 + WILD reduce by rule 413 + HANDLE reduce by rule 413 + LET reduce by rule 413 + STRUCTURE reduce by rule 413 + FUNCTOR reduce by rule 413 + SIGNATURE reduce by rule 413 + WHERE reduce by rule 413 + SHARING reduce by rule 413 + INSTRUCTION reduce by rule 413 + CELL reduce by rule 413 + VLIW reduce by rule 413 + SUPERSCALAR reduce by rule 413 + SIGNED reduce by rule 413 + UNSIGNED reduce by rule 413 + AS reduce by rule 413 + WITHTYPE reduce by rule 413 + FUN reduce by rule 413 + VAL reduce by rule 413 + INCLUDE reduce by rule 413 + OPEN reduce by rule 413 + OP reduce by rule 413 + LITTLE reduce by rule 413 + BIG reduce by rule 413 + PIPELINE reduce by rule 413 + LOWERCASE reduce by rule 413 + UPPERCASE reduce by rule 413 + VERBATIM reduce by rule 413 + RTL reduce by rule 413 + SPAN reduce by rule 413 + DELAYSLOT reduce by rule 413 + ALWAYS reduce by rule 413 + NEVER reduce by rule 413 + NONFIX reduce by rule 413 + INFIX reduce by rule 413 + INFIXR reduce by rule 413 + DEBUG reduce by rule 413 + ASM_COLON reduce by rule 413 + MC_COLON reduce by rule 413 + RTL_COLON reduce by rule 413 + DELAYSLOT_COLON reduce by rule 413 + NULLIFIED_COLON reduce by rule 413 + PADDING_COLON reduce by rule 413 + RESOURCE reduce by rule 413 + CPU reduce by rule 413 + LATENCY reduce by rule 413 + EXCEPTION reduce by rule 413 + ID reduce by rule 413 + SYMBOL reduce by rule 413 + WORD reduce by rule 413 + INT reduce by rule 413 + INTINF reduce by rule 413 + REAL reduce by rule 413 + STRING reduce by rule 413 + CHAR reduce by rule 413 + EOF reduce by rule 413 + + + . error + + + state 50: + + id : CELLSET . (reduce by rule 415) + + ARCHITECTURE reduce by rule 415 + END reduce by rule 415 + LOCAL reduce by rule 415 + IN reduce by rule 415 + OF reduce by rule 415 + DATATYPE reduce by rule 415 + TYPE reduce by rule 415 + EQ reduce by rule 415 + DOLLAR reduce by rule 415 + TIMES reduce by rule 415 + AND reduce by rule 415 + DEREF reduce by rule 415 + NOT reduce by rule 415 + CONCAT reduce by rule 415 + LLBRACKET reduce by rule 415 + RRBRACKET reduce by rule 415 + LHASHBRACKET reduce by rule 415 + LPAREN reduce by rule 415 + RPAREN reduce by rule 415 + LBRACKET reduce by rule 415 + RBRACKET reduce by rule 415 + LBRACE reduce by rule 415 + RBRACE reduce by rule 415 + SEMICOLON reduce by rule 415 + LDQUOTE reduce by rule 415 + RMETA reduce by rule 415 + CELLSET reduce by rule 415 + STORAGE reduce by rule 415 + LOCATIONS reduce by rule 415 + HASH reduce by rule 415 + COMMA reduce by rule 415 + COLON reduce by rule 415 + COLONGREATER reduce by rule 415 + DOT reduce by rule 415 + AT reduce by rule 415 + BAR reduce by rule 415 + ARROW reduce by rule 415 + DARROW reduce by rule 415 + BITS reduce by rule 415 + THEN reduce by rule 415 + ELSE reduce by rule 415 + TRUE reduce by rule 415 + FALSE reduce by rule 415 + WILD reduce by rule 415 + HANDLE reduce by rule 415 + LET reduce by rule 415 + STRUCTURE reduce by rule 415 + FUNCTOR reduce by rule 415 + SIGNATURE reduce by rule 415 + WHERE reduce by rule 415 + SHARING reduce by rule 415 + INSTRUCTION reduce by rule 415 + CELL reduce by rule 415 + VLIW reduce by rule 415 + SUPERSCALAR reduce by rule 415 + SIGNED reduce by rule 415 + UNSIGNED reduce by rule 415 + AS reduce by rule 415 + WITHTYPE reduce by rule 415 + FUN reduce by rule 415 + VAL reduce by rule 415 + INCLUDE reduce by rule 415 + OPEN reduce by rule 415 + OP reduce by rule 415 + LITTLE reduce by rule 415 + BIG reduce by rule 415 + PIPELINE reduce by rule 415 + LOWERCASE reduce by rule 415 + UPPERCASE reduce by rule 415 + VERBATIM reduce by rule 415 + RTL reduce by rule 415 + SPAN reduce by rule 415 + DELAYSLOT reduce by rule 415 + ALWAYS reduce by rule 415 + NEVER reduce by rule 415 + NONFIX reduce by rule 415 + INFIX reduce by rule 415 + INFIXR reduce by rule 415 + DEBUG reduce by rule 415 + ASM_COLON reduce by rule 415 + MC_COLON reduce by rule 415 + RTL_COLON reduce by rule 415 + DELAYSLOT_COLON reduce by rule 415 + NULLIFIED_COLON reduce by rule 415 + PADDING_COLON reduce by rule 415 + RESOURCE reduce by rule 415 + CPU reduce by rule 415 + LATENCY reduce by rule 415 + EXCEPTION reduce by rule 415 + ID reduce by rule 415 + SYMBOL reduce by rule 415 + WORD reduce by rule 415 + INT reduce by rule 415 + INTINF reduce by rule 415 + REAL reduce by rule 415 + STRING reduce by rule 415 + CHAR reduce by rule 415 + EOF reduce by rule 415 + + + . error + + + state 51: + + latencyclauses : latencyclause . (reduce by rule 56) + latencyclauses : latencyclause . BAR latencyclauses + + ARCHITECTURE reduce by rule 56 + END reduce by rule 56 + LOCAL reduce by rule 56 + IN reduce by rule 56 + DATATYPE reduce by rule 56 + TYPE reduce by rule 56 + AND reduce by rule 56 + RPAREN reduce by rule 56 + SEMICOLON reduce by rule 56 + STORAGE reduce by rule 56 + LOCATIONS reduce by rule 56 + BAR shift 171 + STRUCTURE reduce by rule 56 + FUNCTOR reduce by rule 56 + SIGNATURE reduce by rule 56 + SHARING reduce by rule 56 + INSTRUCTION reduce by rule 56 + VLIW reduce by rule 56 + SUPERSCALAR reduce by rule 56 + FUN reduce by rule 56 + VAL reduce by rule 56 + INCLUDE reduce by rule 56 + OPEN reduce by rule 56 + LITTLE reduce by rule 56 + BIG reduce by rule 56 + PIPELINE reduce by rule 56 + LOWERCASE reduce by rule 56 + UPPERCASE reduce by rule 56 + VERBATIM reduce by rule 56 + RTL reduce by rule 56 + NONFIX reduce by rule 56 + INFIX reduce by rule 56 + INFIXR reduce by rule 56 + DEBUG reduce by rule 56 + RESOURCE reduce by rule 56 + CPU reduce by rule 56 + LATENCY reduce by rule 56 + EXCEPTION reduce by rule 56 + EOF reduce by rule 56 + + + . error + + + state 52: + + latencybind : latencyclauses . (reduce by rule 55) + + ARCHITECTURE reduce by rule 55 + END reduce by rule 55 + LOCAL reduce by rule 55 + IN reduce by rule 55 + DATATYPE reduce by rule 55 + TYPE reduce by rule 55 + AND reduce by rule 55 + RPAREN reduce by rule 55 + SEMICOLON reduce by rule 55 + STORAGE reduce by rule 55 + LOCATIONS reduce by rule 55 + STRUCTURE reduce by rule 55 + FUNCTOR reduce by rule 55 + SIGNATURE reduce by rule 55 + SHARING reduce by rule 55 + INSTRUCTION reduce by rule 55 + VLIW reduce by rule 55 + SUPERSCALAR reduce by rule 55 + FUN reduce by rule 55 + VAL reduce by rule 55 + INCLUDE reduce by rule 55 + OPEN reduce by rule 55 + LITTLE reduce by rule 55 + BIG reduce by rule 55 + PIPELINE reduce by rule 55 + LOWERCASE reduce by rule 55 + UPPERCASE reduce by rule 55 + VERBATIM reduce by rule 55 + RTL reduce by rule 55 + NONFIX reduce by rule 55 + INFIX reduce by rule 55 + INFIXR reduce by rule 55 + DEBUG reduce by rule 55 + RESOURCE reduce by rule 55 + CPU reduce by rule 55 + LATENCY reduce by rule 55 + EXCEPTION reduce by rule 55 + EOF reduce by rule 55 + + + . error + + + state 53: + + latencybinds : latencybind . (reduce by rule 53) + latencybinds : latencybind . AND latencybinds + + ARCHITECTURE reduce by rule 53 + END reduce by rule 53 + LOCAL reduce by rule 53 + IN reduce by rule 53 + DATATYPE reduce by rule 53 + TYPE reduce by rule 53 + AND shift 172 + RPAREN reduce by rule 53 + SEMICOLON reduce by rule 53 + STORAGE reduce by rule 53 + LOCATIONS reduce by rule 53 + STRUCTURE reduce by rule 53 + FUNCTOR reduce by rule 53 + SIGNATURE reduce by rule 53 + SHARING reduce by rule 53 + INSTRUCTION reduce by rule 53 + VLIW reduce by rule 53 + SUPERSCALAR reduce by rule 53 + FUN reduce by rule 53 + VAL reduce by rule 53 + INCLUDE reduce by rule 53 + OPEN reduce by rule 53 + LITTLE reduce by rule 53 + BIG reduce by rule 53 + PIPELINE reduce by rule 53 + LOWERCASE reduce by rule 53 + UPPERCASE reduce by rule 53 + VERBATIM reduce by rule 53 + RTL reduce by rule 53 + NONFIX reduce by rule 53 + INFIX reduce by rule 53 + INFIXR reduce by rule 53 + DEBUG reduce by rule 53 + RESOURCE reduce by rule 53 + CPU reduce by rule 53 + LATENCY reduce by rule 53 + EXCEPTION reduce by rule 53 + EOF reduce by rule 53 + + + . error + + + state 54: + + mymddecl : LATENCY latencybinds . (reduce by rule 27) + + ARCHITECTURE reduce by rule 27 + END reduce by rule 27 + LOCAL reduce by rule 27 + IN reduce by rule 27 + DATATYPE reduce by rule 27 + TYPE reduce by rule 27 + RPAREN reduce by rule 27 + SEMICOLON reduce by rule 27 + STORAGE reduce by rule 27 + LOCATIONS reduce by rule 27 + STRUCTURE reduce by rule 27 + FUNCTOR reduce by rule 27 + SIGNATURE reduce by rule 27 + SHARING reduce by rule 27 + INSTRUCTION reduce by rule 27 + VLIW reduce by rule 27 + SUPERSCALAR reduce by rule 27 + FUN reduce by rule 27 + VAL reduce by rule 27 + INCLUDE reduce by rule 27 + OPEN reduce by rule 27 + LITTLE reduce by rule 27 + BIG reduce by rule 27 + PIPELINE reduce by rule 27 + LOWERCASE reduce by rule 27 + UPPERCASE reduce by rule 27 + VERBATIM reduce by rule 27 + RTL reduce by rule 27 + NONFIX reduce by rule 27 + INFIX reduce by rule 27 + INFIXR reduce by rule 27 + DEBUG reduce by rule 27 + RESOURCE reduce by rule 27 + CPU reduce by rule 27 + LATENCY reduce by rule 27 + EXCEPTION reduce by rule 27 + EOF reduce by rule 27 + + + . error + + + state 55: + + latencyclause : id . pat EQ exp + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 173 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 56: + + cpubinds : cpubind . (reduce by rule 30) + cpubinds : cpubind . AND cpubinds + + ARCHITECTURE reduce by rule 30 + END reduce by rule 30 + LOCAL reduce by rule 30 + IN reduce by rule 30 + DATATYPE reduce by rule 30 + TYPE reduce by rule 30 + AND shift 174 + RPAREN reduce by rule 30 + SEMICOLON reduce by rule 30 + STORAGE reduce by rule 30 + LOCATIONS reduce by rule 30 + STRUCTURE reduce by rule 30 + FUNCTOR reduce by rule 30 + SIGNATURE reduce by rule 30 + SHARING reduce by rule 30 + INSTRUCTION reduce by rule 30 + VLIW reduce by rule 30 + SUPERSCALAR reduce by rule 30 + FUN reduce by rule 30 + VAL reduce by rule 30 + INCLUDE reduce by rule 30 + OPEN reduce by rule 30 + LITTLE reduce by rule 30 + BIG reduce by rule 30 + PIPELINE reduce by rule 30 + LOWERCASE reduce by rule 30 + UPPERCASE reduce by rule 30 + VERBATIM reduce by rule 30 + RTL reduce by rule 30 + NONFIX reduce by rule 30 + INFIX reduce by rule 30 + INFIXR reduce by rule 30 + DEBUG reduce by rule 30 + RESOURCE reduce by rule 30 + CPU reduce by rule 30 + LATENCY reduce by rule 30 + EXCEPTION reduce by rule 30 + EOF reduce by rule 30 + + + . error + + + state 57: + + mymddecl : CPU cpubinds . (reduce by rule 25) + + ARCHITECTURE reduce by rule 25 + END reduce by rule 25 + LOCAL reduce by rule 25 + IN reduce by rule 25 + DATATYPE reduce by rule 25 + TYPE reduce by rule 25 + RPAREN reduce by rule 25 + SEMICOLON reduce by rule 25 + STORAGE reduce by rule 25 + LOCATIONS reduce by rule 25 + STRUCTURE reduce by rule 25 + FUNCTOR reduce by rule 25 + SIGNATURE reduce by rule 25 + SHARING reduce by rule 25 + INSTRUCTION reduce by rule 25 + VLIW reduce by rule 25 + SUPERSCALAR reduce by rule 25 + FUN reduce by rule 25 + VAL reduce by rule 25 + INCLUDE reduce by rule 25 + OPEN reduce by rule 25 + LITTLE reduce by rule 25 + BIG reduce by rule 25 + PIPELINE reduce by rule 25 + LOWERCASE reduce by rule 25 + UPPERCASE reduce by rule 25 + VERBATIM reduce by rule 25 + RTL reduce by rule 25 + NONFIX reduce by rule 25 + INFIX reduce by rule 25 + INFIXR reduce by rule 25 + DEBUG reduce by rule 25 + RESOURCE reduce by rule 25 + CPU reduce by rule 25 + LATENCY reduce by rule 25 + EXCEPTION reduce by rule 25 + EOF reduce by rule 25 + + + . error + + + state 58: + + cpubind : id . aliases int LBRACKET resources RBRACKET + + INT reduce by rule 33 + STRING shift 91 + + string goto 176 + aliases goto 175 + + . error + + + state 59: + + mymddecl : RESOURCE resourcebinds . (reduce by rule 24) + + ARCHITECTURE reduce by rule 24 + END reduce by rule 24 + LOCAL reduce by rule 24 + IN reduce by rule 24 + DATATYPE reduce by rule 24 + TYPE reduce by rule 24 + RPAREN reduce by rule 24 + SEMICOLON reduce by rule 24 + STORAGE reduce by rule 24 + LOCATIONS reduce by rule 24 + STRUCTURE reduce by rule 24 + FUNCTOR reduce by rule 24 + SIGNATURE reduce by rule 24 + SHARING reduce by rule 24 + INSTRUCTION reduce by rule 24 + VLIW reduce by rule 24 + SUPERSCALAR reduce by rule 24 + FUN reduce by rule 24 + VAL reduce by rule 24 + INCLUDE reduce by rule 24 + OPEN reduce by rule 24 + LITTLE reduce by rule 24 + BIG reduce by rule 24 + PIPELINE reduce by rule 24 + LOWERCASE reduce by rule 24 + UPPERCASE reduce by rule 24 + VERBATIM reduce by rule 24 + RTL reduce by rule 24 + NONFIX reduce by rule 24 + INFIX reduce by rule 24 + INFIXR reduce by rule 24 + DEBUG reduce by rule 24 + RESOURCE reduce by rule 24 + CPU reduce by rule 24 + LATENCY reduce by rule 24 + EXCEPTION reduce by rule 24 + EOF reduce by rule 24 + + + . error + + + state 60: + + resourcebinds : id . (reduce by rule 28) + resourcebinds : id . AND resourcebinds + + ARCHITECTURE reduce by rule 28 + END reduce by rule 28 + LOCAL reduce by rule 28 + IN reduce by rule 28 + DATATYPE reduce by rule 28 + TYPE reduce by rule 28 + AND shift 177 + RPAREN reduce by rule 28 + SEMICOLON reduce by rule 28 + STORAGE reduce by rule 28 + LOCATIONS reduce by rule 28 + STRUCTURE reduce by rule 28 + FUNCTOR reduce by rule 28 + SIGNATURE reduce by rule 28 + SHARING reduce by rule 28 + INSTRUCTION reduce by rule 28 + VLIW reduce by rule 28 + SUPERSCALAR reduce by rule 28 + FUN reduce by rule 28 + VAL reduce by rule 28 + INCLUDE reduce by rule 28 + OPEN reduce by rule 28 + LITTLE reduce by rule 28 + BIG reduce by rule 28 + PIPELINE reduce by rule 28 + LOWERCASE reduce by rule 28 + UPPERCASE reduce by rule 28 + VERBATIM reduce by rule 28 + RTL reduce by rule 28 + NONFIX reduce by rule 28 + INFIX reduce by rule 28 + INFIXR reduce by rule 28 + DEBUG reduce by rule 28 + RESOURCE reduce by rule 28 + CPU reduce by rule 28 + LATENCY reduce by rule 28 + EXCEPTION reduce by rule 28 + EOF reduce by rule 28 + + + . error + + + state 61: + + mymddecl : DEBUG id . (reduce by rule 23) + + ARCHITECTURE reduce by rule 23 + END reduce by rule 23 + LOCAL reduce by rule 23 + IN reduce by rule 23 + DATATYPE reduce by rule 23 + TYPE reduce by rule 23 + RPAREN reduce by rule 23 + SEMICOLON reduce by rule 23 + STORAGE reduce by rule 23 + LOCATIONS reduce by rule 23 + STRUCTURE reduce by rule 23 + FUNCTOR reduce by rule 23 + SIGNATURE reduce by rule 23 + SHARING reduce by rule 23 + INSTRUCTION reduce by rule 23 + VLIW reduce by rule 23 + SUPERSCALAR reduce by rule 23 + FUN reduce by rule 23 + VAL reduce by rule 23 + INCLUDE reduce by rule 23 + OPEN reduce by rule 23 + LITTLE reduce by rule 23 + BIG reduce by rule 23 + PIPELINE reduce by rule 23 + LOWERCASE reduce by rule 23 + UPPERCASE reduce by rule 23 + VERBATIM reduce by rule 23 + RTL reduce by rule 23 + NONFIX reduce by rule 23 + INFIX reduce by rule 23 + INFIXR reduce by rule 23 + DEBUG reduce by rule 23 + RESOURCE reduce by rule 23 + CPU reduce by rule 23 + LATENCY reduce by rule 23 + EXCEPTION reduce by rule 23 + EOF reduce by rule 23 + + + . error + + + state 62: + + mymldecl : INFIXR intopt . syms + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 68 + symb goto 67 + syms goto 178 + + . error + + + state 63: + + intopt : int . (reduce by rule 396) + + TIMES reduce by rule 396 + DEREF reduce by rule 396 + NOT reduce by rule 396 + CELLSET reduce by rule 396 + ID reduce by rule 396 + SYMBOL reduce by rule 396 + + + . error + + + state 64: + + int : INT . (reduce by rule 395) + + ARCHITECTURE reduce by rule 395 + END reduce by rule 395 + LOCAL reduce by rule 395 + IN reduce by rule 395 + OF reduce by rule 395 + DATATYPE reduce by rule 395 + TYPE reduce by rule 395 + EQ reduce by rule 395 + DOLLAR reduce by rule 395 + TIMES reduce by rule 395 + AND reduce by rule 395 + DEREF reduce by rule 395 + NOT reduce by rule 395 + CONCAT reduce by rule 395 + LLBRACKET reduce by rule 395 + LHASHBRACKET reduce by rule 395 + LPAREN reduce by rule 395 + RPAREN reduce by rule 395 + LBRACKET reduce by rule 395 + RBRACKET reduce by rule 395 + LBRACE reduce by rule 395 + RBRACE reduce by rule 395 + SEMICOLON reduce by rule 395 + LDQUOTE reduce by rule 395 + RMETA reduce by rule 395 + CELLSET reduce by rule 395 + STORAGE reduce by rule 395 + LOCATIONS reduce by rule 395 + HASH reduce by rule 395 + COMMA reduce by rule 395 + COLON reduce by rule 395 + DOTDOT reduce by rule 395 + AT reduce by rule 395 + BAR reduce by rule 395 + ARROW reduce by rule 395 + DARROW reduce by rule 395 + BITS reduce by rule 395 + THEN reduce by rule 395 + ELSE reduce by rule 395 + TRUE reduce by rule 395 + FALSE reduce by rule 395 + WILD reduce by rule 395 + HANDLE reduce by rule 395 + LET reduce by rule 395 + STRUCTURE reduce by rule 395 + FUNCTOR reduce by rule 395 + SIGNATURE reduce by rule 395 + WHERE reduce by rule 395 + SHARING reduce by rule 395 + INSTRUCTION reduce by rule 395 + CELL reduce by rule 395 + VLIW reduce by rule 395 + SUPERSCALAR reduce by rule 395 + WITHTYPE reduce by rule 395 + FUN reduce by rule 395 + VAL reduce by rule 395 + INCLUDE reduce by rule 395 + OPEN reduce by rule 395 + OP reduce by rule 395 + LITTLE reduce by rule 395 + BIG reduce by rule 395 + PIPELINE reduce by rule 395 + LOWERCASE reduce by rule 395 + UPPERCASE reduce by rule 395 + VERBATIM reduce by rule 395 + RTL reduce by rule 395 + SPAN reduce by rule 395 + DELAYSLOT reduce by rule 395 + ALWAYS reduce by rule 395 + NEVER reduce by rule 395 + NONFIX reduce by rule 395 + INFIX reduce by rule 395 + INFIXR reduce by rule 395 + DEBUG reduce by rule 395 + ASM_COLON reduce by rule 395 + MC_COLON reduce by rule 395 + RTL_COLON reduce by rule 395 + DELAYSLOT_COLON reduce by rule 395 + NULLIFIED_COLON reduce by rule 395 + PADDING_COLON reduce by rule 395 + AGGREGABLE reduce by rule 395 + RESOURCE reduce by rule 395 + CPU reduce by rule 395 + LATENCY reduce by rule 395 + EXCEPTION reduce by rule 395 + ID reduce by rule 395 + SYMBOL reduce by rule 395 + WORD reduce by rule 395 + INT reduce by rule 395 + INTINF reduce by rule 395 + REAL reduce by rule 395 + STRING reduce by rule 395 + CHAR reduce by rule 395 + EOF reduce by rule 395 + + + . error + + + state 65: + + mymldecl : INFIX intopt . syms + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 68 + symb goto 67 + syms goto 179 + + . error + + + state 66: + + mymldecl : NONFIX syms . (reduce by rule 79) + + ARCHITECTURE reduce by rule 79 + END reduce by rule 79 + LOCAL reduce by rule 79 + IN reduce by rule 79 + DATATYPE reduce by rule 79 + TYPE reduce by rule 79 + RPAREN reduce by rule 79 + SEMICOLON reduce by rule 79 + STORAGE reduce by rule 79 + LOCATIONS reduce by rule 79 + STRUCTURE reduce by rule 79 + FUNCTOR reduce by rule 79 + SIGNATURE reduce by rule 79 + SHARING reduce by rule 79 + INSTRUCTION reduce by rule 79 + VLIW reduce by rule 79 + SUPERSCALAR reduce by rule 79 + FUN reduce by rule 79 + VAL reduce by rule 79 + INCLUDE reduce by rule 79 + OPEN reduce by rule 79 + LITTLE reduce by rule 79 + BIG reduce by rule 79 + PIPELINE reduce by rule 79 + LOWERCASE reduce by rule 79 + UPPERCASE reduce by rule 79 + VERBATIM reduce by rule 79 + RTL reduce by rule 79 + NONFIX reduce by rule 79 + INFIX reduce by rule 79 + INFIXR reduce by rule 79 + DEBUG reduce by rule 79 + RESOURCE reduce by rule 79 + CPU reduce by rule 79 + LATENCY reduce by rule 79 + EXCEPTION reduce by rule 79 + EOF reduce by rule 79 + + + . error + + + state 67: + + sym : symb . (reduce by rule 417) + + ARCHITECTURE reduce by rule 417 + END reduce by rule 417 + LOCAL reduce by rule 417 + IN reduce by rule 417 + OF reduce by rule 417 + DATATYPE reduce by rule 417 + TYPE reduce by rule 417 + EQ reduce by rule 417 + DOLLAR reduce by rule 417 + TIMES reduce by rule 417 + AND reduce by rule 417 + DEREF reduce by rule 417 + NOT reduce by rule 417 + CONCAT reduce by rule 417 + LLBRACKET reduce by rule 417 + RRBRACKET reduce by rule 417 + LHASHBRACKET reduce by rule 417 + LPAREN reduce by rule 417 + RPAREN reduce by rule 417 + LBRACKET reduce by rule 417 + RBRACKET reduce by rule 417 + LBRACE reduce by rule 417 + RBRACE reduce by rule 417 + SEMICOLON reduce by rule 417 + LDQUOTE reduce by rule 417 + RMETA reduce by rule 417 + CELLSET reduce by rule 417 + STORAGE reduce by rule 417 + LOCATIONS reduce by rule 417 + HASH reduce by rule 417 + COMMA reduce by rule 417 + COLON reduce by rule 417 + DOT reduce by rule 417 + AT reduce by rule 417 + BAR reduce by rule 417 + DARROW reduce by rule 417 + THEN reduce by rule 417 + ELSE reduce by rule 417 + TRUE reduce by rule 417 + FALSE reduce by rule 417 + WILD reduce by rule 417 + HANDLE reduce by rule 417 + LET reduce by rule 417 + STRUCTURE reduce by rule 417 + FUNCTOR reduce by rule 417 + SIGNATURE reduce by rule 417 + WHERE reduce by rule 417 + SHARING reduce by rule 417 + INSTRUCTION reduce by rule 417 + VLIW reduce by rule 417 + SUPERSCALAR reduce by rule 417 + AS reduce by rule 417 + WITHTYPE reduce by rule 417 + FUN reduce by rule 417 + VAL reduce by rule 417 + INCLUDE reduce by rule 417 + OPEN reduce by rule 417 + OP reduce by rule 417 + LITTLE reduce by rule 417 + BIG reduce by rule 417 + PIPELINE reduce by rule 417 + LOWERCASE reduce by rule 417 + UPPERCASE reduce by rule 417 + VERBATIM reduce by rule 417 + RTL reduce by rule 417 + SPAN reduce by rule 417 + DELAYSLOT reduce by rule 417 + ALWAYS reduce by rule 417 + NEVER reduce by rule 417 + NONFIX reduce by rule 417 + INFIX reduce by rule 417 + INFIXR reduce by rule 417 + DEBUG reduce by rule 417 + ASM_COLON reduce by rule 417 + MC_COLON reduce by rule 417 + RTL_COLON reduce by rule 417 + DELAYSLOT_COLON reduce by rule 417 + NULLIFIED_COLON reduce by rule 417 + PADDING_COLON reduce by rule 417 + RESOURCE reduce by rule 417 + CPU reduce by rule 417 + LATENCY reduce by rule 417 + EXCEPTION reduce by rule 417 + ID reduce by rule 417 + SYMBOL reduce by rule 417 + WORD reduce by rule 417 + INT reduce by rule 417 + INTINF reduce by rule 417 + REAL reduce by rule 417 + STRING reduce by rule 417 + CHAR reduce by rule 417 + EOF reduce by rule 417 + + + . error + + + state 68: + + syms : sym . (reduce by rule 109) + syms : sym . syms + + ARCHITECTURE reduce by rule 109 + END reduce by rule 109 + LOCAL reduce by rule 109 + IN reduce by rule 109 + DATATYPE reduce by rule 109 + TYPE reduce by rule 109 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + RPAREN reduce by rule 109 + SEMICOLON reduce by rule 109 + CELLSET shift 50 + STORAGE reduce by rule 109 + LOCATIONS reduce by rule 109 + COLON reduce by rule 109 + STRUCTURE reduce by rule 109 + FUNCTOR reduce by rule 109 + SIGNATURE reduce by rule 109 + SHARING reduce by rule 109 + INSTRUCTION reduce by rule 109 + VLIW reduce by rule 109 + SUPERSCALAR reduce by rule 109 + FUN reduce by rule 109 + VAL reduce by rule 109 + INCLUDE reduce by rule 109 + OPEN reduce by rule 109 + LITTLE reduce by rule 109 + BIG reduce by rule 109 + PIPELINE reduce by rule 109 + LOWERCASE reduce by rule 109 + UPPERCASE reduce by rule 109 + VERBATIM reduce by rule 109 + RTL reduce by rule 109 + NONFIX reduce by rule 109 + INFIX reduce by rule 109 + INFIXR reduce by rule 109 + DEBUG reduce by rule 109 + RESOURCE reduce by rule 109 + CPU reduce by rule 109 + LATENCY reduce by rule 109 + EXCEPTION reduce by rule 109 + ID shift 49 + SYMBOL shift 48 + EOF reduce by rule 109 + + id goto 69 + sym goto 68 + symb goto 67 + syms goto 180 + + . error + + + state 69: + + sym : id . (reduce by rule 416) + + ARCHITECTURE reduce by rule 416 + END reduce by rule 416 + LOCAL reduce by rule 416 + IN reduce by rule 416 + OF reduce by rule 416 + DATATYPE reduce by rule 416 + TYPE reduce by rule 416 + EQ reduce by rule 416 + DOLLAR reduce by rule 416 + TIMES reduce by rule 416 + AND reduce by rule 416 + DEREF reduce by rule 416 + NOT reduce by rule 416 + LLBRACKET reduce by rule 416 + RRBRACKET reduce by rule 416 + LHASHBRACKET reduce by rule 416 + LPAREN reduce by rule 416 + RPAREN reduce by rule 416 + LBRACKET reduce by rule 416 + RBRACKET reduce by rule 416 + LBRACE reduce by rule 416 + RBRACE reduce by rule 416 + SEMICOLON reduce by rule 416 + LDQUOTE reduce by rule 416 + RMETA reduce by rule 416 + CELLSET reduce by rule 416 + STORAGE reduce by rule 416 + LOCATIONS reduce by rule 416 + HASH reduce by rule 416 + COMMA reduce by rule 416 + COLON reduce by rule 416 + DOT reduce by rule 416 + AT reduce by rule 416 + BAR reduce by rule 416 + DARROW reduce by rule 416 + THEN reduce by rule 416 + ELSE reduce by rule 416 + TRUE reduce by rule 416 + FALSE reduce by rule 416 + WILD reduce by rule 416 + HANDLE reduce by rule 416 + LET reduce by rule 416 + STRUCTURE reduce by rule 416 + FUNCTOR reduce by rule 416 + SIGNATURE reduce by rule 416 + WHERE reduce by rule 416 + SHARING reduce by rule 416 + INSTRUCTION reduce by rule 416 + VLIW reduce by rule 416 + SUPERSCALAR reduce by rule 416 + AS reduce by rule 416 + WITHTYPE reduce by rule 416 + FUN reduce by rule 416 + VAL reduce by rule 416 + INCLUDE reduce by rule 416 + OPEN reduce by rule 416 + OP reduce by rule 416 + LITTLE reduce by rule 416 + BIG reduce by rule 416 + PIPELINE reduce by rule 416 + LOWERCASE reduce by rule 416 + UPPERCASE reduce by rule 416 + VERBATIM reduce by rule 416 + RTL reduce by rule 416 + SPAN reduce by rule 416 + DELAYSLOT reduce by rule 416 + ALWAYS reduce by rule 416 + NEVER reduce by rule 416 + NONFIX reduce by rule 416 + INFIX reduce by rule 416 + INFIXR reduce by rule 416 + DEBUG reduce by rule 416 + ASM_COLON reduce by rule 416 + MC_COLON reduce by rule 416 + RTL_COLON reduce by rule 416 + DELAYSLOT_COLON reduce by rule 416 + NULLIFIED_COLON reduce by rule 416 + PADDING_COLON reduce by rule 416 + RESOURCE reduce by rule 416 + CPU reduce by rule 416 + LATENCY reduce by rule 416 + EXCEPTION reduce by rule 416 + ID reduce by rule 416 + SYMBOL reduce by rule 416 + WORD reduce by rule 416 + INT reduce by rule 416 + INTINF reduce by rule 416 + REAL reduce by rule 416 + STRING reduce by rule 416 + CHAR reduce by rule 416 + EOF reduce by rule 416 + + + . error + + + state 70: + + symb : NOT . (reduce by rule 419) + + ARCHITECTURE reduce by rule 419 + END reduce by rule 419 + LOCAL reduce by rule 419 + IN reduce by rule 419 + OF reduce by rule 419 + DATATYPE reduce by rule 419 + TYPE reduce by rule 419 + EQ reduce by rule 419 + DOLLAR reduce by rule 419 + TIMES reduce by rule 419 + AND reduce by rule 419 + DEREF reduce by rule 419 + NOT reduce by rule 419 + CONCAT reduce by rule 419 + LLBRACKET reduce by rule 419 + RRBRACKET reduce by rule 419 + LHASHBRACKET reduce by rule 419 + LPAREN reduce by rule 419 + RPAREN reduce by rule 419 + LBRACKET reduce by rule 419 + RBRACKET reduce by rule 419 + LBRACE reduce by rule 419 + RBRACE reduce by rule 419 + SEMICOLON reduce by rule 419 + LDQUOTE reduce by rule 419 + RMETA reduce by rule 419 + CELLSET reduce by rule 419 + STORAGE reduce by rule 419 + LOCATIONS reduce by rule 419 + HASH reduce by rule 419 + COMMA reduce by rule 419 + COLON reduce by rule 419 + DOT reduce by rule 419 + AT reduce by rule 419 + BAR reduce by rule 419 + DARROW reduce by rule 419 + THEN reduce by rule 419 + ELSE reduce by rule 419 + TRUE reduce by rule 419 + FALSE reduce by rule 419 + WILD reduce by rule 419 + HANDLE reduce by rule 419 + LET reduce by rule 419 + STRUCTURE reduce by rule 419 + FUNCTOR reduce by rule 419 + SIGNATURE reduce by rule 419 + WHERE reduce by rule 419 + SHARING reduce by rule 419 + INSTRUCTION reduce by rule 419 + VLIW reduce by rule 419 + SUPERSCALAR reduce by rule 419 + AS reduce by rule 419 + WITHTYPE reduce by rule 419 + FUN reduce by rule 419 + VAL reduce by rule 419 + INCLUDE reduce by rule 419 + OPEN reduce by rule 419 + OP reduce by rule 419 + LITTLE reduce by rule 419 + BIG reduce by rule 419 + PIPELINE reduce by rule 419 + LOWERCASE reduce by rule 419 + UPPERCASE reduce by rule 419 + VERBATIM reduce by rule 419 + RTL reduce by rule 419 + SPAN reduce by rule 419 + DELAYSLOT reduce by rule 419 + ALWAYS reduce by rule 419 + NEVER reduce by rule 419 + NONFIX reduce by rule 419 + INFIX reduce by rule 419 + INFIXR reduce by rule 419 + DEBUG reduce by rule 419 + ASM_COLON reduce by rule 419 + MC_COLON reduce by rule 419 + RTL_COLON reduce by rule 419 + DELAYSLOT_COLON reduce by rule 419 + NULLIFIED_COLON reduce by rule 419 + PADDING_COLON reduce by rule 419 + RESOURCE reduce by rule 419 + CPU reduce by rule 419 + LATENCY reduce by rule 419 + EXCEPTION reduce by rule 419 + ID reduce by rule 419 + SYMBOL reduce by rule 419 + WORD reduce by rule 419 + INT reduce by rule 419 + INTINF reduce by rule 419 + REAL reduce by rule 419 + STRING reduce by rule 419 + CHAR reduce by rule 419 + EOF reduce by rule 419 + + + . error + + + state 71: + + symb : DEREF . (reduce by rule 420) + + ARCHITECTURE reduce by rule 420 + END reduce by rule 420 + LOCAL reduce by rule 420 + IN reduce by rule 420 + OF reduce by rule 420 + DATATYPE reduce by rule 420 + TYPE reduce by rule 420 + EQ reduce by rule 420 + DOLLAR reduce by rule 420 + TIMES reduce by rule 420 + AND reduce by rule 420 + DEREF reduce by rule 420 + NOT reduce by rule 420 + CONCAT reduce by rule 420 + LLBRACKET reduce by rule 420 + RRBRACKET reduce by rule 420 + LHASHBRACKET reduce by rule 420 + LPAREN reduce by rule 420 + RPAREN reduce by rule 420 + LBRACKET reduce by rule 420 + RBRACKET reduce by rule 420 + LBRACE reduce by rule 420 + RBRACE reduce by rule 420 + SEMICOLON reduce by rule 420 + LDQUOTE reduce by rule 420 + RMETA reduce by rule 420 + CELLSET reduce by rule 420 + STORAGE reduce by rule 420 + LOCATIONS reduce by rule 420 + HASH reduce by rule 420 + COMMA reduce by rule 420 + COLON reduce by rule 420 + DOT reduce by rule 420 + AT reduce by rule 420 + BAR reduce by rule 420 + DARROW reduce by rule 420 + THEN reduce by rule 420 + ELSE reduce by rule 420 + TRUE reduce by rule 420 + FALSE reduce by rule 420 + WILD reduce by rule 420 + HANDLE reduce by rule 420 + LET reduce by rule 420 + STRUCTURE reduce by rule 420 + FUNCTOR reduce by rule 420 + SIGNATURE reduce by rule 420 + WHERE reduce by rule 420 + SHARING reduce by rule 420 + INSTRUCTION reduce by rule 420 + VLIW reduce by rule 420 + SUPERSCALAR reduce by rule 420 + AS reduce by rule 420 + WITHTYPE reduce by rule 420 + FUN reduce by rule 420 + VAL reduce by rule 420 + INCLUDE reduce by rule 420 + OPEN reduce by rule 420 + OP reduce by rule 420 + LITTLE reduce by rule 420 + BIG reduce by rule 420 + PIPELINE reduce by rule 420 + LOWERCASE reduce by rule 420 + UPPERCASE reduce by rule 420 + VERBATIM reduce by rule 420 + RTL reduce by rule 420 + SPAN reduce by rule 420 + DELAYSLOT reduce by rule 420 + ALWAYS reduce by rule 420 + NEVER reduce by rule 420 + NONFIX reduce by rule 420 + INFIX reduce by rule 420 + INFIXR reduce by rule 420 + DEBUG reduce by rule 420 + ASM_COLON reduce by rule 420 + MC_COLON reduce by rule 420 + RTL_COLON reduce by rule 420 + DELAYSLOT_COLON reduce by rule 420 + NULLIFIED_COLON reduce by rule 420 + PADDING_COLON reduce by rule 420 + RESOURCE reduce by rule 420 + CPU reduce by rule 420 + LATENCY reduce by rule 420 + EXCEPTION reduce by rule 420 + ID reduce by rule 420 + SYMBOL reduce by rule 420 + WORD reduce by rule 420 + INT reduce by rule 420 + INTINF reduce by rule 420 + REAL reduce by rule 420 + STRING reduce by rule 420 + CHAR reduce by rule 420 + EOF reduce by rule 420 + + + . error + + + state 72: + + symb : TIMES . (reduce by rule 418) + + ARCHITECTURE reduce by rule 418 + END reduce by rule 418 + LOCAL reduce by rule 418 + IN reduce by rule 418 + OF reduce by rule 418 + DATATYPE reduce by rule 418 + TYPE reduce by rule 418 + EQ reduce by rule 418 + DOLLAR reduce by rule 418 + TIMES reduce by rule 418 + AND reduce by rule 418 + DEREF reduce by rule 418 + NOT reduce by rule 418 + CONCAT reduce by rule 418 + LLBRACKET reduce by rule 418 + RRBRACKET reduce by rule 418 + LHASHBRACKET reduce by rule 418 + LPAREN reduce by rule 418 + RPAREN reduce by rule 418 + LBRACKET reduce by rule 418 + RBRACKET reduce by rule 418 + LBRACE reduce by rule 418 + RBRACE reduce by rule 418 + SEMICOLON reduce by rule 418 + LDQUOTE reduce by rule 418 + RMETA reduce by rule 418 + CELLSET reduce by rule 418 + STORAGE reduce by rule 418 + LOCATIONS reduce by rule 418 + HASH reduce by rule 418 + COMMA reduce by rule 418 + COLON reduce by rule 418 + DOT reduce by rule 418 + AT reduce by rule 418 + BAR reduce by rule 418 + DARROW reduce by rule 418 + THEN reduce by rule 418 + ELSE reduce by rule 418 + TRUE reduce by rule 418 + FALSE reduce by rule 418 + WILD reduce by rule 418 + HANDLE reduce by rule 418 + LET reduce by rule 418 + STRUCTURE reduce by rule 418 + FUNCTOR reduce by rule 418 + SIGNATURE reduce by rule 418 + WHERE reduce by rule 418 + SHARING reduce by rule 418 + INSTRUCTION reduce by rule 418 + VLIW reduce by rule 418 + SUPERSCALAR reduce by rule 418 + AS reduce by rule 418 + WITHTYPE reduce by rule 418 + FUN reduce by rule 418 + VAL reduce by rule 418 + INCLUDE reduce by rule 418 + OPEN reduce by rule 418 + OP reduce by rule 418 + LITTLE reduce by rule 418 + BIG reduce by rule 418 + PIPELINE reduce by rule 418 + LOWERCASE reduce by rule 418 + UPPERCASE reduce by rule 418 + VERBATIM reduce by rule 418 + RTL reduce by rule 418 + SPAN reduce by rule 418 + DELAYSLOT reduce by rule 418 + ALWAYS reduce by rule 418 + NEVER reduce by rule 418 + NONFIX reduce by rule 418 + INFIX reduce by rule 418 + INFIXR reduce by rule 418 + DEBUG reduce by rule 418 + ASM_COLON reduce by rule 418 + MC_COLON reduce by rule 418 + RTL_COLON reduce by rule 418 + DELAYSLOT_COLON reduce by rule 418 + NULLIFIED_COLON reduce by rule 418 + PADDING_COLON reduce by rule 418 + RESOURCE reduce by rule 418 + CPU reduce by rule 418 + LATENCY reduce by rule 418 + EXCEPTION reduce by rule 418 + ID reduce by rule 418 + SYMBOL reduce by rule 418 + WORD reduce by rule 418 + INT reduce by rule 418 + INTINF reduce by rule 418 + REAL reduce by rule 418 + STRING reduce by rule 418 + CHAR reduce by rule 418 + EOF reduce by rule 418 + + + . error + + + state 73: + + bool : False . (reduce by rule 430) + + ARCHITECTURE reduce by rule 430 + END reduce by rule 430 + LOCAL reduce by rule 430 + IN reduce by rule 430 + OF reduce by rule 430 + DATATYPE reduce by rule 430 + TYPE reduce by rule 430 + EQ reduce by rule 430 + DOLLAR reduce by rule 430 + TIMES reduce by rule 430 + AND reduce by rule 430 + DEREF reduce by rule 430 + NOT reduce by rule 430 + LLBRACKET reduce by rule 430 + LHASHBRACKET reduce by rule 430 + LPAREN reduce by rule 430 + RPAREN reduce by rule 430 + LBRACKET reduce by rule 430 + RBRACKET reduce by rule 430 + LBRACE reduce by rule 430 + RBRACE reduce by rule 430 + SEMICOLON reduce by rule 430 + LDQUOTE reduce by rule 430 + RMETA reduce by rule 430 + CELLSET reduce by rule 430 + STORAGE reduce by rule 430 + LOCATIONS reduce by rule 430 + HASH reduce by rule 430 + COMMA reduce by rule 430 + COLON reduce by rule 430 + AT reduce by rule 430 + BAR reduce by rule 430 + DARROW reduce by rule 430 + THEN reduce by rule 430 + ELSE reduce by rule 430 + TRUE reduce by rule 430 + FALSE reduce by rule 430 + WILD reduce by rule 430 + HANDLE reduce by rule 430 + LET reduce by rule 430 + STRUCTURE reduce by rule 430 + FUNCTOR reduce by rule 430 + SIGNATURE reduce by rule 430 + WHERE reduce by rule 430 + SHARING reduce by rule 430 + INSTRUCTION reduce by rule 430 + VLIW reduce by rule 430 + SUPERSCALAR reduce by rule 430 + WITHTYPE reduce by rule 430 + FUN reduce by rule 430 + VAL reduce by rule 430 + INCLUDE reduce by rule 430 + OPEN reduce by rule 430 + OP reduce by rule 430 + LITTLE reduce by rule 430 + BIG reduce by rule 430 + PIPELINE reduce by rule 430 + LOWERCASE reduce by rule 430 + UPPERCASE reduce by rule 430 + VERBATIM reduce by rule 430 + RTL reduce by rule 430 + SPAN reduce by rule 430 + DELAYSLOT reduce by rule 430 + ALWAYS reduce by rule 430 + NEVER reduce by rule 430 + NONFIX reduce by rule 430 + INFIX reduce by rule 430 + INFIXR reduce by rule 430 + DEBUG reduce by rule 430 + ASM_COLON reduce by rule 430 + MC_COLON reduce by rule 430 + RTL_COLON reduce by rule 430 + DELAYSLOT_COLON reduce by rule 430 + NULLIFIED_COLON reduce by rule 430 + PADDING_COLON reduce by rule 430 + RESOURCE reduce by rule 430 + CPU reduce by rule 430 + LATENCY reduce by rule 430 + EXCEPTION reduce by rule 430 + ID reduce by rule 430 + SYMBOL reduce by rule 430 + WORD reduce by rule 430 + INT reduce by rule 430 + INTINF reduce by rule 430 + REAL reduce by rule 430 + STRING reduce by rule 430 + CHAR reduce by rule 430 + EOF reduce by rule 430 + + + . error + + + state 74: + + bool : True . (reduce by rule 431) + + ARCHITECTURE reduce by rule 431 + END reduce by rule 431 + LOCAL reduce by rule 431 + IN reduce by rule 431 + OF reduce by rule 431 + DATATYPE reduce by rule 431 + TYPE reduce by rule 431 + EQ reduce by rule 431 + DOLLAR reduce by rule 431 + TIMES reduce by rule 431 + AND reduce by rule 431 + DEREF reduce by rule 431 + NOT reduce by rule 431 + LLBRACKET reduce by rule 431 + LHASHBRACKET reduce by rule 431 + LPAREN reduce by rule 431 + RPAREN reduce by rule 431 + LBRACKET reduce by rule 431 + RBRACKET reduce by rule 431 + LBRACE reduce by rule 431 + RBRACE reduce by rule 431 + SEMICOLON reduce by rule 431 + LDQUOTE reduce by rule 431 + RMETA reduce by rule 431 + CELLSET reduce by rule 431 + STORAGE reduce by rule 431 + LOCATIONS reduce by rule 431 + HASH reduce by rule 431 + COMMA reduce by rule 431 + COLON reduce by rule 431 + AT reduce by rule 431 + BAR reduce by rule 431 + DARROW reduce by rule 431 + THEN reduce by rule 431 + ELSE reduce by rule 431 + TRUE reduce by rule 431 + FALSE reduce by rule 431 + WILD reduce by rule 431 + HANDLE reduce by rule 431 + LET reduce by rule 431 + STRUCTURE reduce by rule 431 + FUNCTOR reduce by rule 431 + SIGNATURE reduce by rule 431 + WHERE reduce by rule 431 + SHARING reduce by rule 431 + INSTRUCTION reduce by rule 431 + VLIW reduce by rule 431 + SUPERSCALAR reduce by rule 431 + WITHTYPE reduce by rule 431 + FUN reduce by rule 431 + VAL reduce by rule 431 + INCLUDE reduce by rule 431 + OPEN reduce by rule 431 + OP reduce by rule 431 + LITTLE reduce by rule 431 + BIG reduce by rule 431 + PIPELINE reduce by rule 431 + LOWERCASE reduce by rule 431 + UPPERCASE reduce by rule 431 + VERBATIM reduce by rule 431 + RTL reduce by rule 431 + SPAN reduce by rule 431 + DELAYSLOT reduce by rule 431 + ALWAYS reduce by rule 431 + NEVER reduce by rule 431 + NONFIX reduce by rule 431 + INFIX reduce by rule 431 + INFIXR reduce by rule 431 + DEBUG reduce by rule 431 + ASM_COLON reduce by rule 431 + MC_COLON reduce by rule 431 + RTL_COLON reduce by rule 431 + DELAYSLOT_COLON reduce by rule 431 + NULLIFIED_COLON reduce by rule 431 + PADDING_COLON reduce by rule 431 + RESOURCE reduce by rule 431 + CPU reduce by rule 431 + LATENCY reduce by rule 431 + EXCEPTION reduce by rule 431 + ID reduce by rule 431 + SYMBOL reduce by rule 431 + WORD reduce by rule 431 + INT reduce by rule 431 + INTINF reduce by rule 431 + REAL reduce by rule 431 + STRING reduce by rule 431 + CHAR reduce by rule 431 + EOF reduce by rule 431 + + + . error + + + state 75: + + apat : literal . (reduce by rule 291) + + EQ reduce by rule 291 + TIMES reduce by rule 291 + AND reduce by rule 291 + DEREF reduce by rule 291 + NOT reduce by rule 291 + LHASHBRACKET reduce by rule 291 + LPAREN reduce by rule 291 + RPAREN reduce by rule 291 + LBRACKET reduce by rule 291 + RBRACKET reduce by rule 291 + LBRACE reduce by rule 291 + RBRACE reduce by rule 291 + CELLSET reduce by rule 291 + COMMA reduce by rule 291 + COLON reduce by rule 291 + BAR reduce by rule 291 + DARROW reduce by rule 291 + TRUE reduce by rule 291 + FALSE reduce by rule 291 + WILD reduce by rule 291 + WHERE reduce by rule 291 + OP reduce by rule 291 + ALWAYS reduce by rule 291 + NEVER reduce by rule 291 + EXCEPTION reduce by rule 291 + ID reduce by rule 291 + SYMBOL reduce by rule 291 + WORD reduce by rule 291 + INT reduce by rule 291 + INTINF reduce by rule 291 + REAL reduce by rule 291 + STRING reduce by rule 291 + CHAR reduce by rule 291 + + + . error + + + state 76: + + literal : bool . (reduce by rule 239) + + ARCHITECTURE reduce by rule 239 + END reduce by rule 239 + LOCAL reduce by rule 239 + IN reduce by rule 239 + OF reduce by rule 239 + DATATYPE reduce by rule 239 + TYPE reduce by rule 239 + EQ reduce by rule 239 + DOLLAR reduce by rule 239 + TIMES reduce by rule 239 + AND reduce by rule 239 + DEREF reduce by rule 239 + NOT reduce by rule 239 + LLBRACKET reduce by rule 239 + LHASHBRACKET reduce by rule 239 + LPAREN reduce by rule 239 + RPAREN reduce by rule 239 + LBRACKET reduce by rule 239 + RBRACKET reduce by rule 239 + LBRACE reduce by rule 239 + RBRACE reduce by rule 239 + SEMICOLON reduce by rule 239 + LDQUOTE reduce by rule 239 + RMETA reduce by rule 239 + CELLSET reduce by rule 239 + STORAGE reduce by rule 239 + LOCATIONS reduce by rule 239 + HASH reduce by rule 239 + COMMA reduce by rule 239 + COLON reduce by rule 239 + AT reduce by rule 239 + BAR reduce by rule 239 + DARROW reduce by rule 239 + THEN reduce by rule 239 + ELSE reduce by rule 239 + TRUE reduce by rule 239 + FALSE reduce by rule 239 + WILD reduce by rule 239 + HANDLE reduce by rule 239 + LET reduce by rule 239 + STRUCTURE reduce by rule 239 + FUNCTOR reduce by rule 239 + SIGNATURE reduce by rule 239 + WHERE reduce by rule 239 + SHARING reduce by rule 239 + INSTRUCTION reduce by rule 239 + VLIW reduce by rule 239 + SUPERSCALAR reduce by rule 239 + WITHTYPE reduce by rule 239 + FUN reduce by rule 239 + VAL reduce by rule 239 + INCLUDE reduce by rule 239 + OPEN reduce by rule 239 + OP reduce by rule 239 + LITTLE reduce by rule 239 + BIG reduce by rule 239 + PIPELINE reduce by rule 239 + LOWERCASE reduce by rule 239 + UPPERCASE reduce by rule 239 + VERBATIM reduce by rule 239 + RTL reduce by rule 239 + SPAN reduce by rule 239 + DELAYSLOT reduce by rule 239 + ALWAYS reduce by rule 239 + NEVER reduce by rule 239 + NONFIX reduce by rule 239 + INFIX reduce by rule 239 + INFIXR reduce by rule 239 + DEBUG reduce by rule 239 + ASM_COLON reduce by rule 239 + MC_COLON reduce by rule 239 + RTL_COLON reduce by rule 239 + DELAYSLOT_COLON reduce by rule 239 + NULLIFIED_COLON reduce by rule 239 + PADDING_COLON reduce by rule 239 + RESOURCE reduce by rule 239 + CPU reduce by rule 239 + LATENCY reduce by rule 239 + EXCEPTION reduce by rule 239 + ID reduce by rule 239 + SYMBOL reduce by rule 239 + WORD reduce by rule 239 + INT reduce by rule 239 + INTINF reduce by rule 239 + REAL reduce by rule 239 + STRING reduce by rule 239 + CHAR reduce by rule 239 + EOF reduce by rule 239 + + + . error + + + state 77: + + literal : char . (reduce by rule 238) + + ARCHITECTURE reduce by rule 238 + END reduce by rule 238 + LOCAL reduce by rule 238 + IN reduce by rule 238 + OF reduce by rule 238 + DATATYPE reduce by rule 238 + TYPE reduce by rule 238 + EQ reduce by rule 238 + DOLLAR reduce by rule 238 + TIMES reduce by rule 238 + AND reduce by rule 238 + DEREF reduce by rule 238 + NOT reduce by rule 238 + LLBRACKET reduce by rule 238 + LHASHBRACKET reduce by rule 238 + LPAREN reduce by rule 238 + RPAREN reduce by rule 238 + LBRACKET reduce by rule 238 + RBRACKET reduce by rule 238 + LBRACE reduce by rule 238 + RBRACE reduce by rule 238 + SEMICOLON reduce by rule 238 + LDQUOTE reduce by rule 238 + RMETA reduce by rule 238 + CELLSET reduce by rule 238 + STORAGE reduce by rule 238 + LOCATIONS reduce by rule 238 + HASH reduce by rule 238 + COMMA reduce by rule 238 + COLON reduce by rule 238 + AT reduce by rule 238 + BAR reduce by rule 238 + DARROW reduce by rule 238 + THEN reduce by rule 238 + ELSE reduce by rule 238 + TRUE reduce by rule 238 + FALSE reduce by rule 238 + WILD reduce by rule 238 + HANDLE reduce by rule 238 + LET reduce by rule 238 + STRUCTURE reduce by rule 238 + FUNCTOR reduce by rule 238 + SIGNATURE reduce by rule 238 + WHERE reduce by rule 238 + SHARING reduce by rule 238 + INSTRUCTION reduce by rule 238 + VLIW reduce by rule 238 + SUPERSCALAR reduce by rule 238 + WITHTYPE reduce by rule 238 + FUN reduce by rule 238 + VAL reduce by rule 238 + INCLUDE reduce by rule 238 + OPEN reduce by rule 238 + OP reduce by rule 238 + LITTLE reduce by rule 238 + BIG reduce by rule 238 + PIPELINE reduce by rule 238 + LOWERCASE reduce by rule 238 + UPPERCASE reduce by rule 238 + VERBATIM reduce by rule 238 + RTL reduce by rule 238 + SPAN reduce by rule 238 + DELAYSLOT reduce by rule 238 + ALWAYS reduce by rule 238 + NEVER reduce by rule 238 + NONFIX reduce by rule 238 + INFIX reduce by rule 238 + INFIXR reduce by rule 238 + DEBUG reduce by rule 238 + ASM_COLON reduce by rule 238 + MC_COLON reduce by rule 238 + RTL_COLON reduce by rule 238 + DELAYSLOT_COLON reduce by rule 238 + NULLIFIED_COLON reduce by rule 238 + PADDING_COLON reduce by rule 238 + RESOURCE reduce by rule 238 + CPU reduce by rule 238 + LATENCY reduce by rule 238 + EXCEPTION reduce by rule 238 + ID reduce by rule 238 + SYMBOL reduce by rule 238 + WORD reduce by rule 238 + INT reduce by rule 238 + INTINF reduce by rule 238 + REAL reduce by rule 238 + STRING reduce by rule 238 + CHAR reduce by rule 238 + EOF reduce by rule 238 + + + . error + + + state 78: + + literal : string . (reduce by rule 237) + + ARCHITECTURE reduce by rule 237 + END reduce by rule 237 + LOCAL reduce by rule 237 + IN reduce by rule 237 + OF reduce by rule 237 + DATATYPE reduce by rule 237 + TYPE reduce by rule 237 + EQ reduce by rule 237 + DOLLAR reduce by rule 237 + TIMES reduce by rule 237 + AND reduce by rule 237 + DEREF reduce by rule 237 + NOT reduce by rule 237 + LLBRACKET reduce by rule 237 + LHASHBRACKET reduce by rule 237 + LPAREN reduce by rule 237 + RPAREN reduce by rule 237 + LBRACKET reduce by rule 237 + RBRACKET reduce by rule 237 + LBRACE reduce by rule 237 + RBRACE reduce by rule 237 + SEMICOLON reduce by rule 237 + LDQUOTE reduce by rule 237 + RMETA reduce by rule 237 + CELLSET reduce by rule 237 + STORAGE reduce by rule 237 + LOCATIONS reduce by rule 237 + HASH reduce by rule 237 + COMMA reduce by rule 237 + COLON reduce by rule 237 + AT reduce by rule 237 + BAR reduce by rule 237 + DARROW reduce by rule 237 + THEN reduce by rule 237 + ELSE reduce by rule 237 + TRUE reduce by rule 237 + FALSE reduce by rule 237 + WILD reduce by rule 237 + HANDLE reduce by rule 237 + LET reduce by rule 237 + STRUCTURE reduce by rule 237 + FUNCTOR reduce by rule 237 + SIGNATURE reduce by rule 237 + WHERE reduce by rule 237 + SHARING reduce by rule 237 + INSTRUCTION reduce by rule 237 + VLIW reduce by rule 237 + SUPERSCALAR reduce by rule 237 + WITHTYPE reduce by rule 237 + FUN reduce by rule 237 + VAL reduce by rule 237 + INCLUDE reduce by rule 237 + OPEN reduce by rule 237 + OP reduce by rule 237 + LITTLE reduce by rule 237 + BIG reduce by rule 237 + PIPELINE reduce by rule 237 + LOWERCASE reduce by rule 237 + UPPERCASE reduce by rule 237 + VERBATIM reduce by rule 237 + RTL reduce by rule 237 + SPAN reduce by rule 237 + DELAYSLOT reduce by rule 237 + ALWAYS reduce by rule 237 + NEVER reduce by rule 237 + NONFIX reduce by rule 237 + INFIX reduce by rule 237 + INFIXR reduce by rule 237 + DEBUG reduce by rule 237 + ASM_COLON reduce by rule 237 + MC_COLON reduce by rule 237 + RTL_COLON reduce by rule 237 + DELAYSLOT_COLON reduce by rule 237 + NULLIFIED_COLON reduce by rule 237 + PADDING_COLON reduce by rule 237 + RESOURCE reduce by rule 237 + CPU reduce by rule 237 + LATENCY reduce by rule 237 + EXCEPTION reduce by rule 237 + ID reduce by rule 237 + SYMBOL reduce by rule 237 + WORD reduce by rule 237 + INT reduce by rule 237 + INTINF reduce by rule 237 + REAL reduce by rule 237 + STRING reduce by rule 237 + CHAR reduce by rule 237 + EOF reduce by rule 237 + + + . error + + + state 79: + + literal : real . (reduce by rule 240) + + ARCHITECTURE reduce by rule 240 + END reduce by rule 240 + LOCAL reduce by rule 240 + IN reduce by rule 240 + OF reduce by rule 240 + DATATYPE reduce by rule 240 + TYPE reduce by rule 240 + EQ reduce by rule 240 + DOLLAR reduce by rule 240 + TIMES reduce by rule 240 + AND reduce by rule 240 + DEREF reduce by rule 240 + NOT reduce by rule 240 + LLBRACKET reduce by rule 240 + LHASHBRACKET reduce by rule 240 + LPAREN reduce by rule 240 + RPAREN reduce by rule 240 + LBRACKET reduce by rule 240 + RBRACKET reduce by rule 240 + LBRACE reduce by rule 240 + RBRACE reduce by rule 240 + SEMICOLON reduce by rule 240 + LDQUOTE reduce by rule 240 + RMETA reduce by rule 240 + CELLSET reduce by rule 240 + STORAGE reduce by rule 240 + LOCATIONS reduce by rule 240 + HASH reduce by rule 240 + COMMA reduce by rule 240 + COLON reduce by rule 240 + AT reduce by rule 240 + BAR reduce by rule 240 + DARROW reduce by rule 240 + THEN reduce by rule 240 + ELSE reduce by rule 240 + TRUE reduce by rule 240 + FALSE reduce by rule 240 + WILD reduce by rule 240 + HANDLE reduce by rule 240 + LET reduce by rule 240 + STRUCTURE reduce by rule 240 + FUNCTOR reduce by rule 240 + SIGNATURE reduce by rule 240 + WHERE reduce by rule 240 + SHARING reduce by rule 240 + INSTRUCTION reduce by rule 240 + VLIW reduce by rule 240 + SUPERSCALAR reduce by rule 240 + WITHTYPE reduce by rule 240 + FUN reduce by rule 240 + VAL reduce by rule 240 + INCLUDE reduce by rule 240 + OPEN reduce by rule 240 + OP reduce by rule 240 + LITTLE reduce by rule 240 + BIG reduce by rule 240 + PIPELINE reduce by rule 240 + LOWERCASE reduce by rule 240 + UPPERCASE reduce by rule 240 + VERBATIM reduce by rule 240 + RTL reduce by rule 240 + SPAN reduce by rule 240 + DELAYSLOT reduce by rule 240 + ALWAYS reduce by rule 240 + NEVER reduce by rule 240 + NONFIX reduce by rule 240 + INFIX reduce by rule 240 + INFIXR reduce by rule 240 + DEBUG reduce by rule 240 + ASM_COLON reduce by rule 240 + MC_COLON reduce by rule 240 + RTL_COLON reduce by rule 240 + DELAYSLOT_COLON reduce by rule 240 + NULLIFIED_COLON reduce by rule 240 + PADDING_COLON reduce by rule 240 + RESOURCE reduce by rule 240 + CPU reduce by rule 240 + LATENCY reduce by rule 240 + EXCEPTION reduce by rule 240 + ID reduce by rule 240 + SYMBOL reduce by rule 240 + WORD reduce by rule 240 + INT reduce by rule 240 + INTINF reduce by rule 240 + REAL reduce by rule 240 + STRING reduce by rule 240 + CHAR reduce by rule 240 + EOF reduce by rule 240 + + + . error + + + state 80: + + literal : intinf . (reduce by rule 236) + + ARCHITECTURE reduce by rule 236 + END reduce by rule 236 + LOCAL reduce by rule 236 + IN reduce by rule 236 + OF reduce by rule 236 + DATATYPE reduce by rule 236 + TYPE reduce by rule 236 + EQ reduce by rule 236 + DOLLAR reduce by rule 236 + TIMES reduce by rule 236 + AND reduce by rule 236 + DEREF reduce by rule 236 + NOT reduce by rule 236 + LLBRACKET reduce by rule 236 + LHASHBRACKET reduce by rule 236 + LPAREN reduce by rule 236 + RPAREN reduce by rule 236 + LBRACKET reduce by rule 236 + RBRACKET reduce by rule 236 + LBRACE reduce by rule 236 + RBRACE reduce by rule 236 + SEMICOLON reduce by rule 236 + LDQUOTE reduce by rule 236 + RMETA reduce by rule 236 + CELLSET reduce by rule 236 + STORAGE reduce by rule 236 + LOCATIONS reduce by rule 236 + HASH reduce by rule 236 + COMMA reduce by rule 236 + COLON reduce by rule 236 + AT reduce by rule 236 + BAR reduce by rule 236 + DARROW reduce by rule 236 + THEN reduce by rule 236 + ELSE reduce by rule 236 + TRUE reduce by rule 236 + FALSE reduce by rule 236 + WILD reduce by rule 236 + HANDLE reduce by rule 236 + LET reduce by rule 236 + STRUCTURE reduce by rule 236 + FUNCTOR reduce by rule 236 + SIGNATURE reduce by rule 236 + WHERE reduce by rule 236 + SHARING reduce by rule 236 + INSTRUCTION reduce by rule 236 + VLIW reduce by rule 236 + SUPERSCALAR reduce by rule 236 + WITHTYPE reduce by rule 236 + FUN reduce by rule 236 + VAL reduce by rule 236 + INCLUDE reduce by rule 236 + OPEN reduce by rule 236 + OP reduce by rule 236 + LITTLE reduce by rule 236 + BIG reduce by rule 236 + PIPELINE reduce by rule 236 + LOWERCASE reduce by rule 236 + UPPERCASE reduce by rule 236 + VERBATIM reduce by rule 236 + RTL reduce by rule 236 + SPAN reduce by rule 236 + DELAYSLOT reduce by rule 236 + ALWAYS reduce by rule 236 + NEVER reduce by rule 236 + NONFIX reduce by rule 236 + INFIX reduce by rule 236 + INFIXR reduce by rule 236 + DEBUG reduce by rule 236 + ASM_COLON reduce by rule 236 + MC_COLON reduce by rule 236 + RTL_COLON reduce by rule 236 + DELAYSLOT_COLON reduce by rule 236 + NULLIFIED_COLON reduce by rule 236 + PADDING_COLON reduce by rule 236 + RESOURCE reduce by rule 236 + CPU reduce by rule 236 + LATENCY reduce by rule 236 + EXCEPTION reduce by rule 236 + ID reduce by rule 236 + SYMBOL reduce by rule 236 + WORD reduce by rule 236 + INT reduce by rule 236 + INTINF reduce by rule 236 + REAL reduce by rule 236 + STRING reduce by rule 236 + CHAR reduce by rule 236 + EOF reduce by rule 236 + + + . error + + + state 81: + + literal : int . (reduce by rule 235) + + ARCHITECTURE reduce by rule 235 + END reduce by rule 235 + LOCAL reduce by rule 235 + IN reduce by rule 235 + OF reduce by rule 235 + DATATYPE reduce by rule 235 + TYPE reduce by rule 235 + EQ reduce by rule 235 + DOLLAR reduce by rule 235 + TIMES reduce by rule 235 + AND reduce by rule 235 + DEREF reduce by rule 235 + NOT reduce by rule 235 + LLBRACKET reduce by rule 235 + LHASHBRACKET reduce by rule 235 + LPAREN reduce by rule 235 + RPAREN reduce by rule 235 + LBRACKET reduce by rule 235 + RBRACKET reduce by rule 235 + LBRACE reduce by rule 235 + RBRACE reduce by rule 235 + SEMICOLON reduce by rule 235 + LDQUOTE reduce by rule 235 + RMETA reduce by rule 235 + CELLSET reduce by rule 235 + STORAGE reduce by rule 235 + LOCATIONS reduce by rule 235 + HASH reduce by rule 235 + COMMA reduce by rule 235 + COLON reduce by rule 235 + AT reduce by rule 235 + BAR reduce by rule 235 + DARROW reduce by rule 235 + THEN reduce by rule 235 + ELSE reduce by rule 235 + TRUE reduce by rule 235 + FALSE reduce by rule 235 + WILD reduce by rule 235 + HANDLE reduce by rule 235 + LET reduce by rule 235 + STRUCTURE reduce by rule 235 + FUNCTOR reduce by rule 235 + SIGNATURE reduce by rule 235 + WHERE reduce by rule 235 + SHARING reduce by rule 235 + INSTRUCTION reduce by rule 235 + VLIW reduce by rule 235 + SUPERSCALAR reduce by rule 235 + WITHTYPE reduce by rule 235 + FUN reduce by rule 235 + VAL reduce by rule 235 + INCLUDE reduce by rule 235 + OPEN reduce by rule 235 + OP reduce by rule 235 + LITTLE reduce by rule 235 + BIG reduce by rule 235 + PIPELINE reduce by rule 235 + LOWERCASE reduce by rule 235 + UPPERCASE reduce by rule 235 + VERBATIM reduce by rule 235 + RTL reduce by rule 235 + SPAN reduce by rule 235 + DELAYSLOT reduce by rule 235 + ALWAYS reduce by rule 235 + NEVER reduce by rule 235 + NONFIX reduce by rule 235 + INFIX reduce by rule 235 + INFIXR reduce by rule 235 + DEBUG reduce by rule 235 + ASM_COLON reduce by rule 235 + MC_COLON reduce by rule 235 + RTL_COLON reduce by rule 235 + DELAYSLOT_COLON reduce by rule 235 + NULLIFIED_COLON reduce by rule 235 + PADDING_COLON reduce by rule 235 + RESOURCE reduce by rule 235 + CPU reduce by rule 235 + LATENCY reduce by rule 235 + EXCEPTION reduce by rule 235 + ID reduce by rule 235 + SYMBOL reduce by rule 235 + WORD reduce by rule 235 + INT reduce by rule 235 + INTINF reduce by rule 235 + REAL reduce by rule 235 + STRING reduce by rule 235 + CHAR reduce by rule 235 + EOF reduce by rule 235 + + + . error + + + state 82: + + literal : word . (reduce by rule 234) + + ARCHITECTURE reduce by rule 234 + END reduce by rule 234 + LOCAL reduce by rule 234 + IN reduce by rule 234 + OF reduce by rule 234 + DATATYPE reduce by rule 234 + TYPE reduce by rule 234 + EQ reduce by rule 234 + DOLLAR reduce by rule 234 + TIMES reduce by rule 234 + AND reduce by rule 234 + DEREF reduce by rule 234 + NOT reduce by rule 234 + LLBRACKET reduce by rule 234 + LHASHBRACKET reduce by rule 234 + LPAREN reduce by rule 234 + RPAREN reduce by rule 234 + LBRACKET reduce by rule 234 + RBRACKET reduce by rule 234 + LBRACE reduce by rule 234 + RBRACE reduce by rule 234 + SEMICOLON reduce by rule 234 + LDQUOTE reduce by rule 234 + RMETA reduce by rule 234 + CELLSET reduce by rule 234 + STORAGE reduce by rule 234 + LOCATIONS reduce by rule 234 + HASH reduce by rule 234 + COMMA reduce by rule 234 + COLON reduce by rule 234 + AT reduce by rule 234 + BAR reduce by rule 234 + DARROW reduce by rule 234 + THEN reduce by rule 234 + ELSE reduce by rule 234 + TRUE reduce by rule 234 + FALSE reduce by rule 234 + WILD reduce by rule 234 + HANDLE reduce by rule 234 + LET reduce by rule 234 + STRUCTURE reduce by rule 234 + FUNCTOR reduce by rule 234 + SIGNATURE reduce by rule 234 + WHERE reduce by rule 234 + SHARING reduce by rule 234 + INSTRUCTION reduce by rule 234 + VLIW reduce by rule 234 + SUPERSCALAR reduce by rule 234 + WITHTYPE reduce by rule 234 + FUN reduce by rule 234 + VAL reduce by rule 234 + INCLUDE reduce by rule 234 + OPEN reduce by rule 234 + OP reduce by rule 234 + LITTLE reduce by rule 234 + BIG reduce by rule 234 + PIPELINE reduce by rule 234 + LOWERCASE reduce by rule 234 + UPPERCASE reduce by rule 234 + VERBATIM reduce by rule 234 + RTL reduce by rule 234 + SPAN reduce by rule 234 + DELAYSLOT reduce by rule 234 + ALWAYS reduce by rule 234 + NEVER reduce by rule 234 + NONFIX reduce by rule 234 + INFIX reduce by rule 234 + INFIXR reduce by rule 234 + DEBUG reduce by rule 234 + ASM_COLON reduce by rule 234 + MC_COLON reduce by rule 234 + RTL_COLON reduce by rule 234 + DELAYSLOT_COLON reduce by rule 234 + NULLIFIED_COLON reduce by rule 234 + PADDING_COLON reduce by rule 234 + RESOURCE reduce by rule 234 + CPU reduce by rule 234 + LATENCY reduce by rule 234 + EXCEPTION reduce by rule 234 + ID reduce by rule 234 + SYMBOL reduce by rule 234 + WORD reduce by rule 234 + INT reduce by rule 234 + INTINF reduce by rule 234 + REAL reduce by rule 234 + STRING reduce by rule 234 + CHAR reduce by rule 234 + EOF reduce by rule 234 + + + . error + + + state 83: + + mymldecl : RTL asapat . EQ exp + + EQ shift 181 + + + . error + + + state 84: + + asapat : apat . (reduce by rule 319) + + EQ reduce by rule 319 + + + . error + + + state 85: + + ident2 : path . (reduce by rule 423) + path : path . DOT sym + + ARCHITECTURE reduce by rule 423 + END reduce by rule 423 + LOCAL reduce by rule 423 + IN reduce by rule 423 + OF reduce by rule 423 + DATATYPE reduce by rule 423 + TYPE reduce by rule 423 + EQ reduce by rule 423 + DOLLAR reduce by rule 423 + TIMES reduce by rule 423 + AND reduce by rule 423 + DEREF reduce by rule 423 + NOT reduce by rule 423 + LLBRACKET reduce by rule 423 + LHASHBRACKET reduce by rule 423 + LPAREN reduce by rule 423 + RPAREN reduce by rule 423 + LBRACKET reduce by rule 423 + RBRACKET reduce by rule 423 + LBRACE reduce by rule 423 + RBRACE reduce by rule 423 + SEMICOLON reduce by rule 423 + LDQUOTE reduce by rule 423 + RMETA reduce by rule 423 + CELLSET reduce by rule 423 + STORAGE reduce by rule 423 + LOCATIONS reduce by rule 423 + HASH reduce by rule 423 + COMMA reduce by rule 423 + COLON reduce by rule 423 + DOT shift 182 + AT reduce by rule 423 + BAR reduce by rule 423 + DARROW reduce by rule 423 + THEN reduce by rule 423 + ELSE reduce by rule 423 + TRUE reduce by rule 423 + FALSE reduce by rule 423 + WILD reduce by rule 423 + HANDLE reduce by rule 423 + LET reduce by rule 423 + STRUCTURE reduce by rule 423 + FUNCTOR reduce by rule 423 + SIGNATURE reduce by rule 423 + WHERE reduce by rule 423 + SHARING reduce by rule 423 + INSTRUCTION reduce by rule 423 + VLIW reduce by rule 423 + SUPERSCALAR reduce by rule 423 + WITHTYPE reduce by rule 423 + FUN reduce by rule 423 + VAL reduce by rule 423 + INCLUDE reduce by rule 423 + OPEN reduce by rule 423 + OP reduce by rule 423 + LITTLE reduce by rule 423 + BIG reduce by rule 423 + PIPELINE reduce by rule 423 + LOWERCASE reduce by rule 423 + UPPERCASE reduce by rule 423 + VERBATIM reduce by rule 423 + RTL reduce by rule 423 + SPAN reduce by rule 423 + DELAYSLOT reduce by rule 423 + ALWAYS reduce by rule 423 + NEVER reduce by rule 423 + NONFIX reduce by rule 423 + INFIX reduce by rule 423 + INFIXR reduce by rule 423 + DEBUG reduce by rule 423 + ASM_COLON reduce by rule 423 + MC_COLON reduce by rule 423 + RTL_COLON reduce by rule 423 + DELAYSLOT_COLON reduce by rule 423 + NULLIFIED_COLON reduce by rule 423 + PADDING_COLON reduce by rule 423 + RESOURCE reduce by rule 423 + CPU reduce by rule 423 + LATENCY reduce by rule 423 + EXCEPTION reduce by rule 423 + ID reduce by rule 423 + SYMBOL reduce by rule 423 + WORD reduce by rule 423 + INT reduce by rule 423 + INTINF reduce by rule 423 + REAL reduce by rule 423 + STRING reduce by rule 423 + CHAR reduce by rule 423 + EOF reduce by rule 423 + + + . error + + + state 86: + + mymldecl : RTL syms . COLON ty + + COLON shift 183 + + + . error + + + state 87: + + apat : ident2 . (reduce by rule 290) + + EQ reduce by rule 290 + TIMES reduce by rule 290 + AND reduce by rule 290 + DEREF reduce by rule 290 + NOT reduce by rule 290 + LHASHBRACKET reduce by rule 290 + LPAREN reduce by rule 290 + RPAREN reduce by rule 290 + LBRACKET reduce by rule 290 + RBRACKET reduce by rule 290 + LBRACE reduce by rule 290 + RBRACE reduce by rule 290 + CELLSET reduce by rule 290 + COMMA reduce by rule 290 + COLON reduce by rule 290 + BAR reduce by rule 290 + DARROW reduce by rule 290 + TRUE reduce by rule 290 + FALSE reduce by rule 290 + WILD reduce by rule 290 + WHERE reduce by rule 290 + OP reduce by rule 290 + ALWAYS reduce by rule 290 + NEVER reduce by rule 290 + EXCEPTION reduce by rule 290 + ID reduce by rule 290 + SYMBOL reduce by rule 290 + WORD reduce by rule 290 + INT reduce by rule 290 + INTINF reduce by rule 290 + REAL reduce by rule 290 + STRING reduce by rule 290 + CHAR reduce by rule 290 + + + . error + + + state 88: + + syms : sym . (reduce by rule 109) + syms : sym . syms + apat : sym . CONCAT LBRACKET pats RBRACKET + apat : sym . CONCAT LBRACKET pats RBRACKET CONCAT sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CONCAT shift 184 + CELLSET shift 50 + COLON reduce by rule 109 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 68 + symb goto 67 + syms goto 180 + + . error + + + state 89: + + sym : id . (reduce by rule 416) + path : id . DOT sym + mymldecl : RTL id . LBRACE labpats0 RBRACE EQ exp + asapat : id . AS asapat + + TIMES reduce by rule 416 + DEREF reduce by rule 416 + NOT reduce by rule 416 + CONCAT reduce by rule 416 + LBRACE shift 187 + CELLSET reduce by rule 416 + COLON reduce by rule 416 + DOT shift 186 + AS shift 185 + ID reduce by rule 416 + SYMBOL reduce by rule 416 + + + . error + + + state 90: + + char : CHAR . (reduce by rule 429) + + ARCHITECTURE reduce by rule 429 + END reduce by rule 429 + LOCAL reduce by rule 429 + IN reduce by rule 429 + OF reduce by rule 429 + DATATYPE reduce by rule 429 + TYPE reduce by rule 429 + EQ reduce by rule 429 + DOLLAR reduce by rule 429 + TIMES reduce by rule 429 + AND reduce by rule 429 + DEREF reduce by rule 429 + NOT reduce by rule 429 + LLBRACKET reduce by rule 429 + LHASHBRACKET reduce by rule 429 + LPAREN reduce by rule 429 + RPAREN reduce by rule 429 + LBRACKET reduce by rule 429 + RBRACKET reduce by rule 429 + LBRACE reduce by rule 429 + RBRACE reduce by rule 429 + SEMICOLON reduce by rule 429 + LDQUOTE reduce by rule 429 + RMETA reduce by rule 429 + CELLSET reduce by rule 429 + STORAGE reduce by rule 429 + LOCATIONS reduce by rule 429 + HASH reduce by rule 429 + COMMA reduce by rule 429 + COLON reduce by rule 429 + AT reduce by rule 429 + BAR reduce by rule 429 + DARROW reduce by rule 429 + THEN reduce by rule 429 + ELSE reduce by rule 429 + TRUE reduce by rule 429 + FALSE reduce by rule 429 + WILD reduce by rule 429 + HANDLE reduce by rule 429 + LET reduce by rule 429 + STRUCTURE reduce by rule 429 + FUNCTOR reduce by rule 429 + SIGNATURE reduce by rule 429 + WHERE reduce by rule 429 + SHARING reduce by rule 429 + INSTRUCTION reduce by rule 429 + VLIW reduce by rule 429 + SUPERSCALAR reduce by rule 429 + WITHTYPE reduce by rule 429 + FUN reduce by rule 429 + VAL reduce by rule 429 + INCLUDE reduce by rule 429 + OPEN reduce by rule 429 + OP reduce by rule 429 + LITTLE reduce by rule 429 + BIG reduce by rule 429 + PIPELINE reduce by rule 429 + LOWERCASE reduce by rule 429 + UPPERCASE reduce by rule 429 + VERBATIM reduce by rule 429 + RTL reduce by rule 429 + SPAN reduce by rule 429 + DELAYSLOT reduce by rule 429 + ALWAYS reduce by rule 429 + NEVER reduce by rule 429 + NONFIX reduce by rule 429 + INFIX reduce by rule 429 + INFIXR reduce by rule 429 + DEBUG reduce by rule 429 + ASM_COLON reduce by rule 429 + MC_COLON reduce by rule 429 + RTL_COLON reduce by rule 429 + DELAYSLOT_COLON reduce by rule 429 + NULLIFIED_COLON reduce by rule 429 + PADDING_COLON reduce by rule 429 + RESOURCE reduce by rule 429 + CPU reduce by rule 429 + LATENCY reduce by rule 429 + EXCEPTION reduce by rule 429 + ID reduce by rule 429 + SYMBOL reduce by rule 429 + WORD reduce by rule 429 + INT reduce by rule 429 + INTINF reduce by rule 429 + REAL reduce by rule 429 + STRING reduce by rule 429 + CHAR reduce by rule 429 + EOF reduce by rule 429 + + + . error + + + state 91: + + string : STRING . (reduce by rule 428) + + ARCHITECTURE reduce by rule 428 + END reduce by rule 428 + LOCAL reduce by rule 428 + IN reduce by rule 428 + OF reduce by rule 428 + DATATYPE reduce by rule 428 + TYPE reduce by rule 428 + EQ reduce by rule 428 + DOLLAR reduce by rule 428 + TIMES reduce by rule 428 + AND reduce by rule 428 + DEREF reduce by rule 428 + NOT reduce by rule 428 + LLBRACKET reduce by rule 428 + RRBRACKET reduce by rule 428 + LHASHBRACKET reduce by rule 428 + LPAREN reduce by rule 428 + RPAREN reduce by rule 428 + LBRACKET reduce by rule 428 + RBRACKET reduce by rule 428 + LBRACE reduce by rule 428 + RBRACE reduce by rule 428 + SEMICOLON reduce by rule 428 + LDQUOTE reduce by rule 428 + RMETA reduce by rule 428 + CELLSET reduce by rule 428 + STORAGE reduce by rule 428 + LOCATIONS reduce by rule 428 + HASH reduce by rule 428 + COMMA reduce by rule 428 + COLON reduce by rule 428 + AT reduce by rule 428 + BAR reduce by rule 428 + DARROW reduce by rule 428 + THEN reduce by rule 428 + ELSE reduce by rule 428 + TRUE reduce by rule 428 + FALSE reduce by rule 428 + WILD reduce by rule 428 + HANDLE reduce by rule 428 + LET reduce by rule 428 + STRUCTURE reduce by rule 428 + FUNCTOR reduce by rule 428 + SIGNATURE reduce by rule 428 + WHERE reduce by rule 428 + SHARING reduce by rule 428 + INSTRUCTION reduce by rule 428 + VLIW reduce by rule 428 + SUPERSCALAR reduce by rule 428 + WITHTYPE reduce by rule 428 + FUN reduce by rule 428 + VAL reduce by rule 428 + INCLUDE reduce by rule 428 + OPEN reduce by rule 428 + OP reduce by rule 428 + LITTLE reduce by rule 428 + BIG reduce by rule 428 + PIPELINE reduce by rule 428 + LOWERCASE reduce by rule 428 + UPPERCASE reduce by rule 428 + VERBATIM reduce by rule 428 + RTL reduce by rule 428 + SPAN reduce by rule 428 + DELAYSLOT reduce by rule 428 + ALWAYS reduce by rule 428 + NEVER reduce by rule 428 + NONFIX reduce by rule 428 + INFIX reduce by rule 428 + INFIXR reduce by rule 428 + DEBUG reduce by rule 428 + ASM_COLON reduce by rule 428 + MC_COLON reduce by rule 428 + RTL_COLON reduce by rule 428 + DELAYSLOT_COLON reduce by rule 428 + NULLIFIED_COLON reduce by rule 428 + PADDING_COLON reduce by rule 428 + RESOURCE reduce by rule 428 + CPU reduce by rule 428 + LATENCY reduce by rule 428 + EXCEPTION reduce by rule 428 + ID reduce by rule 428 + SYMBOL reduce by rule 428 + WORD reduce by rule 428 + INT reduce by rule 428 + INTINF reduce by rule 428 + REAL reduce by rule 428 + STRING reduce by rule 428 + CHAR reduce by rule 428 + EOF reduce by rule 428 + + + . error + + + state 92: + + real : REAL . (reduce by rule 399) + + ARCHITECTURE reduce by rule 399 + END reduce by rule 399 + LOCAL reduce by rule 399 + IN reduce by rule 399 + OF reduce by rule 399 + DATATYPE reduce by rule 399 + TYPE reduce by rule 399 + EQ reduce by rule 399 + DOLLAR reduce by rule 399 + TIMES reduce by rule 399 + AND reduce by rule 399 + DEREF reduce by rule 399 + NOT reduce by rule 399 + LLBRACKET reduce by rule 399 + LHASHBRACKET reduce by rule 399 + LPAREN reduce by rule 399 + RPAREN reduce by rule 399 + LBRACKET reduce by rule 399 + RBRACKET reduce by rule 399 + LBRACE reduce by rule 399 + RBRACE reduce by rule 399 + SEMICOLON reduce by rule 399 + LDQUOTE reduce by rule 399 + RMETA reduce by rule 399 + CELLSET reduce by rule 399 + STORAGE reduce by rule 399 + LOCATIONS reduce by rule 399 + HASH reduce by rule 399 + COMMA reduce by rule 399 + COLON reduce by rule 399 + AT reduce by rule 399 + BAR reduce by rule 399 + DARROW reduce by rule 399 + THEN reduce by rule 399 + ELSE reduce by rule 399 + TRUE reduce by rule 399 + FALSE reduce by rule 399 + WILD reduce by rule 399 + HANDLE reduce by rule 399 + LET reduce by rule 399 + STRUCTURE reduce by rule 399 + FUNCTOR reduce by rule 399 + SIGNATURE reduce by rule 399 + WHERE reduce by rule 399 + SHARING reduce by rule 399 + INSTRUCTION reduce by rule 399 + VLIW reduce by rule 399 + SUPERSCALAR reduce by rule 399 + WITHTYPE reduce by rule 399 + FUN reduce by rule 399 + VAL reduce by rule 399 + INCLUDE reduce by rule 399 + OPEN reduce by rule 399 + OP reduce by rule 399 + LITTLE reduce by rule 399 + BIG reduce by rule 399 + PIPELINE reduce by rule 399 + LOWERCASE reduce by rule 399 + UPPERCASE reduce by rule 399 + VERBATIM reduce by rule 399 + RTL reduce by rule 399 + SPAN reduce by rule 399 + DELAYSLOT reduce by rule 399 + ALWAYS reduce by rule 399 + NEVER reduce by rule 399 + NONFIX reduce by rule 399 + INFIX reduce by rule 399 + INFIXR reduce by rule 399 + DEBUG reduce by rule 399 + ASM_COLON reduce by rule 399 + MC_COLON reduce by rule 399 + RTL_COLON reduce by rule 399 + DELAYSLOT_COLON reduce by rule 399 + NULLIFIED_COLON reduce by rule 399 + PADDING_COLON reduce by rule 399 + RESOURCE reduce by rule 399 + CPU reduce by rule 399 + LATENCY reduce by rule 399 + EXCEPTION reduce by rule 399 + ID reduce by rule 399 + SYMBOL reduce by rule 399 + WORD reduce by rule 399 + INT reduce by rule 399 + INTINF reduce by rule 399 + REAL reduce by rule 399 + STRING reduce by rule 399 + CHAR reduce by rule 399 + EOF reduce by rule 399 + + + . error + + + state 93: + + intinf : INTINF . (reduce by rule 398) + + ARCHITECTURE reduce by rule 398 + END reduce by rule 398 + LOCAL reduce by rule 398 + IN reduce by rule 398 + OF reduce by rule 398 + DATATYPE reduce by rule 398 + TYPE reduce by rule 398 + EQ reduce by rule 398 + DOLLAR reduce by rule 398 + TIMES reduce by rule 398 + AND reduce by rule 398 + DEREF reduce by rule 398 + NOT reduce by rule 398 + LLBRACKET reduce by rule 398 + LHASHBRACKET reduce by rule 398 + LPAREN reduce by rule 398 + RPAREN reduce by rule 398 + LBRACKET reduce by rule 398 + RBRACKET reduce by rule 398 + LBRACE reduce by rule 398 + RBRACE reduce by rule 398 + SEMICOLON reduce by rule 398 + LDQUOTE reduce by rule 398 + RMETA reduce by rule 398 + CELLSET reduce by rule 398 + STORAGE reduce by rule 398 + LOCATIONS reduce by rule 398 + HASH reduce by rule 398 + COMMA reduce by rule 398 + COLON reduce by rule 398 + AT reduce by rule 398 + BAR reduce by rule 398 + DARROW reduce by rule 398 + THEN reduce by rule 398 + ELSE reduce by rule 398 + TRUE reduce by rule 398 + FALSE reduce by rule 398 + WILD reduce by rule 398 + HANDLE reduce by rule 398 + LET reduce by rule 398 + STRUCTURE reduce by rule 398 + FUNCTOR reduce by rule 398 + SIGNATURE reduce by rule 398 + WHERE reduce by rule 398 + SHARING reduce by rule 398 + INSTRUCTION reduce by rule 398 + VLIW reduce by rule 398 + SUPERSCALAR reduce by rule 398 + WITHTYPE reduce by rule 398 + FUN reduce by rule 398 + VAL reduce by rule 398 + INCLUDE reduce by rule 398 + OPEN reduce by rule 398 + OP reduce by rule 398 + LITTLE reduce by rule 398 + BIG reduce by rule 398 + PIPELINE reduce by rule 398 + LOWERCASE reduce by rule 398 + UPPERCASE reduce by rule 398 + VERBATIM reduce by rule 398 + RTL reduce by rule 398 + SPAN reduce by rule 398 + DELAYSLOT reduce by rule 398 + ALWAYS reduce by rule 398 + NEVER reduce by rule 398 + NONFIX reduce by rule 398 + INFIX reduce by rule 398 + INFIXR reduce by rule 398 + DEBUG reduce by rule 398 + ASM_COLON reduce by rule 398 + MC_COLON reduce by rule 398 + RTL_COLON reduce by rule 398 + DELAYSLOT_COLON reduce by rule 398 + NULLIFIED_COLON reduce by rule 398 + PADDING_COLON reduce by rule 398 + RESOURCE reduce by rule 398 + CPU reduce by rule 398 + LATENCY reduce by rule 398 + EXCEPTION reduce by rule 398 + ID reduce by rule 398 + SYMBOL reduce by rule 398 + WORD reduce by rule 398 + INT reduce by rule 398 + INTINF reduce by rule 398 + REAL reduce by rule 398 + STRING reduce by rule 398 + CHAR reduce by rule 398 + EOF reduce by rule 398 + + + . error + + + state 94: + + word : WORD . (reduce by rule 394) + + ARCHITECTURE reduce by rule 394 + END reduce by rule 394 + LOCAL reduce by rule 394 + IN reduce by rule 394 + OF reduce by rule 394 + DATATYPE reduce by rule 394 + TYPE reduce by rule 394 + EQ reduce by rule 394 + DOLLAR reduce by rule 394 + TIMES reduce by rule 394 + AND reduce by rule 394 + DEREF reduce by rule 394 + NOT reduce by rule 394 + LLBRACKET reduce by rule 394 + LHASHBRACKET reduce by rule 394 + LPAREN reduce by rule 394 + RPAREN reduce by rule 394 + LBRACKET reduce by rule 394 + RBRACKET reduce by rule 394 + LBRACE reduce by rule 394 + RBRACE reduce by rule 394 + SEMICOLON reduce by rule 394 + LDQUOTE reduce by rule 394 + RMETA reduce by rule 394 + CELLSET reduce by rule 394 + STORAGE reduce by rule 394 + LOCATIONS reduce by rule 394 + HASH reduce by rule 394 + COMMA reduce by rule 394 + COLON reduce by rule 394 + AT reduce by rule 394 + BAR reduce by rule 394 + DARROW reduce by rule 394 + THEN reduce by rule 394 + ELSE reduce by rule 394 + TRUE reduce by rule 394 + FALSE reduce by rule 394 + WILD reduce by rule 394 + HANDLE reduce by rule 394 + LET reduce by rule 394 + STRUCTURE reduce by rule 394 + FUNCTOR reduce by rule 394 + SIGNATURE reduce by rule 394 + WHERE reduce by rule 394 + SHARING reduce by rule 394 + INSTRUCTION reduce by rule 394 + VLIW reduce by rule 394 + SUPERSCALAR reduce by rule 394 + WITHTYPE reduce by rule 394 + FUN reduce by rule 394 + VAL reduce by rule 394 + INCLUDE reduce by rule 394 + OPEN reduce by rule 394 + OP reduce by rule 394 + LITTLE reduce by rule 394 + BIG reduce by rule 394 + PIPELINE reduce by rule 394 + LOWERCASE reduce by rule 394 + UPPERCASE reduce by rule 394 + VERBATIM reduce by rule 394 + RTL reduce by rule 394 + SPAN reduce by rule 394 + DELAYSLOT reduce by rule 394 + ALWAYS reduce by rule 394 + NEVER reduce by rule 394 + NONFIX reduce by rule 394 + INFIX reduce by rule 394 + INFIXR reduce by rule 394 + DEBUG reduce by rule 394 + ASM_COLON reduce by rule 394 + MC_COLON reduce by rule 394 + RTL_COLON reduce by rule 394 + DELAYSLOT_COLON reduce by rule 394 + NULLIFIED_COLON reduce by rule 394 + PADDING_COLON reduce by rule 394 + RESOURCE reduce by rule 394 + CPU reduce by rule 394 + LATENCY reduce by rule 394 + EXCEPTION reduce by rule 394 + ID reduce by rule 394 + SYMBOL reduce by rule 394 + WORD reduce by rule 394 + INT reduce by rule 394 + INTINF reduce by rule 394 + REAL reduce by rule 394 + STRING reduce by rule 394 + CHAR reduce by rule 394 + EOF reduce by rule 394 + + + . error + + + state 95: + + False : NEVER . (reduce by rule 160) + + ARCHITECTURE reduce by rule 160 + END reduce by rule 160 + LOCAL reduce by rule 160 + IN reduce by rule 160 + OF reduce by rule 160 + DATATYPE reduce by rule 160 + TYPE reduce by rule 160 + EQ reduce by rule 160 + DOLLAR reduce by rule 160 + TIMES reduce by rule 160 + AND reduce by rule 160 + DEREF reduce by rule 160 + NOT reduce by rule 160 + LLBRACKET reduce by rule 160 + LHASHBRACKET reduce by rule 160 + LPAREN reduce by rule 160 + RPAREN reduce by rule 160 + LBRACKET reduce by rule 160 + RBRACKET reduce by rule 160 + LBRACE reduce by rule 160 + RBRACE reduce by rule 160 + SEMICOLON reduce by rule 160 + LDQUOTE reduce by rule 160 + RMETA reduce by rule 160 + CELLSET reduce by rule 160 + STORAGE reduce by rule 160 + LOCATIONS reduce by rule 160 + HASH reduce by rule 160 + COMMA reduce by rule 160 + COLON reduce by rule 160 + AT reduce by rule 160 + BAR reduce by rule 160 + DARROW reduce by rule 160 + THEN reduce by rule 160 + ELSE reduce by rule 160 + TRUE reduce by rule 160 + FALSE reduce by rule 160 + WILD reduce by rule 160 + HANDLE reduce by rule 160 + LET reduce by rule 160 + STRUCTURE reduce by rule 160 + FUNCTOR reduce by rule 160 + SIGNATURE reduce by rule 160 + WHERE reduce by rule 160 + SHARING reduce by rule 160 + INSTRUCTION reduce by rule 160 + VLIW reduce by rule 160 + SUPERSCALAR reduce by rule 160 + WITHTYPE reduce by rule 160 + FUN reduce by rule 160 + VAL reduce by rule 160 + INCLUDE reduce by rule 160 + OPEN reduce by rule 160 + OP reduce by rule 160 + LITTLE reduce by rule 160 + BIG reduce by rule 160 + PIPELINE reduce by rule 160 + LOWERCASE reduce by rule 160 + UPPERCASE reduce by rule 160 + VERBATIM reduce by rule 160 + RTL reduce by rule 160 + SPAN reduce by rule 160 + DELAYSLOT reduce by rule 160 + ALWAYS reduce by rule 160 + NEVER reduce by rule 160 + NONFIX reduce by rule 160 + INFIX reduce by rule 160 + INFIXR reduce by rule 160 + DEBUG reduce by rule 160 + ASM_COLON reduce by rule 160 + MC_COLON reduce by rule 160 + RTL_COLON reduce by rule 160 + DELAYSLOT_COLON reduce by rule 160 + NULLIFIED_COLON reduce by rule 160 + PADDING_COLON reduce by rule 160 + RESOURCE reduce by rule 160 + CPU reduce by rule 160 + LATENCY reduce by rule 160 + EXCEPTION reduce by rule 160 + ID reduce by rule 160 + SYMBOL reduce by rule 160 + WORD reduce by rule 160 + INT reduce by rule 160 + INTINF reduce by rule 160 + REAL reduce by rule 160 + STRING reduce by rule 160 + CHAR reduce by rule 160 + EOF reduce by rule 160 + + + . error + + + state 96: + + True : ALWAYS . (reduce by rule 158) + + ARCHITECTURE reduce by rule 158 + END reduce by rule 158 + LOCAL reduce by rule 158 + IN reduce by rule 158 + OF reduce by rule 158 + DATATYPE reduce by rule 158 + TYPE reduce by rule 158 + EQ reduce by rule 158 + DOLLAR reduce by rule 158 + TIMES reduce by rule 158 + AND reduce by rule 158 + DEREF reduce by rule 158 + NOT reduce by rule 158 + LLBRACKET reduce by rule 158 + LHASHBRACKET reduce by rule 158 + LPAREN reduce by rule 158 + RPAREN reduce by rule 158 + LBRACKET reduce by rule 158 + RBRACKET reduce by rule 158 + LBRACE reduce by rule 158 + RBRACE reduce by rule 158 + SEMICOLON reduce by rule 158 + LDQUOTE reduce by rule 158 + RMETA reduce by rule 158 + CELLSET reduce by rule 158 + STORAGE reduce by rule 158 + LOCATIONS reduce by rule 158 + HASH reduce by rule 158 + COMMA reduce by rule 158 + COLON reduce by rule 158 + AT reduce by rule 158 + BAR reduce by rule 158 + DARROW reduce by rule 158 + THEN reduce by rule 158 + ELSE reduce by rule 158 + TRUE reduce by rule 158 + FALSE reduce by rule 158 + WILD reduce by rule 158 + HANDLE reduce by rule 158 + LET reduce by rule 158 + STRUCTURE reduce by rule 158 + FUNCTOR reduce by rule 158 + SIGNATURE reduce by rule 158 + WHERE reduce by rule 158 + SHARING reduce by rule 158 + INSTRUCTION reduce by rule 158 + VLIW reduce by rule 158 + SUPERSCALAR reduce by rule 158 + WITHTYPE reduce by rule 158 + FUN reduce by rule 158 + VAL reduce by rule 158 + INCLUDE reduce by rule 158 + OPEN reduce by rule 158 + OP reduce by rule 158 + LITTLE reduce by rule 158 + BIG reduce by rule 158 + PIPELINE reduce by rule 158 + LOWERCASE reduce by rule 158 + UPPERCASE reduce by rule 158 + VERBATIM reduce by rule 158 + RTL reduce by rule 158 + SPAN reduce by rule 158 + DELAYSLOT reduce by rule 158 + ALWAYS reduce by rule 158 + NEVER reduce by rule 158 + NONFIX reduce by rule 158 + INFIX reduce by rule 158 + INFIXR reduce by rule 158 + DEBUG reduce by rule 158 + ASM_COLON reduce by rule 158 + MC_COLON reduce by rule 158 + RTL_COLON reduce by rule 158 + DELAYSLOT_COLON reduce by rule 158 + NULLIFIED_COLON reduce by rule 158 + PADDING_COLON reduce by rule 158 + RESOURCE reduce by rule 158 + CPU reduce by rule 158 + LATENCY reduce by rule 158 + EXCEPTION reduce by rule 158 + ID reduce by rule 158 + SYMBOL reduce by rule 158 + WORD reduce by rule 158 + INT reduce by rule 158 + INTINF reduce by rule 158 + REAL reduce by rule 158 + STRING reduce by rule 158 + CHAR reduce by rule 158 + EOF reduce by rule 158 + + + . error + + + state 97: + + apat : WILD . (reduce by rule 292) + + EQ reduce by rule 292 + TIMES reduce by rule 292 + AND reduce by rule 292 + DEREF reduce by rule 292 + NOT reduce by rule 292 + LHASHBRACKET reduce by rule 292 + LPAREN reduce by rule 292 + RPAREN reduce by rule 292 + LBRACKET reduce by rule 292 + RBRACKET reduce by rule 292 + LBRACE reduce by rule 292 + RBRACE reduce by rule 292 + CELLSET reduce by rule 292 + COMMA reduce by rule 292 + COLON reduce by rule 292 + BAR reduce by rule 292 + DARROW reduce by rule 292 + TRUE reduce by rule 292 + FALSE reduce by rule 292 + WILD reduce by rule 292 + WHERE reduce by rule 292 + OP reduce by rule 292 + ALWAYS reduce by rule 292 + NEVER reduce by rule 292 + EXCEPTION reduce by rule 292 + ID reduce by rule 292 + SYMBOL reduce by rule 292 + WORD reduce by rule 292 + INT reduce by rule 292 + INTINF reduce by rule 292 + REAL reduce by rule 292 + STRING reduce by rule 292 + CHAR reduce by rule 292 + + + . error + + + state 98: + + False : FALSE . (reduce by rule 159) + + ARCHITECTURE reduce by rule 159 + END reduce by rule 159 + LOCAL reduce by rule 159 + IN reduce by rule 159 + OF reduce by rule 159 + DATATYPE reduce by rule 159 + TYPE reduce by rule 159 + EQ reduce by rule 159 + DOLLAR reduce by rule 159 + TIMES reduce by rule 159 + AND reduce by rule 159 + DEREF reduce by rule 159 + NOT reduce by rule 159 + LLBRACKET reduce by rule 159 + LHASHBRACKET reduce by rule 159 + LPAREN reduce by rule 159 + RPAREN reduce by rule 159 + LBRACKET reduce by rule 159 + RBRACKET reduce by rule 159 + LBRACE reduce by rule 159 + RBRACE reduce by rule 159 + SEMICOLON reduce by rule 159 + LDQUOTE reduce by rule 159 + RMETA reduce by rule 159 + CELLSET reduce by rule 159 + STORAGE reduce by rule 159 + LOCATIONS reduce by rule 159 + HASH reduce by rule 159 + COMMA reduce by rule 159 + COLON reduce by rule 159 + AT reduce by rule 159 + BAR reduce by rule 159 + DARROW reduce by rule 159 + THEN reduce by rule 159 + ELSE reduce by rule 159 + TRUE reduce by rule 159 + FALSE reduce by rule 159 + WILD reduce by rule 159 + HANDLE reduce by rule 159 + LET reduce by rule 159 + STRUCTURE reduce by rule 159 + FUNCTOR reduce by rule 159 + SIGNATURE reduce by rule 159 + WHERE reduce by rule 159 + SHARING reduce by rule 159 + INSTRUCTION reduce by rule 159 + VLIW reduce by rule 159 + SUPERSCALAR reduce by rule 159 + WITHTYPE reduce by rule 159 + FUN reduce by rule 159 + VAL reduce by rule 159 + INCLUDE reduce by rule 159 + OPEN reduce by rule 159 + OP reduce by rule 159 + LITTLE reduce by rule 159 + BIG reduce by rule 159 + PIPELINE reduce by rule 159 + LOWERCASE reduce by rule 159 + UPPERCASE reduce by rule 159 + VERBATIM reduce by rule 159 + RTL reduce by rule 159 + SPAN reduce by rule 159 + DELAYSLOT reduce by rule 159 + ALWAYS reduce by rule 159 + NEVER reduce by rule 159 + NONFIX reduce by rule 159 + INFIX reduce by rule 159 + INFIXR reduce by rule 159 + DEBUG reduce by rule 159 + ASM_COLON reduce by rule 159 + MC_COLON reduce by rule 159 + RTL_COLON reduce by rule 159 + DELAYSLOT_COLON reduce by rule 159 + NULLIFIED_COLON reduce by rule 159 + PADDING_COLON reduce by rule 159 + RESOURCE reduce by rule 159 + CPU reduce by rule 159 + LATENCY reduce by rule 159 + EXCEPTION reduce by rule 159 + ID reduce by rule 159 + SYMBOL reduce by rule 159 + WORD reduce by rule 159 + INT reduce by rule 159 + INTINF reduce by rule 159 + REAL reduce by rule 159 + STRING reduce by rule 159 + CHAR reduce by rule 159 + EOF reduce by rule 159 + + + . error + + + state 99: + + True : TRUE . (reduce by rule 157) + + ARCHITECTURE reduce by rule 157 + END reduce by rule 157 + LOCAL reduce by rule 157 + IN reduce by rule 157 + OF reduce by rule 157 + DATATYPE reduce by rule 157 + TYPE reduce by rule 157 + EQ reduce by rule 157 + DOLLAR reduce by rule 157 + TIMES reduce by rule 157 + AND reduce by rule 157 + DEREF reduce by rule 157 + NOT reduce by rule 157 + LLBRACKET reduce by rule 157 + LHASHBRACKET reduce by rule 157 + LPAREN reduce by rule 157 + RPAREN reduce by rule 157 + LBRACKET reduce by rule 157 + RBRACKET reduce by rule 157 + LBRACE reduce by rule 157 + RBRACE reduce by rule 157 + SEMICOLON reduce by rule 157 + LDQUOTE reduce by rule 157 + RMETA reduce by rule 157 + CELLSET reduce by rule 157 + STORAGE reduce by rule 157 + LOCATIONS reduce by rule 157 + HASH reduce by rule 157 + COMMA reduce by rule 157 + COLON reduce by rule 157 + AT reduce by rule 157 + BAR reduce by rule 157 + DARROW reduce by rule 157 + THEN reduce by rule 157 + ELSE reduce by rule 157 + TRUE reduce by rule 157 + FALSE reduce by rule 157 + WILD reduce by rule 157 + HANDLE reduce by rule 157 + LET reduce by rule 157 + STRUCTURE reduce by rule 157 + FUNCTOR reduce by rule 157 + SIGNATURE reduce by rule 157 + WHERE reduce by rule 157 + SHARING reduce by rule 157 + INSTRUCTION reduce by rule 157 + VLIW reduce by rule 157 + SUPERSCALAR reduce by rule 157 + WITHTYPE reduce by rule 157 + FUN reduce by rule 157 + VAL reduce by rule 157 + INCLUDE reduce by rule 157 + OPEN reduce by rule 157 + OP reduce by rule 157 + LITTLE reduce by rule 157 + BIG reduce by rule 157 + PIPELINE reduce by rule 157 + LOWERCASE reduce by rule 157 + UPPERCASE reduce by rule 157 + VERBATIM reduce by rule 157 + RTL reduce by rule 157 + SPAN reduce by rule 157 + DELAYSLOT reduce by rule 157 + ALWAYS reduce by rule 157 + NEVER reduce by rule 157 + NONFIX reduce by rule 157 + INFIX reduce by rule 157 + INFIXR reduce by rule 157 + DEBUG reduce by rule 157 + ASM_COLON reduce by rule 157 + MC_COLON reduce by rule 157 + RTL_COLON reduce by rule 157 + DELAYSLOT_COLON reduce by rule 157 + NULLIFIED_COLON reduce by rule 157 + PADDING_COLON reduce by rule 157 + RESOURCE reduce by rule 157 + CPU reduce by rule 157 + LATENCY reduce by rule 157 + EXCEPTION reduce by rule 157 + ID reduce by rule 157 + SYMBOL reduce by rule 157 + WORD reduce by rule 157 + INT reduce by rule 157 + INTINF reduce by rule 157 + REAL reduce by rule 157 + STRING reduce by rule 157 + CHAR reduce by rule 157 + EOF reduce by rule 157 + + + . error + + + state 100: + + apat : LBRACE . labpats0 RBRACE + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + RBRACE reduce by rule 326 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 191 + symb goto 67 + labpat goto 190 + labpats0 goto 189 + labpats goto 188 + + . error + + + state 101: + + apat : LBRACKET . pats RBRACKET + apat : LBRACKET . pats RBRACKET CONCAT sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + RBRACKET reduce by rule 321 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 194 + pats goto 193 + pats1 goto 192 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 102: + + apat : LPAREN . RPAREN + apat : LPAREN . pats2 RPAREN + apat : LPAREN . orpats2 RPAREN + apat : LPAREN . andpats2 RPAREN + apat : LPAREN . typedpat RPAREN + apat : LPAREN . typedpat WHERE typedexp RPAREN + apat : LPAREN . typedpat WHERE typedexp IN typedpat RPAREN + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + RPAREN shift 200 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 199 + pats2 goto 198 + orpats2 goto 197 + andpats2 goto 196 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 103: + + apat : LHASHBRACKET . pats RBRACKET + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + RBRACKET reduce by rule 321 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 194 + pats goto 201 + pats1 goto 192 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 104: + + pipelineclauses : pipelineclause . (reduce by rule 42) + pipelineclauses : pipelineclause . BAR pipelineclauses + + ARCHITECTURE reduce by rule 42 + END reduce by rule 42 + LOCAL reduce by rule 42 + IN reduce by rule 42 + DATATYPE reduce by rule 42 + TYPE reduce by rule 42 + AND reduce by rule 42 + RPAREN reduce by rule 42 + SEMICOLON reduce by rule 42 + STORAGE reduce by rule 42 + LOCATIONS reduce by rule 42 + BAR shift 202 + STRUCTURE reduce by rule 42 + FUNCTOR reduce by rule 42 + SIGNATURE reduce by rule 42 + SHARING reduce by rule 42 + INSTRUCTION reduce by rule 42 + VLIW reduce by rule 42 + SUPERSCALAR reduce by rule 42 + FUN reduce by rule 42 + VAL reduce by rule 42 + INCLUDE reduce by rule 42 + OPEN reduce by rule 42 + LITTLE reduce by rule 42 + BIG reduce by rule 42 + PIPELINE reduce by rule 42 + LOWERCASE reduce by rule 42 + UPPERCASE reduce by rule 42 + VERBATIM reduce by rule 42 + RTL reduce by rule 42 + NONFIX reduce by rule 42 + INFIX reduce by rule 42 + INFIXR reduce by rule 42 + DEBUG reduce by rule 42 + RESOURCE reduce by rule 42 + CPU reduce by rule 42 + LATENCY reduce by rule 42 + EXCEPTION reduce by rule 42 + EOF reduce by rule 42 + + + . error + + + state 105: + + pipelinebind : pipelineclauses . (reduce by rule 41) + + ARCHITECTURE reduce by rule 41 + END reduce by rule 41 + LOCAL reduce by rule 41 + IN reduce by rule 41 + DATATYPE reduce by rule 41 + TYPE reduce by rule 41 + AND reduce by rule 41 + RPAREN reduce by rule 41 + SEMICOLON reduce by rule 41 + STORAGE reduce by rule 41 + LOCATIONS reduce by rule 41 + STRUCTURE reduce by rule 41 + FUNCTOR reduce by rule 41 + SIGNATURE reduce by rule 41 + SHARING reduce by rule 41 + INSTRUCTION reduce by rule 41 + VLIW reduce by rule 41 + SUPERSCALAR reduce by rule 41 + FUN reduce by rule 41 + VAL reduce by rule 41 + INCLUDE reduce by rule 41 + OPEN reduce by rule 41 + LITTLE reduce by rule 41 + BIG reduce by rule 41 + PIPELINE reduce by rule 41 + LOWERCASE reduce by rule 41 + UPPERCASE reduce by rule 41 + VERBATIM reduce by rule 41 + RTL reduce by rule 41 + NONFIX reduce by rule 41 + INFIX reduce by rule 41 + INFIXR reduce by rule 41 + DEBUG reduce by rule 41 + RESOURCE reduce by rule 41 + CPU reduce by rule 41 + LATENCY reduce by rule 41 + EXCEPTION reduce by rule 41 + EOF reduce by rule 41 + + + . error + + + state 106: + + pipelinebinds : pipelinebind . (reduce by rule 39) + pipelinebinds : pipelinebind . AND pipelinebinds + + ARCHITECTURE reduce by rule 39 + END reduce by rule 39 + LOCAL reduce by rule 39 + IN reduce by rule 39 + DATATYPE reduce by rule 39 + TYPE reduce by rule 39 + AND shift 203 + RPAREN reduce by rule 39 + SEMICOLON reduce by rule 39 + STORAGE reduce by rule 39 + LOCATIONS reduce by rule 39 + STRUCTURE reduce by rule 39 + FUNCTOR reduce by rule 39 + SIGNATURE reduce by rule 39 + SHARING reduce by rule 39 + INSTRUCTION reduce by rule 39 + VLIW reduce by rule 39 + SUPERSCALAR reduce by rule 39 + FUN reduce by rule 39 + VAL reduce by rule 39 + INCLUDE reduce by rule 39 + OPEN reduce by rule 39 + LITTLE reduce by rule 39 + BIG reduce by rule 39 + PIPELINE reduce by rule 39 + LOWERCASE reduce by rule 39 + UPPERCASE reduce by rule 39 + VERBATIM reduce by rule 39 + RTL reduce by rule 39 + NONFIX reduce by rule 39 + INFIX reduce by rule 39 + INFIXR reduce by rule 39 + DEBUG reduce by rule 39 + RESOURCE reduce by rule 39 + CPU reduce by rule 39 + LATENCY reduce by rule 39 + EXCEPTION reduce by rule 39 + EOF reduce by rule 39 + + + . error + + + state 107: + + mymddecl : PIPELINE pipelinebinds . (reduce by rule 26) + + ARCHITECTURE reduce by rule 26 + END reduce by rule 26 + LOCAL reduce by rule 26 + IN reduce by rule 26 + DATATYPE reduce by rule 26 + TYPE reduce by rule 26 + RPAREN reduce by rule 26 + SEMICOLON reduce by rule 26 + STORAGE reduce by rule 26 + LOCATIONS reduce by rule 26 + STRUCTURE reduce by rule 26 + FUNCTOR reduce by rule 26 + SIGNATURE reduce by rule 26 + SHARING reduce by rule 26 + INSTRUCTION reduce by rule 26 + VLIW reduce by rule 26 + SUPERSCALAR reduce by rule 26 + FUN reduce by rule 26 + VAL reduce by rule 26 + INCLUDE reduce by rule 26 + OPEN reduce by rule 26 + LITTLE reduce by rule 26 + BIG reduce by rule 26 + PIPELINE reduce by rule 26 + LOWERCASE reduce by rule 26 + UPPERCASE reduce by rule 26 + VERBATIM reduce by rule 26 + RTL reduce by rule 26 + NONFIX reduce by rule 26 + INFIX reduce by rule 26 + INFIXR reduce by rule 26 + DEBUG reduce by rule 26 + RESOURCE reduce by rule 26 + CPU reduce by rule 26 + LATENCY reduce by rule 26 + EXCEPTION reduce by rule 26 + EOF reduce by rule 26 + + + . error + + + state 108: + + pipelineclause : id . pat EQ LBRACKET cycles0 RBRACKET + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 204 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 109: + + mymddecl : BIG ENDIAN . (reduce by rule 14) + + ARCHITECTURE reduce by rule 14 + END reduce by rule 14 + LOCAL reduce by rule 14 + IN reduce by rule 14 + DATATYPE reduce by rule 14 + TYPE reduce by rule 14 + RPAREN reduce by rule 14 + SEMICOLON reduce by rule 14 + STORAGE reduce by rule 14 + LOCATIONS reduce by rule 14 + STRUCTURE reduce by rule 14 + FUNCTOR reduce by rule 14 + SIGNATURE reduce by rule 14 + SHARING reduce by rule 14 + INSTRUCTION reduce by rule 14 + VLIW reduce by rule 14 + SUPERSCALAR reduce by rule 14 + FUN reduce by rule 14 + VAL reduce by rule 14 + INCLUDE reduce by rule 14 + OPEN reduce by rule 14 + LITTLE reduce by rule 14 + BIG reduce by rule 14 + PIPELINE reduce by rule 14 + LOWERCASE reduce by rule 14 + UPPERCASE reduce by rule 14 + VERBATIM reduce by rule 14 + RTL reduce by rule 14 + NONFIX reduce by rule 14 + INFIX reduce by rule 14 + INFIXR reduce by rule 14 + DEBUG reduce by rule 14 + RESOURCE reduce by rule 14 + CPU reduce by rule 14 + LATENCY reduce by rule 14 + EXCEPTION reduce by rule 14 + EOF reduce by rule 14 + + + . error + + + state 110: + + mymddecl : LITTLE ENDIAN . (reduce by rule 13) + + ARCHITECTURE reduce by rule 13 + END reduce by rule 13 + LOCAL reduce by rule 13 + IN reduce by rule 13 + DATATYPE reduce by rule 13 + TYPE reduce by rule 13 + RPAREN reduce by rule 13 + SEMICOLON reduce by rule 13 + STORAGE reduce by rule 13 + LOCATIONS reduce by rule 13 + STRUCTURE reduce by rule 13 + FUNCTOR reduce by rule 13 + SIGNATURE reduce by rule 13 + SHARING reduce by rule 13 + INSTRUCTION reduce by rule 13 + VLIW reduce by rule 13 + SUPERSCALAR reduce by rule 13 + FUN reduce by rule 13 + VAL reduce by rule 13 + INCLUDE reduce by rule 13 + OPEN reduce by rule 13 + LITTLE reduce by rule 13 + BIG reduce by rule 13 + PIPELINE reduce by rule 13 + LOWERCASE reduce by rule 13 + UPPERCASE reduce by rule 13 + VERBATIM reduce by rule 13 + RTL reduce by rule 13 + NONFIX reduce by rule 13 + INFIX reduce by rule 13 + INFIXR reduce by rule 13 + DEBUG reduce by rule 13 + RESOURCE reduce by rule 13 + CPU reduce by rule 13 + LATENCY reduce by rule 13 + EXCEPTION reduce by rule 13 + EOF reduce by rule 13 + + + . error + + + state 111: + + mymldecl : OPEN idents . (reduce by rule 80) + + ARCHITECTURE reduce by rule 80 + END reduce by rule 80 + LOCAL reduce by rule 80 + IN reduce by rule 80 + DATATYPE reduce by rule 80 + TYPE reduce by rule 80 + RPAREN reduce by rule 80 + SEMICOLON reduce by rule 80 + STORAGE reduce by rule 80 + LOCATIONS reduce by rule 80 + STRUCTURE reduce by rule 80 + FUNCTOR reduce by rule 80 + SIGNATURE reduce by rule 80 + SHARING reduce by rule 80 + INSTRUCTION reduce by rule 80 + VLIW reduce by rule 80 + SUPERSCALAR reduce by rule 80 + FUN reduce by rule 80 + VAL reduce by rule 80 + INCLUDE reduce by rule 80 + OPEN reduce by rule 80 + LITTLE reduce by rule 80 + BIG reduce by rule 80 + PIPELINE reduce by rule 80 + LOWERCASE reduce by rule 80 + UPPERCASE reduce by rule 80 + VERBATIM reduce by rule 80 + RTL reduce by rule 80 + NONFIX reduce by rule 80 + INFIX reduce by rule 80 + INFIXR reduce by rule 80 + DEBUG reduce by rule 80 + RESOURCE reduce by rule 80 + CPU reduce by rule 80 + LATENCY reduce by rule 80 + EXCEPTION reduce by rule 80 + EOF reduce by rule 80 + + + . error + + + state 112: + + ident : ident2 . (reduce by rule 422) + + ARCHITECTURE reduce by rule 422 + END reduce by rule 422 + LOCAL reduce by rule 422 + IN reduce by rule 422 + DATATYPE reduce by rule 422 + TYPE reduce by rule 422 + EQ reduce by rule 422 + AND reduce by rule 422 + LPAREN reduce by rule 422 + RPAREN reduce by rule 422 + SEMICOLON reduce by rule 422 + CELLSET reduce by rule 422 + STORAGE reduce by rule 422 + LOCATIONS reduce by rule 422 + STRUCTURE reduce by rule 422 + FUNCTOR reduce by rule 422 + SIGNATURE reduce by rule 422 + WHERE reduce by rule 422 + SHARING reduce by rule 422 + INSTRUCTION reduce by rule 422 + VLIW reduce by rule 422 + SUPERSCALAR reduce by rule 422 + FUN reduce by rule 422 + VAL reduce by rule 422 + INCLUDE reduce by rule 422 + OPEN reduce by rule 422 + LITTLE reduce by rule 422 + BIG reduce by rule 422 + PIPELINE reduce by rule 422 + LOWERCASE reduce by rule 422 + UPPERCASE reduce by rule 422 + VERBATIM reduce by rule 422 + RTL reduce by rule 422 + NONFIX reduce by rule 422 + INFIX reduce by rule 422 + INFIXR reduce by rule 422 + DEBUG reduce by rule 422 + RESOURCE reduce by rule 422 + CPU reduce by rule 422 + LATENCY reduce by rule 422 + EXCEPTION reduce by rule 422 + ID reduce by rule 422 + SYMBOL reduce by rule 422 + EOF reduce by rule 422 + + + . error + + + state 113: + + idents : ident . (reduce by rule 111) + idents : ident . idents + + ARCHITECTURE reduce by rule 111 + END reduce by rule 111 + LOCAL reduce by rule 111 + IN reduce by rule 111 + DATATYPE reduce by rule 111 + TYPE reduce by rule 111 + RPAREN reduce by rule 111 + SEMICOLON reduce by rule 111 + CELLSET shift 50 + STORAGE reduce by rule 111 + LOCATIONS reduce by rule 111 + STRUCTURE reduce by rule 111 + FUNCTOR reduce by rule 111 + SIGNATURE reduce by rule 111 + SHARING reduce by rule 111 + INSTRUCTION reduce by rule 111 + VLIW reduce by rule 111 + SUPERSCALAR reduce by rule 111 + FUN reduce by rule 111 + VAL reduce by rule 111 + INCLUDE reduce by rule 111 + OPEN reduce by rule 111 + LITTLE reduce by rule 111 + BIG reduce by rule 111 + PIPELINE reduce by rule 111 + LOWERCASE reduce by rule 111 + UPPERCASE reduce by rule 111 + VERBATIM reduce by rule 111 + RTL reduce by rule 111 + NONFIX reduce by rule 111 + INFIX reduce by rule 111 + INFIXR reduce by rule 111 + DEBUG reduce by rule 111 + RESOURCE reduce by rule 111 + CPU reduce by rule 111 + LATENCY reduce by rule 111 + EXCEPTION reduce by rule 111 + ID shift 49 + SYMBOL shift 48 + EOF reduce by rule 111 + + id goto 114 + ident goto 113 + ident2 goto 112 + idents goto 205 + path goto 85 + + . error + + + state 114: + + ident : id . (reduce by rule 421) + path : id . DOT sym + + ARCHITECTURE reduce by rule 421 + END reduce by rule 421 + LOCAL reduce by rule 421 + IN reduce by rule 421 + DATATYPE reduce by rule 421 + TYPE reduce by rule 421 + EQ reduce by rule 421 + AND reduce by rule 421 + LPAREN reduce by rule 421 + RPAREN reduce by rule 421 + SEMICOLON reduce by rule 421 + CELLSET reduce by rule 421 + STORAGE reduce by rule 421 + LOCATIONS reduce by rule 421 + DOT shift 186 + STRUCTURE reduce by rule 421 + FUNCTOR reduce by rule 421 + SIGNATURE reduce by rule 421 + WHERE reduce by rule 421 + SHARING reduce by rule 421 + INSTRUCTION reduce by rule 421 + VLIW reduce by rule 421 + SUPERSCALAR reduce by rule 421 + FUN reduce by rule 421 + VAL reduce by rule 421 + INCLUDE reduce by rule 421 + OPEN reduce by rule 421 + LITTLE reduce by rule 421 + BIG reduce by rule 421 + PIPELINE reduce by rule 421 + LOWERCASE reduce by rule 421 + UPPERCASE reduce by rule 421 + VERBATIM reduce by rule 421 + RTL reduce by rule 421 + NONFIX reduce by rule 421 + INFIX reduce by rule 421 + INFIXR reduce by rule 421 + DEBUG reduce by rule 421 + RESOURCE reduce by rule 421 + CPU reduce by rule 421 + LATENCY reduce by rule 421 + EXCEPTION reduce by rule 421 + ID reduce by rule 421 + SYMBOL reduce by rule 421 + EOF reduce by rule 421 + + + . error + + + state 115: + + mymldecl : INCLUDE sigexp . (reduce by rule 81) + sigexp : sigexp . WHERE sigsubs + + ARCHITECTURE reduce by rule 81 + END reduce by rule 81 + LOCAL reduce by rule 81 + IN reduce by rule 81 + DATATYPE reduce by rule 81 + TYPE reduce by rule 81 + RPAREN reduce by rule 81 + SEMICOLON reduce by rule 81 + STORAGE reduce by rule 81 + LOCATIONS reduce by rule 81 + STRUCTURE reduce by rule 81 + FUNCTOR reduce by rule 81 + SIGNATURE reduce by rule 81 + WHERE shift 206 + SHARING reduce by rule 81 + INSTRUCTION reduce by rule 81 + VLIW reduce by rule 81 + SUPERSCALAR reduce by rule 81 + FUN reduce by rule 81 + VAL reduce by rule 81 + INCLUDE reduce by rule 81 + OPEN reduce by rule 81 + LITTLE reduce by rule 81 + BIG reduce by rule 81 + PIPELINE reduce by rule 81 + LOWERCASE reduce by rule 81 + UPPERCASE reduce by rule 81 + VERBATIM reduce by rule 81 + RTL reduce by rule 81 + NONFIX reduce by rule 81 + INFIX reduce by rule 81 + INFIXR reduce by rule 81 + DEBUG reduce by rule 81 + RESOURCE reduce by rule 81 + CPU reduce by rule 81 + LATENCY reduce by rule 81 + EXCEPTION reduce by rule 81 + EOF reduce by rule 81 + + + . error + + + state 116: + + decl : INCLUDE string . optsemi + + ARCHITECTURE reduce by rule 5 + END reduce by rule 5 + LOCAL reduce by rule 5 + IN reduce by rule 5 + DATATYPE reduce by rule 5 + TYPE reduce by rule 5 + RPAREN reduce by rule 5 + SEMICOLON shift 42 + STORAGE reduce by rule 5 + LOCATIONS reduce by rule 5 + STRUCTURE reduce by rule 5 + FUNCTOR reduce by rule 5 + SIGNATURE reduce by rule 5 + SHARING reduce by rule 5 + INSTRUCTION reduce by rule 5 + VLIW reduce by rule 5 + SUPERSCALAR reduce by rule 5 + FUN reduce by rule 5 + VAL reduce by rule 5 + INCLUDE reduce by rule 5 + OPEN reduce by rule 5 + LITTLE reduce by rule 5 + BIG reduce by rule 5 + PIPELINE reduce by rule 5 + LOWERCASE reduce by rule 5 + UPPERCASE reduce by rule 5 + VERBATIM reduce by rule 5 + RTL reduce by rule 5 + NONFIX reduce by rule 5 + INFIX reduce by rule 5 + INFIXR reduce by rule 5 + DEBUG reduce by rule 5 + RESOURCE reduce by rule 5 + CPU reduce by rule 5 + LATENCY reduce by rule 5 + EXCEPTION reduce by rule 5 + EOF reduce by rule 5 + + optsemi goto 207 + + . error + + + state 117: + + sigexp : ident . (reduce by rule 90) + + ARCHITECTURE reduce by rule 90 + END reduce by rule 90 + LOCAL reduce by rule 90 + IN reduce by rule 90 + DATATYPE reduce by rule 90 + TYPE reduce by rule 90 + EQ reduce by rule 90 + RPAREN reduce by rule 90 + SEMICOLON reduce by rule 90 + STORAGE reduce by rule 90 + LOCATIONS reduce by rule 90 + STRUCTURE reduce by rule 90 + FUNCTOR reduce by rule 90 + SIGNATURE reduce by rule 90 + WHERE reduce by rule 90 + SHARING reduce by rule 90 + INSTRUCTION reduce by rule 90 + VLIW reduce by rule 90 + SUPERSCALAR reduce by rule 90 + FUN reduce by rule 90 + VAL reduce by rule 90 + INCLUDE reduce by rule 90 + OPEN reduce by rule 90 + LITTLE reduce by rule 90 + BIG reduce by rule 90 + PIPELINE reduce by rule 90 + LOWERCASE reduce by rule 90 + UPPERCASE reduce by rule 90 + VERBATIM reduce by rule 90 + RTL reduce by rule 90 + NONFIX reduce by rule 90 + INFIX reduce by rule 90 + INFIXR reduce by rule 90 + DEBUG reduce by rule 90 + RESOURCE reduce by rule 90 + CPU reduce by rule 90 + LATENCY reduce by rule 90 + EXCEPTION reduce by rule 90 + EOF reduce by rule 90 + + + . error + + + state 118: + + sigexp : SIG . decls END + + ARCHITECTURE shift 39 + END reduce by rule 1 + LOCAL shift 38 + DATATYPE shift 37 + TYPE shift 36 + STORAGE shift 35 + LOCATIONS shift 34 + STRUCTURE shift 33 + FUNCTOR shift 32 + SIGNATURE shift 31 + SHARING shift 30 + INSTRUCTION shift 29 + VLIW shift 28 + SUPERSCALAR shift 27 + FUN shift 26 + VAL shift 25 + INCLUDE shift 24 + OPEN shift 23 + LITTLE shift 22 + BIG shift 21 + PIPELINE shift 20 + LOWERCASE shift 19 + UPPERCASE shift 18 + VERBATIM shift 17 + RTL shift 16 + NONFIX shift 15 + INFIX shift 14 + INFIXR shift 13 + DEBUG shift 12 + RESOURCE shift 11 + CPU shift 10 + LATENCY shift 9 + EXCEPTION shift 8 + + decls goto 208 + decl goto 6 + mldecl goto 5 + mymldecl goto 4 + mddecl goto 3 + mymddecl goto 2 + assemblycase goto 1 + + . error + + + state 119: + + mymldecl : VAL valbinds . (reduce by rule 65) + + ARCHITECTURE reduce by rule 65 + END reduce by rule 65 + LOCAL reduce by rule 65 + IN reduce by rule 65 + DATATYPE reduce by rule 65 + TYPE reduce by rule 65 + RPAREN reduce by rule 65 + SEMICOLON reduce by rule 65 + STORAGE reduce by rule 65 + LOCATIONS reduce by rule 65 + STRUCTURE reduce by rule 65 + FUNCTOR reduce by rule 65 + SIGNATURE reduce by rule 65 + SHARING reduce by rule 65 + INSTRUCTION reduce by rule 65 + VLIW reduce by rule 65 + SUPERSCALAR reduce by rule 65 + FUN reduce by rule 65 + VAL reduce by rule 65 + INCLUDE reduce by rule 65 + OPEN reduce by rule 65 + LITTLE reduce by rule 65 + BIG reduce by rule 65 + PIPELINE reduce by rule 65 + LOWERCASE reduce by rule 65 + UPPERCASE reduce by rule 65 + VERBATIM reduce by rule 65 + RTL reduce by rule 65 + NONFIX reduce by rule 65 + INFIX reduce by rule 65 + INFIXR reduce by rule 65 + DEBUG reduce by rule 65 + RESOURCE reduce by rule 65 + CPU reduce by rule 65 + LATENCY reduce by rule 65 + EXCEPTION reduce by rule 65 + EOF reduce by rule 65 + + + . error + + + state 120: + + valbinds : valbind . (reduce by rule 231) + valbinds : valbind . AND valbinds + + ARCHITECTURE reduce by rule 231 + END reduce by rule 231 + LOCAL reduce by rule 231 + IN reduce by rule 231 + DATATYPE reduce by rule 231 + TYPE reduce by rule 231 + AND shift 209 + RPAREN reduce by rule 231 + SEMICOLON reduce by rule 231 + STORAGE reduce by rule 231 + LOCATIONS reduce by rule 231 + STRUCTURE reduce by rule 231 + FUNCTOR reduce by rule 231 + SIGNATURE reduce by rule 231 + SHARING reduce by rule 231 + INSTRUCTION reduce by rule 231 + VLIW reduce by rule 231 + SUPERSCALAR reduce by rule 231 + FUN reduce by rule 231 + VAL reduce by rule 231 + INCLUDE reduce by rule 231 + OPEN reduce by rule 231 + LITTLE reduce by rule 231 + BIG reduce by rule 231 + PIPELINE reduce by rule 231 + LOWERCASE reduce by rule 231 + UPPERCASE reduce by rule 231 + VERBATIM reduce by rule 231 + RTL reduce by rule 231 + NONFIX reduce by rule 231 + INFIX reduce by rule 231 + INFIXR reduce by rule 231 + DEBUG reduce by rule 231 + RESOURCE reduce by rule 231 + CPU reduce by rule 231 + LATENCY reduce by rule 231 + EXCEPTION reduce by rule 231 + EOF reduce by rule 231 + + + . error + + + state 121: + + valbind : pat . EQ typedexp + + EQ shift 210 + + + . error + + + state 122: + + apppat : apppat . apat2 + pat : apppat . (reduce by rule 315) + + EQ reduce by rule 315 + TIMES shift 72 + AND reduce by rule 315 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + RPAREN reduce by rule 315 + LBRACKET shift 101 + RBRACKET reduce by rule 315 + LBRACE shift 100 + RBRACE reduce by rule 315 + CELLSET shift 50 + COMMA reduce by rule 315 + COLON reduce by rule 315 + BAR reduce by rule 315 + DARROW reduce by rule 315 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + WHERE reduce by rule 315 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + EXCEPTION reduce by rule 315 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 211 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 123: + + apppat : apat2 . (reduce by rule 313) + + EQ reduce by rule 313 + TIMES reduce by rule 313 + AND reduce by rule 313 + DEREF reduce by rule 313 + NOT reduce by rule 313 + LHASHBRACKET reduce by rule 313 + LPAREN reduce by rule 313 + RPAREN reduce by rule 313 + LBRACKET reduce by rule 313 + RBRACKET reduce by rule 313 + LBRACE reduce by rule 313 + RBRACE reduce by rule 313 + CELLSET reduce by rule 313 + COMMA reduce by rule 313 + COLON reduce by rule 313 + BAR reduce by rule 313 + DARROW reduce by rule 313 + TRUE reduce by rule 313 + FALSE reduce by rule 313 + WILD reduce by rule 313 + WHERE reduce by rule 313 + OP reduce by rule 313 + ALWAYS reduce by rule 313 + NEVER reduce by rule 313 + EXCEPTION reduce by rule 313 + ID reduce by rule 313 + SYMBOL reduce by rule 313 + WORD reduce by rule 313 + INT reduce by rule 313 + INTINF reduce by rule 313 + REAL reduce by rule 313 + STRING reduce by rule 313 + CHAR reduce by rule 313 + + + . error + + + state 124: + + apat2 : apat . (reduce by rule 310) + + EQ reduce by rule 310 + TIMES reduce by rule 310 + AND reduce by rule 310 + DEREF reduce by rule 310 + NOT reduce by rule 310 + LHASHBRACKET reduce by rule 310 + LPAREN reduce by rule 310 + RPAREN reduce by rule 310 + LBRACKET reduce by rule 310 + RBRACKET reduce by rule 310 + LBRACE reduce by rule 310 + RBRACE reduce by rule 310 + CELLSET reduce by rule 310 + COMMA reduce by rule 310 + COLON reduce by rule 310 + BAR reduce by rule 310 + DARROW reduce by rule 310 + TRUE reduce by rule 310 + FALSE reduce by rule 310 + WILD reduce by rule 310 + WHERE reduce by rule 310 + OP reduce by rule 310 + ALWAYS reduce by rule 310 + NEVER reduce by rule 310 + EXCEPTION reduce by rule 310 + ID reduce by rule 310 + SYMBOL reduce by rule 310 + WORD reduce by rule 310 + INT reduce by rule 310 + INTINF reduce by rule 310 + REAL reduce by rule 310 + STRING reduce by rule 310 + CHAR reduce by rule 310 + + + . error + + + state 125: + + mymldecl : VAL syms . COLON ty + + COLON shift 212 + + + . error + + error: state 126: shift/reduce conflict (shift SYMBOL, reduce by rule 311) + error: state 126: shift/reduce conflict (shift ID, reduce by rule 311) + error: state 126: shift/reduce conflict (shift CELLSET, reduce by rule 311) + error: state 126: shift/reduce conflict (shift NOT, reduce by rule 311) + error: state 126: shift/reduce conflict (shift DEREF, reduce by rule 311) + error: state 126: shift/reduce conflict (shift TIMES, reduce by rule 311) + + state 126: + + syms : sym . (reduce by rule 109) + syms : sym . syms + apat : sym . CONCAT LBRACKET pats RBRACKET + apat : sym . CONCAT LBRACKET pats RBRACKET CONCAT sym + apat2 : sym . (reduce by rule 311) + + EQ reduce by rule 311 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CONCAT shift 184 + LHASHBRACKET reduce by rule 311 + LPAREN reduce by rule 311 + LBRACKET reduce by rule 311 + LBRACE reduce by rule 311 + CELLSET shift 50 + COLON reduce by rule 109 + TRUE reduce by rule 311 + FALSE reduce by rule 311 + WILD reduce by rule 311 + OP reduce by rule 311 + ALWAYS reduce by rule 311 + NEVER reduce by rule 311 + ID shift 49 + SYMBOL shift 48 + WORD reduce by rule 311 + INT reduce by rule 311 + INTINF reduce by rule 311 + REAL reduce by rule 311 + STRING reduce by rule 311 + CHAR reduce by rule 311 + + id goto 69 + sym goto 68 + symb goto 67 + syms goto 180 + + . error + + + state 127: + + sym : id . (reduce by rule 416) + path : id . DOT sym + pat : id . AS pat + + EQ reduce by rule 416 + TIMES reduce by rule 416 + AND reduce by rule 416 + DEREF reduce by rule 416 + NOT reduce by rule 416 + CONCAT reduce by rule 416 + LHASHBRACKET reduce by rule 416 + LPAREN reduce by rule 416 + RPAREN reduce by rule 416 + LBRACKET reduce by rule 416 + RBRACKET reduce by rule 416 + LBRACE reduce by rule 416 + RBRACE reduce by rule 416 + CELLSET reduce by rule 416 + COMMA reduce by rule 416 + COLON reduce by rule 416 + DOT shift 186 + BAR reduce by rule 416 + DARROW reduce by rule 416 + TRUE reduce by rule 416 + FALSE reduce by rule 416 + WILD reduce by rule 416 + WHERE reduce by rule 416 + AS shift 213 + OP reduce by rule 416 + ALWAYS reduce by rule 416 + NEVER reduce by rule 416 + EXCEPTION reduce by rule 416 + ID reduce by rule 416 + SYMBOL reduce by rule 416 + WORD reduce by rule 416 + INT reduce by rule 416 + INTINF reduce by rule 416 + REAL reduce by rule 416 + STRING reduce by rule 416 + CHAR reduce by rule 416 + + + . error + + + state 128: + + apat2 : OP . sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 214 + symb goto 67 + + . error + + + state 129: + + mymldecl : FUN funbinds . (reduce by rule 61) + + ARCHITECTURE reduce by rule 61 + END reduce by rule 61 + LOCAL reduce by rule 61 + IN reduce by rule 61 + DATATYPE reduce by rule 61 + TYPE reduce by rule 61 + RPAREN reduce by rule 61 + SEMICOLON reduce by rule 61 + STORAGE reduce by rule 61 + LOCATIONS reduce by rule 61 + STRUCTURE reduce by rule 61 + FUNCTOR reduce by rule 61 + SIGNATURE reduce by rule 61 + SHARING reduce by rule 61 + INSTRUCTION reduce by rule 61 + VLIW reduce by rule 61 + SUPERSCALAR reduce by rule 61 + FUN reduce by rule 61 + VAL reduce by rule 61 + INCLUDE reduce by rule 61 + OPEN reduce by rule 61 + LITTLE reduce by rule 61 + BIG reduce by rule 61 + PIPELINE reduce by rule 61 + LOWERCASE reduce by rule 61 + UPPERCASE reduce by rule 61 + VERBATIM reduce by rule 61 + RTL reduce by rule 61 + NONFIX reduce by rule 61 + INFIX reduce by rule 61 + INFIXR reduce by rule 61 + DEBUG reduce by rule 61 + RESOURCE reduce by rule 61 + CPU reduce by rule 61 + LATENCY reduce by rule 61 + EXCEPTION reduce by rule 61 + EOF reduce by rule 61 + + + . error + + + state 130: + + funbinds : funbind . (reduce by rule 228) + funbinds : funbind . AND funbinds + + ARCHITECTURE reduce by rule 228 + END reduce by rule 228 + LOCAL reduce by rule 228 + IN reduce by rule 228 + DATATYPE reduce by rule 228 + TYPE reduce by rule 228 + AND shift 215 + RPAREN reduce by rule 228 + SEMICOLON reduce by rule 228 + STORAGE reduce by rule 228 + LOCATIONS reduce by rule 228 + STRUCTURE reduce by rule 228 + FUNCTOR reduce by rule 228 + SIGNATURE reduce by rule 228 + SHARING reduce by rule 228 + INSTRUCTION reduce by rule 228 + VLIW reduce by rule 228 + SUPERSCALAR reduce by rule 228 + FUN reduce by rule 228 + VAL reduce by rule 228 + INCLUDE reduce by rule 228 + OPEN reduce by rule 228 + LITTLE reduce by rule 228 + BIG reduce by rule 228 + PIPELINE reduce by rule 228 + LOWERCASE reduce by rule 228 + UPPERCASE reduce by rule 228 + VERBATIM reduce by rule 228 + RTL reduce by rule 228 + NONFIX reduce by rule 228 + INFIX reduce by rule 228 + INFIXR reduce by rule 228 + DEBUG reduce by rule 228 + RESOURCE reduce by rule 228 + CPU reduce by rule 228 + LATENCY reduce by rule 228 + EXCEPTION reduce by rule 228 + EOF reduce by rule 228 + + + . error + + + state 131: + + funbind : funclauses . (reduce by rule 230) + + ARCHITECTURE reduce by rule 230 + END reduce by rule 230 + LOCAL reduce by rule 230 + IN reduce by rule 230 + DATATYPE reduce by rule 230 + TYPE reduce by rule 230 + AND reduce by rule 230 + RPAREN reduce by rule 230 + SEMICOLON reduce by rule 230 + STORAGE reduce by rule 230 + LOCATIONS reduce by rule 230 + STRUCTURE reduce by rule 230 + FUNCTOR reduce by rule 230 + SIGNATURE reduce by rule 230 + SHARING reduce by rule 230 + INSTRUCTION reduce by rule 230 + VLIW reduce by rule 230 + SUPERSCALAR reduce by rule 230 + FUN reduce by rule 230 + VAL reduce by rule 230 + INCLUDE reduce by rule 230 + OPEN reduce by rule 230 + LITTLE reduce by rule 230 + BIG reduce by rule 230 + PIPELINE reduce by rule 230 + LOWERCASE reduce by rule 230 + UPPERCASE reduce by rule 230 + VERBATIM reduce by rule 230 + RTL reduce by rule 230 + NONFIX reduce by rule 230 + INFIX reduce by rule 230 + INFIXR reduce by rule 230 + DEBUG reduce by rule 230 + RESOURCE reduce by rule 230 + CPU reduce by rule 230 + LATENCY reduce by rule 230 + EXCEPTION reduce by rule 230 + EOF reduce by rule 230 + + + . error + + + state 132: + + funclauses : funclause . (reduce by rule 348) + funclauses : funclause . BAR funclauses + + ARCHITECTURE reduce by rule 348 + END reduce by rule 348 + LOCAL reduce by rule 348 + IN reduce by rule 348 + DATATYPE reduce by rule 348 + TYPE reduce by rule 348 + AND reduce by rule 348 + RPAREN reduce by rule 348 + SEMICOLON reduce by rule 348 + STORAGE reduce by rule 348 + LOCATIONS reduce by rule 348 + BAR shift 216 + STRUCTURE reduce by rule 348 + FUNCTOR reduce by rule 348 + SIGNATURE reduce by rule 348 + SHARING reduce by rule 348 + INSTRUCTION reduce by rule 348 + VLIW reduce by rule 348 + SUPERSCALAR reduce by rule 348 + FUN reduce by rule 348 + VAL reduce by rule 348 + INCLUDE reduce by rule 348 + OPEN reduce by rule 348 + LITTLE reduce by rule 348 + BIG reduce by rule 348 + PIPELINE reduce by rule 348 + LOWERCASE reduce by rule 348 + UPPERCASE reduce by rule 348 + VERBATIM reduce by rule 348 + RTL reduce by rule 348 + NONFIX reduce by rule 348 + INFIX reduce by rule 348 + INFIXR reduce by rule 348 + DEBUG reduce by rule 348 + RESOURCE reduce by rule 348 + CPU reduce by rule 348 + LATENCY reduce by rule 348 + EXCEPTION reduce by rule 348 + EOF reduce by rule 348 + + + . error + + + state 133: + + apppat : apppat . apat2 + funclause : apppat . funguard return_ty cont EQ typedexp + + EQ reduce by rule 346 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + COLON reduce by rule 346 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + WHERE shift 218 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + EXCEPTION reduce by rule 346 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + funguard goto 217 + apat goto 124 + apat2 goto 211 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 134: + + apat : sym . CONCAT LBRACKET pats RBRACKET + apat : sym . CONCAT LBRACKET pats RBRACKET CONCAT sym + apat2 : sym . (reduce by rule 311) + + EQ reduce by rule 311 + TIMES reduce by rule 311 + AND reduce by rule 311 + DEREF reduce by rule 311 + NOT reduce by rule 311 + CONCAT shift 184 + LHASHBRACKET reduce by rule 311 + LPAREN reduce by rule 311 + RPAREN reduce by rule 311 + LBRACKET reduce by rule 311 + RBRACKET reduce by rule 311 + LBRACE reduce by rule 311 + RBRACE reduce by rule 311 + CELLSET reduce by rule 311 + COMMA reduce by rule 311 + COLON reduce by rule 311 + BAR reduce by rule 311 + DARROW reduce by rule 311 + TRUE reduce by rule 311 + FALSE reduce by rule 311 + WILD reduce by rule 311 + WHERE reduce by rule 311 + OP reduce by rule 311 + ALWAYS reduce by rule 311 + NEVER reduce by rule 311 + EXCEPTION reduce by rule 311 + ID reduce by rule 311 + SYMBOL reduce by rule 311 + WORD reduce by rule 311 + INT reduce by rule 311 + INTINF reduce by rule 311 + REAL reduce by rule 311 + STRING reduce by rule 311 + CHAR reduce by rule 311 + + + . error + + + state 135: + + sym : id . (reduce by rule 416) + path : id . DOT sym + + ARCHITECTURE reduce by rule 416 + END reduce by rule 416 + LOCAL reduce by rule 416 + IN reduce by rule 416 + OF reduce by rule 416 + DATATYPE reduce by rule 416 + TYPE reduce by rule 416 + EQ reduce by rule 416 + DOLLAR reduce by rule 416 + TIMES reduce by rule 416 + AND reduce by rule 416 + DEREF reduce by rule 416 + NOT reduce by rule 416 + CONCAT reduce by rule 416 + LLBRACKET reduce by rule 416 + LHASHBRACKET reduce by rule 416 + LPAREN reduce by rule 416 + RPAREN reduce by rule 416 + LBRACKET reduce by rule 416 + RBRACKET reduce by rule 416 + LBRACE reduce by rule 416 + RBRACE reduce by rule 416 + SEMICOLON reduce by rule 416 + LDQUOTE reduce by rule 416 + RMETA reduce by rule 416 + CELLSET reduce by rule 416 + STORAGE reduce by rule 416 + LOCATIONS reduce by rule 416 + HASH reduce by rule 416 + COMMA reduce by rule 416 + COLON reduce by rule 416 + DOT shift 186 + AT reduce by rule 416 + BAR reduce by rule 416 + DARROW reduce by rule 416 + THEN reduce by rule 416 + ELSE reduce by rule 416 + TRUE reduce by rule 416 + FALSE reduce by rule 416 + WILD reduce by rule 416 + HANDLE reduce by rule 416 + LET reduce by rule 416 + STRUCTURE reduce by rule 416 + FUNCTOR reduce by rule 416 + SIGNATURE reduce by rule 416 + WHERE reduce by rule 416 + SHARING reduce by rule 416 + INSTRUCTION reduce by rule 416 + VLIW reduce by rule 416 + SUPERSCALAR reduce by rule 416 + WITHTYPE reduce by rule 416 + FUN reduce by rule 416 + VAL reduce by rule 416 + INCLUDE reduce by rule 416 + OPEN reduce by rule 416 + OP reduce by rule 416 + LITTLE reduce by rule 416 + BIG reduce by rule 416 + PIPELINE reduce by rule 416 + LOWERCASE reduce by rule 416 + UPPERCASE reduce by rule 416 + VERBATIM reduce by rule 416 + RTL reduce by rule 416 + SPAN reduce by rule 416 + DELAYSLOT reduce by rule 416 + ALWAYS reduce by rule 416 + NEVER reduce by rule 416 + NONFIX reduce by rule 416 + INFIX reduce by rule 416 + INFIXR reduce by rule 416 + DEBUG reduce by rule 416 + ASM_COLON reduce by rule 416 + MC_COLON reduce by rule 416 + RTL_COLON reduce by rule 416 + DELAYSLOT_COLON reduce by rule 416 + NULLIFIED_COLON reduce by rule 416 + PADDING_COLON reduce by rule 416 + RESOURCE reduce by rule 416 + CPU reduce by rule 416 + LATENCY reduce by rule 416 + EXCEPTION reduce by rule 416 + ID reduce by rule 416 + SYMBOL reduce by rule 416 + WORD reduce by rule 416 + INT reduce by rule 416 + INTINF reduce by rule 416 + REAL reduce by rule 416 + STRING reduce by rule 416 + CHAR reduce by rule 416 + EOF reduce by rule 416 + + + . error + + + state 136: + + consbinds : consbind . (reduce by rule 142) + consbinds : consbind . BAR consbinds + + ARCHITECTURE reduce by rule 142 + END reduce by rule 142 + LOCAL reduce by rule 142 + IN reduce by rule 142 + DATATYPE reduce by rule 142 + TYPE reduce by rule 142 + AND reduce by rule 142 + RPAREN reduce by rule 142 + SEMICOLON reduce by rule 142 + STORAGE reduce by rule 142 + LOCATIONS reduce by rule 142 + BAR shift 219 + STRUCTURE reduce by rule 142 + FUNCTOR reduce by rule 142 + SIGNATURE reduce by rule 142 + SHARING reduce by rule 142 + INSTRUCTION reduce by rule 142 + VLIW reduce by rule 142 + SUPERSCALAR reduce by rule 142 + WITHTYPE reduce by rule 142 + FUN reduce by rule 142 + VAL reduce by rule 142 + INCLUDE reduce by rule 142 + OPEN reduce by rule 142 + LITTLE reduce by rule 142 + BIG reduce by rule 142 + PIPELINE reduce by rule 142 + LOWERCASE reduce by rule 142 + UPPERCASE reduce by rule 142 + VERBATIM reduce by rule 142 + RTL reduce by rule 142 + NONFIX reduce by rule 142 + INFIX reduce by rule 142 + INFIXR reduce by rule 142 + DEBUG reduce by rule 142 + RESOURCE reduce by rule 142 + CPU reduce by rule 142 + LATENCY reduce by rule 142 + EXCEPTION reduce by rule 142 + EOF reduce by rule 142 + + + . error + + + state 137: + + mymddecl : INSTRUCTION consbinds . (reduce by rule 22) + + ARCHITECTURE reduce by rule 22 + END reduce by rule 22 + LOCAL reduce by rule 22 + IN reduce by rule 22 + DATATYPE reduce by rule 22 + TYPE reduce by rule 22 + RPAREN reduce by rule 22 + SEMICOLON reduce by rule 22 + STORAGE reduce by rule 22 + LOCATIONS reduce by rule 22 + STRUCTURE reduce by rule 22 + FUNCTOR reduce by rule 22 + SIGNATURE reduce by rule 22 + SHARING reduce by rule 22 + INSTRUCTION reduce by rule 22 + VLIW reduce by rule 22 + SUPERSCALAR reduce by rule 22 + FUN reduce by rule 22 + VAL reduce by rule 22 + INCLUDE reduce by rule 22 + OPEN reduce by rule 22 + LITTLE reduce by rule 22 + BIG reduce by rule 22 + PIPELINE reduce by rule 22 + LOWERCASE reduce by rule 22 + UPPERCASE reduce by rule 22 + VERBATIM reduce by rule 22 + RTL reduce by rule 22 + NONFIX reduce by rule 22 + INFIX reduce by rule 22 + INFIXR reduce by rule 22 + DEBUG reduce by rule 22 + RESOURCE reduce by rule 22 + CPU reduce by rule 22 + LATENCY reduce by rule 22 + EXCEPTION reduce by rule 22 + EOF reduce by rule 22 + + + . error + + + state 138: + + consbind : sym . of_ty consassembly consencoding rtl nop nullified delayslot delayslotcandidate sdi latency pipeline + + ARCHITECTURE reduce by rule 151 + END reduce by rule 151 + LOCAL reduce by rule 151 + IN reduce by rule 151 + OF shift 221 + DATATYPE reduce by rule 151 + TYPE reduce by rule 151 + AND reduce by rule 151 + LPAREN reduce by rule 151 + RPAREN reduce by rule 151 + SEMICOLON reduce by rule 151 + LDQUOTE reduce by rule 151 + CELLSET reduce by rule 151 + STORAGE reduce by rule 151 + LOCATIONS reduce by rule 151 + BAR reduce by rule 151 + STRUCTURE reduce by rule 151 + FUNCTOR reduce by rule 151 + SIGNATURE reduce by rule 151 + SHARING reduce by rule 151 + INSTRUCTION reduce by rule 151 + VLIW reduce by rule 151 + SUPERSCALAR reduce by rule 151 + WITHTYPE reduce by rule 151 + FUN reduce by rule 151 + VAL reduce by rule 151 + INCLUDE reduce by rule 151 + OPEN reduce by rule 151 + LITTLE reduce by rule 151 + BIG reduce by rule 151 + PIPELINE reduce by rule 151 + LOWERCASE reduce by rule 151 + UPPERCASE reduce by rule 151 + VERBATIM reduce by rule 151 + RTL reduce by rule 151 + SPAN reduce by rule 151 + DELAYSLOT reduce by rule 151 + NONFIX reduce by rule 151 + INFIX reduce by rule 151 + INFIXR reduce by rule 151 + DEBUG reduce by rule 151 + ASM_COLON reduce by rule 151 + MC_COLON reduce by rule 151 + RTL_COLON reduce by rule 151 + DELAYSLOT_COLON reduce by rule 151 + NULLIFIED_COLON reduce by rule 151 + PADDING_COLON reduce by rule 151 + RESOURCE reduce by rule 151 + CPU reduce by rule 151 + LATENCY reduce by rule 151 + EXCEPTION reduce by rule 151 + ID reduce by rule 151 + SYMBOL reduce by rule 151 + WORD reduce by rule 151 + INT reduce by rule 151 + STRING reduce by rule 151 + EOF reduce by rule 151 + + of_ty goto 220 + + . error + + + state 139: + + mymddecl : INSTRUCTION FORMATS . int BITS formatbinds + mymddecl : INSTRUCTION FORMATS . formatbinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + INT shift 64 + + id goto 225 + int goto 224 + formatbind goto 223 + formatbinds goto 222 + + . error + + + state 140: + + sharingdecl : sharelist . (reduce by rule 102) + + ARCHITECTURE reduce by rule 102 + END reduce by rule 102 + LOCAL reduce by rule 102 + IN reduce by rule 102 + DATATYPE reduce by rule 102 + TYPE reduce by rule 102 + AND reduce by rule 102 + RPAREN reduce by rule 102 + SEMICOLON reduce by rule 102 + STORAGE reduce by rule 102 + LOCATIONS reduce by rule 102 + STRUCTURE reduce by rule 102 + FUNCTOR reduce by rule 102 + SIGNATURE reduce by rule 102 + SHARING reduce by rule 102 + INSTRUCTION reduce by rule 102 + VLIW reduce by rule 102 + SUPERSCALAR reduce by rule 102 + FUN reduce by rule 102 + VAL reduce by rule 102 + INCLUDE reduce by rule 102 + OPEN reduce by rule 102 + LITTLE reduce by rule 102 + BIG reduce by rule 102 + PIPELINE reduce by rule 102 + LOWERCASE reduce by rule 102 + UPPERCASE reduce by rule 102 + VERBATIM reduce by rule 102 + RTL reduce by rule 102 + NONFIX reduce by rule 102 + INFIX reduce by rule 102 + INFIXR reduce by rule 102 + DEBUG reduce by rule 102 + RESOURCE reduce by rule 102 + CPU reduce by rule 102 + LATENCY reduce by rule 102 + EXCEPTION reduce by rule 102 + EOF reduce by rule 102 + + + . error + + + state 141: + + mymldecl : SHARING sharingdecls . (reduce by rule 76) + + ARCHITECTURE reduce by rule 76 + END reduce by rule 76 + LOCAL reduce by rule 76 + IN reduce by rule 76 + DATATYPE reduce by rule 76 + TYPE reduce by rule 76 + RPAREN reduce by rule 76 + SEMICOLON reduce by rule 76 + STORAGE reduce by rule 76 + LOCATIONS reduce by rule 76 + STRUCTURE reduce by rule 76 + FUNCTOR reduce by rule 76 + SIGNATURE reduce by rule 76 + SHARING reduce by rule 76 + INSTRUCTION reduce by rule 76 + VLIW reduce by rule 76 + SUPERSCALAR reduce by rule 76 + FUN reduce by rule 76 + VAL reduce by rule 76 + INCLUDE reduce by rule 76 + OPEN reduce by rule 76 + LITTLE reduce by rule 76 + BIG reduce by rule 76 + PIPELINE reduce by rule 76 + LOWERCASE reduce by rule 76 + UPPERCASE reduce by rule 76 + VERBATIM reduce by rule 76 + RTL reduce by rule 76 + NONFIX reduce by rule 76 + INFIX reduce by rule 76 + INFIXR reduce by rule 76 + DEBUG reduce by rule 76 + RESOURCE reduce by rule 76 + CPU reduce by rule 76 + LATENCY reduce by rule 76 + EXCEPTION reduce by rule 76 + EOF reduce by rule 76 + + + . error + + + state 142: + + sharingdecls : sharingdecl . (reduce by rule 99) + sharingdecls : sharingdecl . AND sharingdecls + + ARCHITECTURE reduce by rule 99 + END reduce by rule 99 + LOCAL reduce by rule 99 + IN reduce by rule 99 + DATATYPE reduce by rule 99 + TYPE reduce by rule 99 + AND shift 226 + RPAREN reduce by rule 99 + SEMICOLON reduce by rule 99 + STORAGE reduce by rule 99 + LOCATIONS reduce by rule 99 + STRUCTURE reduce by rule 99 + FUNCTOR reduce by rule 99 + SIGNATURE reduce by rule 99 + SHARING reduce by rule 99 + INSTRUCTION reduce by rule 99 + VLIW reduce by rule 99 + SUPERSCALAR reduce by rule 99 + FUN reduce by rule 99 + VAL reduce by rule 99 + INCLUDE reduce by rule 99 + OPEN reduce by rule 99 + LITTLE reduce by rule 99 + BIG reduce by rule 99 + PIPELINE reduce by rule 99 + LOWERCASE reduce by rule 99 + UPPERCASE reduce by rule 99 + VERBATIM reduce by rule 99 + RTL reduce by rule 99 + NONFIX reduce by rule 99 + INFIX reduce by rule 99 + INFIXR reduce by rule 99 + DEBUG reduce by rule 99 + RESOURCE reduce by rule 99 + CPU reduce by rule 99 + LATENCY reduce by rule 99 + EXCEPTION reduce by rule 99 + EOF reduce by rule 99 + + + . error + + + state 143: + + sharelist : ident . EQ ident + sharelist : ident . EQ sharelist + + EQ shift 227 + + + . error + + + state 144: + + sharingdecl : TYPE . sharelist + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 143 + ident2 goto 112 + path goto 85 + sharelist goto 228 + + . error + + + state 145: + + mymldecl : SIGNATURE id . EQ sigexp + + EQ shift 229 + + + . error + + + state 146: + + mymldecl : FUNCTOR id . LPAREN functorarg RPAREN EQ structexp + mymldecl : FUNCTOR id . LPAREN functorarg RPAREN sigcon EQ structexp + mymldecl : FUNCTOR id . EQ structexp + + EQ shift 231 + LPAREN shift 230 + + + . error + + + state 147: + + mymldecl : STRUCTURE id . EQ structexp + mymldecl : STRUCTURE id . sigcon EQ structexp + mymldecl : STRUCTURE id . COLON sigexp + + EQ shift 235 + COLON shift 234 + COLONGREATER shift 233 + + sigcon goto 232 + + . error + + + state 148: + + mymddecl : LOCATIONS locbinds . (reduce by rule 21) + + ARCHITECTURE reduce by rule 21 + END reduce by rule 21 + LOCAL reduce by rule 21 + IN reduce by rule 21 + DATATYPE reduce by rule 21 + TYPE reduce by rule 21 + RPAREN reduce by rule 21 + SEMICOLON reduce by rule 21 + STORAGE reduce by rule 21 + LOCATIONS reduce by rule 21 + STRUCTURE reduce by rule 21 + FUNCTOR reduce by rule 21 + SIGNATURE reduce by rule 21 + SHARING reduce by rule 21 + INSTRUCTION reduce by rule 21 + VLIW reduce by rule 21 + SUPERSCALAR reduce by rule 21 + FUN reduce by rule 21 + VAL reduce by rule 21 + INCLUDE reduce by rule 21 + OPEN reduce by rule 21 + LITTLE reduce by rule 21 + BIG reduce by rule 21 + PIPELINE reduce by rule 21 + LOWERCASE reduce by rule 21 + UPPERCASE reduce by rule 21 + VERBATIM reduce by rule 21 + RTL reduce by rule 21 + NONFIX reduce by rule 21 + INFIX reduce by rule 21 + INFIXR reduce by rule 21 + DEBUG reduce by rule 21 + RESOURCE reduce by rule 21 + CPU reduce by rule 21 + LATENCY reduce by rule 21 + EXCEPTION reduce by rule 21 + EOF reduce by rule 21 + + + . error + + + state 149: + + locbinds : locbind . (reduce by rule 392) + locbinds : locbind . AND locbinds + + ARCHITECTURE reduce by rule 392 + END reduce by rule 392 + LOCAL reduce by rule 392 + IN reduce by rule 392 + DATATYPE reduce by rule 392 + TYPE reduce by rule 392 + AND shift 236 + RPAREN reduce by rule 392 + SEMICOLON reduce by rule 392 + STORAGE reduce by rule 392 + LOCATIONS reduce by rule 392 + STRUCTURE reduce by rule 392 + FUNCTOR reduce by rule 392 + SIGNATURE reduce by rule 392 + SHARING reduce by rule 392 + INSTRUCTION reduce by rule 392 + VLIW reduce by rule 392 + SUPERSCALAR reduce by rule 392 + FUN reduce by rule 392 + VAL reduce by rule 392 + INCLUDE reduce by rule 392 + OPEN reduce by rule 392 + LITTLE reduce by rule 392 + BIG reduce by rule 392 + PIPELINE reduce by rule 392 + LOWERCASE reduce by rule 392 + UPPERCASE reduce by rule 392 + VERBATIM reduce by rule 392 + RTL reduce by rule 392 + NONFIX reduce by rule 392 + INFIX reduce by rule 392 + INFIXR reduce by rule 392 + DEBUG reduce by rule 392 + RESOURCE reduce by rule 392 + CPU reduce by rule 392 + LATENCY reduce by rule 392 + EXCEPTION reduce by rule 392 + EOF reduce by rule 392 + + + . error + + + state 150: + + locbind : id . EQ exp + locbind : id . pat EQ exp + + EQ shift 238 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 237 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 151: + + mymddecl : STORAGE storagedecls . (reduce by rule 20) + + ARCHITECTURE reduce by rule 20 + END reduce by rule 20 + LOCAL reduce by rule 20 + IN reduce by rule 20 + DATATYPE reduce by rule 20 + TYPE reduce by rule 20 + RPAREN reduce by rule 20 + SEMICOLON reduce by rule 20 + STORAGE reduce by rule 20 + LOCATIONS reduce by rule 20 + STRUCTURE reduce by rule 20 + FUNCTOR reduce by rule 20 + SIGNATURE reduce by rule 20 + SHARING reduce by rule 20 + INSTRUCTION reduce by rule 20 + VLIW reduce by rule 20 + SUPERSCALAR reduce by rule 20 + FUN reduce by rule 20 + VAL reduce by rule 20 + INCLUDE reduce by rule 20 + OPEN reduce by rule 20 + LITTLE reduce by rule 20 + BIG reduce by rule 20 + PIPELINE reduce by rule 20 + LOWERCASE reduce by rule 20 + UPPERCASE reduce by rule 20 + VERBATIM reduce by rule 20 + RTL reduce by rule 20 + NONFIX reduce by rule 20 + INFIX reduce by rule 20 + INFIXR reduce by rule 20 + DEBUG reduce by rule 20 + RESOURCE reduce by rule 20 + CPU reduce by rule 20 + LATENCY reduce by rule 20 + EXCEPTION reduce by rule 20 + EOF reduce by rule 20 + + + . error + + + state 152: + + storagedecls : storagedecl . (reduce by rule 381) + storagedecls : storagedecl . BAR storagedecls + + ARCHITECTURE reduce by rule 381 + END reduce by rule 381 + LOCAL reduce by rule 381 + IN reduce by rule 381 + DATATYPE reduce by rule 381 + TYPE reduce by rule 381 + RPAREN reduce by rule 381 + SEMICOLON reduce by rule 381 + STORAGE reduce by rule 381 + LOCATIONS reduce by rule 381 + BAR shift 239 + STRUCTURE reduce by rule 381 + FUNCTOR reduce by rule 381 + SIGNATURE reduce by rule 381 + SHARING reduce by rule 381 + INSTRUCTION reduce by rule 381 + VLIW reduce by rule 381 + SUPERSCALAR reduce by rule 381 + FUN reduce by rule 381 + VAL reduce by rule 381 + INCLUDE reduce by rule 381 + OPEN reduce by rule 381 + LITTLE reduce by rule 381 + BIG reduce by rule 381 + PIPELINE reduce by rule 381 + LOWERCASE reduce by rule 381 + UPPERCASE reduce by rule 381 + VERBATIM reduce by rule 381 + RTL reduce by rule 381 + NONFIX reduce by rule 381 + INFIX reduce by rule 381 + INFIXR reduce by rule 381 + DEBUG reduce by rule 381 + RESOURCE reduce by rule 381 + CPU reduce by rule 381 + LATENCY reduce by rule 381 + EXCEPTION reduce by rule 381 + EOF reduce by rule 381 + + + . error + + + state 153: + + storagedecl : id . EQ DOLLAR id LBRACKET cellcount RBRACKET bitSize aliasing defaults printcell + + EQ shift 240 + + + . error + + + state 154: + + mymldecl : TYPE tyvarseq . tid + typebind : tyvarseq . tid EQ ty + + CELLSET shift 50 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + + id goto 243 + tid goto 242 + tid2 goto 241 + + . error + + + state 155: + + tyvarseq : tyvar . (reduce by rule 200) + + CELLSET reduce by rule 200 + BITS reduce by rule 200 + INSTRUCTION reduce by rule 200 + CELL reduce by rule 200 + ID reduce by rule 200 + SYMBOL reduce by rule 200 + + + . error + + + state 156: + + typebinds : typebind . (reduce by rule 196) + typebinds : typebind . AND typebinds + + ARCHITECTURE reduce by rule 196 + END reduce by rule 196 + LOCAL reduce by rule 196 + IN reduce by rule 196 + DATATYPE reduce by rule 196 + TYPE reduce by rule 196 + AND shift 247 + RPAREN reduce by rule 196 + SEMICOLON reduce by rule 196 + STORAGE reduce by rule 196 + LOCATIONS reduce by rule 196 + STRUCTURE reduce by rule 196 + FUNCTOR reduce by rule 196 + SIGNATURE reduce by rule 196 + SHARING reduce by rule 196 + INSTRUCTION reduce by rule 196 + VLIW reduce by rule 196 + SUPERSCALAR reduce by rule 196 + FUN reduce by rule 196 + VAL reduce by rule 196 + INCLUDE reduce by rule 196 + OPEN reduce by rule 196 + LITTLE reduce by rule 196 + BIG reduce by rule 196 + PIPELINE reduce by rule 196 + LOWERCASE reduce by rule 196 + UPPERCASE reduce by rule 196 + VERBATIM reduce by rule 196 + RTL reduce by rule 196 + NONFIX reduce by rule 196 + INFIX reduce by rule 196 + INFIXR reduce by rule 196 + DEBUG reduce by rule 196 + RESOURCE reduce by rule 196 + CPU reduce by rule 196 + LATENCY reduce by rule 196 + EXCEPTION reduce by rule 196 + EOF reduce by rule 196 + + + . error + + + state 157: + + mymldecl : TYPE typebinds . (reduce by rule 60) + + ARCHITECTURE reduce by rule 60 + END reduce by rule 60 + LOCAL reduce by rule 60 + IN reduce by rule 60 + DATATYPE reduce by rule 60 + TYPE reduce by rule 60 + RPAREN reduce by rule 60 + SEMICOLON reduce by rule 60 + STORAGE reduce by rule 60 + LOCATIONS reduce by rule 60 + STRUCTURE reduce by rule 60 + FUNCTOR reduce by rule 60 + SIGNATURE reduce by rule 60 + SHARING reduce by rule 60 + INSTRUCTION reduce by rule 60 + VLIW reduce by rule 60 + SUPERSCALAR reduce by rule 60 + FUN reduce by rule 60 + VAL reduce by rule 60 + INCLUDE reduce by rule 60 + OPEN reduce by rule 60 + LITTLE reduce by rule 60 + BIG reduce by rule 60 + PIPELINE reduce by rule 60 + LOWERCASE reduce by rule 60 + UPPERCASE reduce by rule 60 + VERBATIM reduce by rule 60 + RTL reduce by rule 60 + NONFIX reduce by rule 60 + INFIX reduce by rule 60 + INFIXR reduce by rule 60 + DEBUG reduce by rule 60 + RESOURCE reduce by rule 60 + CPU reduce by rule 60 + LATENCY reduce by rule 60 + EXCEPTION reduce by rule 60 + EOF reduce by rule 60 + + + . error + + + state 158: + + tyvar : TYVAR . (reduce by rule 426) + + ARCHITECTURE reduce by rule 426 + END reduce by rule 426 + LOCAL reduce by rule 426 + IN reduce by rule 426 + OF reduce by rule 426 + DATATYPE reduce by rule 426 + TYPE reduce by rule 426 + EQ reduce by rule 426 + TIMES reduce by rule 426 + AND reduce by rule 426 + LPAREN reduce by rule 426 + RPAREN reduce by rule 426 + RBRACKET reduce by rule 426 + RBRACE reduce by rule 426 + SEMICOLON reduce by rule 426 + LDQUOTE reduce by rule 426 + CELLSET reduce by rule 426 + STORAGE reduce by rule 426 + LOCATIONS reduce by rule 426 + COMMA reduce by rule 426 + COLON reduce by rule 426 + BAR reduce by rule 426 + ARROW reduce by rule 426 + DARROW reduce by rule 426 + BITS reduce by rule 426 + THEN reduce by rule 426 + ELSE reduce by rule 426 + STRUCTURE reduce by rule 426 + FUNCTOR reduce by rule 426 + SIGNATURE reduce by rule 426 + WHERE reduce by rule 426 + SHARING reduce by rule 426 + INSTRUCTION reduce by rule 426 + CELL reduce by rule 426 + VLIW reduce by rule 426 + SUPERSCALAR reduce by rule 426 + WITHTYPE reduce by rule 426 + FUN reduce by rule 426 + VAL reduce by rule 426 + INCLUDE reduce by rule 426 + OPEN reduce by rule 426 + LITTLE reduce by rule 426 + BIG reduce by rule 426 + PIPELINE reduce by rule 426 + LOWERCASE reduce by rule 426 + UPPERCASE reduce by rule 426 + VERBATIM reduce by rule 426 + RTL reduce by rule 426 + SPAN reduce by rule 426 + DELAYSLOT reduce by rule 426 + NONFIX reduce by rule 426 + INFIX reduce by rule 426 + INFIXR reduce by rule 426 + DEBUG reduce by rule 426 + ASM_COLON reduce by rule 426 + MC_COLON reduce by rule 426 + RTL_COLON reduce by rule 426 + DELAYSLOT_COLON reduce by rule 426 + NULLIFIED_COLON reduce by rule 426 + PADDING_COLON reduce by rule 426 + RESOURCE reduce by rule 426 + CPU reduce by rule 426 + LATENCY reduce by rule 426 + EXCEPTION reduce by rule 426 + ID reduce by rule 426 + SYMBOL reduce by rule 426 + WORD reduce by rule 426 + INT reduce by rule 426 + STRING reduce by rule 426 + EOF reduce by rule 426 + + + . error + + + state 159: + + tyvar : HASH . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 248 + + . error + + + state 160: + + tyvarseq : LPAREN . tyvars RPAREN + + HASH shift 159 + TYVAR shift 158 + + tyvar goto 250 + tyvars goto 249 + + . error + + + state 161: + + datatypebind : tyvarseq . id opcodeencoding fieldty hasasm EQ consbinds + datatypebind : tyvarseq . id opcodeencoding fieldty hasasm EQ DATATYPE ty + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 251 + + . error + + + state 162: + + datatypebinds : datatypebind . (reduce by rule 127) + datatypebinds : datatypebind . AND datatypebinds + + ARCHITECTURE reduce by rule 127 + END reduce by rule 127 + LOCAL reduce by rule 127 + IN reduce by rule 127 + DATATYPE reduce by rule 127 + TYPE reduce by rule 127 + AND shift 252 + RPAREN reduce by rule 127 + SEMICOLON reduce by rule 127 + STORAGE reduce by rule 127 + LOCATIONS reduce by rule 127 + STRUCTURE reduce by rule 127 + FUNCTOR reduce by rule 127 + SIGNATURE reduce by rule 127 + SHARING reduce by rule 127 + INSTRUCTION reduce by rule 127 + VLIW reduce by rule 127 + SUPERSCALAR reduce by rule 127 + WITHTYPE reduce by rule 127 + FUN reduce by rule 127 + VAL reduce by rule 127 + INCLUDE reduce by rule 127 + OPEN reduce by rule 127 + LITTLE reduce by rule 127 + BIG reduce by rule 127 + PIPELINE reduce by rule 127 + LOWERCASE reduce by rule 127 + UPPERCASE reduce by rule 127 + VERBATIM reduce by rule 127 + RTL reduce by rule 127 + NONFIX reduce by rule 127 + INFIX reduce by rule 127 + INFIXR reduce by rule 127 + DEBUG reduce by rule 127 + RESOURCE reduce by rule 127 + CPU reduce by rule 127 + LATENCY reduce by rule 127 + EXCEPTION reduce by rule 127 + EOF reduce by rule 127 + + + . error + + + state 163: + + mymldecl : DATATYPE datatypebinds . withtypeclause + + ARCHITECTURE reduce by rule 194 + END reduce by rule 194 + LOCAL reduce by rule 194 + IN reduce by rule 194 + DATATYPE reduce by rule 194 + TYPE reduce by rule 194 + RPAREN reduce by rule 194 + SEMICOLON reduce by rule 194 + STORAGE reduce by rule 194 + LOCATIONS reduce by rule 194 + STRUCTURE reduce by rule 194 + FUNCTOR reduce by rule 194 + SIGNATURE reduce by rule 194 + SHARING reduce by rule 194 + INSTRUCTION reduce by rule 194 + VLIW reduce by rule 194 + SUPERSCALAR reduce by rule 194 + WITHTYPE shift 254 + FUN reduce by rule 194 + VAL reduce by rule 194 + INCLUDE reduce by rule 194 + OPEN reduce by rule 194 + LITTLE reduce by rule 194 + BIG reduce by rule 194 + PIPELINE reduce by rule 194 + LOWERCASE reduce by rule 194 + UPPERCASE reduce by rule 194 + VERBATIM reduce by rule 194 + RTL reduce by rule 194 + NONFIX reduce by rule 194 + INFIX reduce by rule 194 + INFIXR reduce by rule 194 + DEBUG reduce by rule 194 + RESOURCE reduce by rule 194 + CPU reduce by rule 194 + LATENCY reduce by rule 194 + EXCEPTION reduce by rule 194 + EOF reduce by rule 194 + + withtypeclause goto 253 + + . error + + + state 164: + + scopeddecls : newScope . decls oldScope + + ARCHITECTURE shift 39 + END reduce by rule 1 + LOCAL shift 38 + IN reduce by rule 1 + DATATYPE shift 37 + TYPE shift 36 + RPAREN reduce by rule 1 + STORAGE shift 35 + LOCATIONS shift 34 + STRUCTURE shift 33 + FUNCTOR shift 32 + SIGNATURE shift 31 + SHARING shift 30 + INSTRUCTION shift 29 + VLIW shift 28 + SUPERSCALAR shift 27 + FUN shift 26 + VAL shift 25 + INCLUDE shift 24 + OPEN shift 23 + LITTLE shift 22 + BIG shift 21 + PIPELINE shift 20 + LOWERCASE shift 19 + UPPERCASE shift 18 + VERBATIM shift 17 + RTL shift 16 + NONFIX shift 15 + INFIX shift 14 + INFIXR shift 13 + DEBUG shift 12 + RESOURCE shift 11 + CPU shift 10 + LATENCY shift 9 + EXCEPTION shift 8 + + decls goto 255 + decl goto 6 + mldecl goto 5 + mymldecl goto 4 + mddecl goto 3 + mymddecl goto 2 + assemblycase goto 1 + + . error + + + state 165: + + mymldecl : LOCAL scopeddecls . IN scopeddecls END + + IN shift 256 + + + . error + + + state 166: + + mymddecl : ARCHITECTURE id . EQ STRUCT decls END + + EQ shift 257 + + + . error + + + state 167: + + optsemi : SEMICOLON optsemi . (reduce by rule 6) + + ARCHITECTURE reduce by rule 6 + END reduce by rule 6 + LOCAL reduce by rule 6 + IN reduce by rule 6 + DATATYPE reduce by rule 6 + TYPE reduce by rule 6 + RPAREN reduce by rule 6 + STORAGE reduce by rule 6 + LOCATIONS reduce by rule 6 + STRUCTURE reduce by rule 6 + FUNCTOR reduce by rule 6 + SIGNATURE reduce by rule 6 + SHARING reduce by rule 6 + INSTRUCTION reduce by rule 6 + VLIW reduce by rule 6 + SUPERSCALAR reduce by rule 6 + FUN reduce by rule 6 + VAL reduce by rule 6 + INCLUDE reduce by rule 6 + OPEN reduce by rule 6 + LITTLE reduce by rule 6 + BIG reduce by rule 6 + PIPELINE reduce by rule 6 + LOWERCASE reduce by rule 6 + UPPERCASE reduce by rule 6 + VERBATIM reduce by rule 6 + RTL reduce by rule 6 + NONFIX reduce by rule 6 + INFIX reduce by rule 6 + INFIXR reduce by rule 6 + DEBUG reduce by rule 6 + RESOURCE reduce by rule 6 + CPU reduce by rule 6 + LATENCY reduce by rule 6 + EXCEPTION reduce by rule 6 + EOF reduce by rule 6 + + + . error + + + state 168: + + exceptionbinds : exceptionbind AND . exceptionbinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 47 + exceptionbind goto 46 + exceptionbinds goto 258 + + . error + + + state 169: + + exceptionbind : id EQ . ident + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 259 + ident2 goto 112 + path goto 85 + + . error + + + state 170: + + exceptionbind : id OF . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 264 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 171: + + latencyclauses : latencyclause BAR . latencyclauses + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 55 + latencyclauses goto 272 + latencyclause goto 51 + + . error + + + state 172: + + latencybinds : latencybind AND . latencybinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 55 + latencybinds goto 273 + latencybind goto 53 + latencyclauses goto 52 + latencyclause goto 51 + + . error + + + state 173: + + latencyclause : id pat . EQ exp + + EQ shift 274 + + + . error + + + state 174: + + cpubinds : cpubind AND . cpubinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 58 + cpubinds goto 275 + cpubind goto 56 + + . error + + + state 175: + + cpubind : id aliases . int LBRACKET resources RBRACKET + + INT shift 64 + + int goto 276 + + . error + + + state 176: + + aliases : string . aliases + + INT reduce by rule 33 + STRING shift 91 + + string goto 176 + aliases goto 277 + + . error + + + state 177: + + resourcebinds : id AND . resourcebinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 60 + resourcebinds goto 278 + + . error + + + state 178: + + mymldecl : INFIXR intopt syms . (reduce by rule 78) + + ARCHITECTURE reduce by rule 78 + END reduce by rule 78 + LOCAL reduce by rule 78 + IN reduce by rule 78 + DATATYPE reduce by rule 78 + TYPE reduce by rule 78 + RPAREN reduce by rule 78 + SEMICOLON reduce by rule 78 + STORAGE reduce by rule 78 + LOCATIONS reduce by rule 78 + STRUCTURE reduce by rule 78 + FUNCTOR reduce by rule 78 + SIGNATURE reduce by rule 78 + SHARING reduce by rule 78 + INSTRUCTION reduce by rule 78 + VLIW reduce by rule 78 + SUPERSCALAR reduce by rule 78 + FUN reduce by rule 78 + VAL reduce by rule 78 + INCLUDE reduce by rule 78 + OPEN reduce by rule 78 + LITTLE reduce by rule 78 + BIG reduce by rule 78 + PIPELINE reduce by rule 78 + LOWERCASE reduce by rule 78 + UPPERCASE reduce by rule 78 + VERBATIM reduce by rule 78 + RTL reduce by rule 78 + NONFIX reduce by rule 78 + INFIX reduce by rule 78 + INFIXR reduce by rule 78 + DEBUG reduce by rule 78 + RESOURCE reduce by rule 78 + CPU reduce by rule 78 + LATENCY reduce by rule 78 + EXCEPTION reduce by rule 78 + EOF reduce by rule 78 + + + . error + + + state 179: + + mymldecl : INFIX intopt syms . (reduce by rule 77) + + ARCHITECTURE reduce by rule 77 + END reduce by rule 77 + LOCAL reduce by rule 77 + IN reduce by rule 77 + DATATYPE reduce by rule 77 + TYPE reduce by rule 77 + RPAREN reduce by rule 77 + SEMICOLON reduce by rule 77 + STORAGE reduce by rule 77 + LOCATIONS reduce by rule 77 + STRUCTURE reduce by rule 77 + FUNCTOR reduce by rule 77 + SIGNATURE reduce by rule 77 + SHARING reduce by rule 77 + INSTRUCTION reduce by rule 77 + VLIW reduce by rule 77 + SUPERSCALAR reduce by rule 77 + FUN reduce by rule 77 + VAL reduce by rule 77 + INCLUDE reduce by rule 77 + OPEN reduce by rule 77 + LITTLE reduce by rule 77 + BIG reduce by rule 77 + PIPELINE reduce by rule 77 + LOWERCASE reduce by rule 77 + UPPERCASE reduce by rule 77 + VERBATIM reduce by rule 77 + RTL reduce by rule 77 + NONFIX reduce by rule 77 + INFIX reduce by rule 77 + INFIXR reduce by rule 77 + DEBUG reduce by rule 77 + RESOURCE reduce by rule 77 + CPU reduce by rule 77 + LATENCY reduce by rule 77 + EXCEPTION reduce by rule 77 + EOF reduce by rule 77 + + + . error + + + state 180: + + syms : sym syms . (reduce by rule 110) + + ARCHITECTURE reduce by rule 110 + END reduce by rule 110 + LOCAL reduce by rule 110 + IN reduce by rule 110 + DATATYPE reduce by rule 110 + TYPE reduce by rule 110 + RPAREN reduce by rule 110 + SEMICOLON reduce by rule 110 + STORAGE reduce by rule 110 + LOCATIONS reduce by rule 110 + COLON reduce by rule 110 + STRUCTURE reduce by rule 110 + FUNCTOR reduce by rule 110 + SIGNATURE reduce by rule 110 + SHARING reduce by rule 110 + INSTRUCTION reduce by rule 110 + VLIW reduce by rule 110 + SUPERSCALAR reduce by rule 110 + FUN reduce by rule 110 + VAL reduce by rule 110 + INCLUDE reduce by rule 110 + OPEN reduce by rule 110 + LITTLE reduce by rule 110 + BIG reduce by rule 110 + PIPELINE reduce by rule 110 + LOWERCASE reduce by rule 110 + UPPERCASE reduce by rule 110 + VERBATIM reduce by rule 110 + RTL reduce by rule 110 + NONFIX reduce by rule 110 + INFIX reduce by rule 110 + INFIXR reduce by rule 110 + DEBUG reduce by rule 110 + RESOURCE reduce by rule 110 + CPU reduce by rule 110 + LATENCY reduce by rule 110 + EXCEPTION reduce by rule 110 + EOF reduce by rule 110 + + + . error + + + state 181: + + mymldecl : RTL asapat EQ . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 281 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 182: + + path : path DOT . sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 302 + symb goto 67 + + . error + + + state 183: + + mymldecl : RTL syms COLON . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 303 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 184: + + apat : sym CONCAT . LBRACKET pats RBRACKET + apat : sym CONCAT . LBRACKET pats RBRACKET CONCAT sym + + LBRACKET shift 304 + + + . error + + + state 185: + + asapat : id AS . asapat + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 307 + sym goto 306 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 84 + asapat goto 305 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 186: + + path : id DOT . sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 308 + symb goto 67 + + . error + + + state 187: + + mymldecl : RTL id LBRACE . labpats0 RBRACE EQ exp + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + RBRACE reduce by rule 326 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 191 + symb goto 67 + labpat goto 190 + labpats0 goto 309 + labpats goto 188 + + . error + + + state 188: + + labpats0 : labpats . (reduce by rule 327) + + RBRACE reduce by rule 327 + + + . error + + + state 189: + + apat : LBRACE labpats0 . RBRACE + + RBRACE shift 310 + + + . error + + + state 190: + + labpats : labpat . (reduce by rule 328) + labpats : labpat . COMMA DOTDOT + labpats : labpat . COMMA labpats + + RBRACE reduce by rule 328 + COMMA shift 311 + + + . error + + + state 191: + + labpat : sym . (reduce by rule 331) + labpat : sym . EQ typedpat + labpat : sym . AS typedpat + labpat : sym . WHERE typedexp + labpat : sym . WHERE typedexp IN typedpat + + EQ shift 314 + RBRACE reduce by rule 331 + COMMA reduce by rule 331 + WHERE shift 313 + AS shift 312 + + + . error + + + state 192: + + pats : pats1 . (reduce by rule 322) + + RBRACKET reduce by rule 322 + + + . error + + + state 193: + + apat : LBRACKET pats . RBRACKET + apat : LBRACKET pats . RBRACKET CONCAT sym + + RBRACKET shift 315 + + + . error + + + state 194: + + typedpat : typedpat . COLON ty + pats1 : typedpat . (reduce by rule 323) + pats1 : typedpat . COMMA pats1 + + RPAREN reduce by rule 323 + RBRACKET reduce by rule 323 + COMMA shift 317 + COLON shift 316 + + + . error + + + state 195: + + typedpat : pat . (reduce by rule 317) + + AND reduce by rule 317 + RPAREN reduce by rule 317 + RBRACKET reduce by rule 317 + RBRACE reduce by rule 317 + COMMA reduce by rule 317 + COLON reduce by rule 317 + BAR reduce by rule 317 + DARROW reduce by rule 317 + WHERE reduce by rule 317 + EXCEPTION reduce by rule 317 + + + . error + + + state 196: + + apat : LPAREN andpats2 . RPAREN + + RPAREN shift 318 + + + . error + + + state 197: + + apat : LPAREN orpats2 . RPAREN + + RPAREN shift 319 + + + . error + + + state 198: + + apat : LPAREN pats2 . RPAREN + + RPAREN shift 320 + + + . error + + + state 199: + + apat : LPAREN typedpat . RPAREN + apat : LPAREN typedpat . WHERE typedexp RPAREN + apat : LPAREN typedpat . WHERE typedexp IN typedpat RPAREN + typedpat : typedpat . COLON ty + pats2 : typedpat . COMMA pats1 + orpats2 : typedpat . BAR typedpat + orpats2 : typedpat . BAR orpats2 + andpats2 : typedpat . AND typedpat + andpats2 : typedpat . AND andpats2 + + AND shift 325 + RPAREN shift 324 + COMMA shift 323 + COLON shift 316 + BAR shift 322 + WHERE shift 321 + + + . error + + + state 200: + + apat : LPAREN RPAREN . (reduce by rule 293) + + EQ reduce by rule 293 + TIMES reduce by rule 293 + AND reduce by rule 293 + DEREF reduce by rule 293 + NOT reduce by rule 293 + LHASHBRACKET reduce by rule 293 + LPAREN reduce by rule 293 + RPAREN reduce by rule 293 + LBRACKET reduce by rule 293 + RBRACKET reduce by rule 293 + LBRACE reduce by rule 293 + RBRACE reduce by rule 293 + CELLSET reduce by rule 293 + COMMA reduce by rule 293 + COLON reduce by rule 293 + BAR reduce by rule 293 + DARROW reduce by rule 293 + TRUE reduce by rule 293 + FALSE reduce by rule 293 + WILD reduce by rule 293 + WHERE reduce by rule 293 + OP reduce by rule 293 + ALWAYS reduce by rule 293 + NEVER reduce by rule 293 + EXCEPTION reduce by rule 293 + ID reduce by rule 293 + SYMBOL reduce by rule 293 + WORD reduce by rule 293 + INT reduce by rule 293 + INTINF reduce by rule 293 + REAL reduce by rule 293 + STRING reduce by rule 293 + CHAR reduce by rule 293 + + + . error + + + state 201: + + apat : LHASHBRACKET pats . RBRACKET + + RBRACKET shift 326 + + + . error + + + state 202: + + pipelineclauses : pipelineclause BAR . pipelineclauses + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 108 + pipelineclauses goto 327 + pipelineclause goto 104 + + . error + + + state 203: + + pipelinebinds : pipelinebind AND . pipelinebinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 108 + pipelinebinds goto 328 + pipelinebind goto 106 + pipelineclauses goto 105 + pipelineclause goto 104 + + . error + + + state 204: + + pipelineclause : id pat . EQ LBRACKET cycles0 RBRACKET + + EQ shift 329 + + + . error + + + state 205: + + idents : ident idents . (reduce by rule 112) + + ARCHITECTURE reduce by rule 112 + END reduce by rule 112 + LOCAL reduce by rule 112 + IN reduce by rule 112 + DATATYPE reduce by rule 112 + TYPE reduce by rule 112 + RPAREN reduce by rule 112 + SEMICOLON reduce by rule 112 + STORAGE reduce by rule 112 + LOCATIONS reduce by rule 112 + STRUCTURE reduce by rule 112 + FUNCTOR reduce by rule 112 + SIGNATURE reduce by rule 112 + SHARING reduce by rule 112 + INSTRUCTION reduce by rule 112 + VLIW reduce by rule 112 + SUPERSCALAR reduce by rule 112 + FUN reduce by rule 112 + VAL reduce by rule 112 + INCLUDE reduce by rule 112 + OPEN reduce by rule 112 + LITTLE reduce by rule 112 + BIG reduce by rule 112 + PIPELINE reduce by rule 112 + LOWERCASE reduce by rule 112 + UPPERCASE reduce by rule 112 + VERBATIM reduce by rule 112 + RTL reduce by rule 112 + NONFIX reduce by rule 112 + INFIX reduce by rule 112 + INFIXR reduce by rule 112 + DEBUG reduce by rule 112 + RESOURCE reduce by rule 112 + CPU reduce by rule 112 + LATENCY reduce by rule 112 + EXCEPTION reduce by rule 112 + EOF reduce by rule 112 + + + . error + + + state 206: + + sigexp : sigexp WHERE . sigsubs + + TYPE shift 333 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 332 + ident2 goto 112 + path goto 85 + sigsub goto 331 + sigsubs goto 330 + + . error + + + state 207: + + decl : INCLUDE string optsemi . (reduce by rule 9) + + ARCHITECTURE reduce by rule 9 + END reduce by rule 9 + LOCAL reduce by rule 9 + IN reduce by rule 9 + DATATYPE reduce by rule 9 + TYPE reduce by rule 9 + RPAREN reduce by rule 9 + STORAGE reduce by rule 9 + LOCATIONS reduce by rule 9 + STRUCTURE reduce by rule 9 + FUNCTOR reduce by rule 9 + SIGNATURE reduce by rule 9 + SHARING reduce by rule 9 + INSTRUCTION reduce by rule 9 + VLIW reduce by rule 9 + SUPERSCALAR reduce by rule 9 + FUN reduce by rule 9 + VAL reduce by rule 9 + INCLUDE reduce by rule 9 + OPEN reduce by rule 9 + LITTLE reduce by rule 9 + BIG reduce by rule 9 + PIPELINE reduce by rule 9 + LOWERCASE reduce by rule 9 + UPPERCASE reduce by rule 9 + VERBATIM reduce by rule 9 + RTL reduce by rule 9 + NONFIX reduce by rule 9 + INFIX reduce by rule 9 + INFIXR reduce by rule 9 + DEBUG reduce by rule 9 + RESOURCE reduce by rule 9 + CPU reduce by rule 9 + LATENCY reduce by rule 9 + EXCEPTION reduce by rule 9 + EOF reduce by rule 9 + + + . error + + + state 208: + + sigexp : SIG decls . END + + END shift 334 + + + . error + + + state 209: + + valbinds : valbind AND . valbinds + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 121 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + valbind goto 120 + valbinds goto 335 + True goto 74 + False goto 73 + + . error + + + state 210: + + valbind : pat EQ . typedexp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 336 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 211: + + apppat : apppat apat2 . (reduce by rule 314) + + EQ reduce by rule 314 + TIMES reduce by rule 314 + AND reduce by rule 314 + DEREF reduce by rule 314 + NOT reduce by rule 314 + LHASHBRACKET reduce by rule 314 + LPAREN reduce by rule 314 + RPAREN reduce by rule 314 + LBRACKET reduce by rule 314 + RBRACKET reduce by rule 314 + LBRACE reduce by rule 314 + RBRACE reduce by rule 314 + CELLSET reduce by rule 314 + COMMA reduce by rule 314 + COLON reduce by rule 314 + BAR reduce by rule 314 + DARROW reduce by rule 314 + TRUE reduce by rule 314 + FALSE reduce by rule 314 + WILD reduce by rule 314 + WHERE reduce by rule 314 + OP reduce by rule 314 + ALWAYS reduce by rule 314 + NEVER reduce by rule 314 + EXCEPTION reduce by rule 314 + ID reduce by rule 314 + SYMBOL reduce by rule 314 + WORD reduce by rule 314 + INT reduce by rule 314 + INTINF reduce by rule 314 + REAL reduce by rule 314 + STRING reduce by rule 314 + CHAR reduce by rule 314 + + + . error + + + state 212: + + mymldecl : VAL syms COLON . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 338 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 213: + + pat : id AS . pat + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 339 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 214: + + apat2 : OP sym . (reduce by rule 312) + + EQ reduce by rule 312 + TIMES reduce by rule 312 + AND reduce by rule 312 + DEREF reduce by rule 312 + NOT reduce by rule 312 + LHASHBRACKET reduce by rule 312 + LPAREN reduce by rule 312 + RPAREN reduce by rule 312 + LBRACKET reduce by rule 312 + RBRACKET reduce by rule 312 + LBRACE reduce by rule 312 + RBRACE reduce by rule 312 + CELLSET reduce by rule 312 + COMMA reduce by rule 312 + COLON reduce by rule 312 + BAR reduce by rule 312 + DARROW reduce by rule 312 + TRUE reduce by rule 312 + FALSE reduce by rule 312 + WILD reduce by rule 312 + WHERE reduce by rule 312 + OP reduce by rule 312 + ALWAYS reduce by rule 312 + NEVER reduce by rule 312 + EXCEPTION reduce by rule 312 + ID reduce by rule 312 + SYMBOL reduce by rule 312 + WORD reduce by rule 312 + INT reduce by rule 312 + INTINF reduce by rule 312 + REAL reduce by rule 312 + STRING reduce by rule 312 + CHAR reduce by rule 312 + + + . error + + + state 215: + + funbinds : funbind AND . funbinds + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 133 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + funclause goto 132 + funclauses goto 131 + funbind goto 130 + funbinds goto 340 + True goto 74 + False goto 73 + + . error + + + state 216: + + funclauses : funclause BAR . funclauses + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 133 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + funclause goto 132 + funclauses goto 341 + True goto 74 + False goto 73 + + . error + + + state 217: + + funclause : apppat funguard . return_ty cont EQ typedexp + + EQ reduce by rule 344 + COLON shift 343 + EXCEPTION reduce by rule 344 + + return_ty goto 342 + + . error + + + state 218: + + funguard : WHERE . LPAREN typedexp RPAREN + + LPAREN shift 344 + + + . error + + + state 219: + + consbinds : consbind BAR . consbinds + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 138 + symb goto 67 + consbinds goto 345 + consbind goto 136 + + . error + + + state 220: + + consbind : sym of_ty . consassembly consencoding rtl nop nullified delayslot delayslotcandidate sdi latency pipeline + + ARCHITECTURE reduce by rule 182 + END reduce by rule 182 + LOCAL reduce by rule 182 + IN reduce by rule 182 + DATATYPE reduce by rule 182 + TYPE reduce by rule 182 + AND reduce by rule 182 + LPAREN reduce by rule 182 + RPAREN reduce by rule 182 + SEMICOLON reduce by rule 182 + LDQUOTE shift 293 + CELLSET reduce by rule 182 + STORAGE reduce by rule 182 + LOCATIONS reduce by rule 182 + BAR reduce by rule 182 + STRUCTURE reduce by rule 182 + FUNCTOR reduce by rule 182 + SIGNATURE reduce by rule 182 + SHARING reduce by rule 182 + INSTRUCTION reduce by rule 182 + VLIW reduce by rule 182 + SUPERSCALAR reduce by rule 182 + WITHTYPE reduce by rule 182 + FUN reduce by rule 182 + VAL reduce by rule 182 + INCLUDE reduce by rule 182 + OPEN reduce by rule 182 + LITTLE reduce by rule 182 + BIG reduce by rule 182 + PIPELINE reduce by rule 182 + LOWERCASE reduce by rule 182 + UPPERCASE reduce by rule 182 + VERBATIM reduce by rule 182 + RTL reduce by rule 182 + SPAN reduce by rule 182 + DELAYSLOT reduce by rule 182 + NONFIX reduce by rule 182 + INFIX reduce by rule 182 + INFIXR reduce by rule 182 + DEBUG reduce by rule 182 + ASM_COLON shift 349 + MC_COLON reduce by rule 182 + RTL_COLON reduce by rule 182 + DELAYSLOT_COLON reduce by rule 182 + NULLIFIED_COLON reduce by rule 182 + PADDING_COLON reduce by rule 182 + RESOURCE reduce by rule 182 + CPU reduce by rule 182 + LATENCY reduce by rule 182 + EXCEPTION reduce by rule 182 + ID reduce by rule 182 + SYMBOL reduce by rule 182 + WORD reduce by rule 182 + INT reduce by rule 182 + STRING shift 91 + EOF reduce by rule 182 + + string goto 348 + consassembly goto 347 + asm_strings goto 346 + + . error + + + state 221: + + of_ty : OF . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 350 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 222: + + mymddecl : INSTRUCTION FORMATS formatbinds . (reduce by rule 19) + + ARCHITECTURE reduce by rule 19 + END reduce by rule 19 + LOCAL reduce by rule 19 + IN reduce by rule 19 + DATATYPE reduce by rule 19 + TYPE reduce by rule 19 + RPAREN reduce by rule 19 + SEMICOLON reduce by rule 19 + STORAGE reduce by rule 19 + LOCATIONS reduce by rule 19 + STRUCTURE reduce by rule 19 + FUNCTOR reduce by rule 19 + SIGNATURE reduce by rule 19 + SHARING reduce by rule 19 + INSTRUCTION reduce by rule 19 + VLIW reduce by rule 19 + SUPERSCALAR reduce by rule 19 + FUN reduce by rule 19 + VAL reduce by rule 19 + INCLUDE reduce by rule 19 + OPEN reduce by rule 19 + LITTLE reduce by rule 19 + BIG reduce by rule 19 + PIPELINE reduce by rule 19 + LOWERCASE reduce by rule 19 + UPPERCASE reduce by rule 19 + VERBATIM reduce by rule 19 + RTL reduce by rule 19 + NONFIX reduce by rule 19 + INFIX reduce by rule 19 + INFIXR reduce by rule 19 + DEBUG reduce by rule 19 + RESOURCE reduce by rule 19 + CPU reduce by rule 19 + LATENCY reduce by rule 19 + EXCEPTION reduce by rule 19 + EOF reduce by rule 19 + + + . error + + + state 223: + + formatbinds : formatbind . (reduce by rule 204) + formatbinds : formatbind . BAR formatbinds + + ARCHITECTURE reduce by rule 204 + END reduce by rule 204 + LOCAL reduce by rule 204 + IN reduce by rule 204 + DATATYPE reduce by rule 204 + TYPE reduce by rule 204 + RPAREN reduce by rule 204 + SEMICOLON reduce by rule 204 + STORAGE reduce by rule 204 + LOCATIONS reduce by rule 204 + BAR shift 351 + STRUCTURE reduce by rule 204 + FUNCTOR reduce by rule 204 + SIGNATURE reduce by rule 204 + SHARING reduce by rule 204 + INSTRUCTION reduce by rule 204 + VLIW reduce by rule 204 + SUPERSCALAR reduce by rule 204 + FUN reduce by rule 204 + VAL reduce by rule 204 + INCLUDE reduce by rule 204 + OPEN reduce by rule 204 + LITTLE reduce by rule 204 + BIG reduce by rule 204 + PIPELINE reduce by rule 204 + LOWERCASE reduce by rule 204 + UPPERCASE reduce by rule 204 + VERBATIM reduce by rule 204 + RTL reduce by rule 204 + NONFIX reduce by rule 204 + INFIX reduce by rule 204 + INFIXR reduce by rule 204 + DEBUG reduce by rule 204 + RESOURCE reduce by rule 204 + CPU reduce by rule 204 + LATENCY reduce by rule 204 + EXCEPTION reduce by rule 204 + EOF reduce by rule 204 + + + . error + + + state 224: + + mymddecl : INSTRUCTION FORMATS int . BITS formatbinds + + BITS shift 352 + + + . error + + + state 225: + + formatbind : id . opt_of LBRACE fields RBRACE opt_exp + + OF shift 354 + LBRACE reduce by rule 192 + + opt_of goto 353 + + . error + + + state 226: + + sharingdecls : sharingdecl AND . sharingdecls + + TYPE shift 144 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 143 + ident2 goto 112 + path goto 85 + sharingdecl goto 142 + sharingdecls goto 355 + sharelist goto 140 + + . error + + + state 227: + + sharelist : ident EQ . ident + sharelist : ident EQ . sharelist + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 357 + ident2 goto 112 + path goto 85 + sharelist goto 356 + + . error + + + state 228: + + sharingdecl : TYPE sharelist . (reduce by rule 101) + + ARCHITECTURE reduce by rule 101 + END reduce by rule 101 + LOCAL reduce by rule 101 + IN reduce by rule 101 + DATATYPE reduce by rule 101 + TYPE reduce by rule 101 + AND reduce by rule 101 + RPAREN reduce by rule 101 + SEMICOLON reduce by rule 101 + STORAGE reduce by rule 101 + LOCATIONS reduce by rule 101 + STRUCTURE reduce by rule 101 + FUNCTOR reduce by rule 101 + SIGNATURE reduce by rule 101 + SHARING reduce by rule 101 + INSTRUCTION reduce by rule 101 + VLIW reduce by rule 101 + SUPERSCALAR reduce by rule 101 + FUN reduce by rule 101 + VAL reduce by rule 101 + INCLUDE reduce by rule 101 + OPEN reduce by rule 101 + LITTLE reduce by rule 101 + BIG reduce by rule 101 + PIPELINE reduce by rule 101 + LOWERCASE reduce by rule 101 + UPPERCASE reduce by rule 101 + VERBATIM reduce by rule 101 + RTL reduce by rule 101 + NONFIX reduce by rule 101 + INFIX reduce by rule 101 + INFIXR reduce by rule 101 + DEBUG reduce by rule 101 + RESOURCE reduce by rule 101 + CPU reduce by rule 101 + LATENCY reduce by rule 101 + EXCEPTION reduce by rule 101 + EOF reduce by rule 101 + + + . error + + + state 229: + + mymldecl : SIGNATURE id EQ . sigexp + + CELLSET shift 50 + SIG shift 118 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 117 + ident2 goto 112 + path goto 85 + sigexp goto 358 + + . error + + + state 230: + + mymldecl : FUNCTOR id LPAREN . functorarg RPAREN EQ structexp + mymldecl : FUNCTOR id LPAREN . functorarg RPAREN sigcon EQ structexp + + ARCHITECTURE reduce by rule 107 + LOCAL reduce by rule 107 + DATATYPE reduce by rule 107 + TYPE reduce by rule 107 + RPAREN reduce by rule 107 + CELLSET shift 50 + STORAGE reduce by rule 107 + LOCATIONS reduce by rule 107 + STRUCTURE reduce by rule 107 + FUNCTOR reduce by rule 107 + SIGNATURE reduce by rule 107 + SHARING reduce by rule 107 + INSTRUCTION reduce by rule 107 + VLIW reduce by rule 107 + SUPERSCALAR reduce by rule 107 + FUN reduce by rule 107 + VAL reduce by rule 107 + INCLUDE reduce by rule 107 + OPEN reduce by rule 107 + LITTLE reduce by rule 107 + BIG reduce by rule 107 + PIPELINE reduce by rule 107 + LOWERCASE reduce by rule 107 + UPPERCASE reduce by rule 107 + VERBATIM reduce by rule 107 + RTL reduce by rule 107 + NONFIX reduce by rule 107 + INFIX reduce by rule 107 + INFIXR reduce by rule 107 + DEBUG reduce by rule 107 + RESOURCE reduce by rule 107 + CPU reduce by rule 107 + LATENCY reduce by rule 107 + EXCEPTION reduce by rule 107 + ID shift 49 + SYMBOL shift 48 + + id goto 361 + scopeddecls goto 360 + functorarg goto 359 + newScope goto 164 + + . error + + + state 231: + + mymldecl : FUNCTOR id EQ . structexp + + CELLSET shift 50 + STRUCT shift 364 + ID shift 49 + SYMBOL shift 48 + + structexp goto 363 + id goto 114 + ident goto 362 + ident2 goto 112 + path goto 85 + + . error + + + state 232: + + mymldecl : STRUCTURE id sigcon . EQ structexp + + EQ shift 365 + + + . error + + + state 233: + + sigcon : COLONGREATER . sigexp + + CELLSET shift 50 + SIG shift 118 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 117 + ident2 goto 112 + path goto 85 + sigexp goto 366 + + . error + + + state 234: + + sigcon : COLON . sigexp + mymldecl : STRUCTURE id COLON . sigexp + + CELLSET shift 50 + SIG shift 118 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 117 + ident2 goto 112 + path goto 85 + sigexp goto 367 + + . error + + + state 235: + + mymldecl : STRUCTURE id EQ . structexp + + CELLSET shift 50 + STRUCT shift 364 + ID shift 49 + SYMBOL shift 48 + + structexp goto 368 + id goto 114 + ident goto 362 + ident2 goto 112 + path goto 85 + + . error + + + state 236: + + locbinds : locbind AND . locbinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 150 + locbind goto 149 + locbinds goto 369 + + . error + + + state 237: + + locbind : id pat . EQ exp + + EQ shift 370 + + + . error + + + state 238: + + locbind : id EQ . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 371 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 239: + + storagedecls : storagedecl BAR . storagedecls + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 153 + storagedecl goto 152 + storagedecls goto 372 + + . error + + + state 240: + + storagedecl : id EQ . DOLLAR id LBRACKET cellcount RBRACKET bitSize aliasing defaults printcell + + DOLLAR shift 373 + + + . error + + + state 241: + + tid : tid2 . (reduce by rule 361) + + ARCHITECTURE reduce by rule 361 + END reduce by rule 361 + LOCAL reduce by rule 361 + IN reduce by rule 361 + OF reduce by rule 361 + DATATYPE reduce by rule 361 + TYPE reduce by rule 361 + EQ reduce by rule 361 + TIMES reduce by rule 361 + AND reduce by rule 361 + LPAREN reduce by rule 361 + RPAREN reduce by rule 361 + RBRACKET reduce by rule 361 + RBRACE reduce by rule 361 + SEMICOLON reduce by rule 361 + LDQUOTE reduce by rule 361 + CELLSET reduce by rule 361 + STORAGE reduce by rule 361 + LOCATIONS reduce by rule 361 + COMMA reduce by rule 361 + COLON reduce by rule 361 + DOT reduce by rule 361 + BAR reduce by rule 361 + ARROW reduce by rule 361 + DARROW reduce by rule 361 + BITS reduce by rule 361 + THEN reduce by rule 361 + ELSE reduce by rule 361 + STRUCTURE reduce by rule 361 + FUNCTOR reduce by rule 361 + SIGNATURE reduce by rule 361 + WHERE reduce by rule 361 + SHARING reduce by rule 361 + INSTRUCTION reduce by rule 361 + CELL reduce by rule 361 + VLIW reduce by rule 361 + SUPERSCALAR reduce by rule 361 + WITHTYPE reduce by rule 361 + FUN reduce by rule 361 + VAL reduce by rule 361 + INCLUDE reduce by rule 361 + OPEN reduce by rule 361 + LITTLE reduce by rule 361 + BIG reduce by rule 361 + PIPELINE reduce by rule 361 + LOWERCASE reduce by rule 361 + UPPERCASE reduce by rule 361 + VERBATIM reduce by rule 361 + RTL reduce by rule 361 + SPAN reduce by rule 361 + DELAYSLOT reduce by rule 361 + NONFIX reduce by rule 361 + INFIX reduce by rule 361 + INFIXR reduce by rule 361 + DEBUG reduce by rule 361 + ASM_COLON reduce by rule 361 + MC_COLON reduce by rule 361 + RTL_COLON reduce by rule 361 + DELAYSLOT_COLON reduce by rule 361 + NULLIFIED_COLON reduce by rule 361 + PADDING_COLON reduce by rule 361 + RESOURCE reduce by rule 361 + CPU reduce by rule 361 + LATENCY reduce by rule 361 + EXCEPTION reduce by rule 361 + ID reduce by rule 361 + SYMBOL reduce by rule 361 + WORD reduce by rule 361 + INT reduce by rule 361 + STRING reduce by rule 361 + EOF reduce by rule 361 + + + . error + + + state 242: + + mymldecl : TYPE tyvarseq tid . (reduce by rule 67) + typebind : tyvarseq tid . EQ ty + + ARCHITECTURE reduce by rule 67 + END reduce by rule 67 + LOCAL reduce by rule 67 + IN reduce by rule 67 + DATATYPE reduce by rule 67 + TYPE reduce by rule 67 + EQ shift 374 + RPAREN reduce by rule 67 + SEMICOLON reduce by rule 67 + STORAGE reduce by rule 67 + LOCATIONS reduce by rule 67 + STRUCTURE reduce by rule 67 + FUNCTOR reduce by rule 67 + SIGNATURE reduce by rule 67 + SHARING reduce by rule 67 + INSTRUCTION reduce by rule 67 + VLIW reduce by rule 67 + SUPERSCALAR reduce by rule 67 + FUN reduce by rule 67 + VAL reduce by rule 67 + INCLUDE reduce by rule 67 + OPEN reduce by rule 67 + LITTLE reduce by rule 67 + BIG reduce by rule 67 + PIPELINE reduce by rule 67 + LOWERCASE reduce by rule 67 + UPPERCASE reduce by rule 67 + VERBATIM reduce by rule 67 + RTL reduce by rule 67 + NONFIX reduce by rule 67 + INFIX reduce by rule 67 + INFIXR reduce by rule 67 + DEBUG reduce by rule 67 + RESOURCE reduce by rule 67 + CPU reduce by rule 67 + LATENCY reduce by rule 67 + EXCEPTION reduce by rule 67 + EOF reduce by rule 67 + + + . error + + + state 243: + + tid : id . (reduce by rule 360) + + ARCHITECTURE reduce by rule 360 + END reduce by rule 360 + LOCAL reduce by rule 360 + IN reduce by rule 360 + OF reduce by rule 360 + DATATYPE reduce by rule 360 + TYPE reduce by rule 360 + EQ reduce by rule 360 + TIMES reduce by rule 360 + AND reduce by rule 360 + LPAREN reduce by rule 360 + RPAREN reduce by rule 360 + RBRACKET reduce by rule 360 + RBRACE reduce by rule 360 + SEMICOLON reduce by rule 360 + LDQUOTE reduce by rule 360 + CELLSET reduce by rule 360 + STORAGE reduce by rule 360 + LOCATIONS reduce by rule 360 + COMMA reduce by rule 360 + COLON reduce by rule 360 + DOT reduce by rule 360 + BAR reduce by rule 360 + ARROW reduce by rule 360 + DARROW reduce by rule 360 + BITS reduce by rule 360 + THEN reduce by rule 360 + ELSE reduce by rule 360 + STRUCTURE reduce by rule 360 + FUNCTOR reduce by rule 360 + SIGNATURE reduce by rule 360 + WHERE reduce by rule 360 + SHARING reduce by rule 360 + INSTRUCTION reduce by rule 360 + CELL reduce by rule 360 + VLIW reduce by rule 360 + SUPERSCALAR reduce by rule 360 + WITHTYPE reduce by rule 360 + FUN reduce by rule 360 + VAL reduce by rule 360 + INCLUDE reduce by rule 360 + OPEN reduce by rule 360 + LITTLE reduce by rule 360 + BIG reduce by rule 360 + PIPELINE reduce by rule 360 + LOWERCASE reduce by rule 360 + UPPERCASE reduce by rule 360 + VERBATIM reduce by rule 360 + RTL reduce by rule 360 + SPAN reduce by rule 360 + DELAYSLOT reduce by rule 360 + NONFIX reduce by rule 360 + INFIX reduce by rule 360 + INFIXR reduce by rule 360 + DEBUG reduce by rule 360 + ASM_COLON reduce by rule 360 + MC_COLON reduce by rule 360 + RTL_COLON reduce by rule 360 + DELAYSLOT_COLON reduce by rule 360 + NULLIFIED_COLON reduce by rule 360 + PADDING_COLON reduce by rule 360 + RESOURCE reduce by rule 360 + CPU reduce by rule 360 + LATENCY reduce by rule 360 + EXCEPTION reduce by rule 360 + ID reduce by rule 360 + SYMBOL reduce by rule 360 + WORD reduce by rule 360 + INT reduce by rule 360 + STRING reduce by rule 360 + EOF reduce by rule 360 + + + . error + + + state 244: + + tid2 : CELL . (reduce by rule 363) + + ARCHITECTURE reduce by rule 363 + END reduce by rule 363 + LOCAL reduce by rule 363 + IN reduce by rule 363 + OF reduce by rule 363 + DATATYPE reduce by rule 363 + TYPE reduce by rule 363 + EQ reduce by rule 363 + TIMES reduce by rule 363 + AND reduce by rule 363 + LPAREN reduce by rule 363 + RPAREN reduce by rule 363 + RBRACKET reduce by rule 363 + RBRACE reduce by rule 363 + SEMICOLON reduce by rule 363 + LDQUOTE reduce by rule 363 + CELLSET reduce by rule 363 + STORAGE reduce by rule 363 + LOCATIONS reduce by rule 363 + COMMA reduce by rule 363 + COLON reduce by rule 363 + DOT reduce by rule 363 + BAR reduce by rule 363 + ARROW reduce by rule 363 + DARROW reduce by rule 363 + BITS reduce by rule 363 + THEN reduce by rule 363 + ELSE reduce by rule 363 + STRUCTURE reduce by rule 363 + FUNCTOR reduce by rule 363 + SIGNATURE reduce by rule 363 + WHERE reduce by rule 363 + SHARING reduce by rule 363 + INSTRUCTION reduce by rule 363 + CELL reduce by rule 363 + VLIW reduce by rule 363 + SUPERSCALAR reduce by rule 363 + WITHTYPE reduce by rule 363 + FUN reduce by rule 363 + VAL reduce by rule 363 + INCLUDE reduce by rule 363 + OPEN reduce by rule 363 + LITTLE reduce by rule 363 + BIG reduce by rule 363 + PIPELINE reduce by rule 363 + LOWERCASE reduce by rule 363 + UPPERCASE reduce by rule 363 + VERBATIM reduce by rule 363 + RTL reduce by rule 363 + SPAN reduce by rule 363 + DELAYSLOT reduce by rule 363 + NONFIX reduce by rule 363 + INFIX reduce by rule 363 + INFIXR reduce by rule 363 + DEBUG reduce by rule 363 + ASM_COLON reduce by rule 363 + MC_COLON reduce by rule 363 + RTL_COLON reduce by rule 363 + DELAYSLOT_COLON reduce by rule 363 + NULLIFIED_COLON reduce by rule 363 + PADDING_COLON reduce by rule 363 + RESOURCE reduce by rule 363 + CPU reduce by rule 363 + LATENCY reduce by rule 363 + EXCEPTION reduce by rule 363 + ID reduce by rule 363 + SYMBOL reduce by rule 363 + WORD reduce by rule 363 + INT reduce by rule 363 + STRING reduce by rule 363 + EOF reduce by rule 363 + + + . error + + + state 245: + + tid2 : INSTRUCTION . (reduce by rule 364) + + ARCHITECTURE reduce by rule 364 + END reduce by rule 364 + LOCAL reduce by rule 364 + IN reduce by rule 364 + OF reduce by rule 364 + DATATYPE reduce by rule 364 + TYPE reduce by rule 364 + EQ reduce by rule 364 + TIMES reduce by rule 364 + AND reduce by rule 364 + LPAREN reduce by rule 364 + RPAREN reduce by rule 364 + RBRACKET reduce by rule 364 + RBRACE reduce by rule 364 + SEMICOLON reduce by rule 364 + LDQUOTE reduce by rule 364 + CELLSET reduce by rule 364 + STORAGE reduce by rule 364 + LOCATIONS reduce by rule 364 + COMMA reduce by rule 364 + COLON reduce by rule 364 + DOT reduce by rule 364 + BAR reduce by rule 364 + ARROW reduce by rule 364 + DARROW reduce by rule 364 + BITS reduce by rule 364 + THEN reduce by rule 364 + ELSE reduce by rule 364 + STRUCTURE reduce by rule 364 + FUNCTOR reduce by rule 364 + SIGNATURE reduce by rule 364 + WHERE reduce by rule 364 + SHARING reduce by rule 364 + INSTRUCTION reduce by rule 364 + CELL reduce by rule 364 + VLIW reduce by rule 364 + SUPERSCALAR reduce by rule 364 + WITHTYPE reduce by rule 364 + FUN reduce by rule 364 + VAL reduce by rule 364 + INCLUDE reduce by rule 364 + OPEN reduce by rule 364 + LITTLE reduce by rule 364 + BIG reduce by rule 364 + PIPELINE reduce by rule 364 + LOWERCASE reduce by rule 364 + UPPERCASE reduce by rule 364 + VERBATIM reduce by rule 364 + RTL reduce by rule 364 + SPAN reduce by rule 364 + DELAYSLOT reduce by rule 364 + NONFIX reduce by rule 364 + INFIX reduce by rule 364 + INFIXR reduce by rule 364 + DEBUG reduce by rule 364 + ASM_COLON reduce by rule 364 + MC_COLON reduce by rule 364 + RTL_COLON reduce by rule 364 + DELAYSLOT_COLON reduce by rule 364 + NULLIFIED_COLON reduce by rule 364 + PADDING_COLON reduce by rule 364 + RESOURCE reduce by rule 364 + CPU reduce by rule 364 + LATENCY reduce by rule 364 + EXCEPTION reduce by rule 364 + ID reduce by rule 364 + SYMBOL reduce by rule 364 + WORD reduce by rule 364 + INT reduce by rule 364 + STRING reduce by rule 364 + EOF reduce by rule 364 + + + . error + + + state 246: + + tid2 : BITS . (reduce by rule 362) + + ARCHITECTURE reduce by rule 362 + END reduce by rule 362 + LOCAL reduce by rule 362 + IN reduce by rule 362 + OF reduce by rule 362 + DATATYPE reduce by rule 362 + TYPE reduce by rule 362 + EQ reduce by rule 362 + TIMES reduce by rule 362 + AND reduce by rule 362 + LPAREN reduce by rule 362 + RPAREN reduce by rule 362 + RBRACKET reduce by rule 362 + RBRACE reduce by rule 362 + SEMICOLON reduce by rule 362 + LDQUOTE reduce by rule 362 + CELLSET reduce by rule 362 + STORAGE reduce by rule 362 + LOCATIONS reduce by rule 362 + COMMA reduce by rule 362 + COLON reduce by rule 362 + DOT reduce by rule 362 + BAR reduce by rule 362 + ARROW reduce by rule 362 + DARROW reduce by rule 362 + BITS reduce by rule 362 + THEN reduce by rule 362 + ELSE reduce by rule 362 + STRUCTURE reduce by rule 362 + FUNCTOR reduce by rule 362 + SIGNATURE reduce by rule 362 + WHERE reduce by rule 362 + SHARING reduce by rule 362 + INSTRUCTION reduce by rule 362 + CELL reduce by rule 362 + VLIW reduce by rule 362 + SUPERSCALAR reduce by rule 362 + WITHTYPE reduce by rule 362 + FUN reduce by rule 362 + VAL reduce by rule 362 + INCLUDE reduce by rule 362 + OPEN reduce by rule 362 + LITTLE reduce by rule 362 + BIG reduce by rule 362 + PIPELINE reduce by rule 362 + LOWERCASE reduce by rule 362 + UPPERCASE reduce by rule 362 + VERBATIM reduce by rule 362 + RTL reduce by rule 362 + SPAN reduce by rule 362 + DELAYSLOT reduce by rule 362 + NONFIX reduce by rule 362 + INFIX reduce by rule 362 + INFIXR reduce by rule 362 + DEBUG reduce by rule 362 + ASM_COLON reduce by rule 362 + MC_COLON reduce by rule 362 + RTL_COLON reduce by rule 362 + DELAYSLOT_COLON reduce by rule 362 + NULLIFIED_COLON reduce by rule 362 + PADDING_COLON reduce by rule 362 + RESOURCE reduce by rule 362 + CPU reduce by rule 362 + LATENCY reduce by rule 362 + EXCEPTION reduce by rule 362 + ID reduce by rule 362 + SYMBOL reduce by rule 362 + WORD reduce by rule 362 + INT reduce by rule 362 + STRING reduce by rule 362 + EOF reduce by rule 362 + + + . error + + + state 247: + + typebinds : typebind AND . typebinds + + LPAREN shift 160 + CELLSET reduce by rule 199 + HASH shift 159 + BITS reduce by rule 199 + INSTRUCTION reduce by rule 199 + CELL reduce by rule 199 + ID reduce by rule 199 + SYMBOL reduce by rule 199 + TYVAR shift 158 + + typebinds goto 376 + typebind goto 156 + tyvar goto 155 + tyvarseq goto 375 + + . error + + + state 248: + + tyvar : HASH id . (reduce by rule 427) + + ARCHITECTURE reduce by rule 427 + END reduce by rule 427 + LOCAL reduce by rule 427 + IN reduce by rule 427 + OF reduce by rule 427 + DATATYPE reduce by rule 427 + TYPE reduce by rule 427 + EQ reduce by rule 427 + TIMES reduce by rule 427 + AND reduce by rule 427 + LPAREN reduce by rule 427 + RPAREN reduce by rule 427 + RBRACKET reduce by rule 427 + RBRACE reduce by rule 427 + SEMICOLON reduce by rule 427 + LDQUOTE reduce by rule 427 + CELLSET reduce by rule 427 + STORAGE reduce by rule 427 + LOCATIONS reduce by rule 427 + COMMA reduce by rule 427 + COLON reduce by rule 427 + BAR reduce by rule 427 + ARROW reduce by rule 427 + DARROW reduce by rule 427 + BITS reduce by rule 427 + THEN reduce by rule 427 + ELSE reduce by rule 427 + STRUCTURE reduce by rule 427 + FUNCTOR reduce by rule 427 + SIGNATURE reduce by rule 427 + WHERE reduce by rule 427 + SHARING reduce by rule 427 + INSTRUCTION reduce by rule 427 + CELL reduce by rule 427 + VLIW reduce by rule 427 + SUPERSCALAR reduce by rule 427 + WITHTYPE reduce by rule 427 + FUN reduce by rule 427 + VAL reduce by rule 427 + INCLUDE reduce by rule 427 + OPEN reduce by rule 427 + LITTLE reduce by rule 427 + BIG reduce by rule 427 + PIPELINE reduce by rule 427 + LOWERCASE reduce by rule 427 + UPPERCASE reduce by rule 427 + VERBATIM reduce by rule 427 + RTL reduce by rule 427 + SPAN reduce by rule 427 + DELAYSLOT reduce by rule 427 + NONFIX reduce by rule 427 + INFIX reduce by rule 427 + INFIXR reduce by rule 427 + DEBUG reduce by rule 427 + ASM_COLON reduce by rule 427 + MC_COLON reduce by rule 427 + RTL_COLON reduce by rule 427 + DELAYSLOT_COLON reduce by rule 427 + NULLIFIED_COLON reduce by rule 427 + PADDING_COLON reduce by rule 427 + RESOURCE reduce by rule 427 + CPU reduce by rule 427 + LATENCY reduce by rule 427 + EXCEPTION reduce by rule 427 + ID reduce by rule 427 + SYMBOL reduce by rule 427 + WORD reduce by rule 427 + INT reduce by rule 427 + STRING reduce by rule 427 + EOF reduce by rule 427 + + + . error + + + state 249: + + tyvarseq : LPAREN tyvars . RPAREN + + RPAREN shift 377 + + + . error + + + state 250: + + tyvars : tyvar . (reduce by rule 202) + tyvars : tyvar . COMMA tyvars + + RPAREN reduce by rule 202 + COMMA shift 378 + + + . error + + + state 251: + + datatypebind : tyvarseq id . opcodeencoding fieldty hasasm EQ consbinds + datatypebind : tyvarseq id . opcodeencoding fieldty hasasm EQ DATATYPE ty + + EQ reduce by rule 135 + DEREF reduce by rule 135 + LBRACKET shift 380 + COLON reduce by rule 135 + + opcodeencoding goto 379 + + . error + + + state 252: + + datatypebinds : datatypebind AND . datatypebinds + + LPAREN shift 160 + CELLSET reduce by rule 199 + HASH shift 159 + ID reduce by rule 199 + SYMBOL reduce by rule 199 + TYVAR shift 158 + + datatypebinds goto 381 + datatypebind goto 162 + tyvar goto 155 + tyvarseq goto 161 + + . error + + + state 253: + + mymldecl : DATATYPE datatypebinds withtypeclause . (reduce by rule 59) + + ARCHITECTURE reduce by rule 59 + END reduce by rule 59 + LOCAL reduce by rule 59 + IN reduce by rule 59 + DATATYPE reduce by rule 59 + TYPE reduce by rule 59 + RPAREN reduce by rule 59 + SEMICOLON reduce by rule 59 + STORAGE reduce by rule 59 + LOCATIONS reduce by rule 59 + STRUCTURE reduce by rule 59 + FUNCTOR reduce by rule 59 + SIGNATURE reduce by rule 59 + SHARING reduce by rule 59 + INSTRUCTION reduce by rule 59 + VLIW reduce by rule 59 + SUPERSCALAR reduce by rule 59 + FUN reduce by rule 59 + VAL reduce by rule 59 + INCLUDE reduce by rule 59 + OPEN reduce by rule 59 + LITTLE reduce by rule 59 + BIG reduce by rule 59 + PIPELINE reduce by rule 59 + LOWERCASE reduce by rule 59 + UPPERCASE reduce by rule 59 + VERBATIM reduce by rule 59 + RTL reduce by rule 59 + NONFIX reduce by rule 59 + INFIX reduce by rule 59 + INFIXR reduce by rule 59 + DEBUG reduce by rule 59 + RESOURCE reduce by rule 59 + CPU reduce by rule 59 + LATENCY reduce by rule 59 + EXCEPTION reduce by rule 59 + EOF reduce by rule 59 + + + . error + + + state 254: + + withtypeclause : WITHTYPE . typebinds + + LPAREN shift 160 + CELLSET reduce by rule 199 + HASH shift 159 + BITS reduce by rule 199 + INSTRUCTION reduce by rule 199 + CELL reduce by rule 199 + ID reduce by rule 199 + SYMBOL reduce by rule 199 + TYVAR shift 158 + + typebinds goto 382 + typebind goto 156 + tyvar goto 155 + tyvarseq goto 375 + + . error + + + state 255: + + scopeddecls : newScope decls . oldScope + + END reduce by rule 108 + IN reduce by rule 108 + RPAREN reduce by rule 108 + + oldScope goto 383 + + . error + + + state 256: + + mymldecl : LOCAL scopeddecls IN . scopeddecls END + + ARCHITECTURE reduce by rule 107 + END reduce by rule 107 + LOCAL reduce by rule 107 + DATATYPE reduce by rule 107 + TYPE reduce by rule 107 + STORAGE reduce by rule 107 + LOCATIONS reduce by rule 107 + STRUCTURE reduce by rule 107 + FUNCTOR reduce by rule 107 + SIGNATURE reduce by rule 107 + SHARING reduce by rule 107 + INSTRUCTION reduce by rule 107 + VLIW reduce by rule 107 + SUPERSCALAR reduce by rule 107 + FUN reduce by rule 107 + VAL reduce by rule 107 + INCLUDE reduce by rule 107 + OPEN reduce by rule 107 + LITTLE reduce by rule 107 + BIG reduce by rule 107 + PIPELINE reduce by rule 107 + LOWERCASE reduce by rule 107 + UPPERCASE reduce by rule 107 + VERBATIM reduce by rule 107 + RTL reduce by rule 107 + NONFIX reduce by rule 107 + INFIX reduce by rule 107 + INFIXR reduce by rule 107 + DEBUG reduce by rule 107 + RESOURCE reduce by rule 107 + CPU reduce by rule 107 + LATENCY reduce by rule 107 + EXCEPTION reduce by rule 107 + + scopeddecls goto 384 + newScope goto 164 + + . error + + + state 257: + + mymddecl : ARCHITECTURE id EQ . STRUCT decls END + + STRUCT shift 385 + + + . error + + + state 258: + + exceptionbinds : exceptionbind AND exceptionbinds . (reduce by rule 84) + + ARCHITECTURE reduce by rule 84 + END reduce by rule 84 + LOCAL reduce by rule 84 + IN reduce by rule 84 + DATATYPE reduce by rule 84 + TYPE reduce by rule 84 + RPAREN reduce by rule 84 + SEMICOLON reduce by rule 84 + STORAGE reduce by rule 84 + LOCATIONS reduce by rule 84 + STRUCTURE reduce by rule 84 + FUNCTOR reduce by rule 84 + SIGNATURE reduce by rule 84 + SHARING reduce by rule 84 + INSTRUCTION reduce by rule 84 + VLIW reduce by rule 84 + SUPERSCALAR reduce by rule 84 + FUN reduce by rule 84 + VAL reduce by rule 84 + INCLUDE reduce by rule 84 + OPEN reduce by rule 84 + LITTLE reduce by rule 84 + BIG reduce by rule 84 + PIPELINE reduce by rule 84 + LOWERCASE reduce by rule 84 + UPPERCASE reduce by rule 84 + VERBATIM reduce by rule 84 + RTL reduce by rule 84 + NONFIX reduce by rule 84 + INFIX reduce by rule 84 + INFIXR reduce by rule 84 + DEBUG reduce by rule 84 + RESOURCE reduce by rule 84 + CPU reduce by rule 84 + LATENCY reduce by rule 84 + EXCEPTION reduce by rule 84 + EOF reduce by rule 84 + + + . error + + + state 259: + + exceptionbind : id EQ ident . (reduce by rule 87) + + ARCHITECTURE reduce by rule 87 + END reduce by rule 87 + LOCAL reduce by rule 87 + IN reduce by rule 87 + DATATYPE reduce by rule 87 + TYPE reduce by rule 87 + AND reduce by rule 87 + RPAREN reduce by rule 87 + SEMICOLON reduce by rule 87 + STORAGE reduce by rule 87 + LOCATIONS reduce by rule 87 + STRUCTURE reduce by rule 87 + FUNCTOR reduce by rule 87 + SIGNATURE reduce by rule 87 + SHARING reduce by rule 87 + INSTRUCTION reduce by rule 87 + VLIW reduce by rule 87 + SUPERSCALAR reduce by rule 87 + FUN reduce by rule 87 + VAL reduce by rule 87 + INCLUDE reduce by rule 87 + OPEN reduce by rule 87 + LITTLE reduce by rule 87 + BIG reduce by rule 87 + PIPELINE reduce by rule 87 + LOWERCASE reduce by rule 87 + UPPERCASE reduce by rule 87 + VERBATIM reduce by rule 87 + RTL reduce by rule 87 + NONFIX reduce by rule 87 + INFIX reduce by rule 87 + INFIXR reduce by rule 87 + DEBUG reduce by rule 87 + RESOURCE reduce by rule 87 + CPU reduce by rule 87 + LATENCY reduce by rule 87 + EXCEPTION reduce by rule 87 + EOF reduce by rule 87 + + + . error + + + state 260: + + aty : tyvar . (reduce by rule 352) + + ARCHITECTURE reduce by rule 352 + END reduce by rule 352 + LOCAL reduce by rule 352 + IN reduce by rule 352 + OF reduce by rule 352 + DATATYPE reduce by rule 352 + TYPE reduce by rule 352 + EQ reduce by rule 352 + TIMES reduce by rule 352 + AND reduce by rule 352 + LPAREN reduce by rule 352 + RPAREN reduce by rule 352 + RBRACKET reduce by rule 352 + RBRACE reduce by rule 352 + SEMICOLON reduce by rule 352 + LDQUOTE reduce by rule 352 + CELLSET reduce by rule 352 + STORAGE reduce by rule 352 + LOCATIONS reduce by rule 352 + COMMA reduce by rule 352 + COLON reduce by rule 352 + BAR reduce by rule 352 + ARROW reduce by rule 352 + DARROW reduce by rule 352 + BITS reduce by rule 352 + THEN reduce by rule 352 + ELSE reduce by rule 352 + STRUCTURE reduce by rule 352 + FUNCTOR reduce by rule 352 + SIGNATURE reduce by rule 352 + WHERE reduce by rule 352 + SHARING reduce by rule 352 + INSTRUCTION reduce by rule 352 + CELL reduce by rule 352 + VLIW reduce by rule 352 + SUPERSCALAR reduce by rule 352 + WITHTYPE reduce by rule 352 + FUN reduce by rule 352 + VAL reduce by rule 352 + INCLUDE reduce by rule 352 + OPEN reduce by rule 352 + LITTLE reduce by rule 352 + BIG reduce by rule 352 + PIPELINE reduce by rule 352 + LOWERCASE reduce by rule 352 + UPPERCASE reduce by rule 352 + VERBATIM reduce by rule 352 + RTL reduce by rule 352 + SPAN reduce by rule 352 + DELAYSLOT reduce by rule 352 + NONFIX reduce by rule 352 + INFIX reduce by rule 352 + INFIXR reduce by rule 352 + DEBUG reduce by rule 352 + ASM_COLON reduce by rule 352 + MC_COLON reduce by rule 352 + RTL_COLON reduce by rule 352 + DELAYSLOT_COLON reduce by rule 352 + NULLIFIED_COLON reduce by rule 352 + PADDING_COLON reduce by rule 352 + RESOURCE reduce by rule 352 + CPU reduce by rule 352 + LATENCY reduce by rule 352 + EXCEPTION reduce by rule 352 + ID reduce by rule 352 + SYMBOL reduce by rule 352 + WORD reduce by rule 352 + INT reduce by rule 352 + STRING reduce by rule 352 + EOF reduce by rule 352 + + + . error + + + state 261: + + ty : tuplety . (reduce by rule 372) + + ARCHITECTURE reduce by rule 372 + END reduce by rule 372 + LOCAL reduce by rule 372 + IN reduce by rule 372 + OF reduce by rule 372 + DATATYPE reduce by rule 372 + TYPE reduce by rule 372 + EQ reduce by rule 372 + AND reduce by rule 372 + LPAREN reduce by rule 372 + RPAREN reduce by rule 372 + RBRACKET reduce by rule 372 + RBRACE reduce by rule 372 + SEMICOLON reduce by rule 372 + LDQUOTE reduce by rule 372 + CELLSET reduce by rule 372 + STORAGE reduce by rule 372 + LOCATIONS reduce by rule 372 + COMMA reduce by rule 372 + COLON reduce by rule 372 + BAR reduce by rule 372 + ARROW reduce by rule 372 + DARROW reduce by rule 372 + THEN reduce by rule 372 + ELSE reduce by rule 372 + STRUCTURE reduce by rule 372 + FUNCTOR reduce by rule 372 + SIGNATURE reduce by rule 372 + WHERE reduce by rule 372 + SHARING reduce by rule 372 + INSTRUCTION reduce by rule 372 + VLIW reduce by rule 372 + SUPERSCALAR reduce by rule 372 + WITHTYPE reduce by rule 372 + FUN reduce by rule 372 + VAL reduce by rule 372 + INCLUDE reduce by rule 372 + OPEN reduce by rule 372 + LITTLE reduce by rule 372 + BIG reduce by rule 372 + PIPELINE reduce by rule 372 + LOWERCASE reduce by rule 372 + UPPERCASE reduce by rule 372 + VERBATIM reduce by rule 372 + RTL reduce by rule 372 + SPAN reduce by rule 372 + DELAYSLOT reduce by rule 372 + NONFIX reduce by rule 372 + INFIX reduce by rule 372 + INFIXR reduce by rule 372 + DEBUG reduce by rule 372 + ASM_COLON reduce by rule 372 + MC_COLON reduce by rule 372 + RTL_COLON reduce by rule 372 + DELAYSLOT_COLON reduce by rule 372 + NULLIFIED_COLON reduce by rule 372 + PADDING_COLON reduce by rule 372 + RESOURCE reduce by rule 372 + CPU reduce by rule 372 + LATENCY reduce by rule 372 + EXCEPTION reduce by rule 372 + ID reduce by rule 372 + SYMBOL reduce by rule 372 + WORD reduce by rule 372 + INT reduce by rule 372 + STRING reduce by rule 372 + EOF reduce by rule 372 + + + . error + + error: state 262: shift/reduce conflict (shift SYMBOL, reduce by rule 373) + error: state 262: shift/reduce conflict (shift ID, reduce by rule 373) + error: state 262: shift/reduce conflict (shift INSTRUCTION, reduce by rule 373) + error: state 262: shift/reduce conflict (shift CELLSET, reduce by rule 373) + + state 262: + + ty : appty . (reduce by rule 373) + appty : appty . tident + tuplety : appty . TIMES appty + tuplety : appty . TIMES tuplety + + ARCHITECTURE reduce by rule 373 + END reduce by rule 373 + LOCAL reduce by rule 373 + IN reduce by rule 373 + OF reduce by rule 373 + DATATYPE reduce by rule 373 + TYPE reduce by rule 373 + EQ reduce by rule 373 + TIMES shift 387 + AND reduce by rule 373 + LPAREN reduce by rule 373 + RPAREN reduce by rule 373 + RBRACKET reduce by rule 373 + RBRACE reduce by rule 373 + SEMICOLON reduce by rule 373 + LDQUOTE reduce by rule 373 + CELLSET shift 50 + STORAGE reduce by rule 373 + LOCATIONS reduce by rule 373 + COMMA reduce by rule 373 + COLON reduce by rule 373 + BAR reduce by rule 373 + ARROW reduce by rule 373 + DARROW reduce by rule 373 + BITS shift 246 + THEN reduce by rule 373 + ELSE reduce by rule 373 + STRUCTURE reduce by rule 373 + FUNCTOR reduce by rule 373 + SIGNATURE reduce by rule 373 + WHERE reduce by rule 373 + SHARING reduce by rule 373 + INSTRUCTION shift 245 + CELL shift 244 + VLIW reduce by rule 373 + SUPERSCALAR reduce by rule 373 + WITHTYPE reduce by rule 373 + FUN reduce by rule 373 + VAL reduce by rule 373 + INCLUDE reduce by rule 373 + OPEN reduce by rule 373 + LITTLE reduce by rule 373 + BIG reduce by rule 373 + PIPELINE reduce by rule 373 + LOWERCASE reduce by rule 373 + UPPERCASE reduce by rule 373 + VERBATIM reduce by rule 373 + RTL reduce by rule 373 + SPAN reduce by rule 373 + DELAYSLOT reduce by rule 373 + NONFIX reduce by rule 373 + INFIX reduce by rule 373 + INFIXR reduce by rule 373 + DEBUG reduce by rule 373 + ASM_COLON reduce by rule 373 + MC_COLON reduce by rule 373 + RTL_COLON reduce by rule 373 + DELAYSLOT_COLON reduce by rule 373 + NULLIFIED_COLON reduce by rule 373 + PADDING_COLON reduce by rule 373 + RESOURCE reduce by rule 373 + CPU reduce by rule 373 + LATENCY reduce by rule 373 + EXCEPTION reduce by rule 373 + ID shift 49 + SYMBOL shift 48 + WORD reduce by rule 373 + INT reduce by rule 373 + STRING reduce by rule 373 + EOF reduce by rule 373 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 386 + tpath goto 265 + + . error + + + state 263: + + appty : aty . (reduce by rule 357) + + ARCHITECTURE reduce by rule 357 + END reduce by rule 357 + LOCAL reduce by rule 357 + IN reduce by rule 357 + OF reduce by rule 357 + DATATYPE reduce by rule 357 + TYPE reduce by rule 357 + EQ reduce by rule 357 + TIMES reduce by rule 357 + AND reduce by rule 357 + LPAREN reduce by rule 357 + RPAREN reduce by rule 357 + RBRACKET reduce by rule 357 + RBRACE reduce by rule 357 + SEMICOLON reduce by rule 357 + LDQUOTE reduce by rule 357 + CELLSET reduce by rule 357 + STORAGE reduce by rule 357 + LOCATIONS reduce by rule 357 + COMMA reduce by rule 357 + COLON reduce by rule 357 + BAR reduce by rule 357 + ARROW reduce by rule 357 + DARROW reduce by rule 357 + BITS reduce by rule 357 + THEN reduce by rule 357 + ELSE reduce by rule 357 + STRUCTURE reduce by rule 357 + FUNCTOR reduce by rule 357 + SIGNATURE reduce by rule 357 + WHERE reduce by rule 357 + SHARING reduce by rule 357 + INSTRUCTION reduce by rule 357 + CELL reduce by rule 357 + VLIW reduce by rule 357 + SUPERSCALAR reduce by rule 357 + WITHTYPE reduce by rule 357 + FUN reduce by rule 357 + VAL reduce by rule 357 + INCLUDE reduce by rule 357 + OPEN reduce by rule 357 + LITTLE reduce by rule 357 + BIG reduce by rule 357 + PIPELINE reduce by rule 357 + LOWERCASE reduce by rule 357 + UPPERCASE reduce by rule 357 + VERBATIM reduce by rule 357 + RTL reduce by rule 357 + SPAN reduce by rule 357 + DELAYSLOT reduce by rule 357 + NONFIX reduce by rule 357 + INFIX reduce by rule 357 + INFIXR reduce by rule 357 + DEBUG reduce by rule 357 + ASM_COLON reduce by rule 357 + MC_COLON reduce by rule 357 + RTL_COLON reduce by rule 357 + DELAYSLOT_COLON reduce by rule 357 + NULLIFIED_COLON reduce by rule 357 + PADDING_COLON reduce by rule 357 + RESOURCE reduce by rule 357 + CPU reduce by rule 357 + LATENCY reduce by rule 357 + EXCEPTION reduce by rule 357 + ID reduce by rule 357 + SYMBOL reduce by rule 357 + WORD reduce by rule 357 + INT reduce by rule 357 + STRING reduce by rule 357 + EOF reduce by rule 357 + + + . error + + + state 264: + + exceptionbind : id OF ty . (reduce by rule 86) + ty : ty . ARROW ty + + ARCHITECTURE reduce by rule 86 + END reduce by rule 86 + LOCAL reduce by rule 86 + IN reduce by rule 86 + DATATYPE reduce by rule 86 + TYPE reduce by rule 86 + AND reduce by rule 86 + RPAREN reduce by rule 86 + SEMICOLON reduce by rule 86 + STORAGE reduce by rule 86 + LOCATIONS reduce by rule 86 + ARROW shift 388 + STRUCTURE reduce by rule 86 + FUNCTOR reduce by rule 86 + SIGNATURE reduce by rule 86 + SHARING reduce by rule 86 + INSTRUCTION reduce by rule 86 + VLIW reduce by rule 86 + SUPERSCALAR reduce by rule 86 + FUN reduce by rule 86 + VAL reduce by rule 86 + INCLUDE reduce by rule 86 + OPEN reduce by rule 86 + LITTLE reduce by rule 86 + BIG reduce by rule 86 + PIPELINE reduce by rule 86 + LOWERCASE reduce by rule 86 + UPPERCASE reduce by rule 86 + VERBATIM reduce by rule 86 + RTL reduce by rule 86 + NONFIX reduce by rule 86 + INFIX reduce by rule 86 + INFIXR reduce by rule 86 + DEBUG reduce by rule 86 + RESOURCE reduce by rule 86 + CPU reduce by rule 86 + LATENCY reduce by rule 86 + EXCEPTION reduce by rule 86 + EOF reduce by rule 86 + + + . error + + + state 265: + + tident : tpath . (reduce by rule 366) + tpath : tpath . DOT tid + + ARCHITECTURE reduce by rule 366 + END reduce by rule 366 + LOCAL reduce by rule 366 + IN reduce by rule 366 + OF reduce by rule 366 + DATATYPE reduce by rule 366 + TYPE reduce by rule 366 + EQ reduce by rule 366 + TIMES reduce by rule 366 + AND reduce by rule 366 + LPAREN reduce by rule 366 + RPAREN reduce by rule 366 + RBRACKET reduce by rule 366 + RBRACE reduce by rule 366 + SEMICOLON reduce by rule 366 + LDQUOTE reduce by rule 366 + CELLSET reduce by rule 366 + STORAGE reduce by rule 366 + LOCATIONS reduce by rule 366 + COMMA reduce by rule 366 + COLON reduce by rule 366 + DOT shift 389 + BAR reduce by rule 366 + ARROW reduce by rule 366 + DARROW reduce by rule 366 + BITS reduce by rule 366 + THEN reduce by rule 366 + ELSE reduce by rule 366 + STRUCTURE reduce by rule 366 + FUNCTOR reduce by rule 366 + SIGNATURE reduce by rule 366 + WHERE reduce by rule 366 + SHARING reduce by rule 366 + INSTRUCTION reduce by rule 366 + CELL reduce by rule 366 + VLIW reduce by rule 366 + SUPERSCALAR reduce by rule 366 + WITHTYPE reduce by rule 366 + FUN reduce by rule 366 + VAL reduce by rule 366 + INCLUDE reduce by rule 366 + OPEN reduce by rule 366 + LITTLE reduce by rule 366 + BIG reduce by rule 366 + PIPELINE reduce by rule 366 + LOWERCASE reduce by rule 366 + UPPERCASE reduce by rule 366 + VERBATIM reduce by rule 366 + RTL reduce by rule 366 + SPAN reduce by rule 366 + DELAYSLOT reduce by rule 366 + NONFIX reduce by rule 366 + INFIX reduce by rule 366 + INFIXR reduce by rule 366 + DEBUG reduce by rule 366 + ASM_COLON reduce by rule 366 + MC_COLON reduce by rule 366 + RTL_COLON reduce by rule 366 + DELAYSLOT_COLON reduce by rule 366 + NULLIFIED_COLON reduce by rule 366 + PADDING_COLON reduce by rule 366 + RESOURCE reduce by rule 366 + CPU reduce by rule 366 + LATENCY reduce by rule 366 + EXCEPTION reduce by rule 366 + ID reduce by rule 366 + SYMBOL reduce by rule 366 + WORD reduce by rule 366 + INT reduce by rule 366 + STRING reduce by rule 366 + EOF reduce by rule 366 + + + . error + + + state 266: + + aty : tident . (reduce by rule 350) + + ARCHITECTURE reduce by rule 350 + END reduce by rule 350 + LOCAL reduce by rule 350 + IN reduce by rule 350 + OF reduce by rule 350 + DATATYPE reduce by rule 350 + TYPE reduce by rule 350 + EQ reduce by rule 350 + TIMES reduce by rule 350 + AND reduce by rule 350 + LPAREN reduce by rule 350 + RPAREN reduce by rule 350 + RBRACKET reduce by rule 350 + RBRACE reduce by rule 350 + SEMICOLON reduce by rule 350 + LDQUOTE reduce by rule 350 + CELLSET reduce by rule 350 + STORAGE reduce by rule 350 + LOCATIONS reduce by rule 350 + COMMA reduce by rule 350 + COLON reduce by rule 350 + BAR reduce by rule 350 + ARROW reduce by rule 350 + DARROW reduce by rule 350 + BITS reduce by rule 350 + THEN reduce by rule 350 + ELSE reduce by rule 350 + STRUCTURE reduce by rule 350 + FUNCTOR reduce by rule 350 + SIGNATURE reduce by rule 350 + WHERE reduce by rule 350 + SHARING reduce by rule 350 + INSTRUCTION reduce by rule 350 + CELL reduce by rule 350 + VLIW reduce by rule 350 + SUPERSCALAR reduce by rule 350 + WITHTYPE reduce by rule 350 + FUN reduce by rule 350 + VAL reduce by rule 350 + INCLUDE reduce by rule 350 + OPEN reduce by rule 350 + LITTLE reduce by rule 350 + BIG reduce by rule 350 + PIPELINE reduce by rule 350 + LOWERCASE reduce by rule 350 + UPPERCASE reduce by rule 350 + VERBATIM reduce by rule 350 + RTL reduce by rule 350 + SPAN reduce by rule 350 + DELAYSLOT reduce by rule 350 + NONFIX reduce by rule 350 + INFIX reduce by rule 350 + INFIXR reduce by rule 350 + DEBUG reduce by rule 350 + ASM_COLON reduce by rule 350 + MC_COLON reduce by rule 350 + RTL_COLON reduce by rule 350 + DELAYSLOT_COLON reduce by rule 350 + NULLIFIED_COLON reduce by rule 350 + PADDING_COLON reduce by rule 350 + RESOURCE reduce by rule 350 + CPU reduce by rule 350 + LATENCY reduce by rule 350 + EXCEPTION reduce by rule 350 + ID reduce by rule 350 + SYMBOL reduce by rule 350 + WORD reduce by rule 350 + INT reduce by rule 350 + STRING reduce by rule 350 + EOF reduce by rule 350 + + + . error + + + state 267: + + tident : tid . (reduce by rule 365) + tpath : tid . DOT tid + + ARCHITECTURE reduce by rule 365 + END reduce by rule 365 + LOCAL reduce by rule 365 + IN reduce by rule 365 + OF reduce by rule 365 + DATATYPE reduce by rule 365 + TYPE reduce by rule 365 + EQ reduce by rule 365 + TIMES reduce by rule 365 + AND reduce by rule 365 + LPAREN reduce by rule 365 + RPAREN reduce by rule 365 + RBRACKET reduce by rule 365 + RBRACE reduce by rule 365 + SEMICOLON reduce by rule 365 + LDQUOTE reduce by rule 365 + CELLSET reduce by rule 365 + STORAGE reduce by rule 365 + LOCATIONS reduce by rule 365 + COMMA reduce by rule 365 + COLON reduce by rule 365 + DOT shift 390 + BAR reduce by rule 365 + ARROW reduce by rule 365 + DARROW reduce by rule 365 + BITS reduce by rule 365 + THEN reduce by rule 365 + ELSE reduce by rule 365 + STRUCTURE reduce by rule 365 + FUNCTOR reduce by rule 365 + SIGNATURE reduce by rule 365 + WHERE reduce by rule 365 + SHARING reduce by rule 365 + INSTRUCTION reduce by rule 365 + CELL reduce by rule 365 + VLIW reduce by rule 365 + SUPERSCALAR reduce by rule 365 + WITHTYPE reduce by rule 365 + FUN reduce by rule 365 + VAL reduce by rule 365 + INCLUDE reduce by rule 365 + OPEN reduce by rule 365 + LITTLE reduce by rule 365 + BIG reduce by rule 365 + PIPELINE reduce by rule 365 + LOWERCASE reduce by rule 365 + UPPERCASE reduce by rule 365 + VERBATIM reduce by rule 365 + RTL reduce by rule 365 + SPAN reduce by rule 365 + DELAYSLOT reduce by rule 365 + NONFIX reduce by rule 365 + INFIX reduce by rule 365 + INFIXR reduce by rule 365 + DEBUG reduce by rule 365 + ASM_COLON reduce by rule 365 + MC_COLON reduce by rule 365 + RTL_COLON reduce by rule 365 + DELAYSLOT_COLON reduce by rule 365 + NULLIFIED_COLON reduce by rule 365 + PADDING_COLON reduce by rule 365 + RESOURCE reduce by rule 365 + CPU reduce by rule 365 + LATENCY reduce by rule 365 + EXCEPTION reduce by rule 365 + ID reduce by rule 365 + SYMBOL reduce by rule 365 + WORD reduce by rule 365 + INT reduce by rule 365 + STRING reduce by rule 365 + EOF reduce by rule 365 + + + . error + + + state 268: + + aty : HASH . int + tyvar : HASH . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + INT shift 64 + + id goto 248 + int goto 391 + + . error + + + state 269: + + aty : LBRACE . labtys RBRACE + + RBRACE reduce by rule 374 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 395 + labty goto 394 + labtys goto 393 + labtys1 goto 392 + + . error + + + state 270: + + aty : LPAREN . RPAREN + aty : LPAREN . ty RPAREN + appty : LPAREN . tys2 RPAREN tident + + DOLLAR shift 271 + LPAREN shift 270 + RPAREN shift 398 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 397 + aty goto 263 + appty goto 262 + tys2 goto 396 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 271: + + aty : DOLLAR . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 399 + + . error + + + state 272: + + latencyclauses : latencyclause BAR latencyclauses . (reduce by rule 57) + + ARCHITECTURE reduce by rule 57 + END reduce by rule 57 + LOCAL reduce by rule 57 + IN reduce by rule 57 + DATATYPE reduce by rule 57 + TYPE reduce by rule 57 + AND reduce by rule 57 + RPAREN reduce by rule 57 + SEMICOLON reduce by rule 57 + STORAGE reduce by rule 57 + LOCATIONS reduce by rule 57 + STRUCTURE reduce by rule 57 + FUNCTOR reduce by rule 57 + SIGNATURE reduce by rule 57 + SHARING reduce by rule 57 + INSTRUCTION reduce by rule 57 + VLIW reduce by rule 57 + SUPERSCALAR reduce by rule 57 + FUN reduce by rule 57 + VAL reduce by rule 57 + INCLUDE reduce by rule 57 + OPEN reduce by rule 57 + LITTLE reduce by rule 57 + BIG reduce by rule 57 + PIPELINE reduce by rule 57 + LOWERCASE reduce by rule 57 + UPPERCASE reduce by rule 57 + VERBATIM reduce by rule 57 + RTL reduce by rule 57 + NONFIX reduce by rule 57 + INFIX reduce by rule 57 + INFIXR reduce by rule 57 + DEBUG reduce by rule 57 + RESOURCE reduce by rule 57 + CPU reduce by rule 57 + LATENCY reduce by rule 57 + EXCEPTION reduce by rule 57 + EOF reduce by rule 57 + + + . error + + + state 273: + + latencybinds : latencybind AND latencybinds . (reduce by rule 54) + + ARCHITECTURE reduce by rule 54 + END reduce by rule 54 + LOCAL reduce by rule 54 + IN reduce by rule 54 + DATATYPE reduce by rule 54 + TYPE reduce by rule 54 + RPAREN reduce by rule 54 + SEMICOLON reduce by rule 54 + STORAGE reduce by rule 54 + LOCATIONS reduce by rule 54 + STRUCTURE reduce by rule 54 + FUNCTOR reduce by rule 54 + SIGNATURE reduce by rule 54 + SHARING reduce by rule 54 + INSTRUCTION reduce by rule 54 + VLIW reduce by rule 54 + SUPERSCALAR reduce by rule 54 + FUN reduce by rule 54 + VAL reduce by rule 54 + INCLUDE reduce by rule 54 + OPEN reduce by rule 54 + LITTLE reduce by rule 54 + BIG reduce by rule 54 + PIPELINE reduce by rule 54 + LOWERCASE reduce by rule 54 + UPPERCASE reduce by rule 54 + VERBATIM reduce by rule 54 + RTL reduce by rule 54 + NONFIX reduce by rule 54 + INFIX reduce by rule 54 + INFIXR reduce by rule 54 + DEBUG reduce by rule 54 + RESOURCE reduce by rule 54 + CPU reduce by rule 54 + LATENCY reduce by rule 54 + EXCEPTION reduce by rule 54 + EOF reduce by rule 54 + + + . error + + + state 274: + + latencyclause : id pat EQ . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 400 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 275: + + cpubinds : cpubind AND cpubinds . (reduce by rule 31) + + ARCHITECTURE reduce by rule 31 + END reduce by rule 31 + LOCAL reduce by rule 31 + IN reduce by rule 31 + DATATYPE reduce by rule 31 + TYPE reduce by rule 31 + RPAREN reduce by rule 31 + SEMICOLON reduce by rule 31 + STORAGE reduce by rule 31 + LOCATIONS reduce by rule 31 + STRUCTURE reduce by rule 31 + FUNCTOR reduce by rule 31 + SIGNATURE reduce by rule 31 + SHARING reduce by rule 31 + INSTRUCTION reduce by rule 31 + VLIW reduce by rule 31 + SUPERSCALAR reduce by rule 31 + FUN reduce by rule 31 + VAL reduce by rule 31 + INCLUDE reduce by rule 31 + OPEN reduce by rule 31 + LITTLE reduce by rule 31 + BIG reduce by rule 31 + PIPELINE reduce by rule 31 + LOWERCASE reduce by rule 31 + UPPERCASE reduce by rule 31 + VERBATIM reduce by rule 31 + RTL reduce by rule 31 + NONFIX reduce by rule 31 + INFIX reduce by rule 31 + INFIXR reduce by rule 31 + DEBUG reduce by rule 31 + RESOURCE reduce by rule 31 + CPU reduce by rule 31 + LATENCY reduce by rule 31 + EXCEPTION reduce by rule 31 + EOF reduce by rule 31 + + + . error + + + state 276: + + cpubind : id aliases int . LBRACKET resources RBRACKET + + LBRACKET shift 401 + + + . error + + + state 277: + + aliases : string aliases . (reduce by rule 34) + + INT reduce by rule 34 + + + . error + + + state 278: + + resourcebinds : id AND resourcebinds . (reduce by rule 29) + + ARCHITECTURE reduce by rule 29 + END reduce by rule 29 + LOCAL reduce by rule 29 + IN reduce by rule 29 + DATATYPE reduce by rule 29 + TYPE reduce by rule 29 + RPAREN reduce by rule 29 + SEMICOLON reduce by rule 29 + STORAGE reduce by rule 29 + LOCATIONS reduce by rule 29 + STRUCTURE reduce by rule 29 + FUNCTOR reduce by rule 29 + SIGNATURE reduce by rule 29 + SHARING reduce by rule 29 + INSTRUCTION reduce by rule 29 + VLIW reduce by rule 29 + SUPERSCALAR reduce by rule 29 + FUN reduce by rule 29 + VAL reduce by rule 29 + INCLUDE reduce by rule 29 + OPEN reduce by rule 29 + LITTLE reduce by rule 29 + BIG reduce by rule 29 + PIPELINE reduce by rule 29 + LOWERCASE reduce by rule 29 + UPPERCASE reduce by rule 29 + VERBATIM reduce by rule 29 + RTL reduce by rule 29 + NONFIX reduce by rule 29 + INFIX reduce by rule 29 + INFIXR reduce by rule 29 + DEBUG reduce by rule 29 + RESOURCE reduce by rule 29 + CPU reduce by rule 29 + LATENCY reduce by rule 29 + EXCEPTION reduce by rule 29 + EOF reduce by rule 29 + + + . error + + + state 279: + + aexp : asm_strings . (reduce by rule 246) + + ARCHITECTURE reduce by rule 246 + END reduce by rule 246 + LOCAL reduce by rule 246 + IN reduce by rule 246 + OF reduce by rule 246 + DATATYPE reduce by rule 246 + TYPE reduce by rule 246 + EQ reduce by rule 246 + DOLLAR reduce by rule 246 + TIMES reduce by rule 246 + AND reduce by rule 246 + DEREF reduce by rule 246 + NOT reduce by rule 246 + LLBRACKET reduce by rule 246 + LHASHBRACKET reduce by rule 246 + LPAREN reduce by rule 246 + RPAREN reduce by rule 246 + LBRACKET reduce by rule 246 + RBRACKET reduce by rule 246 + LBRACE reduce by rule 246 + RBRACE reduce by rule 246 + SEMICOLON reduce by rule 246 + LDQUOTE reduce by rule 246 + RMETA reduce by rule 246 + CELLSET reduce by rule 246 + STORAGE reduce by rule 246 + LOCATIONS reduce by rule 246 + HASH reduce by rule 246 + COMMA reduce by rule 246 + COLON reduce by rule 246 + AT reduce by rule 246 + BAR reduce by rule 246 + DARROW reduce by rule 246 + THEN reduce by rule 246 + ELSE reduce by rule 246 + TRUE reduce by rule 246 + FALSE reduce by rule 246 + HANDLE reduce by rule 246 + LET reduce by rule 246 + STRUCTURE reduce by rule 246 + FUNCTOR reduce by rule 246 + SIGNATURE reduce by rule 246 + SHARING reduce by rule 246 + INSTRUCTION reduce by rule 246 + VLIW reduce by rule 246 + SUPERSCALAR reduce by rule 246 + WITHTYPE reduce by rule 246 + FUN reduce by rule 246 + VAL reduce by rule 246 + INCLUDE reduce by rule 246 + OPEN reduce by rule 246 + OP reduce by rule 246 + LITTLE reduce by rule 246 + BIG reduce by rule 246 + PIPELINE reduce by rule 246 + LOWERCASE reduce by rule 246 + UPPERCASE reduce by rule 246 + VERBATIM reduce by rule 246 + RTL reduce by rule 246 + SPAN reduce by rule 246 + DELAYSLOT reduce by rule 246 + ALWAYS reduce by rule 246 + NEVER reduce by rule 246 + NONFIX reduce by rule 246 + INFIX reduce by rule 246 + INFIXR reduce by rule 246 + DEBUG reduce by rule 246 + ASM_COLON reduce by rule 246 + MC_COLON reduce by rule 246 + RTL_COLON reduce by rule 246 + DELAYSLOT_COLON reduce by rule 246 + NULLIFIED_COLON reduce by rule 246 + PADDING_COLON reduce by rule 246 + RESOURCE reduce by rule 246 + CPU reduce by rule 246 + LATENCY reduce by rule 246 + EXCEPTION reduce by rule 246 + ID reduce by rule 246 + SYMBOL reduce by rule 246 + WORD reduce by rule 246 + INT reduce by rule 246 + INTINF reduce by rule 246 + REAL reduce by rule 246 + STRING reduce by rule 246 + CHAR reduce by rule 246 + EOF reduce by rule 246 + + + . error + + + state 280: + + aexp : literal . (reduce by rule 241) + + ARCHITECTURE reduce by rule 241 + END reduce by rule 241 + LOCAL reduce by rule 241 + IN reduce by rule 241 + OF reduce by rule 241 + DATATYPE reduce by rule 241 + TYPE reduce by rule 241 + EQ reduce by rule 241 + DOLLAR reduce by rule 241 + TIMES reduce by rule 241 + AND reduce by rule 241 + DEREF reduce by rule 241 + NOT reduce by rule 241 + LLBRACKET reduce by rule 241 + LHASHBRACKET reduce by rule 241 + LPAREN reduce by rule 241 + RPAREN reduce by rule 241 + LBRACKET reduce by rule 241 + RBRACKET reduce by rule 241 + LBRACE reduce by rule 241 + RBRACE reduce by rule 241 + SEMICOLON reduce by rule 241 + LDQUOTE reduce by rule 241 + RMETA reduce by rule 241 + CELLSET reduce by rule 241 + STORAGE reduce by rule 241 + LOCATIONS reduce by rule 241 + HASH reduce by rule 241 + COMMA reduce by rule 241 + COLON reduce by rule 241 + AT reduce by rule 241 + BAR reduce by rule 241 + DARROW reduce by rule 241 + THEN reduce by rule 241 + ELSE reduce by rule 241 + TRUE reduce by rule 241 + FALSE reduce by rule 241 + HANDLE reduce by rule 241 + LET reduce by rule 241 + STRUCTURE reduce by rule 241 + FUNCTOR reduce by rule 241 + SIGNATURE reduce by rule 241 + SHARING reduce by rule 241 + INSTRUCTION reduce by rule 241 + VLIW reduce by rule 241 + SUPERSCALAR reduce by rule 241 + WITHTYPE reduce by rule 241 + FUN reduce by rule 241 + VAL reduce by rule 241 + INCLUDE reduce by rule 241 + OPEN reduce by rule 241 + OP reduce by rule 241 + LITTLE reduce by rule 241 + BIG reduce by rule 241 + PIPELINE reduce by rule 241 + LOWERCASE reduce by rule 241 + UPPERCASE reduce by rule 241 + VERBATIM reduce by rule 241 + RTL reduce by rule 241 + SPAN reduce by rule 241 + DELAYSLOT reduce by rule 241 + ALWAYS reduce by rule 241 + NEVER reduce by rule 241 + NONFIX reduce by rule 241 + INFIX reduce by rule 241 + INFIXR reduce by rule 241 + DEBUG reduce by rule 241 + ASM_COLON reduce by rule 241 + MC_COLON reduce by rule 241 + RTL_COLON reduce by rule 241 + DELAYSLOT_COLON reduce by rule 241 + NULLIFIED_COLON reduce by rule 241 + PADDING_COLON reduce by rule 241 + RESOURCE reduce by rule 241 + CPU reduce by rule 241 + LATENCY reduce by rule 241 + EXCEPTION reduce by rule 241 + ID reduce by rule 241 + SYMBOL reduce by rule 241 + WORD reduce by rule 241 + INT reduce by rule 241 + INTINF reduce by rule 241 + REAL reduce by rule 241 + STRING reduce by rule 241 + CHAR reduce by rule 241 + EOF reduce by rule 241 + + + . error + + + state 281: + + mymldecl : RTL asapat EQ exp . (reduce by rule 63) + exp : exp . HANDLE clauses + + ARCHITECTURE reduce by rule 63 + END reduce by rule 63 + LOCAL reduce by rule 63 + IN reduce by rule 63 + DATATYPE reduce by rule 63 + TYPE reduce by rule 63 + RPAREN reduce by rule 63 + SEMICOLON reduce by rule 63 + STORAGE reduce by rule 63 + LOCATIONS reduce by rule 63 + HANDLE shift 402 + STRUCTURE reduce by rule 63 + FUNCTOR reduce by rule 63 + SIGNATURE reduce by rule 63 + SHARING reduce by rule 63 + INSTRUCTION reduce by rule 63 + VLIW reduce by rule 63 + SUPERSCALAR reduce by rule 63 + FUN reduce by rule 63 + VAL reduce by rule 63 + INCLUDE reduce by rule 63 + OPEN reduce by rule 63 + LITTLE reduce by rule 63 + BIG reduce by rule 63 + PIPELINE reduce by rule 63 + LOWERCASE reduce by rule 63 + UPPERCASE reduce by rule 63 + VERBATIM reduce by rule 63 + RTL reduce by rule 63 + NONFIX reduce by rule 63 + INFIX reduce by rule 63 + INFIXR reduce by rule 63 + DEBUG reduce by rule 63 + RESOURCE reduce by rule 63 + CPU reduce by rule 63 + LATENCY reduce by rule 63 + EXCEPTION reduce by rule 63 + EOF reduce by rule 63 + + + . error + + error: state 282: shift/reduce conflict (shift INT, reduce by rule 274) + error: state 282: shift/reduce conflict (shift WORD, reduce by rule 274) + error: state 282: shift/reduce conflict (shift SYMBOL, reduce by rule 274) + error: state 282: shift/reduce conflict (shift ID, reduce by rule 274) + error: state 282: shift/reduce conflict (shift CELLSET, reduce by rule 274) + error: state 282: shift/reduce conflict (shift LPAREN, reduce by rule 274) + + state 282: + + appexp : appexp . aexp2 + exp : appexp . (reduce by rule 274) + + ARCHITECTURE reduce by rule 274 + END reduce by rule 274 + LOCAL reduce by rule 274 + IN reduce by rule 274 + OF reduce by rule 274 + DATATYPE reduce by rule 274 + TYPE reduce by rule 274 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + AND reduce by rule 274 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + RPAREN reduce by rule 274 + LBRACKET shift 295 + RBRACKET reduce by rule 274 + LBRACE shift 294 + RBRACE reduce by rule 274 + SEMICOLON reduce by rule 274 + LDQUOTE shift 293 + RMETA reduce by rule 274 + CELLSET shift 50 + STORAGE reduce by rule 274 + LOCATIONS reduce by rule 274 + HASH shift 291 + COMMA reduce by rule 274 + COLON reduce by rule 274 + BAR reduce by rule 274 + DARROW reduce by rule 274 + THEN reduce by rule 274 + ELSE reduce by rule 274 + TRUE shift 99 + FALSE shift 98 + HANDLE reduce by rule 274 + LET shift 288 + STRUCTURE reduce by rule 274 + FUNCTOR reduce by rule 274 + SIGNATURE reduce by rule 274 + SHARING reduce by rule 274 + INSTRUCTION reduce by rule 274 + VLIW reduce by rule 274 + SUPERSCALAR reduce by rule 274 + WITHTYPE reduce by rule 274 + FUN reduce by rule 274 + VAL reduce by rule 274 + INCLUDE reduce by rule 274 + OPEN reduce by rule 274 + OP shift 287 + LITTLE reduce by rule 274 + BIG reduce by rule 274 + PIPELINE reduce by rule 274 + LOWERCASE reduce by rule 274 + UPPERCASE reduce by rule 274 + VERBATIM reduce by rule 274 + RTL reduce by rule 274 + SPAN reduce by rule 274 + DELAYSLOT reduce by rule 274 + ALWAYS shift 96 + NEVER shift 95 + NONFIX reduce by rule 274 + INFIX reduce by rule 274 + INFIXR reduce by rule 274 + DEBUG reduce by rule 274 + ASM_COLON reduce by rule 274 + MC_COLON reduce by rule 274 + RTL_COLON reduce by rule 274 + DELAYSLOT_COLON reduce by rule 274 + NULLIFIED_COLON reduce by rule 274 + PADDING_COLON reduce by rule 274 + RESOURCE reduce by rule 274 + CPU reduce by rule 274 + LATENCY reduce by rule 274 + EXCEPTION reduce by rule 274 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + EOF reduce by rule 274 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 403 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 283: + + aexp2 : aexp2 . AT LBRACKET slices RBRACKET + appexp : aexp2 . (reduce by rule 272) + + ARCHITECTURE reduce by rule 272 + END reduce by rule 272 + LOCAL reduce by rule 272 + IN reduce by rule 272 + OF reduce by rule 272 + DATATYPE reduce by rule 272 + TYPE reduce by rule 272 + EQ reduce by rule 272 + DOLLAR reduce by rule 272 + TIMES reduce by rule 272 + AND reduce by rule 272 + DEREF reduce by rule 272 + NOT reduce by rule 272 + LLBRACKET reduce by rule 272 + LHASHBRACKET reduce by rule 272 + LPAREN reduce by rule 272 + RPAREN reduce by rule 272 + LBRACKET reduce by rule 272 + RBRACKET reduce by rule 272 + LBRACE reduce by rule 272 + RBRACE reduce by rule 272 + SEMICOLON reduce by rule 272 + LDQUOTE reduce by rule 272 + RMETA reduce by rule 272 + CELLSET reduce by rule 272 + STORAGE reduce by rule 272 + LOCATIONS reduce by rule 272 + HASH reduce by rule 272 + COMMA reduce by rule 272 + COLON reduce by rule 272 + AT shift 404 + BAR reduce by rule 272 + DARROW reduce by rule 272 + THEN reduce by rule 272 + ELSE reduce by rule 272 + TRUE reduce by rule 272 + FALSE reduce by rule 272 + HANDLE reduce by rule 272 + LET reduce by rule 272 + STRUCTURE reduce by rule 272 + FUNCTOR reduce by rule 272 + SIGNATURE reduce by rule 272 + SHARING reduce by rule 272 + INSTRUCTION reduce by rule 272 + VLIW reduce by rule 272 + SUPERSCALAR reduce by rule 272 + WITHTYPE reduce by rule 272 + FUN reduce by rule 272 + VAL reduce by rule 272 + INCLUDE reduce by rule 272 + OPEN reduce by rule 272 + OP reduce by rule 272 + LITTLE reduce by rule 272 + BIG reduce by rule 272 + PIPELINE reduce by rule 272 + LOWERCASE reduce by rule 272 + UPPERCASE reduce by rule 272 + VERBATIM reduce by rule 272 + RTL reduce by rule 272 + SPAN reduce by rule 272 + DELAYSLOT reduce by rule 272 + ALWAYS reduce by rule 272 + NEVER reduce by rule 272 + NONFIX reduce by rule 272 + INFIX reduce by rule 272 + INFIXR reduce by rule 272 + DEBUG reduce by rule 272 + ASM_COLON reduce by rule 272 + MC_COLON reduce by rule 272 + RTL_COLON reduce by rule 272 + DELAYSLOT_COLON reduce by rule 272 + NULLIFIED_COLON reduce by rule 272 + PADDING_COLON reduce by rule 272 + RESOURCE reduce by rule 272 + CPU reduce by rule 272 + LATENCY reduce by rule 272 + EXCEPTION reduce by rule 272 + ID reduce by rule 272 + SYMBOL reduce by rule 272 + WORD reduce by rule 272 + INT reduce by rule 272 + INTINF reduce by rule 272 + REAL reduce by rule 272 + STRING reduce by rule 272 + CHAR reduce by rule 272 + EOF reduce by rule 272 + + + . error + + + state 284: + + aexp2 : aexp . (reduce by rule 262) + + ARCHITECTURE reduce by rule 262 + END reduce by rule 262 + LOCAL reduce by rule 262 + IN reduce by rule 262 + OF reduce by rule 262 + DATATYPE reduce by rule 262 + TYPE reduce by rule 262 + EQ reduce by rule 262 + DOLLAR reduce by rule 262 + TIMES reduce by rule 262 + AND reduce by rule 262 + DEREF reduce by rule 262 + NOT reduce by rule 262 + LLBRACKET reduce by rule 262 + LHASHBRACKET reduce by rule 262 + LPAREN reduce by rule 262 + RPAREN reduce by rule 262 + LBRACKET reduce by rule 262 + RBRACKET reduce by rule 262 + LBRACE reduce by rule 262 + RBRACE reduce by rule 262 + SEMICOLON reduce by rule 262 + LDQUOTE reduce by rule 262 + RMETA reduce by rule 262 + CELLSET reduce by rule 262 + STORAGE reduce by rule 262 + LOCATIONS reduce by rule 262 + HASH reduce by rule 262 + COMMA reduce by rule 262 + COLON reduce by rule 262 + AT reduce by rule 262 + BAR reduce by rule 262 + DARROW reduce by rule 262 + THEN reduce by rule 262 + ELSE reduce by rule 262 + TRUE reduce by rule 262 + FALSE reduce by rule 262 + HANDLE reduce by rule 262 + LET reduce by rule 262 + STRUCTURE reduce by rule 262 + FUNCTOR reduce by rule 262 + SIGNATURE reduce by rule 262 + SHARING reduce by rule 262 + INSTRUCTION reduce by rule 262 + VLIW reduce by rule 262 + SUPERSCALAR reduce by rule 262 + WITHTYPE reduce by rule 262 + FUN reduce by rule 262 + VAL reduce by rule 262 + INCLUDE reduce by rule 262 + OPEN reduce by rule 262 + OP reduce by rule 262 + LITTLE reduce by rule 262 + BIG reduce by rule 262 + PIPELINE reduce by rule 262 + LOWERCASE reduce by rule 262 + UPPERCASE reduce by rule 262 + VERBATIM reduce by rule 262 + RTL reduce by rule 262 + SPAN reduce by rule 262 + DELAYSLOT reduce by rule 262 + ALWAYS reduce by rule 262 + NEVER reduce by rule 262 + NONFIX reduce by rule 262 + INFIX reduce by rule 262 + INFIXR reduce by rule 262 + DEBUG reduce by rule 262 + ASM_COLON reduce by rule 262 + MC_COLON reduce by rule 262 + RTL_COLON reduce by rule 262 + DELAYSLOT_COLON reduce by rule 262 + NULLIFIED_COLON reduce by rule 262 + PADDING_COLON reduce by rule 262 + RESOURCE reduce by rule 262 + CPU reduce by rule 262 + LATENCY reduce by rule 262 + EXCEPTION reduce by rule 262 + ID reduce by rule 262 + SYMBOL reduce by rule 262 + WORD reduce by rule 262 + INT reduce by rule 262 + INTINF reduce by rule 262 + REAL reduce by rule 262 + STRING reduce by rule 262 + CHAR reduce by rule 262 + EOF reduce by rule 262 + + + . error + + + state 285: + + aexp : ident2 . (reduce by rule 242) + + ARCHITECTURE reduce by rule 242 + END reduce by rule 242 + LOCAL reduce by rule 242 + IN reduce by rule 242 + OF reduce by rule 242 + DATATYPE reduce by rule 242 + TYPE reduce by rule 242 + EQ reduce by rule 242 + DOLLAR reduce by rule 242 + TIMES reduce by rule 242 + AND reduce by rule 242 + DEREF reduce by rule 242 + NOT reduce by rule 242 + LLBRACKET reduce by rule 242 + LHASHBRACKET reduce by rule 242 + LPAREN reduce by rule 242 + RPAREN reduce by rule 242 + LBRACKET reduce by rule 242 + RBRACKET reduce by rule 242 + LBRACE reduce by rule 242 + RBRACE reduce by rule 242 + SEMICOLON reduce by rule 242 + LDQUOTE reduce by rule 242 + RMETA reduce by rule 242 + CELLSET reduce by rule 242 + STORAGE reduce by rule 242 + LOCATIONS reduce by rule 242 + HASH reduce by rule 242 + COMMA reduce by rule 242 + COLON reduce by rule 242 + AT reduce by rule 242 + BAR reduce by rule 242 + DARROW reduce by rule 242 + THEN reduce by rule 242 + ELSE reduce by rule 242 + TRUE reduce by rule 242 + FALSE reduce by rule 242 + HANDLE reduce by rule 242 + LET reduce by rule 242 + STRUCTURE reduce by rule 242 + FUNCTOR reduce by rule 242 + SIGNATURE reduce by rule 242 + SHARING reduce by rule 242 + INSTRUCTION reduce by rule 242 + VLIW reduce by rule 242 + SUPERSCALAR reduce by rule 242 + WITHTYPE reduce by rule 242 + FUN reduce by rule 242 + VAL reduce by rule 242 + INCLUDE reduce by rule 242 + OPEN reduce by rule 242 + OP reduce by rule 242 + LITTLE reduce by rule 242 + BIG reduce by rule 242 + PIPELINE reduce by rule 242 + LOWERCASE reduce by rule 242 + UPPERCASE reduce by rule 242 + VERBATIM reduce by rule 242 + RTL reduce by rule 242 + SPAN reduce by rule 242 + DELAYSLOT reduce by rule 242 + ALWAYS reduce by rule 242 + NEVER reduce by rule 242 + NONFIX reduce by rule 242 + INFIX reduce by rule 242 + INFIXR reduce by rule 242 + DEBUG reduce by rule 242 + ASM_COLON reduce by rule 242 + MC_COLON reduce by rule 242 + RTL_COLON reduce by rule 242 + DELAYSLOT_COLON reduce by rule 242 + NULLIFIED_COLON reduce by rule 242 + PADDING_COLON reduce by rule 242 + RESOURCE reduce by rule 242 + CPU reduce by rule 242 + LATENCY reduce by rule 242 + EXCEPTION reduce by rule 242 + ID reduce by rule 242 + SYMBOL reduce by rule 242 + WORD reduce by rule 242 + INT reduce by rule 242 + INTINF reduce by rule 242 + REAL reduce by rule 242 + STRING reduce by rule 242 + CHAR reduce by rule 242 + EOF reduce by rule 242 + + + . error + + + state 286: + + aexp : sym . CONCAT LBRACKET exps RBRACKET + aexp : sym . CONCAT LBRACKET exps RBRACKET CONCAT sym + aexp2 : sym . (reduce by rule 263) + + ARCHITECTURE reduce by rule 263 + END reduce by rule 263 + LOCAL reduce by rule 263 + IN reduce by rule 263 + OF reduce by rule 263 + DATATYPE reduce by rule 263 + TYPE reduce by rule 263 + EQ reduce by rule 263 + DOLLAR reduce by rule 263 + TIMES reduce by rule 263 + AND reduce by rule 263 + DEREF reduce by rule 263 + NOT reduce by rule 263 + CONCAT shift 405 + LLBRACKET reduce by rule 263 + LHASHBRACKET reduce by rule 263 + LPAREN reduce by rule 263 + RPAREN reduce by rule 263 + LBRACKET reduce by rule 263 + RBRACKET reduce by rule 263 + LBRACE reduce by rule 263 + RBRACE reduce by rule 263 + SEMICOLON reduce by rule 263 + LDQUOTE reduce by rule 263 + RMETA reduce by rule 263 + CELLSET reduce by rule 263 + STORAGE reduce by rule 263 + LOCATIONS reduce by rule 263 + HASH reduce by rule 263 + COMMA reduce by rule 263 + COLON reduce by rule 263 + AT reduce by rule 263 + BAR reduce by rule 263 + DARROW reduce by rule 263 + THEN reduce by rule 263 + ELSE reduce by rule 263 + TRUE reduce by rule 263 + FALSE reduce by rule 263 + HANDLE reduce by rule 263 + LET reduce by rule 263 + STRUCTURE reduce by rule 263 + FUNCTOR reduce by rule 263 + SIGNATURE reduce by rule 263 + SHARING reduce by rule 263 + INSTRUCTION reduce by rule 263 + VLIW reduce by rule 263 + SUPERSCALAR reduce by rule 263 + WITHTYPE reduce by rule 263 + FUN reduce by rule 263 + VAL reduce by rule 263 + INCLUDE reduce by rule 263 + OPEN reduce by rule 263 + OP reduce by rule 263 + LITTLE reduce by rule 263 + BIG reduce by rule 263 + PIPELINE reduce by rule 263 + LOWERCASE reduce by rule 263 + UPPERCASE reduce by rule 263 + VERBATIM reduce by rule 263 + RTL reduce by rule 263 + SPAN reduce by rule 263 + DELAYSLOT reduce by rule 263 + ALWAYS reduce by rule 263 + NEVER reduce by rule 263 + NONFIX reduce by rule 263 + INFIX reduce by rule 263 + INFIXR reduce by rule 263 + DEBUG reduce by rule 263 + ASM_COLON reduce by rule 263 + MC_COLON reduce by rule 263 + RTL_COLON reduce by rule 263 + DELAYSLOT_COLON reduce by rule 263 + NULLIFIED_COLON reduce by rule 263 + PADDING_COLON reduce by rule 263 + RESOURCE reduce by rule 263 + CPU reduce by rule 263 + LATENCY reduce by rule 263 + EXCEPTION reduce by rule 263 + ID reduce by rule 263 + SYMBOL reduce by rule 263 + WORD reduce by rule 263 + INT reduce by rule 263 + INTINF reduce by rule 263 + REAL reduce by rule 263 + STRING reduce by rule 263 + CHAR reduce by rule 263 + EOF reduce by rule 263 + + + . error + + + state 287: + + aexp : OP . symb + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + + symb goto 406 + + . error + + + state 288: + + aexp : LET . decls IN expseq END + + ARCHITECTURE shift 39 + LOCAL shift 38 + IN reduce by rule 1 + DATATYPE shift 37 + TYPE shift 36 + STORAGE shift 35 + LOCATIONS shift 34 + STRUCTURE shift 33 + FUNCTOR shift 32 + SIGNATURE shift 31 + SHARING shift 30 + INSTRUCTION shift 29 + VLIW shift 28 + SUPERSCALAR shift 27 + FUN shift 26 + VAL shift 25 + INCLUDE shift 24 + OPEN shift 23 + LITTLE shift 22 + BIG shift 21 + PIPELINE shift 20 + LOWERCASE shift 19 + UPPERCASE shift 18 + VERBATIM shift 17 + RTL shift 16 + NONFIX shift 15 + INFIX shift 14 + INFIXR shift 13 + DEBUG shift 12 + RESOURCE shift 11 + CPU shift 10 + LATENCY shift 9 + EXCEPTION shift 8 + + decls goto 407 + decl goto 6 + mldecl goto 5 + mymldecl goto 4 + mddecl goto 3 + mymddecl goto 2 + assemblycase goto 1 + + . error + + + state 289: + + exp : RAISE . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 408 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 290: + + exp : IF . typedexp THEN typedexp ELSE exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 409 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 291: + + aexp : HASH . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 410 + + . error + + + state 292: + + exp : FN . clauses + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 413 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + clause goto 412 + clauses goto 411 + True goto 74 + False goto 73 + + . error + + + state 293: + + asm_strings : LDQUOTE . asms RDQUOTE + asm_strings : LDQUOTE . asms RDQUOTE asm_strings + + LMETA shift 417 + ASMTEXT shift 416 + + asms goto 415 + asm goto 414 + + . error + + + state 294: + + aexp : LBRACE . labexps0 RBRACE + + RBRACE reduce by rule 266 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 421 + labexps0 goto 420 + labexps goto 419 + labexp goto 418 + + . error + + + state 295: + + aexp : LBRACKET . exps RBRACKET + aexp : LBRACKET . exps RBRACKET CONCAT sym + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + RBRACKET reduce by rule 288 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 424 + exps goto 423 + exps1 goto 422 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 296: + + aexp : LPAREN . symb RPAREN + aexp : LPAREN . RPAREN + aexp : LPAREN . typedexp RPAREN + aexp : LPAREN . exps2 RPAREN + aexp : LPAREN . expseq2 RPAREN + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + RPAREN shift 429 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 428 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 427 + exps2 goto 426 + expseq2 goto 425 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 297: + + aexp : LHASHBRACKET . exps RBRACKET + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + RBRACKET reduce by rule 288 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 424 + exps goto 430 + exps1 goto 422 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 298: + + aexp : LLBRACKET . rtlterms RRBRACKET + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + HASH shift 435 + ID shift 49 + SYMBOL shift 48 + STRING shift 91 + + id goto 69 + sym goto 434 + symb goto 67 + string goto 433 + rtlterm goto 432 + rtlterms goto 431 + + . error + + + state 299: + + aexp : DOLLAR . id LBRACKET exp region RBRACKET + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 436 + + . error + + + state 300: + + aexp2 : EQ . (reduce by rule 264) + + ARCHITECTURE reduce by rule 264 + END reduce by rule 264 + LOCAL reduce by rule 264 + IN reduce by rule 264 + OF reduce by rule 264 + DATATYPE reduce by rule 264 + TYPE reduce by rule 264 + EQ reduce by rule 264 + DOLLAR reduce by rule 264 + TIMES reduce by rule 264 + AND reduce by rule 264 + DEREF reduce by rule 264 + NOT reduce by rule 264 + LLBRACKET reduce by rule 264 + LHASHBRACKET reduce by rule 264 + LPAREN reduce by rule 264 + RPAREN reduce by rule 264 + LBRACKET reduce by rule 264 + RBRACKET reduce by rule 264 + LBRACE reduce by rule 264 + RBRACE reduce by rule 264 + SEMICOLON reduce by rule 264 + LDQUOTE reduce by rule 264 + RMETA reduce by rule 264 + CELLSET reduce by rule 264 + STORAGE reduce by rule 264 + LOCATIONS reduce by rule 264 + HASH reduce by rule 264 + COMMA reduce by rule 264 + COLON reduce by rule 264 + AT reduce by rule 264 + BAR reduce by rule 264 + DARROW reduce by rule 264 + THEN reduce by rule 264 + ELSE reduce by rule 264 + TRUE reduce by rule 264 + FALSE reduce by rule 264 + HANDLE reduce by rule 264 + LET reduce by rule 264 + STRUCTURE reduce by rule 264 + FUNCTOR reduce by rule 264 + SIGNATURE reduce by rule 264 + SHARING reduce by rule 264 + INSTRUCTION reduce by rule 264 + VLIW reduce by rule 264 + SUPERSCALAR reduce by rule 264 + WITHTYPE reduce by rule 264 + FUN reduce by rule 264 + VAL reduce by rule 264 + INCLUDE reduce by rule 264 + OPEN reduce by rule 264 + OP reduce by rule 264 + LITTLE reduce by rule 264 + BIG reduce by rule 264 + PIPELINE reduce by rule 264 + LOWERCASE reduce by rule 264 + UPPERCASE reduce by rule 264 + VERBATIM reduce by rule 264 + RTL reduce by rule 264 + SPAN reduce by rule 264 + DELAYSLOT reduce by rule 264 + ALWAYS reduce by rule 264 + NEVER reduce by rule 264 + NONFIX reduce by rule 264 + INFIX reduce by rule 264 + INFIXR reduce by rule 264 + DEBUG reduce by rule 264 + ASM_COLON reduce by rule 264 + MC_COLON reduce by rule 264 + RTL_COLON reduce by rule 264 + DELAYSLOT_COLON reduce by rule 264 + NULLIFIED_COLON reduce by rule 264 + PADDING_COLON reduce by rule 264 + RESOURCE reduce by rule 264 + CPU reduce by rule 264 + LATENCY reduce by rule 264 + EXCEPTION reduce by rule 264 + ID reduce by rule 264 + SYMBOL reduce by rule 264 + WORD reduce by rule 264 + INT reduce by rule 264 + INTINF reduce by rule 264 + REAL reduce by rule 264 + STRING reduce by rule 264 + CHAR reduce by rule 264 + EOF reduce by rule 264 + + + . error + + + state 301: + + exp : CASE . typedexp OF clauses + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 437 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 302: + + path : path DOT sym . (reduce by rule 425) + + ARCHITECTURE reduce by rule 425 + END reduce by rule 425 + LOCAL reduce by rule 425 + IN reduce by rule 425 + OF reduce by rule 425 + DATATYPE reduce by rule 425 + TYPE reduce by rule 425 + EQ reduce by rule 425 + DOLLAR reduce by rule 425 + TIMES reduce by rule 425 + AND reduce by rule 425 + DEREF reduce by rule 425 + NOT reduce by rule 425 + LLBRACKET reduce by rule 425 + LHASHBRACKET reduce by rule 425 + LPAREN reduce by rule 425 + RPAREN reduce by rule 425 + LBRACKET reduce by rule 425 + RBRACKET reduce by rule 425 + LBRACE reduce by rule 425 + RBRACE reduce by rule 425 + SEMICOLON reduce by rule 425 + LDQUOTE reduce by rule 425 + RMETA reduce by rule 425 + CELLSET reduce by rule 425 + STORAGE reduce by rule 425 + LOCATIONS reduce by rule 425 + HASH reduce by rule 425 + COMMA reduce by rule 425 + COLON reduce by rule 425 + DOT reduce by rule 425 + AT reduce by rule 425 + BAR reduce by rule 425 + DARROW reduce by rule 425 + THEN reduce by rule 425 + ELSE reduce by rule 425 + TRUE reduce by rule 425 + FALSE reduce by rule 425 + WILD reduce by rule 425 + HANDLE reduce by rule 425 + LET reduce by rule 425 + STRUCTURE reduce by rule 425 + FUNCTOR reduce by rule 425 + SIGNATURE reduce by rule 425 + WHERE reduce by rule 425 + SHARING reduce by rule 425 + INSTRUCTION reduce by rule 425 + VLIW reduce by rule 425 + SUPERSCALAR reduce by rule 425 + WITHTYPE reduce by rule 425 + FUN reduce by rule 425 + VAL reduce by rule 425 + INCLUDE reduce by rule 425 + OPEN reduce by rule 425 + OP reduce by rule 425 + LITTLE reduce by rule 425 + BIG reduce by rule 425 + PIPELINE reduce by rule 425 + LOWERCASE reduce by rule 425 + UPPERCASE reduce by rule 425 + VERBATIM reduce by rule 425 + RTL reduce by rule 425 + SPAN reduce by rule 425 + DELAYSLOT reduce by rule 425 + ALWAYS reduce by rule 425 + NEVER reduce by rule 425 + NONFIX reduce by rule 425 + INFIX reduce by rule 425 + INFIXR reduce by rule 425 + DEBUG reduce by rule 425 + ASM_COLON reduce by rule 425 + MC_COLON reduce by rule 425 + RTL_COLON reduce by rule 425 + DELAYSLOT_COLON reduce by rule 425 + NULLIFIED_COLON reduce by rule 425 + PADDING_COLON reduce by rule 425 + RESOURCE reduce by rule 425 + CPU reduce by rule 425 + LATENCY reduce by rule 425 + EXCEPTION reduce by rule 425 + ID reduce by rule 425 + SYMBOL reduce by rule 425 + WORD reduce by rule 425 + INT reduce by rule 425 + INTINF reduce by rule 425 + REAL reduce by rule 425 + STRING reduce by rule 425 + CHAR reduce by rule 425 + EOF reduce by rule 425 + + + . error + + + state 303: + + mymldecl : RTL syms COLON ty . (reduce by rule 64) + ty : ty . ARROW ty + + ARCHITECTURE reduce by rule 64 + END reduce by rule 64 + LOCAL reduce by rule 64 + IN reduce by rule 64 + DATATYPE reduce by rule 64 + TYPE reduce by rule 64 + RPAREN reduce by rule 64 + SEMICOLON reduce by rule 64 + STORAGE reduce by rule 64 + LOCATIONS reduce by rule 64 + ARROW shift 388 + STRUCTURE reduce by rule 64 + FUNCTOR reduce by rule 64 + SIGNATURE reduce by rule 64 + SHARING reduce by rule 64 + INSTRUCTION reduce by rule 64 + VLIW reduce by rule 64 + SUPERSCALAR reduce by rule 64 + FUN reduce by rule 64 + VAL reduce by rule 64 + INCLUDE reduce by rule 64 + OPEN reduce by rule 64 + LITTLE reduce by rule 64 + BIG reduce by rule 64 + PIPELINE reduce by rule 64 + LOWERCASE reduce by rule 64 + UPPERCASE reduce by rule 64 + VERBATIM reduce by rule 64 + RTL reduce by rule 64 + NONFIX reduce by rule 64 + INFIX reduce by rule 64 + INFIXR reduce by rule 64 + DEBUG reduce by rule 64 + RESOURCE reduce by rule 64 + CPU reduce by rule 64 + LATENCY reduce by rule 64 + EXCEPTION reduce by rule 64 + EOF reduce by rule 64 + + + . error + + + state 304: + + apat : sym CONCAT LBRACKET . pats RBRACKET + apat : sym CONCAT LBRACKET . pats RBRACKET CONCAT sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + RBRACKET reduce by rule 321 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 194 + pats goto 438 + pats1 goto 192 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 305: + + asapat : id AS asapat . (reduce by rule 320) + + EQ reduce by rule 320 + + + . error + + + state 306: + + apat : sym . CONCAT LBRACKET pats RBRACKET + apat : sym . CONCAT LBRACKET pats RBRACKET CONCAT sym + + CONCAT shift 184 + + + . error + + + state 307: + + sym : id . (reduce by rule 416) + path : id . DOT sym + asapat : id . AS asapat + + CONCAT reduce by rule 416 + DOT shift 186 + AS shift 185 + + + . error + + + state 308: + + path : id DOT sym . (reduce by rule 424) + + ARCHITECTURE reduce by rule 424 + END reduce by rule 424 + LOCAL reduce by rule 424 + IN reduce by rule 424 + OF reduce by rule 424 + DATATYPE reduce by rule 424 + TYPE reduce by rule 424 + EQ reduce by rule 424 + DOLLAR reduce by rule 424 + TIMES reduce by rule 424 + AND reduce by rule 424 + DEREF reduce by rule 424 + NOT reduce by rule 424 + LLBRACKET reduce by rule 424 + LHASHBRACKET reduce by rule 424 + LPAREN reduce by rule 424 + RPAREN reduce by rule 424 + LBRACKET reduce by rule 424 + RBRACKET reduce by rule 424 + LBRACE reduce by rule 424 + RBRACE reduce by rule 424 + SEMICOLON reduce by rule 424 + LDQUOTE reduce by rule 424 + RMETA reduce by rule 424 + CELLSET reduce by rule 424 + STORAGE reduce by rule 424 + LOCATIONS reduce by rule 424 + HASH reduce by rule 424 + COMMA reduce by rule 424 + COLON reduce by rule 424 + DOT reduce by rule 424 + AT reduce by rule 424 + BAR reduce by rule 424 + DARROW reduce by rule 424 + THEN reduce by rule 424 + ELSE reduce by rule 424 + TRUE reduce by rule 424 + FALSE reduce by rule 424 + WILD reduce by rule 424 + HANDLE reduce by rule 424 + LET reduce by rule 424 + STRUCTURE reduce by rule 424 + FUNCTOR reduce by rule 424 + SIGNATURE reduce by rule 424 + WHERE reduce by rule 424 + SHARING reduce by rule 424 + INSTRUCTION reduce by rule 424 + VLIW reduce by rule 424 + SUPERSCALAR reduce by rule 424 + WITHTYPE reduce by rule 424 + FUN reduce by rule 424 + VAL reduce by rule 424 + INCLUDE reduce by rule 424 + OPEN reduce by rule 424 + OP reduce by rule 424 + LITTLE reduce by rule 424 + BIG reduce by rule 424 + PIPELINE reduce by rule 424 + LOWERCASE reduce by rule 424 + UPPERCASE reduce by rule 424 + VERBATIM reduce by rule 424 + RTL reduce by rule 424 + SPAN reduce by rule 424 + DELAYSLOT reduce by rule 424 + ALWAYS reduce by rule 424 + NEVER reduce by rule 424 + NONFIX reduce by rule 424 + INFIX reduce by rule 424 + INFIXR reduce by rule 424 + DEBUG reduce by rule 424 + ASM_COLON reduce by rule 424 + MC_COLON reduce by rule 424 + RTL_COLON reduce by rule 424 + DELAYSLOT_COLON reduce by rule 424 + NULLIFIED_COLON reduce by rule 424 + PADDING_COLON reduce by rule 424 + RESOURCE reduce by rule 424 + CPU reduce by rule 424 + LATENCY reduce by rule 424 + EXCEPTION reduce by rule 424 + ID reduce by rule 424 + SYMBOL reduce by rule 424 + WORD reduce by rule 424 + INT reduce by rule 424 + INTINF reduce by rule 424 + REAL reduce by rule 424 + STRING reduce by rule 424 + CHAR reduce by rule 424 + EOF reduce by rule 424 + + + . error + + + state 309: + + mymldecl : RTL id LBRACE labpats0 . RBRACE EQ exp + + RBRACE shift 439 + + + . error + + + state 310: + + apat : LBRACE labpats0 RBRACE . (reduce by rule 302) + + EQ reduce by rule 302 + TIMES reduce by rule 302 + AND reduce by rule 302 + DEREF reduce by rule 302 + NOT reduce by rule 302 + LHASHBRACKET reduce by rule 302 + LPAREN reduce by rule 302 + RPAREN reduce by rule 302 + LBRACKET reduce by rule 302 + RBRACKET reduce by rule 302 + LBRACE reduce by rule 302 + RBRACE reduce by rule 302 + CELLSET reduce by rule 302 + COMMA reduce by rule 302 + COLON reduce by rule 302 + BAR reduce by rule 302 + DARROW reduce by rule 302 + TRUE reduce by rule 302 + FALSE reduce by rule 302 + WILD reduce by rule 302 + WHERE reduce by rule 302 + OP reduce by rule 302 + ALWAYS reduce by rule 302 + NEVER reduce by rule 302 + EXCEPTION reduce by rule 302 + ID reduce by rule 302 + SYMBOL reduce by rule 302 + WORD reduce by rule 302 + INT reduce by rule 302 + INTINF reduce by rule 302 + REAL reduce by rule 302 + STRING reduce by rule 302 + CHAR reduce by rule 302 + + + . error + + + state 311: + + labpats : labpat COMMA . DOTDOT + labpats : labpat COMMA . labpats + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + DOTDOT shift 441 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 191 + symb goto 67 + labpat goto 190 + labpats goto 440 + + . error + + + state 312: + + labpat : sym AS . typedpat + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 442 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 313: + + labpat : sym WHERE . typedexp + labpat : sym WHERE . typedexp IN typedpat + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 443 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 314: + + labpat : sym EQ . typedpat + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 444 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 315: + + apat : LBRACKET pats RBRACKET . (reduce by rule 294) + apat : LBRACKET pats RBRACKET . CONCAT sym + + EQ reduce by rule 294 + TIMES reduce by rule 294 + AND reduce by rule 294 + DEREF reduce by rule 294 + NOT reduce by rule 294 + CONCAT shift 445 + LHASHBRACKET reduce by rule 294 + LPAREN reduce by rule 294 + RPAREN reduce by rule 294 + LBRACKET reduce by rule 294 + RBRACKET reduce by rule 294 + LBRACE reduce by rule 294 + RBRACE reduce by rule 294 + CELLSET reduce by rule 294 + COMMA reduce by rule 294 + COLON reduce by rule 294 + BAR reduce by rule 294 + DARROW reduce by rule 294 + TRUE reduce by rule 294 + FALSE reduce by rule 294 + WILD reduce by rule 294 + WHERE reduce by rule 294 + OP reduce by rule 294 + ALWAYS reduce by rule 294 + NEVER reduce by rule 294 + EXCEPTION reduce by rule 294 + ID reduce by rule 294 + SYMBOL reduce by rule 294 + WORD reduce by rule 294 + INT reduce by rule 294 + INTINF reduce by rule 294 + REAL reduce by rule 294 + STRING reduce by rule 294 + CHAR reduce by rule 294 + + + . error + + + state 316: + + typedpat : typedpat COLON . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 446 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 317: + + pats1 : typedpat COMMA . pats1 + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 194 + pats1 goto 447 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 318: + + apat : LPAREN andpats2 RPAREN . (reduce by rule 298) + + EQ reduce by rule 298 + TIMES reduce by rule 298 + AND reduce by rule 298 + DEREF reduce by rule 298 + NOT reduce by rule 298 + LHASHBRACKET reduce by rule 298 + LPAREN reduce by rule 298 + RPAREN reduce by rule 298 + LBRACKET reduce by rule 298 + RBRACKET reduce by rule 298 + LBRACE reduce by rule 298 + RBRACE reduce by rule 298 + CELLSET reduce by rule 298 + COMMA reduce by rule 298 + COLON reduce by rule 298 + BAR reduce by rule 298 + DARROW reduce by rule 298 + TRUE reduce by rule 298 + FALSE reduce by rule 298 + WILD reduce by rule 298 + WHERE reduce by rule 298 + OP reduce by rule 298 + ALWAYS reduce by rule 298 + NEVER reduce by rule 298 + EXCEPTION reduce by rule 298 + ID reduce by rule 298 + SYMBOL reduce by rule 298 + WORD reduce by rule 298 + INT reduce by rule 298 + INTINF reduce by rule 298 + REAL reduce by rule 298 + STRING reduce by rule 298 + CHAR reduce by rule 298 + + + . error + + + state 319: + + apat : LPAREN orpats2 RPAREN . (reduce by rule 297) + + EQ reduce by rule 297 + TIMES reduce by rule 297 + AND reduce by rule 297 + DEREF reduce by rule 297 + NOT reduce by rule 297 + LHASHBRACKET reduce by rule 297 + LPAREN reduce by rule 297 + RPAREN reduce by rule 297 + LBRACKET reduce by rule 297 + RBRACKET reduce by rule 297 + LBRACE reduce by rule 297 + RBRACE reduce by rule 297 + CELLSET reduce by rule 297 + COMMA reduce by rule 297 + COLON reduce by rule 297 + BAR reduce by rule 297 + DARROW reduce by rule 297 + TRUE reduce by rule 297 + FALSE reduce by rule 297 + WILD reduce by rule 297 + WHERE reduce by rule 297 + OP reduce by rule 297 + ALWAYS reduce by rule 297 + NEVER reduce by rule 297 + EXCEPTION reduce by rule 297 + ID reduce by rule 297 + SYMBOL reduce by rule 297 + WORD reduce by rule 297 + INT reduce by rule 297 + INTINF reduce by rule 297 + REAL reduce by rule 297 + STRING reduce by rule 297 + CHAR reduce by rule 297 + + + . error + + + state 320: + + apat : LPAREN pats2 RPAREN . (reduce by rule 296) + + EQ reduce by rule 296 + TIMES reduce by rule 296 + AND reduce by rule 296 + DEREF reduce by rule 296 + NOT reduce by rule 296 + LHASHBRACKET reduce by rule 296 + LPAREN reduce by rule 296 + RPAREN reduce by rule 296 + LBRACKET reduce by rule 296 + RBRACKET reduce by rule 296 + LBRACE reduce by rule 296 + RBRACE reduce by rule 296 + CELLSET reduce by rule 296 + COMMA reduce by rule 296 + COLON reduce by rule 296 + BAR reduce by rule 296 + DARROW reduce by rule 296 + TRUE reduce by rule 296 + FALSE reduce by rule 296 + WILD reduce by rule 296 + WHERE reduce by rule 296 + OP reduce by rule 296 + ALWAYS reduce by rule 296 + NEVER reduce by rule 296 + EXCEPTION reduce by rule 296 + ID reduce by rule 296 + SYMBOL reduce by rule 296 + WORD reduce by rule 296 + INT reduce by rule 296 + INTINF reduce by rule 296 + REAL reduce by rule 296 + STRING reduce by rule 296 + CHAR reduce by rule 296 + + + . error + + + state 321: + + apat : LPAREN typedpat WHERE . typedexp RPAREN + apat : LPAREN typedpat WHERE . typedexp IN typedpat RPAREN + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 448 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 322: + + orpats2 : typedpat BAR . typedpat + orpats2 : typedpat BAR . orpats2 + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 450 + orpats2 goto 449 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 323: + + pats2 : typedpat COMMA . pats1 + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 194 + pats1 goto 451 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 324: + + apat : LPAREN typedpat RPAREN . (reduce by rule 299) + + EQ reduce by rule 299 + TIMES reduce by rule 299 + AND reduce by rule 299 + DEREF reduce by rule 299 + NOT reduce by rule 299 + LHASHBRACKET reduce by rule 299 + LPAREN reduce by rule 299 + RPAREN reduce by rule 299 + LBRACKET reduce by rule 299 + RBRACKET reduce by rule 299 + LBRACE reduce by rule 299 + RBRACE reduce by rule 299 + CELLSET reduce by rule 299 + COMMA reduce by rule 299 + COLON reduce by rule 299 + BAR reduce by rule 299 + DARROW reduce by rule 299 + TRUE reduce by rule 299 + FALSE reduce by rule 299 + WILD reduce by rule 299 + WHERE reduce by rule 299 + OP reduce by rule 299 + ALWAYS reduce by rule 299 + NEVER reduce by rule 299 + EXCEPTION reduce by rule 299 + ID reduce by rule 299 + SYMBOL reduce by rule 299 + WORD reduce by rule 299 + INT reduce by rule 299 + INTINF reduce by rule 299 + REAL reduce by rule 299 + STRING reduce by rule 299 + CHAR reduce by rule 299 + + + . error + + + state 325: + + andpats2 : typedpat AND . typedpat + andpats2 : typedpat AND . andpats2 + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 453 + andpats2 goto 452 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 326: + + apat : LHASHBRACKET pats RBRACKET . (reduce by rule 295) + + EQ reduce by rule 295 + TIMES reduce by rule 295 + AND reduce by rule 295 + DEREF reduce by rule 295 + NOT reduce by rule 295 + LHASHBRACKET reduce by rule 295 + LPAREN reduce by rule 295 + RPAREN reduce by rule 295 + LBRACKET reduce by rule 295 + RBRACKET reduce by rule 295 + LBRACE reduce by rule 295 + RBRACE reduce by rule 295 + CELLSET reduce by rule 295 + COMMA reduce by rule 295 + COLON reduce by rule 295 + BAR reduce by rule 295 + DARROW reduce by rule 295 + TRUE reduce by rule 295 + FALSE reduce by rule 295 + WILD reduce by rule 295 + WHERE reduce by rule 295 + OP reduce by rule 295 + ALWAYS reduce by rule 295 + NEVER reduce by rule 295 + EXCEPTION reduce by rule 295 + ID reduce by rule 295 + SYMBOL reduce by rule 295 + WORD reduce by rule 295 + INT reduce by rule 295 + INTINF reduce by rule 295 + REAL reduce by rule 295 + STRING reduce by rule 295 + CHAR reduce by rule 295 + + + . error + + + state 327: + + pipelineclauses : pipelineclause BAR pipelineclauses . (reduce by rule 43) + + ARCHITECTURE reduce by rule 43 + END reduce by rule 43 + LOCAL reduce by rule 43 + IN reduce by rule 43 + DATATYPE reduce by rule 43 + TYPE reduce by rule 43 + AND reduce by rule 43 + RPAREN reduce by rule 43 + SEMICOLON reduce by rule 43 + STORAGE reduce by rule 43 + LOCATIONS reduce by rule 43 + STRUCTURE reduce by rule 43 + FUNCTOR reduce by rule 43 + SIGNATURE reduce by rule 43 + SHARING reduce by rule 43 + INSTRUCTION reduce by rule 43 + VLIW reduce by rule 43 + SUPERSCALAR reduce by rule 43 + FUN reduce by rule 43 + VAL reduce by rule 43 + INCLUDE reduce by rule 43 + OPEN reduce by rule 43 + LITTLE reduce by rule 43 + BIG reduce by rule 43 + PIPELINE reduce by rule 43 + LOWERCASE reduce by rule 43 + UPPERCASE reduce by rule 43 + VERBATIM reduce by rule 43 + RTL reduce by rule 43 + NONFIX reduce by rule 43 + INFIX reduce by rule 43 + INFIXR reduce by rule 43 + DEBUG reduce by rule 43 + RESOURCE reduce by rule 43 + CPU reduce by rule 43 + LATENCY reduce by rule 43 + EXCEPTION reduce by rule 43 + EOF reduce by rule 43 + + + . error + + + state 328: + + pipelinebinds : pipelinebind AND pipelinebinds . (reduce by rule 40) + + ARCHITECTURE reduce by rule 40 + END reduce by rule 40 + LOCAL reduce by rule 40 + IN reduce by rule 40 + DATATYPE reduce by rule 40 + TYPE reduce by rule 40 + RPAREN reduce by rule 40 + SEMICOLON reduce by rule 40 + STORAGE reduce by rule 40 + LOCATIONS reduce by rule 40 + STRUCTURE reduce by rule 40 + FUNCTOR reduce by rule 40 + SIGNATURE reduce by rule 40 + SHARING reduce by rule 40 + INSTRUCTION reduce by rule 40 + VLIW reduce by rule 40 + SUPERSCALAR reduce by rule 40 + FUN reduce by rule 40 + VAL reduce by rule 40 + INCLUDE reduce by rule 40 + OPEN reduce by rule 40 + LITTLE reduce by rule 40 + BIG reduce by rule 40 + PIPELINE reduce by rule 40 + LOWERCASE reduce by rule 40 + UPPERCASE reduce by rule 40 + VERBATIM reduce by rule 40 + RTL reduce by rule 40 + NONFIX reduce by rule 40 + INFIX reduce by rule 40 + INFIXR reduce by rule 40 + DEBUG reduce by rule 40 + RESOURCE reduce by rule 40 + CPU reduce by rule 40 + LATENCY reduce by rule 40 + EXCEPTION reduce by rule 40 + EOF reduce by rule 40 + + + . error + + + state 329: + + pipelineclause : id pat EQ . LBRACKET cycles0 RBRACKET + + LBRACKET shift 454 + + + . error + + + state 330: + + sigexp : sigexp WHERE sigsubs . (reduce by rule 92) + + ARCHITECTURE reduce by rule 92 + END reduce by rule 92 + LOCAL reduce by rule 92 + IN reduce by rule 92 + DATATYPE reduce by rule 92 + TYPE reduce by rule 92 + EQ reduce by rule 92 + RPAREN reduce by rule 92 + SEMICOLON reduce by rule 92 + STORAGE reduce by rule 92 + LOCATIONS reduce by rule 92 + STRUCTURE reduce by rule 92 + FUNCTOR reduce by rule 92 + SIGNATURE reduce by rule 92 + WHERE reduce by rule 92 + SHARING reduce by rule 92 + INSTRUCTION reduce by rule 92 + VLIW reduce by rule 92 + SUPERSCALAR reduce by rule 92 + FUN reduce by rule 92 + VAL reduce by rule 92 + INCLUDE reduce by rule 92 + OPEN reduce by rule 92 + LITTLE reduce by rule 92 + BIG reduce by rule 92 + PIPELINE reduce by rule 92 + LOWERCASE reduce by rule 92 + UPPERCASE reduce by rule 92 + VERBATIM reduce by rule 92 + RTL reduce by rule 92 + NONFIX reduce by rule 92 + INFIX reduce by rule 92 + INFIXR reduce by rule 92 + DEBUG reduce by rule 92 + RESOURCE reduce by rule 92 + CPU reduce by rule 92 + LATENCY reduce by rule 92 + EXCEPTION reduce by rule 92 + EOF reduce by rule 92 + + + . error + + + state 331: + + sigsubs : sigsub . (reduce by rule 95) + sigsubs : sigsub . AND sigsubs + + ARCHITECTURE reduce by rule 95 + END reduce by rule 95 + LOCAL reduce by rule 95 + IN reduce by rule 95 + DATATYPE reduce by rule 95 + TYPE reduce by rule 95 + EQ reduce by rule 95 + AND shift 455 + RPAREN reduce by rule 95 + SEMICOLON reduce by rule 95 + STORAGE reduce by rule 95 + LOCATIONS reduce by rule 95 + STRUCTURE reduce by rule 95 + FUNCTOR reduce by rule 95 + SIGNATURE reduce by rule 95 + WHERE reduce by rule 95 + SHARING reduce by rule 95 + INSTRUCTION reduce by rule 95 + VLIW reduce by rule 95 + SUPERSCALAR reduce by rule 95 + FUN reduce by rule 95 + VAL reduce by rule 95 + INCLUDE reduce by rule 95 + OPEN reduce by rule 95 + LITTLE reduce by rule 95 + BIG reduce by rule 95 + PIPELINE reduce by rule 95 + LOWERCASE reduce by rule 95 + UPPERCASE reduce by rule 95 + VERBATIM reduce by rule 95 + RTL reduce by rule 95 + NONFIX reduce by rule 95 + INFIX reduce by rule 95 + INFIXR reduce by rule 95 + DEBUG reduce by rule 95 + RESOURCE reduce by rule 95 + CPU reduce by rule 95 + LATENCY reduce by rule 95 + EXCEPTION reduce by rule 95 + EOF reduce by rule 95 + + + . error + + + state 332: + + sigsub : ident . EQ structexp + + EQ shift 456 + + + . error + + + state 333: + + sigsub : TYPE . ident EQ ty + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 457 + ident2 goto 112 + path goto 85 + + . error + + + state 334: + + sigexp : SIG decls END . (reduce by rule 91) + + ARCHITECTURE reduce by rule 91 + END reduce by rule 91 + LOCAL reduce by rule 91 + IN reduce by rule 91 + DATATYPE reduce by rule 91 + TYPE reduce by rule 91 + EQ reduce by rule 91 + RPAREN reduce by rule 91 + SEMICOLON reduce by rule 91 + STORAGE reduce by rule 91 + LOCATIONS reduce by rule 91 + STRUCTURE reduce by rule 91 + FUNCTOR reduce by rule 91 + SIGNATURE reduce by rule 91 + WHERE reduce by rule 91 + SHARING reduce by rule 91 + INSTRUCTION reduce by rule 91 + VLIW reduce by rule 91 + SUPERSCALAR reduce by rule 91 + FUN reduce by rule 91 + VAL reduce by rule 91 + INCLUDE reduce by rule 91 + OPEN reduce by rule 91 + LITTLE reduce by rule 91 + BIG reduce by rule 91 + PIPELINE reduce by rule 91 + LOWERCASE reduce by rule 91 + UPPERCASE reduce by rule 91 + VERBATIM reduce by rule 91 + RTL reduce by rule 91 + NONFIX reduce by rule 91 + INFIX reduce by rule 91 + INFIXR reduce by rule 91 + DEBUG reduce by rule 91 + RESOURCE reduce by rule 91 + CPU reduce by rule 91 + LATENCY reduce by rule 91 + EXCEPTION reduce by rule 91 + EOF reduce by rule 91 + + + . error + + + state 335: + + valbinds : valbind AND valbinds . (reduce by rule 232) + + ARCHITECTURE reduce by rule 232 + END reduce by rule 232 + LOCAL reduce by rule 232 + IN reduce by rule 232 + DATATYPE reduce by rule 232 + TYPE reduce by rule 232 + RPAREN reduce by rule 232 + SEMICOLON reduce by rule 232 + STORAGE reduce by rule 232 + LOCATIONS reduce by rule 232 + STRUCTURE reduce by rule 232 + FUNCTOR reduce by rule 232 + SIGNATURE reduce by rule 232 + SHARING reduce by rule 232 + INSTRUCTION reduce by rule 232 + VLIW reduce by rule 232 + SUPERSCALAR reduce by rule 232 + FUN reduce by rule 232 + VAL reduce by rule 232 + INCLUDE reduce by rule 232 + OPEN reduce by rule 232 + LITTLE reduce by rule 232 + BIG reduce by rule 232 + PIPELINE reduce by rule 232 + LOWERCASE reduce by rule 232 + UPPERCASE reduce by rule 232 + VERBATIM reduce by rule 232 + RTL reduce by rule 232 + NONFIX reduce by rule 232 + INFIX reduce by rule 232 + INFIXR reduce by rule 232 + DEBUG reduce by rule 232 + RESOURCE reduce by rule 232 + CPU reduce by rule 232 + LATENCY reduce by rule 232 + EXCEPTION reduce by rule 232 + EOF reduce by rule 232 + + + . error + + + state 336: + + typedexp : typedexp . COLON ty + valbind : pat EQ typedexp . (reduce by rule 233) + + ARCHITECTURE reduce by rule 233 + END reduce by rule 233 + LOCAL reduce by rule 233 + IN reduce by rule 233 + DATATYPE reduce by rule 233 + TYPE reduce by rule 233 + AND reduce by rule 233 + RPAREN reduce by rule 233 + SEMICOLON reduce by rule 233 + STORAGE reduce by rule 233 + LOCATIONS reduce by rule 233 + COLON shift 458 + STRUCTURE reduce by rule 233 + FUNCTOR reduce by rule 233 + SIGNATURE reduce by rule 233 + SHARING reduce by rule 233 + INSTRUCTION reduce by rule 233 + VLIW reduce by rule 233 + SUPERSCALAR reduce by rule 233 + FUN reduce by rule 233 + VAL reduce by rule 233 + INCLUDE reduce by rule 233 + OPEN reduce by rule 233 + LITTLE reduce by rule 233 + BIG reduce by rule 233 + PIPELINE reduce by rule 233 + LOWERCASE reduce by rule 233 + UPPERCASE reduce by rule 233 + VERBATIM reduce by rule 233 + RTL reduce by rule 233 + NONFIX reduce by rule 233 + INFIX reduce by rule 233 + INFIXR reduce by rule 233 + DEBUG reduce by rule 233 + RESOURCE reduce by rule 233 + CPU reduce by rule 233 + LATENCY reduce by rule 233 + EXCEPTION reduce by rule 233 + EOF reduce by rule 233 + + + . error + + + state 337: + + exp : exp . HANDLE clauses + typedexp : exp . (reduce by rule 280) + + ARCHITECTURE reduce by rule 280 + END reduce by rule 280 + LOCAL reduce by rule 280 + IN reduce by rule 280 + OF reduce by rule 280 + DATATYPE reduce by rule 280 + TYPE reduce by rule 280 + AND reduce by rule 280 + RPAREN reduce by rule 280 + RBRACKET reduce by rule 280 + RBRACE reduce by rule 280 + SEMICOLON reduce by rule 280 + STORAGE reduce by rule 280 + LOCATIONS reduce by rule 280 + COMMA reduce by rule 280 + COLON reduce by rule 280 + BAR reduce by rule 280 + DARROW reduce by rule 280 + THEN reduce by rule 280 + ELSE reduce by rule 280 + HANDLE shift 402 + STRUCTURE reduce by rule 280 + FUNCTOR reduce by rule 280 + SIGNATURE reduce by rule 280 + SHARING reduce by rule 280 + INSTRUCTION reduce by rule 280 + VLIW reduce by rule 280 + SUPERSCALAR reduce by rule 280 + FUN reduce by rule 280 + VAL reduce by rule 280 + INCLUDE reduce by rule 280 + OPEN reduce by rule 280 + LITTLE reduce by rule 280 + BIG reduce by rule 280 + PIPELINE reduce by rule 280 + LOWERCASE reduce by rule 280 + UPPERCASE reduce by rule 280 + VERBATIM reduce by rule 280 + RTL reduce by rule 280 + NONFIX reduce by rule 280 + INFIX reduce by rule 280 + INFIXR reduce by rule 280 + DEBUG reduce by rule 280 + RESOURCE reduce by rule 280 + CPU reduce by rule 280 + LATENCY reduce by rule 280 + EXCEPTION reduce by rule 280 + EOF reduce by rule 280 + + + . error + + + state 338: + + mymldecl : VAL syms COLON ty . (reduce by rule 66) + ty : ty . ARROW ty + + ARCHITECTURE reduce by rule 66 + END reduce by rule 66 + LOCAL reduce by rule 66 + IN reduce by rule 66 + DATATYPE reduce by rule 66 + TYPE reduce by rule 66 + RPAREN reduce by rule 66 + SEMICOLON reduce by rule 66 + STORAGE reduce by rule 66 + LOCATIONS reduce by rule 66 + ARROW shift 388 + STRUCTURE reduce by rule 66 + FUNCTOR reduce by rule 66 + SIGNATURE reduce by rule 66 + SHARING reduce by rule 66 + INSTRUCTION reduce by rule 66 + VLIW reduce by rule 66 + SUPERSCALAR reduce by rule 66 + FUN reduce by rule 66 + VAL reduce by rule 66 + INCLUDE reduce by rule 66 + OPEN reduce by rule 66 + LITTLE reduce by rule 66 + BIG reduce by rule 66 + PIPELINE reduce by rule 66 + LOWERCASE reduce by rule 66 + UPPERCASE reduce by rule 66 + VERBATIM reduce by rule 66 + RTL reduce by rule 66 + NONFIX reduce by rule 66 + INFIX reduce by rule 66 + INFIXR reduce by rule 66 + DEBUG reduce by rule 66 + RESOURCE reduce by rule 66 + CPU reduce by rule 66 + LATENCY reduce by rule 66 + EXCEPTION reduce by rule 66 + EOF reduce by rule 66 + + + . error + + + state 339: + + pat : id AS pat . (reduce by rule 316) + + EQ reduce by rule 316 + AND reduce by rule 316 + RPAREN reduce by rule 316 + RBRACKET reduce by rule 316 + RBRACE reduce by rule 316 + COMMA reduce by rule 316 + COLON reduce by rule 316 + BAR reduce by rule 316 + DARROW reduce by rule 316 + WHERE reduce by rule 316 + EXCEPTION reduce by rule 316 + + + . error + + + state 340: + + funbinds : funbind AND funbinds . (reduce by rule 229) + + ARCHITECTURE reduce by rule 229 + END reduce by rule 229 + LOCAL reduce by rule 229 + IN reduce by rule 229 + DATATYPE reduce by rule 229 + TYPE reduce by rule 229 + RPAREN reduce by rule 229 + SEMICOLON reduce by rule 229 + STORAGE reduce by rule 229 + LOCATIONS reduce by rule 229 + STRUCTURE reduce by rule 229 + FUNCTOR reduce by rule 229 + SIGNATURE reduce by rule 229 + SHARING reduce by rule 229 + INSTRUCTION reduce by rule 229 + VLIW reduce by rule 229 + SUPERSCALAR reduce by rule 229 + FUN reduce by rule 229 + VAL reduce by rule 229 + INCLUDE reduce by rule 229 + OPEN reduce by rule 229 + LITTLE reduce by rule 229 + BIG reduce by rule 229 + PIPELINE reduce by rule 229 + LOWERCASE reduce by rule 229 + UPPERCASE reduce by rule 229 + VERBATIM reduce by rule 229 + RTL reduce by rule 229 + NONFIX reduce by rule 229 + INFIX reduce by rule 229 + INFIXR reduce by rule 229 + DEBUG reduce by rule 229 + RESOURCE reduce by rule 229 + CPU reduce by rule 229 + LATENCY reduce by rule 229 + EXCEPTION reduce by rule 229 + EOF reduce by rule 229 + + + . error + + + state 341: + + funclauses : funclause BAR funclauses . (reduce by rule 349) + + ARCHITECTURE reduce by rule 349 + END reduce by rule 349 + LOCAL reduce by rule 349 + IN reduce by rule 349 + DATATYPE reduce by rule 349 + TYPE reduce by rule 349 + AND reduce by rule 349 + RPAREN reduce by rule 349 + SEMICOLON reduce by rule 349 + STORAGE reduce by rule 349 + LOCATIONS reduce by rule 349 + STRUCTURE reduce by rule 349 + FUNCTOR reduce by rule 349 + SIGNATURE reduce by rule 349 + SHARING reduce by rule 349 + INSTRUCTION reduce by rule 349 + VLIW reduce by rule 349 + SUPERSCALAR reduce by rule 349 + FUN reduce by rule 349 + VAL reduce by rule 349 + INCLUDE reduce by rule 349 + OPEN reduce by rule 349 + LITTLE reduce by rule 349 + BIG reduce by rule 349 + PIPELINE reduce by rule 349 + LOWERCASE reduce by rule 349 + UPPERCASE reduce by rule 349 + VERBATIM reduce by rule 349 + RTL reduce by rule 349 + NONFIX reduce by rule 349 + INFIX reduce by rule 349 + INFIXR reduce by rule 349 + DEBUG reduce by rule 349 + RESOURCE reduce by rule 349 + CPU reduce by rule 349 + LATENCY reduce by rule 349 + EXCEPTION reduce by rule 349 + EOF reduce by rule 349 + + + . error + + + state 342: + + funclause : apppat funguard return_ty . cont EQ typedexp + + EQ reduce by rule 337 + EXCEPTION shift 460 + + cont goto 459 + + . error + + + state 343: + + return_ty : COLON . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 461 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 344: + + funguard : WHERE LPAREN . typedexp RPAREN + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 462 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 345: + + consbinds : consbind BAR consbinds . (reduce by rule 143) + + ARCHITECTURE reduce by rule 143 + END reduce by rule 143 + LOCAL reduce by rule 143 + IN reduce by rule 143 + DATATYPE reduce by rule 143 + TYPE reduce by rule 143 + AND reduce by rule 143 + RPAREN reduce by rule 143 + SEMICOLON reduce by rule 143 + STORAGE reduce by rule 143 + LOCATIONS reduce by rule 143 + STRUCTURE reduce by rule 143 + FUNCTOR reduce by rule 143 + SIGNATURE reduce by rule 143 + SHARING reduce by rule 143 + INSTRUCTION reduce by rule 143 + VLIW reduce by rule 143 + SUPERSCALAR reduce by rule 143 + WITHTYPE reduce by rule 143 + FUN reduce by rule 143 + VAL reduce by rule 143 + INCLUDE reduce by rule 143 + OPEN reduce by rule 143 + LITTLE reduce by rule 143 + BIG reduce by rule 143 + PIPELINE reduce by rule 143 + LOWERCASE reduce by rule 143 + UPPERCASE reduce by rule 143 + VERBATIM reduce by rule 143 + RTL reduce by rule 143 + NONFIX reduce by rule 143 + INFIX reduce by rule 143 + INFIXR reduce by rule 143 + DEBUG reduce by rule 143 + RESOURCE reduce by rule 143 + CPU reduce by rule 143 + LATENCY reduce by rule 143 + EXCEPTION reduce by rule 143 + EOF reduce by rule 143 + + + . error + + + state 346: + + consassembly : asm_strings . (reduce by rule 184) + + ARCHITECTURE reduce by rule 184 + END reduce by rule 184 + LOCAL reduce by rule 184 + IN reduce by rule 184 + DATATYPE reduce by rule 184 + TYPE reduce by rule 184 + AND reduce by rule 184 + LPAREN reduce by rule 184 + RPAREN reduce by rule 184 + SEMICOLON reduce by rule 184 + CELLSET reduce by rule 184 + STORAGE reduce by rule 184 + LOCATIONS reduce by rule 184 + BAR reduce by rule 184 + STRUCTURE reduce by rule 184 + FUNCTOR reduce by rule 184 + SIGNATURE reduce by rule 184 + SHARING reduce by rule 184 + INSTRUCTION reduce by rule 184 + VLIW reduce by rule 184 + SUPERSCALAR reduce by rule 184 + WITHTYPE reduce by rule 184 + FUN reduce by rule 184 + VAL reduce by rule 184 + INCLUDE reduce by rule 184 + OPEN reduce by rule 184 + LITTLE reduce by rule 184 + BIG reduce by rule 184 + PIPELINE reduce by rule 184 + LOWERCASE reduce by rule 184 + UPPERCASE reduce by rule 184 + VERBATIM reduce by rule 184 + RTL reduce by rule 184 + SPAN reduce by rule 184 + DELAYSLOT reduce by rule 184 + NONFIX reduce by rule 184 + INFIX reduce by rule 184 + INFIXR reduce by rule 184 + DEBUG reduce by rule 184 + MC_COLON reduce by rule 184 + RTL_COLON reduce by rule 184 + DELAYSLOT_COLON reduce by rule 184 + NULLIFIED_COLON reduce by rule 184 + PADDING_COLON reduce by rule 184 + RESOURCE reduce by rule 184 + CPU reduce by rule 184 + LATENCY reduce by rule 184 + EXCEPTION reduce by rule 184 + ID reduce by rule 184 + SYMBOL reduce by rule 184 + WORD reduce by rule 184 + INT reduce by rule 184 + EOF reduce by rule 184 + + + . error + + + state 347: + + consbind : sym of_ty consassembly . consencoding rtl nop nullified delayslot delayslotcandidate sdi latency pipeline + + ARCHITECTURE reduce by rule 176 + END reduce by rule 176 + LOCAL reduce by rule 176 + IN reduce by rule 176 + DATATYPE reduce by rule 176 + TYPE reduce by rule 176 + AND reduce by rule 176 + LPAREN shift 469 + RPAREN reduce by rule 176 + SEMICOLON reduce by rule 176 + CELLSET shift 50 + STORAGE reduce by rule 176 + LOCATIONS reduce by rule 176 + BAR reduce by rule 176 + STRUCTURE reduce by rule 176 + FUNCTOR reduce by rule 176 + SIGNATURE reduce by rule 176 + SHARING reduce by rule 176 + INSTRUCTION reduce by rule 176 + VLIW reduce by rule 176 + SUPERSCALAR reduce by rule 176 + WITHTYPE reduce by rule 176 + FUN reduce by rule 176 + VAL reduce by rule 176 + INCLUDE reduce by rule 176 + OPEN reduce by rule 176 + LITTLE reduce by rule 176 + BIG reduce by rule 176 + PIPELINE reduce by rule 176 + LOWERCASE reduce by rule 176 + UPPERCASE reduce by rule 176 + VERBATIM reduce by rule 176 + RTL reduce by rule 176 + SPAN reduce by rule 176 + DELAYSLOT reduce by rule 176 + NONFIX reduce by rule 176 + INFIX reduce by rule 176 + INFIXR reduce by rule 176 + DEBUG reduce by rule 176 + MC_COLON shift 468 + RTL_COLON reduce by rule 176 + DELAYSLOT_COLON reduce by rule 176 + NULLIFIED_COLON reduce by rule 176 + PADDING_COLON reduce by rule 176 + RESOURCE reduce by rule 176 + CPU reduce by rule 176 + LATENCY reduce by rule 176 + EXCEPTION reduce by rule 176 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + EOF reduce by rule 176 + + id goto 467 + word goto 466 + unsignedint goto 465 + int goto 464 + consencoding goto 463 + + . error + + + state 348: + + consassembly : string . (reduce by rule 183) + + ARCHITECTURE reduce by rule 183 + END reduce by rule 183 + LOCAL reduce by rule 183 + IN reduce by rule 183 + DATATYPE reduce by rule 183 + TYPE reduce by rule 183 + AND reduce by rule 183 + LPAREN reduce by rule 183 + RPAREN reduce by rule 183 + SEMICOLON reduce by rule 183 + CELLSET reduce by rule 183 + STORAGE reduce by rule 183 + LOCATIONS reduce by rule 183 + BAR reduce by rule 183 + STRUCTURE reduce by rule 183 + FUNCTOR reduce by rule 183 + SIGNATURE reduce by rule 183 + SHARING reduce by rule 183 + INSTRUCTION reduce by rule 183 + VLIW reduce by rule 183 + SUPERSCALAR reduce by rule 183 + WITHTYPE reduce by rule 183 + FUN reduce by rule 183 + VAL reduce by rule 183 + INCLUDE reduce by rule 183 + OPEN reduce by rule 183 + LITTLE reduce by rule 183 + BIG reduce by rule 183 + PIPELINE reduce by rule 183 + LOWERCASE reduce by rule 183 + UPPERCASE reduce by rule 183 + VERBATIM reduce by rule 183 + RTL reduce by rule 183 + SPAN reduce by rule 183 + DELAYSLOT reduce by rule 183 + NONFIX reduce by rule 183 + INFIX reduce by rule 183 + INFIXR reduce by rule 183 + DEBUG reduce by rule 183 + MC_COLON reduce by rule 183 + RTL_COLON reduce by rule 183 + DELAYSLOT_COLON reduce by rule 183 + NULLIFIED_COLON reduce by rule 183 + PADDING_COLON reduce by rule 183 + RESOURCE reduce by rule 183 + CPU reduce by rule 183 + LATENCY reduce by rule 183 + EXCEPTION reduce by rule 183 + ID reduce by rule 183 + SYMBOL reduce by rule 183 + WORD reduce by rule 183 + INT reduce by rule 183 + EOF reduce by rule 183 + + + . error + + + state 349: + + consassembly : ASM_COLON . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 470 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 350: + + of_ty : OF ty . (reduce by rule 152) + ty : ty . ARROW ty + + ARCHITECTURE reduce by rule 152 + END reduce by rule 152 + LOCAL reduce by rule 152 + IN reduce by rule 152 + DATATYPE reduce by rule 152 + TYPE reduce by rule 152 + AND reduce by rule 152 + LPAREN reduce by rule 152 + RPAREN reduce by rule 152 + SEMICOLON reduce by rule 152 + LDQUOTE reduce by rule 152 + CELLSET reduce by rule 152 + STORAGE reduce by rule 152 + LOCATIONS reduce by rule 152 + BAR reduce by rule 152 + ARROW shift 388 + STRUCTURE reduce by rule 152 + FUNCTOR reduce by rule 152 + SIGNATURE reduce by rule 152 + SHARING reduce by rule 152 + INSTRUCTION reduce by rule 152 + VLIW reduce by rule 152 + SUPERSCALAR reduce by rule 152 + WITHTYPE reduce by rule 152 + FUN reduce by rule 152 + VAL reduce by rule 152 + INCLUDE reduce by rule 152 + OPEN reduce by rule 152 + LITTLE reduce by rule 152 + BIG reduce by rule 152 + PIPELINE reduce by rule 152 + LOWERCASE reduce by rule 152 + UPPERCASE reduce by rule 152 + VERBATIM reduce by rule 152 + RTL reduce by rule 152 + SPAN reduce by rule 152 + DELAYSLOT reduce by rule 152 + NONFIX reduce by rule 152 + INFIX reduce by rule 152 + INFIXR reduce by rule 152 + DEBUG reduce by rule 152 + ASM_COLON reduce by rule 152 + MC_COLON reduce by rule 152 + RTL_COLON reduce by rule 152 + DELAYSLOT_COLON reduce by rule 152 + NULLIFIED_COLON reduce by rule 152 + PADDING_COLON reduce by rule 152 + RESOURCE reduce by rule 152 + CPU reduce by rule 152 + LATENCY reduce by rule 152 + EXCEPTION reduce by rule 152 + ID reduce by rule 152 + SYMBOL reduce by rule 152 + WORD reduce by rule 152 + INT reduce by rule 152 + STRING reduce by rule 152 + EOF reduce by rule 152 + + + . error + + + state 351: + + formatbinds : formatbind BAR . formatbinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 225 + formatbind goto 223 + formatbinds goto 471 + + . error + + + state 352: + + mymddecl : INSTRUCTION FORMATS int BITS . formatbinds + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 225 + formatbind goto 223 + formatbinds goto 472 + + . error + + + state 353: + + formatbind : id opt_of . LBRACE fields RBRACE opt_exp + + LBRACE shift 473 + + + . error + + + state 354: + + opt_of : OF . (reduce by rule 193) + + LBRACE reduce by rule 193 + + + . error + + + state 355: + + sharingdecls : sharingdecl AND sharingdecls . (reduce by rule 100) + + ARCHITECTURE reduce by rule 100 + END reduce by rule 100 + LOCAL reduce by rule 100 + IN reduce by rule 100 + DATATYPE reduce by rule 100 + TYPE reduce by rule 100 + RPAREN reduce by rule 100 + SEMICOLON reduce by rule 100 + STORAGE reduce by rule 100 + LOCATIONS reduce by rule 100 + STRUCTURE reduce by rule 100 + FUNCTOR reduce by rule 100 + SIGNATURE reduce by rule 100 + SHARING reduce by rule 100 + INSTRUCTION reduce by rule 100 + VLIW reduce by rule 100 + SUPERSCALAR reduce by rule 100 + FUN reduce by rule 100 + VAL reduce by rule 100 + INCLUDE reduce by rule 100 + OPEN reduce by rule 100 + LITTLE reduce by rule 100 + BIG reduce by rule 100 + PIPELINE reduce by rule 100 + LOWERCASE reduce by rule 100 + UPPERCASE reduce by rule 100 + VERBATIM reduce by rule 100 + RTL reduce by rule 100 + NONFIX reduce by rule 100 + INFIX reduce by rule 100 + INFIXR reduce by rule 100 + DEBUG reduce by rule 100 + RESOURCE reduce by rule 100 + CPU reduce by rule 100 + LATENCY reduce by rule 100 + EXCEPTION reduce by rule 100 + EOF reduce by rule 100 + + + . error + + + state 356: + + sharelist : ident EQ sharelist . (reduce by rule 104) + + ARCHITECTURE reduce by rule 104 + END reduce by rule 104 + LOCAL reduce by rule 104 + IN reduce by rule 104 + DATATYPE reduce by rule 104 + TYPE reduce by rule 104 + AND reduce by rule 104 + RPAREN reduce by rule 104 + SEMICOLON reduce by rule 104 + STORAGE reduce by rule 104 + LOCATIONS reduce by rule 104 + STRUCTURE reduce by rule 104 + FUNCTOR reduce by rule 104 + SIGNATURE reduce by rule 104 + SHARING reduce by rule 104 + INSTRUCTION reduce by rule 104 + VLIW reduce by rule 104 + SUPERSCALAR reduce by rule 104 + FUN reduce by rule 104 + VAL reduce by rule 104 + INCLUDE reduce by rule 104 + OPEN reduce by rule 104 + LITTLE reduce by rule 104 + BIG reduce by rule 104 + PIPELINE reduce by rule 104 + LOWERCASE reduce by rule 104 + UPPERCASE reduce by rule 104 + VERBATIM reduce by rule 104 + RTL reduce by rule 104 + NONFIX reduce by rule 104 + INFIX reduce by rule 104 + INFIXR reduce by rule 104 + DEBUG reduce by rule 104 + RESOURCE reduce by rule 104 + CPU reduce by rule 104 + LATENCY reduce by rule 104 + EXCEPTION reduce by rule 104 + EOF reduce by rule 104 + + + . error + + + state 357: + + sharelist : ident . EQ ident + sharelist : ident EQ ident . (reduce by rule 103) + sharelist : ident . EQ sharelist + + ARCHITECTURE reduce by rule 103 + END reduce by rule 103 + LOCAL reduce by rule 103 + IN reduce by rule 103 + DATATYPE reduce by rule 103 + TYPE reduce by rule 103 + EQ shift 227 + AND reduce by rule 103 + RPAREN reduce by rule 103 + SEMICOLON reduce by rule 103 + STORAGE reduce by rule 103 + LOCATIONS reduce by rule 103 + STRUCTURE reduce by rule 103 + FUNCTOR reduce by rule 103 + SIGNATURE reduce by rule 103 + SHARING reduce by rule 103 + INSTRUCTION reduce by rule 103 + VLIW reduce by rule 103 + SUPERSCALAR reduce by rule 103 + FUN reduce by rule 103 + VAL reduce by rule 103 + INCLUDE reduce by rule 103 + OPEN reduce by rule 103 + LITTLE reduce by rule 103 + BIG reduce by rule 103 + PIPELINE reduce by rule 103 + LOWERCASE reduce by rule 103 + UPPERCASE reduce by rule 103 + VERBATIM reduce by rule 103 + RTL reduce by rule 103 + NONFIX reduce by rule 103 + INFIX reduce by rule 103 + INFIXR reduce by rule 103 + DEBUG reduce by rule 103 + RESOURCE reduce by rule 103 + CPU reduce by rule 103 + LATENCY reduce by rule 103 + EXCEPTION reduce by rule 103 + EOF reduce by rule 103 + + + . error + + + state 358: + + mymldecl : SIGNATURE id EQ sigexp . (reduce by rule 72) + sigexp : sigexp . WHERE sigsubs + + ARCHITECTURE reduce by rule 72 + END reduce by rule 72 + LOCAL reduce by rule 72 + IN reduce by rule 72 + DATATYPE reduce by rule 72 + TYPE reduce by rule 72 + RPAREN reduce by rule 72 + SEMICOLON reduce by rule 72 + STORAGE reduce by rule 72 + LOCATIONS reduce by rule 72 + STRUCTURE reduce by rule 72 + FUNCTOR reduce by rule 72 + SIGNATURE reduce by rule 72 + WHERE shift 206 + SHARING reduce by rule 72 + INSTRUCTION reduce by rule 72 + VLIW reduce by rule 72 + SUPERSCALAR reduce by rule 72 + FUN reduce by rule 72 + VAL reduce by rule 72 + INCLUDE reduce by rule 72 + OPEN reduce by rule 72 + LITTLE reduce by rule 72 + BIG reduce by rule 72 + PIPELINE reduce by rule 72 + LOWERCASE reduce by rule 72 + UPPERCASE reduce by rule 72 + VERBATIM reduce by rule 72 + RTL reduce by rule 72 + NONFIX reduce by rule 72 + INFIX reduce by rule 72 + INFIXR reduce by rule 72 + DEBUG reduce by rule 72 + RESOURCE reduce by rule 72 + CPU reduce by rule 72 + LATENCY reduce by rule 72 + EXCEPTION reduce by rule 72 + EOF reduce by rule 72 + + + . error + + + state 359: + + mymldecl : FUNCTOR id LPAREN functorarg . RPAREN EQ structexp + mymldecl : FUNCTOR id LPAREN functorarg . RPAREN sigcon EQ structexp + + RPAREN shift 474 + + + . error + + + state 360: + + functorarg : scopeddecls . (reduce by rule 88) + + RPAREN reduce by rule 88 + + + . error + + + state 361: + + functorarg : id . sigcon + + COLON shift 476 + COLONGREATER shift 233 + + sigcon goto 475 + + . error + + + state 362: + + structexp : ident . (reduce by rule 123) + + ARCHITECTURE reduce by rule 123 + END reduce by rule 123 + LOCAL reduce by rule 123 + IN reduce by rule 123 + DATATYPE reduce by rule 123 + TYPE reduce by rule 123 + EQ reduce by rule 123 + AND reduce by rule 123 + LPAREN reduce by rule 123 + RPAREN reduce by rule 123 + SEMICOLON reduce by rule 123 + STORAGE reduce by rule 123 + LOCATIONS reduce by rule 123 + STRUCTURE reduce by rule 123 + FUNCTOR reduce by rule 123 + SIGNATURE reduce by rule 123 + WHERE reduce by rule 123 + SHARING reduce by rule 123 + INSTRUCTION reduce by rule 123 + VLIW reduce by rule 123 + SUPERSCALAR reduce by rule 123 + FUN reduce by rule 123 + VAL reduce by rule 123 + INCLUDE reduce by rule 123 + OPEN reduce by rule 123 + LITTLE reduce by rule 123 + BIG reduce by rule 123 + PIPELINE reduce by rule 123 + LOWERCASE reduce by rule 123 + UPPERCASE reduce by rule 123 + VERBATIM reduce by rule 123 + RTL reduce by rule 123 + NONFIX reduce by rule 123 + INFIX reduce by rule 123 + INFIXR reduce by rule 123 + DEBUG reduce by rule 123 + RESOURCE reduce by rule 123 + CPU reduce by rule 123 + LATENCY reduce by rule 123 + EXCEPTION reduce by rule 123 + EOF reduce by rule 123 + + + . error + + + state 363: + + structexp : structexp . LPAREN scopeddecls RPAREN + structexp : structexp . LPAREN ident RPAREN + mymldecl : FUNCTOR id EQ structexp . (reduce by rule 75) + + ARCHITECTURE reduce by rule 75 + END reduce by rule 75 + LOCAL reduce by rule 75 + IN reduce by rule 75 + DATATYPE reduce by rule 75 + TYPE reduce by rule 75 + LPAREN shift 477 + RPAREN reduce by rule 75 + SEMICOLON reduce by rule 75 + STORAGE reduce by rule 75 + LOCATIONS reduce by rule 75 + STRUCTURE reduce by rule 75 + FUNCTOR reduce by rule 75 + SIGNATURE reduce by rule 75 + SHARING reduce by rule 75 + INSTRUCTION reduce by rule 75 + VLIW reduce by rule 75 + SUPERSCALAR reduce by rule 75 + FUN reduce by rule 75 + VAL reduce by rule 75 + INCLUDE reduce by rule 75 + OPEN reduce by rule 75 + LITTLE reduce by rule 75 + BIG reduce by rule 75 + PIPELINE reduce by rule 75 + LOWERCASE reduce by rule 75 + UPPERCASE reduce by rule 75 + VERBATIM reduce by rule 75 + RTL reduce by rule 75 + NONFIX reduce by rule 75 + INFIX reduce by rule 75 + INFIXR reduce by rule 75 + DEBUG reduce by rule 75 + RESOURCE reduce by rule 75 + CPU reduce by rule 75 + LATENCY reduce by rule 75 + EXCEPTION reduce by rule 75 + EOF reduce by rule 75 + + + . error + + + state 364: + + structexp : STRUCT . scopeddecls END + + ARCHITECTURE reduce by rule 107 + END reduce by rule 107 + LOCAL reduce by rule 107 + DATATYPE reduce by rule 107 + TYPE reduce by rule 107 + STORAGE reduce by rule 107 + LOCATIONS reduce by rule 107 + STRUCTURE reduce by rule 107 + FUNCTOR reduce by rule 107 + SIGNATURE reduce by rule 107 + SHARING reduce by rule 107 + INSTRUCTION reduce by rule 107 + VLIW reduce by rule 107 + SUPERSCALAR reduce by rule 107 + FUN reduce by rule 107 + VAL reduce by rule 107 + INCLUDE reduce by rule 107 + OPEN reduce by rule 107 + LITTLE reduce by rule 107 + BIG reduce by rule 107 + PIPELINE reduce by rule 107 + LOWERCASE reduce by rule 107 + UPPERCASE reduce by rule 107 + VERBATIM reduce by rule 107 + RTL reduce by rule 107 + NONFIX reduce by rule 107 + INFIX reduce by rule 107 + INFIXR reduce by rule 107 + DEBUG reduce by rule 107 + RESOURCE reduce by rule 107 + CPU reduce by rule 107 + LATENCY reduce by rule 107 + EXCEPTION reduce by rule 107 + + scopeddecls goto 478 + newScope goto 164 + + . error + + + state 365: + + mymldecl : STRUCTURE id sigcon EQ . structexp + + CELLSET shift 50 + STRUCT shift 364 + ID shift 49 + SYMBOL shift 48 + + structexp goto 479 + id goto 114 + ident goto 362 + ident2 goto 112 + path goto 85 + + . error + + + state 366: + + sigcon : COLONGREATER sigexp . (reduce by rule 94) + sigexp : sigexp . WHERE sigsubs + + EQ reduce by rule 94 + RPAREN reduce by rule 94 + WHERE shift 206 + + + . error + + + state 367: + + sigcon : COLON sigexp . (reduce by rule 93) + mymldecl : STRUCTURE id COLON sigexp . (reduce by rule 71) + sigexp : sigexp . WHERE sigsubs + + ARCHITECTURE reduce by rule 71 + END reduce by rule 71 + LOCAL reduce by rule 71 + IN reduce by rule 71 + DATATYPE reduce by rule 71 + TYPE reduce by rule 71 + EQ reduce by rule 93 + RPAREN reduce by rule 71 + SEMICOLON reduce by rule 71 + STORAGE reduce by rule 71 + LOCATIONS reduce by rule 71 + STRUCTURE reduce by rule 71 + FUNCTOR reduce by rule 71 + SIGNATURE reduce by rule 71 + WHERE shift 206 + SHARING reduce by rule 71 + INSTRUCTION reduce by rule 71 + VLIW reduce by rule 71 + SUPERSCALAR reduce by rule 71 + FUN reduce by rule 71 + VAL reduce by rule 71 + INCLUDE reduce by rule 71 + OPEN reduce by rule 71 + LITTLE reduce by rule 71 + BIG reduce by rule 71 + PIPELINE reduce by rule 71 + LOWERCASE reduce by rule 71 + UPPERCASE reduce by rule 71 + VERBATIM reduce by rule 71 + RTL reduce by rule 71 + NONFIX reduce by rule 71 + INFIX reduce by rule 71 + INFIXR reduce by rule 71 + DEBUG reduce by rule 71 + RESOURCE reduce by rule 71 + CPU reduce by rule 71 + LATENCY reduce by rule 71 + EXCEPTION reduce by rule 71 + EOF reduce by rule 71 + + + . error + + + state 368: + + structexp : structexp . LPAREN scopeddecls RPAREN + structexp : structexp . LPAREN ident RPAREN + mymldecl : STRUCTURE id EQ structexp . (reduce by rule 69) + + ARCHITECTURE reduce by rule 69 + END reduce by rule 69 + LOCAL reduce by rule 69 + IN reduce by rule 69 + DATATYPE reduce by rule 69 + TYPE reduce by rule 69 + LPAREN shift 477 + RPAREN reduce by rule 69 + SEMICOLON reduce by rule 69 + STORAGE reduce by rule 69 + LOCATIONS reduce by rule 69 + STRUCTURE reduce by rule 69 + FUNCTOR reduce by rule 69 + SIGNATURE reduce by rule 69 + SHARING reduce by rule 69 + INSTRUCTION reduce by rule 69 + VLIW reduce by rule 69 + SUPERSCALAR reduce by rule 69 + FUN reduce by rule 69 + VAL reduce by rule 69 + INCLUDE reduce by rule 69 + OPEN reduce by rule 69 + LITTLE reduce by rule 69 + BIG reduce by rule 69 + PIPELINE reduce by rule 69 + LOWERCASE reduce by rule 69 + UPPERCASE reduce by rule 69 + VERBATIM reduce by rule 69 + RTL reduce by rule 69 + NONFIX reduce by rule 69 + INFIX reduce by rule 69 + INFIXR reduce by rule 69 + DEBUG reduce by rule 69 + RESOURCE reduce by rule 69 + CPU reduce by rule 69 + LATENCY reduce by rule 69 + EXCEPTION reduce by rule 69 + EOF reduce by rule 69 + + + . error + + + state 369: + + locbinds : locbind AND locbinds . (reduce by rule 393) + + ARCHITECTURE reduce by rule 393 + END reduce by rule 393 + LOCAL reduce by rule 393 + IN reduce by rule 393 + DATATYPE reduce by rule 393 + TYPE reduce by rule 393 + RPAREN reduce by rule 393 + SEMICOLON reduce by rule 393 + STORAGE reduce by rule 393 + LOCATIONS reduce by rule 393 + STRUCTURE reduce by rule 393 + FUNCTOR reduce by rule 393 + SIGNATURE reduce by rule 393 + SHARING reduce by rule 393 + INSTRUCTION reduce by rule 393 + VLIW reduce by rule 393 + SUPERSCALAR reduce by rule 393 + FUN reduce by rule 393 + VAL reduce by rule 393 + INCLUDE reduce by rule 393 + OPEN reduce by rule 393 + LITTLE reduce by rule 393 + BIG reduce by rule 393 + PIPELINE reduce by rule 393 + LOWERCASE reduce by rule 393 + UPPERCASE reduce by rule 393 + VERBATIM reduce by rule 393 + RTL reduce by rule 393 + NONFIX reduce by rule 393 + INFIX reduce by rule 393 + INFIXR reduce by rule 393 + DEBUG reduce by rule 393 + RESOURCE reduce by rule 393 + CPU reduce by rule 393 + LATENCY reduce by rule 393 + EXCEPTION reduce by rule 393 + EOF reduce by rule 393 + + + . error + + + state 370: + + locbind : id pat EQ . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 480 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 371: + + exp : exp . HANDLE clauses + locbind : id EQ exp . (reduce by rule 390) + + ARCHITECTURE reduce by rule 390 + END reduce by rule 390 + LOCAL reduce by rule 390 + IN reduce by rule 390 + DATATYPE reduce by rule 390 + TYPE reduce by rule 390 + AND reduce by rule 390 + RPAREN reduce by rule 390 + SEMICOLON reduce by rule 390 + STORAGE reduce by rule 390 + LOCATIONS reduce by rule 390 + HANDLE shift 402 + STRUCTURE reduce by rule 390 + FUNCTOR reduce by rule 390 + SIGNATURE reduce by rule 390 + SHARING reduce by rule 390 + INSTRUCTION reduce by rule 390 + VLIW reduce by rule 390 + SUPERSCALAR reduce by rule 390 + FUN reduce by rule 390 + VAL reduce by rule 390 + INCLUDE reduce by rule 390 + OPEN reduce by rule 390 + LITTLE reduce by rule 390 + BIG reduce by rule 390 + PIPELINE reduce by rule 390 + LOWERCASE reduce by rule 390 + UPPERCASE reduce by rule 390 + VERBATIM reduce by rule 390 + RTL reduce by rule 390 + NONFIX reduce by rule 390 + INFIX reduce by rule 390 + INFIXR reduce by rule 390 + DEBUG reduce by rule 390 + RESOURCE reduce by rule 390 + CPU reduce by rule 390 + LATENCY reduce by rule 390 + EXCEPTION reduce by rule 390 + EOF reduce by rule 390 + + + . error + + + state 372: + + storagedecls : storagedecl BAR storagedecls . (reduce by rule 382) + + ARCHITECTURE reduce by rule 382 + END reduce by rule 382 + LOCAL reduce by rule 382 + IN reduce by rule 382 + DATATYPE reduce by rule 382 + TYPE reduce by rule 382 + RPAREN reduce by rule 382 + SEMICOLON reduce by rule 382 + STORAGE reduce by rule 382 + LOCATIONS reduce by rule 382 + STRUCTURE reduce by rule 382 + FUNCTOR reduce by rule 382 + SIGNATURE reduce by rule 382 + SHARING reduce by rule 382 + INSTRUCTION reduce by rule 382 + VLIW reduce by rule 382 + SUPERSCALAR reduce by rule 382 + FUN reduce by rule 382 + VAL reduce by rule 382 + INCLUDE reduce by rule 382 + OPEN reduce by rule 382 + LITTLE reduce by rule 382 + BIG reduce by rule 382 + PIPELINE reduce by rule 382 + LOWERCASE reduce by rule 382 + UPPERCASE reduce by rule 382 + VERBATIM reduce by rule 382 + RTL reduce by rule 382 + NONFIX reduce by rule 382 + INFIX reduce by rule 382 + INFIXR reduce by rule 382 + DEBUG reduce by rule 382 + RESOURCE reduce by rule 382 + CPU reduce by rule 382 + LATENCY reduce by rule 382 + EXCEPTION reduce by rule 382 + EOF reduce by rule 382 + + + . error + + + state 373: + + storagedecl : id EQ DOLLAR . id LBRACKET cellcount RBRACKET bitSize aliasing defaults printcell + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 481 + + . error + + + state 374: + + typebind : tyvarseq tid EQ . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 482 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 375: + + typebind : tyvarseq . tid EQ ty + + CELLSET shift 50 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + + id goto 243 + tid goto 483 + tid2 goto 241 + + . error + + + state 376: + + typebinds : typebind AND typebinds . (reduce by rule 197) + + ARCHITECTURE reduce by rule 197 + END reduce by rule 197 + LOCAL reduce by rule 197 + IN reduce by rule 197 + DATATYPE reduce by rule 197 + TYPE reduce by rule 197 + RPAREN reduce by rule 197 + SEMICOLON reduce by rule 197 + STORAGE reduce by rule 197 + LOCATIONS reduce by rule 197 + STRUCTURE reduce by rule 197 + FUNCTOR reduce by rule 197 + SIGNATURE reduce by rule 197 + SHARING reduce by rule 197 + INSTRUCTION reduce by rule 197 + VLIW reduce by rule 197 + SUPERSCALAR reduce by rule 197 + FUN reduce by rule 197 + VAL reduce by rule 197 + INCLUDE reduce by rule 197 + OPEN reduce by rule 197 + LITTLE reduce by rule 197 + BIG reduce by rule 197 + PIPELINE reduce by rule 197 + LOWERCASE reduce by rule 197 + UPPERCASE reduce by rule 197 + VERBATIM reduce by rule 197 + RTL reduce by rule 197 + NONFIX reduce by rule 197 + INFIX reduce by rule 197 + INFIXR reduce by rule 197 + DEBUG reduce by rule 197 + RESOURCE reduce by rule 197 + CPU reduce by rule 197 + LATENCY reduce by rule 197 + EXCEPTION reduce by rule 197 + EOF reduce by rule 197 + + + . error + + + state 377: + + tyvarseq : LPAREN tyvars RPAREN . (reduce by rule 201) + + CELLSET reduce by rule 201 + BITS reduce by rule 201 + INSTRUCTION reduce by rule 201 + CELL reduce by rule 201 + ID reduce by rule 201 + SYMBOL reduce by rule 201 + + + . error + + + state 378: + + tyvars : tyvar COMMA . tyvars + + HASH shift 159 + TYVAR shift 158 + + tyvar goto 250 + tyvars goto 484 + + . error + + + state 379: + + datatypebind : tyvarseq id opcodeencoding . fieldty hasasm EQ consbinds + datatypebind : tyvarseq id opcodeencoding . fieldty hasasm EQ DATATYPE ty + + EQ reduce by rule 133 + DEREF reduce by rule 133 + COLON shift 486 + + fieldty goto 485 + + . error + + + state 380: + + opcodeencoding : LBRACKET . encodingexps RBRACKET + + INT shift 64 + + int goto 489 + encodingexp goto 488 + encodingexps goto 487 + + . error + + + state 381: + + datatypebinds : datatypebind AND datatypebinds . (reduce by rule 128) + + ARCHITECTURE reduce by rule 128 + END reduce by rule 128 + LOCAL reduce by rule 128 + IN reduce by rule 128 + DATATYPE reduce by rule 128 + TYPE reduce by rule 128 + RPAREN reduce by rule 128 + SEMICOLON reduce by rule 128 + STORAGE reduce by rule 128 + LOCATIONS reduce by rule 128 + STRUCTURE reduce by rule 128 + FUNCTOR reduce by rule 128 + SIGNATURE reduce by rule 128 + SHARING reduce by rule 128 + INSTRUCTION reduce by rule 128 + VLIW reduce by rule 128 + SUPERSCALAR reduce by rule 128 + WITHTYPE reduce by rule 128 + FUN reduce by rule 128 + VAL reduce by rule 128 + INCLUDE reduce by rule 128 + OPEN reduce by rule 128 + LITTLE reduce by rule 128 + BIG reduce by rule 128 + PIPELINE reduce by rule 128 + LOWERCASE reduce by rule 128 + UPPERCASE reduce by rule 128 + VERBATIM reduce by rule 128 + RTL reduce by rule 128 + NONFIX reduce by rule 128 + INFIX reduce by rule 128 + INFIXR reduce by rule 128 + DEBUG reduce by rule 128 + RESOURCE reduce by rule 128 + CPU reduce by rule 128 + LATENCY reduce by rule 128 + EXCEPTION reduce by rule 128 + EOF reduce by rule 128 + + + . error + + + state 382: + + withtypeclause : WITHTYPE typebinds . (reduce by rule 195) + + ARCHITECTURE reduce by rule 195 + END reduce by rule 195 + LOCAL reduce by rule 195 + IN reduce by rule 195 + DATATYPE reduce by rule 195 + TYPE reduce by rule 195 + RPAREN reduce by rule 195 + SEMICOLON reduce by rule 195 + STORAGE reduce by rule 195 + LOCATIONS reduce by rule 195 + STRUCTURE reduce by rule 195 + FUNCTOR reduce by rule 195 + SIGNATURE reduce by rule 195 + SHARING reduce by rule 195 + INSTRUCTION reduce by rule 195 + VLIW reduce by rule 195 + SUPERSCALAR reduce by rule 195 + FUN reduce by rule 195 + VAL reduce by rule 195 + INCLUDE reduce by rule 195 + OPEN reduce by rule 195 + LITTLE reduce by rule 195 + BIG reduce by rule 195 + PIPELINE reduce by rule 195 + LOWERCASE reduce by rule 195 + UPPERCASE reduce by rule 195 + VERBATIM reduce by rule 195 + RTL reduce by rule 195 + NONFIX reduce by rule 195 + INFIX reduce by rule 195 + INFIXR reduce by rule 195 + DEBUG reduce by rule 195 + RESOURCE reduce by rule 195 + CPU reduce by rule 195 + LATENCY reduce by rule 195 + EXCEPTION reduce by rule 195 + EOF reduce by rule 195 + + + . error + + + state 383: + + scopeddecls : newScope decls oldScope . (reduce by rule 106) + + END reduce by rule 106 + IN reduce by rule 106 + RPAREN reduce by rule 106 + + + . error + + + state 384: + + mymldecl : LOCAL scopeddecls IN scopeddecls . END + + END shift 490 + + + . error + + + state 385: + + mymddecl : ARCHITECTURE id EQ STRUCT . decls END + + ARCHITECTURE shift 39 + END reduce by rule 1 + LOCAL shift 38 + DATATYPE shift 37 + TYPE shift 36 + STORAGE shift 35 + LOCATIONS shift 34 + STRUCTURE shift 33 + FUNCTOR shift 32 + SIGNATURE shift 31 + SHARING shift 30 + INSTRUCTION shift 29 + VLIW shift 28 + SUPERSCALAR shift 27 + FUN shift 26 + VAL shift 25 + INCLUDE shift 24 + OPEN shift 23 + LITTLE shift 22 + BIG shift 21 + PIPELINE shift 20 + LOWERCASE shift 19 + UPPERCASE shift 18 + VERBATIM shift 17 + RTL shift 16 + NONFIX shift 15 + INFIX shift 14 + INFIXR shift 13 + DEBUG shift 12 + RESOURCE shift 11 + CPU shift 10 + LATENCY shift 9 + EXCEPTION shift 8 + + decls goto 491 + decl goto 6 + mldecl goto 5 + mymldecl goto 4 + mddecl goto 3 + mymddecl goto 2 + assemblycase goto 1 + + . error + + + state 386: + + appty : appty tident . (reduce by rule 358) + + ARCHITECTURE reduce by rule 358 + END reduce by rule 358 + LOCAL reduce by rule 358 + IN reduce by rule 358 + OF reduce by rule 358 + DATATYPE reduce by rule 358 + TYPE reduce by rule 358 + EQ reduce by rule 358 + TIMES reduce by rule 358 + AND reduce by rule 358 + LPAREN reduce by rule 358 + RPAREN reduce by rule 358 + RBRACKET reduce by rule 358 + RBRACE reduce by rule 358 + SEMICOLON reduce by rule 358 + LDQUOTE reduce by rule 358 + CELLSET reduce by rule 358 + STORAGE reduce by rule 358 + LOCATIONS reduce by rule 358 + COMMA reduce by rule 358 + COLON reduce by rule 358 + BAR reduce by rule 358 + ARROW reduce by rule 358 + DARROW reduce by rule 358 + BITS reduce by rule 358 + THEN reduce by rule 358 + ELSE reduce by rule 358 + STRUCTURE reduce by rule 358 + FUNCTOR reduce by rule 358 + SIGNATURE reduce by rule 358 + WHERE reduce by rule 358 + SHARING reduce by rule 358 + INSTRUCTION reduce by rule 358 + CELL reduce by rule 358 + VLIW reduce by rule 358 + SUPERSCALAR reduce by rule 358 + WITHTYPE reduce by rule 358 + FUN reduce by rule 358 + VAL reduce by rule 358 + INCLUDE reduce by rule 358 + OPEN reduce by rule 358 + LITTLE reduce by rule 358 + BIG reduce by rule 358 + PIPELINE reduce by rule 358 + LOWERCASE reduce by rule 358 + UPPERCASE reduce by rule 358 + VERBATIM reduce by rule 358 + RTL reduce by rule 358 + SPAN reduce by rule 358 + DELAYSLOT reduce by rule 358 + NONFIX reduce by rule 358 + INFIX reduce by rule 358 + INFIXR reduce by rule 358 + DEBUG reduce by rule 358 + ASM_COLON reduce by rule 358 + MC_COLON reduce by rule 358 + RTL_COLON reduce by rule 358 + DELAYSLOT_COLON reduce by rule 358 + NULLIFIED_COLON reduce by rule 358 + PADDING_COLON reduce by rule 358 + RESOURCE reduce by rule 358 + CPU reduce by rule 358 + LATENCY reduce by rule 358 + EXCEPTION reduce by rule 358 + ID reduce by rule 358 + SYMBOL reduce by rule 358 + WORD reduce by rule 358 + INT reduce by rule 358 + STRING reduce by rule 358 + EOF reduce by rule 358 + + + . error + + + state 387: + + tuplety : appty TIMES . appty + tuplety : appty TIMES . tuplety + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + aty goto 263 + appty goto 493 + tuplety goto 492 + tyvar goto 260 + + . error + + + state 388: + + ty : ty ARROW . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 494 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 389: + + tpath : tpath DOT . tid + + CELLSET shift 50 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + + id goto 243 + tid goto 495 + tid2 goto 241 + + . error + + + state 390: + + tpath : tid DOT . tid + + CELLSET shift 50 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + + id goto 243 + tid goto 496 + tid2 goto 241 + + . error + + + state 391: + + aty : HASH int . (reduce by rule 351) + + ARCHITECTURE reduce by rule 351 + END reduce by rule 351 + LOCAL reduce by rule 351 + IN reduce by rule 351 + OF reduce by rule 351 + DATATYPE reduce by rule 351 + TYPE reduce by rule 351 + EQ reduce by rule 351 + TIMES reduce by rule 351 + AND reduce by rule 351 + LPAREN reduce by rule 351 + RPAREN reduce by rule 351 + RBRACKET reduce by rule 351 + RBRACE reduce by rule 351 + SEMICOLON reduce by rule 351 + LDQUOTE reduce by rule 351 + CELLSET reduce by rule 351 + STORAGE reduce by rule 351 + LOCATIONS reduce by rule 351 + COMMA reduce by rule 351 + COLON reduce by rule 351 + BAR reduce by rule 351 + ARROW reduce by rule 351 + DARROW reduce by rule 351 + BITS reduce by rule 351 + THEN reduce by rule 351 + ELSE reduce by rule 351 + STRUCTURE reduce by rule 351 + FUNCTOR reduce by rule 351 + SIGNATURE reduce by rule 351 + WHERE reduce by rule 351 + SHARING reduce by rule 351 + INSTRUCTION reduce by rule 351 + CELL reduce by rule 351 + VLIW reduce by rule 351 + SUPERSCALAR reduce by rule 351 + WITHTYPE reduce by rule 351 + FUN reduce by rule 351 + VAL reduce by rule 351 + INCLUDE reduce by rule 351 + OPEN reduce by rule 351 + LITTLE reduce by rule 351 + BIG reduce by rule 351 + PIPELINE reduce by rule 351 + LOWERCASE reduce by rule 351 + UPPERCASE reduce by rule 351 + VERBATIM reduce by rule 351 + RTL reduce by rule 351 + SPAN reduce by rule 351 + DELAYSLOT reduce by rule 351 + NONFIX reduce by rule 351 + INFIX reduce by rule 351 + INFIXR reduce by rule 351 + DEBUG reduce by rule 351 + ASM_COLON reduce by rule 351 + MC_COLON reduce by rule 351 + RTL_COLON reduce by rule 351 + DELAYSLOT_COLON reduce by rule 351 + NULLIFIED_COLON reduce by rule 351 + PADDING_COLON reduce by rule 351 + RESOURCE reduce by rule 351 + CPU reduce by rule 351 + LATENCY reduce by rule 351 + EXCEPTION reduce by rule 351 + ID reduce by rule 351 + SYMBOL reduce by rule 351 + WORD reduce by rule 351 + INT reduce by rule 351 + STRING reduce by rule 351 + EOF reduce by rule 351 + + + . error + + + state 392: + + labtys : labtys1 . (reduce by rule 375) + + RBRACE reduce by rule 375 + + + . error + + + state 393: + + aty : LBRACE labtys . RBRACE + + RBRACE shift 497 + + + . error + + + state 394: + + labtys1 : labty . (reduce by rule 376) + labtys1 : labty . COMMA labtys1 + + RBRACE reduce by rule 376 + COMMA shift 498 + + + . error + + + state 395: + + labty : id . COLON ty + + COLON shift 499 + + + . error + + + state 396: + + appty : LPAREN tys2 . RPAREN tident + + RPAREN shift 500 + + + . error + + + state 397: + + ty : ty . ARROW ty + aty : LPAREN ty . RPAREN + tys2 : ty . COMMA ty + tys2 : ty . COMMA tys2 + + RPAREN shift 502 + COMMA shift 501 + ARROW shift 388 + + + . error + + + state 398: + + aty : LPAREN RPAREN . (reduce by rule 354) + + ARCHITECTURE reduce by rule 354 + END reduce by rule 354 + LOCAL reduce by rule 354 + IN reduce by rule 354 + OF reduce by rule 354 + DATATYPE reduce by rule 354 + TYPE reduce by rule 354 + EQ reduce by rule 354 + TIMES reduce by rule 354 + AND reduce by rule 354 + LPAREN reduce by rule 354 + RPAREN reduce by rule 354 + RBRACKET reduce by rule 354 + RBRACE reduce by rule 354 + SEMICOLON reduce by rule 354 + LDQUOTE reduce by rule 354 + CELLSET reduce by rule 354 + STORAGE reduce by rule 354 + LOCATIONS reduce by rule 354 + COMMA reduce by rule 354 + COLON reduce by rule 354 + BAR reduce by rule 354 + ARROW reduce by rule 354 + DARROW reduce by rule 354 + BITS reduce by rule 354 + THEN reduce by rule 354 + ELSE reduce by rule 354 + STRUCTURE reduce by rule 354 + FUNCTOR reduce by rule 354 + SIGNATURE reduce by rule 354 + WHERE reduce by rule 354 + SHARING reduce by rule 354 + INSTRUCTION reduce by rule 354 + CELL reduce by rule 354 + VLIW reduce by rule 354 + SUPERSCALAR reduce by rule 354 + WITHTYPE reduce by rule 354 + FUN reduce by rule 354 + VAL reduce by rule 354 + INCLUDE reduce by rule 354 + OPEN reduce by rule 354 + LITTLE reduce by rule 354 + BIG reduce by rule 354 + PIPELINE reduce by rule 354 + LOWERCASE reduce by rule 354 + UPPERCASE reduce by rule 354 + VERBATIM reduce by rule 354 + RTL reduce by rule 354 + SPAN reduce by rule 354 + DELAYSLOT reduce by rule 354 + NONFIX reduce by rule 354 + INFIX reduce by rule 354 + INFIXR reduce by rule 354 + DEBUG reduce by rule 354 + ASM_COLON reduce by rule 354 + MC_COLON reduce by rule 354 + RTL_COLON reduce by rule 354 + DELAYSLOT_COLON reduce by rule 354 + NULLIFIED_COLON reduce by rule 354 + PADDING_COLON reduce by rule 354 + RESOURCE reduce by rule 354 + CPU reduce by rule 354 + LATENCY reduce by rule 354 + EXCEPTION reduce by rule 354 + ID reduce by rule 354 + SYMBOL reduce by rule 354 + WORD reduce by rule 354 + INT reduce by rule 354 + STRING reduce by rule 354 + EOF reduce by rule 354 + + + . error + + + state 399: + + aty : DOLLAR id . (reduce by rule 353) + + ARCHITECTURE reduce by rule 353 + END reduce by rule 353 + LOCAL reduce by rule 353 + IN reduce by rule 353 + OF reduce by rule 353 + DATATYPE reduce by rule 353 + TYPE reduce by rule 353 + EQ reduce by rule 353 + TIMES reduce by rule 353 + AND reduce by rule 353 + LPAREN reduce by rule 353 + RPAREN reduce by rule 353 + RBRACKET reduce by rule 353 + RBRACE reduce by rule 353 + SEMICOLON reduce by rule 353 + LDQUOTE reduce by rule 353 + CELLSET reduce by rule 353 + STORAGE reduce by rule 353 + LOCATIONS reduce by rule 353 + COMMA reduce by rule 353 + COLON reduce by rule 353 + BAR reduce by rule 353 + ARROW reduce by rule 353 + DARROW reduce by rule 353 + BITS reduce by rule 353 + THEN reduce by rule 353 + ELSE reduce by rule 353 + STRUCTURE reduce by rule 353 + FUNCTOR reduce by rule 353 + SIGNATURE reduce by rule 353 + WHERE reduce by rule 353 + SHARING reduce by rule 353 + INSTRUCTION reduce by rule 353 + CELL reduce by rule 353 + VLIW reduce by rule 353 + SUPERSCALAR reduce by rule 353 + WITHTYPE reduce by rule 353 + FUN reduce by rule 353 + VAL reduce by rule 353 + INCLUDE reduce by rule 353 + OPEN reduce by rule 353 + LITTLE reduce by rule 353 + BIG reduce by rule 353 + PIPELINE reduce by rule 353 + LOWERCASE reduce by rule 353 + UPPERCASE reduce by rule 353 + VERBATIM reduce by rule 353 + RTL reduce by rule 353 + SPAN reduce by rule 353 + DELAYSLOT reduce by rule 353 + NONFIX reduce by rule 353 + INFIX reduce by rule 353 + INFIXR reduce by rule 353 + DEBUG reduce by rule 353 + ASM_COLON reduce by rule 353 + MC_COLON reduce by rule 353 + RTL_COLON reduce by rule 353 + DELAYSLOT_COLON reduce by rule 353 + NULLIFIED_COLON reduce by rule 353 + PADDING_COLON reduce by rule 353 + RESOURCE reduce by rule 353 + CPU reduce by rule 353 + LATENCY reduce by rule 353 + EXCEPTION reduce by rule 353 + ID reduce by rule 353 + SYMBOL reduce by rule 353 + WORD reduce by rule 353 + INT reduce by rule 353 + STRING reduce by rule 353 + EOF reduce by rule 353 + + + . error + + + state 400: + + exp : exp . HANDLE clauses + latencyclause : id pat EQ exp . (reduce by rule 58) + + ARCHITECTURE reduce by rule 58 + END reduce by rule 58 + LOCAL reduce by rule 58 + IN reduce by rule 58 + DATATYPE reduce by rule 58 + TYPE reduce by rule 58 + AND reduce by rule 58 + RPAREN reduce by rule 58 + SEMICOLON reduce by rule 58 + STORAGE reduce by rule 58 + LOCATIONS reduce by rule 58 + BAR reduce by rule 58 + HANDLE shift 402 + STRUCTURE reduce by rule 58 + FUNCTOR reduce by rule 58 + SIGNATURE reduce by rule 58 + SHARING reduce by rule 58 + INSTRUCTION reduce by rule 58 + VLIW reduce by rule 58 + SUPERSCALAR reduce by rule 58 + FUN reduce by rule 58 + VAL reduce by rule 58 + INCLUDE reduce by rule 58 + OPEN reduce by rule 58 + LITTLE reduce by rule 58 + BIG reduce by rule 58 + PIPELINE reduce by rule 58 + LOWERCASE reduce by rule 58 + UPPERCASE reduce by rule 58 + VERBATIM reduce by rule 58 + RTL reduce by rule 58 + NONFIX reduce by rule 58 + INFIX reduce by rule 58 + INFIXR reduce by rule 58 + DEBUG reduce by rule 58 + RESOURCE reduce by rule 58 + CPU reduce by rule 58 + LATENCY reduce by rule 58 + EXCEPTION reduce by rule 58 + EOF reduce by rule 58 + + + . error + + + state 401: + + cpubind : id aliases int LBRACKET . resources RBRACKET + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + INT shift 64 + + id goto 506 + int goto 505 + resources goto 504 + resource goto 503 + + . error + + + state 402: + + exp : exp HANDLE . clauses + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 413 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + clause goto 412 + clauses goto 507 + True goto 74 + False goto 73 + + . error + + + state 403: + + aexp2 : aexp2 . AT LBRACKET slices RBRACKET + appexp : appexp aexp2 . (reduce by rule 273) + + ARCHITECTURE reduce by rule 273 + END reduce by rule 273 + LOCAL reduce by rule 273 + IN reduce by rule 273 + OF reduce by rule 273 + DATATYPE reduce by rule 273 + TYPE reduce by rule 273 + EQ reduce by rule 273 + DOLLAR reduce by rule 273 + TIMES reduce by rule 273 + AND reduce by rule 273 + DEREF reduce by rule 273 + NOT reduce by rule 273 + LLBRACKET reduce by rule 273 + LHASHBRACKET reduce by rule 273 + LPAREN reduce by rule 273 + RPAREN reduce by rule 273 + LBRACKET reduce by rule 273 + RBRACKET reduce by rule 273 + LBRACE reduce by rule 273 + RBRACE reduce by rule 273 + SEMICOLON reduce by rule 273 + LDQUOTE reduce by rule 273 + RMETA reduce by rule 273 + CELLSET reduce by rule 273 + STORAGE reduce by rule 273 + LOCATIONS reduce by rule 273 + HASH reduce by rule 273 + COMMA reduce by rule 273 + COLON reduce by rule 273 + AT shift 404 + BAR reduce by rule 273 + DARROW reduce by rule 273 + THEN reduce by rule 273 + ELSE reduce by rule 273 + TRUE reduce by rule 273 + FALSE reduce by rule 273 + HANDLE reduce by rule 273 + LET reduce by rule 273 + STRUCTURE reduce by rule 273 + FUNCTOR reduce by rule 273 + SIGNATURE reduce by rule 273 + SHARING reduce by rule 273 + INSTRUCTION reduce by rule 273 + VLIW reduce by rule 273 + SUPERSCALAR reduce by rule 273 + WITHTYPE reduce by rule 273 + FUN reduce by rule 273 + VAL reduce by rule 273 + INCLUDE reduce by rule 273 + OPEN reduce by rule 273 + OP reduce by rule 273 + LITTLE reduce by rule 273 + BIG reduce by rule 273 + PIPELINE reduce by rule 273 + LOWERCASE reduce by rule 273 + UPPERCASE reduce by rule 273 + VERBATIM reduce by rule 273 + RTL reduce by rule 273 + SPAN reduce by rule 273 + DELAYSLOT reduce by rule 273 + ALWAYS reduce by rule 273 + NEVER reduce by rule 273 + NONFIX reduce by rule 273 + INFIX reduce by rule 273 + INFIXR reduce by rule 273 + DEBUG reduce by rule 273 + ASM_COLON reduce by rule 273 + MC_COLON reduce by rule 273 + RTL_COLON reduce by rule 273 + DELAYSLOT_COLON reduce by rule 273 + NULLIFIED_COLON reduce by rule 273 + PADDING_COLON reduce by rule 273 + RESOURCE reduce by rule 273 + CPU reduce by rule 273 + LATENCY reduce by rule 273 + EXCEPTION reduce by rule 273 + ID reduce by rule 273 + SYMBOL reduce by rule 273 + WORD reduce by rule 273 + INT reduce by rule 273 + INTINF reduce by rule 273 + REAL reduce by rule 273 + STRING reduce by rule 273 + CHAR reduce by rule 273 + EOF reduce by rule 273 + + + . error + + + state 404: + + aexp2 : aexp2 AT . LBRACKET slices RBRACKET + + LBRACKET shift 508 + + + . error + + + state 405: + + aexp : sym CONCAT . LBRACKET exps RBRACKET + aexp : sym CONCAT . LBRACKET exps RBRACKET CONCAT sym + + LBRACKET shift 509 + + + . error + + + state 406: + + aexp : OP symb . (reduce by rule 244) + + ARCHITECTURE reduce by rule 244 + END reduce by rule 244 + LOCAL reduce by rule 244 + IN reduce by rule 244 + OF reduce by rule 244 + DATATYPE reduce by rule 244 + TYPE reduce by rule 244 + EQ reduce by rule 244 + DOLLAR reduce by rule 244 + TIMES reduce by rule 244 + AND reduce by rule 244 + DEREF reduce by rule 244 + NOT reduce by rule 244 + LLBRACKET reduce by rule 244 + LHASHBRACKET reduce by rule 244 + LPAREN reduce by rule 244 + RPAREN reduce by rule 244 + LBRACKET reduce by rule 244 + RBRACKET reduce by rule 244 + LBRACE reduce by rule 244 + RBRACE reduce by rule 244 + SEMICOLON reduce by rule 244 + LDQUOTE reduce by rule 244 + RMETA reduce by rule 244 + CELLSET reduce by rule 244 + STORAGE reduce by rule 244 + LOCATIONS reduce by rule 244 + HASH reduce by rule 244 + COMMA reduce by rule 244 + COLON reduce by rule 244 + AT reduce by rule 244 + BAR reduce by rule 244 + DARROW reduce by rule 244 + THEN reduce by rule 244 + ELSE reduce by rule 244 + TRUE reduce by rule 244 + FALSE reduce by rule 244 + HANDLE reduce by rule 244 + LET reduce by rule 244 + STRUCTURE reduce by rule 244 + FUNCTOR reduce by rule 244 + SIGNATURE reduce by rule 244 + SHARING reduce by rule 244 + INSTRUCTION reduce by rule 244 + VLIW reduce by rule 244 + SUPERSCALAR reduce by rule 244 + WITHTYPE reduce by rule 244 + FUN reduce by rule 244 + VAL reduce by rule 244 + INCLUDE reduce by rule 244 + OPEN reduce by rule 244 + OP reduce by rule 244 + LITTLE reduce by rule 244 + BIG reduce by rule 244 + PIPELINE reduce by rule 244 + LOWERCASE reduce by rule 244 + UPPERCASE reduce by rule 244 + VERBATIM reduce by rule 244 + RTL reduce by rule 244 + SPAN reduce by rule 244 + DELAYSLOT reduce by rule 244 + ALWAYS reduce by rule 244 + NEVER reduce by rule 244 + NONFIX reduce by rule 244 + INFIX reduce by rule 244 + INFIXR reduce by rule 244 + DEBUG reduce by rule 244 + ASM_COLON reduce by rule 244 + MC_COLON reduce by rule 244 + RTL_COLON reduce by rule 244 + DELAYSLOT_COLON reduce by rule 244 + NULLIFIED_COLON reduce by rule 244 + PADDING_COLON reduce by rule 244 + RESOURCE reduce by rule 244 + CPU reduce by rule 244 + LATENCY reduce by rule 244 + EXCEPTION reduce by rule 244 + ID reduce by rule 244 + SYMBOL reduce by rule 244 + WORD reduce by rule 244 + INT reduce by rule 244 + INTINF reduce by rule 244 + REAL reduce by rule 244 + STRING reduce by rule 244 + CHAR reduce by rule 244 + EOF reduce by rule 244 + + + . error + + + state 407: + + aexp : LET decls . IN expseq END + + IN shift 510 + + + . error + + + state 408: + + exp : exp . HANDLE clauses + exp : RAISE exp . (reduce by rule 279) + + ARCHITECTURE reduce by rule 279 + END reduce by rule 279 + LOCAL reduce by rule 279 + IN reduce by rule 279 + OF reduce by rule 279 + DATATYPE reduce by rule 279 + TYPE reduce by rule 279 + AND reduce by rule 279 + LPAREN reduce by rule 279 + RPAREN reduce by rule 279 + RBRACKET reduce by rule 279 + RBRACE reduce by rule 279 + SEMICOLON reduce by rule 279 + RMETA reduce by rule 279 + CELLSET reduce by rule 279 + STORAGE reduce by rule 279 + LOCATIONS reduce by rule 279 + COMMA reduce by rule 279 + COLON reduce by rule 279 + BAR reduce by rule 279 + DARROW reduce by rule 279 + THEN reduce by rule 279 + ELSE reduce by rule 279 + HANDLE reduce by rule 279 + STRUCTURE reduce by rule 279 + FUNCTOR reduce by rule 279 + SIGNATURE reduce by rule 279 + SHARING reduce by rule 279 + INSTRUCTION reduce by rule 279 + VLIW reduce by rule 279 + SUPERSCALAR reduce by rule 279 + WITHTYPE reduce by rule 279 + FUN reduce by rule 279 + VAL reduce by rule 279 + INCLUDE reduce by rule 279 + OPEN reduce by rule 279 + LITTLE reduce by rule 279 + BIG reduce by rule 279 + PIPELINE reduce by rule 279 + LOWERCASE reduce by rule 279 + UPPERCASE reduce by rule 279 + VERBATIM reduce by rule 279 + RTL reduce by rule 279 + SPAN reduce by rule 279 + DELAYSLOT reduce by rule 279 + NONFIX reduce by rule 279 + INFIX reduce by rule 279 + INFIXR reduce by rule 279 + DEBUG reduce by rule 279 + ASM_COLON reduce by rule 279 + MC_COLON reduce by rule 279 + RTL_COLON reduce by rule 279 + DELAYSLOT_COLON reduce by rule 279 + NULLIFIED_COLON reduce by rule 279 + PADDING_COLON reduce by rule 279 + RESOURCE reduce by rule 279 + CPU reduce by rule 279 + LATENCY reduce by rule 279 + EXCEPTION reduce by rule 279 + ID reduce by rule 279 + SYMBOL reduce by rule 279 + WORD reduce by rule 279 + INT reduce by rule 279 + EOF reduce by rule 279 + + + . error + + + state 409: + + exp : IF typedexp . THEN typedexp ELSE exp + typedexp : typedexp . COLON ty + + COLON shift 458 + THEN shift 511 + + + . error + + + state 410: + + aexp : HASH id . (reduce by rule 243) + + ARCHITECTURE reduce by rule 243 + END reduce by rule 243 + LOCAL reduce by rule 243 + IN reduce by rule 243 + OF reduce by rule 243 + DATATYPE reduce by rule 243 + TYPE reduce by rule 243 + EQ reduce by rule 243 + DOLLAR reduce by rule 243 + TIMES reduce by rule 243 + AND reduce by rule 243 + DEREF reduce by rule 243 + NOT reduce by rule 243 + LLBRACKET reduce by rule 243 + LHASHBRACKET reduce by rule 243 + LPAREN reduce by rule 243 + RPAREN reduce by rule 243 + LBRACKET reduce by rule 243 + RBRACKET reduce by rule 243 + LBRACE reduce by rule 243 + RBRACE reduce by rule 243 + SEMICOLON reduce by rule 243 + LDQUOTE reduce by rule 243 + RMETA reduce by rule 243 + CELLSET reduce by rule 243 + STORAGE reduce by rule 243 + LOCATIONS reduce by rule 243 + HASH reduce by rule 243 + COMMA reduce by rule 243 + COLON reduce by rule 243 + AT reduce by rule 243 + BAR reduce by rule 243 + DARROW reduce by rule 243 + THEN reduce by rule 243 + ELSE reduce by rule 243 + TRUE reduce by rule 243 + FALSE reduce by rule 243 + HANDLE reduce by rule 243 + LET reduce by rule 243 + STRUCTURE reduce by rule 243 + FUNCTOR reduce by rule 243 + SIGNATURE reduce by rule 243 + SHARING reduce by rule 243 + INSTRUCTION reduce by rule 243 + VLIW reduce by rule 243 + SUPERSCALAR reduce by rule 243 + WITHTYPE reduce by rule 243 + FUN reduce by rule 243 + VAL reduce by rule 243 + INCLUDE reduce by rule 243 + OPEN reduce by rule 243 + OP reduce by rule 243 + LITTLE reduce by rule 243 + BIG reduce by rule 243 + PIPELINE reduce by rule 243 + LOWERCASE reduce by rule 243 + UPPERCASE reduce by rule 243 + VERBATIM reduce by rule 243 + RTL reduce by rule 243 + SPAN reduce by rule 243 + DELAYSLOT reduce by rule 243 + ALWAYS reduce by rule 243 + NEVER reduce by rule 243 + NONFIX reduce by rule 243 + INFIX reduce by rule 243 + INFIXR reduce by rule 243 + DEBUG reduce by rule 243 + ASM_COLON reduce by rule 243 + MC_COLON reduce by rule 243 + RTL_COLON reduce by rule 243 + DELAYSLOT_COLON reduce by rule 243 + NULLIFIED_COLON reduce by rule 243 + PADDING_COLON reduce by rule 243 + RESOURCE reduce by rule 243 + CPU reduce by rule 243 + LATENCY reduce by rule 243 + EXCEPTION reduce by rule 243 + ID reduce by rule 243 + SYMBOL reduce by rule 243 + WORD reduce by rule 243 + INT reduce by rule 243 + INTINF reduce by rule 243 + REAL reduce by rule 243 + STRING reduce by rule 243 + CHAR reduce by rule 243 + EOF reduce by rule 243 + + + . error + + + state 411: + + exp : FN clauses . (reduce by rule 277) + + ARCHITECTURE reduce by rule 277 + END reduce by rule 277 + LOCAL reduce by rule 277 + IN reduce by rule 277 + OF reduce by rule 277 + DATATYPE reduce by rule 277 + TYPE reduce by rule 277 + AND reduce by rule 277 + LPAREN reduce by rule 277 + RPAREN reduce by rule 277 + RBRACKET reduce by rule 277 + RBRACE reduce by rule 277 + SEMICOLON reduce by rule 277 + RMETA reduce by rule 277 + CELLSET reduce by rule 277 + STORAGE reduce by rule 277 + LOCATIONS reduce by rule 277 + COMMA reduce by rule 277 + COLON reduce by rule 277 + BAR reduce by rule 277 + DARROW reduce by rule 277 + THEN reduce by rule 277 + ELSE reduce by rule 277 + HANDLE reduce by rule 277 + STRUCTURE reduce by rule 277 + FUNCTOR reduce by rule 277 + SIGNATURE reduce by rule 277 + SHARING reduce by rule 277 + INSTRUCTION reduce by rule 277 + VLIW reduce by rule 277 + SUPERSCALAR reduce by rule 277 + WITHTYPE reduce by rule 277 + FUN reduce by rule 277 + VAL reduce by rule 277 + INCLUDE reduce by rule 277 + OPEN reduce by rule 277 + LITTLE reduce by rule 277 + BIG reduce by rule 277 + PIPELINE reduce by rule 277 + LOWERCASE reduce by rule 277 + UPPERCASE reduce by rule 277 + VERBATIM reduce by rule 277 + RTL reduce by rule 277 + SPAN reduce by rule 277 + DELAYSLOT reduce by rule 277 + NONFIX reduce by rule 277 + INFIX reduce by rule 277 + INFIXR reduce by rule 277 + DEBUG reduce by rule 277 + ASM_COLON reduce by rule 277 + MC_COLON reduce by rule 277 + RTL_COLON reduce by rule 277 + DELAYSLOT_COLON reduce by rule 277 + NULLIFIED_COLON reduce by rule 277 + PADDING_COLON reduce by rule 277 + RESOURCE reduce by rule 277 + CPU reduce by rule 277 + LATENCY reduce by rule 277 + EXCEPTION reduce by rule 277 + ID reduce by rule 277 + SYMBOL reduce by rule 277 + WORD reduce by rule 277 + INT reduce by rule 277 + EOF reduce by rule 277 + + + . error + + error: state 412: shift/reduce conflict (shift BAR, reduce by rule 341) + + state 412: + + clauses : clause . (reduce by rule 341) + clauses : clause . BAR clauses + + ARCHITECTURE reduce by rule 341 + END reduce by rule 341 + LOCAL reduce by rule 341 + IN reduce by rule 341 + OF reduce by rule 341 + DATATYPE reduce by rule 341 + TYPE reduce by rule 341 + AND reduce by rule 341 + LPAREN reduce by rule 341 + RPAREN reduce by rule 341 + RBRACKET reduce by rule 341 + RBRACE reduce by rule 341 + SEMICOLON reduce by rule 341 + RMETA reduce by rule 341 + CELLSET reduce by rule 341 + STORAGE reduce by rule 341 + LOCATIONS reduce by rule 341 + COMMA reduce by rule 341 + COLON reduce by rule 341 + BAR shift 512 + DARROW reduce by rule 341 + THEN reduce by rule 341 + ELSE reduce by rule 341 + HANDLE reduce by rule 341 + STRUCTURE reduce by rule 341 + FUNCTOR reduce by rule 341 + SIGNATURE reduce by rule 341 + SHARING reduce by rule 341 + INSTRUCTION reduce by rule 341 + VLIW reduce by rule 341 + SUPERSCALAR reduce by rule 341 + WITHTYPE reduce by rule 341 + FUN reduce by rule 341 + VAL reduce by rule 341 + INCLUDE reduce by rule 341 + OPEN reduce by rule 341 + LITTLE reduce by rule 341 + BIG reduce by rule 341 + PIPELINE reduce by rule 341 + LOWERCASE reduce by rule 341 + UPPERCASE reduce by rule 341 + VERBATIM reduce by rule 341 + RTL reduce by rule 341 + SPAN reduce by rule 341 + DELAYSLOT reduce by rule 341 + NONFIX reduce by rule 341 + INFIX reduce by rule 341 + INFIXR reduce by rule 341 + DEBUG reduce by rule 341 + ASM_COLON reduce by rule 341 + MC_COLON reduce by rule 341 + RTL_COLON reduce by rule 341 + DELAYSLOT_COLON reduce by rule 341 + NULLIFIED_COLON reduce by rule 341 + PADDING_COLON reduce by rule 341 + RESOURCE reduce by rule 341 + CPU reduce by rule 341 + LATENCY reduce by rule 341 + EXCEPTION reduce by rule 341 + ID reduce by rule 341 + SYMBOL reduce by rule 341 + WORD reduce by rule 341 + INT reduce by rule 341 + EOF reduce by rule 341 + + + . error + + + state 413: + + typedpat : typedpat . COLON ty + clause : typedpat . guard cont DARROW exp + + COLON shift 316 + DARROW reduce by rule 339 + WHERE shift 514 + EXCEPTION reduce by rule 339 + + guard goto 513 + + . error + + + state 414: + + asms : asm . (reduce by rule 188) + asms : asm . asms + + RDQUOTE reduce by rule 188 + LMETA shift 417 + ASMTEXT shift 416 + + asms goto 515 + asm goto 414 + + . error + + + state 415: + + asm_strings : LDQUOTE asms . RDQUOTE + asm_strings : LDQUOTE asms . RDQUOTE asm_strings + + RDQUOTE shift 516 + + + . error + + + state 416: + + asm : ASMTEXT . (reduce by rule 191) + + RDQUOTE reduce by rule 191 + LMETA reduce by rule 191 + ASMTEXT reduce by rule 191 + + + . error + + + state 417: + + asm : LMETA . exp RMETA + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 517 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 418: + + labexps : labexp . (reduce by rule 268) + labexps : labexp . COMMA labexps + + RBRACE reduce by rule 268 + COMMA shift 518 + + + . error + + + state 419: + + labexps0 : labexps . (reduce by rule 267) + + RBRACE reduce by rule 267 + + + . error + + + state 420: + + aexp : LBRACE labexps0 . RBRACE + + RBRACE shift 519 + + + . error + + + state 421: + + labexp : id . EQ typedexp + labexp : id . (reduce by rule 271) + + EQ shift 520 + RBRACE reduce by rule 271 + COMMA reduce by rule 271 + + + . error + + + state 422: + + exps : exps1 . (reduce by rule 289) + + RBRACKET reduce by rule 289 + + + . error + + + state 423: + + aexp : LBRACKET exps . RBRACKET + aexp : LBRACKET exps . RBRACKET CONCAT sym + + RBRACKET shift 521 + + + . error + + + state 424: + + typedexp : typedexp . COLON ty + exps1 : typedexp . (reduce by rule 285) + exps1 : typedexp . COMMA exps1 + + RPAREN reduce by rule 285 + RBRACKET reduce by rule 285 + COMMA shift 522 + COLON shift 458 + + + . error + + + state 425: + + aexp : LPAREN expseq2 . RPAREN + + RPAREN shift 523 + + + . error + + + state 426: + + aexp : LPAREN exps2 . RPAREN + + RPAREN shift 524 + + + . error + + + state 427: + + aexp : LPAREN typedexp . RPAREN + typedexp : typedexp . COLON ty + exps2 : typedexp . COMMA exps1 + expseq2 : typedexp . SEMICOLON expseq + + RPAREN shift 527 + SEMICOLON shift 526 + COMMA shift 525 + COLON shift 458 + + + . error + + error: state 428: shift/reduce conflict (shift RPAREN, reduce by rule 417) + + state 428: + + sym : symb . (reduce by rule 417) + aexp : LPAREN symb . RPAREN + + EQ reduce by rule 417 + DOLLAR reduce by rule 417 + TIMES reduce by rule 417 + DEREF reduce by rule 417 + NOT reduce by rule 417 + CONCAT reduce by rule 417 + LLBRACKET reduce by rule 417 + LHASHBRACKET reduce by rule 417 + LPAREN reduce by rule 417 + RPAREN shift 528 + LBRACKET reduce by rule 417 + LBRACE reduce by rule 417 + SEMICOLON reduce by rule 417 + LDQUOTE reduce by rule 417 + CELLSET reduce by rule 417 + HASH reduce by rule 417 + COMMA reduce by rule 417 + COLON reduce by rule 417 + AT reduce by rule 417 + TRUE reduce by rule 417 + FALSE reduce by rule 417 + HANDLE reduce by rule 417 + LET reduce by rule 417 + OP reduce by rule 417 + ALWAYS reduce by rule 417 + NEVER reduce by rule 417 + ID reduce by rule 417 + SYMBOL reduce by rule 417 + WORD reduce by rule 417 + INT reduce by rule 417 + INTINF reduce by rule 417 + REAL reduce by rule 417 + STRING reduce by rule 417 + CHAR reduce by rule 417 + + + . error + + + state 429: + + aexp : LPAREN RPAREN . (reduce by rule 247) + + ARCHITECTURE reduce by rule 247 + END reduce by rule 247 + LOCAL reduce by rule 247 + IN reduce by rule 247 + OF reduce by rule 247 + DATATYPE reduce by rule 247 + TYPE reduce by rule 247 + EQ reduce by rule 247 + DOLLAR reduce by rule 247 + TIMES reduce by rule 247 + AND reduce by rule 247 + DEREF reduce by rule 247 + NOT reduce by rule 247 + LLBRACKET reduce by rule 247 + LHASHBRACKET reduce by rule 247 + LPAREN reduce by rule 247 + RPAREN reduce by rule 247 + LBRACKET reduce by rule 247 + RBRACKET reduce by rule 247 + LBRACE reduce by rule 247 + RBRACE reduce by rule 247 + SEMICOLON reduce by rule 247 + LDQUOTE reduce by rule 247 + RMETA reduce by rule 247 + CELLSET reduce by rule 247 + STORAGE reduce by rule 247 + LOCATIONS reduce by rule 247 + HASH reduce by rule 247 + COMMA reduce by rule 247 + COLON reduce by rule 247 + AT reduce by rule 247 + BAR reduce by rule 247 + DARROW reduce by rule 247 + THEN reduce by rule 247 + ELSE reduce by rule 247 + TRUE reduce by rule 247 + FALSE reduce by rule 247 + HANDLE reduce by rule 247 + LET reduce by rule 247 + STRUCTURE reduce by rule 247 + FUNCTOR reduce by rule 247 + SIGNATURE reduce by rule 247 + SHARING reduce by rule 247 + INSTRUCTION reduce by rule 247 + VLIW reduce by rule 247 + SUPERSCALAR reduce by rule 247 + WITHTYPE reduce by rule 247 + FUN reduce by rule 247 + VAL reduce by rule 247 + INCLUDE reduce by rule 247 + OPEN reduce by rule 247 + OP reduce by rule 247 + LITTLE reduce by rule 247 + BIG reduce by rule 247 + PIPELINE reduce by rule 247 + LOWERCASE reduce by rule 247 + UPPERCASE reduce by rule 247 + VERBATIM reduce by rule 247 + RTL reduce by rule 247 + SPAN reduce by rule 247 + DELAYSLOT reduce by rule 247 + ALWAYS reduce by rule 247 + NEVER reduce by rule 247 + NONFIX reduce by rule 247 + INFIX reduce by rule 247 + INFIXR reduce by rule 247 + DEBUG reduce by rule 247 + ASM_COLON reduce by rule 247 + MC_COLON reduce by rule 247 + RTL_COLON reduce by rule 247 + DELAYSLOT_COLON reduce by rule 247 + NULLIFIED_COLON reduce by rule 247 + PADDING_COLON reduce by rule 247 + RESOURCE reduce by rule 247 + CPU reduce by rule 247 + LATENCY reduce by rule 247 + EXCEPTION reduce by rule 247 + ID reduce by rule 247 + SYMBOL reduce by rule 247 + WORD reduce by rule 247 + INT reduce by rule 247 + INTINF reduce by rule 247 + REAL reduce by rule 247 + STRING reduce by rule 247 + CHAR reduce by rule 247 + EOF reduce by rule 247 + + + . error + + + state 430: + + aexp : LHASHBRACKET exps . RBRACKET + + RBRACKET shift 529 + + + . error + + + state 431: + + aexp : LLBRACKET rtlterms . RRBRACKET + + RRBRACKET shift 530 + + + . error + + + state 432: + + rtlterms : rtlterm . (reduce by rule 118) + rtlterms : rtlterm . rtlterms + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + RRBRACKET reduce by rule 118 + CELLSET shift 50 + HASH shift 435 + ID shift 49 + SYMBOL shift 48 + STRING shift 91 + + id goto 69 + sym goto 434 + symb goto 67 + string goto 433 + rtlterm goto 432 + rtlterms goto 531 + + . error + + + state 433: + + rtlterm : string . (reduce by rule 120) + + TIMES reduce by rule 120 + DEREF reduce by rule 120 + NOT reduce by rule 120 + RRBRACKET reduce by rule 120 + CELLSET reduce by rule 120 + HASH reduce by rule 120 + ID reduce by rule 120 + SYMBOL reduce by rule 120 + STRING reduce by rule 120 + + + . error + + + state 434: + + rtlterm : sym . (reduce by rule 121) + + TIMES reduce by rule 121 + DEREF reduce by rule 121 + NOT reduce by rule 121 + RRBRACKET reduce by rule 121 + CELLSET reduce by rule 121 + HASH reduce by rule 121 + ID reduce by rule 121 + SYMBOL reduce by rule 121 + STRING reduce by rule 121 + + + . error + + + state 435: + + rtlterm : HASH . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 532 + + . error + + + state 436: + + aexp : DOLLAR id . LBRACKET exp region RBRACKET + + LBRACKET shift 533 + + + . error + + + state 437: + + exp : CASE typedexp . OF clauses + typedexp : typedexp . COLON ty + + OF shift 534 + COLON shift 458 + + + . error + + + state 438: + + apat : sym CONCAT LBRACKET pats . RBRACKET + apat : sym CONCAT LBRACKET pats . RBRACKET CONCAT sym + + RBRACKET shift 535 + + + . error + + + state 439: + + mymldecl : RTL id LBRACE labpats0 RBRACE . EQ exp + + EQ shift 536 + + + . error + + + state 440: + + labpats : labpat COMMA labpats . (reduce by rule 330) + + RBRACE reduce by rule 330 + + + . error + + + state 441: + + labpats : labpat COMMA DOTDOT . (reduce by rule 329) + + RBRACE reduce by rule 329 + + + . error + + + state 442: + + typedpat : typedpat . COLON ty + labpat : sym AS typedpat . (reduce by rule 333) + + RBRACE reduce by rule 333 + COMMA reduce by rule 333 + COLON shift 316 + + + . error + + + state 443: + + typedexp : typedexp . COLON ty + labpat : sym WHERE typedexp . (reduce by rule 334) + labpat : sym WHERE typedexp . IN typedpat + + IN shift 537 + RBRACE reduce by rule 334 + COMMA reduce by rule 334 + COLON shift 458 + + + . error + + + state 444: + + typedpat : typedpat . COLON ty + labpat : sym EQ typedpat . (reduce by rule 332) + + RBRACE reduce by rule 332 + COMMA reduce by rule 332 + COLON shift 316 + + + . error + + + state 445: + + apat : LBRACKET pats RBRACKET CONCAT . sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 538 + symb goto 67 + + . error + + + state 446: + + typedpat : typedpat COLON ty . (reduce by rule 318) + ty : ty . ARROW ty + + AND reduce by rule 318 + RPAREN reduce by rule 318 + RBRACKET reduce by rule 318 + RBRACE reduce by rule 318 + COMMA reduce by rule 318 + COLON reduce by rule 318 + BAR reduce by rule 318 + ARROW shift 388 + DARROW reduce by rule 318 + WHERE reduce by rule 318 + EXCEPTION reduce by rule 318 + + + . error + + + state 447: + + pats1 : typedpat COMMA pats1 . (reduce by rule 324) + + RPAREN reduce by rule 324 + RBRACKET reduce by rule 324 + + + . error + + + state 448: + + typedexp : typedexp . COLON ty + apat : LPAREN typedpat WHERE typedexp . RPAREN + apat : LPAREN typedpat WHERE typedexp . IN typedpat RPAREN + + IN shift 540 + RPAREN shift 539 + COLON shift 458 + + + . error + + + state 449: + + orpats2 : typedpat BAR orpats2 . (reduce by rule 307) + + RPAREN reduce by rule 307 + + + . error + + + state 450: + + typedpat : typedpat . COLON ty + orpats2 : typedpat . BAR typedpat + orpats2 : typedpat BAR typedpat . (reduce by rule 306) + orpats2 : typedpat . BAR orpats2 + + RPAREN reduce by rule 306 + COLON shift 316 + BAR shift 322 + + + . error + + + state 451: + + pats2 : typedpat COMMA pats1 . (reduce by rule 325) + + RPAREN reduce by rule 325 + + + . error + + + state 452: + + andpats2 : typedpat AND andpats2 . (reduce by rule 309) + + RPAREN reduce by rule 309 + + + . error + + + state 453: + + typedpat : typedpat . COLON ty + andpats2 : typedpat . AND typedpat + andpats2 : typedpat AND typedpat . (reduce by rule 308) + andpats2 : typedpat . AND andpats2 + + AND shift 325 + RPAREN reduce by rule 308 + COLON shift 316 + + + . error + + + state 454: + + pipelineclause : id pat EQ LBRACKET . cycles0 RBRACKET + + LPAREN shift 545 + RBRACKET reduce by rule 45 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 544 + cycles0 goto 543 + cycles goto 542 + cycle goto 541 + + . error + + + state 455: + + sigsubs : sigsub AND . sigsubs + + TYPE shift 333 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 332 + ident2 goto 112 + path goto 85 + sigsub goto 331 + sigsubs goto 546 + + . error + + + state 456: + + sigsub : ident EQ . structexp + + CELLSET shift 50 + STRUCT shift 364 + ID shift 49 + SYMBOL shift 48 + + structexp goto 547 + id goto 114 + ident goto 362 + ident2 goto 112 + path goto 85 + + . error + + + state 457: + + sigsub : TYPE ident . EQ ty + + EQ shift 548 + + + . error + + + state 458: + + typedexp : typedexp COLON . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 549 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 459: + + funclause : apppat funguard return_ty cont . EQ typedexp + + EQ shift 550 + + + . error + + + state 460: + + cont : EXCEPTION . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 551 + + . error + + + state 461: + + ty : ty . ARROW ty + return_ty : COLON ty . (reduce by rule 345) + + EQ reduce by rule 345 + ARROW shift 388 + EXCEPTION reduce by rule 345 + + + . error + + + state 462: + + typedexp : typedexp . COLON ty + funguard : WHERE LPAREN typedexp . RPAREN + + RPAREN shift 552 + COLON shift 458 + + + . error + + + state 463: + + consbind : sym of_ty consassembly consencoding . rtl nop nullified delayslot delayslotcandidate sdi latency pipeline + + ARCHITECTURE reduce by rule 117 + END reduce by rule 117 + LOCAL reduce by rule 117 + IN reduce by rule 117 + DATATYPE reduce by rule 117 + TYPE reduce by rule 117 + AND reduce by rule 117 + RPAREN reduce by rule 117 + SEMICOLON reduce by rule 117 + STORAGE reduce by rule 117 + LOCATIONS reduce by rule 117 + BAR reduce by rule 117 + STRUCTURE reduce by rule 117 + FUNCTOR reduce by rule 117 + SIGNATURE reduce by rule 117 + SHARING reduce by rule 117 + INSTRUCTION reduce by rule 117 + VLIW reduce by rule 117 + SUPERSCALAR reduce by rule 117 + WITHTYPE reduce by rule 117 + FUN reduce by rule 117 + VAL reduce by rule 117 + INCLUDE reduce by rule 117 + OPEN reduce by rule 117 + LITTLE reduce by rule 117 + BIG reduce by rule 117 + PIPELINE reduce by rule 117 + LOWERCASE reduce by rule 117 + UPPERCASE reduce by rule 117 + VERBATIM reduce by rule 117 + RTL reduce by rule 117 + SPAN reduce by rule 117 + DELAYSLOT reduce by rule 117 + NONFIX reduce by rule 117 + INFIX reduce by rule 117 + INFIXR reduce by rule 117 + DEBUG reduce by rule 117 + RTL_COLON shift 554 + DELAYSLOT_COLON reduce by rule 117 + NULLIFIED_COLON reduce by rule 117 + PADDING_COLON reduce by rule 117 + RESOURCE reduce by rule 117 + CPU reduce by rule 117 + LATENCY reduce by rule 117 + EXCEPTION reduce by rule 117 + EOF reduce by rule 117 + + rtl goto 553 + + . error + + + state 464: + + unsignedint : int . (reduce by rule 221) + + ARCHITECTURE reduce by rule 221 + END reduce by rule 221 + LOCAL reduce by rule 221 + IN reduce by rule 221 + DATATYPE reduce by rule 221 + TYPE reduce by rule 221 + AND reduce by rule 221 + RPAREN reduce by rule 221 + RBRACE reduce by rule 221 + SEMICOLON reduce by rule 221 + STORAGE reduce by rule 221 + LOCATIONS reduce by rule 221 + COMMA reduce by rule 221 + BAR reduce by rule 221 + STRUCTURE reduce by rule 221 + FUNCTOR reduce by rule 221 + SIGNATURE reduce by rule 221 + SHARING reduce by rule 221 + INSTRUCTION reduce by rule 221 + VLIW reduce by rule 221 + SUPERSCALAR reduce by rule 221 + WITHTYPE reduce by rule 221 + FUN reduce by rule 221 + VAL reduce by rule 221 + INCLUDE reduce by rule 221 + OPEN reduce by rule 221 + LITTLE reduce by rule 221 + BIG reduce by rule 221 + PIPELINE reduce by rule 221 + LOWERCASE reduce by rule 221 + UPPERCASE reduce by rule 221 + VERBATIM reduce by rule 221 + RTL reduce by rule 221 + SPAN reduce by rule 221 + DELAYSLOT reduce by rule 221 + NONFIX reduce by rule 221 + INFIX reduce by rule 221 + INFIXR reduce by rule 221 + DEBUG reduce by rule 221 + RTL_COLON reduce by rule 221 + DELAYSLOT_COLON reduce by rule 221 + NULLIFIED_COLON reduce by rule 221 + PADDING_COLON reduce by rule 221 + RESOURCE reduce by rule 221 + CPU reduce by rule 221 + LATENCY reduce by rule 221 + EXCEPTION reduce by rule 221 + EOF reduce by rule 221 + + + . error + + + state 465: + + consencoding : unsignedint . (reduce by rule 177) + + ARCHITECTURE reduce by rule 177 + END reduce by rule 177 + LOCAL reduce by rule 177 + IN reduce by rule 177 + DATATYPE reduce by rule 177 + TYPE reduce by rule 177 + AND reduce by rule 177 + RPAREN reduce by rule 177 + SEMICOLON reduce by rule 177 + STORAGE reduce by rule 177 + LOCATIONS reduce by rule 177 + BAR reduce by rule 177 + STRUCTURE reduce by rule 177 + FUNCTOR reduce by rule 177 + SIGNATURE reduce by rule 177 + SHARING reduce by rule 177 + INSTRUCTION reduce by rule 177 + VLIW reduce by rule 177 + SUPERSCALAR reduce by rule 177 + WITHTYPE reduce by rule 177 + FUN reduce by rule 177 + VAL reduce by rule 177 + INCLUDE reduce by rule 177 + OPEN reduce by rule 177 + LITTLE reduce by rule 177 + BIG reduce by rule 177 + PIPELINE reduce by rule 177 + LOWERCASE reduce by rule 177 + UPPERCASE reduce by rule 177 + VERBATIM reduce by rule 177 + RTL reduce by rule 177 + SPAN reduce by rule 177 + DELAYSLOT reduce by rule 177 + NONFIX reduce by rule 177 + INFIX reduce by rule 177 + INFIXR reduce by rule 177 + DEBUG reduce by rule 177 + RTL_COLON reduce by rule 177 + DELAYSLOT_COLON reduce by rule 177 + NULLIFIED_COLON reduce by rule 177 + PADDING_COLON reduce by rule 177 + RESOURCE reduce by rule 177 + CPU reduce by rule 177 + LATENCY reduce by rule 177 + EXCEPTION reduce by rule 177 + EOF reduce by rule 177 + + + . error + + + state 466: + + unsignedint : word . (reduce by rule 222) + + ARCHITECTURE reduce by rule 222 + END reduce by rule 222 + LOCAL reduce by rule 222 + IN reduce by rule 222 + DATATYPE reduce by rule 222 + TYPE reduce by rule 222 + AND reduce by rule 222 + RPAREN reduce by rule 222 + RBRACE reduce by rule 222 + SEMICOLON reduce by rule 222 + STORAGE reduce by rule 222 + LOCATIONS reduce by rule 222 + COMMA reduce by rule 222 + BAR reduce by rule 222 + STRUCTURE reduce by rule 222 + FUNCTOR reduce by rule 222 + SIGNATURE reduce by rule 222 + SHARING reduce by rule 222 + INSTRUCTION reduce by rule 222 + VLIW reduce by rule 222 + SUPERSCALAR reduce by rule 222 + WITHTYPE reduce by rule 222 + FUN reduce by rule 222 + VAL reduce by rule 222 + INCLUDE reduce by rule 222 + OPEN reduce by rule 222 + LITTLE reduce by rule 222 + BIG reduce by rule 222 + PIPELINE reduce by rule 222 + LOWERCASE reduce by rule 222 + UPPERCASE reduce by rule 222 + VERBATIM reduce by rule 222 + RTL reduce by rule 222 + SPAN reduce by rule 222 + DELAYSLOT reduce by rule 222 + NONFIX reduce by rule 222 + INFIX reduce by rule 222 + INFIXR reduce by rule 222 + DEBUG reduce by rule 222 + RTL_COLON reduce by rule 222 + DELAYSLOT_COLON reduce by rule 222 + NULLIFIED_COLON reduce by rule 222 + PADDING_COLON reduce by rule 222 + RESOURCE reduce by rule 222 + CPU reduce by rule 222 + LATENCY reduce by rule 222 + EXCEPTION reduce by rule 222 + EOF reduce by rule 222 + + + . error + + + state 467: + + consencoding : id . LBRACE labexps0 RBRACE + + LBRACE shift 555 + + + . error + + + state 468: + + consencoding : MC_COLON . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 556 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 469: + + consencoding : LPAREN . expseq RPAREN + consencoding : LPAREN . exps2 RPAREN + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 559 + exps2 goto 558 + expseq goto 557 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 470: + + exp : exp . HANDLE clauses + consassembly : ASM_COLON exp . (reduce by rule 185) + + ARCHITECTURE reduce by rule 185 + END reduce by rule 185 + LOCAL reduce by rule 185 + IN reduce by rule 185 + DATATYPE reduce by rule 185 + TYPE reduce by rule 185 + AND reduce by rule 185 + LPAREN reduce by rule 185 + RPAREN reduce by rule 185 + SEMICOLON reduce by rule 185 + CELLSET reduce by rule 185 + STORAGE reduce by rule 185 + LOCATIONS reduce by rule 185 + BAR reduce by rule 185 + HANDLE shift 402 + STRUCTURE reduce by rule 185 + FUNCTOR reduce by rule 185 + SIGNATURE reduce by rule 185 + SHARING reduce by rule 185 + INSTRUCTION reduce by rule 185 + VLIW reduce by rule 185 + SUPERSCALAR reduce by rule 185 + WITHTYPE reduce by rule 185 + FUN reduce by rule 185 + VAL reduce by rule 185 + INCLUDE reduce by rule 185 + OPEN reduce by rule 185 + LITTLE reduce by rule 185 + BIG reduce by rule 185 + PIPELINE reduce by rule 185 + LOWERCASE reduce by rule 185 + UPPERCASE reduce by rule 185 + VERBATIM reduce by rule 185 + RTL reduce by rule 185 + SPAN reduce by rule 185 + DELAYSLOT reduce by rule 185 + NONFIX reduce by rule 185 + INFIX reduce by rule 185 + INFIXR reduce by rule 185 + DEBUG reduce by rule 185 + MC_COLON reduce by rule 185 + RTL_COLON reduce by rule 185 + DELAYSLOT_COLON reduce by rule 185 + NULLIFIED_COLON reduce by rule 185 + PADDING_COLON reduce by rule 185 + RESOURCE reduce by rule 185 + CPU reduce by rule 185 + LATENCY reduce by rule 185 + EXCEPTION reduce by rule 185 + ID reduce by rule 185 + SYMBOL reduce by rule 185 + WORD reduce by rule 185 + INT reduce by rule 185 + EOF reduce by rule 185 + + + . error + + + state 471: + + formatbinds : formatbind BAR formatbinds . (reduce by rule 205) + + ARCHITECTURE reduce by rule 205 + END reduce by rule 205 + LOCAL reduce by rule 205 + IN reduce by rule 205 + DATATYPE reduce by rule 205 + TYPE reduce by rule 205 + RPAREN reduce by rule 205 + SEMICOLON reduce by rule 205 + STORAGE reduce by rule 205 + LOCATIONS reduce by rule 205 + STRUCTURE reduce by rule 205 + FUNCTOR reduce by rule 205 + SIGNATURE reduce by rule 205 + SHARING reduce by rule 205 + INSTRUCTION reduce by rule 205 + VLIW reduce by rule 205 + SUPERSCALAR reduce by rule 205 + FUN reduce by rule 205 + VAL reduce by rule 205 + INCLUDE reduce by rule 205 + OPEN reduce by rule 205 + LITTLE reduce by rule 205 + BIG reduce by rule 205 + PIPELINE reduce by rule 205 + LOWERCASE reduce by rule 205 + UPPERCASE reduce by rule 205 + VERBATIM reduce by rule 205 + RTL reduce by rule 205 + NONFIX reduce by rule 205 + INFIX reduce by rule 205 + INFIXR reduce by rule 205 + DEBUG reduce by rule 205 + RESOURCE reduce by rule 205 + CPU reduce by rule 205 + LATENCY reduce by rule 205 + EXCEPTION reduce by rule 205 + EOF reduce by rule 205 + + + . error + + + state 472: + + mymddecl : INSTRUCTION FORMATS int BITS formatbinds . (reduce by rule 18) + + ARCHITECTURE reduce by rule 18 + END reduce by rule 18 + LOCAL reduce by rule 18 + IN reduce by rule 18 + DATATYPE reduce by rule 18 + TYPE reduce by rule 18 + RPAREN reduce by rule 18 + SEMICOLON reduce by rule 18 + STORAGE reduce by rule 18 + LOCATIONS reduce by rule 18 + STRUCTURE reduce by rule 18 + FUNCTOR reduce by rule 18 + SIGNATURE reduce by rule 18 + SHARING reduce by rule 18 + INSTRUCTION reduce by rule 18 + VLIW reduce by rule 18 + SUPERSCALAR reduce by rule 18 + FUN reduce by rule 18 + VAL reduce by rule 18 + INCLUDE reduce by rule 18 + OPEN reduce by rule 18 + LITTLE reduce by rule 18 + BIG reduce by rule 18 + PIPELINE reduce by rule 18 + LOWERCASE reduce by rule 18 + UPPERCASE reduce by rule 18 + VERBATIM reduce by rule 18 + RTL reduce by rule 18 + NONFIX reduce by rule 18 + INFIX reduce by rule 18 + INFIXR reduce by rule 18 + DEBUG reduce by rule 18 + RESOURCE reduce by rule 18 + CPU reduce by rule 18 + LATENCY reduce by rule 18 + EXCEPTION reduce by rule 18 + EOF reduce by rule 18 + + + . error + + + state 473: + + formatbind : id opt_of LBRACE . fields RBRACE opt_exp + + CELLSET shift 50 + WILD shift 564 + ID shift 49 + SYMBOL shift 48 + + id goto 563 + field goto 562 + fieldid goto 561 + fields goto 560 + + . error + + + state 474: + + mymldecl : FUNCTOR id LPAREN functorarg RPAREN . EQ structexp + mymldecl : FUNCTOR id LPAREN functorarg RPAREN . sigcon EQ structexp + + EQ shift 566 + COLON shift 476 + COLONGREATER shift 233 + + sigcon goto 565 + + . error + + + state 475: + + functorarg : id sigcon . (reduce by rule 89) + + RPAREN reduce by rule 89 + + + . error + + + state 476: + + sigcon : COLON . sigexp + + CELLSET shift 50 + SIG shift 118 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 117 + ident2 goto 112 + path goto 85 + sigexp goto 567 + + . error + + + state 477: + + structexp : structexp LPAREN . scopeddecls RPAREN + structexp : structexp LPAREN . ident RPAREN + + ARCHITECTURE reduce by rule 107 + LOCAL reduce by rule 107 + DATATYPE reduce by rule 107 + TYPE reduce by rule 107 + RPAREN reduce by rule 107 + CELLSET shift 50 + STORAGE reduce by rule 107 + LOCATIONS reduce by rule 107 + STRUCTURE reduce by rule 107 + FUNCTOR reduce by rule 107 + SIGNATURE reduce by rule 107 + SHARING reduce by rule 107 + INSTRUCTION reduce by rule 107 + VLIW reduce by rule 107 + SUPERSCALAR reduce by rule 107 + FUN reduce by rule 107 + VAL reduce by rule 107 + INCLUDE reduce by rule 107 + OPEN reduce by rule 107 + LITTLE reduce by rule 107 + BIG reduce by rule 107 + PIPELINE reduce by rule 107 + LOWERCASE reduce by rule 107 + UPPERCASE reduce by rule 107 + VERBATIM reduce by rule 107 + RTL reduce by rule 107 + NONFIX reduce by rule 107 + INFIX reduce by rule 107 + INFIXR reduce by rule 107 + DEBUG reduce by rule 107 + RESOURCE reduce by rule 107 + CPU reduce by rule 107 + LATENCY reduce by rule 107 + EXCEPTION reduce by rule 107 + ID shift 49 + SYMBOL shift 48 + + id goto 114 + ident goto 569 + ident2 goto 112 + path goto 85 + scopeddecls goto 568 + newScope goto 164 + + . error + + + state 478: + + structexp : STRUCT scopeddecls . END + + END shift 570 + + + . error + + + state 479: + + structexp : structexp . LPAREN scopeddecls RPAREN + structexp : structexp . LPAREN ident RPAREN + mymldecl : STRUCTURE id sigcon EQ structexp . (reduce by rule 70) + + ARCHITECTURE reduce by rule 70 + END reduce by rule 70 + LOCAL reduce by rule 70 + IN reduce by rule 70 + DATATYPE reduce by rule 70 + TYPE reduce by rule 70 + LPAREN shift 477 + RPAREN reduce by rule 70 + SEMICOLON reduce by rule 70 + STORAGE reduce by rule 70 + LOCATIONS reduce by rule 70 + STRUCTURE reduce by rule 70 + FUNCTOR reduce by rule 70 + SIGNATURE reduce by rule 70 + SHARING reduce by rule 70 + INSTRUCTION reduce by rule 70 + VLIW reduce by rule 70 + SUPERSCALAR reduce by rule 70 + FUN reduce by rule 70 + VAL reduce by rule 70 + INCLUDE reduce by rule 70 + OPEN reduce by rule 70 + LITTLE reduce by rule 70 + BIG reduce by rule 70 + PIPELINE reduce by rule 70 + LOWERCASE reduce by rule 70 + UPPERCASE reduce by rule 70 + VERBATIM reduce by rule 70 + RTL reduce by rule 70 + NONFIX reduce by rule 70 + INFIX reduce by rule 70 + INFIXR reduce by rule 70 + DEBUG reduce by rule 70 + RESOURCE reduce by rule 70 + CPU reduce by rule 70 + LATENCY reduce by rule 70 + EXCEPTION reduce by rule 70 + EOF reduce by rule 70 + + + . error + + + state 480: + + exp : exp . HANDLE clauses + locbind : id pat EQ exp . (reduce by rule 391) + + ARCHITECTURE reduce by rule 391 + END reduce by rule 391 + LOCAL reduce by rule 391 + IN reduce by rule 391 + DATATYPE reduce by rule 391 + TYPE reduce by rule 391 + AND reduce by rule 391 + RPAREN reduce by rule 391 + SEMICOLON reduce by rule 391 + STORAGE reduce by rule 391 + LOCATIONS reduce by rule 391 + HANDLE shift 402 + STRUCTURE reduce by rule 391 + FUNCTOR reduce by rule 391 + SIGNATURE reduce by rule 391 + SHARING reduce by rule 391 + INSTRUCTION reduce by rule 391 + VLIW reduce by rule 391 + SUPERSCALAR reduce by rule 391 + FUN reduce by rule 391 + VAL reduce by rule 391 + INCLUDE reduce by rule 391 + OPEN reduce by rule 391 + LITTLE reduce by rule 391 + BIG reduce by rule 391 + PIPELINE reduce by rule 391 + LOWERCASE reduce by rule 391 + UPPERCASE reduce by rule 391 + VERBATIM reduce by rule 391 + RTL reduce by rule 391 + NONFIX reduce by rule 391 + INFIX reduce by rule 391 + INFIXR reduce by rule 391 + DEBUG reduce by rule 391 + RESOURCE reduce by rule 391 + CPU reduce by rule 391 + LATENCY reduce by rule 391 + EXCEPTION reduce by rule 391 + EOF reduce by rule 391 + + + . error + + + state 481: + + storagedecl : id EQ DOLLAR id . LBRACKET cellcount RBRACKET bitSize aliasing defaults printcell + + LBRACKET shift 571 + + + . error + + + state 482: + + ty : ty . ARROW ty + typebind : tyvarseq tid EQ ty . (reduce by rule 198) + + ARCHITECTURE reduce by rule 198 + END reduce by rule 198 + LOCAL reduce by rule 198 + IN reduce by rule 198 + DATATYPE reduce by rule 198 + TYPE reduce by rule 198 + AND reduce by rule 198 + RPAREN reduce by rule 198 + SEMICOLON reduce by rule 198 + STORAGE reduce by rule 198 + LOCATIONS reduce by rule 198 + ARROW shift 388 + STRUCTURE reduce by rule 198 + FUNCTOR reduce by rule 198 + SIGNATURE reduce by rule 198 + SHARING reduce by rule 198 + INSTRUCTION reduce by rule 198 + VLIW reduce by rule 198 + SUPERSCALAR reduce by rule 198 + FUN reduce by rule 198 + VAL reduce by rule 198 + INCLUDE reduce by rule 198 + OPEN reduce by rule 198 + LITTLE reduce by rule 198 + BIG reduce by rule 198 + PIPELINE reduce by rule 198 + LOWERCASE reduce by rule 198 + UPPERCASE reduce by rule 198 + VERBATIM reduce by rule 198 + RTL reduce by rule 198 + NONFIX reduce by rule 198 + INFIX reduce by rule 198 + INFIXR reduce by rule 198 + DEBUG reduce by rule 198 + RESOURCE reduce by rule 198 + CPU reduce by rule 198 + LATENCY reduce by rule 198 + EXCEPTION reduce by rule 198 + EOF reduce by rule 198 + + + . error + + + state 483: + + typebind : tyvarseq tid . EQ ty + + EQ shift 374 + + + . error + + + state 484: + + tyvars : tyvar COMMA tyvars . (reduce by rule 203) + + RPAREN reduce by rule 203 + + + . error + + + state 485: + + datatypebind : tyvarseq id opcodeencoding fieldty . hasasm EQ consbinds + datatypebind : tyvarseq id opcodeencoding fieldty . hasasm EQ DATATYPE ty + + EQ reduce by rule 132 + DEREF shift 573 + + hasasm goto 572 + + . error + + + state 486: + + fieldty : COLON . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 574 + + . error + + + state 487: + + opcodeencoding : LBRACKET encodingexps . RBRACKET + + RBRACKET shift 575 + + + . error + + + state 488: + + encodingexps : encodingexp . (reduce by rule 137) + encodingexps : encodingexp . COMMA encodingexps + + RBRACKET reduce by rule 137 + COMMA shift 576 + + + . error + + + state 489: + + encodingexp : int . (reduce by rule 139) + encodingexp : int . DOTDOT int + encodingexp : int . int DOTDOT int + + RBRACKET reduce by rule 139 + COMMA reduce by rule 139 + DOTDOT shift 578 + INT shift 64 + + int goto 577 + + . error + + + state 490: + + mymldecl : LOCAL scopeddecls IN scopeddecls END . (reduce by rule 68) + + ARCHITECTURE reduce by rule 68 + END reduce by rule 68 + LOCAL reduce by rule 68 + IN reduce by rule 68 + DATATYPE reduce by rule 68 + TYPE reduce by rule 68 + RPAREN reduce by rule 68 + SEMICOLON reduce by rule 68 + STORAGE reduce by rule 68 + LOCATIONS reduce by rule 68 + STRUCTURE reduce by rule 68 + FUNCTOR reduce by rule 68 + SIGNATURE reduce by rule 68 + SHARING reduce by rule 68 + INSTRUCTION reduce by rule 68 + VLIW reduce by rule 68 + SUPERSCALAR reduce by rule 68 + FUN reduce by rule 68 + VAL reduce by rule 68 + INCLUDE reduce by rule 68 + OPEN reduce by rule 68 + LITTLE reduce by rule 68 + BIG reduce by rule 68 + PIPELINE reduce by rule 68 + LOWERCASE reduce by rule 68 + UPPERCASE reduce by rule 68 + VERBATIM reduce by rule 68 + RTL reduce by rule 68 + NONFIX reduce by rule 68 + INFIX reduce by rule 68 + INFIXR reduce by rule 68 + DEBUG reduce by rule 68 + RESOURCE reduce by rule 68 + CPU reduce by rule 68 + LATENCY reduce by rule 68 + EXCEPTION reduce by rule 68 + EOF reduce by rule 68 + + + . error + + + state 491: + + mymddecl : ARCHITECTURE id EQ STRUCT decls . END + + END shift 579 + + + . error + + + state 492: + + tuplety : appty TIMES tuplety . (reduce by rule 380) + + ARCHITECTURE reduce by rule 380 + END reduce by rule 380 + LOCAL reduce by rule 380 + IN reduce by rule 380 + OF reduce by rule 380 + DATATYPE reduce by rule 380 + TYPE reduce by rule 380 + EQ reduce by rule 380 + AND reduce by rule 380 + LPAREN reduce by rule 380 + RPAREN reduce by rule 380 + RBRACKET reduce by rule 380 + RBRACE reduce by rule 380 + SEMICOLON reduce by rule 380 + LDQUOTE reduce by rule 380 + CELLSET reduce by rule 380 + STORAGE reduce by rule 380 + LOCATIONS reduce by rule 380 + COMMA reduce by rule 380 + COLON reduce by rule 380 + BAR reduce by rule 380 + ARROW reduce by rule 380 + DARROW reduce by rule 380 + THEN reduce by rule 380 + ELSE reduce by rule 380 + STRUCTURE reduce by rule 380 + FUNCTOR reduce by rule 380 + SIGNATURE reduce by rule 380 + WHERE reduce by rule 380 + SHARING reduce by rule 380 + INSTRUCTION reduce by rule 380 + VLIW reduce by rule 380 + SUPERSCALAR reduce by rule 380 + WITHTYPE reduce by rule 380 + FUN reduce by rule 380 + VAL reduce by rule 380 + INCLUDE reduce by rule 380 + OPEN reduce by rule 380 + LITTLE reduce by rule 380 + BIG reduce by rule 380 + PIPELINE reduce by rule 380 + LOWERCASE reduce by rule 380 + UPPERCASE reduce by rule 380 + VERBATIM reduce by rule 380 + RTL reduce by rule 380 + SPAN reduce by rule 380 + DELAYSLOT reduce by rule 380 + NONFIX reduce by rule 380 + INFIX reduce by rule 380 + INFIXR reduce by rule 380 + DEBUG reduce by rule 380 + ASM_COLON reduce by rule 380 + MC_COLON reduce by rule 380 + RTL_COLON reduce by rule 380 + DELAYSLOT_COLON reduce by rule 380 + NULLIFIED_COLON reduce by rule 380 + PADDING_COLON reduce by rule 380 + RESOURCE reduce by rule 380 + CPU reduce by rule 380 + LATENCY reduce by rule 380 + EXCEPTION reduce by rule 380 + ID reduce by rule 380 + SYMBOL reduce by rule 380 + WORD reduce by rule 380 + INT reduce by rule 380 + STRING reduce by rule 380 + EOF reduce by rule 380 + + + . error + + error: state 493: shift/reduce conflict (shift SYMBOL, reduce by rule 379) + error: state 493: shift/reduce conflict (shift ID, reduce by rule 379) + error: state 493: shift/reduce conflict (shift INSTRUCTION, reduce by rule 379) + error: state 493: shift/reduce conflict (shift CELLSET, reduce by rule 379) + + state 493: + + appty : appty . tident + tuplety : appty . TIMES appty + tuplety : appty TIMES appty . (reduce by rule 379) + tuplety : appty . TIMES tuplety + + ARCHITECTURE reduce by rule 379 + END reduce by rule 379 + LOCAL reduce by rule 379 + IN reduce by rule 379 + OF reduce by rule 379 + DATATYPE reduce by rule 379 + TYPE reduce by rule 379 + EQ reduce by rule 379 + TIMES shift 387 + AND reduce by rule 379 + LPAREN reduce by rule 379 + RPAREN reduce by rule 379 + RBRACKET reduce by rule 379 + RBRACE reduce by rule 379 + SEMICOLON reduce by rule 379 + LDQUOTE reduce by rule 379 + CELLSET shift 50 + STORAGE reduce by rule 379 + LOCATIONS reduce by rule 379 + COMMA reduce by rule 379 + COLON reduce by rule 379 + BAR reduce by rule 379 + ARROW reduce by rule 379 + DARROW reduce by rule 379 + BITS shift 246 + THEN reduce by rule 379 + ELSE reduce by rule 379 + STRUCTURE reduce by rule 379 + FUNCTOR reduce by rule 379 + SIGNATURE reduce by rule 379 + WHERE reduce by rule 379 + SHARING reduce by rule 379 + INSTRUCTION shift 245 + CELL shift 244 + VLIW reduce by rule 379 + SUPERSCALAR reduce by rule 379 + WITHTYPE reduce by rule 379 + FUN reduce by rule 379 + VAL reduce by rule 379 + INCLUDE reduce by rule 379 + OPEN reduce by rule 379 + LITTLE reduce by rule 379 + BIG reduce by rule 379 + PIPELINE reduce by rule 379 + LOWERCASE reduce by rule 379 + UPPERCASE reduce by rule 379 + VERBATIM reduce by rule 379 + RTL reduce by rule 379 + SPAN reduce by rule 379 + DELAYSLOT reduce by rule 379 + NONFIX reduce by rule 379 + INFIX reduce by rule 379 + INFIXR reduce by rule 379 + DEBUG reduce by rule 379 + ASM_COLON reduce by rule 379 + MC_COLON reduce by rule 379 + RTL_COLON reduce by rule 379 + DELAYSLOT_COLON reduce by rule 379 + NULLIFIED_COLON reduce by rule 379 + PADDING_COLON reduce by rule 379 + RESOURCE reduce by rule 379 + CPU reduce by rule 379 + LATENCY reduce by rule 379 + EXCEPTION reduce by rule 379 + ID shift 49 + SYMBOL shift 48 + WORD reduce by rule 379 + INT reduce by rule 379 + STRING reduce by rule 379 + EOF reduce by rule 379 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 386 + tpath goto 265 + + . error + + + state 494: + + ty : ty . ARROW ty + ty : ty ARROW ty . (reduce by rule 371) + + ARCHITECTURE reduce by rule 371 + END reduce by rule 371 + LOCAL reduce by rule 371 + IN reduce by rule 371 + OF reduce by rule 371 + DATATYPE reduce by rule 371 + TYPE reduce by rule 371 + EQ reduce by rule 371 + AND reduce by rule 371 + LPAREN reduce by rule 371 + RPAREN reduce by rule 371 + RBRACKET reduce by rule 371 + RBRACE reduce by rule 371 + SEMICOLON reduce by rule 371 + LDQUOTE reduce by rule 371 + CELLSET reduce by rule 371 + STORAGE reduce by rule 371 + LOCATIONS reduce by rule 371 + COMMA reduce by rule 371 + COLON reduce by rule 371 + BAR reduce by rule 371 + ARROW shift 388 + DARROW reduce by rule 371 + THEN reduce by rule 371 + ELSE reduce by rule 371 + STRUCTURE reduce by rule 371 + FUNCTOR reduce by rule 371 + SIGNATURE reduce by rule 371 + WHERE reduce by rule 371 + SHARING reduce by rule 371 + INSTRUCTION reduce by rule 371 + VLIW reduce by rule 371 + SUPERSCALAR reduce by rule 371 + WITHTYPE reduce by rule 371 + FUN reduce by rule 371 + VAL reduce by rule 371 + INCLUDE reduce by rule 371 + OPEN reduce by rule 371 + LITTLE reduce by rule 371 + BIG reduce by rule 371 + PIPELINE reduce by rule 371 + LOWERCASE reduce by rule 371 + UPPERCASE reduce by rule 371 + VERBATIM reduce by rule 371 + RTL reduce by rule 371 + SPAN reduce by rule 371 + DELAYSLOT reduce by rule 371 + NONFIX reduce by rule 371 + INFIX reduce by rule 371 + INFIXR reduce by rule 371 + DEBUG reduce by rule 371 + ASM_COLON reduce by rule 371 + MC_COLON reduce by rule 371 + RTL_COLON reduce by rule 371 + DELAYSLOT_COLON reduce by rule 371 + NULLIFIED_COLON reduce by rule 371 + PADDING_COLON reduce by rule 371 + RESOURCE reduce by rule 371 + CPU reduce by rule 371 + LATENCY reduce by rule 371 + EXCEPTION reduce by rule 371 + ID reduce by rule 371 + SYMBOL reduce by rule 371 + WORD reduce by rule 371 + INT reduce by rule 371 + STRING reduce by rule 371 + EOF reduce by rule 371 + + + . error + + + state 495: + + tpath : tpath DOT tid . (reduce by rule 368) + + ARCHITECTURE reduce by rule 368 + END reduce by rule 368 + LOCAL reduce by rule 368 + IN reduce by rule 368 + OF reduce by rule 368 + DATATYPE reduce by rule 368 + TYPE reduce by rule 368 + EQ reduce by rule 368 + TIMES reduce by rule 368 + AND reduce by rule 368 + LPAREN reduce by rule 368 + RPAREN reduce by rule 368 + RBRACKET reduce by rule 368 + RBRACE reduce by rule 368 + SEMICOLON reduce by rule 368 + LDQUOTE reduce by rule 368 + CELLSET reduce by rule 368 + STORAGE reduce by rule 368 + LOCATIONS reduce by rule 368 + COMMA reduce by rule 368 + COLON reduce by rule 368 + DOT reduce by rule 368 + BAR reduce by rule 368 + ARROW reduce by rule 368 + DARROW reduce by rule 368 + BITS reduce by rule 368 + THEN reduce by rule 368 + ELSE reduce by rule 368 + STRUCTURE reduce by rule 368 + FUNCTOR reduce by rule 368 + SIGNATURE reduce by rule 368 + WHERE reduce by rule 368 + SHARING reduce by rule 368 + INSTRUCTION reduce by rule 368 + CELL reduce by rule 368 + VLIW reduce by rule 368 + SUPERSCALAR reduce by rule 368 + WITHTYPE reduce by rule 368 + FUN reduce by rule 368 + VAL reduce by rule 368 + INCLUDE reduce by rule 368 + OPEN reduce by rule 368 + LITTLE reduce by rule 368 + BIG reduce by rule 368 + PIPELINE reduce by rule 368 + LOWERCASE reduce by rule 368 + UPPERCASE reduce by rule 368 + VERBATIM reduce by rule 368 + RTL reduce by rule 368 + SPAN reduce by rule 368 + DELAYSLOT reduce by rule 368 + NONFIX reduce by rule 368 + INFIX reduce by rule 368 + INFIXR reduce by rule 368 + DEBUG reduce by rule 368 + ASM_COLON reduce by rule 368 + MC_COLON reduce by rule 368 + RTL_COLON reduce by rule 368 + DELAYSLOT_COLON reduce by rule 368 + NULLIFIED_COLON reduce by rule 368 + PADDING_COLON reduce by rule 368 + RESOURCE reduce by rule 368 + CPU reduce by rule 368 + LATENCY reduce by rule 368 + EXCEPTION reduce by rule 368 + ID reduce by rule 368 + SYMBOL reduce by rule 368 + WORD reduce by rule 368 + INT reduce by rule 368 + STRING reduce by rule 368 + EOF reduce by rule 368 + + + . error + + + state 496: + + tpath : tid DOT tid . (reduce by rule 367) + + ARCHITECTURE reduce by rule 367 + END reduce by rule 367 + LOCAL reduce by rule 367 + IN reduce by rule 367 + OF reduce by rule 367 + DATATYPE reduce by rule 367 + TYPE reduce by rule 367 + EQ reduce by rule 367 + TIMES reduce by rule 367 + AND reduce by rule 367 + LPAREN reduce by rule 367 + RPAREN reduce by rule 367 + RBRACKET reduce by rule 367 + RBRACE reduce by rule 367 + SEMICOLON reduce by rule 367 + LDQUOTE reduce by rule 367 + CELLSET reduce by rule 367 + STORAGE reduce by rule 367 + LOCATIONS reduce by rule 367 + COMMA reduce by rule 367 + COLON reduce by rule 367 + DOT reduce by rule 367 + BAR reduce by rule 367 + ARROW reduce by rule 367 + DARROW reduce by rule 367 + BITS reduce by rule 367 + THEN reduce by rule 367 + ELSE reduce by rule 367 + STRUCTURE reduce by rule 367 + FUNCTOR reduce by rule 367 + SIGNATURE reduce by rule 367 + WHERE reduce by rule 367 + SHARING reduce by rule 367 + INSTRUCTION reduce by rule 367 + CELL reduce by rule 367 + VLIW reduce by rule 367 + SUPERSCALAR reduce by rule 367 + WITHTYPE reduce by rule 367 + FUN reduce by rule 367 + VAL reduce by rule 367 + INCLUDE reduce by rule 367 + OPEN reduce by rule 367 + LITTLE reduce by rule 367 + BIG reduce by rule 367 + PIPELINE reduce by rule 367 + LOWERCASE reduce by rule 367 + UPPERCASE reduce by rule 367 + VERBATIM reduce by rule 367 + RTL reduce by rule 367 + SPAN reduce by rule 367 + DELAYSLOT reduce by rule 367 + NONFIX reduce by rule 367 + INFIX reduce by rule 367 + INFIXR reduce by rule 367 + DEBUG reduce by rule 367 + ASM_COLON reduce by rule 367 + MC_COLON reduce by rule 367 + RTL_COLON reduce by rule 367 + DELAYSLOT_COLON reduce by rule 367 + NULLIFIED_COLON reduce by rule 367 + PADDING_COLON reduce by rule 367 + RESOURCE reduce by rule 367 + CPU reduce by rule 367 + LATENCY reduce by rule 367 + EXCEPTION reduce by rule 367 + ID reduce by rule 367 + SYMBOL reduce by rule 367 + WORD reduce by rule 367 + INT reduce by rule 367 + STRING reduce by rule 367 + EOF reduce by rule 367 + + + . error + + + state 497: + + aty : LBRACE labtys RBRACE . (reduce by rule 356) + + ARCHITECTURE reduce by rule 356 + END reduce by rule 356 + LOCAL reduce by rule 356 + IN reduce by rule 356 + OF reduce by rule 356 + DATATYPE reduce by rule 356 + TYPE reduce by rule 356 + EQ reduce by rule 356 + TIMES reduce by rule 356 + AND reduce by rule 356 + LPAREN reduce by rule 356 + RPAREN reduce by rule 356 + RBRACKET reduce by rule 356 + RBRACE reduce by rule 356 + SEMICOLON reduce by rule 356 + LDQUOTE reduce by rule 356 + CELLSET reduce by rule 356 + STORAGE reduce by rule 356 + LOCATIONS reduce by rule 356 + COMMA reduce by rule 356 + COLON reduce by rule 356 + BAR reduce by rule 356 + ARROW reduce by rule 356 + DARROW reduce by rule 356 + BITS reduce by rule 356 + THEN reduce by rule 356 + ELSE reduce by rule 356 + STRUCTURE reduce by rule 356 + FUNCTOR reduce by rule 356 + SIGNATURE reduce by rule 356 + WHERE reduce by rule 356 + SHARING reduce by rule 356 + INSTRUCTION reduce by rule 356 + CELL reduce by rule 356 + VLIW reduce by rule 356 + SUPERSCALAR reduce by rule 356 + WITHTYPE reduce by rule 356 + FUN reduce by rule 356 + VAL reduce by rule 356 + INCLUDE reduce by rule 356 + OPEN reduce by rule 356 + LITTLE reduce by rule 356 + BIG reduce by rule 356 + PIPELINE reduce by rule 356 + LOWERCASE reduce by rule 356 + UPPERCASE reduce by rule 356 + VERBATIM reduce by rule 356 + RTL reduce by rule 356 + SPAN reduce by rule 356 + DELAYSLOT reduce by rule 356 + NONFIX reduce by rule 356 + INFIX reduce by rule 356 + INFIXR reduce by rule 356 + DEBUG reduce by rule 356 + ASM_COLON reduce by rule 356 + MC_COLON reduce by rule 356 + RTL_COLON reduce by rule 356 + DELAYSLOT_COLON reduce by rule 356 + NULLIFIED_COLON reduce by rule 356 + PADDING_COLON reduce by rule 356 + RESOURCE reduce by rule 356 + CPU reduce by rule 356 + LATENCY reduce by rule 356 + EXCEPTION reduce by rule 356 + ID reduce by rule 356 + SYMBOL reduce by rule 356 + WORD reduce by rule 356 + INT reduce by rule 356 + STRING reduce by rule 356 + EOF reduce by rule 356 + + + . error + + + state 498: + + labtys1 : labty COMMA . labtys1 + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 395 + labty goto 394 + labtys1 goto 580 + + . error + + + state 499: + + labty : id COLON . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 581 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 500: + + appty : LPAREN tys2 RPAREN . tident + + CELLSET shift 50 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 582 + tpath goto 265 + + . error + + + state 501: + + tys2 : ty COMMA . ty + tys2 : ty COMMA . tys2 + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 584 + aty goto 263 + appty goto 262 + tys2 goto 583 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 502: + + aty : LPAREN ty RPAREN . (reduce by rule 355) + + ARCHITECTURE reduce by rule 355 + END reduce by rule 355 + LOCAL reduce by rule 355 + IN reduce by rule 355 + OF reduce by rule 355 + DATATYPE reduce by rule 355 + TYPE reduce by rule 355 + EQ reduce by rule 355 + TIMES reduce by rule 355 + AND reduce by rule 355 + LPAREN reduce by rule 355 + RPAREN reduce by rule 355 + RBRACKET reduce by rule 355 + RBRACE reduce by rule 355 + SEMICOLON reduce by rule 355 + LDQUOTE reduce by rule 355 + CELLSET reduce by rule 355 + STORAGE reduce by rule 355 + LOCATIONS reduce by rule 355 + COMMA reduce by rule 355 + COLON reduce by rule 355 + BAR reduce by rule 355 + ARROW reduce by rule 355 + DARROW reduce by rule 355 + BITS reduce by rule 355 + THEN reduce by rule 355 + ELSE reduce by rule 355 + STRUCTURE reduce by rule 355 + FUNCTOR reduce by rule 355 + SIGNATURE reduce by rule 355 + WHERE reduce by rule 355 + SHARING reduce by rule 355 + INSTRUCTION reduce by rule 355 + CELL reduce by rule 355 + VLIW reduce by rule 355 + SUPERSCALAR reduce by rule 355 + WITHTYPE reduce by rule 355 + FUN reduce by rule 355 + VAL reduce by rule 355 + INCLUDE reduce by rule 355 + OPEN reduce by rule 355 + LITTLE reduce by rule 355 + BIG reduce by rule 355 + PIPELINE reduce by rule 355 + LOWERCASE reduce by rule 355 + UPPERCASE reduce by rule 355 + VERBATIM reduce by rule 355 + RTL reduce by rule 355 + SPAN reduce by rule 355 + DELAYSLOT reduce by rule 355 + NONFIX reduce by rule 355 + INFIX reduce by rule 355 + INFIXR reduce by rule 355 + DEBUG reduce by rule 355 + ASM_COLON reduce by rule 355 + MC_COLON reduce by rule 355 + RTL_COLON reduce by rule 355 + DELAYSLOT_COLON reduce by rule 355 + NULLIFIED_COLON reduce by rule 355 + PADDING_COLON reduce by rule 355 + RESOURCE reduce by rule 355 + CPU reduce by rule 355 + LATENCY reduce by rule 355 + EXCEPTION reduce by rule 355 + ID reduce by rule 355 + SYMBOL reduce by rule 355 + WORD reduce by rule 355 + INT reduce by rule 355 + STRING reduce by rule 355 + EOF reduce by rule 355 + + + . error + + + state 503: + + resources : resource . (reduce by rule 35) + resources : resource . COMMA resources + + RBRACKET reduce by rule 35 + COMMA shift 585 + + + . error + + + state 504: + + cpubind : id aliases int LBRACKET resources . RBRACKET + + RBRACKET shift 586 + + + . error + + + state 505: + + resource : int . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 587 + + . error + + + state 506: + + resource : id . (reduce by rule 38) + + RBRACKET reduce by rule 38 + COMMA reduce by rule 38 + + + . error + + + state 507: + + exp : exp HANDLE clauses . (reduce by rule 278) + + ARCHITECTURE reduce by rule 278 + END reduce by rule 278 + LOCAL reduce by rule 278 + IN reduce by rule 278 + OF reduce by rule 278 + DATATYPE reduce by rule 278 + TYPE reduce by rule 278 + AND reduce by rule 278 + LPAREN reduce by rule 278 + RPAREN reduce by rule 278 + RBRACKET reduce by rule 278 + RBRACE reduce by rule 278 + SEMICOLON reduce by rule 278 + RMETA reduce by rule 278 + CELLSET reduce by rule 278 + STORAGE reduce by rule 278 + LOCATIONS reduce by rule 278 + COMMA reduce by rule 278 + COLON reduce by rule 278 + BAR reduce by rule 278 + DARROW reduce by rule 278 + THEN reduce by rule 278 + ELSE reduce by rule 278 + HANDLE reduce by rule 278 + STRUCTURE reduce by rule 278 + FUNCTOR reduce by rule 278 + SIGNATURE reduce by rule 278 + SHARING reduce by rule 278 + INSTRUCTION reduce by rule 278 + VLIW reduce by rule 278 + SUPERSCALAR reduce by rule 278 + WITHTYPE reduce by rule 278 + FUN reduce by rule 278 + VAL reduce by rule 278 + INCLUDE reduce by rule 278 + OPEN reduce by rule 278 + LITTLE reduce by rule 278 + BIG reduce by rule 278 + PIPELINE reduce by rule 278 + LOWERCASE reduce by rule 278 + UPPERCASE reduce by rule 278 + VERBATIM reduce by rule 278 + RTL reduce by rule 278 + SPAN reduce by rule 278 + DELAYSLOT reduce by rule 278 + NONFIX reduce by rule 278 + INFIX reduce by rule 278 + INFIXR reduce by rule 278 + DEBUG reduce by rule 278 + ASM_COLON reduce by rule 278 + MC_COLON reduce by rule 278 + RTL_COLON reduce by rule 278 + DELAYSLOT_COLON reduce by rule 278 + NULLIFIED_COLON reduce by rule 278 + PADDING_COLON reduce by rule 278 + RESOURCE reduce by rule 278 + CPU reduce by rule 278 + LATENCY reduce by rule 278 + EXCEPTION reduce by rule 278 + ID reduce by rule 278 + SYMBOL reduce by rule 278 + WORD reduce by rule 278 + INT reduce by rule 278 + EOF reduce by rule 278 + + + . error + + + state 508: + + aexp2 : aexp2 AT LBRACKET . slices RBRACKET + + INT shift 64 + + int goto 590 + slice goto 589 + slices goto 588 + + . error + + + state 509: + + aexp : sym CONCAT LBRACKET . exps RBRACKET + aexp : sym CONCAT LBRACKET . exps RBRACKET CONCAT sym + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + RBRACKET reduce by rule 288 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 424 + exps goto 591 + exps1 goto 422 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 510: + + aexp : LET decls IN . expseq END + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 593 + expseq goto 592 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 511: + + exp : IF typedexp THEN . typedexp ELSE exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 594 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 512: + + clauses : clause BAR . clauses + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 413 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + clause goto 412 + clauses goto 595 + True goto 74 + False goto 73 + + . error + + + state 513: + + clause : typedpat guard . cont DARROW exp + + DARROW reduce by rule 337 + EXCEPTION shift 460 + + cont goto 596 + + . error + + + state 514: + + guard : WHERE . typedexp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 597 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 515: + + asms : asm asms . (reduce by rule 189) + + RDQUOTE reduce by rule 189 + + + . error + + error: state 516: shift/reduce conflict (shift LDQUOTE, reduce by rule 186) + + state 516: + + asm_strings : LDQUOTE asms RDQUOTE . (reduce by rule 186) + asm_strings : LDQUOTE asms RDQUOTE . asm_strings + + ARCHITECTURE reduce by rule 186 + END reduce by rule 186 + LOCAL reduce by rule 186 + IN reduce by rule 186 + OF reduce by rule 186 + DATATYPE reduce by rule 186 + TYPE reduce by rule 186 + EQ reduce by rule 186 + DOLLAR reduce by rule 186 + TIMES reduce by rule 186 + AND reduce by rule 186 + DEREF reduce by rule 186 + NOT reduce by rule 186 + LLBRACKET reduce by rule 186 + LHASHBRACKET reduce by rule 186 + LPAREN reduce by rule 186 + RPAREN reduce by rule 186 + LBRACKET reduce by rule 186 + RBRACKET reduce by rule 186 + LBRACE reduce by rule 186 + RBRACE reduce by rule 186 + SEMICOLON reduce by rule 186 + LDQUOTE shift 293 + RMETA reduce by rule 186 + CELLSET reduce by rule 186 + STORAGE reduce by rule 186 + LOCATIONS reduce by rule 186 + HASH reduce by rule 186 + COMMA reduce by rule 186 + COLON reduce by rule 186 + AT reduce by rule 186 + BAR reduce by rule 186 + DARROW reduce by rule 186 + THEN reduce by rule 186 + ELSE reduce by rule 186 + TRUE reduce by rule 186 + FALSE reduce by rule 186 + HANDLE reduce by rule 186 + LET reduce by rule 186 + STRUCTURE reduce by rule 186 + FUNCTOR reduce by rule 186 + SIGNATURE reduce by rule 186 + SHARING reduce by rule 186 + INSTRUCTION reduce by rule 186 + VLIW reduce by rule 186 + SUPERSCALAR reduce by rule 186 + WITHTYPE reduce by rule 186 + FUN reduce by rule 186 + VAL reduce by rule 186 + INCLUDE reduce by rule 186 + OPEN reduce by rule 186 + OP reduce by rule 186 + LITTLE reduce by rule 186 + BIG reduce by rule 186 + PIPELINE reduce by rule 186 + LOWERCASE reduce by rule 186 + UPPERCASE reduce by rule 186 + VERBATIM reduce by rule 186 + RTL reduce by rule 186 + SPAN reduce by rule 186 + DELAYSLOT reduce by rule 186 + ALWAYS reduce by rule 186 + NEVER reduce by rule 186 + NONFIX reduce by rule 186 + INFIX reduce by rule 186 + INFIXR reduce by rule 186 + DEBUG reduce by rule 186 + ASM_COLON reduce by rule 186 + MC_COLON reduce by rule 186 + RTL_COLON reduce by rule 186 + DELAYSLOT_COLON reduce by rule 186 + NULLIFIED_COLON reduce by rule 186 + PADDING_COLON reduce by rule 186 + RESOURCE reduce by rule 186 + CPU reduce by rule 186 + LATENCY reduce by rule 186 + EXCEPTION reduce by rule 186 + ID reduce by rule 186 + SYMBOL reduce by rule 186 + WORD reduce by rule 186 + INT reduce by rule 186 + INTINF reduce by rule 186 + REAL reduce by rule 186 + STRING reduce by rule 186 + CHAR reduce by rule 186 + EOF reduce by rule 186 + + asm_strings goto 598 + + . error + + + state 517: + + exp : exp . HANDLE clauses + asm : LMETA exp . RMETA + + RMETA shift 599 + HANDLE shift 402 + + + . error + + + state 518: + + labexps : labexp COMMA . labexps + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 421 + labexps goto 600 + labexp goto 418 + + . error + + + state 519: + + aexp : LBRACE labexps0 RBRACE . (reduce by rule 253) + + ARCHITECTURE reduce by rule 253 + END reduce by rule 253 + LOCAL reduce by rule 253 + IN reduce by rule 253 + OF reduce by rule 253 + DATATYPE reduce by rule 253 + TYPE reduce by rule 253 + EQ reduce by rule 253 + DOLLAR reduce by rule 253 + TIMES reduce by rule 253 + AND reduce by rule 253 + DEREF reduce by rule 253 + NOT reduce by rule 253 + LLBRACKET reduce by rule 253 + LHASHBRACKET reduce by rule 253 + LPAREN reduce by rule 253 + RPAREN reduce by rule 253 + LBRACKET reduce by rule 253 + RBRACKET reduce by rule 253 + LBRACE reduce by rule 253 + RBRACE reduce by rule 253 + SEMICOLON reduce by rule 253 + LDQUOTE reduce by rule 253 + RMETA reduce by rule 253 + CELLSET reduce by rule 253 + STORAGE reduce by rule 253 + LOCATIONS reduce by rule 253 + HASH reduce by rule 253 + COMMA reduce by rule 253 + COLON reduce by rule 253 + AT reduce by rule 253 + BAR reduce by rule 253 + DARROW reduce by rule 253 + THEN reduce by rule 253 + ELSE reduce by rule 253 + TRUE reduce by rule 253 + FALSE reduce by rule 253 + HANDLE reduce by rule 253 + LET reduce by rule 253 + STRUCTURE reduce by rule 253 + FUNCTOR reduce by rule 253 + SIGNATURE reduce by rule 253 + SHARING reduce by rule 253 + INSTRUCTION reduce by rule 253 + VLIW reduce by rule 253 + SUPERSCALAR reduce by rule 253 + WITHTYPE reduce by rule 253 + FUN reduce by rule 253 + VAL reduce by rule 253 + INCLUDE reduce by rule 253 + OPEN reduce by rule 253 + OP reduce by rule 253 + LITTLE reduce by rule 253 + BIG reduce by rule 253 + PIPELINE reduce by rule 253 + LOWERCASE reduce by rule 253 + UPPERCASE reduce by rule 253 + VERBATIM reduce by rule 253 + RTL reduce by rule 253 + SPAN reduce by rule 253 + DELAYSLOT reduce by rule 253 + ALWAYS reduce by rule 253 + NEVER reduce by rule 253 + NONFIX reduce by rule 253 + INFIX reduce by rule 253 + INFIXR reduce by rule 253 + DEBUG reduce by rule 253 + ASM_COLON reduce by rule 253 + MC_COLON reduce by rule 253 + RTL_COLON reduce by rule 253 + DELAYSLOT_COLON reduce by rule 253 + NULLIFIED_COLON reduce by rule 253 + PADDING_COLON reduce by rule 253 + RESOURCE reduce by rule 253 + CPU reduce by rule 253 + LATENCY reduce by rule 253 + EXCEPTION reduce by rule 253 + ID reduce by rule 253 + SYMBOL reduce by rule 253 + WORD reduce by rule 253 + INT reduce by rule 253 + INTINF reduce by rule 253 + REAL reduce by rule 253 + STRING reduce by rule 253 + CHAR reduce by rule 253 + EOF reduce by rule 253 + + + . error + + + state 520: + + labexp : id EQ . typedexp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 601 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 521: + + aexp : LBRACKET exps RBRACKET . (reduce by rule 251) + aexp : LBRACKET exps RBRACKET . CONCAT sym + + ARCHITECTURE reduce by rule 251 + END reduce by rule 251 + LOCAL reduce by rule 251 + IN reduce by rule 251 + OF reduce by rule 251 + DATATYPE reduce by rule 251 + TYPE reduce by rule 251 + EQ reduce by rule 251 + DOLLAR reduce by rule 251 + TIMES reduce by rule 251 + AND reduce by rule 251 + DEREF reduce by rule 251 + NOT reduce by rule 251 + CONCAT shift 602 + LLBRACKET reduce by rule 251 + LHASHBRACKET reduce by rule 251 + LPAREN reduce by rule 251 + RPAREN reduce by rule 251 + LBRACKET reduce by rule 251 + RBRACKET reduce by rule 251 + LBRACE reduce by rule 251 + RBRACE reduce by rule 251 + SEMICOLON reduce by rule 251 + LDQUOTE reduce by rule 251 + RMETA reduce by rule 251 + CELLSET reduce by rule 251 + STORAGE reduce by rule 251 + LOCATIONS reduce by rule 251 + HASH reduce by rule 251 + COMMA reduce by rule 251 + COLON reduce by rule 251 + AT reduce by rule 251 + BAR reduce by rule 251 + DARROW reduce by rule 251 + THEN reduce by rule 251 + ELSE reduce by rule 251 + TRUE reduce by rule 251 + FALSE reduce by rule 251 + HANDLE reduce by rule 251 + LET reduce by rule 251 + STRUCTURE reduce by rule 251 + FUNCTOR reduce by rule 251 + SIGNATURE reduce by rule 251 + SHARING reduce by rule 251 + INSTRUCTION reduce by rule 251 + VLIW reduce by rule 251 + SUPERSCALAR reduce by rule 251 + WITHTYPE reduce by rule 251 + FUN reduce by rule 251 + VAL reduce by rule 251 + INCLUDE reduce by rule 251 + OPEN reduce by rule 251 + OP reduce by rule 251 + LITTLE reduce by rule 251 + BIG reduce by rule 251 + PIPELINE reduce by rule 251 + LOWERCASE reduce by rule 251 + UPPERCASE reduce by rule 251 + VERBATIM reduce by rule 251 + RTL reduce by rule 251 + SPAN reduce by rule 251 + DELAYSLOT reduce by rule 251 + ALWAYS reduce by rule 251 + NEVER reduce by rule 251 + NONFIX reduce by rule 251 + INFIX reduce by rule 251 + INFIXR reduce by rule 251 + DEBUG reduce by rule 251 + ASM_COLON reduce by rule 251 + MC_COLON reduce by rule 251 + RTL_COLON reduce by rule 251 + DELAYSLOT_COLON reduce by rule 251 + NULLIFIED_COLON reduce by rule 251 + PADDING_COLON reduce by rule 251 + RESOURCE reduce by rule 251 + CPU reduce by rule 251 + LATENCY reduce by rule 251 + EXCEPTION reduce by rule 251 + ID reduce by rule 251 + SYMBOL reduce by rule 251 + WORD reduce by rule 251 + INT reduce by rule 251 + INTINF reduce by rule 251 + REAL reduce by rule 251 + STRING reduce by rule 251 + CHAR reduce by rule 251 + EOF reduce by rule 251 + + + . error + + + state 522: + + exps1 : typedexp COMMA . exps1 + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 424 + exps1 goto 603 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 523: + + aexp : LPAREN expseq2 RPAREN . (reduce by rule 250) + + ARCHITECTURE reduce by rule 250 + END reduce by rule 250 + LOCAL reduce by rule 250 + IN reduce by rule 250 + OF reduce by rule 250 + DATATYPE reduce by rule 250 + TYPE reduce by rule 250 + EQ reduce by rule 250 + DOLLAR reduce by rule 250 + TIMES reduce by rule 250 + AND reduce by rule 250 + DEREF reduce by rule 250 + NOT reduce by rule 250 + LLBRACKET reduce by rule 250 + LHASHBRACKET reduce by rule 250 + LPAREN reduce by rule 250 + RPAREN reduce by rule 250 + LBRACKET reduce by rule 250 + RBRACKET reduce by rule 250 + LBRACE reduce by rule 250 + RBRACE reduce by rule 250 + SEMICOLON reduce by rule 250 + LDQUOTE reduce by rule 250 + RMETA reduce by rule 250 + CELLSET reduce by rule 250 + STORAGE reduce by rule 250 + LOCATIONS reduce by rule 250 + HASH reduce by rule 250 + COMMA reduce by rule 250 + COLON reduce by rule 250 + AT reduce by rule 250 + BAR reduce by rule 250 + DARROW reduce by rule 250 + THEN reduce by rule 250 + ELSE reduce by rule 250 + TRUE reduce by rule 250 + FALSE reduce by rule 250 + HANDLE reduce by rule 250 + LET reduce by rule 250 + STRUCTURE reduce by rule 250 + FUNCTOR reduce by rule 250 + SIGNATURE reduce by rule 250 + SHARING reduce by rule 250 + INSTRUCTION reduce by rule 250 + VLIW reduce by rule 250 + SUPERSCALAR reduce by rule 250 + WITHTYPE reduce by rule 250 + FUN reduce by rule 250 + VAL reduce by rule 250 + INCLUDE reduce by rule 250 + OPEN reduce by rule 250 + OP reduce by rule 250 + LITTLE reduce by rule 250 + BIG reduce by rule 250 + PIPELINE reduce by rule 250 + LOWERCASE reduce by rule 250 + UPPERCASE reduce by rule 250 + VERBATIM reduce by rule 250 + RTL reduce by rule 250 + SPAN reduce by rule 250 + DELAYSLOT reduce by rule 250 + ALWAYS reduce by rule 250 + NEVER reduce by rule 250 + NONFIX reduce by rule 250 + INFIX reduce by rule 250 + INFIXR reduce by rule 250 + DEBUG reduce by rule 250 + ASM_COLON reduce by rule 250 + MC_COLON reduce by rule 250 + RTL_COLON reduce by rule 250 + DELAYSLOT_COLON reduce by rule 250 + NULLIFIED_COLON reduce by rule 250 + PADDING_COLON reduce by rule 250 + RESOURCE reduce by rule 250 + CPU reduce by rule 250 + LATENCY reduce by rule 250 + EXCEPTION reduce by rule 250 + ID reduce by rule 250 + SYMBOL reduce by rule 250 + WORD reduce by rule 250 + INT reduce by rule 250 + INTINF reduce by rule 250 + REAL reduce by rule 250 + STRING reduce by rule 250 + CHAR reduce by rule 250 + EOF reduce by rule 250 + + + . error + + + state 524: + + aexp : LPAREN exps2 RPAREN . (reduce by rule 249) + + ARCHITECTURE reduce by rule 249 + END reduce by rule 249 + LOCAL reduce by rule 249 + IN reduce by rule 249 + OF reduce by rule 249 + DATATYPE reduce by rule 249 + TYPE reduce by rule 249 + EQ reduce by rule 249 + DOLLAR reduce by rule 249 + TIMES reduce by rule 249 + AND reduce by rule 249 + DEREF reduce by rule 249 + NOT reduce by rule 249 + LLBRACKET reduce by rule 249 + LHASHBRACKET reduce by rule 249 + LPAREN reduce by rule 249 + RPAREN reduce by rule 249 + LBRACKET reduce by rule 249 + RBRACKET reduce by rule 249 + LBRACE reduce by rule 249 + RBRACE reduce by rule 249 + SEMICOLON reduce by rule 249 + LDQUOTE reduce by rule 249 + RMETA reduce by rule 249 + CELLSET reduce by rule 249 + STORAGE reduce by rule 249 + LOCATIONS reduce by rule 249 + HASH reduce by rule 249 + COMMA reduce by rule 249 + COLON reduce by rule 249 + AT reduce by rule 249 + BAR reduce by rule 249 + DARROW reduce by rule 249 + THEN reduce by rule 249 + ELSE reduce by rule 249 + TRUE reduce by rule 249 + FALSE reduce by rule 249 + HANDLE reduce by rule 249 + LET reduce by rule 249 + STRUCTURE reduce by rule 249 + FUNCTOR reduce by rule 249 + SIGNATURE reduce by rule 249 + SHARING reduce by rule 249 + INSTRUCTION reduce by rule 249 + VLIW reduce by rule 249 + SUPERSCALAR reduce by rule 249 + WITHTYPE reduce by rule 249 + FUN reduce by rule 249 + VAL reduce by rule 249 + INCLUDE reduce by rule 249 + OPEN reduce by rule 249 + OP reduce by rule 249 + LITTLE reduce by rule 249 + BIG reduce by rule 249 + PIPELINE reduce by rule 249 + LOWERCASE reduce by rule 249 + UPPERCASE reduce by rule 249 + VERBATIM reduce by rule 249 + RTL reduce by rule 249 + SPAN reduce by rule 249 + DELAYSLOT reduce by rule 249 + ALWAYS reduce by rule 249 + NEVER reduce by rule 249 + NONFIX reduce by rule 249 + INFIX reduce by rule 249 + INFIXR reduce by rule 249 + DEBUG reduce by rule 249 + ASM_COLON reduce by rule 249 + MC_COLON reduce by rule 249 + RTL_COLON reduce by rule 249 + DELAYSLOT_COLON reduce by rule 249 + NULLIFIED_COLON reduce by rule 249 + PADDING_COLON reduce by rule 249 + RESOURCE reduce by rule 249 + CPU reduce by rule 249 + LATENCY reduce by rule 249 + EXCEPTION reduce by rule 249 + ID reduce by rule 249 + SYMBOL reduce by rule 249 + WORD reduce by rule 249 + INT reduce by rule 249 + INTINF reduce by rule 249 + REAL reduce by rule 249 + STRING reduce by rule 249 + CHAR reduce by rule 249 + EOF reduce by rule 249 + + + . error + + + state 525: + + exps2 : typedexp COMMA . exps1 + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 424 + exps1 goto 604 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 526: + + expseq2 : typedexp SEMICOLON . expseq + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 593 + expseq goto 605 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 527: + + aexp : LPAREN typedexp RPAREN . (reduce by rule 248) + + ARCHITECTURE reduce by rule 248 + END reduce by rule 248 + LOCAL reduce by rule 248 + IN reduce by rule 248 + OF reduce by rule 248 + DATATYPE reduce by rule 248 + TYPE reduce by rule 248 + EQ reduce by rule 248 + DOLLAR reduce by rule 248 + TIMES reduce by rule 248 + AND reduce by rule 248 + DEREF reduce by rule 248 + NOT reduce by rule 248 + LLBRACKET reduce by rule 248 + LHASHBRACKET reduce by rule 248 + LPAREN reduce by rule 248 + RPAREN reduce by rule 248 + LBRACKET reduce by rule 248 + RBRACKET reduce by rule 248 + LBRACE reduce by rule 248 + RBRACE reduce by rule 248 + SEMICOLON reduce by rule 248 + LDQUOTE reduce by rule 248 + RMETA reduce by rule 248 + CELLSET reduce by rule 248 + STORAGE reduce by rule 248 + LOCATIONS reduce by rule 248 + HASH reduce by rule 248 + COMMA reduce by rule 248 + COLON reduce by rule 248 + AT reduce by rule 248 + BAR reduce by rule 248 + DARROW reduce by rule 248 + THEN reduce by rule 248 + ELSE reduce by rule 248 + TRUE reduce by rule 248 + FALSE reduce by rule 248 + HANDLE reduce by rule 248 + LET reduce by rule 248 + STRUCTURE reduce by rule 248 + FUNCTOR reduce by rule 248 + SIGNATURE reduce by rule 248 + SHARING reduce by rule 248 + INSTRUCTION reduce by rule 248 + VLIW reduce by rule 248 + SUPERSCALAR reduce by rule 248 + WITHTYPE reduce by rule 248 + FUN reduce by rule 248 + VAL reduce by rule 248 + INCLUDE reduce by rule 248 + OPEN reduce by rule 248 + OP reduce by rule 248 + LITTLE reduce by rule 248 + BIG reduce by rule 248 + PIPELINE reduce by rule 248 + LOWERCASE reduce by rule 248 + UPPERCASE reduce by rule 248 + VERBATIM reduce by rule 248 + RTL reduce by rule 248 + SPAN reduce by rule 248 + DELAYSLOT reduce by rule 248 + ALWAYS reduce by rule 248 + NEVER reduce by rule 248 + NONFIX reduce by rule 248 + INFIX reduce by rule 248 + INFIXR reduce by rule 248 + DEBUG reduce by rule 248 + ASM_COLON reduce by rule 248 + MC_COLON reduce by rule 248 + RTL_COLON reduce by rule 248 + DELAYSLOT_COLON reduce by rule 248 + NULLIFIED_COLON reduce by rule 248 + PADDING_COLON reduce by rule 248 + RESOURCE reduce by rule 248 + CPU reduce by rule 248 + LATENCY reduce by rule 248 + EXCEPTION reduce by rule 248 + ID reduce by rule 248 + SYMBOL reduce by rule 248 + WORD reduce by rule 248 + INT reduce by rule 248 + INTINF reduce by rule 248 + REAL reduce by rule 248 + STRING reduce by rule 248 + CHAR reduce by rule 248 + EOF reduce by rule 248 + + + . error + + + state 528: + + aexp : LPAREN symb RPAREN . (reduce by rule 245) + + ARCHITECTURE reduce by rule 245 + END reduce by rule 245 + LOCAL reduce by rule 245 + IN reduce by rule 245 + OF reduce by rule 245 + DATATYPE reduce by rule 245 + TYPE reduce by rule 245 + EQ reduce by rule 245 + DOLLAR reduce by rule 245 + TIMES reduce by rule 245 + AND reduce by rule 245 + DEREF reduce by rule 245 + NOT reduce by rule 245 + LLBRACKET reduce by rule 245 + LHASHBRACKET reduce by rule 245 + LPAREN reduce by rule 245 + RPAREN reduce by rule 245 + LBRACKET reduce by rule 245 + RBRACKET reduce by rule 245 + LBRACE reduce by rule 245 + RBRACE reduce by rule 245 + SEMICOLON reduce by rule 245 + LDQUOTE reduce by rule 245 + RMETA reduce by rule 245 + CELLSET reduce by rule 245 + STORAGE reduce by rule 245 + LOCATIONS reduce by rule 245 + HASH reduce by rule 245 + COMMA reduce by rule 245 + COLON reduce by rule 245 + AT reduce by rule 245 + BAR reduce by rule 245 + DARROW reduce by rule 245 + THEN reduce by rule 245 + ELSE reduce by rule 245 + TRUE reduce by rule 245 + FALSE reduce by rule 245 + HANDLE reduce by rule 245 + LET reduce by rule 245 + STRUCTURE reduce by rule 245 + FUNCTOR reduce by rule 245 + SIGNATURE reduce by rule 245 + SHARING reduce by rule 245 + INSTRUCTION reduce by rule 245 + VLIW reduce by rule 245 + SUPERSCALAR reduce by rule 245 + WITHTYPE reduce by rule 245 + FUN reduce by rule 245 + VAL reduce by rule 245 + INCLUDE reduce by rule 245 + OPEN reduce by rule 245 + OP reduce by rule 245 + LITTLE reduce by rule 245 + BIG reduce by rule 245 + PIPELINE reduce by rule 245 + LOWERCASE reduce by rule 245 + UPPERCASE reduce by rule 245 + VERBATIM reduce by rule 245 + RTL reduce by rule 245 + SPAN reduce by rule 245 + DELAYSLOT reduce by rule 245 + ALWAYS reduce by rule 245 + NEVER reduce by rule 245 + NONFIX reduce by rule 245 + INFIX reduce by rule 245 + INFIXR reduce by rule 245 + DEBUG reduce by rule 245 + ASM_COLON reduce by rule 245 + MC_COLON reduce by rule 245 + RTL_COLON reduce by rule 245 + DELAYSLOT_COLON reduce by rule 245 + NULLIFIED_COLON reduce by rule 245 + PADDING_COLON reduce by rule 245 + RESOURCE reduce by rule 245 + CPU reduce by rule 245 + LATENCY reduce by rule 245 + EXCEPTION reduce by rule 245 + ID reduce by rule 245 + SYMBOL reduce by rule 245 + WORD reduce by rule 245 + INT reduce by rule 245 + INTINF reduce by rule 245 + REAL reduce by rule 245 + STRING reduce by rule 245 + CHAR reduce by rule 245 + EOF reduce by rule 245 + + + . error + + + state 529: + + aexp : LHASHBRACKET exps RBRACKET . (reduce by rule 252) + + ARCHITECTURE reduce by rule 252 + END reduce by rule 252 + LOCAL reduce by rule 252 + IN reduce by rule 252 + OF reduce by rule 252 + DATATYPE reduce by rule 252 + TYPE reduce by rule 252 + EQ reduce by rule 252 + DOLLAR reduce by rule 252 + TIMES reduce by rule 252 + AND reduce by rule 252 + DEREF reduce by rule 252 + NOT reduce by rule 252 + LLBRACKET reduce by rule 252 + LHASHBRACKET reduce by rule 252 + LPAREN reduce by rule 252 + RPAREN reduce by rule 252 + LBRACKET reduce by rule 252 + RBRACKET reduce by rule 252 + LBRACE reduce by rule 252 + RBRACE reduce by rule 252 + SEMICOLON reduce by rule 252 + LDQUOTE reduce by rule 252 + RMETA reduce by rule 252 + CELLSET reduce by rule 252 + STORAGE reduce by rule 252 + LOCATIONS reduce by rule 252 + HASH reduce by rule 252 + COMMA reduce by rule 252 + COLON reduce by rule 252 + AT reduce by rule 252 + BAR reduce by rule 252 + DARROW reduce by rule 252 + THEN reduce by rule 252 + ELSE reduce by rule 252 + TRUE reduce by rule 252 + FALSE reduce by rule 252 + HANDLE reduce by rule 252 + LET reduce by rule 252 + STRUCTURE reduce by rule 252 + FUNCTOR reduce by rule 252 + SIGNATURE reduce by rule 252 + SHARING reduce by rule 252 + INSTRUCTION reduce by rule 252 + VLIW reduce by rule 252 + SUPERSCALAR reduce by rule 252 + WITHTYPE reduce by rule 252 + FUN reduce by rule 252 + VAL reduce by rule 252 + INCLUDE reduce by rule 252 + OPEN reduce by rule 252 + OP reduce by rule 252 + LITTLE reduce by rule 252 + BIG reduce by rule 252 + PIPELINE reduce by rule 252 + LOWERCASE reduce by rule 252 + UPPERCASE reduce by rule 252 + VERBATIM reduce by rule 252 + RTL reduce by rule 252 + SPAN reduce by rule 252 + DELAYSLOT reduce by rule 252 + ALWAYS reduce by rule 252 + NEVER reduce by rule 252 + NONFIX reduce by rule 252 + INFIX reduce by rule 252 + INFIXR reduce by rule 252 + DEBUG reduce by rule 252 + ASM_COLON reduce by rule 252 + MC_COLON reduce by rule 252 + RTL_COLON reduce by rule 252 + DELAYSLOT_COLON reduce by rule 252 + NULLIFIED_COLON reduce by rule 252 + PADDING_COLON reduce by rule 252 + RESOURCE reduce by rule 252 + CPU reduce by rule 252 + LATENCY reduce by rule 252 + EXCEPTION reduce by rule 252 + ID reduce by rule 252 + SYMBOL reduce by rule 252 + WORD reduce by rule 252 + INT reduce by rule 252 + INTINF reduce by rule 252 + REAL reduce by rule 252 + STRING reduce by rule 252 + CHAR reduce by rule 252 + EOF reduce by rule 252 + + + . error + + + state 530: + + aexp : LLBRACKET rtlterms RRBRACKET . (reduce by rule 255) + + ARCHITECTURE reduce by rule 255 + END reduce by rule 255 + LOCAL reduce by rule 255 + IN reduce by rule 255 + OF reduce by rule 255 + DATATYPE reduce by rule 255 + TYPE reduce by rule 255 + EQ reduce by rule 255 + DOLLAR reduce by rule 255 + TIMES reduce by rule 255 + AND reduce by rule 255 + DEREF reduce by rule 255 + NOT reduce by rule 255 + LLBRACKET reduce by rule 255 + LHASHBRACKET reduce by rule 255 + LPAREN reduce by rule 255 + RPAREN reduce by rule 255 + LBRACKET reduce by rule 255 + RBRACKET reduce by rule 255 + LBRACE reduce by rule 255 + RBRACE reduce by rule 255 + SEMICOLON reduce by rule 255 + LDQUOTE reduce by rule 255 + RMETA reduce by rule 255 + CELLSET reduce by rule 255 + STORAGE reduce by rule 255 + LOCATIONS reduce by rule 255 + HASH reduce by rule 255 + COMMA reduce by rule 255 + COLON reduce by rule 255 + AT reduce by rule 255 + BAR reduce by rule 255 + DARROW reduce by rule 255 + THEN reduce by rule 255 + ELSE reduce by rule 255 + TRUE reduce by rule 255 + FALSE reduce by rule 255 + HANDLE reduce by rule 255 + LET reduce by rule 255 + STRUCTURE reduce by rule 255 + FUNCTOR reduce by rule 255 + SIGNATURE reduce by rule 255 + SHARING reduce by rule 255 + INSTRUCTION reduce by rule 255 + VLIW reduce by rule 255 + SUPERSCALAR reduce by rule 255 + WITHTYPE reduce by rule 255 + FUN reduce by rule 255 + VAL reduce by rule 255 + INCLUDE reduce by rule 255 + OPEN reduce by rule 255 + OP reduce by rule 255 + LITTLE reduce by rule 255 + BIG reduce by rule 255 + PIPELINE reduce by rule 255 + LOWERCASE reduce by rule 255 + UPPERCASE reduce by rule 255 + VERBATIM reduce by rule 255 + RTL reduce by rule 255 + SPAN reduce by rule 255 + DELAYSLOT reduce by rule 255 + ALWAYS reduce by rule 255 + NEVER reduce by rule 255 + NONFIX reduce by rule 255 + INFIX reduce by rule 255 + INFIXR reduce by rule 255 + DEBUG reduce by rule 255 + ASM_COLON reduce by rule 255 + MC_COLON reduce by rule 255 + RTL_COLON reduce by rule 255 + DELAYSLOT_COLON reduce by rule 255 + NULLIFIED_COLON reduce by rule 255 + PADDING_COLON reduce by rule 255 + RESOURCE reduce by rule 255 + CPU reduce by rule 255 + LATENCY reduce by rule 255 + EXCEPTION reduce by rule 255 + ID reduce by rule 255 + SYMBOL reduce by rule 255 + WORD reduce by rule 255 + INT reduce by rule 255 + INTINF reduce by rule 255 + REAL reduce by rule 255 + STRING reduce by rule 255 + CHAR reduce by rule 255 + EOF reduce by rule 255 + + + . error + + + state 531: + + rtlterms : rtlterm rtlterms . (reduce by rule 119) + + RRBRACKET reduce by rule 119 + + + . error + + + state 532: + + rtlterm : HASH id . (reduce by rule 122) + + TIMES reduce by rule 122 + DEREF reduce by rule 122 + NOT reduce by rule 122 + RRBRACKET reduce by rule 122 + CELLSET reduce by rule 122 + HASH reduce by rule 122 + ID reduce by rule 122 + SYMBOL reduce by rule 122 + STRING reduce by rule 122 + + + . error + + + state 533: + + aexp : DOLLAR id LBRACKET . exp region RBRACKET + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 606 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 534: + + exp : CASE typedexp OF . clauses + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 413 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + clause goto 412 + clauses goto 607 + True goto 74 + False goto 73 + + . error + + + state 535: + + apat : sym CONCAT LBRACKET pats RBRACKET . (reduce by rule 303) + apat : sym CONCAT LBRACKET pats RBRACKET . CONCAT sym + + EQ reduce by rule 303 + TIMES reduce by rule 303 + AND reduce by rule 303 + DEREF reduce by rule 303 + NOT reduce by rule 303 + CONCAT shift 608 + LHASHBRACKET reduce by rule 303 + LPAREN reduce by rule 303 + RPAREN reduce by rule 303 + LBRACKET reduce by rule 303 + RBRACKET reduce by rule 303 + LBRACE reduce by rule 303 + RBRACE reduce by rule 303 + CELLSET reduce by rule 303 + COMMA reduce by rule 303 + COLON reduce by rule 303 + BAR reduce by rule 303 + DARROW reduce by rule 303 + TRUE reduce by rule 303 + FALSE reduce by rule 303 + WILD reduce by rule 303 + WHERE reduce by rule 303 + OP reduce by rule 303 + ALWAYS reduce by rule 303 + NEVER reduce by rule 303 + EXCEPTION reduce by rule 303 + ID reduce by rule 303 + SYMBOL reduce by rule 303 + WORD reduce by rule 303 + INT reduce by rule 303 + INTINF reduce by rule 303 + REAL reduce by rule 303 + STRING reduce by rule 303 + CHAR reduce by rule 303 + + + . error + + + state 536: + + mymldecl : RTL id LBRACE labpats0 RBRACE EQ . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 609 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 537: + + labpat : sym WHERE typedexp IN . typedpat + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 610 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 538: + + apat : LBRACKET pats RBRACKET CONCAT sym . (reduce by rule 305) + + EQ reduce by rule 305 + TIMES reduce by rule 305 + AND reduce by rule 305 + DEREF reduce by rule 305 + NOT reduce by rule 305 + LHASHBRACKET reduce by rule 305 + LPAREN reduce by rule 305 + RPAREN reduce by rule 305 + LBRACKET reduce by rule 305 + RBRACKET reduce by rule 305 + LBRACE reduce by rule 305 + RBRACE reduce by rule 305 + CELLSET reduce by rule 305 + COMMA reduce by rule 305 + COLON reduce by rule 305 + BAR reduce by rule 305 + DARROW reduce by rule 305 + TRUE reduce by rule 305 + FALSE reduce by rule 305 + WILD reduce by rule 305 + WHERE reduce by rule 305 + OP reduce by rule 305 + ALWAYS reduce by rule 305 + NEVER reduce by rule 305 + EXCEPTION reduce by rule 305 + ID reduce by rule 305 + SYMBOL reduce by rule 305 + WORD reduce by rule 305 + INT reduce by rule 305 + INTINF reduce by rule 305 + REAL reduce by rule 305 + STRING reduce by rule 305 + CHAR reduce by rule 305 + + + . error + + + state 539: + + apat : LPAREN typedpat WHERE typedexp RPAREN . (reduce by rule 300) + + EQ reduce by rule 300 + TIMES reduce by rule 300 + AND reduce by rule 300 + DEREF reduce by rule 300 + NOT reduce by rule 300 + LHASHBRACKET reduce by rule 300 + LPAREN reduce by rule 300 + RPAREN reduce by rule 300 + LBRACKET reduce by rule 300 + RBRACKET reduce by rule 300 + LBRACE reduce by rule 300 + RBRACE reduce by rule 300 + CELLSET reduce by rule 300 + COMMA reduce by rule 300 + COLON reduce by rule 300 + BAR reduce by rule 300 + DARROW reduce by rule 300 + TRUE reduce by rule 300 + FALSE reduce by rule 300 + WILD reduce by rule 300 + WHERE reduce by rule 300 + OP reduce by rule 300 + ALWAYS reduce by rule 300 + NEVER reduce by rule 300 + EXCEPTION reduce by rule 300 + ID reduce by rule 300 + SYMBOL reduce by rule 300 + WORD reduce by rule 300 + INT reduce by rule 300 + INTINF reduce by rule 300 + REAL reduce by rule 300 + STRING reduce by rule 300 + CHAR reduce by rule 300 + + + . error + + + state 540: + + apat : LPAREN typedpat WHERE typedexp IN . typedpat RPAREN + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LHASHBRACKET shift 103 + LPAREN shift 102 + LBRACKET shift 101 + LBRACE shift 100 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + WILD shift 97 + OP shift 128 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 127 + sym goto 134 + symb goto 67 + ident2 goto 87 + path goto 85 + apat goto 124 + apat2 goto 123 + apppat goto 122 + pat goto 195 + typedpat goto 611 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 75 + True goto 74 + False goto 73 + + . error + + + state 541: + + cycles : cycle . (reduce by rule 47) + cycles : cycle . COMMA cycles + cycle : cycle . CONCAT cycle + cycle : cycle . TIMES int + + TIMES shift 614 + CONCAT shift 613 + RBRACKET reduce by rule 47 + COMMA shift 612 + + + . error + + + state 542: + + cycles0 : cycles . (reduce by rule 46) + + RBRACKET reduce by rule 46 + + + . error + + + state 543: + + pipelineclause : id pat EQ LBRACKET cycles0 . RBRACKET + + RBRACKET shift 615 + + + . error + + + state 544: + + cycle : id . (reduce by rule 49) + + TIMES reduce by rule 49 + CONCAT reduce by rule 49 + RPAREN reduce by rule 49 + RBRACKET reduce by rule 49 + COMMA reduce by rule 49 + + + . error + + + state 545: + + cycle : LPAREN . cycle RPAREN + + LPAREN shift 545 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 544 + cycle goto 616 + + . error + + + state 546: + + sigsubs : sigsub AND sigsubs . (reduce by rule 96) + + ARCHITECTURE reduce by rule 96 + END reduce by rule 96 + LOCAL reduce by rule 96 + IN reduce by rule 96 + DATATYPE reduce by rule 96 + TYPE reduce by rule 96 + EQ reduce by rule 96 + RPAREN reduce by rule 96 + SEMICOLON reduce by rule 96 + STORAGE reduce by rule 96 + LOCATIONS reduce by rule 96 + STRUCTURE reduce by rule 96 + FUNCTOR reduce by rule 96 + SIGNATURE reduce by rule 96 + WHERE reduce by rule 96 + SHARING reduce by rule 96 + INSTRUCTION reduce by rule 96 + VLIW reduce by rule 96 + SUPERSCALAR reduce by rule 96 + FUN reduce by rule 96 + VAL reduce by rule 96 + INCLUDE reduce by rule 96 + OPEN reduce by rule 96 + LITTLE reduce by rule 96 + BIG reduce by rule 96 + PIPELINE reduce by rule 96 + LOWERCASE reduce by rule 96 + UPPERCASE reduce by rule 96 + VERBATIM reduce by rule 96 + RTL reduce by rule 96 + NONFIX reduce by rule 96 + INFIX reduce by rule 96 + INFIXR reduce by rule 96 + DEBUG reduce by rule 96 + RESOURCE reduce by rule 96 + CPU reduce by rule 96 + LATENCY reduce by rule 96 + EXCEPTION reduce by rule 96 + EOF reduce by rule 96 + + + . error + + + state 547: + + structexp : structexp . LPAREN scopeddecls RPAREN + structexp : structexp . LPAREN ident RPAREN + sigsub : ident EQ structexp . (reduce by rule 98) + + ARCHITECTURE reduce by rule 98 + END reduce by rule 98 + LOCAL reduce by rule 98 + IN reduce by rule 98 + DATATYPE reduce by rule 98 + TYPE reduce by rule 98 + EQ reduce by rule 98 + AND reduce by rule 98 + LPAREN shift 477 + RPAREN reduce by rule 98 + SEMICOLON reduce by rule 98 + STORAGE reduce by rule 98 + LOCATIONS reduce by rule 98 + STRUCTURE reduce by rule 98 + FUNCTOR reduce by rule 98 + SIGNATURE reduce by rule 98 + WHERE reduce by rule 98 + SHARING reduce by rule 98 + INSTRUCTION reduce by rule 98 + VLIW reduce by rule 98 + SUPERSCALAR reduce by rule 98 + FUN reduce by rule 98 + VAL reduce by rule 98 + INCLUDE reduce by rule 98 + OPEN reduce by rule 98 + LITTLE reduce by rule 98 + BIG reduce by rule 98 + PIPELINE reduce by rule 98 + LOWERCASE reduce by rule 98 + UPPERCASE reduce by rule 98 + VERBATIM reduce by rule 98 + RTL reduce by rule 98 + NONFIX reduce by rule 98 + INFIX reduce by rule 98 + INFIXR reduce by rule 98 + DEBUG reduce by rule 98 + RESOURCE reduce by rule 98 + CPU reduce by rule 98 + LATENCY reduce by rule 98 + EXCEPTION reduce by rule 98 + EOF reduce by rule 98 + + + . error + + + state 548: + + sigsub : TYPE ident EQ . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 617 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 549: + + typedexp : typedexp COLON ty . (reduce by rule 281) + ty : ty . ARROW ty + + ARCHITECTURE reduce by rule 281 + END reduce by rule 281 + LOCAL reduce by rule 281 + IN reduce by rule 281 + OF reduce by rule 281 + DATATYPE reduce by rule 281 + TYPE reduce by rule 281 + AND reduce by rule 281 + RPAREN reduce by rule 281 + RBRACKET reduce by rule 281 + RBRACE reduce by rule 281 + SEMICOLON reduce by rule 281 + STORAGE reduce by rule 281 + LOCATIONS reduce by rule 281 + COMMA reduce by rule 281 + COLON reduce by rule 281 + BAR reduce by rule 281 + ARROW shift 388 + DARROW reduce by rule 281 + THEN reduce by rule 281 + ELSE reduce by rule 281 + STRUCTURE reduce by rule 281 + FUNCTOR reduce by rule 281 + SIGNATURE reduce by rule 281 + SHARING reduce by rule 281 + INSTRUCTION reduce by rule 281 + VLIW reduce by rule 281 + SUPERSCALAR reduce by rule 281 + FUN reduce by rule 281 + VAL reduce by rule 281 + INCLUDE reduce by rule 281 + OPEN reduce by rule 281 + LITTLE reduce by rule 281 + BIG reduce by rule 281 + PIPELINE reduce by rule 281 + LOWERCASE reduce by rule 281 + UPPERCASE reduce by rule 281 + VERBATIM reduce by rule 281 + RTL reduce by rule 281 + NONFIX reduce by rule 281 + INFIX reduce by rule 281 + INFIXR reduce by rule 281 + DEBUG reduce by rule 281 + RESOURCE reduce by rule 281 + CPU reduce by rule 281 + LATENCY reduce by rule 281 + EXCEPTION reduce by rule 281 + EOF reduce by rule 281 + + + . error + + + state 550: + + funclause : apppat funguard return_ty cont EQ . typedexp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 618 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 551: + + cont : EXCEPTION id . (reduce by rule 338) + + EQ reduce by rule 338 + DARROW reduce by rule 338 + + + . error + + + state 552: + + funguard : WHERE LPAREN typedexp RPAREN . (reduce by rule 347) + + EQ reduce by rule 347 + COLON reduce by rule 347 + EXCEPTION reduce by rule 347 + + + . error + + + state 553: + + consbind : sym of_ty consassembly consencoding rtl . nop nullified delayslot delayslotcandidate sdi latency pipeline + + ARCHITECTURE reduce by rule 153 + END reduce by rule 153 + LOCAL reduce by rule 153 + IN reduce by rule 153 + DATATYPE reduce by rule 153 + TYPE reduce by rule 153 + AND reduce by rule 153 + RPAREN reduce by rule 153 + SEMICOLON reduce by rule 153 + STORAGE reduce by rule 153 + LOCATIONS reduce by rule 153 + BAR reduce by rule 153 + STRUCTURE reduce by rule 153 + FUNCTOR reduce by rule 153 + SIGNATURE reduce by rule 153 + SHARING reduce by rule 153 + INSTRUCTION reduce by rule 153 + VLIW reduce by rule 153 + SUPERSCALAR reduce by rule 153 + WITHTYPE reduce by rule 153 + FUN reduce by rule 153 + VAL reduce by rule 153 + INCLUDE reduce by rule 153 + OPEN reduce by rule 153 + LITTLE reduce by rule 153 + BIG reduce by rule 153 + PIPELINE reduce by rule 153 + LOWERCASE reduce by rule 153 + UPPERCASE reduce by rule 153 + VERBATIM reduce by rule 153 + RTL reduce by rule 153 + SPAN reduce by rule 153 + DELAYSLOT reduce by rule 153 + NONFIX reduce by rule 153 + INFIX reduce by rule 153 + INFIXR reduce by rule 153 + DEBUG reduce by rule 153 + DELAYSLOT_COLON reduce by rule 153 + NULLIFIED_COLON reduce by rule 153 + PADDING_COLON shift 620 + RESOURCE reduce by rule 153 + CPU reduce by rule 153 + LATENCY reduce by rule 153 + EXCEPTION reduce by rule 153 + EOF reduce by rule 153 + + nop goto 619 + + . error + + + state 554: + + rtl : RTL_COLON . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 621 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 555: + + consencoding : id LBRACE . labexps0 RBRACE + + RBRACE reduce by rule 266 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 421 + labexps0 goto 622 + labexps goto 419 + labexp goto 418 + + . error + + + state 556: + + exp : exp . HANDLE clauses + consencoding : MC_COLON exp . (reduce by rule 181) + + ARCHITECTURE reduce by rule 181 + END reduce by rule 181 + LOCAL reduce by rule 181 + IN reduce by rule 181 + DATATYPE reduce by rule 181 + TYPE reduce by rule 181 + AND reduce by rule 181 + RPAREN reduce by rule 181 + SEMICOLON reduce by rule 181 + STORAGE reduce by rule 181 + LOCATIONS reduce by rule 181 + BAR reduce by rule 181 + HANDLE shift 402 + STRUCTURE reduce by rule 181 + FUNCTOR reduce by rule 181 + SIGNATURE reduce by rule 181 + SHARING reduce by rule 181 + INSTRUCTION reduce by rule 181 + VLIW reduce by rule 181 + SUPERSCALAR reduce by rule 181 + WITHTYPE reduce by rule 181 + FUN reduce by rule 181 + VAL reduce by rule 181 + INCLUDE reduce by rule 181 + OPEN reduce by rule 181 + LITTLE reduce by rule 181 + BIG reduce by rule 181 + PIPELINE reduce by rule 181 + LOWERCASE reduce by rule 181 + UPPERCASE reduce by rule 181 + VERBATIM reduce by rule 181 + RTL reduce by rule 181 + SPAN reduce by rule 181 + DELAYSLOT reduce by rule 181 + NONFIX reduce by rule 181 + INFIX reduce by rule 181 + INFIXR reduce by rule 181 + DEBUG reduce by rule 181 + RTL_COLON reduce by rule 181 + DELAYSLOT_COLON reduce by rule 181 + NULLIFIED_COLON reduce by rule 181 + PADDING_COLON reduce by rule 181 + RESOURCE reduce by rule 181 + CPU reduce by rule 181 + LATENCY reduce by rule 181 + EXCEPTION reduce by rule 181 + EOF reduce by rule 181 + + + . error + + + state 557: + + consencoding : LPAREN expseq . RPAREN + + RPAREN shift 623 + + + . error + + + state 558: + + consencoding : LPAREN exps2 . RPAREN + + RPAREN shift 624 + + + . error + + + state 559: + + typedexp : typedexp . COLON ty + exps2 : typedexp . COMMA exps1 + expseq : typedexp . (reduce by rule 282) + expseq : typedexp . SEMICOLON expseq + + RPAREN reduce by rule 282 + SEMICOLON shift 625 + COMMA shift 525 + COLON shift 458 + + + . error + + + state 560: + + formatbind : id opt_of LBRACE fields . RBRACE opt_exp + + RBRACE shift 626 + + + . error + + + state 561: + + field : fieldid . COLON cnv signedness width unsignedint_opt + + COLON shift 627 + + + . error + + + state 562: + + fields : field . (reduce by rule 209) + fields : field . COMMA fields + + RBRACE reduce by rule 209 + COMMA shift 628 + + + . error + + + state 563: + + field : id . (reduce by rule 212) + fieldid : id . (reduce by rule 213) + + RBRACE reduce by rule 212 + COMMA reduce by rule 212 + COLON reduce by rule 213 + + + . error + + + state 564: + + fieldid : WILD . (reduce by rule 214) + + COLON reduce by rule 214 + + + . error + + + state 565: + + mymldecl : FUNCTOR id LPAREN functorarg RPAREN sigcon . EQ structexp + + EQ shift 629 + + + . error + + + state 566: + + mymldecl : FUNCTOR id LPAREN functorarg RPAREN EQ . structexp + + CELLSET shift 50 + STRUCT shift 364 + ID shift 49 + SYMBOL shift 48 + + structexp goto 630 + id goto 114 + ident goto 362 + ident2 goto 112 + path goto 85 + + . error + + + state 567: + + sigcon : COLON sigexp . (reduce by rule 93) + sigexp : sigexp . WHERE sigsubs + + EQ reduce by rule 93 + RPAREN reduce by rule 93 + WHERE shift 206 + + + . error + + + state 568: + + structexp : structexp LPAREN scopeddecls . RPAREN + + RPAREN shift 631 + + + . error + + + state 569: + + structexp : structexp LPAREN ident . RPAREN + + RPAREN shift 632 + + + . error + + + state 570: + + structexp : STRUCT scopeddecls END . (reduce by rule 124) + + ARCHITECTURE reduce by rule 124 + END reduce by rule 124 + LOCAL reduce by rule 124 + IN reduce by rule 124 + DATATYPE reduce by rule 124 + TYPE reduce by rule 124 + EQ reduce by rule 124 + AND reduce by rule 124 + LPAREN reduce by rule 124 + RPAREN reduce by rule 124 + SEMICOLON reduce by rule 124 + STORAGE reduce by rule 124 + LOCATIONS reduce by rule 124 + STRUCTURE reduce by rule 124 + FUNCTOR reduce by rule 124 + SIGNATURE reduce by rule 124 + WHERE reduce by rule 124 + SHARING reduce by rule 124 + INSTRUCTION reduce by rule 124 + VLIW reduce by rule 124 + SUPERSCALAR reduce by rule 124 + FUN reduce by rule 124 + VAL reduce by rule 124 + INCLUDE reduce by rule 124 + OPEN reduce by rule 124 + LITTLE reduce by rule 124 + BIG reduce by rule 124 + PIPELINE reduce by rule 124 + LOWERCASE reduce by rule 124 + UPPERCASE reduce by rule 124 + VERBATIM reduce by rule 124 + RTL reduce by rule 124 + NONFIX reduce by rule 124 + INFIX reduce by rule 124 + INFIXR reduce by rule 124 + DEBUG reduce by rule 124 + RESOURCE reduce by rule 124 + CPU reduce by rule 124 + LATENCY reduce by rule 124 + EXCEPTION reduce by rule 124 + EOF reduce by rule 124 + + + . error + + + state 571: + + storagedecl : id EQ DOLLAR id LBRACKET . cellcount RBRACKET bitSize aliasing defaults printcell + + RBRACKET reduce by rule 389 + INT shift 64 + + int goto 634 + cellcount goto 633 + + . error + + + state 572: + + datatypebind : tyvarseq id opcodeencoding fieldty hasasm . EQ consbinds + datatypebind : tyvarseq id opcodeencoding fieldty hasasm . EQ DATATYPE ty + + EQ shift 635 + + + . error + + + state 573: + + hasasm : DEREF . (reduce by rule 131) + + EQ reduce by rule 131 + + + . error + + + state 574: + + fieldty : COLON id . (reduce by rule 134) + + EQ reduce by rule 134 + DEREF reduce by rule 134 + + + . error + + + state 575: + + opcodeencoding : LBRACKET encodingexps RBRACKET . (reduce by rule 136) + + EQ reduce by rule 136 + DEREF reduce by rule 136 + COLON reduce by rule 136 + + + . error + + + state 576: + + encodingexps : encodingexp COMMA . encodingexps + + INT shift 64 + + int goto 489 + encodingexp goto 488 + encodingexps goto 636 + + . error + + + state 577: + + encodingexp : int int . DOTDOT int + + DOTDOT shift 637 + + + . error + + + state 578: + + encodingexp : int DOTDOT . int + + INT shift 64 + + int goto 638 + + . error + + + state 579: + + mymddecl : ARCHITECTURE id EQ STRUCT decls END . (reduce by rule 12) + + ARCHITECTURE reduce by rule 12 + END reduce by rule 12 + LOCAL reduce by rule 12 + IN reduce by rule 12 + DATATYPE reduce by rule 12 + TYPE reduce by rule 12 + RPAREN reduce by rule 12 + SEMICOLON reduce by rule 12 + STORAGE reduce by rule 12 + LOCATIONS reduce by rule 12 + STRUCTURE reduce by rule 12 + FUNCTOR reduce by rule 12 + SIGNATURE reduce by rule 12 + SHARING reduce by rule 12 + INSTRUCTION reduce by rule 12 + VLIW reduce by rule 12 + SUPERSCALAR reduce by rule 12 + FUN reduce by rule 12 + VAL reduce by rule 12 + INCLUDE reduce by rule 12 + OPEN reduce by rule 12 + LITTLE reduce by rule 12 + BIG reduce by rule 12 + PIPELINE reduce by rule 12 + LOWERCASE reduce by rule 12 + UPPERCASE reduce by rule 12 + VERBATIM reduce by rule 12 + RTL reduce by rule 12 + NONFIX reduce by rule 12 + INFIX reduce by rule 12 + INFIXR reduce by rule 12 + DEBUG reduce by rule 12 + RESOURCE reduce by rule 12 + CPU reduce by rule 12 + LATENCY reduce by rule 12 + EXCEPTION reduce by rule 12 + EOF reduce by rule 12 + + + . error + + + state 580: + + labtys1 : labty COMMA labtys1 . (reduce by rule 377) + + RBRACE reduce by rule 377 + + + . error + + + state 581: + + ty : ty . ARROW ty + labty : id COLON ty . (reduce by rule 378) + + RBRACE reduce by rule 378 + COMMA reduce by rule 378 + ARROW shift 388 + + + . error + + + state 582: + + appty : LPAREN tys2 RPAREN tident . (reduce by rule 359) + + ARCHITECTURE reduce by rule 359 + END reduce by rule 359 + LOCAL reduce by rule 359 + IN reduce by rule 359 + OF reduce by rule 359 + DATATYPE reduce by rule 359 + TYPE reduce by rule 359 + EQ reduce by rule 359 + TIMES reduce by rule 359 + AND reduce by rule 359 + LPAREN reduce by rule 359 + RPAREN reduce by rule 359 + RBRACKET reduce by rule 359 + RBRACE reduce by rule 359 + SEMICOLON reduce by rule 359 + LDQUOTE reduce by rule 359 + CELLSET reduce by rule 359 + STORAGE reduce by rule 359 + LOCATIONS reduce by rule 359 + COMMA reduce by rule 359 + COLON reduce by rule 359 + BAR reduce by rule 359 + ARROW reduce by rule 359 + DARROW reduce by rule 359 + BITS reduce by rule 359 + THEN reduce by rule 359 + ELSE reduce by rule 359 + STRUCTURE reduce by rule 359 + FUNCTOR reduce by rule 359 + SIGNATURE reduce by rule 359 + WHERE reduce by rule 359 + SHARING reduce by rule 359 + INSTRUCTION reduce by rule 359 + CELL reduce by rule 359 + VLIW reduce by rule 359 + SUPERSCALAR reduce by rule 359 + WITHTYPE reduce by rule 359 + FUN reduce by rule 359 + VAL reduce by rule 359 + INCLUDE reduce by rule 359 + OPEN reduce by rule 359 + LITTLE reduce by rule 359 + BIG reduce by rule 359 + PIPELINE reduce by rule 359 + LOWERCASE reduce by rule 359 + UPPERCASE reduce by rule 359 + VERBATIM reduce by rule 359 + RTL reduce by rule 359 + SPAN reduce by rule 359 + DELAYSLOT reduce by rule 359 + NONFIX reduce by rule 359 + INFIX reduce by rule 359 + INFIXR reduce by rule 359 + DEBUG reduce by rule 359 + ASM_COLON reduce by rule 359 + MC_COLON reduce by rule 359 + RTL_COLON reduce by rule 359 + DELAYSLOT_COLON reduce by rule 359 + NULLIFIED_COLON reduce by rule 359 + PADDING_COLON reduce by rule 359 + RESOURCE reduce by rule 359 + CPU reduce by rule 359 + LATENCY reduce by rule 359 + EXCEPTION reduce by rule 359 + ID reduce by rule 359 + SYMBOL reduce by rule 359 + WORD reduce by rule 359 + INT reduce by rule 359 + STRING reduce by rule 359 + EOF reduce by rule 359 + + + . error + + + state 583: + + tys2 : ty COMMA tys2 . (reduce by rule 370) + + RPAREN reduce by rule 370 + + + . error + + + state 584: + + ty : ty . ARROW ty + tys2 : ty . COMMA ty + tys2 : ty COMMA ty . (reduce by rule 369) + tys2 : ty . COMMA tys2 + + RPAREN reduce by rule 369 + COMMA shift 501 + ARROW shift 388 + + + . error + + + state 585: + + resources : resource COMMA . resources + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + INT shift 64 + + id goto 506 + int goto 505 + resources goto 639 + resource goto 503 + + . error + + + state 586: + + cpubind : id aliases int LBRACKET resources RBRACKET . (reduce by rule 32) + + ARCHITECTURE reduce by rule 32 + END reduce by rule 32 + LOCAL reduce by rule 32 + IN reduce by rule 32 + DATATYPE reduce by rule 32 + TYPE reduce by rule 32 + AND reduce by rule 32 + RPAREN reduce by rule 32 + SEMICOLON reduce by rule 32 + STORAGE reduce by rule 32 + LOCATIONS reduce by rule 32 + STRUCTURE reduce by rule 32 + FUNCTOR reduce by rule 32 + SIGNATURE reduce by rule 32 + SHARING reduce by rule 32 + INSTRUCTION reduce by rule 32 + VLIW reduce by rule 32 + SUPERSCALAR reduce by rule 32 + FUN reduce by rule 32 + VAL reduce by rule 32 + INCLUDE reduce by rule 32 + OPEN reduce by rule 32 + LITTLE reduce by rule 32 + BIG reduce by rule 32 + PIPELINE reduce by rule 32 + LOWERCASE reduce by rule 32 + UPPERCASE reduce by rule 32 + VERBATIM reduce by rule 32 + RTL reduce by rule 32 + NONFIX reduce by rule 32 + INFIX reduce by rule 32 + INFIXR reduce by rule 32 + DEBUG reduce by rule 32 + RESOURCE reduce by rule 32 + CPU reduce by rule 32 + LATENCY reduce by rule 32 + EXCEPTION reduce by rule 32 + EOF reduce by rule 32 + + + . error + + + state 587: + + resource : int id . (reduce by rule 37) + + RBRACKET reduce by rule 37 + COMMA reduce by rule 37 + + + . error + + + state 588: + + aexp2 : aexp2 AT LBRACKET slices . RBRACKET + + RBRACKET shift 640 + + + . error + + + state 589: + + slices : slice . (reduce by rule 409) + slices : slice . COMMA slices + + RBRACKET reduce by rule 409 + COMMA shift 641 + + + . error + + + state 590: + + slice : int . DOTDOT int + slice : int . (reduce by rule 412) + + RBRACKET reduce by rule 412 + COMMA reduce by rule 412 + DOTDOT shift 642 + + + . error + + + state 591: + + aexp : sym CONCAT LBRACKET exps . RBRACKET + aexp : sym CONCAT LBRACKET exps . RBRACKET CONCAT sym + + RBRACKET shift 643 + + + . error + + + state 592: + + aexp : LET decls IN expseq . END + + END shift 644 + + + . error + + + state 593: + + typedexp : typedexp . COLON ty + expseq : typedexp . (reduce by rule 282) + expseq : typedexp . SEMICOLON expseq + + END reduce by rule 282 + RPAREN reduce by rule 282 + SEMICOLON shift 625 + COLON shift 458 + + + . error + + + state 594: + + exp : IF typedexp THEN typedexp . ELSE exp + typedexp : typedexp . COLON ty + + COLON shift 458 + ELSE shift 645 + + + . error + + + state 595: + + clauses : clause BAR clauses . (reduce by rule 342) + + ARCHITECTURE reduce by rule 342 + END reduce by rule 342 + LOCAL reduce by rule 342 + IN reduce by rule 342 + OF reduce by rule 342 + DATATYPE reduce by rule 342 + TYPE reduce by rule 342 + AND reduce by rule 342 + LPAREN reduce by rule 342 + RPAREN reduce by rule 342 + RBRACKET reduce by rule 342 + RBRACE reduce by rule 342 + SEMICOLON reduce by rule 342 + RMETA reduce by rule 342 + CELLSET reduce by rule 342 + STORAGE reduce by rule 342 + LOCATIONS reduce by rule 342 + COMMA reduce by rule 342 + COLON reduce by rule 342 + BAR reduce by rule 342 + DARROW reduce by rule 342 + THEN reduce by rule 342 + ELSE reduce by rule 342 + HANDLE reduce by rule 342 + STRUCTURE reduce by rule 342 + FUNCTOR reduce by rule 342 + SIGNATURE reduce by rule 342 + SHARING reduce by rule 342 + INSTRUCTION reduce by rule 342 + VLIW reduce by rule 342 + SUPERSCALAR reduce by rule 342 + WITHTYPE reduce by rule 342 + FUN reduce by rule 342 + VAL reduce by rule 342 + INCLUDE reduce by rule 342 + OPEN reduce by rule 342 + LITTLE reduce by rule 342 + BIG reduce by rule 342 + PIPELINE reduce by rule 342 + LOWERCASE reduce by rule 342 + UPPERCASE reduce by rule 342 + VERBATIM reduce by rule 342 + RTL reduce by rule 342 + SPAN reduce by rule 342 + DELAYSLOT reduce by rule 342 + NONFIX reduce by rule 342 + INFIX reduce by rule 342 + INFIXR reduce by rule 342 + DEBUG reduce by rule 342 + ASM_COLON reduce by rule 342 + MC_COLON reduce by rule 342 + RTL_COLON reduce by rule 342 + DELAYSLOT_COLON reduce by rule 342 + NULLIFIED_COLON reduce by rule 342 + PADDING_COLON reduce by rule 342 + RESOURCE reduce by rule 342 + CPU reduce by rule 342 + LATENCY reduce by rule 342 + EXCEPTION reduce by rule 342 + ID reduce by rule 342 + SYMBOL reduce by rule 342 + WORD reduce by rule 342 + INT reduce by rule 342 + EOF reduce by rule 342 + + + . error + + + state 596: + + clause : typedpat guard cont . DARROW exp + + DARROW shift 646 + + + . error + + + state 597: + + typedexp : typedexp . COLON ty + guard : WHERE typedexp . (reduce by rule 340) + + COLON shift 458 + DARROW reduce by rule 340 + EXCEPTION reduce by rule 340 + + + . error + + + state 598: + + asm_strings : LDQUOTE asms RDQUOTE asm_strings . (reduce by rule 187) + + ARCHITECTURE reduce by rule 187 + END reduce by rule 187 + LOCAL reduce by rule 187 + IN reduce by rule 187 + OF reduce by rule 187 + DATATYPE reduce by rule 187 + TYPE reduce by rule 187 + EQ reduce by rule 187 + DOLLAR reduce by rule 187 + TIMES reduce by rule 187 + AND reduce by rule 187 + DEREF reduce by rule 187 + NOT reduce by rule 187 + LLBRACKET reduce by rule 187 + LHASHBRACKET reduce by rule 187 + LPAREN reduce by rule 187 + RPAREN reduce by rule 187 + LBRACKET reduce by rule 187 + RBRACKET reduce by rule 187 + LBRACE reduce by rule 187 + RBRACE reduce by rule 187 + SEMICOLON reduce by rule 187 + LDQUOTE reduce by rule 187 + RMETA reduce by rule 187 + CELLSET reduce by rule 187 + STORAGE reduce by rule 187 + LOCATIONS reduce by rule 187 + HASH reduce by rule 187 + COMMA reduce by rule 187 + COLON reduce by rule 187 + AT reduce by rule 187 + BAR reduce by rule 187 + DARROW reduce by rule 187 + THEN reduce by rule 187 + ELSE reduce by rule 187 + TRUE reduce by rule 187 + FALSE reduce by rule 187 + HANDLE reduce by rule 187 + LET reduce by rule 187 + STRUCTURE reduce by rule 187 + FUNCTOR reduce by rule 187 + SIGNATURE reduce by rule 187 + SHARING reduce by rule 187 + INSTRUCTION reduce by rule 187 + VLIW reduce by rule 187 + SUPERSCALAR reduce by rule 187 + WITHTYPE reduce by rule 187 + FUN reduce by rule 187 + VAL reduce by rule 187 + INCLUDE reduce by rule 187 + OPEN reduce by rule 187 + OP reduce by rule 187 + LITTLE reduce by rule 187 + BIG reduce by rule 187 + PIPELINE reduce by rule 187 + LOWERCASE reduce by rule 187 + UPPERCASE reduce by rule 187 + VERBATIM reduce by rule 187 + RTL reduce by rule 187 + SPAN reduce by rule 187 + DELAYSLOT reduce by rule 187 + ALWAYS reduce by rule 187 + NEVER reduce by rule 187 + NONFIX reduce by rule 187 + INFIX reduce by rule 187 + INFIXR reduce by rule 187 + DEBUG reduce by rule 187 + ASM_COLON reduce by rule 187 + MC_COLON reduce by rule 187 + RTL_COLON reduce by rule 187 + DELAYSLOT_COLON reduce by rule 187 + NULLIFIED_COLON reduce by rule 187 + PADDING_COLON reduce by rule 187 + RESOURCE reduce by rule 187 + CPU reduce by rule 187 + LATENCY reduce by rule 187 + EXCEPTION reduce by rule 187 + ID reduce by rule 187 + SYMBOL reduce by rule 187 + WORD reduce by rule 187 + INT reduce by rule 187 + INTINF reduce by rule 187 + REAL reduce by rule 187 + STRING reduce by rule 187 + CHAR reduce by rule 187 + EOF reduce by rule 187 + + + . error + + + state 599: + + asm : LMETA exp RMETA . (reduce by rule 190) + + RDQUOTE reduce by rule 190 + LMETA reduce by rule 190 + ASMTEXT reduce by rule 190 + + + . error + + + state 600: + + labexps : labexp COMMA labexps . (reduce by rule 269) + + RBRACE reduce by rule 269 + + + . error + + + state 601: + + typedexp : typedexp . COLON ty + labexp : id EQ typedexp . (reduce by rule 270) + + RBRACE reduce by rule 270 + COMMA reduce by rule 270 + COLON shift 458 + + + . error + + + state 602: + + aexp : LBRACKET exps RBRACKET CONCAT . sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 647 + symb goto 67 + + . error + + + state 603: + + exps1 : typedexp COMMA exps1 . (reduce by rule 286) + + RPAREN reduce by rule 286 + RBRACKET reduce by rule 286 + + + . error + + + state 604: + + exps2 : typedexp COMMA exps1 . (reduce by rule 287) + + RPAREN reduce by rule 287 + + + . error + + + state 605: + + expseq2 : typedexp SEMICOLON expseq . (reduce by rule 284) + + RPAREN reduce by rule 284 + + + . error + + + state 606: + + aexp : DOLLAR id LBRACKET exp . region RBRACKET + exp : exp . HANDLE clauses + + RBRACKET reduce by rule 260 + COLON shift 649 + HANDLE shift 402 + + region goto 648 + + . error + + + state 607: + + exp : CASE typedexp OF clauses . (reduce by rule 276) + + ARCHITECTURE reduce by rule 276 + END reduce by rule 276 + LOCAL reduce by rule 276 + IN reduce by rule 276 + OF reduce by rule 276 + DATATYPE reduce by rule 276 + TYPE reduce by rule 276 + AND reduce by rule 276 + LPAREN reduce by rule 276 + RPAREN reduce by rule 276 + RBRACKET reduce by rule 276 + RBRACE reduce by rule 276 + SEMICOLON reduce by rule 276 + RMETA reduce by rule 276 + CELLSET reduce by rule 276 + STORAGE reduce by rule 276 + LOCATIONS reduce by rule 276 + COMMA reduce by rule 276 + COLON reduce by rule 276 + BAR reduce by rule 276 + DARROW reduce by rule 276 + THEN reduce by rule 276 + ELSE reduce by rule 276 + HANDLE reduce by rule 276 + STRUCTURE reduce by rule 276 + FUNCTOR reduce by rule 276 + SIGNATURE reduce by rule 276 + SHARING reduce by rule 276 + INSTRUCTION reduce by rule 276 + VLIW reduce by rule 276 + SUPERSCALAR reduce by rule 276 + WITHTYPE reduce by rule 276 + FUN reduce by rule 276 + VAL reduce by rule 276 + INCLUDE reduce by rule 276 + OPEN reduce by rule 276 + LITTLE reduce by rule 276 + BIG reduce by rule 276 + PIPELINE reduce by rule 276 + LOWERCASE reduce by rule 276 + UPPERCASE reduce by rule 276 + VERBATIM reduce by rule 276 + RTL reduce by rule 276 + SPAN reduce by rule 276 + DELAYSLOT reduce by rule 276 + NONFIX reduce by rule 276 + INFIX reduce by rule 276 + INFIXR reduce by rule 276 + DEBUG reduce by rule 276 + ASM_COLON reduce by rule 276 + MC_COLON reduce by rule 276 + RTL_COLON reduce by rule 276 + DELAYSLOT_COLON reduce by rule 276 + NULLIFIED_COLON reduce by rule 276 + PADDING_COLON reduce by rule 276 + RESOURCE reduce by rule 276 + CPU reduce by rule 276 + LATENCY reduce by rule 276 + EXCEPTION reduce by rule 276 + ID reduce by rule 276 + SYMBOL reduce by rule 276 + WORD reduce by rule 276 + INT reduce by rule 276 + EOF reduce by rule 276 + + + . error + + + state 608: + + apat : sym CONCAT LBRACKET pats RBRACKET CONCAT . sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 650 + symb goto 67 + + . error + + + state 609: + + mymldecl : RTL id LBRACE labpats0 RBRACE EQ exp . (reduce by rule 62) + exp : exp . HANDLE clauses + + ARCHITECTURE reduce by rule 62 + END reduce by rule 62 + LOCAL reduce by rule 62 + IN reduce by rule 62 + DATATYPE reduce by rule 62 + TYPE reduce by rule 62 + RPAREN reduce by rule 62 + SEMICOLON reduce by rule 62 + STORAGE reduce by rule 62 + LOCATIONS reduce by rule 62 + HANDLE shift 402 + STRUCTURE reduce by rule 62 + FUNCTOR reduce by rule 62 + SIGNATURE reduce by rule 62 + SHARING reduce by rule 62 + INSTRUCTION reduce by rule 62 + VLIW reduce by rule 62 + SUPERSCALAR reduce by rule 62 + FUN reduce by rule 62 + VAL reduce by rule 62 + INCLUDE reduce by rule 62 + OPEN reduce by rule 62 + LITTLE reduce by rule 62 + BIG reduce by rule 62 + PIPELINE reduce by rule 62 + LOWERCASE reduce by rule 62 + UPPERCASE reduce by rule 62 + VERBATIM reduce by rule 62 + RTL reduce by rule 62 + NONFIX reduce by rule 62 + INFIX reduce by rule 62 + INFIXR reduce by rule 62 + DEBUG reduce by rule 62 + RESOURCE reduce by rule 62 + CPU reduce by rule 62 + LATENCY reduce by rule 62 + EXCEPTION reduce by rule 62 + EOF reduce by rule 62 + + + . error + + + state 610: + + typedpat : typedpat . COLON ty + labpat : sym WHERE typedexp IN typedpat . (reduce by rule 335) + + RBRACE reduce by rule 335 + COMMA reduce by rule 335 + COLON shift 316 + + + . error + + + state 611: + + apat : LPAREN typedpat WHERE typedexp IN typedpat . RPAREN + typedpat : typedpat . COLON ty + + RPAREN shift 651 + COLON shift 316 + + + . error + + + state 612: + + cycles : cycle COMMA . cycles + + LPAREN shift 545 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 544 + cycles goto 652 + cycle goto 541 + + . error + + + state 613: + + cycle : cycle CONCAT . cycle + + LPAREN shift 545 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 544 + cycle goto 653 + + . error + + + state 614: + + cycle : cycle TIMES . int + + INT shift 64 + + int goto 654 + + . error + + + state 615: + + pipelineclause : id pat EQ LBRACKET cycles0 RBRACKET . (reduce by rule 44) + + ARCHITECTURE reduce by rule 44 + END reduce by rule 44 + LOCAL reduce by rule 44 + IN reduce by rule 44 + DATATYPE reduce by rule 44 + TYPE reduce by rule 44 + AND reduce by rule 44 + RPAREN reduce by rule 44 + SEMICOLON reduce by rule 44 + STORAGE reduce by rule 44 + LOCATIONS reduce by rule 44 + BAR reduce by rule 44 + STRUCTURE reduce by rule 44 + FUNCTOR reduce by rule 44 + SIGNATURE reduce by rule 44 + SHARING reduce by rule 44 + INSTRUCTION reduce by rule 44 + VLIW reduce by rule 44 + SUPERSCALAR reduce by rule 44 + FUN reduce by rule 44 + VAL reduce by rule 44 + INCLUDE reduce by rule 44 + OPEN reduce by rule 44 + LITTLE reduce by rule 44 + BIG reduce by rule 44 + PIPELINE reduce by rule 44 + LOWERCASE reduce by rule 44 + UPPERCASE reduce by rule 44 + VERBATIM reduce by rule 44 + RTL reduce by rule 44 + NONFIX reduce by rule 44 + INFIX reduce by rule 44 + INFIXR reduce by rule 44 + DEBUG reduce by rule 44 + RESOURCE reduce by rule 44 + CPU reduce by rule 44 + LATENCY reduce by rule 44 + EXCEPTION reduce by rule 44 + EOF reduce by rule 44 + + + . error + + + state 616: + + cycle : cycle . CONCAT cycle + cycle : cycle . TIMES int + cycle : LPAREN cycle . RPAREN + + TIMES shift 614 + CONCAT shift 613 + RPAREN shift 655 + + + . error + + + state 617: + + ty : ty . ARROW ty + sigsub : TYPE ident EQ ty . (reduce by rule 97) + + ARCHITECTURE reduce by rule 97 + END reduce by rule 97 + LOCAL reduce by rule 97 + IN reduce by rule 97 + DATATYPE reduce by rule 97 + TYPE reduce by rule 97 + EQ reduce by rule 97 + AND reduce by rule 97 + RPAREN reduce by rule 97 + SEMICOLON reduce by rule 97 + STORAGE reduce by rule 97 + LOCATIONS reduce by rule 97 + ARROW shift 388 + STRUCTURE reduce by rule 97 + FUNCTOR reduce by rule 97 + SIGNATURE reduce by rule 97 + WHERE reduce by rule 97 + SHARING reduce by rule 97 + INSTRUCTION reduce by rule 97 + VLIW reduce by rule 97 + SUPERSCALAR reduce by rule 97 + FUN reduce by rule 97 + VAL reduce by rule 97 + INCLUDE reduce by rule 97 + OPEN reduce by rule 97 + LITTLE reduce by rule 97 + BIG reduce by rule 97 + PIPELINE reduce by rule 97 + LOWERCASE reduce by rule 97 + UPPERCASE reduce by rule 97 + VERBATIM reduce by rule 97 + RTL reduce by rule 97 + NONFIX reduce by rule 97 + INFIX reduce by rule 97 + INFIXR reduce by rule 97 + DEBUG reduce by rule 97 + RESOURCE reduce by rule 97 + CPU reduce by rule 97 + LATENCY reduce by rule 97 + EXCEPTION reduce by rule 97 + EOF reduce by rule 97 + + + . error + + + state 618: + + typedexp : typedexp . COLON ty + funclause : apppat funguard return_ty cont EQ typedexp . (reduce by rule 343) + + ARCHITECTURE reduce by rule 343 + END reduce by rule 343 + LOCAL reduce by rule 343 + IN reduce by rule 343 + DATATYPE reduce by rule 343 + TYPE reduce by rule 343 + AND reduce by rule 343 + RPAREN reduce by rule 343 + SEMICOLON reduce by rule 343 + STORAGE reduce by rule 343 + LOCATIONS reduce by rule 343 + COLON shift 458 + BAR reduce by rule 343 + STRUCTURE reduce by rule 343 + FUNCTOR reduce by rule 343 + SIGNATURE reduce by rule 343 + SHARING reduce by rule 343 + INSTRUCTION reduce by rule 343 + VLIW reduce by rule 343 + SUPERSCALAR reduce by rule 343 + FUN reduce by rule 343 + VAL reduce by rule 343 + INCLUDE reduce by rule 343 + OPEN reduce by rule 343 + LITTLE reduce by rule 343 + BIG reduce by rule 343 + PIPELINE reduce by rule 343 + LOWERCASE reduce by rule 343 + UPPERCASE reduce by rule 343 + VERBATIM reduce by rule 343 + RTL reduce by rule 343 + NONFIX reduce by rule 343 + INFIX reduce by rule 343 + INFIXR reduce by rule 343 + DEBUG reduce by rule 343 + RESOURCE reduce by rule 343 + CPU reduce by rule 343 + LATENCY reduce by rule 343 + EXCEPTION reduce by rule 343 + EOF reduce by rule 343 + + + . error + + + state 619: + + consbind : sym of_ty consassembly consencoding rtl nop . nullified delayslot delayslotcandidate sdi latency pipeline + + ARCHITECTURE reduce by rule 167 + END reduce by rule 167 + LOCAL reduce by rule 167 + IN reduce by rule 167 + DATATYPE reduce by rule 167 + TYPE reduce by rule 167 + AND reduce by rule 167 + RPAREN reduce by rule 167 + SEMICOLON reduce by rule 167 + STORAGE reduce by rule 167 + LOCATIONS reduce by rule 167 + BAR reduce by rule 167 + STRUCTURE reduce by rule 167 + FUNCTOR reduce by rule 167 + SIGNATURE reduce by rule 167 + SHARING reduce by rule 167 + INSTRUCTION reduce by rule 167 + VLIW reduce by rule 167 + SUPERSCALAR reduce by rule 167 + WITHTYPE reduce by rule 167 + FUN reduce by rule 167 + VAL reduce by rule 167 + INCLUDE reduce by rule 167 + OPEN reduce by rule 167 + LITTLE reduce by rule 167 + BIG reduce by rule 167 + PIPELINE reduce by rule 167 + LOWERCASE reduce by rule 167 + UPPERCASE reduce by rule 167 + VERBATIM reduce by rule 167 + RTL reduce by rule 167 + SPAN reduce by rule 167 + DELAYSLOT reduce by rule 167 + NONFIX reduce by rule 167 + INFIX reduce by rule 167 + INFIXR reduce by rule 167 + DEBUG reduce by rule 167 + DELAYSLOT_COLON reduce by rule 167 + NULLIFIED_COLON shift 657 + RESOURCE reduce by rule 167 + CPU reduce by rule 167 + LATENCY reduce by rule 167 + EXCEPTION reduce by rule 167 + EOF reduce by rule 167 + + nullified goto 656 + + . error + + + state 620: + + nop : PADDING_COLON . flag + nop : PADDING_COLON . False + nop : PADDING_COLON . True + + NOT shift 662 + CELLSET shift 50 + TRUE shift 99 + FALSE shift 98 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + + id goto 661 + flag goto 660 + True goto 659 + False goto 658 + + . error + + + state 621: + + exp : exp . HANDLE clauses + rtl : RTL_COLON exp . (reduce by rule 116) + + ARCHITECTURE reduce by rule 116 + END reduce by rule 116 + LOCAL reduce by rule 116 + IN reduce by rule 116 + DATATYPE reduce by rule 116 + TYPE reduce by rule 116 + AND reduce by rule 116 + RPAREN reduce by rule 116 + SEMICOLON reduce by rule 116 + STORAGE reduce by rule 116 + LOCATIONS reduce by rule 116 + BAR reduce by rule 116 + HANDLE shift 402 + STRUCTURE reduce by rule 116 + FUNCTOR reduce by rule 116 + SIGNATURE reduce by rule 116 + SHARING reduce by rule 116 + INSTRUCTION reduce by rule 116 + VLIW reduce by rule 116 + SUPERSCALAR reduce by rule 116 + WITHTYPE reduce by rule 116 + FUN reduce by rule 116 + VAL reduce by rule 116 + INCLUDE reduce by rule 116 + OPEN reduce by rule 116 + LITTLE reduce by rule 116 + BIG reduce by rule 116 + PIPELINE reduce by rule 116 + LOWERCASE reduce by rule 116 + UPPERCASE reduce by rule 116 + VERBATIM reduce by rule 116 + RTL reduce by rule 116 + SPAN reduce by rule 116 + DELAYSLOT reduce by rule 116 + NONFIX reduce by rule 116 + INFIX reduce by rule 116 + INFIXR reduce by rule 116 + DEBUG reduce by rule 116 + DELAYSLOT_COLON reduce by rule 116 + NULLIFIED_COLON reduce by rule 116 + PADDING_COLON reduce by rule 116 + RESOURCE reduce by rule 116 + CPU reduce by rule 116 + LATENCY reduce by rule 116 + EXCEPTION reduce by rule 116 + EOF reduce by rule 116 + + + . error + + + state 622: + + consencoding : id LBRACE labexps0 . RBRACE + + RBRACE shift 663 + + + . error + + + state 623: + + consencoding : LPAREN expseq RPAREN . (reduce by rule 178) + + ARCHITECTURE reduce by rule 178 + END reduce by rule 178 + LOCAL reduce by rule 178 + IN reduce by rule 178 + DATATYPE reduce by rule 178 + TYPE reduce by rule 178 + AND reduce by rule 178 + RPAREN reduce by rule 178 + SEMICOLON reduce by rule 178 + STORAGE reduce by rule 178 + LOCATIONS reduce by rule 178 + BAR reduce by rule 178 + STRUCTURE reduce by rule 178 + FUNCTOR reduce by rule 178 + SIGNATURE reduce by rule 178 + SHARING reduce by rule 178 + INSTRUCTION reduce by rule 178 + VLIW reduce by rule 178 + SUPERSCALAR reduce by rule 178 + WITHTYPE reduce by rule 178 + FUN reduce by rule 178 + VAL reduce by rule 178 + INCLUDE reduce by rule 178 + OPEN reduce by rule 178 + LITTLE reduce by rule 178 + BIG reduce by rule 178 + PIPELINE reduce by rule 178 + LOWERCASE reduce by rule 178 + UPPERCASE reduce by rule 178 + VERBATIM reduce by rule 178 + RTL reduce by rule 178 + SPAN reduce by rule 178 + DELAYSLOT reduce by rule 178 + NONFIX reduce by rule 178 + INFIX reduce by rule 178 + INFIXR reduce by rule 178 + DEBUG reduce by rule 178 + RTL_COLON reduce by rule 178 + DELAYSLOT_COLON reduce by rule 178 + NULLIFIED_COLON reduce by rule 178 + PADDING_COLON reduce by rule 178 + RESOURCE reduce by rule 178 + CPU reduce by rule 178 + LATENCY reduce by rule 178 + EXCEPTION reduce by rule 178 + EOF reduce by rule 178 + + + . error + + + state 624: + + consencoding : LPAREN exps2 RPAREN . (reduce by rule 179) + + ARCHITECTURE reduce by rule 179 + END reduce by rule 179 + LOCAL reduce by rule 179 + IN reduce by rule 179 + DATATYPE reduce by rule 179 + TYPE reduce by rule 179 + AND reduce by rule 179 + RPAREN reduce by rule 179 + SEMICOLON reduce by rule 179 + STORAGE reduce by rule 179 + LOCATIONS reduce by rule 179 + BAR reduce by rule 179 + STRUCTURE reduce by rule 179 + FUNCTOR reduce by rule 179 + SIGNATURE reduce by rule 179 + SHARING reduce by rule 179 + INSTRUCTION reduce by rule 179 + VLIW reduce by rule 179 + SUPERSCALAR reduce by rule 179 + WITHTYPE reduce by rule 179 + FUN reduce by rule 179 + VAL reduce by rule 179 + INCLUDE reduce by rule 179 + OPEN reduce by rule 179 + LITTLE reduce by rule 179 + BIG reduce by rule 179 + PIPELINE reduce by rule 179 + LOWERCASE reduce by rule 179 + UPPERCASE reduce by rule 179 + VERBATIM reduce by rule 179 + RTL reduce by rule 179 + SPAN reduce by rule 179 + DELAYSLOT reduce by rule 179 + NONFIX reduce by rule 179 + INFIX reduce by rule 179 + INFIXR reduce by rule 179 + DEBUG reduce by rule 179 + RTL_COLON reduce by rule 179 + DELAYSLOT_COLON reduce by rule 179 + NULLIFIED_COLON reduce by rule 179 + PADDING_COLON reduce by rule 179 + RESOURCE reduce by rule 179 + CPU reduce by rule 179 + LATENCY reduce by rule 179 + EXCEPTION reduce by rule 179 + EOF reduce by rule 179 + + + . error + + + state 625: + + expseq : typedexp SEMICOLON . expseq + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 337 + typedexp goto 593 + expseq goto 664 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 626: + + formatbind : id opt_of LBRACE fields RBRACE . opt_exp + + ARCHITECTURE reduce by rule 207 + END reduce by rule 207 + LOCAL reduce by rule 207 + IN reduce by rule 207 + DATATYPE reduce by rule 207 + TYPE reduce by rule 207 + EQ shift 666 + RPAREN reduce by rule 207 + SEMICOLON reduce by rule 207 + STORAGE reduce by rule 207 + LOCATIONS reduce by rule 207 + BAR reduce by rule 207 + STRUCTURE reduce by rule 207 + FUNCTOR reduce by rule 207 + SIGNATURE reduce by rule 207 + SHARING reduce by rule 207 + INSTRUCTION reduce by rule 207 + VLIW reduce by rule 207 + SUPERSCALAR reduce by rule 207 + FUN reduce by rule 207 + VAL reduce by rule 207 + INCLUDE reduce by rule 207 + OPEN reduce by rule 207 + LITTLE reduce by rule 207 + BIG reduce by rule 207 + PIPELINE reduce by rule 207 + LOWERCASE reduce by rule 207 + UPPERCASE reduce by rule 207 + VERBATIM reduce by rule 207 + RTL reduce by rule 207 + NONFIX reduce by rule 207 + INFIX reduce by rule 207 + INFIXR reduce by rule 207 + DEBUG reduce by rule 207 + RESOURCE reduce by rule 207 + CPU reduce by rule 207 + LATENCY reduce by rule 207 + EXCEPTION reduce by rule 207 + EOF reduce by rule 207 + + opt_exp goto 665 + + . error + + + state 627: + + field : fieldid COLON . cnv signedness width unsignedint_opt + + EQ reduce by rule 215 + DOLLAR shift 669 + RBRACE reduce by rule 215 + CELLSET shift 50 + COMMA reduce by rule 215 + SIGNED reduce by rule 215 + UNSIGNED reduce by rule 215 + ID shift 49 + SYMBOL shift 48 + INT reduce by rule 215 + + id goto 668 + cnv goto 667 + + . error + + + state 628: + + fields : field COMMA . fields + + CELLSET shift 50 + WILD shift 564 + ID shift 49 + SYMBOL shift 48 + + id goto 563 + field goto 562 + fieldid goto 561 + fields goto 670 + + . error + + + state 629: + + mymldecl : FUNCTOR id LPAREN functorarg RPAREN sigcon EQ . structexp + + CELLSET shift 50 + STRUCT shift 364 + ID shift 49 + SYMBOL shift 48 + + structexp goto 671 + id goto 114 + ident goto 362 + ident2 goto 112 + path goto 85 + + . error + + + state 630: + + structexp : structexp . LPAREN scopeddecls RPAREN + structexp : structexp . LPAREN ident RPAREN + mymldecl : FUNCTOR id LPAREN functorarg RPAREN EQ structexp . (reduce by rule 73) + + ARCHITECTURE reduce by rule 73 + END reduce by rule 73 + LOCAL reduce by rule 73 + IN reduce by rule 73 + DATATYPE reduce by rule 73 + TYPE reduce by rule 73 + LPAREN shift 477 + RPAREN reduce by rule 73 + SEMICOLON reduce by rule 73 + STORAGE reduce by rule 73 + LOCATIONS reduce by rule 73 + STRUCTURE reduce by rule 73 + FUNCTOR reduce by rule 73 + SIGNATURE reduce by rule 73 + SHARING reduce by rule 73 + INSTRUCTION reduce by rule 73 + VLIW reduce by rule 73 + SUPERSCALAR reduce by rule 73 + FUN reduce by rule 73 + VAL reduce by rule 73 + INCLUDE reduce by rule 73 + OPEN reduce by rule 73 + LITTLE reduce by rule 73 + BIG reduce by rule 73 + PIPELINE reduce by rule 73 + LOWERCASE reduce by rule 73 + UPPERCASE reduce by rule 73 + VERBATIM reduce by rule 73 + RTL reduce by rule 73 + NONFIX reduce by rule 73 + INFIX reduce by rule 73 + INFIXR reduce by rule 73 + DEBUG reduce by rule 73 + RESOURCE reduce by rule 73 + CPU reduce by rule 73 + LATENCY reduce by rule 73 + EXCEPTION reduce by rule 73 + EOF reduce by rule 73 + + + . error + + + state 631: + + structexp : structexp LPAREN scopeddecls RPAREN . (reduce by rule 125) + + ARCHITECTURE reduce by rule 125 + END reduce by rule 125 + LOCAL reduce by rule 125 + IN reduce by rule 125 + DATATYPE reduce by rule 125 + TYPE reduce by rule 125 + EQ reduce by rule 125 + AND reduce by rule 125 + LPAREN reduce by rule 125 + RPAREN reduce by rule 125 + SEMICOLON reduce by rule 125 + STORAGE reduce by rule 125 + LOCATIONS reduce by rule 125 + STRUCTURE reduce by rule 125 + FUNCTOR reduce by rule 125 + SIGNATURE reduce by rule 125 + WHERE reduce by rule 125 + SHARING reduce by rule 125 + INSTRUCTION reduce by rule 125 + VLIW reduce by rule 125 + SUPERSCALAR reduce by rule 125 + FUN reduce by rule 125 + VAL reduce by rule 125 + INCLUDE reduce by rule 125 + OPEN reduce by rule 125 + LITTLE reduce by rule 125 + BIG reduce by rule 125 + PIPELINE reduce by rule 125 + LOWERCASE reduce by rule 125 + UPPERCASE reduce by rule 125 + VERBATIM reduce by rule 125 + RTL reduce by rule 125 + NONFIX reduce by rule 125 + INFIX reduce by rule 125 + INFIXR reduce by rule 125 + DEBUG reduce by rule 125 + RESOURCE reduce by rule 125 + CPU reduce by rule 125 + LATENCY reduce by rule 125 + EXCEPTION reduce by rule 125 + EOF reduce by rule 125 + + + . error + + + state 632: + + structexp : structexp LPAREN ident RPAREN . (reduce by rule 126) + + ARCHITECTURE reduce by rule 126 + END reduce by rule 126 + LOCAL reduce by rule 126 + IN reduce by rule 126 + DATATYPE reduce by rule 126 + TYPE reduce by rule 126 + EQ reduce by rule 126 + AND reduce by rule 126 + LPAREN reduce by rule 126 + RPAREN reduce by rule 126 + SEMICOLON reduce by rule 126 + STORAGE reduce by rule 126 + LOCATIONS reduce by rule 126 + STRUCTURE reduce by rule 126 + FUNCTOR reduce by rule 126 + SIGNATURE reduce by rule 126 + WHERE reduce by rule 126 + SHARING reduce by rule 126 + INSTRUCTION reduce by rule 126 + VLIW reduce by rule 126 + SUPERSCALAR reduce by rule 126 + FUN reduce by rule 126 + VAL reduce by rule 126 + INCLUDE reduce by rule 126 + OPEN reduce by rule 126 + LITTLE reduce by rule 126 + BIG reduce by rule 126 + PIPELINE reduce by rule 126 + LOWERCASE reduce by rule 126 + UPPERCASE reduce by rule 126 + VERBATIM reduce by rule 126 + RTL reduce by rule 126 + NONFIX reduce by rule 126 + INFIX reduce by rule 126 + INFIXR reduce by rule 126 + DEBUG reduce by rule 126 + RESOURCE reduce by rule 126 + CPU reduce by rule 126 + LATENCY reduce by rule 126 + EXCEPTION reduce by rule 126 + EOF reduce by rule 126 + + + . error + + + state 633: + + storagedecl : id EQ DOLLAR id LBRACKET cellcount . RBRACKET bitSize aliasing defaults printcell + + RBRACKET shift 672 + + + . error + + + state 634: + + cellcount : int . (reduce by rule 388) + + RBRACKET reduce by rule 388 + + + . error + + + state 635: + + datatypebind : tyvarseq id opcodeencoding fieldty hasasm EQ . consbinds + datatypebind : tyvarseq id opcodeencoding fieldty hasasm EQ . DATATYPE ty + + DATATYPE shift 674 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 138 + symb goto 67 + consbinds goto 673 + consbind goto 136 + + . error + + + state 636: + + encodingexps : encodingexp COMMA encodingexps . (reduce by rule 138) + + RBRACKET reduce by rule 138 + + + . error + + + state 637: + + encodingexp : int int DOTDOT . int + + INT shift 64 + + int goto 675 + + . error + + + state 638: + + encodingexp : int DOTDOT int . (reduce by rule 140) + + RBRACKET reduce by rule 140 + COMMA reduce by rule 140 + + + . error + + + state 639: + + resources : resource COMMA resources . (reduce by rule 36) + + RBRACKET reduce by rule 36 + + + . error + + + state 640: + + aexp2 : aexp2 AT LBRACKET slices RBRACKET . (reduce by rule 265) + + ARCHITECTURE reduce by rule 265 + END reduce by rule 265 + LOCAL reduce by rule 265 + IN reduce by rule 265 + OF reduce by rule 265 + DATATYPE reduce by rule 265 + TYPE reduce by rule 265 + EQ reduce by rule 265 + DOLLAR reduce by rule 265 + TIMES reduce by rule 265 + AND reduce by rule 265 + DEREF reduce by rule 265 + NOT reduce by rule 265 + LLBRACKET reduce by rule 265 + LHASHBRACKET reduce by rule 265 + LPAREN reduce by rule 265 + RPAREN reduce by rule 265 + LBRACKET reduce by rule 265 + RBRACKET reduce by rule 265 + LBRACE reduce by rule 265 + RBRACE reduce by rule 265 + SEMICOLON reduce by rule 265 + LDQUOTE reduce by rule 265 + RMETA reduce by rule 265 + CELLSET reduce by rule 265 + STORAGE reduce by rule 265 + LOCATIONS reduce by rule 265 + HASH reduce by rule 265 + COMMA reduce by rule 265 + COLON reduce by rule 265 + AT reduce by rule 265 + BAR reduce by rule 265 + DARROW reduce by rule 265 + THEN reduce by rule 265 + ELSE reduce by rule 265 + TRUE reduce by rule 265 + FALSE reduce by rule 265 + HANDLE reduce by rule 265 + LET reduce by rule 265 + STRUCTURE reduce by rule 265 + FUNCTOR reduce by rule 265 + SIGNATURE reduce by rule 265 + SHARING reduce by rule 265 + INSTRUCTION reduce by rule 265 + VLIW reduce by rule 265 + SUPERSCALAR reduce by rule 265 + WITHTYPE reduce by rule 265 + FUN reduce by rule 265 + VAL reduce by rule 265 + INCLUDE reduce by rule 265 + OPEN reduce by rule 265 + OP reduce by rule 265 + LITTLE reduce by rule 265 + BIG reduce by rule 265 + PIPELINE reduce by rule 265 + LOWERCASE reduce by rule 265 + UPPERCASE reduce by rule 265 + VERBATIM reduce by rule 265 + RTL reduce by rule 265 + SPAN reduce by rule 265 + DELAYSLOT reduce by rule 265 + ALWAYS reduce by rule 265 + NEVER reduce by rule 265 + NONFIX reduce by rule 265 + INFIX reduce by rule 265 + INFIXR reduce by rule 265 + DEBUG reduce by rule 265 + ASM_COLON reduce by rule 265 + MC_COLON reduce by rule 265 + RTL_COLON reduce by rule 265 + DELAYSLOT_COLON reduce by rule 265 + NULLIFIED_COLON reduce by rule 265 + PADDING_COLON reduce by rule 265 + RESOURCE reduce by rule 265 + CPU reduce by rule 265 + LATENCY reduce by rule 265 + EXCEPTION reduce by rule 265 + ID reduce by rule 265 + SYMBOL reduce by rule 265 + WORD reduce by rule 265 + INT reduce by rule 265 + INTINF reduce by rule 265 + REAL reduce by rule 265 + STRING reduce by rule 265 + CHAR reduce by rule 265 + EOF reduce by rule 265 + + + . error + + + state 641: + + slices : slice COMMA . slices + + INT shift 64 + + int goto 590 + slice goto 589 + slices goto 676 + + . error + + + state 642: + + slice : int DOTDOT . int + + INT shift 64 + + int goto 677 + + . error + + + state 643: + + aexp : sym CONCAT LBRACKET exps RBRACKET . (reduce by rule 256) + aexp : sym CONCAT LBRACKET exps RBRACKET . CONCAT sym + + ARCHITECTURE reduce by rule 256 + END reduce by rule 256 + LOCAL reduce by rule 256 + IN reduce by rule 256 + OF reduce by rule 256 + DATATYPE reduce by rule 256 + TYPE reduce by rule 256 + EQ reduce by rule 256 + DOLLAR reduce by rule 256 + TIMES reduce by rule 256 + AND reduce by rule 256 + DEREF reduce by rule 256 + NOT reduce by rule 256 + CONCAT shift 678 + LLBRACKET reduce by rule 256 + LHASHBRACKET reduce by rule 256 + LPAREN reduce by rule 256 + RPAREN reduce by rule 256 + LBRACKET reduce by rule 256 + RBRACKET reduce by rule 256 + LBRACE reduce by rule 256 + RBRACE reduce by rule 256 + SEMICOLON reduce by rule 256 + LDQUOTE reduce by rule 256 + RMETA reduce by rule 256 + CELLSET reduce by rule 256 + STORAGE reduce by rule 256 + LOCATIONS reduce by rule 256 + HASH reduce by rule 256 + COMMA reduce by rule 256 + COLON reduce by rule 256 + AT reduce by rule 256 + BAR reduce by rule 256 + DARROW reduce by rule 256 + THEN reduce by rule 256 + ELSE reduce by rule 256 + TRUE reduce by rule 256 + FALSE reduce by rule 256 + HANDLE reduce by rule 256 + LET reduce by rule 256 + STRUCTURE reduce by rule 256 + FUNCTOR reduce by rule 256 + SIGNATURE reduce by rule 256 + SHARING reduce by rule 256 + INSTRUCTION reduce by rule 256 + VLIW reduce by rule 256 + SUPERSCALAR reduce by rule 256 + WITHTYPE reduce by rule 256 + FUN reduce by rule 256 + VAL reduce by rule 256 + INCLUDE reduce by rule 256 + OPEN reduce by rule 256 + OP reduce by rule 256 + LITTLE reduce by rule 256 + BIG reduce by rule 256 + PIPELINE reduce by rule 256 + LOWERCASE reduce by rule 256 + UPPERCASE reduce by rule 256 + VERBATIM reduce by rule 256 + RTL reduce by rule 256 + SPAN reduce by rule 256 + DELAYSLOT reduce by rule 256 + ALWAYS reduce by rule 256 + NEVER reduce by rule 256 + NONFIX reduce by rule 256 + INFIX reduce by rule 256 + INFIXR reduce by rule 256 + DEBUG reduce by rule 256 + ASM_COLON reduce by rule 256 + MC_COLON reduce by rule 256 + RTL_COLON reduce by rule 256 + DELAYSLOT_COLON reduce by rule 256 + NULLIFIED_COLON reduce by rule 256 + PADDING_COLON reduce by rule 256 + RESOURCE reduce by rule 256 + CPU reduce by rule 256 + LATENCY reduce by rule 256 + EXCEPTION reduce by rule 256 + ID reduce by rule 256 + SYMBOL reduce by rule 256 + WORD reduce by rule 256 + INT reduce by rule 256 + INTINF reduce by rule 256 + REAL reduce by rule 256 + STRING reduce by rule 256 + CHAR reduce by rule 256 + EOF reduce by rule 256 + + + . error + + + state 644: + + aexp : LET decls IN expseq END . (reduce by rule 259) + + ARCHITECTURE reduce by rule 259 + END reduce by rule 259 + LOCAL reduce by rule 259 + IN reduce by rule 259 + OF reduce by rule 259 + DATATYPE reduce by rule 259 + TYPE reduce by rule 259 + EQ reduce by rule 259 + DOLLAR reduce by rule 259 + TIMES reduce by rule 259 + AND reduce by rule 259 + DEREF reduce by rule 259 + NOT reduce by rule 259 + LLBRACKET reduce by rule 259 + LHASHBRACKET reduce by rule 259 + LPAREN reduce by rule 259 + RPAREN reduce by rule 259 + LBRACKET reduce by rule 259 + RBRACKET reduce by rule 259 + LBRACE reduce by rule 259 + RBRACE reduce by rule 259 + SEMICOLON reduce by rule 259 + LDQUOTE reduce by rule 259 + RMETA reduce by rule 259 + CELLSET reduce by rule 259 + STORAGE reduce by rule 259 + LOCATIONS reduce by rule 259 + HASH reduce by rule 259 + COMMA reduce by rule 259 + COLON reduce by rule 259 + AT reduce by rule 259 + BAR reduce by rule 259 + DARROW reduce by rule 259 + THEN reduce by rule 259 + ELSE reduce by rule 259 + TRUE reduce by rule 259 + FALSE reduce by rule 259 + HANDLE reduce by rule 259 + LET reduce by rule 259 + STRUCTURE reduce by rule 259 + FUNCTOR reduce by rule 259 + SIGNATURE reduce by rule 259 + SHARING reduce by rule 259 + INSTRUCTION reduce by rule 259 + VLIW reduce by rule 259 + SUPERSCALAR reduce by rule 259 + WITHTYPE reduce by rule 259 + FUN reduce by rule 259 + VAL reduce by rule 259 + INCLUDE reduce by rule 259 + OPEN reduce by rule 259 + OP reduce by rule 259 + LITTLE reduce by rule 259 + BIG reduce by rule 259 + PIPELINE reduce by rule 259 + LOWERCASE reduce by rule 259 + UPPERCASE reduce by rule 259 + VERBATIM reduce by rule 259 + RTL reduce by rule 259 + SPAN reduce by rule 259 + DELAYSLOT reduce by rule 259 + ALWAYS reduce by rule 259 + NEVER reduce by rule 259 + NONFIX reduce by rule 259 + INFIX reduce by rule 259 + INFIXR reduce by rule 259 + DEBUG reduce by rule 259 + ASM_COLON reduce by rule 259 + MC_COLON reduce by rule 259 + RTL_COLON reduce by rule 259 + DELAYSLOT_COLON reduce by rule 259 + NULLIFIED_COLON reduce by rule 259 + PADDING_COLON reduce by rule 259 + RESOURCE reduce by rule 259 + CPU reduce by rule 259 + LATENCY reduce by rule 259 + EXCEPTION reduce by rule 259 + ID reduce by rule 259 + SYMBOL reduce by rule 259 + WORD reduce by rule 259 + INT reduce by rule 259 + INTINF reduce by rule 259 + REAL reduce by rule 259 + STRING reduce by rule 259 + CHAR reduce by rule 259 + EOF reduce by rule 259 + + + . error + + + state 645: + + exp : IF typedexp THEN typedexp ELSE . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 679 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 646: + + clause : typedpat guard cont DARROW . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 680 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 647: + + aexp : LBRACKET exps RBRACKET CONCAT sym . (reduce by rule 257) + + ARCHITECTURE reduce by rule 257 + END reduce by rule 257 + LOCAL reduce by rule 257 + IN reduce by rule 257 + OF reduce by rule 257 + DATATYPE reduce by rule 257 + TYPE reduce by rule 257 + EQ reduce by rule 257 + DOLLAR reduce by rule 257 + TIMES reduce by rule 257 + AND reduce by rule 257 + DEREF reduce by rule 257 + NOT reduce by rule 257 + LLBRACKET reduce by rule 257 + LHASHBRACKET reduce by rule 257 + LPAREN reduce by rule 257 + RPAREN reduce by rule 257 + LBRACKET reduce by rule 257 + RBRACKET reduce by rule 257 + LBRACE reduce by rule 257 + RBRACE reduce by rule 257 + SEMICOLON reduce by rule 257 + LDQUOTE reduce by rule 257 + RMETA reduce by rule 257 + CELLSET reduce by rule 257 + STORAGE reduce by rule 257 + LOCATIONS reduce by rule 257 + HASH reduce by rule 257 + COMMA reduce by rule 257 + COLON reduce by rule 257 + AT reduce by rule 257 + BAR reduce by rule 257 + DARROW reduce by rule 257 + THEN reduce by rule 257 + ELSE reduce by rule 257 + TRUE reduce by rule 257 + FALSE reduce by rule 257 + HANDLE reduce by rule 257 + LET reduce by rule 257 + STRUCTURE reduce by rule 257 + FUNCTOR reduce by rule 257 + SIGNATURE reduce by rule 257 + SHARING reduce by rule 257 + INSTRUCTION reduce by rule 257 + VLIW reduce by rule 257 + SUPERSCALAR reduce by rule 257 + WITHTYPE reduce by rule 257 + FUN reduce by rule 257 + VAL reduce by rule 257 + INCLUDE reduce by rule 257 + OPEN reduce by rule 257 + OP reduce by rule 257 + LITTLE reduce by rule 257 + BIG reduce by rule 257 + PIPELINE reduce by rule 257 + LOWERCASE reduce by rule 257 + UPPERCASE reduce by rule 257 + VERBATIM reduce by rule 257 + RTL reduce by rule 257 + SPAN reduce by rule 257 + DELAYSLOT reduce by rule 257 + ALWAYS reduce by rule 257 + NEVER reduce by rule 257 + NONFIX reduce by rule 257 + INFIX reduce by rule 257 + INFIXR reduce by rule 257 + DEBUG reduce by rule 257 + ASM_COLON reduce by rule 257 + MC_COLON reduce by rule 257 + RTL_COLON reduce by rule 257 + DELAYSLOT_COLON reduce by rule 257 + NULLIFIED_COLON reduce by rule 257 + PADDING_COLON reduce by rule 257 + RESOURCE reduce by rule 257 + CPU reduce by rule 257 + LATENCY reduce by rule 257 + EXCEPTION reduce by rule 257 + ID reduce by rule 257 + SYMBOL reduce by rule 257 + WORD reduce by rule 257 + INT reduce by rule 257 + INTINF reduce by rule 257 + REAL reduce by rule 257 + STRING reduce by rule 257 + CHAR reduce by rule 257 + EOF reduce by rule 257 + + + . error + + + state 648: + + aexp : DOLLAR id LBRACKET exp region . RBRACKET + + RBRACKET shift 681 + + + . error + + + state 649: + + region : COLON . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 682 + + . error + + + state 650: + + apat : sym CONCAT LBRACKET pats RBRACKET CONCAT sym . (reduce by rule 304) + + EQ reduce by rule 304 + TIMES reduce by rule 304 + AND reduce by rule 304 + DEREF reduce by rule 304 + NOT reduce by rule 304 + LHASHBRACKET reduce by rule 304 + LPAREN reduce by rule 304 + RPAREN reduce by rule 304 + LBRACKET reduce by rule 304 + RBRACKET reduce by rule 304 + LBRACE reduce by rule 304 + RBRACE reduce by rule 304 + CELLSET reduce by rule 304 + COMMA reduce by rule 304 + COLON reduce by rule 304 + BAR reduce by rule 304 + DARROW reduce by rule 304 + TRUE reduce by rule 304 + FALSE reduce by rule 304 + WILD reduce by rule 304 + WHERE reduce by rule 304 + OP reduce by rule 304 + ALWAYS reduce by rule 304 + NEVER reduce by rule 304 + EXCEPTION reduce by rule 304 + ID reduce by rule 304 + SYMBOL reduce by rule 304 + WORD reduce by rule 304 + INT reduce by rule 304 + INTINF reduce by rule 304 + REAL reduce by rule 304 + STRING reduce by rule 304 + CHAR reduce by rule 304 + + + . error + + + state 651: + + apat : LPAREN typedpat WHERE typedexp IN typedpat RPAREN . (reduce by rule 301) + + EQ reduce by rule 301 + TIMES reduce by rule 301 + AND reduce by rule 301 + DEREF reduce by rule 301 + NOT reduce by rule 301 + LHASHBRACKET reduce by rule 301 + LPAREN reduce by rule 301 + RPAREN reduce by rule 301 + LBRACKET reduce by rule 301 + RBRACKET reduce by rule 301 + LBRACE reduce by rule 301 + RBRACE reduce by rule 301 + CELLSET reduce by rule 301 + COMMA reduce by rule 301 + COLON reduce by rule 301 + BAR reduce by rule 301 + DARROW reduce by rule 301 + TRUE reduce by rule 301 + FALSE reduce by rule 301 + WILD reduce by rule 301 + WHERE reduce by rule 301 + OP reduce by rule 301 + ALWAYS reduce by rule 301 + NEVER reduce by rule 301 + EXCEPTION reduce by rule 301 + ID reduce by rule 301 + SYMBOL reduce by rule 301 + WORD reduce by rule 301 + INT reduce by rule 301 + INTINF reduce by rule 301 + REAL reduce by rule 301 + STRING reduce by rule 301 + CHAR reduce by rule 301 + + + . error + + + state 652: + + cycles : cycle COMMA cycles . (reduce by rule 48) + + RBRACKET reduce by rule 48 + + + . error + + error: state 653: shift/reduce conflict (shift CONCAT, reduce by rule 50) + error: state 653: shift/reduce conflict (shift TIMES, reduce by rule 50) + + state 653: + + cycle : cycle . CONCAT cycle + cycle : cycle CONCAT cycle . (reduce by rule 50) + cycle : cycle . TIMES int + + TIMES shift 614 + CONCAT shift 613 + RPAREN reduce by rule 50 + RBRACKET reduce by rule 50 + COMMA reduce by rule 50 + + + . error + + + state 654: + + cycle : cycle TIMES int . (reduce by rule 51) + + TIMES reduce by rule 51 + CONCAT reduce by rule 51 + RPAREN reduce by rule 51 + RBRACKET reduce by rule 51 + COMMA reduce by rule 51 + + + . error + + + state 655: + + cycle : LPAREN cycle RPAREN . (reduce by rule 52) + + TIMES reduce by rule 52 + CONCAT reduce by rule 52 + RPAREN reduce by rule 52 + RBRACKET reduce by rule 52 + COMMA reduce by rule 52 + + + . error + + + state 656: + + consbind : sym of_ty consassembly consencoding rtl nop nullified . delayslot delayslotcandidate sdi latency pipeline + + ARCHITECTURE reduce by rule 170 + END reduce by rule 170 + LOCAL reduce by rule 170 + IN reduce by rule 170 + DATATYPE reduce by rule 170 + TYPE reduce by rule 170 + AND reduce by rule 170 + RPAREN reduce by rule 170 + SEMICOLON reduce by rule 170 + STORAGE reduce by rule 170 + LOCATIONS reduce by rule 170 + BAR reduce by rule 170 + STRUCTURE reduce by rule 170 + FUNCTOR reduce by rule 170 + SIGNATURE reduce by rule 170 + SHARING reduce by rule 170 + INSTRUCTION reduce by rule 170 + VLIW reduce by rule 170 + SUPERSCALAR reduce by rule 170 + WITHTYPE reduce by rule 170 + FUN reduce by rule 170 + VAL reduce by rule 170 + INCLUDE reduce by rule 170 + OPEN reduce by rule 170 + LITTLE reduce by rule 170 + BIG reduce by rule 170 + PIPELINE reduce by rule 170 + LOWERCASE reduce by rule 170 + UPPERCASE reduce by rule 170 + VERBATIM reduce by rule 170 + RTL reduce by rule 170 + SPAN reduce by rule 170 + DELAYSLOT reduce by rule 170 + NONFIX reduce by rule 170 + INFIX reduce by rule 170 + INFIXR reduce by rule 170 + DEBUG reduce by rule 170 + DELAYSLOT_COLON shift 684 + RESOURCE reduce by rule 170 + CPU reduce by rule 170 + LATENCY reduce by rule 170 + EXCEPTION reduce by rule 170 + EOF reduce by rule 170 + + delayslot goto 683 + + . error + + + state 657: + + nullified : NULLIFIED_COLON . FALSE + nullified : NULLIFIED_COLON . flag + + NOT shift 662 + CELLSET shift 50 + FALSE shift 686 + ID shift 49 + SYMBOL shift 48 + + id goto 661 + flag goto 685 + + . error + + + state 658: + + nop : PADDING_COLON False . (reduce by rule 155) + + ARCHITECTURE reduce by rule 155 + END reduce by rule 155 + LOCAL reduce by rule 155 + IN reduce by rule 155 + DATATYPE reduce by rule 155 + TYPE reduce by rule 155 + AND reduce by rule 155 + RPAREN reduce by rule 155 + SEMICOLON reduce by rule 155 + STORAGE reduce by rule 155 + LOCATIONS reduce by rule 155 + BAR reduce by rule 155 + STRUCTURE reduce by rule 155 + FUNCTOR reduce by rule 155 + SIGNATURE reduce by rule 155 + SHARING reduce by rule 155 + INSTRUCTION reduce by rule 155 + VLIW reduce by rule 155 + SUPERSCALAR reduce by rule 155 + WITHTYPE reduce by rule 155 + FUN reduce by rule 155 + VAL reduce by rule 155 + INCLUDE reduce by rule 155 + OPEN reduce by rule 155 + LITTLE reduce by rule 155 + BIG reduce by rule 155 + PIPELINE reduce by rule 155 + LOWERCASE reduce by rule 155 + UPPERCASE reduce by rule 155 + VERBATIM reduce by rule 155 + RTL reduce by rule 155 + SPAN reduce by rule 155 + DELAYSLOT reduce by rule 155 + NONFIX reduce by rule 155 + INFIX reduce by rule 155 + INFIXR reduce by rule 155 + DEBUG reduce by rule 155 + DELAYSLOT_COLON reduce by rule 155 + NULLIFIED_COLON reduce by rule 155 + RESOURCE reduce by rule 155 + CPU reduce by rule 155 + LATENCY reduce by rule 155 + EXCEPTION reduce by rule 155 + EOF reduce by rule 155 + + + . error + + + state 659: + + nop : PADDING_COLON True . (reduce by rule 156) + + ARCHITECTURE reduce by rule 156 + END reduce by rule 156 + LOCAL reduce by rule 156 + IN reduce by rule 156 + DATATYPE reduce by rule 156 + TYPE reduce by rule 156 + AND reduce by rule 156 + RPAREN reduce by rule 156 + SEMICOLON reduce by rule 156 + STORAGE reduce by rule 156 + LOCATIONS reduce by rule 156 + BAR reduce by rule 156 + STRUCTURE reduce by rule 156 + FUNCTOR reduce by rule 156 + SIGNATURE reduce by rule 156 + SHARING reduce by rule 156 + INSTRUCTION reduce by rule 156 + VLIW reduce by rule 156 + SUPERSCALAR reduce by rule 156 + WITHTYPE reduce by rule 156 + FUN reduce by rule 156 + VAL reduce by rule 156 + INCLUDE reduce by rule 156 + OPEN reduce by rule 156 + LITTLE reduce by rule 156 + BIG reduce by rule 156 + PIPELINE reduce by rule 156 + LOWERCASE reduce by rule 156 + UPPERCASE reduce by rule 156 + VERBATIM reduce by rule 156 + RTL reduce by rule 156 + SPAN reduce by rule 156 + DELAYSLOT reduce by rule 156 + NONFIX reduce by rule 156 + INFIX reduce by rule 156 + INFIXR reduce by rule 156 + DEBUG reduce by rule 156 + DELAYSLOT_COLON reduce by rule 156 + NULLIFIED_COLON reduce by rule 156 + RESOURCE reduce by rule 156 + CPU reduce by rule 156 + LATENCY reduce by rule 156 + EXCEPTION reduce by rule 156 + EOF reduce by rule 156 + + + . error + + + state 660: + + nop : PADDING_COLON flag . (reduce by rule 154) + + ARCHITECTURE reduce by rule 154 + END reduce by rule 154 + LOCAL reduce by rule 154 + IN reduce by rule 154 + DATATYPE reduce by rule 154 + TYPE reduce by rule 154 + AND reduce by rule 154 + RPAREN reduce by rule 154 + SEMICOLON reduce by rule 154 + STORAGE reduce by rule 154 + LOCATIONS reduce by rule 154 + BAR reduce by rule 154 + STRUCTURE reduce by rule 154 + FUNCTOR reduce by rule 154 + SIGNATURE reduce by rule 154 + SHARING reduce by rule 154 + INSTRUCTION reduce by rule 154 + VLIW reduce by rule 154 + SUPERSCALAR reduce by rule 154 + WITHTYPE reduce by rule 154 + FUN reduce by rule 154 + VAL reduce by rule 154 + INCLUDE reduce by rule 154 + OPEN reduce by rule 154 + LITTLE reduce by rule 154 + BIG reduce by rule 154 + PIPELINE reduce by rule 154 + LOWERCASE reduce by rule 154 + UPPERCASE reduce by rule 154 + VERBATIM reduce by rule 154 + RTL reduce by rule 154 + SPAN reduce by rule 154 + DELAYSLOT reduce by rule 154 + NONFIX reduce by rule 154 + INFIX reduce by rule 154 + INFIXR reduce by rule 154 + DEBUG reduce by rule 154 + DELAYSLOT_COLON reduce by rule 154 + NULLIFIED_COLON reduce by rule 154 + RESOURCE reduce by rule 154 + CPU reduce by rule 154 + LATENCY reduce by rule 154 + EXCEPTION reduce by rule 154 + EOF reduce by rule 154 + + + . error + + error: state 661: shift/reduce conflict (shift AND, reduce by rule 165) + + state 661: + + flag : id . flagguard + flag : id . EQ True flagguard + flag : id . EQ False flagguard + + ARCHITECTURE reduce by rule 165 + END reduce by rule 165 + LOCAL reduce by rule 165 + IN reduce by rule 165 + DATATYPE reduce by rule 165 + TYPE reduce by rule 165 + EQ shift 689 + AND shift 688 + RPAREN reduce by rule 165 + SEMICOLON reduce by rule 165 + STORAGE reduce by rule 165 + LOCATIONS reduce by rule 165 + BAR reduce by rule 165 + STRUCTURE reduce by rule 165 + FUNCTOR reduce by rule 165 + SIGNATURE reduce by rule 165 + SHARING reduce by rule 165 + INSTRUCTION reduce by rule 165 + VLIW reduce by rule 165 + SUPERSCALAR reduce by rule 165 + WITHTYPE reduce by rule 165 + FUN reduce by rule 165 + VAL reduce by rule 165 + INCLUDE reduce by rule 165 + OPEN reduce by rule 165 + LITTLE reduce by rule 165 + BIG reduce by rule 165 + PIPELINE reduce by rule 165 + LOWERCASE reduce by rule 165 + UPPERCASE reduce by rule 165 + VERBATIM reduce by rule 165 + RTL reduce by rule 165 + SPAN reduce by rule 165 + DELAYSLOT reduce by rule 165 + NONFIX reduce by rule 165 + INFIX reduce by rule 165 + INFIXR reduce by rule 165 + DEBUG reduce by rule 165 + DELAYSLOT_COLON reduce by rule 165 + NULLIFIED_COLON reduce by rule 165 + RESOURCE reduce by rule 165 + CPU reduce by rule 165 + LATENCY reduce by rule 165 + EXCEPTION reduce by rule 165 + EOF reduce by rule 165 + + flagguard goto 687 + + . error + + + state 662: + + flag : NOT . id flagguard + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 690 + + . error + + + state 663: + + consencoding : id LBRACE labexps0 RBRACE . (reduce by rule 180) + + ARCHITECTURE reduce by rule 180 + END reduce by rule 180 + LOCAL reduce by rule 180 + IN reduce by rule 180 + DATATYPE reduce by rule 180 + TYPE reduce by rule 180 + AND reduce by rule 180 + RPAREN reduce by rule 180 + SEMICOLON reduce by rule 180 + STORAGE reduce by rule 180 + LOCATIONS reduce by rule 180 + BAR reduce by rule 180 + STRUCTURE reduce by rule 180 + FUNCTOR reduce by rule 180 + SIGNATURE reduce by rule 180 + SHARING reduce by rule 180 + INSTRUCTION reduce by rule 180 + VLIW reduce by rule 180 + SUPERSCALAR reduce by rule 180 + WITHTYPE reduce by rule 180 + FUN reduce by rule 180 + VAL reduce by rule 180 + INCLUDE reduce by rule 180 + OPEN reduce by rule 180 + LITTLE reduce by rule 180 + BIG reduce by rule 180 + PIPELINE reduce by rule 180 + LOWERCASE reduce by rule 180 + UPPERCASE reduce by rule 180 + VERBATIM reduce by rule 180 + RTL reduce by rule 180 + SPAN reduce by rule 180 + DELAYSLOT reduce by rule 180 + NONFIX reduce by rule 180 + INFIX reduce by rule 180 + INFIXR reduce by rule 180 + DEBUG reduce by rule 180 + RTL_COLON reduce by rule 180 + DELAYSLOT_COLON reduce by rule 180 + NULLIFIED_COLON reduce by rule 180 + PADDING_COLON reduce by rule 180 + RESOURCE reduce by rule 180 + CPU reduce by rule 180 + LATENCY reduce by rule 180 + EXCEPTION reduce by rule 180 + EOF reduce by rule 180 + + + . error + + + state 664: + + expseq : typedexp SEMICOLON expseq . (reduce by rule 283) + + END reduce by rule 283 + RPAREN reduce by rule 283 + + + . error + + + state 665: + + formatbind : id opt_of LBRACE fields RBRACE opt_exp . (reduce by rule 206) + + ARCHITECTURE reduce by rule 206 + END reduce by rule 206 + LOCAL reduce by rule 206 + IN reduce by rule 206 + DATATYPE reduce by rule 206 + TYPE reduce by rule 206 + RPAREN reduce by rule 206 + SEMICOLON reduce by rule 206 + STORAGE reduce by rule 206 + LOCATIONS reduce by rule 206 + BAR reduce by rule 206 + STRUCTURE reduce by rule 206 + FUNCTOR reduce by rule 206 + SIGNATURE reduce by rule 206 + SHARING reduce by rule 206 + INSTRUCTION reduce by rule 206 + VLIW reduce by rule 206 + SUPERSCALAR reduce by rule 206 + FUN reduce by rule 206 + VAL reduce by rule 206 + INCLUDE reduce by rule 206 + OPEN reduce by rule 206 + LITTLE reduce by rule 206 + BIG reduce by rule 206 + PIPELINE reduce by rule 206 + LOWERCASE reduce by rule 206 + UPPERCASE reduce by rule 206 + VERBATIM reduce by rule 206 + RTL reduce by rule 206 + NONFIX reduce by rule 206 + INFIX reduce by rule 206 + INFIXR reduce by rule 206 + DEBUG reduce by rule 206 + RESOURCE reduce by rule 206 + CPU reduce by rule 206 + LATENCY reduce by rule 206 + EXCEPTION reduce by rule 206 + EOF reduce by rule 206 + + + . error + + + state 666: + + opt_exp : EQ . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 691 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 667: + + field : fieldid COLON cnv . signedness width unsignedint_opt + + EQ reduce by rule 227 + RBRACE reduce by rule 227 + COMMA reduce by rule 227 + SIGNED shift 694 + UNSIGNED shift 693 + INT reduce by rule 227 + + signedness goto 692 + + . error + + + state 668: + + cnv : id . (reduce by rule 216) + + EQ reduce by rule 216 + RBRACE reduce by rule 216 + COMMA reduce by rule 216 + SIGNED reduce by rule 216 + UNSIGNED reduce by rule 216 + INT reduce by rule 216 + + + . error + + + state 669: + + cnv : DOLLAR . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 695 + + . error + + + state 670: + + fields : field COMMA fields . (reduce by rule 210) + + RBRACE reduce by rule 210 + + + . error + + + state 671: + + structexp : structexp . LPAREN scopeddecls RPAREN + structexp : structexp . LPAREN ident RPAREN + mymldecl : FUNCTOR id LPAREN functorarg RPAREN sigcon EQ structexp . (reduce by rule 74) + + ARCHITECTURE reduce by rule 74 + END reduce by rule 74 + LOCAL reduce by rule 74 + IN reduce by rule 74 + DATATYPE reduce by rule 74 + TYPE reduce by rule 74 + LPAREN shift 477 + RPAREN reduce by rule 74 + SEMICOLON reduce by rule 74 + STORAGE reduce by rule 74 + LOCATIONS reduce by rule 74 + STRUCTURE reduce by rule 74 + FUNCTOR reduce by rule 74 + SIGNATURE reduce by rule 74 + SHARING reduce by rule 74 + INSTRUCTION reduce by rule 74 + VLIW reduce by rule 74 + SUPERSCALAR reduce by rule 74 + FUN reduce by rule 74 + VAL reduce by rule 74 + INCLUDE reduce by rule 74 + OPEN reduce by rule 74 + LITTLE reduce by rule 74 + BIG reduce by rule 74 + PIPELINE reduce by rule 74 + LOWERCASE reduce by rule 74 + UPPERCASE reduce by rule 74 + VERBATIM reduce by rule 74 + RTL reduce by rule 74 + NONFIX reduce by rule 74 + INFIX reduce by rule 74 + INFIXR reduce by rule 74 + DEBUG reduce by rule 74 + RESOURCE reduce by rule 74 + CPU reduce by rule 74 + LATENCY reduce by rule 74 + EXCEPTION reduce by rule 74 + EOF reduce by rule 74 + + + . error + + + state 672: + + storagedecl : id EQ DOLLAR id LBRACKET cellcount RBRACKET . bitSize aliasing defaults printcell + + OF shift 697 + WHERE reduce by rule 387 + ASM_COLON reduce by rule 387 + ALIASING reduce by rule 387 + + bitSize goto 696 + + . error + + + state 673: + + datatypebind : tyvarseq id opcodeencoding fieldty hasasm EQ consbinds . (reduce by rule 129) + + ARCHITECTURE reduce by rule 129 + END reduce by rule 129 + LOCAL reduce by rule 129 + IN reduce by rule 129 + DATATYPE reduce by rule 129 + TYPE reduce by rule 129 + AND reduce by rule 129 + RPAREN reduce by rule 129 + SEMICOLON reduce by rule 129 + STORAGE reduce by rule 129 + LOCATIONS reduce by rule 129 + STRUCTURE reduce by rule 129 + FUNCTOR reduce by rule 129 + SIGNATURE reduce by rule 129 + SHARING reduce by rule 129 + INSTRUCTION reduce by rule 129 + VLIW reduce by rule 129 + SUPERSCALAR reduce by rule 129 + WITHTYPE reduce by rule 129 + FUN reduce by rule 129 + VAL reduce by rule 129 + INCLUDE reduce by rule 129 + OPEN reduce by rule 129 + LITTLE reduce by rule 129 + BIG reduce by rule 129 + PIPELINE reduce by rule 129 + LOWERCASE reduce by rule 129 + UPPERCASE reduce by rule 129 + VERBATIM reduce by rule 129 + RTL reduce by rule 129 + NONFIX reduce by rule 129 + INFIX reduce by rule 129 + INFIXR reduce by rule 129 + DEBUG reduce by rule 129 + RESOURCE reduce by rule 129 + CPU reduce by rule 129 + LATENCY reduce by rule 129 + EXCEPTION reduce by rule 129 + EOF reduce by rule 129 + + + . error + + + state 674: + + datatypebind : tyvarseq id opcodeencoding fieldty hasasm EQ DATATYPE . ty + + DOLLAR shift 271 + LPAREN shift 270 + LBRACE shift 269 + CELLSET shift 50 + HASH shift 268 + BITS shift 246 + INSTRUCTION shift 245 + CELL shift 244 + ID shift 49 + SYMBOL shift 48 + TYVAR shift 158 + + id goto 243 + tid goto 267 + tid2 goto 241 + tident goto 266 + tpath goto 265 + ty goto 698 + aty goto 263 + appty goto 262 + tuplety goto 261 + tyvar goto 260 + + . error + + + state 675: + + encodingexp : int int DOTDOT int . (reduce by rule 141) + + RBRACKET reduce by rule 141 + COMMA reduce by rule 141 + + + . error + + + state 676: + + slices : slice COMMA slices . (reduce by rule 410) + + RBRACKET reduce by rule 410 + + + . error + + + state 677: + + slice : int DOTDOT int . (reduce by rule 411) + + RBRACKET reduce by rule 411 + COMMA reduce by rule 411 + + + . error + + + state 678: + + aexp : sym CONCAT LBRACKET exps RBRACKET CONCAT . sym + + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 69 + sym goto 699 + symb goto 67 + + . error + + + state 679: + + exp : IF typedexp THEN typedexp ELSE exp . (reduce by rule 275) + exp : exp . HANDLE clauses + + ARCHITECTURE reduce by rule 275 + END reduce by rule 275 + LOCAL reduce by rule 275 + IN reduce by rule 275 + OF reduce by rule 275 + DATATYPE reduce by rule 275 + TYPE reduce by rule 275 + AND reduce by rule 275 + LPAREN reduce by rule 275 + RPAREN reduce by rule 275 + RBRACKET reduce by rule 275 + RBRACE reduce by rule 275 + SEMICOLON reduce by rule 275 + RMETA reduce by rule 275 + CELLSET reduce by rule 275 + STORAGE reduce by rule 275 + LOCATIONS reduce by rule 275 + COMMA reduce by rule 275 + COLON reduce by rule 275 + BAR reduce by rule 275 + DARROW reduce by rule 275 + THEN reduce by rule 275 + ELSE reduce by rule 275 + HANDLE reduce by rule 275 + STRUCTURE reduce by rule 275 + FUNCTOR reduce by rule 275 + SIGNATURE reduce by rule 275 + SHARING reduce by rule 275 + INSTRUCTION reduce by rule 275 + VLIW reduce by rule 275 + SUPERSCALAR reduce by rule 275 + WITHTYPE reduce by rule 275 + FUN reduce by rule 275 + VAL reduce by rule 275 + INCLUDE reduce by rule 275 + OPEN reduce by rule 275 + LITTLE reduce by rule 275 + BIG reduce by rule 275 + PIPELINE reduce by rule 275 + LOWERCASE reduce by rule 275 + UPPERCASE reduce by rule 275 + VERBATIM reduce by rule 275 + RTL reduce by rule 275 + SPAN reduce by rule 275 + DELAYSLOT reduce by rule 275 + NONFIX reduce by rule 275 + INFIX reduce by rule 275 + INFIXR reduce by rule 275 + DEBUG reduce by rule 275 + ASM_COLON reduce by rule 275 + MC_COLON reduce by rule 275 + RTL_COLON reduce by rule 275 + DELAYSLOT_COLON reduce by rule 275 + NULLIFIED_COLON reduce by rule 275 + PADDING_COLON reduce by rule 275 + RESOURCE reduce by rule 275 + CPU reduce by rule 275 + LATENCY reduce by rule 275 + EXCEPTION reduce by rule 275 + ID reduce by rule 275 + SYMBOL reduce by rule 275 + WORD reduce by rule 275 + INT reduce by rule 275 + EOF reduce by rule 275 + + + . error + + + state 680: + + exp : exp . HANDLE clauses + clause : typedpat guard cont DARROW exp . (reduce by rule 336) + + ARCHITECTURE reduce by rule 336 + END reduce by rule 336 + LOCAL reduce by rule 336 + IN reduce by rule 336 + OF reduce by rule 336 + DATATYPE reduce by rule 336 + TYPE reduce by rule 336 + AND reduce by rule 336 + LPAREN reduce by rule 336 + RPAREN reduce by rule 336 + RBRACKET reduce by rule 336 + RBRACE reduce by rule 336 + SEMICOLON reduce by rule 336 + RMETA reduce by rule 336 + CELLSET reduce by rule 336 + STORAGE reduce by rule 336 + LOCATIONS reduce by rule 336 + COMMA reduce by rule 336 + COLON reduce by rule 336 + BAR reduce by rule 336 + DARROW reduce by rule 336 + THEN reduce by rule 336 + ELSE reduce by rule 336 + HANDLE shift 402 + STRUCTURE reduce by rule 336 + FUNCTOR reduce by rule 336 + SIGNATURE reduce by rule 336 + SHARING reduce by rule 336 + INSTRUCTION reduce by rule 336 + VLIW reduce by rule 336 + SUPERSCALAR reduce by rule 336 + WITHTYPE reduce by rule 336 + FUN reduce by rule 336 + VAL reduce by rule 336 + INCLUDE reduce by rule 336 + OPEN reduce by rule 336 + LITTLE reduce by rule 336 + BIG reduce by rule 336 + PIPELINE reduce by rule 336 + LOWERCASE reduce by rule 336 + UPPERCASE reduce by rule 336 + VERBATIM reduce by rule 336 + RTL reduce by rule 336 + SPAN reduce by rule 336 + DELAYSLOT reduce by rule 336 + NONFIX reduce by rule 336 + INFIX reduce by rule 336 + INFIXR reduce by rule 336 + DEBUG reduce by rule 336 + ASM_COLON reduce by rule 336 + MC_COLON reduce by rule 336 + RTL_COLON reduce by rule 336 + DELAYSLOT_COLON reduce by rule 336 + NULLIFIED_COLON reduce by rule 336 + PADDING_COLON reduce by rule 336 + RESOURCE reduce by rule 336 + CPU reduce by rule 336 + LATENCY reduce by rule 336 + EXCEPTION reduce by rule 336 + ID reduce by rule 336 + SYMBOL reduce by rule 336 + WORD reduce by rule 336 + INT reduce by rule 336 + EOF reduce by rule 336 + + + . error + + + state 681: + + aexp : DOLLAR id LBRACKET exp region RBRACKET . (reduce by rule 254) + + ARCHITECTURE reduce by rule 254 + END reduce by rule 254 + LOCAL reduce by rule 254 + IN reduce by rule 254 + OF reduce by rule 254 + DATATYPE reduce by rule 254 + TYPE reduce by rule 254 + EQ reduce by rule 254 + DOLLAR reduce by rule 254 + TIMES reduce by rule 254 + AND reduce by rule 254 + DEREF reduce by rule 254 + NOT reduce by rule 254 + LLBRACKET reduce by rule 254 + LHASHBRACKET reduce by rule 254 + LPAREN reduce by rule 254 + RPAREN reduce by rule 254 + LBRACKET reduce by rule 254 + RBRACKET reduce by rule 254 + LBRACE reduce by rule 254 + RBRACE reduce by rule 254 + SEMICOLON reduce by rule 254 + LDQUOTE reduce by rule 254 + RMETA reduce by rule 254 + CELLSET reduce by rule 254 + STORAGE reduce by rule 254 + LOCATIONS reduce by rule 254 + HASH reduce by rule 254 + COMMA reduce by rule 254 + COLON reduce by rule 254 + AT reduce by rule 254 + BAR reduce by rule 254 + DARROW reduce by rule 254 + THEN reduce by rule 254 + ELSE reduce by rule 254 + TRUE reduce by rule 254 + FALSE reduce by rule 254 + HANDLE reduce by rule 254 + LET reduce by rule 254 + STRUCTURE reduce by rule 254 + FUNCTOR reduce by rule 254 + SIGNATURE reduce by rule 254 + SHARING reduce by rule 254 + INSTRUCTION reduce by rule 254 + VLIW reduce by rule 254 + SUPERSCALAR reduce by rule 254 + WITHTYPE reduce by rule 254 + FUN reduce by rule 254 + VAL reduce by rule 254 + INCLUDE reduce by rule 254 + OPEN reduce by rule 254 + OP reduce by rule 254 + LITTLE reduce by rule 254 + BIG reduce by rule 254 + PIPELINE reduce by rule 254 + LOWERCASE reduce by rule 254 + UPPERCASE reduce by rule 254 + VERBATIM reduce by rule 254 + RTL reduce by rule 254 + SPAN reduce by rule 254 + DELAYSLOT reduce by rule 254 + ALWAYS reduce by rule 254 + NEVER reduce by rule 254 + NONFIX reduce by rule 254 + INFIX reduce by rule 254 + INFIXR reduce by rule 254 + DEBUG reduce by rule 254 + ASM_COLON reduce by rule 254 + MC_COLON reduce by rule 254 + RTL_COLON reduce by rule 254 + DELAYSLOT_COLON reduce by rule 254 + NULLIFIED_COLON reduce by rule 254 + PADDING_COLON reduce by rule 254 + RESOURCE reduce by rule 254 + CPU reduce by rule 254 + LATENCY reduce by rule 254 + EXCEPTION reduce by rule 254 + ID reduce by rule 254 + SYMBOL reduce by rule 254 + WORD reduce by rule 254 + INT reduce by rule 254 + INTINF reduce by rule 254 + REAL reduce by rule 254 + STRING reduce by rule 254 + CHAR reduce by rule 254 + EOF reduce by rule 254 + + + . error + + + state 682: + + region : COLON id . (reduce by rule 261) + + RBRACKET reduce by rule 261 + + + . error + + + state 683: + + consbind : sym of_ty consassembly consencoding rtl nop nullified delayslot . delayslotcandidate sdi latency pipeline + + ARCHITECTURE reduce by rule 149 + END reduce by rule 149 + LOCAL reduce by rule 149 + IN reduce by rule 149 + DATATYPE reduce by rule 149 + TYPE reduce by rule 149 + AND reduce by rule 149 + RPAREN reduce by rule 149 + SEMICOLON reduce by rule 149 + STORAGE reduce by rule 149 + LOCATIONS reduce by rule 149 + BAR reduce by rule 149 + STRUCTURE reduce by rule 149 + FUNCTOR reduce by rule 149 + SIGNATURE reduce by rule 149 + SHARING reduce by rule 149 + INSTRUCTION reduce by rule 149 + VLIW reduce by rule 149 + SUPERSCALAR reduce by rule 149 + WITHTYPE reduce by rule 149 + FUN reduce by rule 149 + VAL reduce by rule 149 + INCLUDE reduce by rule 149 + OPEN reduce by rule 149 + LITTLE reduce by rule 149 + BIG reduce by rule 149 + PIPELINE reduce by rule 149 + LOWERCASE reduce by rule 149 + UPPERCASE reduce by rule 149 + VERBATIM reduce by rule 149 + RTL reduce by rule 149 + SPAN reduce by rule 149 + DELAYSLOT shift 701 + NONFIX reduce by rule 149 + INFIX reduce by rule 149 + INFIXR reduce by rule 149 + DEBUG reduce by rule 149 + RESOURCE reduce by rule 149 + CPU reduce by rule 149 + LATENCY reduce by rule 149 + EXCEPTION reduce by rule 149 + EOF reduce by rule 149 + + delayslotcandidate goto 700 + + . error + + + state 684: + + delayslot : DELAYSLOT_COLON . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 702 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 685: + + nullified : NULLIFIED_COLON flag . (reduce by rule 169) + + ARCHITECTURE reduce by rule 169 + END reduce by rule 169 + LOCAL reduce by rule 169 + IN reduce by rule 169 + DATATYPE reduce by rule 169 + TYPE reduce by rule 169 + AND reduce by rule 169 + RPAREN reduce by rule 169 + SEMICOLON reduce by rule 169 + STORAGE reduce by rule 169 + LOCATIONS reduce by rule 169 + BAR reduce by rule 169 + STRUCTURE reduce by rule 169 + FUNCTOR reduce by rule 169 + SIGNATURE reduce by rule 169 + SHARING reduce by rule 169 + INSTRUCTION reduce by rule 169 + VLIW reduce by rule 169 + SUPERSCALAR reduce by rule 169 + WITHTYPE reduce by rule 169 + FUN reduce by rule 169 + VAL reduce by rule 169 + INCLUDE reduce by rule 169 + OPEN reduce by rule 169 + LITTLE reduce by rule 169 + BIG reduce by rule 169 + PIPELINE reduce by rule 169 + LOWERCASE reduce by rule 169 + UPPERCASE reduce by rule 169 + VERBATIM reduce by rule 169 + RTL reduce by rule 169 + SPAN reduce by rule 169 + DELAYSLOT reduce by rule 169 + NONFIX reduce by rule 169 + INFIX reduce by rule 169 + INFIXR reduce by rule 169 + DEBUG reduce by rule 169 + DELAYSLOT_COLON reduce by rule 169 + RESOURCE reduce by rule 169 + CPU reduce by rule 169 + LATENCY reduce by rule 169 + EXCEPTION reduce by rule 169 + EOF reduce by rule 169 + + + . error + + + state 686: + + nullified : NULLIFIED_COLON FALSE . (reduce by rule 168) + + ARCHITECTURE reduce by rule 168 + END reduce by rule 168 + LOCAL reduce by rule 168 + IN reduce by rule 168 + DATATYPE reduce by rule 168 + TYPE reduce by rule 168 + AND reduce by rule 168 + RPAREN reduce by rule 168 + SEMICOLON reduce by rule 168 + STORAGE reduce by rule 168 + LOCATIONS reduce by rule 168 + BAR reduce by rule 168 + STRUCTURE reduce by rule 168 + FUNCTOR reduce by rule 168 + SIGNATURE reduce by rule 168 + SHARING reduce by rule 168 + INSTRUCTION reduce by rule 168 + VLIW reduce by rule 168 + SUPERSCALAR reduce by rule 168 + WITHTYPE reduce by rule 168 + FUN reduce by rule 168 + VAL reduce by rule 168 + INCLUDE reduce by rule 168 + OPEN reduce by rule 168 + LITTLE reduce by rule 168 + BIG reduce by rule 168 + PIPELINE reduce by rule 168 + LOWERCASE reduce by rule 168 + UPPERCASE reduce by rule 168 + VERBATIM reduce by rule 168 + RTL reduce by rule 168 + SPAN reduce by rule 168 + DELAYSLOT reduce by rule 168 + NONFIX reduce by rule 168 + INFIX reduce by rule 168 + INFIXR reduce by rule 168 + DEBUG reduce by rule 168 + DELAYSLOT_COLON reduce by rule 168 + RESOURCE reduce by rule 168 + CPU reduce by rule 168 + LATENCY reduce by rule 168 + EXCEPTION reduce by rule 168 + EOF reduce by rule 168 + + + . error + + + state 687: + + flag : id flagguard . (reduce by rule 161) + + ARCHITECTURE reduce by rule 161 + END reduce by rule 161 + LOCAL reduce by rule 161 + IN reduce by rule 161 + DATATYPE reduce by rule 161 + TYPE reduce by rule 161 + AND reduce by rule 161 + RPAREN reduce by rule 161 + SEMICOLON reduce by rule 161 + STORAGE reduce by rule 161 + LOCATIONS reduce by rule 161 + BAR reduce by rule 161 + STRUCTURE reduce by rule 161 + FUNCTOR reduce by rule 161 + SIGNATURE reduce by rule 161 + SHARING reduce by rule 161 + INSTRUCTION reduce by rule 161 + VLIW reduce by rule 161 + SUPERSCALAR reduce by rule 161 + WITHTYPE reduce by rule 161 + FUN reduce by rule 161 + VAL reduce by rule 161 + INCLUDE reduce by rule 161 + OPEN reduce by rule 161 + LITTLE reduce by rule 161 + BIG reduce by rule 161 + PIPELINE reduce by rule 161 + LOWERCASE reduce by rule 161 + UPPERCASE reduce by rule 161 + VERBATIM reduce by rule 161 + RTL reduce by rule 161 + SPAN reduce by rule 161 + DELAYSLOT reduce by rule 161 + NONFIX reduce by rule 161 + INFIX reduce by rule 161 + INFIXR reduce by rule 161 + DEBUG reduce by rule 161 + DELAYSLOT_COLON reduce by rule 161 + NULLIFIED_COLON reduce by rule 161 + RESOURCE reduce by rule 161 + CPU reduce by rule 161 + LATENCY reduce by rule 161 + EXCEPTION reduce by rule 161 + EOF reduce by rule 161 + + + . error + + + state 688: + + flagguard : AND . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 703 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 689: + + flag : id EQ . True flagguard + flag : id EQ . False flagguard + + TRUE shift 99 + FALSE shift 98 + ALWAYS shift 96 + NEVER shift 95 + + True goto 705 + False goto 704 + + . error + + error: state 690: shift/reduce conflict (shift AND, reduce by rule 165) + + state 690: + + flag : NOT id . flagguard + + ARCHITECTURE reduce by rule 165 + END reduce by rule 165 + LOCAL reduce by rule 165 + IN reduce by rule 165 + DATATYPE reduce by rule 165 + TYPE reduce by rule 165 + AND shift 688 + RPAREN reduce by rule 165 + SEMICOLON reduce by rule 165 + STORAGE reduce by rule 165 + LOCATIONS reduce by rule 165 + BAR reduce by rule 165 + STRUCTURE reduce by rule 165 + FUNCTOR reduce by rule 165 + SIGNATURE reduce by rule 165 + SHARING reduce by rule 165 + INSTRUCTION reduce by rule 165 + VLIW reduce by rule 165 + SUPERSCALAR reduce by rule 165 + WITHTYPE reduce by rule 165 + FUN reduce by rule 165 + VAL reduce by rule 165 + INCLUDE reduce by rule 165 + OPEN reduce by rule 165 + LITTLE reduce by rule 165 + BIG reduce by rule 165 + PIPELINE reduce by rule 165 + LOWERCASE reduce by rule 165 + UPPERCASE reduce by rule 165 + VERBATIM reduce by rule 165 + RTL reduce by rule 165 + SPAN reduce by rule 165 + DELAYSLOT reduce by rule 165 + NONFIX reduce by rule 165 + INFIX reduce by rule 165 + INFIXR reduce by rule 165 + DEBUG reduce by rule 165 + DELAYSLOT_COLON reduce by rule 165 + NULLIFIED_COLON reduce by rule 165 + RESOURCE reduce by rule 165 + CPU reduce by rule 165 + LATENCY reduce by rule 165 + EXCEPTION reduce by rule 165 + EOF reduce by rule 165 + + flagguard goto 706 + + . error + + + state 691: + + exp : exp . HANDLE clauses + opt_exp : EQ exp . (reduce by rule 208) + + ARCHITECTURE reduce by rule 208 + END reduce by rule 208 + LOCAL reduce by rule 208 + IN reduce by rule 208 + DATATYPE reduce by rule 208 + TYPE reduce by rule 208 + RPAREN reduce by rule 208 + SEMICOLON reduce by rule 208 + STORAGE reduce by rule 208 + LOCATIONS reduce by rule 208 + BAR reduce by rule 208 + HANDLE shift 402 + STRUCTURE reduce by rule 208 + FUNCTOR reduce by rule 208 + SIGNATURE reduce by rule 208 + SHARING reduce by rule 208 + INSTRUCTION reduce by rule 208 + VLIW reduce by rule 208 + SUPERSCALAR reduce by rule 208 + FUN reduce by rule 208 + VAL reduce by rule 208 + INCLUDE reduce by rule 208 + OPEN reduce by rule 208 + LITTLE reduce by rule 208 + BIG reduce by rule 208 + PIPELINE reduce by rule 208 + LOWERCASE reduce by rule 208 + UPPERCASE reduce by rule 208 + VERBATIM reduce by rule 208 + RTL reduce by rule 208 + NONFIX reduce by rule 208 + INFIX reduce by rule 208 + INFIXR reduce by rule 208 + DEBUG reduce by rule 208 + RESOURCE reduce by rule 208 + CPU reduce by rule 208 + LATENCY reduce by rule 208 + EXCEPTION reduce by rule 208 + EOF reduce by rule 208 + + + . error + + + state 692: + + field : fieldid COLON cnv signedness . width unsignedint_opt + + EQ reduce by rule 218 + RBRACE reduce by rule 218 + COMMA reduce by rule 218 + INT shift 64 + + width goto 708 + int goto 707 + + . error + + + state 693: + + signedness : UNSIGNED . (reduce by rule 226) + + EQ reduce by rule 226 + RBRACE reduce by rule 226 + COMMA reduce by rule 226 + INT reduce by rule 226 + + + . error + + + state 694: + + signedness : SIGNED . (reduce by rule 225) + + EQ reduce by rule 225 + RBRACE reduce by rule 225 + COMMA reduce by rule 225 + INT reduce by rule 225 + + + . error + + + state 695: + + cnv : DOLLAR id . (reduce by rule 217) + + EQ reduce by rule 217 + RBRACE reduce by rule 217 + COMMA reduce by rule 217 + SIGNED reduce by rule 217 + UNSIGNED reduce by rule 217 + INT reduce by rule 217 + + + . error + + + state 696: + + storagedecl : id EQ DOLLAR id LBRACKET cellcount RBRACKET bitSize . aliasing defaults printcell + + WHERE reduce by rule 400 + ASM_COLON reduce by rule 400 + ALIASING shift 710 + + aliasing goto 709 + + . error + + + state 697: + + bitSize : OF . int aggregable BITS + + INT shift 64 + + int goto 711 + + . error + + + state 698: + + ty : ty . ARROW ty + datatypebind : tyvarseq id opcodeencoding fieldty hasasm EQ DATATYPE ty . (reduce by rule 130) + + ARCHITECTURE reduce by rule 130 + END reduce by rule 130 + LOCAL reduce by rule 130 + IN reduce by rule 130 + DATATYPE reduce by rule 130 + TYPE reduce by rule 130 + AND reduce by rule 130 + RPAREN reduce by rule 130 + SEMICOLON reduce by rule 130 + STORAGE reduce by rule 130 + LOCATIONS reduce by rule 130 + ARROW shift 388 + STRUCTURE reduce by rule 130 + FUNCTOR reduce by rule 130 + SIGNATURE reduce by rule 130 + SHARING reduce by rule 130 + INSTRUCTION reduce by rule 130 + VLIW reduce by rule 130 + SUPERSCALAR reduce by rule 130 + WITHTYPE reduce by rule 130 + FUN reduce by rule 130 + VAL reduce by rule 130 + INCLUDE reduce by rule 130 + OPEN reduce by rule 130 + LITTLE reduce by rule 130 + BIG reduce by rule 130 + PIPELINE reduce by rule 130 + LOWERCASE reduce by rule 130 + UPPERCASE reduce by rule 130 + VERBATIM reduce by rule 130 + RTL reduce by rule 130 + NONFIX reduce by rule 130 + INFIX reduce by rule 130 + INFIXR reduce by rule 130 + DEBUG reduce by rule 130 + RESOURCE reduce by rule 130 + CPU reduce by rule 130 + LATENCY reduce by rule 130 + EXCEPTION reduce by rule 130 + EOF reduce by rule 130 + + + . error + + + state 699: + + aexp : sym CONCAT LBRACKET exps RBRACKET CONCAT sym . (reduce by rule 258) + + ARCHITECTURE reduce by rule 258 + END reduce by rule 258 + LOCAL reduce by rule 258 + IN reduce by rule 258 + OF reduce by rule 258 + DATATYPE reduce by rule 258 + TYPE reduce by rule 258 + EQ reduce by rule 258 + DOLLAR reduce by rule 258 + TIMES reduce by rule 258 + AND reduce by rule 258 + DEREF reduce by rule 258 + NOT reduce by rule 258 + LLBRACKET reduce by rule 258 + LHASHBRACKET reduce by rule 258 + LPAREN reduce by rule 258 + RPAREN reduce by rule 258 + LBRACKET reduce by rule 258 + RBRACKET reduce by rule 258 + LBRACE reduce by rule 258 + RBRACE reduce by rule 258 + SEMICOLON reduce by rule 258 + LDQUOTE reduce by rule 258 + RMETA reduce by rule 258 + CELLSET reduce by rule 258 + STORAGE reduce by rule 258 + LOCATIONS reduce by rule 258 + HASH reduce by rule 258 + COMMA reduce by rule 258 + COLON reduce by rule 258 + AT reduce by rule 258 + BAR reduce by rule 258 + DARROW reduce by rule 258 + THEN reduce by rule 258 + ELSE reduce by rule 258 + TRUE reduce by rule 258 + FALSE reduce by rule 258 + HANDLE reduce by rule 258 + LET reduce by rule 258 + STRUCTURE reduce by rule 258 + FUNCTOR reduce by rule 258 + SIGNATURE reduce by rule 258 + SHARING reduce by rule 258 + INSTRUCTION reduce by rule 258 + VLIW reduce by rule 258 + SUPERSCALAR reduce by rule 258 + WITHTYPE reduce by rule 258 + FUN reduce by rule 258 + VAL reduce by rule 258 + INCLUDE reduce by rule 258 + OPEN reduce by rule 258 + OP reduce by rule 258 + LITTLE reduce by rule 258 + BIG reduce by rule 258 + PIPELINE reduce by rule 258 + LOWERCASE reduce by rule 258 + UPPERCASE reduce by rule 258 + VERBATIM reduce by rule 258 + RTL reduce by rule 258 + SPAN reduce by rule 258 + DELAYSLOT reduce by rule 258 + ALWAYS reduce by rule 258 + NEVER reduce by rule 258 + NONFIX reduce by rule 258 + INFIX reduce by rule 258 + INFIXR reduce by rule 258 + DEBUG reduce by rule 258 + ASM_COLON reduce by rule 258 + MC_COLON reduce by rule 258 + RTL_COLON reduce by rule 258 + DELAYSLOT_COLON reduce by rule 258 + NULLIFIED_COLON reduce by rule 258 + PADDING_COLON reduce by rule 258 + RESOURCE reduce by rule 258 + CPU reduce by rule 258 + LATENCY reduce by rule 258 + EXCEPTION reduce by rule 258 + ID reduce by rule 258 + SYMBOL reduce by rule 258 + WORD reduce by rule 258 + INT reduce by rule 258 + INTINF reduce by rule 258 + REAL reduce by rule 258 + STRING reduce by rule 258 + CHAR reduce by rule 258 + EOF reduce by rule 258 + + + . error + + + state 700: + + consbind : sym of_ty consassembly consencoding rtl nop nullified delayslot delayslotcandidate . sdi latency pipeline + + ARCHITECTURE reduce by rule 174 + END reduce by rule 174 + LOCAL reduce by rule 174 + IN reduce by rule 174 + DATATYPE reduce by rule 174 + TYPE reduce by rule 174 + AND reduce by rule 174 + RPAREN reduce by rule 174 + SEMICOLON reduce by rule 174 + STORAGE reduce by rule 174 + LOCATIONS reduce by rule 174 + BAR reduce by rule 174 + STRUCTURE reduce by rule 174 + FUNCTOR reduce by rule 174 + SIGNATURE reduce by rule 174 + SHARING reduce by rule 174 + INSTRUCTION reduce by rule 174 + VLIW reduce by rule 174 + SUPERSCALAR reduce by rule 174 + WITHTYPE reduce by rule 174 + FUN reduce by rule 174 + VAL reduce by rule 174 + INCLUDE reduce by rule 174 + OPEN reduce by rule 174 + LITTLE reduce by rule 174 + BIG reduce by rule 174 + PIPELINE reduce by rule 174 + LOWERCASE reduce by rule 174 + UPPERCASE reduce by rule 174 + VERBATIM reduce by rule 174 + RTL reduce by rule 174 + SPAN shift 713 + NONFIX reduce by rule 174 + INFIX reduce by rule 174 + INFIXR reduce by rule 174 + DEBUG reduce by rule 174 + RESOURCE reduce by rule 174 + CPU reduce by rule 174 + LATENCY reduce by rule 174 + EXCEPTION reduce by rule 174 + EOF reduce by rule 174 + + sdi goto 712 + + . error + + + state 701: + + delayslotcandidate : DELAYSLOT . CANDIDATE_COLON exp + + CANDIDATE_COLON shift 714 + + + . error + + + state 702: + + exp : exp . HANDLE clauses + delayslot : DELAYSLOT_COLON exp . (reduce by rule 171) + + ARCHITECTURE reduce by rule 171 + END reduce by rule 171 + LOCAL reduce by rule 171 + IN reduce by rule 171 + DATATYPE reduce by rule 171 + TYPE reduce by rule 171 + AND reduce by rule 171 + RPAREN reduce by rule 171 + SEMICOLON reduce by rule 171 + STORAGE reduce by rule 171 + LOCATIONS reduce by rule 171 + BAR reduce by rule 171 + HANDLE shift 402 + STRUCTURE reduce by rule 171 + FUNCTOR reduce by rule 171 + SIGNATURE reduce by rule 171 + SHARING reduce by rule 171 + INSTRUCTION reduce by rule 171 + VLIW reduce by rule 171 + SUPERSCALAR reduce by rule 171 + WITHTYPE reduce by rule 171 + FUN reduce by rule 171 + VAL reduce by rule 171 + INCLUDE reduce by rule 171 + OPEN reduce by rule 171 + LITTLE reduce by rule 171 + BIG reduce by rule 171 + PIPELINE reduce by rule 171 + LOWERCASE reduce by rule 171 + UPPERCASE reduce by rule 171 + VERBATIM reduce by rule 171 + RTL reduce by rule 171 + SPAN reduce by rule 171 + DELAYSLOT reduce by rule 171 + NONFIX reduce by rule 171 + INFIX reduce by rule 171 + INFIXR reduce by rule 171 + DEBUG reduce by rule 171 + RESOURCE reduce by rule 171 + CPU reduce by rule 171 + LATENCY reduce by rule 171 + EXCEPTION reduce by rule 171 + EOF reduce by rule 171 + + + . error + + + state 703: + + exp : exp . HANDLE clauses + flagguard : AND exp . (reduce by rule 166) + + ARCHITECTURE reduce by rule 166 + END reduce by rule 166 + LOCAL reduce by rule 166 + IN reduce by rule 166 + DATATYPE reduce by rule 166 + TYPE reduce by rule 166 + AND reduce by rule 166 + RPAREN reduce by rule 166 + SEMICOLON reduce by rule 166 + STORAGE reduce by rule 166 + LOCATIONS reduce by rule 166 + BAR reduce by rule 166 + HANDLE shift 402 + STRUCTURE reduce by rule 166 + FUNCTOR reduce by rule 166 + SIGNATURE reduce by rule 166 + SHARING reduce by rule 166 + INSTRUCTION reduce by rule 166 + VLIW reduce by rule 166 + SUPERSCALAR reduce by rule 166 + WITHTYPE reduce by rule 166 + FUN reduce by rule 166 + VAL reduce by rule 166 + INCLUDE reduce by rule 166 + OPEN reduce by rule 166 + LITTLE reduce by rule 166 + BIG reduce by rule 166 + PIPELINE reduce by rule 166 + LOWERCASE reduce by rule 166 + UPPERCASE reduce by rule 166 + VERBATIM reduce by rule 166 + RTL reduce by rule 166 + SPAN reduce by rule 166 + DELAYSLOT reduce by rule 166 + NONFIX reduce by rule 166 + INFIX reduce by rule 166 + INFIXR reduce by rule 166 + DEBUG reduce by rule 166 + DELAYSLOT_COLON reduce by rule 166 + NULLIFIED_COLON reduce by rule 166 + RESOURCE reduce by rule 166 + CPU reduce by rule 166 + LATENCY reduce by rule 166 + EXCEPTION reduce by rule 166 + EOF reduce by rule 166 + + + . error + + error: state 704: shift/reduce conflict (shift AND, reduce by rule 165) + + state 704: + + flag : id EQ False . flagguard + + ARCHITECTURE reduce by rule 165 + END reduce by rule 165 + LOCAL reduce by rule 165 + IN reduce by rule 165 + DATATYPE reduce by rule 165 + TYPE reduce by rule 165 + AND shift 688 + RPAREN reduce by rule 165 + SEMICOLON reduce by rule 165 + STORAGE reduce by rule 165 + LOCATIONS reduce by rule 165 + BAR reduce by rule 165 + STRUCTURE reduce by rule 165 + FUNCTOR reduce by rule 165 + SIGNATURE reduce by rule 165 + SHARING reduce by rule 165 + INSTRUCTION reduce by rule 165 + VLIW reduce by rule 165 + SUPERSCALAR reduce by rule 165 + WITHTYPE reduce by rule 165 + FUN reduce by rule 165 + VAL reduce by rule 165 + INCLUDE reduce by rule 165 + OPEN reduce by rule 165 + LITTLE reduce by rule 165 + BIG reduce by rule 165 + PIPELINE reduce by rule 165 + LOWERCASE reduce by rule 165 + UPPERCASE reduce by rule 165 + VERBATIM reduce by rule 165 + RTL reduce by rule 165 + SPAN reduce by rule 165 + DELAYSLOT reduce by rule 165 + NONFIX reduce by rule 165 + INFIX reduce by rule 165 + INFIXR reduce by rule 165 + DEBUG reduce by rule 165 + DELAYSLOT_COLON reduce by rule 165 + NULLIFIED_COLON reduce by rule 165 + RESOURCE reduce by rule 165 + CPU reduce by rule 165 + LATENCY reduce by rule 165 + EXCEPTION reduce by rule 165 + EOF reduce by rule 165 + + flagguard goto 715 + + . error + + error: state 705: shift/reduce conflict (shift AND, reduce by rule 165) + + state 705: + + flag : id EQ True . flagguard + + ARCHITECTURE reduce by rule 165 + END reduce by rule 165 + LOCAL reduce by rule 165 + IN reduce by rule 165 + DATATYPE reduce by rule 165 + TYPE reduce by rule 165 + AND shift 688 + RPAREN reduce by rule 165 + SEMICOLON reduce by rule 165 + STORAGE reduce by rule 165 + LOCATIONS reduce by rule 165 + BAR reduce by rule 165 + STRUCTURE reduce by rule 165 + FUNCTOR reduce by rule 165 + SIGNATURE reduce by rule 165 + SHARING reduce by rule 165 + INSTRUCTION reduce by rule 165 + VLIW reduce by rule 165 + SUPERSCALAR reduce by rule 165 + WITHTYPE reduce by rule 165 + FUN reduce by rule 165 + VAL reduce by rule 165 + INCLUDE reduce by rule 165 + OPEN reduce by rule 165 + LITTLE reduce by rule 165 + BIG reduce by rule 165 + PIPELINE reduce by rule 165 + LOWERCASE reduce by rule 165 + UPPERCASE reduce by rule 165 + VERBATIM reduce by rule 165 + RTL reduce by rule 165 + SPAN reduce by rule 165 + DELAYSLOT reduce by rule 165 + NONFIX reduce by rule 165 + INFIX reduce by rule 165 + INFIXR reduce by rule 165 + DEBUG reduce by rule 165 + DELAYSLOT_COLON reduce by rule 165 + NULLIFIED_COLON reduce by rule 165 + RESOURCE reduce by rule 165 + CPU reduce by rule 165 + LATENCY reduce by rule 165 + EXCEPTION reduce by rule 165 + EOF reduce by rule 165 + + flagguard goto 716 + + . error + + + state 706: + + flag : NOT id flagguard . (reduce by rule 162) + + ARCHITECTURE reduce by rule 162 + END reduce by rule 162 + LOCAL reduce by rule 162 + IN reduce by rule 162 + DATATYPE reduce by rule 162 + TYPE reduce by rule 162 + AND reduce by rule 162 + RPAREN reduce by rule 162 + SEMICOLON reduce by rule 162 + STORAGE reduce by rule 162 + LOCATIONS reduce by rule 162 + BAR reduce by rule 162 + STRUCTURE reduce by rule 162 + FUNCTOR reduce by rule 162 + SIGNATURE reduce by rule 162 + SHARING reduce by rule 162 + INSTRUCTION reduce by rule 162 + VLIW reduce by rule 162 + SUPERSCALAR reduce by rule 162 + WITHTYPE reduce by rule 162 + FUN reduce by rule 162 + VAL reduce by rule 162 + INCLUDE reduce by rule 162 + OPEN reduce by rule 162 + LITTLE reduce by rule 162 + BIG reduce by rule 162 + PIPELINE reduce by rule 162 + LOWERCASE reduce by rule 162 + UPPERCASE reduce by rule 162 + VERBATIM reduce by rule 162 + RTL reduce by rule 162 + SPAN reduce by rule 162 + DELAYSLOT reduce by rule 162 + NONFIX reduce by rule 162 + INFIX reduce by rule 162 + INFIXR reduce by rule 162 + DEBUG reduce by rule 162 + DELAYSLOT_COLON reduce by rule 162 + NULLIFIED_COLON reduce by rule 162 + RESOURCE reduce by rule 162 + CPU reduce by rule 162 + LATENCY reduce by rule 162 + EXCEPTION reduce by rule 162 + EOF reduce by rule 162 + + + . error + + + state 707: + + width : int . (reduce by rule 219) + width : int . DOTDOT int + + EQ reduce by rule 219 + RBRACE reduce by rule 219 + COMMA reduce by rule 219 + DOTDOT shift 717 + + + . error + + + state 708: + + field : fieldid COLON cnv signedness width . unsignedint_opt + + EQ shift 719 + RBRACE reduce by rule 223 + COMMA reduce by rule 223 + + unsignedint_opt goto 718 + + . error + + + state 709: + + storagedecl : id EQ DOLLAR id LBRACKET cellcount RBRACKET bitSize aliasing . defaults printcell + + WHERE shift 721 + ASM_COLON reduce by rule 404 + + defaults goto 720 + + . error + + + state 710: + + aliasing : ALIASING . id + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 722 + + . error + + + state 711: + + bitSize : OF int . aggregable BITS + + BITS reduce by rule 384 + AGGREGABLE shift 724 + + aggregable goto 723 + + . error + + error: state 712: shift/reduce conflict (shift LATENCY, reduce by rule 146) + + state 712: + + consbind : sym of_ty consassembly consencoding rtl nop nullified delayslot delayslotcandidate sdi . latency pipeline + + ARCHITECTURE reduce by rule 146 + END reduce by rule 146 + LOCAL reduce by rule 146 + IN reduce by rule 146 + DATATYPE reduce by rule 146 + TYPE reduce by rule 146 + AND reduce by rule 146 + RPAREN reduce by rule 146 + SEMICOLON reduce by rule 146 + STORAGE reduce by rule 146 + LOCATIONS reduce by rule 146 + BAR reduce by rule 146 + STRUCTURE reduce by rule 146 + FUNCTOR reduce by rule 146 + SIGNATURE reduce by rule 146 + SHARING reduce by rule 146 + INSTRUCTION reduce by rule 146 + VLIW reduce by rule 146 + SUPERSCALAR reduce by rule 146 + WITHTYPE reduce by rule 146 + FUN reduce by rule 146 + VAL reduce by rule 146 + INCLUDE reduce by rule 146 + OPEN reduce by rule 146 + LITTLE reduce by rule 146 + BIG reduce by rule 146 + PIPELINE reduce by rule 146 + LOWERCASE reduce by rule 146 + UPPERCASE reduce by rule 146 + VERBATIM reduce by rule 146 + RTL reduce by rule 146 + NONFIX reduce by rule 146 + INFIX reduce by rule 146 + INFIXR reduce by rule 146 + DEBUG reduce by rule 146 + RESOURCE reduce by rule 146 + CPU reduce by rule 146 + LATENCY shift 726 + EXCEPTION reduce by rule 146 + EOF reduce by rule 146 + + latency goto 725 + + . error + + + state 713: + + sdi : SPAN . DEPENDENT exp + + DEPENDENT shift 727 + + + . error + + + state 714: + + delayslotcandidate : DELAYSLOT CANDIDATE_COLON . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 728 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 715: + + flag : id EQ False flagguard . (reduce by rule 164) + + ARCHITECTURE reduce by rule 164 + END reduce by rule 164 + LOCAL reduce by rule 164 + IN reduce by rule 164 + DATATYPE reduce by rule 164 + TYPE reduce by rule 164 + AND reduce by rule 164 + RPAREN reduce by rule 164 + SEMICOLON reduce by rule 164 + STORAGE reduce by rule 164 + LOCATIONS reduce by rule 164 + BAR reduce by rule 164 + STRUCTURE reduce by rule 164 + FUNCTOR reduce by rule 164 + SIGNATURE reduce by rule 164 + SHARING reduce by rule 164 + INSTRUCTION reduce by rule 164 + VLIW reduce by rule 164 + SUPERSCALAR reduce by rule 164 + WITHTYPE reduce by rule 164 + FUN reduce by rule 164 + VAL reduce by rule 164 + INCLUDE reduce by rule 164 + OPEN reduce by rule 164 + LITTLE reduce by rule 164 + BIG reduce by rule 164 + PIPELINE reduce by rule 164 + LOWERCASE reduce by rule 164 + UPPERCASE reduce by rule 164 + VERBATIM reduce by rule 164 + RTL reduce by rule 164 + SPAN reduce by rule 164 + DELAYSLOT reduce by rule 164 + NONFIX reduce by rule 164 + INFIX reduce by rule 164 + INFIXR reduce by rule 164 + DEBUG reduce by rule 164 + DELAYSLOT_COLON reduce by rule 164 + NULLIFIED_COLON reduce by rule 164 + RESOURCE reduce by rule 164 + CPU reduce by rule 164 + LATENCY reduce by rule 164 + EXCEPTION reduce by rule 164 + EOF reduce by rule 164 + + + . error + + + state 716: + + flag : id EQ True flagguard . (reduce by rule 163) + + ARCHITECTURE reduce by rule 163 + END reduce by rule 163 + LOCAL reduce by rule 163 + IN reduce by rule 163 + DATATYPE reduce by rule 163 + TYPE reduce by rule 163 + AND reduce by rule 163 + RPAREN reduce by rule 163 + SEMICOLON reduce by rule 163 + STORAGE reduce by rule 163 + LOCATIONS reduce by rule 163 + BAR reduce by rule 163 + STRUCTURE reduce by rule 163 + FUNCTOR reduce by rule 163 + SIGNATURE reduce by rule 163 + SHARING reduce by rule 163 + INSTRUCTION reduce by rule 163 + VLIW reduce by rule 163 + SUPERSCALAR reduce by rule 163 + WITHTYPE reduce by rule 163 + FUN reduce by rule 163 + VAL reduce by rule 163 + INCLUDE reduce by rule 163 + OPEN reduce by rule 163 + LITTLE reduce by rule 163 + BIG reduce by rule 163 + PIPELINE reduce by rule 163 + LOWERCASE reduce by rule 163 + UPPERCASE reduce by rule 163 + VERBATIM reduce by rule 163 + RTL reduce by rule 163 + SPAN reduce by rule 163 + DELAYSLOT reduce by rule 163 + NONFIX reduce by rule 163 + INFIX reduce by rule 163 + INFIXR reduce by rule 163 + DEBUG reduce by rule 163 + DELAYSLOT_COLON reduce by rule 163 + NULLIFIED_COLON reduce by rule 163 + RESOURCE reduce by rule 163 + CPU reduce by rule 163 + LATENCY reduce by rule 163 + EXCEPTION reduce by rule 163 + EOF reduce by rule 163 + + + . error + + + state 717: + + width : int DOTDOT . int + + INT shift 64 + + int goto 729 + + . error + + + state 718: + + field : fieldid COLON cnv signedness width unsignedint_opt . (reduce by rule 211) + + RBRACE reduce by rule 211 + COMMA reduce by rule 211 + + + . error + + + state 719: + + unsignedint_opt : EQ . unsignedint + + WORD shift 94 + INT shift 64 + + word goto 466 + unsignedint goto 730 + int goto 464 + + . error + + + state 720: + + storagedecl : id EQ DOLLAR id LBRACKET cellcount RBRACKET bitSize aliasing defaults . printcell + + ASM_COLON shift 732 + + printcell goto 731 + + . error + + + state 721: + + defaults : WHERE . default_list + + DOLLAR shift 735 + + default goto 734 + default_list goto 733 + + . error + + + state 722: + + aliasing : ALIASING id . (reduce by rule 401) + + WHERE reduce by rule 401 + ASM_COLON reduce by rule 401 + + + . error + + + state 723: + + bitSize : OF int aggregable . BITS + + BITS shift 736 + + + . error + + + state 724: + + aggregable : AGGREGABLE . (reduce by rule 385) + + BITS reduce by rule 385 + + + . error + + error: state 725: shift/reduce conflict (shift PIPELINE, reduce by rule 148) + + state 725: + + consbind : sym of_ty consassembly consencoding rtl nop nullified delayslot delayslotcandidate sdi latency . pipeline + + ARCHITECTURE reduce by rule 148 + END reduce by rule 148 + LOCAL reduce by rule 148 + IN reduce by rule 148 + DATATYPE reduce by rule 148 + TYPE reduce by rule 148 + AND reduce by rule 148 + RPAREN reduce by rule 148 + SEMICOLON reduce by rule 148 + STORAGE reduce by rule 148 + LOCATIONS reduce by rule 148 + BAR reduce by rule 148 + STRUCTURE reduce by rule 148 + FUNCTOR reduce by rule 148 + SIGNATURE reduce by rule 148 + SHARING reduce by rule 148 + INSTRUCTION reduce by rule 148 + VLIW reduce by rule 148 + SUPERSCALAR reduce by rule 148 + WITHTYPE reduce by rule 148 + FUN reduce by rule 148 + VAL reduce by rule 148 + INCLUDE reduce by rule 148 + OPEN reduce by rule 148 + LITTLE reduce by rule 148 + BIG reduce by rule 148 + PIPELINE shift 738 + LOWERCASE reduce by rule 148 + UPPERCASE reduce by rule 148 + VERBATIM reduce by rule 148 + RTL reduce by rule 148 + NONFIX reduce by rule 148 + INFIX reduce by rule 148 + INFIXR reduce by rule 148 + DEBUG reduce by rule 148 + RESOURCE reduce by rule 148 + CPU reduce by rule 148 + LATENCY reduce by rule 148 + EXCEPTION reduce by rule 148 + EOF reduce by rule 148 + + pipeline goto 737 + + . error + + + state 726: + + latency : LATENCY . COLON exp + + COLON shift 739 + + + . error + + + state 727: + + sdi : SPAN DEPENDENT . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 740 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 728: + + exp : exp . HANDLE clauses + delayslotcandidate : DELAYSLOT CANDIDATE_COLON exp . (reduce by rule 150) + + ARCHITECTURE reduce by rule 150 + END reduce by rule 150 + LOCAL reduce by rule 150 + IN reduce by rule 150 + DATATYPE reduce by rule 150 + TYPE reduce by rule 150 + AND reduce by rule 150 + RPAREN reduce by rule 150 + SEMICOLON reduce by rule 150 + STORAGE reduce by rule 150 + LOCATIONS reduce by rule 150 + BAR reduce by rule 150 + HANDLE shift 402 + STRUCTURE reduce by rule 150 + FUNCTOR reduce by rule 150 + SIGNATURE reduce by rule 150 + SHARING reduce by rule 150 + INSTRUCTION reduce by rule 150 + VLIW reduce by rule 150 + SUPERSCALAR reduce by rule 150 + WITHTYPE reduce by rule 150 + FUN reduce by rule 150 + VAL reduce by rule 150 + INCLUDE reduce by rule 150 + OPEN reduce by rule 150 + LITTLE reduce by rule 150 + BIG reduce by rule 150 + PIPELINE reduce by rule 150 + LOWERCASE reduce by rule 150 + UPPERCASE reduce by rule 150 + VERBATIM reduce by rule 150 + RTL reduce by rule 150 + SPAN reduce by rule 150 + NONFIX reduce by rule 150 + INFIX reduce by rule 150 + INFIXR reduce by rule 150 + DEBUG reduce by rule 150 + RESOURCE reduce by rule 150 + CPU reduce by rule 150 + LATENCY reduce by rule 150 + EXCEPTION reduce by rule 150 + EOF reduce by rule 150 + + + . error + + + state 729: + + width : int DOTDOT int . (reduce by rule 220) + + EQ reduce by rule 220 + RBRACE reduce by rule 220 + COMMA reduce by rule 220 + + + . error + + + state 730: + + unsignedint_opt : EQ unsignedint . (reduce by rule 224) + + RBRACE reduce by rule 224 + COMMA reduce by rule 224 + + + . error + + + state 731: + + storagedecl : id EQ DOLLAR id LBRACKET cellcount RBRACKET bitSize aliasing defaults printcell . (reduce by rule 383) + + ARCHITECTURE reduce by rule 383 + END reduce by rule 383 + LOCAL reduce by rule 383 + IN reduce by rule 383 + DATATYPE reduce by rule 383 + TYPE reduce by rule 383 + RPAREN reduce by rule 383 + SEMICOLON reduce by rule 383 + STORAGE reduce by rule 383 + LOCATIONS reduce by rule 383 + BAR reduce by rule 383 + STRUCTURE reduce by rule 383 + FUNCTOR reduce by rule 383 + SIGNATURE reduce by rule 383 + SHARING reduce by rule 383 + INSTRUCTION reduce by rule 383 + VLIW reduce by rule 383 + SUPERSCALAR reduce by rule 383 + FUN reduce by rule 383 + VAL reduce by rule 383 + INCLUDE reduce by rule 383 + OPEN reduce by rule 383 + LITTLE reduce by rule 383 + BIG reduce by rule 383 + PIPELINE reduce by rule 383 + LOWERCASE reduce by rule 383 + UPPERCASE reduce by rule 383 + VERBATIM reduce by rule 383 + RTL reduce by rule 383 + NONFIX reduce by rule 383 + INFIX reduce by rule 383 + INFIXR reduce by rule 383 + DEBUG reduce by rule 383 + RESOURCE reduce by rule 383 + CPU reduce by rule 383 + LATENCY reduce by rule 383 + EXCEPTION reduce by rule 383 + EOF reduce by rule 383 + + + . error + + + state 732: + + printcell : ASM_COLON . string + printcell : ASM_COLON . LPAREN exp RPAREN + + LPAREN shift 742 + STRING shift 91 + + string goto 741 + + . error + + + state 733: + + defaults : WHERE default_list . (reduce by rule 405) + + ASM_COLON reduce by rule 405 + + + . error + + + state 734: + + default_list : default . (reduce by rule 406) + default_list : default . AND default_list + + AND shift 743 + ASM_COLON reduce by rule 406 + + + . error + + + state 735: + + default : DOLLAR . id LBRACKET int RBRACKET EQ exp + + CELLSET shift 50 + ID shift 49 + SYMBOL shift 48 + + id goto 744 + + . error + + + state 736: + + bitSize : OF int aggregable BITS . (reduce by rule 386) + + WHERE reduce by rule 386 + ASM_COLON reduce by rule 386 + ALIASING reduce by rule 386 + + + . error + + + state 737: + + consbind : sym of_ty consassembly consencoding rtl nop nullified delayslot delayslotcandidate sdi latency pipeline . (reduce by rule 144) + + ARCHITECTURE reduce by rule 144 + END reduce by rule 144 + LOCAL reduce by rule 144 + IN reduce by rule 144 + DATATYPE reduce by rule 144 + TYPE reduce by rule 144 + AND reduce by rule 144 + RPAREN reduce by rule 144 + SEMICOLON reduce by rule 144 + STORAGE reduce by rule 144 + LOCATIONS reduce by rule 144 + BAR reduce by rule 144 + STRUCTURE reduce by rule 144 + FUNCTOR reduce by rule 144 + SIGNATURE reduce by rule 144 + SHARING reduce by rule 144 + INSTRUCTION reduce by rule 144 + VLIW reduce by rule 144 + SUPERSCALAR reduce by rule 144 + WITHTYPE reduce by rule 144 + FUN reduce by rule 144 + VAL reduce by rule 144 + INCLUDE reduce by rule 144 + OPEN reduce by rule 144 + LITTLE reduce by rule 144 + BIG reduce by rule 144 + PIPELINE reduce by rule 144 + LOWERCASE reduce by rule 144 + UPPERCASE reduce by rule 144 + VERBATIM reduce by rule 144 + RTL reduce by rule 144 + NONFIX reduce by rule 144 + INFIX reduce by rule 144 + INFIXR reduce by rule 144 + DEBUG reduce by rule 144 + RESOURCE reduce by rule 144 + CPU reduce by rule 144 + LATENCY reduce by rule 144 + EXCEPTION reduce by rule 144 + EOF reduce by rule 144 + + + . error + + + state 738: + + pipeline : PIPELINE . COLON exp + + COLON shift 745 + + + . error + + + state 739: + + latency : LATENCY COLON . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 746 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 740: + + exp : exp . HANDLE clauses + sdi : SPAN DEPENDENT exp . (reduce by rule 175) + + ARCHITECTURE reduce by rule 175 + END reduce by rule 175 + LOCAL reduce by rule 175 + IN reduce by rule 175 + DATATYPE reduce by rule 175 + TYPE reduce by rule 175 + AND reduce by rule 175 + RPAREN reduce by rule 175 + SEMICOLON reduce by rule 175 + STORAGE reduce by rule 175 + LOCATIONS reduce by rule 175 + BAR reduce by rule 175 + HANDLE shift 402 + STRUCTURE reduce by rule 175 + FUNCTOR reduce by rule 175 + SIGNATURE reduce by rule 175 + SHARING reduce by rule 175 + INSTRUCTION reduce by rule 175 + VLIW reduce by rule 175 + SUPERSCALAR reduce by rule 175 + WITHTYPE reduce by rule 175 + FUN reduce by rule 175 + VAL reduce by rule 175 + INCLUDE reduce by rule 175 + OPEN reduce by rule 175 + LITTLE reduce by rule 175 + BIG reduce by rule 175 + PIPELINE reduce by rule 175 + LOWERCASE reduce by rule 175 + UPPERCASE reduce by rule 175 + VERBATIM reduce by rule 175 + RTL reduce by rule 175 + NONFIX reduce by rule 175 + INFIX reduce by rule 175 + INFIXR reduce by rule 175 + DEBUG reduce by rule 175 + RESOURCE reduce by rule 175 + CPU reduce by rule 175 + LATENCY reduce by rule 175 + EXCEPTION reduce by rule 175 + EOF reduce by rule 175 + + + . error + + + state 741: + + printcell : ASM_COLON string . (reduce by rule 402) + + ARCHITECTURE reduce by rule 402 + END reduce by rule 402 + LOCAL reduce by rule 402 + IN reduce by rule 402 + DATATYPE reduce by rule 402 + TYPE reduce by rule 402 + RPAREN reduce by rule 402 + SEMICOLON reduce by rule 402 + STORAGE reduce by rule 402 + LOCATIONS reduce by rule 402 + BAR reduce by rule 402 + STRUCTURE reduce by rule 402 + FUNCTOR reduce by rule 402 + SIGNATURE reduce by rule 402 + SHARING reduce by rule 402 + INSTRUCTION reduce by rule 402 + VLIW reduce by rule 402 + SUPERSCALAR reduce by rule 402 + FUN reduce by rule 402 + VAL reduce by rule 402 + INCLUDE reduce by rule 402 + OPEN reduce by rule 402 + LITTLE reduce by rule 402 + BIG reduce by rule 402 + PIPELINE reduce by rule 402 + LOWERCASE reduce by rule 402 + UPPERCASE reduce by rule 402 + VERBATIM reduce by rule 402 + RTL reduce by rule 402 + NONFIX reduce by rule 402 + INFIX reduce by rule 402 + INFIXR reduce by rule 402 + DEBUG reduce by rule 402 + RESOURCE reduce by rule 402 + CPU reduce by rule 402 + LATENCY reduce by rule 402 + EXCEPTION reduce by rule 402 + EOF reduce by rule 402 + + + . error + + + state 742: + + printcell : ASM_COLON LPAREN . exp RPAREN + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 747 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 743: + + default_list : default AND . default_list + + DOLLAR shift 735 + + default goto 734 + default_list goto 748 + + . error + + + state 744: + + default : DOLLAR id . LBRACKET int RBRACKET EQ exp + + LBRACKET shift 749 + + + . error + + + state 745: + + pipeline : PIPELINE COLON . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 750 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 746: + + exp : exp . HANDLE clauses + latency : LATENCY COLON exp . (reduce by rule 145) + + ARCHITECTURE reduce by rule 145 + END reduce by rule 145 + LOCAL reduce by rule 145 + IN reduce by rule 145 + DATATYPE reduce by rule 145 + TYPE reduce by rule 145 + AND reduce by rule 145 + RPAREN reduce by rule 145 + SEMICOLON reduce by rule 145 + STORAGE reduce by rule 145 + LOCATIONS reduce by rule 145 + BAR reduce by rule 145 + HANDLE shift 402 + STRUCTURE reduce by rule 145 + FUNCTOR reduce by rule 145 + SIGNATURE reduce by rule 145 + SHARING reduce by rule 145 + INSTRUCTION reduce by rule 145 + VLIW reduce by rule 145 + SUPERSCALAR reduce by rule 145 + WITHTYPE reduce by rule 145 + FUN reduce by rule 145 + VAL reduce by rule 145 + INCLUDE reduce by rule 145 + OPEN reduce by rule 145 + LITTLE reduce by rule 145 + BIG reduce by rule 145 + PIPELINE reduce by rule 145 + LOWERCASE reduce by rule 145 + UPPERCASE reduce by rule 145 + VERBATIM reduce by rule 145 + RTL reduce by rule 145 + NONFIX reduce by rule 145 + INFIX reduce by rule 145 + INFIXR reduce by rule 145 + DEBUG reduce by rule 145 + RESOURCE reduce by rule 145 + CPU reduce by rule 145 + LATENCY reduce by rule 145 + EXCEPTION reduce by rule 145 + EOF reduce by rule 145 + + + . error + + + state 747: + + exp : exp . HANDLE clauses + printcell : ASM_COLON LPAREN exp . RPAREN + + RPAREN shift 751 + HANDLE shift 402 + + + . error + + + state 748: + + default_list : default AND default_list . (reduce by rule 407) + + ASM_COLON reduce by rule 407 + + + . error + + + state 749: + + default : DOLLAR id LBRACKET . int RBRACKET EQ exp + + INT shift 64 + + int goto 752 + + . error + + + state 750: + + exp : exp . HANDLE clauses + pipeline : PIPELINE COLON exp . (reduce by rule 147) + + ARCHITECTURE reduce by rule 147 + END reduce by rule 147 + LOCAL reduce by rule 147 + IN reduce by rule 147 + DATATYPE reduce by rule 147 + TYPE reduce by rule 147 + AND reduce by rule 147 + RPAREN reduce by rule 147 + SEMICOLON reduce by rule 147 + STORAGE reduce by rule 147 + LOCATIONS reduce by rule 147 + BAR reduce by rule 147 + HANDLE shift 402 + STRUCTURE reduce by rule 147 + FUNCTOR reduce by rule 147 + SIGNATURE reduce by rule 147 + SHARING reduce by rule 147 + INSTRUCTION reduce by rule 147 + VLIW reduce by rule 147 + SUPERSCALAR reduce by rule 147 + WITHTYPE reduce by rule 147 + FUN reduce by rule 147 + VAL reduce by rule 147 + INCLUDE reduce by rule 147 + OPEN reduce by rule 147 + LITTLE reduce by rule 147 + BIG reduce by rule 147 + PIPELINE reduce by rule 147 + LOWERCASE reduce by rule 147 + UPPERCASE reduce by rule 147 + VERBATIM reduce by rule 147 + RTL reduce by rule 147 + NONFIX reduce by rule 147 + INFIX reduce by rule 147 + INFIXR reduce by rule 147 + DEBUG reduce by rule 147 + RESOURCE reduce by rule 147 + CPU reduce by rule 147 + LATENCY reduce by rule 147 + EXCEPTION reduce by rule 147 + EOF reduce by rule 147 + + + . error + + + state 751: + + printcell : ASM_COLON LPAREN exp RPAREN . (reduce by rule 403) + + ARCHITECTURE reduce by rule 403 + END reduce by rule 403 + LOCAL reduce by rule 403 + IN reduce by rule 403 + DATATYPE reduce by rule 403 + TYPE reduce by rule 403 + RPAREN reduce by rule 403 + SEMICOLON reduce by rule 403 + STORAGE reduce by rule 403 + LOCATIONS reduce by rule 403 + BAR reduce by rule 403 + STRUCTURE reduce by rule 403 + FUNCTOR reduce by rule 403 + SIGNATURE reduce by rule 403 + SHARING reduce by rule 403 + INSTRUCTION reduce by rule 403 + VLIW reduce by rule 403 + SUPERSCALAR reduce by rule 403 + FUN reduce by rule 403 + VAL reduce by rule 403 + INCLUDE reduce by rule 403 + OPEN reduce by rule 403 + LITTLE reduce by rule 403 + BIG reduce by rule 403 + PIPELINE reduce by rule 403 + LOWERCASE reduce by rule 403 + UPPERCASE reduce by rule 403 + VERBATIM reduce by rule 403 + RTL reduce by rule 403 + NONFIX reduce by rule 403 + INFIX reduce by rule 403 + INFIXR reduce by rule 403 + DEBUG reduce by rule 403 + RESOURCE reduce by rule 403 + CPU reduce by rule 403 + LATENCY reduce by rule 403 + EXCEPTION reduce by rule 403 + EOF reduce by rule 403 + + + . error + + + state 752: + + default : DOLLAR id LBRACKET int . RBRACKET EQ exp + + RBRACKET shift 753 + + + . error + + + state 753: + + default : DOLLAR id LBRACKET int RBRACKET . EQ exp + + EQ shift 754 + + + . error + + + state 754: + + default : DOLLAR id LBRACKET int RBRACKET EQ . exp + + CASE shift 301 + EQ shift 300 + DOLLAR shift 299 + TIMES shift 72 + DEREF shift 71 + NOT shift 70 + LLBRACKET shift 298 + LHASHBRACKET shift 297 + LPAREN shift 296 + LBRACKET shift 295 + LBRACE shift 294 + LDQUOTE shift 293 + CELLSET shift 50 + FN shift 292 + HASH shift 291 + IF shift 290 + TRUE shift 99 + FALSE shift 98 + RAISE shift 289 + LET shift 288 + OP shift 287 + ALWAYS shift 96 + NEVER shift 95 + ID shift 49 + SYMBOL shift 48 + WORD shift 94 + INT shift 64 + INTINF shift 93 + REAL shift 92 + STRING shift 91 + CHAR shift 90 + + id goto 135 + sym goto 286 + symb goto 67 + ident2 goto 285 + path goto 85 + aexp goto 284 + aexp2 goto 283 + appexp goto 282 + exp goto 755 + word goto 82 + int goto 81 + intinf goto 80 + real goto 79 + string goto 78 + char goto 77 + bool goto 76 + literal goto 280 + asm_strings goto 279 + True goto 74 + False goto 73 + + . error + + + state 755: + + exp : exp . HANDLE clauses + default : DOLLAR id LBRACKET int RBRACKET EQ exp . (reduce by rule 408) + + AND reduce by rule 408 + HANDLE shift 402 + ASM_COLON reduce by rule 408 + + + . error + + + state 756: + + + EOF accept + + + . error + + 16352 of 19587 action table entries left after compaction + 2182 goto table entries diff -N -C 2 -r MLRISC/aliasing/pointsTo.sig MLRISC-mlton/aliasing/pointsTo.sig *** MLRISC/aliasing/pointsTo.sig 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/aliasing/pointsTo.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 8,23 **** eqtype edgekind ! structure C : CELLS_BASIS = CellsBasis datatype cell = ! LINK of region ! | SREF of C.cell * edges ref ! | WREF of C.cell * edges ref ! | SCELL of C.cell * edges ref ! | WCELL of C.cell * edges ref | TOP of {mutable:bool, id:C.cell, name:string} (* a collapsed node *) ! withtype region = cell ref ! and edges = (edgekind * int * region) list val reset : (unit -> C.cell) -> unit --- 8,32 ---- eqtype edgekind ! structure C : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo datatype cell = ! LINK of cell ref ! | SREF of C.cell * (edgekind * int * cell ref) list ref ! | WREF of C.cell * (edgekind * int * cell ref) list ref ! | SCELL of C.cell * (edgekind * int * cell ref) list ref ! | WCELL of C.cell * (edgekind * int * cell ref) list ref | TOP of {mutable:bool, id:C.cell, name:string} (* a collapsed node *) ! type region = cell ref ! type edges = (edgekind * int * region) list val reset : (unit -> C.cell) -> unit diff -N -C 2 -r MLRISC/aliasing/pointsTo.sml MLRISC-mlton/aliasing/pointsTo.sml *** MLRISC/aliasing/pointsTo.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/aliasing/pointsTo.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 11,24 **** datatype cell = ! LINK of region ! | SREF of C.cell * edges ref ! | WREF of C.cell * edges ref ! | SCELL of C.cell * edges ref ! | WCELL of C.cell * edges ref | TOP of {mutable:bool, id:C.cell, name:string} (* a collapsed node *) ! ! withtype region = cell ref ! and edges = (edgekind * int * region) list fun error msg = MLRiscErrorMsg.error("PointsTo",msg) --- 11,23 ---- datatype cell = ! LINK of cell ref ! | SREF of C.cell * (edgekind * int * cell ref) list ref ! | WREF of C.cell * (edgekind * int * cell ref) list ref ! | SCELL of C.cell * (edgekind * int * cell ref) list ref ! | WCELL of C.cell * (edgekind * int * cell ref) list ref | TOP of {mutable:bool, id:C.cell, name:string} (* a collapsed node *) ! type region = cell ref ! type edges = (edgekind * int * region) list fun error msg = MLRiscErrorMsg.error("PointsTo",msg) *************** *** 27,33 **** fun greaterKind(PI,_) = false | greaterKind(DOM,PI) = false ! | greaterKind(RAN,(PI | DOM)) = false ! | greaterKind(RECORD,(PI | DOM | RAN)) = false ! | greaterKind(MARK,(PI | DOM | RAN | RECORD)) = false | greaterKind _ = true --- 26,38 ---- fun greaterKind(PI,_) = false | greaterKind(DOM,PI) = false ! | greaterKind(RAN,PI) = false ! | greaterKind(RAN,DOM) = false ! | greaterKind(RECORD,PI) = false ! | greaterKind(RECORD,DOM) = false ! | greaterKind(RECORD,RAN) = false ! | greaterKind(MARK,PI) = false ! | greaterKind(MARK,DOM) = false ! | greaterKind(MARK,RAN) = false ! | greaterKind(MARK,RECORD) = false | greaterKind _ = true diff -N -C 2 -r MLRISC/alpha/backpatch/alphaJumps.sml MLRISC-mlton/alpha/backpatch/alphaJumps.sml *** MLRISC/alpha/backpatch/alphaJumps.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/alpha/backpatch/alphaJumps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,13 **** functor AlphaJumps (structure Instr : ALPHAINSTR ! structure Shuffle : ALPHASHUFFLE ! where I = Instr ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T ) : SDI_JUMPS = struct --- 6,70 ---- functor AlphaJumps (structure Instr : ALPHAINSTR ! structure Shuffle : ALPHASHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! and type I.branch = Instr.branch ! and type I.cmove = Instr.cmove ! and type I.ea = Instr.ea ! and type I.fbranch = Instr.fbranch ! and type I.fcmove = Instr.fcmove ! and type I.fload = Instr.fload ! and type I.foperate = Instr.foperate ! and type I.foperateV = Instr.foperateV ! and type I.fstore = Instr.fstore ! and type I.funary = Instr.funary ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.load = Instr.load ! and type I.operand = Instr.operand ! and type I.operate = Instr.operate ! and type I.operateV = Instr.operateV ! and type I.osf_user_palcode = Instr.osf_user_palcode ! and type I.pseudo_op = Instr.pseudo_op ! and type I.store = Instr.store ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : SDI_JUMPS = struct diff -N -C 2 -r MLRISC/alpha/emit/alphaAsm.sml MLRISC-mlton/alpha/emit/alphaAsm.sml *** MLRISC/alpha/emit/alphaAsm.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/alpha/emit/alphaAsm.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,16 **** functor AlphaAsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : ALPHAINSTR ! where T = S.P.T ! structure Shuffle : ALPHASHUFFLE ! where I = Instr ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T ) : INSTRUCTION_EMITTER = struct --- 7,92 ---- functor AlphaAsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : ALPHAINSTR (* where T = S.P.T *) ! where type T.Basis.cond = S.P.T.Basis.cond ! and type T.Basis.div_rounding_mode = S.P.T.Basis.div_rounding_mode ! and type T.Basis.ext = S.P.T.Basis.ext ! and type T.Basis.fcond = S.P.T.Basis.fcond ! and type T.Basis.rounding_mode = S.P.T.Basis.rounding_mode ! and type T.Constant.const = S.P.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) S.P.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) S.P.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) S.P.T.Extension.sx ! and type T.I.div_rounding_mode = S.P.T.I.div_rounding_mode ! and type T.Region.region = S.P.T.Region.region ! and type T.ccexp = S.P.T.ccexp ! and type T.fexp = S.P.T.fexp ! (* and type T.labexp = S.P.T.labexp *) ! and type T.mlrisc = S.P.T.mlrisc ! and type T.oper = S.P.T.oper ! and type T.rep = S.P.T.rep ! and type T.rexp = S.P.T.rexp ! and type T.stm = S.P.T.stm ! structure Shuffle : ALPHASHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! and type I.branch = Instr.branch ! and type I.cmove = Instr.cmove ! and type I.ea = Instr.ea ! and type I.fbranch = Instr.fbranch ! and type I.fcmove = Instr.fcmove ! and type I.fload = Instr.fload ! and type I.foperate = Instr.foperate ! and type I.foperateV = Instr.foperateV ! and type I.fstore = Instr.fstore ! and type I.funary = Instr.funary ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.load = Instr.load ! and type I.operand = Instr.operand ! and type I.operate = Instr.operate ! and type I.operateV = Instr.operateV ! and type I.osf_user_palcode = Instr.osf_user_palcode ! and type I.pseudo_op = Instr.pseudo_op ! and type I.store = Instr.store ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : INSTRUCTION_EMITTER = struct diff -N -C 2 -r MLRISC/alpha/emit/alphaMC.sml MLRISC-mlton/alpha/emit/alphaMC.sml *** MLRISC/alpha/emit/alphaMC.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/alpha/emit/alphaMC.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,11 **** functor AlphaMCEmitter(structure Instr : ALPHAINSTR ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T structure Stream : INSTRUCTION_STREAM structure CodeString : CODE_STRING --- 7,31 ---- functor AlphaMCEmitter(structure Instr : ALPHAINSTR ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm structure Stream : INSTRUCTION_STREAM structure CodeString : CODE_STRING *************** *** 48,51 **** --- 68,72 ---- fun eByteW w = let val i = !loc + val w = W.toLargeWord w in loc := i + 1; CodeString.update(i,Word8.fromLargeWord w) end diff -N -C 2 -r MLRISC/alpha/flowgraph/alphaGasPseudoOps.sml MLRISC-mlton/alpha/flowgraph/alphaGasPseudoOps.sml *** MLRISC/alpha/flowgraph/alphaGasPseudoOps.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/alpha/flowgraph/alphaGasPseudoOps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,5 **** functor AlphaGasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ) : PSEUDO_OPS_BASIS = --- 1,25 ---- functor AlphaGasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ) : PSEUDO_OPS_BASIS = diff -N -C 2 -r MLRISC/alpha/instructions/alphaInstr.sml MLRISC-mlton/alpha/instructions/alphaInstr.sml *** MLRISC/alpha/instructions/alphaInstr.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/alpha/instructions/alphaInstr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 9,13 **** sig structure C : ALPHACELLS ! structure CB : CELLS_BASIS = CellsBasis structure T : MLTREE structure Constant: CONSTANT --- 9,22 ---- sig structure C : ALPHACELLS ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo structure T : MLTREE structure Constant: CONSTANT diff -N -C 2 -r MLRISC/alpha/instructions/alphaProps.sml MLRISC-mlton/alpha/instructions/alphaProps.sml *** MLRISC/alpha/instructions/alphaProps.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/alpha/instructions/alphaProps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,12 **** functor AlphaProps (structure Instr : ALPHAINSTR ! structure MLTreeHash : MLTREE_HASH where T = Instr.T ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T ):INSN_PROPERTIES = struct --- 7,52 ---- functor AlphaProps (structure Instr : ALPHAINSTR ! structure MLTreeHash : MLTREE_HASH (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ):INSN_PROPERTIES = struct diff -N -C 2 -r MLRISC/alpha/mltree/alpha.sml MLRISC-mlton/alpha/mltree/alpha.sml *** MLRISC/alpha/mltree/alpha.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/alpha/mltree/alpha.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 12,20 **** functor Alpha (structure AlphaInstr : ALPHAINSTR ! structure PseudoInstrs : ALPHA_PSEUDO_INSTR ! where I = AlphaInstr ! structure ExtensionComp : MLTREE_EXTENSION_COMP ! where I = AlphaInstr ! and T = AlphaInstr.T (* Cost of multiplication in cycles *) --- 12,81 ---- functor Alpha (structure AlphaInstr : ALPHAINSTR ! structure PseudoInstrs : ALPHA_PSEUDO_INSTR (* where I = AlphaInstr *) ! where type I.Constant.const = AlphaInstr.Constant.const ! and type I.Region.region = AlphaInstr.Region.region ! and type I.T.Basis.cond = AlphaInstr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = AlphaInstr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = AlphaInstr.T.Basis.ext ! and type I.T.Basis.fcond = AlphaInstr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = AlphaInstr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) AlphaInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) AlphaInstr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) AlphaInstr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) AlphaInstr.T.Extension.sx ! and type I.T.I.div_rounding_mode = AlphaInstr.T.I.div_rounding_mode ! and type I.T.ccexp = AlphaInstr.T.ccexp ! and type I.T.fexp = AlphaInstr.T.fexp ! (* and type I.T.labexp = AlphaInstr.T.labexp *) ! and type I.T.mlrisc = AlphaInstr.T.mlrisc ! and type I.T.oper = AlphaInstr.T.oper ! and type I.T.rep = AlphaInstr.T.rep ! and type I.T.rexp = AlphaInstr.T.rexp ! and type I.T.stm = AlphaInstr.T.stm ! and type I.branch = AlphaInstr.branch ! and type I.cmove = AlphaInstr.cmove ! and type I.ea = AlphaInstr.ea ! and type I.fbranch = AlphaInstr.fbranch ! and type I.fcmove = AlphaInstr.fcmove ! and type I.fload = AlphaInstr.fload ! and type I.foperate = AlphaInstr.foperate ! and type I.foperateV = AlphaInstr.foperateV ! and type I.fstore = AlphaInstr.fstore ! and type I.funary = AlphaInstr.funary ! and type I.instr = AlphaInstr.instr ! and type I.instruction = AlphaInstr.instruction ! and type I.load = AlphaInstr.load ! and type I.operand = AlphaInstr.operand ! and type I.operate = AlphaInstr.operate ! and type I.operateV = AlphaInstr.operateV ! and type I.osf_user_palcode = AlphaInstr.osf_user_palcode ! and type I.pseudo_op = AlphaInstr.pseudo_op ! and type I.store = AlphaInstr.store ! structure ExtensionComp : MLTREE_EXTENSION_COMP (* where I = AlphaInstr and T = AlphaInstr.T *) ! where type I.addressing_mode = AlphaInstr.addressing_mode ! and type I.ea = AlphaInstr.ea ! and type I.instr = AlphaInstr.instr ! and type I.instruction = AlphaInstr.instruction ! and type I.operand = AlphaInstr.operand ! where type T.Basis.cond = AlphaInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = AlphaInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = AlphaInstr.T.Basis.ext ! and type T.Basis.fcond = AlphaInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = AlphaInstr.T.Basis.rounding_mode ! and type T.Constant.const = AlphaInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) AlphaInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) AlphaInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) AlphaInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) AlphaInstr.T.Extension.sx ! and type T.I.div_rounding_mode = AlphaInstr.T.I.div_rounding_mode ! and type T.Region.region = AlphaInstr.T.Region.region ! and type T.ccexp = AlphaInstr.T.ccexp ! and type T.fexp = AlphaInstr.T.fexp ! (* and type T.labexp = AlphaInstr.T.labexp *) ! and type T.mlrisc = AlphaInstr.T.mlrisc ! and type T.oper = AlphaInstr.T.oper ! and type T.rep = AlphaInstr.T.rep ! and type T.rexp = AlphaInstr.T.rexp ! and type T.stm = AlphaInstr.T.stm (* Cost of multiplication in cycles *) *************** *** 216,220 **** * by constant optimizations. *) ! functor Multiply32 = MLTreeMult (structure I = I structure T = T --- 277,283 ---- * by constant optimizations. *) ! ! (* signed, trapping version of multiply and divide *) ! structure Mult32 = MLTreeMult (structure I = I structure T = T *************** *** 257,294 **** I.operate{oper=I.SRA,ra=tmp,rb=I.IMMop i,rc=d}] end ! ) ! functor Multiply64 = MLTreeMult (structure I = I structure T = T structure CB = CellsBasis - - val intTy = 64 ! type arg = {r1:CB.cell, r2:CB.cell, d:CB.cell} ! type argi = {r:CB.cell, i:int, d:CB.cell} fun mov{r,d} = I.COPY{k=CB.GP, sz=intTy, dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d}= I.operate{oper=I.ADDQ,ra=r1,rb=I.REGop r2,rc=d} ! fun slli{r,i,d} = [I.operate{oper=I.SLL,ra=r,rb=I.IMMop i,rc=d}] ! fun srli{r,i,d} = [I.operate{oper=I.SRL,ra=r,rb=I.IMMop i,rc=d}] ! fun srai{r,i,d} = [I.operate{oper=I.SRA,ra=r,rb=I.IMMop i,rc=d}] ! ) ! (* signed, trapping version of multiply and divide *) ! structure Mult32 = Multiply32 ! (val trapping = true val multCost = multCost ! fun addv{r1,r2,d} = [I.operatev{oper=I.ADDLV,ra=r1,rb=I.REGop r2,rc=d}] ! fun subv{r1,r2,d} = [I.operatev{oper=I.SUBLV,ra=r1,rb=I.REGop r2,rc=d}] val sh1addv = NONE ! val sh2addv = NONE ! val sh3addv = NONE ! ) ! (val signed = true) ! (* non-trapping version of multiply and divide *) ! functor Mul32 = Multiply32 ! (val trapping = false val multCost = multCost fun addv{r1,r2,d} = [I.operate{oper=I.ADDL,ra=r1,rb=I.REGop r2,rc=d}] --- 320,432 ---- I.operate{oper=I.SRA,ra=tmp,rb=I.IMMop i,rc=d}] end ! ! val trapping = true ! val multCost = multCost ! fun addv{r1,r2,d} = [I.operatev{oper=I.ADDLV,ra=r1,rb=I.REGop r2,rc=d}] ! fun subv{r1,r2,d} = [I.operatev{oper=I.SUBLV,ra=r1,rb=I.REGop r2,rc=d}] ! val sh1addv = NONE ! val sh2addv = NONE ! val sh3addv = NONE ! ! val signed = true) ! (* unsigned, non-trapping version of multiply and divide *) ! structure Mulu32 = MLTreeMult (structure I = I structure T = T structure CB = CellsBasis ! val intTy = 32 ! ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} fun mov{r,d} = I.COPY{k=CB.GP, sz=intTy, dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d} = I.operate{oper=I.ADDL,ra=r1,rb=I.REGop r2,rc=d} ! (* ! * How to left shift by a constant (32bits) ! *) ! fun slli{r,i=1,d} = [I.operate{oper=I.ADDL,ra=r,rb=I.REGop r,rc=d}] ! | slli{r,i=2,d} = [I.operate{oper=I.S4ADDL,ra=r,rb=zeroOpn,rc=d}] ! | slli{r,i=3,d} = [I.operate{oper=I.S8ADDL,ra=r,rb=zeroOpn,rc=d}] ! | slli{r,i,d} = ! let val tmp = C.newReg() ! in [I.operate{oper=I.SLL,ra=r,rb=I.IMMop i,rc=tmp}, ! I.operate{oper=I.ADDL,ra=tmp,rb=zeroOpn,rc=d}] ! end ! (* ! * How to right shift (unsigned) by a constant (32bits) ! *) ! fun srli{r,i,d} = ! let val tmp = C.newReg() ! in [I.operate{oper=I.ZAP,ra=r,rb=I.IMMop 0xf0,rc=tmp}, ! I.operate{oper=I.SRL,ra=tmp,rb=I.IMMop i,rc=d}] ! end ! ! (* ! * How to right shift (signed) by a constant (32bits) ! *) ! fun srai{r,i,d} = ! let val tmp = C.newReg() ! in [I.operate{oper=I.ADDL,ra=r,rb=zeroOpn,rc=tmp}, ! I.operate{oper=I.SRA,ra=tmp,rb=I.IMMop i,rc=d}] ! end ! ! val trapping = false val multCost = multCost ! fun addv{r1,r2,d} = [I.operate{oper=I.ADDL,ra=r1,rb=I.REGop r2,rc=d}] ! fun subv{r1,r2,d} = [I.operate{oper=I.SUBL,ra=r1,rb=I.REGop r2,rc=d}] val sh1addv = NONE ! val sh2addv = SOME(fn {r1,r2,d} => ! [I.operate{oper=I.S4ADDL,ra=r1,rb=I.REGop r2,rc=d}]) ! val sh3addv = SOME(fn {r1,r2,d} => ! [I.operate{oper=I.S8ADDL,ra=r1,rb=I.REGop r2,rc=d}]) ! ! val signed = false) ! (* signed, non-trapping version of multiply and divide *) ! structure Muls32 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! val intTy = 32 ! ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! ! fun mov{r,d} = I.COPY{k=CB.GP, sz=intTy, dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d} = I.operate{oper=I.ADDL,ra=r1,rb=I.REGop r2,rc=d} ! (* ! * How to left shift by a constant (32bits) ! *) ! fun slli{r,i=1,d} = [I.operate{oper=I.ADDL,ra=r,rb=I.REGop r,rc=d}] ! | slli{r,i=2,d} = [I.operate{oper=I.S4ADDL,ra=r,rb=zeroOpn,rc=d}] ! | slli{r,i=3,d} = [I.operate{oper=I.S8ADDL,ra=r,rb=zeroOpn,rc=d}] ! | slli{r,i,d} = ! let val tmp = C.newReg() ! in [I.operate{oper=I.SLL,ra=r,rb=I.IMMop i,rc=tmp}, ! I.operate{oper=I.ADDL,ra=tmp,rb=zeroOpn,rc=d}] ! end ! ! (* ! * How to right shift (unsigned) by a constant (32bits) ! *) ! fun srli{r,i,d} = ! let val tmp = C.newReg() ! in [I.operate{oper=I.ZAP,ra=r,rb=I.IMMop 0xf0,rc=tmp}, ! I.operate{oper=I.SRL,ra=tmp,rb=I.IMMop i,rc=d}] ! end ! ! (* ! * How to right shift (signed) by a constant (32bits) ! *) ! fun srai{r,i,d} = ! let val tmp = C.newReg() ! in [I.operate{oper=I.ADDL,ra=r,rb=zeroOpn,rc=tmp}, ! I.operate{oper=I.SRA,ra=tmp,rb=I.IMMop i,rc=d}] ! end ! ! val trapping = false val multCost = multCost fun addv{r1,r2,d} = [I.operate{oper=I.ADDL,ra=r1,rb=I.REGop r2,rc=d}] *************** *** 299,309 **** val sh3addv = SOME(fn {r1,r2,d} => [I.operate{oper=I.S8ADDL,ra=r1,rb=I.REGop r2,rc=d}]) ! ) ! structure Mulu32 = Mul32(val signed = false) ! structure Muls32 = Mul32(val signed = true) (* signed, trapping version of multiply and divide *) ! structure Mult64 = Multiply64 ! (val trapping = true val multCost = multCost fun addv{r1,r2,d} = [I.operatev{oper=I.ADDQV,ra=r1,rb=I.REGop r2,rc=d}] --- 437,461 ---- val sh3addv = SOME(fn {r1,r2,d} => [I.operate{oper=I.S8ADDL,ra=r1,rb=I.REGop r2,rc=d}]) ! ! val signed = true) (* signed, trapping version of multiply and divide *) ! structure Mult64 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! ! val intTy = 64 ! ! type arg = {r1:CB.cell, r2:CB.cell, d:CB.cell} ! type argi = {r:CB.cell, i:int, d:CB.cell} ! ! fun mov{r,d} = I.COPY{k=CB.GP, sz=intTy, dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d}= I.operate{oper=I.ADDQ,ra=r1,rb=I.REGop r2,rc=d} ! fun slli{r,i,d} = [I.operate{oper=I.SLL,ra=r,rb=I.IMMop i,rc=d}] ! fun srli{r,i,d} = [I.operate{oper=I.SRL,ra=r,rb=I.IMMop i,rc=d}] ! fun srai{r,i,d} = [I.operate{oper=I.SRA,ra=r,rb=I.IMMop i,rc=d}] ! ! val trapping = true val multCost = multCost fun addv{r1,r2,d} = [I.operatev{oper=I.ADDQV,ra=r1,rb=I.REGop r2,rc=d}] *************** *** 312,321 **** val sh2addv = NONE val sh3addv = NONE ! ) ! (val signed = true) (* unsigned, non-trapping version of multiply and divide *) ! functor Mul64 = Multiply64 ! (val trapping = false val multCost = multCost fun addv{r1,r2,d} = [I.operate{oper=I.ADDQ,ra=r1,rb=I.REGop r2,rc=d}] --- 464,516 ---- val sh2addv = NONE val sh3addv = NONE ! ! val signed = true) (* unsigned, non-trapping version of multiply and divide *) ! structure Mulu64 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! ! val intTy = 64 ! ! type arg = {r1:CB.cell, r2:CB.cell, d:CB.cell} ! type argi = {r:CB.cell, i:int, d:CB.cell} ! ! fun mov{r,d} = I.COPY{k=CB.GP, sz=intTy, dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d}= I.operate{oper=I.ADDQ,ra=r1,rb=I.REGop r2,rc=d} ! fun slli{r,i,d} = [I.operate{oper=I.SLL,ra=r,rb=I.IMMop i,rc=d}] ! fun srli{r,i,d} = [I.operate{oper=I.SRL,ra=r,rb=I.IMMop i,rc=d}] ! fun srai{r,i,d} = [I.operate{oper=I.SRA,ra=r,rb=I.IMMop i,rc=d}] ! ! val trapping = false ! val multCost = multCost ! fun addv{r1,r2,d} = [I.operate{oper=I.ADDQ,ra=r1,rb=I.REGop r2,rc=d}] ! fun subv{r1,r2,d} = [I.operate{oper=I.SUBQ,ra=r1,rb=I.REGop r2,rc=d}] ! val sh1addv = NONE ! val sh2addv = SOME(fn {r1,r2,d} => ! [I.operate{oper=I.S4ADDQ,ra=r1,rb=I.REGop r2,rc=d}]) ! val sh3addv = SOME(fn {r1,r2,d} => ! [I.operate{oper=I.S8ADDQ,ra=r1,rb=I.REGop r2,rc=d}]) ! ! val signed = false) ! (* signed, non-trapping version of multiply and divide *) ! structure Muls64 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! ! val intTy = 64 ! ! type arg = {r1:CB.cell, r2:CB.cell, d:CB.cell} ! type argi = {r:CB.cell, i:int, d:CB.cell} ! ! fun mov{r,d} = I.COPY{k=CB.GP, sz=intTy, dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d}= I.operate{oper=I.ADDQ,ra=r1,rb=I.REGop r2,rc=d} ! fun slli{r,i,d} = [I.operate{oper=I.SLL,ra=r,rb=I.IMMop i,rc=d}] ! fun srli{r,i,d} = [I.operate{oper=I.SRL,ra=r,rb=I.IMMop i,rc=d}] ! fun srai{r,i,d} = [I.operate{oper=I.SRA,ra=r,rb=I.IMMop i,rc=d}] ! ! val trapping = false val multCost = multCost fun addv{r1,r2,d} = [I.operate{oper=I.ADDQ,ra=r1,rb=I.REGop r2,rc=d}] *************** *** 326,332 **** val sh3addv = SOME(fn {r1,r2,d} => [I.operate{oper=I.S8ADDQ,ra=r1,rb=I.REGop r2,rc=d}]) ! ) ! structure Mulu64 = Mul64(val signed = false) ! structure Muls64 = Mul64(val signed = true) (* --- 521,526 ---- val sh3addv = SOME(fn {r1,r2,d} => [I.operate{oper=I.S8ADDQ,ra=r1,rb=I.REGop r2,rc=d}]) ! ! val signed = true) (* *************** *** 972,979 **** | T.ADD(64,e,T.LABEXP le) => mark(I.LDA{r=d,b=expr e,d=I.LABop le},an) | T.ADD(64,T.LABEXP le,e) => mark(I.LDA{r=d,b=expr e,d=I.LABop le},an) ! | T.ADD(64,e,x as (T.CONST _ | T.LABEL _)) => ! mark(I.LDA{r=d,b=expr e,d=I.LABop x},an) ! | T.ADD(64,x as (T.CONST _ | T.LABEL _),e) => ! mark(I.LDA{r=d,b=expr e,d=I.LABop x},an) | T.ADD(64,e,T.LI i) => loadImmed(i, expr e, d, an) | T.ADD(64,T.LI i,e) => loadImmed(i, expr e, d, an) --- 1166,1173 ---- | T.ADD(64,e,T.LABEXP le) => mark(I.LDA{r=d,b=expr e,d=I.LABop le},an) | T.ADD(64,T.LABEXP le,e) => mark(I.LDA{r=d,b=expr e,d=I.LABop le},an) ! | T.ADD(64,e,x as T.CONST _) => mark(I.LDA{r=d,b=expr e,d=I.LABop x},an) ! | T.ADD(64,e,x as T.LABEL _) => mark(I.LDA{r=d,b=expr e,d=I.LABop x},an) ! | T.ADD(64,x as T.CONST _,e) => mark(I.LDA{r=d,b=expr e,d=I.LABop x},an) ! | T.ADD(64,x as T.LABEL _,e) => mark(I.LDA{r=d,b=expr e,d=I.LABop x},an) | T.ADD(64,e,T.LI i) => loadImmed(i, expr e, d, an) | T.ADD(64,T.LI i,e) => loadImmed(i, expr e, d, an) *************** *** 1068,1073 **** | T.SX(_,_,T.LOAD(16,ea,mem))=> load16s(ea,d,mem,an) | T.SX(_,_,T.LOAD(32,ea,mem))=> load32s(ea,d,mem,an) ! | T.ZX((8|16|32|64),_,T.LOAD(8,ea,mem)) => load8(ea,d,mem,an) ! | T.ZX((16|32|64),_,T.LOAD(16,ea,mem))=> load16(ea,d,mem,an) | T.ZX(64,_,T.LOAD(64,ea,mem)) => load(I.LDQ,ea,d,mem,an) | T.LOAD(8,ea,mem) => load8(ea,d,mem,an) --- 1262,1272 ---- | T.SX(_,_,T.LOAD(16,ea,mem))=> load16s(ea,d,mem,an) | T.SX(_,_,T.LOAD(32,ea,mem))=> load32s(ea,d,mem,an) ! | T.ZX(8,_,T.LOAD(8,ea,mem)) => load8(ea,d,mem,an) ! | T.ZX(16,_,T.LOAD(8,ea,mem)) => load8(ea,d,mem,an) ! | T.ZX(32,_,T.LOAD(8,ea,mem)) => load8(ea,d,mem,an) ! | T.ZX(64,_,T.LOAD(8,ea,mem)) => load8(ea,d,mem,an) ! | T.ZX(16,_,T.LOAD(16,ea,mem))=> load16(ea,d,mem,an) ! | T.ZX(32,_,T.LOAD(16,ea,mem))=> load16(ea,d,mem,an) ! | T.ZX(64,_,T.LOAD(16,ea,mem))=> load16(ea,d,mem,an) | T.ZX(64,_,T.LOAD(64,ea,mem)) => load(I.LDQ,ea,d,mem,an) | T.LOAD(8,ea,mem) => load8(ea,d,mem,an) *************** *** 1392,1397 **** (* move the immed operand to b *) case a of ! (T.LI _ | T.CONST _ | T.LABEL _ | T.LABEXP _) => ! (T.Basis.swapCond cond,b,a) | _ => (cond,a,b) --- 1591,1598 ---- (* move the immed operand to b *) case a of ! T.LI _ => (T.Basis.swapCond cond,b,a) ! | T.CONST _ => (T.Basis.swapCond cond,b,a) ! | T.LABEL _ => (T.Basis.swapCond cond,b,a) ! | T.LABEXP _ => (T.Basis.swapCond cond,b,a) | _ => (cond,a,b) *************** *** 1456,1461 **** val (cond,e1,e2) = case e1 of ! (T.LI _ | T.CONST _ | T.LABEL _ | T.LABEXP _) => ! (T.Basis.swapCond cond,e2,e1) | _ => (cond,e1,e2) in case cond of --- 1657,1664 ---- val (cond,e1,e2) = case e1 of ! T.LI _ => (T.Basis.swapCond cond,e2,e1) ! | T.CONST _ => (T.Basis.swapCond cond,e2,e1) ! | T.LABEL _ => (T.Basis.swapCond cond,e2,e1) ! | T.LABEXP _ => (T.Basis.swapCond cond,e2,e1) | _ => (cond,e1,e2) in case cond of diff -N -C 2 -r MLRISC/alpha/mltree/alphaPseudoInstr.sig MLRISC-mlton/alpha/mltree/alphaPseudoInstr.sig *** MLRISC/alpha/mltree/alphaPseudoInstr.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/alpha/mltree/alphaPseudoInstr.sig 2009-10-02 09:51:35.000000000 -0400 *************** *** 5,12 **** structure I : ALPHAINSTR structure T : MLTREE structure C : ALPHACELLS ! sharing C = I.C ! sharing I.T = T ! structure CB: CELLS_BASIS = CellsBasis type reduceOpnd = I.operand -> CB.cell --- 5,41 ---- structure I : ALPHAINSTR structure T : MLTREE + where type Basis.cond = I.T.Basis.cond + and type Basis.div_rounding_mode = I.T.Basis.div_rounding_mode + and type Basis.ext = I.T.Basis.ext + and type Basis.fcond = I.T.Basis.fcond + and type Basis.rounding_mode = I.T.Basis.rounding_mode + and type Constant.const = I.T.Constant.const + and type ('s,'r,'f,'c) Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx + and type ('s,'r,'f,'c) Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx + and type ('s,'r,'f,'c) Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx + and type ('s,'r,'f,'c) Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx + and type I.div_rounding_mode = I.T.I.div_rounding_mode + and type Region.region = I.T.Region.region + and type ccexp = I.T.ccexp + and type fexp = I.T.fexp + (* and type labexp = I.T.labexp *) + and type mlrisc = I.T.mlrisc + and type oper = I.T.oper + and type rep = I.T.rep + and type rexp = I.T.rexp + and type stm = I.T.stm structure C : ALPHACELLS ! (* sharing C = I.C *) ! (* sharing I.T = T *) ! structure CB: CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo type reduceOpnd = I.operand -> CB.cell diff -N -C 2 -r MLRISC/amd64/amd64.mdl MLRISC-mlton/amd64/amd64.mdl *** MLRISC/amd64/amd64.mdl 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/amd64.mdl 2009-10-02 09:51:25.000000000 -0400 *************** *** 578,582 **** let val n = size fbinOp in case Char.toLower(String.sub(fbinOp,n-1)) of ! (#"s" | #"l") => String.substring(fbinOp,0,n-1) | _ => fbinOp end --- 578,583 ---- let val n = size fbinOp in case Char.toLower(String.sub(fbinOp,n-1)) of ! (#"s") => String.substring(fbinOp,0,n-1) ! | (#"l") => String.substring(fbinOp,0,n-1) | _ => fbinOp end *************** *** 710,717 **** asm: (case (src,binOp) of (I.Direct _, (* tricky business here for shifts *) ! (I.SARQ | I.SHRQ | I.SHLQ | ! I.SARL | I.SHRL | I.SHLL | ! I.SARW | I.SHRW | I.SHLW | ! I.SARB | I.SHRB | I.SHLB)) => ``\t%cl, '' | _ => ``\t, '' ) --- 711,737 ---- asm: (case (src,binOp) of (I.Direct _, (* tricky business here for shifts *) ! I.SARQ) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHRQ) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHLQ) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SARL) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHRL) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHLL) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SARW) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHRW) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHLW) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SARB) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHRB) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHLB) => ``\t%cl, '' | _ => ``\t, '' ) diff -N -C 2 -r MLRISC/amd64/amd64MC.sml MLRISC-mlton/amd64/amd64MC.sml *** MLRISC/amd64/amd64MC.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/amd64MC.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 1,7 **** functor AMD64MCEmitter (structure Instr : AMD64INSTR ! structure Shuffle : AMD64SHUFFLE where I = Instr ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T ! structure AsmEmitter : INSTRUCTION_EMITTER where I = Instr) : MC_EMIT = struct structure I = Instr --- 1,68 ---- functor AMD64MCEmitter (structure Instr : AMD64INSTR ! structure Shuffle : AMD64SHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fbin_op = Instr.fbin_op ! and type I.fcom_op = Instr.fcom_op ! and type I.fmove_op = Instr.fmove_op ! and type I.fsize = Instr.fsize ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ! structure AsmEmitter : INSTRUCTION_EMITTER (* where I = Instr *) ! where type I.addressing_mode = Instr.addressing_mode ! and type I.ea = Instr.ea ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.operand = Instr.operand) : MC_EMIT = struct structure I = Instr *************** *** 328,332 **** | I.SARQ => shift(64, 7, src) | I.SHRQ => shift(64, 5, src) ! | (I.IMULL | I.MULQ) => let val sz = if binOp = I.IMULQ then 64 else 32 in (case (src, dst) --- 389,407 ---- | I.SARQ => shift(64, 7, src) | I.SHRQ => shift(64, 5, src) ! | (I.IMULL) => ! let val sz = if binOp = I.IMULQ then 64 else 32 ! in (case (src, dst) ! of (I.Immed(i), I.Direct (_, dstR)) => ! (case size i ! of Bits32 => ! encodeLongImm sz (0wx69, reg (rNum dstR), dst, i) ! | _ => encodeByteImm sz (0wx6b, reg (rNum dstR), dst, i) ! (* esac *)) ! | (_, I.Direct (_, dstR)) => ! eBytes (encode32' ([0wx0f, 0wxaf], reg (rNum dstR), src)) ! | _ => error "imul" ! (* esac *)) ! end ! | (I.MULQ) => let val sz = if binOp = I.IMULQ then 64 else 32 in (case (src, dst) *************** *** 380,396 **** | I.CDQ => eByte(0x99) | I.SAHF => eByte(0x9e) ! | ( I.PUSHL (I.Immed i) | I.PUSHQ (I.Immed i) )=> (case size i of Bits32 => eBytes(0wx68 :: eLong(i)) | _ => eBytes [0wx6a, toWord8 i] (* esac *)) ! | ( I.PUSHL (I.Direct (_, r)) | ! I.PUSHQ (I.Direct (_, r)) ) => eByte (0x50+rNum r) ! | ( I.PUSHL opnd | I.PUSHQ opnd ) => encode32 (0wxff, opcode 6, opnd) | I.POP (I.Direct (_, r)) => eByte (0x58+rNum r) | I.POP opnd => encode32 (0wx8f, opcode 0, opnd) | I.LEAL{r32, addr} => encodeReg32(0wx8d, r32, addr) | I.LEAQ{r64, addr} => encodeReg64(0wx8d, r64, addr) ! | I.MOVE{mvOp=mvOp as (I.MOVL | I.MOVQ), src, dst} => let val sz = case mvOp of I.MOVL => 32 | I.MOVQ => 64 fun mv(I.Immed(i), I.Direct (_, r)) = --- 455,486 ---- | I.CDQ => eByte(0x99) | I.SAHF => eByte(0x9e) ! | ( I.PUSHL (I.Immed i) )=> (case size i of Bits32 => eBytes(0wx68 :: eLong(i)) | _ => eBytes [0wx6a, toWord8 i] (* esac *)) ! | ( I.PUSHQ (I.Immed i) )=> ! (case size i ! of Bits32 => eBytes(0wx68 :: eLong(i)) ! | _ => eBytes [0wx6a, toWord8 i] ! (* esac *)) ! | ( I.PUSHL (I.Direct (_, r)) ) => eByte (0x50+rNum r) ! | ( I.PUSHQ (I.Direct (_, r)) ) => eByte (0x50+rNum r) ! | ( I.PUSHL opnd ) => encode32 (0wxff, opcode 6, opnd) ! | ( I.PUSHQ opnd ) => encode32 (0wxff, opcode 6, opnd) | I.POP (I.Direct (_, r)) => eByte (0x58+rNum r) | I.POP opnd => encode32 (0wx8f, opcode 0, opnd) | I.LEAL{r32, addr} => encodeReg32(0wx8d, r32, addr) | I.LEAQ{r64, addr} => encodeReg64(0wx8d, r64, addr) ! | I.MOVE{mvOp=mvOp as (I.MOVL), src, dst} => ! let val sz = case mvOp of I.MOVL => 32 | I.MOVQ => 64 ! fun mv(I.Immed(i), I.Direct (_, r)) = ! eBytes(Word8.+(0wxb8, Word8.fromInt(rNum r))::eLong(i)) ! | mv(I.Immed(i), _) = encodeLongImm sz (0wxc7, opcode 0, dst, i) ! | mv(I.ImmedLabel le,dst) = mv(I.Immed(lexp le),dst) ! | mv(I.LabelEA le,dst) = error "MOVL: LabelEA" ! | mv(src,dst) = arith(sz, 0wx88, opcode 0) (src, dst) ! in mv(src,dst) end ! | I.MOVE{mvOp=mvOp as (I.MOVQ), src, dst} => let val sz = case mvOp of I.MOVL => 32 | I.MOVQ => 64 fun mv(I.Immed(i), I.Direct (_, r)) = *************** *** 449,453 **** | I.CMPL{lsrc, rsrc} => arith(32, 0wx38, opcode 7) (rsrc, lsrc) | I.CMPQ{lsrc, rsrc} => arith(64, 0wx38, opcode 7) (rsrc, lsrc) ! | (I.CMPW _ | I.CMPB _) => error "CMP" | I.TESTQ{lsrc, rsrc} => test(64, rsrc, lsrc) | I.TESTL{lsrc, rsrc} => test(32, rsrc, lsrc) --- 539,544 ---- | I.CMPL{lsrc, rsrc} => arith(32, 0wx38, opcode 7) (rsrc, lsrc) | I.CMPQ{lsrc, rsrc} => arith(64, 0wx38, opcode 7) (rsrc, lsrc) ! | (I.CMPW _) => error "CMP" ! | (I.CMPB _) => error "CMP" | I.TESTQ{lsrc, rsrc} => test(64, rsrc, lsrc) | I.TESTL{lsrc, rsrc} => test(32, rsrc, lsrc) diff -N -C 2 -r MLRISC/amd64/amd64MCFn.sml MLRISC-mlton/amd64/amd64MCFn.sml *** MLRISC/amd64/amd64MCFn.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/amd64MCFn.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 6,11 **** functor AMD64MCFn( structure Instr : AMD64INSTR ! structure Shuffle : AMD64SHUFFLE where I = Instr ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T (* structure AsmEmitter : INSTRUCTION_EMITTER where I = Instr*) ) : MC_EMIT = --- 6,64 ---- functor AMD64MCFn( structure Instr : AMD64INSTR ! structure Shuffle : AMD64SHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fsize = Instr.fsize ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm (* structure AsmEmitter : INSTRUCTION_EMITTER where I = Instr*) ) : MC_EMIT = diff -N -C 2 -r MLRISC/amd64/backpatch/amd64Jumps.sml MLRISC-mlton/amd64/backpatch/amd64Jumps.sml *** MLRISC/amd64/backpatch/amd64Jumps.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/backpatch/amd64Jumps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,12 **** functor AMD64Jumps (structure Instr : AMD64INSTR ! structure Eval : MLTREE_EVAL where T = Instr.T ! structure Shuffle : AMD64SHUFFLE where I = Instr ! structure MCEmitter : MC_EMIT where I = Instr) : SDI_JUMPS = struct structure I = Instr --- 6,74 ---- functor AMD64Jumps (structure Instr : AMD64INSTR ! structure Eval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ! structure Shuffle : AMD64SHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fbin_op = Instr.fbin_op ! and type I.fcom_op = Instr.fcom_op ! and type I.fmove_op = Instr.fmove_op ! and type I.fsize = Instr.fsize ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp ! structure MCEmitter : MC_EMIT (* where I = Instr *) ! where type I.addressing_mode = Instr.addressing_mode ! and type I.ea = Instr.ea ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.operand = Instr.operand ! ) : SDI_JUMPS = struct structure I = Instr *************** *** 40,47 **** | I.MOVE{src, dst, ...} => operand src orelse operand dst | I.LEAL{addr, ...} => operand addr ! | I.LEAQ{addr, ...} => operand addr ! | ( I.CMPQ arg | I.CMPL arg | I.CMPW arg | I.CMPB arg ! | I.TESTQ arg | I.TESTL arg | I.TESTW arg | I.TESTB arg) => cmptest arg ! | I.MULTDIV{src, ...} => operand src | I.MUL3{src1, ...} => operand src1 | I.MULQ3{src1, ...} => operand src1 --- 102,115 ---- | I.MOVE{src, dst, ...} => operand src orelse operand dst | I.LEAL{addr, ...} => operand addr ! | I.LEAQ{addr, ...} => operand addr ! | ( I.CMPQ arg ) => cmptest arg ! | ( I.CMPL arg ) => cmptest arg ! | ( I.CMPW arg ) => cmptest arg ! | ( I.CMPB arg ) => cmptest arg ! | ( I.TESTQ arg ) => cmptest arg ! | ( I.TESTL arg ) => cmptest arg ! | ( I.TESTW arg ) => cmptest arg ! | ( I.TESTB arg ) => cmptest arg ! | I.MULTDIV{src, ...} => operand src | I.MUL3{src1, ...} => operand src1 | I.MULQ3{src1, ...} => operand src1 *************** *** 49,53 **** | I.SET{opnd, ...} => operand opnd | I.CMOV{src, dst, ...} => operand src ! | (I.PUSHQ opnd | I.PUSHL opnd | I.PUSHW opnd | I.PUSHB opnd) => operand opnd | I.POP opnd => operand opnd | _ => false --- 117,124 ---- | I.SET{opnd, ...} => operand opnd | I.CMOV{src, dst, ...} => operand src ! | (I.PUSHQ opnd) => operand opnd ! | (I.PUSHL opnd) => operand opnd ! | (I.PUSHW opnd) => operand opnd ! | (I.PUSHB opnd) => operand opnd | I.POP opnd => operand opnd | _ => false diff -N -C 2 -r MLRISC/amd64/emit/amd64Asm.sml MLRISC-mlton/amd64/emit/amd64Asm.sml *** MLRISC/amd64/emit/amd64Asm.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/emit/amd64Asm.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,16 **** functor AMD64AsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : AMD64INSTR ! where T = S.P.T ! structure Shuffle : AMD64SHUFFLE ! where I = Instr ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T ) : INSTRUCTION_EMITTER = struct --- 7,89 ---- functor AMD64AsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : AMD64INSTR (* where T = S.P.T *) ! where type T.Basis.cond = S.P.T.Basis.cond ! and type T.Basis.div_rounding_mode = S.P.T.Basis.div_rounding_mode ! and type T.Basis.ext = S.P.T.Basis.ext ! and type T.Basis.fcond = S.P.T.Basis.fcond ! and type T.Basis.rounding_mode = S.P.T.Basis.rounding_mode ! and type T.Constant.const = S.P.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) S.P.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) S.P.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) S.P.T.Extension.sx ! and type T.I.div_rounding_mode = S.P.T.I.div_rounding_mode ! and type T.Region.region = S.P.T.Region.region ! and type T.ccexp = S.P.T.ccexp ! and type T.fexp = S.P.T.fexp ! (* and type T.labexp = S.P.T.labexp *) ! and type T.mlrisc = S.P.T.mlrisc ! and type T.oper = S.P.T.oper ! and type T.rep = S.P.T.rep ! and type T.rexp = S.P.T.rexp ! and type T.stm = S.P.T.stm ! structure Shuffle : AMD64SHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fbin_op = Instr.fbin_op ! and type I.fcom_op = Instr.fcom_op ! and type I.fmove_op = Instr.fmove_op ! and type I.fsize = Instr.fsize ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : INSTRUCTION_EMITTER = struct *************** *** 373,377 **** in (case Char.toLower (String.sub (fbinOp, n - 1)) of ! (#"s" | #"l") => String.substring (fbinOp, 0, n - 1) | _ => fbinOp ) --- 446,451 ---- in (case Char.toLower (String.sub (fbinOp, n - 1)) of ! (#"s") => String.substring (fbinOp, 0, n - 1) ! | (#"l") => String.substring (fbinOp, 0, n - 1) | _ => fbinOp ) *************** *** 514,529 **** (case (src, binOp) of (I.Direct _, ! ( I.SARQ | ! I.SHRQ | ! I.SHLQ | ! I.SARL | ! I.SHRL | ! I.SHLL | ! I.SARW | ! I.SHRW | ! I.SHLW | ! I.SARB | ! I.SHRB | ! I.SHLB )) => ( emit_binaryOp binOp; emit "\t%cl, "; --- 588,647 ---- (case (src, binOp) of (I.Direct _, ! ( I.SARQ )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SHRQ )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SHLQ )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SARL )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SHRL )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SHLL )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SARW )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SHRW )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SHLW )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SARB )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SHRB )) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, ! ( I.SHLB )) => ( emit_binaryOp binOp; emit "\t%cl, "; diff -N -C 2 -r MLRISC/amd64/flowgraph/amd64-darwin-pseudo-ops.sml MLRISC-mlton/amd64/flowgraph/amd64-darwin-pseudo-ops.sml *** MLRISC/amd64/flowgraph/amd64-darwin-pseudo-ops.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/flowgraph/amd64-darwin-pseudo-ops.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 8,12 **** structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ) : PSEUDO_OPS_BASIS = struct --- 8,32 ---- structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ) : PSEUDO_OPS_BASIS = struct diff -N -C 2 -r MLRISC/amd64/flowgraph/amd64GasPseudoOps.sml MLRISC-mlton/amd64/flowgraph/amd64GasPseudoOps.sml *** MLRISC/amd64/flowgraph/amd64GasPseudoOps.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/flowgraph/amd64GasPseudoOps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,11 **** functor AMD64GasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ) : PSEUDO_OPS_BASIS = struct structure T = T --- 7,31 ---- functor AMD64GasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ) : PSEUDO_OPS_BASIS = struct structure T = T diff -N -C 2 -r MLRISC/amd64/instructions/amd64CompInstrExt.sml MLRISC-mlton/amd64/instructions/amd64CompInstrExt.sml *** MLRISC/amd64/instructions/amd64CompInstrExt.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/instructions/amd64CompInstrExt.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 8,16 **** signature AMD64COMP_INSTR_EXT = sig structure I : AMD64INSTR ! structure TS : MLTREE_STREAM ! where T = I.T ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = TS.S.P type reducer = --- 8,59 ---- signature AMD64COMP_INSTR_EXT = sig structure I : AMD64INSTR ! structure TS : MLTREE_STREAM (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and P = TS.S.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm type reducer = *************** *** 27,35 **** functor AMD64CompInstrExt ( structure I : AMD64INSTR ! structure TS : MLTREE_STREAM ! where T = I.T ! structure CFG : CONTROL_FLOW_GRAPH ! where P = TS.S.P ! and I = I ) : AMD64COMP_INSTR_EXT = struct --- 70,121 ---- functor AMD64CompInstrExt ( structure I : AMD64INSTR ! structure TS : MLTREE_STREAM (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure CFG : CONTROL_FLOW_GRAPH (* where P = TS.S.P and I = I *) ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ) : AMD64COMP_INSTR_EXT = struct diff -N -C 2 -r MLRISC/amd64/instructions/amd64Instr.sml MLRISC-mlton/amd64/instructions/amd64Instr.sml *** MLRISC/amd64/instructions/amd64Instr.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/instructions/amd64Instr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 9,13 **** sig structure C : AMD64CELLS ! structure CB : CELLS_BASIS = CellsBasis structure T : MLTREE structure Constant: CONSTANT --- 9,22 ---- sig structure C : AMD64CELLS ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo structure T : MLTREE structure Constant: CONSTANT diff -N -C 2 -r MLRISC/amd64/instructions/amd64Peephole.peep MLRISC-mlton/amd64/instructions/amd64Peephole.peep *** MLRISC/amd64/instructions/amd64Peephole.peep 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/instructions/amd64Peephole.peep 2009-10-02 09:51:35.000000000 -0400 *************** *** 21,25 **** (structure Instr : AMD64INSTR structure Eval : MLTREE_EVAL ! sharing Instr.T = Eval.T ) : PEEPHOLE = struct --- 21,45 ---- (structure Instr : AMD64INSTR structure Eval : MLTREE_EVAL ! (* sharing Instr.T = Eval.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : PEEPHOLE = struct diff -N -C 2 -r MLRISC/amd64/instructions/amd64Peephole.sml MLRISC-mlton/amd64/instructions/amd64Peephole.sml *** MLRISC/amd64/instructions/amd64Peephole.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/instructions/amd64Peephole.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 13,17 **** (*#line 23.7 "amd64Peephole.peep"*) ! sharing Instr.T = Eval.T ): PEEPHOLE = struct --- 13,37 ---- (*#line 23.7 "amd64Peephole.peep"*) ! (* sharing Instr.T = Eval.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ): PEEPHOLE = struct diff -N -C 2 -r MLRISC/amd64/instructions/amd64Props.sml MLRISC-mlton/amd64/instructions/amd64Props.sml *** MLRISC/amd64/instructions/amd64Props.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/instructions/amd64Props.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 16,23 **** functor AMD64Props ( structure Instr : AMD64INSTR ! structure MLTreeHash : MLTREE_HASH ! where T = Instr.T ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T ) : AMD64INSN_PROPERTIES = struct --- 16,61 ---- functor AMD64Props ( structure Instr : AMD64INSTR ! structure MLTreeHash : MLTREE_HASH (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : AMD64INSN_PROPERTIES = struct *************** *** 40,47 **** | instrKind (I.INSTR instr) = (case instr of I.NOP => IK_NOP ! | ( I.CALL {cutsTo=_::_, ...} | I.CALLQ {cutsTo=_::_, ...} ) => IK_CALL_WITH_CUTS ! | ( I.JMP _ | I.JCC _ | I.RET _ | I.INTO ) => IK_JUMP ! | ( I.CALL _ | I. CALLQ _ ) => IK_CALL | I.PHI {} => IK_PHI | I.SOURCE {} => IK_SOURCE --- 78,91 ---- | instrKind (I.INSTR instr) = (case instr of I.NOP => IK_NOP ! | ( I.CALL {cutsTo=_::_, ...} ) => IK_CALL_WITH_CUTS ! | ( I.CALLQ {cutsTo=_::_, ...} ) => ! IK_CALL_WITH_CUTS ! | ( I.JMP _ ) => IK_JUMP ! | ( I.JCC _ ) => IK_JUMP ! | ( I.RET _ ) => IK_JUMP ! | ( I.INTO) => IK_JUMP ! | ( I.CALL _ ) => IK_CALL ! | ( I.CALLQ _ ) => IK_CALL | I.PHI {} => IK_PHI | I.SOURCE {} => IK_SOURCE *************** *** 56,61 **** fun moveTmpR (I.ANNOTATION {i, ...}) = moveTmpR i ! | moveTmpR ( I.COPY {k=CB.GP, tmp=SOME (I.Direct (_, r)), ...} ! | I.COPY {k=CB.FP, tmp=SOME (I.FDirect r), ...} ) = SOME r | moveTmpR _ = NONE --- 100,106 ---- fun moveTmpR (I.ANNOTATION {i, ...}) = moveTmpR i ! | moveTmpR ( I.COPY {k=CB.GP, tmp=SOME (I.Direct (_, r)), ...} ) = ! SOME r ! | moveTmpR ( I.COPY {k=CB.FP, tmp=SOME (I.FDirect r), ...} ) = SOME r | moveTmpR _ = NONE *************** *** 177,183 **** in case multDivOp ! of (I.IDIVL1 | I.DIVL1 | I.IDIVQ1 | I.DIVQ1) => (raxPair, C.rdx::C.rax::uses) ! | (I.IMULL1 | I.MULL1 | I.IMULQ1 | I.MULQ1) => (raxPair, C.rax::uses) (* end case *) --- 222,240 ---- in case multDivOp ! of (I.IDIVL1) => ! (raxPair, C.rdx::C.rax::uses) ! | (I.DIVL1) => ! (raxPair, C.rdx::C.rax::uses) ! | (I.IDIVQ1) => ! (raxPair, C.rdx::C.rax::uses) ! | (I.DIVQ1) => (raxPair, C.rdx::C.rax::uses) ! | (I.IMULL1) => ! (raxPair, C.rax::uses) ! | (I.MULL1) => ! (raxPair, C.rax::uses) ! | (I.IMULQ1) => ! (raxPair, C.rax::uses) ! | (I.MULQ1) => (raxPair, C.rax::uses) (* end case *) *************** *** 186,199 **** fun push opnd = ([C.stackptrR], operandAcc (opnd, [C.stackptrR])) fun f i = (case i ! of ( I.JMP (opnd, _) | I.JCC {opnd, ...} ) => ([], operandUse opnd) ! | ( I.CALL {opnd, defs, uses, ...} | ! I.CALLQ {opnd, defs, uses, ...} )=> (C.getReg defs, operandAcc (opnd, C.getReg uses)) | I.MOVE {src, dst=I.Direct (_, r), ...} => ([r], operandUse src) | I.MOVE {src, dst, ...} => ([], operandAcc (dst, operandUse src)) ! | ( I.LEAL {r32=r, addr} | I.LEAQ {r64=r, addr} ) => ([r], operandUse addr) ! | ( I.CMPQ arg | I.CMPL arg | I.CMPW arg | I.CMPB arg ! | I.TESTQ arg | I.TESTL arg | I.TESTW arg | I.TESTB arg ) => cmpTest arg | I.BITOP{lsrc, rsrc, ...} => cmpTest {lsrc=lsrc,rsrc=rsrc} --- 243,273 ---- fun push opnd = ([C.stackptrR], operandAcc (opnd, [C.stackptrR])) fun f i = (case i ! of ( I.JMP (opnd, _) ) => ([], operandUse opnd) ! | ( I.JCC {opnd, ...} ) => ([], operandUse opnd) ! | ( I.CALL {opnd, defs, uses, ...} )=> ! (C.getReg defs, operandAcc (opnd, C.getReg uses)) ! | ( I.CALLQ {opnd, defs, uses, ...} )=> (C.getReg defs, operandAcc (opnd, C.getReg uses)) | I.MOVE {src, dst=I.Direct (_, r), ...} => ([r], operandUse src) | I.MOVE {src, dst, ...} => ([], operandAcc (dst, operandUse src)) ! | ( I.LEAL {r32=r, addr} ) => ! ([r], operandUse addr) ! | ( I.LEAQ {r64=r, addr} ) => ([r], operandUse addr) ! | ( I.CMPQ arg ) => ! cmpTest arg ! | ( I.CMPL arg ) => ! cmpTest arg ! | ( I.CMPW arg ) => ! cmpTest arg ! | ( I.CMPB arg ) => ! cmpTest arg ! | ( I.TESTQ arg ) => ! cmpTest arg ! | ( I.TESTL arg ) => ! cmpTest arg ! | ( I.TESTW arg ) => ! cmpTest arg ! | ( I.TESTB arg ) => cmpTest arg | I.BITOP{lsrc, rsrc, ...} => cmpTest {lsrc=lsrc,rsrc=rsrc} *************** *** 215,226 **** | I.XCHG {src, dst, ...} => (operandDef dst, operandAcc (src, operandUse dst)) ! | ( I.ENTER _ | I.LEAVE ) => ([C.rsp, C.rbp], [C.rsp, C.rbp]) | I.MULTDIV arg => multDiv arg ! | ( I.MUL3 {src1, dst, ...} | I.MULQ3 {src1, dst, ...} ) => ([dst], operandUse src1) ! | ( I.UNARY{opnd, ...} | I.SET {opnd, ...} ) => unary opnd ! | (I.PUSHQ arg | I.PUSHL arg | I.PUSHW arg | I.PUSHB arg ) => push arg | I.POP arg => (C.stackptrR::operandDef arg, [C.stackptrR]) ! | ( I.PUSHFD | I.POPFD )=> rspOnly () | I.CDQ => ([C.rdx], [C.rax]) | I.FMOVE {dst, src, ...} => ([], operandAcc (dst, operandUse src)) --- 289,308 ---- | I.XCHG {src, dst, ...} => (operandDef dst, operandAcc (src, operandUse dst)) ! | ( I.ENTER _ ) => ([C.rsp, C.rbp], [C.rsp, C.rbp]) ! | ( I.LEAVE ) => ([C.rsp, C.rbp], [C.rsp, C.rbp]) | I.MULTDIV arg => multDiv arg ! | ( I.MUL3 {src1, dst, ...} ) => ! ([dst], operandUse src1) ! | ( I.MULQ3 {src1, dst, ...} ) => ([dst], operandUse src1) ! | ( I.UNARY{opnd, ...} ) => unary opnd ! | ( I.SET {opnd, ...} ) => unary opnd ! | ( I.PUSHQ arg ) => push arg ! | ( I.PUSHL arg ) => push arg ! | ( I.PUSHW arg ) => push arg ! | ( I.PUSHB arg ) => push arg | I.POP arg => (C.stackptrR::operandDef arg, [C.stackptrR]) ! | ( I.POPFD )=> rspOnly () ! | ( I.POPFD )=> rspOnly () | I.CDQ => ([C.rdx], [C.rax]) | I.FMOVE {dst, src, ...} => ([], operandAcc (dst, operandUse src)) *************** *** 258,264 **** | I.FBINOP {dst, src, ...} => ([dst], dst :: operand src) | I.FCOM {dst, src, ...} => ([], operandAcc (src, [dst])) ! | ( I.FSQRTS {dst, src} | I.FSQRTD {dst, src} )=> (operand dst, operand src) ! | ( I.CALL {defs, uses, ...} | I.CALLQ {defs, uses, ...} ) => (C.getFreg defs, C.getFreg uses) | _ => ([], []) --- 340,350 ---- | I.FBINOP {dst, src, ...} => ([dst], dst :: operand src) | I.FCOM {dst, src, ...} => ([], operandAcc (src, [dst])) ! | ( I.FSQRTS {dst, src} )=> (operand dst, operand src) ! | ( I.FSQRTD {dst, src} )=> ! (operand dst, operand src) ! | ( I.CALL {defs, uses, ...} ) => ! (C.getFreg defs, C.getFreg uses) ! | ( I.CALLQ {defs, uses, ...} ) => (C.getFreg defs, C.getFreg uses) | _ => ([], []) *************** *** 310,357 **** | I.MOVE {mvOp, ...} => (case mvOp ! of ( I.MOVQ | I.MOVSWQ | I.MOVZWQ | I.MOVSBQ | ! I.MOVZBQ | I.MOVSLQ | ! I.CVTSD2SIQ | I.CVTSS2SIQ ! ) => 64 ! | ( I.MOVL | I.MOVSWL | I.MOVZWL | I.MOVSBL | ! I.CVTSD2SI | I.CVTSS2SI | ! I.MOVZBL ) => 32 | I.MOVW => 16 | I.MOVB => 8 (* esac *)) ! | ( I.CALL _ | I.LEAL _ | I.CMPL _ | I.TESTL _ | I.MUL3 _ ) ! => 32 ! | ( I.CALLQ _ | I.LEAQ _ | I.CMPQ _ | I.TESTQ _ | I.MULQ3 _ | I.CMOV _) ! => 64 ! | ( I.CMPW _ | I.TESTW _ ) => 16 ! | ( I.CMPB _ | I.TESTB _ ) => 8 | I.SHIFT {shiftOp, ...} => (case shiftOp ! of ( I.SHLDL | I.SHRDL ) => 32 (* esac *)) | I.UNARY {unOp, ...} => (case unOp ! of ( I.DECQ | I.INCQ | I.NEGQ | I.NOTQ | ! I.LOCK_DECQ | I.LOCK_INCQ | I.LOCK_NEGQ | I.LOCK_NOTQ ) => 64 ! | ( I.DECL | I.INCL | I.NEGL | I.NOTL ) => 32 ! | ( I.DECW | I.INCW | I.NEGW | I.NOTW ) => 16 ! | ( I.DECB | I.INCB | I.NEGB | I.NOTB ) => 8 (* esac *)) | I.MULTDIV {multDivOp, ...} => (case multDivOp ! of ( I.IMULL1 | I.MULL1 | I.IDIVL1 | I.DIVL1 ) => 32 ! | ( I.IMULQ1 | I.MULQ1 | I.IDIVQ1 | I.DIVQ1 ) => 64 (* esac *)) | I.BINARY {binOp, ...} => (case binOp ! of ( I.ADDQ | I.SUBQ | I.ANDQ | I.ORQ | I.XORQ | I.SHLQ | I.SARQ ! | I.SHRQ | I.MULQ | I.IMULQ | I.ADCQ | I.SBBQ ) => 64 ! | ( I.ADDL | I.SUBL | I.ANDL | I.ORL | I.XORL | I.SHLL | I.SARL ! | I.SHRL | I.MULL | I.IMULL | I.ADCL | I.SBBL | I.BTSL | I.BTCL ! | I.BTRL | I.ROLL | I.RORL | I.XCHGL ) => 32 ! | ( I.ADDW | I.SUBW | I.ANDW | I.ORW | I.XORW | I.SHLW | I.SARW ! | I.SHRW | I.MULW | I.IMULW | I.BTSW | I.BTCW | I.BTRW | I.ROLW ! | I.RORW | I.XCHGW ) => 16 ! | ( I.ADDB | I.SUBB | I.ANDB | I.ORB | I.XORB | I.SHLB | I.SARB ! | I.SHRB | I.MULB | I.IMULB | I.XCHGB ) => 8 | _ => raise Fail "" (* 64*) (* esac *)) --- 396,529 ---- | I.MOVE {mvOp, ...} => (case mvOp ! of ( I.MOVQ ) => 64 ! | ( I.MOVSWQ ) => 64 ! | ( I.MOVZWQ ) => 64 ! | ( I.MOVSBQ ) => 64 ! | ( I.MOVZBQ ) => 64 ! | ( I.MOVSLQ ) => 64 ! | ( I.CVTSD2SIQ ) => 64 ! | ( I.CVTSS2SIQ ) => 64 ! | ( I.MOVL ) => 32 ! | ( I.MOVSWL ) => 32 ! | ( I.MOVZWL ) => 32 ! | ( I.MOVSBL ) => 32 ! | ( I.CVTSD2SI ) => 32 ! | ( I.CVTSS2SI ) => 32 ! | ( I.MOVZBL ) => 32 | I.MOVW => 16 | I.MOVB => 8 (* esac *)) ! | ( I.CALL _ ) => 32 ! | ( I.LEAL _ ) => 32 ! | ( I.CMPL _ ) => 32 ! | ( I.TESTL _ ) => 32 ! | ( I.MUL3 _ ) => 32 ! | ( I.CALLQ _ ) => 64 ! | ( I.LEAQ _ ) => 64 ! | ( I.CMPQ _ ) => 64 ! | ( I.TESTQ _ ) => 64 ! | ( I.MULQ3 _ ) => 64 ! | ( I.CMOV _ ) => 64 ! | ( I.CMPW _ ) => 16 ! | ( I.TESTW _ ) => 16 ! | ( I.CMPB _ ) => 8 ! | ( I.TESTB _ ) => 8 | I.SHIFT {shiftOp, ...} => (case shiftOp ! of ( I.SHLDL ) => 32 ! | ( I.SHRDL ) => 32 (* esac *)) | I.UNARY {unOp, ...} => (case unOp ! of ( I.DECQ ) => 64 ! | ( I.INCQ ) => 64 ! | ( I.NEGQ ) => 64 ! | ( I.NOTQ ) => 64 ! | ( I.LOCK_DECQ ) => 64 ! | ( I.LOCK_INCQ ) => 64 ! | ( I.LOCK_NEGQ ) => 64 ! | ( I.LOCK_NOTQ ) => 64 ! | ( I.DECL ) => 32 ! | ( I.INCL ) => 32 ! | ( I.NEGL ) => 32 ! | ( I.NOTL ) => 32 ! | ( I.DECW ) => 16 ! | ( I.INCW ) => 16 ! | ( I.NEGW ) => 16 ! | ( I.NOTW ) => 16 ! | ( I.DECB ) => 8 ! | ( I.INCB ) => 8 ! | ( I.NEGB ) => 8 ! | ( I.NOTB ) => 8 (* esac *)) | I.MULTDIV {multDivOp, ...} => (case multDivOp ! of ( I.IMULL1 ) => 32 ! | ( I.MULL1 ) => 32 ! | ( I.IDIVL1 ) => 32 ! | ( I.DIVL1 ) => 32 ! | ( I.IMULQ1 ) => 64 ! | ( I.MULQ1 ) => 64 ! | ( I.IDIVQ1 ) => 64 ! | ( I.DIVQ1 ) => 64 (* esac *)) | I.BINARY {binOp, ...} => (case binOp ! of ( I.ADDQ ) => 64 ! | ( I.SUBQ ) => 64 ! | ( I.ANDQ ) => 64 ! | ( I.ORQ ) => 64 ! | ( I.XORQ ) => 64 ! | ( I.SHLQ ) => 64 ! | ( I.SARQ ) => 64 ! | ( I.SHRQ ) => 64 ! | ( I.MULQ ) => 64 ! | ( I.IMULQ ) => 64 ! | ( I.ADCQ ) => 64 ! | ( I.SBBQ ) => 64 ! | ( I.ADDL ) => 32 ! | ( I.SUBL ) => 32 ! | ( I.ANDL ) => 32 ! | ( I.ORL ) => 32 ! | ( I.XORL ) => 32 ! | ( I.SHLL ) => 32 ! | ( I.SARL ) => 32 ! | ( I.SHRL ) => 32 ! | ( I.MULL ) => 32 ! | ( I.IMULL ) => 32 ! | ( I.ADCL ) => 32 ! | ( I.SBBL ) => 32 ! | ( I.BTSL ) => 32 ! | ( I.BTCL ) => 32 ! | ( I.BTRL ) => 32 ! | ( I.ROLL ) => 32 ! | ( I.RORL ) => 32 ! | ( I.XCHGL ) => 32 ! | ( I.ADDW ) => 16 ! | ( I.SUBW ) => 16 ! | ( I.ANDW ) => 16 ! | ( I.ORW ) => 16 ! | ( I.XORW ) => 16 ! | ( I.SHLW ) => 16 ! | ( I.SARW ) => 16 ! | ( I.SHRW ) => 16 ! | ( I.MULW ) => 16 ! | ( I.IMULW ) => 16 ! | ( I.BTSW ) => 16 ! | ( I.BTCW ) => 16 ! | ( I.BTRW ) => 16 ! | ( I.ROLW ) => 16 ! | ( I.RORW ) => 16 ! | ( I.XCHGW ) => 16 ! | ( I.ADDB ) => 8 ! | ( I.SUBB ) => 8 ! | ( I.ANDB ) => 8 ! | ( I.ORB ) => 8 ! | ( I.XORB ) => 8 ! | ( I.SHLB ) => 8 ! | ( I.SARB ) => 8 ! | ( I.SHRB ) => 8 ! | ( I.MULB ) => 8 ! | ( I.IMULB ) => 8 ! | ( I.XCHGB ) => 8 | _ => raise Fail "" (* 64*) (* esac *)) *************** *** 359,363 **** | I.CMPXCHG {sz, ...} => szToInt sz | I.PAUSE => 64 ! | (I.MFENCE | I.SFENCE | I.LFENCE) => 64 | _ => raise Fail "" (*64*) (* esac *)) --- 531,537 ---- | I.CMPXCHG {sz, ...} => szToInt sz | I.PAUSE => 64 ! | (I.MFENCE) => 64 ! | (I.SFENCE) => 64 ! | (I.LFENCE) => 64 | _ => raise Fail "" (*64*) (* esac *)) *************** *** 365,378 **** fun szOfFinstr instr = (case instr of I.FMOVE {fmvOp, ...} => (case fmvOp ! of ( I.MOVSS | I.CVTSS2SD | I.CVTSI2SS | I.CVTSI2SSQ ) => 32 ! | ( I.MOVSD | I.CVTSD2SS | I.CVTSI2SD | I.CVTSI2SDQ ) => 64 (* end case *)) | I.FCOM {comOp, ...} => (case comOp ! of ( I.COMISS | I.UCOMISS ) => 32 ! | ( I.COMISD | I.UCOMISD ) => 64 (* end case *)) | I.FBINOP {binOp, ...} => (case binOp ! of ( I.ADDSS | I.SUBSS | I.MULSS | I.DIVSS | I.XORPS | I.ANDPS | I.ORPS ) => 32 ! | ( I.ADDSD | I.SUBSD | I.MULSD | I.DIVSD | I.XORPD | I.ANDPD | I.ORPD ) => 64 (* end case *)) | I.FSQRTS _ => 32 --- 539,572 ---- fun szOfFinstr instr = (case instr of I.FMOVE {fmvOp, ...} => (case fmvOp ! of ( I.MOVSS ) => 32 ! | ( I.CVTSS2SD ) => 32 ! | ( I.CVTSI2SS ) => 32 ! | ( I.CVTSI2SSQ ) => 32 ! | ( I.MOVSD ) => 64 ! | ( I.CVTSD2SS ) => 64 ! | ( I.CVTSI2SD ) => 64 ! | ( I.CVTSI2SDQ ) => 64 (* end case *)) | I.FCOM {comOp, ...} => (case comOp ! of ( I.COMISS ) => 32 ! | ( I.UCOMISS ) => 32 ! | ( I.COMISD ) => 64 ! | ( I.UCOMISD ) => 64 (* end case *)) | I.FBINOP {binOp, ...} => (case binOp ! of ( I.ADDSS ) => 32 ! | ( I.SUBSS ) => 32 ! | ( I.MULSS ) => 32 ! | ( I.DIVSS ) => 32 ! | ( I.XORPS ) => 32 ! | ( I.ANDPS ) => 32 ! | ( I.ORPS ) => 32 ! | ( I.ADDSD ) => 64 ! | ( I.SUBSD ) => 64 ! | ( I.MULSD ) => 64 ! | ( I.DIVSD ) => 64 ! | ( I.XORPD ) => 64 ! | ( I.ANDPD ) => 64 ! | ( I.ORPD ) => 64 (* end case *)) | I.FSQRTS _ => 32 diff -N -C 2 -r MLRISC/amd64/mltree/amd64-gen.sml MLRISC-mlton/amd64/mltree/amd64-gen.sml *** MLRISC/amd64/mltree/amd64-gen.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/mltree/amd64-gen.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,13 **** functor AMD64Gen ( structure I : AMD64INSTR ! structure MLTreeUtils : MLTREE_UTILS ! where T = I.T ! structure ExtensionComp : MLTREE_EXTENSION_COMP ! where I = I and T = I.T (* Take a number of bits and returns a label that points to a literal with the high bit set. --- 6,56 ---- functor AMD64Gen ( structure I : AMD64INSTR ! structure MLTreeUtils : MLTREE_UTILS (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure ExtensionComp : MLTREE_EXTENSION_COMP (* where I = I and T = I.T *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm (* Take a number of bits and returns a label that points to a literal with the high bit set. *************** *** 370,374 **** dst end ! | operand _ (x as (T.CONST _ | T.LABEL _)) = loadLabel (I.ImmedLabel x) | operand _ (T.LABEXP le) = loadLabel (I.ImmedLabel le) | operand _ (T.REG(ty,r)) = gpr (ty, r) --- 413,418 ---- dst end ! | operand _ (x as (T.CONST _ )) = loadLabel (I.ImmedLabel x) ! | operand _ (x as (T.LABEL _)) = loadLabel (I.ImmedLabel x) | operand _ (T.LABEXP le) = loadLabel (I.ImmedLabel le) | operand _ (T.REG(ty,r)) = gpr (ty, r) *************** *** 384,388 **** | immedOrReg (ty, opnd) = opnd ! and regOrMem (ty, opnd as (I.Immed _ | I.ImmedLabel _)) = moveToReg (ty, opnd) | regOrMem (ty, opnd) = opnd --- 428,433 ---- | immedOrReg (ty, opnd) = opnd ! and regOrMem (ty, opnd as (I.Immed _)) = moveToReg (ty, opnd) ! | regOrMem (ty, opnd as (I.ImmedLabel _)) = moveToReg (ty, opnd) | regOrMem (ty, opnd) = opnd *************** *** 798,802 **** then move' (ty, I.Immed (toInt32 z), dstOpnd, an) else mark' (move64 (I.Immed64(toInt64 z), dstOpnd), an) ! | (T.CONST _ | T.LABEL _) => move' (ty, I.ImmedLabel e, dstOpnd, an) | T.LABEXP le => move' (ty, I.ImmedLabel le, dstOpnd, an) --- 843,849 ---- then move' (ty, I.Immed (toInt32 z), dstOpnd, an) else mark' (move64 (I.Immed64(toInt64 z), dstOpnd), an) ! | (T.CONST _) => ! move' (ty, I.ImmedLabel e, dstOpnd, an) ! | (T.LABEL _) => move' (ty, I.ImmedLabel e, dstOpnd, an) | T.LABEXP le => move' (ty, I.ImmedLabel le, dstOpnd, an) *************** *** 937,941 **** (* try to move memory operands to src rather than dst if binOp is commutative *) val (a, b) = (case (binOp, a, b) ! of ( (I.ADDSS | I.ADDSD | I.MULSS | I.MULSD | I.XORPS | I.XORPD | I.ANDPS | I.ANDPD | I.ORPS | I.ORPD), T.FLOAD _, T.FREG _) => (b, a) --- 984,1015 ---- (* try to move memory operands to src rather than dst if binOp is commutative *) val (a, b) = (case (binOp, a, b) ! of ( (I.ADDSS), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.ADDSD), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.MULSS), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.MULSD), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.XORPS), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.XORPD), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.ANDPS), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.ANDPD), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.ORPS), ! T.FLOAD _, ! T.FREG _) => (b, a) ! | ( (I.ORPD), T.FLOAD _, T.FREG _) => (b, a) *************** *** 1302,1306 **** * since it doesn't need to write out the result in a register. *) ! and cmpWithZero(cc as (T.EQ | T.NE), e as T.ANDB(ty, a, b), an) = (case ty of 8 => test(ty, I.TESTB, a, b, an) --- 1376,1388 ---- * since it doesn't need to write out the result in a register. *) ! and cmpWithZero(cc as (T.EQ), e as T.ANDB(ty, a, b), an) = ! (case ty ! of 8 => test(ty, I.TESTB, a, b, an) ! | 16 => test(ty, I.TESTW, a, b, an) ! | 32 => test(ty, I.TESTL, a, b, an) ! | 64 => test(ty, I.TESTQ, a, b, an) ! | _ => expr (e, newReg(), an); ! cc) ! | cmpWithZero(cc as (T.NE), e as T.ANDB(ty, a, b), an) = (case ty of 8 => test(ty, I.TESTB, a, b, an) diff -N -C 2 -r MLRISC/amd64/ra/amd64RegAlloc.sml MLRISC-mlton/amd64/ra/amd64RegAlloc.sml *** MLRISC/amd64/ra/amd64RegAlloc.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/ra/amd64RegAlloc.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,19 **** structure I : AMD64INSTR structure SpillHeur : RA_SPILL_HEURISTICS ! structure Props : AMD64INSN_PROPERTIES ! where I = I ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! structure Spill : RA_SPILL ! where I = I ! structure Asm : INSTRUCTION_EMITTER ! where I = I ! and S.P = CFG.P type spill_info --- 7,55 ---- structure I : AMD64INSTR structure SpillHeur : RA_SPILL_HEURISTICS ! structure Props : AMD64INSN_PROPERTIES (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure Spill : RA_SPILL (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure Asm : INSTRUCTION_EMITTER (* where I = I and S.P = CFG.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type S.P.Client.pseudo_op = CFG.P.Client.pseudo_op ! and type S.P.T.Basis.cond = CFG.P.T.Basis.cond ! and type S.P.T.Basis.div_rounding_mode = CFG.P.T.Basis.div_rounding_mode ! and type S.P.T.Basis.ext = CFG.P.T.Basis.ext ! and type S.P.T.Basis.fcond = CFG.P.T.Basis.fcond ! and type S.P.T.Basis.rounding_mode = CFG.P.T.Basis.rounding_mode ! and type S.P.T.Constant.const = CFG.P.T.Constant.const ! and type ('s,'r,'f,'c) S.P.T.Extension.ccx = ('s,'r,'f,'c) CFG.P.T.Extension.ccx ! and type ('s,'r,'f,'c) S.P.T.Extension.fx = ('s,'r,'f,'c) CFG.P.T.Extension.fx ! and type ('s,'r,'f,'c) S.P.T.Extension.rx = ('s,'r,'f,'c) CFG.P.T.Extension.rx ! and type ('s,'r,'f,'c) S.P.T.Extension.sx = ('s,'r,'f,'c) CFG.P.T.Extension.sx ! and type S.P.T.I.div_rounding_mode = CFG.P.T.I.div_rounding_mode ! and type S.P.T.Region.region = CFG.P.T.Region.region ! and type S.P.T.ccexp = CFG.P.T.ccexp ! and type S.P.T.fexp = CFG.P.T.fexp ! (* and type S.P.T.labexp = CFG.P.T.labexp *) ! and type S.P.T.mlrisc = CFG.P.T.mlrisc ! and type S.P.T.oper = CFG.P.T.oper ! and type S.P.T.rep = CFG.P.T.rep ! and type S.P.T.rexp = CFG.P.T.rexp ! and type S.P.T.stm = CFG.P.T.stm type spill_info *************** *** 139,146 **** structure RA = RegisterAllocator ! (SpillHeur) ! (MemoryRA (RADeadCodeElim ! (ClusterRA (structure Flowgraph = CFG structure Asm = Asm --- 175,182 ---- structure RA = RegisterAllocator ! (structure SpillHeuristics = SpillHeur ! structure Flowgraph = MemoryRA (RADeadCodeElim ! (structure Flowgraph = ClusterRA (structure Flowgraph = CFG structure Asm = Asm *************** *** 148,155 **** structure Spill = Spill ) ! ) ! (fun cellkind CB.GP = true ! | cellkind CB.FP = true ! | cellkind _ = false val deadRegs = deadRegs val affectedBlocks = affectedBlocks --- 184,190 ---- structure Spill = Spill ) ! fun cellkind CB.GP = true ! | cellkind CB.FP = true ! | cellkind _ = false val deadRegs = deadRegs val affectedBlocks = affectedBlocks diff -N -C 2 -r MLRISC/amd64/ra/amd64SpillInstr.sml MLRISC-mlton/amd64/ra/amd64SpillInstr.sml *** MLRISC/amd64/ra/amd64SpillInstr.sml 2010-02-03 11:40:46.000000000 -0500 --- MLRISC-mlton/amd64/ra/amd64SpillInstr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,12 **** functor AMD64SpillInstr ( structure I : AMD64INSTR ! structure Props : AMD64INSN_PROPERTIES ! where I = I (* guaranteeing that floats are stored at 16-byte aligned addresses reduces the number of instructions *) --- 7,16 ---- functor AMD64SpillInstr ( structure I : AMD64INSTR ! structure Props : AMD64INSN_PROPERTIES (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand (* guaranteeing that floats are stored at 16-byte aligned addresses reduces the number of instructions *) *************** *** 75,79 **** in (case ea ! of ( I.Displace _ | I.Indexed _ ) => move () | _ => error "spillToEA" (* end case *)) --- 79,84 ---- in (case ea ! of ( I.Displace _ ) => move () ! | ( I.Indexed _ ) => move () | _ => error "spillToEA" (* end case *)) *************** *** 87,91 **** in (case ea ! of ( I.Displace _ | I.Indexed _ ) => move () | _ => error "reloadFromEA" (* end case *)) --- 92,97 ---- in (case ea ! of ( I.Displace _ ) => move () ! | ( I.Indexed _ ) => move () | _ => error "reloadFromEA" (* end case *)) *************** *** 117,123 **** (* With sign or zero extended spills we use different operand sizes * for copying to the tmp operand and for copying from the tmp operand. *) ! | I.MOVE {mvOp as (I.MOVZBQ|I.MOVSBQ|I.MOVZWQ|I.MOVSWQ| ! I.MOVSLQ|I.MOVZBL|I.MOVSBL|I.MOVZWL| ! I.MOVSWL), src, dst} => let val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () in --- 123,183 ---- (* With sign or zero extended spills we use different operand sizes * for copying to the tmp operand and for copying from the tmp operand. *) ! | I.MOVE {mvOp as (I.MOVZBQ), src, dst} => let ! val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () ! in ! {proh=[tmpR], newReg=SOME tmpR, ! code=[mark (I.MOVE {mvOp=mvOp, src=src, dst=tmpOpnd}, an), ! I.move {mvOp=defaultMov, src=tmpOpnd64, dst=spillLoc}]} ! end ! | I.MOVE {mvOp as (I.MOVSBQ), src, dst} => let ! val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () ! in ! {proh=[tmpR], newReg=SOME tmpR, ! code=[mark (I.MOVE {mvOp=mvOp, src=src, dst=tmpOpnd}, an), ! I.move {mvOp=defaultMov, src=tmpOpnd64, dst=spillLoc}]} ! end ! | I.MOVE {mvOp as (I.MOVZWQ), src, dst} => let ! val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () ! in ! {proh=[tmpR], newReg=SOME tmpR, ! code=[mark (I.MOVE {mvOp=mvOp, src=src, dst=tmpOpnd}, an), ! I.move {mvOp=defaultMov, src=tmpOpnd64, dst=spillLoc}]} ! end ! | I.MOVE {mvOp as (I.MOVSWQ), src, dst} => let ! val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () ! in ! {proh=[tmpR], newReg=SOME tmpR, ! code=[mark (I.MOVE {mvOp=mvOp, src=src, dst=tmpOpnd}, an), ! I.move {mvOp=defaultMov, src=tmpOpnd64, dst=spillLoc}]} ! end ! | I.MOVE {mvOp as (I.MOVSLQ), src, dst} => let ! val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () ! in ! {proh=[tmpR], newReg=SOME tmpR, ! code=[mark (I.MOVE {mvOp=mvOp, src=src, dst=tmpOpnd}, an), ! I.move {mvOp=defaultMov, src=tmpOpnd64, dst=spillLoc}]} ! end ! | I.MOVE {mvOp as (I.MOVZBL), src, dst} => let ! val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () ! in ! {proh=[tmpR], newReg=SOME tmpR, ! code=[mark (I.MOVE {mvOp=mvOp, src=src, dst=tmpOpnd}, an), ! I.move {mvOp=defaultMov, src=tmpOpnd64, dst=spillLoc}]} ! end ! | I.MOVE {mvOp as (I.MOVSBL), src, dst} => let ! val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () ! in ! {proh=[tmpR], newReg=SOME tmpR, ! code=[mark (I.MOVE {mvOp=mvOp, src=src, dst=tmpOpnd}, an), ! I.move {mvOp=defaultMov, src=tmpOpnd64, dst=spillLoc}]} ! end ! | I.MOVE {mvOp as (I.MOVZWL), src, dst} => let ! val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () ! in ! {proh=[tmpR], newReg=SOME tmpR, ! code=[mark (I.MOVE {mvOp=mvOp, src=src, dst=tmpOpnd}, an), ! I.move {mvOp=defaultMov, src=tmpOpnd64, dst=spillLoc}]} ! end ! | I.MOVE {mvOp as (I.MOVSWL), src, dst} => let val (tmpR, tmpOpnd, tmpOpnd64) = freshTmp () in *************** *** 183,188 **** | I.BINARY {binOp, src, dst} => let (* note: dst = r *) ! fun multBinOp(I.MULQ|I.MULL|I.MULW|I.MULB| ! I.IMULQ|I.IMULL|I.IMULW|I.IMULB) = true | multBinOp _ = false in --- 243,254 ---- | I.BINARY {binOp, src, dst} => let (* note: dst = r *) ! fun multBinOp(I.MULQ) = true ! | multBinOp(I.MULL) = true ! | multBinOp(I.MULW) = true ! | multBinOp(I.MULB) = true ! | multBinOp(I.IMULQ) = true ! | multBinOp(I.IMULL) = true ! | multBinOp(I.IMULW) = true ! | multBinOp(I.IMULB) = true | multBinOp _ = false in *************** *** 610,614 **** end (* treat bitwise operators differently, as they require that their source operand is 16-byte aligned *) ! | I.FBINOP {binOp=binOp as (I.XORPS | I.XORPD | I.ANDPS | I.ANDPD | I.ORPS | I.ORPD), src, dst} => if CB.sameColor (r, dst) then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst}, mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)], --- 676,750 ---- end (* treat bitwise operators differently, as they require that their source operand is 16-byte aligned *) ! | I.FBINOP {binOp=binOp as (I.XORPS), src, dst} => if CB.sameColor (r, dst) ! then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst}, ! mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)], ! proh=[], newReg=NONE} ! else if floats16ByteAligned ! then let ! val tmpR = newFreg () ! val tmp = I.FDirect tmpR ! in ! {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=tmp}, ! mark (I.FBINOP {binOp=binOp, src=tmp, dst=dst}, an)], ! proh=[tmpR], newReg=SOME tmpR} ! end ! else {code=[mark (I.FBINOP {binOp=binOp, src=replace src, dst=dst}, an)], proh=[], newReg=NONE} ! | I.FBINOP {binOp=binOp as (I.XORPD), src, dst} => if CB.sameColor (r, dst) ! then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst}, ! mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)], ! proh=[], newReg=NONE} ! else if floats16ByteAligned ! then let ! val tmpR = newFreg () ! val tmp = I.FDirect tmpR ! in ! {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=tmp}, ! mark (I.FBINOP {binOp=binOp, src=tmp, dst=dst}, an)], ! proh=[tmpR], newReg=SOME tmpR} ! end ! else {code=[mark (I.FBINOP {binOp=binOp, src=replace src, dst=dst}, an)], proh=[], newReg=NONE} ! | I.FBINOP {binOp=binOp as (I.ANDPS), src, dst} => if CB.sameColor (r, dst) ! then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst}, ! mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)], ! proh=[], newReg=NONE} ! else if floats16ByteAligned ! then let ! val tmpR = newFreg () ! val tmp = I.FDirect tmpR ! in ! {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=tmp}, ! mark (I.FBINOP {binOp=binOp, src=tmp, dst=dst}, an)], ! proh=[tmpR], newReg=SOME tmpR} ! end ! else {code=[mark (I.FBINOP {binOp=binOp, src=replace src, dst=dst}, an)], proh=[], newReg=NONE} ! | I.FBINOP {binOp=binOp as (I.ANDPD), src, dst} => if CB.sameColor (r, dst) ! then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst}, ! mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)], ! proh=[], newReg=NONE} ! else if floats16ByteAligned ! then let ! val tmpR = newFreg () ! val tmp = I.FDirect tmpR ! in ! {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=tmp}, ! mark (I.FBINOP {binOp=binOp, src=tmp, dst=dst}, an)], ! proh=[tmpR], newReg=SOME tmpR} ! end ! else {code=[mark (I.FBINOP {binOp=binOp, src=replace src, dst=dst}, an)], proh=[], newReg=NONE} ! | I.FBINOP {binOp=binOp as (I.ORPS), src, dst} => if CB.sameColor (r, dst) ! then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst}, ! mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)], ! proh=[], newReg=NONE} ! else if floats16ByteAligned ! then let ! val tmpR = newFreg () ! val tmp = I.FDirect tmpR ! in ! {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=tmp}, ! mark (I.FBINOP {binOp=binOp, src=tmp, dst=dst}, an)], ! proh=[tmpR], newReg=SOME tmpR} ! end ! else {code=[mark (I.FBINOP {binOp=binOp, src=replace src, dst=dst}, an)], proh=[], newReg=NONE} ! | I.FBINOP {binOp=binOp as (I.ORPD), src, dst} => if CB.sameColor (r, dst) then {code=[I.fmove {fmvOp=fmvOp, src=spillLoc, dst=I.FDirect dst}, mark (I.FBINOP {binOp=binOp, src=src, dst=dst}, an)], diff -N -C 2 -r MLRISC/backpatch/backpatch.sml MLRISC-mlton/backpatch/backpatch.sml *** MLRISC/backpatch/backpatch.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/backpatch/backpatch.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 9,19 **** functor BBSched2 (structure Emitter : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH ! where I = Emitter.I ! and P = Emitter.S.P ! structure Jumps : SDI_JUMPS ! where I = CFG.I ! structure Props : INSN_PROPERTIES ! where I = CFG.I ) = struct --- 9,51 ---- functor BBSched2 (structure Emitter : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH (* where I = Emitter.I and P = Emitter.S.P *) ! where type I.addressing_mode = Emitter.I.addressing_mode ! and type I.ea = Emitter.I.ea ! and type I.instr = Emitter.I.instr ! and type I.instruction = Emitter.I.instruction ! and type I.operand = Emitter.I.operand ! where type P.Client.pseudo_op = Emitter.S.P.Client.pseudo_op ! and type P.T.Basis.cond = Emitter.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = Emitter.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = Emitter.S.P.T.Basis.ext ! and type P.T.Basis.fcond = Emitter.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = Emitter.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = Emitter.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = Emitter.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = Emitter.S.P.T.Region.region ! and type P.T.ccexp = Emitter.S.P.T.ccexp ! and type P.T.fexp = Emitter.S.P.T.fexp ! (* and type P.T.labexp = Emitter.S.P.T.labexp *) ! and type P.T.mlrisc = Emitter.S.P.T.mlrisc ! and type P.T.oper = Emitter.S.P.T.oper ! and type P.T.rep = Emitter.S.P.T.rep ! and type P.T.rexp = Emitter.S.P.T.rexp ! and type P.T.stm = Emitter.S.P.T.stm ! structure Jumps : SDI_JUMPS (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! structure Props : INSN_PROPERTIES (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ) = struct diff -N -C 2 -r MLRISC/backpatch/sdi-jumps.sig MLRISC-mlton/backpatch/sdi-jumps.sig *** MLRISC/backpatch/sdi-jumps.sig 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/backpatch/sdi-jumps.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 8,12 **** structure I : INSTRUCTIONS structure C : CELLS ! sharing I.C = C val branchDelayedArch : bool --- 8,12 ---- structure I : INSTRUCTIONS structure C : CELLS ! (* sharing I.C = C *) val branchDelayedArch : bool diff -N -C 2 -r MLRISC/backpatch/spanDep.sml MLRISC-mlton/backpatch/spanDep.sml *** MLRISC/backpatch/spanDep.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/backpatch/spanDep.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 10,25 **** functor SpanDependencyResolution (structure Emitter : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH ! where I = Emitter.I ! and P = Emitter.S.P ! structure Jumps : SDI_JUMPS ! where I = CFG.I ! structure DelaySlot : DELAY_SLOT_PROPERTIES ! where I = CFG.I ! structure Props : INSN_PROPERTIES ! where I = CFG.I ! structure Asm : INSTRUCTION_EMITTER ! where I = CFG.I ! and S = Emitter.S ) : BBSCHED = struct --- 10,86 ---- functor SpanDependencyResolution (structure Emitter : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH (* where I = Emitter.I and P = Emitter.S.P *) ! where type I.addressing_mode = Emitter.I.addressing_mode ! and type I.ea = Emitter.I.ea ! and type I.instr = Emitter.I.instr ! and type I.instruction = Emitter.I.instruction ! and type I.operand = Emitter.I.operand ! where type P.Client.pseudo_op = Emitter.S.P.Client.pseudo_op ! and type P.T.Basis.cond = Emitter.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = Emitter.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = Emitter.S.P.T.Basis.ext ! and type P.T.Basis.fcond = Emitter.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = Emitter.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = Emitter.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = Emitter.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = Emitter.S.P.T.Region.region ! and type P.T.ccexp = Emitter.S.P.T.ccexp ! and type P.T.fexp = Emitter.S.P.T.fexp ! (* and type P.T.labexp = Emitter.S.P.T.labexp *) ! and type P.T.mlrisc = Emitter.S.P.T.mlrisc ! and type P.T.oper = Emitter.S.P.T.oper ! and type P.T.rep = Emitter.S.P.T.rep ! and type P.T.rexp = Emitter.S.P.T.rexp ! and type P.T.stm = Emitter.S.P.T.stm ! structure Jumps : SDI_JUMPS (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! structure DelaySlot : DELAY_SLOT_PROPERTIES (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! structure Props : INSN_PROPERTIES (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! structure Asm : INSTRUCTION_EMITTER (* where I = CFG.I and S = Emitter.S *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! where type S.P.Client.pseudo_op = Emitter.S.P.Client.pseudo_op ! and type S.P.T.Basis.cond = Emitter.S.P.T.Basis.cond ! and type S.P.T.Basis.div_rounding_mode = Emitter.S.P.T.Basis.div_rounding_mode ! and type S.P.T.Basis.ext = Emitter.S.P.T.Basis.ext ! and type S.P.T.Basis.fcond = Emitter.S.P.T.Basis.fcond ! and type S.P.T.Basis.rounding_mode = Emitter.S.P.T.Basis.rounding_mode ! and type S.P.T.Constant.const = Emitter.S.P.T.Constant.const ! and type ('s,'r,'f,'c) S.P.T.Extension.ccx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) S.P.T.Extension.fx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) S.P.T.Extension.rx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) S.P.T.Extension.sx = ('s,'r,'f,'c) Emitter.S.P.T.Extension.sx ! and type S.P.T.I.div_rounding_mode = Emitter.S.P.T.I.div_rounding_mode ! and type S.P.T.Region.region = Emitter.S.P.T.Region.region ! and type S.P.T.ccexp = Emitter.S.P.T.ccexp ! and type S.P.T.fexp = Emitter.S.P.T.fexp ! (* and type S.P.T.labexp = Emitter.S.P.T.labexp *) ! and type S.P.T.mlrisc = Emitter.S.P.T.mlrisc ! and type S.P.T.oper = Emitter.S.P.T.oper ! and type S.P.T.rep = Emitter.S.P.T.rep ! and type S.P.T.rexp = Emitter.S.P.T.rexp ! and type S.P.T.stm = Emitter.S.P.T.stm ! and type ('a,'b,'c,'d) S.stream = ('a,'b,'c,'d) Emitter.S.stream ) : BBSCHED = struct *************** *** 276,280 **** and eliminateNop(jmp) = case (nop,nOn) of ! (true,(D.D_FALLTHRU | D.D_NONE)) => D.enableDelaySlot{n=true,nop=false,instr=jmp} | _ => jmp --- 337,343 ---- and eliminateNop(jmp) = case (nop,nOn) of ! (true,D.D_FALLTHRU) => ! D.enableDelaySlot{n=true,nop=false,instr=jmp} ! | (true,D.D_NONE) => D.enableDelaySlot{n=true,nop=false,instr=jmp} | _ => jmp diff -N -C 2 -r MLRISC/backpatch/vlBackPatch.sml MLRISC-mlton/backpatch/vlBackPatch.sml *** MLRISC/backpatch/vlBackPatch.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/backpatch/vlBackPatch.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 27,38 **** (structure CodeString : CODE_STRING structure Jumps : SDI_JUMPS ! structure Props : INSN_PROPERTIES ! where I = Jumps.I ! structure Emitter : MC_EMIT ! where I = Props.I ! structure CFG : CONTROL_FLOW_GRAPH ! where I = Emitter.I ! structure Asm : INSTRUCTION_EMITTER ! where I = CFG.I) = struct structure I = Jumps.I --- 27,55 ---- (structure CodeString : CODE_STRING structure Jumps : SDI_JUMPS ! structure Props : INSN_PROPERTIES (* where I = Jumps.I *) ! where type I.addressing_mode = Jumps.I.addressing_mode ! and type I.ea = Jumps.I.ea ! and type I.instr = Jumps.I.instr ! and type I.instruction = Jumps.I.instruction ! and type I.operand = Jumps.I.operand ! structure Emitter : MC_EMIT (* where I = Props.I *) ! where type I.addressing_mode = Props.I.addressing_mode ! and type I.ea = Props.I.ea ! and type I.instr = Props.I.instr ! and type I.instruction = Props.I.instruction ! and type I.operand = Props.I.operand ! structure CFG : CONTROL_FLOW_GRAPH (* where I = Emitter.I *) ! where type I.addressing_mode = Emitter.I.addressing_mode ! and type I.ea = Emitter.I.ea ! and type I.instr = Emitter.I.instr ! and type I.instruction = Emitter.I.instruction ! and type I.operand = Emitter.I.operand ! structure Asm : INSTRUCTION_EMITTER (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! ) = struct structure I = Jumps.I diff -N -C 2 -r MLRISC/block-placement/block-placement.sml MLRISC-mlton/block-placement/block-placement.sml *** MLRISC/block-placement/block-placement.sml 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/block-placement/block-placement.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 6,13 **** functor BlockPlacement (structure CFG : CONTROL_FLOW_GRAPH ! structure Props : INSN_PROPERTIES ! where I = CFG.I) ! ! : BLOCK_PLACEMENT = struct --- 6,16 ---- functor BlockPlacement (structure CFG : CONTROL_FLOW_GRAPH ! structure Props : INSN_PROPERTIES (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! ) : BLOCK_PLACEMENT = struct diff -N -C 2 -r MLRISC/block-placement/check-placement-fn.sml MLRISC-mlton/block-placement/check-placement-fn.sml *** MLRISC/block-placement/check-placement-fn.sml 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/block-placement/check-placement-fn.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 10,15 **** structure CFG : CONTROL_FLOW_GRAPH ! structure InsnProps : INSN_PROPERTIES ! where I = CFG.I ) : sig --- 10,19 ---- structure CFG : CONTROL_FLOW_GRAPH ! structure InsnProps : INSN_PROPERTIES (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ) : sig *************** *** 82,86 **** (* check that FALLSTHRU and BRANCH false edges connect adjacent nodes *) fun chkEdge (src, dst, CFG.EDGE{k, ...}) = (case k ! of (CFG.FALLSTHRU | CFG.BRANCH false) => if adjacentNodes(src, dst) then () --- 86,94 ---- (* check that FALLSTHRU and BRANCH false edges connect adjacent nodes *) fun chkEdge (src, dst, CFG.EDGE{k, ...}) = (case k ! of CFG.FALLSTHRU => ! if adjacentNodes(src, dst) ! then () ! else reportNotAdjacent(src, dst) ! | CFG.BRANCH false => if adjacentNodes(src, dst) then () diff -N -C 2 -r MLRISC/block-placement/jump-chain-elim-fn.sml MLRISC-mlton/block-placement/jump-chain-elim-fn.sml *** MLRISC/block-placement/jump-chain-elim-fn.sml 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/block-placement/jump-chain-elim-fn.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 13,18 **** structure CFG : CONTROL_FLOW_GRAPH ! structure InsnProps : INSN_PROPERTIES ! where I = CFG.I (* Control flag that when set true allows jumps to labels outside --- 13,22 ---- structure CFG : CONTROL_FLOW_GRAPH ! structure InsnProps : INSN_PROPERTIES (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand (* Control flag that when set true allows jumps to labels outside diff -N -C 2 -r MLRISC/block-placement/weighted-block-placement-fn.sml MLRISC-mlton/block-placement/weighted-block-placement-fn.sml *** MLRISC/block-placement/weighted-block-placement-fn.sml 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/block-placement/weighted-block-placement-fn.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 13,18 **** structure CFG : CONTROL_FLOW_GRAPH ! structure InsnProps : INSN_PROPERTIES ! where I = CFG.I ) : BLOCK_PLACEMENT = struct --- 13,22 ---- structure CFG : CONTROL_FLOW_GRAPH ! structure InsnProps : INSN_PROPERTIES (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ) : BLOCK_PLACEMENT = struct diff -N -C 2 -r MLRISC/c-call/archs/sparc-c-call-fn.sml MLRISC-mlton/c-call/archs/sparc-c-call-fn.sml *** MLRISC/c-call/archs/sparc-c-call-fn.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/c-call/archs/sparc-c-call-fn.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 78,84 **** (* assign a C type to a kind of machine location *) ! fun kindOfCTy (CTy.C_float | CTy.C_double | CTy.C_long_double) = FPR ! | kindOfCTy (CTy.C_unsigned _ | CTy.C_signed _ | CTy.C_PTR | ! CTy.C_ARRAY _ | CTy.C_STRUCT _ | CTy.C_UNION _) = GPR (* takes a C type and a request for passing values of that type *) --- 78,90 ---- (* assign a C type to a kind of machine location *) ! fun kindOfCTy (CTy.C_float) = FPR ! | kindOfCTy (CTy.C_double) = FPR ! | kindOfCTy (CTy.C_long_double) = FPR ! | kindOfCTy (CTy.C_unsigned _) = GPR ! | kindOfCTy (CTy.C_signed _) = GPR ! | kindOfCTy (CTy.C_PTR) = GPR ! | kindOfCTy (CTy.C_ARRAY _) = GPR ! | kindOfCTy (CTy.C_STRUCT _) = GPR ! | kindOfCTy (CTy.C_UNION _) = GPR (* takes a C type and a request for passing values of that type *) *************** *** 87,93 **** in case cTy ! of (CTy.C_STRUCT _ | CTy.C_UNION _) => (32, kindOfCTy cTy, align) ! | (CTy.C_unsigned CTy.I_long_long | ! CTy.C_signed CTy.I_long_long ) => raise Fail "todo" | _ => (sz * 8, kindOfCTy cTy, align) end --- 93,100 ---- in case cTy ! of (CTy.C_STRUCT _) => (32, kindOfCTy cTy, align) ! | (CTy.C_UNION _) => (32, kindOfCTy cTy, align) ! | (CTy.C_unsigned CTy.I_long_long) => raise Fail "todo" ! | (CTy.C_signed CTy.I_long_long) => raise Fail "todo" | _ => (sz * 8, kindOfCTy cTy, align) end *************** *** 136,140 **** val res_szal = case retTy of ! (Ty.C_long_double | Ty.C_STRUCT _ | Ty.C_UNION _) => SOME (SparcCSizes.sizeOfTy retTy) | _ => NONE --- 143,151 ---- val res_szal = case retTy of ! (Ty.C_long_double) => ! SOME (SparcCSizes.sizeOfTy retTy) ! | (Ty.C_STRUCT _) => ! SOME (SparcCSizes.sizeOfTy retTy) ! | (Ty.C_UNION _) => SOME (SparcCSizes.sizeOfTy retTy) | _ => NONE diff -N -C 2 -r MLRISC/c-call/archs/sparc-c-sizes.sml MLRISC-mlton/c-call/archs/sparc-c-sizes.sml *** MLRISC/c-call/archs/sparc-c-sizes.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/c-call/archs/sparc-c-sizes.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,19 **** (* calculate size and alignment for a C type *) ! fun sizeOfTy (Ty.C_void | Ty.C_float | Ty.C_PTR | ! Ty.C_signed (Ty.I_int | Ty.I_long) | ! Ty.C_unsigned (Ty.I_int | Ty.I_long)) = {sz=4, align=4} ! | sizeOfTy (Ty.C_double | ! Ty.C_signed Ty.I_long_long | ! Ty.C_unsigned Ty.I_long_long) = {sz=8, align=8} | sizeOfTy (Ty.C_long_double) = {sz=16, align=8} ! | sizeOfTy (Ty.C_signed Ty.I_char | Ty.C_unsigned Ty.I_char) = {sz=1, align=1} ! | sizeOfTy (Ty.C_signed Ty.I_short | Ty.C_unsigned Ty.I_short) = {sz=2, align=2} | sizeOfTy (Ty.C_ARRAY (t, n)) = let val {sz=s, align=a} = sizeOfTy t in {sz=n * s, align=a} end | sizeOfTy (Ty.C_STRUCT l) = --- 7,25 ---- (* calculate size and alignment for a C type *) ! fun sizeOfTy (Ty.C_void) = {sz=4, align=4} ! | sizeOfTy (Ty.C_float) = {sz=4, align=4} ! | sizeOfTy (Ty.C_PTR) = {sz=4, align=4} ! | sizeOfTy (Ty.C_signed (Ty.I_int)) = {sz=4, align=4} ! | sizeOfTy (Ty.C_signed (Ty.I_long)) = {sz=4, align=4} ! | sizeOfTy (Ty.C_unsigned (Ty.I_int)) = {sz=4, align=4} ! | sizeOfTy (Ty.C_unsigned (Ty.I_long)) = {sz=4, align=4} ! | sizeOfTy (Ty.C_double) = {sz=8, align=8} ! | sizeOfTy (Ty.C_signed Ty.I_long_long) = {sz=8, align=8} ! | sizeOfTy (Ty.C_unsigned Ty.I_long_long) = {sz=8, align=8} | sizeOfTy (Ty.C_long_double) = {sz=16, align=8} ! | sizeOfTy (Ty.C_signed Ty.I_char) = {sz=1, align=1} ! | sizeOfTy (Ty.C_unsigned Ty.I_char) = {sz=1, align=1} ! | sizeOfTy (Ty.C_signed Ty.I_short) = {sz=2, align=2} ! | sizeOfTy (Ty.C_unsigned Ty.I_short) = {sz=2, align=2} | sizeOfTy (Ty.C_ARRAY (t, n)) = let val {sz=s, align=a} = sizeOfTy t in {sz=n * s, align=a} end | sizeOfTy (Ty.C_STRUCT l) = diff -N -C 2 -r MLRISC/c-call/archs/x86-64-svid-fn.sml MLRISC-mlton/c-call/archs/x86-64-svid-fn.sml *** MLRISC/c-call/archs/x86-64-svid-fn.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/c-call/archs/x86-64-svid-fn.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 76,80 **** val callerSaveRegs = [C.rax, C.rcx, C.rdx, C.rsi, C.rdi, C.r8, C.r9, C.r10, C.r11] val callerSaveFRegs = (C.Regs CB.FP {from=0, to=15, step=1}) ! val calleeSaveFRegs = [] val frameAlignB = 16 --- 76,80 ---- val callerSaveRegs = [C.rax, C.rcx, C.rdx, C.rsi, C.rdi, C.r8, C.r9, C.r10, C.r11] val callerSaveFRegs = (C.Regs CB.FP {from=0, to=15, step=1}) ! val calleeSaveFRegs : T.reg list = [] val frameAlignB = 16 *************** *** 103,109 **** (* classify a C type into its location kind (assuming that aggregates cannot be passed in registers) *) ! fun kindOfCTy (CTy.C_float | CTy.C_double | CTy.C_long_double) = FPR ! | kindOfCTy (CTy.C_ARRAY _ | CTy.C_STRUCT _ | CTy.C_UNION _) = raise Fail "impossible" ! | kindOfCTy (CTy.C_unsigned _ | CTy.C_signed _ | CTy.C_PTR) = GPR fun combineKinds (k1, k2) = if (k1 = k2) --- 103,115 ---- (* classify a C type into its location kind (assuming that aggregates cannot be passed in registers) *) ! fun kindOfCTy (CTy.C_float) = FPR ! | kindOfCTy (CTy.C_double) = FPR ! | kindOfCTy (CTy.C_long_double) = FPR ! | kindOfCTy (CTy.C_ARRAY _) = raise Fail "impossible" ! | kindOfCTy (CTy.C_STRUCT _) = raise Fail "impossible" ! | kindOfCTy (CTy.C_UNION _) = raise Fail "impossible" ! | kindOfCTy (CTy.C_unsigned _) = GPR ! | kindOfCTy (CTy.C_signed _) = GPR ! | kindOfCTy (CTy.C_PTR) = GPR fun combineKinds (k1, k2) = if (k1 = k2) *************** *** 129,137 **** fun containsUnalignedFields cTy = (case cTy ! of (CTy.C_STRUCT cTys | CTy.C_UNION cTys) => List.exists containsUnalignedFields cTys | cTy => Int.max(8, szBOfCTy cTy) mod 8 <> 0 (* end case *)) ! fun reqsOfCTy (cTy as (CTy.C_STRUCT _ | CTy.C_UNION _ | CTy.C_ARRAY _)) = if (szBOfCTy cTy > 2*8 orelse containsUnalignedFields cTy) then List.tabulate (szBOfCTy cTy div 8, fn _ => (8*8, STK, 8)) --- 135,152 ---- fun containsUnalignedFields cTy = (case cTy ! of (CTy.C_STRUCT cTys) => List.exists containsUnalignedFields cTys ! | (CTy.C_UNION cTys) => List.exists containsUnalignedFields cTys | cTy => Int.max(8, szBOfCTy cTy) mod 8 <> 0 (* end case *)) ! fun reqsOfCTy (cTy as (CTy.C_STRUCT _)) = ! if (szBOfCTy cTy > 2*8 orelse containsUnalignedFields cTy) ! then List.tabulate (szBOfCTy cTy div 8, fn _ => (8*8, STK, 8)) ! else List.map (fn eb => (8*8, kindOfEightByte eb, 8)) (eightBytesOfCTy cTy) ! | reqsOfCTy (cTy as (CTy.C_UNION _)) = ! if (szBOfCTy cTy > 2*8 orelse containsUnalignedFields cTy) ! then List.tabulate (szBOfCTy cTy div 8, fn _ => (8*8, STK, 8)) ! else List.map (fn eb => (8*8, kindOfEightByte eb, 8)) (eightBytesOfCTy cTy) ! | reqsOfCTy (cTy as (CTy.C_ARRAY _)) = if (szBOfCTy cTy > 2*8 orelse containsUnalignedFields cTy) then List.tabulate (szBOfCTy cTy div 8, fn _ => (8*8, STK, 8)) diff -N -C 2 -r MLRISC/c-call/archs/x86-svid-fn.sml MLRISC-mlton/c-call/archs/x86-svid-fn.sml *** MLRISC/c-call/archs/x86-svid-fn.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/c-call/archs/x86-svid-fn.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 69,74 **** (* assign a C type to a kind of machine location *) ! fun kindOfCTy (CTy.C_float | CTy.C_double | CTy.C_long_double) = FPR ! | kindOfCTy (CTy.C_unsigned _ | CTy.C_signed _ | CTy.C_PTR | CTy.C_ARRAY _) = GPR (* convert a C type to reqs for staged allocation *) --- 69,79 ---- (* assign a C type to a kind of machine location *) ! fun kindOfCTy (CTy.C_float) = FPR ! | kindOfCTy (CTy.C_double) = FPR ! | kindOfCTy (CTy.C_long_double) = FPR ! | kindOfCTy (CTy.C_unsigned _) = GPR ! | kindOfCTy (CTy.C_signed _) = GPR ! | kindOfCTy (CTy.C_PTR) = GPR ! | kindOfCTy (CTy.C_ARRAY _) = GPR (* convert a C type to reqs for staged allocation *) *************** *** 87,92 **** then [(8, GPR, align), (8, GPR, align)] else reqs ! | ( (CTy.C_unsigned CTy.I_long_long | ! CTy.C_signed CTy.I_long_long ), _ ) => (* 64-bit integers are returned in GPRs *) --- 92,100 ---- then [(8, GPR, align), (8, GPR, align)] else reqs ! | ( (CTy.C_unsigned CTy.I_long_long), ! _ ) => ! (* 64-bit integers are returned in GPRs *) ! [(8, GPR, align), (8, GPR, align)] ! | ( (CTy.C_signed CTy.I_long_long), _ ) => (* 64-bit integers are returned in GPRs *) *************** *** 203,207 **** *) val calleePops = (case #conv proto ! of (""|"ccall") => false | "stdcall" => true | conv => raise Fail (concat [ --- 211,216 ---- *) val calleePops = (case #conv proto ! of ("") => false ! | ("ccall") => false | "stdcall" => true | conv => raise Fail (concat [ diff -N -C 2 -r MLRISC/c-call/gen/c-call-gen-fn.sml MLRISC-mlton/c-call/gen/c-call-gen-fn.sml *** MLRISC/c-call/gen/c-call-gen-fn.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/c-call/gen/c-call-gen-fn.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 92,99 **** fun writeLoc arg (off, loc, stms) = ( case (arg, loc) ! of (ARG (e as T.REG _), SA.BLOCK_OFFSET(w, (K.GPR | K.STK), offset)) => (* register to stack (gpr) *) T.STORE(wordTy, offSp offset, e, stack) :: stms ! | (ARG (e as T.REG _), SA.NARROW(SA.BLOCK_OFFSET(w, (K.GPR | K.STK), offset), w', (K.GPR | K.STK))) => (* register to stack with width conversion (gpr) *) T.STORE(w, offSp offset, sx{fromWidth=w', toWidth=w, e=e}, stack) :: stms --- 92,111 ---- fun writeLoc arg (off, loc, stms) = ( case (arg, loc) ! of (ARG (e as T.REG _), SA.BLOCK_OFFSET(w, (K.GPR), offset)) => (* register to stack (gpr) *) T.STORE(wordTy, offSp offset, e, stack) :: stms ! | (ARG (e as T.REG _), SA.BLOCK_OFFSET(w, (K.STK), offset)) => ! (* register to stack (gpr) *) ! T.STORE(wordTy, offSp offset, e, stack) :: stms ! | (ARG (e as T.REG _), SA.NARROW(SA.BLOCK_OFFSET(w, (K.GPR), offset), w', (K.GPR))) => ! (* register to stack with width conversion (gpr) *) ! T.STORE(w, offSp offset, sx{fromWidth=w', toWidth=w, e=e}, stack) :: stms ! | (ARG (e as T.REG _), SA.NARROW(SA.BLOCK_OFFSET(w, (K.GPR), offset), w', (K.STK))) => ! (* register to stack with width conversion (gpr) *) ! T.STORE(w, offSp offset, sx{fromWidth=w', toWidth=w, e=e}, stack) :: stms ! | (ARG (e as T.REG _), SA.NARROW(SA.BLOCK_OFFSET(w, (K.STK), offset), w', (K.GPR))) => ! (* register to stack with width conversion (gpr) *) ! T.STORE(w, offSp offset, sx{fromWidth=w', toWidth=w, e=e}, stack) :: stms ! | (ARG (e as T.REG _), SA.NARROW(SA.BLOCK_OFFSET(w, (K.STK), offset), w', (K.STK))) => (* register to stack with width conversion (gpr) *) T.STORE(w, offSp offset, sx{fromWidth=w', toWidth=w, e=e}, stack) :: stms *************** *** 110,114 **** (* expression to register with conversion *) copyToReg(w, r, sx{fromWidth=w', toWidth=w, e=e}) @ stms ! | (ARG (T.LOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.GPR | K.STK), offset)) => let (* memory to stack (gpr) *) val tmp = C.newReg () --- 122,126 ---- (* expression to register with conversion *) copyToReg(w, r, sx{fromWidth=w', toWidth=w, e=e}) @ stms ! | (ARG (T.LOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.GPR), offset)) => let (* memory to stack (gpr) *) val tmp = C.newReg () *************** *** 117,121 **** T.MV (ty, tmp, T.LOAD (ty, T.ADD(wordTy, e, off), rgn)) :: stms end ! | (ARG (T.LOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.GPR | K.STK), offset), w', K.GPR)) => let (* memory to stack with conversion (gpr) *) val tmp = C.newReg () --- 129,140 ---- T.MV (ty, tmp, T.LOAD (ty, T.ADD(wordTy, e, off), rgn)) :: stms end ! | (ARG (T.LOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.STK), offset)) => let ! (* memory to stack (gpr) *) ! val tmp = C.newReg () ! in ! T.STORE (ty, offSp offset, T.REG (ty, tmp), stack) :: ! T.MV (ty, tmp, T.LOAD (ty, T.ADD(wordTy, e, off), rgn)) :: stms ! end ! | (ARG (T.LOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.GPR), offset), w', K.GPR)) => let (* memory to stack with conversion (gpr) *) val tmp = C.newReg () *************** *** 124,128 **** T.MV (w, tmp, sx{fromWidth=w', toWidth=w, e=T.LOAD (w', T.ADD(wordTy, e, off), rgn)}) :: stms end ! | (ARG e, SA.BLOCK_OFFSET(w, (K.GPR | K.STK), offset)) => let (* expression to stack (gpr) *) val tmp = C.newReg () --- 143,160 ---- T.MV (w, tmp, sx{fromWidth=w', toWidth=w, e=T.LOAD (w', T.ADD(wordTy, e, off), rgn)}) :: stms end ! | (ARG (T.LOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.STK), offset), w', K.GPR)) => let ! (* memory to stack with conversion (gpr) *) ! val tmp = C.newReg () ! in ! T.STORE (w, offSp offset, T.REG (w, tmp), stack) :: ! T.MV (w, tmp, sx{fromWidth=w', toWidth=w, e=T.LOAD (w', T.ADD(wordTy, e, off), rgn)}) :: stms ! end ! | (ARG e, SA.BLOCK_OFFSET(w, (K.GPR), offset)) => let ! (* expression to stack (gpr) *) ! val tmp = C.newReg () ! in ! T.STORE (w, offSp offset, T.REG (w, tmp), stack) :: T.MV (w, tmp, e) :: stms ! end ! | (ARG e, SA.BLOCK_OFFSET(w, (K.STK), offset)) => let (* expression to stack (gpr) *) val tmp = C.newReg () *************** *** 130,134 **** T.STORE (w, offSp offset, T.REG (w, tmp), stack) :: T.MV (w, tmp, e) :: stms end ! | (ARG e, SA.NARROW(SA.BLOCK_OFFSET(w, (K.GPR | K.STK), offset), w', K.GPR)) => let (* expression to stack with conversion (gpr) *) val tmp = C.newReg () --- 162,166 ---- T.STORE (w, offSp offset, T.REG (w, tmp), stack) :: T.MV (w, tmp, e) :: stms end ! | (ARG e, SA.NARROW(SA.BLOCK_OFFSET(w, (K.GPR), offset), w', K.GPR)) => let (* expression to stack with conversion (gpr) *) val tmp = C.newReg () *************** *** 136,140 **** T.STORE (w, offSp offset, T.REG (w, tmp), stack) :: T.MV (w, tmp, sx{fromWidth=w', toWidth=w, e=e}) :: stms end ! | (FARG (e as T.FREG _), SA.BLOCK_OFFSET(w, (K.FPR | K.FSTK), offset)) => (* register to stack (fpr) *) T.FSTORE (w, offSp offset, e, stack) :: stms --- 168,181 ---- T.STORE (w, offSp offset, T.REG (w, tmp), stack) :: T.MV (w, tmp, sx{fromWidth=w', toWidth=w, e=e}) :: stms end ! | (ARG e, SA.NARROW(SA.BLOCK_OFFSET(w, (K.STK), offset), w', K.GPR)) => let ! (* expression to stack with conversion (gpr) *) ! val tmp = C.newReg () ! in ! T.STORE (w, offSp offset, T.REG (w, tmp), stack) :: T.MV (w, tmp, sx{fromWidth=w', toWidth=w, e=e}) :: stms ! end ! | (FARG (e as T.FREG _), SA.BLOCK_OFFSET(w, (K.FPR), offset)) => ! (* register to stack (fpr) *) ! T.FSTORE (w, offSp offset, e, stack) :: stms ! | (FARG (e as T.FREG _), SA.BLOCK_OFFSET(w, (K.FSTK), offset)) => (* register to stack (fpr) *) T.FSTORE (w, offSp offset, e, stack) :: stms *************** *** 148,152 **** (* memory to register (fpr) *) copyToFReg(w, r, T.FLOAD (ty, T.ADD(wordTy, e, off), rgn)) @ stms ! | (ARG (T.LOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.FPR | K.FSTK), offset)) => let (* memory to stack (fpr) *) val tmp = C.newFreg () --- 189,200 ---- (* memory to register (fpr) *) copyToFReg(w, r, T.FLOAD (ty, T.ADD(wordTy, e, off), rgn)) @ stms ! | (ARG (T.LOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.FPR), offset)) => let ! (* memory to stack (fpr) *) ! val tmp = C.newFreg () ! in ! T.FSTORE (w, offSp offset, T.FREG (w, tmp), stack) :: ! T.FMV (w, tmp, T.FLOAD (ty, T.ADD(wordTy, e, off), rgn)) :: stms ! end ! | (ARG (T.LOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.FSTK), offset)) => let (* memory to stack (fpr) *) val tmp = C.newFreg () *************** *** 155,159 **** T.FMV (w, tmp, T.FLOAD (ty, T.ADD(wordTy, e, off), rgn)) :: stms end ! | (ARG (T.LOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.FPR | K.FSTK), offset), w', K.FPR)) => let (* memory to stack with conversion (fpr) *) val tmp = C.newFreg () --- 203,207 ---- T.FMV (w, tmp, T.FLOAD (ty, T.ADD(wordTy, e, off), rgn)) :: stms end ! | (ARG (T.LOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.FPR), offset), w', K.FPR)) => let (* memory to stack with conversion (fpr) *) val tmp = C.newFreg () *************** *** 162,166 **** T.FMV (w', tmp, f2f{fromWidth=w, toWidth=w', e=T.FLOAD (w', T.ADD(wordTy, e, off), rgn)}) :: stms end ! | (FARG (T.FLOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.FPR | K.FSTK), offset)) => let (* memory to stack (fpr) *) val tmp = C.newFreg () --- 210,228 ---- T.FMV (w', tmp, f2f{fromWidth=w, toWidth=w', e=T.FLOAD (w', T.ADD(wordTy, e, off), rgn)}) :: stms end ! | (ARG (T.LOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.FSTK), offset), w', K.FPR)) => let ! (* memory to stack with conversion (fpr) *) ! val tmp = C.newFreg () ! in ! T.FSTORE (w, offSp offset, T.FREG (w, tmp), stack) :: ! T.FMV (w', tmp, f2f{fromWidth=w, toWidth=w', e=T.FLOAD (w', T.ADD(wordTy, e, off), rgn)}) :: stms ! end ! | (FARG (T.FLOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.FSTK), offset)) => let ! (* memory to stack (fpr) *) ! val tmp = C.newFreg () ! in ! T.FSTORE (w, offSp offset, T.FREG (w, tmp), stack) :: ! T.FMV (w, tmp, T.FLOAD (w, T.ADD(wordTy, e, off), rgn)) :: stms ! end ! | (FARG (T.FLOAD (ty, e, rgn)), SA.BLOCK_OFFSET(w, (K.FPR), offset)) => let (* memory to stack (fpr) *) val tmp = C.newFreg () *************** *** 169,173 **** T.FMV (w, tmp, T.FLOAD (w, T.ADD(wordTy, e, off), rgn)) :: stms end ! | (FARG (T.FLOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.FPR | K.FSTK), offset), w', K.FPR)) => let (* memory to stack with conversion (fpr) *) val tmp = C.newFreg () --- 231,235 ---- T.FMV (w, tmp, T.FLOAD (w, T.ADD(wordTy, e, off), rgn)) :: stms end ! | (FARG (T.FLOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.FPR), offset), w', K.FPR)) => let (* memory to stack with conversion (fpr) *) val tmp = C.newFreg () *************** *** 176,180 **** T.FMV (w', tmp, f2f{fromWidth=w, toWidth=w', e=T.FLOAD (w, T.ADD(wordTy, e, off), rgn)}) :: stms end ! | (FARG e, SA.BLOCK_OFFSET(w, (K.FPR | K.FSTK), offset)) => let (* expression to stack (fpr) *) val tmp = C.newFreg () --- 238,255 ---- T.FMV (w', tmp, f2f{fromWidth=w, toWidth=w', e=T.FLOAD (w, T.ADD(wordTy, e, off), rgn)}) :: stms end ! | (FARG (T.FLOAD (ty, e, rgn)), SA.NARROW(SA.BLOCK_OFFSET(w, (K.FSTK), offset), w', K.FPR)) => let ! (* memory to stack with conversion (fpr) *) ! val tmp = C.newFreg () ! in ! T.FSTORE (w, offSp offset, T.FREG (w, tmp), stack) :: ! T.FMV (w', tmp, f2f{fromWidth=w, toWidth=w', e=T.FLOAD (w, T.ADD(wordTy, e, off), rgn)}) :: stms ! end ! | (FARG e, SA.BLOCK_OFFSET(w, (K.FPR), offset)) => let ! (* expression to stack (fpr) *) ! val tmp = C.newFreg () ! in ! T.FSTORE (w, offSp offset, T.FREG (w, tmp), stack) :: T.FMV (w, tmp, e) :: stms ! end ! | (FARG e, SA.BLOCK_OFFSET(w, (K.FSTK), offset)) => let (* expression to stack (fpr) *) val tmp = C.newFreg () *************** *** 182,186 **** T.FSTORE (w, offSp offset, T.FREG (w, tmp), stack) :: T.FMV (w, tmp, e) :: stms end ! | (FARG e, SA.NARROW(SA.BLOCK_OFFSET(w, (K.FPR | K.FSTK), offset), w', K.FPR)) => let (* expression to stack (fpr) *) val tmp = C.newFreg () --- 257,267 ---- T.FSTORE (w, offSp offset, T.FREG (w, tmp), stack) :: T.FMV (w, tmp, e) :: stms end ! | (FARG e, SA.NARROW(SA.BLOCK_OFFSET(w, (K.FPR), offset), w', K.FPR)) => let ! (* expression to stack (fpr) *) ! val tmp = C.newFreg () ! in ! T.FSTORE (w', offSp offset, f2f{fromWidth=w, toWidth=w', e=T.FREG (w, tmp)}, stack) :: T.FMV (w, tmp, e) :: stms ! end ! | (FARG e, SA.NARROW(SA.BLOCK_OFFSET(w, (K.FSTK), offset), w', K.FPR)) => let (* expression to stack (fpr) *) val tmp = C.newFreg () diff -N -C 2 -r MLRISC/c-call/gen/c-call-sig.sml MLRISC-mlton/c-call/gen/c-call-sig.sml *** MLRISC/c-call/gen/c-call-sig.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/c-call/gen/c-call-sig.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 4,8 **** structure T : MLTREE structure Gen : C_CALL_GEN ! where T = T datatype c_arg = datatype Gen.c_arg --- 4,28 ---- structure T : MLTREE structure Gen : C_CALL_GEN ! (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm datatype c_arg = datatype Gen.c_arg diff -N -C 2 -r MLRISC/c-call/gen/c-type.sml MLRISC-mlton/c-call/gen/c-type.sml *** MLRISC/c-call/gen/c-type.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/c-call/gen/c-type.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 43,48 **** (* eliminate aggregates in a C type *) fun flattenCTy cTy = (case cTy ! of (C_STRUCT cTys | ! C_UNION cTys ) => List.concat (List.map flattenCTy cTys) | C_ARRAY (cTy, n) => List.tabulate (n, fn _ => cTy) | cTy => [cTy]) --- 43,48 ---- (* eliminate aggregates in a C type *) fun flattenCTy cTy = (case cTy ! of (C_STRUCT cTys ) => List.concat (List.map flattenCTy cTys) ! | (C_UNION cTys ) => List.concat (List.map flattenCTy cTys) | C_ARRAY (cTy, n) => List.tabulate (n, fn _ => cTy) | cTy => [cTy]) diff -N -C 2 -r MLRISC/c-calls/c-types.sml MLRISC-mlton/c-calls/c-types.sml *** MLRISC/c-calls/c-types.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/c-calls/c-types.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 43,48 **** (* eliminate aggregates in a C type *) fun flattenCTy cTy = (case cTy ! of (C_STRUCT cTys | ! C_UNION cTys ) => List.concat (List.map flattenCTy cTys) | C_ARRAY (cTy, n) => List.tabulate (n, fn _ => cTy) | cTy => [cTy]) --- 43,48 ---- (* eliminate aggregates in a C type *) fun flattenCTy cTy = (case cTy ! of (C_STRUCT cTys ) => List.concat (List.map flattenCTy cTys) ! | (C_UNION cTys ) => List.concat (List.map flattenCTy cTys) | C_ARRAY (cTy, n) => List.tabulate (n, fn _ => cTy) | cTy => [cTy]) diff -N -C 2 -r MLRISC/c-calls/unimplemented-c-calls.sml MLRISC-mlton/c-calls/unimplemented-c-calls.sml *** MLRISC/c-calls/unimplemented-c-calls.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/c-calls/unimplemented-c-calls.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 7,11 **** functor UnimplementedCCallsFn (structure T: MLTREE ! val impossible: string -> 'a) :> C_CALLS where T = T = struct structure T = T --- 7,31 ---- functor UnimplementedCCallsFn (structure T: MLTREE ! val impossible: string -> 'a) :> C_CALLS (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm = struct structure T = T diff -N -C 2 -r MLRISC/cm/proxyLib.cm MLRISC-mlton/cm/proxyLib.cm *** MLRISC/cm/proxyLib.cm 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/cm/proxyLib.cm 2009-10-02 09:51:25.000000000 -0400 *************** *** 0 **** --- 1,61 ---- + Group + group(proxyGrp.cm) + is + proxyGrp.cm + ( + bind:(anchor:ALPHA.cm value:.) + bind:(anchor:ALPHA-GC.cm value:.) + bind:(anchor:ALPHA-Peephole.cm value:.) + bind:(anchor:ALPHA-RTL.cm value:.) + bind:(anchor:ALPHA-Sched.cm value:.) + bind:(anchor:ALPHA-SSA.cm value:.) + bind:(anchor:AMD64.cm value:.) + bind:(anchor:AMD64-GC.cm value:.) + bind:(anchor:AMD64-Peephole.cm value:.) + bind:(anchor:AMD64-RTL.cm value:.) + bind:(anchor:AMD64-Sched.cm value:.) + bind:(anchor:AMD64-SSA.cm value:.) + bind:(anchor:CCall.cm value:.) + bind:(anchor:CCall-sparc.cm value:.) + bind:(anchor:CCall-x86-64.cm value:.) + bind:(anchor:CCall-x86.cm value:.) + bind:(anchor:Control.cm value:.) + bind:(anchor:GC.cm value:.) + bind:(anchor:Graphs.cm value:.) + bind:(anchor:HPPA.cm value:.) + bind:(anchor:HPPA-GC.cm value:.) + bind:(anchor:HPPA-RTL.cm value:.) + bind:(anchor:HPPA-Sched.cm value:.) + bind:(anchor:HPPA-SSA.cm value:.) + bind:(anchor:IA32.cm value:.) + bind:(anchor:IA32-GC.cm value:.) + bind:(anchor:IA32-Peephole.cm value:.) + bind:(anchor:IA32-RTL.cm value:.) + bind:(anchor:IA32-Sched.cm value:.) + bind:(anchor:IA32-SSA.cm value:.) + bind:(anchor:ir-archive.cm value:.) + bind:(anchor:IR.cm value:.) + bind:(anchor:Lib.cm value:.) + bind:(anchor:MIPS.cm value:.) + bind:(anchor:MLRISC.cm value:.) + bind:(anchor:MLTREE.cm value:.) + bind:(anchor:Opt.cm value:.) + bind:(anchor:Peephole.cm value:.) + bind:(anchor:PPC.cm value:.) + bind:(anchor:PPC-GC.cm value:.) + bind:(anchor:PPC-Sched.cm value:.) + bind:(anchor:RA.cm value:.) + bind:(anchor:Region.cm value:.) + bind:(anchor:RTL.cm value:.) + bind:(anchor:Sched.cm value:.) + bind:(anchor:SPARC.cm value:.) + bind:(anchor:SPARC-GC.cm value:.) + bind:(anchor:SPARC-Peephole.cm value:.) + bind:(anchor:SPARC-RTL.cm value:.) + bind:(anchor:SPARC-Sched.cm value:.) + bind:(anchor:SPARC-SSA.cm value:.) + bind:(anchor:SSA.cm value:.) + bind:(anchor:StagedAlloc.cm value:.) + bind:(anchor:Visual.cm value:.) + bind:(anchor:VLIW.cm value:.) + ) diff -N -C 2 -r MLRISC/emit/cfgEmit.sml MLRISC-mlton/emit/cfgEmit.sml *** MLRISC/emit/cfgEmit.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/emit/cfgEmit.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 14,20 **** functor CFGEmit (structure E : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH ! where I = E.I ! and P = E.S.P) : ASSEMBLY_EMITTER = struct structure CFG = CFG --- 14,45 ---- functor CFGEmit (structure E : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH (* where I = E.I and P = E.S.P *) ! where type I.addressing_mode = E.I.addressing_mode ! and type I.ea = E.I.ea ! and type I.instr = E.I.instr ! and type I.instruction = E.I.instruction ! and type I.operand = E.I.operand ! where type P.Client.pseudo_op = E.S.P.Client.pseudo_op ! and type P.T.Basis.cond = E.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = E.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = E.S.P.T.Basis.ext ! and type P.T.Basis.fcond = E.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = E.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = E.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) E.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) E.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) E.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) E.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = E.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = E.S.P.T.Region.region ! and type P.T.ccexp = E.S.P.T.ccexp ! and type P.T.fexp = E.S.P.T.fexp ! (* and type P.T.labexp = E.S.P.T.labexp *) ! and type P.T.mlrisc = E.S.P.T.mlrisc ! and type P.T.oper = E.S.P.T.oper ! and type P.T.rep = E.S.P.T.rep ! and type P.T.rexp = E.S.P.T.rexp ! and type P.T.stm = E.S.P.T.stm ! ) : ASSEMBLY_EMITTER = struct structure CFG = CFG diff -N -C 2 -r MLRISC/flowgraph/buildFlowgraph.sml MLRISC-mlton/flowgraph/buildFlowgraph.sml *** MLRISC/flowgraph/buildFlowgraph.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/buildFlowgraph.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 10,16 **** structure I : INSTRUCTIONS structure P : PSEUDO_OPS ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = P (* * This creates an emitter which can be used to build a CFG incrementally --- 10,41 ---- structure I : INSTRUCTIONS structure P : PSEUDO_OPS ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and P = P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = P.Client.pseudo_op ! and type P.T.Basis.cond = P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = P.T.Basis.ext ! and type P.T.Basis.fcond = P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = P.T.Basis.rounding_mode ! and type P.T.Constant.const = P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) P.T.Extension.sx ! and type P.T.I.div_rounding_mode = P.T.I.div_rounding_mode ! and type P.T.Region.region = P.T.Region.region ! and type P.T.ccexp = P.T.ccexp ! and type P.T.fexp = P.T.fexp ! (* and type P.T.labexp = P.T.labexp *) ! and type P.T.mlrisc = P.T.mlrisc ! and type P.T.oper = P.T.oper ! and type P.T.rep = P.T.rep ! and type P.T.rexp = P.T.rexp ! and type P.T.stm = P.T.stm ! (* * This creates an emitter which can be used to build a CFG incrementally *************** *** 27,33 **** (structure Props : INSN_PROPERTIES structure Stream : INSTRUCTION_STREAM ! structure CFG : CONTROL_FLOW_GRAPH ! where I = Props.I ! and P = Stream.P ) : CONTROL_FLOWGRAPH_GEN = struct --- 52,82 ---- (structure Props : INSN_PROPERTIES structure Stream : INSTRUCTION_STREAM ! structure CFG : CONTROL_FLOW_GRAPH (* where I = Props.I and P = Stream.P *) ! where type I.addressing_mode = Props.I.addressing_mode ! and type I.ea = Props.I.ea ! and type I.instr = Props.I.instr ! and type I.instruction = Props.I.instruction ! and type I.operand = Props.I.operand ! where type P.Client.pseudo_op = Stream.P.Client.pseudo_op ! and type P.T.Basis.cond = Stream.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = Stream.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = Stream.P.T.Basis.ext ! and type P.T.Basis.fcond = Stream.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = Stream.P.T.Basis.rounding_mode ! and type P.T.Constant.const = Stream.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) Stream.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) Stream.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) Stream.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) Stream.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = Stream.P.T.I.div_rounding_mode ! and type P.T.Region.region = Stream.P.T.Region.region ! and type P.T.ccexp = Stream.P.T.ccexp ! and type P.T.fexp = Stream.P.T.fexp ! (* and type P.T.labexp = Stream.P.T.labexp *) ! and type P.T.mlrisc = Stream.P.T.mlrisc ! and type P.T.oper = Stream.P.T.oper ! and type P.T.rep = Stream.P.T.rep ! and type P.T.rexp = Stream.P.T.rexp ! and type P.T.stm = Stream.P.T.stm ) : CONTROL_FLOWGRAPH_GEN = struct diff -N -C 2 -r MLRISC/flowgraph/cfg.sml MLRISC-mlton/flowgraph/cfg.sml *** MLRISC/flowgraph/cfg.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/cfg.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 11,16 **** (structure I : INSTRUCTIONS structure GraphImpl : GRAPH_IMPLEMENTATION ! structure InsnProps : INSN_PROPERTIES where I = I ! structure Asm : INSTRUCTION_EMITTER where I = I ) : CONTROL_FLOW_GRAPH = struct --- 11,26 ---- (structure I : INSTRUCTIONS structure GraphImpl : GRAPH_IMPLEMENTATION ! structure InsnProps : INSN_PROPERTIES (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure Asm : INSTRUCTION_EMITTER (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ) : CONTROL_FLOW_GRAPH = struct *************** *** 315,319 **** let val visited = H.mkTable(23,NotFound) fun chase [] = false ! | chase((u,v,EDGE{k=(FALLSTHRU|BRANCH false),...})::_) = if H.inDomain visited u then false else u = i orelse (H.insert visited (u,true); chase(#in_edges cfg u)) --- 325,332 ---- let val visited = H.mkTable(23,NotFound) fun chase [] = false ! | chase((u,v,EDGE{k= FALLSTHRU,...})::_) = ! if H.inDomain visited u then false ! else u = i orelse (H.insert visited (u,true); chase(#in_edges cfg u)) ! | chase((u,v,EDGE{k= BRANCH false,...})::_) = if H.inDomain visited u then false else u = i orelse (H.insert visited (u,true); chase(#in_edges cfg u)) *************** *** 356,360 **** (case #out_edges cfg node of [] => () ! | [(_,_,EDGE{k=(ENTRY | EXIT),...})] => () | [(i,j,_)] => if InsnProps.instrKind jmp = InsnProps.IK_JUMP then --- 369,374 ---- (case #out_edges cfg node of [] => () ! | [(_,_,EDGE{k=ENTRY,...})] => () ! | [(_,_,EDGE{k=EXIT,...})] => () | [(i,j,_)] => if InsnProps.instrKind jmp = InsnProps.IK_JUMP then *************** *** 389,393 **** fun mergeEdge (CFG as G.GRAPH cfg) (i,j,e as EDGE{w,k,...}) = let val _ = case k of ! (ENTRY | EXIT) => raise Can'tMerge | _ => () val _ = case (#out_edges cfg i,#in_edges cfg j) of --- 403,408 ---- fun mergeEdge (CFG as G.GRAPH cfg) (i,j,e as EDGE{w,k,...}) = let val _ = case k of ! ENTRY => raise Can'tMerge ! | EXIT => raise Can'tMerge | _ => () val _ = case (#out_edges cfg i,#in_edges cfg j) of *************** *** 714,718 **** fun cdgEdge(EDGE{k, ...}) = case k of ! (JUMP | FALLSTHRU) => false | _ => true --- 729,734 ---- fun cdgEdge(EDGE{k, ...}) = case k of ! JUMP => false ! | FALLSTHRU => false | _ => true diff -N -C 2 -r MLRISC/flowgraph/cfgCountCopies.sml MLRISC-mlton/flowgraph/cfgCountCopies.sml *** MLRISC/flowgraph/cfgCountCopies.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/cfgCountCopies.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 5,12 **** functor CFGCountCopies ( structure CFG : CONTROL_FLOW_GRAPH ! structure InsnProps : INSN_PROPERTIES ! where I = CFG.I ! structure SdiJumps : SDI_JUMPS ! where I = CFG.I ) : CFG_OPTIMIZATION = struct --- 5,20 ---- functor CFGCountCopies ( structure CFG : CONTROL_FLOW_GRAPH ! structure InsnProps : INSN_PROPERTIES (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! structure SdiJumps : SDI_JUMPS (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ) : CFG_OPTIMIZATION = struct diff -N -C 2 -r MLRISC/flowgraph/cfgExpandCopies.sml MLRISC-mlton/flowgraph/cfgExpandCopies.sml *** MLRISC/flowgraph/cfgExpandCopies.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/cfgExpandCopies.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 8,13 **** functor CFGExpandCopies (structure CFG : CONTROL_FLOW_GRAPH ! structure Shuffle : SHUFFLE ! where I = CFG.I ) : CFG_OPTIMIZATION = struct --- 8,17 ---- functor CFGExpandCopies (structure CFG : CONTROL_FLOW_GRAPH ! structure Shuffle : SHUFFLE (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ) : CFG_OPTIMIZATION = struct diff -N -C 2 -r MLRISC/flowgraph/cfgPeephole.sml MLRISC-mlton/flowgraph/cfgPeephole.sml *** MLRISC/flowgraph/cfgPeephole.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/cfgPeephole.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 4,9 **** functor CFGPeephole (structure CFG : CONTROL_FLOW_GRAPH ! structure PeepHole : PEEPHOLE ! sharing CFG.I = PeepHole.I ) : CFG_OPTIMIZATION = struct --- 4,13 ---- functor CFGPeephole (structure CFG : CONTROL_FLOW_GRAPH ! structure PeepHole : PEEPHOLE (* sharing CFG.I = PeepHole.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ) : CFG_OPTIMIZATION = struct diff -N -C 2 -r MLRISC/flowgraph/printFlowgraph.sml MLRISC-mlton/flowgraph/printFlowgraph.sml *** MLRISC/flowgraph/printFlowgraph.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/printFlowgraph.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 6,12 **** sig structure Asm : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH ! where I = Asm.I ! and P = Asm.S.P val printCFG : TextIO.outstream -> string -> CFG.cfg -> unit --- 6,36 ---- sig structure Asm : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH (* where I = Asm.I and P = Asm.S.P *) ! where type I.addressing_mode = Asm.I.addressing_mode ! and type I.ea = Asm.I.ea ! and type I.instr = Asm.I.instr ! and type I.instruction = Asm.I.instruction ! and type I.operand = Asm.I.operand ! where type P.Client.pseudo_op = Asm.S.P.Client.pseudo_op ! and type P.T.Basis.cond = Asm.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = Asm.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = Asm.S.P.T.Basis.ext ! and type P.T.Basis.fcond = Asm.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = Asm.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = Asm.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) Asm.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) Asm.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) Asm.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) Asm.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = Asm.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = Asm.S.P.T.Region.region ! and type P.T.ccexp = Asm.S.P.T.ccexp ! and type P.T.fexp = Asm.S.P.T.fexp ! (* and type P.T.labexp = Asm.S.P.T.labexp *) ! and type P.T.mlrisc = Asm.S.P.T.mlrisc ! and type P.T.oper = Asm.S.P.T.oper ! and type P.T.rep = Asm.S.P.T.rep ! and type P.T.rexp = Asm.S.P.T.rexp ! and type P.T.stm = Asm.S.P.T.stm val printCFG : TextIO.outstream -> string -> CFG.cfg -> unit *************** *** 16,22 **** functor PrintFlowgraph (structure Asm : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH ! where I = Asm.I ! and P = Asm.S.P ) : PRINT_FLOWGRAPH = struct --- 40,70 ---- functor PrintFlowgraph (structure Asm : INSTRUCTION_EMITTER ! structure CFG : CONTROL_FLOW_GRAPH (* where I = Asm.I and P = Asm.S.P *) ! where type I.addressing_mode = Asm.I.addressing_mode ! and type I.ea = Asm.I.ea ! and type I.instr = Asm.I.instr ! and type I.instruction = Asm.I.instruction ! and type I.operand = Asm.I.operand ! where type P.Client.pseudo_op = Asm.S.P.Client.pseudo_op ! and type P.T.Basis.cond = Asm.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = Asm.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = Asm.S.P.T.Basis.ext ! and type P.T.Basis.fcond = Asm.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = Asm.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = Asm.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) Asm.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) Asm.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) Asm.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) Asm.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = Asm.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = Asm.S.P.T.Region.region ! and type P.T.ccexp = Asm.S.P.T.ccexp ! and type P.T.fexp = Asm.S.P.T.fexp ! (* and type P.T.labexp = Asm.S.P.T.labexp *) ! and type P.T.mlrisc = Asm.S.P.T.mlrisc ! and type P.T.oper = Asm.S.P.T.oper ! and type P.T.rep = Asm.S.P.T.rep ! and type P.T.rexp = Asm.S.P.T.rexp ! and type P.T.stm = Asm.S.P.T.stm ) : PRINT_FLOWGRAPH = struct diff -N -C 2 -r MLRISC/flowgraph/pseudo-ops-big.sml MLRISC-mlton/flowgraph/pseudo-ops-big.sml *** MLRISC/flowgraph/pseudo-ops-big.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/pseudo-ops-big.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 8,13 **** functor PseudoOpsBig ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL ! where T = T val icache_alignment : int (* cache line size *) val max_alignment : int option (* maximum alignment for internal labels *) --- 8,32 ---- functor PseudoOpsBig ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm val icache_alignment : int (* cache line size *) val max_alignment : int option (* maximum alignment for internal labels *) diff -N -C 2 -r MLRISC/flowgraph/pseudo-ops-little.sml MLRISC-mlton/flowgraph/pseudo-ops-little.sml *** MLRISC/flowgraph/pseudo-ops-little.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/pseudo-ops-little.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 8,13 **** functor PseudoOpsLittle ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL ! where T = T val icache_alignment : int (* cache line size *) val max_alignment : int option (* maximum alignment for internal labels *) --- 8,32 ---- functor PseudoOpsLittle ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm val icache_alignment : int (* cache line size *) val max_alignment : int option (* maximum alignment for internal labels *) diff -N -C 2 -r MLRISC/flowgraph/pseudo-ops.sig MLRISC-mlton/flowgraph/pseudo-ops.sig *** MLRISC/flowgraph/pseudo-ops.sig 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/flowgraph/pseudo-ops.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 9,13 **** signature PSEUDO_OPS = sig structure T : MLTREE ! structure Client : CLIENT_PSEUDO_OPS where AsmPseudoOps.T = T type pseudo_op = (T.labexp, Client.pseudo_op) PseudoOpsBasisTyp.pseudo_op --- 9,33 ---- signature PSEUDO_OPS = sig structure T : MLTREE ! structure Client : CLIENT_PSEUDO_OPS (* where AsmPseudoOps.T = T *) ! where type AsmPseudoOps.T.Basis.cond = T.Basis.cond ! and type AsmPseudoOps.T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type AsmPseudoOps.T.Basis.ext = T.Basis.ext ! and type AsmPseudoOps.T.Basis.fcond = T.Basis.fcond ! and type AsmPseudoOps.T.Basis.rounding_mode = T.Basis.rounding_mode ! and type AsmPseudoOps.T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) AsmPseudoOps.T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) AsmPseudoOps.T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) AsmPseudoOps.T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) AsmPseudoOps.T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type AsmPseudoOps.T.I.div_rounding_mode = T.I.div_rounding_mode ! and type AsmPseudoOps.T.Region.region = T.Region.region ! and type AsmPseudoOps.T.ccexp = T.ccexp ! and type AsmPseudoOps.T.fexp = T.fexp ! (* and type AsmPseudoOps.T.labexp = T.labexp *) ! and type AsmPseudoOps.T.mlrisc = T.mlrisc ! and type AsmPseudoOps.T.oper = T.oper ! and type AsmPseudoOps.T.rep = T.rep ! and type AsmPseudoOps.T.rexp = T.rexp ! and type AsmPseudoOps.T.stm = T.stm type pseudo_op = (T.labexp, Client.pseudo_op) PseudoOpsBasisTyp.pseudo_op diff -N -C 2 -r MLRISC/frequencies/compute-freqs-fn.sml MLRISC-mlton/frequencies/compute-freqs-fn.sml *** MLRISC/frequencies/compute-freqs-fn.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/frequencies/compute-freqs-fn.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 41,47 **** (***** Representation of equations *****) type var = Graph.node_id datatype def = Unknown | Sum of sum - withtype term = (real * var) - and sum = {terms : term list, c : real} val zero = {c = 0.0, terms = []} --- 41,47 ---- (***** Representation of equations *****) type var = Graph.node_id + type term = (real * var) + type sum = {terms : term list, c : real} datatype def = Unknown | Sum of sum val zero = {c = 0.0, terms = []} diff -N -C 2 -r MLRISC/gc-safety/gc-cells.sig MLRISC-mlton/gc-safety/gc-cells.sig *** MLRISC/gc-safety/gc-cells.sig 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/gc-safety/gc-cells.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 9,13 **** structure C : CELLS structure GC : GC_TYPE ! structure CB : CELLS_BASIS = CellsBasis (* Generate a virtual register and update the gc info at the same time. *) --- 9,22 ---- structure C : CELLS structure GC : GC_TYPE ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo (* Generate a virtual register and update the gc info at the same time. *) diff -N -C 2 -r MLRISC/graphs/bigraph.sig MLRISC-mlton/graphs/bigraph.sig *** MLRISC/graphs/bigraph.sig 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/graphs/bigraph.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 10,15 **** include GRAPH ! datatype ('m,'n,'e,'g) bigraph = BIGRAPH of ('m,'n,'e,'g) bigraph_methods ! withtype ('m,'n,'e,'g) bigraph_methods = { name : string, graph_info : 'g, --- 10,14 ---- include GRAPH ! type ('m,'n,'e,'g) bigraph_methods = { name : string, graph_info : 'g, *************** *** 51,54 **** --- 50,54 ---- forall_edges : ('e edge -> unit) -> unit } + datatype ('m,'n,'e,'g) bigraph = BIGRAPH of ('m,'n,'e,'g) bigraph_methods end diff -N -C 2 -r MLRISC/graphs/digraph.sml MLRISC-mlton/graphs/digraph.sml *** MLRISC/graphs/digraph.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/graphs/digraph.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 8,12 **** *) ! functor DirectedGraph(A : ARRAY) : sig include GRAPH_IMPLEMENTATION --- 8,38 ---- *) ! functor DirectedGraph(A : sig type 'a array ! type 'a vector ! ! val all: ('a -> bool) -> 'a array -> bool ! val app: ('a -> unit) -> 'a array -> unit ! val appi: (int * 'a -> unit) -> 'a array -> unit ! val array: int * 'a -> 'a array ! val collate: ('a * 'a -> order) -> 'a array * 'a array -> order ! val copy: {src: 'a array, dst: 'a array, di: int} -> unit ! val copyVec: {src: 'a vector, dst: 'a array, di: int} -> unit ! val exists: ('a -> bool) -> 'a array -> bool ! val find: ('a -> bool) -> 'a array -> 'a option ! val findi: (int * 'a -> bool) -> 'a array -> (int * 'a) option ! val foldl: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldr: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val fromList: 'a list -> 'a array ! val length: 'a array -> int ! val maxLen: int ! val modify: ('a -> 'a) -> 'a array -> unit ! val modifyi: (int * 'a -> 'a) -> 'a array -> unit ! val sub: 'a array * int -> 'a ! val tabulate: int * (int -> 'a) -> 'a array ! val update: 'a array * int * 'a -> unit ! val vector: 'a array -> 'a vector ! end) : sig include GRAPH_IMPLEMENTATION diff -N -C 2 -r MLRISC/graphs/graph.sig MLRISC-mlton/graphs/graph.sig *** MLRISC/graphs/graph.sig 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/graphs/graph.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 26,31 **** type 'e edge = node_id * node_id * 'e ! datatype ('n,'e,'g) graph = GRAPH of ('n,'e,'g) graph_methods ! withtype ('n,'e,'g) graph_methods = { name : string, graph_info : 'g, --- 26,30 ---- type 'e edge = node_id * node_id * 'e ! type ('n,'e,'g) graph_methods = { name : string, graph_info : 'g, *************** *** 66,69 **** --- 65,69 ---- forall_edges : ('e edge -> unit) -> unit } + datatype ('n,'e,'g) graph = GRAPH of ('n,'e,'g) graph_methods val unimplemented : 'a -> 'b diff -N -C 2 -r MLRISC/hppa/backpatch/hppaDelaySlotProps.sml MLRISC-mlton/hppa/backpatch/hppaDelaySlotProps.sml *** MLRISC/hppa/backpatch/hppaDelaySlotProps.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/backpatch/hppaDelaySlotProps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 5,9 **** functor HppaDelaySlots (structure I : HPPAINSTR ! structure P : INSN_PROPERTIES where I = I ) : DELAY_SLOT_PROPERTIES = struct --- 5,14 ---- functor HppaDelaySlots (structure I : HPPAINSTR ! structure P : INSN_PROPERTIES (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ) : DELAY_SLOT_PROPERTIES = struct *************** *** 101,109 **** end ! fun delaySlotCandidate{jmp,delaySlot= ! ( I.INSTR(I.BCOND _) | I.INSTR(I.BCONDI _) | I.INSTR(I.BB _) | I.INSTR(I.FBRANCH _) ! | I.INSTR(I.BV _) | I.INSTR(I.BE _) | I.INSTR(I.COMCLR_LDO _) | I.INSTR(I.COMICLR_LDO _) ! | I.INSTR(I.B _) | I.INSTR(I.LONGJUMP _) | I.INSTR(I.BLR _) | I.INSTR(I.BL _) ! | I.INSTR(I.BLE _))} = false | delaySlotCandidate{jmp=I.ANNOTATION{i,...},delaySlot} = delaySlotCandidate{jmp=i,delaySlot=delaySlot} --- 106,122 ---- end ! fun delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BCOND _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BCONDI _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BB _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.FBRANCH _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BV _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BE _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.COMCLR_LDO _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.COMICLR_LDO _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.B _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.LONGJUMP _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BLR _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BL _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BLE _)} = false | delaySlotCandidate{jmp=I.ANNOTATION{i,...},delaySlot} = delaySlotCandidate{jmp=i,delaySlot=delaySlot} diff -N -C 2 -r MLRISC/hppa/backpatch/hppaJumps.sml MLRISC-mlton/hppa/backpatch/hppaJumps.sml *** MLRISC/hppa/backpatch/hppaJumps.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/backpatch/hppaJumps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,13 **** functor HppaJumps ( structure Instr:HPPAINSTR ! structure Shuffle:HPPASHUFFLE ! where I = Instr ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T ) : SDI_JUMPS = struct --- 6,78 ---- functor HppaJumps ( structure Instr:HPPAINSTR ! structure Shuffle:HPPASHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! and type I.addressing_mode = Instr.addressing_mode ! and type I.arith = Instr.arith ! and type I.arithi = Instr.arithi ! and type I.bcond = Instr.bcond ! and type I.bitcond = Instr.bitcond ! and type I.cmp = Instr.cmp ! and type I.cmpi = Instr.cmpi ! and type I.ea = Instr.ea ! and type I.farith = Instr.farith ! and type I.fcnv = Instr.fcnv ! and type I.fcond = Instr.fcond ! and type I.field_selector = Instr.field_selector ! and type I.fload = Instr.fload ! and type I.floadx = Instr.floadx ! and type I.fmt = Instr.fmt ! and type I.fstore = Instr.fstore ! and type I.fstorex = Instr.fstorex ! and type I.funary = Instr.funary ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.load = Instr.load ! and type I.loadi = Instr.loadi ! and type I.operand = Instr.operand ! and type I.scond = Instr.scond ! and type I.shift = Instr.shift ! and type I.shiftv = Instr.shiftv ! and type I.store = Instr.store ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : SDI_JUMPS = struct diff -N -C 2 -r MLRISC/hppa/emit/hppaAsm.sml MLRISC-mlton/hppa/emit/hppaAsm.sml *** MLRISC/hppa/emit/hppaAsm.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/emit/hppaAsm.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,16 **** functor HppaAsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : HPPAINSTR ! where T = S.P.T ! structure Shuffle : HPPASHUFFLE ! where I = Instr ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T ) : INSTRUCTION_EMITTER = struct --- 7,100 ---- functor HppaAsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : HPPAINSTR (* where T = S.P.T *) ! where type T.Basis.cond = S.P.T.Basis.cond ! and type T.Basis.div_rounding_mode = S.P.T.Basis.div_rounding_mode ! and type T.Basis.ext = S.P.T.Basis.ext ! and type T.Basis.fcond = S.P.T.Basis.fcond ! and type T.Basis.rounding_mode = S.P.T.Basis.rounding_mode ! and type T.Constant.const = S.P.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) S.P.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) S.P.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) S.P.T.Extension.sx ! and type T.I.div_rounding_mode = S.P.T.I.div_rounding_mode ! and type T.Region.region = S.P.T.Region.region ! and type T.ccexp = S.P.T.ccexp ! and type T.fexp = S.P.T.fexp ! (* and type T.labexp = S.P.T.labexp *) ! and type T.mlrisc = S.P.T.mlrisc ! and type T.oper = S.P.T.oper ! and type T.rep = S.P.T.rep ! and type T.rexp = S.P.T.rexp ! and type T.stm = S.P.T.stm ! structure Shuffle : HPPASHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! and type I.addressing_mode = Instr.addressing_mode ! and type I.arith = Instr.arith ! and type I.arithi = Instr.arithi ! and type I.bcond = Instr.bcond ! and type I.bitcond = Instr.bitcond ! and type I.cmp = Instr.cmp ! and type I.cmpi = Instr.cmpi ! and type I.ea = Instr.ea ! and type I.farith = Instr.farith ! and type I.fcnv = Instr.fcnv ! and type I.fcond = Instr.fcond ! and type I.field_selector = Instr.field_selector ! and type I.fload = Instr.fload ! and type I.floadx = Instr.floadx ! and type I.fmt = Instr.fmt ! and type I.fstore = Instr.fstore ! and type I.fstorex = Instr.fstorex ! and type I.funary = Instr.funary ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.load = Instr.load ! and type I.loadi = Instr.loadi ! and type I.operand = Instr.operand ! and type I.scond = Instr.scond ! and type I.shift = Instr.shift ! and type I.shiftv = Instr.shiftv ! and type I.store = Instr.store ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : INSTRUCTION_EMITTER = struct diff -N -C 2 -r MLRISC/hppa/emit/hppaMC.sml MLRISC-mlton/hppa/emit/hppaMC.sml *** MLRISC/hppa/emit/hppaMC.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/emit/hppaMC.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,11 **** functor HppaMCEmitter(structure Instr : HPPAINSTR ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T structure Stream : INSTRUCTION_STREAM structure CodeString : CODE_STRING --- 7,31 ---- functor HppaMCEmitter(structure Instr : HPPAINSTR ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm structure Stream : INSTRUCTION_STREAM structure CodeString : CODE_STRING *************** *** 48,51 **** --- 68,72 ---- fun eByteW w = let val i = !loc + val w = W.toLargeWord w in loc := i + 1; CodeString.update(i,Word8.fromLargeWord w) end diff -N -C 2 -r MLRISC/hppa/flowgraph/hppaGasPseudoOps.sml MLRISC-mlton/hppa/flowgraph/hppaGasPseudoOps.sml *** MLRISC/hppa/flowgraph/hppaGasPseudoOps.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/flowgraph/hppaGasPseudoOps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,5 **** functor HppaGasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ) : PSEUDO_OPS_BASIS = --- 1,25 ---- functor HppaGasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ) : PSEUDO_OPS_BASIS = diff -N -C 2 -r MLRISC/hppa/instructions/hppaInstr.sml MLRISC-mlton/hppa/instructions/hppaInstr.sml *** MLRISC/hppa/instructions/hppaInstr.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/instructions/hppaInstr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 9,13 **** sig structure C : HPPACELLS ! structure CB : CELLS_BASIS = CellsBasis structure T : MLTREE structure Constant: CONSTANT --- 9,22 ---- sig structure C : HPPACELLS ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo structure T : MLTREE structure Constant: CONSTANT diff -N -C 2 -r MLRISC/hppa/instructions/hppaProps.sml MLRISC-mlton/hppa/instructions/hppaProps.sml *** MLRISC/hppa/instructions/hppaProps.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/instructions/hppaProps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,12 **** functor HppaProps ( structure HppaInstr : HPPAINSTR ! structure MLTreeEval : MLTREE_EVAL where T = HppaInstr.T ! structure MLTreeHash : MLTREE_HASH where T = HppaInstr.T ) : INSN_PROPERTIES = struct --- 7,52 ---- functor HppaProps ( structure HppaInstr : HPPAINSTR ! structure MLTreeEval : MLTREE_EVAL (* where T = HppaInstr.T *) ! where type T.Basis.cond = HppaInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = HppaInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = HppaInstr.T.Basis.ext ! and type T.Basis.fcond = HppaInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = HppaInstr.T.Basis.rounding_mode ! and type T.Constant.const = HppaInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) HppaInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) HppaInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) HppaInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) HppaInstr.T.Extension.sx ! and type T.I.div_rounding_mode = HppaInstr.T.I.div_rounding_mode ! and type T.Region.region = HppaInstr.T.Region.region ! and type T.ccexp = HppaInstr.T.ccexp ! and type T.fexp = HppaInstr.T.fexp ! (* and type T.labexp = HppaInstr.T.labexp *) ! and type T.mlrisc = HppaInstr.T.mlrisc ! and type T.oper = HppaInstr.T.oper ! and type T.rep = HppaInstr.T.rep ! and type T.rexp = HppaInstr.T.rexp ! and type T.stm = HppaInstr.T.stm ! structure MLTreeHash : MLTREE_HASH (* where T = HppaInstr.T *) ! where type T.Basis.cond = HppaInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = HppaInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = HppaInstr.T.Basis.ext ! and type T.Basis.fcond = HppaInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = HppaInstr.T.Basis.rounding_mode ! and type T.Constant.const = HppaInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) HppaInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) HppaInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) HppaInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) HppaInstr.T.Extension.sx ! and type T.I.div_rounding_mode = HppaInstr.T.I.div_rounding_mode ! and type T.Region.region = HppaInstr.T.Region.region ! and type T.ccexp = HppaInstr.T.ccexp ! and type T.fexp = HppaInstr.T.fexp ! (* and type T.labexp = HppaInstr.T.labexp *) ! and type T.mlrisc = HppaInstr.T.mlrisc ! and type T.oper = HppaInstr.T.oper ! and type T.rep = HppaInstr.T.rep ! and type T.rexp = HppaInstr.T.rexp ! and type T.stm = HppaInstr.T.stm ) : INSN_PROPERTIES = struct *************** *** 207,213 **** fun defUseR instr = let fun hppaDU instr = let ! fun trap((I.ADDO | I.SUBO | I.SH1ADDO), d, u) = (d, u) | trap(_, d, u) = (d, u) ! fun trapi((I.ADDIO | I.SUBIO), d, u) = (d, u) | trapi(_, d, u) = (d, u) in --- 247,256 ---- fun defUseR instr = let fun hppaDU instr = let ! fun trap(I.ADDO, d, u) = (d, u) ! | trap(I.SUBO, d, u) = (d, u) ! | trap(I.SH1ADDO, d, u) = (d, u) | trap(_, d, u) = (d, u) ! fun trapi(I.ADDIO, d, u) = (d, u) ! | trapi(I.SUBIO, d, u) = (d, u) | trapi(_, d, u) = (d, u) in diff -N -C 2 -r MLRISC/hppa/mltree/hppa.sml MLRISC-mlton/hppa/mltree/hppa.sml *** MLRISC/hppa/mltree/hppa.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/mltree/hppa.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 15,26 **** functor Hppa (structure HppaInstr : HPPAINSTR ! structure ExtensionComp : MLTREE_EXTENSION_COMP ! where I = HppaInstr ! and T = HppaInstr.T ! structure MilliCode : HPPA_MILLICODE ! where I = HppaInstr ! structure LabelComp : LABEL_COMP ! where I = HppaInstr ! and T = HppaInstr.T val costOfMultiply : int ref val costOfDivision : int ref --- 15,118 ---- functor Hppa (structure HppaInstr : HPPAINSTR ! structure ExtensionComp : MLTREE_EXTENSION_COMP (* where I = HppaInstr and T = HppaInstr.T *) ! where type I.addressing_mode = HppaInstr.addressing_mode ! and type I.ea = HppaInstr.ea ! and type I.instr = HppaInstr.instr ! and type I.instruction = HppaInstr.instruction ! and type I.operand = HppaInstr.operand ! where type T.Basis.cond = HppaInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = HppaInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = HppaInstr.T.Basis.ext ! and type T.Basis.fcond = HppaInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = HppaInstr.T.Basis.rounding_mode ! and type T.Constant.const = HppaInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) HppaInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) HppaInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) HppaInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) HppaInstr.T.Extension.sx ! and type T.I.div_rounding_mode = HppaInstr.T.I.div_rounding_mode ! and type T.Region.region = HppaInstr.T.Region.region ! and type T.ccexp = HppaInstr.T.ccexp ! and type T.fexp = HppaInstr.T.fexp ! (* and type T.labexp = HppaInstr.T.labexp *) ! and type T.mlrisc = HppaInstr.T.mlrisc ! and type T.oper = HppaInstr.T.oper ! and type T.rep = HppaInstr.T.rep ! and type T.rexp = HppaInstr.T.rexp ! and type T.stm = HppaInstr.T.stm ! structure MilliCode : HPPA_MILLICODE (* where I = HppaInstr *) ! where type I.Constant.const = HppaInstr.Constant.const ! and type I.Region.region = HppaInstr.Region.region ! and type I.T.Basis.cond = HppaInstr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = HppaInstr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = HppaInstr.T.Basis.ext ! and type I.T.Basis.fcond = HppaInstr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = HppaInstr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) HppaInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) HppaInstr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) HppaInstr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) HppaInstr.T.Extension.sx ! and type I.T.I.div_rounding_mode = HppaInstr.T.I.div_rounding_mode ! and type I.T.ccexp = HppaInstr.T.ccexp ! and type I.T.fexp = HppaInstr.T.fexp ! (* and type I.T.labexp = HppaInstr.T.labexp *) ! and type I.T.mlrisc = HppaInstr.T.mlrisc ! and type I.T.oper = HppaInstr.T.oper ! and type I.T.rep = HppaInstr.T.rep ! and type I.T.rexp = HppaInstr.T.rexp ! and type I.T.stm = HppaInstr.T.stm ! and type I.addressing_mode = HppaInstr.addressing_mode ! and type I.arith = HppaInstr.arith ! and type I.arithi = HppaInstr.arithi ! and type I.bcond = HppaInstr.bcond ! and type I.bitcond = HppaInstr.bitcond ! and type I.cmp = HppaInstr.cmp ! and type I.cmpi = HppaInstr.cmpi ! and type I.ea = HppaInstr.ea ! and type I.farith = HppaInstr.farith ! and type I.fcnv = HppaInstr.fcnv ! and type I.fcond = HppaInstr.fcond ! and type I.field_selector = HppaInstr.field_selector ! and type I.fload = HppaInstr.fload ! and type I.floadx = HppaInstr.floadx ! and type I.fmt = HppaInstr.fmt ! and type I.fstore = HppaInstr.fstore ! and type I.fstorex = HppaInstr.fstorex ! and type I.funary = HppaInstr.funary ! and type I.instr = HppaInstr.instr ! and type I.instruction = HppaInstr.instruction ! and type I.load = HppaInstr.load ! and type I.loadi = HppaInstr.loadi ! and type I.operand = HppaInstr.operand ! and type I.scond = HppaInstr.scond ! and type I.shift = HppaInstr.shift ! and type I.shiftv = HppaInstr.shiftv ! and type I.store = HppaInstr.store ! structure LabelComp : LABEL_COMP (* where I = HppaInstr and T = HppaInstr.T *) ! where type I.addressing_mode = HppaInstr.addressing_mode ! and type I.ea = HppaInstr.ea ! and type I.instr = HppaInstr.instr ! and type I.instruction = HppaInstr.instruction ! and type I.operand = HppaInstr.operand ! where type T.Basis.cond = HppaInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = HppaInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = HppaInstr.T.Basis.ext ! and type T.Basis.fcond = HppaInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = HppaInstr.T.Basis.rounding_mode ! and type T.Constant.const = HppaInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) HppaInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) HppaInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) HppaInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) HppaInstr.T.Extension.sx ! and type T.I.div_rounding_mode = HppaInstr.T.I.div_rounding_mode ! and type T.Region.region = HppaInstr.T.Region.region ! and type T.ccexp = HppaInstr.T.ccexp ! and type T.fexp = HppaInstr.T.fexp ! (* and type T.labexp = HppaInstr.T.labexp *) ! and type T.mlrisc = HppaInstr.T.mlrisc ! and type T.oper = HppaInstr.T.oper ! and type T.rep = HppaInstr.T.rep ! and type T.rexp = HppaInstr.T.rexp ! and type T.stm = HppaInstr.T.stm val costOfMultiply : int ref val costOfDivision : int ref *************** *** 53,57 **** I.COPY{k=CB.FP, sz=64, dst=dst, src=src, tmp=tmp} structure W = Word32 ! functor Multiply32 = MLTreeMult (structure I = I structure T = T --- 145,151 ---- I.COPY{k=CB.FP, sz=64, dst=dst, src=src, tmp=tmp} structure W = Word32 ! ! (* signed, trapping version of multiply and divide *) ! structure Mult32 = MLTreeMult (structure I = I structure T = T *************** *** 66,74 **** fun srli{r,i,d} = [I.shift{s=I.EXTRU,r=r,p=31-i,len=32-i,t=d}] fun srai{r,i,d} = [I.shift{s=I.EXTRS,r=r,p=31-i,len=32-i,t=d}] ! ) ! ! (* signed, trapping version of multiply and divide *) ! structure Mult32 = Multiply32 ! (val trapping = true val multCost = costOfMultiply val divCost = costOfDivision --- 160,165 ---- fun srli{r,i,d} = [I.shift{s=I.EXTRU,r=r,p=31-i,len=32-i,t=d}] fun srai{r,i,d} = [I.shift{s=I.EXTRS,r=r,p=31-i,len=32-i,t=d}] ! ! val trapping = true val multCost = costOfMultiply val divCost = costOfDivision *************** *** 78,87 **** val sh2addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH2ADDO,r1=r1,r2=r2,t=d}]) val sh3addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH3ADDO,r1=r1,r2=r2,t=d}]) ! ) ! (val signed = true) (* unsigned, non-trapping version of multiply and divide *) ! structure Mulu32 = Multiply32 ! (val trapping = false val multCost = costOfMultiply val divCost = costOfDivision --- 169,191 ---- val sh2addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH2ADDO,r1=r1,r2=r2,t=d}]) val sh3addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH3ADDO,r1=r1,r2=r2,t=d}]) ! ! val signed = true) (* unsigned, non-trapping version of multiply and divide *) ! structure Mulu32 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CB ! val intTy = 32 ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! ! fun mov{r,d} = mkcopy{dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d} = I.arith{a=I.ADD,r1=r1,r2=r2,t=d} ! fun slli{r,i,d} = [I.shift{s=I.ZDEP,r=r,p=31-i,len=32-i,t=d}] ! fun srli{r,i,d} = [I.shift{s=I.EXTRU,r=r,p=31-i,len=32-i,t=d}] ! fun srai{r,i,d} = [I.shift{s=I.EXTRS,r=r,p=31-i,len=32-i,t=d}] ! ! val trapping = false val multCost = costOfMultiply val divCost = costOfDivision *************** *** 91,100 **** val sh2addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH2ADDL,r1=r1,r2=r2,t=d}]) val sh3addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH3ADDL,r1=r1,r2=r2,t=d}]) ! ) ! (val signed = false) (* signed, non-trapping version of multiply and divide *) ! structure Muls32 = Multiply32 ! (val trapping = false val multCost = costOfMultiply val divCost = costOfDivision --- 195,217 ---- val sh2addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH2ADDL,r1=r1,r2=r2,t=d}]) val sh3addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH3ADDL,r1=r1,r2=r2,t=d}]) ! ! val signed = false) (* signed, non-trapping version of multiply and divide *) ! structure Muls32 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CB ! val intTy = 32 ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! ! fun mov{r,d} = mkcopy{dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d} = I.arith{a=I.ADD,r1=r1,r2=r2,t=d} ! fun slli{r,i,d} = [I.shift{s=I.ZDEP,r=r,p=31-i,len=32-i,t=d}] ! fun srli{r,i,d} = [I.shift{s=I.EXTRU,r=r,p=31-i,len=32-i,t=d}] ! fun srai{r,i,d} = [I.shift{s=I.EXTRS,r=r,p=31-i,len=32-i,t=d}] ! ! val trapping = false val multCost = costOfMultiply val divCost = costOfDivision *************** *** 104,109 **** val sh2addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH2ADDL,r1=r1,r2=r2,t=d}]) val sh3addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH3ADDL,r1=r1,r2=r2,t=d}]) ! ) ! (val signed = true) fun error msg = MLRiscErrorMsg.error("Hppa",msg) --- 221,226 ---- val sh2addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH2ADDL,r1=r1,r2=r2,t=d}]) val sh3addv = SOME(fn{r1,r2,d} => [I.arith{a=I.SH3ADDL,r1=r1,r2=r2,t=d}]) ! ! val signed = true) fun error msg = MLRiscErrorMsg.error("Hppa",msg) diff -N -C 2 -r MLRISC/hppa/mltree/hppaMillicode.sig MLRISC-mlton/hppa/mltree/hppaMillicode.sig *** MLRISC/hppa/mltree/hppaMillicode.sig 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/hppa/mltree/hppaMillicode.sig 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,5 **** signature HPPA_MILLICODE = sig structure I : HPPAINSTR ! structure CB : CELLS_BASIS = CellsBasis val divu : {rs:CB.cell, rt:CB.cell, rd:CB.cell} -> I.instruction list --- 1,14 ---- signature HPPA_MILLICODE = sig structure I : HPPAINSTR ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo val divu : {rs:CB.cell, rt:CB.cell, rd:CB.cell} -> I.instruction list diff -N -C 2 -r MLRISC/instructions/insnProps.sig MLRISC-mlton/instructions/insnProps.sig *** MLRISC/instructions/insnProps.sig 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/instructions/insnProps.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 8,12 **** structure I : INSTRUCTIONS structure C : CELLS ! sharing I.C = C (* classify instructions *) --- 8,12 ---- structure I : INSTRUCTIONS structure C : CELLS ! (* sharing I.C = C *) (* classify instructions *) diff -N -C 2 -r MLRISC/instructions/instructions.sig MLRISC-mlton/instructions/instructions.sig *** MLRISC/instructions/instructions.sig 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/instructions/instructions.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 9,13 **** sig structure C : CELLS ! structure CB :CELLS_BASIS = CellsBasis type operand (* operands supported by architecture *) type addressing_mode (* addressing mode *) --- 9,22 ---- sig structure C : CELLS ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo type operand (* operands supported by architecture *) type addressing_mode (* addressing mode *) diff -N -C 2 -r MLRISC/instructions/mlriscAnnotations.sig MLRISC-mlton/instructions/mlriscAnnotations.sig *** MLRISC/instructions/mlriscAnnotations.sig 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/instructions/mlriscAnnotations.sig 2009-10-02 09:51:25.000000000 -0400 *************** *** 16,20 **** sig ! structure C : CELLS_BASIS = CellsBasis (* --- 16,29 ---- sig ! structure C : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo (* diff -N -C 2 -r MLRISC/library/dynamic-array.sml MLRISC-mlton/library/dynamic-array.sml *** MLRISC/library/dynamic-array.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/library/dynamic-array.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 6,10 **** structure DynArray : ! sig include ARRAY val fromArray : 'a Array.array * 'a * int -> 'a array val baseArray : 'a array -> 'a Array.array --- 6,36 ---- structure DynArray : ! sig type 'a array ! type 'a vector ! ! val all: ('a -> bool) -> 'a array -> bool ! val app: ('a -> unit) -> 'a array -> unit ! val appi: (int * 'a -> unit) -> 'a array -> unit ! val array: int * 'a -> 'a array ! val collate: ('a * 'a -> order) -> 'a array * 'a array -> order ! val copy: {src: 'a array, dst: 'a array, di: int} -> unit ! val copyVec: {src: 'a vector, dst: 'a array, di: int} -> unit ! val exists: ('a -> bool) -> 'a array -> bool ! val find: ('a -> bool) -> 'a array -> 'a option ! val findi: (int * 'a -> bool) -> 'a array -> (int * 'a) option ! val foldl: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldr: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val fromList: 'a list -> 'a array ! val length: 'a array -> int ! val maxLen: int ! val modify: ('a -> 'a) -> 'a array -> unit ! val modifyi: (int * 'a -> 'a) -> 'a array -> unit ! val sub: 'a array * int -> 'a ! val tabulate: int * (int -> 'a) -> 'a array ! val update: 'a array * int * 'a -> unit ! val vector: 'a array -> 'a vector ! val fromArray : 'a Array.array * 'a * int -> 'a array val baseArray : 'a array -> 'a Array.array diff -N -C 2 -r MLRISC/library/hash-array.sml MLRISC-mlton/library/hash-array.sml *** MLRISC/library/hash-array.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/library/hash-array.sml 2009-10-02 09:51:25.000000000 -0400 *************** *** 6,10 **** structure HashArray : ! sig include ARRAY val array' : int * (int -> 'a) -> 'a array val array'': int * (int -> 'a) -> 'a array --- 6,36 ---- structure HashArray : ! sig type 'a array ! type 'a vector ! ! val all: ('a -> bool) -> 'a array -> bool ! val app: ('a -> unit) -> 'a array -> unit ! val appi: (int * 'a -> unit) -> 'a array -> unit ! val array: int * 'a -> 'a array ! val collate: ('a * 'a -> order) -> 'a array * 'a array -> order ! val copy: {src: 'a array, dst: 'a array, di: int} -> unit ! val copyVec: {src: 'a vector, dst: 'a array, di: int} -> unit ! val exists: ('a -> bool) -> 'a array -> bool ! val find: ('a -> bool) -> 'a array -> 'a option ! val findi: (int * 'a -> bool) -> 'a array -> (int * 'a) option ! val foldl: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldli: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldr: ('a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val foldri: (int * 'a * 'b -> 'b) -> 'b -> 'a array -> 'b ! val fromList: 'a list -> 'a array ! val length: 'a array -> int ! val maxLen: int ! val modify: ('a -> 'a) -> 'a array -> unit ! val modifyi: (int * 'a -> 'a) -> 'a array -> unit ! val sub: 'a array * int -> 'a ! val tabulate: int * (int -> 'a) -> 'a array ! val update: 'a array * int * 'a -> unit ! val vector: 'a array -> 'a vector ! val array' : int * (int -> 'a) -> 'a array val array'': int * (int -> 'a) -> 'a array diff -N -C 2 -r MLRISC/mlb/ALPHA.mlb MLRISC-mlton/mlb/ALPHA.mlb *** MLRISC/mlb/ALPHA.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/ALPHA.mlb 2010-04-02 16:08:55.000000000 -0400 *************** *** 0 **** --- 1,474 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l42 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l136 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l50 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l9 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = FREQUENCY_PROPERTIES + end + local + open l9 + in + signature gs_1 = PROBABILITY + structure gs_2 = Probability + end + local + open l4 + in + structure gs_3 = MLRiscAnnotations + end + local + open l4 + in + signature gs_4 = REGION + end + local + open l4 + in + signature gs_5 = CONSTANT + end + local + open l4 + in + signature gs_6 = MLTREE + end + local + open l4 + in + signature gs_7 = CELLS_BASIS + end + local + open l4 + in + structure gs_8 = CellsBasis + end + local + open l4 + in + structure gs_9 = Label + end + local + open l9 + in + structure gs_10 = Annotations + end + local + open l4 + in + functor gs_11 = Cells + end + local + open l42 + in + structure gs_12 = Int + end + local + open l4 + in + signature gs_13 = CELLS + end + local + open l50 + in + signature gs_14 = MLRISC_ERROR_MSG + structure gs_15 = MLRiscErrorMsg + end + local + signature CELLS = gs_13 + functor Cells = gs_11 + structure CellsBasis = gs_8 + structure Int = gs_12 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + ../alpha/instructions/alphaCells.sml + in + signature gs_16 = ALPHACELLS + structure gs_17 = AlphaCells + end + local + signature ALPHACELLS = gs_16 + structure AlphaCells = gs_17 + structure Annotations = gs_10 + signature CELLS_BASIS = gs_7 + signature CONSTANT = gs_5 + structure CellsBasis = gs_8 + structure Label = gs_9 + signature MLTREE = gs_6 + signature REGION = gs_4 + ../alpha/instructions/alphaInstr.sml + in + signature gs_18 = ALPHAINSTR + functor gs_19 = AlphaInstr + end + local + signature ALPHAINSTR = gs_18 + functor AlphaInstr = gs_19 + signature FREQUENCY_PROPERTIES = gs_0 + structure MLRiscAnnotations = gs_3 + signature PROBABILITY = gs_1 + structure Probability = gs_2 + ../alpha/instructions/alphaFreqProps.sml + in + functor gs_20 = AlphaFreqProps + end + local + open l4 + in + signature gs_21 = INSN_PROPERTIES + end + local + open l42 + in + structure gs_22 = Option + end + local + open l42 + in + structure gs_23 = Word + end + local + open l4 + in + signature gs_24 = MLTREE_EVAL + end + local + open l4 + in + signature gs_25 = MLTREE_HASH + end + local + signature ALPHAINSTR = gs_18 + functor AlphaInstr = gs_19 + structure CellsBasis = gs_8 + signature INSN_PROPERTIES = gs_21 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_EVAL = gs_24 + signature MLTREE_HASH = gs_25 + structure Option = gs_22 + structure Word = gs_23 + ../alpha/instructions/alphaProps.sml + in + functor gs_26 = AlphaProps + end + local + open l4 + in + signature gs_27 = SDI_JUMPS + end + local + signature ALPHAINSTR = gs_18 + functor AlphaInstr = gs_19 + structure CellsBasis = gs_8 + ../alpha/instructions/alphaShuffle.sig + in + signature gs_28 = ALPHASHUFFLE + end + local + signature ALPHAINSTR = gs_18 + signature ALPHASHUFFLE = gs_28 + functor AlphaInstr = gs_19 + structure CellsBasis = gs_8 + structure Int = gs_12 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_EVAL = gs_24 + structure Option = gs_22 + signature SDI_JUMPS = gs_27 + ../alpha/backpatch/alphaJumps.sml + in + functor gs_29 = AlphaJumps + end + local + open l4 + in + signature gs_30 = INSTRUCTION_EMITTER + end + local + open l4 + in + signature gs_31 = ASM_FORMAT_UTIL + structure gs_32 = AsmFormatUtil + end + local + open l4 + in + signature gs_33 = ASM_STREAM + structure gs_34 = AsmStream + end + local + open l42 + in + structure gs_35 = TextIO + end + local + open l42 + in + structure gs_36 = String + end + local + open l4 + in + structure gs_37 = AsmFlags + end + local + open l4 + in + signature gs_38 = INSTRUCTION_STREAM + end + local + signature ALPHAINSTR = gs_18 + signature ALPHASHUFFLE = gs_28 + signature ASM_FORMAT_UTIL = gs_31 + signature ASM_STREAM = gs_33 + functor AlphaInstr = gs_19 + structure Annotations = gs_10 + structure AsmFlags = gs_37 + structure AsmFormatUtil = gs_32 + structure AsmStream = gs_34 + structure CellsBasis = gs_8 + signature INSTRUCTION_EMITTER = gs_30 + signature INSTRUCTION_STREAM = gs_38 + structure Int = gs_12 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_EVAL = gs_24 + structure String = gs_36 + structure TextIO = gs_35 + ../alpha/emit/alphaAsm.sml + in + functor gs_39 = AlphaAsmEmitter + end + local + signature ALPHAINSTR = gs_18 + functor AlphaInstr = gs_19 + structure CellsBasis = gs_8 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + ../alpha/ra/alphaRewrite.sml + in + functor gs_40 = AlphaRewrite + end + local + open l4 + in + signature gs_41 = PSEUDO_OPS_BASIS + end + local + open l4 + in + functor gs_42 = GasPseudoOps + end + local + open l4 + in + functor gs_43 = PseudoOpsLittle + end + local + open l136 + in + structure gs_44 = Format + end + local + open l4 + in + structure gs_45 = PseudoOpsBasisTyp + end + local + open l42 + in + structure gs_46 = Word32 + end + local + structure Format = gs_44 + functor GasPseudoOps = gs_42 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE = gs_6 + signature MLTREE_EVAL = gs_24 + signature PSEUDO_OPS_BASIS = gs_41 + structure PseudoOpsBasisTyp = gs_45 + functor PseudoOpsLittle = gs_43 + structure Word32 = gs_46 + ../alpha/flowgraph/alphaGasPseudoOps.sml + in + functor gs_47 = AlphaGasPseudoOps + end + local + open l4 + in + signature gs_48 = ARCH_SPILL_INSTR + end + local + signature ALPHAINSTR = gs_18 + signature ARCH_SPILL_INSTR = gs_48 + functor AlphaInstr = gs_19 + functor AlphaRewrite = gs_40 + structure CellsBasis = gs_8 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + ../alpha/ra/alphaSpillInstr.sml + in + functor gs_49 = AlphaSpillInstr + end + local + open l4 + in + functor gs_50 = MLTreeMult + end + local + open l4 + in + functor gs_51 = MLTreeGen + end + local + open l42 + in + structure gs_52 = IntInf + end + local + open l42 + in + structure gs_53 = Int32 + end + local + open l42 + in + structure gs_54 = List + end + local + open l4 + in + signature gs_55 = MLTREECOMP + signature gs_56 = MLTREE_EXTENSION_COMP + end + local + signature ALPHACELLS = gs_16 + signature ALPHAINSTR = gs_18 + structure AlphaCells = gs_17 + functor AlphaInstr = gs_19 + signature CELLS_BASIS = gs_7 + structure CellsBasis = gs_8 + signature MLTREE = gs_6 + ../alpha/mltree/alphaPseudoInstr.sig + in + signature gs_57 = ALPHA_PSEUDO_INSTR + end + local + signature ALPHAINSTR = gs_18 + signature ALPHA_PSEUDO_INSTR = gs_57 + functor AlphaInstr = gs_19 + structure CellsBasis = gs_8 + structure Int32 = gs_53 + structure IntInf = gs_52 + structure Label = gs_9 + structure List = gs_54 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscAnnotations = gs_3 + structure MLRiscErrorMsg = gs_15 + signature MLTREECOMP = gs_55 + signature MLTREE_EXTENSION_COMP = gs_56 + functor MLTreeGen = gs_51 + functor MLTreeMult = gs_50 + structure Word = gs_23 + structure Word32 = gs_46 + ../alpha/mltree/alpha.sml + in + functor gs_58 = Alpha + end + local + open l4 + in + functor gs_59 = Shuffle + end + local + signature ALPHAINSTR = gs_18 + signature ALPHASHUFFLE = gs_28 + functor AlphaInstr = gs_19 + structure CellsBasis = gs_8 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + structure Option = gs_22 + functor Shuffle = gs_59 + ../alpha/instructions/alphaShuffle.sml + in + functor gs_60 = AlphaShuffle + end + local + open l42 + in + structure gs_61 = Word8 + end + local + open l4 + in + signature gs_62 = CODE_STRING + end + local + signature ALPHAINSTR = gs_18 + functor AlphaInstr = gs_19 + signature CODE_STRING = gs_62 + structure CellsBasis = gs_8 + signature INSTRUCTION_EMITTER = gs_30 + signature INSTRUCTION_STREAM = gs_38 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_EVAL = gs_24 + structure Option = gs_22 + structure Word32 = gs_46 + structure Word8 = gs_61 + ../alpha/emit/alphaMC.sml + in + functor gs_63 = AlphaMCEmitter + end + in + signature ALPHACELLS = gs_16 + signature ALPHAINSTR = gs_18 + signature ALPHASHUFFLE = gs_28 + signature ALPHA_PSEUDO_INSTR = gs_57 + functor Alpha = gs_58 + functor AlphaAsmEmitter = gs_39 + structure AlphaCells = gs_17 + functor AlphaFreqProps = gs_20 + functor AlphaGasPseudoOps = gs_47 + functor AlphaInstr = gs_19 + functor AlphaJumps = gs_29 + functor AlphaMCEmitter = gs_63 + functor AlphaProps = gs_26 + functor AlphaRewrite = gs_40 + functor AlphaShuffle = gs_60 + functor AlphaSpillInstr = gs_49 + end + end + + end diff -N -C 2 -r MLRISC/mlb/AMD64-Peephole.mlb MLRISC-mlton/mlb/AMD64-Peephole.mlb *** MLRISC/mlb/AMD64-Peephole.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/AMD64-Peephole.mlb 2010-04-02 16:08:56.000000000 -0400 *************** *** 0 **** --- 1,60 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l8 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l4 = + bas + (* $Peephole.cm(=(proxyLib.cm):.)/Peephole.cm =??=> *) Peephole.mlb + end + basis l16 = + bas + (* $AMD64.cm(=(proxyLib.cm):.)/AMD64.cm =??=> *) AMD64.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = PEEPHOLE + end + local + open l8 + in + structure gs_1 = CellsBasis + end + local + open l8 + in + signature gs_2 = MLTREE_EVAL + end + local + open l16 + in + signature gs_3 = AMD64INSTR + functor gs_4 = AMD64Instr + end + local + signature AMD64INSTR = gs_3 + functor AMD64Instr = gs_4 + structure CellsBasis = gs_1 + signature MLTREE_EVAL = gs_2 + signature PEEPHOLE = gs_0 + ../amd64/instructions/amd64Peephole.sml + in + functor gs_5 = AMD64Peephole + end + in + functor AMD64Peephole = gs_5 + end + end + + end diff -N -C 2 -r MLRISC/mlb/AMD64.mlb MLRISC-mlton/mlb/AMD64.mlb *** MLRISC/mlb/AMD64.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/AMD64.mlb 2010-04-02 16:08:56.000000000 -0400 *************** *** 0 **** --- 1,670 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l111 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l9 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l46 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l223 = + bas + (* $Graphs.cm(=(proxyLib.cm):.)/Graphs.cm =??=> *) Graphs.mlb + end + basis l34 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + basis l276 = + bas + (* $MLTREE.cm(=(proxyLib.cm):.)/MLTREE.cm =??=> *) MLTREE.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = Int + end + local + open l9 + in + signature gs_1 = REGION + end + local + open l9 + in + signature gs_2 = CONSTANT + end + local + open l9 + in + signature gs_3 = MLTREE + end + local + open l9 + in + signature gs_4 = CELLS_BASIS + end + local + open l9 + in + structure gs_5 = CellsBasis + end + local + open l9 + in + structure gs_6 = Label + end + local + open l4 + in + structure gs_7 = Int64 + end + local + open l4 + in + structure gs_8 = Int32 + end + local + open l34 + in + structure gs_9 = Annotations + end + local + open l9 + in + functor gs_10 = Cells + end + local + open l9 + in + signature gs_11 = CELLS + end + local + open l46 + in + signature gs_12 = MLRISC_ERROR_MSG + structure gs_13 = MLRiscErrorMsg + end + local + signature CELLS = gs_11 + functor Cells = gs_10 + structure CellsBasis = gs_5 + structure Int = gs_0 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + ../amd64/instructions/amd64Cells.sml + in + signature gs_14 = AMD64CELLS + structure gs_15 = AMD64Cells + end + local + signature AMD64CELLS = gs_14 + structure AMD64Cells = gs_15 + structure Annotations = gs_9 + signature CELLS_BASIS = gs_4 + signature CONSTANT = gs_2 + structure CellsBasis = gs_5 + structure Int32 = gs_8 + structure Int64 = gs_7 + structure Label = gs_6 + signature MLTREE = gs_3 + signature REGION = gs_1 + ../amd64/instructions/amd64Instr.sml + in + signature gs_16 = AMD64INSTR + functor gs_17 = AMD64Instr + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + structure Int = gs_0 + ../amd64/mltree/amd64-opcodes.sml + in + functor gs_18 = AMD64Opcodes + end + local + open l9 + in + signature gs_19 = MC_EMIT + end + local + open l4 + in + structure gs_20 = Word32 + end + local + open l4 + in + structure gs_21 = Word8 + end + local + open l4 + in + structure gs_22 = LargeWord + end + local + open l4 + in + structure gs_23 = Word8Vector + end + local + open l4 + in + structure gs_24 = Word + end + local + open l9 + in + signature gs_25 = MLTREE_EVAL + end + local + open l9 + in + functor gs_26 = Shuffle + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + structure CellsBasis = gs_5 + functor Shuffle = gs_26 + ../amd64/instructions/amd64Shuffle.sml + in + signature gs_27 = AMD64SHUFFLE + functor gs_28 = AMD64Shuffle + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + signature AMD64SHUFFLE = gs_27 + functor AMD64Shuffle = gs_28 + structure CellsBasis = gs_5 + structure Int32 = gs_8 + structure LargeWord = gs_22 + signature MC_EMIT = gs_19 + signature MLTREE_EVAL = gs_25 + structure Word = gs_24 + structure Word32 = gs_20 + structure Word8 = gs_21 + structure Word8Vector = gs_23 + ../amd64/amd64MCFn.sml + in + functor gs_29 = AMD64MCFn + end + local + open l9 + in + signature gs_30 = INSTRUCTION_EMITTER + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + signature AMD64SHUFFLE = gs_27 + functor AMD64Shuffle = gs_28 + structure CellsBasis = gs_5 + signature INSTRUCTION_EMITTER = gs_30 + structure Int = gs_0 + structure Int32 = gs_8 + structure LargeWord = gs_22 + signature MC_EMIT = gs_19 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_EVAL = gs_25 + structure Word = gs_24 + structure Word32 = gs_20 + structure Word8 = gs_21 + structure Word8Vector = gs_23 + ../amd64/amd64MC.sml + in + functor gs_31 = AMD64MCEmitter + end + local + open l9 + in + signature gs_32 = PSEUDO_OPS_BASIS + end + local + open l9 + in + functor gs_33 = GasPseudoOps + end + local + open l9 + in + functor gs_34 = PseudoOpsLittle + end + local + open l111 + in + structure gs_35 = Format + end + local + open l9 + in + structure gs_36 = PseudoOpsBasisTyp + end + local + structure Format = gs_35 + functor GasPseudoOps = gs_33 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE = gs_3 + signature MLTREE_EVAL = gs_25 + signature PSEUDO_OPS_BASIS = gs_32 + structure PseudoOpsBasisTyp = gs_36 + functor PseudoOpsLittle = gs_34 + structure Word32 = gs_20 + ../amd64/flowgraph/amd64GasPseudoOps.sml + in + functor gs_37 = AMD64GasPseudoOps + end + local + open l4 + in + structure gs_38 = List + end + local + open l9 + in + signature gs_39 = MLTREE_HASH + end + local + open l9 + in + signature gs_40 = INSN_PROPERTIES + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + structure CellsBasis = gs_5 + signature INSN_PROPERTIES = gs_40 + structure Int = gs_0 + structure Int32 = gs_8 + structure Int64 = gs_7 + structure Label = gs_6 + structure List = gs_38 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_EVAL = gs_25 + signature MLTREE_HASH = gs_39 + structure Word = gs_24 + ../amd64/instructions/amd64Props.sml + in + signature gs_41 = AMD64INSN_PROPERTIES + functor gs_42 = AMD64Props + end + local + open l9 + in + signature gs_43 = SDI_JUMPS + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + signature AMD64SHUFFLE = gs_27 + functor AMD64Shuffle = gs_28 + signature MC_EMIT = gs_19 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_EVAL = gs_25 + signature SDI_JUMPS = gs_43 + structure Word8Vector = gs_23 + ../amd64/backpatch/amd64Jumps.sml + in + functor gs_44 = AMD64Jumps + end + local + open l9 + in + signature gs_45 = CONTROL_FLOW_GRAPH + end + local + open l9 + in + signature gs_46 = MLTREE_STREAM + end + local + ../amd64/instructions/amd64InstrExt.sml + in + structure gs_47 = AMD64InstrExt + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + structure AMD64InstrExt = gs_47 + signature CONTROL_FLOW_GRAPH = gs_45 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_STREAM = gs_46 + ../amd64/instructions/amd64CompInstrExt.sml + in + signature gs_48 = AMD64COMP_INSTR_EXT + functor gs_49 = AMD64CompInstrExt + end + local + open l9 + in + functor gs_50 = DarwinPseudoOps + end + local + functor DarwinPseudoOps = gs_50 + structure Format = gs_35 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE = gs_3 + signature MLTREE_EVAL = gs_25 + signature PSEUDO_OPS_BASIS = gs_32 + structure PseudoOpsBasisTyp = gs_36 + functor PseudoOpsLittle = gs_34 + structure Word32 = gs_20 + ../amd64/flowgraph/amd64-darwin-pseudo-ops.sml + in + functor gs_51 = AMD64DarwinPseudoOps + end + local + open l9 + in + signature gs_52 = ASM_FORMAT_UTIL + structure gs_53 = AsmFormatUtil + end + local + open l9 + in + signature gs_54 = ASM_STREAM + structure gs_55 = AsmStream + end + local + open l4 + in + structure gs_56 = TextIO + end + local + open l4 + in + structure gs_57 = String + end + local + open l4 + in + structure gs_58 = Char + end + local + open l9 + in + structure gs_59 = AsmFlags + end + local + open l9 + in + signature gs_60 = INSTRUCTION_STREAM + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + signature AMD64SHUFFLE = gs_27 + functor AMD64Shuffle = gs_28 + signature ASM_FORMAT_UTIL = gs_52 + signature ASM_STREAM = gs_54 + structure Annotations = gs_9 + structure AsmFlags = gs_59 + structure AsmFormatUtil = gs_53 + structure AsmStream = gs_55 + structure CellsBasis = gs_5 + structure Char = gs_58 + signature INSTRUCTION_EMITTER = gs_30 + signature INSTRUCTION_STREAM = gs_60 + structure Int = gs_0 + structure Int32 = gs_8 + structure Int64 = gs_7 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_EVAL = gs_25 + structure String = gs_57 + structure TextIO = gs_56 + ../amd64/emit/amd64Asm.sml + in + functor gs_61 = AMD64AsmEmitter + end + local + open l9 + in + signature gs_62 = CFG_OPTIMIZATION + end + local + open l9 + in + functor gs_63 = GetReg + end + local + open l9 + in + signature gs_64 = PRINT_FLOWGRAPH + functor gs_65 = PrintFlowgraph + end + local + open l9 + in + functor gs_66 = RegisterAllocator + end + local + open l9 + in + functor gs_67 = MemoryRA + end + local + open l9 + in + functor gs_68 = RADeadCodeElim + end + local + open l9 + in + functor gs_69 = ClusterRA + end + local + open l111 + in + structure gs_70 = IntHashTable + end + local + open l46 + in + signature gs_71 = MLRISC_CONTROL + structure gs_72 = MLRiscControl + end + local + open l223 + in + structure gs_73 = Graph + end + local + open l4 + in + structure gs_74 = Array + end + local + open l4 + in + structure gs_75 = Option + end + local + open l9 + in + signature gs_76 = RA_SPILL + end + local + open l9 + in + signature gs_77 = RA_SPILL_HEURISTICS + end + local + open l9 + in + structure gs_78 = RAGraph + end + local + open l9 + in + signature gs_79 = ARCH_SPILL_INSTR + end + local + open l9 + in + structure gs_80 = MLRiscAnnotations + end + local + signature AMD64INSN_PROPERTIES = gs_41 + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + functor AMD64Props = gs_42 + signature ARCH_SPILL_INSTR = gs_79 + structure Annotations = gs_9 + structure CellsBasis = gs_5 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscAnnotations = gs_80 + structure MLRiscErrorMsg = gs_13 + ../amd64/ra/amd64SpillInstr.sml + in + functor gs_81 = AMD64SpillInstr + end + local + signature AMD64INSN_PROPERTIES = gs_41 + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + functor AMD64Props = gs_42 + functor AMD64SpillInstr = gs_81 + structure Annotations = gs_9 + structure Array = gs_74 + signature CFG_OPTIMIZATION = gs_62 + signature CONTROL_FLOW_GRAPH = gs_45 + structure CellsBasis = gs_5 + functor ClusterRA = gs_69 + functor GetReg = gs_63 + structure Graph = gs_73 + signature INSTRUCTION_EMITTER = gs_30 + structure IntHashTable = gs_70 + structure List = gs_38 + signature MLRISC_CONTROL = gs_71 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscControl = gs_72 + structure MLRiscErrorMsg = gs_13 + functor MemoryRA = gs_67 + structure Option = gs_75 + signature PRINT_FLOWGRAPH = gs_64 + functor PrintFlowgraph = gs_65 + functor RADeadCodeElim = gs_68 + structure RAGraph = gs_78 + signature RA_SPILL = gs_76 + signature RA_SPILL_HEURISTICS = gs_77 + functor RegisterAllocator = gs_66 + ../amd64/ra/amd64RegAlloc.sml + in + functor gs_82 = AMD64RegAlloc + end + local + open l9 + in + functor gs_83 = MLTreeGen + end + local + open l9 + in + functor gs_84 = MLTreeSize + end + local + open l4 + in + structure gs_85 = IntInf + end + local + open l34 + in + signature gs_86 = PROBABILITY + structure gs_87 = Probability + end + local + open l4 + in + structure gs_88 = ListPair + end + local + open l9 + in + signature gs_89 = MLTREECOMP + signature gs_90 = MLTREE_EXTENSION_COMP + end + local + open l276 + in + signature gs_91 = MLTREE_UTILS + end + local + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + functor AMD64Opcodes = gs_18 + structure CellsBasis = gs_5 + structure Int32 = gs_8 + structure Int64 = gs_7 + structure IntInf = gs_85 + structure Label = gs_6 + structure List = gs_38 + structure ListPair = gs_88 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscAnnotations = gs_80 + structure MLRiscErrorMsg = gs_13 + signature MLTREECOMP = gs_89 + signature MLTREE_EXTENSION_COMP = gs_90 + signature MLTREE_UTILS = gs_91 + functor MLTreeGen = gs_83 + functor MLTreeSize = gs_84 + signature PROBABILITY = gs_86 + structure Probability = gs_87 + functor Shuffle = gs_26 + structure Word = gs_24 + structure Word32 = gs_20 + ../amd64/mltree/amd64-gen.sml + in + functor gs_92 = AMD64Gen + end + in + functor AMD64AsmEmitter = gs_61 + signature AMD64CELLS = gs_14 + structure AMD64Cells = gs_15 + functor AMD64CompInstrExt = gs_49 + functor AMD64DarwinPseudoOps = gs_51 + functor AMD64GasPseudoOps = gs_37 + functor AMD64Gen = gs_92 + signature AMD64INSN_PROPERTIES = gs_41 + signature AMD64INSTR = gs_16 + functor AMD64Instr = gs_17 + structure AMD64InstrExt = gs_47 + functor AMD64Jumps = gs_44 + functor AMD64MCEmitter = gs_31 + functor AMD64MCFn = gs_29 + functor AMD64Opcodes = gs_18 + functor AMD64Props = gs_42 + functor AMD64RegAlloc = gs_82 + signature AMD64SHUFFLE = gs_27 + functor AMD64Shuffle = gs_28 + functor AMD64SpillInstr = gs_81 + end + end + + end diff -N -C 2 -r MLRISC/mlb/CCall-sparc.mlb MLRISC-mlton/mlb/CCall-sparc.mlb *** MLRISC/mlb/CCall-sparc.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/CCall-sparc.mlb 2010-04-02 16:08:57.000000000 -0400 *************** *** 0 **** --- 1,118 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l29 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l33 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l8 = + bas + (* $StagedAlloc.cm(=(proxyLib.cm):.)/StagedAlloc.cm =??=> *) StagedAlloc.mlb + end + basis l4 = + bas + (* $CCall.cm(=(proxyLib.cm):.)/CCall.cm =??=> *) CCall.mlb + end + basis l19 = + bas + (* $SPARC.cm(=(proxyLib.cm):.)/SPARC.cm =??=> *) SPARC.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = C_CALL + end + local + open l8 + in + functor gs_1 = SparcCConventionFn + end + local + open l4 + in + functor gs_2 = CCallGenFn + end + local + open l8 + in + functor gs_3 = StagedAllocationFn + end + local + open l19 + in + signature gs_4 = SPARCCELLS + structure gs_5 = SparcCells + end + local + open l4 + in + structure gs_6 = CType + end + local + open l8 + in + structure gs_7 = CLocKind + end + local + open l29 + in + structure gs_8 = List + end + local + open l33 + in + signature gs_9 = MLTREE + end + local + open l19 + in + structure gs_10 = SparcInstrExt + end + local + open l29 + in + structure gs_11 = Int + end + local + structure CType = gs_6 + structure Int = gs_11 + ../c-call/archs/sparc-c-sizes.sml + in + structure gs_12 = SparcCSizes + end + local + functor CCallGenFn = gs_2 + structure CLocKind = gs_7 + structure CType = gs_6 + signature C_CALL = gs_0 + structure List = gs_8 + signature MLTREE = gs_9 + signature SPARCCELLS = gs_4 + functor SparcCConventionFn = gs_1 + structure SparcCSizes = gs_12 + structure SparcCells = gs_5 + structure SparcInstrExt = gs_10 + functor StagedAllocationFn = gs_3 + ../c-call/archs/sparc-c-call-fn.sml + in + functor gs_13 = SparcCCallFn + end + in + functor SparcCCallFn = gs_13 + structure SparcCSizes = gs_12 + end + end + + end diff -N -C 2 -r MLRISC/mlb/CCall-x86-64.mlb MLRISC-mlton/mlb/CCall-x86-64.mlb *** MLRISC/mlb/CCall-x86-64.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/CCall-x86-64.mlb 2010-04-02 16:08:57.000000000 -0400 *************** *** 0 **** --- 1,125 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l8 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l29 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l19 = + bas + (* $StagedAlloc.cm(=(proxyLib.cm):.)/StagedAlloc.cm =??=> *) StagedAlloc.mlb + end + basis l4 = + bas + (* $CCall.cm(=(proxyLib.cm):.)/CCall.cm =??=> *) CCall.mlb + end + basis l34 = + bas + (* $AMD64.cm(=(proxyLib.cm):.)/AMD64.cm =??=> *) AMD64.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = CType + end + local + open l8 + in + structure gs_1 = Word + end + local + open l8 + in + structure gs_2 = Int + end + local + structure CType = gs_0 + structure Int = gs_2 + structure Word = gs_1 + ../c-call/archs/x86-64-c-sizes.sml + in + structure gs_3 = CSizes + end + local + open l19 + in + functor gs_4 = X86_64CConventionFn + end + local + open l4 + in + functor gs_5 = CCallGenFn + end + local + open l19 + in + functor gs_6 = StagedAllocationFn + end + local + open l29 + in + structure gs_7 = CellsBasis + end + local + open l34 + in + signature gs_8 = AMD64CELLS + structure gs_9 = AMD64Cells + end + local + open l19 + in + structure gs_10 = CLocKind + end + local + open l8 + in + structure gs_11 = String + end + local + open l8 + in + structure gs_12 = List + end + local + open l29 + in + signature gs_13 = MLTREE + end + local + signature AMD64CELLS = gs_8 + structure AMD64Cells = gs_9 + functor CCallGenFn = gs_5 + structure CLocKind = gs_10 + structure CSizes = gs_3 + structure CType = gs_0 + structure CellsBasis = gs_7 + structure Int = gs_2 + structure List = gs_12 + signature MLTREE = gs_13 + functor StagedAllocationFn = gs_6 + structure String = gs_11 + functor X86_64CConventionFn = gs_4 + ../c-call/archs/x86-64-svid-fn.sml + in + functor gs_14 = X86_64SVIDFn + end + in + structure CSizes = gs_3 + functor X86_64SVIDFn = gs_14 + end + end + + end diff -N -C 2 -r MLRISC/mlb/CCall-x86.mlb MLRISC-mlton/mlb/CCall-x86.mlb *** MLRISC/mlb/CCall-x86.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/CCall-x86.mlb 2010-04-02 16:08:58.000000000 -0400 *************** *** 0 **** --- 1,155 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l8 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l32 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l22 = + bas + (* $StagedAlloc.cm(=(proxyLib.cm):.)/StagedAlloc.cm =??=> *) StagedAlloc.mlb + end + basis l4 = + bas + (* $CCall.cm(=(proxyLib.cm):.)/CCall.cm =??=> *) CCall.mlb + end + basis l37 = + bas + (* $IA32.cm(=(proxyLib.cm):.)/IA32.cm =??=> *) IA32.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = CType + end + local + open l8 + in + structure gs_1 = Word + end + local + open l8 + in + structure gs_2 = Int + end + local + structure CType = gs_0 + structure Int = gs_2 + structure Word = gs_1 + ../c-call/archs/x86-c-sizes.sml + in + structure gs_3 = X86CSizes + end + local + open l4 + in + signature gs_4 = C_CALL + end + local + open l22 + in + functor gs_5 = X86CConventionFn + end + local + open l4 + in + functor gs_6 = CCallGenFn + end + local + open l22 + in + functor gs_7 = StagedAllocationFn + end + local + open l32 + in + structure gs_8 = CellsBasis + end + local + open l37 + in + signature gs_9 = X86CELLS + structure gs_10 = X86Cells + end + local + open l22 + in + structure gs_11 = CLocKind + end + local + open l8 + in + structure gs_12 = IntInf + end + local + open l32 + in + structure gs_13 = MLRiscAnnotations + end + local + open l8 + in + structure gs_14 = Int32 + end + local + open l8 + in + structure gs_15 = String + end + local + open l8 + in + structure gs_16 = List + end + local + open l32 + in + signature gs_17 = MLTREE + end + local + open l37 + in + structure gs_18 = X86InstrExt + end + local + functor CCallGenFn = gs_6 + structure CLocKind = gs_11 + structure CType = gs_0 + signature C_CALL = gs_4 + structure CellsBasis = gs_8 + structure Int = gs_2 + structure Int32 = gs_14 + structure IntInf = gs_12 + structure List = gs_16 + structure MLRiscAnnotations = gs_13 + signature MLTREE = gs_17 + functor StagedAllocationFn = gs_7 + structure String = gs_15 + functor X86CConventionFn = gs_5 + signature X86CELLS = gs_9 + structure X86CSizes = gs_3 + structure X86Cells = gs_10 + structure X86InstrExt = gs_18 + ../c-call/archs/x86-svid-fn.sml + in + functor gs_19 = X86SVIDFn + end + in + structure X86CSizes = gs_3 + functor X86SVIDFn = gs_19 + end + end + + end diff -N -C 2 -r MLRISC/mlb/CCall.mlb MLRISC-mlton/mlb/CCall.mlb *** MLRISC/mlb/CCall.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/CCall.mlb 2010-04-02 16:08:56.000000000 -0400 *************** *** 0 **** --- 1,96 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l20 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l9 = + bas + (* $StagedAlloc.cm(=(proxyLib.cm):.)/StagedAlloc.cm =??=> *) StagedAlloc.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = MLTREE + end + local + open l9 + in + signature gs_1 = STAGED_ALLOCATION + end + local + open l9 + in + structure gs_2 = CLocKind + end + local + structure CLocKind = gs_2 + signature MLTREE = gs_0 + signature STAGED_ALLOCATION = gs_1 + ../c-call/gen/c-call-gen-sig.sml + in + signature gs_3 = C_CALL_GEN + end + local + open l20 + in + structure gs_4 = List + end + local + structure List = gs_4 + ../c-call/gen/c-type.sml + in + structure gs_5 = CType + end + local + structure CType = gs_5 + signature C_CALL_GEN = gs_3 + signature MLTREE = gs_0 + ../c-call/gen/c-call-sig.sml + in + signature gs_6 = C_CALL + end + local + open l20 + in + structure gs_7 = ListPair + end + local + open l4 + in + signature gs_8 = CELLS + end + local + signature CELLS = gs_8 + structure CLocKind = gs_2 + signature C_CALL_GEN = gs_3 + structure List = gs_4 + structure ListPair = gs_7 + signature MLTREE = gs_0 + signature STAGED_ALLOCATION = gs_1 + ../c-call/gen/c-call-gen-fn.sml + in + functor gs_9 = CCallGenFn + end + in + functor CCallGenFn = gs_9 + structure CType = gs_5 + signature C_CALL = gs_6 + signature C_CALL_GEN = gs_3 + end + end + + end diff -N -C 2 -r MLRISC/mlb/Control.mlb MLRISC-mlton/mlb/Control.mlb *** MLRISC/mlb/Control.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/Control.mlb 2010-04-02 16:08:58.000000000 -0400 *************** *** 0 **** --- 1,104 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l28 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l12 = + bas + (* $/controls-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Controls/controls-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = Timer + end + local + open l4 + in + structure gs_1 = Time + end + local + open l12 + in + structure gs_2 = Controls + end + local + open l12 + in + structure gs_3 = ControlUtil + end + local + open l12 + in + structure gs_4 = ControlSet + end + local + open l12 + in + structure gs_5 = ControlRegistry + end + local + open l4 + in + structure gs_6 = TextIO + end + local + open l28 + in + structure gs_7 = Atom + end + local + structure Atom = gs_7 + structure ControlRegistry = gs_5 + structure ControlSet = gs_4 + structure ControlUtil = gs_3 + structure Controls = gs_2 + structure TextIO = gs_6 + structure Time = gs_1 + ../control/mlrisc-control.sml + in + signature gs_8 = MLRISC_CONTROL + structure gs_9 = MLRiscControl + end + local + signature MLRISC_CONTROL = gs_8 + structure MLRiscControl = gs_9 + structure Time = gs_1 + structure Timer = gs_0 + ../control/mlrisc-timing.sml + in + signature gs_10 = MLRISC_TIMING + structure gs_11 = MLRiscTiming + end + local + structure TextIO = gs_6 + ../control/mlriscErrormsg.sml + in + signature gs_12 = MLRISC_ERROR_MSG + structure gs_13 = MLRiscErrorMsg + end + in + signature MLRISC_CONTROL = gs_8 + signature MLRISC_ERROR_MSG = gs_12 + signature MLRISC_TIMING = gs_10 + structure MLRiscControl = gs_9 + structure MLRiscErrorMsg = gs_13 + structure MLRiscTiming = gs_11 + end + end + + end diff -N -C 2 -r MLRISC/mlb/Graphs.mlb MLRISC-mlton/mlb/Graphs.mlb *** MLRISC/mlb/Graphs.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/Graphs.mlb 2010-04-02 16:08:58.000000000 -0400 *************** *** 0 **** --- 1,708 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l8 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l4 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l29 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = ListMergeSort + end + local + open l8 + in + structure gs_1 = Int + end + local + open l8 + in + structure gs_2 = List + end + local + ../graphs/graph.sig + in + signature gs_3 = GRAPH + end + local + signature GRAPH = gs_3 + structure List = gs_2 + ../graphs/graph.sml + in + structure gs_4 = Graph + end + local + structure Graph = gs_4 + structure Int = gs_1 + structure ListMergeSort = gs_0 + ../graphs/uniongraph.sml + in + signature gs_5 = UNION_GRAPH_VIEW + structure gs_6 = UnionGraphView + end + local + open l29 + in + signature gs_7 = CATNETABLE_LIST + structure gs_8 = CatnetableList + end + local + open l8 + in + structure gs_9 = Array + end + local + ../graphs/group.sig + in + signature gs_10 = ABELIAN_GROUP + signature gs_11 = ABELIAN_GROUP_WITH_INF + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + structure Graph = gs_4 + ../graphs/min-cut.sig + in + signature gs_12 = MIN_CUT + end + local + open l8 + in + signature gs_13 = ARRAY + end + local + structure Graph = gs_4 + ../graphs/node-priqueue.sig + in + signature gs_14 = NODE_PRIORITY_QUEUE + end + local + signature ARRAY = gs_13 + structure Graph = gs_4 + signature NODE_PRIORITY_QUEUE = gs_14 + ../graphs/node-priqueue.sml + in + functor gs_15 = NodePriorityQueue + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + structure Array = gs_9 + signature CATNETABLE_LIST = gs_7 + structure CatnetableList = gs_8 + structure Graph = gs_4 + signature MIN_CUT = gs_12 + functor NodePriorityQueue = gs_15 + ../graphs/min-cut.sml + in + functor gs_16 = MinCut + end + local + structure Graph = gs_4 + structure List = gs_2 + ../graphs/isograph.sml + in + signature gs_17 = ISOMORPHIC_GRAPH_VIEW + structure gs_18 = IsomorphicGraphView + end + local + structure Graph = gs_4 + structure Int = gs_1 + structure List = gs_2 + ../graphs/seme.sml + in + signature gs_19 = SINGLE_ENTRY_MULTIPLE_EXIT_VIEW + structure gs_20 = SingleEntryMultipleExit + end + local + structure Graph = gs_4 + ../graphs/graph-comb.sig + in + signature gs_21 = GRAPH_COMBINATIONS + end + local + structure Graph = gs_4 + ../graphs/revgraph.sml + in + signature gs_22 = REVERSED_GRAPH_VIEW + structure gs_23 = ReversedGraphView + end + local + structure Graph = gs_4 + ../graphs/renamegraph.sml + in + signature gs_24 = RENAMED_GRAPH_VIEW + structure gs_25 = RenamedGraphView + end + local + signature GRAPH_COMBINATIONS = gs_21 + structure Graph = gs_4 + signature RENAMED_GRAPH_VIEW = gs_24 + signature REVERSED_GRAPH_VIEW = gs_22 + structure RenamedGraphView = gs_25 + structure ReversedGraphView = gs_23 + signature UNION_GRAPH_VIEW = gs_5 + structure UnionGraphView = gs_6 + ../graphs/graph-comb.sml + in + structure gs_26 = GraphCombinations + end + local + structure Graph = gs_4 + ../graphs/readonly.sml + in + signature gs_27 = READONLY_GRAPH_VIEW + structure gs_28 = ReadOnlyGraphView + end + local + structure Graph = gs_4 + ../graphs/graphimpl.sig + in + signature gs_29 = GRAPH_IMPLEMENTATION + end + local + open l8 + in + structure gs_30 = Word8Array + end + local + structure Graph = gs_4 + ../graphs/graph-scc.sig + in + signature gs_31 = GRAPH_STRONGLY_CONNECTED_COMPONENTS + end + local + structure Array = gs_9 + signature GRAPH_STRONGLY_CONNECTED_COMPONENTS = gs_31 + structure Graph = gs_4 + structure Int = gs_1 + structure Word8Array = gs_30 + ../graphs/graph-scc.sml + in + structure gs_32 = GraphSCC + end + local + open l29 + in + structure gs_33 = BitSet + end + local + structure Array = gs_9 + structure Graph = gs_4 + ../graphs/graph-dfs.sig + in + signature gs_34 = GRAPH_DEPTH_FIRST_SEARCH + end + local + structure Array = gs_9 + structure BitSet = gs_33 + signature GRAPH_DEPTH_FIRST_SEARCH = gs_34 + structure Graph = gs_4 + ../graphs/graph-dfs.sml + in + structure gs_35 = GraphDFS + end + local + structure Array = gs_9 + structure Graph = gs_4 + ../graphs/graph-bfs.sig + in + signature gs_36 = GRAPH_BREATH_FIRST_SEARCH + end + local + structure Array = gs_9 + structure BitSet = gs_33 + signature GRAPH_BREATH_FIRST_SEARCH = gs_36 + structure Graph = gs_4 + ../graphs/graph-bfs.sml + in + structure gs_37 = GraphBFS + end + local + structure Graph = gs_4 + ../graphs/graph-bcc.sig + in + signature gs_38 = GRAPH_BICONNECTED_COMPONENTS + end + local + structure Array = gs_9 + signature GRAPH_BICONNECTED_COMPONENTS = gs_38 + structure Graph = gs_4 + ../graphs/graph-bcc.sml + in + structure gs_39 = GraphBCC + end + local + structure Graph = gs_4 + ../graphs/graph-topsort.sig + in + signature gs_40 = GRAPH_TOPOLOGICAL_SORT + end + local + open l8 + in + structure gs_41 = String + end + local + structure Graph = gs_4 + structure Int = gs_1 + structure List = gs_2 + structure String = gs_41 + ../graphs/printgraph.sml + in + signature gs_42 = PRINT_GRAPH + structure gs_43 = PrintGraph + end + local + structure Graph = gs_4 + ../graphs/no-exit.sml + in + signature gs_44 = NO_ENTRY_VIEW + signature gs_45 = NO_EXIT_VIEW + structure gs_46 = NoEntryView + structure gs_47 = NoExitView + end + local + open l29 + in + structure gs_48 = PriorityQueue + end + local + structure Graph = gs_4 + ../graphs/spanning-tree.sig + in + signature gs_49 = MIN_COST_SPANNING_TREE + end + local + open l4 + in + structure gs_50 = HashTable + end + local + open l4 + in + structure gs_51 = URef + end + local + open l8 + in + structure gs_52 = Word + end + local + structure Graph = gs_4 + structure HashTable = gs_50 + structure URef = gs_51 + structure Word = gs_52 + ../graphs/node-partition.sml + in + signature gs_53 = NODE_PARTITION + structure gs_54 = NodePartition + end + local + structure Graph = gs_4 + signature MIN_COST_SPANNING_TREE = gs_49 + signature NODE_PARTITION = gs_53 + structure NodePartition = gs_54 + structure PriorityQueue = gs_48 + ../graphs/kruskal.sml + in + structure gs_55 = Kruskal + end + local + open l29 + in + structure gs_56 = HashArray + end + local + structure Graph = gs_4 + structure List = gs_2 + ../graphs/subgraph-p.sml + in + signature gs_57 = SUBGRAPH_P_VIEW + structure gs_58 = Subgraph_P_View + end + local + structure Graph = gs_4 + structure HashArray = gs_56 + signature SUBGRAPH_P_VIEW = gs_57 + structure Subgraph_P_View = gs_58 + ../graphs/trace-graph.sml + in + signature gs_59 = TRACE_SUBGRAPH_VIEW + structure gs_60 = TraceView + end + local + structure Graph = gs_4 + structure Int = gs_1 + structure List = gs_2 + ../graphs/start-stop.sml + in + signature gs_61 = START_STOP_VIEW + structure gs_62 = StartStopView + end + local + signature GRAPH_IMPLEMENTATION = gs_29 + structure Graph = gs_4 + ../graphs/snap-shot.sml + in + signature gs_63 = GRAPH_SNAPSHOT + functor gs_64 = GraphSnapShot + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + structure Graph = gs_4 + ../graphs/max-flow.sig + in + signature gs_65 = MAX_FLOW + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + structure Array = gs_9 + structure Graph = gs_4 + structure Int = gs_1 + structure List = gs_2 + signature MAX_FLOW = gs_65 + ../graphs/max-flow.sml + in + functor gs_66 = MaxFlow + end + local + open l8 + in + structure gs_67 = Array2 + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + structure Array = gs_9 + structure Array2 = gs_67 + structure Graph = gs_4 + ../graphs/shortest-paths.sig + in + signature gs_68 = ALL_PAIRS_SHORTEST_PATHS + signature gs_69 = SINGLE_SOURCE_SHORTEST_PATHS + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + signature ALL_PAIRS_SHORTEST_PATHS = gs_68 + structure Array2 = gs_67 + structure Graph = gs_4 + signature SINGLE_SOURCE_SHORTEST_PATHS = gs_69 + ../graphs/floyd-warshall.sml + in + functor gs_70 = FloydWarshall + end + local + structure Graph = gs_4 + ../graphs/graph-is-cyclic.sig + in + signature gs_71 = GRAPH_IS_CYCLIC + end + local + structure Graph = gs_4 + ../graphs/update-graph-info.sml + in + signature gs_72 = UPDATE_GRAPH_INFO + structure gs_73 = UpdateGraphInfo + end + local + structure Graph = gs_4 + ../graphs/graph-cycles.sig + in + signature gs_74 = GRAPH_SIMPLE_CYCLES + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + signature ALL_PAIRS_SHORTEST_PATHS = gs_68 + structure Array = gs_9 + structure Graph = gs_4 + structure Int = gs_1 + signature SINGLE_SOURCE_SHORTEST_PATHS = gs_69 + ../graphs/bellman-ford.sml + in + functor gs_75 = BellmanFord + end + local + signature GRAPH_TOPOLOGICAL_SORT = gs_40 + structure Graph = gs_4 + structure Word8Array = gs_30 + ../graphs/graph-topsort.sml + in + structure gs_76 = GraphTopsort + end + local + structure Array = gs_9 + structure Graph = gs_4 + structure GraphTopsort = gs_76 + ../graphs/trans-closure.sml + in + signature gs_77 = TRANSITIVE_CLOSURE + structure gs_78 = TransitiveClosure + end + local + open l29 + in + structure gs_79 = DynArray + end + local + structure DynArray = gs_79 + signature GRAPH_IMPLEMENTATION = gs_29 + structure Graph = gs_4 + structure List = gs_2 + ../graphs/digraph.sml + in + functor gs_80 = DirectedGraph + structure gs_81 = DirectedGraph + end + local + structure Graph = gs_4 + ../graphs/wrappers.sml + in + signature gs_82 = GRAPH_WRAPPERS + structure gs_83 = GraphWrappers + end + local + structure BitSet = gs_33 + signature GRAPH_IS_CYCLIC = gs_71 + structure Graph = gs_4 + ../graphs/graph-is-cyclic.sml + in + structure gs_84 = GraphIsCyclic + end + local + open l4 + in + structure gs_85 = IntHashTable + end + local + structure Graph = gs_4 + structure IntHashTable = gs_85 + structure List = gs_2 + ../graphs/subgraph.sml + in + signature gs_86 = SUBGRAPH_VIEW + structure gs_87 = SubgraphView + end + local + structure Graph = gs_4 + structure Int = gs_1 + structure ListMergeSort = gs_0 + ../graphs/ugraph.sml + in + signature gs_88 = UNDIRECTED_GRAPH_VIEW + structure gs_89 = UndirectedGraphView + end + local + structure Graph = gs_4 + structure HashArray = gs_56 + structure List = gs_2 + structure URef = gs_51 + ../graphs/graph-minor.sml + in + signature gs_90 = GRAPH_MINOR_VIEW + structure gs_91 = GraphMinorView + end + local + signature ARRAY = gs_13 + signature GRAPH_IMPLEMENTATION = gs_29 + structure Graph = gs_4 + structure List = gs_2 + ../graphs/udgraph.sml + in + functor gs_92 = UndirectedGraph + end + local + signature GRAPH = gs_3 + ../graphs/bigraph.sig + in + signature gs_93 = BIPARTITE_GRAPH + end + local + structure Graph = gs_4 + structure HashArray = gs_56 + signature SUBGRAPH_P_VIEW = gs_57 + structure Subgraph_P_View = gs_58 + ../graphs/acyclic-graph.sml + in + signature gs_94 = ACYCLIC_SUBGRAPH_VIEW + structure gs_95 = AcyclicSubgraphView + end + local + structure Graph = gs_4 + ../graphs/singleton.sml + in + signature gs_96 = SINGLETON_GRAPH_VIEW + structure gs_97 = SingletonGraphView + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + signature ALL_PAIRS_SHORTEST_PATHS = gs_68 + structure Array = gs_9 + structure Graph = gs_4 + functor NodePriorityQueue = gs_15 + signature SINGLE_SOURCE_SHORTEST_PATHS = gs_69 + ../graphs/dijkstra.sml + in + functor gs_98 = Dijkstra + end + local + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + signature ALL_PAIRS_SHORTEST_PATHS = gs_68 + structure Array = gs_9 + structure Array2 = gs_67 + functor BellmanFord = gs_75 + functor Dijkstra = gs_98 + functor DirectedGraph = gs_80 + structure DirectedGraph = gs_81 + structure Graph = gs_4 + structure HashArray = gs_56 + signature SINGLE_SOURCE_SHORTEST_PATHS = gs_69 + signature UNION_GRAPH_VIEW = gs_5 + structure UnionGraphView = gs_6 + ../graphs/johnson.sml + in + functor gs_99 = Johnson + end + local + structure Graph = gs_4 + ../graphs/matching.sig + in + signature gs_100 = BIPARTITE_MATCHING + end + local + structure Array = gs_9 + signature GRAPH_SIMPLE_CYCLES = gs_74 + structure Graph = gs_4 + structure GraphSCC = gs_32 + ../graphs/graph-cycles.sml + in + structure gs_101 = GraphCycles + end + local + structure Array = gs_9 + signature BIPARTITE_MATCHING = gs_100 + structure Graph = gs_4 + structure List = gs_2 + ../graphs/matching.sml + in + structure gs_102 = BipartiteMatching + end + local + ../graphs/closed-semi-ring.sig + in + signature gs_103 = CLOSED_SEMI_RING + end + in + signature ABELIAN_GROUP = gs_10 + signature ABELIAN_GROUP_WITH_INF = gs_11 + signature ACYCLIC_SUBGRAPH_VIEW = gs_94 + signature ALL_PAIRS_SHORTEST_PATHS = gs_68 + structure AcyclicSubgraphView = gs_95 + signature BIPARTITE_GRAPH = gs_93 + signature BIPARTITE_MATCHING = gs_100 + functor BellmanFord = gs_75 + structure BipartiteMatching = gs_102 + signature CLOSED_SEMI_RING = gs_103 + functor Dijkstra = gs_98 + functor DirectedGraph = gs_80 + structure DirectedGraph = gs_81 + functor FloydWarshall = gs_70 + signature GRAPH = gs_3 + signature GRAPH_BICONNECTED_COMPONENTS = gs_38 + signature GRAPH_BREATH_FIRST_SEARCH = gs_36 + signature GRAPH_COMBINATIONS = gs_21 + signature GRAPH_DEPTH_FIRST_SEARCH = gs_34 + signature GRAPH_IMPLEMENTATION = gs_29 + signature GRAPH_IS_CYCLIC = gs_71 + signature GRAPH_MINOR_VIEW = gs_90 + signature GRAPH_SIMPLE_CYCLES = gs_74 + signature GRAPH_SNAPSHOT = gs_63 + signature GRAPH_STRONGLY_CONNECTED_COMPONENTS = gs_31 + signature GRAPH_TOPOLOGICAL_SORT = gs_40 + signature GRAPH_WRAPPERS = gs_82 + structure Graph = gs_4 + structure GraphBCC = gs_39 + structure GraphBFS = gs_37 + structure GraphCombinations = gs_26 + structure GraphCycles = gs_101 + structure GraphDFS = gs_35 + structure GraphIsCyclic = gs_84 + structure GraphMinorView = gs_91 + structure GraphSCC = gs_32 + functor GraphSnapShot = gs_64 + structure GraphTopsort = gs_76 + structure GraphWrappers = gs_83 + signature ISOMORPHIC_GRAPH_VIEW = gs_17 + structure IsomorphicGraphView = gs_18 + functor Johnson = gs_99 + structure Kruskal = gs_55 + signature MAX_FLOW = gs_65 + signature MIN_COST_SPANNING_TREE = gs_49 + signature MIN_CUT = gs_12 + functor MaxFlow = gs_66 + functor MinCut = gs_16 + signature NODE_PARTITION = gs_53 + signature NODE_PRIORITY_QUEUE = gs_14 + signature NO_ENTRY_VIEW = gs_44 + signature NO_EXIT_VIEW = gs_45 + structure NoEntryView = gs_46 + structure NoExitView = gs_47 + structure NodePartition = gs_54 + functor NodePriorityQueue = gs_15 + signature PRINT_GRAPH = gs_42 + structure PrintGraph = gs_43 + signature READONLY_GRAPH_VIEW = gs_27 + signature RENAMED_GRAPH_VIEW = gs_24 + signature REVERSED_GRAPH_VIEW = gs_22 + structure ReadOnlyGraphView = gs_28 + structure RenamedGraphView = gs_25 + structure ReversedGraphView = gs_23 + signature SINGLETON_GRAPH_VIEW = gs_96 + signature SINGLE_ENTRY_MULTIPLE_EXIT_VIEW = gs_19 + signature SINGLE_SOURCE_SHORTEST_PATHS = gs_69 + signature START_STOP_VIEW = gs_61 + signature SUBGRAPH_P_VIEW = gs_57 + signature SUBGRAPH_VIEW = gs_86 + structure SingleEntryMultipleExit = gs_20 + structure SingletonGraphView = gs_97 + structure StartStopView = gs_62 + structure SubgraphView = gs_87 + structure Subgraph_P_View = gs_58 + signature TRACE_SUBGRAPH_VIEW = gs_59 + signature TRANSITIVE_CLOSURE = gs_77 + structure TraceView = gs_60 + structure TransitiveClosure = gs_78 + signature UNDIRECTED_GRAPH_VIEW = gs_88 + signature UNION_GRAPH_VIEW = gs_5 + signature UPDATE_GRAPH_INFO = gs_72 + functor UndirectedGraph = gs_92 + structure UndirectedGraphView = gs_89 + structure UnionGraphView = gs_6 + structure UpdateGraphInfo = gs_73 + end + end + + end diff -N -C 2 -r MLRISC/mlb/HPPA.mlb MLRISC-mlton/mlb/HPPA.mlb *** MLRISC/mlb/HPPA.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/HPPA.mlb 2010-04-02 16:08:59.000000000 -0400 *************** *** 0 **** --- 1,492 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l11 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l157 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l16 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l37 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = CellsBasis + end + local + open l4 + in + functor gs_1 = Shuffle + end + local + open l11 + in + structure gs_2 = Option + end + local + open l16 + in + signature gs_3 = MLRISC_ERROR_MSG + structure gs_4 = MLRiscErrorMsg + end + local + open l4 + in + signature gs_5 = REGION + end + local + open l4 + in + signature gs_6 = CONSTANT + end + local + open l4 + in + signature gs_7 = MLTREE + end + local + open l4 + in + signature gs_8 = CELLS_BASIS + end + local + open l4 + in + structure gs_9 = Label + end + local + open l37 + in + structure gs_10 = Annotations + end + local + open l4 + in + functor gs_11 = Cells + end + local + open l11 + in + structure gs_12 = Int + end + local + open l4 + in + signature gs_13 = CELLS + end + local + signature CELLS = gs_13 + functor Cells = gs_11 + structure CellsBasis = gs_0 + structure Int = gs_12 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + ../hppa/instructions/hppaCells.sml + in + signature gs_14 = HPPACELLS + structure gs_15 = HppaCells + end + local + structure Annotations = gs_10 + signature CELLS_BASIS = gs_8 + signature CONSTANT = gs_6 + structure CellsBasis = gs_0 + signature HPPACELLS = gs_14 + structure HppaCells = gs_15 + structure Label = gs_9 + signature MLTREE = gs_7 + signature REGION = gs_5 + ../hppa/instructions/hppaInstr.sml + in + signature gs_16 = HPPAINSTR + functor gs_17 = HppaInstr + end + local + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + functor HppaInstr = gs_17 + ../hppa/instructions/hppaShuffle.sig + in + signature gs_18 = HPPASHUFFLE + end + local + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + signature HPPASHUFFLE = gs_18 + functor HppaInstr = gs_17 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + structure Option = gs_2 + functor Shuffle = gs_1 + ../hppa/instructions/hppaShuffle.sml + in + functor gs_19 = HppaShuffle + end + local + open l4 + in + signature gs_20 = INSTRUCTION_EMITTER + end + local + open l11 + in + structure gs_21 = IntInf + end + local + open l11 + in + structure gs_22 = Word8 + end + local + open l11 + in + structure gs_23 = Word32 + end + local + open l4 + in + signature gs_24 = CODE_STRING + end + local + open l4 + in + signature gs_25 = INSTRUCTION_STREAM + end + local + open l4 + in + signature gs_26 = MLTREE_EVAL + end + local + signature CODE_STRING = gs_24 + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + functor HppaInstr = gs_17 + signature INSTRUCTION_EMITTER = gs_20 + signature INSTRUCTION_STREAM = gs_25 + structure IntInf = gs_21 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + signature MLTREE_EVAL = gs_26 + structure Option = gs_2 + structure Word32 = gs_23 + structure Word8 = gs_22 + ../hppa/emit/hppaMC.sml + in + functor gs_27 = HppaMCEmitter + end + local + signature CELLS_BASIS = gs_8 + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + functor HppaInstr = gs_17 + ../hppa/mltree/hppaMillicode.sig + in + signature gs_28 = HPPA_MILLICODE + end + local + open l4 + in + signature gs_29 = ASM_FORMAT_UTIL + structure gs_30 = AsmFormatUtil + end + local + open l4 + in + signature gs_31 = ASM_STREAM + structure gs_32 = AsmStream + end + local + open l11 + in + structure gs_33 = TextIO + end + local + open l11 + in + structure gs_34 = String + end + local + open l4 + in + structure gs_35 = AsmFlags + end + local + signature ASM_FORMAT_UTIL = gs_29 + signature ASM_STREAM = gs_31 + structure Annotations = gs_10 + structure AsmFlags = gs_35 + structure AsmFormatUtil = gs_30 + structure AsmStream = gs_32 + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + signature HPPASHUFFLE = gs_18 + functor HppaInstr = gs_17 + signature INSTRUCTION_EMITTER = gs_20 + signature INSTRUCTION_STREAM = gs_25 + structure Int = gs_12 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + signature MLTREE_EVAL = gs_26 + structure String = gs_34 + structure TextIO = gs_33 + ../hppa/emit/hppaAsm.sml + in + functor gs_36 = HppaAsmEmitter + end + local + open l4 + in + signature gs_37 = INSTRUCTIONS + end + local + structure CellsBasis = gs_0 + signature INSTRUCTIONS = gs_37 + signature MLTREE = gs_7 + ../hppa/mltree/hppaLabelComp.sig + in + signature gs_38 = LABEL_COMP + end + local + open l4 + in + signature gs_39 = ARCH_SPILL_INSTR + end + local + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + functor HppaInstr = gs_17 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + ../hppa/ra/hppaRewrite.sml + in + functor gs_40 = HppaRewrite + end + local + signature ARCH_SPILL_INSTR = gs_39 + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + functor HppaInstr = gs_17 + functor HppaRewrite = gs_40 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + ../hppa/ra/hppaSpillInstr.sml + in + functor gs_41 = HppaSpillInstr + end + local + open l4 + in + signature gs_42 = FREQUENCY_PROPERTIES + end + local + open l37 + in + signature gs_43 = PROBABILITY + structure gs_44 = Probability + end + local + open l4 + in + structure gs_45 = MLRiscAnnotations + end + local + signature FREQUENCY_PROPERTIES = gs_42 + signature HPPAINSTR = gs_16 + functor HppaInstr = gs_17 + structure MLRiscAnnotations = gs_45 + signature PROBABILITY = gs_43 + structure Probability = gs_44 + ../hppa/instructions/hppaFreqProps.sml + in + functor gs_46 = HppaFreqProps + end + local + open l4 + in + signature gs_47 = PSEUDO_OPS_BASIS + end + local + open l4 + in + functor gs_48 = GasPseudoOps + end + local + open l4 + in + functor gs_49 = PseudoOpsBig + end + local + open l157 + in + structure gs_50 = Format + end + local + open l4 + in + structure gs_51 = PseudoOpsBasisTyp + end + local + structure Format = gs_50 + functor GasPseudoOps = gs_48 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + signature MLTREE = gs_7 + signature MLTREE_EVAL = gs_26 + signature PSEUDO_OPS_BASIS = gs_47 + structure PseudoOpsBasisTyp = gs_51 + functor PseudoOpsBig = gs_49 + structure Word32 = gs_23 + ../hppa/flowgraph/hppaGasPseudoOps.sml + in + functor gs_52 = HppaGasPseudoOps + end + local + open l4 + in + signature gs_53 = DELAY_SLOT_PROPERTIES + end + local + open l4 + in + signature gs_54 = INSN_PROPERTIES + end + local + structure CellsBasis = gs_0 + signature DELAY_SLOT_PROPERTIES = gs_53 + signature HPPAINSTR = gs_16 + functor HppaInstr = gs_17 + signature INSN_PROPERTIES = gs_54 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + structure Option = gs_2 + ../hppa/backpatch/hppaDelaySlotProps.sml + in + functor gs_55 = HppaDelaySlots + end + local + open l11 + in + structure gs_56 = Word + end + local + open l4 + in + signature gs_57 = MLTREE_HASH + end + local + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + functor HppaInstr = gs_17 + signature INSN_PROPERTIES = gs_54 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + signature MLTREE_EVAL = gs_26 + signature MLTREE_HASH = gs_57 + structure Option = gs_2 + structure Word = gs_56 + ../hppa/instructions/hppaProps.sml + in + functor gs_58 = HppaProps + end + local + open l4 + in + signature gs_59 = SDI_JUMPS + end + local + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + signature HPPASHUFFLE = gs_18 + functor HppaInstr = gs_17 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscErrorMsg = gs_4 + signature MLTREE_EVAL = gs_26 + signature SDI_JUMPS = gs_59 + structure Word = gs_56 + ../hppa/backpatch/hppaJumps.sml + in + functor gs_60 = HppaJumps + end + local + open l4 + in + functor gs_61 = MLTreeMult + end + local + open l4 + in + functor gs_62 = MLTreeGen + end + local + open l4 + in + signature gs_63 = MLTREECOMP + signature gs_64 = MLTREE_EXTENSION_COMP + end + local + structure CellsBasis = gs_0 + signature HPPAINSTR = gs_16 + signature HPPA_MILLICODE = gs_28 + functor HppaInstr = gs_17 + signature LABEL_COMP = gs_38 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_3 + structure MLRiscAnnotations = gs_45 + structure MLRiscErrorMsg = gs_4 + signature MLTREECOMP = gs_63 + signature MLTREE_EXTENSION_COMP = gs_64 + functor MLTreeGen = gs_62 + functor MLTreeMult = gs_61 + structure Word32 = gs_23 + ../hppa/mltree/hppa.sml + in + functor gs_65 = Hppa + end + in + signature HPPACELLS = gs_14 + signature HPPAINSTR = gs_16 + signature HPPASHUFFLE = gs_18 + signature HPPA_MILLICODE = gs_28 + functor Hppa = gs_65 + functor HppaAsmEmitter = gs_36 + structure HppaCells = gs_15 + functor HppaDelaySlots = gs_55 + functor HppaFreqProps = gs_46 + functor HppaGasPseudoOps = gs_52 + functor HppaInstr = gs_17 + functor HppaJumps = gs_60 + functor HppaMCEmitter = gs_27 + functor HppaProps = gs_58 + functor HppaRewrite = gs_40 + functor HppaShuffle = gs_19 + functor HppaSpillInstr = gs_41 + signature LABEL_COMP = gs_38 + end + end + + end diff -N -C 2 -r MLRISC/mlb/IA32-Peephole.mlb MLRISC-mlton/mlb/IA32-Peephole.mlb *** MLRISC/mlb/IA32-Peephole.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/IA32-Peephole.mlb 2010-04-02 16:08:59.000000000 -0400 *************** *** 0 **** --- 1,60 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l8 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l4 = + bas + (* $Peephole.cm(=(proxyLib.cm):.)/Peephole.cm =??=> *) Peephole.mlb + end + basis l16 = + bas + (* $IA32.cm(=(proxyLib.cm):.)/IA32.cm =??=> *) IA32.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = PEEPHOLE + end + local + open l8 + in + structure gs_1 = CellsBasis + end + local + open l8 + in + signature gs_2 = MLTREE_EVAL + end + local + open l16 + in + signature gs_3 = X86INSTR + functor gs_4 = X86Instr + end + local + structure CellsBasis = gs_1 + signature MLTREE_EVAL = gs_2 + signature PEEPHOLE = gs_0 + signature X86INSTR = gs_3 + functor X86Instr = gs_4 + ../x86/instructions/x86Peephole.sml + in + functor gs_5 = X86Peephole + end + in + functor X86Peephole = gs_5 + end + end + + end diff -N -C 2 -r MLRISC/mlb/IA32.mlb MLRISC-mlton/mlb/IA32.mlb *** MLRISC/mlb/IA32.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/IA32.mlb 2010-04-02 16:08:59.000000000 -0400 *************** *** 0 **** --- 1,800 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l35 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l112 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l12 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l236 = + bas + (* $Graphs.cm(=(proxyLib.cm):.)/Graphs.cm =??=> *) Graphs.mlb + end + basis l39 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + basis l317 = + bas + (* $MLTREE.cm(=(proxyLib.cm):.)/MLTREE.cm =??=> *) MLTREE.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = ARCH_SPILL_INSTR + end + local + open l4 + in + structure gs_1 = CellsBasis + end + local + open l12 + in + signature gs_2 = MLRISC_ERROR_MSG + structure gs_3 = MLRiscErrorMsg + end + local + open l4 + in + signature gs_4 = INSN_PROPERTIES + end + local + open l4 + in + signature gs_5 = REGION + end + local + open l4 + in + signature gs_6 = CONSTANT + end + local + open l4 + in + signature gs_7 = MLTREE + end + local + open l4 + in + signature gs_8 = CELLS_BASIS + end + local + open l4 + in + structure gs_9 = Label + end + local + open l35 + in + structure gs_10 = Int32 + end + local + open l39 + in + structure gs_11 = Annotations + end + local + open l4 + in + functor gs_12 = Cells + end + local + open l35 + in + structure gs_13 = Int + end + local + open l4 + in + signature gs_14 = CELLS + end + local + signature CELLS = gs_14 + functor Cells = gs_12 + structure CellsBasis = gs_1 + structure Int = gs_13 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + ../x86/instructions/x86Cells.sml + in + signature gs_15 = X86CELLS + structure gs_16 = X86Cells + end + local + structure Annotations = gs_11 + signature CELLS_BASIS = gs_8 + signature CONSTANT = gs_6 + structure CellsBasis = gs_1 + structure Int32 = gs_10 + structure Label = gs_9 + signature MLTREE = gs_7 + signature REGION = gs_5 + signature X86CELLS = gs_15 + structure X86Cells = gs_16 + ../x86/instructions/x86Instr.sml + in + signature gs_17 = X86INSTR + functor gs_18 = X86Instr + end + local + signature ARCH_SPILL_INSTR = gs_0 + structure CellsBasis = gs_1 + signature INSN_PROPERTIES = gs_4 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/ra/x86SpillInstr.sml + in + functor gs_19 = X86SpillInstr + end + local + structure CellsBasis = gs_1 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/instructions/x86MemRegs.sig + in + signature gs_20 = MEMORY_REGISTERS + end + local + open l4 + in + signature gs_21 = MC_EMIT + end + local + open l35 + in + structure gs_22 = Word32 + end + local + open l35 + in + structure gs_23 = Word8 + end + local + open l35 + in + structure gs_24 = LargeWord + end + local + open l35 + in + structure gs_25 = Word8Vector + end + local + open l35 + in + structure gs_26 = Option + end + local + open l35 + in + structure gs_27 = Word + end + local + open l4 + in + signature gs_28 = INSTRUCTION_EMITTER + end + local + open l4 + in + signature gs_29 = MLTREE_EVAL + end + local + structure CellsBasis = gs_1 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/instructions/x86Shuffle.sig + in + signature gs_30 = X86SHUFFLE + end + local + structure CellsBasis = gs_1 + signature INSTRUCTION_EMITTER = gs_28 + structure Int32 = gs_10 + structure LargeWord = gs_24 + signature MC_EMIT = gs_21 + signature MEMORY_REGISTERS = gs_20 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature MLTREE_EVAL = gs_29 + structure Option = gs_26 + structure Word = gs_27 + structure Word32 = gs_22 + structure Word8 = gs_23 + structure Word8Vector = gs_25 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + signature X86SHUFFLE = gs_30 + ../x86/x86MC.sml + in + functor gs_31 = X86MCEmitter + end + local + open l4 + in + signature gs_32 = PSEUDO_OPS_BASIS + end + local + open l4 + in + functor gs_33 = DarwinPseudoOps + end + local + open l4 + in + functor gs_34 = PseudoOpsLittle + end + local + open l112 + in + structure gs_35 = Format + end + local + open l4 + in + structure gs_36 = PseudoOpsBasisTyp + end + local + functor DarwinPseudoOps = gs_33 + structure Format = gs_35 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature MLTREE = gs_7 + signature MLTREE_EVAL = gs_29 + signature PSEUDO_OPS_BASIS = gs_32 + structure PseudoOpsBasisTyp = gs_36 + functor PseudoOpsLittle = gs_34 + structure Word32 = gs_22 + ../x86/flowgraph/x86-darwin-pseudo-ops.sml + in + functor gs_37 = X86DarwinPseudoOps + end + local + open l4 + in + functor gs_38 = Shuffle + end + local + open l35 + in + structure gs_39 = List + end + local + structure CellsBasis = gs_1 + structure List = gs_39 + functor Shuffle = gs_38 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + signature X86SHUFFLE = gs_30 + ../x86/instructions/x86Shuffle.sml + in + functor gs_40 = X86Shuffle + end + local + open l4 + in + signature gs_41 = CONTROL_FLOW_GRAPH + end + local + open l4 + in + signature gs_42 = MLTREE_STREAM + end + local + ../x86/instructions/x86instr-ext.sml + in + structure gs_43 = X86InstrExt + end + local + signature CONTROL_FLOW_GRAPH = gs_41 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature MLTREE_STREAM = gs_42 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + structure X86InstrExt = gs_43 + ../x86/instructions/x86comp-instr-ext.sml + in + signature gs_44 = X86COMP_INSTR_EXT + functor gs_45 = X86CompInstrExt + end + local + open l4 + in + functor gs_46 = GasPseudoOps + end + local + structure Format = gs_35 + functor GasPseudoOps = gs_46 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature MLTREE = gs_7 + signature MLTREE_EVAL = gs_29 + signature PSEUDO_OPS_BASIS = gs_32 + structure PseudoOpsBasisTyp = gs_36 + functor PseudoOpsLittle = gs_34 + structure Word32 = gs_22 + ../x86/flowgraph/x86GasPseudoOps.sml + in + functor gs_47 = X86GasPseudoOps + end + local + open l4 + in + signature gs_48 = C_CALLS + end + local + open l4 + in + structure gs_49 = CTypes + end + local + open l35 + in + structure gs_50 = IntInf + end + local + open l4 + in + structure gs_51 = MLRiscAnnotations + end + local + open l35 + in + structure gs_52 = String + end + local + structure CTypes = gs_49 + signature C_CALLS = gs_48 + structure Int = gs_13 + structure Int32 = gs_10 + structure IntInf = gs_50 + structure List = gs_39 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscAnnotations = gs_51 + structure MLRiscErrorMsg = gs_3 + signature MLTREE = gs_7 + structure String = gs_52 + structure Word = gs_27 + signature X86CELLS = gs_15 + structure X86Cells = gs_16 + structure X86InstrExt = gs_43 + ../x86/c-calls/ia32-svid.sml + in + functor gs_53 = IA32SVID_CCalls + end + local + open l4 + in + signature gs_54 = FREQUENCY_PROPERTIES + end + local + open l39 + in + signature gs_55 = PROBABILITY + structure gs_56 = Probability + end + local + signature FREQUENCY_PROPERTIES = gs_54 + structure MLRiscAnnotations = gs_51 + signature PROBABILITY = gs_55 + structure Probability = gs_56 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/instructions/x86FreqProps.sml + in + functor gs_57 = X86FreqProps + end + local + open l4 + in + signature gs_58 = MLTREE_HASH + end + local + structure CellsBasis = gs_1 + signature INSN_PROPERTIES = gs_4 + structure Int = gs_13 + structure Int32 = gs_10 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature MLTREE_EVAL = gs_29 + signature MLTREE_HASH = gs_58 + structure Word = gs_27 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/instructions/x86Props.sml + in + functor gs_59 = X86Props + end + local + open l4 + in + signature gs_60 = SDI_JUMPS + end + local + signature MC_EMIT = gs_21 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature MLTREE_EVAL = gs_29 + signature SDI_JUMPS = gs_60 + structure Word8Vector = gs_25 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + signature X86SHUFFLE = gs_30 + ../x86/backpatch/x86Jumps.sml + in + functor gs_61 = X86Jumps + end + local + signature CELLS_BASIS = gs_8 + structure CellsBasis = gs_1 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/ra/x86Rewrite.sig + in + signature gs_62 = X86REWRITE + end + local + open l4 + in + signature gs_63 = CFG_OPTIMIZATION + end + local + open l4 + in + functor gs_64 = GetReg + end + local + open l4 + in + functor gs_65 = RegisterAllocator + end + local + open l4 + in + functor gs_66 = MemoryRA + end + local + open l4 + in + functor gs_67 = RADeadCodeElim + end + local + open l4 + in + functor gs_68 = ClusterRA + end + local + open l4 + in + signature gs_69 = LIVENESS + functor gs_70 = Liveness + end + local + open l4 + in + signature gs_71 = PRINT_FLOWGRAPH + functor gs_72 = PrintFlowgraph + end + local + open l112 + in + structure gs_73 = IntHashTable + end + local + open l12 + in + signature gs_74 = MLRISC_CONTROL + structure gs_75 = MLRiscControl + end + local + open l236 + in + structure gs_76 = Graph + end + local + open l35 + in + structure gs_77 = Array + end + local + open l4 + in + signature gs_78 = RA_SPILL + end + local + open l4 + in + signature gs_79 = RA_SPILL_HEURISTICS + end + local + open l4 + in + structure gs_80 = RAGraph + end + local + open l112 + in + structure gs_81 = IntRedBlackMap + end + local + open l39 + in + structure gs_82 = StringOutStream + end + local + open l4 + in + signature gs_83 = ASM_STREAM + structure gs_84 = AsmStream + end + local + open l112 + in + structure gs_85 = ListMergeSort + end + local + open l35 + in + structure gs_86 = TextIO + end + local + open l35 + in + structure gs_87 = ListPair + end + local + signature ASM_STREAM = gs_83 + structure Annotations = gs_11 + structure Array = gs_77 + structure AsmStream = gs_84 + signature CFG_OPTIMIZATION = gs_63 + signature CONTROL_FLOW_GRAPH = gs_41 + structure CellsBasis = gs_1 + structure Graph = gs_76 + signature INSN_PROPERTIES = gs_4 + signature INSTRUCTION_EMITTER = gs_28 + structure Int = gs_13 + structure IntHashTable = gs_73 + structure IntRedBlackMap = gs_81 + signature LIVENESS = gs_69 + structure Label = gs_9 + structure List = gs_39 + structure ListMergeSort = gs_85 + structure ListPair = gs_87 + functor Liveness = gs_70 + signature MLRISC_CONTROL = gs_74 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscAnnotations = gs_51 + structure MLRiscControl = gs_75 + structure MLRiscErrorMsg = gs_3 + structure String = gs_52 + structure StringOutStream = gs_82 + structure TextIO = gs_86 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/mltree/x86-fp.sml + in + functor gs_88 = X86FP + end + local + structure Annotations = gs_11 + structure Array = gs_77 + signature CFG_OPTIMIZATION = gs_63 + signature CONTROL_FLOW_GRAPH = gs_41 + structure CellsBasis = gs_1 + functor ClusterRA = gs_68 + functor GetReg = gs_64 + structure Graph = gs_76 + signature INSN_PROPERTIES = gs_4 + signature INSTRUCTION_EMITTER = gs_28 + structure IntHashTable = gs_73 + signature LIVENESS = gs_69 + structure List = gs_39 + functor Liveness = gs_70 + signature MLRISC_CONTROL = gs_74 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscControl = gs_75 + structure MLRiscErrorMsg = gs_3 + functor MemoryRA = gs_66 + signature PRINT_FLOWGRAPH = gs_71 + functor PrintFlowgraph = gs_72 + functor RADeadCodeElim = gs_67 + structure RAGraph = gs_80 + signature RA_SPILL = gs_78 + signature RA_SPILL_HEURISTICS = gs_79 + functor RegisterAllocator = gs_65 + functor X86FP = gs_88 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + functor X86SpillInstr = gs_19 + ../x86/ra/x86RA.sml + in + functor gs_89 = X86RA + end + local + open l4 + in + signature gs_90 = OMIT_FRAME_POINTER + end + local + open l35 + in + structure gs_91 = General + end + local + signature CONTROL_FLOW_GRAPH = gs_41 + structure CellsBasis = gs_1 + structure General = gs_91 + structure Graph = gs_76 + structure Int32 = gs_10 + structure IntHashTable = gs_73 + structure ListPair = gs_87 + signature MEMORY_REGISTERS = gs_20 + signature MLRISC_CONTROL = gs_74 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscAnnotations = gs_51 + structure MLRiscControl = gs_75 + structure MLRiscErrorMsg = gs_3 + signature OMIT_FRAME_POINTER = gs_90 + structure Option = gs_26 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/omit-frameptr/x86omit-frameptr.sml + in + functor gs_92 = X86OmitFramePointer + end + local + open l4 + in + signature gs_93 = ASM_FORMAT_UTIL + structure gs_94 = AsmFormatUtil + end + local + open l35 + in + structure gs_95 = Char + end + local + open l4 + in + structure gs_96 = AsmFlags + end + local + open l4 + in + signature gs_97 = INSTRUCTION_STREAM + end + local + signature ASM_FORMAT_UTIL = gs_93 + signature ASM_STREAM = gs_83 + structure Annotations = gs_11 + structure AsmFlags = gs_96 + structure AsmFormatUtil = gs_94 + structure AsmStream = gs_84 + structure CellsBasis = gs_1 + structure Char = gs_95 + signature INSTRUCTION_EMITTER = gs_28 + signature INSTRUCTION_STREAM = gs_97 + structure Int = gs_13 + structure Int32 = gs_10 + signature MEMORY_REGISTERS = gs_20 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature MLTREE_EVAL = gs_29 + structure Option = gs_26 + structure String = gs_52 + structure TextIO = gs_86 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + signature X86SHUFFLE = gs_30 + ../x86/emit/x86Asm.sml + in + functor gs_98 = X86AsmEmitter + end + local + structure CellsBasis = gs_1 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscErrorMsg = gs_3 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + signature X86REWRITE = gs_62 + ../x86/ra/x86Rewrite.sml + in + functor gs_99 = X86Rewrite + end + local + open l4 + in + functor gs_100 = MLTreeGen + end + local + open l4 + in + signature gs_101 = MLTREECOMP + signature gs_102 = MLTREE_EXTENSION_COMP + end + local + open l317 + in + signature gs_103 = MLTREE_UTILS + end + local + structure Annotations = gs_11 + structure CellsBasis = gs_1 + structure Int = gs_13 + structure Int32 = gs_10 + structure Label = gs_9 + structure List = gs_39 + signature MLRISC_ERROR_MSG = gs_2 + structure MLRiscAnnotations = gs_51 + structure MLRiscErrorMsg = gs_3 + signature MLTREECOMP = gs_101 + signature MLTREE_EXTENSION_COMP = gs_102 + signature MLTREE_STREAM = gs_42 + signature MLTREE_UTILS = gs_103 + functor MLTreeGen = gs_100 + signature PROBABILITY = gs_55 + structure Probability = gs_56 + functor Shuffle = gs_38 + structure Word = gs_27 + structure Word32 = gs_22 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + ../x86/mltree/x86.sml + in + functor gs_104 = X86 + end + in + functor IA32SVID_CCalls = gs_53 + signature MEMORY_REGISTERS = gs_20 + functor X86 = gs_104 + functor X86AsmEmitter = gs_98 + signature X86CELLS = gs_15 + signature X86COMP_INSTR_EXT = gs_44 + structure X86Cells = gs_16 + functor X86CompInstrExt = gs_45 + functor X86DarwinPseudoOps = gs_37 + functor X86FP = gs_88 + functor X86FreqProps = gs_57 + functor X86GasPseudoOps = gs_47 + signature X86INSTR = gs_17 + functor X86Instr = gs_18 + structure X86InstrExt = gs_43 + functor X86Jumps = gs_61 + functor X86MCEmitter = gs_31 + functor X86OmitFramePointer = gs_92 + functor X86Props = gs_59 + functor X86RA = gs_89 + signature X86REWRITE = gs_62 + functor X86Rewrite = gs_99 + signature X86SHUFFLE = gs_30 + functor X86Shuffle = gs_40 + functor X86SpillInstr = gs_19 + end + end + + end diff -N -C 2 -r MLRISC/mlb/Lib.mlb MLRISC-mlton/mlb/Lib.mlb *** MLRISC/mlb/Lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/Lib.mlb 2010-04-02 16:08:59.000000000 -0400 *************** *** 0 **** --- 1,263 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = ArraySlice + end + local + open l4 + in + structure gs_1 = Array + end + local + open l4 + in + structure gs_2 = Vector + end + local + open l4 + in + structure gs_3 = General + end + local + open l4 + in + structure gs_4 = List + end + local + open l4 + in + structure gs_5 = Int + end + local + structure Array = gs_1 + structure ArraySlice = gs_0 + structure General = gs_3 + structure Int = gs_5 + structure List = gs_4 + structure Vector = gs_2 + ../library/dynamic-array.sml + in + structure gs_6 = DynArray + end + local + open l4 + in + structure gs_7 = String + end + local + open l4 + in + structure gs_8 = Word + end + local + open l4 + in + structure gs_9 = Word8 + end + local + open l4 + in + structure gs_10 = Word8Array + end + local + ../library/bitset.sig + in + signature gs_11 = BITSET + end + local + signature BITSET = gs_11 + structure String = gs_7 + structure Word = gs_8 + structure Word8 = gs_9 + structure Word8Array = gs_10 + ../library/bitset.sml + in + structure gs_12 = BitSet + end + local + open l4 + in + structure gs_13 = TextIO + end + local + structure TextIO = gs_13 + ../library/stringOutStream.sig + in + signature gs_14 = STRING_OUTSTREAM + end + local + structure String = gs_7 + ../library/line-break.sml + in + signature gs_15 = LINE_BREAK + structure gs_16 = LineBreak + end + local + open l4 + in + structure gs_17 = Real + end + local + open l4 + in + structure gs_18 = IntInf + end + local + structure Int = gs_5 + structure IntInf = gs_18 + structure List = gs_4 + structure Real = gs_17 + ../library/probability.sml + in + signature gs_19 = PROBABILITY + structure gs_20 = Probability + end + local + open l4 + in + structure gs_21 = TextPrimIO + end + local + open l4 + in + structure gs_22 = CharArraySlice + end + local + open l4 + in + structure gs_23 = CharVectorSlice + end + local + open l4 + in + structure gs_24 = IO + end + local + structure CharArraySlice = gs_22 + structure CharVectorSlice = gs_23 + structure IO = gs_24 + structure List = gs_4 + signature STRING_OUTSTREAM = gs_14 + structure String = gs_7 + structure TextIO = gs_13 + structure TextPrimIO = gs_21 + ../library/stringOutStream.sml + in + structure gs_25 = StringOutStream + end + local + ../library/catlist.sml + in + signature gs_26 = CATNETABLE_LIST + structure gs_27 = CatnetableList + end + local + ../library/priQueue.sig + in + signature gs_28 = PRIORITY_QUEUE + end + local + structure Array = gs_1 + signature PRIORITY_QUEUE = gs_28 + ../library/heap.sml + in + structure gs_29 = PriorityHeap + end + local + ../library/annotations.sig + in + signature gs_30 = ANNOTATIONS + end + local + signature ANNOTATIONS = gs_30 + ../library/annotations.sml + in + structure gs_31 = Annotations + end + local + structure Array = gs_1 + structure List = gs_4 + structure Vector = gs_2 + structure Word = gs_8 + ../library/hash-array.sml + in + structure gs_32 = HashArray + end + local + ../library/cache.sml + in + signature gs_33 = CACHE_REF + structure gs_34 = CacheRef + end + local + ../library/sortedlist.sml + in + structure gs_35 = SortedList + end + local + structure Int = gs_5 + signature PRIORITY_QUEUE = gs_28 + ../library/priQueue.sml + in + structure gs_36 = PriorityQueue + end + local + open l4 + in + signature gs_37 = INTEGER + end + local + signature INTEGER = gs_37 + ../library/freq.sig + in + signature gs_38 = FREQ + end + local + signature FREQ = gs_38 + structure Int = gs_5 + ../library/freq.sml + in + structure gs_39 = Freq + end + in + signature ANNOTATIONS = gs_30 + structure Annotations = gs_31 + signature BITSET = gs_11 + structure BitSet = gs_12 + signature CACHE_REF = gs_33 + signature CATNETABLE_LIST = gs_26 + structure CacheRef = gs_34 + structure CatnetableList = gs_27 + structure DynArray = gs_6 + signature FREQ = gs_38 + structure Freq = gs_39 + structure HashArray = gs_32 + signature LINE_BREAK = gs_15 + structure LineBreak = gs_16 + signature PRIORITY_QUEUE = gs_28 + signature PROBABILITY = gs_19 + structure PriorityHeap = gs_29 + structure PriorityQueue = gs_36 + structure Probability = gs_20 + signature STRING_OUTSTREAM = gs_14 + structure SortedList = gs_35 + structure StringOutStream = gs_25 + end + end + + end diff -N -C 2 -r MLRISC/mlb/MLRISC.mlb MLRISC-mlton/mlb/MLRISC.mlb *** MLRISC/mlb/MLRISC.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/MLRISC.mlb 2010-04-02 16:08:59.000000000 -0400 *************** *** 0 **** --- 1,1746 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l13 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l19 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l44 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l5 = + bas + (* $Graphs.cm(=(proxyLib.cm):.)/Graphs.cm =??=> *) Graphs.mlb + end + basis l9 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l5 + in + structure gs_0 = Graph + end + local + open l9 + in + structure gs_1 = Annotations + end + local + open l13 + in + structure gs_2 = TextIO + end + local + open l19 + in + signature gs_3 = MONO_HASH_TABLE + end + local + open l13 + in + structure gs_4 = Array + end + local + structure Annotations = gs_1 + structure Array = gs_4 + signature MONO_HASH_TABLE = gs_3 + ../instructions/cells-basis.sig + in + signature gs_5 = CELLS_BASIS + end + local + open l19 + in + functor gs_6 = HashTableFn + end + local + open l13 + in + structure gs_7 = String + end + local + open l13 + in + structure gs_8 = Word + end + local + open l13 + in + structure gs_9 = List + end + local + open l44 + in + signature gs_10 = MLRISC_ERROR_MSG + structure gs_11 = MLRiscErrorMsg + end + local + open l13 + in + structure gs_12 = Int + end + local + structure Annotations = gs_1 + structure Array = gs_4 + signature CELLS_BASIS = gs_5 + functor HashTableFn = gs_6 + structure Int = gs_12 + structure List = gs_9 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + structure String = gs_7 + structure Word = gs_8 + ../instructions/cells-basis.sml + in + structure gs_13 = CellsBasis + end + local + structure CellsBasis = gs_13 + ../instructions/cells.sig + in + signature gs_14 = CELLS + end + local + structure Annotations = gs_1 + signature CELLS = gs_14 + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + ../instructions/instructions.sig + in + signature gs_15 = INSTRUCTIONS + end + local + open l13 + in + structure gs_16 = Word8 + end + local + open l13 + in + structure gs_17 = Int32 + end + local + open l13 + in + structure gs_18 = IntInf + end + local + open l13 + in + structure gs_19 = Int64 + end + local + open l13 + in + structure gs_20 = Word32 + end + local + structure Int32 = gs_17 + structure Int64 = gs_19 + structure IntInf = gs_18 + structure Word32 = gs_20 + ../mltree/machine-int.sig + in + signature gs_21 = MACHINE_INT + end + local + ../mltree/mltree-extension.sig + in + signature gs_22 = MLTREE_EXTENSION + end + local + ../mltree/mltree-basis.sig + in + signature gs_23 = MLTREE_BASIS + end + local + ../instructions/region.sig + in + signature gs_24 = REGION + end + local + ../instructions/constant.sig + in + signature gs_25 = CONSTANT + end + local + ../instructions/label-sig.sml + in + signature gs_26 = LABEL + end + local + signature LABEL = gs_26 + structure Word = gs_8 + ../instructions/label.sml + in + structure gs_27 = Label + end + local + structure Annotations = gs_1 + signature CONSTANT = gs_25 + structure CellsBasis = gs_13 + structure Int32 = gs_17 + structure Label = gs_27 + signature MACHINE_INT = gs_21 + signature MLTREE_BASIS = gs_23 + signature MLTREE_EXTENSION = gs_22 + signature REGION = gs_24 + ../mltree/mltree.sig + in + signature gs_28 = MLTREE + end + local + open l19 + in + structure gs_29 = Atom + end + local + structure Atom = gs_29 + structure Label = gs_27 + ../flowgraph/pseudo-ops-basis-typ.sml + in + structure gs_30 = PseudoOpsBasisTyp + end + local + structure Label = gs_27 + signature MLTREE = gs_28 + structure PseudoOpsBasisTyp = gs_30 + structure Word8 = gs_16 + ../flowgraph/pseudo-ops-basis.sig + in + signature gs_31 = PSEUDO_OPS_BASIS + end + local + signature PSEUDO_OPS_BASIS = gs_31 + structure Word8 = gs_16 + ../flowgraph/client-pseudo-ops.sig + in + signature gs_32 = CLIENT_PSEUDO_OPS + end + local + signature CLIENT_PSEUDO_OPS = gs_32 + signature MLTREE = gs_28 + structure PseudoOpsBasisTyp = gs_30 + structure Word8 = gs_16 + ../flowgraph/pseudo-ops.sig + in + signature gs_33 = PSEUDO_OPS + end + local + structure Annotations = gs_1 + structure Graph = gs_0 + signature INSTRUCTIONS = gs_15 + structure Label = gs_27 + signature PSEUDO_OPS = gs_33 + structure TextIO = gs_2 + ../flowgraph/cfg.sig + in + signature gs_34 = CONTROL_FLOW_GRAPH + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + ../emit/asmEmit.sig + in + signature gs_35 = ASSEMBLY_EMITTER + end + local + structure List = gs_9 + signature MLTREE = gs_28 + ../mltree/mltree-check-ty.sml + in + functor gs_36 = MLTreeCheckTy + end + local + open l5 + in + signature gs_37 = GRAPH_IMPLEMENTATION + end + local + structure Array = gs_4 + signature GRAPH_IMPLEMENTATION = gs_37 + structure Graph = gs_0 + ../ir-archive/dominator.sig + in + signature gs_38 = DOMINATOR_TREE + end + local + structure Array = gs_4 + signature DOMINATOR_TREE = gs_38 + signature GRAPH_IMPLEMENTATION = gs_37 + structure Graph = gs_0 + ../ir-archive/loop-structure.sig + in + signature gs_39 = LOOP_STRUCTURE + end + local + open l9 + in + structure gs_40 = BitSet + end + local + open l5 + in + signature gs_41 = REVERSED_GRAPH_VIEW + structure gs_42 = ReversedGraphView + end + local + structure Array = gs_4 + structure BitSet = gs_40 + signature DOMINATOR_TREE = gs_38 + signature GRAPH_IMPLEMENTATION = gs_37 + structure Graph = gs_0 + structure List = gs_9 + signature REVERSED_GRAPH_VIEW = gs_41 + structure ReversedGraphView = gs_42 + ../ir-archive/dominator.sml + in + functor gs_43 = DominatorTree + end + local + structure Annotations = gs_1 + structure Label = gs_27 + signature PSEUDO_OPS = gs_33 + ../instructions/stream.sig + in + signature gs_44 = INSTRUCTION_STREAM + end + local + structure Annotations = gs_1 + signature INSTRUCTION_STREAM = gs_44 + structure Label = gs_27 + signature PSEUDO_OPS = gs_33 + ../instructions/stream.sml + in + functor gs_45 = InstructionStream + end + local + signature MLTREE = gs_28 + ../mltree/mltree-size.sig + in + signature gs_46 = MLTREE_SIZE + end + local + structure Annotations = gs_1 + structure CellsBasis = gs_13 + signature MLTREE = gs_28 + signature MLTREE_SIZE = gs_46 + ../mltree/mltree-gen.sig + in + signature gs_47 = MLTREEGEN + end + local + signature INSTRUCTION_STREAM = gs_44 + signature MLTREE = gs_28 + ../mltree/mltree-stream.sig + in + signature gs_48 = MLTREE_STREAM + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + signature MLTREE = gs_28 + signature MLTREEGEN = gs_47 + signature MLTREE_STREAM = gs_48 + ../mltree/mltreecomp.sig + in + signature gs_49 = MLTREECOMP + signature gs_50 = MLTREE_EXTENSION_COMP + end + local + open l19 + in + structure gs_51 = Format + end + local + structure TextIO = gs_2 + ../emit/asmStream.sml + in + signature gs_52 = ASM_STREAM + structure gs_53 = AsmStream + end + local + structure Annotations = gs_1 + signature INSTRUCTIONS = gs_15 + signature INSTRUCTION_STREAM = gs_44 + ../emit/instruction-emitter.sig + in + signature gs_54 = INSTRUCTION_EMITTER + end + local + signature ASM_STREAM = gs_52 + structure AsmStream = gs_53 + signature CONTROL_FLOW_GRAPH = gs_34 + structure Format = gs_51 + structure Graph = gs_0 + signature INSTRUCTION_EMITTER = gs_54 + structure Int = gs_12 + structure List = gs_9 + structure TextIO = gs_2 + ../flowgraph/printFlowgraph.sml + in + signature gs_55 = PRINT_FLOWGRAPH + functor gs_56 = PrintFlowgraph + end + local + structure Array = gs_4 + ../ra/getreg.sig + in + signature gs_57 = GETREG + end + local + structure Array = gs_4 + signature GETREG = gs_57 + ../ra/getreg.sml + in + functor gs_58 = GetReg + end + local + signature INSTRUCTIONS = gs_15 + structure Label = gs_27 + ../backpatch/delaySlotProps.sig + in + signature gs_59 = DELAY_SLOT_PROPERTIES + end + local + structure List = gs_9 + ../c-calls/c-types.sml + in + structure gs_60 = CTypes + end + local + structure CTypes = gs_60 + signature MLTREE = gs_28 + ../c-calls/c-calls.sig + in + signature gs_61 = C_CALLS + end + local + signature C_CALLS = gs_61 + signature MLTREE = gs_28 + ../c-calls/unimplemented-c-calls.sml + in + functor gs_62 = UnimplementedCCallsFn + end + local + open l44 + in + signature gs_63 = MLRISC_CONTROL + structure gs_64 = MLRiscControl + end + local + open l19 + in + structure gs_65 = ListMergeSort + end + local + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + ../aliasing/pointsTo.sig + in + signature gs_66 = POINTS_TO + end + local + structure CellsBasis = gs_13 + structure Int = gs_12 + structure ListMergeSort = gs_65 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + signature POINTS_TO = gs_66 + ../aliasing/pointsTo.sml + in + structure gs_67 = PointsTo + end + local + open l13 + in + structure gs_68 = Char + end + local + signature MLTREE = gs_28 + structure PseudoOpsBasisTyp = gs_30 + structure Word8 = gs_16 + ../flowgraph/pseudo-ops-endian.sig + in + signature gs_69 = PSEUDO_OPS_ENDIAN + end + local + structure IntInf = gs_18 + structure Label = gs_27 + signature MLTREE = gs_28 + ../mltree/mltree-eval.sig + in + signature gs_70 = MLTREE_EVAL + end + local + structure Char = gs_68 + structure Int = gs_12 + structure IntInf = gs_18 + structure Label = gs_27 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature MLTREE = gs_28 + signature MLTREE_EVAL = gs_70 + signature PSEUDO_OPS_ENDIAN = gs_69 + structure PseudoOpsBasisTyp = gs_30 + structure String = gs_7 + structure Word = gs_8 + structure Word32 = gs_20 + structure Word8 = gs_16 + ../flowgraph/pseudo-ops-big.sml + in + functor gs_71 = PseudoOpsBig + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + ../backpatch/bbsched.sig + in + signature gs_72 = BBSCHED + end + local + structure Annotations = gs_1 + signature CELLS = gs_14 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + structure Label = gs_27 + ../instructions/insnProps.sig + in + signature gs_73 = INSN_PROPERTIES + end + local + signature CELLS = gs_14 + signature INSTRUCTIONS = gs_15 + structure Label = gs_27 + ../backpatch/sdi-jumps.sig + in + signature gs_74 = SDI_JUMPS + end + local + structure Array = gs_4 + signature BBSCHED = gs_72 + signature CONTROL_FLOW_GRAPH = gs_34 + signature DELAY_SLOT_PROPERTIES = gs_59 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTION_EMITTER = gs_54 + structure Label = gs_27 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + signature SDI_JUMPS = gs_74 + ../backpatch/spanDep.sml + in + functor gs_75 = SpanDependencyResolution + end + local + structure Label = gs_27 + signature MLTREE = gs_28 + structure PseudoOpsBasisTyp = gs_30 + ../flowgraph/as-pseudo-ops.sig + in + signature gs_76 = AS_PSEUDO_OPS + end + local + signature AS_PSEUDO_OPS = gs_76 + structure Atom = gs_29 + structure Format = gs_51 + structure Int = gs_12 + structure IntInf = gs_18 + structure Label = gs_27 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature MLTREE = gs_28 + structure PseudoOpsBasisTyp = gs_30 + structure String = gs_7 + ../flowgraph/darwin-pseudo-ops.sml + in + functor gs_77 = DarwinPseudoOps + end + local + signature CELLS = gs_14 + structure CellsBasis = gs_13 + ../ra/ra-flowgraph-part.sig + in + signature gs_78 = RA_FLOWGRAPH_PARTITIONER + end + local + structure Word8 = gs_16 + ../emit/code-string.sig + in + signature gs_79 = CODE_STRING + end + local + open l9 + in + signature gs_80 = PROBABILITY + structure gs_81 = Probability + end + local + open l13 + in + structure gs_82 = Real + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + ../frequencies/compute-execution-freqs.sig + in + signature gs_83 = COMPUTE_EXECUTION_FREQUENCIES + end + local + structure Annotations = gs_1 + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + signature PROBABILITY = gs_80 + structure Probability = gs_81 + ../instructions/mlriscAnnotations.sig + in + signature gs_84 = MLRISC_ANNOTATIONS + end + local + structure Annotations = gs_1 + structure CellsBasis = gs_13 + structure Int = gs_12 + signature MLRISC_ANNOTATIONS = gs_84 + signature PROBABILITY = gs_80 + structure Probability = gs_81 + ../instructions/mlriscAnnotations.sml + in + structure gs_85 = MLRiscAnnotations + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + structure MLRiscAnnotations = gs_85 + structure MLRiscControl = gs_64 + signature PROBABILITY = gs_80 + structure Probability = gs_81 + ../frequencies/complete-probs-fn.sml + in + functor gs_86 = CompleteProbsFn + end + local + structure Array = gs_4 + signature COMPUTE_EXECUTION_FREQUENCIES = gs_83 + signature CONTROL_FLOW_GRAPH = gs_34 + functor CompleteProbsFn = gs_86 + structure Format = gs_51 + structure Graph = gs_0 + structure Int = gs_12 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + structure MLRiscControl = gs_64 + signature PROBABILITY = gs_80 + structure Probability = gs_81 + structure Real = gs_82 + structure TextIO = gs_2 + ../frequencies/compute-freqs-fn.sml + in + functor gs_87 = ComputeFreqsFn + end + local + signature MLTREE = gs_28 + ../mltree/mltree-hash.sig + in + signature gs_88 = MLTREE_HASH + end + local + ../aliasing/mlriscRegion.sig + in + signature gs_89 = MLRISC_REGION + end + local + ../instructions/mlriscOptimization.sig + in + signature gs_90 = MLRISC_OPTIMIZATION + end + local + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + ../instructions/shuffle.sig + in + signature gs_91 = SHUFFLE + end + local + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + ../ra/arch-spill-instr.sig + in + signature gs_92 = ARCH_SPILL_INSTR + end + local + signature AS_PSEUDO_OPS = gs_76 + structure Atom = gs_29 + structure Format = gs_51 + structure Int = gs_12 + structure IntInf = gs_18 + structure Label = gs_27 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature MLTREE = gs_28 + structure PseudoOpsBasisTyp = gs_30 + structure String = gs_7 + ../flowgraph/gasPseudoOps.sml + in + functor gs_93 = GasPseudoOps + end + local + structure Array = gs_4 + ../ra/ra-bitmatrix.sig + in + signature gs_94 = RA_BITMATRIX + end + local + ../ra/ra-priqueue.sig + in + signature gs_95 = RA_PRIORITY_QUEUE + end + local + open l13 + in + structure gs_96 = Unsafe + end + local + structure Array = gs_4 + signature RA_BITMATRIX = gs_94 + structure Unsafe = gs_96 + structure Word = gs_8 + ../ra/raBitmatrix.sml + in + structure gs_97 = RaBitmatrix + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + structure Label = gs_27 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + structure TextIO = gs_2 + ../block-placement/jump-chain-elim-fn.sml + in + functor gs_98 = JumpChainElimFn + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + ../flowgraph/cfg-optimization.sig + in + signature gs_99 = CFG_OPTIMIZATION + end + local + signature CFG_OPTIMIZATION = gs_99 + signature CONTROL_FLOW_GRAPH = gs_34 + structure CellsBasis = gs_13 + structure Graph = gs_0 + structure List = gs_9 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature SHUFFLE = gs_91 + ../flowgraph/cfgExpandCopies.sml + in + functor gs_100 = CFGExpandCopies + end + local + signature INSTRUCTION_STREAM = gs_44 + signature MLTREE = gs_28 + signature MLTREE_STREAM = gs_48 + ../mltree/mltree-stream.sml + in + functor gs_101 = MLTreeStream + end + local + structure Char = gs_68 + structure Int = gs_12 + structure IntInf = gs_18 + structure Label = gs_27 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature MLTREE = gs_28 + signature MLTREE_EVAL = gs_70 + signature PSEUDO_OPS_ENDIAN = gs_69 + structure PseudoOpsBasisTyp = gs_30 + structure String = gs_7 + structure Word = gs_8 + structure Word32 = gs_20 + structure Word8 = gs_16 + ../flowgraph/pseudo-ops-little.sml + in + functor gs_102 = PseudoOpsLittle + end + local + signature MLTREE = gs_28 + signature MLTREE_SIZE = gs_46 + ../mltree/mltree-size.sml + in + functor gs_103 = MLTreeSize + end + local + signature CELLS = gs_14 + structure CellsBasis = gs_13 + structure Int = gs_12 + structure Label = gs_27 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature MLTREE = gs_28 + signature MLTREEGEN = gs_47 + functor MLTreeSize = gs_103 + ../mltree/mltree-gen.sml + in + functor gs_104 = MLTreeGen + end + local + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature MLTREE_BASIS = gs_23 + ../mltree/mltree-basis.sml + in + structure gs_105 = MLTreeBasis + end + local + signature CLIENT_PSEUDO_OPS = gs_32 + signature PSEUDO_OPS = gs_33 + structure PseudoOpsBasisTyp = gs_30 + ../flowgraph/pseudo-ops.sml + in + functor gs_106 = PseudoOps + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + ../block-placement/block-placement.sig + in + signature gs_107 = BLOCK_PLACEMENT + end + local + open l19 + in + structure gs_108 = IntHashTable + end + local + structure Array = gs_4 + signature CELLS_BASIS = gs_5 + structure IntHashTable = gs_108 + signature MONO_HASH_TABLE = gs_3 + signature RA_BITMATRIX = gs_94 + structure RaBitmatrix = gs_97 + ../ra/ra-graph.sig + in + signature gs_109 = RA_GRAPH + end + local + structure Array = gs_4 + structure CellsBasis = gs_13 + functor HashTableFn = gs_6 + structure IntHashTable = gs_108 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature RA_GRAPH = gs_109 + structure RaBitmatrix = gs_97 + structure Word = gs_8 + ../ra/ra-graph.sml + in + structure gs_110 = RAGraph + end + local + structure Annotations = gs_1 + signature CELLS = gs_14 + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + structure RAGraph = gs_110 + signature RA_GRAPH = gs_109 + ../ra/ra-spill.sig + in + signature gs_111 = RA_SPILL + end + local + signature INSTRUCTIONS = gs_15 + signature PROBABILITY = gs_80 + structure Probability = gs_81 + ../instructions/freqProps.sig + in + signature gs_112 = FREQUENCY_PROPERTIES + end + local + signature FREQUENCY_PROPERTIES = gs_112 + signature INSN_PROPERTIES = gs_73 + structure MLRiscAnnotations = gs_85 + signature PROBABILITY = gs_80 + structure Probability = gs_81 + ../instructions/freqProps.sml + in + functor gs_113 = FreqProps + end + local + structure Annotations = gs_1 + signature CONTROL_FLOW_GRAPH = gs_34 + structure Format = gs_51 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTIONS = gs_15 + signature INSTRUCTION_STREAM = gs_44 + structure IntHashTable = gs_108 + structure Label = gs_27 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscAnnotations = gs_85 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + signature PSEUDO_OPS = gs_33 + structure PseudoOpsBasisTyp = gs_30 + structure Word = gs_8 + ../flowgraph/buildFlowgraph.sml + in + functor gs_114 = BuildFlowgraph + signature gs_115 = CONTROL_FLOWGRAPH_GEN + end + local + structure RAGraph = gs_110 + signature RA_GRAPH = gs_109 + ../ra/ra-spillheur.sig + in + signature gs_116 = RA_SPILL_HEURISTICS + end + local + signature MLRISC_CONTROL = gs_63 + structure MLRiscControl = gs_64 + ../emit/asm-flags.sml + in + structure gs_117 = AsmFlags + end + local + structure Annotations = gs_1 + structure IntInf = gs_18 + ../gc-safety/gc-type.sig + in + signature gs_118 = GC_TYPE + end + local + structure Annotations = gs_1 + signature CELLS = gs_14 + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + signature GC_TYPE = gs_118 + ../gc-safety/gc-cells.sig + in + signature gs_119 = GC_CELLS + end + local + structure Annotations = gs_1 + signature CELLS = gs_14 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + structure RAGraph = gs_110 + signature RA_GRAPH = gs_109 + signature RA_SPILL = gs_111 + structure TextIO = gs_2 + ../ra/ra-flowgraph.sig + in + signature gs_120 = RA_FLOWGRAPH + end + local + structure Array = gs_4 + signature CELLS = gs_14 + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + structure RAGraph = gs_110 + signature RA_FLOWGRAPH = gs_120 + ../ra/ra.sig + in + signature gs_121 = RA + end + local + open l13 + in + structure gs_122 = Word8Array + end + local + structure RAGraph = gs_110 + signature RA_BITMATRIX = gs_94 + signature RA_GRAPH = gs_109 + signature RA_PRIORITY_QUEUE = gs_95 + structure TextIO = gs_2 + ../ra/ra-core.sig + in + signature gs_123 = RA_CORE + end + local + signature RA_PRIORITY_QUEUE = gs_95 + ../ra/raPriQueue.sml + in + functor gs_124 = RaPriQueue + end + local + structure Array = gs_4 + structure Int = gs_12 + structure IntHashTable = gs_108 + structure List = gs_9 + structure ListMergeSort = gs_65 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + structure RAGraph = gs_110 + signature RA_CORE = gs_123 + functor RaPriQueue = gs_124 + structure Real = gs_82 + structure TextIO = gs_2 + structure Unsafe = gs_96 + structure Word = gs_8 + structure Word8 = gs_16 + structure Word8Array = gs_122 + ../ra/ra-core.sml + in + structure gs_125 = RACore + end + local + structure Array = gs_4 + structure CellsBasis = gs_13 + structure Int = gs_12 + structure IntHashTable = gs_108 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + signature RA = gs_121 + structure RACore = gs_125 + signature RA_FLOWGRAPH = gs_120 + signature RA_SPILL_HEURISTICS = gs_116 + structure Real = gs_82 + structure TextIO = gs_2 + structure Word = gs_8 + ../ra/ra.sml + in + functor gs_126 = RegisterAllocator + end + local + structure CellsBasis = gs_13 + structure IntHashTable = gs_108 + structure RACore = gs_125 + signature RA_FLOWGRAPH = gs_120 + structure Word = gs_8 + ../ra/ra-deadCodeE.sml + in + functor gs_127 = RADeadCodeElim + end + local + open l19 + in + structure gs_128 = URef + end + local + structure Array = gs_4 + signature DOMINATOR_TREE = gs_38 + signature GRAPH_IMPLEMENTATION = gs_37 + structure Graph = gs_0 + signature LOOP_STRUCTURE = gs_39 + structure List = gs_9 + structure URef = gs_128 + ../ir-archive/loop-structure.sml + in + functor gs_129 = LoopStructure + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTION_EMITTER = gs_54 + structure Label = gs_27 + structure List = gs_9 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature SDI_JUMPS = gs_74 + ../backpatch/backpatch.sml + in + functor gs_130 = BBSched2 + end + local + structure Array = gs_4 + signature CONTROL_FLOW_GRAPH = gs_34 + structure CellsBasis = gs_13 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTION_EMITTER = gs_54 + structure Int = gs_12 + structure IntHashTable = gs_108 + structure List = gs_9 + structure ListMergeSort = gs_65 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + structure RACore = gs_125 + structure RAGraph = gs_110 + signature RA_FLOWGRAPH = gs_120 + signature RA_SPILL = gs_111 + structure TextIO = gs_2 + structure Unsafe = gs_96 + structure Word = gs_8 + ../ra/cluster-ra.sml + in + functor gs_131 = ClusterRA + end + local + structure RACore = gs_125 + structure RAGraph = gs_110 + signature RA_SPILL_HEURISTICS = gs_116 + ../ra/chaitin-spillheur.sml + in + structure gs_132 = ChaitinSpillHeur + end + local + open l19 + in + functor gs_133 = LeftPriorityQFn + end + local + signature BLOCK_PLACEMENT = gs_107 + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + structure Int = gs_12 + structure IntHashTable = gs_108 + functor LeftPriorityQFn = gs_133 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + structure MLRiscControl = gs_64 + structure Real = gs_82 + structure TextIO = gs_2 + structure URef = gs_128 + ../block-placement/weighted-block-placement-fn.sml + in + functor gs_134 = WeightedBlockPlacementFn + end + local + structure Array = gs_4 + signature BLOCK_PLACEMENT = gs_107 + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + structure Int = gs_12 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + structure TextIO = gs_2 + ../block-placement/default-block-placement.sml + in + functor gs_135 = DefaultBlockPlacement + end + local + signature BLOCK_PLACEMENT = gs_107 + signature CONTROL_FLOW_GRAPH = gs_34 + functor DefaultBlockPlacement = gs_135 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + signature MLRISC_CONTROL = gs_63 + structure MLRiscControl = gs_64 + functor WeightedBlockPlacementFn = gs_134 + ../block-placement/block-placement.sml + in + functor gs_136 = BlockPlacement + end + local + signature CELLS = gs_14 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + signature MLTREE = gs_28 + ../mltree/mltree-mult.sig + in + signature gs_137 = MLTREE_MULT_DIV + end + local + structure Array = gs_4 + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature MLTREE = gs_28 + signature MLTREE_MULT_DIV = gs_137 + structure Word = gs_8 + ../mltree/mltree-mult.sml + in + functor gs_138 = MLTreeMult + end + local + structure CellsBasis = gs_13 + structure Char = gs_68 + structure Int = gs_12 + structure Label = gs_27 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + signature MLTREE = gs_28 + signature MLTREE_HASH = gs_88 + structure String = gs_7 + structure Word = gs_8 + ../mltree/mltree-hash.sml + in + functor gs_139 = MLTreeHash + end + local + structure CellsBasis = gs_13 + structure IntInf = gs_18 + structure Label = gs_27 + signature MLTREE = gs_28 + signature MLTREE_EVAL = gs_70 + ../mltree/mltree-eval.sml + in + functor gs_140 = MLTreeEval + end + local + structure Annotations = gs_1 + signature CELLS = gs_14 + structure CellsBasis = gs_13 + signature GC_CELLS = gs_119 + signature GC_TYPE = gs_118 + ../gc-safety/gc-cells.sml + in + functor gs_141 = GCCells + end + local + structure Array = gs_4 + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + structure Int = gs_12 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + structure TextIO = gs_2 + ../block-placement/check-placement-fn.sml + in + functor gs_142 = CheckPlacementFn + end + local + structure Array = gs_4 + signature CELLS = gs_14 + structure CellsBasis = gs_13 + structure Int = gs_12 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + ../instructions/cells.sml + in + functor gs_143 = Cells + end + local + signature DELAY_SLOT_PROPERTIES = gs_59 + signature INSTRUCTIONS = gs_15 + ../backpatch/noDelaySlots.sml + in + functor gs_144 = NoDelaySlots + end + local + structure Annotations = gs_1 + signature CELLS_BASIS = gs_5 + structure CellsBasis = gs_13 + structure Label = gs_27 + structure List = gs_9 + structure MLRiscAnnotations = gs_85 + ../emit/asmUtil.sml + in + signature gs_145 = ASM_FORMAT_UTIL + structure gs_146 = AsmFormatUtil + end + local + open l13 + in + structure gs_147 = ListPair + end + local + open l13 + in + structure gs_148 = Option + end + local + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + structure List = gs_9 + structure ListPair = gs_147 + structure Option = gs_148 + ../instructions/shuffle.sml + in + functor gs_149 = Shuffle + end + local + open l5 + in + functor gs_150 = DirectedGraph + structure gs_151 = DirectedGraph + end + local + structure Annotations = gs_1 + signature CONTROL_FLOW_GRAPH = gs_34 + functor DirectedGraph = gs_150 + structure DirectedGraph = gs_151 + functor DominatorTree = gs_43 + structure Graph = gs_0 + structure List = gs_9 + functor LoopStructure = gs_129 + signature MLRISC_CONTROL = gs_63 + structure MLRiscAnnotations = gs_85 + structure MLRiscControl = gs_64 + signature PROBABILITY = gs_80 + structure Probability = gs_81 + ../frequencies/estimate-loop-probs-fn.sml + in + functor gs_152 = EstimateLoopProbsFn + end + local + open l13 + in + structure gs_153 = StringCvt + end + local + structure Array = gs_4 + structure Int32 = gs_17 + structure Int64 = gs_19 + structure IntInf = gs_18 + signature MACHINE_INT = gs_21 + structure String = gs_7 + structure StringCvt = gs_153 + structure Word = gs_8 + structure Word32 = gs_20 + ../mltree/machine-int.sml + in + structure gs_154 = MachineInt + end + local + structure Array = gs_4 + structure Int = gs_12 + structure IntHashTable = gs_108 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + structure RACore = gs_125 + structure RAGraph = gs_110 + signature RA_FLOWGRAPH = gs_120 + structure Real = gs_82 + structure Word = gs_8 + ../ra/mem-ra.sml + in + functor gs_155 = MemoryRA + end + local + structure Annotations = gs_1 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + structure RAGraph = gs_110 + ../ra/ra-spill-types.sml + in + functor gs_156 = RASpillTypes + end + local + open l13 + in + structure gs_157 = Word8Vector + end + local + signature INSTRUCTIONS = gs_15 + structure Word8Vector = gs_157 + ../emit/mc-emit.sig + in + signature gs_158 = MC_EMIT + end + local + signature CODE_STRING = gs_79 + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTION_EMITTER = gs_54 + structure Label = gs_27 + structure List = gs_9 + signature MC_EMIT = gs_158 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + signature SDI_JUMPS = gs_74 + structure Word8 = gs_16 + structure Word8Vector = gs_157 + ../backpatch/vlBackPatch.sml + in + functor gs_159 = BackPatch + end + local + open l9 + in + structure gs_160 = PriorityHeap + end + local + structure IntHashTable = gs_108 + structure Option = gs_148 + structure PriorityHeap = gs_160 + structure RACore = gs_125 + structure RAGraph = gs_110 + signature RA_SPILL_HEURISTICS = gs_116 + structure Real = gs_82 + ../ra/chow-hennessy-spillheur.sml + in + structure gs_161 = ChowHennessySpillHeur + end + local + open l9 + in + signature gs_162 = LINE_BREAK + structure gs_163 = LineBreak + end + local + open l9 + in + structure gs_164 = StringOutStream + end + local + open l5 + in + signature gs_165 = UPDATE_GRAPH_INFO + structure gs_166 = UpdateGraphInfo + end + local + open l13 + in + structure gs_167 = Bool + end + local + signature ASM_STREAM = gs_52 + structure Annotations = gs_1 + structure Array = gs_4 + structure AsmStream = gs_53 + structure Bool = gs_167 + signature CONTROL_FLOW_GRAPH = gs_34 + structure CellsBasis = gs_13 + structure Char = gs_68 + structure Format = gs_51 + signature GRAPH_IMPLEMENTATION = gs_37 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTIONS = gs_15 + signature INSTRUCTION_EMITTER = gs_54 + structure Int = gs_12 + structure IntHashTable = gs_108 + signature LINE_BREAK = gs_162 + structure Label = gs_27 + structure LineBreak = gs_163 + structure List = gs_9 + structure ListMergeSort = gs_65 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + structure Real = gs_82 + structure String = gs_7 + structure StringOutStream = gs_164 + structure TextIO = gs_2 + signature UPDATE_GRAPH_INFO = gs_165 + structure UpdateGraphInfo = gs_166 + ../flowgraph/cfg.sml + in + functor gs_168 = ControlFlowGraph + end + local + structure Annotations = gs_1 + signature CONSTANT = gs_25 + structure CellsBasis = gs_13 + structure Int32 = gs_17 + structure Label = gs_27 + signature MLTREE = gs_28 + signature MLTREE_EXTENSION = gs_22 + structure MLTreeBasis = gs_105 + structure MachineInt = gs_154 + signature REGION = gs_24 + ../mltree/mltree.sml + in + functor gs_169 = MLTreeF + end + local + open l13 + in + structure gs_170 = General + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + structure CellsBasis = gs_13 + structure General = gs_170 + structure Graph = gs_0 + structure Int = gs_12 + structure IntHashTable = gs_108 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscErrorMsg = gs_11 + ../ra/liveness.sml + in + signature gs_171 = LIVENESS + functor gs_172 = Liveness + end + local + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + ../instructions/rewrite.sig + in + signature gs_173 = REWRITE_INSTRUCTIONS + end + local + signature ARCH_SPILL_INSTR = gs_92 + structure Annotations = gs_1 + structure Array = gs_4 + signature CFG_OPTIMIZATION = gs_99 + signature CONTROL_FLOW_GRAPH = gs_34 + structure CellsBasis = gs_13 + functor ClusterRA = gs_131 + functor GetReg = gs_58 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTIONS = gs_15 + signature INSTRUCTION_EMITTER = gs_54 + structure List = gs_9 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + structure RAGraph = gs_110 + signature RA_SPILL = gs_111 + signature RA_SPILL_HEURISTICS = gs_116 + signature REWRITE_INSTRUCTIONS = gs_173 + functor RegisterAllocator = gs_126 + structure Word = gs_8 + ../ra/risc-ra.sml + in + functor gs_174 = RISC_RA + end + local + signature CFG_OPTIMIZATION = gs_99 + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + signature INSN_PROPERTIES = gs_73 + signature MLRISC_CONTROL = gs_63 + structure MLRiscControl = gs_64 + signature SDI_JUMPS = gs_74 + ../flowgraph/cfgCountCopies.sml + in + functor gs_175 = CFGCountCopies + end + local + signature ASSEMBLY_EMITTER = gs_35 + structure Annotations = gs_1 + signature CONTROL_FLOW_GRAPH = gs_34 + structure Graph = gs_0 + signature INSTRUCTION_EMITTER = gs_54 + structure List = gs_9 + structure PseudoOpsBasisTyp = gs_30 + ../emit/cfgEmit.sml + in + functor gs_176 = CFGEmit + end + local + structure Array = gs_4 + signature GETREG = gs_57 + ../ra/getreg2.sml + in + functor gs_177 = GetReg2 + end + local + signature CONTROL_FLOW_GRAPH = gs_34 + structure CellsBasis = gs_13 + signature INSTRUCTIONS = gs_15 + structure Int32 = gs_17 + ../omit-frameptr/omit-frame-pointer.sig + in + signature gs_178 = OMIT_FRAME_POINTER + end + local + signature MLRISC_CONTROL = gs_63 + structure MLRiscControl = gs_64 + signature RA = gs_121 + structure RACore = gs_125 + signature RA_FLOWGRAPH_PARTITIONER = gs_78 + ../ra/region-based-ra.sml + in + functor gs_179 = RegionBasedRA + end + local + signature MLRISC_REGION = gs_89 + structure String = gs_7 + ../aliasing/mlriscRegion.sml + in + structure gs_180 = MLRiscRegion + end + local + structure CellsBasis = gs_13 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTION_EMITTER = gs_54 + structure Int = gs_12 + structure IntHashTable = gs_108 + signature MLRISC_CONTROL = gs_63 + signature MLRISC_ERROR_MSG = gs_10 + structure MLRiscControl = gs_64 + structure MLRiscErrorMsg = gs_11 + structure RACore = gs_125 + functor RASpillTypes = gs_156 + signature RA_SPILL = gs_111 + structure Word = gs_8 + ../ra/ra-spill.sml + in + functor gs_181 = RASpill + end + in + signature ARCH_SPILL_INSTR = gs_92 + signature ASM_FORMAT_UTIL = gs_145 + signature ASM_STREAM = gs_52 + signature ASSEMBLY_EMITTER = gs_35 + signature AS_PSEUDO_OPS = gs_76 + structure AsmFlags = gs_117 + structure AsmFormatUtil = gs_146 + structure AsmStream = gs_53 + signature BBSCHED = gs_72 + functor BBSched2 = gs_130 + signature BLOCK_PLACEMENT = gs_107 + functor BackPatch = gs_159 + functor BlockPlacement = gs_136 + functor BuildFlowgraph = gs_114 + signature CELLS = gs_14 + signature CELLS_BASIS = gs_5 + functor CFGCountCopies = gs_175 + functor CFGEmit = gs_176 + functor CFGExpandCopies = gs_100 + signature CFG_OPTIMIZATION = gs_99 + signature CLIENT_PSEUDO_OPS = gs_32 + signature CODE_STRING = gs_79 + signature COMPUTE_EXECUTION_FREQUENCIES = gs_83 + signature CONSTANT = gs_25 + signature CONTROL_FLOWGRAPH_GEN = gs_115 + signature CONTROL_FLOW_GRAPH = gs_34 + structure CTypes = gs_60 + signature C_CALLS = gs_61 + functor Cells = gs_143 + structure CellsBasis = gs_13 + structure ChaitinSpillHeur = gs_132 + functor CheckPlacementFn = gs_142 + structure ChowHennessySpillHeur = gs_161 + functor ClusterRA = gs_131 + functor CompleteProbsFn = gs_86 + functor ComputeFreqsFn = gs_87 + functor ControlFlowGraph = gs_168 + signature DELAY_SLOT_PROPERTIES = gs_59 + signature DOMINATOR_TREE = gs_38 + functor DarwinPseudoOps = gs_77 + functor DefaultBlockPlacement = gs_135 + functor DominatorTree = gs_43 + functor EstimateLoopProbsFn = gs_152 + signature FREQUENCY_PROPERTIES = gs_112 + functor FreqProps = gs_113 + functor GCCells = gs_141 + signature GC_CELLS = gs_119 + signature GC_TYPE = gs_118 + signature GETREG = gs_57 + functor GasPseudoOps = gs_93 + functor GetReg = gs_58 + functor GetReg2 = gs_177 + signature INSN_PROPERTIES = gs_73 + signature INSTRUCTIONS = gs_15 + signature INSTRUCTION_EMITTER = gs_54 + signature INSTRUCTION_STREAM = gs_44 + functor InstructionStream = gs_45 + functor JumpChainElimFn = gs_98 + signature LABEL = gs_26 + signature LIVENESS = gs_171 + signature LOOP_STRUCTURE = gs_39 + structure Label = gs_27 + functor Liveness = gs_172 + functor LoopStructure = gs_129 + signature MACHINE_INT = gs_21 + signature MC_EMIT = gs_158 + signature MLRISC_ANNOTATIONS = gs_84 + signature MLRISC_OPTIMIZATION = gs_90 + signature MLRISC_REGION = gs_89 + structure MLRiscAnnotations = gs_85 + structure MLRiscRegion = gs_180 + signature MLTREE = gs_28 + signature MLTREECOMP = gs_49 + signature MLTREEGEN = gs_47 + signature MLTREE_BASIS = gs_23 + signature MLTREE_EVAL = gs_70 + signature MLTREE_EXTENSION = gs_22 + signature MLTREE_EXTENSION_COMP = gs_50 + signature MLTREE_HASH = gs_88 + signature MLTREE_MULT_DIV = gs_137 + signature MLTREE_SIZE = gs_46 + signature MLTREE_STREAM = gs_48 + structure MLTreeBasis = gs_105 + functor MLTreeCheckTy = gs_36 + functor MLTreeEval = gs_140 + functor MLTreeF = gs_169 + functor MLTreeGen = gs_104 + functor MLTreeHash = gs_139 + functor MLTreeMult = gs_138 + functor MLTreeSize = gs_103 + functor MLTreeStream = gs_101 + structure MachineInt = gs_154 + functor MemoryRA = gs_155 + functor NoDelaySlots = gs_144 + signature OMIT_FRAME_POINTER = gs_178 + signature POINTS_TO = gs_66 + signature PRINT_FLOWGRAPH = gs_55 + signature PSEUDO_OPS = gs_33 + signature PSEUDO_OPS_BASIS = gs_31 + signature PSEUDO_OPS_ENDIAN = gs_69 + structure PointsTo = gs_67 + functor PrintFlowgraph = gs_56 + functor PseudoOps = gs_106 + structure PseudoOpsBasisTyp = gs_30 + functor PseudoOpsBig = gs_71 + functor PseudoOpsLittle = gs_102 + signature RA = gs_121 + structure RACore = gs_125 + functor RADeadCodeElim = gs_127 + structure RAGraph = gs_110 + functor RASpill = gs_181 + functor RASpillTypes = gs_156 + signature RA_BITMATRIX = gs_94 + signature RA_CORE = gs_123 + signature RA_FLOWGRAPH = gs_120 + signature RA_FLOWGRAPH_PARTITIONER = gs_78 + signature RA_GRAPH = gs_109 + signature RA_PRIORITY_QUEUE = gs_95 + signature RA_SPILL = gs_111 + signature RA_SPILL_HEURISTICS = gs_116 + signature REGION = gs_24 + signature REWRITE_INSTRUCTIONS = gs_173 + functor RISC_RA = gs_174 + structure RaBitmatrix = gs_97 + functor RaPriQueue = gs_124 + functor RegionBasedRA = gs_179 + functor RegisterAllocator = gs_126 + signature SDI_JUMPS = gs_74 + signature SHUFFLE = gs_91 + functor Shuffle = gs_149 + functor SpanDependencyResolution = gs_75 + functor UnimplementedCCallsFn = gs_62 + functor WeightedBlockPlacementFn = gs_134 + end + end + + end diff -N -C 2 -r MLRISC/mlb/MLTREE.mlb MLRISC-mlton/mlb/MLTREE.mlb *** MLRISC/mlb/MLTREE.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/MLTREE.mlb 2010-04-02 16:08:59.000000000 -0400 *************** *** 0 **** --- 1,209 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l18 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l41 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l67 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = MLTREE + end + local + signature MLTREE = gs_0 + ../mltree/mltree-rewrite.sig + in + signature gs_1 = MLTREE_REWRITE + end + local + signature MLTREE = gs_0 + signature MLTREE_REWRITE = gs_1 + ../mltree/mltree-rewrite.sml + in + functor gs_2 = MLTreeRewrite + end + local + signature MLTREE = gs_0 + ../mltree/mltree-fold.sig + in + signature gs_3 = MLTREE_FOLD + end + local + open l18 + in + structure gs_4 = Word + end + local + open l4 + in + structure gs_5 = CellsBasis + end + local + open l18 + in + structure gs_6 = IntInf + end + local + open l4 + in + structure gs_7 = Label + end + local + open l18 + in + structure gs_8 = String + end + local + open l18 + in + structure gs_9 = List + end + local + open l18 + in + structure gs_10 = Char + end + local + open l41 + in + signature gs_11 = MLRISC_ERROR_MSG + structure gs_12 = MLRiscErrorMsg + end + local + open l18 + in + structure gs_13 = Int + end + local + signature MLTREE = gs_0 + ../mltree/mltree-utils.sig + in + signature gs_14 = MLTREE_UTILS + end + local + structure CellsBasis = gs_5 + structure Char = gs_10 + structure Int = gs_13 + structure IntInf = gs_6 + structure Label = gs_7 + structure List = gs_9 + signature MLRISC_ERROR_MSG = gs_11 + structure MLRiscErrorMsg = gs_12 + signature MLTREE = gs_0 + signature MLTREE_UTILS = gs_14 + structure String = gs_8 + structure Word = gs_4 + ../mltree/mltree-utils.sml + in + functor gs_15 = MLTreeUtils + end + local + open l4 + in + signature gs_16 = CONTROL_FLOW_GRAPH + end + local + open l4 + in + signature gs_17 = INSTRUCTION_STREAM + end + local + open l4 + in + signature gs_18 = INSTRUCTIONS + end + local + open l4 + in + signature gs_19 = CELLS + end + local + open l67 + in + structure gs_20 = Annotations + end + local + structure Annotations = gs_20 + signature CELLS = gs_19 + signature CONTROL_FLOW_GRAPH = gs_16 + signature INSTRUCTIONS = gs_18 + signature INSTRUCTION_STREAM = gs_17 + ../mltree/instr-gen.sig + in + signature gs_21 = INSTR_GEN + end + local + signature MLTREE = gs_0 + signature MLTREE_FOLD = gs_3 + ../mltree/mltree-fold.sml + in + functor gs_22 = MLTreeFold + end + local + signature CONTROL_FLOW_GRAPH = gs_16 + signature INSTRUCTIONS = gs_18 + signature INSTRUCTION_STREAM = gs_17 + signature INSTR_GEN = gs_21 + signature MLRISC_ERROR_MSG = gs_11 + structure MLRiscErrorMsg = gs_12 + ../mltree/instr-gen.sml + in + functor gs_23 = InstrGen + end + local + signature MLTREE = gs_0 + ../mltree/mltree-simplify.sig + in + signature gs_24 = MLTREE_SIMPLIFIER + end + local + open l4 + in + signature gs_25 = MLTREE_SIZE + end + local + structure IntInf = gs_6 + signature MLTREE = gs_0 + signature MLTREE_SIMPLIFIER = gs_24 + signature MLTREE_SIZE = gs_25 + functor MLTreeRewrite = gs_2 + ../mltree/mltree-simplify.sml + in + functor gs_26 = MLTreeSimplifier + end + in + signature INSTR_GEN = gs_21 + functor InstrGen = gs_23 + signature MLTREE_FOLD = gs_3 + signature MLTREE_REWRITE = gs_1 + signature MLTREE_SIMPLIFIER = gs_24 + signature MLTREE_UTILS = gs_14 + functor MLTreeFold = gs_22 + functor MLTreeRewrite = gs_2 + functor MLTreeSimplifier = gs_26 + functor MLTreeUtils = gs_15 + end + end + + end diff -N -C 2 -r MLRISC/mlb/PPC.mlb MLRISC-mlton/mlb/PPC.mlb *** MLRISC/mlb/PPC.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/PPC.mlb 2010-04-02 16:09:00.000000000 -0400 *************** *** 0 **** --- 1,573 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l42 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l116 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l50 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l9 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = FREQUENCY_PROPERTIES + end + local + open l9 + in + signature gs_1 = PROBABILITY + structure gs_2 = Probability + end + local + open l4 + in + structure gs_3 = MLRiscAnnotations + end + local + open l4 + in + signature gs_4 = REGION + end + local + open l4 + in + signature gs_5 = CONSTANT + end + local + open l4 + in + signature gs_6 = MLTREE + end + local + open l4 + in + signature gs_7 = CELLS_BASIS + end + local + open l4 + in + structure gs_8 = CellsBasis + end + local + open l4 + in + structure gs_9 = Label + end + local + open l9 + in + structure gs_10 = Annotations + end + local + open l4 + in + functor gs_11 = Cells + end + local + open l42 + in + structure gs_12 = Int + end + local + open l4 + in + signature gs_13 = CELLS + end + local + open l50 + in + signature gs_14 = MLRISC_ERROR_MSG + structure gs_15 = MLRiscErrorMsg + end + local + open l50 + in + signature gs_16 = MLRISC_CONTROL + structure gs_17 = MLRiscControl + end + local + signature MLRISC_CONTROL = gs_16 + structure MLRiscControl = gs_17 + ../ppc/emit/ppcAsmSyntax.sml + in + structure gs_18 = PPCAsmSyntax + end + local + signature CELLS = gs_13 + functor Cells = gs_11 + structure CellsBasis = gs_8 + structure Int = gs_12 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + structure PPCAsmSyntax = gs_18 + ../ppc/instructions/ppcCells.sml + in + signature gs_19 = PPCCELLS + structure gs_20 = PPCCells + end + local + structure Annotations = gs_10 + signature CELLS_BASIS = gs_7 + signature CONSTANT = gs_5 + structure CellsBasis = gs_8 + structure Label = gs_9 + signature MLTREE = gs_6 + signature PPCCELLS = gs_19 + structure PPCCells = gs_20 + signature REGION = gs_4 + ../ppc/instructions/ppcInstr.sml + in + signature gs_21 = PPCINSTR + functor gs_22 = PPCInstr + end + local + signature FREQUENCY_PROPERTIES = gs_0 + structure MLRiscAnnotations = gs_3 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + signature PROBABILITY = gs_1 + structure Probability = gs_2 + ../ppc/instructions/ppcFreqProps.sml + in + functor gs_23 = PPCFreqProps + end + local + open l4 + in + signature gs_24 = INSTRUCTION_EMITTER + end + local + open l4 + in + signature gs_25 = ASM_FORMAT_UTIL + structure gs_26 = AsmFormatUtil + end + local + open l4 + in + signature gs_27 = ASM_STREAM + structure gs_28 = AsmStream + end + local + open l42 + in + structure gs_29 = TextIO + end + local + open l42 + in + structure gs_30 = String + end + local + open l4 + in + structure gs_31 = AsmFlags + end + local + open l4 + in + signature gs_32 = MLTREE_EVAL + end + local + open l4 + in + signature gs_33 = INSTRUCTION_STREAM + end + local + structure CellsBasis = gs_8 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + ../ppc/instructions/ppcShuffle.sig + in + signature gs_34 = PPCSHUFFLE + end + local + signature ASM_FORMAT_UTIL = gs_25 + signature ASM_STREAM = gs_27 + structure Annotations = gs_10 + structure AsmFlags = gs_31 + structure AsmFormatUtil = gs_26 + structure AsmStream = gs_28 + structure CellsBasis = gs_8 + signature INSTRUCTION_EMITTER = gs_24 + signature INSTRUCTION_STREAM = gs_33 + structure Int = gs_12 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_EVAL = gs_32 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + signature PPCSHUFFLE = gs_34 + structure String = gs_30 + structure TextIO = gs_29 + ../ppc/emit/ppcAsm.sml + in + functor gs_35 = PPCAsmEmitter + end + local + structure CellsBasis = gs_8 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + ../ppc/mltree/ppcPseudoInstr.sig + in + signature gs_36 = PPC_PSEUDO_INSTR + end + local + open l4 + in + signature gs_37 = PSEUDO_OPS_BASIS + end + local + open l4 + in + functor gs_38 = PseudoOpsBig + end + local + open l116 + in + structure gs_39 = Format + end + local + open l4 + in + structure gs_40 = PseudoOpsBasisTyp + end + local + open l42 + in + structure gs_41 = IntInf + end + local + open l42 + in + structure gs_42 = Word32 + end + local + open l116 + in + structure gs_43 = Atom + end + local + structure Atom = gs_43 + structure Format = gs_39 + structure Int = gs_12 + structure IntInf = gs_41 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE = gs_6 + signature MLTREE_EVAL = gs_32 + signature PSEUDO_OPS_BASIS = gs_37 + structure PseudoOpsBasisTyp = gs_40 + functor PseudoOpsBig = gs_38 + structure String = gs_30 + structure Word32 = gs_42 + ../ppc/flowgraph/ppcDarwinPseudoOps.sml + in + functor gs_44 = PPCDarwinPseudoOps + end + local + open l4 + in + signature gs_45 = ARCH_SPILL_INSTR + end + local + structure CellsBasis = gs_8 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + ../ppc/ra/ppcRewrite.sml + in + functor gs_46 = PPCRewrite + end + local + signature ARCH_SPILL_INSTR = gs_45 + structure CellsBasis = gs_8 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + functor PPCRewrite = gs_46 + ../ppc/ra/ppcSpillInstr.sml + in + functor gs_47 = PPCSpillInstr + end + local + open l4 + in + functor gs_48 = GasPseudoOps + end + local + structure Format = gs_39 + functor GasPseudoOps = gs_48 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE = gs_6 + signature MLTREE_EVAL = gs_32 + signature PSEUDO_OPS_BASIS = gs_37 + structure PseudoOpsBasisTyp = gs_40 + functor PseudoOpsBig = gs_38 + structure Word32 = gs_42 + ../ppc/flowgraph/ppcGasPseudoOps.sml + in + functor gs_49 = PPCGasPseudoOps + end + local + open l4 + in + signature gs_50 = INSN_PROPERTIES + end + local + open l42 + in + structure gs_51 = Word + end + local + open l4 + in + signature gs_52 = MLTREE_HASH + end + local + structure CellsBasis = gs_8 + signature INSN_PROPERTIES = gs_50 + structure IntInf = gs_41 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_EVAL = gs_32 + signature MLTREE_HASH = gs_52 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + structure Word = gs_51 + ../ppc/instructions/ppcProps.sml + in + functor gs_53 = PPCProps + end + local + open l4 + in + signature gs_54 = SDI_JUMPS + end + local + structure CellsBasis = gs_8 + signature MLRISC_CONTROL = gs_16 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscControl = gs_17 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_EVAL = gs_32 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + signature PPCSHUFFLE = gs_34 + signature SDI_JUMPS = gs_54 + structure Word = gs_51 + ../ppc/backpatch/ppcJumps.sml + in + functor gs_55 = PPCJumps + end + local + ../ppc/instructions/ppcInstrExt.sml + in + structure gs_56 = PPCInstrExt + end + local + open l4 + in + signature gs_57 = CONTROL_FLOW_GRAPH + end + local + open l4 + in + signature gs_58 = MLTREE_STREAM + end + local + signature CONTROL_FLOW_GRAPH = gs_57 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_STREAM = gs_58 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + structure PPCInstrExt = gs_56 + ../ppc/instructions/ppcCompInstrExt.sml + in + signature gs_59 = PPCCOMP_INSTR_EXT + functor gs_60 = PPCCompInstrExt + end + local + open l4 + in + signature gs_61 = DELAY_SLOT_PROPERTIES + end + local + signature DELAY_SLOT_PROPERTIES = gs_61 + signature INSN_PROPERTIES = gs_50 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + ../ppc/backpatch/ppcDelaySlots.sml + in + functor gs_62 = PPCDelaySlots + end + local + open l4 + in + structure gs_63 = CTypes + end + local + open l42 + in + structure gs_64 = List + end + local + open l4 + in + signature gs_65 = C_CALLS + end + local + structure CTypes = gs_63 + signature C_CALLS = gs_65 + structure Int = gs_12 + structure IntInf = gs_41 + structure List = gs_64 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscAnnotations = gs_3 + structure MLRiscErrorMsg = gs_15 + signature MLTREE = gs_6 + signature PPCCELLS = gs_19 + structure PPCCells = gs_20 + structure String = gs_30 + structure Word = gs_51 + ../ppc/c-calls/ppc-macosx.sml + in + functor gs_66 = PPCMacOSX_CCalls + signature gs_67 = PPC_MACOSX_C_CALLS + end + local + open l4 + in + functor gs_68 = Shuffle + end + local + structure CellsBasis = gs_8 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + functor Shuffle = gs_68 + ../ppc/instructions/ppcShuffle.sml + in + functor gs_69 = PPCShuffle + end + local + open l42 + in + structure gs_70 = Word8 + end + local + open l4 + in + signature gs_71 = CODE_STRING + end + local + signature CODE_STRING = gs_71 + structure CellsBasis = gs_8 + signature INSTRUCTION_EMITTER = gs_24 + signature INSTRUCTION_STREAM = gs_33 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + signature MLTREE_EVAL = gs_32 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + structure Word32 = gs_42 + structure Word8 = gs_70 + ../ppc/emit/ppcMC.sml + in + functor gs_72 = PPCMCEmitter + end + local + open l4 + in + functor gs_73 = MLTreeMult + end + local + open l4 + in + functor gs_74 = MLTreeGen + end + local + open l4 + in + signature gs_75 = MLTREECOMP + signature gs_76 = MLTREE_EXTENSION_COMP + end + local + structure CellsBasis = gs_8 + structure Int = gs_12 + structure Label = gs_9 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscAnnotations = gs_3 + structure MLRiscErrorMsg = gs_15 + signature MLTREECOMP = gs_75 + signature MLTREE_EXTENSION_COMP = gs_76 + functor MLTreeGen = gs_74 + functor MLTreeMult = gs_73 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + signature PPC_PSEUDO_INSTR = gs_36 + structure Word32 = gs_42 + ../ppc/mltree/ppc.sml + in + functor gs_77 = PPC + end + in + functor PPC = gs_77 + functor PPCAsmEmitter = gs_35 + structure PPCAsmSyntax = gs_18 + signature PPCCELLS = gs_19 + signature PPCCOMP_INSTR_EXT = gs_59 + structure PPCCells = gs_20 + functor PPCCompInstrExt = gs_60 + functor PPCDarwinPseudoOps = gs_44 + functor PPCDelaySlots = gs_62 + functor PPCFreqProps = gs_23 + functor PPCGasPseudoOps = gs_49 + signature PPCINSTR = gs_21 + functor PPCInstr = gs_22 + structure PPCInstrExt = gs_56 + functor PPCJumps = gs_55 + functor PPCMCEmitter = gs_72 + functor PPCMacOSX_CCalls = gs_66 + functor PPCProps = gs_53 + functor PPCRewrite = gs_46 + signature PPCSHUFFLE = gs_34 + functor PPCShuffle = gs_69 + functor PPCSpillInstr = gs_47 + signature PPC_PSEUDO_INSTR = gs_36 + end + end + + end diff -N -C 2 -r MLRISC/mlb/Peephole.mlb MLRISC-mlton/mlb/Peephole.mlb *** MLRISC/mlb/Peephole.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/Peephole.mlb 2010-04-02 16:09:00.000000000 -0400 *************** *** 0 **** --- 1,61 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l14 = + bas + (* $Graphs.cm(=(proxyLib.cm):.)/Graphs.cm =??=> *) Graphs.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = INSTRUCTIONS + end + local + signature INSTRUCTIONS = gs_0 + ../instructions/peephole.sig + in + signature gs_1 = PEEPHOLE + end + local + open l4 + in + signature gs_2 = CFG_OPTIMIZATION + end + local + open l14 + in + structure gs_3 = Graph + end + local + open l4 + in + signature gs_4 = CONTROL_FLOW_GRAPH + end + local + signature CFG_OPTIMIZATION = gs_2 + signature CONTROL_FLOW_GRAPH = gs_4 + structure Graph = gs_3 + signature PEEPHOLE = gs_1 + ../flowgraph/cfgPeephole.sml + in + functor gs_5 = CFGPeephole + end + in + functor CFGPeephole = gs_5 + signature PEEPHOLE = gs_1 + end + end + + end diff -N -C 2 -r MLRISC/mlb/RA.mlb MLRISC-mlton/mlb/RA.mlb *** MLRISC/mlb/RA.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/RA.mlb 2010-04-02 16:09:00.000000000 -0400 *************** *** 0 **** --- 1,152 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l11 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l22 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l53 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l29 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = RA_SPILL_HEURISTICS + end + local + open l4 + in + structure gs_1 = RACore + end + local + open l11 + in + structure gs_2 = Real + end + local + open l4 + in + structure gs_3 = RAGraph + end + local + structure RACore = gs_1 + structure RAGraph = gs_3 + signature RA_SPILL_HEURISTICS = gs_0 + structure Real = gs_2 + ../ra/chaitin-spillheur2.sml + in + functor gs_4 = ImprovedChaitinSpillHeur + end + local + open l22 + in + structure gs_5 = IntHashTable + end + local + open l11 + in + structure gs_6 = Option + end + local + open l29 + in + structure gs_7 = PriorityHeap + end + local + structure IntHashTable = gs_5 + structure Option = gs_6 + structure PriorityHeap = gs_7 + structure RACore = gs_1 + structure RAGraph = gs_3 + signature RA_SPILL_HEURISTICS = gs_0 + structure Real = gs_2 + ../ra/chow-hennessy-spillheur2.sml + in + functor gs_8 = ImprovedChowHennessySpillHeur + end + local + open l4 + in + signature gs_9 = RA_SPILL + end + local + open l11 + in + structure gs_10 = Int + end + local + open l4 + in + functor gs_11 = RASpillTypes + end + local + open l4 + in + structure gs_12 = CellsBasis + end + local + open l11 + in + structure gs_13 = Word + end + local + open l53 + in + signature gs_14 = MLRISC_ERROR_MSG + structure gs_15 = MLRiscErrorMsg + end + local + open l4 + in + signature gs_16 = INSTRUCTION_EMITTER + end + local + open l4 + in + signature gs_17 = INSN_PROPERTIES + end + local + structure CellsBasis = gs_12 + signature INSN_PROPERTIES = gs_17 + signature INSTRUCTION_EMITTER = gs_16 + structure Int = gs_10 + structure IntHashTable = gs_5 + signature MLRISC_ERROR_MSG = gs_14 + structure MLRiscErrorMsg = gs_15 + structure RACore = gs_1 + functor RASpillTypes = gs_11 + signature RA_SPILL = gs_9 + structure Word = gs_13 + ../ra/ra-spill-with-renaming.sml + in + functor gs_18 = RASpillWithRenaming + end + in + functor ImprovedChaitinSpillHeur = gs_4 + functor ImprovedChowHennessySpillHeur = gs_8 + functor RASpillWithRenaming = gs_18 + end + end + + end diff -N -C 2 -r MLRISC/mlb/SPARC.mlb MLRISC-mlton/mlb/SPARC.mlb *** MLRISC/mlb/SPARC.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/SPARC.mlb 2010-04-02 16:09:01.000000000 -0400 *************** *** 0 **** --- 1,538 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l38 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l136 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l4 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + basis l46 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l30 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + signature gs_0 = CONTROL_FLOW_GRAPH + end + local + open l4 + in + signature gs_1 = MLTREE_STREAM + end + local + open l4 + in + signature gs_2 = MLTREE + end + local + open l4 + in + signature gs_3 = REGION + end + local + open l4 + in + signature gs_4 = CONSTANT + end + local + open l4 + in + signature gs_5 = CELLS_BASIS + end + local + open l4 + in + structure gs_6 = CellsBasis + end + local + open l4 + in + structure gs_7 = Label + end + local + open l30 + in + structure gs_8 = Annotations + end + local + open l4 + in + functor gs_9 = Cells + end + local + open l38 + in + structure gs_10 = Int + end + local + open l4 + in + signature gs_11 = CELLS + end + local + open l46 + in + signature gs_12 = MLRISC_ERROR_MSG + structure gs_13 = MLRiscErrorMsg + end + local + signature CELLS = gs_11 + functor Cells = gs_9 + structure CellsBasis = gs_6 + structure Int = gs_10 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + ../sparc/instructions/sparcCells.sml + in + signature gs_14 = SPARCCELLS + structure gs_15 = SparcCells + end + local + structure Annotations = gs_8 + signature CELLS_BASIS = gs_5 + signature CONSTANT = gs_4 + structure CellsBasis = gs_6 + structure Label = gs_7 + signature MLTREE = gs_2 + signature REGION = gs_3 + signature SPARCCELLS = gs_14 + structure SparcCells = gs_15 + ../sparc/instructions/sparcInstr.sml + in + signature gs_16 = SPARCINSTR + functor gs_17 = SparcInstr + end + local + ../sparc/instructions/sparcinstr-ext.sml + in + structure gs_18 = SparcInstrExt + end + local + signature CONTROL_FLOW_GRAPH = gs_0 + signature MLTREE = gs_2 + signature MLTREE_STREAM = gs_1 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + structure SparcInstrExt = gs_18 + ../sparc/instructions/sparccomp-instr-ext.sml + in + signature gs_19 = SPARCCOMP_INSTR_EXT + functor gs_20 = SparcCompInstrExt + end + local + open l4 + in + signature gs_21 = INSTRUCTION_EMITTER + end + local + open l38 + in + structure gs_22 = Word8 + end + local + open l38 + in + structure gs_23 = Word32 + end + local + open l4 + in + signature gs_24 = CODE_STRING + end + local + open l4 + in + signature gs_25 = INSTRUCTION_STREAM + end + local + open l4 + in + signature gs_26 = MLTREE_EVAL + end + local + signature CODE_STRING = gs_24 + structure CellsBasis = gs_6 + signature INSTRUCTION_EMITTER = gs_21 + signature INSTRUCTION_STREAM = gs_25 + structure Label = gs_7 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_EVAL = gs_26 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + structure Word32 = gs_23 + structure Word8 = gs_22 + ../sparc/emit/sparcMC.sml + in + functor gs_27 = SparcMCEmitter + end + local + open l4 + in + functor gs_28 = Shuffle + end + local + open l38 + in + structure gs_29 = Option + end + local + structure CellsBasis = gs_6 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + ../sparc/instructions/sparcShuffle.sig + in + signature gs_30 = SPARCSHUFFLE + end + local + structure CellsBasis = gs_6 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + structure Option = gs_29 + signature SPARCINSTR = gs_16 + signature SPARCSHUFFLE = gs_30 + functor Shuffle = gs_28 + functor SparcInstr = gs_17 + structure Word32 = gs_23 + ../sparc/instructions/sparcShuffle.sml + in + functor gs_31 = SparcShuffle + end + local + open l4 + in + signature gs_32 = DELAY_SLOT_PROPERTIES + end + local + open l4 + in + signature gs_33 = INSN_PROPERTIES + end + local + structure CellsBasis = gs_6 + signature DELAY_SLOT_PROPERTIES = gs_32 + signature INSN_PROPERTIES = gs_33 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + structure Option = gs_29 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + ../sparc/backpatch/sparcDelaySlotProps.sml + in + functor gs_34 = SparcDelaySlots + end + local + open l4 + in + signature gs_35 = FREQUENCY_PROPERTIES + end + local + open l30 + in + signature gs_36 = PROBABILITY + structure gs_37 = Probability + end + local + open l4 + in + structure gs_38 = MLRiscAnnotations + end + local + signature FREQUENCY_PROPERTIES = gs_35 + structure MLRiscAnnotations = gs_38 + signature PROBABILITY = gs_36 + structure Probability = gs_37 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + ../sparc/instructions/sparcFreqProps.sml + in + functor gs_39 = SparcFreqProps + end + local + open l4 + in + signature gs_40 = PSEUDO_OPS_BASIS + end + local + open l4 + in + functor gs_41 = GasPseudoOps + end + local + open l4 + in + functor gs_42 = PseudoOpsBig + end + local + open l136 + in + structure gs_43 = Format + end + local + open l4 + in + structure gs_44 = PseudoOpsBasisTyp + end + local + structure Format = gs_43 + functor GasPseudoOps = gs_41 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE = gs_2 + signature MLTREE_EVAL = gs_26 + signature PSEUDO_OPS_BASIS = gs_40 + structure PseudoOpsBasisTyp = gs_44 + functor PseudoOpsBig = gs_42 + structure Word32 = gs_23 + ../sparc/flowgraph/sparcGasPseudoOps.sml + in + functor gs_45 = SparcGasPseudoOps + end + local + open l4 + in + functor gs_46 = MLTreeMult + end + local + open l4 + in + functor gs_47 = MLTreeGen + end + local + open l4 + in + signature gs_48 = MLTREECOMP + signature gs_49 = MLTREE_EXTENSION_COMP + end + local + structure CellsBasis = gs_6 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + ../sparc/mltree/sparcPseudoInstr.sig + in + signature gs_50 = SPARC_PSEUDO_INSTR + end + local + structure CellsBasis = gs_6 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscAnnotations = gs_38 + structure MLRiscErrorMsg = gs_13 + signature MLTREECOMP = gs_48 + signature MLTREE_EXTENSION_COMP = gs_49 + functor MLTreeGen = gs_47 + functor MLTreeMult = gs_46 + signature SPARCINSTR = gs_16 + signature SPARC_PSEUDO_INSTR = gs_50 + functor SparcInstr = gs_17 + structure Word32 = gs_23 + ../sparc/mltree/sparc.sml + in + functor gs_51 = Sparc + end + local + open l38 + in + structure gs_52 = IntInf + end + local + open l38 + in + structure gs_53 = Word + end + local + open l4 + in + signature gs_54 = MLTREE_HASH + end + local + structure CellsBasis = gs_6 + signature INSN_PROPERTIES = gs_33 + structure IntInf = gs_52 + structure Label = gs_7 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_EVAL = gs_26 + signature MLTREE_HASH = gs_54 + structure Option = gs_29 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + structure Word = gs_53 + ../sparc/instructions/sparcProps.sml + in + functor gs_55 = SparcProps + end + local + open l4 + in + signature gs_56 = SDI_JUMPS + end + local + structure CellsBasis = gs_6 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_EVAL = gs_26 + signature SDI_JUMPS = gs_56 + signature SPARCINSTR = gs_16 + signature SPARCSHUFFLE = gs_30 + functor SparcInstr = gs_17 + structure Word32 = gs_23 + ../sparc/backpatch/sparcJumps.sml + in + functor gs_57 = SparcJumps + end + local + open l4 + in + signature gs_58 = C_CALLS + end + local + open l4 + in + structure gs_59 = CTypes + end + local + open l38 + in + structure gs_60 = String + end + local + open l38 + in + structure gs_61 = List + end + local + structure CTypes = gs_59 + signature C_CALLS = gs_58 + structure Int = gs_10 + structure List = gs_61 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscAnnotations = gs_38 + structure MLRiscErrorMsg = gs_13 + signature MLTREE = gs_2 + signature SPARCCELLS = gs_14 + structure SparcCells = gs_15 + structure SparcInstrExt = gs_18 + structure String = gs_60 + ../sparc/c-calls/sparc-c-calls.sml + in + functor gs_62 = Sparc_CCalls + end + local + open l4 + in + signature gs_63 = ASM_FORMAT_UTIL + structure gs_64 = AsmFormatUtil + end + local + open l4 + in + signature gs_65 = ASM_STREAM + structure gs_66 = AsmStream + end + local + open l38 + in + structure gs_67 = TextIO + end + local + open l4 + in + structure gs_68 = AsmFlags + end + local + signature ASM_FORMAT_UTIL = gs_63 + signature ASM_STREAM = gs_65 + structure Annotations = gs_8 + structure AsmFlags = gs_68 + structure AsmFormatUtil = gs_64 + structure AsmStream = gs_66 + structure CellsBasis = gs_6 + signature INSTRUCTION_EMITTER = gs_21 + signature INSTRUCTION_STREAM = gs_25 + structure Int = gs_10 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature MLTREE_EVAL = gs_26 + signature SPARCINSTR = gs_16 + signature SPARCSHUFFLE = gs_30 + functor SparcInstr = gs_17 + structure String = gs_60 + structure TextIO = gs_67 + structure Word32 = gs_23 + ../sparc/emit/sparcAsm.sml + in + functor gs_69 = SparcAsmEmitter + end + local + structure CellsBasis = gs_6 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + ../sparc/ra/sparcRewrite.sml + in + functor gs_70 = SparcRewrite + end + local + open l4 + in + signature gs_71 = ARCH_SPILL_INSTR + end + local + signature ARCH_SPILL_INSTR = gs_71 + structure CellsBasis = gs_6 + signature MLRISC_ERROR_MSG = gs_12 + structure MLRiscErrorMsg = gs_13 + signature SPARCINSTR = gs_16 + functor SparcInstr = gs_17 + functor SparcRewrite = gs_70 + ../sparc/ra/sparcSpillInstr.sml + in + functor gs_72 = SparcSpillInstr + end + in + signature SPARCCELLS = gs_14 + signature SPARCCOMP_INSTR_EXT = gs_19 + signature SPARCINSTR = gs_16 + signature SPARCSHUFFLE = gs_30 + signature SPARC_PSEUDO_INSTR = gs_50 + functor Sparc = gs_51 + functor SparcAsmEmitter = gs_69 + structure SparcCells = gs_15 + functor SparcCompInstrExt = gs_20 + functor SparcDelaySlots = gs_34 + functor SparcFreqProps = gs_39 + functor SparcGasPseudoOps = gs_45 + functor SparcInstr = gs_17 + structure SparcInstrExt = gs_18 + functor SparcJumps = gs_57 + functor SparcMCEmitter = gs_27 + functor SparcProps = gs_55 + functor SparcRewrite = gs_70 + functor SparcShuffle = gs_31 + functor SparcSpillInstr = gs_72 + functor Sparc_CCalls = gs_62 + end + end + + end diff -N -C 2 -r MLRISC/mlb/StagedAlloc.mlb MLRISC-mlton/mlb/StagedAlloc.mlb *** MLRISC/mlb/StagedAlloc.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/StagedAlloc.mlb 2010-04-02 16:09:01.000000000 -0400 *************** *** 0 **** --- 1,91 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l11 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l28 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + ../staged-alloc/conventions/c-loc-kind.sml + in + structure gs_0 = CLocKind + end + local + ../staged-alloc/allocator/staged-allocation-sig.sml + in + signature gs_1 = STAGED_ALLOCATION + end + local + open l11 + in + structure gs_2 = List + end + local + open l11 + in + structure gs_3 = Int + end + local + structure CLocKind = gs_0 + structure Int = gs_3 + structure List = gs_2 + signature STAGED_ALLOCATION = gs_1 + ../staged-alloc/conventions/sparc-c-fn.sml + in + functor gs_4 = SparcCConventionFn + end + local + structure CLocKind = gs_0 + structure Int = gs_3 + structure List = gs_2 + signature STAGED_ALLOCATION = gs_1 + ../staged-alloc/conventions/x86-c-fn.sml + in + functor gs_5 = X86CConventionFn + end + local + structure CLocKind = gs_0 + structure Int = gs_3 + structure List = gs_2 + signature STAGED_ALLOCATION = gs_1 + ../staged-alloc/conventions/x86-64-c-fn.sml + in + functor gs_6 = X86_64CConventionFn + end + local + open l28 + in + structure gs_7 = IntBinaryMap + end + local + structure Int = gs_3 + structure IntBinaryMap = gs_7 + structure List = gs_2 + signature STAGED_ALLOCATION = gs_1 + ../staged-alloc/allocator/staged-allocation-fn.sml + in + functor gs_8 = StagedAllocationFn + end + in + structure CLocKind = gs_0 + signature STAGED_ALLOCATION = gs_1 + functor SparcCConventionFn = gs_4 + functor StagedAllocationFn = gs_8 + functor X86CConventionFn = gs_5 + functor X86_64CConventionFn = gs_6 + end + end + + end diff -N -C 2 -r MLRISC/mlb/Visual.mlb MLRISC-mlton/mlb/Visual.mlb *** MLRISC/mlb/Visual.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlb/Visual.mlb 2010-04-02 16:09:01.000000000 -0400 *************** *** 0 **** --- 1,252 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l23 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l5 = + bas + (* $Control.cm(=(proxyLib.cm):.)/Control.cm =??=> *) Control.mlb + end + basis l19 = + bas + (* $Lib.cm(=(proxyLib.cm):.)/Lib.cm =??=> *) Lib.mlb + end + basis l12 = + bas + (* $Graphs.cm(=(proxyLib.cm):.)/Graphs.cm =??=> *) Graphs.mlb + end + basis l66 = + bas + (* $MLRISC.cm(=(proxyLib.cm):.)/MLRISC.cm =??=> *) MLRISC.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l5 + in + signature gs_0 = MLRISC_CONTROL + structure gs_1 = MLRiscControl + end + local + open l12 + in + signature gs_2 = ISOMORPHIC_GRAPH_VIEW + structure gs_3 = IsomorphicGraphView + end + local + open l12 + in + structure gs_4 = Graph + end + local + open l19 + in + structure gs_5 = Annotations + end + local + open l23 + in + structure gs_6 = Int + end + local + structure Annotations = gs_5 + structure Graph = gs_4 + signature ISOMORPHIC_GRAPH_VIEW = gs_2 + structure Int = gs_6 + structure IsomorphicGraphView = gs_3 + ../visualization/graphLayout.sml + in + structure gs_7 = GraphLayout + end + local + structure GraphLayout = gs_7 + ../visualization/graphDisplay.sig + in + signature gs_8 = GRAPH_DISPLAY + end + local + open l23 + in + structure gs_9 = String + end + local + open l23 + in + structure gs_10 = List + end + local + signature GRAPH_DISPLAY = gs_8 + structure Graph = gs_4 + structure GraphLayout = gs_7 + structure Int = gs_6 + structure List = gs_10 + structure String = gs_9 + ../visualization/daVinci.sml + in + structure gs_11 = daVinci + end + local + signature GRAPH_DISPLAY = gs_8 + structure Graph = gs_4 + structure GraphLayout = gs_7 + structure Int = gs_6 + structure String = gs_9 + ../visualization/vcg.sml + in + structure gs_12 = VCG + end + local + signature GRAPH_DISPLAY = gs_8 + structure Graph = gs_4 + structure GraphLayout = gs_7 + structure Int = gs_6 + structure String = gs_9 + ../visualization/dot.sml + in + structure gs_13 = Dot + end + local + structure Dot = gs_13 + signature GRAPH_DISPLAY = gs_8 + signature MLRISC_CONTROL = gs_0 + structure MLRiscControl = gs_1 + structure VCG = gs_12 + structure daVinci = gs_11 + ../visualization/allDisplays.sml + in + structure gs_14 = AllDisplays + end + local + open l23 + in + structure gs_15 = TextIO + end + local + open l23 + in + structure gs_16 = OS + end + local + structure GraphLayout = gs_7 + ../visualization/graphViewer.sig + in + signature gs_17 = GRAPH_VIEWER + end + local + signature GRAPH_DISPLAY = gs_8 + signature GRAPH_VIEWER = gs_17 + structure Graph = gs_4 + structure GraphLayout = gs_7 + structure Int = gs_6 + signature MLRISC_CONTROL = gs_0 + structure MLRiscControl = gs_1 + structure OS = gs_16 + structure TextIO = gs_15 + ../visualization/graphViewer.sml + in + functor gs_18 = GraphViewer + end + local + open l66 + in + structure gs_19 = Label + end + local + open l23 + in + structure gs_20 = Array + end + local + open l23 + in + structure gs_21 = Real + end + local + open l23 + in + structure gs_22 = Math + end + local + open l66 + in + signature gs_23 = INSTRUCTION_EMITTER + end + local + open l66 + in + signature gs_24 = CONTROL_FLOW_GRAPH + end + local + open l19 + in + structure gs_25 = StringOutStream + end + local + open l66 + in + signature gs_26 = ASM_STREAM + structure gs_27 = AsmStream + end + local + open l66 + in + signature gs_28 = INSTRUCTIONS + end + local + signature ASM_STREAM = gs_26 + structure Annotations = gs_5 + structure AsmStream = gs_27 + signature INSTRUCTIONS = gs_28 + signature INSTRUCTION_EMITTER = gs_23 + structure String = gs_9 + structure StringOutStream = gs_25 + ../visualization/mlrisc-format-insn.sml + in + signature gs_29 = FORMAT_INSTRUCTION + functor gs_30 = FormatInstruction + end + local + structure Annotations = gs_5 + structure Array = gs_20 + signature CONTROL_FLOW_GRAPH = gs_24 + signature FORMAT_INSTRUCTION = gs_29 + functor FormatInstruction = gs_30 + signature GRAPH_VIEWER = gs_17 + structure Graph = gs_4 + structure GraphLayout = gs_7 + signature INSTRUCTION_EMITTER = gs_23 + structure Int = gs_6 + structure Label = gs_19 + structure List = gs_10 + signature MLRISC_CONTROL = gs_0 + structure MLRiscControl = gs_1 + structure Math = gs_22 + structure Real = gs_21 + structure String = gs_9 + ../visualization/cfgViewer.sml + in + functor gs_31 = CFGViewer + end + in + structure AllDisplays = gs_14 + functor CFGViewer = gs_31 + structure Dot = gs_13 + functor FormatInstruction = gs_30 + signature GRAPH_DISPLAY = gs_8 + signature GRAPH_VIEWER = gs_17 + structure GraphLayout = gs_7 + functor GraphViewer = gs_18 + structure VCG = gs_12 + structure daVinci = gs_11 + end + end + + end diff -N -C 2 -r MLRISC/mlrisc-lib.mlb MLRISC-mlton/mlrisc-lib.mlb *** MLRISC/mlrisc-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- MLRISC-mlton/mlrisc-lib.mlb 2010-04-02 16:09:01.000000000 -0400 *************** *** 0 **** --- 1,24 ---- + (* DO NOT USE. Only suitable for type-checking purposes. *) + local + mlb/ALPHA.mlb + mlb/AMD64.mlb + mlb/AMD64-Peephole.mlb + mlb/CCall.mlb + mlb/CCall-sparc.mlb + mlb/CCall-x86-64.mlb + mlb/CCall-x86.mlb + mlb/Control.mlb + mlb/Graphs.mlb + mlb/HPPA.mlb + mlb/IA32.mlb + mlb/IA32-Peephole.mlb + mlb/Lib.mlb + mlb/MLRISC.mlb + mlb/MLTREE.mlb + mlb/Peephole.mlb + mlb/PPC.mlb + mlb/RA.mlb + mlb/SPARC.mlb + mlb/StagedAlloc.mlb + mlb/Visual.mlb + in end diff -N -C 2 -r MLRISC/mltree/instr-gen.sig MLRISC-mlton/mltree/instr-gen.sig *** MLRISC/mltree/instr-gen.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/instr-gen.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 9,14 **** structure CFG : CONTROL_FLOW_GRAPH ! sharing I.C = C ! sharing CFG.P = S.P (* --- 9,35 ---- structure CFG : CONTROL_FLOW_GRAPH ! (* sharing I.C = C *) ! (* sharing CFG.P = S.P *) ! where type P.Client.pseudo_op = S.P.Client.pseudo_op ! and type P.T.Basis.cond = S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = S.P.T.Basis.ext ! and type P.T.Basis.fcond = S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = S.P.T.I.div_rounding_mode ! and type P.T.Region.region = S.P.T.Region.region ! and type P.T.ccexp = S.P.T.ccexp ! and type P.T.fexp = S.P.T.fexp ! (* and type P.T.labexp = S.P.T.labexp *) ! and type P.T.mlrisc = S.P.T.mlrisc ! and type P.T.oper = S.P.T.oper ! and type P.T.rep = S.P.T.rep ! and type P.T.rexp = S.P.T.rexp ! and type P.T.stm = S.P.T.stm (* diff -N -C 2 -r MLRISC/mltree/instr-gen.sml MLRISC-mlton/mltree/instr-gen.sml *** MLRISC/mltree/instr-gen.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/instr-gen.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 5,11 **** (structure I : INSTRUCTIONS structure Stream : INSTRUCTION_STREAM ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = Stream.P ) : INSTR_GEN = struct --- 5,35 ---- (structure I : INSTRUCTIONS structure Stream : INSTRUCTION_STREAM ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and P = Stream.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = Stream.P.Client.pseudo_op ! and type P.T.Basis.cond = Stream.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = Stream.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = Stream.P.T.Basis.ext ! and type P.T.Basis.fcond = Stream.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = Stream.P.T.Basis.rounding_mode ! and type P.T.Constant.const = Stream.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) Stream.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) Stream.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) Stream.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) Stream.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = Stream.P.T.I.div_rounding_mode ! and type P.T.Region.region = Stream.P.T.Region.region ! and type P.T.ccexp = Stream.P.T.ccexp ! and type P.T.fexp = Stream.P.T.fexp ! (* and type P.T.labexp = Stream.P.T.labexp *) ! and type P.T.mlrisc = Stream.P.T.mlrisc ! and type P.T.oper = Stream.P.T.oper ! and type P.T.rep = Stream.P.T.rep ! and type P.T.rexp = Stream.P.T.rexp ! and type P.T.stm = Stream.P.T.stm ) : INSTR_GEN = struct diff -N -C 2 -r MLRISC/mltree/mltree-check-ty.sml MLRISC-mlton/mltree/mltree-check-ty.sml *** MLRISC/mltree/mltree-check-ty.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree-check-ty.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 102,106 **** and checkCCexpB cce = (case cce of T.NOT cce => checkCCexpB cce ! | ( T.AND (cce1, cce2) | T.OR (cce1, cce2) | T.XOR (cce1, cce2) | T.EQV (cce1, cce2) ) => checkCCexpB cce1 andalso checkCCexpB cce2 | T.CMP (ty, _, e1, e2) => ty = checkRexp e1 andalso ty = checkRexp e2 --- 102,112 ---- and checkCCexpB cce = (case cce of T.NOT cce => checkCCexpB cce ! | ( T.AND (cce1, cce2) ) => ! checkCCexpB cce1 andalso checkCCexpB cce2 ! | ( T.OR (cce1, cce2) ) => ! checkCCexpB cce1 andalso checkCCexpB cce2 ! | ( T.XOR (cce1, cce2) ) => ! checkCCexpB cce1 andalso checkCCexpB cce2 ! | ( T.EQV (cce1, cce2) ) => checkCCexpB cce1 andalso checkCCexpB cce2 | T.CMP (ty, _, e1, e2) => ty = checkRexp e1 andalso ty = checkRexp e2 diff -N -C 2 -r MLRISC/mltree/mltree-gen.sig MLRISC-mlton/mltree/mltree-gen.sig *** MLRISC/mltree/mltree-gen.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree-gen.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 10,15 **** structure T : MLTREE ! structure Size : MLTREE_SIZE ! where T = T val condOf : T.ccexp -> T.Basis.cond --- 10,34 ---- structure T : MLTREE ! structure Size : MLTREE_SIZE (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm val condOf : T.ccexp -> T.Basis.cond diff -N -C 2 -r MLRISC/mltree/mltree-mult.sig MLRISC-mlton/mltree/mltree-mult.sig *** MLRISC/mltree/mltree-mult.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree-mult.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 9,13 **** structure T : MLTREE structure C : CELLS ! structure I : INSTRUCTIONS where C=C exception TooComplex --- 9,13 ---- structure T : MLTREE structure C : CELLS ! structure I : INSTRUCTIONS (* where C = C *) exception TooComplex diff -N -C 2 -r MLRISC/mltree/mltree-mult.sml MLRISC-mlton/mltree/mltree-mult.sml *** MLRISC/mltree/mltree-mult.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree-mult.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 9,13 **** structure T : MLTREE ! structure CB : CELLS_BASIS = CellsBasis val intTy : int (* width of integer type *) --- 9,22 ---- structure T : MLTREE ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo val intTy : int (* width of integer type *) *************** *** 21,26 **** val srli : argi -> I.instruction list val srai : argi -> I.instruction list ! ) ! (val trapping : bool (* trap on overflow? *) val multCost : int ref (* cost of multiplication *) --- 30,35 ---- val srli : argi -> I.instruction list val srai : argi -> I.instruction list ! ! val trapping : bool (* trap on overflow? *) val multCost : int ref (* cost of multiplication *) *************** *** 38,43 **** val sh2addv : (arg -> I.instruction list) option (* a*4 + b *) val sh3addv : (arg -> I.instruction list) option (* a*8 + b *) ! ) ! (val signed : bool (* signed? *) ) : MLTREE_MULT_DIV = struct --- 47,52 ---- val sh2addv : (arg -> I.instruction list) option (* a*4 + b *) val sh3addv : (arg -> I.instruction list) option (* a*8 + b *) ! ! val signed : bool (* signed? *) ) : MLTREE_MULT_DIV = struct diff -N -C 2 -r MLRISC/mltree/mltree-simplify.in MLRISC-mlton/mltree/mltree-simplify.in *** MLRISC/mltree/mltree-simplify.in 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree-simplify.in 2009-10-02 09:51:26.000000000 -0400 *************** *** 15,20 **** functor MLTreeSimplifier (structure T : MLTREE ! structure Size : MLTREE_SIZE ! where T = T (* Extension *) val sext : T.rewriter -> T.sext -> T.sext --- 15,39 ---- functor MLTreeSimplifier (structure T : MLTREE ! structure Size : MLTREE_SIZE (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm (* Extension *) val sext : T.rewriter -> T.sext -> T.sext diff -N -C 2 -r MLRISC/mltree/mltree-simplify.sml MLRISC-mlton/mltree/mltree-simplify.sml *** MLRISC/mltree/mltree-simplify.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree-simplify.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 10,14 **** (*#line 17.4 "mltree-simplify.in"*) ! structure Size : MLTREE_SIZE where T=T (*#line 20.4 "mltree-simplify.in"*) --- 10,34 ---- (*#line 17.4 "mltree-simplify.in"*) ! structure Size : MLTREE_SIZE (* where T=T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm (*#line 20.4 "mltree-simplify.in"*) diff -N -C 2 -r MLRISC/mltree/mltree-utils.sml MLRISC-mlton/mltree/mltree-utils.sml *** MLRISC/mltree/mltree-utils.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree-utils.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 519,525 **** and oper(T.OPER{name,...}) = name ! and parenRexp ! (e as (T.REG _ | T.LI _ | T.$ _ | T.ARG _)) = ! rexp e | parenRexp e = "("^rexp e^")" --- 519,526 ---- and oper(T.OPER{name,...}) = name ! and parenRexp (e as T.REG _) = rexp e ! | parenRexp (e as T.LI _) = rexp e ! | parenRexp (e as T.$ _) = rexp e ! | parenRexp (e as T.ARG _) = rexp e | parenRexp e = "("^rexp e^")" diff -N -C 2 -r MLRISC/mltree/mltree.sig MLRISC-mlton/mltree/mltree.sig *** MLRISC/mltree/mltree.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 31,34 **** --- 31,38 ---- * it possible for recursive type definitions to work. *) + type controlflow = Label.label list (* control flow info *) + type ctrl = var (* control dependence info *) + type ctrls = ctrl list + datatype stm = (* assignment *) *************** *** 71,75 **** | ANNOTATION of stm * an ! | EXT of sext (* extension *) (* synthetic instructions to indicated that the regs are live or --- 75,79 ---- | ANNOTATION of stm * an ! | EXT of (stm, rexp, fexp, ccexp) Extension.sx (* extension *) (* synthetic instructions to indicated that the regs are live or *************** *** 153,157 **** | LET of stm * rexp ! | REXT of ty * rext | MARK of rexp * an --- 157,161 ---- | LET of stm * rexp ! | REXT of ty * (stm, rexp, fexp, ccexp) Extension.rx | MARK of rexp * an *************** *** 188,192 **** | FPRED of fexp * ctrl ! | FEXT of fty * fext | FMARK of fexp * an --- 192,196 ---- | FPRED of fexp * ctrl ! | FEXT of fty * (stm, rexp, fexp, ccexp) Extension.fx | FMARK of fexp * an *************** *** 205,209 **** | FCMP of fty * Basis.fcond * fexp * fexp | CCMARK of ccexp * an ! | CCEXT of ty * ccext and mlrisc = --- 209,213 ---- | FCMP of fty * Basis.fcond * fexp * fexp | CCMARK of ccexp * an ! | CCEXT of ty * (stm, rexp, fexp, ccexp) Extension.ccx and mlrisc = *************** *** 212,223 **** | FPR of fexp ! withtype controlflow = Label.label list (* control flow info *) ! and ctrl = var (* control dependence info *) ! and ctrls = ctrl list ! and sext = (stm, rexp, fexp, ccexp) Extension.sx ! and rext = (stm, rexp, fexp, ccexp) Extension.rx ! and fext = (stm, rexp, fexp, ccexp) Extension.fx ! and ccext = (stm, rexp, fexp, ccexp) Extension.ccx ! and labexp = rexp (* * Useful type abbreviations for working for MLTree. --- 216,224 ---- | FPR of fexp ! type sext = (stm, rexp, fexp, ccexp) Extension.sx ! and rext = (stm, rexp, fexp, ccexp) Extension.rx ! and fext = (stm, rexp, fexp, ccexp) Extension.fx ! and ccext = (stm, rexp, fexp, ccexp) Extension.ccx ! and labexp = rexp (* * Useful type abbreviations for working for MLTree. diff -N -C 2 -r MLRISC/mltree/mltree.sml MLRISC-mlton/mltree/mltree.sml *** MLRISC/mltree/mltree.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltree.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 33,36 **** --- 33,40 ---- * it possible for recursive type definitions to work. *) + type controlflow = Label.label list (* control flow info *) + type ctrl = var (* control dependence info *) + type ctrls = ctrl list + datatype stm = (* assignment *) *************** *** 200,207 **** | FPR of fexp ! withtype controlflow = Label.label list (* control flow info *) ! and ctrl = var (* control dependence info *) ! and ctrls = ctrl list ! and sext = (stm, rexp, fexp, ccexp) Extension.sx and rext = (stm, rexp, fexp, ccexp) Extension.rx and fext = (stm, rexp, fexp, ccexp) Extension.fx --- 204,208 ---- | FPR of fexp ! withtype sext = (stm, rexp, fexp, ccexp) Extension.sx and rext = (stm, rexp, fexp, ccexp) Extension.rx and fext = (stm, rexp, fexp, ccexp) Extension.fx diff -N -C 2 -r MLRISC/mltree/mltreecomp.sig MLRISC-mlton/mltree/mltreecomp.sig *** MLRISC/mltree/mltreecomp.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/mltree/mltreecomp.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 10,18 **** sig structure T : MLTREE ! structure TS : MLTREE_STREAM where T = T structure I : INSTRUCTIONS ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = TS.S.P (* * The reducer is given to the client during the compilation of --- 10,63 ---- sig structure T : MLTREE ! structure TS : MLTREE_STREAM (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm structure I : INSTRUCTIONS ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and P = TS.S.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm ! (* * The reducer is given to the client during the compilation of *************** *** 35,43 **** structure TS : MLTREE_STREAM structure I : INSTRUCTIONS ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = TS.S.P ! structure Gen : MLTREEGEN ! where T = TS.T type instrStream = (I.instruction, I.C.cellset, CFG.cfg) TS.stream --- 80,131 ---- structure TS : MLTREE_STREAM structure I : INSTRUCTIONS ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and P = TS.S.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm ! structure Gen : MLTREEGEN (* where T = TS.T *) ! where type T.Basis.cond = TS.T.Basis.cond ! and type T.Basis.div_rounding_mode = TS.T.Basis.div_rounding_mode ! and type T.Basis.ext = TS.T.Basis.ext ! and type T.Basis.fcond = TS.T.Basis.fcond ! and type T.Basis.rounding_mode = TS.T.Basis.rounding_mode ! and type T.Constant.const = TS.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) TS.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) TS.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) TS.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) TS.T.Extension.sx ! and type T.I.div_rounding_mode = TS.T.I.div_rounding_mode ! and type T.Region.region = TS.T.Region.region ! and type T.ccexp = TS.T.ccexp ! and type T.fexp = TS.T.fexp ! (* and type T.labexp = TS.T.labexp *) ! and type T.mlrisc = TS.T.mlrisc ! and type T.oper = TS.T.oper ! and type T.rep = TS.T.rep ! and type T.rexp = TS.T.rexp ! and type T.stm = TS.T.stm type instrStream = (I.instruction, I.C.cellset, CFG.cfg) TS.stream diff -N -C 2 -r MLRISC/omit-frameptr/omit-frame-pointer.sig MLRISC-mlton/omit-frameptr/omit-frame-pointer.sig *** MLRISC/omit-frameptr/omit-frame-pointer.sig 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/omit-frameptr/omit-frame-pointer.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 3,7 **** signature OMIT_FRAME_POINTER = sig structure I : INSTRUCTIONS ! structure CFG : CONTROL_FLOW_GRAPH where I = I (* idelta is the intial displacement between the fp and sp. *) --- 3,12 ---- signature OMIT_FRAME_POINTER = sig structure I : INSTRUCTIONS ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand (* idelta is the intial displacement between the fp and sp. *) diff -N -C 2 -r MLRISC/ppc/backpatch/ppcDelaySlots.sml MLRISC-mlton/ppc/backpatch/ppcDelaySlots.sml *** MLRISC/ppc/backpatch/ppcDelaySlots.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/backpatch/ppcDelaySlots.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,11 **** functor PPCDelaySlots(structure I : PPCINSTR ! structure P : INSN_PROPERTIES ! where I = I ) : DELAY_SLOT_PROPERTIES = struct --- 6,15 ---- functor PPCDelaySlots(structure I : PPCINSTR ! structure P : INSN_PROPERTIES (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ) : DELAY_SLOT_PROPERTIES = struct diff -N -C 2 -r MLRISC/ppc/backpatch/ppcJumps.sml MLRISC-mlton/ppc/backpatch/ppcJumps.sml *** MLRISC/ppc/backpatch/ppcJumps.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/backpatch/ppcJumps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,6 **** functor PPCJumps (structure Instr: PPCINSTR ! structure Shuffle : PPCSHUFFLE where I = Instr ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T ) : SDI_JUMPS = struct --- 1,69 ---- functor PPCJumps (structure Instr: PPCINSTR ! structure Shuffle : PPCSHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! and type I.arith = Instr.arith ! and type I.arithi = Instr.arithi ! and type I.bit = Instr.bit ! and type I.bo = Instr.bo ! and type I.ccarith = Instr.ccarith ! and type I.cmp = Instr.cmp ! and type I.ea = Instr.ea ! and type I.farith = Instr.farith ! and type I.farith3 = Instr.farith3 ! and type I.fcmp = Instr.fcmp ! and type I.fload = Instr.fload ! and type I.fstore = Instr.fstore ! and type I.funary = Instr.funary ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.load = Instr.load ! and type I.operand = Instr.operand ! and type I.rotate = Instr.rotate ! and type I.rotatei = Instr.rotatei ! and type I.spr = Instr.spr ! and type I.store = Instr.store ! and type I.unary = Instr.unary ! and type I.xerbit = Instr.xerbit ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : SDI_JUMPS = struct *************** *** 69,88 **** in case instr ! of I.L{ld=(I.LBZ | I.LHZ | I.LHA | I.LWZ),d,...} => ! operand(d, signed16, 4, 8) | I.L{d,...} => operand(d, signed12, 4, 8) ! | I.LF{ld=(I.LFS | I.LFD), d, ...} => operand(d, signed16, 4, 8) | I.LF{d, ...} => operand(d, signed12, 4, 8) ! | I.ST{st=(I.STB | I.STH | I.STW), d, ...} => operand(d, signed16, 4, 8) | I.ST{d, ...} => operand(d, signed12, 4, 8) ! | I.STF{st=(I.STFS | I.STFD), d, ...} => operand(d, signed16, 4, 8) | I.STF{d, ...} => operand(d, signed12, 4, 8) | I.ARITHI{oper, im, ...} => (case oper of I.ADDI => operand(im, signed16, 4, 8) ! | (I.ADDIS | I.SUBFIC | I.MULLI) => operand(im, signed16, 4, 12) ! | (I.ANDI_Rc | I.ANDIS_Rc | I.ORI | I.ORIS | I.XORI | I.XORIS) => ! operand(im, unsigned16, 4, 12) ! | (I.SRAWI | I.SRADI) => operand(im, unsigned5, 4, 12) (*esac*)) | I.ROTATEI{sh, ...} => error "sdiSize:ROTATE" --- 132,164 ---- in case instr ! of I.L{ld=I.LBZ,d,...} => operand(d, signed16, 4, 8) ! | I.L{ld=I.LHZ,d,...} => operand(d, signed16, 4, 8) ! | I.L{ld=I.LHA,d,...} => operand(d, signed16, 4, 8) ! | I.L{ld=I.LWZ,d,...} => operand(d, signed16, 4, 8) | I.L{d,...} => operand(d, signed12, 4, 8) ! | I.LF{ld=I.LFS, d, ...} => operand(d, signed16, 4, 8) ! | I.LF{ld=I.LFD, d, ...} => operand(d, signed16, 4, 8) | I.LF{d, ...} => operand(d, signed12, 4, 8) ! | I.ST{st=I.STB, d, ...} => operand(d, signed16, 4, 8) ! | I.ST{st=I.STH, d, ...} => operand(d, signed16, 4, 8) ! | I.ST{st=I.STW, d, ...} => operand(d, signed16, 4, 8) | I.ST{d, ...} => operand(d, signed12, 4, 8) ! | I.STF{st=I.STFS, d, ...} => operand(d, signed16, 4, 8) ! | I.STF{st=I.STFD, d, ...} => operand(d, signed16, 4, 8) | I.STF{d, ...} => operand(d, signed12, 4, 8) | I.ARITHI{oper, im, ...} => (case oper of I.ADDI => operand(im, signed16, 4, 8) ! | I.ADDIS => operand(im, signed16, 4, 12) ! | I.SUBFIC => operand(im, signed16, 4, 12) ! | I.MULLI => operand(im, signed16, 4, 12) ! | I.ANDI_Rc => operand(im, unsigned16, 4, 12) ! | I.ANDIS_Rc => operand(im, unsigned16, 4, 12) ! | I.ORI => operand(im, unsigned16, 4, 12) ! | I.ORIS => operand(im, unsigned16, 4, 12) ! | I.XORI => operand(im, unsigned16, 4, 12) ! | I.XORIS => operand(im, unsigned16, 4, 12) ! | I.SRAWI => operand(im, unsigned5, 4, 12) ! | I.SRADI => operand(im, unsigned5, 4, 12) (*esac*)) | I.ROTATEI{sh, ...} => error "sdiSize:ROTATE" diff -N -C 2 -r MLRISC/ppc/c-calls/ppc-macosx.sml MLRISC-mlton/ppc/c-calls/ppc-macosx.sml *** MLRISC/ppc/c-calls/ppc-macosx.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/c-calls/ppc-macosx.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 278,282 **** | CTy.C_long_double => assignFPR (tys, offset, availGPRs, availFPRs, layout) ! | (CTy.C_unsigned isz | CTy.C_signed isz) => assignGPR([sizeOfInt isz], tys, offset, availGPRs, availFPRs, layout) | CTy.C_PTR => --- 278,284 ---- | CTy.C_long_double => assignFPR (tys, offset, availGPRs, availFPRs, layout) ! | CTy.C_unsigned isz => ! assignGPR([sizeOfInt isz], tys, offset, availGPRs, availFPRs, layout) ! | CTy.C_signed isz => assignGPR([sizeOfInt isz], tys, offset, availGPRs, availFPRs, layout) | CTy.C_PTR => *************** *** 465,469 **** (* check calling convention *) case conv ! of ("" | "ccall") => () | _ => error (concat [ "unknown calling convention \"", --- 467,472 ---- (* check calling convention *) case conv ! of ("") => () ! | ("ccall") => () | _ => error (concat [ "unknown calling convention \"", diff -N -C 2 -r MLRISC/ppc/emit/ppcAsm.sml MLRISC-mlton/ppc/emit/ppcAsm.sml *** MLRISC/ppc/emit/ppcAsm.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/emit/ppcAsm.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,16 **** functor PPCAsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : PPCINSTR ! where T = S.P.T ! structure Shuffle : PPCSHUFFLE ! where I = Instr ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T ) : INSTRUCTION_EMITTER = struct --- 7,96 ---- functor PPCAsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : PPCINSTR (* where T = S.P.T *) ! where type T.Basis.cond = S.P.T.Basis.cond ! and type T.Basis.div_rounding_mode = S.P.T.Basis.div_rounding_mode ! and type T.Basis.ext = S.P.T.Basis.ext ! and type T.Basis.fcond = S.P.T.Basis.fcond ! and type T.Basis.rounding_mode = S.P.T.Basis.rounding_mode ! and type T.Constant.const = S.P.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) S.P.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) S.P.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) S.P.T.Extension.sx ! and type T.I.div_rounding_mode = S.P.T.I.div_rounding_mode ! and type T.Region.region = S.P.T.Region.region ! and type T.ccexp = S.P.T.ccexp ! and type T.fexp = S.P.T.fexp ! (* and type T.labexp = S.P.T.labexp *) ! and type T.mlrisc = S.P.T.mlrisc ! and type T.oper = S.P.T.oper ! and type T.rep = S.P.T.rep ! and type T.rexp = S.P.T.rexp ! and type T.stm = S.P.T.stm ! structure Shuffle : PPCSHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! and type I.arith = Instr.arith ! and type I.arithi = Instr.arithi ! and type I.bit = Instr.bit ! and type I.bo = Instr.bo ! and type I.ccarith = Instr.ccarith ! and type I.cmp = Instr.cmp ! and type I.ea = Instr.ea ! and type I.farith = Instr.farith ! and type I.farith3 = Instr.farith3 ! and type I.fcmp = Instr.fcmp ! and type I.fload = Instr.fload ! and type I.fstore = Instr.fstore ! and type I.funary = Instr.funary ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.load = Instr.load ! and type I.operand = Instr.operand ! and type I.rotate = Instr.rotate ! and type I.rotatei = Instr.rotatei ! and type I.spr = Instr.spr ! and type I.store = Instr.store ! and type I.unary = Instr.unary ! and type I.xerbit = Instr.xerbit ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : INSTRUCTION_EMITTER = struct diff -N -C 2 -r MLRISC/ppc/emit/ppcMC.sml MLRISC-mlton/ppc/emit/ppcMC.sml *** MLRISC/ppc/emit/ppcMC.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/emit/ppcMC.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,11 **** functor PPCMCEmitter(structure Instr : PPCINSTR ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T structure Stream : INSTRUCTION_STREAM structure CodeString : CODE_STRING --- 7,31 ---- functor PPCMCEmitter(structure Instr : PPCINSTR ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm structure Stream : INSTRUCTION_STREAM structure CodeString : CODE_STRING *************** *** 48,51 **** --- 68,72 ---- fun eByteW w = let val i = !loc + val w = W.toLargeWord w in loc := i + 1; CodeString.update(i,Word8.fromLargeWord w) end *************** *** 381,392 **** and arith {oper, rt, ra, rb, OE, Rc} = (case oper of ! (I.ADD | I.SUBF | I.MULLW | I.MULLD | I.MULHW | I.MULHWU | I.DIVW | I.DIVD | I.DIVWU | I.DIVDU) => ! arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} | _ => arith' {oper=oper, rt=ra, ra=rt, rb=rb, OE=OE, Rc=Rc} ) and arithi {oper, rt, ra, im} = (case oper of ! (I.ADDI | I.ADDIS | I.SUBFIC | I.MULLI) => arithi' {oper=oper, rt=rt, ! ra=ra, im=im} | I.SRAWI => srawi {rs=ra, ra=rt, sh=im} | I.SRADI => sradi {rs=ra, ra=rt, sh=im} --- 402,423 ---- and arith {oper, rt, ra, rb, OE, Rc} = (case oper of ! I.ADD => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.SUBF => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.MULLW => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.MULLD => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.MULHW => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.MULHWU => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.DIVW => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.DIVD => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.DIVWU => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} ! | I.DIVDU => arith' {oper=oper, rt=rt, ra=ra, rb=rb, OE=OE, Rc=Rc} | _ => arith' {oper=oper, rt=ra, ra=rt, rb=rb, OE=OE, Rc=Rc} ) and arithi {oper, rt, ra, im} = (case oper of ! I.ADDI => arithi' {oper=oper, rt=rt, ra=ra, im=im} ! | I.ADDIS => arithi' {oper=oper, rt=rt, ra=ra, im=im} ! | I.SUBFIC => arithi' {oper=oper, rt=rt, ra=ra, im=im} ! | I.MULLI => arithi' {oper=oper, rt=rt, ra=ra, im=im} | I.SRAWI => srawi {rs=ra, ra=rt, sh=im} | I.SRADI => sradi {rs=ra, ra=rt, sh=im} *************** *** 463,468 **** in (case oper of ! (I.FMUL | I.FMULS) => a_form {opcd=opcd, frt=ft, fra=fa, frb=0wx0, ! frc=fb, xo=xo, rc=Rc} | _ => a_form {opcd=opcd, frt=ft, fra=fa, frb=fb, frc=0wx0, xo=xo, rc=Rc} --- 494,499 ---- in (case oper of ! I.FMUL => a_form {opcd=opcd, frt=ft, fra=fa, frb=0wx0, frc=fb, xo=xo, rc=Rc} ! | I.FMULS => a_form {opcd=opcd, frt=ft, fra=fa, frb=0wx0, frc=fb, xo=xo, rc=Rc} | _ => a_form {opcd=opcd, frt=ft, fra=fa, frb=fb, frc=0wx0, xo=xo, rc=Rc} diff -N -C 2 -r MLRISC/ppc/flowgraph/ppcDarwinPseudoOps.sml MLRISC-mlton/ppc/flowgraph/ppcDarwinPseudoOps.sml *** MLRISC/ppc/flowgraph/ppcDarwinPseudoOps.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/flowgraph/ppcDarwinPseudoOps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 8,12 **** functor PPCDarwinPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ) : PSEUDO_OPS_BASIS = struct --- 8,32 ---- functor PPCDarwinPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ) : PSEUDO_OPS_BASIS = struct diff -N -C 2 -r MLRISC/ppc/flowgraph/ppcGasPseudoOps.sml MLRISC-mlton/ppc/flowgraph/ppcGasPseudoOps.sml *** MLRISC/ppc/flowgraph/ppcGasPseudoOps.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/flowgraph/ppcGasPseudoOps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,6 **** functor PPCGasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ! ) : PSEUDO_OPS_BASIS = struct --- 1,26 ---- functor PPCGasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ! ) : PSEUDO_OPS_BASIS = struct diff -N -C 2 -r MLRISC/ppc/instructions/ppcCompInstrExt.sml MLRISC-mlton/ppc/instructions/ppcCompInstrExt.sml *** MLRISC/ppc/instructions/ppcCompInstrExt.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/instructions/ppcCompInstrExt.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 10,18 **** sig structure I : PPCINSTR ! structure TS : MLTREE_STREAM ! where T = I.T ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = TS.S.P type reducer = --- 10,61 ---- sig structure I : PPCINSTR ! structure TS : MLTREE_STREAM (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and and P = TS.S.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm type reducer = *************** *** 29,38 **** structure I : PPCINSTR ! structure TS : MLTREE_STREAM ! where T = I.T ! structure CFG : CONTROL_FLOW_GRAPH ! where P = TS.S.P ! and I = I ! ) : PPCCOMP_INSTR_EXT = struct --- 72,123 ---- structure I : PPCINSTR ! structure TS : MLTREE_STREAM (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure CFG : CONTROL_FLOW_GRAPH (* where P = TS.S.P and I = I *) ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ) : PPCCOMP_INSTR_EXT = struct diff -N -C 2 -r MLRISC/ppc/instructions/ppcInstr.sml MLRISC-mlton/ppc/instructions/ppcInstr.sml *** MLRISC/ppc/instructions/ppcInstr.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/instructions/ppcInstr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 9,13 **** sig structure C : PPCCELLS ! structure CB : CELLS_BASIS = CellsBasis structure T : MLTREE structure Constant: CONSTANT --- 9,22 ---- sig structure C : PPCCELLS ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo structure T : MLTREE structure Constant: CONSTANT diff -N -C 2 -r MLRISC/ppc/instructions/ppcProps.sml MLRISC-mlton/ppc/instructions/ppcProps.sml *** MLRISC/ppc/instructions/ppcProps.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/instructions/ppcProps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,11 **** functor PPCProps ( structure PPCInstr : PPCINSTR ! structure MLTreeEval : MLTREE_EVAL where T = PPCInstr.T ! structure MLTreeHash : MLTREE_HASH where T = PPCInstr.T ) : INSN_PROPERTIES = struct --- 6,51 ---- functor PPCProps ( structure PPCInstr : PPCINSTR ! structure MLTreeEval : MLTREE_EVAL (* where T = PPCInstr.T *) ! where type T.Basis.cond = PPCInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = PPCInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = PPCInstr.T.Basis.ext ! and type T.Basis.fcond = PPCInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = PPCInstr.T.Basis.rounding_mode ! and type T.Constant.const = PPCInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) PPCInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) PPCInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) PPCInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) PPCInstr.T.Extension.sx ! and type T.I.div_rounding_mode = PPCInstr.T.I.div_rounding_mode ! and type T.Region.region = PPCInstr.T.Region.region ! and type T.ccexp = PPCInstr.T.ccexp ! and type T.fexp = PPCInstr.T.fexp ! (* and type T.labexp = PPCInstr.T.labexp *) ! and type T.mlrisc = PPCInstr.T.mlrisc ! and type T.oper = PPCInstr.T.oper ! and type T.rep = PPCInstr.T.rep ! and type T.rexp = PPCInstr.T.rexp ! and type T.stm = PPCInstr.T.stm ! structure MLTreeHash : MLTREE_HASH (* where T = PPCInstr.T *) ! where type T.Basis.cond = PPCInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = PPCInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = PPCInstr.T.Basis.ext ! and type T.Basis.fcond = PPCInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = PPCInstr.T.Basis.rounding_mode ! and type T.Constant.const = PPCInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) PPCInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) PPCInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) PPCInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) PPCInstr.T.Extension.sx ! and type T.I.div_rounding_mode = PPCInstr.T.I.div_rounding_mode ! and type T.Region.region = PPCInstr.T.Region.region ! and type T.ccexp = PPCInstr.T.ccexp ! and type T.fexp = PPCInstr.T.fexp ! (* and type T.labexp = PPCInstr.T.labexp *) ! and type T.mlrisc = PPCInstr.T.mlrisc ! and type T.oper = PPCInstr.T.oper ! and type T.rep = PPCInstr.T.rep ! and type T.rexp = PPCInstr.T.rexp ! and type T.stm = PPCInstr.T.stm ) : INSN_PROPERTIES = struct diff -N -C 2 -r MLRISC/ppc/mltree/ppc.sml MLRISC-mlton/ppc/mltree/ppc.sml *** MLRISC/ppc/mltree/ppc.sml 2010-02-03 11:40:41.000000000 -0500 --- MLRISC-mlton/ppc/mltree/ppc.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 11,18 **** functor PPC (structure PPCInstr : PPCINSTR ! structure PseudoInstrs : PPC_PSEUDO_INSTR ! where I = PPCInstr ! structure ExtensionComp : MLTREE_EXTENSION_COMP ! where I = PPCInstr and T = PPCInstr.T (* --- 11,84 ---- functor PPC (structure PPCInstr : PPCINSTR ! structure PseudoInstrs : PPC_PSEUDO_INSTR (* where I = PPCInstr *) ! where type I.Constant.const = PPCInstr.Constant.const ! and type I.Region.region = PPCInstr.Region.region ! and type I.T.Basis.cond = PPCInstr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = PPCInstr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = PPCInstr.T.Basis.ext ! and type I.T.Basis.fcond = PPCInstr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = PPCInstr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) PPCInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) PPCInstr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) PPCInstr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) PPCInstr.T.Extension.sx ! and type I.T.I.div_rounding_mode = PPCInstr.T.I.div_rounding_mode ! and type I.T.ccexp = PPCInstr.T.ccexp ! and type I.T.fexp = PPCInstr.T.fexp ! (* and type I.T.labexp = PPCInstr.T.labexp *) ! and type I.T.mlrisc = PPCInstr.T.mlrisc ! and type I.T.oper = PPCInstr.T.oper ! and type I.T.rep = PPCInstr.T.rep ! and type I.T.rexp = PPCInstr.T.rexp ! and type I.T.stm = PPCInstr.T.stm ! and type I.arith = PPCInstr.arith ! and type I.arithi = PPCInstr.arithi ! and type I.bit = PPCInstr.bit ! and type I.bo = PPCInstr.bo ! and type I.ccarith = PPCInstr.ccarith ! and type I.cmp = PPCInstr.cmp ! and type I.ea = PPCInstr.ea ! and type I.farith = PPCInstr.farith ! and type I.farith3 = PPCInstr.farith3 ! and type I.fcmp = PPCInstr.fcmp ! and type I.fload = PPCInstr.fload ! and type I.fstore = PPCInstr.fstore ! and type I.funary = PPCInstr.funary ! and type I.instr = PPCInstr.instr ! and type I.instruction = PPCInstr.instruction ! and type I.load = PPCInstr.load ! and type I.operand = PPCInstr.operand ! and type I.rotate = PPCInstr.rotate ! and type I.rotatei = PPCInstr.rotatei ! and type I.spr = PPCInstr.spr ! and type I.store = PPCInstr.store ! and type I.unary = PPCInstr.unary ! and type I.xerbit = PPCInstr.xerbit ! structure ExtensionComp : MLTREE_EXTENSION_COMP (* where I = PPCInstr and T = PPCInstr.T *) ! where type I.addressing_mode = PPCInstr.addressing_mode ! and type I.ea = PPCInstr.ea ! and type I.instr = PPCInstr.instr ! and type I.instruction = PPCInstr.instruction ! and type I.operand = PPCInstr.operand ! where type T.Basis.cond = PPCInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = PPCInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = PPCInstr.T.Basis.ext ! and type T.Basis.fcond = PPCInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = PPCInstr.T.Basis.rounding_mode ! and type T.Constant.const = PPCInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) PPCInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) PPCInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) PPCInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) PPCInstr.T.Extension.sx ! and type T.I.div_rounding_mode = PPCInstr.T.I.div_rounding_mode ! and type T.Region.region = PPCInstr.T.Region.region ! and type T.ccexp = PPCInstr.T.ccexp ! and type T.fexp = PPCInstr.T.fexp ! (* and type T.labexp = PPCInstr.T.labexp *) ! and type T.mlrisc = PPCInstr.T.mlrisc ! and type T.oper = PPCInstr.T.oper ! and type T.rep = PPCInstr.T.rep ! and type T.rexp = PPCInstr.T.rexp ! and type T.stm = PPCInstr.T.stm (* *************** *** 72,76 **** * Integer multiplication *) ! functor Multiply32 = MLTreeMult (structure I = I structure T = T --- 138,142 ---- * Integer multiplication *) ! structure Mulu32 = MLTreeMult (structure I = I structure T = T *************** *** 85,92 **** fun srli{r,i,d} = [I.INSTR(SRLI32{r=r,i=i,d=d})] fun srai{r,i,d} = [I.arithi{oper=I.SRAWI,rt=d,ra=r,im=I.ImmedOp i}] ! ) ! ! structure Mulu32 = Multiply32 ! (val trapping = false val multCost = multCost fun addv{r1,r2,d}=[I.arith{oper=I.ADD,ra=r1,rb=r2,rt=d,Rc=false,OE=false}] --- 151,156 ---- fun srli{r,i,d} = [I.INSTR(SRLI32{r=r,i=i,d=d})] fun srai{r,i,d} = [I.arithi{oper=I.SRAWI,rt=d,ra=r,im=I.ImmedOp i}] ! ! val trapping = false val multCost = multCost fun addv{r1,r2,d}=[I.arith{oper=I.ADD,ra=r1,rb=r2,rt=d,Rc=false,OE=false}] *************** *** 95,103 **** val sh2addv = NONE val sh3addv = NONE ! ) ! (val signed = false) ! structure Muls32 = Multiply32 ! (val trapping = false val multCost = multCost fun addv{r1,r2,d}=[I.arith{oper=I.ADD,ra=r1,rb=r2,rt=d,Rc=false,OE=false}] --- 159,180 ---- val sh2addv = NONE val sh3addv = NONE ! ! val signed = false) ! ! structure Muls32 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! val intTy = 32 ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! fun mov{r,d} = COPY{dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d}= I.arith{oper=I.ADD,ra=r1,rb=r2,rt=d,Rc=false,OE=false} ! fun slli{r,i,d} = [I.INSTR(SLLI32{r=r,i=i,d=d})] ! fun srli{r,i,d} = [I.INSTR(SRLI32{r=r,i=i,d=d})] ! fun srai{r,i,d} = [I.arithi{oper=I.SRAWI,rt=d,ra=r,im=I.ImmedOp i}] ! ! val trapping = false val multCost = multCost fun addv{r1,r2,d}=[I.arith{oper=I.ADD,ra=r1,rb=r2,rt=d,Rc=false,OE=false}] *************** *** 106,114 **** val sh2addv = NONE val sh3addv = NONE ! ) ! (val signed = true) ! structure Mult32 = Multiply32 ! (val trapping = true val multCost = multCost fun addv{r1,r2,d} = error "Mult32.addv" --- 183,204 ---- val sh2addv = NONE val sh3addv = NONE ! ! val signed = true) ! structure Mult32 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! val intTy = 32 ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! ! fun mov{r,d} = COPY{dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d}= I.arith{oper=I.ADD,ra=r1,rb=r2,rt=d,Rc=false,OE=false} ! fun slli{r,i,d} = [I.INSTR(SLLI32{r=r,i=i,d=d})] ! fun srli{r,i,d} = [I.INSTR(SRLI32{r=r,i=i,d=d})] ! fun srai{r,i,d} = [I.arithi{oper=I.SRAWI,rt=d,ra=r,im=I.ImmedOp i}] ! ! val trapping = true val multCost = multCost fun addv{r1,r2,d} = error "Mult32.addv" *************** *** 117,122 **** val sh2addv = NONE val sh3addv = NONE ! ) ! (val signed = true) fun selectInstructions --- 207,212 ---- val sh2addv = NONE val sh3addv = NONE ! ! val signed = true) fun selectInstructions *************** *** 278,282 **** | stmt(T.JMP(T.LABEXP lexp, labs),an) = mark(I.B{addr=I.LabelOp lexp, LK=false},an) ! | stmt(T.JMP(x as (T.LABEL _ | T.CONST _), labs),an) = mark(I.B{addr=I.LabelOp x, LK=false},an) | stmt(T.JMP(rexp, labs),an) = --- 368,374 ---- | stmt(T.JMP(T.LABEXP lexp, labs),an) = mark(I.B{addr=I.LabelOp lexp, LK=false},an) ! | stmt(T.JMP(x as T.LABEL _, labs),an) = ! mark(I.B{addr=I.LabelOp x, LK=false},an) ! | stmt(T.JMP(x as T.CONST _, labs),an) = mark(I.B{addr=I.LabelOp x, LK=false},an) | stmt(T.JMP(rexp, labs),an) = *************** *** 327,331 **** | T.GTU => (I.TRUE, I.GT) | T.GEU => (I.FALSE, I.LT) ! | (T.SETCC | T.MISC_COND _) => error "branch(CMP)" (*esac*)) val ccreg = if true then CR0 else newCCreg() (* XXX *) --- 419,424 ---- | T.GTU => (I.TRUE, I.GT) | T.GEU => (I.FALSE, I.LT) ! | T.SETCC => error "branch(CMP)" ! | T.MISC_COND _ => error "branch(CMP)" (*esac*)) val ccreg = if true then CR0 else newCCreg() (* XXX *) *************** *** 355,365 **** emitBranch{bo=bo, bf=cr, bit=bit, addr=addr, LK=false} in case cc of ! T.EQ => branch(I.TRUE, I.EQ) ! | T.NE => branch(I.FALSE, I.EQ) ! | (T.LT | T.LTU) => branch(I.TRUE, I.LT) ! | (T.LE | T.LEU) => branch(I.FALSE, I.GT) ! | (T.GE | T.GEU) => branch(I.FALSE, I.LT) ! | (T.GT | T.GTU) => branch(I.TRUE, I.GT) ! | (T.SETCC | T.MISC_COND _) => error "branch(CC)" end | branch(cmp as T.FCMP(fty, cond, _, _), lab, an) = --- 448,463 ---- emitBranch{bo=bo, bf=cr, bit=bit, addr=addr, LK=false} in case cc of ! T.EQ => branch(I.TRUE, I.EQ) ! | T.NE => branch(I.FALSE, I.EQ) ! | T.LT => branch(I.TRUE, I.LT) ! | T.LTU => branch(I.TRUE, I.LT) ! | T.LE => branch(I.FALSE, I.GT) ! | T.LEU => branch(I.FALSE, I.GT) ! | T.GE => branch(I.FALSE, I.LT) ! | T.GEU => branch(I.FALSE, I.LT) ! | T.GT => branch(I.TRUE, I.GT) ! | T.GTU => branch(I.TRUE, I.GT) ! | T.SETCC => error "branch(CC)" ! | T.MISC_COND _ => error "branch(CC)" end | branch(cmp as T.FCMP(fty, cond, _, _), lab, an) = *************** *** 391,395 **** | T.<> => test2bits(I.FL, I.FG) | T.?= => test2bits(I.FU, I.FE) ! | (T.SETFCC | T.MISC_FCOND _) => error "branch(FCMP)" (*esac*) end --- 489,494 ---- | T.<> => test2bits(I.FL, I.FG) | T.?= => test2bits(I.FU, I.FE) ! | T.SETFCC => error "branch(FCMP)" ! | T.MISC_FCOND _ => error "branch(FCMP)" (*esac*) end *************** *** 497,501 **** ) | subtract(ty, T.LI i, e2, rt, an) = subfImmed(i, expr e2, rt, an) ! | subtract(ty, x as (T.CONST _ | T.LABEL _), e2, rt, an) = mark(I.ARITHI{oper=I.SUBFIC,rt=rt,ra=expr e2, im=I.LabelOp x},an) --- 596,603 ---- ) | subtract(ty, T.LI i, e2, rt, an) = subfImmed(i, expr e2, rt, an) ! | subtract(ty, x as T.CONST _, e2, rt, an) = ! mark(I.ARITHI{oper=I.SUBFIC,rt=rt,ra=expr e2, ! im=I.LabelOp x},an) ! | subtract(ty, x as T.LABEL _, e2, rt, an) = mark(I.ARITHI{oper=I.SUBFIC,rt=rt,ra=expr e2, im=I.LabelOp x},an) *************** *** 730,735 **** (* Single/double precision support *) ! | T.FABS((32|64), e) => funary(I.FABS, e, ft, an) ! | T.FNEG((32|64), e) => funary(I.FNEG, e, ft, an) | T.FSQRT(32, e) => funary(I.FSQRTS, e, ft, an) | T.FSQRT(64, e) => funary(I.FSQRT, e, ft, an) --- 832,839 ---- (* Single/double precision support *) ! | T.FABS(32, e) => funary(I.FABS, e, ft, an) ! | T.FABS(64, e) => funary(I.FABS, e, ft, an) ! | T.FNEG(32, e) => funary(I.FNEG, e, ft, an) ! | T.FNEG(64, e) => funary(I.FNEG, e, ft, an) | T.FSQRT(32, e) => funary(I.FSQRTS, e, ft, an) | T.FSQRT(64, e) => funary(I.FSQRT, e, ft, an) *************** *** 758,763 **** let val (opnds, cmp) = case cc of ! (T.LT | T.LE | T.EQ | T.NE | T.GT | T.GE) => ! (immedOpnd signed16, I.CMP) | _ => (immedOpnd unsigned16, I.CMPL) val (opndA, opndB) = opnds(e1, e2) --- 862,871 ---- let val (opnds, cmp) = case cc of ! T.LT => (immedOpnd signed16, I.CMP) ! | T.LE => (immedOpnd signed16, I.CMP) ! | T.EQ => (immedOpnd signed16, I.CMP) ! | T.NE => (immedOpnd signed16, I.CMP) ! | T.GT => (immedOpnd signed16, I.CMP) ! | T.GE => (immedOpnd signed16, I.CMP) | _ => (immedOpnd unsigned16, I.CMPL) val (opndA, opndB) = opnds(e1, e2) diff -N -C 2 -r MLRISC/ra/arch-spill-instr.sig MLRISC-mlton/ra/arch-spill-instr.sig *** MLRISC/ra/arch-spill-instr.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/arch-spill-instr.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 11,15 **** signature ARCH_SPILL_INSTR = sig structure I : INSTRUCTIONS ! structure CB : CELLS_BASIS = CellsBasis val spillToEA : --- 11,24 ---- signature ARCH_SPILL_INSTR = sig structure I : INSTRUCTIONS ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo val spillToEA : diff -N -C 2 -r MLRISC/ra/chaitin-spillheur2.sml MLRISC-mlton/ra/chaitin-spillheur2.sml *** MLRISC/ra/chaitin-spillheur2.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/chaitin-spillheur2.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 36,40 **** let fun loop([], savings) = foldr (fn ((_,a),b) => Real.max(a,b)) 0.0 savings ! | loop(MV{status=ref(WORKLIST | GEORGE_MOVE | BRIGGS_MOVE), dst, src, cost, ...}::mvs, savings) = let fun add(c,[]) = [(c,cost)] --- 36,68 ---- let fun loop([], savings) = foldr (fn ((_,a),b) => Real.max(a,b)) 0.0 savings ! | loop(MV{status=ref WORKLIST, ! dst, src, cost, ...}::mvs, savings) = ! let fun add(c,[]) = [(c,cost)] ! | add(c,(x as (c':int,s))::savings) = ! if c = c' then (c',s+cost)::savings ! else x::add(c,savings) ! val savings = ! case chase dst of ! NODE{color=ref(COLORED c), ...} => add(c,savings) ! | _ => ! case chase src of ! NODE{color=ref(COLORED c), ...} => add(c,savings) ! | _ => savings ! in loop(mvs, savings) end ! | loop(MV{status=ref GEORGE_MOVE, ! dst, src, cost, ...}::mvs, savings) = ! let fun add(c,[]) = [(c,cost)] ! | add(c,(x as (c':int,s))::savings) = ! if c = c' then (c',s+cost)::savings ! else x::add(c,savings) ! val savings = ! case chase dst of ! NODE{color=ref(COLORED c), ...} => add(c,savings) ! | _ => ! case chase src of ! NODE{color=ref(COLORED c), ...} => add(c,savings) ! | _ => savings ! in loop(mvs, savings) end ! | loop(MV{status=ref BRIGGS_MOVE, dst, src, cost, ...}::mvs, savings) = let fun add(c,[]) = [(c,cost)] diff -N -C 2 -r MLRISC/ra/chow-hennessy-spillheur2.sml MLRISC-mlton/ra/chow-hennessy-spillheur2.sml *** MLRISC/ra/chow-hennessy-spillheur2.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/chow-hennessy-spillheur2.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 33,37 **** let fun loop([], savings) = foldr (fn ((_,a),b) => Real.max(a,b)) 0.0 savings ! | loop(MV{status=ref(WORKLIST | GEORGE_MOVE | BRIGGS_MOVE), dst, src, cost, ...}::mvs, savings) = let fun add(c,[]) = [(c,cost)] --- 33,65 ---- let fun loop([], savings) = foldr (fn ((_,a),b) => Real.max(a,b)) 0.0 savings ! | loop(MV{status=ref WORKLIST, ! dst, src, cost, ...}::mvs, savings) = ! let fun add(c,[]) = [(c,cost)] ! | add(c,(x as (c':int,s))::savings) = ! if c = c' then (c',s+cost)::savings ! else x::add(c,savings) ! val savings = ! case chase dst of ! NODE{color=ref(COLORED c), ...} => add(c,savings) ! | _ => ! case chase src of ! NODE{color=ref(COLORED c), ...} => add(c,savings) ! | _ => savings ! in loop(mvs, savings) end ! | loop(MV{status=ref GEORGE_MOVE, ! dst, src, cost, ...}::mvs, savings) = ! let fun add(c,[]) = [(c,cost)] ! | add(c,(x as (c':int,s))::savings) = ! if c = c' then (c',s+cost)::savings ! else x::add(c,savings) ! val savings = ! case chase dst of ! NODE{color=ref(COLORED c), ...} => add(c,savings) ! | _ => ! case chase src of ! NODE{color=ref(COLORED c), ...} => add(c,savings) ! | _ => savings ! in loop(mvs, savings) end ! | loop(MV{status=ref BRIGGS_MOVE, dst, src, cost, ...}::mvs, savings) = let fun add(c,[]) = [(c,cost)] diff -N -C 2 -r MLRISC/ra/cluster-ra.sml MLRISC-mlton/ra/cluster-ra.sml *** MLRISC/ra/cluster-ra.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/cluster-ra.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 15,25 **** functor ClusterRA (structure Asm : INSTRUCTION_EMITTER ! structure Flowgraph : CONTROL_FLOW_GRAPH ! where I = Asm.I ! and P = Asm.S.P ! structure InsnProps : INSN_PROPERTIES ! where I = Flowgraph.I ! structure Spill : RA_SPILL ! where I = Flowgraph.I ) : RA_FLOWGRAPH = struct --- 15,57 ---- functor ClusterRA (structure Asm : INSTRUCTION_EMITTER ! structure Flowgraph : CONTROL_FLOW_GRAPH (* where I = Asm.I and P = Asm.S.P *) ! where type I.addressing_mode = Asm.I.addressing_mode ! and type I.ea = Asm.I.ea ! and type I.instr = Asm.I.instr ! and type I.instruction = Asm.I.instruction ! and type I.operand = Asm.I.operand ! where type P.Client.pseudo_op = Asm.S.P.Client.pseudo_op ! and type P.T.Basis.cond = Asm.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = Asm.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = Asm.S.P.T.Basis.ext ! and type P.T.Basis.fcond = Asm.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = Asm.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = Asm.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) Asm.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) Asm.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) Asm.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) Asm.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = Asm.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = Asm.S.P.T.Region.region ! and type P.T.ccexp = Asm.S.P.T.ccexp ! and type P.T.fexp = Asm.S.P.T.fexp ! (* and type P.T.labexp = Asm.S.P.T.labexp *) ! and type P.T.mlrisc = Asm.S.P.T.mlrisc ! and type P.T.oper = Asm.S.P.T.oper ! and type P.T.rep = Asm.S.P.T.rep ! and type P.T.rexp = Asm.S.P.T.rexp ! and type P.T.stm = Asm.S.P.T.stm ! structure InsnProps : INSN_PROPERTIES (* where I = Flowgraph.I *) ! where type I.addressing_mode = Flowgraph.I.addressing_mode ! and type I.ea = Flowgraph.I.ea ! and type I.instr = Flowgraph.I.instr ! and type I.instruction = Flowgraph.I.instruction ! and type I.operand = Flowgraph.I.operand ! structure Spill : RA_SPILL (* where I = Flowgraph.I *) ! where type I.addressing_mode = Flowgraph.I.addressing_mode ! and type I.ea = Flowgraph.I.ea ! and type I.instr = Flowgraph.I.instr ! and type I.instruction = Flowgraph.I.instruction ! and type I.operand = Flowgraph.I.operand ) : RA_FLOWGRAPH = struct diff -N -C 2 -r MLRISC/ra/mem-ra.sml MLRISC-mlton/ra/mem-ra.sml *** MLRISC/ra/mem-ra.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/mem-ra.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 52,56 **** | collectMoves(NODE{movelist, color, ...}::ns, mv') = let fun ins([], mv') = collectMoves(ns, mv') ! | ins(MV{status=ref(COALESCED | CONSTRAINED), ...}::mvs, mv') = ins(mvs, mv') | ins((mv as MV{dst, src, ...})::mvs, mv') = let --- 52,58 ---- | collectMoves(NODE{movelist, color, ...}::ns, mv') = let fun ins([], mv') = collectMoves(ns, mv') ! | ins(MV{status=ref COALESCED, ...}::mvs, mv') = ! ins(mvs, mv') ! | ins(MV{status=ref CONSTRAINED, ...}::mvs, mv') = ins(mvs, mv') | ins((mv as MV{dst, src, ...})::mvs, mv') = let *************** *** 93,97 **** number=t, ...})::adjDst, adjSrc) = (case !color of ! (SPILLED | MEMREG _ | SPILL_LOC _ | PSEUDO) => if addEdge(s, t) then (adjT := src :: !adjT; union(adjDst, n::adjSrc)) --- 95,111 ---- number=t, ...})::adjDst, adjSrc) = (case !color of ! SPILLED => ! if addEdge(s, t) then ! (adjT := src :: !adjT; union(adjDst, n::adjSrc)) ! else union(adjDst, adjSrc) ! | MEMREG _ => ! if addEdge(s, t) then ! (adjT := src :: !adjT; union(adjDst, n::adjSrc)) ! else union(adjDst, adjSrc) ! | SPILL_LOC _ => ! if addEdge(s, t) then ! (adjT := src :: !adjT; union(adjDst, n::adjSrc)) ! else union(adjDst, adjSrc) ! | PSEUDO => if addEdge(s, t) then (adjT := src :: !adjT; union(adjDst, n::adjSrc)) *************** *** 156,160 **** fun moveSavings([], pinned, total) = (pinned, total+total) ! | moveSavings(MV{status=ref(CONSTRAINED | COALESCED), ...}::mvs, pinned, total) = moveSavings(mvs, pinned, total) --- 170,177 ---- fun moveSavings([], pinned, total) = (pinned, total+total) ! | moveSavings(MV{status=ref CONSTRAINED, ...}::mvs, ! pinned, total) = ! moveSavings(mvs, pinned, total) ! | moveSavings(MV{status=ref COALESCED, ...}::mvs, pinned, total) = moveSavings(mvs, pinned, total) diff -N -C 2 -r MLRISC/ra/ra-core.sig MLRISC-mlton/ra/ra-core.sig *** MLRISC/ra/ra-core.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-core.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 12,16 **** sig ! structure G : RA_GRAPH = RAGraph structure BM : RA_BITMATRIX structure MV : RA_PRIORITY_QUEUE where type elem = G.move --- 12,35 ---- sig ! structure G : RA_GRAPH (* = RAGraph *) ! where type C.CellSet.cellset = RAGraph.C.CellSet.cellset ! and type 'a C.ColorTable.hash_table = 'a RAGraph.C.ColorTable.hash_table ! and type 'a C.HashTable.hash_table = 'a RAGraph.C.HashTable.hash_table ! and type C.SortedCells.sorted_cells = RAGraph.C.SortedCells.sorted_cells ! and type C.cell = RAGraph.C.cell ! and type C.cellColor = RAGraph.C.cellColor ! and type C.cellkind = RAGraph.C.cellkind ! and type C.cellkindDesc = RAGraph.C.cellkindDesc ! and type C.cellkindInfo = RAGraph.C.cellkindInfo ! and type 'a PPtHashTable.hash_table = 'a RAGraph.PPtHashTable.hash_table ! and type 'a SpillLocHashTable.hash_table = 'a RAGraph.SpillLocHashTable.hash_table ! and type interferenceGraph = RAGraph.interferenceGraph ! and type move = RAGraph.move ! and type moveKind = RAGraph.moveKind ! and type moveStatus = RAGraph.moveStatus ! and type node = RAGraph.node ! and type nodeStatus = RAGraph.nodeStatus ! and type spillLoc = RAGraph.spillLoc ! and type trailInfo = RAGraph.trailInfo structure BM : RA_BITMATRIX structure MV : RA_PRIORITY_QUEUE where type elem = G.move diff -N -C 2 -r MLRISC/ra/ra-core.sml MLRISC-mlton/ra/ra-core.sml *** MLRISC/ra/ra-core.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-core.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 164,168 **** let fun pr s = TextIO.output(stream, s) val show = show G ! fun prMove(MV{src, dst, status=ref(WORKLIST | BRIGGS_MOVE | GEORGE_MOVE), cost,...}) = pr(node2s(chase dst)^" <- "^node2s(chase src)^ --- 164,176 ---- let fun pr s = TextIO.output(stream, s) val show = show G ! fun prMove(MV{src, dst, status=ref WORKLIST, ! cost,...}) = ! pr(node2s(chase dst)^" <- "^node2s(chase src)^ ! "("^r2s(cost)^") ") ! | prMove(MV{src, dst, status=ref BRIGGS_MOVE, ! cost,...}) = ! pr(node2s(chase dst)^" <- "^node2s(chase src)^ ! "("^r2s(cost)^") ") ! | prMove(MV{src, dst, status=ref GEORGE_MOVE, cost,...}) = pr(node2s(chase dst)^" <- "^node2s(chase src)^ *************** *** 542,546 **** ns, mv) = (case !status of ! (BRIGGS_MOVE | GEORGE_MOVE) => (* decrements hi, when hi <= 0 enable move *) if hi <= 1 then --- 550,560 ---- ns, mv) = (case !status of ! BRIGGS_MOVE => ! (* decrements hi, when hi <= 0 enable move *) ! if hi <= 1 then ! (status := WORKLIST; addMv(rest, ns, MV.add(m, mv))) ! else ! (hicount := hi-1; addMv(rest, ns, mv)) ! | GEORGE_MOVE => (* decrements hi, when hi <= 0 enable move *) if hi <= 1 then *************** *** 624,628 **** * deg < K or else optimistic spilling must be in effect! *) ! NODE{degree,number,color=ref(PSEUDO | REMOVED), ...} => if !degree < K orelse member(reg, number) then loop(adj, hi) else loop(adj, hi+1) --- 638,645 ---- * deg < K or else optimistic spilling must be in effect! *) ! NODE{degree,number,color=ref PSEUDO, ...} => ! if !degree < K orelse member(reg, number) then loop(adj, hi) ! else loop(adj, hi+1) ! | NODE{degree,number,color=ref REMOVED, ...} => if !degree < K orelse member(reg, number) then loop(adj, hi) else loop(adj, hi+1) *************** *** 707,711 **** mv, fz, stack) = (case !color of ! (COLORED _ | SPILL_LOC _ | MEMREG _ | SPILLED) => (addEdge(t, u); union(adj, mv, fz, stack)) | PSEUDO => --- 724,734 ---- mv, fz, stack) = (case !color of ! COLORED _ => ! (addEdge(t, u); union(adj, mv, fz, stack)) ! | SPILL_LOC _ => ! (addEdge(t, u); union(adj, mv, fz, stack)) ! | MEMREG _ => ! (addEdge(t, u); union(adj, mv, fz, stack)) ! | SPILLED => (addEdge(t, u); union(adj, mv, fz, stack)) | PSEUDO => *************** *** 865,869 **** case !status of WORKLIST => error "elimMoves" ! | (BRIGGS_MOVE | GEORGE_MOVE) => (* mark move as lost *) let val _ = status := LOST val src as NODE{number=s,...} = chase src --- 888,907 ---- case !status of WORKLIST => error "elimMoves" ! | BRIGGS_MOVE => (* mark move as lost *) ! let val _ = status := LOST ! val src as NODE{number=s,...} = chase src ! val you = if s = me then chase dst else src ! in case you of ! NODE{color=ref(COLORED _),...} => ! elimMoves(mvs, simp) ! | NODE{movecnt as ref c, degree, ...} => (* pseudo *) ! (movecnt := c - 1; ! if c = 1 andalso !degree < K then ! elimMoves(mvs, you::simp) ! else ! elimMoves(mvs, simp) ! ) ! end ! | GEORGE_MOVE => (* mark move as lost *) let val _ = status := LOST val src as NODE{number=s,...} = chase src *************** *** 1086,1090 **** *) fun getPref([], pref) = pref ! | getPref(MV{status=ref(LOST | BRIGGS_MOVE | GEORGE_MOVE), src, dst, ...}::mvs, pref) = let val src as NODE{number=s,...} = chase src --- 1124,1144 ---- *) fun getPref([], pref) = pref ! | getPref(MV{status=ref LOST, ! src, dst, ...}::mvs, pref) = ! let val src as NODE{number=s,...} = chase src ! val other = if s = number then chase dst else src ! in case other of ! NODE{color=ref(COLORED c),...} => getPref(mvs, c::pref) ! | _ => getPref(mvs, pref) ! end ! | getPref(MV{status=ref BRIGGS_MOVE, ! src, dst, ...}::mvs, pref) = ! let val src as NODE{number=s,...} = chase src ! val other = if s = number then chase dst else src ! in case other of ! NODE{color=ref(COLORED c),...} => getPref(mvs, c::pref) ! | _ => getPref(mvs, pref) ! end ! | getPref(MV{status=ref GEORGE_MOVE, src, dst, ...}::mvs, pref) = let val src as NODE{number=s,...} = chase src diff -N -C 2 -r MLRISC/ra/ra-deadCodeE.sml MLRISC-mlton/ra/ra-deadCodeE.sml *** MLRISC/ra/ra-deadCodeE.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-deadCodeE.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 7,13 **** *) ! functor RADeadCodeElim ! (Flowgraph : RA_FLOWGRAPH) ! ( (* check for dead code on these cellkinds only *) val cellkind : CellsBasis.cellkind -> bool (* Dead registers are stored here. *) --- 7,13 ---- *) ! functor RADeadCodeElim ( ! structure Flowgraph : RA_FLOWGRAPH ! (* check for dead code on these cellkinds only *) val cellkind : CellsBasis.cellkind -> bool (* Dead registers are stored here. *) diff -N -C 2 -r MLRISC/ra/ra-flowgraph.sig MLRISC-mlton/ra/ra-flowgraph.sig *** MLRISC/ra/ra-flowgraph.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-flowgraph.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 13,20 **** structure I : INSTRUCTIONS structure C : CELLS ! structure G : RA_GRAPH = RAGraph structure Spill : RA_SPILL ! sharing Spill.I = I ! sharing I.C = C type flowgraph --- 13,44 ---- structure I : INSTRUCTIONS structure C : CELLS ! structure G : RA_GRAPH (* = RAGraph *) ! where type C.CellSet.cellset = RAGraph.C.CellSet.cellset ! and type 'a C.ColorTable.hash_table = 'a RAGraph.C.ColorTable.hash_table ! and type 'a C.HashTable.hash_table = 'a RAGraph.C.HashTable.hash_table ! and type C.SortedCells.sorted_cells = RAGraph.C.SortedCells.sorted_cells ! and type C.cell = RAGraph.C.cell ! and type C.cellColor = RAGraph.C.cellColor ! and type C.cellkind = RAGraph.C.cellkind ! and type C.cellkindDesc = RAGraph.C.cellkindDesc ! and type C.cellkindInfo = RAGraph.C.cellkindInfo ! and type 'a PPtHashTable.hash_table = 'a RAGraph.PPtHashTable.hash_table ! and type 'a SpillLocHashTable.hash_table = 'a RAGraph.SpillLocHashTable.hash_table ! and type interferenceGraph = RAGraph.interferenceGraph ! and type move = RAGraph.move ! and type moveKind = RAGraph.moveKind ! and type moveStatus = RAGraph.moveStatus ! and type node = RAGraph.node ! and type nodeStatus = RAGraph.nodeStatus ! and type spillLoc = RAGraph.spillLoc ! and type trailInfo = RAGraph.trailInfo structure Spill : RA_SPILL ! (* sharing Spill.I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! (* sharing I.C = C *) type flowgraph diff -N -C 2 -r MLRISC/ra/ra-graph.sig MLRISC-mlton/ra/ra-graph.sig *** MLRISC/ra/ra-graph.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-graph.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 12,16 **** structure C : CELLS_BASIS ! structure BM : RA_BITMATRIX = RaBitmatrix (* * The following are the data structures used in the register allocator. --- 12,19 ---- structure C : CELLS_BASIS ! structure BM : RA_BITMATRIX (* = RaBitmatrix *) ! where type bitMatrix = RaBitmatrix.bitMatrix ! and type bucket = RaBitmatrix.bucket ! and type hashTable = RaBitmatrix.hashTable (* * The following are the data structures used in the register allocator. diff -N -C 2 -r MLRISC/ra/ra-spill-with-renaming.sml MLRISC-mlton/ra/ra-spill-with-renaming.sml *** MLRISC/ra/ra-spill-with-renaming.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-spill-with-renaming.sml 2009-10-02 10:50:19.000000000 -0400 *************** *** 80,93 **** *) - local - - val debug = false - - in - functor RASpillWithRenaming (structure InsnProps : INSN_PROPERTIES ! structure Asm : INSTRUCTION_EMITTER ! where I = InsnProps.I (* Spilling a variable v creates tiny live-ranges at all its definitions --- 80,91 ---- *) functor RASpillWithRenaming (structure InsnProps : INSN_PROPERTIES ! structure Asm : INSTRUCTION_EMITTER (* where I = InsnProps.I *) ! where type I.addressing_mode = InsnProps.I.addressing_mode ! and type I.ea = InsnProps.I.ea ! and type I.instr = InsnProps.I.instr ! and type I.instruction = InsnProps.I.instruction ! and type I.operand = InsnProps.I.operand (* Spilling a variable v creates tiny live-ranges at all its definitions *************** *** 108,111 **** --- 106,110 ---- ) : RA_SPILL = struct + val debug = false structure I = InsnProps.I *************** *** 585,588 **** end end - - end (* local *) --- 584,585 ---- diff -N -C 2 -r MLRISC/ra/ra-spill.sig MLRISC-mlton/ra/ra-spill.sig *** MLRISC/ra/ra-spill.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-spill.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 8,16 **** structure I : INSTRUCTIONS ! structure G : RA_GRAPH = RAGraph structure C : CELLS ! sharing I.C = C ! structure CB : CELLS_BASIS = CellsBasis type copyInstr = (CB.cell list * CB.cell list) * I.instruction -> I.instruction list --- 8,44 ---- structure I : INSTRUCTIONS ! structure G : RA_GRAPH (* = RAGraph *) ! where type C.CellSet.cellset = RAGraph.C.CellSet.cellset ! and type 'a C.ColorTable.hash_table = 'a RAGraph.C.ColorTable.hash_table ! and type 'a C.HashTable.hash_table = 'a RAGraph.C.HashTable.hash_table ! and type C.SortedCells.sorted_cells = RAGraph.C.SortedCells.sorted_cells ! and type C.cell = RAGraph.C.cell ! and type C.cellColor = RAGraph.C.cellColor ! and type C.cellkind = RAGraph.C.cellkind ! and type C.cellkindDesc = RAGraph.C.cellkindDesc ! and type C.cellkindInfo = RAGraph.C.cellkindInfo ! and type 'a PPtHashTable.hash_table = 'a RAGraph.PPtHashTable.hash_table ! and type 'a SpillLocHashTable.hash_table = 'a RAGraph.SpillLocHashTable.hash_table ! and type interferenceGraph = RAGraph.interferenceGraph ! and type move = RAGraph.move ! and type moveKind = RAGraph.moveKind ! and type moveStatus = RAGraph.moveStatus ! and type node = RAGraph.node ! and type nodeStatus = RAGraph.nodeStatus ! and type spillLoc = RAGraph.spillLoc ! and type trailInfo = RAGraph.trailInfo structure C : CELLS ! (* sharing I.C = C *) ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo type copyInstr = (CB.cell list * CB.cell list) * I.instruction -> I.instruction list diff -N -C 2 -r MLRISC/ra/ra-spill.sml MLRISC-mlton/ra/ra-spill.sml *** MLRISC/ra/ra-spill.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-spill.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 49,64 **** *) - local - - val debug = false - - in - functor RASpill (structure InsnProps : INSN_PROPERTIES ! structure Asm : INSTRUCTION_EMITTER ! where I = InsnProps.I ) : RA_SPILL = struct structure I = InsnProps.I --- 49,63 ---- *) functor RASpill (structure InsnProps : INSN_PROPERTIES ! structure Asm : INSTRUCTION_EMITTER (* where I = InsnProps.I *) ! where type I.addressing_mode = InsnProps.I.addressing_mode ! and type I.ea = InsnProps.I.ea ! and type I.instr = InsnProps.I.instr ! and type I.instruction = InsnProps.I.instruction ! and type I.operand = InsnProps.I.operand ) : RA_SPILL = struct + val debug = false structure I = InsnProps.I *************** *** 452,455 **** end end - - end (* local *) --- 451,452 ---- diff -N -C 2 -r MLRISC/ra/ra-spillheur.sig MLRISC-mlton/ra/ra-spillheur.sig *** MLRISC/ra/ra-spillheur.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra-spillheur.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 4,8 **** signature RA_SPILL_HEURISTICS = sig ! structure G : RA_GRAPH = RAGraph exception NoCandidate --- 4,27 ---- signature RA_SPILL_HEURISTICS = sig ! structure G : RA_GRAPH (* = RAGraph *) ! where type C.CellSet.cellset = RAGraph.C.CellSet.cellset ! and type 'a C.ColorTable.hash_table = 'a RAGraph.C.ColorTable.hash_table ! and type 'a C.HashTable.hash_table = 'a RAGraph.C.HashTable.hash_table ! and type C.SortedCells.sorted_cells = RAGraph.C.SortedCells.sorted_cells ! and type C.cell = RAGraph.C.cell ! and type C.cellColor = RAGraph.C.cellColor ! and type C.cellkind = RAGraph.C.cellkind ! and type C.cellkindDesc = RAGraph.C.cellkindDesc ! and type C.cellkindInfo = RAGraph.C.cellkindInfo ! and type 'a PPtHashTable.hash_table = 'a RAGraph.PPtHashTable.hash_table ! and type 'a SpillLocHashTable.hash_table = 'a RAGraph.SpillLocHashTable.hash_table ! and type interferenceGraph = RAGraph.interferenceGraph ! and type move = RAGraph.move ! and type moveKind = RAGraph.moveKind ! and type moveStatus = RAGraph.moveStatus ! and type node = RAGraph.node ! and type nodeStatus = RAGraph.nodeStatus ! and type spillLoc = RAGraph.spillLoc ! and type trailInfo = RAGraph.trailInfo exception NoCandidate diff -N -C 2 -r MLRISC/ra/ra.sig MLRISC-mlton/ra/ra.sig *** MLRISC/ra/ra.sig 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra.sig 2009-10-02 09:51:26.000000000 -0400 *************** *** 10,16 **** structure C : CELLS structure F : RA_FLOWGRAPH ! sharing F.I = I ! sharing I.C = C ! structure CB : CELLS_BASIS = CellsBasis type getreg = { pref : CB.cell_id list, --- 10,30 ---- structure C : CELLS structure F : RA_FLOWGRAPH ! (* sharing F.I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! (* sharing I.C = C *) ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo type getreg = { pref : CB.cell_id list, diff -N -C 2 -r MLRISC/ra/ra.sml MLRISC-mlton/ra/ra.sml *** MLRISC/ra/ra.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/ra.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 38,44 **** *) ! functor RegisterAllocator ! (SpillHeuristics : RA_SPILL_HEURISTICS) ! (Flowgraph : RA_FLOWGRAPH where C = CellsBasis) : RA = struct --- 38,45 ---- *) ! functor RegisterAllocator ( ! structure SpillHeuristics : RA_SPILL_HEURISTICS ! structure Flowgraph : RA_FLOWGRAPH (* where C = CellsBasis *) ! ) : RA = struct diff -N -C 2 -r MLRISC/ra/region-based-ra.sml MLRISC-mlton/ra/region-based-ra.sml *** MLRISC/ra/region-based-ra.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/region-based-ra.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 5,12 **** *) functor RegionBasedRA ! (RA : RA) ! (FlowgraphPartitioner : RA_FLOWGRAPH_PARTITIONER where type flowgraph = RA.F.flowgraph ! where C = RA.C ) : RA = struct --- 5,12 ---- *) functor RegionBasedRA ! (structure RA : RA ! structure FlowgraphPartitioner : RA_FLOWGRAPH_PARTITIONER where type flowgraph = RA.F.flowgraph ! (* where C = RA.C *) ) : RA = struct diff -N -C 2 -r MLRISC/ra/risc-ra.sml MLRISC-mlton/ra/risc-ra.sml *** MLRISC/ra/risc-ra.sml 2010-02-03 11:40:42.000000000 -0500 --- MLRISC-mlton/ra/risc-ra.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 5,20 **** *) functor RISC_RA ! (structure I : INSTRUCTIONS ! structure Asm : INSTRUCTION_EMITTER ! where I = I ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = Asm.S.P ! structure InsnProps : INSN_PROPERTIES ! where I = I ! structure Rewrite : REWRITE_INSTRUCTIONS ! where I = I ! structure SpillInstr : ARCH_SPILL_INSTR ! where I = I (* Spilling heuristics determines which node should be spilled. --- 5,60 ---- *) functor RISC_RA ! (structure I : INSTRUCTIONS ! structure Asm : INSTRUCTION_EMITTER (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and P = Asm.S.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = Asm.S.P.Client.pseudo_op ! and type P.T.Basis.cond = Asm.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = Asm.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = Asm.S.P.T.Basis.ext ! and type P.T.Basis.fcond = Asm.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = Asm.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = Asm.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) Asm.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) Asm.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) Asm.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) Asm.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = Asm.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = Asm.S.P.T.Region.region ! and type P.T.ccexp = Asm.S.P.T.ccexp ! and type P.T.fexp = Asm.S.P.T.fexp ! (* and type P.T.labexp = Asm.S.P.T.labexp *) ! and type P.T.mlrisc = Asm.S.P.T.mlrisc ! and type P.T.oper = Asm.S.P.T.oper ! and type P.T.rep = Asm.S.P.T.rep ! and type P.T.rexp = Asm.S.P.T.rexp ! and type P.T.stm = Asm.S.P.T.stm ! structure InsnProps : INSN_PROPERTIES (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure Rewrite : REWRITE_INSTRUCTIONS (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure SpillInstr : ARCH_SPILL_INSTR (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand (* Spilling heuristics determines which node should be spilled. *************** *** 27,31 **** * or write your own if you are feeling adventurous. *) ! structure Spill : RA_SPILL where I = I val architecture : string --- 67,76 ---- * or write your own if you are feeling adventurous. *) ! structure Spill : RA_SPILL (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand val architecture : string *************** *** 86,92 **** structure Ra = RegisterAllocator ! (SpillHeur) (* (ChowHennessySpillHeur) *) ! (ClusterRA (structure Flowgraph = CFG structure Asm = Asm --- 131,137 ---- structure Ra = RegisterAllocator ! (structure SpillHeuristics = SpillHeur (* (ChowHennessySpillHeur) *) ! structure Flowgraph = ClusterRA (structure Flowgraph = CFG structure Asm = Asm diff -N -C 2 -r MLRISC/sparc/backpatch/sparcDelaySlotProps.sml MLRISC-mlton/sparc/backpatch/sparcDelaySlotProps.sml *** MLRISC/sparc/backpatch/sparcDelaySlotProps.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/backpatch/sparcDelaySlotProps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,5 **** functor SparcDelaySlots (structure I : SPARCINSTR ! structure P : INSN_PROPERTIES where I = I (* sharing/defn conflict: sharing P.I = I*) ) : DELAY_SLOT_PROPERTIES = --- 1,10 ---- functor SparcDelaySlots (structure I : SPARCINSTR ! structure P : INSN_PROPERTIES (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand (* sharing/defn conflict: sharing P.I = I*) ) : DELAY_SLOT_PROPERTIES = *************** *** 114,121 **** end ! fun delaySlotCandidate{jmp,delaySlot= ! ( I.INSTR(I.CALL _) | I.INSTR(I.Bicc _) | I.INSTR(I.FBfcc _) ! | I.INSTR(I.Ticc _) | I.INSTR(I.BR _) | I.INSTR(I.JMP _) | I.INSTR(I.JMPL _) ! | I.INSTR(I.RET _) | I.INSTR(I.BP _) | I.INSTR(I.FCMP _))} = false | delaySlotCandidate{jmp=I.ANNOTATION{i,...},delaySlot} = delaySlotCandidate{jmp=i,delaySlot=delaySlot} --- 119,132 ---- end ! fun delaySlotCandidate{jmp,delaySlot=I.INSTR(I.CALL _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.Bicc _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.FBfcc _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.Ticc _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BR _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.JMP _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.JMPL _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.RET _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.BP _)} = false ! | delaySlotCandidate{jmp,delaySlot=I.INSTR(I.FCMP _)} = false | delaySlotCandidate{jmp=I.ANNOTATION{i,...},delaySlot} = delaySlotCandidate{jmp=i,delaySlot=delaySlot} diff -N -C 2 -r MLRISC/sparc/backpatch/sparcJumps.sml MLRISC-mlton/sparc/backpatch/sparcJumps.sml *** MLRISC/sparc/backpatch/sparcJumps.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/backpatch/sparcJumps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,11 **** functor SparcJumps (structure Instr:SPARCINSTR ! structure Shuffle:SPARCSHUFFLE where I = Instr ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T ) : SDI_JUMPS = struct --- 6,70 ---- functor SparcJumps (structure Instr:SPARCINSTR ! structure Shuffle:SPARCSHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! and type I.arith = Instr.arith ! and type I.branch = Instr.branch ! and type I.cc = Instr.cc ! and type I.ea = Instr.ea ! and type I.farith1 = Instr.farith1 ! and type I.farith2 = Instr.farith2 ! and type I.fbranch = Instr.fbranch ! and type I.fcmp = Instr.fcmp ! and type I.fload = Instr.fload ! and type I.fsize = Instr.fsize ! and type I.fstore = Instr.fstore ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.load = Instr.load ! and type I.operand = Instr.operand ! and type I.prediction = Instr.prediction ! and type I.rcond = Instr.rcond ! and type I.shift = Instr.shift ! and type I.store = Instr.store ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : SDI_JUMPS = struct *************** *** 52,56 **** | I.RESTORE{i,...} => oper i (* The following is only true of Version 8 *) ! | I.FPop1{a=(I.FMOVd | I.FNEGd | I.FABSd), ...} => true | _ => false end --- 111,117 ---- | I.RESTORE{i,...} => oper i (* The following is only true of Version 8 *) ! | I.FPop1{a=I.FMOVd, ...} => true ! | I.FPop1{a=I.FNEGd, ...} => true ! | I.FPop1{a=I.FABSd, ...} => true | _ => false end *************** *** 71,79 **** | (I.RET{nop=true,...}) => 8 | (I.FCMP{nop=true,...}) => 8 ! | (I.FPop1{a=(I.FMOVd | I.FNEGd | I.FABSd),...}) => 8 | _ => 4 (*esac*)) ! fun maxSize (I.INSTR(I.FPop1{a=(I.FMOVd | I.FNEGd | I.FABSd),...})) = 8 | maxSize (I.ANNOTATION{i,...}) = maxSize i | maxSize _ = 4 --- 132,144 ---- | (I.RET{nop=true,...}) => 8 | (I.FCMP{nop=true,...}) => 8 ! | (I.FPop1{a=I.FMOVd,...}) => 8 ! | (I.FPop1{a=I.FNEGd,...}) => 8 ! | (I.FPop1{a=I.FABSd,...}) => 8 | _ => 4 (*esac*)) ! fun maxSize (I.INSTR(I.FPop1{a=I.FMOVd,...})) = 8 ! | maxSize (I.INSTR(I.FPop1{a=I.FNEGd,...})) = 8 ! | maxSize (I.INSTR(I.FPop1{a=I.FABSd,...})) = 8 | maxSize (I.ANNOTATION{i,...}) = maxSize i | maxSize _ = 4 *************** *** 86,90 **** fun instrLength([],n) = n ! | instrLength(I.INSTR(I.FPop1{a=(I.FMOVd | I.FNEGd | I.FABSd),...})::is,n) = instrLength(is,n+8) | instrLength(_::is,n) = instrLength(is,n+4) --- 151,159 ---- fun instrLength([],n) = n ! | instrLength(I.INSTR(I.FPop1{a=I.FMOVd,...})::is,n) = ! instrLength(is,n+8) ! | instrLength(I.INSTR(I.FPop1{a=I.FNEGd,...})::is,n) = ! instrLength(is,n+8) ! | instrLength(I.INSTR(I.FPop1{a=I.FABSd,...})::is,n) = instrLength(is,n+8) | instrLength(_::is,n) = instrLength(is,n+4) *************** *** 136,140 **** | I.CALL{label,...} => call label | I.WRY{i,...} => oper(i,12) ! | I.FPop1{a=(I.FMOVd | I.FNEGd | I.FABSd),...} => 8 | _ => error "sdiSize" end --- 205,211 ---- | I.CALL{label,...} => call label | I.WRY{i,...} => oper(i,12) ! | I.FPop1{a=I.FMOVd,...} => 8 ! | I.FPop1{a=I.FNEGd,...} => 8 ! | I.FPop1{a=I.FABSd,...} => 8 | _ => error "sdiSize" end *************** *** 208,215 **** | (I.BR _,8) => [instr] | (I.BP _,8) => [instr] ! | (I.JMPL{r,i,d,defs,uses,cutsTo,nop,mem},(12 | 16)) => expandImm(i,I.JMPL{r=r,i=I.REG C.asmTmpR,d=d,defs=defs,uses=uses, cutsTo=cutsTo,nop=nop,mem=mem}) ! | (I.JMP{r,i,labs,nop},(12 | 16)) => expandImm(i,I.JMP{r=r,i=I.REG C.asmTmpR,labs=labs,nop=nop}) | (I.Ticc{t,cc,r,i},12) => --- 279,291 ---- | (I.BR _,8) => [instr] | (I.BP _,8) => [instr] ! | (I.JMPL{r,i,d,defs,uses,cutsTo,nop,mem},12) => expandImm(i,I.JMPL{r=r,i=I.REG C.asmTmpR,d=d,defs=defs,uses=uses, cutsTo=cutsTo,nop=nop,mem=mem}) ! | (I.JMPL{r,i,d,defs,uses,cutsTo,nop,mem},16) => ! expandImm(i,I.JMPL{r=r,i=I.REG C.asmTmpR,d=d,defs=defs,uses=uses, ! cutsTo=cutsTo,nop=nop,mem=mem}) ! | (I.JMP{r,i,labs,nop},12) => ! expandImm(i,I.JMP{r=r,i=I.REG C.asmTmpR,labs=labs,nop=nop}) ! | (I.JMP{r,i,labs,nop},16) => expandImm(i,I.JMP{r=r,i=I.REG C.asmTmpR,labs=labs,nop=nop}) | (I.Ticc{t,cc,r,i},12) => diff -N -C 2 -r MLRISC/sparc/c-calls/sparc-c-calls.sml MLRISC-mlton/sparc/c-calls/sparc-c-calls.sml *** MLRISC/sparc/c-calls/sparc-c-calls.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/c-calls/sparc-c-calls.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 106,118 **** (* calculate size and alignment for a C type *) ! fun szal (Ty.C_void | Ty.C_float | Ty.C_PTR | ! Ty.C_signed (Ty.I_int | Ty.I_long) | ! Ty.C_unsigned (Ty.I_int | Ty.I_long)) = (4, 4) ! | szal (Ty.C_double | ! Ty.C_signed Ty.I_long_long | ! Ty.C_unsigned Ty.I_long_long) = (8, 8) | szal (Ty.C_long_double) = (16, 8) ! | szal (Ty.C_signed Ty.I_char | Ty.C_unsigned Ty.I_char) = (1, 1) ! | szal (Ty.C_signed Ty.I_short | Ty.C_unsigned Ty.I_short) = (2, 2) | szal (Ty.C_ARRAY (t, n)) = let val (s, a) = szal t in (n * s, a) end | szal (Ty.C_STRUCT l) = --- 106,124 ---- (* calculate size and alignment for a C type *) ! fun szal Ty.C_void = (4, 4) ! | szal Ty.C_float = (4, 4) ! | szal Ty.C_PTR = (4, 4) ! | szal (Ty.C_signed Ty.I_int) = (4, 4) ! | szal (Ty.C_signed Ty.I_long) = (4, 4) ! | szal (Ty.C_unsigned Ty.I_int) = (4, 4) ! | szal (Ty.C_unsigned Ty.I_long) = (4, 4) ! | szal Ty.C_double = (8, 8) ! | szal (Ty.C_signed Ty.I_long_long) = (8, 8) ! | szal (Ty.C_unsigned Ty.I_long_long) = (8, 8) | szal (Ty.C_long_double) = (16, 8) ! | szal (Ty.C_signed Ty.I_char) = (1, 1) ! | szal (Ty.C_unsigned Ty.I_char) = (1, 1) ! | szal (Ty.C_signed Ty.I_short) = (2, 2) ! | szal (Ty.C_unsigned Ty.I_short) = (2, 2) | szal (Ty.C_ARRAY (t, n)) = let val (s, a) = szal t in (n * s, a) end | szal (Ty.C_STRUCT l) = *************** *** 184,194 **** val { conv, retTy, paramTys } = proto val _ = case conv of ! ("" | "ccall") => () | _ => error (concat ["unknown calling convention \"", String.toString conv, "\""]) val res_szal = case retTy of ! (Ty.C_long_double | Ty.C_STRUCT _ | Ty.C_UNION _) => ! SOME (szal retTy) | _ => NONE --- 190,202 ---- val { conv, retTy, paramTys } = proto val _ = case conv of ! "" => () ! | "ccall" => () | _ => error (concat ["unknown calling convention \"", String.toString conv, "\""]) val res_szal = case retTy of ! Ty.C_long_double => SOME (szal retTy) ! | Ty.C_STRUCT _ => SOME (szal retTy) ! | Ty.C_UNION _ => SOME (szal retTy) | _ => NONE *************** *** 197,202 **** | loop (t :: tl, n) = loop (tl, (case t of ! (Ty.C_double | Ty.C_signed Ty.I_long_long | ! Ty.C_unsigned Ty.I_long_long) => 2 | _ => 1) + n) in --- 205,211 ---- | loop (t :: tl, n) = loop (tl, (case t of ! Ty.C_double => 2 ! | (Ty.C_signed Ty.I_long_long) => 2 ! | (Ty.C_unsigned Ty.I_long_long) => 2 | _ => 1) + n) in *************** *** 226,240 **** in case t of ! (Ty.C_void | Ty.C_PTR | ! Ty.C_signed (Ty.I_int | Ty.I_long) | ! Ty.C_unsigned (Ty.I_int | Ty.I_long)) => ldst 32 ! | (Ty.C_signed Ty.I_char | Ty.C_unsigned Ty.I_char) => ldst 8 ! | (Ty.C_signed Ty.I_short | Ty.C_unsigned Ty.I_short) => ! ldst 16 ! | (Ty.C_signed Ty.I_long_long | ! Ty.C_unsigned Ty.I_long_long) => ldst 64 | (Ty.C_ARRAY _) => error "ARRAY within gather/scatter struct" ! | (Ty.C_STRUCT _ | Ty.C_UNION _) => (* Here we have to do the equivalent of a "memcpy". *) let val from = a (* argument is address of struct *) --- 235,253 ---- in case t of ! Ty.C_void => ldst 32 ! | Ty.C_PTR => ldst 32 ! | (Ty.C_signed Ty.I_int) => ldst 32 ! | (Ty.C_signed Ty.I_long) => ldst 32 ! | (Ty.C_unsigned Ty.I_int) => ldst 32 ! | (Ty.C_unsigned Ty.I_long) => ldst 32 ! | (Ty.C_signed Ty.I_char) => ldst 8 ! | (Ty.C_unsigned Ty.I_char) => ldst 8 ! | (Ty.C_signed Ty.I_short) => ldst 16 ! | (Ty.C_unsigned Ty.I_short) => ldst 16 ! | (Ty.C_signed Ty.I_long_long) => ldst 64 ! | (Ty.C_unsigned Ty.I_long_long) => ldst 64 | (Ty.C_ARRAY _) => error "ARRAY within gather/scatter struct" ! | (Ty.C_STRUCT _) => (* Here we have to do the equivalent of a "memcpy". *) let val from = a (* argument is address of struct *) *************** *** 261,266 **** | _ => (* 4 or more *) cp (32, 4) end ! | (Ty.C_float | Ty.C_double | Ty.C_long_double) => ! error "floating point type does not match ARG" end (* --- 274,305 ---- | _ => (* 4 or more *) cp (32, 4) end ! | (Ty.C_UNION _) => ! (* Here we have to do the equivalent of a "memcpy". *) ! let val from = a (* argument is address of struct *) ! fun cp (ty, incr) = let ! fun load_from from_off = ! T.LOAD (32, addli (from, from_off), mem) ! (* from_off is relative to from, ! * to_off is relative to %sp *) ! fun loop (i, from_off, to_off, cpc) = ! if i <= 0 then cpc ! else loop (i - incr, ! from_off + incr, to_off + incr, ! T.STORE (ty, addli (spreg, to_off), ! load_from from_off, ! stack) ! :: cpc) ! in ! loop (sz, 0, to_off, cpc) ! end ! in ! case al of ! 1 => cp (8, 1) ! | 2 => cp (16, 2) ! | _ => (* 4 or more *) cp (32, 4) ! end ! | Ty.C_float => error "floating point type does not match ARG" ! | Ty.C_double => error "floating point type does not match ARG" ! | Ty.C_long_double => error "floating point type does not match ARG" end (* *************** *** 335,342 **** in case (t, a) of ! ((Ty.C_void | Ty.C_PTR | Ty.C_ARRAY _ | ! Ty.C_unsigned (Ty.I_int | Ty.I_long) | ! Ty.C_signed (Ty.I_int | Ty.I_long)), ! ARG a) => wordarg (a, cpc, ss) | (Ty.C_signed Ty.I_char, ARG a) => wordarg (T.SX (32, 8, a), cpc, ss) --- 374,384 ---- in case (t, a) of ! (Ty.C_void, ARG a) => wordarg (a, cpc, ss) ! | (Ty.C_PTR, ARG a) => wordarg (a, cpc, ss) ! | (Ty.C_ARRAY _, ARG a) => wordarg (a, cpc, ss) ! | (Ty.C_unsigned Ty.I_int, ARG a) => wordarg (a, cpc, ss) ! | (Ty.C_unsigned Ty.I_long, ARG a) => wordarg (a, cpc, ss) ! | (Ty.C_signed Ty.I_int, ARG a) => wordarg (a, cpc, ss) ! | (Ty.C_signed Ty.I_long, ARG a) => wordarg (a, cpc, ss) | (Ty.C_signed Ty.I_char, ARG a) => wordarg (T.SX (32, 8, a), cpc, ss) *************** *** 347,352 **** | (Ty.C_unsigned Ty.I_short, ARG a) => wordarg (T.ZX (32, 16, a), cpc, ss) ! | ((Ty.C_signed Ty.I_long_long | ! Ty.C_unsigned Ty.I_long_long), ARG a) => (case a of T.LOAD (_, addr, region) => --- 389,399 ---- | (Ty.C_unsigned Ty.I_short, ARG a) => wordarg (T.ZX (32, 16, a), cpc, ss) ! | (Ty.C_signed Ty.I_long_long, ARG a) => ! (case a of ! T.LOAD (_, addr, region) => ! dwordmemarg (addr, region, []) ! | _ => dwordarg (fn addr => ! T.STORE (64, addr, a, stack))) ! | (Ty.C_unsigned Ty.I_long_long, ARG a) => (case a of T.LOAD (_, addr, region) => *************** *** 391,395 **** ss' + 16) end ! | (t as (Ty.C_STRUCT _ | Ty.C_UNION _), a) => let (* copy entire struct into scratch space * (aligned according to struct's alignment --- 438,455 ---- ss' + 16) end ! | (t as (Ty.C_STRUCT _), a) => let ! (* copy entire struct into scratch space ! * (aligned according to struct's alignment ! * requirements). The address of the scratch ! * copy is then passed as a regular 32-bit ! * argument. *) ! val (sz, al) = szal t ! val ss' = roundup (ss, al) ! val ssaddr = addli (spreg, ss') ! val cpc' = struct_copy (sz, al, a, t, ss', cpc) ! in ! wordarg (ssaddr, cpc', ss' + sz) ! end ! | (t as (Ty.C_UNION _), a) => let (* copy entire struct into scratch space * (aligned according to struct's alignment *************** *** 438,452 **** | Ty.C_double => [T.FPR (T.FREG (64, FP 0))] (* %f0/%f1 *) | Ty.C_long_double => [] ! | (Ty.C_STRUCT _ | Ty.C_UNION _) => [] | Ty.C_ARRAY _ => error "array return type" ! | (Ty.C_PTR | Ty.C_void | ! Ty.C_signed (Ty.I_int | Ty.I_long) | ! Ty.C_unsigned (Ty.I_int | Ty.I_long)) => [T.GPR (T.REG (32, oreg 0))] ! | (Ty.C_signed Ty.I_char | Ty.C_unsigned Ty.I_char) => [T.GPR (T.REG (8, oreg 0))] ! | (Ty.C_signed Ty.I_short | Ty.C_unsigned Ty.I_short) => [T.GPR (T.REG (16, oreg 0))] ! | (Ty.C_signed Ty.I_long_long | Ty.C_unsigned Ty.I_long_long) => [T.GPR (T.REG (64, oreg 0))] --- 498,527 ---- | Ty.C_double => [T.FPR (T.FREG (64, FP 0))] (* %f0/%f1 *) | Ty.C_long_double => [] ! | (Ty.C_STRUCT _) => [] ! | (Ty.C_UNION _) => [] | Ty.C_ARRAY _ => error "array return type" ! | Ty.C_PTR => ! [T.GPR (T.REG (32, oreg 0))] ! | Ty.C_void => ! [T.GPR (T.REG (32, oreg 0))] ! | Ty.C_signed Ty.I_int => [T.GPR (T.REG (32, oreg 0))] ! | Ty.C_signed Ty.I_long => ! [T.GPR (T.REG (32, oreg 0))] ! | Ty.C_unsigned Ty.I_int => ! [T.GPR (T.REG (32, oreg 0))] ! | Ty.C_unsigned Ty.I_long => ! [T.GPR (T.REG (32, oreg 0))] ! | Ty.C_signed Ty.I_char => [T.GPR (T.REG (8, oreg 0))] ! | Ty.C_unsigned Ty.I_char => ! [T.GPR (T.REG (8, oreg 0))] ! | Ty.C_signed Ty.I_short => ! [T.GPR (T.REG (16, oreg 0))] ! | Ty.C_unsigned Ty.I_short => [T.GPR (T.REG (16, oreg 0))] ! | Ty.C_signed Ty.I_long_long => ! [T.GPR (T.REG (64, oreg 0))] ! | Ty.C_unsigned Ty.I_long_long => [T.GPR (T.REG (64, oreg 0))] diff -N -C 2 -r MLRISC/sparc/emit/sparcAsm.sml MLRISC-mlton/sparc/emit/sparcAsm.sml *** MLRISC/sparc/emit/sparcAsm.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/emit/sparcAsm.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,16 **** functor SparcAsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : SPARCINSTR ! where T = S.P.T ! structure Shuffle : SPARCSHUFFLE ! where I = Instr ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T (*#line 466.21 "sparc/sparc.mdl"*) --- 7,92 ---- functor SparcAsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : SPARCINSTR (* where T = S.P.T *) ! where type T.Basis.cond = S.P.T.Basis.cond ! and type T.Basis.div_rounding_mode = S.P.T.Basis.div_rounding_mode ! and type T.Basis.ext = S.P.T.Basis.ext ! and type T.Basis.fcond = S.P.T.Basis.fcond ! and type T.Basis.rounding_mode = S.P.T.Basis.rounding_mode ! and type T.Constant.const = S.P.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) S.P.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) S.P.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) S.P.T.Extension.sx ! and type T.I.div_rounding_mode = S.P.T.I.div_rounding_mode ! and type T.Region.region = S.P.T.Region.region ! and type T.ccexp = S.P.T.ccexp ! and type T.fexp = S.P.T.fexp ! (* and type T.labexp = S.P.T.labexp *) ! and type T.mlrisc = S.P.T.mlrisc ! and type T.oper = S.P.T.oper ! and type T.rep = S.P.T.rep ! and type T.rexp = S.P.T.rexp ! and type T.stm = S.P.T.stm ! structure Shuffle : SPARCSHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! and type I.arith = Instr.arith ! and type I.branch = Instr.branch ! and type I.cc = Instr.cc ! and type I.ea = Instr.ea ! and type I.farith1 = Instr.farith1 ! and type I.farith2 = Instr.farith2 ! and type I.fbranch = Instr.fbranch ! and type I.fcmp = Instr.fcmp ! and type I.fload = Instr.fload ! and type I.fsize = Instr.fsize ! and type I.fstore = Instr.fstore ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.load = Instr.load ! and type I.operand = Instr.operand ! and type I.prediction = Instr.prediction ! and type I.rcond = Instr.rcond ! and type I.shift = Instr.shift ! and type I.store = Instr.store ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm (*#line 466.21 "sparc/sparc.mdl"*) diff -N -C 2 -r MLRISC/sparc/emit/sparcMC.sml MLRISC-mlton/sparc/emit/sparcMC.sml *** MLRISC/sparc/emit/sparcMC.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/emit/sparcMC.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,11 **** functor SparcMCEmitter(structure Instr : SPARCINSTR ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T structure Stream : INSTRUCTION_STREAM structure CodeString : CODE_STRING --- 7,31 ---- functor SparcMCEmitter(structure Instr : SPARCINSTR ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm structure Stream : INSTRUCTION_STREAM structure CodeString : CODE_STRING *************** *** 48,51 **** --- 68,72 ---- fun eByteW w = let val i = !loc + val w = W.toLargeWord w in loc := i + 1; CodeString.update(i,Word8.fromLargeWord w) end diff -N -C 2 -r MLRISC/sparc/flowgraph/sparcGasPseudoOps.sml MLRISC-mlton/sparc/flowgraph/sparcGasPseudoOps.sml *** MLRISC/sparc/flowgraph/sparcGasPseudoOps.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/flowgraph/sparcGasPseudoOps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,5 **** functor SparcGasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ) : PSEUDO_OPS_BASIS = --- 1,25 ---- functor SparcGasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ) : PSEUDO_OPS_BASIS = diff -N -C 2 -r MLRISC/sparc/instructions/sparcInstr.sml MLRISC-mlton/sparc/instructions/sparcInstr.sml *** MLRISC/sparc/instructions/sparcInstr.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/instructions/sparcInstr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 9,13 **** sig structure C : SPARCCELLS ! structure CB : CELLS_BASIS = CellsBasis structure T : MLTREE structure Constant: CONSTANT --- 9,22 ---- sig structure C : SPARCCELLS ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo structure T : MLTREE structure Constant: CONSTANT *************** *** 235,239 **** dst: CellsBasis.cell list, src: CellsBasis.cell list, ! tmp: ea option (* NONE if |dst| = {src| = 1 *)} | ANNOTATION of {i:instruction, a:Annotations.annotation} | INSTR of instr --- 244,248 ---- dst: CellsBasis.cell list, src: CellsBasis.cell list, ! tmp: ea option (* NONE if |dst| = |src| = 1 *)} | ANNOTATION of {i:instruction, a:Annotations.annotation} | INSTR of instr diff -N -C 2 -r MLRISC/sparc/instructions/sparcProps.sml MLRISC-mlton/sparc/instructions/sparcProps.sml *** MLRISC/sparc/instructions/sparcProps.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/instructions/sparcProps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,11 **** functor SparcProps (structure SparcInstr : SPARCINSTR ! structure MLTreeEval : MLTREE_EVAL where T = SparcInstr.T ! structure MLTreeHash : MLTREE_HASH where T = SparcInstr.T ) : INSN_PROPERTIES = struct --- 6,51 ---- functor SparcProps (structure SparcInstr : SPARCINSTR ! structure MLTreeEval : MLTREE_EVAL (* where T = SparcInstr.T *) ! where type T.Basis.cond = SparcInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = SparcInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = SparcInstr.T.Basis.ext ! and type T.Basis.fcond = SparcInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = SparcInstr.T.Basis.rounding_mode ! and type T.Constant.const = SparcInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) SparcInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) SparcInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) SparcInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) SparcInstr.T.Extension.sx ! and type T.I.div_rounding_mode = SparcInstr.T.I.div_rounding_mode ! and type T.Region.region = SparcInstr.T.Region.region ! and type T.ccexp = SparcInstr.T.ccexp ! and type T.fexp = SparcInstr.T.fexp ! (* and type T.labexp = SparcInstr.T.labexp *) ! and type T.mlrisc = SparcInstr.T.mlrisc ! and type T.oper = SparcInstr.T.oper ! and type T.rep = SparcInstr.T.rep ! and type T.rexp = SparcInstr.T.rexp ! and type T.stm = SparcInstr.T.stm ! structure MLTreeHash : MLTREE_HASH (* where T = SparcInstr.T *) ! where type T.Basis.cond = SparcInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = SparcInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = SparcInstr.T.Basis.ext ! and type T.Basis.fcond = SparcInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = SparcInstr.T.Basis.rounding_mode ! and type T.Constant.const = SparcInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) SparcInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) SparcInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) SparcInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) SparcInstr.T.Extension.sx ! and type T.I.div_rounding_mode = SparcInstr.T.I.div_rounding_mode ! and type T.Region.region = SparcInstr.T.Region.region ! and type T.ccexp = SparcInstr.T.ccexp ! and type T.fexp = SparcInstr.T.fexp ! (* and type T.labexp = SparcInstr.T.labexp *) ! and type T.mlrisc = SparcInstr.T.mlrisc ! and type T.oper = SparcInstr.T.oper ! and type T.rep = SparcInstr.T.rep ! and type T.rexp = SparcInstr.T.rexp ! and type T.stm = SparcInstr.T.stm ) : INSN_PROPERTIES = struct diff -N -C 2 -r MLRISC/sparc/instructions/sparccomp-instr-ext.sml MLRISC-mlton/sparc/instructions/sparccomp-instr-ext.sml *** MLRISC/sparc/instructions/sparccomp-instr-ext.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/instructions/sparccomp-instr-ext.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 8,17 **** signature SPARCCOMP_INSTR_EXT = sig structure T : MLTREE ! structure I : SPARCINSTR ! where T = T ! structure TS : MLTREE_STREAM ! where T = I.T ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I --- 8,59 ---- signature SPARCCOMP_INSTR_EXT = sig structure T : MLTREE ! structure I : SPARCINSTR (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ! structure TS : MLTREE_STREAM (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand *************** *** 28,36 **** functor SparcCompInstrExt (structure I : SPARCINSTR ! structure TS : MLTREE_STREAM ! where T = I.T ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = TS.S.P ) : SPARCCOMP_INSTR_EXT = struct --- 70,121 ---- functor SparcCompInstrExt (structure I : SPARCINSTR ! structure TS : MLTREE_STREAM (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and P = TS.S.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm ) : SPARCCOMP_INSTR_EXT = struct diff -N -C 2 -r MLRISC/sparc/mltree/sparc.sml MLRISC-mlton/sparc/mltree/sparc.sml *** MLRISC/sparc/mltree/sparc.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/sparc/mltree/sparc.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 15,24 **** functor Sparc (structure SparcInstr : SPARCINSTR ! structure PseudoInstrs : SPARC_PSEUDO_INSTR ! where I = SparcInstr ! structure ExtensionComp : MLTREE_EXTENSION_COMP ! where I = SparcInstr ! and T = SparcInstr.T ! (* --- 15,84 ---- functor Sparc (structure SparcInstr : SPARCINSTR ! structure PseudoInstrs : SPARC_PSEUDO_INSTR (* where I = SparcInstr *) ! where type I.Constant.const = SparcInstr.Constant.const ! and type I.Region.region = SparcInstr.Region.region ! and type I.T.Basis.cond = SparcInstr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = SparcInstr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = SparcInstr.T.Basis.ext ! and type I.T.Basis.fcond = SparcInstr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = SparcInstr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) SparcInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) SparcInstr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) SparcInstr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) SparcInstr.T.Extension.sx ! and type I.T.I.div_rounding_mode = SparcInstr.T.I.div_rounding_mode ! and type I.T.ccexp = SparcInstr.T.ccexp ! and type I.T.fexp = SparcInstr.T.fexp ! (* and type I.T.labexp = SparcInstr.T.labexp *) ! and type I.T.mlrisc = SparcInstr.T.mlrisc ! and type I.T.oper = SparcInstr.T.oper ! and type I.T.rep = SparcInstr.T.rep ! and type I.T.rexp = SparcInstr.T.rexp ! and type I.T.stm = SparcInstr.T.stm ! and type I.arith = SparcInstr.arith ! and type I.branch = SparcInstr.branch ! and type I.cc = SparcInstr.cc ! and type I.ea = SparcInstr.ea ! and type I.farith1 = SparcInstr.farith1 ! and type I.farith2 = SparcInstr.farith2 ! and type I.fbranch = SparcInstr.fbranch ! and type I.fcmp = SparcInstr.fcmp ! and type I.fload = SparcInstr.fload ! and type I.fsize = SparcInstr.fsize ! and type I.fstore = SparcInstr.fstore ! and type I.instr = SparcInstr.instr ! and type I.instruction = SparcInstr.instruction ! and type I.load = SparcInstr.load ! and type I.operand = SparcInstr.operand ! and type I.prediction = SparcInstr.prediction ! and type I.rcond = SparcInstr.rcond ! and type I.shift = SparcInstr.shift ! and type I.store = SparcInstr.store ! structure ExtensionComp : MLTREE_EXTENSION_COMP (* where I = SparcInstr and T = SparcInstr.T *) ! where type I.addressing_mode = SparcInstr.addressing_mode ! and type I.ea = SparcInstr.ea ! and type I.instr = SparcInstr.instr ! and type I.instruction = SparcInstr.instruction ! and type I.operand = SparcInstr.operand ! where type T.Basis.cond = SparcInstr.T.Basis.cond ! and type T.Basis.div_rounding_mode = SparcInstr.T.Basis.div_rounding_mode ! and type T.Basis.ext = SparcInstr.T.Basis.ext ! and type T.Basis.fcond = SparcInstr.T.Basis.fcond ! and type T.Basis.rounding_mode = SparcInstr.T.Basis.rounding_mode ! and type T.Constant.const = SparcInstr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) SparcInstr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) SparcInstr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) SparcInstr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) SparcInstr.T.Extension.sx ! and type T.I.div_rounding_mode = SparcInstr.T.I.div_rounding_mode ! and type T.Region.region = SparcInstr.T.Region.region ! and type T.ccexp = SparcInstr.T.ccexp ! and type T.fexp = SparcInstr.T.fexp ! (* and type T.labexp = SparcInstr.T.labexp *) ! and type T.mlrisc = SparcInstr.T.mlrisc ! and type T.oper = SparcInstr.T.oper ! and type T.rep = SparcInstr.T.rep ! and type T.rexp = SparcInstr.T.rexp ! and type T.stm = SparcInstr.T.stm (* *************** *** 28,32 **** * cheaper when their costs are lower. *) ! val muluCost : int ref (* cost of unsigned multiplication in cycles *) val divuCost : int ref (* cost of unsigned division in cycles *) val multCost : int ref (* cost of trapping/signed multiplication in cycles *) --- 88,92 ---- * cheaper when their costs are lower. *) ! val muluCost : int ref (* cost of unsigned multiplication in cycles *) val divuCost : int ref (* cost of unsigned division in cycles *) val multCost : int ref (* cost of trapping/signed multiplication in cycles *) *************** *** 77,81 **** ) ! functor Multiply32 = MLTreeMult (structure I = I structure T = T --- 137,142 ---- ) ! (* signed, trapping version of multiply and divide *) ! structure Mult32 = MLTreeMult (structure I = I structure T = T *************** *** 90,96 **** fun srli{r,i,d} = [I.shift{s=I.SRL,r=r,i=I.IMMED i,d=d}] fun srai{r,i,d} = [I.shift{s=I.SRA,r=r,i=I.IMMED i,d=d}] ! ) ! functor Multiply64 = MLTreeMult (structure I = I structure T = T --- 151,169 ---- fun srli{r,i,d} = [I.shift{s=I.SRL,r=r,i=I.IMMED i,d=d}] fun srai{r,i,d} = [I.shift{s=I.SRA,r=r,i=I.IMMED i,d=d}] ! ! val trapping = true ! val multCost = multCost ! fun addv{r1,r2,d} = ! I.arith{a=I.ADDCC,r=r1,i=I.REG r2,d=d}::PseudoInstrs.overflowtrap32 ! fun subv{r1,r2,d} = ! I.arith{a=I.SUBCC,r=r1,i=I.REG r2,d=d}::PseudoInstrs.overflowtrap32 ! val sh1addv = NONE ! val sh2addv = NONE ! val sh3addv = NONE ! ! val signed = true) ! (* unsigned, non-trapping version of multiply and divide *) ! structure Mulu32 = MLTreeMult (structure I = I structure T = T *************** *** 98,127 **** type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} type argi = {r:CB.cell,i:int,d:CB.cell} ! ! val intTy = 64 fun mov{r,d} = COPY{dst=[d],src=[r],tmp=NONE} fun add{r1,r2,d} = I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d} ! fun slli{r,i,d} = [I.shift{s=I.SLLX,r=r,i=I.IMMED i,d=d}] ! fun srli{r,i,d} = [I.shift{s=I.SRLX,r=r,i=I.IMMED i,d=d}] ! fun srai{r,i,d} = [I.shift{s=I.SRAX,r=r,i=I.IMMED i,d=d}] ! ) ! ! (* signed, trapping version of multiply and divide *) ! structure Mult32 = Multiply32 ! (val trapping = true ! val multCost = multCost ! fun addv{r1,r2,d} = ! I.arith{a=I.ADDCC,r=r1,i=I.REG r2,d=d}::PseudoInstrs.overflowtrap32 ! fun subv{r1,r2,d} = ! I.arith{a=I.SUBCC,r=r1,i=I.REG r2,d=d}::PseudoInstrs.overflowtrap32 val sh1addv = NONE val sh2addv = NONE val sh3addv = NONE ! ) ! (val signed = true) ! (* unsigned, non-trapping version of multiply and divide *) ! functor Mul32 = Multiply32 ! (val trapping = false val multCost = muluCost fun addv{r1,r2,d} = [I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d}] --- 171,208 ---- type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} type argi = {r:CB.cell,i:int,d:CB.cell} ! ! val intTy = 32 fun mov{r,d} = COPY{dst=[d],src=[r],tmp=NONE} fun add{r1,r2,d} = I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d} ! fun slli{r,i,d} = [I.shift{s=I.SLL,r=r,i=I.IMMED i,d=d}] ! fun srli{r,i,d} = [I.shift{s=I.SRL,r=r,i=I.IMMED i,d=d}] ! fun srai{r,i,d} = [I.shift{s=I.SRA,r=r,i=I.IMMED i,d=d}] ! ! val trapping = false ! val multCost = muluCost ! fun addv{r1,r2,d} = [I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d}] ! fun subv{r1,r2,d} = [I.arith{a=I.SUB,r=r1,i=I.REG r2,d=d}] val sh1addv = NONE val sh2addv = NONE val sh3addv = NONE ! ! val signed = false) ! (* signed, non-trapping version of multiply and divide *) ! structure Muls32 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! ! val intTy = 32 ! fun mov{r,d} = COPY{dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d} = I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d} ! fun slli{r,i,d} = [I.shift{s=I.SLL,r=r,i=I.IMMED i,d=d}] ! fun srli{r,i,d} = [I.shift{s=I.SRL,r=r,i=I.IMMED i,d=d}] ! fun srai{r,i,d} = [I.shift{s=I.SRA,r=r,i=I.IMMED i,d=d}] ! ! val trapping = false val multCost = muluCost fun addv{r1,r2,d} = [I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d}] *************** *** 130,141 **** val sh2addv = NONE val sh3addv = NONE ! ) ! structure Mulu32 = Mul32(val signed = false) ! ! structure Muls32 = Mul32(val signed = true) (* signed, trapping version of multiply and divide *) ! structure Mult64 = Multiply64 ! (val trapping = true val multCost = multCost fun addv{r1,r2,d} = --- 211,233 ---- val sh2addv = NONE val sh3addv = NONE ! ! val signed = true) (* signed, trapping version of multiply and divide *) ! structure Mult64 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! ! val intTy = 64 ! fun mov{r,d} = COPY{dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d} = I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d} ! fun slli{r,i,d} = [I.shift{s=I.SLLX,r=r,i=I.IMMED i,d=d}] ! fun srli{r,i,d} = [I.shift{s=I.SRLX,r=r,i=I.IMMED i,d=d}] ! fun srai{r,i,d} = [I.shift{s=I.SRAX,r=r,i=I.IMMED i,d=d}] ! ! val trapping = true val multCost = multCost fun addv{r1,r2,d} = *************** *** 146,155 **** val sh2addv = NONE val sh3addv = NONE ! ) ! (val signed = true) (* unsigned, non-trapping version of multiply and divide *) ! functor Mul64 = Multiply64 ! (val trapping = false val multCost = muluCost fun addv{r1,r2,d} = [I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d}] --- 238,260 ---- val sh2addv = NONE val sh3addv = NONE ! ! val signed = true) (* unsigned, non-trapping version of multiply and divide *) ! structure Mulu64 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! ! val intTy = 64 ! fun mov{r,d} = COPY{dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d} = I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d} ! fun slli{r,i,d} = [I.shift{s=I.SLLX,r=r,i=I.IMMED i,d=d}] ! fun srli{r,i,d} = [I.shift{s=I.SRLX,r=r,i=I.IMMED i,d=d}] ! fun srai{r,i,d} = [I.shift{s=I.SRAX,r=r,i=I.IMMED i,d=d}] ! ! val trapping = false val multCost = muluCost fun addv{r1,r2,d} = [I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d}] *************** *** 158,165 **** val sh2addv = NONE val sh3addv = NONE ! ) ! structure Mulu64 = Mul64(val signed = false) ! structure Muls64 = Mul64(val signed = true) datatype commutative = COMMUTE | NOCOMMUTE --- 263,293 ---- val sh2addv = NONE val sh3addv = NONE ! ! val signed = false) ! (* signed, non-trapping version of multiply and divide *) ! structure Muls64 = MLTreeMult ! (structure I = I ! structure T = T ! structure CB = CellsBasis ! type arg = {r1:CB.cell,r2:CB.cell,d:CB.cell} ! type argi = {r:CB.cell,i:int,d:CB.cell} ! ! val intTy = 64 ! fun mov{r,d} = COPY{dst=[d],src=[r],tmp=NONE} ! fun add{r1,r2,d} = I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d} ! fun slli{r,i,d} = [I.shift{s=I.SLLX,r=r,i=I.IMMED i,d=d}] ! fun srli{r,i,d} = [I.shift{s=I.SRLX,r=r,i=I.IMMED i,d=d}] ! fun srai{r,i,d} = [I.shift{s=I.SRAX,r=r,i=I.IMMED i,d=d}] ! ! val trapping = false ! val multCost = muluCost ! fun addv{r1,r2,d} = [I.arith{a=I.ADD,r=r1,i=I.REG r2,d=d}] ! fun subv{r1,r2,d} = [I.arith{a=I.SUB,r=r1,i=I.REG r2,d=d}] ! val sh1addv = NONE ! val sh2addv = NONE ! val sh3addv = NONE ! ! val signed = false) datatype commutative = COMMUTE | NOCOMMUTE *************** *** 216,220 **** | rcond _ = error "rcond" ! fun signedCmp(T.LT | T.LE | T.EQ | T.NE | T.GE | T.GT) = true | signedCmp _ = false --- 344,353 ---- | rcond _ = error "rcond" ! fun signedCmp T.LT = true ! | signedCmp T.LE = true ! | signedCmp T.EQ = true ! | signedCmp T.NE = true ! | signedCmp T.GE = true ! | signedCmp T.GT = true | signedCmp _ = false *************** *** 368,373 **** (* convert an expression into an addressing mode *) ! and addr(T.ADD(ty, (T.ADD (_, e, T.LI n)| ! T.ADD (_, T.LI n, e)), T.LI n')) = addr(T.ADD (ty, e, T.LI (T.I.ADD (ty, n, n')))) | addr(T.ADD(ty, T.SUB (_, e, T.LI n), T.LI n')) = --- 501,507 ---- (* convert an expression into an addressing mode *) ! and addr(T.ADD(ty, T.ADD (_, e, T.LI n), T.LI n')) = ! addr(T.ADD (ty, e, T.LI (T.I.ADD (ty, n, n')))) ! | addr(T.ADD(ty, T.ADD (_, T.LI n, e), T.LI n')) = addr(T.ADD (ty, e, T.LI (T.I.ADD (ty, n, n')))) | addr(T.ADD(ty, T.SUB (_, e, T.LI n), T.LI n')) = *************** *** 444,449 **** let val (cond,a,b) = case a of ! (T.LI _ | T.CONST _ | T.LABEL _) => ! (T.Basis.swapCond cond,b,a) | _ => (cond,a,b) in if V9 then --- 578,584 ---- let val (cond,a,b) = case a of ! T.LI _ => (T.Basis.swapCond cond,b,a) ! | T.CONST _ => (T.Basis.swapCond cond,b,a) ! | T.LABEL _ => (T.Basis.swapCond cond,b,a) | _ => (cond,a,b) in if V9 then diff -N -C 2 -r MLRISC/visualization/cfgViewer.sml MLRISC-mlton/visualization/cfgViewer.sml *** MLRISC/visualization/cfgViewer.sml 2010-02-03 11:40:45.000000000 -0500 --- MLRISC-mlton/visualization/cfgViewer.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 2,9 **** (structure CFG : CONTROL_FLOW_GRAPH structure GraphViewer : GRAPH_VIEWER ! structure Asm : INSTRUCTION_EMITTER where I = CFG.I) ! : sig ! val view : CFG.cfg -> unit ! end = struct structure CFG = CFG --- 2,14 ---- (structure CFG : CONTROL_FLOW_GRAPH structure GraphViewer : GRAPH_VIEWER ! structure Asm : INSTRUCTION_EMITTER (* where I = CFG.I *) ! where type I.addressing_mode = CFG.I.addressing_mode ! and type I.ea = CFG.I.ea ! and type I.instr = CFG.I.instr ! and type I.instruction = CFG.I.instruction ! and type I.operand = CFG.I.operand ! ) : sig ! val view : CFG.cfg -> unit ! end = struct structure CFG = CFG diff -N -C 2 -r MLRISC/x86/backpatch/x86Jumps.sml MLRISC-mlton/x86/backpatch/x86Jumps.sml *** MLRISC/x86/backpatch/x86Jumps.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/backpatch/x86Jumps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,12 **** functor X86Jumps (structure Instr : X86INSTR ! structure Eval : MLTREE_EVAL where T = Instr.T ! structure Shuffle : X86SHUFFLE where I = Instr ! structure MCEmitter : MC_EMIT where I = Instr) : SDI_JUMPS = struct structure I = Instr --- 6,75 ---- functor X86Jumps (structure Instr : X86INSTR ! structure Eval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ! structure Shuffle : X86SHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fbinOp = Instr.fbinOp ! and type I.fenvOp = Instr.fenvOp ! and type I.fibinOp = Instr.fibinOp ! and type I.fsize = Instr.fsize ! and type I.funOp = Instr.funOp ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp ! structure MCEmitter : MC_EMIT (* where I = Instr *) ! where type I.addressing_mode = Instr.addressing_mode ! and type I.ea = Instr.ea ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.operand = Instr.operand ! ) : SDI_JUMPS = struct structure I = Instr *************** *** 40,45 **** | I.MOVE{src, dst, ...} => operand src orelse operand dst | I.LEA{addr, ...} => operand addr ! | ( I.CMPL arg | I.CMPW arg | I.CMPB arg ! | I.TESTL arg | I.TESTW arg | I.TESTB arg) => cmptest arg | I.MULTDIV{src, ...} => operand src | I.MUL3{src1, ...} => operand src1 --- 103,112 ---- | I.MOVE{src, dst, ...} => operand src orelse operand dst | I.LEA{addr, ...} => operand addr ! | I.CMPL arg => cmptest arg ! | I.CMPW arg => cmptest arg ! | I.CMPB arg => cmptest arg ! | I.TESTL arg => cmptest arg ! | I.TESTW arg => cmptest arg ! | I.TESTB arg => cmptest arg | I.MULTDIV{src, ...} => operand src | I.MUL3{src1, ...} => operand src1 *************** *** 47,51 **** | I.SET{opnd, ...} => operand opnd | I.CMOV{src, dst, ...} => operand src ! | (I.PUSHL opnd | I.PUSHW opnd | I.PUSHB opnd) => operand opnd | I.POP opnd => operand opnd | I.FSTPT opnd => operand opnd --- 114,120 ---- | I.SET{opnd, ...} => operand opnd | I.CMOV{src, dst, ...} => operand src ! | I.PUSHL opnd => operand opnd ! | I.PUSHW opnd => operand opnd ! | I.PUSHB opnd => operand opnd | I.POP opnd => operand opnd | I.FSTPT opnd => operand opnd diff -N -C 2 -r MLRISC/x86/c-calls/ia32-svid.sml MLRISC-mlton/x86/c-calls/ia32-svid.sml *** MLRISC/x86/c-calls/ia32-svid.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/c-calls/ia32-svid.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 400,404 **** *) val calleePops = (case #conv proto ! of (""|"ccall") => false | "stdcall" => true | conv => error (concat [ --- 400,405 ---- *) val calleePops = (case #conv proto ! of "" => false ! | "ccall" => false | "stdcall" => true | conv => error (concat [ diff -N -C 2 -r MLRISC/x86/emit/x86Asm.sml MLRISC-mlton/x86/emit/x86Asm.sml *** MLRISC/x86/emit/x86Asm.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/x86/emit/x86Asm.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,19 **** functor X86AsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : X86INSTR ! where T = S.P.T ! structure Shuffle : X86SHUFFLE ! where I = Instr ! structure MLTreeEval : MLTREE_EVAL ! where T = Instr.T (*#line 512.7 "x86/x86.mdl"*) ! structure MemRegs : MEMORY_REGISTERS where I=Instr (*#line 513.7 "x86/x86.mdl"*) --- 7,130 ---- functor X86AsmEmitter(structure S : INSTRUCTION_STREAM ! structure Instr : X86INSTR (* where T = S.P.T *) ! where type T.Basis.cond = S.P.T.Basis.cond ! and type T.Basis.div_rounding_mode = S.P.T.Basis.div_rounding_mode ! and type T.Basis.ext = S.P.T.Basis.ext ! and type T.Basis.fcond = S.P.T.Basis.fcond ! and type T.Basis.rounding_mode = S.P.T.Basis.rounding_mode ! and type T.Constant.const = S.P.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) S.P.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) S.P.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) S.P.T.Extension.sx ! and type T.I.div_rounding_mode = S.P.T.I.div_rounding_mode ! and type T.Region.region = S.P.T.Region.region ! and type T.ccexp = S.P.T.ccexp ! and type T.fexp = S.P.T.fexp ! (* and type T.labexp = S.P.T.labexp *) ! and type T.mlrisc = S.P.T.mlrisc ! and type T.oper = S.P.T.oper ! and type T.rep = S.P.T.rep ! and type T.rexp = S.P.T.rexp ! and type T.stm = S.P.T.stm ! structure Shuffle : X86SHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fbinOp = Instr.fbinOp ! and type I.fenvOp = Instr.fenvOp ! and type I.fibinOp = Instr.fibinOp ! and type I.fsize = Instr.fsize ! and type I.funOp = Instr.funOp ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm (*#line 512.7 "x86/x86.mdl"*) ! structure MemRegs : MEMORY_REGISTERS (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fbinOp = Instr.fbinOp ! and type I.fenvOp = Instr.fenvOp ! and type I.fibinOp = Instr.fibinOp ! and type I.fsize = Instr.fsize ! and type I.funOp = Instr.funOp ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp (*#line 513.7 "x86/x86.mdl"*) *************** *** 371,375 **** in (case Char.toLower (String.sub (fbinOp, n - 1)) of ! (#"s" | #"l") => String.substring (fbinOp, 0, n - 1) | _ => fbinOp ) --- 482,487 ---- in (case Char.toLower (String.sub (fbinOp, n - 1)) of ! #"s" => String.substring (fbinOp, 0, n - 1) ! | #"l" => String.substring (fbinOp, 0, n - 1) | _ => fbinOp ) *************** *** 512,517 **** | I.BINARY{binOp, src, dst} => (case (src, binOp) of ! (I.Direct _, (I.SARL | I.SHRL | I.SHLL | I.SARW | I.SHRW | I.SHLW | I.SARB | I.SHRB | I.SHLB)) => ! ( emit_binaryOp binOp; emit "\t%cl, "; --- 624,660 ---- | I.BINARY{binOp, src, dst} => (case (src, binOp) of ! (I.Direct _, (I.SARL)) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, (I.SHRL)) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, (I.SHLL)) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, (I.SARW)) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, (I.SHRW)) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, (I.SHLW)) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, (I.SARB)) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, (I.SHRB)) => ! ( emit_binaryOp binOp; ! emit "\t%cl, "; ! emit_dst dst ) ! | (I.Direct _, (I.SHLB)) => ( emit_binaryOp binOp; emit "\t%cl, "; diff -N -C 2 -r MLRISC/x86/flowgraph/x86-darwin-pseudo-ops.sml MLRISC-mlton/x86/flowgraph/x86-darwin-pseudo-ops.sml *** MLRISC/x86/flowgraph/x86-darwin-pseudo-ops.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/flowgraph/x86-darwin-pseudo-ops.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 8,12 **** structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ) : PSEUDO_OPS_BASIS = struct --- 8,32 ---- structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ) : PSEUDO_OPS_BASIS = struct diff -N -C 2 -r MLRISC/x86/flowgraph/x86GasPseudoOps.sml MLRISC-mlton/x86/flowgraph/x86GasPseudoOps.sml *** MLRISC/x86/flowgraph/x86GasPseudoOps.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/flowgraph/x86GasPseudoOps.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,10 **** functor X86GasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL where T = T ) : PSEUDO_OPS_BASIS = --- 6,30 ---- functor X86GasPseudoOps ( structure T : MLTREE ! structure MLTreeEval : MLTREE_EVAL (* where T = T *) ! where type T.Basis.cond = T.Basis.cond ! and type T.Basis.div_rounding_mode = T.Basis.div_rounding_mode ! and type T.Basis.ext = T.Basis.ext ! and type T.Basis.fcond = T.Basis.fcond ! and type T.Basis.rounding_mode = T.Basis.rounding_mode ! and type T.Constant.const = T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) T.Extension.sx ! and type T.I.div_rounding_mode = T.I.div_rounding_mode ! and type T.Region.region = T.Region.region ! and type T.ccexp = T.ccexp ! and type T.fexp = T.fexp ! (* and type T.labexp = T.labexp *) ! and type T.mlrisc = T.mlrisc ! and type T.oper = T.oper ! and type T.rep = T.rep ! and type T.rexp = T.rexp ! and type T.stm = T.stm ) : PSEUDO_OPS_BASIS = diff -N -C 2 -r MLRISC/x86/instructions/x86Instr.sml MLRISC-mlton/x86/instructions/x86Instr.sml *** MLRISC/x86/instructions/x86Instr.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/instructions/x86Instr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 9,13 **** sig structure C : X86CELLS ! structure CB : CELLS_BASIS = CellsBasis structure T : MLTREE structure Constant: CONSTANT --- 9,22 ---- sig structure C : X86CELLS ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo structure T : MLTREE structure Constant: CONSTANT diff -N -C 2 -r MLRISC/x86/instructions/x86Peephole.peep MLRISC-mlton/x86/instructions/x86Peephole.peep *** MLRISC/x86/instructions/x86Peephole.peep 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/instructions/x86Peephole.peep 2009-10-02 09:51:35.000000000 -0400 *************** *** 21,25 **** (structure Instr : X86INSTR structure Eval : MLTREE_EVAL ! sharing Instr.T = Eval.T ) : PEEPHOLE = struct --- 21,45 ---- (structure Instr : X86INSTR structure Eval : MLTREE_EVAL ! (* sharing Instr.T = Eval.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : PEEPHOLE = struct diff -N -C 2 -r MLRISC/x86/instructions/x86Peephole.sml MLRISC-mlton/x86/instructions/x86Peephole.sml *** MLRISC/x86/instructions/x86Peephole.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/instructions/x86Peephole.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 13,17 **** (*#line 23.7 "x86Peephole.peep"*) ! sharing Instr.T = Eval.T ): PEEPHOLE = struct --- 13,37 ---- (*#line 23.7 "x86Peephole.peep"*) ! (* sharing Instr.T = Eval.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ): PEEPHOLE = struct diff -N -C 2 -r MLRISC/x86/instructions/x86Props.sml MLRISC-mlton/x86/instructions/x86Props.sml *** MLRISC/x86/instructions/x86Props.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/instructions/x86Props.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 6,11 **** functor X86Props (structure Instr : X86INSTR ! structure MLTreeHash : MLTREE_HASH where T = Instr.T ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T ) : INSN_PROPERTIES = struct --- 6,51 ---- functor X86Props (structure Instr : X86INSTR ! structure MLTreeHash : MLTREE_HASH (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ) : INSN_PROPERTIES = struct *************** *** 231,236 **** in case multDivOp ! of (I.IDIVL1 | I.DIVL1) => (eaxPair, C.edx::C.eax::uses) ! | (I.IMULL1 | I.MULL1) => (eaxPair, C.eax::uses) end --- 271,278 ---- in case multDivOp ! of I.IDIVL1 => (eaxPair, C.edx::C.eax::uses) ! | I.DIVL1 => (eaxPair, C.edx::C.eax::uses) ! | I.IMULL1 => (eaxPair, C.eax::uses) ! | I.MULL1 => (eaxPair, C.eax::uses) end *************** *** 250,255 **** | I.MOVE{src, dst, ...} => ([], operandAcc(dst, operandUse src)) | I.LEA{r32, addr} => ([r32], operandUse addr) ! | ( I.CMPL arg | I.CMPW arg | I.CMPB arg ! | I.TESTL arg | I.TESTW arg | I.TESTB arg ) => cmptest arg | I.BITOP{lsrc, rsrc, ...} => cmptest{lsrc=lsrc,rsrc=rsrc} | I.BINARY{binOp=I.XORL,src=I.Direct rs,dst=I.Direct rd,...} => --- 292,301 ---- | I.MOVE{src, dst, ...} => ([], operandAcc(dst, operandUse src)) | I.LEA{r32, addr} => ([r32], operandUse addr) ! | I.CMPL arg => cmptest arg ! | I.CMPW arg => cmptest arg ! | I.CMPB arg => cmptest arg ! | I.TESTL arg => cmptest arg ! | I.TESTW arg => cmptest arg ! | I.TESTB arg => cmptest arg | I.BITOP{lsrc, rsrc, ...} => cmptest{lsrc=lsrc,rsrc=rsrc} | I.BINARY{binOp=I.XORL,src=I.Direct rs,dst=I.Direct rd,...} => *************** *** 269,273 **** | I.UNARY{opnd, ...} => unary opnd | I.SET{opnd, ...} => unary opnd ! | ( I.PUSHL arg | I.PUSHW arg | I.PUSHB arg ) => push arg | I.POP arg => (C.stackptrR::operandDef arg, [C.stackptrR]) | I.PUSHFD => espOnly() --- 315,321 ---- | I.UNARY{opnd, ...} => unary opnd | I.SET{opnd, ...} => unary opnd ! | I.PUSHL arg => push arg ! | I.PUSHW arg => push arg ! | I.PUSHB arg => push arg | I.POP arg => (C.stackptrR::operandDef arg, [C.stackptrR]) | I.PUSHFD => espOnly() diff -N -C 2 -r MLRISC/x86/instructions/x86comp-instr-ext.sml MLRISC-mlton/x86/instructions/x86comp-instr-ext.sml *** MLRISC/x86/instructions/x86comp-instr-ext.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/instructions/x86comp-instr-ext.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 7,15 **** signature X86COMP_INSTR_EXT = sig structure I : X86INSTR ! structure TS : MLTREE_STREAM ! where T = I.T ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! and P = TS.S.P type reducer = --- 7,58 ---- signature X86COMP_INSTR_EXT = sig structure I : X86INSTR ! structure TS : MLTREE_STREAM (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I and P = TS.S.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm type reducer = *************** *** 28,36 **** functor X86CompInstrExt ( structure I : X86INSTR ! structure TS : MLTREE_STREAM ! where T = I.T ! structure CFG : CONTROL_FLOW_GRAPH ! where P = TS.S.P ! and I = I ) : X86COMP_INSTR_EXT = struct --- 71,122 ---- functor X86CompInstrExt ( structure I : X86INSTR ! structure TS : MLTREE_STREAM (* where T = I.T *) ! where type T.Basis.cond = I.T.Basis.cond ! and type T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type T.Basis.ext = I.T.Basis.ext ! and type T.Basis.fcond = I.T.Basis.fcond ! and type T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type T.Constant.const = I.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type T.Region.region = I.T.Region.region ! and type T.ccexp = I.T.ccexp ! and type T.fexp = I.T.fexp ! (* and type T.labexp = I.T.labexp *) ! and type T.mlrisc = I.T.mlrisc ! and type T.oper = I.T.oper ! and type T.rep = I.T.rep ! and type T.rexp = I.T.rexp ! and type T.stm = I.T.stm ! structure CFG : CONTROL_FLOW_GRAPH (* where P = TS.S.P and I = I *) ! where type P.Client.pseudo_op = TS.S.P.Client.pseudo_op ! and type P.T.Basis.cond = TS.S.P.T.Basis.cond ! and type P.T.Basis.div_rounding_mode = TS.S.P.T.Basis.div_rounding_mode ! and type P.T.Basis.ext = TS.S.P.T.Basis.ext ! and type P.T.Basis.fcond = TS.S.P.T.Basis.fcond ! and type P.T.Basis.rounding_mode = TS.S.P.T.Basis.rounding_mode ! and type P.T.Constant.const = TS.S.P.T.Constant.const ! and type ('s,'r,'f,'c) P.T.Extension.ccx = ('s,'r,'f,'c) TS.S.P.T.Extension.ccx ! and type ('s,'r,'f,'c) P.T.Extension.fx = ('s,'r,'f,'c) TS.S.P.T.Extension.fx ! and type ('s,'r,'f,'c) P.T.Extension.rx = ('s,'r,'f,'c) TS.S.P.T.Extension.rx ! and type ('s,'r,'f,'c) P.T.Extension.sx = ('s,'r,'f,'c) TS.S.P.T.Extension.sx ! and type P.T.I.div_rounding_mode = TS.S.P.T.I.div_rounding_mode ! and type P.T.Region.region = TS.S.P.T.Region.region ! and type P.T.ccexp = TS.S.P.T.ccexp ! and type P.T.fexp = TS.S.P.T.fexp ! (* and type P.T.labexp = TS.S.P.T.labexp *) ! and type P.T.mlrisc = TS.S.P.T.mlrisc ! and type P.T.oper = TS.S.P.T.oper ! and type P.T.rep = TS.S.P.T.rep ! and type P.T.rexp = TS.S.P.T.rexp ! and type P.T.stm = TS.S.P.T.stm ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ) : X86COMP_INSTR_EXT = struct diff -N -C 2 -r MLRISC/x86/mltree/x86-fp.sml MLRISC-mlton/x86/mltree/x86-fp.sml *** MLRISC/x86/mltree/x86-fp.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/mltree/x86-fp.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 54,58 **** *) ! local val debug = false (* set this to true to debug this module * set this to false for production use. --- 54,132 ---- *) ! functor X86FP ! (structure X86Instr : X86INSTR ! structure X86Props : INSN_PROPERTIES (* where I = X86Instr *) ! where type I.addressing_mode = X86Instr.addressing_mode ! and type I.ea = X86Instr.ea ! and type I.instr = X86Instr.instr ! and type I.instruction = X86Instr.instruction ! and type I.operand = X86Instr.operand ! structure Flowgraph : CONTROL_FLOW_GRAPH (* where I = X86Instr *) ! where type I.addressing_mode = X86Instr.addressing_mode ! and type I.ea = X86Instr.ea ! and type I.instr = X86Instr.instr ! and type I.instruction = X86Instr.instruction ! and type I.operand = X86Instr.operand ! structure Liveness : LIVENESS (* where CFG = Flowgraph *) ! where type CFG.I.addressing_mode = Flowgraph.I.addressing_mode ! and type CFG.I.ea = Flowgraph.I.ea ! and type CFG.I.instr = Flowgraph.I.instr ! and type CFG.I.instruction = Flowgraph.I.instruction ! and type CFG.I.operand = Flowgraph.I.operand ! and type CFG.P.Client.pseudo_op = Flowgraph.P.Client.pseudo_op ! and type CFG.P.T.Basis.cond = Flowgraph.P.T.Basis.cond ! and type CFG.P.T.Basis.div_rounding_mode = Flowgraph.P.T.Basis.div_rounding_mode ! and type CFG.P.T.Basis.ext = Flowgraph.P.T.Basis.ext ! and type CFG.P.T.Basis.fcond = Flowgraph.P.T.Basis.fcond ! and type CFG.P.T.Basis.rounding_mode = Flowgraph.P.T.Basis.rounding_mode ! and type CFG.P.T.Constant.const = Flowgraph.P.T.Constant.const ! and type ('s,'r,'f,'c) CFG.P.T.Extension.ccx = ('s,'r,'f,'c) Flowgraph.P.T.Extension.ccx ! and type ('s,'r,'f,'c) CFG.P.T.Extension.fx = ('s,'r,'f,'c) Flowgraph.P.T.Extension.fx ! and type ('s,'r,'f,'c) CFG.P.T.Extension.rx = ('s,'r,'f,'c) Flowgraph.P.T.Extension.rx ! and type ('s,'r,'f,'c) CFG.P.T.Extension.sx = ('s,'r,'f,'c) Flowgraph.P.T.Extension.sx ! and type CFG.P.T.I.div_rounding_mode = Flowgraph.P.T.I.div_rounding_mode ! and type CFG.P.T.Region.region = Flowgraph.P.T.Region.region ! and type CFG.P.T.ccexp = Flowgraph.P.T.ccexp ! and type CFG.P.T.fexp = Flowgraph.P.T.fexp ! (* and type CFG.P.T.labexp = Flowgraph.P.T.labexp *) ! and type CFG.P.T.mlrisc = Flowgraph.P.T.mlrisc ! and type CFG.P.T.oper = Flowgraph.P.T.oper ! and type CFG.P.T.rep = Flowgraph.P.T.rep ! and type CFG.P.T.rexp = Flowgraph.P.T.rexp ! and type CFG.P.T.stm = Flowgraph.P.T.stm ! and type CFG.block = Flowgraph.block ! and type CFG.block_kind = Flowgraph.block_kind ! and type CFG.edge_info = Flowgraph.edge_info ! and type CFG.edge_kind = Flowgraph.edge_kind ! and type CFG.info = Flowgraph.info ! structure Asm : INSTRUCTION_EMITTER (* where I = X86Instr and S.P = Flowgraph.P *) ! where type I.addressing_mode = X86Instr.addressing_mode ! and type I.ea = X86Instr.ea ! and type I.instr = X86Instr.instr ! and type I.instruction = X86Instr.instruction ! and type I.operand = X86Instr.operand ! where type S.P.Client.pseudo_op = Flowgraph.P.Client.pseudo_op ! and type S.P.T.Basis.cond = Flowgraph.P.T.Basis.cond ! and type S.P.T.Basis.div_rounding_mode = Flowgraph.P.T.Basis.div_rounding_mode ! and type S.P.T.Basis.ext = Flowgraph.P.T.Basis.ext ! and type S.P.T.Basis.fcond = Flowgraph.P.T.Basis.fcond ! and type S.P.T.Basis.rounding_mode = Flowgraph.P.T.Basis.rounding_mode ! and type S.P.T.Constant.const = Flowgraph.P.T.Constant.const ! and type ('s,'r,'f,'c) S.P.T.Extension.ccx = ('s,'r,'f,'c) Flowgraph.P.T.Extension.ccx ! and type ('s,'r,'f,'c) S.P.T.Extension.fx = ('s,'r,'f,'c) Flowgraph.P.T.Extension.fx ! and type ('s,'r,'f,'c) S.P.T.Extension.rx = ('s,'r,'f,'c) Flowgraph.P.T.Extension.rx ! and type ('s,'r,'f,'c) S.P.T.Extension.sx = ('s,'r,'f,'c) Flowgraph.P.T.Extension.sx ! and type S.P.T.I.div_rounding_mode = Flowgraph.P.T.I.div_rounding_mode ! and type S.P.T.Region.region = Flowgraph.P.T.Region.region ! and type S.P.T.ccexp = Flowgraph.P.T.ccexp ! and type S.P.T.fexp = Flowgraph.P.T.fexp ! (* and type S.P.T.labexp = Flowgraph.P.T.labexp *) ! and type S.P.T.mlrisc = Flowgraph.P.T.mlrisc ! and type S.P.T.oper = Flowgraph.P.T.oper ! and type S.P.T.rep = Flowgraph.P.T.rep ! and type S.P.T.rexp = Flowgraph.P.T.rexp ! and type S.P.T.stm = Flowgraph.P.T.stm ! ) : CFG_OPTIMIZATION = ! struct val debug = false (* set this to true to debug this module * set this to false for production use. *************** *** 61,78 **** val debugDead = false (* debug dead code removal *) val sanityCheck = true ! in ! functor X86FP ! (structure X86Instr : X86INSTR ! structure X86Props : INSN_PROPERTIES ! where I = X86Instr ! structure Flowgraph : CONTROL_FLOW_GRAPH ! where I = X86Instr ! structure Liveness : LIVENESS ! where CFG = Flowgraph ! structure Asm : INSTRUCTION_EMITTER ! where I = X86Instr ! and S.P = Flowgraph.P ! ) : CFG_OPTIMIZATION = ! struct structure CFG = Flowgraph structure G = Graph --- 135,139 ---- val debugDead = false (* debug dead code removal *) val sanityCheck = true ! structure CFG = Flowgraph structure G = Graph *************** *** 1544,1555 **** * should not have been generated at this point. *) ! | (I.FLD1 | I.FLDL2E | I.FLDLG2 | I.FLDLN2 | I.FLDPI | ! I.FLDZ | I.FLDL _ | I.FLDS _ | I.FLDT _ | ! I.FILD _ | I.FILDL _ | I.FILDLL _ | ! I.FENV _ | I.FBINARY _ | I.FIBINARY _ | I.FUNARY _ | ! I.FUCOMPP | I.FUCOM _ | I.FUCOMP _ | I.FCOMPP | I.FXCH _ | ! I.FCOMI _ | I.FCOMIP _ | I.FUCOMI _ | I.FUCOMIP _ | ! I.FSTPL _ | I.FSTPS _ | I.FSTPT _ | I.FSTL _ | I.FSTS _ ! ) => bug("Illegal FP instructions") (* Other instructions are untouched *) --- 1605,1638 ---- * should not have been generated at this point. *) ! | I.FLD1 => bug("Illegal FP instructions") ! | I.FLDL2E => bug("Illegal FP instructions") ! | I.FLDLG2 => bug("Illegal FP instructions") ! | I.FLDLN2 => bug("Illegal FP instructions") ! | I.FLDPI => bug("Illegal FP instructions") ! | I.FLDZ => bug("Illegal FP instructions") ! | I.FLDL _ => bug("Illegal FP instructions") ! | I.FLDS _ => bug("Illegal FP instructions") ! | I.FLDT _ => bug("Illegal FP instructions") ! | I.FILD _ => bug("Illegal FP instructions") ! | I.FILDL _ => bug("Illegal FP instructions") ! | I.FILDLL _ => bug("Illegal FP instructions") ! | I.FENV _ => bug("Illegal FP instructions") ! | I.FBINARY _ => bug("Illegal FP instructions") ! | I.FIBINARY _ => bug("Illegal FP instructions") ! | I.FUNARY _ => bug("Illegal FP instructions") ! | I.FUCOMPP => bug("Illegal FP instructions") ! | I.FUCOM _ => bug("Illegal FP instructions") ! | I.FUCOMP _ => bug("Illegal FP instructions") ! | I.FCOMPP => bug("Illegal FP instructions") ! | I.FXCH _ => bug("Illegal FP instructions") ! | I.FCOMI _ => bug("Illegal FP instructions") ! | I.FCOMIP _ => bug("Illegal FP instructions") ! | I.FUCOMI _ => bug("Illegal FP instructions") ! | I.FUCOMIP _ => bug("Illegal FP instructions") ! | I.FSTPL _ => bug("Illegal FP instructions") ! | I.FSTPS _ => bug("Illegal FP instructions") ! | I.FSTPT _ => bug("Illegal FP instructions") ! | I.FSTL _ => bug("Illegal FP instructions") ! | I.FSTS _ => bug("Illegal FP instructions") (* Other instructions are untouched *) *************** *** 1576,1581 **** fun scan(I.INSTR(I.FBINARY{binOp, ...})) = (case binOp of ! ( I.FADDP | I.FSUBP | I.FSUBRP | I.FMULP ! | I.FDIVP | I.FDIVRP) => pop() | _ => () ) --- 1659,1668 ---- fun scan(I.INSTR(I.FBINARY{binOp, ...})) = (case binOp of ! I.FADDP => pop() ! | I.FSUBP => pop() ! | I.FSUBRP => pop() ! | I.FMULP => pop() ! | I.FDIVP => pop() ! | I.FDIVRP => pop() | _ => () ) *************** *** 1671,1674 **** end end (* functor *) - - end (* local *) --- 1758,1759 ---- diff -N -C 2 -r MLRISC/x86/mltree/x86.sml MLRISC-mlton/x86/mltree/x86.sml *** MLRISC/x86/mltree/x86.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/mltree/x86.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 33,49 **** * -- Allen *) - local - val rewriteMemReg = true (* should we rewrite memRegs *) - val enableFastFPMode = true (* set this to false to disable the mode *) - in functor X86 (structure X86Instr : X86INSTR ! structure MLTreeUtils : MLTREE_UTILS ! where T = X86Instr.T ! structure ExtensionComp : MLTREE_EXTENSION_COMP ! where I = X86Instr and T = X86Instr.T ! structure MLTreeStream : MLTREE_STREAM ! where T = ExtensionComp.T datatype arch = Pentium | PentiumPro | PentiumII | PentiumIII val arch : arch ref --- 33,107 ---- * -- Allen *) functor X86 (structure X86Instr : X86INSTR ! structure MLTreeUtils : MLTREE_UTILS (* where T = X86Instr.T *) ! where type T.Basis.cond = X86Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = X86Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = X86Instr.T.Basis.ext ! and type T.Basis.fcond = X86Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = X86Instr.T.Basis.rounding_mode ! and type T.Constant.const = X86Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) X86Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) X86Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) X86Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) X86Instr.T.Extension.sx ! and type T.I.div_rounding_mode = X86Instr.T.I.div_rounding_mode ! and type T.Region.region = X86Instr.T.Region.region ! and type T.ccexp = X86Instr.T.ccexp ! and type T.fexp = X86Instr.T.fexp ! (* and type T.labexp = X86Instr.T.labexp *) ! and type T.mlrisc = X86Instr.T.mlrisc ! and type T.oper = X86Instr.T.oper ! and type T.rep = X86Instr.T.rep ! and type T.rexp = X86Instr.T.rexp ! and type T.stm = X86Instr.T.stm ! structure ExtensionComp : MLTREE_EXTENSION_COMP (* where I = X86Instr and T = X86Instr.T *) ! where type I.addressing_mode = X86Instr.addressing_mode ! and type I.ea = X86Instr.ea ! and type I.instr = X86Instr.instr ! and type I.instruction = X86Instr.instruction ! and type I.operand = X86Instr.operand ! where type T.Basis.cond = X86Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = X86Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = X86Instr.T.Basis.ext ! and type T.Basis.fcond = X86Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = X86Instr.T.Basis.rounding_mode ! and type T.Constant.const = X86Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) X86Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) X86Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) X86Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) X86Instr.T.Extension.sx ! and type T.I.div_rounding_mode = X86Instr.T.I.div_rounding_mode ! and type T.Region.region = X86Instr.T.Region.region ! and type T.ccexp = X86Instr.T.ccexp ! and type T.fexp = X86Instr.T.fexp ! (* and type T.labexp = X86Instr.T.labexp *) ! and type T.mlrisc = X86Instr.T.mlrisc ! and type T.oper = X86Instr.T.oper ! and type T.rep = X86Instr.T.rep ! and type T.rexp = X86Instr.T.rexp ! and type T.stm = X86Instr.T.stm ! structure MLTreeStream : MLTREE_STREAM (* where T = ExtensionComp.T *) ! where type T.Basis.cond = ExtensionComp.T.Basis.cond ! and type T.Basis.div_rounding_mode = ExtensionComp.T.Basis.div_rounding_mode ! and type T.Basis.ext = ExtensionComp.T.Basis.ext ! and type T.Basis.fcond = ExtensionComp.T.Basis.fcond ! and type T.Basis.rounding_mode = ExtensionComp.T.Basis.rounding_mode ! and type T.Constant.const = ExtensionComp.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) ExtensionComp.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) ExtensionComp.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) ExtensionComp.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) ExtensionComp.T.Extension.sx ! and type T.I.div_rounding_mode = ExtensionComp.T.I.div_rounding_mode ! and type T.Region.region = ExtensionComp.T.Region.region ! and type T.ccexp = ExtensionComp.T.ccexp ! and type T.fexp = ExtensionComp.T.fexp ! (* and type T.labexp = ExtensionComp.T.labexp *) ! and type T.mlrisc = ExtensionComp.T.mlrisc ! and type T.oper = ExtensionComp.T.oper ! and type T.rep = ExtensionComp.T.rep ! and type T.rexp = ExtensionComp.T.rexp ! and type T.stm = ExtensionComp.T.stm datatype arch = Pentium | PentiumPro | PentiumII | PentiumIII val arch : arch ref *************** *** 66,69 **** --- 124,130 ---- end = struct + val rewriteMemReg = true (* should we rewrite memRegs *) + val enableFastFPMode = true (* set this to false to disable the mode *) + structure I = X86Instr structure T = I.T *************** *** 422,426 **** (* reduce an expression into an operand *) and operand(T.LI i) = I.Immed(toInt32(i)) ! | operand(x as (T.CONST _ | T.LABEL _)) = I.ImmedLabel x | operand(T.LABEXP le) = I.ImmedLabel le | operand(T.REG(_,r)) = IntReg r --- 483,488 ---- (* reduce an expression into an operand *) and operand(T.LI i) = I.Immed(toInt32(i)) ! | operand(x as T.CONST _) = I.ImmedLabel x ! | operand(x as T.LABEL _) = I.ImmedLabel x | operand(T.LABEXP le) = I.ImmedLabel le | operand(T.REG(_,r)) = IntReg r *************** *** 969,974 **** move'(I.Immed(n), rdOpnd, an) end ! | (T.CONST _ | T.LABEL _) => ! move'(I.ImmedLabel exp, rdOpnd, an) | T.LABEXP le => move'(I.ImmedLabel le, rdOpnd, an) --- 1031,1036 ---- move'(I.Immed(n), rdOpnd, an) end ! | T.CONST _ => move'(I.ImmedLabel exp, rdOpnd, an) ! | T.LABEL _ => move'(I.ImmedLabel exp, rdOpnd, an) | T.LABEXP le => move'(I.ImmedLabel le, rdOpnd, an) *************** *** 1095,1099 **** * since it doesn't need to write out the result in a register. *) ! and cmpWithZero(cc as (T.EQ | T.NE), e as T.ANDB(ty, a, b), an) = (case ty of 8 => test(I.TESTB, a, b, an) --- 1157,1168 ---- * since it doesn't need to write out the result in a register. *) ! and cmpWithZero(cc as T.EQ, e as T.ANDB(ty, a, b), an) = ! (case ty of ! 8 => test(I.TESTB, a, b, an) ! | 16 => test(I.TESTW, a, b, an) ! | 32 => test(I.TESTL, a, b, an) ! | _ => doExpr(e, newReg(), an); ! cc) ! | cmpWithZero(cc as T.NE, e as T.ANDB(ty, a, b), an) = (case ty of 8 => test(I.TESTB, a, b, an) *************** *** 1409,1413 **** and foldableFexp(T.FREG _) = true | foldableFexp(T.FLOAD _) = true ! | foldableFexp(T.CVTI2F(_, (16 | 32), _)) = true | foldableFexp(T.CVTF2F(_, _, t)) = foldableFexp t | foldableFexp(T.FMARK(t, _)) = foldableFexp t --- 1478,1483 ---- and foldableFexp(T.FREG _) = true | foldableFexp(T.FLOAD _) = true ! | foldableFexp(T.CVTI2F(_, 16, _)) = true ! | foldableFexp(T.CVTI2F(_, 32, _)) = true | foldableFexp(T.CVTF2F(_, _, t)) = foldableFexp t | foldableFexp(T.FMARK(t, _)) = foldableFexp t *************** *** 1532,1536 **** and suFold(e as T.FREG _) = (LEAF(0, e, []), false) | suFold(e as T.FLOAD _) = (LEAF(0, e, []), false) ! | suFold(e as T.CVTI2F(_,(16 | 32),_)) = (LEAF(0, e, []), true) | suFold(T.CVTF2F(_, _, t)) = suFold t | suFold(T.FMARK(t, a)) = --- 1602,1607 ---- and suFold(e as T.FREG _) = (LEAF(0, e, []), false) | suFold(e as T.FLOAD _) = (LEAF(0, e, []), false) ! | suFold(e as T.CVTI2F(_,16,_)) = (LEAF(0, e, []), true) ! | suFold(e as T.CVTI2F(_,32,_)) = (LEAF(0, e, []), true) | suFold(T.CVTF2F(_, _, t)) = suFold t | suFold(T.FMARK(t, a)) = *************** *** 1726,1730 **** fun isMemOpnd(T.FREG(_, f)) = isFMemReg f | isMemOpnd(T.FLOAD _) = true ! | isMemOpnd(T.CVTI2F(_, (16 | 32), _)) = true | isMemOpnd(T.CVTF2F(_, _, t)) = isMemOpnd t | isMemOpnd(T.FMARK(t, _)) = isMemOpnd t --- 1797,1802 ---- fun isMemOpnd(T.FREG(_, f)) = isFMemReg f | isMemOpnd(T.FLOAD _) = true ! | isMemOpnd(T.CVTI2F(_, 16, _)) = true ! | isMemOpnd(T.CVTI2F(_, 32, _)) = true | isMemOpnd(T.CVTF2F(_, _, t)) = isMemOpnd t | isMemOpnd(T.FMARK(t, _)) = isMemOpnd t *************** *** 2007,2010 **** end (* functor *) - - end (* local *) --- 2079,2080 ---- diff -N -C 2 -r MLRISC/x86/omit-frameptr/x86omit-frameptr.sml MLRISC-mlton/x86/omit-frameptr/x86omit-frameptr.sml *** MLRISC/x86/omit-frameptr/x86omit-frameptr.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/omit-frameptr/x86omit-frameptr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 11,16 **** functor X86OmitFramePointer ( structure I : X86INSTR ! structure CFG : CONTROL_FLOW_GRAPH where I = I ! structure MemRegs : MEMORY_REGISTERS where I=I val memRegBase : CellsBasis.cell option): OMIT_FRAME_POINTER = struct --- 11,58 ---- functor X86OmitFramePointer ( structure I : X86INSTR ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure MemRegs : MEMORY_REGISTERS (* where I = I *) ! where type I.Constant.const = I.Constant.const ! and type I.Region.region = I.Region.region ! and type I.T.Basis.cond = I.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = I.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = I.T.Basis.ext ! and type I.T.Basis.fcond = I.T.Basis.fcond ! and type I.T.Basis.rounding_mode = I.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) I.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) I.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) I.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) I.T.Extension.sx ! and type I.T.I.div_rounding_mode = I.T.I.div_rounding_mode ! and type I.T.ccexp = I.T.ccexp ! and type I.T.fexp = I.T.fexp ! (* and type I.T.labexp = I.T.labexp *) ! and type I.T.mlrisc = I.T.mlrisc ! and type I.T.oper = I.T.oper ! and type I.T.rep = I.T.rep ! and type I.T.rexp = I.T.rexp ! and type I.T.stm = I.T.stm ! (* and type I.addressing_mode = I.addressing_mode *) ! and type I.binaryOp = I.binaryOp ! and type I.bitOp = I.bitOp ! and type I.cond = I.cond ! and type I.fbinOp = I.fbinOp ! and type I.fenvOp = I.fenvOp ! and type I.fibinOp = I.fibinOp ! and type I.fsize = I.fsize ! and type I.funOp = I.funOp ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.isize = I.isize ! and type I.move = I.move ! and type I.multDivOp = I.multDivOp ! and type I.operand = I.operand ! and type I.shiftOp = I.shiftOp ! and type I.unaryOp = I.unaryOp val memRegBase : CellsBasis.cell option): OMIT_FRAME_POINTER = struct diff -N -C 2 -r MLRISC/x86/ra/x86RA.sml MLRISC-mlton/x86/ra/x86RA.sml *** MLRISC/x86/ra/x86RA.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/ra/x86RA.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 110,120 **** functor X86RA ( structure I : X86INSTR ! structure InsnProps : INSN_PROPERTIES ! where I = I ! structure CFG : CONTROL_FLOW_GRAPH ! where I = I ! structure Asm : INSTRUCTION_EMITTER ! where I = I ! and S.P = CFG.P (* Spilling heuristics determines which node should be spilled --- 110,152 ---- functor X86RA ( structure I : X86INSTR ! structure InsnProps : INSN_PROPERTIES (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure CFG : CONTROL_FLOW_GRAPH (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! structure Asm : INSTRUCTION_EMITTER (* where I = I and S.P = CFG.P *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand ! where type S.P.Client.pseudo_op = CFG.P.Client.pseudo_op ! and type S.P.T.Basis.cond = CFG.P.T.Basis.cond ! and type S.P.T.Basis.div_rounding_mode = CFG.P.T.Basis.div_rounding_mode ! and type S.P.T.Basis.ext = CFG.P.T.Basis.ext ! and type S.P.T.Basis.fcond = CFG.P.T.Basis.fcond ! and type S.P.T.Basis.rounding_mode = CFG.P.T.Basis.rounding_mode ! and type S.P.T.Constant.const = CFG.P.T.Constant.const ! and type ('s,'r,'f,'c) S.P.T.Extension.ccx = ('s,'r,'f,'c) CFG.P.T.Extension.ccx ! and type ('s,'r,'f,'c) S.P.T.Extension.fx = ('s,'r,'f,'c) CFG.P.T.Extension.fx ! and type ('s,'r,'f,'c) S.P.T.Extension.rx = ('s,'r,'f,'c) CFG.P.T.Extension.rx ! and type ('s,'r,'f,'c) S.P.T.Extension.sx = ('s,'r,'f,'c) CFG.P.T.Extension.sx ! and type S.P.T.I.div_rounding_mode = CFG.P.T.I.div_rounding_mode ! and type S.P.T.Region.region = CFG.P.T.Region.region ! and type S.P.T.ccexp = CFG.P.T.ccexp ! and type S.P.T.fexp = CFG.P.T.fexp ! (* and type S.P.T.labexp = CFG.P.T.labexp *) ! and type S.P.T.mlrisc = CFG.P.T.mlrisc ! and type S.P.T.oper = CFG.P.T.oper ! and type S.P.T.rep = CFG.P.T.rep ! and type S.P.T.rexp = CFG.P.T.rexp ! and type S.P.T.stm = CFG.P.T.stm (* Spilling heuristics determines which node should be spilled *************** *** 127,131 **** * or write your own if you are feeling adventurous. *) ! structure Spill : RA_SPILL where I = I --- 159,168 ---- * or write your own if you are feeling adventurous. *) ! structure Spill : RA_SPILL (* where I = I *) ! where type I.addressing_mode = I.addressing_mode ! and type I.ea = I.ea ! and type I.instr = I.instr ! and type I.instruction = I.instruction ! and type I.operand = I.operand *************** *** 305,312 **** structure Ra = RegisterAllocator ! (SpillHeur) ! (MemoryRA (* for memory coalescing *) (RADeadCodeElim (* do the funky dead code elimination stuff *) ! (ClusterRA (structure Flowgraph = CFG structure Asm = Asm --- 342,349 ---- structure Ra = RegisterAllocator ! (structure SpillHeuristics = SpillHeur ! structure Flowgraph = MemoryRA (* for memory coalescing *) (RADeadCodeElim (* do the funky dead code elimination stuff *) ! (structure Flowgraph = ClusterRA (structure Flowgraph = CFG structure Asm = Asm *************** *** 314,319 **** structure Spill = Spill ) ! ) ! (fun cellkind CB.GP = true | cellkind _ = false val deadRegs = deadRegs val affectedBlocks = affectedBlocks --- 351,355 ---- structure Spill = Spill ) ! fun cellkind CB.GP = true | cellkind _ = false val deadRegs = deadRegs val affectedBlocks = affectedBlocks diff -N -C 2 -r MLRISC/x86/ra/x86Rewrite.sig MLRISC-mlton/x86/ra/x86Rewrite.sig *** MLRISC/x86/ra/x86Rewrite.sig 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/ra/x86Rewrite.sig 2009-10-02 09:51:35.000000000 -0400 *************** *** 1,5 **** signature X86REWRITE = sig structure I : X86INSTR ! structure CB : CELLS_BASIS = CellsBasis val rewriteUse : I.instruction * CB.cell * CB.cell -> I.instruction val rewriteDef : I.instruction * CB.cell * CB.cell -> I.instruction --- 1,14 ---- signature X86REWRITE = sig structure I : X86INSTR ! structure CB : CELLS_BASIS (* = CellsBasis *) ! where type CellSet.cellset = CellsBasis.CellSet.cellset ! and type 'a ColorTable.hash_table = 'a CellsBasis.ColorTable.hash_table ! and type 'a HashTable.hash_table = 'a CellsBasis.HashTable.hash_table ! and type SortedCells.sorted_cells = CellsBasis.SortedCells.sorted_cells ! and type cell = CellsBasis.cell ! and type cellColor = CellsBasis.cellColor ! and type cellkind = CellsBasis.cellkind ! and type cellkindDesc = CellsBasis.cellkindDesc ! and type cellkindInfo = CellsBasis.cellkindInfo val rewriteUse : I.instruction * CB.cell * CB.cell -> I.instruction val rewriteDef : I.instruction * CB.cell * CB.cell -> I.instruction diff -N -C 2 -r MLRISC/x86/ra/x86SpillInstr.sml MLRISC-mlton/x86/ra/x86SpillInstr.sml *** MLRISC/x86/ra/x86SpillInstr.sml 2010-02-03 11:40:43.000000000 -0500 --- MLRISC-mlton/x86/ra/x86SpillInstr.sml 2009-10-02 09:51:35.000000000 -0400 *************** *** 9,13 **** *) functor X86SpillInstr(structure Instr: X86INSTR ! structure Props: INSN_PROPERTIES where I = Instr ) : ARCH_SPILL_INSTR = struct --- 9,18 ---- *) functor X86SpillInstr(structure Instr: X86INSTR ! structure Props: INSN_PROPERTIES (* where I = Instr *) ! where type I.addressing_mode = Instr.addressing_mode ! and type I.ea = Instr.ea ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.operand = Instr.operand ) : ARCH_SPILL_INSTR = struct *************** *** 57,61 **** return=return, uses=uses, cutsTo=cutsTo, mem=mem, pops=pops}, an) ! | I.MOVE{mvOp as (I.MOVZBL|I.MOVSBL|I.MOVZWL|I.MOVSWL), src, dst} => let val tmpR = newReg() val tmp = I.Direct tmpR in {proh=[tmpR], newReg=SOME tmpR, --- 62,87 ---- return=return, uses=uses, cutsTo=cutsTo, mem=mem, pops=pops}, an) ! | I.MOVE{mvOp as I.MOVZBL, src, dst} => ! let val tmpR = newReg() val tmp = I.Direct tmpR ! in {proh=[tmpR], newReg=SOME tmpR, ! code=[mark(I.MOVE{mvOp=mvOp, src=src, dst=tmp}, an), ! I.move{mvOp=I.MOVL, src=tmp, dst=spillLoc}] ! } ! end ! | I.MOVE{mvOp as I.MOVSBL, src, dst} => ! let val tmpR = newReg() val tmp = I.Direct tmpR ! in {proh=[tmpR], newReg=SOME tmpR, ! code=[mark(I.MOVE{mvOp=mvOp, src=src, dst=tmp}, an), ! I.move{mvOp=I.MOVL, src=tmp, dst=spillLoc}] ! } ! end ! | I.MOVE{mvOp as I.MOVZWL, src, dst} => ! let val tmpR = newReg() val tmp = I.Direct tmpR ! in {proh=[tmpR], newReg=SOME tmpR, ! code=[mark(I.MOVE{mvOp=mvOp, src=src, dst=tmp}, an), ! I.move{mvOp=I.MOVL, src=tmp, dst=spillLoc}] ! } ! end ! | I.MOVE{mvOp as I.MOVSWL, src, dst} => let val tmpR = newReg() val tmp = I.Direct tmpR in {proh=[tmpR], newReg=SOME tmpR, *************** *** 100,104 **** } | I.BINARY{binOp, src, dst} => let (* note: dst = reg *) ! fun multBinOp(I.MULL|I.MULW|I.MULB|I.IMULL|I.IMULW|I.IMULB) = true | multBinOp _ = false in --- 126,135 ---- } | I.BINARY{binOp, src, dst} => let (* note: dst = reg *) ! fun multBinOp(I.MULL) = true ! | multBinOp(I.MULW) = true ! | multBinOp(I.MULB) = true ! | multBinOp(I.IMULL) = true ! | multBinOp(I.IMULW) = true ! | multBinOp(I.IMULB) = true | multBinOp _ = false in diff -N -C 2 -r MLRISC/x86/x86.mdl MLRISC-mlton/x86/x86.mdl *** MLRISC/x86/x86.mdl 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/x86/x86.mdl 2009-10-02 09:51:26.000000000 -0400 *************** *** 579,583 **** let val n = size fbinOp in case Char.toLower(String.sub(fbinOp,n-1)) of ! (#"s" | #"l") => String.substring(fbinOp,0,n-1) | _ => fbinOp end --- 579,584 ---- let val n = size fbinOp in case Char.toLower(String.sub(fbinOp,n-1)) of ! #"s" => String.substring(fbinOp,0,n-1) ! | #"l" => String.substring(fbinOp,0,n-1) | _ => fbinOp end *************** *** 708,714 **** asm: (case (src,binOp) of (I.Direct _, (* tricky business here for shifts *) ! (I.SARL | I.SHRL | I.SHLL | ! I.SARW | I.SHRW | I.SHLW | ! I.SARB | I.SHRB | I.SHLB)) => ``\t%cl, '' | _ => ``\t, '' ) --- 709,729 ---- asm: (case (src,binOp) of (I.Direct _, (* tricky business here for shifts *) ! I.SARL) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHRL) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHLL) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SARW) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHRW) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHLW) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SARB) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHRB) => ``\t%cl, '' ! | (I.Direct _, (* tricky business here for shifts *) ! I.SHLB) => ``\t%cl, '' | _ => ``\t, '' ) diff -N -C 2 -r MLRISC/x86/x86MC.sml MLRISC-mlton/x86/x86MC.sml *** MLRISC/x86/x86MC.sml 2010-02-03 11:40:44.000000000 -0500 --- MLRISC-mlton/x86/x86MC.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 9,17 **** functor X86MCEmitter (structure Instr : X86INSTR ! structure Shuffle : X86SHUFFLE where I = Instr ! structure MLTreeEval : MLTREE_EVAL where T = Instr.T ! structure MemRegs : MEMORY_REGISTERS where I = Instr val memRegBase : CellsBasis.cell option ! structure AsmEmitter : INSTRUCTION_EMITTER where I = Instr) : MC_EMIT = struct structure I = Instr --- 9,117 ---- functor X86MCEmitter (structure Instr : X86INSTR ! structure Shuffle : X86SHUFFLE (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fbinOp = Instr.fbinOp ! and type I.fenvOp = Instr.fenvOp ! and type I.fibinOp = Instr.fibinOp ! and type I.fsize = Instr.fsize ! and type I.funOp = Instr.funOp ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp ! structure MLTreeEval : MLTREE_EVAL (* where T = Instr.T *) ! where type T.Basis.cond = Instr.T.Basis.cond ! and type T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type T.Basis.ext = Instr.T.Basis.ext ! and type T.Basis.fcond = Instr.T.Basis.fcond ! and type T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type T.Constant.const = Instr.T.Constant.const ! and type ('s,'r,'f,'c) T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type T.Region.region = Instr.T.Region.region ! and type T.ccexp = Instr.T.ccexp ! and type T.fexp = Instr.T.fexp ! (* and type T.labexp = Instr.T.labexp *) ! and type T.mlrisc = Instr.T.mlrisc ! and type T.oper = Instr.T.oper ! and type T.rep = Instr.T.rep ! and type T.rexp = Instr.T.rexp ! and type T.stm = Instr.T.stm ! structure MemRegs : MEMORY_REGISTERS (* where I = Instr *) ! where type I.Constant.const = Instr.Constant.const ! and type I.Region.region = Instr.Region.region ! and type I.T.Basis.cond = Instr.T.Basis.cond ! and type I.T.Basis.div_rounding_mode = Instr.T.Basis.div_rounding_mode ! and type I.T.Basis.ext = Instr.T.Basis.ext ! and type I.T.Basis.fcond = Instr.T.Basis.fcond ! and type I.T.Basis.rounding_mode = Instr.T.Basis.rounding_mode ! and type ('s,'r,'f,'c) I.T.Extension.ccx = ('s,'r,'f,'c) Instr.T.Extension.ccx ! and type ('s,'r,'f,'c) I.T.Extension.fx = ('s,'r,'f,'c) Instr.T.Extension.fx ! and type ('s,'r,'f,'c) I.T.Extension.rx = ('s,'r,'f,'c) Instr.T.Extension.rx ! and type ('s,'r,'f,'c) I.T.Extension.sx = ('s,'r,'f,'c) Instr.T.Extension.sx ! and type I.T.I.div_rounding_mode = Instr.T.I.div_rounding_mode ! and type I.T.ccexp = Instr.T.ccexp ! and type I.T.fexp = Instr.T.fexp ! (* and type I.T.labexp = Instr.T.labexp *) ! and type I.T.mlrisc = Instr.T.mlrisc ! and type I.T.oper = Instr.T.oper ! and type I.T.rep = Instr.T.rep ! and type I.T.rexp = Instr.T.rexp ! and type I.T.stm = Instr.T.stm ! (* and type I.addressing_mode = Instr.addressing_mode *) ! and type I.binaryOp = Instr.binaryOp ! and type I.bitOp = Instr.bitOp ! and type I.cond = Instr.cond ! and type I.fbinOp = Instr.fbinOp ! and type I.fenvOp = Instr.fenvOp ! and type I.fibinOp = Instr.fibinOp ! and type I.fsize = Instr.fsize ! and type I.funOp = Instr.funOp ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.isize = Instr.isize ! and type I.move = Instr.move ! and type I.multDivOp = Instr.multDivOp ! and type I.operand = Instr.operand ! and type I.shiftOp = Instr.shiftOp ! and type I.unaryOp = Instr.unaryOp val memRegBase : CellsBasis.cell option ! structure AsmEmitter : INSTRUCTION_EMITTER (* where I = Instr *) ! where type I.addressing_mode = Instr.addressing_mode ! and type I.ea = Instr.ea ! and type I.instr = Instr.instr ! and type I.instruction = Instr.instruction ! and type I.operand = Instr.operand ! ) : MC_EMIT = struct structure I = Instr *************** *** 318,322 **** | I.LEA{r32, addr} => encodeReg(0wx8d, r32, addr) | I.CMPL{lsrc, rsrc} => arith(0wx38, 7) (rsrc, lsrc) ! | (I.CMPW _ | I.CMPB _) => error "CMP" | I.TESTL{lsrc, rsrc} => test(32, rsrc, lsrc) | I.TESTB{lsrc, rsrc} => test(8, rsrc, lsrc) --- 418,423 ---- | I.LEA{r32, addr} => encodeReg(0wx8d, r32, addr) | I.CMPL{lsrc, rsrc} => arith(0wx38, 7) (rsrc, lsrc) ! | I.CMPW _ => error "CMP" ! | I.CMPB _ => error "CMP" | I.TESTL{lsrc, rsrc} => test(32, rsrc, lsrc) | I.TESTB{lsrc, rsrc} => test(8, rsrc, lsrc) mlton-20100608/lib/mlrisc-lib/MLRISC.tgz0000644000076600000240000535612711404435641016126 0ustar mtfstaff‹w§iKì½y[I’8¼ÿ6Ÿ¢Œûy\r øÚÅ£þ Æ2Ö× Ü=½žn½…T@©¤©’ÀŒíùìoyg–$lÀÝ3Ôî´QfdäÇÎöA«½ùè¿nò[ïùÓ§ðïÚ“ÕÕÇøïã'ÏW(]|ÿé×àÿž®BúêêÓgÏþ+zz£­ߤ'Eý×û"KOûÕpåxÒKóñm4é6¿žÿÖÁ .+ÍÿÊs˜ÿµÕ•»ù¿•OÏÿ _dew©Ÿ§yZ–Ëå`Êh\éà ~öäIÕü?]y¢çÿÉê3˜ÿ§Ï!)Z¹¦ú§~ÿáó?\ˆF‡§Y †½I?Fiq<,e$WB”äIÿ²ÌÊem#€Í£~:€ñH{ÑÑe”å0Šù8KÆY~OÓ¨—Œ“è¸?¼àÒÿL ‘ ž¥¥h£ßOsø»¶°Pf'y2ži´Ýú©¹Ûl·;»Û¿´[í¨¹ Qÿ•ãbÒ%¸Í×[Ñz´¹·{x°·Ýy½½÷sgë`cÿ Õ‚_ëQk·}xðvó°µ·ÛÆ|üÊÓ¤ÀÆžåVÔˆZ ˜sžôu¿×# ü1êŸðŸëT~ÖefD%ö&c™yÔvÏ¢­".çÃ^-ýµ–7—»i±—c£h/=~[¦ÑÜEq*Pi9é ÕGÂFYtóÃN´òu½ì›“þ6ɳ±Ä¥Ò¼·°p<É»ãam‹ÁÜk(®š·¤çžærÁŸüþןíϨOÐ;yƒ’7ò|8†•;ÌK;»½Mè–ÛÃÖù&ôÝØ¢ò4´Ne·¡<>¯`?àvÐc‹žÙ³`÷1Ò½4¾ñå6Øpd9ýn@K—Kjd§+[i|¸¨#ØÓIÑcøã¤_¦!¨£áXþ&¬é`4¾ 6‘ øÔû¡h"BmúY>ö{€µ2ÌUÒÃQôƒY©\2{ÙñqZ¤y×í#œ˜ŠN–¡@`;|T[ºz[†7¡ñÉ­]"¼ÏÞø3k”àË€þ*HÁ<Åæ Æ÷yÁI²Šax2Ic$²yëw}yyùóº5ƒµ(>ª=¨©­f5)Ó‰M}R¦%æ… Ut ‹˜ø%ß?0mJ‰ r»ÄÄÛgf ìUgˆ'‡*‹žrûB Ä-õþ;šŒ¹.‰¥¾ð © ÖˆbUÙö£{ (3.’¼„ýƒt"×MlüX¢¢Ÿét4ØI8ãé(3fœWq= Lõ”ø1âµMãÒËE @ƒW4œRÁíÎ5òži0.ЀI)R ǹH˜½ øõ;å!Å ùw†ÇBqq0d?Ä.à†š½ˆåI³,ø,Ãè£l€ aáitµª±âäßš?½ûnöóî°|–&㬿 L÷5Õ1ýþ·ººòü¹{ÿ{¶vwÿ»•Ï¿ÿey·]-£r8H£ó´¸ŒŽ’2ëCÊg\™_^æô]JtÞ¶¶ÅnÎ ‚Å×ó9{mDýä(íGÇÅp?ˆÚsö5Õõ°¦®XÑÞ±¾,"¤9°NÖÄm„Z&ØétôvÇgJ÷qîúð˜~Á,vOéÖŽ³Œ80Ö0ŒŽÒ¨ ³ L¬üè"ŸRqHÆ×û´w’–Ë|;Çb´”2D»{ûQÆ5âdcb¿H“Þ¥uù†f`B]ÿßÉ`D£bM|µÁKŠ™p3=ÜI ¨;ñW,Šæ}躉Ka°(t¥0ÉËI· ŒËñ¤S‹«K¡Ó/ÿ>ohó5ûÙ Ëåþ{+1ŠaÇ¥R"üY“ð%c‚ŽKîÑî¤(p×ñí Æ.#ÁÛq ´øˆÄh\X 1lda vóc›Êîá›±½hE9*Eó”»‘ÉiúÙ8´hë‘àד(O9 ¶o¦h:Ôà·Žõä÷ZØ8uLÎÅ<3á»H.ËhÔOºi‰-“XÞÑÒ‹‹ Xô蜽@†S%] zg-\Óé).qhûØóTqúe0R†Ð¡ƒ aQ]€l¢U øž—˜\F… •Íš»’Ë0 þ9íb{í+ò0-ǸÍÅY‹¦[d㬛ônÈԥߛY´åÕ‰ kV+üo׺lÔG‚2¾äÖÑ{ZÉ:ïC6.ñ‚Œ$'«K,Ù2Pn¦"G°a˜ÂCÙ„× ÔM¬:¦%)â›´ˆ’¼¯¯^ò4)ÛY/mÒ\±ÎM1ßê ´¬ß׫‚˜2If°w6HðÅè^oÒÅeL=m1±L°Ì¨žÉàÆæ˜–\̱+íÁ»Ažì4…#H(n˜h|1dê[ÒÖÉS<8“‚˜Tø1N{jô^2XF{á=+ >|awÁ6>B~ûwÖQ —% Ù76Xß~mN{ÓVíÃÛ<\“¬õ&0Å]<´8ROðŽ1ÉÇku˜÷/qË!=vPЩK§…X¦DžðˆÄ¶—4ôòdÆ{Ç! ü°´‹tT¤%½KJd\Íäè :ÏÒ‹›Œ1tü•ê÷„<õYˆUC¢¨Æ4Mɧ¯CÍäg•ñ³a*ŠXo(ãMRžnErig¶)óe6n§Ü²ôC7¥qŽ6“üÁ˜®Iêá0- ãAye`WÃ^nbÊNy²LYñ¢ÿÅ:Ž,«Ž·–i¸QÓ©Æ7aîJ/=Îò”¤¨ñ}f6P¸ˆgþÒˆ¤U|–›¯¶š“úEýìsM â¤F‘Ç÷’Zý‚ÿº¨ÕÏgŸ¯óÈä#1Ìí qóé#Á8sâ{‚ç—ÀÎä)Ðfáý«ÓQ*¥m€çâ6E1œœœFtÉŽiãÀ½æ<í_ÖÌÆ\KïøŒÆ7y{úâ¬þ^(DH ˆó š€°Ú–\kñÚã: fÕ“/M"°åiôîW_IèçÅñ¤~^WóyÖ é~½±½Ý>|sðöþzy°±»ù†ÔHe£¶¾Þq44`øÞ,ï‹–Õ'5–šyÊI)J'Т,‚Ëþˆß,³€_®ãœÔ^ˆFÞÏò³©¸N'¦…ìGg}=-qmr—™“BÝŠ ÒÞËšBèÞ6©Ëp#‹¦µG·ˆ.KÆÍÇ`ùndIIÙK=?Ÿ:ƒA4 ú1ZÕ(X 1l¬ Žø¡DcId‚¸ô”’fYúþ  Çywês‰âŸíÖ«fóo­Ã¨Ã õYhW]\>E„áE›¼ Îjn‹êuÌ£b‰‰ðd µ² §ß/²æNø47èãü€NÔqcªY£‡:\jPr¨–¦¾¿¹Õ~ÕwÊnZŒQùñkÞ+‰œ÷†i it1,¨äôr”,ºwïÞ n7ç•’”c“2²V»EÅåÃrCýe¨‡jŒb‹ÈŒ.¸ÀÙ ãl¬~¢ÜÛ{›ùž—x<ÃA@k‰”¿ ýd¢ˆŸ7ØáÆÁá ÷ögs3è¿8*È.¼ŒÖ׋´×Ta{ÿÆÜW³Ú}å9³vÕ†wîÎŠÕæ„l¹ÍÄÑV„wæˆ œš)¥%þ|>Úìê_:ÿûvgŸŽÆ*RÅC´n+Óña[w\â˜ÕßÉåòþ×`­áÑÈ\:#Îø<‰z_QèR\ Jg“™¨ÌÄïëYM43C£šÃQ)“š=NY}®Ë{ÞhÁš«ìîÐ8ƒÔÏ­C›¬r@ÝÑ­Âðž1ÐÐÁ¡ú¾Ó'l žT|uX</VÀÒƒo)t¸éH@xÒ9G©«qn–£qIJƒd$Og>t~TD æ9ˆÃšÍÊIãÄ,½¨hŠè£CqCö&µ&9C.|ãÌ_¥FÌçÒê1!Š’ ¶ÝE!¥'Áíû$é+Ðã1šàý‹#û!ã áðì’€/HË7yoQjÁÈfŠÉj}Ã5Rñ4æqˆ‹—þYˆ¼GQ˜lãÊ+ôÐñ5Ú) ¹Ãt]Q«B—Ìêî¡¢EHLß?Àc¡üÖüƒL~0£ïDúQ_I2ú™1IœÕ±¤C”]wÒEy}FÝã¶)yÇZ¸n}ç,QÇ:ªt7zkuq¼¯Õm€ÓHÖÄÁî‡Ã¾¼·[(§å^o ™Gy°K&¾j”B [• [µ¶:_Ã2#;~ˆ"ôŠ.vÜi‚O-_oˆ;˜û ž]Å÷0z9œ&½zôB1„Ÿ#zZ-Äæ”©„Ëš’n’ótÉ5}:ÝKÖÂkoÌzÔá«üA#"9àx³2«¢!]U³”­†w~¼ÁFÿ;¡ñô“Ì…hè¶=4HoXfõÞê~fò˜õDßíC´7ó9R%¸ª_4 |#ù´¹ÁÒ.Å7õøÊ•Ý=…ãµoFµmnŒy¨ÚÊ…‰ô+ÅB©Fvƒ'¾­,<õ3Ó¨%t‰Ël’ñŽ8gJë0…{ãC0מ“×Åp€í¨‡êöÞNÓÿxLþîÞn3¸ÊB%ÝZ¢Múh3y©’ÇqîÃòšrìèÏ?߸¸_Þ¿% eǼGÕãhUQÉøÝ¯u}Aß‚ä ]×Õ—tjù~0ûX®À”O‰¿Ò)à÷“^V Ïœ¤c >óDô¾JÃ6ZáUƒŸdà*Ö•s‘1¥,~1ν1ºÔ2UŸ$ÉÐC®¤GÑ•(R˜$¹KEžQáÇ×íøŠ»2wl ñf²¾ñn­×y÷Éì ‚›wúÞl sÑV¬Ó[£_§ÝàjÕªØÁÅê-IZëÔÒFðBÍR&\ŸKõ­µôõij­Kmßÿ#/¤Æƒ™Ó’™'¯ßty´†hÚ'ã`¦÷>ïŽ5HNŒ·fl!ºï¦î†_™È¾ûÕBæ½1Y‚é^ã¬NÚî æ0ù>.Òpsð•›üH¡º–Љ„ŠË¿–€×Ík£@óÙl1)ßÓM]÷\îBî¢E‰Ì¢´žQ|fqÓê}^µúŒºûYÉä‚ךÞì•8órÕ=ê§gµŠÂø‡Ê ÞSTîGÄÓøê´ ð?Ÿ%g~ã4dš6öMÓ O¯zö»R®*'¤€S­¶NòýãaÝ ÞÆðF—”;úÏ‹©ÇºÅš!ÀGž™ºzÚÝ;ØÙØ&²Ô V|~¡ÚÇšµçé’&½f %÷d µd5J˦nv%LWƒÖÆù0*³žÐ6_ø±ã”Ô˜”b>ãX®Ò‘æI"iÔ¸Á•fë:V˜Ö O´K¥æsC ¨B£¾óg½Xµ Ôîpüz8ÑÜ.c:‡w’‘Öry¯®Ôa•žk1 ,hÑ{rŽ`¨Çñâ;R±^ü­•—ÇÃö˜&Ó~[üõïùbMy°ÀaÐó{n«·°n‹lPý¼&¥²z‡ÿ“;ñ"ª<~åG`„Vj]‘]B|Qw8Äs«$íe›Þ^Ô/ø|™Ò­Ñ¯3¨›Œ€}¶Ètð*[!®º€?•íjHlu¨0D÷/<(n®™jzNfÐÎ#ŽózG¼ÕáÝ-ëÍÒu%#a ¨;ì÷Óî8¾OÛU´V­ÛÔã“B‡¨Q ­žX&Hm,Yw±¬Êa‰¼4ÑÊlÖõ#-œÌÒSk°áQDà’˜o[_`«>jTÆ dñÅvŠÙîâòŠ9ó‚JM žó>_÷ËF‘Õ0UÔA³}öH†š©0[*kz›aìÎñµ…OhŸ‹íþiR,Î÷ú4PÚÚ E)Û¸ÀÀíÅ·*@Ô‚B‘ø¡OiF|4<'+T÷ ©›ôË/jïeóÑM’ʱyÆ!tÈæä·E¬}ñ·jÁ}V¡sIh](Ò  ­-f<Ôò*Æ”gÝ¿…:ê®è!°á™ø`j•Á⺠=Á ^_‡u&¯¯Ã‚ °2ޏ†ö¨‰Ï_Þ&EË€Uˆe -±·k$YºÏ†zÕê’xg¾v˜üUì0X/Ì–xsH"ö¼lÑ€F³ü¢ÕTâ‚¶Àõ,Zy7Ʋ ›"ÏžèVx÷ qÑlÖ}ù…n2JºÙø2pa׊¿íå.à† ³™ ggQÎWÇö2þÚÈ{hެ”ks!¾öY=§È ¦ø>:`ºn?7†ï²Üýø¨î¬µ ÌW † sT,U[‚muE±¾TàF´÷1Ëú¬çü#ÿ‘€ß)½Ç´# Œ$Xü8'Esï~}z₎÷­îÙÆØJƒnžgãª,ni¼‘1—ö¥÷¢Üd;¶[ÈL™AN³TÙG1Ê$Í»âng…PƺAõiù6{ÿim–†ñ·£–É]y =qt¿.RƒÎMJrµFtïCô§èÞ¥µgE‘4ô\üi²= 2%†ÇÖ9e]7<54ßRbîX’t="µ¯ôÃŽ%R`@°á(-4òAf h^“² k Ïôaу©|hkÓhŠ ÚP0Óc‡ë_o˜ÚL%9mÞ:¸fm€ÿGÏþ/+–†pÁdÿ$Qãu¸›áÿ{åñÊSÇþï9üqgÿwŸ°ÿS}ôÇ‹"j,ÁQØ‹ÌÐ"ÆqôÆ:­ƒÎÞþak§õèk[yî6mç¢u Î[“üÍÉDØÞ$*#ß½ø"Ã,jP-†;'•_õíOÒkÙ÷ò›±ÿWWž{ö¿OVîöÿ­|¼ÿ›ƒlÌ7<¾&Y}ý3ÕY¿o­ÛÙjî^ÍÝc4Û_¿mkåwà¯æÆŽd|¯þNF{y?’Fºû‚Ç\'Yñ ‰Ü¦0(¨4}qšuOQÃí‹&HÑÔÈ£HÊJH9P,äþã#v%M·– %¹'cø¥_6ÞþB Òá6\+üÜtš«ÕEóôG pÜ: “‡BXOñs7N’}¾ó üïôUÓÿksÿ0ƒþ¯­<]}âÑÿµÕ;úŸïÿwœœ¥$*fJ…¾á4*Ýb™‹§œ†VJ`ë ŠCF(SœB°®Ík`ìÈ?‹µî!*CÇ·¹úˆ¸š‰™N$˜}²Qàl‰„‰Ê#²ÊãDa?ì£Qe¹ž'ö­Ì};sKeFw#‡(`^œÑ¿ñãµzðUÆ‹_;œr­DkU5žMFÁRœ,%Ö=.}CèÔ¾$Kúòþ©_¥X3#F™&W©ˆÐˆîâ8YÍêöÙÛ·ÊûRU›½¢'mZ­ž!·få.Ž`Q¡MçPš×ý÷cÖã"(/–#C¢¨ Ê0!Šï HûÙÊÚë ¹!,½!X2mæ«ÞÏ4×4媅˜cŒ¡srÉ€ æ)¶¬ˆåù¡ËA8bÏ›/Z³gXÖ›õ¦ªRÐΖZ‘zX«gâˆTtU’½&m\ö¼EÆ\Xãy’ŽýñÄ­²¬Žxï–úcô¯Õº±TV³Ä'lä¹3º_¦“Þpo¤ZbÕÏÓ”+7F4Çšë “ƒ#¯Tg Öš±ÐµNùÞ(ÖkÈ£siQ=\4ôÇŸ£w£_­Iê¸Ñë‰k$6y47õ±ÿ6½iP ]¦q­ÙhÚB&IÜ}4{3õÏã/ ž§ÜÞ›ºÃúgSöTT½{¬g8>&þ‡k«=„žê`Ïá{´*ÎYºœaûÕ1È@¿¿'Œ×ç[}EoûÔEþí…˜m1³0”µ=°–k„„¦óžç±± ¢þ ÷àf‰µp}#ê#Æm³k‰¾Ó’»‰ öÛÍ·¯ö¢‘„éÈW´0!«8NÃÔDßé¡‘‘„ˆpⵓÙk“Õ¤zw7vší(§ã9ÀaÄöé{ç\.j½Lgüv4wöa&›hdÕ'ì§g(ço…ÀÑ«+§4½‰ÛÇjB+/±C9Ÿ³ôwð5Ý±Ä =¢»ë’^Š›G´‰$)]§ãm´­º?î‘ËŸÓ‹ûBAÑ`0̽·‡:a¸ÊLïKW»¿t&ªaSmÖ—5L‡Ÿ¢£õu:Fõ@¹mäÚÀ}âM*QIźÃÞŠœ”©|YÕ#ËÁööæÞÎNs÷0R×UQ‰É“ܲnv– Bdþu¤Â¤Ë_á–WVa©E² t-Ò Õ¾9å'ÛÄrsc{»ósëðMgóía;x]©"}Ö|¹î2œij¢6«ØpÝþ¤“:€}Ôô69#6Öyí*w;ü䇜n÷HÀ€‡5Ï7Oä^w‹²·FtÚó”m%ÃxbKæã¶OòíI.x:ƒ½gîÜ-Á|º×ä?£‡²œ†Ê/@Ï :Á¹}´I§E\ƒ·£ô$ËÅýÃ|±ˆ,[ Lã¢ת:ÄuS¤v~Go´—mM%ü>Fvµ€ÍüíNš¾ ᯆñÛ…4¥tiüö‘*Ÿ@*»J81¤üíaèl„~{0J¬"`äoPÞÞ%2ñÛ3Äj¦»ö 6œß&ðg£(QÕý£Ùf‰Þ»þ¸:QZÿç«æMÔ1KÿûÙcWÿgíùó»øß·ò±t21rÌ;2§"³ŽúXo°ÎãÑ%¥ Õp¡žË ¨ü@#ÃÀn€£›9”!BË™Û4sB/Á®IX!±ªG1Q<–ã¥ZoHþãàDjšÖmˆ""­ðú¿q†~àÈ©i]–z4ZÉVánÑ…C£V/Ðpûÿ1ÉÆ) ÆñqJb* NäÕŪ¡×…N(†16ƆœX-ˆ*/¡È`¯[T„î€&2é?ˆ Œ T˜‚Tè×yZŒ9ªëmÌHÿoM4ñºtgèÿ=Y}²æìÿg?¿Ûÿ·ñ±þjááºS­¬MË 9ºh“îH†ýžZÐ týªUÆ_o­mn¿m6Bö!󩉿ŽPÇs­QŽºÞk¥¦ç*é½Vºß2xnë8*R´Ó âÌ¡›'¥ PA0IÿdXy“!R£=¹Yxç¥H”Å9``ìH‹ë8Ž€²™á›•¹±¡“IªLßìøª ,9Š*øuŠ ùzYÔBÜ B#Nך`,i®©Ë˜$e«ãO•?WX«Vz“¦@´r¥½˜´Fe@¥RëT´MõGg‰lU»²¥A¶ÙÕÙûE†Kæò¯“Tˆ¼ EËt,ÁD¼/;C£á@a”?wØ/9†&-µÞd0¸ÜeWg¯ù"îHÉé©/•Ýñ¾%7?×t#ø*в/EFõkk$wraÕÃ>oKñK‹àõ» ßÞ^òƒ3±¾x‰kÝáXæ·ƒnfHÛÇ_ýZvKžÛжØtó-„öB)CIv¥< Ã"cÈ.*5u; ‡GïC66/²[‰Oö4x€à#n¤/;@b üŒ¤Î5pÜ$»ÝW¶`²^gx;^=ZóOu¨J`^Vì`FV«v'ìîl<ìP—…xY¾Z™òzŽJ.K)÷Kº€Á7àpí;áýPçÔ;ð4E “ªJk‡6[þ«Ð=T7aô(X``qÊr2@vÓ`òñ~Ÿ»>5ŒåÚF“qº×ïmsjo!ª#;MµÓC EÅ5qTQª£gDÑ;*JÏÉôW …çlw8nÃôÓ¦ÚǪ9¸eÍæú.Ó•ê _Ò¹7dKè°ûz/¤0xŸtµ¬r5î¡í®g«è†*º!B§îÔçlƒ²¡‚RLÊã¬êL|²9¬ç´HêËÐù¯“‘’(ŽÑl¶Azör5˜ÔÙYª¶¢Ø.Ç•8É…£8´7jQ̈+ˆiÔœ­H üÕ©‘õÊÅuwAp÷P‚Sì?(0¥RX£YˆÈŠ,C:™p²–ä÷Е’™±BÔøÇäªshqý¢ò‰K ¨Ī%§ÚÌrëóÅÕZZQE½Ÿåg¥w\`{ê8¶­`tâL×¢Œà3žÊÊ©æCÛ'«vëü¡ze!<ÕhŒ“‰º Ž²P#ÃhèÏ¡ªÞã‘¶¡Žk¸ °,á#"ÞNrñ(‡\ÆNI—{¿†ø”KŸéWîƒ~<ãõ³ïaÕjÏ‘ñLuµóðâ4#ïwxÂá±(Ul{©›x'â.Z!\õD¼;çlJå‘HžÑø5p:ºUM;-MySàÌÃt+x.’%òÁðÐ99Ðükµf´ÂBƒâä¬çcy0QvéG‰ÏÁÌ]‡¨‡‰eU/ÒHÄX¢™¬)!˘)£mM&L%œ eŸ ÌSÆŸES á5àý¸IjFéê¥ð;ÝÉró ²àÙ8X®J>–¦DÕ(-†C ‚·Àé¹X5›–úxóõuo½‡ê)&//Mrf¾S8°žÔ0æ^YïB‰»®“rW!(KbÁáî{Æx‹r¥ßÓœ=lfbëFÀ*àmÇü; Çðaç·h˜b79ëý¶ˆ®ö:ý²E.{‚"ëé—€œÇ*[t™N‰¿þ,Œ6¢jÓ—Š€fOJV#þÅžÔHl3Îñ q Š/–}y‹ç’Züß”¥äIšdåˤ{v‘½—d»è¨yK8ˆ «²¨ÀTuÿ$ß1TŒ:§†è(pâÛˆÛ’Ž¨í‹1 ŸŒ_#ÑévXìæ¡ž!?sÃGü‡ˆåðÌ_ ?»ÿñDs$@3”¿>†/?«K-¯ÏŽ MÉŠ”Ü­O{Ñï P¹M”©¾yÒ<ÓԚĻ/`â?ǃúûÓú¿%.Óî[â.áFκ×ã~¦ÿ÷ç®þÿó'ÏŸÞéÿÞÆçûÿ¥jò–/ˆˆD¤D4!KÛÓtRÀ ë–ˆ¡ÌYr<Œ^bh¼Rl'Ť|0Ã…tûpã°µÙa3ÿÎþAóUk“ÇG/ÒŽûøq€ŒŠá1>W¬GÑ`gÒg£~–ëÀ “²+9‹—^Žï(“úæÙÿ_k0cÿ?^õìž?]y|·ÿoãûFû_ªš·©f”÷U ¸­ckÓ‹Ï qw¾†N7Ü;%äëƒæ_ß6w7 xÿ•êçH9PëL zžT ÊØö`fÍl¶ #ä˜:Œ.ìdÒd§¸žsàMàÃ(BNƒþ–ìµˆš”¥¥1”ÛhE(ð¯«Heí”úò,6¨Í!©3*ŒCâbx²É:šÍ&dm¦‚+‘:©™¾U*/”Óœ©ðsÅêÊ ¾¡’I–Èi©a|D6õ@عã'âSô~0n¬‚O&!§*ï1FzÈ¥ŠïLÐê¦{(üG“Î×ô$ò¬üé³ýê {´€âM_í®&´ÅMx¬VÁÛ¢Šè´ÃFÓšSŠDÙæ½ ç…=Lbf@zÐâ`Ü|¶NÈÿçúþ-@^ÔMI ›± ßAGZkRwü“]œî |AG ")öÔ²¸ätŽõ–’x ëþpí×B2G´s—)̓2(GÃI0íÅÄ(|2Á€‘“¡`d‚c¬0†Ñ ”=B$1$Ügõ>ÀK]ý¾õÙv÷Íþ<ûÏ"…ƒo” >0-¯!Ьûò|ÿ<áÿwó©>ÞÉ’YL~”t»Ã‚Â:ƒOAª R!A°á,Z=² dÚÏÈp›Ñæ“ÁQJ^ÆTh€‰äEè«âA³ýfc¿)îŠÍv0ÎPÅ Q,ë—²Þõ»!}sìÿ¯6Ÿ¾ÿW?[{ìíÿÇwþnåóïEŠÊqùIʱ^ôV{–ö+lõ£~:€MŽÐÉÐQJá²úÃnÒÏÆ—ËÑԛ߽!‰…ˆÝ;}î¥ïªQ\Ü›œ{wûÂû™äçw4Åêy÷´WÑ ¿ììmÉ.ZW´éæÊÓM‘uîÛqÖ׸ñ׬»›ŠŒfju‡…À¯ðwhpqeØ.ïÎÔ/ªˆ0î PF±ß?ŒqfV¨G£L]¡?m`dº¯îÄ‚37…ã‘TššŠ„ —u–˜GY†”ÝöŽ£È.ƒC¾,óŒ—3®SDÊ–À:ÎËVvž¾™—«ÍÓ´{m‚ž®ø±¼7„æåÃqtšœ§°&£¬g8Œ$`µQx‹£îÎu+v”¢_‰<æ-rz”ƒiÊ£ÚuµƒL¾»»®bñS„Þãªãl3‘.!ßÃ`”BŸÝ¸9㻟{Ãì&yGƒ8]ž¥ç4U«˜8i‹\Õ9³Çýld^œ¡ÆìqZ`Ê7œô{*g;.­ªN}òl\ê,Rñ:¿KWq'ÁÝû½ºúbµ~Ö8[Uêªâ¾ZOÉêgï¹6]HÎ,$kˆdÍE²†HÖ>×~õœþ1eZ_f컟͎qþ¢3þ¡p \’ï\ð%R'WT¢\׉çæ{Éjôçè^²æÀá"DŠ Ø`"¢w¶ÇTr°£õ¨A]«.8¡»ÐÛžò®O4r×(iÌûF ¨¤7PØßU¶&A$žzaå§«õtýn*ý5š’Ö¡›§'@47=ñ‡DxD½#òÕ©ÑA«•û3ÞgBU‚j9«æªS “íÉÜìµöûLíâ݈±ûÙYÚ¿DLø?T=RlÚ²s6[¸#`;Ö²ý .›šÓñaó ·©7ò´·bc—+Ckç*n+3ùÞÖF£/D bƒ Ò©‚©¨ÏlÔŸ¦Žš#9æÉ2xª¨©nPø0¦©9Ñ’Œšæœ P¸š‘+¡â”NÑ€'nÓ…~Åø«Oó¨~ØÑÚ÷€Ø5 <#|šÑÃ)x=™Õ„êA(rÔ¼VMüYq5œóræ3VmFÒòÚXðH•>„£0íž?€ÛBöÚÿÅÑÕ 1³È1À/WÝ/Î}G#ÎvTMmÇó46UëwNÒ=S^9ºj0˜ œÙºQÂHfcôÛH$Mè±Üj·y®‘ôˆ¡®ÃrãÜ©ãry{ooÿãiš êl[Ù>\§ØŸ®ˆ&EÛ#—c‡ƒÆ¾Lp1‹«‘4£€tŽÐüDlOëÁìB ÖÈÈiŠ]¢è„1TQw9U? GÕCEæé”Lù”dì~0U­_­è/ãèä“Ѫ* ÜÅŒ>Tm* OU±;¡ñä„Áì A½¤_äܦã\´j+ UѶi†æ$¦§vùN´ˆž½Å•j¡„A©zoÞ»§ñÝâÃJÅÕS ýÉl9Çh ;Dz³·³hw€póª,1›t›ñ1.ø–W‰m2ìÄtãI(—Y®ŠÜäÀTØZ²ÅäR<½(:gp×SPnáñ[ê}Þ΋,˲›¯ªòƒ;FjÈml$ t ´ÖÊGò%ç„¶ë`Yþnx÷B:{iq’nôûv¦uPõj~»PÞûOŒÎu<úߌ÷ßÕ'O]ý¿§«ÏŸÝ½ÿÜÆg¼ÿÀÿ¤°²ñÕç0)Þ'ùƒRû¹âvkc'ú_¡_†,Óêÿü÷jžñæi¸ Šá‡l@FY1> µ* *ý€nqK ³ETø5&'hPƒþ³Å}èe¼G¸c²ïþ­:Çf2/Þ‹†pŸÒh”ŒOññá"…­øZ¡Øûñm,¦½)ˇŸWÍ×á÷d|ZX^íí´v7÷:‡ͦ 1ŸËâVñÕáÁ[Rpn;X(³ ‡‚ ®‹\Ï™1ý‚ôåMõÌM»ð(zÝZ6ƒ.ým.wÓ¾ˆ7ÿÐüUƒ\YLø6R>jt‚QCñÑÑY·ÿÍåö°§½MÀ 4„þî`eôÐæª!kìà–=t˜ºHè^4ᶪ—e>ÿûjTÑÿëñüÎß,úÿøÉS—þ¯­ÜÑÿ[ùý'r¥è×è2®Gî´Ã$L}Ço½‚õ‚%žM3ç$šæƒ¼¤Ë¡gøWâ™×{FçGxåïÛ&Âòñ¼åÓ_IM#ÿU]<©G>ì¼Ö¹¦Ÿ@r7kêI› 2üçmÉWK½Yj–B~†;>šã‰NîMð2üªþ–D †1~ôÊ4ÍÞåtP:[_ÏJ |ó7ظWŸ`-¢·HŠXhËzo}ýU}²¾þÖk%aøÂ….L3öHÝ=2u9¤1U*¸<œd‰–bÜÎ8~ uô«Ö5÷Šÿ±t’æk×x̲ÿyºêÑÿ§+wö·òùú_G“¬ßCý¤¢'‰8†*nÜ$ ÑÏ© ÁAö7Þt¶š»ÏíD§ia†ÌAP, ›5™ôÇ L§;TÜùôš¹E²¤øÊ,ùtå1 ¸³}X¤)Jê(óÙsG­LpéåM±qB˜ P•,³/C®5DŒ>U8 é*-µªƒ.pÈÁ+ëlÓ\ÛÙ‡*ÛNß— ³“_â"C†MŽ#ƒÁ3èüÜ’R?g²tl«U¼ìQÛËÒsg 'CUØ$‰;:™óô‚ñÄÓ#ë§uýÙVAã8㨡ÁÒe…´ÚË‘ô\…•BEÕÑ0IÛ‡*øÑrÂh~–4MĤ8Ÿ(àc½|ÄÿÆ÷ÐæY@üh…4bª8~¨¯2v¸¼º ÇWo?3¡a„ÔcØTÇz …V£> óˆoøw6£"F‰‰†ý¯¶{ÎX“zbz¡–¢=iô°s´Þ@– –ŽÒŲ•ÂÕH‰0ƒsÍŠéF‚~½åÚ1£ê nØÆ(·ÑÜM ÝèoŒ*£7ºñ£iÝ5¹1ýv8ÌhjÜš—Xê•ç!±òœr8~^N´!] 7ß lªÓÅ’uá9œå ª¬tõ@ꦘ0… `רKÙJ©Õk5“ è•î”L,9ͿӴ\(û­©»ïÆ>Oþç,ûë¨cÿ·öäÉŠÿ÷ÉÝûÏ­|†üï= šuž=ƒ+öyZ\¢[Ÿú*Òñø’Ë¢xŠNP¤X¸5V°ñ…ß:~\Ñ þ\`>kŠ ÜòÞÏ壷òf»×ÀeÓ#zs_ÂK*$®n•œJ¼QìŠ;ÍÖ!°¶$ˆ 6¥q‘+ŒLË-%R­NrRJ³eNGŒBŽ¢/Ú›ŒYXµ<8ã?^NŽc[Ήëª[b8Js•&›ãš(íEÐ*_ßÚòÔµâfW:£•}Á~+II„r"f ¯rQUR¥˜å,Àú*@`kV>- ”Ì„†ä$‹Á·‡ƒ½Ê´G(Œ¾¿-bY[áî“‘ÿ÷ñâ”üŽUË0ÑjÕñ°ß+ØÍï‡úâ"ùõýà×%ÿø Úðü½¸X­ýÅÜ•åñð,ÍKU?Vc›~Øhw¡î¢Ùf™eèä)µáx¥æÀs™ã8 9'©hz .«ÜÁßGÇÓdægK«ÐbªÄÿ(«ƒIw U®ÔQ®g?¬Ö,!Þq\fÿL¡›KÑ*=M²ßqÌ’C@³ó‡é\éóßÿlvø:ê˜áÿáéꊫÿ÷ìñã»÷¿[ùøüWQÀ(T}¿'ÀEÌ ²eyp¡`tÙ¥wˆBl†§OC":ßç{³Ãˆì~8y/šü²§,'ƒÈ/ï+¾ÁXêˆsYvzéGýXÄâú€xÃQyQ~‚}ˆíå‹cسðÌQñæ½î^Éû…ì?© »/mþ¸ÉJÃ/šáTö¥æŽ3ÍúeÒ÷d([â(èÏ–ÎÌ›5:Ù[œ½ÈúY#ýÙñ[0£ƒò„Þ6€ö51e§„ƒÿˆÙ^¬ ¸ÖX:ú\е§rán\xggá†÷òzäÆg«iWÞ¬6ä9Ô‚¡ù$$pŽ7?8ùq «ÀUôTçkˆQ\Ìz‹v´¥¬GqÊ›ŠåõÛ†¦ð"(V0äñúz§¢/VQá¬?ÔPÎòÜo£Îú§õÕ7:Í–ìÅtÜaæ“NCùi>F:®G$=Ú[ åx ³¢|ÉzE;¥û÷¥ÌûQ4ÃS½ù}¶;pТÛcì±ZDF#þƒ–`ôY>·¹E0ò€Q€ˆò rÁjuü0ÚèõЯ*:£Ç1 N2löC#.ä§÷QÊVOõý²¾]ÊõPŒô”3êde­&wW‡D‚1‡gáàmyXx:ªcèiˆÓ~»ùöÕ^4ª9¨<öá ‚¼(Åñ 1…ùm—Þ/Å=UƒôÝš¸Í±L믯o—~ùw¿Zce~¸ƒó¬<À›m~ÀË4Çs è=†;´ÐÓ§èà wvŸëIÿ6w‹Ù¨‹“µ‘À!ÔÚÀGŽeѸ€=ù1—¾ã¿ú h"KwC¤™t”6e²–HPÔHY-FÕ^â{Ø×@›Ô¼ˆþOóûI![(2IT‰‹ÓæãgTN n5+\¤bV<÷»Ó©yŽæ›ÀuʤÌ1VÕ##›Ü·ì\ôPÈ‘àm-‡"™¦×ÀyæÅ7…VNÿìMÆã…cj¢¢í犲Ù»s‚F7¢{SŽª€Ý:Qˆ™*U©ø$–òžñ ×ú}¶“ÈNë§æÞÛÃøžè—°¬HØ2ú™$R;“ Ÿ‰’§˜H> Û.É]ümÏSŠC_2K°=ͰZ}Çä¼—½,ÏO~³Ó±?W lÛàç)`¬ &Z)ª3¾Ï&l÷éÑ‘¿!%¡+Õf¾Ç„ºÊP×ð¸a è¢A§ƒÓÚABˆ%Šn ¹Mdïqb¸ï\{:°âîqË£×t°¥=ÉÅÓ6Y'kË{~ô¹È¹n{*\³q`};ñPhjRÝÇ¥¶Þ€e†n°ð— eéûËÆ™g§TÃ<^Ì%§¦õ-}bI…ÆÕ|D†Hyâ9ÑÕS2Æž \ù¼"ÚÔˆÞŪÃvs©³à¯4?à¤÷óÌå‚|-{̘{ˆÈÏÇøªG—›½Pt$6Ãá@ü¾~™–õ|Xa "|ªeÑÑê4‹~Ö› »å7?íb–Oý9H~A?ûy0¦­÷} \z¡ôe:ãzÄ_U`@òWÈh‚ ´€üŠÛ‰0‚‡É„©yQ«Çgõ³‹Ã ¹úi~`Ôh9œñÏ•ð´6Ï\Æö¶óÜ A£*½%ÏÌ’ø‚BݨåPë ;ów6_ãÞ{{?­qÌÓã=ÖüãÈ -/²1Mh'@Ûå÷É=³¿¾þ¾*blt§ŸzÔþ¹u=:£IrPþ°Zo‡nÕîT86`Ðë™–°»5¯Õï ì-ÔHwILîLI bî—ö¤!ïAè28_þD@+áôøU^¯ÔƒÄ@Þ—¢»Öè­àØM#Ûìe.íž¡7‹ÎQÒ“wÀ80êâ‡H+|ÐDjÇÒÅN-+ˆNµÄ@°÷÷áˆ%â{×ùU8 ƒh˜÷/ù¬&3!!ÆžYžcíO’¿Ê „è•o˜N°Ú÷¿-’ëV2BOÔêÅð…·æ¹1QfM`èD"NSî׋~¢ð²j÷‚ŽGŽ5N`ñîŒ8>׳skû<>§¶j¾ˆž(fÁ(¡Vv¹„.˜n‡é¤V­¯c›dÄoaa©©^Å*Ô¡B¾®ió.Âã¿Ñ²ÿ¼^ï/3ßמ{ñßž<»Óÿºß7ý']ºéé74Ó4“× ú<²})ÑŽÆÙ@(~±_eHg7-ô©HÑ÷ bP5Ì{.ö_Qƒñ>¦zUÙ‡\cwöö=+†¿óµã ‚§‚,£á$™Mâÿȼð"ÍNNÑ óçeŠˆ…8n”I¸C2#}:´7­ó' ­þ`{ûö1å O?E,ƒ2¡„€Ñ{óË~ó€ßÜ)4°PH„ÃëMy#b >²dóÄ.ë­“ê“S„Ù_Vîí »{‡ÍuZ/¦=- |“!q,‰ó´€3¬D¼ÖFìž³.¹vD¥Â$:N/04E 8Ö\V‹ä‹¼±¸ìêÜ:à<ŒÎÒtD1mN…¦ÿCê–òžœ3ô¦v.ßô†¨ô€X„Ù3Wõ³átr–RØ2h^ÆÑ«°»Íº¨NƒF‘t´ÍW¯ ¤Cr­6ÐÆIè¢@.*M„òæ_ÀÖÕ-’M"ß¶v ’<Mú2 s»ÈožÝhTUÃÍØrýð‚R‹Wœº6|DgNz QxÄzTñÁelYÏâÂX+1è-æ#R¨ˆ‰ãXÇFb[Ä‘~H»ÉÉG—Ö³¡¾Jlô‹ž}„€²avÓ”fTnA‹å$>czhŸæòyÓBʼnÊÖµ‘ÅÅFñ<Ìá2Ÿ‰«l‘-EnÚHRH>/(ƒ|­¤‰,‘³G›ˆ!1¿Clý'¾í¸S„KœË„ŠÜÇ.⻊­(«®–ºì±tÃ=œœœâž"û_5“ÁV Y>CᘥÅÉ´*º)®êäpaÌõ '½èd•bMá’­WM$QV„ˆÌƧQ‰ŠÝ4ZÁ'|Ð EP"žÑL½š»À®ÅiÀð6[軘cÛñ 6ê,dÉ.Êà÷Y» 4Œá Í¢eü­`èœmˆ¹ç|L²ù1–²ZRü 1{chL½¢¤<’¸‰NS¾÷Ĩ?Scd¥,¼`Kýˆ#ô§'@ÓÞÿ `2Œ?b>ÖÔ°ÕID ëm-à 7®éÃê‰ã€ãê'àÔ†“’!Ê«¬F©ß]K]îºZ¢ã‰çJd/ɽ^™Ž­éCØyãËÀJÄ¥_vâNð±3NÆ´‚P¿R? ÑsΛݭæ+¨%fK‚XúÅÃkµp­76þ;éøtØc†M1tÌÝÒÀçé… ×6A§5£#´Å`¬£ñed! 5Žù˜³VR1ƒñV謰ó£ƒb¶îptiwObãò":2F—*€Fä¸Cˆ+…(LŽC!â¨MEé•Ébx¨Â‡,j²a^Q=>œÏK3ªÖºAœ±ïHĆkÁÝY4Õ°3’²LG}sÊ ·S͇TÓh‹E²xy:¼Êzó{õìB!¸»©Í§!¯GrJT®EVçà°[˜!8±OdQIÀfUÃ?9’JÒì¯ÔˆÇ %Iq†Ê‰ Ì\¹bÞUɉL‘baÚÓÔV,ͽ(ãµ…KS½˜‘” ”xCYÞÒ½4°LádQ¡Ø4ê´Q[Ì L&kyhp*à   ö‹ãp¨[zE†ët«·ÄcɬrFÓ±Œ7]]ßCÞí.Q{ð¾ÊŠ¡Ð\\€fÜ̆|MF‘éÞàþÃ*ÚãË~Ùƒ<#ÛN.ÁX.±˜‰‡Ómý#K°ú!›µY+R˜XÊ¥4Žç“»U´b]DY§–ÔÝ-ÿ¹¢m7G_³·Y’§Èk–ãÉññ’ÕÞ mœÐi³çmrýE–¤Ñæ«-ºÌÍý.–ÿ_§÷ßYòÿÇ«Ož>÷äÿÏÖîäÿ·ñIûï4dÖe 쵉·%èÊñ«\È„xºðÞ”Þ ge¥'Å7 ok0ê» jíìo7wš»‡Äןe3¥!+ ¿%w)ŸȮ۶—2ܵ[`h3¥z…µ°½X•á”Fl;a´p†=ZOè5>X8#Ya?µ-Ó·Ù7‡ ¹aÛ±$ÙKAqõËÉŒ§“ùÞNæ|<™ûõdÎç“«½ŸT> D —#Kw…é×#M¿qú5ËÓ¯] ~õk©_ƒL]Za]ƒPýK¤ê_%V¿.¹úÕë_!Y‹ÖµH]³§åf%é×+J¿^Yº\¡óHÓg‹Ó+åé×$P¯¨âsÐìýUDãs';œ•a¡|½÷žH>èO—¯› ×U½·Àæ[Rx‹;Aƒ0ssÇä'ä8º¨•¸ˆNåz´ø[åÒŽ·³<}Y¤ÉÙr_þ=Z­ÒH…6—1ÖL;5Ô»5d6ýÐMIm a n…P?R”^Mùȳ†@l-è“tÜ8Öu~þgR ¡FÁ¯S«€l:–ŠódÖ;d«µ(š²¾ø¦E>ß肜ûÁá†&Eá0â²u0øB[î>Ú­«ðŸ’ üTYHƒ Õè>ò“ıä(•A¦eª/ çCíiÁѬ7¢wý__F©-ôYó26Ž(¿:è"Yè£5?ÑYšÓì»pªN4ôAœõêtÂ1Vá@µœ1Y,,ê€{ôÖdPôË1ÙÏ ›9“¥d3¹w¿z@&›X dò 6¡3)£DfÃ|6œIȇ4ê)õÅ´Õâº<×·1®tüߣiœcxc2 ó!¿pŒe|Î9†96U]ð³¿PqÈ¥ƒ kñ Ohû«0 ²¥wUAº¦V”ަÛÛ×¥T1ùì c1H]Q p¤(‹z&C‹;ŒB Y ŠSÐ^ž+AÓ%ÒMzx3Iò Sd\Í»¨Æç Ñ"¥,ªÁ2 -‘AîíY¾Q²€¸#cð—†ÛZ}²@¡xkox¸‰Ä÷´'¾¤(·uuô˜f¬ |º|Ã1ˆcå_/‘—JèÔ”_Ðj"8ò¢Ã ì±ê!’ßß9¦Y/Ì@-þÅ‹¿ý¬Mùm±¶h!à¨è_hc°·¸„ªEöÀ¼¦Ç†ÀÀpŸDϧuV!Þ6I1“yql¢h/–ž}‹<Ì‹ôÉ”í®¸¯bYøì q‰3AÄõ@ôÜËa‡}hJV/ë}á+¤\_÷DìÁo¥~^Çñ_0a'ªŽÅ—÷ã8¯¿;WU4¢óߦԑ×Ï××e5XG¾´JÕ’sÃóz å%iúyŒÍ±«/.¢1‹ /£É+&^®Ñ¨û‚ÖQ­F¸¬BŽ‘² ×bXäÔd¤à½ó´ ™8ä“ÔxñeÒYþ†lãƒÞKú¤1áÞÄÇwA|6y/×.»f»cd/ŸPF­iÍʯbxØt‡Öó¸é9vÀñ4K›I¶e6)‡[ú‡¡‘‘FFþ2ø$D¢}²œ3µO`EVÁ«À‹ïñ ØP™faN%ì§ 4iuÄ(}“¼ƒ]Ö mãPŠ Ó=¥Ò0æ•ìH#+O´ÁC£Qâø¾ÉíGZhÝÜK¡äY£ž_X„/’·4’o¬®Xìeë(׳À‚BœA®y†w SlÃEVf”0å7!G]O{²‘€¨Ùj©wUñ,Ûþ°>R"É{$©Ò¿=æýfÆä¾ñÓ¨ü*ƒt_þÔåç®·#Øà)/(¸<¡ß¤_ê"jåĆ+1sxÄqlzOŠÝ#øÝ¯Ž¹¬SÙXˆ¨AÂ¥Ý^öiò5 Fß´¹t€¥“_ǵIV',Á"ï¯ÐÔl¨«Ãû«7ä}‘ØÌ_…G qÁ`›Ó‹o%í•Â3œ÷]Ye¾Ã$×±Ò{ëlÃÒ286k:\d!U\±­>JŸw.CçsuÒÓYšõiÅøãÿIdÇB8<Õ1y"}¸fÖ^HVU¸#K(Pkg(‹¥´GPî»uÇÍ´ "Æ~tùÊñ1ø$öÈ$“Ô- pÇ‘7Ñ—³Ç† ƒûÚ\&}\-s2Õ×LªP?rÉ&ó\ªK¯9!Ç1¹X°/Ñì‚ú%üKR ³¥µ»¹ŠÂ"HÉÝ \´KkþcÛôþ¨fN°? ‡Ã¯„ŽÞèÓÁuÆà–ž2¡¢SÁ6Ó¯C‡M²ïå.@ˆè"À¶r©Fò@0É?R<ÁäAm´bì»·¬Õñ™SÖ(G¾?mRR1Àû ~QOp”Ò²ž–êìàݾÇ3dÔ ™¥õägXà°(6¹`B¢ŽyiS¥… KDêÑ{³Ì'În³á8ƒ^OûÙ€H ›æ4]>©áÔ¢kŠÆ87iÚáØrÖ€K@¯ÔB™‹·Þ­Âÿ׬Òöÿ„E¢?E+<°nÃÖ££DxUZä[„)€ I|‚îãLÁ½ã2‹›fœ^tØF–b½‰* ÈòÆæ¢=éÔÆÓÔ©ø¨®FÇtó@ž÷— -þ ²²¤çg²¤X‘}zºòJWMâ%ÞutÊÄM…sŽ|@a5f!á×/©¤òE}†.ˆUrR nJnîmïD‹”°(³ 4B2³!Ae^‰„‚kË)‹ªH©¡ìl 9]Am¢¨ü2çÆŠ’F0…ëëFŸåòQtÓàØ©•Ð9¤5Ä=Ê—(,0M&•’ŸX,ä<‘úe¡…Ã!“Õž¼¦Ò²:•PŸÂôºŸœD‹hö²$ ôøh£ÒᲆB†ª¾›2:3ü: >Qçõ#-ìŸúèÑUàž)Ùv«½^M1ô‘3a×Íë€5­šzLE‡“üQ ÀÝ.çI°”´@„êá0òhlPÀ…Z~"ãÁ›„À0HbEºmÚ~")¶¦¨QÔ–È–É ÐxySæC u§“IŸ¿x‚¯4¿Ò3õ^5'Lõ—LIå+ÐÇ“ñ¨?I××e &±‰^å Ð¾§ZžïTÿXø½sˆŽQÞm“sÜý 4·Ø{ÃñèÚ¯rÍY+àãÔõgá6Öbˆ¹$?G"¼Ë¿±«;ÏþKD€íž&Y.‚ñ~m3ü¿­>]Ys쿞¯®ÝÅ¿•ψÿ9ö&ë3-PŸ¶ŒdøàH®…(è±Mšzñ•|SÀÒî2-½ä[7B£S•âYilÁU5goÿ°µÓú¿ ;0ç‚])¶ ØÉ"DT#žS«CM9q½¨þeçmp©¢H.ª"Ñ‚e4ÕÂ<Ò×N½9ï`AÌ£ê jYcn°u3ÕÇ’¬<i¿GV>…­ ñN"žU´è¥.fèð¿FÚ ´Î3¹L­ ½;<$‘šygÚEYa7%Ýl|)ŸÎ$@ü0Ú·¯^º¦‰îßNÂâ¹ñ›¤<=LŽú)Üóèßxõq]µÀºï%½ž ;%ÙsªÙ,ÕÏ&£pAÎÓÌ‚çY™¡m ¬œå×N¼[ §x²Œ"õn•—î̧nó ÏÊÃ";Ï’þæpt“ §£Â9¼€EdƒÈ *¿Olo}½WÖQ ©¬rW½¹Œ~÷6‡}Xš½:@%y\ØXÊzr™nÔdŠœ­ny¢ ’*÷0DCYtkÁGƒWå¸]tY¢h1æè'Ýh‘,oqÖ†ëg³]Ôú”ã:—à”þš.7ÝÝÛW—i[RjmîíÿBâÕÐ,$¬¡õ´ºÀïJ~°[‘gëë½ðP‡£Ì˜B’•æNÝÊÎÓ\:§ia´¶*†Ž! ‹E´ÃIúýK}µòÁÃ(,ã ,GdÆ,÷ íô¦8¢ ‚Ñs;RÄ8×@[¥ê‚|¤¥ýã%„+—qÈáNÞáûggóÍFk·µ»…HÑ¥Ó›ýzt‘’ÇEÅA– ?‹Eº¬Û0LÛe*G! ‚Dy{tv¸+ÃåÎ[]‚ ƒ|ë ™et]Vu¸»Á¢MÊÚp’$¼’ß¿A!ÅÔ*z3ë/’Ü¢aåñ†PQõj)ÇAWþ,iq^PD*Ä·FD |ƒ ,U¯ô½n[,N”¹bµIœ9ï\ªiÓ̇ÞÅ:b7ƒ†Ø~ïù  ÒѾþÄR ¶VB Z «¹Œp5WWÒV rÌO>À¨'ŸÚÌQ„{ ©Ø}Uc.7 ^”Ø4Ö¯a2¥ÞˆÜO„Ÿž€(ûcZ[¨C2- ÆÈæC—U¹7Í®2Uê‡Á¡™¾Æ¦µ©jqT¹y——¢÷ôVH»~®UgtpêÊ«Fðé:wŠÕ^ªn_n´+³·`eépN ö…J/DÝ_ªãÈ>;$´ˆÊÁGF¬ˆ²UØSÖ•ùÓN-!U‡ºLÚÖpÉ¡ †[Kç‹/º³àÉJwÏIü$«,´­¾ÎU €Ïî†Ìq9@»ú8«O;qüð^ó9rR-¤¥Ec_I©xwÉ—äþ¡«ú• D&Tû³:s5žpOti&3ìε /¡0¶ ]äoH¡;toÐÔÕS[±ÞVÕˆ† ‘àCªåêÔ;¿VÄz‘'™¬£±bâ@™*u‘ŒìÏôÄGq™ëú_8\Yÿ.î¡gã`4©Ä ûw3ÉŒÑyº{Îy0é³ 8Çñ/£Ëtìž{v±ÿ¤ø>Üó1¼{棃ÎÚ(ªƒøš"w6Û PY=ìm· È…kø&J~[/P$!áQ4án|ý»ˆ„=ù/Ü•ø1 ¼¶0 Óå¿ðë©ÿãÙÚü÷v>_þûFDDŠôb‰~u¬ŽÖn»ypØÙ?h¾in¼j´Ã¡:lᯔ5ŠCº2)T¾!ÿvÚïó›ºÿ¯É àŒýÿtõÉŠ·ÿßíÿ[ùüýÏ»±œ±÷Õ³‡mÝ7€çzö¹Â£ñâƒüœÿêso>Û¨ÒLYø×ü¯>?G‘ ýó”W¤êG­ÂbÐÇi/1l‰§‚܇#wÖ®ðtD~_”¯!ù¸ UÊ2Ú°ûÚ#œ>„‘™}5¸ô@)03&m‡b>¢ÿ‚ðÁ0eð&>ÍFãØ4̇ƒìl±ùÌwêÕ¨vÓ²ì{§ŽËjy{ooÿãQÒ=#&½—ÂÐÚQY˜ç³®p I( W@ÿ•üùOåœ"¶>ÿ“]<¦{—×X…Xæ6°õƒ0ÿ6!ßm\^À}»™£ê‹ú™Y¥Û3¿n¸"lgåx9ýÿ-EðÍõ÷„£¬‘=PïïïÔ"5À>6™tè=^2¼2Ð|QìÞEôCä—%ù¦„¹ •hâ°Í‹ÄÒ€¹^ñ±pfG¸`s$èœé•Q“Ͱg´€¹qO7< ™ZSlϲ`°° òߢð’qä…_q>옸aͱµ‘#1`~ÙTh86L©,‰T×úŠ3¤‚ÖŒk +\aÀ’#Ø’)ûònòÍèžñÓr9Ö¡zììÙ©JicQ]Jü#GÉ)æSì [8¸³4ýxgÛÉ éÕ²éÀl¡cjjÄÌíˆMë̓¤|ST׬C'sˆ]±Ê©zÑSラjá Šn8¶«+:ªUˆd‚2žöÀS4Js—2iÁŠ6éÎÚÒ:uÍ#ÅëJO,éˆ/ý÷’Žüû!ÿïK’I%ý¿¯Í’ÿåcâbÏ_0´E5=\ˆ~^þgZ ÃeôÞô/3ì÷:I.]Ð>MH0}Ûœ!2 —6êÂ^5$ޤ'(˜¢¿EWRrRÃæXñ¨~Q«W >džV/u}áO>ׂ;a¥HÕ ¼"«Vè«r‡C[œ>À–Íß0áDdj›”DDŒk"ˆk7_§Ä?Gð§¥áÏØè¯–þ wú÷âNßpê¢]›Ú‡úfðÿ«Ï»öOž¬>½ãÿoã‹¢U_Ô–×õ’£¼]Ѝñi¤úÐç‡I^¢ ”ucpt¯«¾ÏrHÒQöCòQXŒ‹ÂîèLi»—9z)Fd}F¯´¤ê ‚ªý¿ÞèŸ3éÿ³ÕUWÿçÉ“µÕ;úŸ¡ÿÿOºItž—Q™ Fý4ºgDKŽ<èGûI‘ R8(²êƒC.&$8GýtKAÑ+ïÃ"w‰rÍL3OE®”&h˜½UÙ^¿Æ¨—û$B SpÊöi:;^å#ˆxïˆÃyY.D¶ø™ C>ÊÓ@¾Ïb´‰Í>Hab`¨è- .çôb¢`3iùÌ¥ 8-P89›î]ÙþÞQi2¥¡¿ª ¥k (Ťqw8ný Ÿ6Ñ˘Ù"¢Š%·È0xÞ_†sÒj:År6 <JP: ñ è3g^þâN± Û1ÚÓHŸv¢û`^Ï„«O.¦46uîx]v E,ª„o.d”U%u=¯Ó•&êSÅØCIþë EÕl@aù÷ÔÍ–Ô§ÿ“£’#ËJzÕˆ~Þ–‘)á¡úS–!‹_ûš­¼4QÊó×IêX·ÓÒË;ÿÀ kA±w*–„EÔ”ö¡c¯«AÂBÕÅ}¤%uT?®Õ³Zq)\ÙF$"Ń%md«‹ÔÉüéV–­¯c}~£z½5V¦æð¯9Ž{& ‰2QÃB„Ž<É“UÍA‘l¨á< /¢X“…MHˆÓb ãYg^p^ ö„õNMz/rBêy­ž–<0kˆÂUL¾¾žØXè7®]ìúQr‚&æzÍË|eü*³àxªÉÁVðf£¤pO²ëþââÂR)˂ĻxDr.:`E¢¨—OZ‰¼@ñÉfÅ$¥“O¬iAv\Žç¦åxŠ…TÒ¶ÙåQÎöÁ³|D9¤¼{4¼.ô±ñ[BkÚæÃãÐjìÇz¨%`ˆ2guæYSî/7±nsݨ¡&5•Üõa¢`ͤs•Õd]!å&‘ ÌWh²V.ÿež|NFŠc;ŽÊaþ@é_džb‡ Ÿ½ ¯U°‡Õ©Šš å£)“ìǺâ¡/Ì8ôg~õj¶|YÃG±ßö¶È«d÷S>±¼Üµû%¨Ä¶!ü™º¯ož2{XüwT‹øù<ý¬¸vðŒûÿã§ÏŸ¹÷ÿ§kwòß[ù„þ­R°ä¨"üÁ¡îÇÅéıë¾ý–ËáV sdÿo{ Ü®Yf0Dß–FÞi ƒHT¬…6†Ãó ©gÃMvR¦Ç“>9ý,Iâ…N ã"Më5,€ÙIónÊÞG눌”ò´$= ¤ã´r]3nû鸻 M-‡ì•»˜Dƒß²r@ž…ð–Ð-RŒ Gn‡’ñ8éž’ZŒˆkOMC/(èh¿CíöÒÅ"Qµ.F£ º;Eå±aÀ®œ(Ó$èJ[&¬5‡´˜Œ¦H‡¦µ·Ûö…aÙµöj8@°W{;­ÝýƒÎáA³é`zeazÕÜoî¾jîn6CøH½e=B{¥Þãà#%Vz{ØÚ‹´ô¢ÇQ–ÌhÁ†ÌT6`‘“AF0Ø—6Wüÿ]`¶CEb >ê‚NBÇHeÄiV!½# ÉX?;C¯3$Õ¥üŸÎJ%¦Çuç±pZ³¬–t—´B2êQ{çD2–ã DÝÞÉœ­ÁQhUR˜aÍQ’†Á;ÆjG<±ûúØá.ÞB8h<ïšãbˆ„·„aÆ }°(ºÃp,,DÌÓ´'@jJ”š”A…Œ_=kôx sÆÈÈ?K«TiæÓh©|1ZSJf௻ƒmŽé4>MÆ‚›YFGèÌZX¿UitœtÑ]ıl'¯ÝsEË&ùhd¢“˜vzvÌØJ·=méèWåñ‰Ñ&‹´Úc?$FQL‚.hH-'êö3täÄN ˜À÷¸ÑôÃX^6’%–Â’ôQªêt‡t†ÖˆÆÜ‹ÔÛšNÅàX^ˆe·´ïéå>ýSûÝ)ù¿k~šáÿ÷ñŠÿþóþ¹ãÿná»ãÿ~üŸ|³ æc‡­_wçònxˆ…sy8UÈgåÌG7ùEoð„¬óS«ùsóÀ$¦O7Äæý¦°q.„ÏZ*ÕÈ#Åâµ|²Bæ0Æ Õ¢KLm p¿\Èœ¬~D¹íjßSY÷õÕ· ”|ÐT3»¬îkq±Šý£ÑÔ!waÅâ€(Ï÷myª×˜qHý4¬r¹À€úq˜µSáú’_†1`‹ÙuQƒÍûX Ë#ü“Œ ùŽÝ7¬*ž‚ìí:Æg¿'~ÕÔ‹ƒé“[ôJu ÎÍžÚ]áUÙ“_¼øŽ]‚a™hñ7„ÿmñWŒ¡þB¼Iü–<(k ‚£%ƘMéÕpŒI¿O2²#@ªa²e̊ݾ¡ÕŠ9Ê'®b¡²‰½¤‚%ãwgô“zÔ9ù`6j¥* …ùNà5”6‡ƒ#ÜJ䘴œÀ½GvÚÃÏÑfÅÉC£h)ºãnõ¼×ì`+k¥Ñ:PáV*ÈŠÃëÛ¬>ë°—Ñéð*‹¡Éå Æ]mÔó´8–Óû0€öpB¬>ͧDoÇ8úˆ&á®# 6ÐÙ@ŒÚѱTÀÒú1B8GÄq|Üg]‡jÞ»BN\^éü6º¯ƒ÷"÷yQjs‹Ðù£PÜ’V úWш[Ž“xû±H'ñQmÆEíð.²>äf4kŠ`}²“ôN2ÅÂ>Ü,hÏ‹n—jS•3]ΨaöäŠfU Aum¸ù(³ò:ˆ¹5LrœDL/wä†Äëŧû,ë÷czð¦š2`,1÷ØÂN~Ö™ó™èĈ¸€{ŽûÀ<‹øîË›o6v·š¯øÌ¡ŽPl¡ÙÏQ°ûâ¢>%06îZt@ŒIÁ†Jhtiª®IP;Y¼o9‚‰YR-%V0EV &9‹ð÷"ñ=¼è•ä{,–Y°û&Ÿ$ÉI¶è\‰±$ÐÚÿ«„;‚‡bŒðcÑ $gˆàG桘pvôժäŸE9 '¹¨CU"Ø-®,Fq€±Š†Ø`Ý4åÉ´ûp{'Ÿ{tÕg»vjX)9 éq2éS,\Üã Œ"eÅûÕ£SŒ|ècL\™ÉÁÀ?À¡ÙrÒéd[®ƒñÜûÁ©„û£qϱ|LZ­›£J†¨Ú’ Õïqú §K±±H4ô>§úУ ø+µö,p÷”úhU’ê —ñø—m¡BSTGr[\· oeÔ09;<1î¯tUóÃÒ„"Á ÃY9í/N°8¬Ù$Š¢Zù r¶K ¬6à¡"v&lÈn2–Ú,¡P®|³ÆHUplmé4xfÞZslïܪ—~t·¾çæ°a·9%ÏtT&ä4Ò‡Q êÉlmíÜ £Èú.ÎÄ÷N·ó;¶(*_œ.ˆôßáNò›ßbs­X|n´na*(Ëuyt°^1?L+)ç‹Ö—DSÑŽE=ZŒjW¹ñáÔÊ‚jèŒ&èñ¬,Fãl¡÷ ùV‰_˜6f“Bü˜ÎA ñÃN7˜ö…Ü?Eõ™ÂŽIt'Δ8e(L‹q¤È+ú&¿3¼è– H:¾5q¬€âS^Sàjdå¢Ay«Z‡'¼&ƒP|Dkú÷»y‰¸û¾Å'ÞºƒG7W¾ò<ú´Òÿ|êýçéÊóÿZY][}þø¿¢§7×$ýý‡¿ÿèùߨÞ³±Ô½åîà:ë˜åÿëùªéÿë ¾ÿ=~vgÿu+_,%pYŸžÃøöN*xp'ý~w€âvvT$ÅåBV.ÜÏŽ…œ®ï6îlîÔ(­½³½û¿Ÿšmô¼ü0Z]Y‰~©;­Ý½•÷c#Z]]y¼²ðÝ÷Ž|BìðïrÐÏß/õ³#ñ[Êòø×¶JçE+~кËÕ‹¤'øÊ?î“áÃwº&»³Y‡QƒÆ¯±›¸ó^v,«¸~Äß-/?Jú£ÓäQ‰@“>°§œ@…Ø[&Tû¥¸Þÿ››0ÙK?%0Í'øçõYöÿ+«ÏýÿCßíÿ[øðif‘‰w)ËÇz§§e7zQø©HÜ}líÏmT'œ±£‰Á—ÅÛãä$ímôá’%‹‰©þëT’€WÏžˆ¿[×$žýÑ Þ˜ãÞèѨ?9ÉrªJÞ¾ï>"e<é—h¸P÷Q×( 0Ù˜þ‰Y´AmÏîRZôèœZðׇc»ÄÙ´G« IQž&Óa`00/AÊÒq>”PÆ@¿†ŠÜ}ÔOÓ{×]g³èÿÚÚšËÿ=ƒì;ú ßUù¿ï´rzûpc«ùª³±½½·IÑ6ÌÃas{ØÅ(s ßIm¦ö()º›p`(^`r^çFž^{‰›÷·ÿ~VQ r:Ϟؙ·ÇŸNç*§ð…gWR¿—PÁµû(áî +™Æc F]Ññ¹ ´ß*ÓU†Ç¤,ÁL͆ýðßÏ–ž=mÄ<d‰ CÃ~ëñŸõô¹¥¥­Ík&þÿ5ûþ¿òì±Cÿ?{rçÿûV¾/¸ÿë&ß}×øéýÿSVN’k¼õëoÿ÷ôñwÿ?z·ÿoåû þ5½_µÚûÛ¿øBÜà ¿{••£~rYšÉ¯†có§©ÌlJ6·ÌŸ½ä§,ïfš|=,ɸ•30:ËÐWÔ‰›¯·DÒ²Œs <´¼Äc*C2D£¬!iÁÀ,.ßù…¥‘];'r ¬9Í”S§:BLHUîp\‘Cï¼7ZžW;ª)H„Fê"ˆã¼{R‘Ó=>™ZRXNÓ Ä {ÌÈþ!JMÿÕv¿ö:f¼ÿ­=_[qïÿ+Oîìÿoå»ïѤ,eù£QZôîß&%\ÔÖ ò‰ø?:(Ên‘ÆÂ*:GpýÊAÆ—Bó ‘~Åæ*å2”]Xø¾½ßÜlmlmý¸hÞ‡Q—nõ… 0è/]&Ý®² Ú/r½‹5H-'Gºµ £hpß`å¨ÊõçéŽ~*ä m8Jó˜×~]~úõ²4Š¿¿·‰T2N ½Ä‹S<"ã?q©IGêMÊÓèϯ÷ö›õèûŽÔSÍÓcÔÂý¾5þ=ú{ü÷‡ËÿþðïµG¿ý½|ø½Ê„ h5ÖX­dÍe„ø•|UÍ¢ŒL‡¤øÑoñòÃÚú÷¤ ôƬ<5Ã|Eß1&ž¡}o™£Ý{{X_üQ‚,Ê‘+’ydUAÖ¾n¾jD‹ï$Ô¯‹ `þô§Åæî+Èû‚û Ô(q(^(¿DŸ#õ' 4 Çßa¥ÕhzŒAá‰ßÜyÝÚn¶ëö(0V…Ô@‰«°Å{“Áhs‡öªÚËpº‡b%Q†ÿÏ´Øù7®ônX¦8Þ<”²9 1WÖš§êŰŠÕ[^–ã6n}/,=m¢Ÿy‡Y-ƺ³q|Ôß FJLœ°)c~=‘]­EVSÿ>†‚ßÃê£jäW„9NúßDz&™9_M•Õ õ÷ܪîZ0.N›å\W¥ÿîûï‡ÿ~víWÀY÷¿Uïþ`wú·ò]ýþ§®`(˜ogÿLKK"ßþ©õêVåðóê‰87.ãQzú{³|Pþ:-ëÖ¥êvkÖõêZ¿X¿ä+«4žŒ“¢{Êýò<ëÞ”5@w©Ä%q'Éÿƒ|šþ߄䟿™ï¿Ï=ùÿÊÊÝýïV¾?¤þ_…ð ‰õÔþ;ÜþB¢=M>öB{5ª|œHUO€Š&Çéøÿ:Is%Óò3¶2úÙyš§e.¦sCeÑ…Â …‹ªÌPI¸ . ¤ó_8ª±+€†,Gû¿$ß/×ö¹úß¿—÷ßµ'wôÿ6¾»÷ßÿìOï:n¤Žûm噫ÿ÷ îöÿm|¿kþÏbíæb•þÈŠ%¼˜¿ãÝúgð…FÅ3Ø9£B§:³²jnñFj¢›yVvZÈ9îŽä»Â™òNog:Ϫ¹¢¬GÒOÓpâÕ–UÞ=]êž&Y.âÍ;‘~BáR5B/Ë/5²Z•ÁŠ-×L2Å+IÊDº_„€‹ ä’é#1PÌcÎu–ŽÈÈÁÃÅh¦H‰ŽÔ@š^ÖåêÌV’JD'ð·j—ŸqÇvÿ›}úü?ØøVòŸ•×þëñÊüÿv¾+Ëÿ¥¨¿5@Ç­io÷8ËÛ£¬ß“NŠÄðâMš#Y» €lPâÏÙøô Ít4û{ã2¾Š[øòÓß8Í‹äQ—z©ÄÑ:…!Ôgå/–NÅ(WÀ g,aÜ382x°ïˆúò§é?/º›¨cÖýï©Oÿ×îî·ó}…þïÆîîÞá‡1’_¶ÛÍC3escóM³sÐ|m'î67^n7;Û­¶ÿú ùWó÷vk·ÙyyÐÜø‹™ºÐÚ;hþÒùëÛæÛ¦³÷rãek2m{µƒÖîVgïí!üÕÜØ±T“ ×ËFòËlÜN-5äÍØëƒôØNçé89ê§ÛdÍTm¾Ì9欑öºHÿaþ~“”§Ð6œ{/a*ÎÌÄý"ÙøòMšŒBésÑÊ%GF>0“ÛæØm+»ÀÚ›Œá4|³—žùŸlæ|…1ŽÑ>¯âG†{6uÙ æ‰ÃSæeã2{Ed²Ž6Ó@ê½ESúÕóO8–OÖ”š™æÿd©w‰'zw‰B’zõÈ),6#_ 5‡WÜÙcXÝÞøp¢‹+5^’dbÖÜTaá{Y£"£îa×^ µü½¼’ö€š+ËÞ^}^þ™ ûÿ¸^F`ÖûÏÚ³§®þ×óÕ;ÿ·òÉs=àØÃw$qŒÏ¯ !§¦Î”£d4Óý„D<‡¯ŠkNóŸýéý¿¿S @³øÿçkžýßê“;ÿ·ò}ÿ f³¹½ÝvÓövö;“°ÓüÛ¡“IéNZûÍÛׯ·›Njg¿Ý|ûj¯#Kh¦vs£´/óqòÁIßLûýÒI#‹À懱8A¢õ°5ÙxlZ"²á`,ü*í'—íþp\ZÉÈד;.8).²|¿L'½áž“·•”á ªÖJùßÉÀÙÙ 5ÚoÀAzwƒÔJkŸNŽûNJ†üŠw’î^ûo"îå\Î,i°á£QWY%þ½4HºÃòƒ:Í0;Ó–©Cku:„±§ÐlˆYhĪPüîT˜)x´Oº*µU,¨Ö3þû±*w}0wgÓJFŸÆ£dÜ=Å_zÇVÃг²ñÁ’ÌF …½«ÍMmA úàˆˆòŬƒ­!°`¤Ò‹ÿÙÂÉ9zë^ÝîTŸÿ{£ñ·9ÿáNûÌ“ÿ=½Óÿº•ïw¥ÿqÝú®60ÞLÚ!_¡[aãûëPΰ•|¿“õëÚeÝæitû»ÏýBOA¨v|ëUz÷ÝÔg¼ÿÓB¹‰:fÚøú«OïÞnåûŠû«u`ݘ©{û̓ÝWzÚ13®óòmkû•›¸€e[Ͷ¾yn`…µLÚ¥E’÷ñÅÐ8Ü~9Éú½ß‡aJ…ãÛ¯3œO‘ðªHà †“ÿY*ÆZÅ.#ØN‘IK#fáí"˜q„32%ÃF5ä‰]¢4·”“yw]óçÚÜÄ)0ÓÿÿSÏþ{eåŽþßÊ÷Åú_èƒÞ"Ð2…ePß[TX³þÚ·¾5à ´ÙÀ+±8 ŒóQé«¡ÓeLÄpkYA0[ÉY¢ å4ü¶oJt–üÿ±¯ÿ³úäNÿóV¾ßÕýÿ‹ìg™|„¬ƒ·‚Á B¤âë ˆ§Ùl¸fÀ[.£  _aw|CMAº”ÿ·¤ä Š‰Ã!P(ˤ2YðƒOÐFBfÚL§‰’…¤y>£j¦—΃ɅrºA™KÇÃ~´l~8¹NÙ“ó|‰×œ[ÎÈqʔݴ÷3œ½4éACzéRÚÏ¡ôfµ³?l–™ëYØ+€ôÉ~ç”ûI’cýLØ=>Q»íS//þß ÜfÞÿŸ»ûÿñóçwûÿV¾¯»ÿÃjù½ÞöõC_øÞ/ÿ^ºº§ ÀÅ]ÖºÀçÔóÅÒ+W¢…È9%æŒIºcøÿ’íÚרôý3þÔ{ÿþäNÿ÷V¾¯±ÿyÙÜnmìv¶öÞîWft~n¾é´v-ãŸÍ_6·[›öÛ—:X€°½ÝÙßh´;í7{‡Íö!ü<|ãío¶›ÂÎÚÙ8Ü|ÓÚݲL¶÷ÚÍWvs§Õ9pòláš¶^€¶÷Þl6§ìÔö!Œ%,’½}…¤S²ÜŒÃƒ ¬nJönfî'XɰÓßXSôv÷U뀗h¸øÛÝV娼ݵ!é Ò´=ˆ°{ÙígÝöäH›°m GI1ÎÆéª¢•»i(˜iè.Â^4/á忦Ÿöºí¥mGYîÛ5r&47õ“_ð´ÊMê›—±“åÃÂí)å´M<ÆcXøÑ^~†ÿŒÒÂjK«†Åè4ën…Fó/ŤöFý Mz{yÿ2Ør[ æÎÏ;‡ŽUd¶aôSjõΤ?ÎFðÚꃌ‡yð.ãöx8ò2*¡LÇíædI7 $æ%…ÞìKH13ß“i,[·ìÛ<«höÛQ˜ ^YùñP_*^¦ýþ É_ #pä«ìý”MÌk·¨@ýáeïgŽ¥ÛwÂÿ´ódÔ>šüÿ;<ÍK3LÐNò0\ Y¾91JК±mme–3¿ƒg’«?\\ñqÁôWJW‡G À¥Ë”È<â©Å(9=//³Ÿ D27è-•é [*¤ ý«Mfr¶˜Í‚m¥¼eÚ£"û‡e[jBLzº´¶¤¨§bµºÃÛûÀ-uŒË~éB¬{7÷=/s7™þY:2]ùÁÝnE‰n7\¢ gP¸çËÐÑTQJä…ÊõªúÓ«êOV.ñª —3²C¥xü…³Êª*«j̧c¸”Ê ” –BfƒQ߇NFnbVƒXÎøØu“‚¥qÑètþÃ’å#ÎKwà³|©;ñ†F%»{l)…c4¼õä™?ccÚQ(Žà€Àu¹7ÆÀOGž ¢Èy0èœGÊS´S/ÇÐîñ©·¶KÉxÅà´[‚²Þ”£$G7{K¨#â¡Cnb©„¥ælÃReŽ›>Fn"|Œ‘§Xê2?á‘À`‘ ²Áœ Á:z%ˆÅX»˜Œo-hÿ~Zþ·ÓÚoߌÐ,ýïÇÏ<û_t p'ÿ»…ïw­ÿó{·%=ålTÚ˜b[w†al³Í0Œk“9j*.Ûâ2 ã[fYâ_¦m¦cØ_R†6®ÄŸÊ3€Ü†´í0 @*£c¦“.Œ]¸Hè_Ózò[ï¹ßÓgЩíuíuÌ¢ÿOž{ï?OïüÞÎ÷ï?ìãa«i È…QÐë=ÛÎGÚ 5>h69ôôÐzÝj2ß¶¶ ã Úþ[iîš ½ö{ž ‘ëþ€“ÛxÊŽ3Ó}ç¼gwŽÇœe„>·=Ë;϶ñy¨FXQŒ³‚¥ I»ÃÆIŽ]¼[òD_VÖÙvi:­Ð;~Æ¿ÅIbùÿY’ÆÁ×[ÇLý¿ç®þÿ“ÕçwôÿV¾ß5ÿ?—™%û­r-ú¿JƒßÀ/±kÜ_®5´ÒÇG‰ “~–Ÿ¯üeið|ݧ÷ÿ›ýý›!3õÿV<û¿µgÏîöÿm|üýëö €BÍ`¼HNG£Ä¤øû‰@ þóÒ³'×KfÝÿVŸxúÿïôÿnçûŠøÏàÏgOþíâ?oì¼¢ qË jo-´['Ò/Âó³'³£@Ì] è?ÄöÿÜÊÇi1º®S`¶ÿ7÷þ÷låÎþãv>íÿÙ ã[iþ:w »“ØÁvç´7è©2.‹úÎeä} Y<¤Þ$ÌHÂ÷7Ô5p*9wÜœC7uÜ=õ''Y.êì>êù²<Ó 1‹Ö#“áNÉ“~ùmRÇT¤‰Òƒ5ÁT0µ4òxâP¡|*ë!¹èò\°%N® ú­—éÝwCŸaÿ'¶Óõ×1ËÿÇ“U/þóÚ³;ÿŸ·ò}ý.˜€ónJ÷<ƒSªçþ[¦îš^à,¥zBæúõæbÒ9·a”ˆé!Þ”p™-Ò̓MãvÒ<¯Ùܶ ›pÊ û÷¦¬J·à”ëxñfd©Ûƽº]páÒ:úÜÆÜ{S{‡ü«©*ïX€H½gO +hút—„\êј-|I ?Œ¤‹@šj œGÿ5t¬Ô×¹@»a Æb¡Ÿ‘´gi‰Ë_±T&(ÉÖõ¨‚²µ=ª \MŽ*8[bj¦ÛïÊ.¸®Æi( ¸¨Lû)ÿe†t6Edº dy½jüEz’a á(Á›øØ‹„ÿkÚÁ.³]ÿ׈[)•dù‰T«›Ðo­oò­Iñ7ù ÿ_ÈB/Ý„Yòÿ§]ÿ¯OW×îâÜÊ÷Åöÿtÿ»oösŸ^ ÖÅošón«ŒQ¢ÂåöTp$$t=²ÉhiLjœ8þ?¾ ÿ¿æíÿÇßéÿÞÊ÷5ü?.ŸÏÇTŸÏÇÔÐ]Ó+CýÁü[~GœŸAŽ31y(½‚3Ç,—GÆ4'ú¥….˜ªÎSBcç)Î}â;NÕŒúšCwÙ—‰Í¾ª%¢™Ã (‡¯€r5®gÂÍÀçpêP¾Þ5Cò•F¬ñÊ<ó^CY«Ö¯bÜ®Üá@šeCú×>”ƒùtcTä~M›»ïK?ãýGm½ë®c¶ÿ/Wþ÷ä.þß-}_ÿ—º|9<ØÛä4à Úioò[;ìyGö‘•]± ýŒfQ ‹òÄÏ9ÌèMãVOË.7³”IîÙ8í¸ó˺áä„x-¢žJ~-ª„Z?g@i°ôEï|Y[Úº‰ ³öÿÊ3OþÿäŽÿ¿ï ôÿ¾u“ï¾küŒøORûðÚ똭ÿïÝÿŸßùÿ¿ïw­ÿûG¸“Zw¹‚öPKº¨Èß·\Ø'ý,)I»˜åãòpÈŧç^›|Ñ9ÿ¿…þÿêÚc×þóÉêó»óÿV¾ßõþŸK¯×л ý…þšõÿçÁ‹àÃ?3ÕÿáçFÑÕ.ü샴L‹szM=´"ªù ûI†~µµ Àd£þN§ÁÎÈ&ƒVk6 ¿)@×mÞt÷Íøú#A fòO<ùÏó;ûÿÛù¾øý÷o¸£¿E¬‡)Þß·aIb¿Ìµ»…L£º²÷öix$´˜ÄzdožÚûÿFžgíÿÇŸ®øñïä¿·ò}ü·¹³wðKç ¹Õj:¾º:x/ض·³ÏϼæßLïÑÒC U?$+Q0"wµD§¯#ŠëÔ:d `Û¯Y?B¯ÊXMPá2*u:!ïõ¾ýÓ—F³‹à«´ì…•â¼HCJà=R÷ íu‘ Òý!©öÛôÛkÁÁ†ýÓ}·Æ±¯ÖRÄlfé§ëß›œ Úþï«$a »/—+LÅgõñÌ`ËòQ–߆y®äô+/š„5h§ > #ÔÖÒ1®¬Ñ¸À+Áu7ûµ>Ñ…-ÆQë–RC{5j?ê‡ æÃã>ûO…™‚Ç~ÄA줸è•SkòÕŠü?a²Ò馕R$|´ýær¼2Î+¼ÌÔ ñÁìHå‹×ø“ï¿ÌK³ƒœ,ãº=9>–í*u¾ÅT‰®nÜÝ$§|šÿÃãþæâÿ>út ÿçù{üìÎþÿV¾û÷MÊâÑQ–?¥ì¡ûѤLNÒõˆ×Cô§îyÃއå1ÿG,cÙ-²Ñ8ê‡ge”Œ£$ÚÜa>²ŸÉ‡~4ÿHò^ÄþxËh|šFé‡Ñ°€‚Y9^Fl­qÔ=Mò‘ͬhúI7Eà&Ž£øûû[?EF´´Z[øEÃQšÇošÛûõÅïWk/ð »8ÅÂñŸ0ùǦ yo޾_­G‹Ï#@öè7¨6^~X{D¥>ãÐet¯žÏÑÂÂñáîiô=µ&þ3ÖMµò°Ä”ް åäH¤Rþeü=Y-jDîPß§ø†¿Wè'µœÇ§®€?}ŠbniûðUóà Š¿¿·‰|hx­®ñ¬rwÿü¦¹°Xü|½·whül·¶Ú:oóPÿN[ýcÆ R£–ÑÉcõ÷òa,ؼOŠÿ¤øìZ´üð{Høpª¨HV¾Té€ñd8F»ÀøKØÏâßѤ<•}Nvô¤àÿ°ÄºüQÑXÆÀÝW"݉ï;Qã_Ñ£¿Ç¸üðïÿ^Sí…Ù°³°>¼fÀc?¸L~%ï WÕ‹2æ E–c8¢phkæpá*‰â×õï;³üÑ -þä½þ±¦?Ê™ŠÕŒÖþ^þ¿K–þ¹±ô+KÿÓùõÝUˆî¦ñ÷«Ñ÷k°6_XpŸ­_¢±‚®P ®Ø«Ö¢Wåz›a¾zŒ?)8EôÚ\ÉôJ››g&›f¦u™Y}ÁÀ÷ËËrœâE"ÀƒóhéXΩüwù(9ÄÍ$‹?ŠüEZ½,µV„(T ho,›2k¯0àùÅÆº°> Ý\€8—Õ€Vê"P1Ü~ÞÖ3ÛÏ‹ïvÓ 5ˆBœñ+!ü|ÇzŸãÿã[جóïé=»“ÿÝÊ÷ò¿ÍÎ&†itsªå'êðrdÈh±ãÛ³›æïéü:Ý´'ß_ÓIš‹?«œÓsÃC` S{w¿þŽÿÏß‹þïÓµçwôÿ6¾;ýßÿìϵÿ¿ À™ö?««®þÇ“•;ÿ?·òýñõÿ,×o7 ¨ñ_³à\ˆµ»CQŽ®GUNïÿŸ¶[?ý'O=ÿßíÿÛùþûßzÊÿ)+'‰„ÉŠ%ôB›§!RÑ:øBr`ThTçTf*÷| møªZ<[¸ogcýÌlåõ’qbG”´²GEÚ[2SÂ`çýìb0ÂvØŒ]AÙV^Åvö)ÜC‹#¸ Ÿ=ê¥Ý¬0 q9„¸ØúÏPy3wZÙ¥^ïdzy†ðqdÇhΉ‘Ã)R©Âð1È„¡¯h… ááX2Nœn‘¸OqHgÀS-˜£ÌÔzŠ$?[Jú'ût0£\2mõ³jñT—ؘŒ‡ƒdlÌÆ`9C³D6N O/K‡ò y)Ô¥)µ_¶º!FèáŠÜʲ°–B®ÄV/ðo: 1›ReHà«Ì¯,ÿÊ£wSa*ñ¼¶ij5@%ÛuFeþôò›ý¤œÖ h ¦qIYw:& T‰iß#ÚS@gäke³Ê6ù i>Œ«Î5¢2Ä^{IkÓRÁÚ´ŒX6Ÿydæ÷,µåß„ÿ‡¾ÿß'wþßoåûŠ÷\0ž’7&zŠÜ˜pþ…Ép3ØÞnmî½²r¶7^6·;¨-n>$½\o`˜dÿ imcºŠ@딨bcrXselLr´±1) ŽÉš<%kLô| Sâk°J3l “dðS¹Z4„±OÜ0Œ{œÌ€šŠË>RÂ0¾þ/ÁÑásÊ‹¼"ÇP¦ ­¸{jn‚rÒvFZ1üÔÙ 6œPÌ¥ÖÀ‚ÍÐë¯=rÄvr”öѤ¢ÂF^$ô¯«ÀlæÝ9»ÂgÇÿ¼‘ç¿/òÿ³vgÿy+ßÝûßöç¾ÿn_; ˜ùþ÷Ô‹ÿ¹²vÿóV¾¯óÿ «ÅOa÷÷bÎ Ú~œê7|.£n‰ÕÀYáWüºÐé‡@Á•b¸µ!V0[qzQp{ïÿíëÌöÿéÅÿ\Y½Ûÿ·ò}Ýþ‡Õò{Ýí¼«÷½ü[œx_Idm¡ üSÏS‡+W¢‰ZbƤTÒ‰ÿu#7€/Ñÿ{zgÿw+ßÿÿŸý9çÿ<Ì’ÿ?_qÏÿÇŸÝùÿ»•ï+äÿ´`¼N­ôóBÙÞ¥^(½2<± ž×Jõ´P²ó3ôVÀHƒ>^(+ôŽ@‡Ž‘|IЭtÒœ·J <&pø¥@uÞs3jî{§‚R†ôs÷Ìä¦üÈOöCC”ýÔPå;,©‚¬ð“Rî¾bÌ„›Ï~D¨‚òß2’ž,J± +óŒ÷ ÎÒÏ¥Ú.ˆ~¨(Ý è@šwåPhʽm‰¸i;vnÀ«J°7ï3 +þppfñëkµ \þÿ÷!ÿ{üüñüÿV¾/¾ÿs°YSþ'S~¯K ‚Ç_›üÏÀxò?9÷‚ªZò¿`öÜò?Þÿ¿ùßãçwï·ó}ÝþÿãÉÿÔ¶’ߘüO×äÔsò¿é•h¢€ò?Ž•\)ÿ#ûß›8þgï_ÿïùýÏí|_¼ÿIuÍ<þEÂï•XT@èº^ßá¯^ÇÙï` iEY sƱ¯>÷üÿñ¿ŸyüÿS˜õ»ýß×ÿ¿wð_Éå[ؾ†¿ŸŠHŸÒv\XLºqGðÎùìÿìóÿ™wÿöüîü¿•ï«Îÿ?û/OVñç1ÿª»–ëdý§U¡˜äûO™òèˆãÿm‰…œ·êÿcuõ©ÿïÉÓ»ý;ßÕßÿœç·vöÏÔ}ƒ¢¥tÓþݾÈYHEß)"¿T]ðK¹}§+¾²Ná Ôiø|C?úý¡Ä™wÝÂÙ ä?NøŽûÖ+ýî }Nü¯o#ÿyìÉŸ­ÞÙÞÊ÷5ñ¿,ñÿþ½²ƒøuqÁòš¯ˆ6›ïÂ’ýxYóJ~ø3ä?Ûûo6¾‰üçéc—ÿ{ºrÿõv¾/—ÿôG§ÉíȦJxpÕ7s¥øE—0wë¼à$­Á¾;Òs8þ@üŽÞÿj®½ŽéûõÙš/ÿyzwþßÎwÕý?4}}¿ÞêüÔjþŒ¡<|¿Þú)K/0Õ†[Å›N{¿µ½Ýñô?7ÚRÉso¿mgìt^ïìlvÞ¶¶Ý,@ÓÜØ±SÛÍ—Û¿tš;­ÃæUËË—íÍ7ÍWVÒöÞæ_:ûÛ›Í殥©êi¶RBçåF»e'à ìí¶vZÿ·qdÌÊÛnÖŠ¾¡Ó ìAkwËNÞÙ{Øì4ÿÖÜ|‹;¯š}ÛÜÝl5ò0ŒN£÷vö¶;¯·÷~Þ:ØØã¹g7:á;o·jyÕÜÞø¥ÓÞÞƒnìí7f¼Ú*¾qt/—fŽl÷/%· :w!íð—} ÍV[Cëg·'-­·›8nUé¡¥afû‹ŠÜ‘X ­Ÿš»Í¶UÃöÞÞ~‡±¼=°:°³±ù¦µÛ„eoÍÕÎ&µÄJ"ÜÙØÝÝ;Üðú r«›ÈÆxœn†;3œ"ü«8©Î‚áDÙ‹ôæOÛ¡ä¿6wÛÁvè¼N¸7í7ä·Û‡W­ŸYíÖÿú˜IX«‡°Ÿ6všý=˜{PR»s¸g%Â=ÔÊÊ îkêš‘×Ü}ÕÚ°Æ£oš¿:/[‡@ùZsÒ7÷ìIÁö™éý Ø,¸fì>L¨ôzï uøKvð[·2¢â¡´Î›æ[X„‡­M«×þ’q];UÛµýªÕùß·;öÀ¾n”ƒ×ýä¤tӆŠ¿g}'£ ¥dàE§°Ê“.÷Kä#­ÔÓ$g9iò¾I'…7¼x“æyZ–—Aòrb&À^ÍÊîFžÇä7­ô3ùFh§Â5ÏkÙNÒ=®»•ÍT øZ­4©M8 ãfæÁÆæ°Hí’ZIÉËl C[dôUÎUty¶f¤$ݳ}Tk6’пâ>†tÃ@XFú$ë÷^K퓉ØNòñæp”™fHGc;áÃ(É{¤í*jó45ð:7rúÀ¦…ü @úé8…ËôQiÁBÆdœ¢R»“N×{ìȖݑʰÀ¯ÒãdÒW Ì«á ƒ…?,pÒur³g0éöp8òZ°AÙÚtÆ!l²•ŽaÁ¹¿)méÛŽÜD2 uðq{äÍ~60›³§¸)Œhu[®&Ì+»yžôÝ´×nÂVš»Io’òÔMÛ‘uÓð©ÂM£Uqxé:]ÜIÃâÒ\!»Ã%Ð>Æ  ¬æÀˆë͘R·³ñØ4Ø9Øx•&°Æ{)޲™NÇKdM¥k`´ÿ ¶þu’NÌ:ˆäqH{($ã¡×\‘ÆsOÀ®(•Žà®œæÝ˃´ö'c¢câç4;9…+†½îÍeó6Ïp÷arÚcK¤oû˜d½Íg‹d"0ŠÏa‹4WIÏ%r×òÊï4~Ö÷¡º¬a(œÃV&ü˜æÆ¹¤M6=/Tçl7Ò¥céÎ ŽügœäãpÑ>žãá‚”eERrÆéÄtål{êÖR3²C˜ýÂf%ÂX`ÕØöFpÈdÿ$@….ég°Ð0ÁØ=ªÈu¨Ü‘`Kür:Gºf©6ÿ£ Û©!Ø¥’p‘.õaœæ–Ãm;ßÞ&Á¼Þ®éÜÎ.u’VÕE9ÁVžÂaWQˆ³‚¥ð­¶¢gKuñp\_V!µ÷o83Xr§sE9ÎrJ1‡»”å~)3K”ÒöIi»Euþ‘Å|tO h`3 ý ªéõšªT¨2~襣ü,\‚s J×ÜLƒcwÆä”=âU­¾x0'!sJ=²8 À´šZ³Îtöb5¨›É ØA¹³ÿ¼•ïÿñ«b9~y|FS ¯o»ÉhºS²{îaùÜä´qé³ò§—_›…`­ ÃRï½-Ö1EiÿôŒÛët€†÷K˜ïÁòfv¨tuÍSZM޼‹‡)ÏÒ)bê:%)EÚ›t³£¬Ÿ¡°Õ/lç_£$Æ€(Ë$T’ÿ0ê¬wß?SÿÿLè›~þ?{üø±Çÿ¯®Ýñÿ·òIõöõu‹/¯àsá;` È *Gi7;κ Tà|ŒÄE•²¼í2³ ÊvšXåz¶œ 7ŸýÜZå{¶dH–Ò៦gK7ÏðlÉYZE¿mÏ– b¼láï gK†”^à¨7Ï–>”ƒeôø‡éØrm„ÈGü< fkÓ6¡ønÁ324³M/h•Qkf-*˃+ã«Öó¥YFûç]îæÀÚ>úBنɖh4)ÔQ³ã‡ ‘àÑû̃G]hy}ƧiTNFiQv“>P1†4ru|¼¼€­ OÓ «aÝgÙkHÌàJÓê2ûhÄD彇¿õv‘mo|Éì„\¡©›ó~…9#iÔRó¾¼ -£×­†T›RâÎG'i.þ´4Cü\C$ke²T]5c nóKäŒúÀIDyšöRž}-¯¿«>—à—:–Bî¼ôŠ{Ý&cì’]w„ŠÍÑ^»É,å‘i°…U}ÙÕÖiÝLq󜋩ÝJO÷Ljo!lF£¤/ŒFýq=ØàþEºò«‚R€šº# µýÞ0ûȨzÐRE¨:0mË[/ÆÊpá–úirŒ6Fr•, ]Wmíorß©FO#\_àdŽÛûµG²jfõ‘LSìÈØ4ã@FZQtO-`g¤eZœÓN9LŽúgƒî' ‹-JãÀd£þN§¥ù8› Z­Ù00²î’±áÚê—ž\6a¬î«‹¡å{ÜIP qúŽ”í )'’Ðö SüSVNεÔ-^…‰9¬†hT IQ’IÌsô^u $KØy”ËQtþc’@è²^'°ø€¤^$@‹Çî>ˆ’üÎ…®ÄÙy–ôáwÒ¿,á°ªŒuPÔ0X¦ÂýrZ‰qÍÂçÔIÙYn ¨†!&S‘$ÿݲÄ9áLù‚`g¢…¡¡U‘+&ž”¨u@fÚJ¨ñð&E §d7-Kú£ˆÃì-…è1Jœ‡“’Ð aì$v­îsëà‘§1f¥‰Bšx˜8*’¼{Ê&¦4IC Éç„ìk4B/Ë/5*©Çä‡ùºÜÌ…µv\®™Èeš"Ò}ø"jlŒ e«†ðÞ.tÖ¨HOÓ¤gJKtf‘–§É(cZ %ZŸ«i4½¬«ehüLÓŸ¤Ñ`ˆd7ž^Cj¯¸K—-£Q?¹Œ.²ñiåŠAä²'}C<çg@ƒ,â±þEoR„üNIôNIô?AIt׿ûBˆ™ äâqp>ŪF”x”<\óD«eÞQ6.Ó±WD&;ÐÝ(V u܇ë ßr¾öÕP"ågÃË<ALŠ"¹ôê%të`äë[˜„šŽÃ+N—4˜ ŠŠQ9Î>Àž$‰7VÊd¥Uù&1²}·ÔرŖ‡²]Ü1žÑ½ôüËä$Oé!ü“>ZÔWT¢2%ÛÕ§ÒxÄ%9´EœñüPd2‰Äœñ‡sÚoÞXàN“3/k¤lÓJF¦ÑºÓ.t08¤GæÁQßS»ÇÊHOB;S&Ö¾[¦adlæ¼7·m¯$•ù~'ÊIé=1%l»­ø‚*€þÐ_T^~uùie½r“¼7ÄÝP±íUv‘W.§‹aÑ{öD¯›…Ö~Û àøS_âOFŒ¾ çøÂê|A!Q)`=[ž¦ü1ÇÓ˜]³s}d#Û ¥ØBÖ0Œ-; ørÑPSqÙÍ0Œ/ù$86Ô‡¿LÙ§cˆ@)C ñgÅÓXÒ~#é^ûPvaìÂèhþ5E®jÊqiEzD´Î6÷ö9hm½9Œân-ZýŸÿùŸè%Ì&úÍ,ëÑö¤›“˜vOó!l!ô]# †õbé~€Lz¾K•5bé>QÐ}Ë3N‰ßYRË áx™Ó\\JËÉhDô'N‡Ê©‹ÜXÙQ…lÂ\ðè|“Íê2ïò¬.>býßy~»óüvkžßhuî¦Ⱥj'oä3êee28ÊN&B<Å;D«Uߢøà&R{˜Å~Q?É¡­'ihs-«ÓåÎï\ ç6ýÎý.ËÑCÇÉ])}•GÊ”µôGsEç¥ÎáˆÎ˹óB÷ͽЙô0ð‹Bl i)×é5y]ûÎT¡góÝ€AõY×Õ¹·lêh:Øð‘ß9R»IGj®í¾Ø¿š¹p„?öˆÊÀÜ>-Ûy•e:8ê_Jþœo§–­ÇÀ›qÎlmF´¤¦Ø«|­³6ª vÛ$½vÛÕý{ør£~’·³Hy;S=üBoÓ²ÍÖ„ûGjp‘ «° õŸù}©-¨ñ馦åª+É`K¸È7‘)ÒüY¢MC¬UÜ®È r~ÇÃ~¯¢gK¹—ØŠÜ ÞF#;¾¬(¬³íÒ¬œ`Á \@p›e7G–sÆãJ»½!—L/ '®EkÂ6¦SŠ ZWGèdQwÌ—TÝê“¥ˆKyÎH±×¸æÌ·òÌ×X¨u?„² WFJ‹+Ä[:^ ûû›f¿ö‡i±¿yûâÓ™”g4ê*ò/Áq9,?h2éµÜ¿by{”F][ø‚°E¯!Wð:f [d‚ðE®Eg1üa \ÍtCÜŠÉú°_ƒÊƒ±Å¬˜m°ñ£nÐþ¡}ÀžD±6ŒT:0JðO@õÕÌ´U_q_Y“—¾à&¦-ÂþÍÈæVëª>xú†8r†Š.IGÅîà+Í‚œKÅIw`rØvºq³Áúv.ül¼¤$mæúZ“¹@CC еWꆡ+œu9¬¸¼­ Zãôw–ÈÚMÙŽ«y™½VŽˆe¦ö'†:A˜Ì÷ÉBÍ«”{60æ–4«È×¼mXzÙ2ç¤"°K}`…Ša'Ìø4›Æõ8€ J`@¨ð ƒÆãª¦öa´\H€ºTŒ«d¢”c3G„ÎêGˆ$"›’!ϯ= ØUR(V 9ÓQ2g"ÂoC¬æÔeõTt™Qã Iò³(éŸ öŸÔ0´k?ÒÎæËAU¶˜&#{;ä'³ŸOÒ~BáÃÈ9z•Œ}åL£^rKsT¤%¬XuqÐ)jüêÕV¨:;_VÕV‡ÇQ8.äÅvj%¨÷ rë¢xA¿&ý÷uZ˜2´ sû«{=ßC5âc@I]s?4ð´Ú·1¿b€†£¶©`y3;TÐ:JÂUÙ~iq战ªž©à ë€Ú꟎ö§A‡ÍaFÎÛØ¥¬µÆ«u™jÈ[ƽ{÷´©9GY9ž:@ÅTN›ÅŠ Ônˆ#„ °nŸ §á'ñà}ÒÁJ7p*9aððšå¼©ëÆ©ÂÒ6:2 ¡b¢f"uIÇ;êG _s}ûRåqE·òúE>~œ‡mL²¯`UPö5¬ Ê· ¬‚¬0\¬wïx3áfà³oqUPþ}!éfGšw>7ϸ÷q–%Ü,œ{ƒè›ýÞíR°Ü›Àý·Òw<ΚþÜó\ßÌ1Ø£ Õ!†•¢Ó×”¸úð&ºòõQù¼únÆògôsº4F]ßmýÚIž+´fÑŠÐö”f?"IXš­Ž|ÞÏ.æ#lW€ÍxŸOQFdF6û ºÂƲ'JD©2S_f+ÚÕ¶cm[ahKÅñ‚¬p÷è'-%S×Þ4É=UÍz'a†š°äSN÷l „Xë„þ3TÞÌVv©gXÞNðqdÇKDâ K¥·ÀÇ ¯ª.„ÒO5¦¸m˽h ‚ò.·nȾp…Pe‰m‰ÁŒq0…{pÿ„võÉÇ` k&l05ÐÙ9ÊL­å½KJp5£Ü6žƒ+”ؘŒ‡ƒdléÎïàCóq}ÓA©C³]°Ó Z ^–~sñ y)4pú•dv«ÁV7Äp^Z‘[Y6G¨Ó•Ø*àÕžÚ ø1Á—C¿éøôÙ”Þ¾D…•ù¢~þ+ïè™ ÃÒž) ê2ZÙâ×öAX PÙf[fU™?½üf?)§µÂš‚ 5,ˬ;“ªÄ´ï´S@gäká_e›|¡ãŠO§@Tâ@2âµ—ø¬Míg”±I6Ÿ¾j¾nsn8o­*“ü,•Ós×ìjÁ\I¶o“ mZ~„pk~ëÀ:ψÿ„”àð:ë˜ÿquíùS7þããÕ§wñŸnãûCÆ´‚¾ªH%öU‰šÍÀ¯_$ÒŒ„£ð‡ÙW!yUÄH“AïÙ+ž&Xnî •®îÂྻ» 8ßå] çön*œr}W è<|ëÍóoðiú”Ÿ¿ôÿ $zñ¿ßÅÿ»•ïÊñ¿K¥Mõr£ÝÚì¼ÜÞÛüK§½ù¦ùêívó`&@çÕ«­ÎË·­íWóÿÔjþlÃnmï½Üؾ"Xkw«³±½µwÐ:|³c‚m7ßBÖþÆvs§³¿û¶¹Ý²r[íÃp÷¸D»µ³·Û6Óš[pÈ…úh5¸2cJIîC †j7T³÷öö›‡­f»à`c÷/˜'Ý|E®’ž™gèêÐï†î–‘ˆšm/Ql¡2¡/B·hK®5”° k˜W[ú^ “·X I¢öáþëæp9m›ª\F2©é+;0•«t²YI8Uù]°Z†ìþûG†ôþûGŽüÞáÊäò÷XšÿUº¿Dö˃{EmŽšÙ7R°u`®¬5ηb+Al‘é°B«Ûý?]Qà®þù­±oô þ¿HÝ\Èä?ú´ŠÿÇOñÿOWžÿ¿¶úüÙEOo®IúûçÿõüOq´ñ•u̸ÿÁÒxbÜÿÖ`þŸ?][¹»ÿÝÆg(ðË¢©d“D›¸(Þ¨E1¾ì£Þå×…mêô•‹Èäæ @FëÑÁF§½ßÚÞî¼i¾…5wØÚlG QŽ´I4Š-Ô+i@ bÊì¼7i2‚¼ý"ÃÝKüI¥‡£4¶èÏôC7%òÑîp3Æ ã·QÎyÒÇn¦„ã,oîíì¿=lBÓ6v" C^€¨H£Ý½Ý&4?ÞZƸ~†6Iú5jÇòH´¢CŽP„Ûz,Eµs¡'²¸¨åzƒðQ6=|hl:Fj«ÐÐ’†Ü²È|å=˜ˆ.ºq¨ã¡€KºÝaºp˜„ÃÉqPêùˆX›}X¦45»€ï#Ç9=Íl.ŒN=² ¡Õ—ÑGzè&ò*K•ùƒ1†”ŸŠ9H³|Ƀ%Ç»Ӳ‘«Õ†Åœ«MÉåJ1Qr²È[ywÊä*,£Þ„öÞr!‰]BxÚXí(—‰'rÿZåúÃáÙdDNgQ+¿IÊS–Oãb÷h-èÞq|WcͯÜBâ-ÓcØ…QãGT´@UÁöÞN3*1»„UFûþ^Y^ñ*éèŸ ÔÏÕ¶*ƒF×éñ»_ëÑvVWu¬9MüÄ%pÉ­¯i9vJz=Š©+bK 6'åÀV¦ Ç®ˆ5«£¡¬c²zS‹¯—žiŠ;ÿ¬GjãFûíæÛW{´iqȈ²c‡4DÜŠ,¬s1pjޏ®»c…]ãýdIfòô»Ž”¶¢wÉ‹–VŒ±&¸S…Š©en/ûù c‰Í!ªFtfcøx8N$¸.º$Û0¥tüË“…+,¾O*­ö,ñÕZôˆN°˜öÕÃÐX›m‘¸t›~€ò±øIµÀB©B•å‘9Ë´æë„¸¶¾®æ`žpúÄ Fziþ þ¹¬áY]þSü¡]N§8v<𼼑Ç'>Ÿ¶§R…¥Ðµ[cÎ]I]±@Ôõq„ZA=ÃMÚ|¥±@þµhDyÈzެgŒ^6öŽCý B¡ê®.ì>ƒ—öú_«s” u5ëÙS>E:Åã¶dÜ}ñS€#µV™vÃ)ÑÜØùˆVBzG¨âÇ>ͯW­Â=¨Hf<þ÷5ÜVøB@4˜i.åÖ£ád Tc€VŸˆHJ«@ÖaúaÜÚ[ÀÑd ø:fÖ,p¶‰ÇágŒÛyy¢Á®¼“F÷©uti©…ЙzFÀBØK«5ÔËÚ “ŒFF«â"=ïa,‹–wøsŠò¬Bë*d¦˜ppIÚl(E$8àƒ(!þ×j›à¾¦É ˆ©ží¤ÅIŠÄƒ¨Æ„þ Ȉá~(ÅB«B&´ú¹.“ÖDÒ®©ð½®~­|¼Œ~€W‰ÏÑÚy[ó¯o7¶ñ¢gÊ òµðîSgEDWCøCïxÉ#ÆUKÍZaÎÜãÝèö7ò¼œ¾$œ´ûüöÃ'†#`ÃÉš£V/ŠcÜÇX+é©Fš”Ýw'EAâ™ï"º±g½èGJäK»Æ!¤K@ëXæå&@óÉÌB’¬ÿ]0;± ‰,÷©Ýï&£¤›/U¯´Ñ¾xzÄŸ}„}˜ OÎnåõòzhí¡š³|‡ŒËZ=K ©rH$‰ÙŸM ¶;˜"M(N¿L8*ëÃá¿ æÚ’žý‘Aï¥X{™ ³žÑz5ãôØ„$p™b'Æ»õ(¾{±àr°êÆ~µFU¥ö0êÔÐ[v îÈ#\ÎqŽK§Caâé–'#”›ÄºAõˆ`Žj5Ñk–›kÒ9‰ô~ú!ëåŠ÷”w) fR)Êdöf‹-VL<)sÉË—ÿ’iÌdMk¡)pÈ£ûz–§lÑ>¦'eÚ^ø%ÌÖëÄCÕ#~jîG—‡ƒQ©Î;Õ^ñ2i†ô Ìñ¦¿GkÊå衞g=Šì‰—® ¤î$óÄG嚇dgiO$XHû£“^¯Ù;I%0=Ê´-wùv)’Ùµr8)`"ì×k^uƒ® äxKÇÖ.#ºC9HΙ'USTœeÌëÍ’CëávÀKÇBr ùäzô±WŽ×/Â¥S×·–E{÷±¹ŸiàmÌ\¬C=vÛÃOx›Ð*¿=ô¬<£h൘òôkq—²g¾]TZ* Œ–ÓX¢)~G`e§pÔ«®Ø-p1•ãd0z+üší,´ öÄ"Z¾îË>îprÔC’^< ¿ TçüˆÄXîÛõu¦[|~¿ÝDNm?æ„åÎé“w¥ø!©ý°JïvÀ}÷h‚ÀçvI¬ 詳äH‡#â`Y$§n;y·áðFãt0°¡ÒrÊN Yö€¹Â·èÈJ“3Ý& søôö޵¾žÓŘ‚‚éw¿¾°qæ¢ÏSûÔBŠˆ~x6My”£¢K ’ÂËH]$…;Ÿ¶Û¥âcÏëÑùÒhgã´t1cu½Î ؾ©P™Á9ò¢1bš wÞnzÈ.eÎñÜ`ê´€ù9*¡Ò#HIª.Nцé‚=× Ëzè+öýÜÇÀJ߇èOKóˆzCœªá˜^‡û—úUÝ@éÐZ¢Å¾Ú )‡ÆpÙ³ˆ´çƒ^”ýËÀXx,63¬ÅÇÖ‹ùí1Éú8gô‡OÁ>™>Ž€ k”'É("~ò]ëˆ~5k¼õ!?ϸäðf€Óó9ÊÄ6–ËÉ‘IMŽ*Ÿ°3õV9 @•Ehk§ç(0Ιç&Øwú£šú2Ê帽¢F&C.åLío9ÞDq€!¢€¤éÍÆôªëf?Pí~0½á²dÜs4‡E]ÐuÁ¾ ¼U*6ôÁåÛ­º@÷c …žiˆèz¤['9Hј³'þ ¾S˜PA|'´+X(ªÃ/ªê2vŽÜ.Na<Þ@!–"€øâ±9$ë# Š'X‰Ä©Ä9Ó›$:NÎ, RI¡0€^ ºpmFy ]ƒ,GÖ ;,Ä{ë"–"ÎX"@Uè­8-®@ƒT` ×GãÿÚS±øÎHZ1uý£v ËO0úµÝ`…½C‘ÕuDâo6šWD5]²rÆÍ’8:\J¾§»¬J·Ÿ&ùdTʼnÉì¸jl‚ë+®"µ £(>•KÛ–`X  Ý‚ßûš“Ž÷"ÒaZÏÝK_BwÖÍemâ$·A<îMÖÀ¼›¢ëÄ‚²fw„W°Ÿ*x9¾K ¶"Ý(BÙR‰¥ûÆ:þý­†h2¢I÷TL5QÒ< µ!Zà™¬¯s»e¹@ƒu»ŽLJ0Á«„ÌÉÌMo埈%©ê» †_×"x±‘My P k–Êâ+‘Ðs…Ù›Œ7Æ,ðÞ¸KÀ:Ó3ópÂ1)%:‘Ìñs,ÕrŒ³‚-3ÒˆFU(„"ý(Y{<Ëê7–ù &´ƒÅBÇ‹Ø1·í‡cÆP¡r—yókÌTÉÁÝ<\âçœhès+–Â25åUäßX`Tpöê’ß'«Ô'NÁ† 3™úLmb{r¹ý$S6Ï(Þ«McP­Æ™í“^=‘\=&†ûˆB7â ç'¸‚òWÆÊ á?¼kä0Vt4R(sÙ‡:tŒ8£?q5´‘æX +­ËùW‚,&ô‘+Û®j9WAGiã©áûÿœ²R¬†‡˜w)•éAS΀ǛÕ'ÁºŸ3Á2÷JW…5𱊅ˆ3îá¹G¥ƒ…šVyά*-¶ †¦6MÁ¸b;P‹4U1IîìEni-¿ž Ó»·Ò™©¦gÔ¡â*—¿=Ó ­è1ÏQÕÊ–‡>J¦ˆU‚f•[E3DFk óãjþtþCVþ=ƒr„Šy±#’ƒ„þá i,̦° |¨rY"¤ö\Ò>ö"ƒƒ¥'Ü@aeKÔ°ùG—×òVwjImÝ„æéÅ.Ý3ÔƒJÙraOÒ1½mDžŒ™Ù|_ÆALS^"Iƒ~F V{ZîñOùú¨‡4J¸MËâgùòò/$“—¥¬6R³õFÄÙÏŒ¥­I‚aJ%kg ’°]ÕB–XŸOSœ) u¦=}šÚ9©ÀIÊég¥Ýe,èòt×5BÈhºDZ…w5X°“ÎáeXKð5š!¦^27ÉkW4J ØiŸL6gÜg;h×ã‡vÌõh„p<•×Í/ÏPi-oìîîn "êÇL™†„:ŒÑtÆE6’–·©¡?ãK˜¨{»Ãqº.%ûIYN¤þh(ÙtéêEå'a#!óJI>κ$7£c˜ÄázC“©†-8f®è¡µŒzÔøè çZÑþgšÕ F^9F«`zžU“‰xLm%9Ÿh¶~°º ÷—Ãâ ´VRÇ0wúP8€Ãúõ[J£÷ ¡GixA-Àóhx˜7%ŒÙ¡Û°šÐêzÎ…ˆP©KnÁ‹ŠWâB™Bïh—ñA‹»øp0:¨Útú£7ê¢béß{={jI#ë˜jiÇ‚ˆåËDQ›jIÔ`Ë é#I´”œnG&>e Y¤ç¦BP#l¹´ZmIÒYõþŠH£Þ¯3ì‚dWÖ×qgœ6•6ŠøÙ::‚¦,N)P99Z¯ ªMDì‰f! ƒÿœã©5ðß9F†îñű\_/KQ¦’Í—Öm°wº=[±xÚ0p!ÀÞ-íB•ƒ+ â,^ 'MX­Ô©óÃJyÜMì#wpæíjî¢l·üR ³×¸Ôo˜Cv ôFâ.TŽgL£‡‡Rc„¯·†è¾;åAâÝQNƒÜæ4Ÿó•†Î/¸ƒÙΨ=Ž;?qgÄ¡ÙÀƒóJ’ñ•ÀL˜Êü¼wðtäùExN³îp’ ÑÊa‹ÇBã ¹Õ9ÜëÀ?õéô¶òS&´0ÅUØûfMÁZU™%¨-UIÆ‚D ç7–,Ù Ø*’Ë ÔÀ’¤J¦ŠigU~ÍÕ­Ã#lÎèZ|L**!v˜®Í1ÓGÅ›ÕH=( Ê"¡£þ™R|²‹’üEU"õ•-µ)”xкº¨›ì¬R^äŠrÒÅ]vŸþU]Þœ‹‡¥½ÉXh¡Ë_ˆÅ›@Úïãäˆ+äA¤— ¬5 ²»™38n ‘>q!ì£Ôö Ky“yvLjB½WHHÓ÷;Ñ7!½²îì=•KG¹“;qËJáÈGÚF‚ZÖéf-šCŒ‰ö•ÒÀÿ|VxH†Ó0ka©gX¤¦àbs”ü›ÖEå•Áüدɇ±£þ\áöaõ³–àE<4ôˆ‡¥Ëº]ê¡7 lv`ŽŒðÝ«Vh€ãò_­‘讲7òE‚¯6¸ …În¥€s,vÏRçà‚NXjùÐã$¤Ë–—Y/Eî‚!éPÅt™!yÙ‹JÛ‚›Œ:ÑY”¢•”5ó¬LÍ„©Ï r’ˆz„Ó; lY¡AÐÓÞ û¥r%|ܘЮ‹ù`U“ºZBÑd4rüôÄÊ…P:&ÇAëQŒvÒ#ÜÒ8Ñã ›L<ë^“Ö»çx®Võ²e:-Ú!ï!­ë¹—bl•Î'ƒܘËH¨F)Åí |f×ÃZÊ¢™SÊK!¸ö¦Åθ* 1•†™ZÇyÅ:¤ÇÔE›{Û{ÍWWø-KRƒ1ŽïÙå½ôhrÒ)ɰµNÇØâÁFtŸ‘7ÃAÚ~ „c1ºO­9ܫ߂‹{QX 2è4zZ«Æ@—À@ëùåÎ2ÎG|O wmJqZ¢¸xI¥¤Úo†i¬ø¬íæïw¥W¬íƒôhÊê~a@þœ>>ŽDŽ! Wé ®ìɸ{JÂÆ|xQµ ®ÆZÖ¡åñÂ÷ÓB>N»ãàN‘Y/¥ еz¯ ÃË©hĽƮËW]ÉKêF¥*5Ôù[Z^šÂeP€ï—!»Öé%â)ŠÈ*š4IOP‚Ao-k_=õHú×fi‚á`[¹1pº+Å T5p©ºÈ4Bl,ÂX×5åQÏ\Š¢UR]æ•i?< É÷¦z(¦ÕA¢÷éì4T¯z³Õå¦Éèï $áG³ħ“&˜„«J›Òü ë{Kªw .s9UõI$Pn¶ÜBHÀ(ÉIQ¨¯[Bë/ V}…ÑI}L2˜Œ¥™—wH·‰:‚ÅÙТdè V^a:öIe;žß”Çáëi •'°š)\ØßPm5£Æd–2™ßZ|.*.Ð\®V—:–ü»hXÃøû³}¦,È÷ìÚº06*½#†À$aqHŠÓéØX¢²GÃcKþ‡‹Ũ¼lU·?ɱFœt½výõó)’*Ÿ¯°)´2,ñ¢|†þ­ËœEø ¹³÷7͆Î#²|G0%ö€Í×›+ÑfÙ^¸\ÿÖÊÇ _ìÀþ¦ ‡áåO„2?²ÈA€ Ñœ¾Ús!™)ä2Ót}‚'®~è¤=©ÖªJÖï=Š1ŠLÛW\YºE¦±«ÈÅ…+½ÿ.Ýß}·ôiÿÏò¡âº½?Ïòÿ¼ºöøéS×ÿóS¿óÿ| Ÿ0=•ôþ¼ú?ÿóLyÉxX°ÎôCvX?´‘DKò©H˜=I/UÀ= üj<€tŽ«D^« „)IÈ„b¶ô‚,ÜZÑOôi'ŽN† „vóÞ÷Ó ŽsåèÉ£µÿ~´²"Ûî½Ú['§ÒÊ[8®.O‡w£ŽrBõD›ä² oùÓ\TE mÁ ýSs·Ùn#õÏNѲý2/ç¶²]¹yEÐny-Ÿ²%ýÝ¡¶VúÑ’è{È!ˆ°”0• &cÁXTyDšáãtÅ'ØÎHØÉ™ªóøA%øÄPÇnP.È®ŠLntƲÇÌ6â_ÈhkÙZú²ñÑ]ñ>ÌC¬€¦S“ñ%BÍzŒË*¥Å’Y˜B×tcHmbžæ|lÉ<&Jφ\0ÚD]X>â8ˆ)X´€XG Ã@kݬ ÿ„»™ZèP"¸8¾ûLyÂÛ2?$|ÄÖ´rÄj/\_†(5Ó\Hðó³(Ê'ºz{žîÖ„›;O:·÷žíÜö ®‚Nµ7m‡Øæô|gco;bl-  ®Ž¼qÁõ@Þ`7¨Õ¡½i¯ 7‡×µÑçs‘-çc±.d“GÒáøõp’ã|‹Ü¬õ—_'Y_ƒ¯#HD0‹µï¾ƒ©=ó ;«ú£͸¸×Kz̶ŸÅ(fùúØ“w`µŠ>aî‡õõB[!bóm<úý-F‹µ}ˆ,È ^Ê`M!LbÉD Ävš}(Î!AKÍn¥¥ÝØ34uvo…ç’<þöÌŒôøÊ‚Á‰{+$6©0P£ #Mê˜ØËŽå Z©BñºI)C_l7[¾’ùšÑMEòìŽ 5½¹{©jš§‰y]G-Ð*"z¹šº hŸö˜†¨zd‡24“É8Á‡ÝHù®ö9<‡Ç`2ÊÝ®î‹| Ä€¤rÝÛÀö$ð[>f0âºÚ^5!SÔ©$a~„ls]ØH÷+±ÉåúP9ÃÖù''Ez‚Fk†ë+hþ²–UI‡†¬WìÚò›>,µØŠ´ÜÒdòÝïa’¹÷k´”ÓÁh|I+–þ‚D¡Ö"ªgÑtNíil¹ˆû…KcŹÆN7DÙ0Ð] Œ ˜Wœyt4R ÍA™ßf ·ç7ád6 ÁâIº÷î÷ xþ Õ€n¿lW¦eUÃÙj9­ˆÜ¸]C8¬e@ ®ÁVb¼ïîà $ý~ÇÚ¨Ždø_¶ëmånKkn„;œN¨½¶^D3ÀÄL¼XrFÙØ­öe,œ=Ðz[’÷ˆ0اe@gcC3›ÖئB¦!h ›åƙ‡E©¥ 3/ÒšUžÍp{ŒVLó±])Œ9 9Wdn“й€/$jsS£Ç˹Ö8)s{Òí’CÒíbü³@"|‘E¾°¬ÈWR^Î-ëz”ÂÄr5ž  ÛÓçAÌež^h@Q•cóan-9~‘;€zSiŒHoÔ¼èY >Ñ!-Åáx<L8¡A&ÉÇJÚ;<Â0>GÃaÿj„ý;éâ'ÆCã ši”§‡K£&2èy‡‘"ì¬Fà¥2<bõX D-õ@Ø$Òßò–ùÉ€U+Ã, ½®Øö>,W–! Ž¡  Lõ•Ücð3ôq´÷ö±[FÕf­RQÿïîìPD|Ë µYsXIå³ÏwÚgŽÊ÷ÇïAͨӔøè²*¾P´„¾“”¡ÃkA¬Pc6?Ï›—õA)Ý&oÈY}¡ ‰0ᡶѯœ&T²æÂ¬Ñ6d’Œyò±G5P˜ JŒÖÏ5„•ã üTÁÑ`®5c©1âOˆZÅRÁ&t%ü0'šéÄ ‘ØåT!V7A{À¹·PZQwLß™Žiø9p”&c N2H†ð‹¹qþêðPBªØ›Š’á¡ûBâZy!… þ§.‰[CüûYÞÐ"jK¦û»—Ž©Ÿ–ÿ×lôr™\wÓåÿ+««ð·#ÿ_}ºz'ÿ¿/&9ÆUÃxˆQAb›bx”‘Ôð¦Ä÷Qö‚u8½/´7’ä(ëc ™1]°u‘Q’ôN`G8ÔÒñ­æ!>'ƒ4ÚüZ´•ŽÒAYðʘM÷%“¼Kk’ cã¢Æ µgH¥pŠT äu°IB-‚Q1<­ìJ ]˜Ò# Mr²ì×=ÈH™÷4;Ê´¢- Š]±šu¡à¬Îèð7™IžRÇ{¡$9¥à:ý¢1«Gv¶¡ÕÓyš?öz"‡cÉQ3±|H Cœ-ÃÝ—¼Ý ЃLboÉÑY]@Œ_ÞÝ ÕÉ^íÐæ>5*áœu6Œr¿ÛX¸ÿ‰ŸOÿ¯ûõw&ýòìñþ?_»£ÿ·ñ1ÿů¿ÁóÃ?9èùW>å0}ɧ19eX'ÂÈþÁ’B˜ýÿe>xp˜AåtÛ§‹æ†­ÅCÍé’íy’õé>Êàä þ–‡Ž!ëB¸‚ƒ—Rƒ~ ŠEF‚fè=Ð$“1‚וÓÒsu$$ñ ÿµªÞOúI‰ÕFȇê“Âo&¨,’`ë¢M/ÒÁ°—_ÆÒ&ëšUR%0–š¾VT2Ñ£zQ§+YMžl¯::êúÀÀóB˜ k#Zé~ëÉÁØÏpnè̬ܵ0j3íží«räÚ%ñ=Ñk½>9ÀìƒÑÕ¨…ƒŸ{hÿúQœÿIÞƒ‰ºš®º„y±@ÅeÏjrQòÚ ÊÆ$îeÃØ'%¤È<‘²3ÉÑ›G š£ÑÐî°µ‹¥x? ºh·ÐmMwºÆ1“¢{Jî6ܹFËWJw¼äÉvc Š<ÿñò“ ä øÇ†è&_p‰tp¬Pqá0ª`N¯¥€i„js?Â)G(ä›2-Ÿ\RLVŽür4¸ï;ßÁµƒUvœròäBRÓÌv5¿©Z#ûB&èö*Æ­é÷7ƒ:í#ó P‚¯dÊàò’æÝum ’¨˜Ã1¤¸ÂÆøšM!$b’’¸(ð˜ kl›Ù0ˆrÆæR>§ªÓÒiˆ¹{ÍÜgzY­©-¦_4nG\¥ùÿ"Ù/²¿NÒIzÝw€üÿZ@þó’îøÿ[ø¤!üÃf8ûñeÄk жÓñƒ2:ŽRáau0ÊPš@ᢲ¼Ÿå)YøYq›$ï’PÂàòÔªŠI)í§¦È¬¶F¿ò?K?ÒãòäýƒÖÞAëð—Î_ß6ß6µ×ù‚òÇcÔ`.4e϶pd ›XJ QÐHöˆô0ØÆC-µÊrÒKE íSᔑFGôã”pö/0@&¹¡U’µ·Xš¢»Õ HôL©Ð€Î?°ïwŒ&¾çˆ³ã `þý)jîìþ=%+ ýý ¦¤:ç÷/ØÙü',AU¬­nðáß¾Ù¶~ÛE‚°fMÓŠ| "ý:¹?RÉè°ø¤ÃÿŠ5Ŭ*goÅ},†Ï×ÌwÕcZˆøRoø7‚b<ñhp)qCWñ¨X¡ÖIõD;v‘ßë 2[4âTPñê³=sÓ{ 3Wßë{MDTpL@m¢‰ ¯6 j5€ü £“/DªˆûøÔØnæ²Ô¬ãÈa÷Wc9ò Z‘eícªÔœ¬ŠD™Ç³'á§Ì“à$ô,ÈIP³ýýÈ™ˆ¿¡YÕ nûÝSÌïèÓç?òQKd¡ÄjÐ×÷4ëü‡ÿ9çÿ³•gwçÿ­|p–†&>( „‰ZS’À²mOºÁæ0ížæÃþð„'ó{ ÌÆ)+2—£´›g]SÇŸ¡¤Èc_œJÏëìÓßrïØj´‡pì%@´Ð2•CS² ›¤« JæPÐÍLš—Ù-PÆÃ…xG)V&½Ð›¢<Â,--Ñ[Òxõ €a(0oryÏy½Ú8Ø|ÓasÊÖnûð@Øxتäëå½ÝÄÐm+só%*¯7··Û—íVÛRÒ^ Cùt967¢uq“ÔÉÕü’á·N¤clèå4A~ʺî|ì{éºmÀ/>ôÌ#KsRž^ÀåD%ò³Úg)àñz] _Ò¬ënÕw?û«Ñ‚q ¶ÉÏ>ûï®kÐÌ1«jÚÕZöݵ´ Nbóþ·¤<\]¯À úÿøé3×þïéÚóçwôÿ6>ñþ„é]ÔÈJ/0°²®)ÒL2q¬XIU*­œ/ZHÚ1ç"’Ú¢¨0—‹œ1¢Ö#í+‘·/ænÑL— ªÌtÒÛœ_é®Íô4g™ê~Nðv˦9 S®æü•þç”§9»ÌT÷s<ªaù—ËElAUŽbzÐ$á;Ãð*FúDæ ¯1é‚ãQ‘N[]¦S \b¤®ÊPÄ*២FÔ¨Ôô¬A½¶P²î“n:Ú¨—Оõ[úƧù¿îiw¥œo‚§é¤¸¶g€üßÓ§kÞýÿñã;ÿ·ò1ÿGÙ„óÅQ±à{“—E„+6'\ãcÒµL³“Sr u¹ÀÂkµg8/ÉšâòD§Þƒ“é¼i¾…ÕwØÚlkí—IÒ\æ GimÑŸZIgw¸ ‡e†Š+6kƒeÉkíî^goÿ°µÓú?ŠPHP¶q«  Fáa´?Ãdê>IGð²È|$.Á—ò„£¦?Ë.„»À±öð`‡$Ñu|D‘ƒ'P0½b=—á°LitÐ.æ#;^Řt/Ó”G£Ã?Ÿiw¾Ê3=…[Ò.¤(J¥ôß”×êÒà‰à"3ÆÀ'™¹:h‘eº9¤xP«°+Ÿ>{þßÿ³¼bõ†ùƒ1šùâ׈Ö,0‰Â›Sáñ7ºgdwŽË-ÂÈʻüõ“fѯ=ÄP§‰Â’¼EŒŠIžÊ°‘ÃR†ôÑÞBûÀ3ö.áˆdÇ"2ü«‰Æ÷x 5nƒ DO3'› ãm:i~ˆ¯]¨üH<ˆ%eªØ¶‚‚SbtÁ$¿¤ÐÂÕ¯Y^ œØ!p–FxA3Ž…ß1Z"¼Ð ,] ãˆqAˆSÄᢌAò!5àI‘¦~ù§X7¸6ÉåˆL?ã&´”ݸ%Œ§@»«‹jÀvKË•«ÔdÄä¾û.)Ù{ŽâÌrÆX¥ßC…`‚?EHúÉ>ÖêULudˆ’)È=¨7zD¡@U¨V2'â=UÑ(êr|[/BXOñ¬wêäûàGÜedî©7Î`ì_«Ë+ÑÒÔVG8™1Æi|7±+ãe%”£ÐïBUB:©¯Ö¤õ•‘¸6+½q)ŠÆú|4µÕŪæ}’ñ2BD‹i!üÉØ JÓ.°±Mÿ…§Ñ`[¨á3-'ÜsÓ‘4 ”û•w*™iãþ’1nC›Üî3¡Ú¦Ç!QbX_ŸQ]0g- nWéS!¦Q•uz3-}oÂFÈÊnRô˜¶Ü¬š+ê´¥¯ËLß-þf:1‘A ªß]¬Y ÷’<â6äçéE»’Ëè#WLÝât<%Å&XU‘µ&cF*È…ip’ y¨«ñîWM>ɲüfÏúe&Kh‹Í8x¼ÕÊÕ;+ÓmƒbÉäù]íæúŒûPJ çK£¤“ôºn€ÓïkkOž¯º÷¿çßÝÿnããû_´/'ï5¼UFƒIœ¡e‡´%¹% PQJ:Ì—ÈRð¸bSõˆ+õÁ6¹ø¾^d°}b}á3ÊJüîÈÝ' Ù,{ßíììí7[Ͷ-W¸X>.‹‘W/¡d¦ªèìo¼6ÈQÚ‚¿–ôÁvæ= 0Uã=P^kyÓÎÛÿ«Ê“jx¤3gCIïYåûA«Ù°º6Ò<P#Åtª{3…N‚4ûP×äÙ~ÀüiÕÁø>ž|h³ùŒªé$·ÐmW‘,È’XPøH¿(‹ê˜qÉz#z¼²¢šÇÜÑÞ1ûú_/on¿m6€<ÛÄнp-÷à{:MÜø#yåW[€.wæ&PÔâ—{z™ê&¹Àq”Ê…L[–÷Òœ @5¤|žâ€emáæFÒÊ —u Y? Ò_À͉WrÙQ1ìª9 Q6Nz…]D/·XêííF0Š´Arâ´€ª¸RÉÁˆ„MŒ!g=Z Ç¿ÂÏòච܆½òjs¢VÚ‹ðžøÓ xµÏJ¬ÑIxdúVLò¤Yf"v°¼*z‹Ï:ãIÓ݇IjEg=‰HE(¥€¿’óaÆò ±‘ïÉ£´›L Nõ¡w Ä€0\œf°¬ Å“”ƒŸ’Õ¤[ ËRÐÜr9…J΃$˲Eì3±¬fß Ù½UCMáÒmþø3ÒScsYüU¾¼ü ®Â+à`s4Fÿp1ÍDôÙZª¯—›»‡¿|DG" ÚaèXDùg¡þo­C´hé5p'î©öæ‚ &02ŇÀ…¢®é»Xc¿§þ¬Õ£X£¹'ÿ¬ýj­F©¼Ì:Áî¾>;B™å]¸»—¸ÀøíÝXU¨lLo…¸Ó0Òô$Í»—QhÝ E:ÍNNÓâ5ÀIzÉnk(>uBijÙ©Gš¤&Ñ@ô|2p™Âuê¢9`¢GQD v˜D4UeÅQ§ÎìúÑúzÙyù»òRJß»_°‚ü<šöþ*T³÷ÿºŒ¢B¬Ûlù‘íædsRm¢^YÏÙzœ.ˆ£°Z1ǘõp¦Õ‹ >e'òpPm\¯WvκûC´úB£rî®FoÞ$¥‘ù(MQ'\Î.”c ,ÿÏ\U»°êrt·‡$‰=&\¦@HÊË'1Jw¥&@G4ÍÀcÖÜæ'¥02GUZl5+,fwëÑ¿Võ—Ö/‹LötÉÐæ Š™~lD+‘Yƒl”ª\œ×ÕèÕ…°‰5°Ô€¹<¶Ð“CMrÝb\f¢›R-6´½ù€B¶S­ 6j7§Ž®Õ°V{)¬—t äÔ"vå;Â3¢Þ;eÀ ÃÙa æ-àÞ8rI>ÒÃí ½Ô3ÇvebZ´&’Lœ™‚’Ù¯)BûdäÆqQÿP[_G $·ˆi7|xabàÌpÔÇ­bx!, ášÉíG¹Xº'1&S2“OG—¤Fºlm‹±x €Ãœ€J˜¦îX¼Q°k’*ÜËØ7¹‡|A30~T¯¥g—„6û§ÐÁÊhåÓB#ŸÎû>6‡S¦fPš¯“毵Pû:F4>·Ÿ8ZU])‰å`z ]_]^V(¦ £ì FLõ~J×]PÞÏØ@ªÏÁÚÒ¡72 $“[3œoÕëÊÿ˜'5ì¬IîKÇZå(‰¸(ö£âàeެÇ#hÚ:½§Á[_Ü“AN"|ÕµT}¸8îÑ,Ó_4ë/kµºìÔô[|°ES•Qà›GfMMÂm‡ÿó–Rð‹Õ#»q€‚ŦÄTJB¢öÀ!Á¡p¼ ÞÜK4(`[_{<† u¿-ºÂ×qú—-ÕíwØ 1¨+â¯rt—…œ:ÕR²q(ô/…)ƒ`„­áÂÊêrÈŒ1|†H1„›Ð ƒ³$x‰$½”圈rÌÅá""S‹ÔÁ`”V`Ë‘ÓXâ1Õž‘¼Ixt¸ù$ˆNNÜe-À¹Q¢œ\w±³#x%‘Gõõ˜ž†c‡î6.Å!‚—˜[tE:ûš–¤ÿ‹÷ƒÊ}èŠÑêÌ”':ü܆C‹Rl׃:U¨ë ¢ JBåQˆ§ äöÞq¢OÕÃGW_5xîØa5³†oÎq«èDô5½€ÝèDe äv!în²@xšsî^Ý‘ï„ú.jÑúº¾ÐO ·H÷€çy~OƒcnTö“rÚ=uF  •I”d›6ãgì7ìè÷Û¼ÛMˆ>ñŸ›ØpªåƆ£*u3wœ…C.4U~®µê §¾nËÍ;vÓú}aGð4wîÌFxûN–¨ÞxR–æì<™Á«J#¯ ¯»Òå;1±ÄÓÒ¥j¬××svõ-ÛT.©8d9œ‹Iáò:sÎÐSå•ÊZÙXÈ_3¦áÂFŸo\|WbÞÌC¦ñÅØYI’ŒÖ‰5­£Ñø‚Ö'ÆÍã« aš³y¸J± hø*—ýHRÔJ(ÔÕF%r›å(é¢âC?M éÍYÅÊ}õ0ˆ"FÚ<–v´èͧ·Ie– ˜ŠªÄ^ð+{e/áAÅKù„ÖF²–xð*9•Šp¬çSº¿õõ{hæ~n ÔàSÂrMZ}“·õ¤auWŸ·4ƒ·ITUŠÚp<‚ÚFE†w¾vø—0Ù®ÐE‹Ö^¸ïšò ½±rØTõâZ}¢ê÷ iuÃ[Z‚óa3W¦†F®°Ø4nk˜¿*‹(5)r="¯OR‚!–­u­•̉´¤¦Íl*š(;96èþàNx€*X%Šª›¸,Ø.t)´¥é}5ÏÊÓ´W%{Ì`žPoòêøÈ¦öJ\Ö•äÒò»lÌQ ¥êÛ[çÛVÅ‹²Þo‹(sÓuSÂÏÚ‹b]ÑS¶µŸøÛ¢Eö+>÷àvIêðc³×5ü\Ñø 1Á†gÃ|ÓÞïjøÍ/~(ÛÃŽÔ¼ZåB¢ˆ±ÅÉ¥? bH’f­8|ô¥ŸQŒéQ8…㨟V¬2 O­ÍVKâfê  :pŠbª('mßZqëš>×ÿóÚ 8€žåÿå‰ïÿyíéÿ—[ù”ÿçµëqÍÞá,HñŸh‡œzÛ+è zíkœA_ÅôÈ´ãóy¶ƒç?ºgÎ?sçÿP·Ìʯ²í,µÒ»ë”é6ËÐ4– .`•{b#6¨å|Ø_¶VópñæÊÚ•¹Œ[÷¿ú­?Ëÿ`®z›Ã¤Ÿ–]`\¯…˜zþ¯®$S¦qc²M<ÁÛ Ñ­ÙÅ•o[AËT¢µŠtˆJ•qŠ‹ø¯ ÍZ‰YnVü·ÃKw‰çèp—2¥ÇL‘Úú³®@ìùË"÷'‘Ùžöël% ‰xc—5‘ÒW{R‹â11X}ãö" ¤³m¾ëtG >JµÓ4½U›?+ž˜õBÞÚ]W®å¥NTÈáçÕ¸HiÛ°å^ßøš5V¨…–ÕVX;ÄM¦£qŠú±$ÇȤ*Ò1©¢¡ê8|\³— ô(ESmr$È É—±*ž'ˆ£)PU ŽNZûi2Ô1Ò¦ &M1˜Á”5‘íڔέ™CÑ•åeé3œL¦ñe§sY´¢Ë‚“æÒ+¼i8ó~ÉR”â…¢Zw{`ªŠ  þQÚFú„h‰w²fîc‹¾ÑÕácÍPp/ì%ÓxЊènUm¨ "±+æëXòˆ‡&‰×ô&`š³¼+ŠÈÇ {@ð•g‡®¹Lì(“/£·Q#j4bÙK¶¶ÄñrYh—> õˆyÀ}}Y^hXCÜæØZ¦ײ/ìîË- Ž~•¿šß¨A`! ›ÅhdC˜æöaûðè`{sï=Fý•°¾@^Œ)ì_ÑŒÿT‹Y¯ëÊÛ«Ü]qåÐ v/eyœþq;/Óò&#>ž#w‘h•¨ˆoÕˆ¼êž\®Íki‚{—޶žt·åΛÐFuzŽ»  x—á²ÈêÄ2/9³XÊ4}µ™‹ŽˆÃ1CoË š­¨!v¢FYíÆË¡Õ(Ê [=àÌÒKÂEzhfíÅ|TšEeæÍ7tð&Ъ®j[Ëܰ¦±l»AE÷²VïŸ6cD› 5œêYÅ% º»Ù»+"{í·DJ&ÆÎ*E¼L;c\¥]¹"¯¬ƒx!c`“äf«ÿÐ)2É \_¿*9°U7žˆ(á¢[r;^wT°“Yêî–Òs 1 ².]œÇ«i‘ôV—™s´øOõ0d»ª‹cû“«„²vöîæãíÝh˜œèMY¢XLžãÝä$¶1ãþ+¼mthé¼f›áv8ÒP4ÝŸZ iÊß j@™å ۠ʃÏ#mû À]I'EŒ¢J Ocý>à ºlfL ±VzçQ¬ÂsÌÿæ ½{@Q/¤vøp—K:uÞ½šqRâй>N/ÐÂ!¦ß›Ø¶IV,©.~vVÜ„‡‚¿ÜOV$©u÷KÒÿ‰^“â¼Ç e½ñLù –?R¤4þŠOtç¡çì­;¯”?&ÿÖÅk#Äaæ7Dœ(jUt¸Kd©œ¦÷ˆqÄT)|>¯*YÁ¹º—Bg—WròÉá¡§›¾R ·¸%GЉäWìÁŒ¤Cäy´2¿²$z˜NjDÙuàsëóh…­aÛ|¹ºQ¯èÁð3@Ë6`VüÅý–©‚ Ìj¤ dô‚“*Ä“þ÷0AOÒA2ÎbÓž'1¡æ:·`h˜ëeêvÜ8;ª 9[¨h±ˆE^h¥w«Ž|Û—Ö¾¨äÙÆïT9?¡²Ê‘=-;ÜÚÚ´xÉXù ©Þðå%º[gIA…³ˆŒÇ’Å;©{1™"6n3“äS‚hœµ~ … âÇk²JWõ „}Ó~{4wA²‡çîF³é‡0pሀЀv7õLÛFQxjÂ:ØÔ0á3SWÜÆíÚò¸ÓÈÇèUÌ.×ò¢ SîyHkgî'¯,q_7Rì…XÇÄÒ7ù¿6¤Þ‰êX’ÎêàM/è¨Ñhú£SQAŒÜ¼õ¼~ËTå)ŠÊ;ãÁ¤£&‹õ«¬cGNt¤é§ [‰šëy‘öÛÖ¤’â- q+*Y°¼÷UM›85To•ª7%IQÿHNŒså¸Ê"çS³“ŒÙuë ¶_þ~L”ÕšáxdnÚv)µýûäÀŠ3§€RA_r µ”§iØV‹gÒ'™drXv z‡ïÉËÆÃêÏZ²©Êj¡hkwÿ`û îKÚLÌk•¬ YŽ}áök$Ñ] ¿4QL¯0’ÛRaa5ËÇ!óg»Ý€KLœŽŽÚþ|¢ôÇSÔ…‰Í¼ê6ú¸c-`&ñŸP Ïl•¥5ÄŠâ;µºro¡£i4•óâ8DïW1f¸ôg Õ¦~ýÖ¼iT}S±ŠðŠVŠÅܲý«y®©X<ı½¾|Sa²nMkP]Ͳ½Vk¹°I#¿«:±£FCÙ½b]± f­ÃæÍ¹1.¾£rhOñõcLÌ4wUrAÕ°ÇÖê)ÿß00–%É`}2¨:%_‹`GÏqóMæó£ÎçŒÌýÔÄÁ7KŠïqf×Ó•hÍGkÒS?òÍ2ÕcoAþ€çnÀ?×®xìlœÈ’W­]õ¡ÇV\k3îUŽ=:½B†ašœòýéE"Ôâx£5oàØmp•q„’ÄïB‰Mœí ›š¹E­A›gÎÑô¥Š\s-0«þèïÿ»gpïÛ èev5OÎ vx¢gXÓìÓ­-‰ O™uvè­¹%ìpbºìmw0X@Ró‘„w \â’Pðbûûíæ±(~ÒlbA⇷™àcU.X1ŒÃ8‚u¨ó",wÐ\ @íù¶èÒ³&”Û12™”"þâZQÖUk€"áxÑF)\þ×FS‡I—+7j¬áU:VºäòK5ü±áÑ–š|¸Þ¢NÊØðE"O!  ý\„"½ì©|4•ĈÒÐÄR±ˆ(Žè{Á÷’Yž]¶˜D)µ“½r1çDP ÀA–¢áRAÂ$¾1çBhŠa: û®ûíLûÝ!¾·£'Ê”G¼TÉ$ßT2ö«ƒä²Ý?MŸNðRw ZÁäÊúÉ.Z›–#²$Ì#‚ÐÉ”f¢*W•,„V¿ýrÒme¤~ê ¬vYž(úx¯-ëe* œéè±ú»ºË*Õe€ŸVÐýñòåàÉ)­uë˦˜±êWÐÑ_Í¥¼èt×ýjÀu§ù,vu® ½’"²U *¢MP[ëv6*È\…äSÅû)}ðzYQyVU ÿõÇXÂÓÚ§É«ÑïtúEõÐU…ƒaS¾‘>ß à_UÒÇUÓ¾áM»ZÍìÅÒqtÏ Ôôw:R»R0®—ZÒäM@> LÌÓ Æ™"Eÿ"ù…¦jËmÍ¿`à£s:sàiœ¢c]2´ €ÓÑ3(ï]ƒ“ƒÅy¶2ÕI®‹96Xœ¶ã„ƒ ‘<ÅÍVöÕ<±LËÛÏ4… Àʯ7 fM)o¦ÖdV+@õغoEq?ÜiÁérõ1ý9äΡ¨é‡ê65Æßwêd¬ƒ~!vl½¦‰Äž99¢)C(EMêsé-äj›ðÑ õØNÖy6”“>á;ê“tvAÞ…bÅT¯( ^”؅ÞÄJVý€Tþ¢"…~(˜Óû>Ó…¨?þ}³½/äw¿±1åŸ~±@*ŒT"T ØÏL/ÉV«£+/€‚jó•Û½WQìtïGèmöÁS,”Ÿ#mÈ8‹z*²"iÚu5kW÷äÏÙ”è8gøét8K΂[—’ª®¯.Ï‹]mÎG9õA§Z”[f áÞÚkå;S!rš‡ZîX¶ êªj¾pÚX]Áw±îØièKt¥:-‹ûì}ÿ¾_̺˜í,ïuH³d6ç+Àöžïî}èt–å/Тõ© lÏ5„S€¯¼ñ@«!ÿ«Ñ& Œ…IêJ´m–¢Qe’_Õ5F :ÉtL4lx‘\n³@%öšdWz aO×T™N ^·ëê6gÓ;§ËŽºI‚n¿¤$žœÐ•ù¢HL¶R_£THµ? úùݤ¬T Töüôä+j4ÑÞæOu·湎„ £ÄJ·—¦æh4=™©ÉÈTóPN’Œú!\›tO8øÚåG7ØêÕ¹°ø3Àh=çp1ŽÉ.²$¢ÆßøXÛtÐRRýMÜPý•Š ÅÕõ‘·nå:ìu5¯§X7I…lšt¦ŸîÖš-Þ‰m! N_qÎñŠ)¨^ªºÿ(ÁÊ K|[Xq»ŸØI ÌY–ª—°$Æ8ŸC²Â& éå¥dìð]>R‹V÷æÂYS[ÒÜ 'åhY€žÎØÅ‚Âûм.ó=õ¯âêðZ}áôÂc«BGvÜT–OµÈŠçßB޵Tžô)D"L‡ãÑ9òÜï6íHªaØÙÀU¨ªâN\Ó°u]è2+1“Øð,eå·–¤ÔúVi_ä‰5tð̦qêÆ=±± Œp'¿Ã»ëš­:Ž£nè6(ãî#çò0â?ûÔÈè¼Ó©›{KdjcWè3V,(þ9Â8nùX¥[wSˆZjOÔ{J8òIJfq ˜ì‚ޥɮ$ŠY±ÉêLªî[­ç­ B¿§@ÙàŠRÅ™¤qÀÌõÞñÒÑïAž¦?ãŸÎŠv´?'߬šKÈ[ ž÷(ÚÅEǃ[éñYsïo_[C¹@Ey%ë¸ÜŠ!ámÅÖHŒ;C_b|×ë¨ Ñn§ôY˜±"ôrÌg(b~ ‡Å€Yûتpä=!éß²sQ=©ªðªHÝ Ò~°Üm“UÍ'–Vcf³ùp Õ‘GF@8ä]]p‹áeÕL„õTÉc^ h[ _m‰é¿VZßgHŒÆ¿#ƒ€‚wïé„Dï9];'b,">ÊÆ¤:: ‰ý«³è%ä‚x$ wÖ²òŒkO¶ÉN’~XÀä…zôÓ8mÈ3KÞ©¤æ ¾å)-¥-Lò 8¹z$^9á !Z á°µ›P¦ÇbŠ4ð+©úÅ1+zV´XÕØáÞTl%s²`&„ ²(ÁÂØË7±‚¬äGZÊUN_ò;ÛRoÉ–LA­S{~éEŒC6mösͦauö{Ô5uW2Fðu4²Ië®Jð1XF=¬ì¢ò0«bö—­‚bì™·Pýñ£ã:ëƒØfò£µh#@¸ ¤uÇD"d…¨™&áPJo“íˆ <¤è0Ã;ÜãŠ×!|{˜økx¥ÝÊ1f1LËYÆW-‡_0 û˜+nž8Rž¦”xLnm ßãuU3üÐêxÓÏV]ØA |¼ K¼„ñÅžÓÃàk.a_ð†­²0ùØ5Òñu}ãµÖ5¤·” ©ÚªhŠA‰M•­iñX öÎ#˯ L”H9ÉÆ#¦¬TúZ+"€D v68Æw=ðèð"ŽqûqmÞúlì9KÔP¾šiJI~•Å…Á)‹e#Æe®³Y¬S5¹ÕĬ‚:VËe.ªÄñ &ˆ4g©‰¶8|t–Îó¬˜e=ä10þ¡Ì…¬6¥¤’ÿNÕ5§Ppr6Mâ:®àû‡ m¯—FaÌtÁ`1žðŒh#ûÙtmÌ®0û;ŽàŒJRU~^.?–g“¿<}2Mkd¥kS(yV¶ÄÿóMý´„/Ҿ˽ÉÖ*£!þcÝFËuR×óB ±›õªÙ•mrڬăQø]ˆoó§ºÊ0XóMÕΰÊÂ^Úè\_v)×TŠzáBAŒ Œ·‹Ä)ö@`¨}ÑLçö ü¹ð‚ -Ðnû¡ÞÊE:DÁ¡"¼Ô¦ÕßU§i¶ŸLC1ë6Þ¤ÉÐÀ±¾¥0Á@×þ£´yU>KòT³²Üˆ^M~.˜ AÙÍïÒ«Ârm5Œ·o(ö€ß¶¢öia‘ _ÃèGj·½mcÖ³ñ¨J³SÍG›cJ, IORŽÙGôÓ’&ú²¦ªrȨ›žçÈž’¶U2zÙLs‡x’ЊTßT×ÜS“wRT‹r<:I¨I:Ï£kt¼ÞŒî.Àj μŽ>’ê{mŽRtPøÇk"W¡ê¨„Œ™ 5àoh§™|Š“Yl<ϥ땈Z Š¢ ž_ã}‚ûͪʘI©Ö·¸äêF\аPÍle$¨G,9¡ûܪú¯,¤¾W\c—³ê þWô—ÜfÐßúB£‹Á ¬ë`BŸñe³$µmf/«{èÜ¿T¬ À½’é–¯fºæ’Ætmä¯/?°Ì 6³~|¹\Œ¦Ô@ÝIèÆoÐ VÕ`—5UªÓ!Óñ‹wçùdÿû9ÇÏ[ú{%^³w§.W’)’±º(ët1¤BðPxï¯N°Q3ÝæJ-XP¯šýª¿+`âò#@Bƒ`A ±=/ãAP [R­ˆ¾Á¾S\mº~‘"Ñ2jìRTë>JEœ^[Bý æÃ(Á©»DG¯Åì³äeB§Ã¤Ç&‘¢‰È8ë{rNú×T¡U© 䨡ŠÎDVzó=•ËB%ÄÈ)×…ã鹨ãŽ|Wã@ÒŠ¬9);»ËﮎzÉYáùï»nV\#±†h§^ º™Ÿù?¹eƒžñŸÜ'Ä®"n÷ý9ºŠGóG©x„+¦›Ôå[azÈA[|¨tÙÐnñ<K>U6k°ÓlgWV¡àÔ D0¨x´Ï¿ø“³3Ák)z*nV2ž3™Éîô8—é½å¸dTÉ ©"2Z cªÀŽìw`ÕìÏBAxQWˉŸÄP°+%&®¡è#Ü£'ìlžþsž¡**%nCÙc9 €’IÆáB-¸czñª}5q‰wÛ£4?Mc\²ê\ß‚«%Þh¹ÄŸáÒ¬BetšªóhJåï^擳ˆæ8ñlü™ß!;1gÎ1£0%“9-Ç©Q³.–g…ãÝî þÚ”Q÷Æq©Ê±¼Ò·ã¹i“ð„{~'—╎'5å•-þ/´Ø³ƒP±|t£lvÄ=Òö#+*ÎÄ2¡€ çx•ÄeK¶7zÉȸÐYÇaîÐ?yUi¸E1¹¤ü…¥C”YÃ÷Ü]ÈŠŒâ„ Ã ùø¸ ×p4yíZÞ.U›Mìì²óJ»pœ˜ºé|fwºuRÝ'õ¼Çt¹Nô-Vª¥ã<Ð.)¶l+j ×ßbsjû µè®yk2½ŠstË‹…žBd- ¥a¸™øGS ÂŸw–pÓ C¤;trhÔ]T û8~S"ö¼@ Tì÷·ºío©ý…Ç&qö=dì< çŽÏ"Ûk¨®°ýX蔨|œim*Cdfc§ ­|ÎÖhpØW HÑFº#Œï4ÁÈàó´F•Â|)Ö$LeDmEhçëì¢JC{µÞ÷HÚ·rÕ>sœ›–p¸µòãnW:²”ÂQ?hC¡êw‘¬—ÄûQáßôÁ†XTá½=5ˌ֡–þð#É<ó´7G&xxÌÀú•HæDd­÷ç”Ç!)[ˆš ½|ÂRkÒ"«²Ð]1D…åÞöçôMc¨0®œ,Cxmæ¶ŠúVO“ë¤'¤s1Ù]‚æ/¸Ðü%èýGr¿+ñqülÒ_¶GoLV–a-ê6Nõî«ßS7ÛO5;¤à8¨ÓºäÆððL*/ƒn‚iÔ²‹h.¦ÝunºxA4ûHR·g‹o'ãNú Ø%1#ne±vTQBK°½QZR’Ò(E„oúÄ’}§#ñ'ÈñtžäÉx–¦ÆÜs¼*?«|ãÎÉSMEjj"¡9K¥Ò¯@@É•ºÚÁÔ‘U Ö­K%ÜŸŽš‡…¬zuôû­®oææÆ³[Ë\ «`…±XžSaštŠDI<)1ˆ&Å̹2AÀøv•ொ;–¶p¼É’^>) Ûk+à øTô&È(ØfyèJAÞ¨'©v‘žä2!gÒðå ]SmûrSR§sÍr‚) bÎÑÕ®&žMBZH–÷¤r½®uI8‘¶·6_nv:t¬RZ–E•Ž;Y’Ÿ¦3bcÔkyå×ÎÆAlWWiU‘Eb!c4Ï3Š VAÇ&¸'vžÿïW{/k¡ ÒU5¯öw9²åó›M|Œø²Ð;Ÿe%äSŸ3XJbÝ@õjÍvÉ =§Rß2†áOê[ıúQ/|Fúºí¤ŠÛ°¨`ÝI¼¸¥`7¯ÍVÓ!¦„¯,é4Û% ù o>|´TæDkQ —…¬{WþjÁ Ha”'®CÜ%—ôíÞ6KYT>èWÐ7úÖM¾UĸÙi³ëkÌv1•ʈ-aµ[£q‚Ô+Œ3Ö\¬ÀLJv«,¿¡m™‰poÛŠí‰AX/É1/™7+sfP.2/’C€‘bžçiÐäš>UƒÛ1îËù´ÔœÕ Wñ±^ƒ€áKyIôÃÉŠMàz•ŒÅÏRªp¨¬r ¹ y‹û¨§ýÉæðÖv6rW*çiŽ3/MÄz]x톆8ãAˆ$´c†ù¥ûóN¬•+«¨_p§o¶¤³±ÁŸd§r³GM,¦1ôæEeèÁnŽ3ÑB¼—§.Íy§"øNwý!9ètÐ÷ò¡Þø¡†Ôé– Çâ}TŠÅ“íÜTÆ7êsmÄi/™É¶q«jAì2œ(Ñó®i5è‡Æ•†Jk¦ú†±Ž¨EÀüÐå3þÚ\ä=Oˆ"y†ÀKýJbÑÞîÏGÓc)'yÃÑàK¦ ü%Ä.zͬÉqž´Â¥(·Nã®Ú‚]WÚùîì´x+2žpBŒ’ƒC07ŽÙD¡YÕ=ô'+ŸL7jž÷(P9¨w£ ]Âκ‰:üÏ_þ|þž½ÝƒÃ­{yÿ¿FûÝúà8ýtm 3þWÀ¿÷ll|ÿ~ñàëõ¿¬Ëó5|ƒ÷_܇ÿ{°qÿ/ë_~±±ñ—hýÓu¡ú™£Usýå§[–È pb+·ö÷^¾:Ú†®m¾X‰4YIzgid’2còfÙš«2 l¸=•^ÿsžÎS+¥³É[ŠÔò0H;a3.M„ª¥— h‘s”©Ÿ¢«I[>>Å+ˆ]*>™Zï%= áGÑÿ&´’‘Z‘;…Y?ÄL%Géqhæ{ã•Úf¿ÔbšŒ%u%ãï’AXYÿª«!ö’¬w5nêôi,ÆjïZ½Cm„ø8:$o^¼™¢Éè±,‹ópqFÉÕUjiÕ™1Tà8Ù¸ºv*-hÙ Gt®çèÄÂqÈT"¿¨àÊÕÖVšöø¸•4['d$AUFÉeœÀ‹&öK €‘Ä€û[çØˆUŽ øúl{ÿàÙöñÞþ÷ÛðëñÁγg‡ô«FÛ‚§˜àx ©På£óbñ¸ÔD$ý~Ü“K×ðjÖ%]¸–*ñ%ÙÅöîtàÄmèùeÚ¬P1%.âØIÔÖ»Ó*îRÃÆ"Ëc”6/;îŠj·²)_pmßLvFœÛ…I#*bÇ÷¬œŸKö0RbKöý÷è] Ž›Ä.þU\ÁQÉã2²–!¬xP‰ÛfŸ—ì·äЉ²R ý±4d“ñðJ«É¢Ã &~ÂëÓØ*Ò2Žj—\$mR¨°Šœ7!Oõí”Êú8È'#7`ìj@­-n’fÁ«h±&t»SY‡¦Å2„Ê´› w0íÂg¢a»¾N½:„u-â‘àžÅBhE”.¡´Ø ¾pi>ë;á Ž: ô)oQí€6ŒÓg  ô!œ|Ù໤8;€4m ~ïÓÑÞ†¢ûƒø6žÍrãEÏu¾«(æŠa³&RÄVìD?ž "ŠÈ²(¦ÂiÌ>svídñnU¢@Ù$ìüÏ×±NÍÒˆ¬ä²|æ)Dð*8'¶Z*”î´… ÂPI®Ô&QïeÙƒÓÍÊAK•9@àµ:é$w\}<™@:„1Npk&Å9a"í—«Ìf[Pë6¬Æ‚â³É,QÅMÕµh‰ã3^%“‘dŒÁhâ˜Â^ipÍ»€ãM ‡Óƪµl¶a™NÝ…­ò%ü×fÏ8òàBÕµzîEÔú]ŽËÕ¯Nºn%$&ot¾%Ç>;¡ñ¥ÂbE‡[ÅÀ_ˆý·Ù…°ælÅ{\±”EŠ8SþØV̾v²ÊÝü×0Žk<Ù8F»Ë€®=ÏJ4ÇÀÍLâ¡1ëß™t§æ>Yå΋ø=i¤[hRò¡EùM×¼G#¥ñÝqµ9’Ü 9Áœ·•$ñŸõòþ.PÞt-š~–Ê0¨é@eÁjã&á‚ ) ‘¡Pv»k;¿¶OÊq³¢—ä}‰åZîšy£Ñh6/Bs=SÄᆌˆI9’[Ýc]ŸM•QaY‰C‡"$js†­= Më)1{jÑIäEá8ÏÕ,1]yw)´‘‚º, é»I-–ÄZ“&¾qŠx™‚¤˜=ÇN„!î žûÒ £V70FÝŠ39·YáL q¼BüEÓÅ‚¡œõJ9‚ÍÒ#ÀɆå"­RÒÐRütkÎkGéVžȨ́솑‚oL)ú¥£/*/p^âw@=@ðQB¿D•ãÖU“¢”þ g¯¥ ’TY„ÞÈÈS¨2:Ûvk)žV%éå[pC[µ²þ¢Cž1ÞŠú÷Ï;À‹ÇèÿGéh-O~¹¶¿üÔëÿ¬±þ…§ÿåÿÔÿÿÜÿU\P2Åt4ɯl-j/™&'Ù£²K&˜R{»V“¼íÜ ìœƒÍø©£HJÿ§»û?^¹éýv´ÿ¶òßÖü›÷›_+Ï“+çíðö‡INüÇv:™Ÿj/„u/ ŠU*OØ–ïG ¥a—?´5AÓÎa{ôŽâõc ó†º5_3óÓh­ÜÂGˆbã`S»Þ°QUDëÙilšO¦Ë5†%“S±Ü¨hÍ*£\A¶¡— ñrÌ gÅQqª›ÝÆ7{Åi›>Å ž—F 5é„#ÖcÐxÒœ…8‘ýkõ¡òEÞÀOxyÒT ŒÚ¿¤ðÏÆ \Vìãf%%Å»¦¬yÎêûõ7¢õ‹uS PrwÒ‹éÚiû‰ãfrí}>ÞÝßŠŽ«Šìmïl?«üN–ªãø^gU®Ü Þ´ùµ2½ft¼¦tudsL:-•¾ÞÉ}È::TíI­p%¤Âðl¸M)5²HÜLsÅñoV}\'*Á§¹µ0î'tI–rZ€èñ^›ÿŽoëJM« ¤Ìå’¨Ýu‹e"ta ÈÑ„g…ù(Ë-—;³‹‰; FLa¥°y˜ÃÏÎïpîî;+·®ÝÏÞEeF©QtUìÑ-DO¬OÕY‘]yM¥ÝÛ–­ýÍÝíÃ-@÷ëhkÿÅáÑÁæÎ @BçÒD€¯àöFú¥ Ù¤r50â`ƒ¡þßâuñ$œ^_ÅõîŽû:衾x¨¬V˜j…W zÕ`RçѸe$˜¸;”[:0?)>°/½‚ß³+°Ú^­ÈÚh`"#E!UäѼ{}þܼãþ¬Üræwï{BTô–EÀù‰ ·Ëp+²]‚  °½·¯©?vâÛ4sM3 Ö­YUš‹J|²déØ"7Ü\‹¡Ãx·÷^ýC"jÒæð¾loÇz™û=r}¶" ÁÕÅê0Š˜€Ù‘¥é¿OTEÁ ÉÀ«$‰Ô7î^òÞá¹N—ý‚}rð—üq’‘ðzAAe߈㷚ˆÕ@¨Ë·Dþ•Þ‘ºRg™²ÊELg=^±Úã•MÑWŠh3ò¤ÿSþG¯ès›BNâè=•ÄÿÐ/5Yiòš+œæ±—ÒýhŽÞëæá@%®;ó½Éè$ë§þOI/÷®"6:7óJ)*Ç0×D¹MD)þ Ú¾–Ï~†+ÝÉ#î"“™”ÔjÊ \Ú{±µt(¾ËÕ‘+¦(º†›ƒ~I eÔçhî v«X1Ì¥ÊjÍócQªÆ‰ÇTÒøû¡ŒIuoL=Å6 TÚÐn9)Äe®#ä{‰ÞT5ݤAÂãê.b¹Cþð{‰SΣ…0šëT©œdCÔ žöÄ«¹ƒZ€u‘°¿¸ÁæB ö4öò‚-°¾Ól?º¨çB`u£u­žwß<‚q-Òª6øS\¢ë)VélHx¹öò}êÕ« Ûôë/Ö¥·Nåª*ЂӕZþ!VI3å”ö$žþÛFr¼¾!âËMÝ`žHóè ñJYæ0Eõh±ÅÐþy º+nBïu§Ëo+QDYH ¿Ít¸ii´  e úšüýkC‰ç×J»Z”^;Pzd6BP†\X…•݈¹`¨è‚*hw¥² TîJ© ¡IÓŽ*–—(Æ‹»Üû}ð‚©)¾øDG'óþi:séÔM6 ì¼£üJ쎕ÀVJZ;Z²¶¡¹ê@ÂZÍL2á ï<|¼‘ižÍ26·çÔÒ cÊËõöº?72g]Ó+cpé=ä?»Ñë1%, ¬„Y=1>b’Ř ÝÅ»†(×vàܘ_sï$„sÛ­æÖÂzÔ%Ù´°V´ÄŸ•+ó­dÚ{[ËØÕ„;ÅË\ÌÔãùÇ(ÏW–ÓÓ`¦PÍ?5¬D 8¼Ê‘ 8ä†O;®Ü‡@ \ˆÐá$½¼ÓŠâ!ûß´Æwü IŒIwïÔ8ä7wµ84¼×Å‘í. Ùø6û¦ ¢êæt „'Þ½ƒc¨<4i‘¬¡@'‡£"ðµ]”v¢€ÇÁ¾býf¨ë”¥¢N#Ä,ä‚/ˆèU_î!¼ñ”hí .¤¢W¥©Ý—Ÿ],LóJPE1Ë6Rvý•ÀP°ª•žÝv»¦û¦tþ¤½éΧ—’ÿ9ªàOʳ…´°Â.àl¹ÑTœ}Ú·FiŠ.B#AÕbÅÙi³>ëSÃ9OKù8úSßnqÆR g âh•²­¬5«à«b×dÒ¹-¦7vp*ûÑ¡Hyñêê&xvXSfºZ•&:H–¦=Dä¼:´W#ºEWÒk¡ò¥—ga±\¬R/-¯QE½) è`ì°b—Æ5;p± üM£Î…î°¢)Q:î®Z†U¶"\¢¦ùcáeõïHƒ͆3TâÐ" Àÿ»ÂÆaKí©º`vÖPË¥L›f÷* 6Õ‡)ñ½ë-j²²töÙ¨‚ÖUÙ’‡”3”Ù˜ýöôE;¢ÙG꼺ž¶É!°”«U‘ì[‘òÃ+U)9± ¸ #—ð~ŽÅ­S(ÛVÖºª3=*ø$ù$IXÎЪˆC;b/Zä“9€Ÿ ì)ÜhXG棲ӜWÞê³*!Ñ ý^zÊ‚xUÇ<œ`6ã<š\Œ­kà¢Ü7e…صð-Ð~½¡9’YÍe˜¾2Av²\c·µ …×’c÷x¦è´¬škAbÿB0Ta¥lÑÍÅNd“lA¦>Íz:„º¿£;õDÎk"¹.ØÙ{¹p´ùâ(züêYôtçï~IÔ¶“NažÒÑt’'y†æ(yjŒ!³YÁ •Ρ†ÈÕ&LÚåði¤œ yöÅìjç7„*ë—ëë^™ÝýUBÊÜ÷ÊØñÇU™ëë6›ò"½€©ÈϳžE·i>˜ä#Åk™àБÀŠJÍcúžbÖ —ÅQöÒÙÙ¤ïê(xÇ Ì÷Birè/Øc07£— ñšîiÛ´aqæ{ˆ’^¼«l4JûhÏ8¼²eŠÙ‹É>C挨²A`¦,¼“-+ÈÈãŽØc^²”™åÚþÛt®Ý.Â/T’]7} )âÙtl … HØ?(*Ù€ËvÆoê²Íѱ‡vÿÆE³ªëÇÊŠÑí¸X‰ô2˜ÝôöbRF–øE/¡Â^ÄTCŽú–ÊÓŸ°`åÀI¬†Â¶¢ôigö^e§°Œ© (ü{È”QçHü•ÈFv<1 ¡ºœ ª¥UqÞ*Ì’Eµ{épøÈòÇìTQpÞfeJûXDÞÚD,¾=9L§ãÄ×YY–~»†Õšþ•ÌËíæâ„l‹éÙ2- ÅýÈvÔ˜î&7Ð,uÇÙFµÉtÎÃÈØ}&h×U‡™Bµ®AºR,"jP±ÆÉn=‚2ZvKXÚµð5PI¸@å®ÁiKp– ác [> vf.¡ïÚ?L·ÕùÐ-]õÅtQ‰¢?£Œü’ljÿ?P\ÊÚ¸ÍO–`Qüÿ/áo7þÇWðÇŸñ?~‹Ç Þ¯Co }´ƒäqû@"øãž3<íVÔ‰¶¶wwéýìj "‹Íâ’Í KHÀ¥œ$EÖã­9-Yû££€H`':©Êþ@òËu¬Rkèï=S°_¢4Dç\b•Éð¢¶çŠù·æ'ô¶`C¥étÈi§WmΖ/vGP³Ÿg}`3T©¦êÓT7åug È`ñ†V´EÄ×±SHÿhšÜ¤ÐHÎþï§ ÈýtûÓFZ°ÿ¿üâÿÿË øçÏýÿQØ;Ì(»cu !úÊÊ2yÄÆÍø&D PÆ’]]ptfK©÷{§Š Xé> ìšuy“W@§aâ0lrÛý –³ÞÒdѦ$åTÖæåë\¤¾GÙá´*zÛô(®&0þ 9E }®öÕêNDy¢ÎRvmDO*}RV'r±#ÞùYÔÝÍöp¸ùýö1¥q;ÚÞ{yh²4Ü4¾IÞP¡láÝ……vÖ±P³„õ,­›ëS"7z•Ø×Óä÷áìƒ#’jH bK–)å94hlÕ7$!E!Ü<Åä¸n®úÃÖšb¯¬d¨æOévÕ>ŽU¾ Kr*_í-¸¶Ç)Å'쇫7˜¥öf©¨çÊr™ªl)úÔ^¾Åj±¢¾U¹nGJÇ•Ð%¢‡ÃåÌÚ鵯]ç ¸ëœt Jw¥n>”òÊW'\;¥`òI+EÁ·E%·YåÝ“ ¼eVã´GÕüÍÇ¡>ù=rK}\Ÿ0µ¬×÷ÈïRŠÔ /̬fÈ  ï|8³Rêa„ñŠ·±9My3`ᑎ[“ÍTâ‘Ä]㫲#'BÂÿrA{’F)mÙÝ·¥ËÖ&±ƒ•Ö¢ùúÓ ½Y§‰Ð÷2ò…{g1Ìšc5ãlØ™€£Mì”ô·ÞÍnù<’PJ²ì„ têÓdŒé¾Ç“ kÞl³y£è„exL‘ØJ ÆM1 7¼Š¦9Ý™IÎÌOH$[%ºÅ‚¤„uJÛk€¹JÔ9KÿÑw[šnм²¢¢6Bãµ´¨q’ŸR>Ué‚j.ì÷kf!öʦ±nà1ù ¢Ùo¢"úÃ[À§œÿñÓæ~ÄgAþ·¯ýüÜÿSÿó›<åüo£dœœ¦…¹E½ÇšbÜšhÕÜ&I¯$ˆ•³@G;À÷ï`¸‰W[¨^:t¿Vd†Œ‚ª'E†Ð ÙÖöÔÙò5UUùãÇ›‡;‡XD‹,‘Ö^ie¼s¢Ç[Iªá * ìX?›hšÕ&‚M!k òû‚, iàPÅŸ—ã± ¯>k±äZ¥yƒ‰¶¸èµjÔ’ÊÓy’ŠÒžî?Ì`X ü,oÛ–1hÔ…$„Ï{†ag -}(Föð.(çÃ`ájÒëÍsëøÃáD P¦N2µ¾@dz1õi 0eÆÈË®¶«³`¼Ã÷Ü”~½°¸‹”K’9Ï)\ ò,ÿm">Lìö:ѦùÕ¶¿ ˈ‘¬W„•ùó}Ϥõ,£M«4Ûwµªc¥NökΫúf|X&;!§rDÌik<×8šÅ&I 4Û¼‚±5Gڌ XIêóõ‚£¯nÙôþÀ[yv <ïpxÅ×Õáv¡1D›Æiläæ(H-Ý ¡}Zþ4xÀ2§.zU-CSB¡¤@žq4¸<Âñ›%¢z`‘•Êâ?qaJ¨Y˜>šëBæÐB"òG$þ ‹ðŸ}’ü>ä?º«f÷Aù¹/6é| ˆJ¤Ò"lÃ^ }Æ‹·Éa^¢ÚÞ`y\º92©N,‹LÜ) uÝúeÌ&‡ Ž÷$ÏÆïÜ›H`Ó'=ßÃ%IÑ/>÷µ1‹A›¾:Þ–^dîêä·9^þ(?OƒC_œ ì^ Ðm簾ȡðrÝÙ| ÅôA…¹ÔݘVvoÊfâWš JÅй;Ã죘5êϧC˜½™8ËXw:ã€;Ó¦å¹÷¬¾S?qaJ7Z¶÷E—æÿ»õ-¥ü"ŠáéTÚÊÔ¨–”±V©Ä^¹N6Þ2ÄS iÛ-«‘t©PÐ Mk¹Œà>)KãOgn)^Êgí—/ƒ·Œåa „ðÎêÀÒt}ÚvL­mÈá¨#çA®L,ò•Ê«;:ø¥7o«r÷âC»«P½Z´•­¯Eˆò…zçi‘þsN¹‚9¡#ïü’O-üLfiËíÙh#µ8‡½›J6$1ªeÿOHÿû©3€-ÈÿõŃ ßþçÁƒëê‹çcõ¿GÄõ$˨ëÎ&4IÇ)¿¹Î*&ÖXy5n˜v äæŸo±¢ÉP.Ò"±ôÙ—\µè’nÇ/+n«ª/(¥gÑŸPß)>P1ÌNÏfÀ@êÔC¼f]¾ƒ-Tù!}:ÍÎ1uH™I4Wbûó¤ Ã¥óCªx"êŸ k>žeCðm2î±ÔMFF+sƒÝa(³t¬†oÜ¿·ñŽ¿ý­NF8«?Mr˜Áó4™(í”]Óï)dœv»úôJr´$ å)LFW¤3À!-ÖZ‘ÀÞÅ4íaðÆyrWÆ~4n•lqÃX| V6,gɾI?1°Ù ;5ãs8ŸNñêû"e°‰Óï+«$>óÖy3úf-¢¸ÚÖW–ç”%Æqñ¡‘^©÷J¨ÅuÄI:™ÌÎ,(s)s5B“54¿¾×Ž<6ù"ŸP€Ú>–·{{bMvÇ<{8ˆKu«Í›2çXf£ ð¾t¬l²qo’çildïÈá´3ÚŸFW¬Y#_p £Ÿ“+Ë#Ï}#ü·`_¼Kißw¢¨ÜÃò›p¿4°˜ µXƃ-Ÿ^x|ö8ÚÙ¦KQ;³e1’Q8w§ÇÛ{;GGÛTúÖ­[Œ;d¾& Û;øQl-õ¥¬NªéÜËÒSªkJ¼,•ð.Zõ÷ö–÷=û"meé~|¦ª‘aÏ3¯æcõQ_Ùj›ÌerWÒ¼7Z”»R-Ô»4£Ñαœ€ÆžÅϼùó^Ø2fàœæ)šS¦d-¿Æ00 '|oœäpZÑ ´ó€Œcï-—6nÙýB¡Š‰¥@Og÷ ¯û“Æ[¬Coß6:ü ¿êUƒ=Ð>lîooî½OG™É!‡_оZI“Ñë7Jõh„ц~rÕÓt¦²«êäª)-êÕÒ𢱬>Lœ§ ½Â¶RJW‰RÊèÄGÜUÅÚµ8› VÇ«áà5bky³¼ä#I)¨"ïC…öÉ/Fy­,·WóÙh•l•’ýŽéÚÊh­*TVFek¢ìe½“R;µŒþ¨¥4A–šC[M«wh^‹¶âý‰6Yù­<,¨ì"ËLõÁM„% $öβƒÖúå‹J4ÃjàNÙ$uXê» á¡:¤Š>TÖ&ƒBðv€mZÞg–Už 'ëÛ-¨ŠÅþ€\»§(¯'c¶‡w¬81À&KZNÄnñÁ8ò{„†Ïª@ÖwŒû r…ª/ÛÓU¯ôн^˜pξ¾0¢’;ÙdcÊ·Ôaëmk3Ùõ’~ÿ%RÛ”ÙÌ€‹-ÿÕøÐø›ÎFÁ•,öyúGJg¥P·²t`ª“Y™/SÊI‰Ù§ Šô]ë¬V¯ßxÀøÊ¥¨èÞ2•µü.¨/7éÃsOEÞ'ÁÔñ{ð|‰9°÷ TA>X̸M\…gíPp.Y¯k H††c ÅM }8ÆP £åà„ÃðÈÄï—ƒ&Ù,nŒH$óã7 g=(Ú#¹\`LÏ~Xí»ÜĘ´¶œ5™¿mD¯&Nqˆç‘ªû,²A"œ7ß6Þ`ôJê”p¡\>I×°¥DãíSe~ÎG³ã¤†Ï¹Î}„ç¤[56ö, à={’å~táÒ@‚GAævÙ3`•í^¶8&†õêʸì^• Ä—-˜*þ¥&–{è|ÒThÈXÇ^DÑ ðTg®Öt@œ²*Gkp§±Ï~½ŸÎ䚢hÙ÷.ÆTê/u®©‰³7@šù~ú­5 —âMáp­Éì ÃôÏ &GkM—þƒž¹,À~ 4ÇÑçD{ƒ™}<Ôn«}[(UAnH–Ú;µ›ÆÐqÞ%¬•bkËêðkKïN¿nE–å8¹ÅSµEq-.ÎRºÜ"¶²Ïׂr«½`æz“ñ,€|rEURdNì‚1À:†:93´ÁIQ©Ð\ÀyÙ1\””ãÁ0ëÍb%zR”Q†gAø—zí÷Ê"ÂyYVR@ËKáv”©š¤8¿³Ìa1=+Zv—MvèmáGoË;`±ôqh ³QtPîsjÊ4wls|èÌNwedÀJÑa†ÎSæÂƒC·íhè1NòƹâÛwâ'ë;F”;¥õNDÕ_Ä…4—¯<°Áî»LÇísΔÊZÞa}œpôq²‘bçqú­8ÖãCŒ½·š¾% 1X¸¾ÌÛfŸ¢ Ρîx–ʬ‡Oc¹zpÐEîëµÅµ„ÃÆAìXR:x’lGdV[n ,%h];·.›ñwM^4€à¾Õ­|‹-I؆JÉ@‹"îq)Y¤²%š‘Ê–"Ì’B© ÃQ9kR·Q5|y½aç&ù–³ûEl/P“SÜàäT%=“þþ8†ÿ‘z\Ô÷˜ÒïT•t³]:Qãm°·Á–o&úg¨b†PØôF¤À²¸UˆùXŸøÔC2²Fé“4§¢ˆ;uQÞ³dÄ’xóA±’‡f Q^ ú^ß–>kHüÏwœ|ƒÔ‡ÆfI™£E@íÖµg ôs}P€7&¼¬Ÿ¹HùÕ¾ bʳ2€t0ÈzĽ³t”vëG£sè0_@Âeèw¹>ê‹Á&G{¨‚£zO‰êÑSê7GZ…éÈGÚÍ,4<Å¥h‘É8¬ùhæ"$yUïªGq#Ñ·+œHi½²Žƒó@;öy©H f¾­ }®ž¶\ÜÒ^{°Ô€Þ6ÞàÄVu»6#“À­6ˆß'¹ÍœâT:ÞÐu`Ô^1H €;­¡õæß„áËŸøüˆJ¥º²¢¤ Rv=¡ ý¸¹zËyn Ú„Ÿåµd¤¤Â©üÖ ¨\* «Ò±ªÊY 6½}Y·ª•“ÊDøßjZÍX¾­ (Þ´þ"Ö­Ì©U§7>KK¢/žP||¦¢Ç Uʆä&Gù’«âõÒ¯uÍÖ,Dn÷±’äpÃÚœv¨,Ÿe ±-›G®ËzGY»ªÐŸ×¶­ èPšÃðÆì*Œ~S-•þF+y³M° æ/è,Ú9Ö"¾â!ß±œQ&€§t P©ö®R‡}Ä. q'Uà—Òëù¤ÉŸT= z%´¨µPEY‡Â¿JêY.å7x–ÈQg „.ÿÙFl=fͪÚð5Tû~¨v…öÇ)°S8àcþ?ä3ß×NÙ¬Ó[˜| |+Ñ)NA.î`±K«l·/¨¿DëßJ?—Ø´‹ye˜ gj–—Òbð=޳á•p †–¢zÎY*æÜ¬.Âl¸ËÏfîÝ<fÍFi ¾A y©iÛù‚\µÝˆ±û*_hTÑÎME>‹Lw5úŠ7}pCX0˜,¿ é«H.]mü\’Ùñ±­²-Ôo«5ì]ÕZ}ÒÖ¯|õðK8P6r×7 â]`®ï¬°YÊð†ò—ò·_3Ó{ÿ M©¾@%*Z/‚JGdÁé5å‡?T…ZT¹µKu«&Eì%É\ײCŸUM ÒTÐVã¥Úê Öm´¬êÍJ…R¬4ÈÀ-³n™†ÔO{‘6è$*] §Å«RLDÛ*¾¶]Ƹ³S•7|/÷³>¨b¤m~ŒfFPìyÍ\š5+µØÃJ½©¯è,U4oVª«j™xhrSãåÜE*ÞúZ»‚çÏEˆuSÏ*g¸@h”ÎÏwÞ®®X#’“¥C‰*¯Ô“ |Sî™vÂwkjjAÑAgù„û'§K×Pì×ôêMËàºÂ†+|êxŽrW$»¥Ö¤×3ºx›Îº·è¥(ú¶AjÈ…]¥ m0hü£cÕ°õ?ð\G’ÍRzx¨0«æ¶-ð?ÝÓÅ#skG7™k#.P’ósƒù`…y¬5¨Êýc'ÄtõÆõ—)ü˜}v#ôâ ßjøŽe¿ìö+3æ|Yb߸g¹}56Ñ”†½fpKà˜X+=8³‹j/ž‘…ªÓJ·BÃ:°×ªxÒéœHyƒ>÷NXÅg{àh–ºÊåÂÑUêë:×zg5s®9°!ËÀÑÊI)»]»Þâ'>2¶7ÿÞÁx~‡Ç‰ÿxøÏy:O?q €…ù|QÊÿöÅWÆú-Žÿ´CžÏI/e£ŠA‚Qà0e"²ÀÙyÊ!00†›^¦Lr4ß#|‰~B¿êNÃî'€[œ0àåÁÎþÁÎÑ?ŽÿÏ«íWÛVæŠî™Ó+\áNètà˜Û6LàöÞË£ñ::ØÞÆNR5Œe‡¡ûMëo^ éc¬ÃŽªb ¯=²JKáy%w Ýø0wÖþÏŠÞZž|úðo öÿ_}åÇ»ÿå—îÿßâ‰W#NÅ«BÿÓÊ‘}¢QÒ;ËÆxGÚO§€Ñh˃YQU#µáWLnUJú¸33a10¶ÂiʶXàÅfrÁïP ¶ú•Þ`¢>ø/ÆóDÊ‚hªzL*fÕ"CQ&R˜x`6‰.ÿúU›ˆ‹½µŽ6WÜÈ;š§¨ËE²DÔ7èNäÖßzúL×ßÚqt°¿Ké%»I¹þÊ­[ºc4O/%ºÉaû¥ zAè ¬SUyàb¯¶š»}ìÏA]ýC};ƒ1M¶¾ã°B £’§´ÁI¡XŒÑÎÒ9PŸYÖ£ ‚i>Â5†JYs&4½Üdj;ßÕè“9…lˆ][g †&mÁ“‹ïR€R¤W­An]Mæð÷…1.gƒ7¾ï ?V̤ãï¶_"ílZ½Ç@0l¢Ò¥f§ÁlšÒ«”ˆBáp×Íõ ì{ ‡z.ÿÍΔßjË€€¼ jd(»Àߤ¤)+`úç°gçùd^ÔÜå¡€<úÀÌa'ÎR®ÛA88²žš‚#¬$Ñ”rÞ•´»ädÏ5K)t(sêŠsسzh ìŠçA¢™ø ׸»Ž¿ßÜÕ U8ÎÆƒ vf4_#Óvt?)Èô êè>ÑVB¾ä'$žbúÙX:‹;ÌŸàK÷v»78ÅüˆZ@%ÉQ±2jæ0SŠ¢ nX~WÅ4YUO8êXŸ´”L´%`VK“®SU_mÚ}Ôjn Ÿ} c#ã;f¬®ò °6êÔ8vJcç:^g[Zý}¡Þ{ªÀ ø³ŽäƒjKÜôcéOŸì?ø²$,Îûh2÷ÉÒ$¬oÈ3‚À[*Š=£Çž2dõLjø£ìg?X³N'ÛQ‰«Ú#¹Pú|ƒOñ üOÁk»­ÖF©_ª–PÙrR´ú4ù¤3Ïð`Ïï¿<ÚÙÛùŸM<ê*2ã±ÝÅÿz»9Šøu(,^mL¼@@¼gQT™Ýìq Üœ6*7vYÀ*QóƒD›†(óÊM#ÉëÃÎÒÃ@[±œžx|^Ye¬-o çÖÄÚV±ƒß’{[O¦z\‹XœðgÃæx\.ʧW—ÿµŠ˜›€”Š£5„7lè€#Á’÷¼ÄšZGp³|#¶5ž•‚ÊÞ©˜r/Êr`¹¢Ñ‚F7IU'?”kØPåÚlI°r±jÁÕ¾±eÀ8ìåSi0M›˜8ù¥g‚J»sA¯Â³AŸ–ŸîÎCω€_vVx{^xgf>¥ ÷8fàõÐäî&¡+QÚ&omF˲Ôá÷0‚]àÙ(Øåñ^ÔAß."`t¦S‹PÂ|CB½ƒþÓež„:%oÌùX¢¶Ž`Y`ül¾9œ纊B]6é“ô—ÁÈUsGöЮ( h½<)΀NBœŽK˜œ«PÌ»nÌËVäü¾jZ Ö Öƒíÿ /­OULëìgŽò”[)‡yéÈåDñOô‘SD’& ÷Èx¸>önQƒ´7ŒÍ;Kd?è:Ư;D'iÎ5ÝnÇ„ pZ°KŠY} j—*vUÝ.Èú07*pÒµiÆ‹lÇ/º;hÍ£‹#Æo}ÝCžŽôwñ¦‰8µµÿò˙³a·l=nSŒÀ÷[…$0ýFb›ò® ž½lEÅÏ]„ÈáF òë’ƒål4í¢5û‡7jºùH÷ˆìÉCݺakð?·1{¾ð7j¾^þã¿ÍŒñU\t½·Dv3îâ®'ûrã:/V=œ5E«­VàI#Wþ.Gå“3úƒúyBL]c îw¶.'.mÍ +eíÙÅZ¾eÐXVÕ žŽê™`Ú\EñnE¿àÝâŒqäÚ²¿&%;½[¾íúf 0€ý £Ócot¹¬)}-Õ¾³»û>'»0Q 0’Šz”{Å(K_«±Õ€*CŒdw«ÎÙ&ö”æ÷¼¥—5íC¡¤ß×…ämóCóMË4;帱8õPÝA·Šqíî|¿‘°lÆ€N„N­cµWƒåñC£ªÒÄr5ÆCŠß£6D£l‡´"¤ù Œöˆè)âê  wãOg¾þ»çHDa>Œž˜éoDôDÖ¦´{ÑÏã#w\@)d°nÜÆîOf¡$ "ÐEY;mÝE)6÷i`/ìÔ¥Í5­!q`ÜŸ!nÆþà&Û›j`ô.D\:ÍÜYÁg¥œ>ya^o\û;@c¨-rì)“|¢î&¬×Ó)EÌj!^ É v¹AYL£…L¥‰Œ*"^-›ÞàáѲE›¥_Fb}úÒª°œÀº@^¥KŽ:‰ÕÒBuYy•»çH¬ŽÀú´N`]V^}š;«î‹ªÜ…ªÔPï™k †'Ê[#\ ~syôéÍäÑÁ/H6ç¤_"”DRÍXU¨ö|^êéArõ;Q)¹‚PS–S‹¤øË‰¤ÿrcýÉ7ÝbÑÑ”úueǧ7”Ÿ./;êÎÒéç^ôT xO½ó¿Lþ¬óN£vgó‹„¼*ÀßÂyåù¢Yåù_šzQï©õjç ùËÅ»§³›ÈwO|W3’*¡®4iQ9ÿH±Ž_–ëðµIAb?®°·˜ê³Ì÷´Bæ+‹|]3ìˆ|ƒ›È|ŸFè[fèÄÏþZ²ßo'ú•Hö"RýI…¿§%ü=ýHáoå–C¯|©-,¶Ý˜l//½ýÉ­„ŠÕ”Û“ÜÊ„»,ºEu²ÛS%»-A½qG?? 쟙ַ`úãSóÑ94ÛŽ.ª£F¦ûý-îT>4zÓu¯ÝÛè$NM$%Ÿ´ù[Š']—R·BmÐ.„Ó(¦ v-=£[L@5©µI¡RJÐ.UnÔä!”r¤ŽsË<·ta]ÜÏÆž>›«IÏBQg%¤bø30~JGHØŸGéè€ý½ÃŸUÀþŒ3r£|@K¶¤'[KÛ®^‡OëãéòˆñtÄà ¹3˜EY5J­Q#Ôl7žÖãÆÓåpãi-n ~eä`‚QêË÷µŠó¯©(ÞX³ÙžËå!‘êc œ¥”£ªA²‚ÂÝ,6¾¾O˯¨ý(V4­iÃR>—+l—¨ÿ§Ûÿó»}êgÿ烯¾ôü¿¾øbýOÿ¯ßäaÿÏ#ý}@%¹-†:-›«l핾œ–ó¦m>]çjµ…æÙÛ»»Þë§ìŽ‚NSÆg*âÔ(º¢Q¶ôêå¢Pálš4=qØÑ‹IÞøÇð5~§ áÕ7×ltß6¤¿‡fõðoG}$Ý$°ê“SÊïµåì‹}׎žžN¤Î(,òd{ó &ÆüÇñöîÎ^*ò˜r_nïnoi0nöñÙÚßÝ?Øyñ,EÙÜÝ>ÜR…BEÐCnó™î°[$ÏS±³Gã.IN0ZìÞ«Ã#ôFä'Vb÷ˆÒ©" fK¬@«ä—EQèýÔ’ÄPäÎÍv´Ó~‘˜žä,™MF(u2Lɧò|2‰(YsÂÑPþ·4˜Äè¶•¼ÝƒB9ÖÝ¥'r ôºåtEö æIÒ{çP∀ÔfKPrŠ@^·j8ŒÀ¯[ötÀ° n|O4†ÕB°¤‚¼¶!°“‚Á‘6:îO'èWûiÅðúÈ83Ÿ¶ÚýÇý¹òLjðÿÖãòÿŸ<ô=õüÿƒõ/”øÿòÿ¿Å£øÌ XÔ°ýÑ æãŠ0CÌ*»“Áw礟 Ó¢ ÉÉõ‚ùzzyv’ö)ʰ9/÷_îÞùÛW-r¨9‚›‡ÑùÆ_£Ï¾Vg}qÿ˵/¾ü]„¨c/à ¡Ë/8Sô_ÇÌ%é¸v•ÊDÑz;z’rzÕ«(•ލYŽ™³Mо n´£—*r Èô™KÜ/•äiú³þþEé;úûƒvô8ã÷é0í{ñe[îû¶tã¥2_©2èô˜œ†‡óµ$|§S =…¥ë§³$bˆ¬aJqúRN­3M¦èÞ•#w)3ÍfÓν{½Qû8µarRÀÙ>‚÷zŽ `ëî•ÿtOys­‹—÷06Èeûl6 ,d–a‚²ž%Q¼¬¡WFv*œLˆV–WK‹1‘8¯q¨À€^2-æCŠ¿9ÓÒk ç°|òȈ"KPŠ“þO áŽ{W|VÝ Õ»Ë1'fh=Ô4@aUHnôl;£È vrd½¶F%èþÖ$O½Þg#Xˆ“B«dc'žŠÚY¦mƒ¥0e§r÷kñÆôüçœF”ŽÏnklu$hÕ‘ðÒão ó›iœšÉSÝŒuPVKü $­5€»Ò(†Æ|d 2V–![ì‰4—ÀÔ^Ÿg(¤éˆ@›Ð¾$Ã,Т¦ éÓãhEżw†¸t2φ}•äÝ)/8Þzáõ«*kxNŽ©6xËÅ…è±q÷”?dËÑÚ4©ñä÷õGôt3º¯”Rß}§~Ü´ûè㟾¶Jªýúé mz/‚zöGçþO¥tú蜞¹Ú&O¸ÿS¶ÿS¶wºò§lÿ‡–í9®Ê™R«ýE²¶~q¹^«ÿÕ„ÑýZ«Öuü¯µª[]+ðµVs,ãØX_÷‹9:h)vß/æ)™¥Ø(¦î`³b† ìÍQR¼C“ŠG Å ¿ç×ß<‚š\m‚qü³DÇ#HÁ^"ª„:7%žà²Ÿ#ýÁ\Q*¨ƒwМó•ñqžHüOD7úóÑt ʯqùµ±*[Γ5*Z^¦”#¨*¸¤yrLûÈÞg8  Gš‘hAcáùšTxô·u…w?§­„—”6µªŸh‡s¢;¹†¥×Ш®a&ÖÔ¯„¢:Èsk@¬úëÌL2 ƒ±KT_q2)SôË 6OA°yã½pÁºÁ–Js_XzÙKIó½€1¡ê@Ÿ˜ÙýB¬¼T6RÔ ÕÈ‘ë CÄæÞTОR%Ý¢f š>ë::£8ØþZ[mò¡zY¤óþ¤ýkãóå«}IjG’å‚K?+HEù1ÙPôX“–g¢lˆMRÚO[÷¬FÁ^žôí +äÌFèÛ¥ÿîQ 1Ëd/õ }‰H¸ÓÓìŠÕÜépr¢³ãj£TÙVÓ1ª#giLj>æ‚óç4Ÿ ÒaœžRÀl+‰J’Ó-dÖàsl! ŠÄÂEböÞëÌâ-wøÚ§Å {$ß1WŽDÒÓd¸XÀL²ð#³l6ô3 fƒè6~e_¥§m§bL5Z–Úæ¶½ËIb W•Mb(·W€Z„Šï•ôò¼Y¾ƒF Iº‘ÈFJpÙ}Ã7k+ÖÞbÐõhEFBE6ïPòdÀ-d?”ùÉóRý­ÅàØÄÞ“DŒ¦øºúÂÉ=õlÙ™%-iî¡së-½ð™*ÍU!ö¦ß%Å)8&èßXmiòå¦fÐɧ}À|l€»æªÊmbz'ùILlúáæ÷Û,mï½Ô@*by6‘”~ðn†¾gQ:šÎ®B<@y^´Òæf|&mó{š«.ý·bµ½çy÷ùRù|4>w f/S–‡\`Õ2-Sg”\°üµt-äÐÓÁ2+VÇÖRõyóvC†ÆÕ5¦I–wcÎòc<\ñuc)ÖQwÐuO¾eª“«þg¹‰E?Áš’•î ²:iTÏÓ‘°ærYÁõ ]r–Ó«®ü»D•¥­Ó&Õì{1ï9 ·œ)M;ñvBDŸÒù"Ç1‡õ!¯ü8MLJ È'R¤¬²YXÛ  VލEi™¼Ò¤”#Ÿ)Â>ôå®uZh“0Ö†ÉùøN‰XÄgÀº¦yëYE¦ÎÛ–xSEã£ôr¶³ßžÌgÓù,vÎÑêÅt5ÞrGÞÚ¯«S3áÅ®Ñ € ÆÞéªÕô_ª#ÞŸ RBäÇ$qTÞÔÙe›¥©&N'»4ËŽï“ïL²*Qe@¾†ÓYëá³ ïAº‘ÅSÆÏZêVÁüC ÊNCÇG[6Îf°ÑßíRIèý{jªKÿuCVsV#Aª†ˆkÏÊËW›œJM‡Úš'Ùl/ê}‰Übü¬ýxþÿ=¦9)ÄÛÞÛ™^‡xAðžŒóås±ñDšØÙ¡p.íÌÐ&‘J4ßÖš°ýS æ6õ¥ù¶¶ÏWO*zU_-”= ÃF ”3é%]qk,Fï— Œg™#Hø_„Ö½³É¤H¿Ï€1 ýáÝðC9§·bÙ‰bmiI+VU<¦]wR6À¡(¹U½ÌK˜&`â2Œ0:FÊǹ剑' 1~ÛˆÍf¤Ú 1Iá–¢ 1fÊfr•XË™²D¡SœcÌ^(±¨œ!ÒÚü·õq£8f^kÿlÅMY¦Г-ZwÇF#î·EÌa«7Q.‡å5Sß,¯7½}È«ž÷D»ÏZÞIÕuVŸ ª[]Ý¿`Ñ3Àˆayr^L4ŠU¦JâVs|T&½«EäÊZÌÆ {ËT¦ÆkúT•NaKÕWq ÇÄÐÒWåkTlA8Iã5ññI h›PøÉöû~:(Zó ‰mR5¥²s¬ì–Ô“Æ[{ "è:š‡O#Bäjy&CͼÓËÅU±»¡ÅuÍZJËUq^U|U«ˆyBÓ©%¬ -ØÕû°ëlÆ0ÖS¸@J-AßKòwBrèHóh¹OÊ1ö‘ÞØr M˜ò–è91PüðèæhûI‰c•ŒÏ”4ˆn’Þ™Œ®qù ïtÆÁ9æ«ÝNWšzÈàÆEiwð{»ÇŒÞ4¢`PŠ¿l4!v0ý Ùê /…Sò)ðò^’EÒÖ<µáŒSô’ÀØPÓx ,1Ý{rœ k»ÏßÀwó–\z'”’"ÞÜ¥›Åô´¦˜˜(ø +ïmïl?‹Ž…j6ù/Á3ëèœ=¤±Ÿ¼ÚαZc·ŽT©EëÍÞlî2)íÈc¿#ŒšŒ©Š,ô'ƒ§lÜËɺŒ¬¼J•8†w‹ßöy|Eê¡_Á¼Pñᦜ>U³9ý2‡gÕ'V>Ïzü»â»ËU°®ƒ—¬¡î™+Ð<‚Ã3VyzV >¥É(wݽ‹ê¦MË>€ž{$[=«,¾ wF$J,ä JFÄžh^™ ®àh‘ínŠ¡¸€ÿZ,[ÅBb[%«Æ‚‰uí`˜7%³V!³¾]$á+ê†8ðQ†)RºÜ»`Ì6â¾¹m”Zˆí]©Í™ý¢…'©2>^næ\T&lŒ˜újëå…|6&]„, È™†WËš,Å[9“ æÀLžb–ôÞÎtu ){m4çW–Gö;±ÜRº¼UÊá‚ûÉ|š±É8î‰xzGqoRKaº‡gxdÍÚþb6œܲdyÈœY„clÎ~z ÕÀ“Y¥ÕlÌéõÐà¹L_zÛŽUÐôÚh^Ïb¯ka‘‡*Ë+]ó§ªÌõ»µ'äÔ–yËTGƒ½!³0Æ–_ŠøÈ} $^Õ¸i»„û ÏG‡ícµkwó„[=2²®áG€Ð“Ò5Óó`h¨]p¨:’lR hd©R àƒ’È#Á 4ù@÷*Ý•z®#¾|¨†* ëf/‡±DaªÕíÈM2w±º}¿\~Ù +–º. «>è«xÔŠˆš¦– ¥‡®v¨4êmV}©]z²ñ<¤í«x¥²¦Oç¥f&1°ÍÕþ[¡Ý“ÂRŽ|ÄŽÀÇèT>À¢me?¤Ÿò÷úÍbª·^@Ñã=ærïc¶j‰²_Wð­ýB=§]]/ù ¤Å[…±~[œƒe?²h Mœ>!¢ÉͶzphçAª”庌ø%·äIwp6‚ÖÑÁòJ8èÁY @™ñ,¡´ª'æ)*><ªôÊRJãЖˆìó!tãE¯ ˵bÀu9*úþH¥Iü’…/  0~¨¬±b§‹ª[`T‹lf™¥Ö*¨Öe½s`Å9ðZ”«ÎŸ¼H#8ÔÙÒÀ°HYÔß­†˜g"³x×ùÎÔ“5§ŒÈRÉÓÃ’‹< ¯¥¿%Bo±UóQÛ²(—–¤XÚp 'n‹>+—ÁYBßí- „c–îË·ÚjšÄÚ¤B¢­Êq*Y"_<“xû7L1ÿúÔ¸Rºc_#šðø†ZØgmÚÐV_›ñ´Ó™²ò^½‹¦­Êð‘À.ÀŸbI²“Y®þP=ŸÅr:°.uØ¿ß;ÖÁŸOù±ã°kÊМ齖?ALúø_~ùà‹¯½ø_ßßøêÏø¿Åƒþƒ• /Nàh™{°ó컣(î5£ûëëÑc4PÞMNŠV´;ï¡ûQÚ;O0­;j?LT‘ó4Çh|Ç'Z‰BÔ¨¶0E„‰ ^ m»"½L0ZBËÐd´·òbBVÌ¢oÖðêM~¶Ûø{¦Y*˨_øâb2¢‹m1Î(ü©ng4Ýp›¥£×³7T¾¹Ð°0=ß žrÒäØdüo×õ ÜGH܈ü~éÅ¢ÖîëUÁ¤Ï°ppØçWø59Ÿdx¿‡ìN±Î˜ 22F·KÏÑ¡Šìr¦“‚´í°1ÈD'WÑ»4Òå(€p~q–õÎ1›§ä •oÄpx¥b p€øË{»·¾.qKšêx\±ÔH¼„Q2NN%jaÅ=鯊]©ø#yš„ZÒÍþ3 é"ȉ2aèF+ï ¹ÔY4÷}g¨'Àâ“!OŠO³ÿ.¹Â»‡ ¨á•UX¬ú‚auhBûê;ÌSÃìôl6¼ŠúÙ€îKg<-ÑwðƒV'í& “}:iTò߸刋P8LÎM;B?"I3 w´ðTÙX=|‹AD QØ~Ã@Ore–ŽÕðâû÷6¾¸÷·¿5£ÃÉgõ'Šaqž&³Â ¨t÷üH‰òåÒ¥x±iY™(Kà:`©cv1‰$™7 `‡^dås†´œ´e*ŠÐÊhQ¬{0b}×øú”…aUó‚óéMÅ(u:æ»qú}e•dîrÞ:oâN/[W6Žja! ׂFz¥Þó*¦´Ž8I'“Ù™e.¥q®F÷‘ 1´/ÓÅýH%¼NÔE>!“ >–·{{bMvÇ<{8ˆËHæ)š7eαÌæ8ç}é XÑŒlÜ›ä9äm²7˜¥x3xaZ‡6ttÅÁ(ަ†ÑO‡É•ub0KÊføŠq˜½Kißwì¨+š¨”Þ`„rX\àjÅÂ-Ÿ^x|ö¢!R§Ž®¦iï\бr¤;5gÿŒÐ¯‡æ­}8Éñ§®ÍþÛqù×1ùèõ©ô.Úñ_˜ÎîÞ 'd:ÑÛ·ÿ¯š‚em¶¢noî½OGÙL»îàŒÅtHÆ÷¯ß¨Ú]/ñé,)bâkxö¬!›P4J‘Ã]*ªÝ¹µt¯du?½—¤gZª,æûÐ…ì„Ú²uõbã¥|°ÿ,ÎuSÉd§£½&,”c çøKË™Ü|6q™:A§rá ;šõ?=!Zj9š›&þVÇrw· ”M ¹éL™ÕÑŸïø.õ!gao]éK@GF·I…Ÿ^f™¡T8À 5+–Ajß¹A Žù0—›d2ŽÖ•vA@ÇCÅìHÍühû'Lðv »S;¼Ïú&‰¬ *ëÛ¨ºÅþ€.z¦4¯3l9à^$ '“wó©ké㌣@§ðþN•Éúΰ÷6ÿ~üdçéÓmuä:* ¹%ïõ(t¿ÿ’££(÷¶y™kpåñôøV¯1³à`/_=”ݼJN%h{ªÝÍ—©ö@¦Þ²PxýÆ&‰ì*z I@e-¿ êËMúðœÇSчwÁI0uü<_blì†*(D>k{nÏÚâÊ› ÀíoYT\×@`ŸÌÌ8jZ@èÃ1z{Œ–ƒÃ&ó»û[Qá€áÔßÅ €l?,.”ñûå ½<Ü~õdÿ#€yYÇuÆqµdûD.(èôãÝË«-—ÒÞd dä5ÞwÚA úÔˆ^7Z.Ñ?RŸŸE²Q‘æÑÁ\7QCYB¿›Óî·‘Oéåø†Ù ¸W#P ±¢ð©ÑöЂÖ>p`Ži†ù•BÁžµìT%êÙ3+¯ð£ †Vuže.™§lí©¦_R¼{É ‘{þt¯ ˜ËîU N|‰y4Åÿ‹”5 8wÕùl‘o‹8¨P.³öšÆ¢àÏ\…5©O-8e-¨V~x Ÿ­|?IFÒ¢e%!wL¯|;r8…¶ÇçY>£wÞ/dS -NĹ-ÚÎÉÀܹPè%ÿ…ÝEæ…¦‚ñ ÆCeX½¼Ó:n7¡‡Ø€Ô/Wc,i諚?ž5ÚíxXĘøNSñR:@mÞ :rK0çQoçˆw!ïêL]C±‘sÅåï8¾fßMžâUšQþ[u[8¶d|µhó14’³p7qdCêh{©“¨ÊæŒòNsn•ƒ;€{OtuS]«¹Ê• ÄøqÓ B篎ð¿1ö/àSï=‚bz$›h¡^i••¾ÇºBX¼ÆõA »~}8Cú/_‘åõQyØíE¢öºn‚õðd¢¹öΪÒD“ *¸å`UnÜDN“¨Hé8òîUýݵCEÎ7ÎZ%K ˜°æË|"_žEë—^R*U‹Øi”÷l^øžÒ}Ìû r9D ^?zÑ/îPõ*Ú›Ÿ¸`l¶¦Æ´ZZä^a N µPå:CkªH#»£‡‚,Äd‘㊑Gñ‚.fc¿xæðÿšËmc‡X»·fr/ˆ¸Å!àK,RžŒ }xw¼¯ðô7Úíþoà ø«{%¼PV•{¹ªµîå~ÃQdw¸æã4ó#;,u^ ÖvüQÇ'–/˜d½lã6zRÌP¡Hà|D *´€8Ť0ìqóÄ7Tì/݆Ž%6ºO!¿lâBÔ¨PæéZ¿h}íÖ6{ÔdGdø„BÁfe`”ïËÞÒg¥zúèaÜ_ê T‡¼rH3ßO¿µF$e_Ž0¬'³€ìYÀkï&Yë ·€x ÈÄF–:u ‚;Ôšä8.¡ÈJÍèÛ¨9Õø{m–bu÷²ÑÁätù’m|h©×÷åÕý´*}²eø|É6Ö²ûLM•2ôîÆ 8ÉÀ^¯Ø¾Ëpz¾ò^eý#Ôï1·• ®¥Ád‘üPHñì匥Šof®,d,y*kÔî YmI¥…ÆùŽQ\\K_ì± Œwújùög'ÂFlQú€ÂaôM×èëö>Š–âbÍÔ.îÒâö>ÅÂ/Ó– FˆþDZ8”ÕXŠÙ"_+ן½>[‰²eÁ¦WIÛvúqÖo!çSqéáìeã1TSw!äíOr v^”—[Æñ`˜õf±ÒµqD†Œ´ƒ¿Ôk¿c>ÑFõ„ ny¶Ý¾R;US…Z†%& ‹é‰ÑC|Ùô'ˆÞz-VÑsc¾„VàОô`…õaiG[ÙØ–šH‡…5dIjiGv™g¢eðt:Égó1¦…$sM’Éê;Æ•ê]«¡w²‡±ÌK]y·r»c£]jù&ñ†=ž-ú8¥EXŽöµ £´PÒ3®”eÃe¡È$G{ ï[)7‡Eó¢$X£Úª%²5i_OçPweÃw¬ù¿8¾”®ïÕ¡¸eȈ¿‹ºÃewlá[ÝÊ·ØR+*9\ê–Ú%Š3´“QÙÍHeKÁ’2=‡µJg+·n™Å™æt´øwdR"pUÖi´ÐÈ(¶g´‰Wh U d U?ãK 0 Ýì6ªÀè^×aGúE9Bªýã· ~¨¯¶ºŒ˜„í`Lo¬ )5LO«ÒÜL÷áG˜Ôx¦2 kåGYËPˆ‹@Ÿ¸¼0ÎdqÜ'%ùùuQÍa©FJº‘›×jSxhÆi¯{+AßëÛJ—Z½ þç»É£-ueMã(¹Š€êšûB×f=Ðϳ­gO @VK^¤l½d£ A¾ ! ²✘ºãG=,W¹·‘/_Ÿ‘7,v?Z½W9C-e.“ÔŠŠª9Ç‚ö¬ßSI ,Ã6l±d_Ï8ÔòòŠ«hQÊÌ}X:ZŸO©Æ£­œRBˆBzŠ !gÀM®¼ÑXvf@’B#«Üt5p»]w³mÀT_qW]osŦNÍõ6¯Vc#á]zW=Ê(=WG…ŠW•}¦ð:1XuâÖÆ÷WOi<¯R½ö`©õ|ÛxƒhVÕ9ìÚŒ<`vÚ[˜Ÿçû$·9fÄ©ôÂrgª¤ˆ‚Ù½ºÓÑJQšQþM[y‰1:¨R«; (Mº`e[ü¾ÀËÄÑôæêmç¹L~–×’SšËo͈€­² 4h:k¾ ¬F0|RXÓ¤‚MêhÕ-wåló1ôï5ßf0ßFLzùæ!-7㿈÷-³ºÕüÈrZ Ÿß(I’tˆ3‡q4šˆî=tšë¸^KsDºK®ž×W¿'`ŠŽæ§äÓ'¥3"L ,3jX. LJ1qja½¶Þã:*ÏÇãòGî¡*ÜSºSñ7\ÖåzCvK¡e½ÙöXfO,î3:oYðN6ÕBøH´ˆœ¾0`a·ýu,” ÉËZ{uøÂØîòå\ÕÉ·i~âEíaçìŠ írá1¯Y5ÓcNj±«ý*é®ð±½-·¢Š4^¡5¬Ú›Ÿrs/»»C“X;ƒ7Æš\üÊ>m¸¾ÛEìßJÇդ麲ª¾©þýqáã÷³3¸È0Sií{€¨â8½ .Œ&Gÿð§•êQƒ0)êKªf—†uÀ.b–ïcРÇXΙ ÚS±TC[Íź–U½Y©ùÕuPMèuÕ}r†¨7¸¢> cÈM³Ñ5ã¾Ù£—\>ÁÈ#´è¦xa’ÒDm<¦™£{ò³¸Ç6>øˆ€à{#dá‡o¢âðÁ}:q†µ*v÷!&Ä_ß°)×ÇÓÕ×_vJ¤ðcŠ$Þi<Œ0âŸxËTʳ¨¤Nòºä^^$M©§R0lá²>׺ÿ¨„Û›hŠ3†´ÓÌÚÈ«òÈ”žP*sÿY<‘¢#’Mœ/Y] ëÀ^«âI§s"ä Æ6ìtÂu\SKP j˜§ª«Óód½³Ú:×¶öÚ½O*ZþµQá'¦9O ÇÿïžûW¬øï  OÆk'hzº–'Ÿ"ð»<õñß×ï¯?øÂ‹ÿþ%ÿ3þûoðpxíkíK©&y;Štnÿ+J¬³ä:âG½áœ>;1L0¬S‘ýÌY¶0¶¤ ʹJ¡ÄÇp #ySpO`‡{:5 €¦ˆ° u˜Rê%²ýƒMܶñÁ&V¤-ëŒ/UciÎqŸîîÿ@å0ÐËц#Ý>ÐĆ#‘ή¦©É[AaÛOÛN" Sx‹¿S”EŽíXÕñ)WcpÞ§—ò)Ôq·¨Ž ùÔ Yóñ¦!)"L,þ-‘?£_9dàèÝÙ¡åÉZ#_¿¢Ì<üâ†'jAUŸMW|CÅä°¥ò«h:É0†/ E„—p¬§Yì·(߯IǸÄbõ\oæÎptÜÁ<³™Rœtòd‹9Ðq¨i/¸>N°2mކ´?0åQ|6yíqÊ^^·‡;Þë }:Oà˜ƒ&õ±ZSuÕÛö5uîÈU¾¡<ñÓ¸ÈSÂa÷ø$¶¡s}«ÂŸi[þÓ'ÿ §j/²ÓOÛFýù¿ñ`ýë/½óÿÁƒõ/ÿ<ÿ‹'¦ü/zá«2¾Ü_ñÅdº`;Ù™d¼E·:´äWEìF8œ9toœÐéG:çHJ±Ó+î‰Ø‰Ð%òðøñæáΡóíñ3wŽö6vþŽÇcò8›’Yž]®(K?Äm"1QûÉ,1à8Ù„v CN¡4dï¥S¢î/(l(¼"–D>̈}E·BÉP½Æô›òJí•ÊþåéºC>ŠèöwŠG©ªsò’{d “bæ\ÄIq>ÃÑÞ™ŽAäF+ÊÚiÛwidP\Jp7%fýI%Þº;_çÀÝdLR>7(Jùd>kXýjš‰¡.¿¤a¨ Ïe€®7ð¯2%† .I8,ÓKÆ0w&²LÛ \ H±·ÿbÿø»ÍÃïŽ6ïn«#Úâ Ÿ§Wí3¨qü.½âXº{z1ýx2à¥'^ÃÌÔÜ& Sržøã¬/_á3â±®¹uöŽˆö«[v±‰ùN›´Ìþ\G*t%@Ù"wf›7p¡ŒÒѸ1É÷¹r~]ý¼?Á‡2œ_4ËjNô Øž÷b’÷ɳ Í3áà:S ­á|d³=Úîø³4¡mÞäé@«x9·¨<¾vâÎR?iVtçöäRÄ|ýiåÅì%¥p>ð>U+Z{Däu‘ÓtË¢¿‡ý>À-@|l ²Ž¦¼9Ðe–¾læyrÕNð¿žÝ"€›&Yþ©Àa!wØvq]ŒÀºÅhÂÕ÷ +DÆù¸É(F¹M’1H(³lDÉåº_“×w¦O‡É)·£"ñ›†Äx–¯³¤@ÕÒÖªãUc×@×SÆãCÚ0½šåI¦7_‡Òpý98›\àÀšÌfW¢Lœ]©†ÁaÒDÙÞk˜Ø©q (ÈÛW‘Ýa‰÷õßL Ör9ù rý ½Ý5"X-õS[É‚Û×I>í¾R¬L{Óõ”=3·A›®TèÅБBä*d÷Öƒdõ׿fôð)²ž‹@e2eÑ4Qb{;@’±Æ—ì¸FNÆ3n#Dô Ä‘²SQÃÇTßz+ZIâ­œô²! :gì(çeûÇÀé=;<ÞÛÿ~;²òךEWéLåÚbUMèVô:z¶½ðlû—BÙÚßÜÝ>ÜÚ~â}A_&©ödª˜lfsç…W)ïѰg¨”"ÝS:¨2²¸Žv÷J¯Ð ŸüœŽ9ô]Eíöžïî”!@mI"Bè Ø;ÂF>cÕ¢¨Skï{<±Ð[1ö¶0oކƒ)jz•× ^²bÞ2S‡jØË¡jPÄ<¤nPÛê9é-œQÐwSÙ›Bo…çvM©Mߥ§c`ÇFGD}SVVü¿½FÎ2R/iìö§ÙéÙ f†~žÁß0§˜þ…v¶Ž¥€ígÇGûÄ()(z¦( G‰øš%ßþ~û…]ê¦ç©5ÕfµËÚòÄïĤ߿9œ—›;ÿõS@/BPdJpt¡) ±Œ.8·Á! V–WitþîÖ-Äš®[á;K,0×4("ždç“á9Ê-|X°ø±b¶$n!E'5Xޤî5‚0™ô–§ c€ª•üB³Gż›S L‘$îîpiÜ)véá$wËò©¢«r@ÛK…yÝS öÌ2¯  X¯ÌLŒãR©…Æ·{e•&J¤G´°ŽCÊ”o¥=XFÞEÿÚÀ¤[Êh(„Q Š˜™oÞ([!W,H½VÔ‹uA~µ²Vxz<öžÜÔ¨ó×/£Æ[Á¦ÎúI Ô‡UJYý`ê;ø¬ŽÌ@‡ŒЙً”S6ŸÜ}-¿¯êxÙˆüƒq¤¥Þ#&÷,²Ì‡Ïg|Z’5sG…l<Æ# â™èst·d¿8èI/#I “[@ !õ^/TÌrç  ÁàVÓÒ:ƒè åŸ¦lÒÿ©ÄIbAxŸô`Ã^EêHw× Xx¨§5=úŒcª¡^—ªÑ|N(]ýcê)¦NS·EÊ‚MËʦëþÁJÓ7(¨³–öEÖ—…Ȩ³¢°ST¹FêéFÛ/žAxõˆ©¢g«/€qT ÑElÙyîŒäN!+îôâ±~ ¢mÚ?¥Nr+†~’k‹ÿ¡ªè±4ź†î¢PØOàå E(^£°Ÿå„ý,¡¨°Ÿ…òi Ž§è ßž¾Â¨+–ÒVxÍÙŠ_»¹%%ö”ö媄ÕHW4¶dñri5W»öçÍàȺÿûd†?ò,¸ÿûê‹’ýσ_ýyÿ÷[<ñ¯m§o6Õii.ð,«û ÏÉTê_á¹wvUi7¹Gr›p®†º‘þû©°ä1Á­º b²)þÝgß'C/ѧKb)Õ7߸)O¹ÂúÅ×Íènä|A V è²þ<½Š/;vZW”æ þ§œšC¾ â«©ÀÅTð ]B¹S^¾,ræ=ª˜x}=Tšô˜{˜5UÂ/=ƒ+¦Wª¬ê¦ëþákD?íýgOµÀmÉüDîVð¿Ÿ,¸ª¬‚{ÙR]q &öe‹ÒÇûUÉúØŽ]`Vкþè[1}'¶üm˜<¿€Ë]ÌŠ.æB—g@ó‘¿ôÒË4d8È_µ¥›1‹.ÛøùTWnªÑª›·@±%ïß¼ªËÝ¢©vn&€,Áj¥¯®.uã%ÏR_ªËÜ™²K\ƒ©ùZJ†øØ-¯c‹åšº»,y_i9WSõwNî%’Ü™+5úÆeÉK§ü¢+«Çrc_Ð8ž Ô,z·4¥+šðÍÒW4·J×3XZîeÌR9ºÄ?/eþ.eþ¼ù^Œ,«Ú¯Óí» vb?Uü¶Îýÿ=ÿï­æËRÊB=*NµGÊ6¾Ù+NÛ1þEz!Z†F Òö ðÈ '‘æ$= ¢õ%.È›Ãç¢'¹3ÑSžàгl0³ƒôe¾u¹zSñV´~±ae¨ / €vWÁ»‹ßWȽcõË¥“«Š{Ž’m¿ù&†Ò-Õ€#ïÒ q-j4Zq\ÎÐ7 øß—Ž3&§ƒåàKF6™DÅ(¶ï)N‹}Ã0úê…3‘¨X3‘õu[ñªt‰˜Öo¢õûBn6~!éã+ŒyT¥UóçÝhU(8š~vm|eAA¿mNsöWKšŠ p˜Žu'—eC³~âØý¥£²Ððhâ5’XèDãõï,Ÿ™ \¦°2Èì‡{›»»1æ!·Ç`šý¦Ùlq¼úÔû€Ð @w7m®Še^ìì† ³Mñ^ûñÞ{ªÔƒÊNË¢K[°Å“Ð¥ÿbì[AðeoáÙhÇ¿'ÝDëyËV#´´Æ :Ü« Z"È·DhlÉÔ·D*¤ËžR]¯Z(¾ÔŽÑ…ø9©üzëòû-Li5 ÃQœ'„Ë¡ó„têuø +€ÿ³’߇úÝWñ•ÿ„ŸûbSþ0½×Ѝ„šŒmØ $Ï34÷?ʈ„åþÉqIõaY\â>Y¨çîÌ/þúXLP;’çâ÷ÇîͰ©“ž´:q ’Џöñ‡>ã$æWÕHÓW‡ÛÒkÌ]ü‡.¥Sߣ-¿‡¶Â–ÿµMõ'vXÿë˯Kòÿýõ?ãþ&ÛÿÃÊGÊæw2Ÿec¼Œ´l÷ vD¥Z¢ˆlaÿ¹œvßnÂ[ºLt_¿Â÷¯ÆE2HÛü¿k3fû†KíÐÇ{dáBWŠ3¥ÝmEʃ.;Ú‚Q½Å+16ùØRá̲8W°é6ÁÓ]7m[ëT .dp2oJ±Âɼ÷.­) ›þÚÜ:c ÿâY±™Ø7Ö^ììb=c„Äÿ•ïTÞ7™ˆŒ9üÓù8ÎZÑOr Ý¢Û{u)¦oÁp$°deCyüú“ÿõ'ûë™úz7þm2uÝÝ¢wض¹@gÛ…âUX‹ È‚î”Åìnb~hÏ&ðåïP¦ã$>kQͦ¶ƒàÌ,£)y}èkfë2\î¬ïÓÅP¡¯7ƒÐë6ïDó1îg‘ðU€ )BkW§ÕA0¶ŸšNìÐÌ1Z´ƒŅ˜™#­ˆ&䡸‹¡Õîþtײ±#ykC , Ý]oZ'09& )A ƒ§Q™ £·é·î- 3.ÏQ$—òÇMSu³=Lǧ3 ù¥Üƒ ­–ƒ¯– ˜}p,Ë`°×íQŠ7ªþ¤i…mR[Í#孠ɦ ?·Lzµûmðrý$6:\’'6K&Fa”3ÅFok¾~Ix®w†T#ó ´c¥+röå*tMâww:ìBwG%¤J'¦m#.'Ïä-ÜTûÕf»˜Ÿà ´Â»Ü^ƒ¦ì™˜¦ZSVyQ‹YÕÓƒ´-‚½øÕ ácœlìÑ01D“á_H ÄïHy‘†M—$F7&U¥b IÓ¥V>±Òø± ™ÂYÂÿüq•ažÑøóã8çoÆYfe»Ý“…Ü3sÝè À` „ÇRÛ´Æ‚h¨Ú’¥ mÝ 3ÎIî6ÒD²DÄg!ëÞr5K?Ž{—ÕöûKà¯ßTˆß00©Âù2 ùdw Éî‰ Ö«—7}ÜY,jš:c£º¡õŸ%iV!ÉC†¤ÎÑGÑ8´T×åºÏP^ ï´…ÿ†Dy8P‘ºé)¹µ+i <^‰æ¿éR‚È òŸK×âº(jß_:v?–8Þª¢V?´Ç“Ù‰E"‰¨VÒI ’ «dÇþ—ó?}ò@ ì¿ørã+?þ×—_ý™ÿç7ybÊÿc>Z[[Tîeã”ó¥|óÿÏy–KÞ–@ @•ÿíËòìôlmüío_E›Gÿß‘Î4É1J:.pa?¥ÏæÁ%èÛÜ;Ä;E?¯ÏnvžŽÓïãww¾ß~±}èæöÙã—ùdZ°ñò‹ã—û/·Žv¶Ýr›Åh{”QÖwÇÊùx{oçèhûÀêYB³3ÞùØ8×\A±ÜUpwŒßä˜ÄЦXg eÉQCi?mï{Šôœ~™þñGåï[Ž´¢Ík+"|V®'¡o°’‡éŒl_ØÑ£‚q ’m¯Š´d"cí ¾ª+1}[ñV÷ÕáöAÍê–&Ú‰ù†©v÷·ž¿ØÜÛ>T32~š§© çª;«Ü›:ºKaE½70t$WqvR™PtÅr¬&?ìÒwF){'<9 ×µÇ:Ù¦H<)1Äò­°nÝÐþ ÆÈ¡ 8èLµÑ|%S`‹ªØà£.›áL?n“™åìQŽÝÖ}·®L¯Èò*htuK›]­ ˜ß™…à Òµbys+jÔoí­> ´é¤(²“áUÔ;KÆ§ÊøKÊ­ê¨Ò;ôë­ÒòËt£uºñBEŸz¥>Üh¥BdDH‡›aµé¯+–ÕˆÅ;Ø~¶stýÐý­M¤.æå?è„Ø|F¯ôŠ&ŠJ7ÚºMÞÆðîi[%¹µ¬°£é…©»ÁãÙýÿ­ã¿®uÿ«õRüׯ¾þ“ÿû-âÿÌÂó?+÷e+§ø¾Ñ4Åhçd¬ÀÜŒ4’baÆõ%ÇJ{[˜é¨LŸÈ†©½Éh:gKŠ CÙ{÷£ó4¿Š€/í½8ø…‰k)á4O€LõÒ¶æ4ãÕ_Ú•Õè‡í¨£„”¢6Õ™6‹>I{ N f ް9äæÄ ŽLøÜu’{•Å„‹ºAaU$:¹ `ªÄˆ@äx Ñôº´cG4R,tMx{­ØH/"õ˜ š¥bx©dŠ#<4JN]í"n\M4RËVÄe†kˆ3y˯µª†…LïʪâIͱq¤#sXÙ9³hù<SÄ€Ižéž¶Ékº•Êö‹;/Ž0ÜÞæKcƈÚj=­ºÒ¯ô²ë°Á¢ûU\òåƒrÙlr¹qqåËÅl’©/¤ëX±b V $X+I) 4½|$ÔHè£ÕûRä®”0’œ HôF %þ‹Õ+5ÁçdоcÙÅ¡´2OU±n¤>]YIGnÝb®l<™WDPÐfž#*Ÿ\E–¹YeYáH9¬ä-¯¨~¿.+'½“×1®˜êÍÌ ×¥QÝ¢BôçjHB`%ÏôgÅ,õߥ×? \jêÝÝXE‰" ²Ì<é÷OM²³à|ƒµâXîùsÑbå2Y}r·Xé4˜ˆa·ª¬Ä‚W¸qÖµÕÉÝŸî4½ \Åüsm^iÔ%ÞÅ_Õ|Ý&‹Ym iÍ0]¼Ï0ÏûÒã;ÇÒ4J=L–%‚¢ºV/‹Ÿ#ÞIü*£ß´Q‹ŸõˆhÏU3âëE¯}É!ª°âƶyùR3Ÿ[êf½ÅH‰ Û{E gce½¾< HJ[ËV\+oV˽D7TÓ¹Eç/ú*nHù¶iÈ-M€ºàÜwaFïâÿî»ß<‚!¥åŽÛ²ŠyÜÉò{M鼙Ʀý Ý9è5‹4ŽÝ‰“Ö‰ Œ§\_—W­¦j“oÍEzÄðô}ó ´.‡¥15‡òñÚt‚.”»ú|‰5€F[c€úPÊßi7Z|ÕÎ…pìê¢]íQjQÝa·<¤ë’bÿ`‡]ºÐ”ÜÀÐæét½™WiÚ×§÷@S—XÄí=‹Î†”¶¿ÜÚø{¿kÌ¢— r-‡7hÁý&×gljîoºðÝÙšuw©À¨[³%)Ó?Ã?š‹1šøànÔW)êŽÌZ@úFû¾©‚&Y×dätÌz @3Nÿù½å¥ÿ´ÇÈÿ0ãÙ,s˜³tžßÿTš€þ_ë_­ß÷äÿ¯@±?åÿßà±ò¿ðu†‰fÌé`¶-"ÄΟÌgÑFóžQJ Ám³´h¶#òxR-Q§Yò.-8>AÒã á ö &ßÄ÷C"5£öˆ[gùlN e–¨þ“¹r˜GQ{fµ†p òÕdž«pµìûÜÏò´@fW0D 3N=ÂúБHÛiZ`în}9Ð&ÅŠ³3pçi_¦ƒ‚2|SÂ÷A$öÂç ØØ‰09‡’,b‰¨®‚±£6#ÉÙÃ5¦÷ €Ÿ>´B|Ó6ÚëJŒh²¿‡‡þnûì×£­ÃeBòà—ÉŽ„g%±-˜ƒ µv2RêÒÍ-èNûÅþñþË£½ÿÑêQãôD,Ÿ á%ˆCãY¦/.¦gI‘ª€Oñ¸I€¨§É”Ã'jU6¢CÞÇE‡W2»w ƒn¶Ã1õ w6™)-zº½§h äÎñ8MyaÒ~‹¡ÿðn¨Sî(;•v,¦(&b¢ >n¶”•‹ìp«×êrTú=Ÿ(ÝâÜ,@Ǿüêë¿þ­½îëOÆwfx“†O7ºoÓå0Z‹l‹þœæÉÚœ•CÇØ¶¶…€–%¿óTàðXÝ8’ÚÏj½½îŒ0XoÂT«|ÙH]í銘›Ø»É°Ÿ³ùJ|L (ùÃÀ–i’Kä1Ç~)P0bˆ¹÷ý{àMk¨3o»Éȯíl~´?ïéÓ_޹Z'jÈÎè¼X<.5hØØCƒ49ƒ¿PóMM«×R%¾$¹°w‡.‹f³Ó1mÖö)&eê)°w§UÜ¥†5ŒÚ Âú_v:ÜÕneºŸÀµ}ëá~á]Ó'Xß oWª0ý=qBCWž ‘•ûH§PÖ©ë‘gHYLMÆÃ«h˜üœ ¯àŒ>œ`P¯38QMs«Hͦù| 'ðE‚©ä&HM)ô)¥C†cØ8<ûW¥ü6˜r4hhqs@Ñî<&ª»pØáoWQ3?‚ÆORŽ6–Á9¢±yzz2¾¶‚¥“Ô©¯Ó1 䊠m}mÚ„Ü®µE§SnÉkRŒh˜GbØýœ{t0‘N#;ðÕŸr”áqIt÷$ŵcˆ[D¼Ôð$+®)íxÔäÍ©ÖMZŠ­-Fc/ï1z ”ÏŠ›Œ¦ b`bŽH¼€j›xÉðgËB–Œ$-µ;}(š%€QÄU”]YVZ'#IÊŠÛ[uÎL f\µ›ãÛ˜!â®]¡ÝcnzÞÚÊ®„8‹Šy YŽoó„ÝÆkÖQ38wé€z‘]Ì ˆ¥Oˆ.'‹ <ÿBuM÷¼¢Æu¿î¿i½ž»ñζ2G$ÍVQj¦ÃyÛé[c\5~Ó5ï»øŸ»ãPài~ÄTÌykC+,­—÷kú„¶š©£ÚŒJ•µ*V8ÒçA¸¾ô—àkëiíp‚±ËËåa°+Ôïp?xÃâ¯A ŒÚKêÀtápo›SZ ÷")Έ©µ؜ֳ „ŒN}kÁשI°XÛd™ä1A¬l³´Î²¼¸²¢—ä}Óæ¦-W´éœ<:jЛñ,n¼n¼ÝÏÚ³É!彋ÅÜ]ƒzÛxÓh:§]ŸM•L§¥-5åèÑTIôÕÌùKaž)ÉDjGÜfújÎiÈÁȘ !£ä]~Eqé]ì¾~c¨Áµª{Ü4Q»m‘Ø*h!›uÊ•°•›÷0ÓïƒIõ5ÝïoîØ÷PòÿÔÖß í¾^_àÛÿÜ¿ÿgþçßäaûoµðAóŸû°^Úòø‹Ýyãó¥½³ñ#©3 t'ng“FȨúªN t¡¶©Àt’ÏD‰G,ù(gÓù0Á ?$^TäãügÄÂGhÄ"ôÉËFmÛ$oüFvlìhÑœ,Õá ×÷¼PXîç½ïùó˃ýƒ£ÿŸWÛ¯¶Åú“ìBðÊ€?k#CèV~ú?KWF‚cbi#¨ãÎÓyª_ €;þY½Tê>OÁÇd¬C}駪ÐcÒŠnïnoéR~¡'Û›OŽÉžr{wg/ CÚÚß{ùêhûøðåæ M5ýB‡›ßo3¤£í½—‡áBßm’ùîîö.ÞÙ>´ 9:I 3Þ‹H…‹Áù”&‘ËDýùhZ…Q}V#MT$bÒßA •ÂüY»œ\yíìŠËÙÎ~{2ŸIme‚$ 0s„W¯¨ÉR«ú‹w‘ r¢žu9Å|kË.jhÕj‘ºêÌáS™=ÒDrJ&ÜÇ,µ[ºY¹æ¦àcÕMêcó=ž”ZÓYçYÛÉ_ŽR¼³2æ¶P¦q_}pàá#à ݄’5ü ½¯èvRHÓP²‘L D9â-†¼<ÅÞ ù¾ÃÚo1ÀêÑÛˆ`ªm³¤¨›4½(ìí‘¿{¢s€lŠÝ_\ÛŠ $flT$&fÖW´:€YÞ¸0›Á–Qº_çHÑ…u ÝW‰Áø2‚nÒ™Dë#ÅGº­Ì&`º’ d‘«™>#üè.]ŒÔ€Ö¨#D]yѨÇGÚ÷Q÷mÙà øBª¥QØKڄа “Cå½bLë¹`Ç¡ü^AÅŒ*Rd¶+Aoêç£xkBV˜ˆƒÊ…wiÊÄVÔ}d ‡ºÃÞÌŸu²è\@fCHMóf³nšÎ¤µÚn‡]@¼¬FUÜÜCY½V´…·4(Æ ^=¥y‡ ³ŒC·“‹˜Ršö'ãÔÇ´šO§ý-s×ce’_Œw7@¤jLr‹Õ`’[èÞ;ùÛiØ.fÅ\Vý¥j.ê95¼©ÖÒ!ðruH ê¯dYŠ\<•nÏ8°êY)·RAÉÈéè MÄ ¦À¬ÄRë°ä*TwÀÛ³”—÷„ò^D ¨rE|œg§§År‹ñÕ¿rÏiG‘Þvt–B z®(}‰ )¯7Fm[ ®”±‹ÛïøLÛ=WýâÍÏ΄ ½?ÓY¿®ß*¤ôcOeÖºõÚ"uîð²Ûêʶc9YŸÓ> ' ÿùÔî_õúŸ÷7¾ø¢¤ÿypÿOýÏoñØúŸ ÷¯èöÏÓüOUðÊ=íÉû,[6à(úä¨;HÎáÌ´º«ERX¡sÙ7 Ò½«©¹Ï=ã¼¢o»”3XuOfìÚ| Óñ3©°ˆ# þEÀ|"-ûYA<5õ¦ÅFqºÛÎG‚Ne“‹R?¿à~*nÒ¹íGÛ;tQK/ác/›+ÖŸçê¾]«ª÷Ԍޓ.’IXGya[dÏ”ž£6`×X F@òtH˜a.ÌY‰¾‰ž=tùCS¯‹” øtÂz„lfð‰E’l4Jû˜ª‡ŒdèðìàÄßñôáj&фȤÈ–ˆßŒ“&ÎSNvXC Kq2™¼C)Ù#U褩%TÇ sÌb(MŽÆXUŸÇ0½œ]½)ô!^µ,¼¸lL耱  äZ¤q½@hg¡-þïÿ ¦³;w5,NQ…)ÚÑá|Š:[7*¦€-Œ_(|‡¹ƒ5ǽ 6q°nvð¦#¿én$mJœä0¬®¨GóÑGVuÜ3õNÚR‡Ðˆ´>‘²÷Ã̇Ûhö„ê¾Ø?‚ã"ë³·ýIjMB¸M] ×ŽvÊ8ïÑB „Z|ß XúdÿÅ#…sdiaÚ d ¬z#ÒŸ>ü`Yÿi7V±“i•ìWŠè¤TvK4‘Hšú´gQšnfcQã¦Íëp¢d*qhÛ“íÔ"<5µ•µz^­Ý}i‡éëjp¯¡/L4ÔJ¡1Îi’Ûöd9ð¶ö1´ÈæÎ 4×¢t-hÕc(¾òÚ%(ïQ{}g½†~™–ÙÜÝ>Ü‚&ÈŽ‡VG7ÑŽÌRÌ!Õ# £eÒ™ ñ8cm]à“dz([MoD; ôWtÐ HÓn]¬˜#ÊBÔÃËY¦Ô$Ð_B·™Üåüœæ“–þ oœÞ˜…`{)EÌ7+sª&MpJé3† ÀhÔ6–ª_(ªCw9ƯU—C­í§'óSí±©€p¨2—ÑÊ pvb²wæË¾²ìª ¡È¹²sšÐ'•ÖÄNB$ Šõþ¯›êý_µþªkýÕù°åt¡½…öí),7û(4Èî µŽËR^9, :¹VŒí³¹°º€ÕËeM©h° O&…J×Ü@š€syk2žå“a{ôŽ2uÇ à0¥d£56ÑB`FYfІŠÀ“'Ç$üã– €RùÖ '*6lXýaMˆglB%îÓœZ”œæ“ér bI 4ȾV¶h•±š\!IŸ" M&ýãR­¦ì4©vXrK6¤òIbÕ­­ %½ºÔði:ÉOÓeæ’vúî†ݺ԰°€K4Ì%í†uÝ… ëº&DOèžÃ^®¯TßqR•êûM*p¥ún“ Jw&Ÿ·8ÀÛj ’y=Š õåZ‹!ò%·>©^ó§Äú¤}øÓëÆ[ÜX=´ç3…`#l?C«ßQ“ËÑÛ¨ñÿ»¥·Y4—¬Š´{MŸ ÿÓñîþ–jº0 © KæQÞÊzP6GZ¶ôÖóy¿ˆy¶iÒ›oiZãÛT´©`‘  Ç1·ÁH/¥MüçmŒÑ·BâX#n¼Í8Ôl¾m4l¿Ûh4ËÇžTÛˆ8ئ-CâgØ¥gm2"«@ô¼€ eús飨† ®hÛæ§~ý8cQUfMªnt¢@o¥Ã‚(Ƈ)XRú[þR6òWY¼r+áÌ* 3ŽÀRhEÏyõ£ç°%¬÷¸Nª‡ÜÀç(F+“½çÃI>k¨Wc/ÉKÊ­_á?d|| óx¶s¥úN¥´lãdìÌÒQ‘±¡©ƒ)X4®Î«ÍEØ®3#%ð|ª”ä5[zVT¬¶R©ÄbJÚn[‘>dM¤) Ô:fGew “É»9»Vé¤ß•æìRÚ",´÷ꨇŸìè×ÞÛÜúnçŶÃ7ä+·®ýeæ@†~ã¨éxCªeš°koÅ2¼Xàò1H‘Nìø$v€ ãKì§©ã|&¶„²h:ÃáY&ƒÈB~ÖVEαY€Åh¦…JðOóÙ°'ð™¹ì† ·£ˆWÃ7LE ¸|l8ý—%T¯(±”í.‹tÚÒ¡dpø]‹Åà¸Z4Ñ–£Øº©ä _!ƒï9I+z"Ÿu ‡×^o¯Ób~àÉãWÁ3‰ß}XáÁq„Zmì?È*YórxzÙ§ …8 ó{Ë+.šÎØÓàƒ5HвQ£LHO¥Í3‰“{È),M›’˜I¯:¯aTvbÃvêodl §³¨Ó‰ÈÍ|ÔcR¹Š°¨o]².ÄŠ9æ£BGR´ÙQå¡ E[‘ïµÑû¶®Ó”ÂCõÒs9í^޽€ÿÂò U€ÿ]jªÿ\2:uW> +ЕteºÒDß1u°‰\âj,ŽüöOL F±Fc¯¯ÆMïeÊ GI’tÿ¹*{„ÆâË¿ø;jâÀq«\áFÁ±óô 9ÙË»!+øàбޥ€º"PW ÔÕÝ ‡‘¹¶{¥Î¢ãe{U J ÁÕ J­fDßO 9ô˜_PÏA«¼F7œX ”7³MT«\~óð²—Ðý!Ú¤{æq.w>?@i?Æ‚¹S}¤i^€ß WÌ+M^´dÏ­þøÓws=ö¬ÔNŸÕBëOŸ,0ƒËN€§<‹å£g² EOåM  ‰€nÚ+ÀœéwÀIZ4×ÊÕçRÎËñ[­‘¼áóJÞ_YïÝ*4<‡í` O)ãŸf—i/ÅîDRpMQ«Z…¬5«(af2\€TB|Åëö!¶ñ*P—¢äX õš‘Í¡í°; FÞ5öÌÚ©ÄáJ\Ï=w±#Ð>o™ÈÏÀ«“dK×U¾E~äɾ}íßÓBãß=6é‘c1ó ¤î/>h ¢ÀÃëàl¨íƒ%ªŠ,Y%׌áñT?ð^½˜(‡‰Ú¬å˜&*œA–ûÀOÎÄÆ,¥:ŠÆo+81bØæÅ,ɦHg;ãÁÄÓÖ«èZÜ )éJü˜zFç,yÁ“b=& V£s’Ô«‡e0¨êoŠ[*4)¬RøƒEðþºVÃÕšM³xƒÒâ…¬Uô,sÐP¬B×S£óâ! Åg3¿¬¦¥4|D¶•UÅ%NØŽ æ=žæ:–£;ùŒ°çIÝréÇÞjJ0£ri{ .û¬7:u[ë­×Ћ·¬¦…š Ì›a¾-"$MHÔ÷òœÃà Ɇ9…h‰G>$§N¬öÝè â±òªÝT²›ßûžä,,Š=irWšZ³w©ÂmtëO0"cJÙb¦ γQ6NTniAã6z;ºøÍÒÅryWÂuª-øÀ»ú-€ï­]° ˆ>¤¯ ÛRZÔ웊£´W¡Ý³Dû¤{ÐO´–½ZЗm:3ûžì/µûʪ½R.Bû‹ú)7b©9ÞŒMŠ@­A-ˆži™dï.“ChÞ¹E¨ôz:{#½i8:dºd?¤Ö)ŠQ‡ý´÷„M£)ÍmUð¡kS°êœU÷gõoyê‚ûÅb-ò&þIIZMÂâΫ¦Üš¡ŠdÆ“ƒ3MáX+BqÛÉqÅú]eóÊtÖéLg¤J½ã»¡`WM`äãs¦ÖV Ü‚¶ÆÛ@V$¤ ÁþúÝ Á ø=X𕼃ó¢ÁÝ6ÚcœÅÛTù6o¬•ª&¨öQŠUj.X‚‰)Qw@sƒ Zð-c ª©ÎNÇßÁ<£!™pÇ'ùHè|!&Á;ñ‰Wm6MóÔÚœÂ`‰«¸ƒ\êÄVÏR'wÕ,Oñ214ûÖý¥~#_ö0ó‘¶ß}³‰ßÒ;K{³¬wfì¡È•F6N'Hº,tȺ˜r(Úl4mEƒŸ[Ê)†4ÕJsêƖxFÈÎeìÉ{o{Xwº=jÛ¯º+MÚßm‡ê.vËþh»ãwù—õÙŠdgs8j°vtÆÅƒ¶QµpdÆ:i ©£}\­¢%€œ ºÑóòA¬5ŽŠX±Öô8<í&?Š9(™,ÝêÓÿ¡]À1¼?7°\Á)®ìÚ½¡V¬am_L뮨p©È‚µ“졉ÁæäŸ¢žxølØ7æûp0°¹ž#þ ci´ÔsbáöÇ1+5\Û‡ˆNq®FÔ&f< gÛ{/þÁ'œŠ5çô€îꔢ÷<þzhõ»T%½Q’ܰ8Tn[¬@#­Ç!½C:zÈ'{v{çŽZ©°)G$Ú% «´DÆWë–zN)¶´“>§ å#+§—…ìÆ ÕÅÁO»þ;z0Ðųå\Î-o¸AF"óQMˆvm1ŬHìסjJ™ØŠTlY«òIš/Q›4šE¿ŠúÚ¬êŒGd¸S®> Õ®í¥DZÇËù›²‰ò¦c"’¯èÒXzÅQÙúaxþV-:TÕ†ºtn¼µ XÉòå¬gc€ùÎÙø,ZnmѦÖRv4Zã8ÝEË,tCla¨ñ¬zÕB«ÍOîMìzÛá7‘¶Fi[žðöær/ö¶;¶×áB8ù¬ÐöÊÆ™²ådÚc¸ä6Mò™Š3å;SêÆÑÔóåFŸÇñ:KœÎUò\,¹Vc„oÒwëžþ¾oç%ÍZ(1ã¥Máªñ ñЯ©…>œÙP2„‹z>tB;Š˨T–®×“3; [WÿõÌú2 ðpƘîéDŸ½%7ë¼·Ø÷½—»;OÿÁŠyÒa +ÜÏðÄè0+9š3¡–%r ®ÏY‡‘W̶kæ-»jï8f¿ñ*z·V›•Š.nå¡x2†ýW úxŒ MN„bÅKásÕvÁÍÜx˦°hUN·kQÒ]NrvÐP™U—nËQì¾qz{mUŽÇîØ ¥¤ì·D‡³RÉ*VÌz$*öó •®ÅyÃN.Dnûƒõ@=kšjÁTO)+œkR oÅt_k3„ÚB¢'FÞ¶¯¹—G¦¹ÛN{"p¯€IœÎ‹³h‚©“8’Þ&˜t¾ëà&~3 Ôêõæpx3¼vªÚI îT£†³‘kgÖn8ؤœmøØÔéIÚË)´ˆeGFÁ¨d=¬@aÑ/¤Z6מå ÿ^DÏ×6œVpS¡¦SŒ”1y—Fºì›0Æ+‡¢™¯Üë´Ò¼ò%Oh¥½Õ·=•—<•ÔãÍšþß•+Îcå «žêUZ¼Ñ䯷¾ HUV!C–5UŠGáqI#†Ôð<™e皦ˆx˜•È7ÔzL1zƪ0qM‘ºY¶+°†¾C êÙtT£È‰P¡{ Ð´Š4\z\ gM—K:³Qä~£;½$ηÎôï*Mœ^®\hWšCÀû—Ñ]¨BL ›ð˜oBÛ}Zo€:€ˆ…e©p€ŽÏ£MÐèLx-ÞX‹C, ëxNR)F8UÆ ËNÏN&¹Ÿ»Ñ†äd]¹¤ãîª\î‡4RQÇÔâƒ6)“#­¤}ųª ÀwžÙŒ‚mBÿNN"ÙÊ(Ù1©`1dX–Ôv…eUÀ›4òà÷'tØ¥—€ËßeáãF>2ù#-›˜Ê÷‡ŒÞ¥-ÍÍÈüt:³|A{bã+–»ÿÚÆXѧ‡ Ë–Ne‹ÿÃlŒª^lL׆þÖŽ›û9Úz­¡ð6pàÐ7~ï¶QÆV}Zˆ‚›mäxµRúC6ß ñÑSîQ¹`}H~´µ}ušU´œ­]s Ï­­†~ &A£óÐ áhýaUT©=æK¨£.jaËà”«~ݨCw7¨K …k¦n6‘ iùíc†ÎKò¨{£5áx‹7]™O1™jÌHykJUNν=ñ50hv–Y¼j…s¿û­é©œƒµ:¤¨y 2 #UY‡$Êñ{êæ74 ë•NDÌLÈm¹Nÿ¯2—™°ïTšx}¸õÓYš€±R§¦Q“KÒ;ÃZµ‚‡Fj¶"³m}{i«Œm>ng›1/Šù(•¬d£FVǪ;a˜EͶE ÀÄ´qø¥R²õ3:á0ª8[ςǪœ*c¹! ž®¢Rbˆ•Ãùf™ =.RÎÍÆÉ‹'&~®¥z/Tж ¬úùŸu<Û‚¢[;Êß(ÍhEÝ´Ò’¢pbÑLWh%? [:¤½²`@T‹ÃmÉÕ£1¢­#xYÙÀ}8–Aœaw•i)भÖ^VKäÃ2{V*¯Œ½IÃPä§N4Î:»õªÍæÞ²$„r@78)Y˜Åå ²N¹<…M«¹NXaÝ À¤˜šZAg.;œ Ý®¬ämO÷FG…×­Šqà:Rí11è¡2-)iÝZÛ¹ŸöPjÜ[Èîꋵz¸Ú_»¼•¦¤¢2ñ _Ç)íì8½€~D–Ûp¨®íçÆå=‹á°‹ÛšD×pŠ‚ë&׃zg F±ìøb ë±.¡V ë«a‰V©Z-%íµµPè£Áÿ¿ð’´´+¶&£

&vú Ûh<×"mzóKÓ¬B.¢Ï1Ìå95©Vhï¨hÞŠð^_Ýw¾Ça*¼Ç@*ómSQè鹈áдoä¿MÉÑ9ãËš$Ý+ôå*m'78íúÒ·Ð_À¹‚,L)¾f,•ªºk\Õ“]5ºšZ’§N¶/NBKYµ%Õv´Ì8Î) † šž›¸Cð¿s+ìþq®#ˆœ‡´0ìïÿ9o/üϹkä\GÎ1šu¿7sÓ›¹Ó›¹×›¹îͼ¶7s«7s»7sÝ›¹I6ͦ°\X5†˜xJìð“É;•abBé0}’­MYE´æó1«R´·¶úl\Dj w>:o‡o"¤n9_5¯6ôÌè«ðˆÊ?¨z_¨v·î蘘`Ô«(ôf,9KÆô›öÞôŠs\œSž¨ œ’¹übüY§\°RùO5L¢ˆ f¨×¤èúÄñp)ónæ-†F ºwNzY¾jñWÁ '˜]T—–ÞVô[7+eB‹ ^¯ŒUS}5ï=tSÅ@–% ¶ÜÕÃò¿mÀ,ËOÀ„·å8ŒÖ-¨žàûPÄHõ¸8*ȇ.œ‹.ðq.u*îtáè\Rô]N72î”Üšš×bóR…ÆKÉf|aoKÂvÂDU (L’÷)¹@ È’èœÀàìE¬ÿ¢ ×AXa¶—%Œür]mºdõé$¹œ]\…’§ÀùwNd£D1àNÆ7¶c¼–zñÌ7ß´=‡Ä^1¸ûØ*.ÔQšx NÄâcYÀ-¡^Ä*z„6ʨšF 5zà M°‚{ø%¼ˆ´÷m°TVIÖj =Ýö™|–øžJh(nTN_u'B~7ò%lºüÕÁ/÷Hvb%x/ª?Œœ|þmùÂ΃§X¼ª¶-íU•¦K]*u‚³…Ú”™ðÔ¬?!Ê̸f²9-Ѐ‹¬D›U%*C“À``RUiž’mQòµóðd³: &ïnêä ”µfn:—ù¹ Ý…ÿž£æX„ù#´W¼ .ô^®M9"]Ä™¶å΢¯FoF¹eSb8[.ô/lÉ% †U#’{O´ú ޵Çsµ$©èÓ}/O Lb…{aÝÁ¸Ïj6£É"þ ûÆ k˜W½´óˆZGÊÛ5ž\´ƒ¼¦1u¾`ÙA¾k-e>i)÷´—E’ûwŸ 7ÖL¥$‡a‹+¾ô{!Ú°¶ïéPŠ‹H b—$k¸-Ò ý{îYV’ ã”y†þu^[ËPbØø šûÙ"s>ø¶x¨*DiИTøÅÞƒ6p[„Dúw^"YA‹Ñˆ•:çíõ›‡¸uþþ÷¿Gïp•EÙ‘ªRÜÏ€M ‡¼M鯻Ü]·UG(§ÍùÚóƒ#eV½¬Ä¢=Ëù]&‡Ý¹kÖHÁÕçüNTªšÉóçFújŠz_')ÈçpJ¥A‡B> n“„^{„«—ÛRL®ÝWÚ˜ã 5Cy;¥+?Guøœ¶¼•ÓQ N ÌY>£›ÖW¯KÆ.TéG,Ê.F8À×'ƒYjçÇô!f„,H³½ÌAÃ3Až³XÍ\¸…hì‘ÁÄr±â/¬ÙV©ÛœkƒN‚™mÒc¹Udì"+)ÞG$aêÄ+_%L± T÷Œg°ËD—»|íT::ØÞ%vЂJ%ÌêâãV4lQ°òÕ¬@>±µQ~Pªõc-Fßö^Ý6‚ë9×9U ·åÏç¦s]×í%}ƒ²ƒ›ËNeiQ7¸Oç~t¥ù[ã>×m†Yç~ås§²ép• ŠÐüó2É·Û‚"ŠQ…WÁ;‹ !=XAWx°EqÜŠJs1·õçU=Œ¢·ˆÓtŠa¦”Ë[dmf@X:£bBB·kQ‘vf±Bã°©ª¥ôÑɬž•Ú-S蚉õ^½x²«ºM_*Fù7Ò¤û¸ƒªÓ;Ú®øÄóL‚Å„Ô ½ £#†Pá¯GÙÕ°;AÕ"û²¼Ž÷¸x»¾é¬ÒtÑÿ¼LÈÓŸ cBwaáÃq0ž—Íh6[ZgZµv0ó®)áF-jøÞej¹ÎR¨ ½ÄdCNì,‘xè[¿ïnhpÕIAZU©€wïÓØjé)h話¶ŠãÕPRpc zdá ˆeçÕJ ‰ÓjýD>jñ¼†×™s´.·Ò ydç [} £²ÊwÇʱH‘ïpïIç0P'…ÝûÏnKúTÛüûWÇmñ$½ r‡Þ+6Çé¯Þ lXgKùI0ߺ¡¼æ[“nýü%˜ÿb2^³'á·ÙžD¹¢F,&­,'SÄN\n´´ Q>ÛÔ|N~vjꋈ&4[–ÿuY31² ¸Žë"Í+C c@希ӣìlTÙGѺS6è~¢R°;EµKw²¤S÷½ºéžæt³xJÍÇÎR8ÖT" Rs¯TÍf°Î^»ùÆô¡@×!f!¿'&Î’¿žƒúŒÒÊ»á²Ûq`µkfKœ‚J>ŸœÛÝ<«Ê”Ué+R‡Õq¶› «j\1±’ŠÝàôöÚ*h¹)½;P42âë ]#ˆòZÙW¤I·égï»^䥨¶&í'Xá$LéÂ|óîþáQ¥d]´FIÿaÕ¾šÌw0éçHôqZõÁøªOl.–B•Š/V•I‹Ðª2MÕY_³ˆÁÂ׎1£Ž”]Š I`l \cÈnû ôø¯z#K¡sè’žíõC„™ä'‹,äo´ÞB7s[œ$/Ú%d“íîÿRcOÍFB¶þ—M)Ѹ'¿BB/~¹ÆÜæ{„£¡Öý¶=Êbý´¼¥X (JAæìiTÕŒ¨iF=² µªQËzðØFÉõ:–cä˜e²Y_¿i.¸çV½¨móô`{û¶FBi¦§Y,ãìOƒ(Hµ)4¿gICB8ÖLEÌB>oìÒËîQDtÌd‚޲Ô)Ä „)àóS‘¸—¤nvêz\u>kG $Óüe¢áÞçÕ§OnqN9Æ“¿Ó¨Bª{F>£–v-ê0‚U è•ÊTs„#øF بʸs‘zÍìŽL©j,éq•ÖB6ð¥šäo‰àó•p>‰W%½’æS£«tVíg^6Ä!ÑEÖY‰.üs)qQœ*?í€%´öÍj¥!=JΓփ·‘º‹w©=¢‚œêSl!ØnÁqWgÇ!Ò-Û'_B·fÜþ Òâ2=ª[°RÒ‘3TL™…¦L Ìt#é’"; kÄËðz Ö!9M2”êKɱO†“Þ»´ß|ÛxÓ™·Ö‹R“#¦%fNðÐ'ŠUÔ•^ר÷—ßNKiôfrˆ§_ØMæš_I-^7{ö¾uæ&tT[G!&î6~K:Š}†9·0³víK–SSkÄaB§ñcŒ_ÌOOS2G3.´·R6Eh«”80£„9óÉ|cr!!””ZLÙÕf艇IÇóÉe6â+lsl¬²T?MÚfTM=Rùÿd“7CÙe³äyr?g7ÍNô¬M½¡‘ËGëÐÆ´æ¯ž&´pÂprn5ÊÎÊfr-í°˜!÷w1ĘŒ¾ÚlÏÉ$–!´¸Ö¸ÓOÅüÄyßÌö–Z’®ü‹•½HÐM`­Aê#Ã:2¤]/‘{—á)Úlž‘þ±&vrôÌþ^Š(uHU´eŠSL¸-¨¨Rž«¿ÔbÀ!Š:~õÓ -qÐ1“ß±±4¢ÍOȳ`<‡¸~@ neÝVÃÔ"5ÍiÑ9*´K7‘ •!æ17‹î,ÖÒS1Gï™ á»µ…tÆê¡Ãù.éÄse'Xaº–Ù^F¨â™›¬Ò¾Á¤÷Xe§7m⣼qu ]1Á÷˜Œ€ãË{Ù¦]ê¼Ú©]=ŒÐÆa¤²°*:ÜÞÝÞ:ê˜xå¯èdø‹;Q¤Dg­Ðà§éŒÜ¶á_Š=­B‚»é<%@x%ý±BŠÃ¹|Ör3}ZÔrPñw¶´ø¼ýâ‰{`^»b2…qBÏ[«b,dØ@Æ=:-3‹ª+ týåØIß8û¹œÑ+ÎbŸÁuÃúÜ´v–êÜpbOÑ–QÙ~¶$÷ÓFÓ¨ŸôzóÜS%@EUà¸ddšg~Yë”F(9ìż2$¬s5.¨vmfTŽLøg>_€ FuÆ*…ÐeVe„»6eâx%?-ݶºŠñ (¥r¯Ù*Gõ*?çÅHÞSóúÐêp^ Îew:ÔPb RùW‡¶a@D@í–åÉ=ËæùGa3•·½ŒwN°p™¯˜iÆû)t¾‹È…³Ñå)¡ùèÒ?”.–œ4¢¢˜ñǦšŽpBQêŠ;ÁXg:xгLQF~,^Ø[Â}cm «f`Sx =Ü Q±#üÆÝRV{ÆJuóª; äñ‘›¸4_†+P‹òç^þ÷Û˪/oõc4ëFKnôŠ®út_<”ÖU0j¥ÿÇÞE*ïeäÄL¶EFŽ:ܼmÜ”ô´Xmq’%gˆ%úæ$þ¸åœÏË%¯ö'"LøÔ'¯ÝåÔM:˾¬ÿV޺ݾ{-Ò® þXCUTáÐô£Á |¬¶‰Y¤ òHWj¼·…áCuB®jÚFÉ ›˜ÐôE(Cªö¸©AX…¯jjiì½N‡†_O°Ð©RU>tƒbòØìÈ ÏEK±-Á‚j,Ê©1ÿ3¸œðùPât,i‰”b¦€CÝt¥‰M=f5ÒÎþ‹fäë¿Â­S²mïPÒ9k]& V™_«‚cU I‹ªŠhéνñ§§-$koí!àBÌõ›ÚîÑúÄ} ¦N®Y§$ëÛ‰ΧÖƒ8¨älNþmz'`Ä$¯#Êp¨S"gÚ[Â7F[àã–ЋŠX>nŸxˆ¿vŸ´í­ÌÔÂnÙS¥ÔæËߘúÞt nÖÖqdÙg×”WÓ"é­6KêLÚ¸°ƒª†óD™¡bÈQ•9{¥œIûõ—áILHÿqk2šÎgÈ£)lõçÄÈWh‡ ã›C®æQaÚÑx+UU<óÕÌÌz{7Íu '±¬—u9½ì¥S²ÏºÖÔÈ0ö’iä%d½£ã/î·T½+Ú‰ÞO³ñ8íwàj!Žwð?\H@šÎŽgøg¹a¿Õ]ÇêN+ÀÜ䔆žHž¼¦D/ö_Pô9éÆŠç­×…I 1ŽÕÏut¸¿·CbOXÒ.VÁÎKb^|ê“óòAÔS‹,ÑAË fe„<:<Ô<Ì5ÓåbØõ_ÆÆýË7r´ @¶³½³°´™¬¡f[È\WÎóþïCÙ†D¢Ÿâ.R3Y>uÝqÅÁ«ÎÝÀ±#ç*îBo^{nªE³On»Aƒ8¯=»µ߯Æn÷JácèàÃo78f ¼x9Z(rNî|¾T˜R^›#;²TKçå–T¨ÚÚ–$6O£½Qkâœb±¦Ø E?Ã®Ä ññms¥d©bÅèQÑý(¹;ÛkÚÌÊ£-ø@’–"¯œÅ>ê§ H`ÓÌâ—q%'d¿ã­öÖöîî{ ¤'VZÄãÚÈ­ìDfqrÑ[Yç…áµKUªJj7î×Újïmn}·„±go°JØêæ$‚à¹|©ó¸¤âRmiMù­¨²KÃ%¥ör#¸ lÖ?c ¸ã¦_jöGË@×6ìšðk߸á#-Zã6rÎ¥d:%µ¯ò oZµ´P‰BØÞ'O/ò óFµ+6Ë&×ú·Û-¥iýãm…åºÄô媚‹A⥪},† ¦ÜEÕóP›Å!ÇôŒû4¨¦OëÛ^Yi¥zMNY¡ß±bG¹±Ü¦'M*)zGЦI^¡ºiQ^8Žfxf;Iéý×ÃÚϰ¬LƒÅû’˃ô´Ðöc–EXÿkO¢‘'0øÑhZÒKnê‚9YúÓcdq>Y#F«3ÊIü@Á Ô'köL‹i‘û^uѯ;CﱓN-üõY{œ^ügo÷`çpë^žÀÿ¯Á&ÑŽjÙé§kcž¯<€ï?ØØøÿýâÁ×ëôžõ¯þ￸ÿ÷`ãþ_Ö7¾¼ÿõW‰Ö?]ªŸy1¢ý姺ÈU}ÅðýÞÇX/DžL&ÃG‡µDy$î¿76þùüÖÐÿ'“Þ½_­ $ò_ùeýÇGÓÿ/׿úÿ‹õ¿D_þj=²žÿÇ鿵þg³ÑðWA‚›¯ÿ÷|ùçúÿ¿þ{É»t ÓOÙÆþï‹/¿þÒâÿO6| ÿüÉÿýÏg+Ÿ±g8.:iòá_ÎAØŸôæ޽ÄW>[Yùîho·{k4̳¢×Ft‰FÃYz é×ÊÊÊÑöß»È µÛ÷0BÈå=ŠåKŠ6üŽ~\¹¥¿‘â$ë•?d˜µpÞ ×‚&ÑÞÝO‡ÉU1œÌÊ5èæ üv8Ç+ßò{Ì™˜Œp8ŠÕÚdZþýM“Qùý09†ñrþP.Ñ¡AÃûQR†B3š"\¡µ,48Zà|­¢æááféÝ÷»;?”;””^í쾬êI’÷ÎJßs;Ö0LBé[RŒÊ°zåiŸ&ãµ~Zž "–Ÿ'Ì}6ÄT4¥é,· 8MÇ!D~údFÓâ °+€ `îk¨X«Œÿœg&²üqçÅÑÁ~ió 1Ùä~(„¨Æ¡µ<0¿' Hcã>ì…Yhäk¨ …!âÔ”¾³=ãÏD¡rI¥C£~Õ—J³qºFa4ƒ ååõN†Ó³2œË¿~UžØi[²m8›NË·Ê™°­aÅŠO€jŒÑ++Épع5Íz¸…ŠèóIs“ò#À˜ß++ê[gåVÜë#AVoR1†{çE>‚ïô¯‚¯‡i2†×÷N²ñ=ø°R¶Ðw >› ¢×Ñíh­)dŽÞ<”ÌÕc¬µV`³úcû!2N=ÝÿP=ýѯ‡j‡~zÉP©&ïúf#ðüý옙ý/šO:Æî›­1nMÓ|hÒ•>¿í .Ö†)³ŽÄέÏc8›ÑŠs6vœÅÄÒË?‚¸íóf¸Ÿ®ZþcãþÆWëÿ÷åý¯ïÿÉÿýÏg·ïÍ‹ü)íiÃ#Ò¯h®p6™ #8ü(hE!…ˆ¦É)™1G£«hr1Æ"£dfç˜R(*fWÃìç´í"¶_Ù€i4™Ï¦sr¨úíA{}#:Ê“qA!1ìÀã›Ã!€ÜMçãÓ(â?É·pdޝæí´?‡}÷Ù'|¨Å§4¼<‡aæÉ(±À/Ÿ²¡Ïon=v°ÿêÅ“cºæî6>ÐÓxEŸ]œe³tås "Gú3î”ûëø>ìínë/I‚ßð =ŸõÉÅ5í¯|¾ù“>l»üõ«/ÿ¶A- 1øáç‡ìÅ(áƒ<|õøf…oRþåæÁ&]È-QöÅöO¶ŸZ³§'á3õýè/·+ ¬|¾»óâ¹úÿÞ~ ç½Ü´_Ž’|2ÃkÞÞîñÑ?¾ß<°)‡Á›»1z¾ýöÌRµþÕz"}9ÎS.µódû…Yï¿õ¬?à2ÐÔöž5)¥±>Ù>ÜråkøÖæKgà;ßÛüßûºœUF¡¿W$Оf·WÛ1,ðtsk»Û8KÏS Ä ýM06w LþÁ?Žw·_<;ú®û`]¾?ÛÝ\YÀúøÃÎx»ñ5¾>Ü:ØÞ~!¯¾^ÇW4R~ñ€_@ÃÿÙî®m *ýýøåÎß·w1¦1œ‘PàæÍ×_ý^ììm>Û>>ÜBl|Ö]oã»—›/·Ž¿ÛÞyöÝllldˆšòžÚÃ×mIïW¾Ý|uôLn7nì}Fù'­¨aÑÙFóáÊ·Û{›;»P짨ø“ƒ“2ëp ħ¢ rÃÖM¾ÓÄöxÒý¿Ó‹þÿ…¿Ÿlmwÿ/Ú“à¯ïö^lîÁ›³I1}…·½³É4ÒŸÔo¬¨þ€PùÕáöA÷óíß¿oàŸðî‡~ÀŠÝÆÅÅEÛtgáÕÁî˃í§;ï6¸›÷|^‡¶ñãíg;/ `·ñÍD/±™ù±a퇾)FÀq?úfš§øö‹'\ç¾ùæž|¾‡ ¨ÝÜÝ=:ZØ‚¨Š LëÓŸrφ“LÅ–äÞp±»+]{}ú³©ú^÷Îë·?¾ÿñÛÕ;WŠùItJ=ØA‹æÊû•oy/Á¶èRZ! :Ô<ÆxVE*ÃÀV¹QM­|K;ØÔ«®˜ô΢"%ÒÊ!IßÝ|¼½Û}ÿ›C\D—”n¨BžŠ}F¢ „¸ï?Ð;úŽ~5Òhožç˜»ašÌÎÔÊçOw€V˦ räŽírt*m¿Øï®Ë™gj¡(Kµžm¿Ø>€Í„Ë}¦ù³òÐÿû tƒ8náÉþÖ«=h—_(!–›DZP’r”ï³ä<•!RË ć•O¾ýsvPߢò¤nå“¢ˆ„Š’5ò¯€E$·ÎO)¢%ÐB4Ž` 4Òþp¨K5ý¸­Ï‡À­É‡/ßR12ŒåB‘”â->/Î"}Ò´¢¹¸ªü9éò±rô9*[À‡mܽË£›÷½Oî|vV’ê™2H=Lúƒ?n½:8@2¬H/æ»"ªß$tŠ!‹A‘»¸—ÒËö.¥º 9;£Qš-(F3ᜓþ|©BËM—Ì”“:&qÀÎ¹ŠŒ¸MÝ_?ã#‘»tȾ!ân-„™qZ5M}±†Jßʃ…ý¨UኩóÍÃŒTtTÁø_ªÅÿep2y7ŸTWÆwÒ¢<`]û¦‹Øƒs:Á(Î0ÐŒþ1PE Ådxž*Ê“7ý¦sâÞÿúñ}ÌŒjóÇÿëÞÿ§¾Ñ¼79uöÕ{ø«ÐíË´‡nª ì8~OódôkPÍ|>Fèjb@–É.15‡GO¶¢GŽ…)¬x(Ì7]qC}’3†Î´ÿnÂé„Kãóÿެ¿Ò ´=>ÏòÉEƒ{ÒØ¯ÌÆÿÀÞ¤¯ù‘=D÷PÞ#ž¦oĸ‡ïÝGf#¥pTW¢¹¤: |>¾€æõ(¿"ª4að•<’ÞlN‘÷1—ªÝ†¿1„ ¯öÄk«ƒnçÌûןf~°ùçÓ$?ÉÓä]×ð<8Þ#؇”T彚#àQ€¿‚TõÉÔ©Þ´ºÎ p2 {o ¨Xá=–réAÙü¯'ÛO1!.T³ `÷_$µo¿øžã ‰!fan‰¢OÒÓlü>ŸXù/Ù­²¡Òé¸/e‘¬Û…¡,^)Í0Ü *¿‡ K¦[û{{›ÉW—ó` ^¯ü׿ÁÎÑ?LëR¾]YºkfÑœ#5{ sW¾…î¬+ þÞ°þ¾¯þ–î¬{¿7¼ß~ù/ä7-+0¬VÛ./–äÙìªõ9ÍjëóÔ!Bˆôýt¡Ãóçöj “ÄιŽé É,˜Ý&Zö¯8ÃhHRHBú0dG — .ö¹B‹£>Êg^yë#ô\>ѪX_h„üwN{‹ù"ˆºèËáÚÚp ݺ¯·Ì=âYåüþýž3Ž}ƒ.¨Y—MbÍ|¬˜;>ù–ÊFm-úô’y‘²G“ºÎ¡«èˆ¨VaO|óf¨bÈq!ý'“*Õ)æcò´—ö€bkb,ª1+úºõØÆO5¦¥³%Ü£M©î…Þ¾X‡ð±?Ál\ïÆpɹ%áÚœaQ°EÔg*]!ª¬Rwmþ«‚G¹¿&zšîÝ`ž–\HuÄØËhK1j-+–ÑæÐˆ E*°£F²hñôèk—ΣtJT¸ÁÞ’*˯¤âòUÍ%Vòs:çõÐ?S2¾ñ&´NZt‰B‹¥‰¦Ó=.(¯Þ/œl=–Ð\Gj÷ôÒ+ZÛÈʧV,ÃIMÑ~EiìsºR;|ßÈaÙ?D³Ç\–›¯tåÝ “ï³õuünÅ«p¬Ì_ñ»ýílèÊöÂ-á¶€eü~+Iâöä]?Ðÿ+U÷ë¯ù*ß|%Û©«ïÔeoÂôïk5M¯¬ßQ@>ï}p¹óñÏ&|?‚ÐÿcC_m‰ç€-ïVþöÞõ¡m#]>¿ë¿à|ÔKÓº–Áæž–ž $L›í–nl˶‚,y%â÷oŸËÜ%H“î¹”s¶if4óÌÌs¿hLi˜BQ,³¢– œ~³¤lIO¤±¬°ˆ~|ÛÚDQÃu½“à"ü›‡_Y€£_¡¤k󩔨¾k#eQõ4ª|Žªžæ•ãf•m‡“AXõœã/«^¾©ìÏ{‘ oUL±U“E zÕ‹~š€Ñù»Y4.æ½-"‡?­áÏ `½QØ¦Šº0ßOà4F›DŸ!mõ‹£ýãó=ï믗€S€øõÿ×K»u‹Š…ñ¤Ãi^òWW߬¬®^Îñ·[]=zµô ô÷}O¨¹áÒw¦¦ç«ï‹”„µðœÃB…àk˜EM£žžâ¸&Ê &,ŒKðýùÉÊðJÅøÉêªôìXÕ~ÒI]—TÔÀ]b‡–¾&½ü7R)‰&üåGÈEÞ×@£?Þ/øà¯•ŒÄ£`R SÌ=ýH¼ÿéQ¤²(< G˜Ù1r‰±Þ‰¯{ úzöÍ×EïÆox÷.—üæå’šP©‡Reã'Šô  uÚ<%ÔjÏį́ðëUüä*|[6dIÏnj¦öèÙë×ö¹f˜½“ÁGÙyÆA¯¨noSnƒ.ÿuõŠáÞRsmíó%î’qÞOX8&Í${qØ/ø™œ7Ày:M³h0,dÞP ¹ûÝ‘íjV»ùêÍ0(VóQœ¼]Õ¾ÝKjh4À¤päºG.çܶñvÚU^öŒéÙtŒÄi¶ÜŒŽÿXTð Ë?ýã²qyóóŠìI¾eÝ[ÕÝ_ÞüÕ\"]ŠJo µCbƒj·†Þ´€3ßÕû†VT™-ا㣒8"§ìtDÕ@YöId5A›È<ÚEØSÅx6dS„† Ç(Û[Ør/\Ö^вÁJ} »ÖI÷,´ ¶WÇOgJ§§¢|™HGqXW&x¡ºð3>¥á„7 d†õ3é;ç}³ç­ Ñ‹¬û ²âGØ“Œ¿ „̃-dOjq©:Ôµ?žl­¾®“Ma¸*´X–4Ü%†’6E¯3ÐXqA„ÉåRi¼!%uhíÌx& ¦}é4ÔZ`~>¦ïõ­‚?jûL;Ó Í“˜Qx¾ßVÚ/¥ \´bë™< –£‡GÆNåQ®½îlßBaål®Ìñ‹oÓlñœ*½ ×îá`èηüu2iQlgx”ó‘VßsøßýÀú“nÉ ýyl-:Ë·UB eTHñ5î²|ëKê*ì)9¡?€$ÉKºïª¬¶‹ÌÝËZ¯ZÖWz]ëëºkiëÖÒ”ýÿŽei?ß¹¤;–´á,É ,-gÃZ©ÚQ"ÉPÉr«=Ué…'ߨ“f¹f-Ï»— °U‰™=K#–£FØ#kñW>*%Õ+ð³¹rrâƒO¡vÅDƒïP[0‡ßü™½P{Ï ævl4VáÿEw¯@9V`è…CÁÒÂ,yà>sÿˆÂ¾Ià 01ÃÇ5À(.ôc '„&Ù·„Á—q2x´zg«·ãû´Dý{´*îÛÊi¶¦n]„ 57•…¨õS»KªCÚa¤P­Ÿå&£ÝJ„Ýó øUÌ"=E[/•eI1ܾO€)08FØçé$ë†p²¢¼€mô΂b[›¡'QÖ»‰²°G ô$½i°þ>hÓáõ½äA æO=CÊZËè= !:ÓÇj8Ñ¢ñåÊe~{¯F†¯Ó FRUx¶ª†oÀ_– >v!ÖÓ§O*1z1 ºirU`ÈMr,ŒèsIJ6µE AP^ëòûè½æ¢á«¥åÂ3c¹ð—½\x€_ÄÕ¯ìëCÁ9/ õvšc¡rÜ ȱàׯ(m¶¹ t h6³Šð0Lj¤A«^{þ B“7çXrÌ ‰_ì-Ü+é- K-Ìb€§—Êê£w!§OÍÅÆñk½sq °[_zk :Ÿ±ºì}¹ ûÕûÄûp7×û Å Šnòƒ2BwôhµôÉfcmn‡(ØdY6BõÃêŠrª—«Ãu)Ÿn¿°Õåš×ùPÝPÚ^ÕZå+0E‡¿[!è_á>Q8#Ú.`ð{Nqé4øß^½élŽŸ³Ù(ïµáo¹Ù¼r§h’æeå7ð@G6’u€×buËbuGñ«&¢#ó3jÞ„GŒÆ~`ü»ÓP}x`nG¿ZÇ[kõÖ8‡Û#×F.Þ®W•‰—d:8L²÷–ú‡WÿùË•U½±l·ƒXGEK«=¯¦¢¹„”ܛҮ|UÓç\¹œè…ˆ“Î ãs? ŸWâ‰ï«ƒÏcø}»»rSØXãe5!ç ô§,¾…ë²Ã6Ù9,¾¶Ža+ÅßÑp¦¥íÜDÛåØÜwGÝ+<ùaBþKâä&?2–±ÊŽ­àå€O4V/â¦<J^BtƬQºâBz:z©Utò NK%8@ýxºõG´<}VeNu¸þ©Áw‚_ ^\Ù2Ó×L7Í*›òtݶ]j«5’d`óÍ¿F~ÏŽu➟ÄâÙ=! ƒŒyG1â; o ]÷D“=ÙÖŒ¤ŠŸwW=5Lø•¦x1=©¢²eM+'Ì’e‚¾‘Ÿ@ ¬ên`m›¨<‚&ÕÖŽ z0¶›šà¢ÓòŒ/¶¢ò-¯Õ—èVz´nK†ö²\ ·åSÌßœø§OŸö‚-ËÂ4‘Fx¯ä`ݺBk6+aL^œy˯Y¶pŸÐ» 6aåSÇö#àSj‚NJ;’ÖG…´9@·¼$&·$ÐìgÌgWÎQ‰ô²&xo¾§{ž`¼õÛô^P$ݲ5¯%·U·üŸQ°•þtQФ¬—ËøETÝ6>a(/EZ_,И-­ëT•p.„”7VVFb®˜ú± *¼Ð³'"­)ëÇÆ$¿ª¾ÞúZ/bj÷ÉEº¼àŸ}V~ø³bÍX"j ‘G…–% ¹eÕ‰–5Ö›S—}VÌNÝÊ.ô¥êqe&?Õ=2у¦}ßåRrw_âtA‡4°ƒžÜ_kkæžxÏÑ$GêïûOJÐGÖAÆÖß?»‡$[|:©¨Nì›O¤(< €£Çà×Oéƒ~ºñBe‡™ðæuûàvûóÊû¯¡5ÿV,÷ºÝX´W´ûåÖ˜Õâ!ÿa7]4êåeÞ¹ÿÀÐz¼hl†N Ä/óòbÒï{¥°ŠŒ™¹àýYew~„¬ ‡SQy^âh¯à¿•3Žx ÿ­zÙMqPøoÕË"ÀžðßÊo¦üf:¨z‰¯¯q¶ÕÓí¥~¶ÑhTÞ šðLù«ªî”í[Ð/•M:aA-ðßʃ`4¢ôKe“8uzÔ†«l4FØþ©|Opc¾€*_w'c| ÿT¿øuPýšÈœô[á)ª^GÕ*–­$qy»z[F—³Õ™Â“¤Œ†œþ±<Œ7ßü»ò*Í0!LøMå»ËË÷_÷Šo¾îõÔ{Ev¨]7òÄå(A²„>P ᔄ¾^Åß Ú+I¦vCrâSNg®’wØRz¹~¢Ü*Ü’Êð„‰Í7:¢ËSšf‡¦Ù¡YÝ¡evh™Zv̘‘iNµ_7Û¯W¶Ç<þ›ûó˜m=ª Û{¾²–qW¯f©Wë½Z¥^ë÷èµ®{‰,~K”ÖÏO̵‹ì~Ô¦)Û4KmZ²MK¶i•Ú,„½7g¶nôÞl½^ô^¶®IomcWÕ²Ó i4hV5h ZU ÖëVZ½û¢)^4Ý-ñ‚¿õ‰sq_ȔŲ$‚(€åù>…’¦È&I×Ê%MÔ‚w¿€PïF3ŠÇÞ7Þš÷ÅÂeLtZÁ !ÝQ¸Ap ë=2™ Œlê7I»Öh4Ê»‰p‘OcgºÂ ¾å2Ÿ¤.G8)S+ñ:›ê>iÐXplŽ4á¡Bµ= DÆ3=œ„ì& Z§nð°í±Ø(\%Õ×à—ß‘±uèp3Œä{ÊB%߉Æßbl˜''ÅÙJ‹, s~oZÔ£™Z?ÃŽ_£€4Ûág*Lc ”é¶´%ä·B_á#3í̜^}¯,&bɱWï|WÝF×\YðM‘aGÒº\ºÇ4Äd]%5ºÏû}mþXµ;N¯'öBûˆ²\/G ¾As·kjتõ‰©ÙIJÂÀ-@HÕ˜ÉÎ`C’pëçª8‘.ÿø±)!;¢g †¶Uè¢é]皉uVKYÂ5B9Å9»>œ\­ü€1yFH©¦”ëø}:4â6–åFŠPx~3ÄØôå¯yäohVB®m±ì ?ùÌû!Ì:pbGì÷.“Xó[]S EîkÑRJÝ·Ü€Ù•%Ø*¾)ºVt^GþªqIç}Ùº¦•ƒÈ›¡ ˜»c˜wCnË(,†i¯j<~“ÏÞ+/h<›Î¢Ñ<˜è1ØçFr!S1ôþBô —oûʺ±rW—§ªµ\ñ1ûvW½=/ÂÌŠ?ÿüåÊåÏ<˜Å’µ$#†!Ì âì¾²ÇyÿuñCù½ .Ï®Z1tùŸ‘$_ÈèËåGM ¡}/32r?„§ìõþ \6¹Ÿ ˜÷©G­ªOqo÷CÆ}Á1lüƺ T´·è Äö€N zh.KÂ3.WPL ÃÅ&àOÌzé,¯éí¼À§*LKÈDbM#&ÐF‚Š>¨ ¶yÄ1½æòhYÇŸ­\>zÿÀ”ï¤e£ek¬ÓМø*¼ýé2ÿò²ýþ²ÿŸŠ$ÜÊbÔc¸ž€ÝQá ï½4!.)NrÉ™ÎÔ‹Š<Œû× ‰ þWúgNz²pøŸ2¼†»ááÏ‹þe^ŸðŸIeÁôË÷¨î`£;‚ë£÷fȈ‹,­I[Ÿ¤ïT!ÈŽDYK1ÑË/g g`€ 4•¼4Ç©šÌ¢ì©Üo"wÌãŽY,ûð™÷Â*”dÖwå·ÿ“d…¡m 8›ø“»•ð§Ó³µ²«1êÖËà ,Œ\aMOµzå*9.´Ši©•åËÛËÆ­~!þÌô¿òÓÚ=jÅœ‚îR¹níµR½h«åšµ¯Tå‹«?Úp £Ñ.…bj¬ùËû_JÇ¿oßßZÏÞÏd¬1 dúc‚j“¤lôÞMeWiAar,½A׌nÈ b].LŒÃC§aÑðS.â(½¡9Š kØR€+øeYÌÁ›Å:–:„)ËF6Ø:÷BéâÓøÕÌÕô¤¾ùÓ)î©ÒFºS'Õ-Ð%!g±’ùXËöU ž9j­’CÛÎ+V†Á€x¹ºÌçêÏD-o­~šÅÙº!# µO+©½e©é«{•: K…½„z‚ˆÜײó7ªØŽ¡¢ðÄùÿ¼äî=•:ί¢1¡C’SíîÍÆ‰w"ò‡aòßÊ?.2¿›:ÿ@|þ1úÇÇèUºâÍɃ+£ðmû™ÐT(‘çÝoù*œæÞç¦Ïé®%°^G;“7v¶}¬æ¤÷¸®9£:˜ŽŒ0É¢Dâ³Êui» T"=+âvjZsÿíþùóV8o°…3¹û å±û·?þ[ýpôÏ*l™UVU8ÃGüZ¶66àßÖF³¹Žÿ®ol¯ý·\[߆ßáùz þo£¹ùokÍÍ&üã­}Ä9Ìý™äEyÞ¿½Í¢pÏo<2iÄ”þÈŸÉ/}&ƒV.†áˆÃnˆW£°Ì›á·ècOƒîÕ £”\0¿h0„%Ã󞮌 8 ¦òH‡a?˜Äl ž3–¶UïqmÖ…\’{fSë»zXàµfT½Mû„XEåH›d÷tY9‘…=gDÒ2²XUeæ…17v¶6w)Øã3*(ëŒEˆ[ºåª±,'kdŪFÐô Nb~sœycÌæ#éÜýj'«¾³&cŽ«Ý,ͽKÚ‡Á—"8G3#úötuaÜ3Ü.;X¯¢û9r¼—yë —ª½¥$¸ž¢CÆæÃ*+àá¾ùpdiÊA$öà¨Å$—Úë ‹H{\—uä8ý•wŠxT­Ô­\µÇÕ‹±61ª\/ Þo­m­¸¼š[@ ^îv7Ö6xíæ^áÌ0^9È#úêÑ©±7óáÅWQ'JðPKNhº¸“Ûb÷RÜÇRG+ ¦®PH}©†ójÅ5˜¢v—ú£Àf~˜gþ™gÜ·vªòÆ%„Páy Æ[øT¹³Ú­Ù8еyç{Kªôb§xk°EÅoÌ™ÑÔŸíí- Ãë°ˆºh^-œ½5ñ~ŽÛ7p]°öšÛø¸}p~tôJ<Ú^ÃGÚago‹?í=¿‰Sy¦÷¼&° ÐàGýd{kXé§÷ÖøÌL†¢w³á53ÓXããÆ&=¯}+ Èîaètì=SÊ}à-íÇÛtN8íù·\Kvoùñ€š|›…ydÝ¡]óôqýqŒ]‚o»y#™Naoò²4îÞÒÍÍMC¿Ä¹©b¹{KÜyÕeðp¦Iÿ׸„4û£ówðk­Í-ƒÿÛþo}{cýOþïø!$5‰âi%¯#½œjððIí/ËÝž'ë|EÞ“+üO”õ€”0òI­‡ARÙߣW¥Q¬ÇÆXòù¿Zÿû~ŒûOð^ýß ¢¼¹9÷þúÿ›kÛxÿ x›Ÿ`.¥Ÿÿã÷¿´ÿ놮lï‹ñ?löÖ†ƒÿ7[›Í?ñÿñs)ä®ÛÜ÷Y­Æ›äa^CóRgü¹®?Œ´8(y4˜Ýœ´g^ C"²~Ð¥â9\ËÈJ=dzWQ«HÜ/†É` ¢¼†ÅÊPìRcà‚€±'JQ÷0vùe…[ú|࣒A¤ÉU¥,ûŒCdᓚP±‹¬k³šG®4ùlàWQÒ›y¾ïõ¢>…çœò†Cn¿AEàQ4€ÁQ*›v9€‡È¤áy"ŽÓª#*ßxù0-í`’aàêØÖPšþs{~F³â˜üØO²1j¡3è•c8y!güh<ë` GÁ˜ú^Ò%á djf·Â¶)È<,¨cà‰¿4<È™¥Pç’ ‘ÉDz4wé®a*4/Ž®C?JVé_*ü•°Ÿ$æyð¼þr²"ŽÆqˆì äðçh·S+™ð®5jöɨñ>vÓLlnÄùóƒLm¶´?ë+¢j•× §Ìšzz4s Âhû°ÍöÆepùru8= $x‚e\øÒ#ÞxH·*¢h(YDaEf’k¸’úà?Ñ߉ag=·ÅEÚ.°<½ÙÐÿÆËé¡lL)·ÏòpÒKE;¯âG¶>ð›=^wøÉfÏϰáó•âYù9ñó „Înaãž@û:%kÀßf²KÞðœí.ƒÒ‡ñ—øZ,S¼§î:'c¸ðáÓãKë“„r¸Zý’ɨr:ÔVÀª°£àê(› u2ìá½±¶Ê± í³LlÔ=Úþ€<‡ç@E¾‡Ôš?“-â4½šˆ¢µübi,D#öXøo ®tM99×Ê´“q•E;sBVì_×/`($ñ6y°Ñ@Í$ë•#Ë[£?П$¬†µåAÒÆR鯚#­ÁŒ[EãN†}ça2ãá4º Á| dLeNÑëgéÈ[ãŠjL¿Ùà-¼ ‡ï Ú¼Ž²bÂûÇHŸ?ݰf 'ŠfwQ^%ø(zT ÕTñsr¶iTqQ—j¸(€÷…åj¥˜¹‚ÉCg* A„òUJ¡øA!3 ƒ€¢q„mÏÉ?'a<µ@x†ÉV§“…ב¢ærr4V§g÷èôÌè¤i$á&}.ØïODFH‹Ú!®b<5›±J˜xQS‚©îÝDZ&• l3UG؈Àx3¯¼szBXשtÈ•fÎÆ5J©R[“@à–:"î¹»ç3·§Dϼ°7.ØÄ®Û ¸<ƒ^†yªøò†LÔáW¬°&x=è$öØÆæ¬ÜÆü´~”[x…‰¹c @å,±£›‘û"˜üÝ" Áƒ¦I8oK… í‘ÑFhêEÛ Xž!k5‚£(ÜçøÐˆ§0OæKÉÉ»æÌÊ`9EœŠ©&ÆL>ô¢þ)Ý*¦&„eIgäJó ¬; æ2aUÝt’PJ)©Òn„0¯Ñ5Ä—Ö¦”¸Ìj>‘x@t’gÞO¤tæÇÌj~Èæ4/d=—ª›ƒäPù%†ªçE5(i³ÍRÔæ¸ÈÎ%' _ùèb4VÕó>¿p›ÿf)sx¥or ŸšÅÃö(Ö–O‰§¹|)gÑë ©jä/•Ô"ž=³Ñõö„o ¦Ëæç~ç­alÁ¤Ýsì´„Åü]ˆk*³¼s:}©û˜ß4ÙkøÛ:Ä×ì£æ4} m—M†qÅ™«è]êN‚‘ý!½¬ÅL¥CÝ “é“%˜Ž”È>+Ð×ÌbÿjÈí ÞfÔ‰§Ä«8ˆI]+Á7„æ „]±kMÂLë†3Aq ç ¢fÆi°^Áè/.ë¼þŽöFb"®öL““$Ö-ªd€t1Ì: †ï&˜æÞ0{Ô¶uBÜ~¢.Š„3Õ’© ÂÌb$iè`qµA^ž•Êna>J¯CÙ‹˜ñ9½Y,à+%+ñLŒ8ô”ìy‰+Xä_-ñ[¥Üã³efX ê+è2QXºse„^Mžü4þ€§,,÷·F»bŒKÇ¥B¿eIvc8¬pn8ùˆVz-îùxA׺י¢‚Y0Ã]TŒÉ³TŽNˆ¬÷àŒè¤ÒEý™Ëšü«uöó§dÿa=œŸÏt‡ý{scÓ±ÿl­ýiÿÿc~KGð ±×¾Pî 9ùO0j‡¬òE›Nd‰ 9QgHßÂõ„1TjY¸>@à²ÙúRìǪ½-5ZYÚ¼ 2äÓ9*>ìåÓ/tĤ%)Ðl2 ±a”dúÚ^ˆb^CSÒ^Šé“©D¼3kjr]°ù]ü*êËÇYzõXŠî·„cÒ,ŸÕ…ð\±ÈZ£4ý¨«¾%¨ªà †{T½rU4%€§y: k"_¢5Zí2%×ÑÏoõÕwÖžÔØl†”1“Ì‘“ðbLX.8O¬€ì Ó(Î@® •A D9×½cï&‚ƒ01ÌRRŠŠä ÞhQhãGE=nÑûsP‡'ŸÝJ_Õq2X¦}¿Ù€ßf·:!E(àö»_ƒ¹Â®Ë37Ä{æ2ÕŠh±5¡ BÚ±©$Ÿd &i¤w"!%Ú€Sü`˾¦çÂGT”t†yåhR‰úxJÂn€ÐÒY/a97¡…ë<1ùe<k¨¾‡Š¤x]ËÂÆE"Ù.ÊêXѺÎÞ–¼-umýƒQÐþ'ì˜ >\^±4©cB)M FGa¯åË,ÏíÌL.PJK¼x"á ˜yå]ôyù&H"ˆ«Çàp¾g6‚'–>ÁóàÃB@y9[Eà Ü툕Bl'rZ>ŽH:k #‘…ŸÿeÈ9´Œ'5i…4ÜTglj$þã'V ÉÏ~–Jd­¦êÃ;m•…CH½Ãœ,¤°S§}—½}ƒë ŠéPsmxˆ{(dV K+6ùG7jî´Ôêõ´¤z_FÛ‹½cŽ¢ƒ¦pÊûÔ{ õŒ”1Ù‡H_ôÙýUDaë,ÄKWS /L¦!$#2ü² фׅCß/Ïš6g•w&ލOò}âdò^À%R8 À[ŠÇ]짆8õIB¾‘Ћš"ÍÊD[2jÐ(„,”¡²!¬ÛÅMjL'4³¡ÔîR–ý1Cu…]¾¹ñ+Ïd"pП€ÇàC¯‰Iûô 4j‘Ûªk¢†ÄÓ¼&檾M†™Dk˜”öxhXŸäm럇ÔRÁß.Ë«ç}©náŠy×k ¡¼ƒ“HJ^P\ÂAX¨KU{ZXԪቘm½ùJKQœ Oíô5f4$÷`Œãö. NR÷·ÙtXì™è uî<° }…h­¹¾tÿj!ÁO…þ§&ÔŸQü±4@‹õ?­µí 7þck£ù§þçùQêŸÓ“ >¾‡}Ú¢·-¹Û^ò ¹I¥ zH v!ÌòOd"M7iv…h ͼ51*2ôìKèymÀ Ê¢üiŒ_…ú‚[ÁƒDC—2¯Á£'UlŸTjÿÄŸÃ5ä?kœ–£?) ó!*¥’AÝ ÿ9ÊQL…5Ë5Ò,ãL÷^w†}–Æ=kÔçßÓ,¢¶îªëžçŒuR‚g8©=Ëè-ç¶Ä„ îLÚ¬f˜:Ý…ö!lJH½ÐEIÀ粉ÔÛ°G-bã‚߬â«.­ÝÛGuïŒõógŠì%ªÄÓ»“Œ‰gòF޾²ÆæÍ$‘etÞ>û˜‰ÍD¦P€ù¨N,KÀâïMZ3^q·Š­÷äÖ }ˆ¹'GCº^³Å:ãxv0~ {`OÁÃ{|âœd0GHƒ £½äuPú¡'÷p“­$úÉÂGÏŽ~ùþâøÄô“Uµwr7bâºü%‘Æ/=±±ü׊´ýâ²Úň,Û~A ÈÍçÀpƒ «hñLµèÏiqp€/°E·k6±æ(Ïœ3ÉðŸ3šöeÓ~eSž¼gLÿKs!vãSÚÆœó–J¡×þ[v´ pf[ÏòØhÝg ¾×ø‹Lý ê §vF)Gk«mG”ngn¸ãä\jׯlG2< ˜It+øpTZ®:û Syæ±~V˜ät¿£¾^41ü +A/ǧÕ÷ ¢u6§õ³ÊÖý9­ñˆ¥Ö®Â¹+ê–T/ .‹ú°ÂˆzY_ë+]Ên™ì–Uv{6§[_vëWvÓëµ»ñŠ¿4×nÜ’Òý¨Þ qì­u|µ Ãyuø˜¹ör¿gÕýú¢cnG ªªÕ«Ž+êt3úì¯tg‚¡c;©føÍêÂÃCÀxV¯© ñÕ™˜¢É A†ëµ;«ü£T;6•Óqâpï±¼æ]ÞæŒÙê£J\eñš´G½ïë÷ýª÷Œo*èŽøþ ÿ«=èÔJõ=g†éQ_*MÕ¥<º¥;i—ðè–¥éWÒ^ˆZ„;â©u€–ÍãS§?Ü`õ.ÍÿÏ:n¸„.ަzŸ•§­Î¿áWÔÑ›;¨5„<†uþíC†³Î¿}Èò¤Öù·‡ñ 6îFyT{³³ Ø,´Þ™G™^o÷5ï Ô ¨ 9óìÍ^Œ÷–ú˜"þ‚ŒDÿXz²·ô¾¢ÿXj4Äï,­,ýÃD87 #TûZšj(‡þ™ÿƒ^1ÿPë´~QWîDœö[o)ŸŒ–þýÇÒ}—y'^]ʃ^O*‡©›£,@¶Ky>é<¬»‰z—òÑ$~Xw/å½èúÝWœÍ4òÒ’óÎ<Èò¥e“vÔcBéƒúÂÙ=Õ`¨{3EWî+•`žV‚Iî›9PdL” Ϩ4ƲÞNU0dá@8ß©¨Fý¸È ÅT”?XÅK1ôPÏ^ŸÞ¡†R:R¨>ñwè7wÔ÷ÔTÃr±àHŠˆäFH^„†¨(¤7˜pµj^JX†ç4MCCRÝÞ”ËÝúóºYbb¹Kó?'¥e£Ÿ!&âî˜R¢’UâÃ[s†¶°9²›+ôÆ)l¬$ -É™h6^ˆ†\TѦo+6~d‘†LxÑ„,a`Îå=—*ø{k²Yiš'OhùgµJ-?*¥Kª~aŽÖ>”ìžù(Ï(o‹,Hre›&³¶©ënüþ{¬Öc\åó£7çÇG÷¸Í|hx®x½/½ïs8ÚÛÈYÆ—+Ʊ‘gbY‹›ü)0ËOÍcÐ×}ûªUßèë<­—Oв!ŸŠ_eçÒs£»<ìËJŒ¦_dWë™>’r±,_Œêîsäî‹ï4÷Ę…­ ãß,Wnœ©Æ™Ñ¸_ݸ¯÷ƹ­•²Küj£1q2-LVÊä2‹3=ɼ a^„Ù\¨æ¬y½”Û?ý©3=û©£[qrËÔ8h€¼9ȯ­ ‰÷Æ~°85Ï¢4SÚøOÚ"½{Ø"eúhÍÅh·‘éI8­}|zvrüìøè\¢µ;¹9l‡ì-:eaž¿Á*ÂÂ…XÜjm—ÅÖ÷äb”öåÿØýÖ»d_ñ7ä ¥.9FehpϽåÞï½æ†©}>£ó/½ç3ßÿ£äÿó ²ÀÞÿÕÚX+åÿ[Ûü3ÿÿòƒù_9{CÄUbÆQ,N+¬‡Ù`/ŽþFå Ñ1Ìã $~…ÿBsü£vøÃñÞ_-CÛ'ø÷^£w­ÔÎÚöÃqÏŸ9{ýÎ9ûéñé=Z†WàŸ³6¼“ERÙFcÕÍK o%OþBcáÓ^'êÔþ‚ïD>Zx½õöû^iš5h o‘ì Ó®Ù`Åû @‚Ãá’=ê㟠Œ ³~Ë€Õ@ÿÏqœ'ùœà‚ ÊA ã¢ð[í/tÉ`ØoŸ`Ã=lF½Æ9v‚Gµ¿Àƹçz[kkž_xqX ’¤>ãœ'êù)õÂOcçÚ_Æy þò}]«‰Á‰UMRÞAJêÉÁQ—ÿ0½’åF" Ä_/a"aLó8-ø%§é ßâ ¹¶Óï‚dç²—ð@OÇü¾#þ=:a XJÿÁÏÑ÷UNFôÔtsã¼ù‘ü,ÔÌ7Z@×v{Ÿ~ýáäø Mq¬ÞñÉ™9eÛ]úº­Ñ£ qÓ®†QƲ¹ˆµAW¤)O±kŽ ÂK‘EIa.Œ=è¬åXû¡:¥™ŒN¢Œ™'^Ê«‹ó×ôÛ8K;ÀV™ÃI°ÈÞ h +0D;A÷ (ìOÁû3Í}rKÎ8ºPt´°¹á8HüžEŒ;êñVõ)Õ‹^ê`ÌðDÏgúíÝÎÏ{,@‰32¹ÅÁ–ž8qAÀSy¥â(‡®›¨Zƒ/8çô_jYíDɪ¼æ„C¾l“wðß8À;ÿþ;»ç~òŸý/müïÿÆõš.ýßþ“þÿA?Êÿ÷µq¢ŽÌ—ç“Q(ìã˜B€(]‡±¦á-³û~ C–dþÔbŘÌ#Æ$ÀSAú,p"¢Êðä\GW!ˆ…üL©L« –c\dè¾î`™ÜëÃîôc˜Z"sŸ^èè55gú"¦‡j›‰ÕtH’î\÷@p{“Xz‰YÀC Š8Dm9è^ÔpiÈÝç刪Ïb„0.ö}àÑ€f|%NˆsçV…“𠇬M†äø äºÙaNèÎIh °fw Ѝabmú]†U„z“£mÒÖ ™›W¤·¡×Qàu¡‹”-—‘$F8†S÷©cÌ03€Hä#r“•#0G€0ìOEÁq/˜0ÍŽ7&)Ô̆¼j1[Aнnë³CUz&prX`¡}#î%ÇЖA?r‡Øé*èNa]QYÔ:™Ÿ”‡5³Y['Dóèà¯êÆÓ€‹q˜éÓ0ƒý ¬ž§½pX©dÛ³0ƒCȰãChøš#²++ÂDËS„2úLDê„9éð‹ ÌJÞ.7h˜ƒ@2:W¦‹sÚÖòIwH²þBõR:ëi¶:NóBÿé!o’›`£2µ ÆN¢ÝÞš/K)¦§‚Íedf~ÐJ€-›,P¶äri+aÇý΀R¿×ßœ¹8oòÊ; œ±¬”]|”2²´O &J䱦A©â€˜—ùyï€n”ÂŽ’>¡ó‚ J àæ£¹yº*ú&ªXÌÚ8S¡y4®nÐ=˜d˜>žÖã¬M#Zf$Ñn”kîæp*o˜§Lõk}oŒ÷ä‹–Úï~˜Ù¼ü?BŽù(<ÆüßÖÚ¶ËÿmµÖ¶þäÿþˆ#þ룞SyÅŽ¨¤¡¤dœHR‚i;cõ0áMBá ‰N/J:Ô<lŒT¨æ5‘Hæ]Ø’êD$zî…} ¨Ý?Éy¸còÅtŒÁö4^ÁÉOÊß·¾Å¢Ô)÷+–ýÃ\ö”P aZÃìE\gœÒ„%,‰H¡t,ÂkLhv˜‚ Á‚Œ¨^|ÏŽt³lPeø°W·k<ê5躘/%Å„ºSQ¬án"0Ô‹%¯Ñ@öz\H Á,!üqX…ä/&Õãê—”‘Að±=tÐy DbÎÓÀä˜F†Á…,Äeæ§J¡$úLѵµ‘ŠØ´üw;[,³ôÃ=@!°pâ<#”øôõ£w˜CK¬H965hCÍ+ÍXÏGdHɯ(='~ƒx-œi¨¥k”;y½¸¼Þª{'ûON<Ñý$謘æîSî„L çœbÊOC9•4·ˆ¢^@ €ÎRIöB©þæ/⯙Ê8&òAä#ì‰Õp`òÔÃóïS ¤eb°umÞ¾T¬Ã Õ$Žp‘ÀÙ˜önÊÉ#r™:nJÓ¥b¸ˆ¨1wHcNo0¥hÀ‹¡‰0q8ÖOÎ(x&#£é?XÛÍHQÆ ºH«t†·ˆ—†1Eí·0Áʬ“NÝ¥ ˜±ÊàuÒ MœB¢—H‰" g0ç™[м§$ÉÃPæû E1 ™tB¦óå2ÀŠ*IUNæ˜6"#~1 «ö«\–&hì´n¶"óï @bÂ; ¢Tu–’Hfîê9y‹fYIaê&â2(aîR©±0a «”iYpBÐ)ËÍW2ñ Ož3B7Ȳ)Ó2RΪãˆ{£-A_•RH"˦Ï]%@„‚ê‹äW*žiÐI¢ºÎçåhu” ip$xpŽûÆ)$ÏbUf „×Í%ÒŠŠ”«W©•lžÃÊzI[†«\ Réd¡*ƒ5šÄE4Ž+ d®µ®¤‹Kʉ<>¤›ƒù +¬œ¨JɆƒá0¤ÄµX+¤ñ*á’¥H“AêJ¯õÚnò¿å§\ÿÑ5\þþoÜ!ÿonÃ3×þ³±ý§üÿGüèúæ¾³RðÂÁÙ¹g&Á5ÊQæ%…"Tb3R©‹!ЍÊÞ#‘ÊñhŒˆV¢’¯Îø¯#ò€qXp @!–Ã.§Ñª{/ÎÎöë^mÌuä`Yh?;;XùŠò£’<a>}$pB“Gcií ÂÚ=`X‰¾0G 8i«—üH@Ùo…Bø…ƒ‰}Fójºº$ë8DÂäPTñ3ôÐä=H|%s³2‘™~RLò;»}ß…ÿ›ÁÜÐÖ®\K¤fæ o_1ðk——¢¡rã£hvûܹ͵µ˘D,ù óÉ80ά,Át.ݰH“ËËû xq|bvpúý}'s ÂÌî­?ßA|ßâõóã‡@ãœQì1_Þ{§igê,BCÔƒZÉíUŒà©;ˆ.4ÉΘJõéqn2QºŒÙs2Çy„ÒåK•TÞódÀ:)Y‡€N(#Ý¡ ì¹”ümññ‰šÌÜô¶2;íᓟ1¥çƒÇ_4¢Kà‘JQ" ˜óß.É¡+3~ˆ®EÜÞÙ\ú?’]uþÒ$—“I4êÒ›Þ4 Fð{wHo(á3GP‘É9kì¦c2;Ø 8>éçöüÐ\ÈALêŒzÆÒôd*Idɰz®ig1'2úölfK¢ó£òh‰ç¢ccÚX@ó‹â¦*Q$”0!TÎë'¬sC5剤ÀAWEˆ‹–ö쪡é rERÌ4)F!3NG¦4‡Ñ£LKþuär#S‚‡¡å‘W™ÜQʱ×ÅT³=Î"lxȉ”„h§SÖ²ž˜å^²íÊÓ¥Vv»Ô`0kliU‚Þ[6r‚ ¨ø51ˆHÞDé‰û¸v‘vóF¯JB@¯Ý9DŒVÅ5HR©V“ÓÄsÎu+r¸„!×ÉÒ”ù/t„ætúöF„2%Å0 ÆB.E߇d@(¢xxò„àæ™¾cH #1Œ¡/IäébQ:Q>{ò:A§+QÅ×ÙC%ÈàŠ@aJÙ† =Q­P«°h%Œú"ÐJŸ„?Rù+…¸Æ0í.*Ì*´ ¥°.u·tå¨é9Z—(i±L¾+·èßïÀ;ðIåD,¥ƒâ¿h/¯&ËBJ\º»œE»Äð5—oM¤¥¢9yq–¢I")V‹"´¹¶{˜R¥|+¯½U©9â„ñ7¹g^õ˜0I)áh½ ™“ꌺZQ íÓÑHèy‚dZ"tŠ4Sºa®yl4&šU‘O¼.óü ‚ö¤’¢©Æ`$…\èç¨'±L2˜“Ú:¦ — ¸Õ<rFÖ_>ùtºò|Âé¸ kÅ Ë~ÿX§³.&2èÂ$úa1¥»ªÝi­ž$Ù=`!¯( ¦²Er©òØèXl•ŽŒ²#\a€Àes) ö(ŽÏ—ÿ„êG1îÿÖ6·Ö\ûïÖöŸþÈOYþÃz&5Ï ; ò”KªüžÇ‹Tèùˆ ùåãWçÇû+F“çaŠÎ; ïUˆÕK¼eÌ/A; Ç}³Ÿô2 Ã胄UYÜׇП×@—aÌWG+Š£Ö3uƒÝÎØú4[賸"ñNÂ ÜÆåW?Zß|bL®wFðîûî~–#z…{ù<òAz³òQ|4>åÏÿF'ê|´o,¼ÿ­ÍÖv«éÆÿ¬ÿyÿÿ˜ŸNš^ÝÃI½VDEî-)•ÂAªUÇKõZ0)†i¶·´ßðö‡iÝ;Gïb)ü®á}Ç@œ–ê^m<éÄfpƒÆÀ”äiâ¿Ò‡S|; ƒl¯¹»³Qæâ[è²émÐ ÔÎCYªä”^*7®ý^à1û¡ð S3¡‡É™Ÿ|Õ>^==>ñÛ‡~s§¹¹ïÃ×Ö¡‘üò:}¹1øiïmŒ`â'z/NÌ•þ¶oh…ðÇ+n°¤fz‚®l [Âú+ÀR¶žrƒ^ì0··´³íï´šðuóQAl?Â=KPS ñB ˜­b¸·tŠzÛ´*‡ !N2¿XWOþ&Oi‡ßᥞø>Jsh¤Lu¡^nðþ((hó6`ƒ½%jdaÆS1A^¬ž,]„ùuOFá^³µ…{ŽŠ°½¥æÎºï·Ö7©în”§ BÛ¯°ƒ TÎ÷¢ñÛ Ù„ö ê2TOI›†³?¦ÊGéꉷïµ'Ù52½õZ.Ðõ‰ݰX£g_QApxU^¥'—¹µ¶fí6fЃ ú?„Y Ì7­Ÿ¦”OGÔßÝÔ+>‚瘩¸î½nüF­äI;K&a饷±3:ü°ë(6mOd!#ìgÃ^q)5ÞÒ6³ä&8^L;Y$ßxÇÇÁîîî½A°i ƒîÙqMr½|Øä§(Ãó]ã·|«Wü„Úî3y‚¬ LËX:É\ÏšÒÃÅ f¸}üüìdÿÕí®#°$&ÁøÅ*Ôáªq¨“6J ÀgÄÝûn’„{ì®;+Ë2 {7²Žò..ËäâžùpŒäe<¥‚N²Ä`–4»IS.vò¶ÇÓ°8Eã Ö¶üÀ7PÀ3båÈ6Ñ]=:zŽ ¼Ú!¢ÏÓ¨‹FIª»„þæ´ù&yë¾”„„Üzõß­ÛXÛX¾ô÷a5Eb^hX§ògø6€ý£FÆÁÖžëGïÆ$@ E úhÆäp¦&ÏÒ“W;Eÿ˜î!F("^Çx0…)™ Û?8õ.ÐÆt•¬ê0RQ÷EøfS!í¦Æq›Û¾¿µe"ã]ûH(˜dä%?"§ßÈ‘^Ãã9»O&ý᧬DÉ\ qï6ë`À¡v¯Û`#·à›ÛÞ¤Nõú±öÂp ÄŸ›º øúë(iüöúñS`³ø /ƒb˜M‡à CÜž‚>+ Ì3}1k¯=&ñ5@]* È#c¹}Ö>]±B)žÔ$Sã£&!GÕÃ3 YdÑaáRæ1:ªEI1¿…n”bƒwhÃ-O…SÜè#ÑÀ Á‰w$ýBáR³¬¯`Râ,ûA©©þ9 kîIÀÏüL_–¹ÇâöøSœœ¿ö[­nYË&ùtwÃBÙŠ.Ó'ÿ&˜¢Xh@uí¨\ æ€ðc ûVP2"áþÆjÉ£­Q[é:&ïâQ ƒi÷³¹‹<ÈÆÆ|®…0é•ÁÄŸ‰‡rËàÑk¬1©¯+<+ü&Àè½"Ô‹Ëcy¨Ôž“' 99+FÏŠ±[€©î‹¨4iÖË_oîúþúÆî|n±OäÛ^<=2E x}ô»bÏðXŸBÚ4qJ‰È7'BƒZ 8s.6–ÜF®÷réÀ__[Þ^A®žW´±½ãû»k抚.Ï‹j«Jóp<,­LÌ÷§ª}Ýi)ÖõY—‹ÅaÙ~gôĉßrñÄ‹32ó•p%‰Xƒ §þÛîTšlïêyxŽï$sð7Y²²‰r_?NÈGIhri_&QO!Ó|ýí«³™@TճŤ7 ïEƒªQ¨[$¦Œ¶m6{ [X‚‰Ã‚üJhA_¥É$‰Èáè0/Òz:7é,öÿ"9¸5úÜ´Öaâ‚Z¯ë³³Õ„³³µ­e©·“XmÐöÖ‚n?`0e_s)Æri¡í¾@bï¡Z­¹¶öñþ©g,·Ýâö*WØÜ‚¶¶ô áÜëÚWw]P'ƒ¡Å¯>§ç4¹7ÀÂkÉ ´ƒ+àU½TQ0ØÐ1ÆjÅÂýêå ‰ wúÃpÀÆF}¥dižc..ži\8̨¢…Húë9v|öIz“€(‰ðuõŽ'î!A•,¨Ü@ÿŒ_IÎÅŠ·ø¨œ§)S77a‡›­æ†¡ønOK΄SÔéÀwýÑ‘5Æt*. `Â/%>m4\4g²€Õü¹ÉkÝ!ž!`€§y4ÉݯP7«‡µ[Üö–-‚ð‘¶‹TرÕÉ^rÔ[¸ÍnœÉØ#º­mÑò9­S@ YX d"nT’‘ÓôžÔ®ö‹´5YR–ÚôVÓTøL :²Y¯¡á &@Ü(Ç\š'EQJ~§Ð’KÓ¢ 2G.\*SÅŽ’ý—Ò0z'Þí%FõÞSÆ®Í;ãµ¹RE}æ¡@ÝXrïöÏç}mÝ{c]¤«Ö…bò ÓɃ£oÝuT¬Ùg¶!Yä7iv•S )1Ûë±´ Š‹Ë§BlîÒ¼M,©A¢÷a¾z…@“)3x'‘A`¾K;%²r¢é¥àý¸»¡qf ™H…ãŹÿýñ÷‡mÿÜßÙõ¡3eq/¶ýâyú4ÊÕÅ[B9wÉxþ»­{­À˜}¦@Ù%Üè|¯@ðd]s5®$ÀMÍ¥ãF.Ð&iiØ·¹D~¤wg!p§,9ý>1æŽ)ºÐ¬È‘ãú!ÊQ±ò §¼!¡Ã¬^!»Uš¦êp*›b €¹Lû0L‰›úD-æý…xe‘<ƒ`§ytFV¦‚’XÜ>;’-m.¯¯˜èÛÖŸa  ù‹yÕ@Žh{Þð^O˜²ŸÉgG„_®ÔX|â½—Ñ4…ÛÔ±µ :êÈÀŸi,u¯ÀÒ‘ED{ÿuö‹'«fBò/r¤]¡cÜ¢T¿ÔŒÄŽÅäè©GW³õúô´vQc±£q×¶C6ÄÉé i¶iÉ%/ƒ–“DÆ…?çz·6ïÖi¡ÕüpÒ>vNÇñêÜsºÁ"¡)œ·`„vƒ°:ûežAÑÆq0í¥†hñMpD±’'ºÃ°É•Øû§ß€–Ÿ›Vµg'Þ t˜í)·… ã®ïÓl¬¶5èìï®û;eú&¤ó:õqêíÇEZ÷ö+/­ËV«;# ø'¡¦WÜ@©¬61ÏR•*Ïš·þgQ¾yÌuÖ…S¡­ÕÞ7 ]«´($­Ì¥Y%vNkžàNÂÅÜjÎW‘ÆÑÄC8Ñ=“ úí$šhÃÖ_W2BûvZRC‰’À‰bµÜ'ÙõjGÚÕÑ1â:DKk–ñBêlò{zÖ6¼ÕvHGµ«WòZ„ª+K$ 9eˆÔ¦J^Ü\£$s܈/öÚAØy˜Uò†Y϶æ+ò‘þþM@Á¦Tùw„ ¼“ÒÇÙÇàx6Iz]3¶M"¦‹¯ÌR,,*Áj%O»½üÇÚFù˜’™¸0ñÇÄDŸûªñÛ+Ä8 =wq&"ÐG“DyÓÝÆØnøñ4¼_’ËYBp.•h‚m-›7Å)ü³?€ -¡º;ÎñfgËo6ïi.Âw ÿý ☺wñ·’R‰,MØÏƒì*ÈÊó&0ü€z1|oòd.s Ç™Öq¸*Ø}_¢Ó8g[@'½ŽÚC”xz†gˆ¤\Õ‡X, ¨¦æœ<ÅëiÇÏ‚‰ã§g\§…6{Îefͱ§C™ŸöÐãn‘»‚¦µ Lâ~B®ƒ›LG$°tÕŠù?r3b}bµÍV滆S^Ÿd\K£yGO,s¢¡¶z⽈0`Púk@î×QxÃÒ2Rá1Ë ›W#•Ш8às6M{©ãµ”MòÐ&à÷‚J:HÉóP8š” Ul܇©Œ-ñ¼]ƒiÆ6Î.ÔØ!é,_‘ çÓp\G°MßçÒ€1xGÀpŒ(bâÿ»=ˆþë÷{Iÿ©]dVËþ’•ï굫pº·D¿ëþ€P•3@$ǾÂ6ƒõ&ªÃ«RrÖ2Šîª/Ê l`ˆon0Ì$SÄÛ»ºõrŽûþDDãMßßµ$[Mx‹~d  ì€xdoM¾^ÊáÝ)Çæ Ðãcñ0² UÀ •c€'h9.—„LEáZêäîƒÔkì¹½©)^–ÐjmÚÜÎùʼnžð³†÷]0L‚(ÎÖh>8M “d›#­”s5"{¾c m+D@´¶-äeQóƒD­¥ö‘ßl-ï);»k°+(pU˜Üw¶Ü…¶´Ò}‘йîלVã´éÈñª-/st1ŠÜëöA¾7ë[Ë;.ŒãaåÖ[NBêë$¤ ,£"×*|ñ§)Üä }?¦˾±o/÷S®¯YZi"^~qnÝ7€ÅC•wÑÎtÁ92¶ ̃{D0ae§ý³w!vïµêŽ’žærð׿ZsA;è–±óå¿þuÞ·TÇnQè–ÀDÉX_¶Û ÓMä¡õ}ή‡¶ ”VŠ zÌR½e‹%Š¥¶(Ç›@ÚÛÝ´(, c˜ø£0R&ȧ„–h …<(3õÎNé½äEp·vw陫d2×SZ‡§ô|ò)çŠtR¹“#¦¶=¤©U~GèT«”^âÙI’°7•øõ,EÂÙ¸'˜Š%õ¬¥V »&¡;×ËŠé`‚9™VþT*ç–¸ªD|ÛÛ€øvfž­³°–Û%$mPOÙc‚Ë#mÎÛ"¥Ñb ¯z Û¯q4lûóyŠn%K2újz5 YS„ù0bAôb³v ¼D |t­4VŽFq œÖªs6É¡€f°ÃàÆ„Â9¥m&:CI Q¿úHÈ­¬ PxÍ H죶§ óãdk1k‹0"lÒ_åm›ëÚÙ¦}ÇÝtÛx˜"cXž¹R |a4!l--ÏEY¡Ø›ž/æòÈàíõjéÕÊL[—i,¨EôYO~k×\ßæö–ïoî¬ÙüÁÖæKh®ËRïŽl9Æ!IÕñ!f«€uaEƒ®×óIº’µ¨ÙÞô*VÑ<é@èÑs%ŠX±#zpÜHÍéw$.œ„¤Ä rr¨GI’¦Sïe8°îGš¤¤uî4øÑåÖoïšðÜ´ŽúÎ6²ŒŽïTL“ó·×µ=áDåFÕúIÞÌ)„G%×Ì'·”_'¥Ô&ÂØcû|éPI “Ý¡?©oÚݨ¡ÉwS‡¬mkÝëæÆ†¿¹á,`@àö·¶LRdîÄ’AÆžr‰!b;@æÄJAÒh+ýÐö“½ÂB†«š*e—lüGÓŠP˜äˆ'"}Ø6 âÕÜÜBts§i¯ “M’Ô›‚táç©¿³fº6„·òð|‡$Ùi§šCpŽ®#£U„â} g÷Ò_ÅBãLó4kZ8YC᤹U²%¾ÅýÀ’lnZK3^W"LÂÎzÁBG QÝK¸Y‡h{Ô!:=#DGŠ„m§é·¶]¹ò0jÛýpö bsC+±ƒãª:é_âÖßY7µÒ¸ÈçøÚp…t5¼ûèq ó:íªnÊÈÕ 8ƒ!Hwo1‰žVúºšZTI–Ð!fÚ{{ɸh[È’³ãò;ÆApo‘EéÄŸ¢WÍúY^ägf#áVæý¨ÚVn1¥9»b3 b4DáF Ý#ÆjGŸÊ]cµÜðÆšðgWÌ0»‚S3õQïoš›0®9¼§Gf¥#¯Ô¶gKÕΙh™uÀ yÞ0€½áhláÂNâ_­ü-mzdŽÒxZ¤cé•aúHÅëí3À]°äd1®ê‚•A¤ Ï÷åÒm0+0SF7x5ùËóµxÓ™­R±d¦Q:5ÝÁý—ßLä $±Mm$w 7 —šª!‹%wÜ댣ò}’¡Ui“½G0=©wo(?pSCû yC%žTy¬)ƒ’¢–é®å8ûKRt•LòbwÇ Þ’DFú`¿Ä&•8`MÅÒ9|^¬Q± ‚»ƒ«M:ìgÈÿ } Wd “`@Ú‘×yÀìBš4‹úE˜x¿N2ëXœ‡†E×½WYÃk­™jBV]'g–öÓîúT4P³áÞžPR,iÏoéi^¡"¨>Љ}J• mRÜ‹š”R˜3u"üƒQ]×·jøÂÜsa»¦~¶Ù3\éïo¬ Ø ˆs÷ìå Y$Í + Œdª¥‡”kN­~&‡ÕiÊù6íȆYP3† -&Þ½P¯%¾+M݆ÒÔUÓ±f˜ÞœW/Y©)¼~•2j(X)æÐÇæ®íkÒ0°@^´¤·m»Z³Ç¡ðo³ô?Àüé¥<òÆj´ÖF‰Æ˜×Ù*Ãj­ÀÖ ””„x“X^³…Ð jÛRbîæº£UN¶šÖz.¨æ|1± ¾žÛzU–…$7ƒa6×"ü+èR ³C»–&¨iiº6š¾¿³á\(Qž2œ”ôn" ¦®÷Gÿ¢!ò’yÃûÄ<#ø˜E¸7X·ß·–úuspŸ~‘8ä©üù )]“ÀÖÎ’^(­[7U|ë–6oÃa˺…´Æóî¸#†üD ÿÜÈv5±ª¾S„AnOÎfôVt‘fÝ_M¹ìx„¹E^j,ZCÉRT늒ÛK®“ñ볓ý¶!Ln™¾–Êò¯9øæÙN(ûR.‚¸%#+«g„©†BìúŽDc g*ød—‡íM™ëЦK¹z2• Áæà¯Íõ­Jˆ“ÓDx{§¾b…˜e€ î€<˜åí›{ ψžT³¥Hšþ®‡üË÷’$-Œöû\›#|‡©u¨ø¸1‹Š—´œ‘`_€ˆ¤YYt£O3¬íÑÇ/Áøñ”ˆIyuâ†á$#Õ'JRèöyísÏ{ì•Òá$m-ÚõGE]?¼»ÿ& ùBsdžޱ? º€E0ø"Žâñ.п\Hò¶=+à eëöôdÆ)[fáwûÝŒŒÔ0“¿ìËóôÒ߾šà:"~øúÿÄï`—§&£z1Œ2ÊóXò'â86è 6¯¾°hбã“k9êEÉ·ˆ jY.Þœ-ˆ¼Q~ÅhzÿØaìpŠ8‡–4°ìò—ùôà©iò|‹Ë¸íŽsŸ!¹Ûªý¥.0Î-A ŽØñMcÏÑWÛâïŒanuî‘ Ø#àÒDq›¿ÔµX}«£Q‚m°ˆm‹Üb, þ…Çxïö¸ýô•·æo¶šþFskwÓßži@@ÅiÞ§5â#[¼wó›2r ÀØ…õomh/¸5W|{ "ô•9úç$"WAX[†iÔ •wQÑÜFùÎʱfG:D=νµõ­Õµ- aQz!“H‰9žaç8—µ&©Æ•Á¤ö´Œ´HhtMˆ8B,6°o ÖÒߣÄRsCn™â ‡Iõz÷&)Ò$J'ó-¹:Ì›î0íyZr$`°Û¯Of Àš»ï8ë?ÀÑ(Q |›u¡®Ê#¸ ¹=¥Hi @Ï¡[Á•Ü^`LŠwÆÃ`4«XŒ}ž…%¢rÖõÂh÷í¥™‡  ØhâÎñ;R‡dÁ …(éÀïçp6D€\i†íŸý °a[sFB B3ºH©–…='ùH,{3°@ZÜŒ¹bŽ‘„€ø&ŒãªUÂZö”6õ”^Ù³Y”™‹ÎÀœÔ\¯ÎÜÄ\î¼1üÝH8…ŠsÊ]À‚T^ÖRD:/F Ó‘ƒ«2ò¬‹(ä«hE¼_¤/¹==¾˜yvP‚…µÎL u…ÌÖ÷yƒ’€ (Ò^Á›§YzS‰3tèùÜYÓšúX©çž z†”ùŽ´ÅÖ¬o0ɧ—K·é ·ÊûäŒQ9KÓ#KÌ2Cw–ê œ‡X¤†´nª+)5•G©Ð®óqrÏÈ‹û»ÀUø.k<œæ‹Sô‚Ò Ñõž£é²;‰'XÂÂ;F£Wƒw,SàQÓÎÖ¼Îèڅȯ ŠŠ™ÅyxIx¾à—ZAç¶^‰6ª1±$p6­º“R|.Úàm´•~îÄŸaÂá”WÆ)h©£Ào³ëÍ(ý}($èGÂNæ2 ²øè>¿uçǼàà  äºX§¨vJ‹°bf®/á:<´‡Q>.Á ¾œÀ QôÞp´fø|2%Æ¥CèZ}*%÷RIŽÖÌ04ïëç`(7ŒÆbTŽuE÷HHáñ SÂðŒÒ¬ÅݰãhÀkÒ0ígþþÙqõ8Z5KÓ~îcÕ œÑ&]ø¶DSà ñ¼†u<²@PUúû$è§" ÙY0‰½‹` Ìïáv ìšT1bÀ£Ný<¥jÉ̔ɀ2Âw•‹¾…W1¦!ĪMRl¦ìBÇÝÉ’‡Þ›ƒc/¿€½I1*4E_Uqt@K3ÄÔLê½;³ç—oÃõÅ$,$sx§ÅUTu îÏN×) Žßp°ÓQ,”X_gzPB¢¡V dw„.ÓEåñÜï½pD¢Ù+p¦Èþh ¦Ïΰ ÂnÓž˜$Bt7çi’*Í•.€‘#œkûp§9:ïdafë¸ ³_…>ŸÕz‡ð,š¿ŠGˆw#4ø oÒ*Æäh¸ˆ¢v¿5ŸÁÇl§¯¿?ÙŸù-w¯¢«8˜ä(õÃßEþÂwªåçSçÞ>•õÔ¨¥3Ζòò”< sÿ<9hñä’¾”ÜÇ%|˜NqãE: “ ŠÑ¢_œ—D¿ñœž £Ëà^×Fy7kýNI¸»Lo÷g€ ßDW@ù‰­çQp“™ë«©Tϳ6¡øÈÛÓýƒ%~ËxOÓé•(GÁS¡¦[)Ã!¼µšjOr|–bºÄ*Ä|o‚Æ/ŸËØÛ+@‹Š\u o[rPMúêóò<-Š~†ÞÝ?¤X&éwám®_XÑä  KäVkNEÆ)³I£+0£i:UÊ;ƒ#ÑÅ£ ¬!ÁÈ»ç¢MÜBDÜïO\ Ôø¤š9u§F¾D„;®æé牉<«Ç Ù‘€JõŠUg%ÂL§dmªtNÇ¡æ£z¦÷×z|s>ŃéD­¹oÓk¾Jÿy„8»–¬˜¡œØ}žÂ©€gTTêä´e!ß)óôú.ü4cf³ÆŒQ•\ üE…"vÁÆ«;Á ÔnI«^¨„Äϯ†yw)PîŽùbä;¾Û³~ò<ÍW÷~â ›2ry…fà˜Ò^5YhÞóàÉU‘ ye>ôÍ0¥§QXÀþ>³Ç¹8(¨J€5ÅiézŠTÌêõãó0Šc¢Âû°®.–¯ÖãÈlެcŒ¾=Å[Ìòݦ|3½Ád0ÏÔìhD÷{ÀÇ©¼DðuaO{¥y>àìŠrZ¹8O矃óìY»î¸“ÕúC;¥õþ±ýüôÄ>š‘q€]-ÔŽ £Ý­âEù£èWŠ;Ê®&cEãJˆJxI<ͦpMK’Èð_bttêÁ\±’u‘¤~~¿×™Äq0ô¾ÿÕ»º'üJ¾ З÷ ŽúʨÛ€¼ç°wä+à’BÓ·©|´Tä ¼¶Øv’ö€øäU A¼YOÃäm”iõ`B*¿¯EÈäNÐEqŽaE:/!šc[y:œt¿nP‡Ë!ÏÆ\²±£C?KolÙ_¸@žŸTðyÀ?ÓtTyÖ‚4 FH^EPä‚ûøšâðü×XŽþwÝO¼0 ÈÙï¥Iteð¥§AôðËj˜Ñw4-ãb#ëYS«§•ÿréÀÇG†Öˆý!År~Œ.HÇÝ ]Vè„ý>šßI. oñö†ƒ±»°&\×h[(6.° {$2ˆ®Ÿ{›Zï\ÚwÑýŠš<³|ǧØ4™,rÙØjòÃXÌ0lÜ«ˆ¼ˆ˜c\E÷C<ýî%¾Îc¡®Ô©Î4y«&éMÇè›Ç–ÁDèq£l£+²®à~²ínI¶Å$—qà»6Û±Ù½«&zë¨k)¬.38&;÷4É„ ö±‘ùl«1Œ9õ^gÏw¥]é‰÷t_±Þ÷=LÐäÃC.GíÙ^&™—VÊVe&¿CI,¡e§Ý<߫ғ-Æ;ªœ$Ñ» ú~ï3PQæw‹ä),ÕÌÿyÚ‚¨^u jÉ kI÷(®òÊz×X±Ú–]ÕÛµ:«²YQå}´›žìSç’!4€æD"jç0ü-ÌÒwº\‚u?À·X]…_ ¢·®sPÄNåVrµSˆÞ&Ýa†ò=f&ŸVNi!¬wJç÷Å볓’¡O€ÔPØYØôÅäÐQ“Ñ¿Uv:àï –´Ø´çô]Z®„xÿ/ÐßÊ•{³†³ýÃC‰,]UEâÕׯÎX·¾¹ n`—E ±ag2¨;³p² ±ÌÙÑÙi =VeÓs›ªTõŠœ ÷xs‡AjŠÆ“xžƒÈxѹØàbÁý5]k˜êÀ}¾‹}GO›çiÜð#ƒù:O;Šz~ôKíͽՔöÇÏ]ñy_ešïò@î,(ìsÊw‡¨:`¹@¯J–wk‡“»2äÿ·ü\ˆosõ;,äý'RÒ+ÔsÓÊ1z7À_ÙͺÉ*ÙÖ?'a6•¹¬x!æ?ñ­YÞ ÍŠÝÅ—„鯆Ԏ‡è:-‚ËŸ³íîn…k©h”½*äu…0¸ÿæjí9ŠbjÄ_Rï2=™y·û3ï0íNHA,ñ(Z^V­ÿ`–öäP»½˜ŒhpF—ûðF°'ôèÄ}¼Uî|IÛ­m£ €rT–:¬i²yÁ? ZÙ‹ðE›’ä8×5g®oZ¦æVîä¾uü7OdÍ/ó(dÇz:Þ ó^ž µY²0Æ’c¦6„u $”ÀÒÏqzAö•†×ÚYŒª®Ìç*6R‘†²‰2Ÿ[r¤Òíx'Q' *Í“P~  IƒÝqa[Ûîkxâ-zEÎÜMû>ÁöEíLoüQiª[Û÷Y5Ä>d•gËÙ³Ÿ“ÒÚèV˜`1« e–È,uÌïö$|&,{£cE·© 3¼CçÔ@â²@/w˜ÌW åùE †s@·Hø†Ñ"Í‚å¿LežIëfH*Y©°œÃï†"bÕ7°„³áSõ2™H§/mÖ½ïÀ1ÌR BÀã³3éM½×}‡ÍÑå<•¿–“û¶.ÅJ"uï; 1ÏE7¢Ì tê.ÜÃã¡lüûCÏwÓœ´ÔÓ›hóã“"•üÏÂHÇ’Wl§„\­¾¿¿xc`I2ÄUÂð(åYE·.­t™á¤sQ¡‡ˆŽ[²íIA/"„ê!ɳà4rVÙ˜¹-+ã<€JøJåÎ7KÐXõ£¥ËŒëvâî7T »mHaǪ,—ÍðBd\)Á¬YZhsß„A?"‹É%EoEy¸’,“ç¶ÂúÝ’ b~Ð>s‘mc¿qn&Ü´ÜmEÂMLÑFIH~,k¥ƒ¯uí¸üzŽƒƒ¶3-`ÈN£8)Qí}¯+‚R8û®5E“®ÜC¯zMiã¥édd'b©s;AUÅMÖT]1ë–Ѫ½—Òp˺,‚ïtæú< ,LW—&IX8³|Ç ‘ñÃarLhŒP“àשìŒ39v;8f$øüß*àè(õ¸ËUý.nñ±4­Áø%"ÎÜŸ©ÔÌ(>Deœ¹ÈóâÞÌ¥‰¾±:±»»!Š)¨ JP¸ta”dQ×¥ÖØÙÃ4e~ûÄêrHvwLÎñ Õ!ê4€Ã×TdSË{c7”έiyæíÅ|‰>§¡=7âb¤Ða%uåÉ%Õiq­IýÇü=¬F­d®ÊºÎw­\¥ÀQ«âfþ§YÀ9Мτþ6¸Ó0IeœMFëW¤Séæ‹ôЙ 9„—[äñáÊI4 LóRü&̆žA§¹==ˆÆ¤†iŽ9ÙâíÇš·ï–ìÉ•Êù%{ÂÕ¼ûCü"ï‹é]ÏGV œžø½Cyžv0 q„Õõ0`/é /Kf³‹.k*°ëaØG9]xº9))*0ö™ëʽææìl w‹’˰ál)µQœÀBNšWT¦ÿ!Ž~ó$è ùSzߑޫ^z Aoo¤8ut,O:“l0´“wêU)æ)¢óW­åR \–ŽÚþÉ3L ºå‹Ü¬Â4|”`ŽcÛ‘OWÒ3¥ÚÄpp G:㲡µ7p~;W„|Õnÿ§ã5ó*MŒÉ!®ZFùƒ§çÌŸ É#¸“e'ñ?zÊÈ@ûÀÇºŽ´:¦ä%Ìr€mJ“®KÃM“nKëžþá¡sˆ[40‰ïÿÕgƒ{øgÇNæ1¼Y=>sM>ÌLKز¸‰#À<™Dƒ’sù™†wñ6 $“éšõ/.¿¸ð(½Â*a†‰Ê8+Q UxZ¢B+tÔ0CvÀáhrSCÌê^€ZÅU=22| ¼\ìÜuw9ËVRì3íÊô ŸÎ«zc)HéÿFñ½¿ËéJeK+nÒ›À!1Ò;L¥y—|R*,TÄ|ôX2 fœE¦<±Ç õßSdÕ°2ð¨˜ÅÕMçh¤$옧5‡O8vWš[™+-#œî»Ile„[·3ÂÙ2ê;II'<ü§µú7ëG)à"QÆ&±Ð6u˜ˆ¼úâØçO¼gQ–þAä¹÷C£”’ÚN0grx(œl÷Lg£ªŽˆÌ$·Ýô7da™}nÃ„ÏÆ=áÜ¢‡ï,!`¸RKã¾^Æ‘ˆ÷GsKxf¹±c”[¸ä¼a†gà$|Gºv]­²?D»˜!kí#€®vì÷¢``é™ÀqyØö!šŽ:iu½§Ð7 ˈÏÂçk‘ü)]ÿ0ìFTÐé>„‘°2"ɨpË`¨ºµ&HZ»ëþzsÇIkãþ·J…XỂâf)èß„ÊE4J‹áÝüŸÊB¾ä,‡ùý"*™¼ ¼¤…sý.`hZ(m©ã÷”5rn™2;“÷y{ßåü)«Ù9pÑy!£1ŸJ¤²Dî÷â°lÙ÷F!ŒÑ£Ÿv°ä îBO$AGÐ@¥ôäéu1I¢~ºÙ´H…~°!ìû:qãÜÚBU´}žÏÇöޱµð¤Õ´ESOÁ«Œ/&V¹Æš`®&þm:Trcyê®*ÛºièD•Žü`ž2ñ’`H )û6T0µ†ú¬šäŽÓ- ¬4ðè@M“`TÊeY>NK×÷®nI ¨›.ذA½±Ûô7›[÷öþÁ=€ ²K”@þ<ê^9P”õ  ÁX*ØQ·ý¨‡8ÆJ VgÖ¾þtQä¦}*'IèÀidžÓÖbôk‚äå©kÙr#°å¬£Þžr§‰À²ÉcÈ0¯%*×Tò ³`WÝÏvÿI¨ÖJÎ8Ž™ ç8hª «›•±‘>'=Lv jU™$ jOO],Ïú9)Ÿ¦ÓPå1Ç, ~ï4MK†Â}À#rÀ˜‹Â­ó’/80Û‹ïUkÍAak‹Œg-ý¨T¸ãºê÷ILù ¯Ý…&ž‘¸šnÐ@ š“1#÷„T"UšôõÙIÉød#†& áæööýÃI4‡Î’Ž0€Ò£7Îz$E܉¥˜YªÒkš» ÓÓVå2p]TÌXïäÕA»$)Û‹mmoø­{˜à¡ë8œ5ßÇÉF' ܧœ–t±êNɘYžÑͽ«Ñ98=5¾Ëwå.(0A9Õ¾>E ÀÔ ŠW‰Ë\…ʰ²_P¥:vŠÐu`‚ᕚ»Ý|fù•=ÍÓ4/bLÆ3ž–üP)þ®Kû ô¤ƒZ½nÇaWKSÁ¨ &é$÷²4-ÊùR`{žQNH³(©ÆwvV[•S?<: ä=x£”—²Vï×µsݪ²g¢Œ¥gè>‘Yì±'½¹0<Çb° @aƒÉÃëŽypcŠ'á;@Ék ‹W~óÓAĬŠ*@±Ë PD! ‡#{ém8¡§ŒÈÀR[d¦|.Îň»bTõøßM°4FâÑð‹1£,Ú\ŠXИqwÛo­• D¶ƒ~èÐýçŽE_Ô½P­ â0SÙ­Ê k`ý!´LŠt¼'H÷swïÚ'«±Q¹}Òõ>s] QéÆ#öÅÚmU\G¢³7© yLz?w‡AÁ¹Ã•˜n^zêß·ÚþÁ9Í_ên"}¼È€u²É¯Ž_ýï$¼ÞÿAÊëÕìƒzݵ*p‚£“`Š5®‹a–b°ÅXüpð|F~«æÉ„XíOOO{e¹ÅýµõÕÝòMÚ»u Íõ`í ÈÐ.ÌgóU¨§4íC0wŸ5—@3}âýå ÷·’¸¡g.›5roùºÑl¬¯­Üµžš;jÜ6]ìÖÚb+×ýYðNÞfu¾X Ææ2…>rèR%L1Ó¿Šé9W&ç(ÉëªDóëÙÖ,{þ©èîi07ĘÿÙÁÁEÛ^ÀeÄaAä²Ce~Þ‘ðaè,Œ‡˜UÅ zîy»k~sÙeÓš¥ª@Q‚ÃP«ÞÄ\|H/¦à ¦@µC4ÿô"àÜ ~T„0 tTö\Åê‰Ï1æÁÉ‹„«x —G$z×úÛàBæQ¯ä'ÂàåמxfvÙópÂ<¦'<Çývw³ÙÙN~¥ý´Ž#Õ¾ÄBÝa~ålÚÉÑßàB^,`  ä—ÒÊ£8ÇhY÷N'YL= r¨{¯ß9~<¬fЇa}÷¼oIhðLóÁGRáyª•Jj%ïOÝ6:ïO#]Lþûù"ü÷õ0i]œ(B±geB¤Ð‹¼\¬‹ì`O–pŒ;Ùî® öáE´‘aû«&t"Ì ÎñtÔ8MT|§±¡Uñâ §{e1 ѯ+ : 9—/°N§<ÓpÝŠ–5x‘Â{·çû§öBPDâP¨Ó}œ`8PÀ·‘ä^¦Ý_¯Ò^ð¶.BEmDãTX‰ƒ½$•‹³¿µëûÛë.4€T#“CðŠƒ,,³Í_¤\$Î(iU”ÀÚu}AÐCÒ¥,¤i_¦\Ä9c²I/—|\f°06ü ˆd~ÜgAW¦¡ú|ƒX¦Œ“ð¬ÞxÀXG- ÙVÂS§ž`ÊDÞ³,Ù¡b¹ Êfk Kôn¸ÀÄ´óCÿë0—º·?BMNOø¢+7[¡{Ρ1\ÃPFªa:=£Ê+‘€1ˆ†“14´’«ÁS%gT,Hz†woãùeHå\-«½[‘À> Ãqpå=O§Â²ð4íÈcêYeqŸŸy-JÁÁ”I¿á™I¸œšôYQדR?ì˜1WƒáĪtM☓DÎyŸ¸–:¥ÎÕÑ—fºkNW&9çØJä`¹uÍ+œI‰Eéóð¼ùÉWíãÕÓã¿}qè7wš›X–ao üòº+ÿÑU˜ø€à*NÌ•þ¶o„[Åo¯¸Á’šéIšŽEh‹³_!V dê,ìÆ)€ïlû;-ÌwkJ°÷ y_Ë#Ú«ñÎQò›áüºæA<É€S¾½¦ñÝoûðTàéß9ZSL|ߣÂS¬k£ði–€]TðI—ÞÒ%Ø›;ë¾ßZß4¦º»Qž*ÈŸ¿5¨žïEã·²… í&Ç"v™²â²8&hFy0wb.A“ ±à(Qé ëÀ'2|•©ÇWUÅåÅ2·ÖÖì£]"hzÅ6®9 à6ù9rf>JƒrÅG°â•Žuïuã7j%Oš¬É[sÙ:Þ†M±jÔ0Äs†÷ã0Ê9҆͸¥šsUàx1ÅèYäçøøa ØÝݽ76mw3à¹|@“\/6ùi Ý©¿à[½â§X6jˆD±i52Öb[r*Ö:ÚmqaPZÑW~×)¶ Œ ?Æ"ÈÖù;ÂeÒ8 ¿çÃi0’7èc3Y„ú ÐAšÝ¤)Ç«½„= ¸–´X•~ïbºÔã1$raæÕCœvB]°££ç̺Ôçɺö¢´³JÓ¡ÝRFßd‰$'}/wëªU«—©_}L 1BâE˜GäÅG½‹¤Hìç©Gã0¦êÔ#f½rƒJ)fÍisyw±øãWEÜ”Ì,)­Ó³¨ &½ž9ëÍ)@ÞkéU©•-×Á˜ÎRzŒ¨Î Çï„›Ú¾c‘¿Ùyt1£< &vŠ8Æb4!kß´ŠÂJl"±éš¢M¹öQéµï.^ûºZûë„`¬ëìà'Ííß cúÕ1ÆY¹ëÕ\ÈÑÑQÉ«G¹ãd Wh±ð]¹ð<» ç’ Q^øz)ëÂáð‘·iǧÌYf]uéÒ§q0yq²BÊæ#(¢F!Û[‹¿`íÖr%Fד:z76N:ô«3wf×vä@nî² &íèky¦0%/~P!sy ›Æ)TÄ}sÛ÷·¶L.„÷Ä®Ð<3̪⋛#tRå—r‰¬½ò°Š1ñRHë€2ÀX\3r _æi¾Ì£lZîuó–!îðŽ&€YQ7bg13ê÷°´çyN|û}ˆ¥–××ÖL±m§T8s\ªuœ¸€¤È¸ž–|ä…ïÆqÊ×3Íz¤ÈÁû¬õ7¨@G#b3rÛ³óaVce-ß67àTåŽ\,Qäî+¹íM:áÔ(kŸ={€%Åç´‡ÞÞËð:J¿½~üµêLYƒb˜M‡2• šúI8‘·*B Uæ^!Q’ô× K =†¡8+¯·Ü>kŸ®XÛOjRôñƒœ’e‚Ô ×Ї±è6ÚC¸ü;\b<.Å|.h”Â>‡n”bCÌho‘ Qøˆ#Ñ`ɤÍZù{æpË»¡Ïbj‘ñáyœvHá©°Šº:5é ÊÍA,47·?œ¿™iü’»4Z^œ[Dù3ïôøàüµß²øú–µ¸a’OÑ&h°wЇ§OþMP±ÀŠÀaµ£¾J6 Pø :‡\/±ûþÁ0ì^É”mš£ª`sY3ÓI~ñŠ6 Û4PZså•ùòÊÙás½(˜ó³0Ä*mØ.xô=þ5º‡'@Þ˜‘B/†4•â\†cL ƒŒíºØ ÓŒNòÒEAd80_€×ï‹Ö5¯W¾ÞÜõýõÝùB%°‡^2Á@TÒX66΢u‘Ù]EÚ9qT‰ÁEïfOºB¥£(Þ"fC*Üüõµåm´«P¢ßߨ]3×Ö,…:ËÃ*~ (¦íºH³w¨Ò“ø1Ö*Ñt,=q!Ce-Ìñâ u»¹!®4+ˆÅxµ¦ŸâµJ'é \ ä&T^7€°Ðeà"xWJuI\ú›09›ÑIóLv½,H)ÅÅg“|PGÁ $Õ> JõLÃzsͶlT¬¯-B[4ÒÓ^EF¨JWé`ó‚r_æ„ó=DÙU~d¯—6ÁY^PϺÅOI žæL]5‚€Ã+„Ñ@–ýyFmÿ$Lèî ‰MĦæŸS‹ö¿©ÿ–ÔÛ»ú0ž6~3k–ÿ¦ –;loU¹ô'ó«¥ß¾:›¹õÒMþw~õsu«¶miÄ^ÂÖ–`® ¿)Ð_¥ÉDp@‡@t‘'&$€>ZÕ¤«Ò,-Në0qmo’¸b« ¸bk[+ÛÞNây\¿½Àí,cM57o,—-2|ôTÂN®Ö\›íûÞ·|ߥ’ªr…Í-XakK¯Ð”«¶m¤? ¹þx2Zº‘çô\XH~;Cï#Æ¿µƒ+¸8^*"?,wó0ÊÇÒh)´Ñ+ÃPÉáNÎߨ¨Ïa²YšcvÕ -6 ó%Z)B¥i|ޤNç$½IHê“7ú:z˜g)êd,E5¹€Ña@Às¾b+?ª„f*]››hi57 1†—¸NQ§ßõG$ÎÝ+ƒA˜ðKɘŠ6.š5ˆŸy¬Uk9ÖÉTÉiê+k fsìÆêÑ(d’ú-ƪö‘¶‹TØðÔÉ^rìœÕBò˜ÊBE· Œ`Àk瘤(9ÒÊ(` Çâ4½'w£R³[=µé­¦i0”¨VƤm0Dbœ! …dI@²7‰­þQR»L›Nœv¯¼…K…u¥rGÉá —Ò0zciãK™WÃÉÎDð¿v× a²6ïŒ×Œº#vZ²úŒ¼xKÎáÂþù¼¯­{o¬‹tÕÁ²KÓåO˜N¨´†e ¦Ø@ž=1Ûë±ôB•õCèT(±9›X²K `(£D¯ð ñ"‚"Z!õâ¾K;%ª¢‹E˜®»G–p‰4H]œûßpxÐöÏý]ð ñΗÊv)‰˜‡c”ãÒ(W÷n ÙÛ! „ô0¶ôb/ð‰±#°Ë!úê‘?‚ð †XÔuÈü èoY!æÉ ‘¹…€ÕÅÙ™+ä E1Ÿè†%Èc¡0È\šcÌœ@WÜÙ8"„qŸ ò€ÿ%Qoµ€¨oì(9q-R"Ú\^_11¢mþEã+Eˆ2ì>„•†b+ò«°ÐæÈS˜i¾€–Š” ?}*~û$L– q˜²ïͤãÆÜá®…ø×F)—O.ÛÈñ¥öyŒuÌó4™€C´å²·«ZÞw2Ëý§™YÎÀ']Êò®©òšµ1/n&¡’z4üSr‚ç^@6I«CȘÜyt:k[âÊÁÁH=`K—4áÀ—I=ºšÕÔàoí¢êdG3eÛ* ïÒè6-^ùeP×a×éK|‡=›Ÿ€E›ð¦ÕˆP2¾:qšW z=üuÏHuxº_ö;0½§ã`ÚK v÷šà0ˆbÅãv‡1ÜÕ+Á5>müôåÜtxqv‚‰x¦‡éО²ùøA›5Ã!:ctÈNé Õ€´_yêç)°2J8ô2 ¨ÔÌü›!=“ߎ&›Î~?§x_Cù«^»Íâ›zzô¹ÄâJLwŽÞQÉœdhãp<^–(S}5â`äç‚€Z¦ãT†ýU±R–©Á¼$UÊR:a5qaN+,`g¥PÛ¿µcžµÒàFä…;ñö(*”<õ"ÍRã¯òokU†°¡ÑE« M$†"6䩸Ð<´ú,êÃ7)þ= âÊ>p[˜±ŸK¨Jœ†  À[Ͳ ÙÖ¡î  W[DÚâ­+kTã8[K õAíR¯Ó`_…ÒëïGŒ‘R)¤%Úú¡søÿ`¢®„s+l%PûìäuÛÿÁðà{Í.–¿¬„Ê:Bec{©èóãçÒ†a–XF,ñYÖI¯É5‘%C9Œô,kÈÑ;ø½¬TpF¡b‚‹Æ ï œ_øî ·’jìN˱ö Þ¨ð–NãÌ䱯wP‘³»QÉáTÊêSe‚ ¡À>ïè…‚µÿ4àDr ^¨Ñ²C*³|%U ;§ `ï¯äŸX¥@UÆ'iÏÉ3ç\mlúþf%,²…ÂÐúhB¢åeKïïê£zP¶°–öÊ=ö‘8µïNÙøX•ª4Ækp#vw­¥Ù lM| >èíiˆF¿DíM4ÙßËÂß¾íBV½±ÑH‰ƒª*%:r¦ª%×°º¢¹é„C*F-¡¯Y†s©c³§zÖ6-eÕÎ_ŽlÉõëÐî_˜Wziÿ0^Ü\O0eþm_ì´ÃUz˜+Ø=¼ál>±µÀ. <ðo‚¸çøþ!ï¤DÿF6Á±8žaZŽaP„äÐ~­­m R¬€QJ·´¥IÃ÷ö kezFVowÂÄ“Rð«Æo¯¯ÆãÀ/ÎDCÏÉáA³À/¨ëKÄ$9¥%g)^Ûqn+»§‰St`yž<´4x|ÔÝ1xÖ‹s̹ÛlÎÑȰƋð]ìëþ™‘ºwñ·’¢Ž…š°ŸÙU•çM`øuÍgÀRR™+zc‚cx˜i½¡kÖqþÇbζú@¥/Æd›”kÓ T<ØŸˆÅ0û~Þœ³‚§xGlÓ­0|`ÈCC»TæUÉAt2o1Ñü|žô÷è’…ºÀÑCE‰¹14íÖý×U­†÷8(?gÏÔfyËa/oxÏÐ8¤Å-iœC“;[ßV\Ws1ÄxÔ ±ô–‹Tè@W–œm+v6-UYöŸ'ššì‹ÚŒE9x$‘Ø1}ü:A6Ðä…9QšV«r²RGµáÑòox0‰%eáÖîÚö½Ì¥N,ô«×ÀA/‹2g4uRo²*6_©@ŸÄ†Ì¿QgB­qž£ÔÜ‹·h#¡û=ÃÓråxjÙ¼Tv¶’]‡q:DYw»^6µÖ·‘m•ub²hVPÉÀ{Ø&¢ÁX Kó«/˜>Ç´!XMJ»«¶»ŠÒTœ°Ä8œä"–'ó<gÁÄ¥p»ÒJO§Žšâ˜êK‘?u²=6Íq"ز Írþ6œÖ6(J(xòåÐy ,cÒdí±Â~Ž"–Ú§Ëî®OòJ®Ï†yaO,Ç Ã™í‰®ìû0ýu$\ jH’Ç,8<_Y'¦4`Š=¦gÓt@qXØl’硯qÎÏ”ý" oB3jCmÇ~ÔÃÂjqìœ-¦OøßÕ"èn—öûÖžaZàg£®ÉèÊ-QÁœÆ7›óöG˜Žs¶Û ~f[f$¿»„ ˜¿ ’(’B‰£©P¯éZÞªxº³ÉX&™y»ÓŒm,¢I•S%‡+è 6ïi8 ®#Ø&–I¤€¿Ž€û¢¾x?*»ïV+™61šÐ:VVbvÔ©¾«×®ÂéÞý®§öþiÀC@ÈuxªAN¡=\P8ä%_èã¦áñ¢ìö¶À:“ÂKÒ‹90Ž€´b¾J¢¢¢S-uäöAvŠ5Úø{I·š°‚VkÓæYÎ1ÔSÎ÷†¯“ ”?ôK ¸4Œõ˜£©˜ê¸4ÄÒ|‘Æè £²¼§o’_w LÁ"‰i©}ä7[Ë»†sÞÊ÷»(7Uyùo¹+m=h©ûå>àÀÏ!‹ýð‘ãe[z¨«ŽÜrÐ䆸¾µ¼cðÑÂÒ8öXü¼-Ñiÿ†”(¦pè)…›^T‰T3V<ÎS )уû]K6 &ĕʤõL}ŸuþÁ0ƒh”è¯^ÇIòF˜$ò2w1¶²-g 9¿Ã…Àmã1ɪÈ9ºô [€†È{ŠÔ-ðªmcÛ&*õŸ+ReC« Š™„öv’Ó/ JÜÍ §Yì©y>h  ñ97ª¤–UÓq¨°Ê â©lC.ð‘è×”2h®m †Þذ,ädx@[–gð>‹Á5ÍšdYF·)•ÔeæÐ + *ÐRÒ¹®½Áù…êîªC vo&Wœzåb˜Ž‚ïÝiÅé k1φÜ‘1☓þ"4±Ìaˆu„ÆvY„šÉN Åz/T¹«[Z ùõ®S[3A–©4NSC÷ÒòÝÍV˸©[%œŸ|øâOS@!üL'–™vß^î§\_³´>RH¼üâËé+ò¦ñ2‘iH©÷´ "cÃÈÛà`vèq·î+&,À´\Dd+ÕKÊtOa?ù” k&ÅuOûm)geÐl› fIÔº—°Ø$ {S‰ÎR$}U9‘éG&KÜ×;¹¹ rS–ß°edÇ>§œ|Ei¬4ê={òÆ’6{lKÖXÆÂÚë•Ù»LkˆJŠoبò·e$áõcf¯ƒàÉ)mˆÌ dšÀL¤a4ÏF%Œ*[ Ì ™hÄDEÂæ–™•æ)b½ÔÊÖ'=1Še›Tĵ†›»Ó?RÕú¼j7s6+öh„6>ÜgË£^I]Tx a’®UãÛL¢‚á’ñ–SñÉ+-Äá3óxI«×SÌ2¦ºÅ¦s=ûܲï}O%^ÁçµØÁýž6kã[n¾6îÈÎR!‘C¶Ò$)x>Ó»äð¹ ä)*)^Oþ´RC5Ü„Ç> T ˆÒ æh;Ä/á€ÀÄ;½aä½Ìà¸HQ›³Žã 09ŠD- ôõˆ§O1}VZ÷öãΈLÆ_zF8ré‚HÜ}ÐÞ]÷·ª Ó^ø›¶ƒWá±·‰ëõ±üˆÖ°È3蓬·ÕÓ!Ù£\?jõÚà €¹HoâоPFÑ=­Ð1åÕŸží\˜‹fÄb–¥¾/³QÓy¤Û dÔŒ@¢(Ï'¡¬ -ýæêï2Ì›‚EM\=a¬Ïˈ°*rv§ä-RòÒ.ùÇY·§µµ¨s{Ó>JSë(5íhù0¸±/O§|{:Ô„ ®/€U 3ŸU|Š?±2j^#aà%;ÏÙà ‚Fn·Móøo›+ÞÙé}Ç¥©vÈÌ+„û1¦6q¢Ÿ‚wQJµ<›D–y#¼±[yC›Á÷1«²Qx¼Ú2QJû§²¹Ûcæ´†©oíš«Û܆ýÜÜYsj“iá6§l,æª,«IðV~ØÉÃV7"üÔelº[ÖìèB•ìŦO' Q‰˜úу“àFZA¾#zs’Qj^P€Úy”$iJµŸÐ#ÍËÒÒîV4–@ÚÞ5Áiy¨´v0®µeCl@³õ·¶œlej!K†sÆS,»*\|µhîþ B È&E÷iÁX¨%P 9‘ø…ÝÝÐÊ(Ôi¦¯ODúâlšù·6·P ÛÜi:ÅIJI’úo±Ð¸Ÿ§þΚé[ ì¼UÜ6’ìíTsèrã#ÞyGÕQ‘ánåT¿ZKã·v•IÔ[^Ì5-¡¯¡„Þ,§At¯Ðª¸¹i-ñSô¦R*ðºÊ4{ä Âð¤ïÓº#E ¤ó»Ò‚d0!m}A^a¥Ý´HJÝåoÛ«2‹ž-UGX ‹‚«¨bȱê£Y¡Íp_'ñ¯VæÈ6=2 ¦i<-Ò±tM2…„Qàö .Xrˆ9Þ*ºª &q‚ç&ÿf6çÕä/ÏCÔaOg¶BÑ’4FéÔ Šò_6~3ñî!VÕÄ6’­„ÐKMŨÅÊ:>¦ÆQù>ÉКmØA*}ºª”é(‚©h(Sëñ ¹B«ž‚ë¶©ì‰H„Z¦Ï"k,Ì„²•®Ò:&éMã7éÜÛn¸B§)sž5J¾äBe4b¨îb|úz‚™b‹"Ô¸Fi/à„GÓtp£!žóÛ #¸Ëç(÷Ä2aF±p,Œhîß3å͉™Z/U3 ¶S¾(™#Íc~W´J @˜7›:=%›š=/iO;T*œ;}ˆB=}L ɶ^û>¹Žîm'4„x[Q¯"¬ˆƒ†9Œ?/ÒŠP´^bõÝ6Ü·ˆ]wS¨:["—ßQ |3ÕÜ9ÖÜ¥Ïíºex'¿@6ËU»P¡£xägÓ&~Š£ w¦¦ö-öŒ=‘.ß1p*ÇXåÜY¯àªNź*—ó¿.×ÍA •ÃÆÌEœ®E˜ù­¹ÄÒs ÉœÐæ¶l¹ׄ*’Z½I Ó`5U„$°ÛšwHÛ§'¯¾3§ág=ïöôdƹ\fáwûÝŒLlKÍ…³*U<Кÿœ„¡ñe¤V{Äp5¤1}ø¯•Ï»Œ*«š]ÖöI2+á0¯" -ôçY³ïW²EÓ9’ÅUÌ4K(T¢,ß^…7,Šñ“ÕÕî¨ÚoÀ,¼¬vóÕ›aP¬æ£8y»ÚK»«3ñáÙªGaïÂwa1Šg+K–ÔHÕ…B—»^\#ÅX°‘JûmpXç;x0Ï𨼩C4]$©´áQ9Õçi.X!ƒ£ÑÚ!O¦=¦t-üTãán”aèWV™4S¼s’w%pž4ID!‚ «œB•À”B¬æ˜i_ç¢SÇÅðwÂX‘Ö¶-@öÍ´-¨ïÇ”¨å£æiQ¦:i}HcvÚ¨J;ÌŽ‘w8•yFáÆº‘륦£áÊI_,`ŸœùƒÂo¹jK(²0™YÊ<@”Ïá!Ò¥ ö^ܤ6²:)b5ûьŽw?6¨P’$¾û10ôÇ äöÌÒ¨ìp¢M{+‘ÞÜáDSq=ìÚ 4úÆH;Ë!k<àóƒ`‚¾Wбëcm7[•®¢xë{)æ×¡Â„JÐÔΞ‡ÆÂ.HsG£*aFéMlSÞ7ø€¥ærÓð˜„Kß0ôNÞ5±Rá ˆ¯JF«€^5lPõ:*k,ÁØ¥µ±ÑØÓSE0Ãwo„é)QÐq/ r± — ¾ d<*p¯|Š$mÔqLž‘pU‹ßå8o™ST‰ãÍs¯¹ÖX·ªq,L™kú…ÚžŒ2!¬®?¡}Y9çdæ¤|Å›Ì »¥-­0ò$W¬Œåo•øH×@ÍÍ L°µîX­RrÙð‡¹Y9¤gé—ñ«2é@¹•ðÓ $Ãf×#a<_r-*Ïù ÒT} MÕsRÉù´Kþ66fîÄQ÷ cÉ+2}ræ®ÕÛç3~ÈY7_1¶¥ß÷h¬;@lŸûm%Gg¸‹ îŸ8Ê7iÜ1qÄ•Î6‚¾™fÖwô \äù3ož¢å¢à k3—"hÎu çq“íöþÁÁ™‰þ1½T§Öf”ƒ7ì>ã‚¡#B™5Í´šeö«q_ÆK0J-Í=S´(iÙþçTí€Ež—=c´`/ÀLøu¬ rŸSïˆ3¯ØÛC7a¬9ˆº1QÛ¬'“¢´IÿÚdÄ’oNRií¹¸ë"+¾Î,“+¬˜›ùú•{øÍsž ÑŒY˜ºws7,ªw¦N]D¼ w›–¾ ¦͹ÃÏöÛg/ŽKöv±õ1gq@>.ÇÃ葟¤=ëTΟÎVK”òªPé•jÊ\_·Ï ‹²Ä{' jê•j+½ ùÚ`T³ÚÁ4ÆNÑh,™WUJ“½`„c— IÁÄÁaÂÆ}ýxƒv†½¡Ènÿ|‚Fä!‚ô~bÂî¦{ËmÃa¯ëcRM3í6Új=ÊbjÌo²2a’{/¬mAþ¥1@ïüöri2+†’IÂr!äóÜ.0e¾hS¥=%!~°k»»·ÏöÏƘýê* ÙŽžª·${X^~\ÓóNÃ$Nñn]9QÊVM×{gªŠÕ›ú¨a€ÖýÌ}N.ŠüÆ6s¸ $Â,c€ð: Xô‚}€ã]¡P—à{¼Ó*9-V׺S&ru*vw€ ^sñô2ZsÖ¡Ô" Ls†Ž]CªßFªüÛ½Ry×Ðà“ŽAºJ"ʬ`@~X  } „ÉA4”ÍGqOKFîh>ß'¶Ôޝ9ö.Ø\Õaô'ãÀŒ’¦üã ª%忦ZxsgÍõŒ¹{[³ôè%T^ÓEŠ¥¢‰½²ÅñSÅsHÍ3¸fXkR¼[Úu²¾óä(+â'OÃ0{ò©È“qäÁ¼kKu[锯¢yL]›¬‘%>î”2h¢e{É4‹ ƒ¤“ÉŸ FÁC™æ½eè´DÙa¦ÒuU”pì€4Iêa˜*æûÍÏ+úXáÇ´‰ åÖvÉKæÝΖŸžþÓÎÀÐd Yî *Ù¢ñÜë Í0‘­3'èd©Öf9_[ˆ[ÄCÜŒ ;€š&#£¦Ò÷y˜=6¢Ÿ)M§˜Oõ§ï=7«¸åÙ¾o™?Äß^³Ñ´Âûj9jÔ½uŒ…a1ª4Çá Ë/w¯8½ª=²ôÚžßqrf¥›Ë‚©»ê¾î“Ùƒ%2‰U²¤ÔYF ˜T3A<‚ØáÕþýÊSi}t‘uue×Pi'êi+unPÑTqéE¨¥½Ü,VÞ`¹jwÆçx5táˆó }Y>ì0 .ÃI[µ÷»˜‘;Õ~§ðA¶M•ƒ1!·çþXc&ë˜ÏónˆÈÄjr¤°ÔJ89\pdàÅ“p"Ór¦M“ó™YN¸&<QÁrONÇ©y ÌNúá5HÕ Õ°r{Êf;·ö‡aÄçâ§Øj\?¬—GŸbí5)yõG™é0Té%+—Ía–Ô >òešQ¿ÀΞv(„J®à¨á•JJX1usàMÚi3KVÙºuRR ûêWŒdƒ%‰Àfòâà×)¯q”ZÞ,·è„¯yâ†w~¹tkñÃ É ÏtõW9íQ)›þ‚“c¸w¶6°4­c.£IæB&÷3)“„¹ÊA½Ìô«<†*¡n,a½ZöËÚ‰k×Qž§ì0ûñ€/=p ø?Å©ÏXHs ÷6j¢ƒZ³¹¹éfé"qËGq‹Weˆ[¿oiwIr÷ÄôÐË»¹éÄöžÿ}×JãƒQ„&U€ÈLp¦udRÝ ˆ˜¡K˯¡PžËzºLRÌ›IêrÆÓ‡_RºµR rGÃWyÿ}ÒŽšñ*©Ôò)¸¬Ë4Ø`©ÄtŘ3ù¯3õÚŒïдRúé 'PU‘fw&h뮊åå}¾ÈUŠ_#Ǭßk¤…´Ì à±-Î 2‹¸ãݺ`÷At0Ý–-±tc4U¸ßÝ%@Šàíê<)šžŠÔòžz>A]Cú,̾ª"I¡D¬7:5…EÓfÑâI8ôÙ9²Š;;×u.:P÷ö{±t€Pw‚¨’5ªíó}ï©Ô̳´ùl¢ܺüÔÉÁÙÁc€äœtoÒ2R W+M/ŠÛŸ æ°^[B¾´€¢aÕÊ÷‰#8‚·–[É¥¦&O³<­æO«6ÛIq¬Î² Œ¹ÉïÈr&ÓJ!€¯›•0ǽhwÛ…ÒÒS yãøŽN®!ÉB`Ù×_†a?,Áh©z%Aè8DKßò”R3ŸKàã¨Pûlƒ p÷xw»QU"§k[Œ 0Å2€µ§Ëâ”im ¨¢¸ª'ðߣ¦ÁýJ̯ã±[*Ù@ƒo¡\hxZitñßuá˜^÷ĺë!®H0€`¿ãÄícÒkܲ¯’‡ í×ñÉ™LDÇјš|àtŒ•»ô-!µþÞµo™š„"6,Cu»­¸ÏI}Š&ƲÔË7aä|’´€7™òææ¦!GnÀÀð~’Å‹^ÓäLÑZû²ƒäª”"ê˜ûº`º˜;a”Hлôˆ×|‹2LNöãê’_½2v©Òf#fƒ—VÄå•´ÙÕx¥ùiñJ³„Šá)ò†BÇæ‚É b¨Ô¥Täu±²(^8WœÆ¢¬‘Ùä«[Õy¢(¬‰©"p»Ä'ÿ £ÇµV]ýa¤ï.Ê·‰v‡-GžPé]|™¦Å¬æ¢œIµê¹Ê…¥ û•¹˜2@`O‘Yï­âÆç +ÝKÛÉöR1Îw ,5ÁÉøý%ËJu*W²0U›è­–œK±6º‘LR@žs­j›½8¼ŠFþ³§mC fqßt{tv|`Òë‚rýè¼—ÑHJyÏÓ1 0ì úCÃ3é3¼þk9g»Q-§3n#äR¸ghz뺪çݪUiG8 ”Uaª†iHmªÛŠùJµÎ>Ͻ£Ã³‹}w^gøPÏ •‚ÏEÎù;àífPz8„ϼ È"Â4%@®»ö¼’”8– ³/³I’5S ŠBÚP|µH‘šs "Ké¾bÅ–D‰eØÈëÿ¬FE@:!1–˜¿¦·bÈšˆ­Ä„lU©2ûýÛÃ~;­¦ÝU ÷·Ê8³¿>p¤ù?kð³µ±ÿ¶6šÍuüw}c{žÃÏöÆZóßàùz þo£¹õokÍÍõÖ¿ykm ~&ydž÷oo¬ ãùíòE“â˜ÒùsÙK»D2] lè\AèÉËIŽÑ!c€tŽÃÌztÂ?ØAB ûQÇ<ú¼Ô¬Üí%Ã0 |àôèeA¿è¦ã©óñ' m{ Iütà´¤¼5γ¤ x,ï\9ÇŠäI è¨õe1YH „0Ãìv«±%3·¦5É£È*Ù^ß®U´I{½»šàw†À ‹ÙíNÕût,»ûk<jB¨¬˜Æ˜ã8?¿ z½"•ýÊb—<Ù¯Æ÷nËø£Àס `ZX?žÙOÍŸo/3œ}eéÍ/·Ÿ5g³RS Þ‚1»“qùå÷âe'T¾O÷•ƒ½Õ¿–ZõÂ~-.á†w¯²0†YÌOöfbî@WŒöyHl ¬òŠ¿ÑBä@øõ¥§ÖãtŸtîAµ01‡¸³‘èØIßÝ^F…nãNüt©wöÔÏ)ÈGÇÝŸýü¹ÖmÜÎkL3¢IŠu,:ûÜø^cˉðÈÝ~š·ú¤„º@áí³h"öb™ÜöùÏŸ†Egü3<  âô$¶âщòⷽ˓ýóçGR¹¼p‘õyßÉaš…>/T(¿ðk159^Ž‹ŸÏÓ~Éd_N:c úì¶;³ôH'À­° A¸´^–$·Á¦õÚ^[óNÓIB÷¯Ã†ÛÊzêÞ«ï¼µí]¬ï·¶µ¾UjKlë€&ô­bY-éÍž?A\.Îxs‰p2ÿ^ Ž‘e¡® ‡ Æm²ÝÜõž‚ß» ¦uï|Ôð¶×vp¨Ê ?zM`#Ö«ãD‚oAÆJ¦“FØ›X³­^³8¯=`ˆÙö‚)Ÿ·N|vJzï)ãÙ Ñ|\…t"ùO†@U†p`ß`É<€IÂ5‚Èt7P©#8Ã.K:›.Æ»ªÁÉŽ• ›^ŠÇ+‚Ê÷èBQL`ÄÄ5@м¡Å|5`#³ý‹!å‘éSi¾ð¦¦Üh$a0‘,¬©‘<5’îÉ¡žZY//vž¼†Q^ ¼®™<ømxÉ|€¾w“¡nŽ< /îaŒAöoï­p€ÿ² u«ÒœžÌ(óÒ0È“†±óI!ÚŸÄ'‰0ÿYª²Û°hÔÄz!æ ãpç ±ë(©ÈÈdÔSF™¤‰ÐkÆíL±M-TUxqgc`î“8SPá ?Fã]Ý+¦cè% ; éå UÔ`_qñ#BTâdž”yM}8 ÔÄÞ¤Èõ>°\”žÑUt¬…4jònèó‹Oo¦}±™ÄêˆðE‚·pf™ÀIµGí2Jº1°Î·Ç¯.Î_“u&xúÇæ4ŒÇËäQ cæ|JÖC3š‹œ‘UŸCßsã¹Ô‰ó[~e~†¬‘ûî®ñ3À ý$ËM³ ülÔ3ž ºÆ°>¥]dwmãé·^±BL°»Æ d‚µMl`Š<,Æ“þ½træî$KÍåÏá…±žY–øp§Ëabã)eÏCóQ[Ÿ4ÄOãÔ^Ó8HünÔçºW£€Lް3ç /¥)5V§Áx†þÏÆ?93þ¢xãX%¸>E6ãÙ cÕLOÔßÃñ8°™™x·³eú±ùnÍ‘¶*&€qí€{¬)$IZ”ŽX°õwct“%­CÿŠÄ35ˆ¼yH7w\SÆ8Ä_:!&V6«®º°âàÅPŠ¢Çç€é1'h!ˆ3 š{À0º ôohŽ¥ÈÛÛBM›àKÁ噸’Ì@^_8´ ¬a†ÀòX;Ö”lëVÚ8Fª:ÿ¢‡–2xZÃùayQèS ä#ôˆ ¢˜;}=FbbP‹vxLרøj"”vGJI¾ Qö{¢¬)º<,sx@ûG?¼>==zuñ³¡oçe‹¹Nr¦°ËYnˆOÄ{/Ž.ú¥òà˜—žêÉÐ…†#[ËÂn À¯Š±„s—I&ŽÞÎL}ÙnsšæÅ”}ß1Oìò—ýW¯^_ìãîµaî§¿dó.bûXÖ‚ó·Ãñ¡þ’& ‘÷ÀÿÍ>ÃQ¢ÿíöþÇÕþÜIÿ›k›ýߨÜÚü“þÿ?Šþc*ž×–}á’”­·ÐàIž£úzKóA3‹xƒT7Aº‚yËó>_Mu­K]W1‘Ù¯¼¹üåõÙÅñéñßéæÍê5…_šÈÝj£p«/;t·z{{8D›|ëEï ý—¬³×™!RMðóLÍó¿‘¿Ö22¥¾ì§B¥q8o¦HbmYfW’Э—Â;pâmkÈu ±€  ªéx°ìTeüê‹\'ÜSxû_SnÃDæ6¬{RwKìÑ“ Æ@ÔRŽkΉ ?ÒY1’0 ;ÙÜ~ðí§ ƨý1a¦dU“ëÄ­‹&’Ž1S&Éà±Ú¥ B-¥Àÿ¯¾„ÿŸ9þŸÊú1hÁøs}ÓÕÿo·6ÿôÿüC~ý¿g&†Â%f£ÞŒë(D@bÛSÄ`ÐxJ×4ʉU,Õ¼TPõz¤ ŠáMƒn×T1.%™Í(-UqxHC˜ØÖ†º°4IŒ#P,c¹ˆꆓëô*äØ?ô‘ê2cE×°!«Y¹ì„Ð×W½(1#iØ(ÍÆTq+Y·Yç­/S[ûë8{ҮᷠöHOJúSbG½‹9ÛŒç ®¼4“:c°ªQì {¼"”´‘o Ðj3Pô”Ú‘FÚy“i–b6k-=1/F€·€ûsbÕ1-vÌþ÷Åp!¼ñKÖ§#?»H§…ðKQCå†@ÌgÈÇiŽeBÒù?Zpš\DJ™ÂëÅ9ŒÎròzœÁ¦ w^4 ÙîêY5Ú8rÙm7FÔ*ÏÄC˺ÃH9±Øv%b´Lc9Ò`û’1q†©Ke6kT0 h]í'ëLjÞª,!îž²­†©jC;Š Á ÕIÅó ‡1ˆÖîî'B”æy$wNv,×@ÝÚÁÜce}ÿ@ÞK|×¹ÀöÚA&}A+U+Óü¡À ŠŽ™…c2z³‹B>­m$Þ?àü]tÒEF%?²— £Ä)– .0çÕM:‰{l)¼|ˆ¡2Q_ÎèÓ:½`ñ(¹xD,Ÿ ƒñ6wãÑ­¿ ¤À¢JU2zñæ”: þJðZçœû­ *æk°N’ˆì,ÁµîY„cR˜Æ”gOj.-VÒH„]ÂTbKÕY(÷“ÖqUè¯NOL#¶©¥C%¨ô®Ñˆ7 µôçÁšö20CùPyzq¯{Œ $¬Ejè€|ŠI4î}‘ráz\…8{j‰ÿ‹ìvë§$ÿ£ýoc­¹áÚÿÖ··þ”ÿþˆ%ÿp®[öÖ¸ì¯ûìö}ü>ƒÿ³yGïrK÷?_xíÓ“ÕWßÁ/F¼Ž9T‰"¡oÃŒêlF–Üø…·^‡ÃÿnÕwšÚŸªz„ãq`v§ÉxÛ­Mü·UoílÞ5Â>úçÚCÀ[ðia½¹å.æâõÅþ ¼Ü¨¯oµàßf³¾ÑÜ´ZÑx hOàA&.À²Ý0Áb]âNìCžLi|ÍJÅÀ6 "‹£(·*.3Ægûh”•8;ƒ“’QŠ«°e&Ñ¢?–‰% æ¥H/ÑrêE¼¾A¼8†P™z¾8óÏ…¹jgxiRòs%ëý±WX¨¼\/óIwOÁ=X"bêžgh>(”ùK抹bÇgÎsxô чyÒ'ñ•$Ë—ù(¾¥Û3ã³B— ì#Æ4äf˜¢ú€à‘7XÖa'»œ¹ –ºìMEz£¼`®˜ñCíz¨7(Ѭ¶i‚¹ÐÛøAC-£ú 7&¹F-Šü¹VµFÜÒ@xW‘D(ýÇðN¤ïò=Ÿæ‚‘=KªÆŒ$¡ÏCŒw`¾ ½f«éýU!¿æf}kg dö ¸Þ‚®„ñ¯ÝÖüibàB„jµUQâÃææ:|FaÅ­úÖ®`1z¬‘ž.’^I@^ÿÂB/ì! ú&¢&ÞQŸ0èNaÛ»5ÏLß%ÊnôZ`Ý:ŒM4õ™ª8ÆÂSP[£Õâã–PŒ÷}ÖÒQÉuôO壵¹Ž+Q'‹M]üªÕœrÇ‹«Ü„ר‹!Úšx-JúY`¸Ô—)ðµŽú””± ¼°кè‡z%<¯{¤\ú?mù?ûSâÿ9|æÌÿÑ\oµJù?škòÿÄâÿÏEØÔ¾rƒ“Tä/µàD(¯£¬˜ß·ÈrˆX>KÑõnš£Q¨&ß³ÙìŒ1õs«®¢·?0}JàgÌ:ÉÈW¼#ŠJs¿¾g<ÖnV÷ZPí°%s2Óï3ô€3Ó>ÐÒû@0A"ƒádðÃÑÉI{&r.]d̩Њ£Dº#’b ¼„‚|$†Q~mšÉl¤ˆ1銆R3ƒìÈÌ4úRG[Â_”Óæ˜=1ø+çψ¯È GÑæø|V ÙÉràIPÕ~q‘¨¢*Qf 'ITÐnX³¨Éu ç¨)t#G7ñý`FÖ)ñ9òwKo’¬.(¥JùAçÚµõúŸõSÂÿïv¶þ`ÿ¯µµm×ÿ{cs«ù'þÿ#~þGÁŠK…Á ðdlò¬V{•:nÓ°øS‘ú¿å§tÿEöÇÄwùÿlo¹÷s«õ§ÿçò£î¿UÐO†â³ïxe(H¢øDË:I=™gÔNÄجpŒì¥Þ =®¶KÖBÓÞÔ¨‘S·9Hº …“™~2 Xþ >!k³ ³X~Ôwê»õǽúã°þ¸¿"—¶'4ˆüE6Ð’mâÖ£¥0 ÿ¥ô]†atša4‰‹Lëq[ {^7šŒà‰hÔ媯ãõ˜[œ5øï_Ò±M5eQ鯡)ýÛ òrS8ÿÙ”[ÞÕT„‰)`pwÕJÌ©êÐ liÆwoÊSyO)æ†@Ð+· ê›HaÇÃH©=¡I_6Q³»œ9å„Úd˜é/R»HÇú@Ük-~–.vˆ>¤Ô_p§CÊ.#Ò S‰ùl_ùädfª ¢g‘vÓxFå+š×½dxÅlsuIŒG0`,ß^ç"ËÁŸ”œæ¥ NaôÇ:TójqE:A”²XÚ °U µ¤c廇añAv%‰´³˜WÉ»ZÕ/=;¶œçÒ]y’‘iëQ%”i}Dd“+º¡ùލ)ê¶Uÿª½–3E8FD4…¦}t°…ˆi4n[/—ŒWU bZ*|ƒ^”¸v!ª©¡m¨™ 0“ƒúÖq¢¬A2X.Žóºs,x6¹¤NâÓ”õ{*¿˜f=@޵*¯+ñ-^ k†ªzs“ðaî.b„#û¹äFl£¸FBÿÀ—H¨ÎÈ=%ìÔp¾*ë¼/ Ìë¥c·§gKùv¿D£[ÜlhE¸na#lÿØV:ÌÒy‚p’íewg0…åÓî‚Oáòù³IÄtBNí-g$½­ôή¨59÷¢Òè–Û²1UÃ)«æN3wç)‰ž¤´¤0|ì^št莊áñ›Ìëj׬¦Ð‰R_êèÎ% ¢OXÁ¢KŠ5‘«À…Ô;ÞÛ#ÏúË+kÇÊòß(þcõ?­V«YŠÿÛ^ÿ3ÿÓò3'ÿ7ž##%6ªÉk*áî?åüªøŠÞ‰$¹VÆ£Š¬½FšTCöÔ¹QfÂÈ ¢fç=ŒþÞ³0‘½ÄÿÀ½÷ãè Q…Ê-\ô@ Ò‹òqLß׈à!¿!¼þ|9ªT-jÕk'8d¡&ByÌߛ߆?s€¢€ÿâv—ï+‡—NF øÅí{â»øÙ{OlEyÎ a‘.M¾•§ÂažÝÙc²~c^ øb) ú´È&›˜¼4¢¹’FíD,ßΔ IÝ>ƒïóoŸãLø×Gêá/ï=½²¼g³I”£-½ÇrÞx ò}îÉýâdèKвÉ+an &ñ Ú@ªŽk0]~ï]ƽ´Zy´]Ìãò'çååÏïáO'øÎMäT5X ‹Cæsc蜮õ«áT£T2FLì®$ÏèbŒÇï=ÁÒeãŒr0y‰'…SG²F"¦¼À/ 7hþÍ&&qœÉ|qÞ­ûo½­ñä•[¥®°îÏMJ|} ·çž]üXé øÞ{õúð­¿T]â(/˜@£óý}!&áƒ\0€:ø¾Óò~ÿ¼h+ ÐiÀvÒwaOA—òf†|˜J(|× Ç…píò /%8Ã|D½,¸F"£|”êˆû„=‰š5k·¢>úª Û’ÖnTíœ9ÁO'ëî&Þ J©xò/’•+§ÆèÄŠ—í*œÞ€¬€&µu¢¯¢&ïën>”¡³†®? å«‘ (?…8K"Ëú{gHT)£‹Â*³šÌ,±àÚº4ã=ž œÞÝg›ó,éí{‰ÞSË/W>î¶ð'žQJ/ôZ¥7äÀ¯ÉHž…$³‰OŸíõ¹ù2}s>þ“Ȧò^½Â/.¿«ƒø÷€?^¡Vï~ö¾õN`ÜF7M@à]FcµèᩦÖ-/ZÜ #°$Ï,Ì'qáb ?AÈ ¬½J‹P{ÎÉàý×I(¨nW÷°š(ø³m”Ùð,e~«g0ù– q›<ŵU;Yhcôeì|ÅÎé(éYãÀŽÓ(¥saf7Ò~„$±v@³’SþÁ%iØH™x›oã]ÈÀaJÃu\â}ypÏbt´1Z"úŠI4¹Í«*diì¤k.®j!‘õ<’áqê0óÛ ³|IY¼/WJoûiJï)aZ½`¸B5¬æhá;Püp7ø®‡ÿÛó–é÷/éÑ µ¶v½<ü'4ƒ_ä wñg’´ÿß„êפ]ÔωHJ'Xýà½Ösª°ãGº?bø<"5-f_; L²rœX?ràøîÕþü‹7„}Ửn‚Øâ_ÒÓׄVÞMa$L” Tf €þ$?•âŒuNïåˆÓzgÂÅŽ‹{î(¦~”²m-/Mœµ@ÈX(‡T.• ÿˆ¾0›±FÉùDòÚè¿Æ;›3¼$mÂO´Õ 5ÂnkefÑ02[6a‹€¡¤<x6_2ŸÉûçDj0ñ#T÷ˆÔâ¶Ì´Û$©ŸÓx $ $Mƒ ¨T€Rÿkò¾»&"ß;4E2K2“ C.¹:±ü²Á{j̯‚K;è øäàb.*nÆ{Œ”–‡”!SJVá9J KV4¥SpêÌáȘ`À¹©MPz–ZMûè`üàž§¹Ó% ½œsõL*DLÍÎöïÜÏö'=œpp6ÿ›­ÅB‚à È'ÈÿåÆáÍÓ‹ïLÊ éüª&™2ÂL¸>e¨4•®€þ»±¢ÔRh!ƒOOé\›9"˪›sxcÁË6ßöSY3ÎihL_0ÑÎ6[Ò)eÂ~€ á… ÙÆÒ{A5;]…~Í“ļHRxìΔņE¼·p‘î·à0ß½0Ǹ%‡õ>°~*Wñò ÿt*—Êë&½E>ŒúEI¡ùvžÒî ¥¯¡}¬T˜)ü&5å&šD,É–V›á¯‰Ô${ét¦‚Ÿ©¦‚ñ<„Ãd¯h—Iq8¥˜/åkD³V.ÆÂØ,q³ Uwp²T4ÝbúÁ8 #(½§”ü’G@ Ð/YE. ê=z½| +ò’•G³;•­ÁýŸ³ 4&]Úïß}VåþÕ˜‹ºëÌôû.”¬›óŠÜ8`¢5iL¸„mM½“Ì^,ÞÉkª¼\,ž||ä-£{tHŠ G²‹‰R2WȺ&ËÇSVqk?zÇ<|P£§ìR"àèͱHËlˆu‰-ô™¯Bz%¥<óÍ€Þ ÀôJ4±þÙmÿßÌ÷yüêùÉÑ/í×ߟÀ?/^Ÿ_µ/~9Û¿xÑ^y¸‡H.9çÐ/œÌçâ¾Ã¼øe ç#÷ž”õo—·°V:qäéõœ²†`®n"µ7õrÏûšÿ7xÖo°i'MãÊÆ­hWf†?Ï$ÿóç™ü£Îä|ë Bã"d<÷Š›‘-¥#XE‹b™ã2˜½zйùÉ ©q ΰ…;eM|G*“È®brÝêÑP×ö áªG¡öb<íÐ7ÎP¬ì•¬MýÊÑ‘lÕ9‰¢SÎQº0BpJï.³ª‚žmV­¢’÷·«ÊÜr¢oãfí±™K¦ÜÑ1˜ †”Mæ´jcUa®`íDÝÛ9¬¾8(®~A뽜~®¤1ÆÈÆØyd©P?‚N Zï…P&7¼ú›4ó÷.¹>”K ­:¼ >ù°/ Y¿ìÏZŒÿŸJÿ¿¼˜~ÌoÜáÿ·½¶áæÞØÞZÿÓÿïøù¼ö¹ð0GEE©d8ä+…'¡öyíòfo¼ÿöŒŠçÜžð{ ½KϸÂY~f8 þÔÜÝÝYm¶V›ÛÊež›HþçZ ?Lʦ’vÛvÉÌÄFE¹—šç^æÔ»­©Ÿ;yÂÆh — ’ev‘¶G’(…2 Dý˨ð«ÒÀRpç±E«"›„å9(1×jÛ Zª ƒïØ4[•go_Tµ}eåá@z0º_±¿@ðQ>6Ô±Jû…š¯†ûõû¨ÙÊ[6ÇŒ_nø{lï÷4½[ bƒ8™õDÊ\óö27_f?µ~¾%òwcô’n13š^vó CqýígMœ?ºý¬5«•OšeÔ#à}Èà—Yï*†Þ˜Ã6[cp8ŽÆ¨W7ö”½åûZq[¡™Ÿj=øS‹ ã¬ànè8ƒ+èÔ>ÿ8?p<ð¤}¤ÁJ×W\Ó‚á}Ô¿kç«‹u²‚Îó{ö#TÛUüê¦òã•€U_[оõ±¦©3x‡¹vÈ·ÊÈÂ>'BïÏš2Þ,4pñMK¾‘q%›ì-sTU< V1†'dV\>áGð³†!+R½‰j]õ¦Iñ2–1D¾j¹D ­e d›ul%*:G½Øp^TbÓiÅø×½^^7•â» ‡³*Ò+ zþX{Y:WH»Ê¬>£?ñ˜Ý®Ín«XÑ~O,â¨ÿî³à2 z‡yïу†ÇH@nJ—ÚwؾûÀö½¶ؾÿÀöƒ¶>°}ôÀöoØþêíã¶=°}òÀöéÛØþŸlŸ=°}þÀöÅÛOØþúíoØþÝÛOØþ×¶ÿåÞí?gmu{"›TÈès.KÁuu Nzìéþ¸ÿÿ¹´%Êibþïö³uøßÆìóZ_¢–EhÞ! ÜúÎ<ïs®‚5*5i'Áà0¥òFh‡xA· ì Pœë~C*#§9‚ò<4¸˜Þæç—#ôÞaÿýgëïg’]&)³SŸm<þ\êÍ­]à.b#²‚ðS\[;m òYóîQ€ç"¸¸§eùî®ñD¥Äí¸rwǬ²ã—wwDb_:¦÷ÑÕÍçgÓ>YܯòpýOeÔæ0ë$oÉ3× òXo AQK~Ïâí/ÓLÁÚxEóâúAÍ8ú§žŒq(ÎÏ_ŸËs£ÏŠè†‡äó Ô8sóðèò\}¶á #Ö…q\Ý`£j¦Uß÷y϶¸ž?¬Dó­bŸéþÎëðymyîDâùóÈî”RA2qÌñÕÊÜ/eó¿„XdÞw¾JÇab|gîgrõ™ÿ=XÂX;ËTQ¿(ÂÑÇñ%AA½4€¹Kr„MÁRÄ-è/®‚ìÊ(Ê[ƒ«,ÿ·®þ§¯ê‚±„nDÕ„¾òê÷+v†jAWù¿N+Ÿ³BbSýï^Ce÷Öš;ÔÇ’Ê?'×矉ܑÀ%­Š ŠÐ Ó“§û¼J9 f‚yÌXL穊)QGd¡Y©–£˜2Õ@®±˜2X«Þcx܆~ƒµ—¥¯ó`üy=ÏÏšˆ`*v†Ö:IïæIHû©àðñ·Þ;e{?Z¤¥a2Vnô¬ûqw?ÛÖ>{Õ%wGü¼õMdɵ٠vw±á]þ¶÷_—áÏô&ÌðÊh«@½Àõt¯àøˆï@×½K>˸í¿íU¶ò8rb8¯êJå‘I³h0΢Q¸÷› ?hÓ‚_¿MÒ8䨖•_þÇ^³eþý þn¦-K¨We›GÐyÏè÷™3ÎÎß¿9Î“ó º†šZõÛKˆŒWtšáZ¨ì$¼æô“o+»ŽqE•ÝðÍ$zÄpðÄ~Á_}Lr4Ä4]p.¿½N;á”’våŸ{g˜\;»æ1~`6¡ªs¥‚ΫÄ<5g6dÛµ-È/ ªSdxv«_övŒV"]†Ýä1À_6¡³R¼¬8}ê !Sj¯BÀÓôª¦OWDú³là™÷†¾{YdÑ5ISâ%nõ¿EI4aösï8²ë; u²0¸â†x$•Àv_EãKh‡ÿòû~Tìy¿ ·ÀðLÓ/FA3á×T6‹Þÿú­î¦}ù"©ûB×¥‚X s`TVi• àÖhêÁÂCœÛØ$ä±–nê¤ïÄäÓw*˜ÆY%¾‹” þ6ΰ­Ó‹_Il0û©¬ ˜º‰zÅpÆ'“V­[Ñ_<œ¬‘D9f€¼ƒÎí'sr’Û3æ!D/±,göV“[íŠ,VUŽÌà½1ŸÈ¿Eµ?ü,½ÀÛFÏJ¯Tñ£*i4,&c웤B1s ªFæ®ü^~K¯K_¦7zŒÏk·—À#ŒýùÝ8¾ôfU#cå(žùíeÐëa’ÑÊiù4¯¨ŸLF—×àa§ÁÞZy¢ V‰9âMVÌ”¿l¬93¹wÖJuìœé’ ûA¿ânWÞ?c/¥"qf `^ïy§´üéù§UyÒËoݺ>Õ¥S;}),øRÏe®Vò&{µ'Ü$d{ê¡¶Îâáñìþ0ç…Ӻǽý’@Qº¼_VÜ^[,ÐüÚ?öÆ÷뽦ùç7{ÖÛÿØ[3ÿ¼u:ÏèïÏõƒKn äޝB†§Èdà$± £ê¯(~ óûæ³&ü×#6þFO¿®ÞËÏlæç•»ù¹ÃÒ ɦ8ÛÏkß𷱎³øü7ðl!”ï!~µ‘ì}®©‹€ÔG\–z׀ςÎgŸ5]Ï‚[è0ûŒÁ®è§è%¹îÇj3#8x3fÖð9ûˆ_sQ{1Ù~,]¹òYí–W«Ý¶n)²šK˜»¯T:÷Ê—2âg~ÏÊ7C P3bÕcQذê̽ê1§ªÇYØ­zL©•*ž«´Kïð´W=OûUOÑZSñøóT¾ˆŠá¼/‡ÕcÁ=ª†ÝÆhD¨„\U¯—CMd ¿;'J¹\%w*g[ = £©üv\=§(éGïæ¾¨<èIÊ}(¢µ|mjž%ãIñgdÆÿÖŸRü‡*çgáG*¹8þ£¹µ±Ýtë¿o­ÿYÿçùQ9˜EÑ,–Â^„® v?•ÕD–V6›ÆA2˜`’fLÎÀid¤4Ž5‚dù›ýBøŸÜ„yáÅ ÛÄœ]¢‹>,T¶²¿«PÒq?,PÉÅ")1\~9‘ß\>¿8Yá,aI¡K Šº˜Z5B\Á[æúÂ'úSi„nš\‡ Õðy•©Ûsªd¨)ºCv Áˆ: ·‡1ž~þÜ[&ŠÆ…~ÇBc…ÜñS]a¼¢¤Nf«ÄaèS"çò¯f($°VÕa8ýayƒ+eÑ‘ýÃà zrúý ÿr~ôœþí¬˜¿¯¸¯ª=ý"ÐéäxycÅèÜ]v)UKð/L´?AÇc¤·…÷dÏë|ÙÁZÎ__v©p÷zËïLaºQNk•G‡;PO\ÁLTXç'8#®~,Rz‰’£¸Q¢l8§ÝÇ D`'#W¹H=-’òÒà8'Ç3Ul•ß²xì1\vÊñG¥„úMk
’¢4 Ï'#ÀÙq8¯CNå*j±SºfY"]n¹¬ÆQ¨HMšÙZ£ñrf|3j¦‰pÊ¢v V;ß¼á¡j€]¼H¥Q] 9i¶ªB¾MÔ±ÇoÀNÏhK¸ŠG@y‹Š„²è{ì'Ù8ÍCOC§An,Ý_qy.àÛ•¤<¥±¨ÕÁú]Vɨ” h—BWQ¾é› 2XxsËÀÊóÂ!úg!åÖ‰;;²nkÒ“ ±^¸ÎiFºaF%F…"9ó\^E#ÿ9§×û‡t!žÑo[xU¼µÀ8\XF혹vp 2#+‚Êǃ`„£1krxEÝW”½ðŸ„>&ƒ ©ä8–¶ 2·¯¹Šz‚ñxrƒE>LÄ>Áûõ3ŒÐ 1}9êG]<ì¤Ç»Â%aé x¤§ôòèW9À§ý>H¦¹Çˆê£s¥Òñ„±l ¢rÝ‘}«TÓW^Ø–SY™×÷ðFãùd<Æ´xxWiTGVâ•·òþtÐ5ƒJäq4c0ycM¨?숸ÑïQÃÌ[ðQ@_«¯¾[A¬Œ^Ÿ”v6XçÄ×T’“óðÉí¤†=? Îs†ÙGT¨{%k{XL*ìNäüIÀ5ªÙŽÚ¯ \+Ö±G«ÖW ¦øqcŠ”Ã¼ÉØ0H(M4—AÉSKÑhQ4>×ÂD¢N0éE}*™RPA2 "ó$¡‹Î )i>¸8Œ¼Æu• Æ…Qâ©nÂ¥‰5å¢È1:ªª•L-&îJ˜FÍ4¾1‘^y^ ©#K( Ñq¦‚6`\R¦]‡3X"¬6g”qÍÈ\Ô V‡MÙ2'#IWS–«ÙˆÉ%ÿŽ~:ôãgOýÊd‚í{f¥B“îÄÐ#ÞaJˆAéá\%)æ%è ïc…’D5?Œ×±‹ñ5¼gÎ}•7Õ˜…HÓ ‹R]F#ôÕ­âÙìRѳÛqD;’¯Ž“–cÔÒàÉ0gH)Püì½QI'p{©“Ç0éFhº%‚ ¶{€“àÚfâà`„Ó©yT·É$u5võ¸£p”2°Æ¤1àê4<1M&]ë8"œEo ­B¢EÈÆ^Ø3 ¸˜¹8P\«?‰Åž«)S‘Ž›_ÍÜ™ªø³§Ç Š•øY"â@Z±xZÊQžª° œùŒ ªa6' Ã&F% (y«Çœ—‡#Z†Q$½ĺ÷2ÐUŽÔÅäˆÓ¢æ¤gÆ|rzœ=\”¢3ªìqé+£áLU@§ ž·8g Gp09·Nƒ/}«ÏÁèÄ!Uó‘ªI1 ÂÜ­ðÔMRàh Á훚ՙ4à ë7\,גư ~ 4­|&z•|u9ðØÐ(øDà",ˆÕ™ \\—qŒ¸8-?ÉÜ2‰µLIz%»ô@„U¬ƒѯT“ ĦH0 ‘Ü$ŽƒGÀDÌ©ïäw &¡Wï¯]ƒsLu{B!Çð\(¿´§5÷™®–ðœË´Ý¡ïŠ"`æÀËd2Ã:­æ´(±`$Á s³4¬:dflŸŸØ!>€²Tœ±" й›¨áef1§ï³Š'ÏëM2® Pb{ä…7KQê .·™“[T´ (W.ê!2+N°—€¯²PMøŽCCœž^Y3ãDª~ ÌÔ˜ ­à¼´ƒ€ *gjŠk€»—L0“b1b&]¾ReµºGÉ— ¥Ö­s^÷úXÁ“Så,xâ2zHæÄ³ üšæ{LPy(reá2smŽ!€#¹CdñàtÔ À)x‡c§™Nº)Ò:j®Æ”N¦|"Ã-OäWX'UÃ’Ž ~! $¤|Äb©.(oß)Ê™C…#²¿@J¥3¿‚…&)€aR5(ÈYÂô¤eÆÌ ‰h9_aA[¨Êiü8É `äbþä[Ø>ÓG„‡‰ )Aæ`¼HsbP¦¿)aÂãô£wÞ8ÅJµÄN¢…Å5Ũ:šÒ¥y÷PO”Ž9¿ª%2J¢Ë ÀXð¡u1ekÞ¼]Y•n–p 3ŸôR<6¢ŽV®*ìÙL¢L•žÏ¤€,N/  ¾Hv=ôV琢Oä fj!ˆέB¢ÀÂyÃ)wÓ•I( ð‰ÌÒ”ot,8#¯î—¬_뺠ʙ¬Îé‰ïòË$Úi Nåž\BØ ¥û©f—¤!ù5J¯urUœõ„ÄMh óòï™`EöÀ×å.“°Cð"*3”0…ŽºTÞC b¬‘ü(Íe©9“‚åZ›È¡ÖÄív{s-@’ ( )1 "ÄÌÐÅ4WOׯпñ§6qôÄŠ³FEŸ‡¢ArUuYW›È üÄÓܬ!™‡’±ê"è¢ÛoHו¢ÚóQ¸Ÿ ®¹gñHòÉÌ+Oxª[Œ¹Zƒkʞƪ¹P ˆÅgg¤ÚHR=wÂÏ‘¨e^3qüÅñ‰yED{<*¡'V +Bkøè°ÑþtÉ!6’uäfˆ ¯†™¤¦À|$îÊ\V´ýÁIÂg1k¥®Ñ/‘hÍÆ ö‡BWkã"Ï\NÔðÍli[r¼:ý«!G¼þ(h'Q>ªK˜]˜sÂi*«,e¹‘IJÏTócAïí$/F¢$)<,"—5ÊMìS“çÈÃ="E¢VJsÂEYO7Î'!OØ”…q"´õ†ŠJ²e*ß2‘EøýaÊþúÃ]-t£“R@¨þ0™-kÓI«É†¥R=xýª}1kÌEÇ…°0Ø õÓÁº´0CNÁZ6 <©U¦üð ŽÖ=šÍmÖl®Õ³Öügÿ³±¶æ5ÙJ)é°'Ôq´1ÊŒ %À 5ŽÖξæExû˜üÙ1R¡Ý6„êZéz$E:gÖ'‡ûzÊ·„ÑÃåŠI×qÖ+¥L…Z#uÊúPz””Õ±ŽÞ2Ƀ†^‰U„šUPc"Èâ´cr(æaQ3ÙÅ¡êZ­RÁ™‹bé¤Ü=ÜŸYSš8!"æ“~dþ2Š„æ‚¨aC¾4$KµŽ¬ª\¤(p&­@ðˆ7b!^}pÄÍÿÏÞ»?´‘\ùâûkú¯¨ÌrL„0ø1f˜\ Â&‹AØžÜÁ—i¤ôXR+j Llåoÿžg½ºxâ8ûÝkvãîªêzœ:uê<>§•áØ.rP +¹¢Ò£Êx„]±ì$  ðzþc B){£pôúâÎ`8dž+ÝL3Y러¡}RqÚC¹ß—Åa“*_ƒaí 4;ë°oQE™˜xý¡Çí÷ò‰( :Y,I}L£–®uºSZy‹_ ‹c©¿ù?Å#¢bÿWv¸BAå§ð¸Ýþÿèá7×#ûÿ7ëž|±ÿŽkÿJwèm½û$ra݇yš÷$ž¼E­_ŠÎ3_àê°¸ íZ‹“ÙÓþEA—À2P‹XP3yb0ðB+äx5(QˆBÓ®¥›jL¡_‰la±_ÝÂDtÛÊL‰ØŠD¹Êzº^ÚAb®çç)qÚW¾AúJ‚0Áã²aŠ˜¬“X­S±3¯UŒãYÃ$tw‘‚íö–ßfšºÃ­ËN1ȇxí^=‚‰ZéêŸl"e/eôÂàrÃNFiuIÇ×MI׈FÆ!á'sµèˆ|ëN39@™jakÁ,Ȳ~º€9òzŠÆæVeK^¨$Šá:`IZ€’O[pÝß2¤»³›ÂrIO`µ“…‘<]ØHðû:ïå/ô…jWð±ê7' ›R‡¼ž@“Ô—%joÙM ƒ^–WE9ÀmJ­H¶g«aG :ôÒ´]棦­È‰Âˆï©9e %ÎÇ«ö»M ˜±‹Š‹È6—%Ú•{°Ğyv¼uôülïÅÑ~ëEëàdëdïð`žï¾Ø;Ø:9<>#•—sÞ)Z¿î%!r#¶7FÜ ‹Õ$aZ …ÆÎ5Ë[Ú,<ãÙŒÊäeEçÉÚ¯ŒQ­Üîv¸NÜŸ?yùL^0 3³‰5Å<&¾›ÆN0zl.“!výŒ.›ê<íQ:¾÷|±Ø€R v_‚ßsÌËa¯êß^ííŽ' ~ÂC¼ÇOá5bÞKîá™dWYò:×@]l£¦©e™×º±Wÿ\«ž3ÐëLµÎ° Y Ü}I†I¯¾¬1þŠê[`=yÖg¡*pM`<{£¨ImCŽå[’@µ1bú&¢B&é—eæ`üø–ÌK¥Þ$˜_‹7jÌÃýF—ƒÛŒæ·Õ:XÐ+±æ™âƒÏ+ØXº°pë¬êr¨Ém5-ÕT•”^v 0oWS™|Ö KÏ^pþ¾mD[ÐÞÐ]:¾N7É-BŠ*â=ªfs˜Oá_ßN«ñ½ÎØIïÒpvNÒñ¯)ËúûÙð"â]©j<²Ú=7—>¼úcëgáß——䎭™9u)t2Ò>œh¥±­Î[(`Ø2MZ µ¦’Ѐª˜É¿Agr6ÊÅkD63v#–ÿQ¹ÕQº±’üë8EâsJ2²å ƒ7:\©.I4ë+?xO¤‚¿ÏIé#í°¸ƒö”XŽhÝD[xP厷JÚ¡§¸ ~6ŒfåøÚ¸´ÕT&ù@¤ºþÍ™×Ô}«#(æQ: »qßê¥úø-›úèþÿ¶ê’)â • @4¨íø¨þÃk Eå׆YXúÚüc’?£Öáëå…¸ò¶È0|Ó¯qÏ*ùÈëçoêæÈûêý¾9úM#;ëwÒ¸Ê×uŽ?e+~D=ªF‡ZÜE”cª_¢·–¬ÔÜÑ&¬ï‡ª(dÄ“àgk†ŸÓYÌ‚}ÞŒ¨&+¤²ÉÄ8–²´6ΖÿóÐ1eð÷1*œáÖ°üÞí…s¸gœ&Áî<=«´9§¯R]›º_kœß7­T×`°ïkÆ;§Éð5g̵mßcÜówƒÿ˜–íèç5+4wêk21÷Yo”®Ð—1 Y¬‡Ì  {†ªFªw”Ôj G +k –‘dK™[d qƒxæ³o4 ûúÌÍUû|[sQã5[³)Oý£àÆûƒ|è¶€¢%ÔN‘3qy -¿Ü‚,ÓDU›åPœ5øO=$g¬à g·V3ñéfŸt¸5 á’€7ˆ_LW*·õR«Î±Ü6ù&«ýƒûˆ´¹&mV5{Û2ðç†J: Yò,¿Âé*&+Í–J¦ïZvj9)Ù6PYã)&’<=Eþ Üxhvv—ž./49½£oŠñF6ܰlkvµMeÀÅhu~kä—Ó^QL°;ï«L1  æx^Oš3ôÔN·Y úŠV÷­-ðÜQÎRÝfrܻǰEöZÇíhKØ#Ÿ¬iÚç‘è%N˜FUsHC_ó‰O§½ÐœÅvê¹<ôWæ:Ì8ÿÂ’È|nù—Z©!d‘Òˆo”æ£J§€X\ ÄYöòL¯[ÊÄÎ3 Æ{[е÷Ä×þR•/ï!MU µ¿ŠH¹y;»²2©­°QÛŒ'/ž¾G²Œ®sµÇ{XöÞE}ñߨ¼ëÅ,f©v ­…J{?3Šû¯µCŠR!a[p¨ÒEc/oò°[Šâ-oÙiÍäÛÁ˜–vg£8ÁÒì*Š¢6%ú‹,vµÖÛ *"1êìÄÝL´p~FÅ«\ÐÝÜj/Ø*Þ• ïѤ ¦åDN%P®ë2¸—ÞÙ€ ´3qÛ·Qx²+gXD …vFƒYÖÑ#5ò*Êá;Y‘»¸è²OP)@UÁ®„7imܧ¨1Ô/ðŽ2æp:f÷w<å¨ã61©!W´ºÎ#Eß+¦“„.§äì> ]¸ÂPr’oeÉ65—°KïZ@ú€.â-X‡' ÛÆšIVUÀ€Ûí- Ä:ùû`I7©ëzÇ¢æ"ï¡™xØëc„=Ë e¤±HÄ6=ºÌVtëñ˜ØuuÔO;hŸ¥} d: {ÁD…â’)‡;ÍÌÂþ‚'X2I Òw9È#&!°ƒ¨§C£t—»DçÐ)Ϊgñ€Ù—“W®$â¥ìÅKØbâ¬OnÌÒ5ŠÀÂ4UÙE|ÌXÆ>Ôd^¿(ŠÈSÚnÞ%§}:Ø‚ Ýn6áùa'ú¡Á@˜! qüŸ(ÑøæÙ ά{¹sáGVmÒa‰#h[xA9–>î^žMüSsBá¹»xxtÖ>9~¹}òò¸e<ÖQ1CÆÀ•òÀ¿UÐÅ­‡IÒ’`îT«W¶­_2 šêØÒI?L¢²u6VúÁöÏx[lÌ?•é‡b21ˆ\Ì( vNÑìòcù¶_4*yÊÁuƒ¶hµ/Ýd‚p½do±Úö|5Ü•P—×Ö=îus;¢MÊœ©Þüž{bMpÃôŽæïcZˆn˜xô9ÆÈ•-c½ÿ—Tö·®Hüç2È'-Ï©Žbªn=—)+0¶.'…=LâçH'/ù®y¾ozÞ{Íp8É$‹*ñ ŒØRïŒ& ‚úÃ%ÒfÍø\6Mt°}²¬N²wØ_¤þ¾:†k{’ÄÚá„JºÙ;†ï ž€•ì¬ÝtúiYæte EªE }dãîR±œÜ…w'ò¹òTÚÎ Âv ‰ËÃX™L\ÖÕÐ_RØH¡5` t<Cz)» ä’áŠt†¹è,ñ¤ÓÔ¯ŸˆZ¦ÁøËB]‘#ÏY[aK¥Söš´¼IZYŽõl­¼âL‹‰ñšSTQ)Š)kÉšA_ðü#ßÄК+ý6ƒÜиaÝi&šìÅ<õMÀ$ÔQÈ-Ú‘ÔrÇò®G ¥bÍõíèX®ï£USOÔú)Œ1„ºãçÕä=Å,9è’æÊ³oËHHxž³–óÏȉÿ\!–N2 {0ãŸñD e<­d2⛲ ñò´Ã¤FX0«v ,3Š7Å_½^Pè¼ p®ù_"Iš¿DÅ¥»ìÁŠX4%ÆU ®iwÿA¡!bW2qšmÁ ¨¯áëSÕóv‘yáIÐ}Þûº~9v¥Äç6ˆtL›Ö­²|”¢‡·Iÿ_+ª(Ùx “uQ®à¯±æ&É+á/5¹Å8ö¯œ#~–eÊ2'wŸ{ï:*F¶™¹š›6ÊÛgí½ƒgû­³­v{ïÙJ£g»‡Ç/ü³†³"ƒ,•ÁC Üæ•÷G‰—C Üê ÆÎöÎ*ÅÍX¹’&¤ÍKòSŠTÌ:0J Ѥ]ˆ† IeHV’ñœÉ©iPt§°| šÔ¿ArÃq˜b„þkà½clƒ=ʺjÇàÙv¥-æÅ B92ï'×éMù/ö–(K ‚‚`.8w1r”Ï™ŠiQ¾u¥>^Q•²L´I‘ ö1\<ñ¾ýÚû—Gè9‰œÏýUü]}Å’jç„›ý8Å肵vƒ.ÊîïÓYh1µ2ìÝíç:Åè†Çµ ƒ~¥r܉>F‰VVéí æêiGîXÛK¼1Ÿé$ò—ƸÑ(œÔ¹8d–ݰ}t…óòŒ0 \[0ï¸.UW\žbù2å6«eÊÉ`‚eNßóƒ YžÎÛþÃóâõd}¯_”/댈‚" `DÕÛŠWûŒÙ÷]÷û3ÂýÇÍã7‰êæ–öµæI$ºŸøüÄÖÐë߈›%Š™†8\<‘i©ô¼7јíÒ$óK*ÇaÅUáRçH{&"žÓ½IA 'ê›QÆVtˆBýÍt`)PF\Yu™\vÝKâkD“ûб_ÖˇÅpe˜]þœ|  º†”?[Zøia;çPÆŒÀu°ÇÙ[ú ¯IÞÌšÿðÂIí †pæÙ‰™þ íf²‡¦LÓ„j+\RÑ­¤Ä0ú†“0$¼E±Š¬Öá“à¬`«°¨=²ÃOñƒ~«_i6ÑfÉ«ÁwÞŠ»¸ÁW—àM™ì˜µ«ÆœyÃûÎx@t›÷;C Wän@çCbÝ$Ñpà¼DŒ•…Ó@©r[¿ŸˆRšµŠÆNB ÿdDÜDä2å+:92!q,QÚÇCR–›r›Æ²ãc8êÛiĹìÚ$‚¹ƒõ8‘¦7 ¶WmYà,j÷ÕÍÈåúÃâs9dƒœ‰[`] ÌÿN@ÇwæL™ƒx')/ÑDVö¡‚G±Õšè –ÐBˆË2Ç5Ãf鋤ó—阓"¢Ì*d´Ï­K¿ÇÀÕÆH+Ö¬×x&kÃ×JoïÓ]jÊh¬Iê`Üb£‰$ i*±ö_t]ˆ2dž"—Á&·‡)qÇÆBVÂ?xäõÓµ'Ú\¥tßÀB²‘ýp+ƒlh˜|k‰3£¢ž£|J32*º5Æl$¼<1•Vý-vZ»íÕ½—í]œgÉq–÷hn%^Ïósp¥Ä€²†Ìƒ‰3Üþ;BI1ç9Èñ+b4aÉÛâë5AŽ‘„®7¦;FáŠ=s#÷2U±§­Ö| €ÃÉùTÍÀ ÚÇJ0@ª³´Æß–µz͉c–ä–-ϵ=!?Ö¸ “¯²¹:[;íwóíêlHÎ4‹ô±‘ýØ?––µ¾Xe)h†<2¸ù?°/ÆÙûœE[Œþ+£Žèn)“Pÿ0J¼Û•ø˜à•äb*Ȫ¾3żG*L öö¦n*\ƒhÅsQQ¦¼J9¤?ê}IîH¶àuKB3—”Ä[à™½=²×§šUšo.èY0)l ‘Z{!Hex'SÓH=þϼüO,ûi²?Ý™ÿiíá“Gqþ§‡|Áú?ÿiËCv€¾Ô6b9m«…§$“2‡Æ?÷ ýÔÓpàI ÇZç-›˜G™e2Á!ÖÛ†ÃøðÆŽô½Éýz.$纴%:™j‰qa\Ž eŸž+ÔñÉþ :†>GZE+(â ”bœä±Ú…&©PD2AåM ý$cÌd0¦r'ºçÖgXôUÅ$`¨¥¢+N,÷/Si ¼‘¯,€‰L¡–Y_¦j¯.{•|¾œÙ‰ãys=‰!io¨Câ¸ËÍš§Ò›úk‹!‹ñ¬®—8Ä•µ8ìÑøÒr ¹ l~= ž$üↂª*ö!Ԁ𲕪‹ ý옣ì‘9‘)‹*Ñqu9è{„ÎØÑÝ©Ñθ|FhC ºÝ1Cÿ§š¦)oçE?ï¸"v²{9]1“eh(š9¹húKkU[V,ÿ¡Òïò$ß £ÔŸC\” ¯’•˜ÜrI„&i{‚©§›j ·Ã!ƒ sY:¨7ö {;ôÉ^…'èH­¹Çºm- v6¼D—>ºKj"#e_ŠNšh·$|6¸f*W³¬l. ÷ *[ÏM®kGÜðJO¸¯è’Ö"™Éq\ T´¾Q–.Ñ#ê»íjüØXvÒ~Ý¥m±½ý£ÈFˆ| æ V—êÝUôÕþÞëÕÖÑÞvx6ØZÏ€£¦½ŒR~påm ® ‡8ÇÇÙSÍ%@œ ‰yÃÔ¬M óT$ï -g¢Ìa¥A„|{K²³Êw:Y¿¯ØÆßI“ÉÔà\ñ,Ž|#èn—lE°Ã‰gàé`=n4½\å›’òÁcÊ2"ÓùìÒØã¡XÓ=NÕ-öèÁ<3iÛC\61:ˆajÞ—šIˆðâmV¦¹"e¶JF…dµOaÚKÕ¤&œ®‰ôe¢ç´=3•®Yèní'ù1‡£ù3¦ÚÎ vÈ“k²£”O _Ä Ï/œ6ânWÜš†$B‚;ØXq ш9«ÍrdÓ‹ 2/}ÛŒ iy±œ#yй"ÇRJ}!Õœ… g¸cÊÂÂ9±´weæò¹¸áŸ)W‚&à¬"¯‰1¹ÿvn^”!ó<ÊPФSlUÈ.í #º^'‘°_–j˜9;¥H¼¶ß!Åœ“iX™«ÐF¬’5ŸT5ìôù SÐ0@5œûFö>§Êà†dÏO0`™ŽÛÔ¼:<ñéRñÁC/­^®)žÛAÍùÍÒÏ|›€|üe6"¦3HGŽçÀ²’T=Šƒ¤†MlM£Ô †˜£Äm|rid0ïßOcˆ—éOÜM`Z™eÈûô‡tSL?.•Db,©TÛU~k¦åTÚs¦q+ó•àâò¥qÏ•ÜrD>‡:Á£¥Ù6¸ òÖIçP.—2½d#AEˆK6X¿ça·¬")V,èmóÑWj)«ç¿fl༸œ¬\gøŸèkIp;£àkŠ¥Üœ:(”3X«Â&Ýøò0³×Á˜<ñ®n¤; Ýârí{Ö[æô ñ >À›¤ŸŸ#žiôŒW)ÆíjÛú°¢<;ÍT2ÐË<Ð`$+ò’Y^'qDÆØµVg„€ž¶ ÂLô®vÏ’¼s]Ä4À*7I×<´6ÑPÌV%&îïhù™!î¼EŽ>ˆ¾Ç HÊ#`þâÅÌ$¯'Çütꀠš Ü™„TÌÇR©Ê…á[%~›»¡™´V¿¡‚ÑXICM7:÷A§6.ì.‹´rle´‡IM{,ÑuKöiø…*÷mÜãæÞ—]×Np1wçJ¬|°ÅŠén»=þ»unÿ~*ú_tJì|*Í/ÿÜ®ÿ}ðèaÿÿñúã‡_ô¿ŸãÇêQâmãÚà ¸óÖ´†]Ó⇔ë0“œ„Ö¬’£3[œÑÔÏ‘¦ÛøgnïÕ·o ç$ÿõmå.,GvSÒB±ƒ^¦á ƒ’œgÁYw€óØ´óò­¼Aíku^ƒßŠ©X{‚ÌoF Îà’®3ê20ÿSÌgóáõ4Ìÿê­ã?(Ý þöðÁŠ äÄZd¤†IÙkažãbŠY8g:yéë!u þ¤Sà±5ê£êy_ýiîÜ$󧯳G´ñäNLÝ\&ÑèmœDR²’rÛ,þ}Lÿlýdöwà—“Ÿj’mÁM°ÁC`Í•¬"DÐåâJò3“,¥¢ ¹ Â8Ñ,¡×ݲO^¾êtÞ˜š†1®I2ÅØJ»Rë£*Aã7fΗ4¦ÉU¶õžR-£‰s½Âö,§PjD.Ê;QÝ£yu݇*•+‰kž——g2óíl2±þð[\?âkG[Ç¡‘”º×íz¦ãQQfKHÌ’lƒ‹X#@žŒ–Zn¨,qÍ–ÞçòÜm§{y¡ e¹QÙ+óy]Öí,Ò|,ŠdÉ’>,ªÑ’6 {è H\zNƒ,± ´D½¢& dï•!9Lä)‹W6[¶9JÀlnž5¤ÎîRȃƒÖ³îU ȳ­§mx†êô‰Fê‘Ìü3!wd¥/—xð1BÝ1!ƒ ˆ,SÂ/˜°¦—ËX4yÊÜÅé)"_2²ã¨àk%¶NTù÷l\$ª?«—×…•â2ïI‡CÞÕ0ʺŒDª+›#~«£Ä‡Ab.Ðv8ž2³g¢ÿu2Tö(%,˜‘¢“d:LónQ‰sâ»PĆaŒ»×)2MìºgûàÐÅt|“µNIë 46&­YPmbžfÂ'\1À@Í]eÍ+žyÍ;÷ñŸ¢­ÞÖX=8caæß-iý÷ü©ñÿÀkä ½Ÿìp»ü¿þä!Èü‘ÿÇúÃÇ_äÿÏñcåÖx‰·gæ”Ôƒg稂ßΒߥx÷r¾jÝúbO '„[’m%.Ë¢Ÿb‘µê”l‹ÓRrmñût‡HþîrÙ·ëK-–ùL»dû_2J4FOdMeuC°©¢ËB”x$Чp Á™ÄÝ.‡x/dY¯/oüùN¾ÌéošSOëf8ŠS”wžéҳѣâŽÈ1„+p¯ÀýkâAñqNW<ë@þDÁ ´¶ú6¢Šúx™¡¾±ƒ2¾½w‰Á$)ÿ6%…r¡6CeWAÏY7Á®§jnÁnv¦c:+=©zØ…#–„Bt[—|¶¶‰Ž’›LK¾éŒŠ0d}Œ‚š³NßC Áib5\6Ñ+jÈÐLHŒÕéðÈHlt.WóùêûØ@¥nI Î%¢çÖãPki.‹ëŒ·kÞE§ë,éô971Q¡ a ŽÓï‘p±}ÓA[ˆ…Ö½ÅG––9’Äuzãï¢Þñ…—}Ð#ôÄ c(E¾mgÓÐW€Ÿi šŒq÷ÈN†r"-¡æ,È¥n#R¼~Q2¡YCĽ]¶ž+Ì ôG“[`œrÂd›xǧß>˜vë§ \†o™¯ ÛBÔ±*0îLž$òvÓ<;:f£Ú»´±Ëõø¯ímú ¶Ä»‘ç|Ìá)AÌ´†ñ`f¢ÖÜ8q6bI¬_°ä¾¥€‘”}û¦C†L±Ý”yK$+ÄþRjP¨‰‹Þî‘!÷:ŠqY–'U.Pc…ÀlÆÆ}ë"Y:šBËn…xÞqXK»‡Çˆ;Ô0?ãœá- A³7)ø¿°ùGoæ¼èÞ,»Ùú]²‹‰£ôùD“’‹Åêk´Gˆ>Ah14—Ц5%Á…’Li“I‹ûˆyÖ¡V,; B¹2çΞ^nÂÕÃQç„ØÐµNpvîTês"Âjç}Êy´çOÑé{œÍF nb<ÌÌfÉS³y~:[öñ®’×.qvO3Lf çœ ÂNª%Ng²Aëª^r¯æä– Ô‰6DÏ”(Àw7x.Ù¹íÆð[£ ÂÞúh-Mó½&Ó!á…4ä8£V:Ä¥ÏÙ/-- ú1*µeÜÇ÷§“IÂL$/kkH‹MR‘Й¡üÏAã%ÜçO;‘y!Þ¢GEÿfPŒG—PDc88r¯iBÎ+l ÖµuÐÞ;<Æ[ÃÓbØ`æ­fpM0H!»¡ôŠéŠ6)¾+/-‘,³E Åβ)ßÍü¼êø§Z‹ñäÉRdܼyD³X*--Žío½ DÇcÖe• ajötž† $x'Z_§ç½—3Ä߈‰›OË‘ºY§Ÿ¢–›ãynß‚lZÙ€i„YäI4rVÈödä4Ü¢4Û“‚ÿ‹{„CÒ‡ßÊ Í“bBú’" ±z1YÒ)\$õ*©*kÎÉü³Î¿¹ó.>ñ8™=×Á3pñû :Ût¦5 eô ã øt¦{pBÛŒpNx|uÄÏ)γ$ÜMÌÜÉ 5g—\ÝŸhÑ ”tÎ$D¸yå­Wª%–'¿÷øwKÃb‡Îå>ÞÜ1:å«Ó@v3ÎùÞµ6:(4/â¨ö¦£üŒ(|{‡„&IÄnA^D?SmpTé˜C›ðPŽp‰šÆ‘@Ñ–'%^)C"Þíøž¬–Ñ’ø÷(öC !Ø&ÙÉqÔjɵˆ]B°EŸ&N8h»”Ø.…ø­°ÇŠÒ"£²+°+oÇDmÖYèvZ=½Â['ÏðRBýº¯æ˜£BÛÄP÷00ð€!6á|nû”gÆ´ChÄ-[;/·[ÇÌù…r‘cõ F5Ò`å$‡FPd×éÍ+²½Íe6ø²P[¦=aLÔ âè_£‹¤¢Zûà5BÂâõה7a«‡R|Ⱦ.¤tØ«4èˆìlàâk³?Ø0-èü.Óköþ¤ KR£UÙ##§p e_­ÌÊ;­½!g–«èÝã´*;–Íæœ^{.¿r…=#ù6M­e“- Jy„ñfCþ a¸¾^°Ï%±Þ‡¿Öß¿¡-+…•Œ¼KpfÍÊ×XæGþ¶ìÆÀÙéw¬ªòÍ(ZÎߥÿE!û½ný`Ùƒjè,±·²bT‡ƒE,à@aY®[ý‡Å&­+¦ÍŠÓ–µ…yu-UßµFÒÆü^ ¹C#[ŒÏyÖ±Ø>ôœËý&¼ -ͧ>vøÒ @ôâñ7‚kEÔlÖY– Õá$ XÝj ZTÞÏÚ$ç¹È“Ò‡ñZ£I¬‘všì´‘±ÐÆ}=³7¦³íÃG3OR¾ÎH,Œedœ—.mXî |‰}CÃðJ’aÓá†ü-ü¨!&á+bf5½¬£iaÕ‡êŽ1’È´[H…át@Ê¡ pE'·^ùžRsïÃpq{ëk„˜2R Ñ^<ðB>ᜢ»Oês–$tÃZ;ÏE8Ͼ=*énxtûÔÉÇ‹ÃlÎTZßZLÉÇ—Fe‘[o†D™“ÛÀUñ–R¡ °Fjä@$Oº+ÊÞ÷È3ÒZ°? m7ö©·Rò)vû,†¥öÒÒKËK²¨[”fN~Th} ±Rh’^\ lnS6$h¯–„š›X U¨Ð¹¤ÕÍËÒÖ¢€µ÷;{×RI¹þSálµø64KÚh:nqSL}aq“ÀÞkx³ç[Íy;ºùE>Iû ÝôûZŠ.iTéNûh¶¬^èd\°–%‡S"X¤=$Ÿëbü¶)îw×ò"Ô­D ¢=íbÔf10*ô_˜¸,v¦C6áÜÄ0õ ›9iE×eVâ# –m¬n8†  š•ä°˜¡­}ÄÊíú©(ÙË£$JÓ„3^ª)ÏEƵëÃÖ|BÉ:•, d’ÒD7{•ôÌk6yIAÎI»j‹É;À¤ÑF‘„·)Rg¤H̽œ¯róLr ’u)±@NÚÕã-F8dLÛáBÿqE𴪔´ë‘ö×voŒ6LQ¡'œØµKÐHÄ~nÁ‡æÌˆk½œø‘“å“@÷|ž¯òÀ‘²htû#5»ƒM¦àþc…Z?ÙÌ'ê…ª¡™(/eRgð[À3§_æfü:º'NžC÷s]m£uN™ôi³±iP)06çÅÚi6›ú§kÄ2jñ÷wX¾œÞßUqæiHc·ÎPõö”ÛC8ÔœÁÓs8aòž[}0+™ F“Pþò`wÛGL(öì—8 W ƒ17—¥¿s»H¦d÷®àT¥ÉX±‹îŽ…i { ´_¾¸¥±Z·vvDËä?m¿|ZóôÅËýš§;{¯¢§5CëaÏƵæ}§c  ²µf¢Í†Ìâ.}ØË·b—Z¨Yš Õ{æ6öºÎ˜œò¹¡¢·Ë|€¹™³k»jœfC3©8íƒñ»™ã6ÄÑ12!«¶—‡Dîoä%èñ­çÞmïßçÚÛÁ°“ÜnmØTM–G–nw$Þîð¹ý I‚é˜TnœþÑÜ£óQºù%þ ìrqQØ$Λ'Û—È„63 Ø“µM\›M¾x0» U/Ž!@i— DS׺r·`ý< @dó–=VàTä@Áű§fîÌõÜ-%ÖtŽÏÞÃÖ'Wç%<~QÉùsþfù;|;‹ùÔé°È9Ûµ¨dÈm+°™Èóêvíºpî*ÿ î3맸f‰Œ° œ¶A[]ƒÖÏ^m µ|íUˆI8…»¶÷_¶O"w퀸˭q* û’2AyéÈS½ûøw^%ö_À%Oï;o·‹)GÐØC»7y%vÍ"9iÛ"©º¤œZ„Îr>BgC‘[P“ð4¥’CØ$ÄMÌ"ÙHbðRÅ8ÁvHæ 4}®™Iغ­VƒlŽ õ½¸®~ŠI$§uŒý‹ˆõ?ì§"ÿ $ا€¹Cþ[{²^Áyô`ý‹ü÷9~¬ü'˜u‰Mô­ v–Å¥¥Žãd9dUwöܯM9àIAJ_¥E¶›%~Î5zmÏQ$;¥®¯”t1 ž´Ôî¼j’‘÷š±ôÐ?䢕¸!ê™gãÆ9¥¸+xÒ9š Ê‚CçäYì‚4 ­}૯Ðsš*ësðäô·‡=èºÁ¢~{ù¨–®R.d êúMÀ9çÕgÏrΊÅ9k@¡~⥛à VaÜ~Žâ<Ÿ¨p+Ç<Åu¨Ø÷C¾&m‚¢ ÖŒ2¨…¬h {ÍÝF𠧝fìB˜¨×.:ìOkNƒºãO¶ ¸mÑ&X´‚Ðsš•€m6œ•v–±zýžÐŽŸû€­ðÿ‹O þõwæX_{çxôøáþÿY~,ÿ–ŽÏÑpµ »T<¨Ú¤= ŸŠI~•*R‘yî™ýE çb—AVŽðÖ: ^È':ü‰b\&äDßs[N„k"·ÚßäÄlÉyD`yÈpµç›«’T°i²#µ0Iås!¨˜4Ò3p¥•dv#Øþò€¤$èfÕ$Âçüc¤ÊÄd]<9LáÔÀX¾„qy&T6ê2DE¢”õŒÚ.Hæ9 5³Æ†É\dæà¬±¿+ô>Ü\Ÿ7&Ù2Á#³ðnøOÆi±ù5äÓe (8Q¸èt¤hè#xŽ&Ü2YH×éz#}ØàT ^™mÂØ´À>]æ¸Ü7MŒÐÊ­¤Ò ©4HS‰Í6áFe­8> 3P÷×)EˆØœí”,@ÀDÍ]\â+ee²~N™­Èÿ #!`”¸9õE„2º6»SO‡C´gÍ ïvÙ­5eŒÍ¤{&®FË®ÙüKSY¤„ÂQÉíF(µÀR†(ÃÖñ‚!øNÞ™ö'7 ö3ìöÙë®JIw:®ÙJlÂg’¡€Á¥A†nÈÖ} DhX ZÞ󒆂ó¸Å Ü —åZ-̵ÔÃÝ„ÎN Z:¦À¸à¸o/ó‘EžÅáQ¢¥ µvH 0¸x6kà ê+¨æufý]¡}åÓ!ŽëŠƒ”fát¢¹Ô‚ŸÁœÀ&™vúù)H•þ®’‰– 9R3à…¼+VK³…¥ÍdŒD1¦5 šð¾7AAÖcX'rE¯·ôm—¦z\PP¸íªŸÆÏ±¦ÝCzHÈUúñU¼)H6@׵ޠE]Õz㟨¯²°OŸ ËH†þÂ>‘¢ÆšÁ knˆ»ÑŽÔeÔ(À¥ÚtTsD 'J‚óA‰ŒUXë%Y°“艇8áÖÆ í&cïF|¥$aÊ]Óç¯VžBzä…£(‘Û0õ¶–ûIñ0Q Q £^üødˆÁ.­¯¢ÌRÁäþ”ƒM©0ðp+ÆœˆÆbÂ×R‡®év0|›ÙDÎO³EçÍœ$¯²bÌÛT#—ãbzAîÓ$«¼iNæ4øÞ´Õà,+4œ/(¼è2¶I¾æ)BÜ pêcö93CÝß›JžXšÌ†ž.A”’j’ŒQNòD”HBAB OQr}ŸN ·æ’¸Û^Ë–8«Í²µåº+’)`’¯Ô¼Kü5LÙö@@“Søœù¦ËÁ¡?ÈËjƬqƒ/æ/>±Ì¡§ŠúVGu[ /ëÎŽI°*§Þ|ä„r§O­üê¶­tLŽkÀ€í ²i°çY'Å;5ŠhºdwØ6Þ¿ëœh i4¦ÐŠÄç^þ–#Ÿ77|¦vb=Ϫ–'é™–;aùvÜæ0q¶E›FÓyyôˆ”âQ¡=_Ó´²b÷iMˆaŠçkFðOÓÍ$ “©cs——J(0Íé4çÔɧ!FÆ1Ü:7V©"aRÒaÄõ»påg_3Ðð2`SYÚ¥ìòº±4¼Ôf˜ÙƒÍ. ×ï Ïׯ EÅ)BTIYT`‹«w27’1ϳ^!þí¾ÒE®C¦êeLÂÝEŸÎ¢Ý7äRÝﯨ?uÂB…§*ᣨ …ÕùãÄ^,•)©W<šñ±Ml$$ÊÇBN-ƒ^†×{Ó6„Ïîã+?»wl|f£FdÒ釗²›½êÖù6l…3étKè É™×d Ÿá‰$° NlDQŠèSc׸ÉCì8w’sÏåî"è4¦n"ÆÜ£9ï:(MÅ×JÛà—|ÿ¿ù©èÿËÃj>£ÿߣµ‡+þ_쿟çÇêÿxÝM[Ëf ’õÚå 8æ¡;¼ñ#_(ÐùÃ8áDà,È ÐƒÍ6L&ÑÌ‚ß1)º߉ð(c‹šŽ>ÅtRç ßC͹ðS ®, Êg ›q“Èè2,l6í_ª¤÷sXxjËs6¶ §ÔÆß¦dl0VH„Ó†§ó„ÎM¸K݌䲮Ýö1ÃXÍ&Oïi>€I{œñ­‡Á"yp³÷£œo?«£áÅê¸m½ ¿ÎÞCÇ.†›c<±Ùûk«¤—nÐiÂÎR}Z?Ô+P€H?IGÁˆW}+aÓ ŸOÒ·=¡ T»Œ €Ç‹fMë=̲n)݆XãËäVØ™\àî=Uµ¹ÄqêR¼«] U6¦t÷f¥$x£¯Ñ±3/7PÅM@E%Ó DáKÞj•·‚où´¼ìJ$$ŽuÙnÅ@`¼Ò|€Ã"°´ ™ÍäÉޚ蔳~§Cç¦þMpqnÆ·}9†îzA×ì¤Wy×<‡!g·C%alž@Ìþîž}¹¸«/ŠjÃnÚEoBHÆ»¨[eJ¢ "‡ºe3 xLŒáã<‘VBÙK”B¯xëè^q®e/a05‘£à9ûGî5æ½G[Û'·Û2 ùmؙ͟˜ŽŒ9`á—ÜHœÉcù ¼ÂY0¯É”6wd åe±ôb¥ˆŒlü¾ÓÏÒ±Ï|îòò`ûpÿÏuüÄg'ý¬7™ÌÏɇìv{¬‰,‘t -úWd¨`¢MÙ„g'AÀèöĪ#ï·»,R(ʦ¦dãW{©ä"âÏg²+²! ÞXZ´÷@»3—Ÿy;S¬ÿ=g¬¦~ouÓ†9JqÞ™ð(ùwjööö¬ég6øÐ‰°<òtìy¥ãÖ'À»ëŒG(‰ÁÓ.P¨ÙBtjÕà„½vf :’,†öÝv™ZQû~^Âí®=€)‡†Þ6€”oáÖEüóÅ>ó4ê/*3H‰ÃËbùj¥û´A-t:cÖWÎ[&M¥Y§ÌR&Ì„Èï‹àÿßÿ§"ÿû+þ‰.wÈÿ>xçÿxò%ÿßçù±òÿ±·ît‚¿ÂéOG+“b… Xš)üS…+s(i³ŸâQ?’"ûr2m¬®vÍsTõÓó² ''Ì`Ê3³z-tÁ$è@·2&ÀÝe]d?½A_ –.€"ÞÐ÷‹H‰i|½÷ºžÄêõöñ~³Ì—Œ.²Ëd¥¯PïUÊ²Éæ!I¥ÖºQÅ”½ae” K.2*"h"iun)Ûßñp/SÖnz³•ݺ”þ7¹1¥#uDÃ}Ÿ–ÖºÂ~FXiãxŸ‰©8WmõQÒ«ù`.Þ™Òë‘R³‘—å”}=dJÉ‘„´ÊŒ¤¿¸(–{;S°NÞ}µa4]jµðÃÒ˜6Ñ>ÃI”û<äÇpƒúñ”3pÈ̳æ”~Dz¬ËsgÝplèÂ:ìÜ8·PÙ"B+¤xgÍ-™¸0cÙ°œŽIHn)–“iÞG"³¾Ñ'ñ{IÂ2ó+êä¤V; ³g3+“Œ®ùÕJ—•ÐK;)Ã#K#ïqf’"oæL8‚y7ØÞùX¡/h $󂩇ωSŒK•NwZÛ@w Ö Ü5ô³ ôÁäÀâȘ„Ãð <ÂdE–£Òn²mr•Á0…>a*0RC؉Ô®…š~ñÒ¹ÌG)ÀQQãÝKs¼nHا߶碫û@ÓÓ\³<¯ó> oQJ[Ö¼H,Ôe÷‘k÷!>ʈ‰Æ‰Tp!Ù’ÇX0öyx٧莘wšÖ½±CÞø_Id/–Bǂ͌ÃBMµôüü¥ƒ‚ÿp2…œ’Ÿ¾Pѽ”îMÝ è³¯8Äš1Eù£åŽ Ð Ï#`¸j€r«gÊøwß+ªøOVød wÈÿëVò?¯=ù‚ÿôY~<ü'rzßg½m%ñdtÎŒ{ètØež%¢©p¸èê=?ÁÌôäÇn™aâù7Jãν€Q®(–ÅB>§èÜQÜj‡:%¾ãêÍì)IßqâжS ²f5âìŠÿ¯º}‚hïãÆÍÞ¡#"¡KŒT£Ô1å&„ó|(¡g=r8%`î:Sº¤Wì꯮… E§†ª Bçþšð¾¢$ìx7òZÖ)ãOX¿Z „Žã)i#Kœ6#‰×uý;Äð`½…, ®»q0Ö{™NJYp‘Ck´Ö\DýãSnÃaz²up2siü\¦²w_ÑQÜf‡ ~á ´y=bF&¯DÎÞHø(è’À}¼×ן«ï77,HßíÊE?F"k‰Ã1°“ Ï@ê±]þƒ¡xåÉñäs˜pÉcNÛõ? íÝBAp¨‰Ý ¬ ŽA:)Fp¼\P››Œdb¿’èWjœöñäß~8†ŸÊù?øÜø®¯Åø??|ôåüÿ?öü×`™mÜl­&ÑPxR±y•g×öäïg“øÜ·n+”æ.ØÅ¸Ïo=AÃ5Â&Q<3ØÇËt˜—ôozá×Τ[ R˦hB˜–¨D{Ö$þaƒµV½gEšáóÆàOÏZ/öNNZÇ3Ž%ï¬û˜×‚6€Êpváaòa!ï;é•lÛ’,Õ4~¿µ¶^Dï =I®G!¨¤äÓçíæf%µg5B€HòÁùh{+?Xx¾àgiIxà?ËœSÑ÷¢4‰ñ½[„h—Øn“¾1?ž¿Ú%ÈgUZsúõÅ6㦵ñÚ—£QÊð7-ÿ~¯-ž¢N‚ËÓ¯Ztµ5F#éü¢¥(ßÎÑvm…wß>á ð‹VøéÛ'³J’µ÷IøÿæOUþë~fùïÑ“'¾©È_ô?ŸççÔWˆL¥ÌrÇųš}ññ…° FåAã!G s$sˆJ^l¬óNè@Â#Gܤ™g FQ Ç£ †,6fã1ÙI¿›–oI ôSóQÈAàVäSàÎÛJ;!ËbaÑ0% be<Ђ¦ž´ùB]çúkP¢)çóÀ(är¸»˜Måx Õ(BH¼ã¤;LÄ ¦Ùx’g6\Æê‘TÓ¾D¸?h"Ëjƒ½ÌÁÂ8êŽri,‡ÝÁå1ú×Ä*ÿȈwOÆ(nê÷ÚgGLJG­ã“½|>šp@4ü ³w}¦¼œözýŒ?Ò~þrww¿5“¦Umƒv2¼°xÇ$.PÄû}J8ʳÚÞ~ÏØj·[/žîÃåB>KO|çÉÆÝÜ‹m¿AxSÓd³Iî”âsµìæ+¿N:ó˜Àäì//_µM<1ºF"~¸tÐQÏ~ôûÔà'7¿ ¾IÀÖí~1±Kþ•lÈMìäf§µ¿õ׳öþá‰OòûûÕô$C°GØË*p6%rl¨>æÐ‹TÌ5Aý"íúÏê†Øno­–eêQ2ê•ü!è¤zðVQç=Œ¤ ÎFe‚hÙ&#r‚‘ù¥º&0,w;êCz¹´ªâÛK&¬¬K–"hÈJi¤ËÀHÖIGÃG1maêQŸî|îž—ÄÙ’:}Èv¡aó#ŽØeF˜a f#¡ÿËk±µáUÏ“?à CgþA‚·d2ëåbîö2ÉdžÊÉ&€_ãv„¿G0C5ÑöÆflŽ Ij6¶´øV2ë|eC IÏU±`dz•L×~+(ϋԿȀ`$,?ÜøÈ˱éwÖÛ=ûé¬5¶ªl¾Z¶‘ÝÓ3gNÏW\|^}¼ -ìÔ÷òæî‡9ܨ²HÈYÅ©‘$ÝÎz©Z¡„Ðï{αctÆÙ²d­¡fc²ö(´€Î|°÷½ÔÀD I–¼ËàÖßðJÝ9fk…v8‰DEØd3!Y Ù) ÏÐl4!ŠåæŠdDõÉYÇçOr@áÌæ8”٠̢e°×××ÍNÙ¼ÊÇ@±yÚ„·úáx»ú6Ÿ|õCâB)L å;ÁÁüœxÄUqÄ 7ï"KËb¸X&ö[ØQ÷É¿g£Ë›ñj§ìöWûãIß…v@öÓÁy7%H#üV¸Õ·L›s4îø~”YõZR_‚ŠñTyôÜð’­ì©Ÿû±‰pÑM'DBo³Ô:Ø mܤ'—´“¦C¯cs‰ŸP>T§ú”€Þ¸s›N÷F:2ÂøþŠÞ}Å*C/ÿ†]=é“14O‡ôäû^ANiýb¼ùŸ»»xú²Þ’ç—jR¿_Åb?P Vcü'‰˜kà »ô'çÏQËåÌ+­l ä2AYæÅøD¥Õ|8X`©ïñа — l–Ô†ª÷TÊUØBr¼,ú´øä+i¡M‡ñf(@†,z “š&œU°ãÑtLYUõ.µz rM, ®÷FsJ±Å€e]ûV+£¹ó|Ì„NRGrYé¾&ó§ä-p¯Ræ¥i.m¼žç¶óÙÑL »ö·íí™ ¦ZT{vKH5ÛŠm£çð­ïž cYš;¦D0¦ü›+¥ÍÊXH²³ƒ^ɦ—]«kµ—[¡Nbéâ$ÌBÃìÂÿpä^M+¿W$Ȩ­Pûäxߢ%¢YÚæûæ n¾×j†1DÀZrØrË ÉØ^F3ÝÂnözâzÏÉtÃ§å ‘V Q…Ìì9aoÜLÅ"]ae‹g,§røŽ©#eóðAÃÉ„F|Jô¹QÇqŒƒLIe¦ÊѬf4èRÉù­t0ŠG>¯\RœíD‘gØM—ÂRM– +ãõGT SÁ²zù¦bjŠ­™Øè¹'q lûñ¨SÜžpü"ιÝT®Göjö‡À®ÈxèÆ¬Î’;í‚] .ʼÒósD„åW–…Åàv2>žÙ”Ëá" i N#*M2S¦Š/0!­”ïqÛf´í¥‰ju“M:Yüû žžaJ庳V¸¥ž·ô‰ghÁ{¸^[žyÝ›¢§GÉ“GsCo­Ñ¾’é©n¾Ò½ð•%¤ßÕ5émN­ºÔÂ2›Ðì¯æXþ>˜1ùêÿî 'Më|3¦,Ê€Ký«G8çûmîÑ`zÑ`z2˜m4Ä~‘ÀòGƒ™sÆTgÿžcúªÓùj¾ +›3 Ia“¸çâÁ>xðí·PoAÊ?;úùáƒ7óZO­hid{swƒëßÞ§AÙ¿w6¸{ß>;:΀fïÓÃñ}ÚÛ¥öz÷i¯÷ƽ¿¿|øƒA=¹þ+Yžv¨E8•$ãé P(ý~›¼ƒ’k–ŽÂ¿IpÂÁùÕ<ª+¤Úm:K] C³Ã6ûÛ·ÏíÓ(m¿ù§Ž%?Úæ‰ ÌÝÞè{T¿lÜÑÑ ˜G)™;¥ñlI`™7eÇ­gÅ蟛1aŽ¿ûå—ïŸý°¸h–ž-ë÷^¼¸³}ä¶^#ð'´¢ <ßÛßzzg”—©õnD¹Nߤ¹_~¹Ì—¾Gõú™<çÿü°ìÚß?ügÚïw¶ÿ›[ǹ¨iÛ5Mž·w6®ŽáMv‡ÕžsÓüŒþņ±å¥¯™8¾6”ãe"'~/®ÐÈ*b¢"uÈO?ýÄqmæfqùRiÊ:êÐW¡°>"´ÒXýÑüüäÖWœbœÔ½«W_û¥÷xJ×…tÚŸP¦¥è‡I²Šx}¢!mOmÜÑ è2&­(­Ê`u:Eªñ¢Ë?7ÄÿY¾ïVdëÅïÝV| çÚƒw (™ÊýÁ¡ÖwøWnp÷Þs‹}ÿª?h6á߇ox»Ô»gôo›þ=¹÷lô¨“Øæ#jó›7Üá]êà3ú·Mÿže4‰k#¶ƒ¡¸YÂ>ø¸3iB3­qfí•Dz•ðgkÇ,=¸~·ö ÿ>x°öÛ¸îú?âÕ†h^ xœh­ƒ##\ÓµƳ·mÂÇßòãvø–ÛMîá«ÖÞ«GËòX¤{¼öÄ=n{ ЫG¶Æ³ïÓO\C-ÿqØ,77d{tà×X§†Z?¾òž=úÖ¶rx|pèwfâ§Ããp&ÁLh•ÖO'ºÖë4yü…ŸNöŸïñ“TﻇЯ™Ÿ{å¿Ñò?îûÍ<ÔÖ_?w§~3¯ýÞð ì´ŸÍ<8—Çû^3O¾q‚%¼ñ›Y×ò?ƒúæ}ì êá¹ßÌkPµüë 7Lº/ÚÿõÔkæ#ux³ï7ód]Êïͬëã½A}4ó£?¨‡Zþu0¨Çö±×›5oãáWýfþDïxË„;ü8\>G°ÿgë(,O{žZ äÇk®ÿ/íxÞΩ¹ð^Y»wç• žû­?|àq¿g?훯Òn·ÿUtTÀ©¢*Fba_/ëÑe•$h)®ôܺïÉÅ®÷gÅÏ®½WûxŃÿ¼üÈ Ù${U9ýà ]E¡Ù;©÷¯ü#†Öù¯ÿô‰G>K‚’&¬aOYÂWÑòZùOé#÷–*¼#ÞøÃ|âF·}ôWÇ˿ѣù#¼hyà2úæ ¨ò`]H^¾:ê ^®ÑHà…n1~üðÁ²­òã~û•÷îñÃ^{?¼x/×ÜË]>l‚žsäÏÂþw½7'Á›^Ðà~X-sÕöÃj÷æ ¬s® ¾Ø=Û=Ú>^>¦…=áÁ›GzvÔýxë÷®É2'-•MžP3éc‘€N´¿òüɲ­‚ÿÕ7~{/—ҭ!¹WÞK¶P»ýD \ÝÎû†¶Ñ‰}“ùopéÛ(ËŒ^œè‹,|q¢5Ö£'?ꋞ÷؆ëWÖ ß¸~uzo`OzcYßxcñßÀÖ÷ꬅo¼:kÁÂÊÞºöœÒ> ÿþ•öïcß>@Qíå³íçÿ…ámo{k¿ýW¼s~ûP/—ÏZ'ÇpâÁ¼¥q Õ=ÂjJ™%«ªÓ˜ï~¶WS•âÇVû-•Tرµ¬¾Okul¥|èÓ‰¿ŠZ"cÓ=´-8RÊbL ›chf“ÚìÎÄ\×ß½w}nà/ÓÁH¨ˆ™ÈXÉùrc½¡ÊoKÔf&8› mŸ4åíÞvƒ ¨µCö‚·9€w‘‹*‹Ï±ßõDz±¾6óÖ‡ÛY{`Ú=w-õ‚¦voo*jɶf[?ä#ïÁœY+Ïÿ¾±ö°Ù\{Ü8ÛXÛ|Р1?†kq‡ÊÌÌ­¯E­÷ó‰ö_@¯ÍmÜ6äQ –…R+1KwrØÝ÷å !Cð§)ìNÑæƒëv7TØ„? XF¿É¬Ã"¨2yµk7z}ƒ!kù ~Úæv4·½UmN÷Láèè®'{¥w.ÿU:ƒ_;ôHÐQÚç*JéëÂH§í÷«xþVœö"I Ž•™}„“Fd}±Íä}/˧‘ë)§\ïŠÙ¢,Ær‚ºaÀÁéÙOô½C¥‰­à:Âóóû~Ñÿ%Ááâùrn£Šƒw—sCäÖÏ훵eßt³B¦u¾‚»‚ÁmwÄ몚‚ Ü,«öQœ‡ˆ’Z ù/¿˜ÅE[çár5H {7¢ŒÙ^Ó0¹Îµß½ÇÆþÙ¼yc Â¥É Š±½(ÑeÈ,!ØœÃ]q)¯Ïòï™.nQÀ{#Hn§µ» ŒòSX¼IšTϬz·ï(ûå(܃æûÝ#kßäf8_­‰¤à0œN`™ nSt;(e¬’˜a°ý­;÷~|·Ùýü–ù 1´ÏÜ@Ю艽ÝûŒQ¨ÓðË/ýnz:ù~üCÃ|ßýaÉšCI ϧoc’¥;¬çŸ}\÷Ñåý†ô§hH‡[;w ©ß=m  ¨O;ºz¬nBn“rg:¤ïñ³?ÜcPl¹Ç`4¬¯}rxܺk|åÆGö¸Ï;@üî½Hý3X%áî½W°w¯%Üý,K¸[3ÂÞœ5ܽÿ"öî·ŠŸtŒsW±vŒÕeT6 ¢9lðÒÊPÿòâhÿsqtt‚ó‘Åt…é@‡ø×Á¨_7\½Fn¢1m\"³©Þ9Mõê(#læn7Õ©ÓûÝŽ²ßsks/ÖÇ­“Ï:$íû8›Ü³ïësûþôxë`û®ÃN.Ö_ßå·“±ýžQçÙö–Þ[±Ä)6¹v†Ëa;ë[6q¯.÷îÕçÝJŸm—{¶Ï»5}öô›=×ëÝš^ë¾ß”M¹Ã95ÀQëxëäN¾‡,jCnn¤à¸“ZÆçޝ;w•·×D;V#V—âÈÇçôo'#E i–ð&Š·Áe¸ë“>’!Ω PQæë)ørJºÔS¸‚p#RV!3óêc¦æÕÿææÕ'˜%Û:Þ;¹ST¥ùq¶ÕÅ 5œK?ý;ŒÊ Çmï9ö„Ý„ù t¯lýõ®ÑvËÉ]½¥s®aÊ»Ç%%Cu8Umø(,Eˆæî5püèI]Œ&Nˆ á§£Ñÿf©­¨üß÷ u ÒQê7` èâlYˆ -’Ÿbü»÷ÿîœñÿ ' 7š?B»zý=¢ëoÌOw?†¡ö,Gíݱ'P–ìÝqFS™;ç´n3ôh3ôh3ô|nr 3éÕrZä%¾†™I/môÎ=OhY Ìè‰:ÚtÔwk{Òóâª:é÷ãÕ=Ǭÿ›N{0…›l1Ç‰Ü fžù¸?¹2¡/0µ‡Î Ú`Ÿ*wüÝïd¾mV_kƒ^Ÿç^/BC õã[”3®¡,÷øø|› ÁgG[wÞ"а¼[š¨dº'OœÞQA%½yLj*ü”ùž n¼¢nÙÍoÜ-Џ‚vB¼CQ8‡˜)ê »J3c,‚/G„¨8 ÿºbüÎnv9½)£9å2!§jp Ò¿ÍA#A ªÐà1^SœÐ ñ)Œ8…óÊ2T!ý+¥ÙN^ß„)„ÿII(<Úž×4BÂÿ¤ðOß>Á‚Q4e0ÏmF0y®˜8k0óã¢$´y¨_Œ$Ùm^åøf+ßÌãæC3«o®žÝ›à¿Qûÿ±Šÿ×ÇDƒŸwß|ü¿Ç߬=Žóÿ>~ôðKþ·Ïòáÿ·ZÖŸBúíŸUØÀd‹@€Îò—¹ôäœbAqUBì›=DS«ëÂK&)ˆEËI‡äsa’!Á`ÍÇ5¹´ªpª‚€TjŽÍ3ã7QV!ÃÙ%²1§%ÁÄ0\`ÿ­¢ö£i¸/ø'‚ X®H)†‡MNç ¢'K`<8³ôÎø;Ï9ƒ¨ô‹ë•>¢)%tÑêÎì*o˜„Ó}Úün„i…0Ü ã‰¯óîäÒd#v˜2z™äÐÕ(†‘1§¡É8u¸‰…u(ñ€º¤³¶E¦ÌN‡ ÷m^6?(¬ÉÉD‘Á­ãœ2Ì\"=ÂB,sIÅ‘²LÖÖ˜æÉyŠDþb:sa*ÑbpDWµ6w 3À€,ã?qÓ%æÂãÜë±YøÅ«¥‡ë u†øÀ‰KüŽ[Ïð?çËî·åj)ïR£ö÷–ÙJé²ýµ³ ?žè!vdÁ¡˜˜Msþõ¹ù£yôuúugÖ „%`×WÎó‰[~ZTLׇ9äJN• QGÚýI¼ŸÝ=â çÛ¯NöÖ÷ðQ{ïÙÁYë§“ÖÁNã[hh6Xú6D—fì8õ·|y9(ªê™ß!Ž7¥²k9£;ü1çè°Âm]$"Êz̃OÈ#qìO.½Åº·»ôó›Æö‹£¥'ÏZÔ#ø ú¶¿gx«‡S/ l)cÒåú÷òÞ+'²¶?Ä|ÈÙ®< ~r äÀK‹ý‹vÄ> Þ â›æNÍP¯ÇDŸ™õË̸’òm#†qÉ…ü55mP1eKâÚ%°ç:½)7Lt¶ŠX¯5¹aìŠïìý6Û#}"ióñ÷SÂÛÎ:Xs«Ìò#Z+oŠuÚ·v–dõ ,_°6¡úÀ½‰^Ô-—¬—[­`˜0Un# jä¢Í?¿OÜ œâJ|xº½ý‡°žÊ¾…õö6«™;Þý5-z;1~gÝö@æXã¿Ý`ãÃò´’¯HAàÝ2zE¸¤>K¹*ì`'ã‘4›%šZ‘"ụ2"Þhex°;ó³ `Uÿ]˜,öïÒON$‹Â„Iïùtà©Ú¨K YWmu#©Ï†%-è:a~'™9‹1Y9yt2Z¦%—±@½¹l ô_À€ö·ž¶ö[?© ÂUdS£­¦)q¹PÊÞáA¥ŽÍ#ñi.üú-‹¤¹1IWì\Ö.0mÛ«eh‚ßÜ’†à)=ž ™pø#£Q"šI.&§¿YBÁ ËÀ³åDÓ”9ºðËŒáñ YJäãQ‘+ÜÓ•öç´ÝéPy8ÄÚ®{ØÛ 7‚Šš|Œ²Œ¼¤ü)ˆµçµ8¯Š‘K”DÁ« AžèXàô—ª¨“¶”óƒBœ((# œ†"–gÝæ²à®ñœS.´` žß(« ﻯù€BïˆæSž ƒ€Ëò%, cìÖóâÚ‚òu¨ Ê©Þ ¤ÅãŒÎ½NFÐÔæÛØ»Äh‚Ê¡‚ƒ ¡Hžiaˆ‘% J šœQ’MkrÒ¼Îx¤¹Ñ®ÐcSiuQ­…[>>CÉ2` gó.E@vˆtÑQC}AO­MÍÍFOà{ðžÛ'ðMyâíµ-{)8«·•DÒ§[K" .ï8‘¸Î ³×Åø­¡ Jß[$XR&×Y&éaRoJÎgˆª8ð Ñ&’f 8ÃÙÁŽxò¨¾IÅ—˜×ŠƒØv1Üãá,‘Õ¶Ç_J ¿á0Ç£ÛkÁ]ŸÓ¯8!]9H­CGMM—vëÆf¿—“n1=Ú׈ däè¸ ¶+\ ÝGqsÁõ t=íæHfb(ÃK0¦8ãêà?”·aˆÀ!9Dbý‹i^^: ü.ÞUÑH“¡7‘#2N ljc)1~™›/j¿«Fa·~:á%ºõpF`Ïõ¦ýß/k†ûº–\'`z‰])«^áå8@|Ôb¸èr¤š|èsÖ“‘ˆ¢C#™%F\ð¤®H +y9@xS˜§½3;o-9µÂc'ª:pk›øË1Ëä¾Ìòu-ãšÜx›´‡áø'’„8d ‰¢ )©P©y{ é#dfħ&7Æò2Få†'ü`¾€§ %k„î!±®  QúÒÉéÙÓ­ö^{–ø¾Ë,i\f}ÄÄæi µs¤î³ß‹Çä:"}Br›áõÅb£¡8'èlyòÿmÑ?/ {þ9hQLýƒŸÐ?/ ªÁa˜KC,¶ýŠüþûÍà?››ðÏŸ7éþýû?ÿ€|OñŸßÓŸðÔ|àºßSú÷÷\~Ç_ÿü·ËOñ!•Źîï©EúŒ‹âŸÔ™?ÿCÐk D„5qJ koÊ_AÙq1%衳ê´6ÍÉáÙAkë¸ÕÆù ?žíìòïG‡mû;¶—xT6‡ÈjÓ’"ä°S¶2~§‡B›È†±_¹´m¬ÈHÏV©˜Üž$»&©Ù5œh4/eßø²˜p(qN—â8I÷‹uÄÕß9ñÝ.Ÿ¸‡ôç.ý [UÉ-û7è‰Òú ê fï?tàÿ‚äõpÉÀ\ H‡Â|Í̶ëÙé©W„™Ìþ ;iÿÁ´™m÷3Êu˜rjWWì匋½Tþ>§`kn{x–ÿ Ž¢¨ü- ×Öhý¨_hUÞدÃÙ\S÷YÜ» Âcßò¹gÕÞ£R<«A•°äíÍcF[^2Ú%¼öI²[O'(U‰bT]‹‹Ú{!–kNHº¯‹²·R±§ÅRì÷…d’•*ÊuÃæj69fè@{ ŸT¥YHˆ¶n¬‚®ëCç«:ìç…8äù³ǵ%,œ/ü9(·é—ã€ýT)öƒ_,˜ØºÒ¦Ò[0¶Ïç Ñãn†¨ùK .Ð<à*,ÿ™—$Êvu!~-rNÅBJ,Õ&nÂ*2èÜÛqéwÕ(ÞÕÙ1”Vá ‰õHt˜…êú’…%ld;™ã†›F÷öç ?bòfÖü‡TNüù!Hx;-x(“TÀЦ¼œ}éÓï?€˜…–’úŒJ[«Ä|Ï“G ÔÁ4…c‚ãSÇĈ{º¾]Ìœ!—ë%§Þ7£<.êøÙrsMpôc½Üªqm!_€,ó¶Fjçl¸@7'NjíÝ&½N rqÅÐ=XVøi':3ÜS„öý½‡ë3–ç¿QWeáÛ1øpf³Aó%\O>k@ó‰(I×Ôe¸}­Š"ÿ»Í[d¥ç|0c ”GDsD!ô1rÌÅP*Ìœ Gý×te^ùÁ Ú^íïã¥Ý´O®ãSL²ùpÝfÙÔ·8RxcEº4|(>j8uª…˜ïåSIwY’)ÈI¢º¸Þ}Š•)ù~JÙ”ŠqòÂ~öÓ¥ÈÉtxò”ôÊô,ÈÇFëÉ*#¹TDušC®ü§:¨²©|ò~Ÿ¨™0):Iϧýt ¢GþÏ7ôÚ?ƒsìäº(ÅG#6s›*^égöæáëö˧öuÜlU›íÉÕ@,èÄLû“-qëˆ5•íæWÄp,îâÎù{6.0Þp¨Z¼e¯‰_ž´gw5Á#£JÒüßÌmï¸õ"îÒ8ÈR8vÌÒŸÿüçåp¬/µ°•nmµ´v6ìBµœëD°v'vu¤œ®aƒô™¨ÙR³©W ÀÑ ï–zˆÌÕóˆàÖªh)¾•,n­Ð3÷#2hVZÂün:Ñç7LQ! |< ÕôøöïÀÂÆ£°Ë껥­ƒ§Úh×èËA-qxìö«–(|šùÉ–p€9ö§%-(ŠLK‹¨ðö¾GÇ[ö‹N·cȹƔ—y/,¼o ÷‹ Jú2§ä~µ$Þ¬\AfyÄ•VÔ#8Ë4Cÿ'ÒZpfIÛÚÝ­{͵÷SH‰œà4NÊ×>æÉDï/# ƒ»ÖÏ$]d*]˜Ä³ü³Æ%”R (y€ô2ðž³ìG@†+k(÷œ³bD¬ƒ^VœØB‘†éCP“Mçƒæ©ÓHê{쩪=vÔ-«bUÐYu^@ßÂÀœ‚”‰Ñÿã'k3¨4[ºO›Il1¸¿Ö ó·TjÂ_WOfs‹jnÛ3½@§˜”˜"WäêX0ÏœŸ~Ê£§ÔGÅóuLjÜ’ âƒõsùØìµ·HÓø.žã¡yµ¿÷:j•Ìc¬ßíße¸OLo ‚È¥]áËØF;GiÛ9 ,e.© Ù”ÑÉ%öä’Y¹Œ/ÏÆEwÚ¡y§è¶Ò{Î&LJ®vcFù(ësvy¿ t=踈.‹ê#È=Ù.qÀ¦éŠJçÊå´Ú•Iô-ß*ÁI%¨TOßf¨|÷½»ì¬‰_ƒßˆóRL'’@Lg¤YI[€R*#{éòeÒ³%ο»pì,ÍÔr5kðoìŠvŹÝJrG+¬=5qE9saÏØ'¶Õ€ Êx ¸ízÉ苎þ…>šD‰ÓïLw@:e\%àQtÝ3Îj_bHáš/NçÚÅ,… @ÿf–XS02˜!f¯œí"ª¨Åðwnáz3³kÑÀSMÈ¥Gß0˱·ÿ8íÅMaï w^¾9Ãê+¹¤åݼ،ŽfØJn~°™ {VòÄÀÞCtP K íXÏ›@KÙ$˜±ŽBH¹[Àš@GÓ£1pwPœ»~[í%h`Ìân¿#ÓFšœE¨C^-=À)Y[FP{%ckX+µŽ ·FZ&Ž®“_üç Õx'þhðïÿŠ7l çÕƒ¿¸»1ë"‚Ž”Lw¤‘ŽEà©… kóÞ¯aâ¹£”ôošÉI¡ƒÇ¶Ò¨s ¥ãrÈçÖ‹ýð« Ïx_·cqTŽã!(@øÛ¦6ÛJ"j¾‚{,pŒÜ9ÔêWC9Í`¹çöêR¶¶lÞÁivóKû´]±y+z“/仆í÷šú-ÞXÆwËË˶uºFÖxïúP¶öYèóëòyªøêQ¡¨Ofn§Ö½NÁ˜–ã±ò§Ñš“­ß{¨B­qÐÐUŸüjÚÿ½Éêš¾µm í¬JÛu767Àéÿ~ÿOdÕ…ú;.qêšOܘïÍßoÿ /+pÉÉÄyìÑGO¡~>ð2”áîŸÔö),kØ[±ÒqK#üýJ¤ŒŸzºŽ«Þrö3_\,”â³XLc—Á4Y^Þ@ï…N& Oã»Ñ«y^„’D|éùSª óA—VkYU\"¾EIÃâ¿Ù)¸þbáYªdAÑùCÅí…ÐLœ.ä„xcŽBJ<÷`6ɰgÏOkéɃ3ýIô:ïôó”ú aëÉ®6q£ËÈíæ#û²>kÎaÓ_ŒI±ëû%çê~ëdþ’¤ûe_&ñ£ À^$hŠg7/ë·ˆ~D˜Ž9\¼¯AÃñLÃGqžËÉ`¾$Ö¶4Df j”{'Ž rZ‡N "Îx^f3:öňÎU­á‘|‰ŒI¡Ó“qÞ™ðbnXm²I`…Ç>[éá—Y•êÕ£8àP½î\„b¯1Qºûþè|*þ8°ËEež°:~ØÝè÷µZeün6>Þ»ªÔîÑN@·/XŸ^$)?æýÉJ^1ßxŽOšVÖêF—¬ƒy:úZNy…JQx)úäå‹—ûøÒjqy¾³÷ Ÿ§çeÑG(=‘²äcOÛøÒ*`å1*g—I%]þmJ«‚©íÅÇ'³åêÄ@Çݼô˜Cô„~{¬Ÿ78„úBA)ËÝMÁÀî.Œ ùop-ç¾ÅÖ¿õú¬•Ënt—fé˜]v@ÈÎGÓ>ÓjEJÉÀéJP“בk ¤ÃCøè ÚßX6L8ƇWP¡„\¸ü»DjSB'—(Q‚ÂOAçð⃞OéðÏ5Ä®­ß:ϾYÅ“|¢&ògóå_U2Eû„eáDdao¼¤ÙeõM¨w‰,…¯ÄþteÍ@¹Y;Ê@ßÑ)³°õšáÖ¥ªW‹ýžCñ?òî]CNhÌé¨þ:Î͸~ĻވùߚцÕ>O|Ý*¹ÂƾŽvÜK”¥Q’Ltó$“ʰêfá‘ôrH ›öFlèÏm{Fý O¸ïE¨Î±îº—åC·¼çt‚Õù#*Î% èà…ι¡íM0uñÏwîð"ô¥SC;~}ØÕh%¹û‡‚ýÞDW8í†B(ù~¦#7Ø`¬63Óã~WIV¯Ñ¡Zzês’D¡”HýŠV"lˆáë'Yß¼ûö œ£Íÿê[Ê4¬mÖiNé“Iá˜ÍÏI..d K#©½±1• PYtã©)9HÁº\ùzÒfrÈÒ é§€K!\O8 t Vú Œ´ä96·aHG[¡¡Cû±TAcå‹»ØL|•qøNôºe´X‰èÊ|€›DÐF~e%¿3œ–yŸ"{‚4[+ôù>u‰Í«mý vá¯@µGbB·]¡^])c|m~@Þ¨ª¡›‡B—³ÿóæIo)ôìÊñ7­˜‡¿j¾n©«™É—Z?6¨è6"?5¡)R±‡„GÄ‘cÜʃ¹Ç?ÅÌÆsO‰N9rCÕ^Ö¾[§ý ^íÖ }ªÙ‘“Ř]Içv6E{fu•^Ù{k°T‘²[ƒ× ê艮\$ÿP¥PÐŽÏ%Åfà7‚='jp„ ôXX­ãFq~ÅLT]N⟿láˆ=ÜÚo·‚'‡'Æ• –ÓÏmX›@MδvkÎÆ6¿Èœ£Ø…k¡ e¯ØJVzô oC­ÊvT¡ARý~†Ó7Êцóët0*£¸|§„G3¿åK:<"Pü/Ûp`zÙÑ*GMT&T0l¹.àuÀýÅáq6îߤƒÂbª d@¢û¥ÂÉé˜ ÎW}”ÒèSuáCÎöZ]|SÕZù╱ûC˜Ü)'¾y÷..Ñ KloC‘ ygW_Úe¯ÑÔéòmÓò!ÈÍŠ—Ÿbàü{U´Þb1—õ¸cÉ „ƒFë`ŽV˜½½ÞXí4 Âôrqu­›wÇ€P/(}ªÎ+AÁùKl|Ð¯Þ SYŠç”oþ‹%}ÿl*ÄOÓÿ—êî°‘×A˜ç ‘(|*ý¡K'yÐ'nc¨ß`/—ϰÂç” rtJ}Vøø (CŽõó"™øT‘ÒTØNv>IÔôŠƒ;™‹À÷¸+u…’°¦Úɸ_cÕ× í"Æ’Ô ór1h‚cù¹[·moF<6ƒ"T‘2V_£¬ËJDC™x! ÎXœŽA®±vB Ú¢“B®Ó©_vs᯦I'ÒYÕ—ªm6Ö¬ÖáR'èPàå<€Ïë 0ž¥N™÷]kõÂÔX‹Ä=ã£oXøcèÞ ÓÂÄèý΀trÉé¹o¬ÿkÂtèlš‡¡#Xk¨¨LvPð¬£GŽ"Ùdãd‰€& É1€‚îx¹É¢‘³zÖœ2vy¬Ë UR£DÖþr”XÖŸ¢<Ý_H0!r²ŒOƒú®¨Ã>…VyˆwÄíZ{ä=ìTƒPÇ»# `VÙ-ï­¢ê{15œš¼2”½]Sík½ñßjïj¼övgK Æ»ÆMãï ËÄÒÑ„d¨Ia N—:§ËP{éÝ)ã>ihéï§Ë2½±Ï‰D-κ9 ž®{»¦ ûÉš糿þ#7a_èNÉx¡&]vKŽæft ÏKXÌ[wŠ¥qº½¡~ “xžê ,ý<XŒ‡ëè!ÜPó}D@.l¯3çp=ní,N >4L³ÙDQmi[p(}£õ߆ùÔHûN»*¸áìí~hx’…ÊS5à»mîxxÍ:¾"m>Äè»|ºjUƒNÇ$Fó]:!‚Àó¡ƒö*ti2“û_jdÔâ"ˆèô1¡ëÞëá A±¸h.,P é ´§«¨>@‰årPn ¢‚Eù¤(‚š&¸&®œÔǘW艨WQ‘ضxFþH?$´>ãqÑg,Ò¨eT Áùø€Y‹ò¡k./|*qÈR¤D`“ódE£„7}R¾_ñZ”Ì¿êˆÃ·+Š&B£(’‹)z»ÐB…PZ´-ªX\9Â:þ~û|£š-'â¶¡ð,ïø#gÿ›ê7…Žª/ª$Ïê>¥,”5Ò»ºðôB·‰¶¬eÕ#1¤Ó£6Ôƒ_Õîùïþå §ÝúÑüü†ÿô9 æÖ*¦ãMï¨Y‹–mžhÉô¤øžxܪ€÷ÚÑùð­QØ5¦!°Ž‰Ö…­—˜–sØOâSiê˜+À‚Îm®ÂŽƒ`·ö÷}ÞpÜ:ùPÑp¸#Œï¾•›4¢CøóµáèsÿÏAD… þOÅF ‚Ó1൰×|U&9±Û–GFÞ" —LsJf"q_×écHÄR cúéP „»C¬šw>†ZÌZ9d‹ÿA”Âß(sÇfÑéŸQÿš® !{ãß?Ø­ù6TUë„O½‰®¸¬<\<¤ÿ€WE~H&q³øçŰ@7¤ôë*Ÿ.§U'ëNá®ÚÓzRXgoJøn¬Þ­„@*ÊìžÙø¥ûŽ˜ß¹Ü jªÕáÎ8;H`óz èœ7ñËU‹Ñp”_gžQOš¢ÚÛ‚]ª”—±p·½}ì«÷¸1xþìèX·Žÿx—÷ÂÇ>ˆ[u½sUdî~íq¼7FqŒ®‹`š‘pºÞäܯ9o9yßÖ-O½r•r:¤™]“uYœåw쀋dQç,h5Þ— 1S~œ{PU^D¦G¹’aNØ-SÏTb꘷½ewÏ›jÞ¥–gÌQÌ©îß-T"9šÇ”xw¹zþ?dòy©D÷0yqÖÎñ þhlð£h˜¤ëŒÎ‹„,˜Ò ‰{A[<ß=ÿÄé-~ðd (‚˜ZGyߟ´·tB‡&x§kaoqC_ì¯með¡ÛäϽ”{³AJ&§Ã"g -6#3–:=“§8™ q€ãÛ‘Z*“ÖÐk«DJïYÂÿeQbE9ï°OB]õ€Òƒ˜ü¤i*@4’.ò/œgÌW5)WŠLÿ½[*E'·ø|ê©]Û§¥Ó%Bf­¬ü:Cðoü•Óàf«ó)®ðžU¨´PNªÎnÎñZÌØk1°ŠªÔ‡b™H¸£8Œ=S†Y’eiýøäff¾h­6˜;²/ ŽRˆ•ªn^(fuPŒôÖ¢Ù¸]Ít{R ¥(UfÌ- ˜8-À³D²œ·Àa. Ew#vEÅDH|¼Eñ,pI’!zi'›E.Š[N:“ú¾Š›ñ ¹P{é6ÑTÞñ€¡Ðu#{‡]ÄΫê,â6ä®!GNˆÞM—6­ãc® —éyiàófîìÕˆ÷Èp3òõ`õ?:[ÈM:ôNÛŠ:éÅÖñ9±Ü›¤¦wD»X}³+zwUP‡¼ím©¡ÚÂùU|sæÁáÉâkZ§ÚùÕBBýwãÜù©ÿ©äèÁ¥ê“f¸+ÿ¼{ð$Îÿðà›'_ò?|Ž›ÿaẇÛÙ‚Î6±ÄTä p­Ü …7Ê(×:¿ñ„ýž´ BU‚öò ÄÖî,±M¹`¥va£zùD‰‚]ý ð:AÑì1hÊà}¦W%.|ó<=Ïû 8PÌ Èc ;¤þµ„4s(&ÛɨQc¢`Jn‰„©ßUž²òqÎa—ú‡=ÔšæßÈ+û¿¥C´é~Bpûþ_{ðÞEûÿÉãµ/ûÿsüØý߆u7;zƒ½™ŸbÈÑÏ‹yWò©ÿt÷^ k‘Z,}YdO‚wW^ 1AžGhä¼u,B’lû·˜Oθ–à?(¡Aêì/ žöõëK¼ïæÍ#I Ü¿ú]çÇš&Þ ejû5‹ic´ÏÄ­uHEÒÿø"ã0-uke}ÐΈ‰^È?×)¯Fbvh|Ú!‚ðø¬´ª7Æ)ß Q®ô‡ ‹{¶Dk¢pUV „^©ÔŽjXÙ®ØïãwÈû©ŸÞ˜²_ «˜Æ;­¿Ü´ ϸ>…ûZJ‰ …<3³a‰Z‡Aú.LÖÀ3PVÕê'â˜Ì$ÆM%,н³¿¼|qÔžY8Ù2ñ†˜öæ¬:‰è9óº9­Ôƒ´âA0BÌjÙÍWÈ™AZ½Îl‚Oõ@é÷,ž}àÝ\µoÏ‚jÛ¶%•òÛ­ýý6G…–—œÐm¯¹ _ÝFøÐ+ëM±ƒK˜u·`B Œ›–×yÙîæðh¯éïè½2ƒ|ØFﮚR KJ…Òww‚yª-ôµYâªXœ³©çü@•è® ŸY†Ç‚‹æ> w}õ›XÒ–_’¯Q º*îÚbHÊ®\|[ìønõce-Þ˜-Óë§j‚òAøHBñöhâ9ÞÛý+ù¨G×HaøbÜ|±wÔ¿wëÿ[ ´8ëKùwß>á>ü'¹È{:d¢›7¬¶¤”ìÐÄ.ú®ýYÍKçuì½ÉL1”< ùÕÚav 4ûL‡r®t-Óf[ŸP>§\ý‘ØÖÍ$/†×y!CU»ÚþO(t# ùÂÄ{»ÀÛA:rq·ð‚ Z!ãa¬ƒréÂï‰í%Ûµ(üµÃ†ÚbñX-Ξ)“2!ê.eȘ¹¨ôʤ/Ó=†™èBÂü…ª®¨7ôÜv`®†?bÕOŸ¶·Ÿ·vlz9÷Z*H– Iãÿ@ YµøuU)Éìûc¸÷ùy‰þzÌ»m煮{×±àþ”\€yñw÷_?;Þ:z>³L—[„ò»M)‹½ýÀ êm•.ÙWZîd•^ReH­Ž*á3ͽyäø?ÚvQÑÿq†íOj¸Cÿ·¾þèq¬ÿ[øà‹þïsüùŸ9깜i »Q8á BÛ¶/Ónq ,‹0Ó"Pnö§Ä'¢N¥OˆK’²@®Œ;­mþ‰Åì®ùôÆl »ãìÚ¼nš­Ñ(cŸ¥}zŸeÅødƒâʬÛ0kúÓcªÙÎÈ›—„ŒGÍoš›kÖÇåly ÝØljæE:œ¦…ÄqP\Må ‰JråÌ•CÕGoUL~jsd ‡ bxÒœüÒ$/„m©!®mò'z~C}Ž.N5žŽ&ê<Ž@pÜL‡“¼ÏA¨)™v:â…hÉuLjc$ã)¾Øoè”û¡ñèk~JÍÔ|%ýб >Ì_%=‚ÎMÕîtŒmaOÃ) éq÷š @*³+i×§I^'¿ül¸‹é(ÐÅ´ÅÅeŠÌ”œ[ö¹Iû˜ø•-J…ˆÆ+íóâç¦a²´ãaY\ ƒ.& ñe&æ2­rj3 ÒíjœSÐ"%ß@IZ?Ž Ñ¥Z²„RI¡NЈÄQÛÓïøþ”¢R)“hŸsBeeÕ”±ŠYÙp¨pðQ*]t:Ó±9±iE”.d%¯!M…÷Ñï ^ü´yµ¼Ü?¹E5ÅŠ*dʵF¹Þè¾A @‚Pg,+w_å;Œ,³#ð[Z}éµu¿¦x^ì´ŽQ:ZkûÍ™²èM®5kìÚl<ÏH5_©ÓK03°äLÌ¥KÀÃð]°¤+Ð7"ÄïÕÀ)i¶SÇþA·Œ™õ(0lõËñï¦U°<Ù­ž(oäâÕB·.WÏã>ÔD:°¹Áz)"_‘£Pô—ËHQ—O8ŒŠGª£Ä{ŸE˜- §öEÚ§  ë9W®}]®€%˜Ê2:x:,¯¢Oí~°yÞ¡#S 27¬¨»ùðªx«s1-³ñ"çö¢G†Ö§ˆk˜ è®Qž+C)Õš"H(5¬ˆ€‹eµi• 6? &B™É\|ƒ†Ò¹³M© rdFt@ÆdqŽF¶vvð•&\i¿|Ê2;â•,¤½¼„DæôâLôÓÉÆ¨æ5cTåˆkAêÙ‚r‘$Ôá½aºh¨–è&k†1Ó1k¨!-1 D&É Èˆòö•òT ’Ãuöi¯€Õa¡s¶G`æ6ð- (JëT%»¸Â…Ÿñšº†¼ö‰9¯+­ö Œ"gCIwhϵ‰dŠ ílz0¬Ð±íU‰…æ©%?BŒq Ÿ„JkM š–ç†fNQ#+|·˜§Ìe8OÇ VŽ—Ÿ}¾©,‘¶£šö1Ü—ßa*†b]ÃÂÁ)²ò¹4Oz¹òà:™‹¢è"ßI©2ºg½BLwC„>WÊ‹±´1uÉÚ]—ž‡ÛD áðF$ (ƒq’ÒØDÛÌz$µP»¯Wáœ!v¸à˜µÀ²î:ë÷¸CŘû‚€ÊctÜÒ0NéCú:zÆ×@©WºÀ$fÕPš߃t0æ5{¤ gÉØ~]zÀ6¥õcq¡6ãDhþ4í$(EZQcZÑQ]é+mê)³§ÔSß·G,ùñÍwÖþz1Ma*'™w/رì‹S _é‹ý¼ð¡iœÏ’†b×õ?O[‹E–é„ô-¤MA™—‚ÏWü®/]gœ¢éåwZ»ïøa™%"LŸF‰)É•¿κÃÜ_—‡"Œx¡|£*-üׂW²r£!MÐUý:[ä0ÄšÃÈ<ô:hFŽ¥ôŽ k²1y”zUŒx ‘ShœÎLšJ|»¤ÐŽ×ùåàÎTùöuFD„h.©•Êè:@¾Êäp‘‰¾6Š! )p替S–’Ku.P³±nwVÒЧq®  â¨XF‹ ÏF9Nò²w#.°ºÖ‰Ã?G*Ü<^È`4ÅxaÀ<µ ×2b¯lŽŒö=n|1}žwK±Wã›` ih„J)ð›ÀXjïfV’¢v~ùEýYØâIRøPÿl¹hA8$ UF®ÔÎÄç/òlÀéQ/N † Æ7šÄnÊA~è’Ë—ˆç®?#Oè§$·Iª„ïhÝ Á°ŽÏÈ&¼T2@Ç‹Ãv*`pIÿÂ)ŽtUä]1«rÄ5S%ŽØ/½ˆÂ‡#ü/T›3°³¡°EH<ãÛ0f‡“Æ ÝÐ<\»c«{’ÍÍ"'°°ÉÌOå(<¶Z›¶ü÷†²Ô,$»‰j,ç¤/ÿ<'®&CbÖ$÷@²5õRTÛÉÑAråüfåÿpºâÿL \Ìó ÐW˜·CÌYD2õ´ 鸟ØôE‰‰w¹Á¥ «nFuQÄž<Ÿñ€4'_|¿hzwî´$"Þ+Bql3Lí,©Ð§÷´wO³ù±ÝÞ®çû£a¹QÛ7‘²+÷§—Îý *+Ñ•ÓgÀ¢ƒaçѾ…Wûñp:öÿ:ÌË1æìP2·xŸQ]¯ÐÞâ@ô'cfä“e. ÍŠ–özî÷s§`fNçJq=”¡¬ÈU ŽhŠà¯Þ•—téS…Ú“æÃæ:ì/¿ÈX€¯½zÑA¦-MÌ€[.¥0â½½€1Š7$YR¸-käk9™özÊÒâòÀœ¼æïÌÒa{wmYO:ü/|¶ù?Zÿoþ©èÿ9\´>¯ÿÿƒ'cýÿÚƒ/þÿŸå'Ðÿ£G˜¯þ?Àº ©e&z“M¾ìÆÿQ?•ý9}bóß=öMüÏÿÿÏòìqýÂþßù©Úÿ¯Ò¼/ºïOÄîØÿëÇûÿÉ“õ/ûÿ³üØý;ÃÏÉÔÀdÁÞº¢iKM/ƒëšb1c —«V[Ç©lLU1³„ó‘m M¿\ø8ºž*¢7]?c5å)&(Éëçr2m¬®vÍs¸¬@)ÀƒÕN¹Š7¢ÕrÐþº ljU¨.ù·+“b:^EPˆwâ6ÄÀ“ùðíŒPè2¢Ý¡{ õ¯btíƒ×J׬¡ºŠpÓÄë^5pÉžŽà[T¦ˆÜŠ)E$úæ ñ Ç9±Ð¾½ðòœã–Hûß2x½ÖÉH%%Ÿ½ìÒ „pe,%½«I!ú>ÎúÌ ¤G™…}E ¦ñ<Ñ5í”âã ŠF )UÀ"tÈšŠ>uœêŒ],aä“b£ŸM‡éÿî”ÍáÍ´™u§³÷[ˆÕ03ÉÛ,#,P~«Ô7⃿¾d ãq~……àjÝŒVW1®Ic8!pÿ*Ùzol¼A l5Àpò~‰XR²ÈÑø¶_µé¦_æ“bŒYÙÄÜ ŽRŒ´Of0 Wù¸ hckCÁ¬:D³1¢Ì\ã v²ûßã,íLVòþ¨é&fcõ²d«¬kŠÌ©—Yç­*‚\G%‡iÝ×;Whˆ’ ýããFQ2¥ey]Œ»j¬ÌcU€•di“gj—CuiжÛÎ ™O.2ÀK ±º’¨c,ßR'} ¹ / ÿêè¡î„Ùû}rå¡.{,DZ.ÁLZ Tœ …&gv{4=Yv€ ß“>èôãöa?ïdÃ2Ú†òpößQnªœÿ¤+³þg‹ÿ]_ÿf}=>ÿ<øæËùÿ9~N]¾C§mÃ>èTB•2hÖ•-µ¬a¯k‹È†@ºšëÆ"ïêîîÓ™À…ÑQf>r”ÌZ~bÑ”Ñç"ÁŒñ¼$²I_¶7£è<œ,<*—o1å¶Í)L>R3/–ïLÀ['àè˜yJ"  =ª¸Yq¸p4\´d5\wœwõù4ïë‚>Ì¬Á¹$œªkÎHñ{‘D=A·ÃN)Ì5’tp›ƒ¼[”w>ß2C"Ž¡È´P¶z–C–PQM)ÏÛ<çÿ8%X" N¦§[˜²êU¼¼žÞQLR†—SC¾.zCr›÷€F ?èüƒˆ¦$é’“M€æ[}=œ=‰l«èN®X‚jnÔzÄË_é ÁûèHµráfQ›‰X60éQ΢,ù³Px••ò\Ns™)L>àz|'v4´êj×ø˜_ÉÇv¿Ò¸÷޵{’»ò2K¯`†§“›¸wºâh³ŠÝ!,k®G6šœâßmš× ¥3øH&û*FûÄXÝ¡ çùqk¹ÄÇsÂɤˆ§êR&„ó, ƒQøìyécÚðé‘e1è³ìN“(tuj.ØÖÌÅG`[6Þ8”ÌY²Â…Ö0k1ãG,6>rã>Qï¼õVù?8\‰Ù?9nµ¶ô~Ó$;éÅvœ¸p«è,€jQÈG…ÈLŒ¼‹9iRôxëÝz»×ô0&ˆëzö"нlsÐî¦Y BÉÛMnp\;\ –áë¼Â¶ž×¸ª'MåŸt¯:Ö§¸zZé=߀ºôŠ IÝ'¢XR §iÎ)Ø%„Ü-} Ê~™D£”S/Ú˜]¤‡nçãÁÂݪ= “%ÉÕõy¶lÏI[90Ë&çT¢§§kÍ›Ùr]Æãm{ùG˜æÙõ ’È¿„‹xçÕoUH΂ªøž}럕Ôm8óÏn¸³ÖO'­ƒ6ÆFÉÞûkë3´æ‘å°£å]›¯±×/DøM@)5&î,iÐn-9JÛèS¹a?ûé¸ô`¶"¼A~M8âtætû×4’A=áÄOcKãîwöžîÞÞhí}d£ÛÛ··Š(Ðl§sg»QÔú ŸTßqor­Ó´7Wâ9ýò`a#…Ý.LÊ6t{S-d°`y•~»5(ê t;ª‡ÌÑ/‰“~‡Ä%h!råDR°¤d±=¬9‰Š/TÂ/­T_òÍÆ¿+Xd5mƒH¦£Q?wÞ¢Þ.I*‚‚ƒ)N‡‚A‚ŸæSòÓM¼$Éèœìe?B®§>z àž`Äïäæƒnfî¸õÊÊíú¹áºð€4™ôN«»ß•ã,x“k`ÜÅ}DÜ­t‚—ÊSúã'N±_är‹ZÒé°.Žäé4B(¹1"Q%ä¬áÉ^£šU¢6\À–S·ja64Nc0œsTƒÄZL‡ Œ/¹v—>,ä´qÞ(øÙòo í`/ãËÝ—2ŒuVü£ÎPºHÝþ“e4§ïJt{tº$=:Å„épTf3q(Ð09„ xEÐ0MÉÁYÙn ù®øc‰ºÞ}îúg.Ã’ Únæ\ˆ±]]Úg=¨èœ:ní¼Ün³ã•ÁQóûcIkê€æ5SÙµEzóŠ ÷™ Ke¥ N:7ÃЮ¹•okaõØ7&ì–;EƒV¥ø†+}]ŽÜÃ^¥Áè0Ö VoìOÅiNÇ}é«ÝC*g¹RDrl ÈyÜ ó!ÆQÂF”Ð7óîƒI¢á­}Ã_då\*mƒôL9)¶Ð²ü.ßSæfÏŒ€¶1Ó:Ľ¦rÊø8@Ä­K?—E¿ës±¦‰Æ8˜hX¹p$‘v޼Iµ?pê¡Û<ª‹,À‘ä’ÓXñfŠ&ùøÃÌÔàø •W†b;Kquh=AJŸÉÃ%ñ™Ôž)iÔå÷nFw8ç‹:y^פ†§kÇ.É:™tb„y¨=9@·íÜϺ16$œ2á0†thóREG7IÚ‰ø¤¤V¥ºe ³è®W?[È8*_ø°ŒGéÒµöèA!_ƒ“T7»¡9>ÓxÆI5P|Õ‘' cGS½˜sŒ…VÌD«Z+D÷Y{}…‹,É3J™G²\%gžß¸‡Áî)Åü¬n =ß>:Ó#Ñ»;!¹[F@ãüëŒâYF½¡ä˜ôÏ2µèjŸæñ!’ù]„&\V…†Ãë@®:¿…öË8‡\‰r'!®÷T—¤–,÷kš†Õë/+OäžÚ¦4¥‰· Â1˜~QŒj·……õr¹.ǹCñm_ø·5΋îôðIxó‘O›z´[mø§É<áú}º„ Ÿ:ØFßN—¼{¯. IÏOðCP{T©½)ÿý£ÁŒ!XcCDùá÷›òqjÛ R% —–)Ð4RýÀæâ1Çi€ÖŽ#»—P DÝ\ µ&¸|¨švë„G*bܞѱ:݆§qJ*¶Œr#7ëk6Í^¬îê±v5-ŸCm‚=N<ã·K°w~ƒ Yò‡>ØÇéÆF:Ä7ôÀ% w$ð/kK¾fIDçÓ÷VŒ ¤v§³eMXFšºB䘘‰ÞÕ$2jútÆ‚x?›ÚC©x» Œç8»X²”Hoq3Ø,ÅP‚f|õ•_ˆüæ‚ääî%Kå˜ägIÖ§}õóѼ¦ò8âš{õçý­§­ý%%œ&ýIýZ~CËÕã÷8¸èNS}/ “[;œKPÓæœ~p­¾uÊy¾ õÆŒ²Øçð•üh–ÃýVøýæ/…µµ™§ÄÝ¡ ©ð±d=4´Ü¨ªÂÿb&¢(Ïj…™4l[ãß(âˆØsqa/üVŽkv:üูÄg{ Eà$Ù*Ëé@¢ᆥƒk‘)”Íw¹UÕ!%wžYzÊÁR:¬‚ö˧î/÷?$îÜlïì½’<²À¿¼³>q祙{\:©ÏæLá0%ŸÿVÒåxÿxîÆ÷¯Hm/@ES†jUß/!f‹Y‚wˆë"aèfé¬qÒ„± ßH)}&4¼ <êK4nËÖÅæ±í(gø#¼ˆÛœSÆÈÎðÚÄ­†¿#Ýó³eé±Ç9Éoª©äƒ›ˆÍ¾kÜÐÀhÖ€ûãC˜ÙµMOñ®1^÷ÿ¾iŒ»›ãîé¬!¼Ù¶´Smþö«-ÂÃßÞ"pµExøZ”TeËID§¤Š?ƒÿÛ4KñáÅuû2avãé \6^E–v =a5’×Þqîf’zb«Ç²Ìæ2¿¸„³î Î#O¼ô”ªÛýŒçÙ@íC ’í@}FEIêöŠ9ºÆ›È¡Ñ>W§bâŠÿm (zL"èƒf]r˜çä'®@EW"œµhèVéfI®xøk}ŒxÑýB޶Vغ® äiFÌ£JnVWe4²Ý‚_åâÍùÈ»oŸh Dª¤?}ûÄÞ~ò>~œÿWÅÿoü©£îŽÿy¼Çÿ=züè‹ÿÿgù±þǪ«Ûê®w1m¥øú8ø }ï®M|Mš¤ƒ~¥S¤°Ë {+í_tì'šƒ G‡GûfñOOÌÏŠñGÈoÄ(‡îü2 u³ôÏmÀóOeÿ{ÀߊÜÿùèÉ7ÿ߇}ÙÿŸãÇîl6„A½Ë@ݳàD'Š«¶aåÁEuŠ»°“öÓ(sŒ@h1Sô”k‚îr®jî G#4ß~ È*°–~‘vc§Þd§Š%ž#^†f¤ã4t”oU¬’?dÙ¨¢påÀq*î|ZÞžIø@‘&âÙ„HNx{+³¦úí”^N1ÚÆ¡K0 £‘ì(ÔÈ Ò¦MÅ<¿×Åø-‰@Ý,¥á‘:Ñ) çƒ+·‹|,ôYÔûÀ ÚKÞ"ç6YZ ~™?[Q‡»ñ6lð ŽE/áèB/¨|n_س€‡ÝÎÿž±*‘™yàÁuƒ€ßðÍi ¹¥NÑÖüþ?ÓYÌlXŒˆKócJ°BZfN\ŒÖJ¹ÂyJl[ŒQåoãlü9ç„H™…;8<ªÂ¼Ý=ˆÒ¹ÃA“Ã)Ð5e¾ÿØ´JݵnýH}µÃ-ÕFì—šÒ0}Ñ_4&¼.'ÉAìÖª{‰ ,“é¶^/†õ…í 1¡WÀ]`£ÁnÝS¬§~HŒÑ&³Í¤]¶eu‡_ì\¦c¸dcŒ-è(ð¡ÍÊÜ”)¬£PYÝp¸².­3â \¤}Õ†¶ xå_Ë®ˆ’ÚªlQàí øß§µ …WÅ!º€wÅÕÙg_!Y{}ð7)’ãY)’p7Ë5N9,suIQä5–:û±ªB ×2ë–vNù#è–>]Å…ûqŽý…×c»ódB½ÏÁóžZ ;q‹~z$ùt@¹»™‰ügü¡Ta-¾5v"µ²Á+©1'±wOóN»øþ|ÃÎçfÚjp¦  /¥l–bD/…þÒr°a~ùåüûó¾O8|OÅ~øŠý°¸ÈeFHù¤ͦÇà,-mÀZñ ZJV„c§öšO·P7Âi > ¦â*(z&++"vs<77¸ðüôì×PÌF\ÊäÀ‘éúÃ|‹­sXºlÓÄ`÷zMA Õ;?_ö]ŒóÕ¥P㹿¶ËÍd+È™9™cU#.Ëéûóͧ-XM²¬Ç¦[ zxw ̬íBW+š©¥€ó¬‘rÛø×PmV®Ìõ%\Lnï ÍyMéymçtE:õ ‚¿ sï0ëÕ”zhI®É“+«µ ¹a…·=爕Ô' èjž/¥¥J9¥\)§~j‹y9 jS«Ô¹M£QÏ÷x&AØúsQWÎhjDÛ9;8QG—ñT“÷ä›Úš5WvâÑ1¿Ê¢–h7Ïé9Æ™à'l˜¡©YöÛU£$Ϫaô-e·|Îk_¿|ûwPÚ¤o12nU: ÈD9“s ×l„á YRV+k×Ù9Ýù›åz Ž&(%¤·æÊt¢ÚÊgb“‹s(z½õ(›!±CbŠÝä^x%ƒãëüä¾é˜3 «Ô9Ø çÔ99gš•Ô™îzHÏ`:N©éÅÊlÒŒ¿p8T¾lpÎì“O-åñ¹æe%§»$V¾ëŒyÎk¾œÜó»ÐGï‚ê1fþº;”Þx3kGëÑu‡KPÁçIˆÆÌÅÈ®dÕÕÎ]€£óÍš_}*/#¼¸!MbW‘¬ëhÏûˆžuo‚f ý#Aͦ2WÑÛõy6¹Î²šä̉áp8μ¢Õƒð©aÔ•ÊGl;$ã£ZÄ4þÔ_­¶¯{®’OªPÅò¹ø£pFÏüY´Gní" ŒÏMÄ£fiîã}I÷É7}K»ÑÙ©¡h“þurœ\=$tàôýP®(°·7EÐl„¶©¢æœ‹»—a`“wfø’¨p$Ih”TiØË>¼5C·ã^ã¶ÓÓ$K´«ƒ-¼ÜÐd¼OÃy¯Û˜ñ,Þ9‰r;¢YÄ9”[O" #vé@Ÿw¥š;‡õó†“q8:¶ý£øöÚ5ÒæIÜfZÂ.Ç"ñŽTÊà ӿb§ß›ý„¸«sXjÖ=Ò W§ùŸ!ÜÛˆ5šs™/d»2/KÚK;e÷XŽäá°v¶£ÉNî¦õxÞ?ý§ÿG ŸÿïÉZÿ÷É7k_ìÿŸå§ÿ§$ _`´°€$KDþÒé9”Z·wÄ’Ð_SÔùzøîþ™Ü–Ô‘Ÿ&(u!æ «Yõ«sô:~Í:uÎ¶Šˆ·ª{%ÎVÐŒóZ ¾t²ug?µ^ÜZ/ŽmGÇØÖOGql»õÛµÞ´}pžÛ. Ï>ÊR+þÚg‘‹¶}îŸôEÃ’2¯ä›¾5ä™\^— ÏÉÒ99]2Eé±àW‚¸ÖSÛŠØf9,ÚU¡,! —æ ÈçP7±q8”ÙE í¿ã.¹ÛÌ×-5" ¯2Ê{jÎEƒàrÝCâЯ°11‰–î«lH•"Lñvãä_Ë2r¢;g]9pˆ2(@` ã¸:´b²0‹u7ò+"PÎd%6»<ùŽA{{[+OUSâíĽ%D«P»¡ï…ZìsìâJu³·vö¶·NZ;gÁ¾wÛW¡&=¬Oç:øÌÄäÌ×>Ž‘ÜxrÕ•¼)5$—ºv“š¨‘KN‹áÈ5ñ6#H)ÕEÉãoSÌ<’(Ï”--À‘·tœô†-q(e6°<%µN‘+ð/¢À·ÐŠ%7¥“=X}?“ä³ÇŒ8.ÝÍžuøêå…D‰Q0 &˜"Ö"‹V*–V†ôæŽÌLt½¾ïW(ïáUÚŸfu±d¦muEfL“š~¢GÚm«©èiö† º’–îU뤒РŽ>?Z,͈qÝ{œÓ1‘óÇ(39¥õ¨ÍÇ&¨,ùûÒ^£²7ÅFˆ~6á7±ùpÝ¥ù˜³)½¥”“¤fºe‘"Û1Ý êf‘maêé6[ÓdƒÁ]ýI 9Ô«ý½×Äšð—h‚…f‰JKç+$™zÒI‚ Û ®ùÀ0Ø‘0€!Ù£Ý ­s|àOÔqšs%¯Ñ&M€€Ó¼¼´ÊŒ€Í¢Gè×`š†é ƒ)±È ¢GÉha°¢ù·(ÓÀL.Ë™ã"‚)5 tbêæ˜q º=M‘„ âFÁ>ip€`ý'ñxêynýUÝøXf{Õϯk˜-6|ZËgoc´N¬Ù}y[žùM&i÷åÁÞI,MíÝVç¦]lz['[G['Ï¡‘˜©h (DÈ×LÝdF‹xdAvÖý‚Zí·ëšL…Ì9¿¡Â~´µ•×Çé²Poi,éïMõ(%¡™Ž¥  z(Íå*„›†PC'Å2_ÚÎA^I¼kDÓˆ°‡¼s9d9ýE*¾P< èÆêQ í¶óãìø€„~J†\Áe2ò¯áìäðh«mÿôPo/.ŠC,3œ[»”;n—M’Ý,í²C5‰“(½†Àh­±fSJAI‰‘ïf*eY°0%¥ùÐ:í™yS`üë'b!óiðGÃiÖÏy6èiÃÐsqM§·3k<ªNÍÑÖö LÌ·Ú¡pvî?/‘QKƒDÉ5¸vj™~%ß2˜¨pžB¿Æ{ìÿjþ·>üÛ-:Ÿ ÿýÁ£õõJþ§ož¬áÿŸãçT³;‘µõ=]eúìÓ)^{;oÕ¾'š˜®Ç騗_„ Dj–ü¯Ê³jÉÈúHÕ^Qî8íM:Åè&z~^oé0lh:)Fy•¤]=và+ÏßFG)¡(ԧ᤟ /&—ïOaÈ“ë¼;¹œ½Ò|œ ü»WÓÓcôA:>={ÿ ¦LÑíÞU¿sɈÞï¿­{_Œ´úÊîÁœ.åä¦/“9ê§Rù¦Ýî¤Ðú8Ë2ŽSn.¬0÷.Ëø£pš#ˆ50 ÷"›ý¼öæýé{ŸŽÇÅõÙûÿ\›Í*EáªbÃûÓÎtT}ùR^žçµï‹«l<†I,gïݯ•RpWO¡Ä)lçÎ[`—Ð+8ëàÉæLú¢‚W^Nw °çAào4˜r<„Ù ÐØñDÕ­|0·[ÂkÄoâ$¤âyñî=m®\WâçS·²ïq‚ze\ªÄÖ)£Ï›ÿåÜ\ÞÏ+L=¢NÊ8nmºŸõ¸ð½ÚÖŽpË^QLÞ;JñRà¼ßÍ/àFŠuI¨éñŸ?_NÎGoà)[òlfÍ9Êš¸õI[¿mN÷·ŽŸµÌé‹ý“ì'>®OÓéä²kó“ôõ1³÷ç_…?”ZÈÐÉoNOáÿƒ·çùW ÁФô4“›¸È7k2OÇì’QMxò›ªm¨aþjÖàˆI*jHdbªÉü24):çL…‡Pìö!ïƒÈÉA¶5#~ŠYv÷ÓsÔs¸¢q'¬¬|óày¡T±u•UóäpqŸçˆú{ðóà›?}óheåÁ“‡Oê~{NŸ |Í,…¡ç²ÇnzÃrŽI JpÜ1åx|z‹‘nDC‰çª–”®Eá§d•s^÷¬“§Î²rºŸÒK9>Hkƒð¬”µˆe©÷³0c¢Í%]ÂÝ ƒ%år£M’صN†Àd‚>Ó6?=܇¸3Ð$š›´3Þ¾b½‘~{Ñž «÷‹}AD=´Æ?5œ—¢ða¼ã(Þ°É«è'¨vÍœö“N~î}Iðk±øóøBMë%êM§øX±–H%ˆx•4”øNÙýþï–Šþßù©‘ÿ)Õ­OÞù$. wÈÿŸ<Œý?¾Y‡G_äÿÏðcõ?ÏxÁ½x±=tbŠ*æWd4¨ê¶|¾ˆ’!~us¶q¶ ÉÁö;hÇ­\èGú’NãH+ˆ ×××Í=%zÛ„yåéÕ$ÍÖê?ºép–|ÕÊ ×ôY7}…ï¼hØ™&#š÷! sPWÊóf7[=~½ ÷ƒq¹Z¦¨ÑZEæ·zQ^u.ÖÄ]£úMxé/a ÏÀÓ£iª;ŒØÄ…“¦õЯaŒ§ @Å!h4ÎÑœèV95f²|›ùŽ Crg†C‚ðôÅ;Ÿ^\J*ï6Ù¼ª Ô8w‹ks‚çè˜|bBXžêÈQ”Íúçãbâ‡K<äó££-h"ôÂØ›0&%†³ÚÐý‰D¢³IÙIG[-¶˜¿ËtÐ_<‘Pœ xôYZæýßùêÓ‹K£å±–’à ½žûp‡ë»híF†X´âãyOA‰C 3¶{¦pþ¡9¾¤~ kŸf.í¿o n-Ëí°bÊÉüÚMêärL½„Íë‰:¢âcnGº<Ôá&Q‘ß u^&å%V (]Æg2ƒ6œÅ ª"•S&©w)K$Á@£›œ‹é¤¯hîábŸ÷§Ù ÿñÖ™ƒ9nK”ÆîNz˜¬:jY)F“æEÞ›½ßæ´(Æ%1ƒë?ŒÈWFoÌÞ0õ’÷†9ï·$RÑ40\ÈBÝ›a:€÷À…ÐiÁn{¢áó¬WÎ1 Õ íŽñ`5Y«‡H•Ëô*£T²Ð# ëÐ$ù‡ôze™ Ί ¿Õg»tiVV˜Ã¥f’ð!†˜¥jŠr‰Qä#й–ï3i°YxÒÚí-Ü”˜–‰‘R\bL“%‹Î‰g€ª%þl¹ãÉWYV캊B$J茻‘À>ìJ°·”Äë f”‰ÆÂ¨²€íˆCD-, °úÞ´†ztŸI®/oBÛìE^[é˜Ø2®~ø_ôÊéV·hB]¿Ìú# p•¤?ìćòÊiL=íA‚À¨D|–ó¿"ÿõ¦È¦WÐFó©TÀwåÿF™/òÿ}ôÿçóüXùo—Öݼ†u-íËb<1¤¬JêbFqë&ŽH¸]è_T"bx:„Ceƒwø–€z…/Õ‰B÷§Ín‡îZÖŠ&™œµ…#hP¸äŒå#Lu\\pñ0áƒpòJ^âŸÛÓºåól{Ãâߨ«0 µF¥cRS,&™2¨N¹èç Z8(øÜPé|-JܳNù©Hß!ÖOÔe>Â{(Ê)| ‰…¨ÅÀF²¹0{>¸ƒÕÎq ÜC¹ôçe‰Þv{ätúÖAIŠèSýéDq{ĹVû‘k4.b³“í3C2q ã¹>¤…ü6Þ¸©¦XŠŒÏ"ì³4]ÎdèC¦"®‡…‘Ï^ÓÔD\Á9ï>.*Ón­œÂ]ŽuÄÏŒ%7f[­Ìì&š°#—¨ÿ^Cä£à ͰA:5 Å-†hÕÒö“å`>mþNèО¹&O 8—PfãIBNFIø®fóºÃy´q^”:F#‹Ydúñ»ðY]ÂW@¦êòF´W˜5C¿9r®C7Üv ]18žš<û4¯$‘‰@;˜ôâ‚\´¯8/G2Fõ_:TÑh±›¡??º ]»dWÖgùfDNÿ,e%ê`–N¶ö—Q¾>°/¶á¤&eÖ6£ííeºÁz¤ˆrÃëöþÝÜøóÿTÎÎeûéÀÿþãnÿŸ‡ü¿ÇOñÿù,?öüo󺛗%ç”cð[Ëû–ºBÕ;ÛÏ÷ö÷íØ댋IHÅGÛ÷n°‚×—ÅꯗãÕAq~Ì,öç<4ûò±Y亢dSÂaП%GäþGÞÞÅ”AŠd1ÉrRlTíiï=‹ßLiòß½óþ{üTøZ>³ÿçC öŒü?¿YÿÂÿ?Ëåÿ[ÌÚ@¬â(ôë,q¥¼Ð{Äx"º¾Û¹‚0XâyzÖz±wrÒ:Æks³¹˜Ïy¡~ši`€×¿"—±+Ù¶%%}Wµñ3ø­µõ"ªxd+r‚¥„3ãºGíÖËóãJâdM~>m7àé‘ÅCŸd-Ü0[.—YÓÏs·â2Z?KK7¶ò^—+ÈSqŽÅø‡Þ-ž7;Ånc1[†Î•u Ç9"Fs²QØ…ëöÌâôÄ9Léu3yŠ‘B½”î$ÐN1 VUÝ~¢4.Ío•n» ïp:ÑùéL¥Ž,P•žSÛƒÿëŸ3ŠU„wt=§`%ŽS±…}˜[¨&.hrÝVû…PæS"jÇ÷‡K~§õÞafEfF %Qʘ_wi1Åÿ,žÓÚëÑâÅÓ™`…ŠVç–c–ìÀ]’­‚Jú«VAV±«3F3¥ic8 ™J*ewÁÏo¼ÎŸ“â8ìÇ"—°0(bÜB/’@29wCü#ß©šLi9éB ;d²beæ¼a•{ôßõÀ[´Á,ÕÇŒÛÓqi³f…ë¿@ý«ôðLðX?™§“b`ãôœéA"¯M/OÞƒ®f˜ßy– gdÀlŠ ½5ÂØ6’4üZS°e4VÖæ™—„v)ý “晓„jào¶Âsø£¶<çaF€¿Úš¤>U€_lq/ H}ª¿Ø”äe¨ÈŸÒñC~îÀÿ_{ô¸êÿýèÉùïsüœúA2d’3¯r4‹rÎìççãt|Úœ@³Mó®àÙ«#‚ï¬n¿©ùžMŽ’wO;0Ï-°¥Ì6Áª‡$í¢^¹4ÛZ0~座ä‚26 ê:W0¥P”SUtè…³´5t­X‡=ò èñÓCûóÝÒ+`‘¤8g©c:t-Ï‹ãù4¾(ðëÌZ™EC“(tYq]’93»æÀ1PKvVžË†ù{Aè«ô_Díµ™VÙ}±ƒù‰9E›™Žh€D«Ç°ƒÍ=#©]îã}{Ä+îfh©ÌOÌ/¿”ÓñUv³¸È¶cÒ%³ã&gÀGd=À”[ìtŠ*`‰à‘åLÊ>ñbŠÙ‚‰ååd¨Ô ó¡Ø U4Ø»=œæÌKÍ´„:ô­r´‰¤íh“ÌC*ƒ¦iÂ:«µNÐöÌ9½¥ú5¦ÿ’Ï‘• ÍÜâD¾jüÏéMY`êò/‹¾ &ñÄz•^]t^“ÑJ`sŠ:>,À³}©!ËÞP¬VÛ"º~dF_®xé£kæ`û2<’/ØeDÂtWí‘TNMH A ‹d^iòÙ Ÿ¡ÜŸØA››^ÚV‹ªË@?É” ›JŠðƒÙ>Ü?<Žî´Îjß´vžÍysÒúé¤þÍÖññáëúWO·¶ÿë¶×‡Ç;­ãÛÞí·ÚmÁ»n?ß:j¹RòtkÿÙáñÞÉóu#9ÚÂ;ý÷ÊÆ™/-áfÙX¼X6äõmÑ·“·<-²ó^_dªQªt×VÜ7H¯ŽÓëÄ$,¡ÑóKè÷1wÅ’Þ¢Â'¯¿Þ2}ò:–Kæ˜õ =œ:j3÷`À+®zdˈ õ’•®»ø­ÊàâfÌ+ðš¯á»~3v$ÂÏn>ÆáÜ&‘¹¥©-ÄIÂZx¶@Žøã ^c¤<Õe––Uútf¯2P·b÷®lW´UKeõ 3YÜAcÜ„wá³DÇì6{ e'54dx…øÓ‰ŸµÎBbI}ô&÷ç(F‰¾÷ÞÐ~»­ñj¯õºuìí !k¸ßoÜI½v¾¼9XÚÁŠþ¶[¶øcÿ£¡«ªùŸa>ô3ýÜåÿ½ïbÿ¯_ô¿Ÿå'ÈÿìPŸêT½~6höÿ⬦äÏ­g# sDl…¤È˜†Biz*;Øê)9ŠE¾Ìt/TQÏ1Ðbâ`z)K†‡|C)R£BØ* ì¹>´àJÔÿ´{•'éEf³"å¬@·j&¿°0âö&rÜð¸Â”g>€0]ãÌ‹‚yéȰWþ…8!¶SP¸Ú9ÔFN 7²D3ÏZ×Û‚œuq¢ü®Y¨,‡Õ=%ãìoÓ|Ìb»6æÇþ˜|“R÷ì¦e.)¿¡_Ý‚ Bë6è” ¢¢O`ü¹Fb#Їt•@„0ud˜r#/ !"c©(N %Ó†!\cŠ4,0l.ñ‡”1ô AUd’#k1¹¬AÖuõV IŠžW“UJ8 2ÊVqyW:•ç~Ñÿ:al¼R@>h‘O)Ê¿GÖn–?¡K¨è† [Ê ±K)jUtªfrl€Nc¼ÒÃ1 á œ²É›44F‡…u¨UhÉái…š¦j8¦•2–£ü»yÜ—Ÿù?•óßó>ú<ù߬?yøMÿµþèñ—óÿsüØó›O—9Lj ÌáèVHåÍRºÀÒÄø1waŽy b Á¥†o’è"á᮫ǵ¸]á9ä>§ ¸wøO}4b2ï‚CÍ(êyàÙ›cÜR¹³b$þT“¢ÍÇ ÷*¸…SúËA>yE¸Ûæýèp´a‹6L¿è`žÊÚx ÂÄ·ÍkøW/23w£a¥œ(‡½às_ç±§a]tI"m~Y_–ÒPÖX4'Ÿ(.­¨—s*éš­Aö[Ô’N³<Z§0îSºÄ|ÆVÒ„ò[+¨-§À£%fйF½qYp,[ …4!E·÷Þ®vŸn™øÄ¥”Í5±.ž¤ÀB´$ŒfÃôÙ¤BàPröߢ˜an‹Ý`»JƨæUw8˜„m¾¥ŠŽÔ„œø2Í ×L ¶ËmÉÂèÍ6tX1RÏE¿<§ûÔ öµ2®¼T ’4(c4!.ŒÜÎD>@-¨LDÂHý õNÒ;401"‰O¯v<ü0D­ï3I‹¡<\–`pÔB<Ž˜ÔNHɯ¡g¬ä¿*úWÐ0+åŠk[9J‡+06qÄÀ?}ñÅ9rÆò3c†‹Š<±ÐH"¢«ˆ× &å_Îÿëý¿>éõÿöóm훇ßÄøÏ=úâÿÿY~jü¿¬Ç×—¯ä;`i,&¹AÍZ7%̳~„¤›ÓÁ£±ò !Ù*ÐÏ‹r™…Ü-p¯Ùצ­†WF ›-U?¤ÈÒ>w›!ÙŠ1á²Z(:qþ6Ä0\›$²P²Î+…Ö›Q2t³NÖÔ Ÿ§}¸òi³OpzL‰#m6ºØeœƧ²Æ }}†éâÛ›I¨it~³suA>J'“ïa6ÙN&¼ o5“vÖï­ô e¿t R ª?’-¶Š‘™1ÿÛcys¤iÉ(+6;ä¿Xî,ïª{3ùF±õ+jʧ„Íu]÷(‘vZŒ,P!‡`3á¿ö¡JB?b(¬ÎRŒ=%È=o³l„ÎI·dó†Cý¶ At®|$hJ=ax`Ù5ŒË3èH=j$¦C¾G‡çQIª]°”§%li˜…¥¼Ñ_^h&[bsŽkƒx„ ½BR}ߟ™_¬ñNHœÎ •²Yu¦'ay`æ¦c!_  Иê÷n¡¿`aÆ%W›ç Uã?˜iÕ²º©äâÐ%_R ­ÿÞ+™U !J;[¬|> ö,Q4,‹ (9£ óÍSݨèß Š1ú3s÷ˆb3嬙<Ï0Á½]Z gW“ÌËv}K-˜õ›nªÊ _TZÅ­Kú@S’pÖ±Êí„׬S¯Ê>Cͪi³WÌX;7àô"©g›"+×ߦiw<%z[zÕØo´{Ë É5)â^I!A&WRÞ‡òŠ?¤Œ›¼ÏX»i¤ÐîšwXÌ×BKj3ç„ï$*»eÝæp8}83 ¯€P^±,ð.ì¡¥~!‘ùscnzÎQd&|uë™ ]5'cÂt´VÄ#ÞçN>šªÓ#ç"…ï†1÷1`1²åÙ¬ÑÎÂ’ Š ÂGyàHç^¶§ç,ï úF×ë-ÓƒsÆN38ÂóÜ ÈïĦ äï¸Ñ­VXH?òl&-»*ι•XÑ8Í‘à_jÄA>†r3RsIVWÂñ[È{¦ݬ±ÃKJx†Ý8Ò«¼À=Wÿ!¥ÁèCß7ñ>×Ó·ÇK5¤µ”ÚN‹÷'–ÓÅúñëZ ¡òãðcœºR©>úDzP}";ƒ´êC3!ˆ1gðTdïƒML|D¶•z^ø,Œ;,zÜpn•l:àY^u¢ÑÂâpAø8&Hùƒ’ò1Åb¢>öÄ1ß×ÝàUž‘Ÿ™¿ûíf rLÞÝ.WöÚ•FÙ Ñ5Šj¬¸%:·§p ŽõX+ÃcõÄ_œôm…aq, ¥)”O—ì>sÿ/ÏC'…# \¢ÆLMkƒô]>˜,ÕçA6̨?-ÍZÓV$³©¯SMU¬…ªvÓN>-žâ)"Ò0ý®Ì3Ò¦¸-2fCBrp”³9  §ÎÃô“ÚÌšfxó¯æƒñÅ^ĉ6­ÓÙ‚E G6x¯¾UºöëÝ] °9+Ëïì\1œž)Uû]œGÙ·ÍŸŠuÐèÊE¼œ[&‰Š*Pé ›ncp䇨”s’þm7óá?ÙË_«½Ì‡+p-¯í%Þ7në¤h.±“¿ºN^¦%÷Òïä×AQ5÷R5+!§QSî|£µ.ƒ¹ñdi%éÔŽóQ†]£lÜÒŸúÅ z!Þî=yGÚF!$^(`Àó–Ç. ¥ç´Òv“|Š-åw‹ŒrÍk#ôéOsÏ\ê *öxˆO"/5”솤wåÀ”µªØAµ&®½P4µwW’´EžXx¶¸€ê¤8ÇSÝ‘´ð1H )k—):ÉYËNàz½7dã5ê ËÈþ£‚!öÇwSS-¬*ÖǃùȪVȯ© º€aWp׎ƒ@1¾!ÒRÇTü=ɇÜ_öØ O°Bab—šm¨|®J£üª™´9KÝâ¼/¾ƒó!þ  >XŒó ù N]rïOSÖœ%îÂÇ%¤›ev2âYÂ>5‹÷ü–<Χ£Ä–€ŒåúŠôëh¨¡ÌÈSÕ“3¼ì‡aÞoÖ‰7ÔÑyVÓnמ1^Ô}_¾¹7,5² ônJüˆ/6VTº%½èã­ãFN\€Q?•lãE_4—6  æ è›Í^ä÷Ís%ì74ÎÅUV{–ú­ËÈëºýâ:ª×?õ…ÒÈcü‘¼|¨ýÔËÜZéË&žH€þè" -Ý—P}½Ä÷µ¢ûh8õãr¹áp“ ÙÙZã´ß-`y²³áBR‘VJ ^:òì®i5gðUçqCÁjÅÁÕŒ?ÝÒ•1€4ùQCpÐ࠹댽Àé6¢3’Ä&ÝÂ5ä,gQ ú_±‚ûUÝü€«ošÿä_.ÌÒ2¿à/À þ…^8ñkЇµ>}Ñ1ÕIe€‰U.2‹óôlÖL^Óöá±PîfDp%ôèÚÊ›á;˜G9œÆ)AˆgøXuzFŠ4M;—šZŒü€U¨#3âEsøi)hY׳¦ìݨ_ä“„¡U–ò噬93•^>fL™IeuJ#LÀOB4ÎèZ³„Jgfƒ„ à9èã:ýò‹P-…54§ÁðN2©²7q#$ØõåïŒvSú9—¢³µ˜fB×ÿµHgßÏ´øUmÏ-€Œª±Ñ*ØÃT猀£aË"ïàÉ ëF)É”*a0¤uϤ _ ”’Òkµ· £Ž¶*Ü5ÞjΙ(è Þ·òc-cزѵ÷âh¿õ¢up²…àˆQÌ£FêJ8Þײk}cCPla©ÆÖвA£Þ¤Õ%bµqár#q¦F•zä]·¼¨?/TޤaT&Ûà7Û‘Bì¶;âÝÁ³™ÚµdPhi ±·þzÖÞ{æBÔÂÙóoÐ18ÆeN»¿ÂyŒ‰TPÔ)qtJcLlhöl"bŸÌÆ&`ŽGæÕØ&$ 2",Bn+=%ù®:gt³!jœ¯,§|àäÛ@ÓÁy{¶ð 3·A’‰¡AûaޱÁhž±¦©CY çš]³;ýêa^„Ž»¹ØxÑñ/j3Z7l>+§©:O%%ç­™¨hTÏÓò’ç«a4DÝ­¸¸è¬¼Í0¿l^¿”‰Cî°%Yl©lø&ƒÄ£n{Š„cE-M´òÀ²ß¡;+l Äl$5c’õ÷íKg@¹Än o=Äçk¤¶Ç·Báu ¿à¦-¦¬i¥qsϵ Qˆ÷©9|…ŽJkãl.WøéS‚bÝè–…8«ŠI;Ùhr¹²ú{q¹²K§\›@©fId·W†!÷b½1[—Ô!À£ÑE¾ZB›ðïAÙIm°UèŸeªOTÁ=*ôäÆåõuÖð¥S6©^T53áĉ8«ÈÕ]]O­LBœGD“8ÁŒú¥‡»oŒúF<ßbøÈ3ºNýLÁ(‡†šÃ¢«‡ü¤zà̯±¨-u ã¶€Ò0é0ÄI}¡((xøŽ§Ã!•‚Íc—>¼úðÇ­è`6‡bz¨Ü¹Õ”óµb¼¦UÒ žßV0¦#hÖU¡_½¾·ƒ®~ê¾¾wM£Ä@›½A—¿è¡ññ>êIüIÔ´“§=@ š’zmÚ ¾t!LÛB|c—í°¨ïž„¯Å°Ç:—tX“©‹­'Ø0$ÞÍ>ÛÀ>}9ÚP60¸nÃ!ûaoÛ(†ØÝYõ~ÏÙÃÎ:¶ÌœéNü-Lsò0ûÇ]'nåƒs!AÁ³/aÈ}¨üaIÅùˆjæôÏÇ~9Gôˆ»‘Ã'“ðoêä;<¾Ó™‰Ö:Ùõ»á””J&“RiêäÛqšdÉÞQÔ­E5Ñ*L/“*©@TDm ãmiP[£æ¨®™Rü}Šr"ÈÏ´x½¥öööÙ°Áÿ}?\Y›©¶ZÞ­5Þ-/ƒ ÿ*‰-?–bTÁ%Ò¹e°µlbœèþòA$¥æûQõ¹+x?Ò †¾ë?ý ‰|N'?‘{¼u“¢oißF×ó¦2 n¦í§BÛOkhû©¥m˜Ê7–¶Ÿú´ý4¤íÚ1–/ÞFJ«›NnY'YŸwH³yyÖáõdJq®n‘wƒ©²•Ð2ÔäC9¿ûgûßRÌvÓfœkPV·ÿ:ôbÎ@îÞfÑ.ÛR\mj–ß|Ü™æ"¹ÒeFÈ‹ò¿ÓÄ„ 4­Ù¥ÜÁ™ÕVˆeÕÿNà÷H.tØW.‹fþÖÈ€ÄæšV¾?ó6²dÔ•¢ó¶ð‚ØÝ€‹™•šIÄ! cƒ?óG{KÚ&Ù$òÛº¿]:°+²eÚ-PŽÊ†é¸íÒÑÍ¢ÂMeâ|S?6„Ñ0ò¶¶¡ØyÄ$‡¹lru·ö>ÚóŽäZ%áDíCäÑ'bV…¦DÿÕÙNüÕÙzÿáßâïù÷G £³sÅóÆÏ‡ø÷_³“u8Ç*hŒé+ÑÊW+Ì쌎åjðp(PPo;YÅÊCøE6D¡eÛc©91Õ¡ÝaÛiV `ù0G7ümŒ‰lRæ ' ËÏ>BO^Jż°®üÅÞÁÙöaûä¬}´up°wðììä¸Õò´å~„†±M¤-žÑµb$®3J)k"`ÍÅt^.øùÞþ¶!·øÔ2Õ9UNgªª‡¯Àÿœ²~ÞÏÜæ‰ çv«’öíxZ¾Mû¬ ü/þcý®ŸI_ÐÕ’¶®§`•g‹þ9÷û„Ù›TB ¤]¾×yÎ5VŠ`±êkUðŽO¹>¯ì̵ÊJO õàÀxõ×Ñ;- y›àlй⦆P˜t0ÒSŸÛ)m—,ëwM§Î”ŒmÅ8`õŒµd‹U¹õ».ñÎÉS¾neœ ˜²ì¬"áduòMì×¢£ô|úoYçÄ7(͉Q±›õ¶À‘©+V•(¶0/Ř/Ì1‰Ç« ]– ëÊ$ã“!2’¬•á“m´ [âÅÆ³,2«Å¦(BûAÉÊÄ ßÛ:8{v|øòhfÔÒ<>{½wòülï`wÖ¬…{ÅžÞaSÄA3“Œú@¼ÑEÐ!Y…Û™‰Ñ³¯ù?ÀYð¿ZbåÎÆ+½¢x‘àÑ÷µí)ëÄ››óK0¿ûMáfÝ ô§p] j?òaÏö=´¨¶]jÖ\29±¹ØŸ¹(‡¦oꢺñ”·´åuù®FjÔ&´†¾ÃvŒ/iðtV£?kÃF…ž´Y?E‰îAì7Géä2–Ço?¯¥æÊkò´ádÙoµ_oÞŸ´àÐ9Ú:yÞöIÓa¤”®Ÿ{ŽSÏX£v¦ß=£ïšê™ 缚ÐãKDí1/BA @¿š8›µJgÉ©ùú¬V/%³6-ºùºH$ÕJYEoü©âµÖlûë[ŒJT»-ÿ5[ºmâ—Y¾Ý0·­gÏ3õËg|ñAúò¥“çõU©®¯aºŠ¯``憷‰Àÿ̧Z)ÂÌ#ì™Ý0wˆž ™=ºéxp:_¸G.” 1ÖŽ§ñEg!±Ä²Mˆcæbç‘0UM7{'•ÎØ§§Ufè'ßK%‰Âaœvìj¡q”5uåg(õÆ¡Žàô´$ÏÕ«ç'¥ÑEåBˆ] C¨iÆ‹DÓ–4ç,_2"kÅ””Ê€L P~e ¥„…«ÍêÜ&uôŲØå‚…»½õ8M†xûFFÍI>X8 z¡IŽlyÛ0O³~Wv9ßóìøâ™I[¤©ÆçÒUn£ö““Ñe„EI–ˆjýgj8À¹ô¶Z—¹€ô;#ذÓzzÞʰ T﵂¥ÉspË?Já–û‰¤­ý}èÛÞqû“Gè{‹p'åg>Šþ™£†\AÖ›÷?qü ¿íàéõ‹›îÊu:./aƘðvñÙkytÏ3hÞÞvþ„ßñ!z³¢¯*G*¥hmï8†øð™G ¿ýàñ®‚wœ=·Ÿ,ë+Ý|€Qz¸ý–sÆ,,MWË ÿÌyƒs£íÜçÄ‚sÏ> ¦z4kNššêwÖLƒ³faemN›éæUå´‰Ôáãéu—NþZeø:S“·!„:>lÈ&S¤s‰4t).‡e1ôIÔz½‰Z0#P¡ØƒŽ·Þ×Êš=ú+ƒ7§|ðžÛy§½PÍÛ¢ŽcT#§¿QBb“?ú£qÆv¿( $éþ§y³­t¸"õäxë ½w²÷ªu¶½Ø~yÜŠ“+¤l÷8›ØOŸI ˆ_jà*½A ;Š%Bõ\¶ÜPÅéGK[mý¼41êƒrÇסAmêT>|Ùgèƒô]üÚÖݯ'µCŽÆz{C·ª(ë–Ã~Q—sWÖÈ¿“‡ÚÊšÏþ´"ÑŽŽäû¥ ÑÚp¥9"4LM×¾â`î¢1‹Mî(µ8~&¢Tœ (Sµ»’ûLT ÒÚ±Ÿpêëúe>s?‘¤Æÿ€€Ò‰Ðy>$ÀAwæ© qz‹æáÊx€a$j»n¸4ž9…Yºà*/ÄÒ‚n$•#%€S¿6$¨±RxaêP/®$öýJ-ÎÌ5ÞE1Ùë§ :‹DAÒ{/Eh?`¯P(‰¦”F‰_ã!ÎÙë®,>F§rÒ3טDþ4 ŒD˜Þs˜ë=ΨûÓ#³;c$ †š5DŒbì~YQu&±mž­AƒÎ>æžá9©£ ß°HûYÙq€f¢,°S«ƒº^`’…>0ó÷§D9{7;{ŸÃŸkò!­÷ÏòS›‚Èêz‡²âõ<×Hhù¬‡ïƒý”(b ¾²  UÕÑ̺ÄÁ ÞÊ;ñ2›YQ/„Ã7fˆ1ZÐtœ€ØüÔ6èî vUÌm[?íî¾öÎÂ[oFz!Ò¹`›Y»ç•Ç”ú‹Uª9ä—àgrß‚ÆPJ¯¾Ž äÖ!Î^ üC2üa[Ÿ»¤Ýu/rsŽGБYÐ…·o]“[#|1ú¶-±èÜӲΠ{s¸T}-g´CðÓxzû¼êxC³HŒQR™$¼c "‘yÛf*…K°é±s Ë)‹NNñhÔƒ…ÞYFÞ±¼Mò³¢ß=ÏÆ‹Ý‚VFÓòÒ‹Í#§Ô)¥oV©|„rÔë Ùfs(×où|xÖ¡…ÁŽGC¬ÝÒt¨ðµË¦Cé£u“ÊîMªÛ·æv—; Eï~ãQŠ0õ²5œ¿<ùèÌ#ümûø7¨.b¯ËØD:ZÚCùWmîâɸ}éÚ:‡ÜØÃ£¹ ´r'Å9¶ƒŸÀ)[Ø^à:¢Ž_#ÔÒ+³b¶—Ù{Ïñ}Õ¼‰çÏvŠY•R †|‘N({{}¬Ì@ÞÞå65dz€£ ã,á =Íá@ŸÀy©=iêGëŽ@´ {½·ý#€smÊÉ—ÊeD±Ÿ®n§æ,L´ó<ç8 º œ¨pn½³Ïñ^#Èç#ê3g©ß•”ÄùhëødÃcK¬ œ´ë§>ž³†ÕêRû÷¿—C+.ào0×@`w½«Ú×~¾ÕÎBêimí%uùÚ‡w‘_ë£Væüܯ‹=Š ,ií‚s¤”óã4›Î×8ðªïaJ翞ýø²õ²/=wMš;û6!×¶0tV?ø£-@‘_«?~(P4®e;êècÒj¹ž9 Ü;›’ušCQÿ•¼¤Ñ¸×”×±ÓÏ0!Áuü°àÙ>­Ì­ãYj)ò NàbZùþÕp!ÊìµsuÕ‚iôûÊwÙ;ú:·ö¤ØÇÃè¾#•¬Îu$.ôY@ËÙ)]ÀßÃà ™GW»aBå”$±§¾Œ³¦qq6$äíª¦Ðtkt&Jê8Úyß+ަû;·c-€‚*`î½qDÒ„ —kñ.XÚêçiÇ-'ÊA@ؼ’Ï0Y û°“ۻϖ„Û ™þÖ”´'Ûƒ1’íÐØ$-Òey $åxhU 4lä3jg9Yñ²zEgJ i^@¯¶7¿²ô–ÏF“'1(T¯Ïþ¡è ª·yt=ÓÀÙ?öú²èÇ2ý|`îFL­0¤èçw‰˜YqÈ:­.$¢p~KÂk ç]@ò2½BAkBùà ÛЦƒR«Põ0r¿ÐIÇÌ=£ô<@*¨½B‘SV™äå%­FN°@سÍìË< õÈ É”ë!([G€Ä «t+4&†}U¤àz ô¼$µõhÝý¥Lê—2jؘ]µÖKž²Q€—ÑÊÒ>±ùŸcª Õe×ê‹)L®<ß°zyÔ/¼" 1‘ (\~R\d$+£Ø|ãbƒ€8Z]²É¼ØÇÛßU Aç ©¸- ¤sƒ³nA4ÏoÀ¹•'¡ü8Î…ƒa‹’ÄÎGÂ…¯&’Ú$ÁJK(Q¹V 7É"“M&õˆÞøûtdºråÅŹ-­sl$àCKÌ !#Y©{™ÛŠÙ–¸X”DŽ…v4·‹p¼ICBà9ÂËÚŽÀÉ„Æä|©g¡"]…G¬`ФÇüVðDçí5:äëWÊ9D¨iÄëã¦y#3•¶‰ð#PM$C¡¸ï™²Hl*ZL© mç¿Âá×ÃÙ~•u7<ôQo t)õq {´làØ \`E Î,)¾Ý2SÄÒ¤XFÌ;ºMb– Õ•e!4•.E2Î冟S„0kìůëCßîàAG»¹ô@*=µŒDrUÇY![¯ >=’QÀE¯(­iÁ[J÷÷JÊ2ØÎDn6's¡¨›4ôŸßÌü ¼‚—@ã}ÜšGÊïæ%ãlžøìè íäÌü £Õ`$¾ d#ú:`òA&Ñ«i³JJë>sC­È=¥²v‚&²Lè+çåË„’Ë•P”÷r@·ÈmÞ’”„¡mÜ>^™Ýê‘'~i:—i¥³ÀZæ8êë-üú7L5òað„gÎâ¥ö‹Ä ØÜ¨Ëú=°&¥?™Íð;,úab¤¸““ ¥ó_'Ô…ê÷£ïº0 pü z¼fû2^ä ë*8EÔÑKT³tª…Ǥ}óúŸÿú–¾ã´…]gOºÎ(e·ôÚ¦+Ÿ7ó½é-]Ÿ÷²¾ã’ðûªÛK½ÇØ :Icz«YGíÆ Uî@¥}·"ס¸ö1â˜aÖ"8Ôh)ÇÙ•‡™ÄµG¿Þ„÷"ŸÎÓÛEX_Q1²'ÓÖxªð¥ÿ{¼ n$cî‘zÚŒy˜‰—5@#áÈÑÃ_‡çiÖ¦%«îXÃä÷RükEpÓbɯ®X.Å wì­÷Ïy$SåÍ6ɽˆËë¥ÝCøË_ ~ÿWÉ$2«Ï¼ï-. É‚WiXhÖ»/So®X¾Lµ`"R/¹–Ê„‡n¨v¦$²Wçú¶Xƒ1LGpÁ¬@pܦ¹/¡Î Vâ9§¹ÆvÚØÎÒ³½9 oü­}°uÔ~~xž›V ½tÞ<C ]½+ÿô½嬯¨±{ ÿœâ3¹=§’H8ŠÒÒé2QægJô—ÂSÒVwŠÑ ëU˜%6ß6Sg –Þ!™Myâªiôx]{N Û'Ñ¿YŸ8Èð™TX|-hOF<I[(çš5q»¶ w+“b{Xg÷Ýwóæeáq×=­8ëÛ¾hL½r—Uôâr`!QSŸ]П‹ž tζ_„‡ð?,óç:#íH‘W)ëb?ÿ{ªˆ•vu±Pâûzö9k† ŸD.JÁdõBDõÅa¡‰-f ú"ó/½óLùÒ¦K˜WyØ›„>Dʲ¨Îb£µØØ[„j䌡½Ëþ6$ÿѯqA÷—®–Í`þÁô–®ûðç2¬ðyñîý©Q7\tOøjaÆPÓ­E\ ®õÞ&«¹XÊ¿6ú˳9ùuŒÔÞój_.í-‹ àõ«>NjR±÷Ì¥ÇR+0AÚúŽm‰[Ïïþs‹‚8Ä-'óЉ,¨ùÕ‚Yâóe€ºKvE’“z9q65 ›]Aåñìõ“ Wñ%hp9:KX ŸcNËñˆ9«ö´F¼Ò@¢Â@…ììÎLý-»7hÙƒ ä$á¸&K4ߊz‡ÔË~K4:_j¡¾äD”x†76ßežþŽmÁžÅ›Ïß¡´?a—ÚL˜µ;Ô¼Z´;íÊüÑ aoÉvÔ …ûÑnÆ?½÷Çá­;¶¿TÙ{pÞ…c®i€¬ ï±)_U»ÞžîK7d$ôȆqDC¯½Ɉ»Ìþá¿‹žÅ²BI_»G‹s¨kÑ‹ý§n‹ÈN*kúx-܉*¿uí”äûp[ÿn“Xç5ùqóõÁæñg¸‘„íAz]Èå2‰N#ÎND¤ìN›F…æÙB½ðì¨!)z «ù¬«¯K»ðÌœran›Åv±áÛÏ1Ø%Jʯ´ Ø8JåúnßœŠv º¶¿h·¾oiÝ–¾Û³ïzK{8¾ê¾¨‘.aCH Êi‡pHõ>ÞÍË_IƒNEPܸ.{sO=rag+ñ+J}^…׫=ü°ÞŠ·Ë¸¥gü€~?G¨Z»3y [ÜLë&ðÑ×âø\ô?¬‡â _Dx;‰ÀåøyΙÇx×z,Ê1'·4¬ï;½r3¬Ô\ò²®Xû—8„ºll˜ϛv`†fçªÃë†$™"¾ ¥ÛùÑÿšxBñ·0–ÒÏþ6á?©_ì‹múú¡6ä|Ø/É`B‘»æ—Öi÷}9™Á/ø:-qÈ…¸to©lL?‡Ÿy£aFášä¤y†©ÇÙ€¹(1•=ùþߦìZDξÚ*4ääÇ>ô^‡ c­“CL‹ÔP—CïGîÃb…Œ Dé5C‡É°8cÅ÷Gi 0«|تĉÀ>Z3TâNY 舄)A—!k‰ïnÓÒÏ)³,ä@Z8fÂ}.±ŸÓþÛ àÝ)bù ¤¿“æô³=_»§^h<îl‚²PJ%7ÄÈÄq~ch¥2Kð²÷¬å‡Z7+43—GªMù£üÅ7ƒÐ\]5ßùWÕÈ?§–>n“nëÝ[£.Ô"[GÉÒ“…6×Ü3ŒµCÝð…‘^7jî“t™MœŸe°ú|«`Âk'fw‚”t®“TL‹h6&ª¡ŒjhQ†±0ZÊÄï2È/å˜!ß|I?CW"Mâ(ƒ^x5vú–•^…k}vt.÷hî‚ËÚÖ¹eÝîµõ[5Ÿš*øï€(jiåoŸšVðjë!á…UZÀí 䀩¿•˜þö鈩æØ‰ý ç’‚·òÕ&ê¢W·p’¦ éÑ5<ïå¨}|?ž½˜±ƒòòiÇ'þ=*¡Ð{.¸Ùl®ŠÆ²\ÍFÒí&üָλ“ËÍõæ·Ò ~Î5ÂfhdƒJ£ÁtÄx†^~Aµ½þ%[Vú¥bšAT#ç(è×K‹]shú³¨‚#2 õ+'É\ cZæ¿ï¦`Ç儛ɡ¾ó\ƪÁ‡(^¡$gjH_'ðBì^Î0ƒïó?®ÍX:"+ôB…±Î,ÑÛ`LY#I4ÌЛŒ”bèÉC÷–í—œÁ‡Å?´ò ¡ì×øôר{ö¾ÇeüI§¶XYY»]B¦®¨(~ZOp‰à¾:“ ÇÖå‚ MúºvY\£Õ ‡bé§Œòö%¾,ìQ—”Ó|ÂÜhn£êžgái'ŸdL6+îq㤔nqA {¸}šSÜÉu›¼ßŸ–“±X>yÄ„±OÔÄvØfò<ÓÈ·H"‹½eŸC†™j˜í†Ùi˜]ÏäÙŒeî¤,ú¹:&Bß*¸$7Oò³Æhi$.”k–¦‰Oã6•Mó±=G ø¸À'd×VdýŽ­3`¥ *óvœ¸tÓóð*O'ͪa!-©„ìÜÍ=TåvOî5ä·ÌÙ¦Cv·žøü›ÜÎÒn—Ý ]UO`-îBÇäºã’1ä,©vCÅÛ1!Þ\Ë%­¸`r‹oRÄ<`ªÌ÷¨¥E Ä%üàŒF9#¨ìl=óøb³Âóêéãžì¯êÑ‘Ž­¼=)îm;,±ÖJ 5D@Ç¿±Ïñ¯3|«Û3Qã0½rV6 ‡¥MÝ MW{½ù(±)ÕˆéQçX³VHɰúÕE¨®C•GŒ°dêæ«ÝzÑòÍZÔŽ6ƒ­4±„ ^g ‘ÿ¼ ƒšg¶ñÄ9”®Ðq²:Ð1ÃOÜ”hTÚsÏ:¨3gƒ–äp¯æP@?üpÎS·•8Òœ¹X,æç¶íý•‘+Ìo›Ý¸¹+ìñ–êç‰×»[áFð@ÁiïåG#ôky>›qö”0Ûs@Æ7Fˆt2ÁfºC°†2]àH—Ð9Ç, ü#Ãf¿‚Ç~V¬²`hÅL²dÖ(ëÜïÑnqvž³ÍÎN—Þ½{wŠþ1½ß°Õ\‡èŽ}v:Jø¨Ÿâ!‘c%Š 5.Ç‚7Mì³|ûÓˆiŸl|Nߨ4Žw=qaìÔÏÏÚºõ|Þ¹EþQM×p; =>‡6uò#â@Ò_,>\DX,½|ÜGuŽpBìĉ 8åR‰Yð3jCµñh¨$—áDà»ÂÂz€Ç´£úr Ÿá‰J.¼è(÷øÎ¤(åN&˜šãDŠè—È@–h:mбo£'y'mða¶i¼6™dl“ó…%)‚45¾î#ˆÕ“R>iÃÞM("ºÒ=ÎQzŽfͱœ¾m4 l£ÿñåçÅþñ^{{u§è¬b–øw«£Q§ ÿý”ßx?O=‚ÿ®?Z[{ˆÿ}øè›ôœ~ž<ùxþpþïÑÚ“ÿx°öè›õ‡ÿa|ÊNÌû™¢¾À˜ÿø΂ËþürådвóçèÒçü9µ7ØAGÅu6>Ú6O1xº5ì¦;ÀËYgê Zo²/çÐOeÿ³Ú`%:.pûþüäɃxÿ?yðøñ—ýÿ9~‚ýÏÄ`öŽgDÊžO0âSB1ä˜ [œîãgºYÙççž-M1FÖň飢&³£ ¡ »]²áÃGHQA<©i>ô& ë„RW…rQù9ÉÐÆMÝ+ëÐÞ±îNï‚æ¶NŽ÷ ›ðŒb¯jÁæ0œkï }rür£¸ÚáÛ#x{Ôn½Ü9<;<ŠÞmûíÖþ~ôø5<ÞÝû©µsvt¸wp¢[åeJi»öšÛÐm|Jšì|’öóNùž´…dŠ)gdœPh¶ß±=+5æDÚíÝgÕàfþŒÂ±Æ¶þo¹ØMÈZ¢ŸhFµÃ ±uÝð­qÈ CÅFe6í¦•q‹vmc¬ß/½&…‚Åê› A§œD8Bh˜×=Çô5]FB

=8<~±µ—}þ×£ÖñÓýÃíÿ2aÍ£ßòÇÙIlZ3¢Rí¯߬a Õ‘YPjÓì#–£Á9ÜÇ»z“nìxÜÙ.Xæ¨ÉÛà¬%ÚwÌN’}Š=ãìE 5Líû,ͺ­áV¢ZÑÕÁà!Wçiÿ®ý«‚dêª%7®TsUhÚlú‹4&•Z®Šø}Koš£š®lß¡"ïkúŒm^o£!B§·›ý7PQëœÎ|2k¹¼ƒM…»ë)"I¸‘Pw–{Ŭ‘ÜMlTZ¶m†Ú‰ÒŸ¦õÓÞÉEþòòEeË…%v·€'Ÿ½ â !9œØ…qDY=¯3åw®ˆAõ̶›ÞT«˜ñ0á-3Î p4w{»‡2wp€Ò?†³·É×@æÞ{SÔÔ¥tÀO©oçX_nœ± w†ÒRÔO¯f†µDÃnØ©ià?uŽ¡¡,»_\¯ô³+`{(÷ÈÕÄZIWÁ†|Zômõ\«³…6}³b¢µÈv|Äè k`ï/™f2Iû„ˆ‚3ŠæU¾ä@?P BdŠ>Í9F°¢#ž\{þ?ö¾>ªêú?ìøÚ*¸Uq{`ÄN†,`$HÈB‚! IX,P˜Ì¼I&3ã,„£âRë®U«•ºànÕº[ën«hÅ}këVëÖjµ­mVþ÷œs×7oBôç§ýý?G3ïÝ}9÷œsÏùîÄíÃÂÀNÇlxŠ‘¦™2ïK”]æô%z×-Y²$K™mXE€ˆ<°höÍ]• €®™Ix—gAyî†À1Ò¦ƒýózwlÞNæ"i£ÙD^ÅéÈÃI!h Ç‘d6"ÌÆ7ÕÕ›Ì.«ò0Ññ9:4ÈúTD©+‚`¡±bŠ\‚–ŽM€èöÄI§CXi¬+É@,Økiò-šYaï6vų65ÑÒš˜Éi"³yN5‘웽Ûf›mkS^h…LËJàQüÀ :ìÈ7!b4:™Ðé .Ø'Äãæ’ŪËÍ%6»–„Ö—+ ­Vã—È"V“A?%/%RóÏ 7üùÄ×8rS9Ùºâ²Ùƒesù÷ÅÙJ$âInøŠìŒŒËÀh¨Ï¥'V¬fzI¨§ˆ€ªöt~…b;ÓQÇ6é_¹ÕÞ-8yþdÓË¡çf9zšt‘£× 0y§‹‘*÷ FljÇx<=”t‚ÊóV@ì?h¶Äç>²yÚfNBc$FÈ»/’‚e+Yì<äü¹rX/òŽ8ñŒå¬Ž“P?*”PË=C‘ÚàæC»äö‚tº>Ù±Ä%Ä.Œ,v ¼ ˜Vw–’Ð}v+3]Rb‡3L:3ßPû&Û› TÓcÑ,xYÍAŽO6vBÛB-uÔ4_ߎR™ÙèCí@h E»Öóë¹ð«‰:kÝXäÜž'ƒÞ£‘”åH®EP4¶H¾ÞÛogš:ùÛä¸îìÀw‡_Ù4whÎ;TÝî;Ê7Ç}'æöÊ!Œ§æ‚MšoáëPâ 4xŠ›ƒòñ"}<ÜR•”x(ê#–VÈaº?5U=„E©Ê^›†¸p8è‚ «A!ßê>wtº9aÄMºÄk˜<ÎåÈ …;àó‚0« ·;ý‚hz’# ÉßÀYèy})'  ¾Xžm×ÂMHT~Aÿ'1ÀGÇØX¤°?!(2vB2ë~ˆÄ-6JqÖç?IõÙÊÞ½ÏÕ)Ž È•×=Œº>”W“@38SŽª‡/vßIò€V¸ W°é}ˈ$<ÿE#HÀÉç\ZšÉêÙIÌ’Õ·Íon­íjëXÑÕÑÐà*©Þ(©¾¡½¡µ¾¡µ®Á«¼ NÕvK[[û jD15’,LG¢P^ãÜ »š[\×™ðÖ¯®— hfošÝ— P­úRÍåߨ_ËV!iPVÁRýøU¾`3æý"ƒScÁ:Æá›:Êáç¬*¿¤ã+€*ËB!lÌ #!OAì¨bk`Xj™Œ!åÄq„ä+ä|YJZ†á€E×GlG_`å‹„öÛ,ßð6!Ç'ß1z¿TôiWH/I>oû˜x&‡ôn îQ43ԈČ@K.†ËÖÀ’QÒ\®¥Ø-¸s8•Uo‘.Õm“)…Ñî`É;#ÅGG‡wpa¯ÑB ÷zÎj[.Ÿ¬…ÉYø¬¼<Ø ø íºÞCEÅÊÍú86«öM¯ø …e‘K„lh²§ÁÀDÊëp"X"°¢ýBïæâ=õÙï v$§ãÁxT*N™¤´yPÙíŽ-xŽ(ØpV¦“ œZ̽ 0 „?ôX^÷4f¹µsÊÎ=Ð0Œ®%ÓÇø>Dˆ³)À¥`‰Òƒú劗–ë¯ “ëDÀ9’«Ó—µSˆ‹Âq+p‡‰²:1¬u¸\ÁMfåÃäÅ<ÊïɤŒAQ Ç2ÄzˇJTÙЀKì¹}8‘S.iFVUÓXÆ(È& aqrK.~«H´æ@ô;Ø­T`À2˶'5N♳vÚ£½®’ÑËXÎ'-Á•+§LÉeJ⅘ͫ©âàÛÝe}ê{*kÇ“–ü)½ÿ]˜Û]p½a\3JOŒ ¯˜oÓ©šha@ö’uôéjжAÃÒl§, lÒÕ«“<“)„A±V®diÊ„üÆ(}ºäŸ2…ÊaPQªS&Ô –+Üi §vÂÛn!«Õ¦Xj‚D£É$Ä ÃÚ$Ѿ‚|êŽßEÉ#謈>‹ÚÀrGR1>Ú8‚ㄨ\)´'ºsY*§hµ"¨Ï);7r°Ç„Í-ª¸By@*ˆÂÕ9çâ¾nBl[Ü%ƒpyqÜnç[CnØ&#݃È( a—ö<ßRå.×8Š(9YâyVmà!"nk•¶•¥‘4lfyë©A‘L@Ÿ® ÙÌp¬85ƒ€à$³>iËâB4ëX”5‡±¿Gám¡!k 0ÍB35À ês(ž¥p±.Üp@þŒ€! ›g2xQU‹¥Ä‘0ñÚR̦¹²<¨fBB7dQ©Ë@k‹§u cÑÈj°Lv CÎóÞ,[ÑÚ°ŽÛÂÇ r¢„¸lÅ܆Ö,âÕör«¦Nùrá%‚•ŽÈÀ÷1¼‹ÆŽ‰K\u×â¶PÈ’ûþŽ%m‡”$¬ÃSAƒ^‡YØøê³£bšÕ¼7 o®Õ¯kÀ«¬tøÄ× ’jm\Sšk\^ðÙÒâñøæÓ®‹¼ô·;ZJ‘”ì ÛøÍfw¨%¥²æã°s­ådbž–Qp9á i%gÉêµ&È»E[» 6ª´`)œ’1_ÈÜL:ë-cá¥JÎΓëVçzÂQ!¿ÔfršÁV 4¹¨0VXl3Eìb„7eœš E . Ùæ‡(~p5V!I¸ÓyDpÁT"À£ÏB{÷F’V§ôÏïÎ ç!¤ÁTƒx’ ‹ÇJô¬²)?7k+³¨0Z!ê¥rMÙA°W6ו"¡ŠQ‹–JÉ)† ´v\LnmÌH.•}â1`#‰ÑËPšy6>­ñ4'MR¨e–>‡qÆ5bûÅF** šƒÀaPò¶×ÂÁåVt[ˆyáÐãlK&hÀú"Èé)Ëx%õ®‹;µ¨0â*Dß´…‘Á‹A•R+cƒ‹ »±÷"¬–ºE«¸¬í.Ä,|ßö¥z0 ¯X|1h­ú?ˆNY¾Ä ¾`MåvNñLÀ=àšö†ØoÅð¤SÄz³ý j†¥ËΕ°_T±X0ƒ‘òši?·å$A©S V2¤”gÔHÍub‚/àÒ‰¢¡ deQgΈG,†$bþ/ì÷RÒãÄòù¾à™î¥™Fų=Ýs}H©Z,ˆ“8y*Ôû¢þ7_‚vž ]·ÕáåsÕ.;Djþ’ÏèMCx:^ó…M*ú utBfŒùh]ÑÞÑÖÞÐÑÕÜЩh¹[I®\»63a»–°Ý;É-ÉLRìÙ1XÆ«bëHŒE,å4¶Õaí¿¾.ËÑë f·8À¼‚ €‘LF¨É*tPÖŸËîÄ9[º Q*~csÑK·”[–^•C_øVµ„‰ÇL¥¢$ñ#=â¿ÉV›…¿¨C¯]9¦µ,ìdK†š“gGîx76âê’L{ž›—F¹Ü«¨Q®÷âi¤eCAïeÛ¡2¿ 0¡=ŠÒÞáŽÔÇw¥6%Vîfôê>ñPƒ€¹ón>Q¢Mg{¥0G+ßpá&S3kçÛZ z`ÛŠ+ hk‘~ go±2ž³Á$g)O7K„­WJIâ.QÆdx§¯!eÒ‰ á,"=—ñIàF±?“Ž÷Kg:ŸùCsh¿µCz\.¶'Í~ãÜr1¶E;Ò{CZÂ)O€êáiM[QíøÅRù–tÖ Z7ˆ4îhyɵx¢†þÅ þ'p ¯SÏò9¬:‹Û:K ãüvWm×ìˆøN÷±¹ŠÛ9ôÓ@c"I†H [ ” ÿ™lŽÇà 2:_bÓÍi ìC–€l€ðàªÆâu±Ù‡›´? ¥ªa ² '×ë““_pÓè‹å£“”Åd»COFz0ì¸Ô!ñÆ 4Áùˆà[ì½~– ehœ´€.ƒ$Œ¾,BUx‘k“ªcÞ&„±M4ÐcÓNæŠ!À—•. Œ'oi"¢Zé^³hèáDŽ-TC*Œ-˜7µÈUJ#ñ…ÄxÙRjî_½K›ï(ú™ ÍJ{+?]ϰŒ`‘•NîRÈè ´QưaôZ g ñÀÆÿD#kx‰1¡"Ø¥„éars†•ä.üCvj²Ë@êå~Ä6óõ:„ƒYnœ¡¾ÚkÏ‘ŠuK—®Ç0Ý1ÆW÷ëõòŠìD#À 6Ö¯Që!’k¤tcÐHܳ99Vd õœ*¸Ú0ÑÊžEðq ?, \–äÔR3É #´qmêàóí87~­ï ¢PT®|L*ÚW§VŠ×hánb£›wTs5Ɇã¦Ç­yŸïºA,Ey As÷g!x_FÆ —æØqCÞáÊO®Ëõ5 ×ré^Aù d]³«›Û\«S[‹%ø…ëÄ}šž"\)ˆB|ñ­Íš”[špÂ…=uX¹f8q|Ï‘£år@øç#3‘5v†ã@gí5…òuD³^%ˆì°b?´&3¹T}áL”¼†"Êm8-/–cqº¾äÃVVqéÂb¦‘…ˆ´hò€øôŠ÷£#ê7|p°~î­R¨ …ðH ÆL* Š»6¥©¥&¡†„W_3ÂÉÅ=°„ž)¤ÒQÊ„èQð–ð›Ókœ0y³:†ÐˆªÊi ×ó‚Œ7ûÒQˆµ‘®…£Œ«ê¸ÊW=¥á*µd_Í3ô åQ'W´«>®ëÃÃÅs³¹ÏŒÄˆ—"ôjJ¡F©$ô¡•ÍC9s1J–qxdmeÑ‘8ð|¡ŠèèÙÆmìŒD–*½ñM„¬ ËÜý5g¦pߣ;:GyçËFë÷¡´_ú#)G2Œ…@#gžojéTÏ7¯Œ4¦QøÀ­é¢}4Çz Ñ>* 7Ä}á!4ÉLú­¹îëðž°?—àè*Áøq°Üéñ4×çmF®âË·ÙltŠ “¦U5x£s›Í¹«åm¶ÎØ ©íz}âàj!ÀZ1x3%½érúÛ;Àè!÷2t§ÎåÛr^MCjÂw›9¨A^bß oŽŠ?s¡Õ&Ï‹ÁGTMü0Aú‘Ò—'ØKJΞê¥FTÜü^VBÙמ¸véVJp&‹øXžH†~&¢Ý"^‘È"nÉØ‹"‚#lœCFš¸MÉäÌpÆç%pkUwÀy±|qΊ2¾5Å…òp6ù;Øë@‘b[ ­Õ¢ytZsx‰Xúðàa¢sr³ÈÀu"ΆŒñp®”6 y}2Ý=4¸ç,g—\rõÿ6;'4SžHÁÁC籡(ÑÊ­ c;å·vgÓ!­»Üï\@ÖÚâVÔBÏÃùkȈ)¤ÓL \\" ?€RãIt:”4§“ŽRào ¤Œ4HK0––Î!–\%©ÎàúÍ‚÷¹ð’ÀîEÈÞ–/oÔ~à.)´t‰‘Ötþì|ÍçÍ/v|n ’ú¤Ðí…¡ëÇøîçƒì=¬nÃD æQ8™L‹C*†3—¥Ñ”Hii6Œ‚>|L õŠYësX˜®¸´¶àª©®BÜ$»w…îu)Ì« d8 ¹ÎÒ<7ê$…«GYPà»ÏÕbý™àLìšA`C:á"9hóûúv èÎ勜K`JÓ¦ß{gÿƒñrðÿë*¿êðCˆÿ1ÝÿcZYé×øÿÿŽÿßÕl×U®ý:üÇÿ¡OÎþGm‰³6ñRìÿòªiå®ý?½jÚ×ûÿßò‘ûŸlHÖ‚¶(Å­’j¥¦›nù6+ð¯bløbiK½‘ö1Àb8À”0Öˆ Õ}p€ŠŠ|Т˜”¿7 ç³ü êP®å® À¤W¥®Mp7y®å²Ý-uF‹û™¥Ãs^HÉЖÎ<讓´9ØÑÂe9ø„ ñ/Z—«6Q+܈œ²ʬPµ þßý=Èú„QÌGÍÃÇßB`B<çÚ[vŠ)a5Ì¿ð·ó›[}½°¥+ÿÛúæEù_¶t657š™ûãÉÛ1èÛÚÖú|¯Ú:rßhŒšÛGßÞÓ\ úìå·Â8§  2x ˜tˆ:kËß¡¡d£H¥âÁˆ„ê·9«Õ,>ï$ÏG½|r†Ìª„Arš‰x‰d5½.¿orÈW [¡½F0ŠYw0•v)®¦Fv°V*·P-±»Œ»K¸¤qá×:k9X(/|<à‰Øq¨I$Ä' 29”Ñ1ÁÖŽH(|Í ùCîwùÁÒ¾ÏaýìÈîl"‡BTŠÄ~f£™7¯h¶ôÆêìªmíÊk{`púïÿ‹ýýjE€œÿUìÐwŸÿåU_Çÿú·|äù¿l~K—³(üÈçÄ…³‡|ÙÀ— &*€·>¨úáf4Ò½ÄdtÓáì $KñlÕ•ãvSÞVkŒÌ”ÛÔh—Ç óÛ»Ž¿×3榡¶Î–V=lm«oà–¥Èo®«dø¦Z$=|ªÿ'4N†_cÀÝ}—çÎ åJ,[›‡-Ї- ‹'WFá½kBKyÍOüªâáDûŽ„Âç° È¼dË=Õ2yI¾äl½ .3ÇÁùrp÷yÒØÈ45_¦P”™2¹éA=Ø"ø?4ÆÎ·ˆz|IrÁZ"ÈE”c,ÒH |e k®BÝëä”Õ'=}hR£-NbÀù›Aꑎ/«=Kº3ìÐÈ®‹r;#§ñÈ|¬ƒ,ÆH¤|ój»ˆmRÀƒìFPÇ)yùÈ¿bñ8’¢Jñ[k–k­-‹Å#€›˜V4yÂêÿŸú$§¸LsÞu—I8ïÈÊ. ˆál¬F’dÁ 'âCJ߯h¼Å= Ïë`AŽ7“d|1Ô–3ðаJþø ·œC` †¸~ÐÈN 0Þe-›ÔjïÖi\y"îõn$Pì2x¶R®WâñWàñˆÖðÖ…ÐÕaI{TœÉ¥V”Œayñ^]Â÷x͘:dºÉX7Ê7s_`hØê’-ÊüKeÎ]È@z]R¾6äiçÓò’hCˆBNÿ ”SHƶ)'Ë÷z‡íÜ!霛sXD<•ú i â\*–K`è=K§×ò7»SÉ4\u;h(ž#ü@UÌ4ónÍVÞïB(’íR?I¢—Á¹Õt«ñ9ÚŠPžjÓº¸ð9™š²ÎÞx2M¶Û)ÐM Æãä9Ï& ¨.[­s2d¹D±Y·~pìÅSS?s#èÖòMu‚ñ¢àpüY Àª0È-ëšÕ# ºí!À×0ÞaÕ\Z…¢¸xþâZ90ÁFAž¾À€ôÕËZ ÒQ0žäÁ¾TÆù@Ôú¸­9¤OÆ»YrPÛÁð ÁF8ÓƒqiØ9ü !Wàô"Ñt¼:êdb=ÙÁ”?6ñ;¡Lv]-“Òbv ¼È~}WµƒOýO*=ðÕÕ±ýOEeY©[ÿSQZõµþçßñ™lM–nnìc,Hˆ›dD£i AcM¶–µ:N(űFäm×áV*íÜö´ô@¤É.-gÓ:µ|jY¹<Äñ….ñ.g–‘"®@"UOjNfí)góQ8 @h¢Àú+П‚ñhR‡¦ÅzÞIä”C¨†2ÃÈͺeu½ì|r’Ù¥eË×- Òu–e³f2žŸ’‰³Â#™n]¿Ž`Ñ$ûuåàBw$Ù »´Æ2ÍôÅÐT?‹©Ö‘ +á/*çw 6ËÂÐFö|©^+‘M®ÑX*‚çòlú£éR [\Ÿ]Ö g{·Œ¾< ­™.°ª¶ÜeâS¶ð—ç s°Î]Îd»¹Ôƒx¸‘Å}Êœ¨HŽYÌñ‚<#øÊÄ^BC×ñ8PM)©Q!›ÓÿhHt¿'Ï$–u‡©‰ø+›“¡9ˆF‚)3aþ< }l9œ>#ƒ«»¼ èü²s—n74›Þw‡éýd#Dþä Ó Ø@´:ýÚ«k”IDper§]!O’NËrI‹\INçAñ'£J\«*Öþ$'«Ðæ¬s-תš mÉF£Ùìdµ‹Ä[s¸k`’ \³e×eióƒ€aö,\Ë–+œ_&ÅUÛrÌ—²ÞÉ¥¤gÚ7 Ó8°<«òâ<‡#Q§:kË¡w/œî$'c®°Lf¢Îº2\v  ¢Ãº\ƒÅD×ÐÐåÑØÌg-4K&†I„áɺ_­ëP¤Bú{–]Á50ê„_–d ±'l¢Ð¶ò?ƦzðˆTÒúêîçÿ*çWåâÿ*K¿¶ÿù÷|–i÷LÕV¯+ •c0NúuqÝÊüz„%hÎG(pºîÃ,Â.PßL —ᯄúcž—mÒ¡.å4µEŠkíRæSÛâ6èΘŒ)C›+¸\Žg'ÅpCÍ!„×&úU8÷!hP¥¢T1ÊýñdO VÐWFx;1èjâup¼jÝÌÉâ‘ÑUCÓš!µW¼[Ž¡|gŽÿî·$ ½Ç'¦‡ÜõÈìôšÚ:O¢÷ûwÔ'—í 9Ǭ–H¸/d&Ù÷£Ä„@mˆ =# <èx‹f ±=wÔ"-j¹îÿ(úÕœMª>}´cLÚá8×Êc΄*ãqäµ!Ç×Ò/]‹ISɨ`9ÂõõE]-®¶Õ#ÆêUÖšžŠÆÓ*¬]ÊHѬû5{Jb*. gŠqß9u´GÞ‘ Àñ•K{º7—cL¾LA‹ýòîJ$÷o«N„bð¡×=]j*šŒ~4û“ ·¶¸wÀFòt˜ô”dId8àj4êƒM§ì5‘€Š‘"¼†,y×*¦]ÐüÖûÅ6쎰LèVìÇS0"zœa·e–âÔOqøÉš+QX&ϰñž¢J2lÝ;kzOVeÏFøä²¯DN\õ ‡v¼V83º†dJJë ¸×R¯9*$u`u“v8n¿‹Š­«9¢#€=µôË™Þt:Q=uj°ÏßíD£%Q¶êýlÈØƒ©ÁÔÔ~–e*cÌc«à/·•Óìh t×|ZºI‡_ÿò‘¢æÒb8MsLôr‚lqKÊÓ—R=àjŠ‘Xçôz ÿ¡nF`é 0ʽ˜M=)ìkÙÆ‡†®vÀÎQ4“§£GpP@ÝH¨±!5ÊÀ³L¤<¢K)Žw£¯zuô±Ù‘xžvw¤‡ýÇF‘0º 6ÉŠdÁ`x!€ÂÈ`x²¿Ô ˆ¾ Þip¹Œ°µŽ8Q,¿ˆë”pû5C䈣ÔàȨc ÀßÄv’A¶[¡(òEB'3Qw, 'á&`ØŸ/ì„88è5çPœ<"“é(úG;!:ŠÀÓ.šSvH¥Øˆ0Ò˜‰ñè±-¢€Š|àá ÚL¬‰Fú'È}ˆ÷8ýŒ*Db|.å½8ì¼äj¯ ¶íœxßK—ÚËñ>våJ{ÊwÀñ^R %]L›å©O\q®Óm§ÅÃa&,×+“\CDÌM€ô$j™PÎI¢¶gŽk¿Ì“‚<~OKº»í`e0bèîPdµåªÝ v›º²nmÍZß@̀祥£²Y0®CÛ"hŰݾ*#†kKìc ¹çéÒ9‘XBy ŽA”Õ׿!½äE Ù¯7‡#k©ÜÒî¬]ŽSL—8NªØ6¿¥ý"ltþ}ÃŒA$-+-céG‹—h–èqiÿÚò°æDYÚ_uˆÖŸ4cÑ"ŒÇÀT {ŸžƒG:Dk£èf@ ¸%´Ïçê3#›tžñ†é¬6!n[ LÒThiY¥ß_6ƒ-O àµÎàE&Î!Ú2U­(÷³.uñï³f±³¾´¿¬²ØÇzX¼žqo~ÆžEÒªз²J˜à²Ô|ªÑoº„2î{8 Àº›c Åv6ÝôÍû¹1€4%ž;n¿ ê[™†¯Ügûý~þ#¶\Û¬€/F-uÅâùá}ý…œ»ˆÑŠÉ;{BÏ4›$^CÌ»[î`[Yê÷Wøìi~•ÏžÁ¦5¸¬œýºÞÆT€ø—ivl »;*šÊ*K`´h=`=°Ú'€š¸\Š¡`wW¸e¨€ Xn©¸dÚá,… 8+Ü­C¤µö€}”²WÕZÝnŒ0hànŒ‘Ž!¨!ð°¦Ëìž=^Q8:àù4oCòY}(Þ«1@qÎt JLs!0é L5È$ÒX8ç•[ƹ³B2CZ–kÀDòœ4 -ŠÆñ–.klS$%2Y\%Ã#—H¯XA]†àÂ4#‹^ŒÇd˜˜v©Ø÷0¦ò¯LcJ×µÕI ¹ÅCúñ{Ñ3•ë,¢—ûEÝÅ„y`u¬'ÃXÂ3ç:+DpöP¤Áø@ñdâGÉaÀÝèëJXbŸmq0VzçäÍÄÀ»€ã)»@x¯\§!1¸fF(¢¤È¨D ?NS™ÁEȬD#ì<¶zhB=àáGU»Üö ú²~9S`»]î#ÈG2[!¤U®1Å£à>h†E“ Ê/˜ àë4—?¹M5~OãÎòa¸wÊÝÂZSk{ªNËçµoQ¸¹¤Í qQ–<³µDY$ ¾ ׿Í}~™É¨yö‹–<ªdºØR6jä AªÖ¬JGÒ;Ðò¼¬:{g¦Ii‰”8‘'äl‘¯Ï“Hv¼š¢ïk1!¨‰EG@ò ‘ÏAøÐ¤g:½ µ¦Áè/”ƒ! ½ÿXkÌtÎÒ«uO TžóШµ ÂÙÎE¾Áx2`S¨wZÔÒ¼xjC{s-ˆ®Ôq9úiV èZoC\TvuuÑŠõ(¬ ¹¡-.öº3ïb“*¡(ÓÎŽ_2ѳ„Ä)ï&\ú¶n®6šè àî«(—[.‘I&@é§JÇ„Ù)‡Š+Š2(ßû]ún,Ãí"MF•š1‚jfvö+VB³¬îQëÈo ô ájjpr\²zãýM2r "À`?¨Ëƒ“R¾¤‘È €ÕºE·ÎÂ;)Žç¶Û“’“ìR`0bZ9dVžPgp¯«I¢w“t…8~”…59³‹*J}+ŠíšYö¤ÂT"7½ùYo%!9¥Ÿô½æXÚ/ ð“ƒfFÀëõv#ëIø ô$ÏZBDz_aWCü-uuö¤`3XKØØ‹Æ˜s>ÄÆ@ÆæÌã$­ø664•ÓP.ÖÛ9[Åg©Dù¶ zQϰ.+®6Û2à/®VØÐ äë¨ãäøLf·tr£Ó8† «kâ©æZß.Z8Û‘p’"IŒn–­sH›-¢¤sÛ³v5¶geØPtdEîéŒ:o¯‚"ðÒP÷’ª¼œË¤EôtŠÆ#£([jdX³üúÌÝÓf?«¨,’^@‚%IqÒ¼d¤®-¦H§O®(޼.Q£+o ³|= 23Ï’É[’[TÎÒ½`­t'EžBäê$›ÇHŒ‰éÅæ<¸šê†[Œân#(µ^·Ðž`})DNo§°¬yö!ñP{ fñzp$ÑÁr!“ÚÉ»ª±HÌ\Sp׊%:YAךâ| Çâ…‡oΜÏmï°*Jó {i—ÏÀ±Ë3›lÜÕ1ÃÅÒdNÄáòÍI ¤W9‘½ߒý V[9îçW²O‚bséd#¯…sÛ—V”¢²Ž.¶úºúì½*Ÿ!_…é½j¤\y8ÂN:`G(‹Ϊfs´‚çXž,y6PÚ¤¸jßâ×l™Ãåÿ•ŠÛ2v.·í÷2APì´¥ä;>ÖRbôöß:ˆˆÇ &i ÓÈo%xc×k-wGu"~Mö–§òAûÒ¢Ó’£Ô7ÓÂ’’„ÍF,›µ¡!SL®EÔ*$ ±vb‹ >UK9­Ö¼¥Ìk¼|q Ü ·/)4Á„ÐVÉm;¦‰ {‰êà])³8+f<-÷|Z!žúý~ϱï⌹k€Ëݾ^hWA+b ›äb­Û^+ÁÒp[úsvW>*SãùN_<9°l]<¬®5~õtö·»š±¶ì Ø×V‹‹Ã²J>¿Þ†ð.LÇ ˆdS±,¬Ì]#”¢PV9•TæY’¶6G¶æ›) x6‡,ñ j$è}º'áÓ¸y@Ñ>Ÿb} ëý¼;kási„·ú F³„ùn#îg,h[ XbÄ€ô“Ex}±pA„q¯Ó¨ÆÝ+hñÃ-ˆ\WfR^J» JFzz]%‰‚ðòWŽ6ÓB=žr„Åù†àÆ ä¨D'»ð c"1´’káÙ—ØŽY[ŸM í5¥SD¬ W¢û0VuÖgM3ï§\RZcS/J$õ¯!Öù,>Å$Åš3LÍYø}3FIÀÈ^#1Î95`½²)‚ÌÓÉN&玌k+‘Ï`þsËáMQß ÂWþ ¨xrñÞ©=ªZ¡)vÜ65õÍíNØ*dt´‚ùù ]ž[…±Bœ5¿?[ØWè³P ÒƒÉR\qY.eñM…Ëi˜‰aP ›º` I&®j³ÁhøÜØ.Ò„ bÄÄc}h½G›0‰¥Š4 \`C»W„°Zæ €ôÈDᆃgDÎN®D~0n›+@o » m+’R¼îR-¢lD„.a²czEÒ'6ÁHµðhƒ”Ž‹XÙ“Ñ–ã ¸tIÐd±´‚ n檶“ºZâvrÿ­›[rªj©Í”P’ü6ЦÙ\u0®­¹ÕPg*MT„5ÈBñ8£ˆ1nšÀÕYh D·M8Y`úi4Yšk›¸åEF+FÁ:3é/†IônÎ!øUŸÄºâ 7K9ZiT”I ZhÁ3Zw„žB ÊP/˧šQTM{"(¢%©(Õ]VE•ZD5ó‘AI¹Ñêà9怅e>ÛIá|¢u¤Ã‚ÈÀó9äW¦y°hÔ¥ÅÈ$&`Â7a9}<̲Û0›Œ ñÝgœ¹rÄ”ÍL€J¹7<­#ˆÒ‰+A#È¿sUÚì°e žóLZZ=\Õ#ãÿ.c“H™†žY¬Ö¼ÍÄr`íê/¼4ð¸ŽÍÜAÈ­Õ©ËéJJ«7$8.’»’NBš—"¯É9å±t¤[¢ <©Ò~h‚û ù0öuÖâëŒ"— 8¤*üÓ“—fíxÒE|Yy¢£BÌÐópûA½7 ·›£cQ0¨þ\‹F^N£.Œ-C¨j.ìáJNvÃÖàóÓìïh˜OÀÚY¦ðá.EˆêÍþæùó!.¬­e)“YXƒk"iÐxemjn©Ã2³}Ÿ/scx×Eš¨“õ*¡¥m‡%´Äû+`GÙ¡õEÝÓ/c£N±»´âAtLs•O•P Ú‚NÐjn·{¸Ü0²Ëˆì°ÈÓa~‹ÄÄcL|§’èS ÔXó P6ÚœM†;Dâ¹½,iX‘Du£àb‘¡ÃR áj–MRËè°Äé“6åº?˜¸ÔÐ ª¸ˆåy#’¥T>:Ùwu•ðœ…ÅQ?À" S(<íÁPij1ËQf¾,)œH¨Yä0L44¯²-²O1h’â õØš—)Ή€ÔL§8u­™äÊ‚A×MÖ¨W|óÊQ'%ÃDÆ}ÛEsGžº’rû`çמïÒµ¥^Tz½=§³ÞNÛá윖9ur†¥5,À¢Á×]ð5€_ðq·¥gî„GAøÞÚ_Cðu.¥t´”s»ðQØrw6¬z›·³ú§šÇJ*Ý o^¹ª¨šÉU¸úÙÈÛ7]O:UÒw,©J´ë8sÈkû’¢aó5A5,žän[‹«Ä–ÕÍŸé•(uNGmk]S™fóFÆ26ò”9÷=:ÉáE’|FoMì"÷€°È+J³^¹;ìšq5[eYdò„i{>*ûY9yÚD¡„Qµˆ‘Îø á0Ó†wX³-ÖÂõ   HdÑœCÕ¤‘¬Ë< <²ìòŠÆÒ§ÍLßÏDC›]/èr©(3¡”FÆì¥@K/k-³9 ØŠͯó Al Ö ³A“RSà'ÁYJ3ð&ãHârײ¼˜6ÛÚòÊ@ßXÿéR;[2×ßâ Õ=MòÁpÑÇþº!ùuMo ¥e<@ÍÜvTdÕ`s0õ²,/ºQ•V…7z®+‚kªøÆüÅC4êÑÅ>Ý{¨é•?¾&aiäOŒ ¸yÓñÎS|Oéúü®+çÜËâËkÉÿ›jrc‹jއš2$‡Âê[Ÿl-”ž„cEÃÚ±jcRQàRÿH€,&äÒQù`ô„í† 9s¾«£ ª—–®-/õûÙߊåp¨µÔ7B†ú¹ø·ÿvYf>Œb§aÆ*ÌØÙ;»æâßNüÛeFh?®„•_ߘÕHã÷hÌÑBt›SîrFê-žknÖ;I™ îÀÈ'y•‡3„6`éòON0ƒk3×”Wòϋɞ÷-N¬‡-c=â,5z8šžª±x Dj:Р–.JùEÛÅÁª1† oÎÐìk'ló:—÷’s¯p‡if‡sÔ^;£Ò4Ä(Œä9=àB,`A®fø±!'³¹4rŸº“*ŽŸÓ×í K^j AÜ`4rœGŒÊ–$'þ@†E¬†cú$¦C$i¹Ž)èvc½ñ}hYªš î'qq<п„ÑÁÖ¶vJäÞ¸oRA豚A)j…™ˆºŽw[ØŠu ÐÖ릶ÅM¾òš#ç3¶•Žyb/X¨¢ Pt¡Ä¢|ä¼È¿³^ ïDÒßr5€Jj*‡mêtÁ·]Hø„LJ ®²uä-¥«j¡ Á-4ôîæ·ÖÈ;Dš€r•#d;¬|8]/¤;§z‘_N–SYË ûä^®uM˜&ÂöW$§Í9ÀÒ¼0q–htsÜ&Ù“ÈËPëÊè{Pùm+qÅ›àд´Õb€œe뢡¶D5ÐväUâ³»ùÿCÕˆc¯úœ¾êŒî§@áBõ°råL(aÖ²ôÌä,Ÿ=34«¨x&K=kÊÎKtvµu4P]©4« ÏŒ/]1HeCg¹XY”J›ÛÅá[UÖá±XiaU\£WquóÛñq€žVû˜ñ4Én5É >Ôú ¯°ß(:ÙƒZcÛÚ:j»ô „ýA$ Æî±~ˆ/AüâQA+ca­Kh“[¼„éHé@ÞîÅÍ‘fKU8d€‘b@¨—T\-c‹¨âãgùd³´\­¶T»Òá`Cà<€ûˆþ§3íYë¥~¤—õÈdY—7KSœ»â«6‹Û ^æúµ…øÕ?ËÜûMÛV±¨ø÷…éBPRCÊF’ÔC…wUIÉö¹f~ù¾šþŒ.Wkâ«Ñ^»`ƒê=nÖÀÅÉÿëBk[—ê´wÐkDV»è"·;gÒ-Z¡ÒU-·7Žê Ýø²'ÔqR)ßZUÖ$m\ñ^F(ÍrãÔæW²*¦A)YÙféT!lÜʼ”t¤Óè·!-§ÕQ0Æ’ïÖ<àp¢NÚ6¯©Ì3I 'aŒ§‡°,zÙÕ¤µDCØd$•àÍ'—PüVƒxª7‹Û"Fã).ÓiXNyèŠ8Æ1×@$¥qñ8YÌêag¤ŽÊâ¡Mðî• ž_–¢6a½›OâÅˆÛ Û¦« ØÌί£Ÿì™2Å–Ú}¼™ 0zùr°W@^yq!!"öÊŸGB9z#E3éѬb•QÜC ’1÷Ì8x6:Û)—Ê„Ã(›=PË„¿gpè@»B/ÙßýèòŸËz]ªí “Y<Ào²ê]D¼ÂÁ„®Dí5¿¨SÌ$G¼Ùµ­æ>± ½6œÉ汃…_ðÑ&E;[Ô¯3f•»|î‡ÍM¢<63PifŽC`ICi7š™ŽÁU"’þêeZšÞ_ùoS¸Fù-e¤Ft$#•XÏíg|¨(φL‹ÈâEÆAÞ "KlFÒKÛM¤–sehn¼´ãR©O×Têµõõ-¶]–_¥>ö·´´Øs{a ÈúúZÒòÒ<Šy‘¾n~ûœ¹ ZÙábzÚ`*¶T†–íUeˆghéÒžNO‰+Œr¶t©We˜£sᳫ‡È ìÕýU¹öj ‘–«¼X<5zÁc%Zên­ ¨EËÑ9fà hm-—õò+ÊUA3 -/;¡åè.¶DˆÞÉûW&f™ñöÍu¶ùx=îÔží`–óN~ÂEZ)ÓfÈæ·uã¢U€•.ië0Û2­T5¿aI—Õrlge1=mi²µÇ•ñ¸E=,¯,ÖŠYФ¥¯é´èÅTˆÒ7©‡Óz1‹õÖ”aúæÖÎ9F1¥Ýüq‹VLe•,ÞèÅ”‹ô ŒNUU‰ÇZ§*ºõbëš.Ò/6ZC‹d~çás´bJÕ¢boZôb*Ëyú£˜rñxÖ©*£˜z§*DúÅF§¦ËÇZkÊ´%µêÅ‚K¼£Ö6é±9}Ód1ß­m7Óã²gOå ¤Çeªý e+'‡”x–v‡ôp!ËФ—^Qªz<·uI‹=) E'¹È1£ÜâÔBZq°n@|™Æ¾æ°'? Ïr¨Yœö@{²¶öæÈ¬ë~%æ¡v@*ìAÖímG¢ªlÂ`/Ùí81ÉG,À"IFB!'æwûésÇžt¯yyÞ餙ô bÝ:è"œ™©¼ÎsZNëÇívÞk ºÜ£IS ñj9{ìæ‰õÒÔ×7462n ™áÆv®Lª¯%µC^βìN2iÓÓÚ_©Žê+Ô@­·] «V5~Ñ¢ÜÍ kíú¢…ÍcLG¾q%+7Ci…<ÏÙÙ±£Œu~ál~7ZB¥u4t ^ÚÐÕt¶¼¡’N¤v驺z¥·µ÷ŽÑ‚†I>T¹REî(sQO8 Ûž+°™,…Íä‘r úWÁWI‡J:N(‘½Ä.¶ôfÈkq¶:º ˜BÛa§_@l'C›¬A¬@òj‘$œ?b9š“é¬ìfJ3ÿ˜]TclKúëª'ì¢ÙŸ¢Ý.‘36›œd ãâ˜À' ; %ÞH¡‚ƒ=sÀ1àwÑXW¸ºKgÓÆCA›aIJÊ$ ØCÖU8œ÷P’Z%ç` ÍHÊÒŽ¥mŽ2ƒä‡."u¥Ø t|åw÷Q¾ô;‚Zä>ÊhžªV±Ìå‘È›ó_´C³>u-€rjå¹3Ï0 rÓBÜB…P’M,_6U(Cö°½ ÀÄ‘RŒ@dÒP&`€*§|ïIJLö(‘ÃÀj'cg°YW½Sã10ú#yåJ Ý4eŠ¢-Ȉ2;¶„€’ i$¤¹Y?d87çÊr„n6¦Ô‹6!hìÈ®QxUºî@Ìz÷ ~€À“S™`ñ$b•# ÌC—N%îß*̨]²1žø_V+ÜtÆìŽ@_ʘBÚÅyàq_Ï…Rq€#`1(ÚσÙYŠÞ²4~Dük~3­Ü¤½0?´{Ãx&i"œI.•õ<x@X¢. Ù*Yt›«0Ÿ‰kÌh@Ùº,=: b|º=‹‹Û¢>]ñxÔ•Âæ«É¸Í÷DifC¸†ÊBN ×±¦ò!BxÅÞ¸uzxÑT‚íš©ø×ß fø pnÚÞD"0þPÊ&öÍ;!¥OÅ¿”JÏú‰àTö%k‡»Ûö:ïB×ΨœÊþ£”KfTf½µí|Lmº¶Á:; .‰0L2þK›qòÂÍ’ÓQæR®¬ÂÂÀ îÞ£ÛJ §: «™Oµ›kK*§†c‚ë;ÛÍtu•HUÑ\ì,âââPG¥U)ÇU#9äÄU”ˆdÞؾú S(ŒÉÌê`ÒTŸ]$.›[Ú³ÅèÖ Œú`)ë!%#ç¹#™öh¢Œ’Æ5AÄæîhœ×òV€$3rƒ¦#×Ëš'ÔÙ¯@t IyvTŒýC]Éž?×ß vLÊ¢Rfx vY}-¯>›'£Ý)k2“ð†è¯ÿÓÛãýG£ÿè!ÇØÍ©_u@䫦OÏGÿá#éÿôÒ* ÿe¥eöô¯º!^Ÿÿãôßkþ1Þ‡U¢ç+ªcç%û­ÿÓ!þoUyù×çÿ¿ã³ýÅí¯Œ›×ØÜX0lذ‚&öOÁöW ê F5zÔÈÑ£G3fôXkœeí´“µûλ|sÜ·wßk¯oï¾çžö›|À„}ÜwÏ=mŸ}àASŠ.Þû€’Ò’¢ÒÉEÅEPȰ1cÆXc­Ý,k·¢ {N(úŸíŒ[ðÝ‚5#†/>~؈ñö?T°OÁ°‚à¹òÃ;bÌpx9a½Ôú8|ÄÈa£Fo¹à›#† 7b\AÁ°¿ÎoØ÷ÜìQ—Ï»:u)û1ûÆùË—¶.9⢢çVG}XójvùU§õê]­–{Oüí3wž{þ„`yí‰ÿº¢uË=]òÃú)ÿñʽ}ôôóYTñû¢¾yãÍìû|AãÌûë¢ä£SOùhÅ®MÎ!׌8àÌß¼ýèØq«ŸùôÅÇ/Þ·uäS3?}òŸ'—_óögã^_?á/¯.?¾a «·à÷{ÿþæÿ:lßsþbìÆOî3&íÖÏïŒ+>|ØðcFŽàOGŒ>jXÁèq»í1~×ÝíÒŠi{N:°°rv;ëøX6ÃF ÿü¡+ö N½ö´“7^ôL䦒>ùãªéŸLwǶÕ{\rÎÛuÛ6=öd¨ô…ëÛ’‡–yÑ1·kÿ÷<ô¬–½î¾ê‡?úÝég¼úÒÅW&÷~â³wòâ©5×ý9täÁ\sÓÕÏÍ¿éÇsW]Sy}UË߸þÉaÖ÷Ïþû#¿üÇ¢ï}8`ØÒ|ûÏ¡õ¿ÿüÜYÓªïîÀÞ™pÛ+¿©}eÕŸ.=¥ëÞ=o>ëü+Î=÷ΧÿyÁÔßšz篿óð£K?.qÑþá̆ý¿Qp]YÏãw4Ý|ñ ¡£îº°äµ²ëªV~~öµ{]ñÎ9 ßN¾·§ÕýqT÷æí°ª_0lÄðác‡ï4Š®‘ãGíº›=‘Iµ &ÍÙ}g·w¹y[`ÃM÷„#ÅÏaÃ>=aóá•M›‡7öÇO¯ü¨êÌC†ŸÖÔ~Û=©>m{bÞÃ{¾óËN<ôÊßtÎÛz|pþ›7lxsþ»K>þìª-75û?x"¾åþíl<ŠÇÃŒ>Fm 6@#ÇÓpÔNZ°ûå³ç´oÂQŽ£°ó¯\ûÚŸ¾oŸ÷ë+YµðÔÝ¢g¾ËãÓ“ûm:üøŽ»þéïúCcÞ;g¯ø]/.ýÀó÷ô—ïڶ󃫞:céNûͰWV½óÄéÖÓ'UÝãßšùâG7Nzø/W%?8ä¼øåsz6ýqðÁ+ÏŽ½ãÜ·öŸ°¨Çš8røè‘Ö7Ô”@'Ú“Êj,ïHî^Z1çÈ ÇmÚ|ÿ¨q³Û»Ïºéæm¯ÄùèÆÿWâK7=9ó®š?o»ëÄý÷øsvÒ­gôÛ/ï_ø“¶ÂøÚÏ6¿têá§Î‹uœ¹äÁÔÍk8î΋G¿ÒØ?a÷žZzê´y Œ=ëì;<½ùïõÏÜXºÏÒ=ûn~à­»bŸÌ.=¡µrä­™Ÿ¾qÖÓO|ÿûßöÐ3¿šåÓ›_ëî¹Ã.ؘ<½ëÌeû^µyÏ/|þܧ2·kÜÏÎ9û±oWüQɰ ŸêOŸ¹õ‰oœìÌ»ÇZ\tÙO®ž3uË~?ÞZ³rDàñmßýÔ¨SšöçŸm/ÿ릊WÇý¸>úÉê1wïÿÛã¯_ôÊÓß¿ª§ñ€ôƒ§ßv]óÉ—œòÆÄ¶µ“8¾-;'î7üî¯ß½~Ó‚Žw'¾þ\û÷µ<Ö\sù£ËWœW=­dÅØËïJl{ùó7Ç¿yÚ‡»½qʾM­oî·Ï©m%7]÷ñÞš´ùî3÷èùô0X}Œ^±¹5r„ ÍŒ¤O„9Ý`¹ióG¥7Ýÿ:›Îm‚Z6ñ_§'&ݳæåý¨]ÜÖ2îÕ=Ÿ­*y¶òð¦ÇÖ¿?fó½OMT±ËÎ=àG¨9úçÃÛÃÇoxj^ߣ?ª~¬ñåÌ Î ¿<õÆa÷?zÙíûÝ1a§Ç7ûaÕyÇî¶õµïïúàWŸ~ú37î÷ì{ɾ}Õ¦‘ŸlXïîÕ´íÖ‘w<}üìÿÚmkÏ~?]õÈè WL|häÍ?yáëųìÓFþjìooþ×k÷[EÖÁ#¯:wÖCcšJ·nüNzÓ‚ÎKO~»â’£:â'[îlýëŸ&ßøí×Z}ÏîvÂð×g<¹ëQ+¯x·öØë‰ÝÿÒA¯»±tìw.ÿ`§KLJ+.>ð½ŸÝúÌØ+¢/\øÓ®×Œz÷¼cw¶¹*úü7>}cÀ÷ÑIÓVN/¹ôGþ±û¾ðÙ„;öìüáÇ‹ÞX7ö‘­o\ðêCWþm°kß;n¯úO­þõ“×¼3f뿾óÁ)»¼ž6,úÚÄ•'úÁÏØHÝåÍcÄñWÇŸ³š éßð·Áb_ž/¼¤¹p·Ù#?n:𸂑g5½UÐ4ò¬Ã ȬŸôtsá¦OO“¹àß66©EãÙL =z¸Ç¤–²Y½ÿ¦×goû¨]ÒÕqŸ|ìò6‡þ8÷‰} Ÿ×÷yWÿëÊÌ1N½­¹gͬ£ûÎ.kÖ^é¼|ã‚Ó~¹ë¬ÏžýahËÄõ½[/úarØ’¢Ì½ãþlІ“G=?"ÚÿúîwŒùÜõǽû‚•¸ùžy/ßtÞ¾½Sßx´ø¡|7Þ{^ßÀOžÛ¹õÄK²ŸüêÌ‹7ú`ää‹ïÿÅ'Í%ßx릟lŽ7¿õóšvô‡/Ÿ{ßξêY—ü52þƒkÏ­Z1÷ÂÃ6}ɶöǛ{óÎYpÿÉíögýîäcß»ñ½ ]{/ùä˜ :Û öaC0†`Ĉác$ÇCPº `×Înß°ù¦m½.)ê¸?Ì;¥uÛµã«~ó·—Ÿ5óís_\2æ•%3f.ü¸¥ÿÕÿÚ6w§ô½÷ÚòßüzÞE½õÊœ‡½rTýÞ [W\·uÆó§zÍè;¶ÞÿñçÕóÏ_TpRõÁ#vybví{‹§ÜzÀ¨¿ýäÕûñé{ç=ýƒ“ËîèºûšŸï:pÝ@LÒ8ØOÃG[oØø‰0IGn²7lÇvÛwÉ7îóº÷ß÷é Ͼ;óœæým{Á+oþñÌ¥«^z`—Ç¿µ¦eì?Þpæò#v»û¤ŸE®øç~ž÷ÞËËÛF\8úë*:óî3_=Ûº¶à¹Ù£_¼§uÊ}Ïû†3þÆê§{=¶ l§wÞ>´s¿oþhþ#5{}<íå_}°ó5ož“iª}é’.t¢ÕåðÔ{ôÍÝß¼~ÉÊCœ{ßžU´êõ /»kòû·]~ÂÒ‰·í}ü†žª¶¿tůٹèäÛØ|éNO4—ÿøú‘{ ?É·uç 3;.ݶÿAy·WÿâöË ž»â»‹G~»úøÍó;Î÷Ò û¼óTôÄäØÝ;ìømå…µµ³/ýýݯÔÞúщG\œ~Û9&ûÈcŸ¤.à§Wÿeþö‚-×6” ·êÉóöŸpæùYþ×ÓŠ¿·sùKWî´êÒÔ=7}rU•½ÁoÝwøy7ßÝö·ó7Ô}¿õÐ÷¸ùü¥×ú_þôðvõ­?§èÍŸžŸúÞÔIï½úã óÈ¢?¥ž;íÎþMÎßï:fSñq—­º³wSË/zóÙë¬ /†8sÞs7ÿý„žßÅîuïe—mÜíÐ'\?~Óâ}«:gn,ÿÛì¿ìµá¡;î)Ûí–Ç'ß1çÓ“/¹ì›?h¹õ˜‡ž¶ûÒGýbB÷gfgÞ\ó›}bŸ=µßo±ËÏjž~ñ?kZÞ½ìðîÖãOzbÛÜM{||ã›õc‹ÿ˶ò‘Ç3ûK_P`øúó¿êã%ÿ‡3±’T*P‚×ñ%øØß é:—ÿ«ÊʧUšòyiEåô¯åÿÇgns㌪À›#úG|ÂÿíÛÙ£Wg÷ÍhÞ~ñ“\pÁ3Ï<‰D¦M›vöÙgßrË-ðz{Á}÷Ýi·nõA ·`äçÇM|dã´÷/.y{eÑ¡È%½×Ü}ÿÞ„ï×é½F¾ùów§?Üs×>­xã”{7ÿôvkçþ¹[ž¾zü¬ ^¼nÍã<ê+Ïë9kBOá;ÓOݹñ7»§öÞÿ†W>üû=GÿîæïÒ4³iÊñ4¶ÿ`aÛñ>ÿ´cŽÛÔ|î¹g®¿à‹~tñ%G¦‹’ÃCvôÒÒ—M¹öÇ7ÜøÓ›nöu4vxsçùß?§}ÓYß?¥ò˜~±xÑ©g?pÞí'{×-Ûž~æÙ‹®Ÿ|ÙûnÙ㚫ӫ^_}ÕËϽý‡wÞ-}bëÏë~øÞqú'ú¡ýËŸ=õØ?¶wùvº¼ÿ¯•gÆîvpËÚ’oÝ^y@Óɯ4w»n¹¡äÕ_Þôæ”uŸŸzÂKûüªieÓÙ³þrç3/œ´dâùO~~Aמ'ürv÷þ©÷^ÝéÊÀI}›‹\úΟxxüÞu^öØÏÞýæÆ££OtÖ|ÁcE¾wýÏÞ[ý»_ <ñVèâÝ®ûìýS¬/a÷/zNÏ5½¦5mÛ¶mÛ¶mÛ¶mÛ¶m¿Ùïï>§wvN:Î9ÎIeÔM¥êây¾#OÝ|’µr*u¦XƒçØù‰ $hgÛœÂVm¦Úè¶*MŠC Ò»+(¥êúÒ‘žœÖëN¦pöTõ(ïN{Ð41d<Ÿu§Ë•ª@µ…í»þ3ã7¡© ë€yS%\5¥+ƒ`~—ã™Ï˜ÿõv\mÔ,Ì9Uš aÔg5èüx2ê÷J°Kù“µÇ=Öí»¡¦Îöúàň‘BÎhƒ{¿½?=àÑ]¹ì(¤*®‚UYòùÔÝ@%ã—i]‡²½`”Qû<'Ç™5Ê—D…‚PrÃÀƒóÈEmsIù’”ÒlQóÀHòUó#û?»åG±^óíqB¨.XTsæÇ 6Àaljҳ@ÇQx´èFNT“ëÇ)ê¦'©><Çѻɭ¢QÆ­ì¦æ¥§™Ö­§Yö£gÙΫg9î§g¹Þ¯gyþ”çùÁh–çᤕçöŒŸ¥E‘¢”Åɪ–%馕¥Ù®—eù¡”•ðú—奕—•Õ­——Uõ£”WÕÍ«–W5í§•WµÝ¯—WuýT×õÃhV× ã¤U×Ó֫릉αॠùþ-ëºU6­Û¶W6mû¾T¶íDZV¶ç¹U¶×µW¶]÷½TvÝϳVv=ï»Uv½ß·Wv}@¿Töý`Ööð«íaé®í‡þòU×,Ö>ĴΛV?Œâ¸]?Œ„Q?ާY?N—i[¡8™'OÒQ?M3¯Y?ͰŸU?Ír?Q³a¼Q?Ï £Û [Ø"CƒðÎCºú× B(œ1Ñ?àjÎÇ„øäÜ¿P˜ãJ1=#º œÓŸSêT¯°!­ÊEy\¹MïÔ'è#‚³¸ˆ¿ÚG¹+í`£ QÈÅD#³¢‹éÃ$¦y"£SÀ¶ÑûÄ9?œ»¹ˆ€„Ò¤4ÃJ³õ¨ý4ÆuK“Ñ‹ ñ60ÄŒJSÒ¯K)º:¦´LSv™9£$æ< ¢¼„ÏHb(ÄœE“Ü"³HÉÉåüJŸ²Ž¬‹þÙ©ÏÞð fÜo›rD6ä‰yb¡JŠ‘Øy)—R_a+ÄkÂäBð\@÷¸ä fP ò{ˆÈ¥=ŸS,„O8pÍ壡ãCù\L¡d0¤¹Z›Â*†.„L2yNR˜s»`÷ÅË$Wz=ê3YXVx‰6ÄûÔuj*ÕÇ4§÷(š@ÐLèÕFë*‰²k<¡U;§kg˜Ñ‚ÅW{?["½tv_[+'ë-ëj†ƒ¨N^=©*£ÜT¬9°Öû4_—«ªeøÎDš{a›òájÌŸ_›Ëej,ß\U£ª_[êcj¬'L776_[Ûglf4³Tw>_ÛúánÇD1ä‡ÑÞÚGehÓUÛ§Œo³1´ÎeT;—Šo«3´®mU;·Žo]»ptîcT»‰oݧ2tžkU»¯o=·1tÞgT{Ÿ‹o½;2CÁS{€Ï·–åš?Hé}=V 8ñú@Ôü}0+›if þh­÷AŒÙúP¶éx¯÷!ø†p1éC¤¬÷arÙ†HµéC´®÷ú؆h3é#¬­÷QöÙ†X·é#ô¼Ê8zœø’}—÷qqÙÆÄ´écR® ùØÆä2éJ­I ÛíøîýÙNVõè¡Æô1éSƬis٦̵éSÖ¨1èVÜ £ë“¨ LuÛ٦ܷé3Þ¯9øæü‰jÀ íǸ €º~û\”ës!>¶¹˜LæBrï}>ªÈ)ÁÅäBÖës)¾¥\LƽØíô1¨²ED®}¹>¶¥ÚLæJsËsÆ^¶¥IÚø’ÔZOgK}˜Ìµ!ö×úø®}VÈyrç§æDlks™Ì¥öZ—(n%r«þÓåæ>|[û˜Ì­c™úÔîk^ ¬S××Î}l[·¥CÛZõmæ ´êÇ××B{ÿ›·%›ûÊ”5K&Ͻ8äëÁ߸öalÙ‡H-î‰0ÖöRŸš;Kt7g þÇĬïcr¹ŽIµÚG àïú8Ž(˜ÚS§î]ü·¼i`G@ê×÷¿XÇ”›ìs!öÏ »ÜÉG<¾ÎBçrís™ÖÏ%:ßÑþß[ zÆÇŸ!Ϭ"Ù—Š·mhb2¯‰0Ú×Ö.Ü]v7Ô^ä]‡®™• ;¾§_Pˆë•;Aõ¯ñ¯Ü×tÀ=©™×.úœ»¥ÕOý¶ééÇÄýhÇ¥ß÷þÏìǬÞƒå]÷ùšíÇbVÝÊv|³R].O*ƒœ{TîuÞ÷iˆ¯c •îk?o9þž„Ù•f Ç‹ùÍ7ùïC«÷¾ÂÏ®ßÃÌ\ï+IާjÍnKmY”Ò©]ÞÄÜï÷‹žÏEÜîO_ß÷Ùé!@léFÚò1MÏã“Èã.@Ì(ÝDÜ¿}Í÷öÌ ÐæënºÓF¹gf†÷¦Ä'@»b·nT æÊۺ慉HHnòŠÎ«ýf"@¤´Ì÷ÃÈz€Óîˆ×ðpÈê”ÆP‰îÑWd?¢”À.nD$*î)”,ùLj#øýMŒÚ÷ûÍRꑈ{°¨zJ{ˆö¹B9%â;ãz°B¹·±¹¯Nº!Œ}ˆúx€fz¨ýŸ0™u>¹wOïowC˜ú0 ¤·0Õÿl0‚p`þðópßø°Èô0½tJƒuÎpª†¶p‚Ñ0òÕ0ÔДүôˆŒñ@ŽxDáx¸˜‡ y„[$–iDZyD–¹A-FT=FTmyd+{pÌGnu·¤0AåòHoõ(R´ÈÜ?Qè¤QyîуîQÓéNå¶lè1)‘Eã‘Ô¢ÑYêQ›åÑMã13ï1péQìmÎoQöÑô­Ñƒí±»éÑMíÑûqoÑÑN‘KåNæ1é—áWå1¿âÙãcÈbñÄbÏI‚¥Âc™KcÎãïqˆñ` †bqdëZ¯ªºïåÁ°ñ÷ïñ1¾ÏãÑ<íÌâ7-:ƒ?ÕÖÍ£¿Û þi$V‰'g$Ñ…%týQ=]÷Ç0b H"âHªrO¯$IR8Q~„ל9Åü'rˆ&€X¤0g¤Ht$kk8pGø)lž¡'s›¦¨M¨w¤ o¤XcÚËl$…G*føk¤²g¤jz$3{¤m¤úJØêaƸBJ.‹§ùl…iD{T¤EI$šG$ùaf,¼¦—S%ax»dGdÄàBd¸Y¤æ@e$rd¡¥”&&¿%E‹¥H“fæ^ä~dHd6gX'{89xÄUn¸fl×~ôqdÅAejdRX–J¸•GF¸ô\`fç@e7Hdxd¯KX´ydvDHÕ‡¹Že*´fsäôKäœcf®eä\o˜OLxB¯IØ|ÝÝ]æ8r0 ?4".$²o>òR[s&3²RšüÌÞ5LŽ5rO=r¿7ò¡ò‘.Íï"KÕ/ŒD_(œÞ*ò [s×:ò#/òþrnš@çu««³H@B;áZš`||J‘e©EŽ¥£i™…š³ÛCIš^A±|HhF0{s~˧î³`p*ˆ90PšNæ×KŠqI^Ës–bŒ½A¶ðQ«§T‹ÍZK´7óY9ËØ8 í%KݱŒÚ˼ÉKÌÙÆÍøÁrïSKL]ËêÌËHN‹Ã7Ë 3Ëâ?c½9+šÇÿsbJ°S)Á½°„~–F}VäW»N–ÇaUŒIT”kVTlfùR†.º»9AÙÚnšÆQ–¶t–_–”XV‚uT&UF÷rVá»VD®Fe·T¬­VX¹V\–´VuVuk† t–!kÔ”¾VÆþIÛ„–iÈ´Ì4 ¿ŒåŒ2¯:§¬YªôYÑL»Áª­ÖMsšÑ°ž¼4=â,Œ¬ û†®éì¬5ú¨…ߨåâLïTϰ~©is­;Ô¬ìú¬O+k©¬Ú*ñJ«Ê1µ äÙ¨é*„¨ó}­ÿ‹ÝðsY÷«ÙDVïÑмZ_NÕ‘U?ZïCZÃ^ÊIÕÀ]Õ¸8ÚèõQ»OZ—˜ÐDz"Ä6ÿÀ*û²l$³ªE’jàí2CÇn^§´§ÿJ$´b…1—šjvþl–ßj:£lQ¢2á·j°tÞ²¼VµÔ©j¾”lp®2ԛʨqoUKmµ¼ªz:o€ŒÈ’§ ‡¦²€±pæj[k7t‹*v²jõ´Ê¡jHŽž 6ÇJe¾2w˜êˆ²j£ImwýjO¨ª¬ÊU“Š„àŠ ìê”Qkw„éüêÈ—ê²$ïlójõþJO¡Š³Ùbñ‡q£2ÏÁ¶ˆ‘ªå²êòàêŒöê–ìèêÎê´¶¨¸Jæ9ïìêðTíµjݽ2Œ§j™õjŸþÓãsÕVÑ‹öÚ5åQýجoü2ŸÍ*ŸÔêz‘j­Áè˜õžeUnt´¥¶¬YU— •ßWõ=~TõÃxÇìFõÛõ%ÃôÿVô¶sV\oÕ¸£ÊÜ}•>mY4bR@„G„ãÐk¶HovY”FUNªöls¦%q§U˜nwù[ƒ+à 4V.{t]Ò}W‘¦@h l0Frv±Ù7ÉZ[!m÷Ñ[W¢h·ªM3F×ãx…þ2{qœAŽ(p7òÁ SQ÷,I‹Xo|r¿„—&¡*ãL s“‚­iÚpWQŽqWú_ýkUCuE'ç4«'g·c7 ß‹ïX›M$]· â”Z_§Å|Çx”{NäÂŽ)lŽÔdYþ%V‘„íâJ—²ÑlŸHöo¥6,ªžB8 óU$úžê¨žBc&(uÝ6hô§eu¦UYøš@ΜPèžF†[¾v\õ®I¾ôO“ sÆ‘ý‹ìîmp=u ÊÞŽ3Q¨=}}=½i=99=~=Õumô=unmø‘=>mð3=ýý=þz=×1ÝXd=e9]å=w^=^;V3·I=Ÿ-Ý«FÚO=*Pé"s:æcC3~;=$³˜@½ðïÇ ³z,SÚðA “ m‰¤gœ,f‘´gñ«{NËÛ`=ÉH,òÈOcKÔ³ô«½$;ÍÛ3C}³(y³¢&³Än³Ä³"~3û&=Í©³L¯³Ø˜½*T³jt3¥­3núã¥VcŠÃà6*PÙÞ:sDº>˜½q3ª³93µ¢=±³ ^³äH3A3áÁ³L3G­³”Š»Æä³–³ä„;gc&s“sÔ]jXÝh꽑û³Éغ†å`€³Vócö÷z¨žÇ¯Ì&ƒ€«¥­&ó²£g«½|r³;lÖf”ôzØX{{ÔgÛ1;aD²nÚ¦r€'¶W‰zg)'¸±f»·}S¬t‹å«é€Ñ;/3zÐÓv»º…½"Èa÷@5}½³ƒÛùïz÷ãg÷«¼¬ˆu—q*aCgï1tï»f¾{ofkï|g°ŒgY–ÿìc„(k íÛ÷žÕsÛÝsPÀu€ ß[,º?bBLk §}øo¶›öˆ0Ö”oíÍçÈîufÞ=SßuËvþ/¶‘€·óº§šTö@86{œ'hðPp÷xbªi·›%÷D²÷XÙ¶töÈéúhŽôj÷ÿ¶Y,÷têkÿpòDÈ÷D/¶gUË `Ì °ØÓ:.Š<ñ–=jó:£¿85¥m•ÕÝÁå:uå=ñ=µÚ=7óДm ¬=ÈhYRÆšE螪ö^DÙŸmžùñv%ÝžÄNB{m{X!Î ¤/¤'/¢u[sà/†¹.ëñ®.N±=í‚§ªmm¼­qx5º×1£— 0סÃvY}x×3’ç'•§V×¹VW*´7Ê.ÙþæÃ«è›ÀE‰îÍqn_rèµgU;Ìé*œè |Ndí×m®ím©ÕMhÔM1ïM“èþ7ÄqïÝ ï]!çµ VË2¯ÅeïížUYMÇiL:ØÝ¸Ýƒ—î-TÝ}þê}gÔU=Äý ûƒ‰ÆÃQì™ßý«ì5ÎÝá7à{ï¶ oÖ±â2 öâù6Ÿ¿0LÃg‰÷û€Þw-W[èÍó¸°%éz¤Œ»“É{hŒm¦Cxâ´³zÌñ[j*èµxü„z$Áz’Ÿ{læµàk9×Ìá+ñÿ‡âT} ïzrÄz•Cxeãl°3ñÐkhô¼õ=—ýQ¼¥ºgû½úÍ_°}«Û}º”°öš{#ß»uäBç” 4é—|}:­Ó{y©}×ë-ý¸š,q}91ê£ÙfÏ{,¸ûˆ¢{uã{-â{QÞKN}õÓüˆ_[ î3*¦»LØ+‘Eøâ•{+¬Ûm¥{Ó§z"wޤjދמ{ÒÑû^ÅÿÊß{_Bû¶ùþèàûÐÝ;ÉyÎd¾Êî×&ðK':¿uõ’Ë~ß^Íó¿ìô~Ì#~¾â¾¯ý¾ÿ»ìd¾œîøÑ£ˆYþ“cVQkuÑcO=›cà\S+ôÔŸ/ÃøûDà!‡ÜW¶€N¼fAµ]h£]ï~š +IîÁ¶¾ÁîÖ^ûV`îÆÍ[·¯íÃ/•ºš€†„X¨´F €’FT€Œ?‚sB²i~Žs6f^^Nj)yAiEeuµnYYwD„|x«´¬L“Jl`J}ãKº‰ÅÀ_1ÖNáØØpÕüÂòÊjiÁôšk|D°hè~øŸnþèX•¾­ëÉ´Û±{ã±MÔ竊å·à‹jãçiNóé`µí¯}2ý"yV”Øëï^¸PÄ.·›‰X"°¼¾pÄ+ÃWzÏúgI1¸ØdG\åyÿ£a]t)‹Ð ´£mélÎ ÛD¥Ij YP#c$­.Møwœ[ôIf¦Š£ätksåªYFÏ,yØQg’:«Ô‰CeY¾¡|W=è%iGÆþèq{k.½-×¢Ï ­˜,™q«ùe“ß ¬&ƒ\uf2•)e‹˜ñd6Ÿ±»ZßðA·AnšD®ºÕ^"ÔÆ.¤×˜9jzÓ]Ϙ•cél·?@ö£Jªõ9$ø7§ù’ó¶¨È 'ëÍa*ùÉô§ûà1:÷+ÕÝ®»_¾„)\eÞéü¾¼%(*Ç‹bkúεs«ûÑùãq jßýÍ^¼i4ÍHŒˆ ð“]p5ØE¹4Ï}’^/ô—/ñ†ÿïŠStÏ)Á± o›`õT+ÜE¸C¬“<°Ý²Â¦$UCˆôôÀ?_z¤H¢$áDŠu‚-DQÌcQlʯ¦‰~Àã÷èxòܰˆcªò£4S†¡%í[C[NÅã$ÅVö´,wÍ’8ê?ä‚e”'Jh–gyadgQl—gq¢gEQ*jIYÁEæY!‘‚g%y!TeE)–ee%•eU€Ë‹ŠºQŠ‹ªòPðñ\sº²BË,TTâ,gXJ¼þÜ“‹FL"É€†iÛµÓmÐChA¨ts?¸Õòˆ™euEæz-çºÕ`—%—…UªJ•pÎÔÞ€aÚM%m˜!J×m¿¸‘5x*Šô¦ .qw} ²–’‡IDÊéË@ z¼hÆÑvsdxÐ8Ž?G‚gìíÆñk:êê¾4k¹þ7 èaijä˜þ9$@©F!r«é;¹,ö ùa¯f%Bü¥ú™gi/.­çв½XW¸Â¢™'U¼ŸÁ4›ÆeöЦ]-“&À§FÇÞ©Æ5`_…†„àBçA7]û² ¦ŽKc8a·ý¶¼É4ÃCÇxüg§MÏÿ¤º#Xqx Ë!Ÿ‰ûfÿól•ÎÇÑU }ËfH%'¬žK7órÕiÿ9û·Óu¯OýÃa% ®óºÔ4÷r^‰”çA>ÎÇvP†ûf.Žl×ÝÎM­×µt ¢ÏÁ W×–…Ð%¤­ÀJ'×|ÀO•°‘áõ±|é{ÝΧºå ¸˜óIÎÊ9¡‹œ€ ÈhÚ¸½Dg¿‰ó-cÊ’ël^ ³0ˆÒ¿fH¸umÂN\kø:ï€õ…?×>p$1ï7¤”QÖ(ï•¥8iã\–¨õ<Ú\ºe¸© dc68ñc¿¢‘¶bæ.„3ø3ƒ*eˆ¢£žNµ.%>M±tùÂæ"Mï"‰sø¾:.Ë[C¢¹æØ6ÌòzáÑœ,o(š)­Pè4³nthÎ|vbG<]„½÷‡ï±¢Áf$éý |LD6"5ÚaoläÖÞñí Y{ŒÄ6!®ÀZ6@}Dº±ÑOyXãTŒG‰´ÎLÓª†§CRÒ³>d ¹ù ‚ø$Ñ‘Jl„Ô”Á¶ã. 6‡ô(|Èê´ÎÑ>[÷]4M„nÒ!¡ðûˆxªtQÚéªy*î}V>>\”Ø”º !­š”ÅÓ}s•>"ÆŠh×)Lò(œ!)mHÖw]J2D!`élùr!ä2ÉÃ2)K4ìÛÆs¾ûë”NáCDȦ)‰"…ô÷™•4VÊKQ¼Œu áVúZë!šýõ1>Öš-ÐS¦®M9<mš¥†ÁÖ-,=¦<T½²ÌBp–"U™0›hnÖŒ˜r1$}ö_[ðoe33 Ž{Z{G®T=‰‘Ÿ¥w³mrç77žoš³_· C¸x4ÎtLˆ>¡ó#üŠ÷ 88ÛÎÞGybTAßD|22S J –;2 Nüû;¨1cÛKb¤®–¾On5ÙšÉðË^Þ»·2z8ÜŒ{/Ób1O‚D:¬]/[¹ÿ¾µ/×^ǧüCÐwv¥ö8×zx³Â¹Tå[ÆÛÇ^ŠŠz¶ôî8·vnÓ|¥´OŒÜ>e«i ‹êtnö|¹ö¾n Á: ©¥\­Sð™=dÜ70¿]À¿î†Ã9v!n°ò³$©ÃnÜOx~ÝGÿ~=Tÿðú$£7ÜíÆÍ”å>ø¼qŸëØAMÜ¥=ƒ¶y_ixÖ˜ý¼àîùÜzªÍñž«µùH?òÞáw>õšÄ \Þ$)ËÎ n]úÜ÷Ð}[¿ ÷d´ß—úº_²“<¯u}¯'Nz?ßýt?6q~«l~?zt¿/g{à»jlïp}è—0‘ÇKÝÀÇÜýC|?Rü‰æ/ûoؽíú·¨ø?…ú@•ùa£¹s¼Ò“¥ÂAþø#À üÅ@¤@jfŸç?¢âë)â?ê‡@0ïcä@îÀØ”ÀÀaC78žâÅÄTÚçC$Ñ$µÑÞ—€úx‚ܽ œ$›G+#b"v¤·"÷Çæ¦8‚nürêaZd& ü +Ä©,H>Ëšü‡R[hd‹‡Ú{¶x ãk„xÀé-ÈÜ·1.Ä%>Ä«,Ä&,‘ÄþÀA=LÁ>LÜ-ô¨/Œ³1„&Èš-¬xÍ Á™HÚ<À‰3Ä8,$"ž=¢@-¢U ©ì/•-$d=²Ø„ · ,F̯ÖÃ×-r‹<¬ýo˜NXPÐYPMyøá(Æhÿ8—¨±u¯ö¶‰³(©÷(Ù·HhGüˆ˜´˜Ñ¶¨«5° 7$½õ¨÷¨yp?0ƒz½¨Õô¨ëõ¸7 ߇Šå{¿4s2Éñ0öÀ꼘³¶˜_´8¢ûµý Žô ´ô¸p³´Áx(Õ¨˜„pZB²øø•h ÷xôó¨lÙ`½BÐV"SŠ/©{._\ey˜¾zìw+aJh(¬X‚7X<›{l£ÿ ‘+ÕZ’^Yœj’sÒ§Y¢XX2‡X¼ e(æ{‚&@Z$ƒx4³»¿ª[2yx¸EÈѹGªeªð»;‘{ªnJRšZ\æY"ñZ eâ¦JªK»³9[,·y¨u:©xª£Z² g:|xÊž[ZØ{ÄÄcª/XjÀ8u&x:‹JzÒX°\=}zzVzŽYbV&¦yÚÖ@|)Y Æ{zÙx¬Gh[xx{[fÇZ"Ö[f.JFó˜Ç·ZÆoXjWzv÷XfÍ9Me6ãZZ/Aöȸ]û™O`$|n<½Q-{çÌž“ÍcaŒ¿5ÛþÜu'-çÓ%Ël1ÇŒ)ÓYÀN/«Ü+’, –9ÃV%1ŽÂj:2 ®àÜö,fXKŠ.C7°³Íj*3kkNk‰é*¯þ?ã×Äë2,ës(KZ"ƒE«˜,Ë6ÖëÅUá&Ê.ÌÁ6œ\1kUÄk­N]q*€åxµÈô((á‰u?‰X•ÞÃá…”ÿúûŸ “Ä"k¤³V¾c³”Ò•¶“õC)ïŠ$¢\ø# Å¡©*³û>_‘Å™v-Oã3pÙ´É7²i>_ƒ`貜åÓUñ×p¢Ò8tÖ'÷Ø¢ÓÙzÑV²ØîpOÌS#'Щ’=µ¥´®Åv³û>ÿ==W›¢DùO;Œi»Ih»îeÊfûM9)Se."^Û©H»°~»«f&e~ìE1–|çú›s|Çf[mNû“.9†yÁ%amF‡•k§Lf‡xic\vJ…ßþ›¡Pg·mËe¶ˆx'É{ÐŒ&ˆ¡jY¥Rdz6s8²uäî_Ò ùW­afÓTd[ H¨i)äEÃ[—úC—f[‹S9SS³œg/,ïoƒ^İÞ††¤HL>Ü®…øž—ò6‡ûVbÐ^dÍ®ËÖžÕ?•›ùKœÝ§}á³"]¿¦]u¸vÁ‚•Îx]a„×°¢–Ðc›6–=þ’mÔTX`Û u¿N±Ëñª0­Ê.@´¸±ƒ)#"Üy d,ˆe¼ØÛpbÉp8à=p0×ŠÖ Jˆ(*×Y›½¡,VRZ¿5=ô±‘ ð,:Š6 L‡b?†ÑæG^G]Ö†F£h‹š%þÒ…ßa£}ýå#£:'5NøU®™ýòa_6‘SNú›5…“5@ÍÁn»U­qÉ–¡9ˆ.^§Ä,¤ÄÉëËQ:ny¨6ÄI%‰Ê(SÈVÉÉ͸æìŠníÉ®‰ th`Ó‡ Úv·¡«±>Ddj/J­ž‰­0­iê)¢/¿8­1w‡Æzµ©­>>×5õaÀO¼Eî¢=^G_ ÷©Œœéi¢„™²ºÙîÙÀSŸ¨)ëî Œ¼I¦®8íá -E=i!ùŸ/ío(XP kWCio±rHköëÒ—c·žJ»žSoŠj-qæ-r8¬RDé@I@mÁÆNñ_ûbMíñÉ.ÿùÙÙÃ9 >ÕÛY*ÄÏ>BÕÙDÔ<4t9Ë]ˆ9Yçu§A8ýCâð¤{qpšQuâÖ"–¹×Ѹ¿ü6„ï:iR±òþ:ñ—%'@ŒçTé–ù<%ù¶ëÆšqÜArÕ±s£kŠôq‰Ú=ûØ;¡8m—ðÚ·>Ϲ;¯©?r÷µéÑ¢Ë1K‡ý•)kRD(VŠc–GX¯›‘$c.:S³KRv‹Q¹“jJ:ÑöKT‡ÜÔ›Ñ$ UÝ;0Bxm$¹Øgºàº5›6~U1µHž:=§rÓ~M?ßõ²GpsÀws¤ssâss–ssÑssµssósssóÈsó¬sóêsóžsóÙ{sF@’ 93{¡˜ âs–s‘{ÔsóssÈs¬sêsžsÙs½sûuGðH¼‡¾¹ƒ™÷BhÛ„IÛÆÅXÏ$ž¹Ûã{dÖydõydÏyäìyäÞ}Dæy$ñ}ºuÊ8·];j„ò•Úy–ùy–›yæÇyVÖyVõyVÏyÖìyÖÞyÖýzÖ#x5à{5Òy5ñy5§}– {Ù‹yXó9ùI‹É¡ªÕç}6ÏyõìyõÞyõýzõ#xŒyv÷yèý- {e=´ýq RûòòÍóž¬óžêóžžóžÙóžÅw›H{“÷j“s´¹uÑÏþJ h¹ó^µóYóóYóÙÈóñõû5ÿ*Sõ×û†—x… õØ‚ôŒŽóÈ£ó=âó=–ó=ÑDÈykï+|ßP¾^)yVÁ·>Ëwêá€htßÓ_ß{¿|¿G7÷»_³<÷î1ŸáµŸB„w¯i߬-À~›W Ý÷ÀœßÏžàÎï÷×ï»ãb¤¼¤Ë]¹Ç¦Åf6¨À«APÍ-6Û*èù/>zr¤¨Q"Æ mƬY2fKmñªÕ*§‚Ç¢åZ!¬þcFÎ]9ØÐø,並-;èžÄº§µ/^}}\­ƒý}üCÂM̬£ÍŒ8Áé©X9x338 óòsr‹Šó4‹Ê ´JKK«´ôpk\â#šÌœí,ÛͼÛìâÿèóé þá2é6ä>â2Ó´YŠl6]‰nˆ'eOÙcÊ>fb«>9½º¸¯»¼‘®¾Í¹WÙnŽ|[Ÿò…ê¡@V«2ú Ù¤ßïÖC!É(£Õýœ8¶Ã˵0Å0E¥ýõ‰ÁØ(c¬"DKœÖ«,žHeÝ9ÜV·6À÷P}ð-_žÆÇ1³ƒÿ¤HD»–I" 2»Â\ÒVh¤Q.c©XŠ©ŽÐ‚` k$:WÛC Ýø;2Í•‡¬YäÄ)hmÛ0—`롸ºâ¦é#3¬ç“Oàiù|/Œ¡˜=&¸jz)›”ÿê¶/#ÄÈXO¶¼ËY›RÚ© Ãòʱ@ÙugÐó!wÉÏÃl|iK´9l… 8åv'N¼¢N'æÖ¢Ï nZ4°&Aq!Æ¢UˆaäßpYx?H£W-:1IÃͺ h‰·´æ„0Ì:ì‘8 Wu>ÑWðWCÓœPO‡Õ0&sáé /òcHÆ%ÅQ6##)Zä{VþËÉAß·PêÎö0U^Ÿ~#Ée6L™Î ÿ'bZ›¸NX½œ\QÁ6GQfä¢C×´‘èßño3¢x‚Ò ¬D޳ýEá•-Y]Ýë<ã+>í.fóÂ9§]Cq{ä",§"²­2¦ÄÆÜ¶ëÂ#b§ëy·³ÆªSÖý&¶÷Ö¬$9ék±!›šfpŠÕë¸ ”¬¦Õ²9ô.2?í´ÛbPsAÑÔXÇÍ,,9ëvpª¡‹ÌWeºM;–TÓB¡»¬·þÕ j^R¢ÀUÊx€»¹†h~3„ðŸû\waúnáç­¡DƒcG Á®cÕÃÆaÌm´[«‰ú6 ½ïÛÙGm“xÖ·”ØÞ 2&6@â*§x¡ï_ÏÛ_ªgbÛ&öÃmÒØÛVFºZ§%{£¨šÙfÌu&þ½¨ýü™ó½\˜îHÁRÖïGM=-—o»çî—ÈoWÎ[À¿k©ñ|v¾\…_»Øn!®¿øœlåm½Ý¥e¼·Ý|õcµÞ7Ís´Ôs VHK·Ìˆ¿=÷âð„Qì€ï­éª>Þ¯ç†ÞîëM:¾×ƒ}ÛòÛ*{úŸ-#À/á Ÿ©”ÖJ&\z?8c}¼7ù”b} Z7Sùœc}*÷>˜€\¾Êvk)ï ¢\Ð (>DÛ 9õts±>”µû¼Sùîc}o3ÚŽ£ÛÏB¨(µÌ C/Ñ'A„àß!ñï A ņHÕnB´¦òdž(§Cˆbuì¸p¯O#B,‰aâ^ú­MŸo¥ÛÀX×j"¼»ò1îG‡8ßk"‚_òq~$ÇøPjbB„ŠqaFÇ„Xkbb|Š qEÇÄTab H‚– !"ÎDä%õ£JÍ ÉAëùÓç#*)µÞ$ÔFSF5$^¤ÔD¨2R ÐuÉ]8¸”4lSHMé£Ü¤Œ1š›Na„†»¾3ÃiK°ƒä~õ4Ò¦¬ÝoRö! Ylz§è6f4躊YŒUãˆ+0~Ö!ý.‡Å¦Ü×n2^ž ÇÛ;_^lÃ7ÞY—Ñ&UrÖ  $ÛÓ¦xr᱉9™xÄ3arQhŠ˜B…"ärq!ÊÅG‡Œ'é>¦²¹]ç|ðY-hiv@xq…¬Så’“t2ÉÙ²ö›ñ¥"ɨr9øˆ˜Ò_ÿFp)št¥¯ ® Åd98H¥*÷•Ÿ~R­’)øÞήšHH“œ)•9Oê–Ø–*ÝËÂÁKUõD—Zõ—K^9Ê•HY…|Q–©,õå>Å«mÎJ€ö‘çtg¦KÛy“ŸéR>âkf®µ 6L`kkÒϵ²ÝÚJyfk«öY”Æ>­jûiˆ—V¯KÇÄ Í –ÚëZ…=O­bU–Î… [»: ­=¶îÕaj{ß ­kŽ×îŽnZøõέӌ—¯-’®³Q•ÔÍ ¤ 8Ò‹xDtÞ ­{M亯(j “B­Ë×n#ûàUUà‚•6\’Z/Ä‘m0Û´öƒ£{;ɬ¥´lû ŠiCÈ¿ïí¿Dk=Ô±t‘Qš½µ­ú »$ @Á@oüã|¾ ~Ê›8½õ!#z·«õÃCŒL_z»3Ê#Ò(•adÙzóŽmƒ½VµAãX†L½èX4;ÌiƒÔú´-nSJÖ” tW'¾‹¬E3æ>1Y£¦pkã_ôy¿Ð¿2!&úm¦êÝQ:ô’%ѪjiÃÌ£Ž®mS§Ìøk“£L†Wׇû»+Ý…´UÙb6*4Z›#$®Ž6WìN™Ë>>v9tpWÝ”È$êqq.æòŸA´ÌI<ÖžäÏC».…XT•hnSs´wîV>;ÈsšÓ•®¯nVÖV÷š]ËÛ¯·•sß:NNX[”®/¥*:§3 ­S-¹uºW_s²‚I%S¼† p:ÇÈ€ï=qñÆB!1l»îœÆL½Ÿç%Ï[·0%™û+¬Á»—WO¾{û¬ô|;gG=ï-º<ìcÖZ÷·ž£<l3Ã~˜Ý=»ïS0éçY_£k^ŒÉWk7©Ѹï*²ªÎ¼^ :;œÞ%“Î ì——@Ï™´§Õ«Ÿ‡¶ÈŸ at†ÖOÇv]OKß×µ]}½3ɼŒüSÎ(ã÷šá¢ÒölvR{ö᎚ùÛ0zÝFZ‹Yλ¥PîlÇë×p“ûÇDëñÚåéYÌô|ßFuwm^ÐG§âèZÎK-¿;eÏ­ù¬¤nc.äÏIóWâi/  G¯éT(îC5ð”MÞí#î¾–d÷0ÖCÿKûs¡Ä—Gzãré×éy4÷Q¬¢<$ýfï½,MüÜyä½ìÓñ}Ñùæñžo°uk÷ú¾yüNÏz½ÏäÁ»Î}˜Ìî"†ÿþÄî7ç)ôè‹æƒÉæöä\¾l|Ê‚šîÏýS XÙ !ø›ÿ'•*7ª”º6º•¦7f”v6v•n7î”þ6þ5_w?ž8ßÖ>ÿì9”7ÿHgO™Õ€½#Üéß>Æ?ÔÞÈÕddÛè‡Ê@Ì@¡ Áÿ0rþVªÒê쪰&ÑЉQ•?6þ²á®àîþÃ;-À»ý‡ÿZ€øGQHbˆ= oz@¨*ˆr¨§7aðçü <{£…!q§4u!a¤ÁT’GáßY2ÎèùBy},`2àÔ`½!ëÅí(âô!õîÁQQ} mÿ OÑ=E‘ŸÌ‘ŸJËk¶Œw!ù¦!al!†|\É¥}ªB{!Ý`!– °ÇQƒ <Óã(Ój¯2Í Ï-³"ÑœÉQp1ëj0Ûe?M Ñ_’=k|N´¤?EÒ=z “¤¡€À í¢»é"˜"1ÇãóüAÞA%1΢]{#ÐòEtß#LlVã"faÑâ£CDób‡d$ÔePÞÉ#žècÙØbý "é@YÃb9CãÆuB¡€ZÃ=]‰ÎNâsy%!Ic)¤^âEkÙÁ$ñScéY!Ußc…CbyCdE<yçµPc OâD{"²rb›”BAMey‰)ÁH©J"ß™Os{NO­Èâ]ö~-´F)MÙIŸã@¾ÖÃÐb{œÂlbÁÇYpÑ]F¨’`)“dž"†Rc´RGõH9 JRë’"9YBS ýRMR“Äc@/‰®÷¡åM¿$eÞgHiÓ·žÊ,±9©ñ`±mk©~éuï®m„(+©ín)y‘á©Zh™‚î™ ÒñIº¾Rá®'¡!ÙN¶nf)’¥¬ç)%«ÂÇ~™/§„‹­™‡.0Õ¸© üº?¼˜©»¯™J‰+¹‡®M(!!a!æ*ÉvÉžHÇ™—ë¾£æáÉt™òŠÙ>y`*¹xë`Ä"©³ 99N‰!L[Óø>ßü!ûÜx³<òÕÔîñ4hÔ}y”€åP‡—PßÒ<úOm¾÷¢.ôÊq8¯¿Q‚ÄßcvËtÚ5³e•pEÈ€:)pz'‘D* }ôIûˆ#ÁÄ‚³×Â߆"u"Dz"Ç”‚ªû(ç¶‚÷“‚þ™}=É¥´.æÈë"ˆÀ¼óP)Rï‡ßµ’"C‘"¡£"55.÷µ(/¢K#«S(ùV»œ³ %š²\—’"Ÿ¥žÒÿ¥Èoà²*±²º³²f•²v±²6в~³ºy¢ãò΋ò2ÁÑ<ÌÔ`P§Ð¶=%œ5×áøÌW‘Ê]tR,†t Ò,¢wÐ_¢ªÅ—¬Ã—J!Òª#÷ªÝ·ªÃ¸ ¯!’hF‡¤oÜ!þ”Þ³¼IV3h÷¿C”ÌO¶4’³´U–¬ „|°W·½Öª«¶ªóP6\JÕÉK=Üyu[_¨ø1é¡¥ä’8I5H2<éŒl4±R<µõ¼âö?Fr¦òN¥jL¥Ñ­ž•­Y¤ž•èÔt04×õ½>c†rä¤L­D0.C/¾ž|4uç=–6ä„îZ½^ÚµT¯¹Ò¬;Ö Ô; znîybQÉ`ÕØƒAöžR5îöZjžTõuþ[­±=4Jì­™¤ ˜FúK2?÷Z}à{3{J=‡e‹F³;L%2cUØX³§oà=KÌÆ ©Â¢®.`ø—ý¦éÚêÓ4‘ÔèEf_Và‚õz•–öðñúвöºÑê Ñf4Ó¦û2KPCs·HLð[[ac›ìoIª|Žfª]2cYµ_L+ý~õi½>hû2k{=k{¤¸uO£khx×zsÇJy*¸º†hwözõ€UþÈkúÔº„Ì÷Ž&v`Z÷£{w@xw¸y»­;;zkëz§ 4º5XcàCpŒçQ°žlptÂáÏrlK+!Z®g_«CagÄ_átÁEÿ'Ìþçðî‡Ôpx÷š‰æ I^ˆW´t4‘X×ë2dõiŸ#pºSÁ/KoˆtZK_‰ÔÀŠÕîUOÔÀBûÀlJÈt ¥E-Ç€ª%°qÚ¿a‰D·‹Þãa K5«W  †ËÃòFµ›È¤ÔÀJVë4]í¥ ¿›êDV鬅:s@­²¿§|CŠ|{­«i€½ªó¢¬±SÀ:SĪô±<ÁŽ£Å@¡G™gàʶˆRµ†Öcx½dÀ‹«Á‡yD +º}ÌCjÔÛ%Á¾·¶ø'oqëX¹S{'ÿH>æpENRˆ{ÆxãéHvÇÍT{ÓhÂirœIØSØ(WÞXHè¨ý¢ ¿w#ŠyMc¶DÉ5@ûv|I¸IæôH ÉÄ>&„Yu-sëê°ÃÈtÎAt5^›òÀYaÓyó(ùHÌ7Î:dÎ&WµËDÖ„båÈ@…q¼I2Ý8ÓÒÄ… xü—F7Áhƒ þ¨ºëô׌1èúIïùéÐHú,feÇÁ&€Vôô›ùˆŽN!”g«gÌDÕ÷„ÏÒVÄʲЄXÏ™×Ì™KÿqʲæY®‰<«‰ÿ9Ä÷î´Ú™©ëNhí~‘Õq ‰M$¥Ø LèXø¦ØhžBÌ÷Ú\ø&-£ÞhñX>ßïSÂT‘|™èìÚÜT“ä É-jkƒòL$¾L­Œrµ ÑcíÑsì1kí1U— µ-(3fÒâÌ@óoÓ•'÷â¬ûÐnOO¶\íÐ"íu1oœîÖàý Ò)j)z©f©vini~€ô°Žô8ŽŒ´Ž ?Ž’ÈºPªf¡a* W6Ø=Ð3»¸s‹«D_6d¿®vy‰ ÈÎ|ÎôÎ|ÎB;LµZ%±æ¬_öl·2רÊâ×Aï+“ì­ ©K‚%ðI´û¢ö— ¡b,Ë&YËkDÏ»CŠ£_λ‹«Eê«wë»­Ï»¹{T‰»þé»á‹{þ·»¦g€¬gûg„Ì«ŸÊ§ò˶H­5.­ûd•iw³%¸ÇN°Ì:¹ miÈ»‰ˆ{4¨c#Ëgqì{>ì«‹k+ϧ}è{ Èk›«gv{VË{éígšªg‹kìŠ=á9ýžå¾³Ï3QÏÇA½Ç+׆ˆIH߯my]Èk`-cð«k™gæìgÑwŸígïÍgß‹w£¯ûb®çbÏgnÎçbïg€ð—ɤÖv§WYŧxë,qšcœÎm-®ÅL¤·ýʰÞÄ[Ïö½9ä»ÅÆ·8êY¨ú¹zúyàóÛ \ýœqIw²Ž0›oÄÊfyp5"¸ï^>®þã7y’6MªñŠÚpµ>u_[ù¥©u×£sQèÁ½Ìd‘íšèma›Èqçbk”³ú–AרÜvêWŸ€ÂEŽ3”i3dŽ ’Y#†üùÉÛj‰ ú÷;²S9Km,˜¡Bº"œ>qïLÏ>|~ñéåíãϧ¦`ª.)­¦`müýùùù ’šcþ2+£Ì =£°¬”)§”¼VV–ƒQÑRXSËZ_XÛÜ\ÞÌ”Ûgm“¥¤¬¨£§9¨i4,ìÞËÕgëÖ5›3¿°¹µ³íª›´Ö®y”6´{ºww#ÔÔôÐÊXýòV«}êAï•ù°ZÝ®êíkÐíΩ A¡¤ˆX1:å1AÈ@’@ü[xªH&’)Ç”‹BfàEt ¤UPvº²â8j¯Í¯wúòBh,ž(¼ ¼Y°lSB3³ìd61b„X¢Œ#N‹Vê uŽ‚ .9nV,¸‹®ÖÛ|üI«-^èvº=e©“$¬ð6S,œUž´Uìì²]Ÿ6 «Æ~°Z`J;²€¶^Ÿ/ Çsç·TV,—Ë^Ì(!*TÄQfCÖTÛ‚Ä‚Q¯?Z2f JÌC±Lg­¹ »°žÎKjm¾;Ÿ ×[-vo\ï÷{_7?œ¹ìç¡%<+›Ÿ²îãÝÙ‹¯Zë[G¢£³UJ³\äæO0œûØ·Íð;:ÔìAþµÈ(ÉúßúKq ¿Ôõ½hÛódŒ‡‡Ý“ŸCÆþ'ÄÍÑC(¨Ó¡q0ÈÊ CÀ^÷½ÈfGPp" ÑOG F*’¾ #c¢w†E›ìQ$ÇÜ­øñ‹ˆç& t£îù6lAÅDû§¸…I~Œ‘8d¬ŽIŒ'Æ”Ó MÕN³õ÷Îò2„$Õ7Sv¯Ãñ¼OÜÌ|KÐ p$È2Â$*Öó”MÞŠœt'¦Rϲω‚Û‚ËTBL<.L,FʘbRÏ(ŠBò9*lŠ9é’š*•ÉsDÆðóòOï¸ÈeVRTE›2­&Ô‰DR59íkRÖ¬¬kÐ mj.–a††y‚¶LlênIÏm¹Hq¯ÔmÉTV6˜}xl™~œ¤6ÉN~ÚÂÝ⇴€]‡öË̵M·C§HÔà Ä ¨#ƒóîS+Ür•4¼1K$ôؾjÜŒüër܉£¥D #ÌÛöø¡\ࣴh]L,/.[G†Â§'x½Ùm_Lµ=œ ø Ùžù$Q.Ö z¿æÎÂÉ T¼Yˆ„Â_DaQû7{‰ÃÄ[ÖOVŠÜO‰;ù¯¼Çþçç3'öˆl€ÿ¾åük?”x|Zc^Oæ W?°LÐu„¹è:†@€¼7(§Ü}þQ1å€%è¡iûмz¼Æ—…ò›. §‡5Þõ’9-=&é²tOèïyö²%!“PŸÉ½¿Œa‘¶§x›ç²³;X‘txx).”„4Qã*»XB¨"Ø\:Õ=&#‰&ÊzW8%ã¬K_b ówùÉ$ÿ&Jbâ‘CÑï–Èȯ(L 7—‰ržá”¤bã:XölM¦8arÜò*€Bc"Eø°>%K¹”~ E*9•# 8QËMqø ÀÔŠ”æÏc:ƒÉÝ£Ø4û&y^D cÚÄ´xfRêh¦ë¥‰4Ñ}¢µ%l™pDŸH¨¬±êó1÷ÔY_Jô Y0w‹Ñf©ÏÿYÜ»DžÍîTèûp¶gw¥sºÈiJèúD4†)Ï»=PC¤É?Õg¶—ãS®"¹äE™"Œ—þÄ¥€Ñ ="Ì·ˆ` èe®kÊ ™š·Å îæÐïÊSå÷¿*¥3ÏøÊoçd®¡Ì-0$•õËöå(…JÚ– uç+lóÍ‚ž…•¬«š* œ9É5RMIˆ Eáõ>Â.ÂêšÕ?ÕçA«aÎ(®sRÿnZ=+k.ú2”R"lŒn‚«‚¡-cút«³‰ôI3 ©˜èSùºÈMaÇÇøŒ´y HîÒ68¼ZJ+©&í:ºGŸ”qú9 µ13ËFf0ЖÀ*´kúSÄS©/µ‰(‰¶ #X—¾T>…/ÓÌ ê3îHí%Ú4™ù…Ú'½ª…÷ç7~‘T:‡÷M™:P†råê–­ó™…°vê±Q@O¤i5‡N^—ʶ q<÷ÞMصaÓŽ]tƒ²U{?NÝUžó~Øþ»³Õi~.vµZª„UE}:¤8í']®=öaËgp¿lý4$õè×)Hg¯Ù+—ÉK§“Á¨§iUL¥ ²,Õ¤ð^îz>á/FCŠºÕË&@s9Ê”taNÚui)Ê´Ùþ†Fu°~:H8¦ÉÇ+}¿!ŽûÅÜrlK üîßOYr&ÌèS»-õ9wÚG0»ëÝ&³g±M§+à õª½ÙjPÛ¥ÊìѶÌIW*º¤'ùDC–Pó+Á§¥D;&"{› …¶Í®-'…›Ó{U,?Ô5í$´«ÎJ<5*ÄgškÆö>9Û«x.Ø$š¡ÈiÀñæß…¬€Í7 ¦Øž &tvï‘WÂhÛV›j/{Ç]…œ%žb‹§êM\[¶Ö£i_˜íÖ•¬vd˜»šïäâÝ Ð¾/¸X1Ïýææ!(3»}bœÆw´Ü„xÊÒ8ݨlK}_h÷VUj+COíNüµÐµ´£VÞ·4¥ÚÇ:NÎHQwK§%LË íE¢±:B.®ÑsQN¶ûïãè±ÔBȨý¡¶^ñÕlŸ€†5¨5…Ò¼ÞÀŠí§ 1´ó”ϺY‹»“?tÚ.¹©ƒ‚=v·ìø¬[˜TGmC9Ë@nN:=wtÑ0^)øs¯3¼oÏ¿(¾\ÝÎíx·5ÈMç+š2{QóÑ=b/îsÜshîsRÏ6~¯çtÑ•L»Y±e*×À¯«e’Ãl½×ÀsÜŒ„•üѨͺó ˜Å-´ÀÀ+ìä «Áʸ3X:؆xÀ­Ùƒ`=°À4Sè)Œ“=xÁÓ$H±«%´Ð‚Çü ö=[)<ù_ÐWêAmWËûrúöezÄ, °9*ø„Ê˿ؔ9Âe ÷°cÐd 쇳ˡð/ײÌ (?úˆ< ˆ² þ”‡µ 'Ä ¨IùH57Hió5Пò‘y’øÊ$euF‡ŠE0¢ôÿ^Õ~ ÿÁÈJ€×MÀ°›€uB€ûÇ Ç-ÿ몰¦ÖPÀšÊð©\DW‡³©Ä€¥6ŠãqŽ[•É'Äê ˜ØcÝáå4ÀÐB}@#ŸÕà€6ÂÍ#hÎã!)’%R-Ò!1)±%q)¡"áÉ0ì7Û÷Ÿ&à|Tà M`µQaƒÌò+êö+€ePî;`8Ba(’E/ ½‰ïÝ?VþE %!º'Ëà·Qަ ;N ¦¢83![@iØ—]œ+T„R´ÉL$óÿÓ¨t˜@®ò€Ž¬HǼOŒ¢_»¤H9O0Gà³@n‡Dkwûºé:„D‹B5|ñ—nIñ"ž!ÇVÙû‘îÊŒR§}ìZ¡‘!¢ÿ ™a%–A¯žÑ…Œü&n'_ao£D­†Ð]PËÔ F[‘ˆ^Ó¸TϘû˜îŒÄ_Œ@½×È2ELý%šD¿ÐÈgô“íhÊÚÄ$LJôDIÆDE•Ôûj¾í¾„ŸµÄÁ‡ %¤„¢„ñD£Kmˆ÷ŽÈ›žÄ¥tÌa’´aÞ´ÈÙ„\÷Ò´ä¾™$í«4&­Èi•ÄûäîSE2S‡Fb‹ù¢ЧDn¤EòD;ÁD—s'”ˆ\%JÄ -`£$3À•Ã=µÈG”ÌX‘‡Ì…êæÄ•œ‹Â|ð—×J‘7.BH£‚³h€·Dž¥­ ZGYüiÝ<†ÙâDxFXªœP¥6Q À³ñ´äÏ,nðÌeò,P”$\ÖÄNÂo~ÄÝçÈS ( %,¾#Ãm£(§ÄÏC<˜¬Ä–ï,M.)°,y…$(3ÊÜâˆñ{Ç®€"}ðüs¨,2¹ 1Ã(Ì,!DeýÚÀ?” Þ»û$iöÄwƤ`uQd/nW,îÃŒDâ"ðÇÛ–]ÊY*%ymVIlì\I%H@EùÆHölVàEêYF.I ¡R®O™ígüÛQ÷RÈ&jAÞUeÊIÆ`UÞ¦L]¬EF‘þ¤ž#:Q?Ö9$¹ÍuQÊ ”Ï$…¥jEÝcf‹YC$Iü"A?ÓEPEEë·\lÐ ²°BGŽªFƒzp¨"•â]«ý°¢ý⢗¼ãr´ïrz§ÚBEöÊù&#ˆVW›BÛôBPu²_;¦AÕã8Âüd(„j¤$i ¤Lõ¨'¤*GøŸd!£fUTZexO1ºyÔ{b¦|y”»E•¶W•]yYXO!zÒSÒ]QV¹[æG@á²M02 X2ÿ‰´uÕ²´`@áfnÖAj¶Ì37QPS²\KµÙZµÙC³=b……g%XSŒE{2žJícn•uC³,QþžMQ3«1xx5}qµ‹qÖ@³Òq•e“Wbi¸j9̼²üs³Uý—¦É¤R€~£@xs´v8C²ÑrÕ¸óíGü}Ô\+ƒMv5x{úŽm€šEøpR«s‹’ssZÓaî"g³os¡rÚp!mz•ë¶µ@p ysѸÃðx{¬VûÀ{5¤}Lƹ۩Au«½¾i³yãÛzO¸ù(¬Zô¨:§1y¤±‘ˆ·¯°z§Í9Õ¸¹õ¡§ÎùHÜzƒºûw¸ùY©=¹«ù#¯{Û¼ùl­Ñ„¹üs_¿ûV ZkóÓ5*7ºzsºQkÉd­jTì# €i÷4jóápèó’ Í@𦨠uÀ$z÷‰ÁvúAbeÒÃð…Tóí¸¨ü6¸K¬;£þu StÙƒóI Z {ázo~÷~÷ùx‹jsw`w5AXJŸÂ(Ca—$q3EÍɽ[}ˆ{SËKF M·ÍYÇ«e]‰´YqÓSs¯zAÕx|w`Iai'IIò"êH¤Ëð®ZOZkHzäþL“ÛH¾Y7+¡kQŠ÷ñKq=êv»&X£áj¿"K+qbšKÛh{¡åà,GOùH³ã°´ùivó¶ÒðäÑ;P÷ðcõ¹mªÅÌjÒÈjëBqrŽxI‰¶Sh×;RúËú7œÃ‘àSèù/ÓË=Sáqžu—‘œ¤Š™ÍÁ”ÍpílФ3ôd5籊™fâžߎ‚ö)¦®Ï4‘ù°QX·‘u‘æüÛ÷‡cÒýÕôW*#ëå½°Ë#&5B-³¨„&_LQCŒYËtÃ\Š+‹l¿˜ASSdÝQËsBY9?/Íô¬@Óâ3Èd0·i#™N3ïc#E«œëÓº¤ÝJÚ¶I³ªHȺm³ªO“S8Ëγ¢f£8§³ Ô²ÒÀ#ÛnÅΉÙmÅ»¬:m3wŠ3Oés¾ßóʲ“Íȃ¾ Má#س¬³î¡3ËK“»smµFj°è¶±Ñ"¡]»»ððY¡²™WÄÙøsS’ÀZ:×,0Q—^ݦQ¦§ÚÈQ´·\&¦…Bšµÿ¢ÑÁêËÔU,×Ë£U—ÆÞü´Òj×UÙgò®ìÝ£Õ`°UÛæÑêUì·Õ¾É‰£”.J·"šäIêºYȧe¥UÝ õhËf«ã,³E«é®£Ó«±u«§%«\(ÝÜ;5÷b³;o"«Ý¯9ïfë-Ñ+©5¿G«e` Æ^ˆ»©³?n½_ ¡¯@©íè³qg«Í‰³ÕM³ ɧäsð¬®YN½ÊÓçƒ]€»—Ì[$¤%%æk˜‚hˆ-[ J«âW«[«Òá€åø}¦Ø-YÓɧ°5¢‡0ž"0æÝ`õ݇3ÑÜfPÛØaÒbÝ=æ?ùÔ9>ǥߨ=…ÈmŠ-Õ™òû¢1«à9{•=[ÕÝ ¥Ý¼ðÝ+ã>±ƒe…%²Ùݳ÷­{½>‹ü3{Ó=-¦1÷3R ž¿æÝÓ“Ýç·h;0aO…³hb?Ö‘å¤ô5RÔ½xõÅùÓŸ’-›á-®õ-ïç]x†Á´@kû¨]/ïƒÒê vÙɵºb±ÊôÔøîIÑÛ͸âåâ…»Ú¥º Þó3É&$ßèÐ3¢é$Ð3µ³–»µºz”¾Tñ¯SÊÑ=ÿ¥eˆ}»uö±0¢3öð^î‰Opë;ÙœgA• ~–“ù™Þñù;¾3¡÷Óe€SÆêBFá=G³½‡|²4ÕÑÞ;•+…•€½3<àsÀ£³’²˜´³xƒ»“Å“¦~»aáUÄ´ åœC*ô3ÑG; S™£ŒÒ¼µ³ à ä;ðÏwÙ/'?W.óÚ¥u·Û&^Ïscj 2w¹¥JIãEð c8,÷\aFŽëÌÍkË ;8ëL-/@b‡ùo(ËAY.TôîÆÅ¿ "ß Ÿ]íì]%Öí ]ô*ß–·Ü-¯ÝýŒdXÄÝq9Û‡þë—­u~¼%¯—WSÝs Þ{Š„[ìŽ;¼IÞý€^ÈŸÝi@Eëƒ]ïÁžçPŠÎŸ—íÄÍžïÒ˜ï“ã:ÚãîVšÎÕ Þy@­ìï݉ï}×¶.ÙBÃó9àuïL÷Êà·Ãd¯ˆq:n…ó¥o7¥Ï¥ow‡û¸ËGÉ"Ü*¦.Ïo_o fo»‰÷ƒJïÞ±¶alh=®ç 4ç^jéÞ ÿ!hõxJs5ïG-Ï!ëûr ÿƒä¯"¿jý¬÷—­B¿xêiDîTb¡ÌØ£ôÚkÌÙçì![ƒ±À0<\œRâªöX€¾f<íhí›läØ1bU´l•ÃYË\ܔ؄‰“a…ókoÂù+᫚¹{8 ½<YØUaììÅ8Àĥ⥠¢ý ‹RSˆÝÒ32ÉcläëUµ2QRËÊ늵9¢˜8‚ÿƒX$„£úâ=2ºª{š{ý–¦•2 ús‹»gfÇg½]ƒáÆZ#›£^åÆóæÀ[LJÏ3«à—ÐW··‡A.Ìï ƒ•\p…HÇ•D5h;Õàr¯Ùm.„7“}r1FG<ü° {ÎhÂd7üÒ ZÀ~¶¬ œ.v ,~ T.+†¥c4·0œ%ì8é¡ð\¾\á„äÚHO{*dø—d÷XxEtIp,”å¥zOËççHYÖ\pm³€L‚‘;¡9š4S§»yðÃ1hm˜ç~Plû!¼Ìòõ¤äp<“­ þÓ8Ÿ¦ ~nÙYcmÜt¸bÌUäqÝé°UÒ™yØŒÃÕf+äÙwªû̱TÞ…Ñ;•Ùð¸Ã§ÏÄÇõÁ ‘[gÍ׫3}6¨®ÇM˜mªv1"Â/‹‡âóŠ3»†c³=D›x{µ%&îQX= G§7ìð—à*†¨Ýªã’ßÙ¦ãýåq†î€Õu@°5ôÂÁÛC$ÔÍ÷ÇÏm×°Óý†Pòú$ð!çà‚¯Ð>¸‰ú'@CÌï¯>Î 6(J‰ Ö×ÈGUqoÿ+÷ÇÀ½q7ÒY $)$áx ÉŽT b(˜­[¾ªYh襞‘ÏÛ°:Øœ1£Ö›œ; ©G]&† êð¯Üj¥âq¤Ìäá^«x:mcƒ¢¾v6†‘›0'åD¬‹ÒÑäk;=ÛiL¤¬ö&"(7LD<,áºj3(b@rqÜ 6!€bMâ“âñ!˜ÀÇ¢]qt±žÈ„ªïC¢Æ¤1Ôº8Ü¥|j‚µ!„Òæ…ÿ‡ÒI”4§rϳ*¾^Ø”ì%RÔLr4]Œ†Œ*T’×ð3|™Æ˜uê~ŠVT ûÞ³4ºM¢¶1s™Ž*œ|®H®.òÉËìE…Mle–£öØæ¡§w¢®çðYÄbÅV#²¿‰7 Ù¼Õél~Î"Üjw„,|n5÷•‚|¤íŸ‚¶kR&6ɹúb«×è|q8“ŠÑ†ò›rv>˘ÐÞeQb’BA¹óÙ®lã Ä}¾ª¥tGY Ôd > NcR䲕 EI)]æø“qœêdsªïS¥I$NÞçÀt¹KµM•ÖôZû¤K­sM•Î]äZ÷¥K]F°zš¨Š«zJ5ÑŒeM«å¢6’*D&…¼‚Ï íª¤©ˆ‰èÛ3+¸‹¦>ââ´iYYô‘%—LÐLg¾a µ¥—²†(€ÒeÁÚF©>s{ˆ!“$ÊV&?Œ§GÖ."*cùó¸]@cÖ1àJm•V©¡.Ñâ×\Ø¢4¬­ÍFÆ ókgÏúXÖ}Šj»3½çt‡Æ¹'Jë%3­ÇNþÆ5Ehw“U•éõ&Þ9zåÒ—¼•é‡Àû"*ÀËÖýfCç‹»ØHm èÌ¡óNØB~Q|ÄL½óÊù:¸ÙTlc‘ “Ñ68»e¦?§žååÊˇ^ç]c)¸žÒGÛz„_­ àÚÞÃBÁ7½‹ð6&¦jƒ¸²¡óSª6Æãó€ íÕ°:c7BAĨAæ¢öØÖºüØã© vá>a¤7’uJîËÖ<õl›ø+똣q}Šö‹ÞH6ãhÐSÆnNÊêÂÚ”9°µƒœ1;2sŸ†®cLÞÔ1=Ðòd?m.z¦1ãÊû\ÊÑe¦ŠÃ‚é‹w¯x·²ÜTËÔ¨ŽæàKÔ}ÀŽÀчõJ“¾Äu¥íÖaaKåèwsÚ©>âØÛR¦m|;깈[e(ÇŸŠäMÛäga¥2¹Öí@9“‚x ¦ •uÂRñÝHùḤ|£¢gõ ¿%ö‚}‚prøgmt¤ß—§KÓ\ñïÆy¯l3èö²yLç6>»Äm>UçR­û ‚Ý›×~(jeý¤x@JæÁOŽà°¶Ÿ½E.¦MiÒÕÐÛ¦cJÏV­³ßû”¹ÎC·ˆÊ1?3›LÏ¥?É|Éš6{™«ŒaÒ‹LDå7ùXøŒ€*6, ݧËc̆ڥ@5](í}ùêé¾RýJ Ž4ÚîÉ¥^ÍÇŒé™B”ÇW³Ìé²ZÔm³¢×6±%k ‹Çt#ËÃbLJ‡ð{1GÔæ¢ëÚs4&»¾§;Ý+ör§”SëŠ=—=(¤{æøK¹“¡‹8m8ou¦ƒö÷\~ÄGï±e¦k¨.Ã+¬‚¼·ÖÁÏ“‚{ /ã^ÓÀwÛ>ƒxå³ú9VñSŠ0T}ï ûÙ•óóÚüÐ}èïc} ë{å¯Zºo¼ãy ©ýF×ÝcéÜÓzžø4©í…áö)‡ó‰^¹íŠBAnfÝP8øVR[þÝ©¥ûú·ùj/û~°¡ÜCЧ¹y7§y·¾ÙB˜£Ÿ sþ¦ FI@bÿ  ðß0ñ^D÷O9óOl °úP!x>æ¿&¦¨–èS¢¦ Žîí‹ØÇœz $m÷³)s΂ô¤aðcRôà àh r[°'ó«rZN :L ¶tL# am¼\ Üa Ä ?qÒVXr 8hÕÁ@S9÷;cóºKr¢ ÅyQ3³¹³±R&Oƒqò+@»[ ’XóK( ‚9m33|Ãn†1 ÓñË ˆ G´W3 _( O6GŒ÷MÁ1;à4ˆp³/t‡K‡v$Ž´75^—ô!n(GªÀöb&o u F*Œ*gã]wˆ÷w+GGœe§k?! x * ©¬{X~¤;O`Dn•GÔ’[&ý‰½ïº$WFsMÃjm"ŒµŽmVg¸—\<Ç~QXm¿M ´qݨÿŸçgìmß•ìÔóãñ÷fÁÀ\›[6äOœdÏ\lÏ’õÏ~Ö)r;§ØOÐíÏvɉeÏClÏÃvžiΣfÏUj gŽE÷¥O>òÏctÏîcγf/rn/Fc. ð.=r¼v}t«Š€· yÏòn/ëà¯t1ªe¯çô¸"ôOèR-º´×C²×Áð×c¼gŽǥ´å¼JÏàãð'#²7+ÛÀÕbíœýiÎÕ¿ú+SªìÚ›Lß›³ØÛ‹Þ›«Ù6ª ²ÙëÎÛëúg°Á‰[íÄÛÚ»/Yù·Þ›Û…=ÙØûŸ«,ÁÛEÛÛïÚ{¿s@íÍ$üÅüí“®,C`ö³îáÃ÷žîÈo£n欆_±{]÷Hõ»wý7î IoóFøÓÿA<öI´ö‰cî‰ëî‰á™îY î‰Öïš@n›Ðï’xÎ×îöÙþEŽîEAîEÉîE%îE­îEcîEëîEGï”þî†ÑΈgîÑ,îÕ"îV|oÄÎHáMÿ͉îÍEîÍÍîÍ#îÍ«îͧî`ˆ7ƒàQýb÷Öwo­7±— Lû‡ð‘ð{éÿØÙóüJó‘Q÷‘%w©7ÇxAð™-÷Yb÷‰+û!a÷1CûYÃ÷Iá÷Ù@÷Õ„’{·¾ƒ‹_®Ì4)þÕ‡ð=ð ]±÷jÜ÷Õ=÷eEþ=5÷=£÷Õù¹8ûìøMQC!@çû“³_8{÷³ç‡<Ü÷>:ç¶%'¿Ó·wª‡qޏ¹èéÉùŒn½3·ÿd8€1&ýd0’¶ÓA€)Á$ÌzT®ª»û%šÉí¿]L´ÞBŒ!1?  ˜!ZýM[+S"ÙÑÁÔ°¤ˆ¼ÿ¸YYe5l©}áSrKk[{GgU;hPÀÐñÉèØÐÕŒ”öcµ.|ö®„d³ÍpX½MKÉd…r÷Ô$ö ù6añ„Óåe¯¥i8Ð…#Qij _Uo¾ÉÝÅÂÖr€ïrŽÙêIÌÇŸW„>â¤3YlvÏçµ’¢x|`X(:È.œ;ÝAÎüݦýƇAÏ"J‚Ül‘Ñ9=ÞZz_plÕëuLøpÄLÕÍV›2c熙6S‚J’dDa­ˆŠc±•¾dCÑAJúÆ\¾Ðèòx;[½ÑlíNtöÃD'¶¹Å°%hÅÎGËÕ8/É'ëͧ€-AÛ1mW±#–œ+ËѺ|±ÜìÍcü;¾0<'NéJ¯Ü+‘ñi¡›Ÿ’Ì÷““™<1="Vá‹›¾;¨ÂïÏ—3/ýÙà¯ñ矟_HúÆoO{x^PῩΫúóÉÏ1èû³Ðõ‚0tÃö™/ÁâõB|ÄB¼ÐWšgL¼›si°jÆ "èþö€0âQì¥ûü€Ees ®]Á¯š.\=âFq"í¿5ØiÆ‹BÎÖÀ“ßΈ1}DuÃŒSÃeƒQÒ>°§„Sl`F©éÚ ­"N¶š 'Ž£b'Y®«á'Yž§c'9¾/°g9Pgy!‘gydg1ìg ¢& ‚Áaf¥ÍÜk†Ä¯ùkóY–§ÅFe%9Ÿè)œîåfµ¬§Þ¦ó'Äæ¢@ ·“5=?pVuƒ0’Vu£8V “4“V ³¼VM‹²’VM«:ÉE|ݓ֭wâò¸1¹ àÖÉâs~6—µ#·½6]³’6]¯»6=Ÿ·“™6=¿_pvýHÒvý `UTHÕ“v C&1M!]¨§}·Š ¶Óv£8>ã1Ò㤫•UÈ05S û++&íȤúwm.ÛQ³»Uö¸?Nó‚0ÒNó¢8QN‹’4ÓN‹²¼PNËŠ²ÒN˪ Ù÷ЭÓN+z‚^: /K™ÀsÝôÛË–5Ó.›¶½P.ÛŽ³Ò®Û%Q»L¤-^&Ó1kB\­!1n‡t³n‡1ü0œÇjr[»)ºµÜlÌC" ®ÿë|Ìÿ¯ÿ•ÿêjÎÄHkoköÿ­wüû¯ô LÌ,ÿ¯þ+ ãÿí¿þŸQò²bpÐXÐÿ¹…“VüOWÿÏ…ÿ翘xe´ÏÅÿ4}yie‘ÿôŒŒŒžžÑ¿š^šÙ=@¦^5@@˜˜˜z²%3˜LÏîÞ¦§§?½L™J¢M§3˜‚ƒƒM™€‚[VJFMMM%%%ÏzŒ¢[¼œL%“{ZVÏ~§M粈€€@ø%„”ݳwVm’ éaöjåS@B¿~“R#+ ki˜Vca饨 =|ÅðIÞ¿€ˆ÷ïÏ_ƒ ûås zKì°uƒ‚ñ´ÐÙö˹wr t«Ü?¸Õ.4Ž’ªÇ„cÁ7Ô+Ö7Ôbýä Yh>à6`V„Q!eT"4̉ŸhÜAõ‰ãZD%ŠáØY§‚Ï´qú±0êQIsQYõ ȱ˜¯Ôs@84Ï…VN {3ëg ȽPAÊüÄo »üc¥ ­œÅ+¬±úQ/ t+PnÃFv‚¹”Üs4‰üŸzwny#0vgèA“—³J†S‹ùl Ã-À}ä„~ɽöÎûî·?ÿÞPkl¼ØqB j¦ÜY²F³îøßûõîÒ´Ys«dïï*E{÷íÞ²u[wïß«7&[ÿ€@?° Ð°ðˆÈ¨è˜Ø¸ø„Ĥä”Ô´ôÿò¿cCåA|sŠKJËÊ+*«ªkjëRd ÙˆZ…::»º{zûú‘Ûÿ ø6˵ LÏÌÎÍ/ðN0NáÚ5«{{îìîí+m[Xoœ©ÜœÜk+>ɼ¾>>K~Hý<B_?ÎjwR­Çã —Ùäy~ÝŠ‹Ýá£E¡%ìg¥)‰pø|Ò‰‰%’>ä=‰?êMõE%Æm ¸²hµ"Á8Ȱ¢Q•^Ÿ3ÎçH/ã,fóîè÷O8ÉØáX½9çQòñ:Pn:ˆ7Âõ‡b¯ÒR 5Ûì: ¢'-¥«ÆQl{:Ôh»cÌ5a»ã*öSLÓÁ=Y„ÈB‹ßíçÚÓ÷†v¹>'¦½Ïï±a9¶òj?6Ãv?/kªð¯e|ë$u>ºw€?ƺïÀ¿sAÁÃù€ZíÜþvçèÅûLäƒ6að@5Þ 2éü’õÁÄÒù#w>ËWÀJêƒ q6àÜû7ßaœHÛP<°CXäðn¼Zú@ØCÄ4A$ÄP¬éƒ¿ÿÄ{IéÃo£vPlº ‘—Bheíà ¾!òÖ…( ï ç!1¾¦Ã‡È^èý¿ aµÈ‡˜Iâ8òÁžÊF—ãh Q‚`ÅÀìc´Ð®÷NÅÄa$øhéã ±¢Ì5b`º¶µOK{&„[‘˜åAKÊ9€5£Ùù˜õ(eJ=Û.f«×¡O:.åËâ4e þn>áŸù‡"]ŽÎE!c`V ZŠ¢ä6nÐtyEÓ&F¨Wâ"|ˆ8H6|>ñ¬+œ (y~I—Cû™Íg–2ÆÝ Hqi.¢U&g“™È®@M¡¥:æ8pSÊÇyL12øMSQ*øÒ—ƒWˆŸ¨ ± ÎØ«“d1eòÖŤT« ïýسOÝ®4Äñ G, ³­†ÐÊ9‡YIŸI®ªø:ƒ—þyÊ¢w¶„ /Y}jÊôÁË6UKÞmªµ\|JÎV=7f=_›𶥄 Tç3_›ËupÌ”¦6W;Um UŸ%¿677_[µ´hlݦ¶v;WBÃánµÂ¨¶‘þßó¿ïÜt(·êYnLzeê<_.´kßzîMl€þòï}bå÷>ƒ§ÛR”r½¿õÁ×ûÿ—ÿýÞÿG¶>}z‚ë}àol}0™ôÿð¿íƒ@CõÀâk‡ˆœèF™ÿ'ÿ{}° ô!ìFj÷{YØ—Ðë¿ùßx_ïcüð‘Úzõ‡lú9»á!ÿ›ÿŽc„…¼1ĪùîÈ}Bëõ1¥ß”Žé}²ŒÊ1­ð82:}ÊÚõ1cïê‚È¿õaèÑWzä˜ý?üo £ °(@8îµ ´¹}æ\”©c²Ë)±MšQLës1}–9ʆ›³èc4H·©TLæR1kÓþ ®ü¡›—'ïs¥>ö% ”•ñ«³;ÜtsÒœæJ÷ësM!×)ì¡jOâjÓø´µ1mæ}ÉÓ¬@¹…RgçÚRëk‘·ü—W†e‰ycý¿üo}3¢ëUÖÑìƒâ΀„¯{ø¶V9(N×µÙ@ØÚêÞ·™;ßÿáCÊÚ/Œ|íC°¾ Ìõ¸t¥¬Aà ¾Q?Dh}÷=ùâµ\Ú¨¼º  ö¹g Ñ:SmëÃÊ5 Í¥m$œv…} 3åöÄô9ÌkãP\ªJØ@Õ¼ñ >cCnõ òŽýÞ&`R壬YZ*ºzÅJ:c|t«#6/ÅQY§ëÕlZ-åN¹A\‡*lœ 1ð@±Å=—6èžkÑÏL[·ºm¯‹P«Î.|=…x`߸e±¯5f=7@ðqïÃVí·Ç£^»Yp¯*ØØÕî1Åà|ºï£¿Þ7VlÝ› °ãrº~zí3N1ºh.÷åêáê\Fé|¯b¾B¤ì>—⺑¹–Ú=¼õvnÕº‡Sîܹ*«ÿۘϊ±wŽ› ߨ;êŸ@æòlv/Þ7o'7¯·À2ŠòÀˆ2¢€o÷F5/âõàé4WNuC¶?Áxã~Rá^*áAwb^ïAªâÁ}£—k–fn!¹c!¼ì!Bî!îdÁáòÂ4ßCÌ0|•ÛCôÏ­DË}Š_œQ½þ”Y{ÊŒ*±‡¹™‡Eª‡¹—{ÅŒ‡CaD複Փ†¦Aêš¾9š·Għ{Ya„ÔÉ#œÉÃbÜÃcÏC"Ì#uÎB“Ý}iÇÝÞÒü‹"Æß<ð×½Ü#‰MƒÒü{ÔƒpÖ£ºß½‰þxr¼{¼GÔŒ›¥ªû'—FL½NbÄØ·†5¼;Ÿ‡‹Ç„ŽÇ”­F·¿ZoŒ{˜žÇP²Æœ²›®†{”Æ$¥Ç’†ÆÞÿ1ÝO·Å!‹rVÍ7$ ó%I{dÓm•hu¼`7`¦ˆWRÓ\u¸)+&vaóM"5ÂÚˆŸ:M€‡2Óð‡ýsÎLÞRæ¤fiîC€™( ‘`ñ‰°ä›²ê%-rLj‰ž4CšÌHaL„KÂà§ãšOwió¢¼HÌO¤×HŽMb{ähKIK²6OÈ5ÂÜHxwå‘T±H‰vM~][bâ2qSš_™O¶¼0Rß°©ãwØHq’ðüÅðwõHãM…{sË sw¤ –p‹2÷ðˆ ù°÷O1ÞDm¿.ÚxÚ¶ù´mãiÛ¶mÛ¶mÛ¶mÛ¶Ýýïý~ó›ó`­¬¬•ì½³væTR©#ã¬Æ=’_]—ëVh’ßG:"[zú†ah…c8§S²ŒôDúIyF¯Yf§ñߣryå”ãö¸ŒŽŒòŒLŠÕ Ù·TV ÷½³”Ɖ¸ì©Ä>ç1-YdèìkÊùPA¦î^ÝoAªnÙ÷¢9ãínÈv·íá}9N˜éËæ9k“Pìl6  òa”Ù°¹M€ÔܹÑX²‹¬­tï~Î쉰Ô'ñÜG ƒ3‹àÒæÜ;Ì|ˆÈ|Ôœ­¶œÏ°<¨ÊüBŠ=¶ügÎðÎpÔÊœÏx Ï`°‹°ôõœ¸õÿôž…­™Ï®~餑…÷PEq¯ÞéV8Iv`iE\EÀö@<ŸEÿ.혨LÐ59É7¬ Š/Æóm=tKXm%*‹wÕ‹e/³×ÐK%c¤'=Q fBK4:£•?íé:­õ±K“ÛKÞ×Jä#K8J%ÄV\Km%ƒ-3“™3DË\.ýí+“C[²Ä¨¬¼7Ë€ÝËØ,dþˆšZ–{¼—a‡É”)—Nª–Çbû…WšFvÚ‚°­R=+Ž *Y•/K¦_+ò/½24ÍüÝ”èÈmË3+“È+¡2ÉÐÖ TUºm•¬a¼+¥—~ÍÐBîÎU}©UÐNÝTïUõ™ÕObU?¦U9ÐVãÐ5mÕI޳eë–¾…™eª–6kŸ5dbEkçù½–•1–µ••…Øk™‡Tez—µw9¬¥š5uªµ¯‘ž¨É¾i˜e£—V€Ïº¾°Zä÷°oOKˆ¨úGð:VrWÚÍúÒ×zD)?hœB\Ðj¬ªjd×QQt-K̯†ä¶’ ó¹ÈFRµb’©Ú”ËFúªFñ‰Æ]ɦ ìÆÔ³hQª&qO Aêf.n€ÛV*[%£W3¹Vs-fýÌØ¹pé­fY­1¯t<©!¯ˆ&°fp©f]» Ï")«+Ký*nRnKã®ÖãѪ÷V{ê6 (^CöX×* ˨¶¢Òš·?ÍöP¯v0ˆö쉦öúõztðü²5êvúñò8ˆÐ䫿ÉÊÈ´ÖŽz²N.«ζÚ_±Tx²\EñN¤ÓN:îêÎ ê JñÜÒw“ú¨ÆÍOÉ”²²³ò„oŽn3‹Ôp ÂŽ.¸Òn,˜ vþT‰4EÊþ‰ð¬Îi¯ŒÈ¬l« ‡"Ñ¢`Xõt¬”=¬nÛÔÈ«î(ÍŒ@URÖ{òÒUpF—niï/Uû>hKz–Áx{žÝ˜7.¥fÇ»Vì–—áÁdJtg¬D0Äum*·÷X…a—WfVåDߣ¦|³×@BÖ¶wÖNVV£ú@ô`õàßéÜëvîârxtÈ.›ôhùõÐ6 $ëZÜÞ¬ÊA„ꡱŠñ¤ï± žíAèév«¦ww™‘Ï^kñnàœH@T$£d@½§ib˜ôu¨ÿO÷ÑTíG¢bùÈ TXG¤]w·!Ϩ,n‹¸Tþ:óTôè?ð3ŽìåCãVëC{’£KdÃ,Ò½ÞÒ}:Ñîãááá!0m™–uH?M? tÄŠoFŽ_ÆÕ{ô„µ†[5¥ sì»ztó~$:kJÃwH×{¼‚yô§UþÄ`õX*µI•/ ?QëD‹/ž ÈÄ÷Ô4÷Ô¼÷ÔRwíûÔVµØföÔ™ïÌt÷àúLšïÜþìþÌÿ<ïì¾X®öLî„Ïê4x÷<ÌÿŒ9êp9~æ{{ž8 ­=I–‹ŒÝ‹¦;·Ì½Á¿ðõiÈ¡3 ÷¼ðŸE*®½ä-«È=×ÑM*f>wʽˆ§»hçºÊ¥;¦žºŒæ»ìÄ¿²»½‚ù¼Àö½ªÙ½®œ—Êø›ŒËöû6ÍΆè.ƒz/Dto0ew£vÏ to j/fWÝ`n…-/ÎjožäOl‘noÔ&oot¯4&®·s¯tï.àOßwª·¹§¿¹7¯²µ ô‰“ø à¿—@sWc›÷rª÷Áø1½÷¶2dgí¹78÷a·ü¡5²×ų)š-dÆ„yµ€Ë.ßKû©fzc „;dÀ9ÍÞ£NÖ“ûÇ}«í=6ÿ#ª\¹ýóŸ»[Þ¾‡QÛR‡©gnô'9úsVúßÖgå:#L„ }½KþWC½s…ÿÌÝ{þܵ1•}µÕ{5Î{Ï| ™8Óšºpîk·šsг G¼ù뵫úNK>íPwïJùÎŒ[?ÙÎnW¼$ñø!æ–@ÌæDÓ -/bލ~(B`Ñö´q;ñ˜ä××Õ¬¦ô¬(ð¦JÆ$8¶EÙ¥~ A¯’;¿flq¤¬y½_p¿ ÷Ýq`¸ÀÑ|(,,ÎIÊZ×O9‘ô}†;I.F*mAzIiy†q‚I¬9 °¥—|d‚B Î_^·FVZ·JFú€FæÐpÅôÌLixo}xœq+³tëÄäè~Ç¿±ÏÈ¡JÑüÍÍmU|H]ãZ—ÝàóWÇñðOäçÊíH'Ì“õáÍ®P8’ˆ¸”ðMJ‹àÕDè™vÌ2-&™x·Ñh]Âxc‘”V3â’µ1,®V ›ÚÅ ý@©Ž–÷‡« Q}(xH<Õ{c™’%cc(½ŸcÇñÁûrY_­Þ Ê—™rT#qYñ™BõP­Íá$5œ«BS¦ÑªåöÄÍ–¬Ï ¡6>mZ9ÓÌߣiØÁh<¹õ•ô›ÎÞdÚñ곫J]Úx>Oéq}*ÈB^%Wµó¬8gµŽy®ÔÆþ°ÉÝèòd‡í~mŠ0¹PÊQ®|}d*#Çûõ4¦ýî¡T;Ÿžª4áë‘¶0§/¤Æ¼2û"¸5—ä¶«[oسTÌ«˜ãóýf'»›˜³ýð U°¨DOR¬ÊŒ@Zm¬5Ï y(‹ôaˆô—öejŽ«r{–ûî}û$±m7į‘Üè_g$šw û†ËâCDû~Ê~\¨ç†vWTË„¢4IúqŒ$oKAaÓhzŠ÷˹áÛF”KnD¯ËX“XPÉ`…xÉ{¦–¦ò™LºlË«NŒ n'YÁôâa‰ªÃùÒÂØ}±Ù> §y†GaA™fØKZ­]屿"#²QåƒR $‹ &ˆÍJò:âJÂoEÅŒ¢g÷MÒÄix^*½OeM¥üdpâI‹ÏkD0Å{¡:KÖWD!§D¿æ&¿Ç‰É‚jT,u•Ì•d›¸—Ö -‰žåås’+1$»Ú#ÎBXž:׫Ê-»«ýe´pøêÉd1º±¿qÈJĉºˆ­nöN;´ã­¯¢+«*ò#Vj4‹â!ÿ9IÛ=ôˆ³ûìq¼i¨øÄr[„YtL½è{yèÆ[™$ðJµvʨµh´ç‘ KñµÊ´z£oî—d,¸ìùVòm¨Mf· YÕÞípöfŸ jËï°žTwͪÚÔÈJ_¦×ò¹d5qJgݤl3ÏÛhyv~ Å0?ˆ"½¿ÀôþŒ ¡?Ó:þ0ÙÀëCŽºuþ¡bP©Ö‡èi%Ÿ žÄjÞúÃë.X—p%ŸŽ‚õûB_8„¬ù‡Ÿ½s²>Ú pP&„·hŒ•¼€) Ú8oGçMtK!D¤Î^¬ŸÇñŸn!„¿Û¢è|x°>ŠYºðÇ;½Qñ>жe©|”)ržÌ¬y§}”’ )̵Û·¨T„‹-.îÏpÜ‹úˆòbœO–xGºøÚ£ŸÍö_’—´Q²û„Tá<’;1 f¼ÉEÇÆŸ ƒ_5¶Éª4'7<|ò¡Ž)5°{”©“û ‰©û^&†”Rª·ŽÎ­Æ†/”Ò×/‰^}Ê‹Œ ¼†¶H1s$¹LecÓ¦ŠO °Æ~$o2ö¡JÙG$géͨV³ðYÅý;c³¶\ŠîNgÜ °Áóf»DågedwKdBòIA^ ¥j¿^’q-3&ðRHbp tOþ= M¢MdÆXоàB´–AÁ­eyôðqîÏEÔWª„DT™¨h<“êo±’õ,%cR¥ÔôfQ Ù˜†X¤‚ñ2:,Jy#{m×r”ÅJEµÐœ0ô”|F*áàIfßÑüŠ8l+5- •7‡HGÖ+è^I¼ÂJÿçL+-<ñ¥ %“¢ª*°V¾®q¤h° ÈÖȰ@}j+nkÃŒÓ5ÓüoK•j"íUªÜÚä¢Ì”5G6ð ånV—`^q\œú*ÓUñŸcšéÁd@ÛZ°sK>-¾n‰ÛR3©Ë¿Ük­*å Vtḛ ¢Æ„æëï…p–Ë|ÆTPE;3-m!ñT¯^ [)`–’=ß4•ÆŠÑz¸þÐû8Ec‹@bÔªËæ2‡ ÒáçÊ?H,}”\ôž 8̇èݵWV~Ì„š´k{›_˜Ö>÷®'c­œoåÈ„ ^+(oƒß]äþ@´cˆË´!:׊ ^s{…i=DŠËzõ ©í9®g¡WDŠIæÇQŽ®V‘|àRÍ›w©¸ÈHúªu°4#ʈÆxÆ#XjŽ’´;…¢ª-™4ÞY³°åFSÛ˜êi kÙØŽ=âÔ÷ë¼E™ o÷ªÈsÖAÆ®7{œýj‚‚F§ÖŽ¥UwÏPžÐ¦9î×F¡ð¨>;p랎EÑÀü¢aXRéÔ4E)\4iMï›ÄüM‰=Íu´ÌÆLS‘µ„¢t–úæT梣–÷¥ D»/ iUWªâ]§ë« ä&éÚ—×ÜÓuóì5Ý4¶EË®&tî´óUÚ,uå]Y¼‰Þ­Œ2Ü‹oôŸß›€ŠiBGÞ5òTøºçÌXðó5Ž[ÄôoêcAÙ ¶¿ÞÛæ[®så]ó¥SW³ålS?ŒéŽgÖøÂ*Zâ`×̽æË?…Íqäû†0L{!e†#+‡Ý+¨û@C•Øëo¯­Œ•·T>kFÈÐSq|g¾yhët]þ ›ƒ–Í™­}g—™u-ãN¿x]ÂbœÍs(v’jípÆ—AõœÜ1+[MA-kÅÛÚER¾çÀµ}ÌÇÑ d¥Jè­ÂJgE›€ewÎÊíòýçÎÓcOƒÖ}¤—=\Žç€U[)˯q-z­ôðEÐc¾v‡ =¬údmУÏà“oWu¶"ø¹È¯†˜Ö½¦'½Ôvø"‹ÖCl*ç%ùVÜægv<îå5šëÙ/W~'%þí½ç=ŽÐ{9±ërú«ôaá{—S7·ªØû4B¨ÿ×"'s4öò¥“ÍEøºjÂOMâÿE™’ }…aþ¾ŽãGî賓Z#H|rëĽû6?ôýHñuq“-çƒ6ÿhý“’ü÷éÔÏçØ>ÆÛ›ô/°0ÔGÜÄoÜ¿ÝDy3ÀhùEú/œ´Úó¿ñ#tž¤i’èÈjAœï>,š.›)¼âþêþë'BMbabBï^žA&A2kAŒæþ!/AúÍo/f*’"’áÞ—­~šm2jšVúà"Ze~½È~FgÏ©î×cFbþÕ)~¸âšHâAR¥ÇeÄC£“C¼ÇÅÄ#p“ëŹ Ä£y’¢¶Å™Äã¤ca'0€%£ãx$ %R¬ã’­gúéÕpÞÝ#Çâž, YÍã™,#9ßãÙÙõyÙIi¸’ƒñEÞq¹¸ƒÅÊÈÅÖ’3ê“zÁ“‰°’4Å’”’ÕÎQeÛ’˜ “ÌÏ‚u¨Qµ¸Rþ S&‚BMÂäUÍC-ŪÞvÞSgæRÒÅSÓó’ÝÎÛR‹SVŠR}ÏT]4£<’ýÊä<ÒîçR£Þ9ÃÆå#ÞÒåÓ•EÓ}óRÓÁÓÖÝ5òÛÓõóÒóÓxSÝ] Ç“ã<<2]ƒ K=sÆ2­ÑR”ÏÊå‹°Ý[×ÐṃN"YÛ3ù…À(dxf½e•E†epÆ¿ä÷­eY€þpð6þŽNËöVÿg\ÃU²ìÖñlX{ÀñtèÝ´,#‰\Ä|À¡rÁª\©ñ\_óìûtÀÓ5ßiñÜãóìÓ0ð¬à>® Zúë[îWZîÇzÄfúOÏ,+‡,pÊ”·µ<¨ˆì‹ìI±xËü$,Ð1lÊ11 ¯ªŒšŽº†f Ò±0"ï,ÜÉæŒÞŽþÁáËÂÙ2âáB=¬"‰Œ"©Ž"™"yO˜ÿÉà e"U"õŒ"ÍŽ"í"Ý"=œž#­¯³Œ‹ŽkŽâåþ sõÖÊüs°,q‹OïŒߎÿÒ¿%€œ² ž²­²0¯²ˆŒ²¨Ž²˜²8«2dÎPM,-dˆü•·¢ì²Ü²üb ‚äŠì_)Î6Ìy5õ•]ȹ¯ôìåÛŒ…|½}8EÕœ Äefa¨8USU3ŸUØCÆòeö‘>s™9áxUóUÛU;U¡Õ]%å.ûUg5—›¨žþ• ÊÙ#Ë5—5¯545’ón¼«ýÒ+/œjÞxê´êè6jþ¬ª\Æ…X+àž¬êá1ê&>¼òp*ëÀ)ÝÊ)óìåë?êñp>> ’=*V2ùÒ% 26%6T´ôŒÌ¬™ 6™¹dVÇŸ51¸Mq<ÍZÍB^Í"ÍbÍÍRÍ2åh¼Ñl4ªÍjžÍÚ˜ÍÚÍ:8­z<­Z­F^­&M÷ÍV­¶˜…<­Ž­ÎœÂ–­î­ž”`Ëp°¾­~8í” ü{­¡-%<íí8^m¢{`{‘ÑíÉuwíñí“jíٛ퀑íÍät+&,<^ Ž9žm+Ö$A4—H•0òuÜÅì…̃è=0]D*ÝÖÝ-Ý “}E€Š®/cÆîÈnU>N§„nåÄîeÊîÕ ðˆî¦‹î³ˆÚv XÕÆî+«ÞÂŒÎå‰î[ÎÞkŽîcÌÞeÈÞóžwˆ®Ô°ÞÅÊÞC‹îWŽ0î#­>OÿÝgÏ÷AªuíEfÿ§GÿdFÿcf/‰S^TbT2W¹V ¨txV|M׌RoöcÿZÅàÁGauyöÀLGoGF÷o}Vÿ[eŸÀT±öLT¿êBÏöP×À&Xá´ä`ÉÅzv«uá ΀‚s`b8§­@»Ki JnÄJ¶N£kÄîkÄסőkÄakÄÕkÄŠ~D?PTÍõƒ¡(ÔºÓí Gcñ¥r¥;O¦Ò™­v§;šÎæòCˆ}y6.æË•ªtg:[®Öê¦reºš‚·@aÏwgºÚîöúƒ`d»ÛŽÆ“¨õf»;žÎ拤òd{:_®Ö›P0œ»ºÀv€`ƒ è{y>žN—Šôêzy¿Þn†òèûø~¾^ŸŽöêúø`È}tñýp²ðý@h6È|àí‡)MóƒLÓòƒP\×óƒ0ÂPó@ˆ£)‰á¥å‡‘4­ç‡Q ‘å‰ !G1§åG±<¯çEö$³˜ãqÂèÇ âdÆö‚¹æG‰ò¢”'ÉʪÚñd¾f'©Ú®'i¼l;Iú©§æ¥¸©¢2ÚLÑâ‡)W'¶²]O9·aÜF=ðò:-³óG€%Ëñ?Ér§°&)œ#1(ã}ÁÏÊ3ÓoSÏ‹2©²ÓYèÅ!·YeQ¯9yÅ¢k—™Õ…ž•Õ!‹—ÛUõÄn%­¦š§¥©ÐTu•\‘W9…§‡cËëì.|jòæå[ª³–5>óìMÓ-êF×ÇŽŠÖC:­ Ä­Ô,º–õU®ª–.­‹ÜèJ)Û–ëØ¯š:.n›ÞSßL“ò^$Kú®tmò¦€Kh†ÖKÁîºö]Û­Û%Ik‡‘]ðkÛ1\1˜²â$Øú±a¬ïú +óžSOšº `­©º„þÙéš2kßýÒòsÃmÛIꪋú&mÇáÛÂn‡ayþÎçÉÅYØÆJ¬9®ç%&·–yZ-æžbšÖµ§]o’ls/¸ízcWÍ×>ò-†Ü/bÇj\?\ê=³:+×-œ²ìè)¿²o«Ø‡2„ÛÆf!±—#$y­k'mÇàx•óî>±óÐŒ¨®ýŒNÔ{G°þWÕÖôÛµ‘ÍÇúðd ÷®²™íûv£‘nûiÖ×zÇj÷8ûº£ŸlóàôaÍöc;¿÷z?(Âãr“ŸV×ü£'ÁãÄ(3Ýç?ûn­6-¯÷y‚ú®gVú/×ó¶’nó˪ΥwHb­tÆï©÷æMÀÓäÞ,@¤„ Á\ H?¯¾ŒO×áÞ›´Hÿ'<øß7Tµ Ká<$óqšî­óÁŒîJO1b˜öÒ/ÉHëu=m(†¶ Â[ãËÏE˜EÒAF¼xÅ!Ïç²ÁKé“ꃧD÷<ÍAuxE2BC™8=}[*2D¹{m|”ì,Â6º÷¬}û0(Ö}ºŸlŒ÷ó!Î_8Ï}\û1žÃs£CH”«1!Þ»˜ä¯Ä„„fcbzw1óÄ„ŒgcRþw1…ĤBfcr9O •ÒĤJg£y¢'¢Ä”æfb’Ow Û„!é~Zÿ¶Y¿Š¬$ ñÒÿ2µ˜r=eÌG—²”IÌXj>e®O—²µMÌØz>eíÖqŒIÌ:f2gwa™‚ˆÏÞ+rE—ñœIÌyn>å¾O—ñ½MÈ9‚Wæ\Þbù¸ I5åAÊ” bL·r= Š”ÙB?H"á—C…"qxþN.Äz>ÂUˆ}Ê”&¥cô¹œ²,¦v>—0ÄTH y.ºìB¥ßâ¦CW0/å~*gèÿ9’ “TNKev€’Œ‰(B© A¼ªPDƒŸ©TÅòTŒF© Ì‰W+hZiäZ®„Ì'Óœ™\mm*h TÒ9QnÛdÍ5—¹b[ó\ëý\ɼhFUßÃÊéÃ^ÍòÆ3ÓE˜Zï8U»fR_n®O295¼JW›°k-ïŸ%pŠ%õîÚ»6¥ß˜YÊMi+ç\Ò”ÊJLr·¬ÖUñV™ÚMi%.¶òÉ_çKom5ž¢wÑÖ:¾(ûÙ'T›57-ŠäÛ¶ ÉØKÇjj]g.6‚Só±Hoj»vÒL×:Uiëµ,\¢><19Ñ«ÜãÆê»RÚÇ O-xô1ò.;öyâ/ØFŠ6Ü¥gíR²O.ïì²á`b `÷£:¹äiÔ]§,o«û‘ QßÇö3gÖÌF/Ñf«¾ìðuÐ3Ý:`¦Ê¹Œ¦Â³â‰ ·ò¢ôœ†nónªÎÅÉ';Ÿ½â@©E36ÆÒ'ï …§Ö…r¯fˆ(w¥¤ÏVo×VMLìÞ¥®¦ê,«¯ÛΖòØkkàìlÕ_ÍìžÑ›9©«[pµÁNÝWÖ¤5K©®êÐûz*I=¯ºÀ«A–̦YœZÿ!8{õÒ̺µÐFß [|ù”­æVí[í›ü„N®YòÎg«iï×½ÿÜòNkª£€V/H­iß4¤}HoÒN6î‚ ÅϽ9Ö†·Ãm} •u¬€ò¡&Õû˜°Æ}^W“©€'“|ÎrZoV!X¬½®ìÄ½Ö PX¹½í â>—ÄùT†îs®ýò¥Â«c‡ðs.^÷6çÂuê$æu,çÙiÓku†{¡ñk*?&ûÚ˜õsmî°:ÀérŽ,½kŠú¹ôÛfÕçf÷¸s냷§n¯Ð­Îzÿ¡w¦U,ãä/YQî=¾«|nC9Û‹ïû¶tG‡s-céÝü8ÎêSvYéÁÁk ÖÆ¤¼@œþŠYÒcñC•EßûMû\Ï­ÛœôêÛÊ[­Ûé¹Í.þh´VEÃýÍçûI×ÊÇ€Ùµ —¹àÖÌúd›×] Á%¼Þ8jf¤áySËÇö€¥ì— q9¡÷ÓuÆNõ • øíM§ç?²ÆÊì† õÓ2ñ ,ó-,svuæpæHRõ½H“)WAÂôüt³š's„e ñ) HóeŠCOYBNBéÕB\C5Ì-­ÛåÜ(díϽ8MÄV¬<ÒåƒÖe|8ÃÒÍ=ÀÁ‚ÂUÃáÀ"֓ÉD"àßÂP‰¥ÌÃÍ1r8dækÁ²éÁEá^”2Që:츣!Œ/;¢Ž#ËÎåÓÕ]Æ"AÉ¢ˆG¢VŽ£šÔ£R"©Õ­yÖú×'Ö¥§0£×åÛÔ£¹)ÜPW£R¢W9dõÞ£aD¢¹ÖiÆÆõ7Ö•ê9b7Çcv(bfE].9´—9ôN9”ƒ0ãNšcÎ×åv9T…ž [ÕtŸ!UtÅ£LâÞÆµoÖí®Å­QÜ:Ý5ËU€%âA5â¿“ãÔÕ óVãS^â5Xã@&ä‘%^Qc 5Ì\‹BG€>¦Ç!щ?T!1ÍtÎDpšã]Îãé:4ÖÛ“¬0“Þ…s[ã8"mKåL±â2 PÉÛ¬I±ªIñÌ®žFÉ&-ÉÂ%‰ê22Éçxô³ÀP,wu-Ê8¾ 3,‹äý;QŸ\Qš;³ŒTœˆ´ÃæÔéóÔG’äf»‰75oN¥é0( ›‹´ãv,e•‹pë”ôºò´—á´¨‰ôˆTÚôùb÷µd˜Ô 9³ŒŒLNù KÅ Üu·”’ŒÄ† 9õˆÌ (õl(çZTÖ¬à‹,èäV,*È´x³4|ÖLú‘ìÈìp‰lë´,(rÊ ¦“ìIÈœ©‰œ)–ìÅéX,çŸõì]ä3(Å#È܃ iÿ»I¬ì gÆSGÎu†ôÛFî„q,F^³FžVIáEÖGE V8iþß’|PL Éô]LG|0r-HòÀ4X´Nƒ¼0ÐÂpD åÏŠÀ=u[¨ˆ|\‘ŒÕÌÌBœÉlle"Íì2 äÒè•|±‰FOˆI%Ï¢‘” ì\¤Måõ‹ˆ›Z‚E<’9^f9£ES¬ÅI”2ÊT9"’jbÐ j›ª:Øùª“Å2\…ŘoEJØÅT¥»m™ƒ­nÔ'yoÏ%¦"ex©Ö‘YÆØ©Æ“¸Š•Ú®Ðñî™eæÙ,ž¶~•¥’Ð2•þZŽ–r1žeQØ9ÁšåÌ›.Uí%”ŒÒ”ÍÄ4O¯ÍŒöö¬»q…$ªò¼IéŠË´#‹Ê“ˆâÜI-™J[¨túôòªMM‹ª¶ËÒMð2h,Q¬‰ ø“ªÇòòjìJ®ÊN ¯ôŠ´ŒâfèÊiª¢À gµÖ̺ŠÜeO-¢ˆj݈ªƒDŠ@Êšg’Z¾’Úºõ´µÈ‡2Ë2êO…kËôÉȼ;ªÊû‘²öpªfGssèòÊô/è:uŠ:Œ‰¸óͽɪ=:F‰ZI³l8j9ä­ÚªÌâJc‰ºƒöl„)Í? ¨ !¢fdÕ ðÒd^ýØi7jT<(BMD&q\^qWÚì^•\kM¯•€:ˆ¨ŠÍÌÒÀ¤†Ï‚’÷fy«ÈòÊrá¨X~+Q‘‰ŠÔuE­)Ã-õ–íóa¥4M/-/C=ÈVƒ«â”³ x”ô|óÖŒg­6®˯hC«hN(eG˜¿­ ±©º]‘Êq¬“-Mw¿F®vÈ/‡Aè—Õf~ÌvDó~ó¶L­6¾©ÖvÓûŒöê–v0Èöh«f¯l˜1I¯ŽÈ.Ÿ:«Î’®ÖYÍB>l3­ˆzîή­€«rB³bœ._©îZî.Ï«Žá5ÇnÊ®2‘ÎÞ«nŠðÎ~œŽ’•ΫE­ ­.ÓͲpîîm­î¯î…®Ö•­Ö0êôd@V—ÂJW6XOß[Ïeû;]YçudŸÿ[W†eO™Ë­— OÀ«ó_KT©|¶ë«Vû)8wq}{TÔ¶JìVzE•?ŽÛ]Õ@º—\Œ[¿×¿«Þ˜ç­$鶯äA*ÜAI«þ‰‰¾§­jEüï½à*ôî¾ã¯Á¹¡ÖC\¹"lƒIQýäß2•Ö‚4 û[­*jÃGÔ2ÌÚ®Lß#r²°›JÞ#K½ k½ÜN&É^ÕÃt.£æ<Ó0¾L¢¼\ÑÜQ©Ž·x»‡9kÐa»ëxû±? o1[ËÞ²=\wp3k2{ø¶'ê7·ofªö¿mâx:@»k ±»—>û§$ u¼ú0º“p±;²û € ü9†)ÒÚ¬ÙpÙí¸ŸÔxŒ£ïCÙíwÚIб£_ž~2¸ýÍŸmðÚÃícñv]aÝ1rÀ>›ìƶÏpµ®BíÌÑó ÞÁ¿Þc±í!MßÚŸ-p†=*Ý]iu€¼Ÿ¢–ïÈ´ÌžŠïÖ:ÎYĉi®ŸïوωRµ¶“í´hì2ëì©áíHÐî²~²¹íj>ï Mæ"U÷Buvr+j¸þç0ÀSžjcßtÛ·I˜){@Ÿvd•…}õµsùL2³ {ø²îÔïÛ¼u{…—=m{=¸L„ik£»Z¦Kb®µŸ®ç” _ê½Y°¾©bf¤­Ýꓽ=Ù½I¨"©¾>~Þ¹½•ÃÚë‘&c#㻘ÝeY»†øª4ƹ;$ÙÞ•z÷ÍYŽcv¸oè^CÊÍÞÖ™¹R¼P5rAÜuž8zÿߥ? ý¦ Ü©ôY?pTÉ#G_ý•›}· ¸KäÈ^\­c ªq¥Ù{´ó8÷Ø.ÐÝ×=-}<мDÜÔüÜ æòè5­Eð´d?_õ>gI?›š?G55çn+÷MöÕ˺>à‰ÜQï¼l;·0÷ÕkÉí˜öeèõùk¼*á<ÛüzžæV!̽¸Ø½ÙÉåö¥Aô½yVÞ¯H„ùÝEKÒ¿Ë|¾ühÜ7c½GÒôÂè4;|Äu9T•XåÙbÿÖvÅöÜ*Å}däùgN^ñÏçùÕŒßÆ†éÅ×ÌUÏáëAV_¶Û¹zÛ~&Ê „ĽaU÷¬°~ÉÀ^rš?ÚvNGÓ}O‰|³[¿BqÖÏ ñq|wû}²lL”» PÞ ëêÎÊ•£vÝAý™ȯÅEŽÚ…”4Õ¨«žÝ_ ȘïéZÔ]xÎÊÄi?Éý^ñ‡!ê³hbÝÏ {3|ƒ4°ÈýWþ—W‚=Õ¬“‰{Í­÷ÍO_ž"ˆB,Îà!䟩S'}Ål˜ÖÀe j[u²8„0&ŒS£¹+WO޲.{oݾ³77<hX rÁŠÂ~zؘ¿¢üñìiAymãÓÓÜ3²sróóˆÃÿ„‡–**©Diÿ Ô‰KOvL1+lãÍjïêî饮- ”+šˆõ÷jdHòjé[&ìX^[ßð)š-,Ÿ<Ò]œe˜÷]Øl[½¹|`CÝS<ÜÖªGk`»a«"Æ:e[—@ã„Â?À>Ñé¶9¨A9a•‹¶ƒxÑC-1Â…’(U›ÜÀòD|”Æÿ<£‰‰§.âU«:–À%ó‡Àß° Iˆø`0×Vn4G1…l/–Æ›Gå«µØæ,%f §‡›^·%œ.‰);¿ÿ™ˆ§]«Ö>™]1x†T4bLK=újUæù{у†vk0<Àï•¡|'ÝûY š-f/\ÅG~º¼C¯µS5þL¼\%_Ù}ö(7øÈæUê³NM³à!AιÃÍz9AÅdæéÃÊֺђbfCuMTšPcG[õzo9‘f‡áéeèÝY,1âpØær»înv2³kô@¾Ÿ™£wˆª$g›Ê&z²ðñºx€Í gz/åà{…âgÜßì¢î¾ä¥†>ÿ×{ùå/pH“\œö+Ì‚” ±?Ô누8‡Â(Ê/Éó0ªÍ0|URh”@ Æ"º~<$Š›ôM"b(*t*6º m0@$Çâˆ@’²Ì„Œçt¤@OPm"IäÑ‘ØÄü4î(Åö¢ßȸ“‹úD`P½8Ìò Þ$Ã×xMA¯@d5Ûؼ$M-qí¤ ½ «L)xÁÂ2ˆ¬§ öýT+6ý\.q—­° -uâÈ8¡úí\ÄE (ZéÐÇ3”S²Š)˜B"iVQ M~!Ñ RPQƒ»Ñ W­2ñËWQ7—ééðqÎIR~ aÕ´õ"LÝlP•‰Ÿr²H-wòroÕ²-siÔ4RûË®“ÛÜ“¬ãmóþºcχ±¡K]¬–æ “;°Ãq£&éß„÷¢ôW×`/ø+æy BwjQ{5¥]9¸dF“±5íÈOõãO¤Hê’3<Ç¿§{÷!ôdc ™Ñ’ÓdÿÚÓìkywF>esìôÐq‹ÿP2er¼´Ó 2ð^]¶*Tø°RJ­ÌÛɸ+yuÖÏšÔü¹À+¶z®Æc=,‡ó^v½_¯]1z»­B¶Kø–Iúr5"YöHðrÛ]càþ7 ¿Öã]¬Ú½-BxÀÿfDp«faR¿O¢¨éŸS¼y\€øÕ8v‡ä]77´vþu5Œz=¿2ü~¹'©áÿÙõÚ›}…‹™éqG’¬“y8ÍQ»u‹‚Bûr¹²`Öuj\Ëe;‡Ðqù©"ßû~â>ò=¸›‚Ûkz¨ø¼£Hå4ÄqXí>É«?Hg\L:õÌ 9þâ1¨ÿ eè+G€;ždDåÿ±Jéß_‘Ç’žO âEðµW*˜P› …B& þ¼Ð‡fœ„²#)…Ô© á0ExDA§³Ÿ”:¨"§™õB‡1,@ô Y3@p;àœŠ· q…é]~%C>©Ö¢¬ò]Þb´°Œ¬ª,øX}!¶«³…w4È ç€Í…ráÇjYá;ü»£eøcioø/£O9,Þƒåg’À>QÑ”x©þ…‰øL™5X‘\¨ÃHYTBæAÁÓ—f®Š¯B´|ç¼~;‘r$xÕ\:ÍUù¤Šbb eÂѧYúDYzq²%#A(EŠ‹•“Ê‘)å Û”$êÛB¶Ip’æ/sÖÅä€÷ÖªÙMåGŠá‰|Öª;%ÀhŽ84ÐïÆ’“ÝbÖfµŠêR’ûcOO*&oGt^Ž5"æ„”9Y¨ÑZ-dÊ«ÀÚ˜wísö5b•–^çÚM ;y̑蕥’óùrz˜Íçç¦ ±à+}ÎqIñBµj+†ã ¢X•†6úDYaKµÒˆ:€q-•¦FŒ–†Å&k¥QÕ7ògV^ˆc+Kõ°Õ2Å:œ¢j«]½2#Å’+囼m\ÆVãJˤ ̶_žxYøa¤¥ „ŽbÖ“ö¦‘ZßÎkçK÷}T­÷©ÄÎçÆKïûT­ïëÄÎMä1u ¥˜7ÞÂâ~¯•‡^À¬:âi’­žM¿¾ñºEˆ­›ÑUë[y=#68\¤ò C¸ÝìÂ$ b¡ƒU&}}€âÀEpT½1&ëV!—+¸˜kmÜO½1™•É86­#ty7#õð”tÀ™Ñ>€r-pX œ)#¬Ñ^B\ïÖ<ÑhÛ”ýwxúPà){×”/šsŽ:à)à”k+¿D)"'‘7N,[üÙ¸B€“wÏHôhÛUù³Ùu´ž•EÆœ|h¤Š.áÛ 3­s LU¢àô%ܳ²ÐPaÑcqõê­0Úåü³þºÍ´Ô‡ŽXfpe!„Ñõg¬÷"säÚÜtîï"df3|¹L”Ô•ÁÆFlX͈“9†wVå*¿ñ˜ì-d,ø÷= ŸoyÒóNæ)³hÛ’J rJ(ÿÉãþ›ŠÏc^#Ѳ¯ñsˆ• 2ž¡%ä¢É•‹í‹YõT-Nl5¬Ñ…Ðõƒ-NqÝéÖñüEåk3¤–­_ñçÆÑ-ÖL×íI0§!"»møŸ«[º…ÓöÔ ü­(W®Jê=nÔ_”ѹõJý.ãmYƒö¡Ù;þ½oÿ;_ŽBúÆG§ŽoI&½Ïhü±à_ïp!§^" 7“wîk9° xÞ;EVžÃ6ƒwNã–·Þ:‡znžë=MïG@õú¶óiÿ]¡Ì“6—'ø.×î©þµãûºKâuÞŽÕÒæ·é|ø[Èï3Ìå³ovqű0 Äb±©÷œÇJ° ¡·âžŸÐ?ïåÿß4vï¯e8¿M:¿Ì?ˆnþ³.Æ×¬ÎÓÌÞ~…ø yàÛý„ïðmE]TÈËל¨ßÀ ÉÉ?OÌnýÔžápÙDòŽ ýèYxÉp<ñÇØÃpDÛ Ýžå $Òƒý}[ üo^-e‚ËA”Å‚>üQ½4ÇüÓûƒhé9ô„°MÌÿjAÁ8gsª ±%£¡7s¤• ƒpw aØ Ù­„0ø—ƒÛ¡„”£á½#ŠòlQ8¥‡±°E­…чý…è“`¤xÿ] ÈLðXƒ ñðtBŽ„BJÓˆ¤6 Þ~•á³ ëpõ÷¸‹¨Ó(ñ¤"÷kfŒèâ‚ióW8?Áj7ó0Œ}ûë]3kÑ$š9§êŒXt§·j‚&1ÇƒÊ Ö½]‰r•J Š®>eÉ"‚îxÅ;s»(Úew›ôwO†šU0èt‹Ù! ‰“°9à žŒ‹š ù£ŠcO-_û²Ðøƒ/ñ y<µžŠzRDoÿ“ý“ä<Æ*P*(ŒÍ õ¼† ÝÒ’H î?Iì÷á‘Øø‡ )ö ó<,$ñ–1«["Н{H0}Ypes v2À[XÅiâÕKò?ÛËp/K¶x%®„<åG´d($ú? zØÉé‘–îÊðyx\w©Ô)A¢)9–©°ôîü)/k©nI³ëIE`g)—æ)FJ!Üd‰”SlBÓ¶¤G»EǼ§Q×Á&²EG’Ó&­EÍ–£qæ¥+¥RÿdUg÷W ‚ÿ¬8[¬X–¤îˆQˆŠu¸r~‘мJ|¦ªÔÒŠŽ Œ^ «¾Éj«ãªN<ÐÀ*«2¶ÒjH¿b”ÀßeÊ?"´u˜hkݸåûЈ¶:Šv&TÂ6*|ß!óiF$>%1î¤ÿNH'Qé¨oB¾¶×~Ô‰•bZò*×LZ¦¡ÿ(;¹ŒØ[•ø¨ÏG« d®‚!ƲbËÕpp'(°žiÿ„øÝPzžä­'‰ˆ4˜‘Jãnf©©ÃB4Þ‡–‡Å7f*£F4üIW†ö5–6â_znÖCB3fä35rxM0”Rt;7KlÖ‹JFŠ[6 áªjæ5ã7Aà–ô*k–kд ·Â™4Qb„9wÚÒT4eÌ+’lØCC*òF´AB{f@Û_‚KoJjEªºÀ¶ºUú^#ÑÊúL´«]ÖÂ)¶7†EêFL¶&IÕÂû·»Y·âº$—³;[tTÔRTCuŽ47:d:º¥tb“ȳ!ÖZtúL4V z€7Í#Æjtt·vÖÑøhŠwβiÖý·uvRb6œ7ê/ÚSúèÈÞ».‹ÛG6’ *º™6ʵõjã7[ ™ÚWh{êXº"/ê!KÒºÑ.š/¼°. ã9dÏ*:ñ˜d÷Ö…/°ü!0™opƒ5”÷#3Cqæ32 «ÚxC¯RúLx òýó)@R°tZ·!{ÙÉzû"rëûÉóû±»M)›Í%š_œíˆ!ŽKÊ«<µ7ºËY:_Dº)ó¸ÈlP(¾d‹=œK7òË3'&ø¶ú„çÓ!:©ò¸ºÇKº õĤ`2|HÙƒ‹—ٜÑ&C#}Â[}ÐØ½;ÖÃûpü#ÒÒƒ˜ý@’¡`£i#,2£iŠ}vž}À´&"ìâA²ùï“èÁ"«<ת·+/ï2ß1¶ï!ÊÏ¥Å1ž¯± ë1ïî¡°¨Vˆ¢˜Ã¾Œ®º¬/6ß+8ÿ¨ÅRÆôaØû¬¨1‘ê1Ôê"4x›uüÉj̱fî13`ŸåVlUÕæÞÄ3ßDåõX ü¤Ù¤kÓÄ\æ”úØdW—ß”"UOVWöTqVme?8èèéD§¢h÷Å’[{€Wí©„"Ìe9Z‡Ý› œÜ,Ù<—Ú¢õìUäÔváì[¤ÔsVùSåÜ;õìPÆŒst’Øw%¿:”n/¬ôl&¥þ£$A2èÌÈå¼ìæLYá@Þ`àM7¥ØsÎÅc°sŽVµ¢YÌ? ”{Ô©¾*ñX~?zž°{Ê'jTÜ“hWÈôڟગÈF™kš\Ë6ð}Þq=k‘®;ú!Sñ÷é¢Rý2ÓÆ²àò°âeajŸ±`™ojY`jRøª)‰‹!eÕbk‘}Jžc›™ÀÐP¼ _oi€oiHgih#@N›ÙgjUs¾dbÆÐµ&|’: Õz;¬úzÊUÅÐ9+Po7SK1Jf8f«þeÝ®m5 o݆oÝ~Ëøëi³k³‘k³Y{óêh¡>iõoe©•ñ¦_ÃdÊ×jdÇ2òõf €yd‹°ãZ{\kaaÛ h<ø¦6ÅÛW[§ÁTJ½&|=+?/­e OgÚ¿ E?÷Í­>eÊ>ÁkiÚ6êðæ¿Ún9§ÞRÛ:TÚÁûÞ%ÆÞ%åÞîÚYnMrÉ@Ø·ovP¹ç®š÷dª7û¦7©÷:X°o.·¹±Ö8›ö;=v’¥Zø(ÂvGN!n ×ì÷Kçdí%ltäno¡ÏB@õlþ[û6>ÌZÚ—Û—£ÛóéèÑ:lŒ\“®þò=¢¿âç;Ì:ö'“JºšÐN˜Â:†›>pΞÐ"=±;ÅŒÞitÛ³)8a:UÃߤ¶8×lž®~ We\žösjôì~ÐëPùÓN·© œDÅÌbZŸvež%ôž$Ëœºeï䔞G²¤Þeá¤êœ˜ÓÌ1èSœM4Ý^0!’ÅÏÎyÊ*-hí§(ÓµÌbá÷dIõö´ÿÓÓÎ¥é®1ÉDZ)ˆ­yü\8rºš!_] :ÞÁ»ZظzÔ/¨›¡šÓ7#ŒÉÄA›¤b\^ Ÿ¿²½€†œ©Å¡ñ º‘‘;г;H;º"̾á3?[ˆ9캖â¹>ï“øØ)B‡9ä9‡uº%[ÔúYãú™âÑ3àCì!³˜¨å¹ÈV¼¤Ã¿‰˜¬ñMÞ‰LØUæ,÷îRÕØS¦Ö büœ5åܵúÈ­Ï\*ÁÝ£Ù…ø Ûª²Æ2Ö?OßË@œ9ÌVRï2 ==RcÝß_߀Ô>ÃÆâ—Õ(áç5+>eœœLŽ™ eñoãÐ[oEõDrïÜòæêÝðÃ-ÍnR?bË>Ь¼6?(ÀÝ.] ’>Iêt?É[?鿊~5½Æ*0¾ø¤¿zõ¼öT¼;$¨ÚÐÓÂíò”&ù³X(×j¾Ϟ¾,!¼ÛüTµÓ\†üh=ïŠfó2ÛK£¥'¾Ã̧ÖÖìÕ>¼7õ\…ç¶ÄlÕ'PÆîÄz |&~ï÷ê.C+™Ù?¦OŸ`ÜKußzP€ Ÿ”;íÁŒ¡ÐCϳµÖ™½¶ã±4Ó @%Âo€ÒÛÕoᜢÀæÇÊI±ý[\ª3§­Â¯£Ñïu§$ã¢%ý¬çÓ-¿+î>{b–G%õV!8ü>wh!"PÈp€ÀšSÏ…I–b5’ Õ’f—î9; ¾—p–nmÜyÛSöáÿô•0Y9—¾hkyûû;±‰I²YÄ‹DÙED:$Åúzª„¤&¥¦eeRؙنˆ8‹+q1Ï̮Э`­s««0mhmk´ )î€þ^Þ[Ö2N×H=®4ì927ë›gc3î/²-žØ0ÚÙ§8><Öè4ë _?¿ƒ?"| øzB½üSÍdEÕ-Càq›Ù\¿Ý‹uBC!“$Šß…ð ¥»xÇ#5‡ma¤ÖÚêÈ$“PÀ°Ön5Eå¸J‘çöÑ2™¸²—Õî PÜlô8ÚÄue¥Ù‡×÷Ùk¨})RšÐ´êÊùÒ!òP”:“ÎW²õ†Ü߯ÈÏi*…jDx^gíÇlEWè™ËøÊ ¶ÚUìUÅ]Æ×½ýKhTÞÕSçL5zEÌhaÓws¹©”m“SFu]ãÜ­-'ÑWù3¹ÊY«Ê«åG•8+Ÿ¼››¢§“mpwü+ç–1B¼ö·*T»ÛoÎçóÅ2¥:Û®×ëÍ+"ˆ¯Î1 ·æµÍ[>ê Ç'6{µ½'7 EÕ ˆi쇟)”õ®¼_w?BŸ7akïÆ]•0Ì5rÅï6}˜ß¬—e}óa,vIÜKò ÔJ‚p>ÆÐï¦3½ƒ–Cý(êxL#etâäBœgñ#°Î$ü8ÂiÌcÐÛ@#Ü…2Â>@;A,)ç½Fx±@ fI’\ ¸ „R`ÄZÄ?ŽåH(`L£4]ÄÃtôp¬2FÕÀ×ÄXðÒ,ûE(RL?6£bu* Ü$TOqèÀIÀFnQÔ„C‘(§e9yÖ 6e¾•ã%TÁf¤¾B„g^eEe'UU ÄEVžkgy5ö:V¶ujdk ž/4WI߬5iAhØid©+MN?27MCð¶ç©wZeA“—uó‚¤R©Æreúµ±±1÷ik£ëU ÁvæY‹{6Œig^í”-Ñþ ›eæ¤&#} B)}òÛ¡ThW T]Ÿ ¢tqÎ&ÌÕÀ>6]ßq*Ùè@¨¹à¶¶&LYUjzæW5Øß`é£q5÷‡^h˜¢†2½öΧJâûï'W´öiÇ|¦_ÇZ­­{ïÞwÇhF†Cüu»Ž€tì’‚ë ›¡IËbWeµË,,RÛ:sUå ËZj‹—Â<´Û‰Ë+¡þåL”§ØzK¸÷¯Ð ½D›gÈ×Pîe¯;¬Ÿ™ùë>L©üG¸·'çiþ9 þ;o‹GÞÝÁ!L¢.×?æ`ê}Ï+ÿÚ%fîàþ%_Á#‡¾¤¥ `.(¤8À˽²yìÙb|›,ð“ aÞÏÕ¼˜Ð9¹Ç·ÀDV)Ø›ôO÷ùž”Ý—r»]ûGv¿œ3PÿïÑYϦ'¼ÂêÕì 2·ñ9‰Oc¦n ‡ÿ¤ý@À[¿4(¨yÈ=©Œ ¸1ˆ@5á[=>Û{¯xôµö2‘ ÷@+^qPÜÁÍñï°Îú_LxÑPráœ[TÏ“zö€t¢"ûÀtÙ‚ÐÃM˜L|_à2cb8B\(töŒúCq\Qý;PžÄ‡üq6Ê[DW¬¿XSý¨»t.Ô‡x›¥â#¼þ`±FŽÄªm¢ô¦ýqt‡ADCDcÓwô®ÆêYªã¾åàɆ‰M€ÄÇ÷¯[Ë‹AèÑåÅ£(¶v6.Á'åõÎIcØ8éɪX$¨ï§Ð3˜ì˯µï F±®‘ÿŒ &ÐÔ­Jˆ@9¥s1Aé^ÚÒº+›0S$ÍE•2iÅOß—Çe¶q3NòóÙeÄÆÞyC‚’9߯ËIröxŒ Û¥Wš„ŽòÍøo*@,wS`($û僡Qÿì?盓•§kÍ?aÕ> ®É‹‹&ÄÃâ01aÏ…zî°KË“¤¬ÍÀ‡Ú´IUÚoA®žå)kD‡äµVd¥#—9×Nfë%‚‘ùDµÂ5Fn›[6ÈZ{ÃleD+¿âãy(µ|¥Î\•8¦KÙ(Ýci ¹Y© ’URâѨÿSÄùi4«§%P‡¼Pj;¡çlʇ´nYi éÒµÕŒ•TRÆÞµY@åÖqå| ý¹©.ÎÞ´t2mÅÏ¡QAœØnöCgâþ55«}êC鉆²^šÜ˜rQË{Dù¢¹”ßë‹Q±×5ÝVóBJo ò=ÜÒ§Öq*À^°ǸÎ>ÝòW¾i@·ÁX®ív8¬GH“ȶ¡íH„œŽG»Ñ®¤ß驯'¦À°¾“ ž:ø&K­zTÜÞ ZßùžC“Ïw.ÜŒkø€9òKÁT[BX¤<.»z|Ab’¹IÆ)k«Ú4]rÛZ?“SâÞæ½ÁÐç6m¬:èb©†Rõ1L†ôäš"u¢ÈêQø:ÄÌ6±}ëý1ãü¬]Õe6ôúHŠÃ§½‚ðÁ{€¶¡“tê\ZÍ ]N›ù[· Ì`k%lé¬]ŸV:Vo9[ε\SJ]1evI9ÉÔ’›YÞóqi=œi„ÊZo糪 á²vÅÉnmï…9/T‡ödeAÝU5½ÊÀ~›j3`­eº4kÜ¢ŒÉ5o¹íFÉ>1Û3n‡rÄ¡eÐåem[§Ñ|áìÌVàÛEKjýˆ‰ôÝÓòÂßjëèâ]ñã&ÞçÒÙ*Â{ð5S=xÀ4bÿg߀ù­Iÿw¤¥á6qt)Þ•³„ß.‚|å(vß}ªëQ¢_{qdFk.@ô)·”'œšŸ%•²›góÔ¾ÿƒ„QÓŒ}‹×Žî3$Aèv[ÞÛd‰^ûßçaÑ•êÎ7'•õcµ¬Ì&”ž_E™¼˜ãäྣ6„¥sþMˆÞ­‰¾%f®’Dþ/> ßú¡Òû>ZÍèë(Do:22²’L9!7Q,ÚÊ!x¡ÄA Q$G®» ÑñEàA\l0ST €eKýã"o² ¿‚~9Šš[ð9AôUC$,l@Š›‘)žA`«ƒÓˆŽ8x𛢠¤¹O$8€·«?XH´Gœ\GxIÆWˆý¸Oâjð«an˜b²O‘jHJ¥™§ c™ÿφ˜W]Ï3 ÔpŠ)˜V‘ȵäàÞE…ž <“ø½€8oÇ„X ¯ˆš8"G‘æÖpoÞP¯¡0w¤ncoP£hõ¯²Gym>ƒê_æ[]âVCrâ¿(†Ä®‚ó3FsÓúÓ+„¼§F¿íB:܇뙣pÿ•é2Á8VûÇ[Ä'Háù¡“ù¹Qÿ$°d$G(¤4Æ,$!Ù¸è"ÅÙ2ÅCÊÇiƸ¢³Y¢àŠ˜®$’£‘’¥GùÝ…hžª˜±b\Çÿ˜ŽQð‹ë³ÚGŽe‰Á® %vW. Àã¦?Hd'HW ViJºIªIL(ñXJ®yJÂÍOT[‹°âÕ&±UÙ"ßÅ2¹‘f°µ_H`c@HÝ1•¦Jø^§õNe:JX¨4"3¾~¤ôÇæhKË PÁ? tùN)Ñ5n'|„K^zH)ˆMMU¸ Hð)¶Ÿwr’,NùìKBšÉuJóñ­ZK5 ±|N©'L“stl›¦ƒ†Ú† ÈœE×D‹ætkÊ“쾸¥ëvtÄŒ"äöÐDÚºÚŸ¦AòeȲfŽªýÆ‚‚h"øn½âüÉf.…fªFל v‹ê>g`ÁeÒ@é–˜äDðžtf/Ý`6·g±‰Þ³g6‡øšf èçP~àg2Èš>ªƒÝgP ÉAgŽ®F*Ž!|ûgæ“!dÚ~›ˆ$¤!KþçnT#á‰ç¡¶ÇGڄߌçÚš¤1ØÁºä²¦g®³»1«æ¼Æç'ýX¨>Ù7!(ÿÌâ -Òy‰2@¤)ST/’±ÉXáÍÄ×c’>åÓà/¸ÏýÓC+4ÍÂ:NˆkNßåÅ™¦hb „ã,ŸÈ^« Ѓàóù¹© ÛóÙ—ú¯”ÈéÙ BË`ÓÍ`ôÊ¢Èt`iJñÊüÓÓ"ÝË8<Ë|ßÑhrWCªrbb]‹¿ò‰+¡••‡9¥Ä—ðò”©›©µT5«ãåŠTðʳµ+•u³z@êð¨«=/cT¹CUªUà•L¥PÍ¢UͲÔ-ªU-ºÔ­¦U­¶Ômž)€Š”QKÖ“¶ÔªŽ\êÎÒªÎZê®V«¾ø‹ôØ‹¦NêžÕªž]êÞÓªÞ[jªê’€ðëøê~tšüê2šAºêA6š!¾ê!QͰlõ°*͈nõˆ)ͨmõ¨+͘oõX(Íxlõx*Íü5Ã4uµOU=¸e÷ õtoõô(ÍÌlõÌ*Íìnõì)ÍÜmõÜ+Í< zœv¾fv¿f‘Œv‰®f‰vùÓ:¿±º¢´:Vò¼Æ÷Š»ªÏµfÍ—v=´fýs$/’rÅ4hg*Ö¢žíl½—v{´f{–¶¥õ†Î»ê烺ᤲþhm‘v¼vžî~hïò_»&­Ê%drÈ:ݱhí±¬í:»2-ÕyMËmà7í‰/Ýyhí¹eÕÙ.íf&RkÎI,ÝUkíUoíæ"eÝ­ÿiåVy«ÎÅ`í-à–î.Òöÿò‚®6”¯ÆöŸþ‘Œ~›~ïðòï2]?+}ÊâÂUÝ‹.ýëæÕ2uUmÝþE©)ýGjÝGfÕ‰¢Í®.m‘éM[î@^fõwîõ÷*ýÏnÝÏ)=à¶ðJÿ ¨û¿ÿ¥_qµ<-¼Eã«£¥¯egøÃ_ÿGŒL®L\¯ÜŒaÿþóâî#´2Î~¿w <¢¨ºŒ¦®¦¶¯vŒ®È¾$‘þ¬^êëßü/"DCoi "FCÛk=ëP”¿ (üŒ¨YÔˆ Œhì [¢Œèf èF"hˆˆýí¶ ˜qŒ,æ ¿ j ¬:F»ä2F™–ܹF¼=F|­;œ/3ü·‚¼:¼ßB¦“Û†d&bòÇ+ðFböÆ¿jµ |$rëLL¤zLdeUDsrdnä[U¤~qŽ™ÖŽ¸ILTeL­¡TmÔUÙ}4s(õL´{ŽÔY‰LôoÈëôÌdWÐMŒKL}õL  ÌôMÌìÌ,üM,b̬rM¬jÌl(N©øÌìUL©ÎŒaMqÌœiMœyÌ\eM\uÌÜmMÜ}̪4ùÄé[…aü,šÚº,—UÂ&éÇuº¨¦Íð)× rê¶­q6Ú{+·&»£ëQ³5º ,<Ú]ë7Þê}!Ò§+úZ›.éx ¢²—Á,æ<É ‹l@ÙªgyZZîÅ‚DY,sŸ\Ûíç•B[‹6Ce~Úœ£Ò%òV˶_•Nãí åxøJ–ý1ø«çû¾[ŒÎã)ènÆ{s–>ÖûS Ÿmc™Û·ýuÄKã!&‹¦ûÑ÷oHEo‘]/guA-ËÏ;¨Qß,›§s/?Ìʸx?8©t»þòýÅÖ…¡aßdîQ/xw'£”÷ ŒÞW{[O£N÷Èà.ÔïsB—Í‘&/¤ ²æµá> dÚà‹Å¼÷œz”è»@­B-ü}bJêqgñŠœ²ðVÅcUàÉuD…¢aöqJ% ö}¤zµÊS¸ê‡ w•¦µF3^K—Z{?Qm°¿†1_»Ê “··äÆÖ ˆ(Ê|\ãQruóŠ9öe>YšÈÚ¸uH sN§è+;0F…êq«ëFµÒW]ÞG´y•”M¼(ŠF½jò\žPK"ÊÁω“M8J—.º3åM}2.&ÖóâäLD8v&ÈÉ'›~mçå1-hã<\ÀôpŽ& Û4Œšòç\8ßAÉe•‰×C¸ A2ùYQ…òÍ­^µeÒ©"ºŒ¦yR´¥Q¡.[ŠØCMto!Q+ЈŒÅª]N/÷.´ïûh4<‚ ›%Ó]Úôþ1½Ö¿ÑÎO CJ±` ŽKª–p*±˜˜ù\¬Ã2Z(ž(W­‚ÓuÁO®É'ÿ‚j³÷n=¾f蔾³tÉŽ©xs£ìÀž“×f&nuú`'û“+W‘Æ÷²²ìµë¨tÒ´XëùR¥Vm&9Ì-ÕRVi£á<ïITƒZmS¥Ýþb!V ,JE`Ô4ÌhšB¯d}`¢þ_‰ŒÁhÁÈmb´]N•1¹ÔhÄK€ËŠ‚îËåœ=«bXx´‘‹Ò:kˆjH«†µþßãõa&Rnûˆk3©­ÿ²ÄµÏØhk&¥>¿¢XÀÕÚ‡Imà ª¶ËÔ:¦MmŸr½u4ÐÖ:ʤtXLÊ:×gj]Û¦vÞHʺöáêÜ¡¾„ÄŒO»3ê<—¦v_:Ûzî}꼤ö>6Ûzß{ê|Ÿ¦ö«Éàêý!¾ÑÜþÛGݲÆý>0´b‰Gøß–¸–øâÏö!B@}¸ô!RVû0_C¤Òô!ZWûƒoC´‘ôÖVû(GoÃvmÔÁÿ°Ä™NÖa£ãtPQž>$¤M“© ™¸4&—Y3B¨LB·7¦„Sý—%NT)˜(ýcÚ\¶)síZâb›²Ï¤Ï¸¶>fÝg›rÿ§%Μ,2¨Z`­dÊ@¶¹0ƒO Ö/ Ü\L.s!ù?,qÍ¥ì>gFXóêtôP˜ÿe‰Ód7ÊÅÕᘹTíú/K\Kµí9õš …&_s€ÜÌ•.ù§CyJ*ˆbO²Î×:|Oü̵)w×Rþ®£‚`Œ¹žÖצ(¸+d‘ 5AíçÆ~«3(¶üº;áö¹ì[“•Œyô†æ2dk÷ÙÏ‘i jèPl£ÒòÌOÖ×¶=À­BÖ^Úks²Í4µ¹Jæ.”û»_Áæ:jñÆ0¥cSî©Ø÷,Æìûˆ0Ï©…Ïâܳ A®c,zÝ‹|ea:@r‚î^bÍû”ác eÑ6´îûì}-ëÍ;@)ò*kzo–³‰·×¢”úçâ…Pþ._ëç pÎrÑù첩·£zþµqjs‰¤Í}¥aöµµ‰òpi‰T¡[VªÉêSøT×µé&é iãç.“LRGÐûªëç>ü7¡§!òŽGôÞel‰÷c\+w‚à9¿£ûjØ ðT †SŒü·mʨóñ@´çB­Ïl€zô,?®çÚai3#!ávÁЧDå×z÷ ðFÜf‚µÆ÷uˆÃ?Târ£Ø­[ú;×kçúœ'÷ÃÚÕ»>ÌßûÚ6·éÍŸ_Ç—Wgý¥÷Ý¢ÌzÝ1x û°àù}ÿ²ñýàÿý”¤ìþ»=÷ pCœ":Ïšùá‰ùýq÷7Kõjó¬ùףݫyBš›½`¸¢¸û¿§¡~²["¬àŸ3îžaO˜Ia¨›¡q¸’šûAŸÛ¬¥Ñ•Ñc1p1©±¸±¥q´q­ñ¼ñaÿ;7$ÂD cfH tt l –4wÅzwÙx P¡l5hr}¶9 Ö~Il ´óWQ½ÆÊL3ÑdCU7µ0¦Ñ?7ÕÅ4›T su‹B ûAk€´wslrDê ÷0 · ?( ÷47‹7‹ƒŒ°EˆY7½n51O·áŠ)‘P‹0e ³Ì˜[rH݃‡;…;Cz—rD”•{5œ‡§ˆF´pDµ¥FÜF݈ZÏtRDÚ¥FÕ›FwŽ[z›£úŽGÚŸF¥G/rÄ,[¤¥Ûgb ˜1+-ŠG7¶‡¯¸[WˆKmDϽG¤Ç^¶Çº¦zÜŒÚZcŠê DÛ§Gï®›ŽŸ[~ŒÇú·F‹,Dg„FÏ¿Çø–ºMœº™½†‡Ç¿‡‡ŒÇ[›Æ›–Æ#MÄÍ™FFR$X–&`^Ä#v$@}$X¤&4¨'š—&z$Bi$s&ÂK˜Ñz$’DÄ,–ÚC¶EØ+Iu˜%x¶ÆUŸ&ñlxŽÞÆž©GY„“'½s$ÈfXˆ8e+’#Þ“å9ÃÕ°"”=â£9’¨±’y+ܤ°Rþt$€w¤P^$Èd¤Œ¸§ª^$Ò{¤˜JDÂF¤ÚO$ëU$Ê[¤éa¥Õ§Éu¤¬<ÚÞ¾F©%y@F¹·§GWhzx$è[Ę [TaÆ»°Å«|¤~¤fl¤9b¥g]¸™GDr¦ g$(b¥Çae´žgXw¤z]¤Vbe•w¤QC%xwÄ7V¤u^¤åj¤µudPfçI$@TdZ¤sf·T$ÿ CeðúU??ÍšO®Þˆâ ±ÈpÍ üHÍúÈ ËÈtÝHiáÌÊÞHõ”HÍÄʽÊÈ9çÈòïÈåLèºd^d¤µCå\ä}QæpfZLd{fvoä:cæ;^dç:=¼ûˆ«Å5«çTu¸=ZØ'Eøœœçìi¤ÎTä¢m¤}äAbbl&“ofüVä?dJæÕwä¾m¤HdäWd]ÒzÀb§­f¤n5Sæ G&SWæÃgš(©a,bùV‡åÌR”àC%±ÅZ,¤ƒ'ïä¶~d¶—UP–ÂXÃršl~iD)C§*sæ:s–ò]–8z–ÂAç±q•¾I”}S–Òe–f[FÛYûD¸Šc b— –˜—¤œÆÕ–•¤–Ôg„Ýf„óS•M¤XZä•'». ¡+ã;óýCÒÒ< «%+ 5+s#ó =Rk.³Œ<ªZ¨ªê:«n#ªê3‹Î+ª2 Ëá(«"ó ØÝ‰O‹ÅÎl´Ì=m4+(#­<+-CK¸Ws´"Ít2‹jDK†=£L,j=+½63—&ÍnË=KËç<=V¨jc-­$kMÉ*’$*RÉJt4ëÂÂÍ:ëþZÖ©Påxš™¥×*c—TÕ%¢O“5¬FÖŒÖ=zšýHÖã5¸¶Õ^c¿×Ga7Ä\Ö,C7 Z`àVÖœLÖ2ѹh`ê.U›<[ë¯'«‘?QëÓ¹¶Ì„`Š0§<´L’]C3ØI•H ²QÕO›¹_íÙ MªT‰}\U¤‰l\-9Ð-žšfêQÉšÜVÄY¡ry5‚YìU9tY~)5ž£ÍLYS«m¥šP™Å¥™ù*ÔÅFY-êÕ}ŸÁ4‰É¹“m múm}íŸþU’…Q­Q8-ZÍ£M™gMÓžw–“­@1é0û±í ¢Ín8Mlñ­–Y¨Z™"“eæ[ÙÓ-‘R­ÚÕ¸‰œe¹J V©]ý[Y¡V¹#[eùQÝŸ¶Ý,жV]YâžäZ> [5‰­½;^9NQfï–ØR‹èÝŠ"‹Ê ¿ÌzsË<ˆË>ì²lÏ2k¬2Wɦ²ŽÒÐɾY©DØêx˜þ­~Iè–3ËþÉDžHëÒ/ ¹ÎÎê³ÞZÑA‹¯ò‡ªª¤êzïÐ>PÏ,ª¨žÝÌ~0®þ~­²#ìJÉÈ¢Cî"½ö¾mîrªÌ¡Y©¡aÉü<6ï«Ë!5Û“®P›*Ë‹.O2+èîFÓ® Î> ˆ6zÜrÐï¾³þ¡©ž¬«ÌØÈœ•Ã8¦šðÌö­âV#¶Õ—r¬³mæóo h“©£›]ò›ElLãizÂ|†‚0û:*`Ǧ&1¼‹O²¤Çܳ×Äs×°µÍ¿Ç"§¶<¾K¯y9.ؘi£cöAbN³lö-gxuÛþíì oÍ¿2ÎøÐ®ñWïòTóxW A¯PÍL_NFÿl:ÔìúòUxOÕÎ;mìúH¥†Ô®$Ô„êòž>‰•ÔÏ®µs²éZÇ0é&óoOß.4 SiŽÿôÑÚ,VíΔÆ:­ñÔOÓŒ̶â kåNƒ]jN›ößžÕ\Vó­Ò.'bÓp]é—Í}·oÃeWŠ/Õ³]änpÞ\¤íÌ\—øìoóݾOï%ÃYTšO7…Þ˜àíoÉÞÚ©^ÛÐŽÂçšÚÄúãêÎÜ÷^'d;,âí›Ýdý\ÝÚÞ}áß•çÖ<ÕvÛÞ›J­ÑÌN¤j­!æõ_žcÈöhæÜÍé>`Õ= Ö-kù¬4Â?®O?Xå\^ÍíÞ®éÞOøÞ[“ÝmݬîÀu\Wg è¬=dkx†ätDö¤’d/Ze{bd} ;’}©[xéÛ?oÇþÝâ>Èì&´g;ýêŽT’Ý“JßoÞ.Ðåí[ë<=ïÞGBèÖ¦lmgg¥ÚÐ÷hw¯…íîŽù&QÒêÏÛ+)™ÔÈ—é§<\@¦R¸‚²\[¢Fšž³º¦¤TU¬@µ¡¥A»M¨»¡x4¦A¸±´›rd°f¾ª¡uf¦ß¤©¯¯¿mc´`âŒ(ÁíÊÂËÅ?Í3õH.êÆöù1˜äåóëãÇÉwó>·ü#©Ìä`ˆzË\l8ø«‡ðkQ`þPˆnEbx½Âˆ”çìx^?Õ/ Fyû}δ'EŽ=Zm¡CÀÉîò‰¹=¬dn«œJq>S,S*ÀeK©,t&<¨á6v,™¢©1J|E½^o8–H»uƒ´,,ls…>ú/GæS8|ú"•Ìbïñæê~¿_NP1G鬒;'ÈC'òmB7Ú Lé¶])Ÿ¬"@0³ƒé|¾P,)”¥¥~ÅÕ‹áÎù¼ez®Þ t¹2InŠ›Û Êa:µi-[ø+ ’á@°mÁתFÂá¥hî1ҔѾª$ 4òƒå*-˜IÛ$Íçóå€$6Qç7€4mÏdöÇÉMØt]“f\4gƒn˜ÒAݵ]~O)YìAY†®6»LÛq ®}Gh1=Ÿc®bÈ úü:NEF±ºU %é”Ì éAnc-Òš –óžN7œÂ?M{ç!gÙ'eVS±c |OiÆÏ ‚èsó? XÀÙñ &é' ý¤ù,»,”D0íÁå@ðÞe™ÚQņŠ4›Ç‡Äw"X'ÞéËnE:EóÛ!à„lcP2)R‚jæé«CaªÇç9µP‘ú"Fâæ…“k”EP²•”)C7cîî]šÃ7²,à½Yj7£!".×í¸…ík¡h$gv´=³,ëqÀ)Z€Áï¥ðÖ@~ɹ¹‹s5.ÅÏû®+;e°AKlT‹ ç1¿¤ã£XbäØi;[ÕËõqÓå—ð>¸ÖÌÍÕóÕåó–Ã/Ëóíý‹òûõ§ û¸Ú^ j˜7: ǬYÖú“k4餢¶^àOÈmq@2,Õ¥”§PfYyyHô&nqæof ®,%µ[G..ƒY„ ™é‡Ñ|·â:;Þ#¨?pvB­'[ûó´#â¢"‚÷“@k F—9—ZÔ5&ò£_ÉÄ ¹ì¥XC† ; SU|@Õ>*Z¯ 'x”Zÿܘ–¥óÉ0›Ž2Ä÷/'lÖv‚ ëŽ#">ï÷!X{r0é`pZdñåüÄÔÊý:£H*Õ™Üçq‰É@©œoõqžúü`˜$ýïL²œc1ÝjAYiª¥z²±5G&ã3ËÌ!6AKõ…zT…ÌFˆÔø°½¤Â,¦ñ°g¡k´#â²Ö@#äícJf VeÊÅÈïÌv[‹)‡hƒáDt±ÓºÚFù–X6 •Ö'ÿÊÜtÅ}ŽîTYqìp‹KGÐOöé“€× ˆ1ÿ|j.øqUÁÔ·Ùäç´?£‰AQ©Ý¸ £ÕfT‘þ#Ù~É‚B‚¢(¨ -ý¥uˆTB-MýPDbºbÑ$® Ÿ׬úgWyr¤Ñä4R‚xhÝánì¦Xð«<œy¿µI/>B&šL1–ä¾óÑÊ¥Mß§b¤áµîÌÕTÏæâô¨¢¹\×ٶ‹´:³ÞTÒÆÒ;måŠ1J©ÆáU$'hÜ£¾ØqÇqþ¨ý“ …¢Oñ« `5G8Ë“C¤š…PÕ´bìŒÚÔUÇÒÖ ¸æM‹ƒ’z¨,•b3}ŸN )bIk@á§5ÄFçºM¢ æ<&‘Ó%ätááƒð!åiOš´Ó@C\ˆ5ó»èã¾[†ÝæÒíhƒ_ñý㎠":|(Ú\QW_ÃsYÁ+iJ5Œn± Om¡XÂÆ›m úw­ŒõîeJ?“¿nt%¹:©«;“¼¡òó•>IZå–‰çFÛR‡ÿ «´Äù(/vm{>Ÿ9,,\Úº@‚ >R–>ðš»·×£÷*58¤ZIG%c”Mú2½ “.tLl^ÅgA%ªÏ¼œC=ôi³ö®¾|Gt3œ,]  =Ï.zVªæR~Ë ·|ç,% ¹*+\J1[]F>Nûp+ù+´¤7ØáoÑ[…”Çä/U?|N®^J+:î}ésgHâc”Bw™üZ‹”ö P¡‘ ŸÕ(¬…J^ŠrÙ»xb¥ÝòCËuå¹&qÚù\€¨¥ ê±ÁÛQ…¼ K˜ÍßáßÖ‘ìDT±¿´dìfNí%Æ…¨RgÑÙÛÝé®è¥½`ÄÈØ{Ü—ª:˜e¤”,S’ ÿ\§›h-AÛ`ì[¹ ï4K¤nýññ½« ‚ƒBBÌ"eóû+ùïK{ÉÊçÌF¡ r*v+×»ÅÉ]!§!&×êˆÐȤÏ$Ò–+}@Ëy•ŸJy͵e``Vtï¹Ú­h]B8Ç:FÿRTv¯‰× ÏâLZNnö¾Ù‡’rôbp–ü’ƒ€5À"pN›qU_JìvQÖ!¡f]IJœÉnUƒ&®%¸å´“ [escR£”hèÑZŸpÃÓ·!Ö wøyÒ£× Õ¤soˆñu.æ÷”r“ZnZÎ:ó^4Rèk߸ñ@·Á-&VbŸ{VKô˜¾>50:ûR•™Òn7^ûÔ²Šõœ7âs3Üó‘§[Ï•RçÑø<£¸p0pUîLG,CÁág.Ñ,&oUdžlÓ ì‚dµ¯ÓÛª˜x² †b$6  &ú3F…Hãu©sê"÷rJãø¨èöÑF\:á¥àjþáýóW$þˆçó܃ e‚ ]ou"äö/>|n³4É$EaYËB€<¢:ûàÔ¦ˆú±W&œä*#±®ÕF±±^´KÒœý€Ždb¼ß¼ª4`t¯WbϽb“'wðÃȈDúX5§˜áôØú]÷ It†q÷ªØa¦Ò%¦‹†I8œ®ø)’÷‹Žˆ›‰jâ(g«1ʤ›ü·r1Kæ>ð-&v ¢­¬bì‰9æ±Få4 W3ˆ/ÙD½4BÃðç;€®Ð¥’*¿x¯_©ê²7ÙtEuùœäFsïKÐúq“úßâò3,7Dçƒ×H!rë #±Õq“ÒŽé°ŠæÉÀÃüÖÀàQ×¶ƒ"ö @¡M$7Ç„ÅæÅ°˜™´,XÛbÚ*”00¤·,\„/}æzš9¼Ë­Õ¿UˆFK‡4D˧¥5k ÜÀÄÒ›Í{0”Â6câî ^—j2„s¤gÑWoŒºû}¯aî !cv&u~Œ¿¬–þgSÌŒ¢åLbŸ ]PòÀ_ý°èüBf@î\Ù°Œ@A¹ïz `‹<νrôuÚ1É—VþÉU8A Á¸ºMÆÑå2;åªb¹p´ÆÍ;¥ýº½Äol<톳ã“Êzðe~ä2Êé8»]m´i.åOѦgeŠ-“ìCrøÝâ—%m)±ʽ*w¯ÆÝ²ë@ËV/è÷ŠhŽ»U>Ï,e§ü­Ï syf§£¥ªˆÄfHÂHb‡Ë Nwá+л–7ÖÕ`»¥-ú;¶ö—N·Rú 6;~£¹9¯<½Œ*˧.bD®-õvPGÛ8¶zîš/d£²F/ÖLWen0éïR6·€¹WC'|ë¥Wqͯ¢©›ê¥›bœoõO/ 1€¯œ&Ô~þë+Ø/ÛÝÄî óL’©ƒUÚCQ—+JíŒ ;fVkóY¤DZûíÇÝxg²üMj“÷ÔQg‚ûUC1¾»ïbðšÏÍçùôƒ·2£þE›ohÏTAi®~½åd}`·ß4çÒÞÒÖ=~mMYó L|ö¥ãóRkôSÀªäÊî»zvC-»á!ß]×j¸t UÝU…h^ûÒsdÑö˃ióÚÒ粓Mr£ö/ヌ¾¯W޳[ÃŽû™ÓåóF×x¦‘—Q (ž©Gد$ÏhB_ºÝ^ÆT©<çË¡SÒÆ$¿IßX|Ü]0 OXìv`ŸgKøm-8žÀoÊ÷úí\ËžåÃÉ«h‹aº[&¸ïÍdâ7«ŽÿñɾÅ[𳤈èP"õ4¢ôr²õfìQfíµŠ"`è/d€0_š8³ø°5|¶¸l¤µE·Íü >jìø‘òM¤jŒ8Ò‰SŸì•º_/° ¢ÜäÜòœÉ¼Üò>\=©½£hÙ#Ð"c m ªër¨ü±‹êââ32ð•ùjžLĸ¹´‹-EEY5 –ûP%:»ºû{¥¹êô]mL”ã<,3&œë‚ Ÿ.VÖPNB{×RÓ‚¯Ë»·;˜YèW÷Ùy—Wà‘OÚC²F—×íùÀÀélNkÈŒ×ìûKɸ¿‰UN6¨Q/=n"V’'‚鄚ņ­4,,vRêšk%™Ü|‰[€ÙÈÜæO.’MßìB}î”=ï%“ôØ%OÎæ_B“ Á:7ŸãK|2þn¹YÞæÓõGR¬1gå*u‘mýæªÚ¥›MKô~»y†s,Ÿë»õa¦Ãhsžf×ߢ£‡é–Í41 €®kn€ƒÅ#³ ¥¾*[ZïˆízÓ’„Ô_l†ý×Õ5GYw‡L#†%…DUöòûHÔæFxjÜFËÙa4• Bè¼bshI³¾8‰€û¡ NÈ“ªnÄ ,”i:«ÈÙ¢s˜ÊÛâãIY »·þ†i¶òø,~*ck®›ÏôÄÁ{GyÞÛB4…2¥‹y[æ@©FQ†Kn¶¯é߬bw9hOC&§|-(¡}xRB75Øb@§£%œží¤eUß6øewÜ8äQ“„¨@+µNÀ µí€R¥Šy-Y‘V’ü$kZ2qñgTÅ|&c l~m•±­±iX'; sû®Ä.ær¦Ó¥æ^ÝE碅hS×~ùÄ„-ÖÇ ýM½ü€—Xu¿ÃïæËnšžÆ´±‹öK«©P΃¾wšðZ¨ÖŽg©uÎYÚ>³ÖpÚa‚¬ÌÊÿa‘ÉnøE©šŽCýÈ€OHÊxŸß Ö€UŸAŒíÍx‰‰p3%.BOX`zòðÎ4“tMÖiŒÈç6@€•ã¡Î?ÔÞ$ƒNl¾€(|7‰6;­x„KizJÑ»É"K˜#!)¯‘ØUHúî51Xª‘Ñ•÷׈y€Ô SÔ¿¡ 㹞Àë±ê‚¥Q›Î@#3DÎW·È{ZKŒ¹Å™÷¦>ABO`£s%•땵îtfÑö yçx‡Î#‘³&ÞÑòˆ7F~J ‚MkãÕêûFfC{eN|”UŸ¸ÛJW³Ò^…%”Q³Áa¿ç²a¶Ä.q7-<°:¢RéâöÝýmïîíÅÓ÷u–µWðÑЛÀs(zQÞ±cQøµiV_•V°Mzˆë·SjRÅT]I[ÇÉsKš˜Å| šk+õ®¤cU¿}j•åÞS¤Í”‰âs± 7=þÀs•œ¹}°HõГ6ílÝÃÃÁØ÷>”@ÝŒ“—mÿ¥¾­’ëb´ŠvýeASêŽÚ"dnŠÿ¤ßBf)²ßÝqIö¨èW›–ž(mAÛ­á’óš„Õs¥ G¶×Öw_Gx¦Õw‘ì^1<±>)–}|GNº/ÇÇÂúÇÉž•ïPä¤õè«¿õoîæMÖß{”žtõ¾§"·Ô²î¼û¦ù¥-Tæ)u+»"ufgýЇߛ¥F ˜[æ8ïÁ…$`$°Ï(ó©1ÐE$}fKõ¾Yñ“~6ñC¢6õ-„öfâÃi·m sœ„¾ ccüë÷ánj€öf î—aÊ­jy‹hf*¬ï¤X8XQªÉ<îfñoÔD5U€ßÜÓ¬MÞŒ ÞÙÍ‹Ü û<§Ü&íßJ 1&-©{´°ß‹³ƒP _‰›åšsBj˜Þ?reÄeóq# F÷ÿ cOsêtWK‰P…fEí&iZW HªGÀ¿PòpëB©2â6·ÔÄØ&—ˆPç’a4Ù½PÍÎÖ+"ÌèþÖAÊiO2i~çZd©Þó"¶ç ‘«§âꢦ6.‡žëCÁ âl¼iÿhýÇ¢*Qü¢Îéµ(T8Y-ËÙ];1= £©”²Ôÿ›ˆ3 *€¯’Ò&ÛøÇ¬™;"(a|†Ô{…·E_,†S†;¿‘‚Φ‹ùý 9rG&*‰Æp4PŠÊIŽyKWä@öH ßãé;#Ž.j1@‰Žˆo?{&–nnSØVëy§AîˆʈïWä&ñÖ c† ¤CwK¸;w>ÅàkTÅ Pd $tJ$t˜'A‘zjX©óµû¿ç##¹¥ºG7!É'G:šªm“ñ¬ÚpA©«IÜp° nÄê&¹Å×ÇÓ-ÅCC$%R©Læ½>0NÚZ–"LesÍ´­>³Ä’M Yx¸L„7 O'L‰¥Š(\[ ;S$WÜóÑRòâ©a-á2>ò3à&ÜQ¹$v(Ó݃r{„C«[…Ćõª sCI\Ò³H5i: ô¸,Ä•?½ÉÝÂÔ/ 9 9"%WÖ䥢À<•ø7ã“>ì+Eì!á¡Ëè@Áà™ÅÒ‰qÛLÅ+åçi5ki;âÑ›>‚E™qжᲠ«‘ú\zÆHQ+ÂÉ ’i®!2yí2©\‘{¤‘£Ö§ZéÐ6Õ²Ùš¬¹™ÜùT)¼‘„î™Å\¹t˜bšåRB©ÒŸ:cTqé,q×éÈ~\*3ŸIÎ1ãѤ@~íÏ¥ed,ªð\Õ‹gáÕ£˜†@qT•Dâ.RqËíU m6½©`gˆª/¡Ö'\6±jn>©êmšEÈêdã‹åækÎI0?¸êgk™Äy¦>ëÑ´ÀÕ${2ú cß¡kѳp¾/ѹ+É`7Q“Ò­ Ê´M¢ #£Ъ ¶­0Gy.‹Áë‘[›ª×šØ·@f ¼q¬Ä`¿jè%›¥«žM«Á28š7BKVm³(=D8›e¹1é§´É8!ÑJãv#e¦ZVã›bÄ}®r†´ê8û­f@u¹ÄVD­¯ÐÕpVM.ÔH#—u2Ÿ´úK‘ÈüWzé¼a05Sé5ŽÍÐSmx^Æ~0íæ8áØ-o£YyÒ$áȨS'ƒí¶¯¹”VÍòWU’^ÌðY6$§LIéùïÆfD‘Q*­ÜìÅûÖ8]$ˆâõ5†UeAåÝSWÉœå€!«rÖ¿üT-«› !ŸífVÍ\M_Ñh!ó]°S!¿‘®\#]'=ÚZÝäqWVÑ7¨½‡YÌaŸŒËWµÉ½ÏÔ©3~·:ñ%¢©8û¾a`޹£O:ž¬ú¡4º`ûï¤{Í[Ᲊ²¼úr¤“D:Ñ­¶¾˜@ªûQµûñ¿•›¢úG»©§iiƒÏi†˜e†X­‡Ø£‡8«‡¸«Ût¯Œ¯²§ÌzýËÉpA-²aaýĺ­f"âÞß³¯>JF†ÊŒAD§‡éüûÿh4à]CIe$œ C¸ÈWÇ W7­i‚¨ãŽRûK~·Údëf§ìhuYÊ@¬iÆPN²±·G˜G½¦Ã²²Ë4¡úðRÆýJƵA첇¦£b¯5œ»Û\³Gç¶»xÿæghk£êºµ¶Yüw5ªwŸ³¸¶fö(æn©·á¤÷Gcö~TËköÈ—÷ëZ7ø ÷ HöçwiöW•ª­0s¤»nk$‡p‡‰àéf¶H¼æÉ·KsæézæÑ¯c`s®ö’À¶‰Žˆo¡ÔÝö!}7ywûw1éfE ð½‘n<±†v>hWEQNpg7þÑñ‹ûžHÚjíŸL Ï3êáG×îH¶™Ÿ°~ ïš/l¶OŽùb£méìððë𩘣ˆ`·ù4t7¡fÏ<Îz~v¨Ïá70 ÏkœÎÜ{{Îð£qvÏ3aÎÝ©O/ø´iì/Üc7*N5¶/òèìâ-E|­]Ô›ÕI—2¹½^×õ|½Â¾f øƒWmµB´µçý³×5´Wü2×h¬g÷k`= á¹Wét=™»—3·75x—ȲW;t¸ hçä»c=€››ÚŽ9¹Ñ…Ú„¥Üj-ŸÛ—îíÙ–R—$[ø…Ý¥#¹½Ë»·Y/ÅÞë ¯ªÊw×_øûCè³Ê‹Q_ŸÝø›ñœ3yÀè­ËOWRƒú›ñ¬„ߎߎEnÿ!ΣV&é/Ý ½=EŽ4°ýGîÆ§\3c_#‰ü+ýõ*Çù3 ‡KOµmyá±oêÿ ŠÐ€ò†û´X¹„„ð,8÷¢J/®wlÒøòÂ7xÿ¢÷jÈÿz¯;þ¸/%ŸFÀD´x±­{cÑ4Ò½5V(þ¸}Ôî~ ›cã¿3ë{¦ò ¼;õˆ{Oú]‰[û#>¼¾BþNün³;c%ÿQt×hp¤ùû¦mÿÖ#ð&úùÁ¿÷лzS,ÿEcóÑóQ3¤ÇÒÕ ù!BûÙ"ÿ=õ€íx¯¸CêÖsé¤?¸›MÔû.Ú{+¶} ™ø&9ÿæûúìçù^ÒûŠäÓBøñ DîCˆÝ‰ÛjwØ¿èx}íå|‰÷~ÑNZ=}äó×ïý’é†0 þ4$ù%5_µåUƒ->Gµe?РA¢skÊDÒ¦Š„ÈCÀ†M›´mW?C‡ŒÖ|$I±¬]=ºðô÷»¹ey±=I­^ Ðo~àð‰áÉÀöY…$5þ*©jêšZÚ:*Ñup‘ŽÌ¬°rñF‚7ƒÓ´ƒ‡»î~n_ÞÒñæPшʪè<`SÓ3k1…tL,lüœ&ô•ÁAlÙI\½Â¼h5ù¡¥Ñ£ªêšÚºúÞ|„šbä²4©‹ ƒòš0IŽè 1eÿ£[yY^#¨KºênQ*>e^G@&h¾L±„yUÓâ¤t¡•»‡R¢—káe Ï*¶zœ‡ƒ§Iý±VD¹Í¸¦J9ü!5÷¼eÀE|]¦qIõ„ã­ûÇ_èŠcÎ3s¶åW"›ð~OêÀR´.›®§Å¬‘Fk+*ñó‚Z®o2UúÖ­º=ˆZåŽÔ©( ¬úØëÖ¯Z…Mâì†Qþm+$±cG Pš6 \øá`HûL»íÆ)ºmªÛ1œKö"Ò'.Ú‘]Íï?Sô ?Žcò1ÒNB½‰e‹Ò}iOÕ‹ÜöÕ‚Ê;ŽÓ°Ò¦O3€¨&r]ƒšxÞ·w§³²jöãz|ƒ¨õÌi<‘mn)Z +ó'Þ»QŒò—-òÓ:…¯›(ËÍÙ‘æ£8aüŽã$eÝŽ“4£ÜŽÓ,§Ý޳<'>–-¢ ç¡ǺMýe*3{:Oke·½&§··é€¬ªy“q_É»®:¾ëàÑúI( ¹®Çúø÷løØ¡ ÿYÝ—‰3†ŸH±­I~۞؟Ç#=S/›ö®š.¸M˜A_ ’d7yt¥ÁbvO?a·û/ÌO\?zÓ9°ì>ÿ%ƒ?,2ÁGàj÷ïA5.óöZo2¯¡IW>ú:ˆyÁ0Àûõ\ôqRŠô’(e£±>€É;àóåïùˆ> º.ë9acED«ú>0 G?ÒmœÒ{P@¸œº†Cˆ‚w!jÉH?–íuÀYÔþgª"A%–uNkðø0:b(µÌ–â{¹Ð¤Ÿã´šŽÂE'R”§± œô .À¸ ò‚€p6ÎÏ|ºí”m)–6»Û@bDJŽ1Ék»ݦ¼ŽÜ1ŒÑد]m‘Î1Ñ-Œ”Kxy`1 ù÷¯EƵ-rÐÁ æŒ#ÄdMÄcÔýÓ%Ö)´}¬¸ 1Ѝ» RBì$n>ÒQú SVÝ4 –ûB|Qr¡˜æ˜‚‘"®p³}{«Cƒ1df؃½9–¢<Ö!8oWИÑe^Îõö0ïö:•]0CZ)„êìrt}Ê÷T 4‡BäÓ\j6¶9G;  >Iq$@„ÒrqRŒçñÛØ“jÔ)p$Úî8˜de8épë^fJê·\Aî{FPžÁbº–Q9‰¬ÚB.+2<›–òfBAÔPNçïb«É_µ Y©ÎÇL{ãå)ì¸ÛÒ²é<¥ÊN°6ô²rFÙ22›‹á C§Ò¿ÌÔzÍl-ø¨µ©ˆ4è_ØÊØ*U›ÖÇl[ªêŽÍu‰`r W(õèOGÊPÖAS-5çq–êŠæ¥±Íõ,9¶mªD¦¬†YäYk‘´Ëñ/F´jG§S5þñ­ÅJ¶öwÁ+G:é¿k‡ž“;X‚hä} —òí‹)Véщ‰À]ýÞeÂŒ0;ðrìÝð æÿ@C¶ýKc³¢ô‚5µ1ðW\Эÿ~П:Â48ñZzUÁ?ÚUêIß ­IËl&&C¤þ\é«•°ÆÄû³ìÔ°k|‚Ñê„øSíÞ¾ ÷û㌬#«áíú¢m­ðr:źÁY…‹[¥‹®K È)‡\¤âõ VíáRÙEHî356°ë>B¤xæ¤~8ò¨}鋬$Arã55L™Ò,Ò8nÞ±_bN–ÇuÒßËU“OR¬&è†6t†ñÒ¡\åŠ:ܵC^4 Y8R ñY”­húwG9gŸL(É.ÍQ7h‹Xñ ¬F»ÿ|”~Ã)gçœm§cî-R3¼e”=Žs*ËüIcÐûLX‹5+—ù®;›yÝ]äÀAQ>3ZÅÕ‰Öáke~iáÛ“]W‘Ü.0 ¯ÆÌÇ¢Œ2ašVÉHmÖ­GéΞi»èÖm °Ý üm vçؤó FǃOËg†¹²!0¶%,á¾èàæŸMO¼öÒÅ[^9N¸ŒûãÝëq»,·ïÔç|%÷±þ»Óú)ç}µ³ø ÊÝ33eÖÐ{ñÔCÉh×óîtÉûJ"ÑK™ìëyè¬>;q!Ý(§½6ëI8"¾nªqîÿѽH$ðŽUðs\ø–ý /@>Œ 1¦r;ͪ ºôºwŸˆ°–R€{÷#R; ¾{r@[ñ&j>[G^¡€DÙÝuÎOâ"–×õw€+ñýÐws¿CpþbýPfü©Üf£Ô‡ÅÖÝ‹Yß›ãÕ¿1X<*É]éÐ?ü ܇;Èâ݇;̾ˆæ+iänrŒœ@€G†£ŒEä¹ä-ˆWl©º|Æ -ílÁî&âÀjâa°¥´ûv¦ÿêE'à$j0u µ$>άw¯ mqæ<•è âØMàá°inô#âPoý+´ÕÐ5¡•9¥ àõAâ7'D3Í.‹Î…:”AQ%øïØTð¹Ô—yTµzЋ‡4›…4‡Äp»…t§…)ëmpÀëFþ<8MË‚þ†’ó0 D”‰#­³j/„Z vvGˆé-X_ ÙØ<894‹8Rh55a@HÕ M ¥eƘ<ƒ˜m#œZÖâo ›ŽòPIzqÈ7‹ä½‡H‹ªM.ŒØ_„/û¹ñÕx\u9.Àd|¶[Y@2ÔhÄì»yO“¤·¬z?6¤ý!ÆXŸºÏ:Òà;âƒÇR½ÆƒŠÄ ’†’»Å2·Å÷’(DÙ§[Ä“»$·øÏ# ¯‡w•_õ·ZàŽUHÞÅkwnr®;ˆ;m6®*ŸGŽÍyñ`bó6õ\K44àOuO²?´{þª:–µ"ÔžtþÕ-,Á*ö$éãUÉ‚hTÏÌÐÆ5LbAËcý)þ…Ò§M\acÒUÕ-$EÉÙ¯Ñ×ÞÌ=¦%PãÒýÐ1mW<úŽ88î)DÌ$ãL•±ð-²šÄBkÞW^%¹W8f1QÈü½˜ÉƒÉÑeÂÓP™ü+9‰'ËE¼9‰µ©šYò¢/¹yì\z¬¿ç¬z(c{6<“-‰œg]’/K€‘{lJîüIä…¬§?)€|ª=bÛ‹`¨„õñQˆL®Zj,§¿=‚Ãæh¦gZzȉ/›i°cQÊZj£jF –¿»S"Ù¸mæ{Mw%gJÍw~ìQ yX²7“¨dæCd»x–þsªô§ ä@Žœx¦x¤giäŒ~n¦D‡OzyˆB†xXûH>‡¥u[»húmsŽ,D™ ØÍW¢˜(“„5]#ÓÉ/Ïx€å+ðJÙcvPÁ$Ó¡oè’F–ûÁ&Œ^`/ኙnhJæÆRà"ÿ•ÎÔSHÔf¡´RÂ%î5Î'+Ãß´Xêm–ü]$*x¤$8´«Ü)é=ã÷œFÇMƒÎ2*÷wÔ‘§ÄŸŒ¢;e¹% à*wj%‹Ë,ªN$©É=ªÙ´¬íÕ¯¹¥ª}¥¾-ò×=¡o,âÖÕMs'f¯¤ó¶¨x”Œ¢¡¬¥ªš-­z,oX¶ŽV¶J‘TÏRµ¶=^¶&^µÍ–Ö‡^5—RGxP-ì›nÑPçÈt4R5“…T– _R3:òô\iŽ\‘½‡6"{LCÓm'…z™hb7J¥~®P¨fÔžX׊ûV—…©ÚCŽÊ©›ýlš*Ö=ºÇéTÕ^—ø€è²1²Ì±ðqÕÀiäêYmãkßQ h¢²©MÌñÒÀi²ÀùÕëÎmky +.ÃÍ—Š9G¬éÒˆyÏ?¥¨7>x7Yã©è—ff»DÑ*ÙKT› TRÃEË­q-ÿn†µo¤IkFW‘@c©×å0–O6Z’if«k¤i²6AÄKHe'kü€k¼oKNlêò+ šo|ák·oÄþTW8æfO5‘{”TwðÙ6¡Õ6nBž.VíæZšºÚ ‹Ñ1…ÚÝúߨH?×´—ÚòûÞ¦"WÍôÖ†hm Xj³À°ß-JÜO‘ îWoªkÈÂÏ]¯1Æ…®‡¯‰:OkD`/ÉìnÂikI©o+úßí>2ï> í>+ï>í¾:ï¾ï>ÈÒŸk‡ïuÜ /8O;´ú'0Y-,7pñZn¶z…¯ä¶v2ÍU¨t&WðÀ`úBÏ·µXöÎ ô’ ôP“æØ;*‰®õÉ®´Vèfx•%ÑbÃ[¯g Všo“°åŽ›Ç‘wÜMì%Öí^Äsù~Ð9öÀiûqµÈ:¡ÁÐjd0_*¨à¤çØw°_rpOƒp(ðÊj«TÇBg¹ô‰lŠ”×H‹’zM>úõÝZX”4éH‚êøþ‘ëzÝz íœÞ\¤Ÿš7HG$ÎKOrÐʈxæ!â¬hf”=2Ø!ê?0‚xMBÏç dq[xjÉèVtN¶¤C8ZŽˆöŽÍæ´ÅL—îÂÇ ¯‰Sl÷(Aôˆ2ð`ËP4×Xg˜ >-LÐ=îŽÞ‰G³Lü™Žÿ<ͼÏS÷«2ßM0@NŽÚ01o< 1þ•pb»F³{ü6­e4jª³|Zêd O¹‘÷i‚v*Ódr:„”÷¥2í-e®sx¢-àžr ß1æ}«Í³®§¹{J¤mb”‚1Ž›b±°bˆÐ´ir;Š!4Šå]ˆy9‹5gD:c:>KÀÜ*Å?‹g9K–9K´=KU=K÷=¿0 þ @°´Ÿ°Ë8sšEQ˜= E© “ƒÈ<×:)&1û¯.Ö*0;Ó&ÝDt:Ùá¿T"«Ê³£fžlv ¹PÖ=½m²àiµ|ýWâ[´ð6aL‚°rù½­8«mQ ß½™ iæeÄ·´Ôö²j‡½üƒ9U¿òW¼sF C&ÛwIßuR>k}e¥å¯v]ž|¡Gc{è§W¾õÈJ}ÀwécP6qWt-±:¼ã=Í-@ÛÅÝóFòÙz+ùwŒYþî«'ãW¦-^J|_žpxudïxîqÜYrf÷*F{t¤KGÛ¦!f‘àçFÏ}füS~T€t…ðpfggNL±kÑí〨B†ù9É* æ>(¬cˆÓ» ¾89²¼$Àbÿ `þ„$*mÓ‹ë/fþpãè |îÈۂ㸎ϯz @óT£ZCièû°(1·¤"n"#n >ìWÜ·$Lzz˜*×ÞQÆ®uôíçDž¬ð‚Ö×/I9r³ø¼ú¸êç_½å+k‘4ý­Væþ™-§j¿by –©x¨ ^Ï®ê[2lz©Šríô˜ˆíÖÐqè5‹n¡fm5û[pñå.i‹äô ½š‡atý>9Ú¥µ¢$vS¿jfÑ ½µI§õg± ØuÉ]{À¨{;µ¸SXy{±Õ0ŸN&™`“µ‡íx"±åwvËŸ~7Ìus­vÓ¹†‡ÑDx%ÂÑV"¸¶µ}B”vÿL|­zà!W½-7½eâôXw°ÖálÝq¸9–Â[¦xùµ/BÃåz)ý¥n므Z\s“õjîZ<{isk™€rv´òLp‹÷ßr…ñµ&^ ·MŽ9¤æ1Üÿð–óŸîYiÄÝP•øô=&ÏCÐ.€vÂÇx“%{ûj<¥°ó6—q®èuǧuðs›ù¤È1µ.¦Ä?m—kîº×ÞyÛÑi ’£ú÷8¬S¯ªË_»U“ý¿ÑÀCÖé²&€Fü!ÁÛ½éÀiÐ÷»Ã‡ýîÜ<ƒ¼Õ|ƒÂ#"£¢ â !¡  !ø˜²) ²²ÿæQSTTJp—ç–•×pÕU5ÕÔ“hòê¢û+»{[9Gz»e'ªUÇfþ©tÎ6 ³llnm“ÆšíÃZÙØÅ;'º†íp†ð\yø_oÞòÝ?½|²;Xœ¹üäk\½ÔK6  ¸r0¦‹ë˜Àá€(ŽÉ̆2+ƒíh»ÿ]TDgÄ‹÷ö $Uñ09áFk4ù}h^ "™Lc°è¼°,céi‹y_¶ nªxyY¾T¦ÖëBÃ++‘ÅŠ–<üŽ 1%H]Ð:ô¨R­þc]:Á¶Ød4™#ÝV»CãPšúa¾‚»êоy…þj­–ì†b7õ‰PÖŸE•ûß›èd*ýawYºÔ’3m ,ÔÐ.¢¡’“úšÙÁšÖL²ÆG6ž|‘¢Õåxeª*…~«™ð‘Ý>í2´?”ø=:’=æhTäIàgÚý™Úýá €yVPß *#ìíþx:wÈÓ‹ÿøp¢ ã`ÇÓeô ÷ªø}¥òHl5©ˆaa UèdŠí]4 "€<š y€ŠX4ܦ]Ú‘M$ʇô“0E7W'$Åü…Œ€æ±‡‚Ä“d°e‰65Ëúw¼5OKÝ2( ‹ Euúσ^üz!ÅÊ5iBsB$Y@!aª”¥‡~*‘f¬WDÅQ~Yš+•c[Š(38¢Q¶³RPŒ8`#à4ã]°PO „õ ÃV#&0› "24âÀ^†PrG» ë.ŠÉ3«h XͨDhœ²Ø+õR(;¢HL/?fØØyVÃ,G9Ó¥†333îìÒÜFØ×¼¢@ìÒÀkIQ:AŒ]YÄg´%¯üÎN#^î²R<ïÛ¡–™¾èILpŽëí«›v,¡:n霠ÒÞyRÇÖïj ÏÁ´("ôú89§T[üÏÆ ÝÔGÊkîjÚ,÷sFÄ’gêø”0^§±¼Ÿ‘óG²NÁ5„ÊšÛ¹¬ècØpòSCŒµ„ÈåêÄ22Œ®¤@ºƒ!Èãi«Œ®®šÞÕ9Ì$PPhÄÇÁ?âµÞ@RV g©ÉU"ÖGJt)3<¹ãŸ$É4Â̲¨˜Œ TXZûùð"%.,O®j¯c£l }„”ˆÁ‘¶ªx™µ<^v–#‡…‡µ‚…62 _eTξR1oò9 `P! {+™ì £ý‘WCùaóã+ÁFâiÌŸ l¡ÜGr…éÉÞÒöñ¤ËHXP#*s FA€”"áq|[w:Ã/o±f¾Ðü‰#fŽ€u,ö§jíEw I\Ç–Âçzÿ¤cj?®±"Ḭ>.m×?ã\U y}ÍÉtkØœAâP™èåhŒArZوƃl¤|˜Iå±E†À–¦¬ ™5*IôVôË£QΑ!|%g–Ô³Ša£Dém z_gáйê—QƒÐøLdÕf÷W¤ÄY3\4±ìälÝLéKØ 'ÿ~bœåwy@9¤Éä„ë™!ÜÆ)L÷ø*:ËÍ tãä&§<.#ó›—Eú;—RãѪ^‘ ÅɸÚ×ëo µ!£Uh…UV5^*ÌW„%K(ä'Ò/Õf&úLê='-ñ’¬CJ8AÝ´ý+¤éV&·j¸lUšŠ0j_™óSž¯Mù+šoƒª+¬+ q;‚¥3’nk fÆt]ÜzFU«M{jlá8»ûSTãÔV„,íìWåF[Bƒnl;äü‡—Ê¥ÃKœ‡vX*Ù'È(±,G‹£[´¦àì¤Å¢B÷Б`‡ðôŒ¥G5U»7ÒoL ¬æÓ”l´g*ˆû±;K‚í³€ðsH®²ö &Êjž*¤mÈ ?ÕÚ"J"=2°·éú]ÚGU` Zò·!ìH›V¼èî¾¥åi3ò PWBÏôYhC7&éÚ¿?u˜n;w°Õá ƒžëÇ.@HZkHÙ4=@ãö†ïêuð¿HhŒ¯êÚ†Í*‰Ã3¦QM<-âàíYOe|>éG–6“—X÷IC8³2é e`0øñݯ•l0rºM„™Y”~óÓ…ÄNç©ÃãâHØÉã\ÏlS#ú F±‘ŠN‰6HÈdÖ!*sùpñÔØ¨\›Ãxƒ(‚ç§XKúáÛ|;:Aªúµl¥£è§ã6mó%-E0:kqnÖÛqŠ3=lUФ¨µ³ Û‹ÁÉè<èžúÏD3ç)çæ½/+ •žz P¤&þ.QH*/,´ú6˜²Ô=‚k²¬Ÿ›7pëz4hEg…› ¯ô–Ÿzc%®Í$¦þ8s^kï¹Ã%@஌êV7RWÇùÌÿ­¶jl&`×¼ZööÏj‹²mL…Øÿ]|îÙ©DŠ2+ÞC}UŒS¹ƒ÷b™ë˜ý»¶VË£7Å>õüÄoï~Ê-Ÿ4fî˜Mþs¡à>™°³Š‚+L.³ âè,,ÒÁVW3ð¶Ê Ýâ¿Î«¿¬Á3XW„¬BüŹØW at¡Ó¿ÃhÉ®ã;üW¶aò F3ŸŒÞA³‹j›Óû@~”ÿ¨d‹¹Ë·7xÊFU½ßaÄÖÅ[*¼«4Îÿ²æþSzbŠÞ©å=Ãj*eݧw]ƒð½)òÚöR<ö‚!w2$ò(6† Í ñ´ÌZg]C¹I:Õ‡Æ%²ß]KQÂî©€YçzÒ{Äó?c ¨ Eí1óXÜ´äsTë³àˆŽ ¬€4‡ Á Œ„ ä[†toµôÇ´èK€›ë†GEãxFs„ÆÑY’c¨&‰@f‰hˆfVš{Ú™e¸ðçù‹xrËFö4kâØk2Y¤³+S÷FÖ•hKY&§DZfa¹ ¬šlBaƬGîÜDRå¿ÄšbÈ Q9TļGμg¼W¼÷Œ¼Ï޼ï<€FÞfGÎà†—ÁDBë˜ð–›è$§WuX.|$BnE¸@öø‹Bb>vŒŒx6l#¢Sàg³!Õx6‚f!KA¼pp–¤•E—{dªdRBªéíºèö(K÷9Ô˜³ Ùf‘bÁŽD~$ÌYî"(¾†GüöGèÅY‘VÔ™ü§1#U*£D}3pžÒë#IZOZ*B«”°(y$×@¸ô94¶½<6­¢ÔÞO@3Z»¬!=.¾¬ý r•¬Ôõ³, ©äª<£µÌ“C%£<²³Õƒquã'ꀧTWÎtd%îAåúAÕR&ûÜ¥úPd¡•KUCB ‚ ñ*´vÔá&ÛÖd FgFm[1Ù‚„æt]1úU¦à0vík¤z+Yµî§’úƒJûƲjñ£FäÜ0Àêo=L9˜U}ÊEM1X-/rì–“›-xv ŠtðY­=z㧦n—EI=5ï—¥&‹V›WGVWWÏVßW“N³t¾4š;d#­c”óY:•6´³0N‹wË?­U¯õ¬ö¯ m˜Jš¬æ¿Í2]¦ÌU-¦^­æY­–]­ÖV­0­µD­cì6dUÖžžm^™mî]mž[mÞ_m¾8íþÜíZíÁ^í¡Yíá]í‘[íÑ_í±8ñ܉ZÑU\v0m ”ŽVâèZº˜WäDƺ[-¥Zå¯ÎʬÎê®ÎÚ­Îú¯ÎFœ®fî®V­®v¯®Î¬®î®®Þ­®~jx žtjöL+‚î6Y·éü€$ðÊÅÖEîže­žU«–òÇŠWÕn~Çn)nŒ ‘<éΨÊõ†b¯žË®Þë­ÞÛ,ŒœNÿí-ô]-¼ƒ-ˆaÕ6ÎxGÄž»¯> Ü~žæ)AJ®>nžQ‡¾w˜˜6Þ»"õ“Ì^PítïLox@:rhÿyeÍ@? ÔìÆù¤d+{ª{ðV«¿GhÀ/¡ƒ°ÚÀ•h°S©õc°ôÔª†f{ˆï{H½k@a ‰gÈÍ`ˆäÛè/›qþÐ̰î@ ¶™Š\fxÔj8-`øHdðHÚ7¦@K{DY{ÔÔ{”„hø×RS´zÄy`DG¦2+Íž«zÔ<{ÌvÄØºT wHãz´FtHê{V£Ù°‹§{,z{œ·'|{@}»'g\šl,¡ÛÑZÉóòP #ߺ£w²˜g²T{²Ü{²2{²º{ÒSº³òxRa"Õ{?tÈþ©«¶»k{ªû{ªwºŸgzP{zØ{zô»Ów¼Ù{¸E;ÕÉ-üj|Y{fU»Éf{Úx ¶ô¿×÷Dôô!îì1Ïì©öì¹÷ìeöì5l÷FõÌ7›†,Ö ²çÌ«÷Üû7Â,`Nn`fÒ+m/»þƒgþÏ\\ýÜ·5*`{æWbNPól`³èy(-ØßêÈ,šÜJïy¨x(b;«Ëf¾‹ªžÅ_êE:ÙÅ}«E¸œ˜ŽŸ%B¨†)†ë,˜ùŒè0¶œ%1Ÿe‹,Þ›%~t¸& Ù%JÍe UÚnÙ>Ù›e"še Ù5¼UÃ&Ôž•æè)£œU˘&œ~ӟղǞUg5v­Uûšs›5ï5Ö€5Þ!éëµà›5¼õ UÔº f`¥$6,ÒJ×CpÉ„³õ˜™Ö¦µž ÃU‚èu ON+&€ØæjKbYš{ß±7›ç&=%zÐÌF#ïjÜ&Oº¡$ØY꫱X ÞF7‡ø„ÒÆ §Õê_Ò\ê•=®µ¦mƒ› ›-á€èš-®¢E3ÛöP­IR\Y¥í Y–q<Ά›íÓœ¥Úˆ1’LŠ›íÍ¿T!Û`«Að½ÃžÃªmŒ©í³Ÿ=v¸E^¼ˆ .—ØdÞ," siL±¶MöÈýj8Eáœ}¸}ìܹ Þ};.pÉàº`Ù1ßC\Ú}ü\8ü = ®å] ¾£·íêÚ†LÙ#®Ùq*ߣš#nüc/ë#>¾zNºc º^Ýã£çeÀ&dq îI-ÍÉ?¾UÝußÍÜmü½©ã7Èì7Íòo¸N@αyì¨ü’{¯a/¯Àå¢#ß™³î™«ï™{î™gï™÷î™/àÌÿ<ïüKÓŸ©{ïì_ø{/ÉaŸôky¯|YôãÞ}ɽsNúò.îÍ#vßzsZ•ò‰­¿àiòÍ¿ßc8?ý?â ïm{ÏœS?™W?€½u‚ç-;hà¡ F¸‘pÀü>Ø}žKþ¶`¡52É3¡Úéq§˜u¶Øs¯¸÷¾ø(p‘£FI˜*´™²†Àœ²•ªV©å"w#þBpЀƒ¢‚‚r”­5RÑÑ»\½róÕí=}|“W÷ bò 'Õ‹@¡²4‹·´M £ OÉÌÊgä愆æHTÙGêÆ×Yk&.imkoéîVÌéì-ëÉŠ¬0I3‹™LhiÉšŸY\^ôò]ZÏëÙöÖ3°š¬KlØ=;?¹¸Ø¾¾X»Û„€8Ôq:<þ6wÿò÷û{lCÑ´‡d Pîõ`³Û®öJA‘+U›3‚DaÇ|oŽcrxO=Æ„S”å%S©=NŽ?žÄÆ2ôÄןåô†ÈLf\<‘+ðÒ!‡06—ÃljÔ.L(ƒ•)•)ÕX¾P­Vk¶9Þ\¾ü_h`«WšÍf˵F›«×=ñ„ÅéµÑA#q©Àw–‘þ@`ðtb§ú}Šp@ÒbÓÄ¿½= åZššzä®Ô¡è¶ÒžYÉÛhïAæËå*Œ…jló³5†äNÏëe爉F·'ÀvøÕ.Ráì• §j»¤Ýíöì]ºâ¾Rí×ëõf›ÓmN+ÉVqZ>à›ç“rxx”ƒ—×»xh­ÂÛãûû3ä›,ÝáÇØò.Éየ®Gd;aS=[¤!3Ð:aÐÌš„OñN˜V¸:fð0°Æ?x9óC„…œw«¿ƒ÷YQtÃDѬçDžb ô™/BIâgBÖñáh¥Ú‡"Y6̓H&1I"˜¤<Š“TÄ4þ¦ >ºPž,8Om%Ñ'£5f!OÂe™<ŒeÝ‹R”¹8NRÔL%K-¹"Š ãä)’&9Îd™e™ šA‘T‹ç9Q‡†>£ñiÞŠ‘–æ‘I†ž¹§Ä*ñ¹\䕞£÷%^±éyãÎ\›ðžÔõxš…®‹T«ír=K+"ñ­ÊJ„p®õµ#òÅÄhÛḯ’Z7O£ª¹oª•i§®“Ì#µn;ÏZ£L»wvS®x»„Z·ë^?½Ú^ÈÐþüf%¶èY¤Cã3ô—x2   {#õÆ{áôê~7 jÁ2MHâÊѼ²j3MáÛLÓêÆ°æ’|ž¸Ì³+ÝÖ#íœüÞ²8AX¥s¢ÊMNhØ;7ÓBo–MCÒÒ=0‹6誇]ÏT•×ËÛ =öù›€ÖvBZ‹fÏLNÇ 8¶œGw…6^7J•& šÎªE¸ë59f™çÝ;%—ê#¬²ý¢Þ…m<ñŽcßìžÓÿLЖº=e“}{£¶šóÜ ßs-Êï£ù¨¸ >g¸*­·B×7ì§ãª…|§óF,ëÖ"¿w7›û^<Ÿg:›ù–s˜Zoøž§|²¥{*¯»Ž·”Ž÷U€å®þ²0ÓÇi4À¸ŸW<¬†sÁ{bÛ™ùñ¡ÅfŠ0Àç<¸7­‹káüº$|»!<À<û«óo=Ø^P"ùfåmôÛÏ0ëÜY º-ý?sÉœ“„ƒˆ“µþï›O‡-…,5õ¢»EHÝ„-ÅÄ3ˆ¡šED@Ѝµ(-ò¡·‡«»f¹óô4‡íáéµSa²Þú°C.Â8R –ÆÄ¨vÃèb A (k;F« ¢R†pÑSεŒàÓϳ_(Ƴ1¨n"Ò¦p«ÜÍÛ¥V¤‚ÜŸŒðàØ‰Z.⼟ 7×_zœYcf à>ÃÛùå”,ćšA(iEø®ýYT‰(SEálxí÷°EÁs“ëYÀ½÷¡,bâdõ‰ÙÚ¤…¶”bÊ?q©¾Ù±!&Zø ìw¦Ž•Sd€^”Ò'™LH×¥uãgDLi—Î&þ%R :¸=šgN$IeN“={Oc;F6ã&…cØX:$/8#ÝTaÈ-†ÿñ}Xˆ»ê<æÝã’aU…ð%œq‘7«§Ý889Ѧƒ®ËŒ¡ª*ÇÔËœq;YÈé|"gÕVF ¯DH,‡73.¨ŒGŒ:ÇѤ¨Ð|¬ ª§4éò¾\À›i’'S!—±èˆ¢­&-Ϲ) —kM.â†þ+†ƒ;•bܘUê½++æ)ÆÈUHƒ¶æÍ¾Ôhɨ֊©T³¨”ªÌh*w´²2ªàh:+(ˆ4þE[vˆIÊÇí>”þt›én`©úê.äH;[cÜx(àÞ*é³ÕPcp¡Fgü=ŠQÅ ‹î| – 6ÆújZCm¡0ÞËÄ÷êHIhUn¦?ÃÚÿ|‰B©!åÔYí„°GWî,fNE\ÂÔI”AÑh¢ÕÿÌè«PwõjTª—|ÆØÞUÎ3ó9eÀêZ…ÇxéJ5SÖ¬ç‚À%O°º4FeÑœËsNþs­Gàš^£ÕÂÞ|bR’áPž]— aü01’ÐêÖ¤_.ç$£›¸¸1:•rÃù&µ18ŠXeBÎ{)ò†íšOŸB@o°õ÷%P"ä 4æ”.«­:m%/ïƒzXK>­„ZßIÓwèNA7d©ä òb(Ôq9–Q>Ê[QuÐÁuÂêùq´{çK;rµ9¥)ý ߎ«:‡ÌJãŒÊäë5m-0›¹:áÇšMme£n´Yµ$ÙàïäÝÃmo%Š+¯Æí6~rÓNäµÅ ±Ñ ×ܵ5}æ2òUôƵ•sçTÇ—±cØÉZuG×ëÊÛuLVVËŒòVCe›jE­¥eÒÖ¶ü÷jA×Áÿ­}»ævL'r[c®6§f„Èæ1YÜõð$ûš/(}.^^J \†:i:é ´í aòÎgGSϼ(mùݦ%†ès¥ àÖ'‚@²€Õqi]å²\ü†Ð+PÜ…v ™N(‚gÍ÷SÀÇRÇóZQês£jƬ¥mÒa”Á˜þ~Zxòþ¯»ª¸ç‡µÔúuàný®×÷AëƒÎÒlék]£‡lÇ“&% °5½ÒzL9QÖsíÀν‡wØ–äû\ŠÁ{‰àç¹R†?TåÖ³igï„J˜áZëÉ…Àë=–±}úÖýͳË+­9Göøa—c$¹÷µœ/xJÉ{çbövfã»ö@7Õ~²ØJœøâyvãóåzFµkÜDz´¬ªŠû˜-»S,عåhzÿm±b4ðüÝR^ùpæuúnÑó¥E.X{uØKŸÞµ8ξ)ÉÈöQû‰ÈÁ„ÊYjÐX¨@W‡ÊZ8XYI èÓ¡‚3é4)îx«”‡àoF°¤Ÿ¯|lþàïøhBoè›5dÞfh ”¤Nýä L£-~Ú~pz]ÔSpЀ³ß2Úâ(Â:ú]pÇ%q{ЧvV' §Ð+ʳÿ%«N±ª9†lë``i¸z`Ó¥¹Œàâ í`BoóÚdãöêð`£cNß›"5ê(f-³âxQB '®Ú Éá¨ëèÏ(Aèß̩֨ì“zjPäÓ2ì׌ä|ˆæR¦S¥ê^!ÁR[ª‡ø`¥ —ÌÒ¬÷‹m£ƒëE(¢¯Úg×ä3¬è]0j5Œ¬ÁÄTl•êݪàû îžäàÅce-LlÓ¡í¶$*Ónl—^µÓµîPV_彦±'s×qâ8 uðÏ7“3€\‘¹x‹ ‘4ˆ™ S°{ô^°=ÀÐóo’¡ Zàˆ‘Á JN’à¥ò CW«cR)R@¨xÿá»äƒRi…ço;`#ÃHb碉JHæÓQîˆËg„ƒºÞg±*!K(ï a²j‰Ì‰mªüýD8”ÔPZ¯ß(–Ü=þ¼Af>9–0%¾õ(þ–LQ%öÃWÆ6ä‚¢T¨±øWþm|O±MŸ›-¼(í&»4sàZc€}Z„5[€si€g¨fX0îP’m{`€)· Ð û0!øïnž®ØóØúëÿCÔ„?ëÑ¿ÀÔ”R¯îpq8’ñdqù–²‡ššÍЉâoˆö.oÊ™hšRš ÎâYLY¬šòD’Ù¶QÙšZJ¯-HäCOP[Mo»KnÇÔtQ.³%IÍnÉGÃŒÈ \œ+cg³;MÊôiÌ8YÊn<ÌŽ)²ñ2VZÌZ Ë _H‹*È×g´&ÍÉ¥ýÍnb }nc¼m jΗ|".t+.ŸÆþ‹²~§«¼«g¶|kO¡X)/U0U¥Î}ÉÛOõ$ÈB?£5èÎñÙÃ>‡ƒ"Ë|SÏ%Ê"ÅâC}ó¼.s24ö"Z·êËcTG#B“j ŽþÅ®˜‡öËã‰GýÅ ^¼·^¾ËOÐ*ú+’ÀGc=³Ôm§VJŒ’Á'f(î9åã ×Ó±ÒL/`q)ÃøÀXh´é13ÀaÀJmFÑþe›Y,àÛþËiöè-@HÕ—M2TuY(ÇH„_H÷Šß‹NÉ5çÍ œÎŠ\¤ÉÄŒµ¸,fÜž§Õ¡c Ì’›I–*p)y´¸:–u 2ר¯ÚÍòKÝ” ¡² ± ˆ§J ”)F?÷ª½Ó¾ˆ+S͉—Äg­PU’ÃQ­Ử\+&›- ƒ®*±LÊ-0lM¨¸ˆ@[Öy2ÇíNNÏTš¡‡WÔ}^F d<‡R·PöôWY¤ÄÎôèF÷¼VI}SÅ­Ê\æ'ðá^iÐ]âW²Y2YKÉÑôË õ©V)QçjR[V÷hWi÷+Y8„^íNd–Òމ™OvRNöÒôö^IYïÆM#CŸV [9F“Ï¡O¦ŠÑ ó]sUÛ,Ñ.àÛTº-rÕ,ˆÑ®°Ù¬ÈÕ¬ðÝøÏW»À[O€×”_Ó¬ÍUÊDÆÖ¤†ÓnöK¹úæT ¬¥{"Œ¢xÞ5^mblÞÖp%ßÌ'# ÕXIÁ“ë’”~“¿}Ÿ}Ôdƒˉl]¬&¤+³ñ±OŒ€úÍoÑW¢k-€¥¬æ_oŽ-A÷‰ãâ +ÉÁ³JtGi-_tóFNl. m/5…Oäæ‹©HÑñ¾dö¨vw#ŧ«$Õ£Ù#úw•E·•Á\‚/ªÃ/ªÓÄÕÖ­×b5ù¤–ñ!“µ÷øV,žj TrŸϯ6Û£T½Ç¢J«ÆA&w¯:w_ÙËv"LÀåáóbÿct´Ðqø½Õ‰ ˆÑÍ'1•ÁSLU ©âó(`fÄ@œ¨$!Òâ…(6±ïíVÌ ðqñY«T}‹Ž6Kˆ=>ÓQ,ë%^µ}×fÅìÉY àstí§àÞ˜¸Ï°š3?$î;ðR eõ˜hx%+rdqˆhÅj­LˆýÂû!…ÀÅhÍ £‘áµOmŒ6Ë•A:ó˜=6Ú¶þ¨‰¹|LC·»Jk2íº4¦ÔŽ úNý¦ß£nÝš¸‘ÈÌÄptí äQêQ–ìQ ›)ž‰IµPv›rÊÓ¦òvÏM">åïc¥!oŒ‘!wc´)Ùžd±(ãuC&DjUØíýÓæåêãOî#h%ãVB7ãåð»„_¢=ÓJá™!2\Q‰_1!™­Œæ$͘«š,ýÕ»`€²ë‘ÔΩù£”Ž…‰Ð™(?V9v Lñü÷òøÀËüÔL¥:oöízû‡?½•!#áJs×ôÛâÊAÙ6U±¹g#tí~“¹‚ñ9/ÓÛæQxäI„˜9jiF‰B˜A‘÷öL¶öR’Ýöµ€Y`Èâ iÅ|”oÎ/˜R^ú6ùç‘]÷ÂJªé½¤Â§á†¯³kâïßÌÄìØ……å}œ½LœL¦P<¼‹¼«_p Qvsâ(#5ã=ô.Öu*>ôµÙ‹ƒ®¸°Ò]U"”öÚß;ÎVG59|¦·=®;G¹;<V#¿@M·ÃÒEöŠ¢Z,ª)} C_¦QíÝgé΢:Ÿ¼ƒé]=O2›…[{¡‰™°ž×ckõ³÷v÷FI…³8¾– hk.\ó4¯«îš‘nac«Áœ³§oõR³A­˜è²CÝäv«² ½ ÷I‘°±-ÆþPÓŒY[H«KR‹Jœí?å·uM:ô­D /ºå” V”9E•ml}nxOBÖaœZ<Í÷ìaÞ AÓeiÙGà_÷n´lÇ\þ<å©+¿zäÁµx1ï¹ò¿±* »õÕ…i„Ö±4é8‚6±½-»W1<²½ÄWF´ÊT¹_7rp³ÏBݯSÚñâ˜#ƒÒXÔØì²àBòÚT£î| rãÝ^ê†Âp(ö*wO_w qQˆ bdtÌ^æÁѤóг³ÿˆ³“=Â`Ë䂨Ä}8qª}ØòÛƒ:U‰5Ѿþ¥¨“‘^ât:B•Í[öfƇå¾ó^2Œº³0_2„j`Rþã.ÜùŒ<”Ložá–'©v]Šó‡„Ý©“… LëI–Ý3àªZüSDæóæ_gɧÓ+ç¾ö[“.‡üQ§þ/šÎ±Š4‡@W\Ð`‰¼k‡ÁI4É3#QÝçê»)Ì“oîSu=Bù¹{ ÂÝž'Ã×zÝ‘WP¦á›< ÁÍœ T¹ÍÂŽ“åt•ßJ¸Óèòª ŽÚ‹ŽÖÕë~Ô@Ô®ŽÓ^ËÐ]L¯î[hJ›–ùK÷ÍBìI«ã®“=^œ‡yÅFVþ+¤³“—ÇÇÉ»:°kLº3Ñ…Bÿ a¨TM‹^¿Õ»õE¦}\Ø%鋘~ê„/¥Ý1Ð;ÊÒ·Ë~ºímú×kÆh»TúåÜK %°JÙó8УJÉ=W’ÉJ˜ãæ²³'ïÍbªaŠÄX¯Ñ1(é¼Ë€Äl•!ý›WËË.ú=Ŷ1¦K·±‹{«ýTŽ a:*Ìî°Õ'’ߡ µ.Žwû dÑb¶°Çòý}•@‰ /ÀÓ6UÒnÔ3+Ì+Ãß{ÄÛ‘ ‡¿·Æà7äÈÞ3è’†ÓóÖ°ºhs{y›–×ÉÑQþ{—SÆIÿêŒñFgÏþ¼ÿŽsãv!ád/4Ö‹lÛ|Õ9TRµûȺ†\¾æz”wåš‚1¼T–/Ïó"ý›c¡áWgÓåªÇØó†3¼X×Y”ÖSF^óe^zä3çd]ÖFÏÝQ5iÿ+÷ö5ÈþVÆõq÷ëåÇý¡-ÀϹ*¯aÆ¿©¤ôÏ:c¨A!}ôÃd¨\x÷7¥€k/¡±i;Ê—0[³à¼Ú´k4´s',nàâ¦Îž;bç®Þœ[§ç0êæîáéåí˜I õÆO¤,Å÷¤-/Á&*àã'©àÐEB›§dž‰ŸŽ£R…R/¬SéU]S[W^k“ÈßÒ¸Z×.ÿcO%m(cùKΠv@gê`OÒzQMkt²½ÄxÍÚ̲MoßàëÆo#Õ¼þr£[ÝuƺöÍÀÌ󘶣Ÿ@‡ŒZ£á¾!èópÇ2I‚Aý•Yáâ²VY"mŠývŒÚ‘Lʹ§5ΰÿKOÁ] eU8›Ãã5‹—<®F0“%™„›î¸%W"’2¿JO!V‘t:î÷d[+T ¾±P¸CJü|ÆË,1Ï"uµÞ€ð»¬Èb«Ûíé½wÅrk2¶iùüÑÀfÕQ©3EÚ’úcT¡ôñ =TÕÊæò7º±` >D´ŽÒŒ™E¯%æÓþêR¼=óy¢í|¥ÛëK7øãyÚ¾¦^¼ë¾îøHc9 ÊësMqD¾,¶[wýrlÌôl *ü`"Ì¡óë-²EzÝCZ+Iûåùj«/îWö>”–|®»Gá\0mÉCÝ'LÍoIC 5hÖqßôØÃMǨ“T?8Ô,Ò‘î„\H4^ûY×:mX.œªvÜ0Šï¦ Ïlñ%Å:5ÖS¬8ÙùÙ\L;„à–È o6]ƒƒà8®¢a¸îžÆÑ8ž‹|kò¼ËBÑê¥ë ešþxœŠª¾®œ$l-‰…ÍT1¡íœL!¥O„´¶bCÓSqšC_Á†hȬ«¤[ŠfÌæã–žÕ­j˜JnËY˜žªiQ*9X Eèë’‰_4éo‰ê,e©©Bæp‚H¦di’–9+eU£?È‘‚[Ñ(y¬Ð ïAÜ~s™T$þ÷oã@çDÝ,Œ]»˜´MËjm¤HÕ=c×÷ª/Œm{— µm 2µ5Ó(Y@uUâìh É鬴]K¼ôš©K›$•Ú²SÌÁZ;=îs¤Û%5•½ZM›È“e7€ÓÝÊnÛnšôŸ¾¨:測«ªE·!y¼å©Çv=·¥TjeÙ*‰ˆvSy¹~2Œ 5JòM/XÝ.AŒsÏÒnwF2ÄYÑz2¨rhæ2Sà°¤¥êÝŸõ Ê$ðóe±Oû¤Ÿ(Âì„”áY¶n‰áUÌê¿èz4V‹žwp´µ¢\[!Ÿ 'û‡®cÂð䳃‚Ôß”pÖ² +ò( 4ÎV&ÿô Í“¡ãÑï•æéVía°ù;Hêªç*ÕwAyœ„Ý…ý¢I|ˆ›ÞàÊñÓçjǃDù {1£ ‘]ìXÈù¼|öà]ð_?̤}Ýþ’lõÐ;á}O±´t½o¥à 8·ÝfY\`™A;á û¨{ºW",{¹’ÇÍ-'—Á\Ꙙá=°V†$²¨¨ñ’˜žù¼¡ä}`Ä”LVKék t 3:“—zOtHý˜“ š Ë!B¢Å|ÓWÊT¹r¶åaß*Á†ßN°qáÃ+ñH¤ºœ-Â:äH†ÜÇ¡mh¶W¶˜Ò…}é°ÞÑ«(†VáëB‹QÑÖÖFs©ç£—pQV‚E;Åk¢œ—q\Á†¶î£lä©P²~@¤`Pƒe ž¦< xõ4$tމÉ× ¾ E,'ô°êåUŒ¢0ÈÇÄ”m<½w ZF»kꆱœ1Ñkò"ìûl‘q U[çÇ eAµÀª„/é"Šic%äÔꯓDû‹þ;¨s³Í-ÅCC,±«äÍÊuª„ŠûÑ„ ÓEˆ;™IûéX!1βU2Œäú‘êÔÃ`tÆŽN£U§7C¨£ô,óR–ÃmEòÚnn:,Ç1Û\Y ÎõÏnÙ·8tæ3{wJu4À:CPmj],ÎÇÀ[}ÀKLÞ:­ºÀÅxDzèô©w$Wº¯Gè(ß¶ÍV2 ¬c>UÅÜlèSr³jÎêЫjý¦98BþÉ‹ÔJç¹÷/øÐUákäç¹j‡› --^&»dˆù‚#F·«Ú11ulx«ÿŒMõÓÕ6(HZÓæó‘Ï’+;ÁÃ]•EŠÐ5&ÄE“R{LÈØ6&åÁžüïnÿjSê¢OÈi§´s™¢]¸ursÙÆ[¥2&ÚöžÛïx›²p¾MIK;Øõäè]°Ïx’”æ_g2Ǩxù`°Ç‚ZwAN»Ó¸ÄÕSÀF h$®næ«>žl+¶Nd¬<—²o›Ëøá.¢<—‹O›‹Í$.D@Õ Ýáš,äá®Ô½W<šƒ•i®´¯:=›éV+Ï^Äâ<ֆ騯ž3(ZUìó£¶­MÌ¡Ö9žQƒ¾­-u:t"ÒY c–/w¡7öQÜš›±cÍ=7U^;™Toÿ:fèìÚ’7®kÛzzŽo©Ù ¾wÙ©Œ®-÷¼öÿŒÉ÷¦%€BPxÀª¹3ÒïœJ{Vq¶wÚÎßGs ô/ç6QÂ?Æ÷ N+ûâîµ~Õiì<¸%va£ó¼pÅÛÆÂn³¯²1øÄÍní=äÓ•¸é;ÜžêÀΡë:TÀ|ŸË¥s%ßFærípl.µï:ñ+gað|ŽÑ›Öæb_9ýu0ÔòçZ…ÝgK¶Bá>G¢Vž{€eiÞç@õþ•$Äç¡:í—fz®«·ú£n ]~ŸN+ï­3⛳ñE#ûš4º÷éµ›³¤]pX·N‘ŸÝïë¦ïKrÁ­ ÛÇ;]dо¹8Às•ßÏ5¿ŸG ‚ß+|/üf*àvhïkœZí¼ï÷Á˜ÂTÂÀ®9ìUî3îwî€D€"€f€€U€30è0Fî+$î &ø×<ðÇͯ2D‘"DY"DÅSd±HH&ÂL’žH–½HÆsO”¤L¹Æ´ë‹ œð8 žHÑ¡L6áH1 L…ýH6±H5‹HcIµšˆ‰[Ià¼ð:.Ö•LsáL.ÆL±®HóÚˆ´ÏHõƒJ˜Hö˜H á8Í‚bµû S$cÜ'Åb%ÇG'rf8KfèI¦‡VddY¤^däAeJOdU8Ĺù©A™F‹Å&hdÄ|¤×A%'Be4]d¦\¤‹nÄBäguvØwMdCeož§HfXd³¥g t¤U+ùDD¤CdµL¤4{7^d¦Ae´{DözÁåÀçgæî@åBæ‚ äNVäV¹gß\äÞA…\qfv‡9Îfd®(ÄV_¤Ydýpf|iäüLänæmrºpæÂ†åŸwäŸkäž]ä?R @å¡Y`tLp({0’¿%¼e¤ü¡*ùÌKÆÊ'‰,Ÿt>õÈ=îÈ¢læÃOÒv°^d†¥—qNq_ñBóS J S³M¦Åù»¼Z˜-+ÄRHyÃßÁ# ¹*JÊID3GæÍçÓCÀ^–œ[ĘEÆXD–ZU–ÚL–Ú]–:@—9Q•¹H•¹Y–yD–yU–ùL–ù]–@—XšÅ!†!•P\¦#÷açÛ«iæDPåËAbèR•yA#–2Vfa^VäAWPUæw*w¿kV–Ã÷ÁÜ—«g–$N–L˜W4yB™xVQ–wp•wNVu]Võ@W÷QUHUYVDVUVOlVE~EbW,`W`æWÆVË©+k6-S  š++š,«z9+O,kÏ"k/,@*@Ë:kî<‘ã+;b?ÿl@×ÝIUà)–2d‚¶VV}fTÖ‚YÕCDÕCÁ¤§C…gÖÝS¯t¡Ø×!tÕ|iÂýLæÿJUråBÃ4Q7’H7j 1Æ7¾wÔÀãÔ%L6†KÕaÛ×Äo6®|4ÒáT`JÃýlV°õWðU5˜j6 K7‹Z5ŸG‚òû7Jg5iú&h4)F•Ÿ¨Õ åËß§³E5Ñjùbù—sUAM6€H× n5‰GµZTµZ}eÈHÿªìð{Ð,Aˆn lYª×oaŽ>qoZÈ«LÁÞégAíc×Q5Ãp™Mµ&Pw$Iw¼¥7ÛGuä;êbÖõÝ…eµ(Á$WF«nù%`µŸŒ¡Ìw†}K!–I·FEUkvtTuuMui‡wà½ýÉ]ïÀžïü—ÙyúÖ&°á‡²ãŒn_R¡U¨¬å‹ Ðþ‚ÝNÝdÕrÕ´·Ùu@Ý{$Ý‹æÞA8ù‡’£yª;,«æã#©r³›X¸ë há+ýd­1/ªÖ?{ªiç«&ã²ýV/Tu?Ìt?L⎣?0CKp0ŒBÛ¢tM.uÓk°u0@­Pùè§'×”"{ð¶Èt«§«{` ”j»ÿlàì®3­ò‹¬^xjàà©6 mà÷­Ñé\íºaœA¡rû*©nX  9 dæìAFè¢=ÍþÔÌÁïÑ‘ÑCz°£2Í äCÌÑå)%Ã8ÀË–=°öÃb°cªZuÕ›åh÷@hÓ@ÿ°{¾ÓqK£½F¢+¨»™´G £Ç#ªÇ‹*‡¢Øì¾ÿ”aò£ìw£k×ÙEÛóŒMkõÁÌ—«mùée ö«zwùGWèh—v×ÁN5\çóh&dçšá|eNO ]O9]O½r£û×$MŒéâvN6WO2LO2âv5ÒÌ,ÉÌd7Æ)\[h?üb<;¶§úifûx€™©ƒã:êB£Aã²*€ [iºæeF.¯GV¬çÞ¢ç^$¦”»gÚ¯ýN`gí²'0í'ú¢Ç˜ª€?¢j΢(¾ÿÄMBTƒU>w”àÎ|T/àÌ,лÏð†´ãö¤h÷ï À0 s£!ùÿ‰˧iRÃÁœå^h—îêÚXàžYâ ¹ÎÕ£XªÕZ̲îSÚ.GÞ‡²¢£ß)¥ždÆëW=œÏjçºYÒ¨YÑ‚ "˜1u¤\BS˜È°žÏ A¶…ÉÍÞ‹ž¨Ú,ÏÇYQž¡ÂšYq±Ysû °•Š©ÁÃM«Âñ_@IÖ¬÷¯ÚÂ-å{Õ1ŬÅÁm$Ðé™óxÔÕô]/ªrãUY–ï—à ÌÓÁM–ý¬b“ÓlÔÜlÖÅxÖIÁÿ„miס) £uÅdö=wUòw˜8U¯÷â­:ÃmMÔlOÅ'Ã9·oÚL˜Ä«K÷½Q7ÍXµ«@O¿En–õx)U÷LËîžØìJnyë)Ìáçú{àwëÌv{¡xµä*Ã-y^¯ŸÁíûîÎúX…in]é¬âiï|ÆÌwÜLfïÁv<`Ö+C¡ü°jpfðnðbD©ŸÿÊ’l)c©kigéoá˜éޱӾÜJj½ÆvˆF—hg7¦fÐÇ"oÖ ‚ j¥g!ý@àOgû+Ž[Uø€¶j¥w;C¾:™²†ÁoN<º7äl$tO0gs¬fOmnO·/ŽUéΜäÎ\lÏÜbÏ195=3;7¿°¸´¼²º¶¾ÑÞØg Rµypxt|rzv~qyu}s{wÿðxŠlü²'Nò¡ñýø…Æ•¨Ï‚4»†i@®ô2yf•‘h(‰Âd¶Üo(G ‰¿ÏkU²‘ËWhO4–L¥1MfK6•ÎðQ®ÿ†Úæe綃Ɠj.Ïž'Äkr¶À-ÓËL°l®\©Ro’Kü“L=™hÜÝUÙR½Ñ”W.'KUJ©ÅñoÚ>êÙ&½ÓìrÒ&x-J·Û/üµ £æ`('·É]F>ÜÐELîø^/¨½–*rÛÅ^ËV“­µÄó…ò3Gð™Æ«µz,yßá”!ú8ÙY±%ŽÖ»½ðßÒ‡ê «C…Œ¸O6æÂ㪸¤ÔYÜö—«p¯¢Êvuoþ¾Ð1¹^o•Îév —ç—¢µ¾=m‹+V¥•º™¹ÎÞßÏÁ€Ù®ÿŸÝb<Ì ÷£t7DA×8ˆ¶€2ýTÕvdçƒv\¯¼Š1|åûòBKB.³=ÍàñÃȲšöm?ÊRÓƒh–ÈD0$âq<#ØÌã|v: ƒôŠˆP [ÌÂЉžs=sÂA÷5\‚N <‰NŠ=¬‹“´HÑRýX^_$Ò@ß§" ³BäUwýQJ3 ðóÝ,:S¼MÍDÍÉt]bÕ‰²0<Ʀj&ÇYQü ‰­!éúNßå+¡|ºØåE™ýÅGaM$×aïmJI¾]<™I Áj‡™¥_ åUMl„ä…+‹¤X&°‡tY;zuÒ \fe"€«ÂÚ“œ«£'X3㬥:Ò fÔõë"¦æ_gQ¼peEE]÷ÍéM§Xá™nÍ=ÙVyä_Lã¨2‡-±–;9ñs}R¹+€F+ûlˆRJ NÎS1k5{|Ƙ÷Öpr¢ÑsšæIìOò°XxrÊ? §u=³ª8˜E(mÖºƒ̰יvý×3yÈŽ³VkbìçÐì=ý¼sÛÎk6o;îg5o»Þo7o{3ã=Qûˆðïáäµï‡Ñì·ïGñâtœ4˜ú'€t³ÚÓl·Û³ü0ºÏóâ4ÛÏ‹ò²ÚÏËê¶ÛÏ«ú1º¯ëæ5Û¯›ö³Ú¯Ûîÿƒï€ ï¾Aq0â‚&¬ó~œ¦¿ó~šç§÷y^–·óyY׫óyݶ»óyÛ÷£÷}?޳óý8Ï«óý¼®»óýºï£÷û~ž³óûyß«ó|ßÝùý}çJôc×û?+ ðõtpÞ Fçÿ!—€Ö¼ÄœÎg€÷¼„ñ@GG̼¦)€VDï¼aˆ.€5 窀Ë`™.€wÂÿ¼€-D +BÚŒ—)DN&ãzˆPˆ6¼ ç¡Ô|ˆTŸ. ·Ðy6¸ˆ‘ñõJŒ2e>D›Ëa¯qR5>ÄØGážIŒq±1FgP©’ —ׯA#þÁŸBztòe1Ö1OÀGvŽÕ!&¹èSrŒ‹£Ù!eþ—ë½M ×.>c³SÊ|L.)øË 59Û¡è”o]BŠ”Á)oK—Øø‡„Ò*mjåbıçO)í_Îi¹Mºô Tcº„ŒIS®§Œùî*FJ.žMaöœ!‚ÊIËÝÆø~cÆ$Jqh§´®`R.QNY%ÛÇœ-röN.“T§”{–2?Ê9ßS弣ƴ’ã~MY¤g|ó¾ ÿ¦£KEäR \rK %ägºœ !£ÊEÍÁ%’J†»OEp%äÌoó©|Î9fÒÐ‹Š³N ”:gzršr)£¨E¬3§DÌ“K“ËÅ #2N3î¥M… 1•ÿöÖg³ØXËCxˆÉR,—=c›óCa­Xk.•sÅ’K’I©”¹5U[À›kT}޹ >]_*ØJLÕÞ–stkLD©D·6Pó‡ g×S¼l¬tÎ¥ŽY­Õ¦brY Â,áæeËö™ 9¯Ï¥ü*¦rqÙK¥,®CÓý µ™KÕ®ÌÂBß–j3Ù+M+Æ•ø†–Z·™+]ò…˜@x¶ÌÙkœ®õq¾ÖƤ™kî®yßÖæ"Ù ­®ÍõÞÖÖ¦™¯®­}@kûì­CV×ö9_[çÒÌ­KW×νo[÷‘ìÇV×¶æO^ÝÛÌ®Á=?ûÒ!wˆƒë¬ï?ˆQëBýÝcÈXá©õ}ˆ9×>Ê>ûëõ}DˆÐ1..÷˜˜õ}Œ£ç?©6ë˜Rô}Â×1͸û˜2÷}ÊðâèûÈ|ú>ã0㜋uLCØ9hû˜J‘s‚ì¹Àµã\.“{©4ë>•à\mŠ}˜âÌøæzüSËU•õsmÎÿµÚ‘ûÚzæ}cç5ææëT1…w#ß÷µœ0ëÔû–s+úö5÷dëÚuõsïÖ5ŽV甪|m`Æ>ö½Å¢Œû>ç½´6ë:ãÅw©õë} lç˜åûÈÿ3-ùûV\æûP‡ày­¸ç±²8Žþu¿u!øŒôò9P±æ¸'Ÿëߺ}Wã=ÓÈóÞzëýH7ë“Eøé\ëýü›¸l!xÚxÚýb çY‹ûy|ûþØ+óý\é{“¼é“ûÖ¶x{<¶~o¦úúê~‡œö×üÚ!|A0]jÙÝÿ@zþbø®y©ûù9‘@ûÖCøµ°x§q!®¨¥ùáŸ{ bzŽy£K^„’´ùƒ†ûK§ù—¼ù¿“Q©»«Cx±—»t­¹÷œùÂê{'@8ôþuxNãa]÷&to ’Âô‘#÷•å Á a€ôòc¡T ¡–Ú Qt!/w¡%áð1rwèƒN-²7Âp`/­y ‰H vä3P`ø»¿hºûŒ{½c¸«K8*œûûµ‡i¥]©…{—‡sœ‡kûæ øe¾J¾„…3«‡¦›Å·GHK¸‚ʃ£Û# =1"ÏÂ"yÊ#Õ#s×Ã=%B3Õ²Ó|Ì(BxÛC7žƒÃdíǹê$Â1£mØ£†Õ£$¢êÎCÜÏ# (¼@Ç#MÏ£¹Æ£Ç ýGÕ£–Ö#ÚÇc¶Îct0\û åRÔ%Ó0£‡ÜcÆÝÃ.1Ý&(BÃ9"‡)b4Ì}ªÍcV$¼–×£7ÖãFÓ#÷×cî(¢hÝ8Ç•­m8‚íÜyÞâ]Ú½Ÿ×c38â‘/\¯9Ü:âd1XÆÎÖ"3$œÝcÚ$¢î xq”‰ˆ¾ o.zäÁDªo rDë‰haI蜉Qm ï‘:Nï˜ÉhîÎ|’€H`‹D銘•öäúö$yõDcH?†ŠÛu£sYx Ÿ‹ñ¤ÛòDý W%ÉpÖôäËó2ÉäJódòÔ?Pixê‰Î”©rÉ ɆiéöjöL’"áÂrb圩yê©‘±Øœ>¤ç©Sã©;e!‰‰ïéŸjiÀi ©ÊqiXÞ~öPœIÈj¢ZPgæ.zéŽâ)œY¨œîˆ™È’1Ý‘i1™iéã×Y© Pñ%iSPÙ`‰eÿ/€è˜ªF˜Âe˜"™œµ–Œ™=ù›Ý×Þ¹ŒéŒÌžº¹~üØ™eè™oYšØÉœ·éœ{þyœ#h•™š‚¹Ô‰h˜Ã€ÆÉx7Ÿê˜Áùåwž<éŠäŠÚˆöX ¢w†ì)ŸI9¡QI‘£ù™ñI¡ËYs>½(b­ IÖ©¡ : U÷Ÿ(j›':~^ ¡ž¨ ôXž ú˜z ë™£³øžô‰¡º’ÿ ‘X(¤ÌgŸW‰ŸÅÇBg‡Ä£+Ê¢7ú¤%Ø¢x‡|Tš /x‰èŸj¥É§£wHœPù£ðé“BºŠÆI¤&÷¡)ó·ŸCUR'VYRºÍY§vžUzzW –3*^(™}ê¥|:‚cH¦dZ¦×—¡º¡gºˆ*rF “Hšk¬ÙX#V÷u˜þxª„Ú©y*—*ªöªƒ-ȃ/葟º˜ax¨š˜¨ÉùžŒ—'™¨‚‘lz•nŠMJºY‚¦©†)H¦:~‘Z¬ž £Ý©¬¶È¬i‰ªÍªªÑ‘­ ¥ŒÈ„?ЍZ«z›Z¸Ú¬ß ¤Ž·†§É†!:F—Jc8Å®'VRÈzŠÕ¯Éz–}Z™¤:–؇ h”-:¯jGØ ¦Å «ÙJ«Üª¨K®J¤Y·r» “½*¢ÆRßNÄJ¯‰¸«“zz{÷:­[Â(ŒS该²×É;¸­Ú°«­³:®«J³=ê”Ët“ y¯|æc† ¯#˰ù:þ´)ª²8Z´Ûh´dX²[˜âÚŠÎ:­zÈžëéÈ­ k³ ;¨K´Š—³¥±1™®ƒ „¸tOÃZ¢ñz¬LªJ›´˜ŠoK²·¥Óµ&;µ …ž ³kµ.;¸€ë¤àJ‡b{³á:s;‹šf«Ÿhûaú´‡T§*Z·ø±¡B‡´+ ƒU~Eɯš+µ¸{…{‚‚;°©+jjºI˜¸‰ëyd ˜kê$gtZ›n‹¹Ë·˜¯Û± :¤Þgº¹°°Ëu¨Û¼-{—j³Ò›°íù¨b{½ý׸X©Zyf]™–½ë»®·¢(¯¥û¤ƒØ¯ H£ ë¹ßþȼè÷·ò›{ÃH³ö˵¶ª×›³xX»’§i#R«”Ã+¾ŸWÀMi ¼À ÜÀüÀÁ ÌÆ µo¹±«uô¿ü7¿¼Á Â<Ê¿ûûº<©½èÚ³Þûš(x¹ì|Ê›ÀLÙy²6Œ‹Œž`H~Œ½"¬ˆ‰9šßjÂù[ÂFL¾{è¿w»¿Z˜6y“wúÂ_ê¾PGÃFkÅŠ)º,Ø€4h¦*ûÃyÆ ¨¿8»8IÄÊyÄ%,Å(Ì‹*üGýi.,ÅSLÅV‡Å#‹Ç ºÅëû]ü€^«~aÛÄ<Ȇ|Èp‡ÆŠ«ÆøKǧĔ˜•M\O ²áëÈþv ¼U§Ç1ÇÉ4\‡ÇÉÊ¥ŒÅzqqž¬Ê¥ÌÊGÊíx¼~{2(ŸŠÈvWÈ9˜-ÙËŒÌw¿Œ½˜ tm\©¾Èáö½ã{¾Ã}1ìy¨,ÊÊ£ ËÓ,Í£\qŸ¬ÍgŨ,rÛ<ÍÝÌÍâ\ΦœÍàŒq«ì§³< ø}àúˆ¹Ü{dz¼\‹Á|Æù¬ÈÍ|v<±4in•L–—ÜÏ0ÌÌÐìÊäìÍä¼qzìÍ -ΠÑå rÒÌÐç\Ñ ­Ñ}Ñ×\ÍØ¼Î9ÙÎ,‹K ‹Jw¸¬tøœÈûüÒ/mÐ]Ì·À¦s´,ÓHøÌЇÇ>½ÐýþÊ ­Í?ÎErØÌÑýÐCÝÐ-ÒAý¬vûŒ&}”(ݨ;çÒö Ó\ÝÕQ¬Óœøµ¾mÊÄ–Ç©; Ö_ˆÐ==ÔMÑãŒÎÜlÊE}Ô÷ÉÝÔK­×ß\ÑP­ÔÇÈ}¯7Ø}\Ò@zØÊI®i¼ØÚØðÙ­Y½Õ_­ÖÉÚ¢4­Âó£ÌoGÙyŒumÎ@ÍqGÑ ×Ö¬Îs]ÚBÚr-×OíÔ¬½›§ )§{³}u·Ms¹Ýs» €½­ŒµÜ´ÍÙæGªÿlÖ59À¸IÜTèÙ ªlÍÔÔ}ÎIÍÔ¡ ÑÕÒÑ}ÝÏÊ!Ý×zØ¿ítåíÛÂÛéþ­ÛëÍÛíÞíÞñÍÞóÍÜH˜s—•ëš:•{tö½‘ÎMt§}×±½É/÷×$YÞ‚mÛï Üõ ßòáô-áîýàNáþß_ŠßdÍ«Èí½ÊÝwî‡.à'‡Ýg7à¢ײÝàæíâ^á~á^ã2nã1žã4~ã<®ã#¡.|çjÌ%´ßNÌ«÷ã*ˆÄm}Å#­àç½ã>¾à.NåþâWnå3ŽåJî|î—ç Ðg âHN”]™%žÇO^åQÎå8.åpîæ=çZþær>åm~æ%äçšÂú=Éü©ÙA§ç››æ«âà å0N犞å¾åu>çwçþ„î_Þç‘̽€®Il»Ü•.€LÞ|<ê ¼¤nêê¡r¤ÞêÐ]‘‘ŽçÉæ´îèµén矞x|ÞçD®®›^±vÖßI·ë >Ì‚7ØÙ´TmбÎè³nëÒŽë·nçÏ>éØnìîxé}.æ7èqîk‹Ö›­í÷êú*}±®}„î²yí×.ëÓní¹.éð^ïæ>›½>ä5=É0&îAKïÅýÂ7{ê.Ø ìøNéÐ>ïöÞðØ~ïÕNðÛŽsÇ À‹bбen ï•â[{ë{Þ¯Ékñ>.ïÔ®òßò0Oï!Ïëo®üþƈÕTíð"9þó"_·´¼Å¦ˆ‘Rhð/ôÏò2ïòô>¯ï5æ ªñÀú®¼åñ_wOßFËÅZíCïξKñW®ôŸô/¿ô1ö[O–û~š¿¾šJÚhËNÄ•õIÞö ;´\<¤ .öyû¶d¿åf_øiÏökoøM¯÷{zs/Ép:Y[Y!^îŒÏ§Ä‹ô_ÿ÷fx·]ïô`¯ö¢ø£¯øƒù.ZóB÷ýNq:¹ÅÇÅŽú@Þ¶|¼‚:çùL¯§/é¦úLßû¿Oû)Êíaþᡤ».âÄ/‚ÅúÇf¹ù¹ÿ´¼üÖ_ú‡?üÁŸçÍoæªéq¹+Œ÷ÞßýNþØ©ê›}¸o…xkªÂïð‹¿ýhÿ‰Ÿýðoþ ϸ.±ÈÏßËoùä¤Õ^œõæÝ0G²ô3UW–ZÐ厮í¸Õw¾Îð P"týŒbòxQ"—–&³7¥V­×‘¤à2¼_° Aùœ(Ænn\>§Çòª»ç÷ý=ÀÁ”Á C©‘—CBHª(¨''KELÊKÍÌŠIÏÊ¢ÍHÒRÓ©Ä®€°V.5´X¶¸·º[º;ݼSß_à½ÔàÒFcGFÇadâgÎhÐÑNÑê Pljíë¡lïmpèqòSfŽ8×°±Ùö¶7[\ù]<Éò{üûó|+þç“}HB_¯pr“f­!ÃiÝJüä0âÃ5ܱ Îa™‘E’—xónéâeoãK˜X ÆèïÇd5Ú¤)ìÛDŒ…B*.hE¢I^dZ´çSš3-ÔšÇΤ;8pîl¥ÇÕkWzµ\B%[öƒT³?xnX{ ç2mÓ²@ºÔ©R MñÖÍë”ïߟsCCKÁ£<]í®¶A öëcLJ¦l¶0e¹2Ÿx«³ÐæÊgòÝ;ÚtBÀ¨O‡f첪ò¬®ÁšRåm7c[ïÖøÚ2h&—g/ œ÷ÑÕÉõÚ-­Ú9EåÇ¥ÿñ}Wâ«‹qo;yúþwÂà5‡"<î áä§–Øúsäð—÷u/Þ¾÷±qÍ.Iû]ãIÀÄBå>ÍI‘²@½×Ôk½ ê›Â £³Ð¯;l¡º°®‰6íðD³jé@[ì÷˜$ôÄ·âè¢QÆÁ0¼‹9éëQÇ ƒü10‹$Rýná/ íàá®]PÒÍH*´ï‘y0ÏÆ,pL È…ôqL0ÉÔpÈ…ªTsÌ-B\iÄþda,«'å`IJ×Ô³ñ¼l¦‡uðS­ûÊÄÐ3Í”ÃE÷\D:•$#;ÿ²²íÉ(sËÓQNÝšnЂ¦ÒñLJjrÍ+¿[nÚWOݵ½ïí¹DÀI~x± ×r÷=u]×_•u?"ï-nºs§Þvì‘mkÙº=R¾s [Sõ§Ry—%QrŸ¨CÿÃëkÇüöêãßüHvÑ{àS ®ÆxVŸ‘î·¶¡}N„ôô?ú]Îz4s^g×¹jQÅo_ûÙÿÆ—)ÔYpA„K? ¦6µ½¯yD‹ îì÷B ŠÐa½ãÿþæ¿áå0Jw"ßñþd«|¬a„X]U(DøÅP30t¡ë÷ÃÊpocô˜èt(¼ ‘͇Pa9¸E"R'zDâóž¸D'J‰gäâ\ô0*`NÄ CØÆï-H,#Ç(Æüõ1'Mô#Õ˜FùY §Â ×âøÏaª[å[$xôè6­ $áIA»†2{ÄY%3òF¡=r_u²#ÓL©7ƒõQ…ü£ûL1K Ò‰\ã!KùÊ 6²{ª[®@èJ`FÑž¤dþNÈÉ[â²—„Ü¥(ç7Êd^PÖ#¥ô%:VÙÜ^4kyË@ñ’¡ú$±©ËwRórää‡%þEÌÆ@FŸ‘!é9ÃtFëDP'ÝyM„’²šÙû'>P)>~S+‘ÙçW†Ö̆ÆLÅ(ã¹Ð„N3\ Ï6Á9Ð5i[UA&IŸBP—Σ!…'Må)¿˜®‹†ûSåJvÇœ¾4¨CåLM­©P_‚”¨æ½YEŸ*©¥K=¥ú5XÀ_ ®ÊU|Õ«ZýjWÅšU ­%P+YÕºÕ³Na­#h« êJ­z®kkZùêV®î«¢1êG“zX^¶‹ª òÀ]/ÀÍT>UŽQP;=«|½k_ÓªÙ p¬£¥+ [ÑŽ•´;ð,Z[þZÕ†«]Á_7;[Ò¾ö¦#EjbwkØË2µ±X%J# UÊ¢tªÁ}`fc›×Ü‚6¶lÍ­XŸ+]Ýn ­eÕë[ëêÝÙÎÕ¶ÓÍ®òúÝòš¬Ü=/wU ]è^wµéå@g­;^ñõ·¾io­É\gw¬ìíd!ÚÓäŠÍ²v(lÇ]솠ͯt];Ú¬f®ƒý®|)ŒW;wÀ¶+‰5|Õ¿vøÁ&¯„YÌâ “ ûeMý \118ŒÞnw£DG8à3Á“ô§Ž²Ú6Äóu1~cÜât¢-*Ö뇩\Ý%C9)&1uß;`ü~yÄXް…Láþ'?‘“² Úì¶CiáÆ6ío¼4¯·Êoð`X<ä’êΘÝò„Íšæ&£ňO› ƒ²FÚ»à­î¢³LßÐJú­^Nm{'X'[ºÌ%öð¡/e7KyFÌd&ƒf¶ß9ÏtÐíë€}A]\k yÈZ$ଃIjضӲ…У߬ÞÏö ÃÖ*k‹¥êf°ÚjIhb-RûZ &í3¾:6Ù]_´ÈÚÇL˜Zg'ÛiÆžö…—%MÓzù&ÈŽ!æzì5o¦ÝïVvmŒmrÓš¸Ö d!î|™¯d7¾oÓXËáÂ’v«ó͈a\ûß…UørUaºþ<Üa™¸;®Óœ6üÑ*ù2*î–SÛ3ž‚5Àe}ò^ç礹¹“RôóõSåC:Ϊc¢ï;G8Ì÷óF?Û\¯9ÕŽç¸o"7н.NJ&]ì+¿z¿vDf$æÑ4ÕÄÝ®ô‡¦X6§»bË.è¬ï¼àù‚*UrÌqªo샿l ú„K¦?[ퟄû žþøÄG*ƒÒxÕ÷{w¼ä[ç;¸#ÉVþ”ƒ'=ò¶”GÝEþ\ÆXüò@õö—g\&ç/bš(Ì'1ïŸßû·!éwßõ3ç$ýػشO¥ÞßcÑ›.{§Ç¾Øª‘ÕmŸm„æþùyïöïn¥Òí/кÿañ_OòOȈëS½âUþéG[âí_Væ¯Oçû—Iû°Ó<ï#dÿŸ±é¡ác0ó;?û›;­aú›>uJšÖCµU‹¾ca>©KÀÛ³¾ÚÚý›:î > Àñ ":ì@Œ;@çóÀíÄk@¡¼¤8†±À ,@ì«<¥BÁì? K©lÑ–(0­^“<46Ä:LBv“œ§Az@ƒ€=g˜ÁŒŒÊÁº»¼%$Íë¾ãò¼xØ!$œ#L¿òpB%üB´H6l¸„)£Y²ÁR‘B+L5¦ÃB)̦ÑÁüý/T“ò¿þ ë9!@ˆJÃísŸ8„:ŽzÔyÄ6d”&;¤6 Ô÷ÁB¹*@ÜÀÿÄEà6ä:ðQD4$@ <J„D“™<Áx„W|Âu[?/Éà |™Ì;~K˜.ô7/$E³S‚û?DLÅ,À„KZìC7¢=(œÃgÄ·Lt™\„¼M\7l\AP Æ@´;bÔ¯0<ÅΛ£E €¿F´ j„7þcÁi|œ(|Gž€EMäD}T#Ê79lQäB ©q¬¿BüÁ1ü½\ø—FŒGæzG`HW¤G™€Æç«E ”?\´¥|¿HË«‚Ì¥¬¡¼†\ÅfDA{ þ“Œ‘âÅK܇<|É„æ™ÁPÌ@¹)ɘÔ9CB2DàÀÛB ì’j<2æY¡k„?ÑEŽìÆgLäÈ'ìI‘$É¥´3âÚ¼‘IÉ:2ÐSʯlErÔÊG\½;¤Ç£‰ÊªœKDš©´Ç"úOäJüKË ,„c<Äs´”íXÉÓñ8¿”ÇRL¡¦¤¾™\¹ÜȺ¤ËL$¼Êpl=¾T¤ÄäÀ(B±!ËÂA°·Îlǵ ¢M¤Än´Äs ÊÉd¼KZ¾—¬OìÊy:MϬ¿À$ʾÔLIJÓÔM>QLrh{”HÇTØ”ÌI\¦u¼IŸôJâ4Ðþ< ÑÜ–³NâìÁÅô"cAζPÎæÛFÊ|N讑œšéÄמּÞLHÂô)áÄÁïÏb\—Yœ§,Oód;ˆ¢… ɾTŠé¤Î´”O± MT¾bGˆÌOŠüK׈•‰Ìz#ælÂ5ÔÈcÀÈR!†Í„!Í< œ42I„ ½CÆÁt’Š¢(u|Hi¤Pã´ÐõŒA¦ôÏŒÓÆ}䤯L¡’jÏ€3GߣŠQqÃO Ïý4‡ôÀÐŒÊÅGÙ¬ Ìœ‘rÇ"%$¸ -Yœ€ùÔµ]kÉ*}µÔd;ÁþìÑø‹M€ÇóÑÀ+Q<þœÅe¤,aQ1ü³Ó…¬Ð8Ó_ÄÒ7¬@•áRÝE‡âSdzJÖT"Í1N­ÄÂKC[@HDUMácK_lœG5HH­Lø³ÓåDÑLÝÖÑëVqíYìcØ0åÇ …%Bœ ’õÍÉ:Y"Ü…µUWVTCgtÚU-ÌBkÙwËU…B­ ѨèZ# ܾٟ…Vbª²5ÛD]V é³âYW¦%¹Å˜+u½˜u9©Õ·šÕU™Ü­•ÀõTÕ Pr=ºÄ­€s}QprÜñÓÝQAmÂQ·´ÛvÍÜ8Ó[/½XÏý\ÄåYÁ8óñØM²RÔmPíd\]aݰXZý *ØeOY<Ú Ñ»þl5{ÅØÂY¬Œ]Ž V¥*R­ÜÀH]“Å”m[•=r{^ïüõ™Þ ÅÜ>½Z›ýØÝÝTË]ý-»½lJ= ZúLD3Cæ½Ñ’dßRzÊv…_«ÍGúå\² Z”#вÝ¥›DR”™‹ºæ«e[6ãvCàqè+ìý!L³`eÆà,³s£\9ÝT~ÒÝ¡¾ãÒ¤dX›œåFÓƒÆãd-=ËE7Šc®tedÆ©vw¶¤èFB„ÝâÃTß}ægü•9o†³ä\âsža‚öhMîä‹Iþh)nã¯mhðxè<ŠhK˜gFG•¼g*`SÍè…èÑŽFBM¼Ì†aB<—¶*ëÊ´ðR3í/f;jL‹¯ÛÂ-©féé2³”Næ…Žj*xê£&6%›j«®êÕš–x¦±‰.ÊtM_´Ôé0ÉVŽöiþЊ…àäKšIÛ´ò1¼êê1k­{®aûë§Æ0¾–­Ó5ÍúëùRj”å«fhE5ÎÚ«ì*ìf;ìîJì.[ì†.jÎ!b÷ET'éÀü»|Îc¶f“8{ë ê îÐBá Ûâ² 3Ì–êíº/ƒ®íB³PêÍR±¸Úl&ÛlÏjl•þÝï=5Í5Ãn,áþ3Û^²$£j‘3+^jNÕ(•ÑûDm¶&/r ¸S:¾n¹˜lƒ.îÔ îÎÞí±^êæ®µ¾jjÆÞkü6³ú^ï²Îj¯UîúbnF#6û~ï©®n Ûo=IÙÅMå‰êî-ÆéÓMm ç[CÉÛp '¾Z³ê4ëê×:±±>nÉ>7ŰøÎëÙ^oogÏÎFp·²lt;¯fë2wqþ&ëv9käzSmöbuvãBQqÚz0Á&pßöñG¶—rë†ïÃ~qßN¯mO2Þ®qϳ+oî÷êWÓD‘iŸÙ5 '^ ÷ï.§Vgä±®ª²E£´þgñOÓëøîüþê4?pøZfÉ>tAß3ç†ò^- SƒtGôЖtK¯tL×®¤žM÷1Ýôü¾ó;WtRײ?æ ?Ûj9žÐ8Ÿóu¦ó‚RñŒ˜q[ÿƒÊÞñGÏtvšt_¿tWûu^§àa_ õ˜ñÞîƒ\rZsãUV4W6` ?r†ªó׈[6?q4ö^wbvq7v §tr/ös@ößo×uÕqöíNF„+ò!¶öìÃö7²×2÷]Ow€wuÿwøq/ølGv'[ºasà‘öV¯Ñ8ÇwμZ°Ö¢xÀÝw…Gu¹ò¹.Þþf…¾öYOxó,lwëøwö§g7Ÿöœ~uX—óOÎJú~fžïyŸÿy /f¬þï9ƒî ÷—8z¥õxOõyW]‘·w^ù{iÉù9$øƒßzGw„çúsvƒ7'¼¡§2qø¿ø‘7ò’Ï÷“_@– ûr—û÷z°×ú®¿Ðì&ª³Wu7²µ¿÷¶¯xxV¿¸Ç{º7ø¼Ÿ{Äo|½ïï˜êû˜'íp{sº­öÁÖÏfx}÷òÌ|È|yGUD,€0}Ô?}ÕO}Ö_ýï†ÛW§zë´x‡Áú‰tlÜgç¨õCð…ùÑns×o}áþÓŸRðÖiÙ—õ$oA þby¢‡O?9±²±”ѯW¾ƒ~§Èaˆ Š¤è¯ §nÞrÜ5qá„Q礜Rg²•­xðbÑ+@ËÖ½9 ;Ò¬‰K"N‹uF´ih&G>|XäN¤=•ŘÔ#ÐmC§¾izÔ‚¹‘TL²à Kx+[’±÷Õ´jÙX½xÕéR£nç®eV—Ñ]»<Û>…Ë7®ßœP‘DÍk˜.à·¢`jeÌ•‹×(aYÆ ‹æå-´‡7sNŒø/hÁ‰Ö:Zjk©µ­Æ‘͵T¼±Mã*ÌótçвjþM×µë×w–ÇT63ÜìMÜʧêf*:ðr"¶õM? mv$ì¯eoÍ}ûÏêr£snŽ•±Ö’¿!£Nœ e˘cÊOþ~'óÐïÅÏÃ~2´Eww²H j ²¦ lâƒ^þåöÜbî4ædÀ¹#VòÀ2‡ó”%Eršø~Š}F!b'ªØ‘€Ë!¸ 2øv9 Q<¾è¢Z)†„ÞHêeÈžd¯ŒU™|µd&Q"Äb_? Y¥”-£rWz†%˜_Šéå_Ÿøøc–CyÉÛHª¢!Xñ€("‡#®¡YšyB&•cB$å™éég…òwèx„rÂåþ:¥¡ç’ž±’$YdÍw”zÚ)¢û%ê% 61ŠŸ‘Šºª•Öê§jöÉæ9n®ƒdœ*eš‰xÆú+a}¦ªžŽ†Wlw7¨ìŒ6ÖˆãŽàýqjÆ»è¬Džcä›Hºb\-mZâµå 1ì¨ÂÆjmCÈ‚×,´Ì&ûì²ôÂ;-»Zš»ÏšT\ˆÊ‘—æJ,»òz'¬û*,Žª­6¼â§ù’›å½Ïë,ÆñÚ{±Æ€P«ƒÄ Oìp9ÚšRéz—~K°‡ë«È1³ 1±4'ZªBOøp˜èÎܳ«õ…¦Ìàôkaow+°pº'n¯ -³Ï$§{[”CþW¥µOUÛü³¢W+%×\O¡Ø’6æXÊí¬ ŸÁi8I_fŸmº<‡ ÎüØ]“×@븘B?ø÷ÝFmV­JßÊt¸qÛI7ˆ'~ᙯë·å Yü.Çõf,zÇ¥“~ºá{^ÞO¿“‰rÀn§$y=ssZßê1k>xÐ.v¾ƒÎå…þ¹Žò‚~¼™‡üž;ðÙ"ݦã'm(-Õ»t½õÙc5îÌ+¼{Í‚{º|µäsŽ|´ÅoŒ¾ñ[n¾÷vè-RcÜ>.;õØë¯=ÿ¶ÿæx'ÀðQ,ðã×ðȾõ©otÁkT~h@ç1®¶’^צAÊUE‚å_ÚÀþÖ·:y# EÈ–¡„ áèG©èihƒ6¤ßÿ^X¬ÂðkhÊš3Xˆ9‚-…V#› tD ®í‚p¢¢è)RqŠÏË¡ 8ÀŠïf@$ᣌèÃ1vQ…„!Ÿ³È–l¹n[°[šìª(G+Α1XT#ÄXÆ#î.4šh:⥯©ãÄÄYªjÈà ‰tÇDšH{ãcžJ˜Æ¼²}†dà'(±MJ‡’~dãÚì'=Er §xR÷L©E“i: )KÈPr—žüåÖ|‘KYžk‘IkddÙÊ“!,–ÄÌc-ÉxI}ùŽäE™þÍ^nót¹f)ŸéTÖï÷‹ +Ib27Úfâ”% 7Bl…1š{”¦%wÍkRrqM¤!®Ò9 yØÐu“|g—ì9Í{í‹‹âç·XD…’J:à 'B“H@¾ *{žHHÑFv²n=Q<:Ï=At)•¨-ªÏ ¶þddÛ’™ÎW®“™DÛIïóRZFŒžƒê$(©MAzÓXU\P5ÊE5ŒÔ•æ\åó&ÅÓr¶SjQM(LñÙ§•âk|¾L*Z—Ê˦Óh_àüjA:R®ŒiãH êηâ-¬ •iM]z¬0žU­Jå&SïÕÂÀ>•¯D-YUÕIWþt‚T2–¨U»êLÇöõ±S­(47>Š’Ö¯…ûO`ÊY“Ƶ²è˜lp*ë![4D®Ó«WW;DÓæÓ¡Ó**oKëY¾/µªÕmãÙË"%)L^‰Wîg{‡Òg5»Á=£ug9UZ͵¹ªàlgËQŽ4¼ÌÁîD±Ú~±kEªaé…Z÷’õ¯ëe¦yíÉ­¶—¿¦‚oLËä[5â×¾‡ekbCg`‘Ýô˜9ís}šÙŸ®qÂ×ýîp8_Èc°@‰%à!§øÄ•¬/„ï ãcÀŰ12R ³ØÄ-n±‡‹ÐºT^µ†®Õ–z%[ÒÊþù.Ýïh…`c«¸ÊV®2•4ã-w“Æ¢r–y1å ¸xÊcs“¶Q›Ã¼ÊÔ°m5\à4o Áb•o5¥|åïØÇf6±žœ`;×øÄ%^1šuQf?ïùЀî3AFÎøÈy%)‡é´úÎQæÁ¢¯ é2ã8Ôäéô_{{ãGÙ¦.µ•ù<êM{ ÂÐs³]/ÍÎL‹Ö²±wǶ`¼zÕ>ö¬…JhÀ.(­nõ2ŠÍjOÛ×joO™{aòÔ¶U%pu­]g`CÙ‹#&ñž½ãC{@Í~·ÞÈlhC?:Úé®7ŸehqÛºq¸>ò q»Yq{þÞ!Îäö­…oÕÌ&÷a^c‚odÍË¥_¥!pêæ–âü2x°ëi‰“9Ð /7ÊEœ’£Øã¦å6‰`{ÞèÒº6¯9÷Xëòœ|ÐÀU¢Ãƒ¾ss ™«ÇùÍ“NsÍê|è~ë¹§Et¨§zÙNGxk5¾•mk}™ÍlúÕ'ñ¨÷ÜúØÿvñ‚í¿™­´×;:çµÃõàU÷°%ˆv»?üÔt—tÖÿùï9žŽW ÷ß­Iõ¾K}¦ÀÚ{ÈS^ë÷&^~'²Ì¡høÂW‘éL®|Dù®ê<“æZ—üÝ‹ùkÐ+æmæ:› šóϳþ”ig|ÙI/d¢/þþô“§|íùîvÉ=îô[rrƒ)Ñ[=ïÿáýí}OMs³Nù½;o|ö"Þúª‹¾Jøö¾üª_½÷S¯6£o;×ÙV2¯KŸ~©¢÷1íïøMo~æãÏOŸ¿úU€ëm]ìè”lÔ ØàOìßTá_µ|Öh Û¸`ÑQZûÉÖÒqò~ÿ`ãù výÓ­Á^V…TÎ^ò…`¦`äõQ -Œô Ï5U—,e`GŸ mÕ }`‡Ùà ’ ÐJ >¡i­àÇ1`¿• f’ÉY÷1á’Ý> ø]ô9áR¡R_þõaá¤áB’VIÆty^ ‚¡ÇLàý•aÅíKÚŸšaׄ`¾–ö¹Rm%b’IÒâ!¢JZ!Ö¡!$¢Ú­á⓪ÓÍÑVf)¡¦9b»Xb$×v™ êá%V ÊmbúbÌ"I(âeIVüA•)æá¦¡æŸ¢"&£‚±a¶ raÞ'z¸u\/>b*#%âGa4Öhü¡Ãù_2r¢ úÛn#Bc4–"1Ê"c ã+.ž&Ê¢÷u"€Åá-ŠÞ#ÞÕ.î^9†›6BaùÍ?þbŸ7N †­×VAz( íõcNãè­þâïQ+RäX©# ä屟B²I>6$mÍ¡J£DöÚ9†ŸÙ-Âc;ä4¾c7Îâ7jaH¾Ùe‘¤®í#F¥ä²£Fr#< #…e$5ö_,¤òÉãÛÑc·åâ=Ž¢OF!PeLã$N߯ äJ^$§âMb8nDbåUòâWòÝVªbW"å6æ^Á¹á2‚$QV×iÐ3\Zªef%GZcÞWþe&.%S-¾^NRÒ=&Î}]Dö¥üfRÒ¤ÉYÞÔ¦"ãK¥õ9%ñÑ#d–¦>ÞÎDR&+ åe¦² "FÊdkÖŸ²]®Àà]Æ–8ZP#þª¦fv¦p#Q¾¥lþ¡\Î¥2~¤†dofÖÜçq²¤îa¦q®¥e¢#WòÜmb[nf >' ¢¤t‚åpæQÁflbçyÎ$b&f퉦¶9§xrÜÖøÀgºg¾§`Vãuf'\jW~šg<Že-†g}¢&3àgyþd{Î&q&ç ²'kjçiŽXÖesîf‚Úç}b#îçvf¦u>^€Ê&Öd"¤…5f‡*è hˆžh‰ú]qêßtæ¨z¢ŸMj(Òg}’b ¨Ç‰¨[eþ烩„rçrzg×9Q@½(>È(2)‘*~Æ€•Ú(…¢'k¦¨mé“¶Ýû± þЧ:^ƒZ%€Þ^1(^diPÐè›Z j„x$” ‚Ögt¶)˜ê‘ •œÊ)ó`ió](Œ êŠ2çrh‡®©_ *h¥VúΞ2‚£&Ž¢Âi¡²Î¦ö(nF©Ìå¥3z›ª®*«¶ª«¾*¬Æª¬Î*­Öª­Þ*®æª®ª**„ÞÒ i¢Úé’'§u©uÉ'Æm`V¥¥Ž\¯bêU°Žêê|j¦2j£æéÙ(cr(ª.Ó³‚Äa+µÒ·:é´kjk£f(¤z"³ª©³Žë”+±Š©»Ž§æ«¯æBºä£öiB‚ë‹ÞN¢éXˆd€Ž­Û•ZÂBþìÃÞXÄV@ŲXÃZ,Ä¢™ÂÊŠuìÄb,¬1¬Äª›¼Q¬Ÿµ›¨ ì¿R§Eº«îø«´WÀú§Ó)+šJj‚f†ÇZl¬­lµ™šÏ&[˜…šÐ›ÑNܱe,ÒíÐmË­ÒV[Ô&m)­Õ:,Öþl²­,¾ê(¦ì®Ž-Ù–­Ùž-ÚÖݺVhóåÚ¾-ÜÆ-¬Þ«ÜÖmÜF«L xºh‡šìÔ:mÓ"[Éuíß nÔÖÛÖ*ÔnmðXÑîáþ¬âr-½m@ÖŠšãâ-“íÚ±Zþê̲mïxnÌ®áJÈׯë<¦ésÂÒ¾eîÂQ,Ç>ÉrîÉR[íîÇþ2Zî®ÛÅ"®Æ–,Ã>-à".®Éf,ì¯ÌÊ”í^éšãÚ¶l&Dô*Œé^¯a¤.Á¶¨ÁR)óú-ò:íëríð¯ß–¯mYîóV-ú"Çzíù"íÂþí¢­¯ýbnär/»²¥øÊŒö’køžâô†®¯2j—KöJ ÿÆÔðͧÎ6+ÂÎïîãJíà.nàj°ÐƯà^ðåîøbð‹¯SíøÂ®Ê~°æ6oûAÏîÕÎ0 ·\ k,ʾ/¾‰Mîþªmÿp1"0€™ïr€ðjí¬ûðé.pHÜ ç0ð± ÿïõ}§”2 øÖ/üê›íÖ¯þÇ:n›qÊ^ñãpò²ñ«±ðÈÂ1îb®±ì>±ñæqîòîèæ&ï¡-ì ñâÞqï€òbùRn³Ú¼¡›$š³°Q ñæZ/ï‚q%/ñ²Â:²(Ó.á®1³/ÆŠ¬Ø¾1%7®îRnÇþqÃb±±JÓ/+ëö¦z®/ó°"ó$›0s0C+2'ó(ƒ.3ÏD»Ñ[åFqÒÞ±îFo4ÇÚ4ײù6ñç›7»q$Cî7!&7¯3·1.©In(‹ò çîý¶ó«›´i±*ë/üÚsŸQq6ϱ%ïðÒF.Ëúöuq]¯@#q1Ãò1þ3C;´B7´1A'°-² 2=ïsïúq3m¡!>÷1›ïÃÚ 3¯)_³Ïúó2§¦¹>(-úº´6±)¿t%_t¯ð8K1>û³³ÜM§ïLµ>³f.çì9¡„Ûë웵rGL5§¢@U'‚U[5ê$4´AóÄåÛámö‚1J/ñæ37®PË3 ?ô#cQL‹nDµIÿ0)£5@_.ÉÍÔŽs@›p*Çî«uñâ¯B‹µ`£³J¶Rô©,TO1º"ê–V«°rªe_6döe§Àg³WÏo=stÇòJë4^ÏZ‹òa×06ßÛýBôû£9þ/ª][mÂn´iÛ²n'õ´ýõÿ¾óó5kt,Çup#÷7`¿Ü™ª’‘=õd× gSõf{öukö¦†6vw÷v‹¶}˜y“²å’»éñNëYú¢·zu³uI;ÚÕòDwÇÍõÓóªÆqðÚ´{³2 Ãwm§·€÷ôQ-P³j+#öjó7¸3¶‚·0Oè­A`ßV÷î鉅7ˆg6w·@ˆ;jxc5 %0e'ܤô7”°òÜ6Šâ·2ÇÁsG5aÓ¸cñ%ìöŽOãRK··ìl½N¶w8ho÷‘/¹’7¹ˆ“Àh×x2¨xmß·ZPùjRï—º§r#–wþ'Àx—'4|¹D·…+†G6Bs¸xƒ·vÇyvÏ9œÓ¹i<¹˜9réyš—3ØÊ%ŸŠqŸHãrtÙS7‡3¹œ{8£Ûy’7º€à9ŽÓ] ß²gz3[yü º‰:As1›o¸¥>zŸ:fCzg«ú¹tª!\ºcÁú@oúŸïá˜O§£nŸÃE#úG):ešzª£z¤³:’¯z”c‚«‡¹Ý®ªØ„H´7;µW;­1]ûy¶Š¬µw»·¿*ÝÆí|û®îz Aö¿‘ºD–ø¨²û lw¸;‰Szq%»ðÐ9v[›~kzÍVI¿[Ó»ÿ;Î ù¯Ó+Œ¢“þ»°;±#{ðÐ{6Júw©Œo9Œ$iÖpé¿ãš§{‚"¼¤3ü°¼È—¼Ã Ä7œˆ'üÕí;­«I l|~ļ̼¯Ë°ƒÞŸ<Ï7É÷ü±¨Ì—O§®ü²ïœËW$uT52½“y«n6õwÆÝßí¼Ï›üÕýÂëyÊsž?y×#}Åk;à4‚fµaØ|æyI’»Û¿ýÛ¶‡È½<Ð}¼_öÜã}ÝëýÝoiÞû=¯ž‘½¯Å‰O< «c%=n©Íš„¤™ŠºÇª¯É{e¼‰}æoþàw8ªÐû×}|Ž}_|㟠ýc_ScUÎó—Õ½ìþÇ~ì×FçÃüѾfÏh­kyØŠÝéwÉ&¨~ýuüŸŠgxÑ~Â7|Ö7¿ì»Ïí—=ă¾èwgég»L›Ð¬güŽþÊë.‹#¥š’ò‡¼Ö/ÿχGôokõOÿú“*Ù_ÿ%jÿö£À¿e?ß~ü;•¿Â£?,0Wµ’Þ:y÷ CM,ÍMO +ÉñRå™®íÏõÛïç v†œboäS&™ #àÉ“QÑé [Y³ÝêÒ)R(cóy\V €í†Ðuûý¬öîù}!Ë0ãJ°¥%1Ð(Æ1òТ fC2Ss“Sæé (Th”ªIô”4µSÓ„þ‹µÓÕ%Vt•à ol7îíwNa—·¯YÒprvÙ¹ñÙ’–¯1YgÙÇúòÚûÜæ6 ‰ü]UÝ”Ý(\;…>k––¾k<ý#­X- cóôÂwp "C‹Yb8MÑÂlœ¶!|UÑ FFó,vôX­Ô»rPBšÛ·îd»”"ÝÁ³w—ZbîЇ҃®b¾Úë)ŒA¡5é=4*QaR‡H¥ÅÒHt¢¶n.šµzµ^I’#oªÄé,Ë•&¿ºœÇkByhÓ†%ë–˜<ÿ~*TOÛMG•Nå»´¯«‡×ž~Œ*u棩z7®ÑUlÙ·‘áBž|ykËþÌ9²u<¨Õç–7çìµsMݺt‚Þ5&ºS¿²ÓŽسŸÂ#¦Vvpᔉc&}\+r®Ñæf¼xÅð/ËCôãEWŽ]ׯòJm{ãlÜák/ ›,ñCdPäpÅ‘¨t’ŸÓL­ÀìX«q§ÁkÈÇÛxü±LÃŽ ‡Hª2tþ3Å$å, Ë— ñέtjJûœO­`¼;Ÿ¼3Æaž"òÌL“L4«dsÍ +,ÒÈ7Ý«QÁ™¿EÅ ¶±UÉðGFÕ•µŽî,¬•[óÚ½x]öÒõóuØt +VÏ'ÝM–ÝOeÙ/\Ko¨÷¹xYÕU8 l []È•æA%tð`Ñ=o\RÎèafÔ¾x•}×N‹—Í_)é¥TA§µ±_í6C[Šº=×–uwц=ŽX1f/éäœYþ¹ÞcÅY)9†^œõ’öÀ-g<à“3±Õe˜¥þ–ê Ó*w^škvk½æMcŸÛí蟅ZÕmNRZ¹­¶KXO.HÑ|V†´ê»×ö¨k[úþõܽ¿œï°Ë;c±C>Ѧhã4:Z}µlui¹›X ¨_ÎÛ[̓û[·6=ÑZbÂMçÄ_|uÒžærGßSض©-™Æ¹G~¶s½£æœtæ‚·ô›gç&öÓ•§Èp²Wýù U†ýêãÿ éËÏ ðU t8!„ NØàñÍ_fþ†ÇBôïÒ‡3ùååß«yèí—Þìûý¦^Eë¯Ç^rn³C¡üuþ-Ý¥ljžÞ(âï}£‹ †æWÁÏÕˆË ë¢÷´`Å}þ‹Ų‡šÊyï{ Pà }·¹÷<ð í œÃcAvƒùÛ`ê6º)€ð‡\žíHvÂä€7ba¾šÀ0sPܽœxC+²)‡ÔáµØEÙÅ0=¢ª$—4ÊYËr)Ta®ØÂ©Q©Š8á iH„ ^éÉ"õçEF¢^c”#´êȶÞΈHœ›ܸ@6²-޼»£'i¼<^r8ôã5Ù| ò1á%·/;p¯€iL!yìx>…¡¯G«d#¹µÎ“¹›â:ÙËþxíᓉ%\XÊ‘%*‘)dä#—XËþá’cR¼4m©Kkf’“Ùäå/óÑÍó„ð†%TQø½FZmNÒtŸ3«Äa^žtÚæ<[§M@vl”[ˆ‰ˆLrQ™i&5‰FÐu4|dg<J!{vp“ô48½I!|æueÔžN’¹QD1sŽR'†Þ9M„¶£ U) ÚG>î›A¦Ee’Ç~¾ w\ä¼²‘š´¤@…`JWZÔ/JÔ¥¾DªL GÔ 0õ’â·Ð¾–5 ‚Ž‚¦£æQwœ+ÎðiÜüêV]±!¸‰3›éíô¹©9ñt¨W0¼uÐõ¿«r©¿ÝÙ©Ì羦‚ÅÆÀÑù «;öŸ«ôÃt‹wÒÝwÃgWî¿KüæÐ‰×GâŠuô»uC9ù¿±äS}+Ê­ZøÃÞ«þw×:´GOu¬ïñÀ´p'Oœ·>¸GYsE<ÚèM¤¯ýî©xšÓ \'ìêïÚNl7~tYƒ½gqÍä“çÖižeáXÊ{©‹¾áYÏ>öµß}Ô?|«Çëjo{þÊËã cÿšì­3ø+z¬¾õ/Í}û“~ûø×jöU†*Ê“?ýo³<Éò.ï¬VÇ”ÔîèŠ×ÄÅ¡ëÂhþ軯€ñˆDø²†ï†JMNi[,OEÞ­­P´f™"n]ÐF÷êþL¯ô ®'…ûNäŽØ ¸(Š’²mú2Ñ*ónëùp;ŠìðYhc°¡fÐþó©p\6PÙ™Põ†jÔþ§´ Ьð˜à ·äíõB°¢ °Ÿ mê÷X&1Ðæ¬ŽaÖ ï0ùvæëN§#íÐ`í˜Fh«ÛÖð\®Æ ßp~¤ðÚn°ê¬°J°R¼.¨¸pÏâ–0]þðEÊðÝÏö¥o Ù;Å“qˆâpæèjPïôNeo"©=¬$é1/ ,/¡s*ûN=¸F=¡³X‘„ôÏ#±ûrâ\è‰jñ¤0Q\6føŠ±MÐèDQo/òvv¸q4¤ï‡˜qXžëØ}kwXª‹²þ.¯öîJšÏä6þO±Ev±ÍQ­Ð‘ÔŽ`Ñ{üªgm ÑêòÎÏ9QžÈ°è@Œörçýf†_ÁánñkÊ ½Ã%ORípêæÑ&ŠOx(%m²ɰ9ªÉÚN˜hUÊ"÷ (Krê¦0Ñ(«bä°Ä~ƒ "Ò^\â Ò)¼Q#ƒ í#' \Dò;Q(Õ!]±î4…}Mf†Ç)Íâ";±Ñ‹~q{‚ ]ðŠh’y²â+…)UÒ/ͯæê‘Y‚'-¿i-•‡èé ¿Ï"}2y‚i/-%,/S)c‘!2戱h`’Þ,ž$þõQóœ‹u2rŒD -/]0+Sù^13’¥Qºp— óT8cµöŽýF±…´14ºN*E Gè1dóžúò(‰R%7óÒé g‰7?pHê¯-á.qòU3_Ö"t’Ó3ÑI”œ3i“=ÇÒ=?Aÿv+ø*‰+«g'› >»3.óù®ò1™óÍ3$ *1í/¡A‰’:5“-­ b²³b?„¾ó4k•àOŸø2+©B2•Q=0%£óQ2Mt¶Dm’ê3mviB´úÓ1W3:bæ#'Ñ t²lS,}#ÊR]€dYÔ,©/îŠP¼04åþó©^èþ5[“H+DG4AKÔûÚB;EE-ñ'ýÄHFý“FaIîí4wtJ±´J©ôM€4E)ˆ¤¢JGC„Ì1.•´ó˜´KEóøÊåIŒG1³=7[#(J)Kþ^.8CŒ#G±.›G^rP“r9Á«MßÑSQt«Ó†Èò!ÕI_R‘TùT·4”EÒ)þÔfô³{tk30?ÕN5}LU»ît a.R7R§(ÕU5ãLcU—“VåW õ=9SN• Ô`!Ks*ÞNOÁ“çò.–P_PhÈhšUMÿ4 ¥³SAµ(õ.W9õ%ŽäZ!IIànX­þrFÏ\—@áHŽøP@·rMôY öPoµZñ& =ÍA}u\µ_óTU‘U£¯<ÅD3¢ïe;ÖñÜT]ßTdVa‹ª=„d7]ÇP[©Rð³#‡ä$g>fWAleÖXm6XŸ6Uþdýþwg¡fsm5dY’µºá¾p¾ðso7ãuIÎ4°[ÅÓ!1ae·qñ”vää‹\E—ÿwÆÖv+!5vq×ú.WFg+Q×Y‡0vCZ[¦fGw"µx72õªhûŽþüvÉ«Oc&²æ*PW}H–<à‹ÜWÚËsßW~é7aËòW÷—û×ÿ€X€˜€ÿ—â X¸€»PKóVavöðÕym#Z1c•swQëg׃wÛ7D1Éì6ôv¿—¡ÄW.m·rAÃÃ2øb7¸5¯ÖGc ½ uh¹v„­©„=t}Q8 %¸ý07ç-4›´“þCŸvq?–]¥Q{w¸¡zXcÍ7UpýÑU§w¸¦,mp~©Waó ãÖ,Áø,Ã:ŒËRlܦ,޵lŽÏÎÈhMÇ8ŒÓ˜ŽÙ É~lÝùóXèàäüøŽelÃĬÇôXàì˜c™´o…X8‰˜8Ó€3Y“7™“;Ù“9³ˆÉ#6k=w½â~ ¦!ƒ¬ÍZL‘¹Žñ ’C.‘É-Å„­–å8Á –OÍÕ–í—ÏÍ…y—}y˜g­—iÙÒ”9Ü€ì|ê¨8Tí“«Ùš¯”_xv“”i—T=;ÌZ-³ƒ›)ûR9~Ë8éàÖ­‹™Çz9ÙbþÙ–á™™Ë )­Ž‘ Õøžm9ÎúyžÅíÔø’—9úQm¡ñ sIšK‹’%µX‹x‡e,øVkk˜”‰"Nù}‰šY¹ãt¡×ø•šÕšeù‘OZ¥_úcº•׸ž]L¦MÀ¹¥qZÕVú§yº¤ƒº%Šg!¢M'©Çub÷´›Ë—‡Bã‚ÕRii£i«KùÚ@ú¼‚-Ò€ ŸOÀ¨ŒžÏ žOÚž—ùŸYÜHÚ¥ÜþùãbY¥Éš¥Ú˜÷Ù•g:§+Á­¯i©a5LͰy37¬÷اwš y±Y§õ¨-nªËÚ¦Ëz­§ÙLMqœþuunAps¬ ˜G»žº™óú¬çz O;Ù躲ŸYžÿ®;˜÷Ú¥éÚ¶9³{Z·ÍšµßZ¤£¹ i{å†L±ùX¸%;—…Ý@ù˜å1›š[Q“óZ5²ùÍŽI[¹ÇÌ™‰Z»·{ž :ãFŽç™±_,ÎD- ¯Z«9kOK»¬ñZä ›uZ1ìŽ_šÝÜy¿z¦û{ÃŽËÞøý»¹ñM¿9¹œi;Ñ;¿5.™‘óm‘-<Â!Ü‘û¡;ì¹#ܱU›™-¿ÿ:ž³›—ozÉÛ'šXå†Ló Ö–íÁÍš¼Q<Õh¹ÇƒzÀ Y¼õZÁ!þïlµMYKe]Ûµ³Ÿ˜QÛåâ:µaœ iºÊ-{µµ<ËQ[¬ÍíÕ&MÌÜÌ:ìT¼ŠÏÚϺ¶û˜ß½Ñü¿ßœÝ\¼´­¼˜l2×VX™ò ÃÿÜο IÃUÀU\´“œÙpÅÝ‹ÓÊÙ7ÒŸÜû^[ž»Ë‡šÈ¹¼±AœÊÌÍ|ÌE½ÌA}ÔM½Ô¿<ÔÁ{RêܶÕÜÃۼÿ…¬]ÓM‡yÇÔ1é[´W ¦åüÍ€Ýßn=Χ,Åg=Ó/;Á)<èf›³kFÚ¯‹ÚQjÚ­½Ú/8Û?]Š÷Òâ¨ÁÕÙ\È ÌÚ´ÉÈÍýÎk]Ø×Oº—þ6<›–¡ï­¹ƒ»Ó úì¾ZÖéý؇Úìàl߸;Õ{Qʼnù–ª^³Áà/.ÍÞË»](‘mmÖ<·ózÑBn¬ýÚÔý\¦[mÈÁ[gvºjÞÎÒ‚¼¨û§ ¼â&¼Ø_^ŽSžØ¹]Î.ÜÈy¼IÍ þáþàÞáþçâƒÞèU½&Žû¿©¹Ý™>æUËr<²%~Ë…^Ä·¬éÛÐÞë]~Á%{Ä\æ \݇Nϯvå}ÙÏ<׳`°c;0ý臾î}žèóþîyµáñ~àñ[ÝÀ>›ß~—O<¸ެâì=“}¤qÙêmžw%_ ¤œã%!Ÿþ==ÏakPBÑ’ÍV)Õ-Ÿçq€ôkœù¾è‘žõí^èýþõU_ïÿþâw»mœ¸‘Üé|Öq¥y?ß}Û®o»ÈNÿ S¿Þøàô•Üè^äoöÝÿö©­û›q Í ÌS”^ÖoŸ¨ÛŸ™{¶Å¨‹_Èßzë#?Ë­Çø)¦ýµKÆ)±ó¿`?éï¿õí?ÿeï¾ô{³Ò*¯Ü\ó}yÝ„Ÿˆ•êÇ‚¤yÆrËŠh¨ÚôÎ÷þ ‡Ä¢ñØC-(¤ó &¥Ôª•¶Äî²-…à ‹¿Š ˜Ñê<ŽËçâ«ýŽÏß= î§åÇØBÈbøþ'¸8¨(Á¸èù(Ô”‘™¢iÁ‰9B#C!Šz:ÕiêÂ:ã[Ãú©Wk{‹{ÙèD›ëû» ,\eY¼ã@‡ìµ–ÖܦM—¬c}­½ÍÝ­½à.>N^nn]¨^(I9Ù¿~Ï.ÏÄSÒ¡‘ ’ßÊ©OÿrdXÁ `/ "\õ0Ø ƒè$zø7,£Æ¼"=9r¸$K’ãˆòˆ1-4ÂÀ¡æ™L7/¥Ùt™²H»œ<{¸ûIož½]õŠ 5šhè‘…Tz1ÅóTJÔžT«ZMeé*ÒwZ»z5²²Ð±jѨÉ<ãÌÍ͵Ծ*]ä6eØC[ê²þ{—nÞ?vñF™Ú_FÀã>Ü“BV·#~\u.ß–d”ÅD«óšk;CžÄÃñç+@ßrÝêu:Õ§ºNÚt´ìÙ´kCq·±hÛ¼mI4–Ú4fš5«í,­ícÇ»{ë û5Qé©©¯¶Þ:ºö¿Î»{ÿŽ·×>Žšƒ?ÿä7\Êo¢]f3³=r›Ë˜Goº4kýØùo¯þßuU†_¨’D_‘Ç‚¡Þ#Á•E|ÆÍ—܇‰àƒ>A7]€Ù…Hb‡& X"Š'þeR‹.¾cŒ2ºØÇŒ6ÞˆãŒ5bÄX1÷y$p{ ÙEe0•Q|œaèÞ†Aühþ`„  ¹ž_zY9–D^Ée^.å—qhndЉæ”ZVÉÂ2ʘ•dZL¾©anB„yž)ޏ¢ž}‚ø§ii*ž„Öbè˜YyhRZâYÉLJÖ{Î\XÓœqÆ(›bú©b¨|Š ê¨¦–Úi£ªâ’êªx´Êƒ[$ê*xÇ@®ºîšk…—*©éÊ1aš¨J*²§*{l­Î¢ë³·Ñê ™ÑJ›g_]r¯Þ2`ifÀf,N ‚õ)³êæ·î~íb /0ׯ{'§ÌQK¯m·RÀ·¼ú*®œåŽ1lWxâ;Ú¾kJH%à «¹­§[f™oÅ·ÌkqƒTþ‰qÆújKñÝú«k¸ñ‘;0˜*!Þ»"6ë.»2{Ls²Öü˜¢uŒól ·Y ɺßÀb|U¢,Û;s.ï ³Ó=OMÚÒØZ}ÇÍR äÏ"{!t®&cjôã¥ç`Ô/?hÌns ·<Ã;7¢ÍÕwx OÌmÐa}aÙnÖI³lÓk+µáyO·«‘gmÞäÛ0Ä_+6¸HZ8®àæF†¯ãï-qêG¼zÈ|«®ùë­_NûÊ›.wå¸×ê³o€Lç€+:Ò=±¼{¬ˆ/ËxÛR¿Í{ô`% åÄ´j½ôIû;ð`‡=v袿Q&1yþ.¯vãÍ'®±öî‡F=~ÙeüïÇÊ=¤~ =¼À‚/+ØïésÞâ §>Þo>ÐZÅ8„hÍ<ñZß8¾ÏýJN(+éHÓ²ïy$<` )ˆBøYl‚N¸S(¯üáêo 4ŠW§ Úá…ˆ’aæ,; þnˆ0,âž$ÇÃ…‰…F܈_Ò¹ðqp|äÓaÖô…¾,®y l¢WÔ(&Bh^Iü¢o|X¤~Ñð,Äû_¡eº2 P‹]äâ xD3zQŒ²‘cû¶¦Ç¢hš¡ÑÁ`O~œÖEhGJ2ü"[–“Ž5²’Wüá ùWâþ¹±ŠÐêág ‰J:ÞQTœ ä%{T¨n²• ô${¢J²/“g„Ì9Hב{´tå,ñ§2›æüf9c©‘ºÝ³žŒD§÷ÔÊuÞp”îd,ãIOnF2ülè>Ç4Nú5´7O™!£ÉNÑ!3לիy8‘j³› ª©ŒjN¢úþl“ *V©PÑý‘¬255 Uq®r¡ •g¿ZO¯‚5‰]í(\SÚR(fP LM¤¦ ØL&”ªmìUïÊO¹¦‡‡–S,bцԾt¬-ëÀÎj·§ VªUíla·øX’Úµ^&µšcCÛ¼Z”d‡ì+¹ºQ'æÕ§;¥­0QûÓÓâ‚ÙÓ-nÑÙB“¯Ç™))9ZPEqö³!mîoë[²ÊpÑ}n±‚ëÒï]”¸M\Má˜Oúu­´®Q«+;ʩ׼}T­XýEV¦âð¸ïL®I—KØü²U¿èe/Í´ª¼‹Í¯¿þÅ©{ ÉÚʺ¶ÈååwkÕñFxþ´î™où`GV8aî,|\\³Ò´Ÿ‹¬ÖlOŒ]žªXJ†«c©ÇD ·øIV*è2êÝéžNÇö,Å+ãCn“É‹q…ÜÀw©!¾ìˆ_U>ß¿û­2‘lá¡îNŒGƲOj¼W&w·lhíÚ”{Ìܵzµ÷d!—»¼f?¦7¶l¹0K5 ûØÊg޳_ ç$ûÙ—`Þ®˜ý:'ÞÙ6½‹fŠ[ÒÞ «‡¿ß&ßùÉC¦²žÓlUJ‹úN“5E `î"šI)H öáR CÖ<"µ§ûžW½yO_lß,ò9S å½eùUcnæí ñüåMðÂ'iõÑät ¯Õõ˜æ9Ûó,·”'"úÙGïCÿ*ê_¿‰¥^çY_|ò.àø¼Jþk¹Ö|ñ3ºéó8¿ùÕyè~·3€¶B|sRÜqÞ{PV=µ—b,Vv wÏW H@þW€]£ˆEdg3ÙD»b ÖIR:ú‡~N#uºv{ÿÇw\¥H{¤%K!Hþƒã׳\ ø/ h\$†‚¸{~Gr ×wÍGz/XS1˜ƒvA·ƒX~÷…mzehu¶`ëv‚Q"…HLØÆBÕ{LÈQ3ø„ Gc©•~îW…wk>¸+÷}]X 䤂D†T2†¥E}¹w†˜†…lÈR¾÷†áum#X2<§|ó!„^YEH‰¼Gex€2H~z燜8ˆ×µ† b‡ —ˆàu…ˆ ‡C„"¦KVi3‰º'‹ö‘‡c䊳‰ž(e‚˜†©¢4;Ô~ TŠtvÅhvǘTa¦…ê–c:Ø‚.7„†8‹ŒÖmò‚·8¹øŒvË¥W9xU5»þ6Œ¤ƒŒýuç4÷ƒ°„Ó×¶‹G˜W•(M8Ž:£÷x=ïiß(ŠÍÔ™˜å8~èXóÀˆbãˆ÷—~üˆlÿ8޶[—hé3ù¨¹ã„Xv7~k–‘ÃwmB‘н²ŠNF_„È{I8àHÔŠ©‡‚…ˆ‘ H9™[1Y5c!yPÖø6 é9ªÆ£˜RhH@ÒX/)z¹vJø 7i‘É’Y…˜;”roR’ @‡ ˆ”d¨‹‡èk2Yr< “ÓGR™.T‰;€hD»Q?iUYù¶_DY‚\ˆ–Ĩ“™C‹{è–P‰ßчþª"—¤”X˜Zù…Ð¥—õ•¤–cÙŽèK‚h(6“m©–i—ÒÒ˜Ôõ˜ù²3 ¸X_Õ•¼Á—Íâ— i‚Yi©)šM¹SB™˜ÆR“+Ô˜U3˜^²š’™”@…“Sy™v”™'¹i)‰—wˆ‰Û¨›Õ™u†I/‹™gr)œWù€_fƒ7˜U•%Ë©'³i”µYKÑØøDˆéMÀù›—Ãûx–°‰wY鑯”œé2’SÕœìÈŠ‘(8$t™^j)Û9ŸÚSŸïwŸçrú–DžŽbžÌ‚ž‡v”¶)?iip‘š|é ¥ CºXÃY_„¹›–X—꟧¨EÊþldé¡è±Dµ(tùž)¤zD•V¡7š $7‘ô𨗡M³¡Ëxyd3°Èš!ÚSG Ýxe‡ò£Å¤ÓâÊ¢`™%ÚŸtcŒÉthz¥jz’µdNZ‡D Sš›uW&:R]š”ü¸(žô £ÎBT…z¦æˆ¨©¨Þƒ`;—ž¢c†Æù¡t*‘£ j$‚§à¤§.†‘)êÅY¡Ì7¨¦y¨‹º¦‰š¦¨zªéø¦dgÁ2qL·‰ìÉ–•J¥ †I7¤{´©y™`Š KŒZ‘¤ñ›†•]Zy´ ˜ ô«N"©¶j§¼Ÿ^ú¥(´¥Ö©¤2½þš¤Z¦¢úŸøæ4 §6ºž+“‹j¨Uj„ ™×ê>ÙêeÛúC¸F£Š3ÇJ‘餌®º…ÍX–¶®û žN鮀D­Ã§¢ Z¬ÆϪ°(¯ç®Š¶¤o5gËv®›9° ;«:­ky°¸êø:din)±¤Ö°ä¸ƒµÃ¯WÈM °ÌHfQZ=- ¯—*¦[±C¯¿U*yë²»€1+=3»°A`®7+qœö‘´šŸ0}$k´·:¬HBë­X±é‹»…´+´êÊ´ïã´ðI6kC›³œ)‰íªµ²J~|¦kÙù²ƒ2´ã)r8 wƒ5Ú˜´þJ{¥k»@mK®Oµq«i°JµDX·cʵaزE7™Ê˜aË~I(¸6¶ã”·f›¶'š±T'p{2š®j¹#» Í’¹Ñƒ²Ú ØJvÉYŠ ’¥‰k¸Qwºyø>‹+J+§ŠY« k©w;²ý²Ä{»å™»¶{3d‘û–gÛ­žk¬©jGÀººÔ¬BÚµ ºµ²‹¹È:WÞë1œ{‡×+ªc»£Z¥²Ç£¯X‹²òë›ãj¼P€¼ƒ®ïû»”»¾ÒªÀ—¦¤;½fÚ· ¾‡•¯&‚¿ùK†³Â½s”µºúµÖ˦æ†J©zå+>ç+¤V«£íÛ¯ÝûþÀùÁmz85¹Á„‚{‰yÚ}û[‘òë¿^Y«jÂELÄGLÃw0ÀÒ4 9™¾ê‹·ê¼Rü%µkf_ŠÁöˆµªY[2öÁ°YºÒ‹¸É4Â¥jÄI|Æ"¬(Œcs ŒO ¦ <ÅÑ«·$Ÿ1¬4òy9¢#'ÇÇ ÈÌÇM'È…|ä— {ìvBÀ?v Kì?ÊËÁßY² |˜=+ŒÁûÆÜÆÁ,¼Ÿh½™Z½Vê¶NlŒH®Ëƒ”,ÇлÀŽlÇ€‹ÇÎÈ©ÊixûÅ+£{küªš«L9©­ŒÉ˜¬­ˆ|Ë4xL±gY¼ú¶ÆÚ•jªž*ÉÂ&þ‹°°Ü›¦‡“´Pk¶Œt ÎN±‹<˜€Îú wÎì,ã Ïa7ÏëìóÜWÎøüjü<w÷Ï AQkõé|ÏçünѦÐü¼Ï waG¹üÌ_͸Ìò5J†ÌÑ/b·¯üž=ÛÑ#MÒ% ³Ïv@n/ðÎâVÐô,ÏàÒörÇÒ`—ÏúÜÒ8@mF§Î8ýÓ>=ÓglD= ]ÔX'Ó‹§q3ÝuG}t/ Ô·ÓSýv1]Tü»e¨.ºaÒ¨,·>‡-O±ðº(î+ÎüD æœÐáÎ\Gx]s ñÓ=ÝÒ¯0Ô)mÓßÎ.@×X=ש°×þV}×JØñlwˆ ƒtAÍÉù|Ô-Ô’Mk½•1sš¡»Å5¹Â<¹„B֕̾„‰Éi]Ok=ÎðæxMÕýÐI R}Ó…ÝÏzmØÁÀÖŒÍÚNÛAÛífØáŒ]Ü8=ÛŠ—ÓÊ}Û0]Û\gÛF ÙmýÛÆmÙ€M·–Ùœ½`³b--£mÌ:꾋gu(Í×®`w5MؽýÛÏfÏ1=Ø=Ý×È=ÝïÍÓÁýØ]ß ÕlmÞº=Ý‚]ÝX]Ù¾]pñ}Õþ¦ßO½Ò®B½¬χÚNàÙS[E ÝÀíϳ} ýÖz-‡Ý¡gÖãíw>þn±Ð—ÐÛ:ýп&ÙîŒÎŽ}â÷­àÑæÚD½uÃÛ7Õ<.ÛN=ßÎ}ÝF.äþ ÓA-ÝA·Ûö½ÔMîÞR®ÔA.Û6áMáîxw§p *Ä—Ö4îÐÉjcRûˆÈá×öÍÞB×Fçt黥½Í$Ú ók Ý5-Ü…gâC¾àWÇØB‡u‰® >èvŽÔ]¾Ø¨€nÝ#žØC'Ðs-â ¡Þáîmîvš¾ér ܦžêù­qÞê±ÖØ—®Û/Nl2^ë1^ã.^㡾ë¢.ë=è”þé°¦ÞÃé°ª¦lXÀwÇáë=Ý<]ê8‡Îþ)¹^w¦žàŒwè"¾í­íÖoMÎûmÚ-Åšûv?ØW¾ ….àîuîjÀï ×Bìß~uõör;žý­àäŽÝðí<éB ÿuÞÆðßð3¾ð/ñè­y…áïÊÞÈ}>ÿæî÷N冷æÿ ¹OªHøáÄ ã«æ‡ çbîäÚ ó¥œm/ç¥ðümn²žêÏëÞнòxÎò¯äWðoðLþòöîó~ôoÛxmôUÿðTõKõßï÷pçQÄjlªhö$”îíª°ÜB ^‡þFôZ>àós@Wô‚.êM¯ç1¿÷FsþîFØñvåùÍÚõ êa>é€ÿÔ‚¡øuÕµŽì]¿ÌH UhùÄwù¡Ë»›¿ƒ+ l‰çÞMòv‡èUí3å¸Þè.ïï)~î¯ÌúVmóŠ-ç*oè¿ø~ûò®èüþÚ'Îî[?ùë×Ì®H˯üÍÿ†™¯¸anâ /Ó¿/n®~êÐ]ê¿vê¥Në×nÄNøDOÚ mîÛ< „Ïêíè —x¬OÛk/×xßñ þÄßþùÏö¯÷I@NZíÅYïÐy¨ÀÉÛ¤NÌHàD×ò5Oª•aûÆs}ç{ÿa b‘(1‘É#€Ù|.–Ì ubí¡j+þ¨u!±ba™ÂÌ@§Õh€b@ ïø| h›õ{~߯Âø L ÄJÌP¬b|\Œt”ä ´¼Ô@ÌÂÌì ÑÑŒ™ÑãÚ ò2Iu9a-Yuýt¹U‘íêŠå‚å&.¾‰’BvŠZ~j¦R®Âr& 5Î XÓf0£“ó¶û× 0¶FWm-i´p¯€§¿‚œ¼·¯¼æ·IÏù‡I¢€BÝŠ…ËÂUG傱TÂW¿z!ÔEÕ78¶šE«ßH’%MrböL‰Ê"S’¸\™’Ñ4,œ Ó³mMp=ïä!´ÏI¢8 ÒC¢/žÒyLëQZúâfQªþU}Lµh°C=ùëe°c-‹¥ŽA6¬,µi¡²WîÜ@Êì2»ë,Ú†š5‹aåd&›Î4Ýà|;NèbÁçèÎ=ê4)Ô¦”Ÿâ‹Š¹ÐcÎ¥‚Úü‹ë,R_O \1LÛ·©UüØvjì´§1öœ[÷°¼ÐðF Ðûåá0‘^Ã})'a6nûÄÃXú-OÖ|9ßu'’»¦ž3n‡¶Üv½È†ÙÚ¤k“e¿Ù}ÖÔ³ÝÆo-Rü~þ@Rþ§@+d"®8j¬JÎÁ˜Cð: “N(s`¡B /Ä0C 7ä°C?´.;ì¶ñ»Cq=Wd±E_„1þF9-´ð¢ÂRÐZoG_Á… !q|ÏÆ1‚,íHúBCGýD’¨?)§|ç7½¬ôíÊ)Ž¥Üf݈—cާçžû)ÂÅ„8ŽJRäν“ÓMÚ´Ó˜k«¤=ùÌ3PAwp¸Bc pK×éÒ¯Agr´„t±ïP“œ ƒÀóQ¾è5ÎPKô”ÑRGúÓ#£LJuÕS_ôЖX‚"Ñ -šº„õŠHu “03D3ºLÉñ¯WêÌŒDg›…¶²9•‰Ú¿¬Å6[mN‰n[ú¶‰D8×W $dRæ*£ØcÅÙôÎm?µÞiï}6ÛNç½þŠ_ÿÅVÖZo%ØPsyè‹×sì ‡µô›4ßG^€óÕ.ÚŒ¥ÅxD=æXß‹/iud“OæG`ET6n`…¹-.¸—=E·u cBŠûˆ—P”7ä Mì˜èÙÚ}VL§Ÿ†:j ‰°ê ­–:k­·æzFdd~l&ÄN‚l#Ì3ê°;`8К‹ V'ˆÛ½Ô؇zsém™Mzh¾ýUi½™&¼ª]Å}¦ðXm5¸`DŸ“„WZxæ¹nÖ)gwïÞ£g.ÿ[hÑ‘ÜÞ¢KE\qÕ 7°QÊWß/Üd°|Iva&œæ¶=‹{›¹¡Šs@–|ïÀþôÑ“§vçKÂ=õן÷ŒeZWfüqË-‰¾øðvßóm4¯[ør³!u¦“gÿø¾—Wšzùow=w˜æÌzý³·?˜r¥ÒÛÕ;mü®XÁ3ßçV×>Ó!Ï}C‹þ$è^)l{¼†í4H»éñ¦~ý³øJ%>mObæ;ˆã<âË |Ÿ Ô‡A2ªƒ/»` QÂ?—iχ³ _Àþ1` àNœC¬º!Px+dááÃÒ‘*„ÞÓá;¨i€0‹’ã!ö ×C Šp‡­Ë!uŒ(8+p &T =W­çµ°hv|¡øÅ:êW[ä#§8®AþÁv&éžÛˆÈÆÆ%!‰j0`Q8< ÌtRT^&ñC,äW¤þHPæmŒbläÉhÉ~$ÒMk¤ÖþŠàF5Àq˜’#úL%¿MVñŽ˜üdõJ º™m”ÃlG!g§¥,53Æpå”Ì+Y6î‘iˆä ȹJJ°—St!'½#%V"soÅ<æ3Íy½e:Ó[Êdg\þ§NºÀ²WÕTåÊhY˜%F,Žæ›c L‚RqtE æ:h¹ S¡ø,ã)[–P`D“?Ӭ忩ÑõäšÍéÉ'©KÔ š,h8¥©Ð#’r‘ôÔá™Y;xæïƒåìŒ=©ƉöôþzÆÙgƒúI·N2 ™ŒâI¿‰Ò“ÆŽ¥;õ¢q’‰Ó/Bt•¨Ìgõ:JÕ¹è4£YýiX«ùQd3Û¼Ûé’ªRpþR©y¢èSåBÄ4”—<+^½z‹z£º“h^»¿ rc¨:(Iã °¥66¥ä\¬\ÙP‡Þ/2u'!gZY«ôU«‹TÖF#'Zq‘¶¦•YÍzK»¡°¤u|lÝÊV5FV²¬ì3íJ8«b5¢©Œ*g<+\ÐÞS¯Ç,rPX[â2±*D*/c+ηrG7¶½­ÿr¨[Î3¹ß.W»ºUìVô¯ê­OÓ+Ø—©ö°"éAççØêÒ¶¼þÌn=·«Îî¢ ³4ݬf‹kÓ!îv$ç]xÁº^ë½€¹ï-_.ñp_Ñ×¾Óõd~©RÜs‘…Ê]0^¥yS b¯€å(S¼âÑ’×W*®ƒV&ks¤ (q(1ÜVÙöøº9ÖðTÅ ÓþÎë¿ï °!OL`‹zFˆbO9ÆÀ¢ƒ Ò?·”žm˜}¬Õ C“»WÖšµud8³NÎÍpYeôJùªêµ³oáÜ÷rÙÆñ%˜ÇÌcêf¸Ìæí¯]‹lÜ*ß™½‹þq!]Œ%Ë0Ïxn´ž5]’ûùŸÂ;jwÌÔ [w®‡æ^¢=iK'¹nþ†5’é\[I«9eVd¦1ÞM?ÚÖÄèó™$ èËŽZÐ…&ªïÄßݲú•—öµ££ ã= ÑÀp…6ƒ¡Í™N »¨þ²±Åmê y˜P6ðµ/šímŸJÎOV÷³uí^¯W<ÁfâŸ'îúŠك³Hçt;›Öo~µ¬cÝfƒÄsŽ÷B©}Z·ìÅM¦øÄÕí|šs¡¦á±} pæEà\õ¯Ó\m¿ÎÛÞ¡­8Qpm—³{Þ#œ±°j|Öó»Ô?÷7e®ì•WûÚŸ«ÍyíÓ–ænÖ`|:Í—Nï]SyêØâ¸?YkT’|Ü@øÐQ=먻䊮Žþ'›Y~v§#fn_wÍå>õJ{ ßZŸØ¾ýõ Zè$Y{L']vÇîJo¸¼Ûžøe^â¿x‹5nqÊÓ*òWVÖ‰êñ»å|'9&Ÿ,Ù§Gœñ·F»Ú®rKþô¦„{ìoeG¿vwß}ÚŸVšG,¨»SÐÿÛûÇo ÎxèCýðÒ?¾»ŽúØ;ýÊ¿õµ…{àõ|ïý=þYUâ§å¤Ôƒ§C:Ô­ös?È«<´¼Œ¹§Â¾Íñ²û»ïó» ¼5”¿ÓÀÐþ¶›û´¶Œ´ó3Aêƒ?œúƒ/½+6ý9 ü=À“?¶Ã<¸SA≿ªó?˜k>ù[¾ÛAª#ºS¨ì2íƒ.>9 lBhú°ÄA²…S2D;-úAb0B!<ÁêãÁ+¢“”œ“›Ó=û{Á ŒÁ6Ä@.,Ç‹½´¡/C0ŒBD4:ü,;¬·äë52Ì$ü¶ \Càë>7Ì/Ç+< êÁP½´«©:Z¿=¤ÂœÄ0üÃÀD `ÁasA&LD'½ubDF\¹3B8IÄBT\³J¼„.„¬!üÀ«ëDåÈ2JACçRÂÞË?6$E¹:Åö#ÆL$BüþAsÅèÓCtƘ Â[D3ô]l­¢@D„Á`^`9'©­¨Â¥ÁFTq$¿dÇ,œ Ô²†&‘ME„¢Ec¬GiôBä¼ñ¼wÅ”AÛJ’ö(‹@r,ºNB„GTÇÀ«E¬AõÛ²ȕ‰hK$®{äH>ÔÇøD}s­lüEmÆq¹ˆÕƒ÷(UÈ‘WÈHñ2…™DH¨šGHÄG¼Š|·Ð–|ÅŽ”HMüHÞÉÅu±F®[BþsHB¢QCÉü¸öhÉ(‚œÊÛX”>áÊœì"陞 ˲|Jÿº¡_3‹ÛÈÊ"É(㓇þ´T¹ŒËþ¡Ë£ j, kÜ=о-±¤À\š½X‚]ª’jHÑPÌ%!‰¶ìJ]Pɯˆ›¼ô ȉzqÇôF9—Ë”J¼ì ~Ü:p>¸,0ÃLx@Á$™ÄLI…`ÌÆ|I­´ÉÈ…ä˜É„¨ÉnÚF]7ËNé’_‘Í_`HþÝD%_¯EÞåu]õí,©c¶”¥ç«Î¨…,~e`û%ÝVÄ Æ‰ýQ«å&ÆbݼM_× !¨ú#°m¸ž`yS£ø•àêu[va\Öô$V=ÖXê`n]6࡬}%8!nàL=Y½MaþV>b †áþ­ÑW”bôÕà'­>Å(Öd˜ÁáÞÏÕ¯"¢Ò!Îb"ã†Ib ]bÅ×4>Zæ…b"X¢Ý"øÔ ,¾_=²©•Š`d4apÍãtã%nÜc1c@öÚóä€á­h­;#Šcë 8Þå\#æ­H.ÅI¦ä=>Ô>žÛ5¦àNÞä; ÁKµ'7fØŽ3N[Íþ„d^f[VVJ&^5-ã:cD^fSŽY@}߉bÍm”ße)FåTf&f$Ö²æbâñÕfž*à6²Ñ}ä…ÏùŒËæ+g¦×l^UnªnÆ5Õ(#guígÃÚúíܽ’d”çZõÍÏÛæ/Æç`¸`ñ]˜–\¶h4^3 h¤ÅÒj^÷ÅÕÑ£¦JJh.nh©}èbŽÑ‡!cE/Ö¥åÊOd%žhVŠšA‘¡gŠ¥…fh"~”öÄï}£ð5Vq~6ŠÖd^ÝíâvàhiÒ!ÞÕU~­µºã­jJ^i³ä}Nê¥>ß(&ëã¯þfŸ~¡©6iÝÝ’¾Öf †ç®žFW_XVÝë=ë¾è˜>^Åæu6lòtkëZž6»¬*{¦-¼æ3cî8dvéSj¦þëÁ¾ê¦­c¨mM`uuE_>87~ì“.bÉnåo6jlâ ^TÁ6_MílÏ>l¶VíÙ¦Û>í”닂lßcm¤l¼“á´ÂìÍÆèÀVã^õmÜíén%m² î…½8QÜíU.îˆè£>aæÆ)Úl6¹ÏÖm®iwn“ŶÇËãN»¦àï†}6W¿Êl³ÖlýLïÜ&·Q\j6wÊÈKmú¶Pûo¢®¥×¦˜þ¯ý¾á3~\îð{ðmIEXÙkPîVpšeðÿj ëüÎ)©4ï‹þR¥îc}%éQ¢NÓæé4Pn^íÈ.ñûvp~âk îe wn q'é Gi‡f\VwúžÚææ—±?Ã7ª®™Wò~ïç®’®!ó27ó3Gó¡ò}Á“ ÇJ°‘š³àHs0Y€:Çó§‰êEfo,op½.ê!—è`h•onC?‚íôsÓØØh]k7ÝçÂÏãéó&'åE¯üö_Äô@1/kDoE×tvx­6t''îd"u,íjKçóX/uôtñ&tøm¥þnõìõ©ÌÉ6Gõê^ÍÇ|Ñ_ïÆÙ¼ô_õY·Nw-í´M°ôg0¯hŒnVdG#ù¸0õ]Pɦ‹"ɸve‡jˆÇo¿vùzïGgc†C¨nyˆq¿÷¬ˆsÇwªìQµ€uH·fgÛ ª[‡m áÏúØ]#õŸt’›´ø]ø‘´8G«d…ïÌó¸‰ù¸âTH`§vÞÌødƒ—¤k(§w'vH!ÇŠ’܈ùØ  É4zçøM@w”’Ÿ x IyÚHuLgö°CøM?îÜûXPS ÙLù° ÷UådPçï²Î‚üJR ®œGþ¬¿w†ðÆŸ·H·¯¨L…Ì«ïw·d÷B°ø‰` ºWúMf¥¾‡÷ævL(éøÅìù­ ûrçy¶G‚/y±'¼'÷?ù‹·ú}gyS_‹‚WuY—cgï†g|Áw˽_rk7ýÊÅ {º…Èø¤oü½Ÿ 㼑m×±ðLÒüu'üÛ·{½Ïp˜·ò’©Ôwý†J ){чüÛü“ÿÆ%‘ýÑ7È–Ï{~ˬJópÚßsƒÇß§Ox-¯F.Oæ‘·}ßgýþÞz2g÷¯@HÜ?ì‡ê|ÊLwæÿ÷®÷µ‡€€¤Ó^<¿¼z™&n¤™T·­áþi¦å;Óµ}ãùµ,6(¥‚%à¨xú´„™¨âDါXlDm¢’-&—T¥mƒÉæwV-‹z'µ‰Mr§_ðÌ|'×áóú=¿ïÿÚ((0"0:B VZ^bfV b¹]AÉñ´•¾¦¥Ò­î´NðÔÅæüx É<ÝÚZäâº`€ž}þ›é û ñv‰Âà1{ú@Ó¼ÂÖ`oks{‡¯i[=å‚*G*÷ª»£yN3!Ÿ;SïFö¢½øo*Yت2¨ÐÔÂ@BŒ(q"žJ‰.2  Ò#Ž“hÔ$rä&KX˜†¤ @„¬&d(þ³àLN Y©B‹Š€7y²C¹óçfËjL9©³gJvKyu·ïÆÓ¢*O‚)gj×­^QuûU•MbrŽ)Ok(¢M…æãv¨Ù¹õ°B­+UŸ-L;Xíé7 Ûn¯bÍA\0±Ël‡fÌ"åÊ–/c1¨FD‹uý‘$iLœ9´g¸æKÖ®`¶¦¹gmæ#Ÿa¦M‹pí¬…³…%;–UpâÃ]§ÚÛ7 Ü—u¯³½<ú>È«eÇÄ;;÷íÓ¿ƒ/þ‚Å·4zLO)déö #µf}þÁú°_»ÎÿûþÝA3÷ÇÛx||NrÀ‡ X Ç ²¤‡þs¹5ajôÝçX~×u‡Ÿv‚¢ˆ{lfÞ!ŸI¢ž{îV†¾ø¡†2Î6¢7âH‚ òhœƒÈ%ØÍBÖ˜£‘GZ¨XB’1¹˜“K>ù9HRYem噈žh*²·"iÅREŒÎH&‡ÞUh¥šk.‚A¾ùãŽ>ö$lâ™gJº ™’RFùZ“Pª§¡‡úQ¢‰  ZŠ”xIZ‹!Ôg†gzh昈¨§žVgsÚ9*‘ržjjYŸ²z(dlš)šeΊ)­­âš«fƒ,šÑF[n¹^¤¥¡U¬±h…‰¬}0.K£u­´ÓR[­µÕ.p­¶ÛrÛþ­·ßZ+*ã–J.©ç¦j®„à²Û®»°¾¯¼óR›lN±Þš¯­ûâ««¿¹*jb£;,I“òѯÂÍj:Ù¿µ=ûpˆâ–[1º_,ŽÄ™µâðÆzü)h Ž h¡"Ÿü±Ê‡biž–)Ü¥Á™ì±ð¥6o¸²eë,ÆéZ tÆCþÜ3 ylt !“Žá›3ËyæŸCˆugZ<¸i\þîyÃª× :»‘ämSôì±_S»åQóî§ï_2ʸ¿\ßýM𣠙N3)¬ÛÍoâ°Ocõ`ê.´ö·«[tñÏ&vïÁCý»ðMO}½ú‰ŽéË7o‰×Ñã=öôá¯}þ²gϽíýg¯z“Á_ÕêG¿ûAo ŒÈñ.’<.ÅïöK ô(¸À¼]ðh$Ú'7¤ï9Œ€=3 â(د ¢0Q„èÕûÁM Ž„ì\ÎPH½¾®ƒ´ã ƒD<‰Peã;Õ†gDô™,‰8\☈Æì…•@ Ãv©Þ‰8ðßÐ<èETáŽlAÜØËG¾©•1þ}Z\cEV¸¨Žæ…ó›¡«ˆÁ f‘—ëΌÆ.|cü— IE="’ND—'³øЄ‡\cI >þ“Ý$è7H]R’´$)kо‹Àq’ã BiÇÖÙð“¥ì#-3éÇM®²dU•ˆÄ#ñ— æ,‹iJ^-ª‘.|dó^Ig.±’Æ´e-qyËÿ©v»ôT/ÙÍa~“˜Óç N™ˆT®2‚^seÙ(Mrv±šØ¼fc9¥Î ¡*}hå$ªв)œ25Ÿ‰ˆÒ›N †PæG˜i:Œ^4£ ŒNs§Éyʳž-]\aj%‹>¨ú+*NÍé™*Ï…RDTõeÒ“Rõ wXÃXÛPV±’5­fý!X}˜«®ÒQŸÖ kQuê«ôD± p]¨ëˆJ×KÒÓ¡GUjИ:H§"i¯ê_›S7z¯ðc%H¤ZBwò¥+¬`kXµÕU4Eãh}IÌp:ö¯vå©*™WРÂ6š™Õ,K‘ Qk‚QoïDìKÒ¹¦VµÍV·FÙËZ‹¼ÕèfÛÜÏír¹"òí>OÜÔ®¶¸yþ•âb½ŠGé2´¶„ogs+¾è†vM3=£i×kÓëÂת'ÒîdEZÙØzW¡à /gŸ{Û¾¢ûõYi½Y`pXœð]0{zÅZÁI‘±°Ôozì_Üþ—¼ç­ðñDÝäZ—Á –¯"è«UÊÊФ"Þ¢xË›a/µ€î°z»WüÞxÅ:&2³dâžô¾8VñŽ÷èÜ_Xn³ðrÜ[Ó'“–ÉE6&‰õãÖnuÈÕâl›dò~ù¼p-{ \fŸYÁSÞqv%»Ì oY¶3^q˜ëÌÉ"VÊ—ù°\û¼æ?ÿs¸£»r:ãwšÄ}wÎtF2£û«hñVÏûþ­Ÿ%O¸Ø®®ìüs­]Øæ æÉ“>É“¶mÛ¶mÛ¶mÛ¶mÛ¶m{g¿ï÷M×TÔÔTGGWTDÏôµÿXw<ë^÷Ž…çZ¿½8þpˆXrGï0·_]Rèo.ØÃ²vºW#n4#Œè7 rÛ˜…ºo|V³þŲb‚ËܽÞ!k=Ì6ƇSÞö~‰Ä¬°½Â>ß-}fFæ± x]3¾9ßCQ»½dÀ$Hmº°¾ÇRÀ%ïa›dŸÄeM%5³æ|Pô•šˆ‘êX½~Lùý]+s2²ïÕNûµ£Ú˜áÉ! ì>à„ãÈûCcI5šu±‹íÜžJs¨ ‰=q Ó¹2ÙS™ÿùvï“¿Ž8ãìÅø½ï&ÓÞᘵÛ¾}‘ÉSïýà Æ6D å:Ý¿eà “í)¡AÀt~¡³9âfûYÏ¿¡ãx­ß¼&¬w&ÿ2 ºy'"ÉÅ4Wçæ'FtÑGÒiNzëÑMè¹2ýÉRùEÜ·8|O Î}Æïì™ "ðgaËØÃæõ°“熤cãxÚ¥wÕ‰=d}\ÿ»q„¿ÚL›òµµ¶Rã«P óg˜QÌv©f—ëiC±çAßö]`Vgr7–ç9½ fÖ0ö½5ð¥q×ûÇS·ÆO—á Ðk·ÖzñÝÿüœ `ÆûùÎý-‚÷)¯wlŒçŒq0¿«-•{£õ[ê*‚2dE ú8÷ä\xï:x= *& T%/¯nêy{”(ç]XABVïoFÞ_ 9xœ|’|$|ä<Ø‹ùƒ>°6IŠÌ =&ÕÅÝAòÆbŒ¹ùƒÁ$2Aé´f9¤!=M!CQÀ"”Á‚!Y!Ïáð»÷<Ƴ6sH!UÍ!³Å¡&¿ƒ!†!q !{ ÁCÓ!©!ã !ßÊ‹Gaô!#Á¿Ë!wûÃ6»Kï !ç‚!gŠ?Æ‘P‡!‘`‹& &ïÎ1E‘ˆI!Ù_¢b®lq(#áˆBQ‹LÁ‰œó9™òBI#›#¾B‰"Ñ"Ñ£6"°# "¹#Â*¢ñhQ9 #IŒC¹¿¸‚8£_ÛE29GJ Ä/EÐ Ç’Ä%ÈÇÇèØÌ$Äj9Ū,ô8ÒéÇÚ%Ä“ãDØ6Åš D:ÅŒ%D‡râZ7D24†:-5Ú ÂGºÆF`$ MôI |Š 6up¥'vÅ ôMJ´BŽ›¨÷oÖNh,NréKÙIT{ˆMŽõkHÌVËK¬L,iHTrUFp92N¬vJŒLDaIÆÊÂÍVNÌHJleÖ- v¦¸LÌnHœ,NµhN/ËT]xLÝ$LK~*3ïökŸâq˜š“ZÆãä‘ ù‘z&œ¸¡ ;·ó œ=˜zœp{HpHÕ6H3“O½²Ié¤X5¦,Æ•d Ê&¾°f(e1û¥” $.Pf¶¥žÄŽk^5§Á,Gþ)j6ù.g.ÿz© …Ó‡G¨…àÛß”úöœ…6˜I GD*˜9m˜yå—%—›é^†Â’G¥˜¹êVΙŢœ‡þ¾>üîmë\ºPšŠC¤½á”`œøQ&§rîl_Òº¼‘ æõw')£Ü¡çt/"îL¶¤Üpÿ _2KF*•£<«€8ÈÁ"øæ<Ǽ{+ ,O¤8/ç<+„<é¢ÜX<‡¦"¹ {„Y×Cʈ¯"ó«Øç<`sû·Ü¦æ¢Ò…¢p`#øÜŽ&ä9‚ƒ4Ä¢ã⟢êÄ<ÄB[ûÑØ$ùè¸ìùÓž¢¶€œV˜BÏ[¢©Â¢ÅR™¹Â΃DL©òÄïwú_[…i­ eýŽù휹ŸÆ…— ¥ö³¹ÀœM/¬ˆƒ²Ý½C¥¢#ýn©¼©§Rm„²uÆn墵d¦­Ýÿü²ª²Àã\3®'¼åÅR…ªÕ‡‚2ÄÂ'¦¼j“y}€Ç6¢ÄÖìÖFÐá}÷ÖÑ«+õq Q„¯µo7ðNSP•°Ö¯(,ð7OVŒ3¿·‘¥²^À‘‰ƒ× $Ô‰ý „´ðQøR˜,О¦ÓAäõ‘v3@¤±¨õ‘òðð‰à’ª±æwæ:î O¼ ý·~s\=o*.ØÏ“èæm5{@Lr”éÖ‘#É‘Mµù§…ÉËÖ–I·Y)IIÓþìï3+b£Jæ3¿'¼®“Õ3m3£³ës_»=¶ËMeø¬°2“£Ú­³v£àg”Ka`®0ïjs÷óÕD ð8f‹^£­ž©½I'ž„ˆÄlS¶ƒ#¤®ÒÚ0‚)?BêÑ`ÆÑ³âV½É*­µ‹É¶´êãåðƒLµ #s‹Û#‰¢È½„#w œêïhV{É0GÇÛ—“še![ÇTUÙí×bçŸ_®à®wÅãΦ1N‘ί ¯NW4ª‰.È”®%¬1J¬‹Îjƒ 2•52¿­Òµëž’ææ‡5[ ¯lò÷¾±Ìý­—·“Á×Sx³e¾¢­AË~²no®ï-Þ“܃'2­XA§î¨mHŠÉÁ±Nžšdú–n.®—˜R™4mB6õKo-[m‡'làw}Qð[ñ#kb{'cßÏcÌboãÙ»˜Øã iB?Y|~–£)ã ܾ«Ÿk/Èü+Û@"á|B]jm‡è)Õ²‘ydqÚ=Úá»Û[&HÒ_GNZù¢H‰ÛÛÂ1—oàÂCÛkb¡>ÞJJ³uCÒ)­"âi‚S2jßgÖ³jÝúZ¬ãVË )?’Ÿ^´ÝÛʰ“CYÓ0ÊjšÄәőîY˜´iÞÓ\=Lè>¸ÃX¦ÑBù=f>¨±?J ;^8òWß«4ÁrTÙÝäfõ=<à‹Á?êF­à"σ_±1> zÛBimÆs> …Ï$½=k=³š"M›ãÛqm L;…ðs¤¶³¢š~jƒJߺ{É{¿šHz•ò®…ž¾/©ü•‚< ¥çÌ£-oüDá¸bé"™ä–êc|ë;µ´¡ÑÓ^‘ ¢èêõúÓ9žêZ•=8ûÑiš#XÆQ7Ò55ë5àçU²Û(¹ôšaì6—íšèülÍù`áXÇè’í ššíš-ýZüÞëðè8üÊãŒY¥ä˜Ó$]påÊêðf…R[ˆýžA¥é ì;ü¾ûžPüþ¬'·¡Ú’¤Èã!üÎ>á¿õ\Ìô'¤®¼é&Pÿ²%嬵ŒÃ082ç $&îñOýJ=åÞ¦õ:â™m›$Mj;¥>±õ¹4”?]l_™p_×µXJôÁ+û.ã³(°¾.-‡ù†ë"Òþtœ¢~^³ÊïÎæsÿá²ë½è›éú¾]å:Xä©C¥>Ëå qìxø-pËA÷¼™ÿ¹¸úûvù}: X lŸôÅMêšÄï3/ýÊ}xëâU<íW4iýrX”pŒ´K “QÅ;ä)& =÷Y+ï;?þüûql XèâÇ rÿþW0E1,ÒÌaÊæ³O+óŽUf$C†—Lo0s{¤OEé åÛÎÉÉëÈ=Ø3”&ì/äQLl\|BÏà4*ô˜Š¦Ú>.ÞVà˜°”o?‰HqUbmH}CSý3cÝgï“¿Æ6Öþ¿-==Ýc“SÓ3›‘hÒ³ØÊësøë;|Û¼_5¦²‘}£#í—Cg—Ç”wŃ÷/§±»Ÿ?¿¬å"Zˆ“¤Á8ÅÌ•X}¸8GŒ6šB~xwÕ…«4„^˜´'uh 8£îgLOi D])´ú#UuÆy æ•Æêm‹«bØ<Â7ÀùÓs©Øü B ç¥ áØõMG¢%ª•É&–ªµ3 +CO ¤2Tœá‹gÑ-Þ;.ažÓ«ðJ÷9SH—[®>ãÇÝ¥ªuÛ6!¤6BŠWÒ”ìµùßDï¶'Фµiøéíõ+=3Cn*QëOŒsšaUªßH-WkCƒªÕïêÕÇ×–:˜¿õ]—¦Ò=;¦QŸÎ–s%Q´³Þ’m!p²=ÄF˜±q½¬®YXþfaJ§öÈziÏDgrÍ0¸;=MCŽji¾¼>oÑ8æky×76;?‰X'c~Ñv},•ÍruîXÊõ¸l(Îô?‡ÞðÐLÝ1gðÇ@mü‘ÃÜ¿Úkú cD8G¢4;<+D4"ªtÏÄdD3Š ƒH&û½h“Ø(ôdÀ‡ª]›ŽžhT<îf!u-L®ŸiŸ‹Y>Õ €s¹¿ YŽöYÿŸò/4QuÑ$:e.R©´IÁVÂÀi™ä"ÕqÃ,mýÁâlÊÀBy$‘">c;ÛßÖÉ÷Kd‘@²Šb¶ó,ÆnŠË¡FnÖçÅ^þãýÚ ˆA _&ÇFÙÎ%P{oeiÚåÅhCgTýÆ&À*¯ó?!RY‘MÙÓ>ÂõÁèïÅSE3Â| ]òjäA-Æá”ÕWh—5{ö¶Ó(îÕ%†Ìã0{|t7ë§™ñgÒMÝËhÖ]ß_.B,RMxfÚ›ÆfÕ~è`f»¡â–oM¶ä/Ê‘ô`[õyõçzJˆ;‡ñûUhº>ÖÄè艟ÖèªÉú1èþËÆëY*”GÙ±l}¦¹­oèf9á4g…ñ2çÅé6ç¥ù1åå5•õ3Ú’ ÔÉðͰrg¿;Ð4åˆe^5‰mú5ÆhÞ´Ÿ×lÞtÞÏhÞv¿ßlÚv ¯ËÚñ÷‚Ñ–Í«2#‡vM¾¬[¶}¾nÇÉk·&égµ§Ùo·7¡LY– „É»×¥e±Ÿ—•m»×Z¶I8ýr ]¿®× {³Ÿ·µo³_w½ápÞöƒisÞ£eqÞ“msÞO³cq>΋ks>.«gq>¯›os>o»áp¿î‡is¿§eq¿Ÿ—_½Kçà¬[ŸF†*x1Ö–Múì7Oy]@ll¿Àâü~3é]§òÒÄùÃ8íýÆG㇔‰ @nÚ¥Oㇱ‰ Ä~ÚçG@ˆ‰ "fÚ‡?¹êª¥ÂÛ\çs*àÿb¶ áYÔ…±fmjË å~Ú‡óG‡f:@ˆO"¦¹÷|…ƒi챌ת¥®É®R… Ž­Ëù~OîoÕ ÑÇÄG3¢Ï§‰0×ÄG[oí1*‘Á D¸…ŒŒÚ†©qð ?'óç\ÎDøaâ‚™ŽðÒÅ„i‚6ÎÔNÌÈÈo¬|Æ#¤ÐÈÙ¹)ø½®ˆ6öB˜¥’Š™ŽÉåÓ%”k’É¿€¸ZâÈNƒ/€qWÙdê"›µÉêW$ôaÓ†™NèãÓ¥ <‚å¬ðaM9è¢2–Œq9çµ(d,—”NXûÑeìc³Ž¹öÏ€QÇ œ$fºü&7®"½·LÍe¼os¿ŸNyûÏ! Ùcî–*Ä ³&q©W¹‚»*mîˆyÈÍgÂôòÑÀ÷¢’f¥¨&äeqöÖrh[¸Ü—ãmõ¿-1Ï%õ1Óg”¨f@ø‰Ù‡ižJ ªõ`ñ;„=Gn U ɤã3”Ši’Ë˼D˜"&‚ãD”˜†A­_[0mC(’±?gV•êc’«Œ™-ÑÝ= ³jæ©ö4áÐTÇŽ|¿3)yŽ3TÛn”k½/u¿1Ôú`Uꂉ¯ôa2Õ†hT꣯ ±1ÕÇdT’‹¯Œ©3Õ§lT³¯L¹15æbTš’×ÝyJŒ•­™· axQ5×gRZ𛝭í35·e¨‹Šž×>/®³#×ö±Åß×öÑ™ZG4ªíÓÆ7ŽÙ˜Úg2ªËÅ7ÎÕ™ÚW6ªÛÄ{£m¬¼;5:[×îó™:Ï5©Ý×ηžp«š=ût•|&–û™ºß7©½ßÏ·¾¿°šËgT Loµÿ`éÒ¦õøÜâ_±Ë{IG ¿`öN–‡±Ù°_îBù± bÙøäÊî©¥–«æi’L4·hÅ ÐgÓF˜[î£í9õ‘DýG9m£ø‰aÁ¥ ³<ÄÇK5SÜ¥'*Ù'äc“˦O(·leFÑQÚ¦Oj¿<¤ö_5ý MŸ2fyLŸß2¦Bmª6wyÌÜÇ2et›rlydßg™r;ÚL³o?æþÂ6ã‡Û°pîцÏ6¦Í˜vq*Dà3—ÍXH.±Î]¿0ìäÎXÌ~a&°6—ÍX*ÉÌgÍöK®ÉX®va.“ƶTŸÍXdšy 1S½ÍX­ q®öǶ҇ãÄ,«É¬ñ̶ÒùÉX›vyi”ô¶¤>…YŸhi©„±¶¶ÍÜôeaÙ®ð¶¶ÿŒZßfymŸÇ61ǤY­8q¶\F±Å áܲ¥Þª!±:í¾t8ÍÜe} ]…™v¡ìlîµbë†Ã±—ÕêÿLÑìÕüÞÓðÜCz}åÏ1¼Ãxš»Ùaî ý´ Í:¦vu?€mõ<ë{-“™Ò"à9f:ŸrŸ¾Ïzã8åÁiŸ “~ÌGç8ÑjŸK›~,fã<Ÿ§nà¶¶qªm³/3‰#úq\êc³¯Œi9§kÿyOff_[»~nî㸶Ïfß8·~nßç¸vßfßz¿~îþÂuë‡Ë¹ fýÚGÈu¦Í¹½NHÇru{Hný:¦—j*ÕÞƒû:åÇõ˜Íy*fý>—ÏõX®Íy®vý¾ÔÇõ\ŸÍyinýg±æznßæ¼v¿~ßòý/`^<)€øóe{Óæ¾O»ö<úãzŸËæ~,·žës½¯ms?·_¯ý¸>Àh¸Ï!ïóé¹>Ϻ¿ð/]>÷o§³¹€gpç¯û\ßïÛÜŸïןŸ_t@ v@u@0w@t¿í~¡×ý¾û…OLlL^L}LO÷;´è(8DØD¼DúDžTÙT½TûTŸ̸ˆ_Húv¤öÞÉܽÜûÜŸ"Ø"¼"ú"ž2Ùò™üšˆèÿî’–RW¤²5¤5uз337t¤u1c¢£§157ùŸ4Ý?babú§e`¢§gü·edb¥ûø?bbb`ú'ÎÈðχ‰žˆŽž™‰‘îÒøÿC9;:é;àáY8˜›YýÎÑÉÙÈØÆéEIÿ+%*.ÂÆ®¯„ ôúôóó††FNNNOOÏÎÎ. !!¡   ¡¡ahhhiiéèèèéé•”””••U]]ÝÜÜÜÝÝ=22233³²²²³³s{{ûúúús{»S]½S\¼5ãé9âè8biÙ­¡‘‘”T ‘TmiXÄNÞÌŽEÑ,ß-?cH?¢A^¬@¾âÈ>cI%±$0ãÉn¨¡pš$±%àéh©¡ ÁNކqš%á©AÿZ­ !€[­P¥dH/@ös»âi©ä©à¨AÚlhùO¶b…ê ×n C |vrø$KrC ‰¬ æ$•jÙb‘,…ÛnÃî$‰ÓfŸÃ$Göj|4ˆ G…â(¬ …î,fÕjŸKüâ²zÒÏÿÓñŸîYžìŽäIŽôìh– øIQž–† ÕI3Õ†#ŧ݆QŽìÍÿ|…f r|øÓîòü“ퟚ‚,é£<š³4Vš gþÉ¿òO?òÛÃ×Ãî,‰$Oöf ü¬ ŸCˆð¤ïnÎÊJòLŠrt´TÈŠÒHú§¼b vz´îJe§'‡'LJøÙ±üy]ñtTø9uü¹uœ™QPHJòÔЀ€úyúÙ9=ýgþþ™ìÛוÓÛ™Óæ™î•Ó¤æø²VÏ8fu&u xV³;ãf¡i$íœÞvÏìTì° HIDÞ¾Þ¾þÌìÜŽ¬œw¯DUÏ8fX&u+5KxVÓ[“ÿÛ1 ^! B" H H#¨™ýß`1þ?A‰(‰$ (ϬènÇj¨¬æ|…$ ö zO ú rϕۙêû¢ÿY’ÿ,Ovv‰ÿ)›Dõoûïvàƒø¢…À«Ëë„ Ò«Ë …'iŠûå'‰J•ð)|]ÀfÛFìw<½Ùœ8× Ò‡—-ù–Lë`4.Å)k©Œ=QFšLÐ|aøÞh >ɉ§çmýoŸhAÁR‘£ÁX,.£jc}#8,q<CDÒ e:«PSò³ 4‹íe‚ÉJ¥I…ƲG³…r•úÆt$òŠ ‹TY~›D”¡dôJM6¥Ë•ÚCðPD>ÝYp`Œ 6GOŸ–7vB·»)™•Ø|®pDñTçki¿f3ÊŽ–­þá`,åh$æ• P[M;ðÝ“e§H€$Þ2ƒm7•Í™ÿƒ-£eT½X$“rãü"«l•ù ýÒ‘7“½ÑÂoR[´’e›ª¼4ˆ¸ögi7äGÖ¹à@)öNºÇizL:¹a$9áÞe&0S×¬Ä ½Ø¢0A¾ý¾l#haö<¼–4Ȉø¸@ØÆéò™g"cb‡ýÐ- "½@áöUmÉŒü#=ãå,QñTmÅò“4£÷e…#—y›ò°$‰L§nòÓÌ®y#1L$ù$ž¶ú8ñ_‚èþo}â(îîý¡pÚA ¡p-Xª:Èæô»hŽóô»cñ {ð†òÔ»k ¿ÍôæÁ´ŒN¥¥ð~ B¹Ý ÀpÎÑæWñϯúÁqu³ü…eå‹ Gep F±R4„X€è¥iwȯˀô$™W½ a(0ùèÐ¥ÁÈ·´åJþd&¾ïÃD k €ÏÊ¿F²vQÎ0αý†VëÒzŒ¢ˆŸJcVî‡â¸3Á.ÊŒ …ÜÚE ‚8ÈPé“ €ü2ƒm¤†Ð †b!°öƒÉª£û=Í<5ä€ ÜVäWÁ¨H+®ç0Ξ5_~:‡€…}uöÏF}Äð¤½Ó좳j/IÕš%*A7ïs9V£Ši7!r(ÖÏ9ò€d¬s5)&PŸë†:Š~ݺû¹vÝõû‰vÝacrÛíq;ˆ¢½q;Œb]CϾš³ZÅáß:Ér½y?Ís\&J5ÜÁ0)©éHÓ¦Ïl8ÙÆÐ§ïÄmZa4>ÂjÞ´Är— ëPYžSn/9 Pm79#ÐMÒ~?­L ûÿF×ç£êE/åú;!mw †sîµFv—!ƒ#Ì€1<`j“VÍŠÍ:¨å4É¼Ž¾Ìš°¥ /¨wäÌŽ¥ü6GڶǪvG.¬/XSg&˜EòÁw†X¾+5ĸséw™ ´‡²W¦Cátå~ˆhû5ä‡]E²k(@öÃõ+Ì ¨_Å[L”„,ÈɪF}°ÎO®ê¨AiCRUbßÎêš BT³îWô­:°}Ïý##Éßtk©+ͨýFótîêÒÉlfxkvÂ`¿Às#LÏ ÐVÛ@Ù¡ÃÇ.Æ‹QWÞD4©ðDë’ÎbÔ‹“—‚iÖðBD£ä¥ Xäh Ó@0 ‚YMFþøi—b‰id*×ÈRnÍBKBâ ÔõåC¹ôEâšÀ7tž‘%EºK 5@Û´­Á…éÿQÎCÛS¥Jê³ôÆXP«/ؽßÃr¦Dž‰÷c"ÚǺÖájAÃEãŒP…’ÒQ#ÔDY_u ¹‡öbÄl”Cƒî'ÃÆ´[¦BàçUëG-è_§¨O•È3„¹Âf3 #­ë³£Jÿƒ²ßAÛ1žZNÄn0Ï[gôaÜvÁï7P„(0||Q4viÊž" d0½4 âÄÈ\ü»'ö•›b—G4D >Ž<¨BØ2œRÚ?·ü°­_à©b©¤~H´›zÄ•4ÛÆcé=-”’×PWÊ(¬}hnÔÍ`bêþ#/õqÑUFØÊb"ú¨L;Õ©Ý^ó`®M'×gZ`¬ù±þþñóûÿOÿFÿ=ÿo­ocdleà`ëDmhdJíèìàbìþá>ð?öÿ ,Œ,ÿÿg ÿç ðÿøÿÿú×ÿ³êïïþzú×ÿÿJOO_\\477gbbJLLlllü7úÔ××÷oó_é?ÌÒ¿}@scâ•ÕÇÓ?zd1Fæ9f5V—=vT³NÖ»"!žÁ=?}yvbT±cEäWÕNAeNÕ"Ù`•.“×½{unR4™³gMÓ6»wm^2µ›—kLHÙ½Ÿ?~þAÁ!¡aá‘ÆÞ¦žÜñ ‰IñìÉié™YÙ9¹yù…EÅ%¥eå•UÕ5µuõ MÍ©…ê qÍ]Ý=½}ýƒCÃ#£cã¹U§;x祖–WV×Ö76·¶Iñ÷ðâfÕvÎ/.¯®onïøO÷ÚcôÞ£¾¾?@¿¡þµ™Þ:ð.ç—êhÁ`„M z})HÔDò£ä\R”+µú"a~|á &{IIjèÉkw6Çâé0rúÒÔ8vÏŒ%…„39?áÂ4ª'CÅbQ÷© ¦¸ÙL5Ôf )/æ^§i‰—9e`>×ñÈ•r2ëÊ6ïN13‘vÒÅ“bI…ëuvßI(0&—BXÐ"¯î¿,ú‡ýqò"ÝlÓ“¬>%–ÛÑmx§“ï=`¹;œ”ý +CÕî§´´´SÏåv—ÛŽ!²5š[5ÛJ7F&?­íæDh-·._ŸŽ Ç$=u2æÛœ§yLmÒŸ¶öv›L®à[T×ßÌNøw¼Þ^­ø~p¨}[e*œ}Fo´-..¨¬Ú®ëƺdöÓî«J½ÞHØ^Hóh áòöi’gì¿Wo²Á¥­‘SÆä]ŠÎK¼>⟶#¼äK„M¦šs2…Gq£¹ÆÕÒƒÖ±ïÅ1LâC´ËÒTkí×rBeÿ„Ș˒)€/;ð»´çù|“ª¯™‹cø¼>c*’ͼD½kg´”GÚè”—†Hèô¹ËĤí„^R+焽¨ê9Î8›ž¦~¥ãFi¡¹ŸDlÅ$®î¦é-•âDg„€h†ˆC)†v”¡S§cE\ä0Ž;ø¨<Ò0Žþ@¤©<0Ö±~X»@÷Ó­Ü‹rI,÷å¶V›”܇Óp­Hü²~nׯ¿°mÀ†½ÿKK><:!—ロo͵Š4HSÙúM© ~ˆN ?²¬MJu€sj7úÃ]G›&¶ØáGi¢íÜe„3òæ"}ƒ“*щͻ>ªæƒç¨%üe&Ó˜1¼1ÁÜù>m'Ò˜~(uʱù^A¬C‹|;uÊó©wTž—È8@ü˜ ‘a*@­>aü˜‰a*"¥>—PüXH™a*a­>—qüXÌe.¥¾PHüX*‘a®PÍ>¥í­ói®2ÝæM_i›i®AE}ûXk®õæ4kú#ÖÒ:}eÂù¹>ÓÒT*m ¤ö¹±6ÓÒÒ:}mãù¹¹ÛÚ6*}ãù¹u&ÓÚ±:}ãÒù¹}ÓÚu*}ëQ›é0 â‡ò8Ý©Yjóë–­ãÍ]æ×„lÛêÌ]ç×><­Ú{·­ž§:I­ Ë‚Ì]´ç×!\û˜¨ÌCB¦ÖA"¢K¼²=È@†3Hë²,ÍMÌâ× Û¬{'bŸ# ]3þ”kµ}.TÆÉIvëà Çeòµêh|xëTx¶eºPæ¹"댯·e¶Úͺ |ûBŽs<±ÆVб;œ²?©Êê\ïØymÛ¹åzó 2×yã8Û¹sêíÚÕµjlë¸äÚês¶ë¹}=s7L ¸»uYXűê¥Í«ãüÚbÆ}Ÿ¹Äº%ï>Å}-´¤¹3Ÿm[äœu_èä9ˆ‰õ¸Ò•õÌ:ôLJye½Ð¸uÙY¼º¢vïÃ}ðz$™–ì™w}Œ}î¼ÍѲÞkó~ŸiæÞvj2m([ ÕÄ:Ì‚{¾ÕúzSd_óùå,?uîž!Ϻö„O#ZcÓk=»p^œK߀Pá/V¿öÅEåqS•äF_ùQ?7ϨW¿ÿ¿jþ[#R…B¾$&~b*’°bN¸fþ…¢þpbnXmì›­þ;«þÓàîønñ¦¿ÅÈüÑÖŒSM­ ÅDÞF=XÇ|YÞ|Ñ‚¾R2†¥ÆŒbxÍ"öÚbrGcz_£’£¥Þ\“œcšÍ¢.ÎbpZ¿Öbfƃ¥±alºjiõc¢Š*QbÈãNP€ÀãÝ_£aÕîÆü!ÎÞ ‘Ñíÿ¦;â’»"­Ç ÆL˜ÆI»iÅÛá»;Òž»®'´¸Æ™„…>ã˜D†­Æ1½[Ó»;ð³‡ñBº“¨K„)!ÄÛíÕdדÒ­QÓ½ÑÝ9¬Ü¢ÉíäÙ´Íí~ÐR Æc5!íE!EÄÕ9 Ê“ÕmuÑlÇ“ÖS`U“ûã À|¬ÄSPRqOS_ÀÒ0IÓ¼ÞmLÏÃuÁ¸ÜËíßÕÒEÒàÁÓ½ÙScÒí\Èc·SÝ=ÕÓ¯IÒiÎã“ÆÓÁ\ÓØÊE¹Ú]yÆSsÖí*ßmªÏ“ ÜíRéÝx<ÖÓê×ÓóßÓ9^3þ1ÆEèQ-ãiTï™ë™yáY#æ¶îÉî™ÃíY'™¢Ù—&Ùà¡Ù âÉ î¡æâ–á™›ïq¡@'á@] ‡áÞäè±Mæ‰{ïA€öœ}“œ u;\÷œSs»—ö̧u›þðv­¡ñ¤Ÿsëóœ—\‡qkÈŠ¼«—¼?±{±È¨†/玧ãy‡ëYå«aä¹óîy3¬¿Ë³\ öRòÎZrBrÈ>¬é$ ?Üó^W²³Õ2®ËýŠÕ Î 6] /TsŠ9Šì3¬q0Òô?JÖHЬ,Ê|6Jh7¬ƒ<ÊÎCÊ  œ) žÃ3ßõ*¬qÖþ)Q¹™%¬¥%eÁEeÑYNþàâ‘©PºûEØìY¥û#ùè)œ+•?hme¦6•Ö£Å#•½äåTh‘l`*háéP1ÙUãù¿R«í>J¦$*Ö6*`5r/M*h=ªƒß+rÓBت]Õ*=-ªÏ<ʶ0òŸ-j«,Üe(v5¨¡eÈá5H«5lò5ÈÏ•¦“5È.ižˆ:Œ): šÚs¨á4ŽÑ'Yq4Y‚bÕl3ÑÛ3Ö­‚^°nšILåêB5#åäiåÿ5*øaã¦5ˆâè† +o~}-t×tN*—w­òÚM“/ÂÛ¼ ’ ñJ óêl³_«þ4¨èšèŽª²ôM¯¯›çâÈstê-ƒì¨õ£w—r´ÂœêÐêfgP²@,‹œ„=.³²]ÛšêÑr¨ä˜¡Óœ‘˜‘“˜šC ž‡ž€³r>»j™Éª\ÈšøÜš©¢šiðœ¾jKkŸ~Èò‡êÕsmý3þe53]ž1³5 ¬=5øœ}]!1ÑÕ`0:=3ù9x=ƒb=~ŵÀºÀQ: é ÓYزå9¥5ª½Ðë5ñ¾H¦=O%=}Ëè%U/uùb[4ŸÁÏ\ Ä.!Ùž#ñÇ»^:fŸÓP›£¥^<0kÊ—rVÌžíÃZîÄZÉ\à…YŸÍ;Sh+êœÂ^b¥nvô^©âšÐ­^¨Á˜T“._øÐШ^úCºfl½hà½è‚=¶–µ*·Úó±ç=Â^ºr…Áàªn{=¯?º¦\½J”½v¹µf=ÁQmmCUF<¾ªeyÆÔ$†í$=Ÿ ¹2½qÉ5ã=S SQn=µ )ñ"Q?mÏŒ½>³$½*M½‘µ9­µQ‚í܉mKC]P­­^þg5³;o!{«Å»bŠ»nzQ{çŽe;–Ý) ö¶^Kí3¼½Ñ9ymw6µðm}Æ^.=W™-™½=èm÷gìÛ×}‹¬jÄÛ¿z¾Çù kCb_Ékï´zG :éù3+ý»û^Û 6QÃtŸDfd«:‹!b¿†½„ fpE˜1·Ñ=G.ãD¸3@sÈãø·ýàA»ˆvg}{Ÿ°O‚µ*0sÈjãÀ>s$ysˆˆsDE3Dç³ücÝËT³Î‚sœ¯~Ì·u¨+“ÎÇs¤SSؽo/µî½´>}ü²udXsèPS ÛÇìqºJ~b¦“HÏ3IÈe¡ { Qsº8~ª~¦ sjèYÿ‘’c#Ëãˆ×±¹Ìö&ú: êÙ6­É‰¢qHä9…<={æ–8æÏ9ñå)Ï8/~×:?E¹ "½ÌÙ9Ÿ¼8Û–¸ ‡:®“É♽µvÅÙèÆ9É…M%ö9˜ªnñioãé¦hžÏ¹r\­Ö\¨Õx–*^Ÿ^ÏG^ ”ŸMܸty”œÆÜ°V]’ù\˜ø\Ý²\} tí\ÁÓ¸vìt€uuÁ^»×Üþ©Ù;ʹöé¹n¼âس±…ù)[á¹i_»Ýç¨èiAæêD·91¿Ùt˜òÊÈ9Ê’¹›¾ FªmúÑéF=ŽêW™¹‡œe÷Þ¾ý³âÑÙæñ@¦{M• ØuÅêx ±á¿µ~â]æXù)¤à½Ì8Vœdoµ‰Ü^Àr'ÿê픡½¦¤m¤î]ç–|˜ò9fÈ-†ö}Ê®Ž•ð} ñ¼Ͼ‡ÿÚ^Ÿ|áúxaÆ}-U{sÜí «müsvú©Â]1žìË«½ëå>¼[¼¥å¾öž>ò‹Ýî†Ei-‚¸=”í>¦Úî¦ûzWýtVª¬yT^dœµfëçE?‹h;Âz?9{#&týkx»úwýpÝ‘t?|?q²>Å:ßù·?!$Ëe >êk¾pît¸­ã»_.³ßs£€¾×/­?2w³Z'¾_«”ù†·v³ 7¼qðv}ùËŠQøB޵}#uS”Âå vºl)¦-¶_6Ž=¯¾@ÀlDð¢F í\(¶Re ìÕôåªV*ÉÌíºvo¢êÅcI²¤ØR2¦mï~×C®yؽp¹ò|øõexd½ùÅ‚ÃÂ#èµ"cbé,ìÍ’¬­ì ~É È¸Å{ä(ø»øø”{‰ÖÔ5ªG5¶jÙØ“&a˜"¤g´çX µªŒs”–”)yVVMÐÌ/­¬37­m±&$ uã¤öÿêÜ3œÜr½f¾™•®^Ü ½y¿lßÚ&ß|sZm~çKøŸªEÛ¼îÁgøêC<>h˜6S¨ñ†,A$q¿Y Òè Q×¼¿îé€0ÝŠˆüþdÐ'n}¥:’ʦðWA)‘UQÌ£1¡E 0’ï/©Ë-_(W©7Ûo,_®ÖŠþÙ§’@TPoòúkÝÆRªÖÖ´UíIQ”/5™í¹1ŽHZ>´L¼%œÃkÃNA³•†`8™€C8–ÝV¼/d³ãÐ8‹Îë#¥±°ä>ÉÌÎîXÆR²ïBÍÒdµ¥hsz ®˜ªý[E"ªuN³Óž|ÖuËåd¶4¯'OÆRzPW0ÏÛàÖØ+*ˆ±eëˆŴ9X4yüÄ.æµ÷ú’}¸üKø“аX“h¶i›ùŽÑ@› —TÍnÊ‹ö\†‡†DÐ5v;´xÇÁëÕ/ d$Ø÷'’QnèXB>UÓ¡7Ë.où…@ž“C%Ë…ß"HH Ï7*V Ükt(°Á1¶´0h˜ÐÒ®rIa3u¢žÈ©Éq‚4zó ?Žjº…1TàRší0ÉQ†#zBZüj!¾‰Ò<1‰‰WqŽ7¹þ±PÐøò¡—–úÒ÷r8%1Õ|41Œ¬Hí&b6¤À0Ÿ’‚¨÷ÄÂ(Xv¾ŒŠ&À¹¹ U'ÙyEU~˜1'G³I@NšúYUqº L#’9…F«ùźwšð²ºkuÔ"”¼—RÝMH4ó¢õæ… ™91Œk¦ýáFòøs2™ uﱩºýßÊ-–sl‰UÀÝ…Ò,mayP/e¡¶k&5Ž[lƒëd0Ì0kÝÓœp™ÔrËvˆ¸8›ª;2‰Û²ûý5e³7½¹uŒŸ|ˆ[jìrα-'Xë1ÃÈðIìŒ5S[<9 O€=ÏåžY¸OºIš©KŒFxu¶Ü°½ú™ l„B=°¥Ó ÒTN}sÚv^)˦a‘q†O%%:§¯"àõt-€çEp¨Òýi²|–¶x¢‘пŸ¡+Êš¿f:M#“ á«DM5Cx3ÓIÒE[ú|_´ªÃ¡›Pý™˜D‰žæ8ÆÅ¤ž×’¹œ óþ˜lÿÅaó“Ñ9Z&û«ž'ª*4rÐàþ;t àeÔ* §IN®ÎpµQ³ÒNF³ùíó‘ñýÒ£²q~’쾣̂;(ÖÎ*Å _ûJX°M¦ìëÕ¶“NËsîV‹FqîJÔ´Æ/ä-— vÆ ¢³oGò;{Ây‡øcãq梙ç·l&ˆèïò§YúX>{²Ás¢², €ïçüþØ1~´=ÿª{Â7« 6ñ=ëöú‰ª0ÎqÄwSŽ™09½,‰£F®T*iÔ>ù!rP˜È³>‚•u§l;¸žÏiL€®ÓL˜( :‚½ØP_{q6\œ¿S(Ü%pº8€&1 +ÇþUL® Ö5kÓ ‘QlÀKÄ¡ø¨¨i\Ä9ü·3Ó¼VûðŸ<šèpDõ§àö«†ä¢Yõ,u™4ö¶ã•€ô.£j‹uLä¢÷ý¿WÉvœ$:Dèé‚„Y1c&çI6F‡Z‹ökéÝÖ™øR¦?^€×qnð\šÒéõYÃ*Ĭ.=Þærø—?yñDÇ|Ù²°èOyÍ óê²´,KôðŠüÄâA¶ù…R˜¢¯z hîO…e§bŒlI;ø%‚ ç”̲Á1Jy˜ÄfÖ•)4OÅÄÎeœ–‹¼ûOBàð|@J¥"ȊɘÌé9"%b0r•Êu>Ëå1æòîƒóÕ̦øÖŠÙ@m#Ê5ŽÅ•@!ù*(Ê ÄWæ±"Š{"mCÉÔš·¡þ*M“ͦ>^“Á·&„]óØ4ÎÝû«m/Õy0Væ‹§[}í*=™¿·Žô,wF4V ÖŒm=ö7vÍoè¶(U,…Hiv¯Ãµas™Z?€ÖÞ)æk7$詵~c»@Äò]á–¾Vb{™£ ÍÛœi&È»;®+½C£²J5b.U¨ÞÕ ˜ÈâÍ}T\³–/éÒ ‹£ŸäaúÖ/CTpv¸kmG)…7‡*G™;íÊc¸È:¡Õl>¨MñèéÀÊ•ƒ–W—^ ;’Œƒßææöhë°Å¡ƒûqü C§H‹£xÕ ‰ãÉ4wÌcqÒû¬Æ#R ³®TëŸ]LCá)–YLÇœŸ´£~î'j}Ë°Ï ù™ÕÉqê¤ûJ÷[¹YcÇr<šCº(õ¹`&‡Ý­¤p^Á¤¹ömBm̓‘±ô¹âäúÈÊZEò·9}¡ “,²U«ø¥µ¯f´ðS,G¿L.ñâeŽba­w)ÚɈ#¼kÛµö­©jÊöNãóåBt‡Qï'|7Ny ¨Œ¸à³.wx|Š+GšM–¸‡‹'ƽwý—ʨ7òU$ ÐóŠÖrÌQ)¶”K ¡—Í ¢Z=qsS’ EÛp9-68ëFDcر4 w1–Wõ­I_æiÞë„Ü}òRÌ¡€€ûü>fÍs¬-¸Nk/íé·˜ç9½6>ó2{ºÇyÍÙ»T×Uj._ô¹<ë{ƒ k½8׈Ó$÷¹ÓU͵v·›Þ†t¿ ©Ç(Æë: Vr*‰Éû¦’ùøu 2Ìi˜½+”òUÊ`>š‡úœ–L.4îêfßàÜçÈã)Á¶™)òœÖýcdpÛ¿d&MnĽýq9(çz8ÌÓ±X'¿’W×T7V5äŸK»hÃOY¾#€ùC©ˆë¹’it°„ONðâ®HìÐôü“ªÇ5£·fqþK3Íèc½ PCá[~´y°5’;ýþ ÝÐ[ˆÇ÷èÿ"–4ÖƒÕG§Gü:‚«OzŒÍÚ’˜ñs˜wMØ‚ÇÁeâ”—åÖõV˜[‘Î'Õ ÁëìÞ““IXí€2ô‰»’l§‘½ã¼K¾ƒ‹~ªÿª3h£¢XŽ •s•l kZ_“L€ð+$ÏP€¡8ý.F2r á­ËpŸ©k fžWd¡\°ŒIË¢Ñ0¥½ÿùE'?•Þ á à]À`lüà­#W²";©5­“ п#‡QÐo­Ÿè(ï«M¡¿q‡BˆGƒ·ˆPxH€i7?±‹vn´Rh¶}hclèÑ`è¾¾ïƒhXŒN²I@Ñ ­ =KèÜo¸X!K8ŽoØÝ³Š±¿çSHb‹!%¯?øQXck(ñœç~ˆ{JX‹˜ßN¸Û`D·¨LD*µUFkÐpHä€Ï‹ÒúK˜È §»­£^ºPD^(îš}tkoxq²ë{_¯kоŠH)cÔSBÔ²Lø “÷üþ·ç•€U¬ß“:‘˜Zÿ÷{·áÙ¨›W -ˆà‚ ô#®WW S®/~Œ’XŒIr¤Ê½˜j=Ìø¨(Ψ ä©»Á/R’P/&í)$«$©+žJ¼¡×€‹§y±Ý¡©;'ª4¯« >kˆbøpðGŸØ³oBÅC¢s©}x³²+»¨ ÝB"ó`¢vQ”ÿ'sba³ý*¡‰¯š‰¬)©ã.°«·NH¢~Iœ³bú¯Tx‡d‘âd Q·wШ‘G<#Ñ@—Ä B¸XàUA·äؼôŒRr®VõUïÄ耥¤$D«Tñ®ÛÁû”ÒéæŒ©ÜÇ ž‘çÀÉsPåé‘„é¬È ³¤¡:')è…iGiÑÇé4G.j¯"þ,ÔõÊ’˜#é\»ñ”ÃéyÀTÕ–5ÒLeøŒV–®•0{:'þ”Œ˜3éüQǃÒlˆH%"ň$)ŸÌZú$o¤ìGÕ¬óPß‹T1ƾìÜÓìÈ·°[ÔÄlŒÙ´²ÄllÆ,˜1¯©Ò°%ýŸÌ8ˆ¼xô7ÿçmj‚;!B5ðßoB0jùË͹Π=R)Ðå´äysöyœ!YÌì9Œ­RnDèçùC½Ùà„¾´ ùŽ-y wybe$Ì#nÊ(=á]í‹ïª(ú+6«‡k«:ËÅNk0«j*®ØÊƒdBCkçþk†•b£…š$♥~ ™ÊÕS©šë ëjëEIê7ókhJó·ŒYŸʨ™Ýë¹ÂØÙÍÂ9Õ<}”‡°ÉboúñÖê¢îêeß’åɤÛK•ÃUßi…Ã=EÂ=À£ö^׵̚qËŸMJQÜÆš|›<â£&$ Ì%¬Ã› wÅšqÀª;‡sMÔòÇDZ<š¬›XZZ#Õ¹ÕÔs`É[ãÈ¿G¿%Æœù§¦µèê6‘îçgA·wÎ6#-–f`ú˜µ©á·ÿàk¯6'MWOã/¬dkƒVhi)km;/Q³Ee o}k“úmÿŠ×>´NÜHžX.î;ÐÞÁçÓ¹ÈéœK¶ ÏûOÏuëàæíì×éÜ*¯îIÏoÜ`ïbé®Êé¾j]Á(´Á´'·¾r ×0·47}ëÞË/÷F·œ€qt_†£²8÷T¿w"t©²w# õô\ÅôÔ ö¸õ¬Ívö´ö`Nô~U«Æ_hÀè#´L=lï@Šì#Õ¨ì+„4 Úˆ@à¨@¦°A`ëè@¿$¢Ÿ4a¨ìc¢¬a™´á¼ø¶qQÂñLšðI€|6è¢Æt†íóyÐ hÜí)síòjàà®[Ø6`¼¨– ²3jêÒ®˜òQ¤Vu ¹y`8cÔ¸RVørÆy1õŒæ„—ÈŽt¹T%xmôùJŒDüŽ.âŒtŒøO+º°{ äl¶øiÔe[juX$U´ÙÀEiVTvŽ”jÖ•Wê4R¢T{VN£«ÕIÖ´OŽ¿ŽI&©¥pNÏŒ]@÷TNèöŒ6­šõÀÐÍDŒå_4Õ\Lð{NŒiN4“õ™oLlcLLvÖtwª>´[J´ìfÈmL] ;âMmSNN›L¥KL#çMÍFN^LAxN³£ýeôýXÎOô|X²ýtÌp{ŒóƒÏm΂óÎ"RÎJ‡Í$ZÎFöϼWΆ@͹g OƒsÖ$ç|5@ fæ©>ç)-Ên(¦É&‡ŒðBI/ÆÁ5ç—Ææ -ªCÝš9-çìr~QŠ@8Qz 8¨&æ…(a¥4ú&$)8é•-ªÅT.E2þi`öÇø-u-@©2X: .zµ>1Àѧ--{m"¬næÍ,-5—¯Þ—µ<~©)çßœ&½=»>i;—Ök1Öë2àY(z£9Ö[3ÖÛ;Ö;7ֻ뽫ò˜¹“#™C›#›c››S›3€ÍyŒÍEŽÍeÍUÍõŒÍÍŽÍíÍÀæÖö!¤iì\ëzçªÔGè5DèÍÇö=Æö#Çö³Æö«Çö{ưcûsc ôcû Î×î7­¯¨¬˜®Ý/Õ«gËk´§».”«½;˜];Ø[;¸Ÿ»å; °;$~['Û¢60{[{T_{´Øû=œk(¤+$\x¨Û’9“ؾ{Ü{<8|Üà {hµ«?ô÷ÙÂ÷xý‘IÈbÈs(rïIm§ÂZŒÐ\'ØÕÕ8ÐÁ9Òã:2ôZþä1ŽB‹nè7YPÓ:²Å:²ç>’—Ú‡úœ‹®‹!­‹¯‹±¬Ëñ̳&­½¢ì-X® x©‹e­‹U¯‹õ¬‹Í®‹í­‹Ý‹=œ«®«#xŠBmûMˆ³‹­««ïëØI²Cî«c­«G¯«ç¬«×®«÷­«Ï«/œ›ß+[}ˆk ¯[¬Û8Ë/!U·P_·°Ø7¨1ÇðZ·È^7S·:ð˜Q·Ø·¸W'˜=€[Âí+œ{’¬{ò«}í;ŒÛû’¶{z®{Fì=œ›{ëuÆ®{ÎíûΊ[š®e.®G­ÇJ‰[¡¬G±î’µ[‰¯GYìd­sy­Ge¯‡ŒGÕ®GÍ«{Ñ­GÜg¸Ç5²g#¯gúG“®g «[CênK¬g»¬[s®gg¯§¨¯gñˆgÏí§X­g/œW©C7êG?¯×œcŸ¬×ˆ­<­W‹×x®š®×D¯×Tªõ˜íÕÔ­×ì®õ¼ºË¼éË<­÷¯÷¢¬÷’®÷²­÷Н÷ª®Kõ×F­÷¬Jl¬÷ö®÷έ÷î÷œÏ>®Ï­Ï!¯Ï‘¬Ï±®ÏÉ’­Ï©¯ÏY¬Ïy®ÏE­Ïe¯Ï?«œ¤ßýæpÓë~ ç{ëû@ëûÈëû$ëû¬ëûbëûêëûëûžëûQëûÙëû5ëû½ë ¸õ€ûBÐ9,H@’ÿݼ‰< 'TÏ Í¨ Üì ÅšdÔÞd͹äÜýDÔ!l@c"Êœ!e¢ÈV¨\¡d©ÜvèÜ¡e£ÂIœˆdrzƒ}—/äxkÔhy˜¡”ªJ´H’'P,Vš%qä“+¨ækv~`ýy,Sá£LÑ\©BŠb˜ˆl¾á­”E w'H†Ú)ó½†ZPÒW uZ–áÊ‚¿Ñh‰ÔžpÄz·HˆÆAâlcÔó×ÞÎ`ð£åìÍ“/y™ê0›ÍÓìÀŽdbY¦µ¼œ™foLÛþ«ÿ'ÛÓáxÀYýì>«ß½5‡”¼[VÚ’Ñ|Jðܰ²¼ÕF‹Ñ s2\•ÆfËuzƒS’ÔÇaã%5ýÔwRÍý¨©€œm{ }:˾¬šìrm‡:iö'\ßÿpº5Çý8y5ÇsŠÜEÅVSOd/ä×ß6\A[òM­G±]«çh1}Sð‡ä<>Dûì a©ål±²c¶C=´žoê‹ÒD/ªÓüˆHS,-w]{Ò‡Òô6ý0ܨàa±ƒ8—e±áèBHw“8îr¿ –1Ë#ïð¤4ƒ 4ãDí‹sR}qr³pEŠõRë w´3!Ísw¥Ç”ô3N†7,ÎâSʤ6tòøHWÓÅv,[¼7M­6³(ÕŠˆb§»ô1‚PÌ—Õ\(`Œ;?©<àyÑÞ_!6ÿÉÿ‹õC¡Øù¡üþßf+]÷îµÿoÆ¿ü?þ/ú3Vü! Z#¬o“1Öãé:*-hÛ´øÉk»Ð ß{dBcßð¡þ”ûaaBð,ñRpÅc‚È~¢_š¤O”0éà Å”P²6;>¬BDë2‘ÑfùE¯CÌy7ÂzÇ*èÛ¶QÊ„H¶(œKÒÃ9{[Z£¼Y±AÌ“¸Xf£Châq!îú˜¤$#4Ruaa“†XϪ#ìõQB†¤D¦cRÙp‰AHyBb*ãt 1›¿ñY\Ä”ˆècä€ûÔõI2æqIê¿ ‘„^zDöër ñ‘±SøäÎbR2, üEúô™ë:ˆ™›O%Œ“jÓZ )¼çGìÂê3ö ÷)[Ч¬³éÒ&/ðYÐÇÌÖS>÷)WK§(êcÂj(ˆ™üQ&xƒcr‰)pÓ†€mô9oÄän#æes ”¥l´m2±fµÑ¨¤|A¡.êtY—‡Å\:gÂF(y3Žº` æSª\uÁ§ð¢'’öt“‡¢w¬M YŒ¤œ!sŽH³… äTÁaSiâŒÅj‚办¨r5âÔáôš'[n3!Ý E!¥ »iákói(¤ ão ijåBç²™,J.ՈקÄn¯2åÏ‰Õ ç8Ãè+|ä?s% O%¸ÕW‰kÁ=ËÉáÂfúãåë}'Ï5¡Ý¥:â‘k4ʹåÞÕÈ•ò&,õÛHÅ‚óè % )Õ 06&Ô3þ(^lÅ•ºþ€13Ķí=Ê©uÇÚ•äRôÏ¥ Ôú2©C®ÖÌ…Òå®Òèb-ÁÍemä†h[§ÐvC•· Ÿí î·›×ÞMOC MLt”*š¡¬?ûœÓÔi~$å'(]Š@šlŽH,UÞ±ž¼Æ×z³—IL/ÁIkÖéñÓ· цPcî=Ô©öûaÔFØfêc\·Ö?ÞFù`|l©Ž0ßÇ(® 2¡Ïõ‰8ßÇåZðâ ¥Ž)4Ó}%bVQIhY‡R§ì›í3n=9S§ÜŸí³~€Æ¼ßÔ€Cšw¯9ÂídÔé3‘K¹i—¦"RisV‚½…4 ZmXÕ™Hˆæ2Qé …Ì¥2™æ Õé •X  ºùéKÍÿàÿ]§/u>?Vû`[êB¥¯ 0?ׯdþåÿ­Œ.­!üð›QÏLjóÖ×f\jj«ÿ[þ¿§g¿©8Û\ÐÒ=Hn ³u^ÚV{¶sçm¦µçuúÖçóswÀ‡¥$¹Ýܳc|Ì­ç¶ú?ùÿض!ìš—?\7%:]0}wᾇÍ>õ¸ÿåÿ¿ŽÈf_‡-Ùî¢2A¢ eÛ[øe,ã%OØfÛg\gšªX¿¤aJµÃÑ‹]§<U¿ëž´±dE;–Jež+5÷ V™æÂs¤&É·/^`݃¿ŸÊ¿¯Ìd;7œµíûô½&ÀNÞ6¼§­ƒ¢¸×Y?·^g^{J¿ÖͶ<šñ_Ÿ{Àóî¦[:wQgßF>5·ÕI‰·PÁ-Fi¹/ÂV[¨gßg”zmLÛmÆYc¢R:¦Ý¹¿íbq?Ïdy'qÙp;wb=ßâ}uÊ.ÀÅl/€gõº1î=vųAÕçSÕìÌý œíæÕ¦Ü1,P„ÌÞcÕÍÑÍ-Íÿ´Ä{nÈ»óT¤HÉÞÕ¿“$à¤ÔŸ,-à(ÅÏ·Ñoé‘èÍ ×8@A4Â-­Íç{ÕÿgÕ?¦HaÄÇÕ“%-PÄ-n4Àç0€<°å9ÐæYñ±ÕCœÔ_Ì-XmÍkM…ûM4˜Ÿ-XI4à…5@Ý-ÄLÌRbUªÍx'U¯™I~U9ˆK4ÔÜ-Ô-ÌZsLW»LÉaÍ_À,”ƒ4Ì]-,„ÍÊrŒÕzÍùÍPe8XP,¸_$,Ü5,%-ÀsMλLgI Â`Ôf­â^äæÞƹæÇ?ªëžDæX«Ñ ‘N枃â네ïÏæ×¸ÙsfÕÖ„á ¡T¡ŒfŸÿ9eæÞL&YÆÖiæ<éfY_fµ¼µ±æZšæ5 0*´ÉsÄf9k&8ïfKs¼³¹]ú½{ê5Æ~ã;åÓþês—&,=.fÅ¢îû–w²[þÆ.³fºÿ掜M$åŸ×¨åYü;>y4XÜ=á`$nP-*Æ1úÍ$¾‘%ž@eOÛ(·> ÛDÍa0M·jSI:iÏýJÏq]Ï’9ËáGeLs\µµˆiÉü.ɇڈú~wè{W¬fË¢8·CÅðBÏÈÂŽHš…ûPÏ~Ëñtw@Þ°$Ýð ïÈ ÌHÆÕpJ=ýûmšÇ&á"5šÿRÄÉIÝ‘]“Î1åRØîùè^ü[=÷±½ˆ‹"#C,㑬§´¨Þ¥ LµȵP«"Oú#:"}èÜ ÌÃÉ Ê^¨£äs½ðî¥Ð¸)fB¬¤ÅZµ§´Äm#Ãz#ÈvBÑÞÂ2¯Xŵ4t"ÃcÃÛkBÝÀÃ×/ BáœËQþÇ#½î<+€%)€Ý+ Ü2?Â)¢â”ø™Xz1&‡W³‹m-‡s5T¥hz™;±„˶ŠË«e÷„cçEeïEqËZs»ëòšýx‡ãòD*dUÔ˜gKGºHŸãj†ãdD5¡z9îXÒö‡§ž»Óa„ã­EÍQYuDq´FæZš®jM E-]xM˜{¹ÙQ)xMAšå}†äemX-l{™wDÅ¢º˜¤OgKÙh-ôgÌ T´†kÞ‰g‘f ¥K„ Zg}ÊY,FIž ­žzý^KIi=Õf$gXýd*Šxã‘I#±( ‰=2„Ʋ‚'-\L)%8¢qÅ£i£­1Ü\d„HZ¦=jDÂAä³Iá3Rü³àëYÝú¹±¶UÏ/¼‘ÔýÝ@×3\éÒ¯VIOÀÌÇâ³ëg)z~1ú|‹ç'¢ífƒ­F…Á§ÑНte€f³¿f„ýgÖïu9–£”Ö–òã–6ŽÐöèÈ`ýÈÈ/ |Õ¬“vÁL—ŒÎv±·6ãL-‹ ·ðβÌÀlI\Ζ‚¶ÎÎÊÊϳ" µ¸„ËŽ6 —(O—†ÉN µÎ8ÊÀ6ÉvæÒªÎÊ®à²}ŽöŽÊ†%ÍîÀ?Ið‘åC‘þ㞇ÝhfÝx˜=µ¨Ýܪ=ÂË·±®¨nåÓ­?½®a=I¢¬f½Á½æd½ðå=¥ëµúLË:š3:A¡Óò8º!¦Ú·9Ýb{•N{Cû¼¼í%U@´ü0°ìñ»úGT;“Q¡û‰¬‚°£Dq¿ªa£â »M û—B‹9ºmÈ}Î^ù¢ü­ÒI©r ,‡Ä·ªz$»a¾†âÇ5º†0‡IMIÙBÞ!‡u ] „¢¬‹4ÛÒ2)Ͷ¡¥N+/žhkÉé%Ì%øíR•ÈæQÕåI“5îf™ëàÈE{â8ÖÅ~—eCé8ïqKö¥AÏ9Nê+ëBƒï•c³Egí&ð•Á–U¯ëŠêTlÏ€oKíµnõ•މMÒ…É—…¾”Uz鵘ê¸Ðê´¤èhËèõ†’õÌèxà+SEêÒ‚íµb騨 ªÒí‘jìD'hv‹hÛÈèªNíMŽÊåÔ«~í®ï•ͦëM*¨õþ‰êÁnWB¯­±íbûïÌ4­¥™êþ"ìíÉò­MŽ^ŽëÁ—?ÛØ•”KÓ©k"Ú¶,ÊCêô9,ek¦iËÔ®õí®ðžéàžÍ­xŽ+ëݤ‰íg(MšÉÜh×'–š˜½W˜­¥h»ïæzí*÷L·'v‡TT ÐVè™bŸíúJËV4@5ª#:lvOöþ/½¢Ùë{pšÜwÔÓeoÛÌ‘u <åoÔ…Š\ûCÞí(‡<2‡´ž‡Q._›"=‰ÙÚråLYR: ²>e¸!°5€õäÅ‘ªÍ&,l—;y+qÀ:¥»Rçä'âHb2B¢ƒ¦¦® åÐ&'.TÚÀÑf;>¢Ê=æØvùîiZKgþ€¤Ü çì íø–\Flw8Ã9s{=™.œ²Â¹”£³ŸÂ£\·¼É=“Os˜3YDuž>+œuŹmD³þ¹=»Fu‰Óq¾á¬³Þ^s©Çy²íUasvLu5sÞ¦ÅÞ&³0‘³Üt“;ð}Å…}­>}õûú*p¾3³¿Æsµ[ üu¹¯³ÖªÝ¯ÝÓs:S2$s³Üs“¸sã>q)-u‹ ;¦qKžs“¸i1s»V~k~wEsfqËu÷"}÷yyÝ»ž­ ô‹ïE÷Í÷#÷þÁ{õç~œû†gâS÷H÷þìú~ öÁ¬ýEˆ÷‘÷‘I‡%ävêaA{KpÏüóÈ ÷pÅDZ[¼X»{àÛ}¢ó}Äõ}RÀlåá}D¿}bá}幤z¦Î}²™x¢ÏEPûybï™Õ‘ÝI›Pæ}Á¸}}2ÿYAÜ}áñ}¶ó}9ç~Í”|fÐ}v…{Õ°½Áw¿ðÚ­Ò«-3¸}‰Ü}1ÉÝrS;e†{3¼}³ï}N˜w–}4úyÇÀ”ë}Èì­O²}&–½Oã}ƒŸ)Óú»yˆ©ý@‹…¢ýð°M¬û9!è-mÔ})˜ýèŒ]ξ}ï³}lç=ÚíùJáþ2uý°ùùä§ý’ÝúúuûŪöEgû¹€û4ŽûÌñ½þsCøóšÐ}I—}3ù§`”}Wø~ÅÖFGZ·tˆïMÚŸóÝëÚ x £¢e¬ç“m_:$Ñ&Y&eÕf4?S°x­SðÀ*x2¤hQ£²ÌvŽ_PKìÄâÿÁÿ»tëÚ©ÿYš:Ö´YÕü=.Á†%G—ׯ¤µ|ûíÛÇ×Ï?0M҈΂Ӝ‹˜À>!>)1%™ÑË3˜(3+7/¿ °ÈÝ „Á4¢ÒÚ1¹6¥>ÙÖë§µ­½³³ø[w_ß@woÏ`{ÑøÄäÔÔ JH9SeôÉÅõ5g²aøV­á٣㓓sÍ’õÊå¥êÍû²&í\ì©`ïÙ×ï(T–ˆ5îÂ|ܾ`(k:*hnH$åÌÑÚüá(ßuY·$\¼P<îCÅAPTK@‘úâÉ4¨26U:]&Œ!éÎe^­€T*£=ñFR¡˜2Ñj§. FpøRà*µDv ±fJÒŒWé‡VÙ´ Ó À®ØeK²Ñýùæø™ÚÒªr%ò²f[ËmˆþÚÕïÖp,^<¹°A“ÄfüJã Vç‹eD²Ö“Q¯)¡•`ûÔ¥»Ú±Å/”>úRÇ"ÙÛïĆ&nMÓÓʺ9’&DC$ëw…¹îbYÝTŒ‹ýX°Ñdë4bJÇ’ ŠîÎWùnf@-6›ÈëkEâcç´þ}Š>°óòóÎ/}%MÝÊV¤,ÑLÄdD®Üß0T#—_vPbpÀ¸ø°43N冩&†ù=s1t¿ÿÊ*Ù #ƒpÑ C3ÙŒÀÕ~ÚD ÒÑGŒÇ ã~í X¨-ÎñÁqKM3bIž#dà'9L@iY¨2yVfƒj‡%Lüéq”B ™l4Èó 0OðÅ’#&Jq7%3wƒ [=f²º>™4qü]šÔOœ†K†®'_Lg‡iNêà,î¨ê Fk®á¤  V\’”䆙fánX1,üÙËJPR´¶ž-«3”åTQ½ž¦Ñ|SPÁ±.XV1z@ž†iõbR"–vÙØfXV^FótFY"‰çNѰ³×X  ¼ÞBŸ¶æ¡ý½,?a;˜ŒJd©¨¼漸캭'ê„JBObM²ãþÇlëjÂ9ÇŒ8yE/,³‚u68ÞrM%€på +ÈUY­8IÀäùàï.2Ãa´¢‹‰C#Èûq’MP³‘ß ø‰I–ã û)·œÊ»©"ÇÈ ©u«W³6ˆ‹t®¿ R ¢K»Í”¿^±èxFPIî‹|>²uËAað7kVû†GPM¯ËflwÎGÇ¡C2ú¹T{3±{Ôóó6ùy¨îXØ»zÓ¦R¾o£°ç—kžÖr‘š¤Sû¾Ë )Hl6çë×£*vP4†fË :±º\“¦êæ‘?.öA[èJx§Ç§³"}7z¨vïzàjžÓ”Qíxþ¿ ?Û«¶ÛYe”VÏ8ÂéMÛdòì—ûªa,à“„VábàÝ«ZNê+h˜ÓaÇû®·ö{§à±z^V¬ù'â“ë-Ö×å YTSüBq{â„vjêÏЧÎ+ïþt,…°§äËT "=<<ìH jŸ²ù¸Ùx§SXf“ó\`abžžš0_Õ¼«+åþÛ«€V¼ß'â>€%¨»¢ÿÔ¯s2ÓÀ.ÒO&\ò* VS9V\@ûÜb5‰|0q›,OÖÛ0ŠßaÆ9ì…R¨0æ€-ˆö&ÚvZŠƒfLGŽ.U¢Ë-®‹>áêÎÛ(ê|É¡¾•X˜hñ_·—r|<ìs¶‰ ä.‚ŸT!…Ä»Õ1ìˆx3†1Uòçᑚzo$2íq1“ȤÏãc§Õ zó½÷#ÊR (ko4y–ÐAŸú¤PºÈÆI!ì*X†jó_z2 ésG¬öù“PDó†%ŒËCÓž~Œ‡h¦œÍùÓ÷ãÔiB¦?4jÏ™áìCªRvk¥ÙÓ2Fs`áyžwr1O„…ܾB•>9ذÅ`!¨!ºÉ4n™Fö‘´’‚øIêœËvôlûüÛAt÷÷÷"#Êã„çáCQ¤èQÈ–‹ªí—M¬¨wÝ3 fá#7v™%¶"ëö\¥ÏZâñ•AjÌL»½ª1ã0Zžg‰ {mž‚=­-Q~Çääõ¶]‡ù ΛE|÷Ä/ÞN3Ïç!Q«;0ò¯žut÷ rŸÆU]wØX÷q)Òš–.\¸MÐÍ>†ÖÏêÔÅÂÚÙÈEÉÛàµIZ××™ÂDÏíÌà—äùçëA ¯½ÄàWJŸiüÜ/s˜Ü|¦ÞŽ|ÙêãMÀôk?à9À;A£ãcçÇùe–ü4ç`ëûÝtÖ98"ãƒÄz®u»×súOÇs0kð=¯½ï—f‡eÇ»g3X/ÕŸÇÄX‘K^©¾z ^¥.»»Þè¾ãI^™ý.¥ôw>˜/ž·?Œï—\Ž}|¶üáû|:÷|P\àÈ[àü™q}]‹~7›ÄYg %üÜ ýfj}¾¼j‡ šÐÄHyäýr””„IH/™ðYåJèUœ^%dK` ¿‹éñªøHšàIµ’±ž1߀ú0¨ÿ® D] ð¿WÒ@žû 2$ B÷õ$R î rŸ°“úé‡/ %ú9™¹„^ҨŒÈù¶z *Lã„J÷…¹ØDŠòѪXX¸ì†Æî†$¼h~i1; !½ Iøã(_5ɱGD+/ þ” Ãu‘m Ã>ëYUkNõxtAên‘êi 3 ˆdXŠ4óC)yaH@°JŒðUÕðPE›^ÕZO‘[k>r($qö ЉÿŒkò‹z*ŠªU‰ÒØÇ*µX‘ŒŽŽêgqE†e„ ‰åyq}À‹…‰Q,ŽåhsCdѦyEÅ%‰é`•CK,ʉÇ8ñɲIÔ U2Mà­OìTL¼JÈyöG‰Æ& ç L¶ÊOv“IÞKÒv`MÒÝMdtñuM¾&Ž×x Ç' 5ç 5ŒBJ¯‹c ›s uÛK9aM*õå/Õh}JÀ6 ,ŽIÕ?J2[áM#LC#I)­My*2”5U +INþYâj‚ j¬l‰gUª”ÆÁÚ%âˆâ% Jîk Ø;â_††ß"j‰dŸYgŠ<òbïúêýð“±EžgaHªxNþÙ Šºi¿`b¹§šýV—9y’ñ ¤6¦B÷›]”“UêœÞgê?8…´ƒþ€žÑ’è²” ‘õy›e5’=™š%ݪ¤zë\3ê=£úó 2|Â%Vø§Ô‚ƒhX*ÔHŽiK6žK8×ÊjÛ1z®Sî7µ<4ŸdÀ¥èwÀã×ä#G’ðºö¯®Jã¯ÙÈ9?9|ïÑŽ¯¹àF°dª9/y®Cž«‰ùR½ùÒ©Á–õIðmùiù0¤ù÷ŽÈÅ'Ù•JÀÓÅÓ„œC…‚§…É%N~%ÅCÅ1|Å|Ç™ÃHT4g(*äÅq=i@FW—×Û"-¨ÒߡņEEDçV­¤D2á…VÂ9Vç9g%¦bXATNaŠàYÛ®‰õ¥L¡%'Å™!ÖEDDjeEíœhE©b?çeŽä%›¼%%çiÉí:ȳŮ²e£s%¿0åüùGøÕoA~f)ï Ycî%ãjHÃoÞšöh³d•M‚ß²ù]¤«å••ƒ•‹7¥½ˆY©&¯­hŠ,•1þå• –†…¹.QgU粕%ªd;jd‡éUê hædŸî$_ipïïŒgU[ïŒàì• ïI÷5v5'3µã£U1myam.9œoå(ÐŒ8æå0jÆ€í5(€¶Z´¶â¯ç˜[¦ÅQru!lu/éæÄi5z*…Üít my7l%ÜäÎèäkµÒ/5¨wÕÈdÆ,n ôiu”5õ; gÿ²ì ¥© :†ÕÕß^ðå 2ZÌÚÑ«ö– 8T›½îŽu.ΚµÂþÕÞƒ¹Ò`ÑsÇòuÝ´õÙrßa¢CnTmØ)ÍKŒÄ›\O-ª©mëüwvÔ ö9”öUþçFÓê–\9•Ã$UÕUÚ5ÂèIŸ—W¼Ï|«ÒŠ¦×Šö§WõÞ“•…šöqŽåu^GÆmWîÐâ©LÒÍ>úI`VšÓöÍOõmvÉÕæôUûç!×ñíðÓ6Õ&pƒðô¦Ü|뢫ùZùÖ®uãnÚË”h;>»ãrqíÂUãÊžé¾vÓÅò¯j;døž“j£2û^Äøþ­ãñúý ê|ó„eê!Í’©ÞRé|ÙzoF§*{Ÿ²áËëÿyrW:òÑ>}^hzŽcÛx{Ýã&òý²NóY_mYíŠY3kßRëy5r_íûNuØmj{®uÕd{Ü\ê9P:7â©8+7ýòÑ’{›ûr/{×䉚–âÕóªÝ;êÙw:À-“|ò5¼ûYW4¸zÂI„¸Øû¹’’;W+ˆ4p´úóµ6êüÜçÞÜ»Côt°Ù«ÝëþëÁ„ëmé¬ÕUìAÈò”ùf—r^dTÆX}ôF¾X{)¼®Û€ó~æ‹Üé%¢5·l4µ×pp…^©Êxõ'V Úšæív¯­ï7'ÞC£U2;@ ´37¼h¡ÎqÿÉÿo¡‹Ðm¾jaþ懞ÇÚ‹9”FÕþEÂ$a/‘³@ÉrɡܶAËF…² 4–Îþ¦sˆÕÞýÄc7ûø)G š‡›­›¿¯ ›‹I(¿eøWzXçx’ø„Ä4doÌǘԜ\]KcvÃb“¨ª<¥Ä ÌšÚFŸ¬Ï¦æÖVå`ÝÀ’ªêoÝ’Ùuõƒ£š--“33â"½"îþÒ~+ËYùÏýí=7$<Ÿ½Ã3’îï½K}akÑbçŽ[î#O5f‰¿9ê]4S¹ RåéÉaÐ$´LÙýx½Òí—Êæ?Hzí!V$ ßjœÿP$•¡_/q0ng,”¸Q:£\´˜:'Ô&Ê]ølÎ7:äÀ®Tœ•;ðÕ—@±I-Ÿ¬1M¸!Tƒ¿CS«=î®ÌéX¹Ù&™‚bnm½è Ív¾éj«Õ*‹Æ…Fg§åœñH¥Ó®ˆfÉž>áóDzÇNË%W¤%^j÷t‰FºJ±?9Üx9Õ|ªÚi£¼Áõ`¸1l¹ÖÕ¿Ðçšh…¹5¨z™)~w¢d^Ê}ÓV%s¬Pìx{Æé1rS.(Úà£ú~.u°ziÆeñR\¶[w ï`d÷ðjùÎæãõe-cÎH'€asÙ¶G8þ…>:ákNª„±ŸGƒQ!œG‡lPš@=t¢ïŠ…œïAöAŸ/@Ðá°ïBÝq¶ïX\7¶íí§–å‘¢b+ì‘W@Ή!®åbj¾,)Qã9AÆ~LË“‚ŽVcGb{ 1Lå‡~ eüHäò¶_Œ›.“®;RœÆ2D졳ã®dêÅA–Œ2‘‘Ÿ-OVÍø8Óõ=(/‘f€ÕC‰N±?‘ ²³˜.Ͱˆ#ÍV'Œ-ÐXÈ*USG¨¨@ê{‹+N)׬ ®ç®<8Âø]Þ¬#vTûëf…B¹…²¿ê…¿|»AûºÂ²aøO—ÇÓA¹J¥•äÉsEóÜEQMrMëèƒuçÉEœuy*ìeizOÄ Fm»4ƒJmõœÁ=Eï"ìi­lÎ/.ŠyÈMâ ]¶,ý,z.Å‘zɺ¾â÷E{"É&û¶/®*:O‡L¼­®œqˆü-dfÉûŽt†Æ®í¬‡ ò¦®êr:Õ¨qlŽWL¦"yInf}á¾ÆIFÀNÄŸmùoæ5}J¨ÚeJ¬è¬n$ÕßOM2‘§.ëzÑMÝΰ›©ÌØ­õ^ºØôŠÒ qô”‰­a?P­»˜SÜncïØM¬¢–¿rPÇ,,«l¢P©=jbuK›û… ’«éšÇ¸¦¹9.­5 >tgu—4‘ç­ÖßË„§=ž(­?Ÿîª6\ýˆ¶¿½^}rgÙá4Ÿ:uk9DD¬Ž¿­(fqÞç§°[·SÖpßwdz<}Ûå\žýŠ4¾ÄO¸µ>Ö|&­ÙTf·‡º»ðf-Óá"v„[¯Ð§Ì-o²þ(QO9ÅXHÑ×ߌQàÇ€‘¾©*Œ =ˆ?òéH%äÏzÏjdƒè VA YæeƒØxÖøpdB&ëtBê…Ø€2!œxgL-$s³ÞTdsù.àL5V<ƒúȇLƒ…гaúÙHPOôűnàò q%B¬oÔÊ—(L´x²Î{cG,=ñ²1·c„·_»xˆíŒ@*¡ÞåŠDDÂÊcžêô )Y ¸ínãÒ4æ 9‡Ddœãc¨£ó¹Š#¹Ò•Ò­t) Ûq•{äSZ´f)qÝ'µ%BS<ˆéÒ%ÁÓõSÊÐú%0ÓíÑIl²È§‡ÞÒ»J´òÈ VŒ”Ë\E ä2AfЇ\¦’=á(BÙ·d§™[䲋þãŸÇ\ç°n+ò¹èPŽüß¿I®…Es³hÓ Hh¿¶Çù0)äc±˜D ‹·I*æß—C›·ÈÄ`úg£BšŠ‚ÝÌÄ ,’ š:ÈððÒW~ÃË“K;^Äÿ•+å±>ï"r™—4•­œIž—ÌYc4—s^—aÞŸ/•`Êg>ð©Ê+–ƒ@˜íp’/T¡è+è* ¸+«ò8–” š«…ˆ,ÉQ/Vþ7öþ)J·hAÓuc†=cÆ Û¶mÛ¶mÛ¶mÛ¶mÛ¶ùÇε2ë䪓uví³uUßý¸m´>Z¿yÚÛÞ“_™YÁ|Ρš®PkÓ|Îmw¡šû \(L©×¿6¸ÐT÷ªw¥þ×3 0,àRó,b÷l¨Üa<£î“Ü=ç¬Ú¡D­î@OÙŽ˜‹e—:?kƒ4/õ‰ÝW&¼œ‹5/Í¢Þ»'¬Í©ã/í‹Ý7.½œ;5¯ÝÜŠ`?ýp[¯ý{îBx¹þÖ¾ ß ‘KuþÜŒKö<$õv3ƾO[öWŒýX®ìy®òí¾4üý¹>ÙóÒÔÛ}íøã®†åÈþpQÉÜíƒô¼ ñöÜ'Æ~Sö¾Oùö<þþ>—ìýXêíynŒý¾¶ìýÜúéyü ¸ìý:âí}o”½ßûœvå~0löÚ2ÚeÝ¿ôòk¾oy/AS{£Ÿsøšqûßq°ñ€Iò€ið@D¾á¶nÝ·—æÍ±á—tALòÀmð \ööÑõ¼Õö>ƒ×êŽ2ûüò Jò kð`Zòôð(Úp‰¤ôô”ó:úò`Nòàoð~{àA¯„LrÁoW}ëýÆÁG$ÉG$À—Y…X-ßÚ¬bÞGTÉGÖÁG Éþ¬0ÒP’岌b‚ž’ž£Å¤¿2ž@À­üÖQ•ÇǘÁÇ^ÉGÄÀ¿ÃDÝIúêÖDÝÀÇ/À«Ðû®Ö½ÈÇüÈüןÞÏ!¼À!â) ! –) V! Ñ) 1! µ) u1¸Tß"ì£_éÃàR”èRÔP´PöPŽPÍP­PïPŸÐàP¤’ÀÐÒ]ÐàÒ“2Ð2°2ò2Š2É2q’ò˜²@ÂÙ²ú²™èÃi²¥²çÂàŒWr´röBÇþª"än \í'ä9)äyÐæçÿ=uÈ^Äo´;~È‹sÄU‚ÅOC$Èr´ú~Èõ’)(C$¬0‚K(6)Q0bµ)õ)âÃ8Šð'O1t)/)’°([Y“è!’J!”!’^!Bo9Š]/’¹!˜!’ÉÕàɨˡËßäÉâ+Ðàˆ³è‰•DŽ‘+©+d+²l(Û«"â(»«…¯‡«ç¯{kÔk:¨ÌúŽkÍk­kïkŸëÜë¼ë.O5ëÁ“(-Iðâ”в”ò‰”É«”똘”˜Ø˜º”˜ú˜…”˜Å˜ãüÈ!± •X¶”XöX”XÍX¯”XïØœ”ØÜؾ”Ø–HìÀKíàIíQJí_ú,VHöNбJyHDJdHUJuH]LJ]zLOH¾€ÜBJÝbNš€ÝsH=JJ=jH=[J={H½FJ½fH½WJ½wH}NJ}nH}_J}¤~àd¾.¥Þ ¿¼ËüHÊhÈYÊyÈ‚DÊ‚dÈ‚UÌü1μüLHˆÌ]ÊB}ÈÂBÊÂbÈÂSÊÂsÈ"JÎ ÊŒEþï«”ýOü¯‘­õÿÓý/F¦ÿÒÿbü_þ÷ÿ•ýüïÿ°ÿõ?$Àÿêÿö¿˜²—õíÿ¿ü/á¿û_¦ÿSþüæAÿŸñ¿¿@þÕÿ²…ðCeãm¥ÍÇGðžß`ø¬A?‹aÇfE£±II¼ÊƒFC°j­–Òa§8õ²Ø™ åóY9Áá.èM&K­% â=Ž:“‰ê¶+NJ¥KÍ{Õ QJ‘B¥z¿° _¬Ô eÆ;¢Ñ¯1;µ]ò9†³HUÊͲ9Ôj÷iðaR"…ëPcÛïQšRú•J¾PN´fŒMn_ëÌɼŠß²¡Ó²õü=ars°3ÌeG$è=e"3k6·ì‰=±£í´Ã[ퟱ3Fºzyfº9©M¶§¢wvT[,„ê?ZVBÒBkuo°¹\gznÞ¤3u~¿ˆKþÔtnyÿ´l€Övìs™GÑ–ÈM±å—ÑËp=5ßg\ËQÁ<Α“݉Œ!ñ=ïÙÓò|§„Yô\bé™­î]rýƒ!%Ëˈ 0\nûßöÍEôÝP Xt8‡Ž‚qmÚaáPË›1P2®‡I (l[>4$¥{öÉ×D…É,&çX²„/c†Iˆ§FA”Á¡ø{õ'ú|.n°V¶(º™0«¹þféQ`ÃxÉQ Ʀ\éî&E9fK‘†æLæ¹%`âÃq²TïçÙâ÷ÐÄÒk¹>釕g)à¡çÆ‘ e•6±$é‘/ûjå~­Ç¦•Ù#ãe%€vÒÌ ´Ü±“à¿Z:"¬fiÜ8bg•½—‹¾V)’º5Fˆk×%Æ¿\­š=Š]ô³•±Ëõ+(ä%oU€Z(7Ò 8èÒÄ=¶§ƒÏw €¡i %_¶l;|2©‹~Œi³‘90×õ¼¶îÇÉí0QJ§Æ¥s>Âz’>À¦hN«ñ(çfÀö©š,‰v¯°çÄH³Egõ§+›x?-çå%?Ÿ–Õ0Á­VÞ•´X¢ÇªÂ×’¬_ÖÍJ«_6¬ZµaÖÓú¼Ã·lV­_ÿ[ÿ‹û•ôêÿ³ÿuô ¼„÷ÿ¯ÿýýý´ *ûý¼¢;EU{óþ÷(Õðïþ×_Qèón”öçëéßû_?î@m»Ý€ô¿ þÝÿÞ=âþgÿ ïóí´wIü.íŸþ—œ¢.6RTlQ#&à¨}âGêŸý¯`:­=T?Œºˆ>üã·QÁ{Z;Þ)ýC'H!ÌÚ0!#-DÔÒAbƒ˜0&-$ìÕ!<žùˆìLÀMYÅÈ]$D X©0î mp€:>úhš |}¤ Vò¤;a ½“Sêí˜ëÄ}˜ÛS!’¯ÚWÀ}ÜËßÃ}Xò6ô».¢"ì]1A|`ù°/£?ïm¢´õ± T¤·gà °Ä„´æâX÷IEQG”Äç ‰š¤ñf“Ò# ñâUĤѓj5öÉaR%'Hë#  ¦A*Ôeã̉vUF¿ãߨLá3פ²(kɧ¤¡Óò¿Js×Es³K› Ù¹ÙeÕC#ãœJ™»¡dˆOþf÷T™2އKc§9ôìöì%õl8Û^qÛ~ò,ÖÌ—´`ä°¬P—LªÑ¬Úõ Yrï_{醩™[PžCP‘#ôÐÄÁÌŽö줷ôss¯Kuïìqû·÷kÈtÛ´$ÀI zžY{ħº×÷ynry°„m{î¹*÷ÄynÝ{ÆÒJÞÐk^”Û {þíIöˆ{þœ`Ny~”»5އ'ÞEÌz¦DÁ•J¾_» nºµªëÊ{!ß„³j²í‡ýE°P†³~k‘ÌG‘D‰F&jYÁ xÁIyc„³HFQÍi±D±G‰!…ÓÅx[FR#ZZ©zœ&†#žG‘®EÉ;D‰Þ‡»«G¢E^±¸xRy„Fji ji€†»K…oèD®Fî®Y¾7E¨5F2‹ZY¸h™©„UÒ†GøE 2C¼i¼ô)]Úw£Ð_£¨?¥Ü×´<"¢^ÂzÒÂeš¢zvÃ'ó¢JA"/²bB-ÙôìV;!ÄJٌ˙óÙ‚ÒDcÙr0Z}^¦Í鿉ñrª ãoT™BßÙì3Þ¢ÝÉÚVÞæri¥a榤;á[s™ c¼ikIYáížz”Þ饙O9Sj–|Ù©ÙñáÚA·ÞNÞÚ™Ò–òÙáÜÙ™¹iUޓŨ1LÚE ÙùNÚ‰%ÞIá”7äé9]4²é3æ×;—ÜR8ûÖµŽÚ­·ÞÙ‚^sñZªPÙ0Ù½3雸éËþ‘²°¬?ùô[¼t|œŒžÀtö¬ŒÍ· ߸ô<ûô~îŒ^ÖL´Šh8®LûÙŒ=¿ŒØ‹LúóÙ®#ÙÙ×EÙ Óe"•ñ®©ô9öéeåõë+êõS7Q³Òž¨¿]²ÿT³ÕÊ }ªë*^¨3—Ê _Ë‹P+Š+‡¿,̼r fråj€v+úr2Ù"¢Uo¸œ«ÿ&mÐÞ}hleP0Í»XÒfØ|¸µupmðû"œM$9«û¾²]Dj¸ßd¸–-Ûx¨ s¤är¸›r„o³ÿ³kØÒ«Ë vÐã«ü÷–S°±¼ÃT¯V§KW»›T˜qU5ç¨PÕ5Öàâ²|÷¼]š4Û~«ßßm0~u¬b¤úml:›…|"yt¢Kt"×t¢êlDœ*4üª?vÌk¬¬«?ëmˆòj4Uk( Ë-°k¼¦ÿ¯Ûd~ÖäÌ¤Éæ¤ûx„Ö¸sפ•ÔäDUo×ЀÔÔžÖT/ÉtÌ„ßÙD1Ät ùÌHÕ¸eN@‹O7Ëì“Öì‹×ìËÕÔvä´RÔDÖàLÑä,ì\_Éôd(vÀ…–{V ‹ªz¸ºÊz.ýQð\÷_ê?ßs‰ó›ó[ó£U-ÕxpÜÃÈÚ“„—ìäÕ ƒVã@Öó²AsôÞÞ0ÙnpÞá8ÙììÜ€ Êïa¢ë™&ÕbþêEÁì¥ä×Å´Á¥ó®%¹oWmQ¶é%nluj'‡ÍeÍxšêÖY×eEîEXÕæ{èê´ˆyãîÅ«8˜•%а®hìU£Œ:ÒUÃÓÕšÒ鞬£é?içÐêLïí +²i×ï¨ðh§øìЍîn1÷¥(7íu¶u‘Óur´•ëÌêu¥µ|È ÔBî ٌʬè8bêôéµ¾ ¸õÚè æÒZîàêQæÁL¸êRÍÎêÒúë&ÁÌ$ËÔ°M¦ÒÍ8«nÇE8×îi]É­µm»‹ùoË-8Ç}i—T¸¡“ïq2í¨CÀ´ÃuÍÎõN4õ†d—€áÑÌÆtØ%µÃ5¶Ï'œÏ»´óqõBËÖ¹tÔœÃ÷·7TNcõnCÆèÓs\Ÿõæît1²Ïnè¾·ûV0•¼•Òæ…÷fv¶ýäÆíô®Sw­ œ(.O"ü.”h€&ÜÎ0v"MãÕ>‹æ^uÙ>öé¡üu/4ĺèóê¦ÕæÐÄ:áÎÑ ú¡tZö´É‘iõÊPÄVfÈŽ-u· Ùñ¤È1 Ä Cè‘4XfÏìp¤AŽ%¼ã¯›ž§èvˆÕ眂Î;Ÿ]‡™9µSœ³ócÉâ¤Ëo€‡ûaxŒÍ‘W§×ΙÝk Šæ|Ãe½*ò,efÑõü8“ÇVÆ›=÷ætíB\uyÑêÂ÷57¹æbždúõ¼F¦7‚ûRÔç0$²`þïiËNNÏÚå új¡ufüukZµÍÕèËI¢úÕDN=WæÕlMÏÏ. ¨z›‘ð"Ž“Ñåù¦O«åö~‹ÚBàÚ„=édÆ>&ú:ìòê¼Æ®òzwæ ¾ƒ pcø™ø¶chd”l¿é¹].ÍæÍÛ9D.=üƒuV›ý‹êv¢ç¦GyãuçNÎ&…6¬mf£Š|‚S7-ÓûÁ•rÉŠh£z@y]I>+pÏwÞKòT!k¬¨;âI[vªÎ­Çî Ü:Ìî•»¯{È KQÖâ4næD=,_ ²†.‰ ê%V ÿSY0D¾mÃÒÐoA¬¥ÚÄ`!±ø¡IЧâvèuɆû1Ï a)#1Ql%µ?¢m;•ƒ\H¡U÷E0bVnVw Z oñâÕZ^Á}¯ìu#K…è¤ÐÁdÞ_ tøñ³c£mL¢…Œ™Mv2—Dƒ ä’dŒ3UC¦ÒÔÆL¡ÈÌMrÝGŽóùLú²"žŠ„h¯ü`ó‚ŒÃH3bœ×ãóì|ÏO”·ï5õž ÌÎJ*ìDæ%Õ %¦;¥fäbÃeælUy?'U/.æVÊwº”8ÃDá”8Lç—tâ¨umb‡¦÷eMëtíh ;ãwçûAo5ªúèøuÍS…%-·Êt—`÷Ãæ¡ 'KãÖíc¶æW]·Ž2Ô=®¹ê$hÑ©×1(—·Hõ°7}k&¦ odxáp¥ä·ƒ8ß4µƒ8Cz4¹ Iiƒ(Mö™f£4C´ô©4Îþ×½¨9uåØÒÊwÓ„ë4ô3L™º9oO÷Áp—Œ 0Ÿ½ÈíiV’dæ«÷œêÒá|}ÈOK䨆cotóÈqO«úmðC“$°£·›f@kü¦e›ñ§-” ªyôøZ€1£Ý3ú]ÚÏK¦=ÞV´öúúa×w0–ɨó™–M¿$Ó:øôñ4f(ñÅ’zÜ—¯ûJ§so¯¿ó†<$ör“loÛùÖá°öΞ¾›·Ý„o퀓/ÍÎÖ¾}ý÷ùvøõöÁЧö—»]ém¿g^쬚{ȧsΧiÿŽwJƒÊ•Å%¥iæuÁÚoUoÜ;Zu¯ªZÞ/ØÊìYŸê]¸XÀú˜7Œåæ/We¾xv:Ð/ÂèŸef(D„€?S{ ¬xYÑ7)„û®à]ð#äk{½diÔ9”CSPo@Ö%›d9"®Æ#/Ó³:QŽÖ\!Ú€¹Úu[\겿-äN‚Áè öÚc µŽY4î»ÚmvdÅ®. J—XV$¬1Œ9YËMí6J…¸L©šp @UТ[ e©L)µžÐâ±Em-­¹vœ¢ßmf-©¹ÔÖ¥Q3í#Y^ÝZ<ýog=Rk_á5i£{ÕÑ|™÷Ü&¥³«ŽÆ¸>só~¢°+®ÛØ-9Sçañ4¹Ú+Ýr—³‰µuq¸–tÅSí£ ¥wõVÿ™R& ?§¤«´|Ä“ÒO–q·Õ3 ÝÑ:p¿m‡ ŒµYÐçÊMgñë€3J­w…,bøø/‰­Ž4ÄM©Ke±~$·í^Á¸Jãv †ûÆ<&žÌš‚·Ä0.Yjˆuº_UÁ*hÓXÌÀ\J¤ ±y „ siŒ÷‹nò @ó37iJ‚š9ÏeœI[cäâˆ=05ÏÄh7í|ÒºÏUÕ.Ò6èrc™¹ytÓÞœoìT8i·Å›‰b°Sg´¬¾t쮡B]Ò¸o>î þÌ,Ç&ý¹XÈÍœ†g-Ï—ËÒ™ÌRåOKung–¶‚fÁ|F m,¡Ú¶:Ʋ®Ð=BYÚºÖ©Æ‚ë §O™Ø±BÔó,àL}e^û¶ŽV}Oy}í²eéהߛ¹ÿ‘:·½ÑÁwÜÞ9MCG»-çi­÷,BßõžlË0}5ÐåJ¹ gt÷ b[Ø»l§û,½K㦠•öêƒï]ͳ/Ð… ÷ =ˆ¶§¶0´CÈÝP²$fYBÔ>‚ëÖl'WN²–¦Žý&s,ÑÎ ç"µ™ñ‡´+èí;µ¯rqZ̾¢%Õ6‘gù¨X¡vž%G?'bZ±m}ÚSÞ&|ñ€ï“é¬Ö¬ž5ÖÕÞIΨL»¶á(¨Õ>iÁ¿ýíÝi0ÓåÚ‹½ìüÛ¦À¼G¿Ï”~Èû50e–Æ­µø;]®ÖîÊÝtcÕç9‘þöa–Sú¡Q¸á8åãÎú³D¥„ËGZw2ú¯ÎÌg[][“Ožf²žî§;N­ö¶× >ï1§ZÍ7øÜ¿Ã¥hw¡‘n'·ooˆ'5ç£ÞÞW€_&3¦G~¡kV^ºÏ7,ÙŸ›žw¹f¾ ««ÛÇ’#O’Nß.¹©Þ_‰ e¼m·sKç¼F¼ÚøªÒz31@¨ £’Á’"~*»ãÜùØÛÀ ³ªÞ+ËÕ2™>)s`®ŠÁ­’'!½€Ô–vö®×ñ™¢÷W£ñÎës#Á!ƒ¢ •" ±‚Jö•–óç>P6yP²õ&±qŽ(p©øð˜Xa'Q^-³ ˆÊøðŠxÍ06Æy©œŒ’I¯Â —ú½. 2ය.»RÑ¥z:°¬¸Ãþ êÄ †B \Ö0!ýâX æ& £  šHB`å_êÀJUQ\õq…9¦ðj Pƒ‚ ‰á‹wñ“põK…‰€¦ˆo Ét oqm€ÊieK Øö+f…Êl%‹Z ?K 3Tõª' ïXT« vPsÂ2  [¹ k¯ ëÑi )Gµb‰È[ v.™$pê&1?eˆXx¤  YW…QQkNØY…XX!r‰þÁM¥T1•\–â"0OÕUyò²õÀ¶ìõöP^6ñóÆJv–#z$êusû9)c- ÓÒ\;nÛíûË(gEàzí&4–8ô7¾ €‘EŸh%^Ý)ÿ%–‘Ô²5$p5>G hÌ%Æu4άÅëç4˜*ê~)¨®7¡W/Þ„>!á$¡–'á¾6^N%q9†j4®Ø4á¬7h%Ž—).2)Ã7é´'ª®4)i'iÕ'!4)ž'i®7©ò4‰/Ô-Rß%V”$^<5î¾ø÷%@b&’u ‰‘üWÇU‰Ö‰ò1#Ë—àp’[BZ°bû’TcfêDFèô×zëŒQü,Ót9aêÒPÜ‚Ñôæ/FzÏ)­¿bëWñ-˜ekSÒÅ‹œ=Ò”‰|sWY«L±;OÒ¸õÙóLfT]cJ3ai‡°1GI2ÜùÜ+ž}ªá~¦é®M™Ðv™+.v.Y?õé)6û)¢­Ù|ÇÙ›¯‘g&©T¢¶É¬±ÐîP$Âç©é몙^7Y k¢§¢”PÙ9Ñ)ÙÚ!ðãY< ¹q­ZÈf‘¤½¤àÎ9ï¬Ù3£iÌ¿rNrå ³ZTÃÒ`ÙÂÈÓsœ[s(ÎÂÈÜfScÀÇBˆÍüh`"YKR¿áÚ~È…uáS:<‰9‚.,oÈÓjÉc/$³)àáÏ€A“V bË pËL)ð2É£ƒ‰SlK7.M10ãi".â1ç™l,¬ΦD-öY–à |<, ö)^ )úŸ€­êÌøža Ž‹{¼–Ô4°»%Yµš&ÅÈZħ8¬{iœÉ¥‚ƒŒ7—tÊ–xˆ«ä‚‰}›¦d˜ûɺ+•°û”§»b´Fþ—©u>i*µš-©N(ƒÑ*â»?°[-Ì{†N^k[µO½œAuJHU‰ Â<±&åµ,i¬žX-˜´,kT¼¡ e7]”,z,à×½¡]‘ë y¿Êº'Yü½V;e\UØ\Šô͆:±†²©Fd¤š™šc]Tþü  Ç3«j™¾:Y¸P ZSzGšbGnÍ0A'O³¸QëMƒaS}MÄ[p®ñ¹%y[ÝÉiÚô×'âVj –ÞJ—ÖcàrÆöXí£Pë2cÁ˜6¥þ7No5Ĥ°à”²–}|Û‚õ¯Ñh•âhíD„ú(Ëmä¾Íï¢ÐÙü-…`uϤõ-íjüFímöí)XýiYwí£lQLMCåõ“h¡|{ÑÌvÓl¶R}»X¿ö5¶öÚáß“ï׬ð½Îƒ7½4Âî¥ró•ôîö.#¿îµî;eܳÒ^µîø1=‘÷¨—2 å¹záE¸å×ÍŠ×ÓÔ™w¨ˆèáÁ¶ç³öØ×DØ]ð4øMLŽ2JÃæýµ^’’x¾îŸ4—æU}FmM z}”‰XäýåZ‹`}LpÆøÄ=Ú²}lÀt ž26üÁ–Á!KbLÚŽGæ_ñÞæ–.Ž>¹I4iÏÁÈ5ž×áÁô“ÁÌš=<{ùš<1aê 4"³!Kɯ&„9f”Ù*¶˜ÃU®ŽÀÅ“>ú˜!'Š  ›YôaÐæ¼€cA·²° 묙Ñ*»QdäÑŠœM&œ »ÊÅO̾þöÑ_„#¼E`IšvÙTpõã?|Æ 4šê9y*7#ª)G”ÀÐ(ûš"û(Eû^º($:/GóÈVÛÇ,<—0p'Çë2+í†IÚÖ%¯,|9/‡#ÌY«U®™øZçŠÚ˜€¢Y ™FÂeiÁwX‘¤¹” æ¿3:šæÁi€·ŸºpØ—˜r7™:阄SmÔ"¹Úüö%1¹µñÙfùí+sÊ*mæ‚cFb~f›²ÆŸ}•sv]fx#!– ¾YûÚ;+íž·;+ш/O€Ÿä9Ž2¯_6ÃÓ7ïs:…?‹S1¡1Ëd1wž™È?1º?Òp“>r^ÑŠªàj ÏÊ Kº_Gr2¤óYvG®5‡ëA{n¶D©cfõäynùdi°=V#KA}mbm=½Í<|ÍÃn½ÐhMy­ÑwjR¤µûb¼ßó´wdÿ ˜Ñ8¶2:x©šò¼i§1‡ë>N2¾> »´ao¬¹§³¹(<æì­×èQ¾,XÀÚ*„Û4)/rêØr¢ÝzyÚ¼Û@<¡p ßFØ›qߊ£ØÑ¾Ý~³,zÀ¿c8ùì¸!­{%ÇÀGÙL íâ¹m4Sìpåìxï*—í`N¨jC–Џí‘mA2oОmTÍ f´œÝì Ì[=PèAíç’íKJR°uoN5i°rÏ«á?D´(ÐU·K‰î_cî£Yš…P_ç›t˜pW+“HÉj­7 pWïQx/nfd6´/Hmo)À©sHNÕ(YQEÉo;ký(7—Ôô§,¹8½ù|º¾P´¿/ˆuís·ó¯‰zµÈ\œ$UAlmÌi¢LágÄE·eFéy!úäF¡m»PŸ…c7”PŸeywTXŸ•c/Ô^ëw»5~Ϩ£ª•Ï<çv:=>s6Øëÿdкèn>·^;æÚºâ:½°x;Ÿ»¼+¹Ì»Xñ*ZºîÙ̺°ÒšØü~vwqüA7}\²0 ±w™ÍsŽu½ùr/q¥Ìpõ"EsÚu½Yr¹¢võ-Uæ}èÀyÃÀ~ yCºp Áµ¦½ uÅ Í}ks{Ev‹¬MØu«Oq1|qËs¼fžXÄóºÆ­¾%B¤Ç身I¹§Šæ¦Äº;¹gÐæ¤÷ºŸ »®¼[ô:ð8[çÎ2eâz´ºÊ²x$¾Ó©|ȸ\8zˆSx”ï”ý~¯`Õ*=ªÂå*=©‰åªøí@ê^âÚ‹î-ë‰5îÞ²ºWÝ{ÔZšS©úÞn:VßëSëÙÚÝuûé¡GÌíÖ‡ÚÛæz< êÙ#ë5Ìë¥mòúU-â9Öû¶{7a»Yûs9å›Ö|û5±ã5 þýôå¹°ê•Ǫ2Àëíøîµ"š8ìëíiï½~»¼Vû½Âê½uª5ß{µýã6šzºûó¶ƒz½o«µÍ øM €¨úÌÀùø¹RM}”RR>—¦H­³ýž/ÄSÙï»]÷ÛÓ§ûÝdX½|ÞŸ›aŸS½‹ÑçW^Ý×ÜŸ–˜½ÖÄš$À¾b=þÕÿFüKÿ«tôϫ̦¨>hþ+ ŠÃ!bk"ý¿ô¿\@ˆÌµð¤¸ì:OŒXªu7oX¹h~ŸOqÒ÷¸íPv?òêåíáéçãO¥¬§Ê¢ª¡ëíÿ{ÿ‹DR{5ÛPÇè(äý/‹ eƒÕ2£³t ëêkêjÓ„ÓËÒœªl]ûú{z JŒÙSZõ;&çfÀóó(‚í!¥ÝÓ Ý ›{»ûC‚¥«š<ÕÛ|û—÷wîË×9F/¶tî>?`ˆ 1ÔÚtZÛ¹r³;ü¡0ô;ôyˆ}a{DV‡+·™¼xçO¤žÁ²y‰$ Gù)ýøÜqÌB•…*sÅ¿cXúÃKî¤sy~/üc6R²2© Ö‘…„›ÔR³ä+U¬Ë$Ï 隣 Ôø¤1Ù³L—/Õš æ{þëŠT[]ÁÒJ©EˉžEÈSu+TîQl®ÞôuËÂqÁz>ÞLûôG¸þ`~¹v«ÛÊYþp zIÓ§xÁÏøfÚ0&ªø¡‡üaøÊÄËøáGÚnJa Öj‘#Þa^3Íl‡ö¤2Éû¦° m†f´;h~ßwlDÖ,Åøñâ1'„²)Þ‹ EÖÿdï¿“æSœ§xSX¨¥C€ØÎ âœÎXm%<΋¢CœL¢\ >Ìù’.VIËŠJÊe²"ÖË«'+"j&$dò'Ø(k–ú2Ìjºq)3d>8ªhßu«†(,aê²:¨šÎÐ2eéb M›ÖU®*èÍ?­I:C hÚí0‰¸Ž+,ÃÚRj>mðN i»mš&I[ž/>•ZËy(®z~ñ6ƒ8WPÒ ¨ŒÁØ ÀqÚÓŠ(spÕÃÀìJЄIeÆ÷w™|Ñ«~—Stìùy=@#0ÑOP»êÕ—ÒLÂL|×q1Î õ}YÍpË6ÕK.ÔÈ{x0½ûgvpº›@™ÉH·U–D9áà—”¾\ÍnŸ^ÎLêžÒô« 1ÙŒkýaÞ.ƒÆ0ã/Sæ“ ,[À¤ ;Úëq™y°«ÙõðPpPaVìã6<ö{9„ú 8±2,pÇg>µ1vçy”ún£‡32—!£ l»-#]ž›É¿sïÛIe¼î!àÇë%gº¶G@l¹/þTp>/sʲ½ä‰ê ¿gúò|œWöò|^wþð|ÝOΊ{ê¼í+Špñþ|þðõýB¬ó;vÄÆ%åa¨ó‡÷Â%$ë‡R@À*_”Ûa(k…³¨ Äúʃ@ü‰¨ "âʇR @®¨ ¦òʇ1„DŸ¨ aêʇs ľ¨ åúÊÿØ6 uËøB‰Ä—ÚGL.cE€”K6L¦`¡RE€R[6Lå`©sE€ÖK6B—`eBEˆ1[6ÂÔ`mcEˆÁ:Dx¶A¸èq2K« ðù"Ä!ã‡oð‰)4·“¢Àž·!"""$WhHà>7<¼"„é÷¹=+$$ŸOhHBð2ÒˆC‹õºå+&7$ŸT_hHÿeL`*аooÜýÆš|J±1­$ÈXÌjBå#AY¾„¾|Ú\A1 vƒâÖ @ÝÏþ×}ù‹„m|æÿ¯û£5xMŠcÖ)×a{¨åŠlêäRIÄÕê´åDc.àË”yò|ÜêAÁèb‹pgj.˜¡)¿áÊ›Y\Îò81ªÎÿ4¨LÏÁ©çšLŒ—b!.Á©ˆ„š\B¶b!iÁ EÙ uቭ§¾„©»\Ú1b1û¢©”ë»\6z)º¹LÈøP(T%4š£©\Æ»B1Þx©'¹B¥šB¥¶b¹ÊÁ¹RçšB­×B)] ¹Ê„»R=|¥¹¡¹ú§é—ú6Åjû‚rš3?œÎeÅj÷ƒrŠ3HæªÐKs]w%(.J}Œ7•Ü›*`D¥n&‚Ê„±rý‰¥îc“ÊLr£ŽÚ®©„›Ú":oe©¡¥9#»ªòrc}Á¥¦²šÚÆñReB¹¥ã›ÚîÇ}s±µíûÈ:1ªrëxÀ±mÊ›Æ)4\‹Z¸µc¥™’§¶rû:Æ¡Ãù€ÆmSì4¢µëÄ8ÏõÓeç¹aÕïÈšÖëp²ç Z¶ç¥»öc'r÷ûÁµ$VƒÜOcïL[(Oÿߨ=0ʶ~Xžò‡Ê}¨ABžˆnºƪ}8ǶA]˜ ÕÁŸÄ¶!úŪ䯶aú(CªCôE5ÏänúôÍu¬Ç¶Q}\ Õþßö1†„Ī#âlÆöq†¤BªcrÅö •—þ˜H/$¢Â“ CÚ Õ }bû” cÆbÕ ®+û¸è/à¬CªSö¿ýœzs«N¹Ûg}Œy Ôgü;æBx˜ þVŸ 3vÌÇø0NŸ±`jÀ•41VŸK;v,æ˜Ê©/ä;–’[žò<ó &Ú–k|˜« ©/Õ;VZz˜k»õU2Ù€ÿWÀóÿÎýOüŸ££þÿø÷ûßõÿ€LŒÿ½ÿ£ge¦cù_þïÿý»ÿà ü÷?ÿ+úùO øOÿ÷gÿ÷úŸNÖ»n5·^·é¸$dT±cEãV¹seNÕ>àBJr}×½z4*ˆÿêÿ¼dj7oßþÕÿ…„†…»‚:i:FEüÿçg¬öÿWZ]WßÐøßû¿Á¡á‘ѱñ‰ÿÿ[ªíŠ.+]ÞÚþoþïäôìüâòêºmsSàAåŸþïãóëðT:BÝe%B;V—?Š@(‘%V_ÐŒO‡è5tÿ'SP(%ÞP4žH¦X¡5î@<ÆL»œtávQ8šÂæx±uNÌÄÈ3 ÷b†ZÈíû 5ÑT¾Xjn ÒMžhØ•AW.°=Ñ|‰W¤Ûç€^±§V<öA…‰b½ÑlE]Í ­J½Uï|?ó<ÑZ«+ª1/†l…¬¿ÇøC¡3ÅvžÞhËçS©D¥N'ô:ñ¾âpÜæ¹Í‚#½anÀˆÇ{ÆðhÁ’©&9™3ÍH+7—»ïfó™BcÛÕëiûrýöj³×”HéêŽÖ<ºª§IÎÅý¢t9Ùh QœR#?ïh¹"Ée¾~Ÿ‰b“ÂhSäÚ}*¢“ÓvÝßz¹ë{TVÁ¦ˆuÃËöý".ËÃÛ^ÕsOw.U ÈF]·¿JOÍÅpä&à ÆíPÅ ÙÑoÙ +Y UB;óûr“s^çCñŸ./;Œ±wSÃòÄwÇñæÕPÑ÷N{6Ë—z81 zI"ŠUR W©m';´déi+F«±Ÿ?Fe30=N7C1ÇwC 1Û ~w†Ô5•Ü19ðF¨YÇËtˆ4E÷,!?Ë32×pš#L Éf(IÍ?+"‡'ÊÁë@Çòq´y3J¼îÇ Cú+°¿”¯¸ ÂÑ0“Ž-x(f‰^›,¨<‰((F7àÈ-1&ßÍpy?ÇèJ¸È {Ä¿áytˆdâEVàAWÄ ™`BJ\R›#®<ãT¸‡¸bj:¿^™’ò¨”¶ýAÛ5±ªØ=ÑÔh­u·¶lîè¯í}¶õÈNð<¯'†Ï.ZgŸ7£¿¾Vey¡æåo›þÙÿüOÿ÷þç?ü<Ð{æ,±~hÿæÿþÑÿ ÄCÊ›ïëEøgÿ3Zõ?ü6¨(Ú ÆÆ]ÛT>¼ëØ ÎA\Hûc>B¨ØÆ}˜˜ÁoS2~*²ûp¹¨¤R±a xG¾®JëØ0Ç}¤žÞßr–ìÑðIRh¾Ã¼±‘a~{[)Âã%ÈÑæ´˜§,-âÒnøXû ,\êÕQ>›¸|Á"ôk²1V †¨¸¨""Òö±!ü‡ø¨I‚Cðpq~‘™¸«¢Žqv‘‡è|©¢»’‰«ÌÌ'gsŸ¥‹ˆ$¤$MÓ¸ª óqÜ$)¡û¢‹1¡$¤”[bCJ²n4¤8Sa—–‹š¯,dÌ%Ð[›KÙðüMŸœ2ÁÚG”fÉxÌ8Ô2fd—V¿‰Ïš+"ájãAyÌÚŒ:åš—Ñùx̪Χ_—ñáIœÁ"æÉ-i–Ow¨Ââ<ËZù<ä#3Ÿqt¦Ë»»,Åô}ˆ wL++,’‚™3R»Ï40iŸKêV($-8æ/Á–ɸN(Â80o޳ñ¬8eß[ R/Ù©,¯`• ÑgÈÙw0•“5W¨z(Ǩ4ç0Á µR(VQ4UL_(f(u,g_—kJ¨þdÿ)!å6û+Ž6T!ÐLãèD¦8êÎ.Šâ”«¡]É1ú±â0‚Tk¢MÄ^¯. ¼u}¦¡n±Pf±’MýL¥ñè1Ý‘ñÒT–¼-K[©Î ¯œ&ìlf'!¶Ê‘\§ˆ}©_±6"’XmÔl®AH©¬¡Ò4`}lF  ˜HfÈ.$¦¡wý\ÛÃa­)Ÿ®qiµ”ÝV‡ä¦ÔL·é§Y.Wü¦q*æÜ>Ky©Í ¦4O]9Y®>EßÐ>-qì&ü>¡äîØýîHí„”© Ø´Ô~wxhnÂ0±_†‘ Óh+?'¶“\çÔ°Pê²e¦ãßÔráqmA6õfŒÐò”Ii¥Ô¹–Ò%7„VEÍ™©ùÃ%7ôÐb¿¿MNÓ¶=ç>*&Óµ>¥'ÂÖ2z…ŸŽ.?—]?&Õc©ÿ¾ÙAi+7‰Ýs˜ÜßqÄÉ>nHC%ÃP?¡–R•d|f<µ¿æì<ƒ—öíÑAßù>åß䲨—]› “i*@µ6aaü˜‹i*r=?ú–þXH›i*©=;û§ÿƒo†¦Äþ-ÿÏþ'3xcÛ’ÊàûrM s•)õ¥ÆâÇJË skõ¥ÎãÇjdl~°µº9Î<r>¿NùrÝæBež þáÿDÙ° á=×>G´þÑÿ¼íºP›íXQõy®öü¾Ôûý9¯)sÛ³£yâI64óÒbÛuiÛ¹5 ÿÚ¾ù}ã6ÛÙ›zãÔÐûu^ÌÒ°ô,óÖ¹Ú}&ë5ñ»öm„pÏüÚ‰9 ï6XÆí7˵‚^û>㉳ŸõÓu&*ëáÿØýËûسg‘Æm;ðÌú›ûÊt×m}ðÒ6ʹ®Øû9‘ÿš7Ù}Çkó¹™{=ÌÛóÊûRÂ{sû!s´—.ëBÚû±ÆúñÜ8û}“Øul"Ô}K ù5ëþóõk—çcµÖá¹ñçûNömawæ  éþq?Úóù8ë}ÛûéžÈÙâ"t,ÄÄ‚æ·ôê ûæ·áHæ_zêðÚâ!&ЖÈó‡ÙôÔ-àœ4€ˆÌ/ÌÐÅ̯.ØSM"B1  "€-€-åÌ9,`nÔ#ÕÔtß)°N5oÌO€-H$Ìͧ4ð Tü‰TžÖ-¨@5HÍW-XÍ•=,­-c-0ø9PµÌ]-ä”5ÄÈ-D#5ˆ£,@v$@GM&,¤™4”Õ,ÄÉ-T$5¥-Øz-XM ;,4Ì44àÍ?Ø-̵4„l,ä3Ñ/:ÉÔ?(ÌC4,-0Ù-Ü 4”f4TÂkXÉ „"ÿî(^ôæQâQ1f‘pxR®ª›ç¦oßádùÑÖù§4õ-ÂÇL 9²2¤ë͹Ã-*65jb- b5Bj4(ÆXÊZ$òí4Ji4jMÍm£-zgͶçÌécEÕuX"9l—Íy;-Æ¥5æj-jÎÍ¥oŒ÷ÈMý;Hsõ-†wèk-öãÍÿ{,ö‡-5æ%–šÍ° Lê”-Êé×yÌïrç?ìñ(ëv÷bî lXéÒ­ÏA¨ãŽÈè ¬ Dî ¦qœiþ gˆ2ðá ̨q áµD6¨Ò² Ç‘°â“0µHöpVö¤\Õ$w@Åx¸ÿkˆLXŒ¸¹ƒzrk²{<úzâ#d’-I’ª¸â{2iœ{¼dxœ T½z jŠUº£Í{ŠHZ²dš‹»$y*jªÇ¸³7{œ){L½QTÝ©iˆ{ZXzZD{ZÔzZÌ{Zzz{zRy¼jzZzzF{zÖzzÎ{zÒ{*›h*¹{Ì™•ޏÇ/¼ Ö ¸ÓŒ*uç:ôLòV©7´²ö”bÖ̦p§®t»ÞõLaÔ¬rj(öâwÏbGÏ!õ,¾Õ,0ˆì™uÇölôP€à”…SFÖLž{ÛÝsÛ}ólÕlàÓì®ðœ:öœ£qû“õD׬X@bÖQ«ÿQbFáiöÞºíT.ÑkÐjî{N?T ÝÜ#64[ 8º,³¢=÷`<±"'5‰#ÿWE>¦E>Zh>ÎGÔ9ÛTd`xniÐ^F:DuGÁÁxÃE2DKFB^ZvzBF.²F!}F!"D!F¾€G‘Є[GÑI.QG2a{¼˜'ÅDÄEÑoÓ"¬‰|µb ;iŒX MîdÞŒQ‰BCŒ±ˆ<~hTÆ|Šç ;¹ 6â UÅ‹@²wA‰R׌ÔôbðÕöˆ2Il÷7¨äÚМùò2‰bˆ¼$Œ‚t‹B€û›§Dl,¤‰òFv †CŠFnk9ÍD™ôqÙ˜|¾[ÌTx¡kEÓENk…“w[®Gª8XåÊXvpzÅ9TN‚„ÝÕxIŸxá¯Ñ*V”ÐÌË÷‚iŠìQr2ˆìK¨jʉêª ü½ˆê#œÕê“ñ걜‹ªèaêD‹ª§ŒêKŠ2PŠÚŒJÙŽB8ZôˆÉ¥¸wÈ"‰‚ŠgûôŠ:¸ÏÄâMè,ñ*„Ï*äÍ|Õ ûË ŠzÒÒêÅŒú»z:ˆÈ:PŠRÊ¢wú!¨"O»Ê÷bŒH;fÏz"Ì2ÓV˜FÏü±:ZN@ƒåD-øjyEñ—b̲šq!GÕ_ŠFÍBXËfÍf5Ïf¼ÉíÏlËzqèjåÎê}õF½ÌœÓz³ÌFÂËF퉆‰ü ‰V½ÎfÆÈV;ÉÆOñfÛ,ãÏú€‰æß”%º™nœ­†ž­j–-j-𵕹×Ð5ú˜­×y±œ5Ö˜¥Ô•­‘M@£Ï£Ïf±ëä•*m|›m¥ã ªmà#Ðy-œ¥z¶šm¾’¥Æ™ª’õÕÍÝšùé– )­œŸi›¹0‘íŒÔí3–]˘£˜m•íoUü‘õÕ]œmž”ÞÏ¡Ýñ¿.¥qï¥9§mÁ“ÝAš w Ý^—Õƒžegê–=­Îœí‹š}K0=S–]X…ëµóî}0}Ïžõ"”=³Ú`'{s/{±®:9»A§ZÞ<û_-k ³úa·úá©úÎ,=%%•Ztãqtêuý ˜=O“‚›½W­™5W¿°êÅ,a¬†^>ÿx5pNuªô‘^õr\ubluÉDõ«Nµ¾s±iÍmv£WQL yµ«kuRH HiåÑ| vVÒŽ5u½†ã@5»£—¯QÐoöDÖPPö“qå`Vû~õ*Wu:höygÕ©w¶ìfvB[vGVµ"®Š“a:©aûy½Zæ7Ç.»ÃµÆ¡µÆ2‡£²ê¸"j¾&ê°&¸&›´&[¼&Û²&;º&»¶&{¾&û°¦¸¦†´¦F¼¦Æ²¦Z·Œ¤Ìݨ¢J:Š,\+þm^…o’Ùß‘Óö°¥KSõ ¡@Pt3GZ3'^3'T3g]3W[37_3wX³\ÿáÿÞ²f?ºf¿¶f_³ÇU3ŸQ@æí=.ÿvK ôû˜^Ѝ„ÏžàaØŸ,úð׺rYÖ²Ξ­ÃùžÇÃ^ à^ Ò^ ñ^xØš‰šºÊ#Í(¡E5­œ*°[dË^äè^d­^àú^äÃ, p/ i/‰x/‰e/It/Im/É|/Éa/+p/s[/J_O€mWBnËÝmº¯Pu0u{©L/ñH/›x¯˜e¯Xt¯Xm¯Ø|¯j¯M/ä.M!–ôx ¥ye9§dM/[TgFLthÖ”| \çRNo–è_gîE®‘yvÿ˜,fMx­§e¯gt¯gm¯ç|¯çaO¦ÀMAÉ-«[’VÌÝgNÐRŽQ|®QJ•YÀnzÃŒ¬R ÄwÈg9LvxcÁ|Õüq­·hʧšß†-mÄJõlOÂÞ˜ÃÞ^àÞ^ÒÞ^ñÞçšQÞ^¨¹(¥ëÞÐÎj1üF…kÛ¦hɼl™|ÔeJuÙSö˜X­…FïœFwýD¶…võ»RnÝí?x7TGÖ~·uOŸxO\uï^v· ~l½vÍ“aï#òì#éì£øì?Áî“ïmx©U÷hls–•oèH€î´Gzõ¨IMˆsÍ#Gwï|u%z[qõôYö!xuéHôÓÜ #E’æŒWT¸s®‰Ju[JdÁëÌRDïËŽäpŽxޝ¶Ž­ŽÉ¿·¶¸ÛÅ2L´%wH¶úqšÈnÚ¦¼[6¿v ­6[½;é7Gú8'(bN^¢Gl»7ÖíQm†9[š[­4HŸýêGbÔ«vÝgQ;g1€³8œs‘ê3€ô¹ý÷V)·c&cå>w3µÍ°òÖ–ÔInÕpg?§×¡`¨³º(ÛkÞlkÐ0È‹³G½³Û43Ør}Z¿[Bcæ³”BsÎk ´42³8žs%>}Åv}Åw=Äs-w}5âs=:s¶ s­¼½ŸÈ³"¬½RÓuLµî‘¥SCy¹ar¹›Õòʱ˳À=ã¹´µÓÓxÓõ¶Ó/9vOÓÅ A¯³{”ÑR0ÕˆÛ~+s7q>“߸ޙ¹žÈ¹FͽߔYZ蹟Œ¹ð»F“½^\ù^‘ç^“û.åÞÓÌ^‘Ö^ÛÞâ,±þ^:™Ã‹l¼ž§¿.£\¯2ÂÍàgVXòl‰ÌÞÔáŒhÞýÖ~úf¹ß‡¿A©]$À}TÓ}”ß¾§ }Ôú¹ç„{Ñú}nÀû¢?ûÀÌû¸isMœûl÷ŸóÈK½zÄÖýx4Líž»«}€š'Àû$÷“+»•”1OÕSŒñÖ|óÇýŒ-óÊ%ýžxëy±¨]²®}'Œ½×‰}ФýX¼y)ôýÈ–ý¨øy7–}Tݽ.¦¾2ÄþLÎ}MÛyÄ\Oæûí˜[íí¥¤{®b{ûûƒqöƒ¬÷=7ökÞæCÓö+ãö]#÷=ëçyöçetöc¢÷k:ö…>÷{Ü÷c<÷¥H÷k ðó½9û}aû8H»äRûØÂûît-Ns]ØùãÖí[ÙkëÕ˜q»ÝGðSàøgÿ³c¸÷M¼žI’ÎjÑuY½P‘ËRY÷\1ŽYè—;kœz'•*+¡¹«ÓŸ| SÙÎk<"¤)£€17R”º-úÀnh?žÒAd`~¼¾Ëwξþv ?¡aá‘QÑ1±qñ ‰a I©ié™YÙ¹ô?e¦¦–•W†h[V›¢›Yj4µbÈŠ±Hò±òˆtôãÑ©p²µö‰MŒÒµÎ 0 )õ*Šv3,o57é"›#íÔáìjØ_z¸ßzÛÛ\<]ÛW¼}c~ÿè©ÍíñA!ãhÕÍí †ýAgIR›?Ë¢Öš³?C4 Î,_I·%oæË>„bILRÊ?˜JÖ¡sy;[VˆˆGK;²r˜2II ÊjhÊ”(³0дÙZJ8®)ðR¬ÕÆr×ÿµüèQ‹Íéý½Tc¼¹¢(ÚjOÚŸ¬¹zS㎺u¼ifTU…f!­ÑVº˜±í¼¹§(qhˆ'3WßBê.à£%­j<¹$…ð-×Q¦¿1•® NÙQmƒGýD#Ûµùø´Œ£Æ‰›ÕÓü;4)•M÷p49pAÒÕ}·—ì¯[¾NöÇx_y/µÎã&`Úx¡«óKš õ&m™dZÍvvHÍåGüªa|£ÿO ÝwÇÞªY8 ?ô/JÖz`r\³ÊÀ–S‚¤¸Ü#’¤Ivj+›ZØÀHN§·EÚbÜ µr²¯ LK™Í*!,)¥Î¿™3ÐsaÐ=Ó8·Åh[óeH¢AÌÔS¿è³{±°†Xx·¢ ²¿¢³á— [*%i/7è¤öy†ÀÄ ['­ÄBÿ@óùXIËL²/9†Ýj Åá†vÌ¢s!/ɘ?H.‚0¡ÃÍ]AjÙÅ ÙU‘ã.-±zŒ=5 ÒñjS*ÉK¢7.1´#ÎË'¡œŸ•Õ`©T®‘´‘ 4Í©M—iêf:~)g^ãÙG"ÆIaV!æI× =«ïÓµP+”f_*Y*&W/Sc,?kÚ9O3ki`ÿQÍÛNÞ$r‡“_†*_Zs£‹~E@[Bm³ú¼.Õð%ObѪ#vcc|5TÕÁ™Ö åö{Û' L±ÐWá/*78†¼TðÀÑ ã7ýÍ’Î/£' §’ÞÔ~·baY2e’¥š‘¶ŸÎ:Ò¦êFZm¨ÃÃGRÉ߈”7šyâ W*Ì!™ZÈ#|ùõé|YÕþòaY7ˆâiÕ0ÉòiÕ´¨âiݲéòiÝ6¿²qÕ>Y³)Q¸åC82Jn9Åí­•š´ø›ÞaWÎo osèòe?F˜êå0AÙúå0ÅXK£#ñÜò¤öxã¦;’mÒîÔ,£ën¿Äù% šâí²aÙúí²å¸êíºãùúíºˆêã¶®‹ b Î Þm*†Óõì§ÊóœÔ[åñ12|gÛÊÖÑ:èy׋Êëõ0ÊÚëõ4«Êëý²êÚëý¶›ÊëóqÚÚëóu»Êë x}íõê˜uÓn‡˜Gtb2Æ7RœÄi‚_í[V¶E^ ÔK °ËbéAp¿ñ#„È5®írµ´ëǹ\‘©ƒñs£*HØêkà ;÷ÿ9‘ å<Òÿ ð~Äãÿ…Š„AÀ%ZëŽGç*Õ˜ŸŠ³&ÔÙ'÷)ˆ = MˆÊD>RóÈÕYm 1ëÎñ:ýFm¬BD,Â\KÛÞblÄ|.Ò±ÈûÚM”ç â….oþÄ“d@ž]ÉH—¥iDÀÃ<ÖÍȈû]Lì>*KýG­“ñ2>„舄PLX–G2&žÈ˜\Ú}‚ã‚Þ ŒË`žÏ•Éë:¥1ɘšY‚Þ1õ3€À5{½ !yÈ„>Z¼K\Aq`£Ó'pYÓU1R6¾ãQ‚‡“é3¶d9Òœ§I|^W¾6Cp™\Ïøßh$atYñ_rRK¥6ï%÷è ^O% ¤ìÓÀ²^`H¢Â¼¥ •ÎrÇJ‰ÐŠÅ,—e ×*…*åÈ•zÛ¦¼?êË=ΕxÞ ]+ ÏúÝÛR«*ÍÐóÙ•FˆèJáˆõÑ@”Hj5ˆÅ8`Z*¬Mæà2.ŽÑ•Ôž³ ÏÆ+Êì–+}.HÍ×WªÒõ´†–†Æí*í_œ‹>,%~Á×Öª’šm›’,j꫎òE7ê +bœÈ5ADѲieaùW ͽfÜtë Û*ÍŕܭÛFÍ•–Ü‹á ÎóMÒzÕV&ïrwáÍ ––cK Kʸ§•º„oè;6j½VVM5é{-°,mk`u¼ÉíÚ1<ϦÞÔ–½›;Í;¯]5Åa§Ÿ ¾&É5)`uüï’Ë‰Ý Ñסך;jiF¦aØ[X¬¶ãÎ%v®ÐúƒÜnõp*‡ŽñXЗiMäÕ ìŒZ³‹¨côÔ4QªY‡ßj}ßIœ°«ªØ”‘·èúŒñ “_·i9„ðwѯ[8ÎSb‰u©¤¶¹ÝÿÀ %¶ñ; 8ê]è)¦)Óg¬Zî‹z¿6éZ]GŒàï3T# ¿fP¦v¨3i¹ëNZõpšKÓMç]Údp ©Ë¥Òæä˜œÊ]²ÏD…Üê¶é‹è¯´ã?ž«óphc@,51Z5j˜iœ#ÖÇÏôCQ6ݹé%ª¿­:á[G?ZS~0.^¡]·_êJ>°xQí]eEœ0<¯k=@8oyJP"·o>Z]zuÍ¿3y!bÛç¦]Á aúu/9'Þ´™–·1ЊŠnôøÅÄï?>JþNKoêKåzž¬÷"tƒèXó$"Zs`ï7TÎ~…Z UFï?S®“¡,]v¯!…Kø“¶U¥Ú×–¦F ‘ÇšsžKVeë…Ï%—œ•L=w¿¯¸Új~-‚«Ê6úu· 7‹œ²¨»rM :‰¥^àÛ=Rm—!w%œ4¸?#¤jW‘ÇžÇÒ¾K†a 2eûÖ1ar>€9·ÕÏæ,ø+JÅ׸ï[÷Ï]Ü·ATŸûp_¯CRÜ÷IUŸÇô¯SQÜÅTŸçÐ^õ,Ö£ÂÀ^ÃàÚ»@ÌÎjS-7éÐow7wnïrSßOir¯¦×û¾WÄí×X¬ÇÍ]íÌãR„í~W¾_Z@f@ \|`l| I“Œum)o;ê‚{÷ ¹¡»ú¤É¸ù:xa¯øäÓAÀ¬€Š¡úÙÂx!˜¨øã*Ä"ù~O[ò£Yuf£UõËÚC bñƒñ¨ÍõüUª1:¯ âÜ*ù¢ šê{2ì ²€úÕò FÅDD¥)È_KFöW‚KI)h6xë)tÙ)r[l–$˜S*MˆJPn¦øjZ:}Ûp¼šQdu“jÚ€ÿ¤Kæ  ÄÐ , ñ&s+{%û@%ûÈ%û$%û¬%ûÂ4{ÕÅ Û`ÔWƒ…íÃ4u“1ôº5žDxSajïçM6´¨ÿëX–*ý…¾ÿÜŠåRHòZvzròaæ—5 0q Hô<ú@fÀ4ýô¶ÀwSᑜ'a71Öü-Ì õÜáš’÷€$x´ôäVßçpú<û¼ÜÆÌê%ºr0¬r$!r ÁóüñÝœô/yàI|êù²_ Gz Põ Ò³äÒ‘ÄßÅ´Ã ûqÓAóÁãÛu=ØÄXÔÓÄôÞ1,ÔDøÌ„k0Š¢PA~’\Ø>u‹¬Ç0¤Ó˜²i.ã8þãž8"e¸rås%à÷Âârß)"˜ï ¼0ÿ;Èà9Eç0SfHçå½³¥úE28ì-Å¿×ÊÕ|zØ]iYŒËTªØÁ¤D0IÝ¢n˶סšßÑZÓå?_p:Ó ®`ªC —UÓEâÅøxÉ(0N…JÛ ®Ó«*u+ùïKã\#sùŠ6Õ ¸Êk”Û«PÎÔ¾p¤ ¿ü‚œAu)Ö¬9xÅßÔ"©ƒÝà²Ü¥ø(ߣFŠ^ÜëdЫ¬cI^áB†ÏkÒqVúª#ê¢têéÈ`!Íó OŒXÙ ´–¥|Ù×½ùÝÉR™Öõ Œ«ÓA‹æTyÍ 7ʾƒ’¼§?¶>‰H}­ä”ÒK«ê’5¢‚•¼°Tª±:$×Ê¡ºkž5òÀ6[ƒ àЭˆ•Œ¤*8+åÎÌ5Uä¶zkʣ׼ř«ˆ|ß L”'»ú–Dê´Œ—·¢Vdï6G¦ƒê‹g¯g×V.ˆæ›¹ÑG˜“ç‹SF«ç*ê²¼—-=¶ù;×ä¶×Šƒú¶£ûµÉfþ”•cm ¯îb'NÏk>-´©·và ž·£ƒ¢¥j¹É).ª¤´cŽºuF2¶ÅŒµ÷ú¶²wþíý/‰uE!u8Ñtx¡ƒŠ»V˜Óïáß‚7ò5”}&4À4w‡µåÜvÚAWÚëH“MÎëžßË &º¹«ö›gÛÚ: {sÙzÅÚûÜn’ŸÞŒCÖÙßÞ0¿iöÚ¢gRºéΰ÷È”.°Á@_öÀh6o95ý8(;£÷ÌÔõQ»È× OÓzƒùû/×Úø(š9ºtØs’ÞZ.@ ¼­r-v˜¸—“÷æu1WdÆö™7—®yŒþ6ãÊhA‘[ï÷_œêÑñÌs{‡åa²­€ÞƒeìÅo‚µþtLïŠïg_²‘¤ åFƒÂÿR˜Å–8ëŠl/Ëa—1¡`D1y:âÍq§f <7/HðH„*æñº¨ñϨœ>7Œs#áÀ ¿ìéØ`ão¯ ¥Ñ†:ÌŽÚö¡Xq„¶ùÁ÷-Aê³¶©bŒ‘EŽ×öqž1·–ŒVÂ8§ƒÔ@eöÔKvß ç29u†ÞiêO$]ŒPqô]­¸NZŒ`h©NÆ'"N'VÞœŒåò%&ð!§Â#&ïÇ]~Ôð{°Ó^:‘Þ"fWÞ|4#À–s@9jÂÌD=&îðGͽO`áQ˜À+)À™èÝ©3Ù€¶™¸°Q€½©‰y5q¯vÃ^´™jŠ˜wÌ™š¶y–IcÌÁ@¦mBÍ~Á‰f®0Ð å/p0¦¯“Pœ) â‹RÐT&ÁêC!kŒÌ‘Èš‹îaœœ’‹Né°Ã)Eµ`³< á=Ó7î Ñ3Dœå”Ä&—𲔋(æv•j 1±…Ù"Ëê“Ðpø«Ú?ÀÍ>ŸŒFš¬€ê”Å¡ª²•¤‘UÕÌdgUwŒLÎj 6 aåjŠ$«<‡t¦efvÆbÖ4àl‹ûø¢&Æ*me9¥àüLýàß~k)×+jõMś٠s€i¯”£fÐ.’ÝE”ó¥–ãGCž›LøsP¹˜cµÍ›-󮱫Ë=øËñåÞí;ÓàÊd>ÛÖ*ÈÈ8雫‘³•KË=sëa,{;_;ÈX;¨\;ûœE¹ |.ñ0è›ò´»]ï[lÃ÷«1›c´ë†cŠq°5Px܃¡„ØmàRs¡»]y;b,dÝ{Ù´ë®ûÕñh{Ñ´{¨;LÖkiŸ™žºbJû¥pk$Y{üÕ½í®Ï8×k™2› g¹âclÕëx]:S,Z¡–ßT~å+òD¶ ÄªÁlÈŽ™¶ûyd{YKŠW›šlU ÖØÇ ‹ûœG‘6ǵéóã½Ç‘é{Óv`H?ÉY'©]'é['SSl'–\K…ZK¡× v_¸ÔQæÞÈø§ÞgGrÙCÙW'ÍZg)ˆ]å%ò§D–gEU&aWË\™•VS(ÿçÖâ§Ðf')Z ³Xó\ Z¿†;{ Üç°ž =Ü`%V©‰oùŸuÊY%ÒW~ð•.ÓZ—R 2 íßÎþ8º´Ï#7/ݘ.ØÔ/v1—’p;8M« Æ¿5MjÓb¥l]Cb_,soáJ^tgè®+Ž´å®;Moø´Ìǯ"¼/D›ˆq¸¼Ž7:n‰?I¡/¡¬÷ð¤N‚¿…Ùfʳ²Åd¬²hOby_çÅ_¨ÝÍjŸC|_ÝB×}ÑߎÕ<ÒCƒ–Ê”C?ìS?ÊC­"Y¯eÜÀ€>‚yß«W)d³Á=!?%»ó£OSï !>eÖÜÓ‘Ý œc_LG=\UÝFZkg=•ÝmZ'ÓNŔǸ¸žUìç¥Ì÷ï†ò½‚Xe?Úö¬›ß£mh½|Õœj¦Ú\¿Ús]Fi?:_wÏã%»Ä¦~›æÛŒu´Læ2™¨có»’vL€(+–¬ŸÞÑž§É"¬ÑÏU1H _sçUïè£ú‹'Ñ kÚÄ—ñd(šÇ¾MØ¡Œ D£¿üå~ 2”s‡Iƒ Ç7Е¬P¦4Œ9tîT>Qâ$Nž0rTë”ÆŒk΂…Ú²)Ñã!€xïîòéðóõãHï`#e-£¯—œÀ–NLN.H—ŠHFG‘¯ÆÀ–CIQXRQBZPŠÂÈP^SOÜÂÒRÝY]‰—¥ÒÞcÅÉí0ê4ýU@R,oH·¼L¸¼˜h ½±¹·¿·¯9=ýuÜþ»ó7/· ïïA·¾Ï>þ!7Ÿé¸C½Ó8^ªÞüGp• =jƒßuFØœ"QÏø„™àR„2вÓ<Ùþˆ±lü҈õa—õ㼕ØsŽ\HP<› fæöXå±ýÒù"‰T†bÒŒx—Ô„Wpå\÷´!³ õ~ ´½¾æ6‚HPo3³(ú Äb0à< ­sÅ=B ç%LØ |¢8â‚ÀƒpÄ„À#ãc«F¢Ä½'•_î±ýa ÑRE¬ërþ³S °“¤[m©&c1p€'û²R“5ï ck°ÕNâ’ÂOÑôÞIó ­ÍˆSðNÀS =ÌCrÃèdEñ*wùæ ô…L,9.‡xì3çbÙµßdæü ÇååJÉ_ôü†,É/Of`D”¦M5–¦ñ»Å–ú˾¶àa¿ý7ÂÉjɯއ§ELàv²AœRþ¼nk-’´j;DGôc¶Ì]s”UJg½ê‡…7›¡ØT6=Ûˆ˜ç§ì$«¢_šL¼@j½h X£BJRî@Æ[¢‘¡¶8§k×ùQ  ´Dè<Ô$iJ$lP(wTKÞU%é>@l×}Qk×ù§*!?>³ ׈¡-`5öõg¹ÕñžWŽ>Går]ÕÇzÅB-Û (¹_ùëí‘Tüý;Íg b”_–6Ò(ày‚V$°ƒ6*ݲ~&Ž ÌRà Ÿ§èûDH!ûE‰q”F¤ŒÏN.YÌf—Ð @€É˜—ªÉ“‘uLušÊQžd·°N´yÜÊÔ…˜ÒzhmÀÎp™?ŸrÝ`„éÿ˜4µið<È"ŸÊ¶2O‡‰(ìò€Ê‰$.ô»0Ò(ë­Š×T. wH.HiIÒ#&g‹1) Ë ³oÉýS “µúYúr:̈ ¤€ ’騇’F½ƒ`±¿û3"Ö~ev Jǹ RfßbëËè…%nË?43ÄÂ\M^PW.4ÝTšt̺ ª$Œ`»ÜDnä¶Àúžý7»ö>ªTÞ Á_ª2*´-µ.‰³[ngIkŸI0)÷éÒÕå)öE®P}ÐBËM±h¦ÙTRº#5ø£©6‘ƒâ"¬1T…1@|X›’|BÜ¥Eˆ˜ôbRì˜ ṗÂ|iAW‰lÝ[‰ ÖÖ狵hõ3r1 ‰RÀꨪC;®Úû²œy…@ña¬”½¯QÕ´úEa!~uÒˆø ïñí=§TZÙ_g²â(ãh½‚ó7´µ½ŒûqiÎb~3]E½Jû‹„²¿ÎoͦüoAPÄåþ3P—SÜù ÝŠŽjo£YÊÓ7@±îÒ<Ø~Þ9ÖÍN¬pʦGtyßµW[!ËÝa^¹yøëÕÕãž&q|2òA¶’K fÎ|çYɘÓö¸eížÌŠª~ãÄŒ6yã{Æ…8>e›+·ã4þ²k^R­xϺÁO°@»øþ­ÏˆÀ€Â°v" : 6ee`ÿ·oÿ°å=àòÚsVjjŽêžr8uøÛº=wôÝÔÅjK±÷+¼ 婦•SŠnÈ«²?éÓË!ïj°W®´kø×^qòüß#W°c½sË6œI['³\]R°T»w¾wú¶ðÓÔ°Ca†5Ÿí£áúÕœø§á××Ì¡æ_Ó7©±®‰ÿ45墵!B$ôë½álãiµ¦/ÜeGaT§µOño œ#2õïµ1á2‰ïF¼ýBÏ-•^÷у¸GP€ŒÐË˽ÈÚ€òÙÇW!Е]ǃ·È†—Ù‘É’×ÊÈžËK°ÔV¼¾–ù\ŽLÆ'ÁÆG@  " DrZ»±À(3í{05ø8&¿~÷D¬—«ñ™ã}žëÜ˃%éã$„#BGb3ï?/!k 0`cîíΰ+kÜá y@ʹ/,ÿâóÈß'R3C;@Å3 @Ç A¼C^^;þE4B0Q§‡-±Œ’’³å®¶¿IÓ¡¹Èxz_ˆ4#¬ÑÝžMWБNöž'“\€×‘[NLÀOᎯ8ÅL€…ó·”_ŸZ˜œ÷¨MH¤=Q˜ qýÛiNN„e¬ú0.yYâaX:ô*ŽÉ_öiŸQ"©ˆ‡H€¤HàýÏ"A"!‘"!#–À4¼Æ@°aiº"ñ2/2·²ä¸Zàý¶ò¼PB¦‘2ò¢üî’¶Òª×ò<9¶dL&u¶$FÚÝ^Ûpôo“_ °@r‡|ö#Ì*EÂ6…ÔùSì2a¹oô0vØÄßI…ì(yÎï26¸]ö©#z«ÛÜk ÚC»á)â1ZšI*ÁTðÀ$³D@G¤ÃÇÓó²rÅIMSêÄ“X9ÝøÇ5ZF” ”*p­(‘ó™à‹u×µí¥ßa¯<Ïfä¨,•Ñ îAc#ù=çj"ÎiæÌ‡¯ãëj#)çdêÎLPháLeí…ÖÊ߬ÿô#Ñ|­žÜwMb²†O4‡œò¹Ìq/•×¶ƒKx’e|úIw½§Á¨ú,à…,á÷-`õzôï†ó­õeŠmNJävöG¶Õ:ÿä ñ—ò`À›’èÁš F¯+¢,dR°í«“x¯ ¹ çÕ÷ãx$xkCa/“7˜x[™ºR[éìYq»©˜¦gŸÊ˜œX‡dÐOì ·ˆ"oì¬Lã¡[œmú'hò‘r°¸Ëº½LÙ˜÷œ¨4NkŠNÊ< ÀAÍ ºžK‚1|2øý´îé·nÚÎØûʰ'̺…ȾçIŽ÷ËH?¢ÞÎbÊ! È<˜Ê•4~¹Ð”\XÈÒTÊIç³òÀLò‹1ŒeX$S%Îsåö#ÎÈÏè7bÌ-€á“&P¼÷Î32“öY9òA÷ψX¶œ=Ô8þ«q¬Ù›ÿTq™§Àa‡ÓƒÇ‡2´‡‘›!i¦ógô”eàXô7Ÿ'ed’h­-åƒ%WÔÜPÔ¾TÔ(êÀ)köØ}9l–‚±Ô9ç±ó}·EŸE·UÚÑK:’xlp_´rs(øšÏ*,âò;.؈,i(¼«ó¦ãÑÛ}þ ˆ JUŠ9¬JðÁΫ_ØFD‡Ñ Tj W6jTÿíµ(¯4㪨@‰®ã¡ªäú4_V̑խ—å›Ëâ® R+\åü¡T‘Ym–Û£eƒÆ3‰8V¬Î¹>5˜»¼­[&Ô^1Ë0ÃpºÄr¹r6!Í=9ò¸*O«d 9¥÷Ïì(3;¶&ŸÓ¨,šVT1Ñ2¾(ðö9²_V¼p6SŠŸ7&Ûv7Y0•Tòd7[!ÓW5Þ]• ·Ñ\©]U\AÂmŽœ”uÄ+ͺ`çŽ[ÙNÚªXt„¨ç?‘›ý*¡~ FÙ«ø5ƒ£âÎRe £_W½)1‡ò7£º-:}á¦pÚæf£´abͰØp¢,$>¾ùfÄÜÄÌ7âÚ¿7qss™sƒ6•Dok{nF^Q͘^ÿñ>fðÝ]”pj«œõ°A“`BÀð2ÚQ9ia»oRæržQòg¬àqå¼Ö—]vÈ@ýy'R¡GdŠö{åö«~žÁ eÊàæä†Z²üu"~#'+å])›Ú¿r°Æúeç3fXx£Œ(œš"¿Jƒ¯ä¬Õç΃ Hö.l€Q‹Rv;C®¹“P‡ê,ˆXàïF £ÃÌšÁ#ý)ÑïÑ¥­fÂÒ”#5<±äõ«I#‰f1g505Þ@‰Ã™ .¸‚„ýqœ9ˆc²‘cµakË_•î¶¢°VxÕô£zLEr ÑFUÁ¤1k± üñ‚š&ÁßÄþW&á„ä-Ñ»š, ÂZ×”ÝÏfÄ*” s„Ö}Ϥ©ò8è‘öæè¯i &Sf2Ý@}Æöu«ìôÚÖ65.&©#:êÓÕ"n\¿zmûŠ–Sx†U Ç'úÓÓý'ËMÁg‡íŽrÙßÄáN‚ðÎÊ-Õòº`‡ ¢0$J¼Íú ºUí¡d’–®{—ê+Ú 6• 5|—ÎH©¿Ã-ÐW¼T,Õ&ïŽõLBCý.nöÊè™YI­rdVêófç²*º•Í´¬M¹5':˜¨-Î'dÌŠ›¹"øü¥÷J©õ~«ÒL³{Jâk{,+·(Ï÷@‘óp™b޵®¾®<šµ ž‡È*Ã"…’È8´äÿ²ž4½C&+ºä›!';\Ã7}š¾ò«ª§³Ü¾Üô‡ ЗŒ‡8Úâ‡g¸2©oüŠeŽ¥÷ßpÉßkIlxÀY|Å›n•3,󆨶·Ät¸d`£iÝe¸‰vrMÍ‘Fe²ïa¦sqôgeój± ÉuÃOÐq-ð¼¥ú&ŠƒbIøË—:¨oËIÛZo_ìè35è&ýÂ&ÙÉ´£ÜªÝª Xµy‰5E@8Í—áý# Qaӈ˞‘žé–èiq:˜ž$‹G{B,õ#Ç‘s¿¦s‘{éxkà¬ésmõji¥ùè.êÏáŠjóLk5nAÁ{ÈVNs¿÷RxÈTþúUÀwÃLÌNçQ0ÇÆ˜î–ÕKñxÁj úžýúÜÉRšJ܇¾`ÑÛô[ô Ç®±Åž´÷pXþƒKf̵9å5­wnòÐE’±ÕÁ­Ï:ÂÿI×]™¦½âRÕ»–£eúÝg‰=XÂ]@ìäE¡-m·£ßƒÙ’’S3›žÑSˆñÀb¨Û‚!íò4pñ™‰qïbâˆËÚq•äëæÎÏ$ M`j‹ÌŽhèiÓâÞú[|Èó³µµ#ìšµŠ¶µ9— ¦£“‡ðTõ-Â)@™Â =(½Á¥²xÜÌi±ÅI¢³Ú¡Ž ѣȀ¬â/~¢"WP@'cg‡D{Õ_×QÙ©ÑÔúôt`ëžØVM[ë#à<Û‘çsi—äDÕÒO "®S3*ÂÚwê»âaÈ×€‹ÎGW?×;Òã«Í»ëü+Téi\©ËÇ£®FnMÌà²ã:iëó ‡çå¡ ‰¶-wTê kh:‹8ÊësúÈ™L¹7xõ#é«×o>¦ãÐwß„×hø1—–qI3NÇh°_3Ü¥!¥™œã€˜³^Q×wRUS©©É.Ô´j>¤ÁXÆcÔâc]ˆåá^‘B>»•KÛeÀVMoaOî×À›Ý¶g™Û" ò-è‘ç5´µsÕåP7׺YÒg%ÙãÕ÷\ÏÖÒn·]|d]îK²Ækwý£«{¶‚ˆÙ´ÛýtÿAt|f>IiU<áLÎ.ûö“ïÒƒ_×|À½FWZšñ_Œd™råKäÌe'á]YÔÌeÿôlžKpо9ŸQÝOlÝ&3šˆÝb[â!¡Ú¸Û8ûÚx`;IÄû DFEÇÄÆEFÁ¨‘ÈÙR"È"IdQPñsÀã¹¢KJËŠKJi’ÿu+¾(¼MšM)úì½QººÝm;=ñÇú‡——†ÍOÏAOE¬.­HW¦S6öÚS2sâŮޮC³ö¯nX58LÖ!p CW»å&AØoy¥²ßùˆqd>nóvâö¨Ç…aQ(ÁGj bໆÜçûqJ÷œ[/ јa¼ % Óó•à`bvEgG ks >v1d¤®¥6àÞ@Sê­%lT€2µÕ*ÇáÃ5£’ßéÇÇë}Ñ~µõÖý"[[E4§Ð¾¦Ë :ûÖ‰‚ im¡¬Óœ0¦gK øˆ³j3¦àÌ C® šYé®óžQ²fD"ž¾ÒíŠøy’*§ÙJü®Ãúˆˆ‰Säð÷ZŽUÒþz„À4kˆsän€®(31Ž>&cè®T½î¦ÅJ#@²öÖ-Ál€&=ðLü·7†!¾ð_h‘†&â ïølÌ÷\W¯žÜ&Åʲ“è ·€‚ÔY– ¬<•.Lé\¯„W’<ºà”ø°áòä>ÒÁˆøéÔTÀ0¯îSòæ çr7g¾üœŠö4ÞhÁÀ^=Ó¢Yß²²’÷7òš^0u¿~47ʺ”6¤ùßð3ÖNŠ,˜Ò“‚a3 J¸A•Ò}*åeþ¤:XÇv¤Îm±†YP UÅ5"d•Q¯ÇekmÿÚ+#VY {b“>—_ݬE%Â;Meq©‹õAŠoûäˆ1n°ÈhŒn¨`P[ð4#(çÖ NËá‹¶€!µî8Rºµcþþò·9JÖÈ:Ls@É;{V1ÚoCv²äS²?1èçªÏú»•_ªÇZ«ýlæi‰.UÍ){)«ŒÌê ¬/n— pXéª Rê|)š1ëÔñ™7±þ(jgpÈø6¶±5˜wÓ).¥F>¹;ÅÊ¿·š/úêÉ2&¼nÄ‹Æû/ÕàÄ ²Ö3Xr§îðv ,+6¯òl{MÑ·ïWù2ÃÔ¥u0ï}á ?´S]»1ìûMP¤²¨]WëÃKMfä‹ùtªµ¶»Ó_ åvnNkv³¯i?ÔÅcy€“×ûXÆb앃ÙpyÅÄæ"mëFm™ž«Fõ““fÀ·ËÆZ"ød~nKT ðŸKØD·X%Z{ÍýœØÉ0Â-m´°É×׆QŸ¯À(³ H‘DöÀV#ÿýs_Ù79õíEq`èŸÔ2õ§t/Ú>èëXM”ÃÃc“¡˜®Ÿ Pσ& n=ÜŸ¼OÛR´[Ö6"¶L'¯s I„/”y.\¸L'ê&Ƭ8ãaÂqåÌyˆ)õÒ„hRýÅ#¢™dÌ3"šó€MÃá¨I ø2 ŠšƒÖDq«¶ˆ^HëkL¡ót˜š;永…;ýߨ{ °ª–/nXQ°%¥DTôt€¨ˆ -R’Jw—‚ ’* ÒJˆ‚JIKH‡„twƒ„Àñ;{B½z…«ÿû¾Ï÷Þí#üسךÙ3kÖ¬Y³fvcúBÜ;±:»0MÑ@g Õ†nŠAL©âµ„+;6åh9í×m–Œ‰rÝãtàGymïkC+S ½”@tDr.Thð]#)¶`LÙp$—Ý• mÈú`Oá®Kfå‡ká’ ä‡yÊÒù¼÷x´ó¤5Kõ]›×^$‚C¢y¶U[ˆºÂEÝ´Ïè‹nãŸÐ³¡«Ðþû¼D«×úÚ>¾<Á»÷üöÚX($鹌ò\½Å‰‘cW)c·Nhæ'Žc`¤!K9"ÐôX5ÑÜïµ ô$WWç±T™áõŒ\Ê«>)DQÏ£Ë2£¼.W{ªgðDço¸€ÛæÓŸàY<,½‰õQî³Óï¼SºTl;(#_Ö=={Â_³Q$ÿõl-"U8¢]ôEé5Û1˜ÒP!,Á÷ndT’F}÷M¨5Y» Û¯-Ö~ 6•ÕÛ(Þ·scqiÿTH°ýéXN¦±wtúŒc_~H‰òµïÍg˜¾¡@UãÃ/.røj o åQ"KnwãK/xš›ñ?ÀR A5˜‡ÀÅteœI íâU¯_o´cÞ›?GÏ2$u…b`‚Jn8´QFùDš”p •E´kR‘ ”ͪhçHu¿¡õ|Ô«ã–fgch_Îm…HmZàì’¹:¿™ŒûÑ\äxA.!l~ˆè‹4—Àá‡Ú«¢çZõ“«ÒŠ ëé®oÙnrõjAqr„jz ÚîhåömΩ&m|;c}_v×&×Ù—ÛÙ·RO1Æâ*5Í;K©•%T„ö·éÞ¸´;[tIIи­÷³Ï³=glÛ‰Âê†,î=~Žš“Ò–¬ ˜A½x>Ÿ,}tôn¹;M4{ó¥å |÷ñad>Ö{Ž«®öØÁ»t£¯éø¦aü>æ§aù ç_%î,;¬î áÝØJNÄ'ÇYJ~êåIFäSq±0¶»GÞ›sϽ ¡;l]sÆá ½R÷öD! „‚•°I¥†,Nˆî.s²ÇVLž¹@¡r§Ù]i+Ñ$_ÕT8_ ùíS‘"֑İZbÿ‡»«“©3“L(JØÏ™rÛÞþÖ鎬ü‡”—ÑZ÷ùI=z+ÉðXtƈ;ëvL¶Éäè–Ù…Úò)zb–—7è™êóm^œËÖkB{MöFXðïÑäóB”Ì—ûgÉ‚NÉm¶–Ò(V—ò°8s{ïGŸR„>Œ6LÂîÂ(•5›ˆÛ>¥eAzO×Ó‘R82®B–ølžLêºÖg?¹ÃÑâ$¹1R×ùß{SyÌtnáàHQ€ßÌÄ ô¯¹b•µm‹ÜÌUï]Ò¾ºª[¸ØæqÕ‡¶•”~d7=¢!ï·U:œWy–×5Z);n.qP-Éúó¤1±É´Ÿü°·uõbÀ{Èxµ´b…B¸ôÍd6ä—¤šÓnÞ_`Û2—´Ëí9*ìÞÉ’i>´©z8…:¥¿º‡žòÕpå^ zÃzŒ ÇµÄ •â }sAžªË·¦j½ºuãÑÝ#Èw “.Yˆ›Ô|ßÊŠ ÈêúŸ2¤R6ý Á€Ñ|ÿYÇZr.V2’jÑŠ1|v§ê³jƒÉÔwªáÏÏ9QA¹¨è”ßðÌÁ N7TèÔ fªK6|q2)~\!ÊÌB~‡ jû«zÝ‚ú3J"/ å¿ 7ÙÏ 7â®í>ÿ¾N òa@®ÂÄú(+«X˲£¨e_ÉÊÊÄɦ£tâj ï•3Ó5š“HjËIîV¡~/ÇÄúlÁmSù (¥!)Zü%J$FÎÉż7gðR7±ERÔ ÎdŠ;iVrfæŒºÓ ©÷•IBÉÉZ¾d¦N½äe­˜ôñ¤ÓG#W4<ïãí׎áùÚ›øòýìw±>ØÀ¿øñê 5ûš“®ðC÷'©ÒLš¨9ÉäMc)¹ö\8òɨåÌÔkµÔ¨OÕ¨´ê&FH/:½ì)–ž¿­!Û9ü’îøÜé3äDŸœßBçõBõ.Ÿæk:NûéDÆùílþgLïá>Àî›´Z)l:ïá„TV rÙ¯³xê†e%µæ©Ó‘],o6yÖlb4nØ~ö¦Öä¹Â­Iên˜ËjÔ¥–<ÜsØ5õýHÏûè4ÕÞ÷ÜO¹­Íã,Û)yaŠW'URMš·ßºèûrŽŠŒáyËGFs«ÛÛÙÿz#Mýî{WŠÆ¹‚‡nI`ܺ5ÆßkÞᓚ3xákLÍ¥u>Ue‹(ñ9ßê…c†tR§ÖœT©lÄÜs¦ìšÇcÜ" Þ»LŒ_”xï»™™xùÛ.Cˆâ>U®g2˜çSfþ_l¶ùКOËö¢âw_>WpËð¾Ù;Oe¯‹»¸&y‘t¢¸(áA*w>‘© 2¤†ÍaÎò[çæüU§=£fxÚÍTí6Ь ?lálê¬ã“ºÙ5 žœ¤™œ{æîeŽÆËG/¹}Ü}RðRÔû–Sè«» ¸ìLY£d-/*q($ºH|ÍøžœŸÙþ–Ǭ‰!å¾²Är¡³'œo½¿±AÀÖ{Ô*Ô9Í%åN3 ëyqÚ2=¸mßHšÎ¾FWó}±·?‡¶QËwb$-g#‡çt½ìÚKΣÂÒuŸ|¾ÃAë÷zŸÝMbºº™;u U—^·ÜÂ4ûÃbxi.í‹bUx®Zääæô”\þÉa{ôÓ\C:ûgÆ–õ˜ gœ-<|O©ë¾d~çÏJ¥ŸžîÀ$ßzº®‘Ì—}ÿÈ'´{Ÿ] ïu‡-òIÊ:–u‰WçS7o¾ª-uÕ~HPõðñQ’ÐûÁéÁ­é$Ï(g<æ5"Â(Ý—ý"¬“¢œróHÚÍÌ޲çqˆÔ@¥ÀWtZÜ™Fü9KyÎÚg²R¤eÒe§ #Ñó{Zùô3s+àP¹‘Ï(¥-Z˰PþªFjW{Q)}ý¨óÞ§×iÍË ¡Çr6/¾Õ\d;I¿Ã¿&òŠ“C(\‡O‹H%WÑJM9$á CµW;ãöŃÚt>)·Lnlæg1TOÍîÌÌÕæ¯Mrhá-¡®‹™JS>œ^ÊÐ2ƒ#=̧fùºyS([›ªä“EÑÊù¤©vxj»‰A{K_¹mè» ÖNôƦ³‘iõªuÍ|ݼ›ºv½ÙÑ!ÖÞ¥Ýl{0')ë˜À‰æ¼Ý‹YXFv– É›ùÍe0P}–wÉ)®È®zÃã=u¥O=ç 8î¶ßþ¸Ò¼l›ªc¯yN•ìboÁ±¾‹|5nŒû­:.XaÏ=h{v¶?0‡Œ*gã 8œ¡5®ƒ<'G¥BMžÇÅÞ®E7ÏÊ3¤¾·ïÚF\V×A•{\Jƒb]VØ:âza"xÃhŠã«ÞœIÝëCX‹ÊqsÏã¶tNò1†Y§Ù(bxEEv± g=3!Æ1ùøB/CÍtdפ`H5ï¬rØ-Zê)Uâ¡sW'öœrø8Ëq²³\¹oÞáÃà…ZWgö«ŒTæx8#5/~Øru–.,dÿ©¾÷"œÜ¯šñÇß`£ût5Ù½À÷׫íaÝIsÖû¯<¼j³/cþUÃÌ›ãÛ´Ý?A„Þ>ÑîûjôÕ+;Õ3 ¬jï/ÊOõ{NqeÜnx°8NMäGœØ#%:È…èv{r·ÓµØ±‡RâT×?W}ÄíÚNæzœdê–8ûýŠèR/ÑÇ5›ß»ßäNÝQ¼É§¹¨7¹íØG"=”ÒK¯âÎÙŒEoWQ"-Gº©=R§š˜jqNŸN ÷ÞßRªE!¢¨oëÝ<ÙG¹µV!}àµÛãØ^—~Q6ÖAeÃyÙòȨ¤…-||0YO Ë.ÛccÚÆ¶«R†’–½ßãld@5Oþn#÷ΜÝŽï4áPækŸð¶á¸äÙzÌBáfCdå§OÞ;“®o£}öz„‰Š[jhnÞ•]8Ÿ‡ÜW᜜y /{…  5ÓÅB[-_ì*záŠ8&¹o]¨¯'ÚÝdv(õçQ3¿©’}ž4IŠÛ¬ä1º«6æý¢‹v<î¤ÏT2 f ¦ôöºÊ' ×KlÛé©ÁK»yÛy²ØÕ5g\K×!¨{ù„;GWÞ™äÍ–îaŽWOñ¨oxúÚ¬“*'KSß+ÚæÁ©{èsr¯(7h4ø”ñañ‡1¼W; R*Û_¸Â¹G› &¥5ŠÇw,>ÔIš»Gì’0]« ‡Þµ«óå¥ûcwT/ÎË´°°To¿p¥jÃK1ÕÈÝ—n›³~Ù¡Ht|«ú;ÔoR9&mæÑãlP³?¾ÐH|+8w*üÆ^c- –ÞÊÜæ#íÎN;îkx¡:0¯oòL(t»$V©[ÍcÕ7c‡7¨Iºtv5©:ˆëðãÔÄH|ˆï9•¨êÖû*™Ø¼}Áq8ÒšG/ØÆ ïÜ]N• ¦ž ãÏ„ƒ‰û»)ZœôÖ ³‹ý ý€ÇŶ+´9.‘!ˆUZW3Ø~`wÿö|†[÷ï¨7“«˜ä:ÚyfÀL뱘NÆP؃ ³aÚ FóŽ0ŒØèAš< Þ¢†˜XwŸà yê®ÎáO®WNGE„çëó{¨em!%£yúP2øéÓIºØàçaîã)íDáì/3ìÄŒSMènÄ%&ÖŒdÄäØOÄ˶=¦÷:E$÷ÄäÎåȨ‘:¿Kr1¹ÇÏ{cë2F§õ4´˜¥¶pëæÇKW˜d>ÎÇIǦìê$ƒ½²s†eäN²ßßþä¨_âìS†¼hf†W»?g²&Ž‘Ž5ÛnÕduä§•…Æõ(-¼(îuç|‘ËFÔ2(WLì¼O«}â2UÊ‘4–Ò¨¦É?iôa¥uKgA×ò2f”ôÝŽc·zFE@ÓÂÄ#…øRÎ l·®SÎi…×½‡cñeºCqЋÒq'>Û&­òÓP?SZæÔÊ–VÛú7!Õ'êm¾ûL ndݨþÒ.¹K|¯wZþÍNQsެ«qÓcB»Mú ªÐñEºçPúºI6†êrÝ}Ú™ûÐÂ;ÝíôŠ˜®´”¼n•Ì¡èÁ1ÇÑΧ÷–+;c?í|uº㼳齡OüµD§êæìÙ¶J¶voWÈ!þ¼áº¸ZW!sqι1‹‚j[­Y3Å"ëGÝqi~|Ûn«‘û-PÜʧè`vâ aJèäHîâp~_·wg:kêÍU>çs´“y(ÉÌoé…ïQvÙ±mD×e¡ûìÎÃuyǦDTmõ˜)p.¼sKe¬‡Á³éÔ!—îbY;v ˜Ûg}ÙÛk‹Xgcùƒ# *rú½épÜy×C zélYΜª6ß#zlÇa.Òò6µD†+œûÏ óùHï‹8”ÏLS.Xåe{¡ƒêüL™‚Ì÷¼B$+*½/hOÀ++¡£ÙwK¸Ãj­Žs°œà±Ë=$h«5@2W±¿ÙÜ1ÝñÈ#AFY™ÛÏ)(ÉýÉëøúÆXg·jHJäßñ­E#÷¿¹d'ØêypC6–6iG¤w–•z“]‘ÞÛZöî>IÞÑó¼ ]¦aÏXI†,Þdô“ûhY=är¯9IBT6ÜGw\Dúæ;ŽÇ´Zz_>o(®ŠJ$~º Ã•©¹O>ìP,d_[s­aEZI$s@ëlón¹ÞçCG }bßR\°¶#62rw‰áaÝÐxìñÙÅ\¿‡Cá*qšÙ,¢4Ï]ä®kRŠ^ì>Ÿg}a·BZwLGõªhyØÓ‚fƒ…Œ³÷'þWGᢴåÜQÏßðŸW¶§­xP&_1ª©È¦à(IåOû1X™ÏrR]ˆ‘xÕãhiö騼},¤£â Ì–)ϼ„ 7Ú?6HªìS²=àðÍ©´7úO¤$Fù"£å_s±"žÐ‘Ywܳ¾x"n<êó4ûúŽ®÷;4¼o­s”I/ кÄÑ|Aņ8É‹íI½Ó…ÛO^î`D²© Z¾„îŒèz=ª6kwÑ­ŸçÎ}}\@k¾¦8ͺº¿ûYVM,çåÝOZ‡—æÅ[íÍóÉËOF+Íè ®Ì&—(_w#ÛÒ›’àžÐI•‰yÎ÷á¨úã܆A‹ÝQá…Á~ÒJ[37S,N ÚbÉqÅ%°H"{™Ê׸š\Ì@ô®}WÞ–Ÿl*³#J¸“ÉtÁ͇ÚxŸÉCι¨Ô ¹·¥ÞÓq¯óvú3ß«<5ÜÍ]âÿñÕP鯙íJ°Û¨âm$V§CÕÌ÷ÚÝ*¦„sõzc¿XyÙX©ç_Ñe¦Ï€dlzÐßJ-øÔ¶NìÑÍÇ'BõºýϽVG}¦ñY¤!Ôð‘z»Ú¹Á{ 8v£ñç®ôOƹ?— hÖ%%\3 Û¦ýÆO#꩘‘þq]TaÅÀSÖx/b.]·òÄnßñÝIÊÁ^2÷M d’ÛŽ,pdÔí9®£Ôñ–;%å¬ÄsÞCŽ$èij*dûg2¯8,¢s-%úUá´da)iä=f^ƒ/šñÙØå2Ó>q¹‡”~4!”ÖLy§JìÜâñ¶·m è,®Ý~¤úO–Ûur²vÊ]ÜiéÙhÕ~Ÿx3ʾ䉘ƒ)ŠÑÒ“ZÙ”¸s¾bÎÿÃ3îî¶*yª[\D¸’æÆ²F¢©ÒÙìqZqEûz&&Ïçu ^le6;wéQ@˜üÃ!ìU+\Îç’$IF× +Å-\ÓíSa\ÙÆÏÉDUU&×ùC|ÕMÈ”w×2ôxÝÁô}œm¶Œî8è躯+Îýޱ%®Ýåêüuò«í…›j¦äŽ/FÄŠÞ´¾V8]’»P¿ø)ïPß¿3dCÃTý÷$m‡oä¹{A ëü§Â·ûîsíñ€Û¾5éWôëbD‰}öºŸ47É2f(5=Ãæyñ‘ûÕ…¾ZGãù,>D²ê]ÜrÕøÍôyù¶Kò /ž_‰íÞŸ¢ë¨}ù“‹ÑçT£-·®•4R~8Oöé£ÃYçc\¬79E4dFŒ±¢+¹¾a vFê9£›pFYí¾¾íéâV JŒ¾Nª£Þ€õijçÈäØSü5Eö§h.‡æ^â¿ì4&ÃjçIm˜Q¤*9®¶•ûìl³‚ÓÁR#Aëš|ùý( k…KŽæ‰Ögš¬Ï}º©1tÃ.í¤VÀi×¹—²Ù7Ž(!WÂ\Ryâtõ¼Ã•Ë'ãÔ0wôèì‚z¯U"o %ó»Ðz¬F#|‰6ÍÂ;ÍõLšnà¬%=ÒRó£ý¬«ÓáZ­ö3vm ­ÎQ—¾Þ¬[—bÓœ{œ%tyŸê s=öÄÑòµãVKöÇúÜÙÂ^ä¬r·Þœ¸ä–GmÓt_!dhï-æš»°]éI“Ú&ל­OšÎ6)¸m²ÑKc):r³”Õ•*Àþá“[4^CÞÑzì9ƒÞWo¹âM”OÝ#×g&¹äðÁòðn+ÕsÛ¡Ûõzûï>ÄMâÛ/ŽÜ^$òˆ`èÚS†‘=$%[Uâ^MCm˜zCîE4ìµáÖÔå;{™mÏ º\è¹›™r«ƒÊÎ-©Ÿfï Â]*¶ã†—½àé·âÑž2—•‘4[niyÙv‘jÞã™ùØËë²_κ@£’Ë乨j¶þ¦'=j.y04û\d;{†Íÿ´"Ië¼ë=²÷‚|"¦–œÃ—|>U{jêûYúÝýÄ‹KxÎ5šæ!JŽÌ¨½`vS<X-Ç;ì|×ÝÍŸHPKuØ"üZØ»_‚n?ñW9äÍ%ì†q·h”&Ç»móÃ$Å«¿”‰ì·Üç›6‡à P‰¾±Ï'Õ,ÈRñÞe³{hùÔ%Öû|·¿ÕÀ¶Oc6ÎŒ–晃ÆÏ?Æ„Tî; ‰ñÎÈ  R «¿ë.ä¯/D‚Ô7Ð_anÏŽ}]û¶ßÔ¿ŸgpÑ-ìÎ\èxzp~`X)æÀa®&Ù@¥‡cé¿(„¸©LÝ$±%%Õ'-W c" ÿÌÆxËÕѺÄSXáÉåPò²°Vý`Q¶à&.¼LÀ:kŽk—A8µ{èdLèñ‘ÈÑ}Áœ¼˜œåÈ»àUt0Øòë±}ðËÆ‡Eûî7’Þñ(>XpRy$,#0òúÁ¨Rß -‘cÃÆ›N‘çé] Ù)b'cñÙœ«ÏE¼åxŒÈi¥{þ¤Ѧˆ¶ð=e¡w6ë9ÉÍíì?¼ÉæîÀÞ@4û“dÑ“1OŒF§-fDvXœŽl×-‰éK J¥1Ùø™ú‚[@òs±þ~ŸÍÕ‡¢‚HŸž.»–¿õqQ 3iì ½Û±$¡tn°Ù¹>ŒQR`Ørèè#ã›e÷_”={C8ùnxÛ“Çã]áauOSqEáïœ~4âÿØà‘Y·4àY»Ü}y÷›­±B ØëÁÔJ×Òáxuæ7àþˆ†ÌEÃ-îМâín}æ–B"9²ûŸ3Üö…sßÐ2TzÚ•î2$",òDqä8…(ì{Ìë˜pò¹8Xø%"^±.»{ƒ+½„Ó7êm•…ë”yOö>¿ù"³ö¦5Øc"I[žp+:æ &vËmÃ-¤B0~*§ÄÅ,œŸÛ†?§+‹x¾›‡.jwK¨¥íCÏ ”ì™àûnÑnw DÂÔFžä)¦ÖŠ&hu8;¯iüÈ2/ÖšËÃçèüãô[)#¤aWÒ“àìÉ|vwý±Ñ¸kbì!X¤«rÜ­Ì”{A1dI‡2hg?zms•æÔ‹Ýu>^Í<ž~(Â'Yµ<C›üöÖý‘‡ä£Ï0ei·3#¶%òæÅ/øß!C'|Ò3ú\roûÐjîQ|y*iKRìÓT²¥èc¼Ü-iþ-âs É©qù.éÙÈ”=Í~þOb‰ybhxŸ¾žqéõÉðrÏè ~,'!ö‚§%ù¹aø}²tI)7Ÿ÷û´YõóÙCm„Cí烮‹‰+Xªðf$ÒÆ <1|ú`8óìðY–LªÏåw¶?’z1ùYJó³Rû\µ“oÄâº4òïŠeš‰¤×ÕÄ5óà^?Î}\$z·Cù.Ž']ý°¨MÙqȳS=dVr‰ç3c±~OZö~¤;€ØjÝßšWßO -¨Ûç)k}ᢜ´·IºˈÞSIX{öE¹ÜöÊë†OŠÇÁ ¢ #½Z³ž‰UNð¾y§üæýfA²=œ¥q™l­Çòá6—­¶_|u¥XШ òèJV$T?)ZÁ‘9Už”°=ûS[ª{È›—Ÿ£ßúV žÛ¹!®|!<%]ˆ³/4¢O"Êzá\öDo»Û‘Mü^ä•#Êe“~;‚ŽM–ÔÒ=£¯xøã‚;ö<ý¦3m­º£Óc ‹‹‡^ïymn_Ë›+Ú»5CýºG‰Rèë¼±!Õmùh†3OO²òU±©V]±¯Òÿ”çØfø¢µ¸ài º¼ÒT¬|×vGŸÇ{®„Rt?–=·øgêVlW=¤WyÓk·c{ÌþJ!‹§A]*<=ž¥…±Åeµ·¸²ÚÂ=ÇEÂŒ^‘ÕŸ£»–S”{¥RZñN·Q¿ä…ʽ±à1W^S-à­é}Á&þŠ>[;œ¸…¾¯é*Wl߆{U÷Uë…³Šo„lFÙWŒ›y¦æm=ž™ö|¡ôx{´`¦Éž6 æ†NußH‰êC©éÜOšbŠ£³Ž,<ÑÉ ¸ãŸÔ^\“³éí§¹,C‡ õ1qO 4lÅ–ºžIð ½-Ÿu;„«‚^¥"³ò‘ú§êø¶º|š½ÖbŽÊƒ7†Y ³w“íò“avÙÇ/å ˆ7m5Æ5É{UíË©bnß­šAÉWSÅ“¦[™Úz,,œ#«ƒ>ë|ñxbà³¶àg…Ûø‚É(Ó(«"«ÞTµ•â‰F3Õðf"bjO16Ee;E‡vıu)¾hñý”­5ÖƒÈQ¨{—_x ¥ÎG¿ÎI©¨s[o8}%?±§ÊEíÓa/…rb^•·‰‰åNPµ›+1Ëʽ´ÃØ'³ßq⬓Ä#Ézá°æ€ /jÊÌ-Ûrn±s«ìñéè'åVº,àd’|câöa>E&Ǿèã}LÙ¸ëý«œ³ï«ïëâ—-âjŽ‘l4ivîÈæŽožkÁ„ Œeæxç´ž4(JÀí)â¿÷Ò] i–çØc¾e€æYÇ£ªcÕvÏÈÁïÞ]™}/Ú?f§Ñygy:vÒ¶·›eŽv\}R%à¼ÒŽ®§?¾º¼¡9_'Š-ã{Ó£ØûQ<:J¥ý]HÖqÆòãŒvzŽ}¾0:¸h¬îÝ’›“ò¬{æx·ÇD_Ù³ [“Ƀûa¥Y½Ómݯ$'h_½º¤VŸ|¦ÑŠÃId OXÎb%zgÇ_ÔOú&dË„N–/Ž<³:àÙ¿yûȬd#ìê°çƒÌšô®#í]wq]ÌO›.vš;Ì5ùϵq޼Ì.q»ªî19Ç^>ů_­ŠœQl ½8ÿqëçÌò®lº÷> ÍÇöÏÓ$Ìä}ßé6ê,ot›B›ÛWYåý–VïÑZ=%üŒµ†ËxÊi×<Ýxô«ñ…ôò-£_dÆ®–…µßV¼:ÁËUÊt%¿j|¢¹ªº>¬„bׯ“NL£Y—M:øÎøôavŸæ—±ÖVFœQÿ‹ÄÎnwψv²ioc8N!M*½ß yDÞ×?Η׾9ÝÞ¦´%ÝŠ©Ñ¼Ö¿–öÎUÖÝ,c[Î ˆ!'³ŸÃ¢7ºûg± kïnÚ”W'ÙF«KG£8 dm¹\…žàº¤¢£nÄG½5a…òÅÒXÓ7Øè*ÑòÑâ'ø©Æí'}|or_}Ù³h¡öD r´&õò6-}µüŠí‚̯‡™…èo< ´@ M)½{xѾ}I½¦÷EN)§›[(Ô]Ä©žSxoаÍ|âØŽ·òäǯ’¼‡%I7Pî¤YPþ\ã~›AºMëuÌXˆ)—1šb²£ÈåbqØ¢x[(çtXa°¥éDÎÛ†_vÓ/Úí/–PÌé¾P\Ö_Ú{‚õåããbÃÜ•IjGOnÜr¥õʯ+æD+Q~Ó4Nf#QýÁç§Š8_ßáÄéñņ¾R9½§¹G’[ÁÀæ|º#èœÓS»q§7²Ñ¿85g@1QD/îqNˆþ*ñt4ù M7b¬ŠÙ}’ôËP!Ò-QÐ’÷~åâÅsBµì!eþ¾%e¯sn$ˆ¿+¸¶ ^:ÖÍÉêà—(–c{‘Iy.dÇ}ìUƒš¼‹e£5ùG:³¸O u­sÄ¡ÄÁU;·yÄÂj]jâ…âc»^œ=‰îŸõjê{$ÉæóLC¤ÝîŠE‘d3¯n²Qn¬bŠWj)¼£r“â07¿%â(ßð®zÆÛ‚(EíûÚ©ŠºnRmf÷¯‘¤z¿w¤°®bƲž-,Š=Ìa Æ«,†³ö©Kå^qëpõµÖâÓµ.â‘…è‹ûq//^ýb}€J‰„*òñ;qãÚÙM uÊõ´Ù‘/'ÜMáËãú¨ú¬¯öÔ2|UºmM¿ÄÍBXí{çuÒûó 8βìoóÏ0a¨š`ójOªU m|ÿIדcü}’Wc?žmgªN‡Ú5Zª˜Èh;ƒ§O‹>Ä% Ø&d’̾(`±7J*š7J©Ó±7~Ùê2oœþ”±H-k·£™ÄèÃרAš<¦Çí½ÌìnË­”‡ÚLõ(ÉÍk6%~å¥óRµÜŸ;½ )¢Mt-Dgc¨Z«ƒUØ™E«z]ëFe×EëfÍÇ6­†Å‹6í–·R[û®ï;k¤5×=8¤UË{XrSÄûÐ3ÿV¤O äLâmõpNñx½};>›k¥÷Ô¥½‡8*}Ó/¥o šjØ™7è²uºß­#n“Zçz_¥z·œìk#ʳ2oè¨1ÙlUl?kÆ_Gó莠4vߦ¡š×"ñEîÞÕ8Ö,o&rIþm³ÑÁ-goEQÐÞ=2j©~¼q:‰›RÔŽtÇPÉ^ír%–Z]Î÷÷øCÏ—Œ 'Þ ÷!2M«òøð÷˜Û—|ð ‰iàÏs‚e¯¹â÷zä'ÞêÙŽ–zsDÇœ^ä~BjŸ Î)8ßaT䦯Eb^7e¥ÁTù”Ô{q¦Ö†*Ý<çÓîÅŸ/w{‡(­ÉdHñfµd±÷K{ëz¬æ8/d cÙÂÏóÖÝ£[IŽì¯J¼W8¦ V¬2iH Ý<®+H×ÒdüV)döÈ»3ù‰‡_œ¼õ@ðó§,\—ã!í>úrÄ­–÷_m61«tÍω¦Šzfl,s!XÃI½Á€y\ïêˆdcF}á„uJ°ê„Éy Á8§M)ïEr ÷c¸ž)±¨|HmÌÖщY(;•ËN™Ξ<ÂÑüñCã«Å›/# TÂX^çÌÕŸ9C‘¥F‚nÊÛåbvãpV×fñ¦|ê"3—£Ï.$â öS™\¡ÄtÞnÙó`«Ð‹]T*wä2¹˜{¥í"N£az÷ø3çíM›Šá æGŒzÊ›JÎàºîÖÕÐ×½ äÙûawk;ÅOŒ²ðO ½¸¯|öP˜wiëq¶ûŠ$²"îŽ=àzÙ\¹YvÆÇ£µoo#uºNÑ I5½.§ùÍU!Åûg9ŽÝž ´J&þ°¯JÔRs»êþ-mòûèÛ É›ç·ëK^¢UtÊÙæ]påµ½ÒçZªYbºq}ù—A<>8Ô^·K3}¼”Êbl:£U³ /ËÈ¢Y¡r£Ž´~ÎIꈵÏ6ÒIØÐ°Õç½ùY£±#3M3LlRmw¨¡!-‚TB/b*U {Å›[„.=}ÀE'ÚjÛÒ+ižÎà2nÕ8_Óæôäü§sfQ ge[›ØS/¼ÌÔ_4¹6x¾ëiÄ˼ÃñÚW:K[or#éͨ.õì߂ȟúÐx3Ø®·x"ÍýdŽú<}Å<#êÆk ½ãY2ĺ¶U_8¦õÎ+õ"Ð •XJóPêÐlîF4ƒH¶’˦ì”SU^Ç­»¦Uº1;ÆìHFgiN1H~l×Äå>«v;¨Ó… ÇÙX3ú=UoúŠ£­ŸñRÆ›ö ëâùö÷Þ/:•ê<@6èÆÛlKl—P£¶ïieS#×faÍÞÑí¤yú~ñ•ä+ÛªK3¶8 ž°«½ß1ûøŒÃˆÜ+»˰´!òÔäûç‚ÓS\(r˜°LÐiÿØññÕÇw7O\é¡îüT|ÆqúÞ«+èι7®Ž³† ü}Xd,ìÒï|Y*FÊX†¾>[xÂqú~çÂà™«Ÿë_9ö¸^KÛmð,á¸"JßaþƸã.~"ÜÇÎ/_îenÈÝx(—‘»ét.±lîf­\«Ü-7r·úå’Få’%çn³:A:†Š´8¦1{9¯±°ÉgÑ>w{V.ùé< ÙçÛ|®¾S‡5Ûă¼â ÷+ày›wön$äJÐggÞ&žÙ‚“²¼(úç¬iä§]7¾>­õÚ¥@@»Và-MÁ£×’НE_¿–9øºþº¸vvCɼPùma¬p€`²”àø­ÕCE¡ó¸;‚<Ã'çs5­ŠtoÉ Šxð=x­÷ºÈèm³pQ–BÑ—êcŠbsúb}¿WV/›ž9ò°9öPsƽËc¬1e-JÅöÞ&·%gs£ ŠåîJ4;s÷:½<‘¯ü\ñ·;-‰¬8ÓÏÊ–È\ö„†ßp;ÂiGÉUÃå<ÆþÚ<þ±ˆnõ™©S±Ž²ÅwŒâïÅ {¨³ºçµàéD/ì%­&lc)œgXd䜟Îr>â‘§¸gÁ;ö€Cn·ûJ£ü„ôExÎÆ ŠÊŠöÓ?xQòðŠ'W-‹AYÙåäâ'³¢w+bŽUˆ|.Ï[m´Øu¬<¥O(š“7Àyîl–Pª•{rTyæ3×`ñ´Ç)„²ˆ+r+’îF ¦' æ®xu4›ËZ'rU¶¢Ä¯‚†¹Â´Ï?4¤B»¤°¢¯¥V&væÖX…fSE B‚ù‰¸£–PɱJ¹#• 7*?U\D¸«Ux«{J .W¶õIÐ WҽΠP«ì¸áÜ~¨ªwìZs_9gù«Ó’rªÁ+U7Ê»9›ùI¸U5vH²?‹ßð˜øÄçqŠ7mQ’x3#ʧ­6Mk½i˜•L#>ûäʄٛÏô•3V¢QgNó³o*<ÏÎn?–øºjCöÆ ‚Õ%oßLIŸT©f–ªÞ*X±‘ïÞœÊY²8'Òz©\£j•Jß1)†®ê=ĶiGSœ#—¢b¨ÙE™´%[‚zñúÞGçN×d‘V¦g£^Ã(!J£ÊãK!ÁÄ?(XMKÉ%}hüÚ~ëÚ;µ³}o¶{ÕÌ®ý(+]Œª¨œ—þR°éÌÑEé#;d®´ÕòØ 3JÔ‘ž¬C.†z‰1[Ë`½d°”ÅH®ê£ª}õulÛÞ[‰nªBߨæß|í˜Ü[½>ú¬:´ö[!!ž”*(¦š1TV”¯èLaõi†·ýo5’eOo~{Rõš¬\ý¹›gÛkÞ½–‘£”“¿Y(}ïÜXn%ݽzÅGròVõ¨›r"ªõpH å8i©ú:õà U r,^o!r Ú”Õ§¬ó²ëGKäTûåô7êŒ×v“1Ñ–70(OÞ¯¬5¦l•?Q)«Y÷üò½FÛGv)ö…WêŸ[Ói¦Ô©>–rZäzã¨Þù+ç•*ÜQirZÜquG Ëæ 9awë¦zŒ‚Èl¹Lö«Çì¹ÉM\Ûoqɘ=Âú´ÄEmW¼»ÃÓS¢Ð«PŽ­í±_é=mÅ—LÍåˆf_ßè ‘àlޤbÂ*’^‹uõy ¬ˆ[»‡ð5†¶cüT•îY· ÍÕn(ÝS4»þìŽQËÓÒ'ý^7ø·¦š¯S¶¢J[p-m-Ý%ò—ûÙ½^—?Wm dR~ iKj5kÍt¸•z“´õ´Òî…V£c*¹õ®Y^LVýÍ'bwüÜäµà1&ºÎ\¾ãH±þöÛª¯¹ªwPîɓؚßßŰ%¢¯ùÝÁ¢Ël‚eìAÚ"N‰±‘Ï”ÚÙ”»…‡µ‹ªÔQú°pž¯çl¦ mRœc¹o%¢²—¾ æÌcŽ®qÕÛLäŽ=íF{IZˆù{^é P™>ÜA˯j+¥š6®TÐîlðÌPéIüˆðä#ÏêÃÂr=¢ stÅJÄœD%^¾d?š¡ÜS$è‘-‘x&ÖÂïjP»ßHÀÖ΀X\´þgÕ›Gž•Ý.¹ Â®º©êÎl¨ëKJï49…mT-ìªs^mS.Þkéj-¼Pz޳ã‘Ú£9µ‰P¶=ñ»‰Qd›…Bæª%[ŸÝðl©ß^[Ùž¯øäðËBaÛ†—¸D6{w½ ×õíÔÕ:ÉM.j©…5yïö!G!1›>9Lß¹­½'»“n¶ÍSjµ©øÚ±ï‹­ègçHU»”îs¤¨gÊ+VÕ)Nu‹‚‡¶4P¶‡µi6㸂¢éå&ToïéÁ²Ñp—mï¿d¤£|á¶„¤Çi‹ ºtÊÝ:¼ŸµEPDyìyL†ëp`« í4†i žlEº ܽ©%é×wuüMɨ¢&ŽÑ-/ï&#?8ª9«`l2hóN—î‚îG®®KB»ôèƒF³m©R9æ­&¸WXWh¨üfìywus—‹ JÝ7ª†j¹xoR€ªš`bëÕN¥²x9ªßÆé:¦ÒŸb?²+§Ûa€9hºs<.ÎWHÿì¾Ζût ©::ˇº·Øô²¡?B5TdÞC­£ý™ràé„~,.‚¬J÷CããȘ԰úMÜ1º˜Kûq›x_‹Áy¦’czǹGS̆ C} Ÿ´rn>¸âØûáÎhÚñÞc8Í–ž@»‘L¯¤hL8·P©ÎØøƒ‹Ç â$Fn]iˆ+3ëõêAÔç7IÅ÷Ü6:€‘‰Vu!ƒ³ixhû¤¦ñ”y˜ÃÆ8“d<¨dôÚu½½{Ï.^t9s#COn¯îe j³ŽNïáìl:6šƒ:Ý,Û‹? cŒõ­&\,bë£ï¥SZ0úÓæt›rNTv¹íæMíÔÊ(šxùiœªÉ°ahtó‡¢1-ÿá°†ÓÚ.ÇiÍÅÂ!áf;sŒe…Ýèù,Û1^u¼ÄMrÁ3ð­O›èÄ\„K¢¾ÍÓÐæ Eêw>ÞëªIúØm>Þ;¿æó1¤ž0x¡`"»SØqø~‡¹6*H7å§aLUÖÛàîñ!¶…Eg»ÍÄ3¢Iž¡=·Í4ýßKMZÓ2Yk@¬ëOZó~0.*Îó™rœ641ÿHbÜоC¾§ìn!·Þç*›À¡™Q- ƒÌÁ FR?ÜÝiyôÍÞMo:q;Ì›qú÷žéo<ê–PøÁþË5ã/w*©&ª¸?–Ï©ì|¬¿ëè€:‰¾Ý.³-gÍB£ÙwïÒ£ÜeävéÖ•â·÷[oï â?3QesÉhò+­ß)[æN=Oªé@'S-]Û¬l#K5cËå÷ÑñÃÂÏÄx—>C}Ô~|æÉ çYmvc¥„ÏI:^4X*µÃé˜ÍI_›£pÙA÷ °ÚGœ±j͘¹zqêåÑy͇—c^\“ÏÕÌ¸Íøò„MšSð*g!÷Xæ.‰B’·•ÎvjK¿yv&[ÜNw³B´n_iñ¥¢Îb[ï&]kž×çß!Œ†tâÛö5áÚ*)/Æ1½}ó€¹èÉËKUoÊ#O—‘/™œÐ8:‘÷Ø^›j¦ñv§W^ì%S›ŽÀOñ&ìÛto&Ø5ámdE-j¸ë©¹Ðå‘ìòÃÚ8ý÷þÄvüª¥tÔ_ž¿ÒϽï˜Ô¸èÒçpIÂ^ÊÅL¬Ù|€ÑÖn£ZÜ™w ®×vo¸GÞ¦ÌVÜî:ä@«ã¬çCËŒÛv;Å¡7=g&ûË&çü/ôŽ1û–iŸë6:)}ä$xH°¡ ¯”lh4݈ ^7²Gsܱ AYÁ|®ÒÀF™d¿Eåâû»zY4¸©á¹fJoz¢ŽŠ’ ’Ô#<Ì,eæ6vŽN.îÞ>DØÍâPsý»ÐÂ2÷͘{ÒÉÝÓÌá[™wjLo'»(ÿyËÅZ~”î)*Ãã’½ ìp4!l í ñG÷Û¾÷ƒÜw‘”Ëθz³²ì~¸åHCïmêèËΗ”3-5ò„ª>Èž ¿#MæØ,ºulhÃlÌ~f̉ž®Æ}$\ûK}XÎFdY„RÈ+¨dß@âLØ”Ùî·eÆW8ˇ>ñ–*Æýx]d²nó ›ÉžÊQÍþz9ÅL£qž*šlÞ|ZIúóÐÞÖtÞœs!õOÇ“ n²^ÐÚs‹×Ãa»‚»&êl¤¤ÃI¹û×à¦þg>ÍêÖó ~–!?w(­}ÏÆ^=Ï€|±­/æiR:M¸B†Þ¢Þ4ܕձCªU¾Ð­ÉÙ™rIÐ8:ŽÍÔ]¢…ðMý®û¯¡J³\m >Tã`ט 7Ñ<¼öìE­x»k¹QT=‹Ÿ—JòuœíÈáäE¨+NæŽ]’µ5î¼Ê wã FñOê«ë¯#œæ «ÚŒ]zÈÑqø²Ðe¨ßEáN…ýWç$¬Z/éoísiÒB.¾d¶ÿ|®÷Àͤ‡o+[R_¥IÛl„ zÑ¥·Ã¦Tì.5Oß~+þøFñ»ÓÃÔ!ʆÞž¹²Ò‹[IÎÙÚ{tïÓre&«÷Œ}{„ÅiêŽH‘·ÛˆŒW¨ saØíâBýæ.-1únN¶Žö¤±13Dbž&DÌ®¹·mi—ÍÒÕ~@ÊÙ‡³ÞõQâØs}Eo’‰íá Ó~emå8#Ë(ì¤#Œ”¯hé‡KÉœM÷{¸?%0–%ÜàJÁ[µ…2V‡Àƒå*ƒ[¥E[Ío*„°0‰Ÿ¼J\êÂ×và;æÑΩ˜áö;Ý&6eÈ›zM,®ã&n8ãtE§7B"^Uz©ªµõÄ _–3T ×&­1ã"üÚåø.á¢ò¨³íYß“ˆW+VØÑ3µ~—{ü,ZE˜^ö&™ºûàÑ‘JçÓ{lò&ž;-´=g–zo˜œõsFÉï&M ÅÙÈ 7o’KZæz!.…ê{6R§g´f\kM¢üdãb‰¤j¨a°°Z½5fä>Q¥‚ uûˆ¢(é]Ë·0ÎÄ݆ÏhzÈ]N#˜Å”3ª¥ü5c-Cä Gø°¢pýCô:_hŠ’C>xöÎ0«(’ZÑÊihÞÕÁ*7æˆ×$mÊŠ9¶¿´¨&µóxad¾‚Gó­Tʵ·JœšÛöµ4Èë†öWé&ñœ­)KI®Á!÷Y#2U­kü22ùÎsœ)+q«vkYœ k £Jü¨\·yë«3ÑÙù’7ª'í¡*Í8êû‚Gzmt"õ:&!û­dÑurݼŸcÛÏåØXtqÏ•¸\WJÉqéÕÑ·í˜Xd¾”ÕÒ²¼L"g]àÖSËÂ|ÊÛ”ÐüÜ=•lr,Ÿ†qœHZv;݇n+ÿM!ÇFoßÿØCŠÓ|[ ›§ªI¡/ƒ1ió¢ÙLÁQ§OÝ+­™Òa;¹z¬Œ6u¡¬÷øÊĎܺ‹ƒ¥ëì9ü¾£ì\¶wœWáY勜4—ö!ÜÔzGiQð^¦LVÿÝîeé*éÚ§îß÷ÀDitgßs±U»xfBXcÛΣi*DV÷‘wÓZ&ÞÍ®dkÚº©å3Í›îxÔuõã},éNÛ}Iæ‡äÄÅõÙêèF°=`Ü÷3 Î.^¥Y01ÜÉWÔ á 4á5Õ¶>gàŽõ»ªË·¡, öÐ~Dš…Z7 Èè¢{¶àˆÖ™©ò8Ò™ËÆrJB.¯ö¶qa«žÄM›§dð³&+‹Y£Þb;ÐYã‰cî¨Öê-š—w©8t#;¶;“tÍ¡[¦Otç}úν‰t޾2 >Y¤iÑ‘ªM¼}ø»2µ¹½]Ï£{”6ß/¿´ÁòF« ÅAW¹Jçãd~ÛŒ*ö^­Ç½!_œ¼Fç@-0h[ɸ%¤UAã}®Î´Úz@‰wLc?os¹É‡¤H¾qƒ‹¼­Å½©|g2<5±fajf¿ˆ,g{ÿ¾!Æ<óú+^QÉOHµìœ›sOTMrc¤döÙÞ¹t­Ÿãíòe˜+‹¼1ýÐTž"`Z¨ÜøÒ³°Uá¬\ñí ± ý£ 1öh–ÎHóEGõɹ¦76Î=æ<1V9ŸÓSêúqðúYÊntÖ‡˜†Ñ)™‚ùtç@ù%ÜLøµžKÒƒ)¸4óc–û‹øöçdm³úLª›óÙ7Ýq²î6nv´p~ÏæW–Q¶ï;¼¹·¿{Ž ×ÿçæ3›÷ ;Ž>ÇšdÑ|±Áƒ-$D´{¿pu|bs!&Ú°…Vuƒt×BÜ~9¶‡½]ŒšC’—nbØêÒ5¡¨öEMmä톌®§”7vtm Úž/IÛòEâÂNžö.÷L«9{1ÑU>üÓ!Ë©~ø°:¹„z #éÆï¹BÇö¨ï‘WOvPøô°>eܽ›¹;ÐZÆF61ÜÚóÀå”ýYHQjæê{Ÿ«íÍè¦#*¡Ü+±o§çîž|ÆTõýŸÕ·°Dd¼VÒ ¯…v`i"¸tÓr3—"{<¶ö””\<*qø‚F㈢ ÌiÇ4BÕ8E4è9‚K ã`T¦È)c!“`õ&:,Á‘ÊÌÉ,ÊfSÊcêÄvqwõ°OkD0¬ÑbÖªfþÔÄÌJÑËÍÙ(Ñ^Ê|mCïxû²Žhl8B¾7ð¦f W¤¢×ïà[ÍA¯Hºkš¼ŽbXö2ú*Quv~îæc©¼ÓëÇ5eC"¿tGîëåÁõ–Öúò)BýíiÊ“‡ÎŸŽâ3P?4pðÔ‡ÈÜ}Oû¶–Ä>Ùtù­ú—Ã[=úL'dÓWÞ'*Ù†”,m:oâÖ8ËAB•Ç%&OVƒZ<ú†ñv#é©üTêbŒgœ¤aÚ¥W±¾ü¤¸ùBs8Òs€v³ÖÉãý8«þ‚‡{¾ûB‡‘7<œ?ôÁ¡Ÿ+µÿ0Rëès—ôê‚}ä=]J Ê>N2Óýùæ‡Ùï]8ÖTOç¥EÒs¸ «­†{t  +ÔfI¹Èz·R®ù»’–èçÚÇutý•´rò<µÎœ“î?Ç­ªf­]:¬½ûŠe–§êD(YŽqË€qŽÉȀɴŽéçS"]3²A³½ºæ´ƒæÌºabì:Š QçØu­D­¤u­•­5tm m,t/Ù ^jÐá:ÝwÙÆG›û!ÊI×.vÐ.Q×>cÐ>_÷JÙà•Z]£]ýX®!]Õ©AÇϺW‰pCWÉô®íºF«wyè:»žlȉGÏùÔ³¨Þ é¡Jz75†nè¹X ¹Øé¹: ¹ºëÝòº¤ç1ä«çž8äž¡ç‘?äQ¦ç™¯w¾M÷ ’5²ËÿôôÛÏz·‰†o“éßÙ;|‡Vÿ.óð]v}ذ¾ï©a_Q}?éa?%ý{Ã÷ ôý-†ýíôï;ÅÜîiðÑ ŒÐŠJÔÎÎ×)© Ì®yíàÓw‰¢$”GÆÈà!ÙÈýìo‡Ã™ "ØG"`‘<#‘§ ‚D1 Ä(†±±Fš z7h†Û«š6z³“µ‚ȸšl¼Ègãc—±Dï±gZìsFu<ãuJ£Õ¢ã¸·ÒÆ©E›¼ª9cùYãOs…Œz:qy¹Œ7¹7ûŒ7·DŒ·Ä·׫Ï7n+©Õ|UEœÓñ6ßq¸ÃE¿sz¼ó³qÑD™I÷Þ‰nZ“æ‰v“^ØD/Iß©‰>Q“~é‰~%n—§ &ì§ÆL†Ü'†|¸vˆ0ˆž‰5MœÍ0ËŸ+3¯o1™è™˜1™ôT÷7yG6ùn¯éídYÙÀûä4Ìt†gr¦Ì9ìÔ䬴é{¥É÷ÑF\«™Í~°›üèdúÉýhø…ƒL?¶Œ}Šüœh:ŸazY)oN#oáÂÈ|Ëäb)ndrŸ.oáó¤â„é†mï6CÞL~aQÝÈñŽn¶éjü,±Ø;b³FH­¼‰á;KˆÃ)³-Îf[=ÞmeÜìÁAiFöôYãÀ–¤wÛ Ì¶—›Itoo}·£²%ÓlçŒÙ®ùç¸ È îÝnró= “;éÌ÷rLí%7Ýý˜ž\ÀœBlªŽyŠByŠRóE9‘®9µýõ¨¥ó¯ù¾¤AªÑÐ}O§h“^ظ›Ó˜Ó—››F@*§zÍë¢g÷gŽïŸ7gÚ4Í´Íâùô: æƒÓÌáÓy- À\ž3*OÖ´hÈ)˜³°`µŸfu¶8â1}Äׂ <ÍiÁþtš=É‚#sš£À‚³|š³Î‚«uš«×‚{tš{ÆâèüôÑM–m3û‰ŠŸ'¡á°¦0¸%œw.`‰›AÈX"•gš–(Ô¥%Ú~íl‰ñ˜ÁøZbƒg°‘–M²Ëœ+°/Ÿ¯³’h•èµ’ô=5‰tEœµ’Úö^ŠÜúÝûs­¥9ÞKíexß•°–M@HyXÍåÀ6î¶”7|/oi}Þþýygk÷ ¾ÖŠÁï#­•‚aò™Ä6ðnøïúù%!.-"#pô´©æQiAþÓ‚ÿƒ< ø …@àÃP(ø G !à}àB£Pð÷á0ü?µ…CÑÐ LÿAYþrY[Z©[01m0°Ð×Ö3úùs–VÖZÚ&VÿF‘þÍKÑÔšé’¾‘“‰¶¶“•ž6“Ž©‘‘é%}]&3 S] ucK&+S& k}#Bº–©¦µ1¾&Ô­ôMM¸ÉÈ ÜLLRÚFLHnÁdjÁdlj¡Íd¡­‰ˆ †OW—ÕV`ZºŽˆ0Y[jƒœdµûZú–VúÖ;628þy}]˜–¶ œ†^ÇÂÔ˜é2þ™ìO ‚ÿëÛÒóJ&b‚¿­o‰Ï_ +S [N&+[3m&cuCm°pšZLFêVÚ—Áœ»Lêºêú&dˆoÿD~ó'¾X²zÚø×Ð7ÖëL#¼(^ 4Œôí´™LMÀ"iZ˜ZZâëCGÛBÛDSÛxümaY q&3u]<=ØÚLú‚•²2éYq -¬€«¸wTßDKû27A^„Œ—+äo‚¯ÊM¶Úþ_õ3}M+k mË£ZÆÀ>ŽDþ´ÿ㯕þ„ ñý…£70!ÿtA~tý?ÞÿÔþø¾öGeà´?‚ø¯ýÿëgí¯gªÃ寣?Ç/Æ4þ¯ïÆ ûoüÿ7®ƒB"g€–LÊÔÂÊB]ߊLÈÈÚRÉH[ÇŠLÄDSOÛ’L\ÛÊJÛ‚‰ à‡x2üPd¤M!ƒÂ &Œ Æa‚âÿ¿ñ?ñ?ðÏAÀ?¸ à/$)‹ ŠÁ2AXØ×ƒ…WáÙ.³Dü”- σ2AQH ÖG‰€Á ”x°fJB¹R(õhh %^[±(>Ÿ/…€Ð0äRê*‚¬£Tø‰ç‚À7ÖI C¢—hñhÍ´„Ò´H(ôÑe&Ðʼ֚Äà%‰çÕßhôR @®½P,_"ÖG ‡` ”x°ŽÀ(‘Pä? J R®–ú·”(@~A©…CPKF0Á Xä‚ ñ‚D@–î­>‡GkÎßž0€| ¡PøÂâmƒ%„(ð­ ‡,Ý[}Öœ^j f ¡ð} €–‰¿Ç —î­>‡GkÏhYJ(@ª`À±X&C¸³ò ¬£–î ˜"áX4ÀðÍpï¬<³î v„C€Æ‹ Fø °ƒ"‘PðÆÊxðßPðßPðßPðÿÎPðÏTÄ2oØ¿1Î`þþ~S?ÿ‚ûa`пÍäw_²ÿ#1z…í×y@ <ÅßgB©LøY0Ë ÅóšÏ_A0ö§8Ú 4*¾6ÈBV hO€ ÷x"&(ÿAÊIÈÈTôÃIY111Ió«@ð5ù3zü8H'4+¾O0 Y›>¸µ!ñÕ·”åwDËÝ/ì¯ÊŠJˆ¿‡àÛŽ@2 ëëêá§lg-´ð?ÿšå7ÄøwDáI°H¾)1ˆõä‰j'†á¥™IZ[Wߘ)ò™jªÿêeŒÑ¼¾…ú¨"+m]<ýRÕþŸžÿ¿pýÿö¯ø 8úÿàÿûÏÿó¿¿þêÿÀ¿¥¶Å:}?è%Ká{…¼lcA!PôÔ× 0uáSÿο² ñLðZ†æðšöÂ[Ó0Bê*R×lq¡4ºDŠGë#E‚ÃÃZûl| Ј£ÿ„(2–PäµÕ#ÈðC/00_#,¹”ºŠð©k·–±À˜Âˆ@‹Gë¤Eàm-­™–Pz€‰†cÿ -Pf-¡Ìk¬I$ÌP0 zå7†&$¬€uÌTxå‹/È!¬ŽÑAJÞ54&Xa ™ðï¹ò› ôØ%¡Ç€‰%ÜÁ?ò»Å<ÊPP‹H:$¯Ü‘ø&ø>:(  xÕ´^' ƒ$äº'Ý÷,ðÚ?&â_oïȘik®P ~F_` ¾à§ð™™é©ÿ•ìGÊß3×I6>ÞüúŽîÿ´ƒåÿòëgþ?¼x™ý¡°¿÷ÿA p4ü{ÿúÏÿ÷o\+þ?qu-KMu3íõ: †æï °ß®xݰ4JàM,¼áG#—ÁwuèŠy…W-ÐïF ü³0ü%å]1þJ mpÀ/ˆÊ,!"%óŸfX¾þ¶ÿÿ¡€_ô(Šþ¾ÿ£ ÿÅþ+ןéÿPÀø[ý‰•ˆÂâ»>‰ÿ"¼uù3j€)¾ÊtÅv€a™~ÖdC-OÐåWlQ«ã0@!ð¥Õ)Ÿ‘ö壶Ꚛ+K½_Q~o`—Àì’1µ¶ÐÔþ0 ÚÆ ‡)E8Îs Ùç(`€n Nù5,ñšAÓj-„Ø%B4_bcuM=}“_º<%"ÂñlôMð9ZkçzZ®Œ·èŸU+r!ØeOü·!£?§‚ dÙ›*lfö "àÄ0HÜ\ ®P¬†ü d 6`ÉKI­Z´Ö–PàJ((¦fVúÆúvÚÿ Câgã¿‘º­¶…å¿ÿ‰ï}‰ÿBÿ·þÿ¯\kÿúµx)Fåg#Ü…LSšù‚Óš@E¿œú5KØZX‚ËÇ KÂØ„X¯–S¿b ìk` *l%¸Î ²Ë©«±Oˆ5¾9¸òDŽpd^‰R¿.&dM,¡Ë•I‹+cñrê/ÆÏúÿ’Î!òü›Zàý?=þÎþ‡A ðÿâ?ÿ•ë7í`áÒªÀò 8œ ¹"Ä?0Ó€Û4 Þ€ÁÑPnprƒÆk(Ã۱ཟí1Z65!`Ä÷ߘšP°û†€£¿Bp(p>ºŠ€Ô•~ˆf‚¢ÿÞøFö9µ  €åE@€½Cc0+‰_óýùþA/h‚;h–†@/!/YIüŠïßìKÄ‚NMØ —U޹‚ @ƒñ+€ç…çáᨥç $b!¾+>³Ø~¥¸°À™Qh`â©øFÀΨåįkêç °Ã€Ûù`Àþg`«#ˆ@vÀ&¹åÄßÝÌ÷èb€Êeó6‚¢°$¬.ý–à<d Ç.•÷wY"€‡C€ ‚`7@a¿Í FAãç„è=<úí½†@i`ÑxÑ&Ðúm–H`8'Œ§úJá,õ2èdè½øšŽÎvƒ ±ŠàÀ¹c`ê*§®ƒ5 ‹%tñ*"ˆö„O];k|7&(\ÂDjí¦®"P1¯½ÔX|Á!H@<¡ß @ÉRW>u¥—FÀˆpB¨û B¢–¼!_!|êW’Aø‡ø¹»æ‡ C-5àØ_ªãßd‰‚X‚%_ªÛßc – ” x”$ùG^l¦?V—„†Z/Ë•–G1ýÝIˆœX5V ÇRWÑ÷òú Ö+ A {®f²üÜÚYÅT1+d¸šÉÊskgMÐú`5¬VÍJ5€©«d _Ys]eö•G ù»¦»*Ðt`Ì1 l¢ö'z˜€À:àT þ&`cºe n<Çd  Ÿ¾Œ0ëZ¿üæžð/ž9Â+~w!p–8¯6Àîòµÿèç4€G €ã+“éìW³%ËZÄOhñcÔÒ œ Àoi©m¬adû·d`ƒ>OØ @ýJ|ç[û  'Í#`ªE àB-O ÿvÿß¿óý¼ð—ï? aðÿæÿÆõçþ¿ÿ{÷êýpká Ï¿(Ñ5ñüoÿúëýË<ñvÆ?â †¡+  sí›-¥ÿ”'È \›$ÔìŸà .:Á4`øá‰}ã yþ·Ÿru?åÊ"øÇ¾"OàKR°úd$øÅÅeùÅŘ~I Ç.-°‚m)#!þK dÙ PðŸæÿ%8 ƒ^ læ—gZ­‰¼Iôg㿆¾.pãOð‹ñàïâ? ¨ÿâ?þ•ë÷×P„µí¥Ž!ø›„@ôòV³¥uåÙ|yuŠý»x‚E|…ýH]E@*Ù²—ü œHöíz/!ıƒâ)uK}ͯÖaLœ™A@–üÛÀËýÕÐçB­çµÀÕxBüüD˜÷þAßEÅþ’9!´h½¼‚Àe!0u©ëaŽZ)õ Z].[E@꺘ƸA Æ}¬ B`:v%D}ù¹¯ü?eüûùPùóíw++ˆ˜ÿyfˆ•åJ¾`ô7‹Ÿ8³ÕCsÀ¸š%ø_U#Œ_ŽzX¯´aÀízàÜ n–^…„c,ìk$¯«§ „“ÂAZ„ý8àN‹„ú_Ö!–TaðÕZú_6 >ÖÙw›àKyÁá?Ñ\`eƒF:vÅ\£ìÁ>àÏU¤®ƒ7hvaV–ÃWÈL]EëäF.— Y.7ˆú¹\î•çÖÁ ³ ´ßW8® ùëæý ÷_˜ø`§"T?XYÐoeæŸ1gÍ„zÑa Fu€LÑ`Ã}½ƒý3…BI¨i0&28¸Áâ›NóÍÌ JØGY:º<×XJ £#ÃÀ°@ÌRÝ2->Ë;B@å 胪—B"—ŽB€-K Ü{±^¯å_œ—ßÞþ…‰Es zéÁ´gb‘þ¥¡ßi!0µddø×lŽœ€þÐ:ú=†,ù?€ñOÆÚLÛo„©[¬¥Èè•-lÀìK^\äüšËL ÃkÄPf`¢ˆƒóAZ>Os-Æk†eR òÃ8N‹„/É "«’k˵4êƒHFÛH{m´˜¥ØSÐCŒßÄIþ ¹”!HõmLæß¹Ü@²¯ã+ÿ./4˜¸¬ÁdÌÔ-4¿µÍ—&Õ}ƒüi¨38‹‡‚Vø Û H\€ãëÿô¼íO]?›ÿYè[jr‰HÿÏçÿxÙ‚ÿ‰†Aþ;ÿó_¹þÄü¯GÁ(.Ùø‘øZð5@`þßžƒõ•®_µƒFg×ãi10f@!!má×ÁXxƒÂ°0¼ŠªV]J]E0ì:Ž½Â‹0˜ `W(*˜ºŠP_ÍV~Í^bˆßI]E C0u­‹5ø^!‡_ECBê*Z_©±àP ƒãÛüøà >HH]E„Ï“®µÔpÔ2CøiÆ0$¤®¢õ±FŸ€Äv ÁÔU´.Ö`‡€A€ÓbÀR¯ 8 r`ê*‚ W?ùSÖß[Ê047†ŸSr£àâ°Yì)hàã˜0ìëøKP¢Á.‚@­HÄï±D# K,/~ü–(„À¸?ÁÄ:,uØJËÿKd™% ýC,È€,±¨”Ñ›@ \~»ù½j‹fCKŠø¨ãÏv0KªJ ä@¸Ê¶”ÿõqPú€ ·í'ÿëã`OÿÑfò¿¶6ðø6ÿµ0@ÿhù·ƒs" j@µ²œk5– F üevüU4-8S>S€E‚A~Àü |9@ˉKÔÒê*á3 o#ŒüHðÓÓà‹¢&¾6ס%1p(H‚‡àˆ¯‚^J]EëcÄË5CðF ¾FH$l)uaÖs8 øÊp8ÿò„/û® (³”ºŠàÔzFŠÀ|ñø+2SWѺXc€%"ш¯ÀºŠÖÇNk >h½Š€&¤®¢uÕ5~TCÌðc>ø©–Uˆ!uáSׯápn`QÅ #x±€HePèÀ¯­é4Ÿ_°f­ K,ð±äõV·ºq»û+Ö(˜ºŠÖǃã:à„®û´9!uÁ!¿]·hÀìuà«Ìð¯¶HüS–hÄR 1hèŸa 2"Ô) óGXbPÈRï´Û‘S¼Š&~¤ƒý9ʾ8Þ6CZüÛèÛoWƒC3Eœ†}œÐFøÇ4~û8²$ÓÀã?šÿú8 ŽÇþø™oœ,Kø4øÏ,—¿d… a@ 懦ÈK>þ#CçÛÇA×»‰€âuÜOvùKùr8³þÑlV†¡ à]‚ S ¾ÄµœL0À@ß1ly!µ´‹¹´ ØD¿~)ü~Åc9ÔŽ°úÏœ®KØq Y:wáðò ‡™bÑßœ ñ;'ö.GPmÿOBé°+YÀþÄéºÐž(äâIXÖiwýŸ¨O0è¾üîÀÁfkÁSŸ ‡ƒÃ—×,Ñð%ú ­ó˜pðP-ÌòVãUDQôò©+Ï­ƒ5t©Ó,¶‚gÉ~û¾./X‚!–»­ß÷B®ÇƒT§û³Ž[ aYEëkF00†p ⱊ@YSWÑŸ‘dÈRÁÁ¾÷gÎÈF-WÆ·çnC¿æÉõ“ƒ)ˇf­CøÑKŠÌnN3D#¿Fèuu*ÄRß&HÉ*B¯œ·ŠPë;´µ¼J‡Xéñž‚ZVY+Ïýí‰}ß¿9.ð«¯À—u6á¸qðÜPÌÒ»ýdG xï—ÙÿÍ̲؂ ¡B¾cJ6zé˜DB£!—u€–… ìEÿƒ Òd¾ÖÁƒzÖ~"8 ¹ÞÁQËaw@w\ë𕚵HøB@±ÖÁñ Zë  k1ë90ì§`DÐ:N OÊÏïZë1xK;|×Z+ŸvC­'ðXÔzòÀ.‡]®ë=@еæA0Y€È’5çA/ã!´l¹ÃÁ^ü™åŽŸO¦гP+[_£äþ5)²r¼áüXŒYV‘ –Ÿ•¡w¯ù'a2€±Nàz8ö–ß{?~%\8%Ø)ÖY¾“[„ÁÚû ¡˜¥ÔU„O]‡Vd0pˆ]†PXÔRê*§þnE ðÝ_P|áE),ù—É:ë‚Åä–Àü” |éšP§`Ãý°w­“% T KI¨é_ZꨟW#è_`5+.`wCã? ¨ (K , h_üŠ2 RÿÚ8_ÛLùsÕG¢ ªƒÁ¼ŒÀà’bbzPp´„2a1ìߗꇓèWÖ°I Ü 6xö?6ù¿£T=ðM{ ‹ù±Iö¸0 ÁX4ýS›÷;"¼„K„ÀAìøŽôSóúGoDM¢€å¾µäV6”„øñæ %„‹ɧU?* œECýxÊóƒ:£åQê‡3ž¿` p`-Bhw¼,a°ø¶\KMe³Ç+üH²æ,€³(ðãùÚ²wL¢€Ãµ€Sc~8 ûk¡ðuŠÁ¿÷Ïæ ?x °— Ž·ÙÖJƒÃ×N¾6`Œc`øÞ¼ÆšÅkNüà ,þ¯5  Ð@”ÔZƒ†ˇk“pÁ ŒPÌ÷“¢ï–3V½\„IüøÍÊtŒQÇóÂfìòeé GáG àF.o ý'+œþéÌ#|šƒp ä›&°åWÀWú_uÈå-„HKØ·ün ä[ûÌÿ?öÞ½¯#YÞןbBÞ÷‡ð Ew e•sØ^v1ðIœõIx…4ÀØBÒ™جÉ~ö·.}ŸžÑÈg÷Yf7f4Ý]}¯®ª® ;õ¯Ûo䩲j¿ÕlÏœðeÄ–ȆšÜvm›ªOp)ýâ©Á´F•áÉ—-ýº` »æZ©Õíö*cªVº½ŸYDÓnKƒÇö–œG¨ŒƒbvØ×1‹¼±gm`‹ßõÓ#TVëTì ¨QívPÆ[{¼Ê‹ eìÇAÚzÌž5Ð_LY[˜Êjã§Ç¨¬J®ïP£íxàચ¬ål*á’ÂÚ¨ 2l½Ë~)1&Ÿô4bdEaSЊï„pÞþ°ãòÈR”~ri“oy( ‡F;„p›§Ó™á<Á[ˆŒXà°"ke,4š^/*ƒ¡>êEÀÚfJѽ–|íì¾òj>›䈼&÷Âøí¼ô‚š`îÑõ†0DÚÚâêHîw8¿ ãàb0 çɎ³ì?æƒh¼9º™­Âv4Ûþ£ÿk§ì?ÚOþŸ¾È³ ÿßuBjÆZÍ’XT…–(Ÿ,Æ[WÊÊ·†2O.›Ìw "msã­ÛƽÆÛr°ÛicØQŽŽù­[~!Œ·†¢Á ÁÆ‚tWÐQW ü¦*0Þ­¥`W¥BÇ™ÕoÔZJÕo ã4̆mPwM¥Ò–àÉ;‡hðCÒ…U·.ŒtÅì=(Y€òж««Jshèý43Ä×4Ð{ÉJ¦±SÛÚÂûäj¿Ö (×.O,×Îj¦¨³…h§¨ƒ:ð+™"røC0»[ˆœV“ZGÓÞ­Á®_É´Së&¶x%0ÛäŠûÞæˆzƘ¤Û$TÎøH¿ÅDõ"~A¸ír¬ó±¡ßè ÃDõ"ælõW[ÊC§:‚k4ºæÁ£Týæ‚^0Uô›Ãb‹–ùFëŸRõÛJ`‡|ÕÒŽí¢S´ªmc’ß\:“ð(ˆvæÓQ˜ªßÄ‘U4ÅÖ@#:ÊŒ7")(U¿1Á²ÌüÑ2£YÓo´Î(U¿-·ä¨5¤ñMmÕoú”Õo‚,(Øê6)Z6Ä6Þèú»e¾8çø"¸ä‡´Û柊˜ªßꎙî‚ÕŒgâk”‡˜o|8bª~x½`«;MŒï‚»äE¿1RÇTýæ‚^Ço«ÍŒO3ýF8“Rõ›ÓåŽ5¤Öo|²cª~sAçH·¶%Úº ³ñ&N-ómIüŒÓƒÇOž~Ó½~ÇIÑil×Àn·a¾@JÕoË&‰èŒ¨ñÖétEª~[¡B‡ Ó¼-ŠâLÒ\–Ú™0M‘]³i«E~ý¶˜«“{:<ÚèJo‹‚8W·˜ò磥®»:-ŽîŠö¹„é|A fF©U‡ù®¡o,Më‚ðF«CÞúè½]C‡Í³ ©=mŽ0\í2Æ"8Pa—ÛÓé2ø®ÓÆp–ÍF@îßÚ[suÜÛôÒê6Ä âÓ?R.jëM:ƒ/ÉÔÖl£é¾4ê[¥@¬.À›½Ñ†¡hwü‚aôB¾o$BCØõÆVM”£©A‹RjâJktåÚÄô“¼¸B–z¶I­Ö¡¸“Øuñ¾Zïìÿ)%‹mƒNñ“’üutKȧnÚ]4¿Ä®ð™Ôî6i<†¿´4è£L–vAÕj].Ý"ʱA«½U'½Œ–8õ &­[jáÄo""8f·ÍíÁ¥/1$mާ ÓìbeȤÝiò£7Üxâ Ñð9'µŽ”æVµ÷‚ nÕ›]–uñgP-Dôü‘s6º[Ôi¢š(à|~ƒuËoõ-Ä XK½Ýµ ]&K×kˆÐÑ<>q­µ6Š$¬5H˜Ran£_å­-Ò”Áˆ¬üþ¯²Öþ½JšFw©C‡Ž£FŽè 1º;HëT·Ú¼-t±]«wÑ`mkU~k5;gäw:-èP—– }£å@"VAÐ#ú#¤ˆ'"Jªd›NêcŒeµØðä¯é6«b×eHƒ²…íß­.¿âAEo´+)•¤ÉxÅÚn1oG؈×>â~C¼D"“UE^ÔÓnŽ §‹†aD‚úÁî5]AO±ˆ¼†î#  2å-^'´K¥q3•û™âN8¶Y-Ã6K¸i!ñum h^¯¢§çDþx<ÝmòúÓä“Âké)AòZ¬^#G·wxˆà’ñ9ú õ‡ßŠ-«Qmtà5(ôŒ‘„ - 4TE—މÂCE®ððäë‹j«]Ïðšã)Á§:–(4¼[-|p‰BÍ¢¾“QuÁ¡¾ A% U"–; ¤­à/ËÌa·´A¡è¥ŸD¤ƒ{xÅÿ\Eplq^üO@®ýG’ƒ§ûßÇVÿ£`¨Ï,æþß<Ôg¦dr¡>³€¯$Ôg¦dk¡>3?…úüÏ õ™)ì\M¨ÏÌòêó)ÔçS¨OóZ_ÍÀS¨Ï§PŸO¡>sÚüêóß%ÔçïÍGý»>Yüÿpz=‹Æa èèÁ€üVƒËÿ7šOþ¾ÈSPÿÛáþ«’ùo©3Þ#ç&Iw½Õ®ÔàFºõ úÒëçÛ–æ*ì–¸Ûi ƒ%?1°ð:_Ñ—(ËobäÇV =¥Ð[URšÕ- „uñ&ó™Jõ-‚“•·ˆÆC7wú­U£˜x©Þ0UÀ®­#È Øz½Æ-ëÖëmãz@©ú SMØõ\Э6FµA€mt:§ßxp0U¿ Й³Z„n# ¤’WÙ™ûCA’§-É,V’×!‚ìvp8}jräême IâVôæNW¿ä?&}~üæn0”¢%³à–Q® Ë£Ú*€T¥ZÍàdzÃ¥$]¥ºxO/ãÁõâÊ èj›®…:Áö9ƒá¼@¹†,×nl׃áU4YÐÊ-Ú¢z4©bÒWž ë¤€Ñ k<šS¦Í§ÃüË> Ïÿú£Ÿÿ°Òç«ötþ‰ç3í¿Š­– š5A$ŒÅ¡$œbN[øÝÈÂ×má k%khtÖI¨IàÈhãO¼k«@¯*ËÌ_¢AjÚþâü …Ç ó7¥ñ6ÚðF¹Ù9’çÆS*)œÅC7îÛB¢©†7&-ô!´%ÞH£·AšŠhü…o*ß„M³E¤ ”nµˆœ‘oT ¥ê7L-NØÔ·ˆt€-"gäwSõ›ý ’¤@läNCß}8ÒP+ˆ£¹ñ:«¹i»ÚjHƒ{¤HÕ[çŒRõ[cË’I~¦‰UKÈfù¶©]_H ýDRëªq Óü\Ké6­Cž[Liäƒ@’á=y:huV’¼žÐÔKO=5{,›K%9ò¬ŠuµšVn é+]Ĭ$¡AžžÎªZ‰ÃØ‘aòˆùù¥fõ_º…‰ù-Ü ^Ã(+­¢´|ø QªS”–ߪ²9Fum7 “ò¤…-‹µ SòìM•Ku–£äI& [µ]».%ŸW¬ANü»¸òч½#7Ì(ƒnü›xR +åH(½ýª·ZÌf´jÕº#fôèІ¬Ã Ãyrt´³¸Q Ñd[É$µJ Ûiü½øž,ú?/aî7Ïo¢ñ(ŒÆäÓÿõj­Õtý?4ªOò¿/ò¬Bÿ‡îňP%€­®8nëƦ‘‡Ð›ÚºÀ+P|ÊZÃz!rh¢~_£é‰ã³(¤•r«³%@¶š[äCZÙli݆¦r{·|ák–l%F\fÔ^ ò¡cÙ­£¡v¼ GØC[ÉvV’Œ%Èå*Èéi×D˜¥Z`Û‡y£4¶Z¡§Õá)Ño4ß”ªß0µ¸éY³S«2Àjšê7^J˜ªß–]ïViâéÙ4ßhþ)U¿ñz]¦Õ¸xD[ÕO¦ê7±ÈŠ‚&eôZ¦ Q—ñÖl4¥ªºz«ù¢eeƒ†r¸˜„¬~ëVë"U¿­bÑÑR£Öâ&Ó÷À ŒKŒ@âV ®ãš€ÎÖVË»ôÞ1«Öò¥úŒ7ÚK”ªß¤²^±]…÷Á[MZ•PØx#h”ªßšb}ß°´*y›ª7Z•”ªßV‚)’=-¬†Z»L°_Zw)a”Ž<ä- 2(•jXë·ž1ÃÄf׎8‚úÂ[z g¶…¦v€ÌAÚDWÓ2袖À7µ@kÉ׺\ÍéûÖuåá@h¡…fJí.…çEëè&Ãa”ŠN·Ûá·nƒLåP§KöG„6º[ˆ›ÐŠ®ÛFS»¦Â\ttwå†í ;Åè±¾Õ’ZÓ í–Æk4œzR*„jDk«-´¢â¾þ÷¡%\í~“C­‘Q«@PØv¯ˆ¯ŽZ§ ]öZ¸%à? *á5±ñ• =Ûjg„NvJluÄTÖ`áym@<hE`¯ ˆ·Mtÿxí9œ-¼WÃuÓjuÙ‘ÝœRÀŸ0Ýj£µPF9§Ìà DIO‘Ø}:O±@‘îC .®{Ø…kÀ&Q‚5ð~÷L¨@Ñ1c$›Â5À÷­ªl¤r½Ú(ÒæJ؉{y% q êøÛ»UóDÐý ¶ƒAR{WÛ;f‹;ÞhúÂ…~ÛÁ ÉåùP¶£-gý,Iİk<œýFÓM©ú S—¤ß ñúW¦ê·%A#ÚÃeÈTñFÓO©ú—ë2­Æµ#ÚªÞxÎ0U¿‰5¶ ×An¯o¤ÍC©ú­ê‹ÖœËuàZ”ú­ƒ–ù”ªßV±æh©Qkqˆé{8×Á qÿ*Å¹Žºô«Sœë¨ÓÍ¢ ùB “Ô‹ô_œáh6ë‚/5ÞèÎRõ[s™¥É»$ïPõF ’Rõ›Be8xÝ4‰¹Ñ­­Ã+ßn…=€7ÉʺZo™¯[¤¿Žéú “å"ªær\ýw°Ñµ9eÕ÷‘u)Ç&½ŽŽ8T¬Ù".‡´[Ðoݦ´ÓouÃê!&±#GQ¨JU®U€Eí5ìsDªµ– :ptÉFÁŒ«ù`°Ôd2C1¼Ú?ldPTaÝ¢Õ ®cŠ GîÖkmû•ìOØ¿zÃä¥à“ö89lg Æ+.nYoµ†Ÿ¸à¶´½ f›WÌËv.à•úÐh.¹·dR¬Õo¤l»%µne®•  2\§Ë¬Žh¼_R ¡biÅë×»GÒ ”S*’ÀÁ$ŽùÆ:Á"…Øj}–ÇÓÀ`žL¨Ô¡… ¬€8bÙ/øÞªú*9ý‡ ‘˜@ìH‚ž„H ¼x¤T:5QˆDçShÝn‹…HHŸ"–8×iŽHêTë(j£Ú->Ï©H5CäAU/%ò i_JäA%–yÔQi|‘­ÏeDT`)‘yùYNäÑì./ñh¢Vð’ÚËH ¨À2:^Ö/#ñ ËH<`À2ÂÆgô ,#ñ@|¶”ăP¡®¡Ö’xÛŽ+Û’f‚²‹”éRaIrÚÛꈒäÙï{Ö(T´[&½tÔŸ¢q±¶¢¹—ëà6»™7‹5µ!cå´kp¼Š‚%«-6Ò#*ï4 Ãb‘G¤‚]41<^…£blu5‚'ðöðn86œS,l+y§ z—hk[Z»Rd¬½‹Íátr[¨µèÙ‰nxHñmwp¹Äàti>¬Áù½užžô“¥ÿsu7 ãóñtø~ób_?( ®œø/ X&ŽþO­Õh?éÿ|‰GèÿÔ²ôÿ­(/9^‘]aˆ/„ qÑv­j;;ÿ,-aCL-¬™š®Ÿ ‘íéÉ÷ò_ýùÜ"éAUjåšÎK6új®‹f0ýFˆtBPÕù–ð‹Í2«¢¯úä?,dSoõŽ­”¾tKºJà¨jê­YŠÓÆ[£í›·E²OŸÖ3DM7÷0kzVÖΆôÊÃ+¢Þñ,°¥Û)Ç“iV“´½yŽÈ0¡éÛˤ½µ%<±õÎCa¶kRÛ–+ÉYU´i!#)ºaI×”.FôÍ7¥ê7ÑÜÂz„;'3Þ´÷4ýV÷ÎÙ6¤Èˆ4’õ…nf—êm¹a›R&ËýFKŒRõ[Ó:³Õ[r¬9Ôºz£¦Týæ_Kâr²°jˆYKxI˜BºLçC§%Ï,Ô*3QàÕ¤m)R]Þï ©ºB#[(¦®Ôë@ÿt;•:^7WÐ5z£V« êLA4ÛÍŽh>ÀFW(-hßÚªV(ªX­ZÁ[¥z»‚ñC«\A võQ Tº¾Ui`”½j»Bª=íZ%bm(Øå ŽXC6Wê0µF“¾£ M·ºxŠ-$r…F ɈÞ I›¾“僚z!55åQ—k‰¾ñu^W®&‚Í!¯z5©ºéÝîL»n¯&˜k5µ:îjj×ìÕÔnÚ«©ÝµWS§î®¦v×^M@¼[«©]³WS«é®¦fÇYNu{A5ëö’‚¡rU³a¯ªfÓ^VÍ–½® ©ÎÂjµì…ÕÚ²V»n/¬vÃ]X æÂºa@âÆ Ã–}Ú®†ßUS·v™zSß]¹þî–‘õH™VêÇ~­@² oÉK÷Û^ÿöOE‹Ñ²'î‹m.,Ö­R±6S¥¢¶ç † ‹‰¡]sƒ¼óÝì˜Åj„ˉ—%”Q¬1þT`^°aì!"§aþ‰"R‚H•â B¹.¾RŽQ|9°ÚY«ºÜj¨µ$M³Ôj -AÜßR«¡V“úTˬ¢;ëHÜ\ H Sþôbð¯)™+˜ŸY5,P°ALŽÕ‹¯gåe³`‹ç`?Šv™Ä›X `‹C5—¬xš‹›û®¬ûŸÙhz½ŠØøäßÿTjÕñÿÛ“ÿ§/ò¾ÿq´œ²ƒÞÊÓ)DõRkÖ-æ\ä*—Ž~vŸ^—r)}ÒT×ê*_qÐä‚'9cÑoÌ¢nuZÆ[Ýá©´Záq¢ ô›òd¼-š4= ËeÕdÇ‹êm9Ðx='ân?©Þh„)U¿-7ÖÄppŠ=:ê·ŽÝo ›c/¦ïJ…ÚrÑ©à^~LâÊ›RN¾ÜÐ= iÏSýÆ7XJ]Uå[bt‰PÁ ïu¨ÞøÒ‰â4¨7÷šì³F¢©–Ë,ÙçÁìÊÍÌŽUÀ”¢±²V“uͫŭfµv¤„äW²Z™W§ K¢ÇNZ ³iлmrJÅhŠÀ²´þœBT°+)e¯F¢[¢!å󸟼j’ž<•X«eç–P{ Kxu7=%肇úáÕ(õ”à%€ÛØ«Qê+A*YX‡WÏÕ)îªÈÉyÖê›=ÿ³è¿ëq%ÃÍ(ÞÄëè6|1¸€þ«ÁFrýÿtjOú?_äy ÿïš  RkÚ¸©&×o«Š6P-øa€n4âDYšÞäÃ[Û2ˆ­;pŒ#n‹M@Ñ{5z6Þjè´¦(óÓo$©×øDÆ5‘Nuó[µËp G†è^3£,éÃ8ÛT5ºú@áaµÚÔ©&À샛’¦úo¡_3~C€ÓP¥š³‡©Éä2Š.QúÚBA"½À:ŽL5.èq»ƒ‘æ@##ÓY(àDªTBbìÀ¯j;@%ÿ§$î#’©¢P^vnBÄëÜ]n%ôÈÈ]§ët\]å`=ç$·Ôû­B@ÄšÜóÁdž_ +ëÐñØ ÀÎÝà( oFÓàpV¬¾v%éÝ.Ô‡Áñéþï+*Èäÿ¯.WÅþ/ôÿ\ët\þþ÷„ÿ¿ÄSÿ¯‰ KéûX…牑a¹CÜ…ù¥*ôÿŠâ›Õ:«%òÆ©yS¤E±fÒ_X!µQPS(­j@ê ]QÈË"€Èl×#õ…tû)W‘1ÂåèŒrŒôäøº̰Ьµjt;K®5ñ?ý…ß­bƒÝqfMa™OÁY«c¨¦Nµ[3¦_}éR@§j{5št¹Ão•h‹(Í#ºª®@o’•šR¢nŨ|L’ñ.订´!êò®ŽÈ´÷fã½Ñô)p, ³-eôÔ÷•Ì‹õH‡ÌšW1ž©£ÇRßóïÝHÌJ·M¨0[t¯%‹ðR¥"õWa$²"½äCçñMXàÚšV•<ïpQ=ª7¸œˆé5ŠÖÒ’j ÃEET-´¶PT6k­…vhXäÖǬ+5Þ?~×/z%Ê!ƒ©ÐŸ‹Ü¼¶åª&qâÝâŠT!‚Ý׺}¥…ƒ žfgXdÜšR´N1ÿ!Úö{“?ÿñOýŸ\ bàõWýmqü·Fêþ¯S«>Ñÿ_ä)êÿ9KT0øC=ã˜#æ€B€wD¸$ p¥X+•IW’ôL·Ÿ RÙ–ˆë¹ÚÃ;®A áõÃAÒäÐõ™¼åYĦ¸Cdcb!{rƒ4ºb©“†dGÄhÔ)"ª:ršÞÂd?ßn³ó‚Fu«ìœœnœž,.Ù­#óô^8¿xµe VHcß^ººZk«ËÝê2Fʵñ?ŒoÓmt1p” TÖl`4ä6KëèTàèäÅ»‡g‡GEú× ¯”ÔC(º<þaç´Hka.»íТ §—ãé‡Ëx0»*Üb¡°ä4ø÷ÆŸÿîÏ‚óÑߟÿz3uþךOçÿ—x~þã¾ÅMïasyK·ØzÈF7BôÖ¨"WP¯šo:Þ ƈÐõæÖ–x«£Âõ:3Õo:ÞŠn‘ØjµËo5ô,ŒË×xÓ©øöг‘•›7²ÊQûᔋ©L± ’ÕŽÉH…” š'3ZJW…ÔÂêÕ‡ÓWu¥cÅo‡w¼Þ’âç†ä~W²*àRÇ3´f…ubìáìí¥°Õl»G~F1©ÂÝì ›4,·€ŒrêäÂÄ[@äÑ5¾’õ&ZÈ,S\Câ«Á »‘’ÝYtd֬ᖯ7ë¹t†Óܹ¬%„ÑÊ£ú<Å`Ƕ—,F‚šf—ÍÉ:~b*|jè$ß7>Ëàÿçã œÿ 8ïÓçÿÿÿEžG=ÿ[ê4­wºH´ÁoÀPÖyȆoEÁ+шxÀ—6š VR/* ^ ÃlwÐt_ëVõ_•/Dz‡†Øl" -@ÛüÆ;®ßt*¼=ø`éH`Rû[ɉª@’ Ì*@¶Õ”°5|(@Tfo@(§Y"DüB€øá’$öá,”0ƒ%â±.†Ø6Î(ˆF=¢¶—% ê[í—û ¢Þ‚UÞhæËE|Qj™rêtl¡è` þYšz¨£zN]˜/I=ÎÁ»”¥ˆ‡z †t©R´kàØ¬s?‡v@+RÏàüÞÇÑÓó…Ÿ,úï6 ?<4î§|ÐðZsõ¿àHx¢ÿ¾Ä³ŠøŸd¼²U^M:ÚùTƒðß«¸$ŽÚ¨™Zo7ðdé˜o(§DõiK®µZr½Þé˜oSõÛ’°«Y ÏÑ€Ðoí:Êò1U¿aê2°1Nt³Hº‹ÞÏõR!œªß uÉÁnl¡GbýÖD)&ªLÄI`Ažà ú§Ò=tÚ•6úßê6b­‰*½ÜÖ‡ìvE#ñEÌÚà ֚°0hD±¹+Iת×Z+K^¯´;xM=°™Ý­¦€‰ ^ Lœi^ûôÖUjðèz/‘Ã^˜îŠwéfk7¿ÖæÞê7`<;œªß0u Ø&†Í‘K¿Q[1Q½`Ú2&¢·±…nê[æ[§Q©ú R=CœÁHd 10Ý]s ˆmZ±›:†’Öº§&µßœØ‚´UÕ/øy À ¹¥€¶ä†Ýø ØÄÏvÙ-£P²ã·-¥­¤ß õÖ »VÏè–O&ßuÒ›¦å!PyXrðmP[ÊÇUGz[XTòר•ÚÜ+‚Êž±ÈO.zÒc[ŒlgìÄ7wë"ÏÉün¬µóÊ‘›¤¶TÎ{e1ˆyåZ ø§…Z ûƒ»éÍ|QAô¨Îư]¹¾ ߇@­­‚cË¢ÿ‡ÓëY4ãU\/¢ÿõ”þpßOôÿ—x Úÿe“ÿR€ÕÉ`©‚<6HÿÌ¿2æ#­ö®£ìá1Uàñº‚œé¿¡-ËÒM¢~kÕt‚|w Å ·Uû:Ê©5½µØå¢„¬ò©s8k4Ã_ ÷¶Âe…ıÍR¼*«ã> ?&‡'ÿ•[«‚Y—Ø£Ž€Y·VBÖ¨rü3&f½‘ 5Âê­QU§C,ln]Ÿ ¨ß¬†µ4kf°µ… ­FS­Õτ٩a¨ K·€Ümµ•9%^ |^;a1ɹªÕhÍ6Œî>Tåo<¶XTr\%'ÎÝ•AeO15òmØTA¶ê¾åŠÛyÓD; Iñœ÷0ÿT…G&"‰ o5©+Q$ºå€¼&—8>²&PÏ~‹Øáô¾G~^ ò:F%Àóì(>¨¸³(±% l‰-*P§¡å()R¿¥œâ U‰Ž*`¸9 (×](~O/ãÁu~1òް%‹!¥~2½‰Up³”㟠ƒí±2Òe‡¿¹ }­t ¢½¯cÁél]GÿðÕè´ê© ÚÛç ¹Ãyr[¢\vZp=^E“EÕI#G.‡Á•"¼¯¹Î-ÛèjV'ÑÊ™76í ºó)P Q”RZë™Í•ØìJ|G¾_ÞtÛ‹Ë9Œe:‚<:ÚyºÀøŒ'“þ}1ûïv«ÝHÙ7Ÿô?¾È³jÿoõ:Pî¶Èª!¥¥ÞšMRpono˜Z4›J7Z ‚~cQm,*ó=ØsR½Ñ®qsk[Ž„YÔ­œðh‰¼H[¿Ôj[uax¬Þš+ðFEJ£"¢Bƒ4l¶–h+¹#Å.ŠÕ[³Ù®qª~k8ö­ ºÙZ®¹ìï–(µŽ²ùóa’#<­á¡.ÚYtá6Ñ-t]*¸ox¹Ã©ú­î›±%›ËŽɤˆ8âú2>úØK-žNµa¼uªµ§ê·v£³ÔHH hϦù¶…V#”ªß¼^Ï– ²„"/]¨f䇙#Ðö.†º„I;cÉ!è Y»»Åã§ß8n¦ê7L]‹UÑWNM:Å0ÞºµšHÕoµŽg«-9º‚\"uÕiøÖî’0ëJ¦ÀÐWÑΆògÏsçÝc˶“[`/÷ÐÎE›Û‹¼1H{EÚt-é«b¸´¤:–æ@fnÌIò?@´¢Çø ]ëtÑ‹{ Áãq£º…žç»µF¥Õ €bêTšèó º ú¨jðßF·V©Az•ÿÖ»uô‘ßê4›•ju¥*MT¥ï6*UtßÝj øf£SG¿õ5üÛDÄPmUÐÉG§Û¬lÁo@Gø[µsá8µr\8ê8ºpÓL+ñ ¹˜/o‰»k€ZUhJÕ «J®ykÔ[«v»•f÷×+ °Õ­4È+¬ ^avjJ»‹R9Ã6^pAÎ-H‡¡í Ãü#m ÐÍPi!„f­KŽò;謿eƒí—OnkâwPe Õ›m ­Üöz tKÔ¶0Öw‡‚Pûc=»%Ú­“"N·žåŽÑ-´µÕ†9†ü[À,e…{öµ­Aæ.͆?t³¯ÿM4Фþû|úJE$ ?Æ·wŒ;Ÿ¼ uø|8zǸƒ.·ÐèÁçYÒW¢YÈ X¢È¬P­FeÈàì]2¥E2ªp[¨ŽØ«Ð|`©&ú£kÁ¢ôyáôÕ¼~»SknTè7$4»Å»Ñܪ.YmN[Õz§ðàÂF*¨]¼€ aL`w$àðÂuvh£–Q[”ø½Y>ëÉäÿ/¾ÿ‡fŠÿŠÿûež•Ýÿ}.ßÊ,+«'ÛÇx<®+¢ƒd+©"߉ÐüYáå’¯X ̺ ÇEø¦¦2_v<› ¦£±ñÀ¾³s .å*|Žs/Ö©+ÙT¬Å˜‘h£*˜o-V1^ªËÀ­‘½*=_o´@·ZUóm9Ð ±cDä<õÆë”, Õ[Ão!·Õìݽ-–¦P2¢e°ÕªoÍŽOÒ’ šD5éTÅø§]·¥æP9áõÛ–ÔÛ1ÞV²ŒÕÀ0"«®dkÈÁ`D&aÖœ!Hé´Õä4½a2W~‡ƒ¦rdWùB‹«c¼l-3m±©y…è·Ž´øR/m¯œ.o›6U˜CýF«qKâ)™k!ÛÌ™†ªÜšm‰¦‰mIƒ(j¸ÿŽ˜¾-¬¼“ƒr«J$ÆŠm'é !làGSÕ•ŸÈTëd5/÷&Û¤g}ŽëyÉcåE××” S ¹Óo‹Ë\*QÈ~[.܃…œü7„úi =ÀWÌX¢Pè¶Œ Šb ": aI›8‹iOEkâ(Ò[(¬®ó;ÂcT¡ ‰¥·ŠöíÛZâ^¡h5)¹/\“c­ þ8³T¢p*þeñ:ªÂÝå¿ Óg†£yŽ.äPa`ø™è¥åìHžž^t$,æ›ù¶byÄ“¨ëI}üI4ó$šIwãI4óôüßðøä?¯ïËh®ªŽòŸZ»íÊZíjãIþó%žG'ý?†³ä›óèrW@~ÿóÌúV7?/.7ãðÖùdý¾Ã7뾯¾oVÆ«»YŸ§Ã÷›Óøz€þ*ÍtÛ4ÅHîà£ùåzGÉp3Š7ñð*º =‰{ÇæÇÙ•Õ•8¼„J6Ïo¢ñÈnºßæƒh¼9º™½£aª+¬eg|¸™ §Vi‡ ^Ÿ=;:xÕÿãl¢³å?1«õµn~½š^ØÙðƒ•#=HF¢ðmÊ-7¾‹ø 5Ï·ºç[ÃüÆt?ÔR_гgÏãqï×ïGQü?%X°ðÆbãÙ³á8Lz|öÇø:ؼpS©HïÙÿ;ºÞ_›£«øåÛ`~N†_¾ ."+Ž¿ ¾P®g8'ÿ/NGï(&ÿQ>þ _ë£ð6ØÜ èÿóçàÿùïgïf!¦¿›]feÅ"3öùÿÅîf‚Ȭ«ÝÿÿŸœl³ZÀÆCBþV+ ÿã£ð«Úü_‡çAëÑZd<ÿáøß˜ÿ$lÎâé,©$+rü"žç^ãü¯Ãü7Û­úÓùÿ%žÒógÁó`O{†p „ñ< “Žßàf£ GtÀ:Á¯×PËmnÛã1`ÉÒ8¼™\þ{˜T&w7•pt³éÏ`%MHUbɳ£ããǧ{/N‚>&={׌Yöñô¬–v¦içÅþ¾“z|º/S_xq_RYŽp•Cx5Údg;”‚—~°çäÚ«¨fc®, Øü>þ¤‘)=vâp0ƒd£Á8˜LG0-0®z ¿òtŽãU1œ{«ÔhòžGÓ—:»ŠOª¨øèê.‚e ”Ì® >\M“‹Þ„ÁFèv:²`íQŸ`r*Ãp<ÆPXÂ4V@‹æWÁøŒIÄJ¸Ø’p#˜^àRƒªŒª£1v~Nãö<8ƒëém8⟪öY4™„£Ýð©ÞJþ!ÉhÝî’mÁVÄádpŽŒ6\Dsš@©™-xñ‘ÜÁÓF¸¸2€ÐEñÑdž°71w'Úê•ræ#oRžÉ÷‰=¿»S]FÉÜnI9Hâ¡ý)ø-Øü΄……hÝ”`VN+·€>Ÿ‹ öVê<šáD w]´Y½&# ß©æÿ¦*Åûo\£Y_à­˜—t8={ýë?ýw3 2«$×9”ÐÒÏú¯Ý¨µú¯Um<ùø"Ó§W€\¯§£›1žix¶&Á œ–ÃE|À‡øb<ýàê˜áÁ„Ëüê:œGC+¬H¡1Ä0f2aþaÌïf!áÒEåƒËpØtX>šÀø6F€$›˜‡,¢¬X1 $NxÚÌ\ nìZÞüj0§æ0™«zÕN'!ÒN—0&^+moâf)s,”J@ ;„ƾʭ~QuIG3'ª²‹ñ†P%À‰Ãÿ½‰`¼Â(*Š qp€)r2Øåàc·]ަÂøhGT]ˆ¿¸™ çÐAØá?Ðæ.ÁQb¯ Tèr¢¶_½8Ø¿N÷^ïý}Éo¤Ô©±Ž¥á05€ÙéÈ)Øéxwhù—¯Dž ¼z(yNK‘ð§LFÓ!ÏG®‘¶ÈrÀÄa¸3½žUNÆ3ŠÜh§lsÊvî¨Ç´ºp²HÚ' îxf_!|^;¦}œÊ¾­ÖÞšÊËèu«»üÉq” h›ÇÓqå2œïLoPó.XÓˆrráÑ`> –D˜AõƒïE¹Nà_àO^½ÀM€ÄÆsü÷ Lp†óä.Ü€bùü¾çÏËþ P97¼8ùá‹/ZP”Ï7ÊÜšÒ°<ÚÀœüko2¯• 9†eú1øX:‡ÏÌv&ÁÛ_¸o&t؃^ï¡Qeƒ2=×…ã› ®ì`¯*¯Ž·þÀ8B Ì0ç4þ»Ók3Ã~ò„â›Xž¤îæãÓó±\Kâ—“ø—? â—“  #“üåd‚¶Îà»Z_ô+•ëjúáp&Û$~yòü8yð—“ép›å R©ü&ò1g‰¹d6T^…¥¨Œ£Q¦î–©?82#.fŽâ@‚¶4`e2¿*af\Iªª Ø`8@¦j>†5kÓ“§¸Ý?…enÛwFB«f)Ø•×?–æwåàexßÞÝ=-•Ô‹Wð÷ã~ä÷» \“ßÙub›.ŒöOãpœ„êÃI‚Ód¯ZVÈU¤Z@?¸ZxÓm€Ø899×ã9à-c„}"T™I2F®üO8:}=D}{äþü7(œ„‡³ñ`(`D£> 5· Ï|e‘¼O}Ã1»À¿yssòÃ÷¿óÜ@ žæ†žûà ·˜õ7ñŽ»zO‘ "gÇ I‡e%¹9/1†,ц56ª|bF7ŽÊ'°©™GCVò,†’>t{ýà+ýëOAíÛÔ4Îb8;Kk§p>k¿ ýºö?“5wYX¿i€KY£øa0~¼ñ ! "e '¿±ÀbÙd$#Š%§ ÷”VŠz=(ºáY”æD¥çÉÍÃK•47ÍXTf¶oÍ|0¬ÜÑÒ×ÉÍpHÇë›Ô`qñÿ_â)1»þj<=GúxûUpÂKY!qÆÝɺŸÁtžÈEÔ9ñ—ùlfàç"ïG¤‚OŽ>qÌæŽò§.µá§i<ê2_drŒÌtåòŒˆÒÃ8†Ñ¹N.ø¿¼N.+”TZ3Gn­ 97R §˜3=_k‹™¡Àä†ý6r /.ESñM ¹ÀÖË>!ÙÿËÿÓÌ_?B ð³Ù¬9ø¿Qkwžðÿ—xXþËàqt£´7ºžÃëï%ú7ÕÀHÈ èh_döG}Ë(¥ŽèâÖÅ¿ó³ŽÂ>ûÓÙÎáÁîÛûø~rº}pJwóÛ¯è|ðäçÙ;q3`"á½Ì„³ý½_¼8I}µø=5s÷ÅÙëC_ëDŽ·÷xqvðÃëï_{Ú(Å®î÷¬zÍóÒM3Ôþ(O_5Æqlýà‰0>ììÙ¿ŽíßÓɈønTWpS`#Mæ/§ãEVÚîÎ û÷`>ÀÓÑúøjgor;ˆ#€‘8 ¯íß?Ø¿éüÕn®ÏÃØ­^ɧÍûÑm8vÃúxxbw÷èØn8 ПEɳg_JÚ á¨tðâ§³×Ïþx>H¢pè3àXFÑÌÑõxònö~üã³?V*ß Yàûüb|{ï›}‘>ñ|C$I"?ÞFÉÍ`,vâ7?Ò/™Åðùƒ»üµw ÿW€‡›Éà"œß}óJe`qÂ7¬4ã|DrIVaÜi|sLʱ¢k%ºó!d‡³8L ä…ù‘·Pê—Ñ'ãåzüŒ`ì(ÍÞà<œÈ$Bf2"rauRW…Հꨋ,Áò‘ÓÀS®’/X½dc¡ߣ¾/ÞÔ(Ò7Eq8œï‚Òh&“õyða¿ÿjšPËàe8AX„ÿH—ïÃ+X"®NB•£¢4î¨Dž`{2ß¡È{Mr$¥MZ X3ÊZäÞØ´ù¨Ü`|Â’Š†A‚ø<ºêǪbRFØEô˜8Ÿõ¼\ÏnæapÉD'kMh¿% äåíd“÷€g|rAAM#Ò·!}îBèö g.0ã“&q ô-Ò‰]\‘¥M½7qóh­všS B x€€N‡dpt5 ©Ï¶t©åŒ»á`ý…A8†ä‰Ý„Ñ0ÔÍ?e¾žZù.‡×©|æ$á²0¦Iç%íÂo°×'—ó«àØ ©êˆ–'±µEÕ¼©¥‡ÂàÒYaÙQ*†2¨Pv4pê™gFÙwi*¿ÖTà"GØ_!OFƒÉð.xáOÀLÆ8í'„a„)–Çeü½ ´G~ùXF«­#Ÿþo´[Õ¦«ÿ[’ÿ|™‡ébócJ»ERí·¢”Eàÿ€‰ÃžG;pº\à¿Ã÷ë‰.H™÷Öa3jªÕ:æÁ|H5‘ ¨U‚STQ‹&ðy0â%8^d‡Ãá µä5#ÂÉOOÈ4׈ø’ÿïÿ;“ùúºÏlšbÂl„@lÕ½ g¬W‚£0Æî34b4 $\Z=Q/4¹ GEÅ_Ïñ ¬þ°€e8†••ˆiU=:._ â1ŒÀœeg(MB]<|%S)–?UR>e”ü>dH£äsA EU@ÁÏžÙtxZ„çïÚ‚¼<¼­iðúÈÀŸ8Qùéñ”EFáùúÊ/Qˆ4?( "âµo³D~;¸O_Ó>][N¦“èH£:^@¡BÆ| $2O"åœR¾ŸBU’P*•$nÃAp-Né‹& ºpp†rÅò:# (¼6’ÚÛ¡Šwy1Mùdªp¼6.§úÁ×ÃÁl0Œà´Ç-PÚxff•Úž_ãƒú"röõ.ÊQûÐ93T?€<‰æ¡¡lb|152xìOçc¥Ë+aȱf=“mÞÎ¥×åÖ6¨ÂŒÈ~xš$4ÿ>š&ÜlæŠúBcÀ¨Ç8É€.ØZ\·aÃÛpœÈAEXüåõ`FÀ$¬€aÁ "æ…R6¤ºßjž/!K¬S¸å› N^^á‹Çä_ uIƒV1@ÈCL)ØÃÑtNʺ3)Ýo8Ý„b¸Jõ˜ïj¹ ¸ïð†:Zwïe£ qkÌY9Ú¾ëU69,Ù7è¬ïpAH öÏúü5ìžf%MùS·ý%Xk3àvB«ŽšÃ5Ë% Õn¤ë2Ëív®®UYÏ2æ<£œžê£òùÎ#1Z IFzÝÈGÞ|—ÞþR†lgQyÎæWgŽ'}H«>ˆûðÛ^Ô+Üb>• ×[RN¢‘¤â¬šÁ…YÚWÖ,wÐމ߆FƒØÖåà6KÉD ¢,i/¨weçÿ]¦² ›¼@'Þ-0çã]nIî÷;U’7. ©¿ ^!¢aý‰ÿ™ËªJ¬E:h·¿®mô×~Ňà°VÅ·žÉW@/TC¾“S‘¥ð£=‰T‹XÙÝÍšF?<½ ¼K"­{#ç­­Ô<” [—]öÔ3øþM§ŽÚ>·6¥i“»žÅÔ %ûÓéû0.Y+ 0o‘ôdéY?$IP³ôfà.ŤŸÿš9Ìkª "¯ü™S$kñpWÄa&jÑ—ƒó /‚Ň,“Pk?¾üJéwÁùš¯š $'ÙÚA†:4ïÇ(Á#Jh·³]š­.ΚíöÙ2ƒÑ­¡–sš¸ç‚«æã׊Êh~Éo|ëöõ|J0ŒïÊgå3TÙ[€¦Þ¹ÇŒlÄ×ÑäŒ<ÍI–ZÛYV™*D8Bߒɘ$Ô4ê±4:¬”‡]ûRò–ÈYêÓ å©ÄOòÙeÌSŠ‚ýÞO½–ÍZŸHY‹:ü<ÊЄÊfZÁZþrš†RIþ"¶k3… °ÂLªFØ5FР$M§_²ånÓ£ëëp¡¨î„ W–Vê¿ÜÁz˜æ·‰FF7ר;y®0UµTá®y—XeÄ^/ƒÇ×®XääÞ|ç:×yFÒÏÔ(Ö ô¥Ëö ¸Ê,p4,VŒGC&Xx‡Â Ã8qÿY3˜mj²ûXQdsøa½$Ñ­>ceaÄ8nÞÓÊÑ_öÄ·i2^Ƚ§ÜÉÞÁß>¯àáÇ;/>£(±=E¸Ezçs„ü}Œ‰1>øKr(È.Ãþ½ÄïiâqqÜŠ…¦r#M¢Î–q8€öÂyqMGËjG´ ²”ãå±âÂ~öhg»ôÏZ™ÌbÎ}ÜfP§úÁ ;ùOuØäñÀ%E¹ÌÃøÜÍŸ¦sñúÜþ;,Cëš´Žm¬´9†–ÑÌÓÇóò <>ß6|d6îU¶Š=Â_ôÓS÷½QÌ+'ÂæÐALÚ¬¥ÊÊzÖÅÀe0•8b¢G݇TæÏó/—ÇÃÄÏãè¸èà,>œŒï°0Hî×L6€Ì” ­tV~WŽ7z=à“²Áæ²Ëë)õ|•¹[©ñùn=·\VßXuÉ4ÒµXJ=„¨?Íâp”H3¦%䤭$²GÀxp]Œ§ÓYé¼×;OÊI¯—À$ ‹zd>°f±ö˜×,CPIqÀò,Ïֻ̇›R¨ì=—®¢|žä þ,(IÜ+ã—Ëoå‚ÎûLc¬êyX"SS¢®óZaÁGäp™pÈæ&)ÒŽÊÙHb†ÏY؆¼@PÎ$/Èt—ëÜ~âj×Î9Ï? ¨| @‰…Þ“’Ž„¹$®¨Ãy¡èv„Š^ö_\ïáÙ\ †ï{Òa ôNÒãó\ptÅ¢Ú‹MaL‘'bur¤C÷dè·Ã‡Ú¿{žWSt¢_®ƒ›³ÃÀá«ò+óî’£É0!-”z®ÜШa•ÜÄáWéL^ZoMÏx.ÍPì/gêyŸŒ“L"¦ 1 Î ò îd”5­òEœ/¡+Q —¬!’”Ìð×Ï9ð|ï]pÛàÿ¨‹4Bç4â–šü}¦7c—$yâéäÒ¥ÜÑ”÷¸ØÕA}{ðÏšwc¨ äù d‰ÆÞ}[ʸ"àÊLê4òftº%/ ÜeРe`W}‹FŘÓ+?<˜~P³bzcFéW¨b2k±EsMÀèÛœfC-Á&†ãi‚%ÄGÕ²°§…‡’J H7Idª)˜ÝS¯…œ˜°€0µƒ`íüÔåÉB²2ÝÎW?4|h9K·€/»ûK¬* G  yOXX¥Æ©¡zcëòÕÔÙ2!rI9®ÉB›n-®8Òh™­‚áE¤æ¯ÑP!;3€f–ÆùçÂ^? ¾bäq:ˆêD( ÂUƒzÄDúР†å“¦%oÑ ò÷^×*5>»j[{#‡\QU©/ Nž¢€­óáÑøÈVøÀ‡Wé»À·J³E@b½ž“ÌXz‹4$!Ìr…m‹E[¶p+NzŠpLμëõ¬Y(*[¢Ç²…O«ÿS+´h­€1+÷Ž}ÈQY¡æùP„óÈ3J+Ùà„.ê’˜z,ýçš1º4—:5ÅËù; Ú]FÀÅ„}‹ônŠÖºÔÊ¡Š—[=Kµuù5–#“ôqÁTÉó`msåI/)`ø$M2ÿ/ÍP–¤XäUI88&åþ¥M„X‚m]ž£èÚ?4þÅO~Bæbg lá$üðB ¶˜.¨ CØ„Üo翤=aÑEXÔïkˆJ楫•½8â•Zp®ø%ì߬؟ògõ^{ヵh%ÉABþ7)É›ã"(o0ÜFg»óÀâàÊÿ¬ /…%`BÏ Da$» >Ò][TT`LOcY ²n©ÉÕÍ•³lй`zRs¾P6š±Ñåà F°¡$vâ2.ZƒTd-´ h­ÛD\8THVõƒùB²J>\ÖBU,ìn±™–Û ½Š—ÁùbŠf€ÊîNšºÓ"…Vƒ?­ÉAàº$ã>>½ªj³èy4J+ªÓ ËŒ\:‚€df·‰vcKä¯u£F©\’T©iqt÷ˆf‹aI ›äás¼…²¿dSš& Ró<ƒqÒcåðö¹èùå‡&0 û37fÒ,IÍÙíãÓ½Ó½íýýŸƒã»?ìnœoÅÄYôëÚ/ÁZ‹ CS‹hq§!D¡pF´{eR–?Ô› XÕD™ÓÅ׋×ÿÃÉ‹“ÞÂÌR®t[ˆ±™EÿJ³¾Æ6»åùÓäò–áñüP>“k.T¥¨¯Ù;^db ½+x ¦gÉIýþb`!n)FN¼SÞñÀ˜ïG,g~¬ãä÷I”›>yØçéb{$_Qå^iÿ”ÝkÍïþ¹ÊÔøK+}+“¥]]·µ«Å•f²Ê5ìrqx=ˆPð®b{¤•ªidžgBl~ëT;¼L.þ{ýC2¸ãEÅðÕ µ¸ãá^ÃÕç.§ìpÑ ößßë¤cÿoùhYU‹âU;®ý«U}ŠÿõE#þƒ6Zœ'‰¨µG„öçÑ-¤Ä@®,/•a¤»°hrpG#¸Šp/öap\Þ£zë<IÆÒ ÉdÍѤx0™R@4 WŽÈD!®à‚¡~^2åÝ+#Y^豟 õåñ‹ÿ£M½¡ŸS…©Øæ›>1B¡,l ² óš¡´‡ÆT##¢î3* ñ~̌집‰‡².V¦ül§^áÆ”ØÜK/ï~¤ãéSHd{&Nƒ@F8º¼ÌÔ©Ñ#H›ßa<³ §Éœƒ Ì›gæÜÖß+fž8¼Èm1R‰Ó¨«p0 ãÓð£ôjÀã •%–ý:œ)“$0¯ò¥ãa{”ÇÒ¬ñü‰ G¨ñ"/º:¼™{+áÀI ¹]¥3Ûé#ú>L†WæÀ?s‹?4¿†õ4ŽÓR9'‡ªqzA!*Œç %Ú÷c~iwƒ¯'ó;8¾íÅ¿÷w€D* äó2kK*ÇwÞ½‰¡ç¸îs6¯/r >2Î:wàð|æô¡° 'ó~¢nq1?ü2”úätsϵžsÚ9f—. <~+ZÅ´'‚>ñëfÍU.Ãù¾ê…l2æ²Ëf®ò'ìX4é9ͧþÂô9ßû÷§{ž~\ÿOìÚlµu,¢ÿ­NÚÿÓ“ÿ×/ò¤ã -DÒyvήél¥° ¤Êäñ‹ˆÞ_(P×D„^Å"áàºâz¡¢Jss &³••ã"ˆçáÁéñá>áÿ3u˜'œø2¶+œNpWבðˆ$yì² k#7@ÖW@Rï´/š«¾<³Õ:jèÈqrˆò'<9|ý‚ó§Èië¹^`2vQ’”tIßEP„&Þ=å й¤IÌIå\̳ŸT€ìy±ýúÓyxMvÆ7h%P†SZ¾Î’ðf4=œù2Âëh^?FóCãD@veM±—ÙÙíþà<g€@Ÿœ>Giú$°€%>Ãf¡ïydctƒA¦°¡ä°lñ°˜Tÿ$Ðã(R4d4 ±ðaebpû5Ô©ZŒŽ!Têr:—œ|ïÙ“„$ßû<]éýWk¦ý¶ëOþÿ¿ÌÃôŸÒ„è—]ƒËðÜŵŠYù)˜TH€Ï c9|,‚BPgLž9”Û)'wHá½Ú9;ýùèÅÙÉÏ'§/^;4–ðþˆ$ _’ÄJ9ÛÌqZdy­ 2ÜVî dä¥Ã8)E‹‘ÏÊ Ïieà[³ƒ~Gt'é·›…KSdpRì,ï–ÁgÅBUŽ•7õë(¨K8Á\Ú½¥QŸösiÝ옔S®'é7Dì} MRÃözû((}EDˆ)DŽ߶ެ¤ï ú{¦ /‡(Lí£;›Ó«ð§iüžo–0àÄ ó¶ mN³sÚ1\ éõˆñþÑ8…“™ÁDZö~¿£ë›k¨z8%òÓ‹€ÆÑãjòÀ‚–òDdääp÷f½üElïÒsÃí;ŽŒ]Ï"_Bl,„¤›MཀྵV‹&#Þ#ÔñEÂÀ6ˆOþ&8~„xÕ3$õͤÅèb2ÿË ¹"ÏŸ²1z–]ìV=1"¸˜U¹¡õøß›,IåÕ‘Õ-º“>½ó´"š$a<çµhùGOÕœSÍ;ú^|¬=OI-û¶æÙÙt“ÿY³Ü$]O)Ô8W/ý þX†m\Á@ÇfÞéäÿÜ„7¡Èû}4? ç´¼†ut`f¼$Õ›ñG‹‹x7…qAU&‘—kÕý¸—9>þ"r|L'–>öz)œ#ÇO¥e‘Ÿ­ú„Íè!u»ä(x–¬)C/½¬;—ç>•™’è[ÎK¢Óåxã[m˜)†·Äå`Ž[4ÿ6]ˆE š¦ËSš äC*qiý ‡kü_œ/ “Ÿö=žUEÐÏ6ìr¼¼ÓLö ÔšŸöÓîUßõz?í? <ÕÁ`9UIœ«M| } ØêÏQBj› ä§}{Ðï)]Æ‘ó‘?ã¯t¯U ¤oÙ¾žÞÌMÍá꬈)À™Ë<øðÔ‰ »r©Ã =ÀŠäšb[G kjTU ^íÙE¯ ´¦ŽÐŸƒEÑï—æåùºÂì:üH¢TRN)ãµ_MïÖAüëZoíW¨D}™ ½´L£ŽŒõŸÖΑ ³–Nª;5ãéôýÍŒÆ?=J&& /.Âáüð øÔ§O ¥ÏÊb¾ûüç7mÌñþ­¾H³}ÃÄA2-Âá.ÃdO!B õ£wYÚ³¨(â»–xyÚëIž]¯/à°Çš=3–°ß<Ðk2îfXk™"sÀaŸ°$<µ•ßÎ)'¬£uÁŠN°knþ{Ì/­•ç¬Ôå[X*Î: }Ä(~„bƒ¦¼ó^ož”%ZÁIæìt:ƒ6y¨xÈ ‘qâµÆ¿iŒ1ßða ÷á3@l¶9§‡G»({¤p^Z§š˜¼ú”éÿ4#é†@¾câŸ9þ¼Á‚Iæp¨å 9ö£d^™Ì¯JIy’¥¾(_¬µS¡ã{§<6JˆsÎ5š?(M +wÑ‹Um™C[Tz¶ÇÅ/6z9pðËÁoUò? HG¡–“xØOÊ£dÞŸ—¹’þOû>çð?3!)k ¼þÖÁë…u¤ÅcûÑ”1¾¿ âA„~<Ã’£JŒöx Op?eRtgØççâ'äOÄIá÷¾ÂYA2µżg¬Þ_r…øi/M¹í¡#C›wl¶ŸåÔ˜ ?Fy¤Ó‹êhSqÙZjÏF OÏj™ø›ŒD!ÆÞä"ŒÙ ÍÞÉÑþi_ ö×µ ô5;ddæÖ¢¼¤&n„#`Îú$ÜPm,ŽBcªÝGÂuGÚþÏ_ó$«N‚½î‚ñ¡$Š'/na0ßD*к9Å6Èò-+GÙÏíå ‘"QÜÉÁtòzzK²‘ÏÖÌñµâ]±½ù"ÃÙãç¿® /h†ÒËßîÚ"C =Ç•‹¢ø”êvYúÉHët{`{}pá•¢<7ˆìâè8BïbF4‹!Oi¹§¼Y„ûEguIÉðF{§òúÅkAõçn9§ÔÎéñ~bò,±ÛiŸkÄN gE¹D†5tªåJÆ^‘˜OÙ¢ÔXjÕ2v†}û­êˆ:TŠƒÐÕwëS_³ê"Ï:f…)Tìµ*øw׃3îÿΣù5GT\q ô¿jõN#¥ÿU«=Ýÿ}‰'°ô~^ó¡­ï¬䟺hóÓ4u·eœ9'C 3¤Ó™&’ȦYH[öþÃÒZ´„Sÿ ¼|÷] U®§×ð»tü)èl°C úSU䥢@„Ì—rÙd¤OglòªDó'zä9‡sçðèg•c&¢`£šô°{7z/LçP˜ÀF–Ü®º1s¤ÐlˆüQÌÛh$œ>’~ m-‹½)‹®è1ƒÞA¸S ŸÇš\IRPphæ‡h~E~Q«›cw W*¢g•¡4%ãÎ ]²ƒC´Iùß›æN6'!F¿ 7DòHÙÞë£ÃãÓíƒÓžŒ ˆryÇ•Õ a0Æóh6(*…7dؼ·Á÷7s^ΪãfÊŽŠÆF#îZ Jˆ6«&‹ /*|ÒUÀjN¯Bô÷ËìrIÒ®úŽ¥µÒÈ/ð—7?)nY¹®çU` ~òbëÇôÁж´,O+ZïÖR±u\Hli.nÀ²>6éy L罆@í[ÑrŽö›F#ÞÃý ¤¬ÝËø¦}à/v€!4¤3‚¤à B9û&ÿ4âé±z™£tö`æ~³5Sh»:c/½³Ò·'ÂþBÙžÝmi‹“²o»zxœî~GçÒŒ6ù}ÔN’wŠÇé—&ñjÌ®àêçi+ò)ËîY>Z§«Abc*åërʧ&ð1:F²îI^ÏæwÆúÑ.EÐ>÷‚O€„zTýmxn®A¨tØ—ô‘1#›m°Åû8ñX­ ìÒShFxCqóý&¨OíY~b©ÚQ,óŠÐg¿@DIÎQ&E%”e…=(|°Ä=ÒS‹5³ÓÙ·ÁùÍœŒÁ9yoUÁf¦ºŠOtúô”ÜG<ÙwÎ#»ž…ò]pÓÑÕÃ?ùùHa³gpH¹áãHg³pn:€„ožÜŒDô‚ìøVøh,t“”„ñ-N·Z¤(D.£dé¹Ê;¡^õ‘ƒ²¹PäbÒP„ád H³9 Ð^E~4Ái@"QÃr ]òZ³C¼†¦üϬo½øHŽÇØ‹I­£ç10) +–CõqdDe7>ü(<£YñyÍSÔ”eXY 9Ò@„}–»<@¤å ‘Æüˆg¬½O©‡‡R2æ ð4%E3…$,UyÅ[Æ^zYñGÔjd«š?gÍà0ƃ‚¯®Ò›KÏ O±¥{“2²¤å òòfŸ‡"¢Ž€2™ªÅn£Ë dí˲%(I„º$$úEÙu4¹Žoõ'Ñ?”K-,€¢j(Ê5”eK 9=O¦ãpª¬j¼Œõ®Åvj&wB7û|•ˆtM•`Ç( 3ú”b•1«'«!msÖ ÉÌÖÈ"†h­hCœ¦Šà¹äi!;s 3ÑFžùR¡Â–©nÜ´Ìg äqv¶5ù“¡FT7 ±˜C&(,ƒ Ê;ï¸6aî%†MUÈ<¦L¡ü(äMŽ˜±¶ÑŒá5°Vf–GÁ㩺?@'ÞáM}y¬&,eWµîŒ³a¨9pÒòHçgƒ39#Û£ ݾ 5 ¦°D·˜ƒ‹}zn<2’òž6¦(Ø>rüÁ …ÙkÎ{M`Ãs9Ê ) )©±a‚†Aôk ÍL4Y$û3]-“—ãh»ñ¼Ljs(4÷ó;_ǸˆUË'¾‡K—Â}ùô4: ‚Ï,íç—†£ø}’W:Ä—C"b˜C"œ€ZÆ?Þ„ 05Èæ#%àJëôgý|ƒþˆ²•ƒ=2@˜>¾3=uëꥊœÃ†Ë>] hO,½T¡çrHæø IDt¢aÞÖâã--†XÒª Š' ’ÈüÁ›©DH¸ØÄøôV°%9#Žº4'ã3Œ½°‘úµ¡(YØM@ìN‹cjqÂABÍÚi¿c@ ¼¡óN Áå™HßÌÂø%šxE;e£v·\R§5&ŒUÝD¡óx:º Ù‰³w +FÖòXˆ©8ºŠ^ª‰°Y×à±×#ÒÔZ9˜ÎoÜ‚+9刲ÒR0¸@¿aóô|Wwì¶S›×ÄÊúÛK•XЉ¼Ó!… áò8œßIJ‹ ¢‹ A.r,º†ƒ¿Fça8‘òÚ|º&Æ‘¦¤G’aƒpÐåIK†R¶+ å` w"ÿ(føæ]×#Îu&ì‡Äœ¯OØð œ7•o·~ûMz~~ÜIœ§”çF‡d™sHK~*ýc#>B† ¶óÅÍøÑÆ åßS$5Y 5û‹ŒákÂ"ö½¡ÜÂwüTn†ÇŽím‰Š{RLÌÒTú÷·ÇÅ '!‹uæƒ}1‘®LĈV•rpŽ ž´Œ¦1+½WÌóR¡Êš¢"^3*†á¶žÄ¨¦Gìì0࣭5íÙÝ;¶Ø»®­ÇYÔ!‹Ñ|¡©p¥ˆ¤ÂzŽ0‚pŠÂЈJ+©=Î8Ép._@èÅá|~ǦaHè<ÚܳEª‡³C`Æcã›Ê‡º–PKçzœÑ"9X4s¼þvÂŽÿE͘cúcgæëÄìÌ3$;W!`åW!Q½–Ž7axv œIøŠ~ŒÝ"kÞq[ìm“íûÔµÿX¹ñßØÔš­v«ž²ÿh<Ù|‘gu{a“5ƒ[’äé8¢‚ã d{}æ:eïã‹”µŸr¿[yó%qi˜õ_oŸžÚ—væBš‡…u&ÿè|K©BZ.Sµßz{ø«;˜Rt´a9ŠŒ ´ÔhNX3ü®½V~å½ú¡¦ª£w00ƒhè´êveŽ”p›š9sæØ™ Q¿ŸœUe¦£©3fr†»X]8Ãe¬Èàñ{xX]¿²fùLß°"]Û¦Â*ݶ6æiÛ²{7ñdù‹™/·º%þ‡¥ê'éµA<¼‚&¯ÔèGÓç2â9E¼ˆâd~Dž:dºR4ý\³+ͼ(Òµèû,‡‚N\…÷ÙŽ eœ„ ¿…"2 …‰0\KÉö’£óꇚ×û²F”ɪ§uWͦRÔHbõsgé^ÚócN¥{™í̘>wTÍšÊq™Æ…/ê{q ÜŽ4ÝÇR ýâe2FãÉö'2 #ƒ/:ËòìD¿¶D+H—eæyاÞÿ¬É…먽£ÄIÎ`­Q†ŒfN“šJç ̬&=µ «ýÅÊzZ9yñ‚·¿X­°ÃÊXùœv¤š¼œ&Mµ §AD99µtx2uWš•4æú=ý%ú¸°ÇȤ©˜ ä%§æÖÌl/<áU3Ù¤~<ÉaÃéo13¸ô ç!3ñⱜ#[ð)eþÓì˜âòqù‚¾ÅùÖ o|ñdwƒ¾úâÉì2}ñÅ“Õeúâ‹'«Ë$ôåÒAn:¯Ëôå_^‡%è«/žÌ.WÐ7¿xò»Œ@ßøâ³ztÙ¾üâír}=Pv ¯¿xr»¬A_ñÁvØ„¾þâk³Ã2ô­/žéæ|Éh’ÉJðîD‚Ǔ٥¶:ðåt¨îìœ.õ­àæUa Vs.+ðÏ™L®ÃùÕt”è•¶’j´e7ÆÀ>#aR²¾ÞL”³+´…‹æct*nL¬DôÖNéÖi!ÝC«á³10úóKÌѵ“@kÌMÆÆ‘—.ô¡|¥V«™ŽšøŒéjí›é2¶€pN.çW qX£~~°äº]'Bý+ÕÌTì3 ^6p|^oNd¼Õëóoƒ+k2Ä&;NÇcô3æÄn° —T«6‚ÿ†_æÝøÖÞÁÝ  °¦ÁhD§J!*ß•¢ò»r¼áv¾¤QLÏâàOAÍö3¾«È[‰ÀÑá¾Ûëí²_Xfó#VË’p~¦âa•&å\áÛËtÍÊ´¸å£Éââ2]Ç…l÷&éR2m-0ÍtTÀÊž¥^Ì¢ŒâH ™|Ù Æ@ î¤J3Ý|e¸ga•ü¬[!Ó¢‹@Œ£:ÿƒÉ†9Ãnçe ¸[E$¡hšRÓžc› q†ñÞÌyÛëÝ&"³—…&Þê™%©˜·Lfì3LÛn*N[pë'Bñ`¡É2ÍP#”™*‡î"ÏÃø­/»0YcR¯y¨ÇÔaìÀ³ AN\‰ºúNwÕ„«álÖµHt=U[³¸G„ç=KÆ6_XŽê¡Ás+çe™ çÙuýåֻĂÈÔ„aªR Ê*P „$’a›zs“!Yßl–(˜Ö.‡}¶P2Ø ÄÉSrÇâ a‚=óX0µtf÷™½^`5žzzZ DEÌtºW1²yY%CQ « ‹=¦'žUÜcDÒ6DÏÊ8 I*'‘9œ^S¹.5<&hÄT,.rà«›N1<ðX Gu碌efh×âF;“èUZéÒª=r‡4t –Ô]ö?O á?„N‡,½¤÷˽Ê-ÎUÀ··ì#D•TÅ|e¬X[ØOë´È<*¨:Œ4cT2éõDó<1WdFg{c(6ŒÄhb9ôDø¢@©ûzkÔå†1kV¢œÄÍí#5oeЂÀ"y}€Í‰¼9aZ²ŸöD穎ëa·%”ÍšßG@0H<rááM+›úŽáuz=¦§h¾¹¹nY¤È&câ&Ø>1UÏR;ŽkädѦsŸ7œwì-f#ÏxªØ·Ž»=ð0o·g3è_IãoYÄ(m©Ó!k'ž“bá IjcVwh—B?.êQ#gµŸŸÚÉæ ”ÃE¼#¦ÐÍza|ãâšÒd½<)ß"ÍÇM3PN1tcòÕ aŽ(Iì%­8B8N0ÖßYù=‡&%‚ñýFúäˆì“*&Äå<&¼mùˆo¬!et¸$ÌÜlh~& m'üh£Gw¥á N”‡'Šñò11¥\¤w;ßEpÙí -¥èOxUdEéÂ&VS{SŒ-ï9ÏØ.Î,læŽÚÆÓ@ùÇ{m|KŸO&@rrƒ8ϽõäðÆÀ5 gB,×E~ËŠCC­ªZaÊDäE òÓÄrÁŽ=e-a£Vº ;ÓW}º.0s°èÈÂ_Ì'¡Ò¢¹‡f ¥eé³Ë†J€ ùðßW¶Ô3Ðv“¼2fre;¦·Î¾4€(”ƒª‘ ‰¯-@¡€sRž¬oxîÕm O·_‘Ý [@¹ÔM)]ÒˆˆBNºøª?>Úùì:7RÑÒgÓÎb ò,ÅyJ.¾¶IÄX韑ë!eY¥ö&² ÿÂpÄHznøA࢈´4)‰ßÿD¹©·µÂ)¥[$]0y¸J©«i)…JÝtõ*W'óK}ÍmY‰VàèL_à7£¢Œ2ÒR€¶ªúN¬­B4%î•AÈNåÕ‘¥ˆ´%³1ÐL—Âòã×á¼(&¡ì™RËÒ;À«ŸÒ›0XsìR”9ŠlïÚšµ…= †d»´œä?Ýq<)•´KážWÕõÖ~eƒºW;z©¼x#¸‚Ãy²Lg­÷_k–dÜ¢‹ºù%á/½±=oæH‘Ï1²àýÔX)[ÀŒÑ¢êG½/ßnðä©ûÞ¹.#8G,øã7w/ìÅ詪½[Im a]&ËgÜTÕ­·B¶:" ÿºVa¾€d*ј“UÊÀEAÏФÙ*®<WõÖXÓ²w8fjkY}"k‚áé#¯÷$¿xýâu0 Éð‡Óã} ×ùˆÝ£@ረuÂ#þ+Ãuºp‚Á$"wú€0­Ö`¼¢Ô—Gf?ÍlÌ3 aÙŽß°ŒCìœ"ºþN¢üTÆ{qï॑—}fvô­´}° ô3b6؉·âäðÜ‹–žËRûÛß¿ØhÑï£t«‚ó{xŒ=ñ©ÔNç¢ÓÆÌP×Yuá„Ѐ~¹Óy"xÜGc>…BϹ¦$Jô‘â(©ÂiŽu4有ïýà+í¹Å=aðî›'²u^H73B4k&Æá%YO°ƒñ ò™yɵ`¸·Rè¤Ä„Þ`2™²3"½‘ '€ê·¶+ó$çxsxÎXï<•|x¡ÝmЇ’{ÎÉ~;,(ý$•2ûè%0 Waƒ,úɹ¸#õ…8qÔšHi+1O…’YÕF[MBÍ›Òm9Þ0VÇí¯kýµ_¯Ò9/Jgå·¿”QõA.¹µ5{ï!Sµ ö©Lÿƒ—Øk¿^”þ&’Ò…&å··:°û¢Y¾Œ¬M÷zÔ‘ñ×µ2V€Ú2Uéû¨Zã\ƒ©ú@'µjdêV_d¯—Þžÿ‚Í•M]{»ö«X…¿®ý²ö«ÈgFýªðy¯wžp'6ò St)(bvJ¤~­­Y-%Œ«V¼{ O>± ¬u+­#¹³Z<1ö›_çHiâfä—mT~-줔ƒÛó»ëiåè/{ŸHyP"Ì4±%†·t5¢>ÁºA6ƒƒÍ0°É¾a-ñ{´3Ý;øÛ'š³þyy݆‡7órV…kèðÀšc]“Ð6 üuþp¼óªmo’YR6‡( ž‡"Ë••9?;,ŽÝÄ1PÙ¡zBÔÊõ·«)3ÏTʇnë’}ÛšPP…:+Ç$+ t|õ(iX¦Êþ7B¥ø8Y'”8¼à…>úO­6êõp ±€eIȈswF¶ŽAq]€\Ï<Úˆ®T^&{²‘Œï<0®†uÀ{fmÿ³–¡ß]…Ôn›ƒ¸gžÁÉ%O €Fä³Üj4û“ù•¨æÖ{ò Iž¿ oAÐåëT|ðîÉ_znù:™_gÍ•*€p…›h¼¥ëÃtKׇÿr]¤Ü„ÓÉ®„Á?`H¿md4XFýËì7ÞéIƒ¹2ù@1@{_¯ýJ¬„$…Ô-¢ „ò£˜ ö+8™„õÏWÒ["5éC>t ^X„Ô€_Ö s}‰WÉ7< ¾ `¥˜„GâÐW3Îr}œ¾’‘s©Ø¹ôÚ> .1Y9lBµ%¿Ò÷5$vàJ ™_ØÉ Jõ ??TÁ pËF“$ŒçYeYνeäy”è•âr Fû@R©ë|™ÔÍ,£«4'ºšÝE§Œ”cÅòè.AéR ‡—dÎlùjĩӨQša›ã´Žl¼N|ŒÌ`’€Æõ«9Kµ#°®ä‰±6Ä<™2Eɘq«äw17Ê¡çŠ-Xc’ùÇZ”uÆÊp µ‡¢<;™=gÀçSvõáõÒ¨•eiÏuŒ$%e- >]Y`.êã‹•K¯I‹GÖY5‹L"°È`‘«6½¦þ†, ‹S5YKÌ]`Îø’N¡nHzKÈ!„儺ÔËG5÷´X¥„· ÷–ýè7_©x=sãpÅN7Ÿ¹9íØT‡Š÷(ñœ¤´òhjUb=‡Gö1¡6¹)kዽ˳Pðgáߥ¯yÿ²=:X  ±´Cá?ö Úq`MgG-ÇØ\2+[zâsIq®µ|Lcwí«%êP®wú–>ŽE HO>}SÑÇ’×Jíš¾¥hcfQ*L}K›ÉÌ¢üõ Å%K°+½õ -%KŠãò #*‘/Z`³`›uE+XÿæH™„#áåÐoIÛIg)Iq^Z¢Qz.TÅt¼Õ22ŠœD_Üv~]CýÄo=¶ñ²œV@Ù£ µÙø8-•°äQYæÜ®‹$¢•¦Ú&/ pØá}ßKÝ.`6cùó©ëÌGâ,>-ÿSÓ‘S_S¨0f9%;‰ùàÝÎ¥æô­ž9\#<µb3ªétDS%‹d ÔaøxèJ}}´+%3ê+9F·QQýÎV׎±±e Íæ^®ýe†É˜5à¶N«mI”.°mTæ±ãîÊxµÜÙæUõäàÚ‰j_ž™µíŠp1£lZ)*tp‘PÅ‘n>(ÓŸ€´^44 ŠFǦ¿ù“#X¥¬´¦g3e¡%­°‡ÓëÙÍ<´\‘¥NVÛ]ö)¨=ÓõM5U縕ZÀ}G%Ø?ÿE÷c‹Iâl4¡ŒÊd}f¬ k]xŽ@í¥F¤¿ö‰r¯3 Ki§cvÒº,áæ·ì¤ßŽ™ô);ñÉp$ÄöŒ¦ Eÿº†Ö_¿#Ìük®€00ïÉ¡ôæwvA©yÒßB ®Þ6|'ƒõ¤=¼+¥wåˆ ¾Ëëw>G-òI ôŸ2üù8brÃãŽ&²(^ZˆMTML`Ѥº§½’à’µ„…ÕÎ q_Cp«¦ú&!Wí¤P«)ž |<’åìÆ‚¿jþ@à(p­Ø¨Ö MìzU˜Ì´ÓÉ‚]Âe8HÛâ.³e£6ÛÕ¬Á(xÉóÀ¡Ð<¶'Ú $i;âÍB¶cßl\:ü$£›¦g­YŒòüÒ†öÌ­ÖÁBK0ç„_¨¸"£ö Tc*y9±Ù-¤á8ÓjIEd³îh‚Y é<0ȇÁº b1ñáuáRîûŽB« ©ªÑƒJªá~¿wÚ; d).81¯Ú+¦ýÜ›9KR©#sRK_ιٰà“ãdÀ¹õÞƒãÔþ´·¿(·²´$Þmd»¯'­õd/5hîd„¨÷7ŠPlã”­`ª[†wu »¾ÿ6x×ëy&@?4 ?í{3ˆËfªÄ¹gïÒ‡ì;ïU¸"jÖþg®ö"#ýïþgŸ2‰Š4Wý®lÎ>7ÃOF¨Ju}yô‹g9—`1ÃÎZ[+{CÚʺ²ö—äÛv:;oˆ‚˜3RŒÖÝ–h?‹{.fp±BZ®# JÏŠëäùF¹V´ ¥ú/Ô#Ó¡â^É)éó¨hxPÜÓÞfZ%èRRµp²¼&ʜ랜ëé¬%§ƒºEô3˽ [\âà|ôf-\âi…ö¢,ì€ÐãÝq]Tí¬s:l ‹‹ãÔYN^?‘i× Wn6MPçf3¤V/ˆ³¸ bÜ¡¡.JZŽyïf)E„éì#@‡g‚bJcʨlRKÆ ÊbeqmÚ0;bDâÁ#²¤W@¡xHv3Mò•–ÒÑO°‚·ó_LZ#að¾œìÓÆÆÐž*¡Ë}›Žû(QĺƒJ¤;jNš`>rmieïÙsÏ¥™ãžgiÙ6— ì¾Ìl•uçzÖ™]Æï“Lœ|äZa:Ïé®:þ ^bÅÛ †N‚Ôz…üî’ªcÀÕ$0:©¥ZJ‘‡¸ÐDEæÙɳ?JýÞ}Ãbe©§¶”Ðh9’c’Cu7 ¨ë=JšC–‚ÌÅ­Tp0‡=4²ÝÌÆÑp€'+dš~GèPÛ²m ŽÙ$ÓâI—˜'Gó\[™9ßZQ›’ƒ´¤Ṳ̈ù1è/‘$ì ˆÅ™ JФ(Y§Ý„=æZ$Hûk—Ml¯0éõ&Iv¬™ÂÀÒk¸™Ëð”Mð3›…\FNùôf.…@™~!ƒ ÿþÊ玸¸_áÂ^… ûÎò(œÊèDäY‹Yùj–CDg½ck:'Æ2àÒÄè±*k‚®l‡$.z‰¾#à ·<ù–¢ àT¹ ãJyç71ðœ1¾½¸LÑÈ2kèXLºÇ'è$)Y›O×lT‡·õ:¶¯Qžnï…/([ö‚@ÊÀ8qø¿7QÌð͈Àˆ/©C0…äë{¡4¯àýª®3ŒÐA /í³…‚Ÿr„kf¾Á‘'­»,Kz| ¯tŸê­»ƒœ[zMÞ.ydáÓëóíÌ$;œÕ´øIÕ‡¨g>¹°Œ€B z7âšñßh& ‚c…VÃ6 VT‹,®àAµäeK$D¬†Irq3~4º=;²Á)m!ê YÓ{Ýþx/t“–J‰g›r%)7 ÞØ–&=Ǿãʆë†<ÙöñMP™ûá’«:ÚV`ÛYk],í%9É<;e›íÈt•λ0Ä”ãJýçSéí †³’ëk¶üyÎ~(5³).Õ¿ ¦ïw~T §0np&Ÿ„Q?ooÁ*YñÉ °¦ùW@æMÖç4ÆÙhúž„ËÓrCÜ/eœœAÑÄE¿’Z:ù¼š ‘ß½H-³ và· ½h³Ånì·LÚŸ¬ðoÁm’æM÷Lª‰öætíúv!U™î"äå;ûž0“¾L÷Ú¸1Dxª|Ò|ÔçPÙÄKêQuó¹·h̤`àÌtC%-o¢ýÁ×ì€&0L:;Db ìE’“7u«¬­ùBO++µó¨86kƒ“*`Û({<ŒÈgô§y_ RòÞ‡ËHáx>6pªR²ÏkîÍ®OO^ªÉç@@ÛV®èñé>÷=WPÑ%ëV. ÀyUC—ðÂóöYK7 ÓˆÒ™K‡èâ$'T§@4*ã«ìIõ„™ƒž¼% þK6Ý‚=ŠðiÑB䨟s´,Rª]Ó¬‘FégÀŽˆÀ/“q£³ÌU¡€ ¶‹<(D3¡Ô'E_ù²gb­æñŠ6§HîA‚3¿ÛMù¨PI!9 '¼àfÁ%!2õt~À†õ›6)‹šó4€2|Ô)—ƒ«¾ÃYÀ®s¯C$瘀ÎÔœ%l)äˆ{ô¬ìåG8.y'b8±kW‹äŸ:¾ O9È0ƒýO—)  hƒ ŠÈ0š¡TÁð%äHú³\h% ¡»Ë3(Ùc}@j“!Þ™ñSY<2?$aÊí­U—…CöãÙq›]1U^Ä-·×tê["yŒ\q>:ËòŽÔhÁ€ß+ë΄Á šk$nÒ\ô–Êx*ÌÞÇÓüµ²›Bd½Bþ›} W©dÁíÙ†©U µ@­ý™cá–öñ8ƨt}ÄE¨u&)R¹¯"Ê-Fz¸°$%©’°V|•l *M óf$„(~ýñ4PŸO§Üè;Áã"}‰f^5fY ʱÌ,š;›YÈ-äÁ¡ù ÀET;Šnƒz^^Kõ|Žd&ƒO¹¾LÊãð('!ûÈœâË® I´<"Þ„x0^¡„’®I¦1sYò …njX|ÂQëd~ØEá8b=¨„¡&q8^‘®Ëp: íF% çßS++9qˆ?-Ú2Tûú<U½#æ#÷σtðbvxw®sÐQ´n;µìœA[Ëìk3+4Y‹Ë+²ƒ6B%kg+êãƒg>L^c-øç“Á蘞Ãyð¨Küõà= ªÐÐ…á¹ïé…XõÄ+¸À #ÔþÐddôXKs2=¦ ü®Îó¸ìLæš4Û »™Ô:êËœþÎŽø¥í‚5Z?æð]ëhÍ€˜zÌ'ýa‰H( u*xrîeÏ1ôG¤ºò-|3‰á¶)$q˜Ê"Œ¯´Þ1ç#áÉèÑ!;žPï•®¨èçc-Þë!Ò«7.Gw"Õ¹IñÑö×~4ºW5;[L×w¦Rúï/1 Ä]~%£aêåÍ Ùzà;~‘‰Z}S ’‘¤’]VÆi*Áš®á[(ì¸Ã2 Í™çtŒ+;xã[y%yæ4‹¤jÑä½4v’´ ¯Ì”…î’¼,3¤)ò¡`GO;\@4IJ“ŒSÙ9”'Zp-%Ú“=·*BfzÞ="ŒI–Ã^`¯ÓY 8ÈC㛑I\†P6c_FJ‡Ñ³Ó,êuN„™ˆoôÁƒ8ŒfúÌx ÎÂqz~‡áåó WtdÚwö—sud д¯'àtX–›ódG³¹pñ'ëÜ®\OGÑÅ]@ε_‡@ðžLãy%¸184*ÿ'î>ý[–ƒÚË4a}ü§Œ¥úðßojc? ž}… ÁÑ–ÞQøAÅ#]U-¹ÞøíãO§QQ& ú$b¨òm"*ü&hZw2¿C²ß"8úLå%{äyÄi°òÄżòX(—Ï×}Ûž®a ³ ÖßgóbRÕ˜sAFh]¡|¢oçépóð#†ycÏØL{$G =uâ-ù€µ/îDÇ,&áí>‡4¢è3Wá`Ƨ÷|=ø•jØøÅÙ•Xj¿r ´òþànzc˜|ªè}&×e1ViŽl`¦¿ÿ&—€é—.µôr[¤à–ë&…"¼PÓI©ÀÔCW‹%Ba&É“c»aåÅnPä†Û μs¸x¬Å@Þ–Í¢$ ä²™#š3 YãéÎßdgÏWét’`è XGD÷#b¡®‹…5^îÝZ+¼z4üqK”uõXèÆtEöP»Ók¹úhs¶úkP™©”â 0cz]Ñà—EÿGô‚¸Á>ÅlåûxÛ«À49dg6&²(dxmÐJÁ?kU~Ì,÷ZwÈ¡PñÇ¢¦qN¾g$·jrRµno-óA,`FÄ&ZÖÎ#&ï˜!ѸÁK•F8ïÖµS›Œ% ëB;ùˆ)_‰8ãF Ð`T j˜Ü’Ñ ½ñëXfä’»@[ \…õ“Ç{Ã.h%mÉ;C‚À½Ì~‡Øs£HMÇ%C‡BàÉT: 0Pð‚ö+t,V/SÊ‚OmµàÒQãÜm!Ú’”æÑ|–Ó>æùD¡TŠ{‰:‘±ŒÅ³¶¶!yMêP1K€{,šØ%)š#|[[ âćÈ.ît!Ö‰)ö`꣮ïS¤6œî¡ž¼i÷¥s “ 0s][¹¸rw‚pUâ¿Î\F%¹ïÂ=f¿Ç:ï3TpÕ,®q‰5ÕóÙèšð‘ïÉéWüs±¿ÓîsÌF9¾Ñ? ‹›ÃkOf.6 ‡7ó‡Î€àiÀZ‹MYÓ½_PÁ®‰ +é–õÌ:‹¡’Ä•ÔXýŽ!]EØLtÜX©ðœ2£á„N3½O3¡`@QH4$š¼7–™ƙʎü•%¼YÉì‹sH—,Jߣ±ar\žA{Ø)Ö…/XjCj ð–™R*VŽä]¬ðk\±“¬ƒV­oªñ^h¤xxy'‡*ÝHqÖl»Ö< •g8S8Þ΃ú޾¡‚‘ÂAñSB‚ ãîS6G[Ï{\šöEcã_ÄŸ?4îÍíš°ÀàÐ9Txpܪ$©œ[UIÖ…¹ee>;}VTqª ·ÀšÍCŽ#’ž»åá’6G?9ãë TçQ˜]Bí;%2u.PBÊ¢d  ‡Ó8¾™Í} ܺøßåy½¼w²ó ´ãhúæh0\Œ§*It¹²:PÌ×n6áo½Y«5ðo£Ù©þAHkíZëð½Q‡ÿ5kõ?Tk­F­ö‡ º²ä<7É|ÁÞÅQx5ÎΗÌoFádþ%šô%ŸÒógR \Ë\bt¼h\OG7c² faŒ~ÍÐ@¼/ñ˜D±P,>˜ Æw º^˜(Wh´ª•ã¶„Ýä`Ø`²Ta2„MdojR ½S>§ÄÍÍ`{‚¥k ήEªDYˆ'šgjK˜¢%­CöýnÛ½ñ\Ý2Á -Y¯™õý#Œ§Çˆ×²S¡Ÿá¥ðm*¤Æ,ª×¶ÿ¬Ùú›sŽ´,<ጌPwß<£ïe.|À¾€Ì ?°¯µ§,+¿\Fà³k”EYXi ÈŒô’œW:ªt›ã ÿ¶ži‰<¸ \ÓÖ$À#á°â¢ ¡pi™žEé¯ÊMdz·œé–^½Å@HÔT]Ÿ(:îKßìRÿñ8Æ1¼æëö ØØ²t•.ê*¼Y8ãúvþ‹Œ`â[¦c]¹…æÞÀu‰¼eØiw¿~kÊè‘7jö@³h@mU7»Qü‡c™cg ý>÷rÊÐu&n,!€ŸkÖèu‚Æço1BºXu˜0uáÓ@¸†MGkHõá¶,¯2ö1PÖ?kÜq8 ×:€[Þ¼yã’ÿFc°%éâiº9"âF×^'zõéQ)ƒ‹‹p8Géëcè“LT¿¬á&šž)¿7kã9êõFIªÎ¢kÔ6R¶—ßhà H&‡-U[Á% Ó9ʲǪ̂u¦ü \î2f`ÖRæO©™³Ç L0ªlÊBwƒŠYXäÔ›À?_"›å‡!Eñÿ_èüÿáŒcÄ£Ñ_tÃ-}ÁcÌ ¾üð临óR°â;‡'§Û§g/÷w÷^IýðètïõÞß·O÷4w¤™ó—•ŽªÓÌ¡ ³•´HVj¯0O¿BÖ}w›Ô¬ï&ž´¿P!­‚°ëün“+M „xy9–_N œ?5}ïOÄ(zžëk9¾¦jŽo&:üb>ðö@“8'FÖ‘š"ŸjûH뾋‡uÓa°" ¦pf+©Eí8(¢(1ØvB¶2½®‘ÆÚ«X¤ž|9ƾÿzðñÇAœ²ØÊžmaF^v‹,TØùK,ìü -%ìì–Õ„Y‚͘„cOÖüXþgmÓÉd é©îå8$¦RÀ bæ\é "Õ$–²ºÛ²žhr²Ãb¼]m~ª%)lîìü !°ðã0œQ†ƒéüƒsXfKzFaWr×—j²Ìm[Ö†ƒxˆà/•ñtúþfÆåí†#5GYÄ«'Ë-œS¼Ï÷*;` wÂñ˜Þø5ƒÑ¨–ÉaúHpDQl&U78Õ Pͱ?\…èýP\e|d)r^â (?îvdjŒmƒéÒkzéc™çÞác>’àJêpBp•ŒS– 76$(«¥ÓÙëÇÑnÒrì†ëˆï*‡GŸÎËQ9,'åYe&å¹@z”Ô‡Ä>$÷!C²ôgåyÿíüCZqoD5­ó2F^,³“j/m•꘯÷!?Õ€eú\rÞŸ{ë1™ùmí™§‹0Ø©Š-sdÎÈðþ£Wž…xÖÔY4r° >¤ËJ;7^KE´u{üåBžh=[]fPÄ ÐM ‡Îô vw5rhlèuÊY&¿° ­Ä<.ÃÒ¤¬;?É,Õ0¼Á|Ÿz½³²«¾'­“G^D¼$…I‰ð\‚ üx°Ø_¨öj+_QÔb~KãÂ{³DÔë¡«,åÇœóùsÛîº wÂîÝÏsÅd4 ÛijÜëaÛ² B m[äÒØ/e)Ú„³Q(œ &Þ8ÇÁX,ý°š?sÚW¹Å¥‘GN®ŒSÌç® ç†§[¢Es,1†PMm$+“·aX¯QbŒ·¡ï`”cè½q’äÞïÅ÷^eBaM,L2ð9ו]ŽÌ‰~ —Ù”b•ìVÔŒVT¿l+Nÿ5ãô_`4N~øÞŒÏ‹Ï¬±¶ñYÝ^¶§_¾“§_ —yv†tè^¡ß¨D6Ù$VDeð9‘ÈX¸³ãsü#¢"q”§PC„÷‘°_ÑžU¹\áŒ9©ëã`žg#ûQ–ú¨7~öFÝ\Ï 3ÂJ Ž»Œ9*¹æRè6x>eG‚HËu¥oxÒ´}Ën$Ýèc3¬ÖJ kq⩜¡û¤ãô†£9äò²Æ#ŽëAü>˜fð ÁW—çY&'‡qmïÇ5ÅÄq7—‡äw”ÈX@0‰ÒxbÅ eÞÌìˆÞ­Ñˆ{ÊyvP†‹ç6Ýæxhæo˜*¡¥Jó;Jñ˜t›šb6Ö‘3‘eI(ˆ±*cÂ8Ù›ˆÃK¨øt>IRä2ji”¢Ûr<¤±²ÒX[ñÕ*D¬Ôä(mXì3*gÌ]9aSž»úel7…JvÆ'Ý1T`ârW’HU8Æ·bâË"¸´dêl(oŸrÓø‘8nUæÏ¨øb"7Ož—eN/(ý/d3‡ñë›q)'N©9īЄgvÒ°q@¥²Î+*…ËÂ×H©”ÊN¡æÃÕëbR“»@U&“t¶hBVj]8÷AÙù¹€^ÿ°²*@?¬ Ðjº–KŒ’Ò®•E ´%†Ák1¦“ë'…èÅéá®<Ž"e®º|´oµcco☢+~–ƒÙ“ŽãÇDs‡ÚzΕ‡#ÖƳAì„l¶‘¥—ûezs”ñ0ð’Ìšî¸ysBqÉûóò|ÚŸ¯ÿ–"|„…ƒ4£Û´ÚQîðí±0{Hm§ÎQúé  Ç*ÈtÙ%Ämq˜ÜŒç¹j Q†F‡Ã¾¥|¿¸CÉB|[tpsèÓ—“qsI/ÅùþP‹R7ÒåsùÌŒw7¼`!¨ c‡ò‹E·gB”™:'#ôÙ¼ô¢áªÊ ¤·8ó€|æ%k3SßÓœŸ{]® öÝÈuåÀËAŸ/Ÿ×-/Ÿ«d?B‡¼JPÓ.ƒÐ&5<רff@-‡üx?%~‰¿¨MãžûíÛRf¬I¼ˆf)¦×@g6„-ð–WGèìc±°9Pòf>Bòƒ›ó#åÂFÔÖÏ'àLÆwz˜‚ã”FÒùˆž|‰*¼Lž[iR5;ìxLü*»0Õà¿z¦^­aEÖUãØ€½%ÍjÆõ¢¿{€ERˆ>fšœfI›MȸCPÖpr®²W—Úgrô}Œ²ØalÞ»™ºod¼õ¸#SÈÈÔôÈdUVxdêYsY` Ÿ×ü,jKBªÉì¨gw>EQR!.QñFd”FÚ©ª‰ ‹Ÿ‡T Y”Nãëp$ÍNfá0B;tZàÁëÁe4,ͯ7¨C@¤Oß‹öY·TI8ù aˆ¡»;Üw² œ²¼r'RÔWÑVH€j½E×ç5{p~¿zq |֤Ǟß[AOÌÀYʸ¾Ça¸½Ê´søúHà¬äj@×ßx 9ûF1ON¶¥Àª(QëAïIuKD3@bâ%»Ê´ñ˜Å‚´ Áõx oI^s‰3µ§`ÓÇóW´Ù bëöØè|ü-<ºÇ•Sàƒ®> &V“E/È›_eýVÆ,y+ÀêNª*üF&+s9’{Ñ !"·ªIï,©œ^²¯$L 22Z(„Nvû>E£žøy†!¹ã=·Ù¿IBOfÿžOæùÿÅüÿÔšZÚÿOûÉÿÛyžÎÿßÿü7øê=qZ¤™dÁ~Œ¬Ý>âÓ$D®q¤‰úôõ ãÉ*xZAÃc¥yr$yÏ“#;åˆJaC!NìäL‹ÌcQˈ³%Áê-ÉéZ+ŠíÏ$…Naƒc-( µ7&°z™Q7U£°%š ÂÄOäñ„¢Ùcz]¢»½ðâð¢ôQé¾OæWäʦüѲ4cŸ<üünpþàœùë‡úîinÍ*¨9-®Zh;¾‡SÉÿ9/W Ë4¾3uëKBs®Õ‘ §Ö ‘Öe¥5ø‰á}*ÕgµgtÄ—%Thù8#ø<(©•ja­žÉÌ8µÜ{’ͺ΃ï¾\¨ùÅ$G|CðØx›€ŠLVQñ¡@QR0°ÊÊ/ ïîýè–_ þ??ž:¥Õ§Å_¼vJË/ÅzýCª×?ïõ©^- ü!Õ종I©Ï]#§ÅÉij•-Lzî€- Ãsš°¢…qMœ¦—IÑâ0º§©ñ.Z¬³±ä—…²TX|)PöU˾)^øàð” ‹¢ò7õ¯ãmgið -g”ÜwKî,¹ï–Ü/XrçÇÓ½úæ ?ÎËó»uÕÕtJN§÷·ÆÕ’ü&‘yñI§Oü-xUGŒðêF* p&¡’¦œÉ@M2Ë$±LF‚3*úJIh Ä«Th1:¢Œ4¼Fl=yzðôzÁWüÛÌ:LÖç?$¬G"x“´¢È¥êbÒÙ¡ÁNà¨?~±ýÚüö X¡Ëh²3†–ôód%Ž©- ˜ÌääÂÎȧO?³$¼Ae"‘#…ƒ ÷çá8¯¶É<¾™²s §×äà:¿ÆÁd2åÈõ¹ýûÍ)Tƒ ËÌô›åÉAù' žÞà‰˜sܳ¥sjMSv½@Ó²<‡üÇÇfÔ,Y^1‡ú¤pñrK˜j%½^ßþb)ƒÑ"àÖ÷8¼-}å„,Ì—|£§÷¦ØšYI¡ ?WçìP)¡ôoÐÔþĽÜׯî¥f28œéËTõÓá€FÓhþIK> <OUbX§.“ó6ú…¬i”ö«¬® ìhãÛ´Ë»{CcPŽ(¶ÆR‰îЉ…Ó( @x—áüPiä™­<ÂkhØ2%æ 0HòAˆ÷¯7áÁÍõy'd -T›ÄëkT„=‹&“p0ôl˜ŸÒYwà 7+2'.JŽ$r%)½ì™ Q}U¸Ù3ômµYÔâÅu…u50FvõŽ–î½¥D~3YÑÙì‘P˳òÚÇ‹JÚ¥C*·&Ì’®‰ûëÖD_µ?ÐßÃxj ÎðœäŽ9¿qˆ*è&‰'PÁ1}I×I2·¯PÎÚ‚ƒº}Øsåi«rýž}ï4êeUÐZŒìqG&¹Å…?Þ,9²Š‰}¦‹™cåè¸HØŸMYFÒ‘]T65!Û€B–s*™ç,n² Q·ŒJ“?]§2ÂàÎôD½3#e쮾´›iá`ÚÓ[?\V·YR&6^‘‹Ã‚ ìii ÞŠš×Sr&Öà0f 5UÖóÂ?)1ÛD öŠ>?]Ϧ4;®b'‡åsvRH>©uv·=²o,˜ã rÍÄ´Ê'°’¾§û€ñoŒèÅÄä;OéÙx¬­Oþ±óØñA¢}†¦žHÙN/«…Â=7úÕËÉ9P>ºuÙ0·.Z»p†÷é¨Å‘êÓ¿43}ø¯(ÔÙ}¢ÍÙ[Ty¦æyëã?i )|hIȵð§Õù§Z½›jé Š.Ì›h2쨒ôl¬ŠŠ"¤Õ»¡È‚Ϻ€uîÿÐÇT4Be• @ ôªVêþ¯ÙzÒÿù"ßÿýeúÍî€ÎÆÃa‚|ÕJ¤%s²»›Þ$€Õ/!a¬ÍäŸÌy(áõ=Ü’¡›ŽŽ_ìîílŸ¾ð…l:Uú+ta Rõ ?Îpx¹½ò­AÀ?{/‘ ?­`h#øóý ‰Rµ„ŸT‚ÿ(¥PåU5(ÃæwX9’2Ï6i­ÓÓ3`V&òÆA¡|Ó¹“Of9¢d7JÞM¤OC"Å ™ïz6ŽØ¦?Ÿ?dïÿÕ),Òÿ†Ôôþo<íÿ/ñüþû߸ý>’u–ôN—÷ßbð(ŽŸ¢ÄqÕhd/ Ðæ)‚0_´€ùòÑ3^‹Ñåû<´ðôü‡<þ^\Öá X©ê7=‹è¿v½™²ÿyÂÿ_æIë‘6bUò©•­HÑk@>}çñtÌq¹X›‹A„ž$TÑzÎà@9 ƒá\&B<5‚„Õ´¢„dn´Î#yâ¨s‰›Ï ºóòUU¤‚¼P mpôJ>IŽD¤Ì™ŠÐ˜ c^)Šíü&ä'ØS=H«Àß2:D—?¤º/|úM¾“Ò—ÆÆ¾ýÿeíÿ:õj½–ÚÿíæÓþÿOéùæJžO,BŠ¢ÓëɤxzKt“~­)U  è;ß)’ÄjÀ>h€ö:‰ÃpØ ¡qãÊzìþu“Û 5£ õ͜ڄ]{qQÀá &Çd2ÂXÖ(a‹Ò EgCÿŒÎù]0 ¯É§Âœü¢9ã<‚v_þú'%NeGó„®‚âýãhp Z$ÛˆØLV}$ \j)úÞU¡>e˜Oji F·ÐÎÁ¥ê ùñ…6Ýc3J'ÁÿÙGÂŒí è÷4aÀ)$7çdoÉñ“køÆz¨ “sü)¸WåË8ùÑ„‰I4¿<ÈõÍð*cû?Lã÷Ñ&‹' êÐúŸ`4p7GwPÕ…”áe„—⢨Ó;ŒïÄö~ C@‚Æ¡‹Æb]L¢9Æq± }ˆÆc K=¾Ä.Ð-'J.ù 1ëw¸šÃqÄa/вdJ†%7“ š×â;–yÂä|Vaìä žGÛ1¬EX²Ó˜LYa"¡Ùä3]E™.Î»Š…¥ ÆSHFMf¾ŸÅ1d û —-]ÕÃñø}„‚ê¬ÂoPC|HF·ÉFA¶o5HÇàÅùNw£»"f’LHµR÷NÈXùÅñéÞ‹!c5ø=ºÖ%àfA¶Ô¢)2l™}:ÙH2ˆë¤¬4Œ¡d¶9šÑ¤3;lýí<n¿†ö§d*[ïªJ'ØíÉ>§ÀJ Gû" ¶Ñ¿ª‚»µ“^1ÌŒ˜:ÙjÚ¶ž¶ÝL¨ˆ0Ø€á“p´ûW‚^‚!Ô¶Ø‹5ºÅ„šÚÜ«;ƒ€ì쯯aC]Œ—B i5àµ5:ó"3rõÈÞîð¹Z¹ ç/¡þ`>@öMÄkÀû0œQôb0û&â3 ¯á(ýb’äÑS.ξyÃù7gP`Mwf’ " ïØ¹è¢Î¨ì›C̯Âó›KÚ…:EÙUaørÇR°p‚yUa¼u5æ¤Ç>¼ðR‡Žñ‹:AS>dÉC á€À0Ó#]±ÔÐfÀãŒTŒó¹Éqý4<ê£Ò °ghô'©Ôýå뽃½×Ûû¨;ÿâõ`Î^ìÂ/ñbå¾vÎtþ3#X£™,S1Ši†Úï•ÀY{wF,“,5£ö (<,êÃ(œñ(xæO¢ ¨W…ˆôHKýqÈŸZx™Ò)¬1²ÂÁÚUcÄúª0ê¯öÙ1‡Ûïâ´Õ®0¡NDKR›oxq)´#±) ™*[,©‡¢"Ý™*D(£²ãÛqŒð€ÃžË˜iÁ?kV¦hr6Ï®¹™Þ¾88=þùªÛ„÷éú„Ü@([WešÙ×àBØÃ¯4Œ§šªš¦µÚW¢O/JVÖÓـ鬹Ú@蜞+)e9%Ç,x%ƒÞ§uCîUžRé]ùLD Î +Q‚ÉãM)‚´s„àÛ…/e”žU,OGw/xçÏ#¼ádP}÷+ðØfsì>H¨Åо—oÓ°Õh} G—bµœ§•·ô#gwø9-F½JŒGpîÆÂ6¬HTúÂ¥…X$­`toæ,AÃE¬gY$¥äÌ"…Å:k( Ó|Þë1¿&›“›²š D2þ‚ÔŒ²ÆS&ŠY6v•í‚ôåd5_OoæÆÀÓîûT’äæŠIšÖÍÆ4Á³câß¶"úó¼×ëÆTAy0^-ó…ËGŠþ?Iy¿iŸ»²†»ƒ ‡áD|eg >.#IX‘šYLV²ÈŸ¦aBø‘¶l¹9$Í=»žËá5©ë~ Ä4<¯v^føïöQPúª„7&Ú¨ƒ–à†eû0ŒC–—‘W7¹ ÛíC|@ƈalP¼R…¬÷ãè2šH?pvsð“ jJÊ“ª“YFÌú¡à~µãNYðžÈ·Âð[>JõV,¥¾\N}ø/OWÑxD?úâo™Ç¹OÿþfÍs8ÿ-b}an|qŒ'`oïˆÔ ]g£°YëÁLvoG*TÓìŠ4œX³ÈõàãÑ41GD|1µ‘W¼©Hl¤K Ù2Ó’Jo§yã&ã¿0"f¾!‰±DiwÄ„ 0PvLj«‰³Ä½‘ŠwptqnKrdq vä€A1¦Ñl<8„3¾91›wðTiPˆoq”ñÕ±Îþc*»a¿¢³»f?óA<ßSj:bð¦1z/Os&3„x{ÉPÆÊ»\`iÃGc:»ÇW£¢–­†gÓÍo_¼Ù;µ²SþrBä~¤Í#]®¤l-)yÕ»fvŠÃé䨿¬AŽ&ïg2Y©Ä峤үǔ#uϧ^ª<âˆÈª^íì¡w{‹¡ ƒ5>kS~6TÐ' ÌÎRџȉ=mtxCjêü‘\–@ê~Û™km5c=âXá™ô(¾‚Hg"‰×Ée8âó¶KΨŒ¦=%Çù–#ó,E¸4Ÿ–e§°&»¨Ï¿ëÿ‘KØ“Q„7¨|N…ñ5‘5Œõg¡‰À[¢Zä­ð?ÂQR¾rŽœ&b¡.ÝÉ… §džÙ¨œÁÿ)ØOÔ'°p¤eq~ܘSÕoj VNÍY­ªŽŒÚ¡ X¹Íþص_ ’ÂTùgöæ‘V‰˜¤è¡qc DÁìê.! ^-~ĵ$c’Še&# ¾ÏÅ+ŸÆÓåà*º¼ú(ìÍ1z–Þû—VŒîs"œˆ'î\&îKy[ŠËï7¾%(¥øOµÌx™7GQ#PuÂ*ÃF&nò†è(MÛc-¡ø¬2F$¢„厫d0!+yF&£Ì1ß-¡¢€s·@Ê=ÎáÍü«Ç[VÐâ}®¤t^¦&ºKëd¿r3‰þ·äŒ+mÑ‹éx§—íÙ¸|²á¢b=-H<‹ÏöζKŒEÜ;a ×ëàZðwP`XÚ©àú; 1,)¾ak‰G#ʳa/Æ/?¤VˆP´,Ñ#£ ¢g¸â\Ë*=5’4M—M€JðFЬ?ù6!NIežÛ^ï6‘ÙÔGøBv±±ˆÍSñbB,Ëy›C’ŒÒ`°*ö§Oü³oà)í¦‚W@°-È[ sD4éÿð¿Ì‘xˆ’´¹ðŽn_ˉãÍÝeXzÁ¥œ¾8öÍŽöâbȧÊqù¼×w;æç  ©NÑ«:+‹©1Q„;áÆ6Õ·`¦¯‹Ã -”T?úFç™..K?á°‹J³‘r‚¡“ܹjŠ/Ž/¬{Y‰»„×w˜ $¢6éÙFyLŒQˆqx»=›ÁPAÊ$Îx’a3œk\„ïVcŒò#íìÁP2x<ÉRq÷,«tˆ£™˜ Xμ¦;“pSÞç>$¤§y #µQYÜÒkfEpPÌâ› s>“éd“Ø C¢`t=®Î=@9˜R!%D ïÁª Há.Ú€“„sfÁͦ_î‚dŽšâçëØ+ôA3CÀ¼áp€‡›!¶{žR|ÄE¾·Ž®¢—²½>Š\DèIRrzDüêNÝ ¹ÆPñ“~¸¤ÛH¾Ú 8ä2æÂ%Æí+E1ÆËkk´½÷&È\ ›^¯ï”ôsåOñ_×Êk¿BÂÚšÛ$œSxÙ_µïœbñfE¦Ð’’[l„:ˆä°—oõ)¤¿mäÑL|ØÊ Î7RÃH§ÆîKÖ$A²©¹ésÛ,•>ñöÊU"@îþµ‚o%ø»û×€”´sši5Liþôõ«P¢Ï}LÅn†‡³UZ‹´{1û"%Õ¤ï`ý·¿Ðúí/E—` •§¦Y'Oæãí±î,ôJN{^M^ßäîÈQÚù×›Þcn3·4‰{6R¸î]MôS×Î2KB©óŠ*2æéÎÂ’ú˜‡.RŽFØjlûÇb+N”ªS©zÑRtbÄä/ÜÀ¾™¶*‚ Ñ~¤˜ncD´_·Ìz„Nf¢ïÆÏ:‹c0¡X›XÈËæÖ`ºjýµ_¡›€#Êe°ÏþGé+8õÏ€ƒÕØ\ ã4/΀Ý/´âµ{I J·x‚—Œ 8»ëÞΦN-Îì6Grq\¦”Ô^‚Sñ\ÀÌê¡fë!N=Ä¡ÈA©"a#gvd}XÙŸ²'Å›p«îìˆpáþ$}‰a)¾.ÌS&͘ÞnüæEd“-buÆk¿Z{ã*R›pÅ•%·°iPº¤ rgyÁ§…´{ÅpRFœ?7“ë6Í–C8¹·™Œô’ J¦¨b#ÐTSµl‡tÄçÿ 0v&·£<Ÿßc­†í†Ñä‘\΢$\wç•”ç¢ÉnMÚì¨k ¼ù&ÆÁÌM0«3ˆÛ£‘XòL’jAÌ6j…Üb*#ÚŸëJ¤Â݃Wƒ[ò–2P€ù¸Vm뀔Îp«; ¸´ž­8·¨>KaI—Ι?ŒJç"ÌŸ}³çáûAljÙø&Ò´“;'S*(÷ºñí£Œ0½°dóH#DªÍý,¶V&~cvó9d$¯-{–ÐÜ·4Ax’ËËì ’a‚ìh<Åj · ]Åá-¾æŸ‘÷ºèß{½¿'ªô¢£UŽèOÚv©«ü½PHù7—ËO ‹ qh=6}ÑDÞÕ/? aMãȞѯrðs.dêEBQU«DA$޲Вçç’{ë°c?ÿºö‹Úü¸ Ö~-0¢RÉ<Ò†œ„Ãÿ\ÆEŽxÓæŽÎ㎃E7Å™b˜‘L°·¾ãzÓüæC rôðâ†=‚%VKEZ]}g­H¡Ù™¦ø–L`ß7.öý™=&ÉtºA"—S×áÝíŒï$©G¤ÔZ]™+IÕ‘Î ?QzCsÉÁ=†¬Øm`˜wùÞTÄ:rº·/«Ñk×M£çXê/jÝz––ÐËÄ2·~ Ý.8guf`È·¿Øq‹«¦Í´·ö¯ð{ ¤{y»î뛘:røep£B|1ý‚â΋ÄI@R)¯|„ïÂàÞÌ¥H"³jŒK rÜ&9˜W¦@ßVRõ!ݰŽhN.ÌëÒvu ‡á-Þ„NŠ%ìôõÏ>ÐÉ)Ë¥Á ¿*rÅ5„FÓÒHá9锑LÖ犢÷äÑ÷ù`<ö4#£a¶zk9@M A‡Cªm|Än]`ÎÚ0²( :ÿQï–ˆ‚ONÌUY²˜V6jvIfŒ¬A«/ï(˜¥‡Ð!M|È+s›E­xNlÛãcvD¹ÜD%wå@À‡äðz2”FɼœÄà ésɱØ!s–>–™OûPì·oý´;ê¢yë¯YG²1Ëœ_öÔhRã1Z7^o‡d+¥cs,>aì’Ÿ€,i:g²#N͸ ‘¢‰17q¯ä¡èöË[žŠkÞ Öú’ˆ«,Ú %àGƒ(®`Ub¡´RÈÀJ¸j<¥3çB`9[ø{`Éý\ŠŠçè*ÂÆ¼ñ##Ê7ÉÞ;øÀþ™”J·ë€ (° ÇÃ!eÖ[Œ©¶‘J&.îCkñ 4 À6HÎ7ÞÍ.†$!ççwש̾C™JrÅæÝF‘uȨ×CJ>éõÔ¿Í)¦:w v7GÓ@‚Y<—3´‹`ýsn@fÁ{.sFIfK™5Jû•ƒïòcÉtoí*J©y®‚Ô¡õ­R—*ë+ ùNR #ûHë¬óÓ«>ûF–óUj„&2¨&Ç7LžHClÊ¡†XžSΚRcèˆ/„£¬¢ å”ÂàE§•“½ƒ¿}RD#ûâ¯÷ªÔ"\™äŽV¦ÀÈHÚ¬ý*¬™£s޹®`¾NÂùkë“mukTÚ ³±µ¿\4ò±‚9[ÜÀzNDÉse, .H!@q-x9!|ØqiOò2R”f…dW,%Žö}‹úÑ¿Òø§µ¢ôö)•¬×Ûý!‰žÃGŒ"ï3„X˳E’eÌT$š˜ù¬&²˜ù|N”1ç)tÌíHz—gEsKŽ$o¬hA_2óq…‘LÇ+²ñÍGE0S(€‚›ù··Õœâ[}¡Ô,×+”~IJÇhhzÕcP´rk=¯´O¨£:2bí£—•-[2…ò1<ûþílçðèç"zJ¥´îIš('‰aDNÕœrΣ±†2 ?¹Yîí!øë¯„XñŠSø[ëÌ_v–S0Sèz¯»|&º{F4‹Œ®è=”6 9¾@Zã •¾É.âMV¶‰A/F¦‰L.… |šHvy÷ H3TâF…¤ŽÉo(sZÍœQé‰41ê5ìÞß(?bDI°‚0Z¸÷Fn?ï”;…À;g\¼ùumó»ÔµA‘seí%WÜ-ت`ëâú`ÎãÞrÈõ^OôÍ!ꦗ´¸@º1ù¹üFÝ;ð4´Êj…ÍBþ\6*åIõVëAHÒ³^j9Þ!Þø™#¾8¤§ïðÚ¾¬jŸûÉÔbÐiC¤Z"¯Nn†Cº<3¨ßŒ}‹KT•á“Ø×þá×%8{úâ!.­Î+ZÕÃ*nÆùá;ù’eyÞù, ±Úíñ˜'dîU^1(:»JHtÇõ¢ù¿ Êá›M~™m¹Mý¼\I;_°ø®Ûÿ.\,—Äm•?â2»õ÷jæÔÚe¯N“œ8ä2îÆ}«Ck`«J)ç ò!ºnG:ÞgRs¤:›æ….ôå#.Œé¿2š+‚ËooYH‰eP:÷ÚSjQ/б* oœûéf#ºÒclyqšdþV*`zÁð½£»WKz•Rˆ“øolÈÒé"ŠŸ3­]”äqô¸ÊÒÅZ;”ž§ÖHz§dÈ–R—>Þ-®|JBŽBCì®LKãMÚ)¤ÚGòÊØÖKͺ7¯“H×àÛJcC9гbP„üÍÑ1üF%„k„f¬èUxƒ}Þm†¯yó‘VÑìá¯Ò}mÉøé; ¨ì–äc§°o…S~̈4Í¥Z²§WOïKvc¸°%…ô•¤Õõ•XgÏܽ¤/xD<ôÒjž›y+@"S)2ëºàWCë"EJ¡ áF•®:jPþ5ƒO)|Þ±|@)™eHl¤ðÇÞ_DH#8ÞyaË#÷&}œP¿,2Íù®@ÉòG¡kJ ÍO¤X8=½†q¤ƒÀ¥ë'µö=¬ŸH#˜,Ý^|`L?8ª¢ä¥=é*Í/&ΦÔGÿÒŠ©©uàéÊj¥ç*ž›ÆAé{bʤG§,E¨™;:Xç§J†Ž¼Í½{Ѥa¥~pZ9úËÞ'Ü—àiIŸ§V±P¹E3&Ümx=ü¹—†ÖÙJóõò¼Œl1!Y'¬}Ìwsy9€‚hØrÜä\ó Fä/SuƒÑÀ|=C𔹙\æ.@÷å~™<—óÑEÝzg p_)Š ±€{ ¹àžEä;_Y“ÕFý“6&%ÃŬ;[%>ávþ­{³…•ë~úÖ’ÏÁ¤«i̱•þåS¥»W+íÒm$Æ“0¼ŽqyšžÒBËrì÷­qí¹K}ÔF,êyšæqÞ%(;W ü®a]P³8ú-ÅÔÌ&r×–KÇJbGl„ í$e3cC@&ÀT0*/•’Õ&†Ê%¥Òz…`£k xŽ<ÚžV©ÌÊ7V¿àUKÝi–ð6L;à)øÜcÄÿ¥jÃÙæùC|®0 øÂøßM7þo«Ñª?ÅÿýO:þ·E‡æŽ€×F$tp(>Š)j^yÉ€°ã`*ü‚÷ÖAݬKÆîÆÜ;‡»{§{‡Ûûø~rº}pJQ;·_mãg`;‹‡õDXoèåáþîÞt3!cpxOi…EÁñˆÖ~M!+ üšÜ\sÈJ¶0C²6#ÝüÎÈ%ôÃ9ºÆd´ƒCJ!6z28æW| |œ½ÿW<ÿ×êµNzÿ?Åÿþ2Z†.Øå•L 1çhÝÅpDÁœß̃Ñ4d›&‰.L\Q=¨È¿PtÇÜL¥ìý-ˆ ^aŒÂA}Óè·~×ôưS˜¡ÌŒËë Ëû*ȉ› ׊[_- ×ëµ² ”Ël“98$F|ƒs’|¼7‚Ô—n #øI~œº×þŒéŸ€¡bö±,„ÇðR©T~“‚¢³f7:XŽñÁÉŠ\ºˆ$ÄYå‡4H;Ÿüàän_&"6†?8ÙˆæçŒœM}pá¡SrËfH”«ªÚéš]°½N'°îÞ ¿kÐkH*Ä¡Õ9H;ŠÃ`çS#â ,Xøm&ÏudcJÆßf:Oš1HÞY4"à¨ÈBÒ“¡‘MˆÕ8›6 ‡&±ý¸0yÒÒ7YXØ—1 p Ý$vÚ鳸yøi¿t[þi?Ã+Ò–”j¹9†ÂDZwë9)G*~'q?íûãÊ™vÞfiaèõz쬛#i‘<†Õ€Þ…ŸÆ"ý&ËTê94Mÿ—©P1nTÎaµ|A‹EyÚåÜzk‚väa…®aÜ34MÌE€É¼ÖäñöR aª ™ Ñ$":›G!;§Ì e ’6x¿×‰%îJêš%g0ªiÁœBKQ™W cX1‹”ÕbLD~þ 0~Àá¶ä"¡‰k¿Œ ´¢-$| ÎÊ(ëLü›ÇëÝ4"·Ùä¾Àc zÏ9X/ÿ6KÆ*·ØGµÅx;—ýbJ±Í07b*ÚQ\MŽ¥o02ýóû¸°Öv»T]ó©7ØŽs}Kf^fÈ„ÜhÌ3¯=îõ<ñmLÕ¼|&v(Ã;…]0-Œa–Û;ø”:S¥ì/òEë0ýóìpÎýŽ›}k"ƒ[! N­©&€[¼µ¡ùŠ~ <~nE”®@ž¬ˆbSk’òú½cÂÂ65~ÚWãcv[vðlê!Rë Á‡9áMð¡6”B¶¡]¤X:­ì½„Yùgn8à õ¤s^¦XË v¯aÔÓ00Pû Î6 x¥€¿¾>z  Ê?…e¤Ù/«ð%é(ø)¥î¢Z)ò›hÒãõ]‰ ^<{±–t`âÜ4‡‡ÉÍxî \{ÑÙ‹IE¬ÛhnD¬µ{Èäƒ:}d~T¥¤ µtÃ×²éŒœŽŒÇ¢‰·…ÔÝ 2Á^o]¡ª±3&€$5¤}Ããþ[§¨ÙW«³¯Ñ‰û=TGC¡šðíg‡ì广ê^<«/ —Œ-ª;Ýž…ƒRä3\¦-®E :dÇÓ Èö{/„³yÆdç#;šxRM†ý¬lµ…¡é>V[FKŒº€EäëÏ©JÆJE!+ÑB>P«ò¯WGé…Dª†”ÍrÅ-© J)#¿€oöHe)úù“u¸ÆàÕ£8B v$Wr¤s§;Èݶك°Æÿj”ŠÓ“ ¿B?hóùjWõ ´X%O÷ŒÿZ#ÿŸÅá*%ÿü,¸ÿk´kmGþßlÔžîÿ¾ÈÃ÷Gƒ˜ôYãpt3 &Ã; "öÙe^àÀ]0ý0 9£ùÕ5:z+&±7öGÇ/JêvnCäN÷^ïýݾ®”=P¡ïG”ä¥ÅïYòw ¼-ÒD¼j[6Ÿ-œ—Òù -ž7äóJ1ž~à«Ð¾¼é[NêfÈÚ…b©rppÌãé¸,,)‹ÀQ±F›šgwSÏî&kÀŒÖ8²¾êkr%ë•ðB¯Î/¬ž›™Œå‚«„Nª úMºˆÃÿ½A͘Š(ô SØ›°„ƒÃüyeñ¥y­Ìë$ˆ‡ah@Yà‹þq‹ù/Js!§è ^7s7ÆwjIÏIs›ük ¯ÂÁ …“ñ`’œ.š ¨;Þ ÜöÝÖ¸ÂۚѢۺøXÏlæDäPqº€]¾….ßÊ.ßš]^0*úæ%¾™¸oñš§x3]Nf•sYýÛ‰í>oÅà•ù7Þ8™nhËûæÄ{X—¾›• 0¯U|w*:ýJߦ:þr2àÂÕ×<ò齚Ùdô÷"!ßÓqÞMBN8Ú&a¿IkqJæù)ZÔPS•WWßWÓ(™*&s¨L©ñ¦Ô]ouTRÙ_JWžP¯M®{+ð_\ ¤+èótDvÛõTža©Öȧ}ª‘¾ ­u¡Ÿ§˜BØìF0f9Å}€"Dµ~„6 ]C×ÕVuÍ”Ž’2¦UCŠ¡ò JNñ¿òMÿÕÞ_¥æ?‹ô¿)ýfýIÿë˹€(û&¾}ÇÔš! rla\Ùè¶Z7w0“aȱ±¼ˆNFÇ„*ü(Ó"¤263q8D1û¯\(âÌ›ìSÍ ðT¢¼:lÁpˆ²üã¬ãècˆÑî’hHý3]<»œ P•òfp”„7£©Ì÷éñ–ü)‘†pÆ‹ûU¼Ã”Yʱºª5SØ+ö{½^HmOK«ò˜º¬¬À‡/È*o¾0Û\gµ|Ý7Á¥Ó0‹× ÿ2æÐHˆf{áT?‹–Í—%ÀÈ)KýCsj`]Ø¿¸á;Êö‰òÕŸlÂL“ÔTSwréç> ÿ ”Õ-£ûR÷0Žù¸px0œüð½Ð~µªDк@¯ÀÝp{fÎNÍ•h6wÁbt ¡C¡$ÑàVŽ^ã}¨Pî10v_2’¤«g¬‡ö™v¢¦¼p½ø…2]#ïGuž¶ÑÍõy«xl‰£ûÚ£HoÓO-eìSÚÕ´Œ‚:H ]e¶ÄÔÉ´Hôú–œÊ >­s§mÞ¸ËÙ+ ¯jÅ÷|NÂ=Â-ÿ€4%.;'—ÇA™vàa¨ZZ*ä+YÉtðH çn43c%ÚóhØ6¤hìÈkFYÃ~"m@AeIfl2Œ$RV<Ù(I·Ë̦‰SF|Qeà75ñ›8n†Ðû?Ϊ½íË/Fo¿V£`”ê0Ùy[– ê ©š?7]©–f(^Ã{¨ƒCº–ÚpÄc9Â!ÕxŒ@†Â€¾21¿ˆ(T…/RÎÇHúo€Ê.fm1¹?éòÄÈGX‡4xÞcò{C%µ}L蟔QÛ‘!ºõNRBØ·q4 agýVD‡º•_†À<¢[¸dGÌP¢Óøz`EyŒ-MÂaqõôÕá6çû1s?²,çB&"6(`Gçó'*Ü 3\¿×üˆªî¨Âl‡™‘½U’òT ›‹Â>BÆÔg³Ìt6!Ç&ð㣊üìl0¤ܬü¹žŠ¨s?¢ÒÓqB•Ë ŒÊ”ÇCìMþ¡IñÕôf,MŠFFèS…’âÿ2Ï_ò°—Ì÷&@–bòIãЄfÎélWæ}_¦Üï¹/÷Þ—ÞéòY­Kе.‰‡þÖi·îDæ-Ò:.ÿx»ï4¼žMãž@·´é‘ÏRZW–!ZðÏZÚ œuŸz¤¿€]b»¬wÊK¼°úžâ¶^–R,›ìÛ¾Dã½I: pJµWˆjô@/[Ã1!“Œ›P8_Ó*—ôµLQ ÈFP²Å°)Çá¯AfkÔÇÄßJQÕA×A­¼DÌ3½á©ÖLä×sf­E17ù8J0 WL¼±¯Í!GFÁFÅ <.t6E\P¯FÛ弊üÇÙçªð/‚ò ¿ÉDÊ;‹%çŠI-æ•j&ïIHøúÅkyñ‡Óãý¢q,¸ÅØ\jë¢lXPS=‚‰Î­)7*21Í|C²&gµ‚ kY%‰’JæAß± ¢Ì¶`åW’'*3}Ëj5y㡘K”Y£ìíó½^±gÖú[°²Ô“ðá}€^ÉJy‹ú^fXì*0g-+«Ñ/éñ…²¹#†‡Ä©.ã­ ‡T7,Éu>Hù/) ‘8ÌZD¬H–†åO΂a·ÂòdüálñÀcžˆ}ð/u‰¤xª8®ÂR"x˜@Wï{½÷E°–*-69Zî!  ±hê .&"rXždƒ ]L°áM=KîX§P„%ü<ŽvŒ‚`¬l§Ÿb¡ækr)Úζ5~³‘écžKõc#õ­·¤¶˜^”›: Z„gYÀ·/‡Óñ8Îi·MÎ;o}ð –,-v] @¥‰ÊôB€âßvb»qÄs%¨ÊYËEøùÍJµ)«ߣ|+JÇÜÄ\>@Å EĔsÜëk=E¹²«q¤²æã´ŸÒsãZ;ïÎj]ŒØUäEÊ{ûK¾†„´)¦$ªÞ®ýŠzpV¡—ÏÙ|ŠEYpŸÔ,Ƽ’?oùF¶ k,6U_ß.ȹ`½¦“Ó¶,JÞiÉ•(žPöÒËŠëb;+G%Sº”+7ƒó5D}¬ó;Ÿ4UVBÜåè˜ åÆna¾A‘ ¼w þ²)diÞ :¹õ½à³ŒŒ{A;t›f5Q¯ëÁÛLQ˜ÊŽà¥ªý60ÿ‘Sá–`ÆT‹åAš)Ã1[šŠÊ!çLZ*­°`PÔ¹£Wá°Øöf,T=PåO«–V`5:¿x=@ŸßS±$_¤V÷%¤ °l› — ¬òÏk¥tÉs ºBW¹öbó†B6ÂïN;6aúˆMqÐN’0J·åØRP²à›*Eb,Ù Êd®¥R|zÄPO'œ$1º·ëA¯|e¤ä‰‡ ]8c¨v¹ã tìä0(œ@±©Ù™Ô­Ïžlòòá*$#چäf&R"Qˆ ³`jpÉŠ¯ÓHaÉs1‹HÁÔë^kÓ'WƵLIÅjË¡Êy|g¢éœgEä ‹Uîp>ßå[¤!¸Ÿƒ”{éwYep…‰ëOÛÇ{¯ ‘«/DœûbÒ¾š–ôàmPÀÚB`”œÅÙ×võˆˆÿ¼Dƒ¡¦w¿½fÊ^³îÉrÃXÂl╜ÆÎ·hw…+–âü2¦Í˜]ÃÊÏÁâ°PugÝT°ÍJÓûåvó»õ1Ñží9²*—W²ƒÑhg:»#~i8cňE’CÕlç|(Ñ¢ð|B[¾y7[ÆËÄþ-jTÌûño½5$Ò½jö'¼þÛoÊ%U?4…õúqÁ»]ÈN­4‚Ÿk£›Ù˜´o ¬;±’ä5ktqš”º˜ÑĚί$hrt¿3K‘™Æ,1ïhÉó—EtâV“qã [(sÅbübKû:F,xëªÙªÇ>,=Y–:~Qjš¿‡ rCZа]Š.€Ÿö¢¸áŒñ „ò‰IO?,ŠRJU¼§Tö¦„®Oßî2v:£/“á ­I¼…å{úÍÁþvýG§rèa<Íøï‹ÏFŠ‘&†:~£_¼ Î={:ÆéyÈ1nù×ÀÉÖ‡?5•N_¹4µêÐìx›45 ]’ùÀk?p3MÙzÈ+Á¹×JBž{8¥ nDÇrYæ Žu€§™R'xý’>Ó=šeâ(îTÊ O¡ P”í(f0 ÆÉùÄ€lÈ%ÎÎY­®'QÂÕ}Î`鯌`hMéˆÄdžZöeí¢–¦ôdŠ€ý¥ÿ%uB¢ìïSô÷î!§SjÙñrÊY¿>õH©ÊÏ–þò2ò?d ÉrEÂtéÈ{ðè\ÀI™Ë¶dÓM·ŒÈAÑ’È­¯è¹…Ì#»e'©¹X9 ¹ÒШ>û„ªã¢×÷Ú726½Ìž'õ(h±¡­5²¨k¦‘G1.eŸ±”m† 1 ⛸uArRäÐQUÌFCÙgdµa˜‘5Î~‹ŒÅçE†-F®*2’·‰¾ÒÍÛ)%ŸáÅ¢3A}ìa=è'q8¿!WÈÛßÑ·(i/  ô\ jüap—ðV"ç…кÔáÌ«¹Ï¢ãHöÑ쑬 SuÂz<,[†n„õäg)Ôä¥kÎÝ\²•ž´½OveÙ)¾¿ýÌâý’a1“#’)-eñÂ뫢ʄ°pTÓ–;™C·h(¼Æ2yT‘z– ,mü‚ZøŸm3óö2KÚÊà™•e㟵 ‹˜¬CJÚ¸ý[pD)s?£‚©Ä¦ä?ÅùóÐÉ;mœÃ&—Ƈ¬¶{KÁ˜Ž7ò+â»(Yrye—ÇŒÛÁ'~ÞÖÍ6Š)´ å³ÄfüLs¯)LA‡Lb6lGò:¼‹5Ô2)‹´IŒ'‹mãÉ2|IåAåg}[ú]l‘ûX’íãƒ1û™Çaè:Ô²ãnTåðiDèÚH`\…+¸Ïƒ¿ Ð{\£°y€'…Р®}ˆN“PDT1òŸjq®@¨c>ˆt4·ä+Ë+œxc— ïC–8•H<¯q…Â<³±ÐqÅkÔ/ŒÈåV•01øo#Õ]4 jA ]¿Œmñføq«H-[ºP1°CåùȆ‘ZÒ>jL2Tº`âd'`Âo¶$ËÒ…Ý8íœb–lµzí—«Þ»¾GŸæ}›ô£ßP³Þ?®rt¹.ô¾}°‹Gdñ…Û,Y'”íùuæ0GÝñâ•Gšçü$G¬(FeA¤¡r‚:BJâJêŽë;,`)ˆš-XÛ#ꟳûØ(x׊~e4xkÓn£DPd¢bºŠÅ{'åjÅ(°’¦ÚÛ_8»õ¨¯ÈÑ·5XR=¿«ê†ÖäŠ KuÃÔ¹Bñn©u)…{4IªK×´®œýÖ›Ò÷s{TœF´Bé"*#”6›Èy4±ïƒÛõ^ìã<Š×©Ú‰Cìí5kõžb—KÊ­šµÓÒÍËÉä[â°ò„ùªkDºÝõ^öJëáÕ%ªYŸÝBi¹ª¸ºXØ<°e¦œ ™§”ID+]Ú^ïVߎˮÆ^r+5J(lMÄ¥‡jVœøð!^¤Ã4²´å–]+aMʶ‡ÕÓfw§èÑ™fMÜ¿{ÏÓ[­‘Ž7ý´~}ê¤÷ ´.Xi"£‘F»¨²ÑþF¾Œ§×ÄAЪYM3o¹™±§™ÄtIŒRR•™©Rþ¥Íµ`gô¨d´•¯)F™|• búA"¬ ⯄ÈÒýmé®H꺄Æccm&Å€žó«Äâè5‚ G¯tqï›CNâb¤êbK‰ £7èYŒjkÁKéÐø×—w´<ËùUhÍ@´3½çºšŒ3±XéÝF©8ó.­ñ~SMJÖxù½e̤|þU®:õE2¼|y‚åÌÌ]½#îsž|!ÿ¦Ôn­¿|àÿâw¢²ç±m†ÅžPLfV¦VO¦Ø›+™úOÆãs=ã@®ó{F1u3943¬A–•‚ë›ñ<š‹xºäçy0®½Þ«²Eµè%µ]ì6V<š^Ç~K’4YÔŽÜô"÷¾IHÖÅ,ä5 dŸç v†× Ÿ¯LŽ÷={OŽŠìÉ߃1àz6©”³´rI¥%›1’ÍX<çO—§ÁÒ—§º ¥ž ˆб€?Wi%Ó#!î[ÁE~¢W×·‹í„Æêú2½ ©qîø®ÓØ:¡!Š âOT¼Oÿ²,A7E rp~óÓ7‹ ‰&|Žc|RdoFaÖ±Hô5û¼×4z.ò˱# £œÓÜñʺ¢ŸCó·g°ÿG%UQ™‡º×ËXoaämæŽ]â›n'E>'›ODF’åˆ#½²ÿóŸ9l~šàC4¿ ®IG]e¼»¹ž™³¶Hú%'TðBþÙ/? $=œ’—’0غ›üy£èÛÌŸ76üK¥·g¸úßý’í«É”4+tô.>,lNóâAwlV¶Ôã=î°mV‡iK°ßÐl!“57o´È°¤þ!²›ü_@ò?„`÷êb,!0 D©ÁXl‹HЬ‚ñ`ž‰žŒÇò/ºˆ@-@€Úð|´p6‘é«ôßL%C7$,¶ŸRu˜ÿíó¥ä-¯©±´36% \m‹¨ÛcOiÓ˜¤¡o²D1â zãlƒÔËÛ_bo•Þ”V>w²)wwûÿ,´„* ûËöÎß¾ú*+ªgy*÷,J^´´‡T~ö¢A|L%2nûøa4ŒsÍ›°SCäFÓœÝxD|˜ W¶ù´rô—½O³8D¢z‰©öEsE36Ù07•šê…X÷aÖëáý?Atž.Î0ë‡ollRžüÉo¥rUDÎW Fµ@ÇM׸‹Žýh§¸FØ…|¾S?Ÿ…!ÝaŽ–F´Øúí`2„UN¸dƒËv.Ñ õÀ>ö0pCUk `D|‚Tqû‹_`¢\ûÜ-|dC1ødTb ©ûBbd{×7¾ Þ¼qQlöc,¸G3?¹Þ¾•¦ áÏôð`3œÇ^Ú£–ÃðyNº4GàPú'ó›Y4Â8ä{';ÁÕ`ø¾çä@³ÖçzÑÄSDü”šuã)Ì. gÕ”](—á„v±Ú…›ÕbÞÝ$s¥ãGBKˆºD‡ãVêÕÀß,dMd}GXÝ_Pb(øûaÑ©äåß›ÅîÙ:÷FÎ]¼—Å}8Þ H¶Ý7ߘ7@§øP… UJ‡)îT¹©÷Á»ëß8z q@eZç–ê!!, úFÊÞßÎþúÃë£ì;ªÅ+NCÎ0m•äˆÙ3ÀHY[’éûGV¯&ÕDá&—¯°ëÔ²GÙΆæ³}µþÔ·‰›täxݸüî:¡µúyÚúJ±ÏÖ0LéìcûEE¤Æ¢^4N…?KÈK¬±Žg)¢[O‰[F[JƒcÖÍ’>•Ù£ñéçŒ5ÅcZ»_ÅÝ,q`†¿—{u~¤—ôœ.Ü—ôìm •Skõ¸ˆÒhM•9¾ešö‡ h©«\П‡Ÿ…BåXEî0¹£”͉G²Q_ñÛ“;C½ãPè˜yµ ô I…ñuhV{®D.c™©Qƒ~<pŸá?øw}˜°þæädû›$lŽPoéz¼Ú:ªð´›Mø[oÖj üÛhvªô½Z­Õ;µöà{£ÿkÖê¨ÖšõvõAuµÍð?@Ó€3þû8 ¯r:žÌoF°I¾D“¾ä»üY€a>#¾ŠÇ`X—ø9¦mnÛÀ?Â^‡7“ËÁ“Êän`of S àº`íî¼À@æAâ—óŸ³Ã£Ó½×{ß>Ý;<€“œn9›ìCŠ#ï|? d|ù“#;éøt_&Á«vP1ø^9µS^qÊ«x0» 줟ºÔ†Ÿ€Xén£í‰¼Í%e &Îïf!Åp¸$pÜØFt!Mò¶ëäÒ`§EÉð~y\V(©´Æc¶V†<|‚ó­à(<&Ü;¢:¹è°Vñt\¹ áྙ ›¹F{ænÓ<Ö6oÖ4<<ç%ÄB𸈆$AÑéÚG×O°`vpÁ¼Ð fMu8^Zƒ$xUyu¼}ô—@Ë›y*5s æ1Ä7±Q1ÊÓù—é÷öëá`6Fstj;€“Ýà’›bÌO£bž— 8ÚÖžE´Á9fK˜òã v…=¸|ÄxpIÚAý—äV98=ó(èßî`¢Úò·“MÈ U6ùÛÉÆ¢ä@e¿\Ò}šÌ¥~c>3£ðí¥À‰ß¸éxDËs}e,øT!ùÊZÄ.D.½8¨÷`xEVfÔ>“n“ñ®9Œö¹ÃTzîj}”Ïm³!›+e †áÜË(WÎpéiMç‚lRM ÎÓÉù†½D—FºPék$Ý"‘¿´‘º¦}Cƒ»c \ n7l¦#Ž"kT“EŒ8[0Œïèzf.err¥y¥)]§ÝæX—#w˜Sn¼ýÓãøõ ¢ 3þî\•#ž&jäI±n¡ÏÁUo˜ïäÖþ*©°@¼“Xh=8f¯"\ ïB·Ø‚ês¡…ðdú¡ŒÚ>Ã0¸†\°þä&†:’3Þßå 8ÇÓ)tÇã_˜!u|¨i¹ 8˜¬Ï¿WsÉÂx$ä*Ö F¼'ce=áõN¹A%‡ub 3ÕœÙÃõ‚”‡Z< »¤†U ¤Ã†gØt$©‘$2ÆCÅûhÌ÷ßî‰fr =› þTK ¢ug±=Àyô¸r¼éRŸèŽ»å¿æ¦RôH"*R+‹d‘ ¡”×—6˜äo1çÂÐÖ¤k`â×£+ =Âèâ±1=ß÷ãúíð^ã2òôxAWŠ2¸‰AˬØ~ÓëÝ$¨ód½ŒÚü¨D}ÿ ¯r•œÁÃÓw¾EéG·ÑuZ¨•ØPìã:wr½,Ô¾©›ëe «› falì’Í¿ö\f Ûón~Ï<ƒ›£³£@¼ý¥¬þ—I%_±Å5[òâ[†îéhãaVÆ“Û\¾T©†#³Ð¢£ÐÎ]ä€5Ç]YÚ§ñHéyÁ$ÙÞ‚kÎ~Ìi¡ëpOK”ô=7Ø1‹ßçú3ÝB¿ÖŸŒ÷àW9v'ˆ!Äå(žm'G$¥;Q_ Sþû-W‹„¦!œQôOD¸‡GŸÂ>ž‹„ž"€—ôa­÷çåYV>ïŸ{µàil¾ŒFµ—&eœhŸ¬ ƾ4h¾»]¼õñÖ<ò»qfJNØ !œ÷D}ÆDGôæ ˜QÊ!˜ÿÑmpPŒÌ©UtÖÒ×ILûGº1£‹º‹hŒÄ~éë«A¢9|#ã†í]ƒD_WƒÉ%ThˆKô¡êØ—Š<82‡nyù¯#ÿÎâ/-ÿ¯ÖZõª+ÿoTŸäÿ_ä)‘ˆÿ]¯§£›qÌ8@q ãhŽnယcLâ‘2²xüuzŽÜêp ƒÒÃAP«§p¼$Ýø9 @v ¾¯(ìÉ|j¥àÖJ*\¼^ ^G—¤¥ L)(=FˆE­±¥/#vŽŽ‹^F8··(¯XV\®ò:"çºaáeƒ)šß‘óv„óv,çmMÜ‘_DƒûûMV¤Ï•Õ›¢ú]Ô!×ð_ˆžáÍí.#ÖKW®(SrL„¨OÌôI©|±FéH Õ%¡à'’ÉP 1vÔ Levì’|§ˆ7³g²´dS¹€rÙª þ·¼vðÿåídó|,|%‰.WUÇü_mÁ7ÿ·ÖþÿOþ¿¤À¬Â·Áäæú<Œ£ÉåÿÏÞÛÿ·ããûkòWhr÷|kw]Oì¤i'3î}Çn}㼬íLºÓíæ‘m)ÑÕo+)M;iïoÿà;EÉvšövŸ«w§±%AI$sýò·rFˆÝbèw7³Y€Á2>Òp NÀ+™mP7 ÃïåËîéáA÷ò·ƒîyëòäüø°Õ뜼Ds]9lõ¾ËT{Üà7OOúƒƒ“Áeû´{TXÏM®}¬ ÀU‘BCš ¶_:]ܤe =¡Š'ŒÚ[̲„16d™ÙŽß¿f×§O~ÿ8/°¸ÿ×kµ§Ïìþ¿[ûÞÿ¿É‡õÿ~³éA³Ã´ÃÝ顳_ÍÁ­¸†‘¹ë üô°`îžÌgõ¶¼r×ý4v´ÖÛ Dê¥%èÅîN,¼¹|CQà×±>ŸµôÊÂÈ?)rÑ[âïà«ù®ãI’oèBo^±7ò²èõV\íÅ"X¶ÄWyuEµ4ôG‘8Ù až.ˆ-œˆ„w¶I_îõ®ãÉ®ã!K‡–üYtgÉ›Í:²Î úÈV¸ ‰† ÁÊp—X¡*Ç:‹`èÆÞ›\˜¨¿q¶TL ½2JA-v±*ReÕP•UcUV VqE«˜ü‰›eA7*®¥0°EÜ™d€á}bbïÓ FA+xi Ú[%NÌ騩ºqÂÂj¦OO›Ìú^™/4jL,P[ï¤òß5­EÇ·üœxï#¼s£É£´¤ÕK¢qlϽJCÜ€qîð1ʸ N‡J«¥ŸL´¿ÝdV°¼®Úb*ÿ,Ðçü”©sû7Ö8œyÂhè:`éÄ ~¼:8²³:4›é:á…û0q-–£„ÂУGâP6ÁËWð€µØ#x‘ÙÑ”`ZŒÚ6j_WÞ|¢u=.Y3ûrE»¨>ø0 Rq2OÛó›™ÿEcÖ3؇†”k1l– ,C7ç@q%i4⸫¡Qi<=6/íUuÂ~+N2üðÄàùÁÝŠ5^V†Å¶—¦d£épèKt†Ü»¬ðìÙ´D+Ôâ‚{°1•Á´óLâODÆA øaÒý:/t%H)0Èh:†×•`9:€c …o_úc p»}"æý”|Õ ÿÎrQ…oä§%§æŽÐZÄ¥Ü;ðHIÔm‰¿T²§Íxd€ýòBÄoñþDCÝùž…äíøYû}ÚMʃÿþ®÷.>ª±Ao'.k17Ù Y-žCmI»Ïü¥´q»ˆ½4ï1C_Ç4º²yÿ‚Öjàá)CÞ¸~ÌË›«ãíúˆ(ZšÓua ´b\yo{IT6µÍ šN‰<­¬±ròÉW®ÀÊœ÷¼¡~;yc\7‹ò¦db£–h=2õ…¥ÔG/Û •r»rrzÒ2ÖÛõ½UËMæó8:´FØé|˜ø˜.fd:ÇFg»™Eÿ3KwĈ(l<ú©üc.£Ž9nEÉoó‰ŸF`b×È÷ˆ†>L—q/ÿ=‡6ü!¼¨±çñƒÐj³J‚+úþò,ÿFšÓã–@~Á¾¸?y(Dan¿gÖ`.:;B5|äRAºx–*¥(–gÉÐ(¬,'˜È ðä ÀþÊ‚Š°nM¼é#‰#„è›-*ã™âxìÁ„ݤ+nôÌñ›a¹ìº`©“Ð"—@—*˜¥ á’’1Ô¼š›Öš½d§`oFøgþº‘G‹`LýƒòÏY6›¹Íæ““&¶¼à°,ÒPîè œKÊØñìGùQ69 Í_˜ºÊ/qvÎø>yI5.ã½rŠTœdXáU:¢V)øNèãóЩ"xƧ¡"y‹ŠçöŠKE|yÍ*cVigÓ Š²J3Ê5-}?k˜¾°ˆµvQZra:p§9ö¸ì#.ì$)äS4G.\$sèZŽ˜!|)yЦUrÏŸ†ˆ[¼]ç1}mî°”uF£Ô 5PÃdŽL¡FˆŽ…úðçZeËñ£uRÛx™É×KcaW‘)Ñ–0ô^äå ˜7>ÑûÙþ>Ö,¿8YA[ÝÞs}ô’ŠN(ŒKߣšdH#sˆ|°—•ËÔ[FÚ Coé³àx˜IDZ|ÒàjK/<Ô˜ÒehóùŸYH«•¶ƒŽÈ½P¾dÊ2Žðôõ’Ü‚Q¨ì½½*ÂyXzû<Ñae–¨ÌeiyÖ/€ÌcáÄ¿¬OÍ Íª.¤\ª|FúÆZ8˜³«ôQËßÚÏYã3?>1 ¨o݇[䧸¡ÝxÚÔWW,ãŽØŽôèèx¡±-£ÀŒSRÊ Ô·.Kåìõìæ¦†çXpwM%«œ¹#÷­ñU ïCàvh²êâ»é“A#—­ ž{ÕMƒ(V;mÍã· ^uroNêõ‚éa…Ï™Íyšâ« šÛôÔ×¥3’WŠ€NXÅ%“Rg颧¿EÁ-昺|_Xܬ>/V40”žöó©]äâ–}Òo'›Þ¿pxäÿóÿµXŒ~üje`”׳§Osã?á#㿞n?ûÓv þîýÉ{úÕ8Ò>ÿËã¿´öý¯¤÷hÿg˜ÿé{ûýÙþð§Ç®_ùvñŸµ§;OëZüg ã?÷êµïñŸßâ#Â0ÏΚ¼åK”2ÐÛÇG“þ Gç4EÎ.=ޱÁ² O›ø´Ú4Ÿâ¾m0™$‡Zl¾ëã»Ã*¾î°¹J¢WÚRoU2@ ÃkxÛ` ÃY#à†’ÁX1'úâ·ý0~[¦ðôÞ»@Í.Àc%ôð¾Á@éä>å´YAa~AmQR˜4Â{”q~róØ; Q-ÒU¼Ó–’LCf[¦7j0¼ êEô:ƒWV ñP/…×FÅá²2;V¡ÑÔ.¬³¬´hª‰02E×; ZRv>Sˆä=Da+ù1H£,(Ä·Ô#¹æ?‰£-æ(µ³z±UÊ•u,,»yz|vЃ*¦`†aÅ›ˆæT¥r „ip¸6&ަ”ÇC£¨ãAÿ¬wGì-bj6õLç}7@G\xwéœ1–DwpÏì±ÆBéuL:G.:GkÓitÁâÁ ÚÖÑMš æfWö8‚5h£Ù¯âbú¦„n@u¡ä8ý̨ln £ÕÐHfÍáÅAïµw§zÞg;dŒÃÜ-én–mºh"Õ¤€*ÁÜå›@7m¾-ÆŒÒã ñGiÁ0KÉ™qÐNNPç;§'wÛ¾/³”ëj¼—c½d«CN%Þ‡EÌ~‰1­l‚â6íÝ;hò?xº~JÜŸNz@58eÏ@°Ÿð·‚-ˆé4¨2ï°à¼ÆÚEwvæ [0ÆÚÅ`Ç\>ºÚÅES«QP ¯_8¨zö覬KÒà£Û§_\äqÆ1f‘µÁ­Mƒ›.$×à¶Ê`¢ %9#ˆaäPòà‰S§V5óÞÙyêîkÙy€²ÉºþÚáåXWíí}Œ«=Žxë$<ýHø8Bí‡#Lá@‚·Ss©ãMK9vž.¸6í|˜-ãD#\ËЇÂЇC¿ÖÔ±`JÄÛÇœ1žÄĨÈH‹.Sä¤-õÑBêa¡á£­Ð³ÚYÇ:^áV¯vž_ ÄPÄÓ]kcNzC2ðz™ˆO5š|L0Ic!ø.ò™‘GÏá?¿¬WaáÈYàŽV"+0¿¼p$~Œ*vÙ_Á+ M·”wªuÜÒ{8ƒtÝY( ûµ¦ÅÂ-èÞí³<Óåñ¾’ë£3\\fÏÓ6L¡înÊ@Ý2i.èƒZ&BkH?T,z†º#Ú6<ÑPóD:˜iôùïé¶W_Ëâ,¬à‘.39Ö@ý¦¨‡ƒ[ ÷¼oZ¥FÀeŠJ‚þÏh–{är5¼Ãfœ¶á¼qNÎ_ûd·áß(Å?Ý_Vñ&þÔ¨ñæ­4³âø’ç·©Qå~ÛW4\ÜÏZÃp ?K]ËÝúæ+ oxSš3FÖKtw²b9FLs¯ÈŽýOï´ýs~û¿Wxyén/ÉÿµSßÛÉìÿîí}ßÿýcÿ—µ|IßãÝ÷È œ7Ñ2õ½Ûë€oòmé²µQ}K÷Œ!\žõNÏZ½A§%ðhË8‹€I~ÚÝÓ –8E¥H½3,,‹tLMæ.[ÇÁ Õ½qVöðÎ`LÆÝªqg–ö|O«lÏ¿7¾{—çýVï¦Ç}Q´£ ì%f<¬òô‹í*ûZ&BF‰m¼8õÛ” OϤí·7pw~SÞF4 ’DåíÇ ÿì"䉷¸‰sôÑä¥&4Èj¼W]A{Vâ·VöÈXÙhoÚm¨]NØèð·<) ˆ۽ʿb¥<õŒ3mÒíU ‡ái #TNÃâ+%XYÌ·5=`û⢠`Þ1ž­uÀ¡sÉnصaW2…µµµ5RLÜÀ6*kaã™eC“ó&Á,¾£8IÏ’àfL§NwêòÍÔÿ ž71§ÊE¾žÝL¡<ºª± ߥÌ$@¾èL§Q¤YÖÚ¹Š…®Æ7Ô¬öRÍj¯¦Yí³²®X¢»ÿ«–.éM6—\"%‡ríí.Q.o‰vµ—hW[j×wGî¡?ÿ¯îx!ŒÝè<Õ6NËz—¯^iTöêÐjÞ!vÈ®?„i`÷fâðÁèz6ŸÌ¯èŽmÂÏÐLD—ν,º.36m¤”’ÆZU3+$ÐP<9"÷½ƒ^óÕeÿ ¦¬—ôìKƒy,!óle(¤90e׋WTU!‹î_ÌaFËvJ`+^Ql™~x§SMR\‡§(¶3†è±ßàhð¦‹K%§ ÏŒ3ãq„Fñ`mKáÚ凂öQaÉ:EÄsY¸4®9·„¨`P·ãùôÞ²šà*îžý^È(î«9ø4‹¿¬&!g`™¤R·¤4 Q©çRVÔ×H¨#º!ð’–G9/wxF㼄yK'`¯oàË,¸…»1´ŸU4‚ÆC>ePi¼Ž ùõ|uSXzÖ˜“(kÕód$Ê(ðõuhá©a Ì× ¢´ƒaüNò”Ò¶ˆwG”ÒFdíV+IƒW“‘©dû0âgoqù×¾­ÀO^{: †ßÅú™¶æNmçUtî!­Ð•ÙóLÝë÷ÎÊm׫mÖ‹ü6«bÞ’ª•sÒ×^MÍ{MßÌEM¬G#ëR«´Y¶µÂ‰¿•™ 9ðg.Qh-Ì{Òõãœ[AÇò5l?x Y—Vc&í•ó.,L¿ Ò– mDðÁ–)ÆL)\{8,P[µM ­$ödëÿÕ©‡æÿ£öUN€­þkg§¶ûýü×·øØí_’iÿã,õ?<ÔpÙýõÌü§„ßçßà£-ÛŸ5eË«ÉÔ¦h†ÓËD¼3¸OßQþöÒè΀{Âà¶ÐØ‚9Ý\Ü9<ö8~r=¿™Œ½a€»«t³3&óÃY£Ÿ$Át8 â­ò÷ãâßæãèÿÇ;®¸ÿ?{ÞÞÿÛÞý~þó›|Øý½“ÎÉË}vPˆyoýÄóoÒùÔ§ËÄ&ùÆæ|~ôŽº/ñz÷;ÕmºõƒåœN¹Ãçå-y9×¼ 6ø¥ôŽÿ0AH ö#xh—Uß|Žu¿j]”r/æñx§ŽÏñ¿_$L¼at…³…ÈŸñüoµ‹HHص#iê¿ x«\ª‹<Ø•wÿßÿç}úäýò‹÷â…÷ß/d,5ˈÏÉê/¿XÏŸgàÿ›¿ÈR‚BðÅ<Z/€|áÏÆÆ›(ßÒ ì@•i‰„Ú~9œãݘ|Àðç}¾y*]ù¤AbdÖ2€XF<]Óü6SÂ{ÈPöE[yŽY¢Õ*ŒŠOCoRv‚X@ Õóª”ùÑ‚,e÷öFKh¥ÄYÐ'óMâBo[¨Ç4Œ–œ}°Ui`åT ñÙ0›B “&ÿ€£Þèri­¿Šd=Qe(ïŵKE3ˆ—©€,Áõ!0E±GÂU¼à*ó4Ø'ÛÙõã«» öœhA—Ìz×ÑÕµ ¥É®Š\`såÕD<_©BXúóªÉÌm¦’”Ëz~2ƒ ÖḚ̈K‘¢~Äïàõ#ÐÙ6þÜ’–{K½ ÒƒˆÀgû”›O»ÍW[6 Úe<]x‹ÓíS¢Ü)ÛÑب!1œƒ1ªަ $ÓnŸR>mÐÿ:•ÔSi,…ë(çÅ…! ¹™áÝ–€rÒz)öž•!1Z¯ýC³sx°2Ò+‰ôÓêHéh5¤æÉ û»Äª­t$‹r!©ö‘XíãžDiWÐLí>·FÁj‚æÀõ|àƒÃ¾\Û. žÝÿKo`ß+„VÄ—÷úgíf.,Ì.,àV!ðït»úÈÞ©?²‰ïÔ È·³äw[–šøx$kÍ#ºöÔ¢­€ûç‡6ðn.ðñy×þ)ø¨ó› \Ïž3Í^Ètºë t!ÛèºKÖ;Œ¸CÚG.â ¶Š[àòð'.ömE´á3"8*`÷ >S@B¿•QÉgfk ç8è·`³ÈH3ðöŒý~w9<;m#‡0š§ç'ƒVï.øÇïA<¯à]’c#àµÂÇFT™Ê4 =†k¸tHŒtÖô*qLv];îC;£‘y+¶$ÙÙ7•hF]ñxêä9ÌÛú”Z@P*jðÜ`‡ u€Nà@½—U0ZöaM§kÛ…#²D­kKç§Ð1‘(`Vºr@i®Œ#yký´*Î+YÎîÊ强®Ùj8`ø”³b}G‰zÅú`9’µZsõ‚4¤ÕJ:8QÌöy‰q*=¬Úáj¯5”ÕPNt¾ŽVÄQÅ<[ £õ9üÖV¬=ðÕ”ÆtUIŒÚO«¡ôU¯©­ÖÓúªÏÔVS—~O–Q_µÞ‘BYµ”åQ®\ÌpÓÓžEÜ u¤ÕXZŒD‘ãQ{54‚ÙžËë “&™{¶"s'GËÞhÎ)Ñú:ÞÑjx§½Î'PÔh¾ÜÚDܨr–;§¿†rGBï:ÚŠýÞÊ>²€°T´ÑHªg³§§íZCšf›«ciÖs ,Ý€¶Ö@S…ÕWÇÒíèhº-}¾Ž•==p¡áòÒ‡ËpOñ\üHË…¹>`Æ7LŒz ¡C¨Ç×còÎUÉ;£“w«Öch×ch×cXXÉ»¼zLÍæHTs°ÄJß$ɺM2¿÷øïÀÑD®ºùFÝBÔµkbõB¼žŒÍ¾Ü¯ÀŽÐ©v§)¸ì%l >à¢=}¦eôÈ’i­L§]@çÕÊìÔjEü¼ZŸZ­¡ƒ•é èÕÁê Jèbu ñs±†€ŠØ9Z™ÌŽIgl«·ZZ¯W<“Ô¸16ƒŒÖ s@Edðƒ·ø~;ËÈ+7#ÏWcäÕ=©;9p2’%äfäà~Œìf¹pKd{5F.î)‘=­£R­5Z9ÓÏWïFņfuB;ÅreB&q†½¹~ZÖ\™ÂuìZ¶\Ï9Ïár+”ãpû ~|+üú>Vh8Ya‘“õeõ½¿“µT +8Y¡ée…˽¬/¬íxYË[ý>^V¨Ü,g+¯îfµûÔ¿TOi„y½»^8n·û­5(Üí£Õ º6í£5X*ômÚGç«Szæ°‚º˜Ç6>e"”ƒÇ¶c 1„‹šo`Ë>þ䟺x—°Rw±rtOVö\¬œ¯ÌËNÖ¼ÓA×zžýüiV¢÷ðä+˜÷õWGÖ6ïTß±½âãžCQ}¿`½L +˜wVÍ SÏ‚Iô—ÕöK&ÑK[ý>æ$`]£ã6ïIZhÞûƒCê`ª§4â$Çn˜R ÓZP%í^­L§öS!G¯Vç¨öS!K+*æèbuŽŠ:ZÐÎOÙÉ«Ñêcß0«uÇ´ÆllìˆËÄHfž;Xyµ2+M+¯îÉʃ•‹•YÙu±rqOVZ.bGkk9D¬f9BOÂåã`˜èŽð×ï?†æ@ „_Vá/˜ç<À@Z#a¸|$üÂê~ÉD竌„¡6:Ûy¡Pøàª»4Â<³Z/¶ôÒ_V¡±þøJ¤Ši雯D«§XBÛL—Üi%MÑÐÁ$‘kÚš.vŽVgÇ9”™"Y‡VÖÒRlô#0Ö(Ì/ÿALLœÞsoE.1§Å{?§-c#ó´e`Ñ„…mãªgî‡öÜû¡ª·Šî›ZÝØax‡§Ò5»]‚‚2ÖÛÕ§«RˆL€(JSˆ¬gS)z·¦ÃØ¢ª1Ø:`Jí©%³§«™²)ò/md_®%.C–Š@¡ÌÍÛ¥Êð5vqï¥+,ðã teí•ÌûéŽ32€"Œ9¯×ʈôš‚eáüx)üe ÍdKа9]L¼;û ÝìÁíPtf~ؽ|b†ì}…¹.0À;ü3f&ë ŒrÀÛÍ›ê¢$"C7Ñ7ÅMd› ›è䤵ñ‰¤þ¼pö"ù_¥E‚0U#ùöª‘dT#y(ÕH\ªQ,‘Ñ|ºðq¹Ày·½f@@ñ0³jÐ<>ù£˜Z“¹åJgÞÕí¸¸“¡w]ø“5`[ ¼È‰—D ã&mYðDœ¸1o¢ÆMäXE‰~%î MKLKô)” ƒ+P… ‡úëÌ<™àï‰!øo5u 3‘ºÖ©™ÞY{É*#Ÿ§:®+œh„ùSñ%a9²1³~`‘›¥Çÿ6Á”]»OŸVku3Q—Ê8£‘.±Äs ó·X3é{¹Þ ¹­¨§a^ ÖnȈmv}%ènSä6]#g“ƒO8ЇyƒÅuëŽû|²ŽæÂɗù-+–»ÕŒ/¨€–Þ2\Ó´¯¤t†ç¹"pÝÀ–ûuÆ"…Û{~…cý¹찦ò±sõäŠöKõ dx+åèÁ’–íj%…씂©\Ž‚¿DG²÷¼ŽV¶PœÀ}LÔ…é¯G oÏž=ˆ[³áÂQ¾6¸e_£<ŒôU]ž×—Ô…*2ŠéÞL¬ÇH_+•Ä ;ŠÅÂI-aâëBÈŽÕƒ:Õî€ÎµkO±+½¤§5ëië/ø´n=íŸâÓëi»ë¢Û~é¢Ûn¹è¶Ït_;é¶^»ÿöÚEøôµMØí;Ž Ó«Ž…-ëMQW:h.㘋²Eª ¥(aú 1ùøhh<~¶¨&ãrò®AÙ \k8émìÝ¥ó¢IR:•ÀƒéÜÖŘ¥óûN{ž»Ý²+DµÜ3ž/¬ÖÊsšåusÍa”×é¬]^åX§‚æfˆ˜e Žóo0ÎéÅ%ƒ‹l8s:!'éø_Z‡žçéÐø_\‡žêÐøKth¼¢WÕ¡é(ÙÄrú÷˜P•ÏAïÝËõ™ áPÍë\j»²ë9¤6M“EÌwàÛ» ÅÛ@Ë¥›;{ùlrï9˜à~jŒ¨Z48‰cÁÞrÉp§vÚÎ-iÈ)§ùòqï£ïæÈ§ž'ŸÉ'Ÿ‹bùÈZ48‰‡’Ïл›DÏ÷óŽûRi¥ÍÏØŒÕΘ—&º=P4Ì,ù¾¾ÊQšLõ -Æ0ø§fþi1ó#¼x}føo\T‰á\ñ?ì*báòu9¾ÆsÝ`4Xi`é5»ï’“`Ã~.‰,nOÇWÄ¥EBq#+IE^$S6¥­&®ãa5U)°”qÇ!äh=)+a]tŽ;YjÔ/îAí¨c´[äl¸•ã|³;Ðf›åöŒr]þuÊ5ŠýV¥b›©b­õ°åf;G´¥8óªÝú±‘-ð_#Q ÜŠ©çlÅ$éíÈHá𯑽AÔ«V?²ê%·ûŸ>{^}æÚíç`ûiô>@”7éð{tØ~~É}ý‚<ñJÞx×MÛmË<öŸeóJlzfÜå…Á›ÜéÎpãB²M ‚ÝÖˆ\šIýÐjMé⑊¦ÁÞ»“2}²ˆµÍÜ5ŠZhË$q“ëÌ\ Šœ<>Ú`Ö‘ïyÁ6úQ}¼úa“í}„VXñðØŠ×ý•.™=¶…Ú`[$zìYÉ2 —ˆjã†t39ßoðÛw&ïÝ_ó8éöL^ º¥6á|°Ý»Õ9)*íNÔ”ÑÆ-î{±Ý<èvïÆ”ƒ£›4Ì•K ™×1ëÛv°1€÷ å¨Ùéy¯Ùº#zârV¤sòk!ÀŒ¹Æ{tqu_XAGâ¶iz¬n‹5œ¾›ÞäJ÷_œà¨×9=¹‹*^µZý,bºu¸(Ë•¤@wa„Àà Á‹à»ßZ8#sWV‚ýÚév ° î[¯ä µ0ðúUv øÝ0¸ŠfÍÉ ^®ÙÀ[e+ötNÞdÛ_² XTÃ*Ï5‹’ð Þ,èL$hzÐøºè¤ñÇ¥PàL²Ð‡(=„iÅ»" _^ò[eÞÜ0ÚÐÔ'P iþ”wñý÷}Ž»½N¿‰SÊQÃðËA2­&ÓÉÕö½Ý]ø[ß­ÕvðïÎî³í?±%àÝg{Û‚ç;uøüi»ö´¼í‡c!ÿ=Æ=ïOÿGÁuA¥“ôf ÿ-Xú–ŸÒãMï±¾ÍIçäå¾7¸Ž/Œ&wë'ž“ΧÐÉF0²„N8 b˜‰Œ½áGïø¨û2˜y¥÷;U¼Œï1ÝaNw–OýÑ5.XŒƒdG ²›DÑX»¨"ÎÑ©c×:ê U”<Žâ`”N>nâmç››0ŠŒ`–ì5A3[ÜÞ3Cx3”¾·ïшpÞÄAå’™ÞŒ a…Ɔ®}$KØ9ð¹½~¦¿_=«–Rî_ß„!Ôƒh÷_·ÛÝÖ2ê ÞчÑ\êj €½Vë²õÛAwþ©„¼”-9¶Ž;ƒA«ç56Yá›OçX=oÒójÓ|:`OæÓ>>í›ÏÎ<&g‹*˜ùÔŸ¥Œ6ÿ!F\˜ˆÌ†±Œ=eíH0vŠ 5ƒÉ¤3 1B-WÎÓhREÖáyþ@Î?Är%3 eºäŲ޸39ô“HÓ“˜WUò;:-âi)ÒIPá¿Êj‡Âzþ,Û•ÿ®‡_ûÞÍ9‘lcó7FkËÆ/Uk‹'ùÍM`Ð/O‘6ªµ…/÷aÔLe°o’ _º°Uh}'§BìÕÇÔ¿+äâªïÀGr‰ žxeg‹®‘Üú »ë'ýu—½8_6ìí(Í+8ñý1—ÆóBXg!Ó¾<c7iìË3}‰Fï€~†™€†‡Yš‡"7Ci0“Xbl£?‚;ä—¶ KâÂ&ÀðCÚû–ܯ8…ë ¯…ë\ ÀÏ{/(ø9.8·9<\nóx8âãœ÷‡t£Éá&¯žç¢žyÂϸ4nóh ˆ1‡úF ¦V²Ge½áÙFlId;÷¶’thê¾ÐAÈ+q h\çҸ෹‚Æm.#2Î9<µ¹ÉeV€\ç‚\Û\#2¶ZˆÁX†ƒ=3Ú(”­Mi…¡±ÃÄ(Lh ˆ äˆCŒsq.þ¹(æ&—б«:43t¨f¨ÉW™›5Ó`Î%Œ]¯lia¶8¶C]¢DÄDi\eI€ÖëAŸ§àCš ó^I ë|  tëjž º¿3¨Ñ,üQv¤ÀƦœ)þÌ”º$Ø>fîE85½ Bˆ*´e¥Á²¾ÂÄ>—Žš@õÿÒ0¨äqZÕW`¹Ôz}¦¼aœ,ò`šƒÎת4º-‚ú]ýQw$ÁÆEPŠÚ8ŸZ[R #«±CWk‡Îæ–×…·Ž8=l1§`úç‡\´7Ã<˜ãó.×››IÌQç73ŽÞçÁ?}ÉPRÀQ_²” Å“J1¦r¡€«¾d+±DÊÀ,‘ò‡‘î°r¥P§n©*°¾‚s1ÈeLÝ- Àú .ŸÞ‰bpVÈá‰Æâ¬˜ÇÅä¬ËÍY1Ÿýש$˜¸ÚeÇÙ0;VËÈ–•¶k,09/&o†¡„Ò ¨Ôä6èHåF)’Ðu>¥Wܹ#¨7fT& ÐàJ˜jY€äpDy™%™ü¢Ž$Ð8èà„Kz–SÔ)dæ±ûõkþþCÀ‰(a–[Ä §1Ë£Ñú ³FÁ?ÞçÖ¢)ª1Ê«G“W$ Ïµ%ÉÓ•>×”$OOú=N!ΣÐãâ\ ‚„ŸKã@ñ­QÅe]Gƒ²~Ö-Ê–'aú(ÉbÙ²e—ŒBŽD‡ëÈ—[æÉQç²7MU àú:`’yÚëðæÏ+ ú$¯–¯™ùt^KB (QpÙÔy´(û·líÈÑÜ‘«½#«ÁyLn‰Ÿn"‚t¨É(V‡:jv9Ôx4)€êI(k‰‹ƒ™Ì‰‡æ"Î]G±9ù“€Ç 8òñ4`2rÖEö`\¨àŠÀ$‡cÁ¡%»ñäSs27’¿ÙÖtÛæÔãu[&Õz-¡lëm€¨236Ü”ôlKn€ k>Šm{n×´©ª:*ªkSVvdMcG.›(ŸbÆG\ˆ`S˜‰9á/_²—WΗ­¿ðAÊõ²ÏfÈÉÜõ²Ý-(³ý² Ìv« Ì6ýofΗ¯‹Êl½.(ô·×…ž¾Ö+*[ßš­@OÊêàÎÞvÁÁDûà••áOŽy¥(ôJ%µkL%¶aŒvjûøo[ÚŸ‚í#h¿Kœ+{÷™¨mÛ6š±°Á–™Bw²E$nä-™ó“VSª!CÓ¤TÛ-Òi«7òîN["¼¶7â‰*=#¤ÓFA²¢¼-5Š*X„0)2Øy¬Ivtµšµ7¢rP—Tð)âC“ÔOù¤x4³žàµ´ë=öô¾ÅõÇ£·p£#COn¦˜îœ‰örgwͤvuäuu$uudtu¤suäru$rudqu¤puåou$oudnÕ»h}¯ Éš=³“ %Þ Ê½gôº¿ŠÆfÚ£Æn|%´£dÐ+R©ËšñP¢Ã"–©˜HW¬zb‡@Q‹«Gš¦¶ÐÛ%j6 3GÐE<;;«B Øu§ç'ƒVïn4Ÿ'§'-óEOM«‹¼šP3 ªTÚÚ} þ÷w« gÐþîmýy ÿÄÊ.]ÙyZlÎYÊ'!v«›Í­^6è“Öo‰‰kôA·Ïž‡Æs&Aza< þñ{CÛH!~&ÙÁhÂÞFšE'É…>þ! ¿5žý±U^ZL§Õ÷/e¨£‘-ua…[ÎfÙ-êÂÀfI£W""Ƽ-}“ËÓÀS} °Q¢v×Ü-èIx*Ä+áãþ«|§áÛ8Ùb°CÅ–*bœ¥¬î]Í/åÐvðQæ>€qžã‘ˆ3°Tœ=µÆ×a_óέ’p°ÿÑ&¢Œ-¯„‡å¤[ÙÇŒûÔoÉÑ3„–EУ•Œ>à>f\PðÞ ¿jEÜœ *ÂöâgíI¾nEœG«‹šäþU ¿jU Nr»ª£ÝÐjœU:ãÉWþ*H3fM–œwÖFå¼ÿŸ¯ÍšðCGíÇÕó«¹êý?W+íÞQ³fËNÉ;kÈ—ÆîQÃuÛaµÞ)á“ëÕ%ÂÒBY/È›pI¨à8ˆî¥_OFZ:¤‡—SAî§„øÕ]áÀ¯'¯a¸r]È)5®¯ó„WZÛ²3¿t{Ë9žhÐ!Ô¢ã—HÎû{FDøÙâ…,'ÂóøÆdJ«óýŽ ö÷‚õ¨,á²`x‘S 3•9 ÍÓ³¿Þ½kh…½ÄÛÖÿ€ÿb˜q9.lõQª^âÙBª û{Ð'ó@ !ˆ4à¿Ïyìfyháb].œ‰±¶Dïúê)±¾4–ú^˜K}ÍχÅÿ~y6,õõ«¦ÃÒò?ž`žŸäÇÏ1„Yžž=}š“ÿ‰>2ÿÓÓígÚ®íì=Ûý“÷ôÁ9q|þ—çr´?|2õGóäÃ¥[’ÿ«­nåÿÚÛÝ«Ïÿõ->àÊ™í½éQF0Tz—¯^iTöêÛÛ;Þίg^/X,>z¥ë4]ìÿøãíímu”ToF×ÑÈ¿šWƒñÍÿý_×1e;ÀÉ\tu&0l'Aü>Wu²z¡M:‡é•(yØÙü6ˆÏšà'ã8OŽýÑiß{ív¶3 ”÷Ð&hõöù;øˆ×M Oÿ}°qv/æIÀAžðÏÆõßdãåYo{àfó Òòxë‰'ýÔ½ós˜ÝâÝðª.^%£ØOG×^ipÚô v×e‚Ø~|µÍ®«Ò›S·'7“avŸÔ¶5¨Úøç+¹fÑgOe©×óÉ Äo:,ˆZc…LHà¥öÓ*$ëÛyÒq@Ýž ;™–|ï±và ‹SÐ 8ÍÞö“f/SE £Š¨صÜur”ÿôɳÕHSï‚”†Ev£÷hj‰Ï7þŒ9¯‚+¨ª-W{x˜$œÕ§{3ºÎÃÚÛ}‚ ÈCN¼Òd…â?å ÆðÏ.C#­ùq<¿N‚ÜR@Ok ¼OIâr“…? ¼E<YæB4*$Ò¸J¢ó×h,ì=”ˆ¡Á—…Ÿ$€—Î@C93†M“hÕ £8Q½AÔ‹Ý  ˜ìuਆµ(ƒ¡ìVU[´…‘”Œä±úí•‚£`‘’µúÝò”I$²V¢Ôbò üSÛæÅ‚o œ$Xa?õ²uaìO&Üäf†”D2 ¼ÚÞ“áGˆ®fÌÀStœw ÓíiÀ«O:¢LHÄ©H(),=Œ°ÃÄ›6Ô¹œùÓhäa?c‘ë þ-pú¡5Åа_®Ÿœz½PæiàÄ0¥¥ܢܔ œqÂD a &À¬Ïò ž5/š§ý×—ÍK\#êÓ, ÈŽf£ Œû‡5£ç˜ÞØïËÞ¾w·‰ÏV~ªqðÁš´€BÍ÷½æàã"Hª£KzPaˆ ä Ãå|„Ä’?&H¬Â¤Ê~|öž¼ððºP“.Ë‘v ¦à‰ÊCSÒ (ê(ÃÐK5ûìô‡êtG Tpï«•¤SzXÁî†ØúÃÏœ8ö‘&Ïv¶ïñóEv&JœÄè¾Ä'fï¥$ø‡gÍ^qódòJø›¨4áùÙÈJÊÜ$£´¹©¤Ç2TŠl𸦼ïImà@Yx5°BëÂSÖÆö+xlÐ,ÑZ%E¥G9*Aœ ÆøVÅ£$•@úöP–L—4 ?’FØÃ†apÓxÅ÷nq“D¸@'™6äè1»¥>2ƒ'© ®_%6ÿû0Û„Zb‘—‚Þº ôÀÄ š~¢¨zWô·SåÉaic€éÄæ~ 2|œøQ 0º)•#¬\nüäµe)á:Åä¸/y¥ôÓwFU ÚËØ6åg0/é†y„ ͧ{€}Ši‚lÖ7¤ÙºÇcRÓº|NRþKfsBÚh#¢„'½·ë€æ÷c¡£É5˜ú„ÆÁѵ35ã7§lÙ©£›èmö'àvôÿ€rÇ‚žî|ëHÉúdµ×zYb8¯Y…Á ž×?jè»IØ8£‰‡I4WY$PÀÌŸ]ÀƒFZHšov*ÞnÅ{Zñö*Þ³Š÷¼âýTñjÛouäv¹Ík¯^ñrHÀð¾µEº,”Œ†s°c½ªkïvõwð ;±®)eÃp*Ö^ÎB×àõ\ø3?ÂppTÁ7òaE£gT¤Í+¤Qã­ÓtÏôa}®ÜíÂÆˆȶ­tk ÞÈ·®„ë á:¶@(u®p€ë\à:×x€wj÷ÖÁE;ËFÛ`ã¡Y0$Û’*1—…v!2ó¢rF±$R ï%øûõóЬÏv¹ìís/¡$k[ g˜d=Œ—„êê}1^-ö¦.´úmY™#ôìDÇu˜Äe}¸³Lß·€þë=ïáü}ÀFD SaÍ4‡ÿQÂo<¤ãÕõö$„:¾Àï³Á¸ †9D7øe¹~òžàU‡UT G‰à0‘õ]C‚Ò9¼~]¢ï \Ã’ŽÆ6éÿL+ ~6O‡ô»L´hÇ‚ªŠ×‘ݤ¬Ó©eÚäWj:cépé®\âŽ÷Ï ã•˜Ù…$eZŸÓ¡Ö˶Ößb;X,&_¡D [ˆD}oKAkÆ$§¼ÙÒÁxÌ\ÿ*†i+yÝl¢‹¼1²hØ=‹/m`dÐ[P7o¥Žllƒë*¼*‘íÚßÇÉšlÅ Jàì•Þ¼…©„ÿá1+|Ž€;„|ÈhK•(1…SV¥ŠGŸ ùRO?îïßÎ"8¨Mw¸MItð45«6ø–éG ÊÀ›ÓhÆT |¦²˜ S›e•©/Fäÿ{Œ3\ûÿ8† ˆPÎ[zw75Îe·%4cWlK««PÂ7Ïa¯ËÙâp•ñ1FƒˆïY/fâó 8KãûWƒÁW*@ù^²…Ó’íŽ=ºwQÒ_{D§-òŠ’>ܺ%e×ÇX¯òA÷ÕÞŽ\0%žÇÙJÑ,w¯JÃŽH¤ÈåÎz/n]¯lIžºêæk ›fœ¸óÄ,¦Þgo$²%÷d¬ÄÖ¯š4GBS¶ž>ž ±;[ZĈRöÒÛ9½Æ70vîòÇ–0vD w6÷žkñ#|³â7Q°…K ú1þé@Û‚f“I•ázÞpGRðUü„·”ÕG¤¨œ«¨$9n€—Â) {ëÈ8§õ¨˜l>q?aiBî¥@cË&l—©Zq}SYÄf ZhpbuýäÅ5d0&ÿ²dìÖÌAs]ˆÁÛX—ã_(Ь3 åêo DþgD™9t¡*j ,x·DáˆÆ88:’NNxØí ’gGT+ü \Vq†WÁ ãYsbœj…E¤V´ØSm±â ¥¶ÒÂ;™eÚÜÐVEiÁ8w锊”`B“¸U„FÊ@´Ù’,Ǧ˜;Üîetq¯¾æ^äF ƳŠxAó<-i·Œ ì>dÏô›m%>qð'2¶¨P 8ù«Ðêƒv…5›†ð0g ÞSü3ï„´Ï&— ÙÖ}kÃÈck%ˆ‚ûä—¤S¶ø M?“Á¡qÄý˜Rè¢!acÀ»/á³Rœ0­cODË$¨qÇ¿ Rt‹&º¬ˆå*-yʬø—–ÚœöZDÌèÄD…uÃb^Ú92 £®ÍO[‰!\*‡¶[÷-:WáªÂ(Ñ$ûHã§D–‹aOm–Œž”îðÆþ9§X¨ù0™CßÇ•¾U‹ÌÓaCø„”Ç•$šQÙÁ­jÄŽP§§„Üj0'M&ßÝ&;Ý==Pf”äE6^¬Pø\˜l¾b›6˜Ñ«i$ÅÜz<‡ÝóRÕK‰ÄhUÞRÄÃËQWáù©VaBbH: :+zoÕjVÞßÏèÖQ«¼ÌÚxL›³àùµ—ÄL1§ G›QqYh4CÜßÏ­•¦ò™E~bž¦\[¯Fóð#öÓIOÁÛ1B¦·„ÃE{‰@ ½ÇÇ  ÀQ£sE¨Ò`ÄIÛ™ê-ôˆ<-Á)÷Ьþ¢¢ãÂ×>I”LñT×–Ä ¤7 º|¼!WÿKš®éã+óéØxDǾbŠ'äç(T½qtš9ºQC(GS{ ۰ı—%É~åñf ¯ÜPmš´½Ñã=éU¹l ´8Z|ª ‰¢b­s‚Ër…ýªWâ:üzk,[< Ņˆi–ÂfºV çW7‰-Í­œuÉ©ÿNš+¶ ö„\””rœÌ‚Þ?–5¡Óë¾<ï#„¯{KEM@‹%®.§®¨9Þmõì7Ôíàq…ÎE¤ú «îcô£¦˜9©ŸŒO©Ê)?© ú›šJ˜F§‚P‰9ٰ鉭ì£É„÷ ¶mbÈgvê­‡ì9þøŠ]DÏzзª"—¤ƒÇÎü²SŠú ‹ñÏfÙß—#gKA …Á8úU„Õ'Ú_PP¶ó•¤ÿë”#Ë)e\f [øêU›¯åKDö•kÿ¥²y6Ÿ—8`EƲØd×ë GäöÒÏ2ݰsžJÏñU?’?‚ÑpæÆ&#ìúl —BÉx²«zOù§ô‡]áê1ô–§®j0Ÿáù¶áåg¶¨ÅÒˆiÝ9ÙbM› Z¶‡CêhÄŽ ¨ÌJ%Tñþm„Û ?§çTjž·NÞ(o—'Ek:ÂÐ<}$3ò‰¡q„DÌ;89²êþÒOTÛŠ”úÃ’]±±ZÇ„zwuÃDñC|Ïß»[ŸË<ÿƒÇÎÌ<ò¹¾]R…`ò‚yrqï‘_†V¬Ê·›|Óhõ¬ v§Ñr3èÇù€kì*û-_cúÂß0èUAÈGÚùXÌ78øŸø»‚re ¶}1Û"Â<¬ä\†bψv "ïh*v«Å“­¿ËÍ;VX‰ÿþoL…IžnjX@^d•F)_£ÐA[þo (ˆY”@g˜eÀsù1Ì@ÀèÂ4dŸ) †(ï#QÀe1Çl=®ù(Ñ¡‘Ùºw|ÞT¼£Îo`§ú¯:møÑ£¿øºæ^V¼ÓþØöκçýŠwÜ99ïozÞcmçl3‹YB»ö*£ ^âºo z/Ä ^ë¦!Å䘧+Ô¨ÂðS‘ž€"Ê–¥ó-$‹Ò$Àû ÕéötPí¶º¨üUS5à—ÚöÔQ^ŸyHqQ6 X”3ÀÍÓ“>L´8u-WK‰Z!pñ߇F£`mÐmÂ5°Ì_²É„Ps„lAÝŽñR”†f  ýú¥Ë J©V!aÕËKTƒÞÔéúÆÇ(mõ¼^©gË]è³?—ƒÓËß[½ÓŠ“¾Š¬Ò?ŽB\¡Ð~·ËkQñF3Ü1Ê£+ŒÜ/¿(zê¤Ö[™Ú‹K©A8”äèÜ­¢§µ?ë%­„•ðÿ©Ø!ÞZYô‘Z¶°ÓÞýÊòXaŸÖ* 7m2m»Jq5º[”îµÚž‹· s~ø…>Y£@}¯€l)³2F˜á†Ê Ÿ¨¼¿|úÎçþ’©’Èã€&× `Œ­²Õ4oð7¦D.éK7HåòÛr™¦øæ†ÙƒnçåÉeÿw¼‘? O+cëoi•¼‘¿¥ÿg¼ÅŠëœ ¼Ù[³Ò­ÖÉ ÷×2£¥ØÝÂ5¡Ú!ñ†ó›Ù˜¯`å“¢jdIÕ·6=ωvt08¸T•wšbhÐý­|ì^ëàèòô¤û×2/”öU/q‹)«¬Y#†•Øï—7`Ð ãßÒËK¤T¹¼7æ õz-) >¤nø~«‰‹yžŸ–=G¨Õé|ªeGOtz­ÓÞQ«WÖÊuxrj‚æ‚Q]ôYp¦Þû¯9LMè´ò›·b3Ž=C-§çÖ O @êûû1Ûˆ°@qx«²…8K‰ 扲½›?´¡FDé¡öþ-Çg@ùsJ“¡^ìÔÅ ÍVÏ÷vµGÂÞ®x£¯n+ûö4ŠĆ22Šï“F"»"šf¥„µŽdg÷ë7;¼€^´8Û†!EÑßÒ¿mýŸäo[[Ò‰KíÓySp[Î1XÈïªÃ; ûûYý³ƒf å¶á0q”SÒ2qÉnBíîéÓÝtwEÍ éah©iÈu4¼—N*Ô2àé™JFVˆìÉ×1ªÎ×Ó²°PË:Çg§½ ÙðXB¶1?eŒƒ¦Õcƒ— h7þÕd>œ,Eé ÏÕ•âgpÕð nmƒÌü^Þ£á·1ÞËôõlÏËêyëútüKÓ€¯ÿmמîîÙëµÝïëß⣭ºË2¨]¥ü%·{¬¹å®ºmnòu7×º× Knù nŽå6ƽ¾è¦#»Þ´|±m£h¥m£p™mãר¾ÝºÚæ=—ÔV\P3 ޶”V¸¶tWOwΆHªú;žæ€¦&˜nw-HíÕæ?÷F¦fÿ§“”ûá¯ÿ¸×ý0$|ßÿûŸlûÃW¦Ètµ.iKÆÿíëþg;õ§ßÇÿoñ13¡óÑ™]€ÕàYÐÕ ÑÁü¬I¯…m½O£ú³ÇÁÕ¾v Õ¾Âôel?£ ߪöD1t›ÌýgôJ@¬ì=y"ƒUEZÌë`‚atW`¼`€¥• 8ã¸øÏmtÿ‰>Îþÿ@÷þˆOaÿ¯áSkÿ¿ö´¶»ý½ÿ‹Ûÿ_aÿ›·áÏñ:ÞãåCÚý‰üÉä£7Yt< äÅHu~ oûQ÷@`Dä,¸å“‡*ELZ‹ž„wx¸dzܪ^/¾¼/èæ ÊÑ®v@\°“I0Ë„àö¢6ŸCFw×i6͘Øh£`€LûˆÐl–Óñ’¢I¦…·``=fñצH¯­“~çôä²yz|–OŒvÚƒê`“›Jrð{}.FnAêÁˆwºÌäz~3Á³Íªˆ‚}Ü‹Dö»?žü'¦å 4é@eoÉ·xã„Ç ä4›sñ<½™¤Þ~ÂŽ€í}MøÅŠ‚ ]F¶;¤ ˜Ÿ8¦}ZëÒ©ÏXðU§jÎ }|jȸ:èoš7/è4«Móå!¾TC”ñò×¾øTÌxq@$3Áª&åöË gðlsÅ)…lUÄ4ˆeÅ ô1#Eàƒhª"oºÄq–Žð@ÕQCé _MQÐbÖ^£+6*æ…N|1ð— 5+<‹õE4N¯i}, 5¢ðÒÞnåÍN½²·û–ïû—à^ÐÜ4º¤žb¨D÷×Yq™tãÍ[ÁG¿ÛíìÔïâJTVKèjC¹[; Ú2½îEçä¸ûq…j”\ÃÓÎtŒO^T™Û•iР³:;µ'QY–Ð3Kcx¯BJ”uu>{Uvêå2i…Ê"éâTº•n8Å;Rõª‰{Uù® PZq ªv1*¿*Um¯L•ÝÒÚ€ÎQD•iW+q—ezuÍ¢ÁÿHö‹u¨cºeÎìQ8Îtìåîf‡¶•´:¿LÄ— }¼‹kûPOšÄuùu,¾}6Q"B‘`Ñ>^d¤3h”ñtþ…ÔDH»ñfü¶‚Ò{¿­ ððÂg…âÇÀžÆþàÇQz-êàèµ ßl\éxo8m±/µd2‰”ª¾áW—D/•Œ@åÆñg±QDX±«·Ë7±ˆõHðÞï\tÇX…J4Õ;Üç·Ê8i+š7“¦RO˜jÐêWì/lõ‹ª­ÚZŽä ùÕð{%á7÷“°^í›a½þùa›Ö‰`m AZD¼®!h¶A5ôçõœç;öó²’Ï0Çe”•oò]¾#_ªC¼é*âEÔûHWm´±’ªøv+Gt`|»õíÄB “`Ä®ÂÖ| ÄÑ=F?‘;ßàÍÉ ¹Í«´¹3)®±6¯–.¼F»¢]-/î.ºÅZ¿ ¼¢.ì®È›²+˜þˆ‡OaŠ3NA,ú{ ÏbÛ›{ܨn àiÛøKó§à(Ͻâ-QñA¤ ü“^…’L1tY‡O6¿¿ïÓUòyG;èv†5üÏ ½4äï§â1VµJVYeSlãË»ípYÛÉà¹~¡az‘»d\õd,ø!mÐ÷ùû Æ-cÕãtg·‚@ÊÌ'¾7ŒýÙèZ#AùN r5«òyYkd$̘ÚçaÏÌot٤נéÌ¡†øGÏÙíRñ¶·©½`9 <•¾À|׎ÕKün¾m6µ×è 1W[Ðפ;ðJ*yHÞíÖà”ÇûPñ>ê-×me[N@–Piq(úI€ÓÈ ×ñˆ¸›"ÙÌìr´!µ=$‡ÅB‘ÿ½ýáùöö6‘úÿxžF½*g Ô3òñut‘±•q@èy˜µím7îS*»w§îBÛ[†¶·kˆ Í '•xÌz–ìÿ0É…ÆOüiМO`²N0e>Ý-«#ší²®<ÕXºª‰æ«’YÐÊ©ð0©„Ë '˜âÂÛªôP”•>Qñ£QR–1€#L0&X%ƒÅ9nöÚw0ÙD ˜túð%É7_|,©I“YœgKИ*eÆú`Å(ŠhÌ«Þ\R¢9ÝR´œüP‰#ºP»$rž”˶WªAÛ]…<ޏmU ´nªZ=pè8$[}7œc{Ñ˹‚+Ú\VdOp2¸Ž»zÄì´?ƒQ§¬±¨Á.fcZ’ P˜°‹8bEG`F3rVÂ… \Æ`¼58{ ÉbCðÙèþZ!Š ­ØÏåŸ5‚úþ½*›È”sÜäÁd;õf,OÉžîÓLç‘\%ä7^mR[i­ÙK²Åx!¾¼&$Àøï/J·`ìnk{üÕdÎ_Ñ•YônïéÓ§üué:ººÆL„·Ú ÿ¥4™W¶owêÏöž‹¾x!¤Xv»Žþ åà“'Œæž5&J¥º0òô•ÊpKd2÷Ç4Í|uçhM¡l/N³šï CpÐë ^u´Kˆ3 ³a¨Ò§¯“ùg¢§¹]f±¬vZ¹F·(åÜ_VòuÄJþ٨șÚf;kk…’¢˜¹¦×ÿØ•-—.Íœ5nä@JÙäôÞro¡—˜o1CÛ`Èžª&3 ½jˆ®¡—Ùêa·Et:ªK‘Dü؇³Q×®·2Äk¤±Jcjv=$€ÞÔq®ÄŽ)Yº\œHôJÄ”Á '¸á¢,ÞµlWÒ=k6xÊ)Ž´J2Û9Ì*5c}ÖiØ=ç §ÕXÃ2 Ý”ÖB¥'äûÐéÜã»Ùûª°ƒ=€†!z …7›|ÉGmÃÓŒ„(K2&óGtdþdU铇ÇUºµË ¥@‹1ûáâU‰~6±Tñ˜ÞdNÓRª]VB“šIŒæla15¨,ý ´ÌÍš ÌÛW¡Öv’[—Ú%GöLlúiùŽð޵)ÞÿLéDzî,ê¦tCI2aKŒ .qò¼Ôh#ù¢§ÖH[»ÔÍh’NñTûño¨Ùñ{3_AÏ[ ¦¥€=6§ «ÍÐB­p¼0¯ÙDZ ЃæxÞl2=Æ·¹NÏþŠE‹5I"»á`;Û±„‘EÿÏã³’áò£O•ì´OŒ ‡w437Gm`œFAäÊÊõKx©|ã{”ûa¥Bã‚JÉÁ4áƒ)Aëú+0 ð(ÅI93" îì€ !Ã1d4Æ@Ž,ÿŧ„zt»w 3V´Œ€ž¥ÿ“wLdfÏ”¥­´ Ê¢ÈéiCR¹îéÅåàtmÖgù ]£›t0/ïD£˜} ¡ÁA“÷qj?xæÖ ™á8ð+NT™Sa(ÏŸõÎM¥]D&\Î!˜n0ËtJc³|ЉDœXG­vç¤åMx² ã|aºÛù­åõE+°uÎ=ňð¤!†é~%YD“I0np£žÓít»Yzøô~ô´t“0X©¶€— ß¶Ë"á‰Ë„ƒš!|ü†¬~ð!…Î?¾q Ü¡;@làp6kø³Ï6ÁDˆrÞ‡ŸIée0“„Ò©—˜3á5t7Ê»mua©Oˆ¬DYs­þ„@HVá|‹FÞ1—kÙ¨“CQ ÉsƒñÍøm¶Ak¬*ÖJÏü‰åGÕ2]`ýåŶ}é–.=®ß`kÀ–³Û2Åúû[f—hjÇi9J·SévÊ[ZÛ´Ð対”Y“¨°”<+$š`4zD ÁìDrë/šslæ‘%dGiج:¨i…äšѳ§|^!ÉÌq’ÊwƒY™pŸ¦p¸¦> Åš2~Äܸ•ÏØe*ÝGsˆNuÐ;oU0°­;À ­8Dw[âeû Ûo¡«ÿR¾lý%ƒÙú‹xy’ÅT/_fËTd_f15†çEÜžçsû2‹©—™Ádq$h šMrYŽ;ýæ%ø-G¤u/,µƒf*óÛ´e»‹ŽFló&ëúÁ¦êöI³r±;]*ã êõë×2I,ŸÅÎ?GîßLÒ’¡Ê+’Oã4oÞŠ¤®žgÎÌ(´·f˜fÚ-¥­\Úàê¦y>¼òëeÞ—ùíž’Jèý¡VçYnfÇê“¶ÿ\âôÔ…fŽõ'¼ÜI[’+˜?,³î$Ö5hõ [J[|Ò./Ó—ì:Z ËÞȹà$ÊD…æüÌ~*[Ò,±þº¢u~-å[ÖáÉ£™˜vo"æ‚8­+xÅK ¤é¦›ÚipBjÊ E‹ÒŒçW “qîf¡ßÉRäW¡ZdJ ;BáÌóÀÌ• Êíšl7ºDÖ•›­²³´2.´–Ç ZÙ]ÜK7ÞK†÷2/§¼—ŒÍ—yl’¥ÔàW¶ˆMm&ýò¼‚q®]¨F:Ý—ÊkÛSSüØüé"ß²š¶î†úëVàìn71àÖ`Qd$i0’üS#™½M.C¿QRÆ»fWBÔ|8ÔÁê¹`©uê¬ö6›†qmöN{DBU§!˜?(s8t¯ðZªWP¤¹Î‹ äp&¦ò…Ü¡Ñð½@ã¥å² ÿñË WŸ[Šæ-)ìÜ…õKcYaN´Ë {éÄbòPú‡€5z‘?ϧþ@¾¸*™¦' ,«ŠËQ•nQ›æUÅIý?~YV§~q¬[ 0GÎE,+ÝÖÍt;×N·™ëj%ü%þ>«cO´d{t Í”½DMÕ1 w3‘x ÝбXHÚ2Óvâ¼ «‹¾Ù: Xt½<¹¦â`jhU'¨#H)I+¸­A ¯ä·6NìûðR”©2‹ü¬Òs< $&.ýÁaEx¦.ƒ*šèyeoWGj ,§Xµ=*K`½Z©(@²$ÒjEíÔ¢.V*ŠÎjH«µ·k`­„uéiºL o)1k_p qkÖÜ߃&µÆ¾êÑÜ%iÏã¤A«$L‰èPŽ7n )¶æÿñWmSCST–ЪéFz§º†Åúú•ÔÕjØvÿ>-Ûî¯Ü´FaG+f)Dû>œJ´¹N„I#\®B%Œnšn†!‹£ØƒœÀ(=,ÊDƒåNá1ŸNÓKó]á`^dGƒ±yc~ÆA"‹>Ì–Éáâ»ÝEKüÎɈÜôðì0?j€W¶Géõ4H£‘}¹’*Áð–üàg¥ ª"¶¿yu«§àTž—úœ Ræ5pVÀy ÂÁý€ƒ­R GH=Êu·;jÈVd"'²šáfIº•CÛ­ô×p+Eºõ;16õ Oa4ÛÉR(™Ñ8ÀG¬. @lt¸ fx¤¿ ×Þ †KìàÒí %‚ÌYÑ#açè«c§RíSrÊù¾+š âÁVûÉòzkã¦Ç¬_4¥"Íä$LŒŒ4(\4­ðHy7%ï[ë ;J¢­ØGqøGª +¼]|(¨”5'ϳÂN9Áä“,zލô«d#Ë‹–ãr…Ï`èY7ÿ½H•¸ê!w¾ó›¹t)Êóh¹B꜋¶!ˆëÒ¯ç€_ê?õú2ž¬NŒë­vò^9­OÒ2môsÍ|`é:àkžDãà÷Æ *.bÂø)¶‚û€- ‰¢¬FÁ"*éš,膩$n“ tï(z¯,‰˜¾~‘I)ÝcibÙìz½ä :¾øîœÒ“.„Ú,çUÖĜͣ\ĵ=úP]Ý¥%ÖÎîŸ7©°þ/à zøêÝ{ÎjÎ{ägÒÚ ú„3̘›ÎÁW×d›Z,ÝÒ’ZPõ4(ÊsÃNß u÷)<êã>Í Ed÷ãt…ꢺIBa“¬féMÎvÊ2dž›´Óy¤l~ˆ^‡tJ å#K\’ Yg–æ15–öµÆÑ“}2–A*UÂöü™G4VY¡mYh±½gi:DŽ“ Â'>ç¿qMRžIœ“;1“á‡CŠë\·&&CZI-(,ª» Ç”hçÁdB1 1” ôq†®yØö†ÄéW哳¬kÜ^é“›š<à§ÈͰ² ‹l¢ggMJñ«îNvñÎB%è zr: ït`ïßô ÀÂf!ÇìªÆ Æi¯˜Äë‰Ö_~+$ï9 ”šú¬A‚ C±P+Wx˜Â¨#™"adHd„Q@âu »&$8¦Þ¾¶JàÙÈ¿¡ ©Q,O†Ÿ ÇŠÙópOŠÐ¢Ù—Ÿ(~<¿¹ºö¶Dy[4o| +DBtC&íVeÎÇnˆ ›*+ !Rˆ+Ôû‡€¤|êì›GG»™ÌÝf6ìe-‹ŒyKé°Ý€åÂ[¼—bš³Œ%Ð`EYUØ©.lÚ·v1”ßw üê{Ë禰Aoôö\Ò”ç'½¿êY°¸î©Êdvº3k£ÖZÈVhhutÅQw~•‡yªì6˜¾@[dv¿—‰EùKVšYŽT©VÄbd˜:ú7v¬f¡{9Ò½ÉPhÉ‘-Jê(l}2L«ÞZ$¹(‰H9â°X¶Õ½¨¤—Ј¡Ò;æ–¸VÄ.é†JŒØæ”s’‰#K[8 ž>܇b¼o÷+ô¯ðs LøâÔŽÜS°Æ -7Ë®´ ˜NçœT¿2*WØ6tqÐòcéÃãae$XpÓZTÖ¢ktKø•hðq²œÈ 46c$O4½¥ËÐ˰·=%(EY§fÈÌE/§õt/] kzÛÏŒl9<å ‘/#Á«C/–’€Ia \3È’°;ÓÑüf¸NïÕ\,«÷Qï=úú½XàòƒoÎÞ»´óâÐ"² lþ%\È*$ ¸8YJûc#O,vÏX\†¹µÈ)!)Â:±l¿]Þm­ÉµÙmWêµùPÚ«tÚ| ðv¥>›OÞ.£ÐümЩ·‘Æ%ŸLÚ.£3A¿[²Ê®¼ÅìFµDš%Ð@úm&}\÷`‹ZÊËbšËÖÛŸ¼€ ".Éz³9LPøÊªFƒÎ¶åÑÈ–‡‹$+ÁÒé7«ªÔëŸU‚<£œ]²`êž¿òÒʃÉH.¾XzÐÁíµB(^zh;—Hu³K<‰?bÇË–‰›XÞ«,–ù&ñôŽ–%é“i/…aÉÝYAG#6±à9t3#eb؆>`éñ¦F|ÉH¬se"MD<›L%7š7ŒFc+›i^úGkI„'%Áåšl;QUÞöš\wÁt2˜˜kjKÊ*Ιò€IAe+iñM[g<á9›XjGl¼¢e"^qiO—»P¸*•²Qÿ/sÎ?²Æ,÷Î!Ê–$ÉDm"Ma+-—¹l6…½dûHN£‰tV9kð.¿Är2Nö½; žgœA—CœŽqvƒ‹»tÞØ©UdT]iù³·?›ô Ú!T¯’q°Kþl@j霉y±Û#|Í˲G3m-d§!ÙIÎŒ+™)ñߟµjÿìeµ”ü“<ìY2£ Ï0Vê•‘ÍfTdЯöZGçÍVïŽÐjºçñ0ÕŠµ­È`Ú&ä@Ú[jdzˆ3ë5&dȘC¾S8¿,…3Cyøû­²Eî”ã5T8§„àièOÚò½F•nç“×5}b¹L¢è"Šö[ÂWVc݃IX"Kö:×DµqS»íP<º3Uó¢êÊ®­ûjºÀê¢ôY‡²jÌ6”4q#¢7$*]›=3ïªÁ¸eQð#o]T@üúFÉŽ¸ÎQA¨Ë„ó¢FóöÇFîeòÆF^¨ˆHÊþB½,™ Û¥ù¤ÆC¿‹·§§ŸMr¸þôýóÕ>ÇÝ^§ßüq±ýýãè¸U…¯\^â··» 뻵ÚþÝÙ}¶MÏáSƒÿÿ žïÔáð§íÚ.>ò¶˜çº²]ûOÿGÁõ$.IoÆÐ…¾KßòӼƻXv§yzºêf£ð³¹Y«zãq0†©&ò­²|¾H ³7‚V7ëÓÐ…v{»O†”› =\Úx¢Ö4¬uHÔææIp+âð@؈‡tÍoƒÃdýÑ;4Åzxgñ|á_1›¼i×Ãë<³«ôš ’LÌ=pëb6‡°JÕÍ*&˜zá|2¦ ‰îÃÁ[¼Y5øàã³ » l÷ƶùDÈè~prÄo`ÔguspÕÎkìhóU]ëúݸþïþhö»ÌÂOG×?>phäŸ=}šgÿñ#íÿÓíghÿëÏöþä=}`>œŸÿåößÙþðë?o¦‹¤šL $²ò§xü¯íÕŸn[ãÿÞ^­þ}üÿJåcÎÙY“š'M%6ZÜÀ@A³¶}|Ë®U‡!H½ì_ß„á$ðè}ÿÕy»ÝmñûÃ;˜Wܘ®0Ž»˜ÁµpQmôZ­ËÖo]Ž5XÕà•¦Ô¹üÏóã³>NçM ^ŽzÚ¤œ¼MóždÏñ›?3 5ñŠ(œ Pš~œôÓu¸4É&˜*º L[Zøä8¹ªÒ«Ò–ÜV h±€®~õãÙåd>»ºäù.Åz#,¤ñ|R¾kOü+¯´=î â &þÇ`|# lURT-Júã¨dÞROW®ÀÔ™ÞyñüIBÒM—eä©Aë–Ö{º¹£à=Þ5 wôóÚOõ,4>eÐÚ%3ºÓ"K×w›ÀO%¬Íófž%Åif4ëá"»¢ù:*«û?¢P¼,©¡»J!Ÿ§!àòSÇ“9 «¾Ž²öX¤ÙeM±/– ‹-ôdÜ`g'˜Q~%þ°¿¿—+㊰Lby]Tl°ÚÜ­xÏ˸ß)¤,pÝn .Ú}þਠº–±ˆ幯ƒüYa–Ó™?xÅÿ^¬Y²s **¹-‹æµÅÔ¹kº^}µ¬˜ÝAa²m&R |)ïaG­uÚˆ•e†uþ¿4–ñF9²è+/,R©ÕM2ìÀ)c¾÷ÅÓ^GüeżOðKŸí²«e´¢ôÝêlat ŒñŒ'¦2ŒÊ¾n"«›ƒò= «+2-Ë«  cݵÐZÞiÑ<>Ó™CœÜб]y,¼'Ìè£÷Þ.7^»Ìv=Ç Ç.³bÚÒ¼cTqX7é˜ð2K&ÇešD8ã¤Å#4$I³ë•qßž]ˆI¹¥à·ÀÇ×òÅ-¼¸˜Çãjϧ”ÌY¾ºŽÄ»ÿ~ñ¢t[ñ¶oÅq |˜‹×ÐbCö‡§ ¤t]]W&ó[mà Z0ñš ¢ì`ޏ"šÀ¹Žþ …á“'Œ(•H z^{DÝÓŸ`Q›2Ñ e š½¦vŸè;({Ç{?½Ãïžñ– Ǥ“¤ækÑûì»ùû»(õ´g¾{Í_6Øwó%ëæœ%øžy{¤½5 U¹¤ŽÀc© Ll„wyœtˆÉ[Ì“2Û›&£¢?æåH"¶¯ùæ­ aûšY‡¯)œEÓãÓ¶lm3ß×Ë/­}ßÒ }K³Â0–4¹/ô¦S8Ò#-k»0ã²:|öVZãçt®ÝÞ y{»~yûXF, ¶eêyýôÛØ›U?™Š®dgÛ÷N®5dyrCm¦ù¼ºf-±ßÝrŽ䯱ÀÑ5…:Nôý HÙÁöƒŠ¹í–39¯x÷Å9{A'©vqÃÿA{y¢ÞàRöBÎ(iß«Izc™ûƒ~ÎCæÀ‚‚&¹ˆß –2;6”—Q”ºˆ£YZÚÂ0? «pí¼xÞß½­¿Í¶XWä‰Oæûp„wvC9W9²ÃùWy©£Ú‡w楥ЮØù”º¸ ÏÔ˜Ä÷æ´§d,Å;bEpý^Æ‹°s3Úz«DþjKmïùŒÚ¼ëXxÔúÔW€c ÿ§÷Iÿ_ýäíÿÓÆa2O `Iü_½VÛµöÿŸ=}ö=þï›|J7)-G”xa4 ¼[˜Ëú7é|ê§ÑìÐG­ï?zÇG/q)çýNu»Œˆ¸¤D›zStÍ̘6Š£žAÜÚF…ªNÇ[ÕM´››ZÐÒ3=êÀ3C|ÀyryÖ;=kõV?ÿ8à ƒ£V÷ௗýîé@£é5Tü€€0¡húq€]&áØðŽ.éˆÁ'øÒêõN{ôvøupðk넾ÁèØ¼ê{âÇÊáJ„<ÁcöX<§ÕJÜ•ôÄEïü…wÇwİëȃ¨\Sdž-wd’ô”lYª-Çy)îfó¿}&ü£Ùé¬Áå„?°ÁÄg§ç—‘ãQ†7ñFÔ#!Îüá$R2FóÕ–@‡"œD#V<Ûʈ± £T4ÆäwÿEKMâÅq*0Ô›4tëp¥×yùjÓü²W‡FòƒÉ/ÂL`îy3™â ]Ïæ“ùU„‡бÓü:¢ˆ£GIwÕÀ§#§ÀvïÖŠT(HÔüÊO®ò«ƒþ«|ärÖy,ˆ4ÈKƒM)µ:ð–…˜Fó•O‚+„µt™kE ’´UªôEßE´MÜù•‚hqÞþ+xTü Û°¢¯Ǿ᱌k,_]^t¯.›çƒ>{vöªÃ¾ôOÏ{ÍÿÞ9ùUç"ežCãtýÝÖ®š°;UÙÑÞO÷~OÏ_bÈK«ß<87žÒäºß"‹oaš‘L ãyÌ¥^ÐDåÚéöÆÈµLi˜Í›MP¢tò™ˆò•ÄCZA”q±ØÂ¿F9{¨eq6!T„¬†Ãƒ ™Øñ‡&/Ò5øÇ H(A„¾ïnlÞ§sÜ…ß-{¿¼€¿Û O:LnýɾÇEÈ$úÌã¸ÄšŸº!î 3–iñf µ¨ªÝ0ƒ•e@ã±”ÎyüW.µ|‰+_B½6m5R‡Í=-ß²Y´h²Î˜Ý#·}ϲ]‹¨JRûÞ,ˆhŒIc¯Å²üvY¿þÛ\©Ê­¡LK¸KÍþBçê{Ñíå½Êy>¸ðÒ2óã¿¥´¬^¾6ïÓÁtôÚ&†uàßÖ€CCü©!~ë%kÑ`WòÛØBr7ºI“Á¼q¹¿)bi_d­‹£d„¿ä+´=t¹ ¿å;nŽ$"û­^ƒ…òÄÅhÂbÑK¦,õ* R¶@›ɇ*Ryþ> ¡Ã0Z ¼àŽ7*âX>Ñßyy0»öÈÄÙÛ\ܪ –ð»¥:ó¸—!¢+d¨n&ÀÞxĉyü(ŠÁVÓ­Q/X.;Î_·ùûP½Õ¢1Ný7Mñ—µªsŽr……ï YÑ”Öêv”¤ýx$j‡Ñú!h•ø½l‰‘[:ƒ0ÊçôxvùtkS0Ävؼ:CE‰ïð4ÄN‰ØÛaÍi ÒºËbM²W}“ÐßÈ1žh×/šVÓ`jÿ°¹Ï¸ØÊiž‚:¨CÆuE÷V®Âú¼w{w䮀l´„»2 «ñæ-±Ì𷂝©¿ðôjôZ<¬Y®)¥/aâ.ÿöø2í6SÅʧ© š<5†÷÷ Nè¢0H^2V„è—!\¬ˆàìõìøæS­ï/ä81á¢dº3.Ë(Ð ÅSg ÝäȯDx¶¤Ì·—Õóÿ 3ªLÊ"¤Í¦iXã&T^î3³î,6,?—+¼‹ª)„ØûdÛÓæÆ§¹ÛÙý•o…J!øÃ¥¼ÝÉ=nU¶Ü*å„JB3qËÔEÐZÔT/¶4yê v‡y“2BÇ*}6+ïl›Ì-Ò"7ÂσÙóƒ‚ö`AÒŠ%UÍCSW-¶°4‡ò›ßÕæB+Äï0OV›:»ÓAK¢VèJ‘o¸Ä=LJ²§ä¹ý¬°½³d0žGö:W)«Ë›k¼¶É@g?çÐqQ9Á9q9!ŠSÆè¾'¼€ü°Œmà0êæûdA ‰‘‹8üìd*\É€Ñ*ÙùMy”j>ʉÉÐ QÖX‰])5Èð¢ëhæå–8©Ky é@ßMæâìžÅjà·gR%åõ‹w„TIõ¾&\}åeâ¸RÓß׿¸x?wèýÛd®³óKƒý’@ö ÿÛu¤š³|6!”ó†Ãf„²ëªU»Rg–vf¡:˜€ eꢶ<5Ôdæ®í²:òkc¥}í'×™mab‹Ïq ‚ß—úI”5)»ORè°ò¼‡:ìë‘DÞ›ˆ5½è¨‹Û‡œµöâW†2>æ&7ˆ&¾"NLJ°`Å÷¡u¥ÑÈ“PŽƒð< zrXX|‡á"ç™7ì:qÈÅ]¹I辇x¾á¡r)^Ýð#Å‘¸8D[laxø¼:/ΕÞÄéÛŠvøìMì¿UùyHxi Jp§E6ç¢%æú¥±{=D嬚¸Í.tÐúÉ-…Q‰‡¤ÎZÊ• ¼ÊrÈŽŽQÅP.ú!³Bc¡I%¹~ëÀꡉRáP°J•ß3õÔ0áE–ßãAÿ¬GMhàP\›àÒ¬ M8J¤©­³Z<$‘ƒ‡ÁÑú84/‚®WÁ>¡1Õ¬‚›ƒk×ôNþÂþchúÅAïõ2ÕðlÝè.𝥾gýF½y«jФ¼o4a±‘‘÷b»³óœ™õuʶ*lͦV•Îo-Ìn7¡¬;¾+kx.ÉF0€õFý$Îï”"Z_ ‹VŠô×ì\?G¤Ž Ú´„ïñ°øqå†òRc•ßaMÙ² Ðˉ±ÈyeïØZš•kA­6ìʼ$ò“KÜ }¡7 cŒ±>I¶WCºä¯èk4íxkö –ŸI«”c­Ûw¡Ñ¯BPÀ7¶æP¦“†V'•‰…CSsp ž[8̦²Û‘ ŒúAžYU‚Ï–Âq\åð[¦tÄp”‹Œ/ß®Þãñ"$êòê—Ùå³}Ðô~ïÛÛ«÷EâjåÎ(¡¿joô²Ý±]Ð5­ô²R¦ÝËØ¥Ðê•Zç’²êizGk6e)Ÿùó} Å6R>˜ÂÊûÉ:õ²­^¶3/›Mù²Ù4ß^Ú¼l±ÙÕr+®}Ñ£+µ´Ü²dJŒ¾Üù5ØÚ y¾¾Ÿ¡­D–…ßDö":«ñTàÚ,0×@0¦SÈ„H}Œ¸™E:\ òþç¯"à^ÀòRÒZ´Ï×v,JsËÙª¶„ö¸˜0u"¢Ï'°Ó¸´p©l‘Õ×bøQ`BièXr #4 n{x D¹ìH_csA­±hÇÿ7 â¿0m=í/¶>¤_¶$þg§öÔŒÿªo?Ûyú=þë[|Xü—ÝÔya`»ÞίghH½Òuš.öüñöö¶:Jª7£kè#Wój0¾ùñ¿ÿë:¦¸¢]]§ Þ~Äï1ç,£N9ÓGx­kHIoùm 21ðeç#æ0χ/"ÊÐd»õ—xÿ;xO=·àD«ÕWÁbF’x-'!Ób¹Ú/=\i<ôN»—íîéÅåËÞÁÙ+ÏÀe‡6ðX½”‡þŒÝ'@Qü:m ¯SÕjL—™TyÖtüÁçŠø•§ÝfW—x3n9ªŽÂ«2–Âé²’èÂvùDïžØ—&R¿¹ñä…w—¤Ó}Š-©Â7,bt0Í ~ å7~¯Ž…#…²>Wñgû#Ì$JÒÏú#”r3‹R1½Ð¢uýóJ›k5ÞWk=­É¨ Ykn² A‡â‰lö±´þkóÎèÛÌ©Ã)®Cýék-$— Ò×Ô ÚÞÀ¢yEãʦ}M ú­ÕtåXG]W¶*žˆy7”¢‹KV µø·2i9ü&€Šî{š¦6Ä´{Œv§¿T{È%› Y°ŠqU…º.ƒ&#€ŠtEEmqÅ’hÐýr«N£‡$xD/ä<e~òÄv#<Pœ?ËrGÄ-·Àh" ÊÁ0˜ ä b|É-¡ö’÷bh‘|ßcƒá¾àœòÊì—œ|68ýjÁ[÷ðw.‚Ãß[üÛ«ßåùè@~.~—_Ä££–¤u.IÈoçA|;bßT£ƒÖúƒC_ZâÛ+ùE>º_ä£#ùíð\"ÈoòÛ‘Y|hH¦Ýç\¶û¢^í#ùE>êŸËg5«6‚~“ü ŠøM=쟫§&ÑÑt!(6Ïxw8>ëš%kPx—á)W4¼ÖФ+^äIë%ƒƒBÿP}}¥¾rQ7OÝßõïGfñÙö1ïµmY^æ+ž©¯xs®öU<îõÏûƒÎ…öõwõýHû*·;[„!Ù≱´s^[¼†YôÉÎo‚×££¾ì+Ⱦí; ÚQPEkÔŽµr5Ê'ø‰¢!œèý–Ùüù(šb¤x5ºBéX$o=D¦…E/íçó a¢¯tu‘mA IJv1]%ûF©)Õ×#ùõÕ…ö•+9ÈïB~;RÏÔë#þõà„¿>å*õZ|9‘¯NÄ£Ö_~“XMÆ¿ôw}Á[¿'žôä“ùèà([ýH«‡—„Y ”,:M%‚ŽäS(©}ùë´×‘_ú²zõ­¯øê(ÆÌ„1-×˰{qrÌ@{Ý£fW}í9°" ­£ð.:ljØÑˆtš=í»úzl²4ÚÒìɦjöD[5{¯Õ× àD=–íIšŠDÓTþ(•œ›“—¡\lŠÎ.Ì’è+\ÝÚ¯Åsþå7þ÷ôµQä‡ ÖJíŸîír°ßÄ·æøÖ?Ý©‹·â[ó€}ãÞÐ%óJÖ(_?c™Nß}ãÕ¥^<ïã(†áeY?!ö¾Ã¾\#pû 8´ Ò!£>íþ€h'é> —mó€´Û‚xÈ©‡ëSgÒ…O^1´_O!Î>~«Ë¿7â&W–sÚ¢'œ:íÒ+êÔ™V§³ÏdA²hG‰«Èhõ2£©'È‚©Aforv4Pr]P‰épüxTü«W¢àŽ]r´VÑE((RäÃ"Á Ûg—Zs9Õ[Í”`Û&]½ÐA/Ìh kénÈ•×ÕÁ³D¤ò j–®†\YÔVb3«¬FQ;vY;TX8ZV×fÓª,ç QÒ}fÄ1~I}ò¯ÿ¸ÙcÆÉÕ†Ã,à £ Ï©­‹8¯-ñòÉÇ£°¼\¼Õ,Ž´ÆÍ×¹¬¯EjpAtÒ9ë‡.Ü$²ºÐàh}œÃ&k"ôŠÝ½ t_á+SÑý•÷x ÂÏíöV&+ ±oûz*Ú à4‰ “¡¯x8Æ”§¶@np=Aýd§Õ2ÅŒ±ìô2ROðÀ²öûŒ%ô“®Ò6J…ÛI5‚«dßÓJÑdŒµgœ,%s_…N3#Ê»}{©³OTìdÉû)‹ü”c( ´Lâ=.[Ðã$ÍeÂ³ÉÆ£ÕS0ô¸ŽÄ,œ2´E¡÷ û„G0€þ­;bô–¡*TÕhߨþò÷µ€Ÿªº7–#³5KZãwt·‚·ÿÐŽ%n°Za=TRÈ‹zHG3§¬÷—ÚñÌ-+ä…}¹#ºr¡lfÿaÜRá"æ”Åæxûî¤f\Ô¢ò#“û¹¬9ð™õþû°no²ÈâãËÚµÀ]kLµ»ÿî-/Wórs ­Ò¾ØëÍ+Çì*÷õ‚ó¨›ã½â• Þ±J~¹ÈCÎS‘)ˆ•=æzSÜ9Ú_݃Î#“â^ÓþêuPÐYÑÃÎoýøCÝäÜaèvô!¯ª_F:½Eº+z×y4Æ_Nc8"•x =·I¼j1K=ø¼2°·GŸ×¿€sDz0?O‹æ7ñˆlr.D4{Wô~Á†êÌk;ÖŽeè;ÝÆ§¬EÛå$=n²À3jëÍaáözÃsûÞÙ÷ÌÖù÷­ñï[ãß·ÆMj߷Ɖï[ãß·ÆÅ×ï[ãß·Æ¿oó·ß·Æ½ï[ãß·Æ¿o»ZíûÖ¸[Y¿oßÿ¾5þ}küûÖø·Üoˆ7^W´â$ÔŸ¶Åcv‘?îÔãÐx.áùZ|E’xÉgò%™\ãed¿íˆ×b*$_3gÀ|eÞK|±+§ø,Â,DÛ±k×6ªÚõk”ëÖûÉâÈ&ÀG%0ek«â-Ž9òmiïp`‘/Cëe[{ɶn´¶Ç!Bµ3n¾è- F_¼Loµ7lÝŽõÇGâñp¤=>lªÇ“ØxÑ•œ õçRH¸a Io,̲5~[v+x üÚKv‹ ½ZЇ<Ô…kEù?Ðd|ýóŸµg{Û™óŸÛßó|“Ï¿ØùO:Ç©ÎF³ÑšÅ“Ç>qø@ÏÓ9à ‚n Š’ëùíË3F\~rq— ºK4»ÒÚë"4›k"d*·ã¸u¼.Sƒ^w]—H—b½<»€ñ„®'ÍE|l\JôGžÜˆP³ù@„ ˆ´ßCUÚõ¡H±ö~jñv¶Šw(yGÎËIÁ»QZð¦-vÇ&—ø±ÇÝwd’Õpì¾½ ŽÝ½WÁqš¯eH™N¾w™~¾Vžõt#’£b\HhÚq}#È@݈§¬ž1Ô5È09Yát›ƒi{JqÅK?Ò]?áŒ~±{£J0ó)y? 'É´ÿq–úªÑpz™ÐW{B–û¡„è˜ë¼šÎû¤ü^¼22%N/mÅ[Þß34ÊË©”Eí¤—išK«îá7¨{¸nÝǬ»fá­ºdÃoâ­ÐfÎõ¡À*²&KS·µŠX>y¥çi²2ÎOªjéÊHR¦è—c;Å cy=nkêjê{h w¹%‚<&÷+4§Tkd4 ¦D°[f¥v°ŠQæËÃi©Ã’íí€mØ.„±JZ}Ä„ÃñIÚªm‘ÄQI€ÚÍÿÜ,‡"Y¼Ýp,€$¸CâÛe}6`ÄPÍ‚[üEwöÝÍüiÐØ˜­Š7‹FïØïdoÉåCQÜ2"¢QuB|dÄÔ xü‘œ$Wƒ’ûÄk} ôx…Â(NÒ³$¸ã-¡õ§{úKœt]R`Ù£V¿‰‹Ü6¶ñN‘«ëÆœì44¨—gxs}èßLÒßüÉM40§³¥¢t­FpEWµ€NòîÒ`j¨ˆ¶h˜ú™!7šßÌÀQlÄAèmWÔÕ­âÁâúc‚³O(2¡g¿~û·Å-,ÔTTûvníwê¼ú{;Ùê·Ï2Üe¥QPýv^õÛß¶ú”ÇÙYý½]^ýgŽÖo6¿¬úˆï¬¾²%ߤú™î®êÿL4m[´?@™Òg½5ÓøM*޶6§âµíÝLÍ5@Àü²¶'N!hFÿÛ(?#÷“¢~a îN hßF®Ak‰,ÊÊ@q‹Á©¿¦$h€ÐG Mß”2ÖåŠýÔoÚgå ‹%Ëfr›‹$¸1aFÈ¢I]DôÓ%TI¤:!!U½mËo9–þ”¦ºÜ±0W:˜ôƒ³±ÊÝ,ZÐÈ{%‘ì+e`³ï” rT]ÓñÒPWí=ÖZ›j·¼<Xð«-ž¶õ§Ä;ÝëÞÔž2¶ñ±¶µ?Ëø¾éT»D¾êo$¯ô’ý’kc©?z·Hc^ð]“‘Lébñ¢þ\¼ Ù+ö¦WÑ{rmL@Ëg(/¯‘$>ÑJº£T{ú“{˨`ÿ§ÿ8‹ç‹/ÞZ’ÿ½¾½S·ó¿×ŸÖ¿ïÿ|‹Ëÿn4u^ò÷ºwˆ«|]˜T¼îÍ¤á ‚Ñõl>™_EAÂñZÒØÇÛP€æM0}ô¢Y8§>Û ÛDgóÛ >kz~<ºŽÒ€&FœÂ“'˜6>˜± íè’d³$Î1ig•ðÜR»×úËyë¤ù×˳ÞéY«7è´´åEsÖѲgoŠ.³¨a—ƒ2†þ0šDéÇê"ˆ©¦5ÙOó`ž*˜Ÿò`~ÚÖʲüÉ­ÿ1Ù³]hv¯)ÂÐ} ìÞø+i² òŠh«õ[bÅEÅXî è.ÜÍ £Jˆs hª«ôÚ¸>zÎC+UGø7t•Ž; Þƒ=…N0›Ïž°+™Ié<ý2v΋q÷«ÉkµäXÎn¾ú·E¼ã+ÔzðËaïà¤ù óÐó½y¨»ì^S\ªÇŸXø >TP·{ÊLŠ{“H®†0#‚[››ß“iÿoù,Ëÿý¥w¿àgÉø¿½»ÿkµíïãÿ·ø°ñÿ›ÞýR¶öåÅtu‹v…†P|’Þ$xOx‘•é78<¼IJ$nñ…ç”e‹ •…Oî&TÄÅï¬ÚéÚeë—Òâoyn¨q&/æ•r‘O2ÍÁÎNˆöh÷ðÈ^1ôŽUKH6ŠKZ¥BÑí#<*L¥­!‡pFb+°Fy+PéPÉõZ!´›!”í åÒ$TÅ“»é{rù¾ºTÛE衆ß¾ûë}´ñŸ‡æ?|Åãÿ³úÓÝš5þïìí~ÿ¿É‡ÿ cðÿÂó0Å‹öã Ž`6ÏVó»þäQB¹Ò¡ŽŽwíƒa˜Í½h ãýíµŸ]ݽôÆs/€Ô[Ðâãä#LÐgRœ¦¿÷ÞÌÓ`ßë<"b·8 C‰“yšÈƒ‚Þ»·û„†mvê ø]€EˆÊ)ö˜r-¥8˜/æx†>¹Y,æq*Šê<šÂ¯çów^k_Öô@ÛžðZ³k6ÂzC­é0 –ìvhd‰ùLŽqqàÎ] }Û/k—↡däO|¶51Œ®p­"ògýž w´Ú NK0ùñÍyì_lX£=ÓßìÔߢÀövÙ9R?Ák^é2EÉâ £Ðû!'ÖדÙ‹õšñ’ž¼±‘EínÅ[wDT~òhÓößÃ%l…ÃVhsæpE›Æÿ>½yN\LñØ`üwW\ð'iøïÉ"#sc·_­U–ÿR°oq¬/Åö. íý¤šyY$/¯ Ûÿ÷éªÆsÏ¿ºŠƒ+è§-)—iždÙFú¿cœ­ —Gƒbq3d˜ÂËÆ>úF;(yí­Œ&àÛì{Q.߈mv)à¶|o‹ê ¼P[:©/C7ž‘`ŸÍð .Y¿t8oçYÐFz¸E/é¡:ÔÞ"!¨WpÄÚqPFÃÄž‰ûœp»x6ÔŽ[üøOÎi s÷³7è²+íè»HUŸèé'ç=Ú³“0nlàj+;$8ñ7ñbž6Ïž¨‘aYÖ9IærdH˜3,"Þèñ<$‘îÑF’ðaLÆ‹cêi!ô×­&§èy2dR&…Ô{»L ùï/Ï üÿûyyöâÑ#¯„÷èbœî˳2L€&û¨w/ÏÞJT;o$áÂ_BŽRáGÙc¸‚Šì’Ý‘bIP¹ì§ÇþEDÛÀQ.wq´À¯¾Ç ¯Óƒ–Ë›ºd×ÌTi Vê²Ri)ÿEùðšhù*ÿ½­¿È&ªDLžÒ3ÓSzVV!ì]sü#Û'PË):.äÊ hÁ˜†Ñ æÏøKærŽ;– ª÷bÄA}­)ú Q Žók` ‹‡øÆWô„†Vå#õNyüIY¯SÞÇnL¯…úÝ=ü‹‚RR?¦™ŒôËfžPJvø{+·PÊÆ)$Ld¯ýI¨6b–ÑæÙ@ÝïòO®‚aìG£BÊù”/L–mnóëzQÀîQË :žßàHJ´ƒ)Ø]P€%-çI‡8¥ËéASÀÃîyà‰v^ÿðÃË @÷åîÏ™ª~½2è¿.Œw<‡jÆPbïùvãs8Q™Us^¾*zW„xQô®ñ¨%Eâñô­úÏWæÏ óç‘S¡ìS,«³d‘ã5çåQÑ;ƒeÊ«ÿÌaJkž\¶<-Wlîë<Ö<‘SVyÜ"µ¬ù€1˜áp4] {Íã3Oe˜ÍTƒCQ’Yoûv§Ž} ºôˆqQï¤T´€°Mðf¦PV0š€ñA³Tf6[dç¤õ_lßÖ¶ws[޲Ü"ÐOOwQÖõq«mÆ,nžÉâØ¯»^Ïb£ý#k²„ÂQx¾—¥° ›¥àìú ¹˜Þ$ðÉ/Fó˜¬Få¨<}^@E7:±šŠhΣñÎ e“µ{½}»·SÙ¾}VÏ=ïÇ k°»ÛE°‡} ¶ÎÄå&h\ÛÙ+Æ$ÅåBŽ)¡1Â>ýi)l¯¦q\«—Iˆ14ÌØKç™Å”üöõx¢dØn™·òì}§H.â“ bU¤~W¤ž~©#ÅÕsdË$•§rNJ¿k”žÞŸRÛàiwÏ DSË,­/TÚrú犘fZS¦ZþqW–‡ZƒÍW%ªÖ`ŸÂu~Ótåy!,&¦V ½”_ v)¿ìR~,çwi‹È6©¸Gžu‹µÊ15‹’ßOÇEzoO±¿ œRQ/¸×©/?96tj§ $¸çrpC w ZU‚kÔ—€÷[]ü&%³CÑ^3&8u/`t]0º‡Ãíc·Ùâ|ýã£nx¢t·­à¶3p,áj ®öGí?L¸õ2¬«‹]F DÍKD"Ã4•Qe‹­ÄðCJ^ûc»ö±Àè±%XõaÈÛyÛü‰…FFX8±XbåWF£²Dý”ØÖ9ýK+Œ$fQ$~)ä—Êç4ÒøH5I£¶ Äl(>j’b¹i48ŠšäÃACiªôÁ™5Â5ÐÐ"Êß·ÁS0g­1ó‰ø&ûË~º}oËqƳoäGî <rð/=€¿‘ç™JÙí kw›":o†âˆÉ|º±?CúÇœõók¨°§ˆ7½™¤ÑbòJƒ¯“[¿‘—E;bh;:š>3 Œã'žÍ/]7€žåÒ‰K…~}[„ŽÓ•ZÍSôÚƒ1#sã&ƒ—0©ýDtÆÑûh,Øß€_¬|7æÃ|þ“†ÉêO þ¸øGü§?Y%+Ö‰ƒ›8…gn$d$ÌÁ‰P·çHÅŸaÍ7ðü—Q³Sš`¡»»B9ç1 À?ó8ÊPÍpðÚÛ eGà üóÁà'Œ ÿLêþ ×–L(A´V—LÀ|Õjýå7Q/ üã}¦òMÚãûLÞ-æðÄd¢“`Š'’ØÞŒòÚó´×ä‚©Õ•`rÁNÈA©’ߥž|…8ý S®–Éäv#žÜF³©'ò™…§wÊd2ìq»ÇK}º³§Ð)4]”³Îà,»w$°²±Òã1§áâà€õÅg?ÕmjÍ’“ñoéÛ.áõœÆn>± Âþ‘Dœ–=ršö•,;º´ÛÞ!þj»Jß–ÚvºÄ„°žêXO¨vh&¼'ˆ%Ž1¡Ó¼çë ’á¿EÅÛB£QݲÌIž5×­0´„áýÄÐTíž®]¹Ó^GtO™¡<;„—µ0è§Z%äØ.ÖXõUL×kV„è~¬ŬBé±Ùé;Ä×?ü€ú´fÇ/À]±ó»)¬Ñÿ‹¬f2Ö Ã~¸;²n Š™ƒŒ5è cw_K «¤íh©½íK04_$?ä–ÑúsÚ# gÍÝÄ––(S¶l|¥§~ò¥?›:Õ€îò¬=/Ÿ¯ÈbŒ]2´BñNPשâ;Í®.LýŽ"ýõ›Q±y晵É‹S°ûìÉîO®ií¦;Š˜x¦ö¹«¸ƒX¥ú™sÄùèçü”†W0¹9`ŸÚÉ¿ÎB“—ƒkŽO½ ø‰ƒ•F}'Kü$Kœü4¿Y¾ñ•M:RYhdÄv_22j2—'+Q`Ì, lʦ¢X—hfG+d§ZhélwàmMÒ-¯”ò¶®è[ë/ÞVð-šol%ó-b-Þ¶Vº³ýR`¶[³}¾±u3ã˜5C“àQןìc [èÇø§Óî™—âv>ÛyS ^S\ïÞtLç³h”h¬?¦92'ïz~KǬY„Ý$­xWð_ð Æ&×ó› FÔÍ'>î˜óà6@fPÖd>‡x@!³wB¾ðÄÀX`´VˆÛ qÂ6ò‡!ø¸Æî Å!†‰Ôª:¾!Í×Rš­×Bœ¿½â<…oÐZûkÍ- úñ7{Ñ¥^4ÎÜL§˜Ñâ 'ó[Œ(+Ø_ÁÀÈø®Ž×„Ñ¢³CŰx‘˜“#v\Âq?…Îߨ[/)S¼Y˼Àìß›Muenl•L<Š{&ó€ÖM€Ô)í: W¼—mÊÔ„q¢Ÿ:c9.Éë¦R†EM¡ï¿´*¸D„;'÷÷*qºÿ´ûøÏþù0߯mWbvWcñ* •kˆXCÄ*¬É;Å‘¦fI‰QÒ”þ ðçÈÂó ¼X 3$Ô0¨PW´hé±Ô}Ü—5ÿD??p²˜‰¿<óˆ)öwÈþ~˜/¸jíÏòX“š)oQóØÚ€WÛ“¢#Ä 3È Ö‰Ýϼ!…»Ép­‚Hd]ÙÊä¸2[‹’¥N•Å€ÅÃJ§Ú=ü­ÿ10Bð jÀDæÙg#2üãƒi€2TZå\*?=UT‚B2¯Š˜©?ûé3‘¹^ÂÌ«"fêX'Ne 3Ìììîp2þf ˜ÙyZ“TŠ™¹(”ÌðíÉ\If§¦¨3sÔ*`æÙO¼™ÆÄ™vIf,5N~8ÖH°R› Ì@ª™Ô§ÏjÀyÙþœ)ýUaé»Û¥¿Z³ôº£ôƒÂÒëE¥¬Wún¶ô‹bÉ•~±fÝ÷4Ž4Y{uGëmn8:Ôy?{*:Ô uþïEø5Ñ!ÿÈÿ(ÂúTö!…?–Åæ·|MÉ~C5WÊÎN¦¹ÊúPgmZ#^hyaºß^yÈ 1ÏFuyb‹™?æmêpÌ Wó¬l÷™ùâ2­&Üy*šiüvŸÐTòQ K«Y€ZTêÞö³"Ôó"ÔšŽ:–ÒѵŽ76—wEhìs3ÒÉ`5¨¨®nÛ(YúÑJ¥?Ýv”~´fé{ŽÒ­—SzÍÝå„wI¡Zg£ß†™¬â_z:úXó–—z˜b‹¹‚‡I$ÛÝ’´ÐÅì™æs10JÊy©=5Æ —©~n}§÷UQ¹»Z·qá•»[ÌóEQ¹5M{\¸EåÖžþT„{T„ûSýYÆ#`M#qÆG*úÎóì0n6 hÇ‘ý œ>{p”÷ª°¼Ý]Wy¯V,¯–u÷X[TÐ᧘mPX “Ý£bli~ž¯4nÛ¶$Ì“0Yeäö |5v'«Ý–9É ®0xKs®nNl-—Ã7—DhêùÞ^þ LÁäå"ägµ"ä£Â’ŸÕóbŠD/*ùÙÓŸìáˆWU~$ò˜#«©žyU³¸@Îjd­î`!3 ç°°ëbÁ’—³°[<´Ò¦Ä4Hµ]ÔO,ìý‘>¾Š®À×T.÷Ÿ6¶+üŽw¯VQ·Ô{?Uzæ*“ w‡­“(`ÔçL^M|gE|uªš Uå„qfø…EމoGâÛ« õíÜûdª"…[}b_ŽÄãØÔÀX𖪔eÜ€ýmÏÁÓOñÔÉ»Ùü·üd>K*™õê˜%Aˆ}k_ö1íëÊ~`½Ô è’"“7lÞ»2–ÍvˆôúDÓ•:2kƒÉŠ„ˆæè4e3tÊ’¯è‘UˆÞ§‘ö×Ñ- n:%Ør ðq1ø·n i¢«(W…98Xa¤†óIàt $†3Y†2ç×$”D9%ÝDe i¢°n ¬"WZiœðøžh޽­9êСÏÜpÈþì>"x5Ùªù…1ïB/JeóÚgßÙò#oŽ “ ¥¤S%:¥ñaŽYïQ¼fª¥“O “—¶o?ì„þÔöX›¢‘ [ö§¶©Ö ò˜2o…Б·o·qk­qo~~˜7>ÌaVѰ†„O¬Ð¡³Ð~6hïÁŠ½Ì búN&£ÍHsÊŒ°NP¢‹„î6F™FÕÆyÞšþmJ¹ »}½¼ {iÂq‚ a÷3ë¿TÀ¡OòeråŠCð ÔrZkEá¦Aì–îï3ì‡)æÑý;Ð5 GË*ô‰oúßFº–lŒâ ¼E.F#–tLÎ(ö~ùÈÊÞŸ5áSò ½1H)0¸À6äjw@G0H-^Ò÷ó%ZÁuæWœâ÷³}Aº ·ýRÃm·nûÜûZÃm½fÈøã·× ÷ôµ[v q¤úÓ>ÿQ¦•¡_u·M:ÀYãOÕMЦŸGàáþ`ø¹’é3ÐÈÔ“'ïx^E]]ÓØ_xsë\ò'/½5ß ï£.ç-Æ4v-w Õ¦HYäÂá?½½Kç|ØÌ8´I„£€¡QúÈ)Ã@/wkd@’)»êë:> ¥×©öÞs»ÞcYïúºõ¯[ﱫÞã¼zSIÇ"³ZÜã'o:ŠCéÄýdy C0M§{nùDãÁÄcÌ‹`¹ò-j;µk;ue†³)ŸÊV„é•hê}úD?žV«?©”=Ç)¼uMŸá1. õÜ{f5!â|ûg=Ó½ädÙëF©„\©¹13iOÁ¤yò 1XVäC›¯ÔÅ×ÎÎO6_!ñ•æðÅȲ×kñ¥5»¨𾦠r(Ûýyeísõ¬ïV|_8ïV´"RÙë+`eyêˆê²[×ùI†ö*CºDèƒÙåyÿGÿ’=þèGèHÂþÄŸ]ÅAøãäÖ?T¯Ó)V=ýãÜ0Ë=ëâžèëžðÚ½KZº¼³â]Zû'éíȦ“,£S{Ê Õx`‰Œxïã’õu0Áeº÷A&OfY;i}@¤æùœ=*Ï…æ‹È™÷Ù°vË}Ó•4sôÇÁÄÇpø’Ê1?Áü’˜¨3/%f¬|âý0™ÊÞ¿ÀôuMÝE=½xFê!&¾R=º‘Š]J™bfÛ„VêÑ"˜°ô×a4‹”ˆ’Ñu0¾WW¢²Œœ×æ’ônfêˆB$ó›x„yú’–KqLY‚ÚÉ OG+¾Lo&ìË8zO_Ø}¢€£(¤LÒ)e¤ãF,.NMF‹Q&|—5{uïM•]ïPtÅ«aÉo‰"%ÛZUæH«5PïÇÑüF\ße‹¯Iyœž±ÎÚðÞõ·L±>ø¡!ÞÿýïÈÓ==8"" X7aúƒÓ^ˤƒÕãÿY…¶E© 8Ì”Jë{f©Ø$üǂČE$´YÿyütÛf÷=e³v}{^)Ò|t·âètв㱕…4ôfÁ(H?þø3¼bà}@¼YDx@DØ2@Ù œ¶ª„· š§ß:®]­N“±“›)f6‡Y»Â)å-ˆº×C—/‡æ­†._ ½ÿZ¨¡ÑÍÖæ—tIÏ<^âË>” Œî¯LÖ¢m&ÔðT4IÉï¨È$ÒÀRÁ;l˜"‘Ѷ‡Òp^ñ†aÅË4Ï„ï—4Ü0,g²8•ä]¾óÇKeCž¸ýÇrGÝá,½ŸØ·y—•mzN¢ó“)‰ ¹¶Áf lk÷ñ(Þòþn&¢ŸÁƒ­?ãcaz.aofÙ"ŠL'çò!­HRö-Ì(Ÿj ñIO(ݾ ­7<Á¾²Þ±ðÄSžÏgGF¬­ñ[ü®ñìU(ñWŸ3ûJ¥bÒeïï™5uD8xº%/=PMRz$þè±JåMâ=n•Ôd†YTo«âm1›z‰óQx¥Û,À@oOJ¯‘Ã<Ø%ðñ=kF\Wa«eìùP/BPKäK±N=ø%]’-o1~ø)P92r?G;µ)ÊëR´ÉxCÐÉ[g¹ÄÁËæIÅå$“ò‰›éÄ7EjõÔ(Éód œ¿ø[úKœ¾¨x¿¨Ú¼øð¬ëô±ÏÊI~·-¸ [!²Õ¾/[¡ÉW˜Ã—ê_™Ó’³þ€]¸šîSŒ!MK¾@`,õz’ ‰%K$–‰“×k ÎBÎZ˜|‘Ð,ÞÂe¼e£n%sç'½¿{*$Ò¥kzxø½×f‘öX§E»ýßÿK˸αL±•^v)1øê«›çõÏ,cýÁEóµÙ9Œ\hQ¸*Ý$à ²cv•«Î®‰Çþb“-+¶dpA³°­\B­‘Þ¢¥N"lt® †'X°ã(ÓÖ28Z­èqqÑZˆŠ0ÇPvs>KãùDO“xO¼ƒZå‚vû(nüóW†ã†\âFŒŠïó¥¨É»F÷Wei›Ý^1ë’Y¼i’ìÓ <]–$®Y|Oâ|εN@Áù¬Û wNùñ’U™J6w“h%`ÃtñÂ9°Õ«ð±MbÀ?Ý_ÙjBãÍ[=4) —ã ÜoÒUVI’»Iýgfö=ºI“Á|ß³%꼂Šê:‰'4`÷rAqI þ)óßP^R‚ÄoFŸãh†\â¦ÀÀP ­% 46§ç½&s‰”µ£ËøÀ¶Ð¦…Fy CµšÝrçä×Ôhö®ñŒ»õ¼Åu”‹¦]0Þ?ÛºÚ5™ôÁ®I¥.¹ê€ëƒj¯õ²´S¯ðûùç“…!.[‹N·ãEté± ¯v­8ÂÁa« ¿d¶Ýô/p1¿ÿ÷Ãó½¿ZtËïÓ§9÷ÿÒGÞÿûtûÙŸ¶kõz½ö'ïéWãHûü/¿ÿWkÿØÿJ*pöß«ï|oÿoñ1Ûþô‚[˜ÉÕ$ºz¨2ŠïÿÞÞ~úlO»ÿÞמîÔëßïÿþŒ8õiˆ} mߺ€Is c# sÐn‚õ¼}„èœôéþSõ¦yoš­n·yxÐïôk@ò=MI§Î“`;U=k"øk‡â²PñíÉ Ȥr„_B%|fÂ/å†<„ÿéÖ/êÿӂΰާ¸ÿן>ƒwvÿßyö½ÿ‹L˜ÌFÇ›e¹n{þ fÊ‹kßÈsʯ³ožžýµ×yùjà•Fe¯öÓOϼCTtpºâžbYæ1ÙF¯DsqÍ”ÙwÍ술Íò4Ë´90ÓiÚVȲ;´¯I`Óä ^‚¢Gɨ…OŽ“«*½*m)æ¶*Hþ»6£ðJ¸Å„9Rx·39÷â;»Ö˜ï8óKŠc¾% Ý>ñ§As>RâJœ”ùíô0eëÚŠ í‹;é>cv•1Íi«ƒmÚg×àÑp¢Ñ„DL›Ü¸¸è°*¢9 ioxXa+W/ù“ s“ EþÐ6"Ú£F–UÅ'"@pJ%…³óþ«.½^ˆßÆ€X¶Á/,ð‹bðC ü°üôŒsèÓ³|Øvp6ÐHÓïbð®^PO|Ý·Àû…àñbÚé"ÊÝ#£–ð³¸k±Ñ=ê›ÀElœ7Ouhü½ü̆/jMxÝÑáñ÷ð3¾ˆþ¹]Àù’Î3Eœ/+£uòÛ]ÌТhÝQ{Üào—ôÉöÒÑ¢½òpaÛÉv'C\§ÛY0fuÇ]Ñ3vŸ—•F¿×DKUÄ’Ý ×â!Œ 2hÕI½mH£BEö¿ÝÁ“>w!¾M[{Û0’Ï' 2€ñÄDBC~¬ÕA5‹€lhð\äY;|‡Œë°¤¦¬”h~tÐF”ÃЗst®äC£V–‘s[.jˆ[«•Á[¸‹*Œ„äT+‡Þ78DCÁ-©žŠ±a~Ëéo|X5úžö¦!_/ër4—VSQ+X§²!ž£89ÁÈÌÎéÉ_‰>ÓTvÃ3žc´‚šwË9·hDÏó1;-¯àaš þf€G­öåy¿u‡«Æï"`ž½<«ÐÌg€L~ò>ç| šRâ^†ŽñR£/(‡J÷ÙºpÍìÃü™¨cjŸýƒqî–„k“!‡ña¤ åEv?Â[kÊ\4g3|˜?Óq-ƒ4DÎ:H†s!d ¼c%d OŽ¥e®µ çÖÐP™SºÌ²€ðèí¶ûê“ö0;‰ 3“äo4]¿/_”Ÿ@c˜ºâjó`ŽÁúe±#°¤ˆKoÝ!:ªøykÆxð?0@gåÜéÁƒ°{„ÎÌþ]#´1:ãP¼l„¾ïì_¶{^ež‰ÿî/¢É„Bn,¼8þûé^íéŽÿ½·]ûÿýM>0^¼æNÑß<ºžy >Ä$Jè6ŸI4òÓ`ì o’h$I½ƒÉ$˜íÓÉû(õþ Äé]ÍSo:§l¡ëgo6¿õnïÚgi À—›_Í0Åf%Œƒ+èU$Øy„G|'ÉÓ]Æó÷Ë[(¹Á ˆ^‚9±|^Œ1´ùq€T$ùqÕÃ܇10LéM›€ˆŸp>}ç,éÿ‡(¡1Ó8ðñØ»W.xY æ@f8 €è3&“hÍ ‚ »,Æ7³±O7¬LóØ­J=]CåkLߌP”A¨Úñòª–´@xÚÈÒáXzƒŸ±ïÜÉåYïô¬ÕtZ}¬åi0Z`1ÿ ×|uÙ?ët»—lrÒÐŽØ'€žxO—Dão. LJ¦æ’¥˜|À¾·õw#&?ÂSº%~Z—åÓÃãÍ›Ì0o逮„ì'7èžÆ½àªdîéÙ¨¦€¤€ ‚s°’ Ó|!ˆXÿ"n^B\¶rAL.1ŸÚlÆR㇞ʼ >ËgƒoÞRZ_é\|²üý}3ªç–GÁÁþç IMýø˜pfðù,[¾H“è}ð+¨VÉc–·éû²WºÛ“T˜} ÆŸq¢q¥%^¤× -Áz™”%4nܱçü»Ô‚ˆuyY8 _KÍ*`´ £Y¢øµÌ1â|ŒžDè¬? Â,¸E ®Ve_7E=‰›žÜΖ v1{²9-C¾)KÁ`ÆóY`¾¿C+Üxc5Â[˜æÄóëÆøÂ8by‰T$’íiÛ̘¤rCŸµQj‡Õ§}èRsn !2j#|Rfó¼ {Á[›ÀÉå39¦[ÊS—;Åè –è÷ï‡ÝOô¥/¾ü~!ž\tËŽÕoqx}h‹™KeñŒÌ-7RB‡‚f §LòøHIŸÎÙà£Ê¦pŸµ†[²µn'ÕPF­tª˜à‡!r—¡—‹(BÉ>¿å}Æ/æ¹s§ÝŒ¤H¤,\‡pK;'­¬pÌÕ¹ ~¶‰ëGaU%ß¹-ªªá88ŒÒ˜[ þqº˜•Tu¸µØRl˜BÙÈsCžwŸzšj%ÚIh×Jê%•éë«™BXAÉ<­å0Ø‚Y‚x§¾¬s=H-E‰ Y,òÜ[±R_§¢ÆQ§úú´×ÍíXª”xœ{¤{Ù¸lèÞÐYÁHNóšbnÒ¶K5%­ðG²/¬Tx^õó:EqÉn±ZV•Ü ð6‚}:MÕÀ!–r´1×äf’"^‰]\ü‰þ\°?‡ð§ÃŸvøcü{(½¯ â@Ñܯ CYƒ©·Ä k,~Ó#' ¦9)ÎLÐ7›â¬,¦>è¸oÜ·döþ"Ãà° 4¦s0wÏ¡–ò¼7yJ/šF³rø…òØ ËŸŒ•ǧüÞmô56vÙ¶™9ïÂ@+™|µ/€ÓI½ Æ$;–„Ø0èK×xsŒºÑÚ>º'è«SÇ1›kzè‰~ ³Ï'Ož ŸWȦâ·sËW üú!K¾óL Ù`½8W3ÜMœ¯î6ÞÈvr³e-cjÅñX6£÷ó¥·«9[óWrx„º¥ÑÊ‹ÓÒgn: ¬.ª`Ù¥‹¼zV~ãºÕ)³ÊNÉÝÝ£˜C¦/Ç4Ó#Y:[Jýs3Ö1/žë³¼îl$ gXS™8=™ü‘ÙŒ)6@F{oXjÇR²Åg½†ÊÌðQ² ïÈÑyIs¶76xVCïcV¨%¶Š³–ÙŽaÖÜ…Ld;Ü$l±Š¿Ú2¡wîTHéjó¼/›Ð‰íHV)µ¯âjuvFÉò¡Î*›;ùr„ÊrB®xÙ\2gt3‘BÆßÊ2˜°í“þ áe[—½P›QöŠß8 UÄrÍ^˜‚†w,À»KvdŒÀÃí5-žð¿vº]oòN€QSñɧ¶B†P%µâTBœ[— 'Ùì™%Ì~–µUñÞ¼åûQž:sw ¬¼BÕ#p'tvÅÊ<­i5(Ä·+µÔ-+åm‘« îLk–fmñò· }°^†“áÄÈ.®p)L\’ÏO^" ÍM~+f0YÎø )g–q?ÔšN²®«„U žÆH#– ñ³¬Ze½^÷åúÉ`62‚A6ì‰ó²—/^ÌÕhE 뙸efí¸z’ì Ÿ Lc?˜:w×Þq‚s'–§9a[~8±¢[±Óà ïhõݼ¯ì6J¯ÓE)ÔM¡íCsí0F; ¶ýé-o(yàMh!$™w¼ñ™µ…ô‰—¸I4Ø»‹âƒ¿*n5OרÍgmIÛ³Ù•o$ßêªÄ{5„ÿÞ&xC ç‡0¹õãqâl–TmãlœMᢘ#§7ùN‘%>þ4·ÉØël»´ÜÆçÖjXÇ,ƒÞzsG o¸wã-ÑfWo[-ˆ£&]']–UeS +„7¶Š¤)>;©)U{>Á]wµl!“ 4m‹ý؇븥L7œ§×j•‚Ó~Ìwó1Ä“«²¸k±ÎSjš5EàúT%ZÙÚ¢& v…I"’Äè¦UAwÒ×Û ihfÒ|Ôñ¶ý*›9hø|TVË<¨?æŒo—wxx„|ÛSA¡¶ˆðˆÖ'Y£ào©»±õ2¦—Jw±l±ÌÉ¢ÅcF‚•Ì0•täø$^ÑÈ#…B¹ˆŒª¸ÐTñ•ΰjtzŒ/¥Lj à ö´††Æº3BÞ=Wò G°ž¾àh•óåN±0ÑÕuê)õ–˜‰©å´þ4 ÂÔ†ðg.}ç}Âcͬžz`a<ÄxŽ.Ò¨æ<×^·^ó×;uþú'íuüãôyEî{í½·½hhÂàIWI`ž!Ì8 ÑÙñž?ý1.謃 IKi€ÁrktWlº¼îê!µ†[Ô_Wì®’¾ûíÎÌOˆ›½Ut6Pà(åq_Ó›”®]øÖƒ76¨+QÅRøÔO>+·‚o=j}_aii¸b ëÞ]ÿì&¹.-à _™éí¸R0’Ä–„¾Ì‹ÿä¤fà›Þ‹Ò "i*.vA›ùþ8ð'bd¥B‚U MnËrÝ5AüÌŠºtd~E¾>‚ï•·AoõU š®9²3êÝʳ³5–Ä,<—`³É¢7tÎpuG_ö‘@Š=¹ ô9—¤FǯΩ ¬ØåÜпÿ9… ÐK™#5¡åÕ´Ò!ЇÕÔC_èQ9ïpB¶j!—E $ bŒsGâ0Z¥°Ü¢’2]^fš,±}œòª…;*îÁ"¶ïî¡×ƒ¶m“T ã2êUí.ÃGÓÎûÕÖÂÏò²†7k½.«N’Ñl~ §VpÃY2Tkxä(Æ•>Tùì}Ö±(d²iZ.–RÈdд(Sp&ÕÜ(±œHNM4"KêâLš!²¤:zP'©ü‰€IÆá‘—Wl¿ÆÚ„È­ø’=ý|#¸Á¸º´GRå .M;Ê5Ù2rʱ*/¯¼Ý‘Ì>´Nùì–ktg±—äìj˶Ëí¥´»jUÕÓ>|;IjWpÓ\T¡£®´)Ær‹’¤ÆðCÅ ¬´õëlÜ9jáÚËk!$¯‰ìÁÁ™¶u‰+°,“«Ö%ÃQn¢Ø™hCÍŠ)d5™8ËÏßÀÍ-^߆͔R+»²›²äj·rìȳ‰_ÐÒícIüŠ\§’:·cí¡RÄÊU˜×HŸ{8zFvã¶xt.ÈT\ˈ‹S>iüiòÆß¨ù›t‘‹t‘t˜‹tèFjwºGrOF›ù±7úÌÏÆêæ£u ñŠó1õĵ&¼Ñ°,¤¼ÂL&-¤~.R?É8ýnbá«´<ñUZø*-¿°‚²ò‹Ê-ÉHlcbá«"´³¼³*©¹Œ…6Cz„!o×ñZOw^—Ñë¯Eo°”Þ`zK«»Vm—VvõºÞgCµRï¶fؽ3•8÷mJ¦¡§èX2A¬x*™qãŠÛ{GÌqÞÕÚÿ`&Ìn•œ] ØlÁÂôSîpþ\uqûq…Å%ªZ^º0 C0À!˜lÌA2A+Œ¢D¦MP jΘÈb··[äåò½4Q&ê“k/^&OZ_¼ë¹¤†W±±Š/Êû€“kí|QSãΗ8š—y˜¢£®Ä%o`¹ª<^Ë“Ìiý‚„`ÚÂoaO2ÎÿØùl ¹½!=„â­:çRØOWtR]mµÌ¡f>Ât×=1R½K7k¿«z¬†—'¨ÇÂ3,9ÇK\Ö £ËœU¡LàŒlõBŽ W:iFŒøöI\áÜ,¢Z;P"£ðe` }%Õìe-P¨Ä£¤V~RR/³YG4¢ù¨X6%©ÓcFš‚ì0eL…Ç”Å$Åö–äÊ6›Ìð}‰ÜÜþ4ÖÇü›Šçþ$Ê¢£zª0{ È#+;­õ­iT^RÁT¤]ËU VZã,)ؘ댦‹jm ³fòVý$šõ²BÉ_ègtѯ+÷LH<”t)çJÒL“ÖÄ®ùÖ¹¾%âÇ6¾d™,“Žä —Ê2‹eF(4Yš˜ÝL •±—z*>œnék¹,¦ºÚZ»˜«=Ì~„œî=ä†ÄÃÏv—U˜îæÏwµˆÁ¼uÀnÌòXœzà[óVlÚc˜´”D]îŠIª#ŒHGŠÀ«ûù¹)y&+2ÄÀ´8/R°z,@ñBäô“ÿ¬×8AdÖˆL& ʾ÷òL,«ˆ Ö'SfmY¨ -K¢ÍI舗™t øxËZ„ˆçÓ܆ឬ·~û˜ èH‹¡Å²í£oÅüóµ‘."«™<.n[Šë4•›ÛZFsñ†jˆpƒ/_¼l›/3›‰[Fÿ””YBY]›$]¶•h¼²™Þ¢<ôÿөοŸLþèL“É|ô`Ùÿ—åÿßÞÙ­m[ùÿŸîÀëïùÿ¿ÁGË:/Zžº²žxÞ£TòƒÞy=‘G¾ °(Í;3Zz¯0û¼ Þðv÷ôâeïàìUàA25™¹lwƒVOG¢éZ¦võŒ`–{ø’DWÒ+£:wfiÏ×kÚóÏ“ èÞÞ/Ò»<;è÷åJçŒ?²©¬Ã2!šE´ñž¯Pn›ÅþßÞîöNÍòÿvëµïþß7ù”´ëž‚QF#‡1¢{™(Øt>¾ÁÜ^Cèìþ(M¼ùMŠp´V>ó“ô#x'ò†(o>£ VUn‹êϽó/añ”óÙ䣼Š.2#ðú£wI•ßFåy¯À'z”°ëžè¢¥hÎ5òÂR"Þ9„$>2¦‚[iFƒÙÈ_$7º¯Ip>­—«à7@zY!`j¾Ñä†2Ö¥×ðoÃ×»@l,ئš¬*@ý6Ƀ9¨)CÏî±¾Õ¹¸êÿ$Úà‡5kgÇ Æ¤bÚqJ0“ÜF)þaÞ“ Œ@×Ñ“›Éd @xù9“@Ë.€^*ŸÌQF\À ?ö§ Á˜ê …Æ$ºÏï {a -”ÎôUpÃ\v·Ô«Ö9XšA§Ù—eFqUPX ȳe„k ÷q„Ú‘¼›×~P…àøØkΧS¬ZéQôˆÝ/†«8ø2*–÷=Ò<)«x%ÀÀ¿Us«¡UÁËc<ˆ€çàÆ\~½€=ܸ‚öÒŠ aúÊ¥hËK¦ûÞp>ÇÁ*”%±¢Â‰O·°Ý$x(ÖŒ· êu€kADâf¢q2˜™k½ðAƒwý§$˜ì¸Æ3ø/~úqÿìڧ᜵+Îð^ÒÚ¶÷‰?kžvO{“—V5$ njäÍhþxLAÔ8Aâ j5—o|3³DÇ.M3³¹vÞ“Li.Ñ0Xå {‚RˆfïçïäÍk^àCñ#2sh5.= =õ™eâtàí"ˆeʶŬ5ÎêÙœ –ÅŠ–¥‰¶à¸èé¼j¦á‚R0ç]`ÇLùv‚Slý›¡Tãg6DœH§¦#ľx]ño\ܔё~íã¼²Š~-ôÄ$5ÁÆÁ˜ßX6 ˜Ã¶„W—…’!_¥Zß“7”QXƒ¯¾c×’Õw|z/Q™ª“ùŽ —œæµ«Så§V,tfö^‰í‡0dÍFÁK¡ž7Äqqîn”0G Û†J£UT“ •aU„#üžBø[ø|”Rdø°óÑó‹Àùè‡kðС¦œo´’’ÖY¡Ÿ0Pä]¹8bÝÐ>¡ª‚!á„ðòÄ4¾í«ŠÒçMÆŒT,+òVa(i«¾5!‹î,/‰œF7±æ?(U¡ºH‹ _»Ív+¤OÁ–¢aˆöï§d7Jr{!E#ƒd†7F“P‡˜›%LæNï¨ìÖ8ÃsÖ¹=˜D˜/‚ÛÂwA°ðÐñzGÁuœ)ygå8©PGçlàE8:d¸¦ë,ùKPn%+$×™‰µ¡ sÆ 8ðE<{JúOÂ8t‰Ã¿tI:hê2»ix:œÆY¼æ7ÉäcEÉëG¾wƒï‰n¦ô Áý¢‘Ï1WJºt¤ÌPwì‘®îPŸ5eÚŽ~R÷ñߘFhià …’cCd¯"õ'š-‚Á™AÙ_ähV®J¹ 4™îï&úËMôzZ)¢ËófV(‰¦`Žc­ÙÌÒÑÑ;æ-”'žq™f$ÊÙ¸ÀŽërQ]Áè’9¤9Á &‰Bªbª9ðûΑש@gßÀ„ ´]®xÕjµ‚³ƒÒ^ù­' R ãmvØá¯´Š«m난pú¹“ñytáD,b_6Ègž`©¬¿Rþ¿ì ÁéJ=(•Ù …Ædz €*ê”d‹ƒs­SÄ÷ ?¸¥/RpTtSu±À½}†rÍg0˜¦ _ø?áBÓ3DhºeÌ$u(ÐóˆÏ6Ê›úÄP]\£4/ëb×¢¢cH»ÃÝÞâÑv/Ú/U)ÍÓ“Aï´{‰{C—lsh%"¸M$‰¸v‹ÜTø |›úUÜ@fªgZRß¾h^93…I v«)Cl23£û©åäP ñbö±÷W> Å.Ê'³ø2¿}EK©ŒuÐ|6¬ÍP9~Ùªì’Ù¶gär³Z®TatES„ù Ïá—â|â gflþ‘€¦a…÷lX±©¦^>ç­äÌ+аÅQ9ì89Ç¡6 ±?~–ëùdIÝõ)ºÑš¬æ|Æ)‡°?¡³»Ð0b-‹>V§Ï±Áå¹_¬¡ô«äš Ÿƒ[žL’‚ô*qÙcZM žÅ|žnûšú¸`ƒ4°½ÍÙ9]tά%vJœœ›rYa]àVšËk›Ú'3Ã7 ’˜OÙ ük„;”¾{Ú\èÏýÁåo]¹9ÙÔçÇ™E7p~–ónR:míO¢?Ø¥zØÚU½úÚÚvÞQxe­ ˆ‚;9Û‚HU[îÊhŸ*{Ü cÛSWŸëƒ½‚Õ±e°º7¶ 6×%Ótìe²¯Ä“s=š‡[Ð_à³åc"§ûçla©*úEwÖœ;o?ÏïËÃúŒíž÷òŽÎˆ 7øùŒ{ï"²u:·DÝp°e;NQ¡–LV‡ ƒÆñë{,,*÷Z…Ž·Ý¬UU]N:ÕÕfKI¬HGi]G‡"—ÒÖ$—Ý%-)²ûÙß¹à¾Ø%åØ9Ïï}Ê6¹;3 €ÁÌxlC2Ê\ì³#…Œó½h4çÔ¼A—KA…,ߊa8è憜Q4H,ý ž-·Î⬿ŸLfi2ªßïc@Pna%í=Ð'ÔtY¥T`‚"CAØRW©šT9úÌ’dy;Ĥ+6H¼„±¦KF`›0 Ê%LjYI°- zT z·´<˜¸-¦^ A~I©Hò¦\$yK2DŸ2dMú^eî;à›~ð]°®ûÏíöÖþðê ºœ_®<…¡¡Vî t<0Y‹Åƒ ô€4°Y&»ÞŽ3MñŸgWuzŠn^@Ã#`¥Œ{2;]VÐkB‚¸AÀ'Y±pi£3[›a+”Ém¸¦ÐÙ´ÛŽT+öãÐR ©ò{]H-¹yu­¼¿øwh½'W!픘§0Ò¡F­ƒ‹`lµRfx7)Ç&¯Á« Z\[‹ÑÏ"\#ëwh­ægi£i5 Þ±Qµ#>Ô¤tä¥W7¼Å%¸pE÷Ûnëýä_9äQÅ+{0ê^ ^‰ÑC?f~ԯ薎x«NðV–y»§÷{ñ§ª²Â˜Òjp‘úÁ ܱL .ÞŠ‹D·ýhJi„ßp5Àz´U öÄ Cç&X޼îe×]Ü}AÃÍš_•ë? fãë Ú¶·°0¯ðóÅè+½”Fx'Dâ…¸8ëe›0¼»CC½hBë:©X¾Å핌ƒ°j yÅiñAÏdÍ4ç.¤IQOº`Bhx%m›æ¢Ùù¶ñCaÂèj^L´Þ~ ¼¹ЭÎmh—½+3ˆ¡|ЧÓYæ9wÚ<–·/=5áÑkõƘvr?Q‡Ö0Pä#“S­ˆT ö §éÁ³‡‘·uLjÿ´ý·û÷ ¶|‘èm:xçV¯„†‘dÒ]†»WoßÁ»°j¡â‹0¼½ŸÌÇ5²üöZ§ûs6ÉD¹;;i”ͪAÃjú2-©öeâR¼Ó‚ÓhèyMã'Ø /¼ cb¡Q“„ßžøŠý©Š|NÕΔõ&îåsÜõ$r2–I•î } ïù#Å;;tf™iX£’€Ùß<µ—U'(+N?DµEAf)fý8Î <Ô#ra (h†æ,gî z¬å I@Ü/dÌK“X„‡æR±”€Ø…©ˆf1×Bž"êÞå½eád–;ÌÇÓù݃êrºé^'™ØsÔoé븇^`–\rØùÝ8€ÃÕj&ö0%œ®Î]»JB=:J†´-.wrÍýJtÿåmÜ­®•*UoÚ¹÷jJч04#Ôxb·º#ºèR¨¥AÐä{8H¸2¸üþÆj¡uhÄSŽ3Œ º;®zÁAÐlpuSÎáü¨€s)\ž‹}z–`R’XÀf!—¹;}øŒw«ß ŸÚ³ö:’æ7™œ;Ÿ÷mWgŠÓSÙÁúË’Ç*ug1>úIoe}ìŽfÓ†g»Ò9ý!‰ôl|G;o¬±k€ÛMöGsäšnåØÜ,iï‹MxÆôÝ/Xjùc’ÿuáªE=k€c M Ü U—AqBßPÏóS+},›²‘7ÂkØ:òºW6ô÷¢jȯÕGJÉ>ùí©ßŽÜ£ì!òå(ÇP•9ÚÜ Óxr5»Þ|¤ÆÝ}Û3‚{Í0ýín¡Ü„_°F6CN ô]&—£¸9È•YF‡´NÃÂG;®ÞéÛ2!¹*ïh›îfPOá{Å÷è<ÕX«³¤±UƒÚEÓÆú'CÛ–… ‘“Áxä°ý›¤`–ö™XCSæ+ôÆ}Ë}Ô9–üKCµÿ—ìš㢟Lïî9†Á¨"À´ÜÚ”žÃ]Š>51(‰žÚ‘$ÙGaˆIÄa©øöâ†-‘ß«vÅhÅG#Eg8Ž¥’1u;l…CÈVq1oóK1Yä"cÉ‚¨žrn½‚¸ÖsÉÚï62¿lô|´ÍÙY?­èQf€60HÌ-®KßOo߉‰¢‡õ(]îJúa] k0M×Îva¹;â`”†Ýa@áKÅ—ÈñáñÅÙá+N0®£©¥J5óvŽÓsžÆ;MA'¸7ŽeHý=98ÁQhmðÉÚP€BÈ0EŸ;EòM/L+ã0ÑãuÆnnÇã¹TåD„ÛD .¦”²9d 4z|f5yúÉ Ô"£F©€-%JQàÐæÔ”È8arP*NŽ(@zƒ«ŸtP_ ¾\¼•qÕÝ`8žŠP¤™ 7 ÅÑN€/*åBŽ+/0¾¨xésœ )œ÷Ò­£^v›V4Ô|T1êªj‘È…Ò¾¢: 2Ýã€v:œäà1;â'cDû8–C]EÿÌfS”{³ŽßFa×ïôÒ`’8ˆ¼áì²&Bð!=k’"ãÊ (=D«Vwv,èHsWÕ.) uFwüPÓÑ„åÜL‘A½XVÔ†ûc½8‹£,¿8²£‹Ä8aJdéUþøÖ?g±ôk¥ÇžÅR@«%³>k%D.Y+=ö/–{WKý˥Ǹ^Ê[ˆn"–›7o½X­†Åyz Ê;7ÈÕÿ”ËÆtýøkÏטÛÉ;WÛºöñW¶ò´ú=–ç‘'ÊÜ’g¡8¿ÆÆŽtWÞþj;ŒR­äwqÜÓ×ìׯæFéޤ7ŽÆÝ䊱]Ÿ}L1kér aÕ8™P»åÂIšÉKÔ5…³µ[¯ÕDQ!®-Lݦ~Ý{¶¬êÍMñµLLîoß±âÏ dà™€tF›yÞd–°8œôÀ™‘<#Õ€õ"ãyuYÅ{f X¶½öΤ]ØŽª1²%—<åN0ÈìŒ.)XM~*XZE5VåZ#À)ЭƒgõýÑím¾©÷UñÔ[Ö`8TÞùÊ)šzM­hƒÇùäE&Eï„{&ã¦ê‘uE;õ†IÊWܽGØè=HºÊРĆÄm0xÐTm —cmOr8jí³RÃϢýý±ò'IM^ô{˜ê*84‹ÇÇñÕÙ¶ïpb»ô„fÑÑ dáñŒ>›X““©lëM瑬 ïöÀ *ü¶m‹üôV~³ÞWØþ¿bGølá†ðÙï±üíà‡ìÓ4—Ê©6‹YO†b0ëæŒe`;$—móÿ…¼Ô¡PCչ싪[¾@•|ÈHÒäm0yæÂÁ3¼-Ô`7(ÖòM.æ¥McÛÔûÔmÈ ICºrè´š2N¬óÖ²8¸¨7®á-…#mõ–ž 2…Aõ F¥OÆ1‰x¿äˆ€"‰KO 窬ú–R¶Ë½† §¼2°x sÁbsÁD`ìqðÇèžðÿûr—ÝÿX$]×V+gæêËÙAñRõa„ç bI›¹ð„ÂÙ¤±8È@ˆ7áF•„ãl[œmn[8Ûæ=¨Ü®EѦEჳqá·r–³oþo8Hp­†Ã;Fxà)Âä)‚šÝ#³íLîߢÞ˦š‰WhÚGa”1¹îóYG žÙRU°xË×Ä£5—›,Y¾ž)J'Kq&K“˜, ¦ÅÿÍŠ¸¶˜a˜Ýf¡í:ŒJ¹»ÖË….æ/‚Pí°.e\“=èêÄ{(î k¡|¢Ëy¥Á)µH•Ä[Oòz÷w†Ïyn‘ˆKÊQ`¨BJ ÕKA_Ôh’`ŒÍ %Èßpäk X·BÇÝÙÁ{’òÉî˜Úæ-^ê1›r˰aL^=ííSÐÍž]9Óêà»* (:ÔšaâDÔ* SeÄ*ÆgQ/» n@Ñz:üQÔ[ǹ툟|‡?Z®¿³CÍr^{Î-Õãýä;|! ù´l‡÷Z5y—'CkÙ>ô°>ï/ýA½ž'øõ{Fù}{¾¯×c(DÙów)$:OY«þ~Bªß j,lù¡ðøÿ‚±àçÁ3/=|öpX4=`xè`ð•ýcÁŽôñ £$Uó< ŠîMB!êñFm-‘gÀzq#©é1^ÙMÉNy+L–šì¾ïcúQç¿3ïyâbÜÒèÉÌ–#-:Hð}HÃþ¤x\¼å•¸iU— N$ïmy;üKî½ ¿±ƒÍPLœ èxQol+Z-€ùL‘q^*CM²ŠBPem,ˆ bQo—ß}µˆ(9q#쥆¥+tÝÀT9£!‹âé‰RyêcFç(†3²òÙ“'Ov‡³‚@ŠilÃûL*yjhÈÏY#cXÛ´7ÉF"$ »‘µsU>¼Õ5[…v8ÐH—£Èˆý`\ѵ%m ¥H´rÍII2§q­zúŸë²(†PÝNá“ H–˜ŽÇ‘Š-Ç5è+#rÃR/1AÉaÈøM+­ÿ—bý?öÉåÿ9×¾d°òü_›ë›››nþ×­­ÿäÿú=>Y|5éɨ`g‡çgÍîáE»søæàMS ûi\©6µJ“@ZÎÝÞûˆ’k ˆ6 ga§ Ë®";“ &Õ#+¾ŒgŠåÌ û ÑpŒ^z5ƒì)ÎÉŽ„\¯ÓKÚ,w³oI˜ºŒd‚¾R"FÉÙ.¬­‚ 9äØðÿ«yØ›E{ù2RÜø6Ɔgw*”•©_È`(œÐGá6 g‘Q’¼ŸO#uD~ݬ‹|$; !ß6g¥’tÁON»‡;\»ðçAm3I`nË2¦ F tÒø*žPÔ4äÍ`-à´QºþP»ÉH)J?åa›_î”|eÚ7Ìna’ÁL2‘†Ã+NÔ³C‚ïÈiõÞÌ ‰ çÕeúmbKöϘ÷L}(S˜’)g'šQpRÚXÅ»Ç*Ú7ÛBo†ƒªR_+ûJ}VN½÷_ˆ°³ÿ^ˆ.M—OÌ¿MVe0ð„úAÓµ¼Ÿ…ɲ{d's¦å™Àߦ¤ !3b# 6YÔÓ{Ó\O¤ß¨2}W›%+6’H|¥™ú§¡y”™ê— wiŠDF¾”§sÜõîWs:VÍî5ŸÜ^Õ÷[o:Ýó{UƒÂòÊ•§ýÊ—¬Êå]½ÊßYzC­²²ëùp8ŠBXÿÍØ­—}z«AÎ¥ûq˜j| &b±åŽ2Sáœ*/dą§a8Å£t$ÁW#R.°*¢ŸÕ‚þ5ê£F d‰SîL:€íÒ„©‘ …\¥©üªÈq‡Žèlxð4ÝٱʢäÂäLï"²O¶ÉIÅ l§dUÛŒ¼*ˆ—ò‹|C‡‰‹öàLò+A•Ø·O¸òÈÔÒ‘n ÜõGQh¼¤Sü†eó[¬aæÈnRT¨xo—*š”‰O˜kìâ^ªò§AHý#<¤Ùcâ$™ì/qßB¤3ÙZf ç(<…„?â)ƒâ½+j$|ïoö­2?æÊ®áLØu5^èª=®JGÛXŠY’Ïw™S ÕY&N‡4ú$g5TÍ9M¡vÆûŸ*bÇüæ^Œéò u¯üSr{1ðÓŒF¾€gàY%ë<|@êG*˜~‘Ñ6Ÿ|AmlœŽ3Ú¿×U 5 +’A³¦˜>dU‰Àæ“o0øøËoÕ¨Ò#^r/E³dŠ]4ðM+>ü¥åU"jÄ|KéU89}à¾AÖÒäÜä eëtw“L7{RF¨1 1¡úéÝçý¾ž{DÃÓù°È©RϲxñÌݘ«‡¶ºZL:´:’z^ÁT7„ÿú}­ÞÉz±„4 ãEÓFS4‘ÌTÛìo¤¯¾Áº‚ ‰0ZçKQè7‚¾êlƒ· ›ÃŸ›]PºÕrP±û'›ˆ*'ÏÜ ®aë"ó(âV”y –‡h¸ÏXý&gÄ—„=‡ÎVÍÌè;× ¡oX}>Ê×t¥¡*]-rAÐ}²ts@Ý+[äà“Ñ A¡ Qè"” 2×Dq6õúQxÙCŠ?‰t ­bçnÞ C`Ô䎑Ží`vô’]“Ѭo]<³Í¦¥¹àÑpF†Îàø©5xA¶Ì;°Ý€ÿÐÜYYòC[Sòk€}KœÔì;_L êÞ@Ñbñ4¾£ì ä2 åæ0À}ÄV~¢3Êòƒè6ö„ìéw #¸ŽTKÈFX‘MÜd$³lÂk˜Ø ƒ†+–\ù!ß<ð•^ØÌv#DOg ç9,§GdÑ%V–éFŸaÜ’‰$ÉUá†ÌÉQà‹>¸5³K0+ û„lÇÃCÌe ¨%=]B‘“êA¶ÊeÍs2¥Š»ÇR Ä£n‰ÑjJ·¼UõȼăsxïbãÓ{DC;À¥š›¼A„*@3ì•õxß,{þ°VG‘&êõ–fyoAì¥ÔÇ^Mdš ¨Ëøz×¢]ëãÒoꮘë‹Ò°ºdq²5nIÈ+A¬ŸW,Å}«¸œ0ŠÆòâ-äÕÛš6¯—½Â¶ËóX4¸› ˜tÊ[0°Å”aL®ˆK› ÞÉ4õ ³´lM… ¡bécA\ÏNlôŠÇ%óØÔÉã4ƵrÒ(æšÄÄб?h¾/ЧGËÈ‘kØ„É>ðoZ›*Ú:ý»A<äFàzá\/‡€¸g›µ¾yˆ Ë›àÝœ…'? á0¡µ˜¬EE¢ª ]%¬sƒ*^:) J\ häÛü Ä9©;j»µÅ‚ÍlVÑÐhmÙ9ìÞ£é·,m ßÐH”Ûo:¯[ Ó '^Š‹q^ŒqîÇØ+ÆØó`œ¶ àOÛž™øô'!k¢ñôZµ[bÞñÌò~Ÿ‡wöJðœÑRq%æØÒCÁÏ)SzMŠHt=Z»«|?Ð>ø)žŸm0q¾‹ Ä…Do³w"Qéà]MH%eZ4‡É}]Íú(ÐU%Á; ?AC-å[$}wýÅvwO9O4í Cá>„–¶®ªÅ‚£Ø:Ýv×?íÓ«ÜÄO lzåEè#t|Åxé“÷PoÕÞøÀ‹˜7>ð"fàM¼Ù:(‡7^ð"nš^vði†åðä§ûa4ù`Õ¦·[†°A¢!(•ÃGbAq¸ç-©?{ÝväYž«õšvq÷Œš…Ø%5ËŠâlF?æS„;=ÊÈñab_!¹‡Î¾;š&ÎköF;†cYáøSÒá‰æùx¢S ó? Fàí;ôDü Ò W«8Ë»Qà:ŒÉ¬¢+\¢pb3b‹'tdDŽÐÀIo:UÏE"^6©fœ!´¨ˆ´Ê€ðn°-ù1îEãxöý×(oy=ö¬àþ}Ôý¯gkÏÿ°¶¾¹þìù‚g_ƒ÷óÿøý/·ýáËn6þ’·ÿÝÿÛÚÜ\{jÜÿ¸õ§Ï·žýçþßïñ WÁêð|÷ìC6‰ôã1‡7°ÈëÍgɃ˜öûNDú¦œöwÁñAëú–|جcñU½Š÷ú×`eý4žŠ<æ@±‚ þ«£JqNñªZpxÐ스âÇ^%£»GtcÞ¼×=ó:)¬ÂM¼H‚W™Þìãœyßw ,ò‹Pþ_êÂÔÔ©·ëÝ…”;¼&Ú×oŽŽZ‡‹¨[—«J©·ºiâJvœ^þ´ÛZ†¾¥Õ}ô(\ýv„môl}£þÜn˜Õ¢Õ‰Á‚ˆ~埞ý Cæ7ñîSGÖ¦Áu1ÊÙ\º¬ÇרÃMƒ€.‡Á÷8ã»oÉTGär?U§37»À˜yù̺dfŠÝ¼•F.ÄûöÓ.?íÚO;ø´c?kÜYª2¸7Ñ?ÿK¦0š zœ"ÿ[úv›âj›A`Ü{uÈKãõÃpÞÕqDùôGn©°/;”ó Ðc”z/ƒ Ç?¤È‰-(îq€Éº»Ñí¬yZOæ³){L£¦Cü\êdbÈÎBÆÛYï2¯ÖÌ"àù%nR­I£P|>ª7|ÜTþ1«¼/ÂÉ“uYQ²K܆ä,¶ú‚K{wí…bsGø-½µ´HMFt"41Ž„Df—;ió$)Šg ¹TlûÉxÜ#ÂÄj¥VqDAïd™ëæKt‘›Ì¬÷æûqF‚R­pÔ²Y­JR,ÞŸü(b]TžT~að:­ð[˜ÕÖk˜G)È@Ü£™ÄÏMo…¦ t1BŸ2ôØbÛu}S‡ÉwRN§Y}ÝN»‚û°[oíî¶+ßäDñv u_žb HþÜ4IŠÑô%A9µ<ûy¼%K hØ™öRÜl”9¨„Е‡a•V+ø B—j-'+øêy“Yzgs0ÜN ðB…Ô+™É°òýjP ~¡W¿À·Õï+ð ÇŠUš‘]£4$ÁÐPIZŽ= ó*2Wh„¶ßXãfœ$`XL®ôÊR½öbø¦ch[üY1i®ñZwBÞ–çMLZ»åŠmr¸tMÚÀµœOQkd×É|IÍ„¦±£ª`õѾÁôt*» tÅ˺IA…øÕÇî &*~×ÈåUÅS6>hRí#.Б ÉÆ¨ƒxztøWÔ•H ÖÖË“Cz9ñ¿muéíÈÿ’QG~ÔWŒzåɨW~Ô=zyéǘ—~Ì]zÙó¿cÌžsŸ^öý2â—ÿÛ6½œú1ùåÄÿö”^&~L~9á·èO/çÕå !µ*ŒÛªÃG`»õÒ;ÐzX탃W|0°ÛÑ„ê¼Ùc(0\Š¡vO$­I ­Ó3JÒb˜Ÿ%ÐmTçuKpu=*Ú´²^)- u]uüF”8ž—”ØT`q)ÜîÁ¾”}¿„³=)ûË2ÙœËv¼)kÇsÙŽÅPЎ粋¡NÏÎE;Ãü,nË  Ïe;–@í ZÐŽe´$Ôu 4йlÇb¨¦‹Ká@ö{Rö—e²ß“²/†ÙïIÙCží ÙÃü,nË @ö{Rö%P»‚ȾŒ–„º.¡îIÙC5X\ ·×íp]βâÚëîK¨~Ô™„*é;PbK–X<¡D U2¶¡D U¢uÎNE7L“’^x&ÇZZ6Ö€VKÒ*+ñLB•iéýׯDë__•ôD€;Wp%ÚàZ ®¸\ ÚpÊ“iâ±Ö?&ÿ˜-&-QZ.ÊÂRÜRJT¢DqK)™ åÄ-¥LñJ”–‹² 5T$Jé‘(-ea)gn)%ÝQ¢¸¥”ô:²ï–²¨õÕˆ4P”rêT¥l` „–ƒ° ˜Üí"`’_P†² ”E¥¼qK)›þ%JËEYPÊÏ®¸J'}‰ÒrQ•¢f[…S:í*¤óÒ"ær#ùV eeq+,ÛêÖ-Ë[9·+3q½ÀN´ 5`9\ó ù“¤8ˆ?”@j@§ª¤í:Ï­J͵ÜÅDÎØ2€š'(žŠ©`]vP2+žÎ%O7%`ä#Wy‚'¡ë^„Y-X¯Ár1«O‚õjU»[ÄÒ«O> ËsŠùu¿‘çûQrÓèt“á0‹f%9À¸cèÿpFÙ5 Ç£¶Iu³¼Y:¨›Èc‘o´Õo×ÕÛ ÏÛ õö©çí¦z»íy‹ÞLÂ)J=Ô}¼9GtÏ_⪠%º’"gà G°èv*áµSÝíÔA2 'ö“ñó’©é Å—ƒñY2ÔD±i‡ Eõÿ«òºíeŽ ÕE>¹J,Oͬ¦MR†¾C¯Â—¬ waò®_Ò2F ¢bBË芒&{>™ÇJ»¼´å %2´ítѫР74ß‚aÀ¯óòøãÐ# ´ÜFM_,™ñäd>†Æ¥bDņK³]ÂQŽÔ<ÇC€¶ÉÒ}Jâ@ú>„ª¯;îv[&Äå—bÝüÎãæ’ÏÐ|x×X77ž~Ôq‚­^áFø­Úe’krV „H5^ƒõIç7 ^Ù f‡Ú¦íi1Œªj÷ø žÇ³krvÄØ¥Û²¿~t¨±šr5—U25žR©dý„65¢Péæ@—Ô» ÏÑýô°bÌ\[Ûþ²~6ŸÆƒW˜çåA¥k<9Y©tÑž«V{º’¦]õ¼à* ù¬f û(*Xè N*¸±€”Ö)…Ê1õAyªúÀòUsPFHT]ï’†é_'Ó@ìYzϨ¯?[d¥aG&;Љ6”É eÿº—Â@i%7ÜK[eA8˜'lйZ'üPÝoa}PE“·è$…5IÄ î2Û Ê¡NÝDzﶟ•u—NwÎ>º¬Šæ*z¹¦Û Ñ|m´ýCqajkOœûè[ÞëDÙǪ`®£‚n\óÐÚ-¤m­(»gÏs5À0iŠYŒHŒÑú˜¹IÿV«K–iwŽó‚$ ðW’ƒ;Iá'Hªz¢B…¹Ê¼pA$O5Ìé] ì•ÇÇ ¹—Š©ƒƒwÉÝå$‰Á¡\ê9“Nõ€Š‰ÆîG?ô#åhÍùnÌÒ5öÖÚÚlÎÜS„½¾[èð"ôõl¡o;øÛ&‚+€úŽD9ûO ÊÑ Ô…BÇ`§%è[‹E¿^‚þ|zÔ+A.˜ ´w~2ŸäºM`î€þ},]êu?µW^'§mi â¹ûÔZ§phe*ó ‘†ó­!þ9žæ´…i0ðزLiŒ¬ì†ÓËÓõÙˆä)Žÿø¬ÊR6\0Ô¤ˆ —*(oå–Âô›µ€¯3›~šL³.ñÊô‚rKM]ÏKº‚ÿxÞÑõüÇ'që#¬p%*²6û\^×,Éž`zC'he¾æÑ&×\Õ]m¾îk¨œ.v±6œ…øáîO‡º§Ž¢Þ‡Èê«g‡]q]ØÏ+ÈaáKà?h‰å眰¨3æêÙ“½šöE]ó.+éP—júÈM´e-ƒ³•59úÃkçå-•Z ã?KsÁû$›N×ð…¤öŒÒñ´€šŒÒIƒ& ‘ev…µörrù;p’‹!ý¿Ã‰7¼vžÌ2ðÕÛÇ¢ÛÏËÍïÁËM„¼|õ6ÚkvOÛ÷äAe†÷kv´¢—×7_’×°æ«FJ^ã8J]ïÁÂ$äÛW¼úZ}i‰/»gçò•üÒ:—¯öä+ù¥µWõ-C¬Â¥ Å:Ò·îSÒücäY·øu²Z­|viþ‚¼³EaësgïX¿nuï…ÿ¡nI̲6®·AÙúµ[R5dÔ¿-¨ºôqÿwê^Ü2¿?{,Gú÷˶)L;x;æ=7¡I-±\p£Áœq"ÒX±é ü?+UH™óµ4§áµœ…¶^ökÎÎÃÓhmb^Z«{Úþ_ßÒ¯oò¯Á0ÑjþõÖSc#AHj'hn=µ@«%ŒÕ®j·dY}‡!Ãã^}{°%š+]Îßàxð$ylýcV|Hˆ–Ÿuhqÿ E ¥9ÓØŒÞ•œtüžçTr™Èh%›_Îú"ÔçÄ•å–AŸ±¨66<«ê…±àµù™|øBÌ ‚F;Ý=¸¹Q¯”ÿx”ô>Ò|3 ~X¢”÷[Ù‡ÕÅi[Ê_¬1Ì”Ÿ…G‚ÅEŸß$jC~ùZ}ƶA;²$âÏDùÊëó÷SoŒ.1/=1W†þ¦ÿÕ±¹ Z DUJŽp«8¶'HkŸx؃iàß$Öw¿8?‹cÑ6|A‡X´ùª:…»ýÚÙ}}¤§ƒ¬w=´&ƒÌû¦;èû¾m§; ã»´Lp[©o"xøgx¾ Ö_C¶>Ÿz”õ²*ó¹¥¢&A³‚,ÁÔ&(?; Wóà`äD;¤>[½ô*‘‚ƒ'žÒ:0¸Ž¯®%•x–}ã«È96WQMäó¥*„¥o×mfnr•ü¬Ô:JyWLPÛÎ äõ118mJ7òöû)ÚÙ´˜ôY56®QXŸ\B”‡R‰á‡/¤ÈÖ”fRÚ‰DEãÄ•üå¶9xbÕH—Ûò™'­Ï‘ÎúÖ„d§¡‰jiíævÛ}y‰îˆVáD¨9qvžäsÀ®1¹¹ñ•˜\gãéÃqÐùò·£àÅÆÓ‚æ-”Ⱦ„wñªMqHÙ›÷‘§×wZXgÖ½d%yD=ú|ÔýýÏF=Ó¿ ýøðøó+Ý=k}>òa«Õ9ì>ßœ¼ŒÜD!ô˧8 Ó¢¹ØŽag+BðgË€sú"ß_ \Q?\ü•¢~´¸¢~° øž„ÞX ZßZ|WB?_ Zß\|ÿAœŸì?ˆx[Bï.E\ï-~*¡×–"®À×=à¹HV˜Rê‡5 ì£VF*•°ë%°2X©„Ý(‡m[À›%À2b©„}Z{f?+–aK%ìV9¬Møy °Œ]J°» ElÁ.±»HÄð[°‹Dl/±»HÄðs§»1JIM–Ž“\ÌRBñŠˆaJ(¥SC.¦)¡”Nù§¤ÄKÕ•'ä)!•*-_TÂZ²F**!-Y'•°Jç_ TÂ*òQS g{9D•°~XKFT%œRÝï °JX¥S€/Ú*a•ZžÐ«„T:Ãç±J©É‘ ÌJ(>³ƒ¶w’A:îá1¸‚ƺQ,ÆÂ0™"îå ½P……nœx°‰ÒqU|uŸLûDÌ!Ô·¢+…”Å—Á}–©Xo>ÍÂÍ2›‚3©!†f"Æ€[ÛÁ=ü5ÈÀ/ –Fs@(¸t~Ö;2¼âÀ_‘/¨Å›*gt.j"¾åÃÚasf„Åž}DO*øvM2Ü$æ†Xš}3^¢îMjË7긑~2Y–¡Ãˆ5«à†*¼¡£,dRìó°½A óA­Ø^OŸ?«¯o–ÅöˆÔ’ ·4°O<žXÑ*Œ ÜnÃF·ð3”,kJ9dŽ2¸]ŒÙYV(É—ù6'n $S¡rt£ ¿šUœ¤¤Ë+$‡k.—žÍ¾9\H:9¿§%3)kWZòµ½WøeÅV`ùèO¼,À²;™(ûû~”Ça2ˆ"®Ÿj.†‘EïühhÈ¥ß~PrÈ€‡‡~h_8_rdDÙ±Y+¨Ç”¼*D:/F:/DÚ+FÚó#åBÂXô®­ˆCzWŒVÄ#½ó£ÅD1° ¤Û{¿ÔBF?ö‚Ђ,lš¢X v+!TA—õ0{-C¢çoñÛÈ›~ÌÜíyëM‰Üì𦜊F¥ï¶º%žÓ‚ÊYwÅ z^Œr^€RÐy­»ÝJAÇå;ÛìÑA0ÞÞ6añw!¨‘¢°ðWSŽõƒáEmú‹®lÈGecÊwUÛÄm–"W®M¤’¾hݼ¶pày ŠOÈü¢ ©ƒ.ÏA/núøÁç%(Þ:Ћ’:x zSRқ¢ޔ•¥n ›ð°Ü¼lbàób”NJ§¥[€R ¸Ì»°6F1[\1Õ:X7ág!`kãÐ…%À]¸¨’t“Ô~µQ |⟷›6l»¨£µþnCþ½˜Ÿ„áq!‚·Iàq!‚·›Àã"­§oZZÚ®U å­”FQ-¬›‘.NÝx4éApî/ м·MÔb£ÛsЮÏU ïí9WÑ<ºÜÕ7w&+¤Vr{ÌžØ )^Û²”}Ñt…›L» ~¬zèr’¹Ú¡–¦ |\Üq;%ÀtÊ´wðwÇvÕZ…U“—¢h ¼ê¡+Q%t%Ê|;Læfˆ†Ž¥‡(=Öî]Ö¾À¼ëØÐ¹8D{xÕ ‘ƒ‹ó\) ä¿ xËàñŽÆn÷WVá• ,佯Á¯~¿Ë\Þo½ÒQ|ǸÐQ%ïs”zàŽ¨ÿ\èøÿÂǸÿÑ‚~þÙ÷_¼ ¼åñüÙ³‚ûôQ÷?ž­=ÿÃÚúæ³Íçž}qN<ŸÿÇïxÚ?îmn<É>ă/u ¨üþÏÓµgk[Æýx¿þìù³ÿÜÿù]>áj`µ÷£€.áý˳æ«×Ý ìWƒ h¦`dÁ“Õ‚Ö¼¢ºQÿz’Œ’«8Ê$^@×upޥΠaÞE7öæîæF0ÏÐ_vî`Ò?»{M*]*1Èã ÓÄŽxŸ?F½ÛÞýèÀÊJˆEBÖûUØåíÊÕ(¹Ä”ß‘Xh7÷xä€÷oW²~Ú›õ¯WŠ(nW"Lí+¾—ðåOWxÿ8¦½qL“s"0MW  öß+°"¸x&æÞ([)‚”@H l®UWfɯ#ÐÙ(ý¿™²5 ×ëõçÕ 9†\â½óéì.€v&ÛCxS Ù |lmÝšFcžqYi”ÍG3|¾ò&"®@šHIˆBdA/u<µ›Pg¨ƒÍ6†BM8Æ61ÀÚ¦i2NfÑ Î…l=}rÏ$t„£xι¾Ç–g´£Qv @cÅl‘tƒ¸ fwÓ(«Šb;dâeSÌ.¬Â äëu8F¸wÕ¹~]x€G=Q–aËÑm9Fƒ/Ó^–Þ,Ñx åL„pÆÓQ܇z¯Í®¡ð«9]ç%I'ÙðXel­YÖT#‹RëÌèQ¥ÃÛ)ŒÕørÑXK£1TdrÅèÄ©,Sßä.Ï ¡G‰8‚ÿzZáe [Ë¢â°ð8Ü!”ã^ÿ´üŒ*Cð "À îšeVÃÕuo;’ÌJ62ÑåvåojŒc‘D4ƒi|u=CÁŽ¢á¬ntÔF·ÙSé`Ö{‘ˆ¯ú˜Ôþ;ÓCÉeë`ÌnÂÈln¦xs{‹5H"ÑŽ8Òè_óª*(R½Q|5áÆa]E h”°qF‘Æä¦1HÒЧPÒs-q1Š&W³kÙhG™š° Ÿ7×(´KÄá¦aݪ¸ÿo¾.*o‹â|Óù©yp±¿OóPH+óZ£¼ýI/ȋ枅Ýz6׺õ4ºÂŸ!ÿé÷)"^2Åzx;«g0'O^]úöˆîrÁb%Òãû_Ã^6»šã‚5ÇpÔ»b:Æ)„À°éy#+«j'ƒHÞ¹Å{É`>ŠêRUâ+²ûxîWSŵØ\“ë®ûðîwQY;oðÂ,´7]þp^5æw²/pIËÜY ŠÓ3+µ€î¯‰AÖÇÀ ¬Õ/`ÈHG–F°{ö [ƒ»å >¯>GêÝP¥æ„Ç𴃙zj‰Ì6¥–Ê´"•Ö§ewJ„…KV(L~çd&±úvfï©çK•JÔn0¸’RÏü~­ÆE4Ë)8¢ÙZ@µ>ë]ÎGxov$5áLå(NîÑ5ªoWe…'Öä`¬Ðpé`yÉ7~ÙJ džÒ D¥X5¹`Ü¡6‚·Ø2²m´˜O %úžgƒÛê;Áؾ0Ÿ 3ªÜ,Wb„%’Þ…BÄå-QÊb&¿[y(±#Ií.Y\dÙ6O¤ÕmÐ2¦6š´EK_ÅЛôÌWƒVaº•‹c‚Ûœa'„]LA"Á?Àns+B{ö2ìèG*oì‡÷d½úˆ–"HCÀ,×?‡ôïý‡&q|Gk ä’~W‰m‡ZÜ= D¦ÊåɯÝlšÔá§ê“ڭПŽ5(WU¤î릤ñtˆ…tïêÍ ÔÓÀÓýŒ9zÁßu!?ü*ý?º˜¤ìêú–ÀÝи…¸Ä€1ÑŽ0Ÿj̧…˜dÐ~>ª¿õTào[øZ´dK _¦gêdúíYºˆ!&ˆñìç¤I"Ý|ºÙâ 4ܘ§*lž°[^@Áj5ŠL³Oô*2Óÿ¥jc~ŠKˆL8Ì/1Éd‡áÕ»"ƒ½rÙØGê3Í‚©3uWK`dB&z  ß¾+¨wK–cMÌÇ0꭬ܓԸ ù†®j ÉGŸxø}dÒ³»(ÔKŸùÃú'2¢…þÑÌ4Ø%³;‘HÛ!Ïë ‚ÄáO ˆâ¡hè;u(>Ô,ôïŒÿ]ö+ãâp74ˆ¦°N—ý´Bó'·¿j{Š0A†5µ¦lm(6ÏǼo‰iõ±§qës‡+þa½Z®íçm/©? éUƒÎ—hPù&ûU–åmÙyaËšB@åì_|Hâ>ÅœOÀÎúh Ó µ¹‚m^qÔ–$Á›à~¡¢“b¹/Q¶—@!Õèà­o”#†„9Ÿd‚kÀìWgºÕ#oÀM±r‘ AvžOR¾¥ÿï”ME·»g˶ óº{v¶û7è:µ`R-ä6×]6'«ÇŸÂ!\UÔµR/ÂzsÒ<=±‘”*0î[‹4»z¯è{ZŽEhò½š’ׂlÝ‘êÁÍG¼ZÁvë/Œ»Ñ}1¢­¨ðÂ.Ì¢(·ì]&¢ª©ºÔRعì©õ8]ñÂ57Ì׫´,¿¢¿ÍºF¶ ŸÀøgëVXSß»{†¸2TÖ¾ºß+{UÊð!Å8fó¢RpAcVÅ¢½ˆmG¶&óŠî°ˆp £ÅtwÓ«LôÕ,Æöô™ñ*¦¾ãôíì.4o÷Ž´.’â|f¬"%§i/–g 9µ ‰ö2ñ–[-Dc–]5J ]­ò_©ÕÃUêŠÄÁjÕXwzw¸—‰næèZ ®Ë¨ÚÝ;L*ÎЯ¢YnˆËÄþ¶’~•¦ ÚNä- †qš¡‚XÕ"ý^ &ø¦E 7:äŽ-Ì4dIÔ8ñ ÎðYB”X 64†D¼¾³h†¬Ö‘JUj-QZ`ÂÔ°}O•Æ-HBÂÙ»•ž¡-XâZî+ØNæ¼'Û ‡THûRXÞš¯Í4®œÉ,d±¶_ˆlÍ……ÛeIèI±K]Îê×&à’`4ט=ר4(ç„&çâYÚ»“GGlxðz®à«Á3aAÏSÆL"A•ÝE?†Ð‰~ ^ÛUèšÆO4ü[ÃUW†/¯7¾Î.Š»óHa+LjTº©.Ìm)dÏÝh·ç.šU²µ¸Ô$¹¬´ôúÿUañ*eyY¹zT¬zö}^Bȵ(J²6BÚ¤K£ô¤&·OÄêOjsIA¨Þú’åÉq»`¡<ù¹Gµ/LÃìW¥°†Ë/ßzQµÞŠÅJf,k8IÓ<SWs2T<¢.;;Ĥ#2ÉêΈ íU} ŸO—æñ²FSþgqÉD£±ÓÙMNi¯ºñ¥Ý2y¥¸"»ýä2xÙ`¶WŒî<„Ož*vŸ²De×.ã÷±"E=Y—±á-cC•±ÁeàŽÖÃé70^Ož¼"¾ÎÄ·—¥-¨³ UãY#¢F¦•=hç{éÝoß¹­*Ô W1²ºÅtâ[È®ˆjÏãªG‹Y\õÐܤ­ Å|»í@:3´—óóú†ƒàÎǤr6¥‰ñPx1C Ú´AŒ©¸ ÌžÕ ÝÙÖaÀš‰\,5ë0’­’á‘Øã £Ú²ÅZ7½â GÑf†‰'z£ÂÓc:ŸÄùÅÖJD«fœ2;@úá'^î÷¬â'HÉà‰‹à/5d;4h>ƒT*óOÄødlÆá¨Á¾­Ï(Øs›œyzÁ>¹CéÍ2^ÀÖÓ ö“Ñû²±÷,( ¦£yfœ9§,îÖ«`‚NY€­†0݈çèëÑŠÐ3bCAœ×â‰YÃ:pú‚1ŒÜUCÊOPöîNho W)Bþ\*ØÙ¡‚¡K}´vh>ŸF ÿb®Ün«”–Ì”«‰ªI¬*ùô2‚J4d$‹’ܳ’QˆÚþ_„h¨¨ª{º¸úgȽ„Ú—¡Eí‘{S¸LƬ Aˆ"â„úðçn߆͟ùJe8¬VõæCãyŒºåƒÞ^+€îú ùT\mƆ”¶4Ää,¸ó«³±ü O*µ‹jŨËU4!5 ÓV ýf‰XùïŽF–Þ©Ññ0,æf`ÅDìl0¨‘øöERÔa«#{3ÐÑv5¯Z#$Þ‰ Fñ†¾=ƒý#Úzˆ„¿!*)w®USoÿ¬bÂð[TßJÓ®©•ˆ®©x‹Siž·ïpA˜·ÝúñO†¿B §ófÏxr†ZÍÐ6ÌB¡íªï¨>ȱô^BõÊÝŽïÅVºaÙ›-ìE‰»ʉ’¶Tce/êc ,Óù’| #v£T˜D¦À²†;,t<Û,Áû(š³”½SôF‹8¥A:Ñ­`ÇðÕ³¶U°_Ôôœ'áwqÝÓ›*ö¬F{+¿iš   Ìºp÷ì•ÞÅÁ·`r¦%½ÆO¹H³<‘†ÚGZCÒ>„áÙv¾í…q ³‹Ò™?™Þ½s»kIã"ÉŒÝMÑåšúµt¸ŽlX[Hš6Í% X¾v€N-ÐE½ø™ZMuë»ù«×Ÿ+bIƒkWü/›i¡©,p| hIZRâÐ;Ù.×HÌÚ ;ÛŒ3Õ¼ˆFÆR€&4lOt&ÃNŽ<ÁE•ÛrŒK8Áe•ûcÂìžž*U[Ô-·xk{rUÁ8 ˆJÐTŽ.K é+GÖA³1û3M¢܈Єy"Ê\IIیٞO@±j±¹Zº†D!ú½ª^Þ8µ¡î1ŽÆ-Þ*0k‚N*ÐÏÎL·1³ãqæ;9ÈÙ/H.ÿõ•,VƒËˆ|Ï-/oQ¨ÌPJö±°ÉqU¹DÇKŒ1ØÉ¿²›ÌY]½ªZò%%Ž*tfî¼ÞNYb džF1v]C`Æ,/¥ÀÝ2Í·¥X' IÙJ?Tß¹m˜V%²l Ï6»ä„vP68T©RFÏùȯ F,AçÆ¬(Ìrðœ0@¯å O2у)`ŒŽ§Y²¢MáÊ]µ”'aò¯œŒÅúù2¹‚uöÃÊ2"!ušJÇêäHAr¼xµŽrÈÑ×GEbúÚÕÒäPÌ>òejú(-ÓÓ…ÜS«S“™m>\V=w‚‹ÞwN÷Ø5ú2K &QEÀÛA(Á¾á -VSúÄW4Ó4ÏÐfÒûýC³ÓVG<»ã§½{6Ì™H¼ÑFÔÄÁ9z’xcÓeV¸—bdy?In&>¿äT*h¸PzµÐããÛ ¼S¦ò;¯õjí§û2á·t¬É•Rp÷´ò£5®ýhqç[ ª )°ÎŒ]û)|"÷"\ù4x±9ä>³¬š1:´"=#„”¼þÑ©Š¶ÆàɔۖuºMTuiék¯Í ï*Lo ã®4¶³BÄOùšq?0À¢ÈE…€-M+™>>ï1,‚P@ÕJ¼ì÷OOºA¿h-Òšxh| í[‚$tFïMÌû†û> º_ÿïÏS<³î^óM®CìzsJ¾Çw•‚U¾¤È|:MR^RÊŬ¿¸àÅÀKÂàÉ“',¸£Inx±L wW`˜Òr4´z)v0½F¢–§Œ>0±µÎÜìR{f»éfËߘ¨Ê­ÕÈU–,a쿎†sî!j©¨XìY½]1nwRÚØXnû»t¶/Ü! 70d=Èp0ý5p™;„×"$‰í#¿¢,úŒ# ö0­ûL/þÕꜗ¥Uc$)o—gUÃàÎ7µ²3 vlüž'I4óõå¢F8U´ôáÞ<§Çoù9>MßUs'LŠ©£‡r¥Œ Þ¾µî¿X¬™•‹è@›  Ð?ô4ï0 é~œ­ ÆÔ†ØO ™0ë¥K'0¶7pû±îP#ك͆HáP–ÛûØHÐGe’V›á M›œꓯeòkÑeM{ʧUq;FÃKZ)AýkŽF…«º¢ño%þIïÓü‰fJøóVè‚wð]N¤R#üOÆX°$)pAô¯†(¥&Xoèa¤\%‰?ÿÛQ>ÿcÄÿæ¿|¥ñ?Öמn>]sòÿnn>ÝüOüßãC¯Xon\ư»Å¬¬Æî?߀£+Ùxµ™oc¯×ƒNt…óhOÜדs k.7QLi,çá Å€ƒPêß`£ÎÕíÒxÓdX´Šøª'L¿1¹ÕÅ}ðo¶O<,·qŒêúÁ“¶åâã #mÖƒ½ýŽ'?ŽfqÉã,ãPAð´ßLSXNQnA.è%è 4ãÐÏê àøøgXÆ÷î`s=UÅ7 <À‹)ÇæØ¢«AtÝ“5Õ¹#„²{|tP;i$ü5}+šÃ$ŽðOïOý¬>¹›×£Á\Dõ¨>ê¥ýëxñÕdÌ«Û7 ÁR„¶e†Ý\~ÂUë¹ÌÙŒGLjc§åÕ8ös«`¾“‡¾×QJ]hò;Æœ¦äâ+ŸQ2R¼'aéýÉúð:õØàü:³ vîëF)¶ÕÝ6ì´Ûîl­útMÞ~‡…ëqëäÏäüãÒzØ{77gtŸeó1ǶÁ[ò3*3´pL ‚gE%Ñu›Þ¤º¹¾C{âg±AÁR4²o‹;]í4¹ì¡ì…©(öª4ª¸ÿ?Ÿ à×,I*7VQËaŒ{ÐɈÉÒ?_ªÝD™ºw%Sɼjèqÿ_éÛÍwh¡Bõéö÷£Àùô²ñNÁÆY«mW4A*ìÁòÿ#>YߪŠ'·âÉæ†xÁ£5ñÈuM­ÏÔÖ5µþ­x¢©õK©mhj¦¶¡© nÅMmPJmSS»dj›šÚå­x¢©]–R{ªq³i…Ÿh\|T‚üÌ(˜‘Ÿ™—#o%Ç~b”—qýÜã>7åWŠ›Ö.`åë?-@Q&ñN:uË¡ì–[O©[æÑt·ŠÂŠø ȇqü ‰Œõ  pþR©Ö(v{åC´°½J4rIÔrŸ~B=ûý·Öèëâ-v`|R +ý~E`‰Ì±€á…úìíºJàâÄ9R8Ü¡…ƒ9b™»10ÐéÉvлº‚ öpa ‚ºãˆµÂü°\«Y:TQøQ³XߎS‰A )ŠôíÚ;|A©€úÖ‹uýb`½ØÐ/.­›úE65_<50¬Ï ŒØ|±en½x®^ÐvÇt–ž¹etºámUb ßÞ/Ö4©¡QsYw<=Ó"1ø˜sUåm2 &PÇÝA$úÍÚ»¯að¿gØy™²bqÏì‡ ¬U“)î¸ÈËÐ_zŠ ¬P2†ýËY™„éÆ2QíN@4C˜‡ã:ÌAÌ/Œc0¹CƒäR:êäM`vâ XðgáZ¥$\ð ³pXÖæ¯=i®RÆ?øvÐì´Õ[ vC›û¢ìi2¡;[Y £Þ±a/"ë{týÞkœi:&âMuÈ꞉µÕ=¤p§‘ êc°ø3moea­Ük=ÎEÖXûdB~‡E”@ãkAH‰ÐG¹j$úF³FÂo|‰ÙE[´\J´‡½WBËf ­Þõ±¶Â¼ƒJÙ÷i»ÍážÞ]Z•2E êÃ83P†ÊÀèT VIÌ5CÚ5ì:,pMK8»©XX;0Ê`Mƒ=7†·Üã2D®2PUÐ+’Ñœz°š‘T¿‘Ie° DÛÓY£3¼S¿ÓÙHFž¢ÕAÈsa_o§ñ!~¬ÑãTR_ DX¨Ž{XAf‘WO£™Ã,–(éýüóÏ‘+Lø¯WíU/P³¯ÚïŒ)[OéŽ5Ï>oö"Á,äH—‚…1c¸ÀáÛ#·ÀqŠgEK»˜ö™Ä\¾˜0ç6š!G"0‰µP ±üQ©F£ñ¸ƒØ¬vT"4(zGËâÓ3#ë¢A}ü @"ï¤&ÞAT£@1ò·@¡\ENEÁ©‚@ íÁßÎ'|¥BßabDkÌ |Yšç'Üx¦-˜†¾È„zÎkwäc¦o‚†Y¹Ã¿•¨¬Ýí'ˆÛKƒÖ)ÒZ#I…òÒ¡âhÝ~ðÖÁéþ_È Íz±IOp[‰î™­»x?x…ª1…U?Æq'Óì l6õ¨jSÙ=دÁ?ðÏ ü³‡cuÌþÅWß‹”´z¯ÛA˜3üðNÏJ¡;{0ÝvÞÀ??ŸJÍQ 9ÊÜêPÒD@Y )éÚ‡Àeóþ99|U£ƒš¹ª··¢“ÞNí‹)ÛQ£½ÙÃ? 1üsz†ÿþÌ:¯[ôgWü¢?˜½ÕþÕÚDO0{@Ì|zpÎEœsçTÄ9qÎEœsü‹þésQĹEl‰í1±="¶ÇÄö˜Øã_ôˆì b{š4þ9ýÙç?gü§Óâ‡üç̬ËÙ)1uÆ|ïÿ2„€m¹'þž‹¿LBK&—wÁ$ŠÂÄDÏé½r•Ð^]\ƒêáÝÁ1ïœE¤hÇ¿Fæò5˜Ãl?b’x\‹JaƈxÖäü ßÍÕ¿eÀ@½€Ö;=•ôßÿcòYoп©ä!ZÄ(q`ÑxhX4y'‰‡Æ‰Ec’§A-« .gYŽ5³ á¡qfÑH=4Î,©‡Æ¾E#/Sêg&DŽö5 ‘äÙÀqjä(À€4¸È./s$hÈšyo,s7yž wqë© é"Oƒ4€téƒ9·aò%ÙñVõD½B8hë^,¹q®ËiV•iÒ1èC*r}öæ#Ú¿åÏæAó'z?ˆ?Ðñ›~zù\ëq˜ H ŸÐ˜èÏi·Ulp}D¤sF:g¤sF:/ÇÙcœ=ÆÙcœ½²‚HÎÄ¢ó 2úw UG¡`ìÉ…(Tu…2‰®–@A1i”d&öÖCÔ"›)Ц•1ñægX»×=e0óJa)Å`iŽ›¢ )pKô¼õƒŸþTTþG|¹g=*<_°sÞâc½[r3ªbhjŠRX´ÇKXX¿æ±J ÛS…]ÞÍ¢eÑþ¾§JsÑ i†íRXhãbSÁ¦´haÆ#.Jf›6ñË™g#aHiÒrjªMüá·Ž%dxʤ­¾uü-/÷OmT÷m;G´y[}ƒ·èüÒé†ëÕ`C÷ }¼&Ówf2ÂY[}븨ð°ý¨ š¶úÖaa¨ß—”ŠRm«o¾R¿÷–j‰‚&…1‘Í[(ÁV¹|K^Ó¼¹¬x]̳j¡x-Tœe–¯‹ê-5/Þ\½]¼I=;„Õæ ª­U±Œ&wgñlÝjè&õfñj£*µÕ³Mœú¯xõ´*©gÏlpêxâÕVU>ÒàÏmpê1ôªgðÞ ä³õª=®šÔWÄKƒ{õ,Ͻzep¯ž=«.ûêÁ¾zö¼ i湆ü|uõ!ÅßÝôî²`ðà vOpD½ÅøêÐD´îþkÒ-¸™­K©£Ý=ýbÝ|Ñûkøâ©ùâçÝcõ♹‹×Ý=χ&B{—ßà‹M“P÷lw¿ËÏŸjiÊÙáñº@1Ë;¦Ómóó-¬õâ¹CH2µm<ÿ[kãçö:?ÿÁ$ÔùëYW"ôÌçPÂi‡Ÿ_ÏÏNš'¢}žNGøùÀ¦#¥7ŒÌ‚‰ºx1ô›6œÇûÇQëàðä'D;Qß:]ùˆ¾™Ðû”&Jg;Vû0y&BºK Eµ77‚JV!in=¥=4üº½Tfo)Òi¦Œ|,È7·ƒÊ6™àë[Ae}‹¾b‰›ôKÜzZQA_P*HŸˆ}Ç ú'x¥QvÔnßÊãNîð‹›™æ…cMåKñEBÔ‡‚g`k6Ô“GÊ,z%B^ö²X…–ÁãƒJ7IFÙ÷ô9…A +¬I°‡%ø0¾ Öƒyó¼—¢—ûH2šdn§Ÿ€se€?ũST2ŽÄÖïåe}ˆùOQÁÛ†¤½0)@ˆV¾Ý¦cyã=]•Ôï¡·8d#já`pt 2çGƒw $z#èú£kDÕ–:aðWY'Aàcqé& ”w€ð PN†;€vÇôÊ@x¨ãqð¯Nýåy¿by昲ћ\"â ·×Õ_ ZúžáVÝ/“Qܧt”õú׈Š×§‘HéFÂ$}yþ'ÎÐk{v„¹n@Œ.l}ñÕl7¡ ?»^Ÿú/_—µ`ÝèþùAø5ªl[ýÞ•ÀÇW·Ø}Aý~N¿OÕïõu-¤“äãlÒmaÈ1¨„èvª®j÷¥$ÑUo÷ªÇûìc–ƒ ŽÏ!Ú%$ígä>á*»ÏDv§ÁEaƒ*ÚÖóX$\ýRENvé»~h¢‹ +WÔädq5M}H…ÿ½¬ð¿À¡Æ`ð/Q¬>Œ“WÈdËÀ9´p\&QŒrNöt½ÖrÅÉâDfŸ¾›ø‡¾¼ÒôwIðÂ1 =Ôâ((ôåqbâ´Då§@ $“–‰sh”#™S4‡PÌrN±œScœâ–1£•ÿþïÿv>(î7Å'ÓÉàƒ63 §²Ssœë>Y+·ÁwrrÐ7ùøI`ÌqhêÎ’$õ~¥+|iüÎkîf<ëOèðY÷€Þ d——Á%4Ìå¬ÿ¥AŠ©æö¶ 6Þ€è§øÃ6V}æ€.à-ž+ãù/-ŸžÕ~>={÷Ë/xÍrÜ›âmxl(Þ:|~W­…Oª54jIzY»…Þ-¢unÓâMÏϤղiqÑÅ´:¯Ïj×­Zgת÷aY¹—/Ê?Â?ÿ†¯Åèç6º¬Ï²è-]V¡OÅON»5<"‡%»YîDzÿ®Ö0ÛP :i zd9s›†¬Åƒh´l²*9LÄjÛý: «:) ·ÂÙi þƒ†ÞýJÔÑèÏùÎ#£#£#þëÃi Fü—Öp0¼{Xyç…å Ñ|áòZ…å 1..Ï\­õß»*UNîùÝRúé_b˜ mêQ£Xl‘*µ ukHŠuù" +O†~ùÅ£jxþYÐs´€ÊTY •黇”åë5º¬2U÷ð²|=F—U¦ ‹Ëú¬a˜æ†ÆŠ^J¶_§è¥DýE£«ªO¡JKJ²4*(QR¦R³z(ï·ó7“°J±ÏóØBÒË`·òØ¢ [Gtñc/Ð^Î÷ƒøCœ[̧ +àÝ"›Fa‘;Â=™“À¾G‚ h<e!ÅÕGJ§È¨Ô—IÍbd)üœªùcÿˆ{aï"õ_ž±Œ˜<^¾„ƒdd ™?‘åà󌨾0‹²ÙÛËÚMmôÎjÿîa§»Üp.K…¼l2bÓ+¤Ý,Z p:+)¤t¾<%N]H©µ<%ÎvoR2Öi³~ßšPñ:6<Ê­G°b4iöÎÚípˆÿ®™lu»¿üßßþÔK­Õ­µk¯ºµW‡5Pu‡µÝÚîa 4Ï~­];i×NAÿ¼³tŽ[,ÿía@jÊ èʨ#¦ëd¿]]¯><¡Š+YôÛíó»ÿJßÂÃwæ¢_ÄÂ0*¸‹áß^Câä3«ˆÙêEúifõÓö°ï±ÙȳŠzÄø-î%? žªj…â5ŽÚh†çƦtî§Ä;1Ø3‹)mØ”öü”Öß©NUHiÝ tÚ,BÒƒLVŒ ¿s‰|'*æß˜¸ýk‘ñŸó±#Ò?·Í"ÿ<žòP’ ëÎõOèFæ 1:–…uÌõ©?S‡ú] ËXÒ}C†!o5Š †AÁ>™·n0vµYS¹²±ÜÇ\éÑì-â¿Cùk€7PYõI›}Ùj ç “DR¶bñ£þxjÉÀ=><>=ûÛÅÙá«f§{xÖ7šèS‰ZKôZÔú"ö'7Ì0„$j‹Ïâ³Ó †µ¡ù£i jÿq(êš‘¾B£[KOÕ“ù80’™YFépYæls”Œ8¼C/í8ݰÂ(º  øÏ ÑÅCÁ/U ©ÈUxaâ3?"=&ï°úaarXŠ“céÑR ™åR?¥¸Ivì„@‡Å¶.íˆó„a6ÕÍ"œŒÇ½°j=SÐT‡ &pXPMåd$ðÜÁ¸Z¶÷£“ÈŽsQ”k˜Ö¶uWÚHã¡í¹Âi–C|‚çhZ0qâò/§¼LLW‘ÒÊނÄMÅ+Lö&âO§Á ƒ M˜QüžÐ3ÂÐ'CŽlý¸7“d•‚úŒÈ»º¥3t¶6OÜ]I>e™Í§ñàU/{pÝ&/mR-¬Ê¾a4ÏÀ8éáqÌŽ_Îf+ǰ—±m>ã ”®+C½ F)¯†fÊSfœÔ΋è©h<‹eR8êœ.Dײ;¦t‹Îœ¿”Eƒ]Ÿ †1 Ð!õ±ÝKaLµ0¼m¨-˜1j°\ª9õ‚-ó-_Åù¶"R™ä¬Aah8øbu“cKÛD¢1ž_H3 )ƒ‚ÉíB}™ŒÄ†ˆ†ÈäbèHØ“> Õä¶¼Õ•¨se¼”k%–ÁUKìhªöƒ8²ª‡Š4ý+µä?fîPлñ,Îé€ [>ìec‹Pµj’Ê5/ÔY4´Èå¯î¢Ý`õ¢Fý±ªfq“3YV-øc6«äo‡Â*‘eJ#iඪ[OdÁƒŸ3kT+än¿WÕ~>Ýg!•™ÍÍïB`•CUµdÛÙvÒÅEƒ'ùÂ*­/¡@Veýd>ñˆNœ¨Õ6.¿üF/pÏ¢,J?ð¢x†ÛÆ|Ô9§Ñ è³‚#8ë_Gƒ9¦@Û G½÷ Q¥W0L:2»Üa˜Åcú;J’÷Á|*®è+ªLEå]±/}•0Ò Ú#qÎÌ'±ºÚ†Ñ)ébœeóˆÄæÇ4ÍEÌRùe<ñ—Aü¾ðI±,à@会Q’×Hŧƒ¯þt.Ë„¯(Œ¦ÀØÞnpÙ5øNa¨Ö±dü3”¡\r9f„vY´ÑbâÔ&á<nC‹  ª­ONÛ  t³yKÔÅA V?»gÍîk„ïùØzgÁ`Ö="¢aT$; CéÞl:X[ñŸSè‘,Us¥bŒ§T”TÄeCb4š°†ÿ¬>[³÷ÎvOöí²¹™¿FøYû2Œ|j‡¡Í_7I¾Ê•S³¡´ sí£xÈl~ýøq`ˆˆ I77DØP4zTÏÿdJ{¾EºoÒ2Ñ}Œ§TÑÆ2FQjþ4:3Ì@:,#’9$ÛçË#:—¥tö¾ö©\¾vè/꫞ѳÉ/U_ƒüÍòç6ù¥Ä`÷ Ã$¿§Éï5»§mŽM‹Ñ¸vèßZ°Pä?àËb©ï5OvÏþ&(Oˆ2¯L ãÀ”WmžÅ—Þƒ%yù¦qÿý]p‰GYèGFG,dùbL²Ì<×$DNøòZ}Á•9uA çT~ÁØ–~Ð= *¿´ö8•InB’ûc¤Ç»£Œ.XG;XДhMª FxüXi¥ÎëæQ—U7gÛ‹Û³ ÂG7‹,Éh^%”…B†ÇL)´ÄŸñagYZ Õ|Iê*øZP[Žñ)Â%‹E¦u Å’¥ñ•ôßï\& ´JöëE=a¥*Œ˜¼•jW„”í*ÀêãùÖScAˆcƒ¹äöGþçõC9¾iuÑ\§¹PÆzÜQ߬ŽgN„@¶¢V&@q“È È냂e£é¡cÅÓƒõ|—ÅEc”Žc°íúÛ¾']P'"$þU""6TpD!(ÿ1û¯õ.6Ù+PiÌ96ß(•‡Ñ¡væRáùíÝçbl»F.¿d¥7?ûäÑ¥ióúô :Ô§DU’q“ž‚H«K×xš"@W‚ã£h4´*\X ^ÍD\ÃÛ`‹ù Í1aλ@nUžmÑ‹úºÿ/‚6fmž1í&*¸Ž¯0/ÕQwC\Eg3™=Cê%­‰ê&lUé€ÓŸÜJåT#v:ÃÂEO½\ñZnHÖ]­°+¿6b=ôþQWÈ-¦Ç&q^D⦘ĹMb¯ˆÄe1‰=›ÄÑl-º» ®©@“àet•†—©îiûèÃáaßb¬dê y9N¦Eb3W·û%;qð/ý¬yÒ=Ňèß*ŸSêEõ£œ)#6î2¥;ãJ_5ó%Äù" Ía™0Ó„z÷¬bJ"®(‚?vºáZUÝt…•¢¢0vdÏ -¥ƒ0û§Ç–Èÿç†ó~2¶ÅmB·}àÓø¶†šïô+Ï›¦[ÀÄF´Ùî äCœi Ò_Aó%½ñ5_TL¸ÆÆµÉ¾‚`L ¸Óm{ô‡tˆ ãan¹KçC¦ÄÜ¿v›X M¸Q `ÕdªãV3Ët÷!ÐKÔ×gƒ›õ-©…6'%ð²uöT¹ ­ƒu Ö­§­Cñ|´9oºêÍÌ~ójC¾¹Ú°ßœ¨7ûM»)^LcëùßÅã_m:—·%îÑÀ’BPÔ½€Ï2Àj`ð”“õh9È8×»FƒYp³uàÇÿ&lË<*†ö‚ÀŸ@‡:' 0R³ã †ŠDýÀ!%wøcvQ.פ7øž“bHœ&*¸©wB{éª3ߎšùŒ ˆÆWnkQ˜É¡^L}P4Ù~$ȼ}¤%„GH˜–ZrÁõJèÆXÉcI8êyèÂ\*v4,†ó;€ö\>²j”–ÖOÌ¿º†#QÅÔ¿<Ûës ]qÕ¶ç–D<{—Ž‘ð9¼ÇŸÍ{ìáýWæ´ "ÃbA‡áOQqYyûÁ9ìé»w&ûÇB~¼Ž·˜)’¹”å:~‹ôX.âù'¬×Q þVü¸êa´‚,U\VqÏ$ÎúƲj÷õ‘üG¶‰Ÿ¼ þØ»#8ë]¹—‡««´@êÏÓ4šô¥[‡'„™´ Þ  vF¸Ò¸7Šå=WÞ&ŸP .WOfÉÓ‘›)ÒùÙó=êkf,iQ j¥onå—Œ-Ð`û‡îÚš1Æ%áÆ4Ûúé!•ÀiY :a@hTMW ¸’ìA¿DÝŽ½u{ëö?ÿsüùUsk±leKT¢ã­DVÔ@|-`Ý‘R4>Q– ã0›Æ“'7½x†NSup˹Ý7\‘S¼‘ÁgD0VVx˜ÀàÀ1£…‡ÉH >Óys¶Ï³×§\ÉiÀ(nÜßÁÛT ·yò—Ìxò¾¯ýºéG›^Ç~¬/}S…bøâm<Ž6¯ªPÖóÎ.çD”ªû)!Nä ¿J‚ÞMï.È™jüKq'zœ¾"¼4ŒgR8èT&ts8»«–Ki·Þj†Ýz³Ž#våÂÍZlx¸‚@?úð¥'¦ ²»wØ‚_ææ´‹fºÙvëg‡¯èyêÃ0RÅ#öÁâ«x¿k§^BE2NóQô¿ÜÌgßVò5µˆÔL§,6 -¦Y-Õ80ö Ô7?u `ÆPËufñýzÖGûÉ(Iô–fUžÕ5ÜŒçu›’Ç+^Üm­ë8 ãÇ)ˆ°,Lm¦¡…ÊqZUÞuÓ71iºÌ£ïVÙ½LÁ;º¼:ÔÑŸ )ÏŸ=ƒ¿O××7ñïæÓçkô\|þÏ77àÏÖžÿamý ü!xöy(üÌ1¡güáŸi]Šá²Ùƒ×ü,ýžŸÂö‡'Öƒz6.‘NéxëéÓ‚öß|Šïdû?Å÷k[[Ðþk_´¦ŸÿÇÛ·ž"²33>ÎÇ¥ÉÀv-ïéœïØø®¬#ÂÃiUDÔ‡UDo «úiÊ7âVí= Ú[ ÓZŒ'ë«ÖœP¼¡Él'bz Õ6ˆF³^ðþO ®Òä&ãËxÏ× n‚€¤—ˆ%ÈífÙ|LÙN°Ëñ ÙRŒe0ˆŒ"b*C`áí?×!,¦ 0 &W¼ñ…"Ë/§‹t9P9.{wH#qBn''=P‚厌ðóöÖ)Œ±#”j[ ÕY 5ƒ„kžtºgónÿè^û?=éž¶.ŽZ§ç¯Îvۯ̀Êâ( FY6ºÀNpzÜì^í^´O›äù æZ¶Ùìb"ŽWì 2—>©ïÛÏö¬ËjÖ»×]Ž3ðº—]wñÊÃ#\`Jþ#èâÉúÆþð ƒ´Î⬿Ÿ@×HFõñ{JVVàIxõ¤7„Æx¢5àÑo+µG+ða£¤"›¡[ Ö ú ,•o&¡†ò-;½AVd0±ögš›C|rœ]ÕéUXñtJ 1 ,D*è{;û{Ô85ѽµg¹h®Z•CóìUÚ›^×¹·\áw Ž€K¾G¼ &? ~ôbçä Frî,3º5;…ž>»‰À„ƒáE{¨S”b±º7V!Ê$U³`*úG×û˜¦åÐùoO¦±›ë¸ è6næã?§Ýׇg´gi@Ýzžaw²”2&€–A£º3À©tzUQ, 0ñ›—Âm±‚2ióÝ‘xç2ÅØ¡4UMRäÊ1)=2„?wsäÛ„¥>‹&†q,ô¯1Æ€:>ÎòÍΕ“ªÞÖýc¿Œì‚z¨uqÿèŠåMÙô;Ѹ&¼Z±›=%tÕ¸»D˜Ü;n"„Æ{¨=Šå&Î"s?ÚÛ ¡Ð(ŒT ü½_v5t&Šq^ã.ÝB˸]0Å ]ÝjÁ£œÅd¹ ÛP²ÄÓD€ý?ÆâL¡«V(ŸÈ`ÐMˆ4ÅDY‘Q\¹SBϦ’Ýô¥ê~7¨²§åGuÿº^–¯ˆÌ§×$¤-N§Y€¤"#jI¤Š,†8x ï¿‹ Ê9ÈÝÑ—± L&ˆóÞÜÛ*(s˜©:ÝÝ“n‡º"!7PÍ„‚5YÕ@(޼À—‚…NÍ~½Ã׿_È—¹m5cÃDl¢È*ãê'Ñ"zEºbnújž—ÚòU€@íØ›Â;ŽÑFÆXdÄŠÁ^¨‚WHBF¼FÃ_RԘ˴4%#+%’\‚Ìz A`Öœ³G¥äüHM "_±˜³ ÌªþÊptÏÁýðP·4ÄQaQ*šßW-KmhˆqÒ›L˜ö`ö¬ï‹5›Ü`-hv¶o̶´z[®™iÀv¦þô[ËèH1¶ÎGCwq‡€"˜ÓMÄp"VVŒ¹fŒ×Ÿ+‹ ôã?ç”Çm%øÅ 5°P¡Þ€úmlj˜}ØPÚeYPPýÓããÓ.!ðh{x÷ää´»ÛmžžÜÇ Y¯„> ÜÂo<¡ÂW«{éç@)ÔSQµöÞÓ®Ò çm’ ãfA‚†n("d´Çb:ÂDÅ+d‚Ðf µeÎ{©!Ñ©±—F!ÞÔ©™ÑÛQó€oéÊOCö"üQePõŒð>‰yŠx(J±ÞCÓñyhõH5- \‘PcÑìZ BVEôJ'.>n•Ú¨w™ÑÕ]”|+üÅh¼·î¹ÿyŸý­›uüYWMÔ¹ÛX„^Cc5¬J}ÒeèØt”/Ê›5¾©ÍFLîm6Ö ‹U¤ì˜pCSoP†BäÂF™¬3¹<’9iðŸßP :¨b¢ºc~~ J+€ÿ°vjjÜTøoÄ1:]-¥k¥ e•¬óõý`ƒÆglštãuÜØX}jЦë¤t£“F½Œ<úIj`º^JóËÁ£__õlÖÕeφ:ÉÈËIÿí".¸ñrÚ•¿dUc¢Ú5Xpp`ÙJ:z­jLûa€Ži/ú FäxG!UDóå¿æ+ɘˆCDžîI•s´ Ÿ Fv€4,'Uî7nMÓ&Ð'Ý=â Ñ”RE=¼ÞJ„°Œþó©êòe(þÀQø,Z‹ÕxIæh(nRøÈ%K•¼+îΤÃñ\,©ÃÔxÔ®¸Äü€PTC\V)ªa‘…õ)P&2Ý;jM÷‚R~³*IÙ²´ºz-Ql­CB³o“í V½±8¶81O“P¾7«K3µ©xUÑ U¾R`<â(ð°¥ìZŠý3 OðÞÆ'KÁÐElµMCC¢hÕ£ôÙ€—&S–J’R) v50ƒÑ eßçõz”•î®Öå:€Öʼ¥–zJAN€©Ë;X@O“,¦€‰Ô3Dxw¹+gŠB æ}F"È'ƒyêƒHQ'J!.¹—‰ý­¼£+ ÖX—”Ä@Ï©}s6T‹¢|hçpH;ÑZ x7ØÙ¡þN«ùÂUk7¨yH1Én?ªŸjrŸC®£ÉÄòëÅÝP³fJ$"[#׆øfb¿â»A-‡/%šÇíçŠÚÐÿ ªa«A£E< ¢°P È».ö"ŒysR§$?öp1öE‰ºÌë8ѸܰæÈÔê ^Û 8é´¿åZÆLN©-êH†ñwÜn‰‹ÿÊ6–×ñmcY®*ÇZW˜ÔÎ?ƒÚy!µ½Ï ¶ç§FQJŽŠé=¸²„TLïÁÕ%$?= ¼ ‚.4ëVØ…rò¾å‰A¬aZné¨ÂK|ÿfªÝƒƒ–4iÙŒ{_µMZêùLØ´Æ„Õi{mwS‰¿·tÆQÛ1E UôÞVE¤4ÌZvÞìý^µ\¾’ÿþ¢µÌ™k!®ú2Ê-÷2§ã“¯®ºF›8Ÿ)Ôo–õEÖ…†›Í¶i»ù;ý²¥Xo"Úø¡Y7B?Cï¬,ˆ&Éþƒ$Ù¯äLDP0¢'ÀÓŽŸ°•†MÁâÆ.{“â,(£–B-¸‘¼[5F?˜™–ñdKÿ¼é/ÁN"6ð.ßä~ÝdŸ®6SüÒ'û-Þ$²@Z-ZŒëõÔršk}éA½¾pLò.Óv íà°¤ÊþÕÆÃê¼|•ÿýà:kæ—¯³JàRHWCnv»KoGZÅHÄ¥ö#a­i—×j¥ŒÕ‚zËêLçµÈX.§?íð£ÖND’5·â³¡¸\¨ºEd ±f®šè³ñlu(sÇND·( s^FfÃ!³WHf¯ŒÌºI/5úˆœ¶ËHü۬ё9MAÛ±#:»ýæ)O†šÐìÄ>~ h.ÃYG‘2´Há댠꠵‹ñôá‚:ÉP¨ºÁ‡‰o KÁŠðÊJ|S\ä›Ò2ß”úfQ© B òÑx*N,ÐŽ´ãÛà.l×ëeÀW¾·ø|étÅÞlä)RH€< bט¯ …pá¡ÐÃ$Ý÷÷Â. |xò“¼äãÒ¼æï—vwÑÈ µp.¢kýâ¶6”ö0‹×.ZSjh:QI@\yWÆwÔû N J EG•õ0B÷ïïEŒ«õvRÙ‚² ä†I¢ar×ãÂõ0¿,_¬Ã¡¬øó5±ñ×åô’‰îds1ñÌ4 :Ê1'kÃÐË÷>澌QX·ÝÇ5‡Ó‘Ã\Z8G:ókr ƒØöcü›—ühƒX‡ÄÓÇôd¬Ò9½é8Që©›€’q<dzœìÐi@9ß9\tNgbº’8GbÒ­„\Ú^š._ŽONIÑd 9Ôæóiûo÷ï`cü?¹(Ô‰'j‰xXY<›³Ë:»·‚%üã\² oo2ŽnÐóOå—£ípQ(»÷“éŠ"ÝRRc<ËÀ ¹åõT¦R µÃ7lcB»Œ†’,rö#F¾¦½´7E#*࿃ƒhaÖ<ô›¤XL¾ûƒz`}ÜDгãSsgsX¸õØ}=Àçìôˆ†~Ï&ÿÍk"j1FŽzï{w!žRC}ú}ö}Z±†™<„TiaáKS"Ô ö¹‹\~@kítÚ?>9j‹ÆŠ œÛÕWð|F)a½'{”ƒµJMXzóãÚl°`‘çà#Lcd”w,"y+G.EЄ-hŠv/NëÃd4‘¤Ù +e·5o×®ñ̪ã^ȉ᭣\r—3Ls×ÚDû sÆ 1Ü­À!Ò=Ør·²¾¬,|û®Hp¥BBû‰Ò\5{í¤äâ5°Ý»Ê9-µa©)³®( Ö†¦>ä߆²R\¸ÅoȰ´—ïì¸äGöHô »Ž ’‘! ‘*DJYd ‚œ»þ%n"f"A':8Og×"`)¨#øˆF$°¢•Øop˜;Áý˜çAI‰MNv¦\ŸÃOÁënýº—]_Pž }ßÓE Œ´¼"7ªõâQ`_j@ϱ“d%óÉ ¢ù˜€<€“†â¤AÃA°B)‰9‹/÷¬a„“xàíÜõ:ó~?To­ô¦è§> 2@£öfaf¨á· 3û|7"€7¦ëüþÑ«ú^ëtÿ/÷Ð^h.¼¬ RL~‹7.H” [4´ Áž•±ºà í$;ZÛÊ1÷Q<ß=ër¯2êaÜœžï¶Ìir` ñIÁQÂlá„zÍà[5Ä«Ä/I€…ÏÝš2”AKñFOØäÖ$kɾ¯HEÅëùþ"üqb‹1&Õ‰7òøFŽ©:RÔ„Õ F^Ò%ê†ç—UÖBGCÓV¸2ôÔoÌd¦ž÷TÒèCø µp5gØè©–Ðq– i_s,<ŠÒË–{¨êМÉI4 þû©ªQ͆ްU¼G çuåY 0yö[­û>Ž^Ñ+? 1-X,ò|¨««Aÿ:¢hÔ`Úø¯ùQlnóMÝtKR‰ßÅÒ± ËO1Ôí¿és–aîõ{õvçðÍÁ)ÍEbLC’Dë!‰7ùâ(ã*Tæ¬ÙÊ_ Lå—«GåQN’R>É|6ƒ¹7šS…±ì‚îÔò"™™¬½_Ÿ¦PÖ¾Àè‚Ø<­g³Á)Щèka6cÌHίœ†MúÕï°÷‡£ä†û%ï~ãçá÷¿Ÿn¬oüçþ÷ïññ¶?üzÕËÚ4TN§Ùo¸úMŸòûßkë[››öýïõç[ÏÖþsÿû÷ø€J󴶸Ë›³æ«×Ý „È´[°‡·#[½K˜0[ó>žËv£þõ$%W ˜Ϻàl’&M7w»x¹Õ=;±ÝŒ{Ê­nE‡8›I‹ÃŸÀÂKs¼òÛ%¤*ð$rqÚî\ìívš´ñ|7%–~ÒÆ{ÅŠAº[ܽ›Z GtyåãÔÑ-Uýæp2ˆ{eø*2­x6ýº%¯xkØÐ_±§tÜïÁ´|S«8ünë[âݸwk½ £ê¹x9IÐ=ð>ûµ±^ƒ ¤±vsûÃÚNpž¤°Ånàϧª]«}dṀùJ¬°•1ê]²hî¯Ú”·Q©ÀÊH~oU¸(º©ûXμÄ`Ø­sNÛ¼©B#ÔÕÛG4/sA:+V¿5îFÓíïø×èt¸ÜJuþýH§eü©7šGú½z$@0ÛnWÞIjX"©›ïø¬tfƒQh…ˆ#Ë9Æ+š÷—ñ_¤ÿŸ zéMr‚V8ÓÄCg‰G…“„˜"rÅɹe‰y¢p¦ÜhÎlá™/`rÌÏþúÚsFP:kåóF°üÌ‘«S›g §î}¸öˆKÎùî£æA¨t.Xj6ðÎmÏ<› ÚÎ à›Ú®îK¿ßgüúþ;Þÿ­¶¾ïS®ÿŸ­m=ß2ô?À­on­oýGÿÿŸpÕ«å×øaKÙú %qó¾.c6·OÏ0CprÚ=ÜÁPNе›"Á¥ vô@CLæãKPž_´< 6׃píÉsz;½¾Ë@mªLâH¦ ½‘RJ›O¶6ƒþlþ#e­@Ž÷Çw¬ ýÊ'":¸Ò#K±u®çÃá(â÷×oŽŽZ‡fX%:$Xn.ÒSaÕ»ÞˆLfyK†e²‹ØÍÆB€@•}³Ç©‡ÇÍ.Ækr ÂÙòxŸÞ„r2yZ¸ ³¨ñs‘OÍz}ŽyæÄ,c¿ØÏ·íÇð´ÕK¯"|µt„(h»†Ù@rÏ’›@”#ãC‹W7³$V¯f ¾X¼.‰ÇÓ$Ëb< ¡©Iu½:Æ9«“Pä€îô&ñìŽ7`¿yÈ64#õnúšœŸèÞÙSžé&A ÖåëK|ýL¾à» …Š!h¶ ÔK|½)_ðõsY,zý¬oñ Ë¿ÝÚ’µ¦lxAŸ#mE ¤R«bD‹9ΰýªÇ™1 C!¼u¨`G‘ªî,¡––-NЪ•ƒD·¸~ÓÄs:‚ÉîÝÍ¢LÒú)B=Àxxâ-(<{¾-™ bL>JúØSô¬Þ"fÀ|9/墪íÊ2 fq­?™áÁ¹S3 ôò%¼ð=çãÖ¶Oç:Á£LÓhgQ×ÄÃÁ¼—‡ˆo©8$·v³†W6Äϵ›íê;uH è·г1 ¿ò4*’7­oY?7žZ…‹s ′$ÇžU§Í0gEoŽ{S +NY¨ç [¾ÇÛùXªfÔ/hÜ‘z‡ÅVˆf¼±ŽÐZgÖ;uИ‡»Ç÷XXMœ§ïǽ÷˜xQo¼}gÒ©ƒà…¡C¬ƒ›ôd>æØcr6;S ¾P`Ãr0ÕÆB=b-dÊÒaa×<逷¬0—“d‚êuœ h±£e‡a’ ¬^ä@àyçç¾ÿøchNSZ¿ÇUih§ã{øC}\Á?Ò=Ð.ä²`«|'ŠFÐMü™Ž«F‹^Þg™Ši…=ÆK ` R MÄèFº"eÜ'Ó>ñ奃/™‰èªª…Q+ÞÎÀ‰7þVÕ·±I”\ĸA"ýôNµC&¼|ü(FŒ"­‘)Z†ª"ïž"ÃèãI3²GßO¸üüóÏü~Ü£P¢ƒd³›¸Ùù‘ÉŽ¡0 £ÿ!yA©Ùƒ9Î.‡I:-ólS~´ eçR¢~úigÇæ¾ÓX“QÁžÖu&˜e ‡õòÅr‡ÜÙ |äb3¦>'K&å”™ Y­á¥»àEò0»Þš+š€¬¿ªþ;›T‡üþrêË`–µn—Ÿh^ö‘]že’¥EB*z<—Ýʆ™3Ægo¥á¿«æÑ8…´ÂÛ¨±ÑaBZ'ïıroð 2+ä;£øBíÉa§Ë KZ)°º-¶‘D3ºNd]ÀÑH_©ÃXT¯Ð}Õm‘‹W”Œ£Xƒpà@¡BÜ9ó9ú"f&ËÔE©:Šô%Tc^ùºcÙ]eãb=7”]à%jó¬pH>L‰|FÑ¥Y¶ëDZDû­Ã¸ qGá¤;ð£ 䉧l6µ,8¢F*Û|eøQHä,Q¸”"ò}!iLà‹×…è˜.£^¢aîU?V§[QùEBòK‡èu}Í1UjOæ4n?Pt#¸3=ŒBL¿ŽÜ×1y…ͯhtç;DÕ%ÔéZ¤:݉¦ôV¼¶$ 4´,HÑó5± I ÿl8Üé>ë°IÀËò 5Ôlu·ÄÂæ¨zïÐÀQEådHË#ŠËhèc0ø“\âçe‹íê/èæó âžr“+ ñý]~VAJO]¾«‹¼v¼áýñK.ý>´'ˆfýð¯¨ÒÖnžÊ1Ò¬³Ÿ÷ÚÍ3[Â(íò‹õ ýHÀ®?u_Iàgú‘Þtw~óÜx$€s°{vÃx$`·\Øý<ìÉ~ݶ€½íiضxtéŸ à5ƒð©¨–ºC Ã¥ñìz'H&£»àÍÝk £Qëdñ÷õ…µ°ð]¯=¨GNB;zv¸û3‚ Wö«’‡ôû1ºžÛ¯ôÃm?xjãñF<Ô½›*„]“;õFÞå|èn,Ð $„SoB±{ÀwâÌ+Ck£á¡˜b×£ªð̉Ú0œ,»F…žê]‹CÄŠÌÜ„pùdz[…S>ù·ªpg ·º½ö˜øÝ`ll¯¢Ìƒï‚gURÏl|W«^Þ%|g©]èðÛ¢=Åu±ØCRº?Õ½‚ç£'õ%ÒÛtèá@ÚÞ ¾ÄWñ,ˆ/í]€ è™Òú…^ÂxÍå*å‹£t=#c¨‘ÑÞmPSñüVZZ JÆ’œor;ƘÃgMmþÆÁÁÆ3Ý ^ÌÑbuJº#Rõ®ó–Ñ6B­ÀHÛýAifž”Ü`?zK;y‡Úê´±k^=Q†jVï‡PíhÜ Q{À«ƒŠ´ø$ 5áñ0dãÂ[ôM½tu—ÜžJ¡až–hkº5K…Ù|Ò›E£»Ïù¤ƒ2ìµ`dOèr,‰eàTI–æê£­™ÙÜa¯ƒÚm[q¤°?Ö·+9~ذNPngÕFËsì ”m¾Ôm§ÐôŒ”=waÕZãlñ´¦ð ³Ú¸%ä`ºÆS®CûYŽ6£›ŠÓâQlÓW)ñ'Ù '|½^×nX{$ˆqüwcAËPÇahí|ñ¡*ô¯?§¡± .£ËšqxŒfBüd£ªz²±{¤L Ð:šAKϲˆ´¶ˆ´¶°ñýYµj hšÙ5¿9 Y>0ºV•ÖÛ#h6ª>]( * žL*/‚´‡™h"YŠ”/©.Œ®ˆœ‡µà©¹Ò Ì@ú"Þ‡)ôO¦2•ê© ­%–ª¹—džcë”Ú˜ZÂkC”0·åwÔ×jÈEµXð[Õ³*§]D‡1¨?ÔK»Þ¿Õ2Ô±ñ­>+ e{ggQWqbö+"V;näÚÃÏ«xíbDõÅêÓ g¬UE‡®¦ï-7ܵÑòtˆøÁZLXfd^kK3] örÛ)«°jU %g³t ½ÐÚÈÐÒ}ÖÒ^CÛ$¡Œ"aÀÄ•ùbY¯&Ã’ö¯ KÞÊmΙ¸J¡ËCEeAÃK±±)%ï+ÛŽ™nžLÊ—‚Q (ˆ"y©Š£šc V¹’q›8Jyú̹ÓgÄmZuð¾¾EçýÆ©þæÆó-ï¹>½ ö¦ìvôÁëò–úWh:(A÷øðN"ûúŠî¡–¯ò~m.<]jAgU 3sꕨîß¾Î-öð{WužÝ{ÎÅî2fÊ£+ Fè„Ñ#„Ö’åÙ»u¹Ž¯Âs8Q&>£ZxËw>B þ‹»žÙ÷LÜÜ„èé‚{:–KC7ù'{ó!gõ·|*åÆÚ,×6¾ßX vÿãSÙ,Ù 1Í(tFФdƒguk¼%Ðp ªËo £®^q¯qSŒžÝë˜Ò‰^FýÞóZ ßôIt;‹`K‰ð²y„ñÚƒl<ú~òÏÇÏÀ"pL’ªüwþ­Ûj1ó( èvh9kꬢí‡"y9» %Ó‹ÝNr°s›4/·]„BZ ÓT‰Z=g3#ŸÞA%U¸0æZSNæÁQAv§>®ÉÄù”ðÔ`HÉîâC%ý}¯%÷^·rø‚›¿Ÿ+˜çE0M'¿û%a4¡æÂ–ÌÛÎßßý\1ç ×b󜗰NäñL,n‡†ØUPÑš˜˜ ¬SÜð/¶N‹¬J" OŸ®U=« ;~…”ýowÂA-P¯M#OÆæç5!*¹ £à9¨HÈ62{°ªÂ’Qôí<0ðěދo£{òf¨ze»ãÜj=|bpQ™;ð,èÐW("9#G(:¹Ñ'?4‡óP×¥Ï`½0Á¼‰Å!’oâ_½÷MôZ0ñQ°¬‡Àýëõ—ä­Mæ„Õx'`•<¶±7AµÙ\P9KórSKSOóy¬ 3Ž!9Œät½é€Á¹&±u $ŽwpÐ2{öZÕ)yLjúÖH@wÏge»'”ñ´ ãô¬˜PÂzüψ`N(a«´¯[--ý§5Wä³{fÀ<÷ü6ažyašÇo¸0Ï(1̰Ühñ¯æ–b¥å{aáY‘¢hXîmëqÚôKŽSŠ-­Ëå(ä»6»98õó RsrØÙÁ#Pøæç‚31ø‘Cñx>ÙcÈ ÎheHPpöœè†à×fŽ¥5éÐ|t:ÍÜf  \€éÖ:zÊ}ŠáßÏY›ÉŸ[´ lÝ­ÞzÅ´Ü- X—CöA’[9 ÏÏñøE€~{ÏIiúu]-CÍ›b„Ò6'ŸÀPíµÇ`yõè2%¹Ü9ii¯—õÌoP,îï¸ùC>çIa¤{[ÂsSoóZøp¿H¥PZ«æêy öŸÂµÛ§Ûè·Mu(+Ö®Öºµ«U\KÕXü®=ŒÃµ‡pxrøªå€q±™#Án]¬Úæ[q´5*§§ Ø^ߣD¾ÇBkH­RÖ)dÚZ®G”î¼þ€{£†iíËk–3T âú3MÕ3¾ùŽˆÙ}í[Û‡ûR2jë«ç=»òˆArgìdê¾ñlí;±‡ã ¨€ÜvߨÊíÉbœÿ"âÛâ§m™êÙ¤½ëwd÷üÕ¤÷ÃÆ»æI÷Ô|ÙdhÎp•£ˆã¶„¹V?Êè r 4V¸ðKšìA[xáö’u{ƒœï\s…n»ÓõOÒ5¢(ŸåPc 9׸É- qÎÇ{iÞ™>ÔæªÇ eqDv+¹ ÅV°@mᱞ•És‘¶ ÅËFž-”+)’ìa3_õ2º2â=Q%0ÇçÊ.* ·Üáʽ_µ.}ogšLw°ãýšڈǯùåMøcÀ‹Š ¯Ñz&⣺­ké†ö,®” ¡óHÛ °¡ÛR$‘–k3 ‘+7ZÄ,6´[îðaå‰\¹CUn–=†úK‹6´Œh[ÒÃE›+w)Ѻå>\´¹r Ñ!¤íñÂýþ¢ºÄ¹p2+ ZN’I€o­êÙÓ{«±yZ6}xf E·Ð!‡§†5ë²Sn¡ÃÀ|Üðé¬Ö“ü¦¿Gº ã‚N¸î‡Û?=¶á6 áÚV?ÙôÃå:áÓB8»ß=óÃå:×–o¿(ߟ{Á@z[ùJφ+–ž W"½Ž W,=›^‰ô,zÅÒ³éKÏ"ç‘ `ßŒç›æ<[mÒT¿`em.Š‚ŒX;“ÞOpí9k”Ùµ±F™;Ȱ{õ°›¸K^³ÇX{‰Ìb=ì$`ÆëañÙ¬‡]¤ìÌ¢öÌ f¯^¾ƒ(0›šÛA>J¹uìI¶Hn6X¡Ül°b¹uL°B¹ÙÔŠåfQ+”›M­Xnµçæˆ(ÎÌÄ+eÜá0íC½XüàÞ¨S["¹DŒ{qN­ç'VX¯Èš¢ó×3q3ävØ+ižHˆÜ A©e1Ãü"A´»»ŠÈFÈ®³é‡98Üïtå-á–¨yb=×î R½1t‘þ¼3ëçý×÷jGB]ü­´ñL.‚ÍæÅ,pdf˜g7iHÛú¼F!´K1~ðahOEî5=¶0¹§\mE”/áv=rhs’¶"œ¡çÍå |8‹ b$Kå]³7$¨1r˜¹­T®[O*ý›C}`P·À$t63›>fÚåÜ<ÏqÓömì ¬Ÿ|× Òîá½u€±™ìôCÖ(ï,°ÖF× öƒ vèëÙ`í¦¿ÐK‡Ú« /Xß;ñƒ l°¿Ô4²ÁŠÚrÍ+¾â¶Ä¾øÔiK3Þݔ>êfæ>Ú»ëfgï³¾Ú Ä}ÚìFܹ#½¡X‰¾Ó[xã8ë[ÛwÝ×GÖn`¤^šXEMB%,\XeÐ$ަ„~ŽMtÄpc/©xY"¢ÑGé/M¨çCB™ËÌÄ5ç£5ð¢î½šh9KÄ+ÖÇ:b”ˆÏWÏDœ¾{ Õ zfhL)Ò>"£4†Ó…TLábuääfðެÌÈOèEjD¬2<ä$+ ›‘ëÑ mÄÿfi}éäøœü›ÏÖ×ÿ“ÿá÷øäÛÃA§_2liü×õõ\þ‡gÏžþ'þëïñ 9þ77xQÀïõ¥Ò>°Ÿëôõ÷¬÷>´A2{ÎM<»–¹w ¼t­™)®L£t˜¤c$ŒâÑ$ÊÒÝe@t–ƒèŒã ¹åÆ)±‡mÆ e4xD¦ir•ö04ŽHLÔOR:—ãE—”³ççºâ> 0rh?£x¶æ]ÒÕ Î£ —eó1Frö¹¬TGŪ­NCŒj›lUkß–Ó#"ê¸7‰äî™à¬§™F cPÎØ-XÅOgJèc|Œ0 G0‹ÆÓ$íɽ`¬ÕÚau1ƒ%@g$ø¨JÓ%îèÂ-“ŸÝ$œÀÒa„<“‘ß›SÊá\ ƒlÄ­¥vË;8›FýxxGÍt°PLæ¡€u4팓J:™á‰89UAÔDú]<èBBZzë ¢Þ!‘Étòàtá¤}€$ß8?Ö"Ž#‰T„‡„qŸ%ÃÙ YÁ\– “[ÜgPM̲h4üF†[4X·uötcK¥,ÆŠO“©‘åOg(–\saÐ~ ÓEÅd_8If‘ìøw½ÎÃ8ÌAoeœùÇ+Dyè|Éæ­Ë.=iØ$hEs@Gø§÷§~VŸÜÍëÑ`ŽCFÄ# ëŒ+.ÎÄp9Ç0ÞœlW~À&Ê¢wwœžÓyÄÏ ž=G¼æÇ&Ãeàt ýl †"7t9>«Rì¶ä`ã œÈ-s–7›xË@a@O´*«P±r—H#èñ€ Q3ŠR¾OY"EÒÏxbÆ×?j#¨Y_­nèú҆іþä¢}vÚ><ë6;”}«®ÃÒK’™#™²៞tÏN[G­Óó‹Wg»í× ¤„ „pCää°“gdÿèPPe:$v³±h1ŒýRn0á<ÑN½mQ'Ñb8~(ûâ´Ým7ÿN»V\~3 ~žG#×´•ŽÛ†–dÌ,4»ßÉYÐÔ†Œ°o?ÅHWÁnšöîìçxšÆWixÌ“³ËÉ©Q‹;eäBý›™Z£“ v'(à5§b˜½îe×”¥ØÆ1¿>‹{0 ¼?îMi'Ž‚`«YXÆÑ«zx¥Þõ˜çzÏ`[¢ &ülPöã¼V£uKå‘5VO‘g؇EBšŒêã÷G£¨¶ /Øž\¥TĂЇ2¨¦¨¢/ΧÑ´ΠE¿%-$¶L:JypÔ®ÔDúq«W`ˆt¨œV5üÆæ‡x¿È(ˆzMæIàP¥·‡Î£Cê†r(дÀbÃè˜1Â\!IªîÂÓuŽq(¯b”"gRº¢˜HcSM7¡îJõàÎ&ehO)Á.¼éD³zo00 fvŒò”DN wN .ëzŠ¬ŠŠã€,’^ú^,¢¬~…ªŽnûrºx›xv Rtœ‹_Õ9#õ@\Îô^Â6§h§°úá†I«¬p ‹¼Œ¡¿PÑ«>Ùôl+wUuA”˜Lúþö…‚WS@ðÑzÝÛÙéQ¤IzhoÃ6¦×è}ÂÍô´‹²ùï¯Óúˆoy° „Ó¤f!µc’vHüh¼éo$—â­ðgо曎ñ&‡. Ú-ÑzÓ1Þ8ˆÂkC;Ašo:ÆO¸JhgBóMÇx“Ç“Œ²£õ¦c¼1H4C}2­ÃÓŠl¡æä¦áVÖ6·H ›$æ×¹Vi!uë¥Ñ0Y¼°Ûjá¼4šçÌn4Q+ÿR·’Ûn§Vî¥ÑTl»µÖíó±n7Z+ÿR·›[xäšcÁb½íée–dÚݳm±µóƒÂb®ØÝÍæ¼ï©ÀLñ@OT{ ÖˆÖ°f ÑïãF½*ÑŽü%H­§ÈȲ½fÌD•Ô$ æ¶‘žð\ùˆI õ-ƒP K1£,bq;ü‹e„Yuºí|å³ÙÔª½²hÐÈd €fNy¾âœÒ|…< º()ÈN·[ùJ³j4C‚ã?}­9Ti ke `–Äʇ•_Àð ÁRI Ý¡…’)œÌp4¬¤p8 ´V©Ð)¾UJ R-Z÷JæÁø¥T~•J©ö½½ŸÌǧÃñ½Öéþ_îã>SŽÁWi]±¢’ãÐï ¡>ïâÜæí|Âø¸ÔÃý®Loxå7»èZâ¤Zÿ Ío,›ºÁùËeñ•hNûCµŸL(ýV ”Ýî½<×ï–ìøf§›OÀL}òÒ¨¼ØTÀßkà¾è'Ó» /|¨ýQÔK-,Ä€åK`X Œ^ F0Ó„*Xì8(\G€´qM”hæCñ•FB0P§óìzƒN•nû×þŸÚDA™°X¸¶â‰ù~’LŽæ£Q …÷1¼¶jád"Ì£¤ÑV«©"W׿潑U_y™$œ”-¢ÀºôPñXg±"B¦‡s§»»ÿçþÀ=õˆ·avë=ܨ‘OŽ8wÂÃ<“±6dÛØ#wWŠFXdFí’Ɉ ï ç¡”)#è}>Æ}Ýç±Ùƒò”¯„§%+½§èŠ$šûlÖL‡Ûµ¯WkPõäyó½MÈÓ¿×?=Êò†¢ép‚c½çåÞ„²t,K0½„Ô5ÄÙcÜtQìfÝY˜ ÏkÁºr>F§âÝ:vOn>3º„4kƒ¸±öé…AÉn èæÁ”ÄÊ ¡„tÂo²iõ“V!¥0h@B7ôˆƒ«”‡á2ƒï‚õG¨·`ƒËxH¨/ ·ÍX©\´ÜN©ðÕ·Õ^áV©˜jÁ(IÞϧú€=›&4‰9Ë®àèF•¼ÕÈËœÍ/C|¬=Ñž©v±Dµ¬Xž5­b‡‹å~dË…qáøZË › Kè·²*mˆ¿æt¥  x” 籠#¹W‚wžð/¸ÔQÁÊ!Ä¿Tª i•ÁS*¥W«d Ãø»u³SWÞâS˜šnFã çÎÜÀòö‘³Ó€ñô¤3Nñðí9ò€ƒAõô¼€¡4­ ‚Ðt”h øÇ¡Ó)¢YG5Ìq7tùڭϧÔ&F_A0s¢¬‡Sšä¬püPw1ÕÃ5¦ÓíÚ0‘âÉZ4ÁÓþUuoHlåãLr/eÉòã’Ö¢h`W†Ê‘Ÿ'ºä*mY`h!—PzàÉ’»z§­ˆ%‡·Â/‚GÐý 2Ô>ÈÉXXr(™Lž,a,†3†8õª>Œs ùbbLÌžkÔè¨Õ®Æ[ló EÛéçh›cÞ˜ÕÜå Ï 2C D W23.¥ËºŽa¿îTsb¼Ûp¨¯©™&Su[ì³ã I¹_’ŒÖ9ý lƒ~È`šH††¾)Aäibƒèk{RNh=‘Ù€¦S ¶S¿ÐÚB¬rŽù”ú·ðM&éM/àè´wŸ¢c®b,E÷e0H¢ÌN °# y:°·|Å+1Ú£qMLâÍy-2êÝIq®ÅX¯ ÀdÅ#.3NùP›Æ…˜x%v争(žùpž¢O¥ÞFG P#a¦…Ø)óy[EÐoãÍɬL°–‚„¹ÓNÎ}½€Ž±¾Æ"•ÏzŒS_î)m££x—®`t.çÃ!°î[›vºuµ¬Ð $ MnƒX­¼ºY¥m"lmüõ<Ë«hêÅŧŒEÆ”%ž!©¢Í—#>Ts<¢e¦Sº¿4?¡H&S+,w-e6Tg‡»ØYï…½D”²öåÑ#9g ÚB­ŠtöjÕäCŸFlúéµQê“eqpÌ9Éû½d»!f—šd×XQ$îjŽ;É­Ü‹KH3¤ÒN‹Qs×þCÁPP¿B“Hà 4f• Û>’œ¡ñ ¿ãJBC¨y¬ܦšYîJx°ÚÓ.9“RŒYãÐý—´m4à‘Ô˲¤“'iŒxf]ü_Ee#Ü€µÚìIšxÕu)¦ÉÃÌ/=Ñ„,Ä8k2}ƒjo˜yC ÐÝ^ HQf¹`32êºõPZZ6×µu,@‘†Cñ’餿C¼ý$xÌAuàèצèÒÔÎ>ô«,ÔÆ%±ø \+* u‚lÙ¿?æ:œžÅáÏ/ h˼:wzv&ÆÚ v^¢¢£xnø:9Øâ/r€>yˆ”2ÌØ•ï9"Ï@_aEò3,Sc$Ù'Är6ØHy<Ißb4#¤ß¥Ç~òC…ÜPhRIc@˜šåc@€¼AR0¤Ç½iQ,•ÿ?#U¾|‡_²»»²fQ’±ì«™OŽ‹Çn¹ ‹Œ›òu¥k¾Ñß?ªa€qpjä.u}¨~˜³/™JÖ á[ ‰Lµô®ž¬“áóû,¤ä¼Jqê3½†:0ŸöꉱåŠçÐÄË­ŸPæU Â%_ß+(] Ù=xJ‰¢âi:°ÉÒTmIpÈ}“®8üDÐhË,L0e©r‚ámÿú÷X}Œ;TU廙–AK.; Øœå¾cQúm–;ÓV†»IØP÷çgÍî!›îÃ4™àùYä°¸‘ë•* £ÃkŠ—Êâž´¹¬´Ž+6õƒOÆÈvL}ªá=UŽFøÛw5bYý(\v™|Ê…¥+>åô ¶P¡~}òµödz “…?šâÏîè*!I©%ÐE¿- rßڨゴlÿÚ¼¶UcGÅØ2xÏDmcÐU˜U>|ά› Ó„®Æñµ ¼é'P =lÖIÝ÷³=m.ñ_p9JðšßùS•ù´4éúG ïÓÌEZÈÉ|2àkuÁí¹u­&|1ûÀ Æ7c§LUÒ³zÐéÁ»aÜÇ3·«¤7c'Î÷Ð+ç”d„NýÉäñ ^ÃØL&W_CaÇLç“px…ûɯêä#ô‡Wrd„^#Ën±÷FïÑ÷Û~oÚ룶cÏAOºg“cDxÊ^CŸþ·Íñ>£Ø8?7»ç;ŒÄ0Q`^ÇCft¡­‹ïÙÞÝ_ðnßïÏßp52¯tmj›zZðž¨8†1ÓÔÌÇSŸ¯d| Þ~JÒ¢ÝÍÆõTŒ¿ã{Œ¯ ³ÂääòO¯ãî ÊüØ}¢Åâpì ô·F~Âo Qˆ¼}ùAplF| ÌZËcü,‹Æ—£;ìÍyïg)%¥Q9•²fŽ~_|Îy:Ÿ‰ŠŽßó—½ùÐ:#£„ªÇ‚êD=CÊ.æo”¹(¸P”²òÏDqÞÞûÎA§ˆ£^×…P§ÊÌl:ðø^7f<%ôü’ý[ÂŒŽå&¸*3ÛÕhÖß®ìµ W‹'ï á[ÜŽ‹Ú˜ìP/d& hª ùx\`ÑÙ ñgªÙušÜ½± éS#.K_b³4É ââµ̉¯¬þŶá÷dh¤¸S2‹#S ö=òÙœ4øP„ø:BCü¥§ŸhZâ:ÕUåî­¬p© þSƒP.¯ÛqN­¨XT YYYsWCü•iÜ>ûë/ÙŒfìàAUÎTÂÉp.l(efÑá/$ÑýüX]À¤z36öÜkóMÀÁ(âTlðÆÕ`žÊƒ0ê%%¾úDýïš" ìÍgäJù8Cê—=Tl˜ ýSàÑ„oPN’›¯Õ¿ØýˆÄ"6IBv2­¡è0b‚è"UG’/T<ÄuÄEäù†2T˯¶vûÈÐñÎkz&lá¹êPëÔ‚9æ—–#!v³@cE|åÕªÃjû_á Ê£D6­?V1!ÏsÈsD¦^RŒE}Gb¥¬š'!|ĸàĨÈ?V6—QE‘ è’„È"ÊånÐx=vå,.zþ ¢¡ÎÉD”:/D¹ð´•øÀÄÀ÷ò¤ hßá-±ýäî+UÉ—0N}Þ¾£˜™{’GCò&µ1ðKå39ì•_-~ÅÇöýF| ¦hñ⹈³¼÷ }È„Ɔ50B,ª†«º³#G‰‹ëìÊÅ9>šé~,úl†;‹›ÐWuv¥Å ³UÉ/èxn‰6T]بB•e«¶-I%Áolè Üïa|tU0—›„n,âÁÉ—UÚÖ¬~_]ãYÇÍ'ZâÒîŒöiæµ¶†àâ}g-IDßê^ŽÃst‚¾¯h`ÌhqˆÓîpÈ1à*ERŸ‚´!IðóMÇbó’À7 q¦æP =kçÂfCb5'6Æú^2ø°Ðˆ_+›õÆÓ}á0Ò Gå?]ûaˬÒ!][¥+xK—7P¬%æuÖ“„àaT ˜YVdq:I(˜ óâg„S¾Cð[¿“©an¥Ñ¿Â‹ÚE ï2¼:¼¿Q‘¿¹18¾‘ÛWµ@L=¨$‡´™ #[ü¯¹enÓ|2„ Fcò÷dÇ­Ýöx"4÷(H¤'T{Sßž$“¶Ä”—Ø=–1ù!¢eÜ©ºÆÍÇgJûÈÃ<í”YÃÃÛ ‘såÌÏâ“@Ìjè|ü¨Üß¡”ŽX²—Š„¬'_'dCzÚ)ß*²)tÔ8£ÎTkÒ±µð‰aþEË´È$ºé ÙùÍ.y ÒéÖÕ £n¸ÿ„®ÜC´cÛÜMÀ*ïRQIöX±<àI(†HLW‡G†Ž®`Üd¸¶Äþˆ‹E¹u,¶*&+¦­-)Jˆ)J´úÏÕF¾d@ž a\&Z±ê¥#èüD„¤\а"«Êõ&2d>žÒEcfÌ›øiس玃D~ä¢ m€&­r¦ôGõ>LwvÒÌ7Š´Ç[+¹¦NkÌVõ….-µ}8è}Fo†ê*‡$7¬Êй(ì¾\c/iŠüxîMPcÓ€-T ®ÛI>u¨vý '5q$ÂTOûªHùZ®ôçiÉ;©°ò“‡®öUÿRì_Á!C Mmˆ/qQÍ`ì ,¯Ð/D¨Ý5!õ' ~>6`Ï“â…o9óP¶¾Î°V‹‹Sè³$«>nÅÙzÅÕELó½hrRãSh%‹KÉTø©äô`Z~-”§C -JEgÒöãH~ÂüãàXVø¿^T¦Q:žÏ”ã mE’gzMOˆNa9Õ1¦¹ƒ²J¾"Þ¯7tÁO´Ä‡1 hFXÕçÁñhÝËÈä/³ô=Ì2Š1n’;>_;DtP™q]Ì:“#`ÿ®?ÂÀ·Îl8M<–æ2 ækn“гóеàÿ©®<2j˜kxr&œ Iò6EôÜÈïö,§›I9w^¿9:j>…Ê«%¶Øh’Ã/Z¬ŸümMqËVïñÓ–¯#+{¶3\6…– ÆÝ©[,YšL¯­É…qÙžŸ ØûпŸå™ËEOógWø'# §r&"Wä>–‹±!”ZðO,¤XË—Ôÿ;7=“¬R~gò‚|€ (knKX:Á×–†n°ÃJ²±Ko0|M2ú€j.ÑJ`ÀÁšQ 9˜¹îñ!ÎbDhˆý­¼%ø“€ˆ•1(pjq¡1ˆs×®ƒ)F!רuQ•®Ü§š£II5]½v¯î’Ü o‡$kQ³(ü8Š: ×ÜêUTý˜öþÒø¶7‰ßâdÎrµCësnåÒÉ 7ü§@¨¿FiⓊúȱ÷^5¡=F·+¹áÆd–BX30Ôüµ65‘t{£ yùZ[ÂÛ[zyóþò€ÕçÄåX¹hã½Ô¹@Ž'ân¡Î0·Þ¢0]/¿âŠ›#wg‡“A(Nö‹c@Îs„EÜ ácðÏñtg'ððƽ}fF›¯™'Û?iß®7ÿrñç7Çmÿº˜Èa)Bšök´5rK,›¯¾Þèqï ZÃCËL)îe€¢nòõ÷TÐc„6à‹r<»¬qñ….hîÐ`¤‘œ³ºP’p™¯ìœEÙºlŧ)ÅêÃ\B•{ì=ZË%“(_so^jóìÂpV¨]Öðše ‰xVñEÃÈ\F8²Ï‰Pž!±9ˆvyo0?‘ÒÆ£³sæ›IrCðZ´ïýíË>SÀ²tgò´{« tŸÃ«ž’vQ¤ßš–ÂQçœj¸Õ>Ç­Üñ|4‹§˜[dÞÇŽ› /y^$À!‡pAÒ[­Ê\$ý{<Þ×Ù5Ø¿NäÖ ¹¡¢Øh›šK¨ª‡)ça*ݳ¡iPk阊R/›îê®ÑFxƒVö®‹êÎy¬Ôdñè°`“óv¨ttÖ!áwÿo9.=fÂë>\’ÏVB™ñHj—ß­‹å»äŒ÷'´—“O«TÚ'5n¶{0Ë.õ•w’R©TJÈ|ä^Á½”ÂÊϾ®8†fAÁÁ7(Ò›Óü1™ý†BŠY¼ò,‡Àì]ƒ§üœ•Ø“—¢«° YŒãº,"䘴;‘ëÎ!áÒˆ‘øUï»Ëã$„bÒòlHª>NwãÌÈŒý^ºYnEê‡or«_#…šð/êxÃ×"›‚3š¡((ƒù’¯æ@øzŒr«t”¹S©¹R+>bö Ý•pù\Îõø3®˜P™« âEN«*ÍZ“ò~ºÄ‘»H³çÒ:L¨Íá;Byúã»=6ú´‘@ã ß`¼Óúþ+\1-"äìc*Êy÷9…'5¥OjuÕœøægñÊ3ŸK½iläLSÐÚÙúæî ï8g\,plcÅ^ê¼Aë¾…éMô¶‹ê;¯æõÊbâÌ7ïëÆõ/Y”Íï_ Cìk­|GƒÃ©Ì*{9®‘¬kѿÙrsÚ«æd™ÅNsÂ^þy×D~[n&NÓhýoŠ0…©?ÿט‰Ò¦»Ì­ß¥q(×ÅÆá—1 ógÐøQ*Á¶âXF‰·Ð€+6Wh¶á]p^],Ÿ¬@‘^!º¡Õ!.‹Îõ‘d‘9èµ÷Jí<¢ø0‰¸FšiI@Gf_ÿïÄ<`˜[Ô*ëÉ뼨…û£a«ø*(Á„e²,,èüe˜æ¤âõf_hÆèêSEîBt uíèjÊ*3e0ü]íDŸ°,šÕÝS“„ü¢IÖÓ™dUò´…Ú´N‹ôª»`9£à³Ú0`µ]4VyB—1ÞÓ`¹Qà'¢oޏô[ù%Ÿ’Þ°kMÑñ±µãÀìú!sD‰7âÐõÃÞ É¸æZ(ž×mM9ç¾CVœ¹PmÆË4ÊÆzÈË ä\…¨yH yij²™ék+©RÃ\¿&ÕV‡ñ‡¦YùØßœ¼l§êt—·|r•&_cJ/R¤ù&s=3=¥‰q2ÏÄüíov‘$ e8]Ç}>¡Á ½€ŠŸCk4y»QÁ¹˜ªàþ(ênô¸püH/ûÂYæ!Ûº40¼^ô1;øã|ôzK| Dç¦&'äŠÑÃìÆ-¬@^--º…õÆq´Dµ%­å´€-- §jÄh.¹îPÜV–—'ÎD÷¤ÝX/Ùx*é4"‰ò=³%n) -^¤? 1 ´¦¿>Þnf݃É* åËš¥Ÿln¼ç6Jî$¢P›KÁà+®ýÄ…À).CéòéÔÄŠÁÑæMÁwe†\KŠg• DLÔY"ÎU8ÔC!¥V„áú¨у,·O^ÞÉ£¦Íã4Êl³ÄÀæce®\§pŸ`ȉAŒm ú2*d Œ­u,%ìëþg:a¿F7žp<¿Žæ)œË ˜‚áBîÃPÁñ4Å£0? bÇK2 øiÚçÝf8zòò6ì¯s®…Kú±¡FÖý ›V¨±‹Ñ5ÆQ*B%ídJW¥†ys®ž#CÛð4)’ñ˜Âðs€FÒ/£ø×ˆÜã{“;í?ŸkJ›òÆÃ+‹?¨Â9ûëô²¿!#Âe5Yói/eoyX}÷HV4_Ó}¾æ‚ŽõM ´öþ&@M£~r5Á0>ìqƒ:ìÆÜB—$n)’õ$ ¬üN¨õŸÄ*yG›–†åÌÏXÝ ¨¦M‹±T/æ¹?LçbÀ Ÿ§ëºp ê'>R3±ÞÄ>ó«k^wÞVsDTR€i’eñ¥u·Àä}7 î’9µUáR¸ûz"I°×e3 p`«×ýÒCU#"RÍQ‚c [HAb²Ü; žœ ¸â° êM§£;†Fï\{—0¼ë¹ŽÝEIkí6¦†K£ËyLá™#¶·±[MzcÒŒ ÝWÙ¦ƒ¬®Ç`_öPPÇæAyîp ŠÂ¡zZu’a‡„&U[>VàÔxð…·ê̺4šöât_èyž§½±Ë6í0!ÑdŽþ$o¿±:9 š‘û½¾z| ‹ö "¡qUrñ¾Ô”³$1s†jîêV¤qBЉ”ïÙ=ñ–×eñ”TïcÙßE. Úe³4^à}–^~{œ|ÂÜž³bï°—>i¬¹7Í++lä d.±œÛ#x\å}ðb›\ ¨•ïed¹]ƒ®ˆ_)BWRι(›Q¬ñ›Hž—íL®40Ã\9DäåÜ"C |þ‡í„2æ¡ý‚ÇÓœÐ;¿·ä@²¤š°Œ•›Iî~… L!~ G•Ø2¥›k¼ÕàÇïºÄ쀙Îvöölä kÙ»kÒ<®ãæEs³Øc߆FêU²­ÐÛ–ÙÇÊÓVm-8ÎG7$áÞ áÁé0Ìo³JºÕ‚“v4¦aVœá1%m"¦vvTTŒcŠ…A/«ìÂRh¶W‘X4žÎîD#ºGz–à åçò­ Eê.ò;/vÆÏG†›h8þ¿€êaDh¤>~Ó&yÅZÄyÿ#d(-> ñ‹ÅF×áììDÙcMÀ'T'¬;Un< TùÞfå[ªP, Ê #éÅ2¡2}¸îæ~ˆ’Pà»&FªE–¯”3*^µ›a½àþ ¬‡iÖ šµàŸóñ´A)0ò2Ï ¥jy¥«úÏyŽ]M0>MuÆ3¤­~Ôª¯Hé³,7HzhÄ- $]ŸL—:óà]˜· ø•àÎjK2»`oµ€ŒïÚ¢h†W؆ƒÇÍ5¬A„F/ëU°†ñÕœÑç¶Îqž‹º¬‡ d‚C¼KÍ/ZE—€¯É×ñò4Ôä#Ƕ´í;í×7¸h¡û:ŠWß(¸P¨î´_» ‚†3c–äüS±òNûEz;pN‰_Í2¾ÞÕÔÆÆÎN>pŠY->/¼¥¡¶Èf±FÇÅ5’è‰P™ˆOl” þ‚Èüq˜ŽX)":–üÉðÅü,áôDUÊÜ õCªTŸZ„þß–Ü˃a‡¨}êÕüdI‘–íæò«QQ†ôËJÿf°¤Š)YضÈjt²û2`<£ƃ æƒ¿®B'÷iØIxEÁ°•–c¯ãÈí$鬎Áu„~KC¥ÞñAînƒƒ»>lßXÿÀÅ;K|t*Ĩú|¾ÛŽ8%8¡U›ÿÖÆIÔÌ…[ìz«¹d§Ù¸O!J\\¤ò'vx Ür­ ¸€‘’yù­è‘Dû=A—6¹TXx-ƒáÍKÍz¦z׉0ÂÕŒ¾qßtí¨nÏ’ÂëÂ¥O|š„,éä•1É¡¸Ñ20Ú Æ Ö^ãö@'s+"ž°½ûŒ¿zCG¢!MFGãÀhr ,û#Ã9†/…’U–«ý¿ä½*äŽ$™sgÌY#Þ˜ ÔÔ &Ù€ù ¢Â…ØŽ|Ò4v/X,æú±¤WÔýhmdZw˜^zxÑã¬3Uœ¸w€CÊ~§cG;±â¿ìÁA[Ü0S[\™ðBK ¯ÞÊà]wè³D?nuÌÄ/øSF±r,òíÿïŽF{Ì&nèš÷1æ/€ŸîîYWçm6»ÎÇ9m/KÃêN*º4o ¤©Ëà­½Kèqµ ¿µäÌARåÄ#Î#ú)‡Qî•Û\#Ž ¶ê3eÝÿRÙ¡„ß0“¾©¦ÐÿÅXé﻾K§•M]U†o/ÃÍxQDírh™Z`µÄâ\@,S_W“&^ ÙhP[pä¹KýzÃeà<ÅŒâ©3¥Õ0¾xÅq¤¬$Ü‹'Å·&i}eÞ†Y¿EÄ>ä*ÐÍ»F>ÞɺÊ÷óu”ïÝsÓû[þ!j¶¡'æ‘sÊ«w’ GW»páíš þ’ËrrC÷dvf>ÅÑ·Wðé8»ò9С šáb±° ì€Õø=¤0¿Š4íyË3=”î¾É‡ e¢E8 „‘¸O<÷¤-Dßd!Ã1Eƒ5|‰«èV$œaüBÿ³.\CÆXTÒV~³ÅÍ,oʰ'¡rU“ñÐ)M¤Ê¼å Lm~èþ²%9–:K…¦ò(™ùŒoO{pú6óðwÅ^¹›lNj2#šZ½þ ÖÿÌîHäwÑwƒatƒË'˜’£4ÛqßI <'1D§ËlÐ`HÌ›žbÐ8ûÀMR+æ(! {)‹"B«ûJ[ ®\tŽ”Xeß©Îh‹Šû(¨$ks'o»á¨.v±0y¼y3Í&ì@çYu®þ>¦TmB=öG½x\Dƒ·ÞØÆËñî6ŒÕñ(^ž§Óõ&åÎwZ³ÏGH$H˜F&sÞ–#µ8 w}<¾¡YËÈUé_æ5Oš×rA¬õ Àa¾rÃÀGæ/ÍVë¢ûúðâàp÷ äªÜ]–ŠÅnEÔ0X)R9„#B#)2³œå£$ËX1yòàÎÄ2· qbA)À<‚1‚ÕÊPÄ+]&ÛÄgD%¥Ï‚Фôþƒk•^ {]æëT@”˜¹­fn‹¢Ì.[eïeKÅ*zL™{[ÎÑon+ú`ƒaÿåˆéN›-eÎA¥aÇ¡]ÔRøY¦µ¨š°íG¹b·Å.¶Ü@“ŽRøs·  U±KF©U;\­fÂ: \®èå sâÓ> -‡@ËŸòþ\ÝÌó {)qcjÅEyøYZÓ;ÉÌr¼­ºsA3Rh ¤Oý‡ 8NÎ2gõ¨ÀpKKL…úßW«f&K³²>úBQ‹XÛ2· ÏgØ‚fÈí’ri˜ªýß¾ƒ.ˆTȰÄP&[î÷ÐnÑ”ESª2aBƒa?%i8¬¥U逸¹s¼X”CmTÐIh¤­‘!%âõ¨ZŽâ²“tã•oĬ5n¹Vo;.ž &0;ã/•z½¾ä”æ«÷šÔ‡ð¼ADEîÉ£¢’Y7fÃ,þöô øQiÉË›‹!4:ñm-«5«:¤ÃP7±ùÜWŠ1¾9êñuØÈý2`z’LŽæ£‘ÀÀ­ éG­M^(Ô(´d;êtÛyªõ&È(#­Z „³«n˜à %ÝØ" üZµ@>t8O­®íl¹d/е˜*óÉKý½¤iÒT4Mm8(ƒ`k¤§åáÛ‘/j]ÖÃYÆá ¡¿ðŸ¸i¼ ‹)WÏ!-Ùè}¡qA>’)²,'H¼ÅB›àzi8 õ[Ùí]e‡ŸI¢nëéõh!ÿ©3)Y54‡±z/ì ¸LИûQ‰­±Š7 EUD§+.bÐqE´ÐP9HB[`ãŒdâ@cë‘Uèx’7R †™P8nÏßâ‚Y(1 ‰hã +erx^Ò¤§Žúò’ÀPMÒ,ìÌæòêÃ3?ú‹^F–.ìo7AáË‚Kì_üX6°wrò_öToÉZ=˜E§Šr›ÛŒ‘Êãe-UCOÛSpÚ^@—ˆ­-ƒL›aõ"ëº Ì’gÃ+ÝB]-µHIy‚ËÊ©žÐ5O«e4 Mƒ%ðù1"+ s˜¬,¶)Îi *í$¿£YS*H ZâùL[J„2Œ¡tl§²‰9µØTzEñêo9ßȳê\.¯3P&ÑY”ÍG3‰1Àc‘I¹$©÷ JXK­Cž¤Öò IûÖOj¸Ìfh)ѧ8$3èÁL1|Á„å|/è _QaØf_Yr2œOðà" >Ÿ$S1yÌ'§SsYFϹýÑË0\- ªŽ9¥âµ’,§‘&“¸+ŒDÀÁ xïV\ê fhÂOfß”¬ˆ >Êv̨ç!kÅ–•ü`ìîž, ½pÀ!Û‚ž[±‰˜7@¼õYöÜÃ:\ õ@Âûœ`Kð$y½¾¶ÄyG)ÆÏ)QÜìŽäWk%Ýf¹þ~[Þ·ñœ$3'%?‡ ãðÃþ;p#•I˜qÔ›d¤‡vôG!ù Ó¼ŽPè/㤸lò#‰L¥·Û[K.q†DRŒbøãKª¥%ƒY~Ûw8q–Á]±,m BõléSVAÒX©dº<¡þÞƒb£„̀õI­Lá;z¦°ÓIÂOE4¸ ´©±04J¡ÀO5ïUYý)·Í~‹}ë©3s-ÛqM‘œ=H&ø!AÆ“xƒÜ[Z`ûÁº«]b;„ž¬×ÄJ·´Â_†³‡s@ÆîäN¦'#½NF.Ý~Gw?«Á^ö1úƒ¸’ÌiYms"À^~'X`çèÒœ©`t§÷žÜìz“YïŠN딋•?¦“ëæ¤O¬ñ–LõÆ&èpø¶^mlÔ×Þ¡@{ Ï@ã“ÀÀßàízm1NêàŸ·‰jŸäLÎìQä‡ú©쨸îÌn墱´DÙñDÉK–hc­‰ï–*QH ÑåׇÖSá¡w%më”×VœÍf舉°GxÏP—ðÚ[Ö$sD/ÌAŸ¥6¿ÌÏÃ6ÂÌmŠáÅ— ‹UK™{—tÕñëØ‡XÔ|Üô=oñvYÑi¸˜_ðl‹+‚~#´½R¬ÓÍÍËÛÒ¶ ]e' Ám±%§Ó¢^æ1I¡ÔÝöR2[½ÐjîÞ(O)Ùzp:Åc{y¢ž™ŸU]N5 zËó°« ìݶ^6hA]ã5tq«i·œ `Ïû³lx]tFå>:&.²Æ[‚ízô¯ÓéÄb™T´|¶ä £ýý¨lá)î)„bËôVíßq¦Cmzù©ôPàáS0®‘¡-c‡$c-sáÕrÔ¬®‘ë-9© €=¨.ØgmAñž¤Ÿ–N"¯D <Ü4‹Q@4O“UoÅC7'“ ª¤8ºçùD@EZ¤?RÓ3©2Õ1œ£L§ [gÎþU8} e’ôíÁÌMŸGñ½™p« ƒ&ÂÛÒywÁ­“𔎙P,öØ!á¤LÉ„ËI‡¹ µTÍÙ0üVÙ­ ¹.g«œ«Ââ¬ÒŒÂ µîU4Á Í—¿Q~çX*¿n Ù.!\ÂÉwëÖ9s¢3Ã-Íé矑‹ÏW©õ¢ÞPà.ŠÑ!x¶Ä3eÉÂä!»ËÛ*øY²A¼lxše9sO}ÖŠüù2Ú?Ø¢Xøº8Þ.é¹øqm«Jë 0Ëμj¬-B)¨Ïƒ:rÉÖÉr  ·`㈌/Ç]&è¦Àa|ÑŽ*Xè‹kìÖ†ÚÃwþ]oë/š]¨Â x˜%—NËïÈÙ³¢3>ɤ•¹™ÐÇõ5‰ Zƒ3sÅeˆYÞ¹¦ß¬Áà’ ñðÐ(!ÝNö»¾LÐîwKÂOþD§ØpZµ{_,“ˆÑhÂË«¹ÈFÔó‡ÔG8|ÈüztùNy<½Ù?=&—úÖþæ›oŠ -Ü~ÀA~x…å^nä‰}aR[soýšWy‹Nèÿ¦¹;HÝMôoÊ{ð2)€ñ:^Ÿ­±O7¯¯•S×sôYÝBiÉŠ ÐÀ WåòñaWÂ)¥Ü& äé9R^njµŽo Ýáä'4®8R¨“é4M¦i̾=jÉœä‚>y>–øj¨”þ¶Œñ£uìrg˜FX©™›.á¿×kæâTù,µ¥´$…*gE™Ý=‘Õ1UmP´Ï™£'4&dzRW*j’[¢­ÚаP7[8êè¢ë^†èm 9[å«WÐDS7Ñž|©¶×F!6½H‰Fd5E ц‹¶NÄÍÃR¥Pà‹lo©­î;¹ÃµÂ3øh`É=1ËÐ/ß36µï$®^5ÒÛ¢r/48-±½ûd¾­Ÿiº‘šiCµx‚aoÛ½8ÅH‘ï/_ ³’Ã×išq<¡úKåÇ'nt ~–,¢4cAŠ{£Q4âËãÞUÜ÷íª©ðExÀ¢öñ(ú `äAÃü.V\#ë.Y†%Í;ó¬Rê™BñšYäúÞkmMã=îrX–ˆaGe‹|L|Ê}§£;yÕó¬%–rPÊ ¾Z²Y°Wˆý¥Yß?mÿí[ÇÒl<­É”0™rÐUå £ªaª¨šà‹³Ú»ÏŠŽjˆÐp°³3`‚ä #e^’‹¬®aæ‹*ß.>˜1B a±8àptŒ9GÆ¢ÕóãK‚p u/‚7/R¿l|¨ènº´šˆè¶ÌL%¤K’5¤ºôz>ws~PCí ,?jšå‰±-$4 †Ó+ëú³@{èŠêR–ë‡_’Ráì•bGc®î e'>9§ì¡+’³¯ô¿¬xŽþ¨àóÕ]d6«˜ÔY¸:rƒqáÖ®÷|ÞsggÉ-bëú¾°WÊ‚ƒ]ù’Ý’i”B›ŒEÈ>ÎÔõ5ó³"]FK(¦l 4¥-éyaÌÂZϹ>ÿ¢Æ÷òÒl«|SUeO/Úm2-zÏE•ãb,æcqd‹²f–BªaÓ>pë¡)I-_Ý…Æ’ùq '4¡é”ý´\«yIdU²¶– P5 ¯…È4Ô’A„°SûÀÄ®\n.gG/Á‰ŒÌê-ÈÌÞÁéÁÁ¾©²æ‰B‹*Kë<Ò¥÷+ß^ž€s/¦ÇaI4¼2ùp>E# –•_ø%ÂÂp¢`h2HR•ža`ý±¾(&\vÇ’ I,7«å'4Ôpxw"ñ9Óh6O'²D1{Qš'î™è)wÈ,SàlDV†ð -êð*šíG# å y‹t¨hBå ãý{?oS™O¾dÖJ‹¢àœW¨.…LÁú<|:)«‡Ó —^Íǘ³1¼‹fÕŠ§5í(r¨ÊêÃxDq8Ô‹AÁ¸¢Ö6Zòv{‹‚®rãxV—|Ë›ßÒº!âøøô§Ãà–kRT´µÓƒÒòâ#‚í5ONÛg‚ñm9 ®)M¸ØøFгçyz­ÓÝ·\ºúoÃí35 Vè%SS„è´1`Ž'èö8ÒÉík"cÆ*jû»­Ö=7áw£Fuf•wJÑ980®áÌŽ–.ÜVz—Y2šÏ"X>šàb75‘ƒ í éàO‰7ÎØÝ¦n *îQW¶ÖY*­ƒÖÆ¡úújC}=Q_ÛÍ࣢COþ® `$ˆ¯ýµK_M”fë@¾nXø½•><ùI@WÙ=û›·¾‘?Ld: h  fúûd:4âÚC{>ÙDh Œ¥ùcË…K!¤Œ»ÜÐëá±ùyc…ͶãålæBu’¦_£,&˜«7-wÈ(«A'ÏGò¹Bû£ ‹¥Va€U9yý¶Å)}dÎAÜlºWóBÚ˜´½hÐ…R¥µ{^èr“ 9 °0>ˆ ûE~cANØßxƒ†ä¦ÛäSÖ9 þø2mË…”¨(;|ÈÐÝë ,KgÒà$“_‚JÝN£>¬pijqáL~!œÏ˜;„ Ðáñ$¦0D´±a÷™â\„f5µ“,eW*ÛV,L¬\šH£<-cÁ>¶WPœÏ‰>X¡lÞï7 ©È¡p)²ÆQmùœ9¿EÜ ?¼(+¦p·Í¿ì‰“ê$·æÙ±«(¥œ8^lÈÜ<â¼Qåè22ƒQX· 3Î+&Î}¼ÈÈ|3É« Vñ†­”½Z÷øâ²AYÍI†×ìdºW$Ó/Ò©ø$Âëqx]%ϨDdP¹ƯrYÑd¥ý£Ç¼_là8#Ç,Ã?ÿ ?,Â"«VtèôªC9Y?£>eÚ¾ÇECŒV¬ñÐtùLÞ÷|]ÏÛ²èÞ;µî-:áY°NUÃjå@^Ž6‡h1#ÕâÌMæDÔâ’6¯îÅT¹¾§DfE#iª–‹Êô¸_'ßÉv͉¾~ôí0ÁóÈ‹ ŒðŒÔ¦›QTÆ伂N5ÉX’)“eöjá²¢îÚq¾Yx:³Ì` šÇJN ݲ9‹Æ™•šV;Ibzg% ºÍ™qEé”: ¢OW2„¼`õÞAå#Ìh0ÂøÏçëŽ[gÍÎþ÷·Û[ßG³4Šðk=¾`kðÙzúþn<]_ßÄ¿›OŸ¯Ñsx´±þlóð|sþ÷߯?Ýz¶õ‡`í òPø™ÃèKƒàÿLã躤ÖÙlŽ‘~–~Ï 8Ñà0èñÓößΚ¯^wƒ°_ Öøa;ØÃÅO«w™Ðåø˜Ba\3¼qgì vKLiîÅMy¾~Û{á¡z¾õ)O)Ù­Š¬Ð3ñ€å[c3<×.µÁe4Ã/:›áUâO’Éh7˜:RX7ÜM¥ h>6ì¡>‰ØŸ58Ýâÿ>—jÕt¯fàÞùI8Fçt%/žþÿ½ïoÛH…áý×úˆæÉkÐC3’ì8%ô®®6gt[‘޳ããÑ"A 1IpÒ’b{>û[—¾£„d%»ç¬1 DWWߪ«««««òÉ ÃŸ¸9Ê?¤tý˜ïWÇúÉS˜"êîõ@¶Åêïÿ ¯ñ ž"-Æ8;Ê'£›†µªTÐCòl€ ðÛ1FìL:œ\g“~>ÃÛÇsr[GþéH]ùÆfô°PÚ_¶ÁDxôR'δ#»–èn>¡‘b&`°Lú†Ö–ÑéÞáëïàŸ®ˆè}‹)ŒgL+ªÈähG^'ߨÐZÐ˪¾ƒþãžø‘ާV¤ƒÍq‚Æ‘ÿ\d3[a³&–‘ì­N}•ÏÞµEO ÐÝ ˆ IÊJÈ ÐÀ\²#—ÖVe&Ð W0\Ðo昽:=À`åÝ­Ó.í)`ØfÒ¢˜Á’Ž£ˆ^W™PU¹h院¢J¦IÁguª`€˜‘WèÙ,ÁS‰AzMÔ<‰º‡ßý•KýrëËi1}‡ÿžÁàÁ/ê4`"ÐÝŒ9j”Š’u‘†ñÌÇcžeçtWõt$ÝÀ°(ýr‘)¢¸Ä#­qu®óü„3ªRaWAñˆ[PÍ{®m2ÕlQˆ"êBdºËDøx=S’¢'E×[óq•ˠƧ…'º«r•ˆXI߇™…z½Jnšú݇lF¡f•…2ÚlM‘+#/«0 \EÄòípjº%ÕÐÙöc0±ð`IèhO!&ªr‚¹:¢$5(MÍ[Ø2€Ü‡2ÈH$,­¹ZH…‡éø4Å`Ïx‚îøð¹ñU*!Pƒ Rżéå¼}˜ƒû'‡lÖ¡²§â`cáU rÝœc[2Ýl²²"º_È ñ¾àC‡NÓ6é5ƒ+$ûJ€Ãƒˆ¯çÙäqüuº·wöº×9è¢õËÝåéAµ$¢VÏο‡ë NxÜìk {¿ôöŽºã£3Ô²²ªðu |4ª à ÂÖ)MÆ?´coëЮ¢UFÁ–"Á• ˆ½­øÜ'ù†ËƒúÜÏxï¬È­eÞä?³t¨¾÷?̳a´ilP>Îo6¶´æö&ôç¡“…‹'×ÚGŸ­àÀÅ"—yÊ‹ÒyJk1û™rÌ%“Éf´¥££·ŒHéXwVñ.xnI&ŽÏèŠÒhÍî"2*n ¸%nò½/wãfT }xÀñ5Þh¶öôÌfçç^gc߯ƒêéÉbZQ©Ä¨²2èóŠ(é ß“Äp¨+22%´¸¢$t•*Ö冸4Ø>`VËŸn¤+jÞl'ªB¶ø0éÏ$äCnËÏG4L+h°Ɔ‡¤‚ôé¨Ãè2 b,·wíh…»hÅœXæ,´zdܳ¿uˬkAìP®ë[W(ÉÚò-î4,€7O6 ñM><Ù°¶à3l’²¢oв]ÞþËR•à› ³×@Ž.Ð+qÊbD2‚¥´Ñ>Ç ¡æN =H€®ûþ´¾U´DÀ›6U<ãf¯5`Ûç)áɽb0¤÷ °±<˜>êí½ÜÞlÕ¤êä€/¥r&¶Gª'Úh5V¾¢)¨«‡×+©›åÇIðÉèM6˜_b†·O6¤ß^UÍY:ÅáC“¥¿ã?G{Þ«½Ó“øÂúNj4`Ó¼qq¡†s¿-JŠWW›@YðPI­šÒn¦nÈ-[b=4 °èì“Ý^´¦>ý ?ý Á8à[ñ>vŽvÚxö»³ÝÜÝÃWøw»¹µ» ¯ðïv³ûz^áßmŸî£ã¤Â¿ÛÍ£½—øº÷Ò Ø}u€h^ÆW§ôz ¯[ôºuêÍsŒ‰Ç¶uDÕ9‚êüBáßíÏvkÖŸYÍy£›óF7çnίCqÕž7º=~HÕ 7ºAotƒü™D‹Þè½Ñ-zã´ˆ9ݢݢݢݢƒêèù!U‹t‹t‹ü™D‹t‹t‹> ¾Çܶ'ÏÙÄîx¼â dF›õŽ) *M¹¹ö&úâ ,’ð?’ê?¦ãlÞÆ ÍA:Ì&éAržŽšÀ·g7üÊ[ÂãiSX6j™¶y‘Î á¡y³y²Ã¢/`¨WØd“>¿ÉÛö¹¼Î¹Â ÁXê°NhÄoW-ʥ墔¹®ûé”Rö¶ä±ªØ±ÂïW\ŦvYØbâ¡Ô_ ]‰®X:æ F³Í_ím:â 饦E¥5H9“kßd¨üG1×Qutv»H v‚P¯QÓÈEsÐq3Q;ƒª¡< ‰ræYödÒ™ÌÈX1…»5õ[8\Û%9[-$¸s–Ùoó÷×~ÿ#êRq~7 aÉ8 (ˆ~@Eƒ{°µ½wÀj|n®HФ]Æ[Û§[G;¯NN·£vÑçÉy6Êæ7­Åd”½¡ªñ9Pu\$u÷l¶ùBѯxÏÿH­rWÌO{”øU"JwVJ¦À›^!mÐ:ÊïvâþŒÄJÄ÷ƒÈqUD¬iH ÒùÒž=iÏž–Òž¯‰´çk¥4´hVƒð˪AháŒä™^OI +ÚëÒ43wñ‘QeÌû0Κoß5Ê\+ÎFM$(™7Äí¢‡±CKÞNÈ»mdTQT uª‰Ó“&üßšNl´Ý´Ë–ߦEÉq aaå4Àd?XÌÔðˆ •¨à?zù1N…‹R:=É&òÑRÖ¡ã>GÑÙa×–}È‹DæR&ÞVûòf1þÇ-Íþ'$„AîÒÙèøµ½ ài‚æ‰Êi+aèÜ+êy&¯¨¿}r0$¹Ó|<=%âeFóÄñÚIÒ<|ÛiQˆÕñ‡ã)°—Ã㟨®m,¬?ûÃÀDÈ¿üÙ1çGßξ3>û“Ù…m½†pÿB·´û”·æm‰—'Pâoí'܆·³Á;®ÂÛYoк6® ž†YM ŠÂÚâo3J“6¯Ô%†þk-®ƒºÔÑ(°¨”ªæg“„hðô”Öî¿ [$Éæ°F³Î¨5œåãŽÚŽbêÕ<Ïdê<×i´Œão`àÐkuZâwŒC’™E\=Ù4†j @’ÙE ð¿˜ò`†€W& ÖH‚ ê亞xH%Åé$P•‹ á· xgŸNÏb‰£ñâɆÍY®z¢Ø ô¦ =Õ½2e¿OE:\˜g-Vÿ¦Éµ9ÛwZðÁJï»é};}মæBš)y—{‚õ‹ “:…8¾VëËoé,ÿw»o²âïðqt¢ß£þ†Æ2ÛU‡[§‹ÓfB&Ñü5JK€d3Ųn¤j²›§¥ºðaMJuÂ!ýwÍEo¶N:G/7I§\‹1ß CÛláíBuŽŠ§èÚ¹žÕB(+¶Í¡¸&o]Q$ŽŒX°Ë–€K 1@«!»§[5qvOêBÔ†|]·E°·îÕlÑëíš‚|Ä•ùs°Ïõ´íý“=®õv£þÈnÔÚúc»Qp7êîñå3ÙÇòX”oy£oølý¬³¯RqõHd£>lÔ'’ *ÙÉF5T º%;~У'·‹µÔ/¬Ò¥Í‡ñÏ*¥ÌzVYM(!޾={§ÄPz/ɱ‘ðí{£ IDmáI«-¼i±D¸Â¥‡äæ»”'ýYh ÷~(ˆZܺÿu7G¨Q/÷þ° ‰J\s„—w2šãtÌg$æZÊwŠ:îùŽTâk¯d¸ n‹¿P¸#8:û S&·É·­Cj×o# USY«ARðÒëÎÔZ yûA>Eâv³ö°R)Oרõ/w“Wož Èœ+amT¨Õ ÜÂá‡Ýδ,Q8ú¸¸õY–ÿÆNDÂ-ÿŒ® ~`Lc>×F‹¬ ‡Y‹†–ÎWGU€0­>v‡?Ÿô§×ômÛRpÒCô^|ï?) þ¨OG{};ò€¿dì/÷ÌOŒ}ËÎUÙ3? ð•â[¿/µ\1üî'ó·«ø=^m8Ï·ð·º%ч)¼ÚX}gíH¾F"cu†yÅZœUðt y!y€ÉÃÉ"p2Ðz+Gkéc¥\úB-zêÓ@°F›3Zª‚¢9ŠK‘KäTž€®Š@i,»2r}Å&ŠZêY^'k÷Ÿ¿LÉf%~ý×,QK¸ë* Zé¢@¹£¡ ¢Bœ¢ß¾³†èõçÄeW~3 ÔK©¼¤†ÊK÷Ãp–nMY‘§‰  eœ‰"þ–¦Óè|‘½¶…)Û»‰×ò©‰ÞRÚN#ùÈ-›@M…gT¡üE3”†<ǃ¤óÄf÷ 2àg2µ¿ø½è'#žÎ£h¯ŽV‡ä;Ç, “¦±_ùÞi=ÏɧΦ‹÷é–²çEŽU~bóÍMj™ƒÉaÕìBbîwAJô¼Ëâ¤é ¬R4± p‘|$;ÇGÝ_-F,¬¤X–æf]Æ—äþå$B*OþQºÜEÍ×á¿ d ½ÖéÞËø¬9k„ýzÎâxP6`TÖ}#VrFÌ´Q'c¹Ò Ùö[bmšÂ¤ ]Õ!„BˆI1* [~ÒhxKx`¢>8ð¡VÎÕ=o¥d$p_HÀl"jD”<áw ç5jµ˜vŠ`ÖKuzÀuZGpšÛ‰¯‰ól„ól8yDŽ'áOü9μÍXB:-þ'˜ä·ÅdßÖç¼ÌÒÔ-ÇvvPæk.;c⩦ÂOe<&¯‘«u ö¢·‘'žüyܸKaBåðTë-2 ¡; [1a©Ù$óB¹ŽþSnWeÚ›Š#Q¸êPqxnèb½#æœJpºýP¨õ4my·û{ˆqiô#üðK3˜oÆP›zÚÌóz~v‘®Þ©ñ²çÞ±Ó­Æ"/y…«áÒAZô…„ã‘[PoFüïY“8±øëTÀ“w³$™y0”:Åwfw1K›ó!xÿ!Á³ ÿ}^^.g¥Ò‰}7YÞ«,¼Ã|Þ,›ò¶M mÆS±ß÷ÕמÅïÝ0`l=0ñH“¹$€Ç$°f~›ÓòŠÏ Š',Õž›ÁäeáöE!GOÁZÞbüE”ÍÓCŸ=ÃROf¾F°ô §À¶s²%›Å¨'3oàâ@9¤5µð eýíVì[­Ù·[µ HXÑð"M¤gU”‡Ë"ä6øŠõ½Þ Ò^ä£Û­ó·j~ýöËy” ¢²‡åŠ ‹7~¤OCÚÐTãÍ6#4Á.н˜•4×›ßâ*tÄ럑 ÄEv1IýÈ{çrr6ÅÞHòþç)>Ò´9RÆ/‘ñΘk,Ì…ùåÎîC†y½Ûùù`=ÜáÜËä šl8¡Ÿ0›7Í aJøú 0ÇÐ!0 4äéŒÜÚ»oIžš©º´’(¡Ú ùã‹ÿžx‘P ép`I$t={†~ ùŠßU2Àd.XŒÈ&CŒw@ºEnA²éЃWœÆcÝ\¨×õ÷ óû†ú® $ Ñ`3Èn& ,ç‚~¤otÍ—Ó%t=ÑÇH «2iù*HÛPªlDìC€†-éa’w½éþìáÉ7bÌ@50€ü®tÒ¢ lR§õ×'ƒc6xn*ÕŽ¡nµ²ˆ wE,*ÌFV°+”K…rìTa<¸®ªÊ˽åUy-j²!12²•Ïï¸ o(ÑèGc H³õ^JM&Éèæ7>k'ǬóáãùUþx"”ìYJØì¡C†xFª.Ô>thJ±©¬˜àœKšÑ2³‚2t‘$œ˜Ç¤À Ã ¶—ã;¬_Ë}Øhp.¦ÔI5£ya…ÿ œÒ›2Ê/rí 蔌¦Þ•?_‰üë͓֋ôà†¡Òh¢àWÑ Qâ0æ„÷sÈ=ލ0l9¼qse¨\qH£;HÑLض;Ü$UÑ56§’µàžÉø¸†?§äÆ™ìy8Œ™NõR„íáW9ëšà{É7CFŒ ÕÝèÐÕ“™ŒÉC2º]› §è²m–]\ÎYmy9^™á±™*šU>dš‘ÊSI‹“‡ŠX‹#?¶ ²Q™áeàÞ¤w†ƒß0£# Y<þ’øއÎIR" /N&Q…RL„cóô i\ x·ž7‚ñÆ>@®ž$ÐÚF@ö™˜æƒª˜U[~¦¶i v¥9Œ Ë0ØÿƒËÕ±½³¸7¢Õ 3Ë¿Û2%צä‹×&Où䵬^ùƒ:K×`éÒ…1 ×&V- ·~>én M!Wɨș“`ëh·ÑŠ %ÔÞÌß2-“é$ÊS4N4fUQ¤y0”\Àv@'.³ãY"'ɱ8wÂU0¶DÜ=6›Ö\F±ðò†ÓÚÅÊU(Áh ÆòSf}ªP—õ­[œO~&¡Yš‡)òXÊ‘b†*‹j$Õ>Ð4+çpÌí3Ò™€-ä¬y‹eù&«]oøØ¬=útíby×)¼Å3UÓ´O!ÒJPpSÛ²é\\0§B»Ì[Sà¤$±”ÖL{‹(úÊïãLñv•Y,Že‘‰|°c¯~FQЍÕQÕb9 Ù>ÑÄé4ޏ–”†–³‡uu·Ï“ÅÙ‹o¶uaåõC‘XdԹ̬5uúØ6ýëCµOvC÷Ìߦƒ\T†ºD3 ÒI$•«Ãò‰fÎ4Ñõfõ­%ÿ5+%§=àù¸b“΋2inXRÝDó]3 ÀQ{€ïþüKB⯵FS×Xêyp×bXÕl•S”Kà Eޱ`"8Ǭè'}OÕÖ«›²°ß§p!/§ˆ]¯Ê°á„ £ƒL·˜dè:ÝÈÞä¨çùüRLz\˜ÉJáQ÷œî•RèA‰Öòó"á pô-’q‹³b¯¥á_¡ÏNÞò`÷tS§ 67eÕ¼µ}¢{ÆhŽu^ÄÓ†Îce¾Ž¾pÎ\Ôˆãëè'`ÿ¿þÌ«m´]7¢ÿ_?N †¸w™Ì¢ ©d½f¡Š ò–Î ß”‰C¯-¯ÉŸÖFUe&nŸï¬“Z,®¥|VŸ[ÜýK8ðÀ~h–pÈJîÈœ{¶‚/Ö-ô(Xè¿’¥%ŠSÒXø)vdû÷¼d¼rÌÝ¥ZòGÊQÚ,MF0} tú~‘ŠpyFŽ(^ñGqCt=&ª KÕíð‹Á”'^ù×Ô?X<ÔS!%:ŒÖlì,6¾zrá•zŠ&lm[}Œè7ôƇ„Èb~ Û)Nô¡ßdÁ9þ½ldð¸êÔ‡Ø}CN‡«îÑ Ñ›£Útú{r1‹•´YCmB6e}_àUÑw‹Cº±4#þ`½Jq¥Å¼XÃàh£2dÿ] yÚ¦~XwàéÓà }CmHõÙ =æ±Klœ2…Ï©‚–Nº c˜<;fÕ_²iö«ùL±ïÀ#ö‘ÎÔ3€”½zÌ(ËkÉu¸;ê/l ÈÇöú_"áH‰ÜÉH+ÅzY Ÿ|BVr‡VC]î<ì?êÜ!wM‡k‡ü°IšB¸=tß&)‡"ûñsK­Æ­Õ&“«˜ŸËñ ?ØÛú8{²!‹á€Ó–cÙô& u•A-—í¬?ÞÙà8íJɧ+Ñ­pÃ#¶¼Âs«‘²®Rž¨ÚÀ3©éOœ*å{oNþÜÉùD¥üÅ›óIÕŠvƒk xbßøúE±†ŒiY{ä½+¤¾j±Œ›(|ìý6sË\ vk-ô 84 w(Ø(«Þ¡[ í·î¢ŠÔOpöjc)ʼnFÓK˜.Ť{b°‚Gê¯%ö¥“,¾$ä„®3‹é©?•uÿÕ_„…+ÞÀ= é,¬ÝojdoûXsO0ŽýbÌØàHþîthƒPû ‰Ë¼åVLè†v /¼ 窞Bõß–.YpÇÀ™pµ†öÓQmt>K&ý˰ÿÁš«?ÇOq§êÅePçÎáñÏÎJâ=íÆ-_­³r¡¥$轈^¢R›F¢c+Áža\LÞOò« t0jgugmµ°;²àæÄ&Â4㹚OÌŽ1r"Úvxifôš86éã–‡O‰0l…ä1$1ýFMx7îâ0FÐeÅh\eGž0oì»N6kÖ@m µœRã*óZÚÓõЖXùx+h{Sò<[4g2€utºQ‡ô¸«dýÖ±‚þ«ÀBñ½’lM%­Ý¸·Ö®ß¾µµ[+!Ý2Ìæ*˜6%•Æ%M·f]–#v2¼;IÓMóR,i"ØQ¹=â~ßÞ–dø£‘”¯Î0L*W~pþ—GÉ _ý­iZØn@Ì©¸»yQ*‡†»¬‚Î4—.ðœÍXÚ9dŒ8 §+—!P¾ðVhtxR(’8ô¨B2AyWö·}F± C'm-ÇEÌv‹¯Ýï§³q6yˆVÿ\¤èKܱöÜh~Í@lÉ¢Ål‚*Ñ·'†MD;i@K7ÔéVIö[Ú’ÄÙ˜—B YMWçpËB É\%×M€BH£QdO¾ŽöŒÔ§wN?%[¥ÈvY~' ‹ú©5¸ÅÂÈ>ÙxŒrsiÑ´#½¾º·úðU¡r骴¸ òâÀ"ôšaSI¦mäuE\ôàSJ³ÿZ7x_”ŠÛÏÕwÐŒañµG·E¬ËÛc;íˆÖ=íØ¨ÓŽúí( ¿=< /‚CŽ®ÉeÀ`´§+‰Ó:¨§—Iÿ=MtíZž•¨DG0KS»ç+z}Y¤bUÂâÞé{5‡ ˆï¿Xp¢û³ºC’¾gábjsjP&¬µ]ݦî¿eK¶ÎP«aŠÂÂK»ÑÌ0Õ‹óù,é—y t'^ã››bj®‰€Mäqs]m0ì©YÉaþå›Ü6ÿn×ä-Ù!•]«ìaFFõÄ0¯Ù£Ì(‚}#\]‡rG7*ª_Î{øúà5e¾–îø”É°ÏCfÙíüìdáÛeΉ@îÓ½C'7Þ>°òxkÙµ3•,^•íÆôç¬w|ö÷½Óãfä«;ïñ­j< êí{ÐàÜ¥¯® öWÅ­ƒÕ[y 8Ô‹ƒÚîÅØ3÷)ñGá7ÇOm~,ŠÚ–aÀ+m¥dd޼¹¡zõGÔß™6ŽÊ5xºôhwÛnŠÝ£GªGËyOͬ¥¼$Ô²þbçu³þR•÷è¸'ò6ð“Áé7*Ý÷¡A?ÝrêÊnÿäØ@YÝÓƒP¶WUÙÂÙ£A^ꟛ¶c/ƒ«@žõgåL†U ñ\'—aßäëÆ_0Ó󦪪ö§ÿµΠ冺êZ»ùMó¬2‚¿/-~iæ%¥W5žl¦Ø’ßhJ­š¬Ö‹hîµh`ÓoжÅH„ZZj©/³ ÜŒ^T¾j͸ýHe6’™×RHJ%7V`O]BZno„FOO/í(¥.÷ì;ï«WÌn±õ½eà%í™AùæÕ^/.š,gǃ¼;ƒ€ù£’ö”°ç[U¶Nÿ†[ô†f¹CF3„L·C‘4LSäØÜôîØON÷v¦ïɲÕÚé¼îîEý@æÓ½_zQê×ì¡U#:à@Ÿö†Z}ŘbËcô1mSimnU;™|öÉêE6žŽ²á »•™Ý¯2îÈb}~ň‹ƒ&nh9^ŠŠµfGLáHóÅleóBúÞ÷Z“YJ&g'Eº ê/Ê'MËk],’Y2™§xË,Î1^ÿ E“(Ë­—±ÝP1jưEçøÎQ“Oy¦Þ #Šf†¦HeRÛ4cD˜ù±ŒCSl¨o€ô?"”}äs<ºg ©çÐÆ<ñ{³‰çõsX {{Ývs±˜¦³ Só¤ö ““§6Tï¡K6rØß´0Ù¤O¤ƒ<-P/8ãDÃå¥ Ú\ܪ’ ì¤þxúª÷òã~_ÄÊ¡pói¸bÊ#G² XˆÎÞÀä"ªóG?ýœS¤ Øیȫ®[æ¿©~²áTŸE67‘cϺhg‚£A¤PÈî)Rw£P¤¾ƒTÖߋՃÔBèé!+´Á% Ð4±õÿüò‹a}Ù l”Ò@ÐÏJìдOÁ§ü]¤P6&.3`g·lŽÀÈɇ$QkÐŽ˜n›º`ð̾ÃË\¡„l<¶“ŽÑÐx„áÖÅä`Ï„¦y9ͪƒïˆTèßíV9<ë N±3D#ÆMYí•ÛÎCÖßCä¬ýõ<Šaž®?k ±4¬¾˜pš ;ja Îôm£Â|T¿Õ,™4#·VÁÆãÈ5€çÒ<»RËã«ü ï£7¹bÆQu]V>/Õ_YG|êÝ0qê°³ µ;¸-Å­våÖ+øÿmû¯ Ýœ—s —è*¹!?,¹jwœõš…Wœû†Ñ5ãΆVÈ&¯};¶çša{[¿4£½ügþ~ÚÛýç8\"£Î7éÈiãù ÷›MêæÚF\ÿ‘î¬ãñsœ°î=3­‚”¬È'Ä~åÛ7™a"¢Ob„ò^~üŽ„IžVevQ;„…\‚uØas/Ü|éñ7tÝMëënù8’Á?ÖÙób[ø}v8t™ß|›ò­õŸ“©Õ÷×iÈÁ–&¬j2$Øi1º†òõ$ç,õ ½/¯§4±ÃêühXYÁжĢ%HòˆÃ¹×`,a9:ÙófÌh`§x°â;‚SÔáû2ArKÚÕåò üeàED¸§a3ïÝ I“'>×x*Ճª;ã13ÏŠ¬èfUvbl.ž­ªà±‡Ðƒ(œ‰Ùƒ¦=Êö|Œ-âž?–ëí…@žpÊ«œ…A3çŒÔi«Ø«™»½&dá6«=ŸÈФeØ«çœìöÎA@9T_·û·r˜Ù·—ë÷í¾g3§ $û6[œ¿ÉÐâ$*÷y;¡¡ø‹ÞÞšj’­å­Ãž?–Ä#¹£#Wgýù‚Mæhâ¨`Hš˜¤-\Wq¹°Ñ\¥ä—†¬Q Jg™5‚ØuwO›.=þ}’™èÛ]E(+RzxÚ—dQ²¦U,6›^Ñ6è?!ÑîÎ]IÆ¡³úy˜ð‚¼Ýÿèž¼j©J‰Lù£ú*â~ò‡`3N³X©‰ ¶C††œ:|ŠÌÃÍ*³;kvGþékÉØ><}ävÃVDÍÞ5_#>ÌÉ2ƒe°-i! vvN)(l-v G7·àkiÆÒ=øí»f‚MÑúý2Í^ëåÉ©½|ss–^œÕì1ýÜÁRPW8£Ïbdû„lŸ± ml6²ýÚ`WcƒÆò^쬉`þªÉNÁ)PÛþý ;¹#»iôÓÌAQ0cTÚæ§ó›Ò}ï¤ê'@Îb Ÿˆ@Ùô 6‘ÕÐ11p“żèåHŠMX=§…1ÃäÝfU1_ºi£fµð“õÒõZ þ4MÓ÷ÑNïõéÑÙÖéK`޾`‚tÕpÆV5„Ú&^tæ…5|²ì'rÖjdåZ)¸Œ¬Û$kÛ:8øHwù }T´ÅäŠáG£‰Î¥ÕøÑÝä"Û²Ò¹E–!^Ä<ô2`Ù¡ìØI&™Ñ¿CÚÙ2Èfd€œ $z¡Ì#¯Ã| g0¸B|ÌÚY“êÖ¦›¤˜ JZÿ©v¯á§|ü·CÕZ£©aY¬êÉiDJ-zi°}f¹³B8>8¤}3æGa„p˜ÚÁ}Zs— #1æ ªc¶uñNá<åè4éE ¹,.ó–†î©!]3®ê©y¼L&ÄbÐKåõsûI1ß?9tTò;IÉàŒ%bþ&3ãÓ1µæøª…PÒs:5iF²Ž^Er9¤Á3m-ýdþVL\•›®U¼8‹óæ^ÞÓö›¶4«UÊàóP?J‹¤ÿÈ+Ô…}dý:‰¢¿GÑN#Í݈_kôÿuÐ hÍÔ6Ö½@‹‰4Þ ˆuoqd`›¡oZÞDU¬S³”-V`Ã}ÒŒþp:k/Ò²K]”áẴBÞë•=žŒn˜¼–²YIÕuY*Ã/c¤‚.cŸvu·–rMD»½·”G:hÃ$w$¼K™¡6 ¯ŸÙ·[5¸œS@E½%O±JX΃ìŽ* hëŽ RÑÇkìÏd}¢[‚x‚®¿ÊK‚¼!ˆ+môªW”Žü‚ø¯X _B)h¬ãêÀñ¡­k9•äí¨°@æ.íN…ÌíéÆ[‰ç>#Nx\6å¶Ã&…Œ{q7tÔíu߀ãýÃ(KÆ rɉµïøH|¢}WY9H¥J­œŠy2›Ñ%ÐXKgB›<†ÊúÑpÍòàH Ç¥ú«÷È:jßI&lj<Ç5眂Ò8ü;YGµ‰ÔÉäUÙÖÀªÎ{ÄPذâßõWK ¨‰FP÷TR~*Á”“%ÀŸ{}´f‰×ŸÑM§†È»<ã>g„ÿÏ)ƒ Í+*GŠÐ¹,§V6Ÿ†âO*åÝÉ ½Óü†#‘2yÝäIzÑùç"ÌÓQjÆÊ{„ª˜£ÞÞ˽Ӧ´¸¹i¦Ã!*ìÄ –èÑìÒd²˜éšüÁ6Úöɼ—ÍÓÙL0ÊQQ¶Å1³‡íØ×*t¸iè‹6ÞvÊ]úù¤¤Ãc«1Ù\:»ÉÞÐM‰%Èš~¤».x×:OÉJ€ûãsU†þ‡y¶1ü8¿i“½’0";ê‹t¾5™äsž&q£ì]Z®ß³)üÝ8¼íÖ®ÌãlMŒ¹Ü›³´ôèÕvP>¦±9_RD:;ÞNǰ¾@¾óXDGÑ=29b<£]cÏ9 .»]úiNQ€zöÔ:ðA=_s z()¹D‘6‡Ï«VÅ2À†> lƒÝ¶¬Ü€Ž¯nY¹ çôÖ/s+x K3‰8–¥>˜¸1Ëé^xZFBéž›h©b>u›×í”áœæ\¹uçŒÀ• ༽߃WB'‘®Ñ€hXŽšEjvå!:›ˆJºtaÆ쪒¤HÕ™Ð4aÊÉÖľÜã¦Aù —N9©ÓÂ=±/ÙÝú”Ö ‡ÄS¾=CÝ2ô^ZÑw„)¼¼S; RëþIÿ]å¨lߥw{kêY9ƒŠ¶nt–ÑÿgkäžëâúCº c"=§âŽõÖ,4žv:Øñp0-]kÜ‹cûTn„2:D" C\ê°¢9„úK¹ÉÄkU;Ç'ÿõñ}rïÖ§ø­­FôÛá௑o‡Å;rsÚF£µ²i@dòU}Š|E¢EJáFTѯÙ?x­jH¶¡ÞñÞ­Ú÷\­’hÚCu¹ÊYå—Qæ- 1ܰÔhŽÝ—m¤Óeõ D¨Ò¾!·ÉßL4œW‡'âÀϦ|ò°ˆŠþ%ˆÎM2.&|¯9v³H0Ô”»ß1°»×ÌåÌÓ³î[šÎa[@·“™2ÈrÚ+9w{´˜Vä'Ãêa³n•Åɺ‰Åä×m¨Æ7Ú„\æåîQV`c†®)ç7SØ.Îh×è‘…ö¶öq?=Û–Q¹Ö>E|veƒ\ÿ(žg“3ÉbÌ7¢×~<Ö‚kVggË*±íoíîÂýîëmüsøúÿìv~Êü˜Þ¹:"[Gäë”3¢êB¨”gì Z‰~/él(v!êwbìßxÒä«ȋʺ”O”ûW«ÿ/ÉõºœIäðÔIÔ9UÕº&*&ÿE¨ã¯×îÍU]¦B *;ožC6&7HQ9i)¶×*ÇKW¨œïŒÇA Æà(D@ä"¢ ®²à]Ïd1>G»`Ø¿E,|ÂH•?¢gÖ%wõ4ÅÈ*µ ·ÏÊz™·^VR³‹¨JJdPª¤¡[¨ÆsbR0÷ÖvWå4T#‹Åkr ( €Áô Ž#)+WàØyU£ûŸ§=IÂT"A×2Êì ƒØ ¶3…šÄ5D¤»pǾ>XŽ €šÄs–aC/­el&*€h[† 8ÛTÑ$X…ʼG^,V5LyNš·QÄõXŽWX1U°G`_ôƒb±˜Üé :Í‘59Gäý>oí- ZWyWJ‹©•˜ÌzKéžbŸW¯ÉiI,²Y¹2¾ ‰¾6‘{ xðöªâ„ÜÈë3’5â-P‰ºféáÕûè‡ü‡2‹öžçXÓxHÐØ/Õmœ‡Ø·‰×>𠕇B Àà±’m`ÿ©•0æWD" t¤ø+æ¡÷xW5h]´¨t&-Ù ïÐnTä™ bÑU¸'®²^ôQ½ÞžÓÝÉúŸ×y'Ñ™Ì[ãä:ž¬7'•VœãЬž Wà€;,ìIÿֹǛ$¯Ÿ¨¿ÛÒ¸šþá _ÜÆÊÉÛ­B±9¡¸Ét:Ê8._cIñCj½,·`²»Q¬€°úöÁG½Ø=RS/±á49:õšòâpÔ¢~OÿS«a£ÚƒyÅŒôLé= Ûp½!˜jUÅÝ|Íáç«0ŒŽx®ì=ó:"ñ1?QÛ°Å<ÑT‚ \ÊüBÜ/3”q¡øö˜¨º/ª;¿¤À… âpo+ò_,¤[œ‰˜¼Æˆq¸nRs‹H®X¨UÄN6–­(ZË÷£¨×UŒêLÌL¶ÇDÅ«lµmÌZ¢ÅÂÙzôXʜ¿8N7ÖW§³gOÃvÞø ;Iw×LžÕ—èÁ*‚œiÙuri¬-ëöXÖí…‚ Óã=0·}(—ΪhØn‘>ŸÖû~,å‡MŒ¼/ƒ;¬ä>¯™éSôì©ÌôìiíLgÚÎ$ZÄ·)V€Õ:XˆƒÕ)4›‡Ø¹Þˆ# ªÊT™dɇIØUÕdéŒû]Æv<ÊåÖdùø|²ÆôVýCÔY>Ft—œ»¼îó`_««,6Tt)ÌÈø¡ËÛ×Ý݃àõY¡o²rb¼Þp¾Þ®Ì‰ª&+'ª œðR™Š” /•9;¢¡™ÎÛQMí,kkG4ÖÌ­Šî,koG4ØÌ­šÜYÖæŽh´¿ì`»ÑµIù»o)4…ÃÁRÅÚ‡óxgóX‚3Yâ¿'üçô¤BÈ@1›à¼=y‡m‹è†FJëöx–Ó‡£·Ó|ú®rÎ1žSÈÀƒ/•ÀS‰¦ò2KÝ ƒ®±k€YJû…è'—òþnG?,_wc)pÌ7ª ½Üú’°Ù|´ÌäOÜe|=üP=*0Ó¶f¢¦ñ‡–.ÃqÝZ×í…`ëNïÚ¼p² pº`EDPD/ ÍÕ4&¯ñ± €ÀÈW­*²ŠÅ¢V/¸qx¿$GÝ÷0÷ï°P2BÀ—ªcH€®vÖb¹ØIÖœK¬sâï‰ü¨œ^»lÈÂÅßù7ŒB¬%6 ŠÄOÄßÓ bM°qàZ þžˆ¿8ÎʲI+,™øu^r1yml«HDŽ/U눚áq±@7·‚x“ÀÑ`ʈ#¡½TY¡ l IÿʧXh£±9!¹ d#².§ƒå[l™º°ÂÓ°"2NŠ}»Q£l à¢*Ù·TáÓ6¥diÇ×Ý'ó ôUó§zÙQ0w²ó§zÙŸ‹ã#ûóÊܦN¿¬út" ›ÏbS>¦;nÙ³ÒÖ ÈýæŸ!1Ú8|±âó÷ÈÔc´ÑRÏy’«~3x9*‘ñ$ÚåÏdp›qŒÂa‚è³zË€úK­'¥v¯HùÐ]ªoŠèÉci—Ëê•‚‘U[Wš2ïÉj2#ócÜâÁìë¬?Sø?‰$ÜÄa’±-—Ig†9}Yu þrº‚[Ã0N6û›úmK7Ùœ»lÂæ¹ãÌ3Þã&¨BÑG+«å&`Ðø\vs°‰ÓÆm®•‘×÷}4+\¿yا0ãÑÞ $74óTnHfŒÓ—¶¡ƒú#E›‰E`oS·¨2=4ïØož]=RWí‹H9CÞP8€}ˆÃ’çÐ a˜ÎLH³p ƒ×Xg80ïõs°œ}Qeaô7”s†žˆ9ÊGÑÉ,GOÌes$A§0ýOs}ž0ñÆ4zDb£r£+3—ùb4€qš÷9fö,å$± ÿy{š˜ÊuÜ&E<, Ã}áá>G;ä Q‚e\lèœp¦’ÎË©`;–DZaÈÜB¸øÍC]Ñ"S¨°‹Ìt´£¥¡A!S[È2õ¬ëXÌß#®ŒrËŽIÒA„ ý%äe;'Y‰çÞ8yÎr¼7&ßÂÄ”É6¢`YTÄb®~²óûÅ@gÄ*„Â*äe¢3’kИJxviy‰¤ v“ÿœò¹âñTþ=eÊKŒß˜zéD`C»,žleÁ ';iôåùJl˜fóæA/eÑßʷܧ—]÷î\0·kh¢ˆ|¶&VEí+t53Ç¢6 mT¬3Ç-ì^Fc–.©&Ï©A<öáÝyÐ v¸pOU]WV}úJ¡Ö½Ïð>ñ-®<ÍÔsÛW阋ùᢘo§(–À‚ë;#ÂØQ²x÷÷ÙÓnQ™”8^ŒBÒ§€Õî‹Þ‹ô=Žˆü ù/pˆ>¸7Š*gzùA)š 3EÐáÀ{¾ðl¤-Üc t‚®Ž’p}'IÈ‘Þñ­á‹‡äw¤ï>¬G<>)o X¯(ȵ*õh—c‘ò9Æ=ÿ}.ÑÁ§HlßuŽí«U'q² 47F³»´piƒø š–žT÷ƹy•æh.É‹‰ðuXkl÷À¶èÌ~Ã=éþk Tu Ö£­*£O¦9âñ¹k´Iï{J—NŒöÔÛFªVõîïÈÝꦒóðv°ŸOod…ù’_Prµì°Øk¿¿,Ž`ŽŠEŠÍóµÇç|6c“d4ºiE®c@²íHK¶˜€Þ2öÝ–B ÖepQ$Ï ›ÖKÇ}«‰Œc/¸w§DeÑÈ8PÙúu% ¾x9=Ð'Ãê >ÞGeѾú‹+K'ÖKÇy»ª¢ÅõW•N5Ä‹ìWõ­ÃïTY—ª_/%ê#n9еÁü¤¡~ì ¼/ÈI×Â9ÉÂ?•-û“p“òdài‡Úo aöªCˆ{x’¢·ÍžÎrö|Z`­å¬Ö>³´þÞ‡ŠŸÜK•¡D"êãßÄÉ…X©Žý&ÏÑr˜=T}HöýPžëNhuo>÷fåÖ£~EΊHëŸÌk¤%™æKnZ…è3ÈxUÕqÕ¨È}Ÿ^d¼çŸ_å|PA~D†Ó’χyÒø¥øüKŽ)ƒ>K¨q’ð%DIp¨<µ0¥ *®þ»'Hå]^TUwçŽt ê>å÷—×SéÞ¹*âÒ|Yš¬”%¿¼u+Õ0t¡úËýH¹“íQtl„:ç³×(#_à ÝUºÓ´Ÿ‘q§¿i¼Ô¹5]S^_Ã6 9:«æ ÿTxdÀ!/µoç©U_Ún;òUó0KíŠÜ†b§ˆÝŽe8£sú¢bà–),õ˜GˆXª7^ÆBÖ‘wKìö§ªzdšñÑØ`‘78Yå7 2JÊŠãIб»:‘þþÓtŸ8½|sÀÐû?ŠND$q‹J„ÿžúùÅ$ûÍ+§"=E×F6Çw™Ùi̿˼ƳùØ9Úiîîí4ñÎ$^O<:î5A‚lv_À§ÍîÖióø´¹u´ÛüåøÔsh;È)àŠû=Ua˜ äÖXätc¡xTlLªë¨Ñœ?Æ;Mñ ß®c@‰÷Íæ7Š[Íòï°uä9<Àû¯çÙ¨h¥ÿe¿0Bž7Z˜E!\ûí÷Ãô̈Ï ¤Äu—©3\Áö‚œ».‘_7o<#§ì©§œ¨ÉE’MâÐÒU\m6Š»7<ßÅž§ U3OiР¬A]ê)ÏAêQÞ6—ÎÞª ¨v! ¥Ð¾šŠÞ¢‹ï·ƒU÷Þ|A÷z;÷fyçR>A›Ñ­~Ž£ZFWojÁÌúß<©¾N„¥]ò?‰|U¿yÃz-Ô|Ï)¿°×”QÄD''*\P =oÊN—}N‹ë CPƒ+Q¤äµ×ƒêøtÛW øg xDC™PF äú%\Ô/ᲺËšÊ-Ea9ØÊîim,§UX¶jbÙªÀ‚ºá2Â!e>þ‘ø}¹{¾±·³ÃþÁ›=8ÍÙ˜7-´1ÒbŸ+ÄÝ<ÏÉ¿©»ïÏawHúüÙ I7¬Èä{¨áHù»í™NdÛ?žW†NN¿r¤Œ`g0ôûNnö¢k‡³ŸÐÍÚ}Ó¶YäÇC³X~ UœrK³\;?ºÙi,GÚŠC ¹)þ´~ÚSqŒqKNÞšÂ:  8À.šd4™‹ÀͨÕj}öÛøP(aF$ñÂ"`ühKØÓ ÇoÎzÇw¬T˜Í÷ó^Þ¸{­)UÅO÷zxü`ÅÇoèµ1ÐíÝÞñé^WÐ{ç†ÏÍ<¬ x^ÖäSœQ¤p4Õ`1x©¢TŽ¿Ô*“DÈÕ`Ixû£fI6¨U&‰8«Æš¨é„Ërt±zÆ„µße\Û;;êfˆB Âzƒ…ŠŒ»{û£½hÔds2+Ü@ú óó^Ô5I]€â׿[FbšF)†3¤èжÂ÷·ÎÁA~½¾­#`û[½ÎñQ\°"ÆLÉEéôGåó›Âç,ÓxÓ-Þžv!mJ|µ½›wág!b¨2ªù8*¶IE…Qmm¯ªЍ@d:U9 Í9LúÉÎh†âqÑÓíŠa5CSÔíâÝŒ½sãQO”Ájf»µDiu–^Ͳy*ìi»5¦÷BZs¬]­ 9ç@Ð:ëô‚Ó´™Ï’)Ó ¤"÷±0š-3#ô˜}k¹j{bµ„ÑoT ^ëePu[æýD‘ÚqYÄéEéNXŽ¥©Zç¨wlLÊ$?ZߢÎÐ5ÇÆèÓç)nc±WThr¼{w µµGDÝøU¨ò©UW egŒWˆ1¬“É z7eýl®2‚”‡­j”íß‘}µVŽ·-D‰ŽÍ \…«‰c³Ô^V›Ý×;{§÷@˜Ð&/þ•QßÝbÈá2Pƒ´ßß[‹““ÑâLôCÊ3†H@ŠßUhE–¶ú‚ÇÇC|8ÁS¹Ú¤ Niyoñ °¼øÑ/¿ü¸=MUÔ#X®¿lòÛÏÒdñåDõ;`G4¡«"™:- &YŸMzpm›à½Ó½­CãëGgòc!ŸsZ¢‰Q4×` .¨Õ1ŠW;PÓ"] òã©‚’8“=06ý¡TÇùìFAR彂áVC.>8`ÚˬÓH;d9e2?¸½ÎæÛÀ•ÞËâÇ£YVôÉ,A¦ÆrÍæ4“ iÐÉÓ øŠP%¬ˆ‰¯°­B:ñ ™à?üÛ×çÞsxpÚéî|wýüÙw<õ¿ËgÙÅcøýx8mãÑ=”±ϳ§OáïÆÓõõ'ø÷ÉÓÖèûÚÆúúƳþ ¾?Ù€ÿ=Åôõgëÿ­ÝCÙKŸ†yŠ¢ûu–¥—­-æ‹LÔ?¢JäTõJôþ¡ à´óòU$­F´±¶¶mCÀøi ÈÀj¬—ö/'ù(¿ÈÒB䣛ÒÓKcðÚÞWë ÖM.™™Ñ’%îp¾Ìë”O»U4‹tßm’ŒnŠŒü)RÀ3ŒM6# –à‹”döo1‘LgùÅ Ö0)«ŸÏDüóøŸ£ÓÕlUû4Âu}¼Äô(z¬ü•Goð¶a±S³”>þ ›„qÀ„tµùv8פ àÏÐrápϫˬIYÇx! òEí¾-DÍZQ„ç!\Kè)‚>a!}HŒ uW—ùh€Â'Êg 0ú—ÄÊvðÃ<™Ì7}ñ>8¢Þy,øW¾@Ëçh’Jôh.F2«S‘BºÆ¼ÊgPcY¡ÂÐ7—0#qìü&b,º o¨Ž— ß¹2]ØóŠªäcÕ³CeÏ¡{ѯA&dï‚ÍÄ!ÃŽÄÎÓùŠÞÐßÑO_P‡Ž“›¨‰4·%Mp7@Ï3në37ç}šNq MχܪQòÛ Tj’ŒÉtœ.Ó=Kø©è9¨»Çœû¿ì¼â¶_QÓÓÙ\Ô} Æû9a§3¨#•ÏC‚5‡•²ô¡Ó± ÂvÓ¨Ù<à¾à¸ëSÜbÎòé,Ãíˆjƒ¤~¨ÍI2 ù¥ŸOÑi,D­<·æéDÆ:+Ò.R¼O(ÚX|‰it¢f„9ÁIvè¦c I˜`öüªz’®E‘2)2e4øÛKH!@º»Eâ¢zTäØ_bþmšà†2єȺ;(2‹Ltì%q)œciQ˜¸ê_SAíN`T{vÞ(Ie ÎÉ £iÔ®:†:þ;ߥC$øßÖÄšvH\¸»Dû^a*&o§ ºâIÒO4 ®!Þ…"ÒÊ&Ã\îH¢‹Q~Ž—ä\†mòÔ^Å÷ðŒ{¤¸«;åèHù[aÍmÅgy ^¦bäˆ[­ò+‹a §‰ˆ9(hÒ4OܧÏKSd:JúìÆwœP½SˆžSak `„ z…6üÙÐöÌW_i‚÷ÿ©’ñ”Áñç()hï/ë‹ñCÝbÁqzb††ŽÀIaÞùp~Ås–g0fùžäL3È&æ(È# ëö¨më<íéLSæ`çù”ÃNÒª çì¯YÕš Ã@”u9]ÐÂQ>O%àßõ ã|°¾%ÜœCÅñp›0;ë–Ò˜Í Y|$–ëh Ø$:H!áŸä?úEkr³hÁ§ ̈ÚŽà†ÍééùâBZá©É…Hé\ÄÝÌéŽK <7ê\uÆ¡ŽÇDÃeàr t6S‘º ï¾UuädãÛWX[®YYlb‚ʹ ”h5VeEe’˜¥@ñ¼_Y‹d’Íov.SpqÛ8›¬ÈÞ/ÏŸíŸ hÌ\/‚÷²›(Ú¤÷£no‘Z '0Û ô£³“Ó㓽Ó^g¯­Pè`|®HÒê@±¥ƒf”_ÁÒ=½4;ÇG½Óãƒ3:ºyyºuòêˆT§"T…íuËÙÙ T™Š­b,FŒšÔ;}½ƒJì³½ÃN¯·wZÝ,Œ~ŒS´Û:1‹hQ×6°uû/ÏŽOzÃÎßI7Žj7.{Ū…§Ž:ñ%nù_–¿w"§gtR/÷ì¯'"¡Sΰcݯ[³Yrc? €'R‰kÀ£Åì–kÇ*cRwPGA!¥íÄî&n·º9rw‚²^Q˜¦ÉüUR\öÐÝéŒCN>MÛ° ¼?L¦¤è"WjCEpmìêVx¡Ò®³"HN"`ÅhŠ¿ú î}\®Fû–Õk®#2ØœgE6 ³|Ô¿ß%ÀÚVyÃö˜àV›ÑªØPñTÖ”®ªÉ‹ëiZÁ¸è·Ä…ÈÐâˆF‹ …n¿-q£…¸Áj@2ÓTæèŒß9nå‹ùt1¿±ëCu?+X3IÙe ²‚Ç£51Ã))~´Â,ö(`‰žáÀ€¬L {—^ØË`¤S#Üìyæ—ã$PÞÅ(FΨtCQý…áµzùŽP„QøpøÒB§*3$/Lé¦óV2˜?éd‹ÝlL"Þùˆ‰S‚Ë6Åž"¢¡Æ< ‰$™½[‡tp¡üÕ¤×ýtJ0=:<ÆpŃ^ŽkñËÖò,„õDï²yÄÎi`÷CnM“v#Ø`›¡ï©èG¾¾Il)÷‘"A:§$ !ôà¼î~²’ùpQëÃÈY›a’vbüc€P.*ÃavÑþȹ¶aT!Åõ^ágÝob=tJ×H‘µ©x¿V¤¢ãL;¥k¤”ó¨ÔÓ;¥k¤8ñj¬@‹N>í”®‘âäà «"½sÚ)]#¥œOV”¼yÚ)]#ÅÌhxSä+·-øº*G¨C·#µ´Í#É!É8¹4*tUÃL4¦+‹×öØœ¸‰Æðœú³CtPNÔ£äÉmÓA)Ñ*On{´œªÛ櫺=håD=nžÜ<¬¹`UýÄCeVÏœD6eÛÝvRžVåN"›Ü욟”)U4Ç_½ ˆ¥ÑöŒèèá„­NØØp4(à‡,A‚#: 2ò€` edŽ ª¤užKQ]ü¾ª 6·ˆ0µQ–±jœ9õ0V•fdÕ¨Û;)7¾˜O­ÖK |@VÐÜ)ÏWœS𝰑D%;²Ûë­þN«j:Ab:#ñwZCE' ac­”!Š©ßWÿ‚W ’ŠÜt-ÆÂ·¯ÌR¨<…qîkHIè &ž5WWùº½YÊ z5´ï…,…'Ç?V£Õ@ÂêjT¨ñ=½Ÿ,ÆÇÃ…ñíƒã¿}Ìl…Gë<Mþ£³% *Ö*©xÇ õ åU®rˆü¸ÕC}W¡^eeW1AAPElº³ÕJP…æ9êÜ cðLÆRÈ:–;H‘›¢V GYhFíÑ„†uCã{,û‡M:³ó}ŽlÏ¢;<7t'ûWÂÓ–•Òɰ‹ºæc1o‹JÇÏ›ÿÂ8aéúòCsý|)¦m¬Ó¿Ö•Q1ËÛ §Sœë‰·hh.KÇò°„φ­™r®E×+uõ fÛ™˜ ? «w ‚v,[-,ì#¹Îš7ñ9àlY{­9ÀFé„CÞ›rF&¨f‚R–eR½‰`bÑsñ7Å´!=…”| ïÒdõtMdÙWS½ôÂèÏÑúŠ*æ´ب%BÖ*"‹ üJEKU˪´´+ú’\óÊÕŒFyþ~1Õ‡ïÅ4§5N¬gv; pY·&_Ÿßj‹ó°j£‰¿XÂZU,¯¨V±‡‹e³Šå¸pLÖÅr…Mf&øŠKŸÌfÛ⯹”© DYÄá/±ÏŽú}5zç˜E=¿Š!!-Êþ±ÚhK‰ ¾R)Í¬Ñ ‰ig^7 ~õ-~…eÛ 3šs¸®–&—Fbè˜Í6̵¡wÆù Þ ¬G·r`B;= 0í§ë°¶ %Æ0~;tˆ"j£Ñ$CV½¶Z‹é€ÂYkZA0Ë úsƾ^ã~VyýP“˜¢pÓ!»ò"œ²µŸ=C¨yŒy&k/û’ûKZw¢p€¤ #ë>ktÑT,áŠÈžÐ¢_b]ð©/™4¢5rWk4̪ÁÞµ°™à4AÛò„5 ‰TN%³RO–0SÈ™ó1â*°³>›X“r £®³‰5®F*Žù™ÂíÐ9Ê-Æœ7zÌ¢wëÃ놇D(q‡×ç'Û:6¦ýºÓ̉‘¶á0`_Sâ Îä'þ0ŽòÓ%õ”5d‡mÐyÑÐÔ7{ë4±AÖÔÊ~RwèP¬Š”ªõžöbtÈ'¨@ßÂne˜Ï®’ÙG§Éî ¤ÐËn";sD…Í&¬HÀ„74/¶:X$AÓ‰>ÝÂáC¤¼Á˯£„¯P~±„-ú\qvž¸Lt˜BF8/ÄÂ#0±‘×̨Âp1C{1éÅ…Î܇ÒnKâU6jâÈ\ E­hÒB1wm”’>r'Y7Ì@g¼¥9ņE•¬ýñæübV¤d‡t™| AÂ[& È)‹Yb¡MLƸ- 9så;ì‘¥…'ÿ$¢#®ßcËç@Ɖ0SʉA(Þm-¤ƒóÅp¨#0XûÖn¯¥¶Ô€¤DqÜ@-ï|‘ GßÒijºHçèáÙÉO» Ù—x>„¨BŠ—Æ$¾¬æyD[P§ti~D´ý2v_î>Ë@ll¶N÷¶v‘X? y‰zPöµ÷ ösÁp±Ý© šSùDí¨|Ù§)‹~zßT†úlIALŽ8'ëþQV»-V›¬®±c¢ Ie×U²f´oZsR­*‘:*]äir1jíBgãØ1"E@$yš®BYlùHÖ …ùþçÈ\ ïix¹n–ôç–)_¬.…8!†”ñ5©„¹m:à™”EÞÏÈʈ8F6·ü%ž?f#%×Ur=Pè=Ô®ùýλ'Î-w<ßÂ×Û?q>Þ@™×8"bÙ¡y4›ãý™‰ÓL6›)•D>ðå …WŒ"h:‚mÖE¸ÅD• ¯û—Äîƒú˜Qúw´ ª¹í0`K’û¦…éË$wÆ­w±Áîßœvz{,ºg9Ý`%‰67r¿Òà‚avø/#Ÿ+‰ÿvù¤Ì½d§ y\XÔ>3Ûõ©…©q4Ãß¾kR•Õà¶Ë¬§ÜX¼âs‰ŸpaKJäç'¿—N&Á Xlk §¦ø³5ºÈÉzRr 4ß—j}×?h£…rà²ýKóJW“eðŠRcÐùU\4T~xN­[Óœ®Íñ• ¼(²|.zÒ‚Lê. m…sŽü¢sº}~cþTe>mEº—0 FÂYieΓ_¹‹ŒÚ¾±®©5…f*“á-h2ØT%}ߊº ¤ ³>žÇ]äÉœ <ßUŠˆjh0ÈÑÄEs3Ÿ\ü| s¶˜Ä;C Šò²EöóQx!7A°ÊKú'Én¸·GïÑ<÷Oýdšô‘[CCgŽ {G½Óÿ’sDXÑ^Mÿ Õæx׌³Øy~éô"ožk J r˜Y`]Çh4¯m‰÷bûæoxoigÄXÏô¥Ææ•®T§ù¯Ú£wàÙÅs2'mñ<9_ŒPƒMþp‚Ò,òÜn/Þi‘©sbÿâ'”2@Æ2¯THel<‰~ŠÖ¤zw‚ÊÞç•N§³xõÍÖéQçèe´½µé¡É?Vÿg²ê—“Êî>Ô#Ù¨…¤À÷@)¬fÛèrÓ„M§`©ýH~²¹Œãgì?âH臦ڟ×ùóºùõäøä¬Û3Ì¿07ÙsêeM\JÂ;¤âÆ í.ÆSŸž¬ø@¥6LR¢Ý*ÆÊƒÅGt.ÁÊ‚²j!ÙeF µÂ{F•»¯k±8œû"ûÛw%eôDþ-âYúAÔXµ„]0èVË#þ¢HÇç#ô걌–]  £4'»„:ç<^ÌECÇïùe{1´=íð,¡&”sÁu¢¾!f7çö¹(8Ø•²²ÝÄî4,Áê{jiÁÆ.T•D%\ B†Rb;/Ó$º»Ÿ©ËYU2gaϽRß<èa@œŠ rV\ 3yFTb`âkQD—äe`›‚¶&ó‡b?O±Íó\اÀ§ ß®œäW¿}±iu‹P’Äl€ÚÄ®Co ‚D%[hxŒûòAF¹L¼ÚÜíCg››Ì鱕Ïe‡*BÔ -Â_’ædÀsE¼ó:hÁnûŸñ Á³D­O¿&2/J™˜™¨$œ‹hG暥°kžÄð6ÈpɰþØØFyþ(ŒŒÜEƒp¾„Í<ÃE/nU4´9ŸˆRÁ,gž±, |gOÊ€öýÞJ‡Ñ¬}¥&}|ãóö]Ùžõ 3]!KóX ÿXý?s9íÛ«ÿX¶ùmŽùˆ¢áÍs¨feëzÈ„æ†51b,ª‰ÄÕØÜ”³ÄÍëèå€âŸÎ5Ë>™¡TåCèk:wöê$Ävf%ÿ@kùÈÓáVׯЄ&4¸¯KͶ{Rõà76ÏVTõßSøè)G/W9Ýfă“ûeÚÖª~™]\âYÇÕgÚâÖî”ô‰´òZ[£ãÚæû³µ%´Õ;E†UéíbQÀ˜Óæ—!ÔpÈ9à2EbŸ T‘ÄaÈù¦Ñ±y`ˆ H\©ÙBbi.ìjÈ\‰]c/|¹Pˆ¯Ÿ«˜'ãéŽ0i“ó¿ž®ýå™Ù¤=ºÒJ×)ð/+PH ÐõÖW]r‚‡Y`fY©ñ»Ø¼ñ »úKžm$V“ÁÀLs±° «,ST`CT Á¹ÃC@Ê;žÎc +ùZ±êÎó÷š;Òºº´[ºŒbÐ=OS³Ãh°±¿ây6GÉ›½ÓHÇÛÓ辸Ä~¿‘Þ=‹çtÆhÿ±uO:½jN˜õr9ÿX}übõt㜠,óSŸúÄ!"¾‹Ê‹Ÿ).Le‚àT¿‘©!nîÏÒÆgͳ&ÞsÚÛ}¹÷ñª©,½¯Ì $Žo¤ú ý“Ó2‘@#ÙÝ EBËþ¹°ÄmRÁçCh ùÂ/„áÖˆn‚<ž^ÂΘún9 Iõ‚j+8õ(ŸœÈœò‚»G2&;D”Œ» W8£õ¸ë,iŸ8ÇpsO@»UÒðð:j—L9Ë«ø$(‹&Z_G?)ów(¥+¶ìU…B!ÛÉWÍWlHÏ8•GE…ö(gŒÓ©M:¶ Q‚zbÔm1r™¤W]ÊBrDYÙ%Aº½–º­a´ õOhÊ=DYÑ9¶-Ýl°–ŠJ²çŠeoW7cßÉAò1CGW0o Ü["=âfQªŽ…ªBÔÃD`ù;¢½%yðÑ>™&Ú@ûJ‘/+ O†ÐgíØ­JbGï:?"Ù/(X‘TåZ}>žÒEce,‹ø´íÕsÓÉDväFFéö%LÚ”DéO*=žmnÎ ß,Ò,­”†zÖäj5~Ô¥Ílº`_PÊP]åè† Ù07 ›/7ÙJÚkEçÞ 6MØ SpÍN2ï6ƒ!¸â1{¥ü÷ÀΖ –×v¥}àÞÚ‰.¿Õ’¦< 8Ý;<þ5q$ÂR—M"ûªHõ^n5ê/f³TÞW…Ÿ Q­Ñ%#Ú Ø‘3r!'g‰<>dE†ÚB¿U–™EžfqíÚrrŠQ™›,ˆºY¯Ü¡–£HI-]½r¯&I&A'‡— IZÔUv!"á–[TEÍÏH÷7Ë>àèñ¢€PÍJ­Cé³NmåÖÉ)oü«ÈÐŒ~Kgy F3?rî½WChOJñ… ©eíèWwðui¬r`ú+úg²{qF?RæÑtókµ`øžFÀsÑ•ù¨.ºßÛýÌZ2XvZ;£¡KÈšdŽHn\ì šC¦“·T» ¡Ø-\Njb,ˆl§f­©è³Æ%]ŠÍòöRÊwÒj/!1¥‘>™LžÑ#33¹4Zsù ÒQ¦¸¶.œø÷ÏÞ7H3¤ÈŒm6$?Ò– ²7«Q;yÓ ÅUäx_pÝ9g{Tb‡PÜÖ`—º†¦úù$Áú0¤Æe(ù>‘ÁW_îV<¥XEH<2-H^õ”ˆÑøK=kè̲(£ôr©w AE-2@*Àî×B¸Ä+Ü;;(ºž‘ãVÚKOb7Óx†lg­4°4qoKr—ÐÜÃÛÝóï¯.eóÑÖÚ’a_óûZÜ÷߸£G®Tê@¼&¨²xHä[üêá—Ÿ}2rö­œÆwüˆi¥P³$dÂáiž‚ðzí U¯(•jœ·Ê™w‰Ö—™†ÉŸÌ­"(w€¢"Ÿ<¦õY/õ2éN\ñ1\¼]H…£©•aÍÈ¡ÖoŠ1mp"iö.f™Ê÷¾UÂÚ[Zy³~y@NìËâœåP™hã½Ô…ÈœMÄÝÊ:Ǹx‹Â4½üwÜ|¹5ß› bq²ï›Sl8B%Ë6q„Oºwss–âá{ûÄŒ¾fB–l¿Ò&þ¤ÕùÛÙ__žø÷Å„KùÄi'£¬QÊ@°Te3é÷;=L.`ÔÙu´Œ¢â^‘Éï¯SA‹RÀ‹2<;orñA4wj 0âHÎY],Q¸›Ì—ö ®¢œÙºlŧ)aöá?.¡Æˆ‚=òíåòIZnyùf*WWm c…æy¯YF‰gšF.`Α4#z„b å ^ØeÝ`y!%Å££9ó-ÔR‹!êÒ»A‡~y%ͪ,Í™<£ÁÖj"»Ï`YOÅ»Y¤Ýšè,•Gsªyà6û ªrÇ‹Ñ<›bÜ‘E 7G[2²¼È¡†ìÂ-J¯lnôHÆ)éçHñx_V×hç2—ª2CÅn#55YÜ`Ï:XøÖe!!Éê:mrH´¡½†*„w§póÕ'ü.Y ÚŠ¨“`²YBV=œqŒ¦J ÝHƒVKÃTtžz¹é>¬úá m”oÐJê:kln’ÅJS 6:Ÿ`‡\A{nRaîÿ'öYцðº—ä“•°Ïx&µ£ó?¯‹í»¬ë'´•“šO]*éI›ížœÕ—úÊ;õRe¯T ùÄTνÃ*¯¾nw Í‚¢Ÿ¢o°K—(§ù1+û „ìB¬ÈrÈm ¸uoÜ^fë<åç ÌÄ¿¤Â&dQ>Îæhj°lŠaÒÖhD¦;{”—fŒÌßð°ûry¬‚D§˜¸< IEãt7ÎôÌØOðÒ…ˆq-ÂB|SÚ…ø)Öˆz¡j Ž7|#"Áa²)8cBNŒœ/øJ` „¯Ç(°Õ®wV›n¯…˜}îöpõZÎíø+«âÇR’ ‰ƒ^y¯RÎ#Œ·ëWH3%©] d¶õX'–ãÒ¦VIO^ãEݹ?²Š¯LH&uaç×b:“U¯5ûR1F7ŸºT Ñ3صë)J¨Œ¢=@÷tµmŠtÞrOŽr²?H'E¢£ÌªÀjK¹pâ«®:À28FÁÛÍJaÀl;4WyA—1ÞÓ`©(ð#ˆÑ6G\ú]ýG9\¥°iMèøØÒ8puý¥ ¢ºqhz.ñEϸâZ,¾7#-M9ç¾CV\¹mfK4*ÆzÐKr©A4<Ä ½5YÌô•d©q‰® AãG‹`<¡)V>ô'oÛ©¹ry{Æ·!Ñâk,é!F ¯ ×â°ÐK* øå‹B¬ßþa”ñÐPºÓu ÑŠ,ÌÐXü5´f“—Œçbª;£41Ìèqã"ê#­ìƒ«ÌmÔº41¼^ô˜þ°L‚^k‰O‘ nÒqN¶¡è=ÌÜ`Êœ¨v×-m7ΣÍ–¸êq»·Èªá£¹âºC˜#/Oœ !ë¤ÜتPŸÈs¤ºbŽî"õ–¿÷Õ…ÔrìÁ1º-$'1ÅfiŽíÊ O©#¸á° J¦ÓÑtC£çw©É9LïV‰°{ØÓš»iàféù"#÷Ì)ËÛHV“dLœ¸›c* ÇtP´ôìK ÕqÞaÜ@á”çUPäÕ3ª“ †T©|,Ç©ÙàžUu¦¦n–N“l¶#ø<¯Ó^ß‚UJ; H4Y =ÉÛ? _ìP͈ ßÚ9><„M{´*¡q­–ü}©%§&2s…lîîV„xOcà‰ Ú=ñ–×eñ”T뱌Èð"PóŒ"] xŸ%)«ÇÉ&ÌÝì;;ö.[éÇÚ”ºiÞ™à\a!o c‰•ÌéÄã¢l€ÛäV@í|X—Q”´=á¿R¸®¤xti1'_ãW©㲚UâmNÚQ˜† 3ãŒ)hUjsSyÅ8$_”Ø`– ØÞ@déx:¿ƒèéY/ŸË·/¡»Èî¤Ï²\W4"è¡á·0’x}}Zë@Ì“ï̼¹Ä®5«²²Kt«4¾k‹b^â@W—x° ½ÌWAf vD_Rã:#6uE‚d¢=¼K‚âí¢@‚Ë¡/Ɍױò8"ää#G¶´å;íç7¸i¡ûÚŠ—ß(¸X°îY¿yMgÎY5“Ë:¦0óžõC|;rN©¾ºjX‘ømú®©››eÇ)f³ø¼ðšZ„Ü¢˜?Äu†[$ Dh‰ Ä'%˜‰g~œJ§Ì1;–ý‡Çá‹ùÔ0z¢¦aC®C€üŠ¡‚,ÕÇþOdíåAŽC”žúQy±$OËöpùÙ¨(CÚÈm¥_,±bH–-Š&쾈˜/ÆÈ€ñ °€õ ÉÉ rO‘†œ„W Y©^%ðªÁ!ÎÜn>›·Ð¹ŽÃ¯iª4ãž2X»ëè§è&PÛ6Ö?qñΊnT4_&Û‡ g'´Jùo)þ+¼f.U±kUs…¦Ù¸O!J\^¤²'v xf¹Ö¨HźüVP$á~g/Е“Mn–BKgFxsÅb³ž¥Þ5"Lq7£oÜwÜ@;ê€Û³¥ðšpé“'†N–xÊ̘äßhéíú ÖV‘cö@'s„?a[ûŒ¿J¡#Qò&½£±c4ò‹F1…ýžaÃWBÉ…¿!ËÕö_ò^vä¦DY2g,I#^Ÿ 4ÔÐMrËNE… ±íù¤c8ì^²Y,ÑQSÀ ‘íLéƒÄK OÃ{œuf€³Š÷pJÙiÚw´ã+þ~NÄ 3¥â*„…JZxõV:ïºA›%úq­}&Þ¿ãOéUÄŠ±È *ÒÿoFÛ\MThEÍû ãÀÏnoë´§ã6›¤óéHŽOêâ°ÈIy—f%HH»tÞšœÅ5£²jÉYƒ$Ë ø#.O#ú)§Q€÷J5׈=Ç­¹’îÿ±ºI<Š¿áJú–š ý‹±Ó ¿êù68Ü;Á¬,êÚY¥ûöª¼oŠh\bv-ÓŒ¬‘X ˆûTûוÇÁĉke6Ôî8²Ü%ºÞDw¸Nñ£øê,é¿«_¼â8RRªÄ²IøÖ$í¯ÌÛ"êf¾¹ tón€ž†7Ò‡®‡âýü>Lƒu÷<ôþ‘¿Í šcèñyäœòjM’aèj.¬]KÎ_JQN®è~€ŒÎÌç±8»Ëò ~>:”Ô°#\&6¶‘í°:B¿…ÆWަ=©¼ÒCénJÙ¥y(#Â!ŒÀ}â»G ýde¤.⛬Âe8†h°½†×¸ŠŽnEâ9ú/ô+˜uá2ècQõ¶²˜/w´(pe±Pº=‰µ“«¦ô‡Na"Uä-Ÿcjó¡ûËVÏq¯sïa§©xªÏ|·g<8ü ‹yø{ÕÞ¹J6'4™áÍ%ˆ¤?‡ý?Ww$âÆ»Ù·¢az…Û'X’ÓY±é¦Gy$,'9D§Ë,РKŒ›>C§qö›ÄE–ÏQÊ€Õ›á±(" l-_ÉñAŽ;#%SÑ7d¨3RQq cdmáÄm7 Õ… ƒÇû*o†ùÀ€h<«ÎÕßgªM°Çþ(ÉÆ!¬zc¯Tww`,Â#y¢K&ÕDç;­Ùá#$êHXF& VË[¹>ßЪeĪôoó÷;Gî+¹!Öüàp½JÓÀ‡æoƒƒ³Þ«½³Ý½­Ý˜›¸», v»åQèJˆåPá9ÄÈÌrê{I–Ø1yâ f¢ÎmC\X°`AÁjg(ü•Ö‰6q¯¤ô,qMJÐîU’¨äöºÊÖ-¢^®ÄÈm,5óX„n0»ÕªJ—#•)ïu2dîuu¾x¬èÁCúeéΘÕg£hµmû¡]6RøÔ-j&:lûIîØín*7णü¹Y2†ªØš^jÕc»«Õ•°ë]¯0Ç?í-|Ðò£jx[´üTÓsØ»™' ©”jcrÅeŠ<|jsz'˜Y©nܵ …‘Gɵâ'ú!ö“Sç¬ø.ª´ÄÂäÿ¾Vu áXÊX•MŸðÑÐçŠZøÚ–ñ»•{>C4]nW”Kúajö¿û¸ b!à A™d=ºßC*ÜÐ’EKªaBa'å³xØœ5¤¿?Â6+ãe¢£‘ÐIK'"BJÊûQµÅm'ñÆ ;ÞˆÙjT¹6–«—/€ÌŽÆøÕV«UsIóµ{Å?¢!4ºÌ‡‹‚ݽGð_wÓ|S©CÚ²QzP¸  ŸÊEQêH¼Å6ÁýÒp@û·ªÛ7ºÉN}&¹º­§÷£A<þSgb*²i(có~Œp'˜£!0ÓQ…¬ñoЦ¢«UÐ1EÄ#'ILs dœÑ€Dl=³‚†'e!%0ÍÃq)¼|‹ V¡Ü$ÒQ6Î&Ì”É๦H1ž9ìË?U¨†j‘ø}y 1›Û[h¯üh/zž Y:HeÞ4d]”­xª9 fæ«À ìI€Œ•`{W+CœÝ›Aƒ¡EÙ¿—Å©Ò,D~<¾å†NñÕ‚”‡”11È®i3ZkÐÝ8lfP7ôIO4pŒN^'s 2‘äNEp¦8<5ôDAW•à¨ûö^­B^bÚGÅ!ÚÖþÉiÄô  Ðg„%X”«þÉÅTBàãº5ðX5¢Šx·f}¨>ÙµF¢þLZø:ˆ0ôu2÷^zfË>„ú˜QiRê ßÈßÙ—à0|Yp…ü‹%{'ÿ•aOój¶êÖUtš(Õ,8fœ©Ú_V­zÆžœÓ&]"¶T…ÃZ!éÈ 2Ìó9GëT!Ç.—ZƤ<Îeåc²'4ÍÓl£§¡e°¾Å{t”ÏüÈŽÓéwàz*“0ã4™ć6ÛôGeò¦ë:BÈB9Ï ·MþL"Réõóg5·8CB)f1¼Ã<Â’š³ŠÉ,¿í;œ¸Ê FlKÛÈP=*}jÓ#èé lT>]Ó?õ` qPb®€ÃÍI³Šá;|&Ht’…ðà¤"Ú\ÊÔX ¥Pàç¦÷ª¬~ªåG“nq¢?{ê¬\u ×ì’Ó[õ >Ô‘ÙäÞ ÷ç­,ðäÖº»]ªþv=^oŠneƒï§§·¯ »“žŒø: ¹tûÍmü5xm't°ÞÄ•dÈl›&eM°È=^ Is¡œÐœä=™Ù >$“yrA§uÊÄÊïÓÉ5sRŸ#ò'Ö~K¢zû ðpx[o´7ZkïBY`<Ðæ?¢yŽA`àoôv½¹<ÏÌÉó¸N&.¨)rFo¡’ÍõšEÙ¹‡³U#›:ÈÖ—>µá‡3tsÿm£ùÌN¹Ëb^Cðõ±ä³_à›Ÿ9Ùhš2KM< X=ë¯á`”u*4 TÈE®Pp¹a}#^7£áÍ’‹Šñ ŠkãLæºJà‹0‹‹ü&®,I¹àö”5hˆe>1v2&ú³Ñ>¾R¸"1Ó)j™÷x¹YñÝä×XkQ ÿ¬5×äâDfl“‘Ïé]¸¹N¹ø*щ=ºÛ‰B·Æ('µÑ­Itº­wÂ&U•etw¯ÛD „¯çnÎ$„€—ùª’„ŠûÎâZn+K”„'J®Y¢kM”xS«DÑS˜]¾Þ¶*ZW’Z§ºµâl¶@C„B¸=Â{Žx„ZÃj¯®H*sF/AO-å—ùÜNæä¼•R ì¾ÒYÎZªÌ»¤©ŽŸÇÞF¢æã¦ïèx‹Õe¡Óp±¾àÙ7íFH½æé¦òòºr,c—Ù‰BP-Vƒq:#êE`“{Ý`/&sÔƒRsïJYÊÈžmEÇÓy6f·g©Çë™ù˜@gnúDj”MÑš UMè4R+×Ý%·bLÄS:fZ‚1l±C(âI“‰ëõ×*Ö¤Z΂¬oƒÍº°ÖÕÕª®U°8«4£° ×½H'0™Ð|ñåã9*t‹gË ñY‚e´ rC6^Œ ÄÕwlªÖn=L}ì.œå–:kÎMõšc±ü0\¾­Ñ+ž~‰'^·Î™®vMï~F.žß¥Õ˨!`.Š ^-‘ p¥¬Ø˜ÜF‹P_VÁ§æ€x«á–zâžzn7ŠüÜwÀG _ÇÛ”‹+[ݲ·î¡²lÌ«æÚ²,öÜŠ+T'»Ê€‚Ì‚#2¾wž£™»ñE9*°Ñר-…Úí5ÿ˜]«õ—­.Ô`èxX%kM§ú9Û`V”ÃÝŒ…E>é§Uf&ô¸¶±&2kcdNÀX™ekÚͬY!ž(ì$Ýõe€v¿Y>å°àôȦ¾L¸'.¢Q„—WsÑ‘;Œh•#©G|ÈøztùNY<ì¿Þ9>$“z;ùæ›oˆ–j…oq…Ï-£ðQÖéÕBžxìÛ“æš{ë×¼Ê:¡‹üJsw’ºJôoª)¸N`¼N„×g›lÓ ÅëkAÕØµÇ}V·´·d ÅhäÉíãí®„SH¹ÐÓwÄ\oiµŽo‚æpò‰+Žäêd:åÓYƶ=jËœ—œ>y«ûšÈ”þ«N'â£yl½3L£ÌÔL¥Kü¯õ¦¹9G>µ4QŠK’«rf”ÅÍc‰PS5!=g Ÿà˜ŒñI^©°Eˆ®ÆXÀ@À^@Ýla¯À‹.“AmKköˆ¯^ÁMÝ@{^ðZc¯…Bz/ŒÈfŠ¢K-ˆ›‡•L¡Ú À½¨·”ªûFj¸6bøæ'€OF.©³ýj˜¡Ô¾‘yõ®‘RCåžipÚb{õd>ÕÏt¶ƒžšI¡Þ ÛÛ“$›¡§Hòw‹—/†EÅáët›~< Cã«?=v½{èð³b¥+pRœŒFéˆ/#Œ“‹¬ïÓª)÷ExÀ¢ôxä}H90òdÃø.–_#ë.Y“¦-ó<¢Ð-vfrÅkF‘ë{¯µuŒô¨?ä±,áÃŽÊñ˜<ù)öM6žŽnäU_Œ³–[Ì}@!3ørh…:2 +Dzé´vŽOþë#ŽÎ¥ùxÚ”(a1e§«ÊF;TÃPQMQ/Žjï~ Õ¢á`ss8ÀÉz *¼(—I]ÃÂçU ì¿]ï¹³SSEl]ßòJCÝ`7¾B[2Mg0&cá²#uýˆœyŒQ‘ÎSö%”Q´ZÒB[zÞ3‚x ×3ºÜpŸÖä…»þ„4Ǫ!ØvçèøáL0¾-gÁu$  —y_ |ࢌïàxk×-—®þÛp;‡ŒÍ‚ƒ:BÉÐ1mLã Èg:™}M¤ÏX…mgëàà#;áw³F³Š»¥èè×pn{Kf+Éy‘ó¶&¸Ð†££&20! ’vþDžx³‚ÍmZFFU{ä•»ëÜ+»{êõå†z=R¯'è“ÂC_þ® `&ˆ×®~íÑ«™¥s°+“;F.|?(ïý,€T¶NÿKÛ?_Ëff: 8xBp¦ßOä=ü ïL°#_çÄÄØ±~œ¸•éöNT[á½k¼÷ô»‚-e°`Å«B/€yîŸXT²j“Ô±ˆ]æøµ^Læù¢ÉÛWA‚¼§@•¬»ÄWâGi‘ôÙìWpÅm4QŸˆ•l÷¶zã£I3ûlÆ¢±ÝACñ››K¼AÓJ&”ïÛÀ¹÷Eè {‚ãJGU‘:ÀÎhÕ{ÊmfX£GÈD_pÐØ@ÈÁêÍŽ¬ì@´DÀC bÄ\ÿþVWg¸LñŠ<´)ŸçØ'‹)’ŠTzW#nÒóYvQÉdX•eá ûX`O—å‹NÏ.þ}Ž0t–c7ÈŽWE+/bšàEäo&ÑŸ£u/\>µÀûÁ Xq%ÇŠy|†Œ¤«ØóâGÀ•¾bœ©[»»‚t_oë·Sñzøúà$ˆ€ v;?Ÿ¨·Ó¾Å‘{´Å*ÓYXš‰¼—O¥ézćµœ›Ù­ð’@ùxüêç=»Ei°2À>ܼ]Y¸¾ fÿ¶¹ºwÊÕ»C.`ùVÛêæ:qºÄO/ÞòT-ëæèÞ:ljÑíõkvÒ½S®ÞísÁJÿ1ŸNí¬y[Ê'9â–NDŽÚõcÉ…K¡L?rÞzS¬Ûbçns…Ŷ[ç+ÉÌAv§_£(&«wVéï³<ŠºÙx1’èX+”ßÑ ²Øj¬ÊÅëË6§ôȘƒ¨l:“WóbRÌ ÜÞlt°Wiï^ît©$ÃX^"2"ßLЇJÁ*¾Â´•}¯ö=>¿lPVgRà5;î•Éð‹t*>Iñz^W)Wƒ‹T 2hŽÔ…qR)*šl´ö“÷Þ&Ž3sÌ2ìùó?húðüá. X­¢C§{hÅd½C{ªھϡ)F;Ölhš|æïéy©¡H€÷Þ¨}oè„gÉ>UM«:̬ e1bF¨Å¹,Ìñ¨Å6$nÞÝ‹©rOÌŠFÐTÝ/*ÒãN‹l'OŠt1Èõõ£? s<<›À /ˆmºE5lLÆ+hT“/ J2d²Œ^-LVÔ];Ž7 _Ç –U‚᱂ÓYvæé¸°BÓj#I ï¬z‚®Fsd\Q:Å€ŽˆðÓ• Ñ_°{ï '‡òF4á‡ûúÜÏsxpÚéî|wýüÙwãÑ|–¦øzºÕ*Æ£{+c žgOŸÂß§ëëOðï“§?¬Ñ÷µµ§OÖž­ý|²ÿ{Šéë߯ýðý¿Ek÷VƒŠg3lEÿöë,K/+Ú\ÌèÝà¨Òù vñQôËógl£?Ì´^$ÂÔçhz†7h3¯óÁä‰ä¼Àp7°yBÓ<ŽÀ”FIn¢Ó-Û‹Œj¯‡dÑO÷goò…<­È'£Ån ážÃF·i8ù%#ø)yI1çÅ{ÀÍt7‚ö•+Ì: ðï“Y>-ŽÎNNOöN{½.švÔq²í›¨÷Žß¼<Ý:yU‘a«ë T‘×;¨×>Û;ìôz{§VÖÅ”»ÓŒ•.ÓÅ º>ë£í0ŒÀ{QDÐF/ûíïóP`}×ùQô_б¸½Ã+É;— °Wô’{™_½¢¨’éMƒn£DÛ_x¿š(ݯàïº1T«WP#hËéÖY÷O_í½~Ñëìt#£x¹šÀ%} ³ @ÁÔÁ›t<†º@S'ŠíKÒ)¶XמÄêèÈjÊ顦ʋ÷7ÙüòT45 tÎ@D$‡K’ÊÃ4 }0³|Q,i»ÑnsàDË˄ä¤ýÖ |…‘oq–£.Ô™ƒÊ™d¸$3ÉKFrÊ¿›!–ñ®‹¸¯Žóo8J.Ø$‰tû¬Ù‡&¤TÄ€ q_þA§èx|ŒàÉÜr2»„Ù{&ësÆõÙŒÎó•CnÈ>Éüf íHN.Ú 1]à|ÚzI‡8%ù'¹s|p|Ú9zÉcà–dL.—ù€põ£2΢qûðì7#vŠÙFŒb rÉaþUåu„ëOIdÜ5Æ™W”i¢ƒýÁß2° L>$ÙHNúÖN %ðEph²>ÅVÓñizQTcš^’—K’Ã@0&ͦƒ¼@[: uˈH£rA ÏéÖËY2½lò ÓÎãY6Àþì´„Û“âi} V-B{÷y`ÑŽZŽn!9Ý9tþÄ”sU¥;8f›º|ô´2 úb( †Q¤×ñ+qÛ1¦ìåQÆùœÂü{üz4'h·aíÞ¿ÁïD5i€‹~C7ZËG-Tksìøhu–<ÐÇ40Ū^/°—ë" à @{š¢MNÍ*ÌØ­Cm\‰ªöbíZ%b©5QÈZ8H@F†Mð.ê=öG>$û¸ö¯ÜcØæ?& ·0`ö’ „Ù]¸˜#䪕W(jåfØÕe­ )ôä"¨l~ESU”Ñç¦ÂØb¹L¥í}/²¥k’´J%éFô;¶Ò;l­!¦“;Àð¡­· !Ø}sf…€d4÷¶z÷!hÕ8 À×R–MÛê5¶ö9óY»c4£­ÔP %C^<éD*×6½î§Sú E"üŽ´#¥…o8¤˜mA<Ä+°Vê§(:Bû^ŽëeEÚåâ·ÄQ@k˜ÎÇÓy—+ï eVºš«C”[¶[™ê*Š\1kjgG#Ò`j7›AáÑlà¢Oõ0ðÚ}k òž\ûílðîYIU]îm:a¥˜ÇÖÙ¢8÷Þomoïüí£sh„¥âMªr(Zrí¤Góî·Åñ#“‘£]”ñóÏÑúÞÃn¥çF N˜üvü€;5šj_nò™j—“Pxk’ 5¯7áé´mªþ‰²ÍMÒ¹û/3©h—’î<}$;ˆžìú!:Gd–b6‰Zod¦5_6 +ÇÉõÂX>¦þáÑúQœ¢[ÈØêAò˜ »0ÕóÈ[ݪ)IíÈ XuÚ§)9H±êz®°#Å;-¹šô.óB¨+t*½Ž<ÄMV“´@r`ä.ïÿ·",¹ªã,»¸œ—6QBOò!)ͤšÇTuàIŠ\Gq¤XªJÝ?)¥«%CmQbš´WxybÑ#ÐÁ7F1Ò/5i<9·ÆëfùrKo‚¨g¶x7}¡Õ „¶‘Ã'Õ÷U—}P:r‹iŸ\§–Å’zªjZ).t“"Ë«—.oàOÝ’S¿%ÁÕfQ©6U âC¢îÓ-« x¥ÊïçÉ(-únløøtKJ{ÀdÆ«â€^ÞßÂþóÅpX!"Ÿn¹Ü×'4—Ðh¹TiÃhåxPòʺÑ6ÿuá!BÄú“-1l©ß£°ÁsðàÜÊT åe•Kl—-ä ¤Î‡rMÆmýj‡|•áxa¤ù#×¾«F‘‰÷PŽÁÿ¶ÿdƒ®lM.æ—\p‹ø³«—8%¸—)ìp/bR8`¿·)Ho¤Crü6^p´¤\·È*4ÄKÚfvÜÐêõ¹ ¤JÛŽÞZD'ÈÛ¢ÃY>ncTˆ¼ý mÒi{ý³ÑÏ#ÝE©ÆÓ Ï¿¤ ÌÂîÖüµ†Á4ï@$­íÈ#8b€Î)ÅßÚjèï“*‰=äÓ’ßöãx†^å‹èíÙ;t#ßì©Çè3º‚#døÞ÷G×3¼ó?OÛ¸3ú¬Ö??!n4 t“¡vµ‹€ÿ¼%kk‡””›ém;s†nrÛÉgMà:™ä„¯Ë½5¾^¿äÀ¾æû@2y?Æ[3§Ikÿt v‘À±Æ".A0Eµ¤œýpïðìtï%nPÛtKAìÙ+äC<‡\Œá¥ôýêâèES)©›j/È(åt;™X.Žc[åˆò»ý…xݹRAÒR±YªÓ6Y‰†aÅÓp>„ÿÈ~‰ìz‡k|» ¿UDÇrö¦¼3+­âXqu•‘2zãéGüÛ6ˆX\×FJ7[âgD¥öÝu@ÌY$+ѦŠà,¢ ÛÁ&~6ÆEЧ·‰Ît Œ“Ù©ÓÉäòo£Ì4Šö²žªè6]´–³'¥ùŸñ„·6gÂIPxR1€šU¸Úu©Só.ùw†K+ªÕxéO¡ÄJóØ-Bó*¬áNª>]º­ª>„˜ÂRv µÿFsä§zÍ©æ>† êŒùw¬´ä Áúiþ GC“½ó Æ=,Ö5%„~'a_hù†Â݉Gä/Êö9â ÂUÀ¿hGÏ•y)üþ)z²œÓ¯ºìÜ¡t­N¾%¼¹Ôüµeš‡Z¨BMQjÄ{ÿÚQ5]ÊöUþøä‡·qî$á<ôˆ8QòÙiI@ÂÁÌUÎC¿ˆóeœòÊüð–Kóm×®·Þ‰¬!a†ÛöTU3õsiFÜûáûö³n›Í=üCøœ§ƒ-*—2Cþ=vEÒtèùï¶3Á°z94ù0ÿ*aÍ'±  2hMÒ+ܘÒ+²º·âxdüáxÚ¦÷ü§iºàôv|$²šYšBŽûlåÔcàg‚§uy º¬3<Ö šÒ_ÝÛwÌ€Ký1(¯ìµ('VOI·öº0àuý!Û '”é¤;Y>7#Îe06§VZåâÖBQ=…?Xmù±ÎÉ¥‚Eå±ü%«EèVKá$ÐbU®5œÝ6XÔ&:Ħ—Àª°z¤pмóZÍ-‚ ž‘ê_~ùE«~õ<¹ ShË®ÎBöÓªýº< Õ×sb40E,dÞ%¶ïÒR®×>]ØËÓç>UØóÊ=ÑE¶k©&PkÂÖ${'ýÝs­½ÓxVdû|&€(±²yì(š.fÓ¼Hs-W_qúüÎ ÓÄ W@ów`­öê*N«7&ýd…eC@.³?¹aó:fu<½œ~¹µ>ÄˆÞØŽê÷h˜˜hÌØ¶;DõG ^uE[¿ºQIÿ?ë3^:A€Bæ×Ù¤Ð/y®Hl+Ôá‰Éx›¢Þjñ²Ê'¤¥r]  Í(”ÂÞ?—ÑøØµ‘ƒY'cúX¥©3wl 1E)Û6]•ÑýP¿ÁzÊ!ï$pôBŽX­§nI¬¶ëiKÕÖ‡À< ŠÔ• -U¹Ê’µEjëC­š–YÊŽ"ª{{U‡3Ù«+ž•‘¯5ÝÅ<ÌFÂÓ@œén"ªžîÿÍöYZ@ßnņ´Û¶(’)’rô­Ä¥F(új¥I‹ìc´AðØrS‡íŸ>oQÝca„g”ò‹.ç¥[±&!ÞKW–ø6¬R¼2yïJ@Hj躀mÍfÉôë ¶ŸhÑHk7Ô€ÓÏA‚ÿ¢ù¢amgóI­ ;ã ðssg$5K×§I²“ú]»["><2à5Y‰» hP°"ù9¦'+/ äjÚ#|‚„Ò%¢ÍÍi!`‡1¾‚4[ú³¨Aã‘WŒÂH$„Ä€SZ[ûes©Ó-ç‰Lx•_‘'yÛ+s®›(µ'âV“!¡JõÏÒæD ­"—˜Ó­›d©="Š«g_F)°$i¨ô"&$€¶õË,tûT²\Õ‚`»Å\ƒyËæ5»KA¶åúíS»)rÅ!wVÀ¿©·6ì<°´@ç3r þí+R§}ËË“fäsÉ«/ø´¹êfX=ЀfE@ßâ]Ÿøíƒ¤0,ÜžzdBƯeÎÏx¯&iÍ’Q–NæAÚu4ú~Þ’Ðxx85¨¸ßH[‘eÏ•&ÅMtìÉCÒû'ÈëÊ$½_‡¢÷ýƒç!iyÄW‹¦}e—I:Px™¦}è¼$í´Hq5QÓÂX›ª÷oCÕþÂoE×¼†Üв9ËKÛ>ºþ¶˜+ÚÞÂm²¸¢*3köÝω}ÛÄ®¨ýùûÃÿVj÷•î!w˜ŸÞ}6Á/câû·aâ·#÷àšz;j7.Þ†âõ¥CóñÙ÷®r”U)FA‘aŠ&@§äEEëÐXÔÆÓ„·$V4™8ß)ÎSy²ñÎ4ÚE;o¥fI4Ë0ÃRë Ä-Dû:ͯ†½ö¬VópàÜŒó^}°ïœµ¦æ]³oìëltqî è-Mœ@_´—á~\\ÐMš‰t¯j¸ò’"±¼enž¹È4µ¯²­ÕfÌÕK<¬~]Ý o’äR£Ôðy}Á#J,·Ó¾†3†põÿÌ?~¼5œ.Ùÿ­ýÒÿÏdµŒ …ësØý˧ÍŽJ„ì°pHÕ-ñó€ýÀ¦Î¸¿cXZÛ½lwJ¨[¥F”ÜcrûÈ|IÄw¡#2¢ «Âèrb˘ NéHØß™è¥Åé»#=>że”Krè?”ŌߴýÁþ»ýÕ|}î÷1ü?îmíîµàõžË¨öÿ´¶¾±þÔðÿpëO¾ßXûêÿéxv.“ɺˆÏ]Ÿvx‡j¥]ù¬¬¬·hÕž Šh7+(€3Ÿ»w&ƒô:E‰äïä=l+_ÿ¢»9P„tÂKÒ±Ü#jÏ”xN‡A“ æõÉ(K @’Œn „ sYq4EþÔZÙà¡[a«5ĺ±ˆ Jƒ ?£îVå c@:ãóÑ VIÒ8§pÉÑáîKŒ`ƒ< ¹§‰ò_ògsÁ9±=9žhdèCÄ…Í©1Ñ(§Kj Mn„kÄÖÊÊQzý9ÏÆÂÃM!C°ÃÄ”Í\2.z|V*Çw”ò{ª‰T|Ô™ÓÐ’ÃTrU?<èîíE8˜NÝ.Çú^ûq‡î¿{.üo| þã0E¯RßÝsÈäøþûÿÇGñÿï×~þ«Àú¿Eßßs=¼Ïÿrþïøõ×ÅxZÜ“È%ëÿð?Çÿã³'_×ÿ?â‰Éù£mÜPк ûEZ€GÃv6}H£_ˆÖdؼÀúdû™cy“Œð0ÿ´óòU/Šûhý/ù!ÚÆÝÒArž“Kº,õøv¤J¬X÷\YGdûuÔ©{¸±Ú+ÎÙÞÏ[ÒO_¯²Îg­ž£+üaÆî«×ûû{¦o? Ndå8ÜÙãÅ Ú!GŽnt5ÒÝíœýõõáIw“ÂÁSÉ““À^öåd}ƒ•qÎßñ-a}êO8‚)'„‡ž=ürX\´()^•¸Ú(Ò)`¥jmžÊ_çøë{ñëĶþån:JnÒÁÖ¬©.ߊB³ñø9]ù×úÆóè§6¼Ë}pýÁGYtY…KH2ÚL~R°u©ážÚú¾NÇhwUéHh*]_ÖF¨&úš«+DV„Óf:"T.çãÑP°·U"…ßxÑM~-g2rý<ÆiÑ”þx ¢Õü㈭±ØZXã×(ŸÑ_~›ió%.œ‹ârýõð$ÆÐ(l—ûBeÆo+2äÝ_wv>2 ²å1†”Q ÚSI´¹ùÉÔáιö¶>‚Ä?+gį C8ížàN€£ùž¼1lÓát¿õö0†Ž„À_o¬_”ºNŒþÖMz}ÐÛíüüQÝÄsd>A¨u/غ‚£pJu£»×«¶¾¤Ïe×uZ'¯»¯(?åÅŸoìŸÛô3LI'Ç'œüâGÂA–ƒt—‚,G² FZ±¬Œ?U ñ¥K…ÿ ‘ad€ì.©Mgy“8LPÌ™ëÅJ˜^-N6éf¿¥ÁUF¤«uFË•׉µR¢Xfü‰b 1¤˜YBÏH>ɕހžh8ÀuCà÷õ†]”޼»*¾¬®¨v'× d}¿ÆüzA¾œ‹i2y¡{A)vL¤gB)PµPKÂ2‘¨g1È‚£‹OÎÇÉ´)Má%pf§ˆ:iT<ðMúÃ` Á£oB”@¬˜NEH¦Àê³,%–Ìâ2ŸÍfraØùpXP0)“ö£Çˆnå{B¡+p£ aLH(YUhWh5>]2WpïúmÕo£}ßÐôê¬.è3%º}“ÏÏNQjo±Ù}̃ëˆ[ =}‘\Eg>rFȤñiU ¼×S¦B‹„2ª!€™ùY£p¸t L3 —ÊX5Ç)v°dg€pŠF$nÖü:žÆÓr>¤±I ©gŒQ?G,ñ™šc‰ˆªß§´¶hW¡þÌH%~+†ÞÙgY¥c ¯ººÿGCÿcƳ¹Wàô?<ûþ«þïxBãNÒtz™ÒÖ^¾¤Œeú¿~xâèÿ~øáÙúWýßñ+`3Ñ>3 7™'蜗yR6MPn›pè <š-F¬ÈÀG#Ë­(vÔlÁªÑ/©Í.ÈBâQùbÖgGsqð'ιtåÍçz­øî æ{™N”°ËÓ8Ž~±˜OsªÄ ]ÅFÃ=ôWˆÚEŠµÂæ;¶2.ÒŸV„ÕÁ“‹kÖãÑ*ÊÙÙxŠ‚—yt6H‡†"WîëiQ1ÌThÊ „éK”š®VÓVk éB†ªM)“Ž•'{{'¯Žö´ùR³=N­„4?nst4r)à=+¨1|ÆáÉñio먷YŽ*~®qaT¯’ˆ³A*½4ÒÕÑ#œU\÷²¢‹•'ä•Wº–BáŠ*c\ŸáU‹´0™>¹ ™`ôOg9ôÎ;{”û@¿“Á(5· e rM8ú¸ÜR¨z˜@æ^˨@9Ce¥Ñ_3yxn;Ο?1yˆN—…¿,tMeõ¦7Ö.˯´Usï¶£Oã"ÛŠ„tqýôþùów1D¯kˆd;¹DVÆÿ5£·QÖßÝ=`-ÕëíƒÆ² æ|;Üêj¡ `¯Ã¥Š°îÞ¢…Ü-®ºÅÓ@¶„ƒI´Ï@>ŸU´ 5Ž3¼'¬?jÛ†Îø<Á»÷¨ï-5Û#TÂÇ Š5”†>Pxi>AE±øF­¾€® Ú¢I3ú¦áQ±8Ecþå”ùqt,ÍNF¬Ð¨t1ÿó’úΜFOmï6ðƒçeš˜>/'Õ+,ÀdÞ&ïŽÖ×¶±T.Jîä¡Îô-Í^lq½¬“|¢zœôLxcQè´Ô€çG™è€9HšóÑQ• (â‘"+ü!È ¨ê›2U‰Å(D²¢Ë§£Òíð*š+ßµ®¤éŸ'¸¸½6zPª¿h”¡§K¹D­Ùðæèr@$–Ð%Àùy_õXÊã3tE¥zê,$Dš2$±½29Us¸ý/ǧbéÈNúÑ Õ<Õp¤3ïô£h½O2J…ˆå›Tа¬Mù+ô?AÔ>Χó/5«Öÿ¬?}ò½kÿõó'O¾êþˆ˜sw;ò ¹0‰þš_N¢Ót:½yXD‡ù9F=O³Q:ÛÆ].aˆÏ¶É× «2ùú;Xôñd²—ö/'9z›J ‘ïØ°tƳLDÍ‘ÒA–õCiÔÙz‚ÅoRÖ½¤h>m ÝÐ9ÇC¥$ƒ<%ëëhŒ¶çF„οåwu!4™ÜÃtºÔ¹BñhqGq…c ÖM-ŠE‚!'ï“‹´ÁÆÚ)Ú†Ó&u4tù9ù€×A×|L·ˆð*àPv´”(Tm¨ÐÉ5ÏS>I(ªp$ ¤ÞŸ…æÝ41í8¹¹nJj¬9Ʃ侠w:\`°-óÊÑc©¨jAU–ºˆŸ,1P6öá‚E!´ºÊ'/N=~Añ¼¤®Ë[1ª ®(Q:i¥Š”Ucô9SÑ‹QôÙª8¬Ï€ôôm85¼ràþݼ(™û'‹ª/s›Žžw`í<'Å—§E ÎnNT¦)ØZ††²}ÊÔPåbÜ “äùaÜÏ'0×Þò©å*EÁŠVÙíÈ<ïÎI³)3®nbdGèwz5×t 6yOͱïã–ã!'¿Êµ½$’5ñš.9­}ð÷¦Ôý¤YAÃBÝCz1¶Æc0:Ûj”Làw?uvŠ%`N"&¹-}Ú bÑf —Hå»8q]Ð F¶ÁåÈÖ~lz¬ŠÜ@¸¸SM5¸òÂîG×ú@·H+D¬59ÜBÿ5~lbÔ®QUWÍnÓOFYÜeQ$zŠJÝE%£Ó¨AÔ5‘ùªû”¡ê÷l&î*}i§ò©ºJ6HFQ¬5T?K; bôÚ P_áG» ªLôGº`/Óè>¯ì³BC7¦ì>J¯§u׋U©äg-8‹R){SqÂ#€.œ¶Ø2^t ™§‰QÓÕSUTœŠâÄ7Ì/S\¬›xxr`[ɾP%©ÁI &ò7•Èß|òíJäÛ_€œìXÃØuòÝÑWôŒN¾;úоÑÉwC¿ÝéŸÀÎmŽän—¢R‘Ž $~ •‰ib=toîÿKóM$rùQþäÞæœ4Q/FóÝLNx9×E"Mw €sÞ.×À_Îåézƒþ]×¥<ù¨ë¬€p5P°åBÖ=¥°}ô‚úQrJƒPt2 ÓP•<-©K¬W~¼ëEKk†u˜R°ùBÿÈFª‹ì¯wŽ•-Ÿø]’6ü‰›¡,e9,›zl¤¾ëÀw—À÷ø^5¼S%µq*SYÓ€]D^©„îÚÐKp÷lèÊVšÖöüs ô^YsÛ _~¨Ê±wôóÇa:ù`ŸF:Z2€•¬ÏõœÎµ1¿êì,@|J$Š3a•€‚tIX§c{–ïÛï Ý ÛÅ}²-ª“ËÒHGk6¢4‹Í ™|›ïú37ë(b(7œýcEC¸\·ô:›£fž÷óUnÂßUÜôÊxÒÂŒ9†êRp¥Ä~FZh»O÷z¸¹IâôÏ{J׬ÆVµ³lnò4w~,o?Àg62´gšä“Çd|E–d³œ‚Â]Q+ô¨Ç–ªφÌêÕFá…=ñì¦Ô‡ô1Ô‰”X§I³ðÀȽE¦½üP_\,tNö“ÏMÎî÷á«àÎ|}™Ösm'%&*>z÷æ1©|m ÂÎòñ vð} > h§+7õoßñŽ~­Í·¶Ç`UŽ·LƉ‰N»a")N6HKuó;Ö Ý²ÐŒ6Ö&í¨ž™t{â_àH¿èÞ˜Ô¥¥iIaÊ5‚Ä­É?ŒÔ*­Ç~kï—Nïãt–+ˆ] akƒ@¥Mä?ZåP|õðע߯(‰Iý„ Ÿhȃ\z]jžé¤1¸1Ôã[¼Z,{Æ-^pÔ?‰”:;¶}R›NâLÏçC©–©TO¥”_e|z]ÂJôÕoUø©8ÿÓŸÇôñqzý%‡€K쿟>ÛxjŸÿm¬ýðôëùßòÄt¢WêбÞZ½c=¼ÛÇf¤x€8ÓIaúüA_Fޝ)vQd“D/áÆäŒ–Îö~A{gH]±Ïn¬³'2¿² †´½­C\ ïd5mœôì¿ÄC¥c`¤ÇgxVuƇU+ÑɃL¿>£\%0 y¯Ûê¶N¥Ñ‘°vè&ÅÍ`Í6NA‰Zè™zõ3¾¢î2- t@8&“]¨d«?¼h` «ôñ Ni»ÐÓ‘´ì‹º>~},æãM¬A¯oXF]Oùm¨Þú}xm¨S±=$ Àܤ+gÉd“€@¶e¸}V}%,0t:1ôëqê'qááUx Qô cTÈzCid5ÆIÈMä¯LmƒëT¢?Ÿk,¯ÿÚÈôVJø+Ë<€übHrwY=‚xqÁ0¢ˆ/ÆSަK=’4~,I²Û:ÐÑ_Žy?¨ìåÁcícG“øˆPù9¡ÃÏ­YšPìÖ­Åçù+2ž%²xNP÷edÍ2?ö"‡öîí¾ÞÙ;ý¨ú™\S Ú§§nì’kY™p, =ƒE5Y³(øQûG,¢M¥¥dg–¡¤¦a1ŸÆÅoMzéˆ44òÎ¥uü¨j2[¯µº÷²>„ daE³¤­â74»ƒ´„v ñCoý¶Êp¼#ÀêÉÛ±±ªŽvØ0bË8'qŒëµ*kú(-’þ#Ê’±µ6ÕÆhETû±ÿ™q_Pbaš¨.¼R*« ý ê E®ÈÌ—O}¹t6Öa eqÔßxä$´[¢·møÃY 홾çÀ?_“ð= ¯3Ð^9—nÆ(M>¤Nƒa{ïi0lå龈Ýj·³pO|¶sxòËΫ—±Tzš†xó}ÖÆ E¡Õ™aŽ M)E‘ýñôºyñ7mŠøWü†›äŠ[æV8¶¦Slx¨h„í¤qïlx½øÜ´iaëuwϤ‚dQ¸Ýw¸¿w´c‡é¤ïB¸P#T×…* ¨ež÷‡îU*äá,«B×—•±Dþ_{òtõÿ{ºñì«üÿG<–¼-=¢-´¥AÑgæã馒h?žóµ˜M}w¤ ZVI½åMù¬–qå£mŽ¥%›¤ 7œV@~Ýù/{êÌÿ/u¹Äþwýé“òüúõþ÷ò`ØãÞÆ5ÁÕYÆ7á;ù}4¥+ÕÑAº ;C¢W°‡zXÀ^ê8à L²A*¢ØŒä]ì<жúý|6 ƒXÞø›ž£‹E6àLh±E±ѨÅôQzÝ$_’(ü¡Ï`´ìfÓt”MÐJkM QBf¼-ÆB挈e–þs‘¡ýð“h!úªÎ„Ï#äDãüƒ.VeXGÜœ+ŠD¾nNø‹h”£¯ã|Ù¡`·@îÁè ð? þ¶C7á±WhŒæÅc€NІ{hÁ›/..ß™=ÕMñl v“QözŠ,“Yÿ2›§Ä…‹&ѱÀ ÿ4KùÖu1esYt6ŽÎ&ƒìC6X$ n°˜9ÆÆÚý3Ô[§ì(Uº˜¿‰?†ùb2`»ãq>KÍÒA’LhHýS"EE)d…è^¸rŸM·0ß§éTÚH; ‚ºD‡7@°ËdZd×Õ³áÉ~4Oñf¾rîtMvHhÚ-<}”ΆÐ^¼ŠèmŠ7Ö©V€ö†j‹Ä6IÓA:h½SCªœ“£Ù85œÒ1ÖÙ§ôþ tžöQŠÄM Ððdž #>HСrì(ìvj¶½x“DÒÙœÑù¢Àr ª²¨šˆ5ÔÏ“QZôi˜Â3š'8ºr.þ>bªD#¢C´¨ÈG Ž/Ç=œSŸCCsj,xQª!,±CmB×’]$zFNÝ|1àÌe¨Yt•Í/i*ÁfKÐ…§tî9Ì.t1^ô/•[âBûélœáõ„Œ¹P‡yկɇä?.úýÖÅdÑÊgÀ^îDˆ†úåòNNNA4í/Š‚ü¾cyty€È a8®û—-9-Š|œòõ€>§fóMíoÂ~ðÛ ªîf´7Æ¡ÛNgð-Vhžo¦øñ?úEk1O¯“¢»šwœ‰ÿ½œÃ~ø»ï@˜#”ªZH°£|Cií»)’Õbüô»q2)^|·ñôû§?l¬=iMCU7M£ËdŠÛ±Zë­hu_ܦ8y “q6ºaËÿ¢Èñ–îÌ€&83It|æS¤³,e¿¥œ‚±Þ ÏÐ7-qvŠ E{±9N#cLó©é*w9Æâ.à AÕs¼HAăþDåãQ]ÿ8á6GOEíTµ›LRÀe9!½î§$ƒnr½ŒÚPef©˜ûÑU𼇠ªÕb.¡x Õ/€E›ÙÁý›¢A+ÄÚ¤:iý¬GÁ¥"Nô+n˜ç r0“EF’D߯­E‡¯~Sít:4{/R9-6žDý›þˆïÅÐÃpÜ~ŒÄþZ}%%§”uý/´°­xÍŒ¯.³þ%FÐÁãrœ§Y‹Îë¦Ð]Ùu£¥BerTìO dh;­XŒ`V`\XØE\ƒ|J%ÃGxO_ç„]¯?Tq$rKô9M=YÌéN /} q ‡Ò) á’F‘ ‰³˜Ló=Rc€‡ –ËB²µºñà¦P(Á¼Æå™´XW -ÌHw7ÔÞ˜IRÊÙdqýÝžú†•vçryvóÁ@\ÂàL‘BÕË‹+1AæxØJÇ(œè¸ËBLz^nªÎ,ǘh'æ0áÌÁS€$è¿x†HüÉ5}elàú÷ˆLtÕØN|Û)Íh˜Dˆ* 1&Q N¢<Â&*Öª¨,£UÝdž³>öÁb’™¬(k=dó‡´à":Z¶g‹éœ¢«R¶€1Ôp”ÙÇ;Z°l¢õ ­ÀÔéG¯¡·ÏAL ¡`1ƒÙ?‡Náx$ƒ0ìÉ{;y$ ›ªé^Òâ…bÁ¿«òˆ&0TET££­yX“³#V<œ±Pñ¬O– F°‘b ‚ÅbJW¯ß_aí©w7“þå,Ÿ¨»pŠ÷㓃 o‹%Ñ0½Â}9ˆ6Ðs«Ø¡«L0Ø©ÐD⇫“|ºÊRTŠª’*é‰fC>Aæý¤º~µÚê«€òêßnV€$ƒ~}®¸±E’ DüiS¼¬à'$Ø£ñ¹”¨@bB9 ;TD§ƒZ]Ì’1q”yR¼÷ø‹ûÓØÔM4l×îí /ö¥§0;Û¶û#Ÿùv¤êÐøµ"jMƒÊ- ÒS[uþ«´¡ÇHßN”}õgáó½Ùx£‡ë Éïš+¢4Q:ØÏ|™ ÑS´¿‚¢ä,Æš´¢‡•°ûð!‰Óãd:%ITìy% q9Îð>Fdy•ÏÞ Bä œB@8ýŒä5'ðG1´ôAGDA[“AMÎÄÈ]zh8_ð^ÌÙc€è¢˜}«["Ù/Ð ˜²TÛ1yðí4/í!í_ÂܺJf)#¢ø™öM$:Kxɵۉ¤f3[ÇVx×(b/­ÂÅF&®dCHü©ý ü·Çb7¶°Y‹‹ÍÍÜ`ss€›ÎEqI›OØ‹%yJ´³m\&,šáÒ…p 7·ql$ ˜,XqË]o ÍMGƒàˆ0„‘e|"´ìÌÕ­>™&ÍÒ[Sô˜Ûõã:ázª—r«¡Ëß¾SÁ¥ë]j‰Ÿòp`Úrpìyµ¢Œž¾t2M‹t1Èå};œêˆ‹À—o9—Ó$¿‚ š";kzí'd÷.gPhbUÏ,b>Ct¡ ÌeÿäÙÓ¦Ÿù¨™vrúyÅñ5.üÔÏt–E`ÑYCû·+}½Â'1Zs|mÂðèÔÿ&·ú_¦ö÷?ÿYÿá©«ÿ}Ÿ¾êÿ€GŸÿîŸþ×ÙéÞË^«î.7·B¶ÀŽáûG`<›†±ÞêÝŒ™æ3ŸÓ¤Éד™ÿ!OÅü߇½ïÉ,ÿò0`KæÿÆÆ“’ÿ—ž}ÿõ‡Ù;íuöºzÿ‡+ÀåÇŠ•§kg赦A1çÉy6Êæ7-TgÇëÍu Ó†\_s¡ÒõÆúš‚ù>ó½†ùKæ/kFY.P2ºJnØ+JC0zÛ­ab}ñ䪽ÿlJAhº¾&íP*2kxêŒYŽötž¿Ô)ãèØ¬T'N­è²Æ4ZL¤ê–B+=jÔ)\ãZV:_ûÁq„âé0YŒ* ÁkP²Q‘Šn~™#9I? šŽoKqÈ  ž´§&~ãF\ÒŒŒ7Jàf¿?MÓô½0ŸÜÒ±V[Û§[G;¯pnlG‰ãÛ—áçèÞû‰}ÙŠæD±dHA烨ªâ™*V ¥v4D•‡ŒU.3ʘ=âæ=Ôkh|9(}é‰/âÙ‹w¼ l4 M`º9üpU}8Ó7N#Ù)dOz8’Â,ÿ:$â9,0Ë&éˆù ¡ÔåÁbHìRyÂJ'„òX—NNQYž'ƒÇ(\>´ê@úñ<—ßd?‡ÂYQ,ÐÿÄ,Óf¡¡&³\“d[NG³Uðê¨k®…¬'˜-­ÌÁ*ãöM½ÚKkÃFÎ++_wøÿWÝÙ™µ€ÙvAá/¶¶÷övQ '­¹Êp÷^¿~ù ~íuw¶Nöº+°¸µïéY!'ðƒ¸ÿ}ƒÄxoE¨ãZšBˆ> ÇFW *>º™I9ç¡Ã> µñŽJÁ(ñ¤ÕT+H`E;ô~Ç1þØ_Ì‹^Þ>ÛÜ5ìÑÞ±Í HM7kM¢GÏûgló‰6‹búNŒ§HUžúѨÚÐâW§v)%;;Ѫå&2îµI  M ÂTö­±1nZÅI¬ÆŽMç6·Ó››vUVä–['»®ÝY©HÏîxƒúlpÉí~]Œ§oöQ3ò+üŠ}ÝÀ0Ðoé…ã€Z’|ÞÑW•uh:ÿ+àç2݃óì3Œí¤­ïm§š%bsË1ܼsAçÍA©h+ˆ˜øŠ&º´Ër\Z:YS‘u(²^pÖËeÕº¶ÎZŽ“x®8¿£3Ã纸˜ú|˜ªÑœ)8P=yýüÙn £­®~-"Fm)G|ûN¢¶slà½ØuŽÃEJF¼kdçT£lxq=ùÝ4£ß|ˆ®­_7Îô)[F ­¶ ÃÙ»•Ÿìt-ÜxÒiš¾}g"ǘfƒì+XU€3yÙšvr t ÖvZ-Pàn…ö.*+É#ìv~>X'õ ½q1‰hî `ði mnbâz3f=|} ²Ò[9«ÎÃõP‘¸U J.‡?6:€Çß!süúã)^º°£î•†S 43òÖjàAÐÀ‰b2ñ :Ý4ž2ó kØé|vúïcÇ(OaØx¹qc lÌ;» âÍ0µ€BuR#iø( 0Ò¢‰£ÛtÔ„ñNë"#}Hyb«t¢ X*¨]µ¼¥‘~çNë@fÍŽo›ÙÌa!%:'6¨îFøh—Š”)Ž8à'ÑŽ ßiþØÆò¤ŸB`ªTŠXiý"àˆ& ˜ôkÇ1"õTÑM4§Q›0½-PºÑ¡_9>•[}}ˆà£Hì‘$×Oä™IO |Ì€ZnŽœÂ? â]êVÇ „Þäæ ‰¥Àêt-Ðv_uö{ k?_Lêà¶eN³(ư´p9Ø¢½LwzûtË·?/iâÞƧ>³jLt)ÂS0ïwÄ™Œßš¨v­ékgÁ9‘ ¨¬bcÂVq7yµV]@EŸg²­Ãrû@ÇÑ´ÙVû…±šˆñÝëùx› †ÓoWÈéÄÁ'Í_Æä’ÜžKÀKVcƒÃ[CçáÿàßßÕÔ‚¤J€Ô`òÎî‰1 ¼bH@äP:¾¡†Õ+ކ9¨Ó ÂD ¨žåhd8Á 42øaˆŠah‘°ìÀ 9p>0ƒ_IÒó¬©zýQQ8Õ0Ô¡CÚÕ«öþôù‡T’kö)#@tÏÊÖá;«ÀªS‚ÕÀöºŒ.f£³Á\`Åwv"Ø€üã­ÝiR‘G$ª,Àã½Ë®™G§74ù8Ëu À'±dÒÓ¢xjöèÕîÖ«}‹•Ñ a!²óª"e©úÏ¢KÖÑù z袵ñQ4È£iŽÞ³d4º!_­É ›Ù$Aý‘ú¡Õz{üsI„pµšÒg^DÏJMzÇÂ8ž­,—É˦»ˆI)!DÇt€géEáHŸJPÆ4Ñ´Úua-8cNÛöJÒ‡ †ìÃ}>þƒÏ,}@ÍååkÇ€G=Ÿ"×ô‰ gè±Kfx`C›ÞJÈ4iè’¡ÁéenàðÑÖlªÁl/ ÆêÁ§HÙ\Ð(jÕDLg*bSªuCû–Ê¢¬ÒدVi¸o‡æþÞ©»dè+­nàÈÓ¬€Ã©gis¬m¸`uŒ ݜŀ¨‰™,ßfâñ a—Ò‹=y·­‰.Z6óŒ°Î梡"·(%S¤E)=ð–Ä %`õÕÁ%#73”±Î[‹¼’™–@uk@ù¥Jðò:÷K•à·Àî—ªÁKRCœ ¬Ø åñÑŠ ïÏ”ÞCÿz3S:ÔÌXnzŒ©¤ Æïÿ¡~ÑÔ©–aüh0ãAÆÎH®«¥˜XL̰ÊMêÛjÉ5ÆSS¤©ÎfÂ}E+¿wÍ_Ñ,KŒ‡5ªÞË:rÉßå9~´táߟ©•_ç.ÿ ZWW܉²l…ƒB€%ø€æjn®qH îr®Årç: ¶™ºn‰oX¤>ZV‹ü~`‘H(‚EEˆbÂG'îëÄ};ѰÎá/«ìI󾎲°´GQdxÏa¯˜÷…_µÕ…”-ÖLû¹ìÇÆ0ÃcQ+3ÈV¨#‡D7&ZIþ© ×F0q¶ƒµH85ÅÌ%ÓH´$+¸ß£‡OSô MA:×ð¿GoÏdiþŽvš­ #Ñì©5úd᡹-ÍÿÅ)vtJ.¦ CH R‰íÀ:&éHåqÍF…ëSå1ö³§Èýê2"÷Ý2÷ÍB‘_…JUÎŒ^À“ȯ®™þŸ{ªü?¤éô2¿‡`Ëü?k= –ësd¡sþP+§tv¡ó=¯—o;!…éþB¢x²^‚üÅw GDÒx6ZÏ—v:ß´îâ¡Ð „c8BÕÔǦQÌFÅ´¤Š3p&^ª*ß×®ÊßÓYcI¡%â8¦‘'÷dÇCað»Öˆ.a—4JÆ+ÆLzòí So"*1\ÀZ¹u¤iïlÔ8ËÓO×oUÅãé\l† £<·bü|:Ñ5Ã_FÁOkLÁ†â>E8g2³M…5½á´ÿpöä)$#¸o’ÒU°ÏþÅÎÖš˜Á‡ÏÅ‹"À‡ÀðáÈÍä† 3Ù"…á-0ѬPmdhËÆ†jÌúµ›D„9î¥Qq~ƒƒ­á‡í¬žàNX’ #ÊCη´÷¾_×½‡ÿl,íAV¸ã»Õ~”ÏH¯UzdÑÑëÕPoP4,ì#t# j çŒ£ü”‡¸ÒyF&¶‘ mfhW#ãI4 ²_ZÐíÇ<8êø=K_(C)A)½¬GR0 Y@OA³âI”jÁdN˜Ã í¯ˆU›µ%4ÊŠ"(a£šDUë6*FÊF Éø/Õ8us½z6iÓ\D²¡ù(î2"Æ*lÝá¶¢zꪦlíî,kƒ…xYï(̼Ð#û­…¿.ӱʨÍ<Å<©[Œ&ëõ§µK±}ý RúS¦ôõ§5,lãQw‹fÑ£'Èú’ RQhM¢°ŠÕ“hý¶åz¦ÕúšœV‘Óê¹9­–,8îs«¾êjŽ|:­îëíz“1\ø_îV¶5™¾¿ct-žßµ&ã¨Ë7|’7ÎX®ÝxvGDøÐ¡ÑÙ¯„èû/Ä3&,•i ,“‚m 4JĪ˒ÜG Uqi÷ /÷¯ú²”ìW¶TLª|XXÃÊ`O¾ Ytwù}ùÃÒ×ô§{¨©·²I—zégçX<‰Gã†c„OÃq;¶v«—T SÅ1TqR£Š_XÉ»ˆàÕÃòyåská½ò¹K®û¬ÁíóÜ_é·ÌqË»—zÞøÊ« Z·'>E“lô•ªõ%Í^ó)²ÔŒr³T:Õ@x×ê.ƒøtùðÿ¹ÍÔ«¶Dy›MÚ6ƒwÜÞÆðÖÛ’;o ¿l[øEÃHÜÑ»ãÆÐتí 9˜²{~;ûí ïiƒ&|‹|ÉMïœñ"8ôÊì>USkF¿Üm£s·¾¡GMÅ;nŸÅ£yÙÆRå\½ mÜyÈijöeõ0jòûjñ°Ÿ¥/­&£s>\E:úòM‚°Î¼=»ñ‹w¹>yØðüËЩ½syWÌž"jìž±¯ôþYC¢qDlœ“eî}ìâü;M¼(9b³ãûÝ4Þÿ¶Lâ½ãîL<÷»IÏdþêsç¬÷^—»e¼Ûÿ·î}o]å{ªí­Àÿà}oý>ùÒÝhÝZ}Y|ÝóÞ¢²wÅ\™^IQÂÂíŽvÑÍJÒß7£Ù“ |[ûNt7¾¯w¢kì6êmPK[‚ µ%Øxb´dc¹USþWmª¿1uˆvã{ò¬Za'â>(ñ C¢[lIð$ï«H·ÌWÓòE>J’4­“*ÄFr^ƒqK1ê~ŽD¾T¤«¹"|›^´¼ÿ=ÌKªNês/eŒ"Ô$ëÏO»”õZ[Ø[ìRo­ê4øcmm§Ë!Ÿ)¹þÌì¤:{àÚ*ÕeÏn±ë7T¹·Ò©Âj­2ê¹¥jãNêÖèÎ×è^”®Ñ]ÔZ_ z¾Tû}¡6úbóz~ozî¬püRkzna?·¤_¦c¼ã«>_ªi¼3«J·8 <·æå§$KÞ“’²¦aô-Ð -ê—,ïK‰úGj=…¾/nHë ¿È[Êï¨ó ˜îÿORªø?AzïU»¥è=W뎿*Ý%Û](òwiÁmsü•¸Ývú6çèH¿¸ºµAï³—jÞ_‘uÀê ýÔè¢ÎôÖ%“¾üêRE}õójí(a3©{œÛtHC`_½U,*ü?ð ô/uþðoËü?<}òýO]ÿëÏÖ¾úø#tkc¸€è)× WI%‹y>NæYŸü|Zn!w^¢þáIk­(0€9 'ýK¼m=H‹þ,ãÀ'„o^#]µÆƒÑ*;8ŽŽŽ{ÑÞn§çqÁ."VŠìb’ßé®}dÆôE@îvöºNÊ6$Ñ÷³í­n§k;°@{Ê…ƒƒfÄ<™ÌÏ1T`ë¨g§Ÿ¦ØÊÍètïeçøHð éÉA憂{-ùÂ_1}Ó½™¦Ê5ššÃûxt²HñÉ2Æö)2Žc ±×¨™×SNS±› EešJÐBwßuWµúðÊÉûËÒONƒiÝ^0I8( %+51ÚwÓc°ôûÝÄÐڛܛ­ýù,úIîRxbQzéVd)—C!6³‰é¾NÙ4šx8™ ûÙ8Î:DšØ!`tCI{ÿÉ­9ÚƒÙÅï—â÷Kñ{[ü?·ÄñsG OÄOñ÷Xü<¶jÃwEާ²F¨yƒüz[¼mÉoǧâåõÖ}u ß¶ô7ù†AMÄ€é×­Ý ¸­ÊØÝ}£Ê}£Ê}#Ë}£Ê}£Ê}£ÊUßäöF—ûF•±­ÊØVelË2¶UÛªŒmU†ú&ßñ¶.CM¯ûF¾í¨·SõÖ=P©êMvÖ鱬é©j&|S©ªów^½ÜÖ¯oô«88ÞùÛôòû§ºk§îZ©Gvê‘•ªÛ(Ú©§vꩺc§Zµ:¶²[9VÞØ?­Ô×vêk+õñ/6æ_4a¨ßoœßÖ¬Q1€;§è=šæÅ+G¬O¾*, {êíîɾèÉ·£=9¦°ÈŠ7€{£àÞ(¸7 î‚ÛVpÛ n[Á™mÖ…ÓO]ú©«Á?E]TKŠËl8×-y³«YÓw癹ÝS3æ›HœÞÏa ðDStûñÏÛêízë¾Ñé7Þ»ÛÆ÷m»€!­È"öaøÅ×®x…a>ѯòëÎñ¡ñz"ßOô«ñõÔø|*¿©œèWãë©ñYAë¹»¯y,–n¼žèbŒW9 ŸñzêtGf÷GÇè…ŽÑöŽÑøŽÙúŽÑæŽÙЎѼŽÙ¦ŽÑ(cå ´æ»jWÇhXÇlYÇhZÇÓ¶…Ù²WªSU…{]±ïÿ²u(ÞN@~”¯[úý—ÞéÖŽ„>9Ý;\—}º·Óíɱƒ¹¥ ”xý¯ƒ_NdŽîžJD]Èp,ksz´Û9R);[RR@(5Ü]»‰éÄàTû»{G? Ð#óG·g$¨M‘ý¦¦Ýþ ǵÅ<{*ßž¯Y923Gç¹àEëÏÄ‹ÄÐa:{†çlGÇ¢§þJŒ~Ä‚o‹CвBˆÃÝÙ!™¥¬MŠçMާ¥P'¤Gt@M`fZ“|Noî|X¤svNmþž¥°U˜˜_¸’ðôó¢—oº•ò‘ÍhšO‹M%÷‹*qœ!¬ÆéÑu¸{Ní)ª¿žîõÌ^a‘Wñµ=‡(›È3 ™ÑÚb^FL9fO6Êò2мn7bð-Ì0²ÏŒ_òMmÈízЫ6hÍò9X-P Æ;\Ó6éßfT#pÆ edI`éQ¼-&^q7ÅßpÎfDAµÊ½Œò"·3ï¿ß<ÏsÜý¶I“viEdl*¢/) mª7+¿Îò„à[y7†d®æý^w¼V½†<{s!ûÌ3¿»<-–q˜".X©ÝNMEVŽw¥gžþúÆûuÛûuW¼cˆ*õZÝÙÛDàüb·_¢!–Y–œ ”dæÌÊY%´êsZ'åGŠkàTR†/ð~–«óÞ)ƒ‹8>,è×p mÍÞý#("U¸990…çkÏ÷Õ‹À“ÿ`w]½lìï=ýþrC¿é÷“Žzý»ð•á-ØSoŠèåùèA*Âu¹Ÿ)–x9úšÅŒMþãoûjI"YbsX‹Õp°ÊF¼Ir¨4©ÌEÁÊ…Ù“%̪ƒsG µªâÌ£[b}í­(ñ8šuË{hçPTJ°q ÑÒåƒN‰õsGPç¡ñÞ5ÞO¶^w¥¶Jeì¿>Ýá¡•H;G3Ÿ¼êèŸ(ª'RÖÃH,¤ÅfdˆYÅ4ÒñM ÅP·ÌB0ËûMWGù>Ã.R2?°&F´$©'~„ÇV°ÚQÉ0ŽŽ‹–%A-ŒC-Àùxº‰ÚD–í°pò¤š £OPا¨M#þ]‡êˆFj?ø‚0ŒîQnÓ'ÐJÔ»Ô­’‚ž”Ì".ÚfMÐ\Ôuñ ¿Ž1!,˜G_x³õû-¸Drá1f»'Áý Äö@Ó j߬ãYGiò!õ÷14ÀècA ~,¤Ù¬'ö‡+‚–oBƒ4žÒ U°žpΫ;ç<¿[N ß{ÇêbÖ;Ö³Þ±ÂÀyh.ÖÞvñŸ¨Í[lC˜hBD×mIxT¯û—ÔO·Ú¦„&‡Ÿ»YcÛFñóß~@¸£P±­ õ;±…[óPà N¶¥Ûž*¾£®9SêªÔy-¨áÀÏ%CW$-EÝüÓŸ†2÷§ Ý9´t(›„G“o[Ê-iˆÕ™! ~>^Ú µ¼¯,  —¤eËÑ#TÍZÔÀ¶¨‰x.j΀a1Ÿ.ŸUÔ‚š×ªU`òFƒõÀ(£€,BiópÚÅF8mN›fÁ¤ßÂë´±VGÔè÷l4¨T£RU >WÆÃ>iµjÛB+EÄzÛðpò;¤Þ¶<„…‚–*s·mzoåBîcÛæÁž†ÔÚÆ™à˜+}Ëm}HXH.‡~Zõô³}\‘VT¤M bë/.X‘"_ÌáÇ`#²ÉûªôéeæM&;R#FÆ=ÓVÌzFh!—'rCç ¹®NÊv¥Z;òÛžÙ–ceÓµ’ñÙW㲯Æe_Ë¢¯Æe2õ«qÙW㲯Æe_Ë¢¯Æe_˾—E_˸J_ËäWã²Ð}5.ûj\Ƽö«q™úüÕ¸L|üj\fäúj\öÕ¸ì«qÙ=—µEšÊqÑ´L~ÎQJW ý¾™°³#È>L§ ,.“Ø2K§‘P,ÙöJ&*!8!']s#Å2U*ÎHtª~heÔOl2EÒ•ôÆH:·“¶e[/é4\ÍÄ+'ñ™xî$*´lc¤IÕ‰dn`¦âR.“ÙH§’`i4…,z¬Ö ¸¨zU˜èËò ðÄN}"“N½^[ղƱ»gT)ÿ`ÕçX•Åö-:D33ñÊI|c&ž;‰Ûfâp Rµ¸F‰dÅ¢Ò¤ø&’L”zDÐtE&‰Žùà!@Š´û0’„D©çvbÏL¼Ø°Y攉;ñÈLœffÚIÇHúÍLù»‰Ðl›P ‹¤ÂN2›=·“tõѸäõƒ]3iä¤X‰¥T̪ J¶¥D4á0r ¥%9k˾¹¸Ë «Lb͹mñ W­™m§wl€…“üÚLìÛÓvGOZ²/IRî£ÅÍÔâª>âævâ¡•X؉]+‘- Ÿ”¢#•hVåÀ¨Š000–.U2Z‰ gªÒ.M¾çÿ×TþŸHüýý?­ÿ°þÃFÉÿÓú³¯þŸþˆçÿ2ÿOäÇIûÊ&ý K¤Ü>á~`oÿ`ëe7òn¢$Ì~ Bº×«*.ó«—'6 ªÓ Ø/œedœ³*›\˜öo›agç–|}°¼ZwÉt¸wxÛÆôNn›Å7Ks½($þN°Å€ß³Èû‰X«w¡?p]}—>Z7Í(vÖ±¦4JU4wv,š§*†ŒŸ÷ÍÏûòsZšJr6;uc StN©²ËK”«© ñN$6V”Kˆ#¶ê“©¥›Î[ð[ÊB¬á %í쓬UɃ´:Yó2O¡z’{-Ò7Ò±@;ÔN¼výRôï}ùußüJ­Ã¯Ú ~©†a ÿ01™©ûn*7 “÷Í’¸IT–¸*ST{(‘™ªÿ¶hÕš©ò—×MU¿ü¸aªøåÇ'¦j_~|jªôåÇïMU¾üøÌTáË?¨Œ¶9ÏN˘»=±e»Æ-ŵEÍ ºÆù÷Ö&Ÿ7žž–»aÈ)åâ mŒåÚÿ뇯°ÿx +Ðw¿WhåñÃ÷ßì?èQö߯Ã÷õ§Ï6þ-úþ÷ªùü/·ÿ0Ç<šeEÿñ¼·ŠìâÞʨ¶ÿY[[ṵ́ÿÙ€ñÿÍ€¾Úÿü¶®aJ8{yðzOØØJ•ýh3Ú?8~óòtëäÕŠäïý|^¤ûl¿Õ-ðOÕböÿÝ­üúüÿÙ{óþ&’$axÿÅ¿÷CÞgž–h¡¶dh7E?¶,ƒf|µ-hfÆ«£d×´®®*c3†ùìoyWVIÃÌîPÝXReDdddäQô¶ÿÏ7ûSÏû¿µGksí¿ùø[ûÿÛÿÆ“ùýW /ác4K‚þe<âyšôuN‚(Ôƒ`w¥Óï²`8ƒóû ‰ Àë?“øïâÎPC‚Ûãq4e>é;‹• u »Šî[¶Ó‰˜n±™ìË^:ktºâ¢ÙÁ²ú<éÍ/¬ɆéLÓéq2#lj@ñðìøäè¸}Òí´O]jIô»„Ü;iÿò²}Øú³ èPŠr½ÓZàœ>OüKÒ¬w\t x,Ði=Y¥Ø“VÌFn/läe'QƘ¡ì›¹=ÊÞ¢5›fÉl\?²=˜• ÆVlUbÍ/zi”z±x£aýr ¬‡ ­ßÅÑÕYçdQ–ö°s¢Ñ¢¤?#ƒìr4[]YÞ¦D«œ°*±eöÅø ¸¡Û]Ư ¨/û{ŸºH{³dÒËPPâò‡´®@º­½ç¸FæRaõ=—Õg·ƒŽZ‡…Ö•̧GtÝc¯~œ ²¾&ÆnÔ¢¡™•·„ú{ [&©©µ­¡Ó_fÀ ˆßò%Â’ËÁ÷Ûñác³%&¡ùëò%Æ€Áº·›qšœ3æ£)*Zÿúêœ--Zn—c—®]Áßf…³¤›DQÅR¤\Áw ÍÞæ0ÛÃkúäeÑàûíØÍ~F×MðãT¾ü ÙÊ{ëÎIYÖ2 ÎÙõ€Páþ*àÜו镣Y¹Nñ2JQgNñòí`'éMÇ nK'.viAЬ’Æí»=¨¹ËŒÁÞ.ÇY<ÇQ6Ö]vT#~M¹ òëö´7~ŸÆijÄ-ôI#ô<¢*úÆåދлTiÝ<9‹ÖE/žâÔ t^|Áœ[ǨÁ­$¦Ëǽìâ$^õûerå~ñ¹èºÌŸÕ )·~ç˜]Ô–b&«ç§$5VÕLg4ŒÎWƒŠÄT)›Š1hJ2M€„ô#7Mmt”¨ŸðIYlŠL*Æ\¡pMxßCøWK"˜èÍ.³pÔI}ôgyŽý"䕽'dEÝe=¢ÆÉO–á ›p§²ŠÚêà‹þf…>õ ¢sÈóaw‹È æ‰èaÒäê0‡M¾Ji‹ g“B”¶ˆÀœ üæKQ Ou*ÒÅÃ) —iE,pÚBT "V«ªˆN¥ˆ÷EgÉ«%ú]õ4Þ4xóÖi±ASäT‹¦Q4Œ†«^ Îtk‹’Uî=­6\¡®P¬©+œÃ24«¬¾Yý+aýuõí_¦«ª“ûÉ9ŸUY‰•mÅ.>ÈœŠO ÐÊ}É.µèK–°„ˆä¨Ýu‹µ7±›ël‰Ñ RÏþ_šöJ–“»8X¸ÿ¿¹æìÿ=n>Zû¶ÿ÷5½ÿzº}vtÜítþ«}òíàßäYÜþ¿ôýÿfc3ßþ××¾µÿ¯òˆýÿÓm5J%´ÿ?œáŠ4ºžGIn/µ8b‡Ò~|¬N§d—ÿ8X¸½Š7F±o+„8b§sÝ^Œ7ƒjûp÷¬»½Ã>ŒÍ‘V–F§ïñ¬àyë¬ûçãöÙéŸazp𙇠ÇtlpzlŸ)Ð_“=|á.ÃŒ³Ú”’B…Ÿ¹³ãÌÁíÖåÖrÇ‚2¢‰sV<ÊqÒE+%/üMPì•=ºÎ„{4ñe$¿ ð iléÇçê3ˆ‡”»¼ó-Eñ€øÂ¶æ|ÀLÊpˆìe—Ê˃ÏfÐF°rŒ‚‘jµž·êç,}ÕëL/úõ°ñTPB5”N %S#©Tͺ˜Œ6:%„<) as93y²”Ü Ï–ügJîùNP|ª¤wÔ9”œ»—"É£3‰§g}tœúp:S<Чä6BfÇõ?ãHÈtG@wq¶S°»}Lu}\@ø¶ç8™ì±FíÝÑ™LÙqLáIŒÍ‚#KâÛyË·ó–O8o©8ÂðlÄËMøã\JÙÉJÉÁÊœ«àÔ2Ä¿e­.ÈKt¨@}N¹{9õtT4-ó€f$<Ç’s‘`q>½½îZÓŃÞܚѧKÈ÷,3ñ-/7W¤å•S t…ç]…š¶ð±:?¨ƒªã‚Ó®OÏ·(w§™¦Q’A»ºˆzÃ(ÇUÖ«Ïea6 Úv[m®¿]ȶ5Fíq<©Àïü80 œhïÍÈ(ËûüÕ!Ã>Ïú½1Ý):¼œô#œ CÃÌÑn+ÚC¢MLj$íW‡7Kü[.&êbÐGòNtcfsôüJ'-‹GPd.’ÖðùÝÿN?Õ^ ÛÏìwÿrÌVkKë¸ÿ|Åi˜ ˆz}0£Ù/ik@îÉ]Œ¦¥I8‰¹…SŒox™PnDú ¡=ð0gô‹Æ/_;‚WbÆ(¾ùû_zwÂFfcÓñŒWjú`Ï·Ý·:Ów°ìõgþô,&ì^­xî`›2•ÇÎó kÅÞ¶ÈËmcl,§HO¬":oŠë§ z–Ïûy }\†ü™ÏÇØÀ2wSò9н|‚P`da¯ª>Ïø@RøJö(m;Žð£ž¦= ôÍhà_Öh ¦ Óùš1åÚ5]qgX‹2Ha’=»¤‡ÑðˆÁ* ñbÎmHv ~ºq‡\³*ŒC@ê<â—>Hæ†õóü½áãª?>–Ð/0¼òÌ€þ©–W8ÿC^æòH¥]g£:Ìy r+âWš ÛIBG)ù+®4Ï9'µ¸*«o<}ÏmÈUlÆ%ˆ¦ÒÖk?ë„Þ:~I¿*yÇ…ˆAårm¾‚ XœÀB–*Ïü‹åŠ´2ÓÜm—ÓAïòü"Ó~n·‚rw®§‡½ äô×Õ€ìÔ@)z10ùÙ½9ÔÒ÷ií2M>ªr.¢Áo²œ,ƒ[ˆº˜A®„h:Ô… ãpõ¯˜“ö ïþZZÌÕxΡÁ»EhÐ^\¬ókÑgѰ õ„M.iØ)?>ò“<ý×Eã¹á³ÂZ½^G¹z,•ã&Ï[•7okPSê4è‹Ù|$Ð^}gƒ€ß¤—ƒA :Ó!QÞÚê§ ;'x‰L0xÞ ‡YP NVî¥ûHª Ë¢¥·+oÎÞÖà9Åýà’\2òÆSmú}Ã[‚3‹W‹5|µ"DMÌ©T–!æR[³¹¬ÐKvqê÷CP!^('£¹¢Nƒgapß8íE…µŠnØdÚçÀl®tVj¨ÉOäîˆü•›rJ,lR¾Üÿõ <<ÂþkMfÿJþ?6ßü|•Ǭÿ+X Íq°™Üm ìMÃþ¯õ¿±ÙØøfÿ÷5žçÉì÷aá0Of×ï»ýÓNpæ³m²Þg0(ß¿ëŒ8žòq@K¨s¬ôãép«‚»H³d‹Õ Òp콌¶êõÑ;€hï·àÉö@ÇQ4¿˜£%@eÿ½r?î/õ*N/{Ë{¾ŒXhC"]°s²ŒìºûË@Eç0]w2–€‚¹êp ¸8Y†Ø29nì>ÚXîa‘®Tÿ-]’™ýÿI{{÷ }÷y,èÿ››9ýÿúÆÚ·þÿ«<¿^ô²ïRœè¿ˆ’hå¡õ¬¬P<8ø¿¤ì"%è÷¿ášq¤|ºÔƒ “³éø½ŒÉ–š´WÒhqHm6ûåˆKAo “~òòÞo€Ècn dÛž÷Úü2[¡X̓ƥ4&}ÈçìÈ>5îZ°=†õ@-@ õy/ ‹“^Ô·ƒ1Œj³Q@ÃYºÒKí|:ƒÕVpEߢÒD×=,f-¸˜]‘ër¦Œ\ÁƒƽxÌ.‘àé †ÊéwÙ É2‚V\ñIÍÜhºŠ³ x¤3 2¸èMÏ£´¾²òçÙ%¬®p'dÖï!Ö%-Øc*o·Fp=<Ÿa &²ÊÞEãÙ_¾Ÿ]&²"jÁ aˆ‚ªŽFT(dùo áA£d>‰Ò„?æSÿ˜å¿²r8Ë@ @WNpó‹pá­{BÄ(Z²–±Œø \‚þPw@ôÊqìàæ¥œR •Æ&ãèž¡„”ë%ˆy듨7|ÏLE XP£ÓƒýÿˆvÆ)ªX£±V_«cÐøÒÜÄèÛ߯¼œBÆÙåä0~_#†”§#¨†žÚ£f¤ãøü"ƒ*Æ£äß$³4]A‘Qô£¡‹jŶX=²‹$Š ”Å8dõƒ ßÅC,WV€q‚.ý'cTfRŽƒ8KÞ¯4!ˆ·äá%í!¹‡O3Ïð¦BGø…EB-•j5S‘©ÍˆpޤU£x“ÿ&*yl®#Rk³äýV`1?L±&™;¡‡um°T)-²ƒÁĹ}£ÿ¨€$A&bÑy£RåøëçMø–B+ ‚܆—ƒÈjqu`¥\ÙPy u ä_*~”~° ;*XåP°éÃÞdH3U”L7Q12‘yrÿ=ÞxP¾ˆ‰]f=:Çm­vïoÿf5Ýe‹ÖÖ»ë¿ÇßÖ_ç©<(hŸòàU2œFÀ„:1–ÂÀÚÃv“ÍŽù¨bz‡ÃÒ”nP/âbó¬Lép O1È77;0d¶ÅV1{.†±­m1æÈ 6K•S›õ&MUÒóct½F+hÈ ŠžöÞɽØQ¿öƒ˜@ï œù<дÆdvŠ+F_:â³w]Ç™ ߯®ÐF-ï^J;%PÕªº{ô¦[?xUÁiS\ÃßÝúIû9ýžV«ú†’‚B5ø¹ß Vún{¯sئ’˜¯wZ­J·Þ:8&lÀk׬<­5ø‚Å(Ëòàåþ© "ñãªù «^®eÙN_îx)Pi,Ä?Çð~{§½Ïbl_Ïù'°Þ¼õ• áa`šçÓ„:iwž|¡ýÇ•mc³ÿÇ?ÑÖëN¢~ëgAÿÿh}sÝéÿ7×›ßúÿ¯òü+w>ìa¥/vFÉlš=Œ(TßUÊxyÂ3ZŽ,^£¹*-qÉ4pÊÊë“AÄ‹¶ˆ×F°tã…¬9ž†Á¢lz~Ù;î~PYáëÑ/ÓHÌ’aZ$Póê] ·‚ÖÑa÷ähÿ ýˆœ‘#D·ëi‡ ï7uOë§|§¾ª3i¿î¶OÑ z'±Z¿É£»ÙwOéýŠ+y§¿è2½ñžŠÕZq_ƒx¥Ò ÔzWë¿'?‡^~„Y¢#pã o‡ÜCcçºÑ/ÔØç4ºZ§>ãË?ð­7Ò:=?jtQï\€°µµÆE£ÑxFT&³8u#‰áÙ^‡^ž <öŒlW·×ƒ9Ѫ’`ïMë誋¿·<þž¿ÕZžÁ®RÓͩϊ¿ºòº¯ª¼O©¨U¢TÐÃÈ9)ô©gAΓ$Ï€ÞóZ͵yåÁìLî·4Uæd ˜½%`¸"\˜Õo§ ŸÜú_íàß] âlnlºû¿›ÍÇ›ßÖÿ_ã¹óÕÿŽ8Æ%Z<Šj¹oNßJ—÷HE-ñA/â,¢þ¯Žë/³ÂïâafZSÝ÷1° °ºú;ðí.?oĦù•Z7Ên À›i»ž œhhÃÛêöfÆõRÏêҙȥœ±®£É‹,•8ƒD.í?Çv˜ó8r§ÂÄÉéTÝà5V4—–Ìôò i.1ö0$¿¶aÕ“åÜÅùå`Þ–ëŠSííÊHõò«¦¯~ Ä•xÚ¡¿ŠPÅ.I¼zbÖw*—bwÞ*éHÅ\¨(¯Új‘Ôcu14…•#Hs:E;2ù-b^¹–Çê·ãÊÐÛJÜt>ÚËV °* ¶£Ï¯ñfÌì2­¯¶âèy>Æy>ê°‰nÉ iHPÜË‚ñöta"|ɰiÇÃø]L3{<\æ%É0x÷Ƚš0ˆ&BgG¸(Áãå!Èr¿pÓ¦e’;\¬>À’¸äU -x`‘{Ùë?î^äÎɾ·¸˜$\k©_T+îM'ñ¬]ndLzYCß•ºI¶x~V â-=? †âõÇà­¨dôê&ËUù‡©ZèWÎɱiäxçù,p¸fL+«9ÙÖWÿ*¯Ñ¤tf½Y¹Iè¼fø±&&·Góé÷NÞtêÛ'î‹›^Ø©¿ÈÿôEg¯{“bIN¶Ezçà ½¬7 ¯¬ñQ3Iv³†Ë¬†0Dã2-€PBâ­ÞeqsX¹ñˆIÞC#^1U¨#e£¤éŒ¶¨`@‚µeWQ4UÝ9„Ïz†ñ“´"Ù×@»çža,ÌÄþ:<ˆ Ji_F]{J&½ä½$"w9`ý –;h¦¥7ð'µÀ½®úÓîÑI›Eß­¡¨˜» 1b½;™Ñ^{ cjKÉ€V_!A›’ßÛ?ÚÞ½½ýݽŇTŽgóÕß^Ü=¡[y¢8ªòRëÒ ½Y5ÓÏ¥ÿ¾ºb5¶ Æ'H¿]µô<§ÞAÔôÙ»(Áa_®£g¼úø@™¢Aíó.è£ÐÂ=ReŒh¼£ª`ªf9ú@)ÒÛJºÌ„Θ ‚ÊkˆÎ‡òc“Gí™ VórÆ pNaÍì- ƒyʾ€|ŠÍ'>j  R뺲=C³ßƒ]¶ftø„è7s©™‘ºn§‚n•àBjVœ*»š«x:„© ÃxøƒžfçÄ› ƒÚ8V=ú­÷ôsûðÌTÌ“²˜ áôI+vŸ8«¢Ùì>VGh2· «ÜÓ¿…µµµˆ¹!‚gŠ$ÓÕÀÛ“՛ͷL¢ký@&ýÛ‡‡GÝmtÔ9¼ÃŒó7L bMõƒ„Æ™J€·|ù2°·â´Ý}Ñ)‡À©my.8×YÑ,† ¹ˆê·Õf ßMØÞgŸtʬQŸª¯М&ªh%ŒnZiýûÀ£Óè§:´_›Eƒ‘"ÀësêG‹0a`øÖEì½ë‘cb»·ê§³¨µpë¿ÎNÌv^±a¤}ú ªä:òrÿž‡A(à0%[ÈàÆ¡I¸Vƒ'„E:š‡Õ¼¿óˆnú½4 SÄÞ„0ãÀu×Ǫ’¡¯`êݪ‚Ñ8qÓ›Raè ë ßúùXîÒ,Hˆ+µ.® kêpÈE.i‘…À­Æg&‰èCIiB‡êg¹â`yŒ•áÅ¡ª\¾8Òù>Öl¥—=K®ã²û­Ð°^ ̾ ŸP÷{½Có£Ùf |´°ï)Éæ6ºu 'Ô‘há{‹›ø-2¥6ž/j®ïÝ®ï}bC^®%ïMÙÇ8é5° ýü ï™mrwϫƔ «pÍÕT'[£=A¾%ÙMçrÅGû”ÿìãº;Ìó_y¯ÿ®óXÿms­áÞÿižš×Ð8fœòšhÿ'åv†8ã•{ñ•–å µ]ï±õ•(„` &2,$£”RNF¿½ƒ‹xܤ#¥¥TdñMÒ»†EUÿ cÜÃ?Cü9À?Oàß𯱆ø§‰ÖñÏþÙ|K‚Áš|Óª9øèó’„”?†ürpý6øÜվŽÞv|B M½í¨mËß\O&À ümÐß&ý]§¿ôw“þ>¢¿éïúû#c­™+ø‚é4˜Pƒ)5˜Íl2šYgÄ`Ö°ƒG#½ä´÷.£!h*‰—çeü6Ww]¼{EÁ%tÅÅÓL¾®·Î0t4¤P¡L©~ähEº»,Žm0õ|žˆÔçÇ'A…€uêH¥îa*| l^‰Ù¼"q3Jµ¥±ÒÇâz;Æ,ý ÈáDg)øBš¤2î Lh/ÇÀÕaôûG-a~ n,mÂ;­¡pY€•\³R‰ú6úÚ %Ûìׂânã$ÊÑô¹‰9ÐADi6K¢]¹¬po05|ƒ'3 ß?ÚøX¸[^ц¬Ã4Ê/¤¿vŠ:TòFÅRƒ™1U(CCí¼bæGëèao{w7 øRüPïAqÍ'5«Ëk¢ZUªÕÛa5VUЬ+vAí‚Biõb´Î¨+÷Þ®T¨‚}—+k½Á¾X–¯ZžTS ‰)Y+÷¤;М` ³Põo¿Qó­mmïïÈZK_˜EŸGYJÓ[þr™FðG&+¾i»/esûÐ8Ógó?har äm`) ΌKQbáH ˜Šýt:ãªäôíŠÌ¾AUÉ(RE“åòã?Š£R# G $~¨t¯up,¿¶©ñPÝl¢úàþÝýÅKë¹Ì áWE†¥ jTÆ“·4¨8 ÿZ3µ°ð,]ûRÖISútáßÀè¦8ËÞÜ­W({CývZ-êìI*ŒýÔQ×f5W¹v©"I¹ëÏ5ŽŠ·I‘œ[¯º{Í=F ËìGÌ.¶ï6T'ÖÄ:’˜pªó)´ò¢îrRÓß_4L~ð·âÈ×Àý#V¥J°| °m¢*ñšÅZqÉ­¡qNæX'o«¼tÁy¤XÁèÍ+\Àè ð®\ebÚÿ¾Ó›ÏÌý_áÕî«ûÿ^Ûpý¿nl6Ûÿý<ÿ VVþ3IO •Ãö¯g­ƒ*½;=Ø?üãÙ«ö ^‚Àbd-ø^¼=訴g!:Ú\×Fk‹Ï’þӊ̓v`§Ãxä ø VîåΧîYÇS÷ÜÓ)ñb{ÿøÅ¶ñûôxû„Ò}ÇD´»4™ˆk~–MìÎìS$ì‡n/ÅåDWÁŠ­€ûæmJ}µŒ|èÙW±åÂñÞ"*¹Ëiu ˜¨ü³µôÛó¥žÜýï/à´¼ÿo¢¸ÜýïõoýÿWyô×m·O¹ãëÏÆ¬Œ²’w`°'çï{øÕ0T—q©a®-;›œât ÁôEhßÕ˜Àã^&Ïœ¼Ë£T ¦‹ ÓÆžQ ü픩+‰g¤´Š7­,“döúùû »´€tþ½'0Òï…:5Џ}ÑK/Lnñ÷’Ü^f×®ÖèüÍfßäÙÅ·ÃøÊeù“n°¯úF¸ù³¢«rÉì„ .Kˆ¯å7ØuŽò-{ƒÝäWÉëÊ vb~ÙìF#³Ogo{ƒ{-P ¼R*/Ê çÒ {¤ï‡öõ tQØñûº’Ðl ü’=Ü8Ÿaí‰g5Á9\ü. ZJ¯“¸8õÊÀº¹·Мòìø´ýr÷èŒ}^™^Æ\¢æ¤ÊjŽòj-÷§‹D»âg¨Vl›ttŒ‹êÆ]UL0.„óup$«g6™½‹ØÕ±Æ ª6ˆ†DŒn‘ñnf<%×\“Ò“+ä}U\·…º{€;Z“ä.@7Ï 9à¯s£Å2þ0KGFzo€S­O@iüŸF-x\ƒ~Ý¿ˆÀ8ž^^$@ËgápÓ,Q?2JÄ”Nãó <€Å_|hJç3Ѐ& Yo8Ä“™VÞgPT<:‡:ošëµ ¹ÿ6áß#ø÷ä­ºÏ&Û Ž¸Ôø‚ÊMÒÃC%< t/¶‹2¿éÔYÏø&7r2n"†ŒÎ—¿góŠQ…I¿ŠTC´Æ »Š¡oª“$¥0°x&wúnçÕ¾J5P.ËQ^zp~/Ïæ—À‡SžÏ/¾|ÆïÌ»ÈôbÕ è¦þþNÝzÍ,“ÅIû`?Ç$â”0‰89&§L€“â”ç“òf—^¬ÝT! Óåg§.¯Òá‹•‚[xâýü2½h<"¬ýÝí6Ëî³Ñ9gÏæAåGdtN³9 ,Àh<úÈ<8`7Dçx¾©ŠŽ+^obg6‚ó&ü8­@sAÇ£œ×ˆí‹!é¡Ù÷!Ê ÚªÈÈe3îä Ó÷ìhNÖï¸YO Ñå~MØŸxþþ.]i —Å'Á™Ô^nŸü™;†îÝþr %îÅÑ>> i=Ú°¥•ý›J«[.-“©[(×ïØIÉ@)V:™¸LÀeZ‘YƒÙ·Ž¥Èݣݣ- ÑáÇEá]aŒg³ß1€%³Ë)·!ç‹´6ÃqXN-•WÝî/g­ £âpü>P9X b§É¤ãÊ Sá¸áGiÈÁäèˆ=£ûÛ4#ák~ÂÎB_j]ðˆ»ûK‹å²¼ñþŒ®,Wwöåáʧ»;˪¥ZöIÿ†hpx ?¤ù€ÖW{lê2‡,ÏGàN«Kÿ_/ð_¾ŒÀv–ýÎí,ý}…<éÒRnæ®Ã-ôBÈyß!ÆÊÙðBo+é¢ýÝ4 öM–÷’+›çs|‡ø¸r–áÎ>‚x<¾Cxw{ß!ØÖ›ý8SKd4È'—è š&!PÓöòÉ×ñù%{GÍa\¦Ñ í¼žòµãŸý÷Yôë,îÏzÃS4†IƒB¿"t°"Ý“÷#£pŠæ±ã|ò[ñό«ÊéͶ-Hq àÓR彩øwh_e[–‹{KÀ´üv°Š’ßsŸÆQÓo‡Ü’q`¬ææ4@m`ISS뮽‘ä÷ÁÈ~ÿë[8(s1²âi^†Ô¥÷f¯Œ@ù.©‘¥œÞG´_)[éØÃ­³âŠ^ÊkIpnK>Áo‰ö@,ã‚Äò¢™2^›ìwä'd¡—ŸªžU ¤Ý),á!¤ÐQ…ÂãmØOp~q ßë‚ûå®ó ¿û ËŠå=`ä¡‹¼`0ä§xÂðçaxÃø7q¡Q8‰øor«ÌýÜ|Õõ«PÔã$|ÑÞ¼8î+Ä­]xüF—þ¥€ÅN<~ cY·þ¤é@@ù5c—íK:¾P~/Œ•Ø‚:JÊ|_|AרMí•vS%.0ÖœËZvÿ›ý_˺ÀXº(ð¥ýYùÄXØ,–¥Šd¡ï c‘ìQdé‡]®z”ÕÉÚv€Q’wn7ìöYç]`|3úßô˜ö?PZDϾC Eþ?š\ÿ›æ£oö?_ãáigÑW‘³Q!‚KÚÌpªüî,âÝ«YòÛá–Kâ ®ç×"€_ë€ÎWD@íï‚UÇ sõ'#MÛ%¯þ+„Ìþ_õäíÿîÞÈÿë9û¿µÇoíÿk<ŽÿQÞB‹™«’™{ÞKõ»ÊÊ=áp¢X|y³ÜŠÑläâaÚe œù¬#ËYÒÁ*âïU<Ü̦°ÎzäððYý E…›ü%[­<¨Çõqt=ïÊдÇuyÏV8óýÕÚj ÷§ê*óôïo-®t„Λ9ú)Ir^âU\3Ì›\µðÝHž*!ÎÓ<‡QBOò¾|Zžy¥K*r÷ljP]¥V=HT¢j3J(ÈÞªwç‹Zê/lIAÍ [Z'mûàcŒIh(l¾9øu~oQF—ùp¤Ç§xFâ4`u§T Yç[¼a·iü¬h|O&Å–·Ëtf Ìn/\«Û JöfLtgù²‰ÍvñuÙ«*°£­§E¯e}‰KÃ+d±Í× Úçgý Ü™-f¼àqÙæÊs«Sô˜Ëö—.ë"Ú&ßWÒF´ö>³sè**§Þá«™:•p;“9æ¼KQ£!ŸÀ9€9éÓÒÖO[(nlvK­zZ„Bf ‰Ÿ8L¹åÎS.Ä©ÒvÔ“o]4yUCoY£3ÒND¥Òžúð„„²Ýž}ápž5™Q.Èjð¿3¸§é:ËÛ×¾Ìâqª£ù¾ìvöO¥„í Xyÿk7œ×V…·¯=D^*…f*þ|ºæy›ê”í~ÞH=)MÝ+M•qj=Ébj{–‹bË «6ìIìIv¯v/k2h‹°¹tz1»"ž+ó$ƒúíÖç ºWÖ“@6ÎrØ¥I9ø‚’Ȥ|QiTÚª¨á%ÿ W:œpÔYÍåñB<é}aÿc'šJªN°î¶˵’xÆ“¾óéNœ{̲–PÓè¼—E§ aó5ù+£Ôì¹Ì£K:X/TÛ¾‚üÄ̼¸²ƒ»`ÚlBD17¦§þ!³ g5ºÃÒŠ»º² á9Éâ ï->x¯X4B¿ÊžES­Ü€m{°Ã)F4ê¡a”õ¾â-‹°êÐö¿ÆtiÓÓTœ¹Ÿ=épKæ.H6^½ë³a¬lµ6TÂoQ4?A*£³w¸¤± ²,ž•ÓS:š_YQËt:(9CñÙo1ÕÏéqgÿlÿ¨UxhLÏ IÚ={µ½oPLzgsè¨#Eçøäèxû9ÅfñÑû ÀZGûG'Ãç&Û°ºEû¢ÀÞ‹È_*GcIþVôÆc:±ÔG—ÊÿŸkÚ`:°sÐOɾ¯ÂŒóWaŒÆg¥Ú ÕxoSJ&ï’‘‹*’Bͨ'­úy”Š ¦Òäé–q¢'º)sy+N™ƒt±ŽrP‹ÞEÏa8¦cl]GdouÊõÎd"¡¹š¢åF•O.¬rÕ_sªZXž“AÕ´½‚¦sla_æT¿{(­k¶Ä5¡WwÞÞBt †)Bd^4Ÿ)Yf6ÜÕ† ½± ù ×›QáoÑ9¹H3Gš’~¢h*íÏ;ÖìêE4Åè»ïsVhy»9Õ¥ú@XFF^Di–m˜=`Uö£Ñ,‰@^•œ£Óª®tzʻȒT £O̽óVIÔ&|ÉÒÀC(‹ÝÓ“‡=5þ½ê캰puÀøØ7laº@On3Ž»[Åî`¾xœþ¤ýÿÜùá…ä®Îœÿn®m>vÏ67¾ùø*…µö§ä•o–À?RŠ…‹gÁ“ÞàÝMC`¡‚b@£üL†ÖÖcÈÎv–Ô^Oˆá/ 3d¯Žê&)¦?ÑroN±ÂqË!›×Oñé°dG›£“]ÃÎ[®í[GÇØRð‚•÷Æ[¨Y}´ŒÞ öö~¥.m%ðO3¦sxzHƒQû¤ÛiŸ:{Ú~š »'/[8bµ:ÝnûƆ~TC·ö_žÄÙÑq·sÐù/èäÑE¶âõN`˜qÓ/ÚT» (øéà#̱…ylctërÎÁ<Ù®ï¶åxx†åŸ¯íªêðŽ‘XØöþþ©Näöó¶Ø'\Ý::»Çpãx‡$uÑe1µqª•!cw“E‘n–Þ©uE¢ÞYqJ RÄÆg×­‹EÞ +£V3qí®Hi\Åå½²å^Öá7Š*ðçYø×HëTCœÿzÅc?UY¼m¾>ÿ» áA<°Û…¼^¯æÇ¢X¸®7˵°=BÇgè¸}|ŽOÏá‹Îaô9ù¹¾¡böšxÕ•õáF´ÝP|Ö´ë6|VðÓbz|VdŽÏ Ê‹ýƒã£“îöaw ¦NÉ„.|¿Ÿ]¢O éâf ©Ì0ð·jZÙlf‡ÇÐ!< úþ€ø–6¥ÿÙÓÕoÏ?–ÿWÛÅåå±`ý·þhÓõÿº¹±ùÍþ﫵VãkölHñW€XõÉZ5ªJ Sa%‹ ƒ~¿QµªH5ƒ šÂ2Œ 1³hÊjqA¥ ö–PTÞ=_©m|N‰ƒ@žTrø+Ñùf3èz_ú¤ûꚥHWkÜWÿãIU·ó¤Ñ£ ýý9ÖÙ 0H¼´dùe¦ßÿÿâ ÈÝEXtÿ«±ÖÌÍÿšßâ¿~•Çðÿ/•o‰Ð÷®`*4üñÏ.Á·çs'þ³rû—y,ŠÿñhÝ=ÿÛxüÍÿû×y*ÞÝC»£$ú.åýÉên‰óĸÇ€¬bz‡óia78bïʳ2­â\'ÂÏ äl8·ânA:¬£˜ÊÒ²Œú>oÒT%‰4Ñœ èiï=ÆŒÙ)r<_f?ˆ|åÊLβÅ:aŽ´xc²â­ÅU|¿ª p?×…ïWWp'Îä´ßTµ°ªîB½Áˆ\ô–vm)xýžVS IÔ8nnÃJßmïuÛTóõN«U¡`e"†Ö~»få!h­Á,FY–+LGâzÍ_Xõr-ËvúrÇKJc!þ8×ÇXŒíë¹¼ME¬RÜ*Où±¦y>M¨“v׈¬)¿T¿Î~«ÿþsó+Ú¬m46s÷7›ßúÿ¯ñÜòþsóö×ÿ°H;GñPÏTL½ËlFž„VG—ãñÃÁ„ïù‹£J:/¨íéàbóÍÞtÙ›Uí) ¶ªÃ<ÁŽð´úö'å] Ä¹À7ßíÿǯÙþr뿵ÍÍoíÿk<·mÿ?0…£¶n»ðøÖÈþg>¢ýãéó_*lã¡AµxTûßlÀûFs³¹ñÁæ—bÈ|þÍÛ¿Yÿ†Õäȯ|×Óøü³óXÔÿ?^3ý¿\ãqóÑú·þÿk<2<»Ÿ%K³~ÊvYt›–+ìgJL³Z¡ x£Nqt>€”Vø,UЈ°Ûã1.VéÞJ|>í±ÅbÞnÏdãsç@¶cÛØ:¦¸§Ž®°Ç´Àz´’„³‘›”ÕŽ.”œ_ÒÝ6HÍOa+д=“ˆ4@#§Ñ(–lb¥?B㜌c=P‡8 ;Ñ­`[Sª›T>·š àßõkß jß «Ái=¦Ÿ½F4Û/àMлÞþ[¸ÿ·þhÃiÿ}óÿöU»ý÷‚‹h\fisËe_L“sÓÔùáðH|3íÕÑkრFô<¥%Ëêcál¬n:ÚÓ‘´‡¼›œ’¨›t½ù<™Á+šxª{1CòÑ¿ƒòÁ¼x¿7[+Ò6S¸ÀX±.Àa/¾Ä=3¼•¼…κ'GûgxÉíŒo¹Ñó ¤Ëw›ÛèFнR`IéÕiý¸ÐPwÚ>ØÙÿ³ž’Ë8¹+n^t³UÆJ”7[ò7†kB¬2„Õ=«Ñmm7ÆPâ5{¼ø £Á8eGä€õŸD‡¯+ó%/¢LótÿF]b0¯^ˆ!W]V@‚P™5AÕžU´ëÆ„½rFê•{rœì@±âa˜ÞÙ?jý醇šZ`q/ |j¸vš¦Êºë΄þû‹‹ ¦ilF'8´Ïé§,S0¯þ$œˆð¨ŠÛäF9[f§úSƒCö·§X Ø+IôÒ‰ç*Lî¡N4 ꬩ™R~LƒAWز œG¥”â)féáeĘ̂UTÁ U•dZ%ïΰÛ~Ýu(‰êb[ h–7©)G<êùgwÖ_à±ÆX©?äòìûÈgáùßZÃÿ77üÛøÿÿ¡ÚOU­{§|²` vv¬ÝœÖÑn7_:‡80ðâ8`–gÊÎ_^&н!Û‚k[Š¿6ö8ø”†x@f›OêWðׇ©CKL4s¦ÆýÏ®€òãìÿðDðÛ>>‹ÚÿzÃ3ÿÿvÿç«náÑyƒoSÜRƽšªjôßöŸö˜í2 cŸ¯Þþríóñ·õÿWyŒF{ТæªFê’Ó–½¹ÊΔ!Ý<«ÀfI#ó«W°õwô±"î„|k§ÿ:3þ‹]”»Ý\tþÓx”›ÿ7³ÿþ*ÿºÚ‹¦ÿÔ `– {'kÆO^`‘à!,ÿqkNõx®„>¥ƒ§ÞXyü‰ˆVÊ»vÆ ùx@¾ €¹£ËLJIÔÇöD'Å㨞Ÿ{ˆ_Õ“‰É„&´³—ë¬sTŸ]f›H$š3ÃAÏVù®‡ßõiú!x΋ôQ¯Å“Ü9˱ŷrE–i6„±“fð$øèφïƒkÓa&ÝñÅûnMFÖ”–BAlEÝb«²ìì/®ÎWÄÅ»ˆv¥r`? /¿Âã½ê [)ÿl…ÿöXÓÿ?{çé×íÿׯ»ó¿ÍFó›ýÏWyìóm¬|³‡ÊÅìêLPΤÑõä7Äá/*«¨CÿPÀ¯Öd,¡Õ« >Í®!‘âõc@[­Ú&Gª,?#;†V¹å2ãô¢¼Ä¡ö’y!t6+ÎKPËe“ëÄ32»T";ÆxÈZ”V– #q«L—\›í_ȶ½Û%àbû×þoCB~kÿ_áž§tµâP‘ù»²RnÛð˜1βh Ðï)HLÞ Ú,=‹%y¢šŠƒ_6S$‹Ãüqê{ÓH15¦‰tr,æN|4KÓÔùøë¡ã ˜Ó$ë8‰†ÒJ‘“ùOæ®O{‰r‘H\õßgQ/IzPn²DRÛ Òy4ˆ1 Òc Þö’wÂçÖÀ÷ü2™ÏÒHUžÿŠ-·3¨Ïe–ò–›hH<>m¿Ü=:;:V«|óXÑqÑio¹oP°:tÊìuêbS'²Úã¬Nì€U»Ì¢Óûf¡ÿ[Oñ>ýýÿÅ|Þû—²ÿo<úfÿÿ5³þ“/¤·¯ÿõúÿøVÿ_þqê?O¢«$ÎîÐ`ùü¯¹¶¾áÎÿ5Ö¿ÿ•&bN£ ZÂ?Ñ\S­‹EÄÇúŒÐ6_{¡éWhz°õâøx›&!ÕÀНˆ@‚9Sjöºm¼Ûqí«4 Ú×Ú©cò)»ÝZÎg´Á°öÍvÛôòeUH"µï¿$YÕØ†c¸ùx$l(¤½IÔšvRKÒ*ÛG%ÛG%6Z{»‚ö^•N}7NçNé¦ßK£Z0Œ1PÏ$š|¤Ø¸+÷\Èyk”Pá…„«LÁEnAÔC·QO±5®Š¨mÓ+d¢áO`Ü©ŸvNÚ7iV ú!HƒyÄ}A4£Ò!ÁHþ6Dhñ;Ñ*¼€¼´½{3¸ükÖ‚LQg✄$E òâ„™¦îïÜŒcb:–ÄC›} œf7c‡´ÅøöI§ûâ¦gpN4UBØ[ÀòǵÎMO³jRİçgÏ"Ó::hퟜíïÝ šµ>“„_YS•\¨®ôÊÖ@ðôY°†ö¡½q:ÃûÿK¹BÖå”6…Ðjê& …?=ݼÐ,@²ºJPØTè‹SŠ R$HCßH"¸ƒ’5B.kÅuÄÓ1åòiþ ¨S"¡Ž#¢¸ÆeÂi†XDÚ`*”Ïé‹Î^÷ÕMúŽ´pMµª¤RµTÈŽ.ÆMJ¤æ>j7i˜Z¤æáÜ¡gµ¸ÖÑáîÍ`@ýÕcŒÈËt67šµ‚FØ/U$jé£pT›†L+Dz¹ü;H2fâÅ 0x(qˆÒÓ%ò¶ ¿sCü“,‹rD.¦#Ôe2xusM-aL6@SQSøZ»¶ ÁB‚š©ö i’#IΑ&¡„ pŽàþ 2—å¨á{Í•²Œ¯}“± ÎG@í2à/ïéºc¡ø¦ÜBÈd i!¥°uZGw«h ¦Ù,L@“Í\B#³üȲ³–æ9Ns9µxDøq¦ìüdo,fTpæ© ìs˜»XT½ÑB"@Ém´ƒn«»“è>@¼Ðšêv {<±•L=4H8*˜}™1_#*«ýµIÞ¤Î0¡ÔŠW’ Í_FcYwz#ÓCq¸/ž|06V¼{ DÈP^Æ‹r kƒz&Xy¥½ÁºF¨¼¡æf‹8]„ÙêöááQ—"ÝÄê:Ä3kj­¦Õ+÷H£:¯Ú7è¸Æ^d£¡ƒÍäPƘ¬$YM…‰¬-H®V~(é¨K˜­H*q•õ©¹°ö÷*¦ Ǿù CÀØýü(ÿju,M ƒÍ&ºãUÐáo ÈPB‡ØÊXä7”ss¤ƒB ç&«+ÊÍ®±:ÙF_duë½2Á KAB û]EP7îœ"Ú)\[ ÅåÂƲ3i1bÓxÉLdž)9O¢yíŸDóø&&å–$æz„9b†Zᇗ!‚-— \~ gÈØzÿ3fù %³üÂi¾®å~('õ™œµ‰i«øÑ̉åÄì^ ¦`v¿pz¯DcLé‹Eô©ó{k&îk&ËÏïó3{½òIÞµ¶p’7¤J¿Õ$\«šÞ©Ü@Â4¥*˜0é BÎà æyw7ÍS̹3¼Û±Z6Íëìßü›7¼½/*kL‚ÏŒy!a\}µþåæ4ü8óŒ?uö÷Kæ*ùKÍ3ˆ§OšgèŽÁ3ÏÐÓ 5ãPó Œ\P<ņÔCÌ1Fù-PT™Ñ­&#ÙŽr“ŒÛí=–-ŠV%;w² ôõâÍ=ž¾Œì‰±v‘éáèV[…{/·Oþ|3º¤MÙÖÔÛþȳ²×:|u3LßÙøòm(’Ê(ìœl¶^à ;šdµQ£6‚9PmT›ÖƳé¹RX2dà$qÄ”ßqib“ …Dí wîÖ ^d•_¨ -ZÇeüm-êà¿@Ï;²—x¢Û¸Õ ì–ƒi£2’ý4ÿZ¶£¶:ß½âE^pï“yÔóº]ï¨py7ʯïî´ë5Öw{b172xâ¥XàÜÞg¬ðŠwAäÚÙÑ; îBhÙ]‹°µ"ûo£(é¿·çÞ2×wû§·ïµG…èKvÚ…¾@ϹÄÌS÷FE3Ï»í2‹úÉOáìkv™b¶z›.Ó7™¼Ý÷kôœÅç'ÌZGùië·þ‹¯ýÏù6F¬¾3 ößë6Ö\ûŸæÚ7ûŸ¯ò(û]çÁÇ¥Ù‡¢Cï?*Z›Ö|–›ŒowÿowÁÅÁÎry¤gP÷Œê‡ÆÕ㘃ÉaÞÎzp™ùa êωËYI -¢…S,´6B 2.’®±lSiÀ:<;>9:nŸt;íSÛV'°èã€` ÊßÖqi;ø|ù Tƒ-´€b'œR (ᓞé:ì'Ô …B={yÚ>9;Þ>Ù>8•Ù{ŠÁ¯ÈuËN} óIHÜ«ó×*²rÜÃzü:yB_àx3D[±ŽË¿‹¦QŠNÜzã÷)šý—|ÿt,MéÝ„ïÑù¾¤ ¦²ò·QÂ=c|oÅ­G#Šyة´ĂUW_1 €qLéÒU«Žm°%9ú^V«Î.rTUnÛjÀe3àÖËUYÛÉàBÛæÝs 3=Nfó”uÖUض¸â•+Øz'Eb^!˜¢èMq’fì ½Ò­7Uʤw­ß·`jwrQÉÓË ä—rt§Ë‰-ÙRɃÆUKõª<®¥¡0ÉWÕ«½…zµ·”^íWMµ’mý_X±LA¯Ðj}‘<ªõhcjÝRˆ¡c{ tlOêØW™¼zæ1—4ëŽf€ æ›kÜüïQã›ÿ—¯òˆùŸ]çEn šË¹}ᘌÓ5<º,w…[O´b$o‘SªžŸ­i®*ò^™a:¾lŸ´^œúõŒÞ}®5¹0ú WÙ¬ÛÝvk'4 Η4*ت\hµHËrì `={ Õ{é¤ ¿ádugím>BûŠóZPfnx1}Ó©>Z_£!ö¯´YÃðê±}=¯0n§¾WåS‹s½ûÂÁè>Ø\ìÝž‹ñ0ßÄ勎'Ó ·BO>ÖVî!äŒ÷<€}´FÄÛ5ÂЙÌîk]Ìk±°\gäCö–¯Weýb€²½d6ù¤z@~Œfxìù+òÃð±S R ^nm&–­“‹åªAÔÛm+C¡áhxM›ª¸Ãºë«ÅE´jD¿WUBÝÕÝà7IÏ¢žù ÞÖ uõ*Z0Ofá›·µ€ƒz†èj÷£2¡2($ëƒ)¢»‚óD(^/kÑS€wϳBU “@o¡|¢ž¹»/çf˜C>.©L%üï ]^êñ†!mD–˜ñT»>æB *[[ù.‰5´åbã«·øSž\ãw¹/hdP9÷ŠÊyÏ- í9ì>ßâ.ä窗šyÒË„+Fá¯1ý÷ÁÁîþs òðn½¾VE4ÕA×7Ò_Î0JI<§;ãDq•” ÿÔ'Ãñ*9}Ü= ºA{·Ó5üñp@”ñ{Þ°¶ô> ±­Xï/ð?Îö©¹©P„ÈãôŽ{Z?®w?½¸ 0LþôÅ˽½ýö ÌÍŠìw“(jãli œ´ÛgíWÛûK‚÷zŠŠQ-8u uØkƒÅdÚÜbQ{,ÆÛ.¿íÚoOñ­Æñ8`i;TgSoš1mñAðßlJ)=ÙÉ—Ëßú×Ú%.þŒP0Üш€Â»ß0µe—rÒ›ç}—Èt‘)….CÉ|Gn;µ§ÑùeVa5ípSÌ—ÇØ´ØO(H$2S³^?Ikfð¾ÛmkŠåFÏ•‚^ö*ÌÉê_²ÕŸdBeú°¡mH$»ÄmE‚ÜÇl«?qî[a°ö“b~zã4úI–Ò"5Wª‚DŒGÁ}‰lÅ©$±Ø’â*Æt³¨¢÷¨&VWk«Ž((MæÙ0Ù‘ž•Þ4Ó') JÕ2)}¦ƒßL= ÖžXªéÓ5.ÐêÃÕ¿žŠX—}vpUIkZÿ= RwA‹$1¤žDœ½;t&‚öúB ̪qt=ï î+ÝúþöN{±òUN¯çPöå)‚äëc@ó`ÓÅ@…LP¶d-ÏAÏÓb‰õ[ ó^‚–R™ƒÕ ¨ò¨RýIèBuÕ7ýš-”•üWÒ<‹¿i–¼7‰9®’âÞ9wGÒÊŸDôÄ«Á_)鯆-\…$l+VnF”2Üž+þ Læydv\ÜRx=h§Xíf8;œÁð ÄάN„ìR{1/`Ùåïþ\5:Ò\% Çž“hbpÞ©ŸÐkÍ6¤[Ÿ‰kêÂ^ÃôJ Í„¦¶£Š`iŒ §ÿ„Ú€(àµÒ·ÂÉÇ5[@”ÅXŘ3Á)¿åz$·epÍÞÁf¡_´.B„–Œåüp ÑÜ€”k:t¸˜¨2{ª°‰(ªâ)ñ4Z>®dq6ŽjâWUþ2CXΟT½à_ì„7£™ "ùÊÖGК¼ªl™¨k[¾)®nCƒNãtÛ*Ö*&nÁ¨!™Êa£ h!6&ú°Ý@´þq•ÇÖ7îªF./jF¡qŠ«êG쾉à|g£I†æ§§Ï÷±XMÏÇ¢¹~0“ww8yØ÷&ÿòr{—Ò¿Äí¤€#Óq-ÇâŠÄ¹®J |CG#Hg÷W"3^YÙ/ÀEÀŽèÛ|0„͉xgñB{Â$‘.ó’f6/À pQ°#^ÂæE¼ËÉEˆåµ”Ëu®ÜâìTÁÔÒb¨ 5)¡e€¥Ep/$WE\½Ð\]sõBsuQÌÕ ƒ«‹®v$Wý"®vt~}™Ÿ¥(=qªf0™#­ÖÑÁN—HAo×Ϭü =2²3C;/zãf BYœÏMCíi¨|†n+àWV–½$Î.È*}—Ûuo8´r3ö%ĸäH‚Ìü §/2§ô¢Q˜ƒípY2à‘X˜qSgÜ,ɸidÜ,˸idÜ,Ëx]g¼^’ñº‘ñzYÆëFÆë%¿Òe¿àHBÐ8"¯}«³ÄŸüZ¤_l ­šiÕánë@‚ œÊP¶‹wy%Ž…v¤ÆùŒRÓØSp¥ô=öÔE,DØ‘",Êa”œE~vÝv*_ÚÃÕE<ÊÞ!ÁWí×Ý“—Dñ]t Kd{P²áN5\Z÷_¯vÛÇö÷wÃhîŒ` æ aâežA¤§Ù+àN* kÄ™bÌÏ—-‡«‘Rµ=¨R1F Nk¹ ¹«!ss!ò ©fEPЙ=(BYö¹«!K²GÈ_4dYöÇ–ÙOæï˲GÈ] Y’=Bþ¢!˲ßí¼’ÙãweÙ#䮆,É!Ñ%Ù¿NY%¯ÑKgâêëgF¾Ž¦ÒèÙóniq|â´!w5d®<6ä/2_ º½sªt¹Ÿ–e»²${„üEC–eúËIW)óïIVÆÁî°%,ì/l'‡ª='SO{¶!w5d ù‹†ô¬rÖQñÒV–ÁôWë᫽½³S©Ów£2›gÃAøÅEÈ ÃÆØ=51€|^&Â/.¢,~±²@èEyü²›Ã(+øë½3Åõ¨VJ€w-à”±€ËËúÚàctMò/Þ5Q’eÀ¿˜À$’è®ÅH¶ˆ“®ÅJ¶ˆ—®ÅLfp£U…§W¶º«Õ0šeʾ!ÚC»õ«‚ºJ,} ç‘oå,LBe¾¯U¾×ž|5Ø™fÐ]­æ@ Ðɪ&lZü«âôªŒÓ_ Ns«ýèZž¹Á©^÷;â¿öÊÿÚ­2%ÂhýÉTÇCWþ6”,¹…r  ÈI9MÔ¾ û«âÒ•½ ¥¹Ì‹Þ<0 Ks6¸ô ž¹‹—y±Ë²kiz¸”Yë¸ͳ2òì„ô³)Qks—Zy©Ô}Þ¹xZÚæÔBdž¦=-D—éýgþäçœü¬û9ó^„,˜{VH\¦‡¶„–°xgK8Î$­Ó¶WŽDkÿÄ,ŒÎMÀ8ùÉ·Î$EPÛÃÃÛ31ûƒ¯?;c† ¦¡ü@?@…ûOÃg”Ž_ü aÈúú“Û¿°d¬ {Fÿ¹ýþS™Aö÷~Æð‹ä©§jtþœúsAò}I½ˆ8d+³/È=ôµ!#!€"€û‚~aùŸÊòQxæi&:N-âþ¾¤^Èžàý" ÉOV_aíÝô‹*ègYü¢Úæëc4¾@/À> û~‘þÞÿYd_Tû"û¢æÓM.EKFó‰*¤`Üù^¾÷9}ÎæQÒcr'íçÁsÚ«áÔ$:Wùº°ƒƒö.úà|Ô?ÍŠÄ…¶K¨£8ÏÒhLÆ«ŠŠ´[ "Zê6ÌPS—enGm¥òà?ÉÄåÑÆãúc×XŽ®èSÈ)Öú,þƒLÀºS"¯MWMÂOžÍ IC’Eü/Ó¿dðrÕ$Ða³}qꨎ9 ÇOÁl$ßšá5쯖|*æ)Þ8þÉ<ý—Ì Ù’ûZU‹¥âÁàcrtµÁgžœ #u ¼À{°·¼ÁxéÒ2ïÍÛµñËZÆ-+¯ãRùÒÒúÀ½Ì+UÞJ>}¯x|ô‹„Pà¾:'Þ[ìݲüÞê+®=¿v”Ô¶§,yÚþ²ÄAï®ZjI>«<ž²ÑG²pUÛÌФ[f“Á8©9¹æD0ð%z¤QR»…å+©áep²‚|°ƒ_ ªv¢¯üãᬠ<ŒûÉ»®¸Ù÷Kf)šA5W½^ßT¿Í[VpüEjøvµ¥[É'hƯ傲|ñj.t[ždøŒ2}÷ÅFpðY½R±çt‚ô‹gþuK_Ɖãql#¿,Ðvþy3÷1Ë­¶?ð$Moþ)ã°0æöÍ»pFŽÿòòó„¡ZJ€1JÐ?Aú‰¦ÍXZ Ŭöû~áˆÍµ;Ò°/Öho+öÁ:-†/‹[)ƒ¾¼à,œŸÿñåÁ±Èž<ÒXm/5†÷ǵiÑø%d@Ä>adu{=´.1°.‘ùÖÒc4&L”`ý™<ôÔK°÷ýFùˆ],ž%KÕçg-§WZ³þ¬•L< Yª®º³ +ZÝ”c‹é~ôÙÊëU*µöÔß;ÜrQë”ÛðÏSf·j>­{»¾‹U¹SoÀO ÆÉ?¡ÞŽ|¼¯ Üeź»žø–:)½;âI¤øÇ“F÷-ð'M\‰ŽänãÏÜ#¼è_¯}þ ˆÕŽú“—:˜ºÓýÌÍß"äã ¿H]ÌÀ-{š¥ùu¢ZæÙdƒÌ/±;ØÞ*éð"MiF_pÛÂ×Þ-äS$†k”ƒ·G¿³Êº“!ï6‚(‰²‘=Œ–?{¸³ª½›“‡òÐÞÒBoYáwQƒwT^o0)oYùœaô¯}Ðà ‡’/ [ØŽ.oW”Ñçq扴’ç M!ñÏWåL‡Ý 0Œ†Ï°Y:¸Œ¾e1l’–£Ò·ßüK.¼¿ ÿ É8Ÿ¼?>ú„}îQÁ>´wµ)Ê›Eiö—üî€O6îÇâ¥hé²:·Ü¿ˆU²áÀ10|$˜6|­^ÀEh€ñ€`ðêóù^§b‡¼|DCò#Q‘>? Ê8C4ïê[Ø)g›š7Þ F¤FÁ}&w6˜Íc˜_««éVƶ. Ûhn¡Àª"óqPq¢õÐÉ«­¨ ¼Aüäp@öw†4´FKɆ'[5B[Ù•cô•’K„2gH.økNDø¬ÊˆC ‰À"¾=aJøþ ¶¶î‚õ%¨,àÝ\ÇÒ†ˆnø€Š°J–ëHÄD”(¬†QrÔG«zEx°ª§üy#‚ÖјDˆ»EìæyØû<FóÛraz¼T/Weë®å´ÎþÂnúès£5¾D×­!º÷¨åjS: å—<fªœ<éÓ¡Ì]§ä Ç1¡ñÝGIºœ õ×<˜PåP|zè\ÇÙÎx6ø-T®$ò@ÚãL¨¿æÁl'2¡ýÓ…&ºßâtý3¯ÿǃÖ]º\àÿññÚæÚc×ÿãúææ7ÿ_ãùŸæÿñ Õž¸î—uã¸ØuâÒ Ç…ììÏç€2XˆŒÞ¢ÄÀ¿´ŽvÛˆ áG¼­WƧŒŸŒ…>M·^¯a }šž=Ž…—¿Î’ázS޾+$ úñ9Žqo*æíøoyÇ-í°ÑqÖx¦3ÆÓQ|üßÿ|ø<}<{üãÙ3)kT†Ùß›õ§O÷Œïsðÿ yJ &Ì’¾“ `Lë­”8›]Q6¥ÎT¹yRÆÙýÙl¬¬³×®Ö@~­_Dµº|0 …±öÚU#¨RÅTç˜s.7„¡|’8˜šw`ÈÐähŒË‚n~uøw!ZTæ!°”‡@‰£by`Þ/e’X=èµ²H/ 9›|×·ücq]©ûH1žá-à!ø>€µn²",V%®õ«Ò £›+vˆc¨V%LÕ‰ UHÂÕ¼8L’¢-êE÷{Éy„ ÛN<§udpŸ_H*q–Þ÷äW¬®¢’È÷KsR·™¹Êò“<ª|Õµç‰Á·„&¦ãÂ¥½B ¹™ã<ýMèfB'ç(¬.!òçGžP ‰ðËŸ¤ÈÖTפº'îѨ¡¸¢ï?1[ÔSjRج]]?qûG·ÇinÜX6pÌð´ÅÄêPÎÞ•Lhn$4$<ÑûBT;~ÌÑʱÿ3=Î/Þ§8÷8á4/'Â'¡ºn´÷騭“OGm}2êAûàÓ³ížì:r{ÿ´Ý½-¾ª$ÛU`”ŠÆÒ~[ìÛB¶ë@o,.] "üºÞqèWQN)ƒfY®AÂ(åÉu+H¾B;®ý*Ê} al—åáú$Œ—ÄÐ\=Y$+!ª×£YÃnaÿæ‹-Áù¶»Fh,D8ðåÐ(ËáÀ—E!Æ U„Æ2Exa¡±L^Eh,S„fËaGam™"ì­å8²œ V Ÿ„$ÑÒ&êº($ _²ýVLg„„SÚŠò® §´u» u\å’sIH™,r¤:åP´ËÂÅ ÖçÀ¸» –fpY¬¦É`iästH ÞK3¸,ÖºÉàÎ-4ƒ·ÁÒ .‰õ²¼Ó÷bèL–Ca_‰ˆ°\µ¾ÖˉY8[D„%ƒt¾X4»n +ÚÃ"ÕÉ®¯7óxZ4€eÀûÆR€~¯K¿‹Dx³œ åÑvúSŸ“@£ v¦/?¸Q ü‹ ¼^¬œcS)ð® \̆r¨‹ÙPNQ¾x×.fC¹ÔÀÅl(çÔܰ¡üjàb6” A \Ȇr"(4”~{½ÃULÅ¢óø,ÇM`±è<Ž‹EçñX,:»ÀbÑù"ôÆ>´Ë@ ]̈v¨¡‹9Q^ØÛuøjàb>”ï@ ¼îô3>—€þ¹žÎÀçÐÅq‹ëó hôQÞRû\º8åùüâäãW7Ÿ{@§DÒAà‚eÏMà‚y¾ÏY ‹R&€Ü j!cÒoà‚E—Ï{ Ñö£ts]À28nO° ŽÛ!89ïrÃe¢ì˜¬y3ó:ñsQý|zúùsuÕÂïäÏŸm)®^’ÿhrº˜_sqn¢.QTs™žÏu»FQóÙºs¨¼Àå*Õçp¹:õy \®J½ž—«Ñ¼#Áå*ÔçZp¹úô¹\®:½®—ªMÇ×ßÂ==ÇûõNËÁ·Ëö}ô_ª‘~É ÂæRìAPÌñÛ«~¨ç&ÔóB¨® Õ-„zi½,ÌÓ‚k;“O÷ÀÅõ÷'ˆ8ʃŸ‹·ˆso[î–$ç`p¡N9þª”ë€p¡J9 ‹ë+‚*Áãå„Ï»…kÛƒáÂÍǧá½×É!u©Ë–@"´–+€Ê`wÉ(„ö’Eð{K–@çP¾‹d»Q\|8áxV\|þáúZ$ŒåÚÂ}]ÓåZƒ®éÆ’­ÁÀX¶=(„eÛƒÎbÉö E»\‹¸¯sX®Iê.¹| ÔqI˶ ]ŠåZ…òI8Ë5 é:’P|mÏ÷ñLãäùNs¼žp ­:º®—µ ºÎ6jÁ„o;Ý®²®Äë/P“×vI+—â÷.ÿDÎÅ›Güf"~2~ppY[[«òã«ø‹Y’íÆéÜM<Ù¬i-èÕ¼põ2º1@oŠnìU™¤âw›öl â÷ö­DÖÐ"+Úˆ„FÒSRK¼2îQj·(pòEËèˆÓ_`,åþlzÞ™L"¡Ô)4> XܪseNì2#eÅÔ·cà·igúo€âMÐ^F&M“¡f®j˜É 7¹'S…ÓÊÛ«4äïÔhéҞUCBíž°ÉxÒmóùެ è©#ꦗ¯‘Ïh“Nu¹ƒL%¿wdŸ,kó1wɾµ¯³¤7Ȭ]gëä˜j0ަwS.™8—‰ä@ÊMÅüLü}G’"Ù tn6G̨H@»Ñ|–ÆB@Ɉ4(‘P©JÅ7°D4¸Ce :¸¼ŒK 锜²‰nA é ôŸÒxv‹•¾3ÔMG{ã¤7\Ø’€qèªA·£¯î^2¸¹ôê¦+e!{íe›ÓBY ìáïJ¦7ù÷T‚ãÏ«Â!<'¸XKŽf?Ÿ'º¯#É¿„pX"Ð?G ÈGÍoP0Á¹j‹¥t.øI…v'GW®>¤N‘›ŸQäíép?žþ¦zÜ+Õ›”º´Ëý¤B»f®ÐF‡qå~EÎûåL/£µ—ûöcLéªèN¤á®‹rÂÐe/,uÔµ s•u*ì“e¦ê8µY7&ªU»Œ5Ù¶æÚÆÜšÅ~4ÝÁá§? :œòùKéÀ¾ŒÐçn·ûKåJ¬<7ô„Ö[ ³wQw]q–ÌÐ:Ûœé$ï¸VJõ¯u²äçóæ'É;«ôV-Ž/“y/‰Z㨗èË€œ•þ?ijrëÑu$~¶”~/X¸” “RTË,/´„Y4///¨³‚ábþ¸f”Ó[Ìãd6°÷Œ”1ºè‹ÑOÙí·QU`¼ò‰)ùéBùÎÂX&ÿ(öŸâ¡Uû‰g»¤P,bÎÜ}KiN‰eòI’)nîDlîpãíòvB³wc’¬DpèŸæÆDSkn¬)Ù<¸™Îæ…>Zà«!rÑRa2Uã=ùd©èÑho<ëeGóµƒÞßÖZÔ:Sô M~–üý”)Ö¶¹·lÛLgs§5NdsÝ1û™õµÒQŒ†SŒ!t2éèk—d_ GvÉÒQaÁšÅ=‹(YS–LxAÓµ³†·x ³|¹C7{æxc±áŽM·A,ª>5=` £Ð%Æ(õzY©ý•úI¥¾E­ß¹HL=x´X$ÔRÛNK%¿xÍ‘«EòXŒ¿M«”^4u0Ût;ߦÿ9e^®mßFͲ3³õ·v4›4‹J©.ø²gT®l K8CKc}¡0þ§ô ·•”©6JêàrœÅ0ŹI&(© ¶ô£Ùc{½ @.ÿ·YÏáÏ>ËP싎mRÔЉÅn”f¹9Î:ÍqškFp¿ÍGEÁý°^þ%³ qDþXЃÂÑ(¨´êô–•–—°ªI¶4álNÿ†ŽèOêP9^|ù ‹¸Ùà»÷t5yZ÷ÖwLN~\šÔk›Ö?òÄ­-El)UWUèF³¤ÔOšËñj²úD׸ٙ=Y¿…o¯YZ*Ü~½*hÃO–Ó„Æã2¡,© ¦PkFËk˜Câ“%ÕÁR¬½"!ÿx ÝúZîˆäf`ˆ‚âúq¡¸b’W.¼Þ"y5Ö¾°¼bK`ËOŠ Fú07ôól*®º’Ë öÓDÙ(ˆô¾Špo¡ 7ïVöQcˆËäCë:L Ú Ìí%Rª\P_-²…˜Y+*^SÐK;vzûœh罈™~W¦6}©m™ºîÅ})“7¼È*yÓ“|ضùjX©ÏÛ6_Nj׿ËMuørI;|édõE:´"×Ù¦Þв‚ÝŠV cÔ£fI›`V zT C7p1á¶?X^Tpízx¡2òy{âÅ6Ž' b'K4¶¾½rU¹gÃñæ†áØ„‡\+}ê|¯©‹@*¡ ^Š‘jN,ý÷•« 6<ò¢,íCJûµRñ íî š®_’ž@옛0˜í…=w\)¬Oôj®½öb§µ’óTOËjeº-:4ñ Íù›PZÇÏì`vÕo¬×›Ý‹Sù8©ˆT½«pí*_[ÓÒ„8¤êÅUj®2Z—£0ú¨))PmБæ2AØ‹ÕýLà 6¨¬ãI:RQ}¬éÓ1Epµ÷C$²iÖY³iwþfÙ] µjÔÚÍ…-e¹(æÅÂåõ]IȰOð §T5ÕÏYsY™yC‚çÛhúÎi£¯Ú¯»'4†¦×Ôím˜-€æÝ<A*[‡ëÍà!fe´VAðti‚› þ׫Ý6Åd1LŸ‰Þ¦ ED%=$UBÐß ýñÇ=Òs§#·’Ý#,꼬¨·Ýã…ôþë6’k’äÖ@§¨_|Ë0Gaº+/s Ë-ŠsZê[e¥V-FFÞŒ?¯Â Ø”Aá\ÞȬ”¼Œ*­©ñš+ÆG:§KsÖ멟Pi˜èÂNòÇÇ›KÍšf£QáW]ˆ•u\·¾¿½ÓÞgÞº8ÌÛï9ow‰E€t€é)°?’^¿ƒ 㬠z^Þè†\·‡ÃO‹˜šÜ뾫[õHÏŸÓûæ$„—Ÿ•°xªN?Ÿ7  %_œÃu(ª×èÜý ¯ÒøB3×ñÍåfÆÅ;6<ÝÌ­M3p*Ú1š‰åbûà,½4©ª­[1ÔÚraéÝÍÈn™¬Ñ¤,¼¶òó ÜÍ'GyQFYqFÍÒŒ–‰v\ÐAØýÌâ~béÁùq¯xÆyi"|&w†AVµ†ÄŠ<.6ÖtÖV 0?j…a®‹TÆÒÐQÆ}ý£Úàow¹ Nâ Ä[èeô|M(™jÍíLU¸_^ë:}Äê#®[rDu _k ½Ä4P.1ÌÚ.Z¥±w1Ÿ%µŸý“wâ•­ºOðm«éϧ0Ên^sÆ™3¡÷(šã8–±˜áŽFáÖÝÐU‰TðߟczÑ ûQñ*ÉÔ ™çEèÖ©ˆ‡¿ ‡¿î•Äí-ìâk-×Ç㊖Lj­ 3ö¯µøqÌsiAÜWª,0í€L‰SdÊÇÙ`5Ë_ÔÁìõ¨ÕØÕªýݯ UkŽVe¶Víï~­Zs´*[¤UEKtêÇÏÓ)\ø4j­L£²Åå ìѧž£OäÕëÒ1-Kgs1¨d¸{'dj–ïTñŒ¡é­ 6·жëÍÍ¥v·¤Á§®ôØÚàrŒg±0l#—/ÃT”ˆ†ðï6Û[n(ãbEk47–S´|ùd$dCÅ\‹uÜž¡²¨rº…)Ô'äqI Ö×oQ´NŽt!dÐä|!”mk¾é(d:áŒ]…fŽr–m¹ ÉVÉÛš‡#Ö—›YÊÂ%ã˜ÉZÄÉ’Œ‹l-—¤ÁŸù®xAœéinÁ<7OØðG©«^Äãcä«þ}"ÿ—üþl%Qôߊþk¦cµ›ê¢¡cĘ̈Oüg×\ð@´âÄÈ êõúG©h&\œçJQ Hk!ñ0æ\<†ÃE‹:aFŸµÀr@Þˆ¥œôõâ–r~Ÿ½´8œ¨»´J†.-#tËà¥%PÿޱKÍøŸ0U¹:Ozó‹î6Šò¹¹Yÿ“ÿs³ï4ؼ[6üÏ¿yüOýãÏç½ôXtéç…ƒ-ÿºÖØllØñ_›kßâ¿~ÇŒ­jÖ8Çç´âÊH©Ü.LÕˆ¦ÊqT1€éñiûåîÑÙÑñéÙÎöi#ˆ®èø¥v¼Ñ®õæx^)ió­û~nìMps~o–LzÙŠ•񾯢r§ÉÄç+÷‚Š›ï=CýA(¾â 7¸ˆÎzcXÃâXèG2qÒ»¶RNÚÁc™:¡uæMú÷p£CI¸¦.¯nî?Ví’Xµ$Ëc¾ÌFä7îõY@7çÇ Ó×áê*,¨å÷ýUÎ*{?‚ïzbÎpFLVºuŽâYƒ”*TE]¥®ÐŒd™P­AeÕêT sŠÙºÂì¥ñßñ!uUçß+:Z)EuÔéê•Áë Ý™§Z"©›i<+Íl0c>ãBI4 øg·åOyÌþ2Î@¹ïxðÿOÿaÀø6þÇSÿ>c\.B+<ÿÜ<ÿ5güoZÿ6þ·^{4V`ôô³Xv09ôu´b·C¬áÃÑw1UcºqB&û÷aüîàn’t«µS@:nÙ߇òûÇàá³ S5ñ8&?º4¨^ŽgwAø¹:ÀÏ”kð.‹›©Kitìágaÿ~{ìÿÙ‹ßoOQÿO“4úûýÿÆúZ®ÿo6¿õÿ_ãÑý?Y+µŽŽ=}¿µú³‡^¶p«õT-’hx9ˆäòä&Í&[A·Ø\â¥X¸$01Ç$üÄ4ð‚û ùþ–ÝÿB À;Ô•­g)†|6#¬€5˜îedõ°‘Fd›DiJÔRd<¤ÐF/þLÙ›w¿È•~¯8ì ÓœÍ£¤7vCÀây4…YôpEË €_¢åxÀJ5"Èìü‘Å<{GxÍ|1ƒrçò†rÛÒ+9(ùhËåxFD/8[†ó~„̃þû F#‘á –Lþ‡³?NæÀ¹Ð’B5$×2»ô?ñsûÛ%ÀÇÓw³ñ;\±ÉìMŠ­Þxœ'YHq€à~ŠÿVcZAÿÿy~ÎSÚÿ7Öo¬=vúÿÍG¿õÿ_ãF!ë{Z þkÿù¤óüE7¨ ªAãÇÛÝÿÛ v°{€Žg]À ¤•Öd·“ÞàO‚qå A+:X X¯$t÷"Nƒit¼‹ìwƒ èðúQ4¥Ö9޲hüšñU‚GnSìZ²ÞoQP™Ì’¨ á»Þ4ëGHj6"úH,žÌ“Ù;èÌ^0²z ‹u<ŽÈj=Š餽½{Юcáƒö #†Q֋Ǫ`Ûcòáý‚¹U Š±Í†oøÒ^!™û×P,.NªŒ}Ò×Ýöá) 4ðŠžúÞ=Þ8íÀø©IÓ6v¶]óu½kçC ÷ŠËYÑ•·i¨ÉÐ0f+…¬•òFË‹YšÈÓÎjw+@­0úØé»ñ»˜4ÂL¯*añÔDï[ó GWJ]\¢ZURïžÚ -Âk9/q ÚXÙÚ¢G%G¤˜¦äj§À\d6¥ìø«¼­vSÓHƒ­½ç¹òÀ;y:FâZao‚›¹Ö\¡´h䇯RCJõÁè¼ ‚ñá nÅš °hæ>'À­½l^Ÿ“‹|ÞG‡ïžÍê{ÎùÉåž;°µÚŒŸfÝ÷ºÞ\ KÓÞÞø×x˜] ù7ëÍ·åXÃHŸg·¸'~Ú>ÿ…Ûî‹öÉâ<qpu)xòÛ`63Dá¦É€ìø?ê;«x?ìøÏ7¿…°P~ ñò€‡%”hhmÿQÓ-Mx ?ÚXDXWÚ¯PN>ÄR×){€õ¦Ò|ÅÓ3»9wÜc&}Œ”k;+J®P}õ’s´·¸Ijo#iª¯z“ÃF‰ EÅ[@Ûfh’åìÝMR¢“.]]á›áÛJéMò¶†B:<:lÔH0­GßlI“;u2R»é…tU´ÆVhl„"7Sèa »˜ñÞtê)x¸IC¾âTCKf¼ºô0®ñµ%ø‚Þ$’Bt‹k9½2§ hÐÔçä¸м5éÍç8—óÝ'rÄÀ±eÃŒklNft»Ãú¤”‹õ‰y$Ñ0@y­'H¹5£X]öà¤A ?‚P r|²êðY‰oœZ<ÊU£)ÀË~1òéËBd:,»h`æâL±2š”ž9¤^4ü¬TMrÍåÉ5— ·¾<¹õ2rU]—¬(¢&•ú\N¥MgÓ‡Ÿ¡D—Ë(ÑC•~m-ú%ºSÚ¿[ZDî–:TH.¯C¬Ê\/ô™J”~S¢+%Ò]Ñ2•U\¤¬Ö¤ÕƒžQFRMýêÔÅžèËÙpO¢´¹ñ'Dƒöi¦ ô¥)¿lÈ/Oµ‡Ô cæíü úËR€|v;§Ç!æ=´µÖ©‹•>ÆÚ`@%„ýN êtQv¿SAq½•®ÆÆU5½ÍfxçuKèNÞØ$¶Á m! ¶ÞÌ⬓ J@|ã‡cŠ&\žbû—Êuí}5Є¹®ïÔ~×…‚79¨çm Þh(%Ã4GÓW›ŸV̵\Ï0K…—²öÚòš¦,5÷æ¾æ cƒÀ41®FÀ5ôև§¬skʹ&­z•Y6â ß;÷Æj_™tƒŒ»»á´¬Ô˜ÖsÑ^ëÃõ@¿;©{It.Sñ»™Ü:!\J&¸õÖ‰™.ýç¶êÉZà&ìQÂhÍ}ßÞ¦yýnœïL¡E :ME- ˆª ÂW.Cå{5—ÍÑWÔ tÅL§œÝ{0 „}»†:p´L#UâÚ›·hú¯ðzü½ z[[=òŠ7 +ûSÃÞGT ¯1?­”zÉoDfê3ÇI³û€Aª·Äú® M‚K­›ÚRÐÇ9a°ßªëŸ%Î{7ÖXôÂÅ3T·u ~CËÇì"Jè G01ntâ@Ì&b>/ö+k9žú® Uˆ,ÿå¸2‰kÞg¿hX'ñû&x4«"èÛ‡ (Š…Û°À6ìžôÄzB~‚VÄž GÅà1‡yÑõ|/ÌÒèTaF‘ ¾S¿‰%Hºõƒ—û/+gž“\ @o‹Ã±(f ÊÉŠ÷Á€À컨þtßC^(²)¸Fà‚¼ðš^áy×ó¤M-ðÃtïÍ+VR©(í €r£êï2÷³{ýÙ;š’µa5ày"‰°ëÈÉ'Â…Ȇü!íÊ2™MJAÊͧwªk`_ÄØCf0Z5U±ë‡¹ò ÇMxóxec»d±ÖÏ!á[mÃD{Òø±™G£·fÃ>…öJ.ò/£·™fä>ž]ý8Kij6‚‹øü‚_<°òL¹Ñ¸"wªæ8ys«2žÓ¼®ˆ_ÿxö¬rU[»j4ªîeØñ¬ øèÖõãѨª]‡Lÿ]ÉPEM„¦ViÉœ>ȵKƒ‰4Ö€¤²uÊ&{ЄŒÍ·Ô(¨ÿ>B1¢Ux8­ÖúÂÞe­£ˆje2HH­6ž}Ôå¬Kcê¡…×÷\yFP©æÀð&vçÊÝd ê²FJ>Vò÷•D¥@¯&¾2pAŒÁÉÐùAú¶Fç ™qŽà:Èpr0Ÿñ êRrÝRpEÒ±Õ¥œu_8‘FçÊŠ‹ÍtœZ¦Vx_¡o{0XãÝæH«–7W>sÃ:ÂI8€Y½G‰f`ŸæX¹E“Ìï&IÃ$­¡¬– C¼¢Cóš·S€.‹ö—&Q ÷ ®Ð Á|«þ82ºxcô‘©ºËKi–7ŠlVâ%0…/ñœÿ~°ÀsŽÏ<÷55%=¢ƒTɵg¥WëÁš¢QÉÉÎÛ”û:B;Ã"ªºQMpˆ!?hÇŒ'å¬öÂÛjØsöÓòJÿ!€å[’ÃEÿª!0ˆ§HØ +Ôœi?á÷ p{ /oG̶<·S&“"‰ÐG©@Ä—OËM©ãmñ%¥cSˆ%ŸAáoeU£‡Z ò·’Jr[‚] =!|[ V|âme(ÔÓ(„‡á$Ãî"s¬°/ äEñ!2Wž< ûQ8â–+çB™+¤×ûÈû¨TðÆÌÍÜ¡ÉÛ4Ðû͹î/…n?’]^”‹\ÜÇ[(=ÖWî=€ÿƒ“(»L¸CtI“ŠaÎ#ôŽ¡áë€-T߀bÆæN#ÚøŽzõ‚Žó¨£5rúëcü äi•6xC"P5˜-ëƒ{À«íÖÑái78«:Cq vë+Ì—$ìL¦«åÙdïk1çŒBž´Ž÷AEµx©3‡_AìÎYrÝÞi¿>†AÝ“‰g¤ÏÏMÉï Øœ iè]À±ŽîëíÉžÆv;}©ókŠü3»ä0_ „ürzÙ³šÚÝ5p;‡»¯ƒàaª ýóqµä)_«‚‹ÕìiõÙaJƒUV¾&¦Ç*9®…‹ŠŽá@Éó§ÂÐc :ýWcÏ5+XC’0YAÉa/FºhšÎ¡Û¶|<„@ôûe4Dyñ?ÐTg§Ø•Áÿ”éИ íÖ ´pVé ²ËÞø”¸žÍqŽ,˜Î·8œ³à¸GBŸ·½Y“Çï ðŸxñmÔäy{!>;ƒ»wÏ*j‹J»îªxÍÅ# ŽQ$ŽU¤Î/ŽU ç,×…K%‘Ë({í\Òá¾ÜáÑXÍ,ІkuÐ~Ø~N'ÏÓjÙȪÆS<§Á'´ÕRŽ*²˜RÔ«ºšúýž­äžÉ2Ì £ó(á Gc28ŽÑíºµ]³Ò•Îõb¦¥N¯‘uöð ê£û¨jI¿^ëDkÚ‡ÄDÑÇqm\§ ˜=£wâü š#ØÒ’Ç`4;„.j6BxÏò-Xn£€‡ ¹Ë$BÔ„c¹¢³7×1ì—Ïý]z·¦©S]”ÍÍ8Ó„»<±I1•ÿà̆jtúô¬˜û8G/ð”S$Ú~pI*Nuö’4í!ÉC7EÂ}¤{í)z‰z“‹YG©è]%ÍP•­Jîd„¦°ýÚ0¿00m•Ì­@©pèJ6Nç~ ´Òq”,š2ôk¶.1¾:·à”Q‹çøˆ¹ßMWœæ²8‹|¥ó[*hÁ4™T)0¡æBB8hÖôñQ ߸ǘ¯Y»m}^ ôs¦’6ãÍò ‡ÒuƒÑøÊ× 4Òë ¿~å'‚Þv+B /ŠÔ¾Ì0ÄıhÑ2F›B¼ÃpHÕQ8‡bb«ÅÙc¡ÆÙe1ƋѸ†~‡áŸ;f,2ÜùUn¥]‡˜éÚÛI•KPÓuîÍ'½UFbÀ¾Ì›ÅrºçªíKr -¨Á> #ÃR­+êáµ>¦)3…ü {Y_K½ëf0äžÕÓÉp ]ïb~ü#x™nðî%½På}£ÙH g¬ôЪȅ;þ!½Ç=¼ò1.Aó2š6Ò~Ÿwí³ …àcÕ„·sªCX9IY)¿þáHu r¬æºïÂMžŠ9þìC’ˆ-ýEô–m:¦ o¿´½mòËKÄ5Mi®-'­|ßþ¡ «+kÍr¾^ZÂËõ‚eY¦Kåéµ#0fŠìõÙºÐìßÉ0\±Ü5Zª›*¿†ecëà—‘ƒXhÖ¢j ƒ¨ð’†,ra Ž;ñŠ—uö;ÍÄp€“Ödþ+,´Ø¶„éIIÑ\Jz8 ½Ií0‡}Q>w—R·Î^-Ò«ž h'VéKòÑ«õ¼‡3ÚeºL/{ã\]èÒËr`Öã~iž{˜éÈ—«¯{5TÿØsÕÒ›*½ïMïÇÝ‹dvy~ˆKÉõÞt6Í÷Â@ïu×Ã0È ù~nñAÆÁìç§Ï,, µ§¾uˆ†ƒd†û¹ ꙤöóÓÒ\Ÿ… ®”¹gйr°P€•–@ñö¬”ÚSÅ[©@~~*ÀÊ©ýüTðV.]YПˉIÖž–P;ãŸÊs9½-šsk·û¡t‚_‘ýyÑÏBl£ÐPÕs#õ ·ýó(C§½šˆ„¾ûCºmEon3}{Y•lΉ&ý‚(/§lW½L]F“Þ4‹éÏ«Ú8Äß3c·ª­œÕ¢ŽUô–Û‡»;úrÒK«˜åi‚³Ï „'Ðêj P`¦nÇŒbG”3 óìä€Ô Ãý8+¬!O4ëù 9ÓãÙU”AÇæÁ¿J#Þ«‡kW¸{¬]­ùºæñì]¢P®ØbH1<àÆðDÁNÃþ¦ïÂdaZ!cœãCq¤Q‡žÒPäÄc C²-tßù×ù¥ýšMÒƒm,FPέ»Ìçí9Z§•~SŸçÖùbu>õ~¨ÉðzÀá­1ömàÙ;—5_è\ÊZ. g]ÒX˜{§[ ðªg¡²ãu¤ý¶¥]ŠòÜÎeo”¶¥œ1èSsŒµ)/K÷¥§ø/”߃Ó.Çynãì-“Ïó®gA>‡©•Š€;._ŸÕÉõWf—¢c5‡B±ƒ‰yc¯2­GTKu1·êdJ{˜"ãŠÜ‚–§¦S¼?ïíPJ»¢¾‚hàÆóËz‹Em]¶óöÜ Ù+Gné¸î(nëNK—š.#çhH®¹Km_ïyA~hØžŸ‘xù-³Z¿lüË”ÏlfªXJ0yÄö2ˆÏ‹ЦˆÕEˆV· {……œ÷ E a,>d½¥I‡sb½°;Ay?PؘMÛ¦XEGžs©çÑ´~ÿ=ªÈ*7ʵ˜úó|ðôù¾™ò!x´!Rvwœ”Fó §üòr{×N:³ÄÉŒ­ÚÌβYelÛLS0ùp,vlël|*î­;4îëiÁ¹ÓùIÓ݃WhU“á:–sÎÚ0s©DùU©ÀØ”G6Ê^TŽÓj’…Ñj-B9:þ3²&îfIL÷b—ABÔÜ¥0îŽ+2ÄýU×GNÔý“TÂÿm2—¯¼H©°1ÞÞßn‚ùlž†kì8Bo1î=C&V£c`©>ˆüôÙZa lƒÑ“64û6tË}…Z–†oÞª³Â~ت'd…~œ%–öås #ƒÊu,åÁggx*½ƒi47V'Å…tJ½¸!P£bB¿.Eh¯’#IqNH–wƒZ|¾–Ÿg§Ö9yq^ ÁËåE{|6ÅŸ¯åçâ¼vZ-\ÛC¥Ë<Äf ¿,ÀÚmïu`0Á‚­ÙèƒÇhŠ!yjôf߉À’7Itž†ÂM'@¤óx<ކ pÑdž½/Ò2 6éÒןHOûû¨ÄµžÖH„ßäăÕ~Ý R½Ø>K…{îÓè: *|·(©T«ä?>LÑÇGØ›~Ì÷B¸³Sø•Vp’”²IV­ƒ¡èâ¦@~ó¶šHƒAð ÄH-:Ôq©~ ïD™ð{ohé„Ö}±¤­£Õ©,'ÄÓÂsØ€\«P|ú,ìãA¬¤…¶Yð#IÇÖZƵòÜ\z;Fbãf¬Ê–W TØ~-°íÄâ¼5s‘ !­"”¼Õ’Ú– —3“r^ÆT©¿ÐnK=PpÛqOɳàˆ;êLßœ¹£€ä)³<îÀñÿäm–誣)Y%…GZ¨Ú«z¢2ÐÖWÍöcaQQ¼û­:»ãM¸–Vsz S°#y¢ ;§ÛÈî||™VÈî»Æ>æjì®Æ>Ýjâ_Œ'¦¾ÝuÃn¼—_çIûñ‰™ï‰l={.ªÌÇm”æb”'ÊzÊ™c6d£_\Œ~¾0"•£Ÿ/F9Êe½ ÅÞßuoÙæªÎUŽ“Ù%‡•À¦Å®Ù…ÇÃ-K‚aðôaß±/ú­$x¦:®DôW6¨ÝýÇïÐ(Þsa§ uööxƒ—cÂn½{tö_í“£šn.µ±¸ jé'È4ìvLB“Ë1`â ,wÈOGM^™gÁ [Šâ“)òûQéÕb÷r¸‚’öZlŽ¿‹Tt—^rtÃöÞbÄ@C·Eé”iñ튼ö¢eMª|èײEÖzú¢Ÿ’ê¸÷: ,]qáÔZŠ'ß«W¨KœôªK œqîúñ–“jÎÝz Üö#Ofw=‹ï*´™wŠ_kïz ‘×LÔ.œ1q¡3>:â#g=ìÌÙ–‡Ö6 žú€/x†ç.Ôô¤).fäl”šfr§/:{Ý›44Ø3aÖ§Ò™ôÔïBÃ>¯/)kÁ%ÿÀÐëFÙe7÷üÂQf‚W`|wúr‡&}Òz½A³¿&NÿŠ,ñ™ƒn« s{2»höjØð[³›u“¾ •hœ ±”)Oµœg<®·|[G­ý“³ýÝ£pW]|wBsðµÉ­Àé¶2í ‹ý6`¢áB½ ,Å‚¬é’p~Î2O6A‰sóJVÕ˜5r®JöQ5çóˆ½9£Ož¨—û<³¿VÍ%æA}ëѧð—}G¨Ë1¾æg|­’}—ç<n#ã¨!šŸT *D³°x9u¹ƒòY}(ô¯ƒqR¡ƒ‹ëÚûÚ{˜¥Ng¥§ ļ…\`I ]Œ\ÓUòà}±%AåW\†‘ÃuáõÃ; R&·ƒ93I"ò¾pƒüeü^ TvÆÊ!È{ïñ Ùn,sü'0è%·Î8q¸n)ÜsIo¿œÞsIo¿œž8AÁ;—åüñ1–ãå‚‚HÀn9às ¸¿Pf½¿ ëCYæö/%pî ·ƒÜÁçbãs±-4RhT¾4r!ŠÓæD{ä½ Þ‹ 乪آX¸8¿­kA÷Éíë,BXp w PBã™×ä Ÿ0ˆ¡ô4²ÆŽI¥ãÐoå4¼G£$öé¬LꇼdŒõéä‰ñâ”Wk¤cT»þ®·P#ĵ}qv‚]&LUÈó`ñ&ŠôZˆ¤ýŸin0nØdî7C* ÍRŠ¥û¯Û싞8(¨Žœ¡ñëÀ>íëÓ ¨ýF˜5jYSÅÕñ „mlrq#Œ-rÍ2zê$’ MN”s3ErÇÊZ`ì•âã™–9ý1=6Z+U>áb߯¼æàÕçd^1—!Å®¡ ò8îZqú“9„m(Æ»>á–˜t—gµ€=‘%F©>hÅw𽂳Q"ñŠ\ŠÊ/ÌÜ=k4¼É`\ù0$F[`—ÙûËq†|{}øñ®µyéÙ ËŸÕÊ" ßkX͉o/Gu¶ÔÍä|¿æ€¥go;`oІ/mŽJŽay—D£}CÙÇ‚6&šX¿’‘9îÖ÷¶É #¾,õÀHO®HÂÑ*?û<ÍÈêòï/ ÌþgzbgÍØò\bÌÑ5t, Æ‚wµÅÂÔô.ªðãÌÎ'Ô¶‡ãDÂÄ8ê'÷læÞŸÅW/ï¶Sûe%ÙaYÅ&IŒQ"Îûª$ê®WÖÙâÑQ”t$»HÄzâB-AÎv¾]-ôiñõlŸX5 ÁNKäÚ-ì‘ìQÁnímì¹uñk¿jìc €ÝÖAIÝÈË»Wµöš%~Áf³‘«8Ï£…b⣼6p ”×NN¼äŒ^åÃ;R"T|¼ÂÏÂOO¼È¤­SÅ_Jз‹ÐO%úi1:ùÝÕ‘ÊðFlKOXµƒ~¿¤hëÓOï´^úIôº…ô²<½Ùz»Wº¼6A>@:øMÐa³+$Ãù^çõA{‹\·Žfãñì oIÇxøtÑü¶¿FÊO•râÄpXŸ{ H~(°­Œ*ÑËØt¨—IM³ñ{œ.`d‘ ¯¹ð)Ìä*ÆØÞS@’º9kFÑ9Ùl‘ûú‡ãè]„ƒ½t6µ ©Œ,þ¯f %,ŨÌ u &×]¿fBÀ§ú8“§ºúô±¶ûXÕªj˜åª!Ÿ]÷s³ËJ²Ë ýGÛ»lÓƒ–(ropþ±Ã_Ë¿¹‰Aˆz,JäÙj÷ÿ}-> mW blŽc#ÛýÝ_ùïkñáóÌ…v©«Æ;«g5¹V[`U1÷-ÜËq×îVÒô¨HS‹Ÿô|çò½i5ßö·OþÉÛôg…#&1 ²ŸœÙp.ŸÊš°Ž CŸ´w!yàBo×[Ý“ý—§í`àÅ;A»—ÈãÂkôr’3z‰Â]Z‡YÞð…×þšÃäå£v¨ÙæmgEÎõÝ,FÛ+¹zÞN%Óqý8 ìG›ˆUû}_fWª¦õ¤'X*£XV¹Z¸¸Ê¯©,kÍ¥U %8=›NfÝ=!;h‰>K•-ÀöòmØ#´‘nÖ{ДOÅçkù¹ ŸØÃň9úäSÎJæ {85÷cBJ)& á˜Ç.Å„^½ûû2Ìíž…T¥èÙås‡R³ ”¿œt¢…‡)&bN'†³Ë~‰N|:ñhCèÄrÁ†²W/T 6{ÜßÝ*±ûZ~.£€] %³kR ?&ªD&ª„U¢ U‰*Q†‰*ñh£H%vËUB"æUB#æ4BûO=ÊÐzÕÝkî‘Oø÷nýò^Š*8)BöÖù€ˆœŒ³Oñ½½³ÓÝšgWB°€zþhÃ:TŽ%ò*4u×ÀÀ˜Èb1ð™qèÀÂÉ:ø„Ø!Ogb‚á5E9 ‹Ù0ªÞeq3Åøb/}”³G1èû·¡;ÌÓÍ)Å4:§PŠä0X›¨£ |zÙ‡iµÏ )â!¿(–-‘ü¡ì ŠYXÅE¶ź·`neÕ•§ýÚ³+Ú;MÚsæW~ÑkON°r=Ÿw†µçŸaÊgXBç_«+Ö\HÝÎÀ‹4S4·ööÞLœ½OA’jprÍÎsÕ±³â•W‹(´<¬ˆÈZ¶ïrÓRÕ­(ظ9«p ›ª°ÀIƒ¿ÙSƒÖcÞB\æFéò2ks0h[uYugµ `¯‚ò* ºeI§l[Eüq DÊ»ÓTàC܆<Äu#Ã-^!ÐV3ˆsP—kÏbÄ7åˆ6ñG#ªFyR$œ«r„ÈÙHDNæpÊÏèÓ:2’Þ}Ŷ¹2xwІ»ÝVÎJ­íÖÐ=^w_¶Ú'7 AË<*™iËWNÜS‰#O*©¥²¶:Éxg‚‘ñ~„J”'…"uD¨­@„ˆÈ2el°J&×gFÍÐU•jF<&eÑ¿Ìd ¿# bå‘eùÑ£d2Nât€§ÆâRŒa1FPÂFî Ê¥qôe¸4æÉ÷ Ç„¦b‰«7"_¯õíyåÍÛZo€c¾S®shŒÏO*ú,¯ºµ…w{/äUèg ã{c”PŠ÷È ‰í1±¶ÙÔlb´v•SkµNdwŠ` XCïgÅÔÎv`óB?M Ü)8¯°\k¸Ð”¿ Á b Þˆ m±pc…¿u+¶Ã¯ŽŽM?C3\¶ j齺Ãä‚ÉÐÙ LÅÒvÍûeLÏùcSWlªˆà¨Ø­Ù”¼8 \À·CŽcu–Æ WqÄ%#: Oi†&Ó*²QaŠ­E4¡fè~A(Ä }ù×ç`ÿ¤sÚúáb>ïÑŸúd8¾ë<Öày´±ŸÍFc?×7¯ÑûµÆz³¹¹ùð~½ ÿm4®±ÑØ|üÁÚ]3â{ ]ö ¡þÇß’8º()zš]Aå¿K_ó©< ó¡S¤è*Ñd¡ÿHI<§&=îMÏ/{çQ}MrÑzª—T ²K_€ö@wÊ `êjÓK˜ Þ^B¿ûñ96¶¸ÇÓÇ茋çViMúã÷ôºò ¼£‡ÇÞÁ‘ “Xã;$¸% 3¸a4î½Òñ,£¢ÿ~glÇ3Ž=Xu³òA$؃•ƒš ±ÝþÒ- ð°è‘ ö )*ªìCñ)î®zÉЗ´Óü†iýðr<ŽGïÉS—o`ö-¼´d½ß¢©7ºæ‡”ê%7‰ݮ( ÂhŒòÉ¥äE{9ý4á:â-.¬ÁÔãÈ/šÒ²0Æ]i(6"ÖyÐÆþåypÐ’Ñワf³šo½ŸG)Ï HÜé— È¥œÂÏaÄþ?É›õæ[lxëM‘Î'Ðð~í-Zv/lãaºÊžüWÿ¬þVLõ fH ¶à„òùìñ‘$þhÃ">*#>RÄGñ‘ Þ:AâƒëšÆ@s8pYH[-"3xcÇ= Rò!‚«ƒÁjÀíD™0Æ“ w~³š"8 ¨ü'ÂM4Ê>KÆ@΃‰)ydî£=­#.õ„ ®Q 1Ì~R Ã™gɉ¨ìµ·2²ìNæ'A ~T)#Nâ¨Ã†JI{‰È’+ ¡“’µ@'¡ö(jfÖüjI'Ý}7ŠY<õ/Ó„p$Å¡óãÌÅèÊ…Œ§ƒ1LJ‚Õîl6NèÓ=˜¿É}?X²OºÝ¡FñuÐ>|°^4ƒ­Ðz±|< ¬W‚§OƒgÏ‚<{æ¼@F “™¾„ˆk×?ü!ãfâ8Ø þS(¼ÚéH²qpxt|ƒVöõ:ÁŽÊ8©Xc¸Ý3•ˆD4;P„ПÏe6%ŽGÃ7Ý=ýIÞ·‡ÉoªšC@“’š¨Pø¥ùÖe¦²F? x)Çæó þm>·ü ÏÞEɦShwã“ûïabƒ×‰+×XODeh€‹Þxd4å ®f0ÇЪB5Äï—=BtÃ&Ä(™)™š€¦¹ýZ\Ë>r93YÎ>–ó± Ú¼!HÔ†À«9u£aÀ‰›’"Ó‘kòÖfîW€Šùˆô£Ùí„É­N[½µ°_”bÿýºB²7©l!ªEdgªáD~}}#]ìI:v9l­ÞÊ 6K× (”Rð°•n ZÃ-ÔÙ©Cr1OÉ ›ä‹R95æaÖ¥T&0ƒ’Åd£€T‰ä0…å]¼ƒ^,ä¥B^TŽ[çÞt”Q}Hå_X;‹„XFéS„˜ØÈ UjÛ g§Ý_¡rè·îT0È k¬êšL¬K`aÕTþ~ÍØU }g t”ˆž/B5Æj¤½½»+åÌý•ݯ{†Jµo¡-‹uT„3…¬Â¨5i‰àåÎ"6æ3D“ø¢ ñ¾,CºC` ç3ÄqÊWL¾t°µéG]_uÝÚ°kå¶ /B-axj ÃG^TCˆk 5—Åoúñ×—Å_÷áØiâÏ’~‰nm·9Š'PŒúÚÍÕ@½^˜këÀD.Êu:Ëøà[뼯ÂÓ›¼fšó\ {$}’}‹.Ä„}‚8ÞqY–ºã¡«Ú?3¢»Kr¬áô’Ñ5,æèoü}ÍqÚ<åÕýÏ·‡ÏäWA p•l­m¾ãhZ ܪ¡¬%£@ƒÀª.þi)~Z†O×Zltk¬…â–¡+îçšBûs/öi9vZŒý_‚s¹ˆu‰lTî÷’8åC-sÂð¦†ÕhÃSü ðËL¯Œ³KH©Œ#úxúÌI~ÆØÏûœÏøm`(ß/þÝX +³7µ Ç+ʵÆícàñ³ò€]að#­¨DsY§o4£wÙ4 môkYó£uŠž@²O½[| |$à5¶åÀMk%h6@éYð׿oÐ9s€Þ²t}M>žÉCô!üzŽÿºøï%þxùÖbiÒ›[EÐõwwR-ª‘F‡0Â(ÏD.Ñéß¹AODY³¾ š¹ø,ñ7–ónåßü"ð‡dínª-ªƒu³š·©ƒJõvš¿~·¢_/}ç6²ïáÇå}ÊÂN¥cö*±Òéfa·òºuŸÒ´EÛ¹Û^¥³°[ù<Ñ–JöNz–ŽÕµXÕૃ¥ª ±TÜUÏÒYܵ|V%u.wÛ»t¬î%VÝKA=äÚBIçR ÿ»ê^: ú—Žî”.ÍjÙ§9Aìt)‘¹Â²¦IXþÉÜÛÁþÞÿá™Zø ŽÅÖH$?ÿü³“ÙÞ'g&.3]œYG-.Íìñç–ª#‹u»ŒnQ"¡J;Ý;Ò!”Œ¡;µðmlq‚ëè%è¹ÌÍ«~í‰+B:Ÿ1È-b¦œÜ¯Ÿ%™_—–Lþ„pO~²d6rEYV2ž£A"W¨Íê$ÇÌ#‹˜§*,¼œ&Rö#ÜV´‘½²“1ךƒ›—WAÖJ¡-w¯ê(ü<ƒ<’üKtÙ±È-d§”ܯŸ'œ_ §¹@8¿~–p6r¥Y œ;Kku?ÆûË|ÙÜÕoò`nÈÖ4‚ᤂ™Ñ9ÁÈ='àë⟌ùË'a’ï?fzÙ_„YÀí˜Ü.À$ŸŒYÀíär¼³€Û˜äcÁ‰¾s`p»f·å˜¯¡œ/íP‰ ÅL]Ì ¸}\–5Á»lÔŒc<²™˜G65JO²ÀšºP{-R‡‘SPø2zë‚í.öËb0ò‘õú$£‘Ó0Ñ3BpàBç9( Íþ4òÐ(º"p+eà^ ÀOw%/&8×vüî-áY_¤‘? &ë¦ö(Q¤ èÉa4:K‡êÛïòÌÌå·ßù¼x÷»Jýq¯W~:ððJ½@ðe(¿ä¨_g *S`°ÖÞæbi¸ði‘¯VUè|«`*(ñàìz”S ²§0Ÿaa>¿æó{a>¿Êàw[¬O @ÑP¨ÈÖqšdÿÁë=_Ô*ác 0ü¡îaøeEªå)‚Í3–Â(T½î §yA‚…¤éðÏÕ|ùö^”´Ù+ò×å#µ/À(Ð…ëO)š¾gÉåo-yKäíKUÛósèíPU+-Â)*V¦ÊU<õtâDãfåÞÎÉöaëïV޵üÎv7îRmÜ…ÂQµÉ8瀻nÕ7?ׂûOÃgµ kÁÏ!þ‚÷~_ŸÂ›§ÖÙü}| ‰†àøç>ã7ø)8ñˆæý§ø‰#^hƒÿŒt‘ÌÓgù½>Q“ù?¨ü CüûsÈïè–?ŸR ü5³ûpŸˆ`?î tþE?ÊF ?u¦%ò»ÿ”S8s¦ºè?s®L€TS°»°Þdå«IUN¾JTE ümœ[ Þ¸_–LýR´äöÔMõ‰‡ÇK Uá*_ì"™éå(‰Ð7 ô¬t†î*?÷Œ™¯{FHaØFÞÏ#X¿d÷èôù~°vµ†9vð[¾a˜iøºøðp“¦ðGsÄÞßý5X»n4Q¢ó͇Í'þpªZÐVáÇÅ;ˆ°&Öפi°Ëm7I¾N»Ä×¶Äj˜~`¼ùœv‰±%Fsc§]bì‰DXw H³Ü»8&Éxoí\Òv;:™²½¡­`õz•ÞòÅþ{J¢Èâ„&9B}y¢7Ng´ÇñP]ú‰¬ \^_u[Ñu¶q?ðGä1 ‹`µà²lÒÃ]Fü\¯ <ºvÕ¬ÖῪà#óA\\8µtUá4dž;p“U‹vÃ¥w é AÏ‚{!y½P¼6r¼>¶y}!y½P¼6|¼¾¼^(^>^_H^/¯ ¯;’×¾âu-Çë›×ÉC_ñ°¦x0зÇcóÔ9 †³i\ÅÙ…¼!Ì·ûtJo`Î ÃG“kW×Í5¿ò|‹Òô) Š¥Ž å‰5§Hu­u-òvhéñöî.}RK{²nJ ­¢©!6ˆ#†X×›&]ÜÁHˆ'yˆ}ÌECü˜‡8Â\Äk6DSæ²­ yÊEC4󔋆X·!Öe.; b#A¹hˆÍ<å¢!¬öúrGÖËš‚xì@H©kK¦G' ±¦$ÖXCF”f|@Ón ´­,^¶¥Ž¬=Ñ Öƒ¬i'}*©aìêa‡Úâush÷dÒ­SvÊ~` D’ØäÀJ:ÒI¢ç‡P´Á~‡|±u4`²™3|!{åb,Db€U8E(#Õù¥³y ç$ΰËêÐ_(°ñùû9ê²³ˆTJÞB—°Ã¾Û¨yà_$0ÞÍ\ÕÀë‚ 6Ë!½ìœ4˜“è®ÕŒ4˜‘è/T³ÑÐlXà´Žà“ù{ƒ‰¦‡ Úô– š‰¦‡ Úå– š‰f´µàÃøÁĺ‡ ÚË– š‰u´y-A5ë~&hÇZèÎì·‚†ÆÎf•ž«Y=˜Íß»Ê×’Òhi« †Í}KJ{ ¥­æyÐ_$¨(¨õH›¶œIQû©ÉÄzž Úp– ëy&h·Y‚L¬û™àýfÒÓß“L°ày&x¯Y2ÔU~ÚgV Ì†Í·Aª&ÚžâýôE'ãB=pºÚ’FÂÉth m3Ï/íFKPCh›y~i#Z‚BÛÌ wohŸý²ð¬}v™ "éBhÿÅiÞ ºÚÅ2<ËK‚Z§Ówªã4©Ýé¨ GîòÅ¿IV°•IÚ0FMÅÝQ”£) 5wêÊB’{Æš!,‰¶îCÛ=Uh“Yskî„ÚBûÅBsrkåö‹Î Q¬ñÅÛÀäþ±f5fcËUÀrÉ*+ÜI8«ëQM #p%´]MÖ˜ÖpŒØT6ð¤m<·o(T­[ï/k ¿VÅ]“öü7 ‹»Ì ÕÀA+ОתԀFõ¹j¡i5¸e© vœ±K9gfAeï^À0v¯ Í(¨ìé Ñ~ÑhFAe¯ï–Sw9´·‚Ã(Ùïî|`  àQAÇuÝ͇…kɯ{áåP-|¯ûµ5cõ[ÈÂi=# È»"àʯ€À"0YÍsà lsp 8à5¾ÅÁ"¿*èM•ëkþŽÁO@Ê@ï°(ËÈàW%½õbq°¸RzOÆâÀêFqH¥­$lWdÛc«°™Ä!õ†ÔÙˆ¾– ¤Ë=˨$f͉†\ãá­5òƒ´P”ø·TH‰ ðo§*ÿ•ÿ­Ôñƒ¨Qþ[kãi‡(ño©Œÿ@áßNUþ*ÿBU\æñê‰T“Ó °wü ”Úip3Òm>Ü¬ÃøÑa–•AmTõ¨e½Òr†µ`5ÄÚö 3ÅâÁêSkƒµ ÉÁPQBí%‚=%°j ä`ö\vÈ™>[e9\NÍ…MúCðœðž…¯^¯—B“(“dø•äÊ0áªS‡ÀBFŽé6>öÕXœÉ:Ã+\P„(¶óe=؇Mò¹ÀkWL¼5{el2óèacÝ×­QÜù7kõ:Æ›[þ{Öí —Œðùó**,E“æøûgø‡§ªð†¸ô ”&ìRRHi:Å:,†§˜ŠîÓOx‹/CzK/lz‡ wŸAŸÐ‘¦Nt)ï§’VW÷™­û?Sf˜ÖM.±tú ‡¿ùçªoR”’œÂ`{Ÿç‘VïuŽN»gG ¸ÆO‘|ÒyþB¥û+Ó",ït ;³4G˜aDzhÂõ!8]±»âdq6ÝŠǾ"E=ûpi—\¼âpþž¯hä½¢„Ý8•!"ƒ<òÚB€y²Û ºuŒ¹€q¯'Ñd+8YÁlZOèã£éËß<ÒÆ†#œSxHŠ9¼Lœ yWL. a¶m‰$Ùx ¯¡$ÜÍ·Õú[М7k¤[Íp­O|>…266¨{ù@®…£›4Ûb3…™”aZƒ6°µýð6áÞIK¿¨X t µVP3·Ím}ÉÜòÅ;¸gñÑÜÌo‚CJ2iâ ÚïøsÊ&[›FF»}>jêÆÓÒÌVªM¼ÒP²bª¨è¿tƒÖ–ÂÛ" LÎL8à{wë &É´ÁƒîÒ ñwDàEæZ­MWsXÐKxð°ï01ÿ2ýK/WÅúç Yb¿‚ÉÜìVìY<޳÷È¥p›ƒ3|ä„:,_‡¢×ÝõÊ#°EÐâmKæè£Îbhˆ#Š&T‡WG£J«N¯£sseùü¸jHc7¿¡^2Ëøxq#FbEÄÙì ƒI>{†»Áæv°|LMÀø!dz†Kòÿþ_´¸|<9ÛÖ;/ŸoéÅìrŒQ1Ç“§]@î ¤´*‹`©…»çÓm¨œqæ‚qÉ(Ó âܩ˭‹Ê˜öx8f©r°ßM¢¨ ²Dy^FG£Ì™ÍóÈC‹º4B £€–%À>±Q.AÞ9 ¸“tfõE: /¤É©ãù‘uÓd~™Eö‰ëàD†~ÀÍ!ñ‘ý Å»«‹xŸè 'xÜÏðñDjISãgWg83;ƒYß.hY«*SPÐ’Æh4ª¢[ŽmÃ+BÁPh>x¾B÷ÉÌLF4«ºTÄMx4sào(ãÄLˆ/ØÕ'[ÒpD„S†µÕpqèЃ޵L;ìM0ºå6F#eì¤)¨¦Ùõ5ăãí³Çkk&Ífð¦uU (OüÉO~rTÀ>¤Ñ°ˆäh4nSÓÂ…´ö[wD«yw|ÁÔΤµ¼i2­¦ŸV³Œòµ D´põ3im~._B#w> tïØ–Hò]hª·;<:6V{aðæ­Ý`·O:ÝAE(Û¥1Œúþ ë Gá7À©q'Oµ ª‡JФ òx˜õþÑö®æ o… qÚ=:i+aó¿wû¬G¹bì-YŽQ® xêv`­ã‡I§<OX.¼ãK xU{އ"Ólü>˜Î¦¥* ktW0LõÞEA6³'y‚‹ÙypI;ôZ{p|ìýKrê }Þû蘃h÷­xKw]‚ݵ·È¥Ñ±g#WrÍf¶¹ _èb¡.%yÐØ|ëG.—$66Æß°kT¸E¹Mr‹­€âÆ VÊCÂöaê1Ä‘'`îšE[PürÒ‘&ŒVlÌü 7”Sý‡›* zŸÞ”]¢ * ÝTŒÜäâ|šj: ÀÞ»^<&“?ýþû†ú¸»sï§»APÎÛQ®¢¯8+L§>ÁJoX频 fl‡|Pég…øØÄŒ¡5‡¯Ò~ú”nò×´é£âYô´ñUº¤ßØðXذsÀ[oVÇ6P”8Y|™¹¸iadλï~æ( ÿÓš°(9ˈÍû9«°ðß;V¶ýrÏwOB4ÎK—ÂÈ™ !£ wÈpo‘»“Z{ÂxKœÕ‚L¼B“¼E!×7F’F«·øÙ_²§ñ³ÊÓ£=Íž=,´ÅS “Á–2,âU/;Zǵ>¬„q'Õ]´76*¸õ‹ö,Ìt¦dÞÇ™~÷ÝÊ=Ѳ·¸\+÷äаſWX§¨ÙR‘©ÄPà†(^Ò_nS^,nÒÄò6ìÛåU;ä8ä²6©Šã!*|0¶*Ü%°mœB\Ö‚xµë0aƒ! ’Õ&Uí]˜ò¹…xxƒò‘&\µ>‹c¨"Y^>iFBwXCRÿYÕ+i4Eì—iÀ°Š»%y H3*¢.C–‰;Z,“0yªÕy¾=â¿€j¦ v™g“«^M:Íq×säOü˜Üò “ÛNÀüÆÌplµÇdÏ¢"Ï~–+´3Ô‹Ý&|:uv·>³ ÏÐX¥G{Uhx›Å¢m~t(}€~Ï–¤æÍk‘Òz.pà߿à,ÐÐÿ>Âä”Bf]‹ÜÌ=­žj¾rÜΣ¬v¨çî Ûèž?FL]µH¶$`e>ÈäuèWØ=ø<}ˆ–&I£¸$M67‰¿ï³±‰GÁDlý¶<`›× P5WU¡hF¨3Ôµ°Aóöˆ@|+¨/4Ȫ} Þôifå¿ÿ6'µ§ƒA®Y5žá9ùwßýääðßÿ=ÎĘÒç.¶iê³S­¨ÞJåèâP¨wGo4^¢‡Y£˜ØÉ’…Vó£Ë“¿ðäÃ4ôYr¯h6mEͼÇ6îªvYþû¿Íj(*ÔOFBÕðkyðu nñJX éF ÉŒ_eëJÜ0ú¥eÕ%ˆ›Ë+Llj éJÜXNcš_Re”%_šJSÖO5ªŸ«IÍOP¥Î-u©³Œ2™ñÑn«L§/:{ÝW<À¥ï¶ØÕ„oñð–¾Ss €-àÒwž®S>`pÒVÊ(ÿõ jð .ă‚9šWAázó!|8cÌIét¥Í%(‘×!:…ÐvÏDiè$’P)'•ß@Z·®œ@T×®š`Î5³D©*š/SOÞjZª–Õð­\¶KUÒã%ý×2uÔÄ:Zo<,#橦[ÕÒNëˆ\uQ_<™oÑ‘mЗ½²Àe‡ÌfÑxfÉ_<½r¶Åæ/xmi\ FæÏ|õBvÏjOûƒgO§ùùñSÈ'WÑ%GØ¢ódϬ=Çý¡éùÙä†dY§Ò„k¾h¸EÆVm%¥ãY†˜™ `¥}˜o`ªh€£YrÕKؤšÎi²ÞoÐAãÞû½Áo622@|˜Õ<ËÁ0ãawÍÈÀÐTákÖÔ„ŽÒ„x‹ÏƵ.ȹ™…6wª±©ñ"u(3°Ô!þT}ø7Ufû8˜\¦YЇõ,£¢$x ¼âÅa5ýßÙá+¤ (lu Öõ¢—_ '·R‘~ßì.Ô¸P Å&J9vv¾u·ë(xÓ«×·«+9__\S”ïɵMŽ}½™í’iNP¦F¨KÕÀ-Ô\ž6¼Ì†Õµw1ŽËîóhŠ!0œ‹Ì鼇½x †ÜHCSƒñ%!³³áä=ÙéÎ8å[Ôˆ# ! i`¨Eÿ5Fhüûû%Ò'×Í ÿ>‹Ò`<“„€¦Îµï½ðcÌ'ý¸…%ÿÍ*Îß.'s<ŒÂ»áP`J“¡ó˜„Xèÿã˃ã25­!+rÉHl[ŽáüA®û0ë=f`êq`Šñ—©oÑ(¶ŠV•\Nj+úûª¢êGë¿£¶ô‡džUs+Qgo\®E…´ |Qwë§/w*ëÍZ·¾¿½ÓÞG¹®·|{w×—Z¿;•Î4ëLGõQ2›À×`£jªÄ GP,Oºû<ÞµúøœvpÝÒ6Ô~Efˆ&Õ µŸ<¼æºÀ© <î[òëgï&%⊋ãna°sT} ÷ü¥ÈP0MÙ_‡Ü/ªuÊ4tWzáþ%ûJèúyC_n¶èü Mì¡t(Ý Œ6=PšåG‡ˆ‡ÜÒOœùYZmŸxØÅòv~NËò×\IªOèd€m"S]së¼/’&ÕrCP|®š!¬Í¤AeÜÜ*¾ó xEp-*@V„_ÚÅc2w$O¯y[Ëx±6öA¯=Tj÷êKêÝþ‰UîìË=NtÁ³¼¦•´C³äM»Þ}a}#WP“…ƺ[*\noÍß¶B.³´;ó )wèV"7=‰Ó'“Oéü¹©àŸªxì ÷Jõ‚9Œ,žfæðËɘ{2݃ɦ$;2!m§u/’}¡´:‹<¡Sý" ‘¢ÃŠ’¥ïö;wR¼‹VÖŒ›sröÖYÕ³¿V‘7±Öjë ¼V4À¹]ñ²+ÆÊþô¾˜T%D•€þ~ä¶ÛÎŒË^Pñ¼:3Ü¢­ÚƲc¿íïÔX»dÂ'®:P‘‹xã œí6ÒàÉzƒ'ÉÃ(ÍâiO„Ä‘ShcJŒG‡©¸Ó³å/ñ 3zY &Æx‹Zoœí»Ža†*÷_ò›­îLé ΔŠs¥<‘ÛlNÊC"“ßþVé‘uîˆÏÃûRÇ$¦™ˆ:é›'xòÝwò~ݦhÝV—+Ã<ƒoä 4É`}&·:ò¥ñø¤ ÛÈÉ;úŠÞ(°´ƒ¦® Êþ6üî±9qù3küåÇש„Â*ú%*úȯáÅ*Ç¡äG—ùÖo{“JÂíj Þ "!*[ñ¶"rd·ò½ÜŒqÏž2¶y· ã'lá<Û[Pl€Z¶àé¨6é¢cŒüSXtá®É-z: ‰R8AÓ£öŸùš»- ämÑ—“G…ÏrF³1Œqì«%‰¬ã¥”o(õ£ˆÂŸ¢¿ ^)ÂòbŽN§&½ß¢¢Q0¹\¬ÑaYˆ—–,º|Á7JÄyVǹхaÕt8Ã%H·}Ú•ßwZ-~Sv@kl©…¦Œ°, üFl>€.·à|‘½ýHôöžÖ³L–5:þòmYUþû¿Gh!òò{&MþF4jŒš…ç+£ Ü…‡/¼–åìØŒg¼¢;Ás–†¸s4œ]öÍpE?Wñx,/£aìO¼Ž*dÝú¥•íl-i„#ÂQ³Æƒ|í3EÉÍ“x0ž¸ò÷ ‚=f¹o Îh3±AGûµiàB2Æ(TÙ±4wô>o+綠ý§@ح̆QƒçÜø•lCó;kè=ª’€Q%Ôä­„ ‘éáѱKv:›;ݹüSr€_ö:ir§G/OZ¼# ‚ ßSGžÖ¨å´sø'*(7RÇ/:Þáy~`iß[§§Û–ó-Î^´hW¦’½¯±‹¥»ã.~ÅwðSÑþ` ×M ž?6Œ5b僪ÜFÕΪŸO-£žìp–{âÕªtʰ²‚þãÛs×ÏÁþIç´õÃÅ|ÞûMSæ½lpñÃÝæA¾67á³¹Ñh¬ãçúÆã5z/žÿ€÷ëMøo³ïëþ#ؼ[6üÏešõ’ ø¿%qt1.†K³Ëa4;K_óñ×?þÜÅžõzVXŠÎÓz:)Nùƒühc£ þÍÇëªþ7×\{ü¨ùÁÚ]´èù7¯ÿʃiK5™á,2IÜ`š;»Â©ÏçAú°"ÕžKŽ·i&¹Bn'¡Û~aª ÝïèÁ©lJçð´{B½¿N;†4xxv|rtÜ>évÚ§h‡EXaÐAè*€ì¶÷·aý¸Ô5ÃíkÒÌNbêw-zWo9£æ>ÆßÖ‡h§³$‹†ô‚†rýIÃÒ$=Ph2q:h㛃ô¼NI•Õ¹&³Zx¢UãÍWÂ`÷ìC©ìžµONŽNèÛöþ¯Û>¥¯Ýí?µéÛÞöþ~÷ÅÉK"†«ª¡Ìé4þ;:•¤I®‚#YCh\‹˜”|ý~‰†rh³5ŽÉSЃ ¤`Šè3sÛ’‹ °àá³EaɆKù”áï±±¥—ž°¥”è‡4Q}Oјº|ƒBœ9›júR¦³ì¡¶ÃtÉFðrWµ´q‹ßEŠ•\J^´ÐH>I¸Žx‹ kð ¦ì·/ cT•ê+U»¡EkMY°~ÔNÇh뇒­Ý˜PÄ÷!¦™Öt6ê+„Ié”ÊCॆ "Œ‹iµ%­a-M|ä"‡Ü0DÈ€‹‰Büf‹µÔGrœÜ S(M»„‰*«¡W ¶jl¦…Çì9òV a^Jž˜’Ð jš!Ò-dGu±DSÛO/`÷dñrfZ‰F•\¶VÒûèÑC&ôv ÷¨•BC?ÖzaÏírÄnƒÎ»Bbä`È&“wÞªVkõâ²Z-‘ÇIüÝB {_I T0ÊÙ䢚µ)õÆz¥2¤¥|[k‘–Üì¿ùtWêµÓ–*¹%/È/rowÜ7ò˜ì,Wö´4G©í¾1°äS:F’pÙ`“sqÔ*7ßý“ü«BªûÈeû*ÓZöC¸CÏ”RWÁGG hÄF¥iÜ98–ÌÙ¦—åI'dÀ.ç³i”u{Éy”忤4‰)©˜Ÿê‰G–0Ù»í¼Gg=oûPÌHGp Fâ%9Y~’º+4[åK¼Hcå3Ö¥2” %•N[‘†˜Û”bKT¼ÛVSåŠyVs'Z‰É‰S`Ïœ‚²ÌÝY”âÛš:iŒ˜ Œi’AÎ<;S/W—85+Þÿÿ#Þ:ýœmõ”ïÿ7››íýÿÆãÆúãoûÿ_㉋UÙ¸ i9—7®@Ó=dôtFg­£ã?S8ï 2¨|ì`H`ÐûYÒËf O4hy@Gæ 嵂£³±[ ‚­¢ãÓ‹ËÑhQúé‹—{{0`­Ü»wÏ<#@š¾Úlá“vû¬ýj{qUKf]I¢ŽF5xÖpºÛ9Ã.á4!§{úŒÁox§ö—iÍ ·“Á…ÝåI<ÅÊo’ƒýP£IK[Ç?±Ñ;Új(‹Ëk½´Fü'Á÷ðïº :Ï.èþß2sÃ:ÒÉbþj‚ïw^ÑKyê5ÿÔÙß/LDý-LôÎÖ¨Te RXÓñpHïeMô®)Ýʉ ÖÄ#¾„„ï¾W3>-»ôެH½³$þç˜Ùï,‰‹¨÷j“P—Â3´/ šky@¿fˆôØ?»wïž´sœžc?£TEF õBZÆUF.4¬0](™Nç+‚ŠÏg'XX¹­¬Üqï†Xlz÷X8‡{l3# fÌ{<]¹§bVîÍFR¥{÷ÂgÿC U$÷~Çó.ÿJÕVWõØÐ>@î4³BT*H,Òè¾ÆÍÐIŠTv’ZˆLŽeªÊÙ1ÚèMÜ ¨AP¨9ðÊ”«Xƒ’ÉmÿhÀl&xÂåÈ%xà[ Ê¡ËþÑ\Ûx’Å·”#ÉýãIãÇfßjPŽ:öG››ëò°ôZ²›c_¿J§ÙéAo޶™Ô. Û)Ba5)n5ú¿jtŸ‚›E6Œ›ßÂÖN.ßà%ç4ˆÙ7s'‘Õ¬{C&1#¨§üy£æß¸ë&©…ðïcž}õÞd=šß*sîí¸¹ç*ÿ=#þûáp…• Ë …*F!†œÙ0Ñ*´QÏ¡ªˆb`{q‰¯ÜÃ~# —³¤³’Žå~ù 0np¢ô)IŠi¢ °Æ£•{dMC]4ÙÓyÄâµ"¶ FN™ÂÎ% ›’™‚x{8d€ú8jÏa.N¥nà2ß‚p•µ`£ƒU•ûVÕ•Ü!EѳÝ!E»/st$¯¤E;s•˜n½Qg"  +ˆ÷ièÚqEW7DÞM¦$´2§ƒ½Xþ¤*GÕ˜±™“`Æà¨âôåN9 (#ažQˆ&¾%]y“<ˆjUÀWDioð@ Sƒô@|“щ¨»€®hÌÒšÜq  w\²e”éìÈÀ²eWÜnÃWiÆÌ³¶rõÊèvˆLü$CæŠÂQ1ìÏÆÔ½éµÅ˜oØï 9‹´’mme)GoäIát–U‡X°L«jOÚ$ØßcË»÷Á|ýæ-•VדּÀ×÷A…L3 £)JÚ\ã’>‘›±J΂¼>™án­±ÄÜñ9•°+¤h"ôÊvÐ2<PîÈ®(XqŸ.4\ äó½†v~Ñ»ˆWÏìQŒ<™Éx=ÃÙZß(£.âH£7Vî zSidÄ.äµs„E[§qÚéùű#èçG1NÉŠíCkßåP¤Á~»~Ð9|yZ/†Ç+øÕ9ìÒ´¨ªð åˆãDW$‰èQ·jQžgɉX›ÅléõÇÎ>u÷2Ö²$³‚°U肋îd~òQÜÚ0Æ›#¼¯Á p©¸é…ÔC¡ßõP²…w*¢ï¼º¹רŸNøþ¾u2ÅÓZŒï#5†¥ï—;Tæ Þ.Z•ɨÿLWÅõ’7žsb¹ÍÉ7}zÓÙ´R6)8Òls !ÅA:Ç™˜@›UŽ1s%Cy« BþdÐÿ½Ífðî5ÿdzgÍ£äV!Ï\:¨cŸ0f7û43æï‚ƒ×K²Àiñw2ÕÌ^kÞL¥;Ù+ÊE\ÏŒ9%ô„ð4¬zM…õ¥> ¿Ã©ÑwUî+ð÷÷xÝ ß=!ó 0f„ùr´‹wŽÅµbRã_iC ÃшÞÅx!^ì€×jËŠÜ úÚµz©Ú|–ÒU@‹õK‘ƒÂw×oÞºî:#ñ)ëŒåŹ-¿´¸ÍzÂÎçÀ½TåÅÐ HšËXäÁ7sõÙ¯gÊ,f˜èÿ£cz(¼uãÃã oà@õ†ò+Ý8„ã[è.†ñØéM™ºÕŸÉ=X„Ÿ9½)—t¥·ÇqXŒÞÔ@‚îûª0û¨¹4çl šžÉ¹YÕ³M0`¼WP{x„DüÚT3mŸ¸žxÅõˆŒfîÝ»Ä>QX:á8CìÁ ÄBåDÅe˜¼¹NZWÁÄŸ ‰Q0Í/MCj^©òÕyÈJkx ß R’® ½j'´îÖR\JmrX©ˆXb!,‰ó5‚g—°Üú¨Ø5F)•mEM~‹Q{C ×f‰¹<“åö(å2MXN£?}&)—HŸ6›Ôؾ¥JÅùøíº›Oíj¤¾È~§‡ÁBT0%c1JßìÕ'}=ÂuÏ^uÒ7{™I_5¬§þU¥Ìÿªê Ñ’P~·ÔY½„^Ð2I^©ºªÈ[!ã"³š¬_Ïît¬XÔp“’a#ÎAIB*Œ‰çѧÛzÝÑ%ãše¦ŒBÕTÈ&eûl®hqÞ”DïxìÙ醦y¿ÛVY8Bc˘ûå^†Ä årÔ\yš16áÍÙ9†u…鎚1MqbœcªŽM S·Ô„›ýºÈ_01ºê½Oƒ,éÍçèŒÆð£€v‚ʨª~‘d&s÷xŽ„…(t¥¹V]õKK@ŒkrOCs\׬ÜóLù6ªÏô÷5€¾iÁ›WoÉÆOxlþ¸µEÉx¿fãa%›•q-Ní›(¢ÅŽ@@€7o)'3Ô™ò${"JËÉO¬VíÍssU)Ýÿ>KÜÿÿl#Àrû¿µÍGk ÷þ>¾Ùÿ}…Ǹÿ?ŠÇ°°ƒ•yï2›¡õ…'1z«þûà`÷9nO¾[¯ãþãƒ7Ki7éaxé=€nÎ0ÁUR-üSŸ Wëì0 Àc€ë-µ9 ç)u P„®kÏs{o‚Ö]Ýô§ýAiu~KïÒ0p.MžÜjœž7s÷K*®Ð ®óc®†hÂa/„xBöQÝoµ¯8WŒ;Ξª2o={’{ÐÕ¢[²üx'úñ¿0¯æ¬ö_’A}ÐôI——5%ë~c`é>õö P¥È(Dgw@õÕÍ5mkÒ„é.¤ÀWX±Šï$‹4ãX%6>4ÿ:­~ßVšuå rC×Tfî•êÊ:ާç¦kÞ]çg¸6ŸÅÓ, ¾Ø/Ý(˜QØ[óÞE ÎæéÊFCÉPÈÕ€qÓà ¾§°Ä¥€¡éŠ\i§Zè+ÜIiÁ×WH¾uE\Þiµ*ÝzëàþÂh­Ö­oîîT&½ô·ZT~i™ |GŒ@îW®õ‚¦ÁÊÎŽ›?¢žìÿpøÇ-Þ 'ódö¤ßŸ]ÇÙû £°IçÔ9ãö»ÓÆ7ë¶Çmª­†Õ7ééI–ð†c …¡¯íÉå8‹ÙåÅw¥ŠŸôƾ”/âá¥F‹Ù~4FX¦^’ôÞ³~ W(}"wo¥·•• @ÝvÅ ˜ŠBB×r)Yí ³Ë)N‚¤ŠÚc5D|(ÎK¼…™]NaœÁ(±ÃK:mÏzççì–äié!ÓH)dšð¡^r@>›†^ {ç*ˆgo uåQ`y„CŸ˜Ëè 9:‡vÁhõÀº;è}hAºê ÎÛ§ƒ{ ¹Sû$FÉÝ\«;j]-8:?¯á/°üèÐÝ%³u $厵:`½±!hø6_m0PsK=ÉÅk{q¥_ÅwÿìNù+>æøo¶¸»t|{ÿ¿›MôÿúÍÿï— ëß(ÓÄøüsòX0ÿ[ÛØÜp÷ÿðÛüïk<âþ¿QÓÁǰEE»Se¥%Æ._¤Ã”6õ1TvÃÍ{úaïWì½rË0¤Ñ†9n" éëV§õhdÃ0§Ã4Û2¬‘/Êu3ºD («£³€eÖ£ÛT…Ê,·¯ŽŠÍm¥>®PùY©0¶‹\æ®°mûìÆ_KRvÞAƒW Æ±1ÚaÈ1&_#m;_kÝåj×¼gX.ÂÒš&‹º/X:Ž0JQOCŽ-ë)_Bõ¶ |^2'aî6Ðäy÷ ¼D=Õ܉ÇhžÇúÈÀß“hšñUç¥ãÿgGþàgÿ¯ÇÍÆšëÿëñ£µoãÿ×xÄü_Õô§8÷²¬yˆ61Ó½Yò}ˆdw]ÚE—¢Sïú±_ôÒ ýæ-%ØUOÔ¦ f8 ;7ÓÑt[¥¼Šy=ˆØ8ê0:ïeQKG„¸Ýtʼn0¢ÌŽ~‹étçOä¼ Áþtvx$¾°¯!úJމøÛöþ~Þƒ¬J:ûµÓ}qÖzÙ=åw Œ¾ˆ@hü½sø'“‹Œ½Â€îlï·wq¿Ñ `pY²#9zùüüjŸ¶¶Û§·›w1l²ÞлR«®’‚õ†¸q¾Ô6ü2;õ(“;v Ã?¨yÓõβ!ÿXêÚúeÅç}ÞÏŃ ¹Ë q‡uÁýÞwqt…»¨rOš=m‘¿ äYõú"çB{¿2p¤›´PjÆñae_;U®¨L¼hÌË*J¹–'^Où½ÅÇ“&“|iíb<íñ÷ª$?ö¬ëO£ø†gU_4B‹O )¨HÞïg[[g:ÞC®j„Àâ¡tZûÖÔÚ…Ô°µ›ið[&‰ö¯*Œ«T |H˜"{L Îä Nàe¦«Tæ¼L½\5WZÔ ýdª–6Ìï_0 =0ù@R¡ ÉpÔ,âÊÑè§ÃãÅë”v6È8‡sg¾A¤­äÌóÕ$BëXÒ óIoðˆe+ô Bž“qÊC3r¹½@(Fp:*Ò¹·…årŸòd:³ñép*™ ,ãµB‚¥õù%­´)¡NDä¬hênÞ WC&Bîñ‹ëä{¨P?Óð_îÿ,j胙|ÿ) D˜üTù_²ÒÃP¢‡¾äŸUòÏÞôûOŸqúS/õû?? )>}éOóO½¹?U¹{ÓïuJ÷S‡Ü‘»7sU¶§þ²? Uî~úÏ‚²?e÷c?Se÷¢ÿ,‰ß÷s_rWÀÊŽs÷f®ÊîÝÏÏTÙ d+«Æ_1? t¿Ö.œëgnƒÕ,8Ùw_´š½—â:U9þú!`¬˜÷uµh-pÓ²œZ”»½×ú«°|FL l›5l@áø4]äB]–ûŽ{òt ªÏI»=ÆÃ¥¾¶8§ÄpP9ôQ`ý5nEô݃ÒÜ.tTVtx¨¢«:ü“¢Ùw¾Y„9À=†„ýê+—yÝy¡MöuAS@Z‡½ƒ^›…MÈ­…¦Ñ3žjè»`?Ü¥V¸¬eÛdu´Ž(Býd“Ì£xf>£ ¨‘oà:-šu¢@:zP‘Òl½l\ÃÈb@× ¦Iž1ˆyÖ³jIÅùF «à‡R.{Üu܉rhß ME|‹åb¿ÌZ節[b\ɈŸÔÕ,èæ©>äìÕªÄ$Îq%Õ Ň4¸á×jØ}XÒã &Á bi,¨÷úúëõ#~¶îù5Õ¨vKM5~a5k˜ † õ:Ié)¬Æ¼H¤žQ4=F3üéÑ~çoâz”Rj~d`Ž^f!s`å[FiÈ–4|ž®Ô­¿¹pU%ý–*Í—ðؔ™Ûÿ£©§ò7íøMÕñWtЕ:xÛD)h@·O~‚YÐ\¡r4€ñI÷×!¤8Ê*Õ{Å&ÝW©(¥j¥Ä$6MbÓM´v-øKዬpöÍjñe–.PÿV&~£’’$T7×4$Ð5E.2,£ñöH¬V1Ý8ÆgàjÆÕOw{q"Þx¬XÒ|õ%Ü ù?î9¡P¿ˆ°*·ŒwÚµßÙDTÿŒãkrÈGêÌôW"k_ÙÇÇ'<ƒ4§€éAQÇ}ý`º/%¢š°Sm7ÍSULÈ"fÙ)$5O”׃ž ­XjÄzÍæ^òEø‚×ñøo,±]XrB[Ž<òðy¶òßáYyþÑ?ná ÈšóŸ·³ñ_Ÿ<½¿ÿýNyþéiï]¨5}&íå7Ç{áàb:ÏΣ0–xKÜÇqÁA8®Ä|û €˜€±/ND°\DIH‡%ÿ{ôHìÇá4{°D³Xôž&)UE³ÓøëiãèàoÞx­¨òNtlÉYÑ|g¾C.ý áGø¦rîlk˜'y0O Ìó`þ¸må• (Ú·Ž†Ã.dïnÚ·7´*¿jOÌùޱµ¯Ãnf±ÿ¸9¶Ìû¨ñIØÍ,ö:Î[Ù nVôVöæ…›•ÞËÁMàåà&2àƒØ¡ßÂT6XŽu©z~®7Å2G#òÑŠ}Ù=³.KóÚÞŽñ»†ž•Ïæ3ër„ô¤U|æpÙw‚‰­Â“hØÔŒå˳ Ï¸å «ÖˆH‚¹:z³]UøÖWŽŠ@¼âÏDÍ/!Ý Ž—“P„¸çŠª´¿2‡´—ïÍø{ùÅùs}†o= ZëÙ$ùÞtK›MÉöa6”û6oŽã¥0'¤ÌÚ”Õ7÷òlžµRªp·ÁÁç™ÒNi²ßÇYxßÞ¥û@è³)ƒ¹ªOèb:œ*+VoJÄ‘Ã/”-š{ÿ³' ÷Ï?õY9ÿçC­_øü÷ãÝ'éøŸß}÷ô>þÓ<|ÿëýÎQëèyõ&A´?ë&ˆ1]!êÇP4ê­G4$È!ÙÆWò²7°#ªmqX)ç(6/ív7•ô ÒèûÙ³ýn =ƒœ@3hOO‘±"«“°ÛÛ?ê¹éðKZÆsA¤/‚úF)lȸWQ?R0’Bð+¦ë#Õ£I¢F¢îóöiøú3ùò×ÓýºM^|»þŠÁÚõêå™N54ùžïö^¨—gêñŸÑW?u­÷Cû»þñâ'ófÀ_Xà/lðg?™7Ñl ÿ¥ä‚=, –i¸ÈlY­(ÅãQ°ûõ:ÂK[¿K™Ë‡ýÞ¶h¨] j׆ڵ¡ö,¨=jÏ‚:}¦_ä§ãÿýI½ìÕõËÁa¶h‘U¶–.RëØ¼¶u-óvì¶–‹h”¼S”^6~êuN–Þeþýe½q’ÅSh–”Æ95ÒU›¡÷ºõþWù k|¯[ï æðäoßëÖ»‚©·^j|¯[ïæ'€?uù¥Bšß+Ÿ+Ÿ+Ÿýg]S&x¯[ïºLíôL¡ðGÝþ¡À:GF<ø^·Þÿêò9˜¾3\½l6Ϻš9þùWçg½ëþtSÿê¦þÕ"õSó¬ëürÓl:?Ùð«îür {.hÏ…í¥Kë(8 ¤eÙ{Õõ€^Ú°?iغá~:)æ×«Ÿ¬W å•¢µ¢É›Â6é¬1n“„ÆWM‡~:)æ×«Ÿ¬W å•’“µ³…é ˆœÐu/–•Ò–*µÝP¿OÕùr$Sž«¿=õ÷T%¸= VðvNh`@´.¤Ú²×D'Æ3ɼrhü þÄÔIƒ‚7•@ùüU’ýSMHu âƒøABÈ¿_«ïòÀÔ„JÑ4ÔùAa|­!UETçúµÊNq¦«)‘ö„bCBôK%ƒžŒ‡`´°-- ñ÷FçXUV³wxÜí«ÚÒ_ ™„](óI™ºAoà³8‡dÈU•Äx²É®+‡0Y&w…*7•q7Ì þ©´óêtål‚äp’Ž!ʱ̪= TsÉAͪ<«,èÏG‡3éñ®ØCÿã¼¼Ù‡R#žû}—8ã'•Τ‘1 ¾y=¨¾Èx¨™èÐågz\KºÕ=Áˆ‹™Òàa:.µ,×Qý§<@¿ ¡{°ßnÔo€¦Ù•®:Ì$ûœbeŽ£*ÍzËb‘­Ó¨*9.‹L<Ù¼*þ@Ä™6‘F—Î,òb7ûÍ“³ O^fì`„¹ÅI•¡²è{Z§)‰§œyÄÙI‰UšQ}FYl’,ú b¢‘#h{y´Œ{.Ñ ª4ÊÜ€Iœ–xT…çf’!ejù9Šv¬Þ˜“Ý›³"½v©a¼«òÜÛ+Üq8eêyRf—^"Ät¼dæLd-5Þ áLæUykÓMëmZíÏf¶„ð6Wþ”T­€ae1²Ú,´QU]ý¤ëŠK°*c“Ÿfa“ŒŸñø9ñ,e•$³Y¥rÐ9{³bô]&ªõ_0µ ”œ6<ÍŽn¡òå˺hµŠnÑ`oÓ’x™ ·áË,AO^B©Rc$®Šý»E¿=äЭ°z@?â0aDû·®SFâÉ9£ª3Ìp XâöJÕÀ,j–Ò¼n΢joõKjÕ°ªaÓ >í—ƒMþ愃Ѥi†RXÍUG«SV›¤Êk]¿”Ô/½ä=-Ó“ÕÚ™ASÏCFãêˆg"ù…¹Áü†Œ%åK&½qI>eŽÓ4óQPÝÒLDº4Õe•-0¨·7'€~΄>˜¾«â?7C—ûår¢0âa4¦Ç÷ÖeI<ÅÛh²tílzîè tD<àwÜèÖ;|•@uç½ÁÕì#öY¿OääŽ~â ÇÚ¡fß­—L’ñä‰Ö)ñ<áõM’EÇæ¢Pˆ?Dy[M/ 0Üi9±(þ­*¨ôú)>Dg×>Þè¤6Žõƒ‘ä3+Òi²‹Áf€8Ð «žâyâo4 ³Ü háß`GM§õæ³T—–¸Ë"¨ÚÍææ¦jA…{"´²”^ëèaÄ›ÕÏZmåuh¼(#å‚«ò¤,omÅ´qÖlã«~Öúé¦y²uºz+˪UYP5~Æ2+‡ö`6Œgãá éßê²ëF‹®|ö"/Ÿ±»Ù,¯©ñHõ3–d«(áÏZ¢åPgÛmõ³–lRŽkW5îbfC‘äèvpŸÄFY¸ÝåÜf“®ÌYÜåªØé9ÌGÝ|±—Ç)ÒÛXüåe@½ç6ƒyŒ99l¾8tšz~FÞŠøô5ã'¬sY£j¼íäg¬óšô0")®\OæâÎR¨­/s¨M’AB¬|ΰ:ÒS‘[\®ÌëRfv‹ëÑÍ9Ps¾[[®ÊˆKz‹«Õͳד½[Y»æåÂÕ›¯eóâNõækÛêþ5íô¦î&ñ\ABBN%e®Ts<ÝjÂïÄæº e}à2^l÷^j÷^j÷^j÷^j÷^j÷^j÷^jxï¥vï¥vï¥vï¥FLÞ{©mT’{/µ{/µ{/µM69î½Ôd¾÷^j÷^j÷^j÷^jy%¹÷R»÷R»÷Rû×÷R«©T^+©Úd{“¦’¤±L§‘ÊS‰Ò«©G;‰Q:Uçi9E3÷·À"/\+¨ цSš+;ÉéT•(ÍX:‘æ’Nb”NÕåè÷í¤gú³ýÕÈYú”زæé𯳅ýLKºo—ì™.º_XßÙÆ ÎwóÙ!ßÖôÉ5ÀâJÚþ9iæ¤h‰ó&¾I¢ñY%ŽÒ §é´mYM¥ÿ¤Rm²i7JeuS nº]6†©Ìò&™Æ LÖp“ãN’»²V*«{-_Ú"µ$ŒzX%âV¨J’º—Z&o„ZM“¯øVɸ j%â ß2iît/¼4œ¶>ÿÙÁNîŸÌ³2þ #_:þÏÎ.¾§ãÿìÞÇÿ¹“çß/þ…ñ1ñ¢é` 5#tÔœSt„w¦Ó¸Ñ[ _ÌÞ??qaÔeEgÑ; ¿DÓs¡yS„4«ënˆpØ8¼i½Nû¦(>‰®Åz~ò ÆÃnô[˜è˜ÙãßòÄ~K„:·Eèà–AõÝKP­·EŠ«û¨-BèÙÓ æ›êŒ:Ã`Eâb;?m´"-Ó›–J…\Ö!«òÕÂI÷ïMp|Úh-ÎÁÍq2}£Œ2}}#¬<êG¤ÙŸñ#ÓÞjvÄ6Ç»-¼„%EѬõU•Êodòeó}b~–FKå7° 8ð”pð©E´tŸ›%ÝBP ŸF×V…¹u5ù¤ªÊ)ˆ­1ss$‹ñ§eš“kJ¹úd(aÖ 2›iø×èž>°·ë6 `ªñ>}ì‚¢S€©V—¢ÚM¬D•¦ Óµÿ—$ê1M4]oÛ.¬Ô^Ü#pÆ“IÛ‰o×À_©¢¸ž“°V8èÊb ÞòOèLÚ©òZKBV¨C‡Õ'3êóðŠ•§$)›@ÑèL•ìèN!‹3Šqr‡K²žì>yj'â¤ýŒnÙ±¸­7ºâz<{_Û.‹‹èü‚tãT¹fA=?)«(á/ƒñ2Œk¯‹Û«çvéMYü.fðœ/@ÕgjÜÍU#5·‘f¨fË)L8j‹p„ô†á®ªó‹«W1iLß,¾ƒÅ"¸Úþ¨(b‘š¹RØÛ•bxº—Có$Ã]Z*ˆ¿^Í<94ïVéæoäðô±”ß(9t2màM†IUj47§ÊŒøÞ2ur'eFµ“Sè?>ÍÚ€ÞºÚ·ªÝ#"à•€¥ýî¦ÚQŸ~Š ñó„ÀüíÀRìw#Ÿú^) FøÌ~ ˆø…àW_Rt [ŽTuŽ*¯‹­OƒF©,Š)E(i)Ãb‘5©—ÞÁAEêªúh¦¡nÈDÈTŒ©×ÒI¤´¥— rxuŠ\ÿÝ0©Ào½‘DëÁ¼$­8=I¹IFõxÐLŸô$:-ÕJÇB@US!ðJÑçÚÀ¿šêkÓþJ¬ã׃Žýõ@}=°¾2ÃøÞlhf–àáÕNÑœR"ÿÊÚj’ë]mH‚ÁÛy²èè¤=}›NOz“¹IÙý£6p§@q÷vl»BMwG]lk"šúh[£oÿgmeHûÿ$šÇ¿ÿRy •ÿ»'OòîÿÂGÛÿŸìÀ÷Ý'{Oÿxò¥²Ÿÿrû¿]ÿ‹àË4›×ÿÞÎãíûú¿‹'Uÿø·¾_DIøùû~êY³ÿ··½·kíÿAúÎÓH¾ßÿ»ƒ§øP¤ê¯à[ðO¼fS§*¾åϺœï°uÒ•øEu-~ãkùðFZm×uïßkI7 ÷(s«r .þ]oê=4¼Kcï–º¼•>žÆa‘˜/‹E ÿ%ò†\¼Á&A2¸ ;ÐA%&áÁl dåE¬¬wÅf­h¤Á“ ˜'.ŽãP,,ÈãbS(ÝÝ^ò`É$‰knzú Žå¨tµu µ}“T«B÷†Ë‹¤Ü/Ë“pBw;«ï5L©ab­# v,¨†€[*§V…\Z®c(gŠŒL¨aÀôÕ”š’¡Q𡦿h”ÔFk9j*–Fi–š†§Q\­ç¨s|zT¿FGÞ²Àã£ïFw‰žµhp@k ¾&Qj İkçÐëìŸ\'(¼HòÈ_j‰–ZÜE6Ο;×ð™¼#ãòt6—ˆô™Q8­f@jf“Øo£×w™®4§;ÏÙ'… I:å“5…UÓ¨µƒŠZ&L‚¹¸Æíû0‘Ì õ|äÕ3¶eήfr­Éœ=œB¹HB«˜MóŠ8µ…bÖ¸} …ؼòFûqô6_•É_ˆ(N_„š…W“È\,($ü%25I*5¹…q^8 Í$Ôdª-°L«#ÿ1‹Ž¤b>{¨Øø‡§í^ë¤í!á¤h*T.zëe«ÞÈR±¾¯¥qØkÃ'™=ü("DÉxѲ ^´2/{­Ýæõà]ÂÂ(‘Œ˜„šLd‰²B°Ù Ë°ãÅ Œ÷\'“y9šÌÇ™¦  jØ0;BÂ×$NMáÕÙ®x÷¢qYéîEãfdãöX2Ž#Ú â‘ƒž-¾~ÛëáèNÆ•CÙi •„ˆ&z£/Üðs “,él2ør¿†„wx¸-ꨴÖ1Ú韨DUò*QÃ\¶4%JY†½‰&³¸ŽjŸ¨Ç Gw4Qw$R34Yw$Žîh¢îЬ;’”îhî 9‚Ñ2AêÕ‚iºòºCi Ö!w«;\­1ÊΧG¤½jc”R#˜¸¹jcd««‘T£5jcÓ™bGÐ\ñK*‚Õ3‘u¢Ñ¿ÂtêS'S늰yš–"0³òÏÊÝIyZ3Ø“òŽÆ£WgZÞ´´„ÌB5Œ´¢0$‰Ì§,Ö¬:¯–Z=ØzdDcoŽQmXP5f…¹ç‘&þ³—#Ò½ eJ4èuÏÉôàðäÚ+‹Á`U-jèšÁ©I¼šD]]›iËæ—›j9ZÕÍèfs­Qv²õÏÓš­Ó;bô'OL<ŒÂñO<þÙ:óŠpg:³#Sv²ÏÓ˜Š`íV5fŠM¿ÆÜxÕ&×lHôö5¦_¢¬/3Úò†ÚëÖ'{Žö¹‘öúÚá¼V=öþO8‰’/±ø û¿{|¿ÿwO¦þñíðàö6ÿþÏúý¿ÇwRûOo?½ßÿ»‹ç.ÏÿQ#ÃnxþÏÞh<²ÜïèTÖ­œ¸_ÁÇW³Åpºð¿âCª3õ>†J…š‡™GLeø üoÃm`jæ¸/ªÞ†²rÎ8.·¢é(ºÿßÿ'>|?ü ~üQü¿õŒ ÛÃlŽßÓÊ?¤¾0~ÏÀÿ?™¥ôá%ÌýT0€ Átè¤DÉì=%`ojq%h÷gIEŒ0`(€m¿Çóm¯*ïA¨¦Å|° Aö ¸“Äì0¢jÇœ3¹!¼@†²I2“Ä,rì Ñx<ã’ür.(È!˜Xy‡²ˆfñØÅ@a©¦©q%»<ãB’—«j?‚›(®$´b«P6Ïð[_ÅŠáVBu¤¾FаªÆ?UàA|+v¾·zme9‚F„éu¿DSgO®¨ÇP­ ËpÁÌFÀ ×ðàÓYVI‘¶ƒÅyˆ}…KÎc"‚~ÆŠJ”Ä_û ò «+¯$êûFÂÜÿPq™yŸ)$f<œÍ@wƒ;Ã#JS£ ÓçEA›mâÏ‚Öáô©¸êtÝ'![Çín€£±v®Ç¼áÖ/ƒæaÄ-OOí;Ó–’Lk·RûV›W·Xã¸e'(V, üð„?ôÕïmúͬàHßFð”àIµoAw"ààš÷Ù¡ ó·±]€8]€œò9E.˦ Ä3äœaQXÝÄïÆ-&îìŽÊSíb«rt|b)hø%uùÌÞâ·àásüþµ¬é¡¿ï¯çÀ×ó¤\5§!Etr?ªÚu$ ¤— üÈÊúNöC/r3?g½áI»~ìUy¯Ü·±‰ Ÿ„tx£¢G6 &øQþLûZʆÿs09Ç éú–Aêä`ÉͶ³ó¥4®“€²„öÛ¹”h³€ xj9Œu½ëpGŸÕNÁºNfB†é•ªÂ'BFÈ©ê5Œ«ÜG¬¹Šš½û°ðÕ>øqíƵ)Õèzœyp@ŽF°Í<Èœœ“3úˆ<·Õ~Éíe`{¹°èY’¢û"Gÿ‘[Šn,‡Ò„å›Ó8à[NÛÈÝL²ÛÊ*õmÙ¨+*uÝîK†ƒ½:¹;M6òðì$Y˜œš‹™Þµw1!5wxp?‡¶¦näPDk`ò´÷èÍ||gŸHŒ¥"/ÎÉ‹Ö5ªÅ\z(¤8€«AZGqp®bOj,&”•Š>›¦3éàÓ™U*·H.ʲ¥) ZWÁSüس’ð—VƒQÌX,D+aYe©$½¨Å=ün… ˆ×}˜OÆKœ×p!šÝMV‹ßšzÉ‚ðŠ×ÍÏ5ªœpÕž€q1š†dé©é5¿N²¸Z 5˜M&¹’Ðe”<ƒU÷ÛU@&Èì*(×€Ps¦¡É,€Íð¿aÔ»ÿSâÉ-î­Þÿ´íÇéýŸïîÏÝÍÃû?7ØöyN?a»‡v{Ò{9õ(â8œôÇŸ´Ã"õVw¿Ûm>k¯Ø ÉÛ ñí…´ð•ôWãržBÈÛ&Ñ£ÕF;ؽä^Å?]Åxûÿþ­vÿ5ýÿñÓ';OÒýÿéÞw÷ýÿ.ž·ý_hšÙ à®wû5Om|ЦÖÎp·r’»/lï^,G#º€Éw_œ6›mÏ ¿© œ]ÛÕämboTˆÕÛÛ7Ýi¾‰~í ÿN2JÖýv"|ÛÈ+•0p6ÒçñÍ5³i]f/YQ°ö“G³t {·Jï/sœ‚ª‰¯£T@å/³W.„Yß<húí…—Ië¸2[&óeRdåØÙßœ†ïÇØµx3‘w&ªÔ$èÇöö§Ê¾÷qwnÛYŒáòD¥Ð–sRø9)|¯ŠÓG;¥Rš]ⶨ@¾ÆlKßsî¸?ö½f~ÑVõ÷ª”©é˜¶øŠb4_+drnrn.Z$±ØŠbáçiÁe×AQ­ìD¡\H‰‚ÒTž;vb4Eï¤ïÚ铘¥k™½ðqêéL¸šƒRMØæ~‘ûŠñ²Ó[1.ï”cŒ;ƒ¸sz$‰!³T^3¾ÚœÔ¦Gñ¤r0Ž ph'rWÆáå¼'¹/ö*íýg6be«Üٿߢ$:ÁýU[ûDPoí›ð£YôUˆÔGä€Ìƒ:Ä«Æ, EhÊ£bé{ÙJÜZÏ®—U øjyzÙ+‰¥0Òà¥:*R«d&‹…ß?K“~·‡¿/@ö'7³ì‹öõ+ZŽƒé®}×ì²kQÝt‹ßR¤™J他Фnqޒζ!ÝQ~6nÍÞaF­aÑT"u4šúŽ.‚Ób\Ï¢lšø¬[OºÂÉ/€º- ªbÐq@tù+×#Á¤ëP7B[ÓFâÄQ‹Æ•Ó$S mø¾b,ç‡X.g¤L×ÁŒh–ËhmÀZk¿wyZx:-G$-&Q2ËòWÉlCXÎïu½à/vd6y^ÂtsI$[Ù*´]Ûº²U¢©mõ%¿º ·w„!í«@·ÑÁ¨¡˜Ê`ã¶P.6]YçÁ6%¢í¤œq•Çm 6*¾äÕE]½ 3’3ºÊ-œuÔ…ñPÛÔWœúÞŸú‚S/rROeòÒŸþŒ“û9©»Ÿƒýª-Yç¤wdú"']ÒŸC¿.ésè×%ý¡Ÿþ©Î2G:§J<Ë<ùœJá/s¤*«n)ëN;]À¥š5Î¥öÍÀO|Úë™Lì¶“Ì\Äïs’¹˜ñEN2WrÜÏ#Þ–ÔÇy °Èõó(ÈŠŠ‡9Ne–ye8•"XæÉàTŠp§j‚!ܪߜº™Vu°#›Õ`ÇÉÌ€¼R ï%ˆÎnä©ù‘§êG–p$±8“ŸU &›¡¯€#o é63ÜÔj­‘›™N==bINsÒ¥ôðyø`´Ì9n÷d6Nò¨He.Äq»A³q˜K£!iäA=— Óó\˜î ‹>O^@C‘È£ %ç DÉ#·°GÏ™ÏÑô“T"T âoNR”ü @¥I†ÞÔvãï’Ëß¼éÏ{œ~žøÓÛ2}œ“þ\Ò?—ôu!=eôQÝä†ü;,¯þ`'U+PSRR•P)¹ª¯N¶ì1Båký¥ÑþÑr4Èé‘”v(5ðÈNŽ|nèÖYqCwð±NÄ2äHÒ˜æÐøé˜€ËÙÂpxÊ}h²ç+ˆY>È©†ÉaõHr2ÍãD¦ç%çue {Y|žä4$@˜ pª rJ™($Dª”xœÇ‡Ôñ8¶âcœËG[ñ1ÎåCêƒxš—Í©œŸ,û¹§ "'“Nã á$àTAä1ÚÙç\A^aå4gœÓF» °ÈèÈÆµÈk]ã¶ÈëÇ/ytžÌÞMsAþ®@~óƒÔU§æöúºîöÃü~_WÝv˜Ûoëºãó{nÝtÝኾ[WMe˜ÛV꺱 ó[K]5—an{©ë3Ìo1uU]ÃÜúª«*æÖy]µ«anÃB½] ´·›öRC½Ë’í|˜ÛÐDg·ò³ëì¿ÔPùÙ©Òåõ 1Ù­(]G—n!K§>†rÇ=ùÍöøŠW²žuyÈêÇNvà¨ñ\ÎcÎsNÄ2äXθf‰ ®ØæòQWŒ s9©kV†š-†r%#¿9’~—DsžaªÉ÷$=ûNCéñ6¥þm¸º&7\I¯n E] ê–Å|vŠ3ŒÞECZ;Õ[²ÕDnu NÈ2F“YAÇÒ”4ûÌe^}tXOÁÉõäT#IM5tºY“ÔȪӥԓ”Ì­ôS°ôCÈ©Jrž“ƒš©$j¦¢‹K naù“;ݶg™gz"Zq%ª«¡â($-ri!TWCåÑ‚6)iACË¥…P] •G š‡¤õžK ¡º*N-*|ŠnäÓt#­`B Š0Ëdë@u5TœúJUS?Î¥…PZ½æÒ­%iÖÊ¥…P] •G«û×NOÕù?I.5‚븓éé¬ •~qψ㑮€ÙoM&úT›vúQ±P>dÀùJ3M~|Ù¸ôû2iòʵ‰þäὈ\L†£8 äòÍE„ÎFê³ðN§¢?’ ˆàat¶&Ãñì3Ü*>üùÒí>~\ù.í•ûP½&“pØ]Ž0^N1.Ë‹KðÊcå‡ö!sf³ŠŽrVfO+;Oü¹©‡\E"9r‰S©øæÔxÒQîSñHÀ¤Æ {ŠÏï ËÆ9,¦ýîg[¡•ÐÝ*R«PY> SŠàœ¡7E|²·RžÓaxÓ²ôKëÉã¤5_„(úšÈ+Û®]ßOžlD4æúÌ!º[­}¢(y]PˆŒnKH5K²Þžn¯’5îél®C¹çð(IÆ:RÎZ?'ð±` åÊ#Æô(Ä\A1°þ™¢¢Æ¹f//0ˆª‹Ž—9ÓÚò5®XI6AʯÕdešñ`E?Èá!¸¾sއ.¿õõ ÿµ8öÇ‹ð±ÎÞ5c_Ž·Û †>”âDPòÑ·Ü2äĽðÊ€>â Á ÿ¯%„œøi!hG³n\º™@Fÿ­"/&Éj‰Èöñ "ùwh#ëâã{ÔÝ âË]_è_W~˜SÃ7ë`p3… ¥¹)®+$7’ŒW‰•þ†ù¹œYküuõ«7{sØÂ“†óüÏÍ(ì&'ÃÅÍ œ“ÝFQrr8Æ7/´éžDò¾ÆþÐâÆüÝtLIw®Ü€Ê:M–íXeÈ‘J,C\«¤œ|„ºmJÈkò>¦ÌŸ˜Ýhþi¦#¦e¯NËçnw¥8‹¢g:(# º‚¥8‡ÆÄ?¿ˆ¿ sh âÙr1] thDÓ·@å†a ¬SþöN —p!nþñ½xxWïͨmRBlQœŠpH‘Š*jÅ÷v1ÝÓævÌÙÆö™m™ÏÔH|Íä`µ5ÂØ®v2vê–ØÆM V’9 ˜ƒbæò²’ËLq]<ƒïSБóÔ7o¥‹ØñVàÐçãy4‡DZÔÜÆ«ö£waõ¯:ÎŽäÄ/áS™¬'"óøÆH“›óý– ªÕÛ`}*kx§°B°b:ö¦ Bš%Eô¶feöüJü›TL¤¢d TowÓʨ§|´–‡æçñ0šß” oÔЂê]_<^èçF 5ï+c…š×ü`¡òïç‡ 5¯ÿí±Bíø“q²ÃÛ¿ðæ÷ÿ=ÞÞ}zÿß]<žúÇw|ÄAââèüóòXÿõñv:þãwßmïÝǼ‹f›žú=¢ïr¸àGŽŽ)(#MCØ:éžt§õã3Üa"ɨí©0‹v@@¾Ðý~ QèúV¼ñE@s ë;ó±UÁÀ†W¿'Wóf4Ãå <žÃô”möÑâ ‚AzPm‹K½}[ONÿ¿Ãû?áíñÓtü×'{÷ñŸïäþ¯@Ãÿè2ï‚ÉûÓŒn˜§.¸·kk‡ãß&³ár"…eŒ8ˆ0 ßËþLë>qÎa b¤ÙTºiëÁ»P ³ùו‰€t@„Læ ïæì=|žÏg‹D<}Œ÷߉aT “ÇHQgâ@%3Àš,ÇA…G S䧫Ĩûã±J¢{¡Øè• &’ ¨X[ÀÁ{ö*‚±zÀÙûÙâ-3¨n“h -'¡]@s~PyñWw,@up%!i³ sØz0±%b€âË •hÀý];‚YøVá1ÚadôÌ{´`b b'—³™¿]!_Á¹Ñà\[DJ,á ëA$×»äFÛEEjÅÙ%î™km5#I,ÁœÑ!Þ@ÇPÔƒÙdnűý©×8êbèÙƒãÃ5ë6!r5'*I vö’@1Þ1>òæQ»ŠÄ»pœH^‹©VF£áKÀ±m?üýû’€Ñ{Ö†«:¿!y—–t)±h&¤îV*¤nª”N]¡"è:tqô«è³&©#“8ÂâV*D¯ ©N(tÊÉŠ†îDç…D[ÞNò>S¦P»öjë&ñx9 ¯@$ªê]^–çV_)óNñ{•X‰+F6ƒˆé“r¯2/ g1ŽbiK5©e·‰ÈßbèhšQpOu9MaGxYf4L.P9ɶdDƒ³k2|3¼íªå LþC÷yN“Þ@>}¼”æhÁøñ(¯÷vËO¿Y‰§›Ì&RíõðM ¯ã7eœSÔ°º°¶Êh—Ä.‰Åàè&®f£ù©|õ%΃ÙüÊmø¥ˆ¦X4¦²ÀW@’åÕÍ8G/!?tH0Ó§‹RÏë³7¸D_ê6ð|ÝiPä¦Y,•J9¥C¯ñ„bÏÐÃ![ØÑF¥mþ“‹Û4åÅÞ–[`ö‘'Å^â…JN¤M'ÚŠãÐÓe‰÷GCÆ•Pøò"®Qÿ(G5yü/Ìg„¼Ì¢À¾$\qФâTå¯ ò:©`Tj5™U*\,B)F5n·Ð·ð#HÄÅl<Œå÷&ì.Hf-ÆóâYyA7—-,5EÉ] £X»Å»+Ð5qX£áú$¨¼WðD˜¢ èü”“DwüE˜Ð÷x|J5d\] g b ¼@ú=¤“9\ËÖ' ÏRìÊ=nŠ #g«S›mäñÎEº¼6õ%YÒŽ2:-F•ch•ÃVjSÞÙ¨QíPä¡Ú»•3cP¥wJ RU+Km•…aVV-MŒ¸v¹iN!KBGäW3{1](ªjb¡È­¢äTåd¾„ÂôAA|;Œâù8„´=OÀ¸ Þ)&¬F˜˜© ž†µ±Ëÿ%šŽµ[ÅÔ¤-ÊÎ?T.K‰Úi.œ½™†Uø³î½ê¡ÙÃa1)OËÌÕ·X}Ê’‹æV4Z;â—âxX RÆÓ’¹U† ‚òl4âû€düâãÃô5 ¼á~°‡5ÆÇŒjx˜œrË“šàÃä¿ô©'È0š±oeyܽ´•()ƒOa]íÇYŠõh–„UÏÙbjSÚpS–íc­\½LÑÌt/»eaœÃ^²‘èÆ UƒÊà¸ÕÊE1qÚ-ÛÛ ø –)£,ä?–³ïWÃ’µ¿‡bMô:^ÈÒ¾hy ÈÔ6*žuJìV Ǧ‰É]ð𢵀ÝÅ6©æ$Xœ‡Ilì*©­,50EÈêku”¢1N ^$[ð‚ѱgsôÀ26³4,+b +-|š³¸Rè‚k3G ^Ý%uo—œ ÔDæašàH÷…’+bŽÀ­Tq g„ÀCÙö(MIº ¥PqÞè ò„€ï!ÈÅ‚NÝuÑ´Nà¿ ót%f~¦ÐÌS™Ê~J=`Úi>Z~v==î¥ò“«tÔ*q!Þi¦ ±û®f ÃîçàØ|e›GÏß>ò›GouûXÕñå*p¾É«¿ñAç*œÂ®Ñ 9XkTHV®ò ôÇlguÇþQýL¼ò‰£üJ>î¬@<îäâý´ñ'3]ŒƒÙt¡CºÁÁ,1[˜Å¡†â™\…üÈ®@ ïRÈmÃôÍ#›îO@ m:¸š,þ—|xepIÍøpù¬ :› •­1‡ÈÎS/•7£ƒˆÊ«uTþ¾INoF%¯DkÉH ÑÅ͸P™ü›çŽƒ±}­ û¡»žÅN78Ë)+Ûì÷;AÃþ>½ÁÂHŒØ˜4€sz'3ÜM&›½ M.F¾N•,fc1 çèC‡þОN::Pd‰îWzöi·!~òÚÿ6KµÓø©'hå8éVÐrÃNx™ˆ"o²/ŠÐ¾®ÃdºÖ¨èµ`úÑÉ 2«‡£ ”ªp2 -ÆŸ‡S+‹¹H­Ø\PÊ[Æ,‡Ùas ¯Ýa$]/šy¾#í:‘r+`¿öh²‡…$†¶iˆáÚ|›iÓã(Þ©¤eaïÊ÷~y”Ô†¶’rÙÌ€ØL[G±ÉÂG–ãxîëøßÛ¤ñž|øsµŒ“£á,}£•¦¾¦1OB¾@z­Ïbʶ@ŽâÛäʲ@êú€>ÍvšÛo65#™í·"emH²h¿ º;;Žræ¸!51Àõ "¾r×WMii†Gúo¤&]t%HîD§)­,4º¡# ¦Á^4º€) &Ä^4ºk)mÿ0‚’”™ZÐýF9kƒ¦´Ueè"£<$¼—HaÙH|_‘ÆJ×Óp¶ìß ž`TöÖSþD¶)—µÞzZ†õäC£ë´VדnÎZ]Oˆæ«§úªzò!ѵT+ëIbe꩞[OäGJÎøÙŠAWÑnëùï{ɹ8¹™"BvB>öOÈ›©Ù/±§'m;´)£4¢Šåíçâ¦9Sjí÷Z¿±ë!µL×r£ö\"Úe  Ùи—Ì´ËbZ¥‰¨ì3žcx¬’ˬƒ0âP³˜ÌÊèÒTKnÌAŽÕäPW“ÌìI„œ[:ð)okµ%®²ÈÜŠ€t¤ä´"¾u¬fÚ1ŽD÷d¦0ê]…•°Œñ¼Þb‚Ž¢Ô «!ív„{¬ü˜ÇB)8€Ù† ÃUx#Ò£³®Òºª}oÀGÉUþ:‹NŠ:•±4åT=ožï €YíÃÈjšoó4<žšÀÛ™Á§PWOÒ›þIúÈž¤»µb™j˜[2™mëµä—H‰Âù,™1r©9=Q”¡–køy:›×ðâ†)¥µ2£_—“¹›Í¯“9ˆKFTv³Â`Ë5é3Ã5 ·QÞ03¬®_¤qª7ž½/S„a 0,ã ëÙŸîÛz‰ 5y\~ØÍŒÀi€ô5êáéWàu‘(ªm7@Vå˜G¦:"^uÙjVk²œ9dø‘R#î4´lu:\sí 2ަo;,NÖ\PÎc•Ÿõ,ær¡§Ø$P[ëY“g‘nrQémÊÏ¿è4D^y“Ö.;Rn£ãtÕàÝóœfõÙbÚÓgSš8ÓŽ¡b¤0Í!Œ¶»ésP°¬ÃÙÁ\кXcx7ˆ?ØÍ4Êh=ÎÁá‰Ë¡Âô<îórR#/­šÑ} ^QÁýx†MH<3PøI†€‹êêþ2>ox¼ÃâúÆ…ÁÀ70˜ÜlïyõÍiƒAÃiic‰No®ð™SÒ§4¬û°#®¬‘¥ÈPvò‚Þ@‡RÞC“¤û´qvA{øÝBÎ&¬30¾ÕH Vð>`h /‹TË Sw¤,yI‹½{>Ì7ÝOãd•¥þ ]Æ<Êì@gîRP1Aê:öÀ>ƒ¶0”Õ $Õñ•y¿Ý¾¦(ei§°F^ާÿÑ3¸ÑP‡öúÄô¯M^õŽ‹›åLãN)㡺2wDÉÏF!嘒J&»o(—7#[¢`aø,í ç%À;~ /6¢À+??…WQàõŸŸB} …f.#Ã…\H®¥âaÄP©¯¥Ro4[G 1¦lŽp‹q ãOŠ.í›ËcÅ:"¥žûuË*jäA%œÌ“«´W)€.!"òf„̱fT„²X+úV8ðĹ‹nfZ5Ô™uG̺® yÅÂÞ€/"NyàIzŽ’ÆnR?=hÀ’Òië@y Ñ?CeȦ†­%UL ÊÈà5s´Ñ.}úG’.þöCÒÑWýðdÕi‡:@Hë·Á‰¹bÇ#ÿþQ¸3KlØ"TÓƒÑ<“‹!0n­Bˆõ¤·hŽœÊhÑá~PÕ/*ámh¶‡8Ð$À˜Db†Çªx=6†ˆ3‹–]Mfê;èx^„¡& Èáx0Ȉã@ô*ÏO:ö‘Ðj•‚½àéçñÃYÑ‚R²¢eZM¢¥­ï1—mXV;8è¨ÉB­a †ðõÄš^j7$v&q…‹L?-œ(ž¹zÊBêÁRz3ÎŽ×ñ@¸G‡‹&ÐEµFß^UØÆÂ’ÓÆM0uˆùŒÉ&½§Ãöhˆr$ñÞŸ•õÚ¾èŒ<ø±øÐs°ø0ŒƒÁÔ²æOØÛQŽæþì2¯âž˜O×®H°•8â-çd+Ô’“ è¨-Z,uÓZVIÑ0Þ€·¶˜RN¼Z~Eóæ X«¢•ël}AkMÜ ”ÈŃí:?dŒŽö¢2M9¢3ZôTZQ©(L±ÚÁGKبiÚÙü· l{ÿlôäÄìôÚ'‹Ù-Å\ÿõé“ïöÒñ_wöžÞǼ‹§H¡_íwŽZGÏ«ïl„V’÷Lƒ–Élªf@§ÌM0¨þ•8¬·1ŒYñÝ^e»„$h·Š¢ ƒ ¼ÒyƃEDž˜bêvg ?X?†ñ¬'õVUÞCŠ3¾â€„NDBÕ0­ iþˆ„™ÇЇG+m"h01Â8ƒ'ã“F§×jt×¢÷Ú&P!üX/§í½w «³Ù?ªŸõöŸµVHC'œa­ýx$¨”§¸L;k¶z½Fg3BV°\ ÷‡ñæ Ì9ŒT©–hL´B‘V¨óM‡”‘z] RÆîgl¨ù±$ØÃ[Ž˜ŽÿéXuÈã{5`%<©ø¾ÙB}P€P:$°¢·yhBÕ9D¡Âí/azŸ—#¾ƒfŽÊŽ uWqà ŒÇ¹`Ê$x«K¯ß¨Á˜æ9òšÖt9rãr²Lå›2zæˆÜmS\I2˜²œãY-n1¸ ¥˜ªv,Ñ 4‚‘-®wx² `¸}Ó«œìwöñúù¾þ±SC;÷côOe ˆìMz¤Ú~&Æ”-ÊÂUà+fWJÞúO½Ð/¼À/ü°~Ê/ü”_y_yaë^غ+«[-R°™-’ì Za.§<…ÒädÀ ²IÚ=¡ÿ± W¢˜wÓyv?A­P² |Ð['œØjà5 @Wª¿2¯¼/ À ?À©qêyf žù,Ï<4Îø$†”¥ÈZ.2 ,JÜ!ñ¡EJÖ‘­žeÝbMÊi,ÙÑrÒQO†ÉÅlߤ²™Ž¯¾aý7‘ô0ÊG€ÀÁ€•ç”2M9öP3=îU^î·OgG§‡Ï˜)¤„qÁ]3(t戎Ê,yÈÿâW©h•ÎË6oÁW°Oj?Ïçƒm-!ÝX¼,·Krh(¢£Èe©Zmçïí¦Á÷vW"@QÓð)åá à‡Õà)žøS> |6‚¸Ì¤íc™K V‹ fÌ™bñÀº÷ßÚQŒrý/YõŠŠóØ >(^"äk«ÊÞäVX˜d“u“†çêò" ¨pYY¹À)ntUyPº6¸¸ô‚Q5)¸\BPMfm-­¨#•®£L~·<`Ÿ¤öW:^*r©®Ù¨¥Š+Š˜¯wÚúúM©l—I‡eað€W€ÈÚïRåÿëUò×ÿ·wÄšõÿîNfýÿtg{÷~ýÏ¿áú¿xƒ¥¸»ÊÉÜ'cumÿÊÖY Û±ïí‘=3}uíjD±,÷»ä`M§Òz•oøå€î³[$¥2!äp´ÁþA‡e>øë¥Ò"Ã’TkÌÈé'rò÷ÛæäÅgŠÏÞ'Ÿ+“ÛcåÕg çÔ·ÃIý9q2tXY—÷¿Ðø÷ßþ8ã¿TÍ·ÇêñïÉÞîw©ñÿñîîýýOwòðø¯‚:fn,Ú2çd¦#<ÓAÃ9ššar Ãõëï`F Gÿál°ÄíΘo*ÂçÿÉÏ3±Çá¤S‰v0=_ç0.fç‹`2 bñ| à f]lÛÛß=ÚÝÛùÃ#hA‚¬¶ Ò¼QQ:¡a‰Ãh°˜A¾x¬¦§1årL—¬[º!ºˆ{€È;¤, ëÒOD'|LJÜö*»ðaZsç|êí"XŒÃŠ BI o‹¥‰S™F ¶)0#úaò> U,ͲhÑøVAXUÌpz8š‡êÊ*§Ž„há¼iú–gO©Y ÞØq`-ƒ+yl‹®ŒšÎèÍ‚¶„ÿT²2ÃÜâÙ$”·_ÙÜ2¨p<¡‹ Øïà䔳ZNñ4Z:ÆËª0‡L¿5¯¾¨¤M I¨4c…jË9uÜP1@® ªþ ²~+s\M U íÃÒ=Ô¸H\–• ñl©(ZôZœ#ë‡ 9ªëÇÔ-Z¢8—Óóàqezµ¬„Ãe‰&²Î]SDÒ¾û †‹ZL@Þôm% ̇a¸Œ‚)~й¢ÑùEò§?ýI…šÏÞ‡ Zf²I3þlÝL6‹ç8mýfñzo÷ n~pà¢XîÁ÷í7¾íø)Ä“ª(Ž ëtùÅõqá› ) +2#'ìóñ¬Œùä–þ?øG3"¨ëÁÛµx{ÛoÄx#P3áZ¼…)fá—ÖÔ¾›1>@3D)ŽÒR4¢™¬S4FŠÆ^`ùÍ`ðÚ%1ŽjòPQ†ÜB“óq䣘ëÓ¦J yÕ)w|ý‡œ2¨Lý"xÁ~ß\D¯w² ð½ !ÛÇ 9žù!Ç3 ³H‚œ°Lþ ‚ós`ž6Ms˜+LòêÌQ“ÅèyP1%‹Í]i žÙ*ƒ&7OÁýg÷d£©xP‰¡¸kA)éˆ,ªd¥(ipüó~[ÖÅ ÀÖh‘ÜÛÖ$¹gPçöåèMæd¦ ršLÙÛº}Ô¸›S9‹<²ã¹URFÐH&Ñt6žG¡,ûCõ4",úŸGP9X#:í 2ãé÷G°Br_±âgD޲hëêð,&ʦÁ‰%wÁMÛ—æ“Þ/ŒaV& ½Ùlÿ¾O÷³£mA¦Ãà5¥qX»†ÒFKÏ‹}¼ªˆÄÑÏÐJ§‚^âžKQ¿ã–,,­ KlC°™XCÈbÛÈ,¼ö°Ã¾ö3\˜õùàóGæv‘¼AÇÃø²HlBwÑÅ©”ö”eüÓ\¿mDàÅ*H kðW2°W« ®Æ¯çâýØ[¶A'åc"g‚v;T*:Sûõ³W/Þx®í_áÞ^Àwúh¥¢=pJô5nÀ œŒàdg8™¿Ñ”ãµt“†}Õ¦;ô/áÔéK½“tJYœr§”é)䇷§0 Ñ|Í\bcx¥3Èl™í"^)u3{¬&¯.1Ø%»ÄZ7Ÿ5d„(žñÓn=ËĈ%F";Ø¡bìd¡,^ OxˆÑ"ÀÞ³h6EaTÐì4ODa9-È_¿ŠBø‚LÂ_£%þÞ2Çí|ašD@øs©~·¢0‡Nj`Rè =ǯu€`º'¢ &‘Ò8 ³S¹Sæ”›Db£é9CÊHW&õƒf%ƒ‚AñÙUâ5(óÆßáßç=ü·Mÿ>oüÝ#^>Ì…tžìô°…áXìðK“¦fÞZäkoãèm8Æ«.Û­¿4Ú…6ãôHý,XP³ÉãZY jëžEy}£`x9ç‰ÊA-û0º&ϰCºÊ}°é&d¹Å\É`tqNIËœ -tØvX-xEbWQ`tE&‹ŒEо`’ƒð ïfç)_cœµW† §•ºu 9¶{-þ~ìaŠ|Ü/?Ñ¿íSø§ÎØôçÔË ]€œåž^äÁŠ‹hrŽHßP(eª—‚«`ÛÀªúÀòÿ€¸ð/àâ¬ð´½BU@ê±üƒˆG„r¼J¹t©w¡åã¿ þ÷”?ÑŸ6¥@?YA£Ý ô‡ºV-ý‹Ÿ:0•¥sÕ6Âvö‰)ÄþÛ!ö;Ç+K|üòˆÿüÝ™ìˈ‹±Ý‹2Oñ¡gUO“S½zο›õµ ùK‰ñ]åŸcõ7ãGca³ˆêRFuR}”ê(ú³ªVë,FüS-~y¹ œd$xg5x[þQà@=Ó˜) 5æg]Ò’Ïù_n™½Uì3FQ(2p–¼Š¬‹9`(Vn÷=U=õ׃Êr±Þz‰p­—„&áÏ,*?DéQéQ+ïQ6=εGÝþõ ìž}V§K´*Ã÷ñ³.ÿŽ ¹-•ºâÅË>ãQT.þ½Â;QLZÆ£°\ü{%Åw¢ð´ŒGq¹øw\ðP×6tEÊp&ñw—¯Ì"C ú± Fôâß+ñ(8ŒÛá9ãQP/þ½Z  $øE"EJ‘½ä—8s½™Ìa(VN…øUÒ?<‚ÜŠÛœ%Þ+…÷¾Û $l½Ë°Ø8Ö¾R°ëé¾’tßo@÷U]Á×ÂvÛªlãõü¶¿ëaÛ’ßñü¶ë ùÍNã(¼µÔ̓ëø×6Ú¬)ÁšÖ|Y°ûÔAê>ÇßCw=1H|ƒ»Œ I$¥˜H5@Uj‚ÉU€M\áO'Z)üé¥6™Hu¢¿uå·uùKüéDë£#…?U\QÁ\n:àx.C_,#&J$MÛ9=:À¦* „M­uEåKøº?\ß9>=ª3}ÊsCøú¦ðV›À¡=†Ñx3𮾲´~ÊÜ ørò§\Z¿’~³}|Üaú°L˜-ÖÑ—ð] ~=}*ï-€BèZ+s úâ¨¾Öæ ºÂúÇ9P‹[›ƒBèZ´é¶ék†m _·à7hÓmÓÖЗðu ~}£n›F½†<ƒ×-ð Ú\Û´¹5ä%|Ý‚ú&3“Í$-¶Þ‹(‹ùÍETTØ¥Õèí™}–4‡Í4‹M—Eý3;Ä|1VGófM´vâ8²sÇ e­P±a6•qQ¨-ÚÐúPLPú^LÇEøW3C€¦0™ˆ¢“¤˜;yÁíÆŒ·ó‹.ŒÃ€×=>í4R lCõA·Žþ’†…™½ ‰èö±Ú›Ç>ÿÝÇcNA2¸øýíæ§¼¿{ò$/þ >úü÷“m<ÿýøÉÓÿ#žÜ.þç¿üü·¿þñg'´]˜Ð~v à5ñžìîî¸çÿww¶wîãÿÜÉcÇÖÑ5Nv„ÝLt];Å£µèÚ±hãÈÖíý¿uÛǽÂÉJL'|'l·M ]:ˆÎbˆg³(®n#—±\‘„qžFˆ3ZØÕDýŒ¢ïÃúà¬ÑaýúÙ~ûÕþßÈû¬·ÿ—ƽ5÷ÛíÞ‹ûFó2§.nQ×ÄcÍ©N¹æ+èöÃ÷Áb¨Ã$Ò6‡€4{Öx",EU@ÅÅõ´FëÍòôxZSlÁѨ&Ù¥Ûïà?9ÀÀjîÜ‘ýöíP¹ fØ„p „š·FÉÌÓ®£²¢”ªöZTVõ^Ó @‘8ód-3㜱YRÆñÑô‚)îÜÖÓ-lJ×’ê£ã= ïvK¡UѦñ Óåx® Š­<êÂÞÌMïøÒÒM_ jĨ[+º–È þÛK˜å£½z4W‘ØëGµ|´¾ÍŒ¿ã[0u µ”FûŠË9jÅÍ–$³žÄA–ç4|‡Cy­†R·äÙw‡‘Šô¿ebüÏæèÌJŒ°-!™ÁŽÒϬáLûqˆwãÙ@º¼«Â=ë˜} ú‰34ýz„(¶ªDûÇ¥°õ¼”œÐk"ÑK‚Nù!ú›Û òZj²Ðò’.i×øEërÅUPmœe¯E'MnÛ¼¼m²Ø¥ù 8i«‘Cª[­‡rÚ£†Ô5ïÖºÛKÔ’a n /çxå„l:x,¤,æ3¼Œ\¯¦â¿}Ö¹ýÿ³'ëâÿo§ãÿïnï<Ù»ŸÿÝÅÃñoöÿ³¢þSÐÿtHÓÐVn9xž•»+ ©ý Ïsó- Ië¶ö hmÿ‰{©;éôJ_x6p µdà§o’O1-´ó.?Òv=›+›³´b ÛŒ-,;öÇû>•o*ž!e%³'špíY6¬1b¥Åb &)ÃÕqÙœò0tÑÝ6—Þ¹y›dA&ØÒâÃî`Âo/œì-º)ðo?(º[5¢;WÐkSÕ–q×|KYV•V0ª £¹Rg±›FÍ5)Û0ºU¬€ñÛ~€Å§ùvö•äÐ:2öŽãÇ)Æã 7Þ3Àc ¸Y1qTdYD5ŽT".Nøø…tÌI°`|à ö.übúe„—1ÈúAýZ÷ø°¿eئE‰ š(eL GÀ¹™ÆVQŸFiô‘=·N颈(ƒB :\e»M­'ÝÅ@•e(Ï;ŠêSÉ¡¨ÑšŸˆ—Ë>C¤ ?Ú[úká µ&>#*cÄ@Êß¡“¬_nèb»;¯µã¢ã$G—óê¡>¿ÑJc)/'ƒšÆ-ÛC¿¯–¥ÔÌ’úDJî\K=k¼x-§ùEÑh‡4^slóÉùôPhÉÂb¹Zu¨1è*j¹Ï f qf@X/oÏq€¬Îã~·ú“`ùkѱyž Öl¯Lyj™LyÍp@F;Áô=›¯Ç³šø{»ß=ýCY\Dð…Þ?j⧤…ׄWN,ß1VpÀùx* 0Ó ¸L³¸×–ªŒ Øq)ÎÜRçÆ³Sl;2ÙžL˜NƒndrŸ¦ ~Ë2é#Ó|1Av}‚iÊwû ­ñe0Žâ{Ät3Õl¡CÌ} ½Æ×æÄÇói‘' ºž¾‚Ñq_ Ž,0Œ.!Ø«ÙbXÁ•h ƒbe9ˆã¸ä¬‰´g¡9fãÆÐù°ÚâüS¬ Ìû\¼8˜@ÕŽg‹bPV;¨4ð/!``È~ŠK‡püÖOqS«y‰s1ß6ESH¢Xž'_¦½šðdÔb—ÐeŠOBÝ8VWvÁ˜MÇW¥/62³ïlÇrÒÁǶù+‡Ý"…H”m=Þ¥?ÁûKõ|°¡Ï”‚]ñUîæ ;ó —´Ú6/âåFt½ýž -r¼­ßgcm¡åæ+ãÉ#¯ÿM“éë»”„íÕƒîÙ4ÂÒÇ7Š*;÷ð¶O×+X¦º ¡<<^}‹;“™9¬Ê“i&5‡8#°ýî5àA…ît«V* ß±öLÿ¤*†JçZ¼ô‘Ûúê«â"I[ÄÖ¦ç0¯˜mÉÒ%+þgºØŠ yeI)Zò¼fSìG™àà7#:€¯qÓ-‡íÀ«è úÐC¶ùj ‰£0Ü…¢(,âT§@^´Ö`̆E’êS)¤’qaø¸?ð¿›e~÷MZ¤|r?¯Ù¦A›»«ú>Ý 3¿2ý<µ>Ë_­­Eµjn^ÔÀ¹,Zó© vP©7šg§ÝÆ5†DBëhn§Þ€à£Óþl-§Â™‡å%{\IŒûšáè@o,ÿ‡º‘|4Æ“‡¦Cå;⫯¤ÀMUëØ­ N<31áíŸjàÑJÇŒ ÍÔÈçÆúq$«ï+™õÈmh–rÅ.$Âb’{óÇ‘68CÝ"®’=¨{6n¼gðàˆK„5rjrV%v(¸hÜE…h›æ¬34Åjú£L/I–½i”diº žX%OÓô‰+¿/¥m7Didw¦|2Výjp»à4Öè#áµti8i.Ôc~ÚË3ð}•õ½»¹¾wû»vsm×Þ _7Ó.µªc§:,l2ZEãX‡¤ céTkÍ_ J[ÜÒÌ“3„9°šCŠï¶²°TÔµ•Ovåì.šuåAÒ“\tY‰X­bº]{Ȫn‰¬È`%èxNE¼ߺíåHºÎÇ‘¼¸%æìvWXÎ…ÊÍ/íT±5´ˆŒ9âƒCÄ1&‹³²0úÃÓUS‰y¦kÐÓð=LN‹¥R‰hÔš¦쌄ñ×rùhnˆ= æXÁ™TAÌŠc´Á禼Qk‹þ»}~íg¥ÿí}iÿÇÛ{ßífü?v¾»÷ÿ¸‹‡ý_íwŽZGÏ«7qn–'ð˜\Eý˜îFlÔ[=@Vy©ï¯¤³0^㫇v(AâñÛÞ!ì2|Ðh·»©¤gFßÏžíw[xtŒ¢…ðÝàh©´{F#EB:ÇÀÁþQÏMçà­€Üi<u-•:ɦ°!ãž}Ú̆‘‚_1ݹ&Z­+Úõ-ÒjíWòï õ÷T¾Ó/2­Ó8Ô/ ¼³¯(¨Ü‘/ÅgçXëøå‘~“ÕQ×’©ÑÔµ$êFuKuÍ]ݰW×üÕ ƒu{]3T×ÌòM¹æý¥zUÅâ»qÍ»h›7 €)¸wáê6ð¬«Zésý¢+·§¤  ê¬®à2—à*Ò‡ºûñÕ·Z`=ëÕ%Áq\zK• /Áå7óM}t.ÅU¨=Õ {ªéôT¶=ÍKOµÌžl™©ë1­~rfzÊYW7Aõ•n›ÔEU_év[]õ•î®u3s*„®¬Õ R  iÍ«©3õ•nš•ÜÐe²Ö»üÎ÷ÄZï¯Ì{Ý‚©[ß_Yß_Ù¸m Þzo[ð©Áˆƒêbö”Æ×Wž¦®;ÕMÙLVƒZ5uhUÕ‘pd§ZµxhUã‘pdRR7ƒêæ&o•ÍIÞý©4 ßìéüR¢ä[9í]óãÔI:Õiê6Lç—vê&žº¹Ÿº¬º|›T}?¤]ª¶ûË)cÛ)cÛ.V»kÿp8o;¥J5ºýeÌW Ê–@7 :rƒ\A›Ë%O|¡™XRüNKÝÈ3wJØô‚xy Ô]úv@o–Í5éÙ›S`ö%‚bóûmfk8^Ä4we²t®=bèý\྇åvýóЭKzô%D7¢ã½;‡õ¦÷ž¡["î¿]趈ç\tCòÜ*àÉÍgíõ?ò?;óQg„¼S©•®ÉÞê“m›©Æñçu÷à0TG]=“!¸Á-4LâF·½X¿å}#Ù òeï˼“Û…|¥ZÇ”Î;—»õLe¯ ¡Ï›^Õ‘-‡§lšÏu5ÜÌÏÖwi…¯¸ôuΩŒr¯sب^ÒÍ7÷®† ¨}4³îw.lNHÞ·à»máÜà®}ÞpG޹‰MVžƒ¹"‘oO°§+î=ØL]åk©×x¨äYuåÁ'sèhÙ½¼¬ó¯?Ø,ãE®hò¯=ÈRÎäfhä\v°¾P4Ôõx{@1S²®ÈK[‹€tö:Öýÿ$>ãN‚֤˰½7£Óå)²\Ai²x-Å&€XYB×]û„1)¢‘ø™}@Çm …w€Û¨M¶Ô“n”g9ÕÑ¡jzkÆËÖ® ðúdv‡¼ršŸCmx»äÈb]½ÝUDNVlô®~ÖªB¶œó™ò}òbãÆyZýì5Èæ¹&ØzoiEâés2&ËcuÓõI‘_©Žrg³yX ê Ÿ´~É# ÿùXùÜõ̪…C>+‹¼®þ«›OZÛä°¸äp˜ÜЩÞâÚçÆme”ËÄg­„Öe˶ôê箋r¨³ñ¼úI뤒z#£ú©ë¦¼‹·7ªŸ¶ŽÊã´ºÈÎ2r€“›.¢P¾0]aG$¯­º­æVÖiyY¹Mè†ë¶•üï¥ p[ë8ß*.Þ¨¨Þæª.'+¹ÃSý¤U^>MÜ ª~Òª/&:ßWï`æ.Árg-ÿR옅ò´éš"‡ØœtÂuît˜.’[ CûÒÉûßoÃqz¶û”ì …9‘d|’t*éÙJ¿¤šð»¹CY¥ŒÏѽOѽOѽO½ÜûÝûÝûÝûÝûÝûÝûÝûÝûÝûÝÄ‚ïStïStïStïSäK¼÷)º÷)º÷)º÷)º÷)ºŸ¢šL“K¬Gô(RŸg¸DÐ ý}_}:ßë&­Ã&Â*I„uÍcUâ(…Ø´1GiÔ¦‹‹®&VâÁ¡.›ŒtN4UÒ¯Ö÷?ë ûkGÆö÷ý¶•°pS4΂‚É«˜2©eúÕi<ѥɤ7]iºÒÉ4¢¨DijÒ‰4f©DcÀÓéj¡+VèLÝÒÜ@SÀým »ÉvRJJܤž•4ºˆ¬-ƒå&õLïKÛb‚Á^K)-…¦#†QZMGÚ¬”BßÓÒúcÒiðTÉÊÔ¥“y´’ɾe'ÃØ¦“qÑJ”aé¹)»iM;ÑÚ ´j_ë6w$zb*wø¬¨CºS2nïY‰Äýþú"ý¬ŒÿACÀ¿ÿåÉw{Ó÷?÷ôé}ü»xþýâPÿ#šÆP3BGýÀùÀÁ1, ¼S(ñ¢µ:v+Ó)»Fo5P|1{ÿüÄ…QÑÏ¢!:@‹¦ç6Bó¦7EÈHg-JZ\kÒò[‹pØ8¼i1zöMQ|µ¶ëùÉ+Wé¶â\ćvBü[^ÕÞ¡ƒƒÛ"Má–H½hÝ¡öñ-‚&u[b‚¦v[¤¸ Þ5 œU@*y´&áXŽ“—ÁxƵ×ÅíÌVÆvéM™o Ï9h0À(]Pã>f>¨6Qs;_†ê`¶œÂ|šâo#CŠR†_½V÷ëÆÖ}¥3é×$h/ŠF:ÎRƒÿüyf³ðó¤›(ÇÔ~%˱>K)Í‘•©¾ùP—TÁ¼lyÊ›"¥@éà0:Ä×øêÈÀ¿²T«sX)˦%ÌúÁŽÎa3qŽ6”§[HÊ×”³Åm$R{Ó§¢¾\OÞQü‘rVa k3=þæ«ÐG~S¸wˆüo}VŽÿÍEø“Ålþ™> kÆÿÝïÒãÿSXÜÿwð°ÿgã2Y¨Æ Â—átpsýÑl1ái¾víÄ™€ƒ‹( i G\ü– ûãq8e‡M{N¡›PQGP²§ÿ8¿hv=müíì¤s|ÒèôZ ˽ÄÝájÉÍ+"´¥6ùldÓ/æÜ [²† "ÝÊü»y¾•.)ö‰>•€¬<}k3<´-ÕÇíã¾ùüϼàG͆¾}íDÊa’s‘';Ë’CñdÐHá>¿“Bm~îŸiÇ]ìl0TÓl:Œ°Ü0zä¡t®ùH±Î ±‡Ñ;õ}ž\ÈÇt/}/'¡€&„q¹P >štm.å?MÉc!Ølþ[–\ÿRÔÿƒñò¿ÿ"y ’ÿîÉ“\ûGsœ6H‚ù„L²[„Áp6_Èly~QÁ‰Df.alŠíÓn¯Ñ9{ÞÙ?y!¸sƒ&Î%Úǯ"=m¨ò °Óœ¤n‡}%'!kÎÿ=ÞÙÝÎêÿ'÷úÿ.žýïSÿj%y`5Ë¢£çq™|+Ç&êåìbzz0À¯ÜÏá#eî~އϤ)/+Bوό7):ŒÑÍÕÈ ö¥2½Û¡c³¶°å™ …L£Dñy…$}M„)¿–µxV¦ô’^)ÒO…+…‹-ÓËg_QHÖ‹­©Õ:±aAŒ,:h¸P!Óå¤.B<Œ>ÃÁ2&=¾ªÐþPû;CW1*ÿZ¦UqôíŽøáGñ«ÐŵF¢\¶›Ùü®-èZÀf,LÊ­D=ªŒŽYÔ†,݃ዠ´¤@èÆaA€gÏÚǹÆ_Z€øC­À%Xã¨×ù› •öS«ç@yÀh%Ïí©€¿ [¹e±M‹"]8®›ÐOmµáT•+O¬léÊ|Õx.ÏCY¹Ê“¯ü`rþZ~Q™+Zg´»tP 'óäj+Õ¼YEi Ó>¸–ûã·ì U/£¤ ƒÊB›qÚ8Lˆ¢V˜á"ˆbÐC•Žü¨ZggÐò.p~Š E}nÂLìjJã¿¶òoVÚûÏí" ›†ïéE†ËÉäªP*Ù™p×2â2ðI·4þi[Å4·¸ÀcÓÛÜ‘ O‡ vMì"Œ¢ñ¸øúM9F§¹Ùbˆ5@ÂÇz Ó!þ;[¢QìsÍ:%‹—ƒó[­.Â8ÉÍÆUÅýÊrCGX¤š*KjýÒ÷i‡4ÊZSþ–Íoů1ßçóíŽBOñÏŠb¤~'Ð,3mFÛ˜g·þkÈÞÛdüÅ8»Ÿ>ÁùrÃþžií!µ†4 %ú\­â×jUj¥møßÿÛÿ»† ¸X"õ1š‡‹ˆNn)Í!ÎÊÈâ—œ±Î*}±_î?0HôSVZI¼~#dMl—Ѩîð‚“æE}UŠrc8µ€0¶“.òÍ'Ί¿–avBPuT–:¿‚8à3Ìe¥*"ÑTè²Û„‰^TÖ Q·@EÞfÊåè#²ò¸ÞYùLÁáŸ\yÁúÿlÙò›-“3’¡ˆ|2˜)$L‚9¥’•SÉ' ÚPÙ¯Ä˾d'*¥vNðÉÊŠÊK;°„Ȉ'”Žó½~cÝ)v4•¥þÕ[ê9έRGªÔ²Ì8;äR#äêRÿº²ÔˆozJªxÈ5…¦ºŒŒY_˪Šÿ-êפۅ¦ª¼Y-«Jþw«ß‹ ¦V‹—’§šñø (Ð÷Á8Ój“‹Å·°8a­W#©IY¼³EHL$Œo­`¦nÓZÝòáI8NÉPß]Ó!Ìt­Ä´ÄhA¹ƒkq£2©"1uXÉ„)ždV¥CÍç&gK„OiM™°}ã³Û(Ÿ«ù‘s¡ÏÇ륣j5г¶.15:fÎÑm‘Ç“P>²ïý匮G6Í'ó¨ödW#cµÕ㤻¬1`ÐQžÙüª8¬V‡q9®VcvãŠ/Ç¥ïe:$Æ%¿—-ºúô,GZò!ßJ&Ê|çBæYM¤Û5Œ(Õ|¾÷bP5F±/ÍÉy£*]„ï´9ưXBØß9þ%hI–ÍÌa£¥wFÐuó~÷O{2ó¿Nc¿~ظÕ<Ö­ÿvœø¿8ÿ{¼·{ÿ÷Nšùñ}«³Åž›MèäxÔt‰`¬çyaL3AÚž€x*HFF²ÞÂHž“è7¹Í Ä}‡þ7xrÖŸóÛ~ÖÅÿùn;ÝÿŸ<¹ïÿwóðúo¿ó™ézGÁ€×}°(Á¶û < ˼CKÂóýÑ¿“+rÌMèðþûh˜:ù.¬/cT ÜÇyXÒ†žƒã£n<)¦Ik:ª î£Ýìd‘ásܶ“ 'ÉÃ’ÐôZG=«æS0„ÔµÕŠàC}ÑŒˆí½Ý›QgA’¢ñôñçÑ8éu6. ,Çæ3ªÌØð~½Î$ j*:úÅ5Fóãz…÷“h`ñÒ=}v;„ž;U¤>÷ŽOœÏê{­&ØYR ! ÷ë ç¢~87§I&k ¨Þ­Z0òN^²v¨öºû‘´™p*ï ê+ÙžPW‚Žáò¥ú˜ÎËÞÃÇy~¸ÀèŸ;qÎ×ÿ·eý[ÿ}o'«ÿ÷îíwòÜ@ÿ;¾°xÜÿÿB=~ögj«Æ0ÖÈ3‹áE-q+3N¸Qtd³WF ›Ð€’Õxž):k§ÑDÌãʬÿ+E…ˆQHáw¸§Pìwx]“ÆÍGdÜ@h̲R¸è¼`—<ú£h¡îZ^…™£&¿ÕȨooˆüH#ƒŽåЪöhMÆ8EEZÔ"ú³åÓQÚ²ˆ5€^Zä¬õ#s%'ǵ)bÂ#×婸ÿ"+šÆA & ý™º·ùƒIÑҒÙ<›VäF•ä<#ÊBpí±Þ >JY€Çß…_Ž ¿˜EÎ`n†5]L®ÊA¹ÏXÅÂ/¶ÓÕ·ÖÏ>ùye(@u¯¢ð(CA‰ê®§RdÛîk ­|\/`-\›L”QsQú¥ð±à˜— ×úXP>7#íÇ#Ú’ùqlÔi†-ÈUɤwlÓdºûÍÆÉ1Næ2dØW´po@úÔÇ7þc £)h“»:ÿót/ÿuï»ûó?wòl´ÿ7˜MæK2ùàP1ªÏ¾)~†CH—§_…<ý )¶¡H¸†¢ìÚ²ÝzÙ8jt»r})ò½V8¤RpÆ¡w@í Z;ƒFíjE¦‹kùP¸°Ö´j°P4 Ëòâ½ñ#cˆeÑ>:1VïN›­îÿwrþçéÞ^6þçö½ýçNîÿÔÁÃt÷v.Àul¦_ n5©õA[ØZã°I×mMãéê½}½k¯ 9Fs‡vëåšÄV)z]âÝ­·6ë…t*[+vñ³›ø[ù{÷>T3ïÅç%ªc§:)NðQëÄŽª<µ÷Z‡Õh<³ ÓE‘Þò¡åÀp6 "r.è(e VÄñ>X =Qf(fórêב¡SÒ–CµZ*Up8Äe¹TtÔŒÞ-Ê›Ã@[??¨ð2§D–¤žkÁÊšŠ.lY‡{´>Š:p«Á¦i÷Û"MdË‹ðܳíÝ©à*è‡_T!ˆ´7»(óüwÓ|BÝJVQ*™:ž³öꇾz5×—Áª¹z+ŠP?½·Ìç‘ÎåÿƒŠºÓ5™áò¬(YˆX7n™­DûlŒÌ`ŽNã®eÓ”¿AŽÏO¼ÐM?tó$-#ÚfV6ðcPn °¤™c0H \^Æ!íñ«÷L ùÀàäÕ`ax†zã‚°S^î UUö(ïÀƒï–—»¼¹œ‚Y)ùwÄÿˆánžÓÂ/mø%Â/sá‹ 匢sÀªºXÖ ¿tÌšwøKAVåf¡.]Ô%þØ7¹Y;•·ÀRÊß)eÏoÙCÒ çáÔE./W¡A%!06Öú*´âôÔÂQJnáè&’‹Ã”ìâ ì9±&¸Kr#µZ¨Îõ ÑXìÙQ–ªZý-¥;³tÏΗtG6©3 WD¡Na:ƒédVop22!økiõçÀ#ëÐV¥¸pØ›dú„Ý/…’+FI’E™v1U·žUç "PÞõDt¥~Ÿ­Õk(âœï"Ð’È®. Ðs)-§™+`³D²Ï¢&‹`‡Qr‡qi5¡)Õï6–p™Æ¢„gæ5¶‚tV*s©k:3°&‡èž‘¾è6ƒhºY+hMýõ'>³Myºg:ÎlY.e©Ê’€*ôÇ [b%uÿ¦ž§{]<CuÀO Mn×§Ó)úw:ŸÖL+%¡¸–¿5×ì}Ê6C˜„á=ê×ÁÔÖþ4'¬LmàñR›T„j& ,ã«ßB(%êéÛ([Ò+iþ>Ñ ßú-÷èþ±Þþ·û]zÿoïþþ»yÃÚë=6·üÅùnœcÿîž=Ûﶺ¸‚Àų ޤ+º½‹t(w–œý'½6ƒÉý‹ ¾èaW®\ÀÛ÷jß~Âʃ€ËþÖ#¨åàC{5Hwùˆˆ•ãÓÞgQÑc…Å<,L­5*;Üõ=ˆ¹ýÿö¶ÿ×úíAŸ¿ïÿÿœÇíØúdzzIŸ´1F³Tç·{{FeHCØ­+€Ì`Ï–UàÄ‘-d瘛h gWzÕþ©Í©ü˜¿*~Á2z6Sņ»©¼ê"koC#Ig[ÕHkT!©PMå Ì:](LWîðZÁñ/Ë…B‰ˆKŒ`{Y¾Ò¿)” ¿\QL†.î{tl~½t©hcššWEáÉB©”U±›)¹Kå~Â÷éOÿÃâï.ç»ÛOžfôÿÎ}ü·;yröí_háBžþÌîѽotU€ÒõpƒGä …ûGÆ Tìù"˜ÐýoA”ÅûP ÃqpEéŠþ ù‘'d6Êa9M¢1åál!ƒ }Š>Æ…UŽ[VáBÒí O×o±TÑôÝì-^YÇ·ØÁ…M^ñú>J.ˆ›`ŽCÂ" ä~Xz“[^cgSNï—[KQÔÂJf;p ÊŸnN™Á ‰\-f3`¿b,W³…gËü`¿Ý~¶ðßôÝLÒ7Ö“öa»×i4”ŠFnΪÐUsõÚ©†ö â,g†^ùÚ—¶!¢c-Áké !žûia°Ùd¶¼ŒÆQ°¸âCµóßgÅÔø’+Æ+K£—‘®dΡµA2S¦·9-ÆòÒ£zV%Í]U”‰càq—ˆ' &šD¯'“r¯2/¢x@Ø% j…WBQ6IÙjg ;›:æéý ûŸøäŽÿw·þƒÅ^Öþ³wïÿu'Ïôøã4¨s5àöuV0 Àca.&Ñ~õ¯0¾­ÝdøÙÁ8‚çÑÖònyŽag/ *aˆN4zÜ<8>LG¨hu´Ê] ÇØg<ÆZ{š–öŠÙ$ä…"Yé­_³¸®ôVàØ8ì #Òà6©ÊòÀWàò÷J¤“8\gÇsíXS9IÃ˨®›EDçв=;>éµ[ßǼ¹±t…ãæãNƒn°¾‡úŒ}EÙE¯Ý}콎,ãtÆ^g´ªÉ½x//ŸjâwæúÚ‹ÆPÕtÝþê»ñHÐtŠÂ\Ósè)­NfƒßRÁîº6 è.mk¢ïñî¶×¬5üå±W¢Üʆá&üµÿÀƒb/8³(œêC³Ö•J´0{íX“¿ÒPÓ´T€ÕšøZ¾~+vxíˆÑ –¡˜)Ýê:@¤BÖ(ë¶Ý»Å¶®¢õácŒ"¯ß诬Íî·ÿoúøÖüvwñ?wŸ¤×O·ïÞ¯ÿîâÙ,þ¯ªxa ›.ƒh}¹ÛÝG°‰Ç.‰OïoÞ8 ˆUÅ­9V—IÓçJh|’¯÷ýú‹<«úÿÅÿÜþîqæüßö“ûþ'O¶ÿËÎ Ýr»º±‰tå1 g©‡Àüp?Â]nJÆš¨Ÿë9ùi›¼¯0‰ NIGøtí Š–òÓh3;–¶¦ÊyÃ5½Z* XDbÖªô_úf›#œkMTrb%9Øp*äëÿ³þ¯·jíøŸ=ÿ·ûô~ÿ÷Nîÿ-'ìÛ=¯7†*Ž(˜@Ÿ¤À l5#¾Š’Ž %Ãgø"é¨ÈV(ûþî_ÿŸ“â»=uþ;O2ñ¾Û¾ïÿwò¸÷ÿ‘·‚?P*8ÙbðT#ž-` moíêJZ58C¼ÿb€Ôz«Üh¦¡Âm÷4ÁÌo¿\’¡Ò øØ ºÓa¬vƒäAýCÙMíbW4;¡É‘ÒÛRž(\¼ƒ”wáøê{ ¬vÄ0„ŒßÃÙ²/ù<Äm²qˆ›[´Mƶ_±œÒÕg£(VØ:iEx3± «x®•] A¬ÏaØœP|TÅF²Ü¬+P3ù ´*vKPÐ÷:ý_ôÉ‹ÿö(¾Š“pr+£À:ýÿ8sÿËwÛï÷ÿïä±ô¿ÑÕÃ0,¢~Ku¨ÆÙŒl Bã‡SXŽÄË1(øñ.\\ñ=Ã0Ó%èa'½î`Éb6®(xÛL̦@Ç¡a%'òèY÷oÝ^ã0ç°Jž[[§×ÖûógðCŽ"â9n‰AÉ0=¼œStÒÙ´¬¶X÷ʉìˆ~ÚQâh> iÇ#ô•^å4)7ìüÂ$ ï$¤X˜2£L¸üy3ƒö“dô77CSîÆ%O+~Ì4Í¥÷µ®Wp¶ª(¾`b;Š7Ù¬å}‘Œ-ÊÃ8á•¿¢Lîl&=^ V¦s± =û-´†©–aù3hp¸Ùô'K4QÜ1 Ô**©p¡ÿõÃÒZý FÀ5úÿ»½ÇYýÿô>þÏ<ÿúß<Ú¥Œ·SãóV&¹z_¸šca_÷c; ó \hÒÙׄÌ×õ/’ •ÞüSŒ,7:¼Ä‘>§¤,†˜Ö+ö*ÆóbRÆp32ouÉ(ÞØnaXMýÐ)-m3 ÊŸ%´uÔËP¤KZÇëÀŽˆÃÀp¸œ‹«}ŒkJßÓðlSFÊTdù[Oð_?ƒAÁ5Sü-ãð´ÝµPj¢9L•³(õÖË›¢üõô¸gál‚ÒiÞ4(ËéÍËrS`ì¦(Pñ=«æ7©øÞ ³€Z¾) ˆë¦( ®›¢€¸nŠ‚­¥w³Ö²TvÃ\Ž;©¾²å'g£zi·ošK·³s”çrtÜ{v“6Ù>ÞG͇U ]NÆ”J«< ¿ &2ÿ$ÎÒJØ÷÷ áN:z1,‹3%ž°Â¶ªÆø6,•ŽOŠ€Îfórˆ·pçjm §Ùè¼ uÐþóçxI7}ÅóGÅ·å䪢lJV±¦ÄHa‚äPÇã÷TË'ÞÑ(D%ºktŸø…¡+&A9é»q‘0÷Tðr@äžÐ[rÂ2\ê°‹0Ë’ë!´IOÈù€\ßÉ5]Y¨ëÜä꫌K­2®§Êö£q •Š¢%REO ÖmZ¨LÒ„¡ƒUÖÑLr8Ð3+ó•fq8 ¦I4ˆ¿N92ê‹Ì$K–£¢âJ€¡×þǵíVÅ‚ Ø’rR­&Wq™àè3’Æ/ú’?ø‰tJ"¶*2VP0X+šžó6×ïOäµf«Aýöäoâ YQO͹·­:MQ@À×a]6±ßcdãyëø’ÎJ2‡<Ènã¯(:‡0 ôçÃ`U¬ÂÓée€:ž ã:| íþ² ´$3­©ú¹,§¦¥TÙbµšxä¼ü[IsíɧÛ;î4œ‚ÕÒ: ÁP‘ êv[ÏŠãÙ€X+q3rŠV áÓ¤kúÐÏÈùo+ôj½Bó¤¿yò}V¾,Ñàs¤–Ø@çðÅ1®¸´@¼Ù}r^ ‹7ÈèŒè¹=Öññtkàd¿S¤1WvõF±_nÀè¯SM HBiÿ¢Vž-«®’eÞ]ÂÕÜß÷öuÏþCñ>ïrÿw7sþÿéãûø/wòxü¿³w:_Â÷â"ÏÃ…Þ\åëŒÔ ˜/¼‹É’#ÈFè’MÖ2ôøî‰žMa:˜îݾù¹õƒg+ÂQiS»:d¸ç™›Ä¥ÕŸö¹ƒ„~Æx '‰&aŲ1OÃ÷˜‡ fŸÑ~é[¼ÏÖ6¸ã™¦Ðâ0a3ŽAËÛf%×X¸oád&IrÅ uné{–Žò¼éx,x4=ËÝŠˆW÷;½ÿ^Ï ýk'À×Þÿø8«ÿïíÿwóØú?xâŽÞÎC=^»Ô“J°Lf¨ÇñÄÔ•ågb+ú´¹ž´¯}øÓÖèΓ¯ÞíGÚâõ˜‘sžÔ~fÈÈÚåa´H0sçÖ8Ùp¬P×%H"™‘#µ¸W£ÇÛ”w/æˆQÆtº’„;Ðùÿ˜ªöZõ<œ¾ èÚAgéMGêèlá37(+PÃP[z:޳î`Šg½ âù ŒÑY¿\9ÏÇtÎÃ6kpÎrœ*¦óXø•"¹çb—‡>c®REÈ¢ BŠ’ç¼|¨ršC“iŽœå~ÄKê~ÄÈj¿ØqÕÌ­øì$<ö§tˆ´ÕÑÍ8ú›†ô‡¯B|€¼z<ÎÛÿ½Í°kÏøôsÆí%Õ\Î\ÝzÛÀðœ;âGȆ£Oo)tÕNÞ@˜™Ô…ù‘Û{Ï6Ó›ÿìÚø¢UqÃz°·0ÿ‹ì×^ûïl>šÌhËæÎÿl?ÉœÿyúÝ“ûõÿ<Þø/#ZðÍê3'|jXÕÔWaâ®èÉnªCçÆÞÄç?¢{¯}dÿ—û÷_$²ñ?y’ÛÿáÑýÿÉ|ßÙÛ} ãÿ“/ÂMêù/ïÿ©úçËÈ"7‰Ïoɼnÿû¥ÏÿA“¸×ÿwðÀš)[ç0਀îÎÖó=Q”Ä.T›x†–ÕvÐË¢½à|¬.¦x!p” $džF§sÜ9;ì>7³2s)åë¸'±úUפ=¡¢É|shäA ­»d`vi´š/™ðK¡Rø…Œñ$ºÿð1ñ¿éñêÿGx¹Âô¶ÔÿZýÿäIfþÿä>þÇÝM³ PÜ2»Ê·„Å—¤ÊBþRˆ™ÃsRšÕš¸>Ô˜:m[ž{éÍü(h”9²¹ØPððZFžKöýôé`äX0´[ ºd°óÂßÛÂÿ^›¡ãçBh70ËÀŒ­€þ ¯#ýú_þ¼“ùÿÎÎ㽌ÿÇw{÷ñÿîä1úߪó[Žzã¶™ýËËp§hѾ¥ÒíÈ/•¤aç‹p]ê‘ÂúÍQbÑ@ÇGþÆC 9‡ æË3쨂ôO•4þF…býua~}4C•¼QO>Ur/öG)å¢\Æì ÌW·T… ”È"w6Ç!)6£yƒYT…´nºÇ"6 aIp¦®s¨Z ù)1‚<Çœd$Ã󺡊ȂA—Œa,.ã/ PRâí†IE6”3€Òç„1ƒæ88—WWò•8£ú›wDb.:•® ÓN§Žˆ²#~;Ê96ÉøËIfùÆ2YJ; €N>éê°¡x Sdt“ÒR ª}«n9«O,ÔÂh©ïÆ(èUª}Z(Ê š‹bî«÷£È7’tàÌGRmÝ”³¹Üì´À-ݪR%óH-2R^ 82Âu3R]™ºaÆF”.¤G†¦1úa3¢KŒà\„¬ÄŠœt4gïJ†|‡&ÊSEˆtTetGèÞÞ˜Ç]ý!†h@R"†¨?pÛNž„ƒåDˆ–Ý®b+뺬5ÕÐ1¾Z__èë¾ P_?ðÕ€úÚ¿¿Ê4°ÛîWÔ`øÚ{¦Ò¼ë©ŠÍÂG¯ÂZù¸ãcM¼ÞÙ.‹½7:iÖK™¶—hk¢À£TaËjîr¼®eÆk<­rMgE“¹*ˆ·3â ”s„áá‘åbiÍH´)Ž=>åᬵòVŽeyHkF¸5h+ǽ<Üìh8ž ‚ñÖWö ›—“×P¡Gòf+h°¸Bö„KXîrA§0÷‚¹à¤k[f+¦¤,KmVÆaL°­ Öw3|‘ UÖ¦6]ù“µ¥J%TɺD®9kªjŠj@†âÿ©P²ÔJ²æ ¢Xàïˆ!×£òƒÄv—ŽÜÿm#j™:ЕÔètZ5ŽÇØÉïPm±®Dc(²ÔrÙª¨àãåàB9ŸUEAüÂù¥;š½p¨qaT/cÉȽÄia ¿RáÏ4DËÏÔðùs¬‡$’7i;‰êÈI¦fꙜ,Û^nuÀôý ]ö ©Ìf‚¾¡¹Æ „Ö†ë(xEaMÊk-ù- Ú"Ù°–¹ØÙ™Û0ø! Ôa¹ üÒ»ë PPÊ4 ŒŸÓ=%aÜ3v|”ò¿®Íö6iÿíj¿Œ÷ϧøÿìRü‡{ÿŸ/ÿ8õròEšÀ§øm?¹¯ÿ»xÒõßiì×·›Ç:ÿßmçü?´“Ç÷ñßïèQ7?"Ž&ó1:àO0’*ºþÆÉÅ uD)˜ü³¾nõI÷ÿx¶\ BXÏOn/µþÿÎùŸÇÿiwçÞÿÿNžvÔ_h 1»¶''ðKÛœáÆÎû]4RB¯ÎKô­{Ø>úóÙËF§‹ýÅÎö¶øV~=lwtÚ5±³³½·­gâßü¾Ï±B&Ö§x2žþúhõñóïBy¶œž t v:ŒF)ÄÖWs mÃ'ãÿn–îÿóÛ û£Ÿ5ýšEªÿ?Þ»ÿs7ŸÿÙŸŠÿý_ßÇãèJùàAzØwÛœˆÔ ¯ó9î.b…º&ËÁŠ$¼Lì{ ¿ýVvÑ*¢>ÄýˆÿÒS|(ç!¡HÞϘ(ݸ¨ÈH*_ MÅl¡)"ÄÐTDXmx[âÂFüz¢ˆ¯&ýÙØ¾Mʸ¦ã«`2ƒÂž;9Á—½]ÆjákÅÁ]MG «59hyXƒ‹`!9¤W—EÆ:lSZ0HÔ÷³ÅP¢Òk*¥á–I0MRèT̪xE¯›ÊZt½•.·¼rr§4ºÞ__Ñ ]¦yÐæçO¯Ùüé{t¬È¯³¹Õ„Ó qœ™T“ð@l²+%ï£[Å„ôW ¢I–n‹[.tVvGD#ˆbRË©ä#Ô"œÌÞ…9Œ0+!\¼75þ‰¯›µUÈ ELÕ¥a\T¤1_žPU6Æ*¥h+fmÜéØûñ°8|èöxÝlƳÁ[-'«1ê.RþCÑ.*Ý÷Ð0«Ã‚ Œ4õ;_Ì–sNò8ͤ¡¡éÝø²Q[µ32þv*ùU4L.œŠû/±”þg>¾ùß­þ•ÏšùßÓ½½í´ýÒïçwñØ =QýQÎìŒvûÞþ³îÉþAƒ<…ðã0€!¢®Í0pm·×ÁƒÄÑé!üÛýþÛ;þ ¾¤4^µ[G y>Ç­*Èæu×¢¿ÙZL¹L­òö‡a$f MCÙ&(8r “' › fÚ}À¾d+Ù™½%Pü»ô½T¢ËCÍ÷ÐÙ §/#,S9k¨{1]m-&= <’²c˜Ôã:MŽÜ5ª}O·ÀíAtûö[}€¦8ÂéúyI`@}øÑý^œ‹®‰!…!J’72ѱÂI”ON®¡ZËÈ_Å"cùÆåÄ:g_ÄšÇPâZ_Ãï©<ðåküû­ˆ£ßBOr…¯‰É8žƒ°k Hcœå@Ž:;‚_D@_CZ‰ƒ €T.ˆB™ZiI2k=]@rVå/Õ¨)ÎyEÀ7r?Âø|fÖ†˜ë©pÇYA ü H KŠ´ŠL~~oJ#àÿÐóJC£Ô\(Ì,3ý oÄL<›á ¨™Ùj%aK·2Ùo.~aP9þ?—Y3hfhQ2Ð%0$~‡4 ÕPx)L—1•x0-ƒ*e×l¸3\N™L2‹4 1@ãó«qÛÚK×o6A\Æe õÂKCbëxO^lÛï/ ¿àzÊ ½/9˜Ìõ L»ïµi>pÁ`w:ØA½Uv ÕÔ‰³€|0ÉÕãkR¿ »£j•ZjM–Ûìv º-“·UM¬1dÌ©sëÞ9Å:?ÔĶŒê'{£®W.ºí̃a;%âwÐs§ º¯"&=«Ô:¥Æ…ÝVE—J´¨‹›*©p g³Q÷~äAÔÐk5*š(kD"E¡€ŠÉ· ¬Dê t‡âå\Ñ+xM‚”`U/ß2V $ųjÏ㥉Èjø`1t§åNSP ‹;=&”›†®Fá…X£Ÿ†7…ª-î&%ÞÂÍò'S,iÍ7²0Q¬aV¨ +«p `*‰{–Ɇ zƒÅaÎ(æÞ#¦1<”ŸǶõØ¥F Cþ(rG)³üKvq(Gš+dš)ôj?B áÙÄ#Õ¡w$(iHê²òáƒé.rÐSšA/ñÞSÉÝÜÕÄ^Ì ËÙ⸇óò¢$Uó–0 G®& F\ð«¯R~Äp•}Ž1 3 ‰F¢/x^Dùæ/úB¾wÖ¶ÌÀh6.Äl@8;‘U`¼fŸÏi¶DÒ˜9e¤ú€¥5–X0øªòûÇ˹x4»ÕÇÕêžøá›ÄßüÏ¿gT¤Lÿ·ÚJì6òXÝÿw÷¶÷ÒýÿéÞ“½ûþÏÏêÐî`Äñu°H¢Á8ü¸õófßÁàmp^C7Nš¬ý< ßf“I0^ÿÜá–ò<œ~¼¾þ9 ëCú/¯>¾Þ}smûÝÎÇ×;o·?¿Ûýø³ð 5Žêfu?Š ÀqS¦ÏF*ù/¯®nž}¼†IðGþùr¿ýñ&‰ÄÁ~·ññWû¦Ýè}¼ðQƒ´ŽÚ§u€Š¦ƒ1T¿Ä+¥÷{§HÐ.2©¾ßÛLj§¯•™;[$@—,öG;7ÌÈüÞÇ¢Ÿƒý9‰’qhKýú£Ø©l‹Ã`º„‚L°L.f‹ëýñ–%íp9=ÿ9¹¦oãë£ð½øÛlñVœN£wá"Ž’«ŠhL`Ñ[½þ9AÕÀÁÿ âÊôjY ‡ËÀÙÏýð<š^«&Ây ª%^¶~ŽCºðº…'n†Kúñqëx”„Ó²8‡|¦"P1¡á` Ù¾ ÇW[z €<Êhw8.‹ëŸÃ‰ ib=q鱌|Á1©·Ì=´tÔVÉ?Caú&ÁüCy‹ßqé÷¡LvnþÌçDxI缤 Æ”ÆrX/!×ïB8v ½L Iñˆ¡¦_ÌÞ‡@ Ï)ÁâïEY Åa»Œ€°zÖ\mM@›`ë9 Y WÞÂ2f|%°Â@$T„0¾m Ý\.€Èb2[„°8‚;f´E hÙˆKhGž£=†óW¹Â ý\†¸ó> ’ÁÑÁCº–œ!Oåó;ÊBß™8_̦týï ŒãÊÖ–ÕÔ~–.Âäú(™=â7‘,‚i<&gaûŽÈêg6 %ß îÏfo߆áœbŒH,t‡Ñ7'[S >°Ðue×ÄV‹‚…§.£TÉ…¼ð´$ÆPÄ6€ÍÁÔëxA£F¼2;K€èS<X­kìräˆa üÀ´âÙ<RR¼—:¤‚Ìh2 c«‰”¬Í•­gKò΀–·\L1 ÖTv´-%¦%q8a©1jÃ"Œ—ã„C6à?h£ß2}p*—ºpÜê.çó…¢:‰ð¼Þ8”¡ð~4B¿Â±õ>XÕQ=½’™ ÇãG(.ðd #RŘ?ƒªRr0ÊQ¼j6E>ÞPªQ°Poî·»¸éÑëœâŸ—ûºÜðc?hC@ì‡ø¯渳ä踧aX¯ÂÐÀ¾ïÑãa£ Ÿ­ŸaÜÑ…›Î¤ñ[ˆï=ºA-’ë<ªHj úÞT¹"êýEÝ_~€æ…wCa’ ¹aÓ|Rã†i0UqÿÊô ›„ ­<-r, w¦¡eš¤[L£AEöŒ¢úŽ£PœÐ­Â–EqQhT_hšÃ ÛJIUCabIÕnA^âýXâÒ u]DJåu@—eÊp5ñ"IåóÅ且«!;6s¹â0‹½U`6ƒþb-Û‚ Jé=@HíúŒm·ä4^Ô!Ü Sm4jZâ=^%¸ƒ¡;àÄópCË€µ#†i ÅîÕ+å-2<€ ]žË¹`#ÖýB©M¢Íø€þ4¡lë[STÅjð‹å‡fÂŒÞ4J±¯Ï!9¥8Õè0Ôè>,'3Î #Ř zrýy4›%ÓY^O0ËScøV¼ìÏa¶Œ#D€•Dãjè)íôd¦B5±êëtúÖ”{{ÈÚ»ìôuR÷jl é8òŒË«cøtÑ£s6ô¨¯VàŽ)v»Y„ÃЊXÉ@¨!aFæb »e5=šDKdЪnÛe Ƕ1ÝN“Zߟ„#:=íÀž |ì”Qì»´cîf\d¶Šv!õ3\:õnPPH9Ó¡#*-çKå¾,‘½: (eš,¨ì8äÁ«›Zr…šáÎdáÓaŽ8¼ŽD¼â4ÒÈ$KIÀÀ¾N8¦ÐÌ"G©âú «¬¯ªÅz+Œ´U@€Õ%0?hÚ!¸‡et{vNBwãÈ9 w΋ëG O¥ñŽG˜††AYséae«‰ºNi¥XÎ)­Y±ÚϽ'žB)Àjìl€žÈÞÿƒË*V Š8}4Z3bFú¡¥âÑé‰FwÈ¢µÜº‰qp4&ÔLÈè3JÓz¤”…EþÓgHtéÓç}{|ûVìøFô3é.%é 7Wó÷6“qGuù"œv°µ?†‘ –Ï´Ä.c=¡PÝ™)ÝC¯«K/§i¥ßÔ,ÖÓ›Ë|×;ýD"®d¥Ie#Á–Åe;ýÖ+Ë¢Nwä‰Y¢@‹Ðx·K®Áu£I4(´t[§Ë‰¼ê Û3™ ôq’X·â-Ù|ÕB?ˆóÄ?_‹øve„#滲x£ÞU«ïâ<1I8WP¯ß¬õT-  œy™ \0RÉô Êräü`/TaáIc¼A7fãÁ%MÆä<c.©i¢É‰‚™Hô­É2áTmYr,-µö—Et+mtÈZ–¤ê-“|؞̕•ª"µ©Lb /)#åu……6V/š¹jÃOÚ¶$­& ´D½›ß…íhJ ’ÓÙg±("¯2¦û×ú é`ˆøjš—0] CÀÁ<õ¡n]ióÅì|L(öÉ8˜ž/ƒóP5³Xl¹Ìqņ—óŒÓø'Œcм&¤V†ƒ1$áŸÓ¸„5ž†ê•?ÒP Ÿ´+,ÄV똴E³»““öß(… ­”Vݵ|íýÃgõ}ë« NæÄ×bâgS”™dG?&¤t9‰íã‰(9Ç?Ù  £ÖõÔZô’(”F³Eˆ!Ó@'€L¯ìãj[´Ð‚i~¸ §4r—‹Ž~±\äê¦Ûãøuˆ#k$@"ðÙHïPI”òñkMLuʉjªõƒ“<¨§¢ôàÀ ¹¥W'Ñ»´f9º>´ûãPÇjÚCé’k=û8Yrä ã»´(´â¦ª0L•g•Èí”ÚÏÆ¯ñ$׌k¥O©e«¤ ;¯Hw^îÍ6‚«Õ!)†Š—¹Ø¡mìØÜ•±W©-PVr¶]O¢HØ×ÑE JJÆH’Ÿ%%£Ÿ9J$fKmYàeì׋-ä3lÜÚÀ“Œ‹à]˜Z‘º–kÕ~¶t)ÒÚ„6›‘–­çqÜ­T&ÐfŽOLOåëÞEêÙÀȘۅÛaòj1¸âê´Jˆ“×(^ª Yÿ¶]Øyàl©¬ÓÊ .'Ë)¶I#,ñÍ·á7b‹¬ßÀÛz% Ç9œrx:=~*¦çº6Ï–”Œì|xæ\ÑäV­’\áóCf#"'cÏY#)õ!ŠX‘Å·…òëË7¶‘ËÑ)M\~U ´*0msÆí*³§²eõcš¥ˆw]zdl>²²h¬ÇK‘ >&µLXÑ[ï¢@Ë®ò‘g ²z=:‡sRjÆÙÎÛâ&æ 7k2 Fê‘ N쩎³s2Ÿ¯&³Åü"XÃ:N7¨D4‹XÐRï•1“ñí¬0Ÿ (<'zÇBFF&‡¸_2“z ›ê¢òÙ1^û š'TKŒ ­ÄšlQ9íξesªµgYÆš& dk$ÎÐä¨ÛSËÎr:E%`oMãäéF;Y¸)-p³ðj¶ñÅl9nõ—јm¢ñ=ù,dnô•6|TŸ'hÇ0é^sŸ—[³fP_b‘©Ä:Ç>hÏÒFlKó©‚ž+Fhëú'É–\‹!,Ãi'yÑZ˜ê‹g‹šà]Iä’ v,ÈõãÖ õc *qöÖA;ÿ´³qav 䆱Å}wÙÆ&±@}•ÈÙ"ùX³½²^9Œ.ò=Ðå†lñÍIC —Î;ñBðp1¾’kW᳈æ3¨ì!PõfÊku÷ð0…ö5Ç~‹æRùnM¸óAû8”Á#…¦Ì™$4(ºjåTD(ÉÖ<€ñ ß0ó-:د—Sù ïÙÇaªØ:{§|-lVÒ¯`ÚÕÈl@‰'!ª”(žPËäùÞ3¾[ F+(ËWDÚú²›÷QQ½‡É(tth×Hî›Q%#'Æ)ZúšÇ{êDá=j{ÖøÁxûü³}ÓîŸ/ÿdü?¥ïïmù~â³Îÿsoû»´ÿ÷“ïžÜûÞÅóþŸ²¥HçOõ+ wäÀåÂýåÕZÑa¿R‚ޤh"üxMº?j_Îýv÷˜ü9q„2^žùn¨üóÕ‹:š²Ð4VÖ3U'ù½SMr¯sz “•ÏãG‹yNW‰¢ÇµU¢“ÓÍëònyï ‡¥ö}}Y¾*ÿöFïòÇ+¡FGqõão([ÞåÿýÁý@w%(E]Øs°¼$S´Ç]´à鮑€Þ-{U¬Ú™ÙÄ@¥kŽF2Ö)_˜ÐŒ½ûc؋Ƴóe(qäXÇØ äwœ{8L·6†±ãµÓª±:d-2Bö¶:K3šw°nQ´ËèÖS¸š=…ÊByeöa:Šòؑڤlný@°çÃŒx …Ü›Ì&Ê1ZAfAÍ‚û'–Q‰ Ãé»h1›RÿÃÎ C±os\[2åßRü=‹Äà `HÎgLÈÒŒhâÛ]’Ø9±µõ7\1YÝäJ›úxû Z5å€e¢ÊömYßrVVPæÔ‚S͉ÞNpw%bÞ[(;ˆéÜ÷d8ÆV‚A4@šÀ¬îAî ‡ÖÀ*ÈsKÙgôFÈÕРQ&4œj¨M”áŒv"4Û1ûÿ²ÞòAc¦¡Jºjħ¶ß°†vÕ51c*€ÛÒM]bâ#þA2!Œw&^=­áø“ˆ Ÿ¶íÃ5¡3ÈH6ÝwÑlL—Y&æDÅ$ 3ÙiÐ j÷DRCÍ1µùZ[¸—5ÅüÈ#1F¹GëI‘Úý¥áUé]ì2»_ š¼ô–4µU™5‹»Î#E–"ÂúI¸Æ1)«©‹îXôAFÜñ(oÔ¡­5òDœŸä‚ÐNÇÝ^Z=ƒâ¦Œ ªn&a0ƒ[BS1_Y݈o&¾Ãœˆ©†H;Ñ›™,ÔiZÒì¾1ÀI¥4»â„T#Oî~ôgš}Ìi©½EÂ]mÅ¿âÄ!æ~½­N%’ HM7•>¦)yiÓ¼[K»dªÞbŠ Û¼iX°¶³ZzãéâNÃó ál°ä©.½V«XÎ÷cµ3ù*…ÎäðL˶3á0k@ž’Ðųh%ž’ƒtxv´‚™+OLq)'aç0}q[l?"›iÌ[ÅÒ3'¹\¦aqÖűDŸ° æq"%&š¡X‚r«“y±U Ü`"[Y×TR~^ܹÁ3‰,®™ ¹ÒT2"‘-ŸÜ,Âé9Lóöè 0xa9©>CÒŸbË)v× I§˜e†{hgŽŠ«Ø[4ck·*pÍÄ7i.ú§ãi&9'^„ÿXF ÔîîÉËo€Ò7T,ÌœFØ„fÙ.‡3+Z ³°$KÐ"žñl:]õRTÓP‰—Žp"«ü+⌜¿äº•¶¸dt¹üâ6­åÏŽ<Ñ;~oÐb¨«}Z³Aå¡"Žsë!-^Â9(ú6¨¬žaùXªÆý€ùÏÞ;€Ôú jk ÝØ'ýp8äŒ.¢†w• í5'îºqsÄéÐÙ’[¿¼¢£‰‘Üv‹+×^©#z±h€ÝÌpÊý ,t¾SNc¾¬³ox†ÑDFÖIYO¤â-jÀ £j,’[zD`÷Ùùx“ε\ f«?KtnDH"2Œ3åî‚’Jw”­¼ŽâÚ}Qï‡I:àaÛçBkÜxK«jšWå1é[ŸæõƒbqŒZëc婊B¯·Ê8€±sL•…^Hv¡t4(ÚÐùÉ4|zaË ¥ã½´ÃLÏÇa*~ët>›zÊ\öè¾.>hÛÄv¼ü@ º?[N‡jºÌqrøPUØ8BÏ`EÞÖH†cRç êcœ§ç$YÝMyÆo(EÁé`Úû0^Ž0¢¬ÜïÿÒXüy;"G§m ‡g»@™Û>TJ[r¼@›ÝVºçXp±èQŠšE™ß%ð¤¶û;ò‰>XŽ$»Ož[8¹IM.ó^¿€ÁîV7LëPQJÈÞ`ÎMŠË?<ó0œ_Ìð~-¼”{oÅ‘/µ°˜¶m±/ã *ó|6'otã@Ê}z„þJôe “cÛ€Mø´€P}‹có„T4‰±x\ÿ7Œ)6ßdöåÅ ,¶‹øMvƒC¦=9¥Bž7æqýEA_å`Á@HäCEÈY3ên^“^–ˆ™{Y Ù‹æI†Ï,t9:ÔºüQãÄÇWÚS÷mx¡øPûû1Úîƒ|™ÙM-uÔˆ?Ik—>ÁUÞBJä&´/3¨ÎLeQ{n ^”ef#¶@²MÝôàœfsh‘y¬UyÖ:ÚïüíçkЦÇóZ«Ò=}Ö.cÁ{k‚GK“¼ág<ÕðÇYôóÇjÕlª´*‡Ç/?_OÞ øÑ.c{Qxñ| BÈZt4sM|» üüüñgã8^­’»•s¢…UñA;ÚÁl<[‰|Áö äÞYÆoW8(Ä÷8ЊQÜM‚ÁÛ“d¢Àõž H5€\–¡ä'§Ým„ªVe]¤iZÒΊ))‘%Ÿ™HÉLШ^°"¬zHWç~½~óê¼½ ÈÊFJú€´ZúÇ'cd¿%eÉv„—Ú„(UI¦GdÎO²óyÊI×pF£’2“ùÌÔW |Q |{[0 )ͺ)>¤¨ß^jýÏÎxr‚ª†ÙhÊ^†°Â„©*ƒ÷ÁUzY@ã£>¨|‡ìè¤ÐíÁ¥Ì'·Rë‡l£@9g±–«sÒm!ÕhÓÉØˆ‹v+öµRø,…›ê•Vƒ÷õJ9á’·4O~¨ôd~)>U˜Û¯˜Äª‹¢G:VþJ+T»7­Ódi×8è‡ä„¬¦¤Ù Þ `YœC#ì÷á»(Ða ü„kÅ Èç’{ô€SŽŒlD¥97 öÙF«î¿óÍʨNf¢î©:Çâk}°0q€4¬n9âS¤]´i›%{ŒåfvÙõdô€lÞdþ„~Ú±<ÔÑà UÊLÙÅõ¾jYœÏÔòA{© ö£Õç¡Ü_BëÅdÌçÙ"¡ñÃr}w8¤­wò=äýâDF¯’.ïʤǮgÒÛ7:ú¡}$=ågNËdkkDîùu¢\yd ‚È ëMÏ‚ØÈ•^fÇlÐ ]¬v×®Ã*Š-,¸IIïÒU§ÙØ’lí?Ý`±xô.´½|¾»ÖZNhÚ=Ž1ÞJ›®VþPÊóÕ@£QˆMð ݹ¡ ~b–ú`‹´ÍM«'г½‘ÌPbÏ–É£ÙèQ|5Ü»ª~±Çñÿ<¬·ÿUâ?oïÞǾ‹'Sÿ“áø:çC¿­‹`ׯ~ò4ÿugûñ½ÿï]<|ÿ««ñS—½B«8ëýí¯øâK_q@ÔÓ¦ýXßŠŠ€ûÝž›Ž¤O“h,Óуôì´×jw]°ÆôM¦qôÒMlj•~p|xÒjË8<ñE@gFeŸN¥ªLåÏ}=/V H®‚yÖK_(Å'ÖAÄ*"V’+ŒfW$)(œ% °‚Mè¦S¦ëöûCâ*„<þ5o%XÙÿoé"ÀÕýÿñöŒ éþ¿sÿó<¾þë²N¯]Á”WÒñd.è¥s(gß°Ä‚)ubIå3gá%Fr‰øÌ.’š< Ž“+tÿ²"%ÑOò+¸Œ«Z~ÃÿXr©ñŒL }œTËå•>¶‡sׇr2©™Ù"šï.ðð ÊÄrùÅŒ3w‰ ™„@Ð)zÔpçhs…µ¡ÞEAPF}TèäÄѱg'F¯÷7øƒqð;·«+Ý_''ø¾R} Q2Å”ã_!é×ñ Ë7ŒÔk9â4 çºF¯nbGE˜uyTuAŠ6‡¶À%¢e ²"¥½õÿŒ.èaF­kÃ]ŽëÛwŠ,; Y ¯Wš{aæjJà ½04š ÈEîGXâ…‚š[—ÓhtÕ¸œÃr²SNvKv£ D¼WŽâ ®E"—³-–á÷x­¥6×}pIœ·ÿÎn†Õûe½9ö÷„¼¿ƒÅŽ:r\Õ’«2Ȳ֩Lg²û”±M:r,™1t.õûcI$:êÝ×È*þP7=¡H±v“W[ìVEï­ÂPCES™+%„U²n£Ýͨv.´“þ¦ ª–¼cáéf< ßcê¶²àÛð ‡}ð-FÐýÊֻ⣠5]‚äË+L( 7ˆâëäÝ›òþÉ ¼¶ê£^ñõ›2R.•1™u;Úä­É¶UÏ`˜«@£$HR•’Ù~+(€ExͦRc¢þ¢Ø]×à/§Ò* À/:™ƒóØøüEÀì‚Ñ5@45ÔñVL—:~ѱ¡—Fïª8ç;h­Ý†” XIB½r–ŽMó¸TÖU5 ±K'oŒ† æs%hŒuã­v.QZfšX8t=¦ùYT¹‹)gÓ5xâÙ-i¬¨‰'ݯ—)°>¦n;#é‚ EÛÄ£T áxD·äIM;P0ƒp<öÂØ@vÅ5&Õèþ·ãÑó¾SP ÈR1½¿ÐÁ«¡(n»X<^ÕíuZGÏ]<5Qö`‚ôhxÒ@I⾔ߠ)ìxš?´<ÙÅ©"¤&éÚr­ä¿gŠ»9•Åœµ[]*Ô°^ß¼¡jþ”Õˆ†4¼ðCボ‚&røÆ¯ß‹˜H ¯ïÓ9ÓÌ–Õ""ÄEDF/äùY«×m·\ãUõ‘¬¬ œ£Xe¢B=·ßî| ïÛbìCEÚ”zBßä/ÍXY®K«+)}Ÿ2¨=óìaº©dÚǘ7LùB9"®n¬+¥“QÛ8‘OÏJqv)sZSH¢–ž'c›Èò,óÜ´Ô°2D #yï·´#»kf&{rÉ}A2ë›õ½#݃›§G°`Mv±e{ªWs-.KT–¶ÕD4hªåA~q»¸·¸}»¸}/È@öÈ ·¼–VªÞïSb€ÒïùJo—‚Ù°ôèªÍÝk¯lÛë4qq+tQ!ü qoó*ßUU¾ƒ…ö4uÃ<äVbá®+7fÇÒòçT–¼¢Ð\À&C°¹ã·ñ×MgQ tÕŠaŠaµ®®°3šhä×W¨Êø*ÿáŸi9y喲ݠ1h—WqÉ¢A¾Ž"z[‡bJqUlàv¢á™:ЋUüîwþ‚pãrÈ”8LÚ³ÏÒÉÔ‡ïѸXx•^@8skø•A¦ø » G†¤K¶¡µãFÑ4–Li¡Ux‹(é‡eÞ¬¬{¿…äÓZ™ÈV$eâpaK°M’ÁÚû´j)$¥Rf}¤§ûºÛTj`ò60f>Ÿmàƒ„*¢“/tÿAµ:Èà@«™ô€ HêåÁ*]¤•¦ÑIwî4ˆZ5@º%Æ¢´÷O» ´L‹sœ¸äa5bm ,ž  çÞžÞx çŠÙ¬µJW³a-ÅE{Ùbé©Jv…ý­±IµÊów9Ê”G8Ÿ÷å|î5æ‰â<×:¡¬#ø×ðça®™J‹õ<|%?W-üÜk1q›Â9Ê ê —t‰g–¨É„ßáZ~¨3¥›BYŒœµ·ÝxNØô€[Èlz8¡Î’²8Ô~ pÎ:Ïo\;e?aîoSè'/÷Ûx>‰¶ê8¯† L¦8@”ÐTcšfY# –áõü'û4Ô<VÝC–;òœœEŠÆ€QÎãÉ‚&9îhú‘Ï™q["Z·(U»åjYJ{èA¢—Ó Ñ¼•i‚¼¬˜‹ã ÖümVçVÿX¯MåKùÙV˜< ¾jµ©Öx–Š]6*§”a¬Ýê!W–ͦÆÛ¨W› ¥ì(Ü7AL™mØú³jÆ ÃÖ Ë–up|¤úŸ²yØuP´Ë´ H9+8µoú•'_n2VPމ~å‚Þ¯$ò£O¥è"žÉ–ëñÛø>§%äÜ{˜//ÒŸ¥u3‰áÃ=xw•Š[³~2€ÕMÍšPÃ^º_þ'ÔšÁ°>æ96»Íu¤T’«Dœk´Sb_c´ƒÆamôÓ¢(]érÎiåÈ;êØ›t!ú%wd¢@Çh(:‰Œï¢£xX÷À<“Dæs®4þH£¾Üüƒà¥öˆY19LÐïv<{ÜŽcÍïvS¬~ârÞä2g¡Çïè\+¶ÛÄ÷ØÏøx#ÎW²>þÞy}4w< `Öš„JZÿ”i…ꛫ©~kÑÈïy—s¦\%nuäXEmÆMöâ°½¡¿Ê~ÐÇE þCåª÷h‘¥Ð²kÊ uDÖåöãóº’<Gýü)ÜH3Ð$3üÎälÑqÄmçÕé‘oé‹°<ž­0=*¡hIæþ²ÎŽ`v’GÙlVqÔm='èhB½Êå¨ùÓºPú²µi €ÉÍÊ@Òz·Bêï´Ô_’Ôßy¤nÑÉÍ Ûƒa¬œ¼‹ó¦›XÆž,#ÁeòóÐ2ËWÊ[“n–Vn)l÷€òp7wr=ÄéÚŽ1ÎíøàÃ]Û•`r XÃ]mÎÎ JŒéå²Ûø+ß¶˜ß†ºßg‡ÊT)iä cH‹¨“÷Î(?7¬׫3“Ý07}xZµŒ`q—áhAÌ“LÛ?<3é6€ ~È–qiÖÀ¢40%ÉÂÐe{’¹Ã¼5ƒÁl5[?}Jçf80›»I>hé%ÙŒËÃ#‰lJŠìÀ0Xà—¬±Ã¡·¢w¯ßH ÿ ÏÈ×±˜òU±cö´ýÄiBìÊŸëY[¤'O%«ÕU}‹û>v.ì[9]?öw}O×ÀÌ$Áìú'Z·²ÐyT¨fö`»¦Âú ä”ÊÑÌþ.õNÏ3'4LÈÓ÷O[ûl=…|ßÅiÏe` ŒcEº¬i¶s ØŽ:Ï©…Dù1\­°Ç@ ZpäL¶Hâ%kʈé>#ŒÍ]s£†ÄP0ÿ©Vy~”3=RZ¬Y§Ù‘¿1ñÌèÁ52Ö\ß|Jæ‰ öÀ/榚őXFrCÓËçÊý=ÍffO¶T¼®°‘MöM +î y„u6ʿܨN fGÕêêÙ“ªš5¾Ë©”wV¥¼t*Å7Ý’™®­ž¨BžtÞDNWåFœ—Ûd•—¶Ÿ[ÈeÎ!÷ÄÐD® ”%¹g’εh3žY°{×7©ÕIά‹äÇÓ®g4¯éû"/{øÜÕyâ©k´RõrVkŽg² ÍW´­aŸ†E<žQ r†¾ÙþõU–€2Ào¿mä´'Ê ±=©%ÖÍ5*À+X©Æå@§lû™:ãÐF¡ ªÕd…0’~YÊ¢W§JòËëˆE‘_™2«•¢èé5ÞÅ+Üé’wxÂfŽŠ4.BoÀÃ=x&ë]ÙìdÒ éÝK¥ÇÁ¤? (ûX<Ïê_"¹¬•³CæƒHƒanIb. Ô\ÎxéBò‹Ä_gr°tzë] 0¾]’YN'ëz½Î¯ˆó—Œ»mï*³÷e0ž=¯`ÞãÂU¾%$Éõú_iS”ª#h¸@7WGóùøªHÇ)˜Tá<¡‰IÙç^kxg#óeµBï§êô˲~Mu+MÁöâ¥þÿ‹iöã|×·¦]s™@ÛPç’HxÒ³N&&«ªJaLÞyÔ;îAÇù•4‹ž“»u./y—®6÷ÁÚÁ «5ê¢Oµ*¾†/ß%¯WþÊ´X| À ?hrŒ>éo±0ïØýû–w©é0fH¾&Ô¼úN¬5Ìrúv:{ﶘ’>Äiw޶à˜ÝHᯡ™E u0ô¤Ø¸®›_e« ÐJ„°¹eìzã MŸcZ°ˆèU¿Ræ=nØ z¥iÖU–ñârrë_4üÆ?ýñÆÿX$ãG§í–"­‰ÿóÝÎv&þÇÞî}üŸ;y8þÇÉb†qT¼½k{"uzQ"7PN ŠÏ Ha…hèµ ·Ýë4˜‹› í4Š=ºÂ¨*CeSP.+'2Ç®°PL4 ÚAjÈéy6EJž\bŒ ò‰ðlà9ßN@GpòÑ\ €Î†áˆ‰ÕMt^‚™scI“¡|çkᾊáVàïGyÈWÇuV_1ÿ‡ú¶Le¶ª:C¤†6Ed.k•¢íçÒ‰_ä”VÑ€%Ü‚/˜ ñ`%Â̦ș!6²6®¦ä$%u±T‘è§Ÿˆ]ƒz”àƒÀðh:›v˜¤žÂõ¡~ä$ ð¥j¥¬æ ..EO‡1šÓè—%~·*'Á¼%ð-UäçUãM+ñѪ¸êÉí~ÕunÿKU¸²êû0xËuCéØqt!ùó{±î…L¯Ê#áNï6þqxùࠃ洎ò¸·«ü[?kì?·vµýç»ÇOwv2öŸÇ{÷öŸ»x6°ÿXPAyªàšE'6'ª©ºMPRwŽ…‡š™C[Rïø˜c¢ÞÀØ£í7œ³´î(ú9柪×ôÃøÒøT²¸T/OTSxTȈjÈQ6©p*tÒLSçÕ99q¡tU• §ŠnÿIìÀð'¬·iR½E0MAuDJPu_8€/‚ø¢‡1zRyªH®¶¼ü1]ívàT¨Çt¨³MW£•³ÃNÒ6J· §íYG± ‹µH ˜ ±:6,nÎèp«b&tÀUzpŽ  æ^\äi£“BŽß2~`ißqôf]ï5³‹÷$åS}>jQw0ñ9¥HTzD´[S˜äH’:üa²„yƒ<Ç0Ò·äƒù>õÖ#ÿt0åÁ|€LD¤1ù'­[ä´8©<š)ã­Ç+{¿c‘öÂ1;7 <æŸ,ÍZ«Bp3é³B¸Lº‹[hwl¯£â‰ÍÉ×kmh5f[=# M4jo^')ËjÊP¬Ó§áûc¬HïU¨¹W&ÐÏÎfs©7\‘'ŽeI¯$^T. ³Ÿ%ª·c¹½ÆjåPgµæ•ÅÛPÖÆ*¥¸Nì$X0CPáM¹À@v¤X‹Ã¢#¼kP^* 9Iâ'úÿ³÷î}mÉÂðûoü)&³ù=%c‚GÞÅ ;:ËmAN²Áü„4Â:è¶a`Ïg»ªúZÝ# ^Ûûœs<»1ê™êê[uuuuu•V€ôx‚3<ߢ@¾ƒþþÒ­kòý“OôÈ£Ù‹O ½ãÍîMZeËëR)1?@N¦‚ÐæQܶ0B´qìÉeÄqyª+©’¹³ÊÙ«áÒϼF÷½q±Ï{âÉð]Ö£î»A·#£~õåÊ'áöõ¥i(t"ÖþDß 3·Ä´]ƒ²i@È׺Ðôm«ø¤‡wL NÚ‹üRGVUÐõØ$eÊK¼™WÂþö’A_u/÷ˆ¶¶gi2{H*Ï<7¡ðÜë’3ÃáéA—Ó¨BKf7ïÁ=4:§¹kˆµˆÜLÃô# ?Àµø+&kÏ3$ÕEÒX;¿8ƒ&y":1­q†<|¬E½¶­IsqŽL6Ö~m›-èþÆvA³{¬‡Éc/àÝÀ6Š—VÚ@?¤¸XN3ÑЭÿ}¤î-gr¢¨ç¥ðP†é<äN–Ù¸ë<þPÈÚC ÿ„ÆZϧ 3ªó¡A†q#N@E³šKp–ôÈÂý鸽äò(oÕmÀôU…œBi –Î9qý»ò¹x=œÀ¼ÊÆÈåAвz$¿™W|H;öÙ <Â-ó÷|ÅÙ’ôN]`'¦» ©´"Ügžý½Íy5»“NÛFifn0K‡fâx©Me«F•ÔõXÂA~aý{Бƒt?Ùhu«20NŸ…KqÝ¥ETÏ$nõcƒ¿äwÜŠb~QX|0™Æáâì‚UCÈT™©Ñ籜K’3„,&»Âu28«,h~ÓÝ÷b0?ì'‹Á°Õç{Ê7£2¶Õ·Å õ™t4½ˆ™-¹J”Q8ü®OíM»ê%¤Â½ÅòÁZ©³µE¢Ü¸Œ'skd&órÙdf+ëö¸W.+Äl·òíLÊfœÌ€­ZYgå2Þß[™Ž:á\$?XbÝöpX`¤0¤Îpxlï@Ñéõàc2¥åÍ¢LÅî¤-Í Á­@ˆ½-¸mpžjcgãþ6g¦…·GúOð¡H„ò¤eñŸ –©·8jÙÔ¹ËO¦Ùòº¯mþoe°.g—‚7WªË‚ãgu/HûéÌ•#ޢᓠȂÑuW΃Äj"˜ ¶´¿,:·ïʸræo¤d[’½A>?ê f+z½š¢Ç½çÖµ-íb5«øœÂ<ÔYî^Ú|P÷yU/[s‰siÏb?rÁMÑìWÀÌ3Èîµ@bµ,(NošÎSuSýô¬²œÔྰžb1ÙE×9d$·+Q8´Gùõ…­-Ö+ 깤0‹Ò²ÛªÕ¨;ÂñxнC% ,~$ìåêmóZNþ‘/SÇãìFÉã±ÖÞ}´öÓ$†ªÇ)9Â’—–Mùˆ¼²év~õné[ÏÙ¢9’àV툆´í:ÏfÇr‡ã¦¯P ²f­f¿ªWdµa²J‹’*AQ¢ëf@Œ@*̧îJœ:$wVY¸žE‘ÓØ3¹QNTÝÀ}õ»D¯ŸŸy׫쨑§qˆÖ`ç’ßç±Úv!ªû ˆËk#Ÿa×+:S ?Q%ž\_vf\Ñié9_j1`B'¨ÜÉLÜ&3¦ûŸD§Neؘ~ø.EË“AÊ£åÀ1M¢Ÿ£1)3’ø6~ç0ƒÊÖ–ÎøC5‡µTþ>{Aq©ï…Ý’k#Œrˆ”t/õœt%f-¸ªÎjJȇz(h2:8-Ô²Hbqˆ.˜le!›½ýûÌBk‹«XO’O=²Yœâ.S6ê‹ÅpÁL<²©X¡eý-€QV–Ó"µDžýÁ,Ÿ—™Œ¾\…n0Vq0žã)pœFûÛEq1„¸8J¢x(G7슨–Ë£~.Ýî‘¿ÿó wC)VK«®;+Q?/"PÝê$ ©ëxž:“±<‰ôÂøÙBÝt.7Å«M@)ê¯6Jñ©ÑVþ½#/t€T3uW¡}=ƒ@B}e~:óî[ØÙÈèEŸË3Ô—P'¨E:T,ºj€ý Èñ|6®ìffHu07oßv®óùà]ö€ÙÃ5Ëâ`r Ãõ-à°) îçx0ˆØÅvTC«áPPSdTÌ/:Ý+18+-8Ö³{E¬ÍNåŸ)äöîRzDoƉüþ ž29¡?Û€±»D–•UðS•ç)(‡íÅ· Q£ò~ün0›ŒGæJ’8ë„tÎ0ƒ@ Û‹àä8¶™q×ÿèİZ ,4sê<]zꟻ†±¿²¯Pà…u‰(Rar/ð8 %@^®-¦JMÅ{G%K§S ·m<`˜œÓ¹Ç鎆JIE£«¦˜­w‚ƒÃ ým‘Š.$B®¶g—°$ ¾€W`ÿLaWWpâ m¦¯Öà™ÌaŸª+ ª Ñõž'®Éb$ˆZÅ‹{®­õ3²ÔÔJ ¤gÁ=/ù±ÃH¨“Ü‹Pµôþ.ðMlù=gÆ1MCJb®¢†{ªû[©Þ3¨…DŠ.uòá2i‘G£¢ëŽˆ‘ Ix£è‰ÅA¯3²ï¸B‚äT¨€h¤ÓE´r6)õÊ#ƒ—Äòï,=4²˜ùLÆèEŽ¥’!–u0¹ñïN‘QÃþ®˜“0×¹A,’7B±Û lw*«‘ž~w¿€ë•dïtþâuko7>+Ü·ª}jhÜN-\» <5*8,'^(„Ó#êd«dl³½Ø]ö,Å~êl™…@Ï3tT™­¼ Ùœ”0¹£}”H–¨`ôóK)ì?±dï!ZÒõ A©jxµ?[з§j5à|Œç9õb´ajlÁVÜûÐd¿ÅßJ:Ë—’dÁˆÛÑÒj,w§|£5ì\L`Æ èfSeù‚æ%Qå#By¥OÝSlµ£±¬#²"‘I3©WæŽÝþž¹ ’Ô5¾c·€ý”êSêM‘ nJ ®ƒ85楈òŒç47!\ñíä[ø>†‹±ÍJe}á:¬º«ÆvÎ` Œ÷¸Í%î@¥•i^Žî/ÍD7oaG⃇¶CÖ?¥QÏ£È"’¦¼e®ù¬ËWÏég#@6˜´´T¤+gØÊe6?À/I© Ýf™†·êHœ¹#Å/×i€Âi‰a¿¬Œ®ðwvÚdÆ‹Vœô3L•(©­¥hVó.›Ïïä¬n‡„ü¹6äÒ/BÀ—Lme‡i“[µÁ£³v¤ï÷$ÐM a{.Èò"çAÀcuàPüJhõküò¾‰ˆœãÎé f&§¾F?%A*§ëÄw"`¨<èßQ,2ËaèmÇ(¸ÞF÷zèÂÄ!ÆoD"ŽYØ7ªHNˆ$Vå-Em¨ÏôŸ2ßcÊèmn,DX/°³šxXßÄ RÏ*¼©ñBiD’)̵… ývª@+þþ1K\¢4ϽÈý,ÆØæqt?,oòí¼íÌôµƒ¨ëU,¯+òêC/‘GÌ.ÀÞ÷·Yo7ëCø)àÀ³ãÍd»×ƒë°$ AG¢ TXÎ:bæ€ äµW*Lk¸ŠÑ—ÈëºÏÅïP&ûº ^èú‚êòa«d–ÌóaFÄ&ˆÊí¼{®…  7øêM¼…¿ÅšÆ pRiìÐ÷M;â÷ñ8û]A‚_BïŠÜa.¬DbÑ©H4odaU@lDL°q “¤W ˆÑ¢¯×¡¯Gƒ1è<,[ ~éA_ ¶M68F¼}3³! â;ãUÉÐP(ÛŽqÛØ»NSQD×ôäôòzœØÌ Äû`–.]Ü2 ÄJ5 –-0Y²ÇÉd6—Þ?†Ó·‹l>gw¾øÁ9ÐÖ~6»ÌÅJxìÏHp6ŸÞœš—Ê ésÅ­ž‹þ¹¬TÌUø¯Óè..°Œ”t&h…rPÌiŽ;ÒÖ7„è5™wÐJ¼µü‹ÜÚŠ]*J)êÖVydTA@7-zymjð˜ 5µb'7ù–˜…– ¹ð*Áæ/NKOcÌuýÅÏåÌÑLߌ[A£='I‰£îdÜ…ËÀ¦>«ÌóJêG¤n$‹¶gÝ·PYu§õs‰?bÿE½¤b,I57¯-ÓG/Qœ5GáH,aä@hì?¯sòÅEÒ ñ'dôÇn‰½Ð¹•£€i«‹•ly:s‰+Nâ£bû¥ERq*òQa“k¥ÂËP’Ùe ß?kR.bœÕ‚¨„üæx<¥#ˆKcnë/Qe±g#æÄ-êÏ&#n˜¼b#üT•”‰‡ +é8IžºFÁËŽ’ ávÔÝóXÈqfù]ÁkÀö79pÎ;¸q©sØwr)Lä^« Ë›tBR¸¸‡jà÷(á!›Î**½‡V×ÜM ŠÐøæ”96Ï/Ò^ÛlÖÊ:qåLdï ™®3~,¶ˆ`i†)ƒÄjTˆZç´øër\¼°.Îl-Ò€B‡ö3wAðšGAFؽ3/1DWöT†ê” ×.Χ!! ÞøÞõ…•Fú Lü†%Õ.óRâ¬.ŠrúëžÊv”Ÿ=r£ÝÚÕhÜ{töA£ö™Æ=чøØ¾Ò9>ÏWÀ°_¢¶ËÏ1ºÂÏ‘ÉAnÜ4¦È«JÓñ|£¬®Á9²>—éh‡€ÒÅ’KDßÓyÍ…Ø·/Jï*áYlˆ–/òªu™ €çÜX[ÈT‰iõ.*…Ì”SD„ë¾[žÛͲ—%ã/¤KeÏ¥ ±˜³(ÚÂÞåð¤ÕnÆó3vÕ˜ÕJ"Ø>ÙÇë]'ûP;ÚÎ/6WŽJ$$ÖbÀT?`£=e¾~¤O%ÁwŒ¯¾Ž§¬yå5=eÊë;B ЊÈÒ¯9…Hô^'äaÚØú)û?ízØOÙQ6>ù¿i¿¼êõ9(ÀÔ,‡a2‡k¸A7ÿÍL¢)ìÄ÷ÊÃ1\øâg~î{÷(ª7¤ ê›äaíøoÐ EŒ¦ F$S/z‰Ó4¹…œ.à¹'ÀDn³„ìã“ò‚§yØ{·û@=ž/®U”ÚÏ#«2Kr,b‚ªiSÙ¨HüuæZ.ß0j’¬é…µÈ H‹µÌ®þ"¹P¼ÁÁG(ʽ"‘¢FbL 0§bƒK]Œ9ž©ìò“¸/„@îKŠúSIèMœ„?;³ú–¥6AùvCñ•¥¢´ ·üJ3†½þ‡Ô\î¦ÕGTTô形/¶w=RÅ¼è ‡…Ê+x¬Í3Џ>ük%4·ï}HQ4‚*¾$7Vjk ÿ€©÷lâ ö‘Ð>|ï N_Þ>Jå‚eI‰ÆXÉ™>D²UŰ~¨Æããe´©#˜GÀ~w#ãç’¤@ãìgý‡TuE\ -}UpÑ¿Åf?sææ„÷ …3IÏÍÊC÷kÛ÷Q«ï¸ðFï£ 9$G“qÆàQy“=åý°)Æ€ÃVr¤¢jH áÒ½6’NoÏp;ŠÎÜî¿— ·97ßÂ\+¹Žñ‹b¦mZv¥kRý´cúbÉê¿Kè>+C´=³F˜ªnƒMÊöf©¹YŸì¨9 ëTE‡¸M*•/yÔ„ºbs…–8@f-óOžäz*£;¼—ÄåF@[Ö¥ÒUj|ç ¿òÎ}=Ú,Àl£eÑÒþmÊ…ûÅwb@’÷“ÙàU›JÅ9¿ûâuæp4BØ—EÓ °¦™™G$•ÕMnŒÖ©0¤‚‡Ùð–`•>˜Ì·ÇŠOÉè&»è‰œ4`i‹ZG]£WâÏe*Q@sìx³Ã8# ‘)(R2|^"]Ra4¹ó\›„àâ  Zf›EÿÎãbœÃb!s"{–~æ>“±:<-6#qÔ™AÇ{.HeM‚à„ýD³–ES¶܃âF.Öª&HŸ¦!_¦÷¸ºG¸ú€ßÿe#àiA ²‡/Saxc ¼ïlDšâ» “%Ò†EI/dߪjá%À†W+Œ˜ò¥Øhº´½;0´¢ðSŸ“iÙñ¬\ž¥á½÷Èó›y]ÙÚï„”èmR±‡ Ohš/£¿*ûšémâ«*q^ moßH#<³€Ç›†8kû‰ ª·ÌTõ÷3rbŠowü¯tPÔW^›W¶_¡ëÞÛ êXà¶ ÕŽ±>¾êåž#ùQØÈ‚ز€'ˆëJàÚkEƒ •^|Ûq%õÃÅ{žŸ±ÉΊrÐ¥-í¯‚[å kñ)À¯pä#ë8»\æËy®kK# ÛàIkà^…™oò~ ÇÀ`zü:.x_+p½®ËZðY–x|+õY1§G¤çjÅ=7ðàA޾Ÿå3í›Rx6\½¡>q°º\ÙÐ:T¨¶˜AÆ öß ¥Á] ¡…¡Ñ1&X ZJìj)ëªô œ4 W·à>h&°’«•\am¤ZÛx$c–ŠÿŒ’|–ä3/õ2M†Es­ê>ïÚÄæ~wœ¶ÛC‡1TÁ?b}S-ŽÏ¾@÷ÈÀn_²B¡çJtÐÅõebwæUþõ’“Š×KÐ/£üRvGÔ°Âcµºn磕“•“öqs{ÿ=ÄÊÖk,|U–X-³ÎHÈON~4Ü)}Ã3Ù¢8˜½Æ~ü³ŽÁîH±*dãî]¤ÝåHUHò j°U\®ƒå OÂw…øÌ™¼î¶#³L­DŸYcaµ†b“0År)^u<ï#†É8+0ÒDÞûfMb³†/µ`@±$z¼o¥îC|P²‡ˆ yúȹk@î\1q%Êo’Ó‚ýBXÎÒ»­¢ð÷ÛP,ÝRý‰èÜ …—‡cØš äè n’û´-ïl–ܼ ù;Ò.ënìðø¦ƒ7q”¨ËŸqe+®<ÃŒ~Ç 9@‚7O¥ Ê ­ïÃÉ%ïb‰ð^-Õ‡]ñŒL&ÚT`´ e<žÌ!ª»žÖ:哯K¾¯%×bx˜í½‰ü gÓI6ëŠæ£Bi¨0‰˜òkp+—˜]ŽØ1Eç•ö1ó;í'¸€ê>b×S°åQ…Fˆ¤µÐžH3è©a ˆc ¤ë"Fƒøe½åhÀ¢â^*ëd§Ð¤@œ@ƒ<‚…óÊKà‡3PDs3ÿ½êësÓ×ó;…лþ,3À6VpW$Ž›Gb7^¼-óºótÔhÃT)dŠk¢ uœé6wÒûÉîq³eõN\t† ™lîà¬z^I»Fÿ°ùˆä9EA $‡1úUÔ­JNx[¨•ëO„0§Æ+Á”ÑNY[‘ÆR‡$ñctÆÿXz6 ßVgO 4'ãŽáU¬.èyý*ÓáÅöɆªsÕr]@ãÔ}Q½D½;¼.?™f]±UìÞ€ jÁá¼¾½Ô*»6D†~ Aý1Ú3,A¬\”pq=Ç0壬ƒwÕĈ]shEõ”NÞŠ±ùjíÄGvÓ˜\ÏØ³$g ÐjôJî*¬ ?ªLÖ5¬z²³mÿ¹qÒ´nÉ_Ïàßä+P[µCmAŒxã”é ˆBýØ‘*Rˆ¾žQ~Pjëø,ú‚ê{üßd!_|^Ñî ¤uh±{ÃÛ…Òô²Xô¤¨÷ßC½(þ÷' ýÏâøß«O7kk,þ÷úÓÕ§_㉇âÃü²C'aÜo+óîÞŽ´¬!ÕÄÁŽ"ÃvŒA·ÁX^ã5%€ž[kàƒ`p×™ØùÀûUó\=Ñ»ëm£ïÔY2ò§nÇBžœ€O#Tµ}µëFÞÀŒVad*³¬Ó›Œ1v¦|3ÊF“™L/j’_Ÿæ­˜ñxë!X¡äqž>ž¥ûéãn%ÊoeÕ¢BÙrþrn׆ñk½¿×že™ìEJ¼´‚¼+hXÄ`­$–×ì Ý_Ê”Õlg83ï(Ï®{rÑ¢»U6ס>b€‘;.8ø«Ðm½#º‚•ÄŽ~܉¦A“°v.@¸}Ü© +ú£ÉW8=ÔÇ¡í²+@ÊÒ=QÐ0øôx¿Â< !µõ?õ TŸŒÌ‚ͲÛd&Ï‚ª/*¶¨L:lW$ؔܙë2õGW¿±©I†—‘O…!”šP0†5b0½Lìòx>¢Œ51i»"¦›ŽÁ­Ð¹Ëø< ã2@/Ëíì,ƒÊþaU)F˜€ŽË½,dW©*;¹±ªåiÌq ˜—%`ì:q 0-¨9ÈW% BNå·öðPØ%ýeÝîˆpã^ÂѬÕ2H—k–Õ¦äœÌ2o}ˆ™†(†é—€QM+*:åÄG'­¶á"»…ðÊAk¯Š 8adÀžuÑÃ+šWÚøƒ%E2&»5•’Š ü/ö6OFÝO¶X,ÿ×žŠ·\þß|ºùUþÿOò=û9Qžô®‡™¾JÁ>Fˆà"ïŠÂâŠÛIŸî¸ˆO󌨰\Þe&O层„¬<‚]ºØU(P‚ÖÄö~ƒ´›«Ý½s馨"“¯šçû‡»¯÷šB&52œ-“ަyr?l+w.£éÊvÎr5Á °ü(~»Û4ñ#Þ¬w?ÿFŸ›Ìzµ5T}L¦¢ÉPfAVaœßÉ+ýÁmôóÏÑý}ôþO¤ï¹J¼ÈV~þÙz' àÝdva½ùà¥Ø—è·ãÉü벿4ÖÁ|rƒoAßÙ"]¾ÏQÆ™k÷©l5‹²‚'ô“¾ã¶ vEèU »ÂsFwPàŒn§Idãè·r²†Åµu@þÒZ‡çÍýV»Ý•À 5”š<ãîEB±çˆ{ñ½ß1<åE.tÞÄEnØ|Ѹ$‡ •iÑUlù`Æ›8=Ù;N(WJá$kõ¦þTûÉEô$ªO¾QpXÒ¤K¬"ÞRÍ^ÜͳߠUVu¡ŒËeèe½ØN‚-OE`Ô­ç1´Çx—ü¯Þþ¿!aÎ8•¿yóGüÇó?âJaçUUuF» éüOϦN=^´^ÁÁx/‰œ–丿Mí=<'‡ø½2WÐD\4Î'Å@¼Ð]]}>•¡®nâW“KE1Þk¶·¿@µû²Ú·ÈúÇO…‡ÙœÈVé(Ÿ|.æÒ…‘Å|^׬6;!³@±ÇAKu麋Ÿ%^pà ÀZ'q }@÷¢JØhÃãD²Í4RaÅ⮦`®BÐ øÛļZ™¾½ËÁùú±4²9¸I¢Ç`PË»py¡³¹Ã÷×.:Ú®H“ELx–«°k Ø à&SÝ7Àf±·é8¡ –XhÚ+×w·²jrðü‹†0|Àý`¥XÍ]òFòÆ€õ™yå¥+ÇKý ´¨7|ýÃ{/—ãþRP¨›‚L œ­­¸Ã”8‹Viê’Y¤…µA×$oÛÉài¶±Ô„å»p·>É ù„È•(› qË ·^­ Epà ÷6G]í]‚.ä,NŠ á“^Œ ¡"7W¼ì'!„h u»µu.ož%¸;¿­¤h´ØÛܽ=ü=ÄÏ#hð%¶’èð2 â¢u(ÂŽç(F{ñ„ØD¨Å¨Ý<®È6Ãâq±qÓUÕºä$å›Ç —pû!Ãô$æ„ú&vhzõv¡{~³d€ÇÊ4 UÅf Þ~,:ö›JE‰ç[YöÐàÞŸϧd›–Ç^Á9‹b“™gñ”/ðŸ†lô†ñ~l4pKl5®…a?‘ÙtëQ^\M5çeØ‹\ìšà“6âKÞPÐ"Ká"§ž{e‹ë R_É{ ‡[0=2‰U÷éP,×ò_7‡×ENÌ–ü%b0<ä›4—ÊÕ®]˦'#U·]m-üªÊœqAÚ’Ü^Yj0YjÙ¬¯D5•‡…ÉŽ¡³„¢Ý=![(¡¿D©ö½Oôòðx»c@ÈñB {¹¹<N¼Ùõ•ˆ%NQ€ºîM}hiþ—j¢îz(9Ž´ÝÅñƒSp®êTÔh—ÏIÁ«ýùÒªÓøEÝøR]0ƶQ“¿5Ã&ȱ탖œíÃQi]OIëÏÈÏÂâ5ÂØpc¦ß Ç<¬ ÕîwPd™\ÏeLQi]×!® ¨y6À(ÓÎl^àÉYËßh¢ wüdý¸SHBïJâ/[ͽ]¾%)£­^Š?$ˆ æ´d5 Wf™8.ÕgK=Z*¸„F%ú­µÛþ5¸Ë×üûèxûàU3¡û|R)圤XÑdañ’AY!V¯PH-$¿>@*‰ &÷ÃpÀñ÷\ªFH½¤†(±r‹Ÿ ‰£à¾=ä=¥%ãîr>¡ ÿU—Ê£NŽvž«7U8oí:•Z'M|\†')MÐêABÅéSŠP‰I¾+ç‰.yà žC3…‡›¢#‡à#iê ;kôî!$@÷‡?Ž–å]à‡p¿•¢šÑMdÆNÙEïqzt[Ö9ÒÀÒ*š[L˱*>gâ­]! –«ˆÊ"èx´øõúà¤õê ¹+=/:Ò\ôlì¾Û4£CúzXNööl´ †..ï˜X3nk‹&]±KzÌ‚KuÅü 0>o³àíI9Ég™^ÏýÕtQµ±dTöI‘e5%ÝLàÜHÞÔÔeÁ¬5’ĢɫŒ×Ç ¤­|Ûy·äVDV!¦hPzÀ¡(h>Z¢®ñîmº-Å·$ &é2ÑoyÒcY‡–TV†bé<ühïõId©|ÕðW ¦ºÁŸ$°2[!”@ãîðZlg"tŽÚ„• tÄ"¶ü ˖†®T/’:£È ÷‚ó/8õ tYÚ¿kŠ¥ µUµW¢±÷ œ<‰¿Ñ•‹ª\¯Á!)Œ?Ì(ÔG\¥¸Á9íÇTFÐÔ¥ÿIêÒH]œñªg§‰ƒ1;ú¢ù"¾Œô¥ã¨*cÈ€„25Àã.r)^|`Hʧúä£`Æ–ÖºJB[GX¨î»6P|uËé䔊7ìåÎz¤"Í>{ˆœÃ‡‚Ì¡Èc¥£PšÇR{ïîz¨D]ÌA¨å_ârÍ´ïXxa€ -e2)MiÙ1¤À„@zçàÆ{ÕvoމœßU¬ì~6wô”L£Ñ!?ƒÕ4³+€8ˆ•£¢Ï¿i3YÂM‰n“v”Òˆ’ÄOâHC<6üBQ_BòcÿGÖËl¾m™Ý8Þ ÝoCßT^ Œ¦‡pYãhEß}/Þ4Ä)ôõc ØóÊ ‡Ó­Ä«Äê^zùLõÿ*çöLêYf᪱Èñ¦×èä£T;Ô“Öî–[=1 n€ý[„ò‡½“PªÖ+evf½² š¬×æÌz)oCt‡‚qðL,`ª+•8K~ã\¿‚ð yË «±t9âÁØéí]{è”Bág<†Û=Z"»§â‘Ph¢ÁRýa™«%­•탃Ãö6Üex?0’9‡˜yx@‚7"Ê*º|Y–½Ö¯M°œp'yò¯­½=éÁ!OP3š}[<¥AxÖá"»Œw†×`dØ€)—†rù(&ÐP?p+¶~ÜSõž·Ôº4ßÐìs1îùìîðÝÉ´6%‘ßæ/—º*n¬!ËÁ»Üºá&‹ó1ÆË<ª¿ð£À¡¡¨`¾òRÔpÝJ£8E±ÅîÎÙ…0º_¥®‚Éí–›+TÔþ»/Hþ ïÿö²açîÓ\^|ÿ·ºZ«®²û¿Okë_ïÿ~‰‡üÿh•5È?ôç»0þ'à œ ÓÕÈ}QØìòÅFeÞ -lqQö@«í 8ÇCŠr!ê†‘Ü Y7€E±¦˜^&ñ©oÃWÿ>¯¾&K-ÚmîmÿýœŽõЮ~’ßÝ;PÍããÃc †© ÜöÞoÛ?Ñ€” B¶·ÿÚ<Ѐ˜ ‰*¹ /·÷öÚ¿¿v¡‚n½L^oìü"ñ¦3ëåémzÇb&·^R,ƒ(†@§Tâü«BaàVÙ†üV‚Èál£?ì\F/÷¶_Mú}äÅá!жü†Ü[0ãÈ‚1QO$žy cF´P‚³Ïí½“ÃÕÍiV)ÈAÞôÜ,¨Ökl,uÕ2·¦ ô&ˆÉx2MÇéøþë÷-k:\ú šÆ©ø§’BBü¤‡ðóP%úýX"Á¥“.Mõ;×ùž]–±«Gûøu3ÄqÒL=ÊM9ÅW]?(¸2ŠqmÜp†ØU¢š‹ãT±“½ÃöùÑñáQó¸ÝjžÄ\Yo›æÙœÕ Œþ˜!ÌÆï³ÉO犮³f£éü. _9_äKnœÛ;WEl.ž[}¥.ž[¹\U-ÞÄ>°{‰Ù§‚hݾv¶Z&¤´¡¼“sRt~›Âm­TR?«Úd›c}ˬL¼P oAö’Eçp2®¦ŠòÉ?[%;Õb·ÝnË…ÙŧÔ7ýìlŸ4%¿»-Ÿ ¼Xø—’'hòÑÍ’;d`f5`‹nwéÙYa7œê@9¹ šˆ=*PØóà¥> Ÿˆ Ð|Öé’šo:ƒ(‚óD¶ä„;Ez†««aìjšÐ0»xF/ÕIXÜŠÑ™}þñ‚ÃÓÕÖÂ@ï÷Ñe¢ê°2PÉFržZœ²Ì¸ ÆÞ Y:¾2¸¼Õo¤±e7|狞K°±×0éòE«ª½jÚ[+iê„+•ª]j®b×Jœˆ%óhùÜaK.îP+ZæMÝ4-lÜôýXÃ;ɼ[ÉÈ_¬+§§2’]j¤–³T½»t––‚ºñuºÐ5Ÿ8c°þ±7ÈÑJ¸SúmìÜHiÊTúÜÝéäÓï"ïôÝïŒXß¶ŸçrÑð>’Û:ü%·qð“6_ðKm¼Îz<߃§DÜè@O†maßõxðljóÏjâÓäÁ!tçûbPœq ~´úbÝ -õ‡”ƒ¬2#Š•ðïtŸýßþ êÿÄ6üZ}ª2–øÿ^[ÛÜäþÿj_ý‘‡ôÛ¡kvö>w…<‚ë]j7åÚ%%ªìáú{sT˜*ñüÚTØf¼¡@B·+ ±45¶|ZˆÓn“sEjW5K£òZ¸è¦XGû†WìÄCæáŠiÁ°ÓçlÕr‹üÃæ÷wߙ߯sÛQòwßIU®X¨)¤ˆü àäX5Õ‡Cû†É  „÷ífã0£ÿ6ñßÝ&ƺ:?Ô1W"aÛÍ*Bÿ |þŠ»ðWd9iV?T@@ÕúqMf\“×dÆ5™qÍñ gʃ6›Ü˜4H0ipUÿbðUÿ8õAÝèj·¹³¡‡ù…mïy]€;ÂåYeΞUÈžyôî"÷³¾ç(¡>W™¥Ø g¬Y:¯4$¶|Š’÷ y…€•ÀŠg¸S–ž—d)Ê<]jV­T$T¨þb2ìÌ2ºý7În„8•oÏp[ÑÏʽ]Oz³þÙ±îQŒ¤ºL²˜ @ú«X°V¡¤ßÿÝʸU޹“73«â¥ŸIoò8™`ƒyüL´M)ÈG½¬j#&O|ÀGñd¬viïn§ÍnÓXW n¦‡‰¾žX_{Šô÷€|­Ð)x„Uúßîd8̺sív/ƒ¡çžs1´âÇcÈNuþ‚)ÃïuÞýíã¿b¾s‘ÃÊ¥¾÷ä«PÞs§ÇJƒFÑ…ñ’ „=õnSª»<™]÷£ò=Á=jj»’4A1Mž6UïGËpÇΰ¤Dyg†Óº”î„(ÅÅwEÞNÖÜet$rÌöb Þ»©Nïí*‰Úðªä[[yÎjceÑÆÇ°~ª½gQ²×ÂãèÖA{8ó°’ªn`ý`Uëa½a2þK}"Zv5lœ¦åê,¾` I¾‘!ZcQ–@Å @×ÞNÃÐG´[cé)ÚÉe7ŧÎ?­™Ñh†%Ó«‘®lŠE¡ïàâ¡ÁV?tT`Ë?f{~¼Ñ!÷ü}1‰¤Zï†(ôÒc±¦%;VúsïËUõN¤+ͯMU"æ·5e[FÖÔá›ÌpœAH†ðG]sÔX5#AHY ee¹§7R‚iDýq2L)Ä6½3ìÞ³L »°<âUA\}D‡Q‚±Æ½5a~—£¡—,q qpBÊæð6&+ÊÐò´ÏÂS”SZ¯Pþ¸½÷PxQùeb؃ࡠYËúKñÀ{‡;T-iÕPX7$sus«ù¤‹ñôª@Þ"!Ö1¨M±&‹—kxºô}a¹'Í¿a5ñV»F•5i<=NP(ì‡,ƒb$DK¯‰0•À †';{9ì@{9³¬ŒÂ-ö·=!ø±$pSKÇ÷Š®—®’3l´ó*œ/[¿?ˆ0Çñƒ²–.哸CåW#h¸~’Ä!µ]Jõ¨di[‹œ¨$GG+óìvž ‚ƒ¶Ú½Šá–C9ph²àwn.®Ð§3æTËÂò‰¨o> rÏω˜C¸Âg‡4“¾¥)¶& TÛ%kF™–¨«+(ÂŽèÅò©úÐÞžJh†&žL®gÝl¿3Â%@ŒÚC×sg¹jµa“&@Úã#°V&ÓÜNÁý™1ûZ¬ShËJ& *8øŠ(ý¹t@e†pu¤“ƒV$ë©…•‚´Dùu¿?¸Ír¾B*t­± Ün–J ÷„ˆJ4˜E1¾Ògé´¥¹ËØÚÉõ8Ew8•ÈŽ³"Ñú˜‚>Ålpò[úõCT]à~ɶPQƒw\e9(†àµd h_uÞË ]þ|ŠzkßJ²Î Qgô‚%p/uƒ•Œ±µcº¯+$@;XVòíxß*«_PPBÝüNJvç(ØÑ®†Çžº}°°çééüî Áú‘;»ûN)¿ ¡0 ¨DÄðä.YØ °¡§æ9ÕUè+ãd—÷ŒÕ¤üb{ó-ŽI*G±ؤÚgJ¾‚Œãá$Im"³?Påk²»f¶©wÅÍ`pQ“Kô®ö KºMªßý—–¯åU ‘W2D>÷kª—ª|•ª€ì‰“õÄÉ’žøz¨ö¿ë)¼ÿ7›Á";ÿËÎÿj5vþ·¹ötõëùß—x ïÿ‰ÝáŒÿ¢ÛÒ|D¢hµ»9Ê|½L}¢³ºÔ¿8ÜÊgYO,à,üäd[ÈóÁH*Åó~qB‡ª &â‡uuP¤ðú wp­è0R!h¨_îgüEæóг/™ªkwA–Ë9:Ñò\ß;¤¤ ²-ÙÞ[Œ1Eö÷@SˆwìÖWüeHì&­´Y#ôGz¨d8Ôì¶›Ñ ók¥zs_Læ/Á=¾"lËað±!OV  Æ>d7ǹµK×RP¯‹w`º,òÄZ¿öä=$ÄK ßrü8G³|±K€Ã`([Ô"æb3„кv¾OUçPGׯ:¨ œ †ž›ûzØg=‡DÒÖ»>€¥Ü“ ¡OŠoöÁ€D<ú;j_ æsá/lDb¶ÂÊÝݱˆw·ùæ‘X&*`4£žè$÷DÙ4Jœ].z®›÷ºøÑlºjUmoï ºJ[mt`WñÐ@u…XI!u›}&Ñí4NòŠÖ‡#0ßmH¿º¡MºG õAK[¢1F—“M ÁÞ#ìáë6—m&¹yÀ¢'_¼¹!@,°ˆi¿=V—$N°“›Îl ±øqüfŒoÃ¥ëñuNá"ÄR ßÏ,U€j·êmãÜ1“·0 -Jo\ŠF}C—\GÊáÂ3;DhµÔ–žªólåu4|áBÒ˜ad ¯3…(ÒÌ::KXˆ@T·ÜÐêë0¶âÇ j¨ÚŒ3øB¤Íÿ]ýd¼-$ ˆœ¹ÈSªR]UöÔèw­ާåJªï¡nÑÉý§Ù›~*®ë¬òè_ßî…U ¨rËwžüÛu6»{‰z¡à"€z'Ñiï±vÈ5>K%ÿ»ØË˜ï=ø u¹"¹¤?dKGy®¬-€Dôrs…Õc«ˆ…ù¥~Q,Ü;4ÑÓ÷ªx½ßÀ$ŠSucïŒÅ±òÊm@UK¨Ý0»mÚn ±".MCC·uap©ÌùŒSÇBáÜd‰>ü›HSˆ_¯ÅºáQ'†¾”Fhú÷ç¦×]¬LÉšµS­™ï/³yŠãD¹/øÁüpÊ´“§^y“ýÛþÊÎáÁ¯I º´¼DÞVbGbpYÈP[+Î"ö8‡g¯ òK¯^è×°8ÕÌËQX3<¿”è6‹î.eÃ[¯½;Ì„OlÖÔþÊþë½v BIN#DšXAHáçIÊSøjþ‚ •ï8aÓÛ»XGÚ\ÓT¦ç«LúîüÉŽ²ùÛI/—q,Am‘,Ð@a|=ºÈðHÝ»Œ‡^þÛ+b±~Ýrt½RÌÀ—qpG‘†èÏCÖ·{³}瀯mð…ùù>¸ ŸM€º³Ï¾›, ´;tß|œÙpôÊl4Áy«åDF«~ü÷1J=›YÀ¼Ç€¦Èvcß%öœµ81ë>Æq º¤4Î[ A圷@ çɘtq[ÑqóUëÐuäR˜±½:°½öq³ j±bÈCbV¤0ØŠ$ >oo¿ØkÚ^a<ßä–í|D~f”½Ëys¿Õn7—¡ˆ¢ümã áç•¶Ò9x¡ùw½£‚ʸMÚ!8ær=ÔÑXã…PíHëÒ¶ΒÐÅñ÷Ôi©kЪ,¦ÒÎ ‰^–¾W™Z+ziö goØö.ì7]ÏGx—kQ”0‘ÁÝ_5K°Ý º[æœv*¹µa9KƒX»gµW= |ûî´$MÈ^äT¶Ã»•ú6äžÇŒXM •.Ø‚ "\(™Ç´‰ˆ#®ýŒ†óY–ý¨ÉÁdã® ·0 ÄÏöLðSˆ¥Ó¿Û…3Nɬ^²]Š~=Þ´ŸàùŸØ'sxói¼,¹ÿ/^U¹ÿÏõêæ×ó¿/ñÐùßɤ. ¤àLqùpš¥aa/’ŒGê@%…€}–H“U欠 9ÜQ­Á[Ü´~?P4ÁªÜâlË6Ô…Zêlª–®þD¨ô‡­þý¥Ë?§rµÃ-‡Z¥eâ—þ:­`õB­aý¥ZÁŠU€ÁŠ7°‚ù3Xñ¦vçðèï'­W,ƒz]K‹-º³â—¾à¢ûäʼn-ÞõÊߎÛ8¼,lf,aóËÎR@ V ‚Y¶Ö^ú̙ޗbÐÓËL/˜BÜ´_f’õƒ“Ì™kó0¼c5Ituèu¼LT–úfç?Äæ1“êÄ ^ˆìÄ`WÊtÜl“£Ì!R"Ghë%ð± Ðà-è-ÃÛ6ywøï?C¹AŸçfUnþMäÕ²åyà–²ší½÷™¹và™µ³½·÷Ï”´ßYñ>`,uJû«S]ÓÏcè¢Jê ’÷$ñuž)ÐPX‰˜ /„¦`5%ÐÒn/–»¾@|5÷ ïH«Ui†un¯øá³Oñ%:³ÐuïTR(úLçFo g•³Ï:~v¬0Cþ\Cd@O‰Þvò·bÊÎÅœ¼È?­àöŠrûaú ßa¯Ù,Ï$ZÔ Š’1ù3sA>ãøèpZp¡É’<¦b&2µeq•“Xväý°EÉ·ò寙øœYÜR: üj<þÅžBÿy÷mÖû4Û¯?ÝÜXçþÿÖk_ïÿ|‘§Ðÿß Œÿ¿Ë ßõd»åŽMMÿŸp¸ÔyŸäu讕}Zâ×ï#¼öÁ×õÉG+¶íÖ®ÛÕø‹ëK#(Y~¬éµ¼d/Ö¦$¯âTmYOÍâ"ÁÒÖn¤ü>Xq‚”Ö&(C8gµ®¦Y+3„ù¹MÕÞYHªôíÖ–9•¼WÐw6ˆØ‡¥¸åºÓH….è×B«c2ëTØ4âöþÅj©x/rÙþöïç/Zp·mz@?ü3‹žDU ø—ï@̤i’O³î ?è~++|’í QÞÃÅÁ}•ÍÞQVô=˜ë\Ú! 9a°EI‘ }¦ç†æÌ«‘ö¥ƒ7À¦×Ú½†ÅW.Ôt0ÍĬµšW.(ÝãîÀ5¯\PàG¬lyW¡(R¾ð³)]¥/·Pö6qtÎÜä¾=Q$ÜÑ߆ΠKÒ”{W5ä¶d#PHß}bóþLjIÉO]„qq@dŒ.² ¶ãr’ý1f^n/êʇz“ʳý(oN8ÔÌ‚Bò§HÍŒÕ˘ *|”+!ÅË84¦:õ2ö‡ôQjHù2¶kß„ÎÄU þ‚Í8ŒwrÚ¸à8̓­ x*¯R.Bq Æ›;G¯A 7jƒVö9 „G ï…ÈŽZGͽ֎>‘ DBg÷|Œž¬çÆÂrö¶Û̓¿‹±º¼°=­‚‹f÷êXöÞUòLK E'ªÚý.ºûY”ˆ²,reÅù ´’îM˜%…GLŠYÅqº²#ZÖó] UÔÓ‘Ü,Úè&±‡´!ÆŒ6¥£Îm+ϯÁ¸CS†*IñÁsרc:XŸÊ•Íz8ƒE9%~¼éM¼¿‘E¿‰Ï`Róˆ;2~ðjrBE!$„ä4Îàê]gv‡;Q {Pì»ÒÁéÜïÉŸþ*¬ Î÷tx Œþ"eCï5“wÙ¬?œÜë7@îbsø Ç€`ɸâ»+¥Pó¶><Ça¡Á9n&7AQïÕИ¥¸’7Æ©Ã!A *õ¸ÇÇâ5™Š¡hÿ¼“þã>ºõb™í…Ê—¹mhKž¥,€¶È•õÅ×ìÈ»´‘îH·PÙ ¹¯Ò 1g–Â\‡“ë@؉OÆYÔ½ë3 WùXMšÐcH†RDc„"6„‹@"?ÝwUU•9¤ éÍ V„Ëz4Žðâã8z.$âc§gÄ:ÄÛ­­ËdüCÕT »X®Ñ#»Ý¸·­Ö³·åká¶òô,4£NuÀl³'—i2~T‚m.Á=èo-ªR±ìýÔÆ‘»Ø‹ÜÒYÉ§ê£ ÓÎ8Å­g:¿{×™ÇètÔmàQR'5Èã'ɯô6È-º°nÓæ)¸ÙƒcßÄË»Û<ëásØsa~zVqîç‰uÖYÿäÚ©:3£²Š«Û:¹˜ªÚ~ Õ™Ûá±:á3GÑØÀ­-‰D ^1#£®lí’ÊÃD§ª$:¹Š¥¤‡¨+èwc¸! :ÃÃÏo üäÔ†ñõøj<¹£^h0ÏHñYägO= dÔU‚ÑOåÌÓÁìBì(pŽGÝñ®êÅ«7·ñ¹…p7ƒÄ›¡S4ø†)ú^}{osÁ؇¾%ˆÚÝ $Fòçëe›oa¸&™6töÝŒ…ZÉf—bGy3 ì}›¡êÎäuݽBÞãv`«Ý™]Â%peF€ì¨Œ O«cÑ™ÐócŸ@f_[–ýnaöÈÊÖU¸¹¹vÆ!å)»"?§ „ #±?À!ìB!GS{k×ꘟV³ìSX0wIbÙã1šwÉÃw]ä.pt~ÝÞKbJ½µÛ©ÚJ 7ÞG ©OГ¨/Puk½«¯Á` ½ vZ$åþÎÆÚz}`„c¶ÈZ0JIÃaí• “ož˜ Ž÷š|MöfÚ21P÷Q"ç¤Ä=²B³°4>Þçjq´a&:sLuWÑ<‹JN4UJh²y8 f›…£ÄŒSÐ:ĈUP°³t#A?/HY¬mLÞ~¡Q ¬5 o v= ÏóçõJgÜ»XŒÏÂx´÷ú$qç¶3µËî8 ¨8[˜Õ!¨³p÷&áiÇ k!bC–d1$›àhæEúÆ×V# L5wf5ûK¿X>Xô¸ñ’L—H-gÅÙaÊ@¥§Fû&I#µè0Õ¹ £i°îmD‹ŒálS8½/–Æp¡Õ®£nø¸öñ‘»>礈N»ÃÎuÎn®*¦† <_‡¬ ¥ðWžÞÍI)@ø)ã®÷ôQ°Ú ‹fnmMóÐ¥ç(¡âÈ3š”POóJíá1¢ÅÃw‰×C‹£— üiGìè×ÅYå/ y÷qó¨¹ÝVøÇ ?ì÷31šáØBdc‚ã*  @èäßZfÒüY4àŒ_غ—’0Æ>–w_.:=Û‘¬ [>8Ïœ ¢ªˆ¬ômºZ Ž’þŽ+·1é'Õà©Á’Q¹ŠÈ¢iWµ‹³çE*òIgéÊÐAö¡Ú;SÓÛÎêS`ls*Y!ÕISxp†ºÓIžb.˜M{“É>]<—ü>žYÒ®Ý6«óì5Ùbl êj¶¶P…²µEjƒ­-bú[[’&·¶øø©’@ÒV겿x£,¡,æcÙdü¥Út®uVìBbŸho@ÿ}£‚[±â¸ ';¿4w_‹©ôÊ Âô_:Ô×r[˜Ò–0Kì`fstoßÐæJ.Ëy‹dn_ ”3y%a¹¿Yµ«-ÆB)Ô‡œ³DW…} é@—Ž*k¹&Jm5ÍÙÐö~ˆÀXµjÉж—CƇB‚5~›:sLšw0K²Õ¤Zzé³G¡rpâÒ vŸ+²£tÌ¢äbxÀ¦ûI^¼l$§ã¢5t|”‚}Ò,»Œ°{·slÓs2TÅVÎRÑW•´Ðç@p‹H>ƒÈž[uÈ5 ißJÂòÕ þ›ÎbD“)œ[)D ˰H;2ì\DŒF—± %x7Ð$½(P¡ û8í.î" À :9ˆŒø2âšUPÉx>HjŒ<Óâ-‚T6©øÂ¤8ûH\oÙ‰7%)íVfT@;ìa¡zìÿÄ‘ùD4ˆ¸Ò 0à reFøÕ=)(š<“¡¹Šê«ž€òH†¼Ž€ôŠi$ØbÍYsFf,0 ôN¨ýƒ+SÐVÍã D÷ا3èOÝ%3º€J‘,ÖÎe,³Î@ÌÜýμûvQ& ãg’+c#Ò5+þÀdªmσ|EJ?Èì#¢\¥/Ã* ²WØ6Xj¬µž’¢v²XII/½†¥ÙzÑm{…#¸2y•û/p[ÞJ,U?”X¹³¬Ó{ ¶³p@6Þ£]š¾z÷¦Ó#o6ÈO°ÑÌ­ž…@} PÁ¶ñ ªWј“ʬ[þ0¢Òž­mÖΔNnœÊ„)Û2Ñ7a"û*Œä¸R4hí:N üçðd&Ÿ}WÆC”fg‹nŽ&þͧAÅ}ö:´¤²>Cþù¹ú š÷±ÝyÿÕžaê­D‹úÎXzÄ©l¹¥õw™é^“ s+¤”]ŠÄÙ¼Âhœ/Àu¥š¯n¨©·+²ä0]>Òð#ç÷Z³ÂOiChá‘=ò7ÒR˰–˜‚Å¥Cë¼Ø¶‹àб 'ÝÎÔ>D®†©áá©3ÍS‡€ Â]ÃÚë¥FUÓп>øæNÐv·0'fš ™–Womµ6à#7·*ÿ¡½9cÜ#£q°&ëô½ÝUºáU•Yºãªý®n¾ÚðNa~Oý ¯ªRP›.“»ôœ6Ýõ‘óº`bûS›_ƒ*šÛø„&¸9EøÈ=˵¢ÕgÑlž+ÈE3{xél‡§ÌŒ×ØÎzx왿ÌÌgE9 ú¬üTw{fád·g©àJ½“ádþ¢Ó½ºéÌzQP¹Æ¡뺖>å­´mìIfó¦-æ8Rm¨„Tw:Uf„É<ÿ(À>\Fv‚ àægAï |F÷9 ‡g#¢¡u‹“?­%Û+ùõ…hWú_s±ß˜wBgÜë ó‰, ù¡Z LaÐþTu±G?#‡rÅh¶7—Ñ,ædh úðI5\߀8ŽÒ»Ê7€;µT "µ)ëådF„µ€®ÌWºòéê³’Õg¡ª>Šªp¬–•`ÕÙÌbVšrA ‘>]à†ÑÅÁMŠúý^AÒÀÎC8Õ½g§³ÇäFÍLêÂ\äÑI•°©@ O›ÅÆY ªTž-œ*³&ŠØÐ¸¨# ‰G;öglg4sÚýW8o#Á¥ܱKy µæ0.Ñ;ô aþŸ&‡PÃgb(I %HÁ¹‹.,Xv 诌œáN‘s÷À3WÙ§,h¤;çf4 Ø÷l;B{‹fˆ»ÜҮ⩞¬#L”¤U:&‹qÛ¦Ò·…—‡`‘ʬ´¼n^FšÛäfαXw-)˳bNfcê·Õ˜mB¥yšNµã’N+€HöwÈ_»±tжŽL¢ˆSê+ïµé_Kì R ¨´TæÃR\º¤w6Q°ßóFi‹¸Ä/›Jm*/0ìÄ‚vŽ^Ÿ·^†mžmor–`ŒiÓ„MÂê×Ò,¦;4^–Eu:ê½Ñ\šF(VŽ‹Ìz°<«šeôw±k¼³‚ñ¿¤ò¿x¨ôlùˆ±*Ÿ÷ƒÅf™ ªÇÐzi8´‹œ \×¼ÒÈÖòPiŽeUû­ZÁÂ&bð,Ĭ  * É,u¼ß¢ÉÒ&•`õ†luNý¢r&Í­ší“&]¤’J+¯”E¬’{™À‹u+áÛŒòi½T53íZÐ °`¹ó–\kÂ{‡óÒ=Ì€‚GÔ{ÍF8Ÿó¨;™‚õ éëš9ð]çs¸ßt]d¢ô,:ÞŽÀùL| ‰ßÞ¥‘Ñt¨Ž¹ÞvòÉôÜ–13E€jÑÃØbÜÖ 6‰Æ,ëcׯ´Í‹RØ€ª¿»sÌúNÞ^÷û(øÈ_IË“é¬o4y—½ÏgÝFkew0[$dÖ^>·Ò½¾|-%ØÓÖ Ä÷A§3pn YOg=د¦x9~£Zü&þp®EߪÆK^—å*òò_® v0ï¹ùæýèš6 ªi”ut}Xˆ©?]€«o!{Yˆ õ%fà“ÖÊöÁÁa{,'ß´ÿn›6¡~ºgXT‡A?§¢“¦‚>ŽT“ÞC‡|½ °³ÅÊûžüØrûÓ¥ähw gìØúŒ¯a3Z1Z/èöýÔvEv«‘cÿºP+;˜À+4þTÖ€p’°, Tè,„p6e éó/T ö†-Èßð¦Ç/èßlÆMÇ]peQ *õavÛ´2Âù¼m_íf„¾ ÔGCù‘j­œ¾>Þi¾÷Ç_BÆäF@¶þ„+Ó^3û¦¥è}•á"töγf¦ûÿ†T•ùÿÞX«n|õÿý%s‡Š(á|·ùò¼c.™klp M~´·OÚÚ«ñ ?ÒÖ(`{òWˆÛ²À+ƒð AY‘g×½‰†„‡C?â4úõù|Ïâùÿ/:þ—ϲù¿±¶æÍÿZíëüÿùÿ'*ÐNÇÅ~],K¹Xf„L}‘£‹ÿ¬ã~¼¾&Ö³9ª&b˸Sþ½cA@Ḃe ~—Ç~Ë4à_ÍaŒµp ÐÆ¯Žâ4~ ÿìˆmF¼ß܇Ÿíã=²TÁsºcºË0!Ÿ­d·âßUGW C»m\UxI¦ȳLéVqâOsoï¤Ùv vyÜ’B òãóæ6~÷©æ½z–Ìÿ§«k<þÇÓêÓ¯óÿK˜)ð=.dQÀµ®§L \øØA'~Àvz½(Tò÷2Ûé¥?X•vOût Ø“HÅ`ç¹@Èäz|Áò<¾À¨Êöè<Û÷då½àtËÆ0¦º#¾w;Ïî‚1^׸'ö‡Σ5z{AãÂ.£ÜÉpàô³EA£Ü8*[ω¢£p —_Ä—_:ù[ÜšÂ'­£ØQsÿ¨ý÷ -å}ÔÞ~±×[^Ù±éãN%ú”âoå&:œïð׿ñqk³²^ gxÑ:Øm¼x«‡–LÉÀœT«€È˜Ø>뽌~×µûæ«9–ç'uÒ9( èúRSµ]%²ÉUú®RÁµpÐÇ?Wt*ðŽNtæÈÉ­úKÆu| –{!~ÛÁ2ðeG_@‘Ùi˜æ”ñÍ`N÷/Tc§(o‰Èà¥[†±óBlè-\aYÎ Qì)ŒÒ¬ªH_ð½hørá~éÐ[§V`QTÆ„©TQË­†“ÌI"OFßËQò-UZAö‡ju,‰Þ*c•9vÞèJÞ§‡iC^.‘Þég:™FJ”Tk©D×AC¯‡¤Îɉ *é ¡Ì¸ú‰iJDõ½u¿3ÊúQç™@xÁi€:Þ;@l:'ŽÝ3°9$+zþ‡Þ›(X›_zì¯æ¿ Åh¾î½ÿw=áøÃëlõÓí–íÿW×ùþ}cõ«þï‹aÔOÔ5KCEpÂÐY€‹ÔH½AgœåÐa#zª›È±ÁŒy+næ^vq}y #ÄLF¶fÓ:SåÀ¼©nÆ]¥Ï gTê.lœÊiÛtªlt"q_Ðv zŽÊÑø¹´Ô[Ý›z$µ/M\¼õ _Lg„ÈÇ@K^¢£#Áuå¶„›¨ºP3e¨Ã45‰r¥ëÍ ÇÂŒÁY#M¬ü鮯ФèŸ4~לãô»p5Ð,A¢Îã:Ò¥¦…¾TE€LN˜2‘9Ì·½:c'^X“FöÔqöëÁLû9Ô(ÉEež©CGS̨͙å{ñý:Ë·,òKÑm„ýæCø"¼R¬k:éA\Šô©¼ŒZMi]ÓN³^©÷í¯T}Ò‹ßµLtà-w¨Ô¿Âûõ/î–Ls‹ù&ö:Ïf*“éý„óÔ‘«=;ýÛöËKUŽSÍ`È.ѹ4¤t·»rt…})gŠ Ic: èÉ\É;¼ªnÛ$ìà²P .T¦~Ër‚-V8§!„P‚tX¢°ÇKª*ëc ›\ÏûŠï…ÇÌýeLM;ó·ŽRœ×ðY²ƒ å¡WÕ¤™úU)ù¹žÅûÿ/aÿSÛÿUÿ¿ùuÿÿ%žO¸ÿ×@»{®°KwõÞ.»¤*À×IóoîÜ+GW¦}—¨z ×mÁûi‡RÃË‹DE¾DnnÝË^ClDraNz6CA·V=!*ÎݸæIÀ [uG$@ŸEúMû.‚tÏé:§·3ê#£²½¼€wyaÚ;ttph[ËŒ'ò§ ^,ÿ„ÍÑp3úñÞ6àq.zÈ}»ø»Hœ±Á× SN¹Åàã²;—‚õâJêØç¸41$ó"eßq¸éÌÆ \Ç£Ažƒ®@¬Ì¹X-â7r®¾‰WÀU{EqtèZ48V‡§±¦ ýÊŸi Žä+"¬ã¬¼Zzޝå;Ê”˜]ö\…-϶PÃÚÜÆúCì0Û:ȷ̓X­°âYl£ 7Q[±<ò” ¾»9ìUÆÉap³-+Dpá ‡Á[îúmx£Éaðúƒ otP >¸ ¶‘’¼­ H¸¤ä`Ôº;f".»?áïFsþn´xáïRij4¥ CS_“[Ãh-BpšþZIS4×PZ‰”¦²ÎˆQKë‰ÓÝ é?£;»a” Á"U§6”2!åл£DAël ØE~ ܘ‡@4¡7Œª §'PÃìÙƒ]¢&B£(ì2<:Ô‡^K{æ"W"·?ü@SÂÙÉW®p²1÷æ¨0ÓFg ®ðtÞòF½p«ëpPê^/»çô¢ê×í½rP'­W° êd@i/¿Tf…ë}}¼¤‘­ƒ—­ß­,;^ZèÁ¡‹®ìð¨Y¦k¥ÇШ—k°Ý¿îC-ª˜D~¨¼¡/:‹4Ä´³È ²ß/ƒT h=¹#z=Ž©ÙãÉô‘yý *K_sìñãÛ(ÞŠõopqBáX&?kQE€Ã$J…ƒ*±z†\_ëq…Œ'˜ø× Á¼¯2¹!ET¥DP¥É–C6-7U{”¯¾ñ–Iã)«]Ö ¨vñeP^Î$q§qEÔÆª>ÊåS¹ÞÂ¥é3t˜î¯ÂîâÝ™|'¦al:šÏ4àÒ.צ;61™9£‰©Tÿý;»¢ì­b¼Ì‘¾²Ø­”LRM{U²:°¹¤¨¡Ñˆ)•OVް=O¢’½èÿTr5×Ôg´1ù‘:Ä7iüÄðÊ}VZÇE¥²Â µKr¯JEWÖ]º|j¦æh0æÙí\i˜°²FÓ­L¤½>Ã<Øqƒ~ô-®—;“ëñ>bìù³Çþ¹éäQçz>{†A·3Þ©[]tw¶'É»ÚÊj…£Ó0!½"bÿ#Žß8¤ö&þ#^áxvÅ~®5w[mr‘‡y{èø|xÇ ÝZü1IG ˜ÝИÉþx”¦d(Fk EkV''S!RÌð÷«¤%A’Ìâ7P³71*D±Ã"¢cE/??×Õô¾±È¦‡n‡ì©óÕÜ·ÈKñåä._]í 8€µG_v®=^σ©3*Øë¹ ME™²î¢y )p ù.û¬7gb8¨^,®=kJ8^1Ìbõ ºÌz˜ÉÀš¸‰eK·LÕ-a¦cù –ã†ÀΙš!ÁïD`¹;õ@ƯÖ7bªˆB+ï}¶F,E¡µ+Œ§BÌ-º–ñ²€H<±³â´¶cÌߊÚôù"Þg¹gEŽ sÿªÓíN ,Æ%|ä'åô² ‡JâÔBÈ/S)QÀ鯮¾5Õ›~7|Ew8›yÀ'`œu¯ÐBNÇÐÊB›W°µk {üüd"ÀUTÄœñ¾±tc ÁáËæv}QŠœÓ»Þéf{ªB·[\µa„ûÀçÑ©Š®ò[kâ«Pòƒ!áÄéI´¬3(9÷RƒÇuêm‰¯b‰ØÐ-’k•ÃF´ EÓ«Ûpƒ®‹2ÓÖ.E|A{xGTzólaì›Ö.Yœ ÈE`YA@÷dQ×¹C¸‘ kSgh­hõÅýÕ ÷—X%–Ó©Žôl^ j däëœ~™€*bC…4S)$ý ¹cXæîácwÓ#ÈÖì¹î)þ7 rÁ£F˧/b´=ù_q±ñßWÜ9n¡ÖÌHõý©:ó'M›!žŠv#ïhdv'QöN°^4‰g¿ÎìYåàe~ƯCYGàÍÚjHwjÏvËÐÏ¢hÖcÙ PÈÜj©Àöê¿ã-Űÿ¯lüDÚ0|Š;€‹ïÿUWW×7Ùý¿ÍÕÚê×û_â¡ûr@–_?ƒFÿ¹4fQnÀÉwtóvÐ}M³œÌ€Aÿ¥˜—bJÎ`SêKæ w\Q"ÃäÈ g"…—ÎÔ´W̓óýÃÝ×{͵¢Kh ACýr?ã·(2ŸW|uUMÆ0ónª©{nò»wÕMÝd“ßC—ÙÚ{‘[ ñ—!‘ìAV˜ç£ý8Tþ¢“X ÄÌìè \K#‰ošASñ+Þm£æà½8)Œïà~EÚõÙÆ~4ö#)õápWFîn,îývrÓžÓnX›ñjÎ-ƒ%Ïè;ìZA/ÀÏ!5ËiŸÉXßv@)+§´{V`œ°AÇÆtÒÊ™t“ }%~Cáx Zí i×u=Ŷwfj.ë}÷™êžýÎÀ¸‚°š »1;¢Sîn.Fê@QŽxãÀ›SS˵t¸á#-/D—<’ h/f£ËI›ÝŠtÚ 3ÄòNê¹u ybNs2x`ë9û`¦­›eϰkUˆ¥¯e×6š"p‰/be]`"m¸­uh¯hW¸ âjšÎ) X’  ¨£Ïbì9çdÔˆØÚ°ZÆŽjD»Í—BÒâ¨UIÈëJÑÌf²òàÙ²@#5o¾wÚD:«ã îrÎ'ð÷ÉsÀÂ`~:&!£«—b».~ ”7»9œÂ)® SÙ˜Š¯]Izƒ Ct‡GäŸS:óÿà«¥WÝá]Ò§[_h® ¢o"³Þú2.1Z:nÓù]Ú^ù.9O»éy½(<‚Étå¶…;ä1TnL3>†â‘å€ìîc¹ç…n¿Å‚9Ú,›‚ei{å¸y]U–U„¸²8ñÆr¹±:¸gçÂz¹Õ}s¥ïÓ-¨æyEÛø_tzÆåOüÆÏŒwÐ&ããùPÌ´^ õv?‚ÈM€(ŒXS\´ZÑyaã}3 ÄŒ^V‘ \Õ²q(,ýðu‹_Z:LÂO^zëpAÛCq@äz·S{èL‘ñÐT"{¶²&ÂXê|Øð¢ .~44ô¯–yéÏ;#l#߃½2vì¥:ó¼qzæ@1•ª}7€×âTËصB¸™ñÁdŠòFü†øÖ›8!6™Îòt6Oás…Ç=ŒüØçâá’LجRÄXfvÇH²PžE«¶ KôP“’’ÉN¾÷¶ù/ˆŠEs]Ÿx×Óë^ƒn¡p \ä,\§§1õSœ’m°ø;ËáŸy|æu‰Éic¼­‹ëÏÏ&-4ÎúáÂj*±e'Ÿ piT.riTº”ë×ÊÄ UbÙâx›a(ZžcIö»Y‰‡4ðu_¥Àê*‹òcs–ßÉü‚Q‡ó÷ ôÃ5x¹¨}§ ýp^Ê:„å+uÏ{κs¤».Àºä=¤Æi¨×±ºP/-„uÊC2@ á(äx!¢qzøö¡8²ä¬ó£ì—µñ$5ˆMRN'“¯(rä×çÂS¤ÿûT¾¿áYæÿó)ÿ¹^«}õÿõE×i·ÑÂûí.pÙméö¤3)b!®7j­vƒÀÕgmEJSb;üUom±_ñEu4ß­zúZF¦§\ÔK’ß–Ž~ ¨«²DdÄZo7z%§/=!{ÀÁÄ<4–àØÅóÿÓÅ\ÿ/4ÿ׿Æÿû"Óÿ+ó'43!ƒœŒ£†QÜëŸÀ‚ÚÓÀ„ L9kÎufp`hÀ޶OšÇç»Ç­_=7z;æV?:`'o¯ûýaV’Ô~epnç£(*¹¯TùK!5Ë 2÷×£i¹–ïvt5—@b@ñ0䯦TV–mï)ÄË@ON¶&ß[­Ê†;¸µ@ ¼•Î×Ìæ‘1h&b#•­„¿Iº’_ÙG$¥‚Œ‚x ¾ìï|€‘,ø„ W)¥ ›ÆpFg™ |´Ê›r`H•íuípfÜð»7TÄ'V˜(áÂX§„²¡æMQ{ „®Ÿy夃udéUâÍIkQ€C­þéGßšó·•eV›}uÐÊEŽ#ÑVÒØÄ(£BäºîýmØŒPuybá†ó½É%ØhÒkÛ,9Ž£xe8¹´lDinBý’èž½T3…½†yÀ^‰ ÀÞ å³wD×ò¥îÑt‹òÔW£%2'/ÚÐ=Áã˜elSâ:¦³* ¯(WœŠVKÀj"öa#ØÌ¹%àªzb¹„U˜Bä|f4Yd&ˆÈ¦:!wͯsAÎϰhŸ«hR!3î ¦Ò&^²´È=méfÊw9ŸU®é'«v M͔Ħ´úN%ïN:=,º‚÷׃!ø±O5M5³[ÀN‡ß,ày€XXWS{Ð}%,n r 0¿îÂߨ”ARPþµÓ“kôü)ÔKä!ù{þ¿7W¿Úÿ|‘‡ä°ÌÁWG_¬2£Îx0½Ò}TAâ{ïÕ ¶âûpòƼÐÅ·³×Ö>°·­kšÃì]nšÄ¬×ûi˜Î– û_©`œÝüÚAOÝ”WFR §! …[ÿñ'ªÚrW¤ëÞùùÁJ‡Óª›ƒNí,ü½Áÿ²;£‹^'Ðv¿‘xYî‚ý¦©è nÆéóIϽ Œ×NüЬoSŒ"/&‘v°¨œ½ ü­Xe™Ú|UT?àYÊÿ?h‰ýç¦`÷ÿÿjÿùežðKÓ£]à'‹Y¹Ú*¹‹E0Âíoºïºî§…Æ •à˜@>Z¸\tAÃë÷ÀLV-éV+'Q€èDþþ!ª> mðüº}<¿K®RD„áU„ _wªhÑyê‚“µpéÏÐøæ´+ÄÃn÷z–ï k5÷Ëk\·´\JR/J™vAëÕwp}1Ê/#Gd?¿TÎÃ÷w€ŸT@Y®Âg¢«­{h4$âÕüÎ!ãN¨{ÎSøú‡+sòŒN¬]îëïUüh$óëé0kßE§ó3|/AÕktáý(=·ÜÂMï– ‚ÏÁè óÝOàkûï‹¿Ãu…Ÿ[»‹>´ ‘îý]}1‹áí,ñgz¢bú%›Bj¯ºÙ ÁµU‚WÉD¹×I†é½õˆ„@ôGòòõÈÒI/°_)…ÀÊsá‚oÍÁ8p~Gþ UÚTòް·½ÿbwÛo>I:±‘ /ÀÅí;±}‹Þý=¢9Ý"È,¸Fv [“Gpœá»a”diD#Ìß¿SÇP©ħÇ`ò"ûNñ(궸ìæ< É;3÷¯ ìEy@cq‹>õ®ß=™3ˆ$!*bg#_§šäï"þì-ÐW£®õ¹Uk,¹Xñ@v·Õ÷жRoYœwËŠn&hyrJÔw¥€º¤‡Ä |„_D[©8ÙµÅÙ½;‚stSƒ?õ‚þ~Wa&Þ8‘VŒ]á‡Oïò(äp>{wï ÞZÈ4¤z÷-^$Hh@kJ:«l!ýh=§ÊJ××ÃèglªæÝLˆàVƒäƒ8³é¬(¡[ÀWÝ;`àLI¼x&;E¼Ÿá;L±Ñ8ö‚º'B|×0^ç»Çyݯ!Ö« Bü­/˜[_s6YÌ}û†k*`Í{‡%˜o9ïÐCB̳£|ëªdA‘Þ*"Þ^D\€á¤â·éh÷Φt±™Ÿßwy–ˆá§[¸öP?0üˆ&pË}R¹,gÝsMº·!#Rçqyñy:Öl?nÇoZc±‹T7FÆ@_ˆÍ\#@¤t?ù6 ¯™^æµËy¨›uób×å.¨¦y¶›§—iñ=ç‚GfF …†@ËÀ©>⪈ê_D•ŒYWH_Ùv¥EvÈ*!“6=͵WaÑ"<ô˜™Õ&!Nat¶Ø§ßzä"i…-"÷'ųßá/Péjìˆí(²ÔhW\sß1f$+œXÃñ§µHºðu_ÃÄ•­u‚ š†6sËu5&ü–ìµÚx]ø -vnÑ*-vnÒV%«"õéwþቷI5^‰óÓÛÔ^ µ/kÓ‘Ì«é|Ík'êÐ¥ÓjPhS×b!¤°‡=DõMŒþåBVø ÔÚQ+ÁÍÎòºt;ãÇs©ÑcåºøK¬×·BظÃ;nrùæmÌs'×øPk™¯Š<£ôZà·^®¥ÀµÞ/ ˆ•ÿZ¼~§|×yˆ‹Q[g’|A:z§—ùÛgÑÀ$GÛäÛQúí¸à‚zVQ^k”wÏ¢ñB”÷ª×£[äiÑõ´'äÏÌ…ÈR S‹ýmŠîä© œÓÞ9^š¢Ì`Ú1³uüïªê×Ga‘ÒÀmª~!–ËH€ÓÛ³EÄ¥ îΊ`´Lq›êŸˆðmXŠL·©üñ1m4²Q*7~ii5é‹·àÜ´Ÿ\À«°Ø"²ÑO•Mß ‰y—TAËnƒTÿüO‰k þüg¹¦à.Èþ¨¾Ÿ¸„;‰§Øí® Ìˤ³µu‘v·¶zN«/ýV_.,ám2ûÞj ÿrf¦½wMfs¹³uѸ(Š>¯¤¢àsbÿ±+¸ðÝjà”%PafLA­ÙPk ¯BU¸VÙÚ¥É`a[[ã‚[[Œ¾„ü-ÀŸI$£´€Ãœé_B'ä „]?Õ g8ì+*0ZÀuĺ|ZlÏð ˜Øo!›ž¯…ïD^.Üÿ]Ú›S]•éê±X†éÝâ{ˆwf1 Öq5aAÇ&C‡+CK¾†*äîq@v»Œæ9`ùGIz¢Hú¸)dX”ÝÞÓ…‡óR³êù" w—\F1CÝ› m¶ŠEøÜíbq¶sY*õÔEÔÛ˜¡°Â·fvŽÀò°M< ³^aJc#Ò+—¿$DÉ^DQªx'qï”Â` †6Oin¤‹¹ÃJÔô‚ŠÒ²¶¨ªj%³¥i:ÉDéµhš¥äL´aÃÎé¥RY_ú0·µ Z?t­©‘èê+æŒ{à©Ãl|9ËuefÍÀ2 $}ýI`±ð>Y>x±Âæw zHyJ}š«9,EÆ)ÆÀ’(µŽ‰Ðø³JjÖ¡î\³.³Xª‘wJ¯ƒ‚úݺhM@}‰Øª[u‹ðÑWóŒÿWÏþCÆXéŽ>YKì?ªµuïþÏÚWû/ò$ßG­ÑTlå:ã9¸.nnE7‚_ä“áõ<,µ‡~ð¢ø>Ÿ€g?t¯ºPé°†HÌHСëb‘’ )²Ÿ­DÑ¡HÏn€ãv"¢ r)%s§ðæf0Ba€ê*!D=Q¤Dóã þÁ§ò\kt=¿V7Ùãwàû|2l[¬YOprÁ¥¬²6@øäI´=ftiéÑ+p›=úÆØ4¶âÄ{qþbû¤u✴·Úö»æÁ¯vÒr²t.~5·÷í¯{Û/š{ö‹ýí_Zà›ÉAjß—b¯Yyò6Bà•ºSøeÒwïÛ‡‡n¹¶=/­ƒWÎ[ìóÝæË“Àk åä¾×ôßШÞ7o7ND·¾½<ÜÛ ¼–ޱB_Ú{·^KNš¯wÏœ·ÇÍW¬Ð/^·°îe6ròf½¿sVr¯s‘ í¢s·ó9`±·2V¢÷V5bþ²×¬xs;ÏÆ0­Ù{¸Øç¾1Ëx9ôòådØ ~ þ ¼—15Cßm<:â/Ð2Ÿ¿D/Ÿ‡Óœ½•x6û^uÁÇ{‹K#]ú½¤Â²×'äüÞ}IžÙ;eT翇ø3öKíÏÔKn×БíÓ}Ζ ‹äûo”m]®R¿±\®©–X†€šà¬w»×£Ñ’Œõ‰ÝµÓºûÝw²óC¦‡ü-ö‘~eõûNöy‰4ë½@"vß!ý²WŠtÝ׬~Šæ‰xô'rPžq“ƒæoç;û•_žìïüÇù¯Ícà_bÁª®®F?È·û­ƒÃcýíy#ªVWk«bYúîÇ t~ØÁï|4ÿç“áàB¦GÃ'wn×¼A€õÚ(Þ=úÓ|cиH8Š·“|þ„!÷}…ganûÈq‚HÜ?0³Î lPOš¢©xÀ6˜\qfŸÅ®¬ü(þßýøJÈo±)Þ'Áç³É0ømªè½§Ú|‚!ø …Aƒ¿í;šes±oÃûIz/úFY¢6B¬—h|=ºïAB˜Ñk´Ì½S¹N0Ë~gêeÞ¾È) x~7žwn#1W3•ëeç*„$Ö /›¼z­*5˺ôÆÄ/Þ[{eàðžK)V µÜRïÐ8ßýØ Q‚å­HGË FC¬‹ø¿ízòGtâù„(0-…Y„g1†Â¼G¢0³ú\{†ëIqÑr/‚„ðD|-,! ¿NÕji—0 É?~÷?üîçLI…|ð‘ÒÚõdàvIè«Èû(\%}¿máç¢i÷ØEù-ÿÙað½_œ¾BíÃØçÃEχbÅÛ'x]1Ñú&òÁ YJDÎîï­ÅgP_|C|•5…®£×oà: @™:¡ ñòZƒÈEßø×ýwÐ4ùœNÛ0˜VØå…HpVÈã„#¼ì§H§žÀÎ õß9p]é–¿ ,ú$‰ù:è’,¼`Ô¸…ÞŠ¼ò­žK‘‰¶µêéê˦úvÀh8âΓx½'ûö!½Àˆ|£úñÕð:Ó¥JßPVB Gä>çͥȸê& Ö_Åb?¹Î—!)]š8EBNèg3 #-³æ?J‰*·kóD3fX‰TÈ'K’UpÈñ<8î+ÜLÛ¹à:䉼\2€»5"?êJpÞñ­’ó9Ë*ª1žâMìe•¨l†vlÏñ²+WÃ2Ê“m>,.&OAqyÞ)Î'>ò|DeíÁ}}Iâ^Vüåèè£E×Mù<q=jrÑü»•nÿ=aÿOr¢~¢2–Üÿ^¯­=åúßõÚúWýï—xèþŸ ¢÷Ÿ×p7b0¾Êí.óÉe\Rž†QtuO&úÉAñ }¢=Ñm‰““gÑ»}Êiî":ÝD_òô#±Á9 RÕèú¨ºæ¾¶FÃbjØ1NÖ-‡WtQ‘ž†ÔVQÊqË׊#äu•*Uú–‚Rí"u¢U#Ô­¡3† fA !KEÇp<ð‰U,LQJ7™ëžxÝô0»4ò(Й¤'ÒÄ$ÃB'åûJaü²Xë%ƒ¦]§ñq÷hYjÉäÈ(™G!T¡E5Òj.2Z/¯T£IÓwDI¯ùîßxýy°”eeiÝ n rÄô€’ÂãîV¥ ½Ð+íö¸iVè _§wgƒwúÒ˜7…]–‡ðâFrlàDõï7Ó@ªWÒªäÞdÐKǃî…0f¶V쬆×P? \ƒÀ^“Nçüñ_U{«A—:ðB\cAtµ‹Á_•Érøúx§)³à©æ¢Lã%8Ìe†—´Àôk¯¹ fshÕ³‚çr¼d÷¹^ŠÎiÿr|øúÕ/q´¶y²³}ÔðŠÛ2Ö{úµ MKU™bîdp¾8U"„ÊÀjc¾°6jÞ6 æÆÚÊ?;Å  ÖÇh ÌŠ3_bÞ2œSäw‚üâV0ûÇát¬éÙ΂_ôo;ù[mÃÊ/±ã¦`tµ‹1 S:ÃÑAÓ‹.˜¼™bœ·°×ZI¯ç©:N17æq*@Z¯yô0|¦¶VJ‘KÁn&³^) EÊuw jdjÿõ^»Å·q1 Âíüº 4<cS˜b\ ".@|b!ŒBÆ?´«,é÷ßy&1\ò¿‡„q ¡)Ó½û+“þŽ$Uè"1FoõÕhÂ^&0¸¦úâFA$ú ÄBdÕÁ`ˆ˜j } QØ8…?žf˜Æé© tè‡7dƒj?QrƒJç_®óL~q?C’ÏZ‹0½“æß Îäi\,#bÕgª×ayÕÓ¸âcÁ¤\•eLÉw*3.™²Ë>yÅ  h€ º‰¿ÍÛi(Ô¢ÿ*$²2«DÀÞ”ŠÕH’” ©vlî[-°p‡j÷_Ãzí¿¥•Ù}/–`÷,¶î½ªº¯µÓýd–HVïKÖN½Ôù+šû×-÷•\žÜ—f"„Þ»ïä~Ãý‚¡«FÑE!%Àÿ戋ôd-õ¯—±Äþcãé*·ÿØX_ýÿï‹< €´O1[Rl¨»“ñ¼#ˆFZpõÁǰŠh_^8Ÿ%~ A_ X¤D^‘òNž£Úo™¦n²7¹ÁÃÛôº£·ÙŠübEÐíÚUêZD¿;¡Ëì†kýG g“¿6¡sÞϲË|+"10á;†¬wt¾û语½½É‡ú8ÈwµeÝ:CHô(YuÓOþÏ-p˜š7BŠŒNrQùùyzùÜ+Ýè¥ÁfÝBèòùhºe1vØ¡¢6 c‚Èz/ʽ]ÿ^`„¿UQ?»ýFσ½0ز&:[–iÅ\:°1Td˜­ú™ã3VÅW‚ÍÔ§Tòn HÉS¤,a‚ŸÑF’ޤ¯$óW« 2z n¦‚½n+_(÷žªT¢âƒ/ o}6}“bÛ[òg|Ù8qlÞNfó·š¿éÂÚ¾ï[Þˆ+îpR/O—L¬ÖÎ:NŒß²œ€}y¡Wè_·÷NZ¯¨û‹ôd·µï|¯^ e¥ã›;Ò9-*ˆ\&‰ÜªÄŠ_¦=†Á‘ GnyXØ'é%ÀtÇš˜úWRp…›Èù‘¶v£A/ìÐ*Ôgç]j¬Î$N•ëSQ'§zg¿‚Î$á³¼» .iƒgacÛ»°êíSü†2Ù^@è^ëš|ÃâäÞ¶ÌÊØŽôl\¥L·ô•ûEÐt%¢éâÍk4²C>fQáöŠJ,Ì!±<ý\¼ÅÄNxØ7 \² Ðá–þW°°>ŸEq8Ì'ÜåïÀ¹Áo Ú!UØ¢½ÿ‹ÅàR€èÊ…~/,;8¢%ÔÀv– Ò‚Q Û{ÛlÏÙÅFŽrè\­­3ºKéU)ÀEÞÏÉñ4Î:qj©ãN¯7£ xç`=‡ÞD¹×Y%Û‡’›l÷ÜÂì±aÙ3ÂH„¾ñši ¦ûÙU®X“Ã'ÙF] @Î>Ý«ó¢"ˆð-VjoêÿÝ{°çÜÿÛ7¹>AKöÿ«k›k|ÿÿt­öuÿÿ%Úþ ;ÝìíÜbà‘æõXº(P·óx(mâø°ÝzôQ›õÈì°€K&•ÿ‘š¸ÏS¨ÿÓ·*ÿõ2Ïÿµª˜ôÞüúUÿ÷EžBõÙ~ë ¹På÷N^å [‚sƒ/ }oßÔŠ(l0Ït!žV,οˆVÐùv*—¾ï´Doxpö?+ã‰r £>œüßù‘T<5‚¥Ëÿ›Àp°—9i7ÏÑûð¢lª“Ï=+¿>o„ÜÙ¾ƒ2ióî L#º!Aª,¿ æoOÿÌ(«Ê©Í» eg6ž‡*ÄÊ«Áh RZ FW{g–…¨`¼ÂV·à®>y•¸2+'åRà{£÷ Èwø%šÁ™úÌHš÷ú«c€÷iÒh>‘÷fH³µÕË ƒ-Ýš¨å4=|RbB¡A+±*JBEER]w/I÷w0Ú’çy>ÿ`¦$Ö'ІªXÁÎÑL›O»CûƒY>'?\¢Ò*¿îæ]ªZOáH!Ý ×~3~J=+èA¯bÆ×Ùv‰‚v&³]+¥,ÏI‡ú¶ƒšÈ‹,š V7K­¤T¾;èu•OÈäI¦G¶} ù˜ƒnÃ}«Ì¡J þA}èt±ßW\|ÃXëvIܱ&†=`<–^°4FFãÉ<1¾¹VùÑ,ë¹Å R.0Zà.cÒí„Ô³æ½ì.ó:ÊÂ`,÷€Ï¹F3Ãôu¶¶JTu/ú:!KüæªâÒMªY¯‡ßâ®QΛXåCú^züª8,}Q•òp ‚üí ?OÓªD¯·| Ò=²š† lŒƒæA{M±Œ‰ö&ñÌWîØOë%\ãCeéÏ ¦-Y[xÍï[Q¯³EÚVõ ¢'Åx þå0QF¸S˜9¼ ®X4=6>ÁÙi–¼¹@=/ð¢žYX‹iŠUÙ ÅuJaʰÅôk~0޲ºàE…ŠÊ(àõî.TÝU1HOzoe ÌQÎŽ”AU¹î…ÌÂN]lº75ÝUÔz$¨Ðp„) iö »"ÈÁ:½žÏÀÄËÅR›ÙäSÛôÏbN~„NÂAſɋyP 1ÄŽteFT"çâu™¡{ÖBU¹Z>a[»2äg'Å" ATo†sò²ƒë¥òëhÉ Lf .«þ"èóâ¥<ˆ³¨+Š7ªÎ±Õ 2y–˜2uꡯŒ+sb·Tg”"ÈàÕJ² `䂨£¼(ýWª[áST˜kI uŠSÚ’`j7ÈiÊ­µH _!’Ûmîì,úÝ©uB¹•B8©LC¤ûЏµõ€-A`ûgË*´ª…„†Eã–^­îOô½˜±62öœ/€ŸU9nÈh);¤ 2Þ¦½P@Ï¢¦½Ãœ‚`pðhá´ àÀðÍìžB“ðÞÆ"Å΋£osä´QŒ[ìͬ‚ÛÝ õå{§{òy§{5ÏŽÅ+á¥2Û–)Œhmœ¨a˰'`Õ+ØS¿Ó¢I>h,2ð yÀ“¡‘ÊkŸÙ˜Œ€¥“‹¬Ã!D[BÄt™\{ÑÛÎ;‘+ê]S”±,ʧYwÐWÇð.ΊÈÖêÑè ±èÑ7${ÒÍÕã±ntŒ¡Ô¶¶fYޏ,‚š®Ý³l²K–Iväƒ2Â2×ÖÖ2lšÀ4>e›Wš²Â…`t°ÈX ¬ƒøÝ#?®šÑb+¿ê2M››mh ×7¶„ JZ(PHcÎ’*•¢:›*+½çèjoÒ²°R„¿óÆX›hHF±üB•PR} ÝJg=¹ºžÚWøþµÛˆ–tÝnÐOeÁF‹¡ šSaélØëŸ Ç+ÒSð{‘jÀíNXŠÄ’ŸB­á/á¦b ı;h¬`oƒq)~›)~ odo—ã±S™wÕ°ïRn*jU\H¹ÖQ#.ô 7ã ÜA”Í‹1°á¤ïäò“Kß–xÅqéüÒ]˜ 5H”9Åð^»‡Îg©@uø® Õ‚Ö˰ÎÖ¯fbKŸBû/é÷þS”±Äþkc³Æý¿mTkO¿Ú}‰GpgmÙ%C(ú9‹r@.tÙ²^Þ‰IÞÑá ¬H+{±Â,ºÀ[ç¿`7Zh±…¾›¥4%=7—4 Úz9m ‚[ÃwßL–KNYK(Õ9°SûˆË¢7›LÂu˜ã8Òá(›û­¶Ø8fQæ^«QÁ]:Ë1§3?Ø%,«°®Ú®#ð2ñ×N*‹øïæm&oˆœ¬­n‰D.nåA6ˆýä—×/_îù÷Œ‰.­…jc¼†¸¤4òTÝ„Q—˜Î›BÒ ·qŠ6žúV.ȧßA:%× Ý¹¹ünÓd¼‹mÖŽ>n„̈Ãuq‡yM±½"vZUÆÒMEÖfŒòѼ•ÙUÒEðË䬣F+Øú稅ÝÞKqüoÑ>‹t´QîéÚè.Áz¨¢¡þÚ<~±ÝníG°(ŒDm?°…ø­y¼³}‚sW»Ëâz}t´×ëépyô¬+=…6Æ1,Ln Aà!G1ðeÔ«DFè^rÕeÛá¹ökîä˽Ž-¯[•i×ÊC }•²JÕ½‡íÇÅÂÑuMÁ¤|Ë‚Œ"`L[Qo0K‹€€ø8@>9Åœ´!·Oö· züø]6S0Ê¡»‚98lÿ"èfKj±Þ:ßuSußHëP1²¢ñ¯DnÙKØ¢ƒóÍÛA÷­Û0Pt)Äb/ú¯kËG£{‘á°ï†ï^ä¨À 뻵ÃAªó  tÚ —Ž—¨îŒhIy6™"ÝŒñȧõ{9O±;*²[ áôUYQ ëPxk [1"õ˜€“ÉrxпM}hÜyÅAz^ jX otI¢+R–‡‚:VûåÁ¯µ¤C%zEšNË»|-iþ~„ÍÝÚ:‡V.éúµDv¬>Æj¸] ›2«ûÉTH3&k2 ̧_ýÆIÊÖWãW"w†û jn þ2eA­cÕ2°Â0`i:7ZhI[iRK\ÞóDÏê÷›X)˜Sˆnrcø‰§Möwt×NßÅOü…ûC®aˆUÖÒ‹¯å¥Ì/º}— Õ˜¶´K^p›Î+pâÆÕƒ´®)˜h^ÝÏGœø<øÛƒ¥\ì‹L=uÙ½„§¾Ž!dˆÃð±¾3{–ÆnÒä[TNŒn¼ 9Ô+—©­2ÜNKæW€E6 •Y&ÛyH£,Ø%šOd·âß’½ 8µp0FÆxL¬`‘‚Q?`u rÀŒé ó‰äê€úç犇-åBë)ðòì¢æFdÁ²0hœY>+u¯ˆ÷­çw‘å®Èh":·?,ÂpÅsîŸÄ`.¨Þ¹•Á®³%ÔØ«°¶…“T šY¡cé{/+š¶£+±‹¢ëý‹/pdïàgd×SB%AŠI#d±¸bomõà·Dew8ÍvCÞ\—ÄÔ-‹Ó¨È{V¢ˆC*ó`Õ{ø-àTTŽ~¸@pà]5 ËÖÖò9*8¬.[ /*ºâØðˆÁU< [oáŒBül˜®X£k“®ëdÞZï/-yoãrÁd,¦ ?e£Àø¼sVΘ ø24X]tºWÿ¸žÌÅ^,¸ç¡úC÷1 ñ„=Õ­9?ƒÒàh¶øJ‚ ©9,ø z¬A®„íIóv5£¤Ýü½ MÄzP™‰Ù•…}ËØùIxqM9ÏÒ[0«-¸+%Úû·èù <ÑmxT@’‘Œ–É;dYÀ3->oѱ#ôÙöÝï †I|=¾OnÆ–3È„ÈþsüæöMü<H‘‘Ã7õFä‡_’;BsÄD*¢QC1ÉÞ3\Z¤­bA[ã™jVÄ×å½³Bõˆ!)82,Ç-æw ë®dÉLpîøð\x†ùðlxäißç,“éèJÁuŸŽiYÚv®Á3®8¶W¢âý!MB0ÁGl„²N÷-Óîd=e¡Ã4¯×Æ;¾…î/N1'í¹`hl¡©3Ÿw ÒRjÂêv Ÿ´é­îÇî~.´K“JDy‹GÝ”R¢‡/§Ñ)³Ûï Æ¦\ØbDejÂ?ÿHŠð­=‚Š•8¼Sc‡†4êÇh`Š¢†tm·p :DZ3 ¼%µ¹þ¾B3gám© Çë©s‡ÎžÚ{™?gÇ~o}?ï'E_"Rò–n¼:µÂ~ºXdy3z9ì\æ P'¬3ó°'hëDEƒ~wÊËBݹÊN´nbÔqâ°h'м¤.£}+ʡ̠A?¼žS‘¢„ÀÇ ÚÙí¼u¸2¹žO¯ç aKs/z¾2àˆØ·4ÂpóÎE.VÃ0»VÑK(bͽ†™•PÿˆÿøcþGüL}KÆOª•@v­·j$ ø[¨WåUo«­>Ó-)¼GòLuMÒñ0©H” ÜQUhP\N¤ŒœXÈ¡¯nhÄø¸¨Þ`JÙI”¼& Ó?âÂND8U™jL¬aÙxî@®…!G9v¶¦-yûAY¼GãÐ@éX—èŒñÏòªîñ“?â7ò,#¿¾ R’§Õ4üS¬*bìÇ*ŠäEš|!X Š¡€sÔ$Eâ_µÿ;Z¡ûu+bÂóá4_ žÙ–íLÚ+Z rU¤YT,ñG¹$ÒHbýýHd[D³ç¨0¿ „Zq*3 ÝE¹ÅÊ‹1‹0¯ÐAð´3cÔWsKŒV«ŸTž)«ˆÿ‡3“|°W®kðEÿÏgw6f–½xÒÀI2ÙJpfP;D«~ü^4&zƒßÀÏïÅ?ÃÉ\P #¸Dpâ@èÛ­¯ŽNÁ g4Ú•ý»ŸŠæwor@‡MÒQ£DØpâ—Yg &ÉKHþa-7Eh‘LHñ²‘Õ¼–tŽhÚ&¾¬6–Fœ ÀÁ|MÑ~+NnÝÊ:•tM§ŠX¡éŠ×†bH2Eµøx´'ôZR BÓ‡j=h[ã>Ü‚!Wl0Ú@ï9âýRÞflUê-ú æ9Ít‡X÷ÃtÏÌd¿èzÎrRÂ&óÁ|˜¥2 ²&ª =óL“ fycUAÞ…¶8–D·ˆ–”£“01iZR`†˜Ô›2Ô„zqÎç4ÿ¸–oÁ²«*½Ó5xO)Ä_—`2­¿ž‹]àÒÆiåš³‘ªÎGS¶ƒàÎ/n BìÙíÌw¹câ°eí©ÍM ˆ½2oÅ®""qÂâã´¢zÑÔôê[\±™SMðc0âŽR#k¡\»\˜FJJ²J‹E<ÀÁ“S¥<]wÌt*Ћ!¤"Îe,7MÀNe0 R¼ª Yê¢ ¯iQÅo¬¢’e‹Ý3–A<È knõgøî B$ŒF CˆJÒ¼pJ5|8x—IÞ½ˆÎè_yzþˆei%0IÈåmè kË]ØúdÍ)ƒªt{(fÁ@íMOÀÍÒ%Ù XÄû«†U…WG¢Gþ™B¼†B<¤Š!@ŒfŽ%Ò.o%§¿ïE††øq4ž†øïÃòvøzù/W¨?]R¥ouAñM …ú-n‘;«$ªWÈ:òý;Ãkp××']ÀB”0ÕP?C}ºR !Ç=UJZÒ|Ãú½»Ú4ÌÏEätjÈ¿ qßæ/†“îUC¯‹‹ÀͶ a~.Êà ú 7Yœïƒû v¸ÖšûHÿ€_A§Ú0l? !®ê1WL¹¾°/ðÞC¤=ZG¥¯=Úÿçyç…_fÿ¿¶±Æý¿n®‰W_íÿ¿ÀSèÿõäd»|x!&vÆóA7G饗M3ŽºtA T|øhœe=!Ù&_~FƒJa&äVUðÓÅŽ_:¾Läø¢ x5!*¾ 0Gn⯠Җ\AVÚ¬Žú£Y"]ˆ};{ÉÈõü2ž¼ˆµÌlL|cøBéžè¼íä­ÑT¹>2¾Å»,wðã¨CwD¦À ¦¾–°5TCî(¬Ñ”#NñD¢/”âÇ%(‘‡°A>ü¯Ba¾£À沩ݩ½aˆÕ ~̽t§ý^ÚGó‰ÄN›,ôç^dy‹8ÀÒtš³ì<vÇÎJ.8ýÎd8™%2³ ÆÚO8 ¶O|w´§/u¢I߯gGˆ|Z~ëµ% €][ J‚ö‰Ì/ÌT9DÑ—(eÞoî{™—”·Ó>Þ{Pì,EÝ¥aéûé$­ †Ä›‚¾âßAŽDDZfoR7? ¸•Ÿ¦”KvÔøÓ3ýžas4’„½âÑÀtÎéYÄ}tz~†R:‡Ó 7Dµâ7jº¿‰AʆIú¡×9 Å2\åºvdÖÝZÙÅ ÉÎÊ8»9Î.“J¥âTý£Ø½Òÿd½òR7¥OMéÿ ݲYÉ~±;æ¥Ý3/g~×)•Èå/²ƒŒL«EMø+–„¦¶pË£‹ëÁ,0¢k±€ æí¸™8éàÜj0ô ”TúLÚ/$Û¾·2ÜÙP§·gäÀø-†dí¢aÈÈÏ)¼GPÙðË.¿øeS†;*\6œö[0ªlU8Hùn˜kû6 ØÀ®O2Ó¸Bh"h÷\|¶mÄ'‹;¨D¬BŸë1mÎàùÑñáQó¸ÝjžÄ޽`ŒomªÁÚD¡«í†]‚‚;ŽZc4  Žì/‡B¶ÄOBÈÄo!×Ïd,B’+‘vF¨ð†C»Y¯ Ç¸Î¥2·¾¼cÁ:ClÉ*û²÷(馢)–ñ¡ÀÌS ÏD ÎOwˆò~kíI:õ¬> Å•\¥³"C,Íw?Lt¼ö¿ vöà]d¡;4î[Qd -›•%HÈ]]kÌ[Þà;{l¡Ñ H¸¨?‚ÝA³üužÉ®€ÍÜ`3^´ ÚY„a7ë[xvðíw¼~¦- ƵLÛ+ß%ç镸»×³.…eë :Oo‹GÈš„š xø~a1‡¯ÛËË‘s¢l9çÔ€C…Ø!½¨T^Ýx=N!{tžÍjŒ‘/Ôõ—2#û (ÕëqõKV«¤XÃ:Ãáöì2tY™Vœ†^w°öˆÿx£ŸŽ'ãcú}ù!JHtIåŸS×+(*Ѧ[ÉT;$Ö¤(*‹-|Þ8•=s,ž•i«ýŽ<Æv‡^µÖw!±5mã»Ø[^ }®‹­9"Íçç-¬Nrº±(ddõJüŒ YNÎ"%…¸ïQ 2O#X½Ès[ ÙzÆ¥Y’ñf öÖÆ}zªl?c¨u‹æœòC¿o›¼àAu够^>ì|»<|Á¡ÐVÔ†‚.ŒjÛΔKWt–AeXÊ\:ñ…*´4̯çÙ¡õü°aÕÊŠR­bQ*šŠ‰á© j<÷sÑ[ana _‘H$? ,Тv‹kÚõB,ÄÈ–"‘½·k<é¾íŒ/q¹A4¼·$_ïžNr\Åq w/b“p'ÄÉ m„â3æ]Ä*u¦²u“+Qõ>¯¤è¼½hAÍš/µÂl—±bÒ²ã b@Õmªwqò‡ë´}üJŒ©ª]v‰ä2›Ÿëè­ MÁÀ<.@®ç½Éc¡(‡BÔ Þ‘°S*+Ò·WJNåÊ= ç ’Àc%ú¢üŸR(Ñø^þéÖýYjžZÔÿ; ¦éÒwƒ}зȱ”þôa®£ìzy!ÄéSÅ…·ÔTÑ‚œí=­½gçYì.Ê­¶.ZÔóà£lç#æaKúïòQDE8$¥¶;è# *±}°{ÞÞ~±×\VpfÙÁÑêËš¼[óã¤}7væƒ!M¢- NËmD”êç™Æã¬¨‡æÍZù<ÚK?õÐØE-ùº)s/mè•@艥“ –Ô½‹2ºn˜ßËŠÐÕQEÀñöÂLmýRžw/„>lh›Þ×ëÈ*Âw Oà•¾xIw?æ&æ!]DåägÂ-$3A%8ð2‚ýÒûwÙQ(‰†•úÈv½>i~L6Pˆa¶[énA¾Ô²E&|©NŸ%¸À d ˜˜ ÓäÁ´ÔÈa6 ý³Ò™ú '¹,Çkôzg' rXl¬a ‘5L¢8Ÿ\ϺjåäðõñNó}hŒèœf|8iüµnúvI¸£_ZA°%Cî)FÜϾØä~×–#ääîm'³´þqÕ/·Qt`»A;ú£&C“Ç2³c§^ŽëÉ·Ý·‚Óãrã&TÈ+¢ƒþ“™lG&öiê¿Á_±oÿ7œ òîôrÂÖ'(c±ýŸx¹¹îÅ__ÿjÿ÷%²ÿ³Ýÿ’o®ý¡+Å¡½“41Ɉ|”›ßGæŒY ƒƒ¤°»\‚²“…Þö 3fAûV;¸G4µv'x c@å£ûUÉQÖ“›9~ý–m‚94%ü3Mãï£V_0Ò#”tfcã,u ¢ÒÓ.&»·“Œ†ïš¬'ÑHw ¡Ðò“ƒ¶6ù Uî8›‚‘h’hóÊü.zò\ì§&CÕ,‰ê•ô£ŒmÃs¢òó¡®Jªg™è%):Kã¶r[)· ï<ØÃ¾¬Ò }ïþNºòU®¶[WÜŸc?V2Õ=(Í ³Y¾‰˜Nò| ¤·V}ݹ£€q{¶J»¶×ãÁ\ÖR‚W¥ ¼DÙ¹t9ö×/‰³½"ê¬F šÛâÌMS  ¼èûgécW¡šôu^Ã\ì:—ºÝwé@õ§2ÅEeÌVAt³Ô˜È¾1 4¾Q~:zàtUB I»ºã–z/Ý7x÷ZSZdënôÛlÞµGÆjÁKëÕÁáqP¹sxðk$ã@ØY-ý×{í– *ªq8ÅÞ´2%#j%Wp}j¼Gõ†$óžkA äG!w¬à—À§~ZY?ü‰-°dýÿ$¯ÿÕÕ oýߨüºþ‰‡Ö¢•+Âk59znî€Á~2òwŒú"å>š$noÌÊaÊ$ÌÞñùï¯ûîÂV%[ž,²á—øEö÷âÅÑ‘ýùèÈh¿Ž¬üP{0€Ï” –=Šôn›ü›:^`Gå·Ì÷b¹M>zoYCýÍÑÑÊ\,Ñ„š+VC…dŒA€8ùkëªÿ›åìL.ô½O!vYF ž`47ÆÎwõ´Ím¿LÙÀaø±ô6zî-(*41}5I®@ت f+vo‡Ç>OÉánÅA…`Žêô®RY*°*ß©€Ù5ñ‘'NýÉõ¬?¡íôU·ÝÊ@Ûçxï ïtÝÀÌÒ¥tt>u*®U'´ýITT€rç7¿kÐÁ]ȃ€á¯\¿‡gðãC%š«÷·X¢ÞÕI©„ÂYV ·’€#H²áÂk"à0ƒî®ô!iÓR6›%îù`‚š©£Iž@OÑñ8~#н‰áÞ:Ö$~#Ëy#é‡Ù¥ô-¾Ãì?³q%«i_ æ¹s¥¢zˆQóワ˜²ec!ús!iJÏÌnvƒ@~.Ì®.WÂÙÕg“ûè(Ü€4‚ Ï¿n‹Ïp¢$ãp8êÊ"nGßC‡Ò½Ž¤¢¨0úJFA2*MIç…„ô ˆéÿz’ÕÀ¥—”dl´mv¯ù,Mï£Jî|ÉÛù¢å„t™«*)=Éã‹(\‡òd„¢LcøðЊWQr«F{å¸yDÞçMw£±è¤@CßÊ r‰¶Â©O*°ˆ9Om”`G+¥Ž1[{=ææò†ÙÎÛfE^ Ofc”°ëv–q÷¸jL˜@@»¢Šƒ‹ùˆ³øîÔLŒ‚•“’ƒ—I›rB¨0b'Œ;ü u§#d('‚£Êh]ÀÛÉÍ|bõÇ/‡¿µ¡í=Ì«™[rËŸÚ7X˜`kÍAÎ9ÙÆ ó”T))Ö”v¾ÄškÜ­Àb¸„ügÅhˆò§®©°FÆK%-‘Êb—J*EYøð¦s—s‘ƒhÿz8`@±¡É©ºwarQM0è€Æ™[«HÅFìi¥’zÖC”!ÇEyz<=åÒH¡îD¼S°hi&hC°ðYeŠB¢Æ ð#ºâؾC¥ãøâЊ2*Qò-•Xqöˆl߈*''þ2P÷Ú1y꾸¾Üâ$!ÖU±¢‚j½xÇÊâ=ùþɧxÔ$P‹‰‘š0Ÿ¤\5º´B’Kˆk‰öÃ\ý“z«G)S–­Ÿ©é‡W15D'K5ÁòX÷hO…ñZn2Šõ-HŠ\°¯|æÎOpãb±6x{'ês.m¯Ì[A?˜ü¾ÃÉ\6"'N{–œ)[Æu®¦s‹ŒjEã" Ëd9ËÎêçEVñî´¸¬(lhær°Øu>¤Ö ‘‚ƾ-o^¨ìE­Ó²Æ¿«QÚÚö7 ½€[r˲öé‚7ð.ËÞB£åS·¯-Ægj¡JžI9û“p)yË?¯,¯æV8sãò‚ºÂЙ‚/œÙ€Îe Î @ú÷“ToÑŠ:?Ñg#ÓÈmtŠ»YÞÝï [“¬÷bØé^‰ÔËqBª–Yïü*³³¢Ã˜ÐC÷Gà‰ì×ÉQ°|¡7+ê°n2G®ùÅÐ5ôìO†½JIžä¤Wèü_6k…öD‰M#>0oEÏFS!õC%œÛã+Ažï^^MyÌöN- Ù"›¾‰áÆ8ÀÄoÜú€ƒÄ„xä¨ á%ÞcÖ3r$û(Ù¼‰·¶|YñP ¶hµt“'·ÿR‹NÏ4)>߈Jû v£ Ú£¬ÐEå¾KdDj‘Ó_"çå*¾­8ŒÔ±'Pi Ä‘Ïu*Ý iûõÑøÝ?E(:s ÐÖ<„È®;í¹Í0¦)²¢rðí^BaiCJˆœ3`医jeXרê¢D‘ÔÏp  ì®ÏIåî¡PN19)¹cXΦ¬˜.@w®;¦¸.lüfm¾ÕP0"-{›Çg,4ØfÑÔDÁ¶Yá kV÷v3H=!¶[–Lo·ÊPÞ\*Mo܆¬ƒ·´§QÒÁ±å×\ÆSÛ$â&bgã—è÷ÒòhðAk½þ‡|}ðqÎÿ…Ô}"Ör±°®tGŸ¬Œ%ö«ëUîÿoýi­öõüÿK<{ƒ‹Ygv÷ècºwtÜÜi Y§y~´}|Ò<MÈA"úö;B:yÕ|W®TÉAó·óý ¾;Ùß;øó_›Ç'­Ã!pWWW£äÛý–X¼ô·ç¨Z]­­jôÝèæµ;²^å£áø?Ÿ ðúO+ö ì¸7è³,!ˆGß|§ `pF±õ!tУo ùÔpk²€™ÌW–èÌêÄQïSýXÏ’ùÿt}Ûÿ<]_]ý:ÿ¿Ä£ìÁSD¯õh*5,F vF½š¿ ;ãËëÎ¥4ú1|MVŒqN„Šì£Ù`4˜Þ)!íoqÿù§qgp*u7êAô¥7ëÙÍ„F*&„t:ï ÆÒ™åîÿ‚½ÝE4Î.ç ‡Ûš¢'Ñèz˜Ã?×Qoð.‡®#,›‹]Ãÿ¹¶wAÌ‹n¹pÝÂ?Ù?Þ]D?ÿ=ý—øo1ŠH¸wz½9\í™CõæP³9Ö ’FóåhdG½S1ÔQbn÷¨U8¿/Õ8Ø7[™¬1Ùt Ñ­Q†€&34“*b#Lú¯AئêÄþ~ýýÜñf8¿Ž†Ùut)þ^Š¿Ýcðr8é Ù÷tø¡ê‹Aˆúb¢¾„¨/¡$ ô!°X_`˜ÃU7õþÏ÷Ñý·?7ž‹?†øçÏ |éoÿü?Ã[ñ"Ôûoñµø 1þû-åÁßðS|7YÐÜcnBýíÏøKÁÜ +ËŸ=b‚%:½IË€héÅ`Ì»ûþžK®ß«š! ÑE‚= þDïl“© ô`<P]ªBtæÿM#Æt8‘ù?¯˜Xe€FÛÊ¿vKówÊÏ| ¶òKk.­üL¶Vß™¿Å‡çÞ?‚ræGœ{–cé¿DÀsÄ-¬&b…PÐ=œ1Àª±¥üi L¿ zBX£= Eu®‘Ìå Å^lñç,Éê2ü1™ìæp*ÙŒÔÇÃÒØy˜÷ýÿãîÿ?ùÖŸ%òµº±æËÿ_íÿ¿È#÷ÿ‘­}ÚùŸï·~€åzŸ¶¿»3!Öîþ£Üþ‹jXÿoØŽ_¤GÃ'wn×¼A€¥³Ø™Ñ |c°¸88†·“|þÄÍoé g– ßàVÇÄQÆHV\“0•‹!FÇ×£ ¸ß™N·ä»@F®‚ Â¤Öš/Aù:Ê<ʸ-/sDùØ4ÝFóY–…ŠíìäsSbA@©üõ†+—3ùy/»õ¿³ÛGú…¬èIþñÆÿ Ëÿ§Ÿœ÷óLÿûÔÓÿÖ6Ö6¾òÿ/ñ„ô¿GŽÂ÷蜊÷è(®¤«Ÿÿ}õ·ÿêãÌÿãæöî~ó“—±ÌÿÃZu“Ïÿõõ§_çÿ—x~{Û™?ÎÁ§þ/Ù,{ÔpØN¡þ°‡±"&è–µ­ä!Bq´¶­Çï²®Í32¡RV²h[$/˜Ò…Qé`?ñô– Œ¾Á¾4ŸD蘡=Ýàˆ=â,_yôèÑáì²3–1¢ñz‹™­7¦Ožï¾¥p  „iZÀDNyoõU6VÙò t1s"TF•ÒK± %È;ž +<9ìXñù$z,?>NÁ=ôý©éžÌç?ܢâ›Áü-9Ù{Òv0ø° ¶ ~ØEÛ'»{?JÅ™e¢§  ˆúuP[­æÕpTµ³ê«Þ…q{ò\—k5« Nþlîy R^C3°€Üÿn0RÕ€Ÿ’ŠáÐa(þÃì}ðÒø¼;ûÿ·®Âÿ¾ÇYÿå\ýÔeÀ"¿¹¾^(ÿ‹G¯ÿëÕUÐÿT×Öþ¿hýSW$ôü/_ÿCãov럦Œ%òßæªøÆüTŸ~•ÿ¾È³@ë'ÝvEÅ^»Ð&ð¶›Ñ²Ôã:¦@JRë¡V”µ³ÛyëpFd‘ò²ƒ–¿xzlç¬ó«S¸Ã#­…ý2èÇ~©<—>N:½ÈklQ!ý8*jš— Í.©aG’3o'zœÎŽ›íößÅŸÖA»yL’ ÔA|0`ª`¾¡×)ôF"oF­pVª=‘ ¶êÑqÕ‚åmÿ~Þ<>>Ÿ¢ÚjÀƒKÃä~D²ŸE!DaÎ×½Ù¯©fúÅêŒöä*gÅ{3ú´‚/‚®ûðÞ”U[–¯Âj–ÝRµÄ¸s@5¥*ä VjYÑLãß„à¸=»LøçÝμƒA<æÝÒöøµÿ>,×L×Pý\žÛˆ^l<ËAMBží\ç`Y×ÛWC½´?¸û¬Jz‚fã@~Y–œ¤æS…ÎMuN“ø‡8m¼lý­Û×”’øIÁûïÕû ÷}oð®à‹˜?_ê}½/úð¼àýÏEï }ø¹°]ÆS†êyÁ‡ÿ*üòþOAç¾ySô¡àýý}A[ºkîiÜ¡¾VݯdÕ¡>®2œ[òÃ1¯Æ_¬úýÙâÅN§qi‰¼ØîŒç‚’á/x¡Åª¢=ŒÐ•S|pV®¼†I.ã_ÃvÏrM€öI3y¹K«,@Á‘÷÷¥þ_kU_ÿ³ùÕþë‹<®þ§}ø×æò×NWwR°éŸã¦™.3àíŠGÀ>š‡/·"¼ëÑÝ€„>¦p/€²ØöÉ~»ù{{K¹l®€o饹v~Ù>Yºo;³rNÚÇ­ƒW,帹½÷À,­ƒ¶ØˆL2jõ`:jïlŸ”¢À½ÃßÊ7w[;‚¶wKA·Žš{­ƒR˜ ´Ê í‹V©ŽÝkµÛåØôáQ9¨rÕ:ØÙ{½[ªà_·KéË×¥ þ­Õþ¼÷—ëíÃݲk^YF²¿Ý.úúXC9zäkAô';Û{Û¥Xä¯{­ßJµ«ÕÜ+Dz%ï6Kv>:Ô) XN2zÕ:i—[F¬¨¥F@l%Ês½ãR„J(I)e j»ýº\ébæí´KõU´$Þ½f©&ý"$‰’Rôv«ÿ­UŽF_nï•C(š]Žã”ÅWr=l•Ú¿h•cIGå˜Æîöñña)¶QðE¹’·KÌîa{·œxV Es±åÙ.É1J‹ò;‡ûûÛåæÀÉ/åĘÜD–î1©·_•cåšC~ÏJMÕýf»TË÷Êïþíõa¹íÆ^yP!·Êï…Ì[n·½Wqþµ\§î=öXLör£!Y¨˜–¡Û#cî&p™ö©,b¹Î¥Szì} ¢ÁЧ鴱}t!¶æ×ÓaÖPNÄ=²A¯ÑCÀ&1£Z»PuùbЫTRœöö4ö0Ì¥»æ†èÛ4‡ÖØD)ˆ?`Å­ÖAß´.z¤"Ù‰ ¨ ôµ Œ&#Dó‘v꘢ñ©âÉ÷:«™Ñ¸‹B¼-Ê8­¦Ó5¤j5@±º×¿A«¾‰ÕÏ5°½ªVé8w¥‡Š²G”lùà {ZVÌ‹ža†EÔ’ÆÀ°P¯ãñdëžZ[$òGÔ5SxG~¤ô Η×ãr#:‘7ø~:EvЧ>¤ù¦Ç@@‘×y‚ÕÄúnÓE‚hRé£~š?®à€õ!ã_ éªÎµ¸äyN‰Ò.ÏìÜÉ÷ ©‚:(#m™!eT"ú))CF"S¼›L¶ïtŠ|sª«IßdS¥õuv¤bN‰¢dMˆúíÌ”(&6Hü„w x 6I ª+¬·1š ‚Y0r@øKižS§5<ÂÅ9ÿ†&Ä@x·žåLŠ&‹ö"ªb.˜6êøa_Ãultó÷#š*e†·H€¼'ØÖ®d»&Î;ǼBó'Þ¨3»Â‹MÊ*Ýâ³þ<Áåe³Úîoÿ>&KÌÚ­¼)^Z©è‚`eS`°‚kÇCJðbÑ37^t$[ÉÆ×#A š˜cœSó©‘!ÔÐü¸¥¥‹xú›Û oÉÀÌ̽èô"ÃÓCâL^+@ñV%[µœæPÓåµ¼}PŸ½–‘®§'Xgf¡Îtÿ[ ›á‰¢ƒC„}/ ®ª[±ŠxíIâµÏBµÏr»îvgE}\¢òØï_¤òX{ò£ˆqu¾¼îÌ ßoÇ©ô=y3Ýe.Â)Šœ4«È‚™¨%2a$$±€£˜™¥‘Mð]L ʼn%Ý.!šßQc€ïìm¿>i²ªÓg½øçÙ?öÎD‰=ÿÕ»Fq?iþM¦(Ç çÄU»0¸x#ÂULTèô ±ªC4/ð•I:3ë~_»s1Ôª©™æº3õý°¡!ÝíSYE#q<‡TCõ=9Ò>žÜ€œÿñè?VW«â¿Uýwm}MüUÿÙéK?uÒˆj“ÔÝôÚ*K¯SÑO  ¨±Rk¬Ôõu–Þðj±Îj±Á¶ÁŠØøÉC±É*ºÉPn²†mú(ê E•Zg «¯û(X©uVjÝ-uõ'oDªlª«ë,½ÁÒ›ŠªûªZukQ]«²tÍCQskA䶦¾£>•®±ôS'íPŸ©»iM}2][óPÔX)šÚTzƒ¥7=¬!¬!šÚdzsÕC±É²É²ÉPÔ}uVj5¬ÎV÷Rg¥ÖY©?¹#PõGÄP›Ù`i·TCjEÕ­…¡6•vfHMÁR{ÊHM¥k,ýÔI;¤¦@ênZ“ÚSFjE•¢IM¥7XzÓC±Á²Á¢Ií)#5ƒb“5d“5d“¡¨û(ê¬Ô:kX5¬î7¤ÎJ­³RrG êˆ!5²ÁÒn©†Ô Šª[ Cj*í6Ìš"‚¤¶ÎHM¥k,ýÔI;¤¦@ênZ“Ú:#5ƒ¢ÆJѤ¦Ò,½é¡Ø` Ù` Ѥ¶ÎHÍ Ød Ùd Ùd(ê>Š:+µÎVg «û ©³Rë¬ÔŸÜ¨ú#bHMl°´[ª!5ƒ¢êÖšJ» 3¤¦ˆ Ôè?—ùQºÆÒO´Ej¤î¦×VÝtmÍCQc¥HR3é –ÞôPl°†l°†HRÓéÍUÅ&kÈ&kÈ&CQ÷QÔY©uÖ°:kXÝoH•Zg¥þäŽ@ÕEjdƒ¥ÝR©Ù(ªn-©™´Û0Ej†Z•‘šJ×Xú©“vHMÔÝ´&5•^÷PÔX©5Vêú:Kox(ÖY-6XÃ6Xšô ŠMVÑM†r“5lÓGQg(ê¬Ô:kXÝï‹:+µÎJ­»¥ÒÓ(ªl é©ôKoz(ªî+CzUFz*]óPÔÜZ,¤>µ~®±t¥Ÿ:i‡úHÝMkêSéuE•Zc¥®¯³ô†‡bÕbƒ5lƒ¡©Ï ØdÝd(7YÃ6}u†¢ÎJ­³†Õý¾¨³Rë¬Ôº[ª¡>¢ÊÉPŸJo°ô¦‡¢ê¾2ԷƨO¥kŠš[‹…Ô§(m¥k,ýÔI;Ô§@ênZSŸJ¯{(j¬Ô+u}¥7<묬a¬M}Å&«è&C¹É¶é£¨3uVj5¬î÷E•Zg¥ÖÝR õiU6H†úTzƒ¥7=U÷•¡¾£>•®y(jn-RßSF}OY6•~ê¤êS u7­©O¥×=5Vj•º¾ÎÒŠuV‹ Ö° V„¦>ƒb“Ut“¡Üd ÛôQÔŠ:+µÎV÷û¢ÎJ­³Rën©†ú4Š*$C}*½ÁÒ›ŠªûÊPßSF}*]óPÔÜZ,¤¾uF}*]cé§NÚ¡>RwÓšúTzÝCQc¥ÖX©ëë,½á¡XgµØ` Û`Ehê3(6YE7ÊMÖ°ME¡¨³Rë¬au¿/ê¬Ô:+µî–j¨O£¨²A2Ô§Ò,½é¡¨º¯ õ­3êS隇¢æÖb!õm0êSéK?uÒõ)º›ÖÔ§ÒëŠ+µÆJ]_gé Å:«ÅkØ+BSŸA±É*ºÉPn²†mú(ê E•Zg «û}Qg¥ÖY©u·TC}E• ’¡>•Þ`éMEÕ}e¨oƒQŸJ×<5· ©o“QŸJ×Xú©“v¨OÔÝ´¦>•^÷PÔX©5Vêú:Kox(ÖY-6XÃ6Xšú ŠMVÑM†r“5lÓGQg(ê¬Ô:kXÝï‹:+µÎJ­»¥êÓ(ªl õ©ôKoz(ªî+C}›ŒúTºæ¡¨¹µXH}uF}*]cé§NÚ¡>RwÓšúTzÝCQc¥ÖX©ëë,½á¡XgµØ` Û`Ehê3(6YE7ÊMÖ°ME¡¨³Rë¬au¿/ê¬Ô:+µî–j¨O£¨²A2Ô§Ò,½é¡¨º¯ õÕõ©tÍCQsk±ú~bÔ§Ò5–~ê¤êS u7­©O¥×=5Vj•º¾ÎÒŠuV‹ Ö° V„¦>ƒb“Ut“¡Üd ÛôQÔŠ:+µÎV÷û¢ÎJ­³Rën©†ú4Š*$C}*½ÁÒ›ŠªûÊPßOŒúTºæ¡¨¹µXD}ÕU—útºÆÒO´M}¤î¦õéôº‡¢ÆJ­±R××YzÃC±Îj±Á¶ÁŠPÔg¡ØdÝd(7YÃ6}u†¢ÎJ­³†Õý¾¨³Rë¬Ôº[ª¦>ƒ¢ÊISŸNo°ô¦‡¢ê¾ÒÔ§ÒkU–®y(jn-R;ëÐéK?uÒõ±³•ÖÔÇÎ:,5Vj•º¾ÎÒŠuV‹ Ö° V„¦>ÿ¬Cl2”›¬a›>Š:CQg¥ÖYÃê~_ÔY©uVjÝ-ÕPŸÖQeg:½ÁÒ›ŠªûÊP;ëÐ隇¢æÖb!õ±³®±ôS'íP;ëPiM}ì¬ÃBQc¥ÖX©ëë,½á¡XgµØ` Û`EhêóÏ:È&C¹É¶é£¨3uVj5¬î÷E•Zg¥ÖÝR õùgUvÖ¡Ó,½é¡¨º¯ õ±³®y(jn-RŸ¢´5–®±ôS'íPŸ©»iM}*½î¡¨±Rk¬Ôõu–ÞðP¬³Zl°†m°"4õ›¬¢› å&kئ¢ÎPÔY©uÖ°ºßuVj•ZwK5Ô§QTÙ êSé –ÞôPTÝW†újŒúTºæ¡¨¹µXH}ì¬C§k,ýÔI;ÔÇÎ:TZS;ë°PÔX©5Vêú:Kox(ÖY-6XÃ6Xšúü³²ÉPn²†mú(ê E•Zg «û}Qg¥ÖY©u·TC}þYG•uèôKoz(ªî+C}ì¬C§kŠš[‹…ÔÇÎ:tºÆÒO´C}ì¬C¥5õ±³ E•Zc¥®¯³ô†‡bÕbƒ5lƒ¡©Ï?ëP › å&kئ¢ÎPÔY©uÖ°ºßuVj•ZwK5ÔçŸuTÙY‡No°ô¦‡¢ê¾2ÔÇÎ:tºæ¡¨¹µXH}ì¬C§k,ýÔI;ÔÇÎ:TZS;ë°PÔX©5Vêú:Kox(ÖY-6XÃ6Xšúü³²ÉPn²†mú(ê E•Zg «û}Qg¥ÖY©u·TC}þYG•uèôKoz(ªî+C}ì¬C§kŠš[‹…ÔÇÎ:tºÆÒO´C}ì¬C¥5õ±³ E•Zc¥®¯³ô†‡bÕbƒ5lƒ¡©Ï?ëP › å&kئ¢ÎPÔY©uÖ°ºßuVj•ZwK5ÔçŸuTÙY‡No°ô¦‡¢ê¾2ÔÇÎ:tºæ¡¨¹µXH}ì¬C§k,ýÔI;ÔÇÎ:TZS;ë°PÔX©5Vêú:Kox(ÖY-6XÃ6Xšúü³²ÉPn²†mú(ê E•Zg «û}Qg¥ÖY©u·TC}þYG•uèôKoz(ªî+C}ì¬C§kŠš[‹…ÔÇÎ:tºÆÒO´C}ì¬C¥«„²ªKS£A¡ Ru°ZÔX-Ö×=š «ÕkèÆš‡B¤:ËXei†r³î¡Ød(ê E5¬^óPÔY_ÔY©uÖ½õŸ<?¹ƒT]åéu–Þà(ªlP 5²³•^«z(Öܶj\~ö$bQ£N×Xú©“¶©QƒÔÝ´¢>^÷PÔX©5Vêú:Kox(ÖY-6XÃ6XŠô,›¬¢› å&kئ¢ÎPÔY©uÖ°ºßuVj•ZwKÕ¤gPTÙ iêÓé –ÞôPTÝWšúTz­ÊÒ5EÍ­ÅBêcg:]cé§NÚ¡>vö¡ÒšÚmvQh‚Tg¬5V‹õu…&HÂjµÁº±æ¡Ð©Î6VYš¡Ü¬{(6Š:CQg «×<uÖuVjuoý'ÅOî UWyz¥78Š*TCì,D¥×ªŠ5·m†—Ÿ…¬±³®±ôS'íP#; QiM}ì,ÄBQc¥ÖX©ëë,½á¡XgµØ` Û`EhÒóÏBÈ&C¹É¶é£¨3uVj5¬î÷E•Zg¥ÖÝR éùg!kì,D§7XzÓCQu_êcg!:]óPÔÜZ,¤>Eik,]cé§NÚ¡>RwÓU†RS£A¡ R‚ÔX–«Åúº‡B¤aµÚ` ÝXóPh‚” ›«,ÍPnÖ=› E¡¨³†ÕkŠ:ë‹:+µÎº·þ“‡â'wª«<½ÎÒE• ª¡F•vka¨Ñ XsÛf¨Ñ"«j¬­ºÔ¨Ó5–~ê¤mjÔ u7-©qÍ‘N\ŠU–«EÕb}ÝC¡¨Qƒ°Zm°†n¬y(5*ÍU–f(7ëŠM†¢ÎPÔYÃê5EõE•ZgÝ[ÿÉCñ“;HÕUž^gé Ž¢ÊUS£N»µÐÔh¡XsÛ¦©QÓÉjdr¢N×Xú©“v¨‘ɉ*­©O¥×=5Vj•º¾ÎÒŠuV‹ Ö° V„&=KÈcÝd(7YÃ6}u†¢ÎJ­³†Õý¾¨³Rë¬Ôº[ª!=KÈs_êcr¡Noz(ªî+C}L.Ô隇¢æÖb!õ1¹P§k,ýÔI;ÔÇäB•®2”š MJ.dYj¬ëë M „Õjƒ5tcÍC¡ RÉ}«,ÍPnÖ=› E¡¨³†ÕkŠ:ë‹:+µÎº·þ“‡â'wª«<½ÎÒE• ª¡F&'ªôZÕC±æ¶ÍPãr9±¦(o¥k,ýÔI;Ô¨@ênºÊPjj4(45Ö5ª4«ÅSªõš¬ R#C¡©S¥Y-7ª^-6X©š:kŒ:UzÓC±ÉÚ¾ÉPÔŠúš‡¢ÎÚZg «³†Ôë> VêOî UWyz£0ª@ÜR uª´W C dÍm˜¡N‹ÌЍ“ÙÔèt¥Ÿ:i‡:™MJWJM…¦NeSòÔX-Ö×=š«ÕkèÆš‡BS£²™Yei†r³î¡Ød(ê E5¬^óPÔY_ÔY©uÖ½õŸ<?¹ƒT]åéu–Þà(ªlP 52•^«z(Öܶj\ncSc66:]cé§NÚ¡Ffc£ÒU†RS£A¡©QÙØ°,5V‹§UÅ:C¡©S¥Y-7|¬TMʦf•¥7=›¬í› E¡¨¯y(ꬭuÖ°:kH½î£`¥þäZu•§×9 C Ì G¥«<íÕÂ(3ÃQéš[‹EÔù”ñJ®±ôS'mS§©»i­ý¶uñ. ÇEªE:Íj±¾î¡PÔ¨AX­6XC7Ö<ŠÈæ*K3”›uÅ&CQg(ê¬aõš‡¢Îú¢ÎJ­³î­ÿ䡸ɤê*O¯³ôGQeƒª©Q§ÝZhR´P¬¹mÓÔ¨éd52^©Ó5–~ê¤jd¼R¥5õ©ôº‡¢ÆJ­±R××YzÃC±Îj±Á¶ÁŠÐ¤g1:VÑM†r“5lÓGQg(ê¬Ô:kXÝï‹:+µÎJ­»¥Ò³ûÊPŸJo°ô¦‡¢ê¾2Ô§_•¥kŠš[‹…ÔÇìuºÆÒO´C}ÌQ¥« ¥¦FƒB¤²GdYj¬ëë M „Õjƒ5tcÍC¡ RÙ®²4C¹Y÷Pl2u†¢ÎV¯y(ê¬/ê¬Ô:ëÞúOŠŸÜAª®òô:KopU6¨†™}¢J¯U=knÛ 5.·O|ªŒÈÖXºÆÒO´C ¤î¦« ¥¦FƒBSã&£F•fµrcu³¦´ÎPhêTiV˪W‹ Vª¦ÎMF*½é¡Ødmßd(ê E}ÍCQgm­³†ÕYCêu+õ'wЪ«<½ÎQU n©†:UÚ«…!P ²æ6ÌP§¢›ÔÉìuºÆÒO´CÌ~Q¥« ¥¦NƒBS§²_dYj¬ëë M „Õjƒ5tcÍC¡©QÙ'®²4C¹Y÷Pl2u†¢ÎV¯y(ê¬/ê¬Ô:ëÞúOŠŸÜAª®òô:KopU6¨†™=£J¯U=knÛþöþ½W¶ë¸òDÿç§8m4ТKedÌg,×U´DÛDQ&)» Pä‘tÚÉæÃ¶îã»ß½3WÄ\ñ‹¹÷áC:dɆÍ32ç1"fD¬Çœ+÷ÊÆÇ÷36ìgt\[À!±ŸÑ°€Ò³1ïg´!‡T¨h’(úeˆœ}•CÂÚþÆ<Å@,Tx¶b¿ãb"±˜ ÐL¡°ªð]á˜fGVV·8‰’'u%,¶<:ŽVW¶. ‰*VÂŽŽ­l}|¿c?Ålu\[ÀÇlõ!±e§ãž(*¬VXíx$ŠŽ ˜°Ô;PL œplf …ªÂ1ͱPXUXÕhÕSoQ&ÉSÏñž‰BâGžz†‹×DQ£Š›Ù‡ulǸ²ë؆=û°Ž} ¨°Zaµwà‘(:T 86`³/¯cÛ Ê Çf¦PP(¬*Ó …U…UVWöåuìŽulÇx& ‰­ìÃ:¶ãš(jTq3û°Ží¸·€CöaÛ°gŸáž(*¬VXíx$ŠŽ ˜ðì;,BCèå„c3S((VŽiŽ…ÂªÂªF«+û‹Ðñ£•}X·v<…ÄVöaÝÚqM5ª¸™}–i¸·€CöÙسÏpOV+¬^»¾ÖÒ±Ö⸷€C6b­Åñ%\Rvsžy­Å©PQ¡¢÷DáÙˆµÃŽŽ’(<±Öâ”SÅ…‚Bá˜ÖD¡ˆ…ª"¼º%Š-N’œˆ;ð …`RW6b­Åp‘DQ¢o+_kéXkq\[À!±ÖbسÏpOV+¬ö<E‡ŠÇLxêJ t‚r±™) « Ç4ÇBaUaU£Õ•z‡…’øÑÊ>,œ8ž‰BâG+û°pâ¸&ŠUÜʾqŠÙ縷€ÙçC4b¹„«œzáÂÒ©PQ¡¢÷Da éC jÀÑQ…%¤ ™'`PNM …cZ…" «Šðê–(¶8Ir"îÀƒ‚IõltUx6(JôͳÑóäF6b-Åqn‡lÄZŠá«Ù¸(<m-**Tôž(<mT 8:J¢ðl´µ’0(§&Š …Â1­‰B …UExuK[œ$9wàA Á¤®lÄÚŠá"‰¢DßV6>¾¶2°¶â¸·€C6bmÅñ.ÅóÅ…g£­­@E…ŠÞ…g£ ªq±ZB­DŠ«ž¶–rž‰bÂ÷ …–D¡ðU…cª™V·8ir"Ná\ ŠåÃBœT¬Åò‹áUÜÌNËÄ\[À!;mˆFìÙh¸'Š «V{‰¢CÅÕl´ïK¢ðl¬ÈFÃ015QLP((ŽjM _VáÕ-Qlq’äDÜS8“º²ÑpT±RqQ”èÛÊÆCZ]ËF¬½8®À-àX{1|õ̽(¬½öì3ÜE…Õ «½DÑ¡bÀ±ž}‡… œplf …ªÂ1ͱPXUXÕhueßaá$~´²k-Žg¢øÑÊ>¬µ8®‰¢F7³k-Ž+p 8dÖZ {öa­å@QaµÂjïÀ#Qt¨plÀ„g_^k±!”ŽÍL¡ PXU8¦9 « «­®ìËk-k-ŽðL?ZÙ‡µÇ5QÔ¨âVö#È>Ǹ|Ì>¢[ö9Âj…ÕÞG¢èP1àØ€ ˾Å„Ð Ê Çf¦PP(¬*Ó …U…UV=û…`’<ûà™($~äÙg¸pM5ª¸™}X[q\[À!û°¶bسÏpOV+¬ö<E‡ŠÇLxöF t‚r±™) « Ç4ÇBaUaU£Õ•}‡…‘øÑÊ>¬¥8ž‰BâG+û°–â¸&ŠUÜÌ>¬¥8®À-à}XK1ìÙg¸'Š «V{‰¢Cŵ§Õþ}IžX;q SÅ…‚Bá¨ÖD¡ðUaU^ÝÅ'INÄ8…S0©+±vb¸H¢(Ñ·•¯L˼\[À!mˆFìÙh¸'Š «V{‰¢CÅ€c&<õÅ„Ð Ê Çf¦PP(¬*Ó …U…UVWê9…`’VöÀ3QHühe_Eö®‰¢F7³k%Ž+p 8dÖJ ûo„í3ãÙ˜×Jì *zOžX+1<àè(‰Âk%ŽA95QLP((ŽiMŠX(¬*«[¢Øâ$ɉ¸R&ue#ÖJ I%ú¶²ññµ’‰µÇ¸²k%†=û ÷DQaµÂjïÀ#Qt¨plÀ„§Þa¡B'('›™BA¡°ªpLs,VV5Z]©wX舭ìÃÚˆã™($~´²k#Žk¢¨QÅÍìÃÚˆã Ü>S]|“¹ê¾`­Äñ¶W#°ê ‹WY ×’TTí8Äk'ŠX ¨ò„ÅÚÉbÂ÷ ß'(4S(¬*S8¦Ù…U…Õ-N¢äI] ‹åÇÑêÊÖë-QÅJX¼Êb¸F7³k'Ž+p 8ôJ¬Pz*. ÏF[;Á!*ð^˹W‚³Ó0TI*¬zvÚZÉ x&Š ß'(Z…ÂW…c GT3¬nqÒäDÜI±²Ë+†…8©XÙ‰åÃ5ª¸™X[q\[À!;±¶bX@éÙ¹(<;mm‡T¨è=Qx6Ú¨pt”DáÙhk''`PNM …cZ…" «Šðê–(¶8Ir"îÀƒ‚I]ÙˆµÃEE‰¾­l||­Eñ¼Ñqn³Ñ‡(ð±eã²цT¨¨PÑ{¢°lô!P5NÀ’(¬Ÿ ˜3QLø>A¡ Ð’(¾*b£pL5SÀê'MNÄ)œž >$ZõìtœTx‚Úóìô<¹‘x鸷€Cvây¤ã-bÏÎEáÙiÏ#¡¢BEï‰Â³Ó†@Õ8K¢°: |‚bÎD1áû…‚BK¢PøªˆÂ1ÕL«[œ49§p®ì´!ÑêÊN<Ÿéyr#;- pn‡ì´! ¼EìÙ¹(<;+²Ó0Tôž(<;mT°$Š«Â'(æL¾OP((´$ …¯ŠØ(SͰºÅI“q çÊN­®ì4œT¬ì¬ÈΊì<¤ÙµìÄ=»ã ÜÙ‰{tÇ[Äþwå}»…ñ„Å=ºá Uµ&‡x¶âÝð8%ŠX XpdfŠ +±˜ ÐL¡°ª˜…£:3¬*¬nq%OêJXܳ;ŽVW¶æ{vR8:¶²õñ{vÅ=»ã ÜÙŠ{vÇ[ÄžšùžÝ†T¨¨PÑ{¢ðìÄ=ºáq–D1`u@øÅœ‰bÂ÷ …–D¡ðU…cª™V·8ir"Ná\Ù‰{vÃBœT¬ìÄ=»áUÜÌNܳ;®À-à¸gw¼E,%QxÂÚm}¸BU­‰âÚ§Ø!ž½¸§?P ¨ˆÍ€Š±%РЉØLÄff …ªbF´g XUXUÌÈ–&U0Ï+q›ï8…s%0nó N“ºø ·ùØR鸷€CcK¥ã-b)‰âÚûvˆ'´m¹ÌB;ñ6<Å€ÕØ Äfl‰b‚b"6±™™BA¡°ªpT{¦€U…UÅŒliRó¼»2§p®Æ®LÃE€k¢¨QÅ­ÞN1Wàð1}ˆFlW¯eÿܲó@a j‡T¨¨PÑ{¢°õ!P5àè(‰ÂÒ†Ì0(§&Š …Â1­‰B …UExuK[œ$9wàA Á¤z6:Ž*<%úæÙèyr#ñÔÔqn‡lÄSSÞ}†{¢¨°Zaµwà‘(:T 86`ÂSïðÈB'('›™BA¡°ªpLs,VV5Z]©wxä?ZÙgxÏD!ñ£•}öT€k¢¨QÅÍìÃSQǸ²OE (=óSQRqH…ŠÞ…'$žŠpt”Dá ‰§ ŽA95QLP((ŽiMŠX(¬*«[¢Øâ$ɉ¸R&ue#ž‚.’(JômeããOA7˼\[À!mˆF, ôl\žÙh*zOž6ª%Qx6Vd£aPNM …cZ…" «Šðê–(¶8Ir"îÀƒ‚I]Ùh8ªXÙ¸(Jômeã!­®e#vm:®À-àØµéØîbö°IIž û!žØÅé¸&ŠŽC<;±‹ÓðD1`ų»8ÏD1áû…‚Bs,W8¦pD5SÀê'MNÄ+AmH´º²»8%Fxe'vqzžÜÈNìât\[À!;±‹Ó°€ÒSqQx6Ú.NR¡¢÷DáÙhC jÀÑQ…g£íÒ<ƒrj¢˜ PP(Óš(±PXU„W·D±ÅI’q¤LêÊFìê4\$Q”èÛÊÆÇwunxªé¸Ï€ÏT‡TPTPx*- O%\n­!±ì¦æ®NvÕ‡¿-¶ sŸ¼={bwÄ1²ùð¤o ð:"î=9Ò9Ž Äj”D±'¸™pd‚rj¢˜ PP(Õš(áRXUÌn‰b‹ó,'⢠(=…'ä>¤â MÅ•?œé‡xž‰b *¤Fá7kžà Ü5&8PzM6ô8¤â ME…×@|ØàxdŠ«^ñaÃÂ#QLX™ˆÅ¥æX(T(|W8ª3SÀªÂêÖ€{¢Ø"…`ÞW ÄG] A^ˆì‰­ÓlÕ„}_…T !%T–4©«&5ñèÓ3‘¸¾¹pnk‡(ð±”D!beã¸G\3E…ÐŽC¬FÏD1`u 6±[¢˜ ˜ˆÍDlf¦PP(¬*Õž)`UaUî-Mª`ž½àNO`"Q…'°ãš(jTq3ãè¸8..¼E,%Q†xî×LQ!´ãOà¸Dz¤°:›ØŒ-QLPLÄf"63S((VŽjϰª°ª÷–&U0Ï+ãªéÂ)œ+㪩ã"À5QÔ¨âfÇ÷ê®À-àÀñ½º…·ˆ¥$ ÁOàøžãš)*„vâ ß³;R XˆÍ@lÆ–(&(&b3›™) « Gµg XUXU„{K“*˜ç•Àñ=»…S8WÛ«wQÅJàøžÝ‘¢F7·šŽ+p 8$0n5oKI‚!žÀ†{Ä5STí8Ä·šŠ«±ˆÍØÅÅDl&b33…‚BaUá¨öL« «ŠpoiRó¼ØðNá\ ŒûBÃE€k¢¨QÅÍÆ}¡ã Ü ŒûBÃö.Hߟ+zvæûB;¤BE…ŠÞ…'(î 8:J¢ð„Ä} c˜˜3QLø>A© Ô¬Bá«"6 ÇT3¬nqÒäDœÂ¹Ô†D«+;q‡v (1â+Aq‡æys#;ã«v WàpÈÎøªcÏÆøÞÜ‘¢Âj…ÕÞG¢èP1àØ€ OÅôžœ™&¦fŠÈº²1¾7·pM _VáÕìÈ'INÄ8…S0©+ã{sŽ‹$Š}[Ùøè{s—?qÈFǸ|ÌF¢ (-;– 6¤â ½' KPUŽŽ’(,AmÈ<ÃÄœ‰bÂ÷ J¥f _±Q8¦š)`u‹“&'âNOP­zv:N*SÙ Î,L¢KI¶eˆxÎîÀ#QTRáH…#ME‡•>€áØÈV›P9³#V&Â7A©§D¡P¡ð]á¨ÎL« «[î‰b‹‚ÔY5a8ÅBJr"eTe/[)D0¤Wà‹Uy•g%Õˆ ¥À±5¥Ö*f+«Ål…[€+p 8œlˆF, ôÊ]^¼ÅkxD\O‰¢ÂJ…ðGo¬›Û«ŽI*TŒèë*fÃ#QLX™ç¥æX(T(b¡pTg¦€U…Õ­÷D±E Aê¬b6œb!H-9‘2ªZż(D0¤Wà‹UÌÅl%Õˆ ¡W1†‰šRkóªÊ«ÅŒUVÇ¸Š«¬†”^¹y•Õ†TR¡¢I¢è ðJĪ«á‘)¬z%bÕÕñHV&b1A©9  ߎḛ̂ª°º5àž(¶H!˜÷U‰†S,y±ÊÊpÞ=Wd O»|TP–šTTøz«°–븷€C `-×°€Òk ¯åÚŠC*T4I^XË5<2Å€U¯¬å:‰bÂÊD,&(5ÇB¡Bá»ÂQ™VV·ÜÅ)ó¾jk½‹B« àäÈÊy,;ޱY ÿørpÃr°ã Ü å`ÃJOø¼lC*©PÑ$QtPxÂcù×ðÈV=á±üëx$Š +±˜ Ô … …ï Guf XUXÝpO[¤ÌûJx,/ A^¬„7\€“#+᱂ì8Æf%üãËÇ ËÇŽ+p 8$<– (=áóò± ©8¤BE“DÑAá åcÃ#S Xõ„Çò±ã‘(&¬LÄb‚Rs,*¾+Õ™)`UaukÀ=Ql‘B0ï+á±¼¼(y±ÞpNެ„+Ð ÇØ¬„|ºaÚqn¸­!X·Dá÷V¶h UUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjƒ‰&‰¢ÁJä6„³eG:¬t„³ÃDÏŽt8ÒáH‡ªqJVÂ9¢ðÕÕò¶«±˜9ŠX(T)TiN-E,**4«Ø(·H!§ A¿ôA3Xð@11„V£p‘¬ýAÐýaõÒ¬¢ØÅ-%e§ ¸×ƒÃ4‘fDPìëÙŒa8†b¿Ùѱ%Ãqn‡ŽnC&°o‰Â'Ívq@•@•ÔLÑ0dC…d* T¨(YEŠ‚Ø¨*YE…Š «3RóŒTX­°Ú`¢I¢h°Ò0© álÙ‘+áì0ѳ#Žt8Ò¡jœÅ€ÕpŽ(|uôÃ>X°:‹™c¡ˆ…B•B•æÔRÄB¡B¡B³Š Ù¹r‹«£¶ê†4à<2ÅÄZÂE² ôAô‡ÕÑó†!‚b·””‚â^Ý0M¤ûêè†áŠýVGïØ¶ä¸·€݇L`Þ…M𠍍’š)† `¨¬¢@EŠ%«(PQ›U%«¨PQaµbFjž‘ «VL4I V&µ!œ-;Òa¥#œ&zv¤Ã‘G:TS¢°:Î…{G?PLX°:‹™c¡ˆ…B•B•æÔRÄB¡B¡B³Š Ù¹r‹ÞÑ… _ú xG?RL ¡Õ(\$«@ôAðŽ~¤€U» ¸¥¤ì·wtÇ4‘fDPìÞÑÃ1ûÍŽŽ}{Ž+p 8tt2xK>i¶Õªª¤fІ!*$«(PQ ¢@EÉ* TĦ@UÉ**TTX­˜‘šg¤Âj…ÕMEƒ•†ImgËŽtXég‡‰žép¤Ã‘Uã”(¬„sDá«£/Š «V'b1s,±P¨R¨ÒœZŠX(T(ThV±!;7Pn‘but§ô A?4ƒÕÑCh5 É*ÐýAÐVG?PÀ*Š]PÜRRv Š{utÃ4‘fDPì«£†c(ö›WWàðqáȇhÄJoœ‹Âcƒ]§Ž¡¢I¢è ðâÇ®SÃ#S XõbÇ®SÇ#QLX™ˆÅ¥æX(T(|W8ª3SÀªÂêÖ€{¢Ø"…`ÞWåb×é¢äÅ*Cl!uœYe‡-£ŽclVÂ?¾¹³[rà Ü oC4b¥'ü¢ð„¯HxÃPÑ$QtPx†ʑ)¬zÂW$¼á‘(&¬LÄb‚Rs,*¾+Õ™)`UaukÀ=Ql‘B0ï+á §Xòb%¼áœY _‘ð†clV¯̽šðØé¸·€CÂc¤a¥'|ÞiC*©PÑ$QtPxÂc¤á‘)¬zÂc¤ã‘(&¬LÄb‚Rs,*¾+Õ™)`UaukÀ=Ql‘B0ï+á±rQòb%<6@:Nެ„džGÇ16+áßíØ±ÛÑqn‡„ÇnGÃJOø¼ÛцTR¡¢I¢è ð„ÇnGÃ#S Xõ„ÇnGÇ#QLX™ˆÅ¥æX(T(|W8ª3SÀªÂêÖ€{¢Ø"…`ÞWÂc·ã¢äÅJxìvtœY ÝŽŽclVÂ?¾Û±c·£ã Ü ÝŽŽ÷pŸ'»¬8'C‰ÏClCd¸BU­IEƒ#^Øýx  °ê€ÝŠ +±™ˆÍÜ…" ŠÑž)`UaUáÈ–'uCø¶H!ȃU‡ÝŽC¢ªUØýx %åŪÇ7@~‡5€œg‡¦ÿ´œg‡¦ÿ´œg‡¦ÿ´œg‡¦ÿ´œg‡¦ÿ´œg‡¦ÿ´œg‡¦ÿ´œg‡¦ÿ´œg‡¦ÿ´œ©„ÇŽ_Ǹ;~ (=áóŽ_RqH…Š&‰âÚ+ôvˆv(b1 Â ;€V&b3›¹% ¬«°Øqϰª°ªpdË“º!|[¤äÁ*€ÃŽß!QÕ*ì>PŠŠREBoÖ€í*+À¸jÀ†hÄJ¯Eá5 ¨ÃPÑ$QtPxΆʑ)¬zÎÛæÎðHV&b1A©9  ߎḛ̂ª°º5àž(¶H!˜÷•óØì¹(y±rž;7çû—¿G˜Y9šŽclVÂ?¾G²Û¦›\[À!ámˆF, ô„?l-ìqHÅ!*š$Š Oxl§3<2Å€UOxlŸs<Å„•‰XLPjŽ…B…Âw…£:3¬*¬n ¸'Š-Ræ}%<öÂ- A^¬„ÇÆ5Çš( )1+Áß26lB®À-àc‚ûX@i ~ °·!‡T¨h’(:(,ÁCåÈV-Á ÏðHV&b1A©9  ߎḛ̂ª°º5àž(¶H!˜wOpÇ)‚¼ðwÌï5QRb,<Á=õn$¸-Éà Ü nC4b¥'ø¢ð$¸a¨h’(:(<Á CåÈV=ÁmgÄ x$Š +±˜ Ô … …ï Guf XUXÝpO[¤ÌûJpì”X‚¼ðŸíýp‰âßk¢(q’V‚cC§ÞdžÇ¸ (=Áó†RqH…Š&‰âÚ}©â ŠX ¨ð„ǃń•‰ØLÄfn‰B#ëJxl0pÜ3¬*¬*Ùò¤nß)y°þ°¡``HTµܰ&Šgd%86xêÝHp,/9®À-ààX^2, ôÏËK6¤â ME…'4–— L1`ÕËKŽG¢˜°2‹ JͱP¨Pø®pTg¦€U…Õ­_(Ëž¯~ûx`9ÉñN*VÛòQTµ²kEŠ ¡·ÊWàpH`<*7, ôÎÊmHÅ!*š$Š«ÎÏD1‹žÐxt~ ˜°2›‰ØÌ-Qhd] GçŽ{¦€U…U…#[šTÁ<¯Æ£qÇ)œ+±Öc¸pM5ª¸™Àxôí¸·€CãÑ·aå¾ÿ»œÿ츄õNâ m¾/ߟú…j%øRQ!´Á±JOèÃÓs82@1àˆ'ôáÑ7™&¦fŠÈºÂ×D¡ðUaU1CšÙâ<¯K< x¾(VÎÛ<-/šå…o@¶!"À8Åb•žž. ,™b߀ìÛè÷ìômöûîãÓ¶;¸ï>>aå¶*ññðàWàp¨D<€7, ô²ËàmHÅ!*š$Š ¯4<€7<2Å€U¯4<€w<Å„•‰XLPjŽ…B…Âw…£:3¬*¬n ¸'Š-Ræ}•À/ A^¬²ÂyÇ%QHÅRBeI“º* Ïè=[oÔžÑ;®À-àPxFoX@é5‘ŸÑÛŠC*T4I^xFoxdŠ«^xFïx$Š +±˜ Ô … …ï Guf XUXÝpO[¤Ìûª <£_‚¼X5göŽK¢Š!¤„Ê’&uÕë{¶^¯‰‰ÇúŽ+p øX>D#PZM(¬&lHÅ!*š$Š « ÇP92Å€U« Ãó<Å„•‰XLPjŽ…B…Âw…£:3¬*¬n ¸'Š-RæÝkÂqŠ… /¼& pIR1„”PYÒ¤zMØ ßoÕVWàp¨ ¬PzMä•RqH…Š&‰¢ƒÂk+†G¦°ê5•Ç#QLX™ˆÅ¥æX(T(|W8ª3SÀªÂêÖ€{¢Ø"…`ÞWM`%`QòbÕW —D!CH •%Mêª ,x¶Þ¨ ,8®À-àPX<0, ôšÈ‹6¤â MŵGSvˆ×±Pá5‚ŃÅ„•‰ØLÄfn‰B#ëª,8î™VVŽlyR7„o‹‚ÄkÆð%ܧó_5“õ;Š +Âí=QxÙ86@1J¢Ñ·UF†abÎD1¾ J¥f ßáT8¦š)`ukÀ Ü… UVÀ)özþÅš¬×óí9K¢@ö­23<³#%²®23 GKJ-=߇D+öîýiÛ©+Â}«rñ&¦ã Ü•‹71 (½robžâ÷ÝÞÄÄ÷µ$Š ¡ ŽuPz™^æ„#ŽŒìÈ„Ð9€abj¦ˆ¬«R C…ÖD¡ðUaU1CšÙâ<¯J5)$çŪT¼¬éx'«2ñ2§ãœb±*Ó†@xeÉ¥a+0QÒ¤®J´¹Q‰XÃw\[À¡±†oX@é•xXÃ?Å!î«­áãûZE…ÐÇ:(½ÛàÈÅ€##;2!t`˜˜š)"ëªDÃP¡5Q(|UXUÌfG¶8Ï« G Éy±*ËþŽ'pR±*ѶpN±X•ˆ† (K¦( CàX‰’&uUâã›&6#8®À-àP‰ØŒ`X@é•xØŒpŠCÜWÛŒ€ïkIB»zGxØÏ0p Yň¾­Ê4 s&ЉðMP*(5«PÄBN…cª™V· Ê-QReU&ö38N±XÅiûNÀœb±ŠÓ†Là(|Uæ¢( (p Ùº*ó@+á¼U™Øeḷ€ÏTC&°o‰Â#n1 J Jj¦h2€¡B²Š* T”¬¢@EAlxÃ\²Š V+f¤æ©°Z‹MEƒ•†ImgËŽtXé ìˆUï™Â;T ÌÐ(‰bDa«W†‰9Å„¯” JÍáTL¢"ŠÓ¬B¡B¡bC8·Î-Røoù9à”Z‚b_íÕðÖL… Š_Pü"iRõ¿Ú­a8ZÒŒŠWP¹‚Ê]íö@A+p •ì?äw @q ŠùfÇÆnǸ:¶ ™À ¼% Ÿ4ÛÀUUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjƒ‰&‰¢ÁJä6„³eG:¬tPvĪ÷Lá*fh”D1¢°Õ± ÃÄœ‰bÂ× J¥æp*&Q ÅŒiV¡P¡P±!œ[ç)VÇ6,À)µž:¶á ¬™" ¿ øEÒ¤ êulÃp´¤¯ r•»:ö‚Và*yuìEâó­Ž­x帷€w¿>D#¶Fè¸'Š «V{‰¢CÅ€c&¬’B÷bö8M˜˜š)"«³c¨Ðš(¾*¬*«ّ-N’œˆ;p §`R½&G^Š}ólô<¹‘x㸷€C6âYŒaÏFe¿ÀYÙx¸Mïñ *zOž¸55<àè(‰Â·¦ŽA95QLP((ŽiMŠX(¬*«[¢Øâ$ɉ¸R&ue#îè I%ú¶²ññ{)Ž”ã ÜÙˆ{'Þ}¸¿8PTX­°Ú;ðH*0á©w¸f†Ð Ê Çf¦PP(¬*Ó …U…UVWê®VãG+ûpìx& ‰­ìÃÕ©ãš(jTq3ûðã ÜÙ‡w (=ó;6¤â mÿþìàå%¹ OP¼C`xHR1`Õï8ž‰bÂ÷ …–D¡ðUá˜ÂÕL«[œ49wR¬µ!ÑêÊNìæ?P”á• ØÍïys=;7ܵ8®À-àcvúزÑqOV+¬6Û 3ß n ËF;¤CÕ€££$ ËF2!|‚rj¢˜ PP(Õš(´c¬*«[¢Øâ$ɉ¸R&Õ³ÑqTá©x (Ñ7ÏFϓو»Ç¸²w-†=q×r ¨°Zaµwà‘(:T 86`ÂS/ßµØ Ê Çf¦PP(¬*Ó …U…UVWêå»– w-ŽðL?ZÙ‡»Ç5QÔ¨âföá®Åqn‡ìÃ]‹aÏ>Ã=QTX­°Ú ²g OHܵ %QxBâ®Å1(§&Š …ÂQ­‰B;†Àª"¼º%Š-N’œˆ;ð …`RW6â®Åp‘DQ¢o+¿kÙp×⸷€C6â®Åñ®s¾”Cv. OP»kŠ ME…g§a¨™bÀªg§Ý¥œ€g¢˜ð}‚BA¡%Q(|U8¦pD5SÀê'MNÄ+AqccXˆ“Š• ¸±1\£Š›Ù‰»Ç¸²w5†= ÷DQaµÂjƒJlÜ Ù‰»ÇP9$©PáÙ‰»Ç3QLø>A¡ Ð’(¾+S8¢š)`u‹“&'â4#+;qWcXˆ“Š•¸«1\£ŠÙYÄ^½)À¸|ÈÎ5D#PîÙz¤( Czĵ&ŠŠCëø~ÏÞ#E‡#*öì=RÌè›-ç, S3Edµ„^*4ÇBá«Âªb†4;²aF6Pn‘Br^Xί!8ª²UÔ#…†à <3„PPT8~«f¬> pn‡š±!±€ÒkfQ”†!=â ŠZEÅ! Žu|ï5³(: Pá5³(fômÕŒa˜˜š)"ëªÃP¡9 _V3¤Ù‘ 3²r‹’óbÕŒ ÀQÕª™E!‚!¸ÏL¡”Žßª™x´pn‡š‰WAŽÝÑ˸U3éÙ®R¡¢BEï‰Âk ^õ8pt”Dá5¯zåÔD1A¡ P8¦5Q(b¡°ª¯n‰b‹“$'âdž€A95QLP((ŽiMŠX(¬*«[¢Øâ$ɉ¸R&ue£á¨beã¢(Ñ·•–'7²w€Ž+p 8d#î û™y7éÙx¸ìñ *zOž6ª%Qx6ÚíÙ ”SÅ…‚Bá˜ÖD¡ˆ…ª"¼º%Š-N’œˆ;ð …`RW6Ž*V6.Š}[Ùøø½U±Ì+À¸²Ñ†hÄž}†{¢¨°Zaµwà‘(:T 86`ÂSoQL œplf …ªÂ1ͱPXUXÕhu¥žS&ieŸá<…ÄVöUdŸáš(jTq3ûì%ú\[À!ûlˆF, ôl\žûŠC*Tì/G”SÚâCX°:‹™c¡ˆ…B•B•æÔRÄB¡B¡B³Š Ù¹r‹«£6 †4à<2ÅÄZÂE² ôAô‡ÕѰŠb·””‚â^Ý0M¤ûêè†áŠýfG;#®À-àÐÑmÈVà-Qø¤íCªª¤fІ!*$«(PQ ¢@EÉ* TĦ@UÉ**TTX­˜‘šg¤Âj…ÕMEƒ•†ImgËŽtXég‡‰žép¤Ã‘Uã”(¬„sDá«£/Š «V'b1s,±P¨R¨ÒœZŠX(T(ThV±!;7Pn‘but§ô A?4ƒÕÑCh5 É*ÐýAÐVG?PÀ*Š]PÜRRv Š{utÃ4‘fDPì«£†c(ö›=î.^¸·€CG·!X·Dá“¶¨¨’š)† `¨¬¢@EŠ%«(PQ›U%«¨PQaµbFjž‘ «VL4I V&µ!œ-;Òa¥#œ&zv¤Ã‘G:TS¢°:Î…¯Ž¾(&¬NXˆÅ̱PÄB¡J¡Jsj)b¡P¡P¡YņìÜ@¹EŠÕÑBÐ/ý@Ð VG?PL ¡Õ(\$«@ôAXý@«(vAqKIÙ)(îÕÑ ÓDšA±¯ŽnŽ¡ØovtìEs\[À¡£Û ¬À[¢ðI³íkP%P%5S4 ÀP!YEŠ*JVQ ¢ 6ªJVQ¡¢ÂjÅŒÔ<#V+¬6˜h’(¬4LjC8[v¤ÃJG8;LôìH‡#Žt¨§D1`u œ# _ý°ÁV'¬NÄbæX(b¡P¥P¥9µ±P¨P¨Ð¬bCvn Ü"Åêè‡=Š‚! ¸L11„V£p‘¬ýAÐýauô¬¢ØÅ-%e§ ¸WG7LiFž:ºa8†b¿ÕÑ+ös:®À-àcG÷!X·Da“fCªª¤fІ!*$«(PQ ¢@EÉ* TĦ@UÉ**TTX­˜‘šg¤Âj…ÕMEƒ•†ImgËŽtXég‡‰žép¤Ã‘Uã”(¬„sDáÞÑV'¬NÄbæX(b¡P¥P¥9µ±P¨P¨Ð¬bCvn Ü"…wôE!è‚~ hÞÑCh5 É*ÐýAм£)`Å.(n));ÅíÝ1M¤ñŽnC*T øÅ~³£c´ã Ü݆L`Þ…OÚ>D J Jj¦h2€¡B²Š* T”¬¢@EAl T•¬¢BE…ÕŠ©yF*¬VXm0Ñ$Q4Xi˜Ô†p¶ìH‡•Žpv˜èÙ‘G:éP5N‰bÀê@8G¾:ú¢˜°:au"3ÇB …*…*Í©¥ˆ…B…B…f²så)VGw A¿ôA3Xý@11„V£p‘¬ýAÐýauô¬¢ØÅ-%e§ ¸WG7LiFž:ºa8†b¿ÙÑñžã Ü݆L`Þ…Oš½šUUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjƒ‰&‰¢ÁJä6„³eG:¬tPvĪ÷Lá*fh”D1¢°Õ± ÃÄœ‰bÂ× J¥æp*&Q ÅŒiV¡P¡P±!œ[ç)VÇ6,À)µž:¶á ¬™" ¿ øEÒ¤ êulÃp´¤¯ r•»Úõ‚Và*yµëEâóÍŽmݹWàpèØ6d+ð–(|Òö!UUR3Eà ’U¨(PQ ¢d* bS ªd**¬Ö œg¤Âj…ÕMEƒ•†ImgËŽtXé ìˆUï™Â;T ÌÐ(‰bDa«c†‰9Å„¯” JÍáTL¢"ŠÓ¬B¡B¡bC8·Î-R¬ŽmX€Sj Š}ulÃX3E.(~Añ‹¤IÔÿêØ†áhI3"(^Aå *wuì­À1TòêØ‹Å-(æ›ï¯9®À-àбmÈVà-Qø¤Ù+oP%P%5S4 ÀP!YEŠ*JVQ ¢ 6ªJVQ¡¢ÂjÅŒÔ<#V+¬6˜h’(¬4LjC8[v¤ÃJeG¬zÏÞ¡b`†FI# [Û0LÌ™(&| TPj§b±P̘f  ¹åpn‘bulÜRKPì«cžÀš)¢pAñ Š_$Mª þWÇ6 GKšAñ *WP¹«c(hŽ¡’WÇ^(îÕ±­WÞèØö’P®À-àбmÈVà-Qø¤íCªª¤fІ!*$«(PQ ¢@EÉ* TĦ@UÉ**TTX­˜‘šg¤Âj…ÕMEƒ•†ImgËŽtXé ìˆUï™Â;T ÌÐ(‰bDa«c†‰9Å„¯” JÍáTL¢"ŠÓ¬B¡B¡bC8·Î-R¬ŽmX€Sj Š}ulÃX3E.(~Añ‹¤IÔÿêØ†áhI3"(^Aå *wuì­À1TòêØ‹Å-(æ›Û^*À¸:¶ ™À ¼% Ÿ´}ˆ@•@•ÔLÑ0dC…d* T¨(YEŠ‚Ø¨*YE…Š «3RóŒTX­°Ú`¢I¢h°Ò0© álÙ‘+”±ê=S@x‡Š%QŒ(lulÃ01g¢˜ðu‚RA©9œŠITÄB1cšU(T(Tlç–ùEŠÕ± pJ-A±¯Žmxk¦ˆÂÅ/(~‘4©‚ú_Û0-iFÅ+¨\A宎}  8†J^{Q ¸Å|³cÛK>¸·€CǶ!X·Dá“¶¨¨’š)† `¨¬¢@EŠ%«(PQ›U%«¨PQaµbFjž‘ «VL4I V&µ!œ-;Òa¥ƒ²#V½g ïP10C£$Š…­Žm&æL¾NP*(5‡S1‰ŠX(fL³ … …Š áÜr8·H±:¶aN©%(öÕ± O`ÍQ¸ øÅ/’&UPÿ«c†£%͈ x•+¨ÜÕ±´ÇPÉ«c/ · ˜ovl{‰§WàpèØ6d+ð–(|Òö!UUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjƒ‰&‰¢ÁJä6„³eG:¬tPvĪ÷Lá*fh”D1¢°Õ± ÃÄœ‰bÂ× J¥æp*&Q ÅŒiV¡P¡P±!œ[ç)VÇ6,À)µž:¶á ¬™" ¿ øEÒ¤ êulÃp´¤¯ r•»:ö‚Và*yuìEâóÍŽm/éà ÜÛ†L`Þ…OÚ>D J Jj¦h2€¡B²Š* T”¬¢@EAl T•¬¢BE…ÕŠ©yF*¬VXm0Ñ$Q4Xi˜Ô†p¶ìH‡•ÊŽXõž) ¼CÅÀ ’(F¶:¶a˜˜3QLø:A© ÔNÅ$*b¡˜1Í***6„sËáÜ"ÅêØ†8¥– ØWÇ6<5SDá‚â¿HšTAý¯ŽmŽ–4#‚âT® rWÇ>PÐ C%¯Ž½(PÜ‚b¾Õ±›½„S€+p øØ±}ÈVà-QؤÙ**©™¢aȆ É* T¨(PQ²Š±)PU²Š V+f¤æ©°ZaµÁD“DÑ`¥aRÂÙ²#V:(;bÕ{¦€ð34J¢Q˜wlÇ01g¢˜ðu‚RA©9œŠITÄB1cšU(T(Tlç–ùE ïØŽ8¥– Ø½c;žÀš)¢pAñ Š_$Mª þ½c;†£%͈ x•+¨\ïØG Zc¨dïØ · ˜ovl{ɦWàpèØ6d+ð–(|Òö!UUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjƒ‰&‰¢ÁJä6„³eG:¬tPvĪ÷Lá*fh”D1¢°Õ± ÃÄœ‰bÂ× J¥æp*&Q ÅŒiV¡P¡P±!œ[ç)VÇ6,À)µž:¶á ¬™" ¿ øEÒ¤ êulÃp´¤¯ r•»:ö‚Và*yuìEâóÍŽm/Ùà ÜÛ†L`Þ…OÚ>D J Jj¦hrQuÚÊÅ)ïàö½fŠ(lupÃPUJ¢(Wª‚X•‘) ¢BEE,jŽE…Õ «±h§DÑàkƒc “Ür8ép¤ƒ²çÔêÞ!¼CÅD1®Uªfž‘ + =A©9œŠp*T)b¡=S@…B…BŖù!œ[¤XÜp § þÅ¿:¸á™)h5 4‘¬ý@ÐV7œ²SPÌ‚ÊT®”4#«‰Û8†J–šòb5qÇXÉ·:¸uë\[À¡ƒÛ ¬À[¢ðIÛ‡T TIÍ C0THVQ ¢@EŠ’U¨(ˆMª’UT¨¨°Z+pž‘ «VL4I V&µ!œ-;Òa¥ƒ²#V½g ïP10C£$Š…­Žm&æL¾NP*(5‡S1‰ŠX(fL³ … …Š áÜr8·H±:¶aN©%(öÕ± O`ÍQ¸ øÅ/’&UPÿ«c†£%͈ x•+¨ÜÕ®´ÇPÉ«]/ · ˜ovl{é¦WàpèØ6d+ð–(|Òö!UUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjƒ‰&‰¢ÁJä6„³eG:¬tPvĪ÷Lá*fh”D1¢°Õ± ÃÄœ‰bÂ× J¥æp*&Q ÅŒiV¡P¡P±!œ[ç)VÇ6,À)µž:¶á ¬™" ¿ øEÒ¤ êulÃp´¤¯ r•»:ö‚Và*yuìEâóÍŽm/Ýà ÜÛ†L`Þ…OÚ>D J Jj¦h2€¡B²Š* T”¬¢@EAl T•¬¢BE…ÕŠ©yF*¬VXm0Ñ$Q4Xi˜Ô†p¶ìH‡•ÊŽXõž) ¼CÅÀ ’(F¶:¶a˜˜3QLø:A© ÔNÅ$*b¡˜1Í***6„sËáÜ"ÅêØ†8¥– ØWÇ6<5SDá‚â¿HšTAý¯ŽmŽ–4#‚âT® rWÇ>PÐ C%¯Ž½(PÜ‚b¾Ù±í¥›\[À¡cÛ ¬À[¢ðIÛ‡T TIÍ C0THVQ ¢@EŠ’U¨(ˆMª’UT¨¨°Z1#5ÏH…Õ « &š$Š+ “ÚΖé°ÒAÙ«Þ3„w¨˜¡QňÂVÇ6 s&Š _'(”šÃ©˜DE,3¦Y…B…Bņpn9œ[¤XÛ°§ÔûêØ†'°fŠ(\Pü‚âI“*¨ÿÕ± ÃÑ’fDP¼‚ÊTîêØ Zc¨äÕ±Š[PÌ7;¶½tS€+p 8tl2xK>iû**©™¢aÈE• }?®DÚ÷š)¢°ÕÁ CU)‰¢ \ª bUF¦€Š ±¨9V+¬VÄ¢Eƒ¯ Ž5LrËálp¤Ã‘ÊžS«Cx‡ðCÅ@¸TM¨šyF&¬L$ô¥æp*©P¥ˆ…öL  [ç†pn‘bupÃ)œ‚úÿêà†g¦ Õ(\Ð D² ôA?XÜpÊNA1 *WP¹RÒŒ¬&nCà*YjÊ‹ÕÄmc%ßêàöN®À-àÐÁmÈVà-Qø¤íCªª¤fІ!*$«(PQ ¢@EÉ* TĦ@UÉ**TTX­˜‘šg¤Âj…ÕMEƒ•†ImgËŽtXé ìˆUï™Â;T ÌÐ(‰bDa«c†‰9Å„¯” JÍáTL¢"ŠÓ¬B¡B¡bC8·Î-R¬ŽmX€Sj Š}ulÃX3E.(~Añ‹¤IÔÿêØ†áhI3"(^Aå *wµë­À1Tòj׋Å-(æ›Û^Â)À¸:¶ ™À ¼% Ÿ´}ˆ@•@•ÔLÑ0dC…d* T¨(YEŠ‚Ø¨*YE…Š «3RóŒTX­°Ú`¢I¢h°Ò0© álÙ‘+”±ê=S@x‡Š%QŒ(lulÃ01g¢˜ðu‚RA©9œŠITÄB1cšU(T(Tlç–ùEŠÕ± pJ-A±¯Žmxk¦ˆÂÅ/(~‘4©‚ú_Û0-iFÅ+¨\A宎}  8†J^{Q ¸Å|«cw{ §Wàð±cû ¬À[¢°I³!UUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjƒ‰&‰¢ÁJä6„³eG:¬tPvĪ÷Lá*fh”D1¢0ïØŽabÎD1á륂Rs8“¨ˆ…bÆ4«P¨P¨ØÎ-‡s‹Þ± pJ-A±{Çv<5SDá‚â¿HšTAý{Çv GKšAñ *WP¹Þ±´ÇPÉÞ±(nA1ßìØÖ pn‡ŽmC&°o‰Â'm"P%P%5S4 ÀP!YEŠ*JVQ ¢ 6ªJVQ¡¢Âj­ÀyF*¬VXm0Ñ$Q4Xi˜Ô†p¶ìH‡•ÊŽXõž) ¼CÅÀ ’(F¶:¶a˜˜3QLø:A© ÔNÅ$*b¡˜1Í***6„sËáÜ"ÅêØ†8¥– ØWÇ6<5SDá‚â¿HšTAý¯ŽmŽ–4#‚âT® rWÇ>PÐ C%¯Ž½(PÜ‚b¾Ù±mC`®À-àбmÈVà-Qø¤íCªª¤fІ!ûJäùïÉÊ¡ƒÛ÷š)¢°ÕÁ CU)‰¢ \ª bUF¦€Š ±¨9V+¬VÄ¢Eƒ¯ Ž5LrËálp¤Ã‘ÊÞE‡ðá*†$Šp ¨šP5óŒLX™Hè JÍáT„S¡J í™***¶Î áÜ"Åêà†S8õ/(þÕÁ ÏLA«Q¸ ˆdè‚~°:¸á”‚bT® r¥¤YM܆À1T²Ô”«‰Û8ÆJ¾ÕÁmƒ`®À-àÐÁmÈVà-Qø¤íCªª¤fІ!*$«(PQ ¢@EÉ* TĦ@UÉ**TTX­˜‘šg¤Âj…ÕMEƒ•†ImgËŽtXé ìˆUï™Â;T ÌÐ(‰bDa«c†‰9Å„¯” JÍáTL¢"ŠÓ¬B¡B¡bC8·Î-R¬ŽmX€Sj Š}ulÃX3E.(~Añ‹¤IÔÿêØ†áhI3"(^Aå *wµë­À1Tòj׋Å-(æûò÷à pn:ö2xKrŠCªª¤fІ!*$«(PQ ¢@EÉ* TĦ@UÉ**TTX­˜‘šg¤Âj…ÕMEƒ•†ImgËŽtXé ìˆUï™Â;T ÌÐ(‰bDaÖ±†‰9Å„¯” JÍáTL¢"ŠÓ¬B¡B¡bC8·Î-RÈé,À)µÅn{á ¬™" ¿ øEÒ¤ êß:öÂp´¤¯ r•k;PÐ C%[Ç>R ¸Ålÿ~°cÏ÷cÇ6\[À¡cÛ ¬À[¢ðIÛ‡T TIÍ C0THVQ ¢@EŠ’U¨(ˆMª’UT¨¨°Z1#5ÏH…Õ «{Ç–¾'@“DÑ`¥aRÂÙ²#ŽtPvĪ÷Lá*fh”D1¢°Õ± ÃÄœ‰bÂ× J¥æp*&Q ÅŒiV¡P¡P±!œ[ç)VÇ6,À)µž:¶á ¬™" ¿ øEÒ¤ êulÃp´¤¯ r•»:ö‚Và*yuìEâóÍŽ­ïÇŽm¸·€CǶ!X·Dá“¶¨¨’š)† `¨¬¢@EŠ%«(PQ›U%«¨PQaµbFjž‘ «V¯vìEÑ`¥aRÂÙ²#ŽtPvĪ÷Lá*fh”D1¢°Õ± ÃÄœ‰bÂ× J¥æp*&Q ÅŒiV¡P¡P±!œ[ç)VÇ6,À)µž:¶á ¬™" ¿ øEÒ¤ êulÃp´¤¯ r•»:ö‚Và*yuìEâóÍŽ½½;¶á ÜÛ†L`Þ;¿©)¡cŸ_·—Õ±çnM ÊflVwÈ:ö܇ZÇ>ÿ抬Ž}nE²:öùw%vìÝŠÍsÛ3 Tؤ·Ó¢h‚ØXÇ>ÿM 9tìN›ç¾[«°Z1#6Éç?%'±cÛqä·šT4LbÃ$îÚ‹|oÏÖÎíB­C×}F:Tö‘Tt¨>›‘Ãéz2‹ S3Ed]Úð®ªî©¥%Q(b¡ð]¡B³ …Š ©¶rKÞ¡÷¯|ò¶¹ãH)¨ì3ÅÀ ¬ÀiFV‡Þ‡ˆà”«CÛX- ,™Â*µ_†z‡¶D¶½ï&ư÷½GÞ;ô>3Þ¡·ºãݱ­8EÅ$ÞèÐç°:´ã Ü>vh25b)‰ÂÚ¥ ±^éªJVQ ¢€²‚²f¾VPZ£3Ü$Q4P4Ä¢!½&Š«V;(GV1®XX×r<Å„• á”zJ ŠØ(Õ™)`UaukÀ=Ql‘»ãœb!Hh9‘2ªòt Á\S,¼ ÙÊŠ\#‚ñ.ä&*Â{«Èû±®À-àÐ?lÈÖˆ¥$ ïûªd* (+(kVQák¥÷7I  ±hˆE¯‰¢Ãj‡ÕÊ‘U „k ±˜#QLX™>A©§D¡P¡ˆÂQ™VV·ÜÅ)Vÿ0ÜS, -'RFU«,  )À8Åbõ}HeE®A¬þa&*Â{«”÷cÿ0\[À¡Ø ¬KIÞ?ö!Þ? CUÉ* TPVPÖ¬¢Â× Jï;n’((bÑ‹^E‡Õ«”#«×@,&b1G¢˜°2!|‚RO‰B¡B…£:3¬*¬n ¸'Š-R¬þa¸§XZN¤ŒªVÿX"R€+pŠÅêûÊŠ\#‚YýÃ0LT„÷Vÿ°]¸·€Cÿ°!X#–’(¼ìC¼†ª’U¨( ¬ ¬YE…¯”Þ?vÜ$Q4P4Ä¢!½&Š«V;(GV1®XLÄbŽD1aeBø¥ž…B…"6 Guf XUXÝpO[¤XýÃpN±$´œHU­þ±(D0¤Wà‹Õ?ö!”¹F5²ú‡a˜¨ï­þa½¡WàpèöõÖˆ¥$ ïûªd* (+(kVQák¥÷7I  ±hˆE¯‰¢Ãj‡ÕÊ‘U „k ±˜#QLX™>A©§D¡P¡ˆÂQ™VV½î‰b‹«îÀ)‚„–)£ªÕ?…†à œb±úÇ>¤€²€"׈ FVÿ0 á½Õ?úû±®À-àÐ?lÈÖˆ¥$ ïû¥÷DQqH…ð •Þ EC,(kš(ö~ 篫8vHÀ3Q ¨pÌ›ÁŽç)QL˜ Í «ŠX(ÓìˆÂªÂê'uU¶SRk·áhu•Ý¢¨b•áèØªËÞ53P3†+p 8ÔŒ ™À±”Dá53P3†pO‡T¯Pé5³(bÑ.”b˘ ”mf øÚaµàL1 bÀ1¯™šY30¡j‚B3…ªÂw…cšQXUXÝ⤮šq Aj­š1­®šYU¬š1[5cÙ{½f&ž³;®À-àcÍø ¬KIvjC¬†CUÉ* TPVPÖ¬¢Â× J+3ÃMEEC,bóÒñ:Õ‡ÀjåÈ*Â5‹‰XÌ‘(&¬LŸ ÔS¢P¨PÄFá¨ÎL« «[î‰b‹^™Ž;pŠ… ¡åDʨʯS"R€+pŠ…¿ ) , È5"¨¿Nu á½Õ?pÎu\[À¡àœëX#–’(¼Ø9õ U%«(PQ@YAY³Š _+(½Ø9×bXÎÿúNËŽ‹^“Š«V;(‡$Šp Äb"s$Š +Â'(õ”(*±Q8ª3SÀªÂêÖ€{¢Ø"Åê†;pŠ… ¡åDʨjõÙ_0¤Wà‹Õ?pñà¹F5²ú‡a˜¨ï­þaÛó pn‡þaC&°F,%Qxÿ؇xÿ0 U%«(PQ@YAY³Š _+(½ì¸I¢h hˆEC,zMV;¬vPެb \±˜ˆÅ‰bÂÊ„ð J=% … ElŽḛ̂ª°º5àž(¶H±ú‡áœb!Hh9‘2ªZýcQˆ`H®À)«ìC ( (rjdõÃ0QÞ[ýÃ6‹à Ü>SM ш”Þ…;¦(nÃPa?Ñq6'á†Ý†tPzžIÅÅ€ /CE.ЉXLÄb‚B3…ªÂw…cšQXUXÝâ$JžÔUV6dG«+á…D+á GÇV¶Z]ÏVŪ²ã Ü>f«ш”–­ ËVRqH… ûÁ˜= Ç“„ ±ìt •C’Š«–†ç x&Š ß'(Z…ÂW…c GT3¬nqÒäDÜIáÙéC¢UÏNÇI…g§ )Ñ1ÏNÏ›Ùi™W€+p 8d§}­ (=;…ggCv†ŠÞ…g£ ªGGIž Ùh”SÅ…‚Bá˜ÖD¡ˆ…ª"¼º% ÏÆ†l4Ü)“º²ÑpT±RqQ”èÛÊÆC]ËF¬€9®À-àã™À ¼% ‰‡¬„>,¢áÒ€¡ÒÞ¶:PÔȺj‹jŽ{¦ˆ¬~½á”­&Š¡ álgÏ*:TtP 8:$Q çÀŒÌ<#*&TL82s^(„*T)fDs,VVŽl-Ql˜‘-R¬b7œT¬zÇÒcR¦Xøý† AÍjÆo6ް*°Z@Y2ÊJPV~³áXE…•ŠÔºÕ¥ðüÓqn‡.…矎xKY]êðü‡” •Þ¥Ï?#ëêR†‹Ú3Ed]]Ê0([M BÂÙΞUt¨è ptH¢:ΙyF&TL¨˜pdæ¼PU¨R̈æX(¬*¬*ÙZ¢Ø0#[¤X] TÅêR6d“2Åbu){D*À8¥ÖêR6V (K¦@Y Êju)v)2xKñ.u (8¤4`¨´.u ¨‘Õ»”cÄ¢öLY½K9e«‰¢AhC8ÂÙ³ŠŽIBÂ90#ó”(&TL¨˜pdæ¼PU¨R̈æX(¬*¬*ÙZ¢Ø0#[¤ð.å8©ð.åC&0)S,¼KÙÔŒ f¼K)`U`µ€²d ”• ¬Ö‹ÖDQa¥"µnu)Û`\€+p 8t)2xKY]jQR0Tz—Z5²®.e±¨=SDÖÕ¥ ƒ²ÕDÑ ´!œ áìYE‡ŠŠG‡$Š¡á˜‘™gdBńРGfÎ …P…*ÅŒhŽ…ÂªÂªÂ‘­%Š 3²EŠÕ¥ '«KÙ Lʋեö!¨Aͬ.u €UÕÊ’)PV‚²Z]ʰ&Š +©u«KÙÏ…à Ü]ʆL`Þ…@…@…ÄCV—Z‡” •Þ¥E¬§ ÊŠXÔž)"ëêR†AÙj¢hÚΆpö¬¢CEÅ€£CÅ€ÐpÌÈÌ32¡bBÅ„#3ç…B¨B•bF4ÇBaUaUáÈÖņÙ"ÅêR†“ŠÕ¥lÈ&eŠÅêRûÔŒ fV—:PÀªÀjeÉ(+AY­.eXE…•ŠÔºÕ¥°·Ôqn‡.eC&°o‰B B Bâ!«K¶§âÒ€¡Ò»Ô¢¨‘uu)ìpuÜ3Ed]]Ê0([M BÂÙΞUt¨è ptH¢:ΙyF&TL¨˜pdæ¼PU¨R̈æX(¬*¬*ÙZ¢Ø0#[¤X] [uÅêRت똔)«KÙn^.À)µV—†`Ô%S ¬eµº”aMV*RëV—²T€+p 8t)ûz+ð–(**$²ºÔ¢(8¤4`¨ô.µ(jd]]Ê0bQ{¦ˆ¬«Ke«‰¢AhC8ÂÙ³ŠŽIB½KÆŒÌ<#*&TL82s^(„*T)fDs,VVŽl-Ql˜‘-R¬.e8©X]ʆL`R¦X¬.µAÍjfu©¬ ¬P–L²”ÕêR†5QTX©‘òf—²Ÿ¸·€C—²!X·D!P!P!ñÕ¥EÁ!¥C¥w©EQ#ëêR†‹Ú3ÅÀøÞàh+‰¢ÁJƒð†ð6M‡t¨ê 9œBb1Þ‘'u"œ*&TÌìÈļ+(ª´& E,V3¤Ù‘ ¾n Ü"ÅêZN!¨‘Õµ Oà AÙ¬®eX€Sj­ÆeC`UàH‘DQ@2”ÙêZ X©^î[] {ÑWàpèZØ‹îX·D!P!P!ñÕµò^tÒ€¡Ò»VÞ‹nC*(+bQ{¦ßm%Q4XiÞÞ¦‰¢ãU#‡s@è@,Â;ò¤N„sBńЙ™˜w¥B•ÖD¡ˆ…ªb†4;²Á× ”[¤X]ë°½cÈžÀ)‚²Y] {Ó§ÔZ]ˆÀªÀ‘"‰¢€e&(³øÇ…еl/:„W„ûVײ¡¸·€Cײ!X·D!P!P!ñÕµEÁ!¥C¥w­EQ#ëêZ†‹Ú3ÅÀøÞàh+‰¢ÁJƒð†ð6M‡t¨ê 9œBb1Þ‘'u"œ*&TÌìÈļ+(ª´& E,V3¤Ù‘ ¾n Ü"ÅêZN!¨‘Õµ Oà AÙ¬®eX€Sj­®eC`UàH‘DQ@2”ÙêZ X©^î[]Ë6Šà Ü]ˆL`Þ…@…@…ÄCV×Z‡” •ÞµE¬«kF,jÏCà{ƒ£­$Š+ ÂÂÛ4QtÒ¡ªƒbäpˆÅ@xGžÔ‰pN¨˜P1³#ó® T¨Òš(±PXUÌfG6øºr‹«k9… FV×2ÝèZ¶±´WàpèZ6d+ð–(**$²ºÖ¢(8¤4`¨ô®µ(jd]]Ë0bQ{¦b]«¿»Öþ}+‰¢ÁJƒð†ð6M‡t¨ê 9œBb1Þ‘'u"œ*&TÌìÈļ+(ª´& E,V٩ّ ¾n Ü"ÅêZN!¨‘Õµ Oà AÙ¬®eX€Sj­®eC`UàH‘DQ@2”ÙêZ X©^î[]Ë6šà Ü]ˆL`Þ…@…@…ÄCV×Z‡” •ÞµE¬«kF,jÏCà{ƒ£­$Š+ ÂÂÛ4QtÒ¡ªƒbäpˆÅ@xGžÔ‰pN¨˜P1³#ó® T¨Òš(±PXUÌfG6øºr‹«k9… FV×2SM ш½_àññ¢Âj…Uû¥¶ãºg ¯D<»5<àè(‰Â+ϼBøåÔD1A¡ P8ª5QhÇXU„W·D±ÅI’q¤LêJp<5\$Q”èÛÊÆÇŸ_ ž_:®À-àx^iسOV+¬ö<E‡ŠÇLxêågv6d‚r±™) « Ç4ÇBaUaU£Õ•z‡§eñ£•}xçx& ‰­ìÃÓ1Ç5QÔ¨âföáQ–ã ÜÙ‡GW†=ûðPé@QaµÂjƒÊž)\W(*¬VXíx$ŠŽ ˜ðÔ;\Bèå„c3S((VŽiŽ…ÂªÂªF«+õ…ñ£•}¸Žt<…ÄVöá:ÒqM5ª¸™}ön®À-àãCe2xKöŒÍ†T TIÍ C0THVQ ¢@EŠ’U¨(ˆMª’UT¨¨°Z1#5ÏH…Õ « &š$Š+ “ÚΖé°ÒÎ=;ÒáH‡#ªÆ)Q XçˆÂW ZV'¬NÄbæX(b¡P¥P¥9µ±P¨P¨Ð¬b‹öìŽ#…œR,ýb5:ÃxdЉ!´…‹dè‚þ è«—(`Å.(n));ÅíÏàÓDšA±û3zÇp Å~«£Ÿ©Ýqn;º™À ¼% ›4"P%P%5S4 *ëðŽ5SDaÞáCU)‰¢ \ª T•‘) ¢BEE,jŽE…Õ «±¨yF¬6øÞ ¢e Vò¢!/ZVÑ¡¢CEG¸{ËPÑá{‡ªqJV|÷ÈŽL82¡bBÅÌÙ9‘ J…JÍÙ©—"6 šU(Tlð}å–(ü<±$hA~’pÜ3ÅÀ ¬ÀiF-GÐr-GrË´?o8† ôã ïè~Ò8RÐJôÕO޳ ´aÿ¸uÞ°w– pn‡ó† ™À ¼% ŸÄ}ˆ@•@•ÔLÑ0dC…d* T¨(YEŠ‚Ø¨*YE…Š «3RóŒTX­°Ú`¢I¢h°Ò0© álÙ‘+áì0ѳ#Žt8Ò¡jœÅ€ÕpŽ(|uøE1auÂêD,fŽ…" U UZ3b¡P¡P¡YÅ#¼š¼áH±:¼SúÅjò†;ðÈCh5 É*ÐýAÐVG?PÀ*Š]PÜRRv Š{5uÃ4‘fDPì«©†c(ö›ݺu®À-àÐÑíë ¬À[¢ðIÛ‡T TIÍ C0THVQ ¢@EŠ’U¨(ˆMª’UT¨¨°Z1#µe X­°Ú`¢I¢h°Ò0© álÙ‘+áì0ѳ#Žt8Ò¡jœÅ€ÕpŽ(|uôE1auÂêD,fŽ…" U UšSK … … Í*¼£ïC6Pn‘but§ô‹ÕÑ wà‘)&†Ðj.’U ?úƒ ?¬Ž~ €U» ¸•:º c…&ÒŒŠ}utÃp Å~³£cåÒqn׊|ˆFìÒpOV+¬6¨ì™Â‹+—†(FI^ÜX¹t Ê©‰b‚BA¡pTk¢ÐŽ!°ª¯n‰b‹“$'â¾’ÙŽ+p øxµëC&°o‰ÂNh6D J Jj¦hUvõëxf •(ÔËʱ$Š¡á+PYz¦€Ð*jIV+¬VĦŽLI¬ˆMƒŠ–cÑ‹U *Zž‘F«ˆE‡ŠžUtXíˆE‡ŠžcÑ‹«Ù:òŒ Xpd‚rfG&Â9A9‘73‡s"œ**4«P¨P„WNÍ***68¶åÙ"…_–;àÔµ]Ë;²ã ¬™" t1AIy!hd‚®$hI’[Ž ÅZŒ Åø5ù‘‚VàZŽ_“(Ð…„-çÖ©ÇVe pn‡S ™À ¼% Ÿ´}ˆ@•@•ÔLÑ0ªüÔcxf •(tz K¢(Z¾•¥g -PQ¡¢–DQaµÂjElêȘĊØ4¨h9 ±hPÕ ¢åi´ŠXt¨èYE‡ÕŽXt¨è9±°:­#ÏÈ€ÕG&(gvd"œ”y3s8'Â9¡B¡B³ … ExáÔ¬B¡B¡bƒc[®‘-R¬SaN]Kе֩ÇðÖL… º˜ ‹‰¤¼42AW´$É-GÐb-FÐbÖ©ç@A+p -gzº°åÜ8õt[Ø-À¸|<õø ¬À[¢°I³!UUR3Eè²Sã™) T¢P?õ8–DQ ´ |*KÏZ ¢BE-‰¢Âj…ÕŠØÔ‘)0‰±iPÑr,bÑ ªAEË3Òh±èPѳŠ«±èPÑs,:b1`u [Gž‘«ŽLPÎìÈD8'('òfæpN„sB…B…f Šð*©Y…B…BÅǶ\#[¤ðScN]KеüÔãxk¦ˆÂ]LÐÅDR^™ + Z’ä–#h1‚#h1~ê9RÐ CËñSÏ]HØrnzäýxê1\[ÀáÔcC&°o‰Â'm"P%P%5S4 *?õÖL…­Sa¨*%Q„«@Uª22TT¨¨ˆEͱ¨°Zaµ"v^Ù›Âk‡¦6¤Á÷GÛL*æ½Á±]E‡•Ç:ë9œÙ8`uÀ±‘'u@øÅD8gŽÅD,&(”šc¡˜wEl±Ð¬B¡B¡bCx·ž(¶H±š¾aNýBÐ/VÓ7A1[¢˜P1¡b"63׈Š"6 •šgD1ï  šUlˆøÊ-R¬“‚SZÎ:)îÀ);-FN´…‹dh1‚#h1’û… _ú ø¥¤¼Ôÿ:)¦‰4#‚~°N †á›Á­“‚½P€+p 8œlÈVà-Qø¤íCªª¤fІ!På'Ã3S@¨D¡ë¤`XEЂð¨,=S@hŠ µ$Š «V+bSG¦@,¬6ÌPË3Ò”p¬ŸE‡•Ç:ë9œáìP5àØÈ“:0©Â'(fK*&TLÄfæQXQÄF¡RóŒ(æ]¡B¡B³Š ß@¹EŠuRp AËY'Ã8e§ ÅȉV£p‘¬-FÐb-Fr¿ô A?¿””‚ú_'Ã4‘fDÐÖIÁ0c3¸uR°†_€+p 8œìë ¬À[¢ðIÛ‡T TIÍ C ÊO †g¦€P‰B×IÁ°$Š¡á+PYz¦€Ð*jIV+¬VĦŽLX4Xm˜¡–g¤!)áX?%Š+Žu8Ös8;ÂÙ¡jÀ±‘'u`R„OPÌ–(&TL¨˜ˆÍÌ5¢°¢ˆB¥æQÌ»B…B…f[ôm GŠuRp AËY'Ã8e§ ÅȉV£p‘¬-FÐb-Fr¿ô A?¿ øÃIÁ†À±BiFý` Ã16ƒ['…þ~<)®À-àpR°!X·Dá“¶¨¨’š)†@•Ÿ ÏL¡…®“‚aIB ÂW ²ôL¡**TÔ’(*¬VX­ˆM™±h°Ú0C-ÏHC4R±~JV:ëp¬çpv„³CÕ€c#OêÀ¤Ÿ ˜-QL¨˜P1›™kDaE…JÍ3¢˜w… … Í*6D|å)ÖIÁ)-g wà”‚#'ZÂE² ´A‹´ÉýBÐ/ý@PüRR^ê ÓDšA?X'ÃpŒÍàÖI?€ÏTCx‹XJ¢ ñök¸G\O‰¢Bx…pì˜YýcQxÿØépl@ÕD1 bÀ± Š9ÅDø&(šÃ©ð]>…cª™V·8ïr"Ná\ÅlC¢ÕUf†“ŠUfef*JVQã›5`ï\à Ü5`Cx‹XJ¢ ñ0Ü#®§DQ!¼Bx…'ü¢èpd@Å@¬FvdÀ‘ Š SÅ…‚Bá¨ÖD¡ðUaU1Cº%Š-γœˆ;p § /VÎŽ*VÂ/ŠR1*+á-õn$¼½[W€+p 8Ü Ø ¬À[¢ð3õ>D J Jj¦h2€¡B²Š* T”¬¢@EAl T•¬¢BE…ÕŠ©yF*¬VXõàží”(|o°Ú0ÉM3Eôm]醉žÃÙÎÇ:ë3Q X°:Þ‘gd‚bÂêD,fŽÅD,” UZ…b±P¨Ð¬B¡bCx7Pn‰b]Ù_>ôÕ ÷L10d+pšA¿ô A¿Ü/Vûµ!°Šâ—\ì‚bûº¬7œÃ‰úÿº¬7œòBPÿ7›¼½ÅV€+p 84y2xK>iû**©™¢aȆ É* T¨(PQ²Š±)PU²Š V+f¤æ©°Zaµ"í”(|o°Ú0ÉM3Eôm5yÃ0Ñs8;ÂÙáX‡c}&Š«VÂ;òŒLPLXˆÅ̱˜ˆ…‚R¡JK¢PÌ€" šU(TlïÊ-Q¬&ùHÐ?V“7Ü3ÅÀ ¬ÀiFýBÐ/ýBr¿XMÞ†À*Š_r± Š]Pì«ÉÎáDý Š5yÃ)/õ«É{_¬Wàð±Éû ¬À[¢°I³!UUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjE,Ú)Q4øÞ`µa’›fŠè›7yÇ0Ñs8;ÂÙáX‡c}&Š«VÂ;òŒLPLXˆÅ̱˜ˆ…‚R¡JK¢PÌ€" šU(TlïÊ-Qx“ß?ôoòŽ{¦28͈ _ú… _HîÞä}¬¢ø%» ØÅîMÞq'ê_PüÞä§¼ÔÿÍ&o¯à ÜMÞ†L`Þ…@…@…ÄCV;^‡” •ÞnE¬«½F,jÏ‘uõJàl5Q4mgC8{VÑ¡¢ƒbÀÑ!‰b@è@8fdæ™P1¡b‘™óB!T¡J1#šc¡°ª°ªpdk‰bÃŒl‘b56ÃIÅjl6d“2Åb5¶}jFP3«±(`U`µ€²d ”• ¬Vc3¬‰¢ÂJEjÝêR¶W½WàpèR6d+ð–(**$²ºÔ¢(8¤4`¨ô.µ(jd]]Ê0bQ{¦ˆ¬«Ke«‰¢AhC8ÂÙ³ŠŽIBÂ90#3ÏÈ„Š ŽÌœ ¡ UŠÑ …U…U…#[Kfd‹«KN*V—²!˜”)«KíCP3‚šY]ê@««”%S ¬eµº”aMV*RëV—²ÍÓ¸·€C—²!X·Dá3°¨¨’š)† `¨ÍQØê…†¡ª”DQ®U±*#S@E…ŠŠXÔ‹ «V+bÓN‰¢Á×ÇÂÙr8ép¤ÃDÏŽt8ÒáH‡#}&Š«VÂ9rvNPLXˆÅ̱˜ˆ…‚R¡Jsj)f@ … Í**6„wå–(Ö óå#AÿXÛpÏC&°§ô A¿ô ÉýBÐý@PìR2Š[PÜ«cÎáD± Š}utÃ)/„Å~«É[/À¸š¼}=xK>iû**©™¢aȆ É* T¨(PQ²Š±)PU²Š V+f¤¶L«VL4I V&µ!œ-;Òa¥#œ&zv¤Ã‘G:TS¢°:Î…¯Ž¾(&¬NXˆÅ̱PÄB¡J¡Jsj)b¡P¡P¡Y…7õ}ÈÊ-R¬Žî‚~±šºá<2ÅÄZÂE² ôAô‡ÕѰŠb· ²_;lSö!p¬ÐDšA±¯¦nŽ¡ØovtÛÉ\€+p 8tt2xK>iû**©™¢aȆ É* T¨(PQ²Š±)PU²Š V+f¤æ©°ZaµÁD“DÑ`¥aRÂÙ²#V:ÂÙa¢gG:ép¤CÕ8%Š«áQøêè‹bÂê„Õ‰XÌ E,ªª4§–"  šUl1«£Ž«£;… _¬Žn¸L11„V£p‘¬ýAÐýauô¬¢ØÅ-%e§ ¸WG7LiFž:ºa8†b¿ÙÑñâ‰ã Ü݆L`Þ…Oš½›UUR3Eà ’U¨(PQ ¢d* bS ªd**¬VÌHÍ3RaµÂjƒ‰&‰¢ÁJä6„³eG:¬t„³ÃDÏŽt8ÒáH‡ªqJVÂ9¢ðÕѯÁê„Õ‰XÌ E,ªª4§–"  šUl1«£Ž«£Þ& iÀxdЉ!´…‹dè‚þ è«£(`Å.(n));Ž:ºašH3"(öÕÑ Ã1ûŽnEm½œ+öþßuÿþ´ßÂ÷gª‹#§ºíCtÇû÷Fé”»Jû³ ç´[Ù[U²µ&«dë^VÉvÜ¡r}˜•ýó½r­aZåZO=WîκτUêiŸ)«TkËV¦Ö¶Ïe·[Ýçß*Óš¿•¥¬,íäq¦ˆa³Ê´S•¥Ÿ¢lbÅÃieågµ½¬ü{›1; Ša§%¼ŸKw~®5‡Äò⯩õ×ÔúNR˺ØÊ›o!Õb^©ZH¥Çòè°î~-•Ë£sªÝN¥Çòè°Šs-•Ë£ÃÅõTz,×Ré±<:œù¯¥ÒcyôÚû_¯KÝîJM¿¦Î“SçöÙë|vz¹TažœSçåR…yrX;~jª0O·,OMæÉkï¿tª0O^{ÿ¥S…yrXr}jª0O‹7OXv‚Úö·ˆýÂæ‚åöåi›{&¶ˆ-Œþý Š (¶G)d‘Ýq¼Gþ<ŽœMÉmJå×(­ûœc-g· ÿ¯ yt^.SxeH; ½¢e9ú˹JË*½±¿‰d=ÄñB¿SÔSHËK£xâìY©íSawÊç†p%‡¬7´—¶¢»ïöh§`ƒak實³½WœŸeݶ·¶'ŒÎ6Å‚ýºÔù)ãîß´±[š–ÑfbwÌzÍùqš\(ÌêžöÔqîV­ÏA+¼—sÐ…ÂÎæçÓ¬ „ŽÃù´$ë¤N§hF±ûnÏï,VöðîDêîÝXw_Õ¬^|õCí©’QoëÞÃÚ ڹƬÛéi³ÉÝÃ9Æ¢°sÇž/ {Öe±Øö,µ“è¶Jî{’'Ì ;ïmý¯yò×ߌ—ðѲú„p)¬*¬*¬j¶ª°ª[Ý`uƒÕ-PZ;½Eyžï¥a£t| ÷Ͳ*ç¶z¤PÊ£ŽÊÅ…¥’ÆïoQ"Oy"Hy< I H‰Ipùi±rL‚˽Y9X}4 .÷õm½àðkk/Æ¢À0á7¡‹¢ÀjÕR[¢¨‘Õï–ˆ›$Š+ Â;LôL10Dã¿Êqœ(¾ |õ®æxf Åèˆ V~Õs ¨˜[©3:† p 8¤Ž Q`˜ðÔYV ¬– ÜE¬+u ˆ›$Š+ Â;LôL10Dã•:†…ÀW¯+uâ†@¡Äj¥Îa—fàVêL¤Žá\©cC&VKn‰¢FÖ•:xºl¸I¢h°Ò ¼ÃDÏC4Y©ƒ§Ë‹Bà«Àו:xº|¤P ‰ŽbµR'?]6Gn¥ž.;.À5à:xºì&R(†DG±Z©“Ÿ.›#·RO—àpH²û¶í»É=•ð´ù@áÙdO¡¢@EÉ* TTPz*áió¢Áj«ÀˆU?%ŠŠ¿_©´žëž0¾ ]©txº<1D£#R³Š 3p+•ð´Ùq®‡T²! ž7‡GŰZ`µTà–(jd]©ƒ§Ë†›$Š+ Â;LôL10Dã•:†…ÀW¯+u ÏL¡ÄjåÍái3fàFêœ7qRÇq®SLJ(0LXê( ¬X-¸%ŠY=uˆ›$Š+ Â;LôL10DãOljBà«ÀWOÇ3S(†DG±òÔ9PTÌÀ­ÔÁ—ã\©ƒ;.Ç0á©“ï¸|¬– ÜE¬+upÇe¸I¢h°Ò ¼ÃDÏC4Y©ƒ;®E!ðUàëJÜq)C¢#‚X­ÔÉw\æÈ­ÔÁ—ã\©cCöåQÝ'ËS w` Ï&»£‚Š%«(PQAé©„;°EƒÕV«~J*4~¿RiÝëœ0¾ ]©t¸ãš¢ÀÑ©YE…ŠŠx‰Tz‰=ñ/™:Ì“s`ÒÒ‹êKäkšÔó$bÒ8©_gw_{»å8‰/7iœ±PÿO˜4Ü6;.À5àPÿ¸mv ^ìù¶Ù‡Àj©À-QÔȺê·Í†›$Š+ Â;LôL10Dã•*¸m^_¾®zÇmó‘B1$:"ˆÕJ|ÛlŽÜJÜ6;.À5à:Ø”å&R(†DG±Z©“o“Í‘©sËCWßÇ«Žcêø˜áë‡'¶ïã,uvÊCꈽ`Q`Õ^˜·÷[üü¿(Ò…Iþk"§˜: KbÂCohîŸo›ÇbDßüW +½õænTñ²oòSçÊK›½±yL[/mna‡.c¸œ€ã÷Ç» â“fxDì“¶(|Òö!#Z]á”Çk =>äñ[¿Y‚áË›rrûÛDQ#¾u:âù‡ad¹;/yµ4ßßxÚ_,v ûþ…Mý׸7y¬K°%Äð`ɨê‘ú=Þ`î%ìo¾ú±·ë÷xoâ/Y× â±ú=Þ`>ñ¥kÖïñóe^º¶IĆ1 ìß_§ó@ЮÎkHVà-QØïx£Š%«(PQAY¡Êÿ|ý¢°?nl?ÙÔ ¢UàìH‡ÕŠï÷r+ëW¿Ö_mß³ïtÆ÷9‚X¬¿!nxk¦ˆ¾ ¹þ†¸aÌЭT³M–'`®‡T³!xk¦€Šð;Låzqç‘¢ÀjÕ ÇjK mKCzF¬TH±R+nít\pOžJ6D£pAlo )QøT²ßc»>¤Ø5Í!Öœo ±æ|kˆ) ?nØ/oìø¸“á÷G)ìWú^ó÷׸Þ~ÉëëWøPlF?_Ÿ#zû‚òÜ–nûÿ…4<ØÇÄŸúåóžÊ²¤ë£Vì'ºnTá9÷òè%´<îq¹õËr»ÜóI¥¬ œ”ÓãO~Ïí¼ÜRõÑ!íôè¾²ò/»{O/9×ìM+—ê¸9äòÛ+håÜ,ªÍñ­¬oW­ØOBõAÖƒ(Ë »ø³ß{òߢ잯é>ÁºÜ~Èþç†K³J/;ö›rûÛ¿¥Yxì¦|7Ö¼´cÑ‘ßå塇‹½oÁ‘K6=\_ûr#›ÂþŒº¶|›+*vRÔãe‘¹e¥ÀJ•+%[)[©°Ra¥ÂJÍVêcVÄ~µÅ­Õpž*ÇÔxˆ_Â9î¤ð믿ãB „-Z²Ð¡B „–,ôÑy»ü1Œ£Ð ¡BkZ!´Bh…К…>>õx¿qᱩ:¾m‡¸¯Î¹UÜb9n»Õ’­âžÀq¼Øº¥âÊ3…Ç(¼¶µÅ~M9Ýíàxk¸–×nšou‰'^tØpã!š-è_¨{iU{ ÷ɺqʽ\,>å¡.¿¡ñžçø@Ào{ö3¯Tüõ6èenƒ¾‹á Ø2DÜüô×ùËÍV÷¸Ò}É`ø«ž:¯Îsúïå Tlæ/¢âX½sYuçb.‡»ËýŽÌï.÷}=ùúV¤=zK¢ï]ºÐJ;ycýÅ1¿o}Çâ‰cßc`¸&Š­®=××\x…ð áÂk^!¼B¸á½õ~0Ü}Ù‡Œ¨b9RsDÚ>ÄŽÚåa°ÿ•‰ö(Åå×WCŽël¯QœÿŠžbïϤ@yŽÅN5ö§Ø‹1³zY¬)_oÜäÁÊK_Z~ ._G•©˜—gÌO¸:}Ð ͱBŽ{è[zãy€=„¹ÿêJ/³ß7;½µ±ìóà)jÀ¶³úŸÝÇïZíûsW(ñýi«aDà8Q<éiëË ¥ÕÃÔ-!O¶zÚN׋æì'„ðš}ôŠè©9+߯uÖqɵ<é"ÈÛÍv5ç|Ñõ´´SèfÏ ûÁ‡‡ƒì‡\_Syô¯MÙ‚­á}ýèô¨ÕK¤îsþ‹Œ§÷Ãṵ̀[-/mµ(¯w[?äú‰8\=p²áiáŬ´G‡tì´7ì§°}¹÷ gE§Äìþø¼ÓcC.—qKX±?â‚댛×·OºÇb\_Tö!×WŒMK© )7•ýÓ=j¨ìWFß n—‹‡O\>¤=>d^†XO[Aþú¡½t9Ëã¾Èã¾\þá#C®ßFøÍ‹ùO¨­b‡àº÷ÁCŽ×t7‡H»~ѹ)§GYJ¿}r£vì¿7&Èšãèï†êõ½áçå×yï²Yä‘CæûWÏ{6$ÞM:¾uȆCnœÖíªæq!õQ¡Öq}óˆò8ëùšèp=áØ¶þ\öŸ]õÝ)(®?-±Ÿ ØR¬C®/¸èñ"øáˆùruˆm¼q+êC®÷@2rºñ^âfmòj!­Wów ¹z¥oCÊõû"v µ–ÛÄùà!ûr‰öÎÎñÏÇ>Ú§®ñÌscÈåBëèñß¼öï|ü샿|ñé'ï|ú¿øê¿}þùÏ~òÚßìëI²ß1ßô€„ØÅOûe…=<¾Rö _ùïaˆ-iûëåVý5Û)ïûûŒ}oÙ=±œl»ŠÝø ]¾².ãÝf/³û!öžZÝ»wÝOBYî .7]wl­Å^"?°xÝÆô°é9ÙûaüòØ®”‹_YÏýÂþØÊ Oë/»œü¯ý†Šoz8Ù5ؾájÛ2«±Ø{âö•÷½uÅzR“¹ï¦èö@¾ºGvµ~²ç4û©j_“ºîØomïØO|cí"¶û—q¼‡»ïšêNÏã9PöÛ?K©‹¡bNÚ•ˆÒ]‹½Š]öÅ.dýV“½Ø·?8ðÕÞ†Îém·œ§Ýàðyqíì½C‹<ípë>ä²²w‡ý2¬¤í5mI`¯šî¬‡›²~¼í•ý‘·ì¬{t-ªûå—=Ä×±jKÜÝ^¨òi,Ört¯„}'ŸÝ@Þ²Íüþ~б§î­Ý^†Þ‹cî¬ÛЮհýyÑm—»yzÛø/*l»¦õ»*þ{ Ûž/¶æ°Ÿôînöãt–y{“=ö—½Ç¹&[]ñ|¹Ì°%ûij]:=ХĚÉl›á+[`¼2Ðãlæ×l×çð^4²êh³¯JRÍêñbèÒ!įTï‡ìï8Û­„ìÉpYŸ¿ÚQæn`¯qi^°öü·”øc\¶Ý¶mA´sÁiM€XîAß=±Ÿ28—}‹Cf øX°º{´÷¸pâÛû­MŸmÊl«5Û{ñ帅$Îô<6‹â¶Šÿšm •5ÄÿëC<•Npúpâ³9 ?"zÙ·jÚÖþmuɘi•Ú~yy0)ûM½ì÷M—¸Ø™µÅ£íÅøsbÚS§ýúeŸ¢_´ø+çvÑh¿èâ5}ÚO6Å×}l¨Ÿ²¬Õض ‘\ÓÕR©‡b±ßõ9‰ímkä>Ós&¬%7{w|$w²ç¬Ì=.j7°+.b·âõýkÓèF»gö´z/`?­üÉùe;EgOöüãk'¸“Íô¾ FÚú!ïk{\ö][RW©¡ wo©íYÌXWAöc'`9^( °ãëôi¿Fd瀹7úõ«8‚ž²¹~¡d±ŠŒíºn®Î°ŸÍÊiÿJ÷Э¾ëžì,âWhK‹m÷ð¡ö %é4Qö6X¬¿Ìui?~ª»\{®§%×Bu<ÓÚUÑ)¬í-ªvé·¢»_K¯§zдŸ„ãµöꜛ'¦EÓk?ã¶ÃLïÙ  =99übˆmüÛ/J¸® Y·..ÿ-§Õ½OvÍoÏ[öB©~ýâ/fí§ û½©r¸m±iÜ[‘çîá•¶ýA6;7–Ã!ûyÚ’a¿OÚsWÖ»]±ý öc8r¸³±éÛçf?ùÚ ÞÙéKK–½Ñ—=N¥¬Ðíû7/¿¿%ûñµµs¾˜'öÈj?¤{—’ýœh¿üsy8„.µgÙ~Í]öN)‡‹ü¾ÏðÞJ?vï}.mš]¤¬ŽiwÃÎj»¶¹ÎjÓÚß5ÖÕ½÷â“ÝMìCOs ÙKÌC·³l«¿Ø/·Ù×~_PÖ•Oþ ÜávÎ^eÛ_™ý^MÆášWÖ9×=‰=ÌÝ/»Äž*ŸÖ4ú“s»HÙ[Rq¹e÷¿Ø¥±ý¤sqû…µRí¬o§öu?]ŽYsñK¿õQ{Þëͣؕ˜É´ë™õš«÷{°hÏjö3O6dŽxnd{ K¼e=t†}ú&ý\7Ës†¯Öuq2 ý俊'}]Ì–èÉ:Ó¦”Z_ís5–}¦ËÉ.úý‚@ößBÛÉa/RÎuYass’è™®¯v±/RÊá³Ú²ónP-½Wªûd’_öSV9œIŠõ:»g³ö¸Nåö»¼öâÌf ~ ±'kÕÒÛ*b%¦§Ô~²ñ}¢ë<}²‡¢ Ånš·-Ó®ãì2Ô.3Ö½Ú~Ñv¹¨—ýŠ^öú:t)yß·jß«V·P¾­úò_±u”ýå×Þ÷}ó¶Þ›ëX†}dÕ¸÷ÝÃëàþœa/ÔnÕ¸r·#¥<”ëôi·ŸS=ÙjËÊ:ÛŸm¿³oà°§¯g–xý/aeüpY±n¼ìG6o§Û‹ë¥Ú&<Š=6Û=)bõ´šª]™³ûE—\½Ò—[‡‹YSr>íTµ‡ˆýwÕ´í½°DíRY`/ ‡ºeR»Ÿö£;Êþpki¯bøEí>­}ÝñÙ=‰½:é~5x±k…SLÌõ«öÛ.¢VËv½äZ4m{‹­Y¯›e÷ Ù;–ÖwW2´ãU²Ye¿eØFG°…9=‰=õÛ/ýì6¦¬d0Ûößð×dÍ‘i8<6j^ÓþkÝ:§A–!Ó²ç®õÇz±¿[à?úØ÷¢ië©_³ %+¹ žµìém×u{S-‡‚µŸ¯ì{-#|Êûñh–|*·]_‡ò_O+üÍ ¿Ûóg[ã õd«:.·ØÏ³ã_ÖYír>.—…Ÿßúå§ïW{üNûðC‹öF¬…©ØÐþ_ÿQ[ÔÎýÿíMËÔÖ·U[„0 ·..ü§]¶¬ç§·Gåµ7sªÙÞm§è‘?úøæNíìfÔ6ÁØâðçêNº7-ñßZµGFöý^©öÀûð“vÍ×ÐhGÛ~¸Ý½nË.VÁ××m•Ü^„¶ÇÆ ÍlµÌ Ù½ƒ yÊÐëA³‡h6áûã@Ïòalüu7Tz…ÊD]‰»ÿÕ5£°à·è/ܬÆoWôöØÄbácìS45?@µSX½Ø;Ë»Dð“ÝÔáRÛ„Ú{ú&tæÒ{üŸ{>Û2¿-ô,óìÎÐþl#Ê’cÏÒ»žfÓ÷oÙwÓo zv«µûy\3ÆÜ=…}^aT‡9òeC+j¹n-lv]/‘—^ÿÌy¹¶ì™‰•—Ö'»Ê'?Ã?–·~sv=uËÛó5òíÔõ›;[~ð…¯Ž—JmcµIÙÃâ{3žù—‹´‡¹¾jÁž)ÙìÛÖLûÉÒðÆáÉ/àí’óÛi*7{›e·ø¶Ã²½yO©êv­g䪶 Ù ’ÿMo[ô=]µ~ýÂÀW™úêMxûWÜLJ}~ö`îÁCwÏm­ÚîkíN#_f¬?µBÜÿëyn‡"]zêìë|±Õâo»Ú¯Q=píaû[ìÂÞ½œOlÛÉÁ~èŸvU*ã)xþyåìñgèaå°Âc ˜öTïåzÚ¹‡½ÜÙ‚=í|öÀÙâ7$;‹O»tÁ¥úט¨—½’õ»¢ïÎÀ—ùߪ==ÕÀ÷øŸ?„Ø\9ýZ¥ÑÛÁ·V¨üÇ;­xíL­×OB¯FãÚŒÂ6Ø-éiÇvËj‹«‹âÕ¸~û—½¯hä-uìQší‡Ü/Ö²özß§ŽïÍYçÕž‰X¾.÷ƒ¨—Æ,ÙbÜ÷0Ù¿FÈ_òùNYÏ”n>ßyèŸv¡å[³>@leÕ6gþÅžDß ÜwÿH£ÈÃO†Î‰öråÏD<'ÚË•?ñܾùCÍoûzîaÖõ*gç›UÏ·˜öÆ„=}$)~ðç„aŠ˜ï¾þÛ^d{n{‘í9¹m­þ¦“þMo™ò'ßrî®=ô'-oŠ|5N¥öRÈðTºÏ¤oÏ9íØ&ß¿Î)æ3)aìé]ñ_Ø7éÛ¿XZÕ<îeÓs8ìœl{5ÏÉ®ûFâG‹Ú_@z¤¨Ÿþ¦SÂ)/^Ÿã|l%r8íÛ-l×¼½èÞjm„µzØwú›²ýl”¸=§:.ºÊÓÃíÐ=|¶ ñ.µ?`«îö¦ÑUw»4fÕá´ÇÇŽ¾ ÷\»/äÒS›3.|kÕµæ¼vy¦ü³eËÉJÀv¯¢÷í¦ÇMñò—nÎöV³u¸b[_ú&?]Júï ߸èûîjÖ¶=~Ë5û@iXÒZ=’MŸêÓö {íð{y'r%;lcàãÙñ-<¯µ½–7Ÿ×¾ºÿÜýòE›ÃKæÝÜ]ÂCíŠpßügÜ»âïc?~¡î ³ûp_¸·+2kx%®ÃŸºÇäÏt~eÉzÛñëÔ÷+rRUÛflíoWñ—ÝÝóÄ“ìK<ÓùîΛûë|ß͵î«Qö Ú+R_ó¾øÏö ô»·Ë~Àãe£ý5òEÞßc{‰°Î£ÐG¯º_r ý(Ìk··ÐYDö×|>ö—²¼?ô·¤¾»–l¿ÁðÝÝÊ<üOs~^sö;Øjè?sò„­†´~²;±'? öß¹™lß`Ÿ´ï‹¾ñìkŸ«õÇo÷¹ò¿|kï²ÝØô·—Ÿÿ<Õµ=| þPKúÎ#"„þ[dàQR9ýíÉÎæ§CfòvUû–Ûñ}%®¦íws~0¨Ý,·Ï=ßôŸ¾»Øøa?K=¶»ø¡¿Rñ˜-û9×üÇÂÖ”îg‰o°3ù!çÆ7vÎÿ M>õX—ô_3¸Ñ¿æ?¿Þ™üø³x<“‹¢Ž·0Ö(î¢x7Ü^tŽÏÄKÎ\ò›‡â 5öûhOº¨±K…½ ~û·þ°Á÷ ÛŸ—øþ7àoõŸ¶9òOøË>y¿2/{ßú2ÿ´Þm!=4`ûj/à?óbô+UŸ¶ˆñý¯ÏW)¬|Šë?£øƒxŠ{|ê÷ ?$M»¥ûíð/õ¢ì~Ùg?_l ?Èüôô·×íçý¦Í~gãI²¿äkÄþø¯ýõûÛÇvCúÐßëy¥‹Î~2§ÙÒàNa±Z?wô—|yøm¾ï¾ý‰ÿÑÇ?ëLLÃöâ®Ê5Œ¥â•™xEjÂÖ£À5‘ž´û/Ôc&|S×\Ö÷Þh?€m¿©>¯ß´Ú‚íñ«ïKvþA\¦ÜŒÿ«y…Âwm)û¹÷¹nÍÝ7ÚMe»§¾o×®¶¦øj\»þ`N‡úJÜ|»÷e¯hÛ³Ûï]§“m=þ¼iéúÙÎÎn_}ü™U~·¯+¾¢}Ðþ.Ï_ûàŸ%éåðc ?ü~$ý«éc{yx/À÷#Òß› ï½'üðÇ èßüŸ»ìÕ±?oðRï ~Gÿ´r÷W“úïàÊÇþÁwtåóJžnýoÿ N··ÒÝ~ÜÝäÚïå›;þgEìüýEÕ{›öçx|Kàͺz%&ÚþàÎ`95O¥íŽºöë¶×îë:nNñ·úÏ=Ñž¼!mß®åiýñM¬þ7¿»M¬O=Û¼UQ~ˆUq%ËÿlçÍbçïâ¼™~–Âfùe–âê¯LX†Ú].¹4íôàw¡íxÍÁþNóCçþ%þi?SáêsÄòùsÿƒo3o®äIñM”æ»çÍ×È“o#±}—çŸ%±mé­Ä¾r¨íæü¶~ªå›ÿsj{Þ¬jö·ïíÇ—íÛ/,Ûßz€ê½Ëü^ìä)‡?âöÛhúØ?=gïÿ[Ž_­_4¯ï_þDÏ-E·ÒñÕ¸¹¨)?Ü‹WáŸßÙ† ÿK¯OÖ`î핈€ÿ%Üoë翆$üñYÿû€vZÝÿò¬ÿ@|y âßÏ|¿‹a¾øhÍ¾Ú ÷»~%ð»xñÕþ8Úwþ>õ‰õáo£¶Ôð¿NV½"½Ýþ²Ú÷¿·¿Raåo‘´=›ÍÁý¯'úß>ü•ÀïÿæÁ§öÕýo2Ú´?™èqÿ#‘þ÷÷?k¨ì ¸Þ¬É+ýïåß-¾ü,×Óz{ßçü ¯¤‹²§Åwðbãƒ-m´àÇñIÚÿüæã´þ‡ïˆÐ3âUxíÒÚˆÝûóÊ}òƹøÝ Ç~Žú³ÜØ?*x^²å±¨wá˜åéáØ)æ~ÒþV$ÃzàS3ÞJdîÉcxcîÂÖÝçÈ„¯òé{ã/ç¢òƒÞÿjÎÄ.,tïì?ˆ—X_íÈ[Sú!¬Lÿõ棑~äæEMyÙ·³¥>pWÿj§ÿÓ~?ÒßÿéDúÀ)9O¿jÎï'ú[/‚~o&Ø®APüj}]XO°?”Óùa>>é?çãUŽ|º°Ýê(òßüŸ¯ÔÜm?´‡Ê½þú×Á›?Úþvíø/•Û¶.õ×Üþsûò«Œñ«ÍoïÏW½ÚÁ~%.íÿ<vs­æÛNêî´o|ï°ú›o÷ùþ«ÚCyU}¯Bþ}‡/uȼ˶ýWø±Îåç`H§7þV×¹ËËýVן÷Ÿ»0±ÆïlóÎcÿ´ß™-ûMîþ×Ë/Òæëo€yâŽôˉíªwûÁÜ7:W<¶ør:/··ßþiëþ{õú•Š-r~ƒ}xÍÓŸò0õá?ó𠤋€½ØÚéý'náK×l³ÜlOÝ;ñà?Åþ@{ ö´-2öìûk”²ï;òßÝnß°Z^¥sÕcˆ.;$ ˆ¬)>´ÑɾºÌ­ý±6¹¾Uéew^]6®ƒj¯œn•ò;M=µuœR~Ú_ˆ¹ü¸ýåÅ¿ó@…ÛûÎnûØ.Ëæ¯‡ËÓ÷X½J{ùÑÒÅå+Ö§=+ù„õfïÛξ6áÿô?„8¸¦½rŽ/_ób¹â¡­bæÞ=öûUÞ¶ëë{Ÿ‡»U±ÍS·ƒ¯OÌñߦ¼ýÄé»{Ìd›þÜLìÊYYíaÈ7¹ ?”ò~æÖ 镪“íô©“§Îü«÷‡7O|ïâîwwû¸ßÝÙn„ÃP;ñl·¦ìóÛÞ ì:s{òuæúç¶W·-”Ííw×–ôÞÈÊév#~øXÝMíy}õÔGÿ{f{P}œ ãºþB€$õ²¯¼\~äâöÇaò¤WZ^‰Êºü Í ²®Mÿž†òÀÓûõÏk?ÔdrñCM¡fæ>4†ýµ²?„•}Y¯|‡°—¿ég?·ò=I­ò¿¹y8áÌù'6Jo5õë~öÉWüâ˾|þųŸ<›}ÚgŸõñù£VËù£ûþüwÏþæož}ðÉGÏ^|òÑóÿÜ?:]|ùù‹O~ÿ›/?ýÍ‹O¾¼ûæwŸ<ûÑëÏ~òߟ½öñó/ŸÝxq÷éÿv>ðµŸì ÿ“g/þKùoÏ~ú‡>ÿ»O?ÿèGïžiþ~û£ÿí‹¿xýõgÿåê—ÿEî¾þÛg¥×žòT|üâ‹]ÆÿnjמÝý)ùøù'w_Û‹ÿ÷ó»1ç÷ÿó»¯>yö»³vÿèî^ün×þìÿu>üË?Üý¿àóÝÿ÷Ï~÷£×‡=ÿø‹çÏ>yññýgG§Oÿí.¢wÿýâÿøogc÷ßg>ûàÅçË}øé'ÿþ›{þ§Ÿÿñü“/?ÿÓëæÚÙ·‡¤øÁ]ß~z7}÷“ôæÏõÞÿ<ÿÿ>ûäþã_½ñÖ;nöÙ>ù¯òúÁø³÷õß¹¿³ßyû»Ë¿®ûõ›žÿ>~Š6uç¯>ÿô?îÉ|2¼fjö„4/qiX%ÇŽszÐE‰Y½³ó£»~¼“úç÷1x0_~ðÛŸüþù—÷Œ?þâÿH®?)kOÚƒ•GSöâgê1}ï½¾&øãO?üàþ{¡|þÇOñùçüéï>¸ÿÿ?ò.ó_¬·üøÍwÞùå;¯ï‡üæÙO,ÿìÅO~t9ö«Ï>º;æG÷|?~ñãwÞüÙ¯úæ^üW'{ýõÿöì÷?:÷×B^Äâ½Ä‹Ÿ¬NwŽÃ0æì÷ƒ†ßýç·þñ½g?z÷½7Þ{óÙ‹{£wΫ{†ÝÕÒîºãÝ„¾ûÕo¿øðóŸ}y_E!¾÷ÁzñÉ9 ΩvŸ|øå‹O?¹dÁ¹ßøéOßüÕ{wU(çâ¼Ôø¿Ï_Þ·À³ºýßÿµÜé°Äúý§_~úÞO.c~÷ù§|û¾*m?z p~ñÞÏî½þã3Ãã=ÛE×;ŸþÇ?yœÃŠùGïý޽þãEâ_|õÇß>ÿü‹PÍçŽÇ‡ÃÞ»m5áÃÞþôÓûõg?ñ“Í ÂAÂÞ ^ü俯`~pw®ÙçæŽüãŸÑN’w™»cßþü½ûøüÝÿmÿ׳ÿÏeì?ÙÕŸ#üÅOÎqþñ]N¾s_ ?ñ²xíî_ïžÓt%ì_|òâË||þü'—<<ýÿÎ&½öž}úÙ]Rÿóó>zþùƒ¯}ù§Ïž?ûìÓûÐÞµ° üàóßßwO¿úüÃç?ÿà³ÏÎäŒî|üÛg?ÂW÷¼çÄüÛ}vžý×ÿþì«;)ÏîO»OýÑóï×ý„Þò«ÏŸøü£çŸ|øüW|þÅóÏÿî3ÿà7wŽ~øo÷—ûÆ_þÝ_~úù¿îG¿vÇøÕ‡_~õùóg?ÿøOÿòÁÇ_Ý÷ÌýÓ×îjõƒ³_üûþÍ¿üò­ŸÝŸÃ¾<ÿãî$wV}§çü×î¾zãÝŸ¿÷æÿõ^ønOê×ï¾þé?¿ñNüîû‹×ï|÷½wÞúÅ?];ð7ßxûÁïî}ëï½õ‹Œ_¿õÉ—o}ò»¿»›£×/#â×÷Ÿßú¯¿|':ò£½»"ªåïþãî?÷G¾÷?ÿ…’–ßýŸ?ÿ‡_>,ìÞêÏ®øég_~ñü/â÷÷ÿ:ûñ]>~òáŸ>üøƒ¯îšgs÷¿/>ºË…Ï>øòîÿ?ÿÏÏî2 óÅãàxäoïNCñ°ÃøÅÕ‘‹÷^ ÔŸ?zݾûâ/qø§›c>{ñÙó_|òüñHÙÈCÄâÁ7CÎösìŽß¤¡_\»¸?~é!Y×'÷’îÔí~ØÀøýï?þûsßcÎßß3ì'Ék!à¼íÃ/çÄ—:$k¼x/ñ?ø˜èõüÞç_=ôÕÝ7_¼øý½¡8çÏÎÞýóî,ʹºs÷ï4ò‘wãþðÁ|ñÇ+QLßÜ}ðúåóß\2ä‹ôý!±¾øãµ¯ï¾ýÝ‹çôåŸRÜuÂûk™{‚»òéGwFî¤2Yî¦Äí†Ýõégw£žÛ؇þåÇ_>ÿœ쟺†d4ñ˳Êeæƒ/îúþo?þÓùþÁZßœ‡Þu¨›ýSWdø¡Agš»K÷höO×ôìø¡AFó`£|ñÑßîÝ×CïC¯Œ¼t‡ÈŽL>æ¡!gŠ/ÿôï÷<ÿOpþÔ).c®ŽpšF\ÿìænŸžÿ_þáþƒ‡ÄúácŸ=Ô óÀ»ûÉ/,%N”cZýöó>ùð)Ñýã×Ïìã@uþè‹?µ·£ïî¶^ÜߪÝLe~uÔýµâWüâ®ö™Yp¹ºÿÇï¿úàóÉëû·WüäÓÏøæp¢½©}¿`¹¥ü‹^ܤ¸Ÿ ‡ÛË?ä¸N¦û§a«ÁŽ\'¡ý’<ó¿IC¿¸>öPµŸ~þǾ|¨Uø ¾6ö2ì¾é“îþ³UâŸü;œþäßס/>b ñSɤ—™ýôÇ.P/ŸºYà ºLÉó?þðÓ¯>É'üãÜn¨ÒU¼Õº\ÞB¿¼g~0ÙÏfù\õуWí]~üâÆá'_†k›óà|e³ß<}üâîìöìí^šÏÝõÃW÷Qü;«ßïíWœWnþ-MΟø‡ÿa³sw{þâƒOžýãó©ú95î¿î\{ñÉïnÝ2Þýç.îß5¾x -^?Ÿ >úòñ›óG烾úäî*ì“çwíâËß$æÃ]çqºÇ\¿K=Ÿ„>eåˆ QŽÙúü|¾û곟ó*ínû埾‡o–îÆËû±µ‘éjáË?í§Ì/ÊÃ‚î‹æ³Ï²Ü˕֟ŸÓâ˯>ÿä7øxˆûÇ~ú»G»sãî~ñÆäîòßú÷~Äé¥IÁºûìO>º'DÀîXWÆŸßqߦ!¸ÿ^n~ãèû3ÏGɃ]þƒŸ¿v™ç‡¾{vÿðëï¾üôßžr¸¹ûâýkèåžæƒƮȻ‹}¾ëøèoí&ìòõ•ùÏ]΃¯L=Gß}þÿÀ«ûAõË€+ßÃ#ÇË#‡_?ú®~“"ƒ ¦»;øûç˜WÎn—Ë ”×G‚»ûЇ/·xþ=¤uBþ|Ï¿ý{0ÿî¾x ÒÈ¿«¦¾¸;E>ÏO&^|ôüx{?êîlöÐ¥Çýñ|`ܽ”?þéå¯ýRâê——C?¾uèµ//—`éòË®àòQwþ­yÃàóÿüðùyª¸ ßûøñõ#ñzÚ/òî+áãÞýðÓÏ®= úäù\ûú~®î¿úè#v‹}Å÷ùïoºÐ=¦øQcwÍï©.íè/þÄg&Ç'{ç¤Mß{"ß—ãUö¿}q‰ù——2Çë—/ ¿²£ºw8˜ŽxþÉAîKwŽþöAKw_Ó]ËÿéŸlûÑ¿|ûí7ÞYšw‡Þ{ëço¾»>Ý]yãàŠì¾üìÍwÞ\:ewæ¿|o}¶»óÓ_þâ§o>Þ}zûíxçŸþ7ßìž½óNúf÷íí~ãÝN_îN¾ý«7ÞysSvO߉—ÝÓd½ìÎ&㥎X¡-õ0þðñîõ»oþü­Ÿþòí_,›ã?û?ýË÷G˜ÛüÜœþù›ï½±>ݽ}'~º;ûÓ7ß~û݃öº{ûKFÝý|÷½_¾óÆ?-sõ¤ï½õË_¬4¨»§÷Á_úìþüçKGµ„ ž×qøôŸÞyó÷Þ\©W§eäA¶úgáãÝËC6µÝÁ8$s³´}ç_þëúÔïÎýêH°ûöo½·¢Ðv×ÞZYßv¿ÞûçC‚µÝŸ7ß>ÔlÛzï_>ÜÝùÇ7ŽCûîÑ¿¾õöªºnÉùÆ[Ç¡Å&æ?{ûðñîÒÛ‡Dè––w b»ê»_ÿøë_üô.%Öç»sï¾õO¿x#1ý›õ™ù×Ç»‹ÿúÏoÆîâ»ÿüÆý:þú\¬%^hÞ:äÐØ}}çÍzëÝcþŒºR}ØÖ‡k Çîê/ß¹ë^Áðîë?¾õæ!èc>=°ì®þËÛo­4»£ïþúWo¾óî]›?¤Ó<­H¾¹èçîí¯Á/vWÿñ—ïüüCÎÝÓ75;Ùüô—?;z4»eÑ{ÿÏç{}¶;ú/‡³ÓT›‹Ÿ¾ý럎ßýå¯9¯'ûp}´{÷ö[ï½wÈM-VZK«V?c¾õÆt÷íWoýêÍ·ßúÅc÷íWï¼ù³·îšÕ!t:¬‰ýë›ï„³¦î>þúW¿â76Ÿo¾ówïçë‹•¼KÕf ç7~qwò?„|Û=~ïÿq_lÒîÎÿðöÿ\_Øùã½ôͪôW‡8lÝθw!ÿÙ›¿XÕµ ç¾Ë õ±uÔ7ß~ã¾ûö¡nê™õ¯o¼sÈéÍ:ëÛÿzwÈá²`÷öoþ˛ǫ±®ûÓÿ‰äTì’ån6ï®Q×E'¿HøÅ?¾õ>o–jñã~øøhÜ.€Þü‡_ÿÓáãiÁøùoâéGN»Û?ÿiúfóIàWvIäQLö üâ×o¿ýÖ]øYPìÔò³ûÚL_WD* ØãòÆ?Ý3ÿé8”‘ØUÔo¿õÆ»Ç,¿ŠzóÝ_þúŸÙ#ôÓ_ýúð¡úð7ßù—7þÿì½{[G²8¼ÿ2Ïó~‡‰’=9c‚$.¶yW9ÑY ,àd÷‡mŽ£c!i5†c|>ûÛUÕיË&9Lb4Ó×êêêîêêªjcέ êЬ\òP èÍj‚÷ýû›DI‚‰êü´*Í(ÁëL¦¨3¥…¯ &÷{,hhi¡‚€4f±.ç5ÐÓÂ%t´I°&ø'R8ÓÂyCAGM •cÛ´1à Ö÷•“ɇ‹ø lL*vBÔPÍ n±Ô¾Gî½@»Nªž’RBSíuØ–ÕˆÙ^JÀÁ_¡CÄkM½®ÈWè{ñú_=AD"x]½®©×Uõªª«Éê<8"XÕ·¢ê[yª^Uu+ª:65È6­¨úVT}+ªy+ªºYݳg²IÏdmÏdeÏd]Ïd˞ɊžÉzžÕU1²šg²–§²MOe%Oe%Oe%O×d1Oe-Oe-OecžÊJžÊJ6d%ªŸ6d-²– Ù” YɆ¬dCV²QSÅÈZÖe-ë²)ë²’uYɺ¬d}U³.kY—µ¬Ë¦¬ËJÖd%k²’µ YÌš¬eMÖ²&›²&+Y“•¬ÉJÖVd1«²–UY˪lʪ¬dUV²*+Ym¨bd-«²–UÙ”†¬¤!+iÈJ벘†¬¥!kQã´!+iÈJ²’º¢âº¬¥.k©Ë¦Ôe%uYI]VRWT¬æm*P#S L5.Õ°TT¬MÚ”£†½‘rÐHÂVÄ' Dv¢Ä³Ä…W)^Vª¦à©M:à¾?ùžÙúç£+Šñèj;§ãž(eEÁ°ñ¬.,Mö&qˆ:Ô¡VA<ë¿îMC6‡Ãóéd6AÙúSD—óYo3âj³7û˃‡j^T"Sõ0~௄xÔs ?rÞ'A,þ­…üwÎÅûløál^EãoÅóõ °Ôb+‡ÐÎW’:Y¦! ÄR#2x$Œýž¨·ÊÅ|q í+ÀN?QXȤ6þÎ!5„ªuƒú\\Ö®5ž±P+H ~pô®j¥¶n#{P{·ÂRÏïcK'ðž‘“ñîã¨8¦ä9õ\­•IItË»Jöu”Jß™Íff—&Ñ(Û‘×¥2]*9ôNõl½Z¯/Ø««¶^Õò_êYñ‘è[/‘'­‰)µ“ìלdŸÄ¨…ìŸÞ.Féœ~£ƒ»Àè@bt 0:(…ÑA ŒÊaôÙ­b”ëÒe£÷ô"¸\€õCü¡¯ÿFx¶.àP± 8`Ui§Y+Ö^ý ŠˆõüÔ8Œ‰õ-90—†PÇ”À›¨‹õ»ŽºB_³rÄR½D¼×(Þ¡lÀ¢'#yGÉXÒºHÁ;>Õ‘^>«bMWj†R`àºÒ—l6½ÙGLËû@fõ…ìU'¶Ÿ£ìÊ\°ÍÖJ|{:û]sà{ ð=Ðð=Hâ{Ä÷ ‰ïÁ ð=ÈÀ÷@Ç÷@Ç÷ ßïŽïA>¾+ |L|rñ­ï1Žq*êìlYv®ý‡'' cù'™e8ð‡šçŽ“³›§+6,ÈÑHô[º†ÕÍ:…U½Á~JíJ6šÐ!±©Îލéai“ª}žiØú¡ÛÞ±tûCG] ]^™ ®À£Ê:AÅÛØ_³¼öF®–jäËîO&A–.ä·•ß<€«mªikfÓàÄ–çÅW­ÅwcéVaý­»³…ÁPp~#ìXÛ°n¶A;`æè!–y‹ô‹Ñ$­‚ü–Ϻã¨m¤èPœ™fÊQ #Iýƒe|Ú¦1oªUÓ˜—¨Û¬¦.#@Í`¼]p ÍW(Ýœ³ÈdfiY[v$[w!º5—öN‹ƒ§‡ha_TÆsŸË %ôdÇjÚw±´Œ‘© ªäwC_]ô–öÌÆBjý[ö©aàŠs°ûºE†Z‚«OºÕi¼Ú»ÌºÍ¹q—舎âzgw§sŸx®[7†ÑžþÁ1mYL®gç&õlö6ÃzÝm5`h£¨H$sˆËFûþêkÇÅÐm¶Î‚ ;®­ i)^ÇòK?Òи.¡¯x“‰„¨§…2Vù%±*áÀÂD|1,&Ûh²‡Öƒe,ß‹êSl^ÊM7C¤«§C†¨TŸ—0X¢L²èl½£ Fµ}ûµqU‘J¡-…5«ôǺO‚¶c…ˆ°(‚DÙëù–õ(ÄtÎb|ñ™Ð ³âI¨$ÝÁ\hÔŽ“¡ Oeê!—*,ÚHS ³‰VÙð`'·5ëÎrÄ ¾âË> nî½¹‹Q+`éiàИ_‹ ª<¦î܉Z)ÓzXcúJ2¾8ešaVÊ:¦w@™FíH™&<€O3DâT@…EiŠa7Ñ*ì”i=ý1»[÷W‚â$×ÔB*>ù½ÀÊ')ÚºôÉÚµñf 7mõAËßªŽŸD+°²¢ ëŽJÍ ‰¹U}ê2$ëT[Í‹²iVõ bv‘yO)v-ƒd‹tIæö aÝ|åI¡<Ë" Hd–>`qJ¬`Þw˪jë†F‚\DY¯Í46žÊ脌NÀéý$êÕñ-ÂK.Ê–œ%ü¶œ ’É«v¾²‰Š[>ܰÇáeˆwþø¼T“¥¥ c€(Y%45hBQxµ*®Þ1ž †ÃFfï¤Ðäž@W­e‰ÛÌÏ4UX‰âF©@}.Y2c^qš(,*EdL©OÝx¶£9 ËÖóüÑwììËüÉ•÷]HG[ÊjÅßiG9Ç©áoF¨)Wü[ëùÌ–Ö ,"Ãwvxü%-¿±w~oNæRrC™ß%.Ì'H¬œ+€]Ù#~u9o7ˆáxËQ Çß5ùpYC1³Šî^}¶¨ dµ”M–h@¾ d#añYÜϺ1åÁЈUé…KéCß™.Ü Íä•×);Kë+M^Šßnk, n¨­bŒUë~î¶Á¿z‰ ™ÿò¦Úv×T@‚Â.¬‡o÷b³QKáÀ°•¬»¼$-') ¥zXwe—7ÆœóR3AÚj6óH,½ÙfÝaÞÖ6š0Q`õ”úÏeÊØIo؅™;é5û1˜¢†º"£ºñîŠ,â#Ìj*¢."êo»ûp (Ö©È—ÀaŠf꘴nµŒãxqðqÞMqhÙ;©,{æÊi‘vÐ^§}¨á›¶RF¬(µ„¡çÊ\JL,vSòŠy¿X•ÓVA,0­¶[·Ƶrê½f(fˆc:=¨¸ß³Ufþu`Lm”÷j ÕB3RãP$Õ6KÓ¬bæ5ëQÔ¢:>VNÝÙ#žì² ú­÷@*[\BH m6‹(•éF¹x{¶yÃzÊ•¸àÑü¬©Ž4…*‰ÀE¤:Úݽ¢Ë»•j8.(í2SßPØeæuq½¯[um¬Z¨ !é²öŠu ±nšÌûA¯!Øèà&d!:1ÁJBšÒódž|kc͉\+n³P›¥éeÇ®ÞË3…d+Ù]¶F”e7ï¬o\C¼Ä7ÂåLš'Î*ÛÑ™ƒÈºÛúìõ)¼ä²¶.1U)Uá»ÙQ%•ˆ²¥TÐb m…XøMI¦|¼@ÀÕ)ÆÁŽl¢BžûÖ­hâÖDó“³D`–­¼qÙñåb¢…¯ýE=8]¹½B˜ÐÀX3!Bx#Dë¤bXî w"HÙðF¡˜QEhfq;–0Ž $Y;ÄÊŠ®[÷å )ªéØ;êÓnÉT´£,LeVGdö—èœvÞ…2IAlj­H6غ)Z·nÉå}®â…P(¿ìÖ$¯ÞÜÀ̉@ KOÑ'¿”è4ü’y "Mžh¡Õõ—õ\Иéa”~J´iŸæ}·ö“¼©M¼8uS½Ôb`›‚ýÃmáQ…½&œ •ñÀàìáÀs®²9¸˜óÑ2Î? .ûµ»«[G¶Û¯_nµY"·î¨|Ž6·Ûo:ÁÑ~gswK¼ Ñ\Ö£w.5Ôl/GŸB‰‰¥Õ‰É[ÜÖ­r‹²—Ò¥»éè§ýxiZ„~¼$I8(äÿ W‚¯äAÙ ;3tŠ‹wéÝõ¨Uˆ2¿bS¶X«ò9E¼ þ8:O³€Å”s¼c­=^1JDðMë)Ö \鰟؉nt"óq–‡-m§gÕ‰+V­"Oâ†sñBè’_ö¥ì—vò^Ê$,= \Êä—ăQ%b âJžh¡cÖÿ-Óa&*ÿtÈZŒUK²éк釻âæb¥žç(ãÊ[çÅ‹·ižõVuOÖä ù‡ŽhÚ,Î90×ÕZ@lŠü p³™gtëúöû¸ˆë3ýÞBOû¨çšé9µwO[ORàö¶2“‰W¨“ôšúõOÙ7z»ÌDêôá£Ñ 7FO[°·ô–Z]¤©î²î×Õ¥ƒòM:Ô䟹Yì°¼ÄJô†·8SFb¢ÚE¦0¼-äiE|inV8”ÂYÝçRÕå‹Åº#ÙÜ$í|îlnÞ3üâIúÉ“oyÅ;ñ…*Y}HÐCR°÷èõV»}EQÁ÷ÔãV ƒ»x_Ó{®žL©!xO[QÞê>Ù#ôšî±b±¡4‹â_ǘUü²a&ÜòÅ•|¿Iä àÃ|¢i0oÝU/2ÑYg;íòdõêöoW¨ÿøU‹÷Ü{ZKH'IµÏÛ›U¡‹-|&žÒ“à,mO¾aÝ‘ßí²gßN%+Ý8Î!¬„s×+æ"ts/‹¬F^7Yl¡2«„â®ÙÞTï—u0ìè}ï™^ãMYÞEúÄ*‰Ïz`5Î7yÚ‡ðߨÙý7Ò%µw!úÐê&ÿ:0ˆ`=@ ‚ˆü•k) ®°F{,í·3—VYHBd„o9¶É“)*‰²•ãuŸw! á•“¢'ÔÏu=áU§wC eÈ£P7¯©—y¡ò(+!„TÕç=Q¿^¬gô–k¨´í»7¬Z wÖwÁªÜfÌr:dÿ&=²_°Kì¢B]3ÝŠ»°ɑӉdw&IŠæ˜#€¤xµ ÊŒfä ì©UF1Dã9,Fð#\à{ qÈtÃMÔw€6FOBBK#¾*{V7_ë ¢ Ž4ˆ–Yq´ø®^ÑyÅÊm…ÚòêùvœG‚:äùÛÁ§ŽS}~Ó#Û˜ŸœHZG©¼¾xAW^™bÈ^ N:05‚$Š%dX¼™ª¦“m³âÃÊì:³`˜åoŽ·ùìbq´™mH`ϲÂ>³ŸA!¡rz­ Â5¨x!9bÙxrjƒ09Ýc¯–{¨íCÏ~ôsÓ©ÎȦ:;ötäyì-2×ù³8Ƴg;»nlÙM[bR@/¶°¨#Â%ÙEŒ[9˜œ=+/†ò~ý¹³ßøXEAL»,äÚšáʰïÊš%í‘[9jv±‹‘w&ª9¦=ªË0ø×qŸÆœè½ÉÎ#fƒèí›u„ª§ÖŒÃU¹)Ô‚ÙçÙÙgʉe®\¯¨Œêܳ4LgìɦYZf¿ÎrÅ®˜ºà9½]UÇÕ#žîÒÜÂm÷@Z „.€ÚlQ(ÑÙ×’®Ø¦Xöh4Œç¾|ã“ü¼u«]ãŽ!8Z ’’ÈOÃÒƒUZ'.ëŽ=ÙXûÅÛ+öšƒêK–Søü7¢Œ4³BZ²]iÌYiÏqS£\ÐêJäióäæ-¾fq(¼¥‘Ê—½ôúGPŠeÏqÄ!¢`÷¼¼êZÓôæ[¯_±ïÀÊ á»æ-2PZŒ“Ë f -cvšJ³É؉ö‚ƒßº}›Œ `õÅ a^~)ZöRyéd9öùo¦eÆ8úLõxâ%—¯ NÃ(P¤{KÏr©wÕO"gO5úH¼«”,V½‹äé< qæhrÏV=ÃÚŠu·y“žKÈ'ÿ ½¶hŸe‹8 ôVv_mܸ¯D …„¿¬«d˜T²y:®/ê踶ò´ „’Ê4eX6„µ…!t)¶zW •¼”º—…É¿F5Ôìšk\qMZë›–«s÷‹1;Û ´6µfß›”T«´¡¦ô°,€#26KÕ}±• tùÊ£-Ky¡V³ûƒ-|.å\+o±s)â¨ÜDÓÈä¤2`eå‹k2zwÂŽº‘åĕ$ç—¸þãb˜Í¦-×?ãä_;û›í±×Rß¶Pž”°ÇÑùÉèªßÓ¨²P«[û†q|›} S[5›õfoÏ(E}ßb³d¡š•£Ykf³~éì¿lv_óBäç"ZLŽF‰2 ´)G‹¬ìžáµÇz:…ÃzÿpûøGz³ùÈêk'ˉ¨™RÐFÒ)‹bŽ ´V+ÅRñð®Ý1ÏÞOÏeOjV9«wÍÎ}þËúI¼qù‰ø,.=I–í¸á‘W  ò* ‹Ä»v½#…d°0Çf‚oBïè(ûíÛxQ„¸ÚQ|eíSòZvo/aÉÆ£çD¤‘4Öpëiõ«)¤ÙQ7Á~æÅƵºËƒûÊVþA¥z‹Ð¤ý|Öv}«~{+zéÂX¥`7VŒ}Žx;EÖí"ã[ÜI8Ñ 9g/Å:“Æ6þê¼hË‹î(êÆPZyZÁÒñsûàç…W „ÔÊ἟ss÷õÞîA÷°ˆÈ¸xÃăd¦Žo­ž'±½µ‚:M\Xy 2gk¯-¼Q¨'ؾ|å5—£LÇÙ„ã-„»„Æ© (›Æ)j¸á9uÕSCÍMoG¶¦[­¾–BjþÝ@žï«ýxÑzøî©·ü™ÈwŸ‘{‰Crkoê¬öÞô•ª,´v_¡þKb#ÿZZ}}n¤í¥•H~¿]—?G¥;ʘµî¬ƒ¬J?ºëhÃU5`Öø¦ŠŒ El¼L—Ù9>µS.µSµ5ž\v3æ+†XºX ­W×êÖ½K–ƒrÒ†0ÃòÔ! tx‰²€_ö– ;étN:g(â´àfÓHt;›yq­nÝ|õ'㘚"ߨGÕgîÑêY/îÅç>ýؘÍîaó+Ÿÿfž-M¦ýÉ ŠÆì/l<ó»Ð5Øü`Ê×Åxƒ¨¬þÚ•ëK/×÷e†H3,Y7%¤»Ïá¾sx? ãþ®¥ä=ËòÎ…tüU¿5PQO§#H¬¾ÒwæôdaþdàºZß_ZZÚÆóåè’ý‹›»;PÄ–°…æjÇáòòò×Ö ÐnöX†%t½|MøFUñªª˜%`Õz”HøÀÇò†ƒ–ôÚ]ž÷[&ê²>ãõBD`‹£1ìŸÄ- ÄW¨ÆâÒ’ûêC2˜ Æäx´‹Ž‹ ²”`íš°¹ƒ:kL§ìY\ƒ:{L'•bƒ:sL{ŵ“‘*3¨1í•ÔÉáš1€å@µY1:mãÔ©A,†™0:Æüн;Ͳ©7S¡¸ÖHØOmuö;¯xNzÏ`ÊœÓ1§`%ë…éÂ*ê]5o qÔn]莒¤@òh¶ÊªŒüY*T‚I _ (nPmima˜¬Š]E¤N78¬ÐšV\ì„+L–¸ÉÀ]¶¼©QêFëÄ<©Z¸;§¾pçX¶¹îëÒ5Ãj۲žþám‹B_^éîLã,eÌc(¢^(<˜ÒÌ>ףܽo^ª7Èr¯¹u‰¶nYµÊu@ÀÑ…öÅñ¦-¢kk`ÉæõBÆD"i½èÊa… tcÏÐæH¶ÌÖ0íW¢e“£gåºquˆg»´G‚Ûî€Q¿ú×bƒ x7fÞÊÏXS«‚¼µy¨ÄØc›Zyþñ‹ŽI›ÖÉxîù®‹–†Yª9«¦‰Rë\»j7˜§&s%q»Š¸9÷Út2´©‡såpS5œ+†ëjḡ;½û§þâàç%™ŸEcÿè»;ØlžÃï„“+rCU€ªEž¥V¾j×#6ÒE‘^Ï”=Ø;¦”m««c¼=#ØHᅦã¾Èð„ ³ïtm]Û°v-+ñn:·‘Õ¹ÖM±_–çšÚC ù½€Ê…’/Xo#µkC¢Í2"(C¼kl­H4¾`®Z;oCøWÏe}t*°lç¥Q»ˆdJ5›2òf}’-¬Yµî‰¦Ãi4Ž#_¼P—ȯ,u~ûª¸p6SX†>ûÇï–ao™îJF½«x4™÷{ãÁpÀJ÷½tXfu2¹/ß²%Eã‹ÑhÈvp_¾eKtÇ“©ÏþeBªì_:— i¹ËÐ?²ë‡”B!Ð×?²¥Ü§Çl‡êáOvI¥P:j×ð^-¿ÈÈdÕÐÉÔê& AîŒ`£¸ßCO¢ƒ>‰1e@"£.Û6z@d´Éµ¡sIáJèZé±@,(báW•Ôi$ÁaJùe˜™rFSAÑdn"¾léÕÒ3ª1„¢CK¸~ÎF.ô ¼Ø7ìW‹s@O^s­ßo­§”3 K*§H+?Ò<.--¡Ò«¥]“SEò$ªºJ'‚\^Oº³¬;B‰è*/ƒ¼Únÿ49= ù/5*mú$Ñ_\/Ž´M_îînó$Äkú€%•hhÉ·P‹ä´à¼0¼ÅÕìß/Y‡£I¿•s%ŸAB9í#…N)jµ³Äe?¯_µÚf©."$Ïßnvv6ÿ¹˜@ãÓʲåi0g^-nš˜0fûª­Š[ÉË´ ´ÖªŒ@pÕ.£*ÑM{ݽÎvwgQz95ÝzG¢‹”yŠæ«¥,ãRmð2„·&\¥úêY ,SqBÞ ÞâÖ„kVyGRÚêl·ÿy°½›£Bè>ÁK/Q·MU&z’ç‘•ô{TL ޼Wñ¿¾±pŸYwÔÎSd%àß}µ¨hßl”u¸Ï,…ãZGŸ˜­ß}Uè r­ÔÉp”Z?Å:¼>8[³nOG½>ü¡þÀ7ûñÙ^{k«»óÓMl~X;­+&J$P;jÀ‹r‹Ä¾Üó°Z›ìÛç5+/ñ 8>ÿnèÕ‚Ï^oÙéÅ ™je ù‹¼ˆÉâxÑÛã@ŒÕ>ìpvùð‡Ð‚o÷M2X)KG¿NÆ7@‰ÖFt~¿ÿF¬ùøš'ÿó,MD|ªáoökf¯Õ>ê—··eK ÏÌ?щ(´»fÇböÌ„üU{[lÒû"pÓ¨ÎÜà¡\[ñ½¾bB½ÓùE:¾¤÷{‚ÚU±jë±Lœ.z³/ßÔ*AŸ‡W)Œb¾­-Êи,”¼ÐO‚Ì—S¬)ôeÌCt´ŽîMe ·–ym]DZlY!vŠ^·rC·„e›šÄN’Õ-,9ÏF½w«¸'—¼¥‘¯WûÖ“‹b?±æß~ɶ!%}½ÛûÄ+4ÒËäïa˜8ÕtTŠ›Ëé*o·ü©®*¦,æäóþ-ãªlo•ÒFSmÑdBÆêT«¬-¼]¿‰‡ƒöÎÖâÝ/[YÊÃA¦ÄÉÀ‚.G,¸^ÎO”<¾Ð:(sCútá¾I°¦Ç¾Në7ÛÛÝWÝÎÖÍ6Y©ö•iž“)´mÖ­êIÅ÷ÞwÖö[Úƒ@Rî.|c¥ ªc³BBÑ…U 7¬œqÁ DÊïnÔmé¦Þš ;¡®nƒ6Oƒr£žÅ»û¿¶÷·ìXy¹ßÞÙüY^Óë•\Of½qÿLêí’ÈŒ =Ì>³Y7¶Kž …ÛI˜mm¤Úú²½ù·Â-/ÎÌhìI¯ÿqÑÖ&¡v4wµÌˆ„Ãä"îpj k—Û¯&/sp°×^ôѺ¤žøÆŸyû.gIß(uÒg¨A¨6dÌ– ûS´_¥}1އÆÑµwV‹þň´ˆJzºµf‡éÀ°ŽÓ«Ch=Àt<õëîþÖy_/ šÁS8L¶ÓÖLÇL3IùŽ@]:ú\Ñ8%Û5« “?l2Ë<,shd !›G£Cš±I´vþ±Ç°zÐù;È,Ea¼m(`å¿ñlAlÖ ™õ›âÒ&æ*‚˺@eôzèÕ†ÈÃ7{ÛÊúaòéJ“`´bãÞ5ƒ€jÅ÷Ä[a±Ij+^J Ô^/Sœ(F(2)Añ[´÷öÀƒEw‹þvvƒ£wáíÀQKg¿³Éfè"QJº©X?I4ضNÆöëµ ²®¯7oij él/ˆI\< p༣ò§¥Ì- Ä"Kh}aû…Ówå[-ݰĩy!kØc‡ûŒÁ«TîhÍ­ä`ÞÓQÒÓšýÞhVï1e mùÎP¥qCZ”ǰb#Íƨ×A=ÀDbûà5ùI Š¢1ÙL[+í,†ý~æ¢2²ƒ×7ž(²P™;QÆŽØ|ˆcñïŠb, zî”a1nÝúû›ÝÃÌ5A…×<ïÀËXŒyÐIÍN‰‚ùå¹ø&Q_n3CàhÂi¶Ü0ënÀ=RžCÓÊ(Ô&1ë•F­…4Ë¢Va6pMPÆ_õÑ¿HßøVãW>ÿÐÌ©J\ÈhqdÇG‰œ5;&ö•a-¹ž˜õR Ú—U«6AAø–e§nÃÍd•‹%¹ÔÆé¦ÙÌÌn¼eú(faô_wÛ9;&¹vx–ó/Œ½²Ë„ZÜÈ1½žkðémµãÇÊe³µå°óCŸÿÖBùÆ-Åçƒ Q”¨“áA”¸ïê0öeðˆ‚H1á7Á·OÿÏJ±Ø“éüxrªë¸x f«Ÿ%D·Rs7Ó'ŒsÝMƒ›mºF; ¥„®Ÿ‡ó3p*Ôõ.HCHx÷8zgߘ,¬?j¿”Wy°K8òKùðK\Š÷k÷ðç\Œ—nxÚŸ’æ[Ïô«çYœêå»Ð3Q—€?Ù\ûŠk¿ÍWz…Ò|&¼óIˆ™0$lVå[Ý{¡á¸ÐâD2ßdÝPBK´"ÑŽ×ï–¢3+¿XÏe…K™¾!½‚¨Í¥× rm6 n‘>É!\+«XòNäù¡þÞ<¯¥úÈAý¯k6§ksι¬p>Lt ÃÀ@ø „ü¡æ-c£ºnöX hÏJYñÈæk§è®•cÑ3ôºýZ\¬šÚ&=$OÀçê/pÙííb=™'63eëßJ«N6›Z‚›w[&7Ww\óʶ´ Gá¿Ô_âCï*«‚5ºÈä~ ÝMxÉ 4ýòÁ­—;äÒzÓvÄ•åJ§$ü-áû:–®¯cåùÚ ¤¢kmBe•—g©^íî¿n"—ªÛXNÈS¹ùÄcK*dvš}])¥,ZQÀXØtéWŠM´ûb,vÕùûb›£e·¨Ûe¢AB—×+v=a ¢-Xð—x|_„ßáäkãw¨:AØŠ®õ%¾3V£ñ.€­°_Sk™\ø{.¿ãF^Y~Ç2'Ƽ2.ðÍÖ ^¿ÙüŽýB[Mí˜ ?ñÍïdhÆÞåóp0?óño¶7v*qű¯^3„þø“ï±?ùÊCˆŽ!ïþ¡$µ’x% ;°£mJD¢&ѽC L1@Ψü~u—L =!¨w¡>µ,„i–š éMK“ì^Sóû²j*?b˜rÛôªÛÙÞGG¼E!ƒ»Åþ9Ý!-üB¡-|ø ÙJTö5ã>ƒZŠÞeÚIÒÎ÷¸®2NðC;'Ÿw1­ƒ8 †§»—XåÝÙ”ê~ínþì¯òÞìtÚélqÔÁâûÕ­2fâ+Ý.ûÌë¸Æî‘3ÌEgxPÏpž¾R_¤‰úVÏ ¶…¾.b½ŸjXP©Xåg&ÄöªíP—²°ƒéÅ`ÓX€žEÏÒêökƒo‹RŒ¸-'=5ˆÞì@ž,bi,B,Ösˆ" líno·÷ãGeë½ìæ«Ë-;ÛÛ¥šo@—ƒ‚RnªhÒhÏ`6ê{º¨‰AÝ~õïmzúN´Cë~u00L¨±C÷Åšf“‹ºù®ÛïÚý÷¸ùva¦°ƒïýöÎOÁ€pçÆ6WÞ¹ëöKxo“6t둲^àÌúòélrÞ%\Íßx¶©XٛϬZþ0à•…¯ yf¢€ÍÊXp£n¤Ž/ ðU¬Ýv`í-/ån+Á2ñ[÷tQ·uuãVÜ&Q‰m–}‰)$í°q+É}@¾”Lb‡è–Q®màQ6Ãf eÛ»&oÃ%¦˜Â?ñ¯£íº-Py6jØ0”/Ý@8‘Ð#¼=/A~:’yí¼µ!¢Äü¦dƒb½ ¾^/%ILè•„°Ôг O/Æt¢@¿ àoâ@‡. ióÚmDÅ "àU ˆ€¿kÒ5 qË׆Ø×ß„ÞAv1#^!mâK3Ú¥-9˜MNV¹{FP62='6¤±†øXO«‹ß(¤ÙQ7é‚”Î6ö YVÒhCPù+!R|(*!‹ª‹N = Ž3ñ©oÀD¿ó87ÚVh3[•j”]ŽÓ°òy zƒÿ²4â£L|.€/žÕ>°EÅ [¢ @•xW›‡d lc®3Á7¡·솕À‹"øÀ–_¹;³e¶(™ž›FÒXC|¬§ÕH”‡4›"ê&]3°Óh€NŽø‹Ò^˜§ZŽ>˜öæ>ûDzÁߟ?[ Ú¡xðÞß#&~º‰~&Aš‰ã`ì—ö6žb²Bë>ÀlÚªe ¼8¨ÝÊZßö~g4œG3e;*ËÙë€Ç€Fàgízž›Ý»ž†Uýâ6·»mÛëV·»s­ÎØ<[LÒ°‹Çóá/†b?Ôpx‘%ÂÇ"Ö±Îæ{Ø~¨“6ûPG¼êxèî¼â¨`1…±áß1¬’Ê»2ÎBJ1ka4¤pCáBH)i&\·ßìØ?ëÍ|ø—KI51|½íÉë‚“¾3®‡/Jpûs{¡ÅP`Ø>N¬þÉd2òá+¨0|½íÖc]¬õX8´_dëÁç´B‹µÞ°µõö«gƒ þÔBú¡Âðõ¶[uÁBP8´_”´ÓÆÖCh±ÖÛ¶·ÞÊ hù/K#Þ8w,>±HsiЈJÁ}/½gðw‰íî!úàpFÌ=— ¾ ½}J°ßï7D ¢¦<¿Âq>‚‹Ì“=CaJ£ ^!ç`ét¤ƒ¯jå@!Z n¸ØÈ<ïÍ:ßú¹}ðób§[NBqoí¸Q9üç/íýù¬¨s<ìrò”&V4X³ÏºìwèÅWç'p5Ñ ¡ßìHÙÝ»)JLÙ^€UÓÍi'âê´“(ï2Y'T­9vœ$Ä­…Œ4”y73Xà{EFÕÝa«¬Íª•E½ÿ$ެ‚ŠE<´^êJ8&1Ñ·°_’úêFqê³U©+ M²RN´ŽÞYÞBñé&·àž)AXhx9B\ÃË.ð¬¹ë¿›áõ[táæB›Åu[Âs[Â]Û lÍâ¡ Áºp"x´•¦6Q·tX'Ý0ñ¡¶’º×À»ÂžÅr|¯ý­s˜‡?Bž s¢ÅdyY¸ˆ“§sÚÀjc²Ÿvš mvIèZÚ5ðí`˜ºBØ[ˆòÒØSºf¿t6w÷ÍD]ÜúlëßZÚÛð],&È/ÇûBiôÙý%Â2‘v˜hqƒXœ;:"3½PÕ{ÏŠSá,ú÷œzô›©n˜¨d=e]Ö’§5˜yîïê»Ö¤¤u«y Åòö£ 1@R |U³Éî&L&ÃAÈ~BŠ-8¡ÍuM'fGZv#…zr>šG³óØóÅ›kHäOÉ u‚¨ååħøP£â®ÂYŠÎÎÉ鹨“vhˆŒ˜NbXÙ—˜³SSö±Ó0C»ƒÜs^B^Î1”{c(JæÛš9²VKy[õhÒg‘Ùw!g\¤L¼,Ù@r5U-×éñÅy~g³U;×—Z¼ñ’ådv§!…I4êÆe÷ðÓˆÅ~È ûQ´ ?-Ú¨^zúÍãl,€§/_Ÿ§2Ô’AÙäô›¢–G’\Ícݹ$0®ºÙN.ÖãN.u!Ls©-“èhaB‘—5óžx™õ‘2ÊÌ7"WrÕËd•[ <–©«Æç.h_5»¢×t’[™ðéÙ‰7-cèìlåï–…ƒ{ÏÅ Êôƒ¨?Š}üë`F¼í’“[¾D™*í‰züè-A ¦ã~?í·Ÿd™Ãˆ»ì/6‰ÈF)„Z»`½Ôm@œY-bž¾°Õ“ýŽÌ"ç%7¸þV5¬ØUrRÛmdb@‡-û€Ä~{%[v?øÃe¼ Ký‡ª±n•]£P¤ÖbÃÒ3¤Ž{³¨¿ÜùÇ;‰Ñt‚j…×Þx»WvûI­‹%]庮s^’åÀVw· °X›m€Ú[œØ6K]}ö’{&á‘jí“WZVsIêtåv˜-;ÄÄx4ìGlkF¿w0ÔüËIŸŸ½–¾Ð*ÝóžFóuAóuIôuƒ!%àB|dKéU±bt/»‡ÛÝMó"Š-c‚ϸ„¢‘¸ìÀh\æõ§·ý¹8ó{̲Êßd:+)±?>AN^~õi&bì›dC1Ò~Çkdœ!ŠéÞ“ähqê¿9f |6oFŒQ‘E‘±Ù¤˜…Po ËξÛïŽý-"ÞzôïÄ|ÖlPóÎÛÃîzJ¨ÝÃŒ°~ãÁº;!ðñ¯"ËšS»ê®©²v;4Y“ 0JÆEµ…P®£ÉAŽÖÍÇo ß·4ܾ7n†ïRžD#ã¤ÎãlwA®.z•aÝ~¬Ùûô›n_9­ÙSϰæevLvw¬%x_+¬ÖÆ?³;½++hp,³°ôæîÎ+  ðl{•µ„“ßrÖÐök\ïÔh^bfq£y("ÇhÞDKy£ùg #žÛð™mEå°ë¡»} §ÙÉû^ïÒxÔlšôAÃxÔlSYs´g‹™³0xØzïÈÍ1α^r, ÏR s4àZfx/bŽöl1í |ÌÝ‚9Z)ì%ÍѸk0÷I¹‰ºÍÑž¥­Eò­H¬:aïn o3W˜«KÔ% o朦£7«%,Øe“&3Ž4þr'†·´‰ºá¶ª™D'?$öˆèxð!o+ùÞxÀ±'Þî}²v8õ£Ò¦üR~v¶Ðç¸#.b,Ì=À扷ûÄ¡¬]lÌÑ%¡ô4 ʽ pw¼ÆÊ"fó9§´î“]hr ßÞ¢S¥åؾÂSø.-6ùõçÎ>L°²‚|w7ì/‹¡þÄ^â$>ÕÅÙwÛû8iöQ¾s·ª'oÔ«FYu­,e«´Ó98ìlé½®NõC™ü®Àáo Ï`&`2˜Ç·;1˜w >Y;)ERýÂ`ž¾ó€[W†Y.n1ßXIïµ F6Å;ß«]°óÙvÁ9Û–Û5ÉóË[å€}Ýüj¦Á¸ Ðl=—–œŠP&”2nØïL¾}ëÎò¹ëN;ùØ­;3¨FäºcëΛ‘R O ñÕ8õ‘qçh0Û>³a¿wú®lÑíDÜž-zyÑIööÛ%+ó$ÌÑ “G)ô†ýŽëVWúýð•«ßoããä«Ñÿ…MŦ;M^ã–Í‹%X0ˆta®Šï‰%Ðc¯5V¬Gj¢q†0C|S°,„mI‹c[²¬^¡­]V’•ˆ¼Ífޏ$³ L”9ø6«¶ào‘䥠äßKóÓ¼õ Q‰ ”üúa<(/D÷v!—UÆ¥H?O̕٠ÄÙ»Â~q8®­=Â`O+^2O'j³Y?ðy£'pדx3ÍÓ§ò*Ósª^ëbg¿ÓûVÍÓ] ¿©yúšÛEGf‹­*†ªÅÇ©¦j2–…}5Hð ì&B‚îŸ9v³+ÿr¢¯kT´°Ý™ƒIõxu1/]P¾aw–9 ¯­'‰Þ¯Ë(Çév‹^²}ôCvgN£ˆÝ™Y¢šXT ìÎ’Sl.N)Ï_K¢vjÎ(Ù¸µî±’ˆâ€hVg¢ auƾu«3mâ-·K*ƒR£Êêlûr¬ÎlŸ›ï°…©PC ¬ÁâáìĤé Þ‰>í<¡ý®î©¼Lê˜n]ÊUx/g×\¼ÿ2Œš§Ž+©ðôŒ«ÁŽÒ-50'!Ï[K­û…1…þâ ¯¥’ÝrßÃåY[Å:šÑ6íulÊC”Ú¥3†p HçV½\v5ÛbjžO¹I)­x®o2Qlß#Ü6c;¥s8ÓL†tuA†Ô~k9’~øÚ'›lW´_lþñŠ (c ’ 8}±‰@9Q„›†V­Ó‘;2…§‹B”[¥|åÙ5CŸ¿„òlÃ~Ëøe“ø—æH©Jï‹pfKLÁ()ÏRÙR6jÌ”nåY³í.Xíw_î˜=ª‰jUQB®ÓŒaš»s7D#nyÈJæ$gÀoß„Û/;7iã8MYjõ¥×•Ìã‰É›-*TL*ÑG&)f¢ÜA:¾­Lúo ß™²ÖûÆwífø.ë[lЇû†o±ð´7Š#›bðú¢ ºËÃN¡ü—\@á›ò0†Ÿ‹yö¹<ŒMùᕨ¢ªT OOÓ ½U&ì&èŽÞryº£‰£ØE=ŒÙ,O4TáCC‡éa ¦gN .¤¬§‘bÞ’´BàÖî!ûßÅå'šç9ðVv7èDVY\Íg‹ Êh´Uö ÚÓcê8IŒÙ.ÙÜ´·€K¶|z$.2PpßÖDdè[ï Ójöøµ_ó~›Rmާl±¶—’肦MÕw3dºë»_X°m¿ÂÝ¡>ha*GJ6¬•µñ(„-‹2U &0›§ÕëB¬‹C5°[˜ÿ£b—v«žïÑÖ€CsV~ýö]L÷Ð+õŸåL‘¯‰q‹ ¹q·…ýMHÛ­ìì–í%7‡pg½´ÐØQÚÍé>½ãáäòPÒï\2žûð'óB«½ÙÀÇ¿zº´ºå;Æ<Ÿä·éæ[FjKJÍ€dô¦{¤l€;*@ú¢‚—‚ÎëPM¬bù!”êm™Nìj¬¿u¨ëä N6 íL°™EîF0Êì?ÖV‘»:ÿØììv½šfÝ‚.|;‚ƒ$t™~`ÒcR!Љ@‹tË¢ŽÇ«7öq¬Ù}Ãr¶à\žhj/,žÙqruuŸ+f÷ª#̺ãàSýÔ„k9ÃÏÜBáÏ&1àuJ_yš«[¥gooy]΃váÌŒs«h A/[×dµÔù”œÚ tËjmánYÄ †œ÷òÍèóyÓL"…„|­gOk.öÔeÞ¬áѺǒkœ/ßXêŸô©€âg}^º+«¥@ %Rã·´z%¢¾­©DáÑ·uõ•ÁÇæÉÖ%gõ_ÓXµêaiMS¯Dkžw:fï/ iÙÓ­!>‘!6rÄ‚ŸIq½F_é]GAÚg?\¬çâÌ®[³ïcÑ­›O? x¢>OÒÇB.봅ʰ’¡ú`B§Âq" Wíº™ùU@NÙφ)úq‚m_{×ìWì0Ȇ‚™ŽçŽ•|?-hû`,ßš …P2äøêÈèîþÒÞgYh1dhð mxÐÐà8'ûÔ›ùøE‘ð+Nx_ÈøÁNX 7„¢iY€7MÅ”šÁ©Á²ÖÝb±ÛÖîöv{ÿ†”à¹mv¶·œB7lÙ·µÕâ¼ÅñM½üéd@îÃXˆý®@³Aeý˜¬YÕà˜Ÿë%6Û–†—³OwÑ¿ƒ·u³µ7D‹Å]÷.ó+Rƒ`¿7píâØÍŒÂqbUÔàÉ6á_²“@,`æÀUóÒ¹Š½yº¨ÛÑÞÛ“|Gx„…¼só&rµ–¹Ø ÃV.º†]ôãºJ8™+a®ëÀ»èƒ´½@SŠÀc߯ÛÅŒÌç8+ÌÕÅ­Öy¡PË¢±Ýæ(ØãcFÛõ‰‹VçpÓªK0PK ž¬öî´{õ™öæg>þ…†ã//ßÙõ¹ïQuÐ~,€o Ì¢O AÁ¸*êËÒkAœ8šaÇ‹•ÅãÄP ²Ë!›—I>e÷ „ËE’@$­ˆÀ:Ÿt5K%–ÉÇ9õÖêNòÉrf¿s\5ú85Xhr\dy™9dYj¦F¡ 6Ÿ´¶ñGd1ŒêÄ—3$í!lG…§¡tÇw¯ÅxlÑ]YíŒ`»¡v§<ˆ\NƒÀ]ÛÂFÂ3“”ÏdÑšë‚qƒÝÅ7;v¼ôÞþ¶±cßÃ+ÙÁ Ó&¿ÙD†·,Êl>¬4¤ÙyÁ{'¦EIéÕ›Ø=¹5AŸ.BOvçÅ”AÈL¿Ðjþ&ìNùç6^‰¯¨ˆƒŽôÁßMû ´‚È0 7·ï—;wïô¾KàÞÄ{¶]¼î­¥hû]ÚI¢Ô1<—Hi‡ᥡ§\æ¨×~;6z á™=á›2CÄÏÅÌy›R¦Ñ¢Z%ÓEp†mŠç\™ rpyZ9VÌIù>ô2"OÑ`ËJõ T(D˜u 4r¡!i‹iØN.ãÔU'šmHçÀ_YO#X³ ÍÓ°¶™5›yÔ–æz€¢Q-ÔI¡Ï ^ɦÙZf—•Ù/¤6Ú¥pý#(OÈÙ#žî²Sê­÷@*[œÈGç•F€2…S¡Í¦žäº1[È~qöt6ÏAtìË7î÷D~òÞ³Î;œ«{k=%ÖŽÃGÃ^<ðÅK¦‚ûÉp~0üŸÈ÷ø‹SQ)æ3xû“ ÐÎoî—ÁU;}uÍ-ñ:½•ZèIÚ'„}”Z54áe›Q^~iéJYjTH+Þu÷]²«bÕ[¸?ZbI= ±üÐÒH’§4’ÌÐ1üRªùpJÈú2´óãaÿã¸wµ Ï¼¥¥%ßøãˆêxCBlxK¢ S¤ÚÅ–™fÑ€-<‹2³Ê8MÎ[³èÔ_ çþ‚iÉ& XJZâå«S×üÙª•GKM;—Qj«š¬©'No;5Ó§_™}îÓ„‚Nû§Ÿö;?µ_n ¥ -`‘ÙdK°!èé$¿ù°8¦Ö´vMò02Ű)0=õž9jŠé˯v_-¦’&¦«ZšCA‘Oª 0I¨Và4¡>Õ†„D›>æd»òYŸ–2ì5šM"·{©Úâ>ÿžÚí{eg¥kBõ´ðY£Zlë u¡gU2%ƒ^·‚é3cxØ µ7¹”1oü [Šg O<ö»»Ë»¸ùÒ?Ž ©4§ßÞÝ„aßk<ÿÌ®f’ã Ã~ÅwyäMuçÉ®yÎàÂê*™öJûL.…Q,ë]ôu#&ËA¢Çß„„˜."!¦¬±ÝQ¯„w¼ ÞñwM8J!n •C«Ã߄޾ÍfÝÙàEÂߘøÊõÞ’‡Ù²Þ9$@ÙÈôœØ4’Æâc=­îzŒBšMu“.H_ÞK«Õe“ÝÝßòáCþP‰øºˆ"Úç‰ÝØ Ä%2ðE"¾œ"&cE±CiÖ›.+’ý«…øW¨%.´°íK:TÁÚ ¥VÁO3¼èv#®–>5ΕmàÙÛi=…¹M†å›L³¸(ØKq/ŒËÓÆBŒË³R,dì`ų±,&,¥X+ëȺ«»óʧ¢3x‘} ‹Øn±æ ǧV¼J":(ú‚¿ê”Ǿ=²š >ÌŽ)Þzð°ßioûð‡a¸Z?¼.2½Ì¢žU&âô‚%CÛñE³Dho;ÛmœJÙ¡´uþªœ’‹mà…¸¦½¨¯ÜÕ+XÄhª½Ýmtw~ZÐlŠ·îVÝ™hH˜©·µºâ‰Ï è‡ðÁß-¶ ú8x}\Þ|^c¦¥ Í*Öžqé‡dÒ3)¹CáÚvûõË­6ð¶GÜ ÃѯÝí-tÉ…[‰bW´lwYÁÁá>Ãàh8çU«ïܲ-ãd'‰ oÖ)aÕrÓr¾¥—¶cñ\ñ¥ºÅr™Ù-YÛˆ ã÷ll倭®”Jy®á}Û.ÙXx2±òO<×ñhÏ}ýƒ,AÖ¹¦€·-çégªáZ×£n€¢I»)@v«ê–yhÔ›`i°U ¹j¿µ•gÅÔdb(>9Ý4PâF™v,@§ÆâCmyˆ{“hÞÇe¶Ál‚cX5i¥6ë†1jÏ„³ì+èµo9Úm6‹q~ c+Ó›+j’=âÙw)9'‡“pØyœ°ª^°-ýG:ý¦*[âžµz€p=c©™÷$MÊ<­ÚojGÃ~äã_PÀ_¾xãû"jx˜Ó:ùzT°3X:r3ø¦iEÀ·[¼/ݯöûQ9°ôÃÙ=zÏ5Üt㮬µcN„é²<{O6C&Óuà»Ù¤àÑkqݧá7Ë-G]¸åÈW^·É$JÏ#Ú,ƒuŒ·*› ¢Àº>k!„81eˆa ÙD†ÚتýÖÖÛÃhº—j¦S3£™™´`æv·ü.»B8×ݲ2,y2X»!++D$9d?ª•]§ØÐg¤À²·Í*$=øçë—»Û>ý°6ò*,$ϱ¶ÕãÕ±ó²¡ÑüUmñ»PÛÝàÚq8ÿõŽƒŽEŠ/3šéLo/™ÃÆÑÜjFjÀŸ€•´ß z[åà¢ý–,Ê¿˜EùjÍÊ'3 NÀíú ù¥?S;¼."is4Êó¸ƒúá¡þÄp$R¨±ví ~jäa÷uGØuÓ{ÆÎȹ‘D„iäøØJˆ¿ìªØuâ2¢]AÁ;»Îá“)¶HB<žØ³­Z+¼Æ¥–ÀR³ ®ÿÒûm`ù›|ˆ]ۡΔwÞt¤;­¤±îYíÃ3ÌÃí7÷fzûÅ”`ݧl0¾ˆñc±•ÉeÎkÄÖcñ4Ûá«6áEìU¢ù.ˆíh°ëÈ‚)0·WÖl{æñÅ'?ÞHûíœgârÎ3¡…`µŸ|2?ø™†ñÉ»-ÐÛQaåUÔí$Ç©›£îîòk«‘w†®Œë–Ú%^³Ñ“!h²Ÿì›§Ví—I–Ç–ƒÔn gÂ.ÞB^ù˜cxCäY1Ôiàç!ÏÊO¡@ÿ2dÐ/_ñ}1+Tpqh›x¨6Öt*Oo²ùàŽðºý“ f;¬|W‘£µÅýRjè(ê°»sȰå Á@î“2{²Jýè@ɧØÑ ßkÐÇ" ?³uó*a{Dåãöˆ^Õö¿S®1çºa¶ï.êViÛæÏŒ<áÃþðíÊÏÆH(¾õÏì ÄK†¶ã‹òGù³›üŸšž·­PZ;ß~]ä+PÆõñ/k4ýRyô¾Èp2™ØŽå¨@°ö¡7ÙÜÌëDŸJS.í-¶2–‡³‹È‡?0áÁŸ;àu‘Nv´ËÅ!z‘n)2®5›j‡-ÕP¬uÖ‚ÿóÑUý:ùÃÆ3âÝ<æÓ„M5È¿ìv·0"ºœÏz}hƒ¿GæcM#`Ö?Σþübù—})j„vF—ýhŠÕíÁÍ Ýñ<š{#o‰5Œ 2Âá €*«% Àà9¢‚Ò'£qì7ý×[ÛLJ»ëì0äQð«TÙÏ c$0åÆJáQØ.; C”h”+»ð8ÜÙ=,Wrᑸ¹»³Ù.Yxáá¸.ÿÖ)Y~áA¹¿¿Pù…‡å6ðÐ UQx|’KÕr…¤û ^x”.Ô·õÂu¡®­_4Ñÿt¹Â ×ý /TÙìØ)‡öÂ#õÍÎ"Ŧ¯v÷_·KrŠ…Gi»dÁ…Çhggsw«ì8Ú(8è¼~¹ýÏrÅ?c9,7©?+¾+Ý+9<+@ºÏ'xìžE³Èï±?>žÎ˜Eƒ‹~äG³Ùdû«žfÕŽç>ìgoo™ýÕ¢öfQŸEÁOÄÕˆ |o2Æ”ÑC;¯)Kq0ïõ?Æ-îÍ9zç7SÙ–§2à8†Ä>ú±ƒô8Œ£Ï}V²*Íoi%ûÍ–ÿŠj6µ¯ ˜ŒéÐ÷i¿GzrrÊ}¢ž5›s´K3+š?× aßg e¸°O‡—ZT0 ÞÁôöwþµ-~8h6‡ƒ¸*`ñµº h@Ó2ÜÄz,P0²|!F‘LbZ}.²Û+‰«UŒW`ÎòàœÝ ûiHSÕ¨´›$[b™Ž¾)ˆ$=Ò´U!Á›Öc ô¿·<.ç ¼ý‚V°ˆ%ˆR ÐË!%˜ÆPD¬%a¿ýɸߛ罩¯•(k}¹»» Eœ°\Ü%/CÞ·3›ÁxÇþþyü%f_pY@ȾD:wV–jŸÈ2Ÿ0Bo!3˜ô N­Dñp‹f«½·Ç ñÂÆ^l ŸIÇÂÃA‹­ö` ú‚m tÃ×IˆÃ^Æ©æ“4ën1܆þÇáxЪ°rfQ'ãÊW\kÝàÎÑ:ß+RHÊZ 4€kF S ¡ÍÝömÀÈïþ¨r¸®eV‘˜_ÏR5‹—†¤3J'Ta9ÀdÕ¯¼G«½¯ˆ×:£Íi­ê Ç|Ò*Ô9T•Þ9py‰¥s°ýà˜9Ù Ó°Š»[”Ôj M¡‘¼ „-ìì"‘{„š)„M13²jª;_]Œ‹õètFžÁOÃ)N§„Co²X*t€ à 9=^§‹‹ ÉÛ:{}TÅ;…Œ…ÏT¯ÊŇdž#¢´ïôÜÁãLª $e¬-3¤ŒªO¯œ2W%ð£É爷ïhŠóæT‚IqC4©D§2;R MN¼A985a €·wªF6°ÑòËC¹ª4N ƒÕ¶(™&£ç€ðsi>IÚH.Ž üklÜúÉàüIŠ k6Ã÷f.Î/™1lÄK"ÁWq [$ltç{48Ä—ê^—÷kJÛÝâÓ®ú²ç@vrêÑÀ;ïÍ>Ò­­³þk€>Bô @>äjûº½ÿ7ˆ &³~ÄOY›àNœ"B åŸÁýQUV+›H+ˆ«ôD_¢tšë)/{|Z‰ÆçŒ0`˜á-8àÄæ^è—´tÑœþþ²š¢_N`jäžô¾šÓmì ÞtVâ5 iPNc€4ÊË÷êΡô%œŒŸH 3²!ÓXü/ÉËEŠ%`¶ö5pUIЂž8.}dƒ>ŠuØuG.ñ~/À#ôŒ¥½ˆ#ðýÄ`þpÑ›Þ/ÇஃmÕÆÇó+ö-["¼„sŠlKÊl8=ípƒ'a$$¶€#›…¾NðF²k1,˜}‚Jß—C0ó;)LÐ)Z.þqô/œ‚ŽïXdÿEØ †¥û ówþE9†ƒù•Ær\Œ‡àéI°Š1€ŽÞa)šÉú^<ïÏöþ|õ¸Î)|2§ ´G CŒM…RYwh›é½=Ì~FÚ‡Ç{ûÃòŸîÎag?£Õûl"û3[S–šéB Øáùt2›‡jMB×*›à•º¬é›ÓeŒ_@Ò}×Lú˜_Ñá?yá«,„ (’»]Éû)WþŽ6û<1C•q2”äý.^b¸óþÌæ©ó%ÙÊ5z>¹ænJ®Á§È58¹&o×ʵƵ·D¿àµ"ÈÇÄ5wqή}îiá½"\ ,³r7p­¹¸6Íø¯e‡qÓûka&íëùµìdÍ}-̺¯5l­4nØ|-Mœ¯¹9ò57f ;ßk°É½–ö³×š­ë5Ù¥Bb4"½æŸ×¦q¦ªx ±À¯ÁPñ ¯¹àµ0Ö»Fúk2‚cåw‡h]vM–`×dµuÍ-¬®Éêš[.©¹µÑ5Z]kV<×ÒâæZ³ŽÁw™ŠE 0ç¸6L/®•™Ä5™4\sóƒke*  !õþk¡ŠMjó׆ŠûµPG¿Vªã¬~¡ç} :Ù×JúZé:c“ PN»¤ï{Mº¹ðƒ„GJ¯×¨ z-”I¯•âçµ®¤©ÑŒT¬¼Ö” ¯•Ââ5)^kŠ€×\iO•"í®Q)îšØ®5e³k¡v­)q]ûˆR,ºêQ×\•éZÓ:Z”B×B™çšëÝ\ ™k®Í¢C&P®•®Èµ¦ÖqÒÀ¸N)K°ÚMņ딵®.p­NöYVy æ×ÆÙö5?†¾–'Æ×êpð£Nba¼lÁ*ÊgR ^:4ÂèÔÐÂÃ=òëd6hÔéE(ŽâX0x‘¿Æ/8,cÝñ¼;>]æáx®eVK‡OFž±t-ǾÅ)Ž‘¨³ûŠ-Qã 8Þ:÷ /^,œÍ!)_É¡"øF ?ô'ȗЋíq`ýÉt~Ì"Øÿ°0i”Ûhì@—"p EkŸä¨¿#^:wÞj„͵‚ñ«n~¦ ™£#NJƒÍ}lÔ«Ô W籞Â’¥@ 0¶à¤ÛG$çeãàÊx>rd•’w…î%%M×EÈހʢ̀T’8Æh½¬û!Â@ô؈¡ <#ïù•-p`K—ŒÙ(`4/Âá3JFÄ*Fá>ñ+M=>Ä(€ïºÀÝû9OŒ›NµÔZ¤†w£0ðT7H„!Ë-&´=æãŠbƒ‘ƒ®‡Î¢C¯f8ŒU­N-†}Æ"X9®YCëÖÐè_ŽàtòQï¢V ÜŸ>F¹@*>;š7ð±ê!س@øÁï8Â^ê" ݇Zj[& Ã>L„ÁæI|ëù‘©Ðz*t2³‡÷Æ{Çq!¡`Ãì³*æ?ôU©%³¥âɨS¾¡„¿Šjd¶ñ4ÓõŒ„ ÏÆ÷üŠZÅ>õFQ„‰'Ä@ T¶wMä ,[bQ®(kUÃøa ÆlÃÏ7ñ¥-Y¸z's}1¦lCˆù©ŽáÛDJ WŸÙ>—zÑ×S>ÔÇóD(/0Ì&Ù ׯÜìò‡= õQùj<ÄßÄBÁ³š… C¢1&Dk,@ÑcBfT¹xÅÒðBÞÇ‚KâQ¿Š­gõ)¢>‘ØÄM­©ÉP]©MÁZö8Yœ¬2õ'ª;´RÅÕâ´ÖÉ%U^#®…+†`0½È ƒÏé?!VÙL«Lª°Éì¼70h_fdœˆåù%u zóÌo2­™:•XK¼£,Q|¤J“z"¾ÚÅѸ?ð=ïë¨CËÊ6êÍY–+KÌt8eKÿ8²D'¸¸œŽzDÓø’ 0ÖdÌu1 Yw Œ¤ƒhÔ»ŠG“¹¥×gÓûaÍ &"nG”„ÃjÖ3~ž0¡>žzqŸŒ0£z¥J\}ììßÏÃùD’p33©N6 /èù '3&VQé’!ž˜ -µXÆßT`¬…<¸Ì‚Ë…–OFÆÉØ$H,¥iãdSyP¬GK>õF"«xÕ‚c=\ñ¼QЫõ+~ã<Yˆ…âþňW-8ÖÃ2eÃ,ÒÛPðÆ:ÛÈã3¦³ÏZ\œŠÄIK®ð:«@ìWo÷ù1­0Ö8ŸgŒç£¹Ü°•7¾8á <@úä…xSÑqV¼Ø«@ô>Ñö[ä>]7QÊMä5.UËšÉáÊ«q] ØüÃØ|и4{2œ ÿG[FeÌ,"I³$/}ÛŸ^¨y™ÞS‘zœ\Z£X[þeQ—±lªé‰x}Z–ðè÷¬‡&SiƒP„k#Z2ºð—GëÈuäÍ̪/_WýQDŒ7¾¦×7L¯¢õeL1ê[çU`"V<v ÄŠ#‹5ß^²ùh(FçyþÍN&q2(NÑÞŸ§¼qÕûsÄVY’PÁ ±Yó¯î+T£˜šÄÑ\ÓW;p  ¤ò(9íò·Îß½?ãÁ³o”ÝñxÊ ráÃË<ö)Åæ(Ž~\ÕBÛû¢œ-PÑ  € ?ÿÙótq[s YÊ¥%<³Y üm.--ùþhÓy×KKtn† 1\L©¹8Ò‹Ä\ZÂc–zi6yËÄû2-˜Gá‹ÇA8‚Ò”Êú¦º‰¨Œòq± $«‘ t"f9PËÑpÁ¼FÔ* Z…n}U«aÐ*!V Rê"*/X¤øàW@°¢°±MIJž¬E DQ½¨Yhšçel0uþ.KhïW@"Bá ¤NE”ó³~æÀ0Boƒ„‰¢1%NPäR"‹ÁprÂú jú[wg ã ŒÈE§$’h1˜ÒàD”ñCóééª>Ñ:‡3° àØÓ÷+ •€’n hÃ=ÌZªjÕUffQ¨¼“*FœÕ›BÊË£0³ýW_;ï¥Þ’ç|rÈ0ÚXòðìj»hÁ˜GFa&:…+9ñ SÀ­A,Jž†˜ë Â1­‡ÙàäD2û¢Zy&‘G]抈pÌaÄ>ø¹‹±¢<”ð¡Å°Acdžáp€³ Þ*ÆÊc­†Cb³yK¨œh–'Ào.ñ7,ˆ¿Si‚Á"Eò¥€¿5› ¢°& X! \y¢¬˜ q² ³"C%dûçç ÕƳ¶øoJ3M=ç½Ën_°´@ô²ô–|ûÊ âÅ4E&µ^ð š'X è»Ùä¢~Ä+Ë-^©ɸÑQµÌ²ˆW…v½L†&¸;y°„7§sÚ„Ï~x4—ôOì$=€ 1>è.“ —ý»ÙL¢Q¡ªO0E©^„¦ô›ßò¿­p ™Í¡ûÙDÁ-©¼‡—áj,ðRM––. ”täðÀ€&…³"@O'™Kk,O˜l¯¯ðK„ád*P1HÂc†)TK¬$êÇ!¼#[ôäh\³ºÕÿzóPÎ3< [7<þªóCľé¥*5yuxÓÒs2æy)+åF M$Ô%d=¶(§_Qj£ÐG°»/TT-ÄŸzUKNš-0 ÄýÎ^§}¨eÁ+»ùÊAJ*”M\ì€_ 4}’l.i_ØNí›Z«ï`°³ïR }6›‰ùW[Jl Ž3× ‡‰Y˜c”ðõ¤Ì 1ËM4Õ—8ÕGˆ™ÆG8è #HbW 3^ 0£€+Î î´¹$u¨LQmBT‡ˆ¤È®ÉC39Ñ–*“$²½ e%m)ê Ø¦!”´TXø^•<›âêU¼­6²XN,OZ„l·_¿Üj³ôYŠ~ü9â*GûÍÝ},AÔý­CBÀê;×¢›£×Ì@£kÙ@i”X|ÙX~ôH-Ël¥ mV:‹c•hÛ7¿Â”ÝŸˆue1 J[ö¶?ì “ˆ•Æ(n SZËãdÄ…¶ µ@HËB«8åmCw¢»c|¦ SR*ºjuÁ E5Úc)½,GF‹]Ö' ™ÎR ׆)VnR(Gf¡„O.aT% d±Â(Žg•šv¼Y"Ÿ·eŠz0i1Ñ4Qøò¢7ÊÞ&•ÇŠ©"•X˜[Wµ*Ó}Â#óú—k%Ú"¥¾Ã÷i  ÇO_qH)sOŠ !¶úœtæ-\¶o)m–Sܾ½<®¯G¥M'y ”J\ÊŠZŽ\/*€Ž:Àr‰':þÍI•cJ¥K—P) d f1cuó¾ç3¾AfA´›ZJÀå$«5¾›Íìzq)f$$aEfB˜нçî+˜Ó‰¸º½LÇH‘¨%íü]$ÆyŠä›KÚtâ4õ%ʤñü'óö¾>]°80 ó¨GXúî #xÄ|¢äNÀ0t6·!…ªw6éñŠ#îQµ¬.}Bc%~éÄxÅh /yåS‹~¾’ÈAWvæµ|paj*›Çh.Ñ 4ŽÞÔpô¤ÀŠh"Bd!M¾d‘ë/èWÆÆÀ{bÃ!š¥ bê°Pu/Ï!§•DF=“>õxú´ÂÚ ¾‹×¾ù^SsÃFiÙYËÔW³iNXzEMj¦T}[Âe™ãd ¬Ž'¡¹9•È“ïM…Nf ¢a/5jwý]Uªl #ˆe±ºdsIê=JµF®ó(¤Ô±Ì“Ì‘H¯ð"Es)H;4¨z"‹N»+€ÚØŒÉ(†ý`O]ó¢Kè¡7àwœW=¦O99ftŒP ‰ >ßzž.0m.Iíq`ø+"UÉ—ùJ ×+_ Äeæ W:Ù4DaÆ ä’ˆ&ǃâæCâäï\,ÄÏEÒ¥€¿5›"HÔä²(Öˆî!Ys¹=ÇLOzuŽAhÜ#Û«ïít;‹R#9–šÆÜ3•6¹‘\=ÁHòIÍ3«b!8 £gå< 2í½=( Bk™öB©ß©8GiFSà Fߺ5—ôOì=€Ÿ(éŠ80cE,›ÁfÓˆLÔ×\’¬<žØêâ8ŸŸ¾³á­D×nAmóÅy=ùqIYC¶Ù°]²¿1L£`¶Ž"S–°…Ëêq¸¼¼üµõ–@Ý–Ë/¤¦KÄ °Ž=J$¶²X™S³Z¢uáy¿e¶.{[†@Ö  -Ž‹°·$_¡~;,-a¿”Â¥ÜéϯÀ]’|ôµÈH_óP`Íû¢¹DøƒÉ_Hȱºˆ7ÎÃjßž8¡gîb¬FÛ…v¢"¬V`"É—ÄÑ>#Î yr"–”ñ vfWaUtCË«åoX-§j…á T+’/‰“èfSIËšKü°]˜U³"ioã°…Ãu ]ÆM›¼G–«hÔÁm'uŽ †¥ »sÁ€ó%<Ÿò˜îÎ+ÉÂ(^[~qå…x¾òb<˜DB,øn€8ø¦°Ò¬%:eßfš^! ¾aÒ£Y‡·ÅÑ©0©T²å:IE¥$±®KU!Ö`SГ8kÚ9œãh©’ŠîîzjÅ(~‚Mn ]:ˆ‘:xlp_J5AäSþ©À“)[«'`ØB i\¼ ¯€—¹¤Ø¹£ÄšÆ ñÕªÆiÅÉ#&êq“:ÛYOÈÇt¹ôÞÁ!or¬0ŽŒLQšüÒC?Qƒ*>Åœù¤NÜ+ˆYÒ×á”Ôn{w€c³9t Es•¾«°'SŽ˜@×òÉ3yF•æìØÈƒ‰VŽ.L®¼V D…\ª`“‘É~Ñ<ê·8Å Ö©³JeÎ`ÅüvûH¶©d2[[¬s_-/ eæûâ¨qê`¯õjv)„Òt7Iu„™HWnzñH‹E@#0.›]P†ñŠ2*Éf¤åû>-*u–®‡ü«ôtÚÓ!žÎ Ç¥â|®ówViUhª†‚|¸¿âKª‚Œ=¶»›¸ YQ…bWé€E‘sÃÜ>R¾W/m"Áá5‚‡¦Cb‚4¶E<ô9Ohºå/MÉoOpG¬òp¾^À³ƒ(/†—Ó¢)‡Á=›¶ÑzÍB-rØó¢Þ¸ìáÃ}Ôð¸€þÕ—i<Èì‹„¨Ùm÷KžÆwž X*#½rEî8‡ôŠ^©ÅMÿäÚFB¥«û Ú."kCõ0‡×h"(³ï¾ò%K 1zöPª£*ÙŽLÉ“P4•ªÃ¤d4†ˆ²Pú ‹Q"Y.Roâ;_­ùÆ}€ýű-!—Œ‘ÆIÀiOƒ¼©2- yÂ@Ò¡,O™ÿQ6Åì€.΢Äzsl5'üÔ2$‹ªñ’êM{zß‘^7à‹hЮmj¬ð’æ!‚4fK1ÓÈM“›ÅMã”6ŽÛ Klc39wYŸ)f<ô³#>âø ô·êàøÌ<œáCÀ½y¬×O¾LfW¤3XTá_H&¥òx°žRz’I™CZ‘b£!R&!ÖT¤G–ä½qxcàE$ÖwoùEuÓ°`±;ƒÃΖ^®š9Bĵ†íjêK‚‹†BDœ›£5ºî®9Z¿<·­Ð}n ¦)Kcó¸ÆB~ﯻYcK°vôÔ8~ˆ­3±äí¿?Üऔ`ø±Ÿ)øúà ¤°âCÌúj|Á°Ò‘£æ‰fSÎAž˜a´J„,+)T äéÕ¨é ×äw±Pãê÷¥y^‰¤b<ò!ÇKä˜{˜ãq}þU¦ðDÖ)µÑqoJ¡Éb¶õébÁ¸±Wq8 Ü;¿-.Y8Áã`³8†EÙKI'1óWq[÷VqFÍ­UNU¨Á '>„yüm*htÂz—„˜ž_“^R½Y<½X?8p!×Å¢]ÄÐFƒ–y‘ºÉ#ÅN Låä5sÁµ–PWéDu¼¶fÓÿ¶&CÿÛºŸ„B*½ÂbAVYbTÀ!60Ø#¤°¢ñ‚õ˜Ä%¡Ž3ËÔæòNé%‹ «OðéŒ_€ äRLAº$OžõÉ2HÙýor¿–̯P”’3}H¬¬Îè$wž8ÁU&pr¡mÍ¥ú–8‰®/"6Œž4e¤²€ÕÌ5»E¹—fŠJ`/¥÷M1I‡¤Êç#"Bß¼ÞlÓçQdÆ2†âì{‰¤wO—[ý®›p=¸É!E{©ÕEÑÙŠ¼öµKv^8ý™ˆû'²æäÊPÜ,áWÞgOÞæ¥ÂzUÜí 5FA_­>w•TççW•Rذ Ã!0”¹Mý'i]¨©@‰j­cÀ.Ì÷S#BDi'U¬86çÉÏðˆÍzòK„iƒEsgæÔ3ÂLZ7¾zØÎ¹TUÇ«1æB½[Êà1bwçOcä¢<[çÇ4t–nJñ—è°r ܇ x熹—ÒN?; ð¸j"€U '~ÛÄZ†ÝÒãùÉÇ«ji{oO65<ÂØw‰íœÜh Þ‰\Y 8ÖÏ…Áø¤ªS,,à P\ *'ÃyLI@ × ûY Øð"­{¸º4™¨Nê¬%%g›¹º³è†UqͤW^¨¼µ‹;bkXX]¦¢E~ŸÖb|ÇšQ„sRŸ9`‚%û+£ˆí- dvÙ«ñ´\AÖWovÁ”Ÿ·Œ<åj´ÂCè8»ŽxW•D IQ)xâ%Þd²Z“"ÿD s(~sSf“êe”TÎ\D ­#(›œôÈËAÁÕBüQ¼¸L&ÚL­bã-åÛÌVä×pVÚ·ð±¢ÜÅÂD¡g_Ò5›z”YQ“Ë-gsÊó¬ÜYr‡©ÉU:¾•ž•Ã[PœÅ‰ª#-Z8ö?r§4u®è …ÇàÃAÔbå- Fæš…´$ ¡æ²°ƒD”™UhQ´à.š•p>á/ØŽ–l€U´³%^Ðެ’4tÅ-k÷Gp£CÔý[PþÐ|,Ò„¾kT שX VîIÌ¿›%養Òü¨Çã.ŸDW#÷¶½»©[˜*i¶áÂHG77’÷<ºàž¤Ø8£7iôÎÇ÷>ŒN@xò¥@ÀÓT¾¨<І`X£›êá/²á¤ˆWʳ?@ú+¨ª¢ºBqÃñ)¥ïî¼Z¸ì÷ЭÓÞ&͆*÷\ÄÕ@Õò./ö0øa¶ßÝßÔ”¹‹#r ¥÷Ò Ûrðb[`~±kJŸ£úN¨òº5}¾Œù>W úˆH„B[YÃh ©¬Çda)\Š’±}σ&^Zž%Q ¸´•Ü´© õ F:"™1ê¥Ã2Ø Bƒo|D?Þ4›SJ6õÁ/›ôè”—ÐL©X-iÚUšŽ¬¡)%Ô¬½˜„®da¤¿r­?q9.÷q4¯½¦É6 ¦ nO( €q=`9—°ƒ[hº'9-2¢ª|SVÜ;y§ëÞBé†ÒÃò̃Î=ÌG>1g_°œsàŒž¼‚™i(üžI¦£ÐÚ³ruL´fþ÷·øÉÇ]óÇWz>hHIC](0ÁŒv†eÊ).Á<9™ÀðEú%mJM|aaöï¾_ý·þ¼ÞÞïlþpÈPÿ@·°ýp>-¢Ë[«c…=ë««ì·¾Z«5à·±º±‚áì}mccýO,¼Qgÿ­ÖÖþ´R[[m¬ýÉ_¹52ž‹xÞ›ùþŸþ{6ŒÎFîtñüÆÍ}€tŸºµWç’¨Ô߸hüGŸ1jÅÂ]‰pI¼Lß<ê…Nð–Ø/ûåß<)SJFR³(†å¥¢"BVÏ*Ó€‡––ÿ…K`Ü÷¦VN±ÀÓDðó¿æ…©L¯·¶Ï'ƒˆe‚Ù$û•€"ˆ4Pµfí¤Ö¡â§ßŸœÃm¾ÛѧhÄÒ!wˆçѼg†bp/>ßþûÅdñàÊýWEDìɈí׬0_Dü¨2á/*ú¶¼GñöKÖö¯6 m¶ü•çœøíq[!'  ŸkBÏHŒ @Ä<© `pQº*¿dwrúE»¬’wÂ×äu¤D†fÿ÷/f³=NÙ奡ÝWKNR¨f\| G?à÷Ï¢þG<]:fÿ!÷ÐòïþT±P? —× “ˆŒWò} îÍcº­U\Ryþlf½aòy­@ƒSÿ£­Az\—t¹u~ E –é?ñ?ÒÈq¿7F²>=g<ƒèŽ ’€Sy›ŸæËP}a!¬„4ÇÉ›äïR ì¬7°MÇ1)+˜ 1LÍúÌömÃóÞ+樗`IØ…&:(À¶:›Ul⦵"‹ÏJ¡ÂϢ˅ þ¹ó­àFºàIž„9¯ÌÝÍÃì2Ùf¥7»*WèËîNf¡VìªB»ã¹§UöF¢ Øæ¸JÙgqXŒÈè”À‚ÄËð*ü”"Ãn‰2‹«ÊýËп ýÿ¢¼âTfBovR„ÞŠÌn³göYª¸ì³”gv—QžÞ]l«™Q(\€”Ùip£†¾Ò¥Ù‘¨—Šx,]®›z¹„ÐÒÛÑ* –Ó'›(““í HQÓ>¢õ ½–y·fλOÀ¸’fG(Ä7¦D¾zôf)0`3’š€7YÊœÚë‰Ú²vÛ”ŒõÏg½qÜ;J¨Zx…M&ÓàÛÊÛ·Õ²Õ—ý"tð²”ÉÔJ¯SÉ_hÉ_8’÷yо5=´àïÁRÌ›5<ŸŽØ¢`< ”/Û­Dy—7ãð¤(‰XnéXÜtì*¼0¦QÇ Ïsß}G—ÒãÛ«ã péë,ÓÎdþjrÿñ1ºé`ûç^|vÒ¶åóøëÄa9“¯!CG‹t­вÒsjÓçn¯CuÇcPSŒ7‹!S\Õê…:Žçðа1žé· 2Ø–Ò¿!l·  !ã& J2³ï\v8ÃIà‡#^ëwßy~P9®„ º«òOᕨJÏ8"ŠëAŒÚYHgGfg”È^½Ù‘ø-? ìû—ö¶@¶’¡ú®$…’î¯fS ÛîÊ€IËC¥&Aö™8ð‘òŽz)=bÊÈá‡qOD gŸZËÀw µEµ\”Þ¬CV ƒÉI„“ëKÁxB¬%–2ÛAC8·{QÃSØ}%»å,‚¦‚R·DÁq šÝ2¤éÊ F‚LûoT{” ý%ˆÀvp[upÖ–š,»P`è Mdˆ!ÃÌ0EhÁ÷¥ Âit1ˆ\ô}©"Ø|‡Á¯ºÿ0g"TvÊx“N<Ç0¿WÍ6Ú\$Go“vù ´N»nD5›|`ãéžEx…‚]èä „s’ÆK,dŸþë¢'¨š_©íè“O£ágdpшè[°ø…¾Ëa#0¡=£™ZØÈ²iæ*r\L£c€F=èýöžOŠC<æ‘>D|8ˆ;è%†ó9Ž~~׊,ä–!ÓÑš4ÿtÛ`³+L*üÞ{-âyuˆwéA13ÒÅ8÷pá·ˆnXŒpq#óL/ ýÞÉx,ºD‹ŠfŸDïjªËÑ d ÃÔ$šÈ'à‰œòH¨fÑ`È( ûjo¿³Õe¤¤zK?‡a#Oê%] 1?]ï"I`Êú™qåQïg©Ü' ’Œf'¬}ç@–ÂS¢ ž)ö!¸2‘kPÄ& KÂ"$¼›È>}î]a?¢·9²£OØåè$GÄ=¹`AÜq | $%œµa 7,×LátÆ=áœÆ É^›ñìn«ÚN.>`M/ßü¤À¥ƒ7˜NÛd”<묄꼴ÈÌÄÙ˜•+!æ%Vd«.uþ^ŸÙ'ºÈ& Á#5ò¢êÎaeÄ5 ¥­¾Ÿ¼À©n÷WÔzl‚ö-.Û?Ë€o%ûW2äý{À'*mW=.uaüôÇ‹iÀefŒ¾º"žÙ“šmš˜ Y`ä¢P 8@!`w+x3þë":@ôÈ-¼uïo&U\7ã¬Ù†ÿ ·JøÃ8îQwªXÅHÇ~@YT›°I O¥ˆ}Êé ©zt¦ØV•^àBã/ÉS “AÚ…Šg( ¡ÛŠÁD$–è§²…ƒ âþ|õØãœq,nG—¯.Ɖ¹×Í‚ŽwÿÖa«lõ¹÷gˆ6 .D΢ÿf >œ¤OÏz­£ö“ÿ×{ò?ïž{ƒá‡á¼u´òäûDÌñ;þÂ"Žß>z÷ø9¶Þ>ú2|}îqÁJë ðõûçp¢}ˆf­ÿýËÉ’”«õ…G}}»,£‚H†VÿòÜCùGk…Á±ñŽ•u]¶V.ªÞ“Óö“WF¢ŒÖÊ ®A€t¶V>+(>ó’>˲>caŸ¥}Å}VåÅ­£·þÛ9CmgZo+ÁÑû·oߎßÎ+ï®ß¾]®>~[yŽÇž­o‘`Ò Þ>¹>j½]þþxÜüæ¯ß~÷ç÷ÿñøú/ïªßc‚z뿾¿~ôýõÛÙ¿ì_ëí‹ëÿ}ûâí Œn´XiÏÑ£’Më úõ~êôÓøŠ)!’êJÔôã V×õý×õ£GXìå[/ƒöÇÞ±ê«Ðe§­ásFl1Ƀ.¶¿‡èsé9’âÝîa·½ò$!‹~ñv¼´„. c€qô/MæÇDH×ÏQýw8¾ˆ Rki_>Ç_±83©€CÖ¢~m˜’¸ÿê —¯²QÐ ÇêÒcÈúM¥êòE%x\Yâ™'4µçþ?ÿù’1h;u®†b­cYº ™COóW*#]Ê"„¶ÙÉ‘ö)ƒÌfg¡a@y4ékv&Ñörj4Ió[EYEÛŠå£æ©J ¡i¡fª¼¦`4;³˜h(ççâÝ÷YößçbøYëÁÏE»ð³Þ‡Ÿ w"Íq”Kæfg‚©U!vÍÎ e™*ßU0u’Å M$côÛ\êjò|Áf¥†fÖT½à®‚mÕçÌ.RÕË5=U œýβ}vz~¨œ÷yå‹Ôî ¿€‹Ö>ßn»/}Å/Z½òXY±W§%‡¢DýÓÞ}LZk÷sÛoøI-_»rºPëý„7Ðò(Gµ " éŶ4ÀRâ¨Ol£²§dH)*°zrÉÈëP¤šÐdCú™AÎ Q¥Äû…ñ’¹¦d^òoEzÍÀ?/Ï;OÁä_4ˆ:y‰¿jeç&)1juæ¥}Ni¥Ûˆ¼ôË”~k7·}Ë*i2uÝ–Ú¼að€_ˆÏþ*–%¢%¶½üFéâà@Euo”¢•Ñ¿0¼òžR¿¯¼3.“< ¾Q²Ù,n¹KTç [åŠî8ÎÄ;÷ÑonyRÔ”mĘO‡ö$Ù°Y¢aAå=è’ÉM òVßWªZ³MBoq:O`J,¨†¼ ßÝP…8±ëÂæáæ>ÑmÙT–Ù|?û¢ò¸êØü~ctCÁ€°„êeg|(l‰¬æîYáÜ›õ1;ŠXùµHv …‹ñÇñä3© ôúóhÆhŒ ¥ïõì‰Â€Í®ÿͯÍ^îŸßŽŽq¶þ÷J­V¯'ô¿×kõõýïûx¶‡'3¶‰gCCžé£°—qžýã­ýî/}oI ‘l͆Ÿ¢™7Œ=ï[6Ñép ‚ίǛ¯«>¼ÞÞùÏc–ÿ¬[ûµ•6x(ôuwgw_ƽhùµÚJc…ñÝ'½xÄïñùhüßOFÃþ}>zrÕë÷U&øÏépÍ ì[šìT)fÉÎ&ñü‰™ŸíQNE1™™yÒ¥à18ö›Ï¯È¸‘ ÎÇlê]^þaoOL&D¹àøâü„¥:'a¦1ކ,7Ï%%©Ìàå%bdØ'7WÔÄbR×2µùÕ…~|5ž÷.ýù,ŠD¶W½ëv<‘Ë;Õ#ÃÆÎ—Í\;à·Eø=ÿØ´Ï·1ôáòþëmk¾Xž á(↱ÆöàS€Å¬®<[§PVØà—½ ‘{FEµg3EFêZò—©P–2z°ýÑé÷Æ4Sè½O½!lÜиDÞRGw-±QHXUéãtë†dcL‡§WÉÐþhGF]¿ii8ÙŠâ>O­ù5ôášþ5âyÇ}á]?!{KO(­'‘*BAªŒÅÅÚ™¶ðꮯ¢"(¼OQM¼Q­‡·;,P³Ÿ¬VÔú•׉3h 7/$3ˆá@úpß)Y‚§+>îY§Öœ³éð)ï$zMäôCÌõˆ¼R!Òe„Ö^IÙZÃÑí€KÔ^”ÒòD?dûùË÷”f å=}´xx;®Ð Fb‚N:º™´ª‡ 6âaªŒ<®V66‰OĤÀ¶ˆd4™2‰júæéåÊwE‡pt•OKjÖ°’(aŠeØ£>¥î€*¢/[!”Õ¦ò±-û²Ì\Û†þq•îÅ,¢JƒöFñ„— ›?‚K!{D‘׳VðOx­;°óÈòòÌ)؉•—o~j ¥é÷æóè| Î|¢P9‹Yz$V¸bzhŒŸ¦°º'FŒè5„¥Ü=ÕÆ1ϦHKuºÒú]iü½Êõùê x×ù1û‹6ÃhÔ\Kýšk)4d¯\–àÞÞÀNn›‘:µfeÉùŽûðûðûðûðéƒ}øƒ}øƒ}øƒ}øƒ}¸ÿ`þ`þ`þ`þ`þ`þ`þ`þ`þ`þ`þ`þ`þ`þ³Ï:| µxž€í–®vvÙ$·ù³Üü]]á7œòC˜e©0ÑÃy“½ð‚0“àÕDl+OÔ˸úäéŲ|ûòóíãÙßu ø¾ÙŸ úü3|þ‡ü| ŸßËÏ'ðùD~þŸ?ÈÏ&|6åç_àó¯òó=|¾—Ÿ×ðy-?ßV.ö÷)| ßìÏ3úü>ÙŸÚ }?‚oö§V£ï¾ÙŸZ¾«ðÍþÔôÂ7ûSãxZ†oö§Æñ²ßìO£¥ßÏØ7‡ï9|³?5ÞðÍþÔ8|-øfê¾ðÍþÔ9|møþì›Ãw ßÇêû¾OÔwß#õ=ï‰úþ|ÿK}Çðý?êû¾ÙŸ:oÿÛ·ˆ_ö·Î1ðØŸ:ÇÀÁ7ûSçèÁ7ûSçèÃ7ûSçÀ7ûSç8‡oö§Á1€„Æþ48¦ðÍþ48„3øfÂ/ðÍþ48|_á›ýipøþ¾ÙŸÆzõ]ô„~r¨ÔöµÁ"þ#$‰ˆ€ïÕhR%ÉñT])F” H)EŒum=†€Fðë:ð¾"‡ $ðë +‚‚E€$aÐæ4"IÈA¥5ƒ(¾h¢—¬Æ¬¤‚%W“H« SQ­®Ïÿ¡ˆéH<á3 s ³ ó 3‘ s‹ m9Øm‹Ñ^Ä-†{MP·o5Aàb€Õ… Š®1wQ…{ö—ÜÉrP[]3 û@ˆEAˆeAÈN?ŠN²SD€ìà\ j«ë‰%bu#Ñ«OãrõYÙUbe±eâß=í»&ùÚZí·=Ë×ÖêÚ˜€·Õ§ê½úúçŠ9‚|æ ÒHð3 ¡ùA} Jßb 7Õj<¿*\’X#‘æ©-‰1[¬¿X³¤Lì:V²%-»#Ç­/]·[òGõ}žs#øfVŸÝIÍZM‚"×VŒšð½~»µök‡…ØÙòæm··HÍ;©ùL}ÿw¢f1×Vï¤æsõ=IÔ,äkkwRó©ú>KÔü¾ÙŸµõ{£ë4]¯Þû8^»›q\ æõ•]¯×î¤æ(AMZͧœúÖïf)Òæ»™EŠpáw3‹˜9×ïf±ŒåõõôX^»ûZŸ¦k­Ýû8Þ¸õqìÜMÞ͸½Tßÿ“¨ù ¾ÙŸ»·öëw3n‹ôë݌۱úž&jÇw3n ì$7îmõß°¬þ{ç³6îfõ/07?ý·­þOïf)Òæ[ŸE\3åÓ»™5 Œ §w3kà3žÞÛjÿÔ²Ú¯ßn­£ÄXÕ g«OŸÞ[{Ÿ¥Û«SSrm·øÞ}h±ðÁŒÕµ•§â°Duf®A¤MbÃþ<ãçÕò€~eEXpàºÂá:µ•º¥(–õ™ŽäWê[l<Ÿm,œÏhè3jçšê‹gf™䚉-hЦê©ú]Qˆ¶U;̵•† ´ PCÀ ³ÖN€jkešúµU+I$ˆ:H#òZM“²Rn¨@ð[8­RxÌü»¯Ðêâ‰ÙCEÕÍ)P”?<¯;41„ʤÒÄhhØ;Ò M ‘MÓ\ºKš&†>_a‡Õ5²ÜH4O¤ªsjÞ‡.‰õºê ԉ̫‰£8š5Ïš”î$±‰h¥Å¹šŠÆom>]MC èjŠ—ÿ¡… ÂØs-@)þ­k€7Žk¦®&N§ê*õõ…þFRÛ³‘Ôöl$µ=Imφ®íùN ÀññE ºœ ».g#©#˜œUjÉi¥–œWjɉ¥–œYjÉ©¥–œ[jÉÉ¥–œ]jbza+Äêªõ䲯…,I¤¶'?jÂ$ö©â¡ï¶1@éÖ>su™L"ŽÝ]&ØO5ØWu‚çZ€lл,G)ˆ78Ï)i¬‘Ò~æhÒjA[`r:ÖzB*¡BÑ%Þ’ÿ·‘üÓò}r ØCÏÿ[W¬ô¼ÖH2]«E¸Š{›-î…*¨‘S~Æž±ü§¶JµµF‚FD€¤ -D€´|’hD€´|’FD€¤ TâysjVý ß4ÜÉi©Óý;ln[`Û]³sšk«ÚtVjƒjÛ å‚gFeÊPeM)F§5Tk\ñã÷†bcÁkâï”TV5ÙÓjÍÒƒë\£%[ÑäïªïV6âdwÇܧðŠ~`Å5E`ªf‹}Uñš Q0:ÀÕ¼¡'J&¿P6ˆY?Ds2ŽÐØ^SàI2¡«geZ ŸT%«c.î$ÂôæÕÕùGô¿uUu“l錘|ß~Cà(ÑjÒH[Æ¢Ý|té{¬éàAµ;®¯¢»ntúéÉœê#‹÷tj&xÐýÜ‹u+rÍõn ZQ2„_ô?Bƒv¨Có-\¡ØÙÒS𵞑ÌÞ9^È–¼5£ë2ðYÌ Üyˆ¢‚trà©u:“– k)•i#=÷½¤Å*Œ'¯Áv>ŠE½ŒÔYV;¯’fþ¥7Íš6›&ÊÀ&¦Ñfd–QÕAÿ0‡Âxi }Mþ/›˜Ž¿ ·b š°u=úçzFt¢­9À&§qC¤ÙÐ?Ž{#p¯Úò‰À{P?ô4º}QxÕ(ƒr±<ç½):ÈBMz¢]¡?d´Ák‘eO¿+ $^Õ£Qœ­T^±Zá,Áý­3–Ws­"‚>CsŸñ„qµÙœÇ À•zÍÿ±å÷¥cï>~ÖÉ#:Ñ•¾½Ñ†,}+x†cô¡.æ't˜™Ø e¤üÅ (Ƚ*Sõ[•nËÓÑ+lR”pF?e. ÌjDGNãƒqhøž_r³ ëÂSùµª4‹YÜŽAý·q®XåÃ$†ûMá £ÊW¼ƒ\¾‹[àÓ=²¸™ž»ÏƩƸͮjTZ+Y©q÷YT=§(5‰sgtE‡¹üx‚Vä´moµÓûöž†à’ùõ¸ðPk£æEolcÁÎJzß®=—lwëžÑY«÷‚a¸ Òu+½k÷˜ð'\¨õ{Jù%.ÖÆ=¥ù7.×Óû%.á'¸lÏî¾JÁUË›³o•ÆÊ–7³ß.•ƒí~– ?ø\z&«åMì·Z©¹¬v_Sÿç’³Yí¾¦þÏeç³Ú}Íÿšwòb€Ý× ½•ë¾yA1°òæ~§•t¸µ»½ÝÞ78ÆZʽ´ñàV†»á‡8fÖ$÷[n)`{‡í|˜‚ (t¿óŸÍC‹hí㙞‹}a «’è»Ö:Ëé¢åi¼>FÇ˜Î‹Ê —Ô,7S]/·fý¡pè¿Þ¼–[[ÿX8Ü?ܾ$–ã~WHÌáôþk`r–cY~W8ôs)q¯½µÕÝùé¦8,Ç]ý®p˜+¢Ùy³½Ý}Õíl݉åÁßó Qyã¾)ï‹mMø·.Ä%Öï‹y=üç/ÈD*˜¤g¥N8åf·÷Úû “m,*AÞ/RxYI±„üå~{óoÜâóØgñàA½X‹Êl÷‹Ÿ·Þe"¨“SxÞB {^áy¤«pX·sÊΛ5œ§×Ý4+—.?oà»ÊßÚÍëÏE‡*+9Yx=%É_t¨Z o¤ ¿ÑŸ±(ÉB¾Q·†â*'kxßCPý Ã+ï)õ{¼qù9ʉSq¥íóü•ÍßÞ¤Nf¿ªJê7M+wþ…V—Õû>ÚJ"t?‰P–àukë/ü•b<¶î&çfü©¼Æä¦ÿ$šŽ#Ry|#¾/Z§Ê";Þ[åI hƒ“ÏÌN>¹5ÒâÊ9E(k¿ eù)úÇ{oUo÷ëjýö½_3[8‚¸ÜññÜß~Ý9l—'{ý¢½b„?Òð Â/ˆÉ'ILΘ *ïáJOqF òVßWªžÍ‘Õâ+5=QbA¦þþbRvºŸSÕ™·• ÊìATžÒep’êß‚.°Á§‰ÈTçò Bu«Èê>‘_”uÊ&†ŒJËòTJ«÷³qR$u3­‹ñÇñä3]ÄÚëÏ£â4¢Õ5Ä|Ðe/ v j¢¦‹ÆU¹à.ía<ޤ²N(QXS¯uõÚ€ÖH,«ð5õº®^7ÔëSõúL«dE/¯¦ÕYÓ*­5´w­ÒšVkmÝ(I«¹¦U]Óê®k­ë­­ë%ÕµºëZÝu­îºÖäºVsý©Q’VwC«»¡ÕÝÐQ­ÕÜXÕKjhu7´ºZÝ ­Õ ­æUã«ZÝ«ZÝ«ZÝ«Z«WµšW Œ¯juƒÞµ‡£f¨nPŠ&§=uâ,•º ¢j-%¢Y uå(¿šmACŽ­\¤?ùa¢ÓxÀ,kȤN¬?×B5Éš¿V ¿X5­Ô  ff[þFNþà1ŒmÒ=|ÌïÖ§ø^"•<û á³XRÛã÷suw—»“/ýÞE…þòòòW€‹ô‡1Ð3 ïf ¨LÆgPTIï}Œ¶£K6Åâ7#ŒÐ3E]P¢“ó¤4.â«é¼|Rj·æ‚¥¨Ý£Ÿ?=<¬çõö~÷`ó‡ÃÉdÿ UE¸Õ:Vس±¶Æ~뫵Z~«+Ο?±ðFý·VcáµÕµõÕ?ùk· …ã¹Ë ßÿÓφÑÙÈ.ž_ÀEš÷Ò}>Žþ§Ë—ãá‡[¨:x}uÕÙÿkkë²ÿWkŒNjëë+òWn¡îÜçÿxÿ³ÕÏóû¬Ïc`Ńûó‰WEŠ;)—1ÍáÙ¥é}ŠØßi¯¡`–’؇+•GÃ9¨HÇs`²! ®U‡÷] û£™EòbpÿÍN÷ïo:Ǥ?ã· í­¢áT³AÀvc ´6Eäcñòä…ÂX¤e{¥iUáJ‹7&‹Ä¥Ÿ(˜¥;BEíªÌ&G$á‰}‘Lî0Ì’(ƒçý6—Ïœñž1" ?9ã¿Öب¥ÆmõaüßÇã Ö8 µÛaýæ‹ôÅ”8 U¦Ÿó(o²Å8yA,-®"{ >vÀZñ10s¤8¼®L× «!?aï gè±'"5àYéù®_¤ü¦~sRùaÌ‹ÌÇágÌðYDJ Oó¿‰i~ºìGS´ÝÛ™ÌÏ¢YäéÅvç"´RäqˆÎä+Ý»L­×3]†=Ù4ì O ¤Õ%HYäô(n¶ý™±ï|ßCЄѿªlÆöñܪM4×ôê¯~ª¬$(àx.;¯2¦«Š¡þJñ<š_ª ÑüUeGs35‘Ž{çhÌ'w;tWr,雩B;ò J5nT÷(×$ëŸúÜ«¸‹ùmNÅÿ–Ç5ÿã[¼Ü?¿…:òø¿•4ÿ·ò0ÿßdz=<™õfWÞ’âÌ~êìtöA!èUw»£G¼ÞÚ>îìïïîë»oö7;ǯÛ{{ÝŸôcarÑø)¿‚Y¥ bEwf³ÉL3 õ}¥ò†lZþvxê¢Óá8;_7_W1ìàõöÎÿÒÙ?èîî°%§¶²âÏC_wwv÷eÜ‹–_«­4VäÔøÝ'½x@ bìÐø¿ŸŒ†'ü-žÖˆÈTêDÚñ`xšÈbKá-E€ØxÉ×ók¼Ü©w 8âQêb?Dã'§ Ó©¾XœèÿÌñÏ˽)åñëõĸߍ¯>Œÿ{y‚Çrkw{@ur25¬­ó³ÈtDÁ¶ˆ‰T| ,¶÷QøÄÕåÄ~Ïœ'`éç;>d¡Zrz0Ï}<‹>-ÿX¾AÉkŠzYÊíÝM`5Á“L2ÈÛèÆ2çsr“NXÍãm°nH…’oÂn°Pr6رìâɱlž<;õW‰=êð= CÀGį5¸8?¿ÚžôY¡d,8â}ù\œªø”èÀ`ŽfôLDMmêÉ‚Ú[Î\-N8ŒnøZ_pç3 ŽÑ0žƒ@Èl4ƒ'üÂ35õ-ñ^ÊÄ•XZ,HúêIôuÄkÑ_Sk*’µ é–Q&©üå/©¸# ºU µ²W{bNŸ,žH¯Uª¡ ­å”¯zÿ¨¢Tß3±£•wFE¢Cx¬è”ÖÑ»pDÕfÑJlfãTgME!¶yÓ°»Ù"XÈ3‡pü^õqšçý¢¥Í†7›þ7<蹬\¯°­â7ü»*jÄÑ™QÇûWeB¼%zA¨øgƒà\ÝÚù>ùÃó“‰%yŠÄ߈ ©|åÓœòªkI@x--þŠl-þûUÿCóãfÁ€h¹‰ø/hLÄ남¯ªM1\Kz’]a¥'$5Ù)Ö$IÍ’õ+RJj‡iÄrÄÚòΈà”¯<¸ªźœ;Y Þ%z%â•Sá<0 —\d~_ñM5UQ˜©ê,:‰×] {×1J­X3ê&ÀQx¼¹¼½ ŽY²¬Q¬VÉ—š#T4õÁË1,c/ÌŽ¹æÑo+•¬èosr3rã{Ë?í)Ñ T’ªƒ£qŒÉ‡m,mDͦXWš {6qMšWÐ{5âì•( tJ†±à—ÌÖe²—%ª±£µñÖÒÇöÜ×DI×> É¥S0YVjñ׿›ëüLÚ”Áw7–ƒO‘lZóƒoä´Æ³IIBÑ™&¸ ¯ˆ¼iG8¨yrð1ûÌ&ÃàÜ(LQ'‘Á©?õ_àa1žk»,T¢9ìOFçãÛÅAnëÒÿA6Õ¡Jô¤¦+¹e´‡-ÃÆR$Hàk³)Ê;N´.]šN.I<‡ƒsUíp§(¾V¾z<‹¾Vª Úš™X2µ•Ê­‰Rûµ¯IXd.ÃK¼\zDé¡ZþÕÔe5uw5WáUÑj`îÑ8Gæ&Q£V¸Úì°å§–ŠÁ½Û‚1j ÃòÔ1|·nuFËÊòdT0”H5äqNô«•tF„ú*Æ[m_{x5ï+ÍÊ{È*«{_YÖBX=†QXŠè8m§§K-ÑxÔ¡­TŒÄÁZyBõð"d½”¯j¢H®wƒ£Jðø[œts‘QñÙ¢©P’ƒÜ·•ÇÕŠh‰EJôðüQ‡üOžBÝFyç?kµµäùïjýAÿï^:ÿy=\°Åæt2óãáù”½"&ÌŸ‡ó3Ü€ÚEüÎAã‹ó“hû‰ƒyJ¬+õI¥:å #l“Âzš¦rY—`sù:©B›“‹ñÜOHc öso6f¹)>;dåÈ齉Å&‹M>øZ’”ŒŸTÁ¸-Ñ£žf^9˜Hlò°œ4èmÍ®‚'¢JÊWÁ:^vQVzØþ“*¡>dGÏqÄïâ`ÂG3ŒÞ|Þc;B#³¸÷!BmÔv Ê6ç“ ÷‚5°c>œlO>d ÜгÄN¹õG“8©œ„!Ä«–6üNuвçÿ[QÿÌ›ÿ«Ôü¿úpþs/OZ‡‘¶1…+µO~ºÉ²æT ßÖIš2¬X§h‘ÀAà »Ç@+«ÙòWž'æx ¸Ø›¨ª,桀¤`: VÂ8œ£qleÅš4cߘ…ë21º@ ) x•Xê.h¦` M³óDw%kåLÖ0\cÕ÷•&Ï,µËñ‚9…j“ ø¨•‚ÀjBÕ8 >W Éô‚ÿ,&Ï#áuœH$§xcšC ýN¸5(%äÈ¿s°e»žs#]¤æêï•£+÷8ø?]sôÆuäé7j)û0}àÿîáq¨}ÓÞÌïp¾cÊx¹PÃŽTô’c(èàâôtx)S§ÒLg“³Þ¹^b"ÉWUƒÚ¦¢’ GÕ£ÿ#õnžÜñ [Àœñ__[Mîÿ6ؤð0þïãIYe°Q˜š Ô¯ô“ÆbcprqŠ~zZ~uñcø£a±èÂB3H(†}¨Í_ýà8ô†cz§oÁu£²!l9ÏåNzànƒ±Rp·{°¼×›Ÿ-ÇÓÑpþ’Åt.á*ÅÓ¤êʇ.æ(×Q¹þ{2óLXlK–ÝB¾Xƒ9U‚xÊëbï¢ô,ÿ{ÀR°‡­±¾Èçǰ©€mÁ7•ª½Å6•B^Wœy¥É܂ܭõÆ¢A866,õ´ÍKw,Zš‚kT©É ÛH²1áÓ¸hÜj±‚ã4“8§†‚oVh@«seü:І’ÁÉ—Æüº#rUœÊÑ~_Œæþx2÷?φóy§ Œuåm}_yGÞÎWE· ‰™µ°¡×ÐLjº£`÷èêÖòä.Îw;ÁJo¬m©VRIÇ9¾¡5âÛ©Tâ`g±eGðŠ*J¯‡÷6 ®X×Ìò¯Ù˜Å«ýh„½÷{ÎæÚεòž¥ÀM;û5wݧ,1W¡þÁ1* Ai Ÿ†} _ñû÷r þƹcý'Už'ç½éí~ò'ïü¯VKêÿ¯Õ×Îÿîåy°ÿüÙZÎà-`ÝióÖc M¤5-F&?z„iEjß#üv'¸‡'ó1æÿ½YÔßMÞÙ­:[Àÿ×FãÁÿ×½<®þŸ²×'¨Õ}s@Îú¿¶±žÔÿÙXk<ìÿïå!ý¿íõ{£+Ÿ5s:°­ÙÜÎØ¾âô‚…VÁYÏGØžYD ýˆTþg ýƒ%ùeIö³Óììb9Fz>*ÿÃvwËW>Œ›ík¿ó°z5 ó„lO¶ÅDçSÖˆfª­òÐu€.]#[’ÇJ*Ê‘ñäEi¾fÓì£EOÙÅ“.Ùj&Âø0í« ¸y,ô|zÖŒ”„ºŒÈ!ĶŽŒòŒ:t½*kCÉ*¥Üc‡J¹iP¹%Øð|„›åSu¤S~åŠOD1ª¥¤P«ØWE 4ײ"­CKÝþÝD_–æ­COäLb­"Š¡å½âBNù‘äpŠ|¬,õÕlª¹!{¸I;%ÿ ‰ô2º†ÂY„HR!túWŸ[þÊ"¼ .•\LÆ0àýÇiRqêÁÍ >¨’}x‘æ9œ‘mˆ ²‚Àê”Vq6ìûÂÀGtÜ &V§cè§Krw5ð/C¢ûþRê4´. ¢ ®Vy{eEüL8 3U³0:6 ð ­¼”ÑA´­Zð¾|: fp\‚×¶J¥Š‚:1&/+ÈyÖ8‘“TlªI~˸K‰¾èè7A7Õ&A{C†X°˜‰ÖWÞ+(ªyèY“?}ê¤F«ÆÆ²–¨*î÷ÆÁ4äý‘À=ªspÊLÚŽ§¢3›M†&ù¦E)“4xDM,óe5ôLUTÌœNGC¡(jÕµ¤ªy‡ät²aHÄiÂ:®’m!³2è? ~1¡/¹ËÀJ˜ \•?»€YF £èt®áÒ‹aÙ¿xƒUmx"[°–ÿ/çE£T8K‹Fòy!Ë fÃg"7(®@¯ü+$x¬ åXvï9œÌŽ,ì]Õì}k1 ‘m>šö ባÉVãM‚ƒ -(¤¨Wõ’c˜±Ä8@ñÃò Mq×éDûY©Ärä[ °Yÿ[ ù‘€[è#i9ceÝ£ñÿ®ýßm:ÌÓÿXÝHúÿZßX}ÿÞËc‘ÿ¦˜Q]öšd^ÿpò×åe«LcŠDþ OcüŸFËŸ†·xòCO®ügc51þWëþ?ïç©ø¿ ÏÛ4ž÷.QáÀ«øÛŒ©º€³Í%6TØùOÿu¯_[QÜŸ i‡ÃÒ¾î±Í%ûÍšKºèÇ”è–ÌØ :æm.íL>ùp_ëë÷Šmä?E³ o,¯À‘Ç‚÷£óÉ'0ܽ‚[”¤¬7NOáô÷z›ŸM.زÆâüþ(ê±í¼~Œ®ÀÇ´>8¯-p}–6‘Ñ›¯¦=Ðwcë6\èä»ò³š&æê“i.[Ž©<ðêæªŠüLD½1{Ç΢N‡ÃþýO£ág?¾˜2Üõ{lÇL¾•9*ÝEÀ†uŒ¬cÈE^¶ñ €B›!~¸ÞsÃ{}î±_ÊÔ.<>ëá®è3 8K]æÄíQï$ÆT5 ³9ì „«„a샌ìt2;ïÍùZޱ… º² 2ˆþŘ¿ôâ8:?]ù½¹3ÏÅ”¡7c£ÉgþGHl5õ®âÑTG仓ªâi²°ÈFŸY}ba0€O0Qo<öÝá/F£!£ ÿ‡ŒÜÐxo4dk£»í¬6nÒãÜ1™±áb£h6ÖtÜ¿ò§Ãi„În\(Y:ïÃÝ~þlÇ ÜïO/€aÇ•4‘qsÂÚuöFKŒ]@ùÃqÄæÜDž}†¦«éóhGѾ‘oþÆøõ*n=l÷N¢ÑÒRåí·G½'ÿÓ~òÿ½ã/+Ož?z÷øí‹ŠŸœ/'ƒ ^ðÛ`épwk¦"nНŠ÷¡ñÓ¨?dðËä~åíÛKöß÷o¯ß¾};yû¥6Þ~…eøó] ànò{Pê,CóÖ÷•ïýøãpÚúþ-<,= `d¼Š¸%kMµÉÆ›(èÛ’%éÍ:t”f€»9ÊÒ¨3s²q»Ä2<ÊÊ¡÷˳Å(êœM©PÑQPýòõíÑÛwïï ©1‚òvÀ0›¬8¿ ¢Î»·ÿûk†_YG³ä+—Ÿh½'§í'¯Þ}ïHôùíà{€ÛïžúW“ 0?‚)ûcþíc“àÎ&Ÿ{'Œ ækLŸ¢ô®ƒ‘pÎ×'è¼Jðöq·­ÊÛÇÕŠÞ_@›T®+ó‘õk:c‚Ðw§ w6™- ¿“BÐw ?ùç“+:Lâv‰ÑT§„4žl°AÆ{9Æ‹Zðî’s;1[½Ù¬wÅÖ1\‘ÑÚ¬É, +oŸðþME<ô¦b^ÁÏêÄž”ÐÛRܪ¯­xj ^2ðâ Â&ßãóÁ1ñÇ |JÆx°pZâ@Öƒ[‹Ï"Øõ@}ð<šŸMØJ öõgÃg#<€}ŒïoÂRÏ;6Õφƒ,yl2…ÛiΆÒGs~]’ïF >Ë-ᯣO±KKÚ—‘JLªKôbÄݰ$*œ·$~: Õ ‘5FŒÔ%z1âh¼Ùb$Õ--‰W#^öéÒ’x5Û@ü$°sÎñÊß àÝ«ÍÂÝAZ_9µImIM¥ ªhÅÓ|À’Ð…-²/"âõÙY+žoa2OšàoˆÅpâddY9à$Æ6xM·žâÖÜÿÁLõîLakëìÖtsïh¤üÔê÷ÿÜËc‘ÿàí˜Ç›»¯÷ºÛýtÌOoIì”ðJàMN1‰àŸ¢ñL<´ôÝùh6ŒûOæ8^¦ '› dùž°m.ÉŒ ô$ÇêÓe§M<[ŠÑØ#YÎ""*cü'¸S»ÝÛÒÿj€ÿïý¯»¬ýr1 n¯Žœþgs}Òþs­±þ0ÿßËóí7?œ Ç?ÄgÞ·Þ·>v¼OB>äV9E`$±=q“½úþ“‰?<ï}`\Õ“'~ {ÈSÔd áÓäßÏ¢Þ”’…~…Uñ¾eO¡[MÁ#/{Þæë­ÖwŒûÞßÝ=l©ä?wÚ{ÇÝ×íŸ:­JÅÃÕSü×ôóà¿~X^¦ÿ½—ÝÖw_º;‡ííí­î~óÉw2íWh£÷òMw›ÕÀþÀ¦hlª‡ ›Î&ý(ŽáZ¹s¶zB^Y©µ,IŽüÊwßVüo#µRñßùÏ}ä‡}¿7ûÐúŽìNâ³á)Y$¡ã;W6/=™Té‚h¶èñrx1Ïé ti)êŸMX ÃAÓ?g4 ½é芰GH…þ`h'À*ç’í‰jTòé~5l}W{Î!˜çϽ¥Ç¬*Ž?õFÃ4ãøÛ&‚Í“i<'…‰(îõ=¶Žp—Q5b«T£àT¾ƒ®¨x Rï;ì A]l©ôw&¿âë9Û­úZ™c–ßìcÿ÷;í­×[«#Ïþwu%yþ³V¯×æÿûx~=ëÍa*ÆKžØ/90°ÁÇã餈I¿ j>ñqbz´L@D/œ ªTâ ,QG¤`\4+«VzS6Ç`Öè{8£²›©QJ‡}%Ðð§½9È«ãeoÓê_pٯк"$BË>ž 9›î8N¤Ù0"[ ¤xÓW«ðØâè[†Mƒ,ð{ ª¾ ퟖ¹+0Íâêå•(‡þgPÏùÈxþSèÔ×Û +pâÃpˆu÷Û݃ÛÄÝ-¿‚”¨sÐõz¬ŒÞH\€(;Í)¥^8n¶w7ÛÛ°û PàðŠm_ÁºC'IaÛÂçPÄ7*è$£m0ê›0`øôâ€Jú+ "V­CÒ¡ØÁ²íi-J]ÀÇ)ûôFÅo²´Ál2a¸ej¶ËŒS·ƒS%|÷›Í㪞³Àc-#!%iާí#e7òA±¹Ý~sÐ z³qxŒw²ù}@úތ̽ÙLøt£Y¾¬äŸ@,lÛÎ{'0Ê,$mï!PCez\yÜÜÐiŒ+#(ëðÍÞ6ö'سùêÈÌØù¾f›ÌÛÉ‹4[~š ÑŸkŽÇô¶êÒŒn7ú˜õjº‹Y‰ª‡1›^÷±ÉÁ_œwck­pºÜôÉ ª_9Æ1.°šÔ^8V}+;®„M5‡Wöj™„RלW49x'=£¦½nïÿ 1tÌ(@%<¼K&•~"Ùt˹[qxóy’^ã»b𚊦’ø·ž¸ú>±âð°ß8šãö¡ÌG8õlãYµõ•ü¸UYF4q ä%#úî˜ö÷"?]òåÞ%ˆšë F+Üà²îjS©è‚[8Î --Hÿ]hHµ@\“Á‰/)t,Ç}øÑHZ4çÁø‡¿i7wödÊÿnI8×ÿZþßh<èÝË£ô“‚@TÝ#?_ß6¡›R%OéÎÒ>×aSªU¶×¶,šÊm2F÷hëyKšdûÿà`·<ÆøçB6#ÿÛý?®ÖôïãqõÿçÓÓå÷sÿ_}5eÿ¿¾Z¯?Ìÿ÷ñ¨iÿ×ÓS¿éÿúê•<‚YÞt?Ǩö›íí8“9Ü?¿´÷3œÄ]ûít"yÃ_K’Ýý¼;»‡"‰ºg ´É@ï8Ò6¬èKØrë@„“¡;×úꎇ Oax•+>€ª°‰°·†6z Xd*ˆ¬ „¸RaÊKܨ_ZÓ0üPR˜—è2Ä ³!,¼(7\Tµ2;å,™^V2@{3°,›Lû Þ­ ¡jû9uÕcnxØ™ÌcIB×7.žä º7Q‹Ñ Ióä…e}qS™­Çü«¥]ÏP°Ú©iÆ–ʲ¶ÖOl°d«ëÖQrŒE›úcháøûšoí6™@oT-‚;.ÕÖëF¿€üR;}½!Ø03} ýOxNñ©Ùük°òÐØw«y±cðVEéæ!ÎÿÝs÷m<®õÿ6UÀó$ý­­×ô¿îåýïG¨þý3ìù,*§.uo©ÍZ± ÙûA]có.œ„8¨PdËÒ€aqVJÁJ­xYj›’R¶>,&ÓN0iè£ 0!õM Y¨ ë—Q=tÌ•UÅxN©Ìú²ånYö,-Ô}½H+Ò/óÓaM•6«i¢az:C»×P¬EÔiû ~m›¿iqw|:ù‹—(4ÞÏ'¤;aX‹HýxåWåúb×ú|^Q·?@mYèN³êI¹·ºü‡˜E¿kþŸNFWÂÊø¦uäíÿಿ„ÿÿÚÆúÃüùÿÇ™î|2¸Q'l'×ëÏÉîF¸°dû/mŠïù@#lbbÓ¼˜ÑC(ìt69‡Õ±i,‡Ü;êV#8wÀ\@®ºð¦pÐÉX†Kô+v·ÿ þøÍ~RÉ®ªošÛÔ³Éä£d"ÞÝýÂ?¿1¥º”‚ƒÇÒrÕv”Úƒ¹¯‰ÞkBÈòP8º€lu$'³¿èùáà^óOš!æu óËXÏ5‹`ž†”…_ÌT‚ܦxÀÒ~æ^БèDG⬈@ÑÒ`LʪfX^†CË'/Ä«Me…ÕsF˛ЌD+ä z:Rô*`å‚*@‘py~Å(']Y•‡Bx²­¢x9_¹Œ‚0×ôš8õQÇ Nol) êj[¤Vzº],<‰[yˆÐET1#K Ú¡sVûx2~˜ó!X !Iq¨†¤QI@î¢^ÿL‘µ ‹ØáÈBý$²ª¸‡À̉2þz=<òÉ_ÿo.ÎÑÿßX]KêÿoÔö¿÷ò‡={¬¿"­ ‹¶Zh÷ö;‡‡ÿd?ÝÃÎ>N+FzT.ÕÒî·w¶Û‡ÝÝ1 · ¤NÐFû‘s™««WáVmõ'“„deB}ZäÒ"}®7nŠ`¬ÌŒûã~îÅg‡à8SÊ¥N.>"¥ÏË0î£fõëøÃ2Ý€Qᨫ„pM äÔ5$ «ü‰ WÊô¡£½¬©aòK((Wµ,ÅÕ,ÄÖø7åkdlàlˆ-±ó% ÆâÖ8 è¹îÜMÄ(g¹»êdðÛÙ9 ŽÞ…ÃAU² îÎå”îÍ©°Š±×›ó@ŒbEñ âzô ´7D¬Â- •xïŽÒ…>\C[e¬ÆÎd|Èx 줆P©jOÎ|Ñ%œ¡sµy ¤(¡„väÃ\ó þXW©—X}ìÿ4üÄ0ÛC†&ä]§Ì›eÏ£iø4š¯IÉô QLö_E†àЖ&ÀÜvûõË­6CÿQ{Yh…bß…¨‘Iè¯Je,ÔÄ¿ªwx‡Í¯d¿c·YÔ}áên‰Ùá€TŠÀø(`˜DŦʣÊ{ÈLêDP¯*âZU×ÞÛKÖb7¤U­u¦YEѵ8æH½–js¨K]<¤jðféïâ´´<Œ&ࡠʺ—ÛM!ÛJ˜íeCi´&éÞt¼Š™®êÀ»ìß"œ1Í6ÕäUâ‘ÝaA]Z7»ó|6q̯b¡ÀÎ%€’¼YG¤øyw±‚,Pãê¢lñ‡!øªˆášyP•ŽYaݳè€7-ÒŠ†k*AÐlÒ4â(×pÑ„O`!÷é¸ò^7øó‡ÝD—ÌésܧœÔ‘˜*ó¸íÌœ?hiŽ—Ø’'ÈLË_ˆÎ|_X"Ū!pÂÊ¢Û[WQ0ìDú¿¯a4›²šM½+ìªâØl[¿iE¯ÀýCƒ±$D|€œÜrÛäÊ*Ý3Pø,[…òQÓ¶Å®2o®£G¢ûÍÝ}6¥û#>HóÇ"×ÞžãÅaJÕip²9ytß#”ÕÏ@«Þl”Òxƒ¦ˆ17Ê¢pcÐeFþÑÔa ²J-ÉBÁ…Y½sâ Òùý9]¬ÛªÍxYç–m¸ª¼Úî´éƒºj^ºÅäÝq´Ï8bÀVû°}øÏ½ôѸâñ ­wú'11ÑÜÀ“ô-GÖ,ÓÖVÂL¢â‹äÔHû ©}Àøadk‚ùUYlLè ?Áhû8íã·<){7c¨ˆš-$Ï}}ìTM ¸ÎOnÉÈ“CL‰NÈuñLrÖƒãÕûNÆ‘KÄ«z…±·¯p EîrU}»=,ØOhíJ¡YôÍg°H±XwZðî.JFV9w2϶GÉÜd»0e[/“ÙðÃlÓÆÑgü_}Õ˜ªÿp™eßd€N6Q<û…(¬E?hbÖ§)ôç4äV_¯zQú5 ø-E 8\ÅÉþ¾¥.´÷ØN²)jwç@ 3Œ q|ñáu³žEñÅhŽÛQPöqƒ¶{…»Ÿg--â“>KxªõþA×£62‹“¶ë’¦ˆV[3„%@T…’0«•ËnW­0Pµ•^ :L‰Ë&%äˆt$>Q…ÍaÖÆ0Ov½n‹f&ýÕíÚÔguŸGí¨þ`SO 2e8!¥á"„¬ÒT¯;QOÍ“—éŸÕúþç˜ [@ªù3ÈøPlÄE…à OŠ Ù 3d+ËdÊFû§h¤Ï-±er¡"`ÕŽ¹$'ç 5Õ½ì ìFŒóðûñóòùG”à Ë¥ëò™| 'ÓV5hÔCmÆå>[¤¦ÙB­%Ø=˜Ìq€·Ÿ—‡ã8šÍ±~¸šúèKH¡Æ…Ø:›PÌBª X½®!ü`e+¨Ÿæ¢ìåa6fé¹¹t:ùµ^ÑdáfÚ…Š'Sè"å·±5Ç!ðò¼ Ä—S®$!×»Dj4Æ—ôÌøªÁg–é;DQõƒÜõB9Åë6t¿#DºYx•bÛ x4™|¼˜"=‰"ô„™ðLC¶Ñ¶k/sÓéÒ»_òš4G­kÌ7æXíŸ5›v¯¨HkiÓ1uZàÌ€i““œØÜ÷Ó̈£A?d›óÀ@-‰€19Ï©A ^Â"N“\ºåà²P6®‰Aª¦;¾I͈p•Y±J·;hß~û-2–Ç7Ü—Š1' =ïÝÆ³ºªÕwï2–å#U\BÜÝ"®Øx¹-àÍ=‹b R­žŠÙrX°Æ·Ú¸-`»oí€ó˲,I“ ×ñ £A{öAß«õ[ß›µ\kyqXÀydE…U’˜â/Mz‡ÈÄ€=ðÎwäâ:I^.¯=Gï|UþH®Aµ^cZc>Å\ü%Š€±Ü^þ7´Ã†P1‡(kÁE‡»ß-IH$”(@aM…!Öd}Ò}†–‰« ‹?¨ªŒKÿcÅóûñÿ¸²Â>Rö«kú÷ñˆµàÏ{Ñ4ºòÜóЈ¨a÷b€rwˆ^'€}Ì Ìlñ™ww—ÁóÜ.w¸ìᾃ‡£–wóÌdÕÄãú£I ¥û1Œ-V¥€EV[áŠã•Žô+B»¼RÕ#à è¹%›óïFóoöqA ·QG®ÿçõäý?ëÿ÷òl¾^†®ö+êª{>Š`ȵ|á’ÑxhyI°Ç5þ9ܼŽòöë«ãÿ^ËýBíRÛïüºß=ìð`©2©ÍêîG¡ô(Yýû®ƒ\ú?àô¾9Ïg“QÙ‹"—躱þ¹Y@Þí‘YÙ0òGÛëÞTw>Ƽb“3CA;žëQ\“ïfn0v6;>¿íîùb™÷öôLâO¼èÈ™›F3ÿb> çÃ(–ÑÓN2³pá‹çCÞ’n"¦Á•º!FâÃèâÁ Ï¿ÿqÍÿ¢{n£Ž¼ùœ½$÷µ‡ýß½<šýZð¢»_¸f:ö£OÑìj~zóɇˆM834ÏóäS‹û”Ïö(ŸÊQÒ¡¼4CÉÕýb4CÛlü¤§ùÞá)e¢z¾‚wF¥ÿïöýn«M*=k– ézó5/Ö(‹Ëy=*áyžGUÑÕ»•P»……šœ…à|äAŸ uô"ÐûÇ”ñe=®ù_úB¸…:òöÿµôü¿¶öÀÿßË#äen9Ä2srºóŸ`3™Í_ƒ :ž¨„ºx|»V¿¯Ç5þ üêÈ•ÿ7’ò¿õÿ÷óX·øpÎjõ· ‚¢"izÛ)8߈ FŒâFV]ÄB º HÚãsƒÂ'/4Ç‚‹¤eôcÝð3Fòÿª+ç…žBãÿ†\@Žýw­®ùåãcåaý¿—Ç"£Kñí’3WVÝ|²°Ø˽TY“q#KÒj<ŹkUìµ÷:ûÇ[ûÝ_R¥‹Ý¥–’M!¤S†èò¾«„UyÂ4Ý¢Â/l¢H^ŸnÅžœW³,Ù (iü"íb–Ì¿èkÿWß~Ñê;H]K“.Š˜Ã«Ê">eünó¯x>`…A&¼å®*ìáU‰UÃ"ûÒn}É-¸íòcs2El•’–ôÆ…=Ü) y¤£fîùh‹%‰Éþ>€äqˆö2 ·¢¢ø—C¸´œ¬C”28¤`ER$>¶ç ¡T›‘B$A<‚¨dë$œ¶›nåB>HjÂÕlù,g³éc„ëš3¼äü•{RY÷«¸_D¢9 ¾ÏB P–Êõšµ /"QMP0“ 2*®»˜í¤ûÔÀ†‡îkÅ 2 îëT×Éb¸¶]‘ÃrkMÊÉÉõëüOzNjVNÎݽÎNɬte ¸ú0G}d¸'Œó%iƒ?åë´t,ÌñR?ØÿõKl\뢮ìáÁtÏËW†ÖÑZE¤R—¼Jõ8C¾ºðÏçÃBDVjEcôfÐl3)]²á)/UÚų‚è% ÷AR‰úšª;f&-6inv1þ8ž|Vþ(ýÊ{¨Ùð΋e›ãÆpi«ã„O¤Ôn*µ©ëóÐô, ôaTUÅé]ɱîËkµà^C­P9üªFö1ùÀ«Áð…e$qÕ}Eœz´lª1¬ÿŽ«²ˆá ÙÄ÷:Æ,@ÖÔ: —-Ý@1<¢:[ì­*[¨·Z]ÒÊ‘&gØ`àd.«¨šJ›b&V³0C­œ¤ä7Rù–ÒþUÕHV¢RuÐX~f5“åÝ'Æ}L.ÀcBô¥‡ÌžpÑû¾H”Š&€³&|¿´*N—ÙÐîçâ]NÆÕŽ($“z›MËuDý¿L8ó¢nèW8D¯ÅFÓÑUH‡œ¥°Ê£=Ä| 1më—î_ô8õ±$ãÝàéx4T¹,üØHrôSÞd-»PÍ‘êÍ0r[&zóªæøà¿š—y~¥+0Òïv¨4@NñçîÓu‚œ¯ªYÎd´yVòÞV×=&·®ÏŸZFƒÏ-+Œô»€SÌ8·#Ž‹»RŽÐL(éæUŸ¦ºIÐÎs²_q‡¤`9‘”ôõÒ}“4îµðhŠlG<Ï!¡–Yµ†µ—¿;2.|WãÆ­ïxCá#ò¾­]ÇÎy ^å[Ñ+¦±Œ>v´ðwq¦º“ý©úIì€$ŒvDuæm–A@÷ëHd[ê•Æ­cÐø™ç¨¼÷{Ît›ËÊûèr Sˆ‰ÍyML%×Ü~ÊRâÞ‡¨I^Òý/Dæ1íoáɺÿé\ã“wþ³º–²ÿ¨¯>øÿ¼—Gÿð›ŸèØç7xãZœˆŸ@š 1O^ˆÜòb¼òGEéâ#ºn÷Ïè…k§KÌé*süߎú_ÞøßX­§îÿ¬¯=Üÿv/OYfGØ`=BAdðøÛÑpùµåºfž.üm×Êñc •muyÕÌ–šyh^·“]Ë›Å,“œw9­T=m²I«FôÌ’ó®9±éÑ/%ŽW“3úGá±6ÃZšb]NEøÔëŽlðÉÊn}c0Öðz–ºc+p‡4Z›(O"¤^uÓ}qþ%–oqrí—¡¸;Ï•‚n‰ã…Xn§S‰«ú2’3£ì ýy:EjK $sߘJß™gA–3‘/'Ò®¬I8žØp)Š&B8PÝøI à Iþ® úwv2^³˜×4HT¬mºàßyé š7êމ#} !<0s¨¼O—Ÿ¦òŠÇza!‡KK'¦"q kòM\’‚¼ K{dç.á<ªs’™sYNâBsšÞ,‰"Èõ<ï°BK\O‰I‘)ã^Ñ¥–+#‹­¸¡Í5Â]ˆ.ðÆH€@^ˆþ7ôU…[1M¸¦\®Nw¸Ñ½… ÇÚ-š‰6p<{fsD7\¬€ãŠM)bçWHúÜ™ŠÏeª6!›Ší¤F#ñ¡NŸ©+Y5Îü©ƒøµKZ(?‘üòÕS’òõ›z_øŸ@+è“ͳеºº÷…=E)ò7¯ø%‰ôOÆ“õò6ÔŸôàN”[0úמ<ûÏõµÕ„ügu}åAþ{/Åþ_\©˜:Ïz‡íÃ[dBÍ×’Bj [ât_Kô›Ãî¶îy€ì:•ú†Cõyo<“†i2RÚ&Âu«ÑD˜©>83°83øî|4Æý'sœP¦S×$ ³'ç=Œô–40ù »€dx 0Þ€Ó[baÉÁ ±¥‡`Kj¾é·f‘q–|¨aÍÅc,yÐ?®=“ˆº#O Æü¯U}›u mÍíÿI³ÿX«­Àü¿¶¾ò'í6p=ÿÇçWÿ›Ty³:rÏ××’ö?ÆÃúOÆÏOƒapݺì“ž× µÐ͉>W;Ž>oÊ@– õéž¼°¤Äɱ7µÚµ|‰ú¸Š/Ö;ó¡þ ßò,Ÿ‡ó3•§éín@-·ññ‡SZ)2þoz œwÿ{m=eÿ×x°ÿ½ŸÇã`«K÷·Ã ñüxÃÍÙéüÅÁoƼPÕ,ù´éD¿¥§‹e›2x²§|“/0H6ç"pQÚ~¹ÝÁà6ÜÙý˜€cM†áHå1hÀó¹àÖg¯n1¡’²É 1«&@ã²a–# tŒZMÅ! Œ£\©Ë¹„ØŒ{$Gc””@CÈɸLåðõ^彯_Ê|#ÊOeuB x‘‹Ï­r2ŠëÉR%ª¢…°çýb›‡úôUZ×¼±ApFªÍ&˜4UéNÔ}DF>ØÓhæÃ‘édYÐ,^ŽÌ¼FëŽÒ4Ÿìc›º«¼î’«Xg¹S‡4ïìf.d…#€2iC[yN5EMÑÃà‘Þ*KžQÔdE…sr°¾öÓÉhö¦Ëqxµ,Dº‡â,W¨E¾Hê©B'½ˆ£íÝM‡Gð¡Ý#Æ{½üÿÑ–Î?ÄãZÿïÓÿçêjÊÿï‹~Xÿïáyÿ=ÈÿnÙ™©áuÔéÞ”¥•Ò>)â3åz¦0O—àéb»”¬.% KH墸¤üí„n¿¡'kÿ'zâ¦uäÌÿ«kµ¤ÿ·•ƃÿ—{yì3mÑÄl/urÂXÞ!N’±f¾Ì8x|tGN áM›»ŠÑœ9¹%={Ûo(±H“•šÍ°˜¼XêöÎÖËâeïî¿ô‹§>ØÞ.•z¿Lêv™Ô¤¡¥¨a‹`xayv 㥃Kýf§{h­t§» 9´IR;‡q°aOÊR4ê<7Û"7êËÎtÝWÓuÇ§Ž„‡Œ™ù‰:éøåî.̰yÔ’äW~Í2Z–LfG¾éÿÊ’0à)7nï‹ÂúglòÒ’h-„jWü8‰+LcÁ•™Žá Úp¥%$\QBWZ"ÀfâJKò+ÝpÂU" oÅ•–p% ÓqItRœ_i#i~¥ƒëˆbxá1©¨ýÎOÝÆæ²xWÔ6ûk‰f…ò˜T¡w~e©ÐáŒr4`»ý²Ãg‹úÇžµ@ÜØsmv¶·ÿÖÝÙ²´ ¢:f»DœðÃcHB‡I>±þB!S†NŽ0L2§B:ÏíF …lºXB&­<£(Vdú¥½Ì£Ma(|‘Sê›dR 6k&-Ï£"yØ~C‡j»sÈ«’'öùUdèìïï"9—1Ò€h*™LxëÍë×ÿt&ÒOp Ný½éäA9‰9ñ“¸´º‡¾fQCßÍÏÎÀ’úbÅ~Ï?ÎãѰ¯»‘|Ù=<ØînvR1ÖÿC$F&ñ…öfÑ6lÙ'eñ¯ÇÆËÍf¶oüK¶òùÿ›æølÔW“ú_+«üÿ}„]e‘ò‰Œ´kÔ@“ò 3i…D9àÈ ¤9‰ öä–ÄB®‘H½Ý;‰F|„/fzvØ2t.§"ÏåTË$Ä ‰<âüòà’žE‰Gòºñ#Ûø'r’ô$•RÇV#¨§€wV¼,½"]Uã“pÁÛbéèÂ÷&?ï·ðzõ^|Î=*ž£Ñ€YY-ö﫜·xEP|ÅB‘F‰ø2›èEÂäxÆ“iëÕvû§Ééi8¾† ” ÉË=ˆF½«x4™« “÷Ù¤GÉãÁ^à ‹qÿªX!Óá4 JJí&ý–<ýœ²a°<¸8?¿Úžô% ioqç#tŽ„Æ*è°ÓäÔ¯W@çæ×î6®×Â%%|`öw¢@0A‰S*SsÖ{´¹Ý~Ã&ã)Ík¨Ç¤e3s¡ éH/MV±ÝAòÔ‘/¦Zå >ãèŸ=! ¥À½ †7‰ƒ›º úd®„ŠÍÃÛëF1¨£GZq¢S¾;ª$=Í[}Ô¿­sç÷•·ä£¾"[&¥]ö¢E>tž@õè…A9Š)㨠Qä$\K…¯è|Š#Ú¯ÀkETŵׂùù4DEÃé$FE¼–¯éØ]«4ÈV7›(‹µä:­ŠJ?ó3VÒ‰ÿÄïÙ,ŒéŽ•ø#(˜qÙú?+Ÿk!~.ƒvhw<§‚ª¬e+' Vl‘JÉͼXQR/m¨ª€ûCüÐÊ@l Ï&1¢¡â{Ô:nqï ð%KOBÈŠ©Vaj ‡HtçÃ9T^%;‚c}ò©ïCE6Pž¯iáQ*Ã>öèõï `Õñ0îQùް£ä”A3Q YF?G›¤3>æ5»X8Ç PÄ:žÏ®|Ý×Á8F6‹ø! ´ªÆ]6›bO  ñÔŒÓÒ›º|ì¾îøWUy|L²`KÍ$%Ö꼘ÁÝÉTR Tùk%)RÑE»<“‘à#"ö:èÊrEo+8MŒ®¥¢Õv ÔS Ä®£©h±ŸÁèUk4íc0ÁZ*Ú[a‚õT‚ýN[Á¿a˯•ÿÔ Qp tešpËaÈ_®PyÔ“9²Á_S%Ú&1”¯2rŽlr7Š7Ê4<ÅmÞ© wþþ¦½]Äý<ªó¼ÈãPþíÎÁÅýÄð$îª!TÏ^†ê  Elìr#Š7ʵyÖ›¹òÈ}m(Þ(NÁynÕ»ÊçÆ®¶#Õ»ì8óuäätŠ·"!BJ Ð+®ä õû=Yù}ÂùQŸÙ@ÕÂÙ¶9•êTr Z Þ ýH®[ «Âצ–¢#P_aKAdöù‚QÉK×ÇÅû\adñ-yìEn69Kä¦Ô¦~q…Ixáô‘ÌgL2'…ЬgIêxfsž…ÏsêÔ¼ –a€×Ys#â,õND{éýTÉcvlŽN”Âe9#FR—7&*Rh<}£«ð²Z„´d¹²’‚ÔE—ÁdäsSX"«ŸÎ«È¬|¡ÉÔxø@;¸L*@hfÎ3‘q”Î9ךÀ©ŒºY쯋+‹@zÓšE'éK´¾eó‰Þù$9~Oò%¸$“:ss®bæÃm׆–CVT¨€öŠ\‚¤‘¢ÐE&áüÙÄ[¿ñÙ×:Óýæ§_J«®l.1ÿЬ,òž9Æ¿qê5Ң.|LðizTs. Ö¿£c8h]†úØSX¬Dó".Yï⎑XOëž—wcAà Ù·³0¦D J6@ßõf7* H@ íÀ§fÍFÆ-ôbfÊ/$5? ùÜÜ@ —,Ë~ñ/àò+Y+öžÕ$Z‰ñPDa,ð"[ŠbZlwñEÜŽ ’c;Ò¢ãá_¥á5ïïÒ2 »¢pwf‹¶â^j•˜QÕÞTÂ%¯‚¶A̯8âD èÙfSDéÛ*y8ÖRË1ðGï¨f}Šån‡)¢Ñ¨NÞóšbÁ J‚K6!@Í1÷â™á€v> rñ´­\þIœÀå5…£óËYoÈÒqQ ‡éƒrŠvh‚VÌ+|‘§ÞC~¾KcŽ{…CnêÁjÜ_O¸OÈ g=Õ9SàÄ‚§á$ ÒHC$ϱLIÒo$v™ÌÌöq`ÜòÜŸ&|I^óÜ æ›z bO>MÝ-| `™»½ú·ªÃ¨¡ÛÖ»Û!]ÂÎ^Ä/ ïî6ÓäYÈ?¦†«Ïo„¥©Žò;Ï¢X·±…½oŒ £—H*ÛCF]p€ º|„÷öËó¨ê_Æ¢p%¿ÛšŒÍñìÚóµšgÑà¢ÁTÒ‚KÃ`nB|o¶p£w$\¹œj%²áUðWªhkØ‘1ž(1¦Â0¢Ûh"Ûm4ZŸªjJä‰dÊf3+q0oxM¶2‘׆+Ö›xôyͮӷ¨ÁPïÇIªb^èOF£¨‹jÚÎ Ü‹¹’¹‡l*Bò9Â|ÜÚÀ–8¦19‘u-ž„wÙ`ÚlB^Ìš‘ §-Y ÀgMC“"-oÑw•˜|gEÐР¸L¤LLf°‚1$hã_o<ÅOã$­Š¶c«½,LFÀȦ#´9‡b)v4ÈÌ–hÄN{yí6Y)É€–Ì/¦£hšÙ™ŠÐe,ÀRâO†cN˜:Mi–:0ö¸ï¦Aè©Ë˜Ž9)A‚ÁqLÃiªÓ²ŽmZÛÔ4VM7OÖrмœ2‰(TŽNÏÐ! 0R `t’`„ì4!™ÖÑð|w@+J>3¤–Ô¬:¨ Èǧ÷üCí£J1GË·%„^Ò9GIvlN¾ÿÞ®Í ÝkŠû|6E “>œÜ²ÖVÞK l˜ö>L&ƒ—³¨÷‘•0= ÖÂFNØNxò)B ïÅùØßX ýyïÉÙ ¼ÐÉ•ßÐ i  W㛕¥Öóó+å›oüJèWïs>ä¡ÏU(?E…ÐfS†&sŸ‡.Ë@œú[¬œqT ±¦ï¿—h!ü]E6 ÅZ–À‘¥ª²|ŠlTžo Ô3‹úàò]eúâÈóUå9éÍbž#fÄÙ; ë+UF#€âGþÿÖá•e»®ð°ðbLH—Åô`4Š¡¬«<+‹·d$8ŒÛ£éYϯTŒ£²kB\tÁC® _œ1V/ëõöÁÕ9×Õ"¯µ¸ãŒ¸eg\>% {0¶ý¾VóæäœõôåÿÏÞß76‘#‹âðù7|ŠÆ{î¥Í˜, 37¬¹›W&gC’0Ì9&?Çn'½ømÝ$C8Ÿý©7I%µºí3{Îsñî»»T*•J¥R©TJÌþ¨ºÎp’þ×J+é í­¤¸R@1µMR âC狸á2yPD;+Œƒ¾ëbƒ™y) ãz`H8ÑŸÇÐýKh^CêG¥Â-?ªÂa©BCTþ[y@õœ<Íì³è06"j wÇtr¤A—ù±»D=Ê{·Ö;N`¦ê-e«©èê™ _Q¶ÐȆS¦¿Íî¾Â ˜U®‰´üó3=DØNƒänc^¤­L,*Íî—K_y…y[ØúM•Æ<¤Øgy¿á}Õœ×}gƒq÷E€¼i„íÆeUÐÇu2e[öqüÖôÇÀúî12‘iÚëoD‡ìOëû[{f#S5ÙòÚtWƒç/U³qúu½ÊÕ¾hé~h †””Uá3¢éÕ:î7ü >³¾ å üÆ|v$á³Ø q³(¿õ[ëX/Í>çÓñå$Iq±…£)A:û£¹69$ß¶¬Ž…a¨Y“É•AÀP®Býf…ƒªMˆÿú¯´¦¥/œq½¶vÕhF ¡C`”·¢çÇ£nÇ¥Œ¹Iåþõ_z2ù ˆ3ÐñŠPÓY¾›†rñ¯n%s­ ßr&4yŒPú„£g!{Gв K.J´a\eɆpŠƒ’¼ÁH«"\ýà”7ž¨Q|/•Õ†qg⌒õ¶ åVÆŒPÓ“y]F–pt.Ëw*m¾ ÜzÄ]Õ©§À­OêádQ6Ê­já(Ýû&ëP*ß•}§ôüAÅóûÏAqW¼éåï+Þ´+žÿåYÕ‹ŠçUðÏ*k¨|QYEUÿUùææ¦âÅÿþß/~­x¾VEîÚZÅ‹¿V<7ÑÄßÊM./ãÏË’±Õüe@|2Œ˜L`Mþ«ói²yùÆéÀÊ¥ßöÀuÇŠùCÚgŠUãöÔ1R¨±¬Áž9|*q@ðÛÐÈݤ®miPâ—?}¼“äWs½_ ËÂæSâ”&2š«KèGï¬hÍÎØb6QÞ ÓåôP.´HûR&tŠoߘ‡ôï䀳ÜYJÜ"m(j'Å6KËÛ®wýJ%9ú^*}ßP¥ïƒJîx÷9}Í{xÖÝ@ùyÚ€-yÒZS HCºr­Ù{&ŽÓAAyäŽ4lˆÞ*óœr«€½¨{Õð‘Îã‘•$¶‘`[iêµ6XS¡%僯zàÊ&rÀJ †÷ E±Ïû•—Ê8C|âò¿‹oœ'G¯6O^mKŠ–Ü;k«Ý½ö´°ª<˜ÌRvKZ9âᬢRÕq·®Ò.s9¸­²SÈNmÃdÃßo–õmÜuîÂj·€é’¹î…´ÙÝ$!/ËÅ-wy=å1¨´KíÖhë«:uñjÿc:Èóþºº:©6Áª¾TÛëƒÃm¾Ë(ï• Ì@Ò0+LÜ?€µ7NH©Í´J¥}Ä»û›{¯¶ÌˆäÕ·Ó\ÝÁe/óè2A¿ß×Âí Sâ¶æ nû—ÍíCÌhH•fgá™U³>4ggy]9ê²")²KÝñÓ:n~•$É}lø0KBöÜÁ@ÎXòp¹Bp#V>Ã*ŸáF.é± ÖÚIÀïÝ_˜W-ê ß°P·N(rL)…~7Ú{€í¨ÝôVøÀÖòŒ d£±%nŽõ£ÍŸœ(³|i÷"Ÿe1ýÎÁŒo9ú a·mû÷T‰7¨ÓmæØ%ËËÁ<ºspôbý$,l≆ò†Ž§CWåÎòóx¡cÁÏ·Kœ)@Ewγ7ÐBÂá{\*cRÒÇx¸¿þ¢\ E"”aý Áß‹±§"=t|¼ýbcïßq¤T¬SÙðlp)·»Ï6ƒ©M®,KG£rÕSþp0Õ.NÝ íù­íW%1nô²³Ëó¡`7¼:Ú,7nš¤Œ"e6_•À»“ËäáîáöÞî~»¹ 0&ë'Ûû›ÿ^¾mPJ8”RÛn 0ûÙ}ú»^@mNÌÂ¥ŒúóN¡ïbbÙ~iðä½{>ÖAfÒ¼gÛ@“->xÚ-y· oò¥]Þ¸ ØPŸXøÑ¸-_QÔ‚ÔUE€và—šbAvë_“¢¬yϽ]ýÞ(ïóR‘¯&x@ê9œDÖ"݆ISÌä¼1_òoŽ „ü”ÿ.•Ì/t—0iéÓ†~½Nù;ñbr×e× BÍàœ†FÞÛ=Á‡&±ZÍ Ç'œ*Ç­®lä §§jÆàMÔ²! w‰*ð*¸ª°e©È¶Bcr9…&om]Q€IáÏ«òyKÞsÈr´Ëö=€vôÙUIwú³q{R$Mp®Á, o(xl¹ñ–%³õy-Àð=â–¾çöÞ<1ôŠš ¯zul£ßc€6D÷§›Ô9–ƒ#¶ÑQ£ƒcîÒ·'}×U¤)Сù“R_rßTõ´î9E ‹ÚÖ?à}õ’ø‹®‚E 󢫚 _"">WãŽû%Rº˜´dç VTFñþV]»äõÄZR…pÚž´ãªjkÚ?81騠àh< „§{p]Îr—©qìúX­ö]TæÕ·}|bd7kMîÝMt+&ü ^T,ῇ¯F&(«£È]r $®ó·pP9–1©¦O”~—”¨Ê“m¸­«,CÙ̥ҦW)užy"¹WN£Si=É稼^VË«¯“UMñµ‘ßlI5‹ ãöâ0q:Q*Í»I œúºÍ°p¡P„N¦rû&íÂ`HB¢Á-è3›"ì¼lŒñšÒÎJ ÿí“óˬqϽÝ2OÄLIV D×FTŒãç*4ª eÛ”·(¥±©ÊäoªÛä †‘j?n°­ÏUíÓ;›vtUö€"«Žïõ”Å)ñYTÐaQö8¹2»MOàÈsBÙTU'©x‘Þí¿©è&Ï_±üóD[‘®6$âáB#gòpNß:ÿé|2 g0¾Æ²Ê7C EãèBQn©X4ž,‡0ÇäUébªuVµ$9Ý[ìûiÏÀÒ;+ZAjwb‡ñYçe…牪Ú)± 1*ØsïÓw-Ü’ž}L Ê‹±@|{®Cؽ§S×ôtŸx­5ËÒnòéÐ~PžªÌù-“ÀÞäœZeTãUw¹ ´}¬Sùm¶Ì6ÝM 'Y kÆ&gÃH†ÜP&*Ý–“3O¼¥n_¼ÍóÙ[çÉ Þ¡sÒwDZ¿¯°')ß«Á^Á»žG^ïîŸØ×…5Üÿ${×nÐM;£óŒœyÖ,ÉÍF§¸WÅuYÎLt±ÃÕJg5¿Ô&¼FH¨ÔXŒZæÍÛ@ØÕŽêœoÞ†a™7 Øe”£ÙV„×Í«Áe»ß”ù²›_ùS—ÿG’?~qÀ9ùÿV­„ù~øþÑãoùþˆçÿù¹3ÍÇ— ZúXs[;åö)ç 4w³.˜!ÐÜ:5·¼‚b®ôlÒÇî—+Ðät?x;ù˜¹ä|t~KðDÓxÐÄ­’ØÕÓU˜°¶„JðÇI³k`U?ø:U÷ÅŸO¶ÑÔ ‘&»ËŸ#5…M`ÊÕZ†Ž¶YŠØ‘rAËkïçö[. ‘Ëe?Ù,Fö2(¦DżžÚ—F,úAéEƒÌ}L‘>÷Aá9"÷q»ÜAÊL¡ÈxP¨ó Oú¹¦[ ¨'>‰ß$îÍü«Z“â\]D¦è°û3¹íÎ*È`6øÐB\ϪðYÛß Œ²·|&¤Æ®–¼7TwËžLˆa“1qaóæ˜À\*±O‚,£Ì›Þ…ûDôá¸PÚ Þݸ Îøk\ñ¾*à˜ ¯çHäDP 7öâhV˜îæß&´¿Ôg7·K§YDÛcðê58+™´76þvæ¡P¤¦€?SKH)#+È™YA²–BÐ2" Àž.¿mÕ­$6ÍbˆK&\Ô>š[XDz“EðäšåLÒ“{(]QœœTiJÅ¢ø­˜"swÌÆ^«`]’óÓ Íõ¹$ºUUíÄz0&^@y0*+PÁ±Vr&Hx¯WJ‡É:ßÅür‘€Ùê‰Ä+™œ™ä51œ¶E‘´ÑÖéÀY»è¥´&©š*¨Ù*ö—CXVUO%¤0Væá"ü³ $>û[óK˜xO,ÀßÓJYðÂ=±€{àVpÑJ OªÍ=Të?Í,Í´ä1”¡Yš2úñ CõÀw x…ùq$|Mž¨"aj¦/âϹL…¥¸?å{ôñÐÚ´fk>ûŽY¹p/°g~¨Í.E%N<|hÅÕäGòÕ®g4£Ï5¹wC7xÁö¸‰ñSÎ=MþxêÍÿþÛ’5û_çòÇ™·ÿ·ºòð‡Òýÿmÿïø¤r½SqF ʤ¸Í:Wö¨[Ï1Ëgý<[&ØÝFÎÍ:xç}ÞMÏÁæ¿<ƒu1Ø ÈO’rö<ß?ÿ¼ÿo0ºfÙ“O ®Æ{‹Jñ$F’ÈN֖بN¼L1&A©r%·ØÊ\ª=HNùz¼û‰÷ûNRv@9?OŽ ‚èûù¥øýð%*´ûäì¼m±ïgLAì– ~/¾<|©oK´/+ '  ürq_ðë…#Þdæ~Çûî;Ãç›%¯´ßÌV¤q±s=ª7&6âc³;h9i\b_€%tAYT¼” íëŠC¨´GðžSJ8vX_•Ås:žD(—”ÆîÈgÈÀ‰‡õ(lv#B1Bäºÿ]¾¢ •€È ¿2ž*|#‹9-³)¨€[j„Êe`tI6¢H÷¨× ‰’b’u-Š¥VòQ×° ‡â}6=ƒ±=¤\Ͷx)e`£Ѱ8¾Ä.Ã,F‰IcdѨìEÂ:+NœµÈi‡¤Â&¯$ÜÔK…¤isȯ¿a•!2•éϘÜÈbðs¡~¢dDYQ8ÁÑŸ]¾"‹Bg*¢N¡Ea— <µ-Í’tD÷›‰S.w “æ#C4uˆG$Õ$3rÂg.m†Y3Xtš£jD,[”÷ht9<˦®W¤GX‘ä:¢µ°k̇lúçË ô =7ÂìGPÞ¿ïÕ Ð²ÑËúù(gé<.•´JYƒæÂqvy~®%ÜËo¤¦‡ ›ïHuŒÅb2aC&—åŽu"2¹Œ"ð!á,(ù|T€À&FŠaÑ©‘PÆ8#RHvŒäJ –.s§s[\½F}—Ǹsö:½L 6#EëÍ:Ñ’â”–†ù}iI9bõ¬ª©¥Y'‘å ÿ*M8aå:’œ(Ìæ„s;17”(¦.‰6ÇÞP@¯é~²å*X¹p‹µj€Åµ‹×m-WÊ…g ‰7…U€ºû¹ì°™û¹Pš=1s?€àí\1s?—W•ãl’$"arY ,s;ÚÊ-©C‰ãq}ÉV$OX±&å:­c=Õ—±±;ªP Î…êÌt9˜’±?š•ð5c°p”];!T5,G†„vmÑþ3¯i&êFàb06¨ÆÑªnvóúñ­àMЊ+‰‡óBmPìëqJôŠ3 ‘³1ó‡,Ľ²‰"T¡(ŽN¶×ªhàka½Y#»rߋ𬫸%`qFÉ50hP΢CUâ\\CävKÚ(¥EüÀÌò# êÊüûhÿ>yŒ6ç1訽mü¶uðjcoÛöl Я·PôÕá¡ýæÍ[/\>3nÙ6{QuŠDv×DqIÉ93™Ýgóf¨8sôþY©^×X5ÉìjóNVÑn/‹úì}Ic«Ý¬è|#›STü=&÷Á>ãeÒCmû¼XÓ~—Ês†¥yq›¨ÌÙ¦b:c#ÑmK1H‡Ýˆ²svU˜f«I!‹Wj¶‘J€%HÙF¢–º³|Ì´v"¹‘dáWeJЇ‚y©?ñ£I"»Q ™J?+†w¢6“*Þ®;|Œ¬NvêæãDí$§pm.‘vÿH•«u›FóaíÞ‹ &Á²âVJ¢·|œ÷)¦øµ7€0‹,;3óÍžŠï«¢Ðì¡„¾4$Ø #KŠáöþ‰ïÃ$/NæA³õt5ïa»Â2î=»ßbe.˜Vm ½¤ö6úq¸™ÕÌǼ·†;Ÿ£¼û—·ø£Ê倗讉òjÍÆök|gwŠ5;{VÂuÇ—£Ùšóƒ´Ðm‚¿[°pgkY4‚_ê8?Ÿfç³A¶†ÂX ëÜÎåÐâ ÞûÖüäzÅøp ÜôìŸ3÷ ¤ mIóLÈó¬õ·´)ƒ4š~. õ®¼Amñy„õólЋ˜Ø A@áÝí½-ÕßòÞìbþb”Éh ÿd=l@ÍEäÐU£÷kð_ —ٚZŽIÝŸBÝœ$T ®õv·N~2/4d÷Ÿo+ßáH¯=¡Ú߃}rx²À×5O3¡{çÐyn÷v¢3 ¬EXħÎל˺5ì&kÐLt Òmã°újuŠ!<Œ‰±^I÷¬Xóü1Ÿ*}“ø¹ô0-à§f»¿WD¼)W|Ý„’x»Ž*š{95çeÂÖ4&‘´E|]³u3KáO½†`&ÛÄßõÀx%Κ Up£1ê:ç•—ƒAÝØ›×Ëëb0ž-T/Aw‘s‹@½|!8ã{ò`“J÷±ux- ²5³sTþhñCNñSP;{ëÏAkÞð—~_¾åN–èr·Ô“áj cu{oýßO·ŽŽbuß@ Pz¿¾÷zýßë NÖÿ¶½?§Š¹0»;ä¼Ef÷‚¢ª-ê»j«ƒm' 7­ÿL€"^ÜuºïÈa‚a”Æ£Ó ‡ÕòC†ôûÀŽ6Üö$ŽÂ—,† ÿ ü‰øÈÐw²ýËÉø€6"ãÌá²Ê\WDvÝzƒ‹™mÌÄÅzxï«• ‘ qÏn{ ×ÄûüÕ#ë3Mãä#Õ‹^8ÎÊ“”¹P•ÑȪõxèÕz˜Íƒ‡Ç»'Û›ÒÜâV§7_YemLA¶á²bMmšaÄäÕnQ\fl¤-²EeüüÅZ’š½Â¦›™Ï=ß¶Þ{¯oSî+ê¼zvÐ##Ù}Ã+­0'Šò_]wYÏmïñ ~Ÿÿ­œë¶·×OJ…¢¾fÛíœÖh’³ˆ«­¬ªDÙc¹ôµtö¯;Ú«Ö¾öí©€Æ˜˜Æ´äiÆ0yY"ÚW$²D„x³r± þ^»:i ––8tÖøŸO”w¦®vðÊ·Ïj㿾0ïƒù̉ÿzøÃj˜ÿáÉÃ}‹ÿú#>.õgvp)üÌ ß‚²Æß‚²¾e} Êú”õ-(ë[P–jÈ· ¬oAYaåß‚²¾e} ÊJ¾e ¾eY~} Êú”õ-(ë[PÖ· ¬ô[PÖ· ¬oAYß‚²¾eI+¾eùŸoAYß‚²¾eq=ß‚²¾eY<ß‚²¾e} Êú¼ ,/þçEgÖ½Ø'ù ›þù«Å˜`”Ïß_uÿ~lüÏ÷+ð|å{ J¾ÿjÔ|þÿ©éÿYVÌ ñуólôÑ`sî{òøá~ü×êÞ|»ÿçù¸ø¯ènÌøåb¿0h€T—wwÏ«Y>àkzäGÊ_›%ÈÃCÒrüúpšÍfׇèÏà˃°(Ç1x…ÌýBª¨½rH* ½xn3›šF¤1:è[8§Äš&ßjAÜ…DúWP&àÉ‹MlÓóå›Þí5@Ÿ©œ~-{7Úd¶dñNi )÷¿] ã£7oé©)kKº#}ûîfû¼'ƒbÊ×þx Px÷gÒ€ï û¢—õ —&ö®›[opE›6ÖœåSÜêoa‹þ¾m6k(Œ`£ÁIFÝ\tKÈ2®ü7iãªÁd5[iãÚ|¿­C>ocïl·†Wù¨?æîì²Ú<6ÄBÛy¨G“)Ô™L/x×Lb/Bærçvb³½NZÉy+‘ë6ôµØ»|õÆU³Ùdd† DtŠ_Ú y S Yv5KY–°¹µ)iI¥€çׯŽM§×ï$^›¸•RÄ@bOXé‹ÍåÙø˜mdÀÒT;’Ȉ~ô ®½ºfw+iÐpõ) p3¡ —¡>úˆT·‰tÄ܆ÿZ„¯ÈzÆÌžm'„ª¥h(]€5ÀѸìÍzɰ8§¤·ˆ Øn$麂֤e‚¤ºµcëªÉÊí¸±à·Í pJšÚ \•øÝhCÃýªPƒwgȹț4wò‘»· äd%Õwn£@ÚnÄ.Øp쓤vt¿At-üó¶Ù¢Ü¯­ä¡º†ÕTß•ûE¨1žZEñÆA¬TðèóIHt=õ´¬[ýg¨ò鯢îñgQç×t;*y°Ñi´dK°qÖ˜Oç÷ÿ,:»ª‚+ŸÕÀU¯§o\6Zº ü¨‚O*¹a¢uÞ0[ZøÏ&T¯Øc†ê›PÚŒÄxͳÉâP%çuá·îB˜3߸¬ãkôXêË# Bï-¨]D}ÉÈøÍV¾)\»mí¿ùµWÚ˜ªØ Füê-ʆÚâ‘WVX‹´ñëǺ ïüÏHÒý;~jÖÿjéÿe‰Àç¬ÿW¿ø8¼ÿ÷‡V¾­ÿÿˆßÿ»‹ëñ~§›‘•2Sï']cÏÆ HB6íÌÀfÞ#ƒ:¼~ýdó§ÓçÛû.“wÕ}ðI°ÆWTÝô»{ÛG>Ä^>{ÑÁmJPù§/Ö“<&Gïß²ëåñ´wú.»æUø² «öÏ£uÇ£i6aÃúhû½ÆìbSð—ÝÂåŸz¿¼jgf?Ž)78\lÛ™*ÔeÇ£÷É=ÊÍÎÑšÙí~^bÙtvœŸ#›à•®>x-°‰¡¥†R™Áxüîr«„Aý]rW"V ”jJ…²áÄi® Ì­ÒM$o½Süu*«kàÓ2»Ew># —øªÃí[o!®®5¦Þ!ÚÂ*¢xÁ|™¹†XÅá#X?ZXX”ZTÐüñeþã‡Ît„ â5sFŽXUÝ~”A#ñ`|.|œK+z‚ ÈÐÀ> sýr]°ò§ëyµ¾ÆëuwuÌ‚$¢¡ˆÖùª·kpÊØ7ýÂȺƒî¼Ã`Ór™O %=pbVàT8ȮʼÀ2´¥ó?ÞxXlþÿ²ƒàõóÿ£ïøáQèÿ‡ÿ›ÿÿˆÏÌÿËdÀʧ;­e¼î4Â"®wÑ?lœmŸœü;ü³»²-!-e/¼_æÕÉî^ÒºÝäÑöë£]‹—Ïp¡Š´Žuçßw¿ r¼c©¦5KĨá‘°~³©`Ê©—‰ì8øÌcS£Õ8ûè]¶÷×ÛÉä=ŸúO¿ûwæ—¿ûî[0MåWðØi°Ut+CçZ·ìŸ”ç¼Û­¹j5$ÍÇf;œ÷Ñ×—õòm Þô”nÎJÊ®Wuo@êL³4Í[§°Vÿ;üm æUÞú»ºèç•Ëo³ è!d Ñ]œÞ8$å,ë§™-¹ÖNÌÛä»dÅÃ3iÞí ÖG½šqT¶®‰*ÂZIÙßZß;>À ÜÍÖ±]”Mw5©ã'ñùH@·¹ea2N,«*Û3'«+t‡ ×—Ãû9ÇÀ¥5€äÑ^§H”@ô||7µß¬/›ó}ä”i%mAûL‹6½ýäuÔ{ÅѬH]¾«Q3û…Ä‹ùî2ûZ-<:ØGYocÐ龃_;£”xæÖu‡ÊÍ ¶ù¦$%ì;&@· ¿æ/Yô2Ã[®x‹•Š›ßÍjÅCÂ+½Nñé ¿N¾ðá¶!õN\70ýmtÑZ_6á°1°jyyù“¨Ÿf_‘P¬-t;ï†"ÜËlznëƒv˜ÖŒFògáŽê-iË©ßöUKZ÷•V”ºn©ö3ñV ¢–ñšg^`ë@Ma]üõú–DœN[$4‚ö¶«*C@SaŸm¯ãÜšº¯O[½Þæ¼¾¬CÍ?vÏ îørψ’0¡]¹TÒbìF(EâzBþÔ¶Ï(Ÿ·¶êšO~ Ôì:ÚÁ³ë6;Uw=ôª¬-Ë—ê^{ÅW"Ź;OÝUÛ±: !õp•營Á²­»¯Ù&Õñ¡D%ÑÑ\àÕç©W$à+èV¯ÚcŠ·3Õ¯/ªv®N,>N'QÃóŽ@|¦ ÌïO³ :·HômÜ&  ÿ¾K @–ËävñZŒHÐ9MÒŒ‡(‚·j6œ#j?)V•ÁÞéõÒ»ð J<-_“z#õ û\ü'nÖÿ +´VíG¼“sÿï¥{8éòMøM÷m¿4?5“ì©W!ç³ÝY6,ˆGDfgÃro¡çQØç­|ÓÐ@Fs‡¾Å¤Æ·ýÞŽäZnIh7EÁqfÌ›ñ£*þ˜gПcé"ÒŠÂØ­8Ó´{u»[4Òã‚b€ŽAÍo\–Õ³ì´ñkŠ‹+ÆcÏäøüÆP #´ªñ ”{$„ZK)£sRÛû?SÔ6šEkb‘ xˆÿ‡âe‹5„UOÍÌÔ;Çi ¸ +>µðÄŽ9þœeàÚ%ãH©¬.ŵ· ]©ÊãüfDÚsH)ý!]_öÚ¥l‚GD¹¦ehâ ©ÆGýtËn¤–JÒ3&=‹’žYÒ3ŸtœkR×µô[ö•­H1…yüäò~¾ÂÌ@"•ެªÂ&´­§j%R* y9ô×ÐIgÔ+š-…(¯®ÛˈhÐÀT8{+\£¬˜eÔ­=fq ä)ì^;jH8mUH¢)‘Câ1Ša‘è"%ƒAi¬$xuOFzÕNÓGCÅÉ)jOSÀŽå½1'š D]fÎdºÉ÷³c¬§¦Ñ_œòÅðß}‡ úó”2–Pú*¾¤ýÂÞMðtK£ÒнIøÖvW‚·U¡P"e›nú7[c¤MLĪQ’”ŒҡÞå¤ûnå/:1häÅñxKKàšThô_5ýRüžÞÑú¬ C™qlÀ• ý¾b×i]¾.>\dÎ|eÊœ’•*4.ã¹Â¦/¦¼Èó²q9¢)ë%|Àç’<è_¯<,Þ0 91Y[›ó™a6™Tð‚m§geüˆüóÚä̶Ư“_8"¿.¸ÞšëšÁUIœKž‘’¸RX]yª-|h ¤Wüíl@=`Bxù”hÁ;íŒ T@‡4&ß™@‚‡^2“M¯2”kk PíAµl#û H‹N{| !Šg”&ÜX—#…yÿš&Pê`´X“`9rã"t”†Ç‹[2kò¤@µeßÑ‹fHª®SìÉåbàÈ­ªK†urÁ‰¦š–‹ˆÃ_.Â-YV-- Zš´©jêt4¶› º¯Y›„5ÙL~gö¶Eû­Ì[›y%ÍZ0¨‰Q4³ò¸ ?ÔÉØŸµ8è¾Pß]UZu«SNTì9³ VTÜŠÒ„†(ž Å-hýƒZˆ¾|Èü"Zíìr2Èèõ4뎧 9ÈgÕ%ÆS®fİ£1ÃÒDÃOh¶¦¯hWØÀ@1Š? žjyVé½Éûf¢¸ÙE62MK­fÐ ý¼=þj1ŸÂƒtÓ¬ÇäÁ°F;£™©Ô4 »J"»º~Ìò÷YrÖéq8J :–ArɯL蟹-ÂGñzmœv°M8üŒfi€.1¾t83fóà"•ƒMãm¸VQhNV4ª Rõе½\¬ÎÑxô@ñ ××·'#@bŠi{«w9œ œiÞJÞЉ¹Ô÷h€éÚI@àP2r0ëœ1U/3Ô?)ßʛҸ Ѩ–~·"¢^åg€6Â$„rê›a{NHY"Eò¼ú\]#59GáN=†så?ÏFG´…¾s–h6µíÙñÄîâ»M»VÚLhpé¬qd«­a§âÁö? 1H o·ý’™-UQË„E.;ƒ9E¶_¾Zß“bræ2a‘vÞeÜší¸U!§XN³Ì=S•; ר‚ÀQ‰‘·C@ü°V¡iãu ·0Ñmä¾j…u!bÝ|ÆIj³á%çÞ÷á-^½«ádÖÖ™‰y—%ŸŽþ¡™Šž¡Þ΀:,ó<>ÏF;ðoËòbÈ YþÇ%“‰i Ñœ¹àð„3ñ‘ o NΘ¥ÀºpÛ!Þ*߃8Èæ­ÍÓ~÷© #Þ ¹k¨ú›åìì: ωóÚÝ‚ß>˜s Ý‹ûp @}Úø5_-RÛUK,Ò‡6hÛ †2;ZšÒVò¾¬1ÕGÓZ–áQÞ4#leϋ䎌Ÿa‹¸'½é‡ø¬{ù,½Ú¢e'ñ™ä û`¹nùë—ñ˜ý~«‘ÃF²ÖÚ†Á‰,Øi¦ü€°ï?¸ð`´$qÔdÉßaÖ+æ}0*/` ¯Á&*’ˉ‹5~±øÚîc3“=žPض»•ªr!¾ ÜûyóàÞ¼ ºœ^á æu*h^¹ÿ)µÙÞËjŽ^ɦ;'Þ“OÈbj¾ h8x—R”l¦Ÿ#±'cZÍ‘„´¯#ÕíöšÓ™ž‹d8_‚n¾Oó¯„ÏÏÊ0Á_0J/Œ“ÓÕLÚ1^_Jø²9ÆŽÄôP-®ÒŒè<‚›^z¾.éà ¬¬ˆ†°ÄцŽYêqd%#jVW š"EǺĤ‘ÖsbÍ)¬5xXœÍˆ:¨C¥”v˜„l ÒKš ´©$9ÌY·Ù9Þ‡&‚ŽÅ°@«Ü¼vƳ#YuÎ[êK5DTòמÁ„ÚJoª™‰ôèVcEk œ#ÍŽ!{²Þ°&†+œÊÐìÑdÉoÌb¨Šg•Íá$uSë}+èí²¥K(Œ] ºZ°„HÐwe2‚4ý®9Qµ;zEúf˜8F†19äà;˜~vÞÌg¥ÕŽÛ²%±ñE§5Í0ST€`\ì°½,5¶2oÚ®d¹ ú s6Eöwû)Qh%×­d$:‰qË£ Àóñlœö[¨ Ïv‡i†ÃœúxxÞZ·¤-€eï–N‚mçrdµ’³qïº<êäÃ7ô¦©¦ÒJ÷DØÓZfB"bdQ­U¾îp¦ÚËf´5äOWÆD‚—=yꆮxo²·åI|€ G e&}›8&¤áp:þ;ÏvJU+~#©X\¶ZìÄ[½ã‚À³Ø¤©?7” ”2(UÜúJêvæK 'öqÓüál‚ öÛ÷Ö7¶÷L:•jtþtU¥E0hÖÑ[ú¤ƒ–ê(mÑq oK)Öƒè‡$ÃK™*®'µ™èæúYúÖP˜=}ZšŸcãà]+*éЙFaW¶4:jo³ô6ÚhŤÑÄ`æc3ä#åu£ÿ(+F²hyí¨p‘y˜$üòà]ðêÐXÂô-x¹Á™bå[ðr“/´‘ožßÔ¢©r·Dȯð[ˆuL)Iå[ð” …oÁ;Ðò¾ï(tµ-ßJïö]È7TÂøæÞ}JR»h/àtùl¯læ›…» ÷ÆS¿¼§ó½ŽûÚ^yÛ 4ÈøJMYXiáðyšL<«Ñ/ëîÓøŒÂ²qõ9ÕòÖg”äµÏ(È&©g#m+/ŽÆ (àÔum*˜~ø¨£Z&´ ˆ)0Ñ8Àïš*Õ~ÆúÔî³àz¢G§P/mýåv#ó(»‚¿iq«è&­s™B8^ C¼ÈÉ{ ŸF®å½éŽ­×œÿ–\ÕËÝáž1ž“ÿÞ­„ù_¯>ùvþûøìågÓÎôúÎR˜ÈŦb)½y¾½gÉ;öm£öýÇxL¾“§/v÷Žì»gídeåá#wê_ÿ|Ö)r”Mõ¨F0ÈÏðñŸ¼±R‚`a´öƒ"1ˆ¥åå?ª‘AOv`IT¯3ýæÎ'P0Gè1‹RùÙp`žI¢%ï'¼ýûnþMþgÖQ?þW®„ãuåá·ñÿÇ|8ÿÃzRä8=Øê{<‹f»ÁN.rX\²„æ¸ù»N6H3,Rãѽ"é ÎÇÓ|v1Dx,ÆÆöŽ{Š›¹h†NY§{‘õÈuÈ!˜,¯Ê»ÀüR˜Ò`Úq¥Å^`4®ûGÉÂ-=NEQJFet˜ËH•b#2°ˆ;4YçxU™‰[å³"÷ƒtÍæØàÑIêæaï8ßšxð¬æ–ü”Έ›eªîè‘•ãþÅí«5çÂTµrl±j¦)P<®OM®ÑJ=…´Ð=ðÑãðt N!²‰¼æ´×UdJÜ·ßl… 7^ÎÏ):ð¸¨2óœüŒ²žÐØóh° £õî\€G7}ñÊ|̧2å"M[‚¶0ðà纹 1ØK6y´Dò¤AH¥ÏBuŸÿ1ÍW­$Ä€•D„ávé2¿9`½ñL„@êfê\ïØ$ááàò¹©ò¦,ËxÓ /šQLÅ{9å •õ™w|yFyèæÖ«º?ø¯é&÷£ l¼©Ì¨1Í'–î<0ž2Hè¢6˜½Áq†6Œ1áNuëÔ; [cty&7»¤FÊKÅí@¨?wéî²Ò¹¸TxX¯<3¸ø0¿ Æ‘8&¹(k¹„ÅžÈÍ‘P“Peš`ê£h4º/`¤"ñN@Þ¥”Y‰ Ol¡¹$&ªË™ìE'—3¾ˆ^ä¢ ¹qu-3"»L“³,vŒ%iòQ€Y̰élr¸`ÔJ†Â€øûÉ=” ºbœèôv•À¸KÀF¤¤ŽR¶»°¬ Ú…²‹•páºkIê7©9¿´î­¡ü–ÊyÚdCRô`ƒGYÃȸ)™ƒ¾{6¦.›nÔ£ DýÓ\ÌD,Öh ¾E v%j»["‚-ð}/’µ¶ìŠÊ¥R`6,Ó¥NqyÓ2xUbÜ(ðZBx×Áëw {†ñ/"tÅük¹×òÊaw™Qí•#@AÍsC”㯠rS¬.Š!¾X¥Rw±_âE¸|tɪDEË [ÚûÖ²@™²•dӦš7pmê[eyÚyX“œs¦¦Á¦'xÜ´ãæ~_ÈFD‘GñZL=¼˜>ÀF{š£q[d×cMuÖ"l •ˆ©'¶/¢‰*µ+²Wb õTË‚ØílÙâ¤'R×zxjN¹öüOŽúÿÀçþ¿ßçþ·•ï®> ó¿®<üþ[þ÷?äcüÕŽ¿Äzþàÿg0«€6ò½~“Î} ÷“ÿïÿ[ONð2ËCF÷€$ÊX>S°ŠIŽiή“ŒÊÎ’õËÙ*í _e<½¾w‡MwñÎÌE€¯7/²î»„7ùÌ2"Dõ´e·#ñ㉗›V4,šs6*Û¨}ÏýcÕ›ïja++ÁÀÏ3¤ü'66Â÷¦9:¤ñŠ2S‹u¸Ý‰Ð—$IÔùv'F¡…-9y(ÒØäÓÔ`œT3-‰YÏ©õÖÐ2ü¤KSâ:ùmK›«]ùÒҀΘÞwñáí’tz,¨ó Fù°¦ÁjáÁ 'Ì“27t&üH¿‹Ã—,¾ì™UJè(²æHwFgà§£´p&gœ†ÓÆKuâ—q"GM¯hM¡È©òŽRVí D×Þw|W&_B`R÷ÆàÏmʶH«Ð·¾æS^™/æHDZK­7äîL¯ÂÃCôïÎKάr8`\VÑšŠA¦R ü敺j5+p…¡d|Ú~üZü ß BðëÔ,øpm>]Fóù¢SÐüÃt --²!ˆwÞ-îª#0°¸BÈ~B!™mT0Å}Û÷WkkWE+¹^[»¦È®>ӂΘA1Ö€e¢á†S«Ã?áþyõ]Æí ›uÖW¬7oQõ¥«¶bã2§2uPˆ¿üݤH›SŒBM¡rnÖÿi‹c——ÕQOQ³æì™N ?éàš‚µÉs©©ò™«Š-„ 1¤ÙQB¸œeñО”©d/õÑd¥Å5Yuaž&·Ê`<ž(éÓÔú,È)] ¤´µ§Œ£Ä0(ã`9Ìé$7^¶ÝXÜ)Q* v&(ö×¥ÐTlIÂé Â4˜Ž drHž»Hg×ãB<´üµÂ^ïL&€ Æú ÿ ¿TÞx&Ð-–Kþš¼É½£VZÚgbãM£¤Âr£Â˜¯VªòK=ÖA¹"Zìׯrãׂ´ßä×ÆÛ†Gmk9Ò´¿ƒT}âê©;µÔ Ž[eÎðAªܴ_c³ŒâyããÖv.–~ßLBMð>¦6¨*â6j@OFÚ,•‡M7rê·^ C«q,;²µCg1¤u;¼Âòa6=ÏèiZ¬´ Òš DŒÎ‰ÑïZ†süʤimÁ‹f3)V’bÕØe»f—“îÎêÛ5y§ç•³÷ÙôÚ-SÑn;Ë2“«ÊnuiÈÊA˜o(þpû1éº •›dýðKŽû‰ò³Eê-oYß$6TŸ[S*f ãn¤Û¸Iìñ,©üßn¯Q ò¦¤-ÇÊX†û.,a+ìåÅß}·14ukÒÜTU˜mxV÷DŠ«Ò±ÆŽ²óŽW± "6Ý·´ÊêÝ.¨ÒF—JoiKP¶÷èÂiC°Ç`^KúMÊUŽq ±¨_gp€B,5šµqÒ]öì߀“Î/BÙþk£ÝøÕÝ$¢bd›Äz¥æPŒ÷’ D6é^N;·Âe2òÑ*¤é\cî©ä|ªˆÊËwÚ:'YrÍÿµ!a_yòµ¯Î£Õ«}˜5›Oî•ï¶O´œší‹Ìdzs ÷’X½2yƒ]>  7Õ6~/ÍÏ–Mlî)Dw´ æó¬MÎ g(ÝÚYÇiÝþþˆYCši;Þ "»F2å Õ»ïÊu«Òe‰%Áóy¼mï£iu0h­O $ €Jèzátè+WÅyeMF“‡Îø…¡,šà}Bv¸…þ¿’‹,?¿˜™†— èuÎ Œ.†wÇ'Ì/ûUãù£O/u‹?YãŠé… ¦uH³Ú/E„HXîæ×…`IÀF^fù‡Îµ¢@ÌYªÈ¡ˆQ{­kKÎÍðpü¾#t÷£¡XG?I†Becw‹±³8¨=ÀÒ™L×VáÙÛ>I|Ö•Ìj‡·¬2¿üñöÞöæ‰.¯#¥›Š÷\~2ÿ=ëò…Žz¦ÃYì•-§œ€aW­`‘§,²~M=hnRšæ¹ô¼•\#+Fc[ÁcªÓ¿£±W '¥4 Ij)U‚bÖSÌ eŠPÿä¦üûðé’vqfLÇ'x!Œ‘VÁðòØIV»X1שg«NÔŠøé>˜ÌRΙdnp;ÃÔᮓÜC´„Ìþ:2ØæŒGÙƒAö>T¶—øH2Š~{­°í¡æ”ÌÁ®ZØÕ–4Ó‡f1Lél5ºÇ—âàjÑc¹æ€i]ŠÃ¬Eƒ€ŠäçjNÄ·ãÎVð“–‘ä Ðzÿ]7+һЎ‡·hvÞ…Ûæw¹(ïÀó \µr¼yrÝʹ®èÕµ]µ&jŸŸw»øU~EH*†8´ðl5| L øNšÏ?ê®]PêÛì 9©Š”ÚJ«»Ò¯`mô{µÕ]mW«Z_Íé0ó¶‚ÄñKV‹°š“«§k“÷°ãƒk¿l½/õrë …VvWkä@Æëx_f–¨<è˜køo„ü*ã ì0øoTÉDž¶M¿ÒsÕoxÕL¨ýÚïÑJk´Zj9Lê¶QâV”¢íŸ3RÓ¡Òwê¹´jFŠýh9´þQ–Òúâd;fÅ B[MvC.O°ù凱Æ UOš¯ð”ƒ\£‡«øp•V¶µz\ä+í|uîh¤ûL¼”;ü±ó™3¼~‚)ù„¶Â´ dŸ+ÎÜÆÉZ²<åæÃìoFäW"Ÿi+¿Eáâ®m\}¤Õ?ÏàbÑ9lödzŸó"ƒ[¡¦ÐC~Ê.uÛÌåá;ú7}]ãÊjÎr¦æé;q¬åyCÒbO‰©“ ’¼ìSÐz¹á<›¡ñªÁd¸¶©ƒúYW2žd# ‘sOòQ–aß}P2™®OÏ Nç:û'âoÌ[Ì – iwï¢oþ¶è¯õ-¦w“±ŒÐô¼Œ\ׇÎà]h|·yÆ7fÑݤ)¡±’-ë‘jcv©Q( ¶áý»)±ûÝÆùx6nàMp¸øâ7AYN×îº<ž18ñ—ü€§Ï>ÃÝ'Å„óɳdEhvß—úÐ ÍÊb•«÷9øعlÜÞm¼#Âv³>ÉN\å‰+ƒÊî”:ÂA‰EIÁlž;ÉÆX9ãòQ–Þmìe³Fe “äl0î¾KAÚ’XÑ ZÄ‘z}žèä}ù"|¼Û ’û¹›!6Mbg£ÝˆÝ 8¯4²K,/„Q„OUs•û¨$‰µ5Ôt‚tU>šßS869g…¬°Ñ)÷q b<&’é9Õß{eÅ]fí¤k­îqS#€så>­i£4²†·’ÔÔÉ)¹Œ[”ÇT£õË vë±M´5¢œ/X,Ƥ¡¾“¸A‹~ˆóÍh†aÝÔ…’ »OmÚaõ‘Û6i› ï6N5™ƒ¬®­•ïªÓx1®[£ùò¸Ûù÷Æê¤‘…ÑHBÒÀÉ£a›{ßFƒyjÍÇùÆUµ‹M}ÚØJ®æµLÇm™¹Qk2wSÕŠ·¿ÉÖ”©ô/*çRÿs7%ÛÞb¡Qq…œúÀØe—e6Àk§ ^‘~½Tr2ÏçtN‰Üú@5Qûgœ»©¿:_DÏÆ±F¦ƒ¨Íef¨±ô §Vé~|°ÎV {¡Cø…l”|Â|¹ÕøCÊ{ qÿÀ^¡Îq, ƒ£ÙEJoÜ”ÉÑ;ƒÊr~“ ‹Ñ×´)`ïVt5ðã˜ØtEØy}Sׄ¼Çˆ”W%2/‡#²oÓ¡d£s(É6 l\:l=Tùôym±—œè6¶1˜ß˜Ø¾OíÆÀ—Ý…r…Øpü>ÛɧÅìÈgxûtmHô‡ôÄìô0°‚l3¼¦Á¯…Há-²†ÿ¦áÑÖÅCŒ~_*.G2\óñ¹vÂ\d`ƒÝ™Äúº<Àxw(Šä/Ï3ÙòF×Àë£XªæÎ§ÒxÒò¦w¶KÝZG-4¡°2ûÏÿ *Lã’ûÝD5ƒ?oÍR”§Ÿ ‘|} °Åy?yž¿žt„­„V¯8öÏpÃBNúÀ—]v…šÝ{Ãä²À*±ìEv9E »œÃî߯0ÍeôœbB½5Uáû(>¦²\âE€öÓü!ÅÅP—Ž Ø¥[V{¹Ê°s•/‡&7 ò"£îÌ?] ¢DI÷<¸öå$Þ¼¾¢7%ó‚.W4‘lM3PŒ#2•Ÿ¼á ÞÞJœ'Vš1íoIçékFŽf½¼3Ë×xTðeñû‚ƒþÒŸðˆ†ðµ•¤Çx=­Cùëö$ùrmÀ$ùlš…ÐG–m2ÑéõE·yNKä¯`Ò‡J×uX)Ý|ÖJ6E#³š<ß%®˜½´%Eß‚=kQu÷1AÏŒ)«8QPÝ3z¿ã´ÎÂÍYœŽÇ;iDˆÑ•‡ŒIðdk ãwqšÁAÓ0õc]Z†z•àû1lµsÖµ´¨ >ñ}Mýá%.v9VtjÆô3ÛŽgêEâáÉ[¦`¥°ð—¦U%¾ƒúr}„—i"h ™«ñl¹‡fc;vqÒøš(£òV}ÿ–MÇÉ0ëŒÜ´ÈÊÉ—¥‹‹w†ÉQûÆÍ@ÿ†æ‡CÍ/ìzzØÛ¸áí3soá¥ÓMós.š„Z'r¸ú M›¬ ¼ y¯—\_N­«ók±YNuõÆ»3{%´M'ÇÚ—ïn– t3ýì“=©{Ôª|5"]"ëþ÷­ÒùNî_YïkЊ»ùhGJ–ôð”Rc<-«ìy¬Æ¯ Þþ)0K¥Žô2™Ž»À^ ¸!Ø5)AaVka“6‹hM%7×£UagͼÛë%Ýf/±/óÏNÝ“–ñ<´c´¶ß{c ËÌ' Ð×´ Ãi1éO×®>„åL“)^F…Ð2 ÚK§Þ¼mÚ’aQiÆ!®SM Øvï8:(»IqO1"fïõ£²ê’#æ¼â§… |1]§Ìº‹{æd+Åfvó‘ý*%YÛW÷*:Kw“‹´¢%ºkšWê>‡‚øCìKM8«NØ£^,Ô ŸÙtl‚ûá‹;ÁdEøý»ÁRýY½0ànú ;ARË‚ñÈ U*Íéâ°‰Ô‘„¦¤î‹‚Wjeã8çS‡„> qa ºR7¹ ØÓæ'Fnüê(+›¼z+í•ýAÓx–²ú£tç\ÈE“dW”É3Ñ?Qd˜èMªZ6…¯W‹Q4ˆ“¤Gh‰(}ÆiY£ñ0ÊL ôϽÐU$´¨)8¾Zäæ.Î%­0‹ެœ"³G>£ŸT€a „«4óS'.°æoÙuaȯ¹eìÖØšÍy›Ê1#fÑóewiIÔo5j »¤H?Zcw—=î2b½xá±p¤›ÆN;.Ç:)F±Éaâíp×{eÿ7fÊ.\ß·8ÿO-²¦PàIEÉÍœöS›•î·|’Zy˜ÍfÌÌ™œÝ_T—Voñ´ÑJ&çG?è,sY7ÑÚ—SþÇðÀ+Ddò ">Ë,˜Ê†ÍLPÕ{-cð”ÖÑF‰vÊ&~TQ‰¹|Fšîáõ† ³ÔÜO@t&¡‹Þk…³Û~§V¸cÛ®6VX¬-öÂD+ÙŒhZ­hSÍZû¿V¢ ´DÌJµS€*‹¯ ØjyÈh…är»cèŠv®ÜsMµè^%ž”ýsä=jÓ߈-K¢6ý¼wM[þ@Èú²-ÿF ÌÚ©m¾D`ìz¦m¿E Ø!Ôæ"ïIo´éo¬¥¤ÚüOä=ñ6ÿã… ¡¶ùÃaD³m¿•€>™Ì=ø wÞEVÖZ“åjO¾z·ÈM¤¼ø§< »1³ÞrK½­ðl œ…•’{IÕI>ަߨš²ÁóÐø’EñPºÇ;Rg÷7K•ìv&B˩˶vÖ93ŒÐRŸ ¦ß‰O²dŸÎbG?Ãó–~™š´:0»^á)¶$ÌÚ”P&z'; hct¦ç—C\ ¡%ҥˡûJߥnNâf3®5ùT4ؘ¹äŒá‰” =ýŒ£WQ>ÌaQÜÐg§:É£z#„ßÄ š£…¦uÆÿ×å8#‰DMäÜ÷;÷ù]ëai9–ŸF¥÷ª$åÄĶø¤úJò­‡âLKüC A¢}[@j°ð*,<”ªwë ™l‘Å:ŽnˆnK8À›Cü¬Âìº1E¨a8´´{¯ö|î&Ï’î=µÇÕ¸]¶*Cö6†Iɇ8òΖ^I™{rm\&Wyv­g »]YZ®˜}”’th0»¹Ò\Vä˜îHE6ɺã¬Þ&°­ŸÀ§~â“ÍXpD‡›ÂúÝnú”Åí—prtVc (T_;£§÷ÍX=¡H |T{ç…”4,³Œ½06Þ"ëñö8‡Æ§t(cæ–Q³\Ü1÷1vb4†%'¨(¼¦ÏÉóQ>ÌãL0ÏM(Ž)Ëztƒg¢ˆP\yÔ²·©MA}vêø²{qŒ„Û Ãf¨á¸Œü «¡×»'›”:š…ã¾$/Ç«É$±…tª÷ŠÏMrxtðo‹$a”ÞLµâ!x±Â ³NuÂ{´®$Ÿ•à5¯÷ÜÚþ='P1gêpÇ8zÌLq¹™¬Õ5ÅÈGC§ñ(NG×:ß]Nc©b~g ÓÅXSNjɱ6[L—#íC‘XÙ â9¬‡‡ïiŠG–P=%ÞÌcQàÉ/Kk0¯Žµ¶9`•¬x ꔽ‰“LGt8Ìæ@C&d5§ "ЇÁ¹2ømóÑŠ‘•Ãkøç“Ò^ÛGÙæ(ç*5pš=ºÑº ã]UâBÊXõZŠV\óiâ<'šY.»CºÝáúQˆ¦“ø^`áÁ;,ààoꈩqÊö2g)  IÇĘ"Xq ÆÌ38íÒ„Ðm®­u½4¾ç£ÏÓˆ9yOEîÑ$‚Ò óH—çínQá"œ\Å%Ͱ(¡…ø a]BÄYêMa\é­!é  a2uBE¥M<¿Û¦¾—‡­z=ætÐn¢‰ã)µ2\wR:<j°%8:–c—–£áªÆC‘p8áS QØ[†õ6˜kl ã¿ÒÝ¿R8z}¨ohò“A>Bñìq¸Z¶ ·«ëò²ZÉ6÷ïâ·K÷I‹Ò&VŘ•´,¡ËÐA¬¢È¡Û;8kC22\G—bRŽv¡0°Kñò¸Šü€‘î°¼dI‰lkñ ÒÃ\Áý8JÃïì#¿7æ}:AÉãä”§Mi¿ImAIFù%%õäg”´ Ÿ?§V›óù3 ›œÏŸQÔF„eU71šúŽr_ˆH2“6œÎM!ü·tëð1 säë" ÛdO ÌCVs` Œ²«ý"wŽQt^§´º"XÖ™Z1#óé¾K¸ée·ùÂ:£oTSÉçBƒ]ÞFT‘8>ã¡àôGÏWÆ.Jr†|jÊi*üS±sê…À«`aV).•#[vQ±š¸e½Å1?®ÝËF²i ðž¿Ï[ëa!4p¯†¸ÒÆVýõ请ÅvÕ„~D>ÌNqüÞ®(uH[ºº£]²H†«8•.xЭ ¥‚Õl˜„2N ¶x“„ ­‹—Áf+cŒ£½†«ÍÅø°áý¿¾[ÐËoÿJl¹U—$ÉÂ\DÙö-¨2“‚È=ÿcbwx€r·Á_†±™?tÇ^ЮvÁòæmP: Ce2Ïê[ N½›NãGLRÊóú!ã}÷ñôÏö<k0ŽÝcÍ„Ûáúœ¡û¸sm…+«W‡¾Z#7¯Qj$¸‘|,É¥ÈL’íZ fÓ1(}7œEGêmÕO0ÞÈ}®ѧ9ÎÎIE–'O°h”ÍÝóZ=þ&ÚQƒ·hO#)Dçf}Hœ#š…¥wnÁU u~ïvDZ¨¨¾vFï—ßROqw"¬tœš|ªHJ¡Æ¾Ú™çɤ•ÐUÝðõÞ-ºÒΣ¶3kš&ÝlFVŠuR•kk‹ö>‹ne Iç¾µˆªkš³:@ä£fžÄl)À»‹±&8ÄEÒAå9ÝËjÛ?ý|ªšd²d—Æg„ðjm¤vx4:Þ.‰zÝ*Ž[­ñï‘&! Ƙ@Ô‡ÔOöö‰x9µ]~4þ s€²iÍðÏ›ÜRk‚Öiõ°1ä`2tÇ­+I ^þá £“®òçËapÞ§*jÞû¸Áü•šô×äösÕëzÀV©´¡n¼ËuUzT³ }݆ìùTß$‰P%Ý1̯(u÷ʨ‡Á؇AƒHïTê#£fp°¸Pah9§Û=£™f³ËúãçO4) Q+éãuh‘Duš›#KêM½¤ËÌâÅFhù«[dÇ ›øÍÕ!M‹N—iñ 3¼½g ØTs•U~ÞRl!í¬Ý-_ª›¡ìº€ ðv¡‚3YÐ ø‡Ñ‹0vÌvú¸XÕYåððF*UGå«|»h{×ì´’½ùÆVxŸŽZ™’îØFº×4›Éâ­Äǧ߹è^µÕ§?Ä^ä½c›?âݦk Švã×ÈQņ@ù@÷bó×H¾ý1^òø<˜¬roQìB"_ÓU¡(V ü›´ý\23uëñ¯4òpŠz >)EU÷Ô#̳ ^ü7·G¼Tg€‚8¼d¨|¤ŽÈÐÍí5¹/lC¸/‘áÞ%f5à ?<8’[ ï#c…NªáP1r5O½OtS¨ô‘,Y´íÉZÛMÙä™SÝ-.·T+ ‹PjKKQµõRå?ª®›t>îvó™ÔAý¦–÷á­kÿÍ š_¿ü±·jëÆ jw¼J-Á{~“¶çv,ATržµÝ’†Ìs¸6î³øÇ“ÒêÏÂÜwûvNqÔ£—óVmÛX&P˜VrýEJñ…[Ï2ÄDí~Þ«ø B Öÿ#–Õ+Å©þòu†Ü¤û… H;ç­=æ->Ì|:ˆ®$̹{;ÃVb[dI1wMáóùKCµ¢1d±F~Ö’ãs·ZtÈ™yN|ZN:•JÊ%Ô ÃÎH®¶Æpt:øK»vUSE•Sÿ<›ý,EÓšIÐe‡r7•W2ó— ‡«i-]›zÌÑ[AÖ¬Š¬ÐŠm°Và¢ð7H5gUÂÊÍ´¿…±[6Ø,V©ŒaÌkÕTK©’¤N½öñÝhüad‚”ÁF¥t ¶'»Uå)¸™H!8Iòiu¿3ža$Ñ O$ß#«O…îæ›¬µ, âÍÍöÁƒ:û‡F‰aÏxúDW qQz©Ç+¹²!)K ¶¾¹­œ4aß?x&Á_O¡/òYBtû¹¤¨ËUGLw>EAg%fgƒVò.»æP8‘_u–B¿âáÀQ W9Љé=ñp…¢é -ç9²*²a*Ø6i.÷fœôSßjßø5Hb޵–ðéUŽTÎSEQt§F÷QLÊÝj ÿDh½1˜9Q"z 3¥DŠ\6ÚFç,nëœ*•Òª§MÏ“6gP¦£Ïñû%²åÆqc´ôàD’|Ĭ/m +”ÁŸ*°Å‡v‰}|‰øìÃÏ"Ôa†¤Ee ¢=Î(=N²RUÔ ;ÌlLµó4‹µÎë{"‘éûDg›Ý°ã„ü•£[+õq{F²"þJ»d›À¦O¢êÝ lÕ£@AWoã›TÏ ŒŠZŠÚIª” :9Þë…2‰¤¯Š08ÖŸ‹L~²tP>£[EW:U’´ô5,TNÆÛï³éµP>oÕ¯«]Ó)‹Ñ ÈoÕy¸òg¾¯n±»(¶I‡ó¡D–p‹ ¡$ÞJtLš©EÊÂj’*QDÊÕjvÖ>u5,æ¤Zæ–£bÛÏMâ-N76ïZèØ1ž’‚-Â÷ãz°Ö—¬ ÎòS+Í‘l ÃļSw3Xõ9uîÎü™—åqïe8uŠÐ)»ú±f:ªÁ7[Ø„§_ŠTÏ 2H[tao\š>,ݵ\úT.UÝjëü«]Ç——¯´àP"Ö2gü`Ž@ K –Q|ÂGÛvr„WóW3(ø1c|×…ÁuìÑÚ‡WªÍÑ¿/îSNÔNÎ!sÉxšŸÓÕçÂE ##þÃÅ8¼EÏ”—Üá9£°éÚË9ebv?"ãú>ï«e(·¬ªkÉ[°P¿«ó¶‹î[-vk@ì#‹»à²ŒÅ|Óæ£”âœÄÉþG_‚È—ÌËÚ,N*fòªâò'6ÌqØðYÙtywǼðqÚ0t&§ Tv?6ýÂj­–x%­–”ŒÈúÎäßõ ç$i,lí¬»W¶Z¹‹#] îr*É\J"Pr*7÷æ¿,¸Û’DMÊGnA°§Š+ÎÁóò¾ò†BÙ2ŸT×I×±H¼×øˆdëP.&çÍ–ŠÖNì­–5ÐiޤJœe|?P—Vɲ=ãGõÖê·Ô4Ö¿±E¦€ò òÆ´™#Øu<©¹”[¹PÔ”4ùEŒQ¾¶6*ãqJÎÎri¶rbܲ«—hÌ%•Œ×‚…Êgõ>‘EŸwL)H§¼Ãf²¶FÍ^@ÙÆóN.ès³ª¸ð0¸5&º^;ðÂÊmFVX‹D§úñ¥ÍºC&&•H`ì<”Ð~íž'z¢ºõµ>šº—™ÄU$¢Äb.“ˆaÛŒèìXèÈë0¿¢9hK=åe3æ…¨¸¦Ä¨ ÿôƒ :(!¨‚’¹Üñ æò¸ +8xép3|ŒIgÃê»­ å„y&_ Ûby:˜étþ;8œjdAWJŠÜœ‹peñy4ÚMo8¨ Ã+‡rhæ}z3œ\Î8)¡Ù+Цô~߸m&·ÃÄ|’ƒÜ’ß^Xió‘øIî1¥DI“^Î8€QT8üÒ»S9ÈvÑKJv{Eè°w+©“V8FI³–÷s@•m[íkѳCÍ©¥à°Drð+•Â#J7eÂhÈ—I+ R™6}Ì 9—H°€.ó Å<ˆXgy%¢¹;bº0êD.EˆºŒaåÍV!ùJx΂9^‰’Ÿ5¦é‘`6“ìJ·W–“W“ž1§eîfœJg⦅¬.'›2¼(/§ÆÌœìÅ¥ ‰«mNµãáxÅ·Á—Ðo—´sYdjw?yì£á„!ˆ‰ª{YìB®ºËÈçßDžT]Eîî!K–î oy×w»L_57ŒÛÛÅ5`cÚ9G0ýXÿ=%fÑéGè§”9ÕJ.RøÐOá‘æÅåùÔv¹Zè'¢y¿Ÿh“ºë%³éôðŒžƒú½ÙRò“ÂxÍCÄäþ€¦œ'À×Àït-”„<Ì5Cqt)IÑôÇʘdÍ hQ¤Œ»ÝËiA}Eðk!‡Ò»ø¼UxÌœf½ËQ¯3š1~ì_$NÓ© ¥f<ûy3ðé+¬™3ü¼k$yC&-PEwí{Àæa±æ’w”xƸäÇ*ׇ/w$•:åŸÉÕcî„7iZ‰vÜÐüQ¿']:sÚš­«f‹GÝû¶ªºÖÅ=7N¯jF©÷á¾Õe¬2jêËÒPg ðÈSL•;ì\¥HÈüí½9nJ·AýLá¸]Ï0šR¡ÿÐ8·^¦ð‚“ÚŠsZxÔ•|VOÉÇc|Ñê¿¿%ëÕ§n“ÕQ ­$Éåys§4¾íx\|†ˆ!–œèÁ¸ÆKPçÎip×®®çtA¡‘+4Z Pá, ¨£¨¹Ñ¡/xÅÆ}yÝÂÊ`~ŸkBÜ‚(ñú–s±ä DÿSÁaˆsYíÙó¤y&Rçd®þ¬HÚ:訳Â,Xš€úlŽ&a™g;Y= ÷ϾHØIÖ+6 «„Ò1¾î-æ›kâ:`Û$ÉOì"[k¦õê%ÓgËçmUë­yO}–cÿa‚ G›Ý÷eíÈIv‡9utppòQVè¼Âö‰aYyÛ,»ºè\³ü}ålú0´Keb¥|×äª3n:ιcP§DûíRß»g¦”ÅÍ…Ô Ý”qµc—ÞÞHHŸÂ"ºã'=žy¯Ë §{Ùs©ð…móË®¡¦œaÈô=ÜEQ­ˆxon‡g‡´ã>EGpù)e÷íöáß5ÉÐ"[¥Tµù'NÉóñl<Ú¹ôãá&ä÷zYw`ÒL× =œŽÿग़3\ɪ±8â ÊÃðILù|a¬?K@’—š FÌëÚô)I§ã±õÐ Ð2zøñ„ ܼÕNî7 J@ç‰] 3¼¦8å¢ÆÒ°9òÜÆOX¢8àÃŒ›ÀÝ6>ÞÑ¢MT Ôäf/Š«ä£ÄÍÈYèòd¼§ã ïÃ×ÍÄ9÷œ—ÊúàqÓ§,ýã2#m”î´6šäÝÁDOkkžê"]õò2»ÄôÛr˜UY$¯;ƒwFS·È%5Å⢃—™øwöZ«Ÿñ^<ºÏ6ä~ ëŸò‰¹ÝB´—RxÓ1ºÃ¨Àæ`¸wÔg3ekG9àê,Öãé;\'E »IæY² €æD[^šÅì%ê±¶æ©´Á¢Ò *é^îÚŠ‘µ\"­d/ +·Æ7è=5eŒX,¥ù00ÕÂÀ—ÄäÚêwxîs ¯…TlÂK;é÷²>^ñæ”(°Ÿ}õéø g«îP]½µYÎÆ½kª’~OÐ~IÅÕÚb\Ñ}`ÖAxß™âDÀPÝH®þß³bœJ’êù­ @ÝþÓP ¨`€œËyKÍ.6'<(Ãy&wPˆÕç÷­ãºêÔÐ^êÒÒú;­õb£ÉYiXV8þR2RyR7Àp†Ë#&Jèoœ÷\ t®Špª¨ƒ½TÞJF LW‹¶ýgd«´¦wa\>ÈÓ^ëŒû¾%VU‚YΪÕò ÂÒdxOÊV71f1îs'áe[)ÃM…5 Ÿj{¤¼Fç6™…è Àò¿SÄh“ÛÒã5ß~f#J)ñk驤9:«²5»}]ííè¦!=Al=¨Ô1óã…Tß0l•  > æ*JÍ„ ˆƒ6–*Y4«ñŒdùð¤E$¡jLc¦ŽDgm­Ä‚:„Õ½&[Ž ‡XE¡)ÔU¦‡á¸˜U^P¦é#÷¢Ò‡8%@ õ¤=;]}Ù†ýX.‡Ígºøni}^ë½ýjL}L•†˜æœqqŸÊáJÑpZ焃붚Ǹ÷—SÅd/ÕÔ²ÑF\ /2«ÙàÀIë=ÏJ¼°ƒ_M W«ŽßÈz:hªcjÈm™büm¿Bâé –w­¤bõñ¶Å͸M+š¡©oý7Ös#ÆàS0µº—CNæg²Õu.¯òAÞ™^'4º3ïx½áy† F³20K `óèæq¬ì^àÉ:jPS`m|ºr‰¦‚Ë«Cgj–Ð-|K‘øoØ2éühá U¶b—Êáѹ–«v¡ÊÈ€Þ[_¬:Ë£­Å|6yK´º€üèHD1 )0˜0²‘$kkUäGg϶РÖ'”¨,º¾4¡hćÈ„‹®‰¨{Ú5´E+¥÷%Н“ѳkÐ 4uó ƒÒÆÓ>Œ?àEBÐâ7± Xç Ê e)Zg³ã·$Ò‹{&KËEòŒveMU9¹Ê¿ÂeŸ( Ãݵ5„¢ôòòÏu®iwäõó¹6c&9`À¿|û|½Ï‹½£ÝãÍ?w†½'ÿü;Õñ>?|ÿ=ü»úxeåþûèñé¹|þž?Z…ÿ}¿ÏWV¿¸ò/É÷¿=Þç&³i’üËß§yv1¨†+f—06gIäÇëÿiçwÛ÷ÿ£•‡¾õÿñ ûŸ¾OòÁ`Ø,Þ,øÁ~òøqEÿ?ùáÉ®ÿ¯<þòäáãI~…öÍýü?Þÿèç,wù/Æ»€ó‚°Ãí¹s˜‡gî;e¾ ^ Ä; ²Á¸C—êÝ¡B>®…°`rã’Ü`]±¥kOÌipwïún²ÆP»ûÇ'G¥×°¢š dÿôðèàpûèdwûXÙ|ÝÌ.²˜«‘ÑmÚͲŒÒ¬ãaŠ>- è .ëá•'ήiÍ‘ŸðQ¯‡—îfmAw3>E?ºÄ}B ßÒ5™N„|åÉ [\k°xóùà&¶áhó§ÓãÃݽ½Sj,™ÕŒ×I®Ù›˜Ç) ŠN‘wBža;ƒøly“žÒÚì£LÃâOîåEwŸ¼(Ηóád\9ÞúÛp½„§³¾éãäﳿÁë¸ó–ÈéÇi†‹t’‹¬‡¹ ²soeBm†EÈ9½¦8 †ocˆ =—r.‰X¹'ÕáI/ó5ÝÄpÚ*²¹ Xñ«cÿ´ºÌ‘-r”é†É-ðy½Ì_õ¬Á¼Âï>O:£Ñ˜6.S \cáæ2~Ü”``YÕ¡P.ó"Ý]^ßß?8Y?Ù=Øÿ˜·¬ÝùÔÀ;¶2ŠØ$I K“{뚇Y¡ð_>_§RÜøïŸ<žÁI›+€(à…ÎæÜñë?˜sÅV>Å·ÓxqUKªTM¯VK4AF)/^dÃñôšè.&ƒN7‹ápP»rÑj-Ѳ½^¤hYZJ¼Î¾gEJM'!Ý2ßL’I¼8øyC©È~·òļ|]~ùhÕ¼Ü+¿VËË—å—H±dG]RŠ®û H™/¿ôU#,X®O³§Åo-Æ\üæ–²X4L¸Hz!î¸F×µòx«¶™ýEÚ¹“QCûª¥¶•¤0OÆ A›ËÏ<Û™QxL©¹ã÷˜RÞ|D[ûÍî2=úˆõµ¹+[I¯˜µ³(âi·mhúä1—úT}Yßd:¾ | ¬8é¸ì§Š6òyp?Ì¥i¢ðX „ÒŸ/ SòCgQÂÍfÌïÈûB>_ípó¹s¨;×¾ZKv‘§Qè†ë%6‘v¦ãáWí¨°ƒ¸Û²Îÿ€ŽÒY°¯,ãCnú½¥ßúæ•;­*#ÝFGíÑnèˆyL.§`&á‘àó¼ÀäDS´• ˜äÏDÅöÆ]£‘ì0=‚Iº©e!b½Ï•ú³»†1p½ñ( ÀD\Bóï ¨íuüè-²ãßìîÍ‹ñ{ CùbÉkÞYöôÁ4¾8N¬Ÿ¬i~˜Ì20(§è«7¼BJ’ñà wÍÅŽ ãòW ÷ Wä¿e-Zc„…; šœå3t9¾ddÉK —–(ûÙpƶ1ö@JùqÍœdËLFtÚ;T׈¯éÃÈ´¡§@©F“yŠÏ[¦\Ë!@Œ¡/;3¼ðõç5Pa°¾·—|F4±§Ô­GbÖ6º&¾•t/gÅÉæl’  „)D Yž¶1£I—áP@b£Ø†r%mSÖÜæêÒB1 mEIÛRÓ&’Ø”…kˆPÀª S_ü–MñÎñúÓ{åˆ%n‰t ŽmÖÑtK=ø—7l>˜/ÿñÚTL±Ž#ÄØ{nìžÂ8A¹F Kú8ía¶9€ˆ¤†6•XaÑ•Z—‰Ã K3ºê9df‡@„èÀ8å¬S†XVkÙ?€_)» Èp|qÒ…x ñ¥…²Œã^i@c£¤M·h’ˉJ n)¯K¸ÇÄ„xÒ*Ê&&³KžÄÞ^`ÁçË)éx'óس{Ûë kYÍN­šá›ÜÑC£4‘¹Ñš$Ÿ?^S]}ÛÒ€m8Š´XY¤{á’3ƒÐ¤'%äS5T#ØPÿKÛü']ó#ÚîwåÂK O/À„—‘uÓ¢¢ürp´Õ€S5±'ºP¯é+’†ˆ@ÝÄ´L0”FfLæØCô0œ>ÊÌf{ø“§qêÐjtˆÇN¦Ù°ê°h€¥[Ï¬ŠšäVŠUd­2ÉÒt¢7Ï àw7°ÚœÈ†ëÔÈ–¬®¼~–crɳ|ØSŒcÖUÇn0>ì"áU×-=¸ƒkÓFŽÙpò?Ö8'ë~ë’DŒ©%eIáž.§ÐLÚæ’ÑXÉ3[Kˆæ~òàÁ$F§¬ž}›²fj±ÀTÑÒ­eH>ùÈTû1‰I‘U K ŠÎ4.5X¾Z^ É2®RŒ6á¬*Ü/«eŽÚÝ9I>y†5Pº8OO'Y÷*\˜‰Än¨|8dC\¯–F-ê(¢’lzjß,8||m‹7*g¥Y•F}ÞH+pûÕf⩽۪™ˆ¿tAQI‚Ïî2q¥‚I¶1µŒ*³K™F’°7afÅÅbŒtª73‘R?ËJ =1î ë~4U‘'HY M^Ç.%s¬BF‰Ä6ÑiX‰ ˜Òþä[)¦š(._™c½)çtîdcÖq_<ÏhÃ¥vŽYJ’ùåU€[T®æÌ(Ny$e¯·ÈÅ/ë[[ãî»Vñ[;/~kÅÜð %5à›ßD)Êí.2Dý]^Ïá}•’6\·Ímm¶ã KcK[óaUì§R•~\¥Z½ý,ëÑi¾Ïb™’W¶…þh–±b;üeó§ç¡ —¥50¨èÊY‹Ðj)¬*PJ%œÁD›!ˆDi;Wr͹‡ÿ͆Hmƒõ(‰4ú–}÷»vÜÿ[½öGu,/O¶v.%òª¡@q3í®PVc+âˆ{Ítü—ú×°zª½íHh[:W›žÞr<ŠÏ-©ùøS²ÇTŸ¡/ÿÉlz¹8ŸjTû¸$ /^Ѻô’VO¸¨ô€,]DÛUì_oŸˆÁÇeÞ·P¦ÃƒCx³ºÁÎγzP‘¨Ë¼=ß°.öª(a‰ÛTR‡thÏ™vø;|*KvgÃð /Bi wüÃMØH˜|ĈaRž‡Š—úÛîÞ^2x‡°²µãbåmêb%ÓÁ;4›LCu æ‡,Ès]¢ŠïÞÎ77[Ÿ·Ò]rTÚ©‹»XštA2Á™Ì~kaÖÁ„f/¼ÌARš|Fk™~ˆÆ rê‚ÂJ%T&¡ ‚¸¤û=(aŠR^HŸ +‡P>»Ë}^)S«Ú}·Ý5ÃCŸ¾R(#©ÕhŸ|pé"èA™×–Ÿ8ã´ .3,p£&.¤ªªå¥¢ö³E8kßÝ’™Pnÿì"øæñè¾_€Ë~Ò;;¼³Ù÷v5y=i˜6½§œa—7u`TÝkF„k¡Ýär1Þ#ðÃ4Ñí~°![!×¥Od jLÔi6}c'±Îç'oÄ©Çs˜,ÁÏJµÏi)ïùhÙþ2žhÚØÝ‡é/ºÕáÉ&…-([åW7Õ†õ¿<:9N>Ò‚àk›¶[ÊÎok¬Ò­/¨të3*u¡P·Ž¦ $[U9tm{œ!ˆª"*æGS-I… h¾Ì—[þòë5ýåï¶—º¾´¨Úixª7bºÐ«˜½¸Tk,R±[XŠK¶‹6]‘ElÄ~µ¸¼omjNšÏW°wJǘw{ÝSÑå–Pby¹¼ #¼%L˜ö iÓf O`a¨àƒgÉ:3‘NÁuìwìè?ñ=ðrKÃm¼x±½Ò´È–|ËdŠSŒÅ 3¶…‚¥â²Al¶¯~¼äjãÒUïßF“LŒ&gêŒZV%á¡Þqâl‚Й£g¢9€Ó»ÉY6È3ÜôÄÃ3< ÉyÚ1Ãò´à(JF4˜B·¹è 0[Ál<½c¶Q¡hoŒbPŒ‡Ùì‚n}jdG!ñ;(QTŽú¬@€Îtpû<œE³ûÎâ3pËèO茮‰°#ÊËi1îæ”»ÑF)ìgãóË¢e~¸È»øüÃŵ •µØ€Q‚3:2)çò–ížuÐEäñX’¡m%Ëõ YvؽæÑíõ1U»—t©á¦cã· TapJt@¨Ñrí/$'VVÈŽ÷Ÿ—è´«‡TÒö{ñz¡`ákŒžÇHÂôŒnA›Þ£y1ñ?e,(øØ>{ññŒ¡¿i¶ûäWÈokëÓˆÚdûã¶EˆÓç§ æ¼äÄW”!ÔJ·3‰*Õ툔Rx7~‹RšÔÕØærRq›« PŸÏj$-ÌÎj›™”ª-Éâ™lÂ-‰Z9VG GÕJ¿‘±vðPQÎa Xñ©dj;?DPm³y%;† öòîò V~YÚ µodz7Óyv/qgJÍå‘n&pU`O·D4Ž=éörh¦\Sœg³"yG*Ñ#D÷’Î{Ì&Þ·†]HFyB"§,²z‹J{lÑ ê’Âΰծ…ª¼ÈŽ¡ª[ ˜MýúˆdrÎè±0 ¤ ît›ï‰™3œK'ሗŸ*´@¬Í!ämØ©8*½È³*m;‘8¿bGq¨ B9Ãl×·]‹Z»Néo`¥ùEøT°8.)[À™|Dœm;¸\{3µo´úô»Ùß!H´|¬ŸO)PIbÂÂŽ¡Óý¢\šáÜ WJ¡Ùœ½æº,Éæ1¡Ž‰Ñm9ƒP'?· Ÿð—ª4[AÙP“²Hu¢+´h%ÅOO0ÕXʹ”¿²Q¢åobT£JÑ ƒJP]¢VÄä£$MõÈT‰Ú ZÔªü®²JRYÖ0r ¿+Ë*ØJ-âMð35Á;¼^ÙØ=aïæŒ¼›ˆÌ¶§e[ó©TCHËáeq‘NàO‹®}ÐËÕS! j¤mL„JÜpÓãÔM¡C¡gåÍLÍ?)¡ /ا¼ýiÑ{qhÌŸAç¬hFÜ©i‰mÙ²i%¸¢¹&¡Øæ¦ñ(âFõ[]¥)ÛŽ×k·?UTþY®ÜèA¤ÅHN’Àé[²8ÅÊÄÔï¿’ÿÓ;‹Oš­ÐOjŸsösãÎÓ*ÖÕ™›aU,‚É!U8“”·;Œ¥*ïóÂ[påiê[pésøUÇ|©¶0µ[ì„dUÿÿŽ=^ׄÛÎg.§xdÞžf‹ m‘¸êùãœú_Bq\:}výŒ m‘ܦþ͇/eÖNì´­æt†(Ïý*Ìtonù½Úò¯ç–][~cnùêò'ÛÇ'U `;]`êQTñ@£¨á¾®bƒFQÃ|]Å ¢†d¦}töY O-èp¸3TqUà­]xû»êà•1´ôÈ— G5ʽA®ŽuTŸêÏi"‚ipNS6œQÃÅäéÜÁI…H‹›4—jN…R„à*Ö%%œíà”œW 7 +熮ZÆã̽Pe!;ðP¦NŠßÚPÜõÄúÿHýÄàHÑõDÕQTKÎ\ZÔa’9´$–(“ø‘ËŽ=õÌ™GŽ$Ä“ˆ[yÜ. ÂB“4R¬í#ÐFc1#Zá<Ì­¯Ì¯¢ÁÑ ]£„ü*Ô+†»:Ø'Èïj•"€Z©°6]Ãê¢SÈ|Õ¡ÏŸCüËÅ©_šKw âô¿Œ6 ¯³jô苇0›¦Ø…šîäH$sU-–M±èæÚJ_ÿô’ü v<$7€¼r®]b¯ºÄ^¼Äëê¯ã%6ªKl”KÄcæj NVµÌ}Á™7{ìl¼À¥Òð€ã4KŠ¡’&W°íŠ· ŠmªR?Ro¡j£¶w4loA2Êù‚€ì…BáÅ©÷5báK'ó‚á;­$_,~oä§2ЉÞþqÁðQfYÜ“ ïÑáï’×ð‹B~4…Ñ:.z8zMEDks©ä6‹ýÒñH ±Pp~”™ÄõynѸÎjÇc}cr²`DsÜÝU'x.Ž9ü,è’oˆ_ ?Ç|Jýâ3ïvû5µ‘jY>MŠñå´›Ù†¼(e²¿Ÿxx¾„…¿óZ¾m‰®Ý’gøŸY0„ ZÄ{¯âÞ5í£\´ƒ$ñðp‡ØlÇÎcW=ëÙ ;IMXM$Ï¥ìÙ½È*€[ ,~¡ñ%Ÿªaf?Ÿ{@†¹8·b£+bèß~dɧâBÃèÉ’*«÷w¤Ï;ŒQ=LªÂ~þû{ûç°¶Üÿ˜©Ëž7KM}Ñ S2¾9Ôϰ㓟@¿ãKØÍਸï O±Epºí²ò’¦J2*~Ö´½ù°â`Ñâš·^éÞBßÞNÕÖhÙ¯ßuªóÔIª¨ƒ÷9ªõ6ZUŸæŠ;¢o9Æc§¼¾I€ÿñ¸¿õß@¶¾¢|Þ‘»jÎ/p/Ìj>‡ýö£N¥q~|ÅÂk±ÅÀoÉÕÏ8η[«÷ýÿ=_#w\„µ?È¥æ¹Ó¾n^ åJ ÛVéZ«9CøÌŽ2z¹ÿõýi;š=E(.7{RнÞq¯wÂ×¥{Gè(¡ÔÞ‘÷/ÁÞÿü]Çl_åöÇy÷?>úaõûÕðþÇ•'«ßîü#>æþGÝåw’ûtùcž©»ÓñüÈ7z’@ŽË'£÷:¬·¿Õ‘¤ý§ìr `Gër'âOÛ¯@ZOv7“Rϸ2D±¹ólìŸìîì¼>}~´~øÓ‚ʼndEî‚ÅÖ‹!".¼ÚD¥{ºýb÷ädû¨¶<~°/’äxÕ Ð¾|xG^ή'rºè4õÇò´×åëÞˆ_ðô]NtæðÞÁæ"óï réøäôçõ=S'ZÂgY<ÍŽÖ‘‹@O·O§ž!!%ÓÎéä5±©ûlý9Ï=•tÜðæÁÞÁÑîþó;eáâƒ×ù¹Âò ¬5uoær7ÃS· Ìh/ëå]:?»¸Ý±ðØÖ5×ì9îz(?ŽŒök #5ku-{Þh'rË—ÆëOB´v´þ|Ú™\,ÆçÐêÁ©_í¸L’OØ·5ïÉÖÁ^Î:µm@ù[‹Èd]Õ1æïŽò>nI>õD~ònFOÜK€ Ê’üøk͉£ê`º‚ž¿:ùÚÁeæ?Qœlž®T䟪G6aŸýSXüÇ^Ê;÷Z^‚j²6;=8<Ù}±û¬›hCS.æE úSk¥gÎn¬¹z—_ɵ»Gë–»q—nu“.”ê&kíän7ù.YqT`› gh6ÚÍôÞ+ײ9ͦãÁòðÝ&†àeXÑ´óÊ<à›² º(ñSŽÓœF¡z¦FĬ·ÄϦ­®@Ìßh #ôœÞº,å×€OJ5P·ßšITÊg=ª`½»=«¸ŸY\M»¤žÛ2ÌÔ£Yfêñ˜Fè½{ÚÜ3í¨Ë§³šÖ?}w¥­}»sXzo¥Ý©žôµL‹—Z^TAÞOîªjÌ ãÑà:é9uÇÔÔÝp2LÁTXv5PO}¥©ð®™›8ô{…=öæÁ#]Q¾SA¹aeËõH¤Ùf" Š9dVRYÊgƒNµ¤÷…îûÉVFbØË[>4·XÈ[F]u³ =&5†%6¡€íøN¿ŸuaúÛÀ(ÒO·%h¸ýÔ).N:gƒ ¤•þ¥[£<MQÐ>8h׋Ó~µUô ¬A iø×¬B-ÿÑckÊ¥hôvŠ„gHZ>p…‘3d/KË“? hÁ€Ú×ÌWL¯ñ²âbçr^‡‰®#­f¼mo ‚††Än*¾ua<ºƒ NXåÁ·Π›òËVŒHòN–·’åååO´æ` f%›7AqZ ™k†üƒüt¯‘ t8“iot; Ÿ NêÝÙæÁá¿|×& Äþë7ÓÞÛ°‘‹âØù<êJ Ý ^0óæ-º›^Q|‘¦gƒw`µhi¶ ½¿Á:¥RïÚØO¸méë:…l†QÈÍ~IðI馡NO¤Mõl”§Ñ•ШHÒ»B“ö½™OÓh®@÷|±ŽÚ"Å•1¡C‡a—†s;Ù‹syš½§à Cækkd#®€ª…Ø Å7ÂÓ~ÒŠ¦õôCÚ.éZt#©qÐDPw˜O¦><üçSè“ÝY6,±ú,yè*à9QÕGlãÞyZRŒ”{Êꓪ÷~}ñÆZ÷¾£…\6©™Í65Ã#üÓ^ÄÁd„Ç¡kEuÒ‘”X·¹·T×Xw’fxʧëÖƒ~î:ÔÏCÔµ˜Ÿºå ­tÚ’‹Üx¬ÎLE÷øfÿ|+;»<߸պ[Tí :ç°¢"È`>è!,.¨èõ8=J† TÌzŠê~~(ÒN³Ó Ï.PÓ.³#é»Òsë5r8vb8xÑÃÂož@´€"@õ<ƒõ¤sn¥T‘T#D;1²Ž/œ ÃÎ9m9X¢¶Y~IZºàˆð€ÑNZ¦Š` Åg>;ŸG£bÛÂTîX*©N?¦°ççCš×§ÓÎõrÿ&©02°¨½2;¥2;±2dþáÕ~¶ ™P¾)xS™âvî”wŽ•Và /'=Ú¬Õð-òÚ+áty=°%¨ð}£V€X°z$;•HñÖBÎø\÷uê›zÓä/Â/Ò¤â×Åå™ßpc§)ÂUGbÙ—8ŠÃïTÁï³ '6o;¯¦wQVø‰=2°ìHÜÚ¥ø­m.u²‡‚LŠ/²ûˆ² £[È,ŽÐ }žÓšÇz#ÜK 6õ~Úxä§ò¶åAbŽÖS_¸}g óSÿò¡øoçš¿O“:XgJ üËD¤·¢ÙQOUkÎI×í»iÑ"žðVÏÑúòÎÑú‹m”oÉbÝZ¸c@Rm*Ø6eÛŒ ïá!ÞO–ûÕõ¼Ø~qz´ýœ’äºzÄ[$7‚šaX$—£âr2O;À•w”Ðcn£‚H¼‰Æsî$µØiÿÉwœhùñÅgIKOÚY[+‰NIr´à˜Á š`Lßg‰JÒŒ)yUJå ‡hæuÛz©ŽVþÉfDº,X,ÓC$˜hûã”´½lè}âÜV_ ª±Ý |ÊÔMt¤2Ÿ©¤?€uz=&›Ÿü錄ÄBFBÑ>”zÓ¿€ Ÿ7üR§-£ª"ðø¼QY Ç8º8(+̉‘fOÀš6£Ú¸/¡iNöpµÒ¶›â‘L®)§w4+Å·’çú¿4CJ\ê3 bB_ÂxtÏ\º;– †&°ÂE²Kˆæ>.±¾¸ÓDN}²ôW‡@éyÙK#ŒHvC¾þbºõ=KãÙô2°]f¦ë½çn‚ùÅv¢™×Ñ   !Û‰Ÿ{¬Ü?&aã’ñ”¼^&FMs Ë—îrÀ¼yë=#5ÙN>ió§·ñ~¦—zb¦m<“_ dL®Û¡÷ÒÄï·ÐXw9·î\pØ9ÜväQ`rdЋÙÒ óÞC%b€˜Xf?ÝPäÞáZCO‘árSÅcßùÝùT7 >)w«_²Åž²¶‡P]5\ÕÁÇï@G Öî|Š·ï´´7dù¤,.>l™Þ˜ØËŽ+gRÌ¥K.ž2œ|æÍ¢ ÊΔÁDI4†Ód0KšI²2]²¥ïÔÌïÞ4'é+|ÑÐðIżh ؉±Ì>FO‡’í)&ñ’Qv—ú)7A;QæLcÞ<ô'Í©6#¡ÿÊÍu•SŽ^=çTg—Y‡OX-0ëTM:– ñ)ƒZ—¤ó4œ?á°æ.M8Þ™®ò„£&3¯|Ö´òy³ŠãªÏkt–á‚‚àµ"ǤaÇÇtG©kËP‰JpªÚ­S´ñ6›Áò–Š%i:í(Ùop÷lZð÷âm“Ó¼;JÂL2­¢iØ&¬²‹æ6 ”ãˆEÁ3 Þ·V-:¨~ª¸ÙJÂÉ•æ3³£ç:ç¢Êáì­ç*Ѓ4¯;Tš/W´î^üå—_ÜJE£ÔÚÜ=Uº\b¶È*é>¯Û‡HÞ­¸Á7¥8εµI!Àð¿Ãb²õݰÇd‚­»C'ŠŠ·Ñ`·¸©@ãùH¦ÌÛ°ƒxô%QçÙù"¿Èïá·HjK_ÛgQöW ‹Ëþ Ïs _EŸba/ÅŽrS,à¤ØñŒ±ZÅkyÁˆb€éÝ43KR;#¢§l«/YÍï”×túuáå¼?û­2¯Ì=ì=Òhu­©h‹o©û]ì:^Žà3#D?Œeä³%ãèxËÜŠm‚ƒ¼óíPXUbO·f-Ñ=²ÐæE¶ãž§:KŸÏämß2Kà´V|>ËÛHû<;¤SjRÕòÖôznJ u[ÓÚõîb‹Ûª¥­g+íœ×½ê4sØøòâ×¼*­~cJ\¯~Z_eéû{®|#:W1xžîõTïç/wn½Þ¹õ"8Xû±ÚÞ*¸^ /®„\߯ޗ=¼Ø×ñ–™Áh×µµZ˜;4Xɪ|2 w„š9ð‡ÞQYŒB^@#G׫K‰¯Ž­m»ã–…§jYxZZök–bútñMˆ;¶äÛ©\òÕUcwEƒZÊ ¾`½¨0WT+O½-üv¼{K-hoà»BÿèõôêmèØYØàŸS=Á0S.›ZƒÝzÆG±x¥æ))úfæšÚE­ÚU››¬ê–m;õ˶°žòºmgκmgþºM°ÄWn;óWn;óWn;_uåÆDËÚÍÀU.á¦8ÜûçGÞƒî8¾ÏU„¡[ AzÈÓ[¶Ò»~”Åo˜”ÏsUà‡TŒ:Ëõ ¿ñZ Æ¿h7þsöàÁƒ :*[ s/ÿsÔÀ>åÒ(Ûöd-´Hj8þéÕÎÎÞöü:(R?šº\Ç‹½“i–m£ °†?޶·O·17ÇB-áØøÊ¶4ãÙI`!åοëšn}(˜#Fý§'üôÄzŒOýg‡ ó<Àj‚¡·ü@üo<aÁèüÂ<\äཛྷ»wrÖh™ã÷Űó.;&[0à ƈJÂÀKL»Äf¨vrðq‘åN1<¸œñÃv" ª»GöÞIv5Û=X_Î&—³”q´Ü+ŠtÏ> pœGªåí¬sVÈ«‡º x~†™ú¡á°F4oFø†)¯ñÔ¼HGVœgÃKÔ¦ä.VÛ|ʵ¯µ“‡O-™æLòSÓJÕhÀqºª ð¦0Ÿ]3çÿJ ÑM µ£†O`w<v1‘Úh5VÐ;SçŠ~‰W›fÞûUý~X£l/“ÔÏ–a:›#à nhÕè/¹A_cÉ ú–­•V‘ÿ–%°»bLbç¾TBFÓA§ƒÎY6Àû6… éá2/¨–A ‹ì²7>˜°|¼šœõéÉòÞúÆö–*w9a¼š$tŒbAŒ‰ üåŠEPRT#å´ „f(;~vËe0¹CnJ@äȤKj¾l;?Qî§Í§" ͆ÞËú R{‹ñ*þ•$Ï£ÖŒ×YP"R€}”’T2‘iãÏ÷“Fò+½ú¾Ýÿs^áXñjS»}òÂTç…±|ìx%Ï3­¸RåTõßxã¦7ÞÃL ÈN=%B¡¸Ûyl~*EZêD\9ݸ?ê(ß]>¢ÇŽlxï)?]6<¨{·¸0/ùr -¥I<‰‘þM&#6 –xl¥'ìðÏÒ°ÅØciFƒÐÇü”û‘`Â>4 ÂŒ»˜Ó‡Žüíмòj–èt‹ËãUý!’[¥ ©4t°":öÂmTɇlc§ÒTKÓ42h±\6Kgùlµä—w‚<Åv>µýJ€¿ªêðëq¦‡¹ )w¶¼ñzÛv¶yézÛ<©înÔ£‰Cí5«/×`Ö0D•JcîÑÊÒø2VÚµˆ²“V4ˆßQ{|YÐEñ»+\ßTôÎÈ:æ•xÏH…CÔÁt mû%êF&ƒõÆ{¹¿M/Gñ·{'ôvÉEñ¢Ï¹èyü%=Ý —gñw\ò,^r^vâï¸d'^r“^vã<â—£ø[JÿÒ˜ÄKòËQüí½ÇKòË¿¥ü2¯öÐ…Ïj+µ%®š íÖ™^Ð¥¤ë[[Üÿ^ï^UêøÕCáR µ¾opjp1ÐxZ 󋺪ƒ:þiO¨ºÔ@­ ®¢S‹Ë@]Ô@áEs5¼¬©qׂåµpë[›†÷ÝÊ6 ïÏêx¿µµgúqP×{¦«¡ ÷L?VCíI?VÃüb€®ê  ÷L?Ö@­ .èÇ:\ê¢ :hÏôc5Ô®Ëká  ï»5”mÞŸÕñ~këµéÇuýøÚôc5ôãkÓÕPG¯¥«a~1@WuPЯM?Ö@­ .èÇ:\ê¢ :èµéÇj¨] –×Âï7 ïÏêx¿ax_ ¼ß0¼¯†:8ÚÞWÃüb€®ê €÷†÷5Pë‚ x_‡Ë@]Ô@S7 ï«¡v-X^ ·qrÌ]t6+ª{hãdÓ@uë Ž Tì@{¦Æêñ5¨š± 5¨­st b8×Há‘kÓº±¸ö ®º T–Þü鹈X÷â¼Fîµ…«Ñ·gáªëŤT§ <'ªþÏÑÎ@‰V£6EöÂ"skÙ k©Q‰¦HXKÍlÈEöÃZê¯)²™S‹*¦Hí1EöÂ"sk9 k©GS$¬¥Fê¤ÈfX˼޷#R™SËAДº%ö‚sj€Éݯ&ù9uX{@™WË«°–ºéßÙ ‹Ì©å—]µ“¾)²™W‹mm™Úi×z]*4¸ÒH¾²CÙ®œl)õä{+({ÿ·5W*ìDÒÖÃíníþl0öò÷5°Ž–$ŽÆÔÒøÒÒX‡4¾t4Ö@:@ gÙî}¾«çã/]ßnmËê©—«'´»/@ù¨hûùKqsœWœÐxV 4íš54íš*€¦=CS5ÐÁÉž¡©hzmhúPCÓkCS%ÐôÚÐT tpòÚÐT 4mšÎjhÚ04UM†¦j ƒ“ CS%é +TFUÔ •°fJÔI•°âfJÔ‰—0²gK´é2ª¾.£Ú«¸Èû3»lزkïÀððÀŽ,Ø4TίÚ> \O3c1=ÔÞÀXÔáDb^ @è™yÖBh_TÔ'СiQš&Ê-•gþÁÍ)ŸÂee:U¤ƒØ3ƒ*ˆ qVñÚ@|¨‚Xß8¶¤tΊJjŽ_[°âC%Ô8¨ßª¡Ž_ï9\•­ûõ[5Ôñ†£ë¬š.õ[5Ôñ†£ë¬š.õ[5Ôñž£+œ0jóç“ã­Õã]‚뾟½Õ"¯„<ÖE$â|é!­®ÿ؃-,¬›Š8˜…é‘'Ø}°ˆNÇÆ]r|lü%EáÕ€mY°^ª‚ 7Ç+±!Ø–«ÄVŒ`K¢‚mY°Jl`Á6°`ª±!Ø–«ÄFWlΤÝ¿mÁ*±ÑåÜÆÓTnî¶`•Ø,iu”YÂ,]Vˆ ”/Gö©/JÝñP0n¼ØÃÙy„ÌÜy'½ÿ'Фúþá÷Ë?”49(ßì ïŽfV)â†)à7…ãÉòÊJóQÁRVݾ®iùáx0A}š'ÏÚ:Õ¹ûÐz4RŠ"É0,# ƒ°è ÜJ þ¡@¬fò YÑikrûfPîÛ€••…˜ùäq 3WVoÇLxeæÊ£ÿéÌü±š™”n0þÐ>>÷ûE6ããwÐ’Mºýâ¨3:ÏôÝZ;‡ óêÃùÝtÜí 2 –丟;úÜÛûv5òvÕ¾}yûȾý1òVÕ³ÝðÞ3Úûç/”éRS‹Î‡C©Sø³R¢Õ²«‰w‘W“ &•žøjH.vKƯÅéâðÙ¸ïÄÊ6È¿J6Fýkã©—I«&+T7‰jî­ðP2njűivù( Ûö:…P> `5ÜQ6èÌò÷™—¥N3´¡¡ùd:»nQ’g¢ò#á]¯óÙÅ¥áµË³ë¦Gœ9lÙ¯E‘ô›~ÝÅdÐéfÏ K[I~Ê%Ñ<"Ë<;E,sŽ£5綆øcš±PÑ…~—ŽzÙUÖb1Ö÷ª…÷a ~Òõw–ø3û¾~‘$xä˜O êç7 em Ò– ®é×I‘ϘW8ÎDjñ¢%Xw¾ˆñÖ,Òü#­“XpOéhkªÌ“[UéF‚oä¬oBäB÷-"¾â·ÅëX¿9$V?DL©O“Q©­K  æ¢«Sê%àõº-ÌBô°¡æÑ'534%J™]NòÞóNqK \9Jº§¦ ‘¼ûžä…ÜK´ûÃj=‘yñ"L8˜Îj@$Ϭ¸ñ¡Œ?­…2Šq˜h¤:(wé“jÖõÍê^ÀÊWÛ“JSó‡—W¾_ÄDÄ¡DF#Tœ‚d ·yÑ™ÂÈÙÀ»I˜¤\¶ÈÈ Õ`ú'XˆA³ÿë-šÃÊæ¤ÁðÐ Q$Ÿ«O`¢®pñË×—,ïÅ,Ð!CÍÂÉb(¦Ý OÀ #  Ex(~ pü¨‘Ì1´Y¯×7åÿ,€bP‹âÿÔå^öZƒ¢fù¥»d¥E¶°(²N ‚G  Û5C‰^#‚Èß3QÛÕÌO}»yÿàÐÚlÑxâY‡ÿöâ0•JZtûn3nÉþ}8¡c_zXjUÌ Ö3§þmsó#†·HïFM&À³(ÿÄ,‹Z2B6×÷ö(“t ÛÀ’ãï1UÎìrŠ×PļØu“ñ¤¨ ºÎ©·Ö܉¼¤3ø'òŽNàŸoä`AÚàF4Lk"6š9 ÿ”8óòkb¬ÙÞ?Ù>ÂÜv+”˜gµ¢å^™[jºgp Ž˜ ·’9¥Vƒ•áöúÏÛn²ÎûÌÆGÛ'Àj:ì¥ø0wý!åoµÉüêt•%Δڙw¨yM¦k91ë“ËH_uÑî.¤,ìÌ ÿ-Þ38Ùãa§ì}œâ±8óT tUyx¸é ÿ,N†,J°ÊG«Í˜—§˜é°ž˜|mb°Ê'}b6_¾ü8àäe|ŠjŽá¤‚²'¦·ê!²èOHÉÞB”TtÒW¥äõB”œý”lü÷ ädûødA™eÅìw—¤eQAZ~wYAZ¤åÃAËâ‚´üîò²±{rpø‘iZÉ’$Þ†þ.>3|MZ÷×þý£¬J«¦0šxSzKáÊ׺Á’Sÿ*–4á#kÉ~ÊÔÊÏöÊÏÖö"e#ÏöÊÏÖ^GÊFží•Ÿ­mDÊFžím$Ífh^ؾ•ˆ5bZhf˜þ_ÝA©Ëª&të$øìÚâEMJª¦Î“­ãŸvwN>J蜺±'¡µcTÆxUé —·7u¯ª¸mbôäߪ»ç'™I¿nǾxµw²µûóG×L[a÷ÚØgûíÖp©öGöBÇUú»R¡î)‚ý?gÕ»nˆaqJ~—Û-–Øü$jC[cÓoÓüwiHhG¿¢)ä’fJŠÞ½,)§: _IÙar¼}2ßiS”V“Ÿá¶±TüóÛÀòOè¨]ý¡:~ÿ•ˆ¹í²6ÍJËÂÃWÇ?½´±(Í“Ëâ¢Â u[¢Þ›ºÂ>‹úõ|Ôææ\ÔóQWXsQïl9ÇâéûÛ߇‡ÄxR˜CܸjZKÛæÖKWm×f:­æý“÷sýëc`‡ü}v€Uÿ6–­_í©RV_Á ²–.Yå£H•ψ!õU)Ì̓ T† Ð)A›üÇÓyüòèäøc-‰ „ÿ1ÅïÛµHÈÖB„ô~WBŽ×ÚqÃ¥è\ô½Á²·³½¿©ý£ýlÔõ¤/aä8)Ê ‡ë¯ŽĤsYøx¦ù# Á`€š¹ cêÌ·%£4B—4šÇÕ5#Nm>I=×Ñ[üVròb ªk×YC¿%}µòĽþP~ †’ã~ùõ“Çîõ?¼×ÍbוEÉ'öÏîºîpò­÷>¯÷ðèî?uÔuz½oývû~ÛóÔú TëǯŽ6·?~R*y|9 µöîþß<|ôÎ×Ù?íê÷“‹Ü¾6Ä` N•aQï°sR>“$ôƒ‰Ól,Œ‰÷¢‚»”#”#UñÖ Îª0'¹ŸéÏ+]pµ…Η “ ï]F‹›Iž.±Wq ¸"º¬)5ÜqïQÆîñ%dN.ÉàúejløLqCyCn<2¢%m_ÀlZÅAþ>kSBźT‚tÝÞ¯%á§an1š‹ÄÜkTAwô²»JºßÄÚÚ× },shç{lØ å¬5×ܸÊèúðß´C’®ÖöÅljz*Y°— þ÷£\~£.(3÷¬U‘[¦açËhèOnKE Ift¡j9^æ¼ãÏ0cçæà/ÅhcrÐòýe&ÝhÛ|)ƒ`%m[Säý¨gêè{÷½˜J;ÛVßc˜LÂÚ¶ûZQnË¿Þýô÷ÅæÎèëÝý€ŸúûVV¿ÿáqpÿÃã'ß?úvÿÃñ#ÇëuPet#ÄÆõ ,‰QwÜ£³æî}—l±Ì·3x—3 ¾ókî óîHˆ^„0ÿÒƒÈÍÐH¯èºMH]q·AP3™x‹Má^®?îfbï?/0HÂÛ Àk´ü“×ãiïÑjøêGyócøžïu¦ç¾ +ÜÀÓqvu÷¾å³ñ‡D.ãe»B ¾ü0çöål¼«oãr©ÛùL§”M8‰û2¿Ìú&;–ØìñA ×¥¶IE>š5¥³15Ú4žŠÛæ&c×t÷±í™SzdÑe(ê…Áös†²Ì%sh—%šÀ8ß<xóúGKyÎ×¶ãÝW¹ó ª!z`e𺖼$ŒŽIà¦f’~huGš›¼Zhž=ƒ× ¾gfæ#GÞñÅx „à:š{ >ài¡ÞÝY+å Õ„˜~xØl%æçÃ?6ù–[‡uoŒçII+‚XÎCª­<ñ~®>n¾µ·Øر°÷/1)üæÆòäâºÀKhŽäš1x¡ <Ú à›ËðÓ½:ó_MôÕ…øtc<û‘2¡OñZºäG~?úù=ºò—NB¥#¹‡Þ†_Rúþ—¿¤zø$èý6Ý äÓaòþ‘û<§ÃO®×:¥ÚRxÒL¾ãÊé¶ÕGøs:t¸Šü,ùˆwJÊI6<E0 C6,!Clv=¡{é |ÎãÔg/+fùHnç=”ÿ•èuÀ(ÃR`9Ó>ŸgíähûùéÁáþV2îJyq“nlmÛw¹V(9²çbø´Ÿ~Ï­Z e(sª!ÞYÊÚ¾Ô nß¹³d›$9ýÿ#›ŽÍF>+~”Qð™ù¿±^ë¼ûôC®øÀrêâixÉcÿ/iÞJVVl⊼3(ŒNøK;ý/xŒWx2®Q¡ª¥eé}w÷ÞeÑ9Çc…€2¼ò}ÉtêiÎ÷ |¤¾‡ñÚ;†#‚Yr§Ÿ¸¸(=èËå3{#Ýj1É¥Ó2§M{p€Ì;=jîP]'‰n­9TEh‡ ‘rRzÚt5z·×ÔÁ‡5­å¬YÑ&®>Rái W˜F'³qò.Ë&t)Wdü&Yò£æ@o|ÈðÌÙoötòdÆùSÂp9Ÿžœ³BúºOï§ÙUrã²}Üd¹É¶Š<« ðt²§€¹¡ÒS“.‚Ã?w!öí«™ÄR¸ëß0š«ß’EÛ~Ä7‰Û*øåaÛQ¡dô­Ð©(rÊÙt2^§ »ëíu…ú-)$TiV1!2A׬˜ƒƒ4"øÝ$5³DZF‰?r³˜°Â ×øqm7sLÛ4úñ§µ5 “Ìí‡"´íÇ,QmÀø)Y[㊙N*ƒZh‘J}e<\o^b—9)QSè0R¸èÔ_2Zµº½KªŸ†-m¹šöÙæ½ìF7UœqA +A3Ï&ŸÈèñÕS¥YÃÅÌÔ-vý5õGœ¾à1zó·MU€·\‰Õ›læ¦m6©xÔÁâ]Dújž†Ò^Ïɨ@‚©dütÀ£Õ¨”àj‚R¨dMLóðeöᇫÇÑh9»}uOWW Rj’iÜwXÓÒâ¼€¡‹“ÛwÏ’TciÕ‚õø4ô² ° —¼|wP¹Z¥•€ÓffÓ¼é5ÛÒ õ‚UßVsbmh•<àÒ¦gxRí Ó T-$üÈW8øöÐ/„6»9*È¢P&8¸h®™¢èh¬SƉÕW3üæ‚ sæ„×¶´„[$|…µÜo6}Y¤‹Ö¿Êõ¯˜úWo[¿ÜF/?úB â* !gJÎEÆ ú>²G«;`@ó‚/E )Zª¿K}K7¢™Y#µ€1ºˆf+L tÉrèŒö²xT¡ %’¿&™¨Ãõ\5Ã-‰MØœp€}Èg±ñlæ ÃnûŠßv^§%F¥oø­‚1¸½ 4ÑlÜ“›mdDŸyN¨¨ekñÊ“œ•M‘îœ,ñÊWZ¦A·àkéÎÎKay‚Ôï·¼5ÌCÆft3çv¥ ½ •ÂtÁsëZ‰”š_W©æ ž[×j¤ÔüºÊ¥¶ŸÏ¯ëQ¤Ôüº‚R:®åŠ:” ,êghµ³þ óg@Þ‚Æ4l×ã ):]§G"ÈœšZû8aôvŒÊî°ÿ³}¿øñüÿýÁøÃù´3¹øº—€ßþþïÇXývÿ÷ñ©èúý ×™~ÈGxƒòÁxR|Þ¾PýþÏÕ'úû?«+ß?|òmÿçø˜ýŸx_Ëfî½í>ÿéì¹f² ½™œ€m|übïÏûÿ–ìd›â"Ÿ$釰ÜèïËã)Þ˜|?YÇ«&óó‹YÖN‘Mßg½Ø¾ÑUo¯X…)9ظ8±»<‹î© “;²sx¼ýjëfŽãÓõãÝcÌhÝÆáRþ³CÜ;±$ÒþÉÉõ$Úⲟ/l¼#q7îí6,.::žE·—Ïf2àÒŠ¥Šö¶ÝW‚!¿B·Ó½ÈN;ƒü|D×ʶtûËÛaçÊ{EfæöõhŒþòÅo¸ÈÍFm˜nÿÏÃ5Ù}¢U F„lÁþj'A¦'”œ÷:ñpJ•¤'Ëœò©ošÀÚeû–ʸ¹tÎe݉ÜÖT¿Üh%ri·Ý@'ÃÞ̽°Ì¿ÝFÌÚ?ã¶“ƒ°,w©q›Úî]t¬v©| Y ¯õè²êôÿóNáøùóôÿßÿèÿ‡}ÓÿÈÇèÿ°¯ë5¿Rù¸Xåyàó•¿®< £¾PñWê}£ø¿éýÏÔû^¯¹–éÇå&-YEÚ9c–}>n9ó ع ؘE;-àS6m¹Ï±•àÅm{Uà§R}˦x>£*1xø"?¿ ¿W‘Íä\Äýäu¦p†±Ïya‹ÐqG:fÛ‡ésSÞÂŒV3ŸÚ gÅxp }Âà)Ô?È:ÅÌ ¾ó’ããíÇMS]Síbœ6€:N‰îÚ ]”iüqg/ l+É®ºÙdæ7Èþ £ó‘"|1&cWŠe])‘Ÿ×U½dæåDÌ¡óËß,ËhâG&Oò•ÑÙ••'(>”öµðQ¯7Í ¼4.»œ4Eõ£–WM"#_y‚±«ë‚k-9‰+M+P(EÕá"¸£è âòÉqdk±,½$‰Á³Íç%tð,„J¢'Šƒ¾þÛu» æRPtŽF¾ð,¶=Z÷áõ%Øl Fb€ßœönÛoénso«=ÀÐî°jC´Ó<æS×Å:ärÏ{ï7¦ôjÔ²Áköl·“7l¿õíqÂi†öÈñ6\ÿö·wO~Ú>*ae8y¶Õ;~›N£—ͧs˜Óà[;ëà‘ÛT<³NŒixÚíÖ¢ÙùB<§R,ñ[A?ÝR zã<åîiA7gÃÉ VänÉ&ßün/Âi’òCÔ¥‡ð²C˜¾¥_rkøÉòî²ü&÷AÞôÁä>l öäqŠWÎ䎆V¡&¥ýL<‚ïâ5rû Átþ07LS@¡ô:è£@[ Õ͘lŽ1Ú3YrY >%~92$58šÏ»N¤È"—Ô‚ÀÓ©”Òéƒé´;z´Šçù’ß üoÉ_Çü—¿Ð)À‡­¨¸%†§!LÆ*VVt;Ý£ÄÞ‰õã—‘ÌVwt_wFÁõolxNð®ÆãþƒÙ‡ñƒXR‰»FÒÀå÷ÌWsvšíç{æ Ÿu2)#Ò¼ቷN ÚŽt—ä¤ü3{T>¥»-¡¿["Ì7v5å÷šM{úòô ÿ+ ŠOнL?¨ =ÅNµs:~l¥ã´xÐçFž~gü ¦ÙågÏÎi±Ò„wÉwxÛä’>Èøà´{’ËÁ÷3(™l—n­DK*…ßÝÎìMŸ§ 9ÎH‡¿mèl¼ùmS:ÝåEIv5Á¥ ²WRÿW³2/ðèsJB@£Jxè\ðæõ‹õ£¿¥Y«CÉøi’`êÊXƒ¦j|Êpà3Þ8‹}ë, ðàŽ,X-Ü/ °îøh}!|ÇG{‹Áí-÷j±v¬om,ÔŽW ÁI_(v–{•ÄàÑ«>¦—–ÌÄåwãê¢ý¸ºhG®.Ú“«‹våê¢}¹ºhg®r/aƇSÃW%¦3º7Û#Ñ92¸ë’·–jZDV•‡ÕEbµF"V£"±Z!ŠnwI´\lîy)[{ÜO}5Î ŠD®TÝD€$€°_WBØ ´“h%^kp×Áª(þTnxÙÐîjONª—®W–6 §B¤ÒÔQ³-•ý²eÓr¶’xnJ? e+Ñ™>[*#gËåÂôö‚LêLLrgÉ%1‘ÄI['’§Õ½G& ¶@0ìLßáéh5³²Cën>:m‰žJÎ1,ṽ7o›^͘ –Ô:ÎÚZg„Pô(HÜÎ[vçS !ˆ"©/ ¨2 ˆa=aS*ñTƒCŸ¸ µôü7m\n˜mŽC/ïñb$€,x™aŠ&Yå罦Tló7Ábµè ³Íñ½&xâßÚZbªºßd|YŠñ¸D‚Yj7$Cn©AüMÁçáÛozo)Q-§ëá¶1£ù&íÕÃrKN=bmÅ’—ðÝíƒes0•Ó9|³ˆWi9£Ri&Õõ+QIKë‘[¡7qh½@n!ºÁÄa¸./Ž< ®á¡€ÐåR‰X¸Ù| –áâIVNáYÐK±Fê]¤ª8Xæ QÓ?ÞMjYDÚýjiìĨyãlPV£ä¾7Åt&Ò¨¯2¬—¢¦¤ÉèŽ'׌êÍ[þ{3pïM2ÝßK†¢á{î(¼¤­‡ç´ÇÃÖX4?¹,O‘1;¥€S7JÍÀ}óV?¢±û¦jÔÒ`âh¥ñ;-ô¸µxn<ÒÍå)ˆuÑþ~뤺˜ ç7‰ª UÑ–ajé´û#Π¢|–Ÿªó”êš×›¾[ÓŽ­fÓ’d‰üdF“]jÒ„dÚaÀ.£ ®,Yp½×CÝ9|ð\!»tôâ´i½…†§ñÎÆË]çÓu™IzâJ*…1°òó& DÔ ‰\òê f°Ýå¿w»tFÚ(AªvBòÂõÙúÆöWØüäAwÚ¥-–å£õýÍŸ6’ôp:>ëœåƒ|v½|9äï²Áuó“×vÛy]èØ±Æ¸Ò¿cêr&ài-ôáš à ]ÑSº¾Þ©È¤CjÔõ<˹Ã,½o:öÎÚ^÷5ŽlÎÝC—všuè²yÛýšn¶Þeë\Ò/0oMÊ©îøï)g^Ãò:iÚM¤`ʉt([[©pi¸ ÞÚ.Ë[›S½Õmø/hÑš¹0Õ/Ù)ëfmõb{ëÚ9i™ÆÐf¡6ØG>¢–ØG´ÉÉñLJ34•Íû¦´×ͽñö:nPÆEàZjd@–;öPø%"˜­­ý! ªòµùe`pRÞ5(M*!•òÆ :òPñ°;iìY^vaIÖ#¦d´«˜Û–øå’+GÊ ôE áBç‚Ù ü·J‹(·Ýâ’ð1³V€[«1ŽÅ±5 ! ”„Õ³-É|ŽÕŽoRqò"øwOjîíÅ’õaÏ¿êmžÃKè£ô¡|HDFn(‚„<Ô)ùlo­Ä.Ý$+”½…Î-uÎjuáU¿0—ˆ xTâQÈÍ%ɇTjZ¬.ïCSªu¶ž‘L>&«³-XWt%sºsôðµ[iˆ> G9ËUY||%ááÐÃÛ,Õ†QE.EÒÑwÃfȯÅjәޫ3nŒ\ÐvŒÙ´ïp+’O›‰½4Å6â=*æ››y–íÜvÚö›u”|Ýè‡ÖA8Ë0°•sÙž]ª\vø’6Èe;DrÝ‘)\¯3€yOY(éâœ-´2ˆ“ñ´3Íycä ¯Ûž¢5íl¬ÁÚ"bÂÝLþ`$Ù̺lŠ]Z#ЉÊól´ UÙ¹Ž¿æ¯Pãf-µÄçÌíÌuf6”<£ÙÆ[Ý$Ö6Â7Ôý¼& íÏ_)¹2ÖØ®ûbY%¿«¹­wÇRcýnrà–ñ Exµ†ÃìaóŽ%ß=ÚâB4–Cžm„qª‹Ì¬÷!‰»­ŠœÄHØYï`â:'öÔƒkNWÍÆc°éyÖ(·È ï{†=Ÿ×®{ÔoЀEèåR܈t{ewÛmEixhÏö™±)ìÍD~V()úþ&÷(s‹ûãÙ¦þE$fõH‚!9†øó"j©äH§-¾(@r¬ ª'ô:¥áÔ‹H—Gq‹ÏN-«§Í຦h‘fýˆ´ŠZ²|+³™“Ÿ¢+ÂVV—gœCT”Ilú+O²’ÝéD73®ëŒ½²Ká ´"6kVÎõ7Ñ9ÍÉè"ŒLlªš |i(Úò  šË @¿ÓÓ˜ô èÜå&˜Ðƒ\ †HE(¹'%c è(>À"—xDû-†â2DÌöpc§—t^Ný¡1\•PT¿Þ¶n¦ ²0oä’ðó(Xª×<WÎ?O.R¯ym¡·†ö¥*y–öDQ¸â¥²Q©R¥l%NÑF‡ 2\:SòàŒ^ñÀžñfJ¯y¾˜¥rßé©Øí °»%©²\e“­nð†v9üÿ¡u"œÕ ¥è0f§Z‹6S¢<šƒúO¹þÓˆ Q„ÚQ§?Ö)Ê*«:Üïo©¼¾§ ¥ín¶p(¸ÈNszxIÖ3v5Èæ ÍÓo²Î[à þûПm©¡ÊR)f·×'+°HmݲÈ™Iâ£RÛFÆ DA'ê§²n’¬C3~ÇD qNvvÓÝWk.:y N!í»³À¸±bž«`<Ȩtt¤C´ûe޼#sü†¨Æ³.`íLÑWž µÃq1ó¢÷ e÷«Ì{Zæ)-aæ&nEEÄv~³®SÇ`ºÄ,{¥Ì1wa‡ÒÚêçÇèR%ÏÝå 3Pê…æþ0#‹ÇHJjãöš>7HU‡;rDiΞ??+dò–+0ŽÊ u/KAÖXÀ‡¢ˆC4Í >™¡CBÕGVjWLšˆ½@±¤. cyçKæ·^¶3˜Ânl;O“ô -šÔ¹ó”£®ÉÁƒFÒü‹‰®šU•Û®¿ 0ˆ:ã»xÔžPMë¤aäâÀU#ZæXi7ÝsT‘3ïðxËÝ3ïžÈξ^ ¨{PزL¿ÖzÚtÕLÑìAr(ðE¶­M¸‹Ù=“00Ù§¬D`ÃašÉç!°Ñ2 #P¯8±]JÀGÐΦ/²aâÕ‘ºÉ$˜9X"«ë,ãkúžg3ž>ñ’,åN¦=B=õ‡‰Gh7÷Â/A£DoWé·KîHºÈì°æ—öΚ±ERŠ]3;8¾™ð±;é}î‹2a¨ 4»oºÍªpKOQ î%YE˜ÃÔS’^ ÷tí뇗mO}-®´˜^‹{ÓLKnLrÎÔy9 …x'jŸª&‰æq7/yÜ8 pÒ\aÈèõ]VŠÑâpÀ1mV«a»M ì—ÁV1Ó;Û²sQZõSIŸc7ë>·ÃTÌ^\³ º S@öå®!KÑíÛC‹'Å-Ü¢·†’‡$í8ìˆ"/ž!5vÅP€²-¡Œ ÷ãKÊY…Œßšs9z7@†ËXd¹yž–1óB>ÀkEèâ¼Å`¿€Ð<·B“Pê31ÖÆ¥% W ÔG|ÃFÝã5]+±Šj^¯=à‡5Ö8k¼ÉȬíR:W×b¹%0+ ´âžÆ^ÓÅà®›­«&æKç(0±)QûÁÞNõ$mü“ mA`‚xÙ±ä ܇}ñB&·—šÈ]«Á]èòA Ñçì Ì©|–÷Êóóx ̸IÖuO\ÙÑ®5Ó¡ú':Ž”ÖlUüõ¦†éjÕÓ2Ú¼ 'úku¨e<ÎðnyꉧÕº"_fâ\«‘ ´Dò¢B´X<‰jÚ n^H$ŽÐŽq²Ç†k [Å“ç‘AÏe6ÀD¼.([­Ui ¬²Sj@¯ÝÏÕf¼¿aIÍ–¹Ó[Éu“ßáöÐuÊÛ_Dfx*§Š,YXxãÇB6#è=ðf„R§w¼äQ·JÐŽñê!îûßuM¾öºö)Þrû€»µC•]ïU ¯‚ºšÎ³2‡~0<÷Gæ^¤f˜íö“”Ä´’Q­ü9$´˜*•DtüK8pF‘ASÆSËtI…ZÑ@zÇöå*€l¥\ŸHXFÁå6•·:ŠYúƒt6óú`™Óñ=«Uû}¤§ í+‰¡>Z@ö”,tp<ÑÄTé3lõŸÌ°•ÊÇVoðUÍÞ2úEY¶° c+´IJ)z^LD Ë&µ¤’IÉL³·½¾÷qúhµÍ%Ô¨mëÄC‹¸L‘ÓèMkÆ$. •CùòãôÉc‡rÉÇEÆ®(/î—Cìæ,,Ãñº<;ac¤-‡‚p>%y‘Éíáø¯òîáöÇm鎧¼yÙìeÙ ÞerÇÝйSdÕ$Y¯aËX*$wJ(2|øºª}•oâ‘XeªˆtWÀPŒÚ”Õ%Œ§?´++ àç3ÌL¢®ÆÔÄgþ[ksÑ`¡qVˆ9e"æw‚µ÷MEæTÿcíZ2k!u?U;€ü²rEÁŸ4ää\#اñìüªüôŒ6°£Ö]„#äo“ÖßÇš¹;Â5}Óã´:Ó^!)¡Þã†x?å³kµ-ùFáÍCYGH8J lˆ4Zƒ¯+ð÷j5xµj_¹ûX‘ʳ/~xµŽÁë’;Ò´9ŒGMv—7·^òoëóxµw‚‰û>b~ÒÙ–$ô;X–ô¡ˆ«ý"ÞÑ |™ÐRŠÊ_â%;ÜaÔ+r—^dŽÖ%o`~ç°˜-ãc2Z(- §3w^íä¡T†äì.ÿÛæ&” Sã|l½e|Ú-îa „R¼xÖÛÓ7|ö·¶­ {P%L ]Ï·çÓõJȺ4TqŠ`ë~n›„7ŸÞ2õu$ƒ§40lè=+ €-3Î`Áʼn)(ÊüØr¨!£¤÷  O­Ip?)$•Y̵)Œ£a6Ë»|ÏÄËÑa5ìúÆàá{&{Ï&1Æèèä3•]rŽ~®jiö¹M&ŒSLGANB×ýdƒˆÙBé½p=ë§tQÜœ:âe€pœPèœ\µ«9—ÐiD.8½³ SoœŠœøRÙ9ŒOsKs[…Àº9$/MÊÛQ×i|>¤–÷ºÿ§Ð2 ú?XY®ÔkË•åªß–ô„Á®™áHúruitdçkèÈ1vexbz·P¤½…)í%©MíýŒñÊÓb2Æèh È8ËgÃNbµ¾¿Õ\N” ÝíÓº‡õoî OŸ2^õói!‰*µÆ¢éù%]9Ö1îûÎy i&Þm •1F=¿HÇÆvâíHb¥xC'çÁ2¥˜'lºñMàƒ…:Ƀd¥Ù¬Ñ˶æP/¯„jÙ¼!äëÖ•fYmÛ#¾5ŠÛìǬ8Íœ öe|¤e|ÉI¸.áöª÷,è^—nChñuÿJ3¦÷ËòA›±n./æ­yA‘ÃÆŽMרìÆв´§Å|ïjí¡–˜tòÒŽ—µ ¹¦•òDÓ)?ÂYe×&ÆúâÕ}"‚p*;ýzå$ú³¦¢ç¨! °á2ËÃÄÓ|êÍ+Mv¶™Ý9rÖGëò²YVY2k}´sVk—UV)aµY».µMµ¬¿Pœ³¸c‚WË"s0™åCÌ…JŽ IÖÍñ†T?Ònl÷Kn:cYöÌaý ¹µz•ò‡•ŒE¿Se¼ÁóOJ[ËÄk0ªwœðàÞaÙ´[1ˆ¬örˆVKÍbj‰µÂÚýb¬õ“&–7/û^j¥—«Ã‡ã*UãŒ5®Â²qcÕV¢h/› NãÅŒúC-èìªãÐRl ÆW·Ô°ÆMH™Iµ´ˆ2_‰k-.Ý ›áÙ,øW¿œoåÛU IƨwÇï8ÁÅÔøl½…ÎÈMû®x޶iûRÜGú/»Ž¿6[Ž~«ÊY§ºõǼ¡mÆ3QëT¶²â°Ô({™o;—˜àÚÒJ•|= ZEQ “ò1ñþïÆUú`|Kïâb|9è%ư„¹å 7‡ÙàÚð÷>)Ò³ñìB”Îyt-ƒ™=ãH_d€+DFf˜½IÎx#3ú²ƒÿ Ó ³¯+„™¨³æÞŠzœ°cßó;І †Hžé¤éÊx…¯’ÿ•ฺ‚!“¦WÉ_@eü_øõ[~ÉZrÕLþw’>è4› éÉEgv“ŽvfÉsP*E– ÉJï—]óÍhò¸mhut…}èéù™¥ë½ôlÃ,ªšI¼ À_èšh -K‹«ïøªtühï 4 (×ZÅÊJ™]£R­xT[ñuæÖz–k³œ.d Írÿ÷¬Y©·(„Ó¿Ñ3÷múÝiÖÀ/0'éy¶¼¼ì„X¡¨¬Ôä«<Ù 5”¸Ê]›j–pX¹vE×nÚÉWÒ»qâì&¢£ã[‘Ù«¢ÝzÖ¸‰jÎG³ S| ÙOy·‹I¾ t]òƒÅ‚‚†¦Íw<ˆÁSÔY¦11[yì`Ÿ¿Éã­w¬Ë§\¦zq°,7“‘ã+R2øèG‰ˆº…‡[u„žì2,‹ŠöjXî~©c#î& ¤AÌ@¢=ØŠnfÑ,Qi)<5‚¬RD¼t©ÌÜõy­Ü®•ú—Í 2pJ/8h / é BÆ >@#fžüËHvh’ßÜIúƒÎ9Ý6²V‚*s„SØùY‘ËëuÇ‹ô’)e™âµKt¦e8üq1ìåPÖdУÕù>ZEËpû0ô×`z*f˜ç5Š‹‰0aãwKÅbJgX!1h,fÅ @‰¥V´8KP>Kó• 80_õÄ5/~œ¦Ê?7 –l|q™h ³MÌ®|Õp—>7Lþt£Xš†À°¶8tµ*›âyßé°¦É.h)Œÿåûè£N·ÒFâPÚÛ95„¦Ü ÄoŠœ_LjW‰_êX²&¦œ®†á™óûtúûôét‘>-7 ®O~w’‡‹‰á´Ädy7W §Cœß‡V}TB²­XûÁ?Ÿú“Ô´?\ ²g!ÞS$ ó}unÎíâoj¢oêcoR¿‹ÄÝ|Žœq{«‘Æ^}¹¯Ñ$†uÁjeÖù›Äfª:ÃÓ~;Nü+•{ò_¼÷SµôºåžZVI¼ þŒáJ1Ø»¬ÑèüÏÖd¿ËiPÙ¥5=§Ë¶©›’8UFH· mà+0𸜺A6:Ç+Àò!Úªù pIž*1ê ³b-É—³å–Ú(í’_w™Zð÷ìJoÁú»¢R;¸9¦³K×›¨ð¦ ζ×J®]´É »g29˜(`ìäˆ{Æ f.4¸I2;3(%/‰ïv¦~zÐ\ûQû,fT‰òÞ9€©ýn½´¡0ߢñ^ºUn¼yPßv6ŸDÙO圚†#Š_†]îæÔ€qîEZî‹fU£‰ú΀–²åFä}æF±òdãz–­3 7‘§ Ä„|sè3€ÄcÐa6Þ,å‚\8¸…¿rŽ¿ûÔR"Â2ø ޘ΀ñDª’ DJvÝ«¸X’V¤×UKêºdlÒ"É™8ô_â “ŽÎÀr¡xwà“Fd4É) ¬X¥±Rä”§g´Xpʇ¥ðñ1åíÄo[ô } Çö?ƒeÖá±ýÆÏ`'Ïð?³`­ÆØ0‚zÚROP %õËN[jnI-õ*^³÷3¾œvÝvßÿÒ14s€š½ëéHîÊ€+¦O|ä( O£o‹’r:÷9õËjc—ˆÅ ÆÆŠ{Y¿…§e…Êîå¬8c‰V2•·Í:i½m|@Zd3Žÿjãi™;Vê×,gV•þi’eï@ŽŽ¶O^ퟮ=‡e‘k¨W tò.1¡ÙÜXÞ̃ãl†½<ˆuŒ‘¹±Ò«–^Vƒ|˜Q\3Öo|e³¹l„u¹A°ràQmdÁHx‰ ³ƒ`X`é€!kë{{ Þdx§~*Ú]à4Ñvš{‚=H%˜m¹¨!Ý\ΆRã¦éݶéd¹þ‰ bo·ñüŠ™²(7ÖˆÅÛÝÓ½íÃrŽ.š·^Zoê5Óο¡§?`ª7PòmÓV|Ãu(vû¸ëÐ1d3Üð”(û•˜¼.óðpÃ{ãcÜæ‚úžŒF%Ò¬¢ÑÊ×µØUÅÊ•okpu±nΊsÃÄ.êz¥Öªïr~(¼yÆ‚þ4>Úêi¬Dé6"éRStiÓŒWÜZ WØ*¨¬ªÃôßÀr0ÊR¦E1I+^o„¾M…Håkt¯¡Í ±»û›­­íÍ,pZ°‚mŽ\.söóØ4sÚè7!–,È„1µ@Zx£Œ\ÅÏLU‹ˆüŽÓý™BU[óûun·Ùx¡ÓwŒûªu]îÀ%ÝêŠ+G–,jJ7—:Kå: ‰6øN´{ÄóÓÈ™Rÿƒ„\ßû’äᬉ Ș÷‰Hb._üV+™;(ÝGl£@à`ëªòTòªæ¤Eoz=VϺ¯ÕŸ®C¯¿J‡V÷èõ¢=*WðИߡóêÍŠkon¡@7xjÁ×Üæü÷<`?·V_{üÁ8]p”.8Fçwéœ;*ÇæÈãØ¦Ã œEÍ#f¡lð•7D¹Ž ˜Ìöž·è–Ó2`žùó,ZËh)ãK/œ¿eúÇtOëJ•^aËíl´±Ù6ñˆËÕÁ3°·uE …Dó\ƒþRô—+ÅïÖ“ÏÔãŠÀ§œ‚…+zT*º¾`Ñõ°è>^ÚZ*êbÚà%.`P®uØ4-&êKÁÒÇ•ÒC^…ÙÔE|ñZë¾DÎ13rN¯?Æ  ßÀƒk³•¤ßíbpŸ<„Ïùx6Æ•6>±ñrô“ƒuˆy"+®àØåë²§þhÙé'WÔ>vàŸòë‡Çü¤ñ6Š ~EaˆÄ”ðL%l!je¡Û~œ,·aÁ‡½òwJ‹]íØÕÿ÷/Ïø¶0:|J°ûÛAÀ‰CxùKû™Ù¯€y¦Ð¬W‘Õ.‘µQEÖ3ÕÎõí*„Éâÿ¢ܨÀ÷¬Làz%>EàFÏÊ®Wá{æðíWá›Ûù§üŸÉS÷ngö†\9 Í´J`£SäÅrǃ ê$am4oK4F‡¼::G’í9å¯ÇOGp?±_|¬úž»ôÊ_Þ¼(þÜßWÃáÊŸ‡M€_W]L@#tzRï¸:úx¯ÊÁ4æ’>|}]~çãô¾ŠÆ7ˆ•y3$SÂÎæÁ Ô>Còé_Òöé£'N\ûWŸªSf`EáàQx‰è¸ªj~0¤Ãí\Q*d÷›>ÜVz%Í­±SZŒ8ל¸ºn1Lø¯ ÿ•“ËâCg²C‡ìçÕÒovÜnE÷©‰1­¦“dèˆn¹P[´sàO$¦&±¦LU_ÊÇÊRõ Ó•T^#Oô¹“j²Ã,°Ž³Ñ/.Ó‚4XfY3»»ìÛvZ%Óm‹ÿ•qºµ¿< `c'ðMáÛüŽ¢|¤ªàº>òšo.3’¦ËJuÚ;U)ˆÉ%J_ä§,~V›OÍ­&{ë?í4iG (Ãí$ Êˆ¹½-i;ÓñPˆ£]§8qäͯ%Nê=ÆzŸ&–T¦+ CbM,ó6ÊP'™eÅlÙuêeÌ…×yßÉÁdtȆRÙù@ð™þs9Ń=¥_Œ’"tåžá¡[tÔ ªµädûøäåŸñïý}M7–½L¼Ÿ¼¦; ø µ¦‹®ÜUzºåîìËΓf©•'M<Y±˜#8™Œ‹"ǃÅy œ¥Ú[–"ÊšDyÖé‘)†#•%WN:ÃޓLjqÏf€7Ç=SŸ&x‰Œ š1Ë!ÄcÀøÓø&Älqã˜&V£ÂÃ!í&ü¾HÆ.YZß±‚ÿ6à¿­=¾À}ý'xÿmÀ[?AýÇcº§#9I>t®)íñX£z1a¢ ÷ÇPWÉJ—z0æ¼ïe±±ÔiT8ÖÇ£ 9z´þK+9ÚÄ?ðøs´õ ¦÷ž :]>FL×òãµîìš¹¥ÛßAB±çs±ðÅÜAÈ‘]ø]±ž}ZºÛ\k¼i°¤sƒWÕØ9JÑÛ|¨yT ð æ=ûó¶ªiH…&M4sUÜ—\¿- Cî³#殂êVÇ ¯œ¯’s1ô ßà×DG’Iü}–z·Ec¾^•¼æ©ìQ˽.œ¼ç²àcôºÿÅæpB¬F 5ŸöÒ}èÑa¯Ë0k¾ùH9a,ör7R¼•m—d<ä,âé„¿ìÚ¿8ܨgÙŸ7 ”üR¯*å¥W„R{ •òÒ+B©—sJ©4ÙÕ!è¨R¿ÓDó9t¨×Î’9Lî8Ö•Bk„œ¦EiCZï'GN&:“Ét<™æ(=n™A"Ù!¡g„Ë|(¤b&[SGFìl<šê-~êÎŒ,,/^ˆÌÜ toïÝ|à³|ä¤?ô‚´`ÝiG¹“íDàbÇÄþÏ Šƒ Î á#ï*p\¸äf† d³J- N±zÄyLoLqÚ€WçA1K»0IÔ“¶õ7M>-Og©œ"‹A†$…O½¯õ<@G§½CÞ¿$]‚pð’WV¡NdYâ²s·f ûYéKIżÆE'V¸/ÆÖ_§Tt0ÌÔq7rÓá£[|r6eŠlf­<¿èÝ„Kì&P #(ÒË: »×6};ªúeåëë77±Â”ŽÛAfÏ«c£5 ÛóÁ` YUQ8¾Þ¤ÈܯÆMôšôðêo¯¦¸¥>-ZÎN—@J¦¼ƒ`$,ÿÞJeZ<’çL~ !¢“θ‡_D¦÷Ë© )¯išf-IŠð-a¦œS¶E2ó²WÇgSXÖF†¥1<'ïžÏßh¤(+…ŠÒÌßkwýHQW §©ã`Qó¬Áb¾)‹L°Ž•\“¹2M¢ˆ‹šzЬo‘a‰¢Z\‚òÍqž'ëû[|‹ÓØH>ÝŠ‹óá(òX®`»÷ÆY1º‡—ÝetþëÃ4Gí{9SWÙ¡zwGhõxé~ Äá 0À.EKS¶0‘ÝÙô-4 9Æ.Å­k ï.Ë*ÚQgì’îuŽ-‘n¯ ǶG÷² wš˜ãì€l2ôÚÁ¼„^7ì7úôLUqôr,U¦Ê¡È1“õÝWiOõªC™®îìÒ¯x÷ ¯€p<»Ù—S8Ej$2º 6)§%µô¦úå¤rMC>gDÔ_hC“Ûm*û—gT-žFÀJ¯ÀoR½o|ãǘҶ!m÷U4í`hú‡6:èc¾½af8l9OéVp¬˜3ög¼Ä.­}ø\ÍKÖ~X;ô®±×î–J%‡1­›Pn€Wv‡ØÝ$«¨ÕªkäCc&êÓ’µu¤{Ê…ÙâÁ[ÔZ—îV¤@Ñk$™q¸S®K±b5Ί• V„Ãë‰×Q¹vÓ’YKÐ B¼ƒö@°¨qÄ3Á–ÓÀ.¶¦MÄ låFb¹1î×jf:)í-ú­ò· çï„Fkêv)ªZ¡õw-ìô,€Æj‘sÖ!7Bf¤Ï³Ñ2~9è'„¡YÛ¦ ÍÎîQ–}, °gvO–_üÌÆoÏÐ ’œèU*ŸuùYR©:îâSægd-`Mˆ”ŒRƒÃª$Uˆš\ûKÄqÉ~©¨Ÿ×$^˜¢ÑM$;mRìº ]×$®ïí%û—£.Æw¦çº<ñÈ kó(…øKL3fÕ‘æC!‹”óV ÑmÝ;x}zr2-·$¥UmLÙåìdÛTZœdB¡©öðpÖÂI1.ãàÉ’ˆv£XŽ“ƒ£í0ÄœW¿•Áè6˜œsßÛ3õíH…ö@Q¦ÎšÕ6*cÚÀõN—„ˆO¬¶ˆª)µµ½³»¿g&Ÿù•A÷vÞÆ3ŒÏ\¶*|ô:ÃV)Zúƒ¬×–ã)‘Lÿˆìo» Ö>2|ôyÈÖ÷÷NÖOvöIQó•Bâ£Jåb¸r)"ò]ºë•KBK¨¢]¸EK€Ÿ‡7–S¾)QªŒj6LÌ+­ï2¥Ó¢®4µÉ Â?Ú\âââ-ŽdíŒÙ*¹÷ÖÚ$ãâÞÓ’‡FcCµIÇ!aÅ}×â ˜ªÜœË*ïšÞÐ)/t‚!Lƒû@Ÿš íw÷Oüò'ž†/wû6 )á(¤‹Ú¹P‹fٺŠÐïSwßmrüo)Ó€ªú€—DöÐ<£½ŸÑ5ÎK”¾ßK‚¤Qåç#—nû8 Ö±OöÊү˷7¸µ,?iÈ{–,rý§.åÂùtÊkb%÷2¨„J EÞPª9Ú[Ä%0뱕à#ÚY|Šÿ˜"Îfs2K€cР[¯6·ð¿ÂðK,‚wTŒ°M-ûjǾê8‘:ÅH‰&›˜æjfÖ¸78b |a­‰¼p§»\1sȺ­ø†oåØ7>mò§âà¤5˜@éý_~ù…2’ÛÇ¥M´Ÿu<ƒÅË^¨ßx´hi8€ï™ÀÓ•ƒ¾ë¤OÆ”‚§–Ùð¿“£íõÉÇòXn{š e}ƒæµáæ%PþÿcïMÛÈ„á|µ~¢MÖ¤‡æˆÔaÆt^”­„:I[Þñ: E6%ƼÜMYòØÞßþÖ»ÑMJ–ì>f2Vw£ªP(…P(ÔP„ò}’DWÝñᤦäw«×Ö¬gÅ4þȉæ‘z^ƒ8šÖä_×h`FHŒ5ó(éÂ8¿©¿%5÷Õ%Ýô§[ÐßßÕô“ 9n|YxÀþR’ ”O#íaï™]G:¾ }6÷wÖV@Qã×?ü¿òÛoœì5·¦å1þ·<ìî7%ø­­¬ÀßêJ¥²Œ—Wž,Ñ÷¥¥'Ë«K«€ïËUøßJeíK••Êråbé~Ùÿ ‡´c!þðϸ]æ<™^u¡=–¾ço¡w.ûSèW0¨Qà‰*÷ŠÜF‹¥ Øå((kL¶¿Û@fÄ]Çñž°pÜïNæÜ^ÙóÅII Ïs㨯¿ÁNÊd`NÁdn_¨¦çG¤‡ÿ¿©¬½EÛÊF«L©YI;nðm)K¥õ"­Z.þ¹=XÄM¦Ö‹òËåbÖ„+µÃ¨«µ“‹Z5¨]F]3¨Ý\ÔeƒzΨO ê9 Zw â’J‰ÿ¾7š–§Êg4þûâ9#ðR l¸à7‹‚e¡?%“Eá€WLZG‚¯šOç>xÕ¤u%øšE½¿ÈβEOâ<±ÈH¯Ä:=PäëT‘eðªÅ?G¦ÌæÚ/µI5Å6ßå6‰¦àVýE¿Ð5]j‹ˆ›Ä@‘»©"Ë\‹x•*²ù¨g“hJl¾JlM‰­ú‹^-bºÀ~^ˆ-H¿ô&›\g?…Æ¡éÁg!v¥ºéyêÆ‹ëatMOí)/è+Ù0$§xŠ6äëM‹µ‹¾=^z”L ²‹îù‰š¥ím¢ Lu:oÞÊ8G¼Ð>è·%IÁ„dQbÕw›Ï›ˆÅ+‡o*.*Ë4…³«qz98=g¿¾/¹sBîhµ/.`ZEkò*â‹B•ªuÒ¥šÆ@•€—E9„°›vQCJ¡D¿Yz‹ 4»é8 “Ðuª&áÜIX6 ÉÄNX±0œ„U £o'¬Y™; OLº°ÖMÂ/NÂ/&¡²äÐ*z¥â¤Xe¯T«ð•e'Å*}eÅI±Š_YuR ü* Úõ’NêYÕ‚g¬„ŠPµªv²•°l'¬X +vª•°j'¬Y kvÂ+ተn%¬Û ¿X ¿8\² è½b¥8e—Ã)NáeÅpŠSzY1œâ_V §XÕqçÝdŸø-úY /[ÕÝH^o;ùqÌa4õš'=«Nêš%â£ðèñ=ý0¯G‚ÿ=‰ÐK¬xéã:ŽÅ‡vÜ_á-Ž´l[¶Àï‹./ÛÓhçZ3P¹'$mmn)8hzèpÎw2¦ŠÚáa°òṺt{ÜSJî‘çh ÿ¶q7ºy„–9¾uû ™, 1Ží·-Ù{ÔÜÞlÔáig¯©†=2`×t†Ì{2 qw<á Ë|»\pé¶AÀ'¸>Á'†®íà–Dv’r GâÄ:Ã[« ¾æî³°B}Ûè3n¡mÁP °;Phô7þ„"©m•H µ¥/6äO˜E4&ÛRJ„&9BAG]F£}}m¯D¯|‰‰¹Y;´|J-k+‡–ËÞÄ^Ù * ³tÙ¡Ur8Ÿ”íZ§bPëèõ£AWßß.¹IÌ%KÚ%l:,pCK÷.¨+áO¢ÇÆÆ2‚©šrÌÒC®Þ UŒWÔ‚õúªn7ª!Y!O¸î釬á%neœòªS<l`üv/ÛÈÚŠ_[‘ðê—ÃíŠö,ðx3>6hº¼”PT}#Ü|¶GÓ~'a•ð(§ú¦dqFvHïõë×é,& °xÄŸž*èèçGo ®Á„?‘Áêþ­÷f×FS½ƒÑ¨‰n`>ÜM6dmÑÕ†\7å-º/ !êÃ7Ày«”Ó¢ZÊÎ ü ¥¾)q3—-lبí%û÷âÿè:ÔÅb´(–®W@XuxXÅöÔ‹ü V¼áç <‡ïô¡žÓ÷eMí3 ðQ¶ê@8ÂxçŠðq >nÂß'ø—Ûçc zmÛŠÄÁ6BÁ,¦ÓŽã¾Áß›6Iô™Jˆ›s‹Ö!ÒZBÐC…üâžæ¨b‹Ñ8Üþޤl@‘•чñ=C—0$þ‰à¯»½¼†¸DÖʘ1úSÑ¥²¹³]?ÝKb«_iƒï)pÎO!ôV«‰0'øàžäB7·`Âè â5AŠ\è×Û/žûʼnåÊÙŠ® ‰áFˆï¾)rÅ`k倇·Å‚ ÐÍÊ„@bøçðÿ}Íš/ôgS¾ÑŸý—ôqÿí¢'˜- fÝip ΢AY48‹gÑà,øþé†Ì¢ádÑà,n§œÅ)gqJYœr§œÅ)gÁoôHŸÊ,Nb[Ll‹‰m±-&¶ÅĶ˜¿Ñ ²%‰mbоNéÏ6ÿ9á?Íä?'vYN‰©æÞüf ›Ë–ü{*ÿÚ$°ß¤NAíŒ;ïþ{ôßÓv·s½˜†h8ƒ4ÄŽC£ ±ãÐè¦i84FQšIQCœO“ ©  qâЈ4Nq€Æ¶C#-SªS"EëÕ@ŒÓl`Ÿ°R ñ[\$çç)Ô=lˆ4—«—«4 êZâ&Pêß6Dšõ6-è<sê¤srân‰ÆÆH_Ê~U¾@xs–¯(ñÆÑŒKïíô#uT‹}€¢E}ù®^÷vö^Qz·ÿ>ÈwzÕÎ[¤7%•÷’Ê1Sy¯¨K*ï%•c¦òžÛR\_íc)çúãý9le^ЇÔINƒqŒÓÈ6Ý锑N锑Nóq¶g‹q¶g+/#ªb*–®ánÔyŸ¹Ú¬PH¥?š…Ä¥QFÑÅ( Z e<}¿¸àWÝWÊգǎçváÊ<ïKØ­Ö©Ì+ƒ >2ë³*]ë+G¡]gVƒ;ÚMvçTÓ¹ÇkI½5öÏø׈éjÍ›Â` œxüL¼¿{.ËåšÑ¶œO9€§.àƒ&is /=±>4OyËô¦€ÌËËoí÷ZkÍÓF*;”Á¬Ü©Ü$Vnf[ºlç§ÑÜLþ¶¥ —ÂËÍ®‘Ên޲m5R™),§¢º0éF£Õí Ú_áfEˆ º(”àÈ-Œ.õè…3njHMÑ›’‚î(xÊÙ85Ш›ÇèÞ1“@6)%à_'AÝKF·’Ù x9ySþÝ¡ó<êº2¾¾ä›¸ô…oÒx@Ö.|à¿; i®;ã!sm3½}¸¿GYÑÃŽWÕ8_ œzù,^j¼—ÄÞÿb!¦yA]#™ÁªÀ†Ò” †ïB*Ø]ðù]][;¦Š›ú;^Œd=›çëñØZ]ã)ªç9‰£N? /£õèΚØ=Z®ŠÅGøÝ£µ\%°Š& ô¢ <†œC³/iî­‹Åu2"*kb±²F˜Ír•1›µcEH+{í›}Ï+ýôxaôCqÁ‡úÆÒ©÷éE¹1ì²"Q$†Ê}ñEB4Ëÿ'0¸ÕªƒçŸ"<ÇFZò`M ®º‘XlǃägJD-9‚‚¥9t&I÷ú7¢">fŸ™vÜ ðžÚN°É"\]…iY'Á;‹Ð_Ï4y´K®hŸÇч¾¹iž@(êhSŠÊU¸â?ÖiÓÖJ'ÍdÒ¡µx¤ €Ü1¶Þ[$@îª[¬óHH•j@ÒD0^Åú’]’% ¢ÅÁ½ÄDK Ê„.jßè2µË,÷—õæ²ÜVÖ{ÊÖn²ÙO–ûozYn ëÝc¹o¬7Õv±fyÛ9ð˜ðŽzÄ;oe­‰F4}È‹Ô"ù8<ú1Âc°¸Iµ;—ˆŠÇS'ò £;%€x:À3g»xXÄ8â¥ìæ("è yªØ=:š€Ø61À+®/Ye]z$¤ue²;Ú÷Eä6´;kTК¨¤±H h«SA6ëôl¡×mtynó7M A6§nhì:eþ[^æ¿@Ý`°øé3kãà92Ù°pêŽÏ$ã Š•ÏÁ–)×R*!YHÁlÓ³_·ðÕ¡Èß=„cgZ7âÈÈôåq`ã4dá'C $ƒ†S·òQÌi„C(v>‡˜Ï¡Ä±¾á÷£<ž‘Ø‘…Ó4á.JIÄËÕ/¬×àé-XøB0ɰ¸#=ˆ ~×1 &t6Ê$¹cEnmå®äŒ= ÐhrH2¡vi,ãOçŒsS¼6ƒ(`¾x@òä! ¾;$Ž>ài0Hq+H¶ÆŒÌ rIgÝ’ý–ô{&LßrrRÌù9e#ýž‰sî,Ñç*+¯T¹ye+7¯,¬F.–j1Eé‰ÍÓYÛäUv>îÀ]âáýŽ:ÀĶ9œ;A[¶)H·nBwૌñÂzŒ³h1 i1© “Š6qsKìw8à,a˲*ùË_üÍt}wŒ•=“úB[³£®9}PÊÁB'«ñFü¤”%ߤ>?–­s’é£bÿN¡’ ̵zƒó’„­¯m~š&ÐîvDr~.ΡbΧø/ñ¬N€½é\‚1 * Êã‹% cŒ= ™e&ƒ7ê%ÜÚ<<Á8ëoÿþ÷-g&¢ÀÅ«(o ?K…ÇÅšp¥q|^ºÞ΢uêÒâÕ¦;Òj¸´xտ޴Ž]ZïçeŒ®—Âk¦6Iq‡P’zö ¨<} ÿüÔ„cÀðjà“ FôùsÖÔ(êÚh#sá§fS†?vKù$gmÈ@@ùçglƒ5 çƒÏaÄâé*F®nÉÈ|ðiFt[À‰oÎK×¥Á[§þ)P#Çá.ÅR^.¹„^ µqZ `Šì\ô(ÎO‰Ö/²)5æ§Dë Ù”Žç§ô>Í”µp1ítóCÁ§ÔeD!_)æÑÒM¯‡ÿ.Ù|5ë­¿ÿžßÔAÓ•­R£^zÞ*=¯—@¡×K›¥Íz ”àvé¨tpT:UøÖQƒ¨0ÿ7uAJ ˆ|¦0z ¥= D§\øB³ÖvБºÃ!ûþ¿oí5A`Ð*àöþ᫯/!qrÇ"N®’KZˆÇˆ\N“?zÙ|qŒÕF¾qÔ$†op“ë±XkV°d:ö7ÚÃŽÈ@.©†O*"¨-!‡RÄ”$ŒKé4L‰W‡S<9”ª.¥­0¥Ê[Ý>3)U,J‡GÂ!¤Ü UÁ˜ð[ŸÈO²`áE?†!Ôñ–÷«¡W;Ý?²³üëpÂ\1lÚé?¡EÚýÏj£–1Õ<ÿJmó+['æ»ÆiºF°£øGN£É}±ÝK¶Ûƒ][åó,JƘyƒøoQþà%V§#i?çã™Y³"¼§¼­È6èrðM¼-ľ ûaûuD£Î˜.xs8Ý›õ5VW¬@kÄc—tÄûºßcÊ^q–G0Oñ²K:l˜DrA>©ÖÑI4ሿx ]C—–P[äó…£/~?šÛ)Rn÷%êXöõ&Ì_"Ö­ø#Ãq7~‚7ªtccþ 7–)–Æúº€öÒÙX•‰_èkÒ?ÿ”$ˆÁG ‡NG£Q”ÎõOðgcQ2‘.Ä¡,W g¹ú…› Ë핪&)à”IJ jcÔ-¥+dƒå s4nÛ‡söÊ|ȯÏa¨áJûlÒ8ô4üI¥É(sßv3luÚ.àL_¶‡þÒ’oå¦Z$ÑF*0 Ö ÇQ£-L;òôÈ@ç)§¼¦×šhïgç¢!ª6Q[¦j¯QNñ°«#jŸí›ÝèÒ™vˆï¶û±8wÇ‹ s¬•Oë™¡Š šJúÜ©µ"™óqt›E1}ÑŠ‹K’:ËíUžÖóX1±S¸tö|nìT-Öo¦¦D¸±JŸ¤YÜÞj¶>Mâ¨×¿ÙXÇš¦n˜L7èÌäò—LJ6‰èÀ†öa:¸¬[ŽjPŽ!Šklc5:ÆEµ@(TÎϼQ†é•üCW™I{Ñio|5†ö³{YÁë-ÃߥÉÖ$pAv—"ç£Å]°»Õ(Ù„dÿ.)"V­ªT¼—+˜N%µ»SÌ×áúÝ©òÓx²\BÉ’`qvbgdÓÐy…é,]W §8v3$a8mиnª`V\sN4µ°eÐQg®]nLl ᎎ˜tZÇ~é@0,¸x†^!4&l˜->^ü;#•“«ó„ž I©R"Ïäq¥h‘Ò7üQcMèŽÓå-^±Žòx][™Ék™-Þ·’]+‰[š,? Æ×µfkÜëå¤TŠØ.£-uÒ]Db­*Žú¾{´ðàWä&^ÂUÌj±bŽ6|¶* ¨j€•0À²XX÷dèú„EÛ਻ZQR”-láÁgëÒÂW;gVé“›‰Â8“×ÖayæpK_\Vßœ¢Â8z¥¶‡gúU9H°hþ´ø«]$®©-n›!`*©½¼“²*  iL»ˆ)t×àpÁ}XBÀÖ¶} ¥§8F¬Ê¡`µVÕÍ0®:I!.M?Sl*c¢—GCôRx®mA#2ž%Vƒ²¿VF’;£óøŒ¼X’Ä<É’U EHH­· >²Oa²S5f™=ƒcg¤Øó(ç0çó@­Â¬¸çÊù7+82cJA›2§2‡íBúÒWEeûUÃ¥¸4ZÊo 5%Ãé0ÔŠœß× žÍª/ü™£ñ­Ûmï³KWöq¿Û§TªeŒÐ&’ß•š3²ÈbŠÖ²V„KtcAÑSª.LPYúP E­Œäo'·.›ÆT¯¥~¤Z²ÕZºÖ²1k§òÚçÄ G(gs]>õý›ÖuÔ=ä/±¸²á”š?›§ƒ¨ÌTÁOrᨪé^‹ýÎåxB‡½'Ρ)5ÃÃ.FæÃ8“ÔlÛ—ízQ#«Œ½U`ŒÒì¬bHóþƒÏýÇâ`‘F£”­&), _ZÌ)¶+‰ÔǪÕoõÍWuMfÁÀkñz-Kp¸> %}*Wq”Š3æÙG9ä:²bþ{êÏ¢¢Åëþá«:‰døáp²$#0&Óêä)B“6‰;( ²åÎÉ K"¬Iâ媌Iˆ&nì_liaÃT-f9¥]®–Ärµhg„tÝl¸'Åk+3³yŸ‘ ^º³¶âgsleƒWÉS6h¹Z6¶_­^3œ`^±”"ÙJvÿ¨q;bƒ\b§ó#:ç¹t¶îƒ{9Í_:ô ÉJUÑsÉßFxH>$=›|Ã%?—8-ò×3ÈŸºäç’²E>$k›ü–!¿µ×:<âà Ähƒþ-‰™5ú”ŸeWêÖÞÁæÉIÊ#¢Ì!¯fkkÛPCeçByrŒûwÅùUFq’гLs 唨[¬†„Œ’/ôFJ\xð€*Q=`t¿”~%ÐSª0,`tKª‡Æo³‘XG$Ö?wFczÚû̃õô«]Ä ¾•Âe„‡¥,0¦ÕÞn‹Ç:xµ!ÿfWØ 8ÿ5u¦r²ªŽgÈJ÷‘Ž…Œ·zÐÅ»ngÞ ÇR²WåQIGr7£Ì$"ë—…Klf N}/­½W<ü©XsúÉ‘”=ö)•¡5š¾l,¹.í„Sì]4.L4fúPIË'ÁQ<ìƒýÖÁèÑm³°IÐcöÝq.ÅfŽ(ÞOÿôÔ¬¾’EåwÌàèÒU9޶ÿE|¿¿ßr`–|¿ÔŠè õЕRCá9ÐÓ+Ù©ü‰'(²Ê§–©è,¯s#:.ãBpÛ ©Nã)¶®> Œñxù6k¤âcÁà ` ’W;d¸ìÆl-Ξà%h8Ê)žµ:çè¥fy`úy¤T¶ Ë4F÷W3£ Ú€HÖÏŠý[õ«é¡Kì{ª™Ô|—p\,ƒl —Äi‰ël§.‰­,çÙ$¶\»;ª½‘O°ôÿ††„§žñ† Š’ÅT{] ÷ðhwç¢'9X㉇äx<É’¼½†±½sLæ^÷½úVà;éñžRgmzB×i:ξ?‚>ûã`˜ï²iÙˆ‡q¿áO+Qµñ˜÷"ˆ1^=+4›u!/S³wTŠ†ê®žÏôp"6t\²Ÿ?4–®:[–wè„ýpîÒC÷ iØÀ9w]"̸(}ï Ù:AElÒëèá´!ö­“zý¬þj³!o+lщ,·\ŒæåU¯7ˆÍæ‹—»»ºÄÚSX.Îþv}ØŸâÂ/dµ}VßßkùEHjîìýõåþÞ„» ÏsX…±¨›¯³t¯¼í~ÃGþ.—q”¢cäá9L. º/L,ëøe?¹(SRaшr±p4¾‘…^QoPxU¾±ŸËN4hŒº›qçR;ÊlûxÉ)žíøŸJu]<­Ás[,íã•ÅÕu ™4»ýÂ^yóàà°µÙÚ;<øÔç³èÒH©Òõõ³†m콪‹³"º·¼Múßö¼tlp:Ý8Fj9<1*Ê*˜]i«¹¾©ÆûòÓ1PiψvŽ7'ÕŠÖAnüšFRÞësãXN T n¤}2±ìóãä‹(ƒîªo# ›>­ Û’ä¤ZüuÿˆBK©ûªm§[}Äâ¯ÛÛ|ÀYÌ ‚ñÛ'u8- `²›L5>®ÝÛ ,ëcâWîx6\{'î—·ã B£ýnëåÔ~Ù¢s;O™7ï÷Úo§Î¡“øe-ã» o÷°dB±—ÉE$V±áŽç¤}Šyj¾Yo͆kë3*X‰¯,ÝÑŸqåºýzê¾nÉãõY¹ÓB2¹?!vT¶¯¥2ö¾aD‡²4ŸL׺ÏÀK퇺k)•(U_8Qªµ¢ “À{™}’ê»Ìt•®ž ~ê~ ÿë ?WŠn^æpÁ¢ü²¸  Þ¾Ñ •*¯Yâ r%W…Ú£ÇÝh’Ь 4ZÊÔ¿ƒ‹„c{™öÔ±©*žÚ>aªRc!ðÄUóeÞ·C5(ùLºýÌê-Ṉa]ÆäE÷ÝÉ“!Å5_¢ÿ­6\ý6D ÄÛRŒÐ@GÑyi€—z<¹ÇÓ’ ¥GC”…´F ê ‘ÜÂ<íÑ#K  ዪ:¨‰$y!É.<0çCñ<¦=¬‡¿jI¬Mƒõô†ºÆ ÔnOÇqwýU„&ey.¦—®\Ï(šþ‹ÍU ó‘WCv«‘Ÿµv3áVè4n ¼,$«@öíÏ2MÃooÞú~;HC8ÍÀá@-]L-ˆT5@ÃIŠävðf¯üÏ!DRç vcxŒD%ø[«ŽÌ.Ÿ¤Iu:”V3µ<Ò_˜¨ÒÂoTÁðÃ[WpΉ'ú²¸ð¿}Eæûþœù¿½ïxK@·_ÿY­®¬þXÿù¿ìú§OGQ4¹¢¯ZÊ_ÿYYy²ºâ®ÿT—V–ª?Ö¾Ç µÓÍ“ƒ½ƒçú Φ+Î?âJÏ·(ŽÆ¼Þá¶‹ <<Ä•±3¦“¤Q·?eJ½þ ‚i+zÄ >È+yCF¥\-Wyõ§ðè?è8Pu©\‹iڋ䬩ԂA­”W³PE𗻸dèVïN7½(eÑ].?¹%ÝË6—«YÊÔm…Á‹â¨^?zqˆ—˨E(“ûZy%'÷ÐR•Á}2'®ZÐ2˜ëóbnÑ y+ì†!²\É%‚6ÙD~g'±L<k(UËësT\ÌB·£#h&Úy×~'vËI{mÐDñlúv9N&^U~¶é˜eÃÐê-ú-ŠÇP·XB oÚCs„¢¸chÙóU«·-?¹ev&BÏéôLÅ)¡iÏã,ž3°2Y©Ü’ÉÃÉT(qÏM;9!P’€=ixãp:땹³FO°«a‚Q’Î6¸ÕOÁþp¶ü $#x¨óòayP½g•%Qøp¶TBŒAŸ0.Ì|þh¹/¢Ee šÙWEBP(’ØØPåÊB1½¬ÂTua*¿Ì]$j߈q/…*Pd!Ó3KÃ?šÒI°fàñF~ ³gŠoí‰þS)Bžçx0J‰úiu ¶ Úb~ªNºRÒ•|)ÌW+–ÉCɲAÝ*¤ÌùtCuºI†`ÿF˜‡¾><9&Ž-7Â?Ë«hµû™Ý¡Ò3«r)#@0 #˜`uÀeMcþÆSÑx,-½Ôâ8ÝÝ¿aIû£PIT!@Ýf”ZT1@¬g6}ÕêMŒAè0#7K³DJ Óüî¨K÷$— Ðû-X•|𦏲où5î¤w°‹Pó‘AÒbµqø¥X›Q Y”͆ÕZRmz‰ÏLâx–Þò;Å[Gª#Ì2ŸŽvò˜[][?« /¯°~‘­xu.üÙÕ¨º>ç-ýT?d¿´ùñ¬‚UV±`+\®ÊÚü4nQ8úé:[½Uégzweåv%u³^¹}ÖŽ€~sûÜÊ¡RÕÊAk‡uK;TfŒûßm«Cþ´hæì¬ß^¹ùrk>ÍÏÂܽ9È„îà0Þ™§kÐø»*{Fîô ïwÇŠ‘?%œõ¯ ýŒ–1>ÎñÓíOª¹ÓŒ¹~älpöO"7ŸrEmH´žÜ ­Ñ³©¹‰iã~å^ÈM?±¯ãMÍ ©E¨cµ,SÔNK!°j°™6ÿ?ž KX£û )î>3÷Ç“æúé½q-朎¡Æ£‰êì…‘x,†ElÜ#Ö\W·›«Íýc9Ì`G Ý!°;š›Ý{aøNóÏyèfOQçøÝ~n7Çïθw.Ë}ãNh÷ËÄí‘n/½{ãøvð÷”í- o!šÏbÔ|%{óÎÇÔW k6Ìç{Z$º~çYeþµë sÏ"~¬/ÈßÖ*™kzÁß-gÛw[Ÿû:Æý¬dÜeŽö5«_½žñµ+Bú‚ß}EÃZÓ0ëW>ïkIã+æÎ÷¶¦ OßתßÌ2Zâ›xðqÙ–Ò¿x™aù¶=7õ3Ú–OÃ~1ÍÖÝW§ôï«êÏççkš•þQ'üŠ…3ë§Úß‘€Þ¹!9?yäþÖyÑ{\Q$ÕFhx‡é6?½’^çàÛÀæXA¡™‰~^Ë¡…îl½¯™wp™€b(ñ=¼÷?×ÿVÓg¢ýUShü}“i4þ¾ÿ±õ5Ø?‚¿» Ý…ù{äû¶ÿšÅ†[ é>æþ·àïë%òc¡á-4Ü‘tnzn5èC~·rÁs®èðñ¤$âå*>­ßê,ú9³˜ê|lºR]ÑÓ•êª]’Ù³ì9ç%ºLóϧ½v[½ÅL6e.Woa†Òqp‰v‹I-Y½8'B¼[ب·ñT?mÀÚN›9Ö*…PGaÜÒl»Ÿý´¯¶!çL¾N¯ÏšÍÆ¿Nß]­­àÓ·p^û¡Àþ×)0 e†x9ÞÆA¼o­Àðr† ,÷÷¿XÉÅê[(0íz+¥«KßÒ ·šïœ,·Xï»õ—½R=ï.—¯$״ެ8+÷ó¬úͽü¬WæoãÑfmáÝÊ{Mg6×@£·\*þ±ë5ßïß`×ëk=y¿/ï}l|}ÍŽÉ-|ýg±ñu%÷æÕû üz¿vËí}{ï×»×0v;­™ñ»[W÷)ƒ÷Vš.ó'÷·æ9—w;ŠrÇìë]™Í{Ü0ûžÛ[ø­··à sùÆ›[Iÿý¶¹2ý÷Ùðú ~öWˆÿ[뎈ߎ¥ÉVØ}•à«6Åï¶=öÕìÞm£ì+³ðþ²œlžj¸Žþ-w¾nŸå·<«žÃ±î<þ RÔ,B:jc—Ä›·Á2ƒâÍŠÿ¿>|~ü¯å•Õ•e?þû“å'?â}_á‘p+ZFpoQ/x‹h&"‰†íÑ´ßqâÃ{Î}eèKpp¯¤1jSX'_ëàìèäð¨~ÒÚ«7E Z(€,pî @Àƒ¡4à‘/ÉæËñ¾µë~wz‰Y·GvîGºÄ2Ë‘M“ß{*Þ×^™ƒ`>Æþ6'ïæ¶ÛdºÛÏʃzð©"DÌ ‚oǧo´â(zÑN.Mر›ÍfÖ ŠŸ¢ˆ¦ŸK¡h1•®\{Ì+‹a?ßþJÙ•[ÂÞò‚„‘¦»éD|µøAtZz[]nÙ0À-ÂçS=˜ðùBtÛ ø?N"ñ®IÅÞß(Ò?®íÿí oÍ£^¤G IÏO›Fhù@'žîµ^œm¿l5ù^DCò~Þ;ø›Ë h® ŠÕ󯆻7uº¡ˆ¶âÊÚû,vzëÅÉáËç/à­ÞÜÞ<‚^¥…AíñoX 'Ž­pök˜þ‚âÛÁ“±÷Y&øó"ð[±he(Z" €,NŠKÖQxŸ:WÓ¤5®mlœÉuÉÏ2í8”ˆ…)mJÀš.Æ6±ñ ï¯ç'ºù±(ÙÁzvùa ÁùŸi@|—q± ?}‘ßáE~–ªSø]%â½E& ë[Ç5Vm /F&½Aâ{¤çϸ*dõkN×á²Aï}±#µ¹0º>)(贆ȵÞ§¼é<©Ð+€{ªå‹³/EbEîZ̸‘Ý3ûŒ˜³¹ð¤µhKß©ž´GQíÓ`Œ—-Áq¥²Ž^Q—ýš~]þ¢q¦c¾w½&ozÇ«bHYŒñKy:¦7eýS}0Ñ çã~à OÇÈœãeæÒ´çÈŸí.ïX}"TÒ2{•xPÿŠOä¼An /R„â°S#ÐQ New('¨Ÿ8»@62 ¸$ÑÁIjš—0_8œŒtpWÒ¼xƒÉ ¸+°äˆSHÕµè!®­„Q×Vf¢ÚabÍ$¦ŒPèàõ“Xº®h/[] ÎYôZ5€çÞ’‘å þÈ®±!(0!âTIJ †²,zE¸G-Wª+«ÁŒ¤/Ì'ÞÎr/…ÒL"P2гé#^Hè|Ë”¢ÛÇ×]<îç¢3±©<ääÈ›°á£Í™o½·[X»¤žH“¶Ñ8Ð\: Ð¦40<Ïçv¤1øõÜT1EI®Õ íÒy1EA·%Ä×/9YªF„ðêyÞÌLjKöë¹ )m6)ÃT“ÂÌÕóù|¨úb2r—j—ÈWêœ/-ñS;œÚ-ÚƒMÇlr6ç¥n:gu»™Ì˜ÚäLMÇͪdYï^$ñzï‚ñ.óY44ðCZ?€RE~©º¥K¯TÖ\G’òÉà¡D3…ԌɃ¤™tDúû1U™7¥Å ÔÐŒkä/ß2oQÖŒk;QBà AK,3óH™êaüegÅ/ƺ¢ËˆpüFõJ¾ij4¨“{Ï^æa|¦þP?–-þð\A4$Äó–üð\B4Äs ÑP[ü¾©¶$À¦|ßä×-•¾)Ó·äû¶dr[1)?¨÷#™~¤Òåõ~(ÓUºüp¨„á¯<Àë–´§šUd¦=,åÔÖÀ—¢¹º)TËá¹f βÝâöÍQ»Þ›írܽ!Ÿ‹öÍ[Ó^»QïePs}a•\MÝìÀĘo(jw:fåH_ÊÆÁ™QB1ΆúpÏTõ}RH/팔5îÊr¸Tˆ<ÎÀ¤.}žÂ=ggšŒé©êµdóRÊAÔÒÂ- x'ê¥×K°RbœŠÏ6Vò›·ŒÞù :îx·JÞ¼-9¹r²ÅYLç™ÈÅM“¼¬œ˜W¯<ix5˜îô?¾P¾N¾}c7°«$JŒˆºñPp_À PÓ°5 ê­½W 7ý„õÇãJÑšðË®'›6µèîÍÆ5ì d¨h éªÂ½ý— IØ<áÇcý1…“CŠ´Û6ø+ö]’^œLGƒ¼Ú£|Ïî… ú6M¦ñÉ[ò¤JÀ,L)AB9Ûʨ¯zŠ5³k̉ڔÒQ»ä4]Dà[ÊžÙ»ºY“y§DÊù,ô¶)&öXÎþÄ_à›ª‹GEçÞ’IáOÁ­Mr=×sl¡Ÿ¤3 jCY¤ó§¯6‚;£ÖZ_¶^Q9Ù5¸?ÊV!íÄÝÚ@™g!Í4‡Šsz GUïnóø¤Õ4¤x,¡¯;ö×bàxÒüå6s©ô,ÊÌÒ³&4üL©SîÆzödÞyâêeí6h‡RÐË…&ôèV*hw~D Ï­ƒ4t¶Ú½›R=n:C}o}¢ä凞݀Z¤€¡ßJÍ£WMò®IÞõ“­µFþbm¡ƒà7G£ñ”¼P“€×Mû‹ZøàådÜÿoÓ•j_ÐÍöTN„ÙØ@0ûûÏi”¾±}Úœ1v±qXÂ}yZB7n¿·h{D¾ðëf‰ß$àÉj¡E;I´·mmrZIãbmÅdG“A¿ì¥w|VS -Y†Z¦,l2Ø„>i/ª³’nšDÑvp Í5ªÛåQt #x¡X,ê«÷xK“rU.;ÓÝü\­Lwý\wíl±Ófä+L·ò¦:ï/(on4â!Úc3|’m—ã‚ÌŽÀ!/HöF„®ûs‚j©o2ë”#¶ÒæƒhtyBãEßù5ù#„Ž1hÍø“ßqåÍ( äw Ì#(:xþMÌäÐ,›Ê¥< !1›§úñ7óØÜÂÇ…däˆß¶L *ŸeÊö«Vs§ÚÜãD|k⤒âƒvü@Շ̷aòm˜|Í×­†ÉWQwˆë¼‰«Ï HäB©AH9ůÐùܯ´%´Î¢Ř´;R·¦ {’‰—ò9›{ر€wnÏ¢\øðô¬­bÓLB«”áj™†kh¸††kh¸S wªáN5Ü©†ÛÒp[nKÃÙ’4Lêõ>ëÕ°«WüœËÅLUbZÈÔЫ‘ó¾¹ÕÒýMw2;'.ß¼ÊÅs}’®´Ëz:|ÕÐO[úéT?mn5 hóÔ<ÿvjoXßÍssË‚·ž›[¼õÜT:\­±›·¦óF«ûn¢+äŒéÿ®ÛÙîO~Ár;â©®†ëÛp{ë²ïñÆ$<(¼=×} ãz:{&`޵dÐO¤ù‰{ahÑ¡´Aç‰È_D™dÒö£ý³ÓØÍ{c›¬»$š²ë‚ýÎÑ~ì/Ì$üøÈü†ÏTÀ,‰ Ló7´n±tüoÆ{Y"Oè³hx‚·ª'QrÂäG “`ÕѺ…Ö‰®Îm`K&bVi“iš0WU¼\M›àhE§XŽñÚÊ\´7†‡•Øz3¹!Oç†Üš’7îæ“SÞΛtN^É©ž§V8¼mп%1íÞ0âˆÙx˜ÙNxw‘Ú*¾z£1 ³$ÈoÛ#¤v¿¨™*kiÃÚ KsM;²ÄÓÓDì-ºkÑ{%Màøë(¼ÔrÃÎ+%µ€òkrÿœ¥"q;ØK ÒãT¢²;²Qæk#øõ4øu+øuWŽLäW¬S Û;ÚÄlÉië®V>´7°¡R¯I¤kW®t›6)  ‚p5ŸE9Dt¶æGç…fÕ:ò8åeç9 ÑGYªKÚ·‘ÍÐznZÏ´ $M Ü2"0î¼Û8‘åß7h¨ŸÙGÕ–Ó]ñiWë®È ]dQ )q`-ëCqéWÄlïi™? 3ÑE²!¬8™ôƒ¨k}“dÉ!ðv(ät‡(ï6üõ0Œ*—:–â¤#ô㔌œP$æ‡Ròɲà“ÙÎ8N6påŠG}vF:¨ãÑ ÏÙgQ#[ÿV€/Ê‚Ö>oXÔþ†%nô®³üèÊmý¬ÖñhiWÅ”Äo躇A«6ìjS Sh#ÇŒäP‹i´NÐ2uf.ƒ#Ú=™t_aÐå0øþßšÃh40Žež š:ˆÚ0¶(€Õ dc S¡IõÆ|&k6#Ô f›°Ù¨–f›´Yõ<œ,spgÌë;cžß s%Ó;QïXRD½cQõŽe•NJnn;“*Û¸…ÉA‰,nê«w5Á³ú XßÝþꆳLòlˈ{;›àûû¥x¥ê!DŽϒ<é³[O Î<´™&~)V–‰F¤É§ñ¾4NžNð/Ç-4ºéDl‰º.¡t?1Å—&t{ïI?éÔñË~rQ¦¤Â¢ÁY,­ÞŽ'`ýv1Ïà(Ä%1¥Û\ =0–—Jb.þ/È3ŸEaŹœ§bp:óæ³jáÌ›OÕàtçÍgÍ™7Ÿeƒs>o>O,œyó‰NañÏñ¢ø»(ð5ñMüéºÌ¿‹Åó9©AmWÖTÕÝÌ_Ý)™Ì_ß©3oN«Òù¼9U-¤î¼9­ÙeêÏ_熽yszb³7oN±FÊ­öëù«}¹*yˆnSïë6o°nSóë6Uo°nS÷V¹nQù‡·¨}‹Ã[T¿ÄÊ­þîüÕ¿¶"™ˆoSýë6Õo°nSýë6Õo°nSýV¹nQý‡·¨~‹Ã[T¿Á ÕþÜdÎ$•;)*[A¯Ç»+ž%ÑSÙú=xOQ…ÍÁ)ýø ÏÅ?ƒÁœæµçßD•ýã»?ÿÜ R¹c™­Å·Ì~y±Ó™]¯AºÞZIˆöŸxŠ0OÃɪ°92é}m&öÚJ(‡a4œƒzXøöbKPüÓx.,LÝ[ e aæ›±¿îøLqèè6à®ÜÍ„ùšôš'Œ6 œ¤)à@›óv]„@ûñpZ¦ ý†°î2s1Ͷ_±K.¬œið@M1†µ´n¡Ã•ðío}¨ëO£ö0ª-2ØbIŒúwüIv0íϳ;¥Ý4¥žGI•`)Õ¾lZrbÉÄÌÄrÿ#Ï*%IÙ" f.©’Ý9¥Rêõãdz”DW]ܯ®®Ù‰¸9rF£YìîÔ›ÛèTu]#â²qY«ÀXû 5 ï³ìF½öÕ`úª=¸Š’Þßæõ—ߣx|]ÔÐë:ˆTË5î惪àšÛYRäÈA3ŠkqÔK˜}—®Äêª“Ë îA– }³ømÇqû㒺̋*‹J¿›YúÊš,þr%]|¼IÏã.-œâïf÷û?Ô‰Œ–«JU)†ÿºªW4‚åw•Õ÷iù2XV2X–2ؽìæÉ`÷ûËz–V|X`€÷u¥`+ßE4RÝEˆøuB` A)ØCæ÷ChË•#|]ÐDÂBp o) Gëެo ©ÆÍbÉ9·¾«Rv1ÅcÑÜÞvHª2~Þµ?ïªÏ9d©+©ÞìñÆ-L·sJU"Oµ\Ó Šoe"ߦDËÍÒ q7,¸µ4£iÞ•5ÄûYIÛÛ™IΨ šŸltY SÓɉNÓ·Ò±œÐv¨œxÕ÷sí"o»êë®ý•J‡_ó0¼é‚a ¿Ø”ìÔ]?•‹…IðdçÄE¢¼ä!e•¢ËC‰ü¦Êƒ›Ç5Yª%ý±c>VôÇ®ùXÕÏÍÇeý1™è+Ò|\5}ýqÍdd>>Ñ×õ·uýíýíý­²dX7ªTÌWS¢JÕ|5Eª,›¯¦L•óÕª²j¾êRÑnM6Š%ëkE­X_«úkÕúº¬¿.[_Wô×ëëªþj󰦿®Y_Ÿè¯O¬¯ëúëºõõýõ»¦p§tVñìòUL+v +¦ˆ»ŒSÈŠ]ÊŠ)¦‘u2mwÞM¦ñIºÅµ“ak81 š×§¤«HîÊÖ¬>ºôýôûýæ¹ÿ«~3ý*Ð|ÿÏ¥åÕ'k®ÿgu ÿüðÿü¿Â#‘ªèAN¡xæédïù‹–(tŠ¢º´ôD´.#± #ôø:¹ìOè¦úýÆÏ…Ëét²ñóÏ€=úgyã&9‰†ý©ÀK«Eo‹èfºA}:&oQÊÜ9וÀèÏnŸÞ¿b‘N~ɽ}2’¬ñ¿ƒ&iîŒf°–ïò”õC¾Ì¥9ûÑ‹¦KeÞð¡HêVŒúþ£St…$îÐ)¹¢mNISB’ø Ó NΡksCœØ¨aF¼h—QÇ,¡›A €ÅPºåêc¼ê*þ«;Õÿ¢ß¬óŸ`õ}õÀ ý¿¶¼Vñô¥ºüCÿ—Ÿšÿûýo³àü<Ü?:#m}VÝš=L9›úZï3H«oî£6º†Ù}Þ+·øíÝç‚nún6Îv‡§gÏO6^€É¬&.B¢›ñÀû¡ÆÆ]ŠV³Ü,éQæsWŠK†ª3l•p11i´êÇG/\q ™,wzEÌARUƒ(ÎØúƒ¨‰ëÒÎWK^aÄü”L‡ÈA« O˜G ÝLø©§Ÿ:x,º&l×NxÀi6¬Í£î³fy\úrvb»Ñ|!¯½š U¥HUæ|Õi¡ZuÅ#Õ ®^m"¤Ú¡9lâæXÃRñÅ›^[S9„Ì óíµr6²„æH)ëFÕ‰®u²^U­ª:Õ5úšjñû6MÞ®Ú.Ã_óåp2¢ Ò @{¾’9t›s:V›Z, :¯³`m\lÆÐ{OFr/ÓG•‡Ýe” ¸ƒ ¡‘[-¼&|Œ‰ˆC!Oê;/·ë'Ÿ´PPñ•$¡]’:ɲ9†*áPBÔG¹\Æl”ð¬¬àÔì?a5üg¯¤À­<´)ÕK¦“Bò{‰H<ðHÕ_S=µÐiƒ}Õ“âéGÁãwOêÏõ!  Ç1[—ýžH~OŸÁ¿yuŒ«g郴~_d8r&ö !Q)hà‹Š2ïº f_P‡"ò¥œB ¢¤ÝyD(} i)ˆw¨£Å÷ë2-çb.ä3br¤P<eLS*Ö«Êý3"I4a#Ž'ùh´2Ì:Ã`Q„)ò¤Þ dGÓBóp¿îæ’ÎÆ,ÎZ‹Ç@†NC-Ã1ŸÒ- F{\‚Ñ#ÎqáB´õh:,ü0Â[ zTJ~»~o¹h§hçë^ N»ÖÅ((M' ' %5É*øq¨à^ÉQyߺ°©Ò‚ @9ÅE%u«â†Êû XVµ°ë”váÁ¬b=ªEÉ0BŸ”@•iOç®Cä…? ¶Xµ¼ü #te…K3£ŠîRšP½hNo%s‹—Òñe:‹‘ yÝ^ã¶T%½òx…Ø‚âåT©|°A¬éƒ%4¬ˆb&rÍOüï_=áú7û͘ÿEÑär<ˆÊx¸kùóÿÊÒÊZÕ_ÿ]­®þ˜ÿôœ¢Œ§QÉŠ¿Ô¦mhtÉMÞáÔž‚Z‰a{Š!ž.D|5ˆŠâô_㫇ƒ¸Äxš0«Áä„áxz_Ñ :x†u¦""d8:\ lñÿ¼ÇʱŸp¦hÉϧˆ÷< ¨«@T=¾šN®hµ€’?›ƒA4âÕPzíÁ‚Þ8‹®ÿ(~wæ%Ì'Ö1*¢Ô¢ñÀE‘E¹a7ާÎrE7êõG}Þ.bú4ÙÛÔïªÞ„‹Š´Ÿ3ß­£Õof¼õWXa.ÛtÞŽYÄ©%ÂòÜ'«GõúÑ‹CZË]’EÓN¯5¸”m¯d·)”¡µ˜½ÀbÝÛ?:+Ñ™ÜsTNÚÃh{<€ ÌihJéL% œUˆ^f$ €óø-ŠÇ "Zõ.ü> 'õa?-¡]ºðLÓ’, 8Á¡{½FÈÞ¶äòañU^ƒA-Ò¹LN¦×·&pdOc#M*0´¸É ßr¸Å\èЬ«ÁšÒ'‡´†7î¹Fí›·(F[p“°q܈§áŸŸ~~,–~õ=ž=3ü³P“Ľ2‚åPß5x§àÍ<ô@Sùå8hjÛ?6 á󌹸±G`~úø¼ ä´Žg,(ׂ 9Ž(ô)ÌýÄR! ÓŸnØåÄ(Áx©BÊÜüpe…ÌY¾r®IãëÕR%©¥èq‰ V‘ÈÏ×8+óTF1ûâÂðJyŒ7Aü/)%0:o)©Æ‰û÷bTxzÿW‘\¿C~óò|„4 º0z<,2 ¥üú+òëx*F!¬Ç!Þ V-ŒE¼†G἞¥±æë“ÜKvǼ/Ystu÷¬_ÄÊrsÉ$ŠÙ%:ô‰N?"Õ¨æ4¿Ž-5\¨æ1g뀬5&Ì·Òx$Ÿª£ÈKcØ‚„ׄÒX´TƨO5j%Ó"³uÞ^™CkgW–l~3Ô&þlé“ð¹ð_66f”æþ¸Oµ Ù ï…ûTwÆEB0X]0­6R}Jp—ZÉèÞCÄ¿§i4¨ÿ?S3n„¸ÖñôwÃ?þñ—uØE ®ÞLÚ¼]•ägwª•Rº£&SÙUEV_ÅÞÎ?-Ì#}[©Û:],ImîRÉ“ýÉ#Å<}9Õ•±Èó¡ŽÆÓ‚eKâÚQ ÷[ƒ…\k&7Œ¬Ž’ny )Tà 5jZ²UQ ݶðE¶-hZL7-9HeµÛŒ–7ž¼7^Å&)³á¥šH~U+u™ƒ>ž"ÄB¥½Å8’œòŒþÍß%¾cë¼CãTK”Û8¡¥¡QP †+”_Ž?Ó<ɨÖE;1~i׎ˆÎT/ ùFî%+‚ ,ú@§«+*™ÎE¯ª4:d]Õ¨xzÍB¥ãÖË*™J?QÙâ…}•µ£8êõ)ÿ›µ5å7´ ©Ân}œF‰¢õŠ–á¯Ïã9Õ( ”ƒsº®ùìcÜZvWc;3Ù vj¢pšËGQa±ÿ/ÞþT¸.uFhψS¯t@ëÙ3H˜®AˆÅæ%­ÑWÖÌ:&®)SSÅÕRÉO¿¢¢2ÁØÿ†òCzK×KhÝÈ×¥ëu!¢_”Ec<º}êóy9ðõº³s°ß*kÎku¥øVæŒÿRÕ èWëæjñÜ©8h{ö´0lO ¨^€x@ítAÞ’ÉÆ±L]ýë—‹»rwA¹P§ö­Llµë¬T’^JVú°ý.b%°¸â&žnš|¤%Žn¤”*4€c€¢,¡|Ïí´µNUpÄÙú‚=¿&Pj¬xø°?,‰Àžªâ¢€;(ª#,õï’Q1yN=x£›Im™JÕ¢ÄÃ+ºøË[QT­<ÀƒµøSÃòÜŸKWï9ïD3qBÐÕDÝ+J÷%¤dj1B;mFшbÑà ¦V¥¢¯(Ê®äš:€ˆ°,?£À$›hòb>u`#0Õ·jRX+_66†{ †¤^P[á^SRC™q uvkß\úÜñ66„MÀnÙuä$ÏjñÎ/ëg;GEI£“&šW«‰,yå-™’ª‚êr¾E|¥ìís¦ ]qHಲ •™ìxÞj‰ª¡ ¨êš"nà٧#oÊòî¿-zHhÚXÕ›‹Eé—*Ý—SËÿdÝeô’=”4mî%ÈM*TÒ—^—ñWÖ´f uÝò%Aê™ÀUrvSÉ®hA-ñ°Â©«ÀxR“¼sís‡¦gj§ê´ ™Ú·K“ø,•™\Pn¤vÏgHÎLæ™QyŠƒ4"híEo:ÍUló(5²Yd³TQžÆ1£µŽS%Ö˜ý=ôGMõðPw­øÚCÁÌä|ÕSs©¦¹©g+Y3·R ÇU·Ô8 +ûÅ+kRlzZÌÃd£6 ²hœDƒö´ÿ!Ê¢ Ò³ð•­œ.“´4¹Ûr&,ç¸.Q¢ŽŠK4¡^MMTîéZÂH©9jÆÚöŒe§¥v̶\tCë"“Ÿ­0þPÄCüˆÿOè Ògé·õÌKB'E¨fñ¨XôìAS:Ë*¤ok+Áï£ :_‘8ÚâØY2Àòú2€®C"¨¸•.¨ VÓxC`o-¸”8ç E2ŸIJP<*>+U@˜OJ©løp”dÍÅ™ÛE²ØHÆœÍðÑ"×U鲋䓲ӿ •W$ÎÉ*•Â% Z_ ¾hª®[­÷ŒªÃFà qÅ`>ÊÌÍ'«^gå“'Ê%-—­[fÉçúnòáµÐëb8§ „rrÊ“P~Ny2²¸±„d¤áRD޲„t~'!éQùüm1˜WPL9yåˆif^y‚2ìXrÒòðßÒ<'’h¶FþHHë›ÑÅ'J‡w]FðÂŒ(`2¯êDöH¡6ŒAJ5GcŠV$!×/oõ-ƈûÓË 1 >ŠU:¡“ˆQ„×JÓ¹ƒ¤ß⨻AÙ<"§Œ’ Gõå±ù©OõÍ×ÔWB0qÁ⟇è\뤘oëAàØÅw™ÀßtQ9ª…³«!÷R˄괖詔‚\ d¯e~f\³jxKD†è5š¶8m³ ]Õ *-_†¡s_Æh÷ÖŒèÄÛï ϸpŽÛsÚª'RÕ¼iV’çv.;’Ý ×ñÄϤXÈ?‰U²HB‹†÷ 5Z+Kc ¡­Ç0E¢‚tlÒL[¯!ð”ÔWþ\o“m Äm¶_ÔrÓGšoƒfŽ9ã»CÁRDaÙ£€Ýl}YüÜí_ô§¢N­VÕ¼EV6>@X t†}Ô•Ÿ–®—ÉŠ@8‹‚‡¬\Û!^sµÖ¼©g•{‹–¦é){îü>Ð;¬Ým4¶ðX?upöͨùÖQŽK×+ªföÊl–.]¯. ¡ÃµøC¥ªa¦²¢€ž+ U ô\-+ MÁ_ž˜Ü6%†Ù’0U³%aÖÌvæ`Û£s$anÚæH~:W@‡hÉ"t(¹öe§[ŠÔÜÐ¥`âEÇ®zcŒƒGf*ðµ.çkðÍFI°_¤OÅæzH»Ë´_,]¾^²ðªbwíç%hóÙÀ{‚`ÝR‹×IÛM:Ëb}åç8kÐ0« F(*RšÀ®£)K‘¸sqýXpö8ðd̨ ‰ûLë­/žá6œÚ]ë‹§¢º ªú’\˜Hu}^>”‰ ¥ðyÆÖÙ¨Ï6Ñ •SIÏJýí>)©Û¥’ln¤Eñb¾3ÍO¦ÎÅO•OZQáHÉ Œù©´«^1ÌÞ†¥HFr{(Uþ7Xþõ’0ËDZsë­Ï*aÅY&V®F=°–¯Fíi4øXbój:Õü·Õ€n:ÂþÉè2Ë$ÖЀ²»–%—Á× ØÎÊë‹Â¾¥à•§ƒ¬A-óÛpë6j·#€€Q9Ž«ª‚ÃÅÎMVËÞ™ªã0¼Bãw;›eàH(Ð1ÃŒxc(f´jed‘±ÇP|_T±´¨£:69P,¨µœ½òKò›¾Nx’òÅÕÐÊS±:aï`»a*C¾×³+A.HÇ–¹Š?eÉ©•8êNäúhǬ,Ô"œò!“#­4ŸMP¥>ÆÞšŒÔ褨–S\mªiH£ºË4Ù«k¿Ø+úDÞYa°‘j];ÏG (F¼gY¥nhw÷„zÔfÚ½·(f“•“= ö‡WƒE­{-¶T~ä&ÂäƒFf˜Ô[ªª}´vö^}òÓþ9Fºf’Þe ø=40j EA‚è7*´1¶ÂwÑÓà9ʯOÌWóq¯Ö6KMo4WDŽ5õÕ|äëÙ­W³b‰tPYt!Ž}ˆ÷g`JmßÑR±3löŒå¯¦mÙü—u¸é ý[­õCf*¦ c§òö·Å,äµlv¾m3Cîu‡aÕ6·é2²¸^eVœ>êíö;fQÌžb…ú¦Ä÷{fߎèüŒ+ßãÿ^[ù:Küû°%a¼%Hí~óñ‰¥›Î²ppxd§ý²d¥í´ub»?­ØÖû6ð*ù—_ìÄææ‹]'52©\3| ã®åëÌ‚¯B²¿m}¶üaɬ㬭ûkôFìrç¡ÚîjG¦ñ8öV«?#y‹u/¹hä bX]úInthã,˽ZsôTnÍõ¡ T¨Ð@Ì"›…õ ŒFùù¹­§g˲%[Ø&– SùbˆÐ‘é–„(’Vwñe”–4>w ÂW)|sTÿÁÅ>2ÜP©ÇEoz™?Éàâ±’‡I!)0ˆBÑÁ×µ33~ȶ¬HðY'¿ecå³S?aÏ×KÖQ*Ü+’ÕTÜØp›2•ÚËùÌ,ØxöXÇYì2–TŠŽ^*–[(Vzm×5ž ÂZV{/¬gQ|–»”…u!Ù^Ç©=VózÖŒDŠ ×/m|oÀvclÉâÚá;úÅ/BèyW¡èrÔ7ÒÛ å~g¼H9 Äׂ÷5õ¼Œ;MÊm½©•Àuk‡+ŸºO8`[¦¨·­¸4u7êÁ™Š íÉÑvÿ àysªL;ãƒÌ«Ž­kw_iåùßx)ûØš›šœpªž8 Mƒ¹ £§ÎÜ2¾iþööõ¢ÝbsæTg¾«ÉF mûYÕm9nÇO¸áX’½Ã«Ìl&”rv4Ktà£ø¶¤¦{ËÄiÃÝ?*XΗ}ÖI`윪ãõ¼q<ýëp" –‡r{:Pú«Å·–4,ê·ïÀ*"h0¨)GÖNOšÀjÑš¾}V«fšç›\÷—®~Ö±ûØQ‘ÏF/‚Œþ{´ø«¼S&JÉÝ{ΜAßóWÒcþ_··¹â)¥fWBx°“g ú¶l–pmÙú+v++PÃ"Ï3¾­/ñêmQzØ3l~.k¦”].‚?¹weeód©D¹øƒ©ÛŽŒç>÷ÍFãSJx%¥ÀR[ÐúÌ–äîÞë}PzxÅ$æq,wjýl-]9s_ÀêðGO¼ë+Ýí®BšÑô Œ¦1<õ TŽÃTÔÚl*"s 5%)n©6̪ ¾ØšªUo¶RyÒv]ÅdqR¥%ÚÏÄÙ â¬ç¡œ:j¿ØÌ7ë-îlé-«9T,¼þ‚ ÔêxžŠUVvÑÌãlvôêÅo¹É4ìÂ#ÿ`µluÖ©kþŽæÛŽ+êÐfêì½<ýÙEúÛ^£q+$l!‡Gÿõé±lJxEfêÜ+öw ‘1íÞ?çù©9q^ðî£{ÊjDJæÑ€}ÁRF*»³¨ô&³éØÕ€… ] ‘’”}vǺÀ÷ÚæÁÁakŒ|b5¤%…Ò7éðÿw;ÎóSñ“ËöÏß(Œòódu5ëþ/üéø?«ø^©®­.ÿA¬~#~œßÿãñœú¿M¸}ý/WüGý‡Ÿ_ÿôМôõü«ó˜qÿßÊêŠ}ÿ_êÿI¥òãþ¿ïòCÚt•gÝþW[x‹h£}ž”D㪭¨s9Æý(‘x›HÑ?sŠ:œ`fè;Úy—'£_¯IæòUÐaÈG/6Í­'Û/ΚG`ñ}l0>]/?ö–“z]ƒMŽ“6âN¾ÊK[ç¹¥ #]¹å².)£99ÞD½9­oJ«‹"jøQÔ‘åa4t{ï• ýS2娯­FIœ×$|hlnaØGÂkDHÔŒ´~œìwçÌÞÊ¿ç1к;g¶;›þ¼¨…—‡ï‚¥{+IFýÓ Kl6ÐGR²“ŭǦ›û¼‚²ääæßúŠü9™ïZPÔÛZc€ì¼£ÐHtždåN‘joŒÔ5 L‡&ñø²öFÑõItAQ¾(²qdñ`Qv ‡`r(ã}PÈ®} ¨úÖw8î¬.Ô‰àP2B‚âÐ:æj>Ì;u™3+u aã)}Ù‘Ë1ÿ݉zeDäcžÜ˜@)ÝkÃâè­Ž’Ì%ÇdóM ŽÕâóéË.ëîí˺ç¶w/¥Ý½¿ÒRØl1võãl6Ððä5€—I”!’Ìæ®xñýáW5ÙÕ¾Y¸[i/¥e`Ý\Žk²Ã«AÂÙÕ »ˆ=‚à‡EW¤©\d«’4Ò@»hײrâ/‹|ãí¿ÚÀ›ñ ÚÿP;›ƒÁ¸sO€gÙÿÕÊÏþ_[yòãþ¯ïòSö¿]åx<‹¿b Äè”0.W¢É2¥k¿”jn#Fƒà|¡òË/kb³õŸ-=iÇÜç;ÃØØÇë£æËƒï“j‹I;žöA›µ'“AR`â€y{Ö¹Š|WÈ)DYp&ÞœB•ÕqìFnªXîÊÐ'€«ÃåˆQÎŽNê'­½zÓ¹ ÜÞ`¼ršoœ¶À„ ·™ 3âóN©îß-ÁDµ_†.TñQ²'m;’óIT=ΡN6Ï^6ë'gG›'›ûMµmä²o}¢8Ž[åQ{Q†ü¨`Ðh»_ ðà†Ã"´£ó« Q©.­âÚ8eìp¸‹õ}+ƒ\ÎÇg§6w# ]è­ç‹Dj€w›E 4ÌQ{ð1Á»ó H|;Ý@L®âÉ8‰tK–WÃÙsÉ‹†¢ÀV³zµ¤º¾ˆÛ“Ëڮ܇ðâróÔ¹¶'SqœïF½—Gê¨,·at³€¥f4%+á"šbÛ&osv(ùªo½štÛÓHCc¿"1(‘î²ÚZ³Z£žy¨^HúãÛ6ãÎ¥™È‡ >:ŠÇ x{”JµB„S˜Ù4:7ï«~ͪ—۵דéQ]uÇ'ò\»N¶oLŠQ(eøŽäèjHñv0øHb·>ÍWŸ¨1“Ìi±ZéNƸ;žÙ`Ñœ4-V|ë&»;³ˆ»·j²»G2šxÞ(ã6Y¥žda&«TJN»5Œå´Ýü†hŸv5¸ ܰñ[¾LÍéæj«:ð¼-Õd™Y‡¨‘þß»\ãÁ/Ãþçùá=Ý’oÿW—Ö*K)û¿ZùaÿŸ±ÿu•£Õ&p¾í/æ‹,kÿ‰Ù¬äëµòÀ2~x;X±¯¥×ëk7el7kÛ[eLlÒúÈm–ç%³ÞÚ|`¹cîMí5òFÆ ’Uû~Zuëãè°1Ÿ0S8\z*ƒJûÐõMºÎµ·Î¬B…k*Wë¢-w}Ùܲ®³´`µ53Ô$´ìÒ«Ðñ02NÐâ¤þ|<áàñ²„ >k8Þ Çׇ|ãš–tªç“®ÓÝíAã“Ór<¹ÖžƒhÌžÁ“Fá;‰Wð%^ 1k1^MUëZ+öd¼íd™óV Ø*{Ü4™‘=g.Qx—EbÝ2s³MãåH"öä‹2÷x`Ó wxOê#Ó,Nd”ê˜ç)DnÂg L$#÷ ÆºIššªüdÐÅudH`#‘¶-ÕãsŽ)KjD«¦OñyÍ´U$_ƒ”dòñ˜†Wñ²GB4Ú™y[r!ÁèE_+X ÃÍO²Á×ß6%„S _ÒmÏ›ìl¾˜MìżÔ7wD;¾ °رùS ¿mÀ]‚ì¹ » Ûó©…)²ÔkðÅ!Ç ŠžìÖê{€ä_÷]î’À€É'À®NXmž|Ò}LhÖW F‡í\M“ÖXõsvå—à’¾dïAäSÀE¤RÛn–ñF™O¸/Sƒño:¶¾89Ô¬ŒÌ¦¥än‹¹ƒÌÃÜ–bàkç¾y:©·€§ó·Bù‰[’“̓ퟰ[m×áT}(8ÚÒ>w›ºÂ4¹s¥ e™¿°_j¸²qíq³¥[¨Rh:!Ýüe«L”Wiœm:BêT ¨"ûŒŠ\“0Zn^31ášÔŽ#QtÄ>;Úl|’±4¢µáäeÃÔ4`Mç4'¯£fýåÎáæÉ^ëEJé“OlbçêC[ªÕTø%e%ËqÊ‘bÈ.ÎÜöÂwèµk½)âÕz$¡›tï<¬Üæ¦Üᢗ=^©¾faˆ×Þæ[ŠÚÂ, ÑY]Ýë~+h¢E³À¨xÍ;ôèBhwÉÂ-g‚±7´ôåíg‚±?œ‡LåB‹9²h+³”s%?Ï„.NMèì‚|‹ ªñ”bÌ0=Õôm't†9W?Þ3o<±3ÍJOíÒÂÉ›ÚYó¶`úàîì-wâ–^pJåÒQÙØ(©µ5ݘÎÈðU0ÇÜ _Ý1ǬYcxÂÈE9=”Õ3×ôpžÙav»âIã7›º¢Ò岿„¬åOíÃŽ3lêð¨oY0ü”â©cKâÉÒÀ /Ë«SgO3§‹¹Ã0±Ut— æš,æØl pØÇJÙh€Á戮ÀÝ™"p¥G~w¢hü_5Qdîæ›(Z#ÿ®æ{öÐ/?ê¡¿çýùc¿ÈüwgŒ±¡¹Tz”½ÓT*=ÝMMs´Û ¨LkžzÎóÔL¶ëéÌ[åùꮙΞÆur§q4¹Ê¡Ÿ5 Ïàxæ¦fl²)}ÅŒ-{–1Òcÿ71K$OÓµûeé *yWaz41§F“» 'ñ¤íL!y4q§wPò§’ù+óM$óÖç(Ì5€=ðÂ8÷ÒCÉ¿ô˜€ãÿƒ'4¿Á ð;œÿ^«T~œÿþ¿týÓãf2¼/ï¯Yþ_+ËkORç?–ž¬ýðÿú¿¹rnžì<ß­Kô î"q ´}5ƒÅw˜ >JÇö)ÞóóQìï4žƒRø°\^*" :¦‡7 ÛËþ4g”tâþ„<ƈâ"72ú·<ìñˆØ90œˆúÎ^ ÐUî]2]åù Ǒ̸ÉZ¾·MïØ<Õ7÷]ï`ëçy$;îh™HB3h¡‘]>*·æ /ܨš/^îî6ê³ó°O¬ÏÊc¿ÑŠ£¨Ž>¶ørR¯ŸÕ_m6æ+ ŸúÏ,K1ã@ŠuBÂqA¶ù¶N˜³æk‹¿¶Ü¯MüÚt¿ –¹Gu 9µGS¦-_ÿsi„nÔ»ƒöE¢>Îã(}M;[,‘ EbØ~5§qÔ¢=ô‘ÍÑhIbH‰‘önÔt6àp²ís)†ÂQy{Ї•¡A²§ÿá$)chÙ–ä¾ÐÂÐõb¥«œ(RÚù) Iòõ†¯M“Äk㦢£ª®läÙIãàY•¾Â€úè; “vŒ«&ª1‹Å4å^¡ø«l ÅEftФóÉÊþ;µ<‡¿Ñ4þhó0üFŠqTX¨U2“…ÅŸ‰EñwJú;<=úy’°¯8¹µµîè¨+ ,•däØv0/"[q¬ ÁnŠÓoºãƒ1ŒÔ#ºÆÆR"´Öîó¡kެ¹‹¯‹–"MU"žÀ¾a¦lqŽÁñ³aÒågãÖìC@¨5’ËñµJ䋺,hê;ºN‹‘õ+&tÕGA6Í|֭ǯðþU!v[@TÅX¤Ø‚MþÊõH0~ª¡«úÞ¨7æÓ?»4®¼œöed¾ç çô#–K©)ÕuèèM¬Ëho×…eQ5Oq ÓòI«Â´?D%ùæÄÚ.`9ÕõJ€·²“ÎùV7—DÒ•mŽuòº²U¢©mõ%»º r¬cN±1qF ÅT ~2±11„mJD+Eâ4*ÛlT|6ÈùEÅSe´–cêG®Oë⌥ãšvÛ~¤ÆNj1ÏÔ¶¸¾·¿à <+çÑ4 áÅǶá¡ÄS=ì² Û*=òÐ?uº(fåØ8œ•ã`|Ï9zù¥é!f›Î8 Ïέs‰x[t fñ\iËÏ~zck›!ç,˜ú1ƒDï3©´$‘i&D]BDÙœ4'I̤2ʤò\B\dCH^/˜WÚ±¦ö>Ú©¦vGíTS»Î¤¶wДiE¶@L À²‚`šZ¶@ìXSË‚ijÙ°SM-[ ¦©e d¿ù7)aò.[ &`ÙA0M-[ v¬©e Á4µlØ©¦–-ÓÔ²¢j4§>›'› ·³A$•8“Êo›4Q]ü½=ÉQš rTÞ€ÉE»Ê‘:ßK@™zð%@±0¯ìÒµœk&诎ÐŽ?ÈAñð•³á››µ¦æˆøÑŸ&z€M 0ÉÔFÅøƒgT¸`-6ÍÉÖPäPkjƒj†šœciA3œ+fùÍ2¯þA е}{¯¸tûÜF{©á®rÜû|0Mï}½“ú>óGÃþ쥆˧w¬àrøC0Mï½7«0®°­ï!ë÷•2_iû78š+¸c õ_)£ð•¶ sáŽ5\=T ¯´VÈ…;Öp’žßå_…ûü+>s…WSÕ’Ú¦óaê©Jjx€ò4¼Õ|eà’y`\Sƒ%yPÛ¬“×Ò`Ó<(CmšC­¥yógr.Ô¶Ë¡ÖÔ¼%9¼5M¦©ù£“«®ÕiN­¶Ž oï;Þ\“½¹¦üè6'{nuô_’ÁÉG=ª®Á¢\¸ 7Ê„Ûß=Û=Úf;{Ø;ëM:q6lË‚æÃÂL±e&²SIσ4sÊ©¿®çCÖ dNéò冼Ê.?óÙ|iqš\ÍàÕ‚LgA×mèhôË új” :·©Tnvk¨–‚Ê–+ pM5¾eÓ¨–‚ʦº¶©Tm6­}µŠ0ô×l(šjȦP-å/ú„í¹^Ø ëiãe×2éz›ÎƒT‹Ä#̇lYÓ<ȆEÓoè¤EÓ¦ y`Ñô ²^È"ë…L²ž7ô7›/wtKL®ºÁв€-Ø\ЖEw:‹nËÐÍꑯTSWt±µçÒe` 6´eÑÍç—-ØlPìNŠ.ö¨\º lÁæ‚¶,ºùü2°› Š]VÑÅ^›K—-Ø\ЖE7Ÿ_¶`ÃZÁ7ù¬ï®IœôpO9>›´tÑ#®ƒɽ¯‰7e Á¾|¾ýâo ~uѹ|7Ë5•5Ð Ï á<¯´NäŒû=]üYwgoŸ÷DúÃó™°';/öŽ_² ‰»W£þû«h&Ö鉅u[XÆ÷Ñ+†¤ ÿ9œÜº¨·åÜcnî#¶if“ø›3›+æ@"ù]â?4òªÄiÒñQþq$4÷yß”€Îï  P‰µ§ý¿4üÀ'éRÇÑô;·á`Ì”Š‘>kAŠ÷[Mž& …ž hÀ»ñ×ûjþòãÅhx"EÏZV×Ö˕լi‹ù‘[?™:eßêíIü›gȆ|[q;?lë+ù¨ñ!Î5¦si0a‰Á\v(‹Ls¬K;lçª:ÈHíÉS%Ç–’¨>) ŒHT)šéZ½YÓ5¸€±éOÕ_Jb©ð§ê뜋%:G%kÜ›ã}6L®}'&×îÀ$…g‘‰N’õf‡š)ÝÓõ"Mº¹ÏÔFíù»{VsÎÁI5_/ØÒÌ¢ñjëÿŽrÍ4Ã/£Ùwþw-ghD—‡I ‹X°E.Ÿ;•µÃÃXÁh#ïÞ¾ô½[–¤çÕXn žŸÙÃÊLN篧{-Y8PvÑî¢C¾{Ùl2³`wÕ ß»T¸R½EñW«Õ ´T›y1å¼bó9®‡5¿€Lÿ¸ 0‡/O¶ëŸ¾Ž’ñU܉–š{s@ú£wÀÑ‹=;}rÙ×É*7•¼Sð 1št3ïg€ÊpPέÐ@ŠÂ?©Ã~ó1M½ Ã}”þûɉG¬ˆ`¨â/Yì¦yØý:z“Ûra_f­?.ªÞ…ª¥Yæ+ŸÎñhòöà íÿž‚.¥jS«®©‡4fRÓ9ÒG]•ž0OXçëkÖsˆ’:™_3i0Ù”kòo€ÎMº5wÞÕô‰Û49˜_3i0÷¬}Í}õ¡)ØÙý… ˈÿ´¿}áŸfÅZ©<ñïÿ[][©þˆÿô=~ÿ ã?íoׇ~ø§ù£8ÍŽš4h$+dGù Å  .B¹Ø'BŽebûp§Ž¨P˜·È”))3ž’²)±©&L8#;jS hÓ)|<ÇÝåªQÀÝä[&1€ª…Ú­ßI{ÿ»Eà¦ým°É Ötf‚3õG½þøÏÿŸ?‹§Oųgâž=SÇF1žàwàµüô©÷€ñ{ þdBšd‚ ãøÜK0ìU'¥?_Sö«½‘ó ƒ5œÇvAg’ë%h§åk«i4Ÿ-H ”D€• HѧŠÇœS¹!¼@†ÒIr¹Zbh@Åž1ººä"„°‡L ÏD",!Há˜AX™…ýJ%É™Žhƒ ›Ff¶ÃÙlá·s'>×ú#Rìˆðð ~•_­Ž+¯š.ôKçEµîèçŠÚqÕ ²”8÷€®áÀaô6H¥6ÚñE„½;PB$qÙ¿¸TTúÓä¡‚œbue•D}Ÿ«@˜ûzÙeæ:UÈ;EÒª|Ñu 1#,‘é…ð9¢h)¯°…|š Š›ÜP`B‰­NÖŸÅó¡Hh–Døã¯JdKZ7iýÄj:Š/úóu»÷¨vJ] ÕÉÒõͺŸx^Y»=Nuåö8À²…ãî„Ts:_÷öSÔ÷ÊZFBu%#òÓmC6#ÝÏŸñÅ'¨ÿìM†ÉåÇ ‘¹Ùpp5”1‰´ßîÝQ··ïŒº_ß¿{¶­“ÆÝ‘ëF³Þº-¾A¼ˆ3hË4ŽP+¦1 n“ŽAC8ësâ°Ÿ;¡ü2o6-²9/J]£lÍ]˜¦ÆÙžçÀd³3'ÊsƒRŸÅ”7€’ŠÿR0ám©’—O Ü !UçG2%ZžÉ’ÜêÜH–ìÖæG2ez’'=/"ŽkàmÑ¡íÆÑ`§Y`óÏ©.VæChè r;a*œ¡äö(/º!äöÚT¸BÉí‚©è;ˆÂðB×tDÈíK~ÐDÈí¯~*E®Rð£òƼyXÏïà^,Ê$WYûÁy#_xÑz#_xá{#¤ üè8¦‡Pr[{*n¡ä«?¡ä+?²¡äª ÷ø›n-•¥šYKÀpn ¸š múXð»yàõõ<ð†O|-¼å¯ä‚¿L‘_žïÓ¯dëÐ5ô/yÀ)Áä@¯ê´šž"Ÿà}+~=À}%‡õûËyðö+yüø_Ά—1„¸2£;É`BìzlÓƒÍéy2¾¼’MYG²igƒËˆC6íFTì!¯r'̓æ¸#6ôf.¸O¼šKýاþ$—ú±O}9—ú©O}5—ú©O½’M]‡,²À³Û Ž\dËñI.xJ޹ÔÓrÌ¥ž–c.õ´s©§å˜M]G:²‹š–c>xŠx.xZŽùà)9悧嘞’cŽMt9g@âPI6ðvpŠòJ&° Ÿdgë"HɆ¯d‹ä¥UÈåª\ÅU²€sô³°dKνð?;vÒl‹3I‰òȵ Ca•kþ¼Œ·2Vf–»v þtNk·…Îie~$3Ýàéð8+mf†‚ȶbsàu| ›~¸ë¹q‚lú9ð:^Õ2óø×qƒ,ø5¯%ôÖ2õ@` ÚïßÁAüê ¾’oºÆÁÛ¹ÐÛ¸¯÷áƒlâõ\èñ<ð–Ïùf+­çÕ<ð¦Ïy5—z3ÅÌZ>7Ç>ﻹÐ)Þw½öhÏÛdD!« øz;ZȆ¯æÃøð•lx+Ô±šƒÑ b¬äð¤ÃÙ"ÍÉÂD²Öf Ô}„'ù/|„™eh¾ôPVg#€3³$œ™… àä”G…*²à×sš¡ŠYdK+\/²©/ç‚§¨ç€«pF6õœ.±ÿ2Ý–rÀU€#›zNR‘Žlê¯û‡bÍ^V4š½bŒnDh¡UÓ,4Ó›ª¹‹ÆÁ¸G³‚ƒA2WÁQb N˜#Ä\ÝÎ_ãM£jÌõ[a¶ìLë·EÕ˜›ócZ’¸¤ù;HiTSÒ[aº%½-ª)éü˜Vh%.iþšzÕ”ôV˜nIo‹jJ:?¦”‰Kš¿ßF5%½¦[ÒÛ¢š’†0³Ãtt¦4yÙæ‡k"ü\¶go"¹-rF$'$°™«¹sÂ:Qî¹sÏYqžÂ/¹:yVÌ'¢ Ðßa?ŽÁ´ý4žtÌñA<<úE¤=ubuûù¢h¯¼¾ñï)€:âð¸Y?Á—¸­>¬ÊçêÃ} ³ªÿùŸ´{?;ÒôÁ–Öœ úSñiùœ™HTÕõrµ:ëL·òö z×Ya­ª¿ÌI =ˆÈˤoa//͉}‰¼\“$IĦQ™“Æ`L4Œ­š¡3Éð”m¾¥%[>¾ì£û——ÄÇŒ/ÑYCñ˜¹D:¡Jzþw¹u´¼R®Væ)ñt† X×|m}±ŠvÙpЀŠÈg`u^ÎH&9 ÆAÚÝ&í˜ÎîTWOÊ•¹êš:K:ʧÄÔÑz!¬ÃêêpœÛ…Õnnç+ËP6뾦,B8Uí¶|lh}ÅAË*ʶ@Ù{+ßVýŠVÍXj­&k¡ÆQSuQ£ Tà^ªu´´F´¢•¿K°@hB¹ïÞ%÷ÝûÊý¯WÉø¤šìeÎPжKÞö[iÆH¡’e#&ô­Æ÷àh2sì(\Ê÷:¿ZcÉ2Ž%¬»ÖÖùDMÆÐ­—y¼>‹§+î¯ô_9N"3aþ·Ø³ËðžUk˜©äLzƒÁ—÷áÂÝ’{«"*»rX±žÄÜÞnÙÐò[I:sn;Kª„zÞùÄØ›GŽ»ß^އl»/° vqÏ]8îØÉ{jã…r,?HÜÉ贲īÄ0J]‘ï§L´”1V”‰;áâ ÏŸ”MUÌ/êuËfÕ ~jþNK ŽH·¦ˆ×€¾¢äN8„ ü56fPs­ˆ|‚¶áuì€t®í‘Ÿ‡e™Ü*‹¹3ȳg¼l2§çÞ»c§]èÈ„Ó v€ž­“z©Ð;·“S}¾×±“çí=¿ôfõù^VŸßåYÞYeý&…™Å{¡';ôr=Ïä8>)óBeˆïv`ååüÀÊ44ð-ênXïYû¼3¶‚ø#žÌ)âó ü+çšU;«•ì¬PX¿Gñøò9¤S«Øj|a»Lߣ áÄÐåÿ†e>¥ZpÃ4ãÔË3Æk8‰…¶,›²ÚŽýœ"ôb¥_棔5D”Ú“Ž‰êôè9rÊŒ8𙕠:zÛ¼2ã¼b^»¡¼zw.Wv(ÕìÌî^²`´R̈'7—XóK9"ŸÜ<ñE=ò—ç9sš'N'f$mf$ª'²–1HÕŽwé±Y_ ©•Ĉ1˜n–Ò%©œ§Èõæ"—ÿ±˜µÜ²údžè´ÄC N½Ôpaå²F ÛH«i,5‚;–;žëX|áb‚òe—k}õ«Ëõê›,#_‘Æ+¯%ö¦Ü,ï)FôúW˜/ã9æ‘4øø’½nÆxs™U³¶´|÷ª±ÖYcYC©zéט£Zov…d‡¥Ë.N¥òÅÉèBŽA›.èƒöKKG*gì··5»½¹Aêœ6—ÍŒÏAFð¸pöOœì3ÚûÜySˆ7ÌÈ[ࢬ֩ó’G}G>Qö8B†If…Ã\´M[ ïKá?† þFÛUÅ0…~Ë Ðov:6)»1è¾ úa5”5zÕAS·àHårù‹jÈ6\?Í•¦@!IBáa„–gé}º8ŠÁ&¹©-.–D[=7¿PVÓ“Hëè“pÎ?Š¶è¨°œ£ñµ¦—ˆduú ,\q(/¬%˜Âo‰ÞxÐE÷A@ÃÉ RuHåè®¶q¾xZ*aÌëþô’ >Ž-ˆ•…½ê\Šv"6v¶JâðþAøòÂ*PÝ><ØJŸÄQµn3‰L@ -Õ9T°®_¬Ó¦,Boоøúú‚ –«ÈöãÇ$mQˆ£4 AË&Ü*,WKår¹¥ D{pÝþ˜ˆóš‹7â.HÀ PÚú†Eì² ©~²aí–‹Ôf®’¨ù23{*žÛ# €Ô‡Ñ´/7g‰ C°?1è\#ªP,dqˆ•sÝO¢&ï iV±-áµÉÛã„$€¢j›Z_¿B+W=pè´º24y§›ðsFSf®íÝp1¡šÛPŒ(æ¦ Ø®·>R¤Îœ q³ss!~¦—í©èõ§Ø>@MGXG£‹«­°«ÉJÔ=®üo:èþýœñ8˜‚e{¿“ÿ?Üiþ_YYþ1ÿÿ¿PýÓ ²Tâ×ä1Ãþ[~²¶äÏÿ©þØßþ“ÊPuƒ¾~Ì r¢çÚ58ëÄq²MóH º~&çõ|ÛÌÅí ™†ÛK 7[UÊñÈ& äöÊöÐ…®6añ­_} Âq4ü6¢@ÂßDHø›ˆdüþ[µŠ÷ߪU¼ÿV­âÛˆ «VqÏ¢P”;¦ƒ)Ö¦×ëÞ…Q$7½Wrïï—»÷÷ÁE/ÁuåO8ûÙh•ÕlèlH[ó½Äª,+‡YÛëVý ‰·mîåÒ{€;=X!-ç{¹µ ]5 -lËE"oQ¦?A”¨›FhcK-5mà ^¶bj^ޝ]¬¹BÓëY0cèC}KòÝÕž¿ØÔ½õ£ Aרde‚ôq-Œ×{Pmþ*”[/JîÔwwOêÏÿ¢ÝÍdH˜.âZÝXÞ¯ƒä¶úï"Ñô¡ñ&âüjÊWê`Zs¿ñóÁ_Ëš˜)¤üUqrDŒÈ‚d–B3©Vwñž˜ŸqPgº=3ìsp¾$0Š|I4[[øÏiˆ+¤ˆ{‹Ú#=±Å+·i¹}a£2÷J-¸Ó9á·W{Þ&ôìÌžåñWw[·ÕįNû.·šÈ !¶Êx›Åxä$Òå%¼UêîŽÝäMJæH×kÉž7 ®h%î>O± ß@H…Gwý©V!Zq{ £Ý_'%±«Úrý¦ÑÙøˆ-z'áV÷ ÿ»uGêÁÕð<…3æÕôú¶Ôa)ÿ­ÍQ7]}Z› ~|°Èóh_D)p =þ ªë%Qùå—U$׌°«°j_)?)¯–+ΰ!6ãÎeÉZŒz –P¡ï·GWíAI´4,.ª÷‡0>tð‚ È*ê0jxpiOE¯LR} pÿv¼awŸÄ^Æ M©Ä+âê4ÿGÀ‡ª§5ñ8¾šðý$Ãx‘@ϾMû(áè’ÜÁï}ok ÿ€Â­ŽAÄ[-û’’?ï¥\’ 9Šk\=o‹EYÐEZÖ>ÎSZF$ªÝ«i ¡Ç–,_¶ãî5ŽdÝq”PqÔ@Ùµš‡q³:…]¥·»W¨hGÝ(FÏŸÅ"0Ž=%j«ú³ZU'ã“6 чõÊ‹ñ5J¦$¢vçÒðÎî¾(àm•¡²˜i§\¤:n ¼…y¢6Ñã> „ª–¶>ø~¨öȪ¨‚nƒ%”Sg|'QQ.МþÊH@χ–RšD*gÀ4^ì•̓7S‚w:W1‰ƂΔhâFÚ‘­B– á$QX™þ `Sk(„ÁøJHb+•^DR)%ÕRWv3@up p*YUð+Ô´áVúù¥Kj>B,ñ—;õ“ÝÆá©¢Õt‰%ãÞ”š™lçÔ¡XšXëT÷Ö ïà›òf’[ŠK 3súTm¾xýNeAè2æ¼ÂA,²EíRiiA…n]q_—oþ-HÝÚÆ³Ô‘hi¿”6òÚhÆàN«ÕÈ€‘ê´Tú”– zÜU6$$c$ º=è\ x+·òä,&WRL]2èO)‘ýö ¡”yhIÛOXL¨dÇØIe‘±EÛ%6•T°_ÚâUB ¨‰¯aÊÅ=E¦‘nj)תTñ£“Ñͪ`—ƒ|qÈm>þŽv)¤dð( "VÝ™ÜÜ9c Ð ‰0 $ê¢c\,'½HÀjêUÒÙË0€j¦Îq¨¬Ò’–+Ú㣇P ˜þ87hS‡î°7X–€fO´e_B]tú†ñþSoÈ+4ŸOØ,îFÚÎ!:‹É¤=zÜ&èÍ4š.¢÷ŒÔî1©Å’lÔª{ïØ jì6º;0]ŽÑ’èúë!‰ƒlxF×\® ž),èN6£3õ¨î˜ÊL+&vƒ×#¨t÷Q-.ùuAºõ“P«;Çy[Ô‰ºÜíÛÊGHUF›À)Û€Ah Ai€Nù0îó ¬ü¤¸Ýa ì!™3¸Àš§$ãÒ@¹æÞ%­t°ñ¶cì9B쌱 öÀ©›àrŒÄreFŸµ¬ɽ WhÞ_õcšíƒp¤ú[ ÑîgJ¯$´àtŠâƒ&‹œð \Ä6Ä_úÌ“u;Á!Ž&‰g2ø:FÎ¤ÈÆ=ü &‹Ðm§ÿFÅÇçÿ†V¹¶¡ÿBª—‡m^´æßáâ.i æféíxЇ¢<úO­©Ä‚ô“‹#šèn¶^pI”#«o×—­é*´ìÁ˜fŸmim“C}™õŠj%e™©ÉÏc3ùÒ51½6¬·¹+ ‹^±䊢4˜ßW8ö胜Rˆ®/ûÞH)« +X”ªì#‚Tœ³¹zÙOx94þKªS®€˜h*¡âÄB­Žpì=ʇ˜Õ 6£¶¸¤%WªÌëÌŒÇî˜3ãë‘,Ãc9gáÈÀÌ$™XkOkåår•›èâ!(«WûMim4%î¢(µ¡„{{Ù TØ6iaªX–¾²Éôª×S=¾=ÁkÅËQÿF›»•¢¬ð/d "à߃Ó¿ñ£qà+üxi^àØŸé¸«3"?ÀTµòV]Zªð{¥NN´‡Q$×O†¨:qÿZ·ê>»åŽÏ“1.Q•Ñ–©€˜¡^e­LÝ÷h~=ˆFP%tv×±M¬AEêÑ®lvÑÔrÊ$ÇO´Íé¢pÔ¿‚¼z¼R»WŸHËzåÃÂʬ‡1`j©²´8àÃ\ŸÜ×iÅ_B×ù2u:寫 A¤äª1GX"—ôQ1¶GXÚ¨¸ûËRñrg !:TÙ7È~Öæ2©Û}¥c½e=G7X{W1­±‘r†Ñ¡v0ˆpÞ8éã¨ÝâÑ–Ú0ɃI s6ÌÚ®+È(A*%ɽ¯ˆGðM{_‘÷ÌrnY†²²Qk‘P,–Þôª1»‡o1¯7L÷­øÕ)áG«¹© ‘Iþ ÈæC§}v1™rýÐb`Ef½<@ƘtÙäjˆµ2èó@@ƒ+£æ ¨½ª öµPïÝ:‰ûXx5ULX·Ê5ædÒÇzݤ”äøHÀyÄÆYƒ†Ô¿ ‘[Yé–+ Sló2 *6=â«Õg¹ÈSDƒýÎÛòGg±æ9ÊUX$åºXÂ\BŸ#書8ÄCcŽBIl“÷¹„oï>/wz€Új–‚W$ØCÁÐhAú°$Zåá 6ÈÓ!ˆ+N„Þê“îëÒwžºv}®CZ  ÑÑxôw'»`y@}v§— -YÐ~šuî.éhÛð8e÷€QÍöw—Û,æG§ GÓÖG€\[™ J™íÁ)± (o–«¥µ•·¹xjm<žXŸÅoøÏA}¯õ¢~23S…—¨ñqˆ5ÚV+ÇËëëádD›ƒÅ‘àdsk쉾¼ØØƒ:ß+ã,~o4Å3¢O¡çp:ÞCõJ€{ez“2Ÿú1³SxnÑnò ®hòD¥«×¾²ÎC0âùGs&Âq.0­DyÈñà#íXrSÙçÍǹ·í÷X˜éÓ°ÂÛŸt¶'Rm†öDå67Ur;¾ÀâŠ+Úw(®êGãDä¢ô Eƒõ7€¾ ÌÐXÃñ‡Oq©û…¥¼WÞ><ú¯Oïjùül¶ßkÄYIt“iíM÷m)‰;µ7ñÛÒt8©Ô¿RínØöJZº’M#Š2SãKâJ `Îk:ügµ$U|/®^ª(0ÿ±›¢ÞTžÞr´èäP¢Âª¨?ÈI2ô¡TýZ…Yy“͋à s¢»ßgC¨šEˆ¯Ö¤dÇÈ&´œIhýV„¸Êœˆë*Â$T u×Qt}]ìÐGU%uÖ…Œ¥Š9¥/©("™²èlÎÇQµ,üjæ ®çÂÕ÷B`þu‹*\j&ÓÙ2 ‹ä·Í£”H–nzKYRIËôÄ–‰#UG*ó å"i‘ˆ¯—IVûœS›óʃYUÆ‹£‰×V¾‘&Jézx¾&–*sêbÁÊX|OmVÆÇ³”±­J3ÕV–îеšê!*'óQiÏ ²™O¥È„à®TÒ~ BmîW7u¬fÅžíˆMmm pK¤^¥hÖÈáÌ´*í~WÓNm}°OS¸v÷{•]e¶œ®Îg£ Ug£8—dÈ`³¿W3¾/ûß‹F:,y)Uh²ßª*,µ0O=WàWWÄ|fÌ\Õ`×Â=UF))ôFÂÊðYê:úåÚ0aFŠ¡êýª×çÊ1Õí®Tu/WÝæDUœO²ÀíÖwÊ€‡%=F}ep|ŸÊ`bßI(Û¯ôUjaž¹wµ3 ÞV-Ì&õÔB#ßF-ÌÎ1­Tu¯­Ì¥²Àív¨ÖžpIìaÚY+ Ö" n&+ãx­Ì½ýz³“4zXQëÂF Ãy 4ð~«ŸÔþ+o4$Ɔ¼š²>«‡ûû/[´Îs(Ÿí5šÝ²å{Ëa}­o’¹Ó£ÎT¯Ñ¨Ô–Z¢Kò+­Ïr›¤Ç·ôÞpHÄädH­-òÑ’=×%{±m˜l5Ë:¶g0*§ð³d"r–܈•é—ô³9•LÎ’ jÂÆdÐ7K2ÆKUž>Ïžá*‘/äÁTôv_®–Çú²™X2 ô˜—ädÚÓ§n ä"S /'ïOà º„]îÕ:œ•z=÷U*­À½¶q±bD*¬¬ >Ö†åy¤5¥tÓvc“ˆÏö)–ËñXzïvŽÇ“¸ »N œ«=)sHÂÞö³×†¥C5QäóP7ò؇ŠSch¤Œ?o¹] Ø©Ž¢ÂÅŒI‡8Ž”©0¿Ð¹¤sT€wÝŽ» õ³bð8ŒÞ©öË®b³ÐVH¨ücÜ U2HÞ:RcÅ©‘ìc¸µµ*·. s¡mð~(Z5_À‡_—ðæÖ×%t˜|]›y_íeaÝj\Ò7Ä–ô­¸%s°GºI¤›DºI¤›>iëšæ’¾ò¶¤¯ù-™«Ô*ù¬'¢Bw0Jr£ŸLË® òî¡»<.Uãøæ†c®õKíZFð,‚xrí¡¡æ‡N¶ò€¢‡È_óÐd—Ýt¯Ýþ”¼;a«¬áQ¼ä/¦Žþ ?EGTHÄ%ýÿY®>Y[Ok‚b[Á:†§§‚>‡°®é²QKäj…‰n•©p]¢Hæþr$Á,]/‰qÌ7{"<”èRŠ2É,’aqH'µG¢±³ézîÇŒð#éE&=ôh¯ïªŒ›/ïº…ï¶ çxþ@m˜-~Ñœ~6@ã^:zQxw]ÚwÖ]¹¨È¸ºLF^Bçº5¦ú¥e–’ q¯Òe¾ïáç¨$˜VÜUÍ Gª¤{íý˜ áËH‘éô{³ÄN‡ê«à[x@5`¹Mƒón®ºœ]» RÆâ„9^¾p6JV”›.pì—NBº’²ì¡@ÂÜ/\óFjý4±4áÞHD}r¦ëÊ®ÐbÔz–«ñ +5¢²V‹2mŠñá,eJŽ0†t²(¡›žM¨‹7¨àµ ä `<¬-= ¥kînXôÕ)Dö¼‘Glò3GÐøÙOäa)É<Â%Œt(›<‘«…ÍŽr(,• ‡^\¢²}À4L½¿È¬xB‘õý{Œ¯KÜñÒÄ2iR)É™¦Vpû^6¹â¯ %Xü7³0ô+r§S´r´¹íø"ÂíMÕðévC‚°…&mÁÊâú¦?™Ž9ªÒ*•}˜ÌE)Iy©2÷häesª;é××,0ÙÑ©¢‘°ËCÇ:u鲆·Xµ~"YÛEw`L`ŸŸ>KÄ:sžªQ†V\bÇ /–¾ IDPà³»ÿŒÎG¦vÔÆÇIÅRÔ@õú^Íø¾\ ªu.ÁàããøŠN_Œ§Ó¶èŽKìJ‡ßÕ§?+œ¶HÄs›£‚·¯CQ îej«Ð}3TÌ< ¸v/xSæ¤âX6ªLAv†,R’à9»,Þ{ÓýR²Õ»QÞ¬+RX›‡¾Eë5+ÓJ«AÁŒ ƒ¨Ô•F’£=º%uJW]‹ÈLùf»99à—B7™ân‹$o•…ºÀV ³¸O#1kˆžo¢¬j|S6¹2g@ÑïÍÙ[48xÍà ŸiÅEMò ª™‹ôféòön[à].ðÚÊ÷-ð®)1Î'SE&w4fÝ,lÍÓà aèˆÛ€ST&¨ý½[¢–#5)肸Mýë}ºÄÚ§óùìÝ£»·âÔ«¸™œÚÖ·±hdP`·arýÍͶ'd™ê,Ãû!݆GÎÚ˜sÁïºÃá&&ãuOƒ§]:W2¶8¢¦ `Ô–ðßó¢ß( ÆG„g|!}(óP…[žîû,`&§©}5­9ùQÑ›DŠZZ¶9òlÏ–e>#¨ÅAÈÀÉ9U*ÉÃü\ô|ëœ|À”§C̽ʔ£7éœ!-b0¶¸ Î@Í^Âm[#F‹È-_á«[ä«ûl’·$6/G™ò×´¶àKÃÌ÷ÀÀ¦«cVž-þœg¶â[2ÎAÕ©Ó©ó¤t†ªmÖ/îµÄ vm }iß±–3ÔÒ Œ:»˜¡úV7c-ÃZÊðtøÖ^³¤ R–ŽTῊ®×‡¬²[¦߈Ã)>+´°à…³RL×–i1XEC¨ÏwÐÎÆÈÌi™ãi ý¸zÖêÅ3½ò¡f Êg‡ÔQÑ5]õäCM ²–|´°ìe– ¢•Þ¼±Øæ²e {Ù>¹:÷¥nZ¶Í—[€éK¶4 ËÖä–-SŽ¥bÈ£‘’-$e ßï [+-[b4 [‡ˆGÕÄ%‹#:»ôÅÁc×t6B¼~ýz°O K†ûºEj¡iv)ÆOÙC,RQ=27®B CÁ”nnK•_ã^jE:È$6˜“˜ìÇQЏØ\¡èݶ”®Ðî Z±Ùbã.šÙØT̌Æ&{á…ôf5¶ÛÌilŠØ,© "Gt~·•OyÞEõÍ£àÍ_Ò§Ã!ì›hæÀOÉ϶ó®•g£Ñ7Þ?¢ûÑA`J/Žp÷ÌÛœU†Ôè!šQ?{Î,³ÍÚŸ|(—7œ»ÑÔtüÅ'3ö|Ï2Ú²í[åD™ƒ}‹TðŽí¯txWlbéS|Z&Ÿ÷ú9C˜j\ HSîÛ¹ÃôÚŠô|C Øci:ÇœËâ} 0Wx^S½Œ0rMÚªj˜tÜø¦@7ýhàM)d¯`±q^`š«Þê5Ù:[ 25“¯Ok´úÄj|V‹õŠáµÒyg–›$íÏÈ]}S4ù3û7èåS Ú`"— fØl5ùV€µ›#ËÖík««Ëki@Ü®H.F¼O¨2~hªïåÆªÏ4ux`O ’Ågm±ŸÂ<&nøûOç‹KÔÚÿ{!7]{.ŠùT[,0‚ã²ÚšÓê·ŸSJ: ¸œëñ;ûä"…Ù]¡ö¹®¬¶ Œ–ÃgJœ¬ýÑbŒÒ‹djNKŒ&íU Èýº¦åÌ7«®L•ÔqOxE-/³‹c©˜òº?å:Àøëþú¼ø ^)E3À}à€Y{•%„¹ePýJ,_X%É¥n ˜–¢ÒB¨—$µt"pO5á3#4ÛžÐl4¼ á* á,T@@ϬØMhm;'ñõÒ…Ž">£â¿ÊŸÜ¢é ¹+ZJ! {VLW vPŒ¯š¬Ð¿ëøoxq›WžÝN­ÿ «ý¡Hxiž‰k²6Ægaµ8 c=÷Û¬OiÆÒ Ó†±s“ÍCÉÙ9ä”Ç™‹²ž‡bµ @1;=YÅ)NÅé6ȯj ÁJöG\ëÔ:ý»Žÿ~ƒZwÈÎUëy®hÓÃó”OG†Ô&—â<¨`ÈnI"rÜ£ —交*€c”^T·m†F%¾#@^íˆ3)“·‰A”Ñ0".‡Èt(©¤>i³`‹«Põç-tšëKráŸ+Oòïu‘ÐOÊÜ–xZ×ñÞvÔƒ”öO>`м0÷Jç7·½¢kÜ!¯$ËusÚhg×Aöe’¾ƒöŒAbÑÊ2BÉÉßA­%ï,LWÛÛ?: ~Nâ6ü7ð}xº6GZ¾$dkYBnºã: ­…´¥÷YUR¦ˆísÏÛÂ0:ñ«u Ù³þ×Õ®úU[(òDt›¶k[ÙL-;Hë3´YHz©'w÷Xþpâ¦si4¨•L}ƒôÏø`MKÝlêÖ¼IVèÚÊ¿I…®­dTèñ]*ôø.š‡dW¨_?NO®t82ÇÑJVzäÓ)€D^ˆGíîGïNs#¥G¢‰ax}ƒý# òÙŽ?–)îw× rˆ:Ñ¢½Xž…€'+F™Û«ã¶Ý|7€/1ÇÞÈöïrˆ{*#tvÈrÞò'®ãW(ÕîUŽ/eæÊ´ øÓFüI/NgI£þøþcáU ) ··Í#êÆ\¢Ö±´ ÒŸ£ïwôܵlÏØ^zý˜b÷~4÷8¸·~é€C—ÑUÜO8„yºÝ(aìÀÿè>°RT)EÕRÜ-ѹâpµãòÜh<¢¬ „àŸä3̓l€ñœ ô§š1§œÞ€ÙOŽs[¬"áX¿ÏiÏ»yñ^ý,¼€\šBß>ˆ…Gnlð‰moIðR§$q(¿­nyç0$wàþè]ï&7=(LbŸ]¨Ô>H_<…ŽS‘G8r(][~Žˆ€)·9@ ›A‘LJ‘ò‹°~Õéô]¿&³(u1ƒÿ/6þ¬Ù¾i¤¯¼|<€U¡•DQÅ¡ò€£´SƒhtQK˜MHÎ_Ës«Æûbé‹Ûç?³¨äfEf›ú‚N£ªƒdòê<ôUøh¼y„2òMJ5² ÆU^Çë÷3¿¢°*`jè=nž=¸íOGŸCJdy3adÂxú´ÐV”ü´ZÒÄÐ7ìÊ`\{nJL«Hg©¯—2( Æ ðÂÿTH‰…׆>3Ð(¨ÓΟzšö(²EGFÅÜI€ª±WªÊì˜_ÝR¨Î,dòsÈ\ÃÓÏfÌAÜü»÷™=Ëwô¸’ªr½aÜ>9Íïœyˆ<“–-Ì“{±(‹ŠŸ¥±µ öhVŸÌ°è¡r›£—xËbêðê"»ˆcÓ½e‘£(iwÙzŸEh=šM6g+Àõ¸`“ŽgÊR±v<­2#Çì|)™ÓSÅ §:·ž:¦^t'¥×D‡Ñ0óL£ñ¾ÄÎÉ'j2067w>!Õ‘æ£îŒÎ¾•O þ bôÙ¥ˆ%¿óíOja1U„ß ­%ˆ¹õ×­ì¼Â9(÷pðGët•ìåoL?ÖY~]VFŽÏ^B=Ô¦rãÃQo.¶Jë÷Ê£;P(w=L{Õ~AnM¨`¿¥(¸1œu2*¯ûk|ÑKj=y¦&ÙlG†¤—…ÌŒ„Ê÷l»å@*XAÆzÄ3 ýEd9u }~Ù’ èñÂ{ía7:£ÜßT‘<äæ» áAE{âwü äw¡#tðmtTÝ̘»~á:ÙlÜÊÉÆUs8ÚxE—ÿækt^è/ñ"Š·íƒ@¿eé][§ÙãUû|·%—œ&¦î=[EUÔÍ$ËÇ £xÛ5&ò -ï`¼²8àÅÞãô‚nn©Ð'A :O=Ð2žŸæÏçóÜyÁÕ ëȃWáüF¤HëÉ Ìy¡xT†çÁ‡’¬_NÈl‹S­>«’”÷l:ͯfº$Å”Ê TÌîÞëý:žcŒÐ)êz,ýا°æ.ÆtMZÔc5ø“A»¿MéÒu>7<¶OêûNñå.ØQ9ކPvâÀ/*àdÕ¥ ?ØÙ*œQ<‘ƒÃ>ž­(¸ô»ÙVO¸6òá $d¢¿â{g:ë9:X2¯ÑÛE[KæCÑ/ ónšù,ô×AüóY$ž%†ŒÒ~¥{•®\>¤ËbñífUHº$4³¤±pß K–?*¦eΧ³—pV(ló5PCyâÎMawä†ÑEjöÃC{ÂiìÊšF—Ør7w>tp£ -ù¤*EµÀèPj•·ÚI?)¢ 0y·Çt‚KÜØu˜ ý —‘›ÒGoÉRí²Ì\-¤ÎXo9È_"ùÕÚ ã%×Ô lóäoºI'õç¢Çz¢k!§bY¨ÏÉÝØðÛä¿Ë–XxOÌ—QP‘çÁ{G'õLí¤¡7ËÛ­“ÆËf]t|)±1ýº%hƒ¨®J¶ mÐêºSt|F·ß¸ɧ¨†QœGµöˆ¶få9+¯Ïîðe©‰aû3甥!Ò¡^ ‡Ãr¹,ô]³t’òjô#¢2ïFI'îŸÓñHJ”›“Nè1ß;¥à¦2$ê R7¼Êƒ—碩 è€ía4û¿·Ï­ æçNj.y›lbG(p|¢œûbøOs¿qðW;ðJÈ)§‡®6½ÔÕ-ø£äslÙ•g•)5ÎñÆ}VËBá‘rÙ©ïîb?ì ÆÆ'+t/—«×®õÚ¥Þy­w^ê…n1?çìÓ¯¤µDêrWÑ÷^Õ?ÅÑER³nŸÝÆXÿt¡òv9N¦ÅʶÔ}[Â3ÙD,&5ˆºµ7o¿%ù#~QIM{%u.@ –Ñ"âE8èeÞçã²3+Kïóåš·2·³»&R¹¥n„Û}y°yò_.ñsíeaQ”$½vÏ!Äl¼«¢<º…ï…Æqú 9a´Ê»ö='öý&’Wvɰ/jáKÐØc7Rƒùaø—¯¸ÎÀ!¤öʦ§f–öâëá>LûÕžòv¡e_Ï4žŒºêø˜×QsÜ` Ÿ]€âîuk½®wæ"ØÖrý5î½oçÿ¸›v€ìÍåy‡’ÝÞ÷ô°ëGÚñC¶ÅžŠ×Ê·Õõ²s€¹ŒqÔácÞ™Ëñ»ÞFjÏŠðÓ,ñíÞYð]oóTãâßòNðLÜý— ..ÔÊ›Ä3qwö^qqé‘ïÄÿQ²éޝÎo!k Í–M«Ä—ªçÊ&„‹ò*ö\Ù„pqË@^àž+›.®%óµï9²¡›(ɺ,Hg˜¿åý$~>x…asïù­@íPëÔKXjÀÙ+oÔA6·•¶¡#×±æ¦ÂX>¹ÛRñ-ɤ¨äˆðB†c´¦­&ÉHäù®ìz޳”[/ôÚ=1e;8î[ÒÈÊGÛwI¦}‡z4‡²â%1l¤‚€a'8>iI^еŽ/óé%ïãé⼫r»õ™ž^jiæ­ íi j+ÕçK)ûŸµÖ·Öüù‡ÆE¿0ö,Óó2Á!Sè¾5_;ûDT*©±5qœåKFKE»´ÿ=TÓa˜u\ŒpäU '=\i1_ûf¶µŒ„D‚ IfiÆÈrÖf‚šå©y@%ÒÒÜ÷šÚÔ,pc(ö}eUÁý)…³X$'Kq1g!ˆD*]?Kßå›»˜·'kH­á…£ïÉ“µ™¡µ¸v²bjAª”$þ¤[xþE‹hƒ„'ôò>I‘øL$¤„3HLmÓ‰ d÷|É¢Á–2fMHÁÔ¸˜¿`ã4›ô ê.ÙXÀ¡Õˆ]¹ÑñÀçXÈØÍ_ÈØ /dôè´%-g|qžY2”|8ʳ ®^¹¾ŒhIÀ»Î1á]›¨TñÎøõ“MH¨¨ å^˜ŒUQ´Î9\A?9E¸lÑ­–k¢^˜ä;`.1û#öÚ<¦Ñ"¡ºm²m ?ÙkŸHËdYU+ŒŸMP®‘S10gÜ,ìŒé²óϪÐ4y³,±P¼Š‰ê\ÐÅ•Úwziw5U•p3”~ØzQ?Áœ5]:$ÄŸÍìB6˜\œÇíQçÒ ¨Mß í@ྫྷ9ƒZ…Šv-=ãLiÀóÅZñM®Û^ïíàŠ,Ô—dÀ×lVNоMO%ÐgÍï}qè^†yö¼LƒÚ´WÑ–Ž[…Q5ÕEûèt á¤t§Mì¬ä­AÛe½E•Wxä.xÑÝ6Åâ¯k^صÅ´Ã*d‡UÑC*—`ÝûRd[¥;Tåj—½Òæ@Y”['›Û/>Á<.õø h5øÏ·f%ç©XWò*ö`€u‚'êbøñz\YC{±&È«‚¬Î‰œ4Ú¸ ŠÇåödy‹š¯Ü¾ê¡¼\ù‚k_Èê¯|÷ú¯|M@þ™ï’ÀF %™³d›Z,& Âp•¹bœ%Âj†«ß]„Õ¯aU‰°Ê"䊯õú£ˆš©j¶sw8ÐÕù;×–Ô›Œu$ß%ž[a:0N§¾»´~­F&%’ÙÃQ§U?n¾Ä[Áv·êéúÇâ/OŸe¡Ô3P„—Ë˃Y¹<­=ËBÉÊå™+  Ç§Q7Ùàß9éÔRtZw¡ó—g^© ;Ù(5¥5 å©/[›Ù,Ùf2–]é ¥:—L²éÔ|:¹u”Y„g~Ù ÷uTóË•O'ÌOÎÌ´‚m,wjæ¯æÐ„Fê­~àruÚ©óî3’;¬Þº™XV¬OPÉh6E‘0¼”áL¥‘8±ïy4ý¹3ˆÚ±›Ê½ØÈÝPñlU\ÝS<.ˆ*ˆšGpdz¶ë7MÀ¢~\â)QT,ÁÜ€—Â@PêÆ®YlâÏ>"Î8Š6âv"TI6b^Ž6bŠÕìAgx]·ýÓ€½iZ¨><»sYk›EÖªU‰egTx$¶iâ‹kY¦P̘í´ÍeKmï"ÚG^Ûtø¤É„9‰gO¹pÄwOC+Ü¥cª"$MÿÀ!NÍs§BŸƒŒXÙÏ&õ’$÷幯Èc·À•#…ŠF× ~‚JEI*{òM‹w‰›tä”›–ý1 %n˜i<ûcÞóVÏþ˜…Êïùìü!¼Æx!>sðÙz9C0ÔÚƒëöÇ#lÿѶ’ý2»´ ªDãé¸0«$YTh±…ȲÅ*ŽÓhà(úÅâ>«4©K+kf¤µ ÄZB+ÈÚ*>:íºº|Ü\‡¶5>±ºÎ#A÷%¯¦|Oï8î¢SÝz ú5÷‚XxvQyl'‡ȘK¡xÚ¿·'/ú…¸„×loÏ'!ª&ÿA7ØÔèb"ºÝlø€a®·ùo²t=Ýôl®-fóŒ3W¯ÓP£$‚·¿gŸ1ò– ØÉäÓàR ŽÆr„ÓÏl˯ãÅRÈVF¬À€tð¨(yK¦WCñƒi9BR¯”äCÕ[x·ûFÞÒ¤=*Îàjå|7lc3ÑË[z3K§–Ç„AT˜¢"Î]*óMÒó˜ÑíÓ¹ Uéú£ËŽMÅ“tòJ¢ý\nJ$[1³ú4æè\qrƒGÔ>–ò¥ðu‚p'fbKÉžŒÃu#*šÈÀHÙŸûü1êÙÏÃyFz¾Eáä'}tv˜:éûü— ÑE‘–VÑ!u=kÜiý!œT”b%¨Ê€²LEëSÈjiTÑÁ‰ÐJ-eÕÎØÑæ+uÆÂ£Ÿ_É}ÃðÊqzS ‹pºü]í êB†¬˜äêZ‹ØRãÞQ^ŸF-Iº•¢g˜?üø«ŠŽ´TÆÒBK:Í…q²0rp2—IrxË\(É-OîÔ=·T¹‹¹eËÏ3¯„ùyfaúK rÀÉ]d°=¯FöL?´8jo˜v»ñ±Ë[Ø26º½<;xz<óÊ%LŨ=˜ •ºQ/)½˜Ð‡ÎÕ´5Ú¥%µ•©÷ ®Ö‰0EÒK@/  ƒ/}´ÖÈ ús^gOæHpìa“xsö6OI€Àš'Ÿ¤¤@rÛe>ê¹ÙíÆTÞš.tJž¥lè"IZãKF”~]R»ì•ÿ z©¸²mvÛÝÚR0ó úÖP®o‘¶<”©†ÏÌ–Õd[¢ã$}‡)ê.Ú[ØÝñö¶\&ØÞ¦#«æÐm(Jôgc×GéÍÆ ¸èJw‰ü(_Þ½šq}gðÅ †¶‡4 uB@‚§Ž„Iµ Õõú÷Éû?|¾:| qC':Б“›ÝHŒtlm@^9¦MøÇ˜uún.@è sÖª‘àÆíˆ+xüÙø»'x¹[Œï.N Iø|l’öuçšã’¥"¯ô`ÕÙŽ04†Wª‹„=<ú/ºÀ9™–’¸#ƒYM>䇬C‡>NoÒ_¡·ØZ“íªàæ¼A -ô¤hyqÁ×Fá“~¬`ÙK_6@i ZJ§ƒÉ–¿ü’Èf£ñ‰&¬%y(Ú•pÊ9•P¿•Êåò—€Þ§ñl>…N$*)á6OÏZ‡…[òÁCe`J17z˜ 1tRoY73â ©eÉß̰Ò¥SíK–§ŠßYDæøXiìô=!At>‰™F§[Bþ1þ >‘™Aâx‰ÝL6z†Hs>"F,"­Dvê»{0=f°üªÜæÁÁak³µwx€úL—•[èøŽIæé±fj¬À›ÉQOÒ(!#Q¡ºˆÕÔ:néÊŒ‹“’ Ä‰Jÿ·½FÃ#€Ÿæ `&a¥‰ñ˜aGÙ/"qœðt‰mßjBÙy¹]Œ(Æ z0+aüÍ @öisGí!°Þ30†H ˆ(ô2,…/Â5a9l—+ô³jÒ‘ F.Q‰¦I±â~Ò¡C×ÜXÍ–ï#í\-}r®!Ц}YÀå‰×À@"άKö™©¿#‹ËD¦:Š[Òé£/pUûè¤`îx)nl`wc4À»(Ð+%Aû+¦”ÐÂ6ÒÚ%Z:lˆCÌ¥E§›z¹Ä¶·O”‰P3Cgß™ÄvƒÔnIìLâ ™^½Å ‹WOIÀ)úQ’¸©º6;( ø_뤾¹o¾~çÐ FÛƒ+Z1GØœžy8êƒúƒ çtUšq4}íÂ'¤'F}p ì¡ˆ)™kÓø£†#ÖÔN23¬ÉT$Ø©È|pàÀjÚÔ)Ø•Ý.ƒ7ýéÖ`Üy§2î°+Ò¨¢Ó z4‚«Ò¿P5bÍDkž Tí¸ûo¿q²×Üþ™\6~f}Ç//§ýA9¾‚¶ú-ÁomeþVW*•eü»¼òd‰¾ÃïÉÊÒÚàûrþ·R©þa©²¶`béòžùƒÖÛ†æü‡Æýè2§´Éôª íä{°ô=…G Úa§°×xØàj:BîÐERjÁoÞû;`ø ]g‡;hÃvçz¤ 8¡NC”¹M±3а»X^ ïlº8÷ŒÇï®pŸºÂ^ù°U6¤¹ÑRq øô\|OóÀ»WÃáGÝo€T>8õk&žßîŠ`"–Ä”þj”Ù—0‰€C‰›/È^ãŬ|ŠK¯©þ’ɑà "Ât+6·[™—­4K6;/ææ'ÅЋ»r’’áépsGñDWÖ É]Ý87{Hź÷V8œZ÷mÞË4!SÈþ«{å?£¦GÍúËÃÍ“½Ö‹¬B”П$™Q¿46Ýbú5ÊäVeË.ž]BÜôPEÃmû´¹IÏk $PSDjšPMScO¼ûPè»wçÛëÇß‚óã}°S÷pþCŸÜ¦[솺5‡¤“c©ôî¹[ì†{öÜE—áÕý"³õëbPø,‚é ›ÆÙѦ²h>Q\µ)¡§Åm*FS"5M¨¦ˆ¡_Â=ÕÊ¿zþ¯û9ë?j®~‹>Ö/ýg þ«xë?++Ë+?־ǯðHè ÐR†Uí:(|"ÖVÈí™Ö—ý Ü´(äIçƒat„Caûx´lÒºf)é|<~'þñMl…b3f¦QgzGâ$êEq„—àí·GWíÁÇ"êBj)'ýÎe;îŠFY4Ñ7¼$vúý)Ú¸½T•_~©âÂ?~,6ƒh$Ñúw?*.´íÌ8ÿÚo-‘€’DqÒiÚ1½úÓ)”ôI¿MkÄüu|Å|ö+I¢áùà#}Æ%6¡ÃRPü‰ÞG>÷€³ò"{íŽ ëÁ»1¸sÛ¾AîŸ:ýSüf¹úCVð­¤ä©ìâ÷Ê[<¤å©¶v2Ü`;}yIºU,þ)™,†•ãgQˆé -þ}o4-OÇÍiŒõgŽŸi Mü©—Á\o&s=Í[Ï˵'sØÞÆ:7NíA¿­¥CÔ;EFدï#ÆÖEû⦸>(Quæ±Ê|è—XåÝ:iPîÓx䘘’FæöÐáUvP5w“i|"d}.½Å$ìO@¸…gÈ…Lª®ë¤§é$ ËøXH¬5“´\Q²®É6¢ :ITCÜÊ©ÁSk5xçOö‚•j@,¶ÆãAòó9ù7Ã`!#ANÏ ¼×¿ñù³ý^jOŠ?,‹§Oųgâž=“c3¨¤ u¦c¬â‹‘Ú#¶î´ÂMHJ[á{dQ(4,í ÆÓs±ìC¯çA?IA¿œL0- w°QZQÛþˆõç?£û„( ĆøÙJít¼ž¡ ë¡BÎߊŸD×J?ÿ8Ä ²V¸Aë’‚¸ƒŠ³*k>DW‚(¾™É†xïÑŒjÒâ¹Dd@ïЧ´–ü)ÆÃ_¸¼ñ[¬zSpðE$6Êši{òÔc)m1¡-ú©¦Ïô’Q ƒ^ÐU±€o §ùH|ù¶^º$, ¿ÏÉC>…9xhä—¢;‰3—H îˆM)@ê8››÷aNìlFÞ;L¬ûL¸T^ÎI…ú}ŠTªù‘o•Ûþš­@ûó‹&Û6d ½ìÍR¹üä­M!ÐþfR¨¬:$•?“„‰@e“pÓbΪ‹€î®kA†ºø®MŸÆ/Ó(Yuå·ëçøR©¥Ëi#7¿¹uKäL±›ž/—P}‘| )ÊÛA÷ŬnIJ‘|qÌ…ä‹!)Õçø©qì–}sõ¾Ò\õíŽl|iãPŸ»XÇ™XŠö:à q ìûÓ-$ ¹2G€)–„¨àå”ÖÀøf{ÿ㯠>æ&ø“à³OBžóá¿­·¶Ö°=!ÞžÕ€p¡Fÿ>åñŸAtE¦WÅ·¶aÑó9·™&)Yõõrká>v… X3…ûX —0V¼j ç¶@Õ¯IB=Î@õñl4¯l99úÅ[ñ ˜•£WÆõy˸œ*ãú\e\ö˸>o—Se\Ÿ«ŒË^7vœŠwÐÈ‚¶Û™FÛÚÛž mïBŒ÷!b°¯sb2Íl2hÃ3¯¿ÊÆŠÞÈ@£ë¹mĬÌ4Ë÷õáIv–7>§/º™žÓ¿ƒKú—žßÓó{z¾¦çk:ÁvNÿ(VæÀòä†×÷ôñ=\Ó3  “wçô/ à¿ôüžžßÓó5=¤5›ëÄÓêGúéñ3õh©½úëÖV£$àOãÿá·c~;æ·S~;mØÞs{MD…?ˆŠøí˜ßŽùí”ß\Ôýæßþ *þá·c~;æ·S~;m¤.+Oóí Õ@‰«€ÿðÛ{~{Ïo×üvíxR•”¸Nø¿½ç·÷üvÍo.*UM‰ë†ÿðÛ{~{Ïo×üv=xk7$­æÉ&þƒ´kÏñMá) "0Ç?ð¯MCêÁxnïjxícÞjÿmó(C‡`àD«‘ ÇíYp‘¹ÿ²ÑÈê‘ î€óÄÆ,:˜ÇY˜>šÁz h/2%9¹|¦ šiÜžLаK[6îðCã‘SÓÛ,Æèyåäì-Ÿ?;è®á“Â<žÇÓ]ò0S˜så‰5êbzuœ‡yœÂÌËÓXLƒóŽ jAcÏ Þ7T«©ði ’¤Až>LõÙqÔjÐÁÈ`ÚøO‚}ŒL·gž÷Ôô¶ú…0¶¬Î޲‹—#`†ñ³,¿é7f[~Óo̺ü†ß©ì³ÐIŠÁ–â°¥Xl)ð`ûZÄoK1ÜR·Ë­Ï>35\{“O‰ ¿ÄÅàd0éMÅÅŒ¿ÍŒ3zêÝùl¶ñÒQüƒƒjºñS¼l´7à¡CŠ Þ"÷ ‹Â_£Š’¥¢„±½$¼Mð=þw™¿’üÍ_ ÿíY…Fwòß~ÍÁ_P2ã¿DböžÞ÷좰óoõ׿ýííÞ« ¸º¯öÚ¯áükÃÿ›•Wø³ÒiÃÿ›•v§‚§M;¯àÿM§L¸P¸m_ 7|_Ÿóà_ÿ÷*ïgð¯2Kàÿ^Ï|ãã{ø¿÷nÁÒÜYô^ཋ¸ˆ:í¿E}z²±ó…!4SÒ‘3'9sÒ9Þ÷ü\·^À?P³ Â;[côM$æ®s[Šº“$È› ˜9u—êÉê9=Ä ÕC€½{WN&»‹0·¨‹hQGТ>/SiQOfO²{ÓlÞT„¸yÆñÇͳçø÷9=?¿Éž“Lû&Š9G3VŽU³DŠô)»“CcðÙÖ§óÙr}é`FÙ[Ig’¥¹]ѹø‰Y¿…â¨à$æ¿„Ö°²ý’{pL,üž‰ÎÙ¯hÿËHkd´òüòp¯84í »þÌþ.ÏC¾ –ZáE4³n–F…ÑG]‡¶"·‡ÚYÍœ¹tJÌ-Q$ó.4idí%=!•ÂÞjú¬=î-_ñßãÜ›úEñ¼Polþ°#6Žw6_ü…6¶ÿچ湺!v_nˆ£­ãýÝWÇÛâ—#ùÑ›iÑ›)'׸·z –ôJÄà^—ƒíÐjnù­ÍÒm%)‹å-Bn+2»•ߊÊps\ÑY®è<§,•Îã=FѨõ{:Ô<½%éêyúºÎpƒ ]°+&ñ$òV°A<Šùx+Þ ’@ßÕ¿ªú—ãì T ÏËõâ¤Ó(_N{‘ˆ“ä2"Ê`‹x¿ËðRnnQàLóh¾uƒb°h˜7J»ÅK|&—Š'<¢Ô] ZoëÌ»ÏøBÔó;¢(“ô¶7“™-+×@ý#ÓtaÉ›·tyír$6îu¹¨¢'ð†õ“þ·¿¡< ž:6Œ^ÌV0|Léă©ÈÓ–âj€)®-ðÙ=®4¾Á?$˜BÇ@øçáê’ ,yؼ¹^ߩ–šøKD{ ííqvd¸i„—@«J¯èv‰®*‘ìB4‚/tMPŠ¿ÿ »#èl’TZ+ìÝNv ¶Ôö¶'QSfŸ&@¶ëz/[ñ4êÍPCþ}çÐŽÖ²RZ‡Þ‚ØŠ“É·üÈõi7;üïx^WB¢SÅc0W:mÖ€FŠGŸª|Š÷6û¢©Ž|³TЧ?ÿû³Ãç?þhÞ€Mk`—ºsøÎ‘/Ëìx4s°á·NØR,/v÷Ö7˜„Ê8KÏøçó2Ò!ð’ß•- {a Ãq€Âp¢À§LHt•¦@ïLñ*ídEÇtW$ÝOâ¢;À ¨¤º FÝ‹»êŠˆÁŽº`;L¬CCFG<Æ 'صϰǕ±>›5ç`b ÞÁo§Ð&8hÂ?Ô-UW¸×v㓲$ :Š|ñÊGBvS\*†Üé%Hy<ÃhóÁoDÐû[ºÄ-2ÎNWÐ\TùøCT5´ôSÙ×W¶}¥ˆÒ´5sóQÝqs6p7äÒÕòR0À,àÝà !B¬ÌqHpÖ Ÿ,˜W5^=¥ä>véq›^Ÿ.ØÈm|ÕÃçým|ìããCšùð]‡Þ ,EÒù˜ŒgæÛþàh‰ÕЪHë†ððÕ²—×–”qÕÝ¡WküL”‹ 1Á]7~ÕÔ÷¶6 å½­_ìǘý¥ºp øåŠýnOà»úK~²‡ï×Ý·¯ú©ýŠ¡7¼—ÇÈnÃÏmœÁ¬µ;° ÐíÎ/ø¸EDk“±ÜëüV’k¥jKJ¼¸¥jþ.¿H|o«ERìÐß6ýí¤U„!ìÂ~ÌØíN‹˜îÐß6ýelc•FãÑ#ké;=í‹¿[˜Ežº­ºê†ëF@uéãUm©—–ÜÛ/mÅ•" ´¾T¶M‡·»Xôe~»íê;5iSŒ•¼Ö—HÐÌÛõöØ^NÑ:Þë˜äaáÒ•“í§®OÙÉu/™¶«XØõ²zëäJ¾&fôiÙ¡…Ì,¤SB¢Í"R­®_Û,–ë-Úða!IZ” I®šZ˜ëû[Bf¸¦Ôà÷e÷õ~Ýv_×ÃËÍÿÜàî ‹ÐÊ;;´ÅÂfCÜß¹ÜW˜»…H› ¢Nb¯•ùíÞ a½^ëª×{æe}­ìRzõÂBy¬P^íÙ”–ƒ_^˜—«]Ò/¶L5B¡½ 6¥¥SùzÏ¢´öئD; ,”ºByåäîñcõÚÊÝò©Gé;w« åG&V#ÚKa êhí°°‹¶.QöJuõú••»Ç>¥Wvî–Ê/NîVõkK¦šÛ·Mé)µ†£uá¾îñk·BWlJ¿®º(Ô:x£‚ýºædäXç}9ß²2ð+ v~ƒºáÝ6ƒå¥²×S¤®ï u45úGg…®(Ç YPºœGÒêßmúmõé|3 ¾]QPä 2h¬mþía¡gXŠ×>CÕ× OŸŒ'رá,ލp²Ž¿_ɯ㼾é†fêä×1¿’_ÇÙc¬Yô:Õ›BüºõN·Jû3쮊†ö^ØÝš©eî‘”§²ŸrQ¬ŽˆUìµ¥̆¶>Xo×ûh\ZÑñò³öÓæ£Ç)‡'í9¯7_wöÐ+#6I¿kÄTûå×Ëæuûµ•°ºlgŸÒ_ÛôjËž]7¢Ø2j[‰²†¨§ÍO&lÚ Ë=¯ãâE¯ãâE.^Çå×Õü:.¿ºÇ¯íò«w{e•жÖºbç•Ëp ¾rò±¹te[ΠãÚ{µzøWÓµ?VNrÂ%T7e‰9­ª:¯k–èr±ÕI_%%åÅW—àJ Â½%º§´ng—ÅRwU:ˆå7Ê÷ke…¡í#]<^ñ@žœìUþtª ·É=¿¯Âñ• Št4ݲٰÊíç(·#ò4šÍWåúœŠ†¦bxß*mÏl¨åv-YEì‡Óçvé¹E ¯x9ûœ²xvjÙbG1} M˜/‘A‘¬5Ë4˜/“2Nêl¯O™a® ©ŒÒ¢MmÈqÓ¹aH­­-Œmñ¥µ,@µÎ>‰É”bAõÏ&à¤Ê]àÃOf!›r©.'£XB8&a‘UF³>=¥¿½çŽ‹¢ïV§È=•°¿Ã㌴^øBh¼{·]©?®˜wweÜélMmo ]¶30Ûÿ^ZK¥¯?ø˜ø!ŸŒ ÃK¾1²­}]ÙÖî ÛIž>xû¢"§í¤*ëYSÖã™n\F«$õ&潺·gRxœ¯Ïч©v@ª¥›§Ž¿íküëB*¯šé}-–É×_-—´g²HËu÷ž?KRšåY0vžøµS_~_b9Of_ 7ûGò¥÷ÝõÁƒd¦×-–GÙ;2JiI,ÒÁ¶²Î¾Ì‚}ÍÍNÉ:tyH‡.éD.™\V¢l·Ž÷×þjrÌ=0¼ì0=zÈ}@R kžujßÓ;3ÓÅjLJ@‹ª\:Ã~OÓJu5jÑí«ÌÌ5ÕØ­óžc[ìùA™ÿîí‹ £6ú~ˆ¦‰:“„ÓEÝSl%>±‡b=]Œl]xîÓ/£×éBz}¿¥dç·Éëý¦ñûä—DØâ´<“36ç« ýØÚ29s$VMô%^›ªÊž/H˜ó‘u,N»Ói î”3Ió÷¿cÕž:"»k:$ôtÝøòmðoù²Û\‰I&c"õqC,e\coø‹îtí‚7ìȲxg â‰gˆé–4N`›¢õ¹ÐÑ-WR}ÐR“3*ÇG›¬.w>nè0•Çiwÿ/!”xô[áðÅn~r‡ÀÍüu»½žžºFÏTv/¥bív¡á[rñõÔÚã‚ËõßÛ-ë½;Tq5ï@Œ3iÑ9šNÇS±(ßS¸nžøÆ¿ÿì ¾þ©çþS OßõκWtÉëêjÖý¯øÑ÷¬Ö–ðþÕÇË«÷*EÆçÿøýõO¿qâ$¹‡;€óï©ÕלûkPÿWêµï÷¿|‹øn]ƒù¯f mdtÒ}Lçø‡àýƒ€„¼Gïý:ÚÝyÑ%p‡kOŸ®‰ Üÿ¶~)Å‹£DÞ¹R^ c¯Ð ­kfÐ •¼3Ø¢!Ö÷_¬ïî·;G^¯z~9 #Ñ~qÜjím‹…_6² }ÑqQÍâ0`ãíí“í×_ÁFî(äjÐËÚÞÚ=ùÏã—‡mÜ1¥;sKd‹y‹w•ìV7Ýw¸Ìïñ©;r ‘hö"¶‹Œþ£½Ëý ô'¸[¿HÎ÷ÜÎm|ó29«RRiÑöbàÈSA^<å·…k¿Q/ÚÑkâ j‘½ÝK»ÕõýýƒÎzg÷`ÿ:®T«ÕÏèNP¢Üäu£A÷vÁQ?)C‰6a0ryÉÙÝÛËI¦;䲓I!Øû‘~ïm1;ÍÀQ+Ñ%Ä×ý¦ÚpR,3}šÏ™ò [â ³`=PZ?Ê€õ@[9°>hލÀ]ƒgŸ‚ƒ¾Áz 4¶ ÒtÀ-ÏÍž °DI·÷°\VúrÚñï‘£¤µK²" €Q„ £ A¥”ÉZ-Õog:±)VP↋¸ ŸŠi›àÖÖ1é'ƒ(’IwjLÀIÆõDÑu‡Ÿpú“Çg”íî•d¢lùjQ·$ ŒP[YBü7ï0}Ö„Ÿj«ÂH<üZcÔÖh¹sÄ!À šd]áÙÓ'4NŠð~ ¼äïbrÐkuGÀ'Äl$žCy;’ÕW×4Ü“4Ÿ'óÙÈð†ý8«ö*2Šª‰é…¬FƒÇŠU¡ÿË–^Ö¬<T­ëßš›UœÜ£K*éÊÊÙÅ„U_#k»²Ý0ÍÎK² ª&ü}-/µ$ÎÕ—ŸÓÒέ9œ¡WÊæ9˜\ëë55Wu¹fš«4›ØGYôJý׃õÄÀxÚÄ(¥LU÷ƒ5MáJՑо‘œî[Êyà·$°®Æ“ Âëâ)S›ÎæVšY—úÎ6°¼Ý„,¯S×¶Ò( hè ±m7ð¾;MÄÆïÂÍA]0mý¸×Ý›œƒ]ë_ v0BH塘EðæÐ—«à¥½ án²îˆîý¢ ;º‹@‰Ã¢h2D¡;T÷ á‘²·ß)(Íê,åwE\ƒ¹¾µž}Œ†ÁÑR/§jo×­Õ°ü”N~·Š²´¨ß/Š¿ 犷äw-•E?hÚ Ä~‡šžŒš‡aÀ¸Boñ¥d¯)øFîí;Â7riˆ€‘SVÊ55ÖAß´e™ln­»rË5j>?Ǥ9¥‹×Ê> ÈÜh§†ýÍao~¤MCB^ôŽŠm7Á‹è‚M.r1J`lÀZƒŠE›ÜšÏLÞJ´=ª)ù¨ÛáåØ>h‡hö.e;‰#G¾Cx!µÒ0ä<1:RƒÙNŒ&íV‡ýnêFú'\$¶´jCk"þ_žØS[áiÁÅ’%)Ƀ‡]>#ƒ*mÇüàþ&0>TôFy².h×S~]«Be#P#œöV²  ^MÉæŸR›Uy“c¸Jxu‘-·!tû:á=fY•"×;J㉬ûBv¿VpwÃ]+E2H_Ïnj„ºÄ¬*áëèï³Bx]JqzšW+¹‚«Œ“è<‹oñ2û5¢ ­:‘¯T× z<ŸŒ]2Pˆ>µÎ¤"l§æ³2IìÊa­àF”ÊqÅBz«M„KB§@QÙÄ>)ˆPQ¥Nç´Ï æ´‡¡}",Ÿ†+¨Y[¤tò!¥ éXkÒp¾2M:ð£¨iI¡U€Ä` öCeh°9Û­Ê ¤i(%H!*ƒyd”cj·OÔ0¢¢ZñnU/xûp.™×é|È$Ä^lˆJÁµËêÀ ´ì;6mj§@ÁkáVß­ÒÊnFP¸qß8î: ¨š´ZØWî‹Ýú$-Äýáœùë GrK@·_ÿY]©=þ¾þó->ÙõO¯£hr>_}wå‘¿þ³´¼¶ºd­ÿÔÿ°T¯-­¬}_ÿù›Ýõ’ÝP\}ù7©/”$C½™ÝgGi튙·Îã/†xë4,BrÞ¥¡·\¥)ÉeÄåZ¯9ÜÞ>|q°· þª=¼\ã.¯ø‹+´µùåáÁQg}¿Ó°O¶Q0tŠS|ˆFt o<ýØöÅxÚ×[w(˜½Ì¿î½0AmRb,ù.0Îa–Å9ôÃÈš„·6ÀÞJÖ~Œ«)˜ýË 1å-ºA,k[I윗 ˜T‰˜ƒiÝ'žQcr9(ݘÏekªQ~Ò§ô6øtÞx8žÒñ<›{ˆí5qÂ#!’×v¼ñªì8%å²s |\nÝ Žl”$R4;¶+3µÓ¥lÇ;°°2 .ùtqͦqæA_UÈÉU¶×½$%r!÷æCþ¿̇Ü`È\HoGv0OP®2µQÅšµÍ©.õÒªZeZwjÜ£"U³fí~"*q ÿÔs0e£"Lù\O«£H5¸š2)úM}^ó³9‡ë{8†±mïrЇ*ÒøÂÐøM¤Î¼}GsÄ„h§Ü YåáºjࣉpÚ<­Ñ$DMÎ7— —|iØw‰Ð©¿k=/T'"u"R7D¦0÷ ”ÒŠ± HÉ´4¿èPŒ[ @Oç!XõT‚²è×y uƒ9ÁAX£!+Ç-äXæ•3g5z@.²ê°Âq %ò» T¸>OAe¾æ6½¢þß—ìš³ÿgµ¾ôØóÿ–×¾ïÿù&pu~Y?ÚßÝßiðÿØ„­§ÀïÓËѽ®Áë¡&üˆ»|ÄÖ˜VÒ£~­®fa†,Aêâ×ÕdkKw§›öa-ºµêã[ÒÍñ{ÓŸrÈ6ÜWª+9ÜCÞ²Á]-ˆ›r©5…'¹‚n³¶çè;JO«O ”¢ñµEÊÙNï\»Û ^½ÜX-§»ä{Ýer»³q³]oÒò*Tæë+…3oú«ÉÉRÀRçZ>œÔê @!­â¥°'iŠÎÙ ”¹"JN–*Hÿ0_Š)^°ò!,ƒú §E§ð\¸ÁÕ³à ë-Ù®„(Ñ¢W6ÞDI 2Ã1ëó;á´UØ5Î@H²0®PÓü„:oÊ{¨°O²NtÚò\w›@ê*†ï§ìã‘|Or .§ì]®ÍZnu ®©˜@Ÿæ@Æ£ðˆ+õ TÇܤåÿÎ+2UOrª@ðº @­ä‘²ÊÿÊý1zØN0–|­Zµ°’M!¿ n/çTWEŸ`3â*z°S‚ VteT¨oµ+¯ÝÁ(£œÙÂè“S¯¹‰ÖÈ-ª„¦>œ,Ó²²)ÖRÀ¤ÜOý(uZÎU'úÈÙZ? Ú×\|5IrwüƒúX¤Îm»ŸœÔÜŠ*È##¡ ~èu@*Z˜Q=îr­pkæMæLð°Èxö,O<{ª'ž=ßーŽåÇÅËàöóAÇýbê«áÝg…‚ØY3C)o°FoýÉ BÞaÆ”*Æ•åÂň³bÞÜ~Œc±ŒÅ 1æzrÐô—ɬqθ‹®-çµ|êhÂƒÈæù]ñªÜtèùEFãqæ[æàÑ.ä|Ûä?sÉŸXÕ£[4¡¹¢€è£þ—»œºƒÉôA4 –2{F}øÝUÄ ÂçôzÚ‡ÍïñŒ7Všßa+‚—ß…ÊÙQÍõððã8fõöÌêuvÍjOxË>ÚnZ=Ó[ÆÏß)œ/º#}©ˆüô±ªy­P6\Fk… ¹¿±V‹sò5aYjBgµQžJ¥xlkB¾Cl} ­'Ì)ës,OêC—êÖ·€™Káö%ßÌñt®ä›;fÏÀò¤>o Æ=˜°Î\faOå8=·igárŽkóXW÷.óÇail…{—:FËÆØ…•X˜>–Ëi­ÿdüØëËÀõ«SÀqêpeë–ù åyžCà“vB ¤Mw~{‚{6äÝŠXîÈøŽ þ`Ê’­B`_Èe>ÐüüÞˆQ<¼£¹é¹¬ï”ñ̤;P '„eÖE”^„΢fÒ°·¾©Àh ýÏ^û?û™³þÛšFï§ã/ 1gÿ_}µ^Kíÿ[[ù¾þû->*þƒSÑÁu¨)àšñÞe·«t¢Þùºê³8J$ÞöÕlÚíÍÄh^ÒÙi;ž] „ǬùÎ#; üÝþ㘭c3^"vÖµœ¥u½ÑYÁÅ€­£íWÇÛû›=9<©ßÎîvÛZ þB§!E‰ècOj¸\œN»§ñ0ž}ªâç˜a^Ï ˜Õ,˜Uó4 æé’ÅËê?v?ñfDœ²¡*âà±…á;)ì5nSß8ÒgI™ÆÙª©¥›9„¶_9”Š!ío[HOsZVËç%Šâf'#æÒ)I¬)ºÃjнÎrË£uG<Œz]:©@çv·zøCh[´wñ£3ƒ£N:.ˆ¶©v“äò"ÐÎP*—FT>Qâe€Ñœ¥Í{}ˆ¦úÖqy厼¿ uóÔæ`í“ìVDlªJ;xíT—ïݱã*5ñf±·Ÿt÷IÉëqª#a4v«4X:ÌOǸþµˆ‡OˆS>«ØD‰ô4ž‹Ýª}±Œ¼ÂÀ‚Lr ¿-æ~жÿ/ 7Ïÿ_Nïÿ\]ù¾ÿó›|çZÖvi·áúÓ¾iȈ…¶ ØÖšjù+X[…B“’¸ÁÐT ¹6]r’ìV³B’˜ØWxŒXìV·h³« CÓÉÌzA÷?j§ä­>kËÛL8??MhŸ‰<ËŠÇMûŸU€|>|¯Ûõ)8W| "Ÿ7&¾ÞÊ#Ëf@î3˜·Ó¦DÑË5²Œ-àžÁÌÏõLsÇC×o‚v7óÙí˜;A¶à·Ž°5°DkIÖ]2úMª ^à-æYº‰ÈƒSþê5¦ò9ͯƒW ,‡Á-*ap›ZÐb50·˜ý-ªaà×Ã@W„Ýs7ý/âúâ®›½;êj%ñ»ýÁ$}`á·ïü—|æÿøÒ¹?üä÷ÿõúêê²ßÿûïýÿ·ø¨ù¿ü¹¿9Á]½#H MÆmŽýrðÓÝä\`€{>9NG0ð =R8N~ZßÛ -µêÄ“_ðÎ’ÍãN›ßa}zñúùywÿ/ž(ÐÏ"t ¡óÙÞÛÛ¦Kí+ÌnD Èw^ï¼€_ÛíÍõÃí¶<«Ý¼§ õPØW퉿@)ñ‚×½±‘tt49! ÿ„±ž6ÓzNëÆÁRÁR¹&ñWÌ ºÂñÎìè¦&9 ¤ž}Ð|®ôƒ¼ptÅüdº’£·ÛG×|3\óí»ŠŽ(Õdzh¸ªe 6 RÛ(DçFÃr£"›4øe’¤jëÒàßV:Þ:apIû9Qœ‘š«D[ɬ=í©,¨˜¶&%õÊB£eŠÁž ò¥7°ã·‹_Ixª?Jh³Ó&èEòÓQ=øèëYy^èP'—d’d•“̧ôÙ’§L9²´m¸^„nÔŠ7ûV÷³ðþ¨38l ¸bwÄï„Fm¥q‹¢ÚëfüALÙÿóÁäò˜»èN„Í#Ñàr¥Ëú„©ê.ÄÛ’³ÑpX0¨)°»c;QÜ:^Ìé\%±ÚGA«^Ø Ø‡B§U^õ)µb*M2¤7å=¦Ú¶Stï£îè ‡ó×ÃqSÆ.¯ˆsÜ'OÏŸ5œWØEŒk«̜¹®mVQ3[žÙoÆñoñÍõY“™-ô ^ÿH`=R´EOŸ !Úd''6 Òøö$øÚU—'•ÖV*Z.—Ý<ÉM†Ð“8Oé¬ô›øÙ”xÍð®Štà,lqÖMlº˜1AVºÍîg]ý>m±Ãmì½\þMкë¸ß\®ÉXĤ¢d Œ¾FL•6dpu‚ŠÚ ‹z=^oØêYóÖ…cº‘OŒ¹åÆs¨"àÍÌšˆÖ|þ¼`„K3»[¹ÈíÛF¡L67 ´ ïÊ´"é«Û¥~ª‹|V,Kz/De`Ñ•¢ƒF[”¡œæPö*ÓË¥Ñé‘?x¥Ó©V$ŒÖÈÆÎ?0AûI‰µ±7µÜ¸‰;Û2q¯Hì¨ÄæžÂÜ `î)ÌæÆ¦$»Ñ¥¶UꦗŠ%5íÆ`IÒ#y'ó-M®¥³ß¢ü+µºñÁö· H¶vúŽN7%å¤wtúv(}Oãïñ÷4þŽ3Iiɵ8UCDrZ³œ}­¦èNCfÅœ¸)5ÓØÄZššÒkŸšgi™†caSz VVøfV¹ÚyµÍ·ç} ÷t7òijOäžžw“s ü÷’ÈËû¾Š—Šª‹¼&£T 9|ÓZbª¬ˆ´"Xü2žöÍe„iP¸,šÖ\‘Ã4¼Ž7\>Zå1zoç°«ï¾>M'ëê`t7‹s‹XüDXâàÔ‡T™EXõ|jD£S¥Íf‰Ê7¢ªç¢¨±0š7¬¿}ÞŠñˆši4Þ¡bé-qètWp Š£õ ôˆuS^Xx¶ÿ4ü\P*¤xé!ùÄ?qpy'(æCuÙ€’’ç˜G@•Ç ½(…ѼçBqÌ;Œ²\±á88x ÈaZ™0Pr¯_(÷Hf?K–4•“r†Ü8ô”Á2#\†âO,ÆÓFc³ ŽÎß3À©õ © &UŒN 0‡ÊÚÙ›T˜¦ê% ;MUŠ)Kß*?§|PD¡†Ï:ݾÎ=¯5Òý! ±Õ”¦½FCèì#€ßVsYxt³È½KåæµÊ¶»’Ê““—É í+V™‚mÀ¦ïßRÀÒwe]xu/z Í…ß'ší[¯~øbêVò[S3ÝÞtlST1_K£aÕª­]ak—B?‚&º5u8Èœ~M¯F¯ÜMŒ\µ)—WìbFg‰§mZL“AìñÖ“åDÙv®Ò1Ó¡úÖ.ú^Îê^L(Ç :ÎÚ–ÌoY5E3}*-¹t6sh'˜ç[ñe£a£˜Dk2–­´;i$ë¦÷M+T”³‰ÄKwr¥P9¹¨Pؘ­Ö¡î¸‘êY[žÕêWUª}Ë…ì\Ì`À™ç•Ö˜¶¥:aÙË€{ ÚìØmãzÐÅ]>¸ÅGAð€úcNÔ8ÇûëG½v¡UñÚXÃ2"×l R¶ÖÔØ _´×·’­‡º›ž­‡÷ÉDÆ>ˆ:Ói<ð…4ý”½†êvuQD·#uûÉœößÂö/rô˜s­‰ÅæA——Ûô[ÙMß*ccœ¢7¶@¯êpäŒA¨]?p[ôƒÌÆ,rM›Î¤9|©[·i¿¼O𝴮zÐ$·LrËO¶&“øÍ¢2÷äÊ3CTXFdr_,,›Åfñ ‡7u­ãk@Ò“\tóùJ·ÑÀts<ö& ÙD@UOd@9¯Æì–iªÆ™Öˆyúbá¾ÇoPÒGÑdH—‚ ¶Ó»peÞÔשN·pi{ÙÖÐ"6ó77nÄЖ~ç åh1õÄ4g"k/T8+·º‡F4Š>‚P*—Ëéë>+â·&1i&¿§¤ úŒÿuOÍÙÿ§/zøùûÿ–ë««+éýËß÷ÿ}‹O‰vûéиù#Þz9ã©Ý^w8ü䆅~¹µ·ƒÑ0>,W—ÊHBë…ÁÃ9:ëGIoóö7¢È;ØX¯ªýá"‡>À;JÅöÖn'6š·.x§”x;SsÏ(9{óäC\äi{iHïO6ÖÛ»mw¿žÚÑ; =òöv s"¬ïwÜt0˜Û†€±()iXTüf… Œ;öEð6Œ¤€üˆéz£\ÔU—ZHgÜ ïXÄ™ŸÖœt5Þ@sø§+xCy£Cð®x/xƒ%¢(ÇãÑgG29=­Äã±xwž?…Ô˜ó#Ô,)¼S,9AͦB¯µ8ršFJ³qÄ8¸®#Ÿ¶_©Wõ°­Úòi_½ÚчÍÀåÓÒd[šnKniz-M°åS¤Û4%¹½­ ™×­_ÔÃÆ±~¥ŸöôÉ~|¥¬w'Ç/žÈ“ÌÚɬÝùE=쩇WúÁ#1påm)V;ê¡­¼‚óx·ƒõÐV.¢ší˜ë[*÷•Ÿ6_êò…çmózϼUÕÇÖëcõ¾}¼±§ŸTöW ;zÖï-è þ‰ÿÄ‚bÁ?1ðëû[RÍv•šîÊbØ~õšŽÀXò㛩ÖÛo:Š<î½0æí+óö•yû‹yû‹| ¦uÃ<*bøhÞ¾2o_™·¿˜·ŠØËö_6Ì£"†æí+óö•yû‹y«ˆi ÚGëêA¾ùuýP?èòyy¬¹ïÉ">†ÇŽBÑ-€Jh,­õå൶ü£m~ƒçŽd½ß³ÞsÓ×\'ItÙŸàJiÏw_KañéX?¾2OòåÑöË=ód^¾2On•MæµÝf^›FóÚ(¼yTo± Í#¿5ørÔ~Òe÷º£JUUÒcûµõÃzn[›æ¹c=š×¶õh^·;Ö£òÊzÜtÅölžû’Àð´m÷eÆ['­ÃMÙÖ^v¬`0:–yéXF¥c•Îñ¾ ß>¶1œ_Ûö¯ã}õ ª©­Ÿ:Z#ÚúÉh|[?CÖÖOžvt¿e+ËÖñ–­ä-[Ë[¶š·z>(_»}¼eòeå±c'è‚ÁŒêþaòm'h ,À?L©Ø  I'ðSfv‚Ä0m+œ\&ÑôdÒöÆ}]˜‡Ê­8ÞÙ|ñY©ëà{*]ÛÙÞÇ)xi2_ÊÎ÷hëx÷Õ±,Þ_ŽÌ/b×í÷§Q’€£xrAÜ|ÿJY|Zn.wÌÆ|>^†_-G´ny›ZÏý3(›}HGÆf@jí£ÛãÕËÆ&½K¢¯cÚ¿uxmÃg­ÙâºMèkJ;’o[ÂR~>pCCµ8‚:àeF)‘ƒ>Pøƒ¢øjIñQ¡úºéi7Mczj´.}fß%ù:Eóõ¥îËPìñQá;“³—5Qí¶Ý…°¥<¸ðc´JU­2fì^árMšÒ KìVªºº¾‘ïDüušúëâäu)dóñêr +ó‹3@‹Þ¦3Æmâ‚]wÃïËÉx¶ UiòøQoðÀ—õÏŽéŸtÕu¼PuÉ»2»¸Fƒ› 4Ïd‡Qßz'ÉâZÏ-QhÝQ~kø~M…ÑM~Çж@QJqã4žéÕ_óÁà)w„L¢OšF!@Œ"txdN¡¾â¸f7x0háw Ä‘™´n?Â¬Æ «¸+¢Û°ƒuõ³DæyEš˜’[pMgØïŠÆíŒIä-™Hjç÷I'`_æO-d9tuò*qà!¶lÌÚrpi9Î$bŸ®“’©Ò>R §N†I˜R°c•—ÆS^‰ú-c*½åèÑ—VÅø†x­@äÀE§“½P‰öº‡±ì¹UŽ_¤durZÒ–'ê kËvàKÛrÄåYx•ª-eSÍÂ[9•fK+Ϩ[Úı}U2N§[‰ÙWIÔÅób÷_÷’‚9çÿÈ–|ÝóµZmÍ¿ÿoú~þï[|þGžÿ£S|æü_<ê ¡r„>ô‡= ýØÆ“|þX%çã;‡.ŒŠpq÷q% ZD<:³Z·EØÜ¼%ÂËí—·eÑ9Ú»-J¨€æbíþÆ¿ÿe#>´’ß³JñžmnÞ!(õû jã¾Hq-ݵ)…¹^ï÷§é6¡a–kÙ‰ƒ¼Än¿ï7$9i&eH>Z8~[*‚ã7§"8©UˆQªQÂÊ2QL9 ÷¿¼TÞlñß“‰‰[ý¹! gQüM”vG³êlÜ&MÓÌëêõ§¬¤Ðn˜kK<†Ý ÍopG~–ÉqùQT–Å^o~aéÚÈˈ)·‹;•[FFlC•ɱ7›ïÆ4ƒ«gÓBe(aŠh•ÏÆh.^­Râµ°e[¹€`y § šéWê—$ÚMÔ¯Ž%VZ (Gư g!c}Ä_t—Èõ¨{5uIWÄ(îýÆï¤qZ¤±»uÕÒ'¶L’¤¬›’±G*ÙµKBJ4ˆ§Éì†S_]³Ñ]<¡ðC–¸[ÛíM ?ÿ±¹„‘çÏÎ1j7]]Ô´ (8_Ñýº;¼Œ’æÛÂyº³T~WòN$ƒ@JŸ›¬'æ…*Ö¦«@)²½ñåúàæ4ˆ%¤O_úêÅäüS‚4pMè%yw:í~ZÒ¡‡±P9´2Ëa¹. bm9]ªÊŸ:òÊÑ D+« Zß¶ °!e”ÄÚJNIÞ¼¢°Êç¾¼ Á°Úó7)²w)Dü²B` ÁR°MÕ·)†9Ë- FH™†w)qóJ@ ‚k€¿f9ÐÎQi¹· <Ðʾ-¥Œ ÙÐrE”<« ­J9%¢ ¸¹™E‚Zƒj^Z†šIÍ%`S¦"Ëï$ ‡›$Tö/+¼ͪð[¹t'šÃ­¾jÀË ?ï¦ÿ|dÿŸLºÓÞO_‰vòWW³úüèþµïkõµÇk«_Içó¼ÿwêÚý**pûú_^†Wßëÿ|üú§‡6ns»—ÐÏô™ãÿ¯¬ÖW-ÿÒkqKÈwÿÿ|ÀŸ T9xú8,À]G»;/:àÓ”EêMlàBæ^÷4©ˆ½ËˆèD½óŒÎâ(‘xm¤è^’StÏÄGôRh%1ܨòUÞí¡Ž·]¹J|yCG›«è”ñÑæ‹“öáîÞÞ‰§éq¾ì€¦Ã?+²ÓÈ"›r(‡4YWtÍ€`)èÝÞ¸'ôÕôæHðÝ|AE§ ìKhqœ†<°uêKt aÿHS’Ôª«SþÞŠeDD,sA•̨¤›)bX½Óû­9ç˜lÞÉB •7|Æj–÷±è¼¶nŸW¼å%/³ƒ{ÉmëÞr»À Àšekm%Lë}%8N¢ŒRÉÔðpÝW$‹/ÒÙܾšÜ-·ºÿÂÜ::/œå,ìȩի.Âii–b÷øbÑ-Ô©W’F¨e€Z.ʼnß,þ[ãúÿJ[îi5`Îþïåµ¥eÏÿ_[y¼òÝÿÿÇÙÖÎ.6é†ígC?Šàc»ÕA¿ºhDŸMºŽe£*×VÍ•Íj)¹åMËïY»iR™ÎèÖ'}G!Â]tg½sÚWå\=¥;v ØÄ Os®ÓϧN-ȃR,º Ý«ºÃwiûX2IâÆÊRÞˆye”¦µ½^ _i¹šTCDð>Éæ‘0ðM×Á,¾`âÉ¡‹º†5Y]z¶C[Jß,oìV¦•¸Ò¯ y¾„_7!DÄ&d±Òo»¹|ßÞ˜.R0øò}R€@ß!ã‘heˆÐ**C+Kˆ–-E® |íc—eP÷Ðó»f×ç¯óþb·Õ¶6’|36ðÞßIeÚú•ne4žTdt?¾—TP­ áOš¶)1š„ÓÔxMy8™©¿:ê–ü{š‘§{õã¾5$ôWs%¼>RËžÕGÊmç÷¨¤ÒÊݶc±P‹v+!”í΋Ýk œû`óz‡[ö wî9¸³U·ËžŒg†ÉL›z‹ÅW´å·çÞly ˆó-yaë¯×ŸM¢o‰S¦øm†¤®†·î…¶-‰eÙ.Z×#ÛØ´˜o‰ÓøÁãK2ñ%Î"ÓþÞÒÓå³h{Ù+ FŠ-°A ¢¬ŒpzfèÛXáÌ!Fp„Ñ:Ojd•2É7Ú³¶|Lª#p­2­;uF¨!&âwÝAݲw1‘¸ÆµT MNt xÞ¥K¤F#f,‘kð[Ò¢B}ŸÚYÖ¯QÐ~ª¬[ ®%Íkw0· ÕÊé™Ï€C\Ô½OjÚÎÝœá[ÚÏyeîõö– d8‘};‘ãlêñ|Nš5Ö¦ŽåÛº”kÝ£)—k»¶i{¾û繑­ÙúrGò–Ð7ó-!›1²‚6bù”û1`w7__Åxpµ¾Žã°Z·’å­ÖŒ–çy ¡~žÿ•r¿îf”æú_÷f»”ÕÊò½òÍX/0]ÿüÕ¢ŒõŸ³õápÜ»§ 9û¿–§ö­­®<þ¾þó->jÿ—]åâÑ£GücÔEgÑTÇO›ÑɵPßEŒîl< î«=}º&Ö;ÿÑÑ›ÆÆSŽ£¤ÊtH÷±ᑈî4]rÍb<Ã6™ ñ8%ÝõðG…]p§@žÂáªVUv”©œ–ìe¬Gë:ÞDÃÖÆ]jr‹PøT¢`[«V‡Œ·rx„‘É:»Û •Æ-À€¾ó—£õÃ6¬¯'®`'Û/w;í#‹í°Ùª* eÑÀ½jIdçrA:T4P G]a•ÉQLn·;Z?9no®­¿l+&¾¸¸×ªn” Á¡ÜÂ*½_Ú`6u<”ô6?w£^"èàÆ0þðÐFwÔ~J0ÖÈÇa­†br9ŒÑ·“š'ã0:WŒì) Ò7S¿­¼Av?žá!¡fKö–xf¯csW¦rìƒ=¬ÊÇÍêΡ2µ)hàfõ,š¡:ú*² ‚\NúÝY¤¡Êj—…UÑS5nÂÒÙ´«i}JáeQ?ð33:œŽ'X‡^hîöE<ÃöÛÄ>*·ç*ʦUÌ 3§„¼È¸f¹®S.ºWæ½iÌàP]჆]^à)l^R)Z¯,¦™•êYÎU9må&c0°Ù‡NÏ7T¹Ö\•kR¹ÖaÙÖ8eþ…uÎ.蚢›WH­[[)ªuâÖjך£v-¥v·õ(ÿwh… w8ÿ±¶¼òýüÇ·ø¤ëŸ_nÞãQð|ÿuyeuÅóÿW×Ö¾ûÿßâó-ã²’Ñß[Æÿtø—›ÒΗ¼nÎ9>øêD³ÚëL£hû]ÅÇ'¶O¶_¯ïIÿ³£ö¶U;óiµgÓ¨ë{ëð´½þÒÀÞ÷#U­ƒ¨­mD…úÈÀ,gŒ ·ìÝjž¹&o×¹&Ï€P±T½Û÷p÷ûw櫇îË_àå/ãi¼4ÁÓ·%}d(§ñú÷qw$ã Ý (w¾Ü4a yº÷·HÖÎ » Cè=ãÑ ¾ÿñâæF<{&ž?ÿýü¹*n¾¥߃ Õgϼ÷ŒïSðÿ-Ò”nn(a<=õ@L€AŽ“ÏÆ)Õîh¦Ò¨@÷ONÇc Õ2$çdéã(Ä/ÕP¦öŒ›„¢gÀZ Ù`LµŽœSÜ^ @é$y;‡Ä,ñx•ÎÁ@ ËAð« Ô€B0m°úã3!Z”Æë¡*ŠžÂRš©qze;?à]ÒŽíXR $XËèZì×,²¢ì› |wªn `-¡ºRDŠñˆ7@ñ'QûÙjµÒý-Å•Ó2­K¸¢i?]@Y‚‡JД®‘ÀGãYÔ {º×žEØT(”ë„£ `”+E%ž% e䬮¬œ¨÷…2„ÜŸT]a>¦2‰Œûãý1Ámñ%G¨A7æ}ùÓn :ÛŸ‹ÚŽ/Ú àÓZ÷³ÇÞMZôààô19˜ÏŽåNQ¿®áMþU0Ã\LlRa}ö Å#¨/¼K´d•¿üYÙ’¶MÚ>±M£†âýé»õ(=¥&…ædéãÕ?ñ´¶v{œúÊíq@d Ç"mTêP?»™J¨¯d$ÔÖ2ž­Rt;—!;ÉþÙ1Ƭ@i4RÞ¿¼ñGq~ˆP[wGýë1ÛGwø pe Ò» ªÐ¤wb«‚•Þ ÙŠ^z |Ówà‰›ŸloP¬XÐæ§ØŸQ³£NMêÕM á…BX/†p¬9Ô "hõb |©ø¿Q ^Ó_Àë*á;OJ¸Ã^gx5… 3¼VAÁ¯„×YÞ.ˆ óü8/ÏSH-]g¹µ`aX(¡‚ ¡¼2(¹ªaËÕ>Ò8¹úgá¼™‡d À*2#[n­Ø(V„Ê9ˆcËÒ/-ß,Cû«· µ@asS£ÆÙ/¤ö†Å¦ÒÁQ!Û`Á[,Š¢ìjŽ6‚ŤÎ“‘\å·,&qö —\ýr0,6ÅÖ·ŠY`ÁbR §cqÉ71Šá³\©óº˜™ñ,^ÅÐÚ¦kÌ56‚UpÅp:—| è X™)Žd\1 e$‹W14¼»â`XEW ©m±Éõ ‹M1¤ã­]]n¹ý³ƒa±)†Ô¶Ø´ cXlŠ!A ho#×¥tØh”úVáÐ8!ã—ǃ±ÙÓ•Y_­àømÉs4ä‘\›¹nzð|È=S,’}-›ý6èúO€šç¡P‘Õ¸w½™ï¤¸X}õäXï5ÖfQ¬¤sëZÍw×,¬¾•ïZXïm¬|ԕДF®~{Xº4¶r=/_¦¾rý Ë”|®iðJÃðÊwF],S¹ÖÎÆzyðZó*\ÉûÛ;©p ®o´“BÆÈ¯oÍ”ÑïÅ<¹hü 9Ðø;8¿÷$yŸ+É{O’hàüÞ“$ºýꨣK²^¸(M+H=·×õÑ´×CzåÙ·:gikK˸R@±4–q¥€õÐXZ•Öƒ±ÀÝ1Ðbe$,`4–‘°@‹f,辄êYc T³Æ2°Œ•ØÌÖ ‹Ø·¹­°‹Œ~†)\ßÄÃ2åq^¦…L•Ëf§P¥;8ÅŒ•˦µrPŠÙ+¥˜ÁrÛ.d³Üü³Z^9o2\n}n2]žÞl2^ÒA!ë5HèÒÆÝj»˜ž)ð­bú¢À_åé ®®Ž'#qasœm ¥‡ÿ6Ä}|+ŸTkµôî=³íDHBçq·?”h}÷c™¶D¡.,XÔž¤6×–˜š&÷ÿÔ–[- ìmWàÓŠæv þÈPkIÝ:™¶ïÆ £ƒ/_noá.™ç¼>{éžw¨Sƒ[—Ê>ÊcP^ a¼Øe *˹úYn¤@ÝšNÅõxR«ˆi¿u»Œ§1ñWR÷«˜v“'xEi n¾HjvÉ1@ݨ[E¯¶¼”JÀ÷ËÑÌnYü ÞLûêÅS~¢¨7Ë$QH„´Ëår0Kq0KI|qQ[¾U®î]èR‰¥ºYkrÂkZñYZ*gfèJæˆsSqEô휄TÙÑcYÍME¥©Ê¥9¥ÊnÂ?,°¦‰%O¤ÊÒÌÀÄвd›lšñgM¢lr0“U}«&úV=¨2ðå@)ð(¶°EwÊnp[έûáL«í×Ã\žCÅ“€‡WYch˜í°S^F¿Nr¹&Š+C'ùl“l·Êì ÛÁ]r;¸]v¡ü¦ÉoÍΡ] ݯ‡m¥­Êö^[¹kñn§¥AË“²3Œ«û7cEj|H"hEöÅ5 ªxr9Š/&Ìy”Ì™’I¶ÜòU@r/Å’¥ »ŸÄ5Ê` àÑ*! ŸQb‰íŒÂi”ÊÚ®ðjÙu7·þ»JZ†îf¨{«¿[¤úqujÊõo:˜«œn³H¯x—îäJþܤŸÈ‡ôàÉ’R„pBˆèf¶ŠÜ‡P% ©uµläsz<-TqÛEЉ߬¦vAû‰Y‹ç8³«µÇUè¬ç¸Ÿ’x‰ ò ýg[*—¼Èt;…×c+Ëí¬_óê³KGöÛªŠ}|¨ ÓSgSqZݨÒ¡î0½VUÖùf¨AQ×Ió=ŸÆVӸףöÊ‹ÃVK[:ßÐõÕâT'ó¨ì4Ø<»Jí·X­O½†ÁìCVù‰j‹¡.ìtpŸ9|¥,Ôòò€¾Ä5"//¹Öƒß95Ée£™\L†E”áI–2ü;/L`ä«È8û¤ñg LááP¯w÷!Q¯§Òá©×K¬o6bKÜ“¿7¬T¨F±$£(,‰äãÉlÚÜgi|õÌÂÈ‹¥–Êø85ðÊ*gìEŠp‡ñ—Q-oÁñ† ÄL¥äÓà1ç6oP6#Û93™ Uè̳3«ÆLéÈFÖoÎLK[7‚ÉŸõÁ¼ÕHв.ŽR ¡­­“â1úˆŒæ‡¥ã0ONj jE ‡è™9O;•]e¯L ·nÛPI³¦¼×|×UíHY~íï´òüoH+óÒÕÎnÖøª?¾<Fÿ -¸RX^&Áz 0Ùs´|þì‚ß_âàõM "Õ-¤zQ¤e i9\šãIšÉ´ÆM%Øk‹DfÍ.ÍTâÕF=Pu›@¸GõÛìÔë>¼6\O5â`æ{ä‚$dE|†V°—dI$ ¿sü†VΘÒ“±ÄäìIŽ‹w1þÀƒvz=PŠ© ä,éÜڹøù²ê¥ëêM]¾ÁK¯'¯y#ÊÞ’Ó·‡Ç½ÆÎ¢ôñ<éi³öÏÉO ×´o'»ù‘ÙQ¹¨ÛYÁ˜Š·óOLý65Ù&ÓFŸÄrOÉÁàB\j7Çp€M)Hê¾cª"ÍÈ£ë“ò8q‘å98È ]œÓìé„Ì¡ŸjfY^ˆ®r!6eFN¥ïÀ>ÊÍö³‚ÞçNû^#’ƒ¢ò¦z÷(ðRQª„1Êåivÿ™ün¦`q1ù½ð\Ü©ƒµ´ÚË49Úw­§ª¨ûËvfu~ƒ|®n¤*g=y‘Pˆ;ÌßÓRbjd˜êñ¦–=^÷û¼ÇOrzsÌoœÎ/ž¥ûÌòçˆûk¢¥l2XÏÏ ¸VÕ˜mu˜aÓÞQD3|ÙëêJ•¬Ë9òÇÀB÷ ªVB¨f9r)Ð1o ÜÌó>]«>Κæ¥hq2áïz¿BÉ _‚?ÊâxòĨPàj?CÝfô8›»¾«cµEgÞÍ“µU=d^®eÀ,kRçà1¾‡·|,X ©¤/›ZÔ­Ärm/kEîÆ%£n1HÓQ‹uY+l!L\)¦!4¸D­l‘·”éx/tëcHÁ]2kª¤pÑÈ»r ‘Qyð""-æ©>8Œ¨®òÑmÑÕÚWÖŠ•Ï\ÞíãÐPK.³¯oñ1´¥]‰<ìA{PûÈ7U’DÊÐ j^÷à¤Æ£¡ÐÝ$˜7E 5È 5¸© YºP£’—E›ÁKrŃˆQÕóœ}ÓX(g(oZ骑r8ƒù|åBŽ2ÞÐ5:¡‚Kó—û¯6ŽÃQì Oafc†±ù>@T%ºí/i^QPÓ—·ÎŸ¼\@š/ŠÀÏw†È›Kˆeúú÷’Z qôøÖÜÍ’©,9¼íÕœ/ª]yÏž™^F>rÒ'Š){rŠØÌûº)/®0íÊÓv½1-e£;ôÜeSÈ ÌuÒÝxž-§ñ²0ðL[âeaà¹6ÂsdJÁÏ‘(Ÿ)¹Qrî98œa&äµ 4³7­k;G~Lˆ.|3HŽÅT×%iJsC3iãɠɀ‰$Îaýöº(/+³z>^½žßS˜»Ë ²Y¹.€OW™-udÁñÕ•²•ðb…»l’’«s=Œºƒ³…ûjÄqÃùfšeg¸%¯©©­âíMµ·õÉŠùàøhsûšÄ)e€ìîÿ%à|$'ݺ`“…ÕÐÎU›V9Ç·åpÖ¥Œ[8SpqZ*MA]¢ð0ªh<^œ$NÊ"œY †W™8`) ûîx/I¶ƒA˜hW9Šèõit6‡—«‰Áè*N}ãGÀkª‡4²jzüP£¾â„‘ûÒÐÁà‡†KM÷/Dg6ý4ª7¾¸È\BWñlÆ`¿åuulÀ<(7ˆ`ÓýéCSCE5üç_Ôò•>ñŸ×“‹û ÿyemõqÍ¿ÿ¥¶Rûÿù[|þÆ6þ­Ðmнœjýês—ÈÑø1¡¡ÛÕÃìÀÐvhäóËÁr$9´_·Z{Ûóyì +lóY‘¬‹åD¹6gtÖÖªõ¹gtœ²~ÇÄp7[ÔmãV‹ŒÀÕ"¹ºÃoSq©±¦Üw‡B‚RgF¾Æã ¨:¨]kØ=K—¤XLj£±&6µ"aŧŒ§ÐÚìè·:^5->0TSüè1Jµ›\\ÎLèm!Œ¯ô#m­íDW³Ýƒêør6¹œ•˜F%Ñ5I—PD©Þ9f2‹¶Sg0’V8eÅÞŸb´ß%DZCWG¥P]–dñ¿f‹?«„ÒèQÍÌ^+qIÚ’ù#²-ÿÌÜ1ÞîÏZLøE¡¯V¹tH†2¸d!‚ÓüG…ÌûÐËrß¹E³­(.þ×hÑ}”nIy‰b±²è¥)žÎ¤m<Â~ÃI¯Ûé ”½zw4«ÎÆ2"ü(МÐ3Ä-öÏ–8C‹ÿ&ã'—§ =•’J­Â«TjY-—Š!åög‡°컫ָJ‡ÕÍa ™«‚BJŸ3©£«IGJ_êà±¹í=ÄJW¹¼ E!I¾9ÄHái’&T8Ô¡ÂuyöÒ8tXCa@}Ä´`(âRf±XU”Ê?K](/:à–o<¿¬<à¿‘æ9òiZó0|%xiJ¤•,diñ§‡bQü’þOZ„$l+7ãBÓžI°d™$SŽ]Óõ£çDíÖEuÛá–!MU"Þ¢r_D–仸¦¯Øî?·i/z¡ÕHÎÇU"54šÚŽÎ‚£1n$ò’T-¼ÖÚãW8ŧf ˆ*‹ˆ\´ù-×#Áøu¨2„‹H»£ÁXÐMH-êWŽgñ°Š¢Ãû<Ç€>$r%Õ!¥š]?4Õy´¯tf§2«Z¦i ÑòUR¥Y<Fù«lV¸@ ÌçϺ^ ðo;|lGv3—DÒ•mî­2äue«DSÛêMvuNËZWb9ÙZÄÄôJ¨6NçfbcbÛäˆæ32Äi”WlT|6ÈùYÍ_$ª{qØONõŒ½ñBAœg@+—Y4ŽË,2=#õL¾ÊHW茯ðÀ•ò JçÊœfƒW~íÅdææÃª çY2=+ùL¿ÊØ’^NÂÍŠ|çäÅž e2pX¥bec©e‚¼R ï3Adèhd”L³€Þ¨+æüvó6ÔS*.6“'V* 6–d6Œ’ 褄 •ø Tä~HìEHp8¦C`#H¯— ´¯`FÙ †Ð(‹Çi^O³’%ñ4›Â¾„ÈDG©F,*2,õâU–$: 5‚dRÙWdF™tö ¡Q6%ôy±ÛϪ§-]OýÌzR±£g™tL¬hÊ£ÄAŽ lö!Ì¢7ûEQFg^L<ƒœŽùŒ ™r)2³L:&¨3åQR9°ÌZ›%`E¬yñòâr˜ "i!PfY)JI&%€™€2e’±/ûqFMŒeÊ”IQJ2)™0Ê”EIN^¹¯²)½Ñ„2€thd’ûʵ• åšJùÎíh½¨É‹ÉÐ-q?Xòb2ÍX—Ý y\e2y£¸d‚¬+®—i†ñzd~çöZXÉ‹ƒx6N–¡àÈÖÏ{¯ÁÞg‚©ðÇ‹Ø{Å™`} ÖÏ{¯ÁÞç%: I^…$/ }]ný¼rëkjý z5& Æ¿¸R…N͇ó:Ȫ&ç>´î–e•!ÿìþ½eèö*y9 ‡çéôvÆ€Ýâ­KoÿŽÎ6 XñŸ[á8a¿öŸ(g~Ø‚[”unËgÞ|5sq—BÉÅQ"“ûP¿åñC€Ý9P¢`Ä|×™çó9 µ¥À âüÅâî†OsÂŒßSa†"S„Kñoï~Gq™ m‘)øð+Kžk6s‡ŸDÚ±i´ÿÒä–iþ*Zº…Cw„ËO`ÞÅÚýë@*vH8£Á<ªHÕ…¬c;Pòßòq0¦øÃµûrÀ$ÜU“½^щ€’3Qñxm¥ÐD—¡Q;R´§Ì­baAS¹Ü²t’K›UVˆ©3»äPO|h'¼AÓ~ËN¿E¶ø´èWŒ1-«ZÂÃ&ܾ «­ „Fw³–Ž/§½hÑ¢PhH<úÍ Ph&}rn&$7Œí`Ý·÷Jðio áN™‡ƒ'rµ¥¶â.Ÿˆú´ŽYR¡(,ÊXÖör;a¶‰}@&òþÈäNzãI ƒE}bÚaœ²àÔ=k°²ä€`! J^·.FxsF{ó‚üìI@çÈýÑŸ) «O¹qÄÀÈo×àcÂÐ=™ÄÃa„!}wXŸ×Æ¢&ÔÏ;£ŽäÄß‚>Ü¢d2ŸˆÌ’CÑ—û7‚h4îCôTæÈNÁ‚D¬6ªÑÁó Ð̓ÿ^ÿÖt¢gCއSÍ÷“YEÌ.&¾úU/É@M0:¥ïk€nΰ‡ME¤ ÿ>g‰›–¡õe2 &·•"VpQµ®¯PðKC šçÜ`‚æ1;š üþòX‚æñc0A'þ_ïÎ3&?Ý3Œò÷xu5#þ}tü¿Õ¼¯­Ôk+«÷,Gðó<þ_°þé×#ùëËã@æÇ\~ü¸¾ìÅ|¼üxù{üÇoñ2UÛ ‚‚Bbwv´»ó¢#J½²¨/-ÕÄ:ô{´€µwÙÃXS¨w>Çgà"þ8ò|X&ƒ&Å=\S™ž]Rr”0ЬÝR<²Øþ58í^DeÒaK%ÀgHø"•>ªàÛ’ÉŸÖVÞ‰’¨ª Pm ´âècÙÖîõ‘ µ<š’¦/À´a3™ ![@|€5©Ú‹Œéâø/P{çã@£w.Ëå à4ŠH[¢é‡¨¯U’‹gò/##ÕŸ¨úU «jÿÉœ‰QÊ–R|U®¤ÓŠèºz ¬»3¢—\P á Œ[÷q<íÓ{P€‹ñŒ+_>Â=¶€ÇLJâ+S…êË_KVËL‰"ÆÌs“K¬2ƒVP­V¯V…´Z£Þz‹Df>¡¶¤[D`ëºÝ»VÌ&Ú’O“ˆlFƽèB­Ã¿·ØV£*ü‘’Ž“$Æ¢Åj€Œ?ytúiY´Þ_v¡½Ï>aq²àr‚Èq¿ÿ(ú™Ì@þâ©)˜‡V!ŸFŸpGËš,«0e÷tÝ’‚´rÜ"e‰¡ç0€¬¢RŸTóAþdc±ÈL¦10- Ñ®4±;™D]0>ª=­¿«pÚc‹’N]{G1ãÙ¢°•³sÚM”!LP‚.ul5”úÚM A@>¢á€ú°! 8Tèd+ÿ2³\†\Rí'(˜Ý~ÀÞr|ˆ»JZ[¯ à"œ¹Ê‹6•9iÛ@õYðiÔí²2À5m‘ví›j\™º«¾L¼¼ƒ’-"ty+×màÊŠIc݅¨R“ƒ¼LáÍÔ3qsÊ6ô T/t5úÅ㺮ï²Púd;Édáâ[1¥;:š2'ñ€+x[êT“ÙEEtªÓèj‚ßùÝëÑ¡5¢KCâí«Y5‰®f ˜†xôÀðM¹!6Op_HÛ‰€ì5îø/?áºgM„—² Ęf ¼ÄÝ7*U‰µ@E Ç|³ —ÕbEP c"Ñïˆä]8ÚƒÜxÐÁ¸i¢tBK–T+Hñ¹I¡ê6žá=ðJ9+fØ ¾{I¢³O>òCÙ¨9N7ºh¯òÛw$èò#®K}ŒÈoêG‘øHš` #r4Ø%e°¡`WýÐõïÌ` 2ˆÎï%ÊLÎÛøãÈjU(Ѓ’ÛRñŸ±=¶˜3ÑhˆÙP›FmK$•]K8QnIJ@ˆ3ZβõË÷Ú²út{à8õq€g2 œ“‡i9‹Ï?SI˜º†¡GŒfÍ ÅrýLÄ¢bÄü)˜ /õs²ø³AE}@’Ðq“K •D§Y⎠³Þñå-ÿ -Šä:ÔÉø#Úb _/sáá{®»þ°þ$°>0,?Š„»ÈfX­Ps€†-FwYŒ¿TÁaCÙ™šŒÖöÝÖtaZ2aEœÛRœ0þMñN¯Ò…iVf.ÒÊèa}„|i{á뢭gš€. 4KÊÅJKc»¶PzÑî¬uÄþö/bó`k[à;êÛ°) ùãq5šÔ$5Þ_®ã„Tb÷­£.8ÂÝ!ÈÕÆk¼—ë’ê¶î¨qNN @~¢.>ÂqßÏ€½<3:‹qôLvG Qo&G¦ l³ÆiÀ--ˆ¦‚¸]0¿Q”rº§P8¥#”ÄÚ©qN”xR•š8óÇ>4 ï’›}Fß»Uyýõªã‰l¥ÈÊÙ¹ŸÔ¬žòYófxêšËà6lÈS€Ö÷ˆç«æqiÏ~s²âО'¶W¶¶ðšî ‹pŽ ÙtiÁZ¢«Å®`3Æþ·¨àlWç“t;Ÿ’ÏÆ V­À¾á@âŽÆ3š_$ó ý)š-"°ôMK8AÌãèG4tÖÓR¶Â3@Ò"ûÚÃ¥G? SËù!†çø±4!{@ :ëž²ÃHžÎ`„c„ç0ô(MÿT[+‡H·$í·ïT³ÝÞß 4ZuMÄh“n#…ÖxU°ÉÎÆÊ—Æ9†Šìp"ð[&G·"š—Œú2<È_®T°*¡ËÅ»Á²' bÉ`¸XNc „æaõ‹‹PÑ‹=d²H§²KÜ=ȃR'“/G¿Ð 襦ÚÅ-.V¸aÈëYÌý$à"¼+³4`JNÈÀ6­Ñå€EKy¤Ê3”¾Ù‰úÍˉ Ñ>x¹ fçwâäüÐþÁþöË0‚²ä k°F:=Còö:“62$8EöœŒ¿…¼õvÆyXž/?lj‡Ïþ¹¨kâ2S5ìµGÖ`’%Rª€#UÙÙÈÂ?³²N}ùÅêeÅšEõEó>vxa$¡™_ .‰„\cTÎô lW¯7íÎzç Ë#ÃHŽx€‡6g%¥C;ÆYß)]t1°§ãmP¾4ËGVÏžá­. O¼>Ò3‚ÐŒ&Ðy2~eÈóÿ!™”Á“#dœ9Ÿ@?Z%‹CcM’å„fKK¸Q¦ ƒóCè3T$xEô&½²jÎÇ1ÍŠó*ŸÀ 4´«$D­*È{´dV7‹Ÿ-P!x> IK»‹¸dr9ã m*S.Š;2€\žÒ„oõ«`]ŠAë‘c,f°ê£GªÓ¡ÌÏ)Ž.'š.ÕÓœˆE‹,j®—z ôIXʲf/[8zpÔxû0€^°) \‡c AûãèÎjp‘—ɤŠ/cÆ `Šä÷Ù Ú4f{²@ΰ4Åæ,ØùóÏ9KËui–ï0—$ždR(0ø~.Å&JµµLR®5 d4`ЈæÚŠC“Gô'g¹Õ‹Ð!u>뢲ý”ôº´cŽÕtÑ!4¯Ç fö/üˆ Ü–û¼ø‚ÃBЈ—"»bÆ_½É§ÅªD©‘-aâ4P3ÞUb/¼ÊFD¨dzVËxÔ›šq±Õuû'Dÿ ®’Vã, †Œâé<©ÒQÑpå ßýô@gPS‘l£Exº?y(Û„¦MŠíö‘±a™¶`ð‰’xÖòê6jZð¡}±’t˜}é9 u%éŸ8A‰ô'®@ÃfXÙ#úei§rëפ٠Ðo2VŸŠ†{ÉÍ+ÐHÏX 6 Æ¨¡¢c…?¡Ù°¬¢uõ]к~M½:ÔÚ ZsÚEñ°L`Xã+JõS¥éδ¥ëo¸s{^‹ÒfšÇ4ëÁF£Í½ÀÎû©ÅÍ´ôpØ:]Ú ÷¡¥ ìž+Ž¿†ÎQFç5a*¹”Q×þ;Q4¤B<³.>tSLU “Cýßq´>tû”ÄH8e¯ç„W`@óGòH¬RPD+N·þ£Ö£"Æk4rþH³/¿ôéj&”ݵÉê]ÒœöÔ4OèUIÖƒýE«ƒ³Ä Zs5[ñç É®q~”¦”¿¬.Ås+¸„e0¹œL wÁÞo|šŒ¡r¢òb€‘ò–Zùî’Ò–çtd̹ûò¬ÆÍtàvÏvãÓ©ºoK k4H­®ºgkܵh{Q²›gËmŸì8—(?ýh8ëråF³ËIo܇¡(+>•³‡>²¡%8Sžô,«næØô ` áÀ»¾y—,ìÌa”n¬£?kªÅCÿ¾› #w6.p3ÏÄw0êË×l$i9oÄ€²ÃÑu›j­ËªyŸÑ”_ƒ$(—ìÓÜf;âc±(µ#fHçÛ¢ÛG(èš™6P¶€vËÓèß2Stß*å¤4"ÅJ!رõó깚v¹lˆáòr˜)›Õ+Z…dÞe2±`LwÊL»£O!¦nÝù¥:óv (N—) ÝQ¿;LÆð —¡W•.±ân\öû4„‚á^¯’ÆýÀ¼+ ‡—I÷,SÜÇ!ñPM¢Z•nŸ¯ª“˜!¿ªJñÿ¬wn)˜l2íO5mž¸hWÊ. ê”yau)ÆÿÐZ†*vñËašÊó`aÕLaq§Ì¬„µ¼!og(T¬¸–´þ”máã6Ñå‹v›‹Â²I‚RÄdÂ;gå‡#8Îh1]­RÆM؃ žh)6s`óÇj\5ÔGѰ&dDôÖ˜¬\Å@rš´Ð7ÜêžðÒF&Åô0›æ¯i¦F„óÅDörΡúkªó£©÷†¢wë½oüN<Û'1&ÇÄ¿}§ìåuC- hcÉTÒs‡Ú.ãž&¦»«rºHÉUP~’ÎÇCÙò¾mµ‡QÆÊq¶·b;Ã-Ülï~/=úa¼Šq{ÇxÚ~"´‘ö ÇHÐüM"­F°4[ó‹ÓÒ¬ŽÇVS¸š‚ÛÍÈ®õ Ú‡}Ú–ãu¤r`h3tÍ[e&Ñ›ðÎ"Ë·ÐÀ¶g!eá¥#ß~/È©¹B¡³™—Ïf¦³ sКïòÀÇ6ÎaZ³Ø]M©Ö+õžÛHëVÄr¿íüس/jþœrÚëRl³ ì%S?´€7VSÖrchIÏÏT¿zŠ.44(œÅÔ¨©mú‘&Ä[l§—Æe}½g·‹åw9ìNåb°ëU­N›fÓgX‹*÷ÄP›²œqàyó!ºZÃqU…@ùU$ÅôËvùÖÖ¼¹ª³æ/*¯¬A*4\›šêùëtíX¥Y îaÌgG†B±ö$åjअ®B ɮ̜*´0²*SŒÝ Œœš–s«Z…¦9Ôˆœã€a U¶†¥Š¬ìä÷@eÛC_•éŸhÀ{'4ÔŹ]ÂQ(jND¡}œbwžôÈZã™ÅZkM<&sd©MX»ÔÏ3î vĘ÷š´ì%(·¤Zˆ'S^W¾è‚X@fL{gËâ-s0ÜË0¨ˆÕŠßçñ;ƒ×Mã·˜T ixÂ[¼DýÝã²%¦Cq0‘‡”ëDsœÆrB·lÅ— VƒÄ:ã–=¯ãü&¼[^z§gþº©Ó9ò„4"›í½5{ñë‘øá¬F»oÇKôw•F —r‡—$Pö@Ë^¤4ŒG¿i0 ¥Âp6PºµÁã 6UUþ?U7ÿO–7X<.[ùõtæQ­Å?p-È¥„¯jÎÈ“â6Õf†ß°§9áèÖ ¯µ*l+¯»Œç•²–âÝÙ®·¬Ä%µ—‹Ö¡X*—ß™6éÍù8ØMKÚ¦Á§ÝtÖ²æÉÞZæ.í8ÐÎØÏ¶0Óî'u¢ ­Ì¢ÏÀ:òˆmUÑ5¾¢ë{û–ÍFÉÚÂNmÓ-Ö»¬ü¥‰?)H»àš GÛ~!òÖÐlîaš ªa£6 ©@åçÜÚUCmUÏ‘BõÓÄ(FˆðT]?9‡¶TöšƒÜ®B-÷Ðî T6ÕîÙ+?÷vºÊîVïúA‘?¥Þ»ÂþvÆCñÙžã(½u'.¾zm¥¬\^ö­ÞUTw hÛo:¢_‰Òî¾…{Ýò;µ5‘‹€ÌvNx<$¢ãB¸í…6-AOHóc¸éI›xiìŒ9éUÈáe'Ž*à4Oš‘ûì°´Ê×Úâä1&xÅÛÓ'!t°Üw3oäßzÓ7tñ¹;HÎæÁË—ÛûA³±\ñ““äòÅœ@ùéêŽÂL›ëiD]ÕrFPBš­\¦&í9wY£+ Š9SOqXßšágB§ªÚÇê'UñÞ®E´¬*ØCó<8¾lz½W¥^Cmë’…AÕ§Öø—³n@oL‹áŸØæèé-rxg€t[âW²YÊt*õwôLæPݯŒê©¢;'õ@‘Eth‘[ÿwâ?èh÷c ?þÃãµµµ/þÃÊêrí{ü‡oñ)Ñ©k:²©x_NΦÝ>ï£~ý”L.€fœÇ³ˆÒi@sjÕ/¹œ€3*Š¥ ^ ¾;ÏP+ãîˆ~qÇ=ÏŽÀïâtÈgôäï°¥³tÿ>}»\‡#•µAÛ¸?Ò ¼_z‡È ­ÓM.4RšVÒ·èX0OSñL<‘Áà8[ü®×™ Vxd•¹ ^½ÂN&~0ù4ü3püüØåVš>Ò'‰òÔ5ÃaŠÎÌyyIQy¹®àãÇúJ9«t9”þÓ…*iÜð)ɨêÎTݦF²FAvî ,iü7Äÿû§·5GcˆÄâŸ%ÔaûÁ&ÉÔ4â®Kš+À§‹ì׬lW²‘’¬Å<>Ï|–ƒ¹,Ù,77G¯÷Ö-ŽaÜ¥è&ÐÀdѨû”oÄËí—„tÁ8OD÷ ÛxÖÚ¯ÕÂ/üjÖtŽöH‚Ùtô¨˜’Æf ÑscgQ¯=™MØ*ÔVÞá[ ×à•܃%8j @7À0¬VÀ1l`«s19âÒÊx\·ÀpŒÇ Øê;Í)pʹ©”OºÖH/M¨ŠI@M4I;ià$M—,r”ÀVSì>êìq@9ë ¹P1(Äbg<&?R<: Ä-ÓÇhá¥N# À-®‰›çŲxöL<.þûùó™€Ë©?ü ÐC. ECü›T²²€R<žô»¸¥oB‰9Œ xKæ mõëa,Lñ—<_YÂæAÓÂW”ÿ·'’9§ðWçŸ=¢a¤•±aú>%ƒÍgÈ—ùfÓá‘ùU÷—]WžZý‰[~D)N&Ðd(ø!Ôúônö³ waÓ¾½Ÿ>N1 ’ ñ)pÆf:  iõ߉†¥™‚C¼ÆŸ•Ò"ŒbÁT—,ºäbÔ“Ú’%¡ $„Û âá§#ÒÞV{9Vú¾øÂK®JTù`‘´ zçá¿ÈÆg͘Cà8K€ß‹ pœ%Àï°Ñ…G þ‡€‹Oz–‹ßîløø>8i Å1ÑRµúøCàÅ­ Hª)¤Š`.…åšK!Us)¬-¿ (ê˜Ft4“i;çQ‡‡O/ãá쇗ïZ,Žá‹æzTºª|¢Ãù£þ)<ÃxûT|²ÆS 3ž†A®Fã©‚ÁÔÒC~*;¢A7Í/ÈÂ&‚â'CCÃC¿Dˆ ‹é<ƒõ±‹ðP?=z®mƒv#Õx2ü„Å,¸Æ°ÉXžŽV^€(‘ÍCó§û#üp_Aæ)@º×óˆyÞÜPÏãØZ v[Á Þ¼yã*SJÉâ Ä°°1Œ^gÔä ÷4VŠiVqú¹ç>oÇ“pnÉÑR§aè?J©«ñÅEcÆYd5DDz»¾¿Uû•ƒ#ø¿ò¾ßì½sk ×iTI¾ÅVX¡v‰“£§øž®è[Ù;Ÿ^ÈŠLðûàˆÿÒ7ü nnf³„B™ÏT¸\·¶*¢£ÿv^WDûx~è¿×†\ooK³ÕÐ4+²VDé¾¢©ÚŽõ Y¼1«Å¸ ›ýñËã½JþÇ-ÖtK} O—ø“¼ó‘@¦6}½óP ´­Ýו6ü±yÉÆÄ‡Ë üI£ 'úzç   ÉÆ¹Þ@|!‰7 UVŠVA:ü÷ÒáÙÞÛä#ú³Î¢Jl­È¥gÏ XKÏŸã_pÆyÈ1@ŠÔ¢E×ß¼»%)I GbCî‹ +êVÄ)œi6Å©38Ìí+Œg9c“¯Ã¢Godãιî£ß«Ü}ìë˧ )j)Ð_S õ,Ð×)ÐZèf tÉÅ0Ùøv½Â/¶ù{¾÷*ôp _›m|ÞßÞ¯×ðìW‡þìK2ûLáwèq‡ÈlâãáR{M 'ü–·0°‹ ùW&ô«zäß„/™€éHMÏ ºÃ$â€à!ãÛMô@€þ}ía+5ÕA‘d4v™N`ˆG !6Ó·(ÊvEXªÄ¨À ¼lFëY:;T,ô„\8T6P4—o†‹<7LÞ—̺³ËD\ÓåxØÙðB¾£ù­ÿ¼˜”~øRåÖêRÙ±T“ fs²±ÇO Øædƒr²Uoçec’àffc‡ž03dS7(3¯CFUŠí”­mdøÉÝd@Féµ›k»…›jÈ¡ÏÆüÂáþ»–×™`Áào*«G–eb!·lìi{ †—³* –êñ7û怷VóR_”ƨV&›™ðÇjRJq”ꨖ%›–l\^‘svþ9ÂXeÒú—*”Ö?µT\U=S©j–®Â+é^b¼¹|­Å†Ctþö7ñlÞÞ6þûðoÿmÿh‹„ò¶ÔlbùŒÿÒê4ùO³l›¤–»2{Ö£åWu“ñÇ­š‹WíÕ]ÐÚ”Á15ÒrÐRBf£¹eÒ>"DS&Ü=‡ä ú={[ow ™ö¥KÏtS.m¯}ˆ¦ ÆÚƒx6NèoŸþ¾ÐX úô÷=ýMÞOg–"DŸþ¾'¸„þ¾'è„þö­ñ·uÛ-ˆ®£éÈ+ïm?øö½|k¿¾á6w9Òë;:„/ÉÐk?Ý:Í6¤ æm+î€KŒ_}þz_IçÚ»hõå÷{ü¶­ BôáûL¤O¿<‘ß} Ú5‚­Â¯õ6~áõŽûá7^Ù—B{Ïhï ¿Ú¯Ž:‰üîËï÷hKBž Y”޳DšQaÕà/ MÊQaí¨°z8òj0Ø{Køë=C'üåf‚tƒúàv1 (þ¬ îKç} µâ|åÂÓ8SH½t:êW­2­§u¬„:V{WÁ¯º3ƒ9H.0âþ _ïçÍFÇK-ý’*lmõù‹ªöx#á¯>¡ZüŒüH‡Ž÷úüEú+öé·cC„‡¯>½O÷À²P=¡1¶ó—†ØÖ_·â.‡÷/UE–• ÒŠõ×ÌO¤«ƒ•À6IµäýîÈZ¡r—ÏVmº£À¤ƒŠ€CuËã/µ¯È8ãËnGÞ»˜$ø§æÖ·…ˆ÷%&¬^~ÿ‚4³ û™ˆý|Ä÷™ˆï󷵬óDÅÙ5*Ôšy¬§Èõ³Èù(Fî}9?[äœ9ôßX”šf‡ˆ«£&'¤‚rÐÙõ/XzÛÚg#ÍjÜÍÖñ>¡cÙ:Æß;ü˜ºÆ©…ÃÏ:¦­cDF0ˆ=ÒßÏK$–odèûès,†–37-j Gt“í‘î@ ÉBÃ\Çâ0·ECÖÖÜ•ÜÝ•ÝÆŽüá3ì¶hˆ ID€ŠmƒK†ÍH¾üdC'¥Ôpž š7ÂÅ̼î ðWc‹i=wˆ+Ç4Ü€rÅRÅ2Å¥òÄÒ¤²Lë¡ ‰,L,J,A*F,=*ÂP*isÊšíÝEº½L­Báòմ믟á+ò@Agá;´ÂÒÁ©ƲfTÅ ¶5%¨ÜÎÕ­‘­BììnnR!BƒÙ  ¡í 6šÂ)!šJM©´ldØ’°•ФÎ Ñ”PxFˆ2ëÎYâ¼ùæâ\¥Ä1Õ U†g5é²"Ú¶Bg<'AOa¥æ¯˜=9ФÝÔ¸‹ú³o{1Ф]]øÆÑíüÏþ³zçÃð‚b/Lˆfo‘ß;wÅAC 0ïlÏwˆ³Ý'­¶Á_I¼ 9E¼#S^‹Ûƒä Õº Â:bò:›‡tðYZk€¾üGtbpˆK§KK5¼,¤VúsC4tmi>ô±¤ ŸÚ|à ¸¶4¿%åùÀo„º†øái`N?…µ¥YÔj~)ò4,Æ&n»PÀµ¹9mw^hà¹9mwtN¡‚æ•x»£³ ¤‹fµÝÑY­¥³:°5¦ÅÕŠ•=3t­€~½²À g€f›´LTÅS<ó¾Tg™Tâ¨iÔ S$©ê×R׿ wKA×ò•… µ|5Ó@­XÒ¸©%Yßßb€‚­Ž–Ç%|­ü¾¡?_×yÝ]ÑŸp$lùç6\¹WðµBðûýùÍv húóáߨ x†#Þ.ÿùðû’×Zóà­òŸ ¿¾åêϼüÒ†#ÿ\øŽbPÐ~t€/J¿óZR80ýùæ{4–i~c¿áý¾V¾£(ƒTÞ.Ÿ"ðvùƒ7å37uHùÙG(¯õ³|Û£?·¯õèÏ•k÷µ¡?¿½óÖE¿@wîÑŸ+¿G?ž;¯èj¼‹,ú¸ÉÅÈ3_h; Ó9,Ržo4ýyðvF C«À€1Ýù&çñ`fõ½{¬¥¥²¬,}\šëò¹Xµ¥bXë.V^·¯Üï“ÊQ­@Ž,ÊQ¬uËáer3jTê,uZ㑪€gJGgp=H¡ V1”÷e®k…¸Ì¤É<}&Œ¾ƒ1§Æ{£ÄÍz1Œ÷šÇüvÃù°j¤H>úNé̹ͣ€TïœÁÀõ<í~*+\úÓ…Ê W µ‹\ˆ.(J^}I¡ÏëÃtwRÄ1.æµnE뽤õ^ÒzWZ´b©½ñBY¡ÅMƒR¤ÞiÔBIÉ@ÔECÙ\ƒÓ½Êüj¼áå: cžXŒñÞÆ˜Ï Æ\Ua Kª¹„1ÞÛóyàz£é‹”®EZ¤ÂUKc>ZðÔýöÜÉ!2(ÄE¡),\:5b©\eµ0Šñxoc¤•·w1Q]ΉÑÒ¢qa‹T®)Z¤ÂÅD£íDc)+Z(4ŤÚ~oa¿¼ä <ú%‡«7ôfH7p ½8Z´^Þˆm|y/÷àíâ0Zt_"ä0yŒ—.èf@{É¢pÁ¼‚Ñ™Gã5BHA£g·¸(R40‘¼ƒÀg)è„>KCãëKÿ5úõ‹½žÿúð -¡ðÅÞd±C2UÈë§j>ß,ªùNçѯø—jÙæq´·ý«©º¯râ¼Þç×5ÈŽ|íÙaÚ*ÕëiéÍùRëÜ£­Z»4µœÁñ†G¨K!Ò“)†ÄA‚¦„¤›$Ü^àÒaϘï‡H µ€6» pEÖ{±·ã½8Þó„OãØGÙIA¸?×ÅâàtÑ}·Âñ%Ûñ_§Þì¥@ö¶Ý¡Ò‹0âÌV<ÅKöÆñï;‡³„v{.ÈVœL†|`®O»IÔ@Ð rmˆNWgðï‹è¢!äUÒ´GŸ]¢(]g>‹hD§šñ¸ô'xñß Ž†}ÔšÐDpü{D£PÕ¿dXXUõ‹™¯Ô¤€•í¶õíE#ŠKG¾øûߟí>ÿñG‹ìt6là²ÙΡ^YV»/_no!.®½KLxtP “Nn”AÞ[ßàkø¸x ™ >!óK ñÀÅĆã’B.#6#ŽKü®l_즑Ïã2¼TÈ›'Ê9`%.^_` 7Ý©Nç嫸‡Är«â—ËmöÊš\vS—ͯ˨'%:°ò ÁéxL‘*ÊY€Bm¼7ê<¦@¦™nm–tôNfŘtŸûE<;FÝŸý@CV†B1¯ñ< ú.øûMw4žPñ-a*Äÿý× ^¦Ð»ä®Ç´ÒM¡á–®ÏÛ: ”cÖ–\@yäø©nQ¸«‰¢àÄ×Ëj}»ÇmšÔ­x| ‘cŒw«Üc„!±›ŒímÏ2¹ôr¯3¢mÈv•²~0ÀkV]” Øl ~h_ ‹&Å::u(zªª*ÚûHÆ—ÓžÓREYãæˆ'“úxçE<ŠúU®¯hÂSq=žÔxõ{¿±ZÁi¾ÆüHj °sð"nÔšKx}FÜx‚Pº”òYQˆ‹PÀÒ`ÜjË ¯¶l\! Î@¦Ï—‚íÖôtj$µæþÖ›ð¯2í7ûŸírçHê3}<€¯°œMÖdƒmïR‡|ý mõOððo÷¦@ã©›(ÌP:—™äZ¹G®•ENI U;`œ^¾ O…œr¢P]tG—`I57\z¾6ðËT…ÌQséã2²kUóš<]2h¡ö:ipP¶L‰&AV aàË0ÈÔ-J„AJ†AX¢ðØÊC4;W:M ß—z<žÔËMZÉ©`uÕë ì©¥B×ëRšÚÒŠ!¶€Î‚Cl¿´êðYR°JärÃp9“^»\Ê¢Ã]¢4DjÙÊY?«¢¯¡Ã‘[·¨?½[ æõg½i4Žg×¾¯» z0%þpFÖl/ߨAª «h,¨¢Çµe‘š!‹b ÒU£ÆVéqÈ*¥¸¥šEiŠs4S6jÍ¡&P¯ñ¡2VVÓÖùÓ÷}c«¼¢Ú:-³Ïò—ÁuؘU®šWRÍêµ'ÍíZ}±Ø"¹“–ÍÐÓä¾XÌ0†G¾´_®8\½À¹ %» Õj–ª©p©óiÔ2iœÆ½žÖûn]= @}ÚÃÁÓŒ–0d4C ˜ LÂé ƒÐ M©–G‰BŒJJ5[^R`ËKŸƒm n5æ\L†sËdÉ+×úšC@u†UwYà÷ÒgÕ¸fPœE{û^¯n#€p£ð›Ò*Úï[´V–«üÉÇp-'ªÛL×ëÝÑ5 L;dnã P6Øä&°à?Ád@\Ϥ²Ê¸ûu©þúÍ™]‡ ‡ ‡š;òÒë§e5$Â6Öÿ„UP'';)ªêWX ÐÐA¡_5pêdYw0Ë5£R‘Œ”-¨OK®>I ËÖÁ=^AáBÊä2u±{#V=žœÔ,Ól´‡Ûõ‰JrÑm<…_ ­z€]ÃNH®‘‚1nj·ˆH_c¿b9Dt$ô"ÑÇŒ3%uŽ?–EßR´’ÍëgG«e ” 7§ÂoPü¶”MkÊãL}=Ž?çÖ%`}.Ée ¹ìfÂ.æÙÇ1ë@R@ ꎴ¤å©AM&¨â© T‡:½Õ*Ñ3›£újµZÊn’E°Æz¥X „ùÍ$hœòô åU«fÈÌ{8ÕÌÙ’AìõêàX ™ÆJ…íj¯WÃW½%øË–9ë| ©¸©šCŠF,5=²ªÙô¨ïGL$‚XˆmyжôV¦TeT’CJó `wØ”eæPU•;…ïÀË“©”Q"Oï¯åk=ÝBAž™^Œs³JqÄgáfDÍÆÐæOûËus]€üýì™zÂà€»hÔqßðRÙ¸eôÁIÆ¿ÿ&°ÿk†ËµKWÏhÑ/ÆxKP>vÑÐÇ…—eEÈ×4#ÝŒ¥Ï Ê‹²dJŒÍ$åPÍ g©fÛÍ5»2¥nÅêx•IÙ…®9ã=ЋñVæôæ8{ß==FbîðþØØYÚ­U–*'vž8®þßÿ^´Îø¹,,íÆB;Q‡P m=©,ILBƒÁ' M- YS¹êChÏºÏ Z¸ZËn¥Rå\w]ýŸWÁbæÀ a,Ê0$¸3Mòú0zX×~±ÛêhK³ëÅuHYÓ¬¢`…F¢ym_„cþýÑŒ5dÈ>Úõ¢Æg"$žÜîdé›”(>;}nëˆ'¥žš¥<æ;Ð|Õ-—¯(À8Íyâ|D|íáˆU1Â!7çÓg„Ÿ®©” zàâÓ²Ê_Z…©‰©ìE¸7É©ù>K~Î%2 ‹a†ä•S3(ÅÄ|=9!96dY@“1eÀ«5x´Ägêq‘Sçø³-!ÈçÏ2­™¥SVÌn…WEšftöùg^'¤ŲiZ§vfðÖjèÊ´ØØ¤­(:mt9ƃ8‚ëÊ4ò„Ù4b.w«ëhFx_‹´" )U’–*{€ãµ †×U·¡*ή¯e°8…ÊŒ—œ¾Y¡- ü8;2éV5ÅÒ“1ÚnìÁ¤avtë ŠÕµøyŠ™²Z§Òb@I?›è6┸3‘äd(µ—/Nùˆ‹×ÖT“³Cϲ»Ù¢å«d8ÓTe¤‘‹×tÇ)3ƒËùÆ’»uC×—­Ê)Ñ Ç·©$Í{æÛ,ìšúâ:¢O‰fÀeÁ‰É×t…Ú"܉÷œœF´Õ_ÛÅŽò¹„^ÄVÆ0ÕÓ&|ölFngÚީ脼õ‡+$¸ø\6“T)âùõ  ‹ûÞyÖë=6³ûÌnÀ!®Ë«ZmM¹méÑ9E‰+ѺkY¤BØaÑ’mï–VÛzg‹?À(µ´YMÎÇÓ´œ $¡L èû3øAqÏ´¸''¦î¦lÕçï_^@ºaýl€~š,N>¨RúÙÚßÎÊYZ¤ˆª‹•éŸj•þŸj¡‹í '‡çÿ#sè¢ÍǪVýÖXË€µÐŒˆg™S“FÐJÁ…¢ÖéL/¤'3ßR™îAéRÒôÖ6üìVù8/8îgFH(Ã,nŒæ#¿våÂÒ±` .P.,ÆíÖÅdаdа¹2¨i']Êþ¬\)«xÓ§˜åü{zÎ˪½É¥É/_fÖ„OŸÃðª6xІW5"7À̗ƇΗŇK¨Üb¤6ypÖ€­kÏÄâv§g©Óæ9¿]Ïíc´6ÔP¦õŒ9"Ü2ƒbÉÏ’lò,6Nc_LhƒKHœ.`8Âd qîz<4‘­×x©¹ž5ÂEÂ_ÑU Uœõ×¼ô9ˆH•n€;³0×îTÕѶYç(ÎLn–MóóJ8ŸçÖ_‰Ÿš‰ó>)f}Œ~ N9MûŸ®-½ÂF¯~9ú«+ËóËàóqjçç‡O>³Àlj»tÀÁ°;ÚæYăKf—ýh4û"}ËOFýÓïnr˜D—ýñÁ$©&9…“ÿÁ ^[YɪÿÚjmM×ÿ ¦×kKðJ,ÝgF³>ÿÇë_MnûNö³dYÕŽhˆ—{£myjßÚ=§j“í×ë{ÐKžG„ fÊpØÞ>Þ:898lŸl¬·wÛhª´¡¶ù1–ys¸¯´€4æí|š8 ­‹†d¡Ý– NÊ6ø[Ý‘žÿ0dâ³…¢äó}Î`Ó<"m|èu{çÑIwŸhS`SÔÖTâE÷ÊIi¼ÜU*÷À×ÉïÍ• ˜÷æÒÇ+Ž´ÔP{)ðèÏe7+N5© Ù/Ó¹‘ ‡ÝS.¡ë³Ãi4ˆ¯š‹‹ÑUÏ{‹ÌŠÎÜþØ"xBR–L€„»e¨‹ªN] ÷‰ŽqS¯u‘œX–8émã›—ÉY•“J‹ŽQæL(‡•&Ág 3ŒvEF{rC§i%Ý{Ïüm>Žý?Ú^ßz¹]¥÷ÈcŽý¯×À7pì?ôÿëßíÿ·ølžwGg¸µyL3êöfÇ$š-4s? µ*^®&âã‘ÚU†éažF8\‰pKJ¿*vs’gr‰#NÀ~Ño2§ENƒ¦ .¢YÜ“—²î.nÆýÆ[²qðJ§S»Ä†  ´½,Èþ^Œz‡¤fñEd/2 mª u~0‚߃v€¢!Y³P& 0fŠúf1¡êmç†05I{6Ü‘ócÝüØÛ²:æùåÁk:|œÇYû¦%bk<ÑbÌÛ#ÒΙlŽéÅi wãH~«ÙzE>¼ŽÍø‡Ùø†a€RØÏDô!š~B%9ÃZVÛéúxï}Z·‡?]Œû—ÃH|Šf ûÑGR΋øw¹Ý܉>pÚíý†f>¿UèÖC@OÎ@dØ„)Ñ7Wÿ„K'Rêè2íÂìŽfUÊ)§ãI÷Œ·0SÄ’‘Ü7,,skÂ}Ë †]Ê´’‘ ï’C‰cÜ1Þ’†ça ’l¯Ré¡$2×ÏZ-@߯;¥¢§øu[]X©bÈ€Î6©¾¬½?úŸØ=þ¯ÿ8ýÿÅ´5ºßÁÿî4þ¯­­}ÿ‹O¨þéÇ— ø½O¾ÿ÷xe­¾ìùkK˵ïþß·ø@o««{A<„ÿÅæÁá_vw^tD©Wu¨-±ÏöèöϽËe;Qï|4ŽÏbôõF#èFs{ÛšqÀ-5xP; ì_|Ìi4ÁsXòô-z+0žhð ªH®}9™Œ§3Þ)ò¼¸ÄrâªZZÛmuNø‘[]œFˆCN‡ô äÅ€“Þ)e^ö³~$Áðmä”*މõá0¿}gâzakÌN¯(ŽœhˆöáúÑæî~»säNró ” v"çVœæââ ð‰§Ä5!i`쀾A’3Kó>—ÃËMŒOáL£tªYVèHúq¯«ö°ö>õ†úBCš~ˆ?ø¤B”´#¢l²i` ´ÀŸn%Ô-†ec­E¼;ŸÆ—¢?ý8ÁÆ)V5rõÇŒ§×+8<å± Ê×PB*TƔᕬRõÀ;qù³Ð Õ˜ÆsGŒ(ÓŸ­Rð· _kÈ£ƒ*íºæ¢DÚ%öúiùÏf!ÿ¡ó`¶+ÎÆã¾ˆûQWY<«Zð(MY·jlÊ8g˜pݾ°§iœ;ÛÁ¹[ÇxT;mâH®­©-&e“ nº/7œ MNÚ/B0s'……žfc褮 =¹nž¦­T6àž¥:Áa\÷§Aw«V%UÄfUo¤jopV†r©&¯H°_eht ý¢s1œ‚dr¯n_N«ÎƸÀ8¢²Ü­Ò¯Òr½"Fe °·KçïhYAäš$ñåŠ=ú¨rQ–tö:L¤".4Ķ ±‚@çàºâ&Ø{Ï.&V˜¨OLþ­¹¹QŽÉïMÄð¦Bi*´&¢J¢­ÂT[Lum%—ªœ¸ËÔùÄ¡âÔþ°µ^8÷”h'‘žàÜ><æÏ§Ë$%Ee lÆ1Güž =Ñå´;ü%îÏÎWô·P”k+ò¾Yøñ.—˜‰öáì}{[܈_ñÏþönçÅöÑ\IOBçó/K5%w楜ØX®ëÅW„_²m ´~ɬåÚ¡bôNϰu_Ok Ð l†•i]?öÕÓg%& Ƈ[à…TÝAf„zúŠaS¦ÎKinómÿ]5ñíô]qÿ`û³AßÓ¾Ý~·*56w«ë[[¢¨F;9hO5²“á06a×ÞîVå©@€oïí!²µ $&äwö4û¨v7{=;¨Ðþþ§ª…Q[5 CÿªñæËt£zžrä¡“v DbE»Œâ¸ür¾SM’ò^gð!Õ\µµ2 lj´Ýa¢õ=EÓÞåä¸ÃMóèÔÇ»BŒíóªfs3X9†íŽTÇ#ÜXÒ€¨Vá]žàÃG¯ïʇVUÏk˜%´æúJN¨g%,§ʦ\¥Wß”¹"Õ@7gŽݪ:-#Q¤.­ý’éʤ¡Rv]¾-ÒºÞe×Ñ[¯jòðï·ì¿Tå´\wk„ÊÆÛ.`I¼]ƒ÷ÐÙ¼k[ÿ¯ÜAÔoÒ5ŸÿiM±H]~oŠÃKUNk+Åšb¼®AsÍÍøâârÆsSèN¼|yÜ!þ@>/øwâ`ÎéÀÇ)ž©˜ý³ÐÖçFÈÛ±íG³œUa‚0ÀöXœŽgçr–¤ÈÖŸÒ"M-,VxÃBã©aëÒ sºd¼»&5ŒŽá¿ÎÑöúËkÜDa-kSN%ͦŸøq"wíTÌ2jå,šYÓš§Pz£Íá%– ëëÇ«x¶1÷~«`%—JµZý̧¹†‘Úq¬¶-Á葯¯°/ã©B5¯ËµÐvϬ³/f IšâôÆ‚ðf¹Â}³`ÁJßÀ›1 »]Ümàá÷h:>"A7«Ó%+a}Ä@u”ÀÏnb ¤V‰ø,SQG(ÒWm™&@ö¶Kÿ½²ôt '?ÐzÑÔñ^§4ª|]N£}¤ë8Ô™º+œEªþ÷ó祃¨8fÆ<-‡ÀK—Äxʱå©‚®œ ŠŽïÍA'RåÉ0ž1·ëó¸ù‹œ¨ù¥ª˜-•Ë•áØJùO)éjy0(—?ûÄ Ç@Œé–xê‡gÀäìŠ^ë•ÿÁdDãl«\ [ø –ï͵'Glþ8ƒ$§ú6ÌÕR7&í˜Ó6ÛÄm…¸J¤>׸;¡T-ÖNñsÍ8„ýg@WÉ!ôgš÷^Pn.Í;„ýçgšwý™}/(ºf~œÆô”Ö”ùÍâß:U>ŽL¿õvÜAϱ6²ŽJqåí;T–Ø¢m%vîÓõ;p÷÷:ë݃ýë¸ ÍîgèÔmÓÑþö#bª×ó–lò`D…‡8OvÜBᛲ ]ã̾\*Ö øad/pWX»¤#5ÅÔn›Ï¢`ð26ë!0Z°ú4ÕÉÝnÉ9§ŽÝʇbÅ­›äM3M,*XÀèH—îMNt¨×i‡Ãh9ŸÄ‘ Þ}*á=NÏS™Î\EzŽLBÑD~°KƉ3:GÜç5Æ·'ïð°+zæY]¸) »„{ï!›|Q`It»žò æ‹Ý*.÷—î‹Þ2²£‹d„7•BA©µ®%ΠïÖ‚–’JßÏ".:lnT“îE´9BËN0Nô ÁŽgˆŽŠ‹aQ P¯†õ,hbÍ‚†¤÷BïËÌ€¶ÏN®Ì­B{¬ÃÚ—› ÷« ¹HSFãüãÅ›7oyoQ³qß/Z……1LÙÉ1j¤¦‚FÓv1 c gîв c 0Á!N @óC¥‚íF†Tø,±ÐR°qÆ ˜ ¦±ã©e9¤Å*ÉåË2«ðt©+Àmù³òyE* Ž”a86z—цJR0 ú ÝÄy¬¹ÿŒû@À Y*A¹CxbÍ,Û™Ùd-CêðœéÌm硜Y³æÃq¨ÜÉëÑ|M¢·`†--rtGX6£À^'x'_ÛÖRÜ”õ¤­Ž• Çþ˜÷e_¶èŠ6§ ‡Ÿä!´¾™¹Å@æj[¹š¼ièõ“²› Á˜V11ðÛ†Ûaª Q£ñˆ$”:;ª¸nêRKë(ÅÀ‰F¥kG©´n„Z¯§w¢Æ ©c&9k‚T‰3ŠÇŽåĺÂ6®ªFæ€û̸âÞzá|Ρz‡뾕w¨¤ïЏ<¿Ò/nÓ®Ò@h*®m2§R)µ\:Át)]Ÿ£)HU!UA¢°ºi¬zçÝSSop² œ¿TØ«Œfê…ÖVqä¹9­ñ©×àÖV ïÈj‹)ÿõ6Íñ­£~ͶjV^Ü~ X;½v&ÞüžC~üRÿBÍö­5¥àJªCæB{¾¾7aëS  SÞêæš¸ w[/×iæŸ×Ù«¼ðÊüK$mÍ-p6tó¤ èà>K´*ÒAá2ýÇå…××ÿãb=ÞKðErýçËC=#ÄšDq4ž4qm<$‘räÉ èýåù"W>õR‚Ù3û?ûí» ¤£|‰ÞŽÄŸHíTwJôð¤2-—it–(”³ýÚܨâûv4ë+!¿˜\k±S£6Ȥ¶¹yDV¯WŒ4ï0µ‰-\tüeͯž•¸ñ8Wt1™}ÊTkuï%Ç÷jÞ€Êà®(Ü–T0à>= ³u]Y’ŽÏ\ =•4e]sHÿ2Ò@æy˜ycwÉŽXˆ½ÁÒ÷%ÇxNiRƒ1°ÿ5-€ q6±ÄÑ1Ú¬ãÑoðDïË”á&å:{öœ>\ MY.²yº­D³º¦%íY“{.ï¦.pÉÿØ*Ĉ;`Gují‚™Œ'ɳçK08ÙQLs:ŽtWI8µûå!:tM·rZFëmi4Xh<Ÿ¼\žC8¡m9ìñ3W8ϬdÔWIíäH>v'xÃíª€ áùTª/#¬gÍQ¶42—Ëë§Y•‡J>z½Ôoƒ­7Þ©òß+››ìŸN™¾¤íìƒpýuSO›Œ2µjÈÀ__ž¢™$S¹Èìq 娤ÜÜ^4$FÊ. ëÞ/¸)w… »Ñt²H2ánð쓆 Ü7 áNhõG­cs=íK§H꺇;&0,·=wÍàùÔ4ß”³§œ º½ªÉû‘¸xš´Ý¬" Y÷Ô3V}ôÀ6 JúT£(o°"0¦!Û‰FÕ6F'ßlæÍõÐN, Uõ¹x«¢KY›ŒœpáÇR¬ô,÷•­Ô³L‘Tù ºä®É ÚŽš©ì5®NS—žySôøê´æT²ÀžxÒÜ­vnà òne<ƒÕ¡ÉH¯×ð[ñÁOɺK•Ž2à~›. BàÅaõFv3¨Í—¯ÁßìW¢²MVs$§w슺Q8­4R+RXAŒÍM@q67ç`þ™ð>3…çoQ ÈFLmnKc‚«eÂÊI9eÊ„§vxÉ¡W=T9ds?g3!èDI†C®H¹ž(9à•YwzÍËÏæK³*è²ÑIŒPOMú0lê2™P‘îürÒ9H7Ø[KÇi¨d‹i‚âõ'®…€WtA½Y÷€HF_¨©ÑغôD ÔYj:˜@#xœÏذGñYjk ›Â‹"–ë9ŠX[Ipk“ÉYQòµ—©ÝÙÊçÒ ËÙT³H¢Uˆ„/©Cbk t[ÉÎ*dé6z´µÝÚÝߦ†É zÉÒÑÀ íÇõÁ¹ÃÕà¼3Ê—«)EÁÕ’€eàSÝšr£âxã?c;^[ï¡Ï€×Mx’â¹Ü‡ÉçzÕm7µQ€:[©]ìN²Yà› ˜£.T-µEÏüªCÙš¶>«¨Û9ŠGЦ¼¡ÙË35Õ(hÌmRºF¨•háuÕZL‚_²QÒí=”ð^3¢ÂÜßâÂèT1ž.<ž–ƒ35ºœ÷·ö+üU°4ÍÁÑí¸!ø{ o2˜dñx³€kTø•£3ÁâÒ C:½EqÑE×…‹«8»¸Šòx“Á¤Xqi.¹<$i«nî£J²TØ3û[\ð…+×ÈhÓ!‰n¡"oÂdÞpÎnAH׋CÆ+!°!Kó ‰>`c—ëù†µ}´Î%KÎû’9ø’–8-fûh/Œµ—‹µÆÚËÅóÞQhÙZÄ€Ûð¦w]H|þ<$×ñ†Å!³Áq_àö ’…iv™L^ïÛ¹×;§«—:eÞº†þÈcjwhJ³œÛœ“[sNnɹ“Ë™MÜ‚ûì6Ü·v_g–x?þ)¼/ÐÙHµKôu¢¶˜º_ö>vn5¿¤(¿Î—ó£Òå-Ažs1ÏCsAƒÇ”¹x3Ï^ÑöòÑöÂh{ùhd1$Þ[ ¤¶s96Ad0¬ÜûËj¯÷.B¾©Èý˜™­#Ì¡};Éí9tr8”,fi^­6âdžÎY[ ZK$K„c¼]¥Â{\Ch:»`HgµS‹c[qLnÁÑ· wã8Ëæ˜OÐ.±f”4¸‡æîp&Iýp'ÕÖ±™´ 7í7àæÐ:›„K£=‡¡Ò¼_šý‹Û°×4<þsˆ.ÙÖÿˆTþ Ñ×g"äLîmé‰Â½­}¿ä^°:‰©DþЀRNRÙs]¸0 鸅¬2ÅýY<]`y{…R ö¶;xÎç7Ô¬×Ïî¬dBtG©)Ž—ëGˆuzÀS¦2ýŸÓ³-ØìJ{Ðî"Ãmo@/¿^Ýìí··E/„y„S¢ç cÎÄcÔ„|Saú“H0²°jâkÉš18öŠT—fÉ JÔmFšÇ™¨RóJhTi:ÖšB¸Ñ©'|j5¾AÅ©ëWâ¦ÜµYéó1ÛÏþBYîlfÖI|wr“æÍþ¯)m´µcXÈmï¶26ýÖÏ€g;ÍšœçÌ™hôeœ;ÝØ÷§»‚%Œ”8:Fx U/N7Zœ3¤²ÃC× Ó¥ì$`ê-ó±z¶”Ф½! mªZø>=Ý/qqâM¹ž„§œLIdÀÃù¶0¤äà)9xЭeàAJÞútIò¡]Jáí£,¹¯:€)™XíWGæ`aŠAó¢?¾<ÍVˆ¥С¸ ÑÏU+DP.GJ#úùƃ”<Ôˆ0¤äà¡F„ñ %5ñ‚ÑÏÓˆ0¤db‘F(´”Fô35âýe·?Wjõ'¬JÞgéV)B+ŸØ©Ò÷ùUƃ”<¬Ò0¤äàa•†ñ %«”ðRÅ )ïóª4Œ)™XT¥ -U¥ï3«ÔëiðÚ÷MÚu{ÝiÕ[¸!qöéGö°|Ï·è2Dø$&Ú£å:‹šµ¿DóDUUÀ&_Iç _ÉÆÁ²XæÓšÎûºŒÀçÓï$98 ›Â™Ÿ ¡}s„4çý\¡‚8ó L!Í͉½µŒÂßX–V5µxZLÇvAÇHI¤j—«½³¸ž”®eh ?8@aR¨„û·%ÌZW€òûÊ)»•? qª*môÜñˆS´¼áˆŸ3iåFZáÁÈ`Î`„Ù[£‘–x»ðô–3w:Ÿx ­‹‹ôgœR2[œÓÃþ†lIÝÞ$™j,4v– E išÊ#ø& 4BgpÒNma³9!ìEþ,š¦ÅQêæîí›Gªk¸¨þv™”)0xOP½5¤_½^HÁ 3Ú¾’*;K¯z½mk—K:è í¬låŒíòNB›àµöƒ%x§j)h%u´rcÁéc•Ypþ9Ê,¸HŸ•ûâx’´pänª“%WüQÉÒ§”ýÓɸAN(™C§e—»;¬–Ñ]-`«Œt•;zÒiüÖñæöÑ5Ð,QBᵆliÈÁâë`m1|‹5žKìò¥Õé ¨›xl»,û‚?çFkL¤Ûk ]tg5ËOÁËøôõ~|)Ÿˆ»UéùñÓ?‹‡»¤Å£çÂ,ã;çWºÕ—¦nKó•Y û‚ì6_ „2.Š\Ї×åVBÓIŠä7P¨ÚÓEb6t™—ÌQ?9F¼$¯Ù>‹¸ŽŒµ¤mQw0¯Ö|R+´ºŽÍ(Uue4> NÖÑWš"Ó\êÎû$ãý{ë½Åy¹N±'uéÉŽI¯2Phf÷FŸFPç,š2žeašk+ašì€þ³Ú÷OáÓÿŸv{¿Mº³ÞùO÷Ê;ùÇ««Yý?~tÿ¿Zƒ÷µ•µÚÚÄê½J‘ñù?ÞÿgÔ?ýÞŠ†ÝOíáx–T“‹œ¢™÷™ãÿ­,×–|ÿoeåñwÿï[|Jõ¨eàö# û»—³1t:qÆjãR_œ~/·ðªôÒ‡å*÷i4‡C¦ 9ÛÐ’Þ4žð¨ .²jÑßêE±ÊŽã‚ºi²íjZÉó1Õ¾%/ý1‡Ø'í·÷O·:»ÛíL,ø|¤ù]¡¯œNÊ@qk{oý¯'í½ƒŽEW4˜¯ïÞJbúZÆ>æì$¬AÒÖ ]$yÛGGGô´¾÷Ëú_ÛôØYÿËö>=µÖ÷ö:/ŽŽ©Æ·¸bѦ¼lQ¨3tò=x³ØoW¶wÓušC'L˜ OàéÀ7%¿Øh1›Ó+Ù*\@Et+|ÞO:ùŒÓ]×xþÁ›fW=ñ)¤ø©c|esŒIÀÒG䚬s=™ªpà`ÔäŠÂçÁ ©ªÈ è|#t¨™¹YºUŠ£¢™„Ir<›Û’Ý“tq ƒQ(v1¨ ‘w\(‚Mܔ˽ñPQ‚*bZ«àU¯÷UD*JÂ=<Ñ(6†O‚l€¦aÝ oÔQýŽSÍQ¥¨õ32£îé0Òíߎ[ä%-*Æ `TéÀªw‹)˱ M3îã.Öë`ñë„9Äà™\4'áv&%Ððç´Ø Œ¬Ö˜ ^¤•e`j=¸,‹ïÕFr‹!³e ¤[F0˰9 !­N¢Y‡B¡Ø:ª_.~r~É'ÏÿÿÏˋɺþôÉ÷ÿÁÙ_{ìúÿµÇ+W¿ûÿßâS’“¿º®iÚ7ñ¼ÒÂK÷’ñðCDqr½…¦Žvw^tD©Wµ§O×ÄF4нîé˜Öã(‘+e×Ý'fмmgû´†55,l¿º}~9 #No¿8nµö¶mÿ]uˆÖMë{imã¼UmoŸl¿^ß“X…Uí,°›ßÞÚ=ùÏã—‡m옴oï¹ö’y»©élºïñ6 ÚŒAOÝ‘KlsÒÌÔð-ïP§âS©óÜÇ÷¡î=ê¯O{çB^¿«HÇI»{w§ª;Ë9QÞÀz£A÷v_o‹“2†Á°îò5éÙÝÛËKGýÈK—w¨béé@8(*N_ëÛN9ôu5T'#pÓÕIvò‹Ý¼Ô½ƒÜÔõ N&±èXºjl#†:vÃe‰R€¢| :N¾,;"lç S`ëìôÖüÖ<ä¯ä&社ðrE•¼ eTÖšÓ½RJuu;~X§OT¥Ja%”é±B±¿› ¢êûô6˦øï•%ðSž5ÅHO3Ä3omèz¡—®ê䤦1–®jü8<ÖÖ“ |ï`›2‰Næ”äçÏK+KkKå²ÞØ?AÁ7;%`ôËôA°Ï z¢[ËfuGäÏhy3û"•y„t²Ž/(ã0–Ú¾štùÞ¶Í1ÇÆç©)Þ»†;Ûž4ú¢i)BÞ½¸(nÅ}©2¼Ž¡ ý¬ÄfN®µow«I4;¯ãæ9_äÓM.:“£ÏÎás.ÛqW‰›Ê;v9¬‘¢•ðÎÒ§hº8Š=Ñ’¢Ñ,}‰)Š _”.ƒ“qRæÃSÛ¯eUi"¾úöá{¡iˆ€ªüH×´Ü|çsŽäÖº+·ù§æ§=G3ð/{ÅìL@ic¢ ‚…S'>Eþ–¨½Ã›žJ7¡ÿ¹òÄDèšã#0P¦ÞK£|u‡ajq5ïøw&`°9G(›;ehÑÍÊX­nrf5æŠ)ué4ûÖF d\–DÙ©Iæ•€ú2¾\¢è^̧HPs‰)Wd.= 8—$_€Èy®Ð-‚LUˆ]ïºÄa}¡.¾¹0Í!XÞ5‡E´²²bà_øXˆÁ­²ºª± é?žÎ«W×E£ñåÙ¹J.[ZtÅõØás…¯ ”=,¢=´æÕóà bQÃ󘀶¬ô?Wä„:ü?:]#ÈÎQt¶y!ðž°M ½÷OšZfd?‰š)°ýñ,j`>mÊ{Óh»êøC„‹+|íìW­²Å¤(ê«Ãzƒ..^Cy²§|.ï);x¯m<Ó˜xþàûãQ$p¡¹j•¦ÊN¼E‡QK8B*ëxä, &3ÅÅ,c°Xœêl “ðÿ˶Úÿ8ÉF üý?µ•åzÍÛÿ_[†¯ïû¾Á'c>6+¾³7'Û}jo=n3:‡±Îèì'èÁͶÓRâqX%x^ô½ýÎ{ÅËÞœÃ;p¼½D{ÎÞ›j{…“ ç’Ú“sî?¬ä‰I»ÅoE6M¯+i‘š&ÆþØ}QÛ8º?R‡÷—ÇÍ{QºÔ.ò]ÜöÕŒ+ª5uKS$Næ±f5ÐWcfmÜWMy¤v[«V+g¹(u䆋,y-Ú ÄØ7— s)UHk̳[ÅýëÐ(Kß¹ªé¨a–¿#?þÐKÁÜØ2‡Œ. gÉø‹Éк><*¼?ÍX1G -Oz8¤«÷Òû4wa 3ãk:)=—Š7.cZ'’Ωšé6Gz,lUc˜¤?vsiNw!Ê$Å ‡yÎâíTÈ>MMŽd0¬LšY…sè0…õiÇ e‹Gà·æ¥ÏRLk•i=P©H´/5'¸&€ë×±BÝÏ´?ƽ~À…ihãÈdä3äªk±qBþÉ c§cpœDè”VùÙö›v=ÀV`ËN/ì-…d|'tÒÀN‚ïtÊ')6¥|2ïùžJ|@çMqYì`PÚ¬RBtæ [ÖxчhúivŽ.'“äð‹­}2ŠV+b¼G¹ùÏö©%œþ'Àž7š9ÍçFƒìonæ‚àõa"Ÿ ]'—ò†Éä‚ÐMeùânÍÍQ§ Lçõ^tcA>™b È)æøåñÞ#ëÉ¡ íBnºCänzÀ§çtBdÍ89@×&ß–ð†ÚC€ãäu«SãdŸÊ±ò­¹B^h<—%”‘•,eækuy9cYƒA³)ekÜz37-Íý³Tþ‡}œõ?{ûç=†€»}ü·Õ••ú÷øoßâ“]ÿ6Š&çãaTÀÃ]ỷÿV{ •í­ÿÖjßã?|“ÏpÜëüµÔ¦y± }ÁÞò/£¹ÉÁCÚ>A~[<òBº)ÍñW’i2g5™B6¸1d¤Ö‰i ¼À–‹··_ìmçÅfKŠ„b@{÷åáÁQg}¿Óp7Ås8ùâ,þáy8 Њk@àðöéfLåŽLdþõÁ;LPS†qò+¸Üz¯?m—.•¼½ý¸Û¸,ÎÁåFÖ9mk,ycáv¾Jï¾±÷CMõáE‡·ó™·05I¥Qüit1þÐå =Þ$žíXßÚâ£CÇeE„[»Ê©a®wIO¿¬Ï°Jî±-‘ÍÔs&0:9+#+ÃñxRê]N1L{EÖ•?EF«n&…êí;¬F´S i”Ìä^K>Úà†|1Y3 #{ †4JTG1åD6Hø'Š8Dóìÿ—íüáÏœø?+++k~üÏåú÷øŸßä£âÿèŠ÷©C5éà> h{—=l ¨w>‚Ö{G ‡õt»¤¹à˜ÿ¶î>R}À­b÷:lÿ}äÝäÜ ¿Xo¿ÈA.605³bä…T /õQÐS-Ìéo¢«^ÄS÷ñ6ºÑ[Þ ~ËÈ@Þ>$½ é·˜.?Úý …8Bãü—“ýùÀ'kè‘BpðN¡¤f‘tÒÉ/`íO6;m~wøb—ÚÇG›Ûòywÿ/¶3¼5]½µ}Ïx èRž*>¼rãÓÁñÎ øµÝÞ\?Ün« G¼à—½Ü·!—ùvZ[åઓDmU%.×R‰Ë5>Ö¼§–ÝC!ì+¡þµ@}Ľ1ÑçÒÈr#ýàÑ4a!Lœ' GÅ^a%Á_ ù±W¤š˜,Ló¹Ò<÷ôA9"§Ñ8rÂ,“qÁ”ìšÔ»žñòÐÛ†TQwÈ»ô^xÚY#w—œ4'ÖF²TðP¬RÀŸö©‰ÛSSŠib‡îJç~«FÜ"uióo•MÔ.Vj²RÑ^”•PUîí–6ºeMÌè—úð-5æÙš$kyÅҺꣲ×ɪÖEá’ }Ö¶:Å¢ %¼ÓÑwÌñî,ØŠmªÞ 7ªrkgg/ÆÏ "t'´Ã;¡á~(Úâôö…)´)»¥êTŸ†Rv‚º€¦f 8A”ìam‰Öh8¨ éDhº+²<–ãÙ7;Î6GC³Ž¸Ê}"LkñÐõ™ðh†ÑþB³¨]<¡î¯´ßc¸išIµ0ãʰ¬×ú4çìfo/=lƒ6åv±æž»¡ÉãäMÚš'·v9\ÇÍ@–a4øìK,Ÿt‡xÒJ šƒÏ–Œižs‹„w‡ [“5‡^CÐù¨âÜ\FœYgäì-]pÙÏeŸÍ)´€EÓ‘ó ×,i*\fÙ©ˆÛðÌ\Û°ÏYã¸òÀÇ¢¾@\îèõ@ŽÂRð²‡à5âVü=Ýßð»PÓ*Ðõ»¿öÕÒ‡•´ÏI롤mNÛ¤m I2”¸#÷B‰{’êNQ¦í…ð$Ñ ÇcÅñ8ÈR&ï„R7åÁŽÍv(µ­R7©‡mU¡üÀ[N¸@òkÅùu0Uq~½i×i«Çéàh9kÒ÷uúz0ýX§Ówtú±S“…‘°gHìdØS{šÇq`[„Ó·M1eˆ  ìí„ bÛDF9l+ á<aÇ{Š@8ýÀ”£êÝ ýH¦ý*“ö]ÐØ:uoûWNÝ ¦þ*qw¶CÉû*9”¸£÷‚¸;ŠñÞ¯–Ô‡ðæ'3÷ ½fktØQà##¸eÝ2»¼lÌ­îÝTò{9øë÷s¹ ƒý\š£êßt fñE˜BGg¶¹ÏËëôzÒ¤²œTTÙá©ja:w•%Ü×™¸‚ØåÏÝÞ-%ð×ûEj?·ôŸ¢"ƒ8–©¯Í®nìZ§ÝÆ}™³g·\Æ·²v~Hï•‚¤ÚýUäÔÏjÞ‰âuGg¸$s=Ë(¢qŽË&ð¸úYqŽ»x9ê_s¨${ÓM*Ø o»Šý­Lñ@üÛpls}Öä_f}„~Áë,@’}«¼Ä‘÷Éèï·ß-íŽf»£ŽyE@år¥ß¤-?*Kòþôk¼f]Pž23C „.ññ¨=Í‚eø5€‰äj¡¨(âBxaÄm uXì S.¬B<Ö™1KGd寓¼8ºO_f†KŸ¿Ê<âawÚA_‚x_g3އåe¡_ëp¢© Háé•öÁËmߊ§Qo†ë0ÆwbJd™Ü’é“> t?㙸Œá²%Q¦æ`º£8ô¶µp+™µ§=•=Œ;…A¨±’|a3×™ìÂ@¾²\~óvñ«(ÇöûËî0ž}¢+cÏ»É9ݧ}ß:BåˆÔ&#³âLëÍø×4ÄT9CÎZeÆhxÆÔ¤Ai5¼LKj‡H‹aö 0è‹ÝPZ]yo²Ô­ð÷©ÌšY¡†N±¬ˆ+ ÎâðauqӇļ!~ŸihͿ٠‡,ÆAQÈ("ÀWwEÜì|>Ò÷½©T\^¡ªO]âyKn7ð,Wñ ‡§u8´j·w0ô]қƼ¯•(òÙÖ«êE¸ˆ—ƒŠ­–Aloív]qïS‹~â]ŠֶˈõžaÜ¢Ó4—½ Wî*ÞÜÞÛk{iHïO6ÖÛ»mw®p7à yaÐ9Ö÷½½Ç`[0· q´½–NZ'unEaãŽ}-¨ #) ?bºÞ@‹SñÊÓÞÛjo,Á‚§êéX¿;ÖïÔ÷õ°åM0²­¢ÚîHíÎ õ ¾ß¨àJÕÒ\ôÓ+ýÔjii䳡ã ÒÒìô“BK c}_æ”BñèÇ}ó¤Þ©oóf_?¨wo؇as̓沵¥Ô»Ž~ÙñÞv^ÛÏ*¥­jŽâÜHý²ã½Õ4dÈþ…ÁmÌ“¦¬ß¶­·ÂƸ«ä\ºðÉbs¼¿ûò¸ÐÍ]õzC-7aZŒoì% /ŸC/‡.“^¯›µ‹ËýŸ²qå+O±ÉˆaŒ“HiZ{ˆlNü76éGͬÜã€ÀçUrDɶWt& ¥ó™ù<…–É6UMÙü;J;gºîdmå—ÒN\ú‘LŽn×ÌpQÈÁ¯~-`­ë· º©,óŤŽnq’žæà:ñ]4G¢Ë%ä/¡°õWÖŒt ð9º†;\—*áç–'"zƒ'­ß‡²[£Ÿè8Ù÷2*dW•Yt–àò¿Vàd‡Qßz'ÉÒ.ÀÛ¡ÐNDDù­á»Mx¾ºâï¾.¨+ÖŸÒC\G ‹šú±'ûÉ,E–[–OvÚ+8UDyÌspx^?Ä 0»Á½¬@ ¿k Žrô<½v&tq£1µV;ª]ý,‘y^ŽV¹Bˆ‹*4?Ô¸WwQMÕP/0KÐÓt=}¹Óte݃s<—ëÄ-;»ÊôÿÁ¦âË\çlÚÃùÄ‹»Ò÷âHgÈJ—¢7¾Šc}if²ÜÎÍÎjxï ›êÛ¹Ý9ôê6½/ró˜ôdvw·<«ƒé~ˆî •Yä0¾—ìãï‹bÿibQøÓOó¸g O]mÈÍÏ*½ñå´G¹Í„ˆG¿å¥OØáH%Óv(' üéØKºÞ§ì£Êˆ¸©‚?Qùxi¹«ÉM^(v—yÓëÌ©•âï+ÁòéûJ°ø¾ü}%øûJ°C÷ûJð÷•àï+ÁßW‚¿¯_ þ¾,; ï+ÁßW‚ÿ?{ïÞׯ‘, ?ÿ§è°çFdP¸ø’àÈïb ÏÁàœl‡ß `bÝ2# Äöùìo]úRÝ3# ›°Ù]ôKŒÔ]Ý]]}«®®ËýKðýKðýKðýKðŸá%¸e2‰}4c©E>6æ®ÉìwdÉnXtÇ+ËϘ.—X'Û*½[ŠV‘w2™Z¦d3‰_²%YÄáJ"d2õ«™ËeÖ@dwÃì®—û™‡¶¯¥šwüª»¥ºwüÊOýâÏdÙÓ ä3YN¢ôÌ"t*IûÌÒõWäÿ÷¥Ìèù9{&‹žN\ù¶ÖYcéc‰4½J¤ñL™kAæšÍl{Hâ¾meûbla#6YFNïrõ>k:×2óùÏ&åë.öNW娫ÎN#-$ˆ°ën“r‘ÉÞö)käÍjôNbñ û¯)ö´»ü±öþ©dÿ·öèÞþïN>ÿ”ödÅçìÿLp*kô‡gÍϪòl6Ù¯Ž'ìL Ö¶'çÃ˯|ãgã$ëàã,9í®ËعiŸo_êüt”n\bkë†^n¿¼iLJ{7-R5hSK½xõ°G(׫-¸$3ŠßëFö–*úù–ê™p[]»µš¶¶n©"˜Q·…Ì´ÛªŠgà-ÔÖÍ“~:çû”e¸E@çHµ×õY£"¯ÏìNÊÌWêó’N'ÜéÚ²¤ô û©¿Š2á–8K™Š`Z‘ÊSa*nŸS(Üg)SÚ!gj¨´IÎTªîp«.HÜeå‹ zöøžb… zå+UÜ Ú•ÑÑ®¹¶Jä§ÊßÀ£^û!÷ºÑž-¨_zÒmއG´DUÞ˜¹òÈ«[‡ øƒ™  þ³-Ü lð{µúè& *×ëa¹×Pá2Ðoö¾W!´v# ø8õjp‚NÞ)ŽÌúÊÍkPvˆº7¢J¾WëkŸ…‚rÊjDÿ Iþ3¯\ü™ZuÃ,L'`ñØ¥`ÙvͲÊ–›í~f{?×4wÂ-]OÂÊZ%tcÅuŽÛ™fÈG üR¥îfÉjzÏ„i÷³0íÞ*¦‚G¬*qçÆKž±î¨XèWÍôÏí‰d-k[lóнm–FkZ ¸Ð*"j˜÷-¯wîRøáŠ#øÑpÇ‹^ïyðg ÷ó¤ú‘3€áú › á@i3Á ‘S3áŒúÖ¯Ù3[i8V|XÍ”YðŠAä,ñt:é%þ¢(}psh-ü¼«AÖ~Ç¿®ìà RoZa€ñŠãNd+Ø™¡‚ ‚®¬ÀtuZ%fŽÊŠ4SÊ•‰À°×Ì‘ê*õ¬Žj²}~Tirv³¼¿*Ò‹Î`Ö>’™(ë:!Ÿ‹ÝçÛG[.â²µ‚¡"ÎÎ[ë«1…bm ¨¯è¥7¹èÄÐßEë n¶Á¢[i¼•tʾðÆì-^_.Á̈–¿ðJµ¶‡¸m¶ò´‹õuðÉ|&at~] ð-(Màäyr½òÉÔˆƒFTØ©¥Âúš&ãõ2v^•° ¨"€¯WA÷w꺿s·Ýÿ¹®÷˜Þ?нÿ¹4ðoK(NèñÏ5þùNû[Ú*Dš?Ô=à/ë3UPÙk±ÉßÍ4ŸÐïG¦ßt¿w¾´ß;µýÞ¹ã~ãÉV×ïÇa¿”û²NT’@°wB:²?‡XðˈÀ5TRAòwC†ª#z"%¸À—­[I5|Žè¤Yûinä9Ð9‡7Qé`'¾ «(8ëôYÙ(¡ý¬3ÆRzÇävlÂ'ÈùµU1»ª µd–sX M1;Ñ+ãè¦Aã­£Àó,‹Ó—/úåér”Ž›ðÛ°{,á­Ëú¹6Ç>NÈÛÚªÍr\E1·ò+2½õ ò±ï0¡¨ï(Œaõ à׎IÝ‘©?ëÄŸE÷S_ÊlúŽ—N}¤øö["•»‡ÉðMBs×þøpOæØ~Q&ÿ²/ã¤ýŽÞ Zº«Êï&o}ÅÎ…¢Oqšl)›cž,lÎC[âœYÛ5§ý¬l >^´ ÕljפîÈÔ|Å6¶R«'ñ¯ú™¢ÿÑöGË”¼œ^?Sd²þÇÊúÊãÕ@ÿcmuåÁ½þÇ]|¢%U3ÐóŠTCP×ñp÷ÅÇ*j7ÔÚÊʪz†ï@{Ä]í]´(ê8mŸ†½áY–ºV˜õPJ•(8¨ßg°Ò ætP§üñ”Eè®í)rÒ;Ô’ŠØÄAä4H$Ô9xùê„ôœN¶ÿŽ{”V ©uæ,2v=«_Êœ›»„i?D,\ÕùÙl6©¬i[Ç8.ÂÉ=vzBi8ÖˆÝfubcv…">!ZÍå#!¥}ÄfÀ7LI(ˆ:¥ðæ!P‰Œ `ÞÀСæ­ì4ü挒U‹ZUõEBáþ׉ñoõ™Âÿíäéo¯òáè‹t€§ðkküßêêƒÕ{þï.>†ÿóºŽõ[›õƒó&O0àÔy‘Ú×°»v‡y?a]`£(Lí*øÿ<§tnaaüyYmöz逵=†Áâ¹óÍcðdÞ9ÜþÛëíý­ŸO^¼Ú><ÞÝÊGó¥CÕU5o/«x+„–N“Ó cë6a3¤»«êèaÌCó]Ìw+¢­(é]&×Åü¼=aÆxå Á™Gùh3¶uF˜¾¿éßùé׺…øÛººÄN¹ —¶ârÂvº¢¡ %ögdì‡=Æ õ݆U¦¢6~nœìR|wZg¯nPû³Czs'”kÐ@”¡Ê`hõ6 Œ¢ðÊ¡¤ï1vî’ ËÚ-ÃRÃ’ïT6 ¢j%Äè^Z–ã1þe”¦ï´&4Ûzv¸¹¿õ.’gpKñáCŒ§ÈNœºäl8†‰®6¾Ÿ²ñ…=$Mä:$DH£¬¢H5Eæï¹Ž?â3åüÿRÑ}¦œÿ+ /<ÿÞŸÿwò1çÿmŠ~*>å=M–ìøêÃV*ÐRâFmýD‹€Â"Üz»ð? ‡·U¼›Z×™ ®åL©£ÅðÓÿ¸Ø§ÂT:€ø—ßt¦¬ÿ£ó‹n·—6‹ììóÛ˜ºþKüÿÊ£•õûõ³þÅ@#û]ðO41q¡aI ñÕoœ ˜—÷BF‡²Ù£^ïììm[¡l½äu^‹˜p±@cõݦµV§@¡ƒíh à«r(¢*Üp76™+xR+‚ôả ÿš/C³®ÿ/±žvÿ__ ß`ýß¿ÿÜÉÇ»\ëÑŽv7üût°œˆ»,›v)?AÊOü³¾æ%ë6ðÖmZkÌOö¥:moxVÚž{Á ŒŠ4VÖ¬·ÒGbÔj’º£¸©U8âvôÔ¾OÑ¡FËDVyÁñ†]ÂÐæâôf·IÎ&>$qp«¼E5£|o‘/¸‚”b5‹~ìÁ޼ױ·:r¸ó©ªMÑ$:ÕøÐƒü½çØ"—ÆÑ·ׂMR]-¬ï­ªj¼ÔÁl‚³lº€GÇš/jš§K¢ŽSŽ¿ ñ»9yÝbgS::äG‚èO¾;#*ÕHÛp÷&T·M…CÝ„¾Sß÷né'woVâw%õ'âPEÿn8];òе+¼©S>ôß³¼®EC«4±3(<²»£rye*huEùSÐÿz'ôû™rþ¿JÓÑùð €)çÿ£u`öƒóC‚ߟÿwð‰„ór¿ÿyŽ>ò‹Áµ8C~#÷çž,²#¡ Ç*ídã Gò#ÜŸ^m®5×X¸-ý¥‡ÞBVWš«ÚCˆW÷y<ŠÉ\Ñ;̼¢ªò#Ø–Òû@iíóëÝÆ­Ìê'lÿ¸¹'ê]o>¾a½::8ÖÚ$íD[k ”> õj{ûÕȬÙGÛú£æƒ ­¿‰Ø²g,òp¶†µ•‰5à>Òé,%*ÄÁÕKÇÊÕ´Úüv*bYñÿ€›Â×{<Úz)™¹EQó=*!tuêJC'ƒN/e¸nÒ+Òù`T>Šúˆ5£ê€4—áý‹>'®Ôd‡¾Be ñŒe$\¿ÍÜï<…c29…ÞŒNVÍé‰óôýÉwøFq²R5ŸèÉf »ÁÉC5,>!×Tôþd%†ŠWñŸµFEã!èßí}5 æCj ¶: ,'°µ:°l@#V$ýtk؃­õ':–…îÁéÈê–$éA”k­€vTþ–ú®¦º¤2ï7XÔ‘ù  qæN£6pºïO#¿÷þä?r'PlÍMµ UòxÒè(9Ž&@frg+FbjÖG¥ß¥¦Ì Àà @C@Δߟ<˜TY@ÿuä°i¡à0 ïRø³&FãA}E“ÇÃá½>oƒüóçˆvÍâX yôúÙç?qEqƒ™=!wÂ$˜¹šŒËW%W`E·³™¯Ï~ˆõ†ÃŒêEž§èI”ǪÕí7«ëøÞÍ%f̬۫Y­6€ÄÆB¬ÕNtƒÌƒUš«+ Þµ«÷ã SÙT¥wýéÛ~ZŒ´ö Á­Ÿüi¸½eŠ=ûÎ`úc–øSÊ‘_ŒÉ 7éfì%23m4Ú8t÷)¨:79ø&¤Tƒ¬‡S…Û­€(5$*²àÒ±zóÖ‚EÄûÿ—|ôý¿½Œ>‹oþ6ð’úº÷?øØûÿÃUH_]'û‡6ÁçßüþŒ¿þûeï½ágŠÿ×ÕÒûÏêÃÕµG÷òŸ»øDKJŒù(~zï¿['è¾ùˆž°ZÚ³+Mr|­ŽöI’Ÿ™3³¥6_pð´Q˜Cw@¿«b”¶³.´ŒoÒéYš+¸Ä†ø#‚ŽÍQÙD,hŒP1:(J– .¯Dmiìb>íÉe‰ÅX€ÑE; ß±VmÑ€ˆ‘+•kê"N§dÇ"†÷®;¾Œ›eÂܵ$ªZް¦ =DsUd¦PtP+Ü´‡@ÌEPÛM­Pé.¶M¼AÝÅa·‹þ¬¦.Î4_,ÔÑ+Soox¹ìSbžHæèšäi¢¢"M žÒ7{½a›j;MÚïÔi µ4šóŽp¤ KPø€± ×ùÛc¨‰w,ý(xžŒµ£áÓ”q§Hñ#OµÍG§(k¦ÍX]BYƹè£ëq ˆ޳†ý!J@Ǻ…ÝÁøèw…ö(ãkCÌ<=¸&©Il‰âNòl~‰ÎäÁ³ì=Ì0;Ö4ލXÁ¸$¦tݰME}w@$˜AC ée±A…éŸ9t‚377·¼ ¼¢‚ùFæ7¨…´‚¹×ÍÚ™¦•Á{8¹¨Ì…q§¤¸´ƒ©q™Q'ïtõ4d݃¡¯o!KЮšty’Ñä¸I‚“gy”ÍM"Y(èE-Mva|ÑRm ó‹T/`3u1¸aµ¡C°GxÍ´;Á~hi·‡_/ŒŸ¨!É/3àåÏÒÁ¥)Q5övÊt»Üa:þÒÀ´eŒQ>Ë5D»É•N%Δ!A&’DУ´[Éœæï¡nÑ9´R:d»¡çÆ9B]?»Y5 Y?Í7³{¨w:WÒîÇ.z$¤øÃ+Éx ÅÑúƸÞO×~?Œ’k‘†Ÿ.–ÇY?UhyÖ“e`Y¤í1Y¡žR”¥RÄ#»ŸÐ±tðòåöþ±rñ5\Û°n±ºÁlü€šÙ5Šâ¢Ï>®²ò9Ý<Ã#RT?Ú›ç‰W.éÁ²ì\í`©u†={5lhpÑ£©aÖ ²ý^žmž6| ^#Yø]ilËq=O—1oùXÎn‰z¨³þ¨Ç[¤é0Öfæ¦ÔŽÞÅ Þß3;÷è9ÇXƒ¡n:†¹‚s×|Ay\ ôÑBœ^öÃ>­°•såýäŽs] HÃ;qÜöÞ‡2ÀZÌZ3çlìOYN+¾7„þÐ?ܶ™zŽÐ–¬'~ Î.2qšØee$®Œ¤ß0魯¡d7OÝŒ'¬lÃѵ™}¤­ ÅyXwÙ¾{jv‘w 8íÊDµ›:ÅÅrGæyxcÀ•g¶[Ç.›1,õá$x!½jsªM?@2㌮>½4‡ÅÜŒ™Òp–3%6Ô¶ÐFAëBÆ¿ž†Žz´”>†ÕQ4Û'” M»æšîTéÀFtŒñŠÈM!ž¼z '—48Q{UÇÚ«s•ÇM¹¡ é:Âc·Ðˆ—ÕÁôl’‰ŸtåbóVf‹ÖŠeê¸Ó„Ï‚²\M°®”×4gñ\Üðq¥ò–Gfºm§š]Fß86å‰æÈ™íc’–/òû¨Ä{>ÏXÆ(3÷“*†|½uÌ5„6V2ù¯÷u\N™MùJQ´ÞR»'íó$·…wOàÒ‘Åo‰ê.u;øÉiúô²WØòáD‚¼žá Fxv0[> Z_ õÿWVߟÿwñý­vÌõ©®à\ï\ôû×*"ã¢óa¯“æ µàËÉŒÄA×@7ç¼Ëo ÌV G×yvv>6ÏÊÐÀŘ;)=cg#¬äèåÞ7ûÿ—|£úÿZ⸅¨bgÀÛ¦pxlŸ•YBDªUý\_28Ä­Œn‹ICm<µïÔÂ룤,ôÔw£çj+ ð_‚íU¾ü²k#±Cýo×µ°¥IKW=Gé'…<¨e^ý†ÙRëkAϾ\ìc{31Ž)6Q.3«˜eV± éW²ØdfŠ3¼$ø„Ë0TúæíLw^†¼»CXïÿ½ì4Oòë?þ|½×ÿº‹O0þ#ávéÖdSô¿V?üG°²vþßŇ/[rÌ?W¬9AàšÈ´(@;6ÀNftP|2ôJ¶ùlwo÷øg_Œ(¬‘ºNÏ’Î+›L§¹RÛ `&®ü§ì¬C^ zÙ»´w-€¡(\°zÂ4 ¨Ÿ¼ºâƒóóž'€wp£´ ÔykÁr,Ôa‚šYè ‘eÌöý‹Jú¯_cM”Î]®ky*ÄÒTˆoD%Âx|r÷M‰í1y¤Z-C¡eøå‘BûJänšJYFÐöOц"!—~Î(aç•£m„¢¯oz4Kô«­zê<½ÈjY`“wé€/HéyÚ¡Œyùè<é¦ô;̯K‚pF ®ác€iRw:V¶^Âχc›ß5é®óãáaJV¤†lÀËõD®èò%ˆÇ+œé!×[ZYB|F;€-Üt&¤ Ò¢YYÚZ3P-Â¥¯:ä.%üšM?¿tPÍD”ÑŽÉCÇo*JbuJ•è :ÉS›°ý·×›{FkÑu÷|¯°{¾X 8ÈÃG‡„'FÑTŠ-úô3{Pi­\®Ä þ!;@ê\V€\XC¯"ôjƒÕlP3 Í£qÏÁ{Çà}’g I7O‘³¤2貤ÁÊs« 5Pß·”ÖZk "ŠÂ Òèð/Á Õ6´&Ž?ØÌ­S)†[Õ¥¸ŽÕ°ô§QõÄKÓ§Eø‘pŠG¿ÉÛûјq»åš"Ä1¶mú›¬ÌXN„•Ò« Ìwß}WW@o ²fjÛ]©ÚÀ´÷Y4†$KÃÁ J2Õúl°p˜ÑG¥1ŒOj+ ÛÅY°§m¼eVÕÄþ*çLd\–êéLEõõˆ½·}t„8rc>§Õ5A‚αsr*­é¾Íi=jÔM/›NÍsºêdï”ëð†Á]bÎ\‘h}!*ZÅf¼8ÜÞ<Þ>Ĭ` =M:9cìÆî½ÄuZîæ%£ÕP½ÒüÐl†Ú [ÛJs%ÌoFœ½*²5Ý´W”2Á=aMu\¢Ùì¾ÐŠŠßc ´>gæ‘Ùu5í„ †—ð1[6¥Ï@Þõ¨ŒÙ?vsŒè°}ʼ>6 o:;:®¨©•vK»©‹}\q@R²¤×Dºï¡( ‡ôU t3pÊûÆ|Õä FÈ„jŸiŒV&ѪËÖoKoô)ïârÇjá›…X…é·æ›ǧIÓß.Ø£µ¢ ¯~ºXŠ_øtý l³\Dr\·§%Ç•cذ.9Y]¶x/á‹XÃB²Ð˜ uª+ýzbM‚Ó±OÜÂ^ ZþÎm‹·än¡ðÈŒ.ư§ ¾):±FrNÛ&t¾)pŠFe\ˆl-®XÝŽ:hûÍ'„;Þ0i`Î2ZÜL¢¢cÏÁ9³*±ø×xCXÂRËŠÚ}à p½éu k1-›9Z}¢{øÐ€È†·h³eZž~ hŒ;þÑ /!zü‹Ë8¨˜\œÔÔÜ5<渳¬ë–›ñš_1u?•6[¼ðú«˜+ë,ó†ânV# RKé‚&i™ÎS™´„ÞÔ.z2é¤2Øö.X+ÿ äï…ìnShšÿ¯‡«„üo õ­¬ÜËÿîâ‘Ìî†öÍÍvïŠÈP¸ú.Hšµuû³:x—É;ô•°TÑá¤v‡›ûÏ^žlnmÁÍædo÷ˆԴ莮›‹‰ÂYvâäTÞ–âAÛ²—zrÃq‹Qmx•ˆÂ;ƒÃ&€[~jœ‚Ó^tÑë©R]ZwÝ¡‘šZ*Az]Ñ%Î;„I¹ÚÅÄ€Œ{µ ^}5Ä6 o±•Â[‰ªª}ÉHУê…ÔÁRwgFª!b„h¨‘I”6If%e&Í—ºÖ‘+6äˆtwX|Yjà´ŒP2*•Æ0v•å)¾éó°×é‰rKX»hú´Y<ÿŒâxWRìÇ«š5‘vãiÍút@+ZD/þ)2Û{Û›;(«€Œÿñ|[ÿ ì%»2ðgõ*GŽÃÎ(k8E+ü‡x\H>¡;55w¯Ä9åŠGücpŸ0_¨Ž.NQOl4.ƒ#ÆÑI|à*%¨@å8‹÷¥cã¤eïëût1°Žl²ñàÊñ ŸmOu¥P]¶¼ï/Ö¹R!ÜBç½¼¿( ÞÁRH¯YCƒê–#¿[èL3e45N¶ A¢I…®™„W_FDªLT¯‰y…Ô¡&&ÑÔb"+°ô¥:J$vÇ ½ÀªÓ)ñæ­æïÑÍ…ÖËÐ~ù4œ>qò»XÆî’$Å$r8„?BrÔ¢nlô8³ Øö¿æ{Hn”÷b–nÊ)@§Qtc3Àßb%c¨xÉ ¬«á¹ƒŠöéÌþ‹ ú¯a2Y ,Q&"ßnWcžP“÷Ì`‹ÖIBïáü‹`¹Ù,Áé\±&«@ˆÞ亥^F¬k¦rJˆõHïá?BØ!t¢Bl*a£«.ê‚%nQŠðW=VÚRg°EžA C7|ĸABp£¹èáf½º¨Á1¿e qD\+qÌoˆ£aOq‰Jh¯ãã g7æO¡3ˆ a*ãNÿ“º" îÿÅE1º]ãŸÿ3=þÏ£GƒûÿƒÇïãÿÜɇïÿ;ü~ÓI{Éõ”ûýÑë£WÛûGh§À÷zå~œ<†•úÿÀÛ ÞŠŒº-_Z$ÌW_ñMÓôÕ4P\8‚í‚î.~ÛVI×»²œ_ ÞÁòüqsïõ¶½´lí½æø^£s(e+ÈÓ®²{t¯A™ŠRë­ú!tÄ-¾§þ½9J)Q¿p?òÒRç[7µ\m˜ž¼|Á»Ý&XÿÝì*í°uåíù€›¦ÿÿàÑz¨ÿ·úø^ÿïN>GÜÝTi7+šìÑÂ.¬ê°¼nOØÙýûöó“W»ûÇÁ¦@µpm:ÐjóþØ+—„Ðj^VT%ò,<=×ágÃËVN©"×IóH #ÈÆGfñ &(¶Ô’aI¦”ªÀç›Ï/ÊOEë‹à]¦²µú"}Üg>Á~ruã¢NÔg•×h­ÃfáèQ4lCèÂ1ά*(šjÊI"µB®é•y0w*‡蟔ɛð™´ÿßþ÷ÊÚÃëÿ÷hí^ÿûn>Ÿ¿ÿÓ¬,ñŠ D´ ¥í¬ŸôNN³qÁ«ˆB²ûgDU$v0nuž¯u€‹úþ{õ”ýŒóïÿR?ÚmÄ4Efi¨üy­Ö´)®›¸ðÍÞ£¬²FPçÄ­÷ã& Qôk¿úFö;Z€lóûï] ‰IOŸº¤ÿR”” :§.ñãGJæ"°ÄTøkRqï¢4½%™t:)1}<ÜÕ[jÕYë³DH¦J%‘$¾á teårUf=ð²ÖÊÇ1é©–ŽaÖCbɦpBèÊ š YMï¸Æîèb –¬è`e¢ûñ¯òÉ~j.E"OýŒµ_®¾onPT¦{Å3ì×yw,ït=H†e¢¤7àé’1€Šh<²†$Á¹æ¢$>ÕJ<‹fE\öÒ½ÜG\{Òp¨~­"(ÏÃÛ`Ìá·léÌC¬!¢Qʇýu •Õô(jŒÐ2ì7QiŒG WÚ•¥#¼k‡ÀeèÕ:â ¹‚#Ó¢içiïÓ¼‹Ž°`¨`ãX°#@lU”Å¿²”æEÌôüÕb“ñ˜dhY˜’ÌæöuÃQüÿ'à‚óÿ<)Ο%gwéÿ{emåAÙÿËã{ÿ/wòaù ¹£(òsˆ³¸ñÉ÷¿6~8y¶ù¢BÓã49sÛ9¬Ý1ÆbþÀ,¡Uaî\qÅ–†Hh•Và¨J¯ð³K¹Ÿt9-””ʼnüðògÃdúj"§íwéøáj ²b›ÕRü:¤I6(Ò|\jÆéø€û€ö'Á)ˆI:C½ xÃz7QAfr½NgÃŒLÅ¡Ÿ_Œ„6ˆ«VBµ{i’—ÇD6‹^͓̩æxøùú;ƒq¹.;— œSõ°J‚, 1uL:£M]¶RI¤¢>¸¶©ê= Ò§¢Ñ]Éd‘Rɱc~-º|å6¶dþìþó%Ÿºóÿý¿­¯<\ õ?!íþü¿‹ÏœÿöâþO|¢‘¬@Õÿ˜c™ŒB>¯ï‹IL;á½Ìóœ§]§Ã,Ä)’GGM÷;¦7›§H ÜjŽÛ Œ°¥(¦5–°ÑøúÕFÜ@%pY¸‚+Òjã‰jãÓËWmú5ïT:Ìñlj…ƒ ¾ÖÖ>ðkxµ  bE¢¬3mº`@¨YÒ–9jŠdÃdq¬SfF\EÊ8~±!ASIóeî—WT{o8|w1:È·Q_{²bC0jm­+·H­úqÔÔÔ¦>gñÕ²¤á2ÐP뙋š|‚7¬‰¤)bþ%ˆ jxˆAC‚]Ôæš6‹àn¡Ëh[ëÊê{‚\“¤¯_Ω21ç$‡T'Éád^ÈTÇsž’ EwDÌyË™Z¹}›ìcÀ¼‘ZI^S€5`$Æœ"Öü“ŠÝET £p€‘§ëÁ§Ó]Äß0´Š‡Öm.R£ª¬p‚ê7Š61Àr§"J˜Æ¤<Ö q%d90Õ¨’æLÏ)¥˜Æu뺎æÝÏ ¡VIÕJ$Ê–sÀÕT@ã´ðaAýâ £öËU¼°Ðà˜•¹ÔFò>a«,Ô²+¬ R¨Hú´pÏþë~BýŸaŽþ•ï–ÿ{ðh%äÿ<¸·ÿ¹“óG<ìÓtw÷¥˜‡D(ÃÜšàØÛ¨½ˆ7Ŀ⮅OÐME}áêíë†íôS4À É¥iÕh|oÝÙZ,n±ÅšÆô@Üp(ÉðÄÓÚâÙUˆãnü×jÙ£í,Ð$âA޾W¾(å’µö¢§0JHþÍÕ[–è÷jâë·Z³úJ}¯®µ}9s}o®ã«rÕ=©î,Ðõ²1jRÓÓ µJ¯4åø¨a¯66®ŠX¿äè¤">!=)#ëY¶Cc"ô­RÌ`0Á"Â5‰g ý´ƒÀÜ£ q4×MJº³·ƒI$qúüæme:)_ll¼oÄê”~\Bç Ÿ”8 0 —< ßÞcû4—ø3‰¯,'Õ·ô-áΫ;0µZSz¡a[õý™q“žAyÝ5×7(Ú2¿’eÈ¨îŠæ¡ .ð.¥®¿Ž P/€ ËpÑõÆÆï†]PЬ^Q]³¦¶ËI‹˜{öÊ‹SR¯w» DvJ68φ»\Ы۩WIEÝ‘t¿ÝkÌß¡Wλû„ößéY‘Þ¢ê'}¦¾ÿ­¯†üßÚÚƒ{þï.>ÚþÛDFBGÁBíg¢¥÷ö‹Ý£ãíÓ£í’7O#%ãF!4SódÆŸ ]ľ‘X³a—mTòŸU ‡ƒõ"{’vØ vB½âÍNbH®ãθ}ùoq3Ásý[çÉà,íL€_ò´¸•›–‚ÝL…4²¥ðKðl&žÃ>ÒµÛ§-W®æ]®š²‘ôŠý TWYã‹—V¯D&%C°p>ˆ÷°Ô×D…^¬›;•ˆBŒÎýµ78Õ£ã—X¾q‰¥ÙKÜ‹{þ>5çÿ­Z€Mõÿ²^òÿ²voÿu7Ÿ çSí ‡÷ÀótpÒ&f½=KîÀw>‘ž¥ìr"`œ$ ‚7ìCËm×>Û€—åß"<é€ñ?y+Døµ2öÕ O0P#<§_|̽nN%YBYŽ`^³¼ ¾*Ýðííþ5\Iê.øòö§ë©J|4ùÆFH"à7¤žÂ ÙÖæš&:Áíô¢ˆUo¼‡p‚_ Õ›¾ðº²ñûBÜ|͵—)}¿o¸»¯-íôÃBï%„¨õ£×Øœ]E¿â˜)ç¹¹ˉÃ9L&,ãjÉcÎÃX‰ö)ëvÓœÂ)kSY—Ì…ù¬Ô‡r ÒøÀ¢u¾ˆ?%µ€èc7×~2\‘.çˆgž«ï-<Ô?µFÃTO±ÈRC6€}@lÄ»fsdÿ\ÿE6 j³gí|Ø{(`k¡y\”æNÐÜﻆ·õÝ-hêTö²’·N.æåD ,³ovº Òw0ù¼XMk­VÄ{‚bß#¦BHg:9ú ‘©¶´ ÚÀNzÅ@%Q¨°uÿà;01¼µõub; 3Nü2æšÐ²Ž *ž¡ÑWj®w#.ª+u Ü‹8רÃ?Æ p¤'¡é)C}j¸aÑ÷/õæmUsˆ]Û¶Bië|˜õð‡ %Ø%ÂõM.ŸrÌ$vª·vð¦):ýÍõÄ^Ä™MÕR]4t8u5s)4Ýñ=h ±il#À<¦8áR¶Gcáõ ”k†} fˆÊÛ-»§¸tŠÚcz×f¼ya@ëE Zkvh@ݼ¦sГêϧ:„•ðíâ—`:»6ÀQ_YùC¹ùa§‡É™6?xòóðÓ§W[9=ìôò‘+M9?òþ{3?Þ–¨ô‘²§ÌÒ©Y懪"ˆHÅQ·0KÔ EUÌ•ÊRNe1®˜0ÂõZâ‰ÆYUÏ07B{Ä‚SA6Zs{Üz{,x"Û‹6“ÏÊGfÍÖéd1"S˜‚Žz9ÂÃÌm»ºYƒ@r%ßCO À·“güZü#R |â…À••xõb̵?Zø°`»À,˧…· ï-Ex_µÌŸHG¬Ž'Kò`ÿ§¢÷ÿqž Š„3/Ÿõ.Ò[‘Lóÿ‚1¿üûÿãµµûûÿ|Œþ/ºÑ~— :;Ié  —õÙ«&_(pмÅ$}àc7‰`Mˆ_;ƒHüÚžù"ƒ×ºÙý'‹_3–ÛÌóäZ”¤ßPÖAú;Ãq`>®hÜï“Ææ=ŽŸû©Ðÿ‰žûÉèÖ^§½ÿ=x´ZŠÿöø>þë|xý›!Ÿ` ~I­àË×{Ç»/7_…ï¨Ø¶I}ÝΟÊ&0D®Æ:°6ÁNp ¬g1X[k;Xl Àákœsð<¥$ÉXKÅ=#Àªâes@VŸÐ¢ñÁ< #Âð¬5)œLZêbµÖ†õ½ªµ;¬/2ÙQwØ{w†kÉјÎ\C•y¢%=|múmÖl× ÈkšZl T…£§rS«òÍ»Æ%(,âã5*©0©ÿʶÏÿ[zœ¦ÿ½¶ò ôÿó`åžÿ¿“Ï—žÿž ­ÆXJ~`fsÀÒRoé$½•Œ­Üyvë@al§ÛÛ©²¹]¿ÂØ® Ìk,íŒýaŸlÚRÒ™Ä×Å*SÁ>½¹~K¦‚Æð©ºÞظ.BKD_žG–f}aÝh¤,0W»]aÏ dV bÌÑ MšÂiæTT‹CŒ7•òxº’.u­h4&£¡ÍÊú(g¼røhJõUZ‡t^ÿ¼.B1šî!Uvºü$ѯ°‹ë—­â,7Uõ!k[óõ[¾~…µ—ªÊ!Y0WÒ½çc–°á†h]Åc-Q“ör]kƃDEŸÊ ¯QGg}’W öóÃ~ÙøÐYþUô/Á©z¿ÑJú¾ñŸÉÅŽ± uì e`¯ª©X?D8‘8XžDÓ™þÕŽDÄÈNŠÈ`Ìc!RÇh H]pÖ€Áxê_•;Ð °“6Œý²„7êÆÀãô}s@ÁÍx†´ãÀ…mýºÒðïL]ãÆB;ôÑ”×FƒÊ[3ªz]6,ü—d©þ©>ÿ— CÛ^Ü™ÿßµµG¡þ×£õ{ÿwóaþO½†#XuÒn6 ¹¯œšïSûÃqº!sÔeÖÃÈî—ê4EV±£Ò«1zë~¡›álÇýy” ‰G—jÀÐzÃðtÀGå¶ÞÝNš`œíb<ì¥üꥎÆéŸï~JÓw…q?Q«‰¾¹¿p¼y¼{°äü[vÒa\•†^#„‘˜ÀØ|bK@‡vl{ø*ÇàS:L‰ñh1Ò‰ò!ìƒ:K­T@âÀ!U(EY#è \Õ‚[ñKEíÎ2>%8”aHÈ"•Þ“–BpñS–ÂÏê^ÖМºé98 õÉR·Û#{yrå>’´Çɬ04ç‹t€ïŸt^ŠÚš`«—aáâ|xg#TBáqÔÒ1ŒÙŽV2a$'§®œõ‰µ–(ñ€èѱˆ¹‹(ç4·é).É/ÍD!ñey=ª™ªÊ‚ÎO!2•^‰ÎB¢/5¬­‚ð×,æ¡Èj7Çã¤}3Ei[@Ä„‹WˆZÕ‚NþKZaýã>“Îÿ;òÿüpm=Œÿñh}õÞþëN>ÿÄç¿{Õ8m„Ü@ m.6—–Ù0o%¨aÔd~àæ A GP >+Gp–à3y‚›33q³°xÖŒä)SiÙEמ7ôòâÅ©:®P8T½)jcC}å§—oî‰/yå+û.ˆÛ÷GLmlŒHaC²yB¹`PXÍD mXÉ‚=÷`F¨~CMáCÞwшÚhzØ™\|%lDq‘Ø©Èô@ˆNÜìw‹‘Ã°£m¨±°¿-;‰‘(y¥ƒ’ö«ä ;$Ëï±Í auxõTWB‹è$ÀCEl?1› ŒÐ±å«*8ƒ°þíálWµ*Ô–¹ '¹èÆœžvlZ´)^›°„µ4®¥ÞÈNø>0Êo–*õ»Ý+—¹Ö€×¤?K~¦dóV×Ô÷A@:¦Íaz¯x¥sᯰ„v‘ »® ޶RZ˜m+£éÑÅÔŠŽR3Ù[C‰×G õTÏ‘´ñÄTGzë ÕÌq’µðŸX{‹ÿÄvLZæ‹Øõ€\-ÖRï¿oÁÿ±Þ[›¥½ïS(9äå¹øKÄ–±AjñS >yA #…",ŽëIn?•ëõÕùÒwå–>ºU“UÑâ2õj¤ŸÐÒòQŸa)™§Še”x $Oìk¥Ëv’›/šö´"üjÃuR5Ûݲ!ßżæ?å9}/¾“OpÿkÔ¸¥_ñ™ÿmu¥äÿceåþþw'¾ÿŸÃ þKL šÎ¸ÆØ×J`·6·~Ø>9ÜÞ©ÀU9?úiegÆc¹Ñ £lÛí]çÌýs±@Ué+Ú3ü|æ81w£ä.Iµ0Ôä‚ æñÆS¿;ÁÒÖÖrW.º',yá.Ý*³¥0EŠÄ0VÀWœhfÂÁr#oý {@ç¥ÉÑ$¹š®V_>r»Q÷w ɬïHÁ«eLJh`EȺÒ GXš"á`¬—JWTjܾý£'ðýç‹>Áþa‚îÚÿÓÊãõrü—õ{ýï;ùðþÿ<°Ù î0Þ§Ú­;Ìûɸ9-þ˳Ýã P<•ÄÆo¤9zÓÖÚ× f€„Æ5éJ|UYß˲!;¤"®³«†õž%ôdX¡@ *¡úIþnsÐ9NI½y2¦ =Öw[$[¿©®jÍú¿Kÿ/ëë+eÿ/îù¿;ùðúßæ,^’ð¿ó9›å£žecí÷Åm UªŸ›Š£=~km±Ê‘ ¿Åäá(¨Má9–CBR H›V\œ–vž–JÈÜËî@¿MWm"Ò wlce39´¢c†þËæø±}Ä ÷Q¹ð– äÝo`°Š¢Á×9ß·±Z¹¼ •S§{˜ û·.e3IŒa=uËÓëqÊ6¨‘+H¡þÖ­Á(dìT´r¹»(„ÿÀ­8™Õ<±%¬9昕K?Õ)XU£˜Áßzƒáø4ªÇrš8FÓðäý‰Üv²î5éÇGNc¡¡:‚\r;NN/z¤úªÕQbä3’ÚP{žJ¨ÑÐKB_ ]Ò,ÍðÏ÷F³5aƒõŸ¬µudjÜØèFÙ×&††“þÐñ†²6ÏęԜ5iÞ ^Êvoüî[Á—)õe3iâDÒ#²Ù„þ˜qjèQQß3Åù‚bГ'áíLõZ ¬·j$M`¤t*Äþç|¤üÏxûC9 Q|£ c¤¦ø>>ÜÞ>qv¿ÊpbïÒk÷c1ÑU)_[b¼ƒ¡…çÍž“zÁ4ižg kr#hÁÊõpë7/C -‰2dµXe°°°Ö¤Õ¢͡s¶¨¾³ã¤W´è1y,pmüGc(yêÏo\\ñ6kB¾Ã.ñ’qмqž0¬&˜÷†&–¦™x#‰wÓH™Kƒ˜IªÛ±VjG“>ßF}Ù%3F‚€Áç£Ú~ùêøg:a˨cµ¢Òý$Sžc0J‹ß-ÆïÉ%bѯ˜sè_ëˆMb¨ø}Ü‹ó†+,Ï;zÏÖÔà á•ÚøÙþÛëÍ=¥ø}•+\¤ØG¥ö¶Ž”kç.–úï9•šÞsÑq¬Å³*’Ý5Ía7} Ñ?” ×£hÌùËZd 0ÅBi_\¢Ûv†8`“:[ÙU9 ¸§­§’§¢BQ\×3Bi\rÛËLè4”áÙHÝ3ƒÀ§Î7áR\´ÛÜ1¿ƒõŸ²(÷j n4?>£Cò ²š-%{,àƒ,®lLœTÌw&ÔL*WŸž4-6µëÎø|Cx¾iZ“±¿1QšUïгà*PLB`6È`Ò¥´3hãªÁœÃwÀ…–T>`â_¹«´m>×O\_Ø~nÛïÍÞ¾±µ ›7&yŒÄ¶°ç!a|Tö¤9_/¶îÊbÚb66öZ&³O >Uœ·¯.z_ë“wYn¤[èqn7²;m?ÆA·„íŒû¬«PÀÿÃÕqùÖÀSý¯…öÿ×ÜÛÝɇùÿMÕÍ®ÒC£¤¯É‘ÝÙÍâìîW½AEÆ1¡–²ò‹}ÿÑ*xÚÙ0 •ïIG»()ƒ•=ØL³o9,°¯R@>H²ÕägÅ sŽ2¿2ÞpåaÜùj”¬—]ÂÝ„>…+ê´"ÄÍÄõ:,†òbX´‚&Uq-|òWÂ.ßvé°6nG%¬ç9'ëvëk­ÔÙ˜·7ùëÞ:ì3‡½¼èÊ[ K·÷v¢ö;½26›ôLPå×J|Fî¥ÙJ°{ƒ ëZÿózô³6l‹£$/Ò†Öœ*9¬x>ÙÅö†>HРޣA»´S›‡‡›BbL÷^^Ôב%{÷u—ØÄwÔíÊ,Þ¨Œ¾áoØls¥S>œ¸’ÀÀw†}üêW*oÒ¢}ØOM ÛGK¼|U^!)C¾€uÒnrÑCÖãG6¹Ö`¿YÊ@Âk/¡TG¢£´i¬°ˆ.èI}tk‹ѺõÇ(=3bU¦ ­FHf?Ò÷&'1«¦\í¥È ‹À?œ<Õ\.) á‡æ‘á%V¡¶ÿ¨:1¿±vùè•_„ º“+ØQÝIÌPÃëºø†  Ƹáµ&|“㊸š'À áÁw´Ç·;|I#™Ô ø÷†Ã‘Ó-{Š7ŽzÅÇfGÙ×™“#SU­JcÑ´³5²TI,éÊx»InNîDò€ƒ0f=ò /¶ò¡ÈÛ-¨¹·’Ÿ“µV>9xbØ\û‹ЊÝIÖ6^:ž6ïr<Ì<Ï¿Û>gƒNze•á0²úžÕ™ÅTwD«°iµöð*#ßbŒŽ ž&vx˜™†Y|íx$“ ãµ÷äÕG<^ð—ã<Ù‘Þ÷Š$-©lB=eÊÀbq@Þµ%»[âi؈bh±ÛPDœ"Þˆߨ0b„w?ÿR&ßÄ„kÔÅŸV°y'ü#êÈóVZ²0Š•4ÍäŒÝ±Jü }tqZ´ól4nðÊ”ë“õ̃½ª~Œ4(Žhˆ‰8àâµO?ÞX¥^ñìz·3ÃÜŸf˜ÁܸÕÑÇ;¯vZ?JÃÜ•ñ´‹Lwj­U´sSéëUãš3ÜfÌ‹Û Lf­žÍ…ñ]›ÁOho'‡BúÛ)>´ÇVùvú °òw’·Ïu¤.Rè”ÿ½ˆHÛ0f•ø »ÐecÄlÔk†òŒ '•°©¦­/êÒ$±âã¨îtýJÓ5c%ê_yY\™ÀgسË ‘7AÝ bØ*‹W8>'p<ÆÚWZ#æ¥léžp$ñãÄ‘ä8e6W@ŠŒÛüš–8äûÜO4Ò04 Jè dÈ,P¡¯ÕꓚõÚ VŒF%º&Wοâ  Å:Ä~ubìšúÿÚ«DO7U“‡=LRgËÑ"Vh^4NlÍWš¯! ³'–õ†—ÆÃÊCl—ŸØ gÑýEÌÜÿ:Øt=Ñ×bÕ¾«·¤Ù¶ÞÅÅÉ›/ä—·_Nl8,c+!Ñ—ŠL°NÜôu–.¨4†ÊËûŸ–7Ͷtþˆ…CfÒÑmÍe±v–+ÖMêÌêÚéì2BíÛ”ö®´¯N‡gà€!©k¸dªÁnS4‰tŒœ%q'ÑâLŸúò ǽÛд¯~铚’$ª>Ñ–àh·n¬dœXùƒ†>VÀÏÃ?™úc>G(j1·âÂÆ<ÁQj ú•Á±²>}wœV-€]ªûˈMjVHî´†dós›MÖÅ"Äz±J 1"¡È %§šø ~ÀºE—-©R¬š¥Á¼®Á|¶ý.NjÐî&^?kºy"Z&õqæóšóZ´M²ÅWźT5VaÔêë©Æ3 ç\Wϼ†¿tÁÚºmw¦¶@K ê7óΰ_³X+&Õ¾þ+¦Ã‰‰?ÕÉL¥œ °ýfjT·;À>>?GjñéÀßÈç¨ô CQ)æô>KÇ6‚ÒVK^-æÜŠ|,# R›¸gj'Òn#hvá…ƒ `QÆÏß”Lâ°O>¹ð¯a,æn¥â‚fš¹ë®E#5TYk|Vé­ ¦¸Þî„_» ]Õ¡¯G(¾Â³®8B:Eš(ôשápŒ<à“†jDÂá†j {dyBõø ·“d=µ`ÅÁMs1°F&igÁ!©eƒÜ´Þàí%Æç=à@ÓzH®q¢÷¾€¿ôSòÿ4F1ïê®?xP¶ÿZ}xÿþs~ÿÙ€ ƒ±g}´C@…”]ÓtPÓ À¶6÷·7ŸímŸìí;;0ç3‰&–5·÷­¼t®É\ô8(¶Ì u&õ¦\ò=…®¢¥°Ü0= YøJà;QZ4;½êsT/5 ã^-ˆ­ÍÀ ›1È­oÖ7Dóëô*DÄÄ ôürÉ2§Ô¥¬Òª_ŽÞÎJþ¶ÆƒtŒSŒ»ñ´j¹—0ùXejnéYô‘Çͼ}ýU«wäÐ3ö\Âfû#çœÐã22ù¹ÙÛ²Òë&½€ÑÕtµ”—v§ åÄÀ‰‹mu*=˜-¢ >T)ܘ­ ¸%ò.x鮸%Xº±XwJÕ× p¶n—– lGÿâ@¹‰¿ª6a2îQJtJ) –‘bH†UÞepPŸD@Øcf+ÐÙ§ (gcãâí-·Èê<Ñ@Ež­=¨WM·láq&GORŽ«=“C‡ß"`@!ˆÅè AÿŠOxá ¹vÉêñm¾I\¢R+‘®ÂT¢ðDMnßîIÀŸUMÇÑ%§Ú;1ŽÍ8•iÃjë™3=Œ½F™‹tÿ¸;,íI<ßÄ”MŠ»…–Ï¢Sï!펬%Ï¿ƒk€ÿ+†y;-šíþ-¶1-þ°~%ÿOë÷ú?wòÙãWós•ñ” ¹*Ì‚„f7O]@I˜àh—À> s´Rk½ˆÊv·ÿ&ávòô7ùÛ^;e¡W‡»‡»Ç?Ÿüíõöëm þ*φy6¾þÛE L€(rt|¸»ÿâþlo¾”%XÍþM“¾LG…Gæ³bþ/Y—£i¤hû§“­—p‰ÿÓ¤ÈpiÁW¸_ ~]†U‡?ÿBïÎsAÚ “uçç炈lAB¿7?ç|6ºïœýœuçKüúœ¸ÝÍÏu˜¼NÛJ˜TQÑÙ†-†ÀXs+^‚©¼ à³é–ôÕ ©J¢ñf`ùÛy‰HLæKöFÂ?ž%g.‡~Ø26j±-(âsÊ‘!“ý9Âæ‘{2Ê3š ë~éŒòáiršõ`Îp9zÙ¶tÍÓ3;æ;¦ÃCJ­¹v 1líÅE¡1C½EB^8–Ïz/µ7ÔÔ(%%(á¼½ÌÏ] :C1`.-O»&A‰þmr¨K—´è÷¿úÉù¯ñ)ÿn’ÞZÓüÿ¬À÷ÀÿëõÕûóÿ.>Úÿcz™æªŸæg©Â)ÐDëŽ)Qûÿ÷ÕÞ¤c?x¥0èèàðNNa LJýÃÜ:We±YE©NCÈ$¤xBYÁÌoŸ][>Ñ5Ô®VD™µ­÷/8^FК …³ eŸ•­Ö¼‡‘,¿Ÿ\í’•Zóðçô©7}ïÇ :KLJð‡µV|uË&72q•e'¥ÆhÔKŠqáäTXŸ~ˆ„á&ôOŸšl€™Ÿ^#aúJðœ6ž0 8_”Hƺ·˜p §ã°ßbDÒÓsmUÐ\×±¼WöH¿…ZpÝ"7$†À~0Á$È0V ®ˆ´šH—É€ƒ‡ûéÞ‚(•»è_¦´7» ðuï’dã¬$RQ¼Q2 —®ñ(¿`)ø3N2Åæ¬À¸žjTг©ÅEÑd•ë@™A¤ ó&Y½¹¡èGw&@¬>tÂè5ŠT­©Kÿl„+œÊðb“õúÚ¨6eǼ¯}bððycàO˜~’q ¿ GƒÀ ¯3 æÓJŒð1oþQ30m` ÕØõýÛu«åï×]#“Ÿp³êªˆöVÖsµ@½æjcƒá¢ëß ­‰çŠºæÉŠÂ@9€íºÈ?¤.*±u$ž0„v%“º‘=~`vÜ¿ºþ }BþŸ®¤cs+½@Óâ?üà“ÔÚfž×¶F.35& Ëm‘•&¶•û÷7¨ÍŸË‘jôMà –ZÐcÌ£¶P¾G´Ï/ïŽÈ«[K=\]+CXò"IgLJ ,LJ…”úz÷ŸXŽÁ6´9×S]M!È©(tڶߊP´¸2’ÁŸËµ 0Ï_ ‹‰µÓAà€›ò>ͳî5AÕ¢Û©éê1³¦tEß³áó´h‹öˆOr¾ÙƒØî.Íþ»›4olÄs7†äýƒ“g¯w\˜wÜ+õ'R/Îÿòóß-´1åü¼Râÿ=z´~þßŇùÿ&ö“÷)~>ôËüŸ/Ô“9ÏÿDÑžÐA„ˆø$>ÕG|úJ1ŸÐŒQÿ¬ˆý2H/O }¢é÷¥ªZ“¦þÞxýÐît &•>±Û_KzaÉpG-H2ÒB»S-Y`QFØÐ|ØÈ‚Ì>™Í’Ø [UI\…¦&Ñâ Êè°ÛÖŽ)=„1Ú«¢¬]JgbèÐY·Ù±?&†V]…9ò·Ã†5äçzJŒ­AzF–{¶®šIѶt×Lˆ,AEvøªmzˆŽ§ûb2‡+%¶Ê¸þb ‹dƒiEÚ¢¯¯~°°X ü¿«*òÞ*ЮÈäèái“±¤œ|ðóÔÀJwÕÀZïzk5ë:¥ã§Né˜_rô MÈJäÞq+½¼Û´¬9I.\Û"ùfQእèòÜ &Ì­Pyp[T+`™«;M…gˆ¡ô<…üÎéÕtêV“ídÿ ÷.ì-³Ÿ2Ôi—–ì&|"7çNÝœK„/ƒ\ ¬±â·t5†šže$Ïÿ«ØbKFtpÎàLdÔKÓN#Z‰cM#D¡ºV¼1þüÊKt¯nã‚°Ñ\yKÕ‘ÓÂp…3o¤v­ˆ[h+ñŸ°¬©xìÂð¨üs1¬>uØ:+m’¡ün——ùç u8ã$(0PA€Ä©úo)±~Nþ9÷Ÿȧÿ±¤]üåmL}ÿ}ð0|ÿ]y¸r/ÿ¹‹}ÿ @Š™ p&L¹¹´¹…F#'{R÷ÓÖ;vUî EŒ˜÷À¤a~KšîšDúlØŸ:f…s2<ýoñAåÃ^ï”Chpý.«ù¹¹9à£úÙØ«Î¸ýd¿)+#:MÏ2{%q/É^äSc=Hrêé½Vd[G äÞ›§­ÿ»xÿ]{\^ÿîã?Ýɧ.þk¸ü•}æ½(PQqIu‡¹2æ!dží¤ºÅ4²¿PäÏÒöam¿gß@”ªßCø1wÅdAŸì’1)²4y?Á턼²Ôï)ä“}in¸7geÒ˜¬Ä‚ü D¯0ŠpŠa<²\§H|F?PDÚ¥'VþiŠT¡’¡õ¬YA?¾&gãˆtgMØñ0¢€Óo‹Í{bT!{~O¶ê+];2ÅíST©Áìõ^×éô˜G¡A}‚¼PäÀ;iØö°× Ú6A\È[HKvŽf¨™ãEÈïÓpûÖnÎ>˜¡§ø#D@3t{ ®#Œ z«õË·í-6Ù˜0XG, ˆž|wCnÌD·ý‡‘c îï,·ó ÎÿÐÞïVÚ˜rþ¯®?.½ÿ®ßûÿ¹›Ÿÿj¥4OÙb2¶Z 0Ìa^Ëû¿Þ~@¶Ý‡Û;NA3ýÍøkAQËUÓá^çBpô_)í§†€<ß8°Uˆ,c”åXä®MþZOàC€Š*y 4bì^­=œ)V·U5ÅÄij >Ý pô•ª¯¾B9™|•—vñ«ø}ƒ[hó~ªÞc¯á»{!4‡•»þú ýêÊŠîm5ÑÖsµøÄVØ’––—QÍñuX¹>ND·„pë«÷(ÌB6‘A(ÇÚØ³ù,ó57”åŸZækÎ9ŸžÐMùHã'|% îyÄz.Â_™Ÿè8®)ÐÓû³C|*ìSkÌ~KmLóÿ¶ºú(ÜÿWÜïÿwò‰ÐùÛè:ÏÎÎÇjõ»o¿S§×jóø¿ŽÕ³´×S{Èt'°±fièòÒL!=n%‡“øè†<ýÜÄÈÏ|`W È~;?çlŒ)FuH/¿×ö…XɆ6a✧:ç šÆÚ–tÞïD Ò02ÿ(À›·ö¤dË®ÐQT1êÁ=ýÑÇ9Ýñ/²ëuÐêLNÇy|n}^+%l•yœeøÂœ¡ÛNhXzµùW*ÖA“ß–­ŒÙØÍغ½¹zk'Ê•úÞ$ëÙóæÚ¥¨Û"2;@¯gèªÚ ZéƒÏY/ª^ÌÕå¾ïuΣŸ–òÚgúŸµ==ß®òX‘ÃòëÞÆÆunÞ±+½§×=î æ™â1q ’Çý½…æìk:7?°>Ú¯52ý÷Ä(±Rƒ`Bƒ iÿòDpÓÖ˜¶ôãï)·—èY{j¨ÀsÑ'B?ퟷ€žßˆU[¿Mñ!v‡óïScÛ¨—Ú:¯Þìëè3×…ýà!&ë$°)n9‹·„DÑiLüQ{cƒloçкÕÖÚ3®ØiÜUc¦bò½†‘¹pa©y£RÀœxo‘×3ˆ—sfÆ[ªÁzæYÌ=L:¹{¦êŸóðƉӭ¶1íýomíAÀÿ=xôø^þ'!ÿÏÓª ¢ü?½JÛ$rÇ qËüzÚ ze ¬3±¬È›0»ûÇÛ/¶Õå9ì ˜‘׿·-¿ãOåú¿Mçßÿgúú_}TZÿïã¿Þ͇×ÿvy½Ë]…Oxèu8G³ì š¿ôÉ®ƒl,î×÷ŸìScÿu«! §¬ÿ‡•â?ßû»£OÿºhÃ?Ï`&‚=×Ez6Îê èbÂqŒ›&¾2ùXs¡ŠeôfÒÂIŠT”•‘“E=¢@û©.4\-v6c\VÆ2-k;‹ÃC ápžƒÛ™Ù[‚Œ“E-Áç¦dQ¿¶9=–¿LÆísÑ®‰;ÀóÀ'Ôpv±#=~¡ÙœY±â‰ +êê01ØtUBê4Èü$•Îˤ¾s§&îµ1Ìúj£Ú·×¨'“›dÿˆa^¿,­UÇ8–%XºÌ?¿W«+:Øî ÓÖdÕVc—›™=Æ”²SÅ‘­²¬eáä§P™"4‹,ç›p˜åKdÑ „i½ùëÈQ¼Ç¡ùª‹ðx¢gF¬öή@ ay2å´w–'ƒXu}® N´ã`"x6€û½@Xê^OGꉈà,£‰rÇÝ”ÖÄå*ì•÷f¶FŒÃî¯}/²smWäß ö5bK7nÚ©™`P'†B´¿55Û'‘÷ oƒÓ(9‚€›À”\̆q*$h)¶Ãº¨’jjXIõ5ñ§—T3F—¬¯Ý‰$­^ÛI?¹’,6Úc¹d>½d¯ºÉé-V78±œ  h ‰˜Šõ%ÊêàMðA‡”‰FX×ÁñðÚ¦TOV'+ý¬„4Aî€N`#LÖôÊéºäêok¢¼Êéß²­Û¿=‡ú_·©÷e>ÓÞÿ×=ÿ_Zþsÿþ'¾ÿ寂µ¿Ð›úÿÂ'ÎÎÁïë}T¬ÚÙÝ.ô¿BU*«–CêRªVì+Z u:`¨V«¦Z-Ud*“äÒßf…¤ý¤„–‡9»Ü‹/& Z_?^œˆI=í5–Ø´PÏmãiÅ 8œ¼^Œ0æì/‡Çú^¸dÄtŸjowÿ¿5 éïe6>/ëÉ骥K5ʼÒVÈØbt¯6¬;4z}ÖÕÄ×î;nô¸o`ih½áð3ó¤èÊ‚ ΋.h8þ=¢.åP£Àpq9Es§B¹Ì×Ún9*»! ]r Î5BZ¨›f>¹ŽŸ®?Âu0·ãiã¡ÃÝ+~¨§n_™/×R“eNAÓ—µ 9dkÞÀ&®LsZÓ/Ê9 ½í¯$ ð÷— Ûr^å¼Å:hÑ-^6d¼º¦f¼¸!Ó©?PñŒš³=5Íñ8ðk þk|¹èл6D¤aia Ö H„ nó¦}©žªËÅJ‡Ø0‡lº€Ò¯øòkhè‰7¼µ­­¼\Ûb]mb®ˆÚBê-þÓ/»-ºý:Éî5náðÃ<;[¾íG€)üߣµ!ÿ÷øÁ½ýïÝ|îåÿ¶Ü?Vþ/àW÷þ{ÿ¿¢€ßxHtÓþ¥…þéÕ8OÐÕ[yŠX¡2!ò+­¬¦…Otj¥ü7X„'qñ{IKdõ¥¸áÄAÛ"4zEúÃNIÂëÎ퟽)*?²‹;²Hýªø]†#bñKÚéJ'Y½Ž5ÕÓ_c·ÚpÑLþ•Ö¾BšÚÈd%ŽöÏAy£ˆ´%UªéÆ”²(ó”µ5 <׃ß23sE•‰ž°XÏý{Ï?Ù{~p©=2\u›â!äD{¯ëâ{ÌÜ•¸ü dž.f©}Ó<Š˜êéÎûÔÈXKÝs“y£¸ACùg5äž)jÛ‘ yþþBŠM|9 ¸ò6ià*vIû¸t1½ [SU~ƒªòúªÄ“дš¨«èþ~Ÿ’ý¿Œî{KmL³ÿð ¤ÿ·²zÿéN>|ÿm‡}æÇñÐã^z°šªfÞœ}.íÌ òÈÞöíóˆ+hÊé7ülø XÆÖà·³8 Þ^ÏÍÓ‹|¸©)WñšS_•~zš…ª7&ÔÓ€Ðu^õY0â§¿†tù<ä¿Å9”HÂðºIo4æníü“ @`κ]‹ŒY®!êj¿ÁÞ{ÍkzºxÝüê+í7õ5œˆ«îE€2¯P—–;ðØ|½.9ù†’ݰ,6“ Ã0É&[­šêß!Òa•ü÷<)ÎoS|òþ¿ºþ6û`ÿüðþýÿN>ü·%¹³.ÀE‘ §EÄ›(þ „HXÕK…õŽIÍ,N8¤p×+³x£2Z¶ëKÉÏ¢ÇVÒÓÀ¸3ìÛ­ÞVŠÐ&ö¸hn×Z†T’b tY`,ÄÅUÒbÊ¢`w»üQ ‚?ªüæ„êaÇ“ ¥:Œ|Ë ŒX9b*#uÉ{]IÆlZ·²æPê\%ØÖZvœäx-V%Á°“1Û)V!lÖ'ƒKÆ;°¾O+g…•Bçhõ:hÄ?ª__b–=ûåíQY[ÁŽêNª`†^×Õ@“Ü\µPp·é~åRîÍÕh!ìÊÕ¦¿ G‰|x1èœtPåÀzÚ2’­LÄtϾÖ2*Ê[­Ò´võ»µà] %]ÛÑÑ¢Á–Ý3èP5--ÏB l j.Æ­d1.²ÖJÜÁ`çj¡Lï“+Mr[‡Íb€Ž'`qó5/•aÈæ]އ™’†þn)¬QzŸõÙhCÕ 7`üñ‹•õ²¿¬VM¨Oܦ',lÅËKÚ£¥Î>Þ>ÊÀiø#ý¾`Ç}ß+’šï{4ç¾4%*Eö£!úøÝ­”¯_Ñ‚‡)U!I·/PUL66Œè’Pxzå¿ ~i>V+„GÁþ?õç£ÉDü#êÈeËZOÉhH €b%_írþîØà6Zæf^Ó¼Nåj%D} YÕ‘Æb€Xˆ‰¨Å—vVJ(¥ØÛˆKsànf†Žx1ËäȪÞQniô¡ä›·m³~”*&–£ìp²F¦;5€WèGÏ#‚sSéëÕ¸'&“i [Ò´aÖÁÌsŒ¢éçŃ#â,º—³¹Òû¢‘1}8ÎV’·ÏÙKD/(ôªê?p<º7Ãʲ&]Šf“ ^3”unW±CTd8«Å˜GâÊ›áÇQÝé(ú•¦[¯aλ–Òþœ®xUhÀžXNˆ¼ ê6w‡W8>'pXæ WZ#æ¥lé|¶…±‚¦dû<°ã«^ÅKUÆm~MKŽõ}ŸGÓ0(ÁoT²Tèkµú¤f½ö‚£Qaµ4 2Ì`Z¬CìWìãSSÿâ_{•è醠êkë¡J<³èl9ZÄ͋ƉÉùJs9æÕ{ ó†—¦uÝ«ç‰^|b/œiD÷)zé×Á¦»(™ ýŪ}WoI³m½‹‹“7_È/o¿œØðý]‰wòL¯TøQ‚[¥ ®ÃÒ%&¤˜h]YoÿÓþ«f[:ÄÂ!½Úè¶æ²X;Ëk‡&õ fuít.Ò½¶Ëç}wžÄò5ÛðWó„þ«}@ÿ·çìë_Íû8üx¤ëFïb³{¾®"ó²AîòjÌȾkÈ®ØJô%Ñ08Q7úŠà¨Ü+OOÿ­î[¥¾@MW=m|ÿF}¯ñÛ¤¿[´]~jOŒ¨ÌøŠ!•Šï‰&øúÎá‘¢wÀ>¼[üZ²£]T0ºÞ…ļâ·ü{°¸æŠ§ßHnOöQ,ÛÒ#fC/ùÔ›ÖÔf% Ú*ëÅ)UFMˆtjEçu£+ø; z0Lƒó™[ÌkZÌghÑ6¼þÖ·h\R3ýdä|ƒ/D> ŸòÆ¢îqÔ­ÃÏ^†¼‰û*g!!øN#hæk†çXÒ+†´bõìí2˜>öì$0;¿÷]›[ÛV¸?“çR©„¹†›ÞGd—‚z.ÈúÒšnçwÕíú }×Ýî û5;Hå¢Oé¨X‚ˆó2â´{ˆ\7J+ð_'áú}u/º=¾ôá…DEäZúǨ;ï?½l.ŸæiòîßÿWÖ¥ÿgÈ_}øø>þÏÝ|ÜÓþÞîþöɳÃíÍÿvnü8T̉g8%ô;ÍòS|—À¡ö[ø”½'ŠøõÚ· jX°~rµužä…Z²òcî2~ÐÐ<}O¥¼Ð·T¨ØØ( ¸˜rrº¼¶>âÆ ¼Ë†+™ÄixíêíééÙà¢zêzf®—ð)bÕtccA-À?ÿ3€ÔÅaË ]¡¸l šãá;Wµ›¥½NAÛm›‚¶@Ö_ žQl^91}„IC Eef?úGÏÎûÏý ö|ç=JÇ·ëvÚþ¿ö0|ÿ¸þ`ý~ÿ¿‹¿ÿoªöCû <㻿=:~Ø<úáähû¸Âøêµ¶ÿmØêÇ)…jæ4ç·p£^EIaüyü Îc@•­ú'O%Œúb-¬ñW™®²0»h¿KÇdäT‘ÛýÑø:¬Cšð매¤ìŸ@«LéY§ÐèøVk”¤RÇË®jQö¯ˆ–T‘è!èÔì¼WFó”ÀO¹Ô©_vñÔuO‡134§9Œ{uà?äS·ÿߦ ˜iþ?WÖBû_ØÿÜïÿwñù’ýßÓû‚Yƒz«ò(˜¨µZrM‚Xk°OPÑ¡§wgÖB–¼è9Äž¼Ûo $—1ýÀ©;f>¹@]|~éÓ+æŸðåÜÜWü‡ôVÉÎpŸYnÑIÓ7¥ÃF¢kü¨ÞðÏD{žé€¦~.w“r+ÎSî"åâW‘Gª0Ò 51†d訚ͦúDÎE cND†¯îôŒD‡¼§Ä}EÙNל­ÚBÃH7lâ+¡ÃM¿"=mÜs™y2X°*µá´ ð)OçE*µ¥iË™@‘1øR-g¿.á¯P˜å^¡Žåµfµ1;¦ç“m´løÞàú•{w­–;Ù%ªô ²gþ`7~þUp?°Hº§`Ç(jx7mD-ºZ´QŒdý$ƒ#EWñÕb£¬=°ý·×›{$"÷.µêq)²¹Ä°ns[5p˜n8!3sÍ+lÅüâñ_ýT ž=rðúk-ƒj?xS`QDÕ›ƒÞZ¢êoUt˜æKj G’•ƒ„ÜžþÑ3±¿Öh¨ã'ÊNéãÅpÉjβ²ëw;];iO‘²AÆ­"oÆP®™1æs¦ M`EàkêAl°*ƒ¿õeª'&µM=¡^`wt=f!3Â$ó ëîÕ,¹Ü2«‡ÉLÌ›”5Ãñ”DGض£fåÎ0ní¢W/S._ö#%Ö/&Dr攨C—Ю鱢X–Õ„2‹Vz ðÞÆáÛ>YÂåéyì"KÓ«¨=8nØœÿÆÖmˆŠõŽYêV4mlÐ#‡¹3œ¾ uV׿ðaAý¢Ë!RWñ‚yŒ­š°¤×PÊ.Ä «è•¡ja O JÝ_°þ-?÷¿ešõ·(œjÿ¹Ú>|üàÞþóN>|ÿ;²¢¼a9>>Xx÷3w4„›&<Æ Ê¡0ZLbQuUÂ@jÌ\¼.áЉ«xZ²®ô.p(»ª¦Wä‰þTå2¿@7ÄjA¢‡o¥ Q‹¬”//B¹JP)A‚ÃJX!S«#Ö J £É‹Ñ´Ð’“Ž®'uØWU’!†"A+JœHTž©©`±]]|±í‰D…LÒ«a ]5ü£¢²«“pÂþWïÿ>Z-íÿîãÝɇ÷ÿìv_éôÏ—ôé+èSÇŸ.ì+x5t»~ƒ˜šOìû D³æƒû}®Ù* kKI“Föi×j‚Át_kµbK ÿ4qÏñáæþÑæÖñîÁ¾ø8G›§ÃÜ©~‰Š­¤'",ÒuËŸs‰üK&­ÿÛL[ÿ–üÿ­=¾—ÿÞɇ×ÿñyV($ĸ(íåMHråsìࢽá,l±)œì¼høI¾˜ j« ·0±UçBØ¢å$Ÿ„~ éæiz– ³h]@9?ÕhûýléóÚ@\Y†N7º„=4c±EÀ8jÌós•ÖÇ A4?öçödZ!ÿ{™ŒîTÿ{­JÿoõÞþçN>¼þaÈ'hÿÕñÕ¿_n¾ª{ø¦ÿÖuÀkß}øá§úeG«ˆ ¼¦>ï L­ºød@¡5^X£<^é–ÁS‰ÅPWÌ•[‚<£•]ª¥æ%I×2ó;’ïÔ¼ú ߯fú´ªŒÐ|ŸHŽ=øŠ25êðµø×hÅO}Ѫh.|’£2á=Ê ÓvD±úò¶¡2o‡X'”Ъ>Ý+Øÿ{êÎÿ»Óÿ_]]}ô°tþ¯ßû½“ŸÿýYÏÿ¤Ný9£þ¯Y›©ÿ븤ûÏ·m\R“ì¾}TÛ/_ÿ¬üârŸ³r`Ģ„Àí¿TáX¸¬2‹2Ù¼ ¦_`c€T˜bc@ýÍ üL¦eú|Z w`fÑß›› Ô·Ue‚ ¡¿ÀÉ?Ý ¡Ô\¾0¾8nwpâëwŽxâ¤Ý7P&F¦‰—_µ!®Ý(å™YUzZd EÆe1¾^lĽ8oÜX|oû舦ÑSÝîbLq*l eqaЋÃíÍãíCY]*Ì…HßÓÇ÷KOÙÙVL¶¦-³]…}•s/µeƒ†ªáŸhЀó`F«¨û³¬¨‘ïPUüehß ¢¥€ãÆ“Dë‹ùbÓ&JÎ>r&l§_ÉÛƒ™Yf6±G×ô göô_9šÈØSb½Y…sÚxû‹PÈú÷\‡ØlW™†ÿ9Ö£|0¿ñ\øL|o6ÃMKOâÁXžÜÞPbõ“‡òFö7„C„Nq$«"ž½9™;äõ € ÔÇ“œÆN=±?„oÙ¨—vÇýa1ŽsÒ#€>ïAÊKH™ÔrøÁ)Id³Õõ°ÂÙ+˜ä£¶d…T¹>p´ÜXáæ%ûbæP¥ž€Œ¼ D囹7 ª ˜­Wâj© N¡/RÁ\m‹¾W-«jQ±üQWÃ_þáºÕ‚+É"NX±_fw…mM&8A̸ Ïb%/Uí/Í^/†™b:QéÜP™Ñœh®å‰øúöÍß_4ÉûðË)Ë æpÓÇæËÍá̰ÔXÄý!CBUO’*:1(lEgå3Mè*‰Ú´ ˜ö®úè'–w½†À­¥ö\-´Ø °LËäÀ&m¾åq övm—\;«=S³Å(«!y¶{7ê'”?FAÏ ×Ã@cò£,ñ™]ä2MnÏ}Íýþ!¢&«ª#ZêÍ2ŒÀVм x¶‚Q7>Ó2]]h/È|¦¶\ˆ(Sšž©küÑX¨:w>šòÚ pBùÉF†ˆá½‘áŸôÊÓÛþþŸéþ_V­òßß¿ÿÞÉGèX‡Ñ¨2ʳaž¯ÕoéEª. Üq…ó£F3ÌÊx_é¢?¤,~u¸{p¸{üóÉß^o¿¶"ªZ0¬¤j æL…CTüür4')S68áN8Æô‡mÃ)ÑK‹b&«Âsê ÂhI^Œ0-D[‘ 7”ôîGØx¼w.úýëF€ÞÌl·-c­p‰XiÑ$Ih]õžïï¨a9PŸXJ)Ò Êˆ~šŸMØŒ‡“€ôW Q’Ƽ. «ã—>Ú'–© $µ®&Qƒ•·:åäl0¹Q&cõœDD\8bRþL¼'¢|×ö•£ HüˆÇ½Rj°oåßz¶°¬¼;F{…äÔâ×éYÙHâW‘-¯6T'{¯ÖädÅìkë_=Ûœ¬Kr Í@½žÀ3ÈxbÿտÑ퇱`h0]«}ÏâůXW¹¯µ½ýç‚îøùðrI îS4髆¯bŽ EÇìÊ “!©“Yè3ß)ôì/24M~F8Y©Ï¦êZÊڮN.`âuÑÙøgˆ^çã_qd˜ÔÕ/ÿ”WW­AõwÕwµÂ 9),.S$þw;‰4îïâß £ ú¢¯“À™ ¶µ«rkÓK×ATÉlDšøJ’|18­ú5ƒS“Ây²q¸ç\Ѿ¥!xî–Ä!<ý œW`–Ýo;) wú²~ï›i뫪¥j3«ÞÊPl(ûÚÏLH;ùVïÇÆtEÚ6ŠèºŠâê*S—"k!¾‹^ ®#Ÿì™áPd:4¯­âõR¤ÞOOl§Jì>gê!1=ö/`-¨!% +λ¯Þ«ïŸyósÚr£Ó9žþŠrìšÊŠ$Øôu3FÀÒÇR¹å¾n~’o r\øcöðTML/±!ÓSëÁX„S#±÷ê'"ñ.ã•ËõUܧV.W±ªq 'õ(;’U–òµ8ÉÏRDŒÅ°-u…ИgDXh%íSäÕ—åþ~£‚tf™¢„u´r¹‚¤£¾Ç—%ÜvãèjCg{ïȃ]! †5 s±5®™#ciÓœ‰] ¥-F€?5]ý꺢QÛ/ÇpQ{-jŽ9>ÁÀaœçú¶+ÛTBPAôSs0Ÿ²,Ù´2©Yáß!‘*ªéuU&&Ï—†±ËH®¯cWëî"Fº„&üŽjúÅäðÝÚÈ9ê…ƒ5Ó8y¢ÕYÇés‡¨rŒ>sx¼¡1£ .Cc =ªüá{Biô‚æ§ð;§8jÃÕ’˜ÔŸš˜ŠžœbþzŠ9¶ÈUu™+Qèª\*tªJQ².EßýRˆ<bhêKë/§nÔ»(ÂÚåÕîšv̯©v_&ÌéˆA˜´¿Vß«S3²_Ã܃mVË5¯plÃ÷Zox¤‰H³S^9ûÙ „™DŒX.!p­Ó«ÄN±ŽAl¹ŒØé0Ïù<©Çì¢7®A *ÀÜlÔ»†Ãõj} ߸áH·ÓlIÁùI'MŸ®‡j|9¤ó¸Àyõ‘²2¶Î‡@uÒ¤'*¹ÌàŽŠ4ÌR‚ƒ#}˜³–9Œµšš+$=@’‡×l_fªñ|¼£ '¿P‚Þ‰9:/d¼•C–Ú”O3!®ºð)µM%ï«+é¸JÞ×V’`-ÉR»„¦Ÿ–Ó“ÁwJð‚/§·OÎ3ƒèi»¦»í“Þ€¾ÿ¾(鈚’N-«©hs ¿ÁRN°)³••Àž0êCLH–ëznêBôbj¿\“ç©kWm›[1ý}¦ÿn>Ÿ=oøÞóèø<ëŽ××xK" ±Þ ¥q²Ó0 Ö/®Í= VýiÇÏíØõKXÑ?…N#6ßOÛöË—véå½A½¦5¾Á>Sa) ì©ã¤Õ¶QŠO!úʞG †t÷ØE§Ô—ÔOâãa¦¼:#/M†~ãš÷­úØÝÀìïîÁàžÎnC\r   ^‰|÷üìÿèbCÔê<ÁÑáîü¿ËÀ!‘ɰ<Ê@Ô³æfÑ\+W ½‰ ö!³ OíC u>Ä:—ëk1ô¬ñD³äLø¢qÏ´é»®Ù7‘K#$ YÆ"{HŠžEYü«µZÇ Ï-’¢›)&è_,ða]Ò‹A‡î¨Z±?h´kDKWxƒ"êÛ•-¢¢«¥5ÑH×Ú{¸6 á—X[Å´à=`-ÔšcbùˆáLù[°hU4l-ºTâ73bØÜÑÞG?ÍK.‘îÈ07¼YñTO†ycØI¯Hc ‡ˆ–HD $b´2²˜VHäy´ãY 3;p’»Yh½™ÎE&˜SçŒÛ‘?K×7ýÌqÊþÀ;„éA‹ÃÉù•6§îL#»ßñ¢X^&\ï|ºTw*½¥ñ–s…?™míÐäPv»üDP1`¡5¦á—5²s‘Ö¶õûåéÏï ݺSX­X{ÛƒïƒåUDCîÚƒ>ìÀX¢/„ë(„´`‰W  —FöJ§1uQÑxω奈zôžtåq×7ý08ê=Ýop^ãâN¬ïŸ*iwLƒfª ºOÛ´°ôòªœKÞ¤X¬šæÐ’ó`QO„97ÂÉó5L.zeš“ÐÅ:\±cÈ(ø•DzŸx =|D]¨Þå2m¢Á×h¹8gÆ“ƒ†°±˜Çr`²úÂ5(h ¯oTG§E;ÏFà›31, ãRqÅõÕ{ž¸)oÎv_§Å§· ù’Àî_±nr“ŸBùTwwOËÛE+1ž±JÚôTÔG¥4Ô ¶kÇ‚yÌÁÆfÔ”–mpÁåÕXÛšàw]­Ï9FØ=ôÕNttâëz…þLôùõC”ŽüÉ)“Ý5eÌí ãâV1†ëÖç³¥Õ¢¥‹v½ìшw^mÑF9d™Ô!s6²A[”fmlæFkÖºËCfQŸºtgàC¨aäòQÜ2W?O8À@þ3Ê32ë¿Õ )òŸÕëBùÏÃ÷þŸîä£ãÿÙg´û  ¢³÷iàjZ( ²¯'¨ä’)Vá^¼…jEJ„`±ÀYÒ¸{ò‹î×5¯L:Mm-.šÏFT3ÆE£©–bØÙÅàEû"l½lLeMuµ.ÕHÖFî6´1eE­lFYÕܧ°Ï.âQmGJtŒÑä„@o“úáB շ˯ŠÝùÿÔîÿ·ø0eÿðx=Œÿø>÷ûÿ]|xÿåmò%;?ôhË#¦³ºÿ£y4ÉÿŸc ý¦Gh?(›Å§ÖŸza–rØÓ‰Ì0ŒÖ ­ðå0¼Oò É&aµ ¦û }Nµö.ÙÍE ·>èP®†ƒÔCF?òɧƒZ°Æ%&_þ¨ë¯Ži3Ý{á«¿MôY8Íg–ûäáާ žÈÁÎXüÓl‡¶âQLŠâ¢: `´Ïô…‘¨Sa[H§ :Æ-¸oÚJÈ\|XÁÒz0wŸÀÙÁ°{Þ“¸ƒá½IÚѱøP[Æ£qBJÿ‰¬ OæâÆ™|9×UÕ“‹cè†I»Ž;‹qœœ¾¢­ t¤;•S­*jW¸Õ»ð~”Ç·Ÿ€®± HZ„”ݤ“pÒ#Ú9JNy"w%÷„ªÆPÂêÐ àD{Ëà,F&{ž:n*¯+íŸz¾ú5pè%‚:c¨=k{%´T+âÑ8mXçQfºh^P;Ÿ‚U8¢¢é;§xÆ|òKî+ö¼y®UDu¾Þ0Õì*‹ôПðÌî­2%;Q¼¥™ú­“Ë  FxªŸË‰Ÿ'˜¶%éÐ’6‚–؀ᰖðû êú*_³ýjéŠýæ‰6ŽEÂa lªöUö7â•2Òû±FXxMÉ+ÉmŒ×>RÛ$çé­~‹­ÖZ°›ÂÒú e,<]~ ö¹ßâtc#Å2ª_¦Ôª= ¯ú!f µÂÚ8õ#Ùz¸‚M`«jhÚ9×§“H gb€K`mÝöÑÁNÒÊ™@$ÔÔ«KÕφÀS>»×±‹Ö÷Œo–LœÖùÆ¿Ò7<[z:ÕJL¬bÛ$¢àì&wÍÿ£×¿[÷ûm>Óä?+¤þÏ#àÿ××Öîý¿ÝɇùÿÃô,ê!òÃ=b†û ºÚ@åG~"A^Ï@uT7ƒUд¾Ã/‡ù»Bu‡È<÷®ÕêêJsý»¯éjL q8SÿR¤ãhëe³¸îcÚÂëý£6·ŸŸð4\h¨ˆT4Vá|À[”ÝõKõ=| uÇê2Uƒ4%›;ôÔ^¢¾¬õ“³¬m|Ï©·:Ñä&°ûü™ÐôàÄ--´û 'óˆ ž<ø8‹%ß,l ã|ØkB~¬ö²SýíEžŒÎ ýƒÑ¦å]r··1÷íFꔨØàzS ÇÀ¶ß¼|¾÷M1¼ÈÛ)UûDYlN1Œ<lS_òE:hÂ(DÝ_¾Yøþmö;½°íù7jáêÛG ó€cÒïXOØw.Ûk繈ÊÀ†•E‘¹¢¾nb t¢[ú¦íðZÕÄ‹=]m]sfŠÕÇ‡éêš@m#‡e>é~œ'ƒ¢Ç'NϽܟeïQ+]“ÇÝâò(Þ¹–ãÔB“AµÌÉ,‚%…ŦæPè¶¼Œ oé2®ãô€Uífm4z$9£Æ°É%i.rQ™»X8ÎEÚAÐÀ0Žf4Ô8y§«'³ä܈lˆ7çQ%/Êy’ao†7¸8‘—Í<…n&²ñ…<¦qW»²CTô¦óc.ü#‹£¤Í Àk¦`= 3]O¯=üz­£!É/ñáN‘-JSB÷ëf z³ç HÌc¬WX‡Pçnr¼JçÐÙ”¡u„$ô8'»œìªÚ£ ^hò÷P·èÀ\‘¼Oaãæéó´“]êú¡ÕÒ f`áÐSÖoõRhú¿Ëà¶C=>ý¢×qþ-üáåŽá|- ï鈻¢õMÎxA‘k¿ºqÑ" Ê/Ëã ½f;iO–e‘âö7&GÛ#KŠ(mž5c3À:¸†)4Â\…vn°±k[Ã>Ž wÖUú¢3"œg¬jq¶aêžs˜JG)8¥ðŒ’Ý'ïá[/_nï“GQ¾{º¶a/(Übu;::ÕT7»êªhå!rºyF.¹a®ýžæC –‘hï8O¼rI–eçhK­3èÙèa‹zk…©aÖ ©9õ{yVèãL\šùHÛr\OÆÓ“aKÄrvKÔCmµ¹l‡éhÓóFSjGïbïÀx]¶ð>‡©…Ž7¸éæ Îi\óåq-¨:e Ná/†ýÔ»"ö“ks…C>?ÃÃØ‰ÛÞí5ÓÍZ3çlûŒÇTþGK!¡- ¬`ÂüœóNãN»¬ÌÄ•¹''Ò8“Ê÷ö¬ÂÝX,ާ:¿H1v¥í®MFÊvÌ.âzlòi_pǤI6Ë|BÉ.êÉyXÙ:ÑW…ž}äó@‹ó°îòO›‡û»û/6ŒãÞ5‹ ¢ÚM]]fÇ#ˆ+Ò¹ÑÛ-C`¡e3€¥>œ£7CÖÕãÚ´ —!3ÎèêÓ‹‡#Êš)L3¥áÔ“Ä9ð0SbÃ0™È"(Í%7sØ ýg>fJ&5æ²ù ¼Qe¼aGÅÉ%%ZÌ‘UœJjد1¸Ü[Æ2¦‡Å¸Ïl Ò“+Ìø¤û¹ |!ú.¸ûj 2ßOBä3O"¾ô7UÂò«0O7Ê<%Ž\š.Óbr›œàä.<ÄV…ä öÿýá8¥Ý’'@#Ó’+£lÐîÁå·b²ö$šã´ wqÎ-ÛÐT–ÐêhÒ·Eae›Þ4lSOŽh,-ñpœ™xsØY v·²–«!‘(†Ñ÷kõ«ÍgA.Ÿ†\>rùLÈaa,ÃwXHûGß«ÿY>µòøz[2 iï?kKòŸGïõÿïäÊP‚cúÍ*:Ú„œ£ãÍÛÏO Žƒ­M Õè ‚ˆ‡„U{’¡—JZéå|8,OÞ¡£Š–ÚÚ¶ÿ¾6MZ¥ɾrl¾@þƒOÃ9<Hpq5²q†ˆ»L‘ßDñoÐO K#,tñ•ÃF=²[9ÇGo¾¥ûÛØ¼Åc¦á´²ª;¥.×ÔEÜ{ÏŽE¾ kÜ»>îÁög[2[3”¸Ì3-P±¹Ñ/HæÙ¢ÁþÞŒ^—¼ºñUiKZäM%.Š1à »]¾sà7Ô•â˜“Š ¤«Ô:û…m¾Ý¾èãÓż/šbâæWè¢îT! °0Чº¬ã)6Ž,æ‚û€å/ÈlÌýœtÜòoŠnÄ‹'€ÊÞϯ‘çí¨¯ùB¶ƒ_*°ÃÓ.r¼ÃÌJ/qƒálŽFø¡]Q{âkh&¯›¤ñZ1ΞïG€cBE–,‘Ïzt2Õ¨°}ºø…(8 9$¦4tÿHu»Ÿ‰çwp+O@“Ïÿµ®†çÿõG÷çÿ]|Hÿ#p­ÎñB+ûI{{ØáÛuøžeÎbƒäË,üÒšoúñ ·ð¢Uï T4+±…wìí½½#ÞeôË€=€LœÁØmÆ%>–‘‡âj¯zNÊ79#¨.fPô=7w›º›'Ú‘+Ÿ2úIÕ›´Nà2ëŒÏÍG å1Ì;¤¢À¨{ £ðöRtò¬pm4fÁùø½lH)êÃà!‰·§¤„:âù)D™Ä™$ÆdA¢ žh¤¸Âr?ÉzÇßfl†¸œ-ü…ÒR+Qû<œ¥ŒpC6Ú]ëÎÞj׵ʼԜº «: »zC–µá½²¦‹ÕVrhý·(_Zø„./÷¬ÿÌ[mVy‰:#ª‡v+B¡Dè“@^ãž¹žÄ\ç3ÇÃC`¢þøšüà O/ÏÏ‘gþ¥9H/ ÊÙEÿSoŽ›¨Y§+x“¿… ÔÛF ؽüQ§C VýÖ7vSÙðØÉkÙ©Çd§„Š*ãBÛÁ˜Ãž7”¢±¨×âÚËÆ&ô!î˜Ú™kÄÛœuÐG»W6& ½]5ÔÅ‚M·¥ÿÚlÃoò rßl›Ò[]ä£aáOj÷yÁ¬9imÕ±Å#k”]dŒ‘->Ü~¡¢“Xýwxz 4±ìÜòÁ·^>ÛÝßVQí×ÖÚAôVÕ_åϵšZö7~BIeškª(‰†oÞV¥FlvštË4¹DÄvM0%o8Ât§¦ë¦[E˜îDÂìhÂt+Ó­&ŒSåËÓÎÅ ƒé ÁàŠLGzàŸÍõµ(_…¡´,…o’$XÏ>:ÐHR(‹ &Rt ó]ŽdSxßì´¬¼ßå€Ö»pv‰¿/›:ÚúJÕ`&û#¶mG§aò ¸ÿ>9ØÙ9Ú>Ž.O¡.øŸ9 J¼N¼N«ðšTéT,Ý|ÓA¤ `?×UUb¿[ÔÞ½$ÄÌP+ ÁnD€†¤nÇT/yÆq"ÝÔ (“•zP=Ö´fŽi½ŸÀT) {¬"Úœ`,þ»ytüß ;PùÔ<9Ñn¤·TO #‚}«aµˆ´rt|p¸m½ÓSm0ôó 0R„¿q´Z‡gÝì¯ÇVÂb)wz?èa˜9lÉÉÖõ.ìXqå˜Ú" 9Ú@¦­ôÓä~Ãay°ù\ExN‰ò³Aƒ»ïvhwjÉ~h´ñÐõ(DÙò:´¯#OàÚ:nn>n‡*¥N5tû°‘ßQo¿ôQ汇ßô9òlý„Ý™Lxƒ/fLèì§ÊÞ¦3 ¼›Š~ÔcœNhÌœ‹æÀ˜@F5‡–ŸKÅ´š>õ³á&» 3»S"Ü_js«ä˜±#\½D+‘òÎin¸!פ.ŠÜ²e–g^)ÞšÆõV{ƒus³ýM̃Éô«_O7¥giÏ;¶kc5/51okN¥uú¥3Ð_L_: o@5Ÿ`éÌ}½õ9TEÈ<ºÉJ§MŽÉbìLæ…v4ÕvnÈ uCva§®ÓõœÐŽwö„÷³Yöý 'g¨=‚vª¦Sؼ™6;ŸMBm‘pë®uå0‹Q^ü¬³¨Š†S8¨iäƒaý#x¨ÍCZ²ÊûTžÝºUjÄIåeZ;eõª™°áïÈå:;•þ¨ó³šz¥Y<%ë'òRvQ“vʱ”ÿÂãtGÓ~çßlÂ^~É|F´û;qÆ~ù„­eo:7+Á;"b05§1ƒ•Ç÷-ϯ['ÇbHé“D’ëÓ—Òë$¢Juâq4ì´p'ÉzjaÁA±9ýÑö² æ¾!q Z1,ÌûtC+~”Î-5ŒfO•Ls4Úžö(¥/Û$í› ¥*a±è„€…jþž—ÛöùŸ }ák1/0çq±¯r°Áœ¢’®÷H§ù$v+Þ?=€"¦vc®ÎÏ“:Rãeƒaeã([úÖ†m2…¾`±W@ÏfwØëô`p…´ÁRÕÈ´É–Õè×­?HÌ£9‘PÐf¬Áña‡üú™\ñF$½˜Ò¦\7,×­É’Í ú‰)òæmˆrý¹•<}¯«Œ ó˜ð¨¦ô,kiLk¬E$ÇŽØ$uÇcb¶éw×mûóÔÈ·+eÕ˜c+ß^ÅõµbÛ‚ªŽMkX‚9‰<¿ c>¾À¾¥çX‚ÝªÜ‘ÜÆM$q×ó ½©¿Go,V|Ýu¸ŸðæÙx+I½HîcyPô˜¼yKî'M—ü®ÃrCÿz-êVBq4'¼ÖÛ­š•]XÓ…6úK)ò6ü€’‹p½š®áÐÊ;æXq±@*‰S«bô‰Ÿ£ÞíèÚ¸XÕ Ø±S€a¾tìÌ> º“'èÁ5 BBMž|jß„I”•~æt°)X˜æw4·A­ *ÄbãZé¤ Û ‰–JW߯z×ÄI6yÍ&CÃb&ÖPW§/zk&Ý—¹E2v ‡pߪ =b]j6¿ííáTì ‘À.¥k ÃíÏq‹ÔYÝ¿p4ææÈ¸E1äŒêx¬ÓáÙEÁ'‹9JƒUÍ_ͪ¹,΢Â0Fâä®;˜ ƒÃçªz:øl”ŒXçTY±M &¯>V1”Ó´¬7ˆòõÇi1¾}€Ÿáÿï1$Ýûÿ»ƒOÅø¿LÞ¥èÞ÷ÖÚ˜fÿõpõqèÿoýá½ÿŸ;ù¼Ü;yözwïùÉÎÞæ‹#Õš[ÞwFMÖ.Á«O M¥ÕÿüÇýÞà×eÈü}[,£frÚl÷ççO/²^g™œ oÌÿe0TÇÏ_i4?×ï-ˆrNŽÕf§t¡DÃ\ø¶Œßæç õ×£—{í~‡BæÙ,Jí “NK@ŸµÛjùL-·µÏ„faÓ0ñ }}´½¤"dãk™¨Kzh †jÙ|÷*À†'§|*Ì(6¿!ìŸêŒ‹1&q½hÃäNÖíZ(™£I|õí£åG6Eÿ#òǯ!iü÷o“žö³ñäãùÄÒ†â˜e¿—&UÒù¶­½ä4ívz1é ñ¶Øµ«!ŸuQZ¯»A:yÑe]\Ô:u(Ý ­Û°«}58‚WhÛºFõÂ>¢Å"^ÌãÅn¼Øn sVDìØ.J"¡šfԔͯÄ­ÈïNÉo·-€œ€Ù®?ì\ôhÀKA¡Î‡—èáA{Ÿ¼À9ê÷(#§¡è$´Zh ÿ­p¢°ÛÜ ]1 yͤCçHP/-Ò/uU­ÖaX‰v/ ·ÚÎEæ™âF»MaÞÃ¥!E™ãx·I‹mÐoÚ:A¿Í1TØlwÏH,]›pÛÈzéQJ}’ÝiŠ,ég€ÞEäåçUK(½3h Ð…°üÎìåwªÊomÍ^Á.èLÚPhû^¬>zv=N7{œGo•b—¢Êxmq`Xþ¾£"9%4+¤Wý¦>C•áßPíRlÔ ´hÑïÈ_Ü™¨ÿTCºq(h3 Òßy@>ÿÞ1¿ S]™ß$ÆìIÔ¬=oâÎGtÅí?nîy1#x§xu´ýúùÁÉÁ«£“g›G»G¦»/’¾å†ËS$9ÅŠ1úçèÒó$¿Ì·Ô«¥ò„ÜJ©£fK+maÓ« åaL^É0ùq»ÄZcÆ¥åm›ós¢3E¿¾+ós•쩜ÌÏÕð_œá3`r¿;ÃÜX D‰7+ÃqÏŒ–÷—ÔKRÈnŠyQ¦•þÒ˜×* ÁÈC‡Ó¤g”;T8-²Õ6í·FXœJJóHŒr þèü¢ÛÞ¨åýŒ\ñºÍî¸VÉÍŽ~ϰÙë½ncvÃ+šÞëÎm‚ÞìÎ=(³Û90½Ý—ñ„¹gp€¯Û0càŠŠµ ,Ëä †Õ®xƒIK:XLaE•„&&«„9 2x•Å’¡¬‹5ûšOˆ6`8¦Záë36 >é™_b|§7¼$±·ªÛ³vÅ5w™QÑŠ°ìn„-?§ë]Ú¡´°D0›Bú“¢rrÛÈýÔ?#«~W?ÇËÁôñÚûLÞµ4Øëw£†¡5cUA€cdµ-s?iAOkxÞuøøYšçW%¶›úôYŒ·i¨Ä}ëí  #ûô„fÆéØÎóaþ²8kB6[r¤j¡tÓ[0BÉÂOâá}ðC î!ÀìÌcvIÆÌÎyA¸!}=Îz…c‰^ïîb‹ÛÞ,L‡ú¿{c¿}UQÉk»Ø…¨ºc“lÄzG|áljÈ=œ˜»31×Üe*²5‡}Râ8cÁ‡=¬ƒ=,ÃîÔÁî”a%‚>°¾Z èâ|xI8G£|L®G9yýk(ž'u\-]Ó “U‚¯é‰É*Á×õÆæ-XƒXÚõš!ÿTÅCÙ‹G:ÐûvíVägÊIزûa3\#A){1Äe.ÊXýå¶"•J0ëz†u¼«†ÙÑTØò.ÜË5è› ¥ž¡š&œQ‚– >ºú¯iÙžÕ’G››Ø‰ b\v ä ï[ÃúšŒ¼:ZÕd˜ô™Æþ•Øñg½aûÝ«^Òæ×`{ÒnrÑûéQe_7´h^û)Ã&8Hútƒ øQŸ %sõüÒBruÒÉè&O»êÍx—¦£êD¿1É7|È žÝóóöå€^Nô9nœ¶½ÚÝÛ;Ù;ØR‡à# :ŽOàJ/jÌ““Ñ9Ú˜z^¼Ú|A.e«êû¨Á¶öw÷_H´wãCôà:ïŒØ{à©¥Þl5ób+øs:zkA’^⨠m}¡¾?KЬh¾xÅÞs[+hÓZ}ˆ6žé¨µú),~”"éÙDa Ù´Új¦ýÑøÚÀ¸2ïqGhyFF6ݯ)ï¿'‹"׊í’-š ½¶šg)!éÊl^ªÝãÒ††ã¹;ÐÛTÔð3оâ>|µèE0VÉ VÈÎÅ*ë´`îBbûF»pןÃM·­7wû} b8s> oÅ4pÞ”&D þÛy+à±÷e6;¸•ãŒ(OCúòXïLko6½½1#$&’evÁɰð…$0Ý]"‰œ3»tQÔüÇ%Z0ü-=ãX[âØ™rÇQ³J7·‚6ÈÒ ¼>o—ñC:À=áÚ¦×rûkHí-ôf|€­Yl†8¤Ê=ñGý4íóèÑ!Ûä—:_n~Ðgòþ:!·¢ ±¡–Ò*–4Z>UÙ4©@O®›Óå7$ÿ¬ž~ —Ä[®¥Õò~Ü}¾3°"€ÚÛOp¯ñ ¡jíœè^G“gúä9ß²G Ó›Ä:KtZxQ÷RžáHÙÝòèâ‚×hÕ/ÎÊkÊŠ€â§…ZLÅõŒTQ^Äù¸¡xã7öìd%ˆIÖÜsØU»M–á7æÁYÐk¢Kÿ­aÍã¼h°ËÜÚ ¹\ëÜGÊ/FȈ}8…æb<ñý´ÿ‰ýKÌ©Rõèµ jhåc®¤ekjQmTUØøî “^¥*I„^n«S4:…t8?ÚI¯„› 2Ap²‹­2–Eª®ŠÔ:‚{å©­ÅVXžQ°u˜â”Ìdh&ùW«ûÐ= Ãt©¤H-˜¢µ n{[®ÁGm6L½$óWú¥¼O´dÌ\­­,Ü£æ´+-¸ à±+ æeÁs³%<û‰õѺ€éN~,X}îÐØ~´ ù^Ó :iƒTÏM- ¹<¥Y¯ðÈ€€™8¹W”H{P‰@ްçô¢§=n´æ1†±…1jÕµ0Ä© 9¬åŸ8ÒHÅjÛ¢[¼<î¶|‹+á-SÎXEë [ÐÜê€ù%Ÿ+ÌÖÁ [—?Ùf±¥þÛ »iÅ]ZÜ o‚ápì6_ü¸ý¡ÿþý(æmèu1¦>‰œ–Ín–Gµímoî}È××bŠÜ +2‰-; EP~ù¿}È=ËS¢+oJåŸíîoþüá4”:$IBµìÔÞý°»sü¡8ϺcY=Ú€_ J­xÐ-YŠ¢B-úwb«¯ Ù Â'•¦ŠKn¹<[JÔ·?´‡8#E&±årj* í'Ó§·Ýz{·ìº(cßÜß?8¦Á‡$Î>éuç¥g-·GEẎ³›ã*iñ2M`qÎÏ™d˜õÏ·wN^mÀ«r™¸^¼ŠiÂãTÿDÎ߃)åÜáVææhyáš2s>4A’Æ'±µQ§Y)+kÐ ýˆ‚=¨ÑË cïpÛeln 4¯hžŒû#G<†m½C –†óñÔåZ¦l ËC“ÙÀ8±2!üdmBï¸x~.&®CO’–ÇX!è­nÛz{nÉͺ,p¡}ûÿ¾|ñŽÛKN‹ÏoNtóYgÒ¬ÆEñ·¶Ê‹Â$ŠE!úé–ÅÇ/<-ü³B"IsëÓÇ„®PÏhš­S¶~FÄ?}tq}ˆSÅu¨â4ðØ¿UG„é‹ÝLív6鸹Y•¥r†³Çž9¦°;;f8yì‰S]zë嫽=Â/‡uq›jK9›D𲢟*+úéæ=«¬èÙ +:Þ>:®è›K¾YU½sÉ7«ª¢.yöªží¼f€Nç F;-PK€Þ¤•iœI=_2ÛüŸ;™È›LjÌ1°Ì¼ØO¥¹Âø›PÉ%¨z6Î&`̱$(VÁ)Ü„U˜Z‚¶]yÔ:† ÛMÛ2 –K𘄉{’ÊšôôŠzÅJ$­H8ÉÆÙ ×J‚¥¬‰²· Ÿz5%(ú×ÒðÒýïðL¾Q±I‚dOˆ¬Ÿæ- ÑkŒ9#ÖR I¿óèÁ‚+9ÂtkØRE¢~¨V 5ž·>ó l®âLxêª}››ú67>Öè7­È«~ÂÛ­wï ¦j ñË)ÚÄáÔÙ‚7÷Q»øx÷åîÿãà–sËG‹ÆKTüœ§¥*Z¼½1ò? óNs˜ŸªHwã‡Í£“W›‡À oã“Ñ«Ýí£ØtñùöæsLûùd{o÷eƒ»H}lè­ß›mÖä#1vÌßÛÙ¡ R­Ü#¨UHð5déówÇ×V3iëÌDÍTÓ¨™y†ª2¤ZÄ>½Á¢ÞX»²3wG±Yi_´¨œÜçg¦`“éh/›lWH:pô %&-É ?Àt– ¶zø˜s¬Ûq‚,T›]°Pý™äà-¯2¾Ÿc÷áQÿEÇaàò°告xÌ%8asÜfU 6ίm)YŒc÷æhK@å¢Wë{ÄÇ~’¿ãP¿x¹ìBÓ£|ØN;8Ðaé‘V ý&Æôr8*!#^mŸËE`%?Õ6£T¦ÙlªOVñ_Ø{C‘öà°êë…'¬uߢʑuÿ«¼qW+O,æfôée݈šî:{Ú¯Gp‰øûñÜ^¸ •A·ÿþêàðX½‘ àmƒñZs£ª$è1¾cu˜Ž-v)rbšyrÕ %ïÓôkòÜpA¶üÌm¡«×œAàû'¿<öskØ'‹ûûÛâ8p->/°…ÿ|šçm9„½ÌÄ\ÞÛEg¾6ò²¡—͈’K|/2¸zâ€7ǰ… «Ô3õú臿i×À‚§£Fƒî܈”‰rm{cÞºÅèmãmÌŒýkg%ÿÔoÜ>W"³·½ùã6ÔbA·a¿}ûö-jÍÙyL»#Þ§`<ð4†!6¬ÙFö‹’콇ΎMð–C ¨òH“já—ZEÞ&TxllÌà;¹z¦°KBС=üºÅMã– kW{o¶qÖ{¨vh¼¬£ž·isRKÕÌ¥L;úµ.tn'{¯¾uš^¸ Vò­[ÕCÜÉó®õ«¬Ñw±+ÐŽwãgË(±™Ÿýµ¯>*¥"JbÉà9?duüªó Ð/Ò~Û)koWYÜŽ]kí¸í'7 V95:Úf?n™o6ÇRŽ¿Øt1ä iÇ,!ëÅ¡j¹“@×<8ÁÈЧ§ûë´‰x¤âÎè‹ ´öŽœWˆ¡LÔ;g/>¾^Å[ ¬’-ôðz VVÕ¯‹AÁü¹{Ò>O€k®Ì‚ ÍÛ·¢þµšú½BÅù0ËRë3—2h¼:>”<¨©ÀnX‚UÓ;[SÝÃYª#“G®G3‹gøîUýx–ª'·óv¦†¾ý¢†ªH“ñ4n.QŠ1ß鮥Á²³ó1JCUJäçèBþEG2Pƒ¶”NOW(pû\jê(º€d4 ÔšŠÆ½JÀFx¬Ú3Ÿð}qK«±úï +²æ¥`;ë6E[Æ2àCLÞ‘Ey)k^ŠWôq ðq5à·%d¾5€o=ýw§šÝÂ}®j„zÝm66z”ó¿+Ö ÍhS³~.æxoødmQ¬J–žŽ ôî….B‰Q ƒ5‰Â6e­~`(RRd# K†ú ˜FÅ*ágž8lø šâÐ#R'÷X_j˜Fð Qím#v6˜³Z›³nr4ÁK¦<$€ŠœG&GÝ[Ësþã)ùßʦ+òW¹[/·_"€ûó¶!ªÔ[G½h\Î~aBPñ/¿g#¦lݰzųÊN šxzùÙê§­yÙ ¤ñߥO‹ÎO…ÿGãÈ÷ÖÚ˜âÿy¿‡ñ­Ýû¼‹{zž—7wo “Ki6Œƒ—Š ìewã\ÊS0šyí/ú?¾9¥‡% !¿8¾Dü)S‚q¹&ÓF#ñ«ý ™àd ßmz[£:¿AÙý©œÜ¢ñøúó÷,S÷L36Åz±–‰Ö³©}XËDrV-¬Gh™(œËdíeX&¿Æ¥´åš:Œÿa/Ís4ìQEûÕ-¥iOÀ•éË%Œ|oÃåëõ·.«À/iÉs­Mó?‰<øÃ ]'Уåò89"r ¼çI}>qÿ,ŸŠýßE§¸¥6¦ìÿ+«Kñßûýÿ>ôþ_Þì• 8ðîþ¿ý§býë=4íuoi£›²þ×׆ñ?­ŠŒ:J¡®h¼6ü¯ŠeƒLG÷½IõñÖ£»Ã1+©´‰˜‰î/z a“á”É hv¡o–tØLµôͼú‹Vî|¹ù÷“£ÿ‡J.ó¨ô­5×ð8««˜MÔ5ì´p¤Þw£…ÿì¨ÿìÂ^× RÙdCP+h} >Auï‡Y‡šÜ‚žÃ®©ë@– r– ûùÊ›+ß=zûD¦Sl±˜m2¾Y" ­,é¡âŽ£öD“€.‚ö×ÖM©~Úo®#¨(Vÿ…>4 ð·÷q£a`°­¯[š &Q÷•`Ïh®¬®w+ë¼¶uR‰)µB'HÍÚ—ÃL$âÙA3ì­oúÈOIÕDÙÑ1ùd䘤/ 0b³bÛvc´@6T =ß,™Ù‚•a=PTŒ,]™ÕW…eA%¶14&ÓÓu‡'^äf”é‰ò»RÖ®}zßuΈ© xjºŽ‚¡œòä´ x7­ÏÃj‘®´¶èÚ§W-|ïÓBå•rA!ŽX­6݆¤7²†‹X`uÀ"éO^øôŸ›cwýdؤãú1D9VüÚP[Û{{G^©ŒAÆ šq{œ<~dD€9©&¶A&_ØTS×_¶Ž1úVû„´?qCCýB¾Ô,)-£?Bè§üå§O¡e†ÞYóôjĉZÅlG~#LpÅOªh„Ó ƒ¡ÿ1éý˜à±À?\.¬Naë5A‡Ð²t¿g£u¸$!kÞ+ÖðŸuO¡¦ªÎžÐWö›®ÿWt "_ W«pͺÂZ®Öð ÔtµŽ_ÖM©nÄÙ”…ÉP¡°w´«¢¤HÒõóVÚÏÑH°‚£ñ µ»ŒÇ>ª£Ð,ÀKÚúaóÐOÙÙ;Ø$ ¸ŸötÚóƒ×Ïö¶ƒÄWÐÀvPZëáaëÂùá¨Þ…»Ú8lÂÄiã?Æ‘þ°„ tU(ÊÅ œÔvê¢2R)4>êjŸª7øå­àáñ·UðW£¶y¤^FöÛ¸bšB5À„¬Ë%š¶K™mÊdòv1÷hé²»¿,tDS» †ò áG°ÑÁÙX¹Zø›ëöÇŠ¡·Þ›?lÿ]eŸš ~a0MSô®ª`§]ÄõÈEäýeá“Ó¦¨4¥&E ëãáE}3¤_;B#;æÈ\¡C‰šœ„ã¶™ µúž“ N8óBfúY™ÅÇ¥wezgxÎÑ˯Ž9u$S5™ÛÇ×Dæ {.Q 6¦SÀއ¨©ßÜ>® mY‰Ð®¢‹‘ÕBXÒÏ4>íÚzHY¶ÜVP‘ƒº¨°ºñêT ×ûbÂp-Áª‹A’|æ1šuÔ’I†„éæÃÔŽ|™ah'A¹!¡o3 ^ R ~«DúZ9’¸ïÉ ºs˜œ‰£ÌÖ? ¿¸1cR9 $kVì÷yÅeyZœSycÿ—© øûUÖP_«Õ'ós z[v¡¾Ê‚Iòô‚þ…ŒNÝU“šø”_i˜¼É†›‹ QzøC&©&N߆r¾Ç'RÈ'1wxÅ¢\CÙ,ŸFíðïÑÈ1a¹…¨ïÄœA>üm!o+ËŒ™µÒ"ØÒg'f§÷[+¿É, ]j(‰†lØÄtÂL#ÃU1%þg¼ Þ¸€iÃ!»Jõ-Œû£®ÖZž/xx°2xÍËKj4€”®¤/•—Í/|Â}Óþ|;™FüUùPc7ÿ§y„’õ›M$ÏGBÙbeþ–êˆÛ¨½7ŒŸŠ³®ž‘ß?×§’ÄØ}H ^;¡­h–gŸ7ÃYÐp¾a:c!·‹§Eô¦tÂQshôôƶõV°ÌJëaU4»rUtLQšÁ+VyÖjŪª×©F t¡ôôUQßBù¬ªr‰Ù‹Î œ+ÒS„z·">ùvQ†~··ð탗ÀgLû‘;'Ÿ‘r}è!¶O”ö‹uájõ×vŽÏLœÈúeªVXêja^ðΗ™C÷—…»X_®½/[Uc=#ªWÕÝÌoîÝA»wÑ¡¹UÙ‰ÿÂ_2†VßãN6lž?Èû¹h+TŸM ?5'Ï[¡—V1çy÷wò’@. ¹¶ÐÅZgæpÑ?…»²T<ÌÓºÓÁ×k¹4‹ßºdÈÌSu|m ºyp2®ðÀÿ¥øP:Bæ É¡¨µ©47Êœï ÆåyÚ ×)¾únñ¡G) ?<^ÑÎ`nn¡ÒÄôù*¥¤£D@€¨0åŽE¼zÌ¥=¸bÀ¢ ,2nŠJç3o ’gŸ:G”›R8ös8ð¾¾…/îˆ4úÑjy” ôf©2<áQÇî:‘w'èû$cÍœ…ÖJ¬Á´$ 4Ò¬‡7ýþbH¦1q­ËqÄv…>>“÷O{×€ËÅ©F$d¨ËlëWpã ìU+ üIéaqx9u Ä ÷*(J5HZF­Œ ¹KÚ†È*ÙˆrD5º£±º+â,ôn©vú¼õ¦çÖK­¦Ñ"ñ¾ÕÚø Õ5œJ„úä_ŽHaƒ|=z7h9¡ƒzݾ\Wï°Û- cÅïÏøVÀŽ€6Ÿ?·^x09žèh©ÀÙ\’™‘Z?LT{óðÇÍxœ Ö/žî+Êã3å£$Ç›Ÿ+=¾Ô½?ê÷ÖpØ<|Ø;Ø|¡³öRïÉ‘¾öPórëšWšrßÎXá-W§ßdʘŸ©sÔÝBUöq‰ëÙÑíÜŒìôBV[™bŒßŠ…V Ǭ8„?Ã~“ãVÀòY{øÐ?ª§úØ=U½$Úž³¦A$êEe‚¿4•m¬x0½DõôF… Yv?—‹ÞNA;aQÓ"(Êôì;LÁÒ»¡Öž˜Ú`ø’O?#y·02ã{°±ï(Èæ‚®8¨ÿïì1tòñ V™Ï÷þá½uÐ݈½e½‘CYïKø…Š•_8}1*ëÒƒ¯¶žrÛ6ËGóæ¿&VôVÒfÍÑÆ÷P:Q±¯zØçK7*7ƒ3§;ýª¬É{ãÚ~Öìðªx䪨÷Ïûêµóص£}CMȼ©Ã¬?Ãw¯CßzTõ²¾sY%\ÞÊ_©Œ«öÍR«7¬@:Ù+wiµv¹Ýú¼ñÛ]'G°#ˆ«f6àKÏ’ö»ãX“..¶]”f핥ə¸(H/€Šeäài_^“sbMòwš(#V!£Qðrºœƒ‘ŠgnšÁ†åŠ©¿ê)P†L d}5;ø 9±øN¹üPNº‚b ‘„þwç—/̵™AÆó=Èy~=ØËï’³Ô» . Û~¾×ìe§'ÅuÿtŒüÄÌHC1»hÒKú ÙÒ…µÒè‚­”Ìuù|›°; G‚¬%ãöùÞð²—¾O{˜™Jc)f9«šíÃ:ßüˆ¦v÷_œ zÙ¤Õµõÿ,¼Öê  ÍvూôÝýcJE{\J€WWW^ëSêTÿÙ™µZhmmm}}ýíü½‡ŒßO¥ÿé1óÚ˜Ìÿ¯=~ü äÿcíÑ=ÿ'Ž.2?O‡TRŒYv— ÎNFCz"k+ÑK×EšëÈdÖqOH¥e”6•zNÊÜ(ˆ /ɵȓö8kÃUùzx±›ØeÂÏÊ$ÎË eDy:êàèZºâBám+ IpÅÊoj =ltðI¦O¸\ Æt"h›zó¤M>ŽÒæ¡•¶ßW„úÓünØœ÷¨`ÿ¶°u`4Ï¡t¬Ó6'Û0§¤‚nTHèí†0ã<)Î)qårÅ¥R/8îŠIlµl°S€¤s·‚ÖÖÌÉk•‰È,¸—%è b~f¢RtÅNÔ–ºH¦¬Âd¨ŠFÎ\*hr¨!„Dñ$TQ†,óÊ:æôxÚ0I<$2%O“ÎpÐ Àt|ܨñÒ‘ ­Ò …§ó‚(T¢Ù dãš°qR;É€µª$› X¦#u‚A8ªª#ŸIǘ~?â 2!uu:ë‚ù“*éü {d+\,]Ž!¥‰·Õ˰/†|DrP &L¤ýá É»&¦%x‰¶M»ŽD–FÑb/æñb7^l7TŽMü$yÃ/ ùš’ù•˜¡ùÝ)ùí¶ÓOzI2þÊÕùð]'ƒNbç>i²A;E˜ä‹äHèeÉàZ]Ã~¤£À8€èÔïbÐ>GZ²©L>¼£oIÞ¸Œs$¤ŽÇz5ÞöG¬ƒùœø®Ú ŠQœq퉤)èïG(88²®RN8Öªpf²Û<% ;/Ð ÊÁþñáÁÞÉÎÞÁO'p‘ Q n²½C)ÂñQó¨ù kh¸F¶ÿ~¼½´{°²uðò•·€ÂÛßQ©yÀÓçC˜ðß>¢-ü·B²ÛÜ*¹Eâš)§Å/2ň±ªÚ¬Ã¯}Ñ›lç¢ óˆÜŠD^èõx«‰áèa¹Å»Í!Çî†oI§[îì'`9Æ(•íîYI¥k ¸Ð¬—¥Ô#Ù¦ÈV¾œxˆða\g, wMµÝ™©èNUÑ­­™ÊØ‚^­žð‘— Gšåï;2Úú–áiôr ßÁЇ¡20ü;ª]WJ„8²²CŠ~Á¡}‘+ ¿)œö±Ñô·CLÈçß;æ·€aR  #ó;DñERˆ“Œª UbÚrx–D;¦k-¯ãn#ƒd['…ë W»uפjjÈ›{žÃ%Þ^^m¿~ŽAÒNžmíi!´ìb¹Y.^ÓbKÉ®ÀÙðïÍó$¿Ì·Ô!ïÈ–]â¶D}!þ¤É[†ñšf‡h_rTµ®«˜³iy»«tÒµYôë:1?WÉ‘\LÙ*³g:X™ÇŸÉíi<ì õk¢`Öj J¬[Žû¥CDêÞ’JZ@ÙI1Ê”Ò_¬àÏoýÙR"7§¹È×Mû-˜,&ö¼ýÙ± ]z÷Ã>÷Toš?À-Knšô{ê¦y®÷L¸šÙÝïkzÏ<· zÓ<÷ Ì®éÀô¶y8Ê•ÿ2í£hÕvað^8m,/ã3 ÖËØÂ'rz¡øâ8ÛI~JõÈñ‘ù4)ÒOÁTY¨:ü'M–ÁưJp“cRÃ])!ènø6 Ç’æŠ%"ãý µ3[ ã‡ûPŽ“¶*o¯1¨˜SÄfΗféàU>´»}Õú¦t·æ"ËSÕŸºO3íÈt2ŸÈ—ŽÞð’B©º x×dsw>|GÄ’»ý¶ùœ®³iç'*ñ‰d†prÞT¬[»pïôÏ(x-/ßr¾7¿¼–>‹K†5`Ö%ò5l;K©ËÇ[Õ >Ü&78ËF!°ð3ô]F•.ÔϺRp3¥[…ÞcáÌ4Ò\ì;é`ØÏ(Ù$WÈ5‰*Þ³µ2¿`#½W¿µT¤jxc!} 4§jƒJ˜mwR«ù ÇV´Ô³‹¬×Á„3JÐâEqÓ¨â jÚ”©Gqnê¥î_Ø^ @ß·†£,õï5;/ZUŸô™Ì5—•g½aûÝ«^Òæ+àœÒnrÑûéQE7ô[†þ††Á‡é éÓ2``%/ 3ëØ13…ûÉÕI'+Ì3Þ›ñ.MG'}À6ƒSíD?­1É‘_»–èáåD³7º¥Ž^íîíìl©‰äýˆòߣã“7÷Dyr2:gîŸëyuxðjóÅæñîÁ~U}5ØÖÁÞê3˜ûÏÅh<ŒPm+Vh¥MÊùøó)k·0H)àcâÆF„ðŠ |½£5õ<ª3¡Ç3ÊñØÇàÆUÃ{ù –Uz”àƒñá&KÌÄÙcÐI;Y›v áD3-F±‚?§#¡ Öëé‹ÐV“¾8Œš/^©Ø•Ö ö¾õu”ÒQkõSXúˆìXCz ™8ÔÖ††ú£ñµqeÞãFå;·³é\“P¸Þjæý÷XhÊvË–÷¼Ým5ÏÒ1Ñ5Ú< ­4œsèIGy+ÁwŸü«pYú… iI… Wi‘•Ö^¬³·óVÄÄÓxÉÛÇvð ÂÉ]žÛfY=D­%ª¢^kë«ê…ðvúÀSòeÅ<Øqó@ñD(- ,újÊý§]ˆ ΧÅAǹÔ(ú3^Ú‰MN=΀ˆpUsÁVT(¥†ÿ ^ fÏš›õ *©f&&TA>u?¤È=nSúC:ÀuòÚ¦×r'eÈdüņ£¤Ü+/p O)¶˜&?SŸÓpS>þ©xÀ‡âóâ›pbÑÅé÷J~¥ÀnÆV5Óz­ÊÞaÓt3Ëfg­B »Ï_Mc¼³UûeÂüwŸÛg‘®µ¤4~EaN®ææÿgPMoV§¨¾À/&hõvU¬¡Ìj®o,g-m»Wèh-µ¾æÞ]{°Ψ´®ƒ¬ôÜÀ^B+û6Ö¦Y@GV£Ã|ÀySýj*z8K ÿ]†oÙÀø/í…}u²bužÀŒ†^u±ëñˆ­´,‘š§xË’Õˆ´Å”»T4YKAŽ÷XìgÙ`«w{jÌ‘"ÇIŽzmN,¹ƒ}ÙÁ[çàáN»Ÿ·4­ ƒñ[¬C>1—ÐÞŠ¶àP=̪@lœ_ÛR²ÅúLsT…# rÑ«Œo*±Á±ŸäïtdÒŽõDÛN;8ºaé‘~ê‰ý&FÏj8*!=­ŒÇE€%—6£T¦ÙlªOöO`t›EÚKÛcñUØy‚ÀÑ^Ä\›xô§cP7Ã?H/ë†Ôô×=¡~|=joÿýX;ܶPQlûï¯0\É9ùß6‰€S3Cª$è1¸:z, jå¬ –+xHpy=q¤ƒøB—Çi¥D;/ô’|`gVEÂaãÓ.¢xÖ‰œDüH3ǵß= 2øh±™ºztbÁïX/f‹šæŒì²$cBZÓ å•UÂ{!fàÎP:ÞcuŠ5ñ‡K×úæ©Ë·=AÁ÷îþÎÁ7}‹Þ(ðLÉ-lk0ñVñj‹ù3~Wa}Z”ÓLøyMw@£4?§»-z(;nâFj`ŽŠŽ1h>wâMUÉ·’m§™Ø<ë OkÁu˜VãëZÆLÓÓáO¥˜s¥¿!IØø –òƒt0LÔ[plm>ÛÞ3Ýñèl£P_-Z–¤>#t˜Ž-0ƒÃ.¹j’÷éaZŒ|n®$¶ìÌma(ªœAàû'¿ñë?žÔ{õ½õßeœeJ›Úó~¢xSc0Ù3_éC¿a,ÀŽ›[¯~v­¼a‰D¬%oocdp;¹ø§ßXÕ6O6˜P‡8܆Mñí[ç-—=‘®³Ì²6’8Ïù¼Ø3ôÊ)Kº 3Jý,´ˆ…6ŽÅá'Ë,.×êgQÜ8!,š›Ó/NŒhË7ÕÉʲuüÅ$ n±A*oØuf ãôÿ+í? 4»= ÉöVS‡ƒ¼}/Á« žðXÅéqz8Å4ÃD€ÂìŽbuž" …õñfFâ ¸p'hêѳ;¾­÷Gì…Ÿ^¾Ü~®¢o¿´ ÚÀ^ô/zp+!\Q ÷x­T_'{_Q߃R}•p9¸ùðâ TÞzuÄ\oѤô% 6`J¡ED|šI}¤§UÊܧ·rÿ?=„¤½<á2ч<ư M‰f£*éÉûf·™äÀ ~HZ»Í×/_ïÅy+³VwZOo ZÇûÛÔ¿qÖnè³ýí¸Ý†/»[[Pd«™¯@)C€ÇŸL¹‚r?M.g6û%5„ke·«~V_ñ:êŸ>E/ž%tb¢²éŒ½Å*1¡gì-çPÖ1”»V•‹ÏµŽBjy®v›ÅyÖ(òp;¢£ë«Pb¼É;× }-L¾~F„¯Rmøê4^ƒº~©cmüÆŸ·æéCû^3”ûœiRêø[;ñ`5ˆ!÷SìU§\}—ùõ1°'~'¼™ù|÷Çr“8K^&×v¦à=ýåî>FœÀ¸JË«b–@Âx&Ô&Ï= ±ͧ-÷WŒ[yÈ<"Ci¤kæ¬,9¼£;m,þ|ýõz[ß;u>hµc¡þs¸Ã?ët0që8=³Rú=TM§Ë.|Å9b*Â'>_qP$(‡J›”o6ûœ\òk_¥juÅ&¯ÊäU3øøpÈ.U"> ÅÄ4$8ïˆ-7£€–pUãÀg|—ÕRYÓ:tb­mÝPî‚UA8ûcÕ2•ó›ÿözXÉÛäaú“âXÏ»ôpûá]ËS¸ß[øÎ eZ¦\Ë”maùy¡[ü†êG7¹ ‚ÊÞÆXÁÄP{cᣃ—Ûê?£°4r´h4äîÜAçC¦ÎÞs:IˆÙóC˜BšÜÒ3î§ý³²ø¯ýQ&(¸É¼B{i/¼CÛHñþ#M[øOͰ}1.އø|?B·áÔ®jNô~uEw¹ÃÅ÷|3ÙßÎ{KÏñÚÙ›^Žý)O1yNæÉh¶ ‹éâf?#v–IªÇ÷çÙ±›T¡Y}h(Õ‰>TVæŽ!Ò¸àí¸4|¦†œ¹ÕÓª+¦åÎô ;5µŒ†£UÚw²ãƒqbS|+ûÈR¾H,pÊ‚Ìÿ­”ÿ›Ž÷†;é sœÇt;!ηud“àÄÕÉ,Fpžlƒ ‚õ†2¥[_PGÖMÝ®h¡áÕ‹“§Œd¹2³ Ÿ_ÙwzêŽ@‚àùgêHXG©#TÑBë·¦#‚ÑÑ+Æ°è† Â4êÆ—z_¨•«ÇUን]3óæo+ZzDñŒÞR`Òá˜î}pxº«ê6©Ö4Ù”l8¹€¸Zã‚Ä• P°“é 3zÆ-7­ÔëÒÐUÕMxÖÐ~„Š<)hRM—?Uz1§²ô2WéDB:O ~ºðJf´±Â¼¿çÄ'ño$XªsA³Œ¥© T]b(ck }»]-/k•„gþ§^”VeLÞ£*ûë}|±šo‚ÀÈI=J†N4æÃ™T–ùHOD‡ õ®6BHišL•²ÕM0@åýKÞR«åѪ V[òŠ—Q›Õš×ÔP·INœV•bÜ’Œ{F›Þ }¹‘avuÄójÅȪò4Öº†î‡QU,×n‰ø "Œi<³µÆŸÇÉeõK"{ ™É]¤ À‘O'²Ÿ´Ü'*eɹ?Št”kNš áû¾lxº”r‚ýj·Ôþ+ Ñ*‘¡á”¬ƒÝÜgyˆQ·å¦<ì Šp­pS"Ìú‰©öãÃTû’©ˆ À}@ììá;ëé_±µI…ÚgÚÒie‡Joµ»Qਣ<&~Iÿü-狱5´Î VBŒÄz¸ë)u ÿ=ÂØ^fƒlj Bö¹g‡µ eÓÁšC<€2èƒjW'ÒvÓ[׿S53ä>äà„ƒ\ýþ¿wxmúVu_Ý÷JÐÃô2Ïà6këÔ žþˆÏH²182›ú· ^¡ªÖEòzà¿—à}Cå$ƒƒ¨ÂF¹d¤Ì hCåh ]ffb¦szµ'§šå1?"¶¨¤÷EJµbø"iäQ>d1šŒáõóTæô£)@>$á/öª“FC?DNÞ¹ôÑöñ»³Cÿ°»s<;&¯†£ÕA¯M†za"—lZߥ$Õ%—%çXì½6Ë3Ð2£ëù©ÀÙJA’Òäå—…•·ó¥’ì?df¨¶šGÃ*∙üšì‘ÓɺÝ4Çùr˜<æño•¡ô\T7í1#t!#f4BzU+Ž ¡à =aÑòRú]¤ 5’bƒ6iÏFFhbia[€l5JwŒ· ç¾å“¦+;Ei9§,ÐK µÐ K‹Q‰7Ùtçpóå6zìˆÉw±OÚ6 ½6´„;• î„#ÅnnÁ&ÑÜG¥¾ãÝ—»ÿV²·\ ÜÜ3®ʳÏuÉ4FÐ×>Úr¶µ—£ÁÓ¾ïáh 66,ð×h ÌÏù.Y*æÁN0Vô©!—üß—¯¢€ ô#r3=¾…?p޼åBoñ=mή':Æ`Ö¢º òN0 ¶Îß_7Ûç)O˜dÃUC¥xÉÏsÑJ°­˜HUeC-üÂÜê1\Ö¿K^·›Pá±1z‚ïÆÇi~IÜÅxs–NW¦ñ¶¼UWøV!ª]¨L|ôdÏeÎ<·0ëN%ð§âsðÒ£ŠïR…öì(ãÁ¶Ùžk•¹0Éþ_èÒ¼<¦ûú­žìÿeeýÑÃG¡ÿ—GÖîý¿ÜÅÇ¿ îQI˜½‹·eÙŽŠw„ ã!¤ô>`sÐv¾È3o¨• ™L-k‡tò§°üÔ ê1Å…øÙPFdò¤pWB‚§‰€ä5É3úZ;Äî³,Ƽ_O° £¬Hvë—…¦£ðBL6aŽÙ˜Þ‚ÆÄó•Äiy? &½j§#ºeÓAm¤9¿“›Ÿór8샾`–GÐÀBá‚ë¢S/} *Œ±,ÝNÆüÆd*¸þ;~{ZùÿÙûÒ¶6’$áý ¿"[½³.ÑBFWã‘ß nv°a }ìzÜ<…T‚2’J£’ŒiÛóÛß8ò®Ò‰Lw6RUfdfddddd%ÝC¤õu2ƒ×-µ“äfØCÁ ÷£œÚ\ÀŒ\UÄ«ü>ÕQŽæ²3 ve|‹­ü&©âø&­šŠ*õÕ”FUçDÄ’µ®ñÔB=Jê—v©l7ã–øÆ%šœ%OZhãœÅ´y}n´£°oÚwÞ¹£ä.zôG·¨Ù]ÝÉë벪©ÕneùDŽÐº|ô¼îð1®2 ¦KÉ^ˆA’ˆ´[hÁA„×%©|¢^F2ú»Ðq½Ñ¯³Ê\E}m– T¬h°¢]µb¨Kc,]t(ämmlŒ’ÿð£å¿ <¯¬¯U+ÿ&6Ý‘¼Ïÿqù/oþ?no®n®¯6VÑ'=½ÿ`‚ü¿±^]ÏÄÜzŒÿø T½™y–qÒ^¨Ø‚V4¼:¹¼ƒ¢òÁˆAäëŠ}¡Œ¹W¤gw\:Wÿ=i¸7€Øne‹&´½;ÊðG+F_Ê1YP‡ËG뵫ŸØÆ6:BÂߊd¸øU¹i}ÎTM¯“þ@×­lÊÊUS¹:º2§ત´"ã(Su}tÕvBñç®ë@}2Ø6¶¿H’nò"K`ªûr&õ­ ¨¡ÓA`’qÜ2–á¬ÄUü„'=Ÿ%q{7®E À/‘ŽzÉ-ZÕžXª°‹·¹òË?Ðìù0½ñR¼¯VÌ5ÔqÙ;¾µáÛuÙÏ÷;[âòÝdpI¿ÝHÃËno·•‡ðôm¬Ý®ÛMÀOe#AÚñNo8à娈YVœGZ$¡\cÏ`6É ëQ<êï ¢¸Ѫæu¤žcàA2³N¦€Ð=^ìá^¤S˜2¾bÞ¤¦ Š¿$Ϥ^ÿ.õ§ŒÊ%¨øî„wTIJnx‚ÑŠìODo𔣶®T4”¨}Qµ?sƒ»èCnC´¤H Z”0ñ¶Gìjp'+3Û1¦Q6îÊz²/Ð › } LB9)n¦¿YlKEÁðµ5— )Ô•$C6šdè"|ØU‘ä‘@_âΰ£ÜJ™;8Ħ,zWT&¤”<:"…v"õŒ l‰Qý£ìZêÙNç@–dàÛÙošb|j¡·“‰å3CÎ!ÞäS$0†Lì™ÂÏpŠ™WoÒßT£’Ôô[§aÎìóÌKön° =Â]bÿâCãaÇöóv£=òCôV…b º(xûÔ’¶kŸ&nQºJ3²=ò§œÍcDÚÕ¼Š•êøšWvS>ÛÅ©;uî´é«j³¡B…ÌRã¦u-E^_œ57ª+¿G¸§ço¦E¿ìùî›7»ÿ DVÝbÆŒi<ý «çbI÷¼»2¦ïc±xvþæÇýsä EÝ”Ù[FVûñ5f•tjæ"ï­(K«ãÃåÿ¯ûäÿ8 zZntÓÆ„óßZu+sÿ³öÿÿa>Çñe?ìßÑÕ´º úe{óbs]¦fCë?]^ŽÓåå¥zÉô:øÎÝ÷«íø//•ËO¯¢®ELèMŠOáÿ€ó«¨¹j2ÚÅ(–ô’TB¤âæj«‹‡Sì >µýÞØûóÆè†çñ뿲±Y«fõ?këÿ!>°ñe§[ªØ +î^­¦Ñ?‡ RF$Eí=üÇ5UtýWñM$Þ„q7‚½·Ó§/k¤åaŽùáURŽšÃ"ëˆr9ÍØpË´yç*‘Tteß{÷Õ‹Íu6 ñ^z©½·¾NʱÙ4)´9SïyYº£q£5‘$õ{z0U&GÛK¿êõ¥­àËÓ7"öWªdß*Ù‚’$°µŠl[ÈåÙÄŸ[t8êµµ¥çt’žø®(Ö„D•ûm串˜i¾Å“ËKe-nÁ+OgãÖa‘ot5¾¢~C·¥ÞøöËý´g€Ãñø¬'Ðb‡ÊkÉŸëC9Yg T¶Ä—ží?›‘Jo®Ÿí' ô%,«—>ù¡ïîíg»z;óSšº•cã‚Îbçå~t5ºðØÞéN-É94.à(lc›ŒÇðaF½/z3ÛßOº0EIâ¢5£ÉA½#[ŒCsÀ?ºÏ›1?oÆîóT>O½çM §éÁiÈç ïù6?ÞvŸ~ÏO¿wž~ìt8è"~ñßTÔ›Šÿ¦ªÞTý75õ¦æ¿YWoÖý7ê͆ÿfS½Ùôßl©7[VfÅAòRò[‹ÅºoSdÉšs¢W§VÉCÇ3î¦7)2kV §º£š9âfEgdFÌ©Èa.?{¬TùOÿ¬óŸwnå¾U™j‡\»Ášü'ùÿÙ¦¿g€kü§’÷Pr²³_aeÃø—æŒJxûnÙ\Q°‘P؉HQ¶G×1Ë#PòÍeäì¸oF !S¡Ÿ_Átï U8t[8ÑDn óFIm ¿ 'ÔУVU] ÚT?Œâ«ëfèšèñ>¥Í6eÅ(þ]’ƃh«}1ÊW°ˆÞ=ó!E—SA ¢Kt@Å’ã ¢(ÅàOê€vTbéo´¥Ø2‡ýòà_;¦ºdtY̨]ãüNUevÆv<^îŽ[u@ªidÚãÁý+Âú3¼†\Ê;ªKð‡fÃíŒ µk¨h_*ô»˜VöÖéGJiÙ)#I¸Üj‡ƒAÔ•Eè!%o‡i·îrZ×?$ºPnØA›Êf^¡e}ˆ=3‰í00GöÕAE»ãˆ»تèÏ®–ùsVŒ„Ò°&Ï RvŠ ]W*ÍV%^= º TT \«£ ¸ÌƒÓó7D|;ËoçNR(ƒÂlÜTJâ¦*Àá|ŸËKDo7°¿²ý]#ÄeaM`ÀE‚³ó¿—hÏ|…¥ðY%üî>ƒ>¨rØU¾;ÏÈy…*‘þkØ)vÒýÝõêÎhwïˆnœúqãæ®Œc!§?$>$TŠ2çÇ”úh~Q2¤0c´;–0Œ M×·8²nÁå,Å(ÒFŸùi'Ъ„+Ñ­'ùÒ¨Ò¸l+’ÕU˳9ò2š>o~mè8}öïªq ¾©ê®èF§-ûDa±C»9‡@œKl…ÿ»Òí0ŽÚÐ?fL^føLYΚÁ.xËFbà9oÑGø7×P ÝúÌ->×÷bdÇaö…":òÃQç¯Ï…‰=c‘ 9ú°OÞ?%³#î¦^§3 ]ÿ–œ¡¨¯Šqõ9‡â確²­ütÆŒJ¯FZ±„ŠAx9lcl_"Æ=‡á*±`{e›ÖiIl5jNo„èJ[„.íS%n9Pvë,ó7Û¶AO÷[f÷̣ʒØ/¾sPnƒbÊq`Yè-<~‡}‡¿üPHþb/ÕNØF[`›ûò‚ŠæÌ8<’æ&2X<•.éבޚ8GÓËœpÕâ íð.¢ã¾†RÎ`¸–ä2°¯YŸ³EÎzxFä(Ökjò>KH@‡zc–i¥œJP„X‰bhLš–Ø"«Hç˲ԮGgÑ?©u½Á?ÁÊë›áН3| ·âueä/BkJ¤áÞOc~`òÀB›³Ô™ ýÌ%©]8;Cä.ôÌa»ôü àÀ>yœ¨jù ÔÅkJ¨£€W XcÈC×[ñ ¥¶’šÕð¯¿0_鱜]ézŒ–Ãz®³ÔiêP¬f* ²2¸‚š$Ú3ùSCnꥢýs…uF;ûmI¯ BF 5°­³Á)ö¯^‘õSúÛe]*ņW²Ên£n=û’?MŸ>ŽºnŸÛ¬ó›uµãuù÷Kv‡Ô>Ç]r‰”¾ÔÆ¥Ø_Êuý-Ù½ì{­'ž.ÖåT·u§ÜŽÑÓÉ}àÊP…z!åÄoÇãkj›2½•/Ie&à áW*õö¼üê'O‹jÔ³÷2ÊUÉ·á3F¯mõ¦ˆ>µ*TAÒ»Û,”P€ûs8 ¨‡_H&Žºe ˆ(B*'1¤—™´tR)dC”:‰f9U–HºúGZiGLe‰cQ"fóßb ‰b›ÏèB¡´hC;1*ìñ-ˆê¾Êáo¦êê}uæó võ2ìG§D¾¢¾¸›D`¹Y/†Ý›nrÛÍÞ? …’`7`´[0*À;ÍðßÇòó% Óa¢W¬Ã9ó‡)§RFÊ nÀ×'û»ÇÇâ]Õ»V\€”¼áMjar{Ȩõ®Š^ÒKëk_$±S2"²DqßÞèæZèo¢Á¾{7ú ¶ÞR"šhå½´@ï¥<Ûîõyl»k®mwMKÄ pw˜ßÛá>Îóû:ÜÃÕaO‡õ/†gõpÑ¡å…ãç›â/¼¾\M“ ð—æ·¼ŸÆî^a'[ÜOio¿tS{¹Ü—FØ/Ù*÷ÅZÕó;žý˜ÔO4¨_šÂ–>3ùSÒOoJ?ÕÔë Û‚>;³¾ñ¼Íê»ùE™ÍÏn5?Áh~d•I6óyƒq&óSÙ©/Ma¢¾4ÊÀ{´•üWo;c?aV‚‘vñ“iÙïf®-üx$Íl?ÑÞ:‚íÖªÿ7ÍàÿÏ~ríÿ1^ÖO€“â?m­U¼óßVµúhÿÿ ?òl'@yÉ“ »ÍaO103ä0!È0AÃÉ'«¢R¤»¬P[ „í_xåHÏ,1K+‚Œ «m¹Ÿ…sÿ¯9ùg¥¶·•@X>›cDÑ+«7ÀüÒEÞ$êj‹¨Þ ”B^W¼S̈.¸¥TÓJ¨ç:må™<`-<ÕMªf7K§ÉÏyÂ7ªš9\æåƒf.Tz¥À*Q¥ž9wºÛ/ÈoÖö«öÞzªª‡îþ‹%ø¾ Äi—™¼Ù¶IÆ6€zãÑÅdO-¾Ùè[ë>‚~Ô–Ù@¹f8sñ™œãîˆÆ°ß'I‘xFG¢Ë´w´Ù—„buTRJ!‚fæ´ðÈ ‡¤vèå-*ño#J´ÝLºò˜€úSÎ…díÓ«Z•ÚyæÀKiÖƒÊe³h±CxV¨»œÀ Ù¸bÛý ±Â m´Uè9øi«M\Î!ÑDýѧ†@¨Œö‰oåEØh$ý&™#éa)øŠºýs÷ oÏ8$†¦€^’ÆxÔ7ÕøÌ舂jˆÛ_UtÒkSõ GRxfªc¤n0$epréèwVw»ª«¦1¸Â¹·Ž›@¦*éâèZ-2òð9O•=¥àî߉9|zZÂi„jtÈR2.×_£V[† +Ÿ:ë¬cÖ 6Ä$:q 9k3à¶CtF1ËC8dÚE¦^UC©0H›ÙŒ¦R›546;H‹ÓáQ×vQÉbû}¥ôQúÿE:Ù—ÿª fü?õÿô‘þ_ó9Íáùe»~Mã÷%­.c'0(GÍüÏ‚s l\B¯‰=øÓâ?ü-b#:øsŠ<{Cv§œ†þ:!=nȱ[a:¸Aé.8(]«^ñ¶Ñ  V´ávÊFª¬­“7VØBçKµuqd&M´Ü6vÄe’`ÈÍÖ2‡GÝ¿ KQ –2›ÏÞáÜËãÍ}sô ÃT8Ìqˆ«UI„í£fÅØö½ÓZBú¥I·´`{Íx¥åxÕÈ·!B°e¹Ÿ›ñÞí¶Ü©S3©‡§Òöý¨ÓÜáÕ¿Šg½,7J7QâgºÇbbè nX “Lö$Xibie©E„=;¼ð&ìÈŽ2gçbíáýÏFûMëg¦Æa<ÍÖ'z—Lƒ,ý˼§ÒÅLdˆMy™ ½Ã{ž€Ê"m”/ ‘ÏúˆãÒt±ù}Ò4ˆ‰niV¤ÛXŸÞßSm”›Ú$g´H:£Ež3Z$Ë"ϹŒÉþège÷ÈótŠØÓ)b廊ñmzKý£rìÚ½z—Ýò8ʲ^Ê»î¬F;Aî9´Rð/„½®kŒJÆcaJ§‚Œ³°œ òœG`hhIû<ÇjP&€ÞÐçwç ÙR²¯1_s´àÚ¶Àñû•‰?ø6Uߟ膉˲߉6÷Õ)Aúžý&š>K[ñ ý øïv¾™2Ýñ±Qâúµø1âØ‚+_ÆŽATÆâý¢$ /BL"\ +wÅ‹`ˆ8~¥l÷RñWôЕƕ}eyÌn/03振LͱÂz1ËÓÙZíâÉcƒÇèe ÔKÎö´pJbÀ8êÖ/ÈPæ~V۵䒪_X¦Ù¸>7×W/Ñmžm"&"nŠÑÈ^_H³scók;V™Û~mzLòª»Me±ÌšK¶{1ùkÔB™ÎâÚÓ)ZŒ=ºkñ¬ ÝÆÚ;Æé.Ý~ õQæé²Õ©8‚±\VUf1j7œhŒQ»:‘çY³{ b ƒvùØž±œ©ÒVá¿2ÝÕöæK£ ¶§²:7fçDH3ØpÓÆâ.Ûo{© y*º"ß°û eky±ŸË–™âê¢ð*lˆ“3ñKAꙈór0ÆÀ-+›9¬J²¯[e2Îú›ìÍå`6kp«MI‰—ŸÌ7úõŒdÇy'Gó×ÒÇ£š'Z¢ù³¤nÝõ¡ Øc*¦d^ …Zœ”|,õêÆ8\™‹_²û*Yõk£fç–Ñ3vf4ö[Òćí{-°¤ãU« õ¼0æµo¢%;A"'€"Y Ó/ä gYy/;NÓÒX=klNhò½¢åæZüÖ4jë¼¹Hû1" Ô¨ÅVÙ7ÔÞÑg©H; ÿÊã³ÆÍyIå–ÈôÝôœUTsGô†tQbt¼-~ÏZË•Ògª:~'º? ÂîÛ‘n”­tÐ㣴 1„‰ÖâÁÑ/åóóÓ³ U´‚pi´ÐÌ-}œWšB9¥ÏóJ£\Ñò|²ƒ¾ âWR±kG€…ÒE± n£Ïq9[¹Zá×0e;ØëÈWG:«ó~©Ž¦œ=¥2 IÁ'šw»fý„…ºgçx"þ¶Ñ4gÚ5©4ËoÎ|óŽj/IK´–ãsÄ´@Ï#h¹åûånŠÿ#’=(½‡Üä"y¨²†}JV’%¤oL”5CdT€ÑN¯7@âoÅ}àÚê„ÛË^ÔÑÕ[óWääíW0ƒª&Ñ'KT¶¨ô°˜ ø6bÕnØNqE=1èãg™i*³L„}”ÝQ‹/IE¢›ã•TÒåwûW k¡ÜÆ#Š@ÐÄÙÉ«¼Jäâ„@.Œ¯‹;;ÜÆ[ÅöŽOöÿ~qrxxvp®}«èt³V|G¹¶»ÁþLr/Éþ^½¢€Ob“•˜4 Rªi/lD|Rè±p3¿Cš’µ”[šð>êl+¥Ky_2 -½U*PŽÛ¹¢$‚°¹JÁ.ñv0äÜÒ2 v·ž+¤Ú#ùNTWÖIh]…/V@-:v, v¥³<é"íI—¥ o º-íL-±»œ¼´Üóæ…d}ñ$-ßÃÈq‹÷;ÐxÔˆ[±-IòvCž[†X8¤ƒYдä¨7kšŠ™‡4‰üý \:¹E[é£'1DRÔ-ÞbcdñO€šq«õñ‹àA‡E鎷‘”E©Çx¦—P1P€þó‡7Eg­sO±{y‚¼ªƒBá³t,êì²r äȵ”zþ@®}#7ÝaÁª¼{hwy§… (J~r´°-´È%¸\W;¶nœLÇ1fWbaxŒ¶¨ÈÅN©|w€,z=4@B‘ÚÏ=…Ã’è˜  ôš˜Ñ¹PÕ“¢¹%âß²–„ˆEcòíÖ:0mÈyû7‹Ë6%Ú¾”Ÿhš§õ§ÄgT]*E& %'¼í1¡;3ìrX˜‡Z5—­èr4Ó#ˉU¡â—ì(eð#ÁÈŦö4YR.'ÚXœ©y÷õë“óÝs´4 d©Ò9lÿäÕ«ƒ×碑¿Zü~<­-?! #p¦¯\õ¡…ú«ÖLn9yؘ\Ð>šèµfߌ>+šÕ’Tx¤…·Ý¼¤Ðj#màòÄq~´tvÝi©ÿM³ÇÅÖÚìY§Ä¶ó³øØæxÙÛG÷±ößä¾  ñŸkkûïõµÚ£ýÏC|Ж2;ÝÚHâ8½ºÖ“­8²¢9›,ÝÓYõØÝÞŠ¾~šXOô7Þ6ŠÅØW]·¬qÔËC¥A—–<Ú§ïÖÚ\—8®´ÝôøhTlk-EyJq‚±›ûîHÚÓ/îr;l6Û±>âŠ}Ôj$ó¢™ FÙ|B½!4‹Æ<“d4Î…Sš™\6¤… B|nÞ*KfôÓ&üÿIÑDö’ª9«ÞGò‰±}´z´šÉzèž–C’ÅÏg;D¥i­»!¢)¤4=wD÷+kêEÕ{QQ/jÞ‹ªz±î½¨©npè6ÑÊö©UQÏMŸò±ùg· âáÍU¡®'¼Áûe5zrË  Ä(e· e-!ÏÔ¤S /u'nÛåÙXžj®=‘asnä\Ùs^é¹ÖC#/sæ³séOíãÍ™21JÑ€9 34È{ûÑ Æ8mÔ9ËÀĶ(1b—e[‡ï“ÇübI†5±KùMXf–q‡±íÈ5íÈhYƒ· ø T¸´ä›sà'ÓjL|@Ýc®áGØo¨2:Hà’%¾4£ö oja4ê2€Û0˜êºäÒúýÅv<7¶&|¶¦k(ãbå±ÙŒkñÅ!Dz[ fW}6¥4Ö ÈXßVJe¦VB—û’Ø,‰-c·f*÷~ËN0¦ž©ÑÆŠËo™ë·  –µ1!¼*A‚æa‘aˆ{ –PY/iÒBïÉ ¼«bYxW…ÒUxV…gµ5yÉ5GåŽíì(DüMnŒ½ë8ƒÔ֨ʞ9ëÄx…xÕöI.)Œ«°°ø…£n§Œ`˜¹2z»{‰yÕ¸»`K*ûÚKÆä³îu̳è®Yšz €¼Hƒ/ukwb2þ»Ê[ÖÚ­üÍŠ¨”ÔœAî¾HàýS®`­Ã R(‚ìNÝøõ6ðôöô¢×OÙyꪾBT‘àuÔ³a×Ãö'Z-O.‡Ð2·›Ÿä›C|q9ß‚l|~òæ€7hyl“ùæz‘õK<Åwz¿%3Äò^BCÅâ;åk—˃-å´AUï"^â1àÚ²Rc:»ò«ÅzHùm•µn:õÈ-®ˆ/.‚Õ¿24'ŸKtLN똇¶hPâUt1éÔ0ªîÀ\dNÉW=¡rS%|l7ïZüîÞ±îÀª˜aÎÀJhƒ(ŽØ! ¨œpåìN¡kª­Š¼]­gÁ¶z²ïÚz|ÂÆ1åΡ m¤m‰}·Î×E?ׄlG»Ã ±*þrU¡·Ü§Éý»AWýʾ^eUðŠn)>׎»7º˜[Šâñ÷,37e¢•±Dóö:ø¢·A¹©Áïf_@*+ˆ÷haßCZtºåü@¤ùqH­Ô%ßVõÆá†V¬|›â26Ëø*±L è”.T˜í 2gˆPŠW.ĦrÎEÎJ:âeIYA/ÀÏøñóÇü¸÷?ov_¼:XtâÿT¶Ö6¼ûŸÚæÚÖãýÏC|ö­›¦…åé¼¹—ÏÙšÒ“ÁÇ6Ä4úQPÓ>ÔD¤<ãȇIý¤IL¾†Þ†~˜ô•U˲±jáÄ/nÔnVX £±Vý(‹ååŸ#mêq™ ®E+þ5W©Ña?A¬^…¿ƒ;Ëð]ÝfË^aUã‚(ÿb7–¥{w$QeïY©ãVa50½öX¶B\FƒÆÞ†Gíð2¡fe×Ýie ‰é–"nF!Ù'”ï&ì’KT¿×'×$´µê:¤‡l„}˜žåIJ­rûv2ĉÇè´7éuÒÉfÆ$à¡Ã ›p ,Ó­ „A£Ó eéIVBdâ g˜öiøšpºë^ aÆ@~¸ z;OŸzÔôô_’ÌžvÚ«nå^³µ¼|LÃj—.§†6ä¬*»®Á4$†@`QŒ± ¯Æ]¦.„‚PXl€ªËUúƒân«jõ/½„2jR…MT)ÛskŠjd6,"+eW’ × yȉ³æS〕[âëßåÿrTOÅ]øƒL~kccdþwøhþ¿Qç•õÚææ¿‰Åv#ÿóœÿçÏ?ýXX³ÏÿFm­ò8ÿñ3ÿücV@“âÿW|ù¯º¶YÙ|”ÿ⨭Ì3ÿ´ÓŸœþ÷›£—?œ‹ QÕµµmñ*n\‡Q[ˇ6tŒúƒršè£¹5)U£þ‡¨©"½¤ ÁA‡d ÎŽ{ #)H8Ê CKØ?–‚¤â`Ø1mê! _ Þ¦;ø¶IÑÀ5bæ°x-™:åºÊÝšßa9yJì„ýô$ÙüÄaÎnLåý°›¶¤$ÕOÚÊ÷Ñ–Ô.ï@~ãd˜ù™Çí¨ÿ$%Ô ¼nFËÑ~Ó’S[a#nƒ”áÚ]ýD¨í®øRV^;¯*á®øÇtpî·wÄÙùî˃»ÇÇ'ûd7º¼tK¦óî=?¹*õ‚õÞ2ÉZ¡P7½—}GX÷p)vd·L}V^—d©M7ƒù•‹Vn͸bRõ¢¨íæÁ EU ¾#¥Ëx@Ö'­Ó„&Jñ°å€¾'‹YàU’¼é tuæ‡G4jløú`­§”‰€ r€½à‹ žÒ±i †Xúò¨ª|ͽ1·#9p B¦…Ń˥ǒk÷TixÌb¹ôc0¿p9å}¸•‚§¼ÍmÛ-S €ÁOå³£×çäÏ…Ž˜…W%n±'?îPA ±º¹>¢àéù*Ezø mލtvþæèõKªw‘_ϳJÉí¼žzÏòdÄìiɯáŒÅ!ˆüòþ0Ü*ÆÖ©{ĬedLòþ0ܵ2¢’3oµ¨âƯe†Ó¿bë¼Z ¬‰ KzÔÅ‘ü¥­“z=<ŠÛ{©eØ‹—™H÷¶3zœö0ÚÝqrÛŽ>DmΪØ8vùž7sýãã1Ýí+=ÿá<”…DßG¬Y:~(˜]¡i¹sc¯^yçÛ¦ ß`ë]@…^½|‚@:G±CÕÏèä_€ÿYùÌ-ÀÚƒJ5\,þZøG·P´/ºÇV¯J;ê^XUÇ”üD€UñêÔÕ¼ÅòEYʬ”{GÁÑ´ÛÉÂÁg¯Ž_ÿçi?îAe™ˆáˆŠjÃ=žYõËí§zju×Í=þx7ð§þL<ÿ}ýøÿkÕLü×­Zeíñü÷KŽ¡éöBÿ³A'kÈcœ{à`2HË?—Ñ¢š6)m>ŒRñ àîjÓe rYî€ÖÞJaX¤¼Q( °Ð¢zlm’ïÏ‚>cÖ¿¥¬þªúŸÍÚF5«ÿyŒÿü  _•™gåþÅ®±*l˜öÂQ?¸ç¥×$ÅÎs‘Æòô¥j`¤oÃ'CPÜä Kæ=IÖ|. ïƒ'íx ‹Hå”¶K±®nØï'·(8‘ôé$oçrÔTøÜ‡ÆùrÇ€AÖíPr\± È'¹€‚õ:öF…¡·zíx`b$ÜZš1>bzGîeüáÂ÷qå´oò*2Г@{ã^àÜ•e•W¦?JmgÓª­$p ;p3ý¥ød+x$A„ã¯":Ú”D:$ LvœBPÇÙ¢Fê,µûbÿï¡çºkíNMê$ò?‘óñšq'OS&Ñ^ŽóÒgŒ±*?eÉ«£ Œ4â‚ u®TWÕê¦rÝPÏÂ!;]ýsTÿàH­Ë”ÌQXuÁ˜HŽUÑœ`ŸOÒ¹Œ»‘*L7ð/îJ+QFs6÷uÚyO~ùNÄ]yO܇úìɶm1 VEwÍÛ¹çhiòç FkúÑÊ&ÿÐïVÒnú…)?š[^Y¨HÖ$É~Y&Ζ ]fø¦­²Ù&)Xv~*Æ€Y’÷ï-M^Ÿæ€Çô6­6êØ‰QÜ×^û¢â;}ζJíÙA¯¨áxšFfwvþwNé:ª+\fB þ}{t¨zt8M—ݧ׻oÞœüLú6 ´fubÌ*Ï ¬¸{ù­îŸ¼Ú;z}Í"½W³KR>ºVæµQÉÑöUG”­Ê²ÖRË,žÀ4ø7Ð]v/wÈ%-ƒ:ñ‚> ã>²Ñƒ:…-•|5’Òë¢L†Yùê_æ¼òÂWð'[K¾;Ô/)0C»iN4=ÑrÏ'ð-ÚÑù˜%ÕÐfUøtS/üŠMÞüZ(1¡~ÅVè;<34Ïσ(ÊWѾÙÄI5P[’Ë+ðxŠ«…Á·_ _ º‚qŸ1çÿ4öÑ$²Ñ¹g“ôë›9ú¿Gûù¼ì'ÃÞò’¯Ä»‚ìÓåãŽýûS4CEºÀïi§Ý}¿ÚŽ/ù7ÿ4{O{íáUÜ•ÅOÖû§x OÿÀCÌì$ËÐF7l®Âw¬±¼T.?…ÿ7:Ooûa¯õù©2ZÑÚHT[,që½~Ü‘ñlø±¼TáF­½¼”£úXÊ1‡±ŸÑƒß{Ö÷³þ-¬Ý¯Iú¿ÊúV&þÓæ£þÿA>d)dV‡ÌçÆOÈâÎÛ£€†=È cò¿À L/îºÇq÷$)_çË8ÍÞ1L«3ù9ïz u¢6 ÙÈ; ƒÞ¨[ø¾GÉ0Ûgqæ^6È“PwŸ¤;ú⸠<ï"½ë\Bù~âË xV©%ú‘ÀxqR,W.ð##laQ§>(p£ÑÇFD‚8NZ¯8à‘‰õp—^08ßòŒÎ¢IÑo.ÐýòMx uº0¥Ñy¹ÞRTR±£]ܹ&L½þ =Ã_ú©µZEÖ‚©jð\Þ§LŒ´"JèâH¡ÄDéÂw)`/zÉÞJ?Y‚a ’=\C+Б0¥] Âüáö.†÷.†²Ãŧ4lI‘çPeõ:ÍÄ®ãugÎ~ùúè2ú;A%œ0[!I:´ô~òNNbŸOB­ø£øî;¡!á•+âS ÈŠï †Šd[xODÐ麘Aßm åqzgTD¡<VAW,ÕNïÕññ‰A0(‘‰*®“ˆ° ׯRËK8)á³=­Z‰Åóºè2…è.ͨ#9AëfdÁþuØ/Y.qHÕêðRÜ·ãsÞ]ÙøwplåÉ£.ž-ùÝŽ¥˜ªÐÒxSÿ¤ûóÈ9Ö½²‡ž¢Z¨h‡³0‡“NØ«¤/2wôoþZÀ<¹=:q•Ä2nL0#ê‘RQPs&ìqi`0îXbAYºìG-tC×뎕äQŠd©tàŒ¡/oLÓÁ7hMîÔy1ÉØmðŒ)”¢RÍ…iÏ”Ùá\ m+ŽÚMGÏÅ¥HÉ ´»ý~Iød€g·o_¨;iµölJŒ-¥ÉðæŠ;k\w:Àµ®ˆM)>ŒF_a‡JtNì'W°"SôUÝÒ÷¦ÂDoªñûöv.jm®§N p¿~Ñ›ê *MÇÊ*«vUÞJ«ñÅ蛡‰B›æaÿ¬âFQü¨jҾϥ$Ö{L¨©ûíמ¨O™žù0Q'8¡ãͯ(ãæÉº†.\0%\M›BTËQŠ-i/|yG™xó¦yI²²,Áȇg¿íi…}†rPeÞÇœ^­Ñj½,S=㉊CŸ[ó‘g,XÄ;÷L?3*QÚ^$ìQ·ömGó64õݰÏ\±îÌŒe XWƒûÎøåÑBðÏò§ÿËS¦ÌÓÆ$ÿÿõM/þsµR…âçÿøX¶Ž¡ðÜGù1Gq’˜¹ž™‰³]ó‰:éEt„V®O”ãï'Ê’4 %qÕN.QÕ@Y3`G»“?„¹…ÕÒ‘wNo_ëã¹/"ÞÈí0âR.vܶ"m]­†c™S‹€»xØ™ª$F›{g$ZÙÿÎl:ÿßûé€'é7¶|þ¿V­n<òÿ‡ø¸þ¿–øÈ yAÊå…ªb_Xq?àm6®Ul™MˆŒ¾Ø\2eöö'ºz=D-EÞߣۦÞõ]CÞH[0( Y÷ÇíMW}ánH˜ñc¦(çôÉZ¦¢"iÆ`ëXÅv¾í{bN1ãÄÊ9ÆìðÚ &7¢S´ƒFáGRÑÞ"® OM‰fn‰¦)é+³%0!–ðŒ «Zû““=Á¾²5 ÇÑ·î"CFÌ]f ží×ë”Ï­’Ò—×/È­rYÇ^òÏ4|¯Ý:Å÷ßÑ­BÞé‘ê¾4þ³–E3†Óö‹˜VÇÓèR‡ºTÞ´™Ð*Mk™Eµ¹>a]]l®ÿ±—tÐ_]øhŽÖ·Øî«…–GßZbýfœ_¦›2éˆ2©U¦9¢-k±ö#Ê4¬2ÛùE¶M‰ïóK|¯K|ìtÖrËà »TeT©Š]ª:ªTÕ.UUªf—ZUjÝ.µ1ªÔ†]jsT©M»ÔÖ¨R[#X$-Ñ\^ÏÍ(ÒžÀ+ݲãÙ¥[v*޹™ÇùÌëí‘3ïffÛŽI³8†i2Ÿd¾IɔƱM ÒüÇášë殚òIòN¬ÌGy™‰òŠêb£s JUäáÇaÚÙœ#Óòl'߈Åñt®ùÌÍ3¢:9FÔC'¿ˆzèäá‡n^ùÌÉ)’á’2F° z;·ðP:ŽYøEùM«ðK>ÊVrþF0 ÍþXz„)Îÿ¶‰Ý\mL8ÿ×Ö|û¯j¥V­<žÿâcÿSJ骞‰ô:ìé^ùH™ìÃM<ë‰û!(dÐˤ?êð¯AÖ4£.Mc8[¥kÉŒA/à*Mms}×uËìÂÄßr‚ôCü‡œ.Èþý6ùƒðrØQ°^æ²ÎaÈ*>ŽÃ5gCâUÿÙ{φù~²&óž-ðáßQõ¹À¡*atÖøsÅD$³/A5wTþ ŵ&éY!¬^ žÉwQör-A|‚±Ô×|,}Q…´íŠu‘ŠOdKËõož¡U‹¼±–ßõ…³ü …å7¾ †Ã.n÷ŸHãÊÝ[½g‚R%µŸ‘¹^üL4€™>“A Dó™X^ú‚WýƒŽ2b0T‡…CJåv“a»):q'nînÃ;NGµiH€–d¨\g™`!é­0—úÖ=½wñ®oËí pi¬@ä¶líÕòãRàfI´ºh´õܶ&Q­Ý®›ëüK»k滟„wUòím£d ù™6çAk¼m èáÖ0šC’Ù®¶‹ »sc-êz¨ßÉVL«™û¼ÝùÉzX0e¯£°IrÂöü£[o-i¹ðtEJˆÖ‚°¿Q”êV ”_¼>x³{~ðd@$Òdêðѯ€½´èAIÑ>î’a_ô¢~Ü;ÅòÈÆl&{~ùì™Ü´‰©dàô†ƒŒ ØÁ«,ŽØïG ‹½•ÛíZ„°ÜîMØ[ZX^z÷“V?‹þäËLËŠyúüE?™F.}g-[h؉}ÒæZˆ Ÿ lÆ…_âó‚lÛ!~uĊϲ­k¬øÕ5#9ƒË¯æÀMe‘ãs‰©‘Õ;>·˜;PÑãs©Ñõ?#¹‡Ë—çÀO­Šøñ9ÉÔøêˆŸ£L¨¯úŒejü@}ÀOu$qy÷Œø9Tø©úŒf*üjüT}v3~ ~|¦3~ ~&°µGÍŸÍuÄÏ\ÌGVGüÌÅ}d}ÄÏ\ìGÖGüLà?r»=T ±3÷áÚˆœ¹˜WGÜÌÅ{¸:¢fëQ"Ÿ!Ö\‹õÈꈹX¬è©ÍÅzd}ÀOmëÑ¢Ó"ÞS›‹÷ÈꀠÚ\¼GÖGÍÅ{d}DÐ$Þ£«Y¹AÑ|ìÇÂÑ|üÇBÒ| ÈÂÒd„Èy°DLº6RõKs1"±4+RK#™Qž@laªR£5h' U«œnŽk>K’µóÔvÝ~叿s£œ†«yU«Çë>#Êiµ–Wµv¼^™Üêz^ÕõãuŸ»ä´º‘WuãxÝg,9­næUÝ<^÷yJN«[yU·Ž×G²“ÜSÍì4l‰`Ýç)ST*X÷ÙÉTT€u |N2`] ƒï硬 „às‡©ë%øŒa*JÀº@ >O˜Š°.ÐÂÔ쀎¨³Óðf¢…¹TFZ˜‹#`ÝêñÆ\,ëÖŽ7æâ Xwýxc.¦€u7Ž7æâ Xwóxc.¶€u·Ž7¦ä R0+-`5¢…9øUZؘƒ/p] …9ø×Z˜ƒ/p] …9ø×Z˜ƒ/p] …9ø×Z˜’/(åÎÄ w‰98×Fr˜ƒ5ÈÊÕãÍ9xƒ¬\;Þœƒ9ÈÊëÇ›spYyãxsö +ooÎÁdå­ãÍéiìæ ¹]lÎÇ"x¿ØœGð†±9“àcs>.Á[Ææ|l‚÷ŒÍùøo›ó1 Þ56§äRK:+M`5&‰9øUFŠ˜ƒMpÝêñÖ\‚ëÖŽ·æ`\wýxkÁu7Ž·æ`\wóxkÁu·Ž·¦dJå=1È]ckÁµ¶æ`²2Ðà BV‚˜ƒAÈÊ@s0YHb!+MÌÁ de ŠéÝcÌArרšEð®±5à]c{>&Á»Æö|\‚wíùØïÛóñ Þ5¶çc¼klOÁ)ìË›YˆâÐ!Ší9Å¡MÛ3rŠC‡(fä‡QÌÈ)¢˜‘S:D1#§8tˆbFNqèŜ¾‘›ƒ(6×™(fä¦6ÅŒœÂª\=þ~FNaU®?#§°*¯?#§°*o?#§°*o?#§°*o?%§Pט³Õ#¢ø~NÁµ(¾ŸƒSÈÊ@sp YˆbN!+QÌÁ)de Š98…¬ D1§•(¦äênz¢œâû98×F¢˜ƒSÈÊÕãÝ98…¬\;ÞƒSÈÊëÇ»sp YyãxwN!+oïÎÁ)då­ãÝ)8…1(¸E>¤ùÞÝÌ>‡™ÜÝÊy s´ó°ÿ}ÎcÀënÎcÀØ^ÎcÀÅ~Îcå‹)H6™ʳÓîAÎ ãaÞóêñÞZÞóÚñ^%ïùúñ^5ïùÆñ^-ïùæñÞzÞó­ã½)FJ晑J޾—™LfÖ{™Ùd>¼—™Nf±{™ùdî¹—™PfŒ{™ež·—™Rfg{“çTZzx#Õ:õ½ƒœ8ÒüçÕãýµ¼çµãýJÞóõãýjÞóãýZÞóÍãýõ¼ç[Çû“çT¥d‡*éw3ï v+÷Œv;÷ ÷ûÜ0ÞÝÜ0à½Ü0âýÜ0ä©&—ìh²C–„¼Ÿ^¦äýìü2)¿ÈN0Óò‹ì 31¿ÈN1Só‹ì39¿ÈN2Óó‹É³\cÃoÄ5¥í{±™óÆûb+ï9 w;ï9Œöû¼ç0ØÝ¼ç0Ö½¼ç0Ôý¼ç0ÒÉ“[“6DÙ¡Jz~q÷{˜û¢z|°–û¢v|PÉ}±~|PÍ}±q|PË}±y|°žûbëø`ªÉ%³§ì%=d§—éù ;¿LÏÙ fz>ÈÎ0ÓóAvŠ™ž²sÌô|d¦çƒñ³ìX1Yc>ô}û G}˜ÿ¦z|¸–ÿ¦v|Xɳ~|Xͳq|X˳y|¸žÿfëøpüt;X9c—bôáfî+ûáVþûvþû÷ùo`ì»ùo`ì{ùo`ìûùo`ìSÌ»²ËòÇnΕ‡þ¼ëCã¡?ïúDXYó'^Ÿ÷*kþÌëÓ\eÍŸz}V«¬ùs¯Ob•5òõ9«²6Åì+ò ÈÙ¯¬ùÓ¯H•5þõ¨²æ€>ÞTÖ| Ї—ÊšOúhRYói@<*k>ècEe- °œkñ¶“SŠžŸ¾ pÈúMU[½ï*›äwU±]×äaªÝ^Ê3Ò¦:#©gµïà§z˜øÜ¤AÎÚ+4¬szE6‡WÕEöj{æ^¡ÍžÝ«-j襁À^ÈY{…æ€V¯xþÖ×§Ùg­ ­Ø«ù{T“=ªÉ­ÏÜ#4^t艺´¹Hrš¹Ohiõ©ÊhÚZ\Ÿª3âIÛPÞ—­({JktµÍYÙJ:j3b\jÚ„¹>+W™Ô©õÙQN V§6ª³2•Iˆ3w MKíNmÎÊUüNùĹ1Çô¡ÍªÕ)¹UÍÀX&ajÖJÃÚZŸ•µLÂÔæ4…V¶v§¶gå-15ãîYS6¹÷å-5iŸkn{f‘eÊ·g¤ƒš4üµ;µpÞ²=#Ô¤E±Õ©ïÎ[¾Ÿ‘·Ô¤©²½¯Í,²Lꂜ¹[hítkf¹eY!È™»…Öv·øzb‘ AÎÜ-´Ý¶»U]»/‹Ét«:Ó$Z¶Þ÷ã1ÆîÛßæ:g|ׯ7›cLÊ¡[ä@ÚÈç09=ª™m@jïdÁ›G«tÝüV>/YÏi~Ë4¿Ío©‡36†íªùöZ.Óh¯}{M¾½6sóh¯›¯ä3‡œÑ·+ÎèÛõpÆæÑ¼^7_ÍeíêøÑWõè«37úºùZþbÏ}Í}M=œ¥ym¸省ŒøõHÖs—u;ŠÍRo¯kD®ÏÞ>úèöG,âºèö7sWq{süø7õø7go½tû[ù{Þø·Üño©‡³¶ ªýx-wÇ#Ù=‹5‰gd#Ê'B·_ÉßÍsÆWœñÇõpÖöÑ­B·_Í]ÉñHFÂã׌$ž‘‘Ô”·Å½WrMz^è‘Ôò7èNhV–œ«YtG÷šÕǾ‰ÍÎ!ìZŽìn³­&šÔlei×rw›­jMФf«ó“:Ï»Íò¤fk3’”ëmŸÌ`™Ó«&ù¬~©ëiì¸fl¼øç_÷Ž×ÿÀ`”€€Á¨ ƒQ£, F9¸/ìà¡(LQX@Ç)èÂ"à`†EÀÁ ‹€ƒA ƒF,™¸/œšŠ5ñP„V“1,ÐqŠy±8#cp0¦Æ"à` ŽEÀÁ˜‹€ƒ1>îÇ õ1ŠÐ®³„v=?¡™" è8…Y Q²8Òdp0Ê"à`È”EÀÁ+÷†£­<¥©.‹è:|Y ³@Pf!€0ÍBaÀš…Â7÷TSanŒàj2|Î"ºNávÃó,†óY ÿ³@.h!€0¼ÐýÕL”¡ô–¥¶ù‰­¦C- ×êhp04Ò"à`(¥EÀÁÐK‹€ƒ¡šC;ÝŽðô0d¦¢F-¢ßej!€0*ÕBa«…¨W „Q²£jÝPMÅÖzj«É€]‹è7øZ ¶@@l!€0àØBa€²…€f÷¸ñ£š ·<¥1>“Ä6›ªÚ —¶ÞSxµÅ@Âpl‹„áÛ ý-†‡[ $ 'wH:¦\–òFš"iÊ«ÍGy*XÝBzOÁí ƒá-Ï[ $ ¶·Hœo10˜ß=!ÙýFð¼Ñ7ess=+XàBúÏÁŠ‚./\ ( v¸Pq1 (˜âýA™ˆŠ#˜ßœ‡ýÙÁ2î¸P r1 (xäb@Q°ÉÅ€¢à”‹EÁ,çu• ’}x‡«áéŠ8Ž?DÉp°#ÄËÓú§¿$k_„Xyº¼ô¾Ókébí»¿\‘M·ÊŠÑmùµ|ÕN.ÃöÒOþˆ]þ·ÇÏŸûóêøÍÑÙþÓÆj#l·Ÿ2é¤O™¤ž¾ o¢VÜŽîÙÆ|6××áou½R©áßÚúÖ=_Õê¿ÁóZþ·^r•­ZmíßÄÚBF8á3La_ˆ{ߣëöèré`ØŒºƒ‡èÒC~¾{øÝ¡H¯Ã~ÔÉåû¨1­¤/ב`J6õËËË¿lo^ì_ï¾<«¯vjU±zU«°ß¸®Ç›Û›bµuz´¿¼|‰0W?no®¶ãîðãŽ`ÂZehæE9ÃAÜ.7–—® ±*ûðïÕPQc5‘/——Q:˜¥a¦kŸKÚ™a6ÃþmÜÍkŽßxõXÍœª8ª†ƒ¸æ]7ìÄv|™Ûùd4ü${SÇÁ_¶“üvi1c `N3ýš¶ÇòýøŽëBSõÿÞsjRµ¬o–—Å ü_œÑã´5âVܽ¤?À•˜´²ç±R\^n »œ¨Þ˨{Øê°C û‘€GbGì_ìï_¼ÑäÍxþXó\§?ºÄϸÉàÓ·Û%N¸A–6/±?_Eb7¶ô–‘LÓL7ÃÜ”»ƒë€¦ ê‹Y‚ªÛ¿r¨Éyht^h<ØoÎv%Îv‹ê£ÁnÿJtìû}싆‚lš­sÑNØÁ9} ²èú›Sè µ¼B‡v`òtÛ8·ÙÆí„q¸_îF·ð5(ª—­~؉Î~C¬ÀÖ°²¾Z]YW/™Á»§$"9Ü5õ:ê6OZÇݼ¬Z #îbIøÐI$ñvY>®¼+ú"9˜ÕF#` Bñh 8Z°²$½=/ýt`û] yžUàÕO-Ñ’sIõ«R|W2e5Å—aŸìqÖíPÝ@4_úl}sp.Þ¾{'ñ_€gæ²Æ0™N³„2SjÍ*aÿ (¼ŒÚeÄ‧TNø¥~Ç cÉFÊ,½1íºN:èð,v-@aÚ9ÎýRxôqptRNzQŠ‚{¤ ¬œœî©*ÃAo8 ´’êÏu6£þ¯…t Ü*Ž»™Ä&bÃQ±_0¬õ³„èÃõЪ¹Ën­X,¾+:ÝÙM;ÐzvÊ·ñàš¿Úc” ç ¡ÑNÒ‡mŠ[„n(‡šGøƒdníÆ@Ùý¬ü7Z1“Œ1^þ«mT«[žüWÝØØx”ÿâótE °‡ÿ_Ç©@u¿€¿ ~¼Ù=?x!.ïHà“¤"Ê%|¹+‹WI3nÑ;¬ÜHš‘{— û¢õã¶Ø)–ЖÈ(€*SØa0@v³)éœCÙÈ-$P‚ÈYB°ˆpTÄ€D5I¿©ã'„•Õë.q?†¯ÀèμŠo"ñ\t'‚NŸ¾ü­‘–‡ë¸^%å¨9)¯ÅÊX‚Ëö•ߣµãQïТf,þ¥øÏåÇ/ 2ÄÀw›u¾Wë Óëö¼éQ€_üšöJÂzP©ø«ˆa߇óêÒ¿¯¯m£7=¦»9yÇwÐôï¾ß”jO 6›Pœ\ﱺSn‡²oC›nﯢ%ºü~NúP´¢Jþ;œò,Œè}´„‡wdvUõº’} bAM½®f_Ÿÿ}]½®åÔ†÷<Ä çÞR7­»C\·ª“*silêîmŽ*SÙÜÒ½¨Ž*Tð\hs}T¡ÍõïGöq1¾¿è»½½;¾¿‡Ôß½ñýå&ûãûËžâ/Fö'g|Éî`|ÙÆÿp|Ù¤#´Œë0ßyW*£1Œô2ÅÔçJu’¹×•Ú4Ë~¯O@´ìx.)Û”jw}ÛcRsÊÔv‡¨Ç…A8´=®,ŒÄ!ñqea8¹”î,ªéƃ.n•ÝéDîI•½éFD®%•ý醅aL¹«ÁáÓ Ý *Ó‰¬Å+‡Ó‰L.«kÓ‰¬äª¹ëÅaYÓis½¼]­N7&([Ù¬Ö¦ÙRU×§½TÇ,%f¢“‡tÈK©:ÅR:”K©:ÅR:”K©:ÅR:”K©:f)I~?Ýxp)U§XJ‡j)U§XJ‡j)U§XJ‡j)UÇ,%¹=M7&\JÕ)–Ò¡ZJÕ)–’”W›b)é€`µ1KIî¦Ó —RmŠ¥t¨–RmŠ¥¤c/Õ¦XJ:LLmÌRâý}òdˆÚKIEi¨M±””£}mŠ¥Äea8c–’E¦.¥ÚKI;ÍÖ¦XJÚá±6ÅR’…aLc–’’œ¦®¥ÚkI;1Õ¦XKÚ`}е¤·×Ǭ%%èM7(\LëS,&Y¶nP´˜Ö§XLÚs}ܾ$%Ï)8„\OëÓlMjA­O³7©µ>Íæ¤–Tþ‘Æ”§®ªõi6(½¬Ö§Ù¡ôºZŸf‹Ò +ÿðãÉöSŽ —Öú4Û”^[ëÓìSzqmL³QéÕµ1n§RÇ‘)G†ëkcšÍJ/°iv+½Â6¦Ù®ôÛÈ]b9'$[kAjí§UŠðtp³±9 @÷§ŠGÂi€JŒæò“¼“áD˜5Í`ã`*x€œ¦ÄèáT@ñ 9 PÆèæÚT@ñ@: PÆèf.Ë;—N„‰Ådu*x|&ct³6P<æNTbt}* xž¨Äèþ©ÅcAþ¹9šÃó%6'ðOsÆž¤ÄåþiŽâS€”˜œÀ?Í|"HÅ?7'ðOëÜ> L‰Í üÓ:ßOTâsÿ´ôÓ•À?:`"LÅ?7'ðOKk0 L‰Ñ üÓÒ.L”1º5ZZˆi€2F·&ðO£Œ˜SñÏ­ üÓÒYL“1º5Zºi€JŒNàŸ–d £ø§Ö…ìp91±7[ýH¦¾ÄÔÞh”&+8¡Ñ¤dH Là{F{âP\nk—³T*Y xš¥hÉ‚x˜ÀÁ,õK„ÄÄ~eT.Ŷ&p'K“… 11YÚ™,ÆÄöÎcél² ÛøŒÑÓxWÙžÀU,åMcb{±T:Y8†¥èÉ‚˜˜$_iåŽáÐâÛ“ä)£ñÉB˜˜$?=P„ÄÄ$yÉh‡² $&&ÉGF!äƒPœb{’èy¨ÏXÿo'ÞümLŽÿµæÇÿ©A±Gÿïø|wm™(´í`o…eýâ¯é 'åëçî£v|‰ÏÐãXF‹(ŠOx@†ßuQ@úùG·ð ç† ÃÀP£{+Ñ—ZÕý»æüÁ(5_¤Í1‚^zÒ*‰ÿ@˜òÏw•"Æý63ìwÅÚ³å/ŒÅûŒ]ÿ÷ŽüÅŸñ뿺µ¶±æÇÿÝØ|Œÿð Ÿ`Ed"½ŒºQV©è oÒ£h_„ûRA›ü˜TÈëüÍÁSJ…9rBùA¾0ˆ÷ :Ò^í û½$µÃó Ó¨Iñ"zašÆÝ+_y™ãP‡”X)êðG2Z˜h Úhµ“#K¬öde÷j¢•ßô=1 á-Ÿr;%#RaµÁª¥áå¾Å mƒ°q#¨ÏQ_÷Úͱ«¸7{v1éŠÁº¢th4g™‡~‰¢Øy.ÒøjÙž;ID°qw#%šQ/êâB MŽùŽCk6’ˆ\œHIz\&J’ê$Iû"VŸÃ×tÐáîÊ9n˜57옢ÔlDµQaÑÜb¶K9Ûå6šá Ę›¸ I÷uñæàåÅñÉ>¢ƒÆ _|Æ=_dër`ͺy¶œ4þŽ!ÔK9a*n#q•ˆV?éˆAÒƒÿÄe2$¾¹ŒI—y£…Hçí;¡ƒþ…— øÓ 5a+»¡P-²š+Ý—Ë~Øm\ëѼ>óßXëí÷fênp‚ô`pbJjX_2‘B½çPUB _4Úþ~ôúEnƒV{ jêç£ç?LÙ–9G+¯wß¼9ùùèõ˹[ÒOF¶! ðÞйüxú<1͉5Xî]ߥ10”7’w½vtø1¨Ï5µ2ú“KêëNë’r¥@©5Iùm B¦¹- žmŽÈÂ=æ—³%‚·ï Ó¬]ÊŠ _Fõ‹„$2MyÍEc­RËÁ5¬mZÂnˆJI(è~âé@ 9sü±“}‘8t$+Îv€Ë*qÛ ’.ǺI÷·¨{‹{î×!\„WW ´ÐQ_E줞!(û*ê\™@»õɾ9äĽ Šr»Ç#0L πЗnøIÃþn‘dd.Œè©c©[RÛÌÅç„÷H Ôl¶x\.³Ð~/;xcå¶¢]TøÂžL”ˆøPM­“¿9rD‘DfI›%}âî—lðÑ¡$a}f§c"ÐvßÀ1jYR‹jUf&T§2î–0¨[}\ûoß±xÏ+%·¯StõÐëëá";{˜×YTà+9ÓÕ·î^ ÄP9Ì)ªæ×½À™{{^þÏW§¸‰ïîK±‡:÷nÒIÆg9KX‘û`U~ÝÕ'ת^+òLæ‘éß$Dy !kùZU]Û‰å`l¾¥Ã®ÿì¯:Ë á¥Ä½w‚v{%¹„z¯Wï¶eÛ æ¢²w,,ç}Ü0ëKÞ[Õ‹ƒÃ#8èðw%³W´¼õdìTr©wøÓ"ÄŸGùÕÈoþð'm 0X,NYÍ&Y-Ÿ°õºìB]u¢îw¥îvªNÚCIc{il²HdÛE”é“spU‚vÏ”f OÜÉ*DðCÄyyo¨`ÿÕ©’•ÎËÿE’‘$–)¥©’©§‡@«ŒàK‘ßʆe—s;EÝöh“Ë3A~ˆ¿Ó0î zÒ’çâ<”È«/¶¡Àôë‘ -`Yj„¹È1­S/ Aê×3¥t†8­Ö4‰JÆ2žæ&›†kÒ›‘@$©åQÙбç0ƒŽ¹¨‡ñp¢/—vÒ±Ä〒ò¤Vjº‰Oë>xê©Æ Ó~+Oޔˆ:Ý,jºSMÏî1Í ëΰ2½¤…Ôó›Î>ÁȰYa™;·i= pâìÞÌ0³7ÙY½YðŒ"ÎÜ }X¯à,r©EœßäO©>OJ‰q’ Qûgé­’l?ÏRþÙÙ‘ͽ¸‡Ð€× jÔ^æfûY-ž+` =%¬¢"û¤/X- ¿©²Fû ðe@2ìÃyakÕÅrVœ8%8“fÕYó9 ýuggìZV_trÎmྠ۬uì瓸Ù-™d¼{Q Ÿ-ÇKÍíå;®òË’‡FkrÆÖ§?;;SqWgF2PïÏb3g5wZ˜‚~h>€»Ý“ÆOŠÝ˜›¥¥eGþðʳ1•Ö¬äÖ¿ÙÙ™´×ã3`Üæ„~Wê¦?ésé'Ì;ã›Í½ÊßEæþ£sóc7þç” týyVÆ»ë£AÔIø6›ÈØðkÔé¡6 ­œr$%Pוe¦C¬7”7ôTn*ØwžÄ†åtoÍÿf)z³Ò½^©sÅÇêÚ¬å¥#³®¿eŸSJ@‡úͽˆiñ„²°Ý6v^¤s)eRT9æÝ""¾¡’$”=J§œ¯#×ø%UqÉ*¯‰h, ‘ÚR¦³%O‰)5Ã~—-‹GcƆyk$‰–ã-”å”Õš4çça6ÛºB!¬Á¹žebîòôÒGŽÉùøùßð™1ÿg;î?ΘþsRþÏõ­ŠŸÿ½º^{Ìÿþ ŸÇüŸ“óÚ~f;é?× Kÿéøÿñ³f»û‡Nþ™íîÙ;÷g~Ïþ ©?~ÛTj÷üO“ùsÄhþ̉?G éÏœ÷sÄþÌi?s†ô'Îú9b4椟#†ôgÎù9bH攟9Câ]}òˆÎT–‹?NÆÏ£ù3'ü1¤?u¾ÏcúS§ûÌã RØœ‚9脨lŸ£Æô§Oö9j`ú\Ÿ£ö§Oõé ,çD46ySN¦Ï±ðæJô9â\y>ÇBœ+Íçˆsfùq¾$ŸãaΗãs<ÌùR|ŽY›/Ãçxˆó%øs¾üžãaΗÞs Ì9³{އ8_rÏñ0çËí9æ|©=GÀœ;³çXxs%ö q®¼žc!ΕÖs Ä9³zއ8_RÏñ0çËé9æ|)=ÇÀ¬Í—Ñs<Äùzއ9_>Ïñ0çKç9æœÙ<ÇCœ/™çx˜óåòs¾Tž#`j‡•«ËÉ91Eí)yŽ­?Eϱõ§Hã9¦þTY<Çן&‰çxÓäðašžc Ô¦Éà9¾þ4 <ÇC˜&çxÓ¤ïaªìãëO“¼s<„irwއ0MêÎQŽjìžP¼„šó‚©¹é4çã%ÓœL&•æÜ`¼Dšsé¹i4ç†ã%ÑœŽÑŸÝŒ—@sn8µ¯’>sds_'{f~s™ä™ó!)›:sn8µ¯’8sds_'o¦Ó܃§Í ÛK?QæN›9Öÿ·ÓîÇic„¥ñÕÜyà&å¬lmxþ¿•ê£ÿïÃ|`^»!bJÀtl¢Žùã«ñ9ÝLf®ÀNQ³b¥Ù¢LDœF³p »ñ€ <øý?ó¿Þ'ñ«üLXÿ•êz&ÿ#<|\ÿñ¹wþ×IÜt2±Š­ˆÆá°[ÊMûJif0ZN:éýA·Y\Æì°œÝ5(¤ñoQÒ ²µÒ‹´XÿKS´áŸt xTÉ Œ†P–Ú¢ÕΪ÷ˆ2ÇÞ^Çí(PÄ_ŽÉ´µªk7Øü-þÓU þS(éj«Ïoì* ¿~ ¯'í‡mÊEþä4 Ô=àηñ qXðU·(¾ýËÓ7;æB;2ÔŽêt¨Ðe àüÇ<†:›gÆ¡ñ0d+d3䕚 ~÷>Åg,ÿ1_ï×ÿŒåÿÃAÜþúü­²±žåÿù¿ä3›·;3µê_«À-ô­÷èc<0 ÷—ååǵüüŒ]ÿñis}õ¾iÀ'¬ÿõµ­-ïü·¶¾þ¸þä¬3ËVð_ø¡ÎÜKúvî_+–%7ùÀ¡âÅæúTYÁñ‰’t²Y¤ÙdýCå½ç§Å±)›3™šáÙî«›ë”vÖ¹çä£õßRÒCø·yo0yy]§=_ò{°¤sCõr?üˆQk))Sy?-ÛSXd7¦¦ÐIÃëV‘V¦ˆÉ^o·KÝ6Ñssý†a 8o8 ¸ ëH±A¡S)ê2ÉÀë]–ü<àªgæ™é—“<[ðK꤈ܔ¸Œ½Ô%v’Iè€õèì·=N< ïšñ±=cêH•.3Xc‚ØPåGPÄ ¯ m‹4úç0ê6"7ôè`s’;È£”ÝÁu?£v»ÌY90F6Ãö`©ÁǤ;WÁ<ƒ¢[Vg9GªêF·ð“Ë·-h?btU€É®¬¯VWÖõ[/d­Øš~oåK×o«vLÎ !91Å}?J£þÆh­¦¸lUVz]UFï<>úé@–Tõ®ä+ î2VéÈ)^´‹k º0cŒ¦ €I¤.Þv.›À¥F¤uÌôåÕOŠdhµ–8G³u¯€hòWf‘bŒ.½%8Ëë²Ç™"0”îÉékš|KïÞñ—´‡QJ)m‚±;ªè¤øÅ eŠyÝ2±^½½ŠRêyQNëV0Xê>1X»‰‘ÓC|sp.Þ¾{—ÒWF!‡iãu§)»ïÑñ…ÎE‹3°h¸ÍS+cë~°´ ´Ztؘf» 0íœ gƒ>å¦>ŽNÊI/êÂC•ùÖi‰÷§ªÎpÐNg ¹ŽÂfÔÿµ€R.ÕÄ7$/l¼øqºšÃNï„!9Ï‘/@¿Ÿ`¾“ ¤„¸ÏI]Kt äV,:½ÜM;Щ(ì”oµñW{ì²?y#k´“4Bt˜âùË}Íž_Voðaaÿ|&Êÿ÷þÿm²ü_Û¨úòµ²ö(ÿ?ÄGÊÿf–-ù.á?G0~I·DûWï—ìwš!ÒÑ@Ý@YÜèö:’²5rM)_ËSƒá¦æü`?Ã3Ã’}Œð_f¶4Z«æ2,9Ç ÀÀ‡ ÚV ëÑég²ŠàÝÎm.¥ ”óûV†twÇös€Ì]~ÄÝ$JcúÓŒße’‹ÐÌŽ=áX³ O9oß9õ3ÿÐ2ã_aGX0ÜZöÀ‚C y¨ þÓüø.÷Ä‚}µ¦A¦ÎåQÚoÎvåÈÏv­t)| Qy(q»Î`ång”i©cþ’8»¾·Ùz¡%h(w¢NÒ¿›tVYØAÅëoAªoÇWZþßÁ­G‚õ îGîçÿ¸üŸ;ÿækÏ@ÎO㫹ۘtÿ»QóíÿÖ6×ÖÏñQgÛ’Å䌋Ë0š˜ý£ÝöcN¾‘È<áJlPÔA‡@cJxòêèüâðÍ‹Ó“£×çoð”E…ÖYÎcG¯ÏÎßü¸~tòúÌy¹øŒ'¯Ïßœ_Ÿü|ñòÍîéò8x„é ¡‚L$֌ڃ³–ÈÓiŒ'…8íµA¨!Aû2ÜF‘”8{”%$í•Y–Å Q ¨Úýô¡ÕÛ1§µr¾–d3;°]תeÔ)'=JO"­«èpþ~ÑŽ’-G®ÿNx`´ û½T=¹ŸIö5çþwùÿFeãqý?Ä' mÏ›¨‘tz˜ú'úõï׸Úét ‹ªc–8-’®ÖÛþ«r8$í$lŠÂ¿?m pr£SxFŒ @€|âK™„Wí IÚXê#½A] µîû§ÎS|•„e-ðÑ#u¦:4Ï®aîwšøBË|Ÿj]^s+û"©ÑS”£ Ýœ—é°ÕŠ?²Æ Ð‹¢^Á¹„I= IÑ `u€ÅÀª.^Ÿ¼>°_°uSàgƒ;ÀjÝ»Üâ±½98=ÞÝ?Á[ tAÐR(‰³“WB~ouqœ˜âþ1Ölµ±êE|y¶Ll û}ä|u`ß-Q¼òÐÞ‚‡Ùí…·û4ï8Ý…_[¿ޑᎮ½S­g8ß}" SåŠE^á™' ßÈjEÓ&ׄ^Õpv¼Hÿ¬ž­¢dŸ€'‡í4ѵZéò3R, 8MQŸ¿Åcôe·Û¸NúåþˆVQŒ) ž¢!Ÿ°×ãš@Õ©y¬Áóãß{ùýîÉÿ/ÛIãfUo˜‹=Ì!ÿoV7åÿ‡øŒ˜ÿÆudÿ¾ß ЄýkÓ±ÿÜ@ÿxú¸ÿ?Ä3 çε¼Bµã›£—?œ‹ QU˜:±Û0ª³Ò’86p›8×]®â(•õ8™ ¼ŠaŸŒX¡H*f8GP£lÏ ¢>aÄu¼ YQéý¼+¦}¬xªŠÒ …›2âì¹ëH»§ý¤—ò9äõÅ雓Ӄ7çGgrs5g ”î–éºh‡2Ó6i.gh¼;"D-|ë":\×(yÓ>ÊÎ jÕá?0§”^ŽÈ·XÃË‹~Ø»¶®¸†žT$ˆÓÆ~Òô“v¹]¯.RRÉÝ'MÐy5PRâæ“uïødÿïŸâfI”Ëå/°›£Ò5æo ¹KåªGÕ ;ÙÇðôyÁJgÌÈ Ma*^–ùèw…C(q_ŒúuÙ ‰ôûá“S'„)Å‹IVqé­—¤1ÝaÊ;Cl2<ÞBßW¸b¥Xâ5L´8ºFí~7±*Ñ“¸ÛŒ>ŠUÊX“´•t–ì7#œ. s¨ôÄ.–©£Á·°6âÁJÅÀA];?î¢ú3@¼\ñ 6®>ì5Aà J‰ðƒ°G5Qõ ]€CxsÎL­¤Ýl3¼ŠBÜ3*à/R—d.úæû3;ÑV»éð2 •DXß45 ëÍeQ#!ìÞ x*ÐÈvMV?¢‹˜32§³8R#ß„áÂ(ª.qQ‚#:镯) …0ÝiFŸý¢ë’Hmœ´Ä7ºG¬àç,¡¼Þtï:¥òØt‡E×gú6\Xѱ—\ Ó 3ØkCÍ€×F`!ìÀ eö4ð˜_'ƒ]9@ŸýFI4‘Eظ¬¦HÚuµÜàñRvYýÍ[lÙ錛ŢÜ;ƒ3ùouÂú4a¨kšCùúY2¥Ìpá 4u6äÛwjÜDèîCˆÆ¹BJˆšW‘èÀæŒãëb–WBt‰B ™À‹,M¬õàÅ˃O7È!ˇ»ÇÇgç?¼ùQs'>…PóŸGVÛ{³ûzÿ¦Øñ5ñ:‡5 ßðqv~Âö8æžû[¨¶ÛÌ˘{K†õŒKàÄáGۥФÌ*N‘é]ŸñÄûàßvaض,é‹$¦=O@"écpƲI«a¯'ç8h€ƒx22ÓÛ‚ Ã9‰\©Œw–ÃR.C9šÂ[ò €Ïj«Ü®2âÞYMõG×뉀z|’"D¿J¯Ê,ßÿÄ £(\’Ô¨ÑQ°¤@g}u †úŸÛ(¾ºÆhÞ‹¹Aãõ?Õ͵Í5OÿSÝ|Œÿð0²Ç;×_I„‚ëe2$ÕaOxM‹°}•ôãÁuX9B9€ƒ2Üa7EèôøÅ‘¨|ÿýZ±¬š:yq—úQ'ã9.l›”é Ç»F~£(q7´ü]5ÓÏ)´úWuÉßtSô våqŠ!®:ŸjÈ«t~Ù¦jƒÂDô˶ïyú_hÔµ§ý§êç*¶¼4¸ëEè"NäÀxJ¤9nÒéá±.ÞDa»,Êzñ ê¨ãìgË´Qi`–(~kDñone7" Â6­vx•:.‡jçJ3:°ÎÍ!”Æ“ l9XN® ÔÓȪ°sÜ—‡,Šuä™^'·h6g·ÁÓ2©Ø1WÃÖ ê›5ൄpT‚ŠúJ¯á©Ô{€euœ 4ÆÃ}‘ŒÏWq'’Ê…¨Ò¹R¢¯Bš¡'!Ö–È®‹“×(y= å“Ïâìà¿è4Äa‰ò5)¡\P„÷W>³Á‡í¦¸”Z:’¶X«æw€«ü°{ôÁ|Z^’vŒ~Z\^7­gð{ж~Ë1:H´ƒ„cþtmœâÛŠ¸nêRƒ0n«Rƒ¶SjÐÖ¥âÑP¸C›êèÑ µ ¼*Æý&nÝñ(SÛò: ;Ñ>]í_WtI˜GUë|ŠÍUd³Õâï¨Û…n›æ ZxÞL‡¥q-ßÿSH]—mŒŸƒo=9°}ƒnÖm¥¡¡ @|A HI«EY Ó“B©€Åégß92µÒÑqר¤ÛRÒy«¡¨¾¿-¼ûRŽzRpƒù}Ÿ Òù6É™H|µÏO%*Týº©ˆEͨz]¶h ÛrÞ㸱ú%Ž© ‰åëƒö£ÿv°¨áÓ)i|µÊôÔê“ì?¯2iëRk?ù´ «Ê'ÝÕªzÌÆ€w f©^ôÈ*Ÿr“ý¨µlJÑ.¸ì€¶ S÷¤ò5lGÚaû`,ÅÃÉ-°»l±æ¨ú‰‰àãDÒaZ»]Ra¤öŸ{רÐ5UUt"8˜1ÝFŠ7L,sµPÝÞ¨–á¸]©ÍtEtà˜< …ŽÖi‚õ¥@¢Tœ,ÒH…ty ´4ØNL§\d’øD@¿ºÃΈbУKà:‡¸ã¸4‚‚Vq# è;ÂT/a±Eýz-q ™jøD€t#d#¯„ÓêÿØ•NX‡.ï¦]©+¯šjYJŒDq¸:ãN<@kú-Öšt´®.lC¡æj·€TÌ•Ÿµ…¾†mv¢#à·:®Ð™k¾f2%æ÷Í7TÐ~E7 /УC!ÝáT–b}¬L´Qodò©\ÈrÓ1÷?¶g‡¿Nmê©][Ix°k`á_mJ8½ú1Oe¯áIäÍo$Õ"óU¤F3Pšd¾Éd§ZhX“#4˜F–¾$ù ®&eùnrr½A•s?Ó0Ù·\¢ËDô1ìÄݨùŒÞ‚¤ ÕÔV)oP¹ÝKêM{upÝO†W×.åôDÐûg‰ë˜ ÓÓÿ*w£Ñû§¼9Åý!ÀB%xV”WK¼ÄH äÜ_xP]ܸowv¬2Ÿõ¶IóïXˆãÐëtw¼>jß¹è\ýö¼~¶„<)¿x›aiLÈtë [Vÿœå²|9N1J›¡¾nzÜ”`Óˆ&°Êq××·ÙlÁë“óƒÄ1P¦<ÆÄ°ÂVÔZHó¨  8‘(‰É‹+ÂHYÒ›4¯.ôœº9TW\öó #ÉðDâ@•p_oTX’WÆö¥-é¿Ò<…}ÝÔ­fk)F쉅¤–°X .¿ª”p¬KxI^|†ªëCÄ7|jxÝ,¢ìó ¾6ôHÐ#ÏaußdÍ“&T:<úåL‡9}N«à^azì&·Ä Yv£°áNèîÕLðq(^žÉ—´Ö-M¹»´›-àV€gëÔ…ŒJ©.øœ¡3vá’â›fNUq}/ èø;jÏ>Ÿ¬‚½ÄV9ª(¹U‚¥‡mK|áS±mÞe™Ì)`ÔÃÐŒj)ù(Ð<ƒEcü†ØÖa¢u™"¥E`æÙM‡ Jˆð’Ïþá`´´€:rKT0’~ãØbe%b1S->gÖAàJScQ¤Ž d;ÉŠcê¼î³Õ)IZrÜV”Å?Y¹ÂÛ pZ¹1ILfÔ1/ODÔY“‰íÊç†Ûf*ÜíHù=e»®ƒ~ØàÉ!]‰ÑVk , _?ó 53ÎWŒF¢>,~Z|RaC¶IWåS­÷v²[÷k+NQjǪ5t¦¨¦ÀåÎ~5«ç,£4UEù%=W_«ò­E- „ê½wútá.5ÜÚy Ã^ӳЪÞåA€ßÔñ]ÞÞÔo¾Xþ³Ç7:jÂ|ÀŽ MØúEy&ê9§½¯ø”¬x!ÖI=+úaŒ±Ïé`6êžpG‚Øxڸ㖠ª_­vÜCøÜ-ŒpqI-,ÉvÑþ!–VrÝè*DûÚæ©Ä\¡È@yFt¢Qç•[¢À.à.ìJo>g‰À›¦k™+ÃNDƒ%ñhö°Ùûê"lS3÷-4Á¾b£* ^ñ ª/]ÖÙ³•=þE¦Ñݤß'-9Éê—:îõÂAãÚ¨ô© ZcÖ&Ãu^q§5c z2l4¢4Å„E¨6ê“Qß5Áh‹±––v2\‚¦a³ñ+ÍßePpJ¥J–r3¶&Tk"ò"FƒûÆYþãGm®†¾d{Ð乩3¤èÀ¬JQ½ÕË §–%³cA—5±£yZ)ðYSl`QÅ¥/ÛæûÒZK² lt‘ÖEñÎŽ" V,ÄÂÖÏË IÊ?EK_+éOZ%d tð¦³Õ Ÿ4‡ ¼fëF·¬W’}Yq¹«Ø8¼l YÌþŒa".ì&þ=}ÃßôåÀ¬x®Œ 9gVðNÁnó ±•ØáJlA[÷–\‡t”Ñ-k«[Wx*jp|,SXBG–8l£‚”$B—SCàN^'óOg‘Éß=³Š*Ǿ¾U]¢_#zÜêµ·¼ybWüãí;”=ÔjýÂ=Z2ËÀá;Ø}`ˆrw‘n‚†ìx²ŒG÷S>pæ’©×~çBˆ<‡%H™rÓ ¥m¸¦öBpá 6 æ·g»Xý‹‘Xu5j-ý„ܨð) Ùs›»1=ÙÙÑ»“¼¸ £¹£@5À¥, —å¢Q,Äå Z%`—£·†éXËP·¨YüO»Kœx3± \óàJ)ëfP,eëT­:U§õ‚‡äl]9òªÚ¹ªv9—÷ò×+LJŠ’;<Ó%^fde iG2ϳ;“ÙŠ²Es.º$‘p EÈxCÄ g—ˆuJúʾ2u‘?Q:{ÁQ40E³™¬sÝÔw&ƒ¶þúöc+ƒžuJà§¥Bî­òrss/¨Šû{Ù¢ÿŽÆåËy¶ÚÞÑ3;¼ù èÇ™±çZNaÉ>n x)ªýlÀýñóû}FØÿË8»¾Iø|A &Äجnúñªkë•Gûÿ‡ø˜Ì,ys=Êö¿2í?éô>³«ïdŒKW€—ÕdjtÕÒô‰ôÒ¤ðóû K%÷ zR•=©’á=ö¤*W¬nT-cÓ“€Àõ«²7KV8>þ€v@”7x“OȾ„=PÐðaаq¢f@F;ò¬*'LZ«u£¨i"/¡•~î²ÕuÑ‚¶Yy’Zz*ÙØÚÌÙØC×ú Éy*úÀ¬MWu™«(nô#Y›VE)Ãôú´©ËOyû¡¢äôÉ„…B9MÆ]¯E©Ô²›Ãóp_©”ØR•­f.”Ò6°µg>Ï„¢Ïì÷^%;#€Ô’ÔAäh ´áƒ²iÖŠd#Ç«ZC‘Z{ ú!Gra™>·l*U5Ÿ.qx€5a.å¡ >Ëí¶<¼ç%*¡êYÏ×–Œ0˜1š «fú;;¼K¤Ö&š£²xÔA<ê ?øqþOçr<‰ÚqçkƬT7j¾ÿÿÚVí1ÿ׃|¾EÌÎõ=Ýþ÷“v;ì¥ÖU.}±]õwÐWßH#Îe&™&Qb%÷êÛØ´èò1 m0’‡öÖÇÐØ|Ä•^ld蜗Ìsð´€iwnS3Vºc +›ÊßOØS4è”Æd$ÆQ0 ¨@—½›­tC²ÔíÞ18 ÷¦•P´¥†;…RlªZ±È´E܆¶‰R˧o¶"lvÌÄ«À&ø6ì7aWä^†|PÄÑæÖ\*¦ì¸„¼ÕŒ‹ƒCEdJ7LYúíì§VAæCTÈÇ´Ô{¡A»x˜; hØtäË)"ƒŠ{€¥¢ŠSé·4N}Ä…V=VâiˆþØŽß*· 1Oõ›÷T[o#ý(ñßÕaåwl~UÖ$ÝRPðøTF©„tâˆ@®I*—>‘t¥µ"%¡V%á˜ë¡ ˜üFUlÏ­’´º` ærÏthÙaiI–P§+?ý[•É,(ç?“N^¸qqØp±kYGë“j+nãìàùsØ C«è÷­íâÒÌôÈìcEP‡ ÆDª-ˆµÉ…П¥‘åj6Éz‘^äå1ûS*ç £ÀÒÖoN”EÞ(Ì"|u-ƒeã=a—·Êx®vê±°›tsŒàó¥ÜÐ`¾²mŒjˆ„òQŽ äœx?V¶¨@ ¸ð>*,¤íËËñ;!ö°j¸>(}®4´Vd¶2‘{n´<Œ³]G/J*bdô¨1ÜevE:`ÃlÌ¢¥ÿU;ÊX½ÀfuÔiRÒJBe¢ª¼š™Rx“7´lk¥`Èú™uå!Á¢ÎÂU¤µÜyYÙ0ÕÙ¶Ñoc4cò Hý`ŸäÛMúug€¤e-€,*0zËø?Hdž¨µžbMªlKP¥7@5†wä‰>$meÙÞãHM)¬·4&%î%ÚÝÑ ]1P.Fþµï$šElìðH’HtŒV¶À{&.‡¦’YkØ&.ñ!‰1˜M դ쟖–m0¬eq ­µYŒ2¿bå–5ÙìÆäª²ŒŠFˆð"ÛžK°ŽˆPï,k­ú,‚4éDðçI•~¢Lѽ6µÍ§²Ãš½Œë+ÄlÓ'£HAš©})ºÃ}ä^çhÖ$[CA\á#ÉSäÏĘùÈry<æ˜nSÎÒÐÌ…Mþ®È½ŠGmø ¼¼cyØEªA)•£šxÎV‰TÔdŒ¾¥ÑRîÒµsU %bÀ(f scLþÍî¼ïôX±Ê˜£±²/†eÓØ„bd6ND 먷Ÿ¥]Þ™F=Lj,«W½èF·h•…ùoIN½À«&y¨]ƒ- MHPîN[„ÜB°t¥ÿT­:®b\§ŠdkX‘VˆÕ/Œ‹ÜA“T”†•bqD™Ør¶åËÿjI/+‰rYÉÇ;·mŸË}Ó{Ú#²ÖѼâˆ<+ü6¤}x wÈZü)Â3B‡~•Ǫ\~€½,¾3Æwšçµ»³LÀG Ó2)Tvà"ªŽqe®!#k ¾­¢ùhIÌêÝÌh@JcÚ>5*Æ£¡z?4T¦Fõ~Ô`»# 3Bþª’ßâui9!øwÎ& ;2Ø›(ê¹Üú‚Y)ðûî°Ýô½¶b!è ,•{É’‹uTãZÏ´€ºQ·½ÎM ] ð![Ý„¼¹ýt"zȱ³ XL‰ ÈKbz`+Û$¨–þÞ¿~yØË £pTw#ôÿ[°{¤˜ÿu«šÑÿ×¶ó?>È'Xñcï–)QëÜvœÿñ4ê/épº§Lr.ó3ë?D}éP­(õm€ ¤½ËKb™Õ·]ûø)ãç¡Ï¸ ÕÒÄ4€QZq?¥TRx˜ÑÝYŨ±[<èã)ö6ÄŤbæxÍ»n؉‚S5£Œ¡É~›°×K};NO¬Ù¶1)ã8N¨¯ž‡ïL»þï“vbþ×ZÅ_ÿëkëÿA>yëÿ^—Öeœgj‹ÒS0óMܨ[¸%çy6»Ëòº$ÿ®Äy,->MŸëùfø‹nUÀ®Ëòâ¨(19]$]äÝEÖEÅ'ôœÑ•HþM‰<5FEy/¨L+úž„Y>Ô±ásÌ|—óÌ_µõ+ʼna Ø—$õ¢ÜçôwY µÌ•=þ'ej¾üÊ+ûgɽýGøHþwct5¶ØÌ¯ü™=ÿkmccë1ÿëC|2ó èÎr×I;ZT&ø‰òÿšÿÊU67ªëûÿC|dþw4¯•³.’ÞNÈ¿ñ ƒO‹F{ˆ9Øiw×yX_*:YÎìcôµ¹[{;ø›Ü§§?œð–™^‡dþH;;n{²`ùH_À‹‹“Óó£WGÿ³{~tòv½ËÚæY›vЖ¡pš7Ú³ïßý½ÌñæÐÊ ¬pH¯–ÑÈ+¼ÖÝêÁ(ŒèŒk"c(UI^|Uh…•¼'’Âá^»]fýSbøCõs!,`’ÿ_¥RõÖÿVíQþ˜zudf\¬®òS¡é‚.¥Iw+:aã:vozÓ²Ðv½»>…$Ä#Cåûï·ô‘¨GLQËó難×çÄ$x‘àÌ'fk%ï¦>œ¿ùqWüÅÁ«£óóƒ7ÙŸËw”^Ùœ"ð~ñVþT>9+Ÿj^A(`ˆFÃȶ>xOÙD¾YÇsJáLËRsÊS¿þ1hìÀ¦™7.=^l‚ùgå¹ìûFUGqU÷±ê0VÞw_vð8tˆ·¢Þ¸š’ašqÓÓì—0OaV%ºÉ¹Ñâº\H°Í‰«þå%|W4…cÔãU¤¥Æÿ,ŸÆø ÅÞ‹àzg‡²=ü!~Eûüf\&8Á‰%hìà²0ÁÆõ(Yrƒx€¾÷³Û ª³åy†8Ûè­3Š|ÔÙ…(àítdÅEª$ûÙ>jÕ­òL4@™»¯>ExPê¥Ñ°™œôJͨ<€ÌJDIrï$Ìõ¥Œj:þªp‚Mt›H>µz³¬€Ðeõur{ØþIáønW@Rå”(¼ýKë]A¼ÅGÐÕcqûNø•)Èeû¦;ì”(:í¢6¿4wþ’J(°8„,Le„,„Dw6"*¾ó›86(|, jA7û±ýÂèÃ/е([8Ó{¢ÃˆƒX$ËÂ?¨/Ý¡…gæ%Uh±¦à8þWȵ.‹Ål=r;ÉíõÈ~ ií”ý@8¶SÖ¤nØý ']Š+niˇ³óÝ7çìãjE¼ó¨’–´=ýœQõ/Mñ—š4d€` (*$¸dxb÷ÖLz—éÇŸ§éñÉin‡—r{Š)WïÛQžÉ);Š Ã6ìתƒR´µVkÉ›ºìǶU=8jpæÑGÃo¨ŸŽ)TQeèÑOl‡vj¼Ã{ÈÚ‘ÐÒè¾%¹Š ñX$+Ä]s§‹“žwÖ‹‚Ï]ËåàþM•Õƒ^ߡϷ@˜tm̤ äÈÛºµÆ<ª±hFQR7ß4Ó½Ö3 Éã6ÌÀ=’ä``jác<˜¶=tÑ-+H!¤Õ¦×@'–l#¡ç÷>É<~æùdÎÿWaz*…¼tA ÀIþÕÍ _ÿ·U}Œÿó ´Œ÷f|Ôåß&Å+?ŒÈÁë:׫㧯ÿS···Xµû¾œ`¤g¨¾ ‡~R Yyõ? )+C>r³Ëst?jc¤dÎLÇ‘AÂ;:VÉy‰âp-4—ê7ÅËÝ3‘ÞuáG8VG‘¸ z;OŸb®ºCìÏÓ4i nÃ~ôô2îq;}Ú »Ã°Ä¾Z-_®<-ºW—/-œHŸsš=‡ô«c8h!ØìñŒ»#>]Áö׊?îÈaä>ø"5˜»g§g?¾8¹89=³# ùmÁ пÝC•¨êíéçw=¯PæÈ=mÔ{èåŒcR¯ö£.ÆK'«2þ…6#Øó¯bïô «…_å+µßò÷¿D\!,Ò ŸW Nånãªålk¦©A X|Ò‹H…IéowTŸ0SÃŽÌ ÓŒ[-tÃ@ÿûOR»< 5ñúàe ¦ìñƒªxõãñYI¼8ú þ=;>†Þìò»ŠØ}ýb¯$NÞÀ?¿À¿üxMœÿ…_½þ‘ÝKWT†\NÄrË™ ÏëŠLª7™¨ð¼ cŸßbN*LV§¢ß&} ±s‰.Taš&‘cÈJˆ)—1aXŠ)ëp€%ÀÏ~a1p?Äóºz.± \‰J ‹F8zõhÈíècO‡2 Bš‹ •Äš$*ʹDOÏÙ ×’LtÅŽK- d¹¾ÐŸINÓg§Ö/§öŠN½b¦0ÌžmÎËû'¯ÏÎE£(­2 DeÁ¿ ð¾Ì…\†%>Œ0ú|±¸í6Û["áYÅ4¥5Æ4|| @P­&$ØQ5‰Ež¬M¾yÎ5Ô½’¨ÕìÕr`}æû×<À$ê䲨ËEœƒ·)q†¨ò0¥•t¦®7v¼Â#¬š!â ËŒŠU騳‚Ã7Ï«¥ªw5Û\ÒüçâüäâÞœþfž†ŸÎÔ0p9À’ht)qý«i*MháÍîì-<>C Èùt0½±ÈÐ"¡l[jë?LSX¹$*º±J¶1`­sµ%¸±Ï35öË=[ûu¦Öv_¼Iìc›« ÏÅö¾óiž«×rHãǽ{6¸:Cƒdi/ýjèAÁl'¶~…=[ ÆÞ@¨Ý§n£ {ì%äjJÒæªeŽÀ#¤Y7j)1@µñÜÑOá^¤þݼÓ::$p3Zä ‰…|J{É-¬ܺn¢í+J(XÊz{vÄE  ÇžŽÄ$Ú[“éqHí…¹q½ü&–o¨;¤)0eÁš#ŽY©õb€>˜°›ï*ҿָΩòòºZÃ_3Ê"'õª–ÎN÷Ê»ÇG/__œýè© EIè[Ú¾ ï0ØÃѪ¬Ò»Œ!JAìš{5 û°}HOñËH¹ç¢ XØè'iJÁ©:—mLYn鯤ÿØ•èšA[ÚB[×óA™šþÇà/MKÙ}ÇeäæT’=öªÝ¼³‡èx¥8+ÀÁi¥‹Œ!«?ëôl©lŠË»A$@¼Ã£Ðf(¢N ”îåz©´UXέùb÷|÷ÂZT#D2^k#¼9Ø}qqòúø¿‹²é”£À·~‚ê·Ñu‹K¦Ã£KîÙ øË4ͯq~ð˹]e}ä—<; [Y¥:M kÛ$#Ǩã–èÍÁÉ›oŠŠP~‹¯OÜ¢T0·$Õ§ô·’ˆ¿¨¾I/O:–n<ß¾SîLü Ù=÷äsxê$þ†ê|N‹?Ð÷°P*à*Ü×ÁM“žöùIa~þlÎu‚OÖþO+[W/㫇°ÿÛª­oúöxô¨ÿ€Þff|´û_ŽÏO)ßÀœ /1¾p\Ó†­ßG%züµãZFÁÒŽCt ”ÑV\•¼Qx³m`0Z#o½§ý(:À­@¹8øi÷XhWs¶œ3zvÚ6dºë ‘¥^ÜPvoʃÝF HäíZèÆjð£_… Œ“.Çúw†aJ`ÜC(lY%¼Lxݤ·#`³ÜB%ÀÏÎÏI¿Y«–oáÏÞ> eàFH]<Éêdä§ïàñâh×±’6(ú†Žp—óuÜõ"ñ$”s|Áî9eìD%Ç“°uËúíòÔ7öŒÛ7ˆ™çÏe¯ËÏŸËGÿ2Ïþ¥þ‡zv›P £ï|ÄÚT\ˆÿŠvyÐn' žLÌ<—ݦ:VQäv|@™¿±xúSt[ÿ™²ÄãU×_k·j^ xñKð3u(0E±åï+€~.Ãÿ’uIÅe½×£¯ˆÏ”/®6›|köÏaŒÖTº“ò×Íl×W±IåÅÕKn«h޶†e?.óv¬vIK?`QWáÁjÅøaŽ`Õþ&9ÿ9LÊwÛº ®““VÐ;ÁX,‰Q±X™âaXŽjå*g4ÔŒm™Ý£r¦Š¿Žs*òùVEO“bcˆá³¦‚D󺬂¬¸`Y†XQÚ¨XÒtd(nlî¯uÑ‘¸á©YŒ^Æ‘öœ“w¼{5¸â¢X±æÃ© Ï$XZЖļR‘)ô?y¥¾`–A‚Ç Ön[¶ˆou¯5¦{$íÙ!uˆbvI}ªX“ 5LGÑÞÿ„· Ÿ™•èÙoƃäVØ‹T¿À(¶%ÃØ¦÷ÇhòŽ?EÂldؘ¹[…ÖöPƒ¡ÙÔ)P£ÈY¡‡˜b2P ƒàyÖÚív8ÚÚmuc£øL7/ÕCë¦ßÃáù!³ÁÓ ,¡€Õ_±i ü‹Ú¨lJØò)ÂÞÜØ¨mp/5)Šà2Åì ÙŽºˆlسøÙ ¡(TÓx‘Ó1&a“8@~(doä\«þ¿F•"ßBê®§ ‘ŠÂw [ŠºEÖÌUÕkF¸ÿšy!¿d§ˆ-GÝ’4™¥. ükÙ¾Á³} u" (Þzò>‰6 m‰È^™–xŽ9Z¤ŽáÙlöOZ_–5 4oÿ´FêïÂr¤y[èLµôþ9¶–UÍß¼<+OÌB"êe5ÐÆ Œ&ÄqÑøiÄ–ßð­o$ËOÍ%˜[Á·'Y©!uq‹¹sJ³öHÙ³2‹åÌ) §7¥ÒDn®[âв‰*³aëŽIÖ¹mÎþuØ/'H[ióEm ’}hrgœ­²nÚ¢©ªë³NÛ'o¸9ô÷øì€YýµJIibeñ5 ×·j›ßÈ£ÊÒK]úB³ vÃzTûŒÕÿàoŽw÷ÔMÐÿÔ¶6=ýOu­V­>êâãéì¿gòÇ7Q ?»Ò ÞQɬ –rÁ×+ˆº±‡Ä‹?R2O´R!Bí²­qXf’>_­½ ’(“²#{õ×®¾--Ë’nÞ[I¿ù®ôAŽìø0Á–HAPKdÔfoŽ*Až¾GÕÒaã).0E„=ðšnßqOPà EÚ ûAØo\ǃˆÑ§`4#€ÝÁdEÑv.ÙΠ‹R#êÙ´²@–/*/Qæeh…Ð,---Gµ0ã=£Ñ)Ìë^óÀp°8uμ+dÃ(Œ–DBz ÛM™ÀLÅÖŠ(ÃW¶v‘»`]NC‡Y@"pËö~m(­—)î—ÀÛ^Â/uOÞ墳,y&ŸÒ°O”Ô3¸u1MLAH£+ØHœÞé›oóLð×½³3ÔßQdÖ<™È˜á·¨Ÿh0xQÍßÔE4Œ•.œCø‡€Q!åŠx£¬?ûZÜpÀý¤}#Ë’®ã'·ÛŽ· ëI·ØB_C›°ºBÈé)Ûne–­ò»Fwâõªz*KbØÄ,Sõ tNuËN3n›§Qÿ:ì¥¨í³¤ k€{»oÞ9IÁœ†w© ¤›¸£V¿1´f­eÑoªOÚ”n/—av‡>ÓŸšÙþ¡‘eÓ^àu^‰øÄ®0êN¿SFÂFaæä+V"ƒ¬¼#$ó#Wã/2"%üqZY‘zÎÕG”ÄV[ “ ªZbÑÚâwÖÃÿ±žÚR«pšÃ•Ñàèøn‘1/,¼æÐ|¤FŠ¥¶ÐnŸ;f8¹KvDmýH¡ÌÀb¦‹¬–PÖöY›Âkuz˜‡“ŽÒ×wõ¸ÓkQ‰ž¾KuÙ‹öõþ,ä]éÈ÷ê.Ô`rÉŒ­#¡Ü¨­¸a»:,I6ɆèÖŠ"Wå0+]"e…34&â­ßpäpÙQên›(›ý?/þÏÁÇÀÙOzx•³€ À ò_µâÄÿäøµÇø?òÁ ­ìŒßSô£›¤9ÄK=Ò^Ó Ñs1­[ÂÅš¨Xù6Gv/þö_Úý£»¿Ô74E$Á³ëa«EÁ†Î~øñðPÆžã§ò#c pÒ™yIXÙÁÜøCŒ‰ËNu†ÀC¤$%0ÁQ§êÓMIp wJ2:Àö™ðÿ؉Tb‚bê“âä&Ï#“„¯á—§t-ÀUË DN5ä{¦Úa^µ–̃)Oë£.½™Çè@ÁVÓÅ]5¢O0úºÂ@]a¡ÿ}±ÊS@çÏw»¯_ŸœÓŠK¡qNÊ8¦4N¹z,ÓO`J`šÊ¸h€’iîÛXY¶d&ì‰=.ŠdÈ(îÇÛNÚ;P©±whs bØ hg*Þíõ`˜²o:œP$GÙW íŠíjfó‚OÙ}WžÁÊáZ¹ÿÞüìñ3Û'oÿ_µc¢Ý/ô7}&ÅÿÛX¯ùûÿÆFíqÿˆïÿ™¿_pÚ+»‡ŠLh¯ÑѰ¡sÈ’m@½ KëB“Æ;¤2¡Êê: ûQšW 2hŠJÀžçÄ?dZ¥ntCq«¯d?Â!ŠÈÅ<0ÂDýï×_ÿ•Í­Œýßúcüÿ‡ùäèï¹þÉÃuœ-<ýƒ€¤ãŒC‘ÅÏ1@‘¡!饸QÿAžËꃣ¨Gs‚ŸÏÍd‹’'@f?vhAc··{vt&²ÁøÛÁilÙü®Ó6¡¬ÓôÍ>Àv é°² ãV±#TK™r¶ëÛŽ£l0%eQ}1†Ñz'=·tÇ'Õ$XrGÞ(¢é‹Š_øE2”œ‘né^Ú¨ñÛQNEÑöû°1çk$Cœ~ÒEpÔ:–WdÔ˜2ibB&Íë1CÔЙã°ÛÒT%K”PÜ0”R[¸¢-ùêÙGü )˜Vñ’Zë •R2Ù¢)©´T2c$¾5DÕ£sJ<á ?Æhɇ¸ÉÊQ¾ŸN:‘Áë—f„»ºlÐ7ä×Ö”©&R3ÚÅÜÉÊ´²V-­û½7€‰ñŸ+~ü—­ÍõGùïA>â¥ÞŒßszM ¦x¥òjb`Wué¨-Ë&¾|tðúÜ —’áâ»iÇlÙÉðýeÅ۲Ϫwưé,O›¡:,j$¢hÍ÷€2y™–[S’Ë`³ô™cþóÎûÈÁ§þ,ÿUýøï[ÕêÚãúˆOQØÒþÅ‘™Ì²TØjs, 㬋ZJ³Ö®Ð»¯®…8!ò«0Æ;ìaJ‰pñZ…™ÕÁóu{Qå-ê#Uï4'EÚ-½«Î˜’ÍCEsu¾Ž®¸cQpöâè3`Ž­:WLzç1j±ë¬òÍ«§)qtÅ””ç$›öe_J A¡¡õ¦ð펧V†SÍ(›G*šD‚¨ý¶*‚omÅ` ¬9Aƒ‚8¬™GÔn«ê”Þ– 9 4Ânðö|‰.‘ŸùY¼³§ò±Î'¨§»Œ7¸¤Ÿ1™Ä*'×ÅŠâ;=·å´£ˆúS2z[+…äÀT’£âç‡ßÈtU «LÔH97;uñüú`Í-ÏåšÄ¨°(õ¨®Fwþg üëË››™øÿ›ù?æC÷ù ñö+Ž8w+׳qï{Ÿ¼G~ÅøÓ¯˜êøË& Ù¦8AžÖd®SèLлûE|2ë?LzöÃÏÄõ¿áëÿ7·¶ã>È£íø3þÕ€îvÙ Ri爊R¤ ðSöùONtM¾v˜Æs u\æØ8ƒ~0 gÅž´dÿ*óŸwþû)Žn³òù3Qÿ“ñÿߨÜÜz\ÿñáû?5ã˜ø‡È€ö£ðICæÆbqÕáy!7Ù£ò’ýxW‚?ü<ÓU \-Ø£³ÁœRé“MŒKR5[U`f Ï?)O<Ÿ¯ŽÃ»d8(§ȆÌϳíJmú£j]Ga3êcpt«§Êt–:–m%É`Ú²éðòÊ4в vEwª¤ Xý2¢«ã£×ÿbrÿágBüo\î™õ¿õ(ÿ?ÈÇ^ÿœøë«¬K¿ƒm-O—KLÉÈ–lD¬l,¥«‘LÈäv[;6 ™c½è§Pã(%Žðcl`Ê÷é™ê™ñKÝG·MÏnÚ§oLƆ0íœ ü£¤³ô`MÌ'óUF: ŽÐŸº(Ðí&ç>9^á“Óü²¯OÞ¼Ú=¶ËRŽ‰Â²V+¡¸öqFèôQ¤ƒ÷Y~²¨üPà¶®¨YÂæK”xÆN8ãgõ d î-~¿ÞºÁÁáÀõk^›¢ðN…_¶Ó¢P‚™_ E;! Îù56EŒ*Uni'ÈÁ Éü¸ñÊèßâ](Ö8>úéàäÇs¯ £;ƒ¥°äê¦qz†æüÁ¸<2i1ƒXúw€¸•yƒØh¥·ïJi©-S¦;;íœÉù %×JR«d+ø;>(àÄ•°Z¶m®×-½ý ›¨‹¿Ži£[ú°³£šÁ6º«jöׂ(üú¡”ÓÈåOT˜N»…H, 0²¢[ˆäÌÛꊹ©Ê™gDWÅ"Ár*tꤕ×H?ÖÁµO>À¡ ½V0Öæq {aSŠ*“–"óÁ°ÕÂzrb³óÀ,–„iÆl3Ùa;M"%Õ“'óÉ{£”ëË@aoø°[4èÇfYÃN6Ña’AôGX3ðëŽÐ:†ï…‚C|Ëð·P«ÐlH;uš@^¢E¥­fç¶Nj¦Ë†mðK Dm“éç—ÖàˆWšóôÐÕF3ºCex² u¼LÚZŽa9ÿ÷ñn+ERøàÒ¦À ä÷ÆÌ@ê{©«~aŒ’ãòþÉñÉQ mG5‰Œôë¾ €/ïH¹d¿å'æÖˤ`äû7ýÛl±ðƒ†Ä¥÷¥H±±ƒ/>Ý”Bg#UR“äLØI1è¦ÁŒ¢3é2Ø0TD»6{æö~9:'¢c| íê÷™KîŸÿðæGYcïÍîëý•AM‰ ·*Q""Q=f+S‰žD3÷VqدD…úUYª°¬i×b¶¼ üdòªÕuæ5«\Q©ñê0Çt<,ÔDw%ù&°wœ†•y”„`ô †íøÒÝ„ÆÊCÌÕ¿±Ùº·Ã¨6ëÆæÁ—Þlg·bñ09#ÀzŒl,8$£OBÙ+â½àeT2°‰qgPôl½#üP°¥¦îÍ¡x’=R…@=E6 Î4é RódWꇒÖ9Ôõe±zôeîIžyŽaŠ¿½SrL1jnÎtÏ3-#'Yó£6žw/Ûè°³£Z°ÿDðŠE1wò)Xf_ YRñØ›+a’ óö˜˜Ýé.ž¡_‹B3AËÂ;Ew|Kƒl‹G±Éò‹§=ŸÒãç«~2ú¿fØ¿»ÎÐ}5ô•͵ìýÿÆ£þÿA>ƒ"gÆÿI_P×Eð*lˆ“3ñKÑÜ Êœ€e×—˜+X©ýÌ%à:)Ÿ×ïñyùÈu4'5Û6ÍžŸï!ÒòHÊ'#’ˆ} ®ë¸qVõœ“Â'cZ¾«0ý¦HÉû(²ÂÊÒú’NÉ'‚a7ìßùEmɤæã'Õ%/óÞÊReÉÏÑG×–ŽÏ~8:·=Œ¸™V dþ«e›ÊoÉ"-§9 ¶jY×Éb¦Ä;£9iuØìYØùfTfÍzá¢P Õ÷ã—ÅåÔí>ægp]çîZ¿žÁ±Àþ˜y'æûƒ%äfAÃdŠ…XN´±)çL5˜ßôÓ™šæs#šÊ&|Ë4‰¥ ßùMŽÏ>øãÞý›\©I™ŽPL—µÏm‘3ôþC78uFÂû4÷y–æ~¹{¿ÎÒg¨cHú­`@ÌR©šÁ’RR–Ê9Zyþ|ÚV6ÿàY6ýàWÈ>89ùÞtYïDý±ÓÔ9;ù¬ééÈùbÁ‰éú!æs< ã¶(ÀcrwK‡=ŒA5Ÿ‘äHá¥Ðø˜¶îEÚ:Ÿ>!Êqž5“(EùäþtöU§×ope<æ¹{Ìs÷ûå¹û¿”Ë²ËÇ7™]Fÿ{9ŒÛÍCõóü«›•Z&þSuã1þ˃|0§TfÆýÉ2Õ¤ Ë—äóM£m )<P6"rKù¥ÎÜ÷§ôÞhpÝ·ãŒËm¯Þ£œ»-eEŠö£*>­t›nô£Ã…„]ͤ/XUÙÀÛÆˆcŽjD³©qj¡ò;l·9_ ËÄäG‘0¥©†Úí‚£² ³$vͽbÙ¾0GåýrMô¢AI™†ÅY9%xÚL€;³Cnnì¦Û\–—uJe¾çöÇ2Ýe/ë|7kkvy0“'xL0O!3ö™yb—ß#•ÈOM‘49Ò–¾£h0›Ï6鵉РMN—ýОª£ìSÇÐWbwäu€w™{›€[ÅAB[S:à¼N‡x®Ò.”÷¢2ó˜HAä·4ìô_rµøNèdm¢WRPÀ «2Dô*€,XWÈ…ð’ÐÏaì8ûiÔæCKE…eŠ??奉¦\š/àu˜^+%³•(‘g|­SÜÑb ŠJˆrIÏù~Ô 2Þóø‘×n¥wü²< `thΤK½ ¡&¢[‘<k¯{ŒèIò#€¶ç“§| 408fËÐúÀzzáøQ:l4¢4Å[P†M•¬Æ¨’Œ6b7æG¶výˆ›úÞÆA¿CnÞ‚O¿_…=â×?ŠÏC>ZèoP«–\ª6µ[q·ÉÓ•©¯4t]!lêò~ÎSdª¨Á¼à`ünpÿ'8l®R9BºÀeŒgsãÿ³xsr!¿áaìŸéÎÉz‡BO,¿W=¡ ó„Z ‘fhâ5=UuišF¬i, Á6Ü)G§ý*ƒ¤²Ñã8þBÌÞH7ážSª ÄÁ`I!¥íý«b7ÖMö¤=£\0ô3øW¥D ¯•× …«H\ ñ2b“Ò¸=Þ S–S€ŽlfYà 2…ö„2„7ÀBNÔ¯qm‘“ì1ÓÐ]@ø™ÒÞ€FQ*f®Lw…)ò¾ ðMÅÓ°Þ_¶oFH iJí`.n2æ¨;É$\³ñ²SGàÊ´ÙžOŒ[aÚßÄ7’"TaÙè¾ÑU©oÅl¨¥¬˜ gPºhÀ°é4Kr^ÐêTãv¾†œ åPD¢Üè³ùìû3BŒ`my’ԣ칞· K‡±¦3«#>öÝŒz ÙÝÃÞ…˜s€HMÖ³s]ÅÝ}ùüÂ쨃ä·ï´ ºÍ©Ý7›k´#ØN—Óe¬yu+û´!ŒY|ÒèÚÙž­qÐë8Cþ¹a_Øx™Ñ¯ˆÔÔ*YMìˆ=“4­¥ÃdÇH…ôK‡§Fš`9zý÷˜¢aË·˜0e¸¿Sˆ²÷6=PˆùlJíï_ü|tþÃÅþçg#Ë_8ù¹ƒæ6.›ÁSÄÇx%y|º'÷üš ø±àA`;†W'ÃÁ"+¶¸·Ø¿åCŒãG¤šAœúfŒ÷ÙE§°0níñM×ÕT.ƒõ$´×X‰ÞÔÀÓ‚ çCkug‡°lFMÜdÉ·1Ô‹Û+-'„ˆ[ãwÅZþ¤Ò’KÖ4¯k&ÝÈ™™nS­^ÛÜ5»äEZB¥nÀZIŸ ¦w4?ו¤F]º2Ç ÛT$­›œ:8Éýs±X÷mÏGhZѹE„Ìð(®›Á·ÈFâl '.‡d1@Œ]È¢8`ïhÉŠv8x¿V"—;ºÚ"ÖO£²¦)cŒñëäÙ'nërŸÇúðõí»/yÍìv½†JärÏÆ†Ûš /J×oËKL¤ÁhSæ$A—o2%ùI\5iK9’)·ŒÃyØ3ó ­ÃÀj.5äƒ-u±ž´÷ìN¿‡”5ñ¹’<^èÔ´ÑôÃnã:àóE™•ó¯V ¡’ÝA!«e† MÊÒ!¹xPF‰¢¾ò·•9 Fõ;NªÐ<Ï#ì*Uy„q×”«{ë|ÚXŽUê’o JÊ]ë‚Ì(¤3ÅS®S²Ý1°›„˜gNeYµ«ýqÒRÖ‰C·lœø¸־ijrNm+,Ë´áo¹ÄÁÙþîéÁ1E·u¤¢’ñ6Q¸õèFôøàÒeNeCè wÀq J²Ãè¶rþÛ“_þ@P%Y!ñ{µ­’ªr¦OyÕøš”È7…ƒ%Ìë˜N}‚ñƒ=ƒM|ÿ‡ ‹Ù»ßUÔ½·añc×gŒvA’£­ª®©Þ?³=4}*°n<ðØÔÒNϯûC%!§VÒküÉi¯ß:³ˆEG€³ñ"‰êEãà—Ž7R‘ÊI™e…¦ª’ò d’kõÔ[Ÿ$1#Wín䕞O. Å+? Vç·‘æÉvdêpbŽÅeô@"0OP´£È©™@'U/)f +Ö—afA²ƒ!§˜Ë\ôT¡k`Ä+tb]RÞÇÒ¸DQ‰ÙEÂfEP¬#‚±}X$ñÜ|ØÓ¹‹’Œýæoäœ^ÄtÖ’jD…2 Exø\´(¿q5‹ÍèrxuÁÊÈ(ŒS–ØëHÂ'ËStß_2gp%ÿ)N €cO€ÖÀÆŸ Ê/¿ü²#ö†W;âàÕéùu“!‚`f»öÖò]Bop'Ь,]‚àÚ‰úÖ4«­( BW،Ҿ^:škH* ºÖ=í´ûÞŽÆWe«ÂÑ@…i¿Dß<ûôüLx?4i  €†]­s±‚&¬]aÏôü2 ÅBÁ¼0GÀ@œ¾Þ}up&µfòœ¡NÒúÌKoŸ‰¼>Ê‚¶æ v3Tüå–ÿÑÉëÃ7ÿ%ZwaÉ{rRœa¬Ú´Nù[ªK6Û§hº þÂs·(æ+s±›mÔ=¼ûnyî ~I²ŸŒ)Ìœ—¼­ÐꈡdC…øÚeŠqÀ²¾C<žÈJüßcOtÚ²›b5  Ä`5*Ó¹çs§9U‰o!ävýVîšÝ&”ÔÃÌr-úÔÉ;K:Êø€.-4$µk°XDêE?KœR1òkí¹‹Jk}°øÖøör¥¬hCÙa…eÅùTI8ÕLNÁ.Wù:b²ÂŒ ìýørG¼0ì‘ÓB„Ý;N0KªØhp‹ŽÕòš¥”žö1,S^Ò*¾bR8Äu˜P8€mØu<~¤îáDO ãñžƒv²<ƒ}> !mèÄ’i—¬ì™JäÅ¥.±aìð[Wný¬IÑе̱®î¨Vm£ËR'¥¡³._½XD±d‘«"¦žC>ÖÊg ¥g<ÎÆ‹²UŸ™ûxŽå þè‡P—Ó$—j\ßìrAÕ†åÅ"’9.{š€%ÛìÇ¢†4,ü%UݱlàII¨êݲAµ5ä²KžM-å«yt áSSf ì;‡TƒH Ø@ZVgip)ÛU¶p6­àOfÆôÇ.åëïcÔ~oy ¥pË‚Yg4ÉÓ^ôY¸–É“ ±éðÈB–yñ…%TøÜÞàÄ™h,`@jKfRuÚ‹I^G:CÊrJ¨1ØK’‘Ë÷x­é@sgõ^ _™g4C˜4 [ùDîÊ9Ô3•x1¬.:ù&ÄáwJ®£:&º%ÁÙ•Gïã¦jPÌmBµæ¤dš°xTžtGØó"Sˆž›blš›-FϽbreŠý)Çf±YpôÜSb‚Z•ÌCôøØ˜3ÿ¥´Ôõòܦ£‘K/‡”ðW–r–>û-9lÊg@–¶&ßDé‰.YqúmL<Õ±= ¥'æ=ZµLÄ£n=•²4÷$±´4ÕÝ'mìh@õÙ¿§³õ7XýX å(œîX ˆšF@fx9íøèå'Þ-a³$e:W ¡cÆß=)Hm} Šó€ëžŸ<Ó%”ˆ‹ê’ˆ›  a$aUiCÄ6Ë ÚÛBgØĽvÄ4ó10Íæ1ÿ(¤‹1Ž¦Ö ðæž_‹¼–,y~IÏ?YQtW;”Cã¥O«Ð\²¿V‰iŽšñ°ñϹ‡9þmÝ’) ’\3·Œžù÷Úª![÷´¬mT˜9ÙÎ'ë´¥Žeü©«ß–Á™{N¬{¿­‚Öq@9§7«œ=A–æ&ä)eá€J™ßV!uˆQ½·6C«”c4¥ìßv‹x'¯?eÎ~­/=åkõÛé´VŒÉN«ß² ¦Ö–J4¶”“Ùé~oÓæÇÏŸ1ù_~Rþ¯ÚÖºŸÿ¡ö˜ÿáa>ÿu‰ÿ˜ž¼h-çhf0H€Ë^A¥š Ó’……—-pt:1!«eÍÍ@wrÒ² ¹2°Ì!]–ý,ÂIBà M>‡©RÒaÿ7ÝÃӲ왆ˆêªƒu ±N`=³\î¤Ùp¡3rã±®!Y n6­1èqŠùHr6¾ 6I#åb÷{/þËÏÿ²ÈÜOø™äÿ»±™Éÿ²¶þ˜ÿåA>åYDÆo¶Ï±¯æId¸"9Â^Þû—ÛÄÑ›² ÉžIowâßäý}µà9TÃëøkrÅêa É.+`T,ÉÕUñGûK/Ò<çãSw¿p_yÇBÆüSn½ºGde1Œº;rÁû5†ØÇg*. _ ÇU#Ä_iÒ¡Ãäâ4†#Bk”X;°M&Í5¬MÀ7:î]“øj9 ßF”w‡m:h<Ú)ô°”üÄÏxé`Èà É;GÝ~^"iï—òRÀº²ß!W..·,,/iŒ}"*;4ïŽ÷N/zFhi‡Ù3¢>`†îTʲ._Þ_'1 !æüC¡hE·8ì`ìp9Y:. !uS©¸ú-•Ðïò&Šz¸-"IXø¡À¤˜I&üÄMŒ×H…ÑL0~!B¡+·РΧÞ€Ô؃®Æ(ö$dk⢀9¨>¢Ñn%«:îe‡ü’N‡CH·´?Ó(VZ}XŽ~¿TÇ€“¼ÞuÂnÜbVî æ>% « «k£ºï6Ló_ݪ¢1qÛ·á]Š97ÐSIz@˜“^è@Ó~§(0ÚY"àæY:ÕÍ'^uú#Ï#>¶«uÎÙƒ4³¨²€4ªbà Ã+ C®Ù~ÔÊ…¡Y†ÅIVìP¬3šï—kÃE_`.œt•£±Š]¦(Ç=ܬÈ%ÃË…ï!èÊgIÖ>µ¤×„]Ó±6{âpQšmÛƒ–>Ž©Ø8ßR‚c=Ò@¾,Knüs$£©"íSÈX^Â~RÛ H=Ép°Jî"8a©;öˆ©¸¦Ûp¨×"¬>8š$Ý&]çÃURÒAèW–' Âö8z:MŠ2bC#âò£8b! ª¨H8x|Ä·_MÕª/6-‘Ä_’¤SÂ1¦-¸$`!mý¤×GóOI^K#ú1ìÞ$ÝÛ®èµCŒDå«2´³¢G4ÈsèòmåÊ,þ¸v…HwiQö –6y¿­ž°¼z iÝE fŒá„ö¤õ¥U—è4(4RM*å(E&´¤öÍ• “«3Ä%ޱ…(î5KtRâ2ÑŠ©ïÖ+ »Š²U¯tì`Œ8'ÜJ–·Ùåôh©,ù/À0ûÉðêa—(ì˜é™ôŒÂÐIÒ¦º,b8ý—t¥`ÓfǤÓ"•^%Ýî/î²\\´e äŸáTUû š©j¡Š#‡:tªðN™_:vd…Ô)M½ÐUTqÞôOZ>pÞÞä]° χqž˜¾Î£u’Ñ¥³Ç«8Š2\áÈhƒ=>ˆÑí­0‹ð¹žÍ½^Äý<îb„çôõÉ)ŽÐÒ0…mŒœxg.çT%=OŒ&Z]r‚go~ÍZ5\²ÛE?x bvë¤û Ž´Û¶‰ÄHI™šæ4²‡„ªÿvz,Fº’2Ø~E=)èu¥–XK¶),BLÏoô\询þUÄ:^ó.âߞђHYxî ÓÁ)fMÃ;ÉOÜT{g•CÚ/™‚¦©ÍŠ& +#ƒòr0†%#9q“Ñ^Þ Ú1Ç&кå§2è&+y­¢"ïÉõ¹Æ¬rˆ³…wU);0 &·Tɱ#ŠTï ÆP€²I”²7tŸ*1©N.J(Ÿk¯ííè7V‘3|+ºâªŸ {tFÏ.¿ñAGV êoÙšPõ¾”>ñE¥‚ý{_¢ïUù½\. õ¡fEůWµêUG׫ºõÔ –}ˆ] bw4Ä®UÏúJ'Æ £¼¹¨ˆÌ›ª|“éhN«L5ó¢šû"JWBéf^Ts_øP¬·êöøbì×ÂÑæv žð‹ÚäÞboh*òPËÓÐÍS‰ÊâKÁS-íE~ßÕ½æ ¬²÷{Ày VØÜ©VØÐÁ[sáHå< !ìòâֆɥÛDçf.šÒ¹“ QÞ ‘¾¼…ñ¯qø0¾YP·lêâÛiÀ¥…þ<ãÝì6NÐ-°T0+j†Çâ4us˜¤9¥!ƒáà@Šƒ©BÎç“bA;"0ù‘[Øþä(!2Š×•âD8EªZ£ ¾g¾­mÆý™Ã,â¹1@’Ôn.b"üK÷)þ®òE8✊b n§qËìõñ?&x`X»êéêó÷ö+ÚŠl0æZV»ªø‹ÄÐÞsøaýŽ‚.¢v/BJ6¤¸ ¢ïr— Ý+vXdÀ0]<Åæ®‰+厇tŸÌ@lÊ­ÍúlÚÓ}9¾1ò€)Ì¢ŒüLÞfe-Þ§«5bÎn”z>˜éÈ•¦Ï 'l®s‡S!m®¢ƒ>¯×Ôè({ýäªvrqC¨Ûm·m ¥®ZbDo÷¯#Xè°vÙ8ú6Ѧ ÄaÕd.%ãqºÎ‘QÓô{ª¢ ²mXº¼ï#ÀÊHåç¤"8þXðy¿ÞyÏðÒè,óùf„7Âw„éü¦tH˜Ö#Á¶Wñ,Çc:¾Ûñ/Òzü¾æã¶ýøxò ä 0!—VZÍ1ƒ4Š”«ßbá)Šeð¦šDÐÒq¼&Ñ´e¹(Í13Dþ»›cNe9Ù s¤E¦6ÉœÏSòm2s Ž0½¤hWSØTr9´™Ì]ɶ ’ó±±9‹]ätyÿ‚‚//J*ïß‚OQæª{¬q¥]tQÍ;LPÑú–‘Ž fÝ¡,Ô9[@Œˆ†¡â”*ú˜³íˆÂ¯#µ·ÁqÜö@¸)·Õ7±µ1^Ýì£Ñ ;eã׳Èrgo‹2’˜I{¹/íxË# ;…©2ÍŒô‰Õ§Ol×T—€•‚IYZ¦Íˆ‹Àë"üÒã‚SAukh¼ÄÉN ²+;…_ñ©UåËW¥Ì©N¿…zñŽñÇâåthS>•™Jéó?¬d²XY©k0‰'K4a£jÛ«Cų3±ß¶ßÉ„ m•}\u•› “®ŒRÍàO]÷”ÀµNù-à—aVÒ,2¸(]”( Ñ­)y«‹9”¸}Øš}Τ•n‰‚¾ ´UfTß xºV^ƒâ†7*ß'˜J‚vQƒÌK¨‘Âýv]L¥“Ù#l1¶Î)—ü"¶ÊƒÏ±O•K2SÈ–(¹w]Ç3ä`Óv ‘™c3^Õ˜[æ‹Á—6íE|1Rh4 Ž„-‰Ž;ãÇÀœ’`ò MᔨuP¶d¡Y(YÜœE/[4‹ÞÀîï_í}ÉÒ&¢ZåÉtè•p%€É[)+’)øÈŠt”Q/é©vrjjÙÕв]ø)}o.ËÉOÛ)_ÒYWæ×QÉAUVÎÛ§\P|ÉO’I¹Qð‡P×±gM¯“V SšIþRóOÎ:¦™¨6µÆÐ#¸^Îô"îcа¦.}Õý而·íÝç+o>ZÛìiê¢@O YVIGç@%ONs zZ(Hs]°¨‰b¨ £†£SðÍnÚ‘YÊôs2ðRá˜äÚL êº’aLF;ý¤b™šE'ç>OÈ tD]‹­ey˜•a…¡z„Ä­~-¼-üzd‡Š›ùR`á ¿¾‰B+®ä]¿Š÷UbÌ/LKd…ZuyŠ*U.né*7<¬ ?o‰=^hè[´ÞTB±ÇÏ÷üBë‹“9U>¤~t…|‘G(¸‰€O‚ðØ/ã½v؈ÆJ»©/Ô33ù;@Üʼ!!–/p°´Ô.2ý¥;;yŸ¡äZéCj•lÇœ´V˶Íõº¥·tuñá×1mtKvvT3ØFwµBÍþZ€sÇRN#!‘¢:¡’(Àn!K…Œ¬è–§ô22J½ŠÆ3"¨b‘`9•¬ØÄØIXÛ’‹Äûf;'¢>é®á=]‡…½°)ï;³‹ó / ñ Õ&ÿÈ'?Lìš [¬”r…'E(::Ãâš®UDà’U˜"ùʈÎ>VQ­‹ñ=˜¯Ø=S%•9“öÊ6 Ä´í·ÈØÚÅgN{±Á9¿£,[Xs’õ®§{êÊÙŠÕy"û`#›Pÿ~—–tóùŠ['Z#’¾å`uIP€Ö ¤F)UÖ™(°…VEo Å Ï¡óÔGÖÇV9q•µ 5lÝ× I-QðxüØ (K´Uo-WÝ|1ßýè pDùqŽp¥ 0ý •§÷“ —^' ù9||~ký´ŸÁߪŸvý|TK?sË9Hÿ–š‚ÓãŸý˜f¡b™ò¥w‡?-”íX ãt—nð-÷oeI‡óø{6%Í´èIR‘B<×öGA¦ä\Z·Ž"%™D8·ø…¬%{—Nn•÷3ôZëúxó~ž®¼/!Wh„‰ Väq„”ܲÓïKò°ÁI"eþä'OÆTÍÏDF)¾M£Á…=-oãwÏò ‘¥#yï,a{ã†}[¦T7]¶6céÚŒX±Ÿ$ñgd߬@ˆ´ÁA1¯ðªEe;uûýY¾¤Z¤°Vqg‡s'-L0©À³Q•/T ]ÔY#²”#º´ÒÏàN§ß¡…Áún~¬2õÐÅLh )ßÃÁZd)æ—¬­¬Q–¼¶_&Wr£€³mþPºô92ç¹Ôg`{BZùEÉ=SóvDã’¹¦©‡ñ„Úú2nºª@§Å–Å#Î+ø6î^°Ù*å‡/ÚœEÃyro$\˜µ> ï'Ôƒ„¼ªc‘Âåd,X¦¸‰®f¶h¾Tâ ø‰©ç ®UŸ”TâLA>±¸qQõ$F| ïjU‹ óíXµÍL%‚±ì“Òm)D,Ei)JŸ”>–îì.Z\RÔé/KÚe ¶Bv;gé¶-ÔeOàåË•P` kˆ%ñÞ®ó™ßƒ ƒ¯9op =ˆúÏ2íÛ&M!î\0ïlå ›—GN¹@Ìtƒz¨Þâ9ù_øÑ©ýäbñWÌ݈õ;¶#.C¾µN &…° †3ÚØWß²é3J3Øgîšµ{Ѧßé‘M´8*ÓÅ>€r ±rV^?ø`/%D\+´›º˜ .K;V9_v¸0pú˜ôY:qšÒÅ‘7YJ˸³ÓG×O5Bm™!šÜÚÒÖÀÛ¬¢Všmî*ìs€1nÆ®$ã:çÏZÖ¶`ñ^z"*ysH݆Ì&먂?iäó†GY¤´¢WO ¦–*O‘N}tÔ4p¤`d¶M–cåc™Nó½ÇMÊø»É4åH»‰ë~ɺÇ%iMÕdÜËTLºòÊ]Ž- SlÕAÊŒ« ³ »é3ÊiÖ03Ç÷st-_&÷Kåuœ;©ú­æÑº,»Oä‡â> “¡,N š°Ýƒ†4ã³®ñWQQ¿Ü{nK7„!¹©àuç7a‘Eèà›Ûbé¦~³Ðë_W5á:–HK5véIÿ é5J Ý;*”°/Ý?,·|és)?[€“14z/‚¬¶4€ Ø–[Ì"µ+šlwÊpï“»§:ç}ˆ¡KÞÈüPîÜíbP­• è Až$Òˆ¥$ŽÔnqzÃÒµ¹ZÐùl LE[ìñte? |‘tB@¸ê×w¯=™¬~ˆ¬_$}Þv°6¹Q«ºÐŠÎùLöΕ‡¶U @K[ÔìŽ IŠb'¨iǧï¿UÏŸ£K9„u?:sbÚÍ$Ja·I_ÃF®ïzQŸM¾ù曯¸¬¼h9ç%W«X(uýM©Ñˆr)¨¬kÈîÌ®té%7E-¬:ãÏgUo>ëlZ0¹ÔÉé¸BÜ$ ±!™mZ-êŠîº”šÍì"ÌHÌBª83z*hÿ­½rLËÈr]‘Wޝ;•ØÈòdzÿ@£Dx:ï£e{S Dx$™s:3!ªJŠÞ³â¿üÈsY. bïÔý‘Ÿ£AÏÑÜLå4«7è&¥;ÞW9å]ØûR,¯ÃH.ÉÃd×BÁ(¹¸áã c'ý×A#kªO«®pèÐå/£Qj_Jtâ|èÌ ³ ±ýx<ãÎ'§æ{®IˆÏ3ú#»sж¥W¸F”¥;C ºtåÎyŒ1¯§ì• Æ•¿º,62‘ È ïõùà ÙÁÒQKVÒ{âv;º Ûºè.wRÁ‡.]çu½‘ttdx'“ÄBÆh"t`£Ü}‰8 &*Òpóƹ.P )ŽxõMg†©q¸®1vO¦ö'ç²ÃiÈÍâ’/¦è ²Â÷O«—€¿ÃüZÌî=š^”Ÿˆ¿>7§‚˜~ÆÌÝ&C’q_6ƒôˆÌ˜1X•uÜSb]1¿~{EÞW ñc½Y-Éí¸Zr®=ªÊ˜Â“#Þ»ýQ“ðM³ŠRœI³õ9H#»RQ]©¸]©ŒèŠ}€‘+[D®"ŠXcß5~š ®J­àÄ­ÁÏŠØr^†(l–gÝä` ¬ oZ¹!!•j¸°”7Â.O‡¢Ùo`Tâ›°šO›x(½(‰ >2?Ïž…™d.Ô!ÆnŠpXÑóWò©?,'°ø,´„¦¥³ÑkCÌ,„ÃtŒ­ñSvæ$´ *)*€q‚ÄðM\“(°nC~ þ†H·Þäh‰íŽÁʲ7¶'dúœ~Ïž ß;&=ßÊ{}ÓüÞzé‡Þ££˜~­É‡ðŠøÏ!a$äÈ&D+rœ}-‘“AˤÑ;Ã×—(·¥Ð¡óøjœwó¥ï\ò¤>¬åsq» Á©¢v¢´R³˜^*_MÈFòóÂõ9¶¼H¯*ˆÌWܹÝ~¹»w옵朥bïêƒvzk*ùR.#õ3,÷ò³šäoºf{ÈáhÖåv¦bÞ¦G‡‰|U!}"mg”œbNÞ^ÌÇÛµ¸î˜mÒ ¡+4ï§šÒÐN:á}ré0gãü£†BТN 0ëꆭfÌTÌÇ»fŽÆmF“Ã"ÆÀq,;üÏÖ"I!ŸJ𣄯täÍ©ìiÕO«Ù§NeõœcIætÀ¾:¢nÜUwtÐTˆ"¦’z¬äK]±û–&Õ‚àÇH5‚ßý££&~ÿ¸¨+‹ Šúu¶+ºjîÖð‰¹@ýí»õ µ:‹~ž¶6m„—.èŠÙCP¸)Àá‰íh“¤,‘$ ÷”þž]Y­ô˜âº)3ZþßÁJ¹ÛqOé"Ê„ÁovŒÊ£G¥ÙàZ­V–Db§ÖÀüÈ2Õ¤I|)ãÉ£ôÍé=ÑêÀTrnòy£&k ÜsxCd8lÚ6VU(ðcÉO,;«t`éô-È;ó ó„í[éE¬ì¹¤9MN½ECáé7é‹x”(‰›mΫŒ’9ß>Z&±ß©lv4ØÙ9€ [гw¼¶Ï«M&T¨lUôD’]›#@àׇ¨i4l4‹XßD2Á£*êI_@CFÙSà2ÒUØ´òÙ äžÍg™^•^e‹°üñ’owÝóø§ž}Çï0„þMZó¢Ë¡‰³$†;Ñ@gº\c|6jA; \[öÏü’­Z.ŠÊ4ÄŸÿÖÀÖ;’Šg ÉIõándoFܱ/bó*î w#BÓšÍ8MPð/9?2»g㪻ɧò—­ß”ˆÔ¥Súˆ+N”t^b*'½®ŽM`.‹Æ:ý˜iqÂV«ec¯òteï"#*ãÀ'5YR—ÆoH©—­ëù‹Ü0ÿ¼qgU/ w@i‰á’’pÉxg‡–‡½XíÍ笞…¹V^+œl+»Í¦µ§%]ß[ß½$ôú †P¦%ޱ°F-q»ìè! †À…ccD±yÚ/êz«Î±½ÉÞ„žûT`±AkӺѭÈ~0riï²! AØ]çBùÀÌqV‰‡wæN ž”P´W€­Áø-z¤bfA!â•û]ò£\Õ0Þ¢%DMwrÒ´Ë×<ç‹þµåÈL$ñɶ3×aªâY•jÖ¾m%}Q®ægƒ”Éxo›µ¢Š2ê³À’V±„mƒ·Ñ;tÜ~GBVzðÅu¶û)]—²ÞÀÇ ¯^}cU¢Hes£þ™+¿¯KçaŒ!aì N„×®(ªiw·­ÿÝDP¶m0U ôé^•geçÄ—²ìn~x’#kȯHwÝ =¸zãHÝ£Ò7|Rþ³uUÅð]ê'Éà‹!Y›ñÐ^ý*ì96º•µ¬®º–Þùo¦ð‚Sà³_ ¾Ÿ™¸.×þ¡ÜN’›aÏtヺkQáBz;Ïæ-;î¨`C·%O?÷!Ãѽý÷¶tû$+Qik`ÝïàC‰Ëf ×uöÿ\íqàÜÉÛ¿[øª³YåÝ~Èi0§ßfJqwGmJ´‡«=¹K*ío %½NK©ï'ål‚¤ÝFI‚܃ïdo5MvK߈¡8b€¬Vˆxõ ÄF²º›¸:UkTÄ ÇQ½–›9{q9õ]}˜¹œùÌ {wê¶G‚ƸC’’;†ûÄîaeªyó¢Å0ß±”­+„Ó1ûL•ӇɼnšÃžJ"…¬ñ}V'Bž”·|bûvKüèűEijŠù Å8¿0ˆë­+PÅÜ»§ '™ÎŠ¢ïkK¼ ¤d³¯lUw-Û¶IŠSì½ Ù¤Ç5‡¿°õ1áùãTú ø¬_ŠNq´´åŒçõï¹É3ž=R¦/‡­ððâÚaQ¿ ìßt;‘ÇÏ-ö-æçßv@d›¼Àȧ†‹½ 8‰U·û­‰¢(®€ð›Kê‘”ah©H‘ƒoâ)âÿf,: .ÞIGÙŠ¯é9ö¬AÉR ÃY‹“Ãg2›È—Y«ŒÀŽç Åb~3 bNÓŠp HRL«=L¯QzÃrš"ÿ`ySÿ·|2ù_9ØøjÒKWÛñˆîþÙ`Çç]ÛªVýü¯[›[[ù_⃋7oÆGeƒ­ä¥€-é± ©“à‘Jéz6¼”Æ ¦A™]¥2p;4™à–q©Ç!†Ø”aÄÜL°§2~zL¥IoaôÏÅŽxu …ŒnjÞÀÓ~ #WE.~Ú=V¡­9K+fD;çªd«Û×Ñ…I?¹cr ⊖&Òø7“µ‘4ŠáG¿ŽÌj‰5ámÜv¬¤–8>F«® /aÃë&½ñ)ým‡2‘FÝŸ“~³V-ߟ/|No$¤­CH]Œ®)«c²ÙÓ³ƒ_œ\œœž]¼~q´‹·*Ù¬¡Ÿá9v*„XÉg÷à‘žÊcq~‡A)›ß“P˜ü ÄS‚ѽ¼)B]“%Œi²ù‰ àMzÎ}*Ÿ¢çùsÙóòóçòѿ̳é‡ÿ¡…Ý&*Y`ߎ?bm*.Äp–uÑg+ØËxŽà($zÙmöeêQ ªŒo(Sâ7¶ÈÀ4âÉÿçr«ŸtŽºªþªX»­PÛðjÀ‹_‚Ÿ©C)Š-GJP öôKúAw R6ƒn^ÞQŒ4XVa“&Õì1|t'寛ٮ¯b“jBzÉm†kXö# è³~Háªù,í*:Òú›ûk~’Š‘j{M7aYÇPÏáøó qáŽS˜¹¸(V¬ùp*ìžíq m©%"¦m¬M¡ÿÉ+õ¨8àÎNw÷`–‹tMæµux|²ËÝkÙÝkéÞÁ/çn8W¢˜ÏM&*À8 V¢4l †R³8òü¶‡Ñ'Ef%zöÅ[£ñ !ó-½òô¡KïÝa”1ÁéDdÛTîkðg€+XÿÒ”¨êóCd‚ Zдv[ÝØ(>ÓMðØÏÚívQ¿õ²Ì'Ý«_”e5ÇÆgu[—Ħáà–€mnlÔ°1a¿ø5WÙäîjr¢Ð·@¦˜f,ê"Â`óágƒ„F¤ÐEGn•¹Id OS1‰e_Õ@^æ°¦‹VÌ<©Ó+4Ý çl)êÒ⳨ª×ô8ózŽíz€ü:"ÖÁYQ!ƒô@K¨ùQãùsY0$ÉŸ™©ýHe‡]Aüê*æ»ÚÞÃx!½F¡gMê;?Û»„A\@ uÊWà²Ì%`ÊÝUXj|¶"Æ W‰)Qp§uÒf%uï´;ÉýÑÙ²¬BrOsw2kšiNån†d‰-K¼w)ö³½v»&cÎ&Ä­Ån…æ¸gˆÙ@µtËãmlÒtñÊ$N´qŽâ .:ˆº Iúðïm`$ÄrôV&†uÀ»ÙQ·¥1“ˆóò>¾ aâ? «9ùÿì½{_G²0üþŠy~‡‘3f;+GÞÅÎÁ@@Þx×ÇѤŒ-ˆFâÛùìoWUß»g$0&N¢ÙõTWß«««ëÒ‹iɽ£ FÚíŽö{ï©^²¶9o—®®eÝÍRôbh§»V.µÍUæ2²{Œ.¹ £¶±òˆ&ºŠFfˆ\Ó—U™¡§iôûN™(R0DòVCü¦„ë«?´ ‘"”C¯®HhMOê+¦oBÅJR»Gƒdñášq·bÍ)sZy;«ª™ ßsÃÁñ´šº¦á}ÔGMÚ‹MlÁ‘µ§5uY8XMµÅ5qŸ£Ýš5Šîfì7!ø‚ã<'ËgýX—´»` q·g#·Þ¡5cP‹t[9¡„…ÿ~ïSñ_çò”ýûɳq¿8p‹©À„WéœƒÐÆ×‡›flV´5®SÍ@UïƒüŒ‚¬Ì­m ÆüÁ•.¯8/Cå¤W£ùdÀÊ[ªT°ì½¢ àLjÎ1Í>Êüû1Çùåàé g€ÃCÁ|æ¼)Ü…³AD¢ ©ñÒŠ¨ý ^IÓÑ­žGX[¬ê"¬›øcTQa“eèn€íÖ®ÃJéÿ§^úÏú¿Îxô}uNÿïâñ鿾œ™ºˆ;‹ü뻜É϶øü®Üè2ˆ‘—‰˜¶vò(ïÉ夓xòÓl|”ŽÅ–‚‹ü>{¨1“ÖR¨ÞÐ3bl<¯±#óÑ¢,‚ÌÑRg”‚ý„¶äx Í’Ò í(9OGŠM ”õxv°ØÈ»­´O±Ü æËÉ6Cbj«†VÕsÓN]>Ù ä^®ƒý¤oqý*°ô1»N½¤ „êêb­©]:\¨én¶áq‹tô¼O½(â›Þ_—Nl=ì2« §bˆ›~Y3òycÈ›õú¨Ž[ÄÔp´¸AKœ: $^Ód'ƒøð$JÝÈ‚òPø¥¶–‚ˆÑ›ÒanE¨A9+©³i²gv­0Ę֭F6³Ò*ZYí95Õ4«ˆXíú¹ŸqBkˆ{Æ.Èœÿšµ' 5Ξ;&g’'3MÎŒ‰èÈ[ð\% ÖŠáÙñR¯êHÑ‹âÌE²£úÀ|Ò”ÁunÊêÍ@ËÚUÙ·ITq׉WoO¸Ž9ddø3¬ûmÝ)J *Bt /£—,áBœê[` Œ¿üåx™£~OiŠ6‰r›âïGEHIÍãV݉Re–è΃ªïEYœ»+B æ¸+n²ßê!h.­ÄÑ\>Ü8ˆpMGfà5"4'›oãÜ3\µFˆWƒ<æðá‰|\K^œL¹ˆŽvÿÝÁþ{xÅîa6S¯ÌØÅ·ÒòâÖrƒžþ-4·I……ƒÁó$<>VØõn®8XõØç¿^xÕ}p‘ŒŠÓ¤ß¿­Cà”óßÊúº+ÿ{¸¾òp~þ»‹'" …øv'ü¨®~ÈLtæÄß~s‚%ý“á(Ÿðx{ˆ O |>K8ûÊé£1D´8KƧJÐJ¥>Ä/ÑG{(ßʽöóÃý—íŸvø±qgo›èÿº»Û>ØàÇÈöÑû‡­-~œ<ØhýÀOáÃäò/ü_÷ŒÉÊN™Lž3WÝ…hl\[6®{oû&™@ªå ˆDhR%³ÐP’Õ0§³0É„Q<¸†Ñ"D³@£ N¥P樔L1«k̪¤¸¬,H1”d]i•ôÜsæ°JrÅX:Ì nh Œ1y`hò˜G‚yÇônຠÌ[Èlv¬À€´¼j¤•€5–Yn…iIEB×C,AÓì'›ÿχ ò·ªý7]ÿïÑÃ5WþS8¿ÿ¹“Gòÿ)˜,ãýOΦÏÁû8Ð!èÅiÖ9%Ÿ¯èœ`šÈÈ÷уC–ƒ ÅØ«<ìí“áš%Ë)LÞÚ´Ò„8çºÌ¼àå­Â^í´JË‚¥úiEék¦áÔ\È}œVN;Fȃ‚ÝþàÀò%%:˜½`Ù´Ý~%ÙçK‡iÒæý+âcdž97sgÜŒ54_.3óß–/€Ÿù&ÜË>KóMxè<®F¨zU26ß`’˳|!¼ €OçjXî‚—qî‰Ã,ŒEXy- ºª úuȪ"õsªú§¡ª×8#–à9]ÓUálgF—p~ÊyÑÁõùI«Éÿ;÷?yrö 8Þî pêý¿þ[¯Ïïîä1>ƒ†üèw5œ@Puˆ$žÏ».†±Ã¸â³ÝýЭ÷ÑÞÆÁÑû-}ûƒ|¶Ád«<{©Éþže´½—›Q%Ž'ãñ0ç `¨« v™ZÈbǘ[y’úèL•¤²"–vÄë}Äë=ßQ¶mxÅõ‚Ÿø6Z;û{5•n¶|êEJ¹e§”ÞA7˜7ùÏ!ºàóêƒHr6÷PaðÔé§Éý29tf‘îžr£ÕÞîÁÑ‘‰…O‹È¾UqüÈ>áEþ)šƒâ‚Z[þ¢Tç¹RGÃ#ŒôjvzdChâ`D¢k‹Ö)ý/ú©5¾ÔÌlâ[,g_S¾ÜP8wOÈþ·3ÌAygÿmìSèÿêÊC÷þÿÑÊÊœþßÉC$h7|c䉯Ë@´¸‚)ºãYtÅ8Q=¾’)4dfsñbgoÿPlrdùp$epbIMs@ðžrÁëôÍ@6*¬vŸ-æFº³U|tÏ¢ù o¸š~ßßè)‹j2u>ÕPz8…]ذ(V]§“æçÎ;>wz–2a^àL1?vÎÂ?ÓUeÕø'I½›ôלR’T7ÕkX8ø{o›š'ÄÿÎúÿª¯Õ=ÿ/+sÿ_wòG`aþG&}|ár&f˜Ÿô¯`)æ|?ÂÃÿàl˜£i`t´¹YC¶ûJÀØVÒ9eü œ§9«8J š'd?  Š%d:é]^!ƒ_ï8ä¼Ä…˜!<ߤàïÅä쬟ñ¯Ò?ÍŒ’‡ÖáþÞóÝ·7÷÷ö¶6[[ÏøÛ‹ƒý=~T?b†!CŸPÕm6¼’ñ5R-¶q‡¢0ÏixúR?Lä‹ûû=EÑå•5S3!ÖÖ×»® Žz´¦s1Èïdÿˆ7á×iÍœRùO)ý¿;ùïÚÊÚCßÿãÚœþßÅ#è2z›ä‹…¶îÄõO´1ØGx¨Jc¶=â†Ê”@ˆùû½˜Zk*ü­:iQ€Ù€)àE×â:}G~ÿ¢½Ý: ’løð©pÓÂ!¢ó<Ç ÚøÈ1×XÚ ·“<30ôÐ…ˆBÐ^´Ï ‹üT{ÛøÀ3GíøBy `q÷)§R¬iûºðt×…A±‘!ìvÆ)À¨½ÌŠÕº ÆAÇ]XFGnG¬ÆAH~¸‰¨‘ˆ³H×%òqCܸV}¯‡IZ)„3ñǘ9håFS*Æ¥Òu¿÷ ©xIK¬:¯•tFyC\¼áéâ9w)sìt.Gì¼7š/MEœóT÷òæ1k†z·g@s¾­Çç†5‰Üf‘Û 3XDœìˆ…?¼µP—›„õk!ç/±&ãøK¸×eØãª¹´hŠ~Ä¢{þsᛀ2²Q=/>âAÛhÙ40Þ‘¦SPZŽ4ù)6ŽÂŒ=Y¾dU"wCû| pîÍLÇ퇞㰂GºàòX¾"±w‡/àé¬ÊCvF;¦ÿ)’”ÇËq`ö_QYzÈU’s/œUŠ[ŒmÌ¿’„Gìo¶øŒ†iÃÓ¶7R` ·o±3^jQÙÂÁóCÄg~lþ¿›Ý¶ïxªùÿúêʲ§ÿ±²<÷ÿp'¸ÞÖƒ^õqExä l ¤ÈÇže#:H[a–tß&¼sEL>Å·­v%‘ wm€Ã§ÃÃNHk8ÖNÒMƒŠt£&¢¦P:  /à,³‘… Œ“ã>\ÏñŸ¹QA"h$ÎEòÀÁÒ˳a‘’¿ ÊQrPäkéŽ Ò ².n˜ê-t[×€ÃD–Ÿ˜ÒºSh°E+•®AF;ͯtRö•HqÃj°ÖŽ©¶y¸É‰A¯?*³ ªïŠn}=C§Åh½†jØbÇ+б:ÃIuµÞ´§Cíº{¨°nr@+#„u‰‚€KT-É AÈ‹A‚r!DÓÛYµV(йuÀh!¼±Døäáz¶ç;m4Æ£G#m4Ùø1;µšîý¥«d厾V?kìŸü§ÕHpÚi5ºJÙvi阾9Ål,´`”E½<ÊbŒ®˜Ç}PaB_šFÿòT˜Äø¿¼s¬þÈ¥Q0™ô/u†y'G=Ÿƒd…pÙ¾ÖóË€‹T°5æz~™’ŠÈqIhÌÐ#¸V.BuÁ91šÄÎe.l„¢4ïä:û6To5à0Aáš,·ºêx&Êýn°¨5·êÐöH{‡ƒåZ³]Úo .ã,Nïsj¥Øê^ ü[œRlpcqˆë$ņÌT àÕÅ¿o{¤™pÀ ƒóÁ[´·7¯²b…k~ÿÁÌ*{eø~áÁ[áòW­‘Á•¨ftPÇ+ ÿ½“)eßê '¨íç‘“:t,X¥íc V-Tx[3*k ø,xSó*Ç' 5L¸4K¾/fj÷TÉW­8V4í9džÁºVwˆÎcµÄ›–8,À#êÎ|öÌ3fŸƒbµSMÈŸª"æ¡Ô¡RY"z;e‚ñz“gw‚Ê•NP̪‡cQMÐlÚÅœ® a‚¾½þ¥K&è[˜ oË'¨ìŸéóëjM’8+›ŸÔ.AÇÚîü,§\Ó秘É7ŸŸrq”ÎO¨ûÝÌOSg+³Æ/´Y¹ŽRä^e9çüÀ(v2…tI4­³Gz¬Õ2ÖÛÚ 2ðö~j쥼·êåÙ¹Mœms¥ –ÛK$÷øB<”ôcáôÀñ¬¤Àë,²[àRALú•CÖ7¨€›/P—oÇï„Âì½y4ö”fñ8i@ø*³xÖ4qxª²”bÂøŠ²2Å…²ueŠ å+É)–ÌÀS‘5S\H[AÖJqAmõX#Å´ÔcUŠÕ¿žj¬“âK2Ì®VCÌWUG<ÌWŽÅ«žj,¤˜¾b¬L±ŠšÉkÏln{*±’ ú2!ÊqàP‹•).”=}eŠ;:¶J¬J±FÇSˆ= Ï _%ö$4ƒ|¥XNNnp®×AgkĆá|}X3%i:î1R$ TfÕd¼¥W*è‡ò ˆ#¬¯ùsÓûšˆSØ­Ò# €œŒ¤…–ô¬©jÒ¤êàUµjÒT‚µ&üó1d¶oÉqy¹¶\÷ÙUŽ·‘µùíÎïùØ÷?ƒ[¾ù¡gÊýÏrý‘kÿµ¶¼:·ÿº“GØÑEuü¥ ƒ0© ²öb³[{ÍdðûžÒâ3ƒÅ/9U%à23/aÛeäj6å››Ëu:Ëó‡}ÓÄ$3와:m  šøºQYøªåH/s¾ Ê ¹¤ ì°myfÜì—öµaŽ–^vRº‚áì}ë4¥æ>39R¸©ù6šÅ¨¾Ë}•Î2›uê‡ïð|òM=úO'„ Ž`œ¹È»ý”päf.y‹ST«A$YŒ ­TF–QÇBL!ðsZò_•ÕônÎ nÓzn,PC»ƒ6Õ6™Ón3 ìÑx¡ûq@¢[ Îþ3t—ÁŸ!ºOö;å±úQõA&ÎÁÈFP{Ó'keöm‡j(ŸÑ;nFdWdê¹!ùÚô"‘òr®Ôf(Ôä Cõµ,§¼ÌšY æ5L©Ü¬ÖA¿dÀÿ.g˜—ej¥ÙCkþKKσÅ3·|T Ck.ä¶egýŠÉgÆù•u¯ô¼y­‰+8'ˆ1Ê€ãA+y–7ÎÍc·çÌÁõr^ˆs…'û(iÔ¢ði)>¹¤‹.gokú™Úªg³Á÷Ÿ©h}:së%®*ìMié«T3GbrØä€®SŒèUoÝg¢¯v—Л5Ô‰‡ã@Â[óåÙ´7 ;j£+ß>[)! k™U™ƒWܬї7øj÷ÃnÐ7a©_0 ¶š{W2rªÐ¡¼‰“œ„€‹1ˆ½y"`2zÔé)-—óŽ.v=¹7ÊåøôÎ`¸™2Ì´">w'3{£ÙŒ’ø‡$‘/ÇÖ>£¸4d-VJY s¿Î-ý dDM‚äXÚ³YíÙuìíÙ¬&÷lv«{6»á=»–í=»ŽlñZÒÅk¹}cå6øžå4»¶> ‰=Ð,>ÂÙL¢ÆY„³Ûá³Y…‰3Ë&gpÎfð)Îf7Åg³ g=†„ÁcHôè‰C‚G#ÅÇgËuŠ 9»ôqVù#"H Øæ9»‰ïÁSu“Þƒgç&Œ›úÝ}λ¿ˆÇ–ÿeÅð3(€O³ÿ\][öì?—çöŸwòüÄ|ôÃÑÙiV ÈøÃÑ;Ò÷.E gà€•ê3ÿ?·Jbüj‰àÎÑþ‹ýÃv6Ûv 9`?²ÃrÏÅ£xMÚeÐx$þüõZç|QA3ŒÍT}ÜcZØÖÃ×EBY–E•ƒ‰àOÓrpÖ”ºÐx ›}å_î›ù¥ù…6;™ñ–eFë^«ô•Uæ~ØçÜ« m© ÒçÛ«¼ÏÛ<{¤Í±Wz´¿¡ïûÏæ¤$)(*u'•X–qšFäsò ‘5a­`Q_–³-yÈvêkŠf2³Êþ¡ƒ!5·üqÜsɆͳ$’V{>¯·®’ε$ÑN}BJ A†DÚF8QˆðBžÏVkg à0Oµ$¬ ¤vï+\‡ÆÓïö/xb‘)±f·Z+~%­«Øü€q½'äÿ…®ï*þw½þˆ§9ñ_ù`ÎÿßÅsóûvˆ\ßÄû½´0»°\43-(þ3ƒ²€y*€e<]cÀâÒÉl‘îúï‡L áàÜ„ð$)™Å¯¸x8Ÿ¸÷Ÿ®3 6”Ü<ÿMuäS¥ƒ -¡a¹†ÙçKžüò0íÙ©?X ðM¹Ä¥¾¯)׸Tѽýg[0óÞ³wé+s„†XÐÚ5÷¿I[×<¤™6µÏõ¼ñá ëÚçåÓl%‹™t,PÈ& =ÍÞlAhàECžã\— &„4§UJ{ŽŽ†¾Ïuõåñ&EÞ#á—K_-.W7Þ­d9ÝW›%CÝ]6Ãë`ázï¯J"«[#Q\`™ÐóriÂ'b5}ÏgQ³Ò|`J5óÅ™`I=òuþf&hT döåèLQßÒtŠËòÎÝcÁ-i›ðr)ýe·Âæ¨p>ÐüùÖήéJƤ‹á†Ü° ¥¸Ýpd!KäHœVÌËJ4hÂƒŽ„ÇïŠ×2ýÀƒ–Waù'…0ú`¡ØÀ6¤°÷`¸À¹Yi#ïP{°:ôŠêË[Q‰JœS#ûB¿&]Åà¿~\jz²ž¸ÍÇA\ƒ—ö¥…!”/ð•Õ{aÊåY‰,¦ Î`-æÖ=­¨]Ã-m¹]<~=E«K"Zc•Cž²>(TàLöÒ¢ žéÎ1Nö¦F´S†­a|3¼ñ·"a˜ÓŠ)„*3!³Ð€Å0j|"‚Ž×Ì™[¡HäPÛÇ8ò:[“oeäÍlmô P»ÀšªTe¸Ž&CP‘AQäwõÉm·.´ËëB·¼.5ÏëRç_ùWDþ‘Eæ_ù°†–éTÎ,Ä"ˆ0ã†à|°ˆãEý ó·]»FFÃÈ]ËÚˆ¼†É•ú® µÃZ× Á¼0o=XÀ@;"¨Îi2’ñ{¥¦ɱr³®Haä~+r#ªXúºt£ùÚ§vWú 33òå=ÍJ\ˆÅD4¢¢þO>-ì¨õ ü,>sÀÏêÿ<+‡cÎÝÒÀIi°tŸà0Gkåyä„ÿg¾âzÉ2šæåXhú—}þÈÜ&µ¥þ­ÒÛVÑÞ`ø¦l€5FsùÃ!²xrÒ ÿÙ»×Ì3ò)¾Fξ˜ óoW˜_9]Ûfºª/‚W"ü¯]_¯aÅ›› äCª43)æLU¤™ª3“ißL 6³i×ü]Xª5̃œÅ°ÏÔªñ4jHrÔ¤¿ž6Mpw¨KcËGB”p§ú«õ5×þk}mÿñn!ÿE=œ±ƒä]*ýv35¤ƒ¿2õŽÃ­gû{»ÿ)wHA®D&c}•«^”ˆz]‘%¾ö9BSÕ¢¤"³)ZØ5,U¶øâãAÏÙ“ß‹=™å2+÷eÞúσrA¹Ð›©ÿ‘dãuoá¿1’žÏ¯áÿhÍÿ!SzëÀSø¿Gkk+.ÿ÷h}yÎÿÝÅ£ø¿TœL†=6¾ûQLåû^îíìïùLŸdù¥æ÷Nêp-²‚÷ð'«u\ÍúÕm®ð¾þ²2MUWƒ®V3/¡z&÷j±ŽŒøØ©×Þ`a/.^€P ~+þÒ莞f/7bå‡ê©æ4=i¹áèÍl/€–‰,‹®Àa-Ž„·Ì' ‚x@ˆždD75Ç‘›.€s’3–A"¼Yq+½Þ™*ÿ«?ˆsÙ€ 3<ä” H ½»ut4% ™1WSæš’ƒJyËKÉg.Å($æ"ãÖ/7vgÌùœŸgZ[‡³´F€Öiq: ÿ|Ì%¹Œ4O¸‘ôï§î­:3à“¶*Ü`ùcÃÈð©sq¤©Ê†?7XúØ08|ÊRG ÜrÉsš),{l› >u}X'*ÛN£ Øin-¬“ŠF¢’4•ä¢pOÞÓYÞ@?Ê^²7úÚ$òjs#ÚâÇÓR#ss!J}e‘U´á̯Y¥ýµåÑÚ˜|ü÷·æä‹ìòmߺú¦öòº¾øÆL{JØŽ-L$Æx"c0Ë7«Z²úTÄW¬•U®[w¢·Âú'd6}°Ÿ¦­½Ûjy ‚yóNüö&¼¶»÷PàaK!À_~v×χ9ìæG1f’;®Û •þ&1éÑç¸K׊ԔKÚzl"õÈ—$”¥ÎoáLn™÷k7om°ŸÙ· ü_úý´RÜÕ³¬k8“dþ|ZmlãyÛœÉÙæL¾6guµ9³5üì¦ð¾°ëùÒìâ®rØëøÛü<7rÓïá¦Þ¾\l~Ö«7çfÍm9ws¿ÿÕ›oÕ>ݤ}V{öÙg¶dŸrÛ6· ¹­'dÿѹêôÓâöBÀO‘ÿ,?òâ=¬¯Íå?wòøñßÓ|Âyœý‚c³÷ Fs#z‰˜¾£úâ'×7öÅ5})ؘ‰KsŠî›ÈÔ OȘk‰dRÊÎܰA‡UÛÀºQ¥$šÿû? ¼¸x»ä1ÂX{óß›üÄϼˆñª»½eÄ‹)Õ!ã1f|°[ù|!Ö«ÖÿmI€§ù¨¯»÷ÿ!i¾þïà¡õ¿U1‰õ’§Õ”YwÂRH„\BsRi|S®ü 9ùÄàâ¢W#Þe†Î†î•z dTe”åNXÇ~«ÇË5›cÙ&¶ôs¼QÁ™áË@àqÞ¿9„@çœnBÉz¢üûâ¸ÂL!¹ 2¤Õ<›,2˳qÐA<èó¤Ñ˜`˜™¦b ›OâHÔƒ‹ xþãÛzMG_‘…Q4ÞÑp8æq(Èó"OǨ@â›i°£áLdIÞU™À'4€P]º-pp åòs^©\®+âvfÖc‰©€Î2•¹¥†Äã)\[Ö$ÑE< ˆG ¬K½xîe¡âÉãä„i’ã.Rö}S‹§$.œk[¹l¾²—ájxM°â‹«RÃÞý0\²¦9Îc£ûfÃPR‡°9‘ýˆàÍ×íê‡p(õO öН<+”‚ÞðÄð…_8™îµ¿xB‡ÿï~ŽÀ”øÏË«\ÿ?ë++sþÿNž2þ?SÜEçŠ.Qù$ãv=b G.×mpž{ãðpãß5åý_¼ØÚkm´vö÷nâCqÚXÕ¶ûXïçÊÌ\ò@¼I‘ž+r3´†u³öpooËå{Ø$(Ä8]6P.[ `ÑCÐ2r„°ˆaX]é„Ün Ê…ÐþµÉ×V2þ€“ÆÆRèZoÚó6c<©h¤&?f§UÞrñ"Ñ(ÄÎ}­~‚Ðèk«‘µÇN£`5ãÝž)ºF1$Ïøq‡ó¤Gû/¶˜¸¶Y}­Ñè@ït“Ûß„ÂjfYwØI™0Þ% ãæƒvÃÅt–â§:¤ˆc`£±Kg žk×45¯"ŸÿfµW߯õ,6´G߯õ,6,o¾á™azŽÆÎ3;:‰FŽˆ9ÉÜÛ3>ó`Í©›ZI|(ëìÛP½Õ„kÃTãlw¾p­!Ê£kôVÐ{µÖÔ5j¯pñŽå˜"j&Õ,‡ 4nOä¸Y¹ßÆ0¬Ü¨šYX z"{A'Õ¬ÃV¡f ÇÇG?òéhp>wžD¾Œî$4‰|c͹3_ë_ó^ŸÑmáï-{ù[þ‡& øÓÛ‘Nóÿ½¾âÆ{øhyîÿ÷N’ÿmg“qŠfß—ÏúI‡oö8²qvž25'®aÒ:ÜØ;Úiíük«}¸õì妔÷¡r¦ hëª.ÿ'y6voú[ É¡£¬puÑ_"kD?b¡j…®ñ‰‘2þ/VÈ_ñØë8ÊNt³[¾˜"ÿ_a¿çÿ¾þïä‰î3c¼Å‚ÞÜ?ø÷áÎóZ,êÔØ /ö4í÷Ùnr\Älw‚¾¶[iç4ö‡'xT¥Kg×»Dß!<+¿AÚÁ±vú“n¾N £ýøê,e‹è‹† àV_ø,tH'Çèãšÿžáâ— çÊ·xz nÈJ.ËÇé(GÇœÙ_æ À|- ;…Ü^ú9T<ŒÔdh÷ˆ6 Ü[ƒ-žø,gÃh§Ïi–}â«ÁêóÇ 5+àžnzesýQ™}PÄUâzçEdpQ£5f±Å훡ù-Î,Ï_àGH€–í‹>ÿ:Çô+)ÊᓱÑ0ÕJÂ'Î/Z¦^´h;GX·µ²+\ÏYœ‚P—ÚE)ö•‹Ç•ÿÖ§”Ú§Ü­(ÁAÕý Ê}xapÍHi ŠñdïöEg•½²ˆ>ÔéFáò—¯‘A†·¨ïix>uSã¬ë¼…2ÝEadäÉ[©›)Eœ´¡-X´ºÉò+k /n^IÔ0ì‘v,BÏ2ÔÓo‹Är¯‹t‡”\yÓÒ¿Ó7EP÷ÀmÑg¸ñ1E‹ Í­œ 3€OÐÌ› ²E¥³êáXT4›6A1'‚Þ-Lзן TbÉ}‹×ŠåTöÏôù‰uµ&Iœ•ÍOj— cmw~–S®éóSÌä›ÏO¹8Jç'ÔýnæçÜHš$ºòVÒZ-óÌÊLeÇuw˜á[L-“ÏmâlW2ùÜ^"¹Çºá)—÷™+,²p†m긺þȯwÿÙŽÃ7 î²Ÿ_~òh9û¾ eä Í‹kȸßú…äü*2`²z@ÅóÉ[º‘ vîLƳYÏfbü缎Tî¬ß¸è<ÿn¸Ïx5É<åf¥ÖÌLép…>3 îT…ç ¢3ÐBKžÖT5iRu o“Z 5i*Q[þù¨­´(Ð’ìòrmIﳫƒÖþhw(äÇñÿw:Óbüà,ŸÞZè©ñŸV½ø¯ëóøOwóÿòζâÄä4`8 œÛq?3…ühí¿<Üä~Ø?lmµÚ­Ž {oMö&¸Üyºµ»³ñ6ö_´ÚiýÐÞÙÛV¦áR£] '£ÿ#jÖ¦š5|ô½¸{2¯‘­;ŒØÏÄØ¨áŒé¾Ä¸xðj¹”ò泉]Âñ:èC~ {ù{ϺpãÑP…PxW"ÇÁ‘¦»NL¢Vã´±»Ëeçð(‰*ˆÜЕF.º7¡Äåš*ÊÞ«tíwoLƒ÷1f—5ÛX‘õÆ“3¶Ìšf_~é÷Np³eê5~¤9g+îMò•]Mû9ëaE¢ËøJ¸Õj6žñ;d^õ«8ãI¢>o­›kr¤eÜúªi 5¹lÃÄjЬòZmaꕸÑ.sðÏN .éƒ ««fnïÑ/pýês>lNCµöà`ÃuØ •¿‡=@3l}k\å:Cÿ ÏíVS±AÁé8ÓlôPxsëcY+áâÙºÞå£Ñ^àÛ¥©²aίŒ·þ«»³ëjnĬzËž@ÏgaoŠHÔ¥sS=Ý;®ŒÀÈ©|­ÀrO†Ð¤ø-Ìmš™a*‰ßÊÐʪþjWõ]©á£¹¬T]*¯S5ü¯jŠº¿‹êS«o´µ \zº¥]ú¥MÏ]aø¥ ¥¯ðÜ浨LÖè­$ð蓉5FËÀ%¾Y{µ2ò„e,­¸aÒÚŠH(10lE˜¸ V'IÜ‚¾"i 3Ó™¡_»¼E~]ÝðaÆ™À³S…û+7¥ îx_ö‘ªe?+ ®FŸ2TW‡y“;D2f'jl&Šr Brú1Ù¸µ¸v^Ÿ0¸TÀœ¸à§¶Ká·:ä7 þ`|÷‘Â“ÅÆ@€±†DÎJ«Z¡Aî×ÖòÞÔqGz+¡ä÷•òð ú_g0âNsã ¯L†`‹ßÖ¡¯ìº´QOIÖ5ÚûV²>˜­Ksiû?!êù‘Ò„ùÑ9e£x þއÁÅì±L¸?¯ÈäOõ8÷¿gIžgùɃñ(½3ùÿò£7þïÃÕÕå¹üç.çþ=`ÆÆY•l’âa1frZ0˜ò:Œø@ðã|%=—Qõ»i—‡')Ç8bÙø”%lÂj¬˜œõ³´ 8¤ÝÒ´ …;{íÍý£Vûè`coogïy»u¸eÞ)háÐ˼3ÌsT.Ñ7É¢žm¬gƒ½——ŠŒ…î/*ß«7žó‚×™ÿcÈØC²ªãEñÿܘn¥Ea.«r¼´K¬áeþп72?¶×?Ï ðø|Wëõ‘§ÿ±úhîÿóNCþ;v'}°ôç‹-0ŸhßÛÅ~¿Áô?gIçªÓÏ:Ú@å¢%+ÝÖþÁþîþóÍÝöÑþa‹YÑ Á¢Ö+ì~M­\1!+=Üûê+ÀŒþHýC놧rýßÍýO}å‘wÿ³¶¼>_ÿwñøë¿C¾@J €ºü ¬z}i0-µl+ˆÀô¸¤"P3¯¥SJ®IQФ¦ e4Ž Goö<+²1†=øi8ê~g(Oy‚‘ [Ž$uªU@óôÙíæ©‹m˜ÆÑFIpØUÞïŸ0^ ®‘0é|dœfd6•›W°Îψ¼äE^2ÙºÄX~ÍH¸¢Á ЦJ,bþ•¡_+Bf áæ•DÔÌÄÍ}Ô:Þà0Jíå?ª«•/ò±é?çút&·ÇùÑ3Ýÿ“ÿ©¾:×ÿ½“‡èÿ yÚ›˜4ã?¥Ò—Kç»gR8ñŸØÞpœ6ðÜHÀÞ«ì8eê|äsÝËÖŒú§†>RêÛª”~FÒ‹y_çùƒÉ½JÖÿÆX~Ĺ=oý¯Ïõ?ïäñù?C H "½Ük@#–(OÊ’þ \PŸ€@ÙwËAn|,Lj7c"°è~cÚöŸƒ~'ÜûDÛÕ¾Õ{|H"±¦¾‹}Óu~F> ÐsÃcLÅÓ)íú¤6=@ðÞ;°5 4pžâø ¼¿>*4 M†5!'Å}kªüJpKJ-NÜ´ã­L—ï…~‘ÈÍ¿ÄvÂÄÐíŒ\–1G‡‚£=x?þóÿjÎ ö8,¬×èì4)Ò8‰Ë†rŒÞ±s5ŸÅhŠ5ŸÇ˜ßÌI®òskMf ¼eh¨‚‡™„¹™H‹s3ý¶âæ¥ýä2:ÇÕf¬1ÕɸR¿õ»þ닚í"*ðü¸äªÍñœ^CûÃáYTÄco~óéýã’TüQ(³q@gØÇn„tK!i¼ˆÓJ+ªÿ¨3,1DãÅ2Ê™:u:SWƒD>it_J‡êd¸Î/ÖJ=Ž`÷Œ$t5Ïg¸P╜ˆ Ê 1ÝG5+¯•?&šVWŽ7öÞä1 )íýˆ ’ˆ†çœ»Êì‚Äél6ßZÝl“â`]ÁÃmÒO‹NÊÎy‰Y‡“ªÉõØYÞçϳÐ Ú«8èç‡%<ù.8ùæ­á-É’2ÑO>AÑ…"¡»tp,Ñ.KÍ·‰˜o憆[1Þ ‹š¢”Ö9Mrháƒóˆã‚–ðºXÖ_¿…öðºÙ$¨gU;‹&0qD@šKÜá&ägj7Þ]”ivÁø„SwWx‘ºä`öZ0¦½Z›¡‰*IBT,Æ‹ZÙWuçyp¹ ­T$Χ.Q )ã׋@ ËV†Ô¸)`£>w6j ¯S²½XÑc18çN¨›óšçÐJáͻքq(ÿ\ÎGÑ™ ~—;Í8þm¥³ŽˆRw%Ù|_Æ7htÁÄ7Þc°4¥…ƒ¯|S¦"Hjc6êÀ»7½²?®°s^-ÜãÔNŸ«]Þí$Ì0¥aWh¼&:ûž-˸ÄÀ\ØüüD¤ÇùΚSké,›zSK ăúìCáLý“ª¸»4Â*’8jV -­&éºB:júFé]é9*5™ÐÍ‘ô…ª }ýùYNzôC|úÀ^·«¾&v Ãê¸,}pç“e:ð佯7-qÌRep*h˸?÷ùß–ÿŒRðòqÛ1@§ÈÖÕ½û¿å‡sû¯;y ù«Oº]Î |ÁLÇü4ôvó¤O+Že]ä@”¤7†ÜÙRºÄhêXÓâním¼ØzÖ¦ÛÁílýdèòœ£ mÀÙÆŠióÞR€—Õ®šCÄJNgþE¨Ã5™~5Iç"]ÉwanÌpÒ§‚t‘Û^ &ß¾7sŽs=‘“Ø©“Søâyßòÿð Ê/ÖNáx¦çyK •™)Wdg{€Ùœ»;ÐΫ“CuT¤v8¼|ËÞUl7ûÝÞÖT0•AÜíž7BºSî·`*û˴ücv3£ïqÍ áåFs§â«OÚ,äÎÒ“[ºÊ¦¨*U M#.±ÅKtÒmàõañnÝ ÄTÿknüŸG«õ9ÿ'ÏÜÿÃÜÿƒWç¹ÿ‡¹ÿ‡¹ÿ‡¹ÿ‡¹ÿ‡¹ÿ+wéÔÜÿÃÜÿÃÜÿÃÜÿÃÜÿÃÙÿƒ " €$sGâljÿ¾ÿù,¾]€©ößk®ý÷úêÊÜÿÃ<N±`Øë0æ ï©„7aÕMXsÖEB‹¿¿H.·ûË%HÕ$JwN³üÄND•+éYöö]1%V"D $ù6瀬ôŸ’Qq sÖLüïái^ s•ö{wóûä¿“îÝÆ_^[óü¿Ôçþïæ!ù/{© |f Ý^"õÕxÑÛƒÛoLÜ ‘¤µT dÉb™–03„C Zqåæ‘Ã§H%Ô3®"‡‡‹!M T}~Â(œ8¦BàÞšHöåbhÌ£¢æŠBÐHÄóϵË|]U¨+èåj:T~@åRg%ž\œ¥UgŽ5–o~–ºæg! ïkF-Ÿ±ÜÔ·;Q(à“‰Ù;èyW*àC÷õPô£"«8λ¡Hɪݹ}óžqQ~eS.¥lÞŠcºSž­'ÿ–ôäk%±–E å@egv(í§¶Ö~zKzO~xæ?jæy@å*ßb8åP0e>ÝÄÈLQ­rÓ´3æ¸ãX[I :&² k&øÔÈá€È%˜¨ŸÙ<²x>cc$æ¿ÀÕ…-ÿ{7šï’[ÿOõÿø°îÉÿWÖçòÿ;y*ýÿüM‡ÅÂpôš ¦shÈny€.±úR"[>vÑD™ÓŠèÜç óEYÂc1KOJîa,¤Ä¦C=eºÎ,UrA•f"5þø.›wùjúqÉ×äÓÇsúý>-mú/\;?¸Ý  iôÿQ þãòêœþßÅCôC¸ôæ'_ºþIºÉÙx8Bàù‘Ïv° èg9è\ÓŒö¤¥/  ·á aùR¹8Í:§l˜÷¯Ð\XØÙ€šÝó©_dŘw*†$h•fÉEvÜ/ÛVtTóÍoîîl¶^>5­xM7ã‘n(U<ïN:œÕV­&ÇxgDpÒô8èU¼äˆ[á¢üZ\³eQõ#QYa¹\Òìk_ªý§OxGü“,±}ІBÕ>iõ‘0b´¶Çç"ŽiP ñ(§áØJßI ÑSå’ßЛ°­)Æ?Å9ª‹  oë1‡©Ù¨80FËŽ[%"%1á‹£Ìj ¸li›¡,öLšñ}‰¸HLÜô+_I¿‚PÅçX}çhIÎÒö™Ù㢺¢2ÏÅî3»dÇÿ§TиUÀÓôÖ¹÷ÿë«sÿŸwóˆûï“Ðä’u’Q7Ë“>¬T5?Z~±­¤CÒ)„¸V+ŒKã™IäŸîl¶vZ[í­Íø‘Áñ¡Ê¯ ¢Án„•ƒª$aEü_ùøO%([ÿw§ÿWç`Õ_ÿsýŸ;y¾Èõ/ü‰·<â ;ÎèÀšágØáDˆ²A ,ã~ôá_>l}¨á×íÑp€•;ߣÑÓaÌ~žuFÃ?׿D½Â°^“愞ʂ_h&G×UgB®K2UªMKÜ0™œ9®rÿ;Ùe –}Âñ)ßå\‡âR “äulP^)Áè˜Ä3âõÙˆ“ÄhAØÂÏ;ùxi<<  ÙÏ nÒÛŸþ7_àü™í PßSð€n§Y—„Ñ}MÅ!|LY>#Ò´{eȪÆCtâA‹„£.Ý¿:»ãÿ£Ÿ´|[Â[J2+s(Âlá uÖƒ  9øßrÉ©Yϼ&v¦ë1tN[gjC&ášXÕÐÑöá½/Abñ¼»R ­Vg±Úª¦Âáð÷2éeâf.p'šÞÈ@6“R7Åä+VN"'þͤć2ŠñÈ!´aåÂkŸ;"CìÂ^qˆc„ëØÒ çƒ‰FŽgÉR-¹«yDKM•„8Üüt{Ž =Ø­ó4F±îé„ðáÿ§*èåÈUxžÈ„€N«*óƒÌq¨2PŽh”ž³C(”mNXUF̶ßíòn7fF¬!î¹Íå³p³[ôQ¬(5L[Nçx·ILìÜuxK¥ò@iÍ©Hd”ëW²7ç…³|DÏÕŠÌVΠ±Üª/ìÝÕ÷+¤ß°Œ.ªŠ I¤•Þz%z®fÿc¢ çàaõºZ„¯ï—c£xþ˜–ÞÅcfà³+vÑhª¹è¢r<0›#®ª“·@5_Î)n¨\5Á1ÇEqƒAùn8ê2wÕxXÖíSG] }uw›ý]bÌîtÜ?À¥ Ÿ 1;N:ïÆ#þö(G›u§íÿ¾]ãtBÓJí Cw2~Eâ®­©N@⸭±žÙûÍè<àˆŒÉ~aš”„"ÝÆnh$0öäIF^æKv[éǵæ{âÐì€Ð{Cmn»ö¤Ú 6¡BµÛàÆ¤ïjšF@\I½<ä×VV=ŸÓèÍcð/<o¾iÓ¸Á¬4–ÝÎÄ3¥Å¤?¦6~ÒãkšŸøZOû8†ggCØÁXÁt[ÖuúE½ø2ÐßaÌpiÖ\Z [Æ&lzÖ²¯'ŸxÝg‰”¶›×S‘{tù­8»`¢?™ß¡&ë;t#ÂÛÄô¢4þzPs—¸Ô­³Ô\£¯ñ×ï<&¼7—c5›UŠêoKŒü{‹(æÏg|lùßÅ‚ŒŠ»”ÿ=¬¯y÷¿ëkkóûß;y¤þOZHY›œÀœ ‘#e~·´àz<‘?!žœ O‚üpÜN )­KǧÃéîŸé¾ò'þïÁÖá‘#ÈïÛÇ)§Úi[èçê“|„qð-o÷•nîÛåJ?öŽ”M‚~4iœuÞúâHœ”.^bF8™ \ô_>æ8ùŸS= tNõæTÍ©^Õse>_ áS4nZ¬¬œ@–?¶¢eM ”5§qs7§q爘ÿ $΢ny+æ$nNâØœÄÍI\àFëEãf=™¢n ±{éc+¼é”¨¦sÇæ4έܜÆý±hœsþ''quvoNâæ$NÎIœÝ†? ‰ èëü9Éܬ‡SGÀg¥Ï«ÃÁÏÉÜœÌ)˜9™û‚Èœ¯8§rÄô9ÎóͩܜÊÉgNå¾l*ÒFþkÓ¹kœQQŸMäì³ðœÎ@s:'aætŸ»âæædî“ÈœGá<‘ßœÌ@s2'aædŸ;eçôd˜ºRBgÓª?g:ôò(Ýu¹sB7't6ܜЙ°7æçætNÀÝ€Îù$.ÈÑÍé›Ó¹9û:Ùô9™û½UHà*¤7¾Åc‡Êñ$—€Î)ÝœÒ ¸9¥›ÊÑÍ Ý—Gè<‡·¾sB§`æ„nNè®ÏÒa›ætî÷¦s×8¦†y?š›AœÓ¹93þÕèœë?kNæþdÎ!p>ß7'ss2g ü«‘9Ç[P¹E+ÊõïIëÀSû¥àVž/šîç.§¸Ÿór–ý~^{òóÒdtòútÒËkkÛÙ}ÚéewTVüü6= æ7oH|6 "Ðç@v‹î†³ êkgžÓÝ9Ý5þÕè®í±ôK%»Áe´S0XØ3_‹ìVb(#Áñ-ÅPEˆ]\Š¤Šœú„´MU÷èy%–2Òìåj$%Ú&Í¥(ædzN¦ „ 2=küô?úcÇÁ?·üýÿ›ÿ}ý¡ÿeí!ÿ<ÿrOtŸ©AñZ6÷þ}¸óü‡‹:5¶ÂG‹=Mû}¶›1Ût L+íœæÃþð„“:yƒ¤y:Ê:¬›ø¶À‰9Sï&ãD;?—Á£w h/Ä&ƒ`´9„~ü¿ÿ¿…ýd8Ê(½_õÓÅEBÏë@óC†'À˜«YqÙÓQ/é¤:ÉÙŽ;c„›I/;鄟&쫵 ¨DŸ=AÉ4ØÑä˜Ú%VȤÎ0ç™^ÖK²>”çfߎ·1$ŸÎžRGpºÁÐ@ÖñÕY*¶%¡ÇûO¥.æø§Êï÷!M§@rÖw2Eü0ÚðêO#Ö‚»û­-"^D ˜Á÷žy zCÌ)c;òô[äß ÞkY^@xáüäoÈì¤ éѶeÅÉtYù“Ñ’D—˜pùö†êk%Á6y†êx l†¬sÙñ†’j—ínXãG…˜1*ܼ&;vݼ&‡£óVæ0˜²ö J6¹Ë×9¬N앬ë ËTë¡ á,R‚°©öø;Ü·F"‡*j6ÉeÅF÷™9\¾\çàË6þŠWîQ«j.§Ê˜Ñ.óîg$—Kj¾×ìÒVÜšæ š-uyó™2¹§+SYŸº'Š™2¹Ç‚F€òìÇÃaßÍf/û `÷¨`W,·f’sXðh?÷œsà 9œCÄLýä'*29ÔCdz‹Ì=t40ŒšI8k!âáž?”Ì$¡*›>‰0&âËšÛ;§½ Öýب0¯/Q]Î ´Ùƒ'oYo4ˆ½ŽZø}F¨†¿)#pߥÜ÷8gFr?»¸ì³²fUÀm3„’¦žÚh=ŸØr…¨¬ù^SCýlâ]?ƒç¿Û þùÿM?ÿ­­-ûç¿yüÏ;y¢?ÂÑͶ%ƒlÙ±µJOqá³[øHVqâª8OUš*ŽEê.À¦ím~àÈ"uÊŸ’ŒcPð˜ôå’æ‡$õÌIj”g?ûüþ'œ™Ï43Ÿbæç”ù9…Ýôœr—§¹eyœt¤.­£,~k\]û (`—·a©—õùÆ÷‘Q;~·1Û;¾Õðü‘yóƲZ­¬äE§èøìF…§ºpØ5’~1dgŒ§VV¦U;³´g Ø‹ª¼~à ýÆ.ïƒøE)èˆ~ª5iQ3ŽòÉz¼úMÞŒñiš3^«´Ïùˆ´Ñe¤…ÌÁ¹¶`çˆâ܆AØ»@ã*;ÿ¦íKgh 1F‹Ÿ§µ+ÀÀùïÁq§s«w€SÎËë++Îùo}my~þ»“‡Î-8‡ †ÝI?eáàl2æKá8ë óœƒ8Ìyû‹%FRXÛ<Õ\ Gï8¯Íw”~·‚3+­+8öýßÿDÚ]ÂS! ©¼¢k?ÝÙÜßÛÛÚlm=koî¿8ØßÛÚkUWw ÙÿãìA¨¦ˆ“‘ÀƨPÛ€hT„¾÷ÕWˆ?ý¾¿%5úCÿÉø½GôzOéú¿EÐ4ù_ôÞú_™ßÿßÉ#ä?­dô6Éù:íŸ Gü?þPÐ8O—yõo-dG^ótsSÅE/[ÒÓ¢¤[Éqž¯ÑÁ;§ÉqÖhc©˜GTßxTcß³eäL0ÙðÈBÄóD¿ÕãQª ñOª:^=o(äÂJ¡%$ˆf Ô³øÜjS¨®mìØÉY7§²yçq^s¹C– Šï.<ŒÊ Ë£wв°óEÄ=‰Ù½R¬z†÷ü;Þ×ç‚uJçȱG"¯£dγ"Ï6+äóAdRló…<”O·W»í ÕRÑ©ÁÆŠ6:ÁÙUR”?ÙÎy«hc¤Gä¢V{,šŸVÍCó¡àx ÕÁÜÁ:T ØâFlQ°¿â-~Ú˜-ÞlÐüÑ °~çñy£!€¾­šX‚e12”Ùy å#rÆž4ù Èã«IgÜ‘ågéÐXÉcu8<ƒ)¸‰S_Â=ù@/dã6Ëf™Ä~­™fvÎ&CËKÎä ÉŠ¢N‹|®cÁ;Qçá…?q _¬‰c~£±ISc³Z8£ŸMGPsã†@3~ï†S­¼b²]°ïŸ°s*瀚´¶ôÏð*4&9?)µ‚,çÙ8EÒx–¤@i’g¿Lè~/’…n1!:NùÁŽÿ…¬X ü†ùQ)¡Jœt´³÷|w«Íš‡ÿn¿x¹ÛÚ9€Ÿ¯vZíílýdJ”Ì»zÒz¶S_ˆÎÙwHÞ™AJìt´õb‹Ÿ}ßScñæXC³¡ryTÉSëñ¡{ êJ…ÏÒ Õ§ðÛí `b°ƒÞCï4±‹`—…Åéeí£ïnCò>#©~ÑfJ[âù’RÊ0OÝ'阮Æ"Ø?hÌØ>L`¼÷踨­Íàèö-«›€RX°M¶“—É%Öœs޶(Á* —å]ì5¬5ø„7B[WA¡Ãž3;^ãà½îßÌÏ^±<ÝaŽŽBíVPîhágsëÅb€Ò7Ûý¹…ë3ç@ƒäŒØ%¸ ¢5þJãYƒ;=Óˆ‹åv×+-ã$ñþÓ²Âc¹5¼ŠÊa 8Ϲ¡DÁdi<å,²"&c•»?àáåag˜w’q¤š›‹»K£ ÕRë‰Ô…ÙRsËF…l”÷Í ‹BÅHhÔÐÐu>yXÞÉ‹KIjï®äfö•,Þ¸ÕÌr3´Ršz†#êZmƒhw­¾³ÏYÉð‰Á1¬ `Ý~÷à(䲺„æ¡ÈGí|ÉÙaÃmÏtZ!8 Ä2t‚üÈ«ÿ†˜Q ñ…º’d´Ò;äÛZ€|#è ÛàºÈ6„.² @Ÿlʬ–j¥-³šC•ÆÌ˜òÉ–Ì2¥ÒŒY¥TÚ0Ë”JfI’*-˜%%ª4a–)•öË2¥ÒxY¥TZ.‹”J³eL¹{›e3¥Ò`ÙL‘p­óî5¼û?P:½Óûÿ•u×þw}}m~ÿ'ÿv¤ 6°ëIÎÎù'Be[Û•¢©èL7÷;/øÑâß%7Z;û{†­í¹Â*u}á2þ]æÒSÎ_Dçwxìõœ}SÖÿjýÑCwý¯,×çëÿ.Cÿ'#áŠ^Ë@ Øqv–ŒÆÙ8eÂn¢rù?Ý9Ø8lí´¶Ú®•}–wú“® ®±Á ÖË^ÌA¾Ù=Ý1l %†¥ÖÓ,nËê uDy‹T0‡»A°n1–`¹¡ÙîZXتL,|³Ø.Ìd·€ÅWÚ,@,~@aŽè–ýû™Só&J>Ͱ„í x3ÀÓ¦Û#@5Ä¢ÔpJŸc1f±T˜ÅHáºö ×5M¸®UÂu ®a‹ –[¥À‰ÕV ''–WãAhFyPùõ,•©æ íhÓ‰*ÃjÅMŒ f²$˜3t_Äãði¿?Hò|8»·w8…ÿ[yèñë|ÎÿÝÁãë«ã±ƒOiJ°m>%íPáǧNFЧÃÑ8åtã,Ÿ*åP›WD­qžYà´ÑÞdÀ‰ÆÆÓ­Ý=Î9î¿ÿûÎ |ÿÔž{ ¾'³rs­ûåz3Å^"cfÊÓ/º´(é  ¯oQQß)HîðpT¾þoO pÊú¯¯­ºþÖ.Ïùÿ;yîbýÛæ`›_e…² óhBXž þ—-|Ä7„ø¯‡ u˜’Ô·)Þº¥pç¢(þ–Ž hÒ•ûì™E±(Q¹\µ‰šDI|\“U[´6tiÚ\ÆW¨gsY@v¬òÕ‹6Ì üóSó÷±fædaœ'[áQ’>($ gÄžªb¨Ž¯ßˆKu:ò£´€_¨6yC°‰›¿Aå#Yh¸ %v†C_Žk÷Œ–¥5‚ªBéÕG$‹êð_VMð«ª}Å4¨Â_J2´ÿíwzÿÿ°îÝÿ­­®Ìéÿ]¦‰5·•ýë>.ÿ7œœÝuü§åõu÷ü·öhîÿénâÿ6‡ƒÁdŒ7• ç@¡|q—ú¬Ûz¡çÉ„¯igÄä¡é[ \ J£HGpü¿âÁTˆß ç\°‰O2éû >ÐÀ’Íf)™Ó†›©”z­ ,'Ë{²n_(µ×?R¾/*oé8MÿgmÝõÿöp}e}¾þïâ1õ¿AðŸ“äþÔD&m)]b ‰p€1° h†¤)8U`´·ÿl«MŠâ¶yˆéȾ­ŠgJDä¤WÉa<,Ç×_yð‹á¹<™’e±o‘ÙPÜ÷Qš„H^61E¶»€ûŽû€àÝfø±2ú"²Šçú­Yü¤~qÝìñïzÀŸæNHÀð.[Óž ‰’â´•“X™“ƒ’yØ„Sœ }Jñr‰cèÕØK§y{ŒØåùÏAti}wÀàhöÃÒàÖŽE?&„±ÙÉÇñðŒ5Ñ)¶öHpŸ­ÄÏ—dä ë¸÷s€‹,Øù­ÍARñ*§12úæyù;oïE–ë£Ä{Àåëé€]êÃ;~‰§E?,õ‡Ãw“3øª2|åˆ /œþ¶f|ÌŒ_WÎEÕ˜iÓt}žõ® eÖü‹º"? KUî?ó…½ÿ¿žæÅímü♲ÿ¯­®yòß•õ¹ýç<Ñ}f€ý7M€ G°àÞù,ÉFE@Û—=»¤Ì)^!LÆèSX X”w} àÝ]¾ ìýîÚ¿+JûwÅ•Zk½`ëÃ3üð,{ûBÅBÛk6ÀÓmp4¤˜ç;„„Ü*aÅ"ØÛ°¼š»ô"î•÷¾½Ö^†]ÇßÑ\Ö…Ta6õN^ø´ ÕfSzR" ]Qâн¸T±Ù3§ºñ[Ïžo•ábê~¿å|ƒ³ñ•)‡MFÇàm&rE~‘hüDzXi /9¤à€ÕHkåOÀ^ªÖzšäݾÌ8R§"À9•W„6~U‘ܨ¶8¿^5(àÈ%£ ‡3¥áT]cb"µlùjì~¾hM$ðÎû|‡æO´Ð WÂa!6ý£œÄõªEcÓ74pH=ç K8õ<~¾èåž}ˤ^´ÿíüöÀý&Ü6ì¹émJŽÆ¹àÀ¾Q™¼ÑQŸƒ¥2Dʹ ÁÚjê0#h©-FÄCúê s^àYê*“ˆ™€¬[ä{XÍÓxiié# ¥*ƒ†’^,.ÆESš;4E}?–´ÃhˆUYö­­ŸÆ~ÐQ?´gŒb÷»SI… ‚[9«©º1ИæÙG¢˜ŸØ^ðþ˜8ýawˆ| F§mmBp°´ÛšoÁ Fœxš— ÐÉâî<Ö~kô/ïl^…2•}•û5ž30ðµ÷SãH»µ$w@ŒÐ¯˜¡=OCÕ£ÑàÿH5yö…ŠÝ¾˜Çæÿ»‚'¹ÝÀ4ù_}eÍÿ2÷ÿp'ÏTû?ɦ– ;¹0Œ¯e h2‡ZîjÛ¿ë1õ?2ÜœAÄ4Ê qW?NÒI…xè™Íÿ¦™ø½gr¿3ùšç±ØÇb¾#Ocˆ§ª”ÛùUYùýÈ¿þˆ"'R´•®‘!+/ëö<¶îåkœ­_4yPas…R¥ ™ ÙÁÁÈÏø¹møvîñÝö¥2I³,ä|ë4Ë"ç‹9z¡öao0žý[ ñ馠T¤?£ñ#ìX&:ǬïZaì…þ]œf|Qñ¹–²îÐ(œbÿ:®Í#À^1^ðâÔÕ¬É ôÇ%ÜB­ùîî§7°F“0óíööØûÿ ¹|Ðë/nW`šýû8ûÿj}¾ÿßÉ#ý>Ÿø$`0 Ä?‹×·¯ÚÛ»û?i={ïm„¯ÇyIm,©¡)›Øáµìz/¶i¹û±i­;¦)ÙÆ7˦6et[d+š¹‡Ëÿ)(  DVÅ}…ÁõŸz>šEª+ÓA–·;CÎ|ýìcèQò5L¿÷~YFÿïîüW‡ þ¯Ìïîä©<ÿÁNñ¸†s¿ú÷"¹Üæ@¡C\à˜;ÐØµOW,|¤ƒteð ‡ýîq::Y,€Y…ª?8›§À4† š6 ,¶Zk3/xË1Lžj‡ÃwìøŠmG¼Kb¶›fE:*†9*fçüX'Ði«OAh=W.¬ˆ?ß)ÍDQœÃ^[S ”ÑÂMþØt)¢Ì y9€`Á=îaKùÁñ…¦• L˜Î%Ç`ýk Åq¥†'1ÉcŽwF•Ͳ…®VŠÂÂ#“ ×™ŒFi>vá Næ ‚ Ë[u*Äߨ uܱ™#+þ ID#šMï•þ›î3úÍ*3ãä?KúÙ¯i[L¾([‰öÕù¸MçcÏ~L!Õ8Ä“8m4è$l$Ö‚nu0ägy}Oƒ¬L0jΤ~n:eëÛƒ’íN¢ïú¼+8ZX4½EúýÆ:e×JP‚î"¨qÔ‹;qo1†£0F¯p cdåGxžuÇ0øÔìªËi:òÒIø ]ÜÈ䀨Z<%ñ´p¾ÍØY¸ Ìþb抺óþ𽡠¹· s… /,I‰uÜ×=sŸ½î¶{дç+9}=yw0¥†\—A–dV|>އìÜÄr˜ò­"7bµ'ú«e@ûCÄ?Ç¢ó "_1¼,Æ—°6«N»'/þ"€þÀò«žl/€ç±!Ý3¤`jv™Ë[ÉR †Å±ÝÓX[€ú JÆÁ™Ö¼pDeCS« Æð­dÄv³Þ˜Ëót4N/އ‘~}þªRgßBÛI¨ôúâ û³ì¢Æþ—·k‹wÍǪˆJF­Ï‹ÎäUÆFDñ_„Œö,!1¤%®”¶“2yDOn _søšSçÀø?*à%Nó‹âñïµ€È|áϘ á’øóZ\—6ËVH"_ÖxŽÈ[3Íè{Ý…—ôÕVŒo|:šp"1ÈŠ"ÝDÚTøj“uÅ ˜Ïcç$g}Ýiá¼xÿñšvN“ÑIÚ]*aá óLˆšØÑÇ Iš+½5[sˆwY ëClÓî|Á SNÓ™12ä§'ñ¾À¡œe#¥ö Z…·ÝûA íÔœ¢2ܤž ²íªö9‡(aÀpQL{±ª1Ù_aïyísñ«â.AC¥c7«’Â- ñ–nQÖS”„ùðSÃHÞ])¤´ß÷*  Êb &ýØÔФïŸÀŸEk¶ê7×°¤†íñ°Í7Ã|Ù$, ±¥½—9Õtª‚‘¡0*^¡fD¼[U1†"øÓDŸ_vàŽE£ì•‰7ò!VDFuœ÷”WdÅ« «¬ ˆEï7ªÑ”.‰¬j3àul§Z ÿ¦B®køhq}±0)Lõfê a0)ìxºs’²×£Óá¤ßeg£áqrÜ¿bNˆÎ7ù©e²®hµb2½ÿ6¦9acmÕšZÈuv•Xt”&S×ßÉ}úœ^“ó6Y¯Çαÿƒ z\æÇ=šâÔ„YKðU PØÀèBŠêJŽ´Yb…à">?ìâØfµD6ÔqѪƼ+. ^|¸b2q>ëfG¢·mçT@i¶iZUâq`«5^.£Pû>éÃàjh ÏŠáh¼4¦¿ žÉP«ó)»ŒfF>f63SE•ø”æ¤fÆù<ÄögôLÓ{ 9æ½è Û ®øh$ŠþìKL ùD±÷¢s¦Ÿ3=0Ïõ §JÁ’âr™g *-(Ÿq )‚ùx_§àCå¼ÑðqÉ«8OÉvÙÑ•éù@P‚ üIãž`÷W _»H|§¥ ƒÅ¹]aÓ¢)Èu!.i—]}MºT&Ô.vj·dÊl‘™õ&$G‰ˆØÔÛ**În1¡d¨/i¸8TuÑtã‚pð9oç6 MÜïrV ºœºÍI ÂçÞyW ‹0¢¸3ñý˜âø˜‘ɳ—ŒôiÁGôñ%˜TýŠØ˜kÁPé"|Z å¢ã$°[é"ï„Å$öÅ—wø9܆H´^•¬–gÝ¡°,=Û|Úqô³œGó_ZŒë·lý;]ÿù‘kÿ»!æç¿;x6_, ’w)[XZú[gð·çd°Û,<6|Zý}Z@ƒ:äKˆ^;OÇ&Uêõ†Ã…8‚ Œkà’‹DÄE-GYÍ#Qº*Yé˜Ð7Ã×PÝ©Ï8G°“Wj_ÉGé,€ëµY34›ü%©pµpå(À=C%4g’‘b—5,öLŠö:ZŽŠ…šuàŒêñÂyÝM\á‰+nâ*O\u×xâš›¸/ŒÌ¢ß*Hæ‡nëqý¡ƒm9^‰ë«^µW`ÀÝj×ã5p5®¯x€kqÝ…\å(ÿî5o5~T‹™¸¯¸e¯ñÄ5«Íìî¸Z Ú©Å=Å ñ:Žàzo<<¢pÅû™-ÀÐ/ðëË[ü¨š ?[_z?E.€\Ò…èü¼ð¿9 ¨ ÿ,jj¨aÅ€0kc^¥+`-‹%WÍåxÜ\å¹ )¯´‹&ÉB›8{!²ïŸ°•USÛèE2æ'äŠ3Ìýþyžÿç¬x@\ß-™Lÿ¾öÈóÿ5÷ÿ|7Ðÿää¥"ȘïÃ)Îîý¨½ùïÍÝMÕ£P½$úCS@ÃÕ{V´Å—*^†C¨ß»›þ´Ï”õ+'iö?«þýÏúúÜÿçN@X…K`O¾O!‘_è|³Á#^Iß§w橈Š:éXo¹ÅæX…25ÛùE `É*JÚèø[ªPA­ØÛÇ*§ôdªo"W*𘺔}«˜,Í'h4«„0óM¤äñå?+w-ÿ©?|èú]{¸:ÿv'O…ü‡³oG)x=IÙÊÚßAÙzãtÈ~žuFÃÞ˜½¤ÀР àHŠø‘µw%*šM®RB"”%$@ ÉOÖÝ´‡ñÂC7íQ¼ðÈMû.^øÎMû{¼ðwOî³Ì+½|) Dw€&?Œëž¨åQ í;/m%w%þ{ WÒM\ d^ ¼(x-PÈZ¨u,Äì’Ÿ ÄüSòœö'ÈsP*S!‚á›X'ukÈ›×T.€%Y>ùÕ«Ø …Ðò‚Ðe½Dæß?«Ìŧÿ«w/ÿ_qãÿ®=\y8§ÿwñÌ.ÿÏòÍÉø £é¿³¬|‹5Ùï+îK‰¸}ü‰2ñÒ-†m[`}–ZÇ®ÓB½3žÌ39§F9—ÄKÉ}Î,·2_ú•OÉΡ¢š4ên](l¸¯t&cJ§>ZB­gÞiJ¸où´$ùÕb|SJ”2—êÿeÿ_»ëýumÙÿÍ÷ÿ¹üÿNžŠý_zv€ÝÿH¸°;vÑÑÁ?|3P׋ӔïHò•÷$ûµ?1 ±ã2À`\Mã%Ü=x‰õ+á3œoqܪw‹Ì…‹o•§¹œ p]Îb-^æìÆìLÄ=éŒÛ_/ócà:?ö=¢®s˜þ´:dåÍÍwÒ÷Ê3,˜þÜÜKoxë…[öV‰Ø®E©'/Œ¢†gHC»B7LAckË •³=±µS—] •!Œì¨Çx²@抔+™€ ÿ\fóÎa@9m¨ƒÛ‡Ê¿§`ó$Ï6Ï øBÙ¹’ß»NÚÕdÒÒú:9+˜Åj^`]Yš`†¾6#Ì;{ÊCÝý{ï¿¿÷ãóëwÍÿ­Õº÷¿k׿÷¿wòTðpÒGáÿúúCØ6wáo²…ýþı‰Ò°‡Ó´T?þðóÜ+”ò‡À…X¼ï¼´õø7—wC’—¶’"§®+À÷¹<^ÝcüÍåL×y)ïB¢d1‘¯Qü jþÛšëÃàõ*g#ƒüV÷¾=Š{]W½/ϱyW¼À²ÂËòëƒÃ \4‡õ0¬ú5>­ÆÈý†?aβOëÐH§NÄ=ÁHŸ½à È ;¾Ž°¨+¼}§ù–=á_Q„ÄùPd)ÈÚ“¼ˆ²ÑÀߊ[@qeAæ#è:ÏÅ ð´'¬N æí°÷KeŠ*%g²Â¢ŸÐcǪ˯!Î\1æ&_®Øòäq¥¡,J9ñŸ’Qq všÙš ÛýáUWfûsŠ^ $69Á 1á"HÙì]¬ÂšÍ{×~æ<÷—öØü?ðÂãÅxxv›‡€)üÿÃå57þûú£ú<þó<Âÿ»w–t“3ÎÞ/1¶Ñí²½ðá´ø~Fx  Æ/fÇ;Ѭ·üó»šYnæ¡Bª.qê !1j¤ÄïoT§¯)˜ßÌ™ð^îÌ®ËJö”\ä¹Sãjj–otÁ¼FÌ]@>5î5Væ»`%€Ù?xãa¹2ÖÍk9»í¯–ÎzOˆ8zÆ´‰ìIcùívàÅDvôâ–?ß³<¤f'qÒ‡IÏ JoDJ•0F’ É€vÖ5±Iún)áØ4 Ü\«€Fé`xžjdA ËÇCžô@b’T‡Ó¤ªâ'Éè89IÛ!ç:cìQ'ÉêVœf·ªa@©ZPäZDCÑhBaŠÙØú,H1Ô¦¦”÷D££7E9¿6æÀ”ò†bTè¢×0Hu#Žy@›MIR¨dŠdÏO™â ‰±$XS§˜CbÌ‚)&Œ1Y ¤8X®Œ~jš)&³;›FŠfQ3S|@cå˜)NÅu›[ÎüÉçü?9&/}wÿ§îÛ¯¯-Ïõ¿îäç1îÆéƒãŒR¸!ëˆP°xŒ*#Ñ©Çþ—OÉÔ=ô£e8D]åCwÒá4^Î;aÛ‰R‘D‡W'^9jzŽYMž3í_ Û¬Ue¸æy~Öüh„<ËÛ=Rv’סÔYÞê ¢òÐ4:0âØ‡ü/hHŠÓVrÜO—ïðo´º?_ÚŽ·‡#Ô6 u /—p^Æ ùy#ƒ“üä0¼´XÚÑàœàØg¡$Fë8z g'iÂÙ¦x¤SÌ' ¢àûÿþÙØF„ Å+Ñ®¾U<%⢡~–ë:äÞ±ež MRáD…X3åµ¾U?uç§&²ÎiÚyUƒ°Ø5tŸ/ɉáe&V&% ¢néì8å¢=ÔšÚž GŸòìVssš‰tOD¢UEóÞÚþB±6Ø÷ÌÊ ³j`B+“ó7+.¢ðÊP,jôÖwž©f–•`º—{ë` ù”þX'Ö¬V9ëHßÎ84Å+Y´Ëì6)—ƒ )ίßÄ}Œ`üÁ„IÑwc?è~Ö›œf¾nöÅlµ?ôí¨6†»xè,쉙ŶPç߃Îÿgê ÃÕŸ"R?Y¹óÉ3›´NÊ Åò²»5G™S»5¿I·æßÖƒ½šW÷j>¥WÁ¿wqx£>Õ"&Xú ëƒKgIf—ÖôUË*c¥Ù¥—•HÛ² °- Û°)kódD…°-¸5Ej™† Êlé+º‡y`t{Çú­rŒœÇUª4n—÷Tõ¬q –L~n^rÅ”Ðò»f¹¨*‡¯'O2î§é÷æN‰°œÐ‰p7UaI†Yé¸IÞZ›Ã#4K›í±¹A£¯ÑlOTjeä›qfo¤½ÐNêmOœ:§T@K§ôryç;œ¥¥U¦t›».dÓ~GÉï7"éy¥èW¦TŠ~eÊѯJ©”þš)•`+¥R Ìç@Ûð‰¬î/+ÅÂ3dú³‰‰ëй¤ø/$)þÊŒˆÛTÛ˜«M#%vÀ¬:êŽQÛ°ÏÐwôØò_ pð@¸ä³ùVÁÓü<|èÊÕësÿOwòü—½Ä—Îÿ`à…p·TºûòàÙFk«-þímï¾?AîFS©Ò¿çâI¹.•§ìL5$ƒ@xá¨Øò®PÕ©Šú™²S$èêT~KÌ•³'Ü”§2w•l•!™«ä¬l1\%s刼*ù+WWÉb}£(Ðb«¾1ó>¿MfJj˜UòRßøñY)©†VÉM ´[a¨¾ w³ÏS};­ú“žWrUß`ÒóJ¦ê•äÂ9SZëU²V毒»ú&4E|ëÊù<–­EWÉfY |•œ–ãÀ²’ÙúÆJz®£Ûå‡ìý"“¤ÝE:È€eÜí8Ÿæÿ{mÝõÿøðQ}~ÿ{'¸ÿUÛ:^ïÒ4`0 NÆ6¼D ã=>á*âßð âÛ‚#ߺµߪ®ˆ!áÖ³öÑÖ‹öáÎÞsÍC(“ø¡ \”D)èŽ×JÀ"…Š8ƒaÜŸ€“¡aùSŸ@Äú?ÏŠ D‡ÆÁûÛ-—küÑúzéú_6üÿ¬×—Áþ{ Øú-×#øüÅ×püq7ØM®8‡qÀiç¿zÝôÿ´ç¿õåúœþßÅCôÿ°µOøÅp O}–äùpŒÓ" ØuOÓÆVná'­ :çiÉX]Mïn<ÝÚ…-‡ìð!ñÛÜßÝ?t÷öŸmµƒ_¶ž=/ùÒÚzÕ Ù8<Üÿ)üé鯿ÿT}Þ?|¶uXõmwëˆ||`G?lli(‘º±û|ÿp§õËPK6Z­­Ã=÷Ó³CЙ‚€ºY>NG9° ¾ßæý«¯ÍÀG­ï‚§€ cÔøù2:Ú±IéôB-ÔjV¸a16¨Yef?Á®Î#X£qd/ÆWýTë¼gtpÍ©<1ñkÆ—NŽ¡V)4M̆ ÷$s¬ª(fo“E&&VöÑ=0i>y—Šùü%À(+F˜(R5Ûáëf8:;Í:Ï¥º×Ü*ck°¨êϨ$K­-€ßö‡ ïôšfÚ?u-¼¡ËæU«i^`½ÆEåø8®¹®ÄY†—Ô”³B%Ûy ûúÍG:’kôgfþôOùþ“8ÝÆ pjü§eoÿ_[_™ïÿwñÐþÿ\Ùò¦#¦ŽgÓ|µ.ëÖ¡ù‰"ªh­]ÁI ’,ƒÕÏ鯗ðL_ÿŸŸÿ¸¼ê­ÿGóûŸ;yDü'Pö »ÎË¡UmaøóiàF´@ú{®'LôL…z¶st°»ñïšJФ"¤ø¾+ïhˆ^”]àXÉÛY?=º‚ÐÛûGK⇼ý24œíÁM“ñ‰žÍa> ûK'éXðF dA±fݬ8ã´Š¥—i‡EòTÈ !Pzêñ’rÂ+˜%’S~AÍ?ñþ3{¶TLz½ì2ªÝûÊÐKç@’bá5[øYÜ'õ^hÀ¯Ju¡gÀ—óD5 `Ñ+Œò*órh+úh$î.ú ¤ôó]“,ü|Mxµ!Q ÔzÁŠ(%{ÝJ/Ç;ûKàäfŸw®¬¸ ý.´j à:e®ÉølZlý4¶¢›ÝúlI’´ñôÕœ Ä(á”õ)ÃÅÞ``0 N§MÀ·àʼo‚ÒîTÎ4L$'ÆË¼“LNNÇF”4Žláçô2Ç©òî6—*Öì±PAƨÀ|UŒÓ9u#¾fFÃNZKâ뽯¾ú ŒùåO0/R˜ùˆU(í;TU~ìzW]ˆª±A¡ÕU¹Nu†Iù˜ýí8Ëÿ6¸0 5ö_üÀ«êÀ׋ֽ©ÑõØ×šb,, ŸlÐXe@…> ©p"Ë£Î’ŠˆŽé‘Ypí `‚û§wr{»ÿÔý}uyÅÝÿë«sùß;{G­Ã—›­ý½öÖ‹z —Ÿ;|ñðR—v$‰lÀ‰äÞW’ÊŠ“€ðyªŽ_%5@ì6 ÎkðÛ/Züó6JˆvrJçK#âõ¯U©–ˆ}«ŸåA¦c»Ÿp–šð@@-Xô#‚&¼Æ éØVwØ9{Ûûï ÑlÌ–––>:º¼'f.% jBÛ´l(úÚ@cÛHà¦>|´G ÀÔ!ÑQ'!¹Œ‹ð\>@󜆊½^ø¦Óéñg!f ßüýïêõáCHÇ×õµäïâÒþþwþzOóo &Ák§óð¡xýûßÅ+¤‰×n}íïkVç)o,+ òùx˜ä')ë°A–ó’K´s“?ðàÓ>Xàè€úä´ï/¨ÇkØÈÚˆ`¼¾RÝu»Á×掙åâ;k³'‘ö³@ñŸ&rH)<Û÷ð­,ÛŘªcf+AŽ`FípS2Æ;êâ°#ȇþ7 4R7âšÅì·úÒ2ýkÛ®àŒaF× 7Ía!'è ,‚·«¾¼¼´¬¿"}8EQtñªSãg‘:ª±¿‰Š)h«ž—½HƧKýáI}ÙÉdzéoƒ=:4©ÁÙ©žð1TÚ²~2;j‹ÉƒÂp7Rª('¦â?½Úi1 „Š(bÂŒ0íî’þò)û䂲ö*í÷‡&¥,˜@'£4ÍMLX° ‹„!n;&„€°Ÿ§}DHbæÃ4é›´ä¢f™¢½FøX–O=‰PÚjÄìEt›ûitÜ—Oñ(í±Þ(ýŵuŒà‘=øæÂÏvÕ Ñ*†S½È¤|NdCÚÉ}´I„mâÂßîó¢ÍûUDÂñûãÜ÷ÏtaÁÂæ=Ù5kÇ/NlÎ?ÝÝßüŸ÷ï²¼SßsJŸñwhN Í@ú½} Fë*ê$|)@fœÐâ$wLpÔ+†½–ù€ZO ?Óð‚°ï†(ˆ?»V{C>¬ûÌ:ÀóéîâÖXÚÜ:ïÓÝÿ W‹sÿ¢¡_SÝûJ4B?øJ”À¿ÔpÙr9áì§l|Ê)Cç`»€N/äÆó@øƒÝO“¢sŽ(þG·ï àíkÉ9 Åãç e>¨žšª)†iŒsT.Ö1?Öò™ ¯à¤ô•òX,>ËcΘ('¤RÏŽ™€¯­ª$® ý'`M "ï"¸'/ªDÕ æp ˜³EÑΚñ_r3ØÄ7\Møç#ã RMÞ<ÍÕ}ò<ÿu‡·¢÷!Ÿ©ò_Ëÿ œÿ.Ïý¿ÜÍcÈ;ÃÁ€¥8%ä|ËCpúÂç§ ÃþÝgñ+÷ýD9¯’[ Á)ª%^›ùA @ùþa|ež¥Lá_¹ƒ”³¤“ºàÙògá±¹[ƒóì\¸1ûÚ=¯YVßãä˜d$vÎ^’žGDU‰—9 ·=¡^úh"5Ll9|^x¼`1 ¿¶})~Ï–…ÿ}õjá1T:ú-/±H%sU&X×UȘW™o¥c ò5+N“³´y<¼äyºÃ ³/°ä1ÕóÍ‚fuxƒÙ—Àv@JA à‘±ÉУ‹®æ‡Š,}ôá(*„ßSŸ?lkŸÿFß4_•à!&¹#ðþ(€Û‚¼lóxs1¡#þ.P’å'Xñ¶Ýí²­¡þ)T&`j ç8&b õ¾ëÖÄ‚nëP_ð1°@~ÒkŒ3Uf­Doª±ÇßÔÆÔÖŒSí±ìЦmL¥îý@Á k‚‡pÑÅ4‡›sí±˜ô.†-Я“ÇšÄõåb¢ËD= Ø·Hz[Qp0О…nF¢) “S@-„íŒÏ=ã PP¶¦RHo„¹zdÛû‡/6ZmãJHh“1ód°ã\©ûÅi4,ÅeCà·D;àÄPÞã@‚P°Vá§Ào|Â÷U ×®zà nµ8¦¥uDÑrÃyöÉ䘟zRÐ& ý 諤É`iðŽ^žNz‘%X>’l¤›´,Tš@lÉ÷¥st^?‘NôÊÊöĉª]ê$S¶Ú}´Ä{hkãÅ{Î`cqY@ú#ŠJòDœƒlX^ ʨÌïJê­þcwèŠ#8m±o@ÑÄgœ‘7ÙmýýÇ ߥ6ˆu‚±jeøvºŒáÀûò’cà¿®èÇÏ ç¾š"MÖ ÷»¼<Šò¡Ûñ!;Ûƒ£JýÌ:ËOEÀ»]´\sà)O"½¹CQ¬>ÝFEÌÁ†=¿þßÀi@¸qzP÷Ž¢ä”ˆ~"‹ã %q§h4x€(s¶k¼µ”8=`àIŸe˜äôeàèèhk¿7}þÜOXþ§¹¢Û(cŠÿçå:ßóþýáê|ÿ¿‹ÇØÿ“Î;X%r@š( œf&aïB HE•åÇkŠA´7Ë&ùÌÓ ¼BÔQŸ5šìk09®?f » °Ô!¿îÛ×¾·'i,5ZUíGB†Er—Ü 9ä- "ùDµOŽ9‚‰[zÀ;æ¤ìÕ×£åÏÖë[mþe2egÔðH‹â°ÞJµ`åB—…01Ž‘-ð¢$>6Œ IÄqS©Éc‰H¦‹òj ¶ xÿéom¶ ¿"^ Ä…˜ºÒªßöþ^k{ãÅÎî¿) ÂëÄ…¸ç“ `Á,p²ø‹m!îdVe0q!îX   %¤Jt¡Ÿe#ÉTjhN8àB>ÌS{¤4Qœì¢ÇÖ°«þ­š7Fo-tø±?KG zh¦å¤Žã5ä'€~Õü¬1%Ô:¹Ûû/÷žv›î¾µšÒê¦l»ÉŠÙ°J"Ý”£U«íOkº×ŸïóNžf¡6-g{æÂÚ$ƒ6eÂY±WÖHŸAÞ+kã4P»‰³A·gÅߊàAV¨+=Mse˜ˆí\¦A1Öc¦\¦=ðYÍZv"y!>«•äß]›aŒ„•ÁÐ02g·ªìwáVu[§eðš9-oØT05–vëÀó-@áFÎ"ó¶ =–7ke–eîó¼`{+Tî‰Tål_·¬×oDç;‹,—³Þ•¸¾éI8ï†Èƒ»”{ì² 0ºl4.Q7*âÆ.ç^vÍô¥JtŸ¤y ® ’™7i¯9ƒbQgø¿]ñ :kLÓ/øK8ð;‰ý­®S}ÿdÝI4öV@W^²È’)Ö"Îyêÿâõ™³ÙÈîÀF±È$;±¦«¼“œ|á­Ëèžpÿ1§Ûä=fª9ž…óièßÔjŽÆ“{‰[qEöTvZh”èSë;t°¾¶=þÖŠî³îd0¸¢íô±:~tN‡ïxùæÜœõñ@Côïþ ÃݨØâSsû.Ï!;-lo¬5YŠ5ñõÆÚì‰x¤§×[5½jµÚ‚]cÁ Šãz¬–§™K¾|usœîµ;20z"Ÿ/6¿àÎYOd¼ÑH\Ô~Q¶;P½ê^'ü/10, î’@+0Ý™1€söaAâioâ@¦há5VZÎ; æ‹ê‹v…»ægš|MòÙ`e´GÖˆÌÀä‚ÚÁðH…¸µædB‡ßu.¨ß˜ÔüÏ_DXö'|‚ò?quy[eL¹ÿ[[{èÉÿÀ%Ø\þwoÿÿñ)¡D!—~æþ]Èýx}Â2¿Kñåš"¿;Õò9-žû|z‚dzó„f$·z÷Xj«A-ìzÁMáÓ^ñ,M‹ù¤öd•vÓ2Ÿ U™\–û}Fñ´¨œa%¡Ë$›!ÁY’ôO†#>+ &d{‰ÛRŠ3J1¼‡uL%3êœØæ–ðãdZ)Ã×Xìê3á1<“…ð72 ï¨íàIF£áÅ,ˆ\§g!dp;0;BOòâbCSQ9‚&S\h)6Ø,Ú‡zÖÚóQ©AzÚ§aEKR)ºš¦8%ËsÛª¦Nï”ö‹‰Á–…U÷ïÂÅi6Nʰyš¨Ñ5NÉ&ÑÀ¥´àlÌã$ñˆ³ÏÏþQ ‚ñ¨zŠÓkâœÇLêS¢ &P%ú¡Éã`Õu']28= ÈÊàµ=¤c'ÿÛkwÀ¬íO{ɤ?–‹É"¯e¾ P$Ð&+ª»J‹\¦”²hÄE2êºñbAP_Ž6U†Uá•,zA$ÃÁÄ Xt;¸D½ªqÙŸñœäÿ5ÉO-c ÿ___~èûšßÿßÉãóÿc0[9:MGŒOûÙ˜ RU`ªGXC]·úP ; Ê[©«&‚]ç£f¢&í T`´´”RðÌRÑÅA¤À?ð2ùqß98?ÛT‚q’}6W€ê wz%´ÓãœsÓ†*UM ¹ ›åÖ'º›¶GyÕªhNÆmM&Ø®öG·A-÷ÿgè¿bÓì?VºöŸÎõ¿ïæ1è†á´ûOŠ$ü³y5(½Š–,žzî1T±„ šT6ÐYìÂP ^ænGg}ÄúôÇ£4½íÀâ¹~ü‡Õåõ‡óøwñØãO`@êã«[º˜¢ÿ‹4_ÓÿÔÿ}´>§ÿwñD÷Y`Ð¥#“O“1£‰"isÁN“s¸+È‹¬ó~A¯ûÅ’ãöÅn‹£F,­«{–c¹'ÝüóáÖ–$êœçm]ñÔÖÒø îôQUŸïAñà„sƒÃQ—ÝǨÂ8ˆÜ‘a![1Æ =Çè­µû›Ì8ch]½Áqv2NН´ó ’¶F£áHq©Ów[¿°h|óF¢2 j ÀÉ´ZÁÒ€X6ÿð1bÅÞ&8d4ñµ® aÖsK±Ä.èžåÊLBëlÒ72+Ì{ºã"í÷Ñ~/íæiQÐVŽ¡ø[zy6â‰hE:T-žñUK Ç÷œèï1ºÛÅ.нè¹û!RXXª®'¬îPè›ÓÌÓDêé/ TOtiQképë9À·k¨&º‹÷05BtÂ8A”Õ ¬›žÁaEÀW1á½9É»ÀTð Ž!RUäƒ]äî34¿ìv²p”c&œïwQËÍý½£ViEK«ùꀡ¿7cHƒ°{ÔïØ‚¦Á{¾ WjãÙ3HëqºÎXç(WJr½|ú ¹_¼Ü=ú„ìÏvþuµã›#8Üzñix^~Z>%;¯þ§dçó¥…Ù¯;_ZŸ6a>%;ïðOÉÎ;¼õI¾±÷ìS&üþá§ä~õiÙ·~ü×§dßÛo=½þt9:Üø”Ùr¸û)¹w?)÷«he0|ºíS1]Eõìò£@y´ú‡ùâ˜u 0erŒª^rÉ‘¸Ax¬“àSAaRKÇò2¢¶D*µYI4˜ðS†£’ã·›ÿ©@@·ZüÝ 5ü˜‡¼ 9©<ù’œæÚæd0ûÐNº´Õb¢&9®ü]úWæ[ý¿q—¦à“ÀÄ”±Î¼ žØyEJëLÝ Ø[o@oË Î¿¸ùŠ'ÅPl™ÆSöá¿a8ì¾Õ•Yó§››S»šª±±»ËÞ£À®ðâ 1áZ¸§àU­Dl¸M|¯ˆ®M_ ª,÷wÓˆý-ÃÝ[ƒ¿(J®4D=ßC)ÍîÎ1–ÁlãÌÈáÙLM0¸|V#Ò$4Éq‰Cn[ÕбØóú§c8<Á–ίfʈ»fyFŽÌ*Úíçà'eñ@AMr]0UªJÁ*”d¥š5 6±–^¯Ò?*âéú÷úà 9`òL8뻋E‰¼‘ÙÙ†¾¾â͇-&‰þÔðþr77Ê…ð¾•JcœÐ_øîµŽ@{.#]âè•á 3˨GR·GvwÊ>j~ózX(•|JA´â6ç-rŸèê{onˆë2c´(A •)wjÐ-™Î%ªsI="M¦TçC¢AlåÔiÕyQwÈɫӦÖ÷¥Wß—3Õ×É'S¦ÖÕÉ'SªóI !kÌ[ÕƒÞòF½5Ó°·¼qŸ!ŸT²:r†|¨ä|k–Á“*@FEJu>¡¼£³‰„ê\¯¼l¯fÊ'•}t>™2eÈ…–Ï¥È%— ¸Pï1Ʀ 7©õ˜¹vgȵëæÚ%׫ˆóZ‹Š•¿KØÜÿ8àÿ©×*9ƒa7‘Éü±ÿ©”ã•Ê:6“d(ñ§DMDž“¿x%CÏA²92IñIþ.N÷Ékƒ)’yq6 ™S¨–â/äCJzI*çP†C"F×fJüÂÄ]¶b–ð·hL€OBÝœwª-âgIC6Ëvc¡¾üfjí}U”“\Rä?þñç/IA¥áY:ŠQ“ç‰ Ðñ19¼þ¬ˆòW2(/8²X˜ž`a®ÃÁl—³0¤—ƒ‹F³å*MŒY€£V¢g‘•Ô#bÐ ÔÂqrʤ)9AÇÉ)“¦äÝ'§Lš’Ônz1V ½05F+ƒL(Ë€Ê6V•R–E©°8m²Ò§4 )Àul 2•Þ,B=2Ød×H­"ÛÄÿ[´i¶‘^B°·}’II½ š‰š8zƒPAÑ»2¸íÒAJ蹄‰^Z÷‚D¡g…žO„üçzTas³Œ&¨/Þé¤uør+œgc÷(ü{RÅÉDe¢*ÎÁE?' /ÅT qs‘ÉÉM…eex5CίE÷65Çæ ¤ýaÞ5–•™ZÍ*m ОƒÁNŸ²(7Ýy'RDׇ¶`Ô*ç ’ßle€Ç!XUSÖ™ëòÐ?“~³ F=å”8¡>…v ¼Í:”““¿'§è¡ç ’¿FªÆe’€ü5òéôÂ@µ~Ñ¥êlÝÉ>bVKoc{Øï¢±áï}…ò‡~Â÷ãþmé~À3EÿãÑúòšsÿ·þðáÜÿç<†ÿ­aÑM‹Î(;NÉ!ØßŽrNe@J:JÁ ‘w„ ï‡ Æþκ„W+˜š ² ¨\8@ÙMŒW†±ûÉป<èg½qÚY¶”.ÅÜmœ&]P³{šY‡íóó9©7Qò-•a\þŸ/`¢5Ø{Þ oÛƒ'ä %ö ÈÁTºG|Ʊµ–ñ}‰’fÈõ’ã/É%Ð×E€D}„q¿¥Ã‰ÂäñœÏð¹a€¤t÷nƒp²s ½@Ó]`ÿ Ç/ò³¸/ÁÀ}û,S`sh@ýL㟧û¨ºð½\ÊÎðùX<ŸÇâ·Jpþ¶=<30YÝä·3` íoòÞÔ‹O2 TÛøgéZ4$ùe’ŽÀyÞgêÚ¬àØÍ`ô’þÓQ’óÍ«aÎ øß“Á™½Jw‡Ãw|C.ü}õL:Ñ]KŸ©»8ùá«¿¤`Õ¢;Œûêõ³´u£€mvƒŒ¸Îf€†}2:™ 8+ñ¹È0Ç0,JA“qß©ÉNp“ö‰²7oä¢ÊFû=VR„öÉ%0óø<ûÚÞdpŒ®uŸŹ&¨ ?OЮágèiµÛsæ-1þ³u¸[ýÞÿ÷ÅÆÞ¿ugeȱØ%öúÈY€\µ…癤¦R]>Ì‘|oˆªpøàgœäcÛç‚-Š» Qu„7>ü ïó"Ï6I~õ¹6,pS—§:ÅYÛ¼“$‹ðžõ²Ë´Ë‰PªÑÎÄ…/–NA½,O œõ‡O-œÑ7NenÕøb¸Ñ킳³ êQ¨àq<ä§”bÔ¡ðKÅØ@ôñ3qœë ‘|æ]ŽŸvÇ/†çéË3;raž /òÎ"äi×§L& gÓŽ²nºÅϨ|úV”õ4=L¼¼®»=‚Dê-€*—ÿÜUü—ÕÕ•G<ùOšËîà!ùù‘¤@’KüJY¡Ë)">rýéh‘·v‘Í$E˜QŒ0£aA€šß$ÚÞaÙHSà ËFèkX$¢*–…Pìo?©B'FýmS}ÛLûýNJÍ;ECÇAq¢|h£éã‹âd ?E j|bVû‘ÅŒü:jŒ‡¢EK Ü! Y¾`?|`Ã3þà–†£cFáå=ÔrKæƒâ™î‰xä_Ì#¿Ø¢” ÉO¦ ôxN‚ôC—ô ø¢Åö·–äõUÈ(§!l¸¶hÉ•+ˆ9 IGÔnW° Ò_ŒïR>c|‡¤øC~dRH" FFÚç9I¡Ä`2N?בi£Ý:Ü88ØÙ{Nkoéûï£å‹zÌÿ«!ÿ5H®87'WÎmž™ÌùF›gÛÛz&—­ÎºBY9‘Çì˜(à"̬G;϶¶¶·!浕u•²‚»àL K‰K1³¾xÙÚhíz¥®0»ûûÿ³uè×lÝ€yz¸±·ùƒóPÔ^‹Ø1ÉÌZü÷K¯¸¹éý} üv¿½<ÜRy—/.—%-ËŠýmB1öîÚà>¤^Åù’Û2Ô%FËñë7üÿjÓÆ;% ¬MÄO¹R@p%ûí,Ë£KÆ™ ªšÜZÑRÍlr$»‹oäÑ×òÎnb/k•^켃ðˆtè[à?>ûÍÖgšY–.*é&d¿VÉ þÁ‘çAïË&yJïm¶Òä&¤ ]ÅŠƒk¸YK€­ÉÀ/²â®Šô”Ã#ù5T ]çÍZ$ÑL£Pq¨Ž å\ÿ}¦9%nÿ|†Ž"I–ìRzM/ù¿ø½ "ÎÌ`¯€z°ŠJ!ڬ׋6â§5™¹—õát¹…Üü˜©"~eOk5¶a"*qJÂŽÒsfÑ0ü|Ùh\"è÷)A`FŽžåož±o‡€tx“˘]ÕÐ9ÝÄ"==äÇþiÁÛO°& ’KþíJâ±BÍ+ ©´.J åçÁW¯^YÓfg€y§9­áS*ySô2©3@R¯qš…‘-é*¯³@áœÓƒ`wÑCÀu£ºàoóMðŠük5ð¤NïMšŸ¼œîJèŠ ºwë( pÔeÿdÝ:üõà'ðc⢠Ž=ØŸó…WXãSDFR˜å®ì¡…‘îƒY‘ŸÀBÌI‹$W ¶ð³)ÓF-i<ë±rÞQÑhFƒ¼ÕUñ[~ ƒ ia®!³ZÐj2µ®ª@ Ö-ÄlXN JÁ…ÙØ È€ºjùü8Ë÷<²«À°P6°oºA6´ ¾Y¾—7É'‚9Ü,çJÑn–óF%¢1ô͆ðFùÐúf=ÚºYÏ€IîM²Þ0ÛÆ†ìµo ¯oíÕ ó¡Áö òÍÏæì²þžhÀ·®—l¯“áèͦ™3üçz1ý˜IÐ`#ë4",óIü×Í™š*.ÌÂ1‚ƒÕÀ1º¥“ï€Ê*ÌÂÀ6/JC»¹( ,*q •3QÞZÎBÁ†IϾ_KøN*Y7—wP¨ÂÿøÇ?¦m´©°Ù þØ ï  Ì=Ý[B¶8ÐëðÌ+aÀ-懧š©CØh¤ÅìµñûOÔÆž^…ú3¬>m½JòÖÊL9IkÍHÂåR•Û嫦€û|UY†©s®_5çú3ι‰M·‰‡cÎù¯WIÕe^bän–LÕošŒÕošW…ßÁžê1Nsf=4—Ò0X&½©4Lu9ÃCé³Ði5ÆO®‡öìkå†îmtÛ?ËN‰ùJg2|US¹W5•¯K?K"Æ>–RPF2a¾&;*rn‡³VÏ=‘ÌÍ«ƒ,ŒÏg€SôK W2C8™¤[+¾¬L©4š™_;׫›e#õkf+ðUÍ@¼¶)›‚^!Sf`%5ÀÁè PÆû9Ü?Üù#”úu11&à`IŸëÒúy†¦—¨Ð,L gÀäcÛ‡@-`Á諃/}¶»)W<Âû™=×ßMΨžú@„¹Q» F¡3€Rs´ "h'Y-Æ·vüB“=ò¾³eðÓ¬„g<ƒˆ•Þ }­<íNï§O›Šª”à૯áQןÃ- =í ÛñÚçN{Ì’*æ®V6yµù¥Ñªyd¢Ûx‚öŸE68ëg½«¥,¿2ªí?Wê«Ë+^üŸ•¹ýçïL¶ ¦Û1ºáÇ×…0€ú„G±,¿çØ›ÑtÍа.r¬7Ãn­Ž²_ ;Ó£ÿÈCÅÅiªâü0´_Ú’1Žþ,!ŽŽv^ìîlïð-VÙ½º£&Û¯ÓvÈ‚qÇN=„T7vsFAà2û®IÄmå˜î”ÇòÊjLÒû±ró ²%ü©i?`…{Ö4úA)qƱЇ$¾k,ÈÔ_ÓÑ-Î23k 2@ø¡øI Ùû„„:?eÝñiŒîòÒ®ô˜q’TÎNK»µßFËØ&Û1Ë=΄ÛÛz¾³·mBRŠYÖl’%h&K|ºŠ¸Œ,韤Çü¸ÐQ]D^'¤ ›<ƒ€9p@J!“çrÜÆÁXÅÐ/‹1Kbê*¸Â—«šX;hËaøÑÕâñ–­ÑŽª£¦Ô6?˜Åq¼Ë™ð}é\J2ªb,+(±8E³Q¸’Kýª²ãϨe£0pˆÈ!²ò2aQ¥°¤è+eˆbáygëoKHª°Lïo]åéÍ6"¥„šXClSÉ”!–!Ud÷Qta\¯¨¶U~ÂÔC3K‡t0¥¥ 1£ÂÔ§w³ÄÀ¢ãÄ$V“ ŒSIš1W`<‹$PW³pB¤‚“ÔÊðM¯»Þƪ½ŽTc×Þ( 7s 0KY ,|Ó[`Ùq§ãË™¦ãË™¦ãË©ÓñåÔéørÚt|Y2_^g:¾,›Ž/£i“1TÁÊ©¬°h¦9®°Œ@4uþ]¯Òf¨#‹¶˜fšwáZËøGb@ѱ(YKª1õ|Ÿ³èhjO|B-ŒHTÇ­ƒÏ¬ ¨T¹)·¦îÊ­ð\56.Ù.3¦Ó,-3Ï´y·‚-ã?Uîc³7 05K# ä3mÅáFÈ`TSiTk&¥q•Ñ(sÜÃ4jj—É3CkÍÒcî™ÈX¸Çt®JBÖºþ®ÚªÚU[×ÛU[%{’P,oÇǤΠGó؇J 13 ë$Bp-ÆIÍøµ×L+‡ åãÅZCbHáßE;ž— ?–˜xì‚Ëxv#Z-œq†…o!1°²|ù²§ï²ß޽ÞÍúlÝ&+îõ›*¸¤ÛŒ@nµ`¶éf¡0p¼RcYÖk¯ÌÚûíÕçî¸WeîÕ´ž{UÒu¯®Ów¯Ê:OÆÅ³;Ï%¿ÊîÀJ¨PS̰|µpÆéM±‘˜L…êlc §qu&^Ùܬ¬üÂSká e¬‹ "hïé°bK'€êíÒ ž_uHÂZ0Û º‰Â±;­»³4`רîs9>Bkíûf$Þ„{6>fq^…¨¢'vÃ=±{žØ ÷Äإ'vo«'v§ôÄn¸'v¯Ñ»~OD÷Ù(ÍN,3j8‚9 6gÝaZ€A:ÄËHAgãåèÄo=cère(c,ñ–3Ü%´èjv×­d.Ko#ðk7<‡KYGºñ(É ŠX!œ-ãƒy—XkÈ8zŠ)1¾vúYšCàŒbÌÒA6nXCFQ3! JÏö7Hø˜&ñ ˜š8?AcóÅ1»¡æx¨…¶¨£-±£kd¦'ü¯X‘‚‚âpÄø¯6^¸ï۳ϩ £éƒPiˆ¦¬ £Cõ7›ZyJ(¡†qhá¦T.ê×í?%uûÏ uûOYÝdÜQ¡ŸˆÍ. ‚ú{¢8 „‚q¦µ÷pòfˆ£Ý¤ÃóζԵÁOáêùJè¹p<h*Óχa裭__¢¾Úe”æ°£bÛ2ë¶o­Þ`¤ÔfÉÁÜr&}°ˆX‚j”ÃYC9·(í—PŽê¾ÙÖwj¹Ðå]çãÍ …Óû‰ €iP£›67U3)6p%ýE•ã2=ñýP‚bo« ÅÞÖŒ(ž·ÊP P!žmmïìm•L‚=~˜ØhQaI^YÔÖ«å'å¬{z¸ù,ˆ-t°–Ì«¦t¬*åØwÇÔ…Á$S˜06° ·ÞÎüÚÝù×ëc»ÅLeø×äõ— ÿ³³»ËÞÙ ï„Pó³R"3Âø¦œcDƒª ‰×¯(î`j‘jû!ƒR •ây⳩døwwÊ>l<ÝÚ- !p.ùº¹¿wÔ*A+d®‰Ã$0”þ²ëxšþ/ŸÎ *5=g5•?§C›Ê–3Õãå5ê13¬V¸›+uϦDë#13¬Tš± Z³w®©½1 ÖÐW˜úê°Zß`†qéSÆA]¬Ï0 ò {ÐÝÙA_Eãx¼8½ùÏl`ÂE"/‚nŸ;NãqèúÃÞ¿±¾ãß©;¸¸Ö„ØØ¾ÓPn=ÞHn¾¥-ÙÝjqšn5WîžõùŠOzìn¡È¡_o å¨BKkãðx-ÄV^Zñ}”¹ÃÍtŒþ2žhß‚EuX¶7|ÁoއH£:Ì/âÿAuÞMûÇ?þa–…ûê¡Ú ßNr»”š Ÿ–Á­W[0¤— kVST fÚ‚·Ë÷àmœ˜¸¬‰:ÀÎØ3Öl¯bÍ¢?Á™ÁàÌÀà1pf`p—7ÃÇ[ØYàÐgß,€Ê7áÌUE2м .¡¥-\õõð.x&êGÀ=¡PÙ —•CV˜Þõ™ô0…Ù¶IŒ[\“Ûek²g¯É­É^pMök²Z“ú}½E¹¹Y¶$Õ»…Ëp¼T2½û-^|åq®åŒC¨rže6¸W³ÂýÒL€âš¼éÍÄ2l‹ =+GÕòÛÜ´gVywmnVLu.]g¢ÛóÜý™Qp[$ÌeaÓ_oKéÆÀœÅ”Èg×ÀF£J¤QL¤ÞÌf4¹«fèÉç*H®˜"A"=Ð_—ª“УÛô>'iœqÕ}#éÓIá(*„ýÞ2ÛÛ|BòÀx‹×ÓîÿV×V\ÿëVWçòÿ»xøì¦A߃ÎÛMއO5KÑ©_Pä„KèÃnZtFÙ1/ûtx!/$SyûP ª º¾mäÔxkïhg¯½¹ÿâ`ʽ£~døKàÿòÓ„ãÂôŒÐ`;{êå&,쯛ÛÏùwÎÁµ÷wÛ(~~¸qðý¯¾ZÇ`ì2;¦iîs´t´tØø !eƒ>JE¬½ã½u’§9Œ¡LÛ O#LÁî³=>L ž_÷%i»Ò5EÕEHy^´³dhÌÆ;K›Kˆ?žŽù;êó½tgI8Ha«cÞö¥Nï¤M(Õõ®º#º‘‘>x‚¼`ƒnŒbÞü5ÉY?+Æáë$ÏÆŠCEÚ°®ønÛmè€éX÷ÙpoWâî!îÞ qÃ^^ùØfFO1&ïyë€&? Ì~o–WÏl6ÛÔ–œ3ÿ Mmí9ŸÉ²6Ï·ö‰ÄТ<-í÷§ã§MÉ€sæ'3'(3gaA9t\y¢o”²„ ¾ Žú9ˆˆø$¹>Å5•ËI³ÞÎN+â\çy:ƒ×dñI,YŽô–*'¾-1vÐOñª/E›¬Ç'[0° Ú—Î}Ô× Zz&iáS0Ær/é¤Bãý¾Ì¶7§ „´jAFpt(&ggç7Ù¢-šIY„EâdÛC–þ2Éøä %5M’~V>Wà :zÃÈê¼<0`ƒt|:ìªn•ö{ “Ò¤+‹2®¢¡ãwŒÎá³Ëœ5žXƒ¯VÏï½#ßíÔÿè'Çœ¾5p ÿWTäêðsþï.Фä£Ýß‚ñô9÷šš¸‹Ã’Éòóa=¾#TqÏáÍð îéÔŽd9ž2ø1XÆ;{¿ÇÐËÍKX¹:ž€±tâh˜(` 0’æb8ê ˆfS0_Ä} øx8ì W«‚‘‚°ÂT†Iw ,0ô Tp”Ô%) 3á¸Ëª‹‚ØV½ ]ˆUÇ­_&HeJ¦¿Pu%ïëÊbK UÕ¨ì}£Ö6è¶Ú“ ½ (UžÕ¿o6Ä~!.¯ØØ1‹ù;8Jÿ‚ ÄŒö›~¼ÉË®* þi°÷è‹3X›ÂKÖ&zaÈgŸöö.\]øgM_LSdÏ`T²†¿1uJ#Ô=Æó‘ö¯k¯ÿJúK€ÕôíáÊòCþ¯Íõÿîä¹+ú¯\6îŠÒîU« âjø+t[KðËõÀ ¸èQ ôvºW-Ïq6´òÁ(Á#MíâDY•›JHS{R7Ï#ÑÁl#™m̶]’­'³õ‚ÙtsílRyÒhºÌÈ›žE:8î_At˜³ÉØh6N¬í |r0J{Ù%¥ý›Ÿt)E&@ PÉÔLD©Kù„Âm‰PáÝjìT5˜«Ö4’9i¹q8•sg›T¦d„µql¼ë5õ~ay’š¹žèÁ;ï9£Ò-âãþ°óº/¾k ­nKëJº¶|¾˜ÉRÁ™—­ÌÒ¿µ—¾Î×Ú}_”j¹$>Zº0pQèwè šn:éóAìŸòùxJóÙü›E N '÷QÊ»çP¤Â¥ÆŒa„{úhÔRµŠ­YiÆGt§+)P܈rT¸ÞðŠ²± 8\ôö pM…üêìõðì Ãí#+¢A£1($"Jdg  ñŠ´ñÆ ÏKóÇ••M7ª©(>.ÇqÒ¡»#IÿÙ´hÝîËàënl,ÓP'º/§—X•ÖgÎ(õS ØFP5ºêÌ‹…èÒ…†´ðæê>›×ôd~öŒâ³aÿÉï«àèåS€“}jÑõÕºmh¤n ùñå~+ ²n,ù¡‚Œr@3:€DÌ/©„X3‹ €¬Ôëf·¦öq}ÅîåV¨ØúßÍ~€üýï7[€xôÝwÌæ@øFõÝšÕÕa «‚•1Èÿ³À´àýX_Q0û‡õõïÀ« „9  h²¡\•…±“nšýhÍ„Ø Ôǘ>G»€5£_¤žq§õ8]qëDä6µ¶÷ºõKwybèTÜ`:WVW † Ý•1ÿ cx´úhV ZÑš†“¼+)&Tq_ÛS¤F‡Êÿ› ó9ù̩ԭæÜNÌ$Od­–/V×t'¡þ´<”0~³„F$³8‡Csh|ÆA¨– 1ÁX3¯ˆ*À!>Pÿ1‹äá¦Æd$ S)™Ï¤ï4µó¬e™ÀÝ@¾ÏÐI˜Á£Hk˜0*•¤Ù;ÞËáþÕ„jÙ9åšß”Ù¸ öËñÜÓ›+Tœ‡l㥎¤Èyݳ·aƒï‘ËÒhv£‘Œê {ôj&ΕÅ0K°m²ÛŠ%ÙÔu9‚žÃ€Z6òóOÐ 1ZIۙⷯ³Ø{ób`;­ë0ˆ¦ÛönÂèÙÙ T‡À}÷ݪ §” ©ãíf –³b tÍoMpLDzDUæH]ðYs>4ºKª‡Ï’×,ÔPâf‚ØÙÝuâ“Z‘»gSÙ²â1}Ñ8^ú4jÛ^×ÛAÊ·]MùP-\vÈ8T#‹´aÜg-¹Ç™ÆgUo›«z;¼ªS‹-¶¡$c}’ñ±Zœ´?qÖšù‹”ƒ÷|ømÐ@f½P¡£Œ1Âc†¡ÎË÷E*wˆÛaÙ¹DW…c¦N/ÇÝ3ËJjôUK =)†¢n-ÍK=£È3ÕU­Òü¥±£;%™ë»G3æzee{XôÝLÙÈÁ‘Ì6k.©†¿|±lСÔQ3J¯ÜXX‚“3`Äö2õßg-Š‘äNéð2Ÿœu"Si¡Œ%®º°Å¬E2€ú¢l™>ay®W…òû ?&ÆqÜi4º R£„FÒ™³=Ž»5'»Øš™þÒu-œn^/ë”+Í\6¯¬|:PYúHÁÙ¯«‚j‹eá¼Ð• ®¨ÙùC•ž]EѸÏ:ˆ<ëµ8¯ÀÏø¹R3´ìÇõæxÅ+ s¼_ ÀGXtœèF<µ³b´€~[0… $`à£ûœóMÆ)œwV”“n€´`5 „X”„PÔ¤H]h|TxÀ Åá$?Œñ½Ë<=³?ø“4»N«ù,IÍž@ûϨƂ£° >bñÞá³Ëèg ’©…5 ϶YËm³šìZõÜ.«'øÆßjør%jÓæ[½= 8ÌEàëb|¼(ú»-‰“E¯>JnÞLPbÞ‘_n…;=£©\×-9Ø?+‘ÜwŒ-ç:tJaÂ$ºxÐsNí‡I³ão]FEîÝ&üðS®cæàÕDË·c›å;öqÒe…ÌÁ_KTä » œ-ø†ðê£Ù fÂÛŒøãŒÀëb|I+ ŽÝλ„Ï.£ÄôWìº+ö–+QPÓßJ@ºòˆÅK%(]}Äâ¥TÜÄò­˜.Cbñ2­¶/em_N­íKYÛ) tM‹—JPº/Q£Øºñ0¶ä8¶¦dKŽäPºT‰ÅË´ÎiÉΙ*îXbù6­'[²'§€ÒµK,^*Añn%¦¿•€¯$ä«© t‹—ê1‡{A²ð=L³=Ö]!\ÖÄô·z¬áÎ&¦¿Õ€»pw Ê/‰)DnCxÂOß.ï™"½Q?ñÒºñ©_ÇWúÀïÀXx¼/5ÑKæ¸yì­›¿¸ÿcàþÏ-ã÷Df§QÊôn;nöÔ{§yâ²Ó¡^BQ:”…<;þ⥊ƒÁŒó .ŽÄô„W} 0F¥Hà–W#ÿK,7ÿïÊ…¢ËdÍñ­òÿøGŒÿzìŠø xWÓ:Tüÿ8âÝ Ü3Zýk #ÞÕ›ïVÜÖÐí¤‹^ßïð†,E'®ðS‡(¬¤¬¢Þ,f, Ej a5ã ÂÇíZ%¤¸×£JïÓ8óÀYZQåW-ÍsÁ»ÂÅlñA⬗}§2-ü!¦Q]¸Uúæðª¢îÞT-ü¹æR§³©ÛS޹„©N˜O%]ú6u3^ ñé†ÌýX‰)pCH¦fl‰Ã&Ûפ‹ä·MFq‘dˆ0^¼ÅâÅö`%_¹m2–eˆñ"./Së¹Øº ›š ”àr.þµ«+;äÊâ«ÅøWgS7-¶9äÑÜ1¾Š¯üÄ_¡ßÛODo?Uük½¤Âœi$Xx™ ×w¢·á­Z\Ù©}Qþ¾•½Q—±í”±}³2¶KËØ&bÕÃéïÇœág= KœzÀ™ø³Û%ÎþÁ{[çm‡:—€ÊËGAR·g£ÏÛ>}Þ.¡Ÿêž1@?·Côs;@?·}ú¹]F?iУ `ð*ÉW§ÞìT“/‰`ÛÀ°}3p[xë9Æ^Åq÷5„*ÍfUt¥í"·2KЬÜP¦‰—–±¸½”òsAŒ}ÂÏH/&øJ~ÿÀñúrðWO/3Àó3ÁÃË ðâÖÑ\…ÙšLRðz!–BkÿW MZüAñ[«É¾/™ Ç87âŠÕ¿­“ÓÃ×ÈK×0Xé¢[‰°Ëâ÷«š=ìm‰Rq_r”Ñ ñÑ!²3ý›'‡\Pš]õ)+$ãUìyÒv¨EnBpíH»œQ*exCSh3*m¤¬ Œ `; ¡| @vÐ̈Œ`ûµ’L¯PÍ‹”¡Ó{(Ì¿ŠXD;ò'Â_†°‚J€TnG&PúsÊ)­Œ"ÁÉȉ¾›­¬2ej¡èÊÙÊ*S¦fE9žW%MÍŒN¡­¼2e¦æ¾ôšûrÖæ¾ôš;[Vt íÖ8”5<‡ZÎ$jME-oµfG-o"Í–=O»=;[VtDíöìlYQŠèO¤Ù2ƒXÑ–PÖа€èÎñ»bXÀ¶=,"ejEÁG¶•S$LÍøÊËùjÖ¬èlÛÊ*S¦Ï¢Ý]gQÂôŒ‡nÆÃY3n¸7fʨd8Vn;µbàñu:*wÖÊvô4Í•³ã¾´›¹ 5à•ð{)ªO?Ë'ÓløÿLƒzZÄ•lX¸5’Œ×Óô+öà^ ù]ñ-Rkȃ†˜w>5§Wõˆy¹÷¶ŒÜ{[×Ìý¼eä~>…`ø¹Í²Ÿ_·ì]³ìiDÒÏm–½{ýv¿´>e Ôý¥Uùëæ‡€¦f×]»|+ÿî¬ùñˆyòá8¢z”šÈ4œÃw¼õ+³ M3×p„k¾"Ó«@®ïŸTå:fŽfU¥¢Ù6òø«²dí£ÓYèUásÖòbü»0m†\::J-¹à©ÇCá@=Ñ7H›ÍGî¼ÙËÉ‚ÏaÃÕU¸,€«-Læƒ<{“ô:Á™ã~ïc³é/¼$I ±LB3Am8qÉ£´öÏSY<ø wô»N_‰WT¬¸]€‚›ò·k§ *ƒoTù¸²€˜Ðÿ½ÆÏ³Tb?¼6ö'OfÆŽGA‰~ïŒÙ¦FÝ/§Žåü—.²Æ¬® ª»Áñïúå0*èÃ5 ÑUÙˆWUGRÅËúÖyž. [öçåÓO*ìÁÌ…án.œT`½yßßõ úÿLúã;ŒÿýhÝõÿÿpyuÿûNr½¿›Ž9S*Ùbv2vL‚쬟uÐüߺÙy†aþZø|ð€môû|Ó ûß6¶ äy(Át×û›àS|kw×õ6î9#'×à›ÍMç.¤5B0NŠ”75Ñ–+ð17òÜ©g ð»é¹YGÏ–cqr3ª°B—ðCøÐ{çpÞNÙGÂU¹Á·À‘@Cù\•îá«ðÉ5®¢±ëÿ®âóžî­ÿõåùú¿‹‡Öÿs¹òËýñK˜<œ/©hâÐ oI–óõ5ágm:7:§Ù8Å¥[°‹lÌÏåcÖKŠ1ºœ?á‡a¹(—b‚´ÄŽKþ‚ƒÞ³†VÝ0h‹C\žJêÒ~ºq´sÄ\ߌèf1·®Ð[üÄ YwŒOdÅ1p¨é=ÀIêS¡V(ëÊ”&0Cຆ­èwED€:Bž$ý‹äª`ù00¯1|zñ’Ÿuݦ-áÃs®ÆgJNާ‚ÞSõ+†»þ? dï( ÃÁÆØ$HüÁoôÏNµ«Ý]‚½3"ѳâ,íd¼¼ç˜†¼N7 ÌØí …JuIqZ§^i°(4k±¥5^üÁ›šÜOGÇŠ•ë¢X(ÓHV¯‹ä;]B„“¸¨”V¡œÜ”ô ÚñWäס‚MþŸËE5™çñ/6ÔŸ˜pIk¥nðÔÑ(¹ºg4|š¸~IœåàÈ÷ûïÙ“'ì7þ߇ì¿þKQØ1ŸÖèóÖuq{1fâ ½_ÉÃ3@†¾ÿÞHä¨1ñÉ# „Ä߬T^LŽŽÔÿú/Jå³û¸š“œÍ}®Þ±„]YÖ¯éhxˆmÛ\Â÷ô„ïGKÏŒ9”õÆ#!ôó—’G¶r’ª*“àÛw¿·‚þ‚£è‚=/5hÔœÞÁ…„îOVÀù.øœ“=NþŽSö„-ýõ×b9À#U„úÃáYıÅgCÄÅÿ8"Õs!!è ‰Èöm]aÍÂ<6|úB1ÐO³qÁÑðþñË=ðÎàXy“°ièÛ‘ºÅÉ"á±£4ZYô[À¤w×=“Ú*Å 0G²* Y§ûì§T­áë>æc'þð!ŒúÂ&qÆqG £cm3OMvƒ,‚×¥Åkð~gq×QÚ˜h_ăä6´¸ët“Hgß7¥Œœn¥Œ‰löéÍ)DsoïïGM^~gÌEÜmv?šùô$ˆÐ=A…cAJcA kr·9FÏ: xËÕs –/Vã£ý[¬·crŽÒãü¯Óh…ÿcÖg!ϰÎ!e–™2üP‹,Ó3 Ó3^óQÚ™Œx½‡´egcv–ŒÇé(Ç]ïÂmŠŒ‘9œáºÏÓ ¾ì#î Kç8” Ó’.¯ @Îm×Ýrü•²BXVÄJអŸ)ø#g,9ÓÔcÞ„ûgIà6 ÿ8P°ÕƒóΫÍòôÚ<¸Fm`êM¯¬Š×»eµ‘ƒéS*ƒ†ÏòàÐäÌ[¿ÓÚ!×"´#kâÖh\ÞÇy÷^éïšØ™¸¢›RðvŠ9ùšŸ.D@ ÞX€¢‰¸Ágñ×’õª¬Ú—;J+Ò?Nf\;(3i ¡u’øet“Ê©-ÖvÄž¨ÚvÙ÷ØH}Ų)3UtK£i«å.ïÇW±I_ÍÁ¥°µ+§¼#sƒÌ9m•ôà¨igÊ*¼p¼âæl¹†?ÊÆ\á;¨‡…|¼àu«GÔ8«á£ÆYö¯èš£Œœì¥HŠoKɨ[àœÅ£º`4ÔY_t±¶ªûžeçïAšÕl-µöÛ{[Ïwö¶y'’¿kJÏ£2C]TžvÒ¢HFWjA}!ûÏÖá~ î6ù˜|´œýØlñAŽV·Œªª Þd ‡ò¹qñ ùÆJpÕü°œ‚«"#àÏÄîIb„¬Î— dÿøÏל0©]’hñ“y»ŠÝ½×|à„™ŸßÃÜIúýã¤ó®²Uè·)°:¨î±hǃz ©á-†ïÖœÊ:¿Î'ŒÁ$w'`Éd‘sÍDM,÷ŽÌ(¼Î~öjìÊgÁ•lKÞÿB¦Ÿ`ȇcÞ0í.Ô«J_É¡ax‡}T¼šÉŠeÀX+Ý'ÍfEDÕ àÜt‰PBv详³^d™C\ ÏG“BAÆŠs„ÁÅÉRq ™k}1ÌÇ®˜A˜·(vyÿš¬23™å!ˆ AÌÒdš«åØ@sœvÄÑ °ëg£áq?,•rÖ×c«oÎU³nã9°ŠK.PÎTÍ,¯ +‹œ²~8¿*Ù  .Øä³Uþ¸ç5ƒÝ¦—_&úשlúuÊûÎàÖ¯SžÉåÏ\ÞïÆì‰»œt´÷XÇë0»!üb†RmÅRŽ³Ò©IïÜ嘉žeÆ€06ð‰úÝt¦žŽæ«~£zF‹¼‘u†jj«Vc)â»…V­ÍÚª•Ûo•WÆô鼂¾Œ§KÛkÉÞzíõ³³š;ª%›²rìds“&ŽÔˆ]Ú}ÉQéž–ˆ,Ö†£™«åü5žàýÿIšß¢úÏÔøÏ×Vûÿõ‡+sýŸ;yèþß¼Ìç|4‚‚“ËQ6œµ ¬#.€’ä0ëÈžc„O§*8p^Åì"e=‘3õ2B¼D”ÃA{’õÇ8=…ˆcx}„×ë…§SpÊé{?E^*²å-±¶€«yô|kïZ:GGÙ¯©¾V;Úù~ÿŠ4ŒðMÝâ€Ør¿gÇã•ÇJø&ázU€øÑ‘Ôˆ#rüYϼ'ÐW•¾cdýý˜ñƒéÍÚ–P=Õó¡0´ -âò7q—Lut…IPý ª—˜K,\[tP¯Îƒì½¬ÖøÊˆú¬ÂJË- ã'G¿‘óc¹˜s‰~×`£.€9*QòëG§enWuJêØó*iE¶¾v%{תäçß…Ëéÿ­©M¡ÿ+ëkÝøÏëçú_wópúcz0Âó &ܹˆÙî¤Ãû‚µÒÎi>ä\p–ÊÈÐHÂùÿµmz¢>µu ’m'†ÁUãJy"~&Nƒ1¨Aé 4к _ëÆæŠQ|ß AçÙþûbM)ô’À¾RS6[°»$cMÄï¸`~æsœvŸ."æuá¿ø,盚Æ<ŽR¤œ…g¦¦G‘þ2AÓ.¬ŠSoïrTÝžƒ¨ BÙ¶ejn`¡Ñ†ßLý5¤°¨>òkjê¯ADj­Ÿ™ƒ† ®ôlÈ;ÿ˜F½ r:êdþªälx“ƒù¤Fßݳ¼3J9}ュK̼9_ìƒוwúœÁôÁ £‚œ¶8›‡;}Òÿ‰*%š‰Ð sª°Q*ÛMBÊÅ9 |’ì„:H·/™Œ‡Àì ƒƒ÷¿» f…x‹¢òaÌÓŒãéü?Á$Žg89Ǭs:©ãøøLatñ –é蜗uî6\±K£„KG[ìûü³·µÓúaëPõ|oÀ¿ÐZW9"V+Û ‘üPSÌHø¹ZEzž5éoÍÆ°é„½–çÒYõgø2°ãOOr%‘çË*+C’hÁøÔ``‹ßm½¬4^¾I|N“•ܬñ½û'ɰ?ÒX^RèÏ/¢6x3hWÀE±FC\¢ iÊPÊ‚ªNO!“…UO#1A°R=£VA8·^=¯b=¿f=³jÐÕ?ÉÙ ny‡H!'|…÷ø2EÏN‚K<%fFu¸¹M@Á+’·fca‰NÔv´ÇU«Ñ3K@± Om03—’)Þ{•¯†|n @•î€R>ÇÆ|{÷µÁÕBÿóÓÌø4e'§ã#ÔöéÅã«8!oZ®¼ F`ºýô`¬­ë±j EôSÜãÿ‘ÞOf«©„c‘P•8Éž JÚºŠ ‰Ö*^‘O*Sh¬›ho‚‹cEŽ%DÝgÛx—m'ˆ}Üh*Ț؈QDŠ$^6.¤¤‘4ÁL:^ ´% HwƒPI= ‚–Äèè]VŽö¾Àɹ®$„~R5p÷TkÚt?YÝ) 4ïö¨0Ô»ãÝ,óËÞ¦ ÄäÃã+ÑG,:eƒ(N læ/¤ƒ Þ_§JžI]E=¥f¤Yí3e§|íHmd}‹ :÷$ã|0>ÈÓÜV€^fžñááã0NGƒB,Þ_%Y~. (Üë9¿×Av¡:»†š_a|üZ¡Ú{AzëÝažŠÍ.ɯôUíER«˜Á¢ƒ9u˜ñ„~^*Å3G$¹Ô!ƒ³„W9»î0¥ÛÜgÉ2`×’~ްBÊÓÁp¡Ë·ëšÙ„!lÍ ¥½Ðy84]Z¦$þÆ-:ç1ê) c¸ÚNºo9#aâã]ŽÌ*±Žc¥4MME®"Ê–Ò¥˜C€ë¿cTv1)Ô¥gœwê¢x9OA –§ëOß-Š»c±ªý”Þ€?$Ó,ç]¥K'¼&—ß=¬ 3+¨é)g»/`,G)Ÿ‰œ3?æå¤¿`³ qWÉ•tà”䉦ÒÌ‘Lö’CWaúå=]ò±ÊÑzö8¥È߯2C]xÉ`ˆ{6¦/Úàóqõç_ª?ª?#×gròLr‘^·—0:¿÷U„Ñà ÊêD,4-AKyN1˜N>=à$ÿ‡‡w#ûð¶T£Á~Cí%´fý<®Õ$¢mF< }‘¢©ç-+Ã/5âq!×WÉþõõÎÿš-Å"²wäׂƒr`õˆ .à±” VM¨îU•ßúÑÂ62+oÕþ«òöoUÑ µ´‹1›§ ”M0ŠU×£î±_œŽà Úÿ¦xœnqö‚# (°œ9q£¨¡ûÅäFÀäF IûÒæ máB«œEÂìc”ö†Mk6+?Ø.Hã£x—!î|ÃÁ"iqpzÔì@'|S–v4@ F#éô>æ\²ÈlEÃn—öþLœµ(¼ØÙÛÙk 2Ûdê°Õ]œfS‚…"0lÊðLVª¡në°½Âîu0$Y䇨ýœhk!_ašBÂÛr<<™è‘@Þ`ÛÑ?L•Ät€ÄîEæÊÈÙWŸDÇD›é”ìžEBÜ'Læf¥MSI“Z‘ÁÒ¦PÕ*ÂdSÕj²dTòz”I•æ%—&aO³zùÈßKj=]“!wi/ œv‚ ¸LúŸp¦3‹D·çòWN7ÉùŒ ;µt~©ƒ•m{Ædžqo7gdåjpGEQq³¦O|¦ä•Ÿ &ù»|x‘ Ã>”€¢©ã?2áD ôh 8:9˜¼ö‡[/~e]Õ›xHî[f±Œ›®HŒ¹uÚǨ͈i?Ip|Ó.†/Ï O¨}2õ+E­¤‘ŒIý;A•1Ä^R š(N‚Î7Á…®6ž%Ü8ÀR°!h™’gN3»À=5;‡ eG/DJQžàBùÑÁ="Û½Ðô — ‡›0N/Ih‘5—g€r è­¸¢®hÓ$OçR ¡ˆŠÀëtÅW$¤˜Ö((zz•üF{}`ä^VŒÜ®1r/Kús¦üWRu3Iÿ‰) z±Ç¹Â¶ÙBÙMbr+î_U9¨„‚µV+ìÁÕúØdT»C!ÅÇÛiSƒ\­å–ZÌr-c ­eo)·Ì.E©#7¹"L\ɮʟK–nU6t÷Vé*°‘X‹rdSe+Ð]¥ž$Ë—½žç¬ö«?,…îõ\ä'Uåàá,× ‹kR(¯À¬ÛAy Ô§Ã_Ù<ßÔóš3qtñr6ÌHATÎnsa·,O0#W;…p……—;Ff¿ó¡@Mš• ±¡õÄÕ i}±ÞRÉÚ¡F¡qEÜûEYü\-¢—XãÊИM4YqÂqÀØ@½há6òȃºêÒ­'sšœª«YV"S©`¢ädaqÀ $Â=ÅÍA« c…zÑÆ]³êþÏé3Í&çàÊ«¨kÙ¼FæA2z"þ’ šdjÒh$°ÛÒoX*œ|o€û0øÈ9¼Ü«(Ç ©Pa¡´¿¿B<ès®M:‡Þ¥À‘‚_qoß9çóTrº»µ7Õˆñâ¼QHÃ`·®¼O'ù0·ÍÍ`¥ÆÔªEÝq ŸíßNóV Ÿ]ˆg[Û;{[¼Vöh@ 䊙®‡¤’Õ% k(ÆÈôGª—¨VgC{¼(Ñ\’­Dêƒó,S¥È'µ×ÀS øt'þ:áì˜qò.ZÏ“|œœ(Ôã߉õyÓ:Å [~Üú¨o‹=æ[ Ï8â¨ÄÑ)íZºÔÆ„„('7‰1ƒ´8 Œº|–­¥sC ;±ÖD¥ê ÃcÜ'ÝfÏ%ðÿwãì¤ÙɽRgCÕöó)òSà{ÌSgÁ6à&”5f£Å,^3‹"Çl±Ó;© @p\Â?òŸ>øl- Pk„ÊÜ…_T•ðžHò¬¨2•¦.Gc 'jžó­–-BxØ|¤“`Q hFBµípëÙËÍ­C}Ññž¾£ýcž ö*CpÛ\¯îÿgïÍÿÚF’Æáç×ðW(Þ}^äŒð`΄‰“/!a— d&»y>Æ–A_#Ù&Éþío}«åƒ2‡µ;ÁRWUW_ÕÕÕÕÕ|/fàVÊÒa¡@Ÿz ëN†1V¢¬âÍdUUƒMü@ l(€<¢ÚZy¢n*M¢“ õqj–‘¬Ä17Ùr¬z|X|¶e¼èG #ªšPtÔüÑ“h-8þ#ÍФš7š:>ÎN“ÎSO“ÏOÓÏÓO7›1n8a`\ ž1¾xüûå?¼º»û?Örç?×—gúÿ<#ÎÿK _„ÇÇx¤ß<˜û 3ýãB`‚'þWõpîȤ§“²;±Ç¬y¤°n* “GúG®ej+ã ¦†Ô[¶?ŒÿwtÿÇâÊ"¤Íîÿù6£¢AÃS' ‹´iN»ºš„E±êhž%Dó!æª]~>§8¸–Vb‘º·ËWö1ª“FvëÂdv ‰.…´€Ž€ý‘Œ‰ öÓ¢t±¥^˜.ü Ä5£@ÈSm4ˆÜþ•ÍhéSV ý±Š+êd\MNU£Êp2¦ä>j!€Øé/L=€n„YO¹ ¨Ž6GWÓÑÞèô½1é¯G&ÿgt²Þ>=$®kßìå’ÈŸl·kö¸WÿÇÛÜïpý¿šÿ·¾>ÓÿïäÑö_Ùè·dý ^ ’v2HbòcDâ"#Óí¢`“ðÇÍã½[„æR× D\Šà½ë¼PÆåÇœÂæGi|”:¢æBÜØQ-?B-3(3òó[7ñÈgÄø¿«û?WWÝñ¿¶XíÿÜÉãŽÿ›€«ø¢™ýDçF˜ {A³b,wE2ÃDF£c‚ÑØÂ·8Añ«ˆæXö@§Ð;^èV4ŽòAG¼ n<„ ónMñ)wjW}®ìZ [âòUJ’/ij@<!/4µ"rÉdëÊSóÆ?ñ³!A1ÄyOh–2øjF ƒÞFãÆ]6ú\éÔûÁÖE=­ˆ¤:Y 0òøÚ¾ê«8`ˆvù!ܪ`¸»I3 ðF2…ÒI𠀂ÁŸ¤ŒÔÂÛG.(îÎÜ=PyÃdc#Éø ¼dÑå‡ ùîó@·2ú„ç>¤+«Ü,]UmÖÉ~Aœ*µ îó˜1wºeå#Æ“Qàxu´µ­Gú¾»ÿOÑ;Œ¯GÛ/d¾8js9go…v²÷ÄíGŒ£rB¿ôÌ ”…ÌÎX3eUæciAh_@×»àžë6>¤YCž#Œ‰»P„¿µÈ£DÞ †ÈÉ ñÊFÍÍÆF&­É¡*7æY6Éq§€„G”1>"rQð/‚ÔW’+ðAïtË€Öb&ÇKƱܨ‰s¤²°³±ÑÉ$þtœÑÚÉL²KØ|Ü4× WæËµ‰Õ ¬ã¾ÌÑêCƒ#‚Ïð ˜G&™å°éì­ãŌ芭© ®4ÑÈiœpÔNM %­’Ï$UïñK Éw%ÓZ._i£¦-;¶:íõ!Ìí2UÏQ÷ÄYGBªIL[ä(,€Á•w`¹aø¬0,FA¹’ù,ÉÄe‘ŠÑ>r©0—p*‘É#W—«œN1oTú²H¯JtܪÉ'/IlܦÉSÇ.*‰û“WuOúRµªêèdl%U—Œj:ñåV}¤*Ê“þèÑ#UOòúÇëª0'ùª€Iì¡Ìÿ¹§% ´Õ%ÀP9¹ôU=”úÚ›¬ê ÷i<ìÉd¹KSXW¨„£Í<•‡ë+*yÏÃlÏã=Oꊬ@i“ŽÓ½,9ckn®Zo¢šŽã]†vërC¹¢sb®vxOŸ©Ì¡¯/¯O„®wŒ8@ ¤4E>7.è<£1}dÜãÇHNZ®³ì ›DÔ`¼zÐâåòЍÜ>ʤÒ^0m;EùÀšèÌVÐó<6¾§´­l»ÇžA(We‚a´§OŸ 5ä᪴O…~rQœYYe!ó ²èWGÎxe1ÆŽ^H%SvJÚ¶ ÞGAì¯GQ´}Õeˆ.3÷¬‚¬]LÁ˜w!ÚjÛ>b…H­þH#rf(C'1QÔØÐJTùíV²ô’¥yÿ¬½cN–;¹ÉÒ<ÅhM–-+~‘؃kÙ“eËœ-©ŠSnå;qNûÖ(ö46oL d°dEÃØó ³ª@X{€,:rWË÷ðá² ·Ï%m¨èf1…B8¢!t<;æ*SÂÄ$¤I°jg_6Ë„˜kFuáV⤸f¦bû°ÅÂÔ;ªK8ãDi^JŒ ì–-A‹²§ïóÑrâh‡Ç£‚ðJ¸¿„SH(Æd… |Y‚ ܱä_jìøFõŽ9ªwü£ÚXS¨`Ò4<ù“1>9ô»œ<ýˆp,žA*³;ð|ËLˇ!"ÙÐùTP%¢@‡¹gÍwœa¦¹"U]ó$¹¶=D[UÉ–¦;j0¾Ã—ƒª5¯t,”£Ö i¾iêGÖÃõ ±^[hkÕõ‡¡fg MŠurôJ,ú ³w¬-KºY·òCI¨cŒ˜ÞÉìSÞ¬aAP¹Nì"Éò+ C;„±an¬éÙqæðg}œý?‰±Àšù®öÿ«‹°”Êíÿ¯­ÌöÿîâÉûÿ«˜íY°äFd’áо#øµ»¾åv¿¹õãîþö)FbÖn÷äß/:ÙiB›Y»ÝÁn·UÁ‘ýƾjËŒ¼î“®Šm‚Pê¬@3ùp*£ÉÒ @4­dŸË"¦ŒI¾mX¬ˆ ¼@†­5ÓC"…RqPõ¥Ø#-ab¾ ËiL¯•Ñ(¸gÐ'.GCcš_+>$‰5èÉ(,§bŒ,=ÉN°¹kÊÐTàhƒ?‹Æ)@Rµf¡¬­ŒFY[©˜ÅÆÊ7šHœŒ_íz‚U°¼‰‘³’HEYerCTÀÿ_ ”ÉàŸ%ÝIà9Èû‚©a&®°Áhïõ4ÅЙÛä<ù€×qàxºoô`¢û£ŽžÞ""=bD':ÏÃ=n~?ìò %–ƈ 3 'Ÿt¡ôm#2•ŠäXÉÖq¿€ˆ²®´9î!¡/ØÍø0ìÄ|5ëøân“¸NwéN A€xÙ _L† Ä­g[•øØ>f¿md¿E„Ç*è%Ù0Øûìö3u1eè‰K§ï¬ÓyP+¬St€UðTàÏŸûÁ'AF[Á‘Ét~Sd²«r~jx B߈0Yäo•°hkÕÙ}mL†þ/¨‹ ³»âÿëÕÁÉ«©ñ5ó´Í05¾¨–cª”ÈŒû+ª'ðkqú}ɺèç'SôsÜì˜nXøÁ'7G¦}’/è '_¥÷‚^æN'Ϧ©VÜùiápçÆÈ´ýsSdÚºqoØÛû {ôEÈ›7G–Ö{‰2"ü[æ³ñ“t›R§AWi ÛÞþsÜnë¤#µàãôæ˜õbö{—K³¸æ:õ«ƒ–¸lè%Ýñ@I¶Û=ªwÏã‚vÖëµÕåpÝf|…TW. ZÁSPs=$ ³x¹ˆœ.^VMJ׃˜IMAé¡©’×cíÖÔTªk.OÆ\Xih2RýÂÅ%‡Â´5Ùã׊:‚õ × ô† ~?†þó¥t£¨!ÂBÜõ›Ýþ×d£›º‰š§Ç)˜9GãÜ ŸI'> çFùL¦îØu0=ÎÞö ò™gRƒíûßùÿ/-V—ª3ûß7zØþ÷#ÛdôQºˆ§8ôGÞÒG·˜Ã"å-×ta ÝqÌⅴÖM‚enwCyä{qjÁfšÖ¯+ðF—,†Ô#¢V—hv+‡Õˆê±[.SæKïLý¤SÏÞ$5øÅBhgUËe¥sAn U+¿+ή ¿ïª‘Ú^å·H¦~†>y¹ !ó²`ˆ˜ù>Û Aoýª ý7ÏÕð³ ìàÄ…Ö¸»ñ³ßDë«lÕJi‚lE¿˜ ¤ÿõäê\Ÿü:ŒS-€Äàñy˜ð…q@…®tÆV^Ô‡½,ñÄ„øOœöÄ€¨AÏ4²éuEN&‘šI@DV&'Èö‡¸+3ÙîVÒ¸&ÑRÙ(ÔA³©XY*L%ýpF¹€„$DHfð²XeÀ5Õnå;È›G ö ¾ŸÄÈd\ž v+O¦Ù=Ë2·…¹í«m¾æÕÊ£z‰Íš 5¼•¢908Ú­ ŽÁ̈ñ©kð¦ó.ò·xEn‹g°øŒñÞX|÷›ÑÅõ¨N¨•Po]ìOKß%êþ—cC™(×ßJ‹%®F=ø* ÷]µlÝÏÖU Eh¨¦êÀ3Á}FÝ…¥è[Q øÒ>3& fë) œR7~‚³¹±ùܶ ±)Œõ‹x ƒÕò]À*[åN&«$–D­…ûûÛ.•«j\äêþ¯@¤6«¢I|èA¤ÔE“.žf¤vɱg6Mx|ðr;è ²XAø!4z3ÈDÔ7$Ê'"j΃cÃs‰Ù ;âtKªöúšQÖ^aÑ1¸èØîetw ¨ZdíwÆ\? ¸Öu|±À=Þ*N¶æ’ðöašÓz9è%ŒT¡ æ×fÚò¦Ö7Ÿj¸ –¯yÜæ®‰ýìAo 9¸i»ýR‘!Th„/Ë, Íxßñ„¦/XbæCdýÉ“ð2Z¼¬®áÆô·@?²/-qHï(2fÍ`B— É>†N”ųfˆVT¾e}&.Òò’F+@‚Z±Ñ°ªæ²\˜·A‹s»,ÀÂ6PxÒuÀ(6ò(H¤K>Üä½dÑ Ï’®Ö%:;åy ç¤ÒâU饄Μl°©<L¼3ă”x¢ÙÙn¢xøÙš Yûnkµ>”Ý;Ü•}=—·C‰[$@vd9&øÑ!avv„i÷ˆk1]{®Û¢ÕfB@ÿ}‚ú‚ù¹Äž¦ÄJA PX3°ðDƒqË/<Ø 9™7ªWÝL,I´ pªÝÂ[[±ðÖVÆãñ!=g Ê66j­*o3Õž…‘måq-4ÕxRé Ä$²µ·9¥ s+B‡<è­€ÆTôKÙ‰x”? ~1x`¤Wh_Ðh.6Š«¸ŽËÇìU ÈPóýꧪîÅ~vž ·»¢h±T„´f³¯„B{Å:€³)®Ô1Õšù{Jäe ÄÄ›óà²0sKÍi1s€ÝYòõ³L KÍê*0ªÍrRq“d2»¡¸Éd=’£I˜»Æ\¸Ù;X¿{¾Ò¹R>Ù4ÄÍ»#¨Ð¥ðd„S&e–x>,ãùèôšíªRs†Œ¨1펒€båœNòPX…9ß’<pÎèC'ã9»€ØýÈòõ$/€Ù—¼fo:ш.^q:ÙŽ.§GInèP+ í+W·Ù­t{ƒ3ñ’â¤"$3!i2Àï C¢JX¸—:°¯M`ö*L±TGK¶Mœãv»ˆ˜t©>4lZ‹:€¥R\•Ôú(T'Ÿ½=X±hèI&ô‘ ŽÞ´¡ë^h ®ÎhBBÖÆž .e£‰´4bšŽÛÀÃg[ôµ{½¾-™ÇÔ÷ÙÚY'NãäÚêÌw©l_êŽläÛ«àu¬:8ÃKP[It … àƒ|ô^À2@·<ŠÒ´¹o¿<¢¸x,6˜ CËE^±E ùëáX”A11Êe áEXÎg›Ç»Ç˜¾’ÍÛ~}²½Œ<Øž5ú±\qP§ …gp1åÌ÷ùÐW“'¨ ¹~§íëüĆŒ©2IåÏßÒ¢ÝîÕaŒ@Ý&,RÜpê”bKO­GÛÏÍõŒ¡°ímŸh-Êì‘GB“’™dÆ·3ˆÕ»2áàÐlo„’]CMÁ¨²fÄX–­à€þnõÇTò¤€ÝÉ9à,ßF+—òĺ$â9²nPxúô©žãûh÷8Ú>äzáÈ;œFeª‘™§¨[§=G¾eê;¬$(å[€¤¨®FJq³,OÈ ¶¥UxµÂ~µ7‚çìQÈu4;àX2iß.¨•ó¿ŽN ’hhè$18r 6+*¤¬Íoøç@:J-Þ;õón‚¦\½€àp«ÓMtÛ>ÀèH(ÕÊ uŠ“Ä?lA*9—ƒ±•Œ;bÌ)ªjÐíÈQ×2G]¢‘šN¯¸µÎîw ¡Z9Œv©|ïXþÆ( ^¿êiÕüê~Ž‚©¯9¹ fÓ©[/-ac6? î0¸ªY»èùÞÅA<ͼÕú’bwꌭ؜bé¥ÛâÈ­.¼³Bªáª;ÈfE2h’FUiAjÖ™¤—k½‚…EO›ë¸c (*Ûzó‘_@'C:DPGÀâT^hCªŽ˜Îñ‡#y™‡²´W²+33µ0[S`¶,L¾¹k2ÌFÃB— ÖdãÉ+¢^q@6™Ÿ¥ñ‡Dèžtlµ—¾G½¢¥.HÓXaŽ¿L“M+Ø$üJh 3uX¼O W£ Oïd*[x¢‹±Ñ¢F‰6èß…'ôç³Ìu¾Ž«þ&e‹&ßóó‰ÐIê¢|ÌמÌלÕ•µúbä-¾©¼9°-–—JŒ¯cÊË«t£ÀüÁ(0° ŒŸTžñ¯Ãz;¡ýÓ dTqI'Ì1¸‚‘¹,â;wň"ÉàGŠ/NR|õS¶ëÖ©¼ €Iú:¶ bbÕŠüdÔ‹üdÕŒøÈ¼7³èÁ‹3*Þ ³.JüL›ÿÈ´Øÿ¿õÖæì™àñïÿßZèzÆìÿ¯.-®æöÿ×fûÿwòûÿWN²ÿo_ú¹úvý­=ûñy¨ýÿb`½iïݲ·})§Ž˜Qp½¦÷rMÁXMü˜óøÔDñókjFkú÷œ®C‡ø˜yÌ< fžÁÖ“`ëž óGÛ#ŸíÿÙ÷Çg›Ì¢g›Ì³Mæ`¶ÉügÚdÖŸíÏö‰gûij}âÙ>q0Û'žíÏö‰gûij}b]–ÛÚ'ž›mdzâÙF±½Q<Û)þvoÿwW'wvÿëbuyuÍÙÿ][\\íÿÞÅ£öU£{7— ™‚½a7oNâÆE·×î'qn ¯ ˆÎ8³.– Ù”¤h,ò @¶àADÚô&?ÝþisÏs¢üDíéŠp.$š`Ù.¤6¿¢Ęñ¯Ç>8¾œTXRó_}Ï Ã û  Ù-~¸;dKB¶||Ë6CJÉ.¹°/I!ÌÖ0­†ùnãÕjBí@4¡v<Ð?ÕP¤ƒ¬„ü„æ!¥XÄW˜Îšû½î–0æKøÏ† Çô‘ì¼'ÛðkßË©¶HûÜpΣ¢]]ƒ7I—ªxèk9®± ·îÈ\Ž\’Áë eV‚¸¿vœÄ÷ŒÿwuÿÏêâÚRNþW×fòÿ.Wþ8Ý©ü·½‰Ð‹2Ë'÷Õ}mJQW˜f(Qý´€C¡  A,€ø§Ý0ùùp‹f/Z*ÑR/ÚNZK¢µ¼h8G éÄúÆÆYÔØØh"€øÖ£†Ž¬@Ï¢fÙAN1DmCj‘¹ýWä1ܪlmïí}Lšµ«(¨T*Ÿ#ýåš¿`~Wµk x <ÌrâÕÆÆU]ol\gÌ-åE5³ಲïc¶×¿ÃA5‚U5‚…Sµ…ƒ%|]Â×¥²ޝZ,år"L„Ï3ô˜ŠÎp¶Cø ßt øÝ‚É\ ùA(ÊûH 4Æän"®9k¤tñj³ÆŠ¯3k¬;‰fMèGŸÀ O*/‚Ž£ÑïfG­²o­^k:¥†^›5™†¨¥Û‚‰£g’Gâô»½Ë¨§ ƒvd:;&—;&›ÁT|îñ‰®GW‘øq-8ÄnƒýÎeFAïLþ—‡² èç|t6/ꀪ­ÕçsülÂ("]«GèKT;‹Ð¨ÖˆhœYfx ¼Éà1ƒ·"9zRù6ͪ ±[cò³§Òйè4sƒ™aÈÓ‡›.:Å*àÔ|ðÁn@»ýޏ/LÔÏvrùìä2š&Ÿ¢~¢ý|¬ŠWmD™½˜Ÿ²%>ÙXKˆ5夂3ؽðïµ– V½’#L$Õþîþ?#þSñlk+Ê~ÎGy»Uô¨„nëNPG\çÝÝA’л"þ4£æ„d‘u¾5‘‚ÛOö> ¯˜h`د#{²{/ºŒÉ‘)ߌÁIBÜÇžoÀâÎC=çEû¢jy]ò¨ÆleÊå¢éœ’œÉœYj8\f91šùòâáM’úˆ €ÏDl±˜8Ód8î– 8þ=³„™zG@ïhèèb&‹êD¦:Õ"2wjFK¹¦›³·~–B9ïSÎtrŠ -‡a'’¤º‘;Ív0.©"0M*úD=ÙèÔj­×ù¹Ñ¨½·K ¨êðßY†<ÖŒ~ÙJåYž(û©I øYØe;¾Q¤_¯L!µšiŠ;ˆ®°äôs>ºâ±Œúö`Þ­½+Lviàv>Š^ü+æõ%{R€¸g€øw$ ¹Â!$ý JNqJ?è²”\á®"ñc$(¹µ ^eà•d` (¹º Æ€¢·šÑ0'7n™Ù4'cÛæD6ÎPòv•3”üÞD圌®ròh#^ñÇHªè¹†øw$àk ùz,(y»!(ýÝ6xôÛ//Žrz¹¬ê£M®iø;ºMŽöàÞÀ=¸7œÊXã#UƒÞQÛ;.rŠeìYe´<õ<÷­ Ôr<¾Ö«üZCNq‚\ëºkŸÕÎrýÜVžíÿ´ÿs˴ىϪ4þ2¾ÚÎj-õ»Q;wue_-¡åE 9½A®B런ímŸÈî‰?õòÑ£õAÇ6ð—õiøïÚ…bW5Ò»éW1äÓ§O#ú7§‹€¿£±á}5Š«ÈøßÑÖð~ ý­úµ- 﫵÷KniØ[Ò%¯n@k†ÌE\‚%…Ȭ ¯¬ZË&Ì ½m ¢¡ GÏÙ8WìYtZ õ{´ý\¶*ÿ§v{Êjz}¢õü­h¶m îŒW7ç<-ú>¿©¢œæ(¢‚÷\WÍò}Õ¯‚Î×AwƬa™R•)1‘Ttî;\Íè-‰Ý&q~YÂ{^°<3[`K¶@Ø™R"H*REÛ1u´y6æ€Ñù’€ñ‡ œƒ•*ÝŽ©ÓFLÆc+‡È«(0_Ç¢¡×4Þ%ýV˜øµ§èz>úÍ™5K•âiŽt)·¯=÷ñ7$˜¯ígÇ¢¶Ÿ)=³ZÀ0:š,þKž§\Ûøk44{…êyQ¾ßÊܨóØqòعY;…yì°°jQ÷Çßg ppß?³ ¸Â©…šI¾w»Â9¿ªÞ‘ÂyǑΠ´H×âyg2ù¼“—Ï;òsg„üÜñÉÏüÜÉËÏ"ùÉã-h\¿bStØâ«Q­5F‹/I`Ç °s3[/!A÷1x½Ž<¶ì) ê›­ªh¦í,wœ< ²9¡ŒÉÝ‘IÒáiÂÈS'è§LàøÃ_òÃ!x@?&Íðücxtn&xü1<;$[£Ðc8“Ÿ¼ˆ…ЋBbÕ¹ÓÒ Å±b?ovôGgr,'þÍoÅÉîƒnæ4÷à?Xá [ ©Ê¢æ«²Ýìi‰¿Ò¼ä)’"Ѳ2óÛJޏào6ëßœ9±Ëú¡ÞþÈÁåùä'ßV$/+j¦€ìò^Áo]5Þçî}²øÚ@Œ¿ˆVE¢i,-rtýV‚4Rµô=> ${È-¨a$²Q®‰Â·GÞ&œÔËðëÀî¦' ¨Šf4º ˆÉW‚»2©€&&o½cHñ!ùϵ‰– >8ZÏlù¥0´¢…ÈB¢oØô½­j.*}+Bµ9}•ãôÕ8Nùe‡ŠüRÌßìö<)lГ\‹žŒkÒ“\›ŽFA›[®¦F£ íÍÓ¦'“4Œ¾oS_¼{ŠoÜ·)Š/¾2f\¤ÉâC!ÂëÆëq(朌"¿·Š¾ëR4 (F8rŽÆ!lº›#Ì;/5–ýÕÓz´öÄFCa%òP£!ïÃ<ÅÉDÂd” k²õÅk¾ñÿcÃý§ަñXLãŽì¤y…¯h6Ü®,e¡¤'Òµi·¡†?8ÊA÷Rbà×èÇO| ºr5 P˜åHc=*üC /U$_çþ#] ø ªÎâbZÔ³¤73Æœš»'T¦AC„݃þÆ;i€¤lÕZÝ Ôž¸Ú•Úž”a½E×ÛÐCºWÝ÷ðZ ƒÖçrK¿ùZM™ g>ÔºÇëÿ=$íìö;ÿ³¶¾îú/-­Ìü¿ïâ¡£ ‚`«×éÀâÒˆoâp ûs/,›í6h2ä¤;£óêdwïŽIäu×¶ÏéüÈG8ùM9kãÁN>©#Ïé,<¡ëjMÚ±ÎЏ; ¢UÁë( X<æÏM|˜hŠÓDS'šê<Ñ Y5pè.uj"»è]á͸%¦“ D8ò#P8]ö<ÞŽ¯%[…ˆº|ªÒ+Dãà•R|øä•«û¨‡aù/’¦ãXlÜ—íÉòߘ]Ss òÌÎFF§¶vÆ / ègèg1`Ô,‰Ñf~–ËMù1YÊØÐKÖc«Ê½½Þ%ůàï•N½l]ÔÓŠH!´»‘¦ e:Æ–†¹ T•müò2;¯PRX2$P)À²D½ü Oé_—AÒÔÞ-ÇVrä…›:z¡u„Oð9ÙØH2N—,ºü$ß±k.ééÛâåb™ðjºöá9üHîXöè³TB1§©¤,ÎSI•Wš”‚KñKѲG_0äŠøÀA¤ŒdÔiÍ Í ¼l?ôZÊa‰Nb ð¼xÊhmX¼¬.-ßAÝðßù;­¨# ØÝg­]„Αø+.*«¸f$>_£™²oÙè«Äu‡iÕ-‹…ƒÃ‡‚J–6ÁB (d‚þ2Â\±ŒbB£¯¬®YáãA«¸‘Ñ%S¸fuÅuÍ©:=‰èÎt†ŠNPE"3†`þ t V‘"TA[®€ó ɺ„¼™ƒ‹FïP`t¶Šù_][WŸùpTƒ1G¸#ŠùðáC]ÃFqÍ7Šß¬Yaj-/¹õ‡*ÏÜ‘=‡zdZ;‘æ€ñ:1‚]Áú$)M\ô­×Róy†^St*³ÿÁ\aŠgôi :OƉN`ßÙÕ…„°’_‚!<3»F €2ÈS&:÷}Áã•w„`-ÀÈZÑ ýMe†K2}Yߨ 3•à#@9Õåªá£?dY€T "|âÇ…X2hðA7ÙE.~ˆ3ÈRµjVßÉØú«.Ù5xâ˶úȬCÈ£GÌÒy Ö>\7‹w’¯"˜¼ÐÑOT— ´qAVÅÐûȳ8£úÁÉqk@÷Á¨j4&}úT(AWõè9DbhäŠâÌÊ3 1˜Aüƒ6#¤¡Æ½ ¯Ñ}ÿNü½ÈQÍS¿º‚èèN—ºê³>ƒsS»˜Îœžó9Üþ>Ü>bÝL-oI9›³gGC5’ÃÒ(öÆFlèFª.ìÖ+›4—æýZÃŽ9S神Z¢©êNÔ-g¢¦3-{ªnùæj>¦ÑÊwñÜ‚@£ØSæ¼g&âƒ>-!wì‰Õ„ѽbä€,:úüEîáÃenŸKÚoSh¥#BWÀ³c®2%pLBº‘«Fqöe³Lˆ¹fT׿ŽN&Æ53Ç)Z,s ‘¤º„3Nò¢V`·l)[”=}Ÿ7V yµcë¯äÛ-ù舅¬#K´É ÞæXrW<ŸŒgTzÇ?ª…mâOÆøÄó =8y~Úê‘÷˜gx+¿Ca´[> ô.šAˆÞ¯GÌ‹œo¦Ã¢å‚f(s¥ÓnÄ%“šü¨¡EÞMJ¡¨ZCóJ÷(éãTi¾iêÂ{IXRÖ'Äzm¡­U×N„&= „yaB,tdŒECÞìk+…V2”ë”1°„&gÀˆéŸ ð>½Ï$VTuEÏ?LD’3NäW(†bYí07‹…6‹…6‹…6‹…ö{Œ…&ÍùWxVË0ï_ói-3CDpF°”Læ1­YŒµYŒµYŒ5“Ú,ÆÚ,ÆÚèhガÕf!Öf!Öf!ÖF´Ì,ÄÚ,Äš%#f!Öf!Öf!Öf!Öf!ÖÆ,ag!Öf!Öf!Öüsã,ÄšCubmbmbmbí/bMÞÌìk£ˆ‰Û¸tÚÏ:ã¾M¤Ž'Gêȱ| È £T)½ÃÃP2Ð3‚´å%JÌJª5?Ñ÷µúÞt¿W—R¯nÃsFÀôžd(“/¾Xf)s·v ¦Z~­-™‘`ÌI68Q\™lðÆ#Ø€qlÈ(60yÀêa=­wB ¥‡Çè“àzo;fgÃÒcî<ɻғ’MÛÀÃ3õ£ð D<ꟴ®ƒ–ÿ²»bñx¬•tã^FI)¥µàgZö¤§i¦!Þ•¢Ò;úžIh<'w.Ü8üÌ#CA(6zÝF}ðs2¸€L9èáÀÑAA6{ãCÇ7©7á)>Y0qý´ÃMmˆû«m:ØÚ!üäPr¡Ä'‡u l^wY›\Pu*‡"÷žMÑ©ª`£7Õ=‡N6R”!¥àMéAµ‘¾+½-åÁÅY”’)‰TR#ÍSÊò¤ ¯›9—Þ "pðx!ðÀû²VIœµI*3h™‚ ÝÆ>ÙIà#þ„îl©w¢ág4§—uõ¨˜àO¼j?åz-âC‘H+vBEåÃjˆ‡‹Qã?ò.öÿùlà„ö½ñA]»±Èkãy&Τÿ —”MJxš¥¤7±Ñ,™ö.±P¹{É)#g¹¨æyO…MBY|Uy· òvŽz’ÂNͦ¿åsÍñ$©Fx­QˆöÙN¤¿túªfê9}Ñ^`âS:k4TÕÔ¡œ¥wìV¦fUy>Ñ*ð¤'Fó¥F½Ý–Ü|Õȳ¡Q È;NHøà1ì %|Ö²!tGÛ'a«Ý»ä „>š§1ùü!LY™´¬ê¢°‹0ôðDfÆXLx¥€rüÚÈ2»Æt8)fƒ^ã×R às{ú™uºUc·½5_錩Èë] ô<³\[Xäì}ÒÏ×+礲°ôÃÿuKQFú8ýùöÎîþvÀhÝ6…¯Á» ´‘'kzÀàÉWÅlE ¨G„R@–ƒ+ÍÉÞîOÛxw0q[j'â ˜rÞ±™IúŸ»{{ú}Òn{ ]Vô1\>{KC¦Ô¿HÞ°fE½=Ø>ðÊ›„ C1éÆrˆµ/ò™jTÞiÀÓ²„:Ì^:ïJáà‰Ú+K8û0µ Q)ë ÓFì部”%Ý÷ž{²÷1V¾6ذñœ=da÷óºå'#-{«z…/ÎðêNŸÞé´¬læÅV:‰˜3HU§9™2CÑé÷‘ oÅ¢Ô“›J»Æ­Ö=›¦rãBF¥R‰5ѵ;±xj[Å€c.ñ€ê ÛîÍẕƒ…‚oø‰Ó1WUí8E¦`Z–tëéuXúo)ºòŠlùv–0Üw~82Í›p ~8v¶ [Áe/,u†ÄÈ®x‘ÆqXj& @ÙÕÂMãN(»Z˜Ù ³7!ó@v³P€u :V0`¯ f© ك®ô".ɃÂlñÿÏH^åÀüä|- 5à;? {O˜€ñ¯Î jýàä™ÕÏïÔ%ºI˜$ÿûäIäž Y¸ç>~ìÛH†8<ëÑ3ñxK‰¬BïJ¡Ôƒ Z¿³°«¿—Þ•Ê%C¯qm3˜Çó‹L«È¸Åü0h-%’0Ç ŸURã`­ ¸GËïl -ÍMnµ!Å£{ä–¦á^½ié‚>ùŽgn%ãBþ¡¸ÔêÈYj„øök~r˜ªÓ6Æ–ƒÂ=t¾qA…á2Ô/‚pƒ(Á_O§Àó¶Q¯ßÀÓ¶$œøPmCt6Ѭ ~ep„þ|iÜ"¶ƒ÷ ´HÔ­w|‹Ÿßæù¡Þ… Ï£ÝuQhòB…ÇL=U/ÎåŠY˜'þnLh ±p.p{×ßKï¶*¸ÝFNzûIã=2€‚øF¶££+ Âæà¬-2A}€KvÒˆ³ k›jNÏ8ŒY)Œò5!ûõ4îâ–‘Åsõ,`]$8 Dð þñwñ—Ž<{ê;ßT¬åˆ,B¹d)ƒ¢( Ó2¶ºð_ÚëDƒ^—¨^ãû»REÚÎ!!kŒÔº€)<„U¤yµbåË´Dk“á®eCåOÓÂŒ†r«h,Kd¥×ÀŒ8–Z0Ë:ÂYB’ƒ‚ ³g¤Ò$LÈä›`@Â4[©= p´r`tßòŠ•íÌÕ†$¤R$(%Ee#o4û5u5ÍóØù¬Å‰kc6 ¥ØæÙ¬åÍZjVA{V‚ $Yj•FMJ}LJÞBtækÔd"ËêHùÖ)¯:”%æ )[b~''æQ£CÝã¡ßT.VØ‚—ó(Vºš?ÖF]!Ž Ò²È´ütè€0N¶¶Ôý¥,4b~ïדTïØúÐË:¬þSjtú¥åOÇàoÇa°eq8?†D«ˆIÑÏmNóu'úÚÈ¬Ô ¥no Ì`WHór0R©‹”¢ÒÆ… cx¿öÀ_B0ïi ­#˜‡ŽÉœ3;»÷Ÿ”p×¹äk!¹#^¢ doÙ •N-hólihЄ;æšØ;À;æžØ,c.« ƒYé9X—€0½n¯’vË 6‘]!\l‚:šsD.þ¬ãá»^NP)® 1‹ˆ¸T4Eš¨î#,Z7J›¼‹Wž}­]‘\·jÞuúµAnèRË×¢…{eàªBš*ו^¬];ÕNÓkAV-Õb­‚›/n²9#çC¶$Ð+Ì«wA#x'¯Uq²Ó¤NK­åC Þk7SÖ+cPÖH©tÆSáó q® Ê>àB"sòmÏ·5}¾­±ùRµÉØoe-Få-v7¢!éÀ‰P…›qK}ôï R…ù°[Eè-½Ñ`|»Ñè²]~2 ÓR\fÂlƒ>¥?™Œæ€[#  ×ÀÄBçañ’Yœ œéÝ1èN1o˱C\h ¬´§}%*,‚y3\\@&ö±`‘œè’14Ö¨õw´MONšc(Šn1Ér ¾ e&W"³G ·ÆbS5º•ÅÈ£ÐÜþÄM­ÙP®[.§.Vk<šÛýd㇣ܮägðU» ºX>4·+ú”H‰vIÀWé­cÞ@: hÖø•ü2†Îµu×ÕàÂöÍÉ5r›«ÑK„®"ò§ªûÃ+ ñYåc^Å‘hôýî?Ñ!Ð2oÉJM`€%s‹¸•nÛ7s øý+|64^Ïüþ/ËòÞÿ‘%~”Â[ºjÌýO‹kÕU÷þõÅõÙýwñ„t·Çaœ¶zi' ¨åc˜&0p{0Ü;Éo|HáÔ¨mÐÝ>õöy|þÁ¨Iƒ YKèuâ ×1ôZáY20–<È077Ä݇ÈI†³¬Bmô:ýá€ë‚Qždè²!Í:~þVWëÿ·rÐÈñ_]_©./åÆÿÒÚlüßÅ]÷çÍ£ýÝýкã<îâ-@1,u¯ƒtØíâD7ßí]^Ä0 Ý>’tçI6<ïá­žAÜLL©•€$i&iÜ´¯ ä§8%»|µ²TY"0>ø[=bª«•*¨u9Ú¥Ü]CÇjÜ„{­²R„=~É¢H®Éãä·Xßs¼ûŸí€«ï¤v¢3YZ¼A&$Øäu5RâÙ7êð/#Ÿê óIýù¤*ŸÔÎgé†ù´üù´T>-;ŸåæÃ7ùä3R7üˆŸ…TÊþÙJ\þ£Ý{Ì®‡÷i¼‡âíÒ|·k`>šØ#鈫@Úû©åÅÊú˜Ú-,Àru,®ê¿5ú#? #΀ ŸÖçn9Ÿ¹ÑjÙb R4/+#«d¤¡‰Œ-X˜v28­V?´¯Ý  „ì²æ©2pyt§Á¬~‹Óž?#Met’T¨ÝpÃ_4öÊh‰DË0©T}45©ÈV>& ´gè &º´®ì¡e®%8óƒ=L?Ùlõpø“QÚÉæ Qê †÷Püj|V›§Ëàn¶;ÄÐÓ:Ä*m–è È•G –¾úp*ð‡‹‚ë–BY<.?€€Mº#Ê6.ઠ…øpZ ³ïXž¹3bmeŒÁ“¬Ò×Z]г/-ê*Ââ„E¨_‹·V„ú—aå!f2ó“±4ªWNÎÖâï’­Õõß%[‹p\ÜÖ º…‘±²:õàž ºðÁ¡q5I®¾´˿Ǧ^YŸZäL]±£¤Ó-TìÃ?~ßxø»ìÿø}ciùß7–ª¿Ç¾±4½ªò{ëÕ¥õo®1ÞÎlºÍâmé‹· ®=úÃwŽ?A÷^¯Rÿ^ÆBPIª‹ª«£Ë{(͸ûPOc*1€°}‚Üu¶ÿõjso„ ò}‹°1ˆä_ZkÊBS“_]´‹E¥ZUª¥/+”Ù¾N™–Ö¹Mõ5[‰×h_§(ÕGKwZ”ůW”E˜zï°(¼ü*EyT]Ó%ùúR€—_¥$—îxôó²m¢²ŒÉmâü]Ö'@AAÅŽ¯ÙõåêÝÖìÃo_³ï¤f×V–î¶fyÉðMkviŠI3¸qÍ®®®Þ¹Šc­¾ŠŒ[YÑ#qñëÏ;¼|ø*%Y^]¹Ûžo­<¾ŽVððŽÅä××>WV}E·$é¶G4÷Z#Ù¢mC¨tF£Ã ó‰½™­ÂŸ¤!}Rùk–º ç|ÝBÃJÒ!K²<¢$sãôAóÒKç‘ à0W€X„TÈ–ÅÛâøZf«‹£8tÙ\GQ;,3ŸÕÑ;h£¹µX®ŽªO“qêÕ¥±|[ÔÇv;›ü„Ô]óУIPð™ÐÐåÁ™'¤õiØj".·Ÿ‡y›Ú˜8•gp=?^iQ‹kî‹Ρq „»ú][¬Ôx[œû…ÇdôŠíEÆ3¥°ÏØü²~¡;ŽÈh€ÑÅ£H‡h"A1ÅX3O2Ô¦4âctüq›ü|²>Ý]qov]î¦cÇõ§O·3ýÝ OŽžM¥Ô¥Np‹ú´ã€nÐþî3Ñ3ÆhLÏ’€ÄΤÓÝd’ÙnOKÏ •åiJKÏMZž)ǰFšböãÙ7åLV Ýæ´’|¢ bdö_:5¦öòOˆiö»Öig³•ûäg«“¯<]™.fÓÕÈg6]{nj®š¦¸ôüîç«04f,k<—å öƒqбv¥žûýOf·(¬wé†ó-Fçüvóí$–ºÉ§Å‰gñiçñß÷|‹Møæ[®—â]o0Ù޺ПjªÌ¿lœG5=·=uNÐãƒà+ª,ôL¿q5MQéùÝO›jÒœnPòó¦Füøö%ì-HÅÛTRZm#L´0Ñ‚E| ‰?,OÚ5&"ÜØÐÏ‘ÌçáT87ESoH,F[›X%ù¤ þê¸@‚ÓØëÕ>õ'™r\î œMeþŸj;×ÁœÄÞ?hü<~«3ðäúóɆo®•̦²âg6•ͦ²¢ç§²“ÙTæ£uÓ©ìÕlãî½qGMx›wßlËí+OH Âi Úßb†¹ÁÝäSÌt–üé7Ã¦Ú »Åó¹â†s݃:›+þÈs5áWvò(<°û{v¾š§Ç×›vÆÅ¢çw0õ|eïiÎiOSbzþ0N"Sj~~÷þ“7ÛÿýŸ›M®tQýìÄÂyr¥&üº'ŠÂŒ| #ãäÄÂmÏ–cK¨xN=†&UŒ _ýÏ·Ÿ o¬~ÎÌþáÕϯ}`¶(~àLý,|fêçh…™ÔÏ]iÖ­7U?m"ÓOþLýüýwšéâ•: þ¹ÕO}šÜì¾ð49?nÕôÛOÞ7VM¿¥‹ÊL5µÀoªšÞ®‹J¾w Ÿ©¦…ÏL5½-c¢Øòú¹+-cå6TÓ•/TMWfª©~þf¦šúÛ2:ÍTg>nõóÛOÐ7S?÷·_Loý=jžSª‰‡‘£íQñÓŸ'ê;¡ëW-œ^vZE»ášówp[C™õéâÇíÓ*ÜÇÝ÷éî¤SÙ4ñTVë~qÁ&±s³;À¹Aì›iCØL½æ†çIë{¶€Ÿ¹©[Óý„FÕ™y›ÿ‘Í>*.Ò×s6÷Ýz÷ L>?ó?Èq¥¯Qp’‹ §)*=gñéÆ$?ö€‚7"³€‚<³€‚<¾€‚:ìç,¢à·Ž(øm5Œ›©ÎGÛ/g±Öþ‚j¨Ýgj Ÿß]€šorŽs¤¦è¹­<gAjò´n:Í‚Ôü±MAÔ„³ 5¾g-`¨Fγ@5­ÍÇ{{³éâ=]` ~åƒêâ’ãýW¼Œè¯í+o5¬®»ñM¿ÕÐÒMmj˪œ×Dý<®©Ÿ­´×ŸÁ$nöc×Ïà œù±O34ŸIvk&œÄ¾JÏzåt]òÖûãtƯ§r}ãJßxZ¼¡Âw´9SøþØ ´à×Vøª–f ßLáûŠ ßÊâ×Tø~÷¾%Ó b~þ¤q¿±°¹é4:³›üѧѯo7YZ4›FgÓèלFÎì&Îc×Ï£™ÝÄz,df7qž¯k7™®3þyí&ßvZ¼¡Â÷ê[±™EV±Ào¦ð½ú*GlŒsÛÕ•Õo}p{šC“7<£~»lÃòtA&œ«¯žjžªc̪Z`M3fÕ©ê¾+“Pnþ·®âN)ûðXjýȲ:R=_ý‚ø$Ó€{©TÈÛV?7:b`NsªƒžžÔÕÏ4gvõsóãŒ>É™/Ïë†!G& Ùs3ÆîÜEeÏM·“èY¾­#îê|ÅòT ÷ ¹§‹4›øÏ’ÝDÜèT˜1CN¼rÑú’F: ªÙµ©wóùsË{p)bŽ¿"}o2‚ ¤›‰“)÷ VV}ñ.ÇŸü½½è-7ààÆë¸o½}f¹·Àoº»Ýèí3›ûŸËæþÇ]êðYn'ÿ’¨Í^ïõ×Q.'ð?cÍ8ÆG›u.÷™¶sM·ÏyƒÖ´ÝÑ´šk²§ÛèX›Ï§êZ_§»à7 d¢%ÆlhÏôö£Ñu|³‰ûõ,bÝ}öúBÖU׫ëßúŽâÙŠîw°¢ûÊ^TÕ‡³ËÑw§ÑüüÙÞÝXÍÂÞMðÌÂÞMðøÂÞé±: {÷­ÃÞý´”›©áÿùö³éV\SŒöIW[Ó¯µhÆcÁ&Ó ¦Ü6žÒŸ?ŠÍì?7²™…šÂ0ÆÏÁ ôŸ™&¨«l/Ì}D®#dѤ\ørvÈb%gIçxÐ j¸t8©ìîÀ?'G¯¶A­3¨¾­à·Mí“ogsïØAìöFãoÿëÍÕ[„¼˜Azæa|'èÃDÔ?­Bº[ZÙS¡—>‚ä°¹_p¤5ìÊ …H~“sÍ]N2NÜ#Ô±GªrÈp|ÕçQSØŸG›ñ<}Â?}˜3‘Q¬ tá$¥ïÒ¨¹þ¤²õÓÉÎÒ­M8=.-S«ôïº`­PgœlŠœ¬Ñœå8íÖ[KãD)¯– §ûàkO©¡¯!ƒ}ë`ÿùÍ[þ}øem¯:èêx#%ɦ‰MÜ÷&nønË1~e6M—Š8›¤·BM¹²ÖyÆïd ÜÿsWQnsž)ü°ì!vëëýí7]w8¢‡+Ó¸®.ÑÒhI¸­.^ÒLq3Ó½1°æ€‰ާë’3LbY¾ñuNãçzn890îíÝêôUÍ”ùL {>aË6A«ŽZ“‹«»Ä 2JU%uà­—‡ÂTµý/áx{%þ^“ Ô`Y³ý¯b‹ó§"ŠûÛ#(îo߀⋓_Œð6,¦8ŠÇ7áqo{7áqo{7«ÇW#+rD`ãåEsïF4_läsûF|ޤ¹7ÍÍýçjÁzU.ZGÚð”'¢L¯¶œAÁ÷gC £¹™æà\ÆÂÛ••—N…y¨ ›çµ‘‘…9¾ ^O[¯§­„מZØ?8™4£4ã±¶ÿõ“.ÝÆV"ãNÞµ~š®mñ6yE¨lÌÂŒAcˇaÚ稒Ɨi2ˆƒ)¤Ô: Zâ×N²@üÞÚŠ`VïÔØôY’Àyÿ›ûŸÙóx^îío}ßiÒ8þ>´ΆI»YÉ’ó[Ëcžµ•ø»´R­.ãßå•õEú¾¸X]\Y¬þ|_^‚ÿ­T—þg±ºº²ºú?Áâ­q0â‚fšÁÿü’&ñE». ›qwp,Ýå>˜ ?ö.ƒA/ ¦úiÒIɇ88:Ù zý8­zik¾å9èÝú`˜Râé³W»{σ~ÅñŸrÝ Ä“`#x¹wr´M²tpÝq¡J¥ÁµúØèÖMñ—úÜ¢ïø™~Í©„¸ÕŠƒ@½§ñyÒëêw!Ëè÷Y¯×V/ÍäÃiÚv›I÷ü´ÓkÒú ÿÃUjÒlõºÙ ®Í…'øÿ €TOø?ÇçqŠlC·˜eIã²—6™ˆ¤ñ3|Y^ª`‚¢4èÝCàéÓ§"#IÀÊ]3QïPޏ•tã&bÂz¨H2Ýøò /È@{@q%©v’…B4†Eb¨V6)%dà2ä«L”âF ²ØÂ#IHèvý,nd(aþ®°6‚­¸ÝΞճ$«4àçûrzàËG"¿Œ;#?}ËÎ3=7[é¬ãveS%BÕÃp‰›ß»ý€±ÕëôHVWRv¥ˆ•ú· "§]Ñ5õxÕ9üwL¥~—KàZ˜ª3lgÅP6œ †­A-7ˆRê$9¤qç¦9êÈ$\½ÙLÀI6<› jn0(É`Úr)Òœê/0¤Ï&`¡—žè0 ìŠàƂſ~˜ìñãQ½T=y2Ø n,سdpÜN±‚ q¡ù¢lÉ]{Ì>ƒ*qîŽYHBª[49êìqBóµ›è;dþ"9ûáç´yå?ï÷ñYf¡Dç®’x¡Ò`(Y”±eqÅ{Ê&Ì—F9kµÀ¢f‘!Òª;<™2˜òÉÄ'æóÉÄíÁpRÈxRÈó‰ižOL3‹Æ(HMÒÈ¡‚Ýb§Ý«pší÷p„ù&»ˆÛI&ªÈÛ‰à@àN2v"¸F¯êÀxÈúYæRt ºñùˆì×tà‡ðW©À}zúit³+ÀZíÓd€O'|ž4ëǵ'“Q|úx2@-Ⓢ Xº²`›×‚ÐaÏ’®+6jÅc‘ð$à!®þP¬,È ò‚!Qo·auÂßÌœö{}“€ïq§¬ÈLò?:}Ïà´(ò/Cƒõ9H¶4ÎÌÌ·€«ñø „Ê#Ń 8OcXÑ›ë•ÝW­œÂ +—†­ïq;ô{Úç4Ö–zßlŸp¾ŽæÏÊô§®t¦ù3ú9gt}\àf„<ì&uRá…\'ɧ=^éJŒhX©ÀÑøwŽì”ßÚóŸBû_g„-lÊgœýo}q)gÿ[_šÙÿîâaûß32ü½Ü;N°pVÏâ&š÷Øä*ykØm q¾dˆ†Aià;…—2¼Yö@2¶M‘jø¯k*¤•ûó.™ÿv¥™Î´þ 謦Ýä⤱ad«cÎîH²K|¦ ×¢˜§ÔK˜ce`˜+ƒ"£#ÁäM‘ˆ€®®qšB-w²s€ƒ Òl¿¼ÌÎ+”–d ”"€Òâô¢ž]lɬ˜jP„V°xÉ.4H¶_þ!î Ý7AÏâVªÚü´á€|G”V=2ˆ€Ötë,ÎGü[Ã"¢SS™EA}0H“³¬Æü,~¶m”{(â™Ù7o¡ÿø„8¦ÊŒ•èçr(2Ýô¡32½y;g@²¥¯.&$ž( ÜÔÂäSn|‹,¡llÜü`¢Š'•ƒÃí#zÃÔzW ;C¿L ——"Jàc§Íׯ_‹ 7Öoä¼×ß@?¤ l_dQz‘ñßæññî‹}ܘ—ŸÂ߃ð}4¸.ÜñþŽ@ï£X AT€„¨D¸S6añ£G59CTð§üŒ6QOºÍ«M0vô¿BҕЇ¦—@¢*à Íè³úl÷äxowk Ðw“kiUF…êÊØÁÄ46ZûRغl¥ERZõ(¶Ô†€'ÄÐÞn¸+#¨“DRVÐÚôà—68oÆeY†V·ž^CG¤>‚Š^QðÖ~ÃwÄ¢o ]EÁðUt­@‡ý+N3’]!ò z²›¿½( ¯nªßòÿq •á¯ÿ_+’ôwz¡¿£D.Ë F2ÔI VÒñ«g¶YY'½|µwl‰kF¥žTžïþ¤ÒÙÄk§m¿<6hÚ¯l+²Nº¯ ºV^élȸóA®Nl“°U *íÀV-œ¬VO Vžj8q̺K'ª†Ù¨k°´ÿ\¥±%W§©$¶Þê¤×F›luÚö¿~RilY5Jy´iÛfͤ=Ûºk$íí©â±•ÓôáÐ&QËÉEÛ>…„mñ¬qám'Iñ#ùíu/ß^óGš€`‘††40¯Y ߪFÛd E8Ô" |°ÿœ åWc@Õjè‡ÕáZÔŸ?QŸ÷·õç'ú…ù9ПO "zÏ€~¬¡u'#ûŸ¦­ÆY5qõ½mÂïiø¶ ¿§á…ÕP¦oŸlm€¨ßjÔ­à8¢YIÐ[¶YËíK-–ŒÿÓÉîÒ~`¹(€ZK‰ ´³´‹ oœþgûèÀÏ fjRAEŠ]•³ü%¯}'®À¯F‘0±¦ZnÇÛ ù|¥ûž¨ÔV®Vwtµ ”X!s-ë¾ÉöÖš¬gZ¢³‘ÕL4d:[VÍDg¶9ÕLY–·¡š[‡ÿF]ȶŽÖtÕ²s¼m^µ“7ŸkÖÑrj'ÿëH‹Si­q@½¸FP•R«¹fO¤“;ô»–M¤“;ôYqš¥Óž8y=q-”K'=qòzbäõÄÉËH{ìP|üÄàþÉ'›{ƒ‘ÇOöŸR¢Åb¢¥äÄ 1öýF:Òm¶ÿ…kÑ÷Ñú•\JýôzRƒß¼-+í–Ll&ÔÖæÞÞGZ×8ÔSEYíÍÛHjÿþ§·*f1ÿ ÏkÑhô£Úy/½ŽæîÝ»Géý^?«-~6íy5ÒCNB(Òñv[¹Ã£qvô8§D}HTØsY$+3b`]qêT€ËeŒÅú ¦™OR€ "l™²‘M=:‹„*ü¦ rXOÅÙÔ·(çäe‘â*0&Ä• Á¬_e¢ ×b%¿Ã«ìÿÁ«Xçh¿¹~[ödN4]è ‡ô•Y ø $½ ,si t–×™øtLÛþÇÐ-vk.€£í‹+ëËkŽýo­º¶2³ÿÝÅÒÒmô¹€l‚8›í¾øñÔÔr°<‹AîÁ´{ÃÔFp7.º½vïaÙxv &·N½;HYÐêµ1L2~ÜÝÞÞ²~ÜHZI£Ndu´4>0ŽX3†E_‡Ï®m˜¢§èŒh—‹¸°œ“¿(—õn„ußâ_‡õv„tö¦[D ðê? »À{œÆÍJìv‰—Aý¬g1ð—h?üM åh;]$Õ‚åQ\o\`ݬ¿47tÎª× ©ÑÄ€åa`µ§_™ãù[µ,ÙVïAýAid?@žä3ÐT¦G€Zæ=ÿÐ#4è'µ;4sá?;êŸ xJî#ø¾2´±(?õSíÌ¢ì¯ IÙ® ÀuKhA69Ò6°¿ò$´Cúñ¨">qHÔž„vH~lWµPYù…ÄÉÎMä‰1@r[ §ûÛ›GÛÇ(àèåÅîþÿ><8V¿q=kòí[ÀêëÔ¤!Þs¸ñ*¡¸ ;Ý~}² ú xCXô‹½è Û ¬b…sÊÙpììíîŸÍŠn|I'ù-FÉÐYóU ÜÛ©¡©V¾·Ô‡9áCöd %cA™ºÄó¹Ùe½ßGó ´ËˆÑóa¦4RŠHa$½aPûù÷òðàèdsÿd“,H˜ISŠÝŸ“mLëÈ…TÞ@z0Höß ; fPùX´ O‹„Æ7”zo 'BÉv~¬Zo%Ê)IozI'Å 0X ­BCí4 0##ìHtù—Øã7œá$Á™­~ ·õa„’‘I1…¤OzÇì žgŒÇôœ²bä ö,àÔ`Náx˜”H® Féÿ·å0Fÿ__^YÎéÿ³ýÿ»yrú§ý…ú¿ÚÁgwZýkgµ °¿ì‚ÀævÔš`ÖqnFÚs³× )¡®”ØÊ²ÒqYwE5“TMTÇH%Ãï¤È±‚¦ô)Vª‹• Rn¾šâ2Îð»Pr”FØÉÎyË-G~W £û“·Æ»ÒFPzG8H«Ûë¶’+¬úÇÐ*PÙkjÒÄSöÕ5$Ú³2g )¢oSÄúbDœÁõ¬J{'%1šøíU‰‡¿n—Äøâ·W¥99Hpц·ÿUâqGoû€À#^_þ ÿÂÄ!òAù¿ùÃ_ Â?Ó/ (uÒ¨R©|F0ró˜“[)fuÈCˆTz,Z‰EâcNo5«wt5îäêqGWdà«I¥øNܧ^œèõBŠizÙÖ½é…ÚøS¢+IINVÒmÝ‹ö¤\§—ÝwÄÎ#Ñ`VŸˆ^’E(E¹AR&‘G°K(ýœ‡Ÿ¬V=[ùjh¹õÀ+`Èÿ)qÃÆlèšnbùí©þöX¢=aÇ䉑h¸¸ý$,R3º«€ylv(§¿=‘¤×d/ Gï±É‰÷DŒ§aZž ê+EžY–]ÍÜX˜¸³mmÛìl'Fg;1:Ûþ¶Û×Hu}íÄèk'f_Û6úÚva_Óeð÷6³¤“÷¨šjUçÔŸ¸uUC:­Ä=PônZÕòvgxªÚTv|1º¥ÓÇt¿“UôIÙ)ñÕîFÔ×eÏ·»Ô©ÈÁªBÑ_|’\U£Z7NÜ]/«K˺Ç,^®¯>Ô}fñòaõ!§o¿RàUŨèA‹—®ëîX«t¢w¢òBRy´¾ªˆ¼Ðœ•’•¥•Õu¥&?éþØ3] l|3+å²JÖŒ’VôaeÕVâÓš%²ðÙZ‹—ðÅê/ô¡,ÉEŸÖMáEáÛCKrñ§Gyñµx‰ßM­j@>Ö$./Ç uUMI¬?ªš ±#[âÑŠÝ;EMAžÎ²1,cDÇnŽÙ†Ì•méÁüiQÏ”Z-I‹Z?6ZÖå²kx-rD„~/Y¼©ø^òð¨@ø½”çµ$ÞKlò@Ú\xÂdü­—Ø¿ëǶÿÐÙ…tÐ¾Ëø/KËKùø/k‹3ûÏ]<|þcGYWÑ®@½y½K-œÀ/tÈã”Ns俸'C0Õ^Šâ}lC†ZwL;C´âAãBCÛ½†üi}µJ¸L~¬SÉ%Rýü\Fx``bˆ“ŠÞ.¡“&À§ãѽM³•ñ àêÉ3|?P¥ô#q*åï\Aj^Œ:!¶ÊßG¢ä*”‘U™Ul7¸ŽÃ™ö¢/Š #$ŸäØÈVõ' @{ãQrap6üUe—çÆCÊH7ã!aE.¢oL&gšÎg9¦Â SaЩ©0èÇŠ™ŽŽ}Œ€óWñdasF6žŽSøé>Ÿ‹˜ Ma9¡w&Äzz#¬ûvè—I±ø˜È”X§©D]®Ç7*—MgòrMŒ¥‹u³æz|#ŸÜ¨28³)±žÜ¬¹nÆáÍjƒûÆ´åºY{MÑ¡Œbݬ¹nRoVñ7“O'Ç2ÆÉMDÍÓ)””é›dY)ˆ(õI°ŽHl‚ÄÄ‹ 'Þì¨Q:Á9ÊBË=*x”™q.€”mSÉ13Y© ˆŒ %5¶(…ѤT >˜°†=Ñ¥fñœ¦~ íÿwÿ©º¸îžÿZ]Y_ŸÙÿïâaû?ùiêïñxNp6ìòÑl|½9E‡ª“#‡ÂóA ñÖ»è–ÆÃ,nŠ=µ @AŠŽh/ÀÚ.`¯Ï Š÷ìŽòÁ¡ÐGý‰om%xb¥qËKDQ‰/#ŽH…"*ŒÝ²¼^Æ‚±0Ba¢‘a‚DVÌIV’̉¼ÐhˆãFŸç}}‚Gi±v¶O¶~Ä}ÿ¨lÕStU“QzZÊG R±Ò‘ƒð»ÇÝž€Å5,J2*–8¶¶÷öè+Å Š$®ªº¿ÿÝŽ.$’ýØW"ÓNL8¨Fƒ¥r@{ Œ¶ùâE8X¢Êx¶ûât{ÿùîæ~„eµ=uo÷ädoÛ‹Í»4Á€1Õ {2íÜ`m7³A”¥2JÅÁ῱߼ţåÊÆ4ìt®O°3//©b߯eHÕö”+ÆSâ¶cãVá‚–Œü#C^ÈdÔodº #Ôrc‰H2˜PÔR÷@Qt"ÝÕT`¦^»þ+Uü%þQ㿪ÒeÜ&øA5‰®ò×¥ýµàÅað)ØÁÄyÿiczQºˆÁu%bpQ-/sÏ88 )×UVaíHB¬ØØù{I‚¸PIô¼XGÙÅ~wR1\œ#²ƒ+b®Ð6–ŠÆeJà_Jìl:Nï$ DFÇÚ98ÚÜÛ Œ[jóe°@‹žÃ¼+‡}9;ÞïÜêµA„P™!×/Gí2ÖéÙBý»êwð{QȨ?lÚ&TÄD´(Hk$yêÑ Ç¿Î>—"Ø|²U*G K¡¡~ÊvKùBý„rb©m>nÕä°q‚Vá¶‘æZÅifØ*#ì”J4ãN™1«œˆVFT*•h†¥rPÍ`WFÐ*•øJ¶û¥¼©T$¹ÍùoQ†Ó»+f¥ø#Fq¢?d§™1£¬ U£Êÿ$êzOŒ1¢F‰46Ê6%Ó6Õ<Û1ÆüH Ð;²)ÊSìeØýÄ×Ku_`/Õr‘½Ìæ>1tà6è‰É j ýfÇ™²øÈ-ßÊ g`R‘¬Tÿ>ž¨UAAت  @Uà E…ßý‘«oü+6ð{bN±ß¤êÜÂ0¢Z[k2ûôsjmÄDÕ2g)òOhº2f+-íi¶zs¢^MR2+5ÍOŸ—háâü ï˜Yj{¼…y—0TI[×u<(N…A S€Pœ £@§¡8†Nµ¢9˜ï³cj…‚ÂÔýíWf¨'LÅ@O¥‰MýF.å;++[(%2 ŽÇ1YNjEúJŒl cb5‚îìoG… ‡í±vŸo¿Q­Ä®„J¹oFkºYÈ«ûNŒ§ûFl(±Y Ó¬˜R7‰•uß Ruß (Løfn†òF1¶î;q¯î›e{ì”íKcsÝw¹o2Âubæ¦3»YL¯ûN-ß7jù©ÃÉÓ‰BÝw¹oòï$=5šfºbbHZzq(ú$ôQc­|¸yDã­?¦RôQ }±\ö™Å„¢¯£‰Å‘ILÆ “¡ÂLýÙy¶!Eà°à¿U+8Xèð`&G»-S=ØÝÁdþ ôÔÔi±¡‚OÍŒ­†Ç¶ÿ& ç§ çq÷ý¿«‹Kùøÿ³ø_wó°ý÷EÜEE£8µ“n ’Å¿ãn#F;0õŠ!o_9¾à»ûÇ'G§/¶÷}¾à[nì ™ïØNØ¥Â}µu²{°ï¤»é§ðk{ó¥C~ç’?Ø?9:Ø;ÝÙ;øùôÅÑæá¼É.ê¤bíV¶@jñ‘}ù 0+‡xâ¼r('¯Â.cˆ 21d•YÈB\ïDÁåEÒ¸vpAá¸Éw’…šcâ ˜ѵ˜Ú_SXšâå/<)ZQ°Ù…Õ,…È*uý; æëÕB£u^†jàÍ.Dùë=…òÿÎöÿ«k˹ó?«‹Ë3ùÏ俼f—d¨-Þ½ÞñJÄy¥¼#æy"ÉIz‚¼wïÞåE,nŒÙ娏¸ Ažr)pe™™œ®<{‘[¤"Ô‘Ÿ¯vn’’9ä'¦þ+'—CŽ]¨Ÿ4£ ¾xj¬6”¼©ž1­´y’&ÚðÄT<ՔЕ#â]Nd¡«w篲ÃÄì9Ê&+E¥a7éôÛ1-ˆ›¥²´1ˆ:3Úž0Å'Ý­6 —˜cßËÌŒ• L¢Ë£Ÿ}0ÒûYåÅjM¶ÝJ´·-|0²)¼þÛPÒæ²pÓùÝVIú„$0pPy •jÊní¥ôó”‰6Úy Iˆz@»™èrÑ\بV©Œ’¿Œ=hFé¾ñÓæÞ«íÓýW/Ÿmíî¿Ð;>ªr+O`ƒŒVeè86AɃم`ËKæãöBC†Œí‹¿*£ ˜«-»ÛmÖ‡²u]Ú°sRÿ"ìª÷©“ï÷Üý¼KñôÜOÀ‡û•Ü&äàc·×Ûœ±é3pÖmÃeŠ|lzý©z8"Û±“*²Ü"ó CXbˆ®³eÛ–lkaU2G‘:½¹×ë½öƒŽèG”»ÀOÆXFl $gïÙÉËÈNÄÈ)QBšƒoÃæhቧcJ<Ù-ýxžÎgdH]ÏXÔÍl%z»¸ë¹Sg.ÌÝßÁ%º)<èE]Þî!Ø?LÁlvÏNý}¼_þ¤‘3OFyyãôŒ\ÙìÁŠGvF^NKT‘¤m‹]- "Çl·å·ðýˆ_»¼ºXé:ùGD²Òð)Ð3'Ò2I5q5Í"å2sµKR õÔ+•Ùx­²H™4j‡²z‰—P‰²ÅÍgízã=|Û醬§ÍÓ÷ñ5×£àÌ»KÅêúPÅX|ð!8ª­53H~¸3ôZÒú‘´D†qŽÝ+x&䔺¼a¡ë$ÞEÅG¿T• ¤^¿«s UÅF~9(Ȱ_ ŒiO«b–Fú{Òé§ÑÒ§Öÿ¿¥N¿%5ÐÉ}©ºœ÷ÕxÇã Ï㬯/l·`©J ˆZOÍ{Ê6üÐ8żGo‹ÎÇ|Lš5L®wéõ7L‰€ß"R›>oU·_=?ˆ‚&pP;ïë«ÖquQ3ˆÿ}Ħ9šP ×!>:§¤£V,>bë““5Ⱥdè $cEÖ&«Êb¨‚(¯tÞ σ~7â·øWø]ð@ˆê0e“’-5&‚Ás±€•Xá»îµ0¡S½sæþ èátˆ,Ô➦¹ï Üæ|*ï22?%gRGÌÔÜBPýÁ…þÐf§Ä‰*Q4qsŠ›t3¼µFÕA˜DÁ$]Ie‘PÂn´ˆ];4Øû$Sè¾ùP”¼ûƒøü]5ê,T…×=fLŸ£¥²bšDþGSÌÓSS_\—9C¾ HñÅ4dº”_\H·js•mÁËëðá‰)Á%å$¤Ÿ¼iEge€ ¯}$‘E«Y“2vÐÛC-€ásÙP”E×C–! ²6dB3d˜Œø›æ‚DŠ“{¬°°ªH6QuºÒešMÖ…4jÊ`@Ô”Ò¡iÉ^Ó¢75þ0 < çº}å4´$wWÕ7)òo™/€žluÌK?nh4vyÎnÙ%Ùÿ ’ºÃW=¤\€`„Ïâ´…ZÎèXK»Ìá}•£Û…ËfazŽ^n£D‚yÝHøûûÛø9­'ƒ5'«vüò¢ÝáËJj÷ÀÛ-(¨LãJšLRR=˜¿¤¨I®lEES2¡Ó‰¢)á+‡Œ*ƒLQˆSÒଭ§SGO–ŸYK¦™á )O:+Ÿùö¤€ø©Év*+Ê5ñ7—†ªnMþ°S¥>[Ó§iÏÚ2ù³´ª5<†»Ø°Ü±ËvÎrçÖ¨w}f=Î|©~&]4ŠT¸è8 ôŠ:ÿû#õÝN‚¨Ú¥ZßP’´­i¡²!‰ ÕÃGŽ“AGIqµ,Vqr:÷HmËTƒ&S© Uг*R’:ﱄ|dÚ$ÀÁ÷EmbòÑa!ê¦ŠÄ§Š˜!e èwËþ.À*—¨ûàPÇû¨Äú¼sî(¬Ûœ6™¼dz­‹q‹:Sbòjë¢d CÙ|Kq£fˆ8F2å9©»¹JðyoEO “NT …&ªUt_ɂФA/“]CnÛ¡‚Z#M±L#§’Xù‘gd§”°‚âÀãåÂÀ¥"¸Y±*ë°¥§ø)3Ëé/r¡R4Åw5B·-$5fÌ5›Ô$¿Ží¥&ªÌ5œÔ$g9#I„‹ž@-~Üå£Ü‰3ÏüR+u¼ZÎÁRÞÓÑGì×Â2±±qŠÉ s¥Gé§u ýA²¾Þu`É+d¡({ z¤qƒØÄùl×ç{ÿ'´úd¹Ãó?K‹Ë®ÿßêêÒìüÏ<¼ÿ²´ý:»{C'€a×êᵌ©¶†ëj˼Âa£pgï§©|[1^ø«¨ÁK}8èAr‚㮃sáhN÷Ôãúùåó½`Ðëµ]_ £“=cß§Àhô)¢ÂãGGž;*têÁIàî2 Ye)2žZ°åœTv-€]€ZY"¾•mìWê ‚dzKX›ßõ rm >r«‡Àq›¥_¹[=vÄù°M°~ÐÔš&gòê,îÔa¢iddã°C‹Ü°ëp„?haê A»Þ9kÖÚI [½ÕK; ùTâJÐ-§ƒzÒÍ…4nÅ):ÈðÕáæÑæË +YQ"%ÐeÒƒ ÞÂb zÃþÂh‹x@ûŠy¢ ¹rÏR‰X‚˜$]fMPß÷†yOTd%P-H,⊆”¨ßËÄß0 .àŸ3€q¦jììZ’Á4u ãñ‰"©ø–͸õŠ®j€¾æÙ"ß\#9Ü2áƒeŒ—Ù$ûWyäü_CÏ\¨V+K«·zúk¼ÿÿªuþw æÿ•••êlþ¿‹‡çÿ£˜Ý;â þ§×šË“.OçÍ$ÑC㚦譗œÒÛ½z3(µ†ÐgJ£SúaŽöõ‡i“÷ºJðUZ¢0MöS´…—ÞlQv˜Ké]ë]éíÿuK°"•ذoý@N)ñ–ï®\frõs˜4hk ‡÷Z™YÀïõ~Ñ7»‹^ZiÔaNA‹S;Î~˜S¡£-:@H¢-é“ü¶66ZxK23e½õV+›:23õ•éëîãÁyÜ\€bôßßv8Æ×WW Ç?Ðø²? é«8^6i\°Bî²^0Þ;Ï"øÚÊ♽ 'w±Ïðèu©ˆ_D‰·_ ÚEèÖÓ´w ][çî$çhZ.ÓJ\8ZÔžNÀb%tm¡Q(†c ÊÞ#/%kÐÑö 2ÄÅçâÓ§à´ó?OvvŽ·É“°°¶$ÂÖÁËg»ûäò½§4<ÐAïoül¤»˺³ ”ÀóK­„"Ä7zqÚ ÏÖôï |¬@æG¶Ù` Å\Ùþ¼ã> “4Žƒ~£å‡œ¢ÑLT—·œ>Ö ÈýoÉÙè »mJRq®Ê‚Ç|ìKn‹Ž$„´¹êJn;‹,EïÅÏf4‹žtf~FÁ)_Öû3©Ô”‰©¦ƒ^_\t/Èg©÷+ƒ0$еÏ"d/+C7ŽÚL ™œ„€”jÀÑê–É0n»¹Í˜…)ä§ØóÔÔËe™y-F´!Áò© äy’èŠÝSø?²J|ÒV(S`(IÜÜxƒ†0w@ïy_Sü”:I†öOQÁr´– Šxy äF¹?(ëŠ!\8(ƒÉµ¨ã…”߉±|‚Ì>‚qîk#øc)»ƒIØ€úç)¯µ9þþ+ rþüàç}Ši"¤`½{>„à“4$¯iŽÍϵJf­—e?V™Ñü¨åÍÁOÛGUàc0æÁãÖ  Âa6$³f£ ñ¬ßÃcxÑLÂI:”_ã=±qhȱ´!E">W•°áV‹„ëÔ¯6ÛÉyWL¨ªÅ?+ñöóîóí}CRâ@ü!¤š–“?ìn±˜ Bœ‰ð¬×k—¡‰ÛfeÙ½].)$p]^^àW]ØØnŽ& ±ÓOãf‚B-ãhs¨h‡ÝO(óOŸýûtóèÅ1q#ëˆ& – fh ¦çCÖËÎ{:ИHu¸PòÍÌ2Ý:xµ²}Ä^ê”s޵g»'S³†‘äGòç°'0xöË3 ,ä-ê© #t’®‚-¥[³°›ÁÉâápóù™ÔôÌ M…½–‚΄¤Þ¦CPöêý~ÓcœF Á®ª‡S¶Í=¼Sàä ¸«OÄš­³Þ0m°|9o÷Îh\‹c\²ÄÖf»í¹{t‚¶ÔD‰6@º@]O0B.$Lˆ²¯;¹o1ÜpäÛlÔã;tº‚$íq ]”bÞô"þtù { M…¼u¥©Ö0´lg°µ±ðRÌgÈ索|a)g£A¥Z¶«QÐ^b JjW¡,âç’‹&”µ_jÚŠÓaÃ,½)s«Ó©m§>šø)€­1²à“5äúÞÛ²UÅ*ófò!U›¾Gd#ôšúâ‚ô^Š•Pö$À?Ô[¬ŽÔj‰®‡~Õ—¤êW¢íÄ„öÐl¤fÚë?C‘.—Øí2U}:µËÚJM„êͧ¦A=ÓGÓ4QK`\u1¢ü¥œ½ðÎ1tÉKÎ[Ð}di6†ëbŽ‹¹œ*æÄ7t=$Zv–k²å¨žn²B¥/%\ˆe+ vYë‚Bqck±×"ãù蛤 2Uî4 }:ö/au½ëQǵBðIé ¥FàèµW‡‘šö?c ¾kO ѱ¡¹D %8JYñe*Wt

ôÝP³#vu£QÇ –ª’²oJmgÛR§YŽÙëYmÖêOè[žÆ‘̉ª²NK³y¡®• ‹MS;€c·TÓù•€:÷'X)³¶4¯t]`–\¤i€#—jÌ-*†¸ø,ƪ°x¦NŠ”ylb‘E¥«5`Ò5^¨-ÉaóØ3€‹Æ hÐCZ2+5yÒm¤´BÍ+]­’ŒÖ5–×­šc='ó ºã¸.Q0±R-î ¾ºÛûÇ®ø –øîP0—_<PS=ŒÁÀIZÁŦΆ­VÒH°‰û4yÝ›¬}¸`“Žƒ=5hd%C½Bii{CÔ)uUá8êñŒ5#eÄXC7鎃|i u1»*h¬â”><†µ/Žc³v²^‡ì5¢–æ3n§…á·ëJÈ€üÈœ¡q9oº’j")åŒìy=´¥\âÉgt¯§©—™ó>y<Ž·óØÕ´![Å…"U77¬üµfVÚ<1)a…p¶»Àü¼Ã»ÊªYïÔ“vP‹ÊMc`n–B»BYÊ Ó€ñ»²—7²²hh Ée» |ý£ÕA–£ªeTÉòëžàZPMRóå[¨ÿ)ëLÙE[žzsòjå«ÌÝ8Ò>rÍ+i¤ñ¯FQ”=QY \K"Jë2b•RÊÆ{âTÚKô./ØkÁâËH$Ï¥|1æm^0·Lfg•G•É.ΨêÈ y£X¢dØ6f–:Ý21Ê\Žã_ÍŒ²|ÅKe-ÍÍN·à0l0ØŒ ƒDçò ‡D!?é¹{Å|f£N¼, ±=¾ò3OíՋƶ«ž+?“µ_PýfuÕ§(S…¾:t*qD-¶Ò8þ-ÆÉK‘Õ[í«ÒáC"ø±gZBj¡¶ñÑ^CøÏÂ"*Î2‘@î dý÷Yý1õ µ‡¥‚Ió~/-îï•-Ö2-7ã¡Å´kšÿuj»êCÖ†SRß+Òsj‡Ãã›å™ÌÿkZÿ¿,9ŸÚpLüÇÅêÊ¢ëÿ·¾>óÿ¿“'ð:ŠVþóyNãÈâÇi'éöÚ½ók “J­« $U̶9.uPjƘƒ³òÆyIËÀK>ZË#t¨ÍRq Ÿ$±|ÁêdJ*grŠ‚ú©w“¬C÷ëìS×Ö¢ ®œW"Ÿ·9f˜þoñ Qá<È"ïÒ¡¨2”ÞA^0~'bÏ¡C%yÆ{Ôâï(H¶q.=äyØžÄéEùmꓤyOIönL¼^‹c-ç}¬¸V¿°ú,¯1Ããqa½3-NeNâiQ ¶z6€·é&­†ó›üßÔ™²Àƒræ8i9N:^‡tL)ëŽ Ü+G‡Ué¼Zÿàæƒ”[O‚vRî%Åè$>l&= ýŠO÷zö Ï¡ÛHkÍ ¼ßf.o3—7ÁÅÌåmæòVèò6ÑÙ†ÉýÆèJ£¥µ¸²BÐPrˆŠ¬˜X–§ÖÅXçˆ<Ü3™ÂEÜ& S†\ÔúšZÕ@ ž{9°@&"8poð,=Öß ×ÚoE‹©ìp×ßÇ"SRzo™£ E’nijÐ`‰Œ±ÄÒF”M­8MP fŠê+¡Ðlg Ô,U¶«=ÞhóßønKÖtÔé1Cæ¦+#ršWb[ƒ4p.X)Ô»°«QÕ‹°'Pgô&TùÌcsÀ,”mñXW(žä6“0…u‘2gûãˆh ud³ ù/Ù óe&$oî"8D v²ÍÇ1¡{Y™†¯lc“pçcQµ˜n¨PKèÁeψ÷QÎ &G¨‹Ž Z‘Rƒµ,§+¡Ï®q2üô†õ·Ì´ËºãFÀ6„ Ì.€rš2Ú&0!røD‰c iHi:“ò£QJ¨I]wÎ0CåZ[¡fÏ·z|ö¿£íÍç/·o/q÷?¯®­ºñ¿àÿ3ûß]ÒœKÞuš&9kI sX¯‰Á®D°µDå p”æ¤íQÎ\2çj’™mÆSÐøÆ'/*Áª_xg †ðâ*ùzÎT†Œ±¦l†tDNÌ·€ Ô9¼T»à]ÏÔ†£@Ú0{iržt3aâ: Ùûë T R*sdË5ú†/¦â\9ÀX¯c¡”)™}{ èKiìm¦…/0ùÎ Qe;KѳS»HçSü Û Sằ€[x¹3=JåÑAÐØn#ÎhS=Í‘jòœa(tFÌ—è[zãñɃÓ[‰rƒø+ëK³øwñŒkÿÆ|Y@MïæAÁÆÇÿræÿ%x›Ýÿv'.ôûRà†93ö(öØú$3ýSÔ–aìr­®m;òD-xqxä±Ðð”Õ^èÓ>½†°/*¬~ê8‡,ô{ ÝžåÁ<>ù§Ï,doÞXYå1òYyðy1ôGZôŒÿÌ‘…ÆâþÈgÌø_[\_Îÿ•õÙø¿‹‡Ì£f‹Mï­œÖBcžvý~CÀ*^*èêÃö¿ßûŽ ã-„¨éÑh‰S€¦ñØÛ þ··ÈHk+ g쮋¸Zp€ü§ì T¿‡ÿ‰e1íÖâ°.Š:ðúýÿ¶æ1ɸBT¨–FŒš)ž!SñŠQ›ã›+ïq°W´‡]Ag4øâÑÞ»»Ž £‹¤ ]‰I œ4 Ôêü€8AÇÒ%:&g;‚RåJìæd(“äç 3 ¦oþ7ë·¶ò6[b¡  °ìn?$ñe¹bÙì¯öw_ZÁ};0>‚3¨‡6 ˆ·°%%A22(ÀÇ]ì?½K Ñ¸õrpÇÔ[âôG¾ÙÔ‹h…£¹úŽš_¶ ·©Ú¸He62Ý)wäÂKÍMÑM5a‘éÑÅ›T6\ò/ø:@§',˜øq!K~³|Õ'ãfr¥›á2¾-) VËL‰;Db2ê FA¥RùßÞj%`‡›¤Ûhñ\5^,„刀E`°©¶2  RÚ˜Ãù7ÃŽ¸pàÂC-ÇM޾,—0Ûf‰¼ù þpCQ´~â’gpeD;Ý„½fs6oda |Iª+æQÉgñup×DÅ•auv§¯\P¯‡óÚ5É"»¨èOrøÁâl ‹A¦Ÿ&H@H¬D³Ñ€Åz¿×AøÈaôhé-ßV¬”TêÚ[º% ÷BC2JZϤ Å^ÿZX`Ds0rhu€€rÄíYT”?%‹da¹¹¦ Æ—1sü€¼¡Îñ!©KnÍ~wúÄWÙÈâ˜êœz= ë3ãi\o^à–6HÛòMnÌNr~A2HÒ y:èD²ú‡Xtþº=À¥3"¬UhÈ™û÷vIY†>„æ…©F}X_Rím‡ÃqkKM•Þàp¬K«]Ô„3ÃÆž>äm2é Cßy¾U}«¾K¾ËæG‹#P°­-˜–'§–‘}4‚`mBRnÀðrÎÔÖ¡ääâ¤bî;°;½R—[uàá/ùÍK=~Ïû œ Ç^à ÍiÙLq5È}w¼õJ¢¯­DX‡z+Þbô9á[céWÒXT‡U•²M6±¹"n5ÜØÁJ8ެȭÖÐâòMú¸ya¯Á–ðŸå·š^㘤‘07 C B9aÞ # À±› F ÃËádˆª¼Ër™ÜUw‘ÀqOý×8ãÜá5ã<Ô~ž»÷Ö_U®UÔ®¦ÐJq{°ÓV¶Ä›ÔL«úÖD–¸/úé¸ê5ð„3UE”ðÆy#N`06>•¢ã±aqÇâòD#`ÑËF1pou ŠÍpáûeÔ}Xä¢"ÐÙ<²»‰úÄšyû\åΞ¢gÜúÿêáڬ˾È0fý¿¾¶ê®ÿ×—gëÿ»x@*8M,ãänyv.Ôjí5á€F&/ˆ9¾†5@'ø)Ø|¶+)ɕѡÄ*ìÓúU`<æêÏüŽñ‡HÉEÝ®,qÏ,\öw)v†‡õ¤µAáÆnß‹Kz§ìÅm&&.žÅ®žÇËs–Ã]š·yåâ.OŒÛÈá®LŒû0pqW'Æ}”Ã]›T\ãi\àuF»ŽÆµš$k¤tBrÂ|—Òª*¢0JÒ(íàÚ}ãªÓY\€Dú^têVL¾€¶„¸ë×Fûò]®¼~Ï"»SšÒ¸Ý\ŽV—ÚF>ø{ìî&ÆŽkàçŒ,<¬ýïñߪ‰yŒ&µ´õgà6úe’±ÒD–%k¬p"ƒÓ‰r-[“Ew]„í("ÊDTñRyX¼ïÁÄT‡|h0 ëØ†Ù…kŽIiÝ +ßvܸl‹MT×ÈdÄ~µqÓª¿9¤‰ÕؤE èwÏbM­Õ0Åœ®­L¶ªNãvüï\á,aqšÉ¯AŽç?f¾MzÃ÷qìòÝdsÇ^ûc[åÑIšø¾z–õðuÙûuÅûuÕûuÍûuýO¼àÇû/øs”8µŸ‚´¥fx=7Âþ÷V›^L Êæ vœˆ:ÊÛ9“Ø¡\krÍcŠ$D3Â> ÿqÀÊÀDt³ —èßeúw…þ]¥×èßu¹ÒÌ)Õ>×F±8<ö‡ t `5;ÔÎX¨#Z*¤Äåƒu¼PíCtƒQBuh§‚rÚUxðFVP¤*!R$Ÿ‘,•¬|<`áx‘¹ô¶aÇ Th·àî>á"|Ï[þå(Îìܽ{ðÓ<} KÆ)ÎIUl³WË@«oGZBBa6›ùΨ̩‚[7˽àµ!^à]"™F±@[ÅT{sD¿uŒÓ”L…ÊdÎÞº6·ò¢½ ³éùl¨³äûÚ({œôwgÓ},¸I'ÓU[ÐÚî!ïò‚ìüeÖ­]­TÖË÷4¤Ü¥ ]re¤×†Ãy¡•à6} 3T^© ‡mbt{å‡Q™ÒW(Æ•>´<£IcB`rlQíR°(ö£(W¾­Ïë-´ˆ„RÇg=ñžhn ,²ºZ›2`d‘kE8 ñ¦u´“7µ?Hw  ÝsF'N•}B9q—Š˜#%à!øûJɺ›ñ÷N¶7øÎ÷zãà8x"Ci™e«1n¬åžéÏ3±1CvT´ð™=ÕðÀË_1ö)LjÓõl „œaàIö—°PÄ]âË n±¢š½X´#Ž<1™`„¦ÈÞJ¦;2ý ~ofƒnáò02Ò·e„1Çö‘€icœ-Gj‹±ÏhûL1ÙÀ±›Laœ˜Ì:1±yâ÷çŽðpñKܲ‰üìõ­Z@OçUÀz3ÿÐ똔œMóÁ5->ýK›Éü ô"æÞ[kã\¯fHÒÕÅv˜íd°Ûe?Ý®ÇS€í.1šq ïZþ4 Ì<&^ oçœ ¸Â‚ ¿6"ˉEîô" ­f𷜓õ6Z¥ÈµÌˆ&A ËKÔ$ˆ!ëA,š,† ŒÕcùÁî;އ‹e]•PcªaÕvz³ 5¬l&îZoÕâmNœw¶%Z6MÔ½ßÏ3ný×ï]ÆéBÿkîÿ/¯,¯»þÿË«³ûïäA@»‰'Úÿ'ýíƒÃ­üdO)‡[ã&ü{sŸHËnäÙÔH=[©gC#õlg¤ë7Ù¹ñ:^ú<'mJ÷ìÜ´<û6-O[ž¶<ly Øò°å)`ËSÀ–ϳ´åó,mùÑyÓªFÐÍà¿eø²l­Âkðß:ü÷þ{„¾Žäðˆè ÍöÖ&öBKH DR ’‘t]n‘?i‘æ4Neœ@9,ÞñùB¿Ô‡i=1‹¯Ì]e¾¶Â»¯Ž·ÉÎ{´ ?~Úv|OUÛáÝzc\:uŽÅ4Ï%MlÂrYùùR‹ý4~ªÊØ¿žd/ƒuÒªJMk´õý\'ÎU##¦Ë×áœé0û—ðqú_§þ>†Á°P­.V+k_bíÏ?ãÎ/WMÿϵÿY¬®¬Vgúß<¡0Ùc䎤c<¾ôzpBA†4áH”½ôšt<’Ï"h1ßðZ*ý€Š_€}(hál×Oa•–ÞlQ¤Uz×zWzûÝRù…½Q Z?[/+ˆ8–ï¬\fjõsôú;r˜ÞXŠà÷z¿/òƳþücõkúDÜf¸Aû¯¯ÌÚÿN§ýmûÛ‰ý†Ïôí¿ºº¶2kÿ»xdû½v¯þAÞF<ãÖÿ+Ëkîú¿º´<[ÿßÅÃëÿ—¸ŒæÕzœV>Äi†FÛ ùEAÖã0—1]ÛÔŒI﨓ÛG³W hÇèU·ÕKC¼P½}QèJf3Ý!…A?15yÈ`­Q€Œ.1HÆñ4tG ZñePoâ/šùg|NhëeEöÙ ôwèµÝ_¾oÈ4:¥@\H÷ë¶êí,þÁƹèeƒ…qߺu¾þ#Æ|5ˆ»Ù­J}ýÜDÿ_[Éÿ»xDû½O>7hÿÕÅÙúïNž\ûw{Ïãvýú¸Ýd·¤ Œ™ÿ—Ö«Æü¿Œñ|6ÿßÁ²³Ç‰˜¡ë0¹·êÃö@ÜÂØW^vPöËdp^ŸêÝë =&È¨Ë µg×ê„î ;ë Ókâ½?|ÈY“"…b(n—Êúõîó¸Ýޏ8=œ~Ü…Vh\£¯r¯=”îż°€Qì)®¢á‰²otçp7Øv÷OŽ^m¡ÿÁqÞŸoïmþûôxïàäôðèàpûèdwû8¨Í ïËa7¨»´õ®|¨è§Xt¾Vžç§ûûÛr'*¸Û3jHl²~°í££ƒ# ŒÓ´—Š $ÔæÞÏ›ÿ>VPè_ì¥v²ùÏí}MÍ€IСt®z(t£ègi½Û¸Ðúh:;›{{'?½š–º%+ZsšŒ—ˆžî&!û¤$nè4e+á¥âP•‹IC3À>bé§}ð%2õ®¸’IãN’"ý‘Ò#”u—õ´ù™"óó1螘ô¾ˆ3×'v‡í6ÞÕ¤+ zݧ:P0>Ýt~éãÛ±Š4±Õª‰Î^ÄÞ ¹×—Ü&·x¿%²göS唄Ïg«N·@ß=oX§qcè=wj¶AÖŸù øAjå¦Ùë^›ã¸Ñë¶ÚIcðÔ .¿}ÌÒFÔÌH·ûMz¼Ù-ºœ ·-Ýò@!~éôŸúºÃèû äø#@DúûgY³V~º¶D—‡iãœîû)®¥,œTÈõÓ®ŸÅí²¬Ÿ¹¹ß‡Anþ7dðmå1zþ_YY¬ºóÿêZuÿùNsþ—kr”´pÊ…õ8¬Ô[I»mNýHGžÂE{FW|àô cì<Á{KÄT½™eÃNŸ/ Ù5,Žt¦dy ¯C¬H7TÏœ~Ì]Tðu¤Ø¢áêéz»“ 8d5íŸn¿Ü=9Ù>âÑmÀßy!ÆûF°u°rt°wЇ N_mþèzÙ»&¢~ 2­ìŽ@ÀóF‡ìqåÐeæPA™`æøùîé?^½<<ž”(‰Ì_STºHéù"ê‡0oH~¡®÷o‹îfÖ‘#q*âEO®>6Û…PM|öìxëÇíç¨äi¿R»ïP&Ö×mMkÎÕ#%C Ô.+[Ö·À7ê Ö×Ch}EæT#[)ÈÛ‹´Þ¿°¾nÂ×Í4­_cQhR'í³“áíË0/$Yc¿¼ÌÎ+”–ŠF^),Òú”bL÷ÅK z0]´Kº ß_›Æ­ÈmFêi‚ª©ŽÒƒÌœxînŘq9"Á§`g÷õös•eãËB*¤­äŠNmò'—g˜9Škô8×gG›û[?R¶‚9*:‚D*OCnzò*Ʊª­(‚ÒWŒf¼»ëós X¢á£»˜+‡§¤›_TL”¥Èqksÿùîó;Uøi4¶šäÇ ×nîb¥6Sᵪ4XÁS£|ÊAÁ „ãéðQÐ¥Ñi±(»³Ø-ÿt¿«rvЯ¨ä-ÞmÁÉ¢äbóÔL’íÔÛíÁEÚž_ Ù*ã÷KF=rÆÙðÌÈË#RõÑ\úRÙÌå™°ädSå 3¨êó[œöÄqvqC¾«3ÛBcK(µ‡”bVð|[ANØýçéÖÁá¿è[ ‚ÒÒꕬ™àô/ ²¿4›éA G¬a!NwäÍÙ†M‚Ǽ¼`"sð€î‘¨gY¯‘Ð5 Ôg+"Ñ8¸Ù »ËŠ(xcv±ZÒ„Æ Å©FÿVE§©;–, KLá­ÝÃՈ囌7„’åIþ}Ò§û›EàhÙ$Îi~²˜0?4Ñ9¼¢dn¬3®RžGÌD=8•ä: M)”âñ<‚¯óô>çò~ð¾~¡~ÂAQ.ƒóa4ÅAŒ"ôBÈé4ÆË^Pg²yx`«º—(oÑÂ(/ÖðÙÎ\ •D¸ïSÿªÀgÕûr}«âàÛuŒ û†0±¦^n‡ô,ÇÑ©ä&7nÙUM?I#j>OuãUl4Pפy‹:’SlQdb(åóšÚùˆa{\Í»Ÿ§£ºó‘+ù •Yì2ä·UåqWŸ¦´JK}ÓÙ<š ‰O9Äh`Þç1iÑF^GÐYÊÑ©J:ÕÜjƒˆYm©Yÿdˆ:BpszZ*/÷ˆ7ožJpæCŠ› Õ@S-”‚Äà’  ¡o†C½ô4é¶z¬£•ᥳÆ:¢‹-7!\QA³l|E·Ô:Õâ*,f¥²aΆX*l:·b‘%“è5gäͣW-1ìNCvìF½‹j+¨+ÇÍ„,v™xÁI*BT¯Ðƒò÷†ýеHž…ô‰óÂ41s*ÌÖÉšŠjøc7êà­–Ü–x^qö‚jöŽPMm å¬B „DŽù*礮Øç¹q©,UoòÉ Î¦e²híONG[°r¢U3v7„’QL f(€¹ £Ñq?†yù\.* tjGZAÇYÏxç½*oUh=*ÓòÆÆXü zšßª!Ä ò ð"ëIzž‡Ú§€ÝǾœš)«yªœždáÐÀuò?*¤K&ÞŒ²!±ÃCoüG%É€¤¡­µƒ¶7øñó]2ÃÕÐ4!¿]ÑoÆ4æ R5¢äBÈ‚úÎ'}|ÕÎì,b¡¤˜Ã¿ŽÔb(,oÄó‡„%›$W„Ne*‚(9’D&óˆP.kT¬y«v…ÙÄÄc ;”Òó·"¦¿R_œ¿ÎøÅ½qþ‹»£=_›‚-¶Ôåž´¡¼7¤4 ²ø×aÜmÄURéâÐK;п ñ“Ö@˜yä ; lzuÖèOD®"vÎe§ãZ’·âµÜÏ÷VÙm”—mäo„¤2àÜïú,tkìíÊøÅ: øæeâþ( о¡d=oxoà£6ç×tWG¾&Ï©ÃjÁðqßNŠ,«ª&ŒYˆÃ£6>º9«¶™8{/c°åSæhÒÜóæVð—YKöÈÒ®(·7¾´·Ë˜žáŠÎÃ7Çu3.Èl¼þÇëíR{¬œ¤×A3iµb2HiGòÍo"Ž+­d ú#•³^ó:§¶„´ Ä$´qÃNïC<Ò˜ˆÛjÌLæu.9ËN??( “§c"‚{ „É)-B‹T–‰Ì©žXVåMµ,'ãåŽÌÆçAðJì6a•$½af‰R¹ÍäHÓ·zÈ½ëºæuY| ó¾È8P`56Ê6ÀëòûVÙ”ÖÀo (‹;+Š©4 Ðm5¹Ž]‡X+ÞXzdÜN@pÃÏý^?°•Ê·þ•;-Ü‹yÙÛò†WaM2¼'º_žŒÝ+y€g¯^àJr»@¬ŽÓ »Y½EVWú’c"O‡.ãÎzö¦««[ä9¿Œ#´Õµ7rŒt#c )iFh—,Ž0äÝÑö€«ÄÜ騹р¹ñ²|kãå¥QÁ“ ˜å°<7ɈÙm‘{:% >“´<Ê­yÌÀ×iÌá­ƒ‹t(Tôˆk‹v:ÙkþZæ¡J8nèMÕË—ÉÁ…ªÝ¬BœÿÊ,Ï•­&pëÆâJ"ym3rÐôú8oŽ˜VHƒ¦±¢Np| ð7HhŒèS©ä# Ÿlõpcâ4RËEàO{8ˤÁ$èáï6.ÅÃ]›ÝAظv- U!Tq÷ •5Ú'8Faôñûj…Øl‚œE‹¦LwF; æ7W)½–PúÞ¼ÍWØ'ÞC$E²Hz1uÏNbQ;öZΣ£q’fø4N“1Ö†!5@‡¥Åˆ\µ¼|>ˆ³zãAÎæûž¸ƒY4cŽpˆûjì'Þç­¹rðÿ|ù“Ã\èlã–[°åqcCv% Ý錚C3EöÉûÒª+¶m%ZW©ä€ÇžC޾û;ÑíMî×£AcËpNUNÞ­ç‡9Î%ç—Ä Ž‹p$Àšâ‰1>cmÜ7˜‚é‘w_‚ÿÇ÷ØåPPxèñ=Òm¦ò$C¯4c âwn´PøAöúÒÉq†kxX©7žDé˜Á~Tæw‡4ä´4ê`Ÿ$4÷x‘%{Ôdñ`³ÙL±ãå˜'=Ž0¨9yä½SßPïp ©Þ¬.ù‰a¥µZCÞ/ ì‘IÛ-¤¯‹9Ó=âÙƒ©Pµ]E®ú#i`‰äB^ÌWA+¸¯lL4q+·^ÒfíEw¡®HàV2ÝõpIØ<¢uºVé蹓Xÿ.è–Íñäûö¼1Üäcu+ÓÈì6¶ó‚@B‘*;L¯1'¤y“u1 ä¸ÎïCöÁSÔ):®9æ?KÒOdnøUôå`Q‘Ó2Ê=}ièËDzçêÜñ°O÷JˆX¶v3´ÞкWµ>u{z ƒŽ¢~ïU7‚ÄF¶ÞÞë|vqÖÓ5ÂØ%쩺·d°bSƒ¤bj{KÒ^Ët È1·y”WŒ¼[ÖJoˆaáHÕ´oiî"°Œ0ªx’PŠöªt †N!{t&½4Þó*ЩyàÅ~§L—ìoIaÝ;ÕåÔTýÑç¬Ë+%¸Õ¥¯)t–Hœ læ}TI×ÈOÅHüVvqŽ4¾éÐmÅÃðHÀD{"Ah•›¼³©ùO G•ÜLãrm²Ð²Ü8±w!`¸6“dË7u!ÿ?ä( oÈ!Á³úWÝâîÒ‡i6{[@‡å^ßH²°sz_qe|·R´¹kO°á«£qõ„rÜKË©­‚GÉíÖUh·—@ÁÉJT õíZ ½UõɬMÑ26¢Á-H8kBC×Þa‚¬$ø%z*ïS •Ô>»ËFiÆ…Js…å«Üu]•a¨vó%þc¡Üððé÷&ë ú]PØÏtãÓ°šÈ拊Ìü;ß q›Ý:OÅÚ’¥åx–o²ŽŠ ‘Q¬$—c¤T¼‚ç*˜`$Êã'Τ^X¿ü„úp—8ýþ×L D¡œ9eª£zíRaÆ©»Qî%·UY+ÒyÓ(êÄZ4,iÉZP¹Š%» J;žÅóÓ‘uÜÜ|M¥Õžæ[x,R²¦Vl_¡5`ŠN<ê.`ãµ%X×e­ÁæXi%W|ÅØo ÅY,PÿbÁft/›÷ßÚ2g¨X© ˆ]4M7L¾«Š–VË2ÅkÓgC}†v«×¤½v¥ó~§]?ÂRsØé/4Zç õbÙ7ã~iR;téò"Fs^ªv)Œ3<¼x M$A2è_ÀQ2ŽÌ`xgPÞ¶Ìúã½]9®Ÿmo¾üØŒaIS•@£Ði?T¨7%÷<é |¹>5«*}’q€+(Ɉ â.^ܵºˆ²+=âð~°% Rîâ9t¼Í­ÀZþ‰!ºg4ºÁcÀfWu:]Bð’˜T0Ëmlð9,ã)x » +eÇþ¼Hë‘VneéBY¯øñ‡¼aÃ^@JÎ%=¥uæ*Ë­4œ†õ¹9š“/_rž•8På*¾€xÄ©¿^å"ñD“Ñ«Cª;DX`ÓK.7L‘h!Z¦•òz€%oí´uà‘ÕHÝUØoÄÙmœ)Ä4Jit\ÂçæFEfØOi"=lºŒÂTâ+B'»Ï”¨WýH-ª°-™×¶$Y`LWio#HxÌL7 ’÷ä‰ÔŒiM”‚öˆ:2s|öô o&&ùœ—0>FŸÄ!Çð¢S ,mßÀzíd _ê„Ê %26¤ê¢!…çc†¢Ó¹±6ùÒ)]Ð0úK,ŽvÖʼn.5™ã3ÊXö#‘'­ê j^Ë ßä¦Ñ' ¡¹±Ñl++> ± @ ¦Wßi{` „•¯¬×´oáZ½ËP•-¼TUŸ3U›àB—4þ9S(Μx Íñ ëÊ+TÊ‚ÁébÙx¤°ÿ±®`©›a.‹Í¬ãfb6ït$œ¹£iJòJÅbÛ=[é¡Ý„)ß µGæüoˆhö|“'ÿKìñ€2r~[yŒ‹ÿ½´ºšÿµ8‹ÿu4s·Ná€t„#ø6ç7ò†ÄšgŶàŸ¬„¥ :PÛÑ:žC«CìnÐ7'Mˆd7ñw+ïÏøäãÿ5“ôAÏnOŒÿÕµewü¯U—gñïäAUÀlñ`aaA寫x/ì ˆÞ i§.}i) à‡8`dÜCZí¾øñ$A««>z´<‹Ûm\ƒöÒú —&ßcúiù£¢Üy$¸×O(œ¶÷ö8Z[vQO1øÁnã©m)E¶=r…‰››iãBD’é|¶Ìó‡€Fžð@¶'êW£„.‰Ñ9 ÃadªK“Æ€4¡b²àl¨mN$ŠüЩc€Æ_‡IŠ'ç3a Ųñ QÑØeYfa·Ï±ú@nðn(s^¦l¹r8JÒø¼SïgtœžqhI}ʈA"°9ÅÁ8C̽ ~D‰dØ¡x’]ü =¥ƒ~þ½–Ø×ÖΓ‹øZäZÉ—•—Þ¢b™TÉòQÞtAõ‚ÊIëi.šHȰ&`óÄöƒ€7y©ðý Üïe²¼Ó´Z»‹ù.'ÿ?´1ŽÀ!þ¾­°£åuuuyÙ•ÿx ÌLþßÁÛiq¬* £„Ý# þÃQKú^ÿ:MÎ/(åáðË ú€¥<ä²€Á)€Ú.H¦ ßU¼c®*àv猃š ’Z¬.ÈH´Ž‹ûƒ{äÔÞî]²´ó»»ÐéDíu“FpY¿V¬“OÅ€M^ô.ÝŒ‹3¤(·—=aü¢EZ‘t(jRYV7Ÿ5QĈŽ%Ñ¿tgmpXO³øû>ýÛiWÎÓ6À†àyïÞߎÉÝ«.Þ»woíá:þ^Âß+Ëñ÷2þ®>z(¨Á ~‚EAy—£¤ðÕ¼ûƒïÁ‰Dn 玳p—Ô¨y̪“=ê@ai ú†G—q¬Z¸V]”“½®,RíCæM„~´ö¿2’_à+H^`ƨÃ4]ǽ—€í)â‰T—ƒˆRöâF Xuæ9+0n˜H5Ø ïžSP'v÷1`«7ì®w7°t¬Û|°Ûb­ŽEK™p4Z#V¬ V D_nQ|Û h ‡_›–Žd<](ã‚(ÆFÈØ›Fãuñ–Õ £çVý˜J^à ë»{H°ù¹/è{>îÏ‚ï?÷ÒæÃŸè¦k+-^„¡lÊÏþ}m ýp*8xÀ ñÉ÷3@F„Ãõ©"xØÖ‚彞\@PbwÏŽ¼«"‚ZAùëaª8 Rúæ7+wAÉC™ƒ¨$§ƒž”¶° a)àAIËQ1ˆÆà-)ïúf~6j ³æ°N' LlÌa:ñ$ÐéGí ^ó8‹Ëó!‰j’ì”DþSÊÌ.2™B=7ÌðÍÉ,ìØ^ôð€õÞzžFFªâ¸Ye;p–’ìßJTÈ1y|1h¿?ƒ Òq¬'.F"=ÕÎòû`„„†âßz´²‚1&¸^i…ŒªB”#™%ç-çîÅúN{Y8R~ª-¹0Á3Ae».š=±Í ±h4âÙ]MøªE¥Qœ3•ûqV¡ìØ0ÏÌЉ r®ùËs÷ˆ´„ã2°Rœ‰l¦Û´Á„áÃ7ö9 ÕùZ"dH/½÷â "¬6“8µ&ÃÝ~¾éaìÔsÅÇÈ ÀbÇû"EË– ”aw`n‰ ²¡bÔX¦? ’6ÅÑÇ™Š–Û‹vBê£b]j%E¯¡\_FXÁuØ´3*žhÎI¼›¨Tãe,±Ï8ÔÊM1Äw–åqöƒ;ëÃåEæCbkç™°ÅÝ §_€¤spù€‘Î<ì$÷ÄÏVýó@B9kÈð©äÍEìÒ•7 øï´áDÒ$“ýk™à»@{Šìˆ†Pøù 릃Úéy7áœ_¬å"ì²àq€õº¾Já<¾åý¨Ù•ã¼ÝÙòÆ®Ök7#_ló|ŽÓ³¤ç(zý0›yÖù OCQfO69}zü„ø*c~ ÏSxÌNåk*HNi Ÿ5#Τ;ãÝÞñ%'tá,áäQ c00'Ê=±;ç®D_e¸-iW5t9BN—¬7à©„º_¢°B—+r™,Áó)$y¿šø$¾AL¨H– T0dN“P6ì 6£;-TªGgt4)4*¡#ø Ï&yétÅÑ­`HzÛæÎ¸Áb:ø=‘~¾ÕjØOq–þo€ÿÃë‰ð:´îyP ÞÁÛ 2è 3B>wàÿuKåÜH¹(ÃG+é«‘çÃ?GŸèF\?À,ÆÝГ7w3Ùcœd×/Nu8Cñ¤áVÇEnÞ§P8Ê)ŒÓgûgYò³“›ƒFõ|¼ ‚Vð•Kø×»b³J‘ï/‡46~ª·‡ñGȳ&Ï—Öˆ™BË kØ»/éì4*ð”Óð> ŽÏùöá–¤!ÐJ{q(ñ5'Œ‘ü¼åWÁˆ†©XjIËèæì*@…èµ§J½L®üS¹Y»Úª”ÓšÀt]®ÃDXÏû.¨þ`e+\°!¯9‹=uNMÉ 5ÈoRyS7™C×|ϸ„ÍzŒ^Ïz 2¤[ÈÉéŽLùHøÆaÍPóåª%´U*•p…¤tuˆJjˆFB=ôCyô2éʶšâ“Ô¹\¼'©eF8ùÀš!²×E ßgoV‰ì —ɳ×6aƒÒɬ³f×ÑsÌÜ=û8¬­qÉc±DR¥åÎźÝiœ»d¤ü%cX+%lÊFãµì[¸¯K 3×—Ðîý N‘ í©“ÄwÑ š a¨Pî˜Ñ°?Þãl ÿ­vØØØ0’Å7$.|-ï1=N0Ü:á)+4âwŽ>Ÿo}жÒ=-?Nͺá¹i®í…ðòúmŠîPìµih«Ôö$G\ ìÊ nòq12a‚9A˜ Ä>-}q÷0ñ[oíMôäýÿä¯Û»tÌþo^rþ?«Ë³ýß»xtT%lðùð„l" ¨'ݽ÷“ ¾ i›QŸL ôƪq¥èó†ÏgÏŽ‰Kàü&ÙT÷yz·ÀîÝ»çÛí[ôLqKgîŽN‹üÈ 3ó×eàÒü™M|÷¤ÿÎÇÉož,º»rÜ”s“nÙˆ6¾áÕ‘÷î…¾Ë"¥ypÊ["‰Úè{!ïÝKFÞ9÷•ï4®œ·ÙçÜú÷Ø ›èâ—É÷¯píVlqò„c½ö‹"ŽI­óžÎö.rÜ-RäÌ{„f& ô ±Ì†uïì‹ÆÒ²Cû+²¤HÞ+ŠÛ¯FŽ_Ä~/5@ô˜«NpþÀˆÎO°IW $l jÊ€#ŵ]g’i ÏW,” -Ç ÍÝé„=¦5qÔoïÝã‹ uu~gÕ¤ªWY¡j{‘±˜:w(o4µ ÂAjìbÜW}¡L½Ø‰Xvõp¡2Ãt£&äGèD +“Ã<;5Å.›#lòaEûZ#ö rlÞø.hlw þ…1\Dî÷ÆnñíÊàVÁ½qñZ&ÜŽ¡ÓªijsOî(Sgp£F§QêŽ`ˆ)IFÄ ±¸6ƒƒŒß»iDY74:­âûbÀL°5—t­`9VW)ˆ¦¶ˆnm*ðaP{O·„¡fžý÷Ç`°‹0Y †Ñ´º.âPà3¨Ã@8-é¤e¾´Ã)ȧ¦øTÊ »Ë4±\㜰…qï( PpXßAS²Äâñž,ŽyP=0â,Ð ç9 oíyâÇã¨óíjv³ãìJpäÏbÛ“mÑÙë{öM¶†Qi´}×Ðè옓÷|óÖFÙœI¶(ª¥g~cMÍÍ'fìÊ{Á$a+ï Y5aÀJVn“%wc°Áž]ì§fÜT­W‡-‘öNÃ<,DHÎ<ìšM[·oÁ.|{ÇèCuþw~‚~¬%Ö”½ú ¼ 'GG4›¦#¸KƒÔìtûÈ'gÿUQÃØ_ä6Ž9ÿ¹´¶²èØ×——föß»xB>…ƒ'"“ALÆçνš|éRt¯Õ¾M/ºâûLžlÈoØòYÚØ°3nfûËguºÚȯAÛC² ­DžùòT~êëxêf¬Aù#EBÎÕ…ÙYm³¾Ÿ9ÝHb,Šsñ£GÝŠç9{윲vZTͯ-ÿÅü_o'õ,éžÿ5òÀI~}uµ0þ L¨çXø 1äí œÕéÑö Pÿ„†ˆ‚”&á”:e`+…á ~–´“ÁµR ¶7Ÿìïý[Hí4®7I—b|^„wq\¦hÞ£³(R)Û}ùòÕÉæ³½m1ÿu(ƒ¶Ê]#³Û{”<- Òß°©jröÃ"—Ñ„w+bBŸ££™\£2g*Kç>l‘~‘Äi´÷k÷"®÷Ö£ lú*Þ j€‡û]Xþš¦žðy»w&s(ªþí’ÀWVq,‰Ö/‘SÆþÖÌÆ~ Q`Þä_qØ¥< iËZÁ* åɽaãÌæþ*ñ¦FËÿ»ˆÿ±¸´¸²œ“ÿËÕ™ü¿‹Çÿbý®Võw%ýÕòŸý„¸ïOò³r~*ÿJò›r\‰` O xÀ98ðÆYøˆ|)ðÆÀ•>J&iá“§ðj_0Ñœ^. »ÆSWîkÎè˜R|vë8&¢~ï;–[ãò¬g‚ÆÜû‚*&`€Y™ÉF Óч^rÊ¥ %¦u„“ÆnK¬Ö¸X¹é£FL–轉:¸4åÜÄ$ ñ½XM6ß Õ4#€å{)’½"B|ž`°J•ôÇz¬N®â(Ê'•Šz:N¹zš6Mñm,´¨L„Wùñ·w¥Jé—÷šÔ¹ÓP¸/óÑü­ã)ob¤tÁ$Þ3¨rH=7º}ð ÄÓh¥ïJðýÍ[dà/3 þuwþÇÁòrûvóÿæ|{þ_Y‚%álþ¿ƒ‡fþf’R(²ë ê ÌñèZ‹×§ã\ïÎî^ÿ–*s'â"êN½st»zÅ ßÐú¦‰R#vÄK¼qîø§ýØì¤w‡ñŸáÛ’3þW×gúÿ<¬ÿ[ i’wÄ÷㣾r¶ly·Þ¾Î¨M7ƒv½{>¬ŸÇ™OÅ×öÃÝý“ãÓ“öÿJ yÜ<ß'"@Œ'¸ëé³Íã]Œ »·ÛÙ3è­™½hà©1ííîÿ304ïQÛi޶wc«B”Gs…~pŒ|ޤ0àäC—áÑa&{5IsƒQ"Ò:7xñ!¯TÀýLÜív½MFA·Ùü‚{'öj‡òùá"æ‚·d#ȸ¨ŒX¶W.iœÁš#@ K(ct3:Î÷3vwcš êdМ9ˆà÷Ú°ÆU¡ôxôÄ<‚‘ÿ[¶¡òóxcì(c¨ø¹÷Ö± u‚›€¸óeµœÙZ¾ ¸·²'¨ôíÞ%­žS´î .zMb0)‹m!®1ƒiÆ:†Æ¥#|6Y³ÔOn!iY“!nÅ;dŽ” ƒà.ã/qnÛjx6)>€¢- ?0턽Τè ‡i0¬w'ÅMiCN£öZ­ŒvÚÆ£ PÃâ½ uíÖš6 R'‘° ®™±/ûai/·{|Ò\?UwƒcëËæIŽT=4¼\É–wÚ³óþ(nôhË\dÓë¬l+g {:ⶬr¹¸šº™¦õë¨v¶#)N·Wïœ5ë…Æ[Ú—G7W3ƪшè°ZІ’5$ Í~=,,2J &¥r–`ìgìU"Â5ÈLž`ðöºç¯ÈÄïéÙn'³ÑŽÕè*ìÕá2®¿×¹ŒèÆ&‚¦XvpÑ.9[ù_ÙXþ'|ŠõÿÛ:ý=öü÷úÚª»ÿ»º¾<óÿ»“'oÿú>ºÄ_.´ãq›ošÄ ×a¡Nþhz-€Ø¹õÀBVoÅzMÀñ™Ã¢áÉRsAà1ï+…´î¢ÏÜÁK´Ìoî“}~ëàè9Ú÷7þ9ç.n¶Pø“®¾Òb`²ƒÞ²¹õIodšó 5çjÎ'²9yFÊçtå}úO`!<ÜNéÖ@<{$'¨%ˆE‡» Ê9E¡ìHåÑ ÄŽ†æn7;¢‹¡:êHT ~ŒçÎT½¶ñ°Îû(‰ÞÏGÉ<⾯½ŸW!.¨±d^Æ:4™x†îÑKQsݘä~Xϵ3g^Æéy|ŒAÊv%ˆõÓrûð‹¶(œBY»ý/ãï…!þ)BË X)­Tö-7EïåÀ6¨Ï·xÿ‰áÝ̪:Ų2,‹-›Ñ-e¢U.µ`èXþÁ`:„Éôª—85QéC!¦[ žF$ëÍ{ÉW<ŠDŸ6Eµ>RÀSJqF‚ þØÒã“!±]—76âL‡´Ì¯à³`9Ĉh˜ZöS‰Mt…A_ç nvóÔµ¡ew£Åè òeðû”Âç˜äž6VÅy<Ø\@rZÖHѵi‚[´uê“’FÖµA|ž øsêÏ7GetÃl'µ+ÑLÒ7ðÊû“³]ÔB1\Q‡ðF—ÄC¿ïq®3gºÎtâ0‰">ýK4ƒ8s{H ( nþžÃømª3q' pôñäÀ¾ÇW”ï¾(¿ÙÇtwçj190å,σ×òëµüJº@Ò}¿‹Ó;2S Â+äzíõJëÛ„‰­‡”$ór4|Óºã«(¾öSНñJOá-ïìýØCåÊ¡r­¨€L‹¯&¤BC… Á\!h¹b-ÆêÍ3[ŸÎ,UC …±ƒ­m•“Øíª&©cë^‹8–e뺊Þ‡œE} Ì~ùy’U{¦OqÊö‰UåŠÅOK¥(`ád”ÎAí­Ïª%®¢@Ñ@í-× ¼Ÿoˆg ªÈÅs»½™ã”˜ùú±EsàaöZ‰ïçâ9BÙËjAŽ“bzZ¤ZÖ/ =œGo>äÚãFXŠ?@›"¯)° vl I¼«ñ%›Í,Ú± &—,ySHž‚úòœ¤ˆŠ#Ó ŠÈhÓ0k5♎A›¨oVÆ)Ьf¼Yá&G3—¯4ß_¡©˜3,hÒ,¥Íƒ @þ„¨5]eb’4•hòJMÔ–þAÓ]»µ—<Ê™Rç鮉¶_ o³—aQrõá°Aÿ²¾Ü£3úÐäϤû]cƒ õ ægY8jRë³K+•úaô¡œ×ÜX7Z®ý„ãIä: 3¨AïÌœåù#4 âøï’Ví(¤K<%8˜¥ ë¹`àhL†Ph£2!Òz×@• ‘ Ï$„Tc:¹ ‰a˜Ê;0£[,ò.§$ *RXlµ‚Ö×¥ÒçòB1Í÷#êb‘}sÃ'3‰z*.øÚ¹nj@µËb”ãÝý×›qJ7 E¼.Jý'J±ó.D:–û¿Õè‚%¼²¦^F\©5†ìê8TâÆ¸ôt÷O*ª”ÆZ›£î‰ßU#ø&«‹(>ÃnC‹BÅ´àD’XDt”Ý‘äæ®„gÆõ2ÎS0m¢Ý]…ÉÚžaãrqß\½µi×Ìx²“1ïñÞkÞè ¿N#Éqf¶’Ï.GÇ5O½ß[\<“Ïv¯×'&ÍÑÀ*ÍWbº”Áè*½ÛÒW¦$Íw´V!“_ŽÆÏ>—ci6#Jíµ8™†ÄÏ^—ÓÀE»˜O#˘ T9„-mgáÍšÙ±dx²vè‹Ø$”L,:}"›[—æ¿U"©ŽÂ8å´Ç‡¶ÃNLvºüy,ó–JïÌsÂÿ&Bé²îÑI\ûr½Ù„X*a^uWßäÄ3š§êïJQéÝ™‹ßè~å4‘ôC$Áå»Ò“Ò;³#/TÊ͉œ2vf ²ßðñj‚Ù•™6 HEü;gÑÐÚÔ¸ -« š¥ÄuSzSz7xWz«Iæ|%áÿ¡µ…7ˆÿ°`³øwðäÛŸs«›íó/< 0.þCu¹jøÿ,ýž^›ÿ¹“‡ý~§}ÄA~óÚhý4\tø¶¤(bL4‡{Ï6÷N·~Ü~þ 4‰§›{/ŽvO~|iøÿ῎èîs>õ»{d'â-E—™k¨çÏJä¸}t ï,E³‹:M6ð¡²Øw2ˆ¤Ý£Š¾JAªR¢*ÐÏQiXpd¼FHqêÉçÆŸ†¾ Oò;[‹®wÇ@@G•Ý£H‘ì}ˆÓz»à¹ú á³C˜Ö9ŧ­V|F¿+£Í hðµÜ­]óf¾ÿÀ Oñ¿w›'gm$Œ–Š•:þëAø¬}ÿgî ˜'/ÿÑ=îf|ï­œwþsyqÍ–ÿÕõjum&ÿïâ1ü?Eˆ=-¿Q¬$êþK³_PHÞqÁ| ¹¿uðòp{ÿxóÄësÒ}&l¾è7þoà |ìø_[Îÿ™ÿ÷Ý<<þ_²ë÷¼¼³K¯¶ DÀádã|Ô@ßjœRÖH]ô9L+kŸÄ¾å3aá<ùñ¯Õ»ïo#ô¸ñ¿²¶èŽÿÕ•Yü¿;yxücK«spý¶8öƒ gû£ÍýûWxAà†xžlù–[¿í글hŸ”˵ ²„óxò¼eÊ„Òlž{œÜƒ€àøž¼ –ÈR‘`ÿŒÂ#?þÏΠÂ~JâË8½¥ ãÆÿjÕÿ×Vg÷ÞÉ#ì?ÐÜ»E;Rˆêعgõ,i°UÀ £>`І­SºoïÔÖ§?ínÿ¼}ä•R`œ)N¨G;³qˆU€~ÀºbÇŠF’íúƒ_[E<þ˜¢aÌø¿•C cãÿV«¹ñ_éÿwò|•ñ¯¯ÃŒgˆp,)«¾å, h¾å|´&"³4OUÐ;½´SǤèZ€ƒ£—›'§†Ðp4 ®\YL"ÇôñU›[¢•`ÆÚE'ìQUÆ^ýº7ÔAWP—Ùêµ{¸o¿WÙ:Ø;8 JiÜ,åe\Í,‹úúæ­ö¹"‡L¹áõ_¡T­*…;tšàÌP£øÚVt|G÷Þ¼µmʤHqzxJ¾ ³W¡+­B½\vаÐí4 l£Zɘ©zzki{ŸÍ(¹~ýkG9µþÛA¾T ÿouÍÝÿ[ZZœÉÿ»x¼ ¸Í½]wû/|wôÈð¼"€¬’>KwÉDèh#$äãà F¬¥³ÃÂåûa;QÂ:bÓó¿ð ýŠO~ü7ëçÚ”w+à¸øßëë9ûÏÒâlüßÉÃúߦÜ`´=¥޶ø>ß|qlè–>‡'”Òãzo÷øDkNyîÙ0i㕉y­îô٫ݽç92Næ5Aeòni›Ï%Å#U$ÖÇTͤ]ÉÈT(¨*SÛÃÁÒeþÆšÔ ŽJœYCâ[\µÕˇÍ> 66z,8B—Û=Êïæx°JY5• ð_Ö}כßµ½PPW‡ÎU— „‹¡8«))YB‡[SE´ù§T7¶?îy<Øi×σ,ì•´´tQ~èωy½+"Ó‡B†k^ÇX¬z¼¨Ðb‡µqKe5â ÿ"ÂG™{Mþˆ<‡¨§Ñ:¯I65C5ýÓïÿa>¾ÒÕ|•ž-ýûPôS,×Jï Q¿ñõ¨Xä°\~çϽl[8t¹D)ý_·Tv³JZÁ}Ù°äUi®g^ÔòUà*ÚŒyÙÄÃlÈ¢ƒ¡Ç§ÝóÚæ›Áù¸–_ñØLØ£ÌoÜlªõœEL ¸tà¹,5ñ×HúLp9WRŸýGönì¿kKK®ýgmefÿ¹“GÎÿíäüb\ÆôÇcéa]`¬iw¢[=­Tà×qÆ«P/7Pê~oop OÓ‹ #¦Ö³lØáÅgÖ-Ë$l"A€<\êĵ‚âVcu[3NJiŒ C{³#—U¤EÃ+ǽ„ËzÜ{ýTÀ¥ü×oaˆ3þïÀþ[­®­¯æÆÿÌÿ÷nÛÿ«À¹¶„AD÷žÒgªŸ"KŠˆàgœy¯{àÙëΕ:ÞÜ úuЇú@ƒ.©E‡Wüó9ž£ëu†­VÅ6&?³¦]c­vNòÉ»BûÆ5ÃŽ¯ýwí%C!íŒóS¼ÆÈ/%@ç)^:Œ7'» :r!Ôs­«ñÖ—¬z3Ü–w5 ö¦hÑ ï@~Š[lG½=ðëûZæYÙ»âÞ„ªlåU}•*Ëcƒ-Xs\²mÀÃ9¦ º±_ÿkcnÓähS:7J¦!Þ*F¤Lk鉺Æg;Œ”Z‚>c©Æß:|uº»¿s`¥Ä%«â%ÈQ?éÇPµqÄ>€Q3n½Qˆr¡´ ò˜ýGy¥·ÙlÕì³øÉZfýv2°e}ÚêõñæQ)DÕª|ÝÌs~—¾ÏóPJ2ZÿZÖ⪮Âçøè'h‹›}¼©7ÊÂN½/$âþøp¸ „1A«}Ù·Úq÷|p!¸”P"NÔ~ð¸,3·\<Žm†åÝ%„p?¨Š y:©ëv"l„Ð×7jÁ}ç8âVÍ<üdä „zü$¸Ï=ÝåÍÄ•- Wß49Òü"– gÇ­^—"Á—XÿàV©jIw„P"a3(̾ýÍȱÜçºö$«®ÊV›é É€BuŠV³pB.¼+ã gs…¡ð1–j‚;¦ù,Û.lFCÌ—G;@ûû:‰Zú…gËûÁߪAÓÉG‚ƒRò"\ãŒrZ.Xž 6/ MEïû ª«ë£álÑÊj¥f°€DgG : 9ã"0ôHhmHâé¬eÿXõ Õ‘¶ATv@hßp?³îc6l4")µ×Œ³Ï…¢tëí]œ%,íAZÎ話–¢L¥})g×úì—wŠŽi†S"E©…’4g±ó˜ëd^)kåBG4 v&T’eÃø$é`ûmWÍ'áfVP³'eŸtìêãå-Ïé‚ÎÂm ªìÍ ßEr•DIÔ-;r^]Öëú_˜x˜g¡ÐkÄ07‡¿UåL—‹¥Tj,¤`å—Ç¢¤Y-(é/Ñßp8°’„0O¥°ì¿D…j¾šºM·¶QÌ©Ò1Ï4“r¹°ÂPíÚD½+U« É)ÈKJŒÏEW¾òÜ’0Ь¿¨Š¥¨¹_¤-$ÎsI'醃ˆùÖƒê{AƒZÈU¹awdRVwt†ïã~€P2ƒdÞKq^„O‘5j©å‹Úœš˜’ç!ý‡œTy®šÒ®Ñ¡¦ç76ž‹¢ÚIåü´2˜wº~àmJêÀ;}«)V4/öÎf _ã—dŸ„ê¯Uzjž.âVDø@è=o­€"H¼ËMŸóbþÌÖ¦;@ý'W'Ö@Ï¥ªª'3Ä”Q þÚa½Ý>¥I‹Fh"®¨1ASìjrÉš*uNäUÝ$0µÑPÙîô×–%€¢–sbûg=Åý&¾¢,Gzq/u$ŽDõÄYMè4ºT—è©ü(Þ’ÊË쎦ª/y 4Ün<ÿWo˜‚ «4:·@žžñçÝýŸUŠÿ1³ÿ~ýçEÚöASš»W©|ßNÎÒzzmtúLΙûõC’ ëíä7Ú!±ëí¸sœt ã¢ó¡Óž»·»çôõ°;„é€Áò_g—ªþ¹Ä?/‡CøÖ5øÇ~òãŸ÷š¥çÁmìóÿÇÃ~®ÿ×ìüÿÝ<žûŸêé áÕ nÏà"®Á)I«èY¯cÀÐ9aôüL“:_Õ ZiüëµÆJ 6–èD!Þ󨾦³¹MŸqÁØÛTú‚émfÛáÈŒ£67¬ j.ÿˆAòÈo:’9ñP„ü[F$Ý(óJB ÊåÝ‘%Íx» ZXœ)2|¡Z-ðÊ]¾B¼ð.ê!ÀLÏ–º6Hëøk2ðêöØp™tswzgOm|ixVo¼ßæ[F³"4òr88‡ jãχε¨M½DÏg3 ž±c†sqdd¨€$ÅMÃLB»¹˜8)Sq@o‚®˜·;Šg²X8“EÀùl^«HOù g¬üÿêþ¿ÕµÕå\ü—¥å™ü¿“‡åÿ¡”çRäCgÙò_‰þB¹‹$?Þ×ÇMCšdL×qß¡ý~×ãÇ±Ê A"3q;ùÝZT+2:é ;bT£sÜŒ–Š€ì—éÙ|dŽÐžXÊêìƒ98Àâf¬Çç•>ç=]_ ’6'á/ϳwwy“S<ûÒ´>ró›6·míÉ÷+­*26,§÷®-pÕ $/öüýQÍÙ‘ž›#s~¬ ¹È·UÍ¢Q~BŒòSšŸÊg˜sPAÒ¦z˜ˆÊzÃÖÚªÝGcG£Þ¯7 -ÐñC•$03÷úô•Á TphG• ¤z»5¯»õúãÄ:ž«!·6È S¿ÆäÆÞ“ÝÔ3îƒàò"iÇfÐ8PÒÎbü!îÿŒµ‘óŦ°sÆMÇøMqi­{y’ìPÁ& Í–QñªY›ö((x=}¿™G†)/¢Ë-¾ŒÉÚfl±lÖß&jCˉ…Yä!Ó³kÜï¡cVØ ¼÷”„ã™gè•Ö¬§¶ÈÊ ýð b¸Ú½ûˆ"qOp߬*¸HÎ/@aÁ¤lÓMæËQøKôË|¹ÈÀØ:Ū⼠«­Ó_4È/ˆ°¢ "G–ô¿êGF9.uäŒ`d3G¬'„å³ø‰Ì3˜2¶¶Ò^Md¹’áߨÈ#Ãj´]Ð¥elpª8±CwçmónÇ ÿ&5k‘Y~çÔƒr…ZµäηXÝë5p{f©aW¬îg?@?K²»O#æ;Ñ¡îÑUõzpaºl?À!ÙìuãJA×ÂûË€lèÙ?ôœ©LÛ#†k¶†5¼¦kµ¨¸WCu2½»DòXsì'Ó“êîEÚÃcèBy·Ô§D”RÐ ê(SšIŸ\Y%ç@ ¤ºÆG²(³‡Œ.8ê¾é ÞE‘²ùœ)YL$bà@“˜3‹e6îâNdDU#ЇZÎÒMlƒ »1gÜ-5àyŸ«É‚=VœälÕD g­ð², tÿÒ@Éa´zívïòxØh঒~ˆ{æ™é>™àáiôK„¢lûù‹í—,ÆhŸIS)ÚÍû;Œ±‡ãè—‚ý¤¡ÂÌ@¾ÓÆDñ·ÞppÊ÷À’ØÍ9øä¡äÚ:Ke2„C±'þôQ =UKíOžšw‰@3 ‡þ¦QàKº•FáŽ, C‰Iz‹#;L®<„žt»÷Ñ•cz_ÁŸ¼o@-§ÙgXiø‘‡)M{‘Öàä”C±lÔ—O½ÉÞb¥F= …UZ€ `TQÓ˜ÎÖ$Òá€Oª9aámíÂQ˜·Ø—¬Ž:;š½9 N²æÂÖ^6`Ÿc *Ëà _§ÙOð}I*”pJîyUŸ&'þȪqÝh' ™ !Öù›‹j”ÅXø² "Ôôïïb]®”pÃÜ¡£ØÇMƒEðìÕ‹ *)Ô ´añÞEç,Ô¡04Ë‚÷° †}¼w µõûÁëׯ V[ÈËsÍJ˜özÐe{Ö`i5ñ~ :c¢M¯b’!á¨ÉW<e.5ù# 0ûþóÙí–I7³Ô%kÕ'KýeexñµìÍ/?&ã¤rp†–«kâÅÍ&õ=±r§îH‹¯:…cƒ0[ܶ´Êý èIÃ0O¾Ôøå:¸LÚm4cÁ`ìÇiûÚ•è|–VlZÖàÃ¥¼,,1i¤¢¡$&HguÉÅcÃgè[W’ìÀ§¦ÑRƒ.Äå.á¸@j(×|Ãõ³`H˜{‹æ•Ó¹>{ÑTJŒê¸–åC~-7û^Ó¹k–ðl­…–y47Tèh?],še³]ÃÈò‘À´9\ÀôØžÑDÄñìýøNºÏÞgç1»ü ã+=¹ùAâAË)K ‚{®Q[/ë _Ñçö#Ü÷Ym¤ÝC[“Ñ„n÷º\OáªcÖ…\÷ÇÊCÖ¦áªQ†"åÛ"­ù?ÛùZ¹{á›%7E<ÙœŽX"‰%Þ¡ycÅ›8âÐoƒÂ>5¾ÆKyÕ©Ü xý®¨ee¨<Ê[ÍGŸ°5q£‚r+vÈ÷] xø.zEÑÁñÈ-‡IZÃô#|¤?F¢ý ãûØ!“‡)*Ãôµáµ[¸ Pø`åÈÃÏäï5±c±mKVˆbÌNàL|Ý ÛnùñÜÿÀáÌóˆ_è0Öÿ˽ÿe =@gûÿwñðþÿqÒéC·î$Ý&®~нÂ4&wÈ·D/ÉŸeÆ`^ÞÕœGïF€÷=ø®{}-(</G¡ŠÕ*‰ÒqvnœgÇó¦"°3ª˜€ûö[{¯ŽO¶NOv_îþǽÂbj(«|0‰Î÷·Tq µ"ÆŠÚÆÆ5!¡DÕP½÷bèãÀé°ª°#Œ}”êY½ +ú"%w çXFþ 4kÐì`åÝõM [Ù?°ËÞ7(‘lâu¼à;Г­ÒÅÔÞµªWëü1(RæI^}üa§òŒU2‹w[?³ç¡/*‹MʧK裹¨þÉB„÷sÇ> ßzÔ+Bu2*üÝѺÍÊÿÇóEOaüW Jp'÷­¬/¹ñ×Ögñ_ïæ1ã¿ÐuÖuX®ƒrÛH“3´®Ð)LôØÏ‘H Dn¯»€v=²m4­K³J™à~šº3 Á‘׃QœÍú ®Å°×/8´–ƒ§^9"žÑa¨ 0jêÀ1zŠrB®ì:É"¾U \=ñ´Khžá55Ö½6u²!Dq>éuðêäðÕ üØÜ?1ŠË„Qa¦y†C{„Ô²ýSðrûå© †?A|!¢h!;½ôz$™­“£=ñç4Ç‹à§Á¾`övÚÞÝ?€ }Ë‹8‰hŒçØÐ«jKáÁíV4V|D÷] 6$¹‚»2åƒþâ[•FÜnG¹ ƒÚT£öØ×ÈEÏç9«P´±Q öžs¡Èã\ggèÃ!aË™yQfØ4ÄžÍ-›Ô ‘V’ˆÊ[b«h¯Ü(žòò)|ó[”¯²¸9ÈÖUÌÚVé;åe½O) f8™óÎD¿œ“UŸ!’&]JD¿ vÑʽÛ%b¢€Æ-F»ÝÁõì‚ÎOV.à×)Ÿm´°†DŸ»°oA ‰Ea PÄrµsô“ÂâE7ì 8§L‹Ãš ÑÞ=v´ò¹ïÝ›{ ³¬96juCW±‘•QqÆ‹a4ò†zq80LÐÝ ¦SœÒhÜÔ=ÎËT@9^6:°á éà/ÌZÝÖÔézóª0olÃàèJ zïe¬B¶Ñþ ÑUœ/{éû UÏ*$¢Š‰È¡)D™ø¸Fw‡·zȆg¨åM IÅh² ˆŠ#ú®ECU ×ÂV‡5ý*ضù¤v·EQ3ÉúíúµÜ¡”—rœè«…Ù¾Q§¹ù¤—/ œèö·1”$÷.SøF²CY90—I¼+2¸¾™Åiœþ÷®/çîÿ[[_žÝÿw'Oþüßï]ùwî¥~ŽWÏûAõjÁg÷)ˆW¸ª°£+®*<ÑÇE|±k¤?ORr é/Ü,; &)}¶~˜lý0ÍêáÆ‹‡›¯îréðuV7QM¿H3-T½7š÷—o"½{¦vU»Õñ¬m I‰á3ÅÐÑìê›fšg™ºê†_+ͯۙK\¬H§]’Ê-I®[¶©QGÑк‘á$(G¥S0Ó÷ö·-QµX£VmÖ¨“Ö(‚æR£ZLÚÊ&]—5¬DÌÒ 5*êéÅ.ÆÏ£Êøˆ;5µÔFv¼ÄßfÖ£¹Òœšüɹ̑þ#|HI—44âú9ÕŸ«Þ:A7j>ÆLoXÞÌP׉“]ËOƒŽËÍè´f^0¨UPÂŽ£IðX*-ر©Âÿ&Â?ÉŠX•ÈõÒq»wœ rmv ҸײVj¼­Çs©ô?¢¨‹ÞåQ|ŽÞ¥­ä*J±¸üûvRŸ-5p!ÏhGÍ(ýì4KÓoÄ„Ü]¬è30_÷Zvç!mˆt (•¢RZ²æl¥w)˜Þpà34!ƒÕyâƒSJ˜Î²ãƒÙYzÁD¶f–98RØ Öƒ´ p œ hÒËÁ õMÑC±žt}…ú™«?l:è›Ü#ÛúÀZ©Äý¯”Þ™}·=gbBýܰô.×­Þ•Ê%å3}#xGù¼#sd .”)úǺWÉ ©è»%¨ç@ZRÝKºñ³4®¿¯´å¯`uQWBh0&¥TÄE…2Џ¸‰pÓÒwTä2¦—SHY¶ˆšea¡é•ŒáñÁËmÌ[LÖ‘˜…?ûñè) °a× §ðt d4†x±!нØå¿ö5Ÿ…Ϩû?EPî/Þ·ÿ»Z]wã¬Íîÿ»›Ç°ÿè]UmPàŒÆì†Fô2îÆq“Ê#R°-C0+W‚‰vnm#MÁ®³q+ôa¸>A½ Úé’WbgB¢8&ÂàÍÆìÙ2:¦c¤””<×)îˆé “dæeØ'cŠ|§3ÉÄ+¹€šªwí 'D£9dÝg€çÁãÆ,òA°‡Útü‚ãg)ê‚–@7ŠÍ!!·â@Úã¹:ÞP?ËðÔÆÀô©èv‚µ‚!U.êbséÿ?;þÿÚêê£Çåøÿnéÿ<èz˜½At<–‰rÛ~ðþogù"—y6¦#©X¼¯~“Ñuù6~>£Ý&yA Y‹˜ .“ëBœ¡o:§pRäÙéª]¿OÐõºúBƒ$ÒŽîÐM‚‚ŠØ~úMžÒ¿p6¥l¬.c háF¤î!7l´À1WzàÑ—¥ÞÙ“½üIz)¯È(AÁZSüX}lw˜&h;D}·ä+¬¼Þ›ÉH…cÇ@:kE<ð¿JÃb —ÉPÆLF¼&ùx6êó­À4»ÿ 0É“Ùô¾eO\Ðô>lŠÃ´7>eïäµo/¤Ž¹›N/ÓÔµ]ˆÜ;“98Û)“g*аf¨6ç©]ãÞuÓ†bŽÆ¤™ÇxÉêîñÌR28Åh+gCbF†££¬Ÿ6îëxp0Ú¨àW°/rðpâЇÄËôÆ„}¼ÀCÜ̦tËF½'vÅ9vè.`Ee‘“U»æú§Oirøt•€Z›ì3ÁíR/P@¡V’¼›Msà`Gò]BÆé¤¬Jãa7vhœ7r·1H¸PY¹a*O<¾€¹ ;™ûÙh‰e*[̆à ©.Èà÷ÀvÌ^ºû?ÉF0"hŸ%¾è’­d9%÷8ʆ٠ÉhúKÐhß tt3òZã:4—)_0sÇÐNKú¯©µ·5“f<ÎŒÇb8L3 M"Ë„K@%`t‰çöÖ”½qbMáâc(CŒ 7HzÒ†@$`ªù¨)öÑÀž‚±;WP£g2AB¦pÂ+òæ (;¹Àƒ³ÐÅí¢×GlUÈd¶¥Þ`\€Î8xÜ5R±é.z‡AÙ9ObMOS |7Ή22êú“¦X:Ä|¢KÎ…p,²fÚtïˆÙ£0Rí_Ùi^³Ü´SLVœ%Îðâ¾#CJ¢ AÉ•­-Lj0%ØWƒXéÛ&ú2¦ P ¼DŒý»ÌŒÆ}ã™0—n' ¯ªyk‡ê\d0³i庀9^Ì,Ù+CÓ…„R ¼ÂšÌ˳4wo+åz˜Ê$8¯Ùlt1\(©i¹2f°/HÉq™? £ÂÄ«ä®ÒSÊ,Æs%EôîJìõI6MºÙ€2Œœ¥¸ehã©qªÜMu¬#%À mQ5 pš€ÑÂÉ7+ãÀtˆ'IÖ^a*/0ù`Š ÙTžÞ¡[\)Ú›OOôä <†êΨãÝ3¯ôÂê ”¿äWu‰;Thâx/ÎÆ³AéU? »‚ÌÆ™Cahmœ`|K§sáœ}yØ´Ír'Q#F¿ËöÏ¿Äèa‰ÿvÛâ·µÚèÑõšF*y6ôÙŒ&é¢|“8>‹ÚîéG©Ó†‡°a÷8üžezØÍúÖ®öƒ•Úç(oI³©ˆyâ´eV…ÖGaè t„Y€¦vÁ–íÏ[¶¥c@¾ Vd§ÃÄV6ìѹĴ² üQ:Õu”ÎQ¼´ü#+75s˜ü#-?rÂTtt £šÀà¼ôÂZ[½`5-ÿ#à T}êuçpˆœ°¶-V›Œ+—½ƒÞKíp¬ÕϱV¢V…˜í÷O?ï2ÕËȘ-:¶_´65³C =ý\sÖÔ*ƒØ÷Ê‚2ÖÖx±±X”vÚÍ£èŽi˜ìÞ±j_o dä³B‘±ô……ã÷>†QayÄUaµüM¹¨ã@l²èZžÄ˜®I¿°@YÞ¯‹‚"¶DSœ|’t“ý$HH5¶w÷Äš*…¶<Î7 Ç;}е¼»”•Žw…›`b  1óæžòÀ­¡Sì€bùPž±ôCü~þü ×v¶5)(”ʈ’9zêG7ˆ—ÖA.ÂWX/ã ˜îÖ¬MàNú Q.³xÊ`œ…†åLèÙø’äë…L¯"Ë„ þl8GPû“¨ÊDÊßFºe*÷ë’ix ú(ëR2†¥;.H(¢ŠnV"ò³7r•ø úpYßÿÞøÿÒùáõ«\JÈSÏ6 £ÌÅöB8Li{ʧ=-Üe¨¾¿˜¢Ê8–1®Ûîv2ÆOu0Îdž2§Ö9תÊô;¡$½:‘²C@bh³¤ÃàJçu•ÎJ”q ‘Xh¢N-ÉÓÚL£„h|¶ÿúzc1)å…h'þ¡Ô‘âåáöÆ1êKÊ3ÁvÉ÷\Mˆõ‰É„s; ÉÃËæÚך¦s ºhø¢•2ÒQLR};·-ð›.%äÞ·Ù Òƒ0$ òK´j>,õ×ÑÿxX'óqê§“±QäŽ?K¬¹z’ªÀY¢‚$¤}دÕ~ýjyzy®u8“ÀTò„Ý @¸útú)Éä ­‹9WvMº«žÍÐpe™ôǤÀSÝh”Ö©|ý aˆ•ÀƒÓe£ð&çi•óÒp€†R„S™Ú[BcW!6QfzÄ¥Ú wŸBñÈ¿Ûrô Fu Cˆb^¨zË9Ååð8cçñø€ágßvÌDA8*Kpÿ ZÇä1•¥9 ŒžuÍÖS~øQ㩚›Àk"·ø‰bçl9ÚÙû‹  $µÝýàÕÚ}¸¹½@­NM, {èF¼ Lm’gp_7)«K}äLdU±À‡@ÎWA,–Ê”Är¦®‰Ø·÷Í ŽEäIû[5ðºë¯&)0§Ç²OcGNRV…L@,=0 ‡#—4Wpjð“È&° Ó³Ê`…³š¹”Ï”‰(ge¦³Týõõöëí½—‚cÌìç³L1L`ñêܰT«ÈÆ.K؇ƒ…½vÕõ×d"ƒˆ÷ªX €uÂ?åq|àb‘J¤û6î4dÂr®:ýj‹·¼ö €®@ËÕ¼BPËAN•N8íy]9è%²Eòâ 0ʱá|ÓŒ¯‚“†ûTïƒúå­®DJ•©PüTW¦O¡TÖ[@D°q¬WîR«å µ Fe÷äg˜*¼x`!䢈fyÜ—2â=”ù:b=ƒLs—Ävÿ™`–sŠUöIQT*pi !ÇìΫ:¶ÂÙe«Dve.@µÌ¢4 ó“k£Ý…£@HY“Õ­™¡ÝÞ c‘8¾îsÍK©2ê¡ p8VF#!Í@f²´Kø÷Yßðïéx©é˜À¦!#2Ó-0¶*ÛF”úi2†)«¢°Y±3 ÞoBç_Qß+i¬O]ýNTÂÓy¶,¤}+Û ºS»Â¶™Öô®©-ÄÉ(Æl—ÀØ@Bš’é¡AwVx°2•ˆÐŽ /)”Å«»ËéšÿsŽ'cEÐeë^ö6Sö»Ó˱›7„,Ivö ÖV:A¡ÈJ¤_CYH˜Ë†ö ð¢:ý6¾áÀƒ±ÈÛùÇbäÏ +kÞ1[¦þ ²çå0=yùȲD¦®%­ƒ=| ÂQHA’ÓJRªŸòqˆ‡¿Ê:Q5ÿè?’|¾±Õ²(µ&Ûo‰lÏ_~Â>¿Ò’fW#K°ÇÙ?o¨Nü(oÕqüì§&öœl©ð„4Pó ãM‚3­™rP€“·~ŽÁPàì@w€Ñ2š£6¨|Fâ!F+Ê?ÿKsî‰VS2ý¨ VúoW-ßå²ÄX½HøCë×Þ3ãœÐXn+ çD®(SqìRÜŸñŒõd1¨>Ð96be‹¨9Úy •îÁHVò`E먋 "´˜½9_öä 2=’Q…ˆu¦#rê£Z °`fÀ˜…žh%ÇL—-…¿¹ïŒËz]|¸Vz÷ÄÀ¾tÑ:RëÖP–ðêþT°nË³ÜæúSh±—ú§”pCÕ5oo¯QŒhD#¬arÁÄ̲ÏÛ9„«0 (ô(8J%Ž×ñç uÖØ·“1J±–ðèTv'.‚ k§QµØÙl×g/‰7Yö[뜘Bו ‰÷w©²9~›rÐ:´þ–±í*4ÌÄdv¡"éKú*PÞàZÖ%›ç1-igŒ+eȶÿ¸•ɲèì)Y…ØZq¸ UnL£¾å³äÝ^Ç¡‰ùª“ UpdV#¯«ŽÇäýè_ƒsvòdDl»¹g _º}à¢ÑÈlDëBTiPi|°Àš¬â)©{ü”»àµQfm+´veüG_¡–”a—I6å°L”F O/6&X6:øks:Þå4‘êŠ,ÖüŒsƒ‡—o°9r«¤³?-Έ:&ÛtÔõtÆZ ê%^Raüã´Æ»!–×V©íÓÆ+Ï[¦+Ž+¤qfÏov¶2œ“t!vœ³,P¶ª5¦¸ÀèLf÷Åuº„^ÁÚ´Y?êPÀŠ,뫯GIsaÕc°’{ »§$m®T˨31=@oÊ)aÇh‡Ýn”ù24ƒc …LÞRÍË!Š©…Œj;:)µ×®õ¬'[2'v:÷çU/iHô 6¡7²¨rnÄ6±Äfy[IfØ"¯Æ•…ÄÃ6È‹§©t:hµv%¨ ~ý^ìÚ@LW/W­ 4U)z¨™AÃÍ‚k›îTµŽLó¿ØÈ=2®ñef]ÄÁ>Õ:Œ—w­V¾1ðœuëÌ+½U`/’¦kÍU1L“Q¡ª(Ô]&|g¾z@¬rsVŽM¸Íºñ— "ý¼qu•/«ùˆ'{f´¬T±FCµ\ Óf§Ýþ7ü[öçÏ2Šò ÿ¸ÉØy¸–s[ÖùÕ­:®“ü-×°ÑAyÓ”€ Õj½!3t´–j»l Ëô‰öŽ&ÞT¨Ü-ÓRÌpBeˆÕ¬b¢Õ²©Çð9P¥íŠ¥{KõúmklžÍ°5À`{ejQ7ŽrÏÄRÍõ®ž•àHñ+i*¾ŽÙ5ÒóQÌ*¹&·Q†3ä4`¤ñ¼®Þ¡åG…¢Nü“Ty¨ÒEˆúºÁ€×ØOfѬiõ˜}å~jТrrNMlóŽ?§½7ªW¥S}¿¡”;0ÎåŽzÊû­46ñSCoÀ*00 âœ*ô2RK½óê`ÿðxc︅C¾@ŽìlLqˆNÅc@aL!£ÝܭГˆû5ºv×Ñ›J›>ÄØ3FKÉDôMx«Ø¶ãu·6R-R·_nì¶ÄR˜Vzˆù(ßÄ;ìQ?ç|vÛ¶…a·Ù*¹ÊÝÏN{ú2”de’ifKsâ ÐDìyW…X©â_uÃQ7öFЬt-ÿ {½vÞìT*:…a´"ƒí GÖ0%hÄXA¼n×úë2ë„JCa’"TÍ«»ånÝ6¾ÖÑ«8ÌÛƒ«íÐTèV8Ìǧ…ÓŸ+jÅä¬'Ï/¯*0ž—Uö«Édâ"úš’™jKï…¼€†(p‘ÔAcOi%¤¦À€ïŒ8K±¾y´­ X¥(§­ë±rÚ ñ‡ŸeÙRU9„¥O°x©6Z‘í%ýþb†~Fé'S|d$µƒá#Û½Î<¬J”®°Oã|Ú`C>¼¿»W6%1ÕèD§ºÆ½´®qóiÕ©©&õ§ŽŠšÚ3?…=-Œ…ÎOº²qô‹ t¥dÇ™u¶)B’ù4 ðõ5›„¼»—óräÚ÷ÛøpÆÔíO‡@Þ¥\¹Æä':y¹ s–O—çï¦èÔÝKñL\.Ï7¹1Ï¿.„$eyi#áƒ$ÚÙ{ÆÑ'‰¬ÅœÙÃhÖéi‘Xûf-µ}ÕK½ÒZ‡÷"Îà €¥íÅ ®oóq¿$ð x÷8Òs>5T^w¥Q2°{P]ÍÞÝÎ…Q©Š*ZBFÕ9µQ™d ‘ÉdÎþòï%Ö£ÞÐ “çÙqGQ— ø²hCâRin˜[O)¥ Ô`2êsË_!`5Ú!}‹‹«gÇ/¨c—ƒo˵ÔΧÕ.¢ø.¨m1Du5dïÚ Eue84”>DšÚ:ä9ÝVqq¢G˜~n#¸þšŒû?·ÞˆR -©¦ÆÇÊ©`uvÅ5ºp£ðlµÂ,º+8¸~V’É ²¸$FH ç? Ÿ4`ºˆÜµ‰-xŸðAA¢¾uOŠÞQt…·aåÅ» [/v–O¬æ9^dåéÇžk¶{ˆi…)nkΘå M ‹$Ø›Jò¦¥—Óš¤Š>ºî¬D¦>ßõBùü’ʹ`‘*È ¸¡¢ª øªî;N”áÕy…[§ÿàj]ò€š“ªú. ™”åbõBN†¡bx^x‘ÜG‘ušR¼äÒUÝ_ààÈ(L/›fá2 +Ñêî’ù–ŽçVc‰… E{MAàÊÝþ”¦K¶,¯©l…•¨c ž$¨#`Æ«•üH^åÇCâU¤gæXÐ>Žæš¡;á’#`|é Ei^e¢*æ—{üðîr¼‚XÏ̱ÉŠwtÏ÷‘#w4e;Hó$ƒò:â [ÝÆˆï1,Çe̤|ÍÕO{4#+•j,ì‚©ëèÊ+õXJ$’jƒ2q¥îjr}û XCÜÛ=W Jä!””—:'f´Î £ŸüW_ÓV€(øT¡ÌÃû| .ï>ÖóÔnÆ_î¥ÍÝý#Í÷‡ï[æz”ÔË ól¾KÃÖ·@sl±+¡;ópg¦BC,­\DZ!Z!50¡ITàu4¤(Ëîþª¾YüÍS^.nŒa±zÊÔÌl{ÕÝ [f=5;™•Ÿë@;òöÝŸ:wíÆ`€ xÚMnØ´˜h 3n»Ë>á+¨çeÎ2v%Ÿ °€þH6ø ïs¢ªa­¯ªóÜ¡¼U6x‘íqÞªžYC˾öN®ÝCÂi°Ë6O'ÊQ†ãÌ[p|ËžÕ¨dÚTi>§¦š:dÄÖUšë‡îdÔ¦¶¾É“¾/”©Ö¦kÀ(„¹#ùn`JÎ*ÒÜÜõj{ïx>·ºò~¥L t^í¶ù“ºê[¯$&"I[þ`$y™q…œŒ£ªÓ[¶AsÍ_ØXÍ-V:˜'ÐòmžF€|€¦gtE‹×#ïCYíýAB)í.×pXJ%¦i¹Mî¶0êí•è^`kï€Ô P„.ÎúËÝRT"!ãÁðhêng)~÷ ?uû\µ¤BÎÒžtSÏ“F+:x¾tP~J9ì-JaûÙZ¯zi¯”rT– ³§!“‘hig—®›«M¢+˜ÙZï–Š:5Ü£|*è¯òˈ>Ôøééh¿ì®lCÊìŸMyžšÍ…8}°”7¢›ö’Y•«0?+¸éÉåêd<È|Fþ‰{·VòU‡·ÅzÈ„Q5‹¢rYðØ>g:éY\må>ÕŸBê-ó”÷|„3 ‡3P§yÛŸáת BŸB‡ÀôrÜrH~Ò›ÎX?Ã]ððMÆ:D¦‘†[9»ˆílð²Îг²×’£¬è¹Ï)áf°I«¾`õÙŠ—×ÒzÚXëäXåUy$”£ÐU¿ Ÿ“k/ä­8/gåÉF¶¿o¨+Ú 8¸5Â[ÂDV£X“¶Äë¼ÖE,¤¢2ž2 Žd/,TÉY}Ñg×'ÜKZ]H˜ŸJ#É»)Æ«úÖÙ~L‡+GÔ•æž/ÑiÍ(º\­ ¬vü™Û+íîKM…½Ü ´l]Á²TöY-{PêZÖç±bB"•uBú×wižQ-¶ˆÚ«®»KtÂI?kø³V\~Ï‚_|³W‚ðëR£>p yi©1Ç}œ+Šl}ñê³µõ~v´x[“öš‡O5•2ÛXYYYZlÄQ… »t÷îÝATjXð™‰n“|ŒÞÈÈ$øqõ3•Ÿsyi.Ø.µRqLfÕ°4ü[{¯ ³`0KSÉòSžºqü¾Û-cÀ'3ÓZÙ­Ö–ô@6Ÿjí%ª›ªý=´x ºql© iœÔTú KuNÓj¹R¹J où g¤xŸ óÂŽ’VáíY{¯PÒ{þæ^„Ì€ö—Ãd¨\•ùŒâ)¹þWã¼b©¬èz…½K¬M‹Jw F•|BÁG‹íádzmÇ0õè§Ú »è!4_ïê _Õ¬S,ïZu´CønÈ2žâKÞÒȪ虑wínXb—'á©¡Eeý¢Ñ,’ú)”L_×ïiµÆé«öëTš$êzãÖݯZ-öäÛ³ 3Ì rð¶Ù÷ ³.+|C$Ú–R!¯ÂعÉ]ýü)s_eZ†íÆ» ì$t‡²çf–y¬±»Ÿ¹Ú»šXbÆÞ„´Ýù‹‘W"§[âüÊ7K.mô×f´ðK8ìÍ{2Êd68ß½œ¦â­àl¶Ã Žëë“qž ¹tÞØ1 GóÈ*ƒyH¨Rå÷zOe(Ür ×Lê’ø€KãCÛµÚ3aµ ÷3 ðiPçq§5áâ«GWª¤b˜ÿo—-þN„"àÍ5d±Z®ƒWÇŒóS÷Y²ë ÛT•½W*jÙZ­ÒʾE¹:ÆaÐD!.C”ŒîŽe<¼Hî¹UL®Xz³äï1éö¥¶Š§Üç¥Uĸ£=ÓÑk¢–EUt['™Cþ5`ðv¶HB‚K0,âíí;8öÿùÃ<œÌõ“Õ÷›ËÙÙ,kÃÁk=?|ÿ®?\[{€ÿ>xødõ¤胇þ¼°ÿ÷pmýV×=^]ý±úÅzPóÌÐ:[ˆÿ9‡sé¬fÌÅtÖ‡Óë&ºt“ODi…U6ägâûY¶\ˆô*N”¢ºq玕ÊußMÂ[\Õv*Ù¶ØÊò´7MûœI¿³ÙÛt+QÁa¤Y~T§h>b =¬%Óè!´—MÊ#-§Åtm)Žñ_w’E"7~–ó^6¾Þœæ;gçlpËú;¥U6Ĩ¦.ÉP£ù9Z‹£Õøq£Òø9ZŸWàA @ê <œWàѼchåq•J¡ä¤ÅŽíA¼V u-~X÷y}ÞçGuŸ¡¿ñjN×Õ~DŸ«†«Ö$KÛ8áš§;ΓQ‘a˜¼zƒ%ÝL˜ÛìLõ—N?­Û‹âý=!(24žYÌkß;¿·æôp˜\±Ç*“­iª^QZo…Öa£´e–Ke–M3œØ[é‚uùÓ—ÎNZ®«ÀÛ÷¥³µ–õ¦ÜÅ$ƒtx0š¥ƒ¬‰9¡ª8÷„~Jµ©ø@á¶wd@«Aué¾) ÿ¡;¡|¿º|n•ÇиT>¯.?¤ò%sCõ|6I1´ñoYz)d‚mü;Í_Œ`–ÿ–zÛÕÝBçâÞM®A8Ô«ã¡8Ka5ñµ}1°ÛDÅuß㌶a|#ࣖ)ÿy·¹»ñ|{7²S\‹ðM9ÎËz•|ų$ú>œjGFx~©œ\wmÞp°(ÚÏÂ=4âÝææþîþ¡XÉf©íHný?ÿòQø4þh\Û—{Êü_w– ú»ã^2@¾¸ÈNwsø¿ÕÇÖ<þïÉ*»åÿnàù%Dvžoíl²uAGi;°:Ï_ïìnaÞ¾;PÚ£k;‚²¦ï¾Þ<ÞÙß;r¿oÒ÷ÍíÝ]ïæ_n §!¹Ýг„öîŽàäÈ;ÞûMt2H‹^õ[­>F•mµ øÇ†bP³8mŠd˜Ò‰õã¢!-/4<fC á\A~g“}ÌÎÑñprˆs[@Ehú>rHD‚¦è\õLDð/®e¡s‡×hf$¡¬;‹a<ÝýÀÓ"F3®"U–Î–ÉØ~T*…®RjE¢ÜxÃ!ôØá‹¾”Í„À[/©¢Và¡ùä°¶Él0]2V$œ Hu5Ò*CÜ[h!µ†½+j¾Ú°lÞkE… ‘c|ŸbtxR:ËÔoˆ£¦|èr2Œ1ôˆ#—âÚ…âÿéäYP5Ff…põ#,7‚ÐX85üsÇ(:âYƒõ'r¸" 1Ö¤Û”ëçh·9eÿ °ørœ³Ê°Q³e]©Ÿœ¤9¦DfÔ¹êJEº,+qàÙÙrh´¦B?Ð5K—ÍUd?óF…± vµO-‡}Ú¤’Øík9<8#ðÔ,W‰yzÝå8­%ˆo-/3Âã«£²TnM\„ëv3 ŽR´ÙÀ¿ÈþŸ±„$Á4œVò´€]øž>µõœ˜82rUÇ2]f¬úöÑë’Uö¸‡¯1*r ˜TpoûèHDï^ÛÛVàcq×icX‰iŠZÐñ÷@Ú0ˆXîy{àAŽå¸ÛüÏG-å)¬ÀÿˆE³©Ì0¹bסöÚêªM<àùÊÐ÷K6z‘§ÿ Ô>íÕæêšýqš'½t4¸n;¶ä”!,ë§ÛìàѶ½!X >Ms ãÏ“ÞÛm4 +W—ZWŒõ*{\*2IòdˆGÃ{=,Ñ6C¬0îÑ#å²üwEY=<Ñ6WÁµð„ ­Ÿ5, áõœùUQ¾„5"–޻ʺ:µ¢Úz¬úÑF¹¶zhÛ¾ym.“¼ÏóCɶkÝ…ÿ4>ªe_yVÇ«r^¸™;œ²œ~Xã‘Ãü4µ3—ià1«¸˜2ä¿ð Øt7YRZ¿€ñ×ÿÌ·ÿZ_äé?|´~«ÿ¹‰'lÿµ±»³Añ Ã&_žÁ—b”¹nà;Ú-¡ý’klÀvN›Íô|¿âþþ6´üƒ>Uúß̓/ç4gÿ¯=†Íîíÿµõ[ÿŸy\­­‰ -mÀJ³a^…ènìýåH…GD±œ®ÞÛÚ©®ÎäªÂÖ*hdõRÔhÛl5[¨†ENFoiP–hÞïŸz®{ŠÂ(•É$éaæKº½sü"éHS©öb××¢wœ ˆrTdšt1 i ¥@:ÌÈ‘!NÏ윇ìÈèÄ1Y°†/ŸŸFdà€ã¤ E+CÑ(|#zŠaˆUL#™Z(¡ÛÊ=1€ÿ­AÅ’`ŠJ¨u`Nx „ŧ¥:lQÑÑFö¿Óˆ£sv½pú+ïÖ§Md“<µz›5b»ëò5àö__oÐ-—SîÓ¥wçÎx?€€†‚žNïç}|y¸½qŒ¶„Ï´Ï·òFS3…"³ˆh±/<ÎQ¼¥iÝ“†àë5ÁªÒãµÑ°£Hrn€s-Óÿ’ÏïæçÑ úþýßc` oéÿ <®ÿ'E8œb"ñ³!\ll‹å?} ‹6Å_ò¬8%‚Ö]n ³\ðJi ¨½ñ4m ôS˜IQ̆i_G'Æ—¤lJ{ˆ·†áþ}±1 ÿÿJãŽáOw·_Ãqs°±»ýªs°÷z{wÇâNéÎè$.Íf_ŠDŸ,ø±G--âå4^ªÏ¾s¤DŽQ§ïЭ%–SYž`e)%<ÝHs»PÝœëŽd]2qêf£~v‘õg¤ÏåŒ ªë°~šô1_ÐaȀЀF³a7%‹HIÓ0,I y.xïÞ‹|Y¦C™OÆXÂŽûÙI3>¬(‡R3È·²ÄÏ"ôÿ÷Êóì?ž¬–ü??¼µÿ¸‘Ç¥ÿÃë*ò&ÎæÖÎ[4¢õ¬‚`WröНw^üÞävS†‡ª=ßÎÆñ Îã~<ô,ø_Z¾þxØ,¼ià¥' ä˦”- ,DóÌýÏ!rG­w0~[¸2jiµ~t±®|24§_6(ÀÒ/8_®Ãô"Ý[l”M¹_¨(…ÙÂB,pزzL®ÆeEšmŽ’E7s) €(t ð‘w²¹¹B] ZòRJB¨‰¬å åXÁh^¢„g‡öyi‹|J˜# ‹}M‘Û(ÝÂ!&·Ôœ|.û‹¢±£ô÷Ec6’hìïïûsÐØa<¡óÓ²ÛP_»æcò´¯îŽÁ¾sj§Ù”cÐO“ØÆ÷'yÚKûx½+zcTŽ&¦“ÁÙm­X»Šw$²Ûî¾¥}ßtkí,Ō԰ɦçz8“NcuÆh´¡ ,wl+韞%n ŽãµŸ½…€Óñí³6¥Yç,|ÏiÃÓÚ‘ŽÍ9Ët+F•ž!†¹±J¶šëI2ö =çpöš8×Jb+1;±ÅþÔ'õ¥cÙA$'gsBÉ<{ØFiè´\ÑòñÏzíIyø=-ž£.Äc î˜Å‘S—z§!Ûì‹¿ú†pÌïÊ´hßíêƒùœµZ¯ÝeIíÈ•“óªÔ} ¯˜#´õhµŽBßäºo’\fVh9x;f8@ ßµ¹{Ámž\=ê×^ãàCo<Úáq¬M ±ls4iv¤IdŒ³d€)x¥Kƒ'À|S%•…“§ö'‹ÛÖïõà‚«r@š³ÄÃK{Ÿ/·a8ýåvÙX~ýn WYÿ3ÅP{7ÿqýñã'~üÇG«·ñ?nä)ëÿeèG±ƒ¢šç××Äü{ÚŠÎø‡Š §ÀHû“sL;{ðfóËĈl› kñzü ~cÔÁ'ñ·5ñ×ëbb<ÅšÏØFíçGõkc9>œ±æó ÖþúG·8A•åQ6¤"ÿ¾AÌ0šJÕ)þ9qÙëymõ?2Bb§2à¨ñŸŠ0|þ¯ßhüçÇ«ýóÿá“'·çÿM<Ÿwþ ?.4žÄë(àËÇ…nûŸ×ë?¯Õx€þTø¹¾À#,ð¤>ðs=„'1”©+ð-øö3BGß²:8Vç6²té¹,}Yºüü;³sŸüTÄýR¡Ÿé™ÿùIÉþõámüçy˜ÿ;ÒV–ãXžÓDôSÌ N—Ôìcß•y’óÓêBE ?ØDKlîïîïv^ìîÿØ¡£Å-5?,´Šn‚>¿;BshV¨f­25΋ö³HøæÞÉiy#·¨Mødd;Éý“;)Ù-Z…Ln5šgܨʓQ%:)}g¬¬ð¬_ŽfÔíÿ›ñÿy°öä±oÿáÚíþ¿‰Ç’ÿ8¾o¤BZp‡(HîÕ ­¡ Ñþ»há_kMq4I{z†gy/%–"½•ò^û=¶ Ç4övÌé&Å¥ΙòÏÊ £Þ4Žîð÷³£¿1"ЀYZP­õ¦Ø9ÁÖ”ÎóÉ'2&[ÌwSم݇ýМŠ1˺ ¾ì¶4Ôñ­ ÆSAØ"‘"p'¸*ò¦*°¶E[ÝpR&”h»d—k6üý¾0Û¡hDÎÍWÝ3øÃ×5S,`SêŠÒcù±¼½ GßoXp¾Oг€!k N”óýÇo7Ì÷ÇyÿÛ@¡ªˆU$,h“Øç’¨JdoYÅ âéYØT¬0}ŠVÄßÓ|Li9 L=LN³ž²Šïà3ž€m—´*Ýlždy1=(ÒY‹ÕËU]¼£…Ãiª[·UI%ÉTf³‰­¦§P®2ü*…TÍQÃŽÈûmÙ»4èFEö¨µUóâ ÜìËŒ) …é¬`ÄÈãµ´i¬ ãaØÊ<ªcœÎÜ ²z¦pŽQŽ,ÊrïE·ïÇ:l`ëbâÞšÁfŠÐu[-…üx‡ª6& ¨[̘–kE£ƒ9êÆ]2ëñƒ‡bÓbÍPsrW­xtþç±õJ…Ž\Ò’þª…#øO9ñ`¨i(‰Q‚ZM¨î´ÚÔÁ{b­œbM3^Q‰X— !ŽîòŽk—‰{H–Xhkˆq.¹UI2cÍá8J”Ëå­ñR|é1s%Ím̪*Ï^$yƾFlîUã„&ó®ŒOZ¨Òµ­Ái¨würyz±1A ^é÷õ‹RÑ>+;•DGD ›e¿ .J+$ÿtÿÙŠQ5Òa•åöäï>ºQ+”Ÿ¦–xj¤S —BâÄ›Rµ_F`8ä}ôSü&œyQ-Í÷’¿š{†3d‘7?ˆ“I¦ÔÄ´þë#48\]A÷!zn0r Õ4~­sU|¡X‰~†¯‹uq±÷åö03=”_ç8ª*¾Pw2$w¸ÕMN &vA.ˆ6/¹¯òÂÛè÷)‹-ß1Óö¦uI]§願 ‡Iž½KIo]^…|ÙÍeQ8ë‡d“&ÒRÄèâ÷Ó«lZÒ‹Å„]â3Ä›šu˜Ž¦ùµ4Òl‹¯íŸÈ¼¼ ®+Ãà ëG¥N°b‹À¾ è,GµëÁºÇ dW2VÈìèO•дRáëÓRØ'¨ÿ|µ62ïuà~îÈ3k¡ªOGu‹Óæ2“©“Ô9 Î15µÔÀ„TÌ£¤•´4½å{]Õjn*ª(å|&‹Õ x~ô°¦´/b˜'·…KûP‡ =ÄûÃ,Ób©"ª†~xÒÓž}«$×ghDÀö›ãÈ­µ,*ËÖèÚðù¾£$ظørœGï!_Ì©mi©0ÌŠBmh¼õ]ªP¹"D•Ùêt€ìÄ?ÍgÅ—æÅž3È÷„YAø2‡‹1ƒÂâõ2/É!ò±6ê§°„ˆÖÌ>ÛTغÚÄùpÂ!ªê©¼„ú LP0Uô¼JÒä& Y$î`:ÖÆÄpú†õÜö££¹ 'z.8jSÉA‚Æ:“pÊ&ë!>Ê•O¿^³˜”UkȽydGæò‚5{žy-ù©k`î­y¸²ú[º)*ü{¢ÎÕcP‚{æ±Øq+ECn®ZÌÙ ¶cÈâò©û¯?ΉÅ%D™1/W°9p5@É{ßkÆ”ÝT‰ÒË¢,l˜[Êó(°¢!r¯åݧüȉïTêtÇXµÌÂZ{U3ÂõŒ*ªýJCÎ £ŽGãØŠ¹Ç¥ kÝÈŽ´\Kú¦óà|7ˆ>„„çz¾WôÂÉbÈ„¡~ ±6¯­uéøƒÔÛOÍäHâ£VO×Y4Žp¦ô–ÝXé7«Œ÷È„‡/@@@ÌS/p¿1NN#/)'ªb[1…29F³¿Y™¨À¿Á±­)½”„\Øï7–6=ÒX±¬’[#ŽA]¢´ÍmŠÖ€´õ_±%´ÍŸu#òöˆ®JŽceÿ/hë˦šŸÿiÍ÷ÿzôäámüy” Ó.Íú—Mÿ¤²bü«3@É~üË’@aî"Œð<'”Vë|V ¨•ôé¿3Å“D³CZ½ú/Nð4ç)Ó;–Ø— 0þ¯>zèûÿ>¾¥ÿ7óXþ¿&ü{F–'*ײºÏ“¼›ä‰àu±,£@‹}¼°»q$–ÿô ùûó?‰šPœIähçÕþÞ‘•úé_žáéß#)æ)çSŠÍ¥t›Jé?ó™Cÿ¿ˆ 0‡þ?züØÿ÷øñ“Ûü7ò¸ñÿœô~ËEôëcbNJ(ka6(Ÿz³D >) ”ÍÀËlNss9ÙŒøb©œ~W&&¶ô W¦“!ë#y¦‹Ë‰X\æú^ƪ« aLó4] •t+£^-¥“h^å“ &¿¹e¦>24ŠçÁvBeÒ_ü0¶²7ˑ׷ábFÄ̬×óÏ4•$éF^PDþrL~|>X¥(]T¿s‚ŒQ#ßñ$ öËN„úŽ ±s^u£hP¯cÖ š®”ÚúC`¨M‚†Ý“{¡XsŽÌ‡ #žP‡h§—þZñ“<¦j"ºª.tY¹Ö øê…åš‚Òbõ¾Fsce8¿ºã*}§gFq pÈ4ðÅÎÞ¡×/¯Pÿ¡r0vƒ†0°z°Ü„ÕÀ“ÊËSí\…©å„NyNs@@^•zÅÔë½ý½hÿ£aÛlKHÿ€”÷š&àÆâ¬`°²ò΢2°­€`¹±.sU£ 0ƒB£PNg¥ùyôJÔ@Ùªb=.&ÓB«å¶$°âVVpÕ+•ÝÙZ¶Úá-‚ùÏz1¬ª‘~”; €Ük¸ð må rõ0O’Þ4 ^Q+ß^£ˆ³ÈƲ½hï¯U[ÕbóÖ‚©(UqmXçš$ŒZ#ó.y²í‡ÓÞÉEã—ÂôBV< ?g®Pû†óÇ4²¿ì»×‡¨[$;ìb,ÿ:oÈ= žáQP¾¡Áù5d'œá6ìiüÛðÉ?ùöOhQYÚ{Ýë]V7F}ÕA'ÓR»-䫆Y\p]Áfá™P²|£…õ© ð‡Ñ§²r–‚cp;Æ£©½têþµ“œŸÆZöÍKÄy+ÉyÕH:‚2¥Qò¿€³Ž9âPïgs!V‡¿DJA_Wø’5…&ñË—Nùâz´ke'´_—®Tõ§Cò1+!Àn$üVUÉŠ;w¾Îdœ”´ímÿØÙ|Õ wG¯v÷~èümûð–Æá\]¦”ß¾ÚÙÛ?Ô߀?\[[]ÿ¶îÿ¢÷jdþ,†ƒÑù} øók=¾2Ÿ½¯£~v¢ …>}uç«fó>f¨>ü’F;ßlò¿êµ$@ßì2|EŠûâ:H õò"+f˜ÃL0¿ùýRß²þ_ýØ9„ÿW?†d]¿!¿úá;_S@LˆÖg‘Žà+ïúË{1Üùª‡žŠ•ßBYjeË‹¢ŠWy:ÉÓÎ5\XÓÌ Ý7 œ«9a}-f•ƒo< ª¹‘÷βiŠ»Øœ'ÆUKY¥ËZÏ-·fëÀ:–©¬\š´æõ¼WTª«—³,c¿àz‹©Ö ,Ñ“à¹[“±<¯š*ŽlB¹dÿ1ËrLmr"®Ç3q™Œ¦ÀÞù öÊd\“ÞÈ h ½#¬3±hRµ©‚ʧ&/w±s(Jq÷î],ˆ8³‰Ð{¥‘éâQ£ÐôfcQö@.•ÛD%ø ‘¤ÙÎñ·$ÏÆ³BZ!Ù£ôö­ðKw®*¿•êYƒ8;•a˜¯<äS—ÓË5çôŸñHþ?Ëï'H.Òo¾|Èä?yô¨2þ?<šÿ´ï×<^{ò?âÑ—ïJùù/çÿËó”þéß§£÷‹X€|šý”[{²zkÿq3Ë›ãád6MÅq’Ÿ'£åBôÑ¡zÏ” pÀ"½B¾§@3l8“7sMAb„’MFà!ES7e`xäbR:uüÂÑ=ëeœœ¾‰ÞÔ\Ö›ÁyL@06=O¹.°¥ŸžÉÀft §0‘åà€ƒ½Ô¼‚±¬xäáðFˆ™lçoÛ[¯=”þb ×[ûÀo~|¸½­Ù`¥¡Ýad·å{Ë(%ž²©cÕbR”9u[|ÄïG£{׺¯±lc KM=“ºØÁÌ¡¾ÜÚü‡>séÿ°™›ÿùÉ“ýr›ÿùFž[úÿ{è¿Ö71’ˆ,G!Jßh•Oˆ€ Vmã´|¹#¸|ó¥g,´‰ÿ½Ç Þ.¹ui°¶ýxXeFÏcLu]Ó›-ŽyG¥tÖ!%ÜsåÙ) „B þèTåô£€ß²CÊ2Ë“«Î …åX`5ÏŽŸ?pø>Ý‚yiµCˆ:)Äàb@î\¾RǾ<ÖŠ¡xœ•®Õ:*n3‡î•ŽÐ­#]9Ìs¤|Τõ}Õ­: C_MëA®Öak m Œì;Y«æFÙŠ7­#J“I¬ÈpöÏ… ^>ÕÎâDî­…@ìOƒš ݛХžA’u=ÌøtîŸÉƒ§3‚QßÃ6Ñ×xýK ؽq”Ú.Tmž(`ªÛxÝ›6¾.Rh]}¬)¸uÇ4CÙïgÉÊç?SìôþIžþcýFä¿GO”Îÿõ[ûÏyÊù¿äü£múY:êáJ¼Ä-~ Ëc$3i¡z7¡C¾ßa(¦Úê¦X2¥9ªèñøF–Óñ œö=#íg=V#ˆbÌQd$ l AÆÎc€‘«d„ 2t†´8Š9BÚæþ«ƒ×ÇÛ‡Û}½½·¹³}´nyXç°¯FCu³éœÉŽA9´¦b1'î‰ò¬Q6’‘ä©VlƒüòÊÔð3â¹ó¦»²'K>ØH°£+¤ ï)`tÑA>UÕæRl„â|£a!¸ZÕƒVGÿ['‘¸’!lGä‰(¨‡£ž †ðLƒ¥Ü9Е5ñHüøŸ‘çc ó¼³µýÂmHF{INQ¦% Ú©¶müî`è@4B„Ba.VôŸF£Lªlì lcÈ€Íck²*^l“ý8Æ”M©?vÐAKó“MÆÅTùºCw¾ÔíSMÿ¿Xøï9ôíáãÇJôý–ÿ¿‘ç–þÿËé¿3qg‹)º>BfŽã|9Ú¥/q'ícT‚€‰@Ð>à0½À/%•kÕ)dÛð)¤ÎžïZ~ó…jN›6þS%¼·jl½Õ0WQx3óó/.¹U.)Ž1Wvƒƒ³ó¢~<£Nšæd~#~Küê¼½øuI,;%ñj\NòKÅÒÿ-¹×‚S¢/¼ÓHfiYk#¯CÙbZ®-‡Ý+xš^ .ëÞKz%98ü"%‹t˜ÉŸsJvg½·i¦—ë”ÜõH¦_¨uÃgÕ-oU<û´âÊx~~?ÐÕGâlNÉAÒMsÇ&$¢I<¢ëËÒ휺ãDôc ´¿ÉËø²¿AÈcÀ„Öä~ÇÆ},­^]Ša¾¦ ¯/êrM)Â@œ Á˜—a+Žî­ÅìFPváÀǽÓÃC™*"¶dVs+S?L‘¬Õ¢LÚêA4eØöglÄ%£ßÖ`ób)$šºbÞ„‹š¹RË)ö~^4ìù+HAÊCÁµß "º£Jw.Œ Í@XÁ5°.ÌKÖE¨®´‡±ªß#w5‘/Õ»h̹ö–ØE¹½º+Ü`b48hB(.9(Acs'9ßUÝ׈×ÜîÎÞ_¢ iìTîÐ%4YŸËÎ V*©À¥¿°¥í¿mì.¶²ñ Õ„è"D‡ÌjO½5lؽ×GÛØ|0ì)›M[ñ는´v`_¨S8¼&äÒX£‰°z{‡2[XœÊ•g®¹Ï–º¦<ÞæUÇÞ&È'‰^UÄÒòë,¸iù.-Îw1M'ëb5•Z}Í*V "úR£XžYå3à uL µS‚5t÷Èp¯2٢쥈`ØhðÕj]øv•¡nÏøg[îȺ)Q¼YgfV’ÒYåDÊ5/+}gWº¬«—Y¸ŒT}ÒẠ¶þð• a“…yëºn[…§P=Ž˜¢«¬¢6YyÑå>Ö6ƒ~Õï­ŠH?¼.*sŸVlMªYqÀ𒧇‘cĈÍni#9«¦„nY#˜¥ƒØ½n/[-n2`Ð)ªöøœMý`‘Mý@D oçy;Ùã;›árT°œºÀAcÚÓ3Þ‚ Ÿ¶?é˜þn4û8rHk5+ZFJ¦ÚþCnÌŸ»1Ûj-9‹[ORͺ.ï)½º§+âR˜Qv¿=`è©:‡UFnÔ˜– ³ e å¨%Wg2ú•ÕJ¤ÑYâݼ$wuMAã’kMAÜ%Kt2Õ‚¶c¼†ê"Šå]ŠÕ_5…‰Á]bqÄ)Vμ˜}ä]dúÛQUg‡]Áqe4$0—$‹Öô92XPûÔnéÉ… èïìŸzxÏMîðK .æÑšÊÏs9(ZRQv/œ{¡n‹?: -Æã·bføÂ÷ö½g[œŒØñË×hn¾xi¡Þ¾è¬®s˜^#g ê»Ñß¿äug þÓù—‹üÇÏÜü¿OÖüû¿'ní?näáû?¾4†ý´èåY¸ä­8) óÓ ö­ð°Êù¶:.ÞNH¼;¼WkƒâQ+^Y#ôÏUÄ¡‘tBÒ›r¡Ñø’‚ÈÜQ{ëס.ÌÛñ¡[Ù»/ÐVÁÚÙzQTƒòHUP<â`ëů÷¢£†8y~½ kX¸cnå³Ì×ÑÑF,.S8›%ƒÁµ¥SCÞá©~À<2`¾i…sðÿWƒW‚€ì]J8þwÅÄ“¸HòŒü=/b‘5Ó¦£‡ÚdôØw¦úBPŠ Œ¦ê£ÇøÉx0_Rl/ÄZ{ OqUR4f¬8¢È£^ž1äŒÃ€jhŒS7ë°n!ý=]]ʧÀ4Å¡  iÙŠ·žQ´7nzWö’#)KX°(Ê ZRR%1§ô±bòÅõ"©¡ÿ7”ÿ}}íÑÃ’ýߓǷþ7òDœrw¢1õpÍ92 Dö™ˆbû“|<šfiîDþ›:0º×âHmÿ,Écñ2Ó²›¦ÊêƒÍ B±ô~xiBË•âèá›üzwÄÂa¶äµk ÊžAáNÝ1Ô®?a´•Dšç0¦aq 5`¯eEoß¼*N›ô)Z’ã]Š¡PCÛøa ¤Âƒ6'*G"}9”R1Íz… J£}r7Ç3}±ÍªL §)Ls±Ô?¿O¥ï÷ðÍ’‚õOLý¹€Ô–ë¡ïñâõ (®«#-ü›ÄœêX:8ŠarÅÉA¸+sÀ@éûDšÝ¾LÇpÌ0s€Pé˜~Ú–æR/àW®àå• 7‘‰ÆYÞor¢©Ö Ø!õ¡mƒ+¢:cè´v¿üˆvÉ=§d]GYÛ‚iÅH´ f£Îä,Ó›ÎNŠhÀhbÉd’&”«r¨‹túgÏuk <=Ú?Q5J/;T$"7a‰ôÓ¸Ë5ï‰5J¡J?Z >…¯¶W=]ÀÐË íGüOœÅ²ƒ©;#ŸEì^„f@Þ!«²(¯NÞ¸BÒkéhÖëÕ/S¬Äd™]<¥Õ®çYÅdR=ÛlIH þ½àiÌeÞ¤ŽÛºöxu.Òfi\:FggÕ”™ÁzÌ6è ‡6sp7o h`š€¦Ä ¸?)z\i†#9r89ðþZ€Áû ˆÎR`žR˜±Z"©žÐþНŠúJÖ0yÂÕÕ³&ãȽºÆ×Ìݵ5eõ“~Ë‹(¡¡ïÚ¬ji øŒ”ÎFvô÷=!ãèòýJK&§O®¢»ö‡Xì°áiU°MïÕ=Ÿ@=.X¤” õ,2X™cìµ=cŒ½_—I|™·/íš‘½Qî‹»£›uû ‰ Ȣܱޑ³¼®ø÷”þ "Àz½à²Ô¿ƒ§6Lñ'rÅ6‚ùÆ(€µˆ¢‘'ær­|Mä2ö€[‘ÇÞ|GÛ·kíŸùm• “´—¡O<žn4DûÊ…òQ”ãO~–¨P))„D€h%, )ðCõÁ–Nþ£ƒ(r1°³w/HFà¿B’•eiB¯”(.nR¦¸¨’*.êå q[<"0.Œˆq¡… 9à ¤áãW§¼ÝîVHXä‰A¥qì]&ŠÎ¥½;ÅóȆ½gŸ[Ìý<íŸ'ØUë ×Ì8Åyç®N³ŠÏ iØâ³D`½ic Yv.'û1þLŒ‡nÕZrwwM„Mx¯ê¸Y=U®9x·’$᣶ Dap%|°JðÖ#Ï% óWOm ð½ÜF)ø¶³Bº&Äë®°\ÓI¼¼[@9~+rÿwˆÜþ’øãÊà·òséù—ÈÏŠƒ¶MdÉÐm‹Kt;c‰×¢â*H1ZÎûƒÇ'*Û½½ÿ¥-Àêí¿¬=\÷í¯¯ÞÆÿ¹‘ç³ì¿(äºÊÄÈ¡×b|9²\že½3ÌÞÊVaÿûöï#<Œüp”M1…øá¢FБ56;îÏR4T­4%û>ÍÓXpú  6FxÛ^o oDœJ¨¢BÚ>g'PóéàšÆ—hØCYcIW¡ cˆ´R¥”H¶^DWÈɼU¶ÐØ2f1JÅl".1R—ÄvÀ*2ΖTiÿö—Λœñ<8ÔÌ7£“à-Ÿ­jê#tÒ|ò?b)ë«ûñ÷[Ö}!Ó¶’9™ÝË¿t@ò…wë%ó²ÿBë2…^з& ·Öe·ÖeŸe]¶õâÖ¸ìÖ¸L?·”ü?†’ÿ‡—ýìÈn»þë»àœ¼U4»ÏŠ¢ùV¯|«Wþ$»,=7%k¬J‹ Oàð´W6|vü£Y†1>™Ãkm!¡OÄ»,Yeý4a·M¤H™u -d°J N::}E;»£\ΩX^LEï,í½Åª°Æs,THk–&Œìs¦ÄTõÌîè2))ª›EžžMñEžrbLŽê˜c%ÍRd\Gã|˜ ÔÀ6±MÔå©f‹ñþ =¥jx˜y”=±)Ëcܸ‘KhùUœÒ%}E¾4¡ „b`9%¤{‹øi‹öwö`¥ní¿º5äº5ä’¦;Ùè‡]F²Ý‘5å¤á&pꟳŽ×ë¶l‘ÂÒT÷Ï+]oÌvÌ™FÖ•tŒ®¤m+|1Jˆ3%épÚøõGJé¸q@RÛ½‰Ñb'ï{”^MѸ§ßQêò©®ZYmñÛ‡$£½ Æ-çãl$C8 “·@pP¿M„†â.ŒÆ¢?› ²u¿¡Š€ü0¢¿Çb;££PJÂ+þ®M4Ä8E¤Âe;±Æ3&s†ÔV‰…ve<Ó\,jÏÃèï­¼·†¼WåÉ L2Ô…vaú÷¢+:4–*PÆeH˜±(*Ê…,rpwúÖ0(èžß}»”ê?%\·ßÃË){üwà·Ë†9xíLŠ”ÚÙú¡ó!à¿~kº`D'Xçpœ nWUÔ…ðeÚjñûy dÿ¸ƒºY vJÂÀÑ2bìHŒÀhׄÞû“iÃ1ä'%†T­ÜY»Ÿ°àOXð'^K.e…/’†â1 Òlv&uÀ·&‰Ö7c5†P@ =S¼>Œ¬~V¯7ÂË"ƒC´)A¢½¸Àê°z„y£ù»ÑMJž%åebõž&ä9uÄ3>ÁaÛäGŽw!±µÂwÅé;¯=¢Õ?5˜$.ÒVUTðG¬¨öûÚ„ G€›/^~12¥`-@¦*9€‰qO¥Ÿªc¼†7QT·ƒÔUŠêºÁ+𱕝>¯DYPmdOª§jJà‰Åÿ¹9ä?½-5POMô¦‚(Úª s_ ¥–XVôÓ©¸žjóKÈn1îx ±¾°¦ùXY|XRud£NàD£Š„²?¼›È­Ç­=·>z,·>^ÿ<“qŽ19ë¯CT!>ßÁ:~WsòϹ;«áÎôâ'çOØ5ÆK¤Ž÷ƒûŽõc¨â&Å6ê§û.Òª}!ŸKŸ”MKAMÃu*¹GVúØÔÖvW™s¹ö_s‹¨Vë;y‘X[ºþ–Ñõ ΖA.}ÞŽ±š ¹©,‚]Wµøi›@?Ñh<µ bY+¹PûÊ Å0ˆïl#²y3+J‹Û¿:S^>åËÓÅ*.ÐÃÀ%ì— ˜¡V€':_7þýïehU'„“šÃ»­˜RµE/{ÕU¹º¯õ„Ë«F¸_<ÃU m¤Ê„Ø`ŽS´2¼ú%F‡:ÎÁx“'F‰®}P}'ü› ¤ª*†ÔPæòª55Z4b²Ü¤x§üü‹³°Ë”Fkê¼±¬,à“ÅO…g–ìˆø¿³«Ö?å)ûÁ›6{Ã/ØÆœü«×øñ¿×àÕ­ÿ× ÿŽ68[åÌ4EEf8®‡bóxæ‘zÜñrALÄþÁîÆ‘˜$“4W• /ñ6L5‹QŒ¥Ù9Û…³' çLIL&ŠI’£“ 3b ضˆÅI‚ÑRLJ'ÏXÑ;K€ŠN˜ǃt{[öL`›¡`pt6«èz8&Úƒ$m…íÉ«˜XF³(ÎÆ³AÃ>´p>ˆÃI0 QºÌS¯Gª³˜ËŽÌiä†Ä§C_›ôd)ã¦b½3€!&ùx2® !t¯Ås4„‡‚›ãñ»÷}’_¤×ćA³ÅxD†sã“é%ZÅ`V½ ôÿÛWP!Ke°µ?}û-Li¤y»Kôõ-cÚ23¦CY³xD¼â†fadw¢2¼Å\Žc^ˆ£ZÔFè y7ñ|Ëæøþxœ¨bí,Œý@Ö«l^±…~ B;3$“‰8±üðÝiù6ô¼´n@OðâóTHU/ªØN-×eª¶"̰e(ÛÕ'ÓyÛJr›T *á SçþÍ8>1ë`+¯3ß'£Ä-¶ÿ ¶!QÌÞG7ÞÅ⮼.U!= aÛÞÿMyd£~zØ€MLkÍuWP|—zXu™Ìúž·lÏŽÙžÚÕÆk•Ä_§e: 3×wbU^¯ûw†>9$G5c…®ÇëÓ*·¬sAç™5„|B¼ÝtÓ]®"0å±LŽÝ‹NœW»HtÑj]5¶‘ÐjÙe.Š;~ÿa p 8‡ŒrÍ_^Ÿðô¾!\XÔã"ˆ°9ˆuŒAõbB´^<ªõ²h£,Z-qW½)'Yë¯ëT¤„uBÆ:•ñ°Îô{rñœ[RDáÑ{( ÜIW㢚ztáìKÌØ—ç›^#«{ÿ±ÜOŒ=td9ž…zPpB{ÝAå`órå¡zŸ•°ì¦”ž; 5 ‚+‚¹Ê7åS~Eü˜Šá¬˜*x‚j‘ÇøÝ»wu*–¶4éÆÚà ?-;»Œ®,Jf«’ݶËÒˆð?þZ¯Ï¬ejºM|¬[«.%Kmí^äHTnóRÖpk¡C9š³7áѾéй«v+ñae‚7 ï|`ÏŒ¢èb–1«àþ(¦$¾ÁK{çèïØÁbBªî”á¿+Iw7æR%¨9ø¤™ýDL"Í­À¤q—€ƒÎóâÓ@Ÿt~Òó yÆÔØÛÿ˜±°ë›ÏW}Ș)´Š†ç²ZeÏÅís ˆ™¬m÷ 4å¾c¡ *rhÞUØ÷ûÂ…Ý"ckž¯ö)œ?'z«VVæH<þ–{øH×3òn¦ÍÿÐÕL›¯f`þß,ƒ¨#\»+ :±ç’óо.f½;5J…Ï‹¬£Œ «ž¤U¡åfm G8ÑsZ¶]^´î1ßµŸÇj2ÛÞÜv1¶Ó¶u·áÈ;ºåxI¸Ðã,éL?•x&ªžÛë¢/ø”ï`2îãî—zÂ/` 2Çþcmµtÿóäá£ÛûŸyøþg‡¶?)?Ƴ‚ÌtàögáT""ã7Óq¼ùâeÓܧxéÐMºƒkŒª1NÓœ,GšÁ»c©±¹$a·óbwÿGŽgÝ9Ü>:>|½yüúp)TÙVc­Y[bwÿ £‹ê€ÑÖ²µ l˾ۖ±T츉¶²â¾oêü^$ý~g’§giÒOÉÀ %¢÷ê×âîÖ£Ô,¡«÷Ehõ>ÈÿdŒJÍbŸèÝ2:íL’>÷9½Ê¦-§Å ;ávþ;ídÿSŸèÿﶘCÿ¬?yX¢ÿOnéÿ<–ýŸº«§³©º$s¬ s´µéìää󉿺–&·/ãK"@‡f½Õ‰æP|¼%žw|¯‰ Z›þq?Ð%±º!Vº}û<‰,z¬þÆÃÓð;'Dì %¶¾yš},Hæ^  ê¿­Û6bìõ1t⊠'#!¤¸›ôÞ×þ±|§ÚÒthËñ”e3ˆnƒÑ¿Tž](MÈ?ƒ'Ö(-eæ,>çHH HXµ«:Œ(ç`N«–$Ý-fËñù2A]nÖΖµkÊyû|yŽÏ—Æ«žO#« ÖòŠ‹+Â(ÂuQH=QlA;’“áéÔùm#Ì%HÀíS#w•ÜZøùxǯ醣¶Ö[Awú¸<ðô§5¡¯bSüqÂ_Úédž "¤lŽsɡ%G›)’*x—Y yž•Ÿ£ýWÛØÍgöúž_ñƒÀk>A7+#ÞÛ^üÍ3–G ôÔ³7ŒØ¥oÂ)oY½aË~ÓHÕG– o<»! æd<èç¬(’¡K)‰tHG¬ú ãRQ°IߢÄÓÚÀ÷ì|aw‡‘ƒ¯+.*FË…€},»•e4+›gÙ Èú»BVÈffëEçï2,'ÏäßCAGø‡3 ?ÍEÿï™à$Qg}£'€’g_`/žƒx] åj'y±¡hã–­ñ¶£ÑÍ;ážÈì:§¨v™Žƒz¬àÚXl½ø\ÍHàü?¿éNNãË/bnü—'O|ùÿу‡·çÿM<Ìÿ¤9z¦ƒŒ¶²Ý„2È¥§x2¸.2TÂ#ÿ¯\&ö\Žó· / ÃÖ­ã ¼› _äWòîtým½³ïðß‹Þ`L1ÉÇýºåðñnñIÞÁá„ÊÇâÝ|'ÙÕdŒ>þ èõZeÑ!TM¹Œ|Z»ª>½˜+v˜køß=ÿsöÿQÖïÿõÕÇ—öÿÃG·ûÿ&žOÞÿ±”, ¥)©=×ÓBæõZZâCšà±Ý&ð£»t/!'ðÁ™(gdeu”ÂDQ™B 1tšÈ.MÇÆ…šÃÃ4ŒñÖ@¥·±Oªªd† ‰¡R^°¥“¶]FþSˆLÐËa8ü6¾yUœ6éS´dF°C¹†ñÑ•Dò½¤Œ±&y±¦]±"G9ì¬cò)'s%ƒ½P•:aeóÅK»µb‡ÉOæõÇJ\æ *Р[AI)êVP5¤ï>¨K1%†p<Ĭ6ýY®Ö0/÷<íÏÈ]ÝQxn@{²?›n+G5Q–Ôäã×ÚÙ•*k™!‰ƒ<ÃwMTa;ÏÉ)T±8¥úè¾qŶБ .“k•: w$ 'J=àØ¦¹þxªy¼¶/uz×q˃Înp~ÁLc¶{B»#gl‹¢R»$¥š£ÜÑý°pš£Ì’\繬Ø0Ä7ê:–G…ø8 „Låx©¥žÄÏ2*<}Ç`^vrÿÃ{v'Ô&ùþ Ǽðô‚×xÔ¿ãüŽô"ë{Ê©Ž;]Çïâ¬ïåS£rà ²Â€>BÁei‡!Ò"äø„BY]f Y²È#O/6(Mµ°jÙ`%1ÝbÊ ¦° ·à]†¤&„KêÝ’±,ÁÊÞG±¸ŽM3fâô÷kJÓ¨Hgaϱx„d>KH–˜<\«z¬pæ©ÌË~Å7Ú¡ùÛ Ž Yæ>d1•Ï$¥wá)ÃXUÓ|_kc›ŠIÆÒøÕK¤CÌÂÜóÔ£ŸÍk`*ݸ¶å`ùdˆ ‚DøíGs{E3šVŠë[š×šÉ-2_*!Ñx®JÖL {URžU{a8ÄXÚUsœy³³=²D…ô.væÎµªÁ–öÁñ‘µÈú¿öꛎŸ¿Cº·ÆòŠÈ¦Ul§õgo€}(:Zž~ŸŠLVv]hd¹ˆ0só²•tãÝwÏÞ-»qÍ!¦¦(¸†`\þ.>˜©#‘•sÈUÂÉ#7³ÌýiŸ­&vÎs6Í’AöΣáxXÁÁgŹó§^Õ‹i0ÂN_xidp`sÂp°œ´‘ó±• ÆË〛> Ù˜·Ùï«J¹i@˜KtÖ:œU,ÙÌÔ~ LØøîƒÛª4$ræ6_ÑºÉ Ù?Ì¢¢iZµZÑi•¨#HŠzDõÌ!%ÄîV MõÐ?ÝÔÎ;ƒò¼Â¯®¾ó÷ÖhÏ£äyåôÑfï0“Oœ©nú_á( rM·ÚnG=¥y‹»\2Î;ÐǪ£ŽVœì"U±†€uó^¶Žj”)áÕ5Æ"Çnʬ=Y1Ë^:MsYy‹mnRÈü[Ç1’Ä¢b³oÊTv;9AϺƒÖ‹=yÜ Ÿ*´\WŠ9ÉЯZ¦Ÿª <_WœÃP¿¹R‹ðÎfˆ3\‚Ç"=,C ScšåPZ»þl8AT½^©ƒcI–P7÷ÿFK¥¡L[¯*ræ¨›Ž¦$à]ýº$–ª÷™+èàø„áß¶ô«óîšÚ¬·AŽÌb¸ª!+€‘ª"ávU» ËH&$‚Ò!ºQìnTtТ°§¯2Õ‹RV ’µ ÿó-šÝ~PĘ^¯4NŠh® ß[à½ÑVØJ ¤7QÐ ›÷5—×»4TÐv(:"óóQŒ'­–å×­œ™ ^ihž3r•Œ`‡ÃÒcÑÀ£tpBœÐûÏ®-áØ Í«ôëßw®EKìwÞœüºÒ¹Žàï†Ué˜&6ú“Zü@¶‰å5Gè¦%±¾›bf¢¹ÉÉÕwh34Í“Q*HQAr™·Qw¸Ä‹Ä\gDrï¯Û×®9rYL¾öÏe‡³=2' ë°m©µL A0¤ï;ïPµ’§è¾Œ9›²ÀŽ˜9üþ5&€Qç)aîÝSë;l èêBÇô¤‘y6`Ò0™ÎC«l¥˜±àᲫóÏ'BîzÂjä°þ1Kgi<Áü%l+]#¢;~×~7夙pËPT2[#óNf z×jqÓ( 4$á°;S9u[ÙÉIJz;©ìúü NÞ©CÆÃÈÙ¡)õfô ûr™4˜ä…a£säÅÚ•-0c]£øù¤9R̪I ©ùäk÷„@:µÈŒÊYõä½+ähf=I÷Ša”@È“Âyïñn0«CâÖv¥Þ¥ÌE‘¨²®v|Ÿ |>˜2†Ò ½ô+úXÜ׈¸QØÊð_ï(q˜,]uBWm ƒTÕæDg¦(4YQU' ܤ/6­U¹±®8¾Q¨€dQX00ÇûSwÏ ‘b§úkx=‡v­»à®+ƒDê•<Ù´öÿjÁŽôjnV»)EŠ ò׺.º½Å$”×ò¼°¹‚§2X¬—ye^ø:ñfŽÔme·Q:Rÿ8ÁÂC…REÑNï`øT¤”Æ¡ªWHou£Òz¸ÐR U •+ ,ëJ@žÖÏQJd2w<ݾ4¥­­ÌÇ“ä4‘çyž³ÁTÚ¼ã‹éxâÉâ-3ÚeXy|9RØC+2àHª4€[ãáñ–n3òu89ÞŸõ#ÏD¬$ aVpÔ„”1\ö¦.¨¬]ŽT®Fã\/‘¼b&.C›Áýx÷Ôm3õâ~enŸ|;»kg­«äîe‰G=6r_Á¡´õbÃ×­juóok•¬ñ‘CwŸòÊÊî¯5œõf+q~ˆŠïÞ_sßú3Ê \Ꮀ ü¾œýGÙþgp¿N÷Û_ÌpŽýσ‡ë|ûŸõµ[ûŸy¢aGs^‹Ýû¸¡sæã´iÚY.¨úÄ(1C´œ=Ú Àr”àuþ Ò½<›ï¼êWÆA±(Ò´Eµ…8›N'­o¾¹¼¼löŠæèzÖ„Ý÷Í N“o†×÷)±Dñ ÝÇ4%“‚=»Ú¾:ÍÀÖ6¢ÊQ 6o@M¾PJD¹  4ÛñiB¿·¿µ¨y/(à¡õ´ðª¬p:×­b2öùè,6]§÷Síoœ‚• ƒÏÓ“rQ™ªÕë õJ~t‘`8öÏ;¼À4:`ÞhV,Žú=²…ZëH»‹ø» Y٣؅9³rp?ÁZk÷¾\v–±–Œq=µ&Af[åpô°x{SN¬VL³ž¾>¥ð¼&Ù0×ãfUÊÂÓ”?¦¹XêŸß§Ò°}áÍ’‚õOLý¹v¶^”ëá½æâõ (®«c´ï¿™AÌ©Ž¥ƒ£`²…?ÇŠn뇰u›Î_Qëêâ]-îw³p¸tÛŽmŽÛ®ÓzÙöÎéª^ßÂ5 ³oÌLûË^¹]7é.ÝZÂ.Ù•…k ;Ý´ z-ÿPWÎfÔvi,‰ÇýRØÞ 3•ÝWd‚í-¤oÊìÈÊyôïƒ[ ¸Ù®e?Éf»ObdÔdÃQ,[MÊUƒN¸c÷Ërðç)Ç þá>ìïr¼±œWÿU1ôü¡Û5Cz-Õ÷n¨ïݲ?ŽLÍUžÉa³d¾BŠ S…ÒF¸ý´º½øðåžwæè,³k½ÇÔ{ÄH² ¼¯¯Äˆyè€u®^͹Ыõ ŠRãd®9@¸§?wÃÁ„œ§¦„!+•ÆòñÔ*ŸèÐâöŸODä±AÄ/Ÿ„ÁýùÝç–Z­E†!*‘N7蟰O‚j?ж=‹.tÏ#q)6>Ñ‚ùåÃh.•^˜j•¶U³RÏU‘¨/ÐT©Iª â)´7­kÏnwÑ€R|×¶¨ãœ¥PÞ8Ÿ²i¼Å‹©¢Mømsj~XX^ÿ ®}aíîÇÏÓ_­9P›f¾ò¶~sY›‡æØžÜ ujhkP]F"­v< +7¡ÕæÖ¼ ðFõÛó¢·5ŸÏÐw•¸›(i¶e ðwÜ)4žNÒ Æšþô·¥UAÏ‹S¯jSb˜ TÕFèä]µ›ÔN:WVá3Ú쀅BÇy¥Ž©“ñ÷í0Ë]ió?±£Û4ˆ¹}= ºMö›±’–ùçÇ…•ßB2ÝA5kcy/ã`k"Ùýü‹ú«ýLϽ­¨òA€è ²ÕÏSök¨˜šïž)êD4t±¢Iјµ}t{¼›³«\©€= êj¹.°eY@yš%ç8æ‘’.$fgØÚ][âéÎzoÓéÑ8Ÿr¥€ù/)*%,ÕÓÇëÚ÷-ÁQ>dÀ–°ùZÕÎåÛú꫞.eÎͺ»;sȱÁA½˜êärú5žP²ýi˜¸Êvmzœ4‚3[Bó*U"3>3Ñ h@çù³6Hì¼äÃn0 •}Ô:Õ"Rb F%Ó:ÞÃçD@¬y‘§Üx‹•Ô¨;Ä#T¶­Qso- Õ»¸Q:®U$u1´?xQãÓVš¾õ“­kN6ÏóLÍjygEhh€+ɪ…Ý’šÆ÷°?Ú[ã¡Ü´m¹‰I#(iõ«‡‘±› Äî0‰·^ØŽM[/–ÔÊnh}ÂßKZ—µ›]¤;#FvOö§=¤NÅB…þ\@ÁÕ¯vªô•QýjçβÁ¤]2qöy.im«U¯X2˜œ%óŠQòÕzhŽ6½ÅQøÀÅðã8ï7§ãÑôMDãE.üŠî&âžX½\+ÝK²6¸ÕÅSážIÖʶg‹sU‰Á¸— èݨýó/…›ÄçCMñeúÏh[-%/ëÇ-L}ªô_>Û¦ ˜,½Všrbl<Õå)‰¯ßÚ0Éßro£n LŒ*r€Y¹k.˜U™HzKÖ^.1³dž›Áˆ‘~?•DJ¥­áAÚ5ëH3Fq^!XWÙ1ëú„€ŠXØ%»x 'C\iw‡°מ´dFúBtc9W‰oè@òôîØ€÷ Z«‹ž"7"x·áo…Ђ”è«p4%¬5iaýê© $´ ³? K=I TI©Ä\ª2a 0ž71ãzôC­ŠÐb7Åå ¼Ñè/5AÌ}[‰ U‘ÊW„R"‚Û1V—–võªœ›O™nDF:¹VÒ‰K´hû¢ÇÇjYÅégµ£¯uv«EÖÏ9êñŽu9õ«‡¬Òh²ßi7?=•tèÄï*ù)æËh¹¨x7O×g÷tžüUš5z#°:̤HYÃ*3gÞ…Œ‘¹¡R5®å3Ç0ÔW#ΙBkloÿîUÀ ¢w(Pšýn™ãÇkcyžJ@Ûæ¹Ý¦mõn.TƒF£Ãƒð»Zc™Gˆ¯]7(üœˆ»êî½mjxš¨÷ÒÑ¢êÖ¶†Ïß蓯£»Þ·X­ê4 „×e jB=”ýxªî–Ôh+‡© ´$žªP±FœÝ¢¨îü¡–K¹*‡‚[ S¡™¦—bÐ’ï“âyšŽ”vBiÇUF¬Õ.­7Eýµ"¾S“챯¤ÿJâªê§¬¦ŸK-`³T¡ILå¶™3£ŽsoˆŠL£"!Mt ñ‹;ÊgŒ^PÑfˆ3£éÛ é²ë;7ÐF°.v¥œpê8„:B|Pˆ„é†üñÛŠ-Ž”RH[<¢%E9Et ,lY*‰flAIdZÂÿ²æ•ø'`ÿ9OîÉôsó=zäÛ>ypÿíf8FË.C3oîüt¸óòûcõb¦M•u¡ôÝ´i‹GÑwJ¼ÜA³HN±¶óê`wûÕöÞñÆñÎþžTˆ]][Û/ZbCƸÉ0"̹àÈ^*Qõ:§ ‰¬)kÑó}ŠìÎÉ MOKÌÑþÐÿ£2ßPt.Uv²ú†´Ù/D†›4;É8äz`È)>kJ%>sŠ![Ô'‡“§¢Nšåï€ËUTZäšÔWˆ('äg©,%å‹™V A¹‚IZLZ®@‹\ÈÞÌÍ*úÑÄ3÷pA¹Êª¿šb1‘W*¦ð¨AÈn6V'Q™úªT·{¿:®t} U›; ¸î¥ ËìÖkg~&ˆEúᵎò^!7Ïñ‚Ä0™LpÅq ¼>îµÙ‡[úÅc_嶃.o½ù™/ï\ðD›2ôóÇÔ:=Y=³vÅ܉\¬g§À @¯4}=¥x.)…'ä3AE]“ ‹ic›Ù¥2:®â'õ«”ØÛ YJüô‡L 2ŸÿûýN@õüßÚãÇ«Jüß£Ûøß7òò¿þ›2lÔçI‘õÂTz4'ùy‚)ìˆÄšO…>úâX4™­¨›ß"‰A$LƹL±ðc6dÉPlž‘'§ñ—J Ø%@¥œF¶û áÈ䎵x)$;ÃɠУª +eÏ#QvjºÃoËLŸÌ„ë±u¢Â· ù½¶éi™]¬pzRO·×ôáõazRéô¥ø®Ey®Oå·>‰×šÃgUŸóÂFjgïÅ>c¡Oüy=RÃù´2›&>‰O㨎C•ù=}¢Âmì8ZTB_ç(í˸ËÊõÖê¬aã©£zÈæ€÷i^'mªùÑ®a[@èÚÓgÿU¨¬Ån¶ý2ŸÞÚ%«‚5_˜Çmb÷Èv[TãåŽDv´´ëPÜ¥‘ï¹î8lãu“,µWÛlH³À¯à”SûC¸Ã¯é‘¡)ò$+C³7žßF*nseŠ?$'ù2“èšé¨œâŽeÇokJ€Ê}Ê|‘gZ¤³Ds¯‘ARL¿_¨¡ü- J¹- æ8Ò·íÐê5`”á ŽB†%¼ôd¼¾>Íæ¶w çu£9Mº³ÞFC“¯›3 ¬N³ä%_ŽO@²´âìÙ r¬â‚¹! @ô&æ®a¢MÓ -Xo‰C04³œ–É|ks iޏRŽÇù‚ÄŽÑóÌì&ìÌO†ðÌÜÔJÐ7|$«åqr‚² ªNL ¯o”–÷M¹ÃYÑQ¹»yYÕOdD—7݃êË­¢­þüX1Ù&Ð0φÂ%Q¢Éà÷Ñ×h},sYZr¯Ñ´#隃^1áXÕ&r%«¹œéX1;KKQ ޲<*VŽ@#‚¡H7õ!ä)¥¨‚{ÄÕá!‹e:Qž'7´‹ ºÝíh)³t»kr´•¥®›pŽtU0;±¦MÆþõ;4”ŽÅ"À Ó…Ïn,²8S›[Þ­j•¹ƒ¶llx…6Ú$ŒÉð_:¾tønÛ5¹¼€%øV‹V‹WûX øK9µè&ÄÕ‘hRiÖNQæéI-%œÝÈ rÒÎB: ‘#ÍÍ[55ˆ©ùVJ€]÷ÞO[Œé{Î7då^LM³ÆúæÊëeex­MƒLk±lü P-{1>)e°“@¿ï¼Ñ–Aò¬Äø ¬5Í5~[ÓoX]±ñž7­Vh­ã£b#q#oô­¯4]2ç,¡Yw£¦1èàF¿/Ãu×ù…ricýæ´¥‘\kÒóuÒïw˜!ú© TŽæR®B>UÝ-Ñ ¾_Ô¤œ“Â×ÁŽ×m@¤H†üyݼ{W¨XFt–ŠKssVªQþ$ÍŒh»üäl— ꆶò°¨êNY—ŽH8.¡P„щ¦Žvòö)"¾÷6µ&§ß3b‚½gzg2¾/™R®UxÞ7y£×ÍA6zkaõ ÌÅYx9hZrö ‹\¯Ø3kµ~\5ÒþXg6¼û{@* B™è‡‰%]—ø9DmøÛu%JëôMí"ý,̄Ɍ¢0oHóÙ¬ˆL%‚Ë ¿™cüyô*r õn.ý¨¤XT½º^Í ¬œ£©ÞÔ:WóYU½ÀxãÓë%#b*Lô3"ÚþÖµ˜›Ÿ‰™ AïüôòÁ.+áM¡‹ú[Ì„T ò7”Ä•-CÔSZ?Éé fæ-í0l9C­ÜŸ\Ž •ËÀ°8özŰUðs3tX '¥$± @¥ì”(×c^Ѻl1‚9¹h½ÌK²ºŸ•F³·-E¢lñš†Š˜q{7`ÚÖ¶€1t¶÷Cˆ Z×YÌÚÈꊷYkp;ÏÐÒï*ßË&ÙþmnøçùšU‰¨©Ý] 2®Ùæ½µ²Ù(%ø@ºCÌ?Ò<­Žb¡¶‚0ßdX>–®´-¾_¸š¥ m[‹`ÑêÖ‰Ó¶΢õ-ýªÜ[¾ã,q-Zz1rì.¥ÜU{ˆ=†¬›R¥»dnC‹¸(” ³méc¹6¾6ªNEjYSX¥´¼¹m‘rfÂŽiN'v¤dÙ,´I}ªÞÈžg¾ª!ÀYó•ÚÞã~ñL—lX“Ó°麒îê¾>¥ÙÕ~÷6ž¹7‰àR±ÁŸ€XuœÈ*Zê¨@¬*ž©’Ä*oÒ:ÔJ8>jÍÕuDšaKw\F3kÉñ¿XÖ¼Ÿã(è*²}ýµ.æuGɼ†|ýþQ&c»¶ü-î|åhe¾¢s™N˜ÚÈÈ3çq ò©›ö„ÙªÖ[D³éžÇ¬x¤Œ,³ƒx¼#ÌÑW7^ ‘BªžQÁE|Iý·G}©™Y¼/¹Œ/ª+ «€@þ_¥«üBÙ¿çÚ>^{ìßÿ?~ð`õöþÿ&ëþ_jÅñ Ê”žêº©®Í=v6ê f)~<%-ù?fi~-3ûÎ7Stï±-3E÷VºÆxƒ^ÊQF·T×øC)âäxh Û8“,ÿÍd\LÝ:IŒ}kN(Bw©&›Ô T§^œÐOm`j»VL¶`§€‰°õ†W²_"01ßIJa)#†áÐØs/©í+c7¥¹oŠg;p& à\þ±©zòq-ŸŒ0:d¬åz¥”ö˜(¬;žž™‡Ö‡ÔS¯ˆñ\C»\¶”£Z»\ž²+²š™äé41aqS¥‘_ѽ@Ož¢qJÚW—ã._“Ñ(ÍU붪µ}5ÅäÙ\!ÏNÑóR/[sgÝ‘·j¦Ç»Ò³°x–f§gÓpptwÑ舖s49­èë‚a2)]6³ù#3¶Q>Oñ_mØ-[±æ·4A¬ïY*«ë´/9·ÄßÏR˜PmãÌ^S×sÉÔbº²¦]ñˆ/Ðè.²EWcêK&ë8W¿jDÔ§d›®^Ò;³ÚÙˆ!> öÞüµðyˆÁŠÃaÚÏPåàS«VþîßÑÕÔàÚm,5™I©5S®cP?§a¾ãàgw<8GÕ ~±F0i\o:gx…,ô寶S9‡Ä)P½è·5\¡£ñ(møS»Pûò_§á=£ôVÛËž= ¥%õ) K›Ý9­û-Fš*ÒÁIÛõßÙCcåÌDà[ž > Ø‚W7Š{©º=ÔÀõÆÃáØ8›rû“$£¿"5ÞK>q¥Ñ¿sŽä<ýÇ,úIG²{ :´æh¶T»x÷0¦—cÙíÇ¡ú„ÐÙCòsÇ|-ûb¦rŒ+sø’ÇÀ¼½ç¤ê+uÚÄâ,xrJ¬Zy$«NKüGE—ûÚþiÿßûÔÊÿ7’ÿãÁÚƒÇOJòÿ­ÿçÍ< æL^lqÄçàós‚¸º”‰?ˆ¡ŒÈ”§)ÄÎòPÌÐAßà£Ðn::Mf)o¶ÑWÞ£{ã)°¹Ó±è§@¸(#Ê.ôAZ¬ïï°MQ?=Ifƒ)¦’KŠb6ÄcQR²e+¶è?:Þ?h*?W-¡løµd‹¾÷"úLËýFÉL¿2ßÈר4½¯MHr˜^ȇRd¤BËÒK· —žÄs @fç(ÅK·çÙþ >VéVP“Z›àý¡•þ§–2Ý5EV†Èd‚œ’1e ?‹cÓŒ`e¹£ËpôÁ¤"R)R¶§W?ß“üë*X®µƒú ž¹3HºÄK”©Ù’èqÒH¬b°mÆ9ß¼•ŠQ@«›\«¬²` G€[¨†#…{O>jŒW³¼‚æh¤Œ¢k!=×BÐŒ‚uQ9y?|æS­ûj‰b¢*H°"/sˆRþÓU|]O‘3ÕV—¸8LaÖ‡i_*\S´ü]kªL Jš+Wq;ÄœŠ®~Ã4Õ]®ÐP½œÒg€+Ép„q˜b³à"BÍÞ‰/ZbX×F ¹»Õh¼P‘¼xËq"_¹Åj"JæNI—Æ@ì¢ú>ˆÚ×Cv1²6mÓO¯Hÿd4ê"ò&QD¯Ø²ß*ôuš^• î•3¥ªÜ;%Â)ÊqKCE1¸cËâ¥åe¥Ç–UøM¯jî5¢E¸`´:Ž1L§qX8ªl-ÖºÐr¢WÐZðP"°ÚŸÝ¦êÂ÷UüÛ3”¾GNG9)ï!Ç=H­òù¦%æ0h[?æZ2XÝm›s«YÇã`oo{~-st|B-ëøø„ZÖ4µíõõ‡­­RÖ&y((&Kzc±çX1Ót",¯±£“1ò®Ð‡LÁjÞÃÄÄ{t_ú'E4‰Gèbe™™iã2"ñ¨ÊrИ Ȃdz÷3ãDDâ=€VU„{ PJá>¡›G@Á¢QL„ ÚñC1[¿èV\ó§ˆU}ÿü UàÄ[ì«Ä³G>ì—El0e¦DÂÆ Kn5zÃu~[“•ÜÖdh*Õ÷8G‡ãñÔó©\hlÁš/Ç%   õ9Ú—æ+þmµ2¬W£"+€æYNZÝêXƒ“=TCÌãÕ†½Tí56É)6ñ$G¾+*įbéÿ–Üe8N˜=ŸfÓAêdÆH"~U[bIüZÑÿ#âY›  õ ñ=oʃ ú(àtÌ DÖj-A[­±%kl Ч%¼w?¡Cní¼Œ6=À%ÞKòT­)H{j‰éšb¼k–ä^÷ b²>Âü+#´\1“è§@ó%“™#ïbáñlz„®LÀÂ!ç£à­¸ÌЦ·ƒbY·¼…ÍÆÆ£Þ.UüG`ØvÇ—ð÷Ò°‹rlh“WL7qaû„QÐ;\ð@¥\— ]>iÈï5îUc·¢S^†7‚éT\j5híXþ xÜ^ó»ðŠ­¨!#Ù#Š/д¾Ú¾Û‹Øo,i£ï} 8Tù”gz®dŸühã%Ö2s½`p3§ÓžgŒg`!Ö‰ö>°NB¥1–çŒâ/±ŒpZgµ{ Ê”ÎbU¸!œ?è/Y…‹ÆHV¶[NWO|±.¦Î¸R1«´à¢è¶ † Ïvà€Ê 4ŽUº~$kUÌpൎþ,Úþ…IüÎg xîæòZ©…Vkx{E•¹ã8´}¹KÅ2öi^óÂÝ6…ìv±¼P¿C1Í9ÁC Ï¡ž„"ä~p'méÉŽ¾dCÃTS,'ê¿Ý-Žb1)áÔ¡Z4ÀQ…]4¼Ü%qœ‘5*†kê³!øUÙ‘^T8,Ùƒ»®¤ÇÑEÕz‘¸³–ܵ N¿/êhdiø(­œ4ÔRVØc9>]WzÈ¡©¶“iÀ,†mäTK`Ñ„²*„½\”®½‚*–@Ñ´hïþZˆg ðˆ·%’‘k ág·Í5(ñå¡à‘Ú¢ŠKùû]$»t—lA¾{åù«¤ÇÂ#Èîòs(FŠ9(Í ‘ w1àÖ’Ùèg V€–UfQ°e÷PKâvšìÎjl(k‹MéÜÙ’ÞÙÚÿù ÚàIXéÖˆ©îDe ”ì`•s©¦ò¢þhuÝF”( ‡¦å£‚2ÌE0uÄIG<»!*¤:q©;Át î”ˆrŠƒËÆ½µŠCÄsNÀÒ ¾UùË×<=ÖK¨Pã™gϽµX¥pRó!g¨œdj’<È*<| Õj°^ÿtÊE«(šîˆªëHiðR´íVVã5Ï%Á½ ÜÜ[Ó}ýºH§+Ñ5aýçü—§Ö.©–¯êe+ ®ag@Ùâ½È ï¡­CÌM¢Œ-‘½ÃXÞc´!EqÓWúØ— …¥wíWÙÂSŒGKP`)^BâgÞ()PApVŠž¸†7±¦Í<½è\dé%˘r¬¯¤íËŠ~³5Fë@ÇøI]kŠó?[C ·iþVƒ.lÄ·tš]Úç^Áè­L×C³‰Ñ[ýùƒà9¦´öª³ÆæÏ±ÙÝ$O«W# y¥ÜE#»CšfR_ôÓÆcLõÈòž‘¨í½Uç\œ©‹ƒ­ @ßMFÉòAà'åæ*3çß{„laKeeïd0ÀI¬ÞŒˆ#=jØ>)#¿*ðóè¾LЛJõr’Ó*ÞGÍqz:Yﲇ•èJ?k•sÅ–}‚ZFLªþ7Fe I7-q?’;ƒ}?ŒYñê©:(—"}yééÔ/r=ôJ÷ ºäX:µÖ–´ú¾Gƒæ£ÖFUÑœð"P•H²zP¦ÖÀ— ôåÊ *~×–uu8zLï¼”³£Ëaz8&–ÕtéŒ öð^™?·spˆª¾Z=¥hÁ±J{ü°XQGj *–é”3Q)/¶Nµ?}êë&ß§!u Å* ¶W.[Êé s5^ó†pоøöãhÿÕ6¾p h‚¡KÀ§m2ѵ•fªx¬Dw5ŠïšUáœ/‘j=Ö^¼ \Ú®8”Ê0.)M†mVWº+Md Ë ­[™—>¨.«5ìÝÃAd2¼œ>æÔíŸK÷·BT_­íá÷®¾S´QJˆœR¸4ƒ;¼ltuªM2VK¹Ý@öA°URÚbÉ©.iî£v¼Â*› m]+÷jŒEÊ ½RìüØ%õ÷˜£ØÉ£ûMiÇX/´ÿ*âP-ô©×J¨‰¿ÛMðȼZVŒ¹-Ô>Õ‹5dõm-Þ^""ïî9Ê$îz«f@”y±SÇt`Ðé:_»ö¹O¬!r™%60#󱯾Òù#i÷+aXR£mÉ^$Ù@,9Æ|-@ á· ä’«jé$0Œç4G ðŒ:JÒ!}§žQ¡ûkR –x@ºQ¾w5.I4ŸÒ@º6nÒbèÞØŸºüIµá7=žžÉ™à[ ù¸ÝDÞ+È2rÜÍ4:,ú‘âŠcÛ à«lý™z`#å3Îôpp¸½¸µ}]5Äwmóóºd­Òs°t¬«|n~Ë=êp×*¬*:iÛ+ÏPiº›´ø[%V*·í+RˆjÓõòBº*q&ÿ$q>å=Àué{ß` `ÇDXOßÝuÎ pÚÞ>„ñŸ…%µ øn ÍŠQ÷¨™/µÝÕdo8Öïat‘?ý­:‰5£k@„ç´ùôo§Ä•©µßê<äÞ1Ž, íÍ.;ªÂn4Û-±FÒ•õli„Á¿Èzt}X$:ÛÊ”ë†8ã¢#óÑ\#E°ô,Ó±H.ÆY_\Âi’žÌäVÛ2ýØA'¢–3¼¥®œsL3&þZj‘‰·V›ð¥P>Q̹ýhÔp’¾„—…íc²Ð:q‘ZB˜ºð*,Ö« ­_&Ez9ò™u½eu‰ø¨Z„ÀøRÛ8 hdKl¨0õAü/«þU_t±eT!8Å,&^…ûâ¶2´òûçvض]$©s)IùÜâ­Ÿu ¾®ªD™Ý°ÓÞ9Œ5 ¶¨ˆ]ªŽƒÑó¸b€elÉ¡Ûe¯KçÖJ ¨6õ¡•z”NUH/œ.mM\®º3±tŸ(jé š£ß©=ú†úëF'¼JŸykZaåšaÃ} Nü›ÑM«@9FáEŒqî£2F3½ôN"BÜú ¹OÙÿë¨õýI2=»©ø/këkë¾ÿ×úÚÚ­ÿ×M<ü/ÃÉ ÂP­Ü)¸&® ©ã`0“Q%èGe»oþ°±×y±qtÜ9Ø8þ~ñ–wãÕó­ßqrˆŽŽê3}è¿ ˜ïì ›»wÏò¿ND„缿BqGšÐŸ¨||ÂZÐ;ªûõà“¬Wúˆ‡ªªé½¢7ºwtØU¦É¥Ž“c}|D/m}ò˸ìTåuXŸ”I+,Ý+[×M,Íöõý `§Ì‘iΔáUâ”; •“kËQÖšSRËI/qˆ¾"!šÅƒ‹A¬%±ÀÒÞïÍY^¦ÿ dO×¾íÇgý¸æÇ|ôàÉ-ý¿‘ÇÐÉc˜÷­Ø:K“^/q¡¢°OïPYÚžD ¥Ó?æ,O{S}@:ñ-ŒÇK1Èôk« @'’îô˜Ö}¾½$sro®o"§†]øJ¸Æ£À“¦qGYRÐU™±<µ57?G«ñR±Ôp\£µxéb͹/×ý—àåÿåCxùÐù(^š.ÙMÿ¢;è׊ŸWýO ><ú%0(2„, j-^{ìõ`5^×”†ºŽsãu-~X*ø ^[/|¯ù%È?•Pò ~Òp]m¡à£xÝoû!¼|èà ŽKUSÛt­÷^Þ±4õê³kšÇEv¶^PTãšôøôßû Óÿõ›¤ÿÖ×úôÿáêƒ[úÅÿ§W ²þxƒ«~L’Išc‰ÿû¿ ±—^Šy2LÇ—9§ýÛ– JÏ Sºܵx€6FÉàº`H3Qåby™õ^‹# åý3@~:m‚,AÑxlbΤÀB‹I2X…}*É0ç¡s >UœK‡¤ö`ÂÈ:”"PÇÙIóÄŸ­¬˜ ’ëÂÊ®ÐÂÉnr=žM¿àg}Ô¨o\¨ê´=Zå™±´8Cç`è ‚¡Cð‘ÿîq¼ôØ÷$^zâ¿û6^úÖ÷§xéO‹ª¸*ŽUúô§Êƒ5€¦5ô4(Ÿ¢¥—ëpæ^~[~ùŽÑÀËGå—ãÇôRxoÿT.úHõèèãøIùå“ÌoCƒÿ6TòOñj5Bçø–sN›cƒ» æ@ 1C¼Â^Bi¡Ò¢àp6oaœâg·mÔ‰zA Ž £’½¨«Î* L¾¥wž% ƒhßñðÔĨºð:jìwÜ^ŸÕÜfÕ–5ü×DpÒÒkÒà©áüÿ^³ë?ÌSæÿÓûýsfºnÆÿsíñú£Õ’ÿçêÃ[þÿ&žhŹv^‹íûÈð£§=^çÿpŸizM¦‘ù䛼ÝQ.D•~ž[?­I0 ª¤AgNÅa@½¼¦ÚÛ0ÍsèØ°@þ V{Vô¶ñ †Ÿ¦OÑÒö}Ù饊qðò”Ÿ&S‡¢èÆœ †Þ›R‰¬˜f½âÏ–÷ûEVdÓÍñL&þSÍJ¢yšòGP–úç÷©4àÞ,)YÿÄÔŸ agëE¹þ¦@[¼~Åuõп™AÌ©Ž¥ÝQ íf+3ºíío‘-ûµÒKí×ÌázÞQ·Jò0I¢ucqï…d“[¾zÇUíØwI”kPdrÔRÚVqÎÇ/gG¥ ².óQ¯±­üpˆýrÊÏ—®©‰”R¼Pc»¦ú6]d÷ÊzY7k\`Ý”‰Õ¼ñ€‚@ü¶óƒÞJ&H¦›WQb±\ £y:%Ï-±Â)i%ô Øq”è£ðÊír9U‘½}•M©y Gg"׫Ë<àôÓ¤w¶EŒ-F‚,ñYœ2QÔ‰»&¬¯ˆLݧ.4/ . Üa§\ä…MNJÕÓÚêµÆóõóãàq õˆç,NbúR1V®qUà- ÈçBuôÎ ŽÐYêd7A&á:ßµå‰'®`„ŽaLuêšd¨é ñËáñS‘|!ÜJжK‰vegVqë&±Øõ¢Wëdd¡EÉŒ@ÀhHúȧŸþ ™ÖR4Uý¾F$Œñ¤Ð>¤ e[—‚à›64èRùV€^·ü´Õ V)­ë)­jSÙß&=>Nq9(2Ég£”ª¶GŒmÑŽNÉt]Z€1#þŠï ãÅ Ü–Á óº‘¶30Ķ;Õø˜èÛ<¯’nqtX9>ƒÀÐ‚Žˆ£XïØgª_èƒ.4ý…<Ä@±N<-üK‹äb÷•AéÙúb0øWµ+? òµÊ´+j”Âÿé5 §÷޾¹ÖSpZLj>hiuUf2ý®ÑxÊ ÓÂϨÄá'1Ô2é˜Gƒ@b-û<ÿy{ïøð'à×VÊ9ZlÓ³TR·eµ± m<Õ• à{ÓFƒ%fBÚ’nðPÛüe¶¢©ªÌÌ¢¦ð$n6Kí°Ö[/ˆæ³À°´õbɯËKwµ`È­Ü„¿? Ýœ W=!̼ ¯Xä!Âã;*$~>þáøPj%š:“³L5lãjƒðx†×7“Išä€ÃŒÒ=âüéôÏ–æN 3;£ »HrɃ“sQ?J/;T„ìÆì\ƒw¹æ=±†Ýà-86žÂWKÀ˜’Áä,YhD{\Ö Z©¦ F6Ý3QÊ‚nõIvzzÝEæÊ汑žF*›Ä&•TÔËu«Öáû~zR´¯TŒ{É€^Ú?ÿ‚VgvJåõ5>–“º0Û6ÚCÜ[–щØj¡ÐWÿÀ‰ ([ux8ï4§>SF_¯Z-èí –Iî\y,²÷‡ÑQË ®7'¢ž²šŠ¯iw^W$=ã1±<•°«ÌSÃ2ùu€w|L “ü-OVÔ­à¡°È.Ýš3M•‰täþŠD*ðD:)!o`LVõÝ3¹2dðìJÆFf¨Sx¶«Öeº4Ãçµ÷$,”ƒ7å±[µ Ü•îégp½{¯¬U_‚¥gÁäTÀ [yšã£ö‹DO…XmJðÎ!qÚÂêÕS|/·QàG+¼Â ñâ4ƒ¥:Dé€k; mÓ’¬tæ,×|ä²ydŠÆ5½Í —RQIâ&¯Iôè\7bªÐ ôS/uI³1‚|å‚ ¦‡Òå*ñm=‚˜Ü Ø)ù®ÕzW””{½á±½ó)á» ¸®T²Îw2ˆ¢N5 ]»Ñ yçå5g~4˜«’à´{Ç7€pÆ Ëöë=X*£~†è|Z[U¬PÚ?AÖápÚ\¤Íú:u·,+Øç ¥îtp½~4ųÐ0·¶›ÑÕ:Vxz‚vø5Ï»ÀÅ*=ÌSO_­Ç]¢°ÐJaëO]jÙ‡Z ’Š6O07¨µû¶µoîöã¢ÑÙ{¢$ïàÈlš!Héd[vå)ýzÇÐLKf#‹KÃð ³YîÁs1ÿÐ!ÓîÄØE·+°^#U-Hå ž Ìþ¶$pL‰A¨Yç…µ€Ãg§2ï¯VÌAG!E„vY|U‘p\Oƒé°9éît)‘­­Y¾ßÖ\Ý‹ÒU·íØâÂý²@¡¬n{×ο-é·Ë{Ó…“d½éï{³ž‚(‹ BëÞûZ<„¬„-ÂßZ üóž€ý/k(îŸäé?¾Œ#È<ÿG}ÿÿÇO>º½ÿ¿‰§ÿYÎ?à€³¨¹»ÄM~J¡è¥Éì$w“n6ȦJ;+bgJêÒ=±Lˬc Œ}¾0ïlÆ‹7°˜9J¥ Lðb "ƒŒÍ{ÇdÒËwÂ]Š5§`TÀ¬ˆ‚"Ô;p¼:x}¼Ýyq¸ý××Û{›;ÛGÁT»h™Ö»ûû£ãÃכǯ·Ý"?"Õj „¤í$æ:6âŒOÄ{ÛJ•k‡íi-†‹Lä*j`'›X £{åºj›:L3D`N†ÜxÖ2ÈQZA÷Š}Fà—W¦]|[Q9ôF¦û²¿0=¦-@Òm¢N„IuüÂ.Á3#d¹Fm´é÷Ã-&ŠL\6v;â/ϳéQ:å;;ïjS—ÝüaC™*™/ßó—ï“â̘ȑñÿfè>ýØ„­ Š¥óÌÀ÷pšÅxdÄs"V¤>6Ä:vÈæG7œÀ™»‹žòI9ˆdëÂkÀH§ìrt§(¼G%“µÀD¦G_i>cð‹Ô’¹¡9-Ÿ{ãé‘Éh\u“fuºÊG« v•®ƒÜ*GMé(±gQæíÎøD‡À¡Â,§ùæ-4D¾·a?Wç2ÍNϦVƒ?6W"<ÅÇÃÑT¬­®Æ¥Æ‘ÜQ?½‚¾w¯ÅYšPRÿêî-Fôàˆ<¦©ïõµ—gB†;dƒè˜m~oßùUvÁ÷Y1c-ùÅl4§Iw6@A~/v´èNm À"üMÓ =Arón•ª[K³³ŠEŠï¼Ú>ÞÓë«wœ®vÔ‰ºqw¹ìÃØÔÊ =ˆ¸ßÕ¿ÔœsÓe ªZ<^7”\^4Ükɬ •"ZØ›‡Ã¥”´e»Y1mBá ‡UYŽÏ—eDÌ9-kõò9ü¸•åAÅùË[‰æävîŸQÃ^ª½tÞ¨¸5u°á–&Å*‰A§îCùµ†ÊK¬kGîL  àG¨¶,ÇDˆ?Qà@‰XS0NŒØC‰sèÓBÈP¤È::Ñ>Ï9H£ÀéØ2êà4‡´WˆÏÍ–>x¡=õ¾UÕCOZù*Ì+Q ›Ä2ÄèriFKóUA÷Ëå$CÅ b ?Ϋ‹n…øk­™I‡åÇ0× ¨?é.Ý%ëÃH/ÒÑàš@†ÍnËS·ºò¼\vʬ‡ÊD—ñeç¸!GÈcáKýËåøRÞ°F—ñe™$£<}æ¹\ˆ‰ NQÔŠ' bÎ@Ò*‘:è•÷Å]¨Sy‹Z5#8ªRõBºËv)”ÿˆøüQr’Ìïx~486íÁÍK‰üˆÝ•»ßµ«2—†ê­+µNÀð“M†4³@´"Љe{snÌ‘€„%×`÷|ž¥ËÔÍéÎ_ƒTì_¤9GÞ}&$ÿõ³z÷ °_ÿÕ°ÒÿŽXM„×(ß|é6PËûäÑ£ªû?|´þ÷Ѽ_{?þG<úÒ =ÿåúßÐü÷ÒÁ ø‚1çéÿ×ÖíûßG¨ÿ_»½ÿ½™ÇÒÿ3_Þæ¾_/Ϻ)_Œ%]X# ¯ÔâÿßÿÑBY^ŽÅåYÖ£P€¢ñ4˜n5Á€3X@”“ÞFg¢‹¦iJ:it‰túb7€Ì®­³þÍ*ª®PÇGwqtZðýp’»PD1I{ÙIÖ“ááÍ…ïöîîJˆòŠ—ni¡O[ïf7±Ï“"+šê5»úÒAâýÀ;ÃÁ€CÎèÊ+ÆOü$Ë‹éA‘Îúã2L̨N„H…1ß/–ÎÓSh@yø=ÜôWtòþ³Ðkª ÛÁCš&p‚W$+¯àÂÁÃa2:M«›x'S‹îTπĿ>Jè§2+½.§€ðz ÛCoÜÇëåœÀ[˜:LQµ_Ù^d½W¨éŒfÃÀp²#‡²]œœp“³ë"ë‘6H¢õjŒzŒ-ñö «ä ŒLÚ¤´¶FãypX·Ý”6POç&z6-€kR°? ÈÞþñv ^cú¼ÖB£ˆÜ]‘ yýÑ]>¾‘éC’ŸÎ0i·†,¿&N¾¥ði@v©ÛŒG)vTtS˜b†ãÌ9È3'T1Wš{OΜÚs‹;_¡ù†˜S~LØæ~àu9üSncÐÌ3n` ª=ÊÄÆðW[Ú[ µ©ŽÕ­ãîl*.S²àlèµ0’¾šÑ£q¬—ÏÞla­·"G>9‘‰–åðQåvúÔ-(—õI¸èû³óòápX‚rW±—I·›§ÛÕàbÁ /¬/>Æ‹Ûé²|VÄK²ø™¦Ò Z¯ÓD\dùtfm¤&_ñªR 2Çö)# > ÉJoj‚̲A*X4-H;¯ö7öŽ[¸ë®Ç3ÚÖœˆÆñÆÒt;NÆù4DÀ"µ@L’|šÙ¿&¤k,ͤЦ¨¤SÛ‰4Â8„í_ ŠÞr§ ?jÜ…Ä%;'i …+ʆA{ÙüÖ“(RKP—“*Ú)!0EFû•PI\ ªagIÁK|N?–YZØ–Œðاϟσ„ަ8DJ Cô©+鯵H<èqH$臵•éÖKg+Ó¿6Œ ‹(rÄ`8ÜEŠ$ßO`uÿÙâSë98 è²±¶õÓ’NÙǰþè±€º¦ 4ú´0µ¾úJ†ßÑp`YYãRGÛJjÖ£ÖY:ù™tß(×mmm¾Wª6Y›!h.c! Ë­êöz`±¼¸ÐǹTTZK0üä!8抄œ(+}cM<Š1j?걃&¶¥Ç˜>âBÁz÷„RèÎy°Ó¸’ßgý6TÇnøã$zµ±ùýÎÞ6ÂlÔD§óžd„•1ñ!¾ÿù¸Pmϼ²›öäáU{R]<à|O x‹]m3ÔÇàs¢:wÖwiyAëôoK½€éŠ”éÁ¡Fo[j×5ŒWƒN@áRd´áaV’ÒF Ù[úUU=VÙþìø”8¤<ï_¬Ôhµ0ŒRÙ,†ˆX[ȸ™Ÿv«Ü‘¥.IT*Ý?µi|Æ'$U·Fo½°b´ÏpOÑîÂ}%늷ª]üÜVEÚøŸ&YAî8…8»«œílJo#¹ÅÐ8ã®S >7”i†å¢¡)’×±ÂïÙ!í9겚5ßt%ÉÓµÆÇÒL‘û‰4U?;™ViÎ._¬´ È6þç‚Dàm¿M8“‹f'BwŸ5j_ ±DmÜ UHÆ¢D8b\›û¶¼´po,ÚòÂDÓc‹$O)”ߊ²…¸3f©¯)R˜‘vüqj‚«I„3³PKÑ‹œi…Od«DQÔßXÐ/§I³&ÌâàhûõÖ~&µÎ2DP!–=Tã@ØH`¤ÃX$:åƒÍJÔ~æ˜åp?g¨/¼¡’¢çßh¬²Ûî]ÉÜ•ßWÅ?oíÓñ¨a”6€ùÃïKÜ|¥ œÀ«gíÉf»Àþɨ™ÓñJ®-x$3,iX³WV‹ã¼×ÿý[HXÈÆû†ˆÚÁZKs‘6}ÕKFΊå2w!Dw“QÃáªk¡ìE`b=·^G¡ ½zgèÀÐSù}Ž`¡ õÙ SÝõXÌWõ^}ä&qïRœ]ôœR{ÍÆŒ¼L#‡¦¾°GŠmµYòC¹#Ô†µµW=®Òlo…5#ÃÈ,­Ôù–ß×à›ôFõÞS,Go¥>\² ºÞUGŒ@}F–Uȕչ¨Á¾>hûý0'¶Ò֗мÐEÔ]‚iÞ”´öá¯ê&Á|…7öW¯.¼AäÓð ¤i‹aPŠbŸŸuH¦, WÔ"d‰M"ç Ú Ø­ Ú±«eŒÁ\Ç¡®â§DÞh”6¿«ŠòåN‘Š.»`TP@X6^#,|O—öã˧ò‚—WžBÕl„±^T”Ç:Ïh—†»-ù¼U_q]ú 4ÒmÉ®þÁ"hü{?!ý/Û ìO¾” ðÜøO«O<ýï“Õõ[ýï<°½yºï'¤ó÷ïß×v£R¬oŒLQ¥ÞÜ?øépçå÷Ç"ê5ÄÚŸþôXlÿÿŽÅs<Øw“î8Ç$<2Dˆ‰Îþ²Ñ•g#7ÓaÏ`¤J? ‡”þ†·k…Öšò‰™1õ‚bï'û“–.Kñ¦Ù’ µ~çýo›—ð_u!oô#°Bå˜æ!¤ù ´Š&¢7ËÉúe ¶¨”l)ÍgÓÉL:â]ž&Ã&Ùz18„LvÖœ•Ø æ’¢ØC£~–Œ(ì;›ˆ*(°F‘ÒJjyßÉÊO¢«Ù»tÿÄÁΊ2îSjp4_İ|ÒöÔ”Ú߽ƀ/l­JÚùŠñ©îà`JcÏȽ‚ÈFƒNÀb·ý±nj2ôÚʨÅhÊrP\‚ƒ v=*â — &üÖñéÚKZK´¥Í¨Òéî²è½Z¿ráÒ"ë|ŒE“1/=8ÅU>b¦B´ã¢=Œ–>fbàÕþ‰¨h±¶µpU¬sJLhR¹Ðµ+J¢Ô`¸Ò _O=7]ôjIÑ…¸§;R·Ñž˜§¸þÙe855ÈÜQiÕXaäï­ó wòGi§ZYÅÞ1)8m®_y éjÊ©¬n±Ô„=ÀÈd6R“—ÐpÙýñô€»¢ý—¥W+¼™ÏwÈ{Œ "(IߊëawŒRi󴋥ΒÀ›ã¥íFrGÐÙ'sÅ‚¬º“æ.h4 ¯Â.Ñ^©5Jò”A)-;•à,WaR¦ƒWÙ•?§¸ÞË!Ǫw ‘Óó^?é i¿òôeMÙï˜úZ0jÚ“ƒºúŠÓk‹öÞÊûÔ'Äÿg³““AúÅ"ÀÌ“ÿ<(Åy´ºzËÿßÄcäø£ï_¿x±»½¨æXpä”ßO‡“ÖN3M¤ûTÜ/¦­èy/øá£¾æ…­M+‡nÁ“IMÑ[š³ÈS»ÿ¿`®ü_ºÿ}ühmívÿßă>…fºÑ¥'NéüöIúK0 ^ŠþÍ“kaï2ô™NžR ¯ÎW_<_¤&Oàv¸æbXûúq"Ÿî4D u Lž<Š!9×÷Ëì#^#!B ¤<ø×Ç0­Ðžª@Ä‚à\W–ÂÐ4Hôè®Ã=`w Á@}ná+ìDÅWýU½KIäU¾F6UÞDç¡æ&òWZ¥2îb¸òãíWÀÉ¡•Ê-÷uò1BIVD9ùº²ù’åPnÝÄ`ø¾:uö¡‘Ûˆ©%¬ b1äƒU„ÚŸÅÜ Š Šß"xuÑðK£ÕíI‚&²)9µjBcS€xÏ4§ŠsÖú—‹÷êSÌKµÀ"û;O/6&xáI€X´Ýçc©ÀT•†:Ç hPà1G×Ù}Ž4ÖâÖñi?û´&š°DAðœVä"•3DðŸáÚëKg`” &iŽB”€-1Æn%¤‚§íåhRÈ7„2bDy?†Þ7Z-[ ½3ôÓ650€´ñ(ÕCÄ%õUvR „OhjN"@zÞo48ìi|»§&ƒMLZ-§•;_iÿY׉ӡ^xÛ„{ΦüQ(Èm9¹ -¯RhÏ«»Ô)9ÒÝn¥ËuoÀÙ9M%þK7ÄEh¬Rw¾âpàÔ ù‘VsLx_¯ ù҂Ȅń¾jN‹ÏT“_Qƒã,éõœ2Üû­*/Û•Ë¡ÕòkJYS¨Aç)J‘r %¸4œê–‹Y€Ã® < u$à`Ò8™kôzþ•*`û­!„ÛįNiî%V‹ÀßGöjèû«Á…hÅÆ—U©åe^õ_ñ$á7Žø™Œå†™ ¾ˆò{JšÆh%-’ÞŠÊù@:%œv¹keÈÌn9òzãd½´ßTûY®nª¸¬pƒ$YNù"lœÌ¸„^_ЄÊjz ®iv ,ÀAˆ‰ä` þCN B"/¤ ×Ãì.€²º)ÚÚ@Qx[7‰øÿj6æöù̧òþï>°Y_H˜Ãÿ?xð äÿÿä–ÿ¿™G]¨éþw€Çu¤ÃÄ ŠQr’ô(¦¯3K©ÊêÔÞxȆxyŠ©à’‹q^´}µU0Õ<É0Sž‡$Ãôë½/í£Íý¡Ó"eƈw$Ù€õøhãùTÞ§ÙЮ Ó'á ù"õ†LYuú”÷ôÄ „†<¢¨CFê 8¾èT™ú][.¤Z[PÄ…¦o2k]©J ë2tþí 9fðû–ºèÉ#PûÆï/t_íž© YåV^ãÛ1"c“PíO½Æ#1“zD$ÛQWi¶±)]Ë;»`ÉqÞ—´”¡ ¯åä~ÅËëϽ’£Ê5«i 0d[5K§šœ,…uËhüÇ»ó¬¾uoÅ÷í-Sè–‰ÁH² 2È7Q#­~•j‹½cñpº±ÿ¼>ØÚ8ÞÖ·fÒŒé=—nñ?±ìd 9ŠXÈЯläiYØY³m£þç÷ã–²þ§=!ú?;ÜÛÇ/°~Ÿ%ÀúÿxÝÏÿ²¾úèÑmþ÷yPœ Mw•`}1=À19‡#7G€Ý¤ÈzÀõê&€WÃ|ÏÓñ˜r/#™•‚⺘¦Ã¦¢Þö ò@óeAL42¾9@Ì„tx‡C\3à²7 Î}åÑàTFuÂéÃyc—T•rÞyò{=ÞßÚoaqˆÌÖvIš—7§c8^®Y\&Ák¨ 'Î[„ƒ§–}§jͶ¹› J*îYgcooÿxƒîE­óÚ¹”± ;Ï7ŽvŽœ >­¡fE?ãš“Ï!»ò ¦`ãQ?Ã%*ß4_ðšzÖä$Ó)ºÿ“pHÌA°¶ª<ÑIŽ‘ÒGc‘žœ ,Åœ¼Ì€ÝW¨â›¬Î\ÇN‘]ÈÓÞøtD±èå‚*ðcÏŒ ãÈ`in]› L3œ¯MKÙÏ7ö6¿?8d³ôƒ”&"HY¢p©k•J {W©pè÷ˆ»ô*íͤ¿ _¥Ò¹ehhdÿ4ž•°Lò¯U¸Íö›íÍ׸X^nÿ[nÁ8ý­CÙv¾¶ç{z¶ ~.Õäk ?Ç—%Ý€]‹jšaüd6÷_½ÚÞ;6ÚžÚw¬JéÎ9J¨Oqæ)éYR;mÃÞþáöþáÖö¡’k[Ò«m<Fh Ý”{);Ber£öµHj-Ñã±ÒvàµÒÔlÙK%4«ò½r#åÌ™LLÑTÁÍø×æñá®D:Iµ,ˆöZ‡çÁà [K¦(¢iVOm¿À^;:Ú ;ˆ¡äôÍÃ-VT,JÀÖö ²Q`Ó„Òç×GÛîgZ:ð¡ƒ[òCxFíÒ§¾´?ÿö&3¤p©•:¬ðÊ2RI)Qƒ¢¦–'^5Ô°å_çâûyp¸³wÜAŠM2©Õ(¼Eµ=W oQA^Ò,™}¹i÷áÏÂïÃËÍŽl|îFÑÍeÅNduµô6í f…‰`íÊÎþÁñΫ¿Ó!ö)M¾Jò·TéI7E  7*…ÄËM¿éÍÝÝ—›µ-j|m¼Ø>ØßY”P©.î0ÝãîÑ @Å)³»¿ù—½ LC Ë܆lm?}Ø`á—nU^¨{ÇÞªf2¯dÜ) »Ê«ƒãŸ¨C:è½êð»O¡´Û>Âö=¥ÌQ:cT¸¯6ÿr¸ýÒ[ÙýÁ,ál%,±àF’+[r½³¨?Ì¿½Ê)v|ÃI`}Kæ`óû Ã÷^~Êß÷SÚ±yJ™NøÍdÓŠtX¼p”†“”È P¾£Îßv_oì‹§CëùÃ-¢cúŽ@*Ò fV(}Ct†¹ pꮾ}Üð»q¸}üúp¯³qør¾Õ1Üä³ üÿ»ÔÀsäÿG×”äÿÇ·ñŸnä ËÿÕv7$ÿ—¥nÇØCâ[]š‹m¿cS{¯»§«kU“§Ÿ$«[ªoaÑ”ñ”œê,o¿GÊÄTã ,¿gEHÛ@˜­ý4¶Oœ»hØE+\“9h’iu'‹&Xk‰Ç-ýjw^_ÝN~]j,}tиÈû;äWANÕúÑ,¹í]áH¯> Q®È°v  ˜²S>ˆÜÅШ$Z–T-‘Q4Ih¿Àö Ë4ñËÔª jÙâì‡÷Ÿ)i…-ã:P%š´g'×âÄ ‘Êññ—– B?àË+|{"®Ü×ÑU«uE–¹ðé×%±ô멸ҡíOudLd@¼Fñ|®*Êß«Qüâ¯9Y£nGÊ…¦`‡—XM}½º6õZúèô Gê¼_°_áËô«Jèó—)ûï/yÅ–¾èVQ¿ZÅmù-¸%–¬-XKE£$ W´%?/É=U)ÒÍäJô\W¯'0Šœ›ÖFدÑg“s ø½duMR¥…e>$W¦ÞBC²šÊâsG$gÊêciH‹ ‘zteœ©2K5]“8‘íÕ”HP;ÁN<TÖÖÀS&ùk˜ûí’ÛF=aý“£!á§Fà­ÞÞ^Iµ‹æ¬ð¾ß¨¨`ƒµPŒ!SÆŸð’ÿˆ ¸OJ«‰ÿö`Í·ÿ~²¾~{ÿ{#0I†âëËM4`D \±V¬ãɶyÞÝÎ=Ú¬ ¾2R‰•;HŒõÒ²ö$ß c’ÈßÛmõeE@«ñß·i¿àÌÿˆ‡ È(_(ļýÿðÉ£’ÿÇê­ýß<,$Éé–Ñ¿Õ ³íÉä˜2½+5²}Z{ ˜Ü¿+.øæþÞ&ÖD¦ÌÀ~éóÜ¢ôÁ!T‚LˆÉØ]°´dO|ŽþJFøB“a^1ÅÈæÿ?„èTæ½ßeGðúù¿¾úxíaéüx«ÿ½‘ÇÊÙÊÖ±}aö!§è¦lŒ«»Hc¢Óÿý-ô‡½<ËzgwÈëƒÜ„ ØÛ¨îä,¯R»$ƒ×;¹AšÊo µ¼b7Á~ŽÖÖ¿Yÿfuµáq®-Ó›2ï,Á¥Mö+@Ø.³þôŒÂÛgZG¦sï`n·¸ôcà‹zœkt²ÀÜÚ,âPM;…·©©ópg}»]x4 ÃÛ®ÎÝÍV5Ó´å4TÖ"us¬‚\“tÒ'/±º©ëg'te8ÕöÀÒË|˜&˜K¦;›Š»¨1¦ÝñW ŠYï cJÀd¹‘ø©±JÄÆÈ‚¤M¦ß#‹ÖRŽ'£¬÷Özñ1ÓMj¹óÖ$ýû=™+ÛÉXd‰ÓÊMÅ*eBšdb_yxvÈŠ¯,¦:íÁÈrºÆË×™‰§VF2éþ­rhX6;d‘@®nœ!Mا)™xò0CìXÃ`ÿ"JU /yÝ‹]ÓÚQF÷ÁtÇbš$ÏBr­I Ü5hßhV^³hʶž¾Èqó=©²aFN‹¼8Ùç«`[ñ€÷¦áaB Q{<6U1KŸ€¹s½ÉÃt¦åØ­+ Ï{SÀÞ*úôTùV?å¾p«¬ ÝÕs3!QS‘[‘|ëœÐ1^šZ³>enÌÿË«M×Pù¡*†Äês]üãöRe¬fr+}Ùh£S¼\‹øJ7¦ð–ý9ïå”Þ;™ñ]>[s9™›¤«YOù@0=·²Ã çÚ±½‰)ã÷H»WR¯lW ¤hº¬É¼&^È?`x¼b2Ë'ck‰›õA¼°ÊŸ ÆÉ”.›Æ¼£uq¡ËonšòúÆŽ¹W§¼®ðjû•®0L‡ãüÚnµã8ÿ’AI„·’ÙÙÛR™Õ5µÄ˜¿QÉPŒ"! ÛóFIn hfz2H¢Ì.š#ôÑÄñ'ÎÜãÉ—ï•q/-ŠqÞ”áÆ‰\L’|J˜ ”-ì“å¼Ùc¦þI!!À EÞÌÄ"k¦Í˜|O1Mž¦ jÀɺQÅ ‘N{Ð¥m4µ£N£ÍK2²㎠KºÂDµŸBÅ! ª p>©§×d ˜¦°™á`ï£Þx6®+!±Ö¤j= nDþ¾úËzSæ»÷&Dj<3 ߢ ÃCL›K?Y¤¸8KJGÊÛñnÓº\wû³§½ªSB;{G34½ù]îz”õÖÅSN´v•`¨®Xâ¢êˆç­Š¤™<ÓµÃd §zãxðæ¯´‡…ø1Uù}Ø›WzuJ1 `×ý4Ûø·\©jžb-:†Ð¸}Œ k¢_ÀÏá˜òú@™".APîcp¦X.ÇÓ±1Ùu©‘¡D*fÖ{b[jVJúzè“úÌM"e/ÝŠQ‚½–Ãá`!§,j ù¤ð£Ýin× Õ£2·[‡3.(UàƒÌ·e½ØØÝÙ8ÚÖ”Éúrt°³»»½åR¢ç¤÷Sø$!@ MòŒæŽ¸”ÓÜæ×Ì©KWÞ¤Ô ÔÜ“lceͤÛE¯<¶Ä3¤™ô_,†±år¤>CŠ`U Y¬¸äõ×a’¿U~‘÷îÝ£`zY/CΚҭ˜è ÿmºûï…Z£öı­]ádäâ½@æ#8¼ÌñžÚŸ‡áŒN1K R¥žqÜ2Ô ÐÐ[æ•…$VZ…aGïê‹=­€b}r¡Ð&+6I£‚ päs€yÅjÎ9}‰¬Ù¯•§1ÙYµ°Í˜¿ÆÃKŽøÏ6æ(Cv%þ­ÈÆSaIÞ‰ø»ÝÙ /œ¢½¶;u€PiB§¼¶®_ÌÑ`Q{Üóëãö«ª?¢oº¾ªÚÁ¦6ÒT ge,1S³À¤¹L¡Iâ1ÀJȨ-Ô‰€šÁ5‚°ûo»þ(rg© dOl݃‹)åÉ,úÆËHÁ—%a£ÚÅ¢Öy´<s)Ç®÷êõÑ1Ö,ñ Šž‡I;‹AËD èVÆ'QwW*cê=¶Â#Œ¡{ü—N­Z£}ŒÑ‘¤X£g6¢Çž*NU±›° úék.OxJÿHñd.‰Êƒà®ÔÐDr]EŸ5—¨œîfÐzžÇ6FõCâBºÐ<ׇhºÒBApÊ=E!ëHÅ7E£ ƒ#!B¥žvE£P3¬õä© ¿Lq2ààX–JÄKŠa™ ”6Vj8Œõò5Ï>óN:\²Pºr»‡ê‹pžfÒ.å2ÊU³’mˆ¸¦+êb‚vg/Zw˜WS[WÇâR}ý‡µ‰ÂóëÂTmÿã3ë¢îÂ'éjF§XÂ^:¿µ*¤$.ð<ü|ÐóñhÁQWÎ2sêØT‘üuÏ‹mµôÊ5J“ŠEwÔXew?czGÛ%@Ÿ£r»4ì{¼N¦X)Mbn̈%;¯öñn»Åž¥²F!cºÄì®ElÍÇ–Ž©ZK¼ÚßÛï|¿qô}çxãùî6²©¹´ÝùKzÝDv¡ó6½ÆøÕ)Gþ^¨ÇJI4¯Ó»Gû-±µ2ŸŒÈl:y–I²lQO=Ī뭸°Ü2¢\ÞA³šsôÛÂåxtAž²)±­w•ÙFïtŒ³…a• ŠÝÑèžg·ÈSlI@ÆÅòDàzAÏú~¿xëz¦PñÈw?Ùîû”ç°µý¢#]Þ«¹h©?bJÚÒC$éÖú­­† ;Ê& ï™ÑADI›~‰LàHÅSŒÑ¾<ůw-~ø€òÅŸÞß%¸(ÛÕ‹3ë²¼jƒŠv]¯ªër÷Úd‰îW÷‚ÿº Úsí¾@ÀzûŸ«×JùŸ×¯ßÚÿÜÄÃö?[æFWß b¥y:tÕÈ6~Ê;“L€ºÃÀXc>›¢' ¦„Ws6çqMv²ô㩈v¸m~§É°ú4¡ùöAºšMt5¥ÜÃÞNΊkO)]k/TqáÿO¿ï·´ã¿ïº¿4}Ö}Õ?çÊ__ìÆÿrá/d@(œ4@™Å["‚gÓ1ÆèyÅ1JÙÖK2*’¦ ö¤. ®[“«Ó[“«ê·&W´3•€üð»ŒüB!¿Ìg Ø_ÐR@}W†æ·g'`>Øf‡Û–3\Ãlë3Z…ò:dÆWÉ´wֱŠRÑýݰ8hïaß¼*N›ü)ZÂc‘8ˆ¥ _¿l½@Áv³×p¢µaœCm±ôò@ºŸ(—xA%^Ô”ØD—ä¥ÍÍêx¼@ø§ 2þ­.évÈI„œÐ{vÔj6›˜¾‰ýªÊ#Ö<æ<Ј.ƒ>©+£îõêÊÈqkáÈq÷¦ù ®\päò£3zùNcÀ2!Tµqº¹y Ú,—{a•{QS¦^—Ûܬ.‡ó¯ ˆ¸ Lë¯\Öð½m“JQ±NÚn¶®Ü0‘è’rE½"ÖÆúŠ`ú'B5*Ö¨X¯¡çŒ®.{øEƒ2w‘óáYe Ð*Šˆå6€y•$Á²ªü¶6¯SC¨‚9±U5$ý¥1î͆‹ —GYaÏŠ6riïáp ö>¼›Mlw,e”ê1|hn}ç#Â:³Bõ næB·qÐCégaüÍk1ŒG»i:£¢¥ –ªŒñ&ð¤Êú 48‹6ËuíV#B-ûŠ)V¦åB” µ·;˜Y¥ïT ΣçŠÌN<ËX'‡÷ÉNR'IRö!Qo-=J[*ûÞ[³¬7ìÈTE4ïRVi_1üX8o¯M«Wík[«M ”:ïù_·UËâëʯ˜X®ÅŠlºµ9ýª©gãlÍû½®çÑ2|°ê"'$?9¸_‹]0 {=àák惷 k‚ÝC6“²žÅ•rÕdd &#½˜”Ù)ýQ߯N.Œ Dq^Ô"ëa‚ê¨Cˆ®mÔF`õ<‹é½ÿ;{UXlƨAÙ ñêmAÅdZˆº¸ ¾éàä>fŽ´î8¥"T†Ãà;±Êõ˜9]R#liwÚ%§¥ îÒðpP —pabPµ×;œð:ØjkV\ù{©çp׿Á,®~?FãÑ}š—ìÛ œiÛÚÿ40¥ 8ð.D¼+¥îùä_—4„Þ¼Ò“g¦^}ôÖŸFƒ®l[/õ O㋦µ¨B|HЊw±-sš¥Ò†¼Ž.0™.:$ujOHBÿv2 jÉ Ã_ð“ÄrZJ¹¸OehÁäzïœ/##²BKî ˜šÇ2ÔxƤ»~2d*¼^ >ÛP¥­>H€e3•vùzÎ\•¶1s©õ¶@µƒÌúûY1„†•ÙÝG ÷_jR5ŒÏ=zÝ®fZ‹ïij£°¥Ø4ãA:æ}ÌàÃ=^”ó©GŽÊ ‘ÏLçô·ãB˜9“ÄR”æKš-÷Þ’¿ ‘ûô4ƒ¬óý-'ÝGæysM‹ä<Ñ”6ˆ~PéßÙ ÌÀuaËÑ]2ÀŒ›ùW‘Å©½yµ= ™_Ïš[¹Gû¯ü„èJÖ“¥¤$+]œV˜Tr ®¬5è÷‹µVëŠæ{¦ Bµpê‰7¾]è†0oæ6Þ1˜¬ä,¥óQùê­v½Z Þj¯Uæ¾Ny@ ïŸ\ªs  ECýëˆãziœ«ú:q1Êñ G£±â×ÃóêçäKå‹ô[.†WÌ»Ÿ/WÓJ¥á4fçh £á¼z¾\Qª4©­â”ç¥}ðÍRyqºïÝíH )~,“CO·×W |V a‘†¿†4À$UúæXíá&IgªÆñˆžd]cÆ„=ùL©FÝÙzÔÁ$<Ïܬk‘rÁÖˆW1š ÞÈ‚ò¡-. ¨U`†•*¡Üíþ‚꽯êì”uuÁ( åUƒ´dhfy¥•옜!g†d&Ë™7_÷NTáH3_³#† *:a¨„³£,X_V}w^UÊ]WŒ‡—Z×_kl䟥îIÁ˜¢x-uÕ=r´q¿áÒ<\³PÜHŸxG{Y|FebÔ +zBâÆ+ÕÃeVU ð“ÐaÉh­ƒ@ÅþF'gØ­‚ª33®ÍÜ>KwKÆa!Â?_éB]u×rEx›QA±{ù*Á’`5”Ï.R—nô7^…T7KÒZ9ºlüìÆ‰Ã¸]óÆf/@@Iœr³E{{È— ©kÒç? ×ïºTX’/6¬¿¸±EaÆÒ!aæábæÕ¨¬ÓªE+·}X)l»àå­¡ž*o21'ÒB Ñr"¡QÖl“$1ø7-V߯u©È/5h«Y_^Ô0´•î¡4¿Ÿåö¡,mã´ØëCW”DhÊÔÑ1Ò/I‰ö¤^ ^’}_2Å:Þ¿j½4¶½Šl¯;ùË’ª8Q÷ÍЪP£ }ÿû¸$CZúïë%•ï2ùQ§8S–—¡Œ…Ù}Eƒ43è:®ˆµm`É Úü‘7¶e¡Yv¶lQ¼šµ²5¯MÁœ)è†÷9g “Yv °æpìýX fÙ€rñp o2‹êäì?qŽÎ²ô”Aнá,ûιiL;s'O"¶Ó×w͸øŒ†lfó…¹ 5m|홚ô:›Öä Ì' "ÿd)ÚOF㧉þû€øßÙüïõ7«kësÿŸçxœø¿=?̯h¡»Q;V1$(íQÒMSe æbÅIåååñ›  ãdtšDƒ\.sd×úÔÜÝúOä6Ûoµ6`Q¼h3J•-›ÖîáÑÁ§-Nï†ïtê¾ËgeS<å…ÉȆÔd¨]ss­w›Ë·¶( Áï=+Ï÷ܳþŸÀûïþõÿæM~ýÏã?ÏÊÒ5ÓýȼÀõÚ*ïwvãà¨E…ÚØ#žªlë¡üà ×Ù#p„–ïÖ}ÐÛ>6fkÑlÝ^wr}Ìÿ—ÏÞvÖ«ÁšÝKNY>{r (kNŠÆ{7&°ÎÆÄ‹Á×|øbM^£?Ü,—\’ä$(OˆÇGþ"•ÄQô)·ÌìpÆ(;0|b?ÄŽ­ˆ·ìsEëŸ~Æ´W?Qö{×ÿÚ›×o²ù?^­Ïó<ËãŸÿ‘È5´€ÝƒRèÁx²ÿïÖh0 9l†  ¸xpÒÚ!td;v·ŒpÄÃk/ŒÁ l*UèÙ/RÎh9²$#ñšb¾èEİ$µâ±†¯pø„cúÕÜünÅŠ§°{Â~ ­¢÷öY`\$Ã娺|R]nW—;­eQ ^å&8‰O{Ã-Ét/^Ž*èUÕ¬m‘áÃÁƺ½¾pJËñÞ£Õ© Áñkùà–;>0*¯îYð=yàEÅÝËÀD—x¢’ØS±;ökò÷ñh\Xó!Ç.Ïÿû,œÿ‡FpæÜ<ÿj‚¸ÔhÀ™¿åV“è¤Çéæ,¹ätúÍŸZGÍcWW_(})ôïXc9RqɉŸV1%ô,îû¸›Sö¯8ñÆ$«yþ íb^¥ ØOiü¤`»¿Qw»OÝßùîüÇ}Šöou?Á!pßþÿ&·ÿ¿y]ŸëŸå W‚ìtÿÚ+ -“‰4iÏkêä]/_ôHÊáÜhæRM®>E¼Cd‹yPŽ™ùðŽ>ø9cíN‡¢,É!(m”±»!œ¨×nÇcöDÎÅJt7çÄ)ŒŽxËO.[2à’8Ê•Ž»]ÈǦ±k·57L!‘«¤òæÝ¸ó®-•<)×=86ŠrAVW™yµrÂNë'1EKâÓ”æ¨f•%÷ŽóN…¾ ~h©Øj¿¤h•,qsNåÞÕ¬ínÁÒH„»……ìP순h Tª“N e4Ç€’væ5ÞNã¦Q‚Ȉb›â[wKßR}ü[÷âõ™Ñlîîîm‚â%È\Éj•‰„¯Ôåz3Ïï¢ýÇã³QÿÉ€ûîÿ×¾Ëæÿ~ýz®ÿ{žÇn´ûÍæþǽfÑ&[È©s¬mg ‰xO /%áÜWœbÇÉ ¤È*Ç”êàðù·sÍÀoý­ÿA?é¥í=ÚŽˆ}Æ£v‚{íÿh±{ëmõÍ|ý?Ï#òÿ¦>¼ív œÙÈ!‚` ‰âmŠ ýïíµ~lý—Zfa.¢Û]ž&ÑØ·0vN\7»’DªÎðœ°EÒ€fRp¹`¸õÚë²LY™j{CŽÓ5ôc:ÌUþÃo?%òßðí׿[¯çíÿæñÿŸåqCö;§¹“ôZâjO¸“·ò.Õ‘&À)ÒÂk9O–ÛõŒõ‚°/í9²}8‹x?hÕ‰vËM ƒœ®½îµ/åd «$ô­ŽÿúéÇ}©(vy1_V"xs®I®U—[×Ï-ªïîíë]wW3J k.%“§íÊõ¯  8Zâ"´ÇÈÑ4¾žQasgGa‚ÓŸ>¬ªtüsëèãñÖ§£CS™/bÛÓIwNãÕ÷?¶6é¬èI&áððp³R^ç°µûƒ®C2íùÃ*í}:ØjªJ£iÒŽ3Õô¦ÏÖ< Öß&Ùs³ƒÑÓè•ñ¢%’u7û)J Æ4ÃE%³šVm\×}ŸN“öCê2ÓœWÞf2 «TÉ{68¿¾ô5½¶âÿLã‚ë]ÀàOòä.OËÀõGQ'è q§Mâ·f;i‘ÌÀ_8M˜“pÖ¾DF¢þñv‹ÿg5@n¡$wç†+IÁI#ƒœ»R•9€ì)M‡VMé€hQTy%8Š’Óx’ʵ§ì*BMAâ~L~ OÔ7XBJìWj£Ò¦B™Ýl "òÝæ»&âË¢ž;?·Á6-ð£{Ÿ>|¤¿š‡[›ûÍCé£îv ª4‰…6E)“„|~«Oöºl=å(©–IúWú.ÜVÜG^NŠKz‘Ÿš× D\©Ý Ž £­£¾½Ë ä¦×ðºÚpºH Ü?‹èÍ. “3D‡¨#PshU¶'ñÿîMZFC˜HÌg~gö!ÀSu~)N,˜û`2¼+êÓ‹ÛTSƒS±“¼ ‹LÂ2ÿà¨a•éo0î÷`Ø%×Nþ€ã‚…Tæ¤ë‰›"iuí¯?*Ub¾×œÇCAAÕÝø”¶š-§”õ“% ì'ÙQÔ9c?窀ah#gmeÆNa¿Õ)ÐÐïƒMgæ©Ì'•‚º‘Ýë™{!ð%·¦¹åþ‚#¤b»éz-ÛŽåLJ²ÍͺËÍ"¬ÄÂEG¿qÒŠkÝz~§(·’É£_.u‰>Û’¼0‡ªüýçU ,¶ÿ8}´ÎÇ}îÕÿ®åô¿ôk.ÿ=Çãšm|`åMàio„Ì‘8ÿ{#ó6‰£-æ>¨û©ìkãN®?8©ÿð —²G­í•Gòþ·OÞûx®¯—®zÌú_¯Óûúw«oÞü)Xòž<ÿæë¿`þ™u‹'ñKx.¦/»ÃÇzܳÿ¿ª{ù?_Aÿ__ŸïÿÏò@ÇS4ßõV¢ÅÖö¥?Œ®I6¸À ¡nOËd®ƒ¬ã\å°=V^1cœ÷6ÿ[ $ÜiÓía2÷é¨ ©Ä?ïíìíoïìý|üá`sÿ£ÈA:7¬ !‹'Öt9ëYµ—x(¤‚ „¼†òÇè`€ûŒHø~èX¨¼ ”öÉ4ÓvG…²ÔP»k,Ë•/Q:<£ ü?óžûí9;Û&;$HI=ñpÞ’T—µÁùv?:]Ô†á ¾¤Î¼Œº“8yéÓÐRÕ” –.uhÓ*÷ˆD¯Ñt2ž’‡šÞì+(4KÛ§Ä ¢ÿÐa›:ëØš* f³æºbûxb’b?àb¨ÆSrC„õûÇP2ÙSÿYj#dªÀ{Gs$¦ñáIÿ¼ÕQAgùû‚nljÚâHÅÕ€º0½Í÷š7‘‚Ûh$º‰‰œÝ– r˜¿Ð W{Œ\øUT±xu/¸ßdæ7u‚Úh`ª»p+>åcTC+ Í!÷f?j“ÑAŒ;ýÊ[]*× —{:+z¶£YÏt¼¿ÍãØ½Õ`U!3,/U„-Á½´ÆvŠøÕBþý­ÛÏ¡Ó?Ä/\XàpwÑxÌÁî$^•”q¥BÍ™Z`c¸n3†zE Ü~Ô¿Œ®Sãç/h!Øð‰.j“/'1}‹ƒ°× ¾ÒË—‚žð"¿òs'>™ž‹×Vê‚îõÒÌ%Y he(Äp¬ÁP"¨8isÎý_ñ)áÿˆ\_ÆWq{Š™‰¯¸ ¾OþõêM†ÿ#`Îÿ=Ë£ø¿’ù~Œ)°gÅ»µ÷ãþ§£æqóoÍ­Oìs©£·Ìøô0iÊ*¼bÞh¾!Ý÷¬ÿ8ôˆÍŽ9ÛÙS÷¬ÿ7¯^—]ÿõWóøOÏò€ý*ïÇz”KHÈp¢(NÊžãÏQ;4†aH«žÂàƒ¿wï$*ì÷š«|¥b£É‘#Û}ešê`Tgñ4AÚ©ø”½#ëåN”Lîª~žÊßzHG{ï÷ôcA€öÞ æ/{e™¯Ã×´ø1Ž`ûQ7â;©7ÚQôWÈ­¿ZªÔÓýtå{ÂÜþß"§ýQÇáû1È4q,EU2vàRqêW¡º.²e¸b‹˜O€våJšæ³Ílý¶’ƒ¡ Qד÷;½Te™(’Š!(ï¬ ÙUdèq‰½\A˜ Òe³õ¤ˆµÕYªì¼û¨eÏqœð¶ùç?/P-Z ':^œÙ.rµ›ùÚ«ªö8h^õ&åu×Wןv}ÕÑ€sÊlnðÎŒ†d*[•Y²­æƒ‰a4ÀÚ—ÅXDç±ÙPØ)†—qª Ú¿]ÐÕÀœE) ¿U_6T±³_ÃPŽíP`Zˆ¾!ÇÔÆÌÉ^ªÎQ °w8Íë†×’”¸s^›{´3‹nr_6¢e¯úŒdµ\QSƒó,³øZ“>< µUåú)^Q.ªîˆ93nÉLkí–¯ËÀÒ¬JJ%úwBSËá«váiñvïL€ÃÐ]¤ ‚ûJ ùª¬º¬*k´BZëœn&¦MØñ(•“§Q±º W(*.Zƒâ:4º“Þ»±FÀ©oø¹1v Ø58šYÈÁ­gÀcU‹ZÔ×qEô1­--ÍÝ Ý™Ò8yû™Bñ„Uu™oz溎ÊI(Œ7•ð¬“@EE«kgooÿæ$jŸ+ÊB <©^EãqŸ“UÉÞ”ÛÙœ90aýàk· t§ôR–ëDÃ4ióÚ9–•ÂCµ4úê‘ÉçÚÌ5Îj ritq½¢Q(U=B–zU½K›¢’ªÙ/º`~Ñ[‰ñÎPk–á&³o3CF®0“oaí3÷lò¨¬èÊöÚDYif÷÷&»{G°0X:™êÛhüI°­ñUŽt…v$Ëv÷àðŨÕKÚm[H¬cpÄ Œ¨<+Cß!­„û¦«ùÑn’wçúSŸÑŸµ‚þÔI\Jk>˜|ôÊ6Šhg©˜Uù6[ÄÌ/¯Ö2­²w²äsç›ä¸g-³°§ìò qǵNX;'Õ{»¨‰Ck¨]š°Šjîÿ=Új£¦žÁ jUµ3Ñ¡õvþèg†þ—µ€Opýþ§¾îÚ¨ûÿÕÕyüÿgyý¯;ßÕühñ‚C[²"…ú˸wzƹÁ-½UDõRpGk"FýÓQÒ›œ $9Nz=8õé°L{02îÂŒ˨›‰0k£(hÁ:yØA˜ÁéÐÈ ÂkkµkP@ýG ò_¡—y€¶û±7ö~múºÍ‚[© ƒöWÍ4Îää™uʲêBîö©¸˜ÙLq‘!v!èHÙèƒlœüQ|5iíÕ¤êÌ›Ñ u+“ Ò C¼Ô€¯•ÇI¸]i9 /êÃý¦oi€Ž%.ž»* Gœà.±.ÅÝ·y1¦êÉx¶ –0 Eôµ ¹í¶‘M/Ur1Qv„—ÐvŒ+•EWÅR\忺Ô8eêˆx5Á´Fk÷X-7—6ãqÚësŒ‘zm5þ¿×OpàûÓ 7k:à…MU/"ˆô"Cd?îIV'ã Ó‰‘ðÓð|-×mp8b:•tðEGš˜Z! yh.X <¥7(ƒ.(QAÚlÌõﬢ©ˆP9ŸVk«Õ@ª!±Ñ)4ƺL=[F09˜ö'=ˆ ‘´‡84AÚŽúQâêðê€QÜíª¾TdV¿VïWøÏŬZ§H‰ Â§9åÁP«-ƒ`›H•ð£6mPF1£àåOÜMMž$Î|ê*a¥ª'§¢åP"¶Ÿhœœ§Iê¤Ó“Ó~!“.–J±œ¸ËRVògšâ¼¢¡0ëÁ%‹=á®r‚ØÒ½RRUI)âÈ9>* ZSe¥WàY™M/è¨K“r2°—‘bö±™qoVÜý*Å•Q¨Ûé+2î°º§òÅ¡§zö°(gRl÷eâæ•£~Ëe†ràéM¬ƒ yªºŠÕê £SoXé¹ *œ)àPÑ@Ö´è’¢½Ę¢ 7Ï¿KïãIýTF>X¥)‹G\Í@ã÷…öNú‹¶fJ—9Ë¡Ê*k˜Ë,±uh…<¡¥ð¢Š’•·¼=hm[õ”Ih¹7ÆÉ—D7Œí µcOçAO¦ß™Ù$›ª*#¿ɘZ-¡ìPD"w¸%¢ax&h*#K†–úOªÁuE¬Í Ò™Œ:#Ø5ªí«K:êœå™7µ×Þd8ó©ÚƒMؤÑÐMh{3=½n)*‚^!Á¥.Z†uˆ2“´ðœ÷­ €é€NÝKè$Œ:÷Øžú6XNâ ®ÑÞhß©zh87å£v[7J?U›þWÙ€…¦ÓnÛ¶`§sÈÄ!UœÕ qtf4j–1(Çh̲ôAR¾8+ÉZ5 .*á—¼¬1ÃfÉì-S!·tà0ű«þê“›é*‘I]hLuX=UÀ/ =¥Õ3&¹m(gƒ©“ÔZùI•Iª±\ô­Î´<©vëÀ^“kôb­â"œÖÔ<“zðþõ“¤÷¥Á44Tñä§UFªúF¶zø¢Ž÷ßèsx%À‹5êW¨8À†žHeÑP8ÃG%·'4<]XÁ §ÑvæÍÑßkÚúVóÈ yvõO5¶;‡vpýB`f#ŒVˆ`u­%þÄll”Ò‹v2¸½|ªã©æ†XøŒ¾i+.‡–Sd¨åÊ'“Þ0“‰N^ÍlË5åêSnóÊÎð5Í`|ªÊI~F‘ÿÉ-Fßœp·¨Vbç(Òï&úƒžLGÛ2pª%©ƒÞSeÁΗ¢­û/1‚À>ùTe)ž!þàÀE%.Õ>Âg¼“z£!õmLG[H¡ñ«ˆ’š‰3v®ù]]”¾Ù#ÚŸRÞ®Æ|CÅ•ÂTmíÓWÞ/L» û»z±­I8ML‡°ÖŒ³‡¢ ݺ‚¥+¤ =K—À8·Ïâö9 ‰äŠ£•‘,üì‘2o~WÂ)rvü–ÕÄèÍ‘÷F† Îf>Ê•b"î0,4â±D©îjxUehDÉöÌö—B#0ÄßÔáV‘Ѩµ`¾©Å¹'yvA\Ñ‚¸¶®¡x«ÈrÊH/랊Œ|Àlšv쫾 ¨U%ÂUli½ô!º9ÓDñž¨b–ëâÅ“®8Ë'{(ÐhÌRZФ!kR!Á°Î&iðcNJ÷”líþ´yÐÚÜ=jx¬0²P$t Žáå C¡DZ;X_Ë©9±l*Ëé†08p–Õ=ùß¡sžÅ ÛÊ蕽màQé…Ëþ&g@‰^û¡–ÁTE·Œ%,ˆ;ôN (tž „å‰oÕ7Z\ýÑe“!;Vêºuu€…à–ä-:¬èüs\v « :zõÖ+ÈòµŒb4B~t—Ç|l P/)I’Cn té3Šóe~,š‹ɵ»õúÁ’¯ÉkpÉ%{Â?{ˆa &½Øí‡{ã)Vj¾Ëˆ¾âð1A`<„F>^ úIú¯èšÄÓqàD% p×Q’j­¦©dªPÆÀSžL3ôu=¾z1@_x>ÛHÝ rºçÝÎÞÖ7€aT>ß[ Ø;7z¼`‡ŠÐ'­ÖV­pgøÏ_îÜRš‘ÎNi(‰Ý?cX’á-UƒÖpR3ŽÅèïíÞ´ŠGý‹¸³dvº/’Zå­A¦‡}²è¼¾w,ŠpDToô#ê4UË‘uk_]ÒöñŠËÎTÉ\–1áz×eöh8aTefGÂÝzsdF?NºáÒß'\/ü: ¾î`Q~Ýý;¼;>ËÖº];<:`å í"ª~K±]kí1n·kÍͻ͛ù}§,=btñÊçQ»ÎM—¥½’Nu^~ÿu§ñuZÔ14Ï å'7`» ã5ž;nT,)ÓÕKÛO…þq,}Ö¢RÇ[_¨]Ù‹#Ð/àÏÌ%äosZ¬û.¼{ìÌŸù3æÏü™?ógþÌŸù3æÏü™?ógþü[=ÿÙTê`mlton-20100608/lib/mlton/0000755000076600000240000000000011404470406013456 5ustar mtfstaffmlton-20100608/lib/mlton/.ignore0000644000076600000240000000002611404435636014746 0ustar mtfstaffsources.sml mlton.sml mlton-20100608/lib/mlton/basic/0000755000076600000240000000000011404470407014540 5ustar mtfstaffmlton-20100608/lib/mlton/basic/alpha-beta.fun0000644000076600000240000002107411404435636017261 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AlphaBeta (S: ALPHA_BETA_STRUCTS): ALPHA_BETA = struct open S val traceAlphaBeta = Trace.trace3 ("AlphaBeta.alphaBeta", State.layout, Value.layout, Value.layout, Value.layout) fun messenger () = let val numCalls = ref 0 val next = ref 1 fun count f = (Int.inc numCalls ; if !numCalls = !next then let val _ = next := 2 * !next open Layout in output (seq [str (Justify.justify (Int.toString (!numCalls), 10, Justify.Left)), str " ", f ()], Out.error) ; Out.newline Out.error end else ()) in count end fun alphaBeta arg = let val count = messenger () fun alphaBeta arg : Value.t = traceAlphaBeta (fn (s: State.t, a: Value.t, b: Value.t) => (count (fn () => let open Layout in align [tuple [Value.layout a, Value.layout b], State.layout s] end) ; (case State.evaluate s of State.Leaf v => if Value.<= (v, a) then a else if Value.<= (b, v) then b else v | State.NonLeaf {lower, upper} => if Value.<= (upper, a) then a else if Value.<= (b, lower) then b else let val a' = Value.move b val b' = Value.move a (* inv: a' <= b'' <= b' *) fun loop (ss, b'') = if Value.equals (a', b'') then b'' else case ss of [] => b'' | s :: ss => loop (ss, alphaBeta (s, a', b'')) in Value.unmove (loop (State.succ s, b')) end))) arg in alphaBeta arg end val alphaBetaNoCache = alphaBeta structure Interval = struct datatype t = T of {lower: Value.t, upper: Value.t} fun layout (T {lower, upper}) = if Value.equals (lower, upper) then Value.layout lower else let open Layout in seq [Value.layout lower, str "-", Value.layout upper] end val make = T local fun make f (T r) = f r in val lower = make #lower val upper = make #upper end val all = T {lower = Value.smallest, upper = Value.largest} fun above (v: Value.t): t = T {lower = v, upper = Value.largest} fun below (v: Value.t): t = T {lower = Value.smallest, upper = v} fun isPoint (T {lower, upper}) = Value.equals (lower, upper) fun point v = T {lower = v, upper = v} fun closest (T {lower, upper}, v: Value.t): Value.t = if Value.<= (v, lower) then lower else if Value.>= (v, upper) then upper else v fun contains (T {lower, upper}, v: Value.t): bool = Value.<= (lower, v) andalso Value.<= (v, upper) fun move (T {lower, upper}): t = T {lower = Value.move upper, upper = Value.move lower} fun intersect (i: t, i': t): t = let val lower = Value.max (lower i, lower i') val upper = Value.min (upper i, upper i') in if Value.> (lower, upper) then Error.bug "AlphaBeta.Interval.intersect: empty intersection" else T {lower = lower, upper = upper} end (* val intersect = Trace.trace2 ("intersect", layout, layout, layout) intersect *) end (* val trace = * Trace.trace2 ("alphaBetaCache", State.layout, Interval.layout, Value.layout) * * fun traceAlphaBeta f (s, i) = * let val v = trace f (s, i) * val v' = alphaBetaNoCache (s, Interval.lower i, Interval.upper i) * in if Value.equals (v, v') * then () * else Misc.bug (let open Layout * in align [str "v = ", Value.layout v, * str "v' = ", Value.layout v'] * end); * v * end * * val traceSearch = Trace.trace ("search", Interval.layout, Value.layout) *) fun alphaBetaCache (s: State.t, i: Interval.t, c: Interval.t Cache.t): Value.t = let val count = messenger () fun alphaBeta (s: State.t, i: Interval.t): Value.t = (count (fn () => let open Layout in align [Interval.layout i, State.layout s] end) ; (case State.evaluate s of State.Leaf v => Interval.closest (i, v) | State.NonLeaf {lower, upper} => if Value.<= (upper, Interval.lower i) then Interval.lower i else if Value.<= (Interval.upper i, lower) then Interval.upper i else let val {update, value} = Cache.peek (c, s) fun search iKnown = let val iSearch = Interval.intersect (i, iKnown) val Interval.T {lower, upper} = Interval.move iSearch (* inv: lower <= v <= upper *) fun loop (ss, v) = if Value.equals (lower, v) then v else case ss of [] => v | s :: ss => loop (ss, alphaBeta (s, Interval.T {lower = lower, upper = v})) val v = Value.unmove (loop (State.succ s, upper)) val Interval.T {lower, upper} = iSearch val iKnown = Interval.intersect (iKnown, if Value.equals (v, upper) then Interval.above upper else if Value.equals (v, lower) then Interval.below lower else Interval.point v) in (*Misc.assert (fn () => Interval.contains (iKnown, alphaBetaNoCache (s, Value.smallest, Value.largest))); *) update iKnown; v end in case value of SOME i' => let val Interval.T {lower, upper} = i val Interval.T {lower = lower', upper = upper'} = i' in if Value.<= (upper', lower) then lower else if Value.>= (lower', upper) then upper else search i' end | NONE => search Interval.all end)) in alphaBeta (s, i) end end mlton-20100608/lib/mlton/basic/alpha-beta.sig0000644000076600000240000000322511404435636017251 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ALPHA_BETA_STRUCTS = sig structure Value: sig include ORDER val largest: t val smallest: t val move: t -> t val unmove: t -> t end structure State: sig type t val succ: t -> t list datatype value = Leaf of Value.t | NonLeaf of {lower: Value.t, upper: Value.t} val evaluate: t -> value val layout: t -> Layout.t end structure Cache: sig type 'a t val peek: 'a t * State.t -> {value: 'a option, update: 'a -> unit} end end signature ALPHA_BETA = sig include ALPHA_BETA_STRUCTS (* return v s.t. a <= v <= b * andalso |v - v'| is minimal, where v' is maximum value. *) val alphaBeta: State.t * Value.t * Value.t -> Value.t structure Interval: sig type t val make: {lower: Value.t, upper: Value.t} -> t val all: t val point: Value.t -> t val isPoint: t -> bool val lower: t -> Value.t val upper: t -> Value.t val layout: t -> Layout.t end (* Return closest value in interval to maximum value. *) (* May modify the cache. *) val alphaBetaCache: State.t * Interval.t * Interval.t Cache.t -> Value.t end mlton-20100608/lib/mlton/basic/append-list.sig0000644000076600000240000000201311404435636017465 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature APPEND_LIST = sig type 'a t val append: 'a t * 'a t -> 'a t val appends: 'a t list -> 'a t val appendsV: 'a t vector -> 'a t val cons: 'a * 'a t -> 'a t val empty: 'a t val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foldr: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foreach: 'a t * ('a -> unit) -> unit val fromList: 'a list -> 'a t val fromVector: 'a vector -> 'a t val layout: ('a -> Layout.t) -> 'a t -> Layout.t val length: 'a t -> int val map: 'a t * ('a -> 'b) -> 'b t val push: 'a t ref * 'a -> unit val single: 'a -> 'a t val snoc: 'a t * 'a -> 'a t val toList: 'a t -> 'a list val toListOnto: 'a t * 'a list -> 'a list val toVector: 'a t -> 'a vector end mlton-20100608/lib/mlton/basic/append-list.sml0000644000076600000240000000645111404435636017510 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure AppendList: APPEND_LIST = struct (* We are careful to ensure that the empty list is always represented by * the Empty constructor. *) datatype 'a t = Append of 'a t * 'a t (* Neither is empty. *) | Appends of 'a t list (* None is empty and list is nonempty. *) | AppendsV of 'a t vector (* None is empty and vector is nonempty. *) | Cons of 'a * 'a t (* Nonempty. *) | Empty | List of 'a list (* Nonempty. *) | Single of 'a | Snoc of 'a t (* Nonempty *) * 'a | Vector of 'a vector (* Nonempty. *) val isEmpty = fn Empty => true | _ => false fun append (t1, t2) = if isEmpty t1 then t2 else if isEmpty t2 then t1 else Append (t1, t2) fun appends l = let val l = List.keepAll (l, not o isEmpty) in if List.isEmpty l then Empty else Appends l end fun appendsV v = let val v = Vector.keepAll (v, not o isEmpty) in if Vector.isEmpty v then Empty else AppendsV v end fun cons (a, l) = case l of Empty => Single a | _ => Cons (a, l) val empty = Empty fun fromList l = if List.isEmpty l then Empty else List l fun fromVector v = if Vector.isEmpty v then Empty else Vector v val single = Single fun snoc (l, a) = case l of Empty => Single a | _ => Snoc (l, a) fun fold (l, b, f) = let fun loop (l, b) = case l of Append (l, l') => loop (l', loop (l, b)) | Appends l => List.fold (l, b, loop) | AppendsV v => Vector.fold (v, b, loop) | Cons (x, l) => loop (l, f (x, b)) | Empty => b | List l => List.fold (l, b, f) | Single x => f (x, b) | Snoc (l, x) => f (x, loop (l, b)) | Vector v => Vector.fold (v, b, f) in loop (l, b) end fun length l : int = fold (l, 0, fn (_, i) => i + 1) fun foreach (l, f) = fold (l, (), fn (x, ()) => f x) fun foldr (l, b, f) = let fun loop (l, b) = case l of Append (l, l') => loop (l, loop (l', b)) | Appends l => List.foldr (l, b, loop) | AppendsV v => Vector.foldr (v, b, loop) | Cons (x, l) => f (x, loop (l, b)) | Empty => b | List l => List.foldr (l, b, f) | Single x => f (x, b) | Snoc (l, x) => loop (l, f (x, b)) | Vector v => Vector.foldr (v, b, f) in loop (l, b) end fun map (l, f) = let val rec loop = fn Append (l, l') => Append (loop l, loop l') | Appends l => Appends (List.map (l, loop)) | AppendsV v => AppendsV (Vector.map (v, loop)) | Cons (x, l) => Cons (f x, loop l) | Empty => Empty | List l => List (List.map (l, f)) | Single x => Single (f x) | Snoc (l, x) => Snoc (loop l, f x) | Vector v => Vector (Vector.map (v, f)) in loop l end fun toList ds = foldr (ds, [], op ::) fun toListOnto (ds, l) = foldr (ds, l, op ::) fun toVector ds = Vector.tabulator (length ds, fn call => foreach (ds, call)) fun layout layoutX l = List.layout layoutX (toList l) fun push (r, x) = r := cons (x, !r) end mlton-20100608/lib/mlton/basic/array.fun0000644000076600000240000000303211404435636016373 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Array (S: sig include ARRAY_STRUCTS val unsafeSub: 'a t * int -> 'a val unsafeUpdate: 'a t * int * 'a -> unit end): ARRAY = struct open S local structure V = Vector (S) in open V end val array = new fun modify (a, f) = foreachi (a, fn (i, x) => unsafeUpdate (a, i, f x)) fun swap (a, i, j) = let val t = sub (a, i) in unsafeUpdate (a, i, sub (a, j)) ; unsafeUpdate (a, j, t) end fun shuffleN (a, n) = let val m = length a in Int.for (0, n, fn i => swap (a, i, i + Random.natLessThan (m - i))) end fun shuffle a = shuffleN (a, length a) fun getAndSet a = (fn i => sub (a, i), fn (i, x) => update (a, i, x)) fun fromListRev l = case l of [] => new0 () | x :: l => let val n = List.length l val a = new (n + 1, x) fun loop (l, i) = case l of [] => () | x :: l => (unsafeUpdate (a, i, x) ; loop (l, i - 1)) val _ = loop (l, n - 1) in a end fun toVectorMap (a, f) = Vector.tabulate (length a, fn i => f (sub (a, i))) fun toVector a = toVectorMap (a, fn x => x) fun fromVector v = tabulate (Vector.length v, fn i => Vector.sub (v, i)) end mlton-20100608/lib/mlton/basic/array.sig0000644000076600000240000000161611404435636016373 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ARRAY_STRUCTS = sig include VECTOR_STRUCTS val update: 'a t * int * 'a -> unit end signature ARRAY = sig include VECTOR val array: int * 'a -> 'a t (* synonym for new *) val fromVector: 'a vector -> 'a t val getAndSet: 'a t -> (int -> 'a) * (int * 'a -> unit) val modify: 'a t * ('a -> 'a) -> unit val shuffle: 'a t -> unit (* Put random elements in the first n positions. *) val shuffleN: 'a t * int -> unit val swap: 'a t * int * int -> unit val toVector: 'a t -> 'a vector val toVectorMap: 'a t * ('a -> 'b) -> 'b vector val update: 'a t * int * 'a -> unit end mlton-20100608/lib/mlton/basic/array.sml0000644000076600000240000000117011404435636016377 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Array = Array (open Pervasive.Array type 'a t = 'a array exception New = Size val unsafeSub = Unsafe.Array.sub val unsafeUpdate = Unsafe.Array.update val unfoldi = MLton.Array.unfoldi) functor MonoArray (Elt: T) = struct open Array type t = Elt.t t val equals = fn (a, a') => equals (a, a', Elt.equals) val layout = layout Elt.layout end mlton-20100608/lib/mlton/basic/array2.sig0000644000076600000240000000154111404435636016452 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ARRAY2 = sig type 'a t val copy: 'a t -> 'a t val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool val forall: 'a t * ('a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val foreachi: 'a t * (int * int * 'a -> unit) -> unit val fromList: 'a list list -> 'a t val layout: ('a -> Layout.t) -> 'a t -> Layout.t val nCols: 'a t -> int val nRows: 'a t -> int val new: int * int * 'a -> 'a t val sub: 'a t * int * int -> 'a val tabulate: int * int * (int * int -> 'a) -> 'a t val update: 'a t * int * int * 'a -> unit end mlton-20100608/lib/mlton/basic/array2.sml0000644000076600000240000000313711404435636016466 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Array2: ARRAY2 = struct open Array2 type 'a t = 'a array fun toList a = let fun loop (r, ac) = if r < 0 then ac else loop (r - 1, let fun loop (c, ac) = if c < 0 then ac else loop (c - 1, sub (a, r, c) :: ac) in loop (nCols a - 1, []) end :: ac) in loop (nRows a - 1, []) end fun layout f a = List.layout (List.layout f) (toList a) fun wholeRegion a : 'a region = {base = a, row = 0, col = 0, nrows = NONE, ncols = NONE} fun foralli (a, f) = let exception False in (appi RowMajor (fn (r, c, x) => if f (r, c, x) then () else raise False) (wholeRegion a) ; true) handle False => false end fun equals (a, a', f) = nRows a = nRows a' andalso nCols a = nCols a' andalso foralli (a, fn (r, c, x) => f (x, sub (a', r, c))) fun forall (a, f) = foralli (a, f o #3) fun tabulate (r, c, f) = Pervasive.Array2.tabulate RowMajor (r, c, f) fun foreachi (a, f) = foldi RowMajor (fn (r, c, a, ()) => f (r, c, a)) () (wholeRegion a) fun foreach (a, f) = foreachi (a, f o #3) fun copy a = tabulate (nRows a, nCols a, fn (r, c) => sub (a, r, c)) fun new (r, c, x) = tabulate (r, c, fn _ => x) end mlton-20100608/lib/mlton/basic/assert.sig0000644000076600000240000000113211404435636016547 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ASSERT = sig val assert: string * (unit -> bool) -> unit val assertFun: string * ('a -> 'b) * ('a -> bool * ('b -> bool)) -> 'a -> 'b val assertFun2: string * ('a -> 'b -> 'c) * ('a -> bool * ('b -> (bool * ('c -> bool)))) -> 'a -> 'b -> 'c val debug: bool val fail: string -> 'a end mlton-20100608/lib/mlton/basic/assert.sml0000644000076600000240000000360211404435636016564 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Assert: ASSERT = struct val debug = MLton.debug orelse (not MLton.isMLton) fun fail msg = Error.bug (concat ["assertion failure: ", msg]) fun assert (msg: string, f: unit -> bool): unit = if debug andalso not (f () handle _ => false) then fail msg else () fun assert' (msg, b) = assert (msg, fn () => b) val ('a, 'b) assertFun': string * ('a -> 'b) * ('a -> bool * ('b -> bool * 'b)) -> 'a -> 'b = (* Can't do what I really want because of the value restriction. * Would like to write: * if debug then (fn ... => ...) else (fn ... => ...). *) fn (msg, f, check) => if debug then (fn a => let val (yes, check) = check a val _ = assert' (concat [msg, " argument"], yes) val (yes, b) = check (f a) in assert' (concat [msg, " result"], yes) ; b end) else f fun assertFun (msg, f: 'a -> 'b, check: 'a -> bool * ('b -> bool)): 'a -> 'b = assertFun' (msg, f, fn a => let val (yes, check) = check a in (yes, fn b => (check b, b)) end) fun assertFun2 (msg, f: 'a -> 'b -> 'c, check: 'a -> bool * ('b -> (bool * ('c -> bool)))) = assertFun' (msg, f, fn a => let val (yes, check) = check a in (yes, fn bc => (true, assertFun (msg, bc, check))) end) end mlton-20100608/lib/mlton/basic/base64.sig0000644000076600000240000000132111404435636016332 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Base64 encoding, as in RFC 1421 *) signature BASE64 = sig val decode: string -> string val encode: string -> string end functor TestBase64 (S: BASE64): sig end = struct open S val _ = Assert.assert ("TestBase64", fn () => List.forall(["a", "aa", "aaa", "aaaa", "aaaaa", "aaaaaa", "aaaaaaa", "a", "ab", "abc", "abcd", "abcde", "abcdef", "abcdefg", "bb:new.site"], fn s => decode(encode s) = s)) end mlton-20100608/lib/mlton/basic/base64.sml0000644000076600000240000001320211404435636016344 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Base64: BASE64 = struct val chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" fun word8ToChar(w: Word8.t): char = String.sub(chars, Word8.toInt w) val word8ToChar = Trace.traceAssert ("Base64.word8ToChar", Word8.layout, Char.layout, fn w => (0w0 <= w andalso w < 0w64, fn _ => true)) word8ToChar val charToWord8: char -> Word8.t option = Char.memoize(fn c => Option.map(String.peeki(chars, fn (_, c') => c = c'), fn (i, _) => Word8.fromInt i)) val charToWord8 = Trace.trace("Base64.charToWord8", Char.layout, Option.layout Word8.layout) charToWord8 val pad = #"=" fun 'a encodeGen{array: 'a, length: 'a -> int, sub: 'a * int -> Word8.t} = let val n = length array val sub = fn i => sub(array, i) val (d, m) = Int.divMod(n, 3) val (d, n') = if m = 0 then (d, n) else if m = 1 then (d + 1, n + 2) else (d + 1, n + 1) val sub = fn i => if i >= n then 0w0 else sub i val _ = Assert.assert("Base64.encodeGen", fn () => n' mod 3 = 0) val numChars: int = 4 * d val chars = CharArray.array(numChars, #"\000") fun updateChar(j, c) = CharArray.update(chars, j, c) fun update(j: int, w: Word8.t) = updateChar(j, word8ToChar w) fun loop(i: int, j: int) = if i = n' then j else let val w1 = sub i val w2 = sub(i + 1) val w3 = sub(i + 2) open Word8 val op + = Int.+ in update(j, >>(w1, 0w2)) ; update(j + 1, orb(<<(andb(w1, 0w3), 0w4), >>(w2, 0w4))) ; update(j + 2, orb(<<(andb(w2, 0wxF), 0w2), >>(w3, 0w6))) ; update(j + 3, andb(w3, 0wx3F)) ; loop(i + 3, j + 4) end val j = loop(0, 0) (* insert padding *) val _ = if m = 0 then () else (updateChar(j - 1, pad) ; if m = 1 then updateChar(j - 2, pad) else ()) (* need to patch for leftover bits *) in String.fromCharArray chars end fun encode s = encodeGen{array = s, length = String.size, sub = Char.toWord8 o String.sub} val encode = Trace.trace("Base64.encode", String.layout, String.layout) encode fun 'a decodeGen{string: string, new: int * Word8.t -> 'a, update: 'a * int * Word8.t -> unit}: 'a = let val n = String.size string val (d, m) = Int.divMod(n, 4) val _ = Assert.assert("Base64.decodeGen", fn () => m = 0) fun sub i = String.sub(string, i) val numPads = if pad = sub(n - 1) then if pad = sub(n - 2) then 2 else 1 else 0 val outputLength = d * 3 - numPads val a = new(outputLength, 0w0) fun loop(i: int, j: int): unit = if i = n then () else let val sub = fn i => let val c = sub i in if pad = c then 0w0 else case charToWord8 c of NONE => Error.bug (concat ["Base64.decodeGen: strange char ", Char.escapeSML c]) | SOME w => w end val w0 = sub i val w1 = sub(i + 1) val w2 = sub(i + 2) val w3 = sub(i + 3) val update = fn (k, w) => if j + k >= outputLength then () else update(a, j + k, w) val _ = let open Word8 in update(0, orb(<<(w0, 0w2), >>(w1, 0w4))) ; update(1, orb(<<(andb(w1, 0wxF), 0w4), >>(w2, 0w2))) ; update(2, orb(<<(andb(w2, 0w3), 0w6), w3)) end in loop(i + 4, j + 3) end val _ = loop(0, 0) in a end fun decode s = String.fromCharArray (decodeGen {string = s, new = fn (n, w) => CharArray.array(n, Char.fromWord8 w), update = fn (a, i, w) => CharArray.update(a, i, Char.fromWord8 w)}) val decode = Trace.trace("Base64.decode", String.layout, String.layout) decode end mlton-20100608/lib/mlton/basic/binary-search.sig0000644000076600000240000000231611404435636020002 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BINARY_SEARCH = sig (* largest(a, f) * Pre: if 0 <= i < j < Array.size a * andalso f (Array.sub (a, j)) * then f (Array.sub (a, i)) * Returns the largest i such that f (Array.sub (a, i)) *) val largest: 'a array * ('a -> bool) -> int option val search: 'a array * ('a -> order) -> int option (* smallest(a, f) * Pre: if 0 <= i < j < Array.size a * and f(Array.sub(a, i)) * then f(Array.sub(a, j) * Returns the smallest i such that f(Array.sub(a, i)) *) val smallest: 'a array * ('a -> bool) -> int option end functor TestBinarySearch (S: BINARY_SEARCH): sig end = struct open S val _ = Assert.assert ("TestBinarySearch", fn () => let val n = 17 val a = Array.fromList (Pervasive.List.tabulate (n, fn i => i)) in Int.forall (0, n, fn i => SOME i = search (a, fn x => Int.compare (i, x))) end) end mlton-20100608/lib/mlton/basic/binary-search.sml0000644000076600000240000000312311404435636020010 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure BinarySearch: BINARY_SEARCH = struct (* Based on page 38 of Programming Pearls, by Jon Bentley. *) fun 'a search (a: 'a array, f: 'a -> order): int option = let fun loop (min: int, max: int): int option = if min > max then NONE else let val mid = Int.quot (min + max, 2) in case f (Array.sub (a, mid)) of LESS => loop (min, mid - 1) | EQUAL => SOME mid | GREATER => loop (mid + 1, max) end in loop (0, Array.length a - 1) end fun 'a largest (a: 'a array, f: 'a -> bool): int option = let fun loop(min, max, res: int option): int option = if min > max then res else let val mid = Int.quot(min + max, 2) in if f(Array.sub(a, mid)) then loop(mid + 1, max, SOME mid) else loop(min, mid - 1, res) end in loop(0, Array.length a - 1, NONE) end fun 'a smallest(a: 'a array, f: 'a -> bool): int option = let fun loop(min, max, res: int option): int option = if min > max then res else let val mid = Int.quot(min + max, 2) in if f(Array.sub(a, mid)) then loop(min, mid - 1, SOME mid) else loop(mid + 1, max, res) end in loop(0, Array.length a - 1, NONE) end end mlton-20100608/lib/mlton/basic/bool.sig0000644000076600000240000000071711404435636016211 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BOOL = sig type t val compare: t * t -> Relation.t val equals: t * t -> bool val fromString: string -> t option val layout: t -> Layout.t val not: t -> t val toString: t -> string end where type t = bool mlton-20100608/lib/mlton/basic/bool.sml0000644000076600000240000000151411404435636016216 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Bool *) (*-------------------------------------------------------------------*) structure Bool: BOOL = struct open Pervasive.Bool type t = bool val compare = let open Relation in fn (false, false) => EQUAL | (false, true) => LESS | (true, false) => GREATER | (true, true) => EQUAL end val equals = fn (true, true) => true | (false, false) => true | _ => false val layout = Layout.str o toString (*fun output(b, out) = Pervasive.IO.output(out, toString b)*) end mlton-20100608/lib/mlton/basic/bounded-order.fun0000644000076600000240000000214511404435636020012 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*------------------------------------------------------------------*) (* BoundedOrder *) (*------------------------------------------------------------------*) functor BoundedOrder(O: ORDER): BOUNDED_ORDER = struct structure O = O structure R = Relation datatype t = Min | Max | Inject of O.t val smallest = Min val largest = Max val inject = Inject val project = fn Inject x => x | _ => Error.bug "BoundedOrder.project" val compare = fn (Min, Min) => R.EQUAL | (Min, _) => R.LESS | (Max, Max) => R.EQUAL | (Max, _) => R.GREATER | (Inject _, Min) => R.GREATER | (Inject _, Max) => R.LESS | (Inject x, Inject y) => O.compare(x, y) val {equals, <, <=, >, >=, min, max} = R.compare compare local open Layout in fun layout x = case x of Min => str "Min" | Max => str "Max" | Inject x => O.layout x end end mlton-20100608/lib/mlton/basic/bounded-order.sig0000644000076600000240000000057711404435636020013 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BOUNDED_ORDER = sig structure O: ORDER include ORDER val inject: O.t -> t val project: t -> O.t val largest: t val smallest: t end mlton-20100608/lib/mlton/basic/buffer.sig0000644000076600000240000000115011404435636016517 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BUFFER_STRUCTS = sig end signature BUFFER = sig include BUFFER_STRUCTS type 'a t val add: 'a t * 'a -> unit val last: 'a t -> 'a option val layout: ('a -> Layout.t) -> 'a t -> Layout.t val length: 'a t -> int val new: {dummy: 'a} -> 'a t val reset: 'a t -> unit val toVector: 'a t -> 'a vector end mlton-20100608/lib/mlton/basic/buffer.sml0000644000076600000240000000303611404435636016535 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Buffer: BUFFER = struct datatype 'a t = T of {dummy: 'a, elts: 'a array ref, length: int ref} fun new {dummy} = T {dummy = dummy, elts = ref (Array.array (1, dummy)), length = ref 0} fun length (T {length, ...}) = !length fun reset (T {length, ...}) = length := 0 fun last (T {elts, length = ref n, ...}) = if 0 = n then NONE else SOME (Array.sub (!elts, n - 1)) val growFactor: int = 2 fun ensureFree (T {dummy, elts, length, ...}, amount: int): unit = let val maxLength = Array.length (!elts) in if amount <= maxLength - !length then () else let val n = Int.max (maxLength * growFactor, !length + amount) val e = !elts in elts := Array.tabulate (n, fn i => if i < maxLength then Array.sub (e, i) else dummy) end end fun add (v as T {elts, length, ...}, e) = (ensureFree (v, 1) ; Array.update (!elts, !length, e) ; Int.inc length) fun toVector (T {elts, length, ...}): 'a vector = let val elts = !elts in Vector.tabulate (!length, fn i => Array.sub (elts, i)) end fun layout layoutElt b = Vector.layout layoutElt (toVector b) end mlton-20100608/lib/mlton/basic/char-buffer.sig0000644000076600000240000000105011404435636017431 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHAR_BUFFER_STRUCTS = sig end signature CHAR_BUFFER = sig include CHAR_BUFFER_STRUCTS type t val new: unit -> t val length: t -> int val reset: t -> unit val toString: t -> string val addChar: t * char -> unit val layout: t -> Layout.t end mlton-20100608/lib/mlton/basic/char-buffer.sml0000644000076600000240000000306311404435636017450 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure CharBuffer: CHAR_BUFFER = struct datatype t = T of {length: int ref, chars: char array ref} val initChar = #"\013" fun new () = T {length = ref 0, chars = ref (Array.array (1, initChar))} fun length (T {length, ...}) = !length fun reset (T {length, ...}) = length := 0 val growFactor: int = 2 structure Int = struct open Int val max = Trace.trace2 ("CharBuffer.Int.max", layout, layout, layout) max end fun ensureFree (T {length, chars, ...}, amount: int): unit = let val maxLength = Array.length (!chars) in if amount <= maxLength - !length then () else let val n = Int.max (maxLength * growFactor, !length + amount) val a = !chars in chars := Array.tabulate (n, fn i => if i < maxLength then Array.sub (a, i) else initChar) end end fun addChar (v as T {length, chars, ...}, c) = (ensureFree (v, 1) ; Array.update (!chars, !length, c) ; Int.inc length) fun toString (T {length, chars, ...}): string = let val a = !chars in CharVector.tabulate (!length, fn i => Array.sub (a, i)) end val layout = Layout.str o toString val addChar = Trace.trace2 ("CharBuffer.addChar", layout, Char.layout, Unit.layout) addChar end mlton-20100608/lib/mlton/basic/char-pred.sig0000644000076600000240000000040711404435636017117 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHAR_FUN = sig type t = char -> 'a end mlton-20100608/lib/mlton/basic/char-pred.sml0000644000076600000240000000165511404435636017136 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) fun contains s = let val a = Array.array(numChars, false) val n = String.size s fun loop i = if i >= n then () else (Array.update(a, ord(String.sub(s, i)), true) ; loop(i + 1)) in loop 0 ; fn c => Array.sub(a, ord c) end fun notContains s = not o (contains s) fun memoize (f: char -> 'a): char -> 'a = let val a = Array.tabulate(numChars, f o chr) in fn c => Array.sub(a, ord c) end local val not = fn f => memoize(not o f) infix or andd fun f or g = memoize(fn c => f c orelse g c) fun f andd g = memoize(fn c => f c andalso g c) mlton-20100608/lib/mlton/basic/char.sig0000644000076600000240000000356111404435636016173 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHAR = sig type t = char val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val chr: int -> t val compare: t * t -> Relation.t val dash: t val digitToInt: t -> int option val dquote: t (* " *) val equals: t * t -> bool val escapeC: t -> string val escapeSML: t -> string val fromCString: string -> t option val fromDigit: int -> t val fromHexDigit: int -> t val fromInt: int -> t val fromString: string -> t option val fromWord8: Word8.t -> t val isAlpha: t -> bool val isAlphaNum: t -> bool val isAscii: t -> bool val isCntrl: t -> bool val isDigit: t -> bool val isGraph: t -> bool val isHexDigit: t -> bool val isLower: t -> bool val isPrint: t -> bool val isSpace: t -> bool val isUpper: t -> bool val layout: t -> Layout.t val max: t * t -> t val maxChar: t val maxOrd: int val memoize: (char -> 'a) -> (char -> 'a) val min: t * t -> t val minChar: t val newline: t val numChars: int val ord: t -> int val output: t * TextIO.outstream -> unit val pred: t -> t val space: t val succ: t -> t val toHexDigit: t -> int val toInt: t -> int val toLower: t -> t val toString: t -> string val toUpper: t -> t val toWord8: t -> Word8.t end functor TestChar (S: CHAR): sig end = struct open S val _ = Assert.assert ("TestChar", fn () => "\\000" = escapeC #"\000") end mlton-20100608/lib/mlton/basic/char.sml0000644000076600000240000000073711404435636016206 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Char: CHAR = struct open Char0 val layout = Layout.str o escapeSML val fromInt = Trace.trace("Char.fromInt", Layout.str o Int.toString, layout) fromInt val isDigit = Trace.trace("Char.isDigit", layout, Bool.layout) isDigit end mlton-20100608/lib/mlton/basic/char0.sig0000644000076600000240000000353011404435636016247 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHAR0 = sig type t = char val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val chr: Pervasive.Int.int -> t val compare: t * t -> order val dash: t val digitToInt: t -> Pervasive.Int.int option val dquote: t (* " *) val equals: t * t -> bool val escapeC: t -> string val escapeSML: t -> string val fromCString: string -> t option val fromHexDigit: int -> t val fromDigit: Pervasive.Int.int -> t val fromInt: Pervasive.Int.int -> t val fromString: string -> t option val fromWord8: Pervasive.Word8.word -> t val isAlpha: t -> bool val isAlphaNum: t -> bool val isAscii: t -> bool val isCntrl: t -> bool val isDigit: t -> bool val isGraph: t -> bool val isHexDigit: t -> bool val isLower: t -> bool val isPrint: t -> bool val isSpace: t -> bool val isUpper: t -> bool val max: t * t -> t val maxChar: t val maxOrd: int val memoize: (char -> 'a) -> (char -> 'a) val min: t * t -> t val minChar: t val newline: t val numChars: int val ord: t -> Pervasive.Int.int val output: t * TextIO.outstream -> unit val pred: t -> t val space: t val succ: t -> t val toHexDigit: t -> int val toInt: t -> Pervasive.Int.int val toCString: t -> string val toLower: t -> t (* val toPrintable: t -> string *) val toString: t -> string val toUpper: t -> t val toWord8: t -> Pervasive.Word8.word end mlton-20100608/lib/mlton/basic/char0.sml0000644000076600000240000000310511404435636016256 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Char0 : CHAR0 = struct structure Array = Pervasive.Array structure Int = Pervasive.Int structure String = Pervasive.String open Pervasive.Char type t = char val dash = #"-" val dquote = #"\"" val newline = #"\n" val space = #" " val toInt = ord val fromInt = chr val escapeSML = toString val escapeC = toCString val toString = String.str val equals: t * t -> bool = op = val toWord8 = Byte.charToByte val fromWord8 = Byte.byteToChar val {max, min, compare, ...} = Relation0.lessEqual {< = op <, equals = equals} fun digitToInt (c: t): int option = if isDigit c then SOME (ord c - ord #"0") else NONE fun fromDigit (d: int): t = if let open Int in 0 <= d andalso d < 10 end then chr (d + ord #"0") else Error.bug "Char0.fromDigit" fun output (c, out) = TextIO.output (out, toString c) val numChars = ord maxChar + 1 fun memoize (f: t -> 'a): t -> 'a = let val a = Array.tabulate (numChars, f o chr) in fn c => Array.sub (a, ord c) end fun toHexDigit (c: t): int = if #"0" <= c andalso c <= #"9" then ord c - ord #"0" else if #"a" <= c andalso c <= #"f" then ord c - ord #"a" + 10 else if #"A" <= c andalso c <= #"F" then ord c - ord #"A" + 10 else Error.bug "Char0.charToHexDigit" fun fromHexDigit (n: int): char = String.sub ("0123456789ABCDEF", n) end mlton-20100608/lib/mlton/basic/choice-pattern.sig0000644000076600000240000000067511404435636020166 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHOICE_PATTERN = sig (* expand "ab{c{d,e},f{gh}}{i,j}" = * ["abcdi", "abcdj", "abcei", "abcej", "abfghi", "abfghj"] *) val expand: string -> string list Result.t end mlton-20100608/lib/mlton/basic/choice-pattern.sml0000644000076600000240000001015311404435636020167 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure ChoicePattern: CHOICE_PATTERN = struct datatype t = Concat of t vector | Choice of t vector | String of string fun layout t = let open Layout in case t of Concat v => seq [str "Concat ", Vector.layout layout v] | Choice v => seq [str "Choice ", Vector.layout layout v] | String s => seq [str "\"", String.layout s, str "\""] end fun fromString (s: string): t Result.t = let val n = String.size s exception Error of string fun error ss = raise Error (concat ss) datatype state = Nest of {start: int} | Normal fun loop (cur: int, ac: char list, prev: t list, prevChoices: t list, state: state): int * t = let fun accum () = String (String.fromListRev ac) :: prev fun finishChoice () = Concat (Vector.fromListRev (accum ())) :: prevChoices fun keepChar cur = loop (cur + 1, String.sub (s, cur) :: ac, prev, prevChoices, state) in if cur < n then let val c = String.sub (s, cur) in case c of #"{" => let val (cur, t) = loop (cur + 1, [], [], [], Nest {start = cur}) in loop (cur, [], t :: accum (), prevChoices, state) end | #"}" => (case state of Nest _ => (cur + 1, Choice (Vector.fromList (finishChoice ()))) | Normal => error ["unmatched } at position ", Int.toString cur]) | #"," => (case state of Nest _ => loop (cur + 1, [], [], finishChoice (), state) | Normal => keepChar cur) | #"\\" => let val cur = cur + 1 in if cur = n then error ["terminating backslash"] else keepChar cur end | _ => keepChar cur end else (case state of Nest {start} => error ["unmatched { at position ", Int.toString start] | Normal => (cur, Concat (Vector.fromListRev (accum ())))) end in Result.Yes (#2 (loop (0, [], [], [], Normal))) handle Error s => Result.No s end val fromString = Trace.trace ("ChoicePattern.fromString", String.layout, Result.layout layout) fromString fun foldDown (v, a, f) = let fun loop (i, a) = if i < 0 then a else loop (i - 1, f (Vector.sub (v, i), a)) in loop (Vector.length v - 1, a) end fun expandTree (t: t): string list = case t of Choice v => Vector.fold (v, [], fn (t, ac) => expandTree t @ ac) | Concat v => foldDown (v, [""], fn (t, ac) => List.fold (expandTree t, [], fn (s, all) => List.fold (ac, all, fn (s', all) => concat [s, s'] :: all))) | String s => [s] fun expand (s: string): string list Result.t = Result.map (fromString s, expandTree) end mlton-20100608/lib/mlton/basic/circular-list.fun0000644000076600000240000000342711404435636020042 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CircularList(S: CIRCULAR_LIST_STRUCTS): CIRCULAR_LIST = struct open S type 'a t = 'a Elt.t Pointer.t val empty = Pointer.null fun makeEmpty p = Pointer.clear p fun isEmpty p = Pointer.isNull p fun isSingle p = case Pointer.follow p of NONE => false | SOME d => Elt.eqPrev(d, Elt.prev d) val first = Pointer.! fun insert(p,d) = case Pointer.follow p of SOME d' => Elt.insertR(d', d) | NONE => (Elt.link(d, d); Pointer.:=(p, d)) fun rotate p = case Pointer.follow p of SOME d => Pointer.:=(p, Elt.next d) | NONE => () fun deleteSafe(p, d) = (if Elt.eqPrev(Pointer.! p, d) then if isSingle p then makeEmpty p else Pointer.:=(p, Elt.next d) else () ; Elt.unlink d) fun delete(l, d) = if Elt.isLinked d then deleteSafe(l, d) else Error.bug "CircularList.delete" fun foreach(p, f) = if Pointer.isNull p then () else let val start = Pointer.! p fun foreach d = let val next = Elt.next d in (f d ; if Elt.eqPrev(start, next) then () else foreach next) end in foreach start end fun deleteEach(p, f) = foreach(p, fn d => (Elt.unlink d; f d)) fun splice(p, p') = if Pointer.isNull p then Pointer.copy(p, p') else if Pointer.isNull p' then () else let val e1 = Pointer.! p val e1' = Pointer.! p' val e2 = Elt.next e1 val e2' = Elt.next e1' in Elt.link(e1, e2') ; Elt.link(e1', e2) end end mlton-20100608/lib/mlton/basic/circular-list.sig0000644000076600000240000000132511404435636020027 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CIRCULAR_LIST_STRUCTS = sig structure Elt: DOUBLY_LINKED end signature CIRCULAR_LIST = sig include CIRCULAR_LIST_STRUCTS type 'a t = 'a Elt.t Pointer.t val delete: 'a t * 'a Elt.t -> unit val deleteEach: 'a t * ('a Elt.t -> unit) -> unit val empty: unit -> 'a t val first: 'a t -> 'a Elt.t val foreach: 'a t * ('a Elt.t -> unit) -> unit val insert: 'a t * 'a Elt.t -> unit val rotate: 'a t -> unit val splice: 'a t * 'a t -> unit end mlton-20100608/lib/mlton/basic/clearable-promise.sig0000644000076600000240000000057411404435636020645 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CLEARABLE_PROMISE = sig type 'a t exception Force val clear: 'a t -> unit val delay: (unit -> 'a) -> 'a t val force: 'a t -> 'a end mlton-20100608/lib/mlton/basic/clearable-promise.sml0000644000076600000240000000072211404435636020651 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure ClearablePromise: CLEARABLE_PROMISE = struct datatype 'a t = T of (unit -> 'a) * 'a Promise.t fun clear (T (f, p)) = Promise.reset (p, f) fun delay f = T (f, Promise.delay f) exception Force = Promise.Force fun force (T (_, p)) = Promise.force p end mlton-20100608/lib/mlton/basic/computation.sig0000644000076600000240000000076511404435636017623 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature COMPUTATION = sig structure Time: TIME type t val keepAll: t * (string -> bool) -> t val inspect: t -> unit val output: t * Out.t -> unit val outputCalls: t * Out.t -> unit val outputTimes: t * Out.t -> unit val time: t -> Time.t end mlton-20100608/lib/mlton/basic/console.sig0000644000076600000240000000235511404435636016720 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONSOLE = sig structure Background: sig datatype t = Black | Red | Green | Brown | Blue | Magenta | Cyan | Gray end structure Foreground: sig datatype t = DarkGray | BrightRed | BrightGreen | Yellow | BrightBlue | BrightMagenta | BrightCyan | White end structure CharRendition: sig datatype t = Default (* Normal, UnderlineOff, ReverseVideoOf,f BlinkOff *) | Bold | Dim | Normal | UnderlineOn | UnderlineOff | UnderlineOnDefaultForeground | UnderlineOffDefaultForeground | BlinkOn | BlinkOff | ReverseVideoOn | ReverseVideoOff | Foreground of Foreground.t | Background of Background.t val set: t list -> string end val moveToColumn: int -> string end mlton-20100608/lib/mlton/basic/console.sml0000644000076600000240000000747411404435636016740 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Console: CONSOLE = struct (* Information from Chapter 20 of Linux Application Development, * by Johnson and Troan. *) structure Background = struct datatype t = Black | Red | Green | Brown | Blue | Magenta | Cyan | Gray end structure Foreground = struct datatype t = DarkGray | BrightRed | BrightGreen | Yellow | BrightBlue | BrightMagenta | BrightCyan | White end val esc = "\027[" structure CharRendition = struct datatype t = Default | Bold | Dim | Normal | UnderlineOn | UnderlineOff | UnderlineOnDefaultForeground | UnderlineOffDefaultForeground | BlinkOn | BlinkOff | ReverseVideoOn | ReverseVideoOff | Foreground of Foreground.t | Background of Background.t fun set(l: t list): string = concat(esc :: List.fold(rev l, [], fn (c, l) => let val n = case c of Default => "0" | Bold => "1" | Dim => "2" | Normal => "21" | UnderlineOn => "4" | UnderlineOff => "24" | UnderlineOnDefaultForeground => "38" | UnderlineOffDefaultForeground => "39" | BlinkOn => "5" | BlinkOff => "25" | ReverseVideoOn => "7" | ReverseVideoOff => "27" | Foreground f => let datatype z = datatype Foreground.t in case f of DarkGray => "30" | BrightRed => "31" | BrightGreen => "32" | Yellow => "33" | BrightBlue => "34" | BrightMagenta => "35" | BrightCyan => "36" | White => "37" end | Background b => let datatype z = datatype Background.t in case b of Black => "40" | Red => "41" | Green => "42" | Brown => "43" | Blue => "44" | Magenta => "45" | Cyan => "46" | Gray => "47" end in case l of [] => [n, "m"] | _ => n :: ";" :: l end)) end fun moveToColumn c = let val columns = case Process.getEnv "COLUMNS" of NONE => 80 | SOME c => valOf(Int.fromString c) (* 300 is kind of arbitrary, but it's what they do in * /etc/sysconfig/init. *) in concat[esc, "300C", esc, Int.toString(columns - c), "D"] end end mlton-20100608/lib/mlton/basic/control.fun0000644000076600000240000000142411404435636016740 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Control(): CONTROL = struct val defaults: (unit -> unit) list ref = ref [] val settings: {name: string, value: (unit -> string)} list ref = ref [] fun setDefaults() = List.foreach(!defaults, fn f => f()) fun control{name, default, toString} = let val r = ref default in List.push(settings, {name = name, value = fn () => toString(!r)}) ; List.push(defaults, fn () => r := default) ; r end fun all() = List.fold(!settings, [], fn ({name, value}, ac) => {name = name, value = value()} :: ac) end mlton-20100608/lib/mlton/basic/control.sig0000644000076600000240000000073111404435636016732 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONTROL = sig val all: unit -> {name: string, value: string} list val control: {name: string, default: 'a, toString: 'a -> string} -> 'a ref val setDefaults: unit -> unit end mlton-20100608/lib/mlton/basic/counter.sig0000644000076600000240000000070311404435636016730 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature COUNTER = sig type t val new: int -> t val next: t -> int val tick: t -> unit val reset: t * int -> unit val value: t -> int val equals: t * t -> bool end mlton-20100608/lib/mlton/basic/counter.sml0000644000076600000240000000073611404435636016747 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Counter: COUNTER = struct datatype t = T of int ref fun new n = T(ref n) fun reset(T r, n) = r := n fun tick(T r) = Int.inc r fun value(T r) = !r fun next c = value c before tick c val equals = fn (T r, T r') => r = r' end mlton-20100608/lib/mlton/basic/date.sig0000644000076600000240000000307011404435636016166 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DATE_STRUCTS = sig end signature DATE = sig type t structure Weekday: sig datatype t = Mon | Tue | Wed | Thu | Fri | Sat | Sun end structure Month: sig datatype t = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec val toInt: t -> int end exception Date val compare: t * t -> order val date: {year: int, month: Month.t, day: int, hour: int, minute: int, second: int, offset: Time.t option} -> t val day: t -> int val fmt: t * string -> string val fromString: string -> t option val fromTimeLocal: Time.t -> t val fromTimeUniv: Time.t -> t val hour: t -> int val isDst: t -> bool option val layout: t -> Layout.t val localOffset: unit -> Time.t val minute: t -> int val month: t -> Month.t val now: unit -> t val offset: t -> Time.t option val scan: 'a * (char, 'a) StringCvt.reader -> (t * 'a) option val second: t -> int val toString: t -> string val toTime: t -> Time.t val weekDay: t -> Weekday.t val year: t -> int val yearDay: t -> int end mlton-20100608/lib/mlton/basic/date.sml0000644000076600000240000000153011404435636016176 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Date: DATE = struct structure Date = Pervasive.Date open Date type t = date structure Weekday = struct datatype t = datatype weekday end structure Month = struct datatype t = datatype month val toInt: t -> int = fn Jan => 1 | Feb => 2 | Mar => 3 | Apr => 4 | May => 5 | Jun => 6 | Jul => 7 | Aug => 8 | Sep => 9 | Oct => 10 | Nov => 11 | Dec => 12 end val now = fromTimeLocal o Time.now val layout = Layout.str o toString fun fmt(d, s) = Date.fmt s d fun scan(s, r) = Date.scan r s end mlton-20100608/lib/mlton/basic/dir.sig0000644000076600000240000000141611404435636016031 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DIR = sig type t = string type file = string val cd: t -> unit val current: unit -> t val doesExist: t -> bool val inDir: t * (unit -> 'a) -> 'a val inTemp: (unit -> 'a) -> 'a val isDir: string -> bool val layout: t -> Layout.t val ls: t -> t list * file list val lsDirs: t -> t list val lsFiles: t -> file list val make: t -> unit val remove: t -> unit val removeR: t -> unit (* remove recursively, i.e. all contents *) val root: t val toString: t -> string end mlton-20100608/lib/mlton/basic/dir.sml0000644000076600000240000000404411404435636016042 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Dir:> DIR = struct structure FS = OS.FileSys type t = string type file = string fun toString d = d val layout = Layout.str val root = "/" local open FS in val current = getDir val remove = rmDir val cd = chDir val cd = Trace.trace ("Dir.cd", layout, Unit.layout) cd val make = mkDir end fun isDir d = FS.isDir d handle OS.SysErr _ => false val doesExist = File.doesExist fun inDir (d, th) = let val cur = current () val () = cd d in Exn.finally (th, fn () => cd cur) end fun fold (d: t, a: 'a, f: string * 'a -> 'a): 'a = let val stream = FS.openDir d fun loop a = case FS.readDir stream of NONE => a | SOME s => loop (f (s, a)) in Exn.finally (fn () => loop a, fn () => FS.closeDir stream) end fun ls d = fold (d, ([], []), fn (x, (dirs, files)) => let val file = OS.Path.joinDirFile { dir=d, file=x } in if FS.isLink file then (dirs, files) else if isDir file then (x :: dirs, files) else (dirs, x :: files) end) val lsDirs = #1 o ls val lsFiles = #2 o ls fun removeR d = let val old = current () val _ = cd d (* loop removes everything in the current directory *) fun loop () = fold (".", (), fn (s, ()) => if isDir s then (cd s ; loop () ; cd ".." ; remove s) else File.remove s) val _ = loop () val _ = cd old val _ = remove d in () end fun inTemp thunk = let val d = concat [MLton.TextIO.tempPrefix "dir", Random.alphaNumString 6] val _ = make d in Exn.finally (fn () => inDir (d, fn _ => thunk ()), fn () => removeR d) end end mlton-20100608/lib/mlton/basic/directed-graph.sig0000644000076600000240000002100711404435636020133 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DIRECTED_GRAPH = sig structure Node: sig type 'a edge type 'a t val equals: 'a t * 'a t -> bool val hasEdge: {from: 'a t, to: 'a t} -> bool val layout: 'a t -> Layout.t val plist: 'a t -> PropertyList.t val successors: 'a t -> 'a edge list end structure Edge: sig type 'a t val equals: 'a t * 'a t -> bool val layout: 'a t -> Layout.t val plist: 'a t -> PropertyList.t val to: 'a t -> 'a Node.t end sharing type Node.edge = Edge.t (* depth first search *) structure DfsParam: sig type ('a, 'b, 'c, 'd, 'e) t = 'b * ('a Node.t * 'b -> ('c * ('a Node.t * 'c -> ('d * ('a Edge.t * 'd -> 'd) * ('a Edge.t * 'd -> 'c * ('e -> 'd)) * ('d -> 'e))) * ('e -> 'b))) type ('a, 'b) u = ('a, 'b, 'b, 'b, 'b) t val discoverFinishTimes: unit -> (('a, int) u * {discover: 'a Node.t -> int, finish: 'a Node.t -> int, destroy: unit -> unit}) val finishNode: ('a Node.t -> unit) -> ('a, unit) u val startNode: ('a Node.t -> unit) -> ('a, unit) u end (* the main graph type *) type 'a t type 'a u val addEdge: 'a t * {from: 'a Node.t, to: 'a Node.t} -> 'a Edge.t val coerce: 'a t -> unit t * {edge: 'a Edge.t -> unit Edge.t, node: 'a Node.t -> unit Node.t} val dfs: 'a t * ('a, 'b, 'c, 'd, 'e) DfsParam.t -> 'b val dfsNodes: 'a t * 'a Node.t list * ('a, 'b, 'c, 'd, 'e) DfsParam.t -> 'b val dfsTree: 'a t * {root: 'a Node.t, nodeValue: 'a Node.t -> 'b} -> 'b Tree.t val display: {graph: 'a t, layoutNode: 'a Node.t -> Layout.t, display: Layout.t -> unit} -> unit (* dominators (graph, {root}) * Returns the immediate dominator relation for the subgraph of graph * rooted at root. * idom n = Root if n = root * idom n = Idom n' where n' is the immediate dominator of n * idom n = Unreachable if n is not reachable from root *) datatype 'a idomRes = Idom of 'a Node.t | Root | Unreachable val dominators: 'a t * {root: 'a Node.t} -> {idom: 'a Node.t -> 'a idomRes} val dominatorTree: 'a t * {root: 'a Node.t, nodeValue: 'a Node.t -> 'b} -> 'b Tree.t val foreachDescendent: 'a t * 'a Node.t * ('a Node.t -> unit) -> unit val foldNodes: 'a t * 'b * ('a Node.t * 'b -> 'b) -> 'b val foreachEdge: 'a t * ('a Node.t * 'a Edge.t -> unit) -> unit val foreachNode: 'a t * ('a Node.t -> unit) -> unit (* ignoreNodes (g, f) builds a graph g' that looks like g, except that g' * does not contain nodes n such that f n, and that for every path in g * of the form n0 -> n1 -> ... -> nm, where n0 and nm are not ignored and * n1, ..., n_m-1 are ignored, there is an edge in g'. *) val ignoreNodes: 'a t * ('a Node.t -> bool) -> 'a u t * {destroy: unit -> unit, newNode: 'a Node.t -> 'a u Node.t} val layoutDot: 'a t * ({nodeName: 'a Node.t -> string} -> {edgeOptions: 'a Edge.t -> Dot.EdgeOption.t list, nodeOptions: 'a Node.t -> Dot.NodeOption.t list, options: Dot.GraphOption.t list, title: string}) -> Layout.t structure LoopForest: sig type 'a t val dest: 'a t -> {loops: {headers: 'a Node.t vector, child: 'a t} vector, notInLoop: 'a Node.t vector} end val loopForestSteensgaard: 'a t * {root: 'a Node.t} -> 'a LoopForest.t val new: unit -> 'a t val newNode: 'a t -> 'a Node.t val nodes: 'a t -> 'a Node.t list val numNodes: 'a t -> int (* quotient (g, v) * Pre: v should be an equivalence relation on the nodes of g. That is, * each node in g should appear exactly once in some vector in v. * The result is a graph with one node per equivalence class, and an edge * between classes iff there is an edge between nodes in the classes. *) val quotient: 'a t * ('a Node.t vector vector) -> 'a u t * {destroy: unit -> unit, newNode: 'a Node.t -> 'a u Node.t} val removeDuplicateEdges: 'a t -> unit (* Strongly-connected components. * Each component is given as a list of nodes. * The components are returned topologically sorted. *) val stronglyConnectedComponents: 'a t -> 'a Node.t list list val subgraph: 'a t * ('a Node.t -> bool) -> 'a u t * {destroy: unit -> unit, newNode: 'a Node.t -> 'a u Node.t} (* topologicalSort g returns NONE if there is a cycle in g. * Otherwise, returns then nodes in g in a list such that if there is a * path in g from n to n', then n appears before n' in the list. *) val topologicalSort: 'a t -> 'a Node.t list option val transpose: 'a t -> 'a u t * {destroy: unit -> unit, newNode: 'a Node.t -> 'a u Node.t} end functor TestDirectedGraph (S: DIRECTED_GRAPH): sig end = struct open S (* Section 7.3 of Muchnick. *) local val g = new () val {get = name, set = setName, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("name", Node.layout)) val node = String.memoize (fn s => let val n = newNode g val _ = setName (n, s) in n end) val _ = List.foreach ([("entry\nfoo", "B1"), ("B1", "B2"), ("B1", "B3"), ("B2", "exit"), ("B3", "B4"), ("B4", "B5"), ("B4", "B6"), ("B5", "exit"), ("B6", "B4")], fn (from, to) => ignore (addEdge (g, {from = node from, to = node to}))) val _ = File.withOut ("/tmp/z.dot", fn out => let open Dot in Layout.output (layoutDot (g, fn _ => {title = "Muchnick", options = [], edgeOptions = fn _ => [], nodeOptions = fn n => [NodeOption.label (name n)]}), out) ; Out.newline out end) val {idom} = dominators (g, {root = node "entry\nfoo"}) val g2 = new () val {get = oldNode, set = setOldNode, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("oldNode", Node.layout)) val {get = newNode, ...} = Property.get (Node.plist, Property.initFun (fn n => let val n' = newNode g2 val _ = setOldNode (n', n) in n' end)) val _ = foreachNode (g, fn n => case idom n of Idom n' => ignore (addEdge (g2, {from = newNode n', to = newNode n})) | _ => ()) val _ = File.withOut ("/tmp/z2.dot", fn out => let open Dot in Layout.output (layoutDot (g2, fn _ => {title = "dom", options = [], edgeOptions = fn _ => [], nodeOptions = fn n => [NodeOption.label (name (oldNode n))]}), out) ; Out.newline out end) in end end mlton-20100608/lib/mlton/basic/directed-graph.sml0000644000076600000240000010745011404435636020153 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure DirectedGraph:> DIRECTED_GRAPH = struct structure Types = struct datatype node = Node of {successors: edge list ref, plist: PropertyList.t} and edge = Edge of {from: node, to: node, plist: PropertyList.t} end structure Edge = struct datatype t = datatype Types.edge local fun make sel (Edge r) = sel r in val from = make #from val plist = make #plist val to = make #to end end structure Node = struct type edge = Types.edge datatype t = datatype Types.node fun layout _ = Layout.str "node" fun successors (Node {successors, ...}) = !successors fun plist (Node {plist, ...}) = plist fun new () = Node {successors = ref [], plist = PropertyList.new ()} fun equals (n, n') = PropertyList.equals (plist n, plist n') fun hasEdge {from, to} = List.exists (successors from, fn e => equals (to, Edge.to e)) fun removeDuplicateSuccessors (Node {successors, ...}) = let val {get, rem, ...} = Property.get (plist, Property.initFun (fn _ => ref false)) val es = List.fold (! successors, [], fn (e, ac) => let val r = get (Edge.to e) in if !r then ac else (r := true ; e :: ac) end) val () = List.foreach (es, rem o Edge.to) val () = successors := es in () end end structure Edge = struct structure Node = Node open Edge fun new {from, to} = Edge {from = from, to = to, plist = PropertyList.new ()} fun equals (e, e') = PropertyList.equals (plist e, plist e') fun layout e = Layout.record [("from", Node.layout (from e)), ("to", Node.layout (to e))] end (*---------------------------------------------------*) (* graph datatype *) (*---------------------------------------------------*) datatype t = T of {nodes: Node.t list ref} fun coerce g = (g, {edge = fn e => e, node = fn n => n}) fun nodes (T {nodes, ...}) = !nodes fun foldNodes (g, a, f) = List.fold (nodes g, a, f) val numNodes = List.length o nodes fun removeDuplicateEdges (g: t): unit = List.foreach (nodes g, Node.removeDuplicateSuccessors) fun new () = T {nodes = ref []} fun newNode (T {nodes, ...}) = let val n = Node.new () in List.push (nodes, n) ; n end fun addEdge (_, e as {from = Node.Node {successors, ...}, ...}) = let val e = Edge.new e val () = List.push (successors, e) in e end fun addEdge' arg = ignore (addEdge arg) fun layoutDot (T {nodes, ...}, mkOptions: {nodeName: Node.t -> string} -> {edgeOptions: Edge.t -> Dot.EdgeOption.t list, nodeOptions: Node.t -> Dot.NodeOption.t list, options: Dot.GraphOption.t list, title: string}): Layout.t = let val ns = !nodes val c = Counter.new 0 val {get = nodeId, rem, ...} = Property.get (Node.plist, Property.initFun (fn _ => concat ["n", Int.toString (Counter.next c)])) val {edgeOptions, nodeOptions, options, title} = mkOptions {nodeName = nodeId} val nodes = List.revMap (ns, fn n as Node.Node {successors, ...} => {name = nodeId n, options = nodeOptions n, successors = List.revMap (!successors, fn e => {name = nodeId (Edge.to e), options = edgeOptions e})}) val res = Dot.layout {nodes = nodes, options = options, title = title} val _ = List.foreach (ns, rem) in res end (*--------------------------------------------------------*) (* Depth-First Search *) (*--------------------------------------------------------*) structure DfsParam = struct type ('a, 'b, 'c, 'd, 'e) t = 'b * (Node.t * 'b -> ('c * (Node.t * 'c -> ('d * (Edge.t * 'd -> 'd) * (Edge.t * 'd -> 'c * ('e -> 'd)) * ('d -> 'e))) * ('e -> 'b))) type ('a, 'b) u = ('a, 'b, 'b, 'b, 'b) t fun startFinishNode (a: 'a, start: Node.t * 'a -> 'a, finish: Node.t * 'a -> 'a): ('b, 'a) u = (a, fn (_, a) => (a, fn (n, a) => let val a = start (n, a) in (a, #2, fn (_, a) => (a, fn a => a), fn a => finish (n, a)) end, fn a => a)) fun finishNode (f: Node.t -> unit) = startFinishNode ((), fn _ => (), f o #1) fun startNode (f: Node.t -> unit) = startFinishNode ((), f o #1, fn _ => ()) fun discoverFinishTimes () = let val {get = discover, set = setDiscover, destroy = destroyDiscover, ...} = Property.destGetSetOnce (Node.plist, Property.initRaise ("discover", Node.layout)) val {get = finish, set = setFinish, destroy = destroyFinish, ...} = Property.destGetSetOnce (Node.plist, Property.initRaise ("finish", Node.layout)) in (startFinishNode (0: int, fn (n, t) => (setDiscover (n, t); t + 1), fn (n, t) => (setFinish (n, t); t + 1)), {destroy = fn () => (destroyDiscover (); destroyFinish ()), discover = discover, finish = finish}) end end fun dfsNodes (_: t, ns: Node.t list, (b, f): ('a, 'b, 'c, 'd, 'e) DfsParam.t) = let type info = {hasBeenVisited: bool ref} val {get = nodeInfo: Node.t -> info, destroy, ...} = Property.destGetSet (Node.plist, Property.initFun (fn _ => {hasBeenVisited = ref false})) val b = List.fold (ns, b, fn (n, b) => let val info as {hasBeenVisited} = nodeInfo n in if !hasBeenVisited then b else let val (c, startNode, finishTree) = f (n, b) fun visit (n: Node.t, {hasBeenVisited}: info, c: 'c): 'e = let val _ = hasBeenVisited := true val (d, nonTreeEdge, treeEdge, finishNode) = startNode (n, c) in finishNode (List.fold (Node.successors n, d, fn (e, d) => let val n = Edge.to e val info as {hasBeenVisited} = nodeInfo n in if !hasBeenVisited then nonTreeEdge (e, d) else let val (c, finish) = treeEdge (e, d) in finish (visit (n, info, c)) end end)) end in finishTree (visit (n, info, c)) end end) val _ = destroy () in b end fun dfs (g, z) = dfsNodes (g, nodes g, z) fun dfsTrees (g, roots: Node.t list, nodeValue: Node.t -> 'a): 'a Tree.t list = dfsNodes (g, roots, ([], fn (_, trees) => let fun startNode (n, ()) = let fun nonTree (_, ts) = ts fun tree (_, ts) = ((), fn t => t :: ts) fun finish ts = Tree.T (nodeValue n, Vector.fromList ts) in ([], nonTree, tree, finish) end fun finishTree t = t :: trees in ((), startNode, finishTree) end)) fun dfsTree (g, {root, nodeValue}) = case dfsTrees (g, [root], nodeValue) of [t] => t | _ => Error.bug "DirectedGraph.dfsTree" fun display {graph, layoutNode, display} = dfs (graph, DfsParam.startNode (fn n => display let open Layout in seq [layoutNode n, str " ", list (List.revMap (Node.successors n, layoutNode o Edge.to))] end)) fun foreachDescendent (g, n, f) = dfsNodes (g, [n], DfsParam.finishNode f) fun foreachNode (g, f) = List.foreach (nodes g, f) fun foreachEdge (g, edge) = foreachNode (g, fn n as Node.Node {successors, ...} => List.foreach (!successors, fn e => edge (n, e))) (*--------------------------------------------------------*) (* Dominators *) (*--------------------------------------------------------*) fun validDominators (graph, {root: Node.t, idom: Node.t -> Node.t}): bool = (* Check for each edge v --> w that idom w dominates v. * FIXME: It should first check that idom describes a tree rooted at root. *) Exn.withEscape (fn escape => let fun dominates (a: Node.t, b: Node.t): bool = let fun loop b = Node.equals (a, b) orelse (not (Node.equals (b, root)) andalso loop (idom b)) in loop b end val _ = foreachEdge (graph, fn (_, Edge.Edge {from, to, ...}) => if dominates (idom to, from) then () else escape false) in true end) val _ = validDominators datatype 'a idomRes = Idom of Node.t | Root | Unreachable (* This is an implementation of the simple and fast dominance algorithm * described in * * A Simple, Fast Dominance Algorithm. * Keith Cooper and Timothy Harvey and Ken Kennedy. * Software Practice and Experience, 2001. * http://citeseer.ist.psu.edu/cooper01simple.html * http://www.cs.rice.edu/~keith/EMBED/dom.pdf * * This implementation replaced the previous implementation based on the * Lengauer/Tarjan algorithm, as described on p. 185-191 of Muchnick's * "Advanced Compiler Design and Implementation", and appears to run in * less than half the time on a self compile and took about half the * amount of code to implement. *) fun dominators (graph, {root}) = let val unknown = ~2 val visiting = ~1 val {get = getNum, set = setNum, rem = remNum, ...} = Property.getSet (Node.plist, Property.initConst unknown) val nodes = Array.array (numNodes graph, root) fun node i = Array.sub (nodes, i) fun dfs (n, v) = (setNum (v, visiting) ; case List.fold (Node.successors v, n, fn (Edge.Edge {to, ...}, n) => if getNum to = unknown then dfs (n, to) else n) of n => (setNum (v, n) ; Array.update (nodes, n, v) ; n+1)) val numNodes = dfs (0, root) val preds = Array.array (numNodes, []) fun addPred (t, f) = Array.update (preds, t, f :: Array.sub (preds, t)) val () = Int.for (0, numNodes, fn i => List.foreach (Node.successors (node i), fn Edge.Edge {to, ...} => addPred (getNum to, i))) val () = Array.foreach (nodes, remNum) val idoms = Array.array (numNodes, unknown) fun idom i = Array.sub (idoms, i) fun setIdom (i, d) = Array.update (idoms, i, d) val rootNum = numNodes-1 val () = setIdom (rootNum, rootNum) fun intersect (n1, n2) = if n1 = n2 then n1 else let fun up (f, t) = if f < t then up (idom f, t) else f val n1 = up (n1, n2) val n2 = up (n2, n1) in intersect (n1, n2) end fun iterate () = if Int.foldDown (0, rootNum, false, fn (i, changed) => let val new = case Array.sub (preds, i) of [] => raise Fail "bug" | p::ps => List.fold (ps, p, fn (j, new) => if idom j <> unknown then intersect (new, j) else new) in if idom i <> new then (setIdom (i, new) ; true) else changed end) then iterate () else () val () = iterate () val {get = idomFinal, set = setIdom, ...} = Property.getSetOnce (Node.plist, Property.initConst Unreachable) val () = setIdom (root, Root) val () = Int.for (0, rootNum, fn i => setIdom (node i, Idom (node (idom i)))) in {idom = idomFinal} end fun dominatorTree (graph, {root: Node.t, nodeValue: Node.t -> 'a}): 'a Tree.t = let val {idom} = dominators (graph, {root = root}) val {get = nodeInfo, ...} = Property.get (Node.plist, Property.initFun (fn n => {children = ref [], value = nodeValue n})) val _ = List.foreach (nodes graph, fn n => case idom n of Idom n' => List.push (#children (nodeInfo n'), n) | Root => () | Unreachable => ()) fun treeAt (n: Node.t): 'a Tree.t = let val {children, value} = nodeInfo n in Tree.T (value, Vector.fromListMap (!children, treeAt)) end in treeAt root end fun ignoreNodes (g: t, shouldIgnore: Node.t -> bool) : t * {destroy: unit -> unit, newNode: Node.t -> Node.t} = let val g' = new () val {destroy, get = newNode, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => newNode g')) (* reach n is the set of non-ignored nodes that n reaches via * nonempty paths through ignored nodes. It is computed by starting * at each node and doing a DFS that only goes through ignored nodes. *) val {get = reach: Node.t -> Node.t list, ...} = Property.get (Node.plist, Property.initFun (fn root => let val r = ref [] val {destroy, get = seen, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => ref false)) fun loop n = List.foreach (Node.successors n, fn e => let val n = Edge.to e val s = seen n in if !s then () else (s := true ; if shouldIgnore n then loop n else List.push (r, n)) end) val _ = loop root val _ = destroy () in !r end)) val _ = foreachNode (g, fn n => if shouldIgnore n then () else let val from = newNode n in List.foreach (reach n, fn to => addEdge' (g', {from = from, to = newNode to})) end) in (g', {destroy = destroy, newNode = newNode}) end (*--------------------------------------------------------*) (* Loop Forest *) (*--------------------------------------------------------*) (* This is an implementation of the G. Ramalingam loop forest construction, * as described in "On Loops, Dominators, and Dominance Frontiers" * (originally in PLDI00; revised technical report at * http://www.research.ibm.com/people/r/rama/Papers/ibmtr21513.revised.ps). *) structure LoopForest = struct (* Every node in the graph will appear exactly once in a notInLoop * vector in the loop forest. * Every node that is a loop header will appear in exactly one headers * vector. *) datatype t = T of {loops: {headers: Node.t vector, child: t} vector, notInLoop: Node.t vector} fun single n = T {loops = Vector.new0 (), notInLoop = Vector.new1 n} fun layoutDot (forest: t, {nodeName: Node.t -> string, options: Dot.GraphOption.t list, title: string}) = let open Dot fun label ns = NodeOption.label (Layout.toString (Vector.layout (Layout.str o nodeName) ns)) val c = Counter.new 0 fun newName () = concat ["n", Int.toString (Counter.next c)] val nodes = ref [] fun loop (T {loops, notInLoop}) = let val n = newName () val _ = List.push (nodes, {name = n, options = [label notInLoop, NodeOption.Shape Box], successors = []}) in Vector.fold (loops, [n], fn ({headers, child}, ac) => let val n = newName () val _ = List.push (nodes, {name = n, options = [label headers, NodeOption.Shape Ellipse], successors = List.revMap (loop child, fn n => {name = n, options = []})}) in n :: ac end) end val _ = loop forest in Dot.layout {nodes = !nodes, options = options, title = title} end val _ = layoutDot end (* Strongly connected components from Aho, Hopcroft, Ullman section 5.5. *) fun stronglyConnectedComponents (g: t): Node.t list list = let val {get = nodeInfo: Node.t -> {dfnumber: int, isOnStack: bool ref, lowlink: int ref}, set = setNodeInfo, destroy, ...} = Property.destGetSetOnce (Node.plist, Property.initRaise ("scc info", Node.layout)) fun startNode (n, (count, stack, components)) = let val dfnumber = count val count = count + 1 val lowlink = ref dfnumber val stack = n :: stack val isOnStack = ref true val v = {dfnumber = dfnumber, isOnStack = isOnStack, lowlink = lowlink} val _ = setNodeInfo (n, v) fun nonTreeEdge (e, z) = let val w = nodeInfo (Edge.to e) val _ = if #dfnumber w < #dfnumber v andalso !(#isOnStack w) andalso #dfnumber w < !(#lowlink v) then #lowlink v := #dfnumber w else () in z end fun treeEdge (e, z) = (z, fn z => let val w = nodeInfo (Edge.to e) val _ = if !(#lowlink w) < !(#lowlink v) then #lowlink v := !(#lowlink w) else () in z end) fun finishNode (count, stack, components) = if !lowlink = dfnumber then let fun popTo (stack, ac) = case stack of [] => Error.bug "DirectedGraph.stronglyConnectedComponents.finishNode.popTo" | n' :: stack => let val _ = #isOnStack (nodeInfo n') := false val ac = n' :: ac in if Node.equals (n, n') then (stack, ac) else popTo (stack, ac) end val (stack, component) = popTo (stack, []) in (count, stack, component :: components) end else (count, stack, components) in ((count, stack, components), nonTreeEdge, treeEdge, finishNode) end val (_, _, components) = dfs (g, ((0, [], []), fn (_, z) => (z, startNode, fn z => z))) val _ = destroy () in components end val stronglyConnectedComponents = if true then stronglyConnectedComponents else let val c = Counter.new 0 in fn g => let val nodeCounter = Counter.new 0 val {get = nodeIndex: Node.t -> int, destroy, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => Counter.next nodeCounter)) val index = Counter.next c val _ = File.withOut (concat ["graph", Int.toString index, ".dot"], fn out => Layout.output (layoutDot (g, fn _ => {edgeOptions = fn _ => [], nodeOptions = fn n => [Dot.NodeOption.label (Int.toString (nodeIndex n))], options = [], title = "scc graph"}), out)) val ns = stronglyConnectedComponents g val _ = File.withOut (concat ["scc", Int.toString index], fn out => Layout.outputl (List.layout (List.layout (Int.layout o nodeIndex)) ns, out)) val _ = destroy () in ns end end (* This code assumes everything is reachable from the root. * Otherwise it may loop forever. *) fun loopForestSteensgaard (g: t, {root: Node.t}): LoopForest.t = let val {get = nodeInfo: Node.t -> {class: int ref, isHeader: bool ref, (* The corresponding node in the next subgraph. *) next: Node.t option ref, (* The corresponding node in the original graph. *) original: Node.t}, set = setNodeInfo, rem = remNodeInfo, ...} = Property.getSet (Node.plist, Property.initRaise ("loopForestSteensgaard", Node.layout)) fun newNodeInfo (n, original) = setNodeInfo (n, {class = ref ~1, isHeader = ref false, next = ref NONE, original = original}) val _ = List.foreach (nodes g, fn n => newNodeInfo (n, n)) (* Treat the root as though there is an external edge into it. *) val _ = #isHeader (nodeInfo root) := true (* Before calling treeFor, nodeInfo must be defined for all nodes in g. *) fun treeFor (g: t): LoopForest.t = let val sccs = stronglyConnectedComponents g (* Put nodes in the same scc into the same class. *) val _ = List.foreachi (sccs, fn (i, ns) => List.foreach (ns, fn n => #class (nodeInfo n) := i)) (* Set nodes to be headers if they are the target of an edge whose * source is in another scc. * This is a bit of an abuse of terminology, since it also marks * as headers nodes that are in their own trivial (one node) scc. *) val _ = List.foreach (nodes g, fn n => let val {class = ref class, ...} = nodeInfo n val _ = List.foreach (Node.successors n, fn e => let val {class = ref class', isHeader, ...} = nodeInfo (Edge.to e) in if class = class' then () else isHeader := true end) in () end) (* Accumulate the subtrees. *) val loops = ref [] val notInLoop = ref [] val _ = List.foreach (sccs, fn ns => case ns of [n] => let val {original, ...} = nodeInfo n in if List.exists (Node.successors n, fn e => Node.equals (n, Edge.to e)) then List.push (loops, {headers = Vector.new1 original, child = LoopForest.single original}) else List.push (notInLoop, original) end | _ => let (* Build a new subgraph of the component, sans edges * that go into headers. *) val g' = new () val headers = ref [] (* Create all the new nodes. *) val _ = List.foreach (ns, fn n => let val {next, original, ...} = nodeInfo n val n' = newNode g' val _ = next := SOME n' val _ = newNodeInfo (n', original) in () end) (* Add all the edges. *) val _ = List.foreach (ns, fn from => let val {class = ref class, isHeader, next, original, ...} = nodeInfo from val from' = valOf (!next) val _ = if !isHeader then List.push (headers, original) else () in List.foreach (Node.successors from, fn e => let val to = Edge.to e val {class = ref class', isHeader = isHeader', next = next', ...} = nodeInfo to in if class = class' andalso not (!isHeader') then addEdge' (g', {from = from', to = valOf (!next')}) else () end) end) (* We're done with the old graph, so delete the * nodeInfo. *) val _ = List.foreach (ns, remNodeInfo) val headers = Vector.fromList (!headers) val child = treeFor g' in List.push (loops, {child = child, headers = headers}) end) in LoopForest.T {loops = Vector.fromList (!loops), notInLoop = Vector.fromList (!notInLoop)} end in treeFor g end fun quotient (g, vs) = let val numClasses = Vector.length vs val {destroy, get = nodeClass: Node.t -> int, set = setNodeClass, ...} = Property.destGetSetOnce (Node.plist, Property.initRaise ("newNode", Node.layout)) val g' = new () val newNodes = Vector.mapi (vs, fn (i, v) => let val n' = newNode g' val _ = Vector.foreach (v, fn n => setNodeClass (n, i)) in n' end) val successors = Array.array (numClasses, []) val _ = foreachNode (g, fn n => let val class = nodeClass n in Array.update (successors, class, List.fold (Node.successors n, Array.sub (successors, class), fn (e, ac) => nodeClass (Edge.to e) :: ac)) end) (* Eliminate duplicates from successor lists and add the graph edges. *) val hasIt = Array.array (numClasses, false) val _ = Array.foreachi (successors, fn (i, cs) => let val from = Vector.sub (newNodes, i) val _ = List.foreach (cs, fn c => if Array.sub (hasIt, c) then () else (Array.update (hasIt, c, true) ; addEdge' (g', {from = from, to = Vector.sub (newNodes, c)}))) val _ = List.foreach (cs, fn c => Array.update (hasIt, c, false)) in () end) fun newNode n = Vector.sub (newNodes, nodeClass n) in (g', {destroy = destroy, newNode = newNode}) end fun subgraph (g: t, keep: Node.t -> bool) = let val sub = new () val {get = newNode, destroy, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => newNode sub)) val _ = foreachNode (g, fn from => if not (keep from) then () else List.foreach (Node.successors from, let val from = newNode from in fn e => let val to = Edge.to e in if keep to then addEdge' (sub, {from = from, to = newNode to}) else () end end)) in (sub, {destroy = destroy, newNode = newNode}) end fun topologicalSort (g: t): Node.t list option = let exception Cycle val {get = amVisiting, destroy, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => ref false)) fun doit () = dfs (g, ([], fn (_, ns) => let fun startNode (n, ns) = let fun nonTree (e, ns) = if !(amVisiting (Edge.to e)) then raise Cycle else ns fun tree (_, ns) = (ns, fn ns => ns) fun finish ns = n :: ns in (ns, nonTree, tree, finish) end fun finishTree ns = ns in (ns, startNode, finishTree) end)) val res = SOME (doit ()) handle Cycle => NONE val _ = destroy () in res end fun transpose (g: t) = let val transpose = new () val {get = newNode, destroy, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => newNode transpose)) val _ = foreachNode (g, fn to => List.foreach (Node.successors to, let val to = newNode to in fn e => addEdge' (transpose, {from = newNode (Edge.to e), to = to}) end)) in (transpose, {destroy = destroy, newNode = newNode}) end val transpose = if true then transpose else let val c = Counter.new 0 in fn g => let val nodeCounter = Counter.new 0 val {get = nodeIndex: Node.t -> int, destroy, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => Counter.next nodeCounter)) val index = Counter.next c val _ = File.withOut (concat ["graph", Int.toString index, ".dot"], fn out => Layout.output (layoutDot (g, fn _ => {edgeOptions = fn _ => [], nodeOptions = fn n => [Dot.NodeOption.label (Int.toString (nodeIndex n))], options = [], title = "transpose graph"}), out)) val z as (g, _) = transpose g val _ = File.withOut (concat ["transpose", Int.toString index, ".dot"], fn out => Layout.output (layoutDot (g, fn _ => {edgeOptions = fn _ => [], nodeOptions = fn n => [Dot.NodeOption.label (Int.toString (nodeIndex n))], options = [], title = "transpose graph"}), out)) val _ = destroy () in z end end structure Node = struct open Node type 'a t = t type 'a edge = edge end structure Edge = struct open Edge type 'a t = t end type 'a t = t type 'a u = unit structure LoopForest = struct open LoopForest type 'a t = t fun dest (T r) = r end end mlton-20100608/lib/mlton/basic/directed-sub-graph.sig0000644000076600000240000001643511404435636020733 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DIRECTED_SUB_GRAPH = sig (* the main graph type *) type t structure Node: sig type graph type edge type t val equals: t * t -> bool val hasEdge: graph * {from: t, to: t} -> bool val layout: t -> Layout.t val plist: t -> PropertyList.t val successors: graph * t -> edge list end structure Edge: sig type graph type node type t val equals: t * t -> bool val from: graph * t -> node val plist: t -> PropertyList.t val to: graph * t -> node end sharing type Node.edge = Edge.t sharing type Edge.node = Node.t sharing type Node.graph = t sharing type Edge.graph = t (* depth first search *) structure DfsParam: sig type t = {startNode: Node.t -> unit, finishNode: Node.t -> unit, handleTreeEdge: Edge.t -> unit, handleNonTreeEdge: Edge.t -> unit, startTree: Node.t -> unit, finishTree: Node.t -> unit, finishDfs: unit -> unit} val finishNode: (Node.t -> unit) -> t val ignore: 'a -> unit val combine: t * t -> t end (* create a sub-graph from a graph *) val subGraph: t * {nodeP: Node.t -> bool, edgeP: Edge.t -> bool} -> t val supGraph: t -> t val addEdge: t * {from: Node.t, to: Node.t} -> Edge.t val dfs: t * DfsParam.t -> unit val dfsNodes: t * Node.t list * DfsParam.t -> unit val discoverFinishTimes: t -> {discover: Node.t -> int, finish: Node.t -> int, destroy: unit -> unit, param: DfsParam.t} val display: {graph: t, layoutNode: Node.t -> Layout.t, display: Layout.t -> unit} -> unit (* dominators {graph, root} * Pre: All nodes in graph must be reachable from root. * This condition is checked. * Returns idom, where * idom n = the immediate dominator n. * idom root = root. *) val dominators: t * {root: Node.t} -> {idom: Node.t -> Node.t} val dominatorTree: t * {root: Node.t, nodeValue: Node.t -> 'a} -> 'a Tree.t val foreachDescendent: t * Node.t * (Node.t -> unit) -> unit val foreachEdge: t * (Node.t * Edge.t -> unit) -> unit val foreachNode: t * (Node.t -> unit) -> unit (* exception Input *) (* val input: In.t * (In.t -> 'a)* (In.t -> 'b) -> t * 'a * (Edge.t -> 'b) *) (* val isCyclic: t -> bool*) val layoutDot: t * {title: string, options: Dot.GraphOption.t list, edgeOptions: Edge.t -> Dot.EdgeOption.t list, nodeOptions: Node.t -> Dot.NodeOption.t list} -> Layout.t val loopForest: {headers: (* graph *) Node.t list -> (* graph *) Node.t list, graph: t, root: (* graph *) Node.t} -> {forest: t, graphToForest: (* graph *) Node.t -> (* forest *) Node.t, headers: (* graph *) Node.t list -> (* graph *) Node.t list, isHeader: (* graph *) Node.t -> bool, loopNodes: (* forest *) Node.t -> (* graph *) Node.t list, parent: (* forest *) Node.t -> (* forest *) Node.t option} val loopForestSteensgaard: {graph: t, root: (* graph *) Node.t} -> {forest: t, graphToForest: (* graph *) Node.t -> (* forest *) Node.t, headers: (* graph *) Node.t list -> (* graph *) Node.t list, isHeader: (* graph *) Node.t -> bool, loopNodes: (* forest *) Node.t -> (* graph *) Node.t list, parent: (* forest *) Node.t -> (* forest *) Node.t option} val new: unit -> t val newNode: t -> Node.t val nodes: t -> Node.t list (* val random: {numNodes: int, numEdges: int} -> t*) (* val removeBackEdges: t -> unit *) (* removeEdge fails if edge isn't there. *) (* val removeEdge: t * Edge.t -> unit *) (* Strongly-connected components. * Each component is given as a list of nodes. * The components are returned topologically sorted. *) val stronglyConnectedComponents: t -> Node.t list list exception TopologicalSort val topologicalSort: t -> Node.t list (* val transpose: t -> t *) end functor TestDirectedSubGraph (S: DIRECTED_SUB_GRAPH): sig end = struct open S (* Section 7.3 of Muchnick. *) local val g = new () val {get = name, set = setName, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("name", Node.layout)) val node = String.memoize (fn s => let val n = newNode g val _ = setName (n, s) in n end) val _ = List.foreach ([("entry\nfoo", "B1"), ("B1", "B2"), ("B1", "B3"), ("B2", "exit"), ("B3", "B4"), ("B4", "B5"), ("B4", "B6"), ("B5", "exit"), ("B6", "B4")], fn (from, to) => ignore (addEdge (g, {from = node from, to = node to}))) val _ = File.withOut ("/tmp/z.dot", fn out => let open Dot in Layout.output (layoutDot (g, {title = "Muchnick", options = [], edgeOptions = fn _ => [], nodeOptions = fn n => [NodeOption.label (name n)]}), out) ; Out.newline out end) val {idom} = dominators (g, {root = node "entry\nfoo"}) val g2 = new () val {get = oldNode, set = setOldNode, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("oldNode", Node.layout)) val {get = newNode, ...} = Property.get (Node.plist, Property.initFun (fn n => let val n' = newNode g2 val _ = setOldNode (n', n) in n' end)) val _ = foreachNode (g, fn n => ignore (addEdge (g2, {from = newNode (idom n), to = newNode n}))) val _ = File.withOut ("/tmp/z2.dot", fn out => let open Dot in Layout.output (layoutDot (g2, {title = "dom", options = [], edgeOptions = fn _ => [], nodeOptions = fn n => [NodeOption.label (name (oldNode n))]}), out) ; Out.newline out end) in end end mlton-20100608/lib/mlton/basic/directed-sub-graph.sml0000644000076600000240000012664211404435636020746 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure DirectedSubGraph: DIRECTED_SUB_GRAPH = struct structure Types = struct datatype node = Node of {successors: edge list ref, plist: PropertyList.t} and edge = Edge of {from: node, to: node, plist: PropertyList.t} and graph = T of {nodes: node list ref, nodeP: node -> bool, edgeP: edge -> bool} end structure Edge = struct datatype graph = datatype Types.graph type node = Types.node datatype t = datatype Types.edge fun layout _ = Layout.str "edge" local fun make sel (Edge r) = sel r in val from = make #from val plist = make #plist val to = make #to end val from = fn (T {nodeP, edgeP, ...}, e) => (Assert.assert("DirectedSubGraph.Edge.from", fn () => edgeP e) ; Assert.assert("DirectedSubGraph.Edge.from", fn () => nodeP (from e)) ; from e) val to = fn (T {nodeP, edgeP, ...}, e) => (Assert.assert("DirectedSubGraph.Edge.to", fn () => edgeP e) ; Assert.assert("DirectedSubGraph.Edge.to", fn () => nodeP (to e)) ; to e) fun new (T {nodeP, edgeP, ...}, {from, to}) = (Assert.assert("DirectedSubGraph.Edge.new", fn () => nodeP from) ; Assert.assert("DirectedSubGraph.Edge.new", fn () => nodeP to) ; Edge {from = from, to = to, plist = PropertyList.new ()}) fun equals (e, e') = PropertyList.equals (plist e, plist e') end structure Node = struct datatype graph = datatype Types.graph type edge = Types.edge datatype t = datatype Types.node fun layout _ = Layout.str "node" local fun make sel (Node r) = sel r in val plist = make #plist val successors' = make #successors val successors = ! o successors' end val foreachSuccessor = fn (T {nodeP, edgeP, ...}, n, f) => (Assert.assert("DirectedSubGraph.Node.foreachSuccessor", fn () => nodeP n) ; List.foreach(successors n, fn e => if edgeP e then f e else ())) val forallSuccessors = fn (T {nodeP, edgeP, ...}, n, f) => (Assert.assert("DirectedSubGraph.Node.forallSuccessors", fn () => nodeP n) ; List.forall(successors n, fn e => if edgeP e then f e else true)) val existsSuccessor = fn (T {nodeP, edgeP, ...}, n, f) => (Assert.assert("DirectedSubGraph.Node.existsSuccessor", fn () => nodeP n) ; List.exists(successors n, fn e => if edgeP e then f e else false)) val successors = fn (T {nodeP, edgeP, ...}, n) => (Assert.assert("DirectedSubGraph.Node.successors", fn () => nodeP n) ; List.keepAll(successors n, fn e => edgeP e)) fun new g = Node {successors = ref [], plist = PropertyList.new ()} fun equals (n, n') = PropertyList.equals (plist n, plist n') fun hasEdge (g as T {nodeP, edgeP, ...}, {from, to}) = if nodeP from andalso nodeP to then existsSuccessor (g, from, fn e => equals (to, Edge.to (g, e))) else false (* fun removeSuccessor (Node {successors, ...}, n) = * successors := List.removeFirst (!successors, fn Edge.Edge {to, ...} => * equals (n, to)) *) end structure DfsParam = struct type t = {startNode: Node.t -> unit, finishNode: Node.t -> unit, handleTreeEdge: Edge.t -> unit, handleNonTreeEdge: Edge.t -> unit, startTree: Node.t -> unit, finishTree: Node.t -> unit, finishDfs: unit -> unit} fun ignore _ = () fun finishNode f = {finishNode = f, startNode = ignore, handleTreeEdge = ignore, handleNonTreeEdge = ignore, startTree = ignore, finishTree = ignore, finishDfs = ignore} fun startNode f = {finishNode = ignore, startNode = f, handleTreeEdge = ignore, handleNonTreeEdge = ignore, startTree = ignore, finishTree = ignore, finishDfs = ignore} fun seq f g a = (f a; g a) fun combine ({startNode, finishNode, handleTreeEdge, handleNonTreeEdge, startTree, finishTree, finishDfs}: t, {startNode = sn, finishNode = fin, handleTreeEdge = ht, handleNonTreeEdge = hn, startTree = st, finishTree = ft, finishDfs = fd}: t): t = {startNode = seq startNode sn, finishNode = seq finishNode fin, handleTreeEdge = seq handleTreeEdge ht, handleNonTreeEdge = seq handleNonTreeEdge hn, startTree = seq startTree st, finishTree = seq finishTree ft, finishDfs = seq finishDfs fd} end (*---------------------------------------------------*) (* graph datatype *) (*---------------------------------------------------*) datatype t = datatype Types.graph (*--------------------------------------------------------*) (* Foreach *) (*--------------------------------------------------------*) (* fun foreachNode (g, f) = List.foreach (nodes g, f) *) fun foreachNode (g as T {nodes, nodeP, ...}, f) = List.foreach (!nodes, fn n => if nodeP n then f n else ()) (* fun foreachEdge (g, f) = foreachNode (g, fn n => List.foreach (Node.successors (g, n), fn e => f (n, e))) *) fun foreachEdge (g, f) = foreachNode (g, fn n => Node.foreachSuccessor (g, n, fn e => f (n, e))) (*--------------------------------------------------------*) (* subGraphs *) (*--------------------------------------------------------*) fun subGraph (g as T {nodes, nodeP, edgeP, ...}, {nodeP = nodeP', edgeP = edgeP'}) = let val nodeP = fn n => if nodeP n then nodeP' n else false val edgeP = fn e => if edgeP e then edgeP' e else false val _ = Assert.assert ("DirectedSubGraph.subGraph", fn () => List.forall(!nodes, fn n => if nodeP n then Node.forallSuccessors(g, n, fn e => nodeP (Edge.to (g, e))) else true)) in T {nodes = nodes, nodeP = nodeP, edgeP = edgeP} end fun supGraph (g as T {nodes, ...}) = T {nodes = nodes, nodeP = fn _ => true, edgeP = fn _ => true} fun nodes (T {nodes, nodeP, ...}) = List.keepAll(!nodes, nodeP) fun new () = T {nodes = ref [], nodeP = fn _ => true, edgeP = fn _ => true} fun newNode (g as T {nodes, ...}) = let val n = Node.new g in List.push (nodes, n) ; n end fun addEdge (g as T {nodeP, ...}, e as {from, to}) = let val _ = Assert.assert("DirectedSubGraph.addEdge", fn () => nodeP from andalso nodeP to) val e = Edge.new (g, e) in List.push (Node.successors' from, e) ; e end (*fun removeEdge (_, {from, to}) = Node.removeSuccessor (from, to) *) fun layoutDot (g, {edgeOptions: Edge.t -> Dot.EdgeOption.t list, nodeOptions: Node.t -> Dot.NodeOption.t list, options, title}): Layout.t = let val c = Counter.new 0 val {get = nodeId, destroy, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => concat ["n", Int.toString (Counter.next c)])) val nodes = List.revMap (nodes g, fn n => {name = nodeId n, options = nodeOptions n, successors = List.revMap (Node.successors (g, n), fn e => {name = nodeId (Edge.to (g, e)), options = edgeOptions e})}) val res = Dot.layout {nodes = nodes, options = options, title = title} val _ = destroy () in res end (*--------------------------------------------------------*) (* Depth-First Search *) (*--------------------------------------------------------*) fun dfsNodes (g as T {nodeP, ...}, ns, {startNode, finishNode, handleTreeEdge, handleNonTreeEdge, startTree, finishTree, finishDfs}) = let val {get = hasBeenVisited, set = setVisited, destroy, ...} = Property.destGetSet (Node.plist, Property.initConst false) fun visit n = (Assert.assert("DirectedSubGraph.dfsNodes", fn () => nodeP n) ; startNode n ; setVisited (n, true) ; Node.foreachSuccessor (g, n, fn e => let val n' = Edge.to (g, e) in if hasBeenVisited n' then handleNonTreeEdge e else (visit n'; handleTreeEdge e) end) ; finishNode n) in List.foreach (ns, fn n => (Assert.assert("DirectedSubGraph.dfsNodes", fn () => nodeP n) ; if hasBeenVisited n then () else (startTree n; visit n; finishTree n))) ; destroy () ; finishDfs () end fun dfs (g, p) = dfsNodes (g, nodes g, p) fun display {graph, layoutNode, display} = dfs (graph, DfsParam.startNode (fn n => display let open Layout in seq [layoutNode n, str " ", list (List.revMap (Node.successors (graph, n), fn e => layoutNode (Edge.to (graph, e))))] end)) fun foreachDescendent (g, n, f) = dfsNodes (g, [n], DfsParam.finishNode f) (* fun removeBackEdges g = * let * val discoverTime = Counter.new 0 * val {get, destroy, ...} = * Property.newDest * (Node.plist, Property.initFun (fn _ => {time = Counter.next discoverTime, * alive = ref true})) * val ignore = DfsParam.ignore * in dfs * (g, {startNode = fn n => (get n; ()), * finishNode = fn n => #alive (get n) := false, * handleNonTreeEdge = * fn e as Edge.Edge {from, to, ...} => * let val {alive, time} = get to * in if !alive andalso time < #time (get from) * then removeEdge (g, e) * else () * end, * handleTreeEdge = ignore, * startTree = ignore, * finishTree = ignore, * finishDfs = ignore}) * end *) (*--------------------------------------------------------*) (* Times *) (*--------------------------------------------------------*) fun discoverFinishTimes g = let val time: int ref = ref 0 val {get = discover, set = setDiscover, destroy = destroyDiscover, ...} = Property.destGetSetOnce (Node.plist, Property.initRaise ("discover", Node.layout)) val {get = finish, set = setFinish, destroy = destroyFinish, ...} = Property.destGetSetOnce (Node.plist, Property.initRaise ("finish", Node.layout)) in {destroy = fn () => (destroyDiscover (); destroyFinish ()), discover = discover, finish = finish, param = {startNode = fn n => (Int.inc time; setDiscover (n, !time)), finishNode = fn n => (Int.inc time; setFinish (n, !time)), handleTreeEdge = DfsParam.ignore, handleNonTreeEdge = DfsParam.ignore, startTree = DfsParam.ignore, finishTree = DfsParam.ignore, finishDfs = DfsParam.ignore}} end (*--------------------------------------------------------*) (* Random *) (*--------------------------------------------------------*) (* fun maxNumEdges n = n * (n - 1) fun random {numNodes,numEdges} = let val max = maxNumEdges numNodes in if numNodes < 0 orelse numEdges < 0 orelse numEdges > max then Error.error "random" else let val g = new () val needed = ref numEdges val remaining = ref max fun maybeAddEdge (n,n') = (if Int.random (1, !remaining) <= !needed then (addEdge (g, Node.fromInt n, Node.fromInt n') ; IntRef.dec needed) else () ; IntRef.dec remaining) val minNode = 0 val maxNode = numNodes - 1 fun directed n = Int.foreach (0, maxNode, fn n' => if n = n' then () else maybeAddEdge (n,n')) fun undirected n = Int.foreach (n + 1, maxNode, fn n' => maybeAddEdge (n,n')) val addEdges = if isDirected then directed else undirected in Int.foreach (minNode, maxNode, addEdges) ; g end end *) (*--------------------------------------------------------*) (* Cycle *) (*--------------------------------------------------------*) (* fun cycleParam g = let val {get = isActive, set = setActive} = nodeInfo (g, fn _ => false) val cycle = ref false in (cycle, {startNode = fn n => setActive (n, true), finishNode = fn n => setActive (n, false), handleNonTreeEdge = fn (n, e) => let val n' = Edge.otherNode (e,n) in if isActive n' then cycle := true else () end, handleTreeEdge = DfsParam.ignore, startTree = DfsParam.ignore, finishTree = DfsParam.ignore, finishDfs = DfsParam.ignore}) end fun isCyclic g = let val (cycle, p) = cycleParam g in dfs (g, p); !cycle end *) (*--------------------------------------------------------*) (* Topological Sort *) (*--------------------------------------------------------*) exception TopologicalSort fun topSortParam g = let val {get = amVisiting, set = setVisiting, destroy, ...} = Property.destGetSet (Node.plist, Property.initRaise ("visiting", Node.layout)) val ns = ref [] in (ns, {startNode = fn n => amVisiting n := true, finishNode = fn n => (amVisiting n := false; List.push (ns,n)), handleNonTreeEdge = fn e => if !(amVisiting(Edge.to (g, e))) then raise TopologicalSort else (), startTree = DfsParam.ignore, finishTree = DfsParam.ignore, handleTreeEdge = DfsParam.ignore, finishDfs = destroy}) end fun topologicalSort g = let val (ns, p) = topSortParam g in dfs (g, p); !ns end (*--------------------------------------------------------*) (* Transpose *) (*--------------------------------------------------------*) (* fun transposeParam g = let val gt = new () fun handleEdge (n, e) = let val n' = Edge.otherNode (e,n) in addEdge (gt,n',n); () end in (gt, {handleTreeEdge = handleEdge, handleNonTreeEdge = handleEdge, finishDfs = DfsParam.ignore, startNode = DfsParam.ignore, finishNode = DfsParam.ignore, startTree = DfsParam.ignore, finishTree = DfsParam.ignore}) end fun transpose g = let val (gt, p) = transposeParam g in dfs (g, p); gt end *) (*--------------------------------------------------------*) (* Strongly Connected Components *) (*--------------------------------------------------------*) (* from Cormen, Leiserson, and Rivest 23.5 *) (* fun sccCLR g = let val (gt, p) = transposeParam g val ns = ref [] val p' = P.finishNode (fn n => List.push (ns,n)) val components = ref [] val component = ref [] fun startNode n = List.push (component,n) fun startTree _ = component := [] fun finishTree _ = List.push (components, !component) val pt = {startNode = startNode, startTree = startTree, finishTree = finishTree, finishNode = DfsParam.ignore, finishDfs = DfsParam.ignore, handleTreeEdge = DfsParam.ignore, handleNonTreeEdge = DfsParam.ignore} in dfs (g, P.combine (p, p')) ; dfsNodes (gt, !ns, pt) ; !components end *) (* from Aho, Hopcroft, Ullman section 5.5 *) fun stronglyConnectedComponents g = let val {get = discover: Node.t -> int, set = setDiscover, destroy = destroyDiscover, ...} = Property.destGetSetOnce (Node.plist, Property.initRaise ("discover", Node.layout)) val {get = low: Node.t -> int ref, destroy = destroyLow, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => ref ~1)) val {get = isOnStack: Node.t -> bool, set = setOnStack, destroy = destroyStack, ...} = Property.destGetSet (Node.plist, Property.initRaise ("isOnStack", Node.layout)) val stack = ref [] val components = ref [] val time = ref 0 fun pop () = let val n = List.pop stack in setOnStack (n, false); n end fun popTo n = let fun popTo () = let val n' = pop () in if Node.equals (n,n') then [n] else n' :: (popTo ()) end in popTo () end fun startNode n = (Int.inc time ; setDiscover (n, !time) ; low n := !time ; setOnStack (n, true) ; List.push (stack, n)) fun finishNode n = if discover n = ! (low n) then List.push (components, popTo n) else () fun updateLow e = let val from = Edge.from (g, e) val to = Edge.to (g, e) val lto = low to val lfrom = low from in if !lto < !lfrom then lfrom := !lto else () end val handleTreeEdge = updateLow fun handleNonTreeEdge e = if isOnStack (Edge.to (g, e)) then updateLow e else () val p = {startNode = startNode, finishNode = finishNode, handleTreeEdge = handleTreeEdge, handleNonTreeEdge = handleNonTreeEdge, startTree = DfsParam.ignore, finishTree = DfsParam.ignore, finishDfs = DfsParam.ignore} in dfs (g, p) ; destroyLow () ; destroyStack () ; destroyDiscover () ; !components end (*--------------------------------------------------------*) (* Dominators *) (*--------------------------------------------------------*) (* This is an implementation of the Lengauer/Tarjan dominator algorithm, as * described on p. 185-191 of Muchnick's "Advanced Compiler Design and * Implementation" *) structure NodeInfo = struct type t = {ancestor: Node.t ref, bucket: Node.t list ref, child: Node.t ref, dfn: int ref, (* depth first number *) idom: Node.t ref, label: Node.t ref, parent: Node.t ref, preds: Node.t list ref, sdno: int ref, (* semidominator dfn *) size: int ref} end fun validDominators (graph, {root: Node.t, idom: Node.t -> Node.t}): bool = (* Check for each edge v --> w that idom w dominates v. * FIXME: It should first check that idom describes a tree rooted at root. *) Exn.withEscape (fn escape => let fun dominates (a: Node.t, b: Node.t): bool = let fun loop b = Node.equals (a, b) orelse (not (Node.equals (b, root)) andalso loop (idom b)) in loop b end val _ = foreachEdge (graph, fn (_, Edge.Edge {from, to, ...}) => if dominates (idom to, from) then () else escape false) in true end) fun dominators (graph, {root}) = let val n0 = Node.new () fun newNode (n: Node.t): NodeInfo.t = {ancestor = ref n0, bucket = ref [], child = ref n0, dfn = ref ~1, idom = ref n0, label = ref n, parent = ref n0, preds = ref [], sdno = ref ~1, size = ref 1} val {get = nodeInfo: Node.t -> NodeInfo.t, ...} = Property.get (Node.plist, Property.initFun newNode) local fun 'a make (sel: NodeInfo.t -> 'a ref) = (sel o nodeInfo, ! o sel o nodeInfo) in val (ancestor', ancestor) = make #ancestor val (bucket', bucket) = make #bucket val (child', child) = make #child val (dfn', dfn) = make #dfn val (idom', idom) = make #idom val (label', label) = make #label val (parent', parent) = make #parent val (preds', preds) = make #preds val (sdno', sdno) = make #sdno val (size', size) = make #size end val _ = size' n0 := 0 (* nodes is an array of nodes indexed by dfs number. *) val numNodes = List.length (nodes graph) val nodes = Array.new (numNodes, n0) fun ndfs i = Array.sub (nodes, i) val dfnCounter = ref 0 fun dfs (v: Node.t): unit = let val i = !dfnCounter val _ = Int.inc dfnCounter val _ = dfn' v := i val _ = sdno' v := i val _ = Array.update (nodes, i, v) val _ = Node.foreachSuccessor (graph, v, fn e => let val w = Edge.to (graph, e) val _ = List.push (preds' w, v) in if sdno w = ~1 then (parent' w := v ; dfs w) else () end) in () end val _ = dfs root val _ = if !dfnCounter = numNodes then () else Error.bug "DirectedSubGraph.dominators: graph is not connected" (* compress ancestor path to node v to the node whose label has the * maximal (minimal?) semidominator number. *) fun compress (v: Node.t): unit = if Node.equals (n0, ancestor (ancestor v)) then () else let val _ = compress (ancestor v) val _ = if sdno (label (ancestor v)) < sdno (label v) then label' v := label (ancestor v) else () val _ = ancestor' v := ancestor (ancestor v) in () end fun eval (v: Node.t): Node.t = (* Determine the ancestor of v whose semidominator has the minimal * depth-first number. *) if Node.equals (ancestor v, n0) then label v else let val _ = compress v in if sdno (label (ancestor v)) >= sdno (label v) then label v else label (ancestor v) end fun link (v: Node.t, w: Node.t): unit = let fun loop s = if sdno (label w) < sdno (label (child s)) then if size s + size (child (child s)) >= 2 * size (child s) then (ancestor' (child s) := s ; child' s := child (child s) ; loop s) else (size' (child s) := size s ; ancestor' s := child s ; loop (child s)) else s val s = loop w val _ = label' s := label w val _ = size' v := size v + size w val s = if size v < 2 * size w then let val tmp = child v val _ = child' v := s in tmp end else s fun loop s = if Node.equals (s, n0) then () else (ancestor' s := v ; loop (child s)) val _ = loop s in () end val _ = Int.forDown (1, numNodes, fn i => let (* Compute initial values for semidominators and store nodes with * the same semidominator in the same bucket. *) val w = ndfs i val min = List.fold (preds w, sdno w, fn (n, min) => Int.min (min, sdno (eval n))) val _ = sdno' w := min val _ = List.push (bucket' (ndfs min), w) val _ = link (parent w, w) (* Compute immediate dominators for nodes in the bucket of w's * parent. *) val _ = List.foreach (bucket (parent w), fn v => let val u = eval v in idom' v := (if sdno u < sdno v then u else parent w) end) val _ = bucket' (parent w) := [] in () end) (* Adjust immediate dominators of nodes whose current version of the * immediate dominator differs from the node with the depth-first number * of the node's semidominator. *) val _ = Int.for (1, numNodes, fn i => let val w = ndfs i in if Node.equals (idom w, ndfs (sdno w)) then () else idom' w := idom (idom w) end) val _ = idom' root := root val _ = Assert.assert ("DirectedSubGraph.dominators", fn () => validDominators (graph, {root = root, idom = idom})) in {idom = idom} end fun dominatorTree (graph, {root: Node.t, nodeValue: Node.t -> 'a}): 'a Tree.t = let val {idom} = dominators (graph, {root = root}) val {get = nodeInfo, ...} = Property.get (Node.plist, Property.initFun (fn n => {children = ref [], value = nodeValue n})) val _ = foreachNode (graph, fn n => if Node.equals (n, root) then () else List.push (#children (nodeInfo (idom n)), n)) fun treeAt (n: Node.t): 'a Tree.t = let val {children, value} = nodeInfo n in Tree.T (value, Vector.fromListMap (!children, treeAt)) end in treeAt root end (*--------------------------------------------------------*) (* Loop Forest *) (*--------------------------------------------------------*) (* This is an implementation of the G. Ramalingam loop forest construction, * as described in "On Loops, Dominators, and Dominance Frontiers" * (originally in PLDI00; revised technical report at * http://www.research.ibm.com/people/r/rama/Papers/ibmtr21513.revised.ps). *) structure GraphNodeInfo = struct type t = {forestNode: Node.t} end structure ForestNodeInfo = struct type t = {parent: Node.t option, loopNodes: Node.t list} end structure SubGraphNodeInfo = struct type t = {childSubGraphNode: Node.t option ref, graphNode: Node.t} end (* loopForest : {headers: (* graph *) Node.t list -> (* graph *) Node.t list, * graph: t, * root: (* graph *) Node.t} * -> {forest: t, * graphToForest: (* graph *) Node.t -> (* forest *) Node.t, * loopNodes: (* forest *) Node.t -> (* graph *) Node.t list, * parent: (* forest *) Node.t -> (* forest *) Node.t option} * * Inputs: graph -- a rooted control flow graph * root -- the root of graph * headers -- a function mapping strongly connected components of graph * to a set of header nodes * Outputs: forest -- the loop nesting forest * "Consider any loop L. Let G_L denote the subgraph induced by * the vertices in L, but without the loopback edges of L. * The 'children' of L in the 'forest' representation are * the strongly connected components of G_L. The non-trivial * strongly connected components of G_L denote inner loops * (which become internal nodes in the 'forest' representation), * while the trivial strongly connected components of G_L * denote vertices belonging to L but not to any inner loop of L, * and these become 'leaves' of the 'forest'." * graphToForest -- maps a node in graph to it's corresponding leaf in forest * headers -- a function mapping strongly connected components of graph * to a set of header nodes; compose with loopNodes to get * the loop headers of an internal node in the forest * isHeader -- predicate indicating that the node is the header for some loop * loopNodes -- maps an internal node in the forest to a set of nodes * in graph that compose a loop * parent -- maps a node in forest to it's parent in forest *) (* fun loopForest {headers, graph, root} = let val addEdge = ignore o addEdge val {get = graphNodeInfo : Node.t -> GraphNodeInfo.t, set = setGraphNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("graphNodeInfo", Node.layout)) val forestNode = #forestNode o graphNodeInfo val {get = forestNodeInfo : Node.t -> ForestNodeInfo.t, set = setForestNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("forestNodeInfo", Node.layout)) val parent = #parent o forestNodeInfo val loopNodes = #loopNodes o forestNodeInfo val {get = nodeNesting: Node.t -> int list ref, destroy = destNodeNesting, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => ref [])) val {get = edgeNesting: Edge.t -> int list ref, destroy = destEdgeNesting, ...} = Property.destGet (Edge.plist, Property.initFun (fn _ => ref [])) val {get = getIsHeader: Node.t -> bool ref, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref false)) val F = new () val depth = ref 0 fun nodeP n = fn node => case !(nodeNesting node) of n'::_ => n' >= n | _ => false fun edgeP n = fn edge => case !(edgeNesting edge) of n'::_ => n' >= n | _ => false fun inducedGraph {graph, scc} = let val depth = !depth val headers = headers scc val _ = List.foreach(headers, fn header => getIsHeader header := true) in List.foreach (scc, fn n => (List.push(nodeNesting n, depth) ; Node.foreachSuccessor (graph, n, fn e => let val from = n val to = Edge.to (graph, e) in if List.contains(scc, to, Node.equals) andalso not (List.contains(headers, to, Node.equals)) then List.push(edgeNesting e, depth) else () end))) ; subGraph (supGraph graph, {nodeP = nodeP depth, edgeP = edgeP depth}) end fun nest {graph, parent} = List.foreach (stronglyConnectedComponents graph, fn scc => let val n' = newNode F fun default () = let val _ = setForestNodeInfo(n', {loopNodes = scc, parent = parent}) val _ = Int.inc depth val graph' = inducedGraph {graph = graph, scc = scc} val _ = nest {graph = graph', parent = SOME n'} val _ = foreachNode (graph', fn n => (Node.foreachSuccessor (graph', n, fn e => ignore(List.pop(edgeNesting e))); ignore(List.pop(nodeNesting n)))) val _ = Int.dec depth in () end fun default' n = let in setForestNodeInfo (n', {loopNodes = [n], parent = parent}) ; setGraphNodeInfo (n, {forestNode = n'}) end in case parent of NONE => () | SOME parent => addEdge (F, {from = parent, to = n'}) ; case scc of [n] => if Node.hasEdge (graph, {from = n, to = n}) then default () else default' n | scc => default () end) val depth = !depth val _ = foreachNode (graph, fn n => (List.push(nodeNesting n, depth) ; Node.foreachSuccessor (graph, n, fn e => List.push(edgeNesting e, depth)))) val graph' = subGraph (supGraph graph, {nodeP = nodeP depth, edgeP = edgeP depth}) val _ = nest {graph = graph', parent = NONE} val _ = destNodeNesting () val _ = destEdgeNesting () in {forest = F, graphToForest = forestNode, headers = headers, isHeader = ! o getIsHeader, loopNodes = loopNodes, parent = parent} end *) fun loopForest {headers, graph, root} = let val addEdge = ignore o addEdge val {get = graphNodeInfo : Node.t -> GraphNodeInfo.t, set = setGraphNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("graphNodeInfo", Node.layout)) val forestNode = #forestNode o graphNodeInfo val {get = getIsHeader : Node.t -> bool ref, set = setIsHeader, ...} = Property.getSetOnce (Node.plist, Property.initFun (fn _ => ref false)) val {get = forestNodeInfo : Node.t -> ForestNodeInfo.t, set = setForestNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("forestNodeInfo", Node.layout)) val parent = #parent o forestNodeInfo val loopNodes = #loopNodes o forestNodeInfo val {get = subGraphNodeInfo : Node.t -> SubGraphNodeInfo.t, set = setSubGraphNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("subGraphNodeInfo", Node.layout)) val childSubGraphNode = #childSubGraphNode o subGraphNodeInfo val childSubGraphNode' = ! o childSubGraphNode val childSubGraphNode'' = valOf o childSubGraphNode' val graphNode = #graphNode o subGraphNodeInfo val F = new () fun subGraph {graph, scc} = let val scc' = List.map(scc, #graphNode o subGraphNodeInfo) val headers = headers scc' val _ = List.foreach (headers, fn header => getIsHeader header := true) val graph' = new () in List.foreach (scc, fn n => let val n' = newNode graph' val {childSubGraphNode, graphNode, ...} = subGraphNodeInfo n in childSubGraphNode := SOME n' ; setSubGraphNodeInfo (n', {childSubGraphNode = ref NONE, graphNode = graphNode}) end) ; List.foreach (scc, fn n => Node.foreachSuccessor (graph, n, fn e => let val from = n val to = Edge.to (graph, e) in if List.contains (scc, to, Node.equals) andalso not (List.contains (headers, graphNode to, Node.equals)) then let val from' = childSubGraphNode'' from val to' = childSubGraphNode'' to in addEdge (graph', {from = from', to = to'}) end else () end)) ; graph' end fun nest {graph, parent} = List.foreach (stronglyConnectedComponents graph, fn scc => let val scc' = List.map(scc, graphNode) val n' = newNode F fun default () = let val graph' = subGraph {graph = graph, scc = scc} in setForestNodeInfo(n', {loopNodes = scc', parent = parent}) ; nest {graph = graph', parent = SOME n'} end fun default' n = let in setForestNodeInfo (n', {loopNodes = [graphNode n], parent = parent}) ; setGraphNodeInfo (graphNode n, {forestNode = n'}) end in case parent of NONE => () | SOME parent => addEdge (F, {from = parent, to = n'}) ; case scc of [n] => if Node.hasEdge (graph, {from = n, to = n}) then default () else default' n | scc => default () end) val graph' = let val graph' = new () val {get = nodeInfo': Node.t -> Node.t, destroy} = Property.destGet (Node.plist, Property.initFun (fn node => let val node' = newNode graph' in setSubGraphNodeInfo (node', {childSubGraphNode = ref NONE, graphNode = node}) ; node' end)) in foreachEdge (graph, fn (n, e) => let val from = n val from' = nodeInfo' from val to = Edge.to (graph, e) val to' = nodeInfo' to in addEdge(graph', {from = from', to = to'}) end) ; destroy () ; graph' end val _ = nest {graph = graph', parent = NONE} in {forest = F, graphToForest = forestNode, headers = headers, isHeader = ! o getIsHeader, loopNodes = loopNodes, parent = parent} end fun loopForestSteensgaard {graph, root} = let fun headers X = let val headers = ref [] in foreachEdge (graph, fn (n, e) => let val from = Edge.from (graph, e) val to = Edge.to (graph, e) in if List.contains(X, to, Node.equals) andalso not (List.contains(X, from, Node.equals)) then List.push(headers, to) else () end) ; List.removeDuplicates(!headers, Node.equals) end (* fun headers X = List.keepAll (X, fn node => Exn.withEscape (fn escape => (foreachEdge (graph, fn (n, e) => let val from = n val to = Edge.to (graph, e) in if Node.equals(node, to) andalso List.contains(X, to, Node.equals) andalso not (List.contains(X, from, Node.equals)) then escape true else () end); false))) *) in loopForest {headers = headers, graph = graph, root = root} end end mlton-20100608/lib/mlton/basic/dot-color.sml0000644000076600000240000006061411404435636017173 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure DotColor = struct datatype t = (* (Hue, Saturation, Brightness). All between 0 and 1. *) HSB of real * real * real | Aliceblue | Antiquewhite1 | Antiquewhite2 | Antiquewhite3 | Antiquewhite4 | Aquamarine1 | Aquamarine2 | Aquamarine3 | Aquamarine4 | Azure1 | Azure2 | Azure3 | Azure4 | Beige | Bisque1 | Bisque2 | Bisque3 | Bisque4 | Black | Blanchedalmond | Blue1 | Blue2 | Blue3 | Blue4 | Blueviolet | Brown1 | Brown2 | Brown3 | Brown4 | Burlywood1 | Burlywood2 | Burlywood3 | Burlywood4 | Cadetblue1 | Cadetblue2 | Cadetblue3 | Cadetblue4 | Chartreuse1 | Chartreuse2 | Chartreuse3 | Chartreuse4 | Chocolate1 | Chocolate2 | Chocolate3 | Chocolate4 | Coral1 | Coral2 | Coral3 | Coral4 | Corn | Cornsilk1 | Cornsilk2 | Cornsilk3 | Cornsilk4 | Crimson | Cyan1 | Cyan2 | Cyan3 | Cyan4 | Darkgoldenrod1 | Darkgoldenrod2 | Darkgoldenrod3 | Darkgoldenrod4 | Darkgreen | Darkkhaki | Darkolivegreen1 | Darkolivegreen2 | Darkolivegreen3 | Darkolivegreen4 | Darkorange1 | Darkorange2 | Darkorange3 | Darkorange4 | Darkorchid1 | Darkorchid2 | Darkorchid3 | Darkorchid4 | Darksalmon | Darkseagreen1 | Darkseagreen2 | Darkseagreen3 | Darkseagreen4 | Darkslateblue | Darkslategray1 | Darkslategray2 | Darkslategray3 | Darkslategray4 | Darkturquoise | Darkviolet | Deeppink1 | Deeppink2 | Deeppink3 | Deeppink4 | Deepskyblue1 | Deepskyblue2 | Deepskyblue3 | Deepskyblue4 | Dimgray | Dodgerblue1 | Dodgerblue2 | Dodgerblue3 | Dodgerblue4 | Forestgreen | Gainsboro | Ghostwhite | Gold1 | Gold2 | Gold3 | Gold4 | Goldenrod1 | Goldenrod2 | Goldenrod3 | Goldenrod4 | Gray | Gray0 | Gray1 | Gray2 | Gray3 | Gray4 | Gray5 | Gray6 | Gray7 | Gray8 | Gray9 | Gray10 | Gray11 | Gray12 | Gray13 | Gray14 | Gray15 | Gray16 | Gray17 | Gray18 | Gray19 | Gray20 | Gray21 | Gray22 | Gray23 | Gray24 | Gray25 | Gray26 | Gray27 | Gray28 | Gray29 | Gray30 | Gray31 | Gray32 | Gray33 | Gray34 | Gray35 | Gray36 | Gray37 | Gray38 | Gray39 | Gray40 | Gray41 | Gray42 | Gray43 | Gray44 | Gray45 | Gray46 | Gray47 | Gray48 | Gray49 | Gray50 | Gray51 | Gray52 | Gray53 | Gray54 | Gray55 | Gray56 | Gray57 | Gray58 | Gray59 | Gray60 | Gray61 | Gray62 | Gray63 | Gray64 | Gray65 | Gray66 | Gray67 | Gray68 | Gray69 | Gray70 | Gray71 | Gray72 | Gray73 | Gray74 | Gray75 | Gray76 | Gray77 | Gray78 | Gray79 | Gray80 | Gray81 | Gray82 | Gray83 | Gray84 | Gray85 | Gray86 | Gray87 | Gray88 | Gray89 | Gray90 | Gray91 | Gray92 | Gray93 | Gray94 | Gray95 | Gray96 | Gray97 | Gray98 | Gray99 | Gray100 | Green1 | Green2 | Green3 | Green4 | Greenyellow | Honeydew1 | Honeydew2 | Honeydew3 | Honeydew4 | Hotpink1 | Hotpink2 | Hotpink3 | Hotpink4 | Indianred1 | Indianred2 | Indianred3 | Indianred4 | Indigo | Ivory1 | Ivory2 | Ivory3 | Ivory4 | Khaki1 | Khaki2 | Khaki3 | Khaki4 | Lavender | Lavenderblush1 | Lavenderblush2 | Lavenderblush3 | Lavenderblush4 | Lawngreen | Lemonchi | Lightblue1 | Lightblue2 | Lightblue3 | Lightblue4 | Lightcyan1 | Lightcyan2 | Lightcyan3 | Lightcyan4 | Lightgoldenrod1 | Lightgoldenrod2 | Lightgoldenrod3 | Lightgoldenrod4 | Lightgoldenrodyellow | Lightgray | Lightpink1 | Lightpink2 | Lightpink3 | Lightpink4 | Lightsalmon1 | Lightsalmon2 | Lightsalmon3 | Lightsalmon4 | Lightseagreen | Lightskyblue1 | Lightskyblue2 | Lightskyblue3 | Lightskyblue4 | Lightslateblue1 | Lightslateblue2 | Lightslateblue3 | Lightslateblue4 | Lightslategray | Lightyellow1 | Lightyellow2 | Lightyellow3 | Lightyellow4 | Limegreen | Linen | Magenta1 | Magenta2 | Magenta3 | Magenta4 | Maroon1 | Maroon2 | Maroon3 | Maroon4 | Mediumaquamarine | Mediumblue | Mediumorchid1 | Mediumorchid2 | Mediumorchid3 | Mediumorchid4 | Mediumpurple1 | Mediumpurple2 | Mediumpurple3 | Mediumpurple4 | Mediumseagreen | Mediumslateblue | Mediumspringgreen | Mediumturquoise | Mediumvioletred | Midnightblue | Mintcream | Mistyrose1 | Mistyrose2 | Mistyrose3 | Mistyrose4 | Moccasin | Navajowhite1 | Navajowhite2 | Navajowhite3 | Navajowhite4 | Navy | Navyblue | Oldlace | Olivedrab1 | Olivedrab2 | Olivedrab3 | Olivedrab4 | On1 | On2 | On3 | On4 | Oralwhite | Orange1 | Orange2 | Orange3 | Orange4 | Orangered1 | Orangered2 | Orangered3 | Orangered4 | Orchid1 | Orchid2 | Orchid3 | Orchid4 | Owerblue | Palegoldenrod | Palegreen1 | Palegreen2 | Palegreen3 | Palegreen4 | Paleturquoise1 | Paleturquoise2 | Paleturquoise3 | Paleturquoise4 | Palevioletred1 | Palevioletred2 | Palevioletred3 | Palevioletred4 | Papayawhip | Peachpu1 | Peachpu2 | Peachpu3 | Peachpu4 | Peru | Pink1 | Pink2 | Pink3 | Pink4 | Plum1 | Plum2 | Plum3 | Plum4 | Powderblue | Purple1 | Purple2 | Purple3 | Purple4 | Rebrick1 | Rebrick2 | Rebrick3 | Rebrick4 | Red1 | Red2 | Red3 | Red4 | Rosybrown1 | Rosybrown2 | Rosybrown3 | Rosybrown4 | Royalblue1 | Royalblue2 | Royalblue3 | Royalblue4 | Saddlebrown | Salmon1 | Salmon2 | Salmon3 | Salmon4 | Sandybrown | Seagreen1 | Seagreen2 | Seagreen3 | Seagreen4 | Seashell1 | Seashell2 | Seashell3 | Seashell4 | Sienna1 | Sienna2 | Sienna3 | Sienna4 | Skyblue1 | Skyblue2 | Skyblue3 | Skyblue4 | Slateblue1 | Slateblue2 | Slateblue3 | Slateblue4 | Slategray1 | Slategray2 | Slategray3 | Slategray4 | Snow1 | Snow2 | Snow3 | Snow4 | Springgreen1 | Springgreen2 | Springgreen3 | Springgreen4 | Steelblue1 | Steelblue2 | Steelblue3 | Steelblue4 | Tan1 | Tan2 | Tan3 | Tan4 | Thistle1 | Thistle2 | Thistle3 | Thistle4 | Tomato1 | Tomato2 | Tomato3 | Tomato4 | Turquoise1 | Turquoise2 | Turquoise3 | Turquoise4 | Violet | Violetred1 | Violetred2 | Violetred3 | Violetred4 | Wheat1 | Wheat2 | Wheat3 | Wheat4 | White | Whitesmoke | Yellow1 | Yellow2 | Yellow3 | Yellow4 | Yellowgreen val grays = Vector.fromList [Gray0, Gray1, Gray2, Gray3, Gray4, Gray5, Gray6, Gray7, Gray8, Gray9, Gray10, Gray11, Gray12, Gray13, Gray14, Gray15, Gray16, Gray17, Gray18, Gray19, Gray20, Gray21, Gray22, Gray23, Gray24, Gray25, Gray26, Gray27, Gray28, Gray29, Gray30, Gray31, Gray32, Gray33, Gray34, Gray35, Gray36, Gray37, Gray38, Gray39, Gray40, Gray41, Gray42, Gray43, Gray44, Gray45, Gray46, Gray47, Gray48, Gray49, Gray50, Gray51, Gray52, Gray53, Gray54, Gray55, Gray56, Gray57, Gray58, Gray59, Gray60, Gray61, Gray62, Gray63, Gray64, Gray65, Gray66, Gray67, Gray68, Gray69, Gray70, Gray71, Gray72, Gray73, Gray74, Gray75, Gray76, Gray77, Gray78, Gray79, Gray80, Gray81, Gray82, Gray83, Gray84, Gray85, Gray86, Gray87, Gray88, Gray89, Gray90, Gray91, Gray92, Gray93, Gray94, Gray95, Gray96, Gray97, Gray98, Gray99, Gray100] fun gray i = if 0 <= i andalso i < Vector.length grays then Vector.sub (grays, i) else Error.bug "Dot.gray" fun realToString x = Real.format (x, Real.Format.fix (SOME 2)) val toString = fn HSB (h, s, b) => concat [realToString h, " ", realToString s, " ", realToString b] | Aliceblue => "Aliceblue" | Antiquewhite1 => "Antiquewhite1" | Antiquewhite2 => "Antiquewhite2" | Antiquewhite3 => "Antiquewhite3" | Antiquewhite4 => "Antiquewhite4" | Aquamarine1 => "Aquamarine1" | Aquamarine2 => "Aquamarine2" | Aquamarine3 => "Aquamarine3" | Aquamarine4 => "Aquamarine4" | Azure1 => "Azure1" | Azure2 => "Azure2" | Azure3 => "Azure3" | Azure4 => "Azure4" | Beige => "Beige" | Bisque1 => "Bisque1" | Bisque2 => "Bisque2" | Bisque3 => "Bisque3" | Bisque4 => "Bisque4" | Black => "Black" | Blanchedalmond => "Blanchedalmond" | Blue1 => "Blue1" | Blue2 => "Blue2" | Blue3 => "Blue3" | Blue4 => "Blue4" | Blueviolet => "Blueviolet" | Brown1 => "Brown1" | Brown2 => "Brown2" | Brown3 => "Brown3" | Brown4 => "Brown4" | Burlywood1 => "Burlywood1" | Burlywood2 => "Burlywood2" | Burlywood3 => "Burlywood3" | Burlywood4 => "Burlywood4" | Cadetblue1 => "Cadetblue1" | Cadetblue2 => "Cadetblue2" | Cadetblue3 => "Cadetblue3" | Cadetblue4 => "Cadetblue4" | Chartreuse1 => "Chartreuse1" | Chartreuse2 => "Chartreuse2" | Chartreuse3 => "Chartreuse3" | Chartreuse4 => "Chartreuse4" | Chocolate1 => "Chocolate1" | Chocolate2 => "Chocolate2" | Chocolate3 => "Chocolate3" | Chocolate4 => "Chocolate4" | Coral1 => "Coral1" | Coral2 => "Coral2" | Coral3 => "Coral3" | Coral4 => "Coral4" | Corn => "Corn" | Cornsilk1 => "Cornsilk1" | Cornsilk2 => "Cornsilk2" | Cornsilk3 => "Cornsilk3" | Cornsilk4 => "Cornsilk4" | Crimson => "Crimson" | Cyan1 => "Cyan1" | Cyan2 => "Cyan2" | Cyan3 => "Cyan3" | Cyan4 => "Cyan4" | Darkgoldenrod1 => "Darkgoldenrod1" | Darkgoldenrod2 => "Darkgoldenrod2" | Darkgoldenrod3 => "Darkgoldenrod3" | Darkgoldenrod4 => "Darkgoldenrod4" | Darkgreen => "Darkgreen" | Darkkhaki => "Darkkhaki" | Darkolivegreen1 => "Darkolivegreen1" | Darkolivegreen2 => "Darkolivegreen2" | Darkolivegreen3 => "Darkolivegreen3" | Darkolivegreen4 => "Darkolivegreen4" | Darkorange1 => "Darkorange1" | Darkorange2 => "Darkorange2" | Darkorange3 => "Darkorange3" | Darkorange4 => "Darkorange4" | Darkorchid1 => "Darkorchid1" | Darkorchid2 => "Darkorchid2" | Darkorchid3 => "Darkorchid3" | Darkorchid4 => "Darkorchid4" | Darksalmon => "Darksalmon" | Darkseagreen1 => "Darkseagreen1" | Darkseagreen2 => "Darkseagreen2" | Darkseagreen3 => "Darkseagreen3" | Darkseagreen4 => "Darkseagreen4" | Darkslateblue => "Darkslateblue" | Darkslategray1 => "Darkslategray1" | Darkslategray2 => "Darkslategray2" | Darkslategray3 => "Darkslategray3" | Darkslategray4 => "Darkslategray4" | Darkturquoise => "Darkturquoise" | Darkviolet => "Darkviolet" | Deeppink1 => "Deeppink1" | Deeppink2 => "Deeppink2" | Deeppink3 => "Deeppink3" | Deeppink4 => "Deeppink4" | Deepskyblue1 => "Deepskyblue1" | Deepskyblue2 => "Deepskyblue2" | Deepskyblue3 => "Deepskyblue3" | Deepskyblue4 => "Deepskyblue4" | Dimgray => "Dimgray" | Dodgerblue1 => "Dodgerblue1" | Dodgerblue2 => "Dodgerblue2" | Dodgerblue3 => "Dodgerblue3" | Dodgerblue4 => "Dodgerblue4" | Forestgreen => "Forestgreen" | Gainsboro => "Gainsboro" | Ghostwhite => "Ghostwhite" | Gold1 => "Gold1" | Gold2 => "Gold2" | Gold3 => "Gold3" | Gold4 => "Gold4" | Goldenrod1 => "Goldenrod1" | Goldenrod2 => "Goldenrod2" | Goldenrod3 => "Goldenrod3" | Goldenrod4 => "Goldenrod4" | Gray => "Gray" | Gray0 => "Gray0" | Gray1 => "Gray1" | Gray2 => "Gray2" | Gray3 => "Gray3" | Gray4 => "Gray4" | Gray5 => "Gray5" | Gray6 => "Gray6" | Gray7 => "Gray7" | Gray8 => "Gray8" | Gray9 => "Gray9" | Gray10 => "Gray10" | Gray11 => "Gray11" | Gray12 => "Gray12" | Gray13 => "Gray13" | Gray14 => "Gray14" | Gray15 => "Gray15" | Gray16 => "Gray16" | Gray17 => "Gray17" | Gray18 => "Gray18" | Gray19 => "Gray19" | Gray20 => "Gray20" | Gray21 => "Gray21" | Gray22 => "Gray22" | Gray23 => "Gray23" | Gray24 => "Gray24" | Gray25 => "Gray25" | Gray26 => "Gray26" | Gray27 => "Gray27" | Gray28 => "Gray28" | Gray29 => "Gray29" | Gray30 => "Gray30" | Gray31 => "Gray31" | Gray32 => "Gray32" | Gray33 => "Gray33" | Gray34 => "Gray34" | Gray35 => "Gray35" | Gray36 => "Gray36" | Gray37 => "Gray37" | Gray38 => "Gray38" | Gray39 => "Gray39" | Gray40 => "Gray40" | Gray41 => "Gray41" | Gray42 => "Gray42" | Gray43 => "Gray43" | Gray44 => "Gray44" | Gray45 => "Gray45" | Gray46 => "Gray46" | Gray47 => "Gray47" | Gray48 => "Gray48" | Gray49 => "Gray49" | Gray50 => "Gray50" | Gray51 => "Gray51" | Gray52 => "Gray52" | Gray53 => "Gray53" | Gray54 => "Gray54" | Gray55 => "Gray55" | Gray56 => "Gray56" | Gray57 => "Gray57" | Gray58 => "Gray58" | Gray59 => "Gray59" | Gray60 => "Gray60" | Gray61 => "Gray61" | Gray62 => "Gray62" | Gray63 => "Gray63" | Gray64 => "Gray64" | Gray65 => "Gray65" | Gray66 => "Gray66" | Gray67 => "Gray67" | Gray68 => "Gray68" | Gray69 => "Gray69" | Gray70 => "Gray70" | Gray71 => "Gray71" | Gray72 => "Gray72" | Gray73 => "Gray73" | Gray74 => "Gray74" | Gray75 => "Gray75" | Gray76 => "Gray76" | Gray77 => "Gray77" | Gray78 => "Gray78" | Gray79 => "Gray79" | Gray80 => "Gray80" | Gray81 => "Gray81" | Gray82 => "Gray82" | Gray83 => "Gray83" | Gray84 => "Gray84" | Gray85 => "Gray85" | Gray86 => "Gray86" | Gray87 => "Gray87" | Gray88 => "Gray88" | Gray89 => "Gray89" | Gray90 => "Gray90" | Gray91 => "Gray91" | Gray92 => "Gray92" | Gray93 => "Gray93" | Gray94 => "Gray94" | Gray95 => "Gray95" | Gray96 => "Gray96" | Gray97 => "Gray97" | Gray98 => "Gray98" | Gray99 => "Gray99" | Gray100 => "Gray100" | Green1 => "Green1" | Green2 => "Green2" | Green3 => "Green3" | Green4 => "Green4" | Greenyellow => "Greenyellow" | Honeydew1 => "Honeydew1" | Honeydew2 => "Honeydew2" | Honeydew3 => "Honeydew3" | Honeydew4 => "Honeydew4" | Hotpink1 => "Hotpink1" | Hotpink2 => "Hotpink2" | Hotpink3 => "Hotpink3" | Hotpink4 => "Hotpink4" | Indianred1 => "Indianred1" | Indianred2 => "Indianred2" | Indianred3 => "Indianred3" | Indianred4 => "Indianred4" | Indigo => "Indigo" | Ivory1 => "Ivory1" | Ivory2 => "Ivory2" | Ivory3 => "Ivory3" | Ivory4 => "Ivory4" | Khaki1 => "Khaki1" | Khaki2 => "Khaki2" | Khaki3 => "Khaki3" | Khaki4 => "Khaki4" | Lavender => "Lavender" | Lavenderblush1 => "Lavenderblush1" | Lavenderblush2 => "Lavenderblush2" | Lavenderblush3 => "Lavenderblush3" | Lavenderblush4 => "Lavenderblush4" | Lawngreen => "Lawngreen" | Lemonchi => "Lemonchi" | Lightblue1 => "Lightblue1" | Lightblue2 => "Lightblue2" | Lightblue3 => "Lightblue3" | Lightblue4 => "Lightblue4" | Lightcyan1 => "Lightcyan1" | Lightcyan2 => "Lightcyan2" | Lightcyan3 => "Lightcyan3" | Lightcyan4 => "Lightcyan4" | Lightgoldenrod1 => "Lightgoldenrod1" | Lightgoldenrod2 => "Lightgoldenrod2" | Lightgoldenrod3 => "Lightgoldenrod3" | Lightgoldenrod4 => "Lightgoldenrod4" | Lightgoldenrodyellow => "Lightgoldenrodyellow" | Lightgray => "Lightgray" | Lightpink1 => "Lightpink1" | Lightpink2 => "Lightpink2" | Lightpink3 => "Lightpink3" | Lightpink4 => "Lightpink4" | Lightsalmon1 => "Lightsalmon1" | Lightsalmon2 => "Lightsalmon2" | Lightsalmon3 => "Lightsalmon3" | Lightsalmon4 => "Lightsalmon4" | Lightseagreen => "Lightseagreen" | Lightskyblue1 => "Lightskyblue1" | Lightskyblue2 => "Lightskyblue2" | Lightskyblue3 => "Lightskyblue3" | Lightskyblue4 => "Lightskyblue4" | Lightslateblue1 => "Lightslateblue1" | Lightslateblue2 => "Lightslateblue2" | Lightslateblue3 => "Lightslateblue3" | Lightslateblue4 => "Lightslateblue4" | Lightslategray => "Lightslategray" | Lightyellow1 => "Lightyellow1" | Lightyellow2 => "Lightyellow2" | Lightyellow3 => "Lightyellow3" | Lightyellow4 => "Lightyellow4" | Limegreen => "Limegreen" | Linen => "Linen" | Magenta1 => "Magenta1" | Magenta2 => "Magenta2" | Magenta3 => "Magenta3" | Magenta4 => "Magenta4" | Maroon1 => "Maroon1" | Maroon2 => "Maroon2" | Maroon3 => "Maroon3" | Maroon4 => "Maroon4" | Mediumaquamarine => "Mediumaquamarine" | Mediumblue => "Mediumblue" | Mediumorchid1 => "Mediumorchid1" | Mediumorchid2 => "Mediumorchid2" | Mediumorchid3 => "Mediumorchid3" | Mediumorchid4 => "Mediumorchid4" | Mediumpurple1 => "Mediumpurple1" | Mediumpurple2 => "Mediumpurple2" | Mediumpurple3 => "Mediumpurple3" | Mediumpurple4 => "Mediumpurple4" | Mediumseagreen => "Mediumseagreen" | Mediumslateblue => "Mediumslateblue" | Mediumspringgreen => "Mediumspringgreen" | Mediumturquoise => "Mediumturquoise" | Mediumvioletred => "Mediumvioletred" | Midnightblue => "Midnightblue" | Mintcream => "Mintcream" | Mistyrose1 => "Mistyrose1" | Mistyrose2 => "Mistyrose2" | Mistyrose3 => "Mistyrose3" | Mistyrose4 => "Mistyrose4" | Moccasin => "Moccasin" | Navajowhite1 => "Navajowhite1" | Navajowhite2 => "Navajowhite2" | Navajowhite3 => "Navajowhite3" | Navajowhite4 => "Navajowhite4" | Navy => "Navy" | Navyblue => "Navyblue" | Oldlace => "Oldlace" | Olivedrab1 => "Olivedrab1" | Olivedrab2 => "Olivedrab2" | Olivedrab3 => "Olivedrab3" | Olivedrab4 => "Olivedrab4" | On1 => "On1" | On2 => "On2" | On3 => "On3" | On4 => "On4" | Oralwhite => "Oralwhite" | Orange1 => "Orange1" | Orange2 => "Orange2" | Orange3 => "Orange3" | Orange4 => "Orange4" | Orangered1 => "Orangered1" | Orangered2 => "Orangered2" | Orangered3 => "Orangered3" | Orangered4 => "Orangered4" | Orchid1 => "Orchid1" | Orchid2 => "Orchid2" | Orchid3 => "Orchid3" | Orchid4 => "Orchid4" | Owerblue => "Owerblue" | Palegoldenrod => "Palegoldenrod" | Palegreen1 => "Palegreen1" | Palegreen2 => "Palegreen2" | Palegreen3 => "Palegreen3" | Palegreen4 => "Palegreen4" | Paleturquoise1 => "Paleturquoise1" | Paleturquoise2 => "Paleturquoise2" | Paleturquoise3 => "Paleturquoise3" | Paleturquoise4 => "Paleturquoise4" | Palevioletred1 => "Palevioletred1" | Palevioletred2 => "Palevioletred2" | Palevioletred3 => "Palevioletred3" | Palevioletred4 => "Palevioletred4" | Papayawhip => "Papayawhip" | Peachpu1 => "Peachpu1" | Peachpu2 => "Peachpu2" | Peachpu3 => "Peachpu3" | Peachpu4 => "Peachpu4" | Peru => "Peru" | Pink1 => "Pink1" | Pink2 => "Pink2" | Pink3 => "Pink3" | Pink4 => "Pink4" | Plum1 => "Plum1" | Plum2 => "Plum2" | Plum3 => "Plum3" | Plum4 => "Plum4" | Powderblue => "Powderblue" | Purple1 => "Purple1" | Purple2 => "Purple2" | Purple3 => "Purple3" | Purple4 => "Purple4" | Rebrick1 => "Rebrick1" | Rebrick2 => "Rebrick2" | Rebrick3 => "Rebrick3" | Rebrick4 => "Rebrick4" | Red1 => "Red1" | Red2 => "Red2" | Red3 => "Red3" | Red4 => "Red4" | Rosybrown1 => "Rosybrown1" | Rosybrown2 => "Rosybrown2" | Rosybrown3 => "Rosybrown3" | Rosybrown4 => "Rosybrown4" | Royalblue1 => "Royalblue1" | Royalblue2 => "Royalblue2" | Royalblue3 => "Royalblue3" | Royalblue4 => "Royalblue4" | Saddlebrown => "Saddlebrown" | Salmon1 => "Salmon1" | Salmon2 => "Salmon2" | Salmon3 => "Salmon3" | Salmon4 => "Salmon4" | Sandybrown => "Sandybrown" | Seagreen1 => "Seagreen1" | Seagreen2 => "Seagreen2" | Seagreen3 => "Seagreen3" | Seagreen4 => "Seagreen4" | Seashell1 => "Seashell1" | Seashell2 => "Seashell2" | Seashell3 => "Seashell3" | Seashell4 => "Seashell4" | Sienna1 => "Sienna1" | Sienna2 => "Sienna2" | Sienna3 => "Sienna3" | Sienna4 => "Sienna4" | Skyblue1 => "Skyblue1" | Skyblue2 => "Skyblue2" | Skyblue3 => "Skyblue3" | Skyblue4 => "Skyblue4" | Slateblue1 => "Slateblue1" | Slateblue2 => "Slateblue2" | Slateblue3 => "Slateblue3" | Slateblue4 => "Slateblue4" | Slategray1 => "Slategray1" | Slategray2 => "Slategray2" | Slategray3 => "Slategray3" | Slategray4 => "Slategray4" | Snow1 => "Snow1" | Snow2 => "Snow2" | Snow3 => "Snow3" | Snow4 => "Snow4" | Springgreen1 => "Springgreen1" | Springgreen2 => "Springgreen2" | Springgreen3 => "Springgreen3" | Springgreen4 => "Springgreen4" | Steelblue1 => "Steelblue1" | Steelblue2 => "Steelblue2" | Steelblue3 => "Steelblue3" | Steelblue4 => "Steelblue4" | Tan1 => "Tan1" | Tan2 => "Tan2" | Tan3 => "Tan3" | Tan4 => "Tan4" | Thistle1 => "Thistle1" | Thistle2 => "Thistle2" | Thistle3 => "Thistle3" | Thistle4 => "Thistle4" | Tomato1 => "Tomato1" | Tomato2 => "Tomato2" | Tomato3 => "Tomato3" | Tomato4 => "Tomato4" | Turquoise1 => "Turquoise1" | Turquoise2 => "Turquoise2" | Turquoise3 => "Turquoise3" | Turquoise4 => "Turquoise4" | Violet => "Violet" | Violetred1 => "Violetred1" | Violetred2 => "Violetred2" | Violetred3 => "Violetred3" | Violetred4 => "Violetred4" | Wheat1 => "Wheat1" | Wheat2 => "Wheat2" | Wheat3 => "Wheat3" | Wheat4 => "Wheat4" | White => "White" | Whitesmoke => "Whitesmoke" | Yellow1 => "Yellow1" | Yellow2 => "Yellow2" | Yellow3 => "Yellow3" | Yellow4 => "Yellow4" | Yellowgreen => "Yellowgreen" end mlton-20100608/lib/mlton/basic/dot.sig0000644000076600000240000000731711404435636016047 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DOT = sig datatype color = datatype DotColor.t datatype direction = Backward | Both | Forward | None datatype fontFamily = Courier | Helvetica | Symbol | Times datatype fontWeight = Bold | Italic | Roman type fontName = fontFamily * fontWeight datatype justify = Center | Left | Right datatype orientation = Landscape | Portrait datatype polygonOption = Distortion of real (* -1.0 <= r <= 1.0 *) | Orientation of int (* 0 <= i <= 360. Clockwise rotation from * X axis in degrees. *) | Peripheries of int | Skew of real (* -1.0 <= r <= 1.0 *) datatype rank = Max | Min | Same datatype rankDir = LeftToRight | TopToBottom datatype ratio = Auto | Compress | Fill | WidthOverHeight of real datatype shape = Box | Circle | Diamond | Ellipse | Plaintext | Polygon of {sides: int, options: polygonOption list} datatype style = BoldStyle | Dashed | Dotted | Filled | Invisible | Solid structure EdgeOption: sig datatype t = Color of color | Decorate of bool (* connect edge label to edge *) | Dir of direction | FontColor of color | FontName of fontName | FontSize of int (* points *) | Label of (string * justify) list | Minlen of int | Style of style | Weight of int val label: string -> t (* label s = Label (s, Center) *) end structure NodeOption: sig datatype t = Color of color | FontColor of color | FontName of fontName | FontSize of int (* points *) | Height of real (* inches *) | Label of (string * justify) list | Shape of shape | Width of real (* inches *) val label: string -> t (* label s = Label (s, Center) *) end structure GraphOption: sig datatype t = Center of bool | Color of color (* *) | Concentrate of bool | FontColor of color | FontName of fontName | FontSize of int (* points *) | Label of string | Margin of real * real (* inches *) | Mclimit of real (* mincross iterations multiplier *) | NodeSep of real (* inches *) | Nslimit of int (* network simplex limit *) | Orientation of orientation | Page of {height: real, width: real} (* inches *) | Rank of rank * {nodeName: string} list | RankDir of rankDir | RankSep of real (* inches *) | Ratio of ratio | Size of {height: real, width: real} (* inches *) end val layout: {nodes: {name: string, options: NodeOption.t list, successors: {name: string, options: EdgeOption.t list} list } list, options: GraphOption.t list, title: string} -> Layout.t end mlton-20100608/lib/mlton/basic/dot.sml0000644000076600000240000002140411404435636016051 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Dot: DOT = struct fun escapeString s = String.translate (s, fn c => if Char.isPrint c then (case c of #"\"" => "\\\"" | #"\\" => "\\\\\\\\" | _ => Char.toString c) else case c of #"\n" => "\\\\\\\\n" | #"\t" => "\\\\\\\\t" | c => concat ["\\\\\\\\", Int.format (Char.ord c, StringCvt.OCT)]) val dquote = "\"" fun quote s = concat [dquote, s, dquote] fun lab (name, value) = concat [name, " = ", quote value] fun optionsToString (opts: 'a list, toString: 'a -> string, sep): string = concat (List.separate (List.map (opts, toString), concat [sep, " "])) fun layoutOptions z = Layout.str (optionsToString z) val boolToString = Bool.toString val intToString = Int.toString val realToString = DotColor.realToString fun real2ToString (x, y) = concat [realToString x, ", ", realToString y] structure Color = DotColor datatype color = datatype Color.t datatype direction = Backward | Both | Forward | None val directionToString = fn Backward => "backward" | Both => "both" | Forward => "forward" | None => "none" datatype fontFamily = Courier | Helvetica | Symbol | Times val fontFamilyToString = fn Courier => "Courier" | Helvetica => "Helvetica" | Symbol => "Symbol" | Times => "Times" datatype fontWeight = Bold | Italic | Roman val fontWeightToString = fn Bold => "Bold" | Italic => "Italic" | Roman => "Roman" type fontName = fontFamily * fontWeight fun fontNameToString (f, w) = concat [fontFamilyToString f, "-", fontWeightToString w] datatype justify = Center | Left | Right val justifyToString = fn Center => "\\n" | Left => "\\l" | Right => "\\r" datatype orientation = Landscape | Portrait val orientationToString = fn Landscape => "landscape" | Portrait => "portrait" datatype polygonOption = Distortion of real | Orientation of int | Peripheries of int | Skew of real fun polygonOptionToString opt = lab (case opt of Distortion r => ("distortion", realToString r) | Orientation i => ("orientation", intToString i) | Peripheries p => ("peripheries", intToString p) | Skew s => ("skew", realToString s)) datatype rank = Max | Min | Same val rankToString = fn Max => "max" | Min => "min" | Same => "same" datatype rankDir = LeftToRight | TopToBottom val rankDirToString = fn LeftToRight => "LR" | TopToBottom => "TB" datatype ratio = Auto | Compress | Fill | WidthOverHeight of real val ratioToString = fn Auto => "auto" | Compress => "compress" | Fill => "fill" | WidthOverHeight r => realToString r datatype shape = Box | Circle | Diamond | Ellipse | Plaintext | Polygon of {sides: int, options: polygonOption list} val shapeToString = fn Box => "box" | Circle => "circle" | Diamond => "diamond" | Ellipse => "ellipse" | Plaintext => "plaintext" | Polygon {sides, options} => concat ["polygon, ", lab ("sides", intToString sides), case options of [] => "" | _ => concat [", ", optionsToString (options, polygonOptionToString, ",")]] datatype style = BoldStyle | Dashed | Dotted | Filled | Invisible | Solid val styleToString = fn BoldStyle => "bold" | Dashed => "dashed" | Dotted => "dotted" | Filled => "filled" | Invisible => "invisible" | Solid => "solid" fun labelToString (l: (string * justify) list): string = concat (List.concatMap (l, fn (s, j) => [escapeString s, justifyToString j])) structure EdgeOption = struct datatype t = Color of color | Decorate of bool (* connect edge label to edge *) | Dir of direction | FontColor of color | FontName of fontName | FontSize of int (* points *) | Label of (string * justify) list | Minlen of int | Style of style | Weight of int fun label s = Label [(s, Center)] fun toString opt = lab (case opt of Color c => ("color", Color.toString c) | Decorate d => ("decorate", boolToString d) | Dir d => ("dir", directionToString d) | FontColor c => ("fontcolor", Color.toString c) | FontName n => ("fontname", fontNameToString n) | FontSize s => ("fontsize", intToString s) | Label l => ("label", labelToString l) | Minlen n => ("minlen", intToString n) | Style s => ("style", styleToString s) | Weight n => ("weight", intToString n)) end structure NodeOption = struct datatype t = Color of color | FontColor of color | FontName of fontName | FontSize of int (* points *) | Height of real (* inches *) | Label of (string * justify) list | Shape of shape | Width of real (* inches *) fun label s = Label [(s, Center)] fun toString opt = lab (case opt of Color c => ("color", Color.toString c) | FontColor c => ("fontcolor", Color.toString c) | FontName n => ("fontname", fontNameToString n) | FontSize s => ("fontsize", intToString s) | Height r => ("height", realToString r) | Label l => ("label", labelToString l) | Shape s => ("shape", shapeToString s) | Width r => ("width", realToString r)) end structure GraphOption = struct datatype t = Center of bool | Color of color (* *) | Concentrate of bool | FontColor of color | FontName of fontName | FontSize of int (* points *) | Label of string | Margin of real * real (* inches *) | Mclimit of real (* mincross iterations multiplier *) | NodeSep of real (* inches *) | Nslimit of int | Orientation of orientation | Page of {height: real, width: real} (* inches *) | Rank of rank * {nodeName: string} list | RankDir of rankDir | RankSep of real (* inches *) | Ratio of ratio | Size of {height: real, width: real} (* inches *) fun toString opt = case opt of Center x => lab ("center", boolToString x) | Color x => lab ("color", Color.toString x) | Concentrate x => lab ("concentrate", boolToString x) | FontColor x => lab ("fontcolor", Color.toString x) | FontName x => lab ("fontname", fontNameToString x) | FontSize x => lab ("fontsize", intToString x) | Label x => lab ("label", escapeString x) | Margin x => lab ("margin", real2ToString x) | Mclimit x => lab ("mclimit", realToString x) | NodeSep x => lab ("nodesep", realToString x) | Nslimit n => lab ("nslimit", intToString n) | Orientation x => lab ("orientation", orientationToString x) | Page {height, width} => lab ("page", real2ToString (width, height)) | RankDir x => lab ("rankdir", rankDirToString x) | Rank (r, ns) => concat ["{ ", lab ("rank ", rankToString r), "; ", concat (List.revMap (ns, fn {nodeName} => concat [nodeName, " "])), "}"] | RankSep x => lab ("ranksep", realToString x) | Ratio x => lab ("ratio", ratioToString x) | Size {height, width} => lab ("size", real2ToString (width, height)) end fun layout {options, nodes, title: string} = let open Layout in align [str (concat ["digraph \"", title, "\" {"]), layoutOptions (GraphOption.Label title :: options, GraphOption.toString, ";"), align (List.revMap (nodes, fn {name = from, options, successors} => align [seq [str from, str " [", layoutOptions (options, NodeOption.toString, ","), str "]"], align (List.revMap (successors, fn {name = to, options} => seq [str (concat [from, " -> ", to, " ["]), layoutOptions (options, EdgeOption.toString, ","), str "]"]))])), str "}"] end end mlton-20100608/lib/mlton/basic/doubly-linked.fun0000644000076600000240000000176711404435636020034 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor DoublyLinked(S: DOUBLY_LINKED_STRUCTS): DOUBLY_LINKED = struct open S fun prevp d = #1(destruct d) fun prev d = Pointer.!(prevp d) fun setPrev(d,d') = Pointer.:=(prevp d,d') fun value d = #2(destruct d) fun nextp d = #3(destruct d) fun next d = Pointer.!(nextp d) fun setNext(d,d') = Pointer.:=(nextp d,d') fun link(d, d') = (setNext(d, d') ; setPrev(d',d)) fun insertL(d, d') = (if Pointer.isNull(prevp d') then () else link(prev d',d) ; link(d,d')) fun insertR(d, d') = (if Pointer.isNull(nextp d) then () else link(d',next d) ; link(d, d')) fun unlink d = (link(prev d,next d) ; Pointer.clear(prevp d) ; Pointer.clear(nextp d)) fun isLinked d = not(Pointer.isNull(prevp d) orelse Pointer.isNull(nextp d)) fun eqPrev(d, d') = Pointer.eq(prevp d, prevp d') end mlton-20100608/lib/mlton/basic/doubly-linked.sig0000644000076600000240000000154511404435636020020 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DOUBLY_LINKED_STRUCTS = sig type 'a t val destruct : 'a t -> 'a t Pointer.t * 'a * 'a t Pointer.t end signature DOUBLY_LINKED = sig include DOUBLY_LINKED_STRUCTS val eqPrev: 'a t * 'a t -> bool val insertL: 'a t * 'a t -> unit val insertR: 'a t * 'a t -> unit val isLinked: 'a t -> bool val link: 'a t * 'a t -> unit val next: 'a t -> 'a t val nextp: 'a t -> 'a t Pointer.t val prev: 'a t -> 'a t val prevp: 'a t -> 'a t Pointer.t val setPrev: 'a t * 'a t -> unit val setNext: 'a t * 'a t -> unit val unlink: 'a t -> unit val value: 'a t -> 'a end mlton-20100608/lib/mlton/basic/dynamic-wind.sig0000644000076600000240000000104311404435636017632 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DYNAMIC_WIND = sig (* wind(f, g) returns f(), and computes g() when f finishes or raises *) val wind: (unit -> 'a) * (unit -> unit) -> 'a (* windFail(f, g) returns f(), and computes g() only if f raises *) val windFail: (unit -> 'a) * (unit -> unit) -> 'a val withEscape: (('a -> 'b) -> 'a) -> 'a end mlton-20100608/lib/mlton/basic/dynamic-wind.sml0000644000076600000240000000040511404435636017644 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure DynamicWind: DYNAMIC_WIND = struct yes end mlton-20100608/lib/mlton/basic/engine.sig0000644000076600000240000000116211404435636016516 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ENGINE = sig type 'a t datatype 'a res = Done of 'a | Raise of exn | TimeOut of 'a t val new: (unit -> 'a) -> 'a t val repeat: {thunk: unit -> 'a, limit: Time.t, tries: int} -> 'a option val run: 'a t * Time.t -> 'a res val timeLimit: Time.t * (unit -> 'a) -> 'a option end mlton-20100608/lib/mlton/basic/engine.sml0000644000076600000240000000422311404435636016530 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Engine: ENGINE = struct datatype 'a t = T of {return: 'a res Thread.t option ref, thread: Thread.Runnable.t} and 'a res = Done of 'a | Raise of exn | TimeOut of 'a t val which = Itimer.Real val signal = Itimer.signal which fun done (return): unit = (return := NONE ; Itimer.set (which, {value = Time.zero, interval = Time.zero}) ; Signal.setHandler (signal, Signal.Handler.default)) fun new (f: unit -> 'a): 'a t = let val return = ref NONE val thread = Thread.new (fn () => let val res = Done (f ()) handle e => Raise e val ret = valOf (!return) val _ = done return in Thread.switch (fn _ => Thread.prepare (ret, res)) end) val thread = Thread.prepare (thread, ()) in T {return = return, thread = thread} end fun run (T {return, thread}, time: Time.t): 'a res = Thread.switch (fn cur: 'a res Thread.t => let val _ = return := SOME cur fun handler (me: Thread.Runnable.t): Thread.Runnable.t = Thread.prepare (Thread.prepend (cur, fn () => (done return ; TimeOut (T {return = return, thread = me}))), ()) val _ = Signal.setHandler (signal, Signal.Handler.handler handler) val _ = Itimer.set (which, {value = time, interval = Time.zero}) in thread end) fun timeLimit (t: Time.t, f: unit -> 'a): 'a option = case run (new f, t) of Done a => SOME a | Raise e => raise e | TimeOut _ => NONE fun repeat {thunk, limit, tries} = let fun loop (n: int) = if n <= 0 then NONE else (case timeLimit (limit, thunk) of NONE => loop (n - 1) | SOME a => SOME a) in loop tries end end mlton-20100608/lib/mlton/basic/env.fun0000644000076600000240000000502511404435636016051 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Env (S: ENV_STRUCTS): ENV = struct open S datatype 'a t = T of (Domain.t * 'a) List.t fun size (T l) = List.length l fun domain (T drs) = List.revMap (drs, #1) val fromList = T fun toList (T l) = l fun empty () = T [] fun single (d, r) = T [(d, r)] fun isEmpty (T l) = List.isEmpty l fun singleton dr = T [dr] fun new (ds, f) = T (List.map (ds, fn d => (d, f d))) fun map (T drs, f) = T (List.map (drs, fn (d, r) => (d, f r))) fun mapi (T drs, f) = T (List.map (drs, fn (d, r) => (d, f (d, r)))) fun fold (T drs, b, f) = List.fold (drs, b, fn ((_, r), b) => f (r, b)) fun foldi (T drs, b, f) = List.fold (drs, b, fn ((d, r), b) => f (d, r, b)) fun equal d (d', _) = Domain.equals (d, d') fun remove (T drs, d) = T (List.remove (drs, equal d)) fun extend (T drs, d, r) = T (List.cons ((d, r), List.remove (drs, equal d))) fun env + (T l) = List.fold (l, env, fn ((d, r), env) => extend (env, d, r)) fun plus es = List.fold (es, empty (), fn (e, accum) => accum + e) fun peek (T l, d) = case List.peek (l, equal d) of NONE => NONE | SOME (_, r) => SOME r fun lookup (env, d) = case peek (env, d) of SOME r => r | NONE => (Layout.output (Domain.layout d, Out.error) ; Out.newline Out.error ; Error.bug "Env.lookup") fun restrict (env, ds) = new (ds, fn d => lookup (env, d)) fun multiExtend (env, ds, rs) = case (ds, rs) of ([], []) => env | (d :: ds, r :: rs) => multiExtend (extend (env, d, r), ds, rs) | _ => Error.bug "Env.multiExtend" fun foreach (e, f) = List.foreach (toList e, f o #2) fun foreachi (e, f) = List.foreach (toList e, f) fun forall (e, f) = List.forall (toList e, f o #2) fun foralli (e, f) = List.forall (toList e, f) fun equals rangeEqual (e1, e2) = size e1 = size e2 andalso foralli (e1, fn (d, r) => case peek (e2, d) of NONE => false | SOME r' => rangeEqual (r, r')) fun layout layoutR (T ps) = let open Layout in seq [str "[", align (List.map (ps, fn (d, r) => seq [Domain.layout d, str " -> ", layoutR r])), str"]"] end fun maybeLayout (name, layoutR) env = if isEmpty env then Layout.empty else let open Layout in seq [str name, str " = ", layout layoutR env] end end functor PolyEnv (S: ENV_STRUCTS): ENV = Env (S) mlton-20100608/lib/mlton/basic/env.sig0000644000076600000240000000323511404435636016044 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ENV_STRUCTS = sig structure Domain: T end signature ENV = sig include ENV_STRUCTS type 'a t val + : 'a t * 'a t -> 'a t val domain: 'a t -> Domain.t list val empty: unit -> 'a t val equals: ('a * 'a -> bool) -> 'a t * 'a t -> bool val extend: 'a t * Domain.t * 'a -> 'a t val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foldi: 'a t * 'b * (Domain.t * 'a * 'b -> 'b) -> 'b val forall: 'a t * ('a -> bool) -> bool val foralli: 'a t * (Domain.t * 'a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val foreachi: 'a t * (Domain.t * 'a -> unit) -> unit val fromList: (Domain.t * 'a) list -> 'a t val isEmpty: 'a t -> bool val layout: ('a -> Layout.t) -> 'a t -> Layout.t val lookup: 'a t * Domain.t -> 'a val map: 'a t * ('a -> 'b) -> 'b t val mapi: 'a t * (Domain.t * 'a -> 'b) -> 'b t val maybeLayout: string * ('a -> Layout.t) -> 'a t -> Layout.t val multiExtend: 'a t * Domain.t list * 'a list -> 'a t val new: Domain.t list * (Domain.t -> 'a) -> 'a t val peek: 'a t * Domain.t -> 'a option val plus: 'a t list -> 'a t val remove: 'a t * Domain.t -> 'a t val restrict: 'a t * Domain.t list -> 'a t val single: Domain.t * 'a -> 'a t val singleton: Domain.t * 'a -> 'a t val size: 'a t -> int val toList: 'a t -> (Domain.t * 'a) list end mlton-20100608/lib/mlton/basic/error.sig0000644000076600000240000000056711404435636016412 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ERROR = sig val bug: string -> 'a val reraise: exn * string -> 'a val unimplemented: string -> 'a val warning: string -> unit end mlton-20100608/lib/mlton/basic/error.sml0000644000076600000240000000105211404435636016411 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Error: ERROR = struct fun bug msg = raise (Fail msg) fun reraise (exn, msg) = bug (concat [msg, "::", case exn of Fail msg => msg | _ => "?"]) fun unimplemented msg = raise Fail (concat ["unimplemented: ", msg]) fun warning msg = TextIO.output (TextIO.stdErr, concat [msg, "\n"]) end mlton-20100608/lib/mlton/basic/escape.sig0000644000076600000240000000047611404435636016520 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ESCAPE = sig type 'a t val escape: 'a t * 'a -> 'b val new: ('a t -> 'a) -> 'a end mlton-20100608/lib/mlton/basic/escape.sml0000644000076600000240000000060011404435636016516 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Escape: ESCAPE = struct type 'a t = 'a -> exn fun escape (e, a) = raise (e a) fun new (f: 'a t -> 'a): 'a = let exception E of 'a in f E handle E a => a end end mlton-20100608/lib/mlton/basic/euclidean-ring.fun0000644000076600000240000001316011404435636020146 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor EuclideanRing(S: EUCLIDEAN_RING_STRUCTS) :> EUCLIDEAN_RING where type t = S.t = struct open S structure IntInf = Pervasive.IntInf val divMod = Trace.traceAssert ("EuclideanRing.divMod", Layout.tuple2(layout, layout), Layout.tuple2(layout, layout), fn (p, q) => (not(equals(q, zero)), fn (d, m) => (equals(p, q * d + m) andalso (equals(m, zero) orelse IntInf.<(metric m, metric q))))) divMod fun p div q = #1(divMod(p, q)) fun p mod q = #2(divMod(p, q)) fun divides(d: t, x: t): bool = equals(x mod d, zero) val divides = Trace.trace("EuclideanRing.divides", Layout.tuple2(layout, layout), Bool.layout) divides (* Taken from page 812 of CLR. *) fun extendedEuclidTerm(a: t, b: t, done: t * t -> bool, trace): t * t * t = let fun loop(a, b) = if done(a, b) then (a, one, zero) else let val (d, m) = divMod(a, b) val (d', x', y') = loop(b, m) in (d', y', x' - d * y') end in trace loop(a, b) end fun makeTraceExtendedEuclid f = Trace.traceAssert ("EuclideanRing.extendedEuclid", Layout.tuple2(layout, layout), Layout.tuple3(layout, layout, layout), fn (a, b) => (not(isZero a) andalso not(isZero b), fn (d, x, y) => (f(d, x, y) andalso equals(d, a * x + b * y)))) local val trace = makeTraceExtendedEuclid (fn (d, x, y) => divides(d, x) andalso divides(d, y)) in (* Page 72 of Bach and Shallit. *) (* Identical to algorithm on page 23 of Berlekamp. *) (* This algorithm is slower (about 2x) than the recursive extendedEuclid * given above, but stores only a constant number of ring elements. * Thus, for now, it is overridden below. *) fun extendedEuclid(u0: t, u1: t): t * t * t = let val rec loop = fn (r as {m11, m12, m21, m22, u, v, nEven}) => (Assert.assert("EuclideanRing.extendedEuclid", fn () => equals(u0, m11 * u + m12 * v) andalso equals(u1, m21 * u + m22 * v) andalso equals(if nEven then one else negOne, m11 * m22 - m12 * m21)) ; if isZero v then r else let val (q, r) = divMod(u, v) in loop{m11 = q * m11 + m12, m12 = m11, m21 = q * m21 + m22, m22 = m21, u = v, v = r, nEven = not nEven} end) val {m12, m22, u, nEven, ...} = loop{m11 = one, m12 = zero, m21 = zero, m22 = one, u = u0, v = u1, nEven = true} val (a, b) = if nEven then (m22, ~m12) else (~m22, m12) in (u, a, b) end val _ = extendedEuclid fun extendedEuclid (a, b) = extendedEuclidTerm (a, b, fn (_, b) => equals (b, zero), trace) end local val trace = makeTraceExtendedEuclid(fn _ => true) in val extendedEuclidTerm = fn (a, b, done) => extendedEuclidTerm(a, b, done, trace) end val lastPrime = ref one fun gcd(a, b) = if isZero b then a else gcd(b, a mod b) fun lcm(a, b) = (a * b) div gcd(a, b) val primes: t Stream.t = let fun loop(s: t Stream.t) = Stream.delay (fn () => let val (p, s) = valOf(Stream.force s) val _ = lastPrime := p in Stream.cons (p, loop(Stream.keep(s, fn x => not(divides(p, x))))) end) in loop monics end structure Int = struct open Pervasive.Int type t = int val layout = Layout.str o toString end type factors = (t * Int.t) list fun factor(n: t): factors = let fun loop(n: t, primes: t Stream.t, factors: factors) = if equals(n, one) then factors else let val (p, primes) = valOf(Stream.force primes) val (n, k) = let fun loop(n, k) = let val (q, r) = divMod(n, p) in if isZero r then loop(q, Int.+(k, 1)) else (n, k) end in loop(n, 0) end in loop(n, primes, if k = 0 then factors else (p, k) :: factors) end in loop(n, primes, []) end val factor = Trace.traceAssert ("EuclideanRing.factor", layout, List.layout (Layout.tuple2(layout, Int.layout)), fn n => (not(isZero n), fn factors => equals(n, List.fold(factors, one, fn ((p, k), prod) => prod * pow (p, k))))) factor fun existsPrimeOfSmallerMetric(m: IntInf.int, f: t -> bool): bool = let fun loop primes = let val (p, primes) = valOf(Stream.force primes) in IntInf.<(metric p, m) andalso (f p orelse loop primes) end in loop primes end fun isPrime(r: t): bool = let val r = unitEquivalent r in existsPrimeOfSmallerMetric(IntInf.+ (metric r, 1), fn p => equals(r, p)) end fun isComposite(r: t): bool = existsPrimeOfSmallerMetric(metric r, fn p => divides(p, r)) end mlton-20100608/lib/mlton/basic/euclidean-ring.sig0000644000076600000240000000240411404435636020137 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature EUCLIDEAN_RING_STRUCTS = sig include RING_WITH_IDENTITY (* Two elements a, b are "unit equivalent" if there is a unit element u * such that au = b. *) val divMod: t * t -> t * t val metric: t -> Pervasive.IntInf.int (* Monics should be an (infinite) stream of all (except for zero and one) * the representatives of the unit equivalence classes in nondecreasing * order of metric. *) val monics: t Stream.t (* Map an element to the representative of its unit equivalence class. *) val unitEquivalent: t -> t end signature EUCLIDEAN_RING = sig include EUCLIDEAN_RING_STRUCTS val div: t * t -> t val divides: t * t -> bool val extendedEuclid: t * t -> t * t * t val extendedEuclidTerm: t * t * (t * t -> bool) -> t * t * t val factor: t -> (t * Pervasive.Int.int) list val gcd: t * t -> t val isComposite: t -> bool val isPrime: t -> bool val lcm: t * t -> t val primes: t Stream.t val mod: t * t -> t end mlton-20100608/lib/mlton/basic/exn.sig0000644000076600000240000000172011404435636016043 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature EXN = sig type t = exn exception Bind exception Match exception Overflow exception Subscript val finally: (unit -> 'a) * (unit -> unit) -> 'a val history: t -> string list val name: t -> string val layout: t -> Layout.t val toString: t -> string (* try (t, k, h) evaluates t (), and if it yields value v, evaluates k v. * If t () raises exception e, then h e is evaluated. * This is not the same as "k (t ()) handle e => h e", because it doesn't * evaluate k v in the context of the handler. See "Exceptional Syntax" * by Benton and Kennedy. *) val try: (unit -> 'a) * ('a -> 'b) * (t -> 'b) -> 'b val withEscape: (('a -> 'b) -> 'a) -> 'a end mlton-20100608/lib/mlton/basic/exn.sml0000644000076600000240000000113111404435636016050 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Exn:> EXN = struct open Exn0 fun layout e = let open Layout in case e of OS.SysErr (s, _) => str s | Fail s => str s | IO.Io {cause, function, name, ...} => seq [str (concat [function, " ", name, ": "]), layout cause] | _ => seq [str "unhandled exception: ", str (exnName e)] end val toString = Layout.toString o layout end mlton-20100608/lib/mlton/basic/exn0.sml0000644000076600000240000000216411404435636016137 0ustar mtfstaff(* Copyright (C) 2005-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Exn0 = struct type t = exn val history = MLton.Exn.history val name = General.exnName exception Bind = Bind exception Match = Match exception Overflow = Overflow exception Subscript = Subscript local (* would like to make the declaration of z in a let inside the try function, * with 'a as a free type variable. But SML/NJ doesn't allow it. *) datatype 'a z = Ok of 'a | Raise of exn in val try: (unit -> 'a) * ('a -> 'b) * (exn -> 'b) -> 'b = fn (t, k, h) => case Ok (t ()) handle e => Raise e of Ok x => k x | Raise e => h e end fun finally (thunk, cleanup: unit -> unit) = try (thunk, fn a => (cleanup (); a), fn e => (cleanup (); raise e)) fun windFail (f: unit -> 'a, g: unit -> unit): 'a = f () handle ex => (g (); raise ex) fun 'a withEscape (f: ('a -> 'b) -> 'a): 'a = let exception E of 'a in f (fn x => raise E x) handle E x => x end end mlton-20100608/lib/mlton/basic/export.sig0000644000076600000240000000047211404435636016575 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature EXPORT = sig val exportFn: File.t * (string * string list -> OS.Process.status) -> unit end mlton-20100608/lib/mlton/basic/export.sml0000644000076600000240000000106711404435636016607 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Export: EXPORT = struct structure NJ = SMLofNJ fun exportFn(file, command) = NJ.exportFn(File.toString file, fn arg => ((command arg) handle exn => (print ("Unhandled exception: " ^ exnName exn ^ "\n") ; raise exn))) end mlton-20100608/lib/mlton/basic/field.fun0000644000076600000240000000050511404435636016342 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Field(F: FIELD_STRUCTS): FIELD = struct structure U = Ring(F) open F U val op / = fn (x, y) => x * inverse y end mlton-20100608/lib/mlton/basic/field.sig0000644000076600000240000000057311404435636016341 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FIELD_STRUCTS = sig include RING val inverse: t -> t end signature FIELD = sig include FIELD_STRUCTS val / : t * t -> t end mlton-20100608/lib/mlton/basic/file-desc.sig0000644000076600000240000000111511404435636017102 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FILE_DESC = sig type t = Posix.FileSys.file_desc val close: t -> unit val dup: t -> t val dup2: {old: t, new: t} -> unit val fluidLet: t * t * (unit -> 'a) -> 'a val layout: t -> Layout.t val move: {from: t, to: t} -> unit val pipe: unit -> {infd: t, outfd: t} val stderr: t val stdin: t val stdout: t end mlton-20100608/lib/mlton/basic/file-desc.sml0000644000076600000240000000141011404435636017111 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure FileDesc: FILE_DESC = struct open Posix.IO Posix.FileSys type t = file_desc val toString = SysWord.fmt StringCvt.DEC o fdToWord val layout = Layout.str o toString fun move {from, to} = if from <> to then (dup2 {old = from, new = to} ; close from) else () fun fluidLet (d1, d2, f) = let val copy = dup d1 val _ = dup2 {old = d2, new = d1} in Exn.finally (f, fn () => move {from = copy, to = d1}) end end mlton-20100608/lib/mlton/basic/file.sig0000644000076600000240000000356311404435636016177 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FILE = sig type t = string type dir = string type file = string val appendTo: t * string -> unit val base: t -> string val canRead: t -> bool val canRun: t -> bool val canWrite: t -> bool val concat: t list * t -> unit val contents: t -> string val copy: t * t -> unit val create: t -> unit (* make an empty file *) val dirOf: t -> dir val doesExist: t -> bool val ensureRead: t -> unit val ensureWrite: t -> unit val extension: t -> string option val fileOf: t -> file (* Each line includes the newline. *) val foldLines: t * 'a * (string * 'a -> 'a) -> 'a val isNewer: t * t -> bool val layout: t -> Layout.t (* Each line includes the newline. *) val lines: t -> string list val modTime: t -> Time.t val move: {from: t, to: t} -> unit val output: t * Out.t -> unit val outputContents: t * Out.t -> unit val remove: t -> unit val sameContents: t * t -> bool val size: t -> Position.int val suffix: t -> string option val temp: {prefix: string, suffix: string} -> t * Out.t val toString: t -> string val withAppend: t * (Out.t -> 'a) -> 'a val withIn: t * (In.t -> 'a) -> 'a val withOut: t * (Out.t -> 'a) -> 'a val withOutIn: (Out.t -> unit) * (In.t -> 'a) -> 'a val withString: string * (t -> 'a) -> 'a val withStringIn: string * (In.t -> 'a) -> 'a val withTemp: (t -> 'a) -> 'a val withTempOut: (Out.t -> unit) * (t -> 'a) -> 'a val withTempOut': {prefix: string, suffix: string} * (Out.t -> unit) * (t -> 'a) -> 'a end mlton-20100608/lib/mlton/basic/file.sml0000644000076600000240000000651711404435636016212 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure File:> FILE = struct structure FS = OS.FileSys type t = string type dir = string type file = string fun toString f = f val layout = Layout.str o toString val size = FS.fileSize val modTime = FS.modTime fun isNewer (f1, f2) = Time.>= (modTime f1, modTime f2) fun withh (file, p, openn, close) = let val stream = openn file in Exn.finally (fn () => p stream, fn () => close stream) end fun withOut (f, p) = withh (f, p, Out.openOut, Out.close) fun withAppend (f, p) = withh (f, p, Out.openAppend, Out.close) fun withIn (f, p) = withh (f, p, In.openIn, In.close) fun appendTo (f, s) = withAppend (f, fn out => Out.output (out, s)) fun foldLines (f, ac, trans) = withIn (f, fn ins => In.foldLines (ins, ac, trans)) local fun can a f = FS.access (f, a) in val canRead = can [FS.A_READ] val canRun = can [FS.A_EXEC] val canWrite = can [FS.A_WRITE] val doesExist = can [] end fun remove f = if doesExist f then (FS.remove f handle e => Error.bug (concat ["File.remove: ", f, ": ", Layout.toString (Exn.layout e)])) else () local fun ensure (pred, msg) f = if pred f then () else Error.bug (concat ["can not ", msg, " ", f]) in val ensureWrite = ensure (canWrite, "write") val ensureRead = ensure (canRead, "read") end fun sameContents (f1, f2) = size f1 = size f2 andalso withIn (f1, fn in1 => withIn (f2, fn in2 => In.sameContents (in1, in2))) fun output (file, out) = Out.output (out, file) fun outputContents (file, out) = withIn (file, fn ins => In.outputAll (ins, out)) fun lines f = withIn (f, In.lines) fun contents file = withIn (file, In.inputAll) fun move {from, to} = FS.rename {old = from, new = to} fun copy (source, dest) = withOut (dest, fn out => outputContents (source, out)) fun concat (sources, dest) = withOut (dest, fn out => List.foreach (sources, fn f => outputContents (f, out))) val temp = MLton.TextIO.mkstemps val tempPrefix = MLton.TextIO.tempPrefix fun tempName z = let val (f, out) = temp z val _ = Out.close out in f end fun withTemp f = let val name = tempName {prefix = tempPrefix "file", suffix = ""} in Exn.finally (fn () => f name, fn () => remove name) end fun withTempOut' (z, f: Out.t -> unit, g) = let val (name, out) = temp z in Exn.finally (fn () => (Exn.finally (fn () => f out, fn () => Out.close out) ; g name), fn () => remove name) end fun withTempOut (f, g) = withTempOut' ({prefix = tempPrefix "file", suffix = ""}, f, g) fun withString (s, f) = withTempOut (fn out => Out.output (out, s), f) fun withOutIn (fout, fin) = withTempOut (fout, fn tmp => withIn (tmp, fin)) fun withStringIn (s, fin) = withOutIn (fn out => Out.output (out, s), fin) fun create f = withOut (f, fn _ => ()) val suffix = #ext o OS.Path.splitBaseExt local open OS.Path in val base = base val dirOf = dir val extension = ext val fileOf = file end end mlton-20100608/lib/mlton/basic/fixed-point.sig0000644000076600000240000000061311404435636017477 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FIXED_POINT = sig val fix: {start: 'a, step: 'a -> 'a, equals: 'a * 'a -> bool} -> 'a val fix': ((unit -> unit) -> unit) -> unit end mlton-20100608/lib/mlton/basic/fixed-point.sml0000644000076600000240000000127111404435636017511 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure FixedPoint: FIXED_POINT = struct fun fix{start, step, equals} = let fun loop s = let val s' = step s in if equals(s, s') then s else loop s' end in loop start end fun fix' (f: (unit -> unit) -> unit) = let fun loop() = let val changed = ref false in f(fn () => changed := true); if !changed then loop() else () end in loop() end end mlton-20100608/lib/mlton/basic/fold.fun0000644000076600000240000000234411404435636016206 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Fold (S: FOLD_STRUCTS): FOLD = struct open S fun foldi (l: 'a t, b, f) = #1 (fold (l, (b, 0: int), fn (x, (b, i)) => (f (i, x, b), i + 1))) fun foreachi (l, f) = foldi (l, (), fn (i, x, ()) => f (i, x)) fun foreach (l, f: 'a elt -> unit) = fold (l, (), f o #1) fun last l = case fold (l, NONE, SOME o #1) of NONE => Error.bug "Fold.last" | SOME x => x fun length l = fold (l, 0: int, fn (_, n) => n + 1) fun mapi (l, f) = rev (foldi (l, [], fn (i, x, l) => f (i, x) :: l)) fun map (l, f) = mapi (l, f o #2) fun layout f l = Layout.list (map (l, f)) fun revKeepAllMap (l, f) = fold (l, [], fn (x, ac) => case f x of NONE => ac | SOME y => y :: ac) fun keepAllMap z = rev (revKeepAllMap z) fun revKeepAll (l, f) = fold (l, [], fn (x, ac) => if f x then x :: ac else ac) fun keepAll z = rev (revKeepAll z) fun revRemoveAll (l, f) = fold (l, [], fn (x, ac) => if f x then ac else x :: ac) fun removeAll z = rev (revRemoveAll z) end mlton-20100608/lib/mlton/basic/fold.sig0000644000076600000240000000301211404435636016171 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FOLD_STRUCTS = sig type 'a t type 'a elt val fold: 'a t * 'b * ('a elt * 'b -> 'b) -> 'b end signature FOLD = sig include FOLD_STRUCTS val foldi: 'a t * 'b * (int * 'a elt * 'b -> 'b) -> 'b val foreachi: 'a t * (int * 'a elt -> unit) -> unit val foreach: 'a t * ('a elt -> unit) -> unit (* keepAll (l, f) keeps all x in l such that f x. *) val keepAll: 'a t * ('a elt -> bool) -> 'a elt list (* keepAllMap (l, f) keeps all y in l such that f x = SOME y.*) val keepAllMap: 'a t * ('a elt -> 'b option) -> 'b list val last: 'a t -> 'a elt val layout: ('a elt -> Layout.t) -> 'a t -> Layout.t val length: 'a t -> int val map: 'a t * ('a elt -> 'b) -> 'b list val mapi: 'a t * (int * 'a elt -> 'b) -> 'b list (* removeAll (l, f) removes all x in l such that f x. *) val removeAll: 'a t * ('a elt -> bool) -> 'a elt list (* The "rev" versions of functions are there for efficiency, when it is * easier to fold over the input and accumulate the result in reverse. *) val revKeepAll: 'a t * ('a elt -> bool) -> 'a elt list val revKeepAllMap: 'a t * ('a elt -> 'b option) -> 'b list val revRemoveAll: 'a t * ('a elt -> bool) -> 'a elt list end mlton-20100608/lib/mlton/basic/format.sig0000644000076600000240000000203711404435636016543 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FORMAT = sig type ('a, 'b) t val eol: ('a, 'a) t val format: (string, 'a) t -> 'a val int: ('a, int -> 'a) t val list: ('a, 'b -> 'a) t -> ('a, 'b list -> 'a) t val lit: string -> ('a, 'a) t val new: ('b -> string) -> ('a, 'b -> 'a) t val o: ('a, 'b) t * ('c, 'a) t -> ('c, 'b) t val string: ('a, string -> 'a) t end functor TestFormat (S: FORMAT): sig end = struct open S val _ = Assert.assert ("TestFormat", fn () => "abc" = format (lit "abc") andalso "abc" = format string "abc" andalso "abc" = format (lit "a" o lit "b" o lit "c") andalso "abc" = format (string o string o string) "a" "b" "c" andalso "[a, b, c]" = format (list string) ["a", "b", "c"] andalso "[1, 2, 3]" = format (list int) [1, 2, 3]) end mlton-20100608/lib/mlton/basic/format.sml0000644000076600000240000000253111404435636016553 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * This is based on * Functional Unparsing * BRICS Technical Report RS 98-12 * Olivier Danvy, May 1998 *) structure Format:> FORMAT = struct type ('a, 'b) t = (string list -> 'a) * string list -> 'b val new: ('b -> string) -> ('a, 'b -> 'a) t = fn toString => fn (k, ss) => fn b => k (toString b :: ss) val lit: string -> ('a, 'a) t = fn s => fn (k, ss) => k (s :: ss) val eol: ('a, 'a) t = fn z => lit "\n" z (* val concat = * Trace.trace ("Format.concat", List.layout String.layout, String.layout) concat *) val format: (string, 'a) t -> 'a = fn f => f (concat o rev, []) val int: ('a, int -> 'a) t = fn z => new Int.toString z val list: ('a, 'b -> 'a) t -> ('a, 'b list -> 'a) t = fn f => fn (k, ss) => fn [] => k ("[]" :: ss) | x :: xs => let fun loop xs ss = case xs of [] => k ("]" :: ss) | x :: xs => f (loop xs, ", " :: ss) x in f (loop xs, "[" :: ss) x end val op o: ('a, 'b) t * ('c, 'a) t -> ('c, 'b) t = fn (f, g) => fn (k, ss) => f (fn ss => g (k, ss), ss) val string: ('a, string -> 'a) t = fn z => new (fn s => s) z end mlton-20100608/lib/mlton/basic/function.sig0000644000076600000240000000115111404435636017074 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FUNCTION = sig val curry: ('a * 'b -> 'c) -> ('a -> 'b -> 'c) val compose: ('b -> 'c) * ('a -> 'b) -> ('a -> 'c) val layout: ('a -> 'b) -> Layout.t val output: ('a -> 'b) * TextIO.outstream -> unit val seq: ('a -> 'b) * ('b -> 'c) -> ('a -> 'c) val seq3: ('a -> 'b) * ('b -> 'c) * ('c -> 'd) -> ('a -> 'd) val uncurry: ('a -> 'b -> 'c) -> ('a * 'b -> 'c) end mlton-20100608/lib/mlton/basic/function.sml0000644000076600000240000000074411404435636017114 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Function: FUNCTION = struct fun curry f x y = f(x, y) fun uncurry f (x, y) = f x y fun compose(f, g) x = f(g(x)) fun seq(f, g) x = g(f(x)) fun seq3(f, g, h) x = h(g(f(x))) fun layout _ = Layout.str "" fun output(_, out) = Out.output(out, "") end mlton-20100608/lib/mlton/basic/hash-set.sig0000644000076600000240000000427111404435636016771 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature HASH_SET = sig type 'a t val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val forall: 'a t * ('a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val fromList: 'a list * {hash: 'a -> word, equals: 'a * 'a -> bool} -> 'a t (* insertIfNew (s, h, p, f, g) looks in the set s for an entry with hash h * satisfying predicate p. If the entry is there, it is returned after * being applied to g. Otherwise, the function f is called to create a * new entry, which is inserted and returned. * NOTE: f must not modify the hash set during its evaluation. *) val insertIfNew: 'a t * word * ('a -> bool) * (unit -> 'a) * ('a -> unit) -> 'a val layout: ('a -> Layout.t) -> 'a t -> Layout.t (* lookupOrInsert (s, h, p, f) looks in the set s for an entry with hash h * satisfying predicate p. If the entry is there, it is returned. * Otherwise, the function f is called to create a new entry, which is * inserted and returned. * NOTE: f must not modify the hash set during its evaluation. *) val lookupOrInsert: 'a t * word * ('a -> bool) * (unit -> 'a) -> 'a val new: {hash: 'a -> word} -> 'a t (* newOfSize {hash, size} * creates a table that can handle size elements without resizing. *) val newOfSize: {hash: 'a -> word, size: int} -> 'a t val peek: 'a t * word * ('a -> bool) -> 'a option (* remove an entry. Error if it's not there. *) val remove: 'a t * word * ('a -> bool) -> unit (* removeAll (s, p) removes all entries from s that satisfy predicate p. *) val removeAll: 'a t * ('a -> bool) -> unit val size: 'a t -> int val stats: unit -> Layout.t val stats': 'a t -> Layout.t val toList: 'a t -> 'a list end functor TestHashSet (S: HASH_SET): sig end = struct open S val _ = Assert.assert("TestHashSet", fn () => true) end mlton-20100608/lib/mlton/basic/hash-set.sml0000644000076600000240000001424111404435636017000 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure HashSet: HASH_SET = struct datatype 'a t = T of {buckets: 'a list array ref, hash: 'a -> word, mask: word ref, numItems: int ref} fun 'a newWithBuckets {hash, numBuckets: int}: 'a t = let val mask: word = Word.fromInt numBuckets - 0w1 in T {buckets = ref (Array.new (numBuckets, [])), hash = hash, numItems = ref 0, mask = ref mask} end val initialSize: int = Int.pow (2, 6) fun new {hash} = newWithBuckets {hash = hash, numBuckets = initialSize} fun newOfSize {hash, size} = newWithBuckets {hash = hash, numBuckets = 4 * Int.roundUpToPowerOfTwo size} fun size (T {numItems, ...}) = !numItems fun index (w: word, mask: word): int = Word.toInt (Word.andb (w, mask)) val numPeeks: Int64.int ref = ref 0 val numLinks: Int64.int ref = ref 0 fun stats () = let open Layout in align [seq [str "hash set numPeeks = ", str (Int64.toString (!numPeeks))], (* seq [str "hash set numLinks = ", str (Int64.toString (!numLinks))], *) seq [str "hash set average position = ", str let open Real val fromInt = fromIntInf o Int64.toLarge in format (fromInt (!numLinks) / fromInt (!numPeeks), Format.fix (SOME 3)) end]] end fun stats' (T {buckets, numItems, ...}) = let open Layout val numi = !numItems val numb = Array.length (!buckets) val numb' = numb - 1 val avg = let open Real in (fromInt numi / fromInt numb) end val (min,max,total) = Array.fold (!buckets, (NONE, NONE, 0.0), fn (l,(min,max,total)) => let val n = List.length l val d = (Real.fromInt n) - avg in (SOME (Option.fold(min,n,Int.min)), SOME (Option.fold(max,n,Int.max)), total + d * d) end) val stdd = let open Real in Math.sqrt(total / (fromInt numb')) end val rfmt = fn r => Real.format (r, Real.Format.fix (SOME 3)) in align [seq [str "numItems = ", Int.layout numi], seq [str "numBuckets = ", Int.layout numb], seq [str "avg = ", str (rfmt avg), str " stdd = ", str (rfmt stdd), str " min = ", Option.layout Int.layout min, str " max = ", Option.layout Int.layout max]] end fun resize (T {buckets, hash, mask, ...}, size: int, newMask: word): unit = let val newBuckets = Array.new (size, []) in Array.foreach (!buckets, fn r => List.foreach (r, fn a => let val j = index (hash a, newMask) in Array.update (newBuckets, j, a :: Array.sub (newBuckets, j)) end)) ; buckets := newBuckets ; mask := newMask end fun maybeGrow (s as T {buckets, mask, numItems, ...}): unit = let val n = Array.length (!buckets) in if !numItems * 4 > n then resize (s, n * 2, (* The new mask depends on growFactor being 2. *) Word.orb (0w1, Word.<< (!mask, 0w1))) else () end fun removeAll (T {buckets, numItems, ...}, p) = Array.modify (!buckets, fn elts => List.fold (elts, [], fn (a, ac) => if p a then (Int.dec numItems; ac) else a :: ac)) fun remove (T {buckets, mask, numItems, ...}, w, p) = let val i = index (w, !mask) val b = !buckets val _ = Array.update (b, i, List.removeFirst (Array.sub (b, i), p)) val _ = Int.dec numItems in () end fun peekGen (T {buckets = ref buckets, mask, ...}, w, p, no, yes) = let val _ = numPeeks := 1 + !numPeeks handle Overflow => Error.bug "HashSet: numPeeks overflow" val j = index (w, !mask) val b = Array.sub (buckets, j) fun update () = numLinks := !numLinks + 1 handle Overflow => Error.bug "HashSet: numLinks overflow" in case List.peek (b, fn a => (update (); p a)) of NONE => no (j, b) | SOME a => yes a end fun peek (t, w, p) = peekGen (t, w, p, fn _ => NONE, SOME) (* fun update (T {buckets = ref buckets, equals, hash, mask, ...}, a) = * let * val j = index (hash a, !mask) * val _ = * Array.update (buckets, j, * a :: (List.remove (Array.sub (buckets, j), * fn a' => equals (a, a')))) * in () * end *) fun insertIfNew (table as T {buckets, numItems, ...}, w, p, f, g: 'a -> unit) = let fun no (j, b) = let val a = f () val _ = Int.inc numItems val _ = Array.update (!buckets, j, a :: b) val _ = maybeGrow table in a end fun yes x = (g x; x) in peekGen (table, w, p, no, yes) end fun lookupOrInsert (table, w, p, f) = insertIfNew (table, w, p, f, ignore) fun fold (T {buckets, ...}, b, f) = Array.fold (!buckets, b, fn (r, b) => List.fold (r, b, f)) local structure F = Fold (type 'a t = 'a t type 'a elt = 'a val fold = fold) open F in val foreach = foreach end fun forall (T {buckets, ...}, f) = Array.forall (!buckets, fn r => List.forall (r, f)) fun toList t = fold (t, [], fn (a, l) => a :: l) fun layout lay t = List.layout lay (toList t) fun fromList (l, {hash, equals}) = let val s = new {hash = hash} val () = List.foreach (l, fn a => ignore (lookupOrInsert (s, hash a, fn b => equals (a, b), fn _ => a))) in s end end mlton-20100608/lib/mlton/basic/hash-table.sig0000644000076600000240000000443711404435636017271 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* This code is not working -- it is not even in sources.cm *) signature HASH_TABLE = sig type ('a, 'b) t val fold: ('a, 'b) t * 'c * ('b * 'c -> 'c) -> 'c val foldi: ('a, 'b) t * 'c * ('a * 'b * 'c -> 'c) -> 'c val forall: ('a, 'b) t * ('b -> bool) -> bool val foralli: ('a, 'b) t * ('a * 'b -> bool) -> bool val foreach: ('a, 'b) t * ('b -> unit) -> unit val foreachi: ('a, 'b) t * ('a * 'b -> unit) -> unit (* If it's already in the table, call the thunk, else insert it and * return it. *) val insertIfNew: ('a, 'b) t * 'a * 'b * (unit -> 'b) -> 'b val listItems: ('a, 'b) t -> 'b list val listItemsi: ('a, 'b) t -> ('a * 'b) list val layout: ('a * 'b -> Layout.t) -> ('a, 'b) t -> Layout.t val lookupOrInsert: ('a, 'b) t * 'a * (unit -> 'b) -> 'b val map: ('a, 'b) t * ('b -> 'c) -> ('a, 'c) t val mapi: ('a, 'b) t * ('a * 'b -> 'c) -> ('a, 'c) t val new: {equals: 'a * 'a -> bool, hash: 'a -> word} -> ('a, 'b) t val peek: ('a, 'b) t * 'a -> 'b option val size: ('a, 'b) t -> int val stats: unit -> Layout.t val update: ('a, 'b) t * 'a * 'b -> unit end functor TestHashTable (S: HASH_TABLE): sig end = struct open S val _ = Assert.assert ("TestHashTable", fn () => let val t = new Int.equals val n = 10 val hash = Word.fromInt val _ = Int.for(0, n, fn i => (lookupOrInsert(t, hash i, i, fn () => i * 2) ; ())) val sum = Int.fold(0, n, 0, op +) in let val r = ref 0 in foreach (t, fn j => r := !r + j) ; 2 * sum = !r end andalso Int.forall(0, n, fn i => Option.isSome(peek(t, hash i, i))) andalso foralli(t, fn (i, j) => j = 2 * i) andalso n = List.length(listItems t) andalso n = List.length(listItemsi t) andalso let val t' = map(t, fn j => j div 2) in n = size t' andalso foralli(t', fn (i, j) => i = j) end andalso n = size t end) end mlton-20100608/lib/mlton/basic/hash-table.sml0000644000076600000240000000527111404435636017277 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* This code is not working -- it is not even in sources.cm *) structure HashTable: HASH_TABLE = struct structure Set = HashSet type ('a, 'b) t = ('a * 'b) Set.t fun ('a, 'b) new {equals, hash}: ('a, 'b) t = Set.new {equals = fn ((a, _), (a', _)) => equals (a, a') hash = hash o #1} local open Set in val size = size val stats = stats end fun update (t, a, b) = Set.update (t, (a, b)) fun peek (t, a) = Option.map (Set.peek (t, Set.hash (t, fun update (T {buckets = ref buckets, equals, mask, ...}, w, a, b) = let val j = index (w, !mask) val _ = Array.update (buckets, j, (w, a, b) :: List.fold (Array.sub (buckets, j), [], fn (z as (w', a', _), ac) => if Word.equals (w, w') andalso equals (a, a') then ac else z :: ac)) in () end fun peek(t, w, i) = peekGen(t, w, i, fn _ => NONE, SOME) fun lookupGen (table as T {buckets, numItems, ...}, w, i, x, yes) = let fun no (j, b) = let val x = x () val _ = Int.inc numItems val _ = Array.update (!buckets, j, (w, i, x) :: b) val _ = maybeGrow table in x end in peekGen (table, w, i, no, yes) end fun lookupOrInsert (table, w, i, x) = lookupGen (table, w, i, x, fn x => x) fun insertIfNew (table, w, i, x, yes) = lookupGen (table, w, i, fn () => x, fn _ => yes ()) fun foldi(T{buckets, ...}, b, f) = Array.fold(!buckets, b, fn (r, b) => List.fold(r, b, fn ((_, i, x), b) => f(i, x, b))) fun listItemsi t = foldi(t, [], fn (i, x, l) => (i, x) :: l) fun layout lay t = List.layout lay (listItemsi t) fun fold(t, b, f) = foldi(t, b, fn (_, x, b) => f(x, b)) fun foreachi(t, f) = foldi(t, (), fn (i, x, ()) => f(i, x)) fun foreach(t, f) = foreachi(t, f o #2) fun foralli(t, f) = DynamicWind.withEscape (fn escape => (foreachi(t, fn z => if f z then () else escape false) ; true)) fun forall(t, f) = foralli(t, f o #2) fun listItems t = fold(t, [], op ::) fun appi(t, f) = foldi(t, (), fn (i, x, ()) => f(i, x)) fun app(t, f) = appi(t, f o #2) fun mapi (T{numItems, mask, equals, buckets}, f) = T {numItems = ref (!numItems), mask = ref (!mask), equals = equals, buckets = ref (Array.map (!buckets, fn r => List.revMap (r, fn (w, i, x) => (w, i, f (i, x)))))} fun map (t, f) = mapi (t, f o #2) end mlton-20100608/lib/mlton/basic/het-container.fun0000644000076600000240000000167311404435636020026 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ExnHetContainer():> HET_CONTAINER = struct type t = exn fun 'a new() = let exception E of 'a in {make = E, pred = fn E _ => true | _ => false, peek = fn E x => SOME x | _ => NONE} end end functor RefHetContainer():> HET_CONTAINER = struct type t = unit ref * (unit -> unit) fun 'a new() = let val id = ref() val r: 'a option ref = ref NONE fun make v = (id, fn () => r := SOME v) fun peek ((id', f): t) = if id = id' then (f(); !r before r := NONE) else NONE fun pred(id', _) = id = id' in {make = make, pred = pred, peek = peek} end end mlton-20100608/lib/mlton/basic/het-container.sig0000644000076600000240000000057411404435636020017 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature HET_CONTAINER = sig type t val new: unit -> {make: 'a -> t, pred: t -> bool, peek: t -> 'a option} end mlton-20100608/lib/mlton/basic/html.sig0000644000076600000240000000225211404435636016216 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature HTML = sig structure Align: sig datatype t = Left | Center | Right end structure Element: sig type t datatype tableOption = Border of int | CellPadding of int | CellSpacing of int val a: Url.t * t -> t val br: t val img: {src: Url.t} -> t val layout: t -> Layout.t val pre: t -> t val seq: t list -> t val str: string -> t val tt: t -> t val table: tableOption list * t list list -> t end structure Option: sig datatype t = Redirect of {seconds: int, uri: Url.t} | Title of string end datatype t = T of {options: Option.t list, body: Element.t} val layout: t -> Layout.t end mlton-20100608/lib/mlton/basic/html.sml0000644000076600000240000000715011404435636016231 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Html:> HTML = struct fun tag (name: string, attributes: (string * string) list, body: Layout.t) = let open Layout in seq [str "<", str name, seq (List.map (attributes, fn (name, value) => str (concat [" ", name, " = ", value]))), str ">", body, str (concat [""])] end structure Align = struct datatype t = Left | Center | Right fun toString a = case a of Left => "left" | Center => "center" | Right => "right" fun attribute a = ("align", toString a) end structure Element = struct datatype tableOption = Border of int | CellPadding of int | CellSpacing of int datatype t = A of Url.t * t | Br | H1 of Align.t * t | Img of {src: Url.t} | P of Align.t * t | Pre of t | Seq of t list | String of string | Table of tableOption list * t list list | Tt of t val a = A val br = Br val h1 = H1 val img = Img val p = P val pre = Pre val seq = Seq val str = String val table = Table val tt = Tt fun layoutAe ((a, e), s) = tag (s, [Align.attribute a], layout e) and layout e = let open Layout in case e of A (u, e) => tag ("A", [("href", Url.toString u)], layout e) | Br => align [empty, tag ("BR", [], empty)] | H1 ae => layoutAe (ae, "H1") | Img {src, ...} => tag ("IMAGE", [("src", Url.toString src)], empty) | P ae => layoutAe (ae, "P") | Pre t => tag ("PRE", [], layout t) | Seq es => seq (List.map (es, layout)) | String s => str s | Table (options, rows) => tag ("TABLE", List.map (options, fn Border n => ("BORDER", Int.toString n) | CellPadding n => ("CELLPADDING", Int.toString n) | CellSpacing n => ("CELLSPACING", Int.toString n)), seq (List.map (rows, fn cols => tag ("TR", [], seq (List.map (cols, fn c => tag ("TH", [], layout c))))))) | Tt t => tag ("TT", [], layout t) end end structure Option = struct datatype t = Redirect of {seconds: int, uri: Url.t} | Title of string fun layout (opt: t): Layout.t = case opt of Redirect {seconds, uri} => tag ("META", [("HTTP-EQUIV", "Refresh"), ("Content", concat [String.dquote, Int.toString seconds, "; URL=", Url.toString uri, String.dquote])], Layout.empty) | Title s => tag ("TITLE", [], Layout.str s) end datatype t = T of {options: Option.t list, body: Element.t} fun layout (T {options, body}) = let open Layout in align [str "", tag ("HTML", [], align [tag ("HEAD", [], align (List.map (options, Option.layout))), tag ("BODY", [], Element.layout (body))])] end end mlton-20100608/lib/mlton/basic/http.mlb0000644000076600000240000000101011404435636016210 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/mlton.mlb sources.mlb port.sig port.sml itimer.sml thread.sig thread.sml engine.sig engine.sml net.sig net.sml url.sig url.sml http.sig http.sml in signature HTTP signature URL structure Http structure Url end mlton-20100608/lib/mlton/basic/http.sig0000644000076600000240000001720611404435636016236 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Based on RFC 2616. *) signature HTTP = sig structure Method: sig datatype t = Connect | Delete | Get | Head | Options | Post | Put | Trace | Extension of string end structure RequestUrl: sig datatype t = Star | Url of Url.t | Path of {path: Url.Path.t, query: string option} | Authority of string val toString: t -> string end structure Version: sig datatype t = T of {major: int, minor: int} val v10: t val v11: t end structure Header: sig datatype t = Accept of string | AcceptCharset of string | AcceptEncoding of string | AcceptLanguage of string | AcceptRanges of string | Age of string | Allow of string | Authorization of string | CacheControl of string | Connection of string | ContentEncoding of string | ContentLanguage of string | ContentLength of int | ContentLocation of string | ContentMD5 of string | ContentRange of string | ContentType of string | Cookie of string | Date of string | ETag of string | Expect of string | Expires of string | Extension of {name: string, value: string} | From of string | Host of string | IfMatch of string | LastModified of string | Location of string | Pragma of string | ProxyAuthenticate of string | ProxyConnection of string | Referer of string | RetryAfter of string | Server of string | SetCookie of string | Trailer of string | TransferEncoding of string | Upgrade of string | UserAgent of string | Vary of string | Via of string | WWWAuthenticate of string | Warning of string val fromString: string -> t list Result.t val input: In.t -> t list Result.t val toString: t -> string end structure Request: sig datatype t = T of {method: Method.t, url: RequestUrl.t, version: Version.t, headers: Header.t list} val input: In.t -> t Result.t val layout: t -> Layout.t val output: t * Out.t -> unit val regexp: unit -> Regexp.Compiled.t val requestLine: string -> {method: Method.t, url: RequestUrl.t, version: Version.t} option val toString: t -> string end structure Status: sig datatype t = Accepted | BadGateway | BadRequest | Conflict | Continue | Created | ExpectationFailed | Extension of string | Forbidden | Found | GatewayTimeout | Gone | HTTPVersionNotSupported | InternalServerError | LengthRequired | MethodNotAllowed | MovedPermanently | MultipleChoices | NoContent | NonAuthoritativeInformation | NotAcceptable | NotFound | NotImplemented | NotModified | OK | PartialContent | PaymentRequired | PreconditionFailed | ProxyAuthenticationRequired | RequestEntityTooLarge | RequestTimeout | RequestUriTooLarge | RequestedRangeNotSatisfiable | ResetContent | SeeOther | ServiceUnavailable | SwitchingProtocols | TemporaryRedirect | Unauthorized | UnsupportedMediaType | UseProxy val code: t -> string val fromString: string -> t (* string is a code, eg "502" *) val reason: t -> string end structure Response: sig datatype t = T of {headers: Header.t list, status: Status.t, version: Version.t} val input: In.t -> t Result.t val layout: t -> Layout.t val output: t * Out.t -> unit val regexp: unit -> Regexp.Compiled.t val toString: t -> string end structure Post: sig structure Encoding: sig datatype t = Url | Multipart end structure Value: sig type t val file: File.t -> t val string: string -> t end datatype t = T of {encoding: Encoding.t, fields: {name: string, value: Value.t} list} end val fetch: {head: bool, headers: Header.t list, post: Post.t option, proxy: {host: string, port: int} option, url: Url.t} -> In.t end functor TestHttp (S: HTTP): sig end = struct open S val _ = Assert.assert ("TestHttp", fn () => Regexp.Compiled.matchesAll (Request.regexp (), "CONNECT trading.etrade.com:443 HTTP/1.0\r\n") andalso isSome (Request.requestLine "GET http://Norma140.emp3.com/ HTTP/1.0\n") andalso let val s = "Date: Wed, 08 Mar 2000 09:26:18 GMT\r\n\ \Server: Apache/1.3.6 (Unix) (Red Hat/Linux)\r\n\ \Last-Modified: Thu, 02 Mar 2000 22:55:44 GMT\r\n\ \ETag: \"23a07c-2ae-38bef170\"\r\n\ \Accept-Ranges: bytes\r\n\ \Content-Length: 686\r\n\ \Connection: close\r\n\ \Content-Type: text/html\r\n" val zzz = "GET http://www.nytimes.com/auth/chk_login?is_continue=true&URI=http%3A%2F%2Fwww.nytimes.com%2Flibrary%2Ftech%2Fyr%2Fmo%2Fbiztech%2Farticles%2F17blue.html&Tag=&site=&banner=&sweeps=&USERID=cypherpunk&PASSWORD=cypherpunk&SAVEOPTION=YES HTTP/1.0\r\n" val s = "Referer: http://www.nytimes.com/auth/chk_login?is_continue=true&URI=http%3A%2F%2Fwww.nytimes.com%2Flibrary%2Ftech%2Fyr%2Fmo%2Fbiztech%2Farticles%2F17blue.html&Tag=&site=&banner=&sweeps=&USERID=hqbovik&PASSWORD=hqbovik&SAVEOPTION=YES\r\nUser-Agent: Mozilla/4.7 [en]\r\nHost: www.nytimes.com\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\nCookie: RMID=c603a30338b9ce60; NYT-S=0UtWyAdJ/Hc94BS7pHO0q4Pek6E1oJ.FMxFTIduykzwDgubECS6cqpWk.Duqut/D9GDBO6lz6cXYs0; PW=\161%.69,.)03\223; ID=\161%.69,.)03\223; RDB=C80200D6EF0000555301001E2719270101000000000002\r\n" val s = "Cookie: PW=\161%.69\r\n" in Result.isYes (Header.fromString s) end) end mlton-20100608/lib/mlton/basic/http.sml0000644000076600000240000007326711404435636016260 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Http: HTTP = struct structure Regexp = struct open Regexp val CHAR = ascii val UPALPHA = isChar Char.isUpper val LOALPHA = isChar Char.isLower val ALPHA = isChar Char.isAlpha val DIGIT = isChar Char.isDigit val CTL = isChar Char.isCntrl val CR = char #"\r" val LF = char #"\n" val SP = char #" " val HT = char #"\t" val CRLF = string "\r\n" (* #"\n" is not in the spec for CRLF, but Netscape generates it. *) val CRLF = or [CRLF, char #"\n"] val LWS = seq [optional CRLF, oneOrMore (or [SP, HT])] val TEXT = isNotChar Char.isCntrl val HEX = isChar Char.isHexDigit val separatorChars = "()<>@,;:\\\"/ []?= {} \t" val separators = oneOf separatorChars val token = oneOrMore (isChar (Char.memoize (fn c => Char.isAscii c andalso not (Char.isCntrl c) andalso not (String.contains (separatorChars, c))))) val dquote = char Char.dquote val qdtext = isChar (fn c => not (Char.isCntrl c) andalso not (c = Char.dquote)) val quotedpair = seq [char #"\\", CHAR] val quotedstring = seq [dquote, star (or [qdtext, quotedpair]), dquote] val ctext = isChar (fn c => not (Char.isCntrl c) andalso not (c = #"(") andalso not (c = #")")) (* val comment = * seq [char #"(", * star (or [ctext, quoted-pair, comment]), * char #")"] *) val major' = Save.new () val minor' = Save.new () val version = seq [string "HTTP/", save (oneOrMore DIGIT, major'), char #".", save (oneOrMore DIGIT, minor')] val fieldname' = Save.new () val fieldname = (* fieldname should just be token, but the stupid Microsoft server * includes spaces in its "Content Location" field, so we need to accept * more. The easies thing is just to take anything but a ":". *) (* save (token, fieldname') *) save (star (notChar #":"), fieldname') val fieldcontent = (* fieldcontent should just be TEXT, but nytimes stores control * characters in cookies, and thus, need to allow more. *) (*TEXT *) isChar (fn c => c >= #" ") val fieldvalue' = Save.new () val fieldvalue = star (or [fieldcontent, LWS]) val messageheader = Promise.lazy (fn () => compileDFA (seq [fieldname, char #":", save (optional fieldvalue, fieldvalue'), CRLF])) val method' = Save.new () val method = save (token, method') val star' = Save.new () val absoluteUrl' = Save.new () val absPath' = Save.new () val authority' = Save.new () val query' = Save.new () val requestUrl = let open Url.Regexp in or [save (char #"*", star'), save (absoluteUrl, absoluteUrl'), seq [save (absPath, absPath'), optional (seq [char #"?", save (query, query')])], save (authority, authority')] end val requestLine = Promise.lazy (fn () => compileDFA (seq [method, SP, requestUrl, SP, version, CRLF])) val contentLength = Promise.lazy (fn () => compileDFA (oneOrMore DIGIT)) val status' = Save.new () val status = save (seq [DIGIT, DIGIT, DIGIT], status') val reason = star (isChar (fn c => Char.isPrint c andalso c <> #"\r" andalso c <> #"\n")) val responseLine = Promise.lazy (fn () => compileDFA (seq [version, SP, status, SP, reason, CRLF])) end structure Method = struct datatype t = Connect | Delete | Extension of string | Get | Head | Options | Post | Put | Trace val map = [(Connect, "CONNECT"), (Delete, "DELETE"), (Get, "GET"), (Head, "HEAD"), (Options, "OPTIONS"), (Post, "POST"), (Put, "PUT"), (Trace, "TRACE")] fun fromString s = case List.peek (map, fn (_, s') => s = s') of NONE => Extension s | SOME (h, _) => h fun toString h = case h of Extension s => s | _ => #2 (valOf (List.peek (map, fn (h', _) => h = h'))) val layout = Layout.str o toString end structure Version = struct datatype t = T of {major: int, minor: int} fun toString (T {major, minor}) = concat ["HTTP/", Int.toString major, ".", Int.toString minor] val layout = Layout.str o toString val v10 = T {major = 1, minor = 0} val v11 = T {major = 1, minor = 1} fun extract m = T (let open Regexp fun int s = valOf (Int.fromString (Substring.toString (Match.lookup (m, s)))) in {minor = int minor', major = int major'} end) end structure RequestUrl = struct structure Path = Url.Path datatype t = Star | Url of Url.t | Path of {path: Path.t, query: string option} | Authority of string val toString = fn Star => "*" | Url url => Url.toString url | Path {path, query} => concat [Path.toString path, case query of NONE => "" | SOME q => concat ["?", if !Url.escapeQuery then Url.escape q else q]] | Authority s => s val layout = Layout.str o toString end exception ParseError structure Header = struct datatype t = Accept of string | AcceptCharset of string | AcceptEncoding of string | AcceptLanguage of string | AcceptRanges of string | Age of string | Allow of string | Authorization of string | CacheControl of string | Connection of string | ContentEncoding of string | ContentLanguage of string | ContentLength of int | ContentLocation of string | ContentMD5 of string | ContentRange of string | ContentType of string | Cookie of string | Date of string | ETag of string | Expect of string | Expires of string | Extension of {name: string, value: string} | From of string | Host of string | IfMatch of string | LastModified of string | Location of string | Pragma of string | ProxyAuthenticate of string | ProxyConnection of string | Referer of string | RetryAfter of string | Server of string | SetCookie of string | Trailer of string | TransferEncoding of string | Upgrade of string | UserAgent of string | Vary of string | Via of string | WWWAuthenticate of string | Warning of string val toString = fn Accept s => concat ["Accept: ", s] | AcceptCharset s => concat ["Accept-Charset: ", s] | AcceptEncoding s => concat ["Accept-Encoding: ", s] | AcceptLanguage s => concat ["Accept-Language: ", s] | AcceptRanges s => concat ["Accept-Ranges: ", s] | Age s => concat ["Age: ", s] | Allow s => concat ["Allow: ", s] | Authorization s => concat ["Authorization: Basic ", Base64.encode s] | CacheControl s => concat ["Cache-Control: ", s] | Connection s => concat ["Connection: ", s] | ContentEncoding s => concat ["Content-Encoding: ", s] | ContentLanguage s => concat ["Content-Language: ", s] | ContentLength s => concat ["Content-Length: ", Int.toString s] | ContentLocation s => concat ["Content-Location: ", s] | ContentMD5 s => concat ["Content-MD5: ", s] | ContentRange s => concat ["Content-Range: ", s] | ContentType s => concat ["Content-Type: ", s] | Cookie s => concat ["Cookie: ", s] | Date s => concat ["Date: ", s] | ETag s => concat ["Etag: ", s] | Expect s => concat ["Expect: ", s] | Expires s => concat ["Expires: ", s] | Extension {name, value} => concat [name, ": ", value] | From s => concat ["From: ", s] | Host s => concat ["Host: ", s] | IfMatch s => concat ["If-Match: ", s] | LastModified s => concat ["Last-Modified: ", s] | Location s => concat ["Location: ", s] | Pragma s => concat ["Pragma: ", s] | ProxyAuthenticate s => concat ["Proxy-Authenticate: ", s] | ProxyConnection s => concat ["Proxy-Connection: ", s] | Referer s => concat ["Referer: ", s] | RetryAfter s => concat ["Retry-After: ", s] | Server s => concat ["Server: ", s] | SetCookie s => concat ["Set-Cookie: ", s] | Trailer s => concat ["Trailer: ", s] | TransferEncoding s => concat ["Transfer-Encoding: ", s] | Upgrade s => concat ["Upgrade: ", s] | UserAgent s => concat ["User-Agent: ", s] | Vary s => concat ["Vary: ", s] | Via s => concat ["Via: ", s] | WWWAuthenticate s => concat ["WWW-Authenticate: ", s] | Warning s => concat ["Warning: ", s] val layout = Layout.str o toString fun toStrings (hs: t list): string list = List.concatMap (hs, fn h => [toString h, "\r\n"]) val cons: string -> string -> t option = String.memoizeList (fn s => fn s' => SOME (Extension {name = s, value = s'}), [("accept", SOME o Accept), ("accept-charset", SOME o AcceptCharset), ("accept-encoding", SOME o AcceptEncoding), ("accept-language", SOME o AcceptLanguage), ("accept-ranges", SOME o AcceptRanges), ("age", SOME o Age), ("allow", SOME o Allow), ("authorization", let open Regexp val enc = Save.new () val reg = compileNFA (seq [string "Basic ", save (anys, enc)]) in fn s => let in Option.map (Compiled.matchAll (reg, s), fn m => Authorization (Base64.decode (Match.lookupString (m, enc)))) end end), ("cache-control", SOME o CacheControl), ("connection", SOME o Connection), ("content-encoding", SOME o ContentEncoding), ("content-language", SOME o ContentLanguage), ("content-length", fn (s: string) => let open Regexp in if Regexp.Compiled.matchesAll (contentLength (), s) then Option.map (Int.fromString s, ContentLength) else NONE end), ("content-location", SOME o ContentLocation), ("content-md5", SOME o ContentMD5), ("content-range", SOME o ContentRange), ("content-type", SOME o ContentType), ("cookie", SOME o Cookie), ("date", SOME o Date), ("etag", SOME o ETag), ("expect", SOME o Expect), ("expires", SOME o Expires), ("from", SOME o From), ("host", SOME o Host), ("if-match", SOME o IfMatch), ("last-modified", SOME o LastModified), ("location", SOME o Location), ("pragma", SOME o Pragma), ("proxy-authenticate", SOME o ProxyAuthenticate), ("proxy-connection", SOME o ProxyConnection), ("referer", SOME o Referer), ("retry-after", SOME o RetryAfter), ("server", SOME o Server), ("set-cookie", SOME o SetCookie), ("trailer", SOME o Trailer), ("transfer-encoding", SOME o TransferEncoding), ("upgrade", SOME o Upgrade), ("user-agent", SOME o UserAgent), ("vary", SOME o Vary), ("via", SOME o Via), ("www-authenticate", SOME o WWWAuthenticate), ("warning", SOME o Warning)]) fun fromString (s: string): t list Result.t = let val no = Result.No (concat ["invalid header: ", s]) val n = String.size s fun loop (i: int, ac: t list) = if i = n then Result.Yes (rev ac) else let open Regexp in case Compiled.matchLong (messageheader (), s, i) of NONE => no | SOME m => let val {lookup, ...} = Match.stringFuns m val fieldname = String.toLower (lookup fieldname') val fieldvalue = String.dropl (lookup fieldvalue', Char.isSpace) in case cons fieldname fieldvalue of NONE => no | SOME header => loop (i + Match.length m, header :: ac) end end in loop (0, []) end val fromString = Trace.trace ("Http.Header.fromString", String.layout, Result.layout (List.layout layout)) fromString fun input (ins: In.t): t list Result.t = let fun loop (headers: string list): string list = case In.inputLine ins of NONE => headers | SOME l => if l = "\r\n" then headers else loop (l :: headers) in fromString (concat (rev (loop []))) end end structure Request = struct datatype t = T of {method: Method.t, url: RequestUrl.t, version: Version.t, headers: Header.t list} val regexp = Regexp.requestLine fun toString (T {method, url, version, headers}) = concat ([Method.toString method, " ", RequestUrl.toString url, " ", Version.toString version, "\r\n"] @ Header.toStrings headers @ ["\r\n"]) val layout = Layout.str o toString fun output (r, out) = Out.output (out, toString r) fun requestLine (s: string) = let open Regexp in Option.map (Compiled.matchAll (requestLine (), s), fn m => let val {peek, lookup, exists, ...} = Match.stringFuns m val method = Method.fromString (lookup method') open RequestUrl val url = if exists star' then Star else if exists absoluteUrl' then Url (Url.getMatch m) else (case peek authority' of NONE => Path {path = Url.Regexp.getAbsPath m, query = Url.Regexp.peekQuery m} | SOME s => Authority s) val version = Version.extract m in {method = method, url = url, version = version} end) end val requestLine = Trace.trace ("Http.Request.requestLine", String.layout, Option.layout (fn {method, url, version} => Layout.record [("method", Method.layout method), ("url", RequestUrl.layout url), ("version", Version.layout version)])) requestLine val requestIsValid = Option.isSome o requestLine fun input (ins: In.t): t Result.t = case In.inputLine ins of NONE => Result.No "" | SOME l => case requestLine l of NONE => Result.No l | SOME {method, url, version} => Result.map (Header.input ins, fn hs => T {method = method, url = url, version = version, headers = hs}) val input = Trace.trace ("Http.Request.input", In.layout, Result.layout layout) input end structure Rope = struct datatype t = Appends of t list | File of File.t | String of string val appends = Appends val file = File val string = String val empty = String "" fun sizePlus (r: t, ac: int): int = case r of Appends rs => List.fold (rs, ac, sizePlus) | File f => ac + Position.toInt (File.size f) | String s => ac + String.size s fun size (r: t): int = sizePlus (r, 0) fun toStrings (r: t, ac: string list): string list = case r of Appends rs => List.fold (rev rs, ac, toStrings) | File f => File.contents f :: ac | String s => s :: ac fun toString (r: t): string = concat (toStrings (r, [])) fun output (r: t, out: Out.t): unit = let fun loop (r: t): unit = case r of Appends rs => List.foreach (rs, loop) | File f => File.outputContents (f, out) | String s => Out.output (out, s) in loop r end end structure Post = struct structure Encoding = struct datatype t = Url | Multipart end structure Value = struct datatype t = File of File.t | String of string val file = File val string = String fun toString (v: t): string = case v of File f => File.contents f | String s => s fun toRope (v: t): Rope.t = case v of File f => Rope.file f | String s => Rope.string s end datatype t = T of {encoding: Encoding.t, fields: {name: string, value: Value.t} list} fun dquote s = concat ["\"", s, "\""] fun encode (T {encoding, fields}): {contentType: string} * Rope.t = case encoding of Encoding.Url => ({contentType = "application/x-www-form-urlencoded"}, List.fold (rev fields, Rope.empty, fn ({name, value}, r) => let val value = String.translate (Value.toString value, fn c => if Char.isAlphaNum c then Char.toString c else (case c of #" " => "+" | #"\n" => "%0D%0A" | _ => Url.Char.escapeHex c)) in Rope.appends [Rope.string (concat [name, "="]), Rope.string value, Rope.string "&", r] end)) | Encoding.Multipart => let val boundary = String.tabulate (56, fn i => if i < 28 then #"-" else Random.charFrom "0123456789") in ({contentType = concat ["multipart/form-data; boundary=", boundary]}, List.foldr (fields, Rope.string (concat ["--", boundary, "--"]), fn ({name, value}, rope) => let val extra = case value of Value.File f => concat ["; filename=", dquote f] | Value.String _ => "" in Rope.appends [Rope.string (concat ["--", boundary, "\r\n", "Content-Disposition: form-data; name=", dquote name, extra, "\r\n\r\n"]), Value.toRope value, Rope.string "\r\n", rope] end)) end end (* ------------------------------------------------- *) (* fetch *) (* ------------------------------------------------- *) structure Path = Url.Path fun fetch {head: bool, headers: Header.t list, post: Post.t option, proxy: {host: string, port: int} option, url: Url.t}: In.t = let open Url in case url of Url.T {authority = SOME {user, host, port}, fragment, path, query, scheme = SOME Scheme.Http} => let val headers = Header.Host host :: headers val (method, headers, postit) = case post of NONE => (if head then Method.Head else Method.Get, headers, fn _ => ()) | SOME post => let datatype z = datatype Post.Encoding.t val ({contentType}, rope) = Post.encode post val headers = headers @ [Header.ContentType contentType, Header.ContentLength (Rope.size rope)] in (Method.Post, headers, fn out => (Rope.output (rope, out) ; Out.output (out, "\r\n"))) end val (scheme, authority) = if Option.isSome proxy then (SOME Scheme.Http, SOME {user = NONE, host = host, port = port}) else (NONE, NONE) val url = Url.T {scheme = scheme, authority = authority, path = path, query = query, fragment = NONE} val headers = case user of NONE => headers | SOME user => Header.Authorization user :: headers val request = Request.T {method = method, url = RequestUrl.Url url, version = Version.v10, headers = headers} val (ins, out) = Net.connect (case proxy of NONE => {host = host, port = (case port of NONE => 80 | SOME p => p)} | SOME hp => hp) val print = Out.outputc out val () = Request.output (request, out) val () = postit out val () = Out.close out in ins end | _ => Error.bug (concat ["Htt.fetch: ", Url.toString url]) end val fetch = Trace.trace ("Http.fetch", fn {url, ...} => Url.layout url, Layout.ignore) fetch (* ------------------------------------------------- *) (* Status *) (* ------------------------------------------------- *) structure Status = struct datatype t = Accepted | BadGateway | BadRequest | Conflict | Continue | Created | ExpectationFailed | Extension of string | Forbidden | Found | GatewayTimeout | Gone | HTTPVersionNotSupported | InternalServerError | LengthRequired | MethodNotAllowed | MovedPermanently | MultipleChoices | NoContent | NonAuthoritativeInformation | NotAcceptable | NotFound | NotImplemented | NotModified | OK | PartialContent | PaymentRequired | PreconditionFailed | ProxyAuthenticationRequired | RequestEntityTooLarge | RequestTimeout | RequestUriTooLarge | RequestedRangeNotSatisfiable | ResetContent | SeeOther | ServiceUnavailable | SwitchingProtocols | TemporaryRedirect | Unauthorized | UnsupportedMediaType | UseProxy val all = [(Continue, "100", "Continue"), (SwitchingProtocols, "101", "Switching Protocols"), (OK, "200", "OK"), (Created, "201", "Created"), (Accepted, "202", "Accepted"), (NonAuthoritativeInformation, "203", "Non-Authoritative Information"), (NoContent, "204", "No Content"), (ResetContent, "205", "Reset Content"), (PartialContent, "206", "Partial Content"), (MultipleChoices, "300", "Multiple Choices"), (MovedPermanently, "301", "Moved Permanently"), (Found, "302", "Found"), (SeeOther, "303", "See Other"), (NotModified, "304", "Not Modified"), (UseProxy, "305", "Use Proxy"), (TemporaryRedirect, "307", "Temporary Redirect"), (BadRequest, "400", "Bad Request"), (Unauthorized, "401", "Unauthorized"), (PaymentRequired, "402", "Payment Required"), (Forbidden, "403", "Forbidden"), (NotFound, "404", "Not Found"), (MethodNotAllowed, "405", "Method Not Allowed"), (NotAcceptable, "406", "Not Acceptable"), (ProxyAuthenticationRequired, "407", "Proxy Authentication Required"), (RequestTimeout, "408", "Request Time-out"), (Conflict, "409", "Conflict"), (Gone, "410", "Gone"), (LengthRequired, "411", "Length Required"), (PreconditionFailed, "412", "Precondition Failed"), (RequestEntityTooLarge, "413", "Request Entity Too Large"), (RequestUriTooLarge, "414", "Request-URI Too Large"), (UnsupportedMediaType, "415", "Unsupported Media Type"), (RequestedRangeNotSatisfiable, "416", "Requested range not satisfiable"), (ExpectationFailed, "417", "Expectation Failed"), (InternalServerError, "500", "Internal Server Error"), (NotImplemented, "501", "Not Implemented"), (BadGateway, "502", "Bad Gateway"), (ServiceUnavailable, "503", "Service Unavailable"), (GatewayTimeout, "504", "Gateway Time-out"), (HTTPVersionNotSupported, "505", "HTTP Version not supported")] val all = List.revMap (all, fn (status, code, reason) => {status = status, code = code, reason = reason}) fun fromString s = case List.peek (all, fn {code, ...} => s = code) of NONE => Extension s | SOME {status, ...} => status local fun make (ext, sel) (s: t) = case s of Extension c => ext c | _ => sel (valOf (List.peek (all, fn {status, ...} => s = status))) in val code = make (fn c => c, #code) val reason = make (fn _ => "Extension Status Code - No Reason", #reason) end end (* ------------------------------------------------- *) (* Response *) (* ------------------------------------------------- *) structure Response = struct datatype t = T of {version: Version.t, status: Status.t, headers: Header.t list} val regexp = Regexp.responseLine fun toString (T {version, status, headers}) = concat ([Version.toString version, " ", Status.code status, " ", Status.reason status, "\r\n"] @ Header.toStrings headers @ ["\r\n"]) val layout = Layout.str o toString fun output (r, out) = Out.output (out, toString r) fun input (ins: In.t): t Result.t = case In.inputLine ins of NONE => Result.No "" | SOME l => let open Regexp in case Compiled.matchAll (responseLine (), l) of NONE => Result.No l | SOME m => let val {lookup, ...} = Match.stringFuns m val version = Version.extract m val status = Status.fromString (lookup status') in Result.map (Header.input ins, fn hs => T {version = version, status = status, headers = hs}) end end end end mlton-20100608/lib/mlton/basic/inet-sock.sml0000644000076600000240000000003611404435636017155 0ustar mtfstaffstructure INetSock = INetSock mlton-20100608/lib/mlton/basic/init-script.sig0000644000076600000240000000067311404435636017524 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INIT_SCRIPT = sig val startStop: {name: string, action: string, log: File.t, thunk: unit -> unit, usage: string -> unit} -> unit end mlton-20100608/lib/mlton/basic/init-script.sml0000644000076600000240000000610711404435636017533 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure InitScript: INIT_SCRIPT = struct val messageStr = Trace.Immediate.messageStr val op / = String./ (* Losely based on /etc/sysconfig/init *) local open Console open Foreground CharRendition fun make (settings, msg) = let val color = concat [moveToColumn 60, "[ ", set settings, msg, set [Default], " ]\n"] val normal = concat [" [ ", msg, " ]\n"] in fn () => print (case Process.getEnv "TERM" of SOME "linux" => color | SOME "xterm" => color | _ => normal) end in val succeed = make ([Bold, Foreground BrightGreen], "OK") val fail = make ([Bold, Foreground BrightRed], "FAILED") val warn = make ([Bold, Foreground Yellow], "PASSED") end fun wrap (th: unit -> unit): unit = ((th () handle e => (fail (); raise e)) ; succeed ()) fun startStop {name, action, log, thunk, usage} = let val me = Pid.current () fun getProc () = List.peek (Process.ps (), fn {name = n, pid, ...} => n = name andalso not (Pid.equals (me, pid))) val isRunning = isSome o getProc fun start () = if isRunning () then print (concat [name, " is already running\n"]) else wrap (fn () => let val _ = print (concat ["Starting ", name, ":"]) val _ = Out.close Out.error val _ = Out.set (Out.error, Out.openAppend log) val _ = Process.doubleFork (fn () => let val _ = In.close In.standard val _ = Out.close Out.standard val _ = Posix.ProcEnv.setpgid {pid = NONE, pgid = NONE} val _ = Signal.setHandler (Posix.Signal.term, Signal.Handler.handler (fn _ => Thread.new (fn () => (messageStr "received Signal.term -- exiting" ; Process.succeed ())))) in thunk () end) in () end) fun status () = print (concat [name, if isRunning () then " is running\n" else " is not running\n"]) fun stop () = case getProc () of NONE => print (concat [name, " is not running\n"]) | SOME {pgrp, ...} => wrap (fn () => (print (concat ["Shutting down ", name, ":"]) ; Process.signalGroup (pgrp, Posix.Signal.term))) in case action of "start" => start () | "status" => status () | "stop" => stop () | _ => usage "must start|status|stop" end end mlton-20100608/lib/mlton/basic/insertion-sort.sig0000644000076600000240000000076411404435636020257 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INSERTION_SORT = sig (* The comparison function ('a * 'a -> bool) for should be the <= funtion, * not just <. * This is necessary to handle duplicate elements. *) val sort: 'a array * ('a * 'a -> bool) -> unit end mlton-20100608/lib/mlton/basic/insertion-sort.sml0000644000076600000240000000335411404435636020266 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure InsertionSort: INSERTION_SORT = struct open Array (* Based on page 108 of Programming Pearls, by Bentley. *) fun sort (a: 'a array, op <= : 'a * 'a -> bool): unit = let fun x i = sub (a, i) val _ = Int.for (1, Array.length a, fn i => let val _ = if true then () else Assert.assert ("InsertionSort.sort: 1", fn () => Array.isSortedRange (a, 0, i, op <=)) val t = x i fun sift (j: int) = (if true then () else Assert.assert ("InsertionSort.sort: 2", fn () => Array.isSortedRange (a, 0, j, op <=) andalso Array.isSortedRange (a, j + 1, i + 1, op <=) andalso Int.forall (j + 1, i + 1, fn k => t <= x k)) ; if j > 0 then let val j' = j - 1 val z = x j' in if z <= t then j else (update (a, j, z) ; sift j') end else j) val _ = update (a, sift i, t) in () end) val _ = Assert.assert ("InsertionSort.sort: 3", fn () => isSorted (a, op <=)) in () end end mlton-20100608/lib/mlton/basic/instream.sig0000644000076600000240000000264611404435636017103 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INSTREAM = sig type t val close: t -> unit val endOf: t -> bool val foldChars: t * 'a * (char * 'a -> 'a) -> 'a (* Each line includes the newline. *) val foldLines: t * 'a * (string * 'a -> 'a) -> 'a val foreachLine: t * (string -> unit) -> unit val ignoreSpaces: t -> unit val input: t -> string val inputAll: t -> string val inputChar: t -> char option val inputLine: t -> string option val inputN: t * int -> string val inputNothing: t -> unit (* inputTo(i, p) inputs up to but not including the first char * that satisfies p. *) val inputTo: t * (char -> bool) -> string val inputToChar: t * char -> string val inputToSpace: t -> string val layout: t -> Layout.t (* Each line includes the newline. *) val lines: t -> string list val openIn: string -> t val openString: string -> t val outputAll: t * Out.t -> unit val peekChar: t -> char option val sameContents: t * t -> bool (* val set: t * t -> unit *) val standard: t val withClose: t * (t -> 'a) -> 'a val withNull: (t -> 'a) -> 'a end mlton-20100608/lib/mlton/basic/instream.sml0000644000076600000240000000201111404435636017076 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Instream: INSTREAM = struct open Instream0 structure String = ZString val input = Trace.trace ("Instream.input", layout, String.layout) input fun outputAll (ins: t, out: Out.t): unit = let fun loop () = case input ins of "" => () | s => (Out.output (out, s); loop ()) in loop () end val inputLine = Trace.trace ("Instream.inputLine", layout, Option.layout String.layout) inputLine fun 'a withClose (ins: t, f: t -> 'a): 'a = Exn.finally (fn () => f ins, fn () => close ins) fun 'a withIn (f: string, g: t -> 'a): 'a = withClose (openIn f handle IO.Io _ => Error.bug (concat ["Instream.withIn: cannot open ", f]), g) fun withNull f = withIn ("/dev/zero", f) fun lines ins = rev (foldLines (ins, [], op ::)) end structure In = Instream mlton-20100608/lib/mlton/basic/instream0.sml0000644000076600000240000000434211404435636017167 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Instream0 = struct structure String = String0 structure Char = String.Char structure I = Pervasive.TextIO open I type t = I.instream val standard = stdIn val close = closeIn val inputChar = input1 val peekChar = lookahead val endOf = endOfStream fun foldChars (ins, a, f) = let fun loop a = case inputLine ins of NONE => a | SOME l => loop (String.fold (l, a, f)) in loop a end fun foldLines (ins, ac, f) = let fun loop ac = case inputLine ins of NONE => ac | SOME l => loop (f (l, ac)) in loop ac end fun foreachLine (ins, f) = foldLines (ins, (), f o #1) fun inputTo (i: t, p: char -> bool): string = let val maxListLength = 1000 fun finish chars = String.rev (String.implode chars) fun loop (n, chars, strings) = case peekChar i of NONE => (chars, strings) | SOME c => if p c then (chars, strings) else let val chars = c :: chars val _ = inputChar i in if n > 0 then loop (n - 1, chars, strings) else loop (maxListLength, [], finish chars :: strings) end val (chars, strings) = loop (maxListLength, [], []) in concat (rev (finish chars :: strings)) end fun sameContents (in1, in2) = let fun loop () = case (input1 in1, input1 in2) of (NONE, NONE) => true | (SOME c1, SOME c2) => Char.equals (c1, c2) andalso loop () | _ => false in loop () end fun inputToSpace i = inputTo (i, Char.isSpace) fun inputToChar (i, c) = inputTo (i, fn c' => Char.equals (c, c')) fun ignoreSpaces i = ignore (inputTo (i,not o Char.isSpace)) fun inputNothing _ = () fun layout _ = Layout.str "" (*val set = MLton.TextIO.setIn *) end structure In0 = Instream0 mlton-20100608/lib/mlton/basic/int-inf.sig0000644000076600000240000000110311404435636016610 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INT_INF = sig include INTEGER val andb: t * t -> t val hash: t -> word val log2: t -> Int.t val maxPow2ThatDivides: t -> word val notb: t -> t val orb: t * t -> t val xorb: t * t -> t val << : t * Pervasive.Word.word -> t val ~>> : t * Pervasive.Word.word -> t end mlton-20100608/lib/mlton/basic/int-inf.sml0000644000076600000240000000312511404435636016627 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure IntInf: INTEGER = Integer (open Pervasive.IntInf fun toIntInf x = x) structure IntInf: INT_INF = struct open IntInf val hash = let val prime = (Word.toIntInf o Word.~ o Word.fromInt) (case Word.wordSize of 6 => 3 | 7 => 1 | 8 => 5 | 14 => 3 | 15 => 19 | 16 => 15 | 30 => 35 | 31 => 1 | 32 => 5 | 62 => 57 | 63 => 25 | 64 => 59 | 126 => 137 | 127 => 1 | 128 => 159 | _ => Error.bug "Unknown Word.wordSize") in fn i => Word.fromIntInf (i mod prime) end local open Pervasive.IntInf in val andb = andb val log2 = log2 val notb = notb val orb = orb val xorb = xorb val op ~>> = ~>> val op << = << end structure M = MaxPow2ThatDivides (open IntInf val andb = andb val orb = orb val << = << val >> = ~>>) open M end structure LargeInt = IntInf mlton-20100608/lib/mlton/basic/int.sml0000644000076600000240000000236611404435636016063 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Int: sig include INTEGER val maxInt: t option val minInt: t option val precision: Pervasive.Int.int option val roundDownToPowerOfTwo: t -> t val roundUpToPowerOfTwo: t -> t val toReal: t -> real end = struct structure Int = Pervasive.Int structure I = Integer(open Int fun divMod(a, b) = (a div b, a mod b) fun quotRem(a, b) = (quot(a, b), rem(a, b)) val toIntInf = Pervasive.IntInf.fromInt) open I fun roundDownToPowerOfTwo (i: t): t = Word.toInt (Word.roundDownToPowerOfTwo (Word.fromInt i)) fun roundUpToPowerOfTwo (i: t): t = let val i' = roundDownToPowerOfTwo i in if i = i' then i else i' * 2 end type int = t val maxInt = Int.maxInt val minInt = Int.minInt val precision = Int.precision val toReal = Pervasive.Real.fromInt end mlton-20100608/lib/mlton/basic/integer.fun0000644000076600000240000000725011404435636016720 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Integer (S: INTEGER_STRUCTS): INTEGER = struct open S structure In = In0 structure Int = struct open S type t = int val zero = fromInt 0 val layout = Layout.str o toString val equals = op = end structure R = OrderedRing (structure R = RingWithIdentity (structure R = Ring (Int) open R S val one = fromInt 1) open R S val {compare, ...} = Relation.lessEqual {< = op <, equals = equals}) open R S exception Input fun input i = (In.ignoreSpaces i ; (case fromString (In.inputToSpace i) of NONE => raise Input | SOME n => n)) structure I = EuclideanRing (open R S val metric = toIntInf o abs val monics = Stream.infinite (two, fn n => n + one) val unitEquivalent = abs) open I fun isEven n = isZero (n mod two) val isOdd = not o isEven fun toCommaString n = let fun loop (chars, accum) = let fun done () = implode (rev chars @ accum) in case chars of x1 :: x2 :: x3 :: chars => (case chars of [] => done () | [#"~"] => done () | _ => loop (chars, #"," :: x3 :: x2 :: x1 :: accum)) | _ => done () end in loop (rev (explode (toString n)), []) end fun choose (n, k) = let val k = max (k, n - k) in prodFromTo {from = add1 k, to = n, term = fn i => i} div factorial (n - k) end fun output (n, out) = Out.output (out, toString n) fun largest (i, f) = let fun loop (n: t) = if f n then n else loop (sub1 n) in loop i end fun smallest (i, f) = let fun loop (n: t) = if f n then n else loop (add1 n) in loop i end fun least (start: t, stop: t, f: int -> bool): int option = let fun loop (i: t) = if i >= stop then NONE else if f i then SOME i else loop (i + one) in loop start end fun 'a fold (start: t, stop: t, a: 'a, f: int * 'a -> 'a): 'a = let val _ = Assert.assert ("Integer.fold", fn () => start <= stop + one) fun loop (i: t, a: 'a): 'a = if i >= stop then a else loop (i + one, f (i, a)) in loop (start, a) end fun forall (start: t, stop: t, f: int -> bool): bool = Exn.withEscape (fn escape => (fold (start, stop, (), fn (i, ()) => if f i then () else escape false) ; true)) fun exists (start, stop, f) = not (forall (start, stop, not o f)) fun 'a foldDown (start: t, stop: t, a: 'a, f: int * 'a -> 'a): 'a = let val _ = Assert.assert ("Integer.foldDown", fn () => start <= stop + one) fun loop (i: t, a: 'a) = if i < start then a else loop (sub1 i, f (i, a)) in loop (sub1 stop, a) end fun map (start: t, stop: t, f: t -> 'a): 'a list = foldDown (start, stop, [], fn (i, l) => f i :: l) fun for (start: t, stop: t, f: t -> unit): unit = fold (start, stop, (), f o #1) fun forDown (start: t, stop: t, f: t -> unit): unit = foldDown (start, stop, (), f o #1) fun scan (radix, reader) = Int.scan radix reader fun format (i, r) = fmt r i end mlton-20100608/lib/mlton/basic/integer.sig0000644000076600000240000000623311404435636016712 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INTEGER_STRUCTS = sig eqtype int val * : int * int -> int val + : int * int -> int val - : int * int -> int val < : int * int -> bool val <= : int * int -> bool val > : int * int -> bool val >= : int * int -> bool val abs: int -> int val compare: int * int -> order val div: int * int -> int val divMod: int * int -> int * int val fmt: StringCvt.radix -> int -> string val fromInt: Pervasive.Int.int -> int val fromLarge: Pervasive.LargeInt.int -> int val fromString: string -> int option val max: int * int -> int val maxInt: int option val min: int * int -> int val minInt: int option val mod: int * int -> int val precision: Pervasive.Int.int option val quot: int * int -> int val quotRem: int * int -> int * int val rem: int * int -> int val sameSign: int * int -> bool val scan: StringCvt.radix -> (char, 'a) StringCvt.reader -> (int, 'a) StringCvt.reader val sign: int -> Pervasive.Int.int val toInt: int -> Pervasive.Int.int val toIntInf: int -> Pervasive.IntInf.int val toLarge: int -> Pervasive.LargeInt.int val toString: int -> string val ~ : int -> int end signature INTEGER = sig include EUCLIDEAN_RING type int = t val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val abs: t -> t val choose: t * t -> t val compare: t * t -> Relation.t val exists: t * t * (t -> bool) -> bool val factorial: t -> t val fold: t * t * 'a * (t * 'a -> 'a) -> 'a val foldDown: t * t * 'a * (t * 'a -> 'a) -> 'a val for: t * t * (t -> unit) -> unit val forall: t * t * (t -> bool) -> bool val format: t * StringCvt.radix -> string val forDown: t * t * (t -> unit) -> unit val fromString: string -> t option exception Input val input: In0.t -> t val isEven: t -> bool val isNegative: t -> bool val isOdd: t -> bool val isPositive: t -> bool (* largest (i, f) is the largest j <= i such that f j *) val largest: t * (t -> bool) -> t val least: t * t * (t -> bool) -> t option val map: t * t * (t -> 'a) -> 'a list val max: t * t -> t val min: t * t -> t val output: t * Out.t -> unit val quot: t * t -> t val quotRem: t * t -> t * t val rem: t * t -> t val scan: (StringCvt.radix * (char, 'a) StringCvt.reader) -> (t, 'a) StringCvt.reader (* smallest (i, f) is the smallest j >= i such that f j *) val smallest: t * (t -> bool) -> t (* val sum: {from: t, to: t, term: t -> t} -> t *) val toCommaString: t -> string val toInt: t -> Pervasive.Int.int val toIntInf: t -> Pervasive.IntInf.int val toLarge: t -> Pervasive.LargeInt.int val toString: t -> string end mlton-20100608/lib/mlton/basic/intermediate-computation.sig0000644000076600000240000000124511404435636022265 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INTERMEDIATE_COMPUTATION_STRUCTS = sig end signature INTERMEDIATE_COMPUTATION = sig include INTERMEDIATE_COMPUTATION_STRUCTS structure Computation: COMPUTATION type t val empty: unit -> t val call: t * string * (unit -> Layout.t) -> unit val raisee: t * Time.t option -> unit val return: t * (unit -> Layout.t) * Time.t option -> unit val finish: t -> Computation.t val atTopLevel: t -> bool end mlton-20100608/lib/mlton/basic/intermediate-computation.sml0000644000076600000240000002211611404435636022276 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure IntermediateComputation: INTERMEDIATE_COMPUTATION = struct structure In = In0 structure Int = Pervasive.Int structure Result = struct datatype t = Raise | Return of unit -> Layout.t local open Layout in fun layout r = case r of Raise => str "raise" | Return f => f() end end structure Computation = struct structure Time = Time datatype t = T of callResult list withtype callResult = {name: string, layoutArg: unit -> Layout.t, time: Time.t option, body: t, result: Result.t} structure CR = struct open Layout type t = callResult fun layoutName({name, ...}:t) = str(name ^ " ") fun layoutCall(cr as {layoutArg, ...}:t) = seq[layoutName cr, layoutArg()] val darrow = str "==> " fun layoutDarrow _ = darrow fun layoutTime({time, ...}:t) = case time of SOME t => Time.layout t | NONE => empty fun layoutReturn({result, ...}:t) = seq[darrow, Result.layout result] end fun time(T crs) = List.fold(crs, Time.zero, fn ({time, ...}, t) => case time of NONE => t | SOME t' => Time.+(t, t')) fun keepAll(c, pred) = let fun keepAll(T crs) = T(List.foldr(crs, [], fn ({name, body, layoutArg, time, result}, crs) => let val body as T crs' = keepAll body in if pred name then {name = name, body = body, layoutArg = layoutArg, time = time, result = result} :: crs else crs' @ crs end)) in keepAll c end fun makeOutputs(pre, post, filter) out = let val indentation = ref 0 val space = 3 fun left() = indentation := !indentation - space fun right() = indentation := !indentation + space fun print l = (Layout.output(Layout.indent(l, !indentation), out) ; Out.newline out) fun output(T crs) = List.foreach(crs, outputCr) and outputCr(cr as {body, ...}) = let val printCr = filter cr in if printCr then (print(pre cr); right()) else () ; output body ; if printCr then (left(); print(post cr)) else () end in (output, outputCr) end val makeOutput = makeOutputs(CR.layoutCall, CR.layoutReturn, fn _ => true) fun output(c, out) = #1(makeOutput out) c fun outputCr(cr, out) = #2(makeOutput out) cr val makeOutputCalls = makeOutputs(CR.layoutName, CR.layoutDarrow, fn _ => true) fun outputCalls(c, out) = #1(makeOutputCalls out) c fun outputCrCalls(cr, out) = #2(makeOutputCalls out) cr fun outputTimes(c, out) = #1(makeOutputs(CR.layoutName, CR.layoutTime, fn {time, ...} => case time of NONE => false | SOME _ => true) out) c local val out = Out.error val print = Out.outputc out structure Int = struct open Int exception Input fun input i = (In.ignoreSpaces i ; (case fromString(In.inputToSpace i) of NONE => raise Input | SOME n => n)) fun inputBetween{ins, error: unit -> unit, min, max} = let fun loop() = let fun continue() = (error() ; loop()) in let val n = input ins in if min <= n andalso n <= max then n else continue() end handle Input => continue() end in loop() end val layout = Layout.str o toString end fun inputBetween(min, max) = Int.inputBetween{ins = In.standard, error = fn () => Out.output(out, "? "), min = min, max = max} fun choose (choices: (string * 'a) list): 'a = let val n = List.fold(choices, 0, fn ((name, _),n) => (Layout.output(Int.layout n, out) ; print(concat[". ", name, "\n"]) ; n+1)) val _ = Out.output(out, "? ") val m = inputBetween(0,n-1) in #2(List.nth(choices, m)) end fun chooseThunk cs = choose cs () exception Quit exception Back val standardChoices = [("quit", fn () => raise Quit), ("back", fn () => raise Back)] fun inspect(c as T crs) = case crs of [cr] => inspectCr cr | _ => let fun loop() = (chooseThunk (standardChoices @ [("skip raises", fn () => (skipRaises c; raise Back)), ("output", fn () => output(c, out)), ("output calls", fn () => outputCalls(c, out))] @ choices c) ; loop()) in loop() handle Back => () end and choices(T crs) = List.map(crs, fn cr as {name, ...} => (" " ^ name, fn () => inspectCr cr)) and inspectCr(cr as {name, layoutArg, body, result, time = _}) = (print(concat["Call to ", name, "\n"]) ; let fun loop() = (chooseThunk (standardChoices @ [("skip raises", fn () => (skipRaisesCr cr; raise Back)), ("output", fn () => outputCr(cr, out)), ("output calls", fn () => outputCrCalls(cr, out)), ("argument", fn () => (Layout.output(layoutArg(), out) ; Out.newline out)), ("result", fn () => (Layout.output(Result.layout result, out) ; Out.newline out))] @ choices body) ; loop()) in loop() handle Back => () end) and skipRaises(c as T crs) = case crs of [] => () | _ => (skipRaisesCr(List.last crs) ; inspect c) and skipRaisesCr(cr as {result, body, ...}) = (case result of Result.Raise => skipRaises body | Result.Return _ => () ; inspectCr cr) in val inspect = fn c => inspect c handle Quit => () end end (*---------------------------------------------------*) (* Main Datatype *) (*---------------------------------------------------*) datatype t = T of {calls: {name: string, layoutArg: unit -> Layout.t, prev: Computation.callResult list} list ref, after: Computation.callResult list ref} fun empty() = T{calls = ref [], after = ref []} fun atTopLevel(T{calls, ...}) = List.isEmpty(!calls) fun call(T{calls, after},name, layoutArg) = (List.push(calls, {name = name, layoutArg = layoutArg, prev = !after}) ; after := []) fun return(T{calls, after}, result, time) = case !calls of [] => Error.bug "IntermediateComputation.return: without a call" | {name, layoutArg, prev} :: cs => (calls := cs ; after := {name = name, layoutArg = layoutArg, result = result, time = time, body = Computation.T(List.rev(!after))} :: prev) fun raisee(c, t) = return(c, Result.Raise, t) val return = fn (c, r, t) => return(c, Result.Return r, t) fun finish(c as T{calls, after}) = let fun loop() = case !calls of [] => Computation.T(List.rev(!after)) | _ => (raisee(c, NONE); loop()) in loop() end end mlton-20100608/lib/mlton/basic/iterate.sig0000644000076600000240000000073511404435636016713 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ITERATE = sig val iterate: 'a * ('a -> bool) * ('a -> 'a) -> 'a (* iterate(s, p, f) = f(...f(f(s))) until satisfies p *) val whileDo: (unit -> bool) * (unit -> unit) -> unit val repeatUntil: (unit -> unit) * (unit -> bool) -> unit end mlton-20100608/lib/mlton/basic/iterate.sml0000644000076600000240000000125011404435636016715 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Iterate *) (*-------------------------------------------------------------------*) structure Iterate: ITERATE = struct fun iterate(start, isTerm,next) = let fun loop s = if isTerm s then s else loop(next s) in loop start end fun whileDo(test, f) = iterate((),not o test, f) fun repeatUntil(f, test) = (f() ; iterate((), test, f)) end mlton-20100608/lib/mlton/basic/itimer.sml0000644000076600000240000000035011404435636016551 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Itimer = MLton.Itimer mlton-20100608/lib/mlton/basic/justify.sig0000644000076600000240000000121511404435636016745 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature JUSTIFY = sig datatype t = Left | Center | Right val justify: string * int * t -> string val outputTable: string list list * Out.t -> unit val table: {columnHeads: string list option, justs: t list, rows: string list list} -> string list list val tableOfColumns: (t * string list) list -> string list list end mlton-20100608/lib/mlton/basic/justify.sml0000644000076600000240000000627211404435636016766 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Justify: JUSTIFY = struct structure C = Char structure S = String datatype t = Left | Center | Right val toString = fn Left => "Left" | Center => "Center" | Right => "Right" val layout = Layout.str o toString fun spaces n = S.make (n, C.space) fun justify (s, width, just) = let val numchars = S.size s val numspaces = width - numchars in S.concat (case just of Left => [s, spaces numspaces] | Center => let val numLeft = numspaces div 2 val numRight = numspaces - numLeft in [spaces numLeft, s, spaces numRight] end | Right => [spaces numspaces, s]) end fun table {columnHeads: string list option, justs: t list, rows: string list list} = let val headsAndRows = case columnHeads of NONE => rows | SOME h => h :: rows val maxs = List.fold (headsAndRows, List.revMap (justs, fn _ => 0), fn (row, ms) => List.map2 (row, ms, fn (s, m) => Int.max (m, String.size s))) val rows = List.map (rows, fn row => List.map3 (row, maxs, justs, justify)) val rows = case columnHeads of NONE => rows | SOME heads => let val heads = List.map2 (heads, maxs, fn (s, i) => justify (s, i, Center)) val dashes = List.map (maxs, fn i => String.make (i, #"-")) in heads :: dashes :: rows end in rows end val table = Trace.trace ("Justify.table", fn {columnHeads, justs, rows} => Layout.record [("columnHeads", Option.layout (List.layout String.layout) columnHeads), ("justs", List.layout layout justs), ("rows", List.layout (List.layout String.layout) rows)], List.layout (List.layout String.layout)) table fun tableOfColumns (columns: (t * string list) list) = let val justs = List.map (columns, #1) val columns = List.map (columns, #2) fun loop (columns: string list list, ac: string list list) = if List.isEmpty (hd columns) then rev ac else loop (List.map (columns, tl), List.map (columns, hd) :: ac) val rows = loop (columns, []) in table {columnHeads = NONE, justs = justs, rows = rows} end fun outputTable (t, out) = let val print = Out.outputc out in List.foreach (t, fn ss => (case ss of [] => () | s :: ss => (print s ; List.foreach (ss, fn s => (print " "; print s))) ; print "\n")) end end mlton-20100608/lib/mlton/basic/large-word.sml0000644000076600000240000000057411404435636017333 0ustar mtfstaff(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure LargeWord: WORD = struct open Pervasive.LargeWord structure Z = FixWord (Pervasive.LargeWord) open Z val equals: t * t -> bool = op = end mlton-20100608/lib/mlton/basic/layout.sig0000644000076600000240000000444411404435636016574 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LAYOUT = sig type t (* layout the objects on separate lines*) val align: t list -> t val alignPrefix: t list * string -> t val array: t array -> t (* Whether or not to print things in detail - * routines that create layouts should use this flag to decide * how detailed to print. *) val detailed: bool ref val empty: t val ignore: 'a -> t val isEmpty: t -> bool val makeOutput: ('a -> t) -> 'a * Outstream0.t -> unit (* layout the objects on separate lines, if necessary *) val mayAlign: t list -> t val namedRecord: string * (string * t) list -> t (* indent the entire object *) val indent: t * int -> t val list: t list -> t val output: t * Outstream0.t -> unit val outputl: t * Outstream0.t -> unit val outputTree: t * Outstream0.t -> unit val outputWidth: t * int * Outstream0.t -> unit val paren: t -> t (* print the object *) val print: t * (string -> unit) -> unit val record: (string * t) list -> t val schemeList: t list -> t (* put string between elements *) val separate: t list * string -> t list (* adds string at beginning of all objects except first *) val separateLeft: t list * string -> t list (* adds string at the end of all objects except last *) val separateRight: t list * string -> t list (* layout the objects on the same line *) val seq: t list -> t (* convert a string to a layout object *) val str: string -> t val switch: {detailed: 'a -> t, normal: 'a -> t} -> 'a -> t val toString: t -> string val tuple: t list -> t val tuple2: ('a -> t) * ('b -> t) -> 'a * 'b -> t val tuple3: ('a -> t) * ('b -> t) * ('c -> t) -> 'a * 'b * 'c -> t val tuple4: ('a -> t) * ('b -> t) * ('c -> t) * ('d -> t) -> 'a * 'b * 'c * 'd -> t val tuple5: ('a -> t) * ('b -> t) * ('c -> t) * ('d -> t) * ('e -> t) -> ('a * 'b * 'c * 'd * 'e) -> t val vector: t vector -> t end mlton-20100608/lib/mlton/basic/layout.sml0000644000076600000240000001702211404435636016601 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Layout: LAYOUT = struct structure Out = Outstream0 structure Int = Pervasive.Int val detailed = ref false fun switch {detailed = d,normal = n} x = if !detailed then d x else n x structure String = String0 datatype t = T of {length: int, tree: tree} and tree = Empty | String of string | Sequence of t list | Align of {force: bool, rows: t list} | Indent of t * int fun length (T {length, ...}) = length val empty = T {length = 0, tree = Empty} fun isEmpty (T {length = 0, ...}) = true | isEmpty _ = false fun str s = case s of "" => empty | _ => T {length = String.size s, tree = String s} fun fold (l, b, f) = foldl f b l fun seq ts = let val len = fold (ts, 0, fn (t,n) => n + length t) in case len of 0 => empty | _ => T {length = len, tree = Sequence ts} end local fun make force ts = let fun loop ts = case ts of [] => (ts, 0) | t :: ts => let val (ts, n) = loop ts in case length t of 0 => (ts, n) | n' => (t :: ts, n + n' + 1) end val (ts, len) = loop ts in case len of 0 => empty | _ => T {length = len - 1, tree = Align {force = force, rows = ts}} end in val align = make true val mayAlign = make false end fun indent (t, n) = T {length = length t, tree = Indent (t, n)} val tabSize: int = 8 fun blanks (n: int): string = concat [String.make (n div tabSize, #"\t"), String.make (n mod tabSize, #" ")] fun outputTree (t, out) = let val print = Out.outputc out fun loop (T {tree, length}) = (print "(length " ; print (Int.toString length) ; print ")" ; (case tree of Empty => print "Empty" | String s => (print "(String "; print s; print ")") | Sequence ts => loops ("Sequence", ts) | Align {rows, ...} => loops ("Align", rows) | Indent (t, n) => (print "(Indent " ; print (Int.toString n) ; print " " ; loop t ; print ")"))) and loops (s, ts) = (print "(" ; print s ; app (fn t => (print " " ; loop t)) ts ; print ")") in loop t end fun toString t = let fun loop (T {tree, ...}, accum) = case tree of Empty => accum | String s => s :: accum | Sequence ts => fold (ts, accum, loop) | Align {rows, ...} => (case rows of [] => accum | t :: ts => fold (ts, loop (t, accum), fn (t, ac) => loop (t, " " :: ac))) | Indent (t, _) => loop (t, accum) in String.concat (rev (loop (t, []))) end fun print {tree: t, print: string -> unit, lineWidth: int} = let (*val _ = outputTree (t, out)*) fun newline () = print "\n" fun outputCompact (t, {at, printAt = _}) = let fun loop (T {tree, ...}) = case tree of Empty => () | String s => print s | Sequence ts => app loop ts | Indent (t, _) => loop t | Align {rows, ...} => case rows of [] => () | t :: ts => (loop t ; app (fn t => (print " "; loop t)) ts) val at = at + length t in loop t ; {at = at, printAt = at} end fun loop (t as T {length, tree}, state as {at, printAt}) = let fun prePrint () = if at >= printAt then () (* can't back up *) else print (blanks (printAt - at)) in (*Out.print (concat ["at ", Int.toString at, * " printAt ", Int.toString printAt, * "\n"]); *) (*outputTree (t, Out.error)*) case tree of Empty => state | Indent (t, n) => loop (t, {at = at, printAt = printAt + n}) | Sequence ts => fold (ts, state, loop) | String s => (prePrint () ; print s ; let val at = printAt + length in {at = at, printAt = at} end) | Align {force, rows} => if not force andalso printAt + length <= lineWidth then (prePrint () ; outputCompact (t, state)) else (case rows of [] => state | t :: ts => fold (ts, loop (t, state), fn (t, _) => (newline () ; loop (t, {at = 0, printAt = printAt})))) end in ignore (loop (tree, {at = 0, printAt = 0})) end fun outputWidth (t, width, out) = print {tree = t, lineWidth = width, print = Out.outputc out} local val defaultWidth: int = 80 in fun output (t, out) = outputWidth (t, defaultWidth, out) val print = fn (t, p) => print {tree = t, lineWidth = defaultWidth, print = p} end fun outputl (t, out) = (output (t, out); Out.newline out) fun makeOutput layoutX (x, out) = output (layoutX x, out) fun ignore _ = empty fun separate (ts, s) = case ts of [] => [] | t :: ts => t :: (let val s = str s fun loop [] = [] | loop (t :: ts) = s :: t:: (loop ts) in loop ts end) fun separateLeft (ts, s) = case ts of [] => [] | [_] => ts | t :: ts => t :: (map (fn t => seq [str s, t]) ts) fun separateRight (ts, s) = rev (let val ts = rev ts in case ts of [] => [] | [_] => ts | t :: ts => t :: (map (fn t => seq [t, str s]) ts) end) fun alignPrefix (ts, prefix) = case ts of [] => empty | t :: ts => mayAlign [t, indent (mayAlign (map (fn t => seq [str prefix, t]) ts), ~ (String.size prefix))] local fun sequence (start, finish, sep) ts = seq [str start, mayAlign (separateRight (ts, sep)), str finish] in val list = sequence ("[", "]", ",") val schemeList = sequence ("(", ")", " ") val tuple = sequence ("(", ")", ",") fun record fts = sequence ("{", "}", ",") (map (fn (f, t) => seq [str (f ^ " = "), t]) fts) end fun vector v = tuple (Pervasive.Vector.foldr (op ::) [] v) structure Array = struct open Pervasive.Array fun toList a = foldr (op ::) [] a end val array = list o Array.toList fun namedRecord (name, fields) = seq [str name, str " ", record fields] fun paren t = seq [str "(", t, str ")"] fun tuple2 (l1, l2) (x1, x2) = tuple [l1 x1, l2 x2] fun tuple3 (l1, l2, l3) (x1, x2, x3) = tuple [l1 x1, l2 x2, l3 x3] fun tuple4 (l1, l2, l3, l4) (x1, x2, x3, x4) = tuple [l1 x1, l2 x2, l3 x3, l4 x4] fun tuple5 (l1, l2, l3, l4, l5) (x1, x2, x3, x4, x5) = tuple [l1 x1, l2 x2, l3 x3, l4 x4, l5 x5] end mlton-20100608/lib/mlton/basic/lines.sig0000644000076600000240000000102411404435636016360 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LINES = sig (* Print out starting at line start and dropping the last lines. *) val dropLast: In.t * Out.t * {start: int, last: int} -> unit (* Print out lines start through stop. *) val startStop: In.t * Out.t * {start: int, stop: int} -> unit end mlton-20100608/lib/mlton/basic/lines.sml0000644000076600000240000000337311404435636016402 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Lines: LINES = struct fun startStop(ins, out, {start: int, stop: int}): unit = let val _ = Assert.assert("Lines.startStop", fn () => start <= stop) fun loop i = if i > stop then () else (case In.inputLine ins of NONE => () | SOME l => (if i >= start then Out.output(out, l) else (); loop(i + 1))) in loop 0 end fun dropLast (ins, out, {start: int, last: int}): unit = let val _ = Assert.assert ("Lines.dropLast", fn () => start >= 0 andalso last >= 0) fun line () = In.inputLine ins val _ = Int.for (0, start, fn _ => ignore (line ())) in if last = 0 then In.outputAll (ins, out) else let val q = Int.fold (0, last, Queue.empty (), fn (_, q) => Queue.enque (q, case line () of NONE => "" | SOME l => l)) fun loop (q: string Queue.t) = case line () of NONE => () | SOME l => let val q = Queue.enque (q, l) val (q, l') = valOf (Queue.deque q) val _ = Out.output (out, l') in loop q end in loop q end end end mlton-20100608/lib/mlton/basic/linked-list.sig0000644000076600000240000000330411404435636017470 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LINKED_LIST = sig type 'a t val empty: unit -> 'a t val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val fromList: 'a list -> 'a t val layout: ('a -> Layout.t) -> 'a t -> Layout.t (* in-place reverse *) val reverse: 'a t -> unit (* splice (l, r) extends l with r *) val splice: 'a t * 'a t -> unit val toList: 'a t -> 'a list val unfold: 'a * ('a -> ('b * 'a) option) -> 'b t val unfoldi: int * 'a * (int * 'a -> 'b * 'a) -> 'b t val unfoldr: 'a * ('a -> ('b * 'a) option) -> 'b t val unfoldri: int * 'a * (int * 'a -> 'b * 'a) -> 'b t end functor TestLinkedList (S: LINKED_LIST): sig end = struct open S val _ = Assert.assert ("TestLinkedList", fn () => List.forall ([[], [1], [1, 2], [1, 2, 3]], fn l => l = toList (fromList l) andalso rev l = toList (let val l' = fromList l val _ = reverse l' in l' end) andalso let val l' = fromList l val l'' = fromList l val _ = splice (l', l'') in l @ l = toList l' end)) end mlton-20100608/lib/mlton/basic/linked-list.sml0000644000076600000240000001124711404435636017506 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure LinkedList: LINKED_LIST = struct structure Node = struct datatype 'a t = T of {elt: 'a, next: 'a t option ref} fun new elt = T {elt = elt, next = ref NONE} fun cons (elt, next) = T {elt = elt, next = ref (SOME next)} fun clearNext (T {next, ...}) = next := NONE fun setNext (T {next, ...}, n) = next := SOME n fun fold (n, ac, f) = let fun loop (T {elt, next}, ac) = let val ac = f (elt, ac) in case !next of NONE => ac | SOME n => loop (n, ac) end in loop (n, ac) end end datatype 'a t = T of {first: 'a Node.t option ref, last: 'a Node.t option ref} fun invariant (T {first, last}) = case (!first, !last) of (NONE, NONE) => true | (SOME _, SOME (Node.T {next, ...})) => not (isSome (!next)) | _ => false fun fold (T {first, ...}, ac, f) = case !first of NONE => ac | SOME n => Node.fold (n, ac, f) fun toList l = rev (fold (l, [], op ::)) fun layout layoutX l = List.layout layoutX (toList l) fun empty () = T {first = ref NONE, last = ref NONE} fun splice (T {first = f, last = l}, T {first = f', last = l'}): unit = case (!l, !f') of (NONE, NONE) => () | (NONE, _) => (f := !f'; l := !l') | (_, NONE) => () | (SOME ln, SOME f'n) => (Node.setNext (ln, f'n) ; l := !l') val ('a, 'b) unfoldr: 'a * ('a -> ('b * 'a) option) -> 'b t = fn (a, f) => case f a of NONE => empty () | SOME (b, a) => let val last = Node.new b fun loop (a: 'a, n: 'b Node.t): 'b Node.t = case f a of NONE => n | SOME (b, a) => loop (a, Node.cons (b, n)) val first = loop (a, last) in T {first = ref (SOME first), last = ref (SOME last)} end val unfoldri: int * 'a * (int * 'a -> 'b * 'a) -> 'b t = fn (n, a, f) => if n < 0 then Error.bug "LinkedList.unfoldri" else unfoldr ((n - 1, a), fn (i, a) => if i < 0 then NONE else let val (b, a) = f (i, a) in SOME (b, (i - 1, a)) end) val ('a, 'b) unfold: 'a * ('a -> ('b * 'a) option) -> 'b t = fn (a, f) => case f a of NONE => empty () | SOME (b, a) => let val first = Node.new b fun loop (a: 'a, n: 'b Node.t): 'b Node.t = case f a of NONE => n | SOME (b, a) => let val n' = Node.new b val _ = Node.setNext (n, n') in loop (a, n') end val last = loop (a, first) in T {first = ref (SOME first), last = ref (SOME last)} end val unfoldi: int * 'a * (int * 'a -> 'b * 'a) -> 'b t = fn (n, a, f) => if n < 0 then Error.bug "LinkedList.unfoldi" else unfold ((0, a), fn (i, a) => if i >= n then NONE else let val (b, a') = f (i, a) in SOME (b, (i + 1, a')) end) fun reverse (ll as T {first, last}) = (if invariant ll then () else Out.output (Out.error, "reverse 1\n") ; case !first of NONE => () | SOME (n as Node.T {next, ...}) => case !next of NONE => () | SOME n' => let val _ = Node.clearNext n fun loop (n, n' as Node.T {next, ...}) = let val no = !next val _ = next := SOME n in case no of NONE => () | SOME n'' => loop (n', n'') end val _ = loop (n, n') val _ = Ref.swap (first, last) in () end ; if invariant ll then () else Out.output (Out.error, "reverse 2\n")) fun fromList l = unfold (l, fn [] => NONE | x :: l => SOME (x, l)) end mlton-20100608/lib/mlton/basic/list.sig0000644000076600000240000001774711404435636016244 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LIST = sig type 'a t = 'a list val allButLast: 'a t -> 'a t val append: 'a t * 'a t -> 'a t (* appendMap (l1, f, l2) = append (map (l1, f), l2) *) val appendMap: 'a t * ('a -> 'b) * 'b t -> 'b t (* appendRev (l1, l2) = append (rev l1, l2) *) val appendRev: 'a t * 'a t -> 'a t val compare: 'a t * 'a t * ('a * 'a -> order) -> order (* concat [[1, 2], [3, 4, 5], [6]] = [1, 2, 3, 4, 5, 6] *) val concat: 'a t t -> 'a t (* concatMap = concat o map *) val concatMap: 'a t * ('a -> 'b t) -> 'b t (* concatRev = concat o rev *) val concatRev: 'a t t -> 'a t val cons: 'a * 'a t -> 'a t val contains: 'a t * 'a * ('a * 'a -> bool) -> bool (* cross [[1, 2, 3], [4, 5], [6, 7]] = * [[1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], * [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], * [3, 4, 6], [3, 4, 7], [3, 5, 6], [3, 5, 7]] *) val cross: 'a t t -> 'a t t val dropPrefix: 'a t * int -> 'a t val dropSuffix: 'a t * int -> 'a t (* duplicate (3, f) = [f (), f (), f ()] *) val duplicate: int * (unit -> 'a) -> 'a t (* Extract each element paired with the elements before it * and after it in the same order as in the list. *) (* val each: 'a t -> ('a t * 'a * 'a t) t *) val equals: 'a t * 'b t * ('a * 'b -> bool) -> bool val equalsAsSet: 'a t * 'a t * ('a * 'a -> bool) -> bool (* Group according to equivalence relation. *) val equivalence: 'a t * ('a * 'a -> bool) -> 'a t t val exists: 'a t * ('a -> bool) -> bool val first: 'a t -> 'a val firstN: 'a t * int -> 'a t val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val fold2: 'a t * 'b t * 'c * ('a * 'b * 'c -> 'c) -> 'c val fold3: 'a t * 'b t * 'c t * 'd * ('a * 'b * 'c * 'd -> 'd) -> 'd val foldi: 'a t * 'b * (int * 'a * 'b -> 'b) -> 'b val foldr: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foldr2: 'a t * 'b t * 'c * ('a * 'b * 'c -> 'c) -> 'c val forall: 'a t * ('a -> bool) -> bool val forall2: 'a t * 'b t * ('a * 'b -> bool) -> bool val foralli: 'a t * (int * 'a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val foreach2: 'a t * 'b t * ('a * 'b -> unit) -> unit (* val foreach3: 'a t * 'b t * 'c t * ('a * 'b * 'c -> unit) -> unit *) val foreachi: 'a t * (int * 'a -> unit) -> unit val index: 'a t * ('a -> bool) -> int option (* Insert an element in a list sorted in increasing order. * Return the original list if the the element is already there. *) val insert: 'a t * 'a * ('a * 'a -> bool) -> 'a t val insertionSort: 'a t * ('a * 'a -> bool) -> 'a t val isEmpty: 'a t -> bool val isPrefix: 'a t * 'a t * ('a * 'a -> bool) -> bool val keepAll: 'a t * ('a -> bool) -> 'a t val keepAllMap: 'a t * ('a -> 'b option) -> 'b t val last: 'a t -> 'a val layout: ('a -> Layout.t) -> 'a t -> Layout.t (* Specify a string to separate the elements *) (* val layoutSep: string * ('a -> Layout.t) -> 'a t -> Layout.t *) val length: 'a t -> int val map: 'a t * ('a -> 'b) -> 'b t val mapi: 'a t * (int * 'a -> 'b) -> 'b t val map2: 'a t * 'b t * ('a * 'b -> 'c) -> 'c t val map3: 'a t * 'b t * 'c t * ('a * 'b * 'c -> 'd) -> 'd t (* val map4: 'a t * 'b t * 'c t * 'd t * ('a * 'b * 'c * 'd -> 'e) -> 'e t *) val nth: 'a t * int -> 'a val nthTail: 'a t * int -> 'a t (* val ordered : * {< : 'a * 'a -> bool} * -> {insert: 'a t * 'a -> 'a t, * insertionSort: 'a t -> 'a t, * median: 'a t -> 'a, * orderStatistic: 'a t * int -> 'a, * partition: 'a t * 'a -> 'a t * 'a t, * max: 'a t -> 'a, * min: 'a t -> 'a, * largest: 'a t * int -> 'a t, * smallest: 'a t * int -> 'a t} *) (* partition ([1, 2, 3, 4], isOdd) = {no = [4, 2], yes = [3, 1]} *) val partition: 'a t * ('a -> bool) -> {no: 'a t, yes: 'a t} val peek: 'a t * ('a -> bool) -> 'a option val peeki: 'a t * (int * 'a -> bool) -> (int * 'a) option val peekMap: 'a t * ('a -> 'b option) -> 'b option (* Removes first element if it exists. * Returns NONE if pred is false on everything. *) (* val peekRemove: 'a t * ('a -> bool) -> ('a t * 'a) option *) val pop: 'a t ref -> 'a val power: 'a t -> 'a t t (* val prefixes: 'a t -> 'a t t*) val push: 'a t ref * 'a -> unit (* Removes first element on which predicate is true. * Returns original list if predicate is false on every elt. *) val remove: 'a t * ('a -> bool) -> 'a t (* removeAll (l, f) removes all x in l such that f x and reverses order. *) val removeAll: 'a t * ('a -> bool) -> 'a t val removeCommonPrefix: 'a t * 'a t * ('a * 'a -> bool) -> 'a t * 'a t val removeDuplicates: 'a t * ('a * 'a -> bool) -> 'a t (* Error if predicate isn't true on some element. *) val removeFirst: 'a t * ('a -> bool) -> 'a t val removePrefix: 'a t * ('a -> bool) -> 'a t val rev: 'a t -> 'a t (* The "rev" versions of functions are there for efficiency, when it is * easier to fold over the input and accumulate the result in reverse. *) val revMap: 'a t * ('a -> 'b) -> 'b t val revKeepAll: 'a t * ('a -> bool) -> 'a t val revKeepAllMap: 'a t * ('a -> 'b option) -> 'b t val revRemoveAll: 'a t * ('a -> bool) -> 'a t val separate: 'a t * 'a -> 'a t val set: {equals: 'a * 'a -> bool, layout: 'a -> Layout.t} -> {empty: 'a t, singleton: 'a -> 'a t, size: 'a t -> int, equals: 'a t * 'a t -> bool, <= : 'a t * 'a t -> bool, >= : 'a t * 'a t -> bool, < : 'a t * 'a t -> bool, > : 'a t * 'a t -> bool, + : 'a t * 'a t -> 'a t, - : 'a t * 'a t -> 'a t, intersect: 'a t * 'a t -> 'a t, unions: 'a t t -> 'a t, add: 'a t * 'a -> 'a t, remove: 'a t * 'a -> 'a t, contains: 'a t * 'a -> bool, areDisjoint: 'a t * 'a t -> bool, subset: 'a t * ('a -> bool) -> 'a t, subsetSize: 'a t * ('a -> bool) -> int, replace: 'a t * ('a -> 'a option) -> 'a t, map: 'a t * ('a -> 'a) -> 'a t, layout: 'a t -> Layout.t} (* val splitAtMost: 'a t * int -> ('a t * 'a t) option *) val splitAt: 'a t * int -> 'a t * 'a t val splitLast: 'a t -> 'a t * 'a val splitPrefix: 'a t * ('a -> bool) -> 'a t * 'a t (* val suffixes: 'a t -> 'a t t *) (* subsets (l, n) = subsets of exactly size n *) val subsets: 'a t * int -> 'a t t val tabulate: int * (int -> 'a) -> 'a t (* val tail: 'a t -> 'a t *) val toString: ('a -> string) -> 'a t -> string val unfold: 'a * ('a -> ('b * 'a) option) -> 'b t val unfoldi: int * 'a * (int * 'a -> 'b * 'a) -> 'b t val unfoldr: 'a * ('a -> ('b * 'a) option) -> 'b t val unfoldri: int * 'a * (int * 'a -> 'b * 'a) -> 'b t val union: 'a t * 'a t * ('a * 'a -> bool) -> 'a t val unzip: ('a * 'b) t -> 'a t * 'b t (* val unzip3: ('a * 'b * 'c) t -> 'a t * 'b t * 'c t *) val zip: 'a t * 'b t -> ('a * 'b) t (* val zip3: 'a t * 'b t * 'c t -> ('a * 'b * 'c) t *) end functor TestList (S: LIST): sig end = struct val _ = print "TestList\n" open S val _ = Assert.assert ("TestList", fn () => SOME true = peekMap ([1, 2, 3], fn x => if x = 2 then SOME true else NONE) andalso ([2], [3]) = removeCommonPrefix ([1, 2], [1, 3], op =) andalso [2, 4, 6] = keepAll ([1, 2, 3, 4, 5, 6], fn x => 0 = x mod 2)) end mlton-20100608/lib/mlton/basic/list.sml0000644000076600000240000003722111404435636016242 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure List: LIST = struct structure Int = Pervasive.Int structure F = struct type 'a t = 'a list fun fold (l, b, f) = let fun loop (l, b) = case l of [] => b | x :: l => loop (l, f (x, b)) in loop (l, b) end end structure F = Fold (open F type 'a elt = 'a) open F fun dropPrefix (l: 'a t, n: int): 'a t = if n = 0 then l else case l of [] => Error.bug "List.dropPrefix" | _ :: l => dropPrefix (l, n - 1) fun dropSuffix (l, n: int) = rev (dropPrefix (rev l, n)) fun nth (l, i: int) = let fun loop (l, i) = case l of [] => Error.bug "List.nth" | x :: l => if i = 0 then x else loop (l, i - 1) in if i < 0 then Error.bug "List.nth" else loop (l, i) end fun exists (l, f) = let fun loop l = case l of [] => false | x :: l => f x orelse loop l in loop l end fun first l = case l of [] => Error.bug "List.first" | x :: _ => x fun forall (l, f) = let fun loop l = case l of [] => true | x :: l => f x andalso loop l in loop l end fun foralli (l, f) = let fun loop (l, i: int) = case l of [] => true | x :: l => f (i, x) andalso loop (l, i + 1) in loop (l, 0) end fun fold2 (l1, l2, b, f) = let fun loop (l1, l2, b) = case (l1, l2) of ([], []) => b | (x1 :: l1, x2 :: l2) => loop (l1, l2, f (x1, x2, b)) | _ => Error.bug "fold2" in loop (l1, l2, b) end fun fold3 (l1, l2, l3, b, f) = let fun loop (l1, l2, l3, b) = case (l1, l2, l3) of ([], [], []) => b | (x1 :: l1, x2 :: l2, x3 :: l3) => loop (l1, l2, l3, f (x1, x2, x3, b)) | _ => Error.bug "fold3" in loop (l1, l2, l3, b) end fun foreach2 (l1, l2, f) = fold2 (l1, l2, (), fn (x1, x2, ()) => f (x1, x2)) fun index (l, f) = let fun loop (l, i: int) = case l of [] => NONE | x :: l => if f x then SOME i else loop (l, i + 1) in loop (l, 0) end fun isEmpty l = case l of [] => true | _ :: _ => false fun peek (l, f) = let fun loop l = case l of [] => NONE | x :: l => if f x then SOME x else loop l in loop l end fun peeki (l, f) = let fun loop (l, i: int) = case l of [] => NONE | x :: l => if f (i, x) then SOME (i, x) else loop (l, i + 1) in loop (l, 0) end fun peekMap (l, f) = let fun loop l = case l of [] => NONE | x :: l => (case f x of NONE => loop l | SOME x => SOME x) in loop l end fun appendRev (l, l') = fold (l, l', op ::) fun append (l, l') = appendRev (rev l, l') fun rev l = appendRev (l, []) fun foldr (l, b, f) = fold (rev l, b, f) fun foldr2 (l1, l2, b, f) = fold2 (rev l1, rev l2, b, f) fun revMap (l, f) = fold (l, [], fn (x, l) => f x :: l) fun map (l, f) = rev (revMap (l, f)) fun map2 (l1, l2, f) = rev (fold2 (l1, l2, [], fn (x1, x2, l) => f (x1, x2) :: l)) fun map3 (l1, l2, l3, f) = rev (fold3 (l1, l2, l3, [], fn (x1, x2, x3, l) => f (x1, x2, x3) :: l)) local fun make (l1, l2, f, unequal) = let val rec loop = fn ([], []) => true | (x1 :: l1, x2 :: l2) => f (x1, x2) andalso loop (l1, l2) | _ => unequal () in loop (l1, l2) end in fun forall2 (l1, l2, f) = make (l1, l2, f, fn () => Error.bug "forall2") fun equals (l1, l2, f) = make (l1, l2, f, fn () => false) end val cons = op :: fun compare (l, l', comp) = let val rec compare = fn ([], []) => EQUAL | (_, []) => GREATER | ([], _) => LESS | (x :: l, x' :: l') => (case comp (x, x') of EQUAL => compare (l, l') | r => r) in compare (l, l') end fun allButLast l = case rev l of _ :: l => rev l | _ => Error.bug "List.allButLast" fun zip (l1, l2) = foldr2 (l1, l2, [], fn (x1, x2, l) => (x1, x2) :: l) fun unzip l = foldr (l, ([], []), fn ((x1, x2), (l1, l2)) => (x1 :: l1, x2 :: l2)) fun concatRev l = fold (l, [], append) fun concat l = concatRev (rev l) fun concatMap (l, f) = concatRev (revMap (l, f)) val ('a, 'b) unfoldri: int * 'a * (int * 'a -> 'b * 'a) -> 'b list = fn (n, a, f) => if n < 0 then Error.bug "List.unfoldri" else let fun loop (i, a, bs) = if i < 0 then bs else let val (b, a') = f (i, a) in loop (i - 1, a', b :: bs) end in loop (n - 1, a, []) end val ('a, 'b) unfoldi: int * 'a * (int * 'a -> 'b * 'a) -> 'b list = fn (n, a, f) => if n < 0 then Error.bug "List.unfoldi" else let fun loop (i, a, bs) = if i >= n then rev bs else let val (b, a') = f (i, a) in loop (i + 1, a', b :: bs) end in loop (0, a, []) end fun unfoldr (a, f) = let fun loop (a, bs) = case f a of NONE => bs | SOME (b, a') => loop (a', b :: bs) in loop (a, []) end fun unfold (a, f) = rev (unfoldr (a, f)) fun tabulate (n: int, f) = unfoldri (n, (), fn (i, ()) => (f i, ())) fun duplicate (n, f) = tabulate (n, fn _ => f ()) fun contains (l, x, equals) = exists (l, fn x' => equals (x, x')) fun union (l, l', equals) = fold (l', l, fn (x, l) => if contains (l, x, equals) then l else x :: l) fun pop r = case !r of [] => Error.bug "List.pop" | x :: l => (r := l; x) fun push (r, x) = r := x :: !r fun remFst (l, f, notFound) = let fun loop (l, ac) = case l of [] => notFound () | x :: l => if f x then appendRev (ac, l) else loop (l, x :: ac) in loop (l, []) end fun removeFirst (l, f) = remFst (l, f, fn () => Error.bug "List.removeFirst") fun remove (l, f) = remFst (l, f, fn () => l) fun nthTail (l, n: int) = let fun loop (l, i) = if i <= 0 then l else (case l of [] => Error.bug "List.nthTail" | _ :: l => loop (l, i - 1)) in loop (l, n) end fun firstN (l, n: int) = let fun loop (l, i, ac) = if i <= 0 then rev ac else (case l of [] => Error.bug "List.firstN" | x :: l => loop (l, i - 1, x :: ac)) in loop (l, n, []) end fun 'a ordered {<= : 'a * 'a -> bool} = let fun insert (l, x) = let fun loop (l, ac) = case l of [] => appendRev (ac, [x]) | x' :: l' => if x <= x' then appendRev (ac, x :: l) else loop (l', x' :: ac) in loop (l, []) end fun insertionSort l = fold (l, [], fn (x, ac) => insert (ac, x)) fun partition (ns, x) = fold (ns, ([], []), fn (y, (left, right)) => if x <= y then (left, cons (y, right)) else (cons (y, left), right)) local val columnSize: int = 5 val sort = insertionSort fun breakIntoColumns ns = if Int.< (length ns, columnSize) then cons (ns, []) else cons (firstN (ns, columnSize), breakIntoColumns (nthTail (ns, columnSize))) in fun median ns = orderStatistic (ns, Int.quot (length ns, 2)) and orderStatistic (ns, i) = if Int.< (length ns, columnSize) then nth (sort ns, i) else let val medianOfMedians = median (map (breakIntoColumns ns, columnMedian)) val (left, right) = partition (ns, medianOfMedians) val numLeft = length left in if Int.< (i, numLeft) then orderStatistic (left, i) else orderStatistic (right, i - numLeft) end and columnMedian ns = nth (sort ns, Int.quot (length ns, 2)) end fun choose (op <) (s, n) = let fun insert (x, s) = let fun insert (m, s) = if m >= n then [] else (case s of [] => [x] | y :: s => if x < y then x :: s else y :: insert (m + 1, s)) in insert (0, s) end in firstN (fold (s, [], insert),n) end val smallest = choose (op < : int * int -> bool) val largest = choose (op > : int * int -> bool) fun getFirst (l, extreme, name) = case extreme (l, 1) of x :: _ => x | _ => Error.bug name fun min l = getFirst (l, smallest, "List.ordered.min") fun max l = getFirst (l, largest, "List.ordered.max") in {insert = insert, insertionSort = insertionSort, median = median, orderStatistic = orderStatistic, partition = partition, max = max, min = min, largest = largest, smallest = smallest} end fun insertionSort (l, le) = #insertionSort (ordered {<= = le}) l fun splitLast l = case rev l of [] => Error.bug "List.splitLast" | x :: l => (rev l, x) fun power l = case l of [] => [[]] | x :: l => let val rest = power l in rest @ map (rest, fn s => x :: s) end fun equalsAsSet (l1, l2, equals) = let fun subset (l, l') = forall (l, fn x => exists (l', fn x' => equals (x, x'))) in subset (l1, l2) andalso subset (l2, l1) end fun 'a set {equals: 'a * 'a -> bool, layout: 'a -> Layout.t} = let val equal = equals fun equalTo x x' = equal (x, x') fun contains (s, x) = exists (s, equalTo x) fun s <= s' = forall (s, fn x => contains (s', x)) fun s' >= s = s <= s' val equals = fn (s, s') => s <= s' andalso s' <= s fun s < s' = s <= s' andalso exists (s', fn x => not (contains (s, x))) fun s' > s = s < s' fun singleton (x: 'a) = cons (x, []) fun add (s, x) = if contains (s, x) then s else cons (x, s) fun areDisjoint (s, s') = forall (s, fn x => not (contains (s', x))) (* val subset = keepAll *) fun subset (s: 'a t, p) = fold (s, [], fn (x, s'') => if p x then x::s'' else s'') fun subsetSize (s: 'a t, p) = fold (s, 0: int, fn (x, n) => if p x then n + 1 else n) fun s - s' = subset (s, fn x => not (contains (s', x))) (* fun s + s' = append (s - s', s') *) fun s + s' = fold (s, s', fn (x, s'') => if not (contains (s', x)) then x::s'' else s'') fun intersect (s, s') = subset (s, fn x => contains (s', x)) fun unions ss = fold (ss, [], op +) val size: 'a t -> int = length val layout = fn vs => let open Layout in seq [str "{", align (separateRight (map (vs, layout), ", ")), str "}"] end val remove = fn (s, x) => remove (s, equalTo x) fun replace (s: 'a t, f): 'a t = fold (s, [], fn (x, s) => (case f x of NONE => s | SOME y => add (s, y))) fun map (s: 'a t, f) = replace (s, fn x => SOME (f x)) in {empty = [], singleton = singleton, size = size, equals = equals, <= = op <=, >= = op >=, < = op <, > = op >, + = op +, - = op -, intersect = intersect, unions = unions, add = add, remove = remove, contains = contains, areDisjoint = areDisjoint, subset = subset, subsetSize = subsetSize, map = map, replace = replace, layout = layout} end fun subsets (s, n) = let fun subs (s, size, n, elts, accum) = if n <= 0 then cons (elts, accum) else (case s of x :: xs => if size <= n then cons (cons (x, append (xs, elts)), accum) else subs (xs, size - 1, n - 1, cons (x, elts), subs (xs, size - 1, n, elts , accum)) | _ => Error.bug "List.subsets") in subs (s, length s, n, [], []) end fun appendMap (l1, f, l2) = appendRev (revMap (l1, f), l2) fun separate (ts, s) = case ts of [] => [] | t :: ts => t :: (let val rec loop = fn [] => [] | t :: ts => s :: t:: (loop ts) in loop ts end) fun cross l = case l of [] => [[]] | x :: l => let val rest = cross l in concatMap (x, fn x => map (rest, fn t => x :: t)) end fun removeDuplicates (l, equals) = fold (l, [], fn (x, ac) => if contains (ac, x, equals) then ac else x :: ac) fun removeCommonPrefix (l1, l2, equals) = let fun loop (arg as (l1, l2)) = case (l1, l2) of (_, []) => arg | ([], _) => arg | (x1 :: l1, x2 :: l2) => if equals (x1, x2) then loop (l1, l2) else arg in loop (l1, l2) end fun removePrefix (l, p) = let fun loop l = case l of [] => [] | x :: l' => if p x then loop l' else l in loop l end fun isPrefix (l, l', f) = let val rec loop = fn ([], _) => true | (_, []) => false | (x :: l, x' :: l') => f (x, x') andalso loop (l, l') in loop (l, l') end fun insert (xs, x, op <=) = #insert (ordered {<= = op <=}) (xs, x) fun toString xToString l = Layout.toString (layout (Layout.str o xToString) l) val splitAt: 'a t * int -> 'a t * 'a t = fn (l, i) => let fun loop (i, ac, l) = if i = 0 then (rev ac, l) else case l of [] => Error.bug "List.splitAt" | x :: l => loop (i - 1, x :: ac, l) in loop (i, [], l) end fun splitPrefix (l, p) = let fun loop (l, ac) = case l of [] => (rev ac, []) | x :: l' => if p x then loop (l', x :: ac) else (rev ac, l) in loop (l, []) end fun partition (l, p) = fold (l, {no = [], yes = []}, fn (x, {no, yes}) => if p x then {no = no, yes = x :: yes} else {no = x :: no, yes = yes}) fun equivalence (l, p) = fold (l, [], fn (x, ecs) => let fun loop ([], ecs') = [x]::ecs' | loop (ec::ecs, ecs') = if p (x, hd ec) then fold (ecs, (x::ec)::ecs', op ::) else loop (ecs, ec::ecs') in loop (ecs, []) end) end mlton-20100608/lib/mlton/basic/Makefile0000644000076600000240000000053011404435636016203 0ustar mtfstaff## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: tags tags: etags *.sml *.sig *.fun .PHONY: clean clean: ../../../bin/clean mlton-20100608/lib/mlton/basic/mark.sig0000644000076600000240000000140111404435636016177 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MARK = sig include ORDER val bol: t -> t val forwardChar: t -> t val forwardChars: t * int -> t val fromFile: File.t -> t val fromString: string -> t val int: t -> t * int val nextLine: t -> t val nextLines: t * int -> t val previousLine: t -> t val previousLines: t * int -> t val real: t -> t * real val search: t * string -> t (* right after end of string *) val searchBackward: t * string -> t val skipSpaces: t -> t end mlton-20100608/lib/mlton/basic/mark.sml0000644000076600000240000001040011404435636016207 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Mark: MARK = struct datatype t = T of {string: string, pos: int} fun pos (T {pos, ...}) = pos local val numChars: int = 15 in fun layout (T {string, pos}) = String.layout (String.substring1 (string, {start = pos, length = numChars})) end fun length (T {string, ...}) = String.size string fun isAtBeginning (m: t): bool = pos m = 0 fun isAtEnd (m: t): bool = pos m = length m - 1 fun diff (m: t, m': t): int = pos m - pos m' fun fromString s = T {string = s, pos = 0} fun fromFile f = fromString (File.contents f) fun beginning (T {string, ...}) = T {string = string, pos = 0} exception BackwardChars fun backwardChars (T {string, pos},n) = let val pos = pos - n in if pos < 0 then raise BackwardChars else T {string = string, pos = pos} end fun backwardChar m = backwardChars (m, 1) val backwardChar = Trace.trace ("Mark.backwardChar", layout, layout) backwardChar exception ForwardChars fun forwardChars (T {string, pos},n) = let val pos = pos + n in if pos > String.size string then raise ForwardChars else T {string = string, pos = pos} end fun forwardChar m = forwardChars (m, 1) val forwardChar = Trace.trace ("Mark.forwardChar", layout, layout) forwardChar fun charAt (T {string, pos}) = String.sub (string, pos) fun lookingAtChar (m, c) = Char.equals (charAt m, c) local fun searchChar move (m, c) = let fun loop m = if lookingAtChar (m, c) then m else loop (move m) in loop m end in val searchCharForward = searchChar forwardChar fun searchCharBackward (m, c) = searchChar backwardChar (backwardChar m, c) end fun bol m = forwardChar (searchCharBackward (m, #"\n")) handle _ => beginning m fun eol m = searchCharForward (m, #"\n") fun whatColumn m = diff (m, bol m) fun numColumns m = diff (eol m, bol m) local fun moveLines move = let fun moves (m as T {string, pos}, n: int) = let val c = whatColumn m fun loop (m, n) = if n <= 0 then forwardChars (m, Int.min (c, numColumns m)) else loop (move m, n - 1) in loop (bol m, n) end fun move m = moves (m, 1) in (move, moves) end in val (previousLine, previousLines) = moveLines (bol o backwardChar) val (nextLine, nextLines) = moveLines (forwardChar o eol) end fun lookingAtString (T {string, pos}, string') = let val len = String.size string val len' = String.size string' fun loop (pos, pos') = pos < len andalso (pos' >= len' orelse (Char.equals (String.sub (string, pos), String.sub (string', pos')) andalso loop (pos + 1, pos' + 1))) in loop (pos, 0) end val lookingAtString = Trace.trace2 ("Mark.lookingAtString", layout, String.layout, Bool.layout) lookingAtString exception Search fun makeSearch move (m, s) = let fun search m = if lookingAtString (m, s) then forwardChars (m, String.size s) else (search (move m) handle _ => raise Search) in search m end val search = makeSearch forwardChar val searchBackward = makeSearch backwardChar fun skip p = let fun skip m = if p (charAt m) then skip (forwardChar m) else m in skip end fun skipUntil p = skip (not o p) val skipSpaces = skip Char.isSpace val skipUntilSpace = skipUntil Char.isSpace fun substring (T {string, pos}, T {pos=pos', ...}) = String.substring2 (string, {start=pos, finish=pos'}) fun num (fromString, exn) m = let val m = skipSpaces m val m' = skipUntilSpace m in case fromString (substring (m, m')) of NONE => raise exn | SOME n => (m',n) end exception Int val int = num (Int.fromString, Int) exception Real val real = num (Real.fromString, Real) val real = Trace.trace ("Mark.real", layout, Layout.tuple2 (layout, Real.layout)) real val op < = fn (m, m') => pos m < pos m' val equals = fn (m, m') => pos m = pos m' val {>, >=, <=, min, max, compare} = Relation.lessEqual {< = op <, equals = op =} end mlton-20100608/lib/mlton/basic/max-pow-2-that-divides.fun0000644000076600000240000000424111404435636021372 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MaxPow2ThatDivides (type t val << : t * word -> t val >> : t * word -> t val <= : t * t -> bool val andb: t * t -> t val equals: t * t -> bool val one: t val orb: t * t -> t val zero: t): sig val maxPow2ThatDivides: t -> word end = struct structure Word = Pervasive.Word val maxPow2ThatDivides: t -> word = fn i => let (* b is the number of zero bits we are trying to peel from the * bottom of i. * m = 2^b - 1. m is a mask for the bits we are trying to peel. * 0 < a <= m. * ac is the number of bits that we have already peeled off. *) fun down (b: word, m: t, i: t, ac: word): word = let val b = Word.>> (b, 0w1) in if b = 0w0 then ac else let val m = >> (m, b) val a = andb (i, m) val (i, ac) = if equals (a, zero) then (>> (i, b), ac + b) else (a, ac) in down (b, m, i, ac) end end fun up (b: word, m: t): word = let val a = andb (i, m) in if equals (a, zero) then up (Word.<< (b, 0w1), orb (m, << (m, b))) else down (b, m, a, 0w0) end in if i <= zero then Error.bug "MaxPow2ThatDivides.maxPow2ThatDivides: i <= 0" else up (0w1, one) end end mlton-20100608/lib/mlton/basic/merge-sort.sig0000644000076600000240000000234111404435636017335 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MERGE_SORT = sig type 'a t (* The comparison function ('a * 'a -> bool) for any of these should * always be the <= funtion, not just <. * This is necessary to handle duplicate elements. *) val make: ('a * 'a -> bool) -> {isSorted: 'a t -> bool, merge: 'a t * 'a t -> 'a t, sort: 'a t -> 'a t} val isSorted: 'a t * ('a * 'a -> bool) -> 'a t val merge: 'a t * 'a t * ('a * 'a -> bool) -> 'a t val sort: 'a t * ('a * 'a -> bool) -> 'a t end functor TestMergeSort (S: MERGE_SORT) = struct open S val _ = Assert.assert ("TestMergeSort", fn () => let fun check (l: int list): bool = List.insertionSort (l, op <=) = toList (sort (fromList l, op <=)) in List.forall ([[], [1], [1,2], [1,2,3], [2,1,3], [1,2,3,4,5], [3,5,6,7,8,1,2,3,6,4]], check) end) end mlton-20100608/lib/mlton/basic/merge-sort.sml0000644000076600000240000001453011404435636017351 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MergeSort (S: sig type 'a t val make: ('a * 'a -> bool) -> {isSorted: 'a t -> bool, merge: 'a t * 'a t -> 'a t, sort: 'a t -> 'a t} end): MERGE_SORT = struct open S fun isSorted (l, le) = #isSorted (make le) l fun merge (l, l', le) = #merge (make le) (l, l') fun sort (l, le) = #sort (make le) l end structure MergeSortList: MERGE_SORT = MergeSort (type 'a t = 'a list (* This is a variant of mergesort that runs in O (n log n) time. *) fun make (op <= : 'a * 'a -> bool) = let fun assert f = Assert.assert ("MergeSort.assert", f) fun isSorted l = case l of [] => true | x :: l => let fun loop (x, l) = case l of [] => true | x' :: l => x <= x' andalso loop (x', l) in loop (x, l) end fun merge (l1, l2) = (assert (fn () => isSorted l1 andalso isSorted l2) ; (case (l1, l2) of ([], _) => l2 | (_, []) => l1 | (x1 :: l1', x2 :: l2') => if x1 <= x2 then x1 :: merge (l1', l2) else x2 :: merge (l1, l2'))) fun sort l = let val numBuckets = 25 val _ = assert (fn () => length l < Int.pow (2, numBuckets) - 1) val a: 'a list array = Array.new (numBuckets, []) fun invariant () = assert (fn () => Array.foralli (a, fn (i, l) => case l of [] => true | _ => (length l = Int.pow (2, i) andalso isSorted l))) fun mergeIn (i: int, l: 'a list): unit = (assert (fn () => length l = Int.pow (2, i)) ; (case Array.sub (a, i) of [] => Array.update (a, i, l) | l' => (Array.update (a, i, []) ; mergeIn (i + 1, merge (l, l'))))) val _ = List.foreach (l, fn x => mergeIn (0, [x])) val l = Array.fold (a, [], fn (l, l') => case l of [] => l' | _ => merge (l, l')) val _ = assert (fn () => isSorted l) in l end in {isSorted = isSorted, merge = merge, sort = sort} end) structure MergeSortVector: MERGE_SORT = MergeSort (type 'a t = 'a vector fun make (op <=) = let fun isSorted v = Vector.isSorted (v, op <=) fun merge (v, v') = let val _ = Assert.assert ("MergeSortVector.merge: pre", fn () => isSorted (v, op <=) andalso isSorted (v', op <=)) val n = length v val n' = length v' val r = ref 0 val r' = ref 0 fun next _ = let val i = !r val i' = !r' (* 0 <= i <= n andalso 0 <= i' <= n' *) in if i = n then let val res = sub (v', i') val _ = Int.inc r' in res end else if i' = n' then let val res = sub (v, i) val _ = Int.inc r in res end else let val a = sub (v, i) val a' = sub (v', i') in if a <= a' then (Int.inc r; a) else (Int.inc r'; a') end end val v = tabulate (n + n', fn _ => next ()) val _ = Assert.assert ("MergeSortVector.merge: post", fn () => isSorted (v, op <=)) in v end fun sort v = let fun loop v = if isSorted (v, op <=) then v else let val n = length v val m = n div 2 val m' = n - m fun get (m, start) = loop (tabulate (m, let val r = ref start in fn _ => let val i = !r val res = sub (v, i) val _ = r := 2 + i in res end end)) in merge (get (m', 0), get (m, 1), op <=) end val v = loop v val _ = Assert.assert ("MergeSortVector.sort", fn () => isSorted (v, op <=)) in v end in {isSorted = isSorted, merge = merge, sort = sort} end) mlton-20100608/lib/mlton/basic/mono-container.sig0000644000076600000240000000042611404435636020203 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MONO_CONTAINER = sig end mlton-20100608/lib/mlton/basic/mono-list.fun0000644000076600000240000000053011404435636017176 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MonoList(X: T): T = struct type t = X.t list fun equals(l, l') = List.equals(l, l', X.equals) val layout = List.layout X.layout end mlton-20100608/lib/mlton/basic/mono-option.fun0000644000076600000240000000054511404435636017541 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MonoOption (X: T): T = struct type t = X.t option fun equals (o1, o2) = Option.equals (o1, o2, X.equals) val layout = Option.layout X.layout end mlton-20100608/lib/mlton/basic/mono-vector.fun0000644000076600000240000000060111404435636017524 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MonoVector (Elt: T) = struct open Vector type t = Elt.t t val equals = fn (a, a') => equals (a, a', Elt.equals) val layout = layout Elt.layout end mlton-20100608/lib/mlton/basic/my-dirs.sig0000644000076600000240000000121511404435636016634 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MY_DIRS = sig val dirs: unit -> {home: Dir.t, sml: Dir.t, smlnj: Dir.t, bin: Dir.t, binFiles: Dir.t, heap: Dir.t, src: Dir.t, compiler: Dir.t} val exportFn: string * (string * string list -> int) -> unit val exportML: string -> bool end mlton-20100608/lib/mlton/basic/my-dirs.sml0000644000076600000240000000207411404435636016651 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MyDirs: MY_DIRS = struct open Dir fun dirs() = let val home = fromString "/home/sweeks/" val sml = relative(home, "sml") val smlnj = relative(home, "sml/sml-nj-root") val bin = relative(smlnj, "bin") val binFiles = relative(smlnj, "bin.x86-unix") val heap = relative(bin, ".heap") val src = relative(smlnj, "src") val compiler = relative(src, "sml-nj") in {home = home, sml = sml, smlnj = smlnj, bin = bin, binFiles = binFiles, heap = heap, src = src, compiler = compiler} end fun exportFn(name, f) = SMLofNJ.exportFn(File.toString(File.relative(#heap(dirs()),name)), f) fun exportML name = SMLofNJ.exportML(File.toString(File.relative(#heap(dirs()),name))) end mlton-20100608/lib/mlton/basic/net.sig0000644000076600000240000000170211404435636016037 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature NET = sig type port = int (* canPing m returns true if a ping to machine m succeeds. *) val canPing: string -> bool (* connect{host, port} connects to host on port and * returns the streams to read to and write from the socket. *) val connect: {host: string, port: port} -> In.t * Out.t val ethernetIsUp: unit -> bool val fullHostname: string val hostname: string val repeat: {limit: Time.t, tries: int} option ref (* server(p, f) starts a server listening on port p. Whenever a connection * is received, f is run with streams corresponding to the socket. *) val server: port * (In.t * Out.t -> unit) -> unit end mlton-20100608/lib/mlton/basic/net.sml0000644000076600000240000000532411404435636016054 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Net: NET = struct val repeat: {limit: Time.t, tries: int} option ref = ref NONE local val numTries: int = 2 in (* also need to ignore stderr *) fun canPing (machine: string): bool = Process.doesSucceed (fn () => In.withNull (fn ins => Out.withNull (fn out => Process.call ("ping", ["-U", "-q", "-c", Int.toString numTries, machine]) (ins, out)))) end local val z = Posix.ProcEnv.uname () fun lookup s = case List.peek (z, fn (s', _) => s = s') of NONE => Process.fail (concat [s, " unknown"]) | SOME (_, s) => s in val fullHostname = lookup "nodename" end val hostname = hd (String.tokens (fullHostname, fn c => c = #".")) fun ethernetIsUp (): bool = String.hasSubstring (Process.collect (Process.call ("ifconfig", [])), {substring = "eth0"}) val message = Trace.Immediate.messageStr structure Socket = MLton.Socket type port = Socket.Port.t fun connect {host: string, port: port}: In.t * Out.t = let val _ = message (concat ["connect ", host, ":", Int.toString port]) fun con () = Socket.connect (host, port) val io = case !repeat of NONE => (SOME (con ()) handle _ => NONE) | SOME {limit, tries} => Engine.repeat {thunk = con, tries = tries, limit = limit} in case io of SOME io => io | NONE => Process.fail (concat ["unable to connect to ", host, ":", Int.toString port]) end fun server (p: port, c: In.t * Out.t -> unit): unit = let val socket = Process.try (fn () => Socket.listenAt p, concat ["server unable to bind port ", Int.toString p]) val _ = message (concat ["server listening on ", Int.toString p]) fun loop () = let val (a, port, ins, out) = Process.try (fn () => Socket.accept socket, "accept failed") val name = case NetHostDB.getByAddr a of NONE => NetHostDB.toString a | SOME entry => NetHostDB.name entry val _ = Process.doubleFork (fn () => (message (concat ["accept from ", name, ":", Int.toString port]) ; c (ins, out))) val _ = In.close ins val _ = Out.close out in loop () end in Process.watch loop end end mlton-20100608/lib/mlton/basic/number.fun0000644000076600000240000001113111404435636016544 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Number *) (*-------------------------------------------------------------------*) functor Number(structure I : INTEGER structure R : REAL val intToReal : I.t -> R.t) : NUMBER = struct structure I = I structure F = R structure R = Rational(I) datatype t = Int of I.t | Rat of R.t | Real of F.t val intToRat = R.fromInt fun ratToReal p = F./(intToReal(R.numerator p), intToReal(R.denominator p)) fun toReal(Int m) = intToReal m | toReal(Rat p) = ratToReal p | toReal(Real x) = x fun unary(i,r,f) = fn Int m => i m | Rat p => r p | Real x => f x fun binary(i,r,f) = let fun intRat(m,p) = r(p,intToRat m) fun intReal(m,x) = f(x,intToReal m) fun ratReal(p,x) = f(x,ratToReal p) in fn (Int m,Int n) => i(m,n) | (Rat p,Rat q) => r(p,q) | (Real x,Real y) => f(x,y) | (Int m,Rat p) => intRat(m,p) | (Rat p,Int m) => intRat(m,p) | (Int m,Real x) => intReal(m,x) | (Real x,Int m) => intReal(m,x) | (Rat p,Real x) => ratReal(p,x) | (Real x,Rat p) => ratReal(p,x) end structure OF : BASIC_ORDERED_FIELD = struct type t = t val zero = Int(I.zero) val one = Int(I.one) fun rat p = if R.isInt p then Int(R.toInt p) else Rat p fun close(g,i,r,f) = g(Int o i,rat o r,Real o f) val (op +) = close(binary,I.+,R.+,F.+) val (op ~) = close(unary,I.~,R.~,F.~) val (op * ) = close(binary,I.*,R.*,F.* ) val inverse = unary(Rat o R.inverse o intToRat, Rat o R.inverse, Real o F.inverse) val compare = binary(I.compare,R.compare,F.compare) val op < = binary(I.<, R.<, F.<) val op = = binary(I.=, R.=, F.=) val op <= = binary(I.<=, R.<=, F.<=) val op > = binary(I.>, R.>, F.>) val op >= = binary(I.>=, R.>=, F.>=) fun output(Int m,out) = I.output(m,out) | output(Rat p,out) = R.output(p,out) | output(Real x,out) = F.output(x,out) end structure Field = OrderedField(OF) open OF Field fun isZero z = z = zero fun isPositive z = z > zero fun isNegative z = z < zero (*----------------------------------------*) (* Integers *) (*----------------------------------------*) exception UnaryIntOnly fun unaryIntOnly i = fn Int m => i m | _ => raise UnaryIntOnly exception BinaryIntOnly fun binaryIntOnly i = fn (Int m,Int n) => Int(i(m,n)) | _ => raise BinaryIntOnly val (op mod) = binaryIntOnly I.mod val (op quot) = binaryIntOnly I.quot val (op rem) = binaryIntOnly I.rem val (op div) = binaryIntOnly I.div val factorial = unaryIntOnly (Int o I.factorial) val choose = binaryIntOnly I.choose val gcd = binaryIntOnly I.gcd val lcm = binaryIntOnly I.lcm fun isEven z = isZero(z mod two) val isOdd = not o isEven (*----------------------------------------*) (* Rationals *) (*----------------------------------------*) exception UnaryRatOnly fun unaryRatOnly r = fn Rat p => r p | _ => raise UnaryRatOnly val numerator = unaryRatOnly R.numerator val denominator = unaryRatOnly R.denominator (*----------------------------------------*) (* Reals *) (*----------------------------------------*) fun toRealUnary f z = Real(f(toReal z)) fun toRealBinary f (z,z')= Real(f(toReal z,toReal z')) val ln = toRealUnary F.ln val exp = toRealUnary F.exp val log = toRealBinary F.log val log2 = toRealUnary F.log2 val (op ^) = fn (z,z') => if isZero z' then one else case (z,z') of (Int m,Int n) => if I.isPositive n then Int(I.^(m,n)) else Rat(R.inverse (intToRat(I.^(m,I.~ n)))) | (Int m,_) => Real(F.^(intToReal m,toReal z')) | _ => Real(F.^(toReal z,toReal z')) fun random(Int m,Int n) = Int(I.random(m,n)) | random(z,z') = Real(F.random(toReal z,toReal z')) val toReal = F.toReal o toReal val fromReal = Real o F.fromReal val toInt = unaryIntOnly I.toInt val fromInt = Int o I.fromInt exception Input fun input _ = raise Input exception ToString fun toString _ = raise ToString exception FromString fun fromString _ = raise FromString end (* structure Number = Number(structure I = BigInteger structure R = FloatReal val intToReal = I.toReal) *) mlton-20100608/lib/mlton/basic/number.sig0000644000076600000240000000106011404435636016536 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature NUMBER = sig include INTEGER structure I : INTEGER val / : t * t -> t val inverse : t -> t val ln : t -> t val exp : t -> t val log : t * t -> t val log2 : t -> t val fromReal : real -> t (* Rational Specific *) val numerator : t -> I.t val denominator : t -> I.t end mlton-20100608/lib/mlton/basic/option.sig0000644000076600000240000000142711404435636016565 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature OPTION = sig type 'a t = 'a option val app: 'a t * ('a -> unit) -> unit val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool val exists: 'a t * ('a -> bool) -> bool val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val forall: 'a t * ('a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val isNone: 'a t -> bool val isSome: 'a t -> bool val layout: ('a -> Layout.t) -> 'a t -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val toString: ('a -> string) -> 'a t -> string val valOf: 'a t -> 'a end mlton-20100608/lib/mlton/basic/option.sml0000644000076600000240000000220711404435636016573 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Option: OPTION = struct type 'a t = 'a option open Pervasive.Option fun fold (opt, b, f) = case opt of NONE => b | SOME x => f (x, b) fun exists (z, f) = case z of NONE => false | SOME x => f x fun forall (z, f) = case z of NONE => true | SOME x => f x fun foreach (opt, f) = case opt of NONE => () | SOME x => f x val app = foreach fun map (opt, f) = case opt of NONE => NONE | SOME x => SOME (f x) fun equals (o1, o2, eq) = case (o1, o2) of (NONE, NONE) => true | (SOME x, SOME y) => eq (x, y) | _ => false fun isNone opt = case opt of NONE => true | SOME _ => false fun toString xToString opt = case opt of NONE => "None" | SOME x => concat ["Some ", xToString x] fun layout layoutX opt = let open Layout in case opt of NONE => str "None" | SOME x => seq [str "Some ", layoutX x] end end mlton-20100608/lib/mlton/basic/order.sig0000644000076600000240000000043511404435636016366 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ORDER = sig include ORDER0 val layout: t -> Layout.t end mlton-20100608/lib/mlton/basic/order0.sig0000644000076600000240000000074411404435636016451 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ORDER0 = sig type t val compare: t * t -> Relation.t val equals: t * t -> bool val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val max: t * t -> t val min: t * t -> t end mlton-20100608/lib/mlton/basic/ordered-field.fun0000644000076600000240000000105611404435636017766 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* OrderedField *) (*-------------------------------------------------------------------*) functor OrderedField(F: ORDERED_FIELD_STRUCTS): ORDERED_FIELD = struct structure U = Field(F) structure U' = OrderedRing(F) open F U U' end mlton-20100608/lib/mlton/basic/ordered-field.sig0000644000076600000240000000063311404435636017760 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ORDERED_FIELD_STRUCTS = sig include ORDERED_RING val inverse: t -> t end signature ORDERED_FIELD = sig include ORDERED_FIELD_STRUCTS val / : t * t -> t end mlton-20100608/lib/mlton/basic/ordered-ring.fun0000644000076600000240000000162711404435636017646 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor OrderedRing(S: ORDERED_RING_STRUCTS):> ORDERED_RING where type t = S.t = struct open S structure U = Ring(S) open U fun isPositive n = n > zero fun isNegative n = n < zero fun abs n = if isPositive n then n else ~ n fun foldl(from, to, b, f) = let fun fold(n, a) = if n > to then a else fold(add1 n, f(a,n)) in fold(from, b) end local fun abs (combine, base) {from, to, term} = foldl(from, to, base, fn (a, i) => combine(a, term i)) in val sumFromTo = abs(op +, zero) val prodFromTo = abs(op *, one) end fun factorial n = prodFromTo{from = one, to = n, term = fn i => i} fun max(m, n) = if m > n then m else n fun min(m, n) = if m < n then m else n end mlton-20100608/lib/mlton/basic/ordered-ring.sig0000644000076600000240000000152111404435636017631 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ORDERED_RING_STRUCTS = sig include RING_WITH_IDENTITY val compare: t * t -> Relation.t val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool end signature ORDERED_RING = sig include ORDERED_RING_STRUCTS val abs: t -> t val factorial: t -> t val foldl: t * t * 'a * ('a * t -> 'a) -> 'a val isNegative: t -> bool val isPositive: t -> bool val max: t * t -> t val min: t * t -> t val prodFromTo: {from: t, to: t, term: t -> t} -> t val sumFromTo: {from: t, to: t, term: t -> t} -> t end mlton-20100608/lib/mlton/basic/outstream.sig0000644000076600000240000000216711404435636017302 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature OUTSTREAM = sig type t val close: t -> unit val error: t val fluidLet: t * t * (unit -> 'a) -> 'a val flush: t -> unit val ignore: t * (unit -> 'a) -> 'a val layout: t -> Layout.t val newline: t -> unit val openAppend: string -> t val openOut: string -> t val output: t * string -> unit val output1: t * char -> unit val outputc: t -> string -> unit val outputl: t * string -> unit val outputSubstr: t * Substring.t -> unit val print: string -> unit val set: t * t -> unit val standard: t (* withClose (out, f) runs (f out) and ensures that out is closed after * f completes. It is a bit redundant to pass out to f (instead of ()), * but it makes some code easier to write, and can be ignored if you want. *) val withClose: t * (t -> 'a) -> 'a val withNull: (t -> 'a) -> 'a end mlton-20100608/lib/mlton/basic/outstream.sml0000644000076600000240000000051211404435636017303 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Outstream: OUTSTREAM = struct open Outstream0 fun layout _ = Layout.str "" end structure Out = Outstream mlton-20100608/lib/mlton/basic/outstream0.sml0000644000076600000240000000272311404435636017371 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Outstream0 = struct structure TextIO = Pervasive.TextIO open TextIO (*val output = fn (out, s) => (output (out, s); flushOut out) *) type t = outstream val standard = stdOut val error = stdErr val close = closeOut fun outputc stream string = output (stream, string) val flush = flushOut fun newline s = output (s, "\n") fun outputl (s, x) = (output (s, x); newline s) fun print s = output (standard, s) fun outputNothing _ = () fun set (o1: t, o2:t): unit = TextIO.setOutstream (o1, TextIO.getOutstream o2) fun fluidLet (s1, s2, thunk) = let val old = TextIO.getOutstream s1 val () = set (s1, s2) in Exn0.finally (thunk, fn () => TextIO.setOutstream (s1, old)) end fun withClose (out: t, f: t -> 'a): 'a = Exn0.finally (fn () => f out, fn () => close out) local fun 'a withh (f, p: t -> 'a, openn): 'a = let val out = openn f handle IO.Io _ => Error.bug ("OutStream0.withh: cannot open " ^ f) in withClose (out, p) end in fun 'a withOut (f, p: t -> 'a): 'a = withh (f, p, openOut) fun withAppend (f, p) = withh (f, p, openAppend) end fun 'a withNull (f: t -> 'a): 'a = withOut ("/dev/null", f) fun ignore (out: t, f: unit -> 'a): 'a = withNull (fn out' => fluidLet (out, out', f)) end mlton-20100608/lib/mlton/basic/pair.fun0000644000076600000240000000160111404435636016210 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Pair *) (*-------------------------------------------------------------------*) functor Pair(structure X: T structure Y: T): PAIR = struct structure X = X structure Y = Y type t = X.t * Y.t fun equals((x, y), (x', y')) = X.equals(x, x') andalso Y.equals(y, y') local open Layout in fun layout(x, y) = paren(seq[X.layout x, str ", ", Y.layout y]) end (* fun output((x, y), out) = let val print = Out.outputc out in (print "(" ; X.output(x, out) ; print ", " ; Y.output(y, out) ; print ")") end *) end mlton-20100608/lib/mlton/basic/pair.sig0000644000076600000240000000055311404435636016207 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PAIR = sig structure X: T structure Y: T type t = X.t * Y.t val equals: t * t -> bool val layout: t -> Layout.t end mlton-20100608/lib/mlton/basic/parse.fun0000644000076600000240000000275711404435636016404 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Parse (S: PARSE_STRUCTS): PARSE = struct open S type 'a t = Sexp.t -> 'a fun parse (p, s) = p s fun anything x = x datatype sexp = datatype Sexp.t exception Parse fun wrap (parser, f) sexp = f (parser sexp) fun anyString sexp = case sexp of Atom s => s | _ => raise Parse fun atom f = wrap(anyString, f) fun string s = atom(fn s' => if String.equals(s, s') then () else raise Parse) fun cons(fx, fl) s = case s of List(x :: l) => (fx x, fl(List l)) | _ => raise Parse fun list f s = case s of List l => List.map(l, f) | _ => raise Parse fun tuple2(f1, f2) s = case s of List[s1, s2] => (f1 s1, f2 s2) | _ => raise Parse fun tuple3(f1, f2, f3) s = case s of List[s1, s2, s3] => (f1 s1, f2 s2, f3 s3) | _ => raise Parse fun tuple4(f1, f2, f3, f4) s = case s of List[s1, s2, s3, s4] => (f1 s1, f2 s2, f3 s3, f4 s4) | _ => raise Parse fun tuple5(f1, f2, f3, f4, f5) s = case s of List[s1, s2, s3, s4, s5] => (f1 s1, f2 s2, f3 s3, f4 s4, f5 s5) | _ => raise Parse fun or [] s = raise Parse | or (f :: fs) s = f s handle Parse => or fs s fun fold (parse: 'a t, base: 'b, f: 'a * 'b -> 'b): 'b t = wrap (list parse, fn l => List.fold (l, base, f)) end structure Parse = Parse(structure Sexp = Sexp) mlton-20100608/lib/mlton/basic/parse.sig0000644000076600000240000000174411404435636016371 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PARSE_STRUCTS = sig structure Sexp: SEXP end signature PARSE = sig include PARSE_STRUCTS type 'a t exception Parse val parse: 'a t * Sexp.t -> 'a val anything: Sexp.t t val atom: (string -> 'a) -> 'a t val string: string -> unit t val anyString: string t val cons: 'a t * 'b t -> ('a * 'b) t val list: 'a t -> 'a list t val tuple2: 'a t * 'b t -> ('a * 'b) t val tuple3: 'a t * 'b t * 'c t -> ('a * 'b * 'c) t val tuple4: 'a t * 'b t * 'c t * 'd t -> ('a * 'b * 'c * 'd) t val tuple5: 'a t * 'b t * 'c t * 'd t * 'e t -> ('a * 'b * 'c * 'd * 'e) t val wrap: 'a t * ('a -> 'b) -> 'b t val or: 'a t list -> 'a t val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b t end mlton-20100608/lib/mlton/basic/pid.sig0000644000076600000240000000066611404435636016035 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PID = sig type t val current: unit -> t val equals: t * t -> bool val fromString: string -> t option val layout: t -> Layout.t val parent: unit -> t val toString: t -> string end mlton-20100608/lib/mlton/basic/pid.sml0000644000076600000240000000126711404435636016044 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Pid: PID = struct local open Posix.Process in type t = pid val toString = SysWord.fmt StringCvt.DEC o pidToWord fun fromString s = Option.map(Pervasive.Int.fromString s, wordToPid o SysWord.fromInt) end val layout = Layout.str o toString local open Posix.ProcEnv in val current = getpid val parent = getppid end val equals = op = end mlton-20100608/lib/mlton/basic/pointer.sig0000644000076600000240000000123211404435636016727 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature POINTER = sig type 'a t val ! : 'a t -> 'a val := : 'a t * 'a -> unit val clear: 'a t -> unit val copy: 'a t * 'a t -> unit val eq: 'a t * 'a t -> bool val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool val follow: 'a t -> 'a option val isNull: 'a t -> bool val make: 'a option -> 'a t val null: unit -> 'a t val new: 'a -> 'a t val swap: 'a t * 'a t -> unit end mlton-20100608/lib/mlton/basic/pointer.sml0000644000076600000240000000151211404435636016741 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Pointer: POINTER = struct datatype 'a t = T of 'a option ref fun !(T r) = case Ref.! r of NONE => Error.bug "Pointer.!" | SOME v => v fun (T r) := v = Ref.:=(r, SOME v) fun clear(T r) = Ref.:=(r, NONE) fun copy(T r, T r') = Ref.:=(r, Ref.! r') fun eq(T r, T r') = Ref.equals(r, r') fun follow(T r) = Ref.! r fun equals(p, p', equals) = case (follow p, follow p') of (NONE, NONE) => true | (SOME v, SOME v') => equals(v, v') | _ => false fun isNull p = Option.isNone(follow p) fun make v = T(ref v) fun new v = make(SOME v) fun null() = make NONE fun swap(T p, T p') = Ref.swap(p, p') end mlton-20100608/lib/mlton/basic/popt.sig0000644000076600000240000000453411404435636016241 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature POPT = sig (* This type specifies what kind of arguments a switch expects * and provides the function to be applied to the argument. *) datatype t = (* one arg: a boolean (true, false), after a space *) Bool of bool -> unit (* one arg: an integer, after a space *) | Digit of int -> unit (* one arg: an integer followed by tional k or m. *) | Int of int -> unit (* one arg: a single digit, no space. *) | Mem of int -> unit (* no args *) | None of unit -> unit | Real of real -> unit (* Any string immediately follows the switch. *) | String of string -> unit (* one arg: any string *) | SpaceString of string -> unit | SpaceString2 of string * string -> unit val boolRef: bool ref -> t val falseRef: bool ref -> t val intRef: int ref -> t val stringRef: string ref -> t val trueRef: bool ref -> t val trace: string * t (* Parse the switches, applying the first matching t to each switch, * and return any remaining args. * Returns NONE if it encounters an error. * For example, if ts is: * [("foo", None f)] * and the switches are: * ["-foo", "bar"] * then parse will call f() and return "bar". *) val parse: { switches: string list, opts: (string * t) list } -> string list Result.t datatype optionStyle = Normal | Expert val makeUsage: {mainUsage: string, makeOptions: ({usage: string -> unit} -> {style: optionStyle, name: string, arg: string, desc: string, opt: t} list), showExpert: unit -> bool } -> {parse: string list -> string list Result.t, usage: string -> unit} end mlton-20100608/lib/mlton/basic/popt.sml0000644000076600000240000002023011404435636016241 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Popt: POPT = struct datatype t = Bool of bool -> unit | Digit of int -> unit | Int of int -> unit | Mem of int -> unit | None of unit -> unit | Real of real -> unit | SpaceString of string -> unit | SpaceString2 of string * string -> unit | String of string -> unit local fun make b (r: bool ref): t = None (fn () => r := b) in val trueRef = make true val falseRef = make false end fun boolRef (r: bool ref): t = Bool (fn b => r := b) fun intRef (r: int ref): t = Int (fn n => r := n) fun stringRef (r: string ref): t = String (fn s => r := s) val trace = ("trace", SpaceString (fn s => let open Trace.Immediate val _ = debug := Out Out.error in case s of "*" => always () | _ => (flagged () ; on (String.split (s, #","))) end)) fun memString (s: string): int option = let val n = String.size s fun loop (i, ac) = if i >= n then SOME ac else let val c = String.sub (s, i) fun done n = SOME (n * ac) in case c of #"m" => done 1048576 | #"k" => done 1024 | _ => case Char.digitToInt c of NONE => NONE | SOME c => loop (i + 1, ac * 10 + c) end in loop (0, 0) end (* Parse the command line opts and return any remaining args. *) fun parse {switches: string list, opts: (string * t) list}: string list Result.t = let exception Error of string val rec loop = fn [] => [] | switch :: switches => let fun error s = raise (Error s) in case String.sub (switch, 0) of #"-" => let val switch = String.dropPrefix (switch, 1) in case List.peek (opts, fn (switch', _) => switch = switch') of NONE => let (* Handle the switches where there is no space * separating the argument. *) val rec loop' = fn [] => error (concat ["unknown switch: -", switch]) | (switch', arg) :: opts => let fun doit f = if String.hasPrefix (switch, {prefix = switch'}) then f (String.dropPrefix (switch, String.size switch')) else loop' opts in case arg of Digit f => doit (fn s => let val error = fn () => error (concat ["invalid digit ", s, " used with -", switch]) in if size s = 1 then (case Char.digitToInt (String.sub (s, 0)) of NONE => error () | SOME i => f i) else error () end) | String f => doit f | _ => loop' opts end in loop' opts ; loop switches end | SOME (_, arg) => let fun next (f: 'a -> unit, get, msg) = case switches of [] => error (concat ["-", switch, " requires an argument"]) | switch' :: switches => case get switch' of NONE => error (concat ["-", switch, " requires ", msg]) | SOME n => (f n; loop switches) in case arg of Bool f => next (f, Bool.fromString, "a boolean") | Digit _ => error (concat ["-", switch, " requires a digit"]) | Int f => next (f, Int.fromString, "an integer") | Mem f => next (f, memString, "a memory amount") | None f => (f (); loop switches) | Real f => next (f, Real.fromString, "a real") | SpaceString f => next (f, SOME, "") | SpaceString2 f => (case switches of s1 :: s2 :: switches => (f (s1, s2); loop switches) | _ => error (concat ["-", switch, " requires two arguments"])) | String f => (f ""; loop switches) end end | _ => switch :: switches end in Result.Yes (loop switches) handle Error s => Result.No s end datatype optionStyle = Normal | Expert fun makeUsage {mainUsage, makeOptions, showExpert} = let val usageRef: (string -> unit) option ref = ref NONE fun usage (s: string): unit = valOf (!usageRef) s fun options () = makeOptions {usage = usage} val _ = usageRef := SOME (fn s => let val out = Out.error fun message s = Out.outputl (out, s) val opts = List.fold (rev (options ()), [], fn ({arg, desc, opt = _, name, style}, rest) => if style = Normal orelse showExpert () then [concat [" -", name, arg, " "], desc] :: rest else rest) val table = let open Justify in table {columnHeads = NONE, justs = [Left, Left], rows = opts} end in message s ; message (concat ["usage: ", mainUsage]) ; List.foreach (table, fn ss => message (String.removeTrailing (concat ss, Char.isSpace))) ; let open OS.Process in if MLton.isMLton then exit failure else Error.bug "Popt.makeUsage" end end) val parse = fn switches => parse {opts = List.map (options (), fn {name, opt, ...} => (name, opt)), switches = switches} in {parse = parse, usage = usage} end end mlton-20100608/lib/mlton/basic/port.sig0000644000076600000240000000053011404435636016233 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PORT = sig type t = int val equals: t * t -> bool val http: t end mlton-20100608/lib/mlton/basic/port.sml0000644000076600000240000000052211404435636016245 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Port: PORT = struct type t = int val equals: t * t -> bool = op = val http: t = 80 end mlton-20100608/lib/mlton/basic/postscript.sig0000644000076600000240000000053411404435636017465 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature POSTSCRIPT = sig val makeHeader: {host: string, job: string, user: string} -> string end mlton-20100608/lib/mlton/basic/postscript.sml0000644000076600000240000002341311404435636017477 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Postscript: POSTSCRIPT = struct nonfix mod div structure Char = struct open Char fun escapePostscript c = if isPrint c then (case c of #"\\" => "\\\\" | #"(" => "\\(" | #")" => "\\)" | _ => toString c) else escapeC c end structure String = struct open String fun escapePostscript s = translate(s, Char.escapePostscript) end datatype t = (* Atoms *) int of real | real of real | string of string | literal of string (* Operators *) | abs | add | arc | arcn | arct | arcto | ashow | atan | awidthshow | ceiling | charpath | clear | cleartomark | clip | clippath | cliprestor | clipsave | closepath | colorimage | composefont | copy | copypage | cos | count | counttomark | cshow | currentcolor | currentcolorspace | currentdash | currentfont | currentglobal | currentgray | currentgstate | currenthsbcolor | currentlinecap | currentlinejoin | currentlinewidth | currentmiterlimit | currentmykcolor | currentpagedevice | currentpoint | currentrgbcolor | currentstrokeadjust | curveto | definefont | defineuserobject | div | dup | eoclip | eofill | erasepage | exch | execuserobject | exp | fill | findfont | flattenpath | floor | font | forall | gcheck | glyphshow | grestore | grestoreall | gsave | gstate | idiv | image | imagemask | index | initclip | initgraphics | kshow | lineto | ln | log | makefont | mark | mod | moveto | mul | neg | newpath | nulldevice | pathbbox | pathforall | pop | rand | rcurveto | rectclip | rectfill | rectstroke | restore | reversepath | rlineto | rmoveto | roll | rootfont | round | rrand | save | scalefont | selectfont | setbbox | setcolor | setcolorspace | setdash | setfont | setglobal | setgray | setgstate | sethsbcolor | setlinecap | setlinejoin | setlinewidth | setmiterlimit | setmykcolor | setpagedevice | setrgbcolor | setstrokeadjust | shfill | show | showpage | sin | sqrt | srand | startjob | stringwidth | stroke | strokepath | sub | truncate | uappend | ucache | ueofill | ufill | undefinefont | undefineuserobject | upath | userobjects | ustroke | ustrokepath | widthshow | xshow | xyshow | yshow fun tildeToMinus s = String.translate(s, fn #"~" => "-" | c => Char.toString c) val toString = fn int r => tildeToMinus(Int.toString(Real.round r)) | real r => tildeToMinus(Real.toString r) | string s => concat["(", String.escapePostscript s, ")"] | literal s => concat["/", s] | abs => "abs" | add => "add" | arc => "arc" | arcn => "arcn" | arct => "arct" | arcto => "arcto" | ashow => "ashow" | atan => "atan" | awidthshow => "awidthshow" | ceiling => "ceiling" | charpath => "charpath" | clear => "clear" | cleartomark => "cleartomark" | clip => "clip" | clippath => "clippath" | cliprestor => "cliprestor" | clipsave => "clipsave" | closepath => "closepath" | colorimage => "colorimage" | composefont => "composefont" | copy => "copy" | copypage => "copypage" | cos => "cos" | count => "count" | counttomark => "counttomark" | cshow => "cshow" | currentcolor => "currentcolor" | currentcolorspace => "currentcolorspace" | currentdash => "currentdash" | currentfont => "currentfont" | currentglobal => "currentglobal" | currentgray => "currentgray" | currentgstate => "currentgstate" | currenthsbcolor => "currenthsbcolor" | currentlinecap => "currentlinecap" | currentlinejoin => "currentlinejoin" | currentlinewidth => "currentlinewidth" | currentmiterlimit => "currentmiterlimit" | currentmykcolor => "currentmykcolor" | currentpagedevice => "currentpagedevice" | currentpoint => "currentpoint" | currentrgbcolor => "currentrgbcolor" | currentstrokeadjust => "currentstrokeadjust" | curveto => "curveto" | definefont => "definefont" | defineuserobject => "defineuserobject" | div => "div" | dup => "dup" | eoclip => "eoclip" | eofill => "eofill" | erasepage => "erasepage" | exch => "exch" | execuserobject => "execuserobject" | exp => "exp" | fill => "fill" | findfont => "findfont" | flattenpath => "flattenpath" | floor => "floor" | font => "font" | forall => "forall" | gcheck => "gcheck" | glyphshow => "glyphshow" | grestore => "grestore" | grestoreall => "grestoreall" | gsave => "gsave" | gstate => "gstate" | idiv => "idiv" | image => "image" | imagemask => "imagemask" | index => "index" | initclip => "initclip" | initgraphics => "initgraphics" | kshow => "kshow" | lineto => "lineto" | ln => "ln" | log => "log" | makefont => "makefont" | mark => "mark" | mod => "mod" | moveto => "moveto" | mul => "mul" | neg => "neg" | newpath => "newpath" | nulldevice => "nulldevice" | pathbbox => "pathbbox" | pathforall => "pathforall" | pop => "pop" | rand => "rand" | rcurveto => "rcurveto" | rectclip => "rectclip" | rectfill => "rectfill" | rectstroke => "rectstroke" | restore => "restore" | reversepath => "reversepath" | rlineto => "rlineto" | rmoveto => "rmoveto" | roll => "roll" | rootfont => "rootfont" | round => "round" | rrand => "rrand" | save => "save" | scalefont => "scalefont" | selectfont => "selectfont" | setbbox => "setbbox" | setcolor => "setcolor" | setcolorspace => "setcolorspace" | setdash => "setdash" | setfont => "setfont" | setglobal => "setglobal" | setgray => "setgray" | setgstate => "setgstate" | sethsbcolor => "sethsbcolor" | setlinecap => "setlinecap" | setlinejoin => "setlinejoin" | setlinewidth => "setlinewidth" | setmiterlimit => "setmiterlimit" | setmykcolor => "setmykcolor" | setpagedevice => "setpagedevice" | setrgbcolor => "setrgbcolor" | setstrokeadjust => "setstrokeadjust" | shfill => "shfill" | show => "show" | showpage => "showpage" | sin => "sin" | sqrt => "sqrt" | srand => "srand" | startjob => "startjob" | stringwidth => "stringwidth" | stroke => "stroke" | strokepath => "strokepath" | sub => "sub" | truncate => "truncate" | uappend => "uappend" | ucache => "ucache" | ueofill => "ueofill" | ufill => "ufill" | undefinefont => "undefinefont" | undefineuserobject => "undefineuserobject" | upath => "upath" | userobjects => "userobjects" | ustroke => "ustroke" | ustrokepath => "ustrokepath" | widthshow => "widthshow" | xshow => "xshow" | xyshow => "xyshow" | yshow => "yshow" fun programString(os: t list): string = let fun loop(os: t list, lineLen: int, line: string list, lines: string list): string = let fun newLine() = concat("\n" :: rev line) :: lines in case os of [] => concat(rev(newLine())) | oper :: os => let val oper = toString oper val m = String.size oper val lineLen = m + 1 + lineLen in if lineLen > 80 then loop(os, m + 1, [" ", oper], newLine()) else loop(os, lineLen, " " :: oper :: line, lines) end end in loop(os, 0, [], ["%!PS\n"]) end val pointsPerInch = 72.0 fun inches(x: real): real = x * pointsPerInch val pageWidth = inches 8.5 val pageHeight = inches 11.0 val margin = inches 0.2 val dateHeight = inches 0.3 val userHeight = inches 1.2 val width = pageWidth - 2.0 * margin val dateRatio = 0.6 val dateBase = pageHeight - margin - dateHeight * (1.0 + dateRatio) / 2.0 val userRatio = 0.6 val userBase = pageHeight - margin - dateHeight - userHeight * (1.0 + userRatio) / 2.0 fun makeHeader{ host: string, job: string, user: string }: string = let val now = Date.now() val time = string(concat["Time: ", Date.fmt(now, "%I:%M:%S %p")]) in programString [save, (* Draw boxes *) real 0.0, setgray, int margin, int (pageHeight - margin), moveto, int width, int 0.0, rlineto, int 0.0, int (~(dateHeight + userHeight)), rlineto, int (~width), int 0.0, rlineto, closepath, int 1.0, setlinewidth, stroke, int margin, int (pageHeight - margin - dateHeight), moveto, int width, int 0.0, rlineto, int 2.0, setlinewidth, stroke, (* Set the font for dates *) literal "Helvetica", findfont, int (dateHeight * dateRatio * 1.3), scalefont, setfont, (* Show the date *) int (2.0 * margin), int dateBase, moveto, string(concat["Date: ", Date.fmt(now, "%m/%d/%y")]), show, (* Show the job name *) int (pageWidth / 2.0), string job, stringwidth, pop, int 2.0, div, sub, int dateBase, moveto, string job, show, (* Show the time *) int (pageWidth - 2.0 * margin), time, stringwidth, pop, sub, int dateBase, moveto, time, show, (* Show the user *) literal "Helvetica", findfont, int (userHeight * userRatio * 1.3), scalefont, setfont, int (pageWidth / 2.0), string user, stringwidth, pop, int 2.0, div, sub, int userBase, moveto, real 0.3, setgray, string user, show, (* Finish *) restore, showpage] end end mlton-20100608/lib/mlton/basic/power.sml0000644000076600000240000001227711404435636016427 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Types = struct type ('a, 'b) power = {layout: 'a -> Layout.t, one: 'a, times: 'a * 'a -> 'a} -> 'a * 'b -> 'a type ('a, 'b) simultaneous = {layout: 'a -> Layout.t, one: 'a, times: 'a * 'a -> 'a} -> ('a * 'b) list -> 'a end structure Power: sig val power: ('a, Pervasive.Int.int) Types.power val powerInf: ('a, Pervasive.IntInf.int) Types.power val simultaneous: ('a, Pervasive.Int.int) Types.simultaneous val simultaneousInf: ('a, Pervasive.IntInf.int) Types.simultaneous end = struct open Types structure Int = Pervasive.Int structure Array = Pervasive.Array fun for(a: Int.int, b: Int.int, f: Int.int -> unit) = let fun loop i = if i >= b then () else (f i; loop(i + 1)) in loop a end type 'a exponent = {isZero: 'a -> bool, divMod: 'a * 'a -> 'a * 'a, two: 'a} type 'a base = {one: 'a, times: 'a * 'a -> 'a, layout: 'a -> Layout.t} fun ('a, 'b) make ({isZero, divMod, two}: 'a exponent) ({one, times, layout = _}: 'b base) = let val op * = times (* Repeated squaring. *) fun power(b: 'b, n: 'a): 'b = let (* The loop has been carefully unrolled once to avoid overflow when * 'a is a fixed size integer. *) fun loop(c, b, n) = (* c * b^2n = b0^n0 *) if isZero n then c else next(c, b * b, n) and next(c, b, n) = (* c * b^n = b0^n0 *) let val (d, m) = divMod(n, two) in loop(if isZero m then c else c * b, b, d) end in if isZero n then one else next(one, b, n) end (* Based on page 618 of Handbook of Applied Cryptography. *) fun simultaneous(ges: ('b * 'a) list): 'b = let fun twoPowerWord i : Word.t = Word.<<(0w1, Word.fromInt i) val twoPower = Word.toInt o twoPowerWord fun doit ges = let val n = List.length ges val tableSize = twoPower n val table = Array.array(tableSize, one) val _ = List.foreachi (ges, fn (i, (g, _)) => let val min = twoPower i in for(min, twoPower(i + 1), fn i => Array.update(table, i, g * Array.sub(table, i - min))) end) fun loop(ews: ('a * Word.t) list, Gs: 'b list): 'b list = case ews of [] => Gs | _ => let val (ews, w) = List.fold (ews, ([], 0w0: Word.t), fn ((e, w'), (ews, w)) => let val (e, m) = divMod(e, two) val ews = if isZero e then ews else (e, w') :: ews val w = if isZero m then w else Word.orb(w', w) in (ews, w) end) in loop(ews, Array.sub(table, Word.toInt w) :: Gs) end val ews = List.mapi (ges, fn (i, (_, e)) => (e, twoPowerWord i)) val Gs = loop (ews, []) in List.fold (Gs, one, fn (G, A) => A * A * G) end val window = 9 fun split l = let fun loop(l, n, ac) = if n <= 0 then (rev ac, l) else (case l of [] => (rev ac, []) | x :: l => loop(l, n - 1, x :: ac)) in loop(l, window, []) end fun loop(ges: ('b * 'a) list, ac: 'b): 'b = case ges of [] => ac | [(g, e)] => ac * power(g, e) | _ => let val (ges, rest) = split ges in loop(rest, ac * doit ges) end in loop(ges, one) end in {power = power, simultaneous = simultaneous} end val intExp: Int.int exponent = {isZero = fn n => n = 0, divMod = fn (a, b) => (a div b, a mod b), two = 2} fun power z = #power(make intExp z) fun simultaneous z = #simultaneous(make intExp z) val intInfExp = let open Pervasive.IntInf val zero = fromInt 0 in {isZero = fn n => n = zero, divMod = divMod, two = fromInt 2} end fun powerInf z = #power(make intInfExp z) fun simultaneousInf z = #simultaneous(make intInfExp z) end mlton-20100608/lib/mlton/basic/process.sig0000644000076600000240000000776011404435636016741 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PROCESS = sig structure Command: sig type t = In.t * Out.t -> unit end structure Status: sig type t end (* Execute a program in a subprocess and wait for it to finish. * call (file, args) (i, o) searches PATH for an executable named file, * and runs it with arguments file :: args. *) val call: string * string list -> Command.t (* call' (c, a) = call (c, a) (In.standard, Out.standard) *) val call': string * string list -> unit val callWithIn: string * string list * (In.t -> 'a) -> 'a val callWithOut: string * string list * (Out.t -> 'a) -> 'a (* * Fork off a command and collect its output into a string. *) val collect: Command.t -> string val commandName: unit -> string val doesSucceed: (unit -> unit) -> bool val doubleFork: (unit -> unit) -> unit val exec: string * string list -> unit (* Raise Fail exception. *) val fail: string -> 'a (* Start a command in a subprocess, in the background. *) val fork: (unit -> unit) -> Pid.t val forkIn: (Out.t -> unit) -> Pid.t * In.t val forkOut: (In.t -> unit) -> Pid.t * Out.t val forkInOut: (In.t * Out.t -> unit) -> Pid.t * In.t * Out.t val getEnv: string -> string option (* * glob s returns the list of paths matching s. * For now, s should be a bash pattern. *) val glob: string -> string list val hostName: unit -> string val makeCommandLine: (string list -> unit) -> (string list -> Status.t) val makeMain: (string list -> unit) -> (unit -> unit) (* pipe [c_1, ..., c_n] runs the commands c_1, ..., c_n in * subprocesses in parallel, with the standard output of c_i hooked * to the standard input of c_i+1. * Fails if any of the commands fail. *) val pipe: Command.t list * In.t * Out.t -> unit (* pipe' cs = pipe (cs, In.standard, Out.standard) *) val pipe': Command.t list -> unit (* run = wait o fork *) val run: (unit -> unit) -> unit val setEnv: {name: string, value: string} -> unit val signal: Pid.t * Signal.t -> unit val signalGroup: Pid.t * Signal.t -> unit val size: File.t -> {text: int, data: int, bss: int} val sleep: Time.t -> Time.t val spawn: {path: string, args: string list} -> Pid.t val spawne: {path: string, args: string list, env: string list} -> Pid.t val spawnp: {file: string, args: string list} -> Pid.t val su: string -> unit (* string is userid *) val succeed: unit -> 'a val system: string -> unit val time: (unit -> unit) -> {system: Time.t, user: Time.t} (* try (f, m) tries f with exponentially backed off times, stopping after * a minute of trying, in which case is fails with m. *) val try: (unit -> 'a) * string -> 'a val usage: {usage: string, msg: string} -> 'a val userName: unit -> string (* Wait for process to finish. * Raise Fail if process terminates with nonzero status. *) val wait: Pid.t -> unit (* Wait for all Pid.ts in list to finish. *) val waits: Pid.t list -> unit (* watch f will rerun f until it succeeds *) val watch: (unit -> unit) -> unit structure State: sig datatype t = DiskSleep | Running | Sleeping | Traced | Zombie val toString: t -> string end val ps: unit -> {name: string, pgrp: Pid.t, pid: Pid.t, ppid: Pid.t, state: State.t} list end functor TestProcess (S: PROCESS): sig end = struct val _ = print "TestProcess\n" open S val _ = ps () end mlton-20100608/lib/mlton/basic/process.sml0000644000076600000240000003074011404435636016744 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Process: PROCESS = struct local open Trace.Immediate in val messageStr = messageStr end fun system s = let val status = OS.Process.system s in if OS.Process.isSuccess status then () else Error.bug (concat ["Process.system: command failed: ", s]) end structure Command = struct type t = In.t * Out.t -> unit fun layout _ = Layout.str "" end type command = Command.t structure Pid = Pid structure PosixStatus = struct open Posix.Process type t = exit_status fun toString (s: t): string = case s of W_EXITED => "exited" | W_EXITSTATUS w => concat ["exit status ", Word8.toString w] | W_SIGNALED s => concat ["signal ", SysWord.toString (Posix.Signal.toWord s)] | W_STOPPED s => concat ["stop signal ", SysWord.toString (Posix.Signal.toWord s)] val layout = Layout.str o toString end structure Status = struct type t = OS.Process.status end fun succeed (): 'a = let open OS.Process in exit success end val succeed = Trace.trace ("Process.succeed", Unit.layout, Unit.layout) succeed (* This song and dance is so that succeed can have the right type, unit -> 'a, * instead of unit -> unit. *) val succeed: unit -> 'a = fn () => (succeed (); Error.bug "Process.succeed") fun fork (c: unit -> unit): Pid.t = case Posix.Process.fork () of NONE => (Trace.Immediate.inChildProcess () ; let open OS.Process in exit ((c (); success) handle _ => failure) end) | SOME pid => pid val fork = Trace.trace ("Process.fork", Command.layout, Pid.layout) fork fun closes l = List.foreach (l, FileDesc.close) val pname = "" fun forkIn (c: Out.t -> unit): Pid.t * In.t = let val {infd, outfd} = FileDesc.pipe () val pid = fork (fn () => (FileDesc.close infd ; c (MLton.TextIO.newOut (outfd, pname)))) val _ = FileDesc.close outfd in (pid, MLton.TextIO.newIn (infd, pname)) end fun forkOut (c: In.t -> unit): Pid.t * Out.t = let val {infd, outfd} = FileDesc.pipe () val pid = fork (fn () => (FileDesc.close outfd ; c (MLton.TextIO.newIn (infd, pname)))) val _ = FileDesc.close infd in (pid, MLton.TextIO.newOut (outfd, pname)) end fun forkInOut (c: In.t * Out.t -> unit): Pid.t * In.t * Out.t = let val {infd = in1, outfd = out1} = FileDesc.pipe () val {infd = in2, outfd = out2} = FileDesc.pipe () val pid = fork (fn () => (closes [in1, out2] ; c (MLton.TextIO.newIn (in2, pname), MLton.TextIO.newOut (out1, pname)))) val _ = closes [in2, out1] in (pid, MLton.TextIO.newIn (in1, pname), MLton.TextIO.newOut (out2, pname)) end fun wait (p: Pid.t): unit = let val (p', s) = Posix.Process.waitpid (Posix.Process.W_CHILD p, []) in if p <> p' then Error.bug (concat ["Process.wait: expected pid ", Pid.toString p, " but got pid ", Pid.toString p']) else () ; (case s of PosixStatus.W_EXITED => () | _ => raise Fail (concat [PosixStatus.toString s])) end val wait = Trace.trace ("Process.wait", Pid.layout, Unit.layout) wait val run = wait o fork (* doubleFork avoids creating zombies. *) fun doubleFork (c: unit -> unit): unit = run (fn () => ignore (fork c)) structure Posix = struct open Posix structure Process = struct open Process val wait = Trace.trace ("Process.Posix.Process.wait", Unit.layout, Layout.tuple2 (Pid.layout, PosixStatus.layout)) wait end end fun waits (pids: Pid.t list): unit = case pids of [] => () | _ => let val (pid, status) = Posix.Process.wait () val pids = case status of Posix.Process.W_EXITED => List.keepAll (pids, fn p => p <> pid) | _ => Error.bug (concat ["Process.waits: child ", Pid.toString pid, " failed with ", PosixStatus.toString status]) in waits pids end fun pipe (cs: command list, ins: In.t, out: Out.t): unit = let fun loop (cs: command list, ins: In.t, maybeClose, pids: Pid.t list): unit = case cs of [] => () | [c] => let val pid = fork (fn () => c (ins, out)) val _ = maybeClose () in waits (pid :: pids) end | c :: cs => let val (pid, ins) = forkIn (fn out => c (ins, out)) val _ = maybeClose () in loop (cs, ins, fn _ => In.close ins, pid :: pids) end in loop (cs, ins, fn _ => (), []) end fun pipe' cs = pipe (cs, In.standard, Out.standard) fun exec (c: string, a: string list, ins: In.t, out: Out.t): unit = let open FileDesc in if MLton.isMLton then (move {from = MLton.TextIO.inFd ins, to = stdin} ; move {from = MLton.TextIO.outFd out, to = stdout} ; move {from = MLton.TextIO.outFd Out.error, to = stderr}) else () ; (Posix.Process.execp (c, c :: a) handle _ => (Out.output (Out.error, (concat ("unable to exec " :: List.separate (c :: a, " ")))) ; OS.Process.exit OS.Process.failure)) end val exec = Trace.trace4 ("Process.exec", String.layout, List.layout String.layout, In.layout, Out.layout, Unit.layout) exec fun call (c, a) (ins, out) = run (fn () => exec (c, a, ins, out)) fun call' ca = call ca (In.standard, Out.standard) fun collect (c: Command.t): string = let val (pid, ins) = forkIn (fn out => c (In.standard, out)) in In.inputAll ins before (In.close ins; wait pid) end fun doesSucceed c = (run c; true) handle Fail _ => false val doesSucceed = Trace.trace ("Process.doesSucceed", Function.layout, Bool.layout) doesSucceed fun makeCommandLine (commandLine: string list -> unit) args = ((commandLine args; OS.Process.success) handle e => let val out = Out.error open Layout in output (Exn.layout e, out) ; List.foreach (Exn.history e, fn s => (Out.output (out, "\n\t") ; Out.output (out, s))) ; Out.newline out ; OS.Process.failure end) fun makeMain z (): unit = OS.Process.exit (makeCommandLine z (CommandLine.arguments ())) fun basename s = #file (OS.Path.splitDirFile s) val commandName = Promise.lazy (fn () => basename (CommandLine.name ())) local open Posix.SysDB Posix.ProcEnv in fun su (name: string): unit = let val p = getpwnam name in setgid (Passwd.gid p) ; setuid (Passwd.uid p) end val su = Trace.trace ("Process.su", String.layout, Unit.layout) su fun userName () = Passwd.name (getpwuid (getuid ())) end fun fail x = raise Fail x local val z = Posix.ProcEnv.uname () fun lookup s = case List.peek (z, fn (s', _) => s = s') of NONE => fail (concat [s, " unknown"]) | SOME (_, s) => s in fun hostName () = lookup "nodename" end val getEnv = Posix.ProcEnv.getenv fun glob (s: string): string list = String.tokens (collect (call ("bash", ["-c", "ls " ^ s])), fn c => c = #"\n") fun usage {usage: string, msg: string}: 'a = fail (concat [msg, "\n", "Usage: ", commandName (), " ", usage]) val sleep = Posix.Process.sleep fun watch (f: unit -> unit) = let fun loop () = wait (fork f) handle _ => (messageStr "watcher noticed child failure" ; loop ()) in loop () end fun signal (p: Pid.t, s: Signal.t): unit = let open Posix.Process in kill (K_PROC p, s) end fun signalGroup (p: Pid.t, s: Signal.t): unit = let open Posix.Process in kill (K_GROUP p, s) end local val delay = Time.fromMilliseconds 1 val maxDelay = Time.minutes 1 in fun try (f: unit -> 'a, msg: string): 'a = let fun loop (delay: Time.t): 'a = if Time.> (delay, maxDelay) then fail msg else (f () handle _ => (ignore (sleep delay) ; loop (Time.+ (delay, delay)))) in loop delay end end structure State = struct datatype t = DiskSleep | Running | Sleeping | Traced | Zombie fun fromString s = case s of "D" => SOME DiskSleep | "R" => SOME Running | "S" => SOME Sleeping | "T" => SOME Traced | "Z" => SOME Zombie | _ => NONE val toString = fn DiskSleep => "DiskSleep" | Running => "Running" | Sleeping => "Sleeping" | Traced => "Traced" | Zombie => "Zombie" val layout = Layout.str o toString end val op / = String./ fun ps () = Dir.inDir ("/proc", fn () => List.fold (Dir.lsDirs ".", [], fn (d, ac) => case Pid.fromString d of NONE => ac | SOME pid => case String.tokens (hd (File.lines ("/proc"/d/"stat")), Char.isSpace) of _ :: name :: state :: ppid :: pgrp :: _ => {(* drop the ( ) around the name *) name = String.substring (name, 1, String.size name - 2), pgrp = valOf (Pid.fromString pgrp), pid = pid, ppid = valOf (Pid.fromString ppid), state = valOf (State.fromString state) } :: ac | _ => fail "ps")) val ps = Trace.trace ("Process.ps", Unit.layout, List.layout (fn {name, pid, state, ...} => Layout.record [("pid", Pid.layout pid), ("name", String.layout name), ("state", State.layout state)])) ps fun callWithIn (name, args, f: In.t -> 'a) = let val pid = Unix.execute (name, args) val ins = Unix.textInstreamOf pid in Exn.finally (fn () => f ins, fn () => ignore (Unix.reap pid)) end fun callWithOut (name, args, f: Out.t -> 'a) = let val pid = Unix.execute (name, args) val out = Unix.textOutstreamOf pid in Exn.finally (fn () => f out, fn () => ignore (Unix.reap pid)) end (* * text data bss dec hex filename * 3272995 818052 24120 4115167 3ecadf mlton *) fun size (f: File.t): {text: int, data: int, bss: int} = let val fail = fn () => fail (concat ["size failed on ", f]) in File.withTemp (fn sizeRes => let val _ = OS.Process.system (concat ["size ", f, ">", sizeRes]) in File.withIn (sizeRes, fn ins => case In.lines ins of [_, nums] => (case String.tokens (nums, Char.isSpace) of text :: data :: bss :: _ => (case (Int.fromString text, Int.fromString data, Int.fromString bss) of (SOME text, SOME data, SOME bss) => {text = text, data = data, bss = bss} | _ => fail ()) | _ => fail ()) | _ => fail ()) end) end fun time (f: unit -> unit) = let val {children = {utime = u, stime = s}, ...} = Time.times () val _ = f () val {children = {utime = u', stime = s'}, ...} = Time.times () in {system = Time.- (s', s), user = Time.- (u', u)} end val setEnv = MLton.ProcEnv.setenv val exec = fn (c, a) => exec (c, a, In.standard, Out.standard) local open MLton.Process in val spawn = spawn val spawne = spawne val spawnp = spawnp end end mlton-20100608/lib/mlton/basic/promise.sig0000644000076600000240000000074511404435636016735 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PROMISE = sig type 'a t exception Force val delay: (unit -> 'a) -> 'a t val force: 'a t -> 'a val layout: ('a -> Layout.t) -> 'a t -> Layout.t val lazy: (unit -> 'a) -> (unit -> 'a) val reset: 'a t * (unit -> 'a) -> unit end mlton-20100608/lib/mlton/basic/promise.sml0000644000076600000240000000213611404435636016742 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Promise: PROMISE = struct datatype 'a t = T of 'a state ref and 'a state = Unevaluated of unit -> 'a | Evaluating | Evaluated of 'a fun layout l (T r) = let open Layout in case !r of Unevaluated _ => str "Unevaluated" | Evaluating => str "Evaluating" | Evaluated x => seq [str "Evaluated ", l x] end fun delay th = T (ref (Unevaluated th)) fun reset (T r, th) = case !r of Evaluating => Error.bug "Promise.reset" | _ => r := Unevaluated th exception Force fun force (T r) = case !r of Evaluated x => x | Unevaluated th => (let val _ = r := Evaluating val x = th () val _ = r := Evaluated x in x end handle exn => (r := Unevaluated th; raise exn)) | Evaluating => raise Force fun lazy th = let val p = delay th in fn () => force p end end mlton-20100608/lib/mlton/basic/property-list.fun0000644000076600000240000000425411404435636020121 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PropertyList (H: HET_CONTAINER):> PROPERTY_LIST = struct datatype t = T of H.t list ref fun new (): t = T (ref []) fun length (T r) = List.length (!r) val equals = fn (T r, T r') => Ref.equals (r, r') fun clear (T hs) = hs := [] val numPeeks: Int64.int ref = ref 0 val numLinks: Int64.int ref = ref 0 val maxLength: int ref = ref 0 fun stats () = let open Layout in align [seq [str "property list numPeeks = ", str (Int64.toString (!numPeeks))], (* seq [str "property list numLinks = ", str (Int64.toString (!numLinks))], *) seq [str "property list maxLength = ", Int.layout (!maxLength)], seq [str "property list average position = ", str let open Real val fromInt = fromIntInf o Int64.toLarge in format (fromInt (!numLinks) / fromInt (!numPeeks), Format.fix (SOME 3)) end]] end fun 'a newProperty () = let val {make, pred, peek = peekH} = H.new () fun peek (T hs) = let fun loop (l, n) = let fun update () = ((numLinks := Int64.fromInt n + !numLinks handle Overflow => Error.bug "PropertyList: numLinks overflow") ; if n > !maxLength then maxLength := n else ()) in case l of [] => (update (); NONE) | e :: l => case peekH e of r as SOME _ => (update (); r) | NONE => loop (l, n + 1) end val _ = numPeeks := 1 + !numPeeks handle Overflow => Error.bug "PropertyList: numPeeks overflow" in loop (!hs, 0) end fun add (T hs, v: 'a): unit = hs := make v :: !hs fun remove (T hs) = hs := List.remove (!hs, pred) in {add = add, peek = peek, remove = remove} end end mlton-20100608/lib/mlton/basic/property-list.sig0000644000076600000240000000214711404435636020112 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PROPERTY_LIST = sig type t (* remove all properties from the list *) val clear: t -> unit (* pointer equality of property lists *) val equals: t * t -> bool val length: t -> int (* create an empty property list *) val new: unit -> t (* create a new property *) val newProperty: unit -> { (* See if a property is in a property list. * NONE if it isn't. *) peek: t -> 'a option, (* Add the value of the property -- must not already exist. *) add: t * 'a -> unit, (* Remove a property from a property list. * Noop if the property isn't there. *) remove: t -> unit } val stats: unit -> Layout.t end mlton-20100608/lib/mlton/basic/property.fun0000644000076600000240000000660011404435636017145 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Property (Plist: PROPERTY_LIST):> PROPERTY where type Plist.t = Plist.t = struct structure Plist = Plist datatype ('sym, 'val) init = Const of 'val | Fun of 'sym * ('sym -> 'val) -> 'val val initRec = Fun fun initConst c = Const c fun initFun f = initRec (fn (s, _) => f s) fun initRaise (name, layout) = initFun (fn s => Error.bug (let open Layout in toString (seq [layout s, str " has no ", str name, str " property"]) end)) fun ('sym, 'val) nondestructable (plist: 'sym -> Plist.t, init: ('sym, 'val) init) = let val {add, peek, remove, ...} = Plist.newProperty () fun get (s: 'sym) = let val p = plist s in case peek p of NONE => (case init of Const c => c | Fun f => let val v = f (s, get) in add (p, v); v end) | SOME v => v end fun set (s: 'sym, none: unit -> 'val, some: 'val -> unit): unit = let val p = plist s in case peek p of NONE => add (p, none ()) | SOME v => some v end in {get = get, rem = remove o plist, remove = remove, set = set} end fun ('sym, 'val) destructable (plist, init) = let val plists = ref [] fun add s = List.push (plists, plist s) val {get, remove, set, ...} = nondestructable (plist, case init of Const _ => init | Fun f => Fun (fn z as (s, _) => (add s; f z))) val set: 'sym * (unit -> 'val) * ('val -> unit) -> unit = fn (s, none, some) => set (s, fn () => (add s; none ()), some) fun destroy () = (List.foreach (!plists, remove) ; plists := []) in {destroy = destroy, get = get, set = set} end fun setToSetOnce set (s, v) = set (s, fn _ => v, fn _ => Error.bug "Property.setOnce: set used twice") fun destGetSetOnce z = let val {destroy, get, set} = destructable z in {destroy = destroy, get = get, set = setToSetOnce set} end fun destGet z = let val {destroy, get, ...} = destGetSetOnce z in {destroy = destroy, get = get} end fun getSetOnce z = let val {get, rem, set, ...} = nondestructable z in {get = get, rem = rem, set = setToSetOnce set} end fun get z = let val {get, rem, ...} = getSetOnce z in {get = get, rem = rem} end fun setInit (plist, init) = (plist, case init of Const c => Fun (fn _ => ref c) | Fun f => Fun (fn (s, get) => ref (f (s, ! o get)))) fun destGetSet z = let val {destroy, get, set} = destructable (setInit z) val set = fn (s, v) => set (s, fn () => ref v, fn r => r := v) in {destroy = destroy, get = ! o get, set = set} end fun getSet z = let val {get, rem, set, ...} = nondestructable (setInit z) val set = fn (s, v) => set (s, fn () => ref v, fn r => r := v) in {get = ! o get, rem = rem, set = set} end end structure HetContainer = ExnHetContainer () structure PropertyList = PropertyList (ExnHetContainer ()) structure Property = Property (PropertyList) mlton-20100608/lib/mlton/basic/property.sig0000644000076600000240000000342411404435636017140 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PROPERTY = sig structure Plist: PROPERTY_LIST type ('sym, 'val) init val initConst: 'val -> ('sym, 'val) init val initFun: ('sym -> 'val) -> ('sym, 'val) init val initRaise: string * ('sym -> Layout.t) -> ('sym, 'val) init val initRec: ('sym * ('sym -> 'val) -> 'val) -> ('sym, 'val) init val destGet: ('sym -> Plist.t) * ('sym, 'val) init -> { destroy: unit -> unit, get: 'sym -> 'val } val destGetSet: ('sym -> Plist.t) * ('sym, 'val) init -> { destroy: unit -> unit, get: 'sym -> 'val, set: 'sym * 'val -> unit } val destGetSetOnce: ('sym -> Plist.t) * ('sym, 'val) init -> { get: 'sym -> 'val, set: 'sym * 'val -> unit, destroy: unit -> unit } (* For all of the rem functions, it is OK if the property isn't there. *) val get: ('sym -> Plist.t) * ('sym, 'val) init -> { get: 'sym -> 'val, rem: 'sym -> unit } val getSet: ('sym -> Plist.t) * ('sym, 'val) init -> { get: 'sym -> 'val, rem: 'sym -> unit, set: 'sym * 'val -> unit } (* Property can only be set or initialized once. *) val getSetOnce: ('sym -> Plist.t) * ('sym, 'val) init -> { get: 'sym -> 'val, rem: 'sym -> unit, set: 'sym * 'val -> unit } end mlton-20100608/lib/mlton/basic/ps.sig0000644000076600000240000000077311404435636015702 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PS = sig structure State = struct datatype t = Running | Sleeping end val ps: unit -> {pid: Pid.t, commandName: string, args: string list, state: State.t} list end mlton-20100608/lib/mlton/basic/ps.sml0000644000076600000240000000035011404435636015702 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Ps: PS = struct end mlton-20100608/lib/mlton/basic/queue.sig0000644000076600000240000000102511404435636016373 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature QUEUE = sig type 'a t val deque: 'a t -> ('a t * 'a) option val empty: unit -> 'a t val enque: 'a t * 'a -> 'a t val foldAnyOrder: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foldr: 'a t * 'b * ('a * 'b -> 'b) -> 'b val isEmpty: 'a t -> bool val toList: 'a t -> 'a list end mlton-20100608/lib/mlton/basic/quick-sort.sig0000644000076600000240000000163611404435636017360 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature QUICK_SORT = sig (* The comparison function ('a * 'a -> bool) for should be the <= funtion, * not just <. * This is necessary to handle duplicate elements. *) (* sortArray mutates the array it is passed and returns the same array *) val sortArray: 'a array * ('a * 'a -> bool) -> unit val sortList: 'a list * ('a * 'a -> bool) -> 'a list val sortVector: 'a vector * ('a * 'a -> bool) -> 'a vector end functor TestQuickSort (S: QUICK_SORT): sig end = struct val _ = print "TestQuickSort\n" open S val _ = List.foreach ([Array.array (0, 0), Array.tabulate (100, fn _ => Random.natLessThan 10000)], fn a => ignore (sortArray (a, op <=))) end mlton-20100608/lib/mlton/basic/quick-sort.sml0000644000076600000240000000627111404435636017371 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure QuickSort: QUICK_SORT = struct open Array val rand = Word.toIntX o MLton.Random.rand fun randInt (lo, hi) = lo + Int.mod (rand(), hi - lo + 1) (* quicksort based on section 10.2 of Programming Pearls, by Bentley. * It does repeated partitioning until the segment size is less than the cutoff. * Then, it does an insertion sort over the whole array to fix up the unsorted * segments. *) fun 'a sortArray (a: 'a array, op <= : 'a * 'a -> bool): unit = if 0 = Array.length a then () else let fun x i = sub (a, i) fun swap (i, j) = let val t = x i val () = update (a, i, x j) val () = update (a, j, t) in () end val cutoff = 20 fun qsort (l: int, u: int): unit = if Int.<= (u - l, cutoff) then () else let val () = swap (l, randInt (l, u)) val t = x l (* Partition based on page 115. *) fun loop (i, j) = let fun loopUp i = let val i = i + 1 in (* The sentinel guarantees that x i is OK. *) if t <= x i then i else loopUp i end val i = loopUp i fun loopDown j = let val j = j - 1 in if x j <= t then j else loopDown j end val j = loopDown j in if j < i then (i, j) else (swap (i, j); loop (i, j)) end val (i, j) = loop (l, u + 1) val () = swap (l, j) val () = qsort (l, j - 1) val () = qsort (i, u) in () end (* Put a maximal element at the end to use as a sentinel. *) val (m, _) = Array.foldi (a, (0, Array.sub (a, 0)), fn (i, xi, (m, xm)) => if xi <= xm then (m, xm) else (i, xi)) val last = length a - 1 val () = swap (m, last) val () = qsort (0, last - 1) val () = InsertionSort.sort (a, op <=) in () end local fun make (from, to) (l, f) = let val a = from l val () = sortArray (a, f) in to a end in val sortList = fn z => make (Array.fromList, Array.toList) z val sortVector = fn z => make (Array.fromVector, Array.toVector) z end end mlton-20100608/lib/mlton/basic/random.sig0000644000076600000240000000156611404435636016541 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RANDOM = sig val alphaNumString: int -> string val charFrom: string -> char val bool: unit -> bool val list: 'a list -> 'a option (* natLessThan n returns a random number uniform in [0, n). *) val natLessThan: int -> int val nRandom: {list: 'a list, length: int, n: int} -> 'a list (* 0.0 <= real() <= 1.0 *) val real: unit -> real val seed: unit -> Word.t option val srand: Word.t -> unit val useed: unit -> Word.t option val word: unit -> Word.t (* word w returns a random number uniform in [0, w). *) val wordLessThan: Word.t -> Word.t end mlton-20100608/lib/mlton/basic/random.sml0000644000076600000240000000651211404435636016546 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Random: RANDOM = struct local open MLton.Random in val alphaNumString = alphaNumString val seed = seed val useed = useed val word = rand val srand = srand end val word = Trace.trace ("Random.word", Unit.layout, Word.layout) word local val ri: int ref = ref 0 val rw = ref (word ()) val max = Word.wordSize - 1 in fun bool () = let val i = !ri val b = 0w1 = Word.andb (0wx1, Word.>> (!rw, Word.fromInt i)) val _ = if i = max then (rw := word () ; ri := 0) else ri := 1 + i in b end end fun int () = Word.toIntX (word ()) val int = Trace.trace ("Random.int", Unit.layout, Int.layout) int local val maxNat = let val shft = Option.fold (Int.precision, Word.wordSize, Int.min) val shft = Word.fromInt (shft - 1) in Word.toInt (Word.notb (Word.<< (Word.notb 0w0, shft))) end val maxNatW = Word.fromInt maxNat fun nat () = Word.toInt (Word.andb (word (), maxNatW)) val nat = Trace.trace ("Random.nat", Unit.layout, Int.layout) nat val maxNatR = Real.fromInt maxNat fun scale r = r / maxNatR val natReal = Real.fromInt o nat val natReal = Trace.trace0 ("Random.natReal", Real.layout) natReal in fun real () = scale (natReal () + scale (natReal ())) val real = Trace.trace0 ("Random.real", Real.layout) real end local val r: word ref = ref 0w0 val max: word ref = ref 0w0 in fun wordLessThan (w: word): word = if w = 0w0 then Error.bug "Random.wordLessThan" else let val () = if w - 0w1 <= !max then () else (r := MLton.Random.rand () ; max := Word.notb 0wx0) val w' = !r val () = r := Word.div (w', w) val () = max := Word.div (!max, w) in Word.mod (w', w) end end fun natLessThan (n: int): int = if n <= 0 then Error.bug "Random.natLessThan" else Word.toInt (wordLessThan (Word.fromInt n)) fun charFrom (s: string): char = Pervasive.String.sub (s, natLessThan (Pervasive.String.size s)) fun nRandom {list, length, n} = let fun loop (need: int, length: int, xs: 'a list, ac: 'a list): 'a list = (Assert.assert ("Random.nRandom", fn () => need <= length) ; if need <= 0 then ac else (case xs of [] => Error.bug "nRandom" | x :: xs => if natLessThan length < need then loop (need - 1, length - 1, xs, x :: ac) else loop (need, length - 1, xs, ac))) in loop (n, length, list, []) end val nRandom = fn x => Assert.assertFun ("nRandom", nRandom, fn {list, length, n} => (length = List.length list andalso 0 <= n andalso n <= length, fn l => n = List.length l)) x fun list l = let val n = List.length l in if n = 0 then NONE else SOME (List.nth (l, natLessThan n)) end end mlton-20100608/lib/mlton/basic/rational.fun0000644000076600000240000000504211404435636017071 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Rational *) (*-------------------------------------------------------------------*) functor Rational(I : INTEGER) : RATIONAL = struct structure F = struct structure I = I open I datatype t = T of I.t * I.t (* always use smallest nonnegative denominator *) fun numerator(T(n,_)) = n fun denominator(T(_,n)) = n fun fromInt n = T(n,I.one) (*fun intTo = ITo o I.intTo*) (*val toInt = I.toInt o toI*) fun isInt q = denominator q = one exception ToInt fun toInt q = if isInt q then numerator q else raise ToInt fun toReal(T(p,q)) = I.toReal p / I.toReal q val zero = fromInt I.zero val one = fromInt I.one fun scale(T(p,q),T(p',q')) = let val l = I.lcm(q,q') in (p * (l div q'), p' * (l div q), l) end val (op +) = fn (x,y) => let val (p,p',l) = scale(x,y) in T(p + p',l) end fun inverse(T(p,q)) = if I.isNegative p then T(I.~ q,I.~ p) else T(q,p) val (op ~) = fn T(m,n) => T(~m,n) fun reduce(p,q) = let val g = I.gcd(p,q) in (p div g, q div g) end fun make(p,q) = T(reduce(p,q)) fun intIntTo(m,n) = make(I.fromInt m,I.fromInt n) fun (T(p,q)) * (T(p',q')) = let val (p,q') = reduce(p,q') val (p',q) = reduce(p',q) in T(I.*(p,p'),I.*(q,q')) end fun compare(x,y) = let val (p,q,_) = scale(x,y) in I.compare(p,q) end val {<,<=,>,>=,equal,min,max} = Relation.compare compare val op = = equal (*fun random(x,y) = let val(p,p',q) = scale(x,y) in T(I.random(p,p'),q) end *) exception FromString fun stringTo _ = raise FromString (*fun toString(T(p,q)) = String.concat[I.toString p, "/", I.toString q] *) exception Input fun input _ = raise Input fun output(p,out) = if isInt p then I.output(toInt p,out) else (I.output(numerator p,out) ; Out.output(out,"/") ; I.output(denominator p,out)) end structure R = OrderedField(F) open F R end mlton-20100608/lib/mlton/basic/rational.sig0000644000076600000240000000114111404435636017057 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RATIONAL = sig include ORDERED_FIELD structure I : INTEGER val isInt : t -> bool val make : I.t * I.t -> t val fromInt : I.t -> t val toInt : t -> I.t val numerator : t -> I.t val denominator : t -> I.t (* val toInt : t -> int val intTo : int -> t val intIntTo : int * int -> t *) val toReal : t -> real end mlton-20100608/lib/mlton/basic/rdb.sig0000644000076600000240000000260011404435636016016 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Relational Data Base *) signature RDB = sig structure Value: sig type t val bool: bool -> t val compare: t * t -> Relation.t val int: int -> t val real: real -> t val string: string -> t val toString: t -> string end structure Domain: sig type t val bool: t val int: t val real: t val string: t end structure Attribute: sig type t val new: string -> t end type t val add: t * (Attribute.t * Value.t) list -> unit val cardinality: t -> int val degree: t -> int val new: {heading: (Attribute.t * Domain.t) list} -> t val printTable: {rdb: t, row: Attribute.t, col: Attribute.t, entry: Attribute.t, out: Out.t} -> unit val printTable': {rdb: t, cols: Attribute.t list, sortBy: Attribute.t, out: Out.t} -> unit end mlton-20100608/lib/mlton/basic/rdb.sml0000644000076600000240000001614511404435636016040 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure RDB: RDB = struct structure Rep = struct type t = exn end structure Domain = struct datatype t = T of {compare : Rep.t * Rep.t -> Relation.t, contains: Rep.t -> bool, just: Justify.t, toString: Rep.t -> string} end structure Value = struct datatype t = T of {domain: Domain.t, rep: Rep.t} end structure Domain = struct open Domain fun contains (T {contains, ...}, Value.T {rep = r, ...}) = contains r fun new {compare: 'a * 'a -> Relation.t, just: Justify.t, toString: 'a -> string}: t * ('a -> Value.t) = let exception E of 'a val contains = fn E _ => true | _ => false val toString = fn E x => toString x | _ => Error.bug "RDB.Domain.new.toString" val compare = fn (E x, E y) => compare (x, y) | _ => Error.bug "RDB.Domain.new.compare" val d = T {compare = compare, contains = contains, just = just, toString = toString} fun make (a: 'a): Value.t = Value.T {domain = d, rep = E a} in (d, make) end val (bool, boolV) = new {compare = Bool.compare, just = Justify.Left, toString = Bool.toString} val (int, intV) = new {compare = Int.compare, just = Justify.Right, toString = Int.toString} val (real, realV) = new {compare = Real.compare, just = Justify.Right, toString = fn r => Real.format (r, Real.Format.fix (SOME 1))} (* Real.toString *) val (string, stringV) = new {compare = String.compare, just = Justify.Left, toString = String.toString} end structure Value = struct open Value local open Domain in val bool = boolV val int = intV val real = realV val string = stringV end local fun unary f (T {domain = Domain.T d, rep = r, ...}) = f d r in val toString = unary #toString end fun justification (T {domain = Domain.T {just, ...}, ...}) = just local fun binary f (T {domain = Domain.T d, rep = r, ...}, T {rep = r', ...}) = f d (r, r') in val compare = binary #compare end val {<, <=, equals, >=, >, ...} = Relation.compare compare end structure Attribute = struct open String val new = fn s => s end structure Heading = struct datatype t = T of (Attribute.t * Domain.t) list fun degree (T l) = List.length l fun info (T l, a) = case List.peeki (l, fn (_, (a', _)) => Attribute.equals (a, a')) of NONE => Error.bug "RDB.Heading.info" | SOME (i, (_, d)) => (i, d) val position = #1 o info end datatype t = T of {heading: Heading.t, body: Value.t list list ref} fun add (T {heading = Heading.T attrs, body, ...}, r) = List.push (body, List.fold (rev attrs, [], fn ((a, d), ac) => case List.peek (r, fn (a', _) => Attribute.equals (a, a')) of NONE => Error.bug "RDB.add" | SOME (_, v) => if Domain.contains (d, v) then v :: ac else Error.bug "RDB.add")) fun cardinality (T {body, ...}) = List.length (!body) fun degree (T {heading, ...}) = Heading.degree heading fun new {heading} = T {heading = Heading.T heading, body = ref []} fun project (T {heading, body, ...}, a: Attribute.t): Value.t list = let val n = Heading.position (heading, a) in List.fold (!body, [], fn (vs, ac) => List.insert (vs, List.nth (vs, n), Value.<=)) end fun outputTable (t, out) = let val print = Out.outputc out in List.foreach (t, fn ss => (case ss of [] => () | s :: ss => (print s ; List.foreach (ss, fn s => (print " "; print s))) ; print "\n")) end fun printTable {rdb as T {body, heading, ...}, row, col, entry, out}: unit = let val default = "*" val body = !body val rows = project (rdb, row) val cols = project (rdb, col) val nr = Heading.position (heading, row) val nc = Heading.position (heading, col) val ne = Heading.position (heading, entry) val table = ("" :: List.map (cols, Value.toString)) :: let val cols = rev cols in List.fold (rev rows, [], fn (r, ac) => let val row = List.fold (cols, [], fn (c, ac) => let val e = case (List.peek (body, fn t => Value.equals (r, List.nth (t, nr)) andalso Value.equals (c, List.nth (t, nc)))) of NONE => default | SOME t => Value.toString (List.nth (t, ne)) in e :: ac end) in (Value.toString r :: row) :: ac end) end val justs = (Value.justification (hd rows) :: List.map (cols, Value.justification)) val t = Justify.table {columnHeads = NONE, justs = justs, rows = table} in outputTable (t, out) end fun printTable' {rdb as T {body, heading = Heading.T ads, ...}, cols, sortBy, out}: unit = let val is = List.revMap (cols, fn a => valOf (List.index (ads, fn (a', _) => Attribute.equals (a, a')))) val rows = List.revMap (!body, fn r => let val a = Array.fromList r in List.revMap (is, fn i => Array.sub (a, i)) end) val justs = List.map (hd rows, Value.justification) val i = valOf (List.index (cols, fn a => Attribute.equals (a, sortBy))) val rows = QuickSort.sortList (rows, fn (r, r') => Value.<= (List.nth (r, i), List.nth (r', i))) val rows = List.map (cols, Attribute.toString) :: List.map (rows, fn r => List.map (r, Value.toString)) val t = Justify.table {columnHeads = NONE, justs = justs, rows = rows} in outputTable (t, out) end end mlton-20100608/lib/mlton/basic/reader.sig0000644000076600000240000000215311404435636016514 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature READER = sig type ('a, 's) t = 's -> ('a * 's) option val all: ('a, 's) t -> ('a list, 's) t val char: (char, 'a) t * char -> (unit, 'a) t val firstN: ('a, 's) t * Int.t -> ('a list, 's) t val readFromString: ((char, Int.t) t -> ('a, Int.t) t) * string -> 'a option val map: ('a, 's) t * ('a -> 'b) -> ('b, 's) t val mapFail: ('a, 's) t * ('a -> 'b option) -> ('b, 's) t val or: ('a, 's) t list -> ('a, 's) t val seq2: ('a, 's) t * ('b, 's) t -> ('a * 'b, 's) t val seq3: ('a, 's) t * ('b, 's) t * ('c, 's) t -> ('a * 'b * 'c, 's) t val seq4: ('a, 's) t * ('b, 's) t * ('c, 's) t * ('d, 's) t -> ('a * 'b * 'c * 'd, 's) t val seq5: ('a, 's) t * ('b, 's) t * ('c, 's) t * ('d, 's)t * ('e,'s) t -> ('a * 'b * 'c * 'd * 'e, 's) t val stringOfLength: (char, 'a) t * Int.t -> (string, 'a) t end mlton-20100608/lib/mlton/basic/reader.sml0000644000076600000240000000554511404435636016535 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Reader: READER = struct type ('a, 's) t = 's -> ('a * 's) option fun char(r, c: char) s = case r s of NONE => NONE | SOME(c', s) => if c = c' then SOME((), s) else NONE fun or rs s = let val rec loop = fn [] => NONE | r :: rs => case r s of NONE => loop rs | z => z in loop rs end fun all r s = let fun loop(s, ac) = case r s of NONE => SOME(rev ac, s) | SOME(x, s) => loop(s, x :: ac) in loop(s, []) end fun firstN(r, n: Int.t) s = let fun loop(n, s, ac) = if n <= 0 then SOME(rev ac, s) else (case r s of NONE => NONE | SOME(x, s) => loop(n - 1, s, x :: ac)) in loop(n, s, []) end fun mapFail(r, f) s = case r s of NONE => NONE | SOME(a, s) => Option.map(f a, fn b => (b, s)) fun map(r, f) = mapFail(r, SOME o f) fun seq2(r1, r2) s = case r1 s of NONE => NONE | SOME(x1, s) => case r2 s of NONE => NONE | SOME(x2, s) => SOME((x1, x2), s) fun seq3(r1, r2, r3) s = case r1 s of NONE => NONE | SOME(x1, s) => case r2 s of NONE => NONE | SOME(x2, s) => case r3 s of NONE => NONE | SOME(x3, s) => SOME((x1, x2, x3), s) fun seq4(r1, r2, r3, r4) s = case seq3(r1, r2, r3) s of NONE => NONE | SOME((x1, x2, x3), s) => case r4 s of NONE => NONE | SOME(x4, s) => SOME((x1, x2, x3, x4), s) fun seq5(r1, r2, r3, r4, r5) s = case seq4(r1, r2, r3, r4) s of NONE => NONE | SOME((x1, x2, x3, x4), s) => case r5 s of NONE => NONE | SOME(x5, s) => SOME((x1, x2, x3, x4, x5), s) fun stringOfLength(r, i: Int.t) s = let fun loop(i, s, cs) = if i <= 0 then SOME(implode(rev cs), s) else (case r s of NONE => NONE | SOME(c, s) => loop(i - 1, s, c :: cs)) in loop(i, s, []) end val info = Trace.info "Reader.readFromString" fun readFromString(rm, s) = let val n: Int.t = String.size s fun reader(i: Int.t) = if i < n then SOME(String.sub(s, i), i + 1) else NONE val reader = Trace.traceInfo (info, Int.layout, fn NONE => Layout.str "NONE" | SOME(c, _) => Char.layout c, fn _ => (true, fn _ => true)) reader in case rm reader (0: Int.t) of NONE => NONE | SOME(a, i) => if i = n then SOME a else NONE end end mlton-20100608/lib/mlton/basic/real.sig0000644000076600000240000000465611404435636016207 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REAL = sig structure Format: sig type t val exact: t val fix: int option -> t val gen: int option -> t val sci: int option -> t end type t exception Input val + : t * t -> t val - : t * t -> t val * : t * t -> t val / : t * t -> t val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val abs: t -> t val acos: t -> t val add1: t -> t val asin: t -> t val atan2: t * t -> t val atan: t -> t val ceiling: t -> int val choose: t * t -> t structure Class: sig datatype t = INF | NAN | NORMAL | SUBNORMAL | ZERO end val class: t -> Class.t val compare: t * t -> Relation.t val cos: t -> t val dec: t ref -> unit val equals: t * t -> bool val exp: t -> t val floor: t -> int val format: t * Format.t -> string val fromInt: Pervasive.Int.int -> t (* fromInt n = 1 + ... + 1, n times. *) val fromIntInf: Pervasive.IntInf.int -> t val fromString: string -> t option val inc: t ref -> unit val input: In0.t -> t val inverse: t -> t val isFinite: t -> bool val layout: t -> Layout.t val ln: t -> t val log2: t -> t val log: t * t -> t val max: t * t -> t val maxFinite: t val min: t * t -> t val negOne: t val one: t val pi: t val pow: t * t -> t val prod: t list -> t val realCeil: t -> t val realFloor: t -> t val realMod: t -> t val realPower: t * t -> t val realRound: t -> t val realTrunc: t -> t val rem: t * t -> t val round: t -> int val signBit: t -> bool val sin: t -> t val split: t -> {frac: t, whole: t} val sqrt: t -> t val sub1: t -> t val tan: t -> t val three: t val toIntInf: t -> Pervasive.IntInf.int val toString: t -> string val trunc: t -> int val two: t val zero: t val ~ : t -> t end mlton-20100608/lib/mlton/basic/real.sml0000644000076600000240000000431211404435636016205 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Real (Real: sig include PERVASIVE_REAL val one: real val zero: real end): REAL = struct type real = Real.real structure In = In0 structure R = OrderedRing (structure R = RingWithIdentity (structure R = Ring (type t = real open Real val layout = Layout.str o toString val equals = Real.==) open R Real) open R Real val {compare, ...} = Relation.lessEqual {< = op <, equals = equals}) structure F = OrderedField (open R Real fun inverse x = one / x) open F Real open Math exception Input fun input i = case fromString (In.inputToSpace i) of SOME x => x | NONE => raise Input local open Real in val fromInt = fromInt val fromIntInf = fromLargeInt val toIntInf = toLargeInt IEEEReal.TO_NEAREST end structure Format = struct open StringCvt type t = realfmt val exact = EXACT val sci = SCI val fix = FIX val gen = GEN end fun format (x, f) = Real.fmt f x fun choose(n, k) = let val k = max (k, n - k) in prodFromTo {from = add1 k, term = fn i => i, to = n} / factorial (n - k) end fun log (base, arg) = ln arg / ln base val ln2 = ln two fun log2 x = ln x / ln2 fun realPower(m, n) = exp(n * ln m) val ceiling = ceil structure Class = struct datatype t = datatype IEEEReal.float_class end end structure Real64 = Real (open Real64 val one: real = 1.0 val zero: real = 0.0) structure Real = Real64 structure Real32 = Real (open Real32 val one: real = 1.0 val zero: real = 0.0) mlton-20100608/lib/mlton/basic/ref.sig0000644000076600000240000000171411404435636016030 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REF = sig type 'a t val ! : 'a t -> 'a val := : 'a t * 'a -> unit val equals: 'a t * 'a t -> bool val fluidLet: 'a t * 'a * (unit -> 'b) -> 'b val getAndSet: ('a -> 'b ref) -> ('a -> 'b) * ('a * 'b -> unit) val getSet: ('a -> Layout.t) -> {get: unit -> 'a, set: 'a -> unit, clear: unit -> unit, layout: unit -> Layout.t, output: Out.t -> unit, print: unit -> unit} val layout: ('a -> Layout.t) -> 'a t -> Layout.t val memoize: 'a option t * (unit -> 'a) -> 'a val swap: 'a t * 'a t -> unit end mlton-20100608/lib/mlton/basic/ref.sml0000644000076600000240000000257511404435636016047 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Ref: REF = struct type 'a t = 'a ref val (op !) = (op !) val (op :=) = op := fun equals (r: 'a t, r') = r = r' fun swap (r, r') = let val v = !r in r := !r'; r' := v end fun getAndSet sel = (! o sel, fn (x, v) => sel x := v) fun ('a, 'b) fluidLet (r: 'a t, x: 'a, th: unit -> 'b): 'b = let val old = !r val () = r := x in Exn.finally (th, fn () => r := old) end fun getSet layout = let val r = ref NONE fun get () = case !r of NONE => Error.bug "Ref.getSet.get: not available" | SOME v => v fun set v = r := SOME v fun clear () = r := NONE val layout = fn () => layout (get ()) fun output out = Layout.output (layout (), out) fun print () = output Out.standard in {get = get, set = set, clear = clear, layout = layout, output = output, print = print} end fun layout layoutX r = layoutX (!r) fun memoize (r: 'a option ref, f: unit -> 'a): 'a = case !r of NONE => let val a = f () val () = r := SOME a in a end | SOME a => a end mlton-20100608/lib/mlton/basic/regexp.sig0000644000076600000240000002231211404435636016543 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REGEXP_STRUCTS = sig end signature REGEXP = sig include REGEXP_STRUCTS structure Save: sig type t val new: unit -> t end structure Match: sig type t val all: t -> Substring.t val startLength: t -> {start: int, length: int} val exists: t * Save.t -> bool val funs: t -> {exists: Save.t -> bool, lookup: Save.t -> Substring.t, peek: Save.t -> Substring.t option} val length: t -> int val lookup: t * Save.t -> Substring.t val lookupString: t * Save.t -> String.t val peek: t * Save.t -> Substring.t option val peekString: t * Save.t -> String.t option val stringFuns: t -> {exists: Save.t -> bool, lookup: Save.t -> String.t, peek: Save.t -> String.t option} end structure Compiled: sig type t (* Find the first substring of s starting at or after index i that * matches r. Return the first character and the character just * past the end of the substring. *) val findShort: t * string * int -> Match.t option val findLong: t * string * int -> Match.t option val foreachMatchShort: t * string * (Match.t -> unit) -> unit val layout: t -> Layout.t val layoutDot: t -> Layout.t val layoutDotToFile: t * File.t -> unit (* match (r, s, i) * Return the (shortest or longest) substring of s starting at index * i that matches r. * The substring is represented by the index of the character just * past its end. * Return NONE if there is NO match. * All of the saves in the match will be set. *) val matchAll: t * string -> Match.t option val matchLong: t * string * int -> Match.t option val matchShort: t * string * int -> Match.t option val matchesAll: t * string -> bool val matchesPrefix: t * string -> bool end type t val anchorFinish: t val anchorStart: t val any: t (* arbitrary character *) val anys: t (* arbitrary number of characters *) val ascii: t (* arbitrary ascii character *) val asciis: t (* arbitrary ascii characters *) val char: char -> t val compileDFA: t -> Compiled.t val compileNFA: t -> Compiled.t val digit: t val digits: t val dquote: t (* char #"\"" *) val fromString: string -> (t * Save.t vector) option val isChar: (char -> bool) -> t val isNotChar: (char -> bool) -> t val layout: t -> Layout.t val nonDigit: t val none: t val notChar: char -> t val notOneOf: string -> t val null: t (* empty string *) val oneOf: string -> t val oneOrMore: t -> t val optional: t -> t val or: t list -> t val save: t * Save.t -> t val seq: t list -> t val spaces: t (* star (isChar Char.isSpace) *) val star: t -> t val string: string -> t (* case matters *) val stringIgnoreCase: string -> t (* case doesn't matter *) val toString: t -> string val zeroOrMore: t -> t (* same as star *) end functor TestRegexp (S: REGEXP): sig end = struct val _ = print "TestRegexp\n" open S open Compiled val compile = if true then compileNFA else compileDFA val _ = Assert.assert ("TestRegexp.save", fn () => let val s = Save.new () in List.forall ([(save (seq [], s), "", ""), (save (star (oneOf "a"), s), "", ""), (seq [save (seq [], s), seq []], "", ""), (seq [oneOf "a", save (seq [], s)], "a", "")], fn (r, s1, s2) => let val c = compile r in case matchAll (c, s1) of NONE => false | SOME m => Match.lookupString (m, s) = s2 end) end) val _ = Assert.assert ("TestRegexp.doesMatchAll", fn () => List.forall ([(any, "a"), (anys, "abc")], fn (r, s) => matchesAll (compile r, s))) val tests = List.map ([ ("\\a", "a"), ("^$", ""), ("abc", "abc"), (".", "a"), ("^foo$", "foo"), ("^...$", "foo"), ("^.*$", "foo"), ("^.*foo@bar\\.com$", "foo@bar.com"), ("(abc)","abc"), ("\\(abc\\)","(abc)"), ("(abc){2,4}$", "abcabc"), ("(abc){2,4}$", "abcabcabc"), ("(abc){2,4}$", "abcabcabcabc") ], fn (r, s) => let val opt = SOME (String.size s) in (#1 (valOf (fromString r)), s, opt, opt) end) @ [ (#1 (valOf (fromString "a")), "a", SOME 1, SOME 1), (#1 (valOf (fromString "a*")), "a", SOME 0, SOME 1), (#1 (valOf (fromString "a+")), "a", SOME 1, SOME 1), (#1 (valOf (fromString "a+")), "aa", SOME 1, SOME 2), (#1 (valOf (fromString "[^a]")), "a", NONE, NONE), (#1 (valOf (fromString "[^a]")), "b", SOME 1, SOME 1), (stringIgnoreCase "abc", "abc", SOME (3: int), SOME (3: int)), (stringIgnoreCase "abc", "aBC", SOME 3, SOME 3), (stringIgnoreCase "ab", "abab", SOME 2, SOME 2), (string "abc", "abc", SOME 3, SOME 3), (string "Abc", "abc", NONE, NONE), (seq [anchorStart, anchorFinish], "", SOME 0, SOME 0), (seq [anchorStart, string "abc", anchorFinish], "abc", SOME 3, SOME 3), (seq [or [null, anchorFinish], string "a"], "a", SOME 1, SOME 1), (seq [or [anchorFinish, null], string "a"], "a", SOME 1, SOME 1), (seq [], "abc", SOME 0, SOME 0), (seq [string "ab"], "ab", SOME 2, SOME 2), (seq [char #"a", char #"b", char #"c"], "abc", SOME 3, SOME 3), (seq [string "ab", null], "abc", SOME 2, SOME 2), (or [string "a", string "ab", string "abc"], "abc", SOME 1, SOME 3), (seq [or [string "ab", null], or [string "abcde", string "cd"]], "abcde", SOME 4, SOME 5), (star (or [null, char #"a"]), "aaa", SOME 0, SOME 3), (star (string "ab"), "ababab", SOME 0, SOME 6), let val r = Save.new () in (save (string "ab", r), "ab", SOME 2, SOME 2) end, let val r = Save.new () in (seq [string "a", save (string "bc", r), string "d"], "abcd", SOME 4, SOME 4) end, let val s1 = Save.new () val s2 = Save.new () in (seq [save (string "a", s1), save (string "b", s2)], "ab", SOME 2, SOME 2) end, let val s1 = Save.new () val s2 = Save.new () in (seq [save (string "a", s1), string "b", save (string "c", s2), string "d"], "abcd", SOME 4, SOME 4) end, let val s1 = Save.new () in (seq [string "a", save (string "b", s1), string "c"], "abc", SOME 3, SOME 3) end, let val s1 = Save.new () in (seq [string "abc", save (string "d", s1), string "e"], "abcde", SOME 5, SOME 5) end, let val s1 = Save.new () val s2 = Save.new () in (seq [string "abc", save (string "d", s1), string "e", save (string "f", s2)], "abcdef", SOME 6, SOME 6) end, let val s1 = Save.new () val s2 = Save.new () in (seq [string "abc", save (string "d", s1), string "e", save (string "fgh", s2)], "abcdefgh", SOME 8, SOME 8) end ] val _ = Assert.assert ("Test.Regexp.match", fn () => List.forall (tests, fn (r, s: string, i1, i2) => let val r = compile r val _ = Compiled.layoutDotToFile (r, "/tmp/z.dot") fun doit m = Option.map (m (r, s, 0), Match.length) in i1 = doit matchShort andalso i2 = doit matchLong end)) val tests = [(string "abc", "123abc", SOME (3: int, 6: int)), (string "abc", "123abcde", SOME (3, 6)), (string "abd", "123abcde", NONE), (seq [string "a", star (string "ab"), string "c"], "1234aabababcdef", SOME (4, 12))] val _ = Assert.assert ("Regexp.findShort", fn () => List.forall (tests, fn (r, s, opt) => opt = (Option.map (findShort (compile r, s, 0), fn m => let val (_, {start, length}) = Substring.base (Match.all m) in (start, start + length) end)))) val _ = Assert.assert ("Regexp.findShort2", fn () => List.forall ([(SOME (2, 4), (string "cd", "abcdef", 0)), (SOME (2, 4), (seq [char #"c", star (isNotChar Char.isSpace)], "abcd fg", 0))], fn (res, (r, s, i)) => res = Option.map (findLong (compile r, s, i), fn m => let val (_, {start, length}) = Substring.base (Match.all m) in (start, start + length) end))) end mlton-20100608/lib/mlton/basic/regexp.sml0000644000076600000240000025104011404435636016556 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Many of the algorithms in this module are based on * Compilers: Principles, Techniques, and Tools by Aho, Sethi, and Ullman, * which I will refer to in comments as the Dragon Book. *) local fun ++ (r: int ref): int = let val n = 1 + !r val _ = r := n in n end val numChars: int = Char.maxOrd + 1 local val validCharsString = "\n\t@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ()[]<>!?-&#;'/=\"$.\\" in val validChars = Vector.tabulate (numChars, fn i => String.contains (validCharsString, Char.fromInt i)) fun edgeLabel (cs: char list): string = let val chars = implode cs val n = String.size chars val numValidChars = String.size validCharsString in if n = numChars then "." else (if n >= Int.quot (numValidChars, 2) then (* Character complement. *) concat ["[^", String.alphabetize (String.keepAll (validCharsString, fn c => not (String.contains (chars, c)))), "]"] else if (1 = String.size chars andalso not (String.contains (". ", String.sub (chars, 0)))) then chars else concat ["[", chars, "]"]) end val edgeLabel = Trace.trace ("Regexp.edgeLabel", List.layout Char.layout, String.layout) edgeLabel end structure Save = struct datatype t = T of {index: int ref} fun layout (T {index, ...}) = let open Layout in seq [str "Save ", Int.layout (!index)] end fun new () = T {index = ref ~1} fun equals (T {index = i, ...}, T {index = i', ...}) = i = i' fun assign (T {index, ...}, i) = index := i fun index (T {index, ...}) = !index val index = Trace.trace ("Regexp.Save.index", layout, Int.layout) index end structure Regexp = struct datatype t = AnchorFinish | AnchorStart | CharSet of char -> bool | Or of t list | Seq of t list | Save of t * Save.t | Star of t fun layout (r: t): Layout.t = let open Layout in case r of AnchorFinish => str "AnchorFinish" | AnchorStart => str "AnchorStart" | CharSet f => seq [str "[", str (edgeLabel (Int.foldDown (0, numChars, [], fn (i, ac) => let val c = Char.fromInt i in if f c then c :: ac else ac end))), str "]"] | Or rs => seq [str "Or ", List.layout layout rs] | Seq rs => seq [str "Seq ", List.layout layout rs] | Save (r, s) => seq [str "Save ", Layout.tuple [layout r, Save.layout s]] | Star r => seq [str "Star ", layout r] end val toString = Layout.toString o layout end structure Stack: sig type 'a t val clear: 'a t -> unit val foreach: 'a t * ('a -> unit) -> unit val new: int * 'a -> 'a t val peekMap: 'a t * ('a ->'b option) -> 'b option val push: 'a t * 'a -> unit end = struct datatype 'a t = T of {elts: 'a array, size: int ref} fun new (size: int, dummy: 'a): 'a t = T {elts = Array.new (size, dummy), size = ref 0} fun push (T {elts, size}, x) = let val n = !size val _ = Array.update (elts, n, x) val _ = size := n + 1 in () end fun clear (T {size, ...}) = size := 0 fun foreach (T {elts, size, ...}, f) = Int.for (0, !size, fn i => f (Array.sub (elts, i))) fun peekMap (T {elts, size, ...}, f) = let val n = !size fun loop i = if i = n then NONE else (case f (Array.sub (elts, i)) of NONE => loop (i + 1) | SOME z => SOME z) in loop 0 end end (* NFA state. *) (* The states in an NFA are indexed from 0 to n-1, where n is the number * of states. *) structure State = struct type t = int val layout = Int.layout end structure MatchAction = struct datatype t = Finish of Save.t | Start of Save.t val equals = fn (Finish s, Finish s') => Save.equals (s, s') | (Start s, Start s') => Save.equals (s, s') | _ => false fun layout a = let open Layout in case a of Finish s => seq [str "Finish ", Save.layout s] | Start s => seq [str "Start ", Save.layout s] end end structure Match = struct datatype t = T of {all: Substring.t, matches: (Save.t * Substring.t) array} fun all (T {all, ...}) = all val startLength = #2 o Substring.base o all val endOf = Substring.endOf o all val length = Substring.length o all fun layout (T {all, matches}) = let open Layout in tuple [Substring.layout all, Array.layout (Layout.tuple2 (Save.layout, Substring.layout)) matches] end fun funs (T {matches, ...}) = let fun peek (s: Save.t): Substring.t option = Option.map (Array.peek (matches, fn (s', _) => Save.equals (s, s')), #2) in {exists = Option.isSome o peek, lookup = valOf o peek, peek = peek} end fun stringFuns m = let val {peek, lookup, exists} = funs m in {exists = exists, lookup = Substring.toString o lookup, peek = fn s => Option.map (peek s, Substring.toString)} end local fun make sel (m, s) = sel (funs m) s in val peek = make #peek val lookup = make #lookup val exists = make #exists end fun peekString (m, s) = Option.map (peek (m, s), Substring.toString) val lookupString = Substring.toString o lookup end structure Actions = struct datatype t = T of (int * MatchAction.t vector) list fun layout (T l) = List.layout (Layout.tuple2 (Int.layout, Vector.layout MatchAction.layout)) l val empty = T [] fun add (a as T l, i, v: MatchAction.t vector) = if Vector.isEmpty v then a else T ((i, v) :: l) end structure NFA = struct structure State = State (* State i is final iff isSome (Array.sub (final, i)). * Characters are grouped into equivalence classes, represented by * integers in [0, numCharClasses). * The equivalence class of c is Array.sub (charClass, Char.toInt c). * The dimensions of next is numStates x numCharClasses. * The outgoing states from state i on input char c are given by * Array2.sub (next, i, Array.sub (charClass, Char.to Int c)). * seen, stack1, and stack2 are used in the two stack simulation of * the NFA (see fun match). We preallocate them as part of the NFA * so they don't have to be allocated on each call to match. *) datatype t = T of {anchorStarts: (State.t * MatchAction.t vector) vector, charClass: int array, (* of length numChars *) final: {actions: MatchAction.t vector, requireFinish: bool} option array, next: (State.t * MatchAction.t vector) array Array2.t, saves: Save.t vector, seen: bool array, stack1: (State.t * Actions.t) Stack.t, stack2: (State.t * Actions.t) Stack.t, start: State.t} end (* Non-deterministic Finite Automaton. *) structure NFA: sig structure State: sig type t = int val layout: t -> Layout.t end datatype t = datatype NFA.t val fromRegexp: Regexp.t -> t val layoutDot: t * string (* title *) -> Layout.t val match: {nfa: t, short: bool, string: string, startPos: int} -> (int * Actions.t) option val numCharClasses: t -> int val numStates: t -> int val saves: t -> Save.t vector end = struct open NFA fun numStates (T {next, ...}) = Array2.nRows next fun numCharClasses (T {next, ...}) = Array2.nCols next fun saves (T {saves, ...}) = saves (* Simulating an NFA with two stacks and a bit vector, as in Algorithm * 3.4 (page 126) of the Dragon Book. *) fun match {nfa as T {anchorStarts, charClass, final, next, stack1, stack2, start, ...}, short, string = s, startPos}: (int * Actions.t) option = let val numStates = numStates nfa val n = String.size s val seen = Array.array (numStates, false) fun loop (current, nextStates, i: int, last: (int * Actions.t) option) : (int * Actions.t) option = let val last = case (Stack.peekMap (current, fn (s, a) => case Array.sub (final, s) of NONE => NONE | SOME {actions, requireFinish} => if requireFinish andalso i < n then NONE else SOME (i, Actions.add (a, i, actions)))) of NONE => last | s => s in if numStates = 0 orelse i = n orelse (short andalso isSome last) then (Stack.clear current ; last) else let val _ = Array.modify (seen, fn _ => false) val c = Array.sub (charClass, Char.toInt (String.sub (s, i))) val _ = Stack.foreach (current, fn (s, a) => Array.foreach (Array2.sub (next, s, c), fn (s', v) => if Array.sub (seen, s') then () else (Array.update (seen, s', true) ; (Stack.push (nextStates, (s', Actions.add (a, i, v))))))) val _ = Stack.clear current in loop (nextStates, current, i + 1, last) end end val _ = Stack.push (stack1, (start, Actions.empty)) val _ = if startPos = 0 then (Vector.foreach (anchorStarts, fn (s, v) => Stack.push (stack1, (s, Actions.add (Actions.empty, startPos, v))))) else () in loop (stack1, stack2, startPos, NONE) end (* This conversion from a regular expression to an NFA is based on * Section 3.9 (pages 134 -- 140) of the Dragon Book. * * It creates one NFA state for each CharSet (called a "position") that * is in the regexp. There is also one extra state for the start state. * It adds edges as in rules 1 and 2 (page 138) for the followpos * function. *) fun fromRegexp (r: Regexp.t): t = let fun loop (r, ac as (saves, numPos)) = let open Regexp in case r of AnchorFinish => (saves, numPos + 1) | AnchorStart => (saves, numPos + 1) | CharSet _ => (saves, numPos + 1) | Or rs => List.fold (rs, ac, loop) | Save (r, s) => loop (r, (s :: saves, numPos)) | Seq rs => List.fold (rs, ac, loop) | Star r => loop (r, ac) end val (saves, numPos) = loop (r, ([], 0)) val saves = Vector.fromList saves val numStates = numPos + 1 val start = numPos val posCounter = ref ~1 val follow: MatchAction.t vector option Array2.t = Array2.new (numStates, numStates, NONE) val posChars = Array2.tabulate (numPos, numChars, fn _ => false) local (* Sets of positions represented as vectors of length numPos. *) datatype t = T of MatchAction.t vector option vector in type set = t fun lookup (T v, s) = Vector.sub (v, s) val empty: t = T (Vector.new (numPos, NONE)) fun addActions (T v, a) = T (Vector.map (v, fn opt => Option.map (opt, fn a' => Vector.concat [a, a']))) fun addAction (s, a) = addActions (s, Vector.new1 a) fun union (T v, T v'): t = T (Vector.tabulate (numPos, fn i => case (Vector.sub (v, i), Vector.sub (v', i)) of (NONE, a) => a | (a, NONE) => a | _ => Error.bug "Regexp.NFA.fromRegexp.union")) fun singleton (i: int): t = T (Vector.tabulate (numPos, fn j => if i = j then SOME (Vector.new0 ()) else NONE)) fun foreach (T v, f) = Vector.foreachi (v, fn (i, opt) => case opt of NONE => () | SOME a => f (i, a)) end fun connect (v, v') = foreach (v, fn (s, a) => foreach (v', fn (s', a') => Array2.update (follow, s, s', SOME (Vector.concat [a, a'])))) val anchorFinishes = ref [] val anchorStarts = ref [] fun anchor r = let val i = ++ posCounter val _ = List.push (r, i) val first = singleton i in {first = first, last = first, nullable = NONE} end (* The following loop fills in follow and posChars. * first set of positions that * nullable is SOME v iff the regexp is nullable, where v is the * sequence of actions to perform if the expression is null. *) fun loop (r: Regexp.t): {first: set, last: set, nullable: MatchAction.t vector option} = case r of Regexp.AnchorFinish => anchor anchorFinishes | Regexp.AnchorStart => anchor anchorStarts | Regexp.CharSet f => let val i = ++ posCounter val _ = Int.for (0, numChars, fn c => if f (Char.chr c) then Array2.update (posChars, i, c, true) else ()) val first = singleton i in {first = first, last = first, nullable = NONE} end | Regexp.Or rs => List.fold (rs, {first = empty, last = empty, nullable = NONE}, fn (r, {first = f, last = l, nullable = n}) => let val {first = f', last = l', nullable = n'} = loop r in {first = union (f, f'), last = union (l, l'), nullable = if isSome n then n else n'} end) | Regexp.Save (r, s) => let val {first = f, last = l, nullable = n} = loop r val start = MatchAction.Start s val finish = MatchAction.Finish s in {first = addAction (f, start), last = addAction (l, finish), nullable = Option.map (n, fn v => Vector.concat [Vector.new1 start, v, Vector.new1 finish])} end | Regexp.Seq rs => List.fold (rs, {first = empty, last = empty, nullable = SOME (Vector.new0 ())}, fn (r, {first = f, last = l, nullable = n}) => let val {first = f', last = l', nullable = n'} = loop r val _ = connect (l, f') val first = case n of NONE => f | SOME v => union (f, addActions (f', v)) val last = case n' of NONE => l' | SOME v => union (l', addActions (l, v)) in {first = first, last = last, nullable = (case (n, n') of (SOME v, SOME v') => SOME (Vector.concat [v, v']) | _ => NONE)} end) | Regexp.Star r => let val {first = f, last = l, ...} = loop r val _ = connect (l, f) in {first = f, last = l, nullable = SOME (Vector.new0 ())} end val {first, last, nullable} = loop r local fun extract (anchors, positions) = Vector.keepAllMap (Vector.fromListMap (!anchors, fn s => Option.map (lookup (positions, s), fn v => (s, v))), fn x => x) in (* Any anchor starts in first should be anchor starts. *) val anchorStarts = extract (anchorStarts, first) (* Any anchor finishes in last should be anchor finishes *) val anchorFinishes = extract (anchorFinishes, last) end (* The positions in first are reachable from the start state. *) val _ = foreach (first, fn (i, a) => Array2.update (follow, start, i, SOME a)) val final = Array.array (numStates, NONE) (* The positions that are followed by an anchorFinish are final, * with requireFinish = true. *) val _ = Vector.foreach (anchorFinishes, fn (j, _) => Int.for (0, numStates, fn i => case Array2.sub (follow, i, j) of NONE => () | SOME a => Array.update (final, i, SOME {actions = a, requireFinish = true}))) (* The positions in last are all final. *) val _ = foreach (last, fn (i, a) => Array.update (final, i, SOME {actions = a, requireFinish = false})) (* The start state is final iff the whole regexp is nullable. *) val _ = case nullable of NONE => () | SOME v => Array.update (final, start, SOME {actions = v, requireFinish = false}) (* Compute the transition table, "next". *) val tmp: MatchAction.t vector option Array.t = Array.new (numStates, NONE) val next = Array2.tabulate (numStates, numChars, fn (i, c) => let val _ = Int.for (0, numPos, fn j => case Array2.sub (follow, i, j) of NONE => () | SOME a => if Array2.sub (posChars, j, c) then Array.update (tmp, j, SOME a) else ()) val res = Array.keepAllMapi (tmp, fn (i, opt) => Option.map (opt, fn v => (i, v))) val _ = Int.for (0, numStates, fn j => Array.update (tmp, j, NONE)) in res end) (* Two characters are equivalent if all states treat them the * same. *) fun charEquiv (c: int, c': int) = Int.forall (0, numStates, fn i => Array.equals (Array2.sub (next, i, c), Array2.sub (next, i, c'), fn ((j, v), (j', v')) => j = j' andalso Vector.equals (v, v', MatchAction.equals))) (* Compute charClass. *) val repCounter = ref ~1 val reps = ref [] (* representative of each char class *) val charClass = Array.new (numChars, ~1) val _ = Int.for (0, numChars, fn c => let val rep = case List.peek (!reps, fn {char, ...} => charEquiv (c, char)) of NONE => let val rep = ++ repCounter in List.push (reps, {char = c, rep = rep}) ; rep end | SOME {rep, ...} => rep in Array.update (charClass, c, rep) end) val numClasses = 1 + !repCounter (* Compute "next" for the charClasses. *) val next' = Array2.new (numStates, numClasses, Array.fromList []) val _ = List.foreach (!reps, fn {char, rep} => Int.for (0, numStates, fn state => Array2.update (next', state, rep, Array2.sub (next, state, char)))) in T {anchorStarts = anchorStarts, charClass = charClass, final = final, next = next', saves = saves, seen = Array.new (numStates, false), stack1 = Stack.new (numStates, (~1, Actions.empty)), stack2 = Stack.new (numStates, (~1, Actions.empty)), start = start} end structure Graph = DirectedGraph fun layoutDot (T {anchorStarts, charClass, final, next, start, ...}, title: string): Layout.t = let val numStates = Array2.nRows next open Dot val g = Graph.new () val nodes = Vector.tabulate (numStates, fn _ => Graph.newNode g) fun node i = Vector.sub (nodes, i) val {get = nodeOptions, ...} = Property.get (Graph.Node.plist, Property.initFun (fn _ => let open NodeOption in ref [] end)) val {get = edgeOptions, ...} = Property.get (Graph.Edge.plist, Property.initFun (fn _ => let open EdgeOption in ref [] end)) fun addNodeOption (i, opts) = let val r = nodeOptions (node i) in r := opts @ !r end val _ = addNodeOption (start, [NodeOption.label "start"]) val _ = Int.for (0, numStates, fn src => let val shape = case (isSome (Array.sub (final, src)), Vector.exists (anchorStarts, fn (s, _) => s = src)) of (false, false) => Ellipse | (true, false) => Box | (false, true) => Diamond | (true, true) => Polygon {sides = 5, options = []} val _ = addNodeOption (src, let open NodeOption in [Shape shape] end) val dsts = Array.new (numStates, []) val _ = Int.forDown (0, numChars, fn c => if Vector.sub (validChars, c) then let val char = Char.fromInt c val class = Array.sub (charClass, c) in Array.foreach (Array2.sub (next, src, class), fn (dst, _) => (Array.update (dsts, dst, char :: Array.sub (dsts, dst)))) end else ()) in Array.foreachi (dsts, fn (dst, cs) => case cs of [] => () | _ => let val edge = Graph.addEdge (g, {from = node src, to = node dst}) in List.push (edgeOptions edge, EdgeOption.label (edgeLabel cs)) end) end) in Graph.layoutDot (g, fn {nodeName} => {title = title, options = let open GraphOption in [ RankDir LeftToRight, Rank (Min, [{nodeName = nodeName (node start)}]) ] end, edgeOptions = ! o edgeOptions, nodeOptions = ! o nodeOptions}) end end structure DFA: sig type t val fromNFA: NFA.t -> t val layoutDot: {dfa: t, showDead: bool, title: string} -> Layout.t val match: {dfa: t, short: bool, string: string, startPos: int, anchorStart: bool} -> (int * Actions.t) option val minimize: t -> t val saves: t -> Save.t vector end = struct (* The states in a DFA are indexed from 0 to n-1, where n is the number * of states. *) structure State = struct type t = int val layout = Int.layout end type slot = int structure EdgeAction = struct datatype t = Add of {from: slot, to: slot, actions: MatchAction.t vector} | Init of {to: slot, actions: MatchAction.t vector} val equals = fn (Add {from = f, to = t, actions = a}, Add {from = f', to = t', actions = a'}) => f = f' andalso t = t' andalso Vector.equals (a, a', MatchAction.equals) | (Init {to = t, actions = a}, Init {to = t', actions = a'}) => t = t' andalso Vector.equals (a, a', MatchAction.equals) | _ => false val toString = fn Add {from, to, actions} => concat ["(", Int.toString from, ", ", Int.toString to, ", ", Layout.toString (Vector.layout MatchAction.layout actions), ")"] | Init {to, actions} => concat ["(", Int.toString to, ", ", Layout.toString (Vector.layout MatchAction.layout actions), ")"] val layout = let open Layout in fn Add {from, to, actions} => Layout.record [("from", Int.layout from), ("to", Int.layout to), ("actions", Vector.layout MatchAction.layout actions)] | Init {actions, to} => Layout.record [("to", Int.layout to), ("actions", Vector.layout MatchAction.layout actions)] end end (* State i is final iff Array.sub (final, i). * Characters are grouped into equivalence classes, represented by * integers in [0, numCharClasses). * The equivalence class of c is Array.sub (charClass, Char.toInt c). * The dimensions of next are numStates x numCharClasses * The outgoing state from state i on input char c is * Array2.sub (next, i, Array.sub (charClass, Char.toInt c)). * actions1 and actions2 are used only during matching. They * represent the actions associated with each NFA state. They are of * the same length as the number of states in the NFA. *) datatype t = T of {anchorStart: State.t, anchorStartStack: MatchAction.t vector vector, charClass: int array, (* of length numChars *) dead: bool array, final: {actions: MatchAction.t vector, requireFinish: bool, slot: int} option array, next: (State.t * EdgeAction.t vector) Array2.t, saves: Save.t vector, stack1: Actions.t array, (* of size maxNumNFAStates *) stack2: Actions.t array, (* of size maxNumNFAStates *) start: State.t, startStack: MatchAction.t vector vector} fun numStates (T {next, ...}): int = Array2.nRows next fun saves (T {saves, ...}) = saves fun dead (numStates, numCharClasses, final, next) = Array.tabulate (numStates, fn i => not (isSome (Array.sub (final, i))) andalso Int.forall (0, numCharClasses, fn c => let val (j, v) = Array2.sub (next, i, c) in i = j andalso Vector.isEmpty v end)) (* To build a DFA from an NFA, I use the usual "subset construction", * as in algorithm 3.2 (page 118) of the Dragon Book. * * It associates each (reachable) set of states in the NFA with a single * state in the DFA. *) fun fromNFA (nfa as NFA.T {anchorStarts, charClass, final, next, saves, start, ...}) = let val numNFAStates = NFA.numStates nfa val numCharClasses = NFA.numCharClasses nfa (* Determine the NFA states that have save info. *) val nfaStateSave = Array.array (numNFAStates, false) fun visit (s: NFA.State.t): unit = if Array.sub (nfaStateSave, s) then () else (Array.update (nfaStateSave, s, true) ; Int.for (0, numCharClasses, fn c => Array.foreach (Array2.sub (next, s, c), fn (s', _) => visit s'))) val _ = Vector.foreach (anchorStarts, fn (s, v) => if Vector.isEmpty v then () else visit s) val _ = Int.for (0, numNFAStates, fn s => if Array.sub (nfaStateSave, s) then () else Int.for (0, numCharClasses, fn c => Array.foreach (Array2.sub (next, s, c), fn (s', v) => if Vector.isEmpty v then () else visit s'))) (* Sets of states are represented as arrays, sorted in increasing * order of state index. *) type states = NFA.State.t array val counter = ref ~1 type work = {states: states, state: int, out: (State.t * EdgeAction.t vector) vector option ref} val cache: work list ref = ref [] val todo: work list ref = ref [] val maxNumStates: int ref = ref 0 fun statesToState (ss: states): State.t = let val n = Array.length ss val _ = if n > !maxNumStates then maxNumStates := n else () in case List.peek (!cache, fn {states, ...} => Array.equals (ss, states, op =)) of NONE => let val state = ++ counter val work = {out = ref NONE, state = state, states = ss} val _ = List.push (cache, work) val _ = List.push (todo, work) in state end | SOME {state, ...} => state end val statesToState = Trace.trace ("Regexp.DFA.fromNFA.statesToState", Array.layout NFA.State.layout, State.layout) statesToState local val seen = Array.array (NFA.numStates nfa, NONE) in fun computeOut states = Vector.tabulate (numCharClasses, fn c => let val _ = Array.modify (seen, fn _ => NONE) val _ = Array.foreachi (states, fn (fromSlot: slot, fromState: NFA.State.t) => Array.foreach (Array2.sub (next, fromState, c), fn (toState: NFA.State.t, v) => case Array.sub (seen, toState) of NONE => Array.update (seen, toState, SOME {fromSlot = fromSlot, fromState = fromState, toState = toState, actions = v}) | SOME _ => ())) val toStates = Array.keepAllMap (seen, fn opt => opt) val edgeActions = ref [] val toStates = Array.mapi (toStates, fn (toSlot: slot, {fromSlot, fromState, toState, actions}) => (if Array.sub (nfaStateSave, toState) then List.push (edgeActions, if Array.sub (nfaStateSave, fromState) then EdgeAction.Add {from = fromSlot, to = toSlot, actions = actions} else (EdgeAction.Init {to = toSlot, actions = actions})) else () ; toState)) in (statesToState toStates, Vector.fromList (!edgeActions)) end) end fun loop () = case !todo of [] => () | {states, out, ...} :: rest => (todo := rest ; out := SOME (computeOut states) ; loop ()) (* These calls to statesToState initialize the worklist. *) val start' = statesToState (Array.fromList [start]) val startStack = Vector.new1 (Vector.new0 ()) val anchorStartStates = Array.fromList (List.insert (Vector.toListMap (anchorStarts, #1), start, op <=)) val anchorStart' = statesToState anchorStartStates val anchorStartStack = Vector.tabulate (Array.length anchorStartStates, fn i => let val s = Array.sub (anchorStartStates, i) in case Vector.peek (anchorStarts, fn (s', _) => s = s') of NONE => Vector.new0 () | SOME (_, v) => v end) val _ = loop () (* The worklist is empty. Compute the transition table. *) val numStates = 1 + !counter val next' = Array2.new (numStates, numCharClasses, (~1, Vector.new0 ())) val final' = Array.new (numStates, NONE) val _ = List.foreach (!cache, fn {states, state = i, out, ...}: work => let val _ = Vector.foreachi (valOf (! out), fn (c, j) => Array2.update (next', i, c, j)) val _ = case Array.sub (final', i) of SOME {requireFinish = false, ...} => () | _ => case Array.peekMapi (states, fn s => Array.sub (final, s)) of NONE => () | SOME (slot, {actions, requireFinish}) => Array.update (final', i, SOME {actions = actions, requireFinish = requireFinish, slot = slot}) in () end) fun newStack () = Array.new (!maxNumStates, Actions.empty) in T {anchorStart = anchorStart', anchorStartStack = anchorStartStack, charClass = charClass, dead = dead (numStates, numCharClasses, final', next'), final = final', next = next', saves = saves, stack1 = newStack (), stack2 = newStack (), start = start', startStack = startStack} end (* * match could be sped up some by doing the match in two passes. * The first pass just determines if the match will succeed. * The second pass computes all the edge actions. *) fun match {dfa = T {anchorStart = ancSt, anchorStartStack, charClass, dead, final, next, stack1, stack2, start, startStack, ...}, short: bool, string = s, startPos: int, anchorStart: bool}: (int * Actions.t) option = let val n = String.size s fun loop (i: int, state: int, stack1, stack2, last: (int * Actions.t) option) : (int * Actions.t) option = let val last = case Array.sub (final, state) of NONE => last | SOME {actions, requireFinish, slot} => if requireFinish andalso i < n then NONE else SOME (i, Actions.add (Array.sub (stack1, slot), i, actions)) in if Array.sub (dead, state) orelse i = n orelse (short andalso isSome last) then last else let val (state, edgeActions) = Array2.sub (next, state, Array.sub (charClass, Char.toInt (String.sub (s, i)))) val _ = Vector.foreach (edgeActions, fn EdgeAction.Add {from, to, actions} => Array.update (stack2, to, Actions.add (Array.sub (stack1, from), i, actions)) | EdgeAction.Init {to, actions} => Array.update (stack2, to, Actions.add (Actions.empty, i, actions))) in loop (i + 1, state, stack2, stack1, last) end end val (state, initStack) = if anchorStart then (ancSt, anchorStartStack) else (start, startStack) val _ = Vector.foreachi (initStack, fn (slot, v) => Array.update (stack1, slot, Actions.add (Actions.empty, startPos, v))) val res = loop (startPos, state, stack1, stack2, NONE) in res end val match = Trace.trace ("Regexp.DFA.match", fn {string, startPos, ...} => Layout.tuple [String.layout string, Int.layout startPos], Option.layout (Layout.tuple2 (Int.layout, Actions.layout))) match structure Graph = DirectedGraph structure Env = Env (structure Domain = MonoVector (EdgeAction)) fun layoutDot {dfa as T {anchorStart, charClass, dead, final, next, start, ...}, title: string, showDead: bool}: Layout.t = let val numStates = numStates dfa open Dot val g = Graph.new () val nodes = Vector.tabulate (numStates, fn _ => Graph.newNode g) fun node i = Vector.sub (nodes, i) val {get = nodeOptions, ...} = Property.get (Graph.Node.plist, Property.initFun (fn _ => let open NodeOption in ref [] end)) val {get = edgeOptions, ...} = Property.get (Graph.Edge.plist, Property.initFun (fn _ => let open EdgeOption in ref [] end)) fun addNodeOption (i, opts) = let val r = nodeOptions (node i) in r := opts @ !r end val _ = addNodeOption (start, [NodeOption.label "start"]) val _ = Int.for (0, numStates, fn src => let val shape = case (isSome (Array.sub (final, src)), src = anchorStart) of (false, false) => Ellipse | (true, false) => Box | (false, true) => Diamond | (true, true) => Polygon {sides = 5, options = []} val _ = addNodeOption (src, let open NodeOption in [Shape shape] end) val dsts = Array.new (numStates, Env.empty ()) val _ = Int.forDown (0, numChars, fn c => if Vector.sub (validChars, c) then let val (dst, v) = Array2.sub (next, src, Array.sub (charClass, c)) val e = Array.sub (dsts, dst) val c = Char.fromInt c val cs = case Env.peek (e, v) of NONE => [c] | SOME cs => c :: cs in Array.update (dsts, dst, Env.extend (e, v, cs)) end else ()) val src = node src in Array.foreachi (dsts, fn (dst, e) => if not showDead andalso Array.sub (dead, dst) then () else Env.foreachi (e, fn (v, cs) => let val edge = Graph.addEdge (g, {from = src, to = node dst}) val label = concat [edgeLabel cs, " -- ", Layout.toString (Vector.layout (Layout.str o EdgeAction.toString) v)] in List.push (edgeOptions edge, EdgeOption.label label) end)) end) in Graph.layoutDot (g, fn {nodeName} => {title = title, options = let open GraphOption in [ RankDir LeftToRight, Rank (Min, [{nodeName = nodeName (node start)}]) ] end, edgeOptions = ! o edgeOptions, nodeOptions = ! o nodeOptions}) end fun minimize d = d (* This DFA minimization algorithm is based on algorithm 3.6 (page 142) * of the Dragon Book. * * It maintains an array, r, that stores for each state s the * representative of the class to which s belongs. * It repeatedly refines an equivalence relation, represented by a list * of classes, where each class is a list of states. *) (* fun minimize (dfa as T {anchorStart, charClass, final, * start, next, ...}): t = * let * val numStates = numStates dfa * val numCharClasses = numCharClasses dfa * type class = int list * type classes = class list * val repCounter = ref ~1 * val change = ref false * fun newRep () = (change := true; ++ repCounter) * val finRep = newRep () * val nonfinRep = newRep () * val r = Array.tabulate (numStates, fn i => * if Array.sub (final, i) * then finRep * else nonfinRep) * fun rep s = Array.sub (r, s) * fun trans (s, c) = rep (Array2.sub (next, s, c)) * fun refine (class: class, ac: classes): classes = * let * val r = * List.fold * (class, [], fn (state, classes) => * let * fun loop (classes, ac) = * case classes of * [] => * (case ac of * [] => [{class = [state], * old = state}] * | _ => * let * val s = newRep () * val _ = Array.update (r, state, s) * in {class = [state], * old = state} :: ac * end) * | (z as {class, old}) :: classes => * if Int.forall * (0, numCharClasses, fn c => * trans (old, c) = trans (state, c)) * then * (Array.update (r, state, rep old) * ; {class = state :: class, * old = old} :: (List.appendRev * (classes, ac))) * else loop (classes, z :: ac) * in loop (classes, []) * end) * in List.fold (r, ac, fn ({class, ...}, ac) => * case class of * [_] => ac * | _ => class :: ac) * end * val refine = * Trace.trace ("refine", * (List.layout Int.layout o #1), * Layout.ignore) * refine * fun refineAll (classes: classes): unit = * case classes of * [] => () * | _ => * let * val _ = change := false * val classes = * List.fold (classes, [], fn (class, ac) => * case class of * [_] => ac * | _ => refine (class, ac)) * in if !change * then refineAll classes * else () * end * val (fin, nonfin) = * Int.fold (0, numStates, ([], []), fn (i, (f, n)) => * if Array.sub (final, i) * then (i :: f, n) * else (f, i :: n)) * val _ = refineAll [fin, nonfin] * val numStates' = 1 + !repCounter * (* Compute reachable states. *) * val reached = Array.new (numStates', false) * fun visit (s: int (* an old state *)): unit = * let * val s' = rep s * in * if Array.sub (reached, s') * then () * else (Array.update (reached, s', true) * ; Int.for (0, numCharClasses, fn c => * visit (Array2.sub (next, s, c)))) * end * val _ = visit start * val _ = visit anchorStart * (* Compute new representatives. *) * val c = ref ~1 * val newR = Array.tabulate (numStates', fn s => * if Array.sub (reached, s) * then ++ c * else ~1) * val numStates' = 1 + !c * val _ = Array.modify (r, fn s => Array.sub (newR, s)) * val next' = Array2.new (numStates', numCharClasses, ~1) * val _ = * Array2.foreachi * (next, fn (s, c, s') => * Array2.update (next', rep s, c, rep s')) * val final' = Array.array (numStates', false) * val _ = * Array.foreachi * (final, fn (i, b) => * if b then Array.update (final', rep i, true) else ()) * in T {anchorStart = rep anchorStart, * charClass = charClass, * dead = dead (numStates', numCharClasses, final', next'), * final = final', * start = rep start, * next = next'} * end *) end in structure Regexp: REGEXP = struct structure Save = Save structure Match = Match open Regexp val anchorFinish = AnchorFinish val anchorStart = AnchorStart val isChar = CharSet fun isNotChar f = isChar (not o f) fun char c = isChar (fn c' => c = c') fun notChar c = isChar (fn c' => c <> c') val or = Or val save = Save val seq = Seq val star = Star val zeroOrMore = star val dquote = char #"\"" val any = isChar (fn _ => true) val anys = star any val ascii = isChar (fn c => ord c <= 127) val asciis = star ascii val none = isChar (fn _ => false) fun oneOf s = isChar (fn c => String.contains (s, c)) fun notOneOf s = isNotChar (fn c => String.contains (s, c)) val digit = isChar Char.isDigit val digits = star digit val nonDigit = isNotChar Char.isDigit val space = isChar Char.isSpace val spaces = star space fun string (s: string): t = seq (Int.foldDown (0, String.size s, [], fn (i, ac) => char (String.sub (s, i)) :: ac)) fun stringIgnoreCase (s: string): t = seq (Int.foldDown (0, String.size s, [], fn (i, ac) => let val c = Char.toLower (String.sub (s, i)) in isChar (fn c' => c = Char.toLower c') end :: ac)) val null = seq [] (* Language containing the empty string only. *) fun oneOrMore r = seq [r, star r] fun optional r = or [null, r] fun repeat (r, n: int) = seq (List.tabulate (n, fn _ => r)) fun lower (r, n: int) = seq [repeat (r, n), star r] fun upper (r, n: int) = if n <= 0 then null else or [null, seq [r, upper (r, n - 1)]] fun range (r, n: int, m: int) = seq [repeat (r, n), upper (r, m - n)] structure Compiled = struct datatype machine = DFA of DFA.t | NFA of NFA.t datatype t = T of {regexp: Regexp.t, machine: machine} fun layoutDot (T {machine, ...}) = case machine of DFA m => DFA.layoutDot {dfa = m, showDead = false, title = "dfa"} | NFA m => NFA.layoutDot (m, "nfa") fun layoutDotToFile (c: t, f: File.t) = File.withOut (f, fn out => Layout.output (layoutDot c, out)) fun layout (T {regexp, ...}) = let open Layout in Regexp.layout regexp (* align [case machine of DFA dfa => DFA.layout dfa | NFA nfa => NFA.layout nfa (* str "implementing", Regexp.layout regexp *) ] *) end fun match {compiled = T {machine, ...}, short, startPos, string} = let val anchorStart = startPos = 0 val (saves, opt) = case machine of DFA dfa => (DFA.saves dfa, DFA.match {anchorStart = anchorStart, dfa = dfa, short = short, string = string, startPos = startPos}) | NFA nfa => (NFA.saves nfa, NFA.match {nfa = nfa, short = short, string = string, startPos = startPos}) exception No in Option.map (opt, fn (stop, Actions.T actions) => let val _ = Vector.foreachi (saves, fn (i, s) => Save.assign (s, i)) val n = Vector.length saves val starts = Array.array (n, ~1) val matches = Array.array (n, NONE) val _ = List.foreach (rev actions, fn (i, v) => Vector.foreach (v, fn ma => case ma of MatchAction.Finish s => let val index = Save.index s val start = Array.sub (starts, index) in Array.update (matches, index, SOME (Substring.substring (string, {start = start, length = i - start}))) end | MatchAction.Start s => Array.update (starts, Save.index s, i))) val matches = Array.keepAllMapi (matches, fn (i, sso) => case sso of NONE => NONE | SOME ss => SOME (Vector.sub (saves, i), ss)) val all = Substring.substring (string, {start = startPos, length = stop - startPos}) in Match.T {all = all, matches = matches} end) handle No => NONE end val match = Trace.trace ("Regexp.Compiled.match", fn {compiled, short, startPos, string} => Layout.record [("short", Bool.layout short), ("startPos", Int.layout startPos), ("string", String.layout string), ("compiled", layout compiled)], Option.layout Match.layout) match fun matchLong (c, s, i) = match {compiled = c, short = false, startPos = i, string = s} fun matchShort (c, s, i) = match {compiled = c, short = true, startPos = i, string = s} fun matchAll (r, s) = case matchLong (r, s, 0) of NONE => NONE | SOME m => if String.size s = Substring.length (Match.all m) then SOME m else NONE val matchesAll = isSome o matchAll fun matchPrefix (r, s) = matchShort (r, s, 0) val matchesPrefix = isSome o matchPrefix fun find (c: t, s: string, startPos, short: bool) = let val n = String.size s fun loop (i: int) = if i >= n then NONE else case match {compiled = c, short = short, startPos = i, string = s} of NONE => loop (i + 1) | SOME m => SOME m in loop startPos end fun findLong (c, s, i) = find (c, s, i, false) fun findShort (c, s, i) = find (c, s, i, true) fun foreachMatchShort (c, s, f: Match.t -> unit) = let fun loop i = case findShort (c, s, i) of NONE => () | SOME m => (f m; loop (Match.endOf m)) in loop 0 end end fun compileDFA r = let val nfa = NFA.fromRegexp r in Compiled.T {regexp = r, machine = Compiled.DFA (DFA.minimize (DFA.fromNFA nfa))} end val compileDFA = Trace.trace ("Regexp.compileDFA", layout, Compiled.layout) compileDFA fun compileNFA r = Compiled.T {regexp = r, machine = Compiled.NFA (NFA.fromRegexp r)} val compileNFA = Trace.trace ("Regexp.compileNFA", layout, Compiled.layout) compileNFA (* POSIX 1003.2 regular expressions * caveats: does not support back references '\N' * does not support unmatched ')' * does not support '[=' style coallating elements * does not support coallating elements as range endpoints * * grammar: * S ::= Re * Re ::= Br Re0 * Re0 ::= e | '|' Br Re0 * Br ::= P Br0 * Br0 ::= e | P Br0 * P ::= A P0 * P0 ::= e | '*' | '+' | '?' | Bnd * Bnd ::= '{' N Bnd0 '}' * Bnd0 ::= e | ',' Bnd1 * Bnd1 ::= e | N * A ::= '(' Re ')' * | '()' * | '[' Be ']' * | '.' * | '^' * | '$' * | '\' C * | C * Be ::= Be0 * Be0 ::= '^' Be1 | Be1 * Be1 ::= ']' Be2 | Be2 * Be2 ::= '-' Be3 | Be3 * Be3 ::= e * | '-' * | C '-' C Be3 * | '[' '.' Ce '.' ']' Be3 * | '[' ':' Cl ':' ']' Be3 * | C Be3 * Ce ::= e | C Ce * Cl ::= 'alnum' | ... | 'xdigit' *) local exception X of string type res = t * Save.t vector fun S (s: char list) : res = Re (s, fn (s, re, saves) => case s of [] => (re, saves) | _ => raise (X "S")) and Re (s: char list, k: char list * t * Save.t vector -> res) = Br (s, fn (s, re, saves) => Re0 (s, [re], [saves], k)) and Re0 (s: char list, res: t list, savess: Save.t vector list, k: char list * t * Save.t vector -> res) = let fun finish s = k (s, or (List.rev res), Vector.concat (List.rev savess)) in case s of [] => finish s | #")"::_ => finish s | #"|"::s => Br (s, fn (s, re, saves) => Re0 (s, re::res, saves::savess, k)) | _ => raise (X "Re0") end and Br (s: char list, k: char list * t * Save.t vector -> res) = P (s, fn (s, re, saves) => Br0 (s, [re], [saves], k)) and Br0 (s: char list, res: t list, savess: Save.t vector list, k: char list * t * Save.t vector -> res) = let fun finish s = k (s, seq (List.rev res), Vector.concat (List.rev savess)) in case s of [] => finish s | #")"::_ => finish s | #"|"::_ => finish s | _ => P (s, fn (s, re, saves) => Br0 (s, re::res, saves::savess, k)) end and P (s: char list, k: char list * t * Save.t vector -> res) = A (s, fn (s, re, saves) => P0 (s, re, saves, [], [], k)) and P0 (s: char list, re: t, saves: Save.t vector, res: t list, savess: Save.t vector list, k: char list * t * Save.t vector -> res) = let fun finish (s, re) = k (s, seq (List.rev (re::res)), Vector.concat (List.rev (saves::savess))) fun default () = let val res = re::res val savess = saves::savess in A (s, fn (s, re, saves) => P0 (s, re, saves, res, savess, k)) end in case s of [] => finish (s, re) | #")"::_ => finish (s, re) | #"|"::_ => finish (s, re) | #"*"::s => finish (s, star re) | #"+"::s => finish (s, oneOrMore re) | #"?"::s => finish (s, optional re) | #"{"::(c::s) => if Char.isDigit c then Bnd (c::s, fn (s, f) => finish (s, f re)) else default () | _ => default () end and Bnd (s: char list, k: char list * (t -> t) -> res) = N (s, fn (s, n) => Bnd0 (s, n, fn (s, f) => case s of #"}"::s => k (s, f) | _ => raise (X "Bnd"))) and Bnd0 (s: char list, n: int, k: char list * (t -> t) -> res) = let fun finish (s, f) = k (s, f) in case s of #"}"::_ => finish (s, fn re => repeat (re, n)) | #","::s => Bnd1 (s, n, k) | _ => raise (X "Bnd0") end and Bnd1 (s: char list, n: int, k: char list * (t -> t) -> res) = let fun finish (s, f) = k (s, f) in case s of #"}"::_ => finish (s, fn re => lower (re, n)) | _ => N (s, fn (s, m) => if m < n then raise (X "Bnd1") else finish (s, fn re => range (re, n, m))) end and N (s: char list, k: char list * int -> res) = let in case s of d::s' => (case Char.digitToInt d of SOME d => N1 (s', d, k) | NONE => raise (X "N")) | _ => raise (X "N") end and N1 (s: char list, n: int, k: char list * int -> res) = let fun finish s = k (s, n) in case s of [] => finish s | d::s' => (case Char.digitToInt d of SOME d => N1 (s', n * 10 + d, k) | NONE => finish s) end and A (s: char list, k: char list * t * Save.t vector -> res) = let fun finish (s, re, saves) = k (s, re, saves) fun finishR (s, re) = finish (s, re, Vector.new0 ()) fun finishN s = finishR (s, null) fun finishC (s, c) = finishR (s, char c) in case s of #"("::(#")"::s) => finishN s | #"("::s => let val save' = Save.new () in Re (s, fn (s, re, saves) => case s of #")"::s => k (s, save (re, save'), Vector.concat [Vector.new1 save', saves]) | _ => raise (X "A")) end | #"["::s => let in Be (s, fn (s, re) => case s of #"]"::s => finishR (s, re) | _ => raise (X "A")) end | #"."::s => finishR (s, any) | #"^"::s => finishR (s, anchorStart) | #"$"::s => finishR (s, anchorFinish) | #"\\"::(c::s) => finishC (s, c) | c::s => if String.contains (")|*+?{", c) then raise (X "A") else finishC (s, c) | _ => raise (X "A") end and Be (s: char list, k: char list * t -> res) = Be0 (s, k) and Be0 (s: char list, k: char list * t -> res) = let in case s of #"^"::s => Be1 (s, true, k) | _ => Be1 (s, false, k) end and Be1 (s: char list, inv: bool, k: char list * t -> res) = let in case s of #"]"::s => Be2 (s, inv, [#"]"], k) | _ => Be2 (s, inv, [], k) end and Be2 (s: char list, inv: bool, cs: char list, k: char list * t -> res) = let in case s of #"-"::s => Be3 (s, inv, #"-"::cs, [], [], k) | _ => Be3 (s, inv, cs, [], [], k) end and Be3 (s: char list, inv: bool, cs: char list, cps: (char -> bool) list, ces: string list, k: char list * t -> res) = let fun finish (s: char list, cs: char list, cps: (char -> bool) list, ces: string list) = let fun finish' re = k (s, re) val s = implode cs val cp = fn c => List.exists (cps, fn cp => cp c) in if inv then (case ces of [] => finish' (isNotChar (fn c => cp c orelse String.contains (s, c))) | _ => Error.bug "Regexp.fromString: can't handle collating elements in negated bracket expressions") else finish' (List.fold (ces, or [isChar cp, oneOf s], fn (ce, re) => or [string ce, re])) end in case s of #"]"::_ => finish (s, cs, cps, ces) | #"-"::s => (case s of #"]"::_ => finish (s, #"-"::cs, cps, ces) | _ => raise (X "Be3")) | c1::(#"-"::(c2::s)) => let val r1 = Char.ord c1 val r2 = Char.ord c2 val cp = fn c => let val r = Char.ord c in r1 <= r andalso r <= r2 end in Be3 (s, inv, cs, cp::cps, ces, k) end | #"["::(#"."::s) => Ce (s, [], fn (s, ce) => case s of #"."::(#"]"::s) => Be3 (s, inv, cs, cps, ce::ces, k) | _ => raise (X "Be3")) | #"["::(#":"::s) => Cl (s, fn (s, cp) => case s of #":"::(#"]"::s) => Be3 (s, inv, cs, cp::cps, ces, k) | _ => raise (X "Be3")) | c::s => Be3 (s, inv, c::cs, cps, ces, k) | _ => raise (X "Be3") end and Ce (s: char list, ce: char list, k: char list * string -> res) = let fun finish s = k (s, implode (List.rev ce)) in case s of #"."::_ => finish s | c::s => Ce (s, c::ce, k) | _ => raise (X "Ce") end and Cl (s: char list, k: char list * (char -> bool) -> res) = let in case s of #"a"::(#"l"::(#"n"::(#"u"::(#"m"::s)))) => k (s, Char.isAlphaNum) | #"a"::(#"l"::(#"p"::(#"h"::(#"a"::s)))) => k (s, Char.isAlpha) | #"b"::(#"l"::(#"a"::(#"n"::(#"k"::_)))) => raise (X "Cl:blank") | #"c"::(#"n"::(#"t"::(#"r"::(#"l"::s)))) => k (s, Char.isCntrl) | #"d"::(#"i"::(#"g"::(#"i"::(#"t"::s)))) => k (s, Char.isDigit) | #"g"::(#"r"::(#"a"::(#"p"::(#"h"::s)))) => k (s, Char.isGraph) | #"l"::(#"o"::(#"w"::(#"e"::(#"r"::s)))) => k (s, Char.isLower) | #"p"::(#"r"::(#"i"::(#"n"::(#"t"::s)))) => k (s, Char.isPrint) | #"p"::(#"u"::(#"n"::(#"c"::(#"t"::_)))) => raise (X "Cl:punct") | #"s"::(#"p"::(#"a"::(#"c"::(#"e"::s)))) => k (s, Char.isSpace) | #"u"::(#"p"::(#"p"::(#"e"::(#"r"::s)))) => k (s, Char.isUpper) | #"x"::(#"d"::(#"i"::(#"g"::(#"i"::(#"t"::s))))) => k (s, Char.isHexDigit) | _ => raise (X "Cl") end in val fromString: string -> (t * Save.t vector) option = fn s => (SOME (S (explode s))) handle X _ => NONE val fromString = Trace.trace ("Regexp.fromString", String.layout, Option.layout (layout o #1)) fromString end end (* local * val _ = * let open Trace.Immediate * in * flagged() * ; debug := Out Out.error * ; on [] * end * open Regexp * val a = char #"a" * val b = char #"b" * val c = char #"c" * val d = char #"d" * val r = a * val r = star a * val r = or [] * val r = star any * val r = seq [] * val r = or [a, b] * val r = seq [a, b, c, d] * val r = or [seq [a, b, c], * seq [a, b, d]] * val r = * seq [star (or [a, b]), * a, b, b] * val d = digit * val eol = char #"#" * val space = oneOf " \t" * val r = * seq [or [anchorStart, notOneOf "0123456789("], * or [seq [char #"(", d, d, d, char #")"], * seq [d, d, d]], * char #" ", * d, d, d, * oneOf " -", * d, d, d, d, * or [eol, nonDigit]] * * fun doit (name, lay) = * let * val dot = concat ["/tmp/", name, ".dot"] * val ps = concat ["/tmp/", name, ".ps"] * val _ = File.withOut (dot, fn out => Layout.output (lay, out)) * val _ = OS.Process.system (concat ["dot ", dot, " >", ps]) * in () * end * val nfa = NFA.fromRegexp r * val _ = doit ("nfa", NFA.layoutDot (nfa, "nfa")) * val _ = Out.output (Out.error, * concat ["numCharClasses = ", * Int.toString (NFA.numCharClasses nfa), * "\n"]) * val dfa = DFA.fromNFA nfa * val _ = doit ("dfa", * DFA.layoutDot {dfa = dfa, title = "dfa", showDead = false}) * val min = DFA.minimize dfa * val _ = doit ("min", * DFA.layoutDot {dfa = min, title = "min", showDead = false}) * in * end *) end (* local * val _ = * let * open Trace.Immediate * in * debug := Out Out.error * ; flagged() * ; on ["Regexp.match"] * end * structure Z = TestRegexp (Regexp) * in * end *) mlton-20100608/lib/mlton/basic/relation.sig0000644000076600000240000000172711404435636017075 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RELATION = sig datatype t = datatype order (* from the pervasive environment *) val compare: ('a * 'a -> t) -> {equals: 'a * 'a -> bool, < : 'a * 'a -> bool, > : 'a * 'a -> bool, >= : 'a * 'a -> bool, <= : 'a * 'a -> bool, min: 'a * 'a -> 'a, max: 'a * 'a -> 'a} val equals: t * t -> bool val layout: t -> Layout.t val lexico: t * (unit -> t) -> t val lessEqual: {< : 'a * 'a -> bool, equals: 'a * 'a -> bool} -> {> : 'a * 'a -> bool, >= : 'a * 'a -> bool, <= : 'a * 'a -> bool, min: 'a * 'a -> 'a, max: 'a * 'a -> 'a, compare: 'a * 'a -> t} end mlton-20100608/lib/mlton/basic/relation.sml0000644000076600000240000000055211404435636017101 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Relation: RELATION = struct open Relation0 val layout = Layout.str o toString fun lexico (t, f) = case t of EQUAL => f () | r => r end mlton-20100608/lib/mlton/basic/relation0.sml0000644000076600000240000000355311404435636017165 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Relation0 = struct datatype t = datatype order val equals: t * t -> bool = op = val toString = fn EQUAL => "Equal" | GREATER => "Greater" | LESS => "Less" fun lessEqual {<, equals} = let fun a > b = b < a fun a <= b = a < b orelse equals (a, b) fun a >= b = b < a orelse equals (b, a) fun compare (a, b) = if a < b then LESS else if equals (a, b) then EQUAL else GREATER fun min (x, y) = if x < y then x else y fun max (x, y) = if x < y then y else x in {> = op >, <= = op <=, >= = op >=, compare = compare, min = min, max = max} end fun compare c = let fun equals (x, y) = (case c (x, y) of EQUAL => true | _ => false) fun x < y = (case c (x, y) of LESS => true | _ => false) fun x <= y = (case c (x, y) of LESS => true | EQUAL => true | _ => false) fun x > y = (case c (x, y) of GREATER => true | _ => false) fun x >= y = (case c (x, y) of GREATER => true | EQUAL => true | _ => false) fun max (x, y) = (case c (x, y) of GREATER => x | _ => y) fun min (x, y) = (case c (x, y) of GREATER => y | _ => x) in {equals = equals, < = op <, > = op >, <= = op <=, >= = op >=, min = min, max = max} end end mlton-20100608/lib/mlton/basic/resizable-array.fun0000644000076600000240000000655711404435636020370 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ResizableArray (): RESIZABLE_ARRAY = struct structure Array = Array structure A' = struct datatype 'a t = T of {array: 'a option Array.t ref, length: int ref} fun getArray (T {array, ...}) = !array fun lengthRef (T {length, ...}) = length fun length a = ! (lengthRef a) val shape = length fun maxLength a = Array.length (getArray a) fun minLength a = Int.quot (maxLength a, 4) fun invariant a = maxLength a >= 1 andalso minLength a <= length a andalso length a <= maxLength a fun incLength a = Int.inc (lengthRef a) fun decLength a = Int.dec (lengthRef a) fun maxIndex a = length a - 1 exception New = Array.New fun empty () = T {array = ref (Array.new (1, NONE)), length = ref 0} fun new (s, x) = if s = 0 then empty () else T {array = ref (Array.new (1, SOME x)), length = ref s} val array = new fun tabulate (s, f) = if s = 0 then empty () else T {array = ref (Array.tabulate (s, fn i => SOME (f i))), length = ref s} fun subSafe (a, i) = case Array.sub (getArray a, i) of SOME x => x | NONE => Error.bug "ResizableArray.subSafe" fun sub (a, i) = if i < length a then subSafe (a, i) else Error.bug "ResizableArray.sub" fun updateSafe (a, i, x) = Array.update (getArray a, i, SOME x) fun update (a, i, x) = if i < length a then updateSafe (a, i, x) else Error.bug "ResizableArray.update" fun fromList l = let val a = Array.fromList (List.map (l, SOME)) in T {array = ref a, length = ref (Array.length a)} end end structure A'' = Array (open A' val unsafeSub = sub val unsafeUpdate = update val unfoldi: int * 'a * (int * 'a -> 'b * 'a) -> 'b t * 'a = fn (n, ac, f) => let val (arr, z) = Array.unfoldi (n, ac, fn (i, a) => let val (b, a') = f (i, a) in (SOME b, a') end) in (T {array = ref arr, length = ref n}, z) end) open A' A'' fun subOption (a, i) = if i < length a then Array.sub (getArray a, i) else NONE fun grow (a as T {array, ...}) = array := Array.tabulate (maxLength a * 2, fn i => subOption (a, i)) fun shrink (a as T {array, ...}) = array := Array.tabulate (maxLength a div 2, fn i => subOption (a, i)) fun addToEnd (a, x) = (if length a = maxLength a then grow a else () ; updateSafe (a, length a, x) ; incLength a) fun deleteLast a = if length a = 0 then Error.bug "ResizableArray.deleteLast" else let val x = subSafe (a, maxIndex a) in (if length a = minLength a then shrink a else () ; decLength a ; x) end end structure ResizableArray = ResizableArray () mlton-20100608/lib/mlton/basic/resizable-array.sig0000644000076600000240000000067611404435636020356 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RESIZABLE_ARRAY = sig include ARRAY val addToEnd: 'a t * 'a -> unit val deleteLast: 'a t -> 'a val empty: unit -> 'a t val subOption: 'a t * int -> 'a option end mlton-20100608/lib/mlton/basic/result.sig0000644000076600000240000000071211404435636016567 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RESULT = sig datatype 'a t = No of string | Yes of 'a val isNo: 'a t -> bool val isYes: 'a t -> bool val layout: ('a -> Layout.t) -> 'a t -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t end mlton-20100608/lib/mlton/basic/result.sml0000644000076600000240000000112011404435636016572 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Result:> RESULT = struct datatype 'a t = No of string | Yes of 'a local open Layout in fun layout layoutA = fn No s => seq[str "No", paren(str s)] | Yes a => seq[str "Yes", paren(layoutA a)] end fun map(r, f) = case r of No s => No s | Yes x => Yes(f x) val isNo = fn No _ => true | _ => false val isYes = fn Yes _ => true | _ => false end mlton-20100608/lib/mlton/basic/ring-with-identity.fun0000644000076600000240000000433611404435636021024 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RingWithIdentity (S: RING_WITH_IDENTITY_STRUCTS) :> RING_WITH_IDENTITY where type t = S.t = struct open S structure IntInf = Pervasive.IntInf val base = {one = one, layout = layout, times = op *} val pow = Power.power base val powInf = Power.powerInf base val pows = Power.simultaneous base val powsInf = Power.simultaneousInf base local fun 'a make {zero: 'a, < : 'a * 'a -> bool, ~ : 'a -> 'a, power: {one: t, layout: t -> Layout.t, times: t * t -> t } -> (t * 'a) -> t} (i: 'a) : t = let val (i, fix) = if i < zero then (~ i, S.~) else (i, fn x => x) val i = power{one = S.zero, layout = layout, times = op +} (one, i) in fix i end in val fromInt = make{zero = 0, < = op <, ~ = Pervasive.Int.~, power = Power.power} val fromIntInf = make{zero = 0, < = IntInf.<, ~ = IntInf.~, power = Power.powerInf} end (* val fromIntInf = * Trace.trace("fromIntInf", Layout.str o IntInf.toString, layout) fromIntInf *) fun add1 i = i + one fun sub1 i = i - one fun inc r = r := add1(!r) fun dec r = r := sub1(!r) fun prod l = List.fold(l, one, op * ) val negOne = sub1 zero val two = add1 one val three = add1 two val pows = Trace.traceAssert ("RingWithIdentity.pows", List.layout (Layout.tuple2 (layout, Layout.str o Pervasive.Int.toString)), layout, fn l => (true, fn r => equals (r, List.fold (l, one, fn ((b, e), ac) => ac * pow (b, e))))) pows val powsInf = Trace.traceAssert ("RingWithIdentity.powsInf", List.layout (Layout.tuple2 (layout, Layout.str o Pervasive.IntInf.toString)), layout, fn l => (true, fn r => equals (r, List.fold (l, one, fn ((b, e), ac) => ac * powInf (b, e))))) powsInf end mlton-20100608/lib/mlton/basic/ring-with-identity.sig0000644000076600000240000000164711404435636021020 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RING_WITH_IDENTITY_STRUCTS = sig include RING val one: t end signature RING_WITH_IDENTITY = sig include RING_WITH_IDENTITY_STRUCTS val add1: t -> t val dec: t ref -> unit (* fromInt n = 1 + ... + 1, n times. *) val fromInt: Pervasive.Int.int -> t val fromIntInf: Pervasive.IntInf.int -> t val inc: t ref -> unit val negOne: t val pow: t * Pervasive.Int.int -> t val powInf : t * Pervasive.IntInf.int -> t val pows: (t * Pervasive.Int.int) list -> t (* simultaneous exponentiation *) val powsInf: (t * Pervasive.IntInf.int) list -> t val prod: t list -> t val sub1: t -> t val three: t val two: t end mlton-20100608/lib/mlton/basic/ring.fun0000644000076600000240000000064011404435636016216 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Ring(S: RING_STRUCTS):> RING where type t = S.t = struct open S fun a - b = a + (~ b) fun isZero a = equals(a, zero) fun double n = n + n fun square n = n * n fun sum l = List.fold(l, zero, op +) end mlton-20100608/lib/mlton/basic/ring.sig0000644000076600000240000000112411404435636016206 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RING_STRUCTS = sig type t val + : t * t -> t val ~ : t -> t val * : t * t -> t val equals: t * t -> bool val layout: t -> Layout.t val zero: t end signature RING = sig include RING_STRUCTS val - : t * t -> t val double: t -> t val isZero: t -> bool val square: t -> t val sum: t list -> t end mlton-20100608/lib/mlton/basic/sexp.sig0000644000076600000240000000116311404435636016231 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SEXP_STRUCTS = sig end signature SEXP = sig include SEXP_STRUCTS datatype t = Atom of string | List of t list | String of string datatype parseResult = Eof | Error of string | Sexp of t val fromString: string -> parseResult val input: In.t -> parseResult val layout: t -> Layout.t val toString: t -> string end mlton-20100608/lib/mlton/basic/sexp.sml0000644000076600000240000001000311404435636016233 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Sexp: SEXP = struct datatype t = Atom of string | List of t list | String of string fun layout sexp = let open Layout in case sexp of Atom s => str s | List sexps => paren (align (List.map (sexps, layout))) | String s => str (concat ["\"", String.translate (s, fn c => case c of #"\"" => "\"\"" | #"\\" => "\\\\" | _ => String.fromChar c), "\""]) end val toString = Layout.toString o layout datatype parseResult = Eof | Error of string | Sexp of t fun parse (peekChar: unit -> char option, getChar: unit -> char option): parseResult = let exception Err of string fun error s = raise (Err s) fun atom (cs: char list): t = let fun done () = Atom (String.fromListRev cs) in case peekChar () of NONE => done () | SOME c => if Char.isSpace c orelse c = #"(" orelse c = #")" orelse c = #"\"" orelse c = #";" then done () else case getChar () of NONE => done () | SOME c => atom (c :: cs) end fun string (cs: char list): t = case getChar () of NONE => error "eof in middle of string" | SOME c => (case c of #"\"" => String (String.fromListRev cs) | #"\\" => (case getChar () of NONE => error "eof in middle of string" | SOME c => string (c :: cs)) | _ => string (c :: cs)) fun ignoreLine (): bool = case getChar () of NONE => false | SOME c => c = #"\n" orelse ignoreLine () fun sexp (): t option = case getChar () of NONE => NONE | SOME c => sexpChar c and sexpChar (c: char): t option = case c of #"(" => SOME (List (finishList [])) | #")" => error "unmatched )" | #"\"" => SOME (string []) | #";" => if ignoreLine () then sexp () else NONE | _ => if Char.isSpace c then sexp () else SOME (atom [c]) and finishList (elts: t list): t list = case getChar () of NONE => error "unmatched (" | SOME c => (case c of #")" => rev elts | #";" => if ignoreLine () then finishList elts else error "unmatched (" | _ => if Char.isSpace c then finishList elts else case sexpChar c of NONE => error "unmatched (" | SOME s => finishList (s :: elts)) in (case sexp () of NONE => Eof | SOME s => Sexp s) handle Err s => Error s end fun input ins = parse (fn () => In.peekChar ins, fn () => In.inputChar ins) fun fromString s = let val n = String.size s val r = ref 0 fun peekChar () = let val i = !r in if i = n then NONE else SOME (String.sub (s, i)) end fun getChar () = let val res = peekChar () val _ = if isSome res then r := 1 + !r else () in res end in parse (peekChar, getChar) end end mlton-20100608/lib/mlton/basic/signal.sig0000644000076600000240000000040411404435636016524 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SIGNAL = sig include MLTON_SIGNAL end mlton-20100608/lib/mlton/basic/signal.sml0000644000076600000240000000041211404435636016534 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Signal = struct open MLton.Signal type t = signal end mlton-20100608/lib/mlton/basic/socket.sml0000644000076600000240000000004411404435636016550 0ustar mtfstaffstructure Socket = Pervasive.Socket mlton-20100608/lib/mlton/basic/sources.cm0000644000076600000240000001414111404435636016552 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library signature ARRAY signature BOUNDED_ORDER signature ENV signature ERROR signature EUCLIDEAN_RING signature INTEGER signature INT_INF signature LIST signature OPTION signature ORDER signature ORDERED_RING signature PROMISE signature REAL signature RING signature RING_WITH_IDENTITY signature STRING signature SUM signature T signature UNIQUE_ID signature VECTOR structure AppendList structure Array structure Array2 structure Assert structure Base64 structure BinarySearch structure Bool structure Buffer structure Byte structure Char (* structure CharArray *) (* structure CharBuffer *) structure CharVector structure ChoicePattern structure ClearablePromise structure CommandLine structure Computation structure Console structure Counter structure Date structure Dir structure DirectedGraph structure DirectedSubGraph structure Dot structure DotColor structure Engine structure Error structure Escape structure Exn structure Export structure File structure FileDesc structure FixedPoint structure Function structure HashSet structure Html structure Http structure In structure InitScript structure Int (* structure Int32 *) structure IntInf structure InsertionSort structure INetSock structure Iterate structure Itimer structure Justify structure LargeInt structure LargeWord structure Layout structure Lines structure List structure List structure MLton (* structure MergeSortList *) (* structure MergeSortVector *) structure Net structure OS structure Option structure Out structure Parse structure Pervasive structure Pid structure Pointer structure Popt structure Port structure Position structure Posix structure Postscript structure Power structure Process structure Promise structure Property structure PropertyList structure Queue structure QuickSort structure RDB structure Random structure Reader structure Real (* structure RealVector *) structure Real32 structure Real64 structure Ref structure Regexp structure Relation structure ResizableArray structure Result structure SMLofNJ structure Sexp structure Signal structure Socket structure Stream structure String structure StringCvt structure Substring structure SysWord structure Thread structure Time structure Timer structure Trace structure Tree structure TwoListQueue structure Unimplemented structure Unit structure Unsafe structure Url structure Vector structure Word structure Word8 (* structure Word8Array *) (* structure Word8ArraySlice *) (* structure Word8Vector *) (* structure Word16 *) (* structure Word32 *) functor AlphaBeta functor Control functor Env functor EuclideanRing functor IntUniqueId functor MonoArray functor MonoList functor MonoList functor MonoOption functor MonoVector functor OrderedField functor Pair functor PolyEnv functor Ring functor RingWithIdentity functor Sum functor Tree functor UniqueId functor UniqueSet is #if (defined (SMLNJ_VERSION)) ../../stubs/basis-stubs-for-smlnj/sources.cm ../../stubs/mlton-stubs/sources.cm #endif ../pervasive/sources.cm error.sig error.sml exn0.sml outstream0.sml layout.sig relation0.sml char0.sig char0.sml string0.sml layout.sml substring.sig assert.sig assert.sml list.sig fold.sig fold.fun list.sml word.sig word8.sml max-pow-2-that-divides.fun word.sml string1.sml substring.sml outstream.sig outstream.sml relation.sig relation.sml order0.sig order.sig time.sig time.sml instream.sig char.sig computation.sig trace.sig exn.sig exn.sml date.sig date.sml pid.sig option.sig option.sml pid.sml intermediate-computation.sig instream0.sml intermediate-computation.sml string-map.sig string-map.sml t.sig unit.sig unit.sml trace.sml bool.sig bool.sml char.sml string.sig stream.sig promise.sig promise.sml stream.sml ring.sig ring-with-identity.sig euclidean-ring.sig integer.sig euclidean-ring.fun ring.fun ordered-ring.sig ordered-ring.fun power.sml ring-with-identity.fun integer.fun int.sml real.sig field.sig field.fun ordered-field.sig ordered-field.fun real.sml random.sig random.sml vector.sig vector.fun vector.sml array.sig array.fun array.sml binary-search.sig binary-search.sml hash-set.sig hash-set.sml string.sml instream.sml file.sig file.sml signal.sml process.sig dir.sig dir.sml function.sig function.sml file-desc.sig file-desc.sml process.sml append-list.sig append-list.sml property-list.sig ref.sig ref.sml het-container.sig property-list.fun het-container.fun property.sig property.fun dot-color.sml dot.sig dot.sml tree.sig counter.sig counter.sml tree.sml int-inf.sig int-inf.sml control.sig control.fun queue.sig two-list-queue.sml array2.sig array2.sml env.sig env.fun unique-id.sig unique-id.fun clearable-promise.sig clearable-promise.sml justify.sig justify.sml directed-graph.sig directed-graph.sml large-word.sml quick-sort.sig insertion-sort.sig insertion-sort.sml quick-sort.sml unique-set.sig unique-set.fun fixed-point.sig fixed-point.sml mono-vector.fun result.sig result.sml regexp.sig regexp.sml popt.sig popt.sml sexp.sig sexp.sml choice-pattern.sig choice-pattern.sml escape.sig escape.sml buffer.sig buffer.sml base64.sig base64.sml # if ( defined(SMLNJ_VERSION) ) alpha-beta.fun alpha-beta.sig bounded-order.fun bounded-order.sig char-buffer.sig char-buffer.sml circular-list.fun circular-list.sig console.sig console.sml directed-sub-graph.sig directed-sub-graph.sml doubly-linked.fun doubly-linked.sig engine.sig engine.sml export.sig export.sml format.sig format.sml html.sig html.sml http.sig http.sml inet-sock.sml init-script.sig init-script.sml iterate.sig iterate.sml itimer.sml lines.sig lines.sml linked-list.sig linked-list.sml mark.sig mark.sml mono-list.fun mono-option.fun net.sig net.sml pair.fun pair.sig parse.fun parse.sig pointer.sig pointer.sml port.sig port.sml postscript.sig postscript.sml rdb.sig rdb.sml reader.sig reader.sml resizable-array.fun resizable-array.sig socket.sml sum.fun sum.sig tab.sig tab.sml test.sml thread.sig thread.sml two-list-queue-mutable.sml unimplemented.sml url.sig url.sml word8-array-slice.sml # endif mlton-20100608/lib/mlton/basic/sources.mlb0000644000076600000240000001444111404435636016730 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused false" "forceUsed" in local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/mlton.mlb $(SML_LIB)/basis/sml-nj.mlb $(SML_LIB)/basis/unsafe.mlb ../pervasive/sources.mlb error.sig error.sml exn0.sml outstream0.sml layout.sig relation0.sml char0.sig char0.sml string0.sml layout.sml substring.sig assert.sig assert.sml list.sig fold.sig fold.fun list.sml word.sig word8.sml max-pow-2-that-divides.fun word.sml string1.sml substring.sml outstream.sig outstream.sml relation.sig relation.sml order0.sig order.sig time.sig time.sml instream.sig char.sig computation.sig trace.sig exn.sig exn.sml date.sig date.sml pid.sig option.sig option.sml pid.sml intermediate-computation.sig instream0.sml intermediate-computation.sml string-map.sig string-map.sml t.sig unit.sig unit.sml trace.sml bool.sig bool.sml char.sml string.sig stream.sig promise.sig promise.sml stream.sml ring.sig ring-with-identity.sig euclidean-ring.sig integer.sig euclidean-ring.fun ring.fun ordered-ring.sig ordered-ring.fun power.sml ring-with-identity.fun integer.fun int.sml real.sig field.sig field.fun ordered-field.sig ordered-field.fun real.sml random.sig random.sml vector.sig vector.fun vector.sml array.sig array.fun array.sml binary-search.sig binary-search.sml hash-set.sig hash-set.sml string.sml instream.sml file.sig file.sml signal.sml process.sig dir.sig dir.sml function.sig function.sml file-desc.sig file-desc.sml process.sml append-list.sig append-list.sml property-list.sig ref.sig ref.sml het-container.sig property-list.fun het-container.fun property.sig property.fun dot-color.sml dot.sig dot.sml tree.sig counter.sig counter.sml tree.sml int-inf.sig int-inf.sml control.sig control.fun queue.sig two-list-queue.sml array2.sig array2.sml env.sig env.fun unique-id.sig unique-id.fun clearable-promise.sig clearable-promise.sml justify.sig justify.sml directed-graph.sig directed-graph.sml large-word.sml quick-sort.sig insertion-sort.sig insertion-sort.sml quick-sort.sml unique-set.sig unique-set.fun fixed-point.sig fixed-point.sml mono-vector.fun result.sig result.sml regexp.sig regexp.sml popt.sig popt.sml sexp.sig sexp.sml choice-pattern.sig choice-pattern.sml escape.sig escape.sml buffer.sig buffer.sml base64.sig base64.sml in signature ARRAY signature ENV signature ERROR signature EUCLIDEAN_RING signature INTEGER signature INT_INF signature LIST signature OPTION signature ORDER signature ORDERED_RING signature PROMISE signature REAL signature RING signature RING_WITH_IDENTITY signature STRING signature T signature UNIQUE_ID signature VECTOR structure AppendList structure Array structure Array2 structure Assert structure Base64 structure BinarySearch structure Bool structure Buffer structure Char (* structure CharArray *) structure CharVector structure ChoicePattern structure ClearablePromise structure CommandLine structure Computation structure Counter structure Date structure Dir structure DirectedGraph structure Dot structure DotColor structure Error structure Escape structure Exn structure File structure FileDesc structure FixedPoint structure Function structure HashSet (* structure Http *) structure In structure Int (* structure Int32 *) structure IntInf structure InsertionSort structure Justify structure LargeInt structure LargeWord structure Layout structure List structure List structure MLton (* structure MergeSortList *) (* structure MergeSortVector *) structure OS structure Option structure Out structure Pervasive structure Pid structure Popt structure Position structure Power structure Process structure Promise structure Property structure PropertyList structure Queue structure QuickSort structure Random structure Real (* structure RealVector *) structure Real32 structure Real64 structure Ref structure Regexp structure Relation structure Result structure SMLofNJ structure Sexp structure Signal structure Stream structure String structure StringCvt structure Substring structure SysWord structure Time structure Trace structure Tree structure TwoListQueue structure Unit structure Vector structure Word structure Word8 (* structure Word8Array *) (* structure Word8Vector *) (* structure Word32 *) functor Control functor Env functor EuclideanRing functor IntUniqueId functor MonoArray functor MonoVector functor OrderedField functor PolyEnv functor Ring functor RingWithIdentity functor Tree functor UniqueId functor UniqueSet end end mlton-20100608/lib/mlton/basic/stream.sig0000644000076600000240000000172511404435636016551 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature STREAM_STRUCTS = sig end signature STREAM = sig include STREAM_STRUCTS type 'a t val append: 'a t * 'a t -> 'a t val appendMap: 'a t * ('a -> 'b t) -> 'b t val cons: 'a * 'a t -> 'a t val delay: (unit -> 'a t) -> 'a t val empty: unit -> 'a t val firstN: 'a t * int -> 'a list val force: 'a t -> ('a * 'a t) option val infinite: 'a * ('a -> 'a) -> 'a t val isEmpty: 'a t -> bool val keep: 'a t * ('a -> bool) -> 'a t val last: 'a t -> 'a option val layout: ('a -> Layout.t) -> 'a t -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val nth: 'a t * int -> 'a val single: 'a -> 'a t val toList: 'a t -> 'a list end mlton-20100608/lib/mlton/basic/stream.sml0000644000076600000240000000456411404435636016566 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Stream: STREAM = struct datatype 'a t = T of ('a * 'a t) option Promise.t fun delayTh th = T (Promise.delay th) fun force (T p) = Promise.force p fun 'a delay (th: unit -> 'a t): 'a t = delayTh (force o th) fun empty () = delayTh (fn () => NONE) fun cons (x, s) = delayTh (fn () => SOME (x, s)) fun single x = cons (x, empty ()) fun 'a append (s: 'a t, s': 'a t): 'a t = let fun loop (s) = delay (fn () => case force s of NONE => s' | SOME (x, s') => cons (x, loop s')) in loop s end fun map (s, f) = let fun loop s = delay (fn () => case force s of NONE => empty () | SOME (x, s) => cons (f x, loop s)) in loop s end fun appendMap (s, f) = let fun loop (s) = delay (fn () => case force s of NONE => empty () | SOME (x, s) => append (f x, loop s)) in loop s end fun toList (s) = case force s of NONE => [] | SOME (x, s) => x :: toList s fun last (s) = let fun loop (z, s) = case force s of NONE => z | SOME (x, s) => loop (SOME x, s) in loop (NONE, s) end fun isEmpty (s) = case force (s) of NONE => true | SOME _ => false fun layout f s = List.layout f (toList s) fun keep (s, p) = let fun loop s = delay (fn () => case force s of NONE => empty () | SOME (x, s) => if p x then cons (x, loop s) else loop s) in loop s end fun firstN (s, n: int) = let fun loop (n, s, ac) = if n <= 0 then rev ac else (case force s of NONE => Error.bug "Stream.firstN" | SOME (x, s) => loop (n - 1, s, x :: ac)) in loop (n, s, []) end fun nth (s, n: int) = case force s of NONE => Error.bug "nth" | SOME (x, s) => if n <= 0 then x else nth (s, n - 1) fun 'a infinite (start: 'a, next: 'a -> 'a): 'a t = let fun loop (a: 'a) = delay (fn () => cons (a, loop (next a))) in loop start end end mlton-20100608/lib/mlton/basic/string-map.sig0000644000076600000240000000076211404435636017337 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature STRING_MAP = sig type 'a t val clear: 'a t -> unit val domain: 'a t -> string list val foreach: 'a t * ('a -> unit) -> unit val keepAll: 'a t * ('a -> bool) -> string list val lookup: 'a t * string -> 'a val new: (unit -> 'a) -> 'a t end mlton-20100608/lib/mlton/basic/string-map.sml0000644000076600000240000000206311404435636017344 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure StringMap: STRING_MAP = struct datatype 'a t = T of {map: {name: string, value: 'a} list ref, default: unit -> 'a} fun new default = T{map = ref [], default = default} fun clear (T {map, ...}) = map := [] fun lookup (T {map, default}, name) = case List.peek (!map, fn {name = name', ...} => name = name') of NONE => let val value = default () in List.push (map, {name = name, value = value}) ; value end | SOME {value, ...} => value fun domain (T {map, ...}) = List.revMap (!map, fn {name, ...} => name) fun keepAll (T{map, ...}, pred) = List.keepAllMap (!map, fn {name, value} => if pred value then SOME name else NONE) fun foreach (T{map, ...}, f) = List.foreach (!map, fn {value, ...} => f value) end mlton-20100608/lib/mlton/basic/string.sig0000644000076600000240000001025711404435636016564 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature STRING = sig type t = string (* a / b = a ^ "/" ^ b * This abbreviation is useful for building pathnames, e.g. * val user = "you" * val bin = "/home"/user/"bin" *) val / : string * string -> string val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val ^ : t * t -> t val alphabetize: t -> t val baseName: t * t -> t val compare: t * t -> Relation.t val concat: t list -> t val concatV: t vector -> t val concatWith: t list * t -> t val contains: t * char -> bool val deleteSurroundingWhitespace: t -> t val dquote: t (* " *) val dropl: t * (char -> bool) -> t val dropFirst: t -> t val dropLast: t -> t val dropPrefix: t * int -> t val dropSuffix: t * int -> t val dropTrailing: t * char -> t val empty: t val equals: t * t -> bool val escapeC: t -> t val escapeSML: t -> t val existsi: t * (int * char -> bool) -> bool val exists: t * (char -> bool) -> bool val explode: t -> char list (* extract (s, i, SOME j) * returns the substring of s of length j starting at i. *) val extract: t * int * int option -> t val fields: t * (char -> bool) -> t list val findSubstring: t * {substring: t} -> int option val fold: t * 'a * (char * 'a -> 'a) -> 'a val foldi: t * 'a * (int * char * 'a -> 'a) -> 'a val foreach: t * (char -> unit) -> unit val forall: t * (char -> bool) -> bool val fromCString: t -> t option val fromChar: char -> t val fromCharArray: CharArray.array -> t val fromListRev: char list -> t val fromString: t -> t option val hash: t -> Word.t val implode: char list -> t val isEmpty: t -> bool val hasPrefix: t * {prefix: t} -> bool val hasSubstring: t * {substring: t} -> bool val hasSuffix: t * {suffix: t} -> bool val keepAll: t * (char -> bool) -> t val last: t -> char val layout: t -> Layout.t val length: t -> int val lparen: t (* ( *) val make: int * char -> t val max: t * t -> t val memoize: (t -> 'a) -> t -> 'a val memoizeList: (t -> 'a) * (t * 'a) list -> t -> 'a val min: t * t -> t val newline: t val output: t * TextIO.outstream -> unit val peek: t * (char -> bool) -> char option val peeki: t * (int * char -> bool) -> (int * char) option val posToLineCol: t -> int -> {line: int, col: int} val prefix: t * int -> t val removeTrailing: t * (char -> bool) -> t val rev: t -> t val rparen: t (* ) *) val size: t -> int (* splits the string into substrings broken at char, * e.g. split("foo$bar$baz", #"$") = ["foo", "bar", "baz"] *) val split: t * char -> t list val sub: t * int -> char val substituteAll: t * {substring: t, replacement: t} -> t val substituteFirst: t * {substring: t, replacement: t} -> t (* beginning at start, with length chars *) val substring1: t * {start: int, length: int} -> t (* inclusive of start, exclusive of finish *) val substring2: t * {start: int, finish: int} -> t val substring: t * int * int -> t val suffix: t * int -> t val tabulate: int * (int -> char) -> t val toChar: t -> char val toLower: t -> t val toString: t -> t val toUpper: t -> t val tokens: t * (char -> bool) -> t list val translate: t * (char -> t) -> t val unfold: int * 'a * ('a -> char * 'a) -> t end functor TestString (S: STRING): sig end = struct val _ = print "TestString\n" open S val _ = Assert.assert ("TestString", fn () => dropl("abc", fn c => c = #"a") = "bc" andalso "\\000" = escapeC "\000" andalso "abc" = removeTrailing ("abc ", Char.isSpace) andalso "" = removeTrailing (" ", Char.isSpace) ) end mlton-20100608/lib/mlton/basic/string.sml0000644000076600000240000001007311404435636016571 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure String: STRING = struct open String1 fun unfold (n, a, f) = let val r = ref a in tabulate (n, fn _ => let val (b, a) = f (!r) val () = r := a in b end) end fun concatV ss = case Vector.length ss of 0 => "" | 1 => Vector.sub (ss, 0) | _ => let val n = Vector.fold (ss, 0, fn (s, n) => n + size s) val a = Array.new (n, #"a") val _ = Vector.fold (ss, 0, fn (s, i) => fold (s, i, fn (c, i) => (Array.update (a, i, c); i + 1))) in tabulate (n, fn i => Array.sub (a, i)) end fun existsi (s, f) = Int.exists (0, size s, fn i => f (i, sub (s, i))) fun exists (s, f) = existsi (s, f o #2) fun keepAll (s: t, f: char -> bool): t = implode (List.rev (fold (s, [], fn (c, ac) => if f c then c :: ac else ac))) fun memoizeList (init: string -> 'a, l: (t * 'a) list): t -> 'a = let val set: (word * t * 'a) HashSet.t = HashSet.new {hash = #1} fun lookupOrInsert (s, f) = let val hash = hash s in HashSet.lookupOrInsert (set, hash, fn (hash', s', _) => hash = hash' andalso s = s', fn () => (hash, s, f ())) end val _ = List.foreach (l, fn (s, a) => ignore (lookupOrInsert (s, fn () => a))) in fn s => #3 (lookupOrInsert (s, fn () => init s)) end fun memoize init = memoizeList (init, []) fun posToLineCol (s: string): int -> {line: int, col: int} = let open Int val lineStarts = Array.fromList (List.rev (foldi (s, [0], fn (i, c, is) => if c = #"\n" then (i + 1) :: is else is))) fun find (pos: int) = let val line = valOf (BinarySearch.largest (lineStarts, fn x => x <= pos)) (* The 1+'s are to make stuff one based *) in {line = 1 + line, col = 1 + pos - Array.sub (lineStarts, line)} end in find end fun substituteFirst (s, {substring, replacement}) = case findSubstring (s, {substring = substring}) of NONE => s | SOME i => let val n = length substring val prefix = Substring.substring (s, {start = 0, length = i}) val suffix = Substring.extract (s, i + n, NONE) in Substring.concat [prefix, Substring.full replacement, suffix] end fun substituteAll (s, {substring, replacement}) = case findSubstring (s, {substring = substring}) of NONE => s | SOME i => let val ls = length s val lss = length substring val prefix = dropSuffix (s, ls - i) val suffix = substituteAll (dropPrefix (s, i + lss), {substring = substring, replacement = replacement}) in concat [prefix, replacement, suffix] end end structure ZString = String (* CM bug ?? -- see instream.sml *) mlton-20100608/lib/mlton/basic/string0.sml0000644000076600000240000001201111404435636016643 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure String0 = struct structure PInt = Pervasive.Int type int = PInt.int structure PS = Pervasive.String local open PS in val op ^ = op ^ val concat = concat val concatWith = fn (ss,s) => concatWith s ss val escapeC = toCString val escapeSML = toString val explode = explode val extract = extract val fromCString = fromCString val fromString = fromString val implode = implode val maxLength = maxSize val size = size val sub = sub val substring = substring end structure Char = Char0 type t = string val empty = "" val dquote = "\"" val newline = "\n" val lparen = "(" val rparen = ")" val isEmpty = fn "" => true | _ => false val length = size fun last s = sub (s, length s - 1) fun append (x, y) = x ^ y fun toChar s = if length s = 1 then sub (s, 0) else Error.bug "String0.toChar" val fromChar = str fun contains (s, c) = Pervasive.Char.contains s c val equals: t * t -> bool = op = val {compare, min, max, ...} = Relation0.lessEqual {< = PS.<, equals = equals} fun output (s, out) = Pervasive.TextIO.output (out, s) val tabulate = CharVector.tabulate fun make (n, c) = tabulate (n, fn _ => c) fun substring1 (s, {start, length}) = substring (s, start, length) fun substring2 (s, {start, finish}) = substring (s, start, finish-start) fun prefix (s, len) = substring1 (s, {start = 0, length = len}) fun suffix (s, len) = substring1 (s, {start = length s - len, length = len}) fun dropPrefix (s,n) = substring1 (s, {start=n, length = length s - n}) fun dropSuffix (s,n) = substring1 (s, {start=0, length = length s - n}) fun dropFirst s = dropPrefix (s, 1) fun dropLast s = dropSuffix (s, 1) fun dropPrefix (s, n) = substring2 (s, {start = n, finish = length s}) fun hasPrefix (string, {prefix}) = PS.isPrefix prefix string fun removeTrailing (s: t, p: char -> bool): t = let fun loop (i: int) = if i < 0 then i else if p (sub (s, i)) then loop (i - 1) else i in substring (s, 0, 1 + (loop (size s - 1))) end fun hasSuffix (string, {suffix}) = let val n = length string val n' = length suffix fun loop (i: int, j: int): bool = i >= n orelse (Char.equals (sub (string, i), sub (suffix, j)) andalso loop (i + 1, j + 1)) in n' <= n andalso loop (n - n', 0) end fun findSubstring (string: t, {substring: t}) = let val n = length substring val maxIndex = length string - n fun loopString i = if i > maxIndex then NONE else let val start = i fun loopSubstring (i, j) = if j >= n then SOME start else if Char.equals (sub (string, i), sub (substring, j)) then loopSubstring (i + 1, j + 1) else loopString (i + 1) in loopSubstring (i, 0) end in loopString 0 end val hasSubstring = isSome o findSubstring fun baseName (x, y) = if hasSuffix (x, {suffix = y}) then dropSuffix (x, size y) else Error.bug "String0.baseName" fun fold (s, b, f) = let val n = size s fun loop (i, b) = if i >= n then b else loop (i + 1, f (sub (s, i), b)) in loop (0, b) end fun translate (s, f) = PS.translate f s fun tokens (s, f) = PS.tokens f s fun fields (s, f) = PS.fields f s fun split (s, c) = fields (s, fn c' => c = c') fun dropTrailing (s, c) = let val n = size s fun loop i = if PInt.< (i, 0) orelse c <> sub (s, i) then i else loop (i - 1) in dropSuffix (s, n - 1 - loop (n - 1)) end fun translateChar (s, f) = translate (s, fromChar o f) fun toUpper s = translateChar (s, Char.toUpper) fun toLower s = translateChar (s, Char.toLower) fun sort (l, f) = let fun loop l = case l of [] => [] | x :: l => let fun loop' l = case l of [] => [x] | x' :: l => if f (x, x') then x :: x' :: l else x' :: loop' l in loop' (loop l) end in loop l end fun alphabetize s = implode (sort (explode s, Char.<)) fun fromCharArray (a: CharArray.array): t = CharVector.tabulate (CharArray.length a, fn i => CharArray.sub (a, i)) fun toString s = s fun a / b = concat [a, "/", b] local open PS in val op <= = op <= val op < = op < val op >= = op >= val op > = op > end fun rev (s: t): t = let val n = size s val n1 = n - 1 in CharVector.tabulate (n, fn i => sub (s, n1 - i)) end val fromListRev = rev o implode end mlton-20100608/lib/mlton/basic/string1.sml0000644000076600000240000000445611404435636016662 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure String1 = struct open String0 structure F = Fold (type 'a t = string type 'a elt = char val fold = fold) open F type t = string val last = String0.last val layout = Layout.str fun forall (s, f) = let val n = length s fun loop i = i = n orelse (f (sub (s, i)) andalso loop (i + 1)) in loop 0 end (* This hash function is taken from pages 56-57 of * The Practice of Programming by Kernighan and Pike. *) fun hash (s: t): Word.t = fold (s, 0w0, fn (c, h) => Word.fromChar c + Word.* (h, 0w31)) fun peek (v, f) = let val n = length v fun loop i = if i = n then NONE else let val x = sub (v, i) in if f x then SOME x else loop (i + 1) end in loop 0 end fun peeki (v, f) = let val n = length v fun loop i = if i = n then NONE else let val x = sub (v, i) in if f (i, x) then SOME (i, x) else loop (i + 1) end in loop 0 end fun dropl (s, p) = case peeki (s, fn (_, c) => not (p c)) of NONE => "" | SOME (i, _) => extract (s, i, NONE) fun deleteSurroundingWhitespace (s: t): t = let val n = size s fun loop (i: int) = if PInt.>= (i, n) then s else if Char.isSpace (sub (s, i)) then loop (i + 1) else let fun loop (j: int) = let val c = sub (s, j) in if PInt.<= (j, i) then fromChar c else if Char.isSpace c then loop (j - 1) else extract (s, i, SOME (j - i + 1)) end in loop (n - 1) end in loop 0 end end mlton-20100608/lib/mlton/basic/substring.sig0000644000076600000240000000170311404435636017272 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SUBSTRING = sig type t val base: t -> string * {start: int, length: int} val compare: t * t -> order val concat: t list -> string val endOf: t -> int (* start + length *) val explode: t -> char list val extract: string * int * int option -> t val first: t -> char option val full: string -> t val getc: t -> (char * t) option val isEmpty: t -> bool val layout: t -> Layout.t val length: t -> int val slice: t * int * int option -> t val span: t * t -> t val string: t -> string val sub: t * int -> char val substring: string * {start: int, length: int} -> t val toString: t -> string end mlton-20100608/lib/mlton/basic/substring.sml0000644000076600000240000000141711404435636017305 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Substring: SUBSTRING = struct open Pervasive.Substring type t = substring val length = size val substring = fn (s, {start, length}) => substring (s, start, length) val base = fn ss => let val (s, start, length) = base ss in (s, {start = start, length = length}) end val toString = string val layout = String1.layout o toString fun endOf ss = let val (_, {start, length}) = base ss in start + length end end mlton-20100608/lib/mlton/basic/sum.fun0000644000076600000240000000115411404435636016064 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Sum(S: SUM_STRUCTS): SUM = struct open S datatype t = X of X.t | Y of Y.t val outX = fn X x => x | _ => Error.bug "Sum.outX" val outY = fn Y y => y | _ => Error.bug "Sum.outY" val map = fn (X x, f, _) => f x | (Y y, _, f) => f y val equals = fn (X l, X l') => X.equals(l, l') | (Y l, Y l') => Y.equals(l, l') | _ => false fun layout s = map(s, X.layout, Y.layout) end mlton-20100608/lib/mlton/basic/sum.sig0000644000076600000240000000105711404435636016060 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SUM_STRUCTS = sig structure X: T structure Y: T end signature SUM = sig include SUM_STRUCTS datatype t = X of X.t | Y of Y.t val equals: t * t -> bool val layout: t -> Layout.t val map: t * (X.t -> 'a) * (Y.t -> 'a) -> 'a val outX: t -> X.t val outY: t -> Y.t end mlton-20100608/lib/mlton/basic/t.sig0000644000076600000240000000047011404435636015515 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature T = sig type t val equals: t * t -> bool val layout: t -> Layout.t end mlton-20100608/lib/mlton/basic/tab.sig0000644000076600000240000000075611404435636016027 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TAB = sig val make: Out.t * string -> {reset: unit -> unit, right: unit -> unit, left: unit -> unit, indent: unit -> unit} end mlton-20100608/lib/mlton/basic/tab.sml0000644000076600000240000000247511404435636016040 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Tab: TAB = struct val initialSize: int = 40 val growFactor: int = 2 fun make(out, tab) = let fun makeTabs size = Array.tabulate(size, let val prev = ref "" in fn _ => (let val cur = !prev in (prev := tab ^ cur ; cur) end) end) val tabs = ref(makeTabs initialSize) fun size() = Array.length(!tabs) fun resize() = tabs := makeTabs(growFactor * size()) val index = ref 0 fun maybeResize() = if !index = size() then resize() else () fun reset() = index := 0 fun indent() = Out.output(out, Array.sub(!tabs, !index)) fun right() = (index := !index + 1 ; maybeResize()) fun left() = if !index = 0 then Error.bug "Tab.left" else index := !index - 1 fun output x = (indent() ; Out.output(out, x) ; Out.output(out, "\n")) in {reset = reset, indent = indent, left = left, right = right} end end mlton-20100608/lib/mlton/basic/test.sml0000644000076600000240000000231211404435636016237 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Z = struct val _ = let open Trace.Immediate in debug := Out Out.error ; flagged() ; ["concat"] ; ["Uri.fromString", "Uri.resolve", "Uri.relativize", "Authority.equals"] ; ["Uri.fromString", "Uri.resolve", "Uri.toString", "Uri.relativize", "Uri.checkResolve"] ; ["Regexp.match"] end end structure Z = TestBase64 (Base64) structure Z = TestBinarySearch (BinarySearch) structure Z = TestChar (Char) structure Z = TestDirectedGraph (DirectedGraph) structure Z = TestFormat (Format) structure Z = TestHashSet (HashSet) structure Z = TestHttp (Http) structure Z = TestLinkedList (LinkedList) structure Z = TestList (List) structure Z = TestProcess (Process) structure Z = TestQuickSort (QuickSort) structure Z = TestRegexp (Regexp) structure Z = TestString (String) structure Z = TestUri (Uri) structure Z = TestVector (Vector) structure Z = struct end mlton-20100608/lib/mlton/basic/thread.sig0000644000076600000240000000106111404435636016516 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature THREAD = sig include MLTON_THREAD (* generate f returns a function g, that when called runs f until f * either completes, in which case g returns NONE, or f calls its argument, * in which case g returns what f passes it, and then pauses f. *) val generate: (('a -> unit) -> unit) -> unit -> 'a option end mlton-20100608/lib/mlton/basic/thread.sml0000644000076600000240000000167611404435636016543 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Thread: THREAD = struct open MLton.Thread fun generate (f: ('a -> unit) -> unit): unit -> 'a option = let val paused: 'a option t option ref = ref NONE val gen: unit t option ref = ref NONE fun return (a: 'a option): unit = switch (fn t' => let val _ = gen := SOME t' val t = valOf (!paused) val _ = paused := NONE in prepare (t, a) end) val _ = gen := SOME (new (fn () => (f (return o SOME) ; return NONE))) in fn () => switch (fn t => (paused := SOME t ; prepare (valOf (!gen), ()))) end end mlton-20100608/lib/mlton/basic/time.sig0000644000076600000240000000273011404435636016211 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TIME = sig exception Time type int = Pervasive.LargeInt.int include ORDER type times = { self: {utime: t, (* user time of process *) stime: t (* system time of process *) }, children: {utime: t, (* user time of terminated child processes *) stime: t (* system time of terminated child processes *) }, gc: {utime: t, (* user time of gc *) stime: t (* system time of gc *) } } val + : t * t -> t val - : t * t -> t val days: int -> t val fromString: string -> t option val fromMicroseconds: int -> t val fromMilliseconds: int -> t val fromReal: real -> t val hours: int -> t val minutes: int -> t val now: unit -> t val output: t * Out.t -> unit val seconds: int -> t val times: unit -> times val timeThunk: (unit -> unit) -> t val toMicroseconds: t -> int val toMilliseconds: t -> int val toReal: t -> real val toSeconds: t -> int val toString: t -> string val weeks:int -> t val years: int -> t val zero: t end mlton-20100608/lib/mlton/basic/time.sml0000644000076600000240000000263311404435636016224 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Time: TIME = struct open Pervasive.LargeInt open Pervasive.Time structure LargeInt = Pervasive.LargeInt type t = time type times = { self: {utime: t, stime: t}, children: {utime: t, stime: t}, gc: {utime: t, stime: t} } fun times (): times = let val {self, children, gc} = MLton.Rusage.rusage () fun doit ({utime, stime, ...} : MLton.Rusage.t) = {utime = utime, stime = stime} in {self = doit self, children = doit children, gc = doit gc} end val zero = fromReal 0.0 val equals = op = val seconds = fromSeconds fun minutes m = seconds (m * fromInt 60) fun hours h = minutes (h * fromInt 60) fun days d = hours (d * LargeInt.fromInt 24) fun weeks w = days (w * LargeInt.fromInt 7) fun years y = days (y * LargeInt.fromInt 365) val {min, max, ...} = Relation.compare compare val layout = Layout.str o toString fun output (t, out) = Out.output (out, toString t) fun timeThunk (th: unit -> unit): t = let val {self = {utime, stime}, ...} = times () val t = utime + stime val _ = th () val {self = {utime, stime}, ...} = times () val t' = utime + stime in t' - t end end mlton-20100608/lib/mlton/basic/trace.sig0000644000076600000240000001200711404435636016347 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TRACE_CONTROL = sig (* controls what tracing info is gathered *) val always: unit -> unit (* always gather info *) val flagged: unit -> unit (* only on flagged functions *) val never: unit -> unit (* never gather info *) (* value of newly created flag *) val default: bool ref (* turn on/off tracing for given functions *) val on: string list -> unit val off: string list -> unit (* turn on/off tracing for all functions *) val all: unit -> unit val none: unit -> unit (* returns functions that are on/off *) val whatsOn: unit -> string list val whatsOff: unit -> string list end signature TRACE = sig structure Immediate: sig include TRACE_CONTROL datatype debug = None | Terminal | Out of Out.t (* * If !debug = Terminal, debugging messages are printed to /dev/tty. * If !debug = Out os, then messages will be sent to os. * If !debug = None, then messages will be ignored. *) val debug: debug ref val message: Layout.t -> unit val messageStr: string -> unit (* inChildProcess is called by Process so that trace will know if it * is in a child, and therefore it will prefix all messages with the * pid of the current process. *) val inChildProcess: unit -> unit (* !showTime = true iff messages are preceded by the current time *) val showTime: bool ref end structure Delayed: sig include TRACE_CONTROL val keepAll: bool ref end structure Time: TRACE_CONTROL val never: unit -> unit val always: unit -> unit val flagged: unit -> unit val traceable: unit -> string list val outputTraceable: unit -> unit val reset: unit -> unit (*---------- Delayed Feedback ----------*) structure Computation: COMPUTATION (* clear computation history *) val clear: unit -> unit (* get computation history *) val computation: unit -> Computation.t (* show computation history *) val history: unit -> unit (* show computation history, without arguments or results *) val calls: unit -> unit val times: unit -> unit (* enter the inspector *) val inspect: unit -> unit (*---------- Instrumentation ----------*) val traceCall: string -> ('a -> 'b) -> 'a -> 'b type info val info: string -> info val traceInfo: info * ('a -> Layout.t) * ('b -> Layout.t) * ('a -> bool * ('b -> bool)) -> ('a -> 'b) -> ('a -> 'b) val traceInfo': info * ('a -> Layout.t) * ('b -> Layout.t) -> ('a -> 'b) -> ('a -> 'b) (* type ('a, 'b) check = ('a -> Layout.t) * ('a -> bool * 'b) * * type ('a, 'b) z = * 'a -> ((unit -> Layout.t) * * (unit -> bool) * * 'a * * 'b) * * val traceInfo: * info * * ('a, ('b, unit) check) check * -> ('a -> 'b) * -> 'a * -> 'b *) val assertTrue: 'a -> (bool * ('b -> bool)) val traceAssert: string * ('a -> Layout.t) * ('b -> Layout.t) * ('a -> bool * ('b -> bool)) -> ('a -> 'b) -> ('a -> 'b) val trace: string * ('a -> Layout.t) * ('b -> Layout.t) -> ('a -> 'b) -> ('a -> 'b) val trace0: string * ('a -> Layout.t) -> (unit -> 'a) -> (unit -> 'a) val trace2: string * ('a -> Layout.t) * ('b -> Layout.t) * ('c -> Layout.t) -> ('a * 'b -> 'c) -> ('a * 'b -> 'c) val trace3: string * ('a -> Layout.t) * ('b -> Layout.t) * ('c -> Layout.t) * ('d -> Layout.t) -> ('a * 'b * 'c -> 'd) -> ('a * 'b * 'c -> 'd) val trace4: string * ('a -> Layout.t) * ('b -> Layout.t) * ('c -> Layout.t) * ('d -> Layout.t) * ('e -> Layout.t) -> ('a * 'b * 'c * 'd -> 'e) -> ('a * 'b * 'c * 'd -> 'e) val trace5: string * ('a -> Layout.t) * ('b -> Layout.t) * ('c -> Layout.t) * ('d -> Layout.t) * ('e -> Layout.t) * ('f -> Layout.t) -> ('a * 'b * 'c * 'd * 'e -> 'f) -> ('a * 'b * 'c * 'd * 'e -> 'f) val traceRec: string * ('a -> Layout.t) * ('b -> Layout.t) -> (('a -> 'b) -> ('a -> 'b)) -> 'a -> 'b end mlton-20100608/lib/mlton/basic/trace.sml0000644000076600000240000003100711404435636016361 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TraceControl (structure StringMap: STRING_MAP datatype status = Always | Flagged | Never type flags val map: flags StringMap.t val getFlag: flags -> bool ref val default: bool ref val status: status) = struct val status = ref status fun always () = status := Always fun flagged () = status := Flagged fun never () = status := Never fun isOn b = case !status of Always => true | Flagged => !b | Never => false val default = default fun flag name = getFlag (StringMap.lookup (map, name)) fun whats b () = StringMap.keepAll (map, fn flags => b = !(getFlag flags)) val whatsOn = whats true val whatsOff = whats false fun sets b () = StringMap.foreach (map, fn flags => getFlag flags := b) val all = sets true val none = sets false fun some b ss = List.foreach (ss, fn s => flag s := b) val on = some true val off = some false end (*-------------------------------------------------------------------*) (* Trace *) (*-------------------------------------------------------------------*) structure Trace: TRACE = struct structure IC = IntermediateComputation structure Timer = Time val immediateDefault = ref false val delayedDefault = ref false val timeDefault = ref false type flags = {immediate: bool ref, delayed: bool ref, time: bool ref} val map = StringMap.new (fn () => {immediate = ref (!immediateDefault), delayed = ref (!delayedDefault), time = ref (!timeDefault)}) fun traceable () = StringMap.domain map fun outputTraceable () = Layout.output (List.layout Layout.str (traceable ()), Out.standard) datatype status = Always | Flagged | Never structure Immediate = TraceControl (type flags = flags val map = map structure StringMap = StringMap datatype status = datatype status fun getFlag ({immediate, ...}: flags) = immediate val default = immediateDefault val status = Never) structure Delayed = struct structure C = TraceControl (type flags = flags val map = map structure StringMap = StringMap datatype status = datatype status fun getFlag ({delayed, ...}: flags) = delayed val default = delayedDefault val status = Never) open C val keepAll = ref true end structure Time = TraceControl (type flags = flags val map = map structure StringMap = StringMap datatype status = datatype status fun getFlag ({time, ...}: flags) = time val default = timeDefault val status = Never) fun never () = (Immediate.never () ; Delayed.never () ; Time.never ()) fun always () = (Immediate.always () ; Delayed.always () ; Time.always ()) fun flagged () = (Immediate.flagged () ; Delayed.flagged () ; Time.flagged ()) fun reset () = StringMap.foreach (map, fn {immediate, delayed, time} => (immediate := false ; delayed := false ; time := false)) (*---------------------------------------------------*) (* Delayed Feedback *) (*---------------------------------------------------*) structure Computation = IC.Computation datatype comp = Working of IC.t | Finished of Computation.t val emptyIc = IC.empty fun empty () = Working (emptyIc ()) val currentComputation = ref (empty ()) fun clear () = currentComputation := empty () fun finishedComputation () = case !currentComputation of Working ic => let val c = IC.finish ic in currentComputation := Finished c ; c end | Finished c => c val computation = finishedComputation fun history () = Computation.output (finishedComputation (), Out.error) fun calls () = Computation.outputCalls (finishedComputation (), Out.error) fun times () = Computation.outputTimes (finishedComputation (), Out.error) fun inspect () = Computation.inspect (finishedComputation ()) fun ic () = case !currentComputation of Finished _ => let val ic = emptyIc () in currentComputation := Working ic ; ic end | Working ic => ic fun delayedCall (name, layoutArg, layoutAns) = {call = fn () => let val comp = ic () val comp = if !Delayed.keepAll orelse not (IC.atTopLevel comp) then comp else (clear (); ic ()) in IC.call (comp, name, layoutArg) end, raisee = fn (t, _) => IC.raisee (ic (), t), return = fn (ans, t) => IC.return (ic (), fn () => layoutAns ans, t)} (*---------------------------------------------------*) (* Immediate Feedback *) (*---------------------------------------------------*) structure Immediate = struct open Immediate datatype debug = None | Terminal | Out of Out.t val debug = ref None val showTime = ref false val indentation: int ref = ref 0 val space: int = 3 fun left () = indentation := !indentation - space fun right () = indentation := !indentation + space val inChild = ref false fun inChildProcess () = (inChild := true; indentation := 0) fun message (l: Layout.t): unit = case !debug of None => () | _ => let val (out, done) = case !debug of Terminal => (Out.openOut "/dev/tty", Out.close) | Out out => (out, Out.flush) | _ => Error.bug "Trace.message" open Layout in output (seq [if !inChild then seq [Pid.layout (Pid.current ()), str ": "] else empty, if !showTime then str (Date.fmt (Date.now (), "%b %d %H:%M:%S ")) else empty, indent (l, !indentation)], out) ; Out.newline out ; done out end fun finish (t, res) = (left () ; message (let open Layout in case t of NONE => seq [str "==> ", res] | SOME t => align [seq [str "==> time = ", Timer.layout t], res] end)) fun call (name, outArg, layoutAns) = let open Layout fun call () = (message (seq [str name, str " ==> ", outArg () handle e => seq [str "layout argument error: ", Exn.layout e]]) ; right ()) fun raisee (t, e) = finish (t, seq [str "raise: ", Exn.layout e]) fun return (ans, t) = finish (t, layoutAns ans handle e => seq [str "layout answer error: ", Exn.layout e]) in {call = call, raisee = raisee, return = return} end val message = fn l => (left () ; indentation := 1 + !indentation ; message l ; indentation := !indentation - 1 ; right ()) val messageStr = message o Layout.str end (*---------------------------------------------------*) (* Instrumentation *) (*---------------------------------------------------*) type info = {name: string, flags: flags} val bogusInfo = {name = "bogus", flags = {delayed = ref false, immediate = ref false, time = ref false}} val shouldTrace = Assert.debug fun info name = if shouldTrace then {name = name, flags = StringMap.lookup (map, name)} else bogusInfo fun traceInfo ({name, flags = {immediate, delayed, time}}, layoutArg, layoutAns, check) f a = if not shouldTrace then f a else let val immediate = Immediate.isOn immediate val delayed = Delayed.isOn delayed val time = Time.isOn time in if not (immediate orelse delayed orelse time orelse Assert.debug) then f a else let val outArg = fn () => layoutArg a val noCall = {call = fn _ => (), raisee = fn _ => (), return = fn _ => ()} val immed = if immediate then Immediate.call (name, outArg, layoutAns) else noCall val delay = if delayed then delayedCall (name, outArg, layoutAns) else noCall val _ = (#call delay () ; #call immed ()) val check = if Assert.debug then let val (b, check) = check a val _ = Assert.assert (concat [name, " argument"], fn () => b) in check end else fn _ => true val startTime = if time then SOME (Timer.times ()) else NONE fun getTime () = case startTime of NONE => NONE | SOME {self = {utime = u, stime = s}, ...} => SOME (let val {self = {utime = u', stime = s'}, ...} = Timer.times () in Timer.+ (Timer.- (u', u), Timer.- (s', s)) end) val ans = f a handle exn => let val t = getTime () in #raisee delay (t, exn) ; #raisee immed (t, exn) ; raise exn end val t = getTime () in #return delay (ans, t) ; #return immed (ans, t) ; Assert.assert (concat [name, " result"], fn () => check ans) ; ans end end fun assertTrue _ = (true, fn _ => true) fun traceInfo' (info, layoutArg, layoutAns) = traceInfo (info, layoutArg, layoutAns, assertTrue) fun traceAssert (name, layoutArg, layoutAns, check) = traceInfo (info name, layoutArg, layoutAns, check) fun trace (name, layoutArg, layoutAns) = traceAssert (name, layoutArg, layoutAns, assertTrue) fun ignore _ = Layout.empty fun traceCall s = trace (s, ignore, ignore) fun traceRec info = let val trace = trace info in fn f => let fun fix f a = trace (f (fix f)) a in fix f end end fun trace0 (name, layoutAns) = trace (name, Unit.layout, layoutAns) fun trace2 (name, layout1, layout2, layoutAns) = trace (name, Layout.tuple2 (layout1, layout2), layoutAns) fun trace3 (name, out1, out2, out3, outAns) = trace (name, Layout.tuple3 (out1, out2, out3), outAns) fun trace4 (name, out1, out2, out3, out4, outAns) = trace (name, Layout.tuple4 (out1, out2, out3, out4), outAns) fun trace5 (name, out1, out2, out3, out4, out5, outAns) = trace (name, Layout.tuple5 (out1, out2, out3, out4, out5), outAns) end structure Computation = Trace.Computation mlton-20100608/lib/mlton/basic/tree.sig0000644000076600000240000000235511404435636016215 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TREE_STRUCTS = sig structure Seq: sig type 'a t val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foreach: 'a t * ('a -> unit) -> unit val layout: 'a t * ('a -> Layout.t) -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t end end signature TREE = sig include TREE_STRUCTS datatype 'a t = T of 'a * 'a t Seq.t val children: 'a t -> 'a t Seq.t val foldPre: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foldPost: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foreachPre: 'a t * ('a -> unit) -> unit (* preorder traversal *) val foreachPost: 'a t * ('a -> unit) -> unit (* postorder traversal *) val layout: 'a t * ('a -> Layout.t) -> Layout.t val layoutDot: 'a t * {nodeOptions: 'a -> Dot.NodeOption.t list, options: Dot.GraphOption.t list, title: string} -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val traverse: 'a t * ('a -> unit -> unit) -> unit end mlton-20100608/lib/mlton/basic/tree.sml0000644000076600000240000000422211404435636016221 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Tree (S: TREE_STRUCTS): TREE = struct open S datatype 'a t = T of 'a * 'a t Seq.t fun children (T (_, v)) = v fun foldPre (T (a, v), b, f) = Seq.fold (v, f (a, b), fn (t, b) => foldPre (t, b, f)) fun foldPost (T (a, v), b, f) = f (a, Seq.fold (v, b, fn (t, b) => foldPost (t, b, f))) fun traverse (t, f) = let fun loop (T (a, v)) = let val g = f a val _ = Seq.foreach (v, loop) val _ = g () in () end in loop t end fun foreachPre (t, f: 'a -> unit) = traverse (t, fn a => (f a; fn () => ())) fun foreachPost (t, f) = traverse (t, fn a => fn () => f a) fun 'a layoutDot (t: 'a t, {nodeOptions: 'a -> Dot.NodeOption.t list, options, title}) = let val c = Counter.new 0 fun next () = concat ["n", Int.toString (Counter.next c)] val nodes = ref [] fun loop (T (v, cs)) = let val name = next () val () = List.push (nodes, {name = name, options = nodeOptions v, successors = rev (Seq.fold (cs, [], fn (t, ac) => {name = loop t, options = []} :: ac))}) in name end val _ = loop t in Dot.layout {nodes = !nodes, options = options, title = title} end fun layout (t, lay) = let open Layout fun loop (T (x, ts)) = paren (seq [lay x, str ", ", Seq.layout (ts, loop)]) in loop t end fun map (T (a, ts), f) = T (f a, Seq.map (ts, fn t => map (t, f))) end structure Tree = Tree (structure Seq = struct open Vector fun layout (v, l) = Vector.layout l v end) mlton-20100608/lib/mlton/basic/two-list-queue-mutable.sml0000644000076600000240000000210011404435636021606 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MutableQueue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val _ = back := [] val l = rev l in case l of [] => raise Fail "MutableQueue.deque" | x :: l => (front := l; SOME x) end) | x :: l => (front := l; SOME x) end mlton-20100608/lib/mlton/basic/two-list-queue.sml0000644000076600000240000000153311404435636020170 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure TwoListQueue:> QUEUE = struct datatype 'a t = T of 'a list * 'a list fun foldAnyOrder (T (l, r), ac, f) = List.fold (r, List.fold (l, ac, f), f) fun foldr (T (l, r), ac, f) = List.foldr (l, List.fold (r, ac, f), f) fun toList q = foldr (q, [], op ::) fun deque (T (l, r)) = let val (l, r) = (case l of [] => (rev r, []) | _ => (l, r)) in case l of [] => NONE | x :: l => SOME (T (l, r), x) end fun empty () = T ([], []) val isEmpty = fn T ([], []) => true | _ => false fun enque (T (l, r), x) = T (l, x :: r) end structure Queue = TwoListQueue mlton-20100608/lib/mlton/basic/unicode.sml0000644000076600000240000000103411404435636016706 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Unicode = struct datatype kind = Normal | NormalPrivate | HighSurrogate | HighSurrogatePrivate | LowSurrogate | Special val _ = [(0xFFFE, Special) (0xF900, Normal), (0xE000, NormalPrivate), (0xDC00, LowSurrogate), (0xDB80, HighSurrogatePrivate), (0xD800, HighSurrogate) (0x0000, Normal)] end mlton-20100608/lib/mlton/basic/unimplemented.sml0000644000076600000240000000062211404435636020130 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Unimplemented = struct val op equals = fn _ => Error.unimplemented "equals" fun layout _ = Error.unimplemented "layout" fun output _ = Error.unimplemented "output" end mlton-20100608/lib/mlton/basic/unique-id.fun0000644000076600000240000000122011404435636017152 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor UniqueId():> UNIQUE_ID = struct type t = unit ref fun new(): t = ref() val equals = Ref.equals fun layout _ = Layout.empty fun toString _ = "" end functor UnitUniqueId():> UNIQUE_ID = struct open Unit fun new() = () fun toString _ = "" end functor IntUniqueId():> UNIQUE_ID = struct open Int val cur: t ref = ref 0 fun new(): t = (Int.inc cur; !cur) end mlton-20100608/lib/mlton/basic/unique-id.sig0000644000076600000240000000056311404435636017155 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNIQUE_ID = sig type t val equals: t * t -> bool val layout: t -> Layout.t val new: unit -> t val toString: t -> string end mlton-20100608/lib/mlton/basic/unique-set.fun0000644000076600000240000001637011404435636017365 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure UniqueSetRep = struct datatype 'a t = T of {elements: 'a list, plist: PropertyList.t} end functor UniqueSet (S: UNIQUE_SET_STRUCTS): UNIQUE_SET = struct open S val _ = Assert.assert ("UniqueSet: cacheSize, bits", fn () => cacheSize >= 1 andalso bits >= 1) type elements = Element.t list structure Tree: sig structure Set: sig type t val equals: t * t -> bool val toList: t -> elements val plist: t -> PropertyList.t end type t val new: unit -> t val insert: t * elements -> Set.t val size: t -> int end = struct structure Set = struct open UniqueSetRep type t = Element.t t fun new elements = T {elements = elements, plist = PropertyList.new()} fun elements (T {elements, ...}) = elements fun plist (T {plist, ...}) = plist val toList = elements fun equals (s, s') = PropertyList.equals (plist s, plist s') end datatype node = Node of {element: Element.t, isIn: t, isNotIn: t} | Leaf of Set.t withtype t = node option ref fun new(): t = ref NONE fun size(t: t): int = case !t of NONE => 0 | SOME(Leaf _) => 1 | SOME(Node{isIn, isNotIn, ...}) => size isIn + size isNotIn fun contains(es, e) = List.exists(es, fn e' => Element.equals(e, e')) fun insert(tree, elements) = let fun loop tree = case !tree of NONE => let val s = Set.new elements in tree := SOME(Leaf s); s end | SOME(Node{element, isIn, isNotIn}) => if contains(elements, element) then loop isIn else loop isNotIn | SOME(Leaf s') => let fun loop arg = case arg of ([], []) => s' (* same set *) | ([], x' :: _) => let val s = Set.new elements in tree := SOME(Node{element = x', isIn = ref(SOME(Leaf s')), isNotIn = ref(SOME(Leaf s))}) ; s end | (x :: xs, xs') => let fun loop2(xs', accum) = case xs' of [] => let val s = Set.new elements in tree := SOME(Node{element = x, isIn = ref(SOME(Leaf s)), isNotIn = ref(SOME(Leaf s'))}) ; s end | x' :: xs' => if Element.equals(x, x') then loop(xs, accum @ xs') else loop2(xs', x' :: accum) in loop2(xs', []) end in loop(elements, Set.elements s') end in loop tree end end open Tree.Set val tableSize = Int.pow (2, bits) val maxIndex = tableSize - 1 val mask = Word.fromInt maxIndex val table = Array.tabulate(tableSize, fn _ => Tree.new()) fun hashToIndex(w: Word.t): int = Word.toInt(Word.andb(w, mask)) fun intern(l: Element.t list, h: Word.t) = Tree.insert(Array.sub(table, hashToIndex h), l) (* the hash of a set is the xorb of the hash of its members *) fun hash(l: Element.t list) = List.fold(l, 0w0, fn (e, w) => Word.xorb(w, Element.hash e)) fun fromList l = let val l = List.fold(l, [], fn (x, l) => if List.exists(l, fn x' => Element.equals(x, x')) then l else x :: l) in intern(l, hash l) end val empty = fromList [] fun isEmpty s = equals(s, empty) fun foreach(s, f) = List.foreach(toList s, f) fun singleton x = fromList [x] val cacheHits: int ref = ref 0 val cacheMisses: int ref = ref 0 fun stats() = {hits = !cacheHits, misses = !cacheMisses} fun reset() = (* need to clear out and reset the tables *) (cacheHits := 0 ; cacheMisses := 0 ; Int.for(0, tableSize, fn i => Array.update(table, i, Tree.new()))) (* Int.foreach(0, maxIndex, fn i => let val n = Tree.size(Vector.sub(table, i)) in if n > 0 then Control.message(seq[Int.layout i, str " -> ", Int.layout n]) else () end)*) local fun binary (oper: elements * elements -> elements) = let val cache = Array.new(cacheSize, NONE) in fn (s: t, s': t) => let fun loop i = if i >= cacheSize then let val s'' = fromList(oper(toList s, toList s')) val () = Int.inc cacheMisses val () = Array.update (cache, Random.natLessThan cacheSize, SOME (s, s', s'')) in s'' end else case Array.sub(cache, i) of NONE => loop(i + 1) | SOME(s1, s1', s'') => if equals(s, s1) andalso equals(s', s1') then (Int.inc cacheHits; s'') else loop(i + 1) in loop 0 end end val {+, -, intersect, layout, ...} = List.set{equals = Element.equals, layout = Element.layout} in val op + = binary op + val op - = binary op - val op intersect = binary intersect val layout = layout o toList end (* val fromList = Trace.trace("fromList", List.layout Element.layout, layout) fromList *) fun traceBinary (name, f) = Trace.trace2 (name, layout, layout, layout) f val op + = traceBinary ("UniqueSet.+", op +) val op - = traceBinary ("UniqueSet.-", op -) val op intersect = traceBinary ("UniqueSet.intersect", intersect) end mlton-20100608/lib/mlton/basic/unique-set.sig0000644000076600000240000000210511404435636017346 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNIQUE_SET_STRUCTS = sig structure Element: sig include T val hash: t -> Word.t end (* How many binary operations to cache. *) val cacheSize: int (* 2^bits buckets in the hash table *) val bits: int end signature UNIQUE_SET = sig include UNIQUE_SET_STRUCTS type t val + : t * t -> t val - : t * t -> t val empty: t val equals: t * t -> bool val foreach: t * (Element.t -> unit) -> unit val fromList: Element.t list -> t val intersect: t * t -> t val isEmpty: t -> bool val layout: t -> Layout.t val plist: t -> PropertyList.t val reset: unit -> unit val singleton: Element.t -> t val stats: unit -> {hits: int, misses: int} val toList: t -> Element.t list end mlton-20100608/lib/mlton/basic/unit.sig0000644000076600000240000000035711404435636016235 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNIT = T where type t = unit mlton-20100608/lib/mlton/basic/unit.sml0000644000076600000240000000047311404435636016245 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Unit: UNIT = struct type t = unit val equals = fn ((), ()) => true fun layout() = Layout.str"()" end mlton-20100608/lib/mlton/basic/url.sig0000644000076600000240000002224211404435636016055 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * URLs, as described in RFC 2396. * * For ease of programming, I merged all of the nested components into one type * with lots of option components. *) signature URL = sig structure Char: sig type t = Char.t val escapeHex: t -> string end structure Scheme: sig datatype t = File | Ftp | Gopher | Http | Https | Telnet end structure Authority: sig type t = {host: string, port: int option, user: string option} val equals: t * t -> bool end structure Path: sig type t = {isAbsolute: bool, path: string list, file: string} val file: t -> string val layout: t -> Layout.t val root: t val toString: t -> string end datatype t = T of {authority: Authority.t option, fragment: string option, path: Path.t option, query: string option, scheme: Scheme.t option} (* NONE in relative urls *) | JavaScript of string | MailTo of string | News of string | Opaque of {scheme: string, rest: string} val addQuery: t * string -> t val canonicalize: t -> t val equals: t * t -> bool val escape: string -> string (* Insert %XX escapes into string. *) val escapeQuery: bool ref val fromString: string -> t option val getMatch: Regexp.Match.t -> t val host: t -> string val layout: t -> Layout.t val mailto: string -> t val path: t -> Path.t (* relativize {base = b, relative = r} * trys turn r into a url relative to b *) val relativize: {base: t, relative: t} -> t option (* resolve {base = b, relative = r} * interprets r relative to b, returning an absolute URL. *) val resolve: {base: t, relative: t} -> t val toString: t -> string val unescape: string -> string (* Remove %XX escapes from string. *) structure Regexp: sig type t = Regexp.t val absoluteUrl: t val absPath: t val authority: t val query: t val getAbsPath: Regexp.Match.t -> Path.t val peekQuery: Regexp.Match.t -> string option end end functor TestUrl (S: URL): sig end = struct open S val _ = Assert.assert ("TestUrl.resolve", fn () => (* Examples from RFC 2396, Appendix C. *) let val base = valOf (fromString "http://a/b/c/d;p?q") val examples = [("g", "http://a/b/c/g"), ("./g", "http://a/b/c/g"), ("g/", "http://a/b/c/g/"), ("/g", "http://a/g"), ("?y", "http://a/b/c/?y"), ("g?y", "http://a/b/c/g?y"), ("#s", "http://a/b/c/d;p?q#s"), ("g#s", "http://a/b/c/g#s"), ("g?y#s", "http://a/b/c/g?y#s"), (";x", "http://a/b/c/;x"), ("g;x", "http://a/b/c/g;x"), ("g;x?y#s", "http://a/b/c/g;x?y#s"), (".", "http://a/b/c/"), ("./", "http://a/b/c/"), ("..", "http://a/b/"), ("../", "http://a/b/"), ("../g", "http://a/b/g"), ("../..", "http://a/"), ("../../", "http://a/"), ("../../g", "http://a/g")] fun checkResolve (rel, abs) = abs = toString (resolve {base = base, relative = valOf (fromString rel)}) val checkResolve = Trace.trace2 ("TestUrl.checkResolve", String.layout, String.layout, Bool.layout) checkResolve in List.forall ([("g:h", "g:h"), ("//g", "http://g")], checkResolve) andalso List.forall (examples, fn (rel, abs) => checkResolve (rel, abs) andalso checkResolve (toString (valOf (relativize {base = base, relative = valOf (fromString abs)})), abs)) end) val _ = Assert.assert ("TestUrl", fn () => fromString "mailto:sweeks@sweeks.com" = SOME (MailTo "sweeks@sweeks.com") andalso isSome (fromString "http://sports.latimes.com/RealMedia/ads/adstream_lx.ads/sports.latimes.com/stats/oth/oth/oth/columnists.html/21801/Top/NextCardGW002/u40_card_dreamer_V3.gif/63306138643531333339663061393230") andalso isSome (fromString "http://dps1.travelocity.com:80/airpprice.ctl?previous_page=airpdisp&mixed_gt=N&tkt_status=N&option_num=1&seg_for_sell=1%26SJC%26San%20Jose,%20CA%2620001123%260750%26AA%26American%20Airlines%262456%26L%260%26McDonnell%20Douglas%20SP80%20Jet%26DFW%26Dallas%2fFt%20Worth,%20TX%261313%2620001123%26Thursday%26%26%26S80%26Y|1%26DFW%26Dallas%2fFt%20Worth,%20TX%2620001123%261433%26AA%26American%20Airlines%263741%26L%260%26Embraer%20ERJ-145%20Jet%26OKC%26Oklahoma%20City,%20OK%261529%2620001123%26Thursday%26%26%26ER4%26Y%3a1%26DFW%26Dallas%2fFt%20Worth,%20TX%2620001126%260918%26AA%26American%20Airlines%262451%26V%260%26McDonnell%20Douglas%20SP80%20Jet%26SJC%26San%20Jose,%20CA%261057%2620001126%26Sunday%26%26%26S80%26Y&hold_flag=N&SEQ=97122479938121310102000&LANG=EN&last_pgd_page=airpdisp.pgd") andalso isSome (fromString "large-int.html#SIG:INT_INF.\\|@LT\\|\\|@LT\\|:VAL:SPEC") andalso List.forall ([("http://Norma140.emp3.com/cgibin/optin/remove.pl", SOME Scheme.Http, NONE, "Norma140.emp3.com", NONE, SOME (true, ["cgibin", "optin"], "remove.pl"), NONE, NONE), ("http://s7.sprintpcs.com/store/..\\store\\cc_Popup_aa.asp", SOME Scheme.Http, NONE, "s7.sprintpcs.com", NONE, SOME (true, ["store"], "..\\store\\cc_Popup_aa.asp"), NONE, NONE), ("http://www.sds.lcs.mit.edu/spd/larch/", SOME Scheme.Http, NONE, "www.sds.lcs.mit.edu", NONE, SOME (true, ["spd", "larch"], ""), NONE, NONE), ("http://foo.com/hello", SOME Scheme.Http, NONE, "foo.com", NONE, SOME (true, [], "hello"), NONE, NONE), ("http://foo.com/hello/", SOME Scheme.Http, NONE, "foo.com", NONE, SOME (true, ["hello"], ""), NONE, NONE), ("http://foo.com", SOME Scheme.Http, NONE, "foo.com", NONE, NONE, NONE, NONE), ("http://foo.com/", SOME Scheme.Http, NONE, "foo.com", NONE, SOME (true, [], ""), NONE, NONE), ("ftp://bar.com:80/yes/now", SOME Scheme.Ftp, NONE, "bar.com", SOME 80, SOME (true, ["yes"], "now"), NONE, NONE), ("http://z.com/foo?site=http://w.com/~zzz", SOME Scheme.Http, NONE, "z.com", NONE, SOME (true, [], "foo"), SOME "site=http://w.com/~zzz", NONE), ("http://sweeks@foo.com/yes?really#here", SOME Scheme.Http, SOME "sweeks", "foo.com", NONE, SOME (true, [], "yes"), SOME "really", SOME "here"), ("http://a.com/foo?%79%65%73%2e", SOME Scheme.Http, NONE, "a.com", NONE, SOME (true, [], "foo"), SOME "yes.", NONE), ("http://foo.com/a?b%20c", SOME Scheme.Http, NONE, "foo.com", NONE, SOME (true, [], "a"), SOME "b c", NONE), ("http://community.cnn.com/cgi-bin/WebX?13@236.FzKWcVUHjLB^0@.ee7bada", SOME Scheme.Http, NONE, "community.cnn.com", NONE, SOME (true, ["cgi-bin"], "WebX"), SOME "13@236.FzKWcVUHjLB^0@.ee7bada", NONE), ("//foo.com/z", NONE, NONE, "foo.com", NONE, SOME (true, [], "z"), NONE, NONE), ("http://ad.doubleclick.net/adj/N674.briefing.com/B22024;abr=!ie;sz=125x125;ord= [timestamp]?", SOME Scheme.Http, NONE, "ad.doubleclick.net", NONE, SOME (true, ["adj", "N674.briefing.com"], "B22024;abr=!ie;sz=125x125;ord= [timestamp]"), SOME "", NONE), ("http://tac.eecs.umich.edu/cgi-bin/botuser/ViewAccount?VIEW=INFO&VIEWALL= [bad label VIEWALL]", SOME Scheme.Http, NONE, "tac.eecs.umich.edu", NONE, SOME (true, ["cgi-bin", "botuser"], "ViewAccount"), SOME "VIEW=INFO&VIEWALL= [bad label VIEWALL]", NONE), ("http://phase2media.doubleclick.net/adj/ag.aol.p2m.com/asconfirmcollections;kw=shortandpunchy;kw1=;kw2=;abr=!ie;pos=1;sz=125x125;tile=10;ord=964739477869?\"", SOME Scheme.Http, NONE, "phase2media.doubleclick.net", NONE, SOME (true, ["adj", "ag.aol.p2m.com"], "asconfirmcollections;kw=shortandpunchy;kw1=;kw2=;abr=!ie;pos=1;sz=125x125;tile=10;ord=964739477869"), SOME "\"", NONE) ], fn (s, scheme, user, host, port, path, query, fragment) => valOf (fromString s) = T {scheme = scheme, authority = SOME {user = user, host = host, port = port}, path = Option.map (path, fn (i, p, f) => {isAbsolute = i, path = p, file = f}), query = query, fragment = fragment})) end mlton-20100608/lib/mlton/basic/url.sml0000644000076600000240000004611011404435636016066 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Url: URL = struct val escapeQuery = ref true structure Char = struct open Char val radix: int = 16 fun fromHexChars (hi: t, lo: t) = chr (toHexDigit hi * radix + toHexDigit lo) fun toHexChars (c: t): t * t = let val (hi, lo) = Int.divMod (ord c, radix) in (fromHexDigit hi, fromHexDigit lo) end fun escapeHex (c: t): string = let val (hi, lo) = toHexChars c in implode [#"%", hi, lo] end end fun unescape (s: string): string = let fun sub i = String.sub (s, i) val n = String.size s fun loop (i, cs) = if i >= n then implode (rev cs) else let val c = sub i in if c = #"%" then loop (i + 3, Char.fromHexChars (sub (i + 1), sub (i + 2)) :: cs) else loop (i + 1, c :: cs) end in loop (0, []) end val shouldEscape: char -> bool = Char.memoize (fn c => not (Char.isGraph c) orelse c = Char.dquote orelse String.contains ("?<>#% {}|\\^ []`", c)) val shouldEscape = Trace.trace ("Url.shouldEscape", Char.layout, Bool.layout) shouldEscape fun escape s = String.translate (s, fn c => if shouldEscape c then Char.escapeHex c else str c) structure Scheme = struct datatype t = File | Ftp | Gopher | Http | Https | Telnet val map = [("file", File), ("ftp", Ftp), ("gopher", Gopher), ("http", Http), ("https", Https), ("telnet", Telnet)] val fromString = String.memoizeList (fn _ => Error.bug "Url.Scheme.fromString", map) val equals: t * t -> bool = op = fun toString s = #1 (valOf (List.peek (map, fn (_, s') => equals (s, s')))) val layout = Layout.str o toString end structure Authority = struct type t = {user: string option, host: string, port: int option} fun layout ({user, host, port}: t) = Layout.record [("user", Option.layout String.layout user), ("host", String.layout host), ("port", Option.layout Int.layout port)] fun canonicalize {user, host, port} = {user = Option.map (user, String.toLower), host = String.toLower host, port = port} fun equals ({user = u, host = h, port = p}: t, {user = u', host = h', port = p'}: t): bool = Option.equals (u, u', String.equals) andalso String.toLower h = String.toLower h' andalso Option.equals (p, p', Port.equals) val equals = Trace.trace2 ("Url.Authority.equals", layout, layout, Bool.layout) equals end (* The numbers in comments are rule numbers from Section 5.2 of RFC 2396. *) (* canonicalizePath (p1, p2, f) * Assume p1 is already canonicalized. *) fun canonicalizePath (p1: string list, p2: string list, f: string) = let fun loop (r, ac) = case r of [] => (case f of "." => (rev ac, "") (* 6d *) | ".." => (case ac of [] => ([], "..") | ".." :: _ => (rev ac, "..") | _ :: ac => (rev ac, "")) (* 6f *) | _ => (rev ac, f)) | "" :: r => loop (r, ac) | "." :: r => loop (r, ac) (* 6c *) | ".." :: r => loop (r, case ac of [] => [".."] | ".." :: _ => ".." :: ac | _ :: ac => ac) (* 6e *) | s :: r => loop (r, s :: ac) in loop (p2, rev p1) end structure Path = struct type t = {file: string, isAbsolute: bool, path: string list} local fun make f (p: t) = f p in val file = make #file val isAbsolute = make #isAbsolute val path = make #path end val root = {isAbsolute = true, path = [], file = ""} fun canonicalize {isAbsolute = i, path = p, file = f} = let val (p, f) = canonicalizePath ([], p, f) in {isAbsolute = i, path = p, file = f} end fun toString ({isAbsolute, path, file}) = concat [if isAbsolute then "/" else "", escape (concat (List.separate (path @ [file], "/")))] val layout = Layout.str o toString end datatype t = T of {authority: Authority.t option, fragment: string option, path: Path.t option, query: string option, scheme: Scheme.t option} (* NONE in relative urls *) | JavaScript of string | MailTo of string | News of string | Opaque of {scheme: string, rest: string} fun addQuery (u: t, q) = case u of T {authority, fragment, path, query, scheme}=> if isSome query then Error.bug "Url.addQuery" else T {authority = authority, fragment = fragment, path = path, query = SOME q, scheme = scheme} | _ => Error.bug "Url.addQuery" fun host (u: t): string = case u of T {authority = SOME {host, ...}, ...} => host | _ => Error.bug "Url.host" fun path (u: t): Path.t = case u of T {path = SOME p, ...} => p | _ => Error.bug "Url.path" fun mo (opt, f) = case opt of NONE => "" | SOME x => f x fun toString url = case url of T {scheme, authority, path, query, fragment} => concat [mo (scheme, fn s => concat [Scheme.toString s, ":"]), mo (authority, fn {user, host, port} => concat ["//", mo (user, fn u => concat [escape u, "@"]), host, mo (port, fn p => concat [":", Int.toString p])]), mo (path, Path.toString), mo (query, fn q => concat ["?", if !escapeQuery then escape q else q]), mo (fragment, fn f => concat ["#", escape f]) ] | JavaScript s => concat ["javascript:", escape s] | MailTo email => concat ["mailto:", escape email] | News group => concat ["news:", escape group] | Opaque {scheme, rest} => concat [scheme, ":", escape rest] val layout = Layout.str o toString val toString = Trace.trace ("Url.toString", layout, String.layout) toString val layout = fn T {scheme, authority, path, query, fragment} => Layout.record [("scheme", Option.layout Scheme.layout scheme), ("authority", Option.layout Authority.layout authority), ("path", Option.layout Path.layout path), ("query", Option.layout String.layout query), ("fragment", Option.layout String.layout fragment)] | u => layout u val equals: t * t -> bool = op = structure Regexp = struct open Regexp val digit = isChar Char.isDigit val upalpha = isChar Char.isUpper val lowalpha = isChar Char.isLower val alpha = isChar Char.isAlpha val alphanum = isChar Char.isAlphaNum val hex = isChar Char.isHexDigit val escaped = seq [char #"%", hex, hex] val mark = oneOf "-_.!~*' ()" val unreserved = or [alphanum, mark] val reserved = oneOf ";/?:@&=+$," val printable = isChar Char.isPrint (*val urlc = or [reserved, unreserved, escaped]*) (* It's pointless to follow the spec on urlc, which rules out lots of * printable characters. Lot's of sites use printable characters outside * the spec, and browsers handle them, so we should too. *) val urlc = printable val fragment' = Save.new () val fragment = save (star urlc, fragment') val query' = Save.new () (* The official definition of query says urlc*, but this doesn't work with * our expanded meaning of urlc = printable, since then the query consumes * the fragment. *) (* val query = save (star urlc, query') *) val query = save (star (isChar (fn c => Char.isPrint c andalso c <> #"#")), query') val port' = Save.new () val port = save (star digit, port') val IPv4address = seq [oneOrMore digit, char #".", oneOrMore digit, char #".", oneOrMore digit, char #".", oneOrMore digit] val toplabel = or [alpha, seq [alpha, star (or [alphanum, char #"-"]), alphanum]] val domainlabel = or [alphanum, seq [alphanum, star (or [alphanum, char #"-"]), alphanum]] val hostname = seq [star (seq [domainlabel, char #"."]), toplabel, optional (char #".")] val host' = Save.new () val host = save (or [hostname, IPv4address], host') val hostport = seq [host, optional (seq [char #":", port])] val userinfo' = Save.new () val userinfo = save (star (or [unreserved, escaped, oneOf ";:&=+$"]), userinfo') val server = optional (seq [optional (seq [userinfo, char #"@"]), hostport]) val regName' = Save.new () val regName = save (oneOrMore (or [unreserved, escaped, oneOf "$,;:@&=+"]), regName') val authority = or [server, regName] val scheme' = Save.new () val scheme = save (seq [alpha, star (or [alpha, digit, oneOf "+-."])], scheme') val relSegment' = Save.new () val relSegment = save (oneOrMore (or [unreserved, escaped, oneOf ";@&=+$,"]), relSegment') (* val pchar = or [unreserved, escaped, oneOf ":@&=+$,", wrong] *) (* val param = star pchar *) (* val segment = seq [star pchar, star (seq [char #";", param])] *) (* val pathSegments = seq [segment, star (seq [char #"/", segment])] *) val pathSegments' = Save.new () val pathSegments = save (star (isChar (fn c => (Char.isPrint c andalso not (String.contains ("?#", c))))), pathSegments') val absPath = seq [char #"/", pathSegments] val relPath = seq [relSegment, optional absPath] val netPath = seq [string "//", authority, optional absPath] val urlcNoSlash = or [unreserved, escaped, oneOf ";?:@&=+$,"] val opaquePart' = Save.new () val opaquePart = save (seq [urlcNoSlash, star urlc], opaquePart') val hierPart = seq [or [netPath, absPath], optional (seq [char #"?", query])] (* netPath occurs before absPath in the following regexp because * you want urls like //foo.com/z to be a netPath with host foo.com and * not as an absPath. Fortunately, the regexp library returns the * first matching choice in an or. *) val relativeUrl = seq [or [netPath, absPath, relPath, null (* null added for empty urls -- these are * not in RFC 2396 as far as I can tell, but * some of their examples use them. *) ], optional (seq [char #"?", query])] val absoluteUrl = seq [scheme, char #":", or [hierPart, opaquePart]] val url = seq [optional (or [absoluteUrl, relativeUrl]), optional (seq [char #"#", fragment])] val url = Promise.lazy (fn () => compileDFA url) fun peekQuery (m: Match.t): string option = Option.map (Match.peek (m, query'), fn ss => let val s = Substring.toString ss in if !escapeQuery then unescape s else s end) fun getAbsPath (m: Match.t): Path.t = case Match.peek (m, pathSegments') of NONE => Error.bug "Url.Regexp.getAbsPath" | SOME ss => let val s = Substring.toString ss val (p, f) = List.splitLast (String.fields (unescape s, fn c => c = #"/")) in {isAbsolute = true, path = p, file = f} end end fun getMatch (m: Regexp.Match.t): t = let open Regexp val {peek, lookup, exists, ...} = Match.stringFuns m in if exists opaquePart' then let val scheme = String.toLower (lookup scheme') val rest = unescape (lookup opaquePart') in case scheme of "javascript" => JavaScript rest | "mailto" => MailTo rest | "news" => News rest | _ => Opaque {scheme = scheme, rest = rest} end else let val authority = if exists host' then SOME {user = Option.map (peek userinfo', unescape), host = lookup host', port = Option.map (peek port', valOf o Int.fromString)} else NONE fun split ss = String.fields (unescape ss, fn c => c = #"/") val path = case (Option.map (peek relSegment', unescape), Option.map (peek pathSegments', split)) of (NONE, NONE) => NONE | (SOME file, NONE) => SOME {isAbsolute = false, path = [], file = file} | (NONE, SOME ss) => let val (p, f) = List.splitLast ss in SOME {isAbsolute = true, path = p, file = f} end | (SOME s, SOME ss) => let val (p, f) = List.splitLast ss in SOME {isAbsolute = false, path = s :: p, file = f} end in T {scheme = Option.map (peek scheme', Scheme.fromString), authority = authority, path = path, query = peekQuery m, fragment = Option.map (peek fragment', unescape)} end end fun fromString (urlString: string): t option = Option.map (Regexp.Compiled.matchAll (Regexp.url(), urlString), getMatch) val fromString = Trace.trace ("Url.fromString", String.layout, Option.layout layout) fromString fun equals (u: t, u': t): bool = u = u' val mailto = MailTo val news = News (* ------------------------------------------------- *) (* relativize *) (* ------------------------------------------------- *) fun relativize {base = b, relative = r} = case (b, r) of (T {scheme = SOME s, authority = SOME a, path = p, ...}, T {scheme = SOME s', authority = SOME a', path = p', query = q', fragment = f'}) => if Scheme.equals (s, s') andalso Authority.equals (a, a') then let fun some (p, f) = let val (p, f) = case (p, f) of ([], "") => ([], ".") | _ => (p, f) in SOME {isAbsolute = false, path = p, file = f} end val p': Path.t option = case (p, p') of (NONE, NONE) => NONE | (NONE, SOME {path, file, ...}) => some (path, file) | (SOME {path, ...}, NONE) => some (List.map (path, fn _ => ".."), "") | (SOME {path = p, ...}, SOME {path = p', file, ...}) => let val (p, p') = List.removeCommonPrefix (p, p', String.equals) in some (List.map (p, fn _ => "..") @ p', file) end in SOME (T {scheme = NONE, authority = NONE, path = p', query = q', fragment = f'}) end else NONE | _ => NONE val relativize = Trace.trace ("Url.relativize", fn {base = b, relative = r} => Layout.tuple [layout b, layout r], Option.layout layout) relativize (* ------------------------------------------------- *) (* resolve *) (* ------------------------------------------------- *) (* The numbers in comments are rule numbers from Section 5.2 of RFC 2396. *) fun resolve {base, relative} = case (base, relative) of (_, T {scheme = SOME _, ...}) => relative (* 3 *) | (T {scheme = s, authority = a, path = p, query = q, ...}, T {authority = a', path = p', query = q', fragment = f', ...}) => let val (a, p, q) = case (a', p', q') of (SOME _, _, _) => (a', p', q') (* 4 *) | (_, NONE, NONE) => (a, p, q) (* 2 *) | (_, NONE, SOME _) => (* 6 *) let val p = Option.map (p, fn {isAbsolute, path, file} => {isAbsolute = isAbsolute, path = path, file = ""}) in (a, p, q') end | (_, SOME {isAbsolute = true, ...}, _) => (a, p', q') (* 5 *) | (_, SOME {isAbsolute = false, path = p', file = f'}, _) => (* 6 *) let val (p', f') = case p of NONE => (p', f') | SOME {path, ...} => canonicalizePath (path, p', f') in (a, SOME {isAbsolute = true, path = p', file = f'}, q') end in T {scheme = s, authority = a, path = p, query = q, fragment = f'} end | _ => relative val resolve = Trace.trace ("Url.resolve", fn {base = b, relative = r} => Layout.tuple [layout b, layout r], layout) resolve (* ------------------------------------------------- *) (* canonicalize *) (* ------------------------------------------------- *) fun canonicalize (u: t): t = case u of T {scheme, authority, path, query, fragment} => T {scheme = scheme, authority = Option.map (authority, Authority.canonicalize), path = Option.map (path, Path.canonicalize), query = query, fragment = fragment} | _ => u end mlton-20100608/lib/mlton/basic/vector.fun0000644000076600000240000003664311404435636016575 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Vector (S: sig include VECTOR_STRUCTS val unsafeSub: 'a t * int -> 'a end): VECTOR = struct open S val size = length fun unfold (n, a, f) = unfoldi (n, a, f o #2) fun tabulate (n, f) = #1 (unfoldi (n, (), fn (i, ()) => (f i, ()))) fun fromArray a = tabulate (Pervasive.Array.length a, fn i => Pervasive.Array.sub (a, i)) fun toArray v = Pervasive.Array.tabulate (length v, fn i => sub (v, i)) datatype ('a, 'b) continue = Continue of 'a | Done of 'b fun fold' (v, start, b, f, g) = let val n = length v fun loop (i, b) = if i >= n then g b else case f (i, unsafeSub (v, i), b) of Continue b => loop (i + 1, b) | Done c => c in if 0 <= start andalso start <= n then loop (start, b) else Error.bug "Vector.fold'" end fun foldFrom (v, start, b, f) = fold' (v, start, b, fn (_, a, b) => Continue (f (a, b)), fn b => b) fun fold (a, b, f) = foldFrom (a, 0, b, f) fun isEmpty a = 0 = length a fun dropPrefix (v, n) = tabulate (length v - n, fn i => sub (v, i + n)) fun dropSuffix (v, n) = tabulate (length v - n, fn i => sub (v, i)) fun new (n, x) = tabulate (n, fn _ => x) fun mapi (a, f) = tabulate (length a, fn i => f (i, unsafeSub (a, i))) fun map (v, f) = mapi (v, f o #2) fun copy v = map (v, fn x => x) fun existsR (v, start, stop, f) = fold' (v, start, (), fn (i, a, ()) => if i = stop then Done false else if f a then Done true else Continue (), fn _ => false) fun foldi (v, b, f) = fold' (v, 0, b, Continue o f, fn b => b) fun loopi (v, f, g) = fold' (v, 0, (), fn (i, a, ()) => (case f (i, a) of NONE => Continue () | SOME b => Done b), g) fun loop (v, f, g) = loopi (v, f o #2, g) fun peekMapi (v, f) = let val n = length v fun loop i = if i = n then NONE else (case f (sub (v, i)) of NONE => loop (i + 1) | SOME b => SOME (i, b)) in loop 0 end fun peekMap (v, f) = loop (v, fn a => (case f a of NONE => NONE | z => SOME z), fn () => NONE) fun fromListMap (l, f) = let val r = ref l in tabulate (List.length l, fn _ => case !r of [] => Error.bug "Vector.fromListMap" | x :: l => (r := l; f x)) end fun fromList l = fromListMap (l, fn x => x) fun foldr2 (a, a', b, f) = let val n = length a val n' = length a' fun loop (i, b) = if i < 0 then b else loop (i - 1, f (unsafeSub (a, i), unsafeSub (a', i), b)) in if n = n' then loop (n - 1, b) else Error.bug "Vector.foldr2" end fun foldi2From (a, a', start, b, f) = let val n = length a val n' = length a' fun loop (i, b) = if i >= n then b else loop (i + 1, f (i, unsafeSub (a, i), unsafeSub (a', i), b)) in if n = n' andalso 0 <= start andalso start <= n then loop (start, b) else Error.bug "Vector.foldi2From" end fun foldi2 (a, a', b, f) = foldi2From (a, a', 0, b, f) fun foreachi2 (v, v', f) = foldi2 (v, v', (), fn (i, x, x', ()) => f (i, x, x')) fun fold2 (a, a', b, f) = foldi2 (a, a', b, fn (_, x, x', b) => f (x, x', b)) fun fold3From (a, a', a'', start, b, f) = let val n = length a val n' = length a' val n'' = length a'' fun loop (i, b) = if i >= n then b else loop (i + 1, f (unsafeSub (a, i), unsafeSub (a', i), unsafeSub (a'', i), b)) in if n = n' andalso n = n'' andalso 0 <= start andalso start <= n then loop (start, b) else Error.bug "Vector.fold3From" end fun fold3 (a, a', a'', b, f) = fold3From (a, a', a'', 0, b, f) fun foreachR (v, start, stop, f: 'a -> unit) = if 0 <= start andalso start <= stop andalso stop <= length v then let fun step (i, a, ()) = if i >= stop then Done () else (f a; Continue ()) in fold' (v, start, (), step, fn () => ()) end else Error.bug "Vector.foreachR" fun foreach2 (a, a', f) = fold2 (a, a', (), fn (x, x', ()) => f (x, x')) fun forall2 (v, v', f) = let val n = length v fun loop i = i = n orelse (f (sub (v, i), sub (v', i)) andalso loop (i + 1)) in if n = length v' then loop 0 else Error.bug "Vector.forall2" end fun foreach3 (v1, v2, v3, f: 'a * 'b * 'c -> unit) = let val n = length v1 val _ = if n = length v2 andalso n = length v3 then () else Error.bug "Vector.foreach3" fun loop i = if i = n then () else (f (sub (v1, i), sub (v2, i), sub (v3, i)) ; loop (i + 1)) in loop 0 end fun foreachi (a, f) = foldi (a, (), fn (i, x, ()) => f (i, x)) fun foreach (a, f) = foreachi (a, f o #2) fun 'a peeki (v, f) = let val n = length v fun loop i = if i = n then NONE else let val x = sub (v, i) in if f (i, x) then SOME (i, x) else loop (i + 1) end in loop 0 end fun peek (a, f) = Option.map (peeki (a, f o #2), #2) fun existsi (a, f) = isSome (peeki (a, f)) fun exists (a, f) = existsi (a, f o #2) fun contains (v, a, f) = exists (v, fn a' => f (a, a')) fun foralli (a, f) = not (existsi (a, not o f)) fun forall (a, f) = foralli (a, f o #2) fun equals (a, a', equals) = length a = length a' andalso foralli (a, fn (i, x) => equals (x, unsafeSub (a', i))) fun foldri (a, b, f) = Int.foldDown (0, length a, b, fn (i, b) => f (i, unsafeSub (a, i), b)) fun foldr (a, b, f) = foldri (a, b, fn (_, a, b) => f (a, b)) fun foreachri (a, f) = foldri (a, (), fn (i, x, ()) => f (i, x)) fun foreachr (a, f) = foreachri (a, f o #2) fun toList a = foldr (a, [], op ::) fun toListMap (a, f) = foldr (a, [], fn (a, ac) => f a :: ac) fun layout l v = Layout.tuple (toListMap (v, l)) fun toString xToString l = Layout.toString (layout (Layout.str o xToString) l) fun new0 () = tabulate (0, fn _ => Error.bug "Vector.new0") fun new1 x = tabulate (1, fn _ => x) fun new2 (x0, x1) = tabulate (2, fn 0 => x0 | 1 => x1 | _ => Error.bug "Vector.new2") fun new3 (x0, x1, x2) = tabulate (3, fn 0 => x0 | 1 => x1 | 2 => x2 | _ => Error.bug "Vector.new3") fun new4 (x0, x1, x2, x3) = tabulate (4, fn 0 => x0 | 1 => x1 | 2 => x2 | 3 => x3 | _ => Error.bug "Vector.new4") fun new5 (x0, x1, x2, x3, x4) = tabulate (5, fn 0 => x0 | 1 => x1 | 2 => x2 | 3 => x3 | 4 => x4 | _ => Error.bug "Vector.new5") fun new6 (x0, x1, x2, x3, x4, x5) = tabulate (6, fn 0 => x0 | 1 => x1 | 2 => x2 | 3 => x3 | 4 => x4 | 5 => x5 | _ => Error.bug "Vector.new6") fun unzip (a: ('a * 'b) t) = (map (a, #1), map (a, #2)) fun unzip3 (a: ('a * 'b * 'c) t) = (map (a, #1), map (a, #2), map (a, #3)) fun rev v = let val n = length v val n1 = n - 1 in tabulate (n, fn i => unsafeSub (v, n1 - i)) end fun fromListRev l = rev (fromList l) fun mapAndFold (v, b, f) = let val r = ref b val v = map (v, fn x => let val (c, b) = f (x, !r) val _ = r := b in c end) in (v, !r) end fun map2i (v, v', f) = let val n = length v in if n = length v' then tabulate (n, fn i => f (i, unsafeSub (v, i), unsafeSub (v', i))) else Error.bug "Vector.map2i" end fun map2 (v, v', f) = map2i (v, v', fn (_, x, x') => f (x, x')) fun map2AndFold (v, v', b, f) = let val r = ref b val v = map2 (v, v', fn (x, x') => let val (y, b) = f (x, x', !r) val _ = r := b in y end) in (v, !r) end fun map3 (v1, v2, v3, f) = let val n = length v1 in if n = length v2 andalso n = length v3 then tabulate (n, fn i => f (unsafeSub (v1, i), unsafeSub (v2, i), unsafeSub (v3, i))) else Error.bug "Vector.map3" end fun zip (v, v') = map2 (v, v', fn z => z) local fun doit (f, mapi) = let val n = ref 0 val b = mapi (fn x => let val b = f x val _ = if isSome b then n := 1 + !n else () in b end) val r = ref 0 fun loop (i: int) = case unsafeSub (b, i) of NONE => loop (i + 1) | SOME b => (r := i + 1; b) in tabulate (!n, fn _ => loop (!r)) end in fun keepAllMapi (a, f) = doit (f, fn f => mapi (a, f)) fun keepAllMap2i (a, b, f) = doit (f, fn f => map2i (a, b, f)) end fun keepAllMap (v, f) = keepAllMapi (v, f o #2) fun keepAllMap2 (v, v', f) = keepAllMap2i (v, v', fn (_, x, x') => f (x, x')) fun keepAllSome v = keepAllMap (v, fn a => a) fun keepAll (v, f) = keepAllMap (v, fn a => if f a then SOME a else NONE) fun compare (v, v', comp) = let val n = length v val n' = length v' in Relation.lexico (Int.compare (n, n'), fn () => let fun loop i = if i = n then EQUAL else Relation.lexico (comp (unsafeSub (v, i), unsafeSub (v', i)), fn () => loop (i + 1)) in loop 0 end) end fun toListRev v = fold (v, [], op ::) fun last v = let val n = length v in if n = 0 then Error.bug "Vector.last" else unsafeSub (v, n - 1) end fun tabulator (n: int, f: ('a -> unit) -> unit) = let val a = Pervasive.Array.array (n, NONE) val r = ref 0 val _ = f (fn x => let val i = !r in if i >= n then Error.bug "Vector.tabulator: too many elements" else (Pervasive.Array.update (a, i, SOME x) ; r := i + 1) end) in if !r < n then Error.bug "Vector.tabulator: not enough elements" else tabulate (n, fn i => valOf (Pervasive.Array.sub (a, i))) end fun 'a concat (vs: 'a t list): 'a t = case vs of [] => new0 () | v :: vs' => let val n = List.fold (vs, 0, fn (v, s) => s + length v) in #1 (unfold (n, (0, v, vs'), let fun loop (i, v, vs) = if i < length v then (sub (v, i), (i + 1, v, vs)) else case vs of [] => Error.bug "Vector.concat" | v :: vs => loop (0, v, vs) in loop end)) end fun concatV vs = if 0 = length vs then new0 () else let val n = fold (vs, 0, fn (v, s) => s + length v) fun state i = (i, sub (vs, i), 0) in #1 (unfold (n, state 0, let fun loop (i, v, j) = if j < length v then (sub (v, j), (i, v, j + 1)) else loop (state (i + 1)) in loop end)) end fun splitLast v = let val n = length v in if n <= 0 then Error.bug "Vector.splitLast" else (tabulate (n - 1, fn i => unsafeSub (v, i)), unsafeSub (v, n - 1)) end fun isSortedRange (v: 'a t, start: int, stop: int, le : 'a * 'a -> bool): bool = (Assert.assert ("Vector.isSortedRange", fn () => 0 <= start andalso start <= stop andalso stop <= length v) ; start = stop orelse let fun loop (i, prev) = i >= stop orelse let val cur = sub (v, i) in le (prev, cur) andalso loop (i + 1, cur) end in loop (start + 1, sub (v, start)) end) fun isSorted (v, op <=) = isSortedRange (v, 0, length v, op <=) fun indexi (v, f) = fold' (v, 0, (), fn (i, a, _) => if f (i, a) then Done (SOME i) else Continue (), fn _ => NONE) fun index (v, f) = indexi (v, f o #2) fun indices (a: bool t): int t = keepAllMapi (a, fn (i, b) => if b then SOME i else NONE) val indices = Trace.trace ("Vector.indices", layout Bool.layout, layout Int.layout) indices fun isSubsequence (va, vb, f) = let val na = length va val nb = length vb fun loop (ia, ib) = ia >= na orelse let val a = sub (va, ia) fun loop' ib = ib < nb andalso if f (a, sub (vb, ib)) then loop (ia + 1, ib + 1) else loop' (ib + 1) in loop' ib end in loop (0, 0) end fun removeFirst (v, f) = let val seen = ref false val v = keepAll (v, fn a => not (f a) orelse (!seen) orelse (seen := true ; false)) val _ = if !seen then () else Error.bug "Vector.removeFirst" in v end fun partitioni (v, f) = let val n = ref 0 val v' = mapi (v, fn (i, x) => let val b = f (i, x) val _ = if b then n := 1 + !n else () in (x,b) end) val n = !n val r = ref 0 fun loop b (i:int) = case unsafeSub (v', i) of (x, b') => if b = b' then (r := i + 1; x) else loop b (i + 1) val yes = tabulate (n, fn _ => loop true (!r)) val _ = r := 0 val no = tabulate (length v - n, fn _ => loop false (!r)) in {yes = yes, no = no} end fun partition (v, f) = partitioni (v, f o #2) fun prefix (v, n) = tabulate (n, fn i => sub (v, i)) fun removeDuplicates (v, equals) = keepAllMapi (v, fn (i, x) => if i > 0 andalso equals (x, sub (v, i - 1)) then NONE else SOME x) fun randomElement v = sub (v, Random.natLessThan (length v)) end mlton-20100608/lib/mlton/basic/vector.sig0000644000076600000240000001370511404435636016561 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature VECTOR_STRUCTS = sig type 'a t exception New val length: 'a t -> int val sub: 'a t * int -> 'a val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a t * 'b end signature VECTOR = sig include VECTOR_STRUCTS val compare: 'a t * 'a t * ('a * 'a -> order) -> order val concat: 'a t list -> 'a t val concatV: 'a t t -> 'a t val contains: 'a t * 'a * ('a * 'a -> bool) -> bool val copy: 'a t -> 'a t val dropPrefix: 'a t * int -> 'a t val dropSuffix: 'a t * int -> 'a t val equals: 'a t * 'b t * ('a * 'b -> bool) -> bool val exists: 'a t * ('a -> bool) -> bool val existsi: 'a t * (int * 'a -> bool) -> bool val existsR: 'a t * int * int * ('a -> bool) -> bool val fold2: 'a t * 'b t * 'c * ('a * 'b * 'c -> 'c) -> 'c val fold3From: 'a t * 'b t * 'c t * int * 'd * ('a * 'b * 'c * 'd -> 'd) -> 'd val fold3: 'a t * 'b t * 'c t * 'd * ('a * 'b * 'c * 'd -> 'd) -> 'd datatype ('a, 'b) continue = Continue of 'a | Done of 'b (* fold' (v, i, b, f, g) * folds over v starting at index i with state b, applying f to each * index, vector element, and state, continuing depending on what f * returns. If the end of the vector is reached, g is applied to the * state. *) val fold': 'a t * int * 'b * (int * 'a * 'b -> ('b, 'c) continue) * ('b -> 'c) -> 'c val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foldFrom: 'a t * int * 'b * ('a * 'b -> 'b) -> 'b val foldi: 'a t * 'b * (int * 'a * 'b -> 'b) -> 'b val foldi2From: 'a t * 'b t * int * 'c * (int * 'a * 'b * 'c -> 'c) -> 'c val foldr: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foldri: 'a t * 'b * (int * 'a * 'b -> 'b) -> 'b val foldr2: 'a t * 'b t * 'c * ('a * 'b * 'c -> 'c) -> 'c val forall: 'a t * ('a -> bool) -> bool val forall2: 'a t * 'b t * ('a * 'b -> bool) -> bool val foralli: 'a t * (int * 'a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val foreachi: 'a t * (int * 'a -> unit) -> unit val foreachi2: 'a t * 'b t * (int * 'a * 'b -> unit) -> unit val foreachr: 'a t * ('a -> unit) -> unit val foreachri: 'a t * (int * 'a -> unit) -> unit val foreach2: 'a t * 'b t * ('a * 'b -> unit) -> unit val foreachR: 'a t * int * int * ('a -> unit) -> unit val foreach3: 'a t * 'b t * 'c t * ('a * 'b * 'c -> unit) -> unit val fromArray: 'a array -> 'a t val fromList: 'a list -> 'a t val fromListMap: 'a list * ('a -> 'b) -> 'b t val fromListRev: 'a list -> 'a t val indexi: 'a t * (int * 'a -> bool) -> int option val index: 'a t * ('a -> bool) -> int option val indices: bool t -> int t val isEmpty: 'a t -> bool val isSorted: 'a t * ('a * 'a -> bool) -> bool (* isSortedRange (v, l, u, <=) checks if [l, u) is sorted. *) val isSortedRange: 'a t * int * int * ('a * 'a -> bool) -> bool val isSubsequence: 'a t * 'b t * ('a * 'b -> bool) -> bool val keepAll: 'a t * ('a -> bool) -> 'a t val keepAllMap: 'a t * ('a -> 'b option) -> 'b t val keepAllMapi: 'a t * (int * 'a -> 'b option) -> 'b t val keepAllMap2: 'a t * 'b t * ('a * 'b -> 'c option) -> 'c t val keepAllSome: 'a option t -> 'a t val last: 'a t -> 'a val layout: ('a -> Layout.t) -> 'a t -> Layout.t val loop: 'a t * ('a -> 'b option) * (unit -> 'b) -> 'b val loopi: 'a t * (int * 'a -> 'b option) * (unit -> 'b) -> 'b val map: 'a t * ('a -> 'b) -> 'b t val map2: 'a t * 'b t * ('a * 'b -> 'c) -> 'c t val map3: 'a t * 'b t * 'c t * ('a * 'b * 'c -> 'd) -> 'd t val mapAndFold: 'a t * 'b * ('a * 'b -> 'c * 'b) -> 'c t * 'b val map2AndFold: 'a t * 'b t * 'c * ('a * 'b * 'c -> 'd * 'c) -> 'd t * 'c val mapi: 'a t * (int * 'a -> 'b) -> 'b t val new: int * 'a -> 'a t val new0: unit -> 'a t val new1: 'a -> 'a t val new2: 'a * 'a -> 'a t val new3: 'a * 'a * 'a -> 'a t val new4: 'a * 'a * 'a * 'a -> 'a t val new5: 'a * 'a * 'a * 'a * 'a -> 'a t val new6: 'a * 'a * 'a * 'a * 'a * 'a -> 'a t val partition: 'a t * ('a -> bool) -> {no: 'a t, yes: 'a t} val partitioni: 'a t * (int * 'a -> bool) -> {no: 'a t, yes: 'a t} val peek: 'a t * ('a -> bool) -> 'a option val peeki: 'a t * (int * 'a -> bool) -> (int * 'a) option val peekMap: 'a t * ('a -> 'b option) -> 'b option val peekMapi: 'a t * ('a -> 'b option) -> (int * 'b) option val prefix: 'a t * int -> 'a t val randomElement: 'a t -> 'a val removeDuplicates: 'a t * ('a * 'a -> bool) -> 'a t val removeFirst: 'a t * ('a -> bool) -> 'a t val rev: 'a t -> 'a t val size: 'a t -> int val splitLast: 'a t -> 'a t * 'a val tabulate: int * (int -> 'a) -> 'a t val tabulator: int * (('a -> unit) -> unit) -> 'a t val toArray: 'a t -> 'a array val toList: 'a t -> 'a list val toListMap: 'a t * ('a -> 'b) -> 'b list val toListRev: 'a t -> 'a list val toString: ('a -> string) -> 'a t -> string val unzip: ('a * 'b) t -> 'a t * 'b t val unzip3: ('a * 'b * 'c) t -> 'a t * 'b t * 'c t val zip: 'a t * 'b t -> ('a * 'b) t end functor TestVector (S: VECTOR): sig end = struct open S val _ = Assert.assert ("TestVector", fn () => let fun check ls = List.concat ls = toList (concat (List.map (ls, fromList))) andalso List.concat ls = toList (concatV (fromListMap (ls, fromList))) in List.forall ([[], [[]], [[], [1]], [[1], []], [[1], [], [2]], [[1, 2], [3, 4]]], check) end) end mlton-20100608/lib/mlton/basic/vector.sml0000644000076600000240000000177411404435636016575 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Vector = let structure V = Vector (local open Pervasive.Vector in type 'a t = 'a vector exception New = Size val length = length val sub = sub val unfoldi = MLton.Vector.unfoldi val unsafeSub = Unsafe.Vector.sub end) in struct open V type 'a vector = 'a t (* The built-in concat is faster in MLton because it can use * Vector.fromArray. * See src/basis-library/arrays-and-vectors/sequence.fun. *) val concat = Pervasive.Vector.concat end end mlton-20100608/lib/mlton/basic/word.sig0000644000076600000240000000307411404435636016230 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature WORD = sig type t val * : t * t -> t val + : t * t -> t val - : t * t -> t val < : t * t -> bool val << : t * word -> t val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val >> : t * word -> t val ~ : t -> t val ~>> : t * word -> t val andb: t * t -> t val compare: t * t -> order val div: t * t -> t val equals: t * t -> bool val format: t * StringCvt.radix -> string val fromChar: char -> t val fromInt: int -> t val fromIntInf: Pervasive.IntInf.int -> t val fromLarge: Pervasive.LargeWord.word -> t val fromWord: word -> t val fromString: string -> t option val layout: t -> Layout.t val max: t * t -> t val min: t * t -> t val mod: t * t -> t val notb: t -> t val nthBitIsSet: t * int -> bool val orb: t * t -> t val toChar: t -> char val toInt: t -> int val toIntX: t -> int val toIntInf: t -> Pervasive.IntInf.int val toIntInfX: t -> Pervasive.IntInf.int val toLarge: t -> Pervasive.LargeWord.word val toLargeX: t -> Pervasive.LargeWord.word val toWord: t -> word val toWordX: t -> word val toString: t -> string val wordSize: int val xorb: t * t -> t end mlton-20100608/lib/mlton/basic/word.sml0000644000076600000240000000567011404435636016245 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Word: sig include WORD val addCheck: t * t -> t (* may raise Overflow *) val fromWord8: Word8.t -> t (* fromWord8s f. f 0 should return the least significant byte * and f 3 should return the most significant. *) val fromWord8s: (int -> Word8.t) -> t val log2: t -> t (* 2 ^ (log2 w) <= w < 2 ^ (1 + log2 w) *) val maxPow2ThatDivides: t -> word val toWord8: t -> Word8.t (* val rotateLeft: t * t -> t *) val roundDownToPowerOfTwo: t -> t val roundUpToPowerOfTwo: t -> t end = struct structure Int = Pervasive.Int open Pervasive.Word structure Z = FixWord (Pervasive.Word) open Z val equals: t * t -> bool = op = fun fromWord8s (f: int -> Word8.t): t = let fun g (i, shift) = Pervasive.Word.<< (Word8.toWord (f i), shift) fun loop (w, i, shift) = if Int.>= (Int.* (i, 8), Pervasive.Word.wordSize) then w else loop (orb (w, g (i, shift)), Int.+ (i, 1), shift + 0w8) in loop (0w0, 0, 0w0) end val fromWord = fn x => x val toWord = fn x => x val toWordX = fn x => x val fromIntInf = fromLargeInt val toIntInf = toLargeInt val toIntInfX = toLargeIntX val fromWord8 = Word8.toWord val toWord8 = Word8.fromWord fun log2 (w: t): t = if w = 0w0 then Error.bug "Word.log2: 0" else let fun loop (n, s, ac): word = if n = 0w1 then ac else let val (n, ac) = if n >= << (0w1, s) then (>> (n, s), ac + s) else (n, ac) in loop (n, >> (s, 0w1), ac) end in loop (w, 0w16, 0w0) end fun roundDownToPowerOfTwo (w: t) = << (0w1, log2 w) fun roundUpToPowerOfTwo w = let val w' = roundDownToPowerOfTwo w in if w = w' then w else w' * 0w2 end structure M = MaxPow2ThatDivides (open Word type t = word val equals: t * t -> bool = op = val one: t = 0w1 val zero: t = 0w0) open M fun addCheck (w, w') = if w <= ~ 0w1 - w' then w + w' else raise Overflow end mlton-20100608/lib/mlton/basic/word8-array-slice.sml0000644000076600000240000000005411404435636020535 0ustar mtfstaffstructure Word8ArraySlice = Word8ArraySlice mlton-20100608/lib/mlton/basic/word8.sml0000644000076600000240000000403111404435636016323 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Use fromLargeWord instead of fromLarge so we can compile this code * with older MLtons that don't have fromLarge. *) functor FixWord (W: PERVASIVE_WORD) = struct type t = W.word local structure LargeWord = Pervasive.LargeWord structure Word = Pervasive.Word structure Word8 = Pervasive.Word8 in fun format (w, f) = W.fmt f w val fromChar = W.fromLargeWord o Word8.toLargeWord o Byte.charToByte val fromIntInf = W.fromLargeInt val fromLarge = W.fromLargeWord o LargeWord.toLargeWord val fromWord = W.fromLargeWord o Word.toLargeWord val layout = Layout.str o W.toString fun nthBitIsSet (w: t, n: int): bool = W.fromInt 1 = W.andb (W.fromInt 1, W.>> (w, Word.fromInt n)) val toChar = Byte.byteToChar o Word8.fromLargeWord o W.toLargeWord val toIntInf = W.toLargeInt val toIntInfX = W.toLargeIntX val toLarge = LargeWord.fromLargeWord o W.toLargeWord val toLargeX = LargeWord.fromLargeWord o W.toLargeWordX val toWord = Word.fromLargeWord o W.toLargeWord val toWordX = Word.fromLargeWord o W.toLargeWordX end end structure Word8: sig include WORD val stringToVector: string -> t vector val vectorToString: t vector -> string end = struct open Pervasive.Word8 structure Z = FixWord (Pervasive.Word8) open Z val equals: t * t -> bool = op = fun vectorToString v = CharVector.tabulate (Pervasive.Vector.length v, fn i => toChar (Pervasive.Vector.sub (v, i))) fun stringToVector s = Pervasive.Vector.tabulate (Pervasive.String.size s, fn i => fromChar (Pervasive.String.sub (s, i))) end mlton-20100608/lib/mlton/directed-graph/0000755000076600000240000000000011404470407016341 5ustar mtfstaffmlton-20100608/lib/mlton/directed-graph/classify-edges.fun0000644000076600000240000000216711404435636021770 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*--------------------------------------------------------*) (* Classify Edges *) (*--------------------------------------------------------*) fun classifyEdges g {discover: Node.t -> int, finish: Node.t -> int} = let val cs = {tree = ref [], cross = ref [], back = ref [], forward = ref []} fun classify e = let val n = E.tail e val n' = E.head e in if discover n' > discover n then #forward cs else if finish n' = ~1 then #back cs else #cross cs end in (cs, P.T{handleTreeEdge = LU.push (#tree cs), handleNonTreeEdge = fn e => LU.push (classify e) e, startNode = P.ignore, finishNode = P.ignore, startTree = P.ignore, finishTree = P.ignore, finishDfs = P.ignore}) end mlton-20100608/lib/mlton/directed-graph/classify-edges.sig0000644000076600000240000000101611404435636021752 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val classifyEdges: Graph.t -> {discover: Graph.Node.t -> int, finish: Graph.Node.t -> int} -> {tree: Graph.Edge.t list ref, forward: Graph.Edge.t list ref, back: Graph.Edge.t list ref, cross: Graph.Edge.t list ref} * Param.t mlton-20100608/lib/mlton/directed-graph/dijkstra.fun0000644000076600000240000000264311404435636020700 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Dijkstra (S : SHORTEST_PATH_STRUCTS): SHORTEST_PATH = struct open S structure Heap = FibonacciHeap (structure Key = Weight) structure Elt = Heap.Elt fun shortestPath {graph, weight, source} = let val {get: Node.t -> Node.t Heap.Elt.t option, set, destroy} = Property.destGetSetOnce (Node.plist, Property.initConst NONE) val elt = valOf o get fun distanceOption n = Option.map (get n, Elt.key) val distance = valOf o distanceOption val fringe: Node.t Heap.t = Heap.empty () fun addToFringe (n: Node.t, d: Weight.t): unit = set (n, SOME (Heap.insert (fringe, d, n))) fun relax (n: Node.t, e: Edge.t): unit = let val n' = Edge.to e val d = Weight.+ (distance n, weight e) in case distanceOption n' of NONE => addToFringe (n', d) | SOME d' => if Weight.< (d, d') then Heap.decreaseKey (fringe, elt n', d) else () end in addToFringe (source, Weight.zero) ; while not (Heap.isEmpty fringe) do let val n = Heap.deleteMin fringe in List.foreach (Node.successors n, fn e => relax (n, e)) end ; distanceOption end end mlton-20100608/lib/mlton/directed-graph/shortest-path-check.fun0000644000076600000240000000721311404435636022743 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ShortestPathCheck (S: SHORTEST_PATH_CHECK_STRUCTS): SHORTEST_PATH_CHECK = struct open S structure Answer = struct datatype t = Shortest | SourceNonZero | PredecessorReachable of Node.t * Edge.t | Relaxable of Node.t * Edge.t | NoPath of Node.t fun layout (a, layoutNode) = let open Layout in case a of Shortest => str "The distances are correct shortest path distances." | SourceNonZero => str "The distance to the source must be zero." | PredecessorReachable (n, e) => let val n = Node.layout n val n' = Node.layout (Edge.to e) in align [str "The distances are contradictory.", seq [str "1. There is an edge from ", n, str " to ", n'], seq [str "2. ", n, str " has a finite distancEdge."], seq [str "3. ", n', str " has an infinite distancEdge."]] end | NoPath n => seq [str "There is not a valid predecessor path from ", layoutNode n, str " to the sourcEdge."] | Relaxable (n, e) => let val n = layoutNode n val n' = layoutNode (Edge.to e) in align [str "The distances are not shortest path distances.", seq [str "The edge from ", n, str " to ", n', str " can be relaxed."]] end end end structure Set = DisjointSet fun check {graph, source, weight, distance} = case distance source of NONE => Answer.SourceNonZero | SOME d => if not (Weight.equals (Weight.zero, d)) then Answer.SourceNonZero else let exception Answer of Answer.t val {get = set, destroy, ...} = Property.destGet (Node.plist, Property.initFun (fn _ => Set.singleton ())) fun union (n, n') = Set.union (set n, set n') fun checkRelax (n, e) = let val n' = Edge.to e in case distance n of NONE => () | SOME d => case distance n' of NONE => raise Answer (Answer.PredecessorReachable (n, e)) | SOME d' => let val d'' = Weight.+ (d, weight e) in if Weight.< (d'', d') then raise Answer (Answer.Relaxable (n, e)) else if Weight.equals (d', d'') then union (n, n') else () end end val _ = foreachEdge (graph, checkRelax) val sourceSet = set source fun canReachSource n = let val equiv = Set.equals (set n, sourceSet) in case distance n of NONE => () | SOME _ => if equiv then () else raise Answer (Answer.NoPath n) end in (foreachNode (graph, canReachSource) ; Answer.Shortest) handle Answer a => a end end mlton-20100608/lib/mlton/directed-graph/shortest-path-check.sig0000644000076600000240000000161611404435636022736 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SHORTEST_PATH_CHECK_STRUCTS = sig include DIRECTED_GRAPH structure Weight: WEIGHT end signature SHORTEST_PATH_CHECK = sig include SHORTEST_PATH_CHECK_STRUCTS structure Answer: sig datatype t = Shortest | SourceNonZero | PredecessorReachable of Node.t * Edge.t | Relaxable of Node.t * Edge.t | NoPath of Node.t val layout: t * (Node.t -> Layout.t) -> Layout.t end val check: {graph: t, source: Node.t, weight: Edge.t -> Weight.t, distance: Node.t -> Weight.t option} -> Answer.t end mlton-20100608/lib/mlton/directed-graph/shortest-path.sig0000644000076600000240000000105111404435636021654 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SHORTEST_PATH_STRUCTS = sig include DIRECTED_GRAPH structure Weight: WEIGHT end signature SHORTEST_PATH = sig include SHORTEST_PATH_STRUCTS val shortestPath: {graph: t, weight: Edge.t -> Weight.t, source: Node.t} -> Node.t -> Weight.t option end mlton-20100608/lib/mlton/directed-graph/sources.cm0000644000076600000240000000073711404435636020361 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library functor Dijkstra is ../basic/sources.cm ../heap/sources.cm ../set/sources.cm weight.sig shortest-path-check.sig shortest-path-check.fun shortest-path.sig dijkstra.fun # if ( defined(SMLNJ_VERSION) ) test.sml # endif mlton-20100608/lib/mlton/directed-graph/test.sml0000644000076600000240000000042111404435636020037 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Z = TestDirectedGraph (DirectedGraph) structure Z = struct end mlton-20100608/lib/mlton/directed-graph/weight.sig0000644000076600000240000000056311404435636020345 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature WEIGHT = sig include BOUNDED_ORDER val zero : t val + : t * t -> t val input : In.t -> t val output : t * Out.t -> unit end mlton-20100608/lib/mlton/env/0000755000076600000240000000000011404470407014247 5ustar mtfstaffmlton-20100608/lib/mlton/env/array-finite-function.fun0000644000076600000240000000317611404435636021212 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ArrayFiniteFunction(): ARRAY_FINITE_FUNCTION = struct structure Domain = struct type 'a t = {size: int, fromInt: int -> 'a, toInt: 'a -> int} fun pair({size, fromInt, toInt}: 'a1 t, {size=size', fromInt=fromInt', toInt=toInt'}: 'a2 t, inj: 'a1 -> 'a, inj': 'a2 -> 'a, out: 'a * ('a1 -> int) * ('a2 -> int) -> int) = {size = size + size', toInt = fn d => out(d, toInt, fn d' => size + toInt' d'), fromInt = fn n => if n < size then inj(fromInt n) else inj'(fromInt'(n - size))} end datatype ('a, 'b) t = T of {domain: 'a Domain.t, array: 'b Array.t} fun empty(domain: 'a Domain.t) = T{domain = domain, array = Array.new(#size domain, NONE)} fun new(domain: 'a Domain.t, x) = T{domain = domain, array = Array.new(#size domain, x)} fun tabulate(domain as {size, fromInt, ...}: 'a Domain.t, f) = T{domain = domain, array = Array.tabulate(size, f o fromInt)} fun size(T{domain={size, ...}, ...}) = size fun lookup(T{domain={toInt, ...}, array}, x) = Array.sub(array, toInt x) fun foreach(T{domain={fromInt, ...}, array}, f) = Array.foreachIndex(array, fn (i, x) => f(fromInt i, x)) fun set(T{domain={toInt, ...}, array}, x, y) = Array.update(array, toInt x, y) fun toFunction f a = lookup(f, a) end structure ArrayFiniteFunction = ArrayFiniteFunction() mlton-20100608/lib/mlton/env/array-finite-function.sig0000644000076600000240000000146211404435636021200 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ARRAY_FINITE_FUNCTION = sig include FINITE_FUNCTION structure Domain : sig type 'a t = {size: int, fromInt: int -> 'a, toInt: 'a -> int} val pair: 'a1 t * 'a2 t * ('a1 -> 'a) * ('a2 -> 'a) * (('a * ('a1 -> int) * ('a2 -> int)) -> int) -> 'a t end val empty: 'a Domain.t -> ('a, 'b option) t val new: 'a Domain.t * 'b -> ('a, 'b) t val tabulate: 'a Domain.t * ('a -> 'b) -> ('a, 'b) t val set: ('a, 'b) t * 'a * 'b -> unit end mlton-20100608/lib/mlton/env/basic-env-to-env.fun0000644000076600000240000000414011404435636020042 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor BasicEnvToEnv(S: BASIC_MONO_ENV): MONO_ENV = struct open S val isEmpty = List.isEmpty o toList fun layout e = let open Layout in seq[str "[", align(List.map(toList e, fn (d, r) => seq[Domain.layout d, str " -> ", Range.layout r])), str"]"] end val size = List.length o toList val empty = fromList [] fun domain e = List.revMap (toList e, #1) fun single(d, r) = extend(empty, d, r) fun new (ds, f) = fromList (List.map (ds, fn d => (d, f d))) fun map (e, f) = fromList (List.map (toList e, fn (d, r) => (d, f r))) fun mapi (e, f) = fromList (List.map(toList e, fn (d, r) => (d, f(d, r)))) fun env + env' = List.fold (toList env', env, fn ((d, r), env) => extend (env, d, r)) fun plus es = List.fold(es, empty, fn (e, accum) => accum + e) val plus = Trace.trace("BasicEnvToEnv.plus", List.layout layout, layout) plus fun remove(env, d) = fromList(List.remove(toList env, fn (d', _) => Domain.equals(d, d'))) fun lookup(env, d) = case peek(env, d) of SOME r => r | NONE => (Layout.output(Domain.layout d, Out.error) ; Out.newline Out.error ; Error.bug "BasicEnvToEnv.lookup") fun restrict(env, ds) = new(ds, fn d => lookup(env, d)) fun multiExtend(env, ds, rs) = case (ds, rs) of ([], []) => env | (d :: ds, r :: rs) => multiExtend(extend(env, d, r), ds, rs) | _ => Error.bug "BasicEnvToEnv.multiExtend" fun fold(e, b, f) = List.fold(toList e, b, fn ((_, r), b) => f(r, b)) fun foldi(e, b, f) = List.fold(toList e, b, fn ((d, r), b) => f(d, r, b)) fun foreach(e, f) = List.foreach(toList e, f o #2) fun foreachi(e, f) = List.foreach(toList e, f) fun foralli(e, f) = List.forall(toList e, f) val equals = fn (e1, e2) => size e1 = size e2 andalso foralli(e1, fn (d, r) => case peek(e2, d) of NONE => false | SOME r' => Range.equals(r, r')) end mlton-20100608/lib/mlton/env/cache.fun0000644000076600000240000000057011404435636016033 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Cache(Domain: T): CACHE = struct structure Domain = Domain open PolyCache type 'a t = (Domain.t, 'a) t fun new() = PolyCache.new{equal = Domain.equals} end mlton-20100608/lib/mlton/env/cache.sig0000644000076600000240000000076411404435636016032 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CACHE = sig structure Domain: T type 'a t val new: unit -> 'a t val peek: 'a t * Domain.t -> 'a option val addNew: 'a t * Domain.t * 'a -> unit val getOrAdd: 'a t * Domain.t * (unit -> 'a) -> 'a val toList: 'a t -> (Domain.t * 'a) list end mlton-20100608/lib/mlton/env/finite-function.fun0000644000076600000240000000412711404435636020073 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Env *) (*-------------------------------------------------------------------*) functor Env(D: T): ENV = struct structure D = D structure L = List datatype 'a t = T of (D.t * 'a) L.t fun empty() = T(L.empty()) fun isEmpty(T l) = L.isEmpty l fun equal d (d', _) = D.equals(d, d') fun singleton dr = T(L.single dr) fun add(T l, d, r) = T((d, r) :: (L.maybeRemoveFirst(l, equal d))) fun peek(T l, d) = case L.keepFirst(l, equal d) of NONE => NONE | SOME (_, r) => SOME r fun lookup ed = case peek ed of SOME r => r | NONE => Error.error "Env.lookup" fun dom(T l) = L.map(l, #1) fun range(T l) = L.map(l, #2) fun remove(T ps, d) = T(L.removeFirst(ps, equal d)) fun foldl(T l, b, f) = L.foldl(l, b, fn (b, (d, r)) => f(b, d, r)) fun e + e' = foldl(e', e, add) fun foreach(T ps, f) = L.foreach(ps, f) fun multiExtend(env, [], []) = env | multiExtend(env, d :: ds, r :: rs) = multiExtend(extend(env, d, r), ds, rs) | multiExtend _ = Error.error "Env.multiExtend" fun merge(e as T p, e' as T p', f) = let val leftAndBoth = L.map(p, fn (d, r) => case peek(e', d) of NONE => (d, r) | SOME r' => (d, f(r, r'))) val right = L.keepAll(p', fn (d, _) => case peek(e, d) of NONE => true | SOME _ => false) in T(leftAndBoth @ right) end fun output(T ps, outputR, out) = let val print = Out.outputc out fun outputDR((d, r), out) = (D.output(d, out) ; print "->" ; outputR(r, out)) in (print "[" ; L.output(ps, ", ", outputDR, out) ; print "]") end end mlton-20100608/lib/mlton/env/finite-function.sig0000644000076600000240000000074611404435636020070 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FINITE_FUNCTION = sig type ('a, 'b) t val foreach: ('a, 'b) t * ('a * 'b -> unit) -> unit val lookup: ('a, 'b) t * 'a -> 'b val size: ('a, 'b) t -> int val toFunction: ('a, 'b) t -> 'a -> 'b end mlton-20100608/lib/mlton/env/mono-env.fun0000644000076600000240000000212511404435636016524 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MakeMonoEnv(S: sig structure Env: ENV structure Range: T end): MONO_ENV = struct open S open Env type t = Range.t t val empty: t = empty() val equals = equals Range.equals val layout = layout Range.layout end (* THIS ISN'T HERE BECAUSE (no surprise) there is an NJ BUG functor MonoEnv(S: MONO_ENV_STRUCTS): MONO_ENV = MakeMonoEnv(structure Env = Env(S) structure Range = S.Range) *) functor MonoEnv(S: MONO_ENV_STRUCTS): MONO_ENV = BasicEnvToEnv (open S datatype t = T of (Domain.t * Range.t) List.t val fromList = T fun toList(T l) = l fun equalTo d (d', _) = Domain.equals(d, d') fun extend(T drs, d, r) = T(List.cons((d, r), List.remove(drs, equalTo d))) fun peek(T l, d) = case List.peek(l, equalTo d) of NONE => NONE | SOME (_, r) => SOME r ) mlton-20100608/lib/mlton/env/mono-env.sig0000644000076600000240000000275311404435636016525 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MONO_ENV_STRUCTS = sig structure Domain: T structure Range: T end signature BASIC_MONO_ENV = sig include MONO_ENV_STRUCTS type t val extend: t * Domain.t * Range.t -> t val fromList: (Domain.t * Range.t) list -> t val peek: t * Domain.t -> Range.t option val toList: t -> (Domain.t * Range.t) list end signature MONO_ENV = sig include BASIC_MONO_ENV val + : t * t -> t val domain: t -> Domain.t list val empty: t val equals: t * t -> bool val fold: t * 'a * (Range.t * 'a -> 'a) -> 'a val foldi: t * 'a * (Domain.t * Range.t * 'a -> 'a) -> 'a val foreach: t * (Range.t -> unit) -> unit val foreachi: t * (Domain.t * Range.t -> unit) -> unit val isEmpty: t -> bool val layout: t -> Layout.t val lookup: t * Domain.t -> Range.t val map: t * (Range.t -> Range.t) -> t val mapi: t * (Domain.t * Range.t -> Range.t) -> t val multiExtend: t * Domain.t list * Range.t list -> t val new: Domain.t list * (Domain.t -> Range.t) -> t val plus: t list -> t val remove: t * Domain.t -> t val restrict: t * Domain.t list -> t val single: Domain.t * Range.t -> t val size: t -> int end mlton-20100608/lib/mlton/env/move-to-front.fun0000644000076600000240000000200011404435636017472 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MoveToFrontEnv(S: MONO_ENV_STRUCTS): MONO_ENV = BasicEnvToEnv (open S datatype t = T of (Domain.t * Range.t) list ref val fromList = T o ref fun toList(T(ref drs)) = drs fun extend(T(ref drs), d, r) = T(ref((d, r) :: (* poor man's profiling *) let fun f() = List.remove(drs, fn (d', _) => Domain.equals(d, d')) in (*f() ;*) f() end)) fun peek(T reff, d) = let fun loop(drs, accum) = case drs of (d', r) :: drs => if Domain.equals(d, d') then (reff := (d, r) :: List.appendRev(accum, drs) ; SOME r) else loop(drs, (d', r) :: accum) | [] => NONE (* poor man's profiling *) fun f() = loop(!reff, []) in (*f() ;*) f() end) mlton-20100608/lib/mlton/env/poly-cache-ref.fun0000644000076600000240000000220711404435636017565 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PolyCache(): POLY_CACHE = struct datatype ('a, 'b) t = T of {equal: ('a * 'a) -> bool, elts: ('a * 'b ref) list ref} fun fromList fun new equal = T{equal = equal, elts = ref []} fun all(T{elts, ...}) = List.map(!elts, fn (x, y) => (x, !y)) fun peekR(T{equal, elts = ref l}, x) = case List.keepFirst(l, fn (x', _) => equal(x, x')) of NONE => NONE | SOME(_, y) => SOME y fun peek(c, x) = case peekR(c, x) of NONE => NONE | SOME r => SOME(!r) fun lookup cx = Option.project(peek cx) fun addNew(T{elts = r as ref l, ...}, x, y) = r := (x, ref y) :: l fun set(c, x, y) = case peekR(c, x) of NONE => addNew(c, x, y) | SOME r => r := y fun getOrAdd(c, x, th) = case peek(c, x) of NONE => let val y = th() in addNew(c, x, y) ; y end | SOME y => y fun eq(T{elts=r, ...}, T{elts=r', ...}) = r = r' end structure PolyCache = PolyCache() mlton-20100608/lib/mlton/env/poly-cache.fun0000644000076600000240000000211111404435636017005 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PolyCache(): POLY_CACHE = struct datatype ('a, 'b) t = T of {equal: ('a * 'a) -> bool, elts: ('a * 'b) list ref} fun fromList{equal, elements} = T{equal = equal, elts = ref elements} fun new{equal} = T{equal = equal, elts = ref []} fun toList(T{elts, ...}) = !elts fun size c = List.length(toList c) fun foreach(c, f) = List.foreach(toList c, f) fun peek(T{equal, elts = ref l}, x) = case List.peek(l, fn (x', _) => equal(x, x')) of NONE => NONE | SOME(_, y) => SOME y fun lookup cx = valOf(peek cx) fun toFunction c a = lookup(c, a) fun addNew(T{elts = r as ref l, ...}, x, y) = r := (x, y) :: l fun getOrAdd(c, x, th) = case peek(c, x) of NONE => let val y = th() in addNew(c, x, y) ; y end | SOME y => y fun eq(T{elts=r, ...}, T{elts=r', ...}) = r = r' end structure PolyCache = PolyCache() mlton-20100608/lib/mlton/env/poly-cache.sig0000644000076600000240000000121211404435636017000 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature POLY_CACHE = sig include FINITE_FUNCTION val addNew: ('a, 'b) t * 'a * 'b -> unit val eq: ('a, 'b) t * ('a, 'b) t -> bool val fromList: {equal: 'a * 'a -> bool, elements: ('a * 'b) list} -> ('a, 'b) t val getOrAdd: ('a, 'b) t * 'a * (unit -> 'b) -> 'b val new: {equal: 'a * 'a -> bool} -> ('a, 'b) t val peek: ('a, 'b) t * 'a -> 'b option val toList: ('a, 'b) t -> ('a * 'b) list end mlton-20100608/lib/mlton/env/sources.cm0000644000076600000240000000122111404435636016254 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library signature ENV signature MONO_ENV signature POLY_CACHE structure PolyCache functor Cache functor MakeMonoEnv functor MonoEnv functor MoveToFrontEnv (* functor SplayMonoEnv *) is ../basic/sources.cm mono-env.sig basic-env-to-env.fun mono-env.fun finite-function.sig poly-cache.sig poly-cache.fun #if (defined (SMLNJ_VERSION)) move-to-front.fun (* splay-env.fun *) cache.sig cache.fun #endif mlton-20100608/lib/mlton/env/sources.mlb0000644000076600000240000000126011404435636016432 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused false" "forceUsed" in local $(SML_LIB)/basis/basis.mlb ../basic/sources.mlb mono-env.sig basic-env-to-env.fun mono-env.fun finite-function.sig poly-cache.sig poly-cache.fun in signature ENV signature MONO_ENV signature POLY_CACHE structure PolyCache functor MakeMonoEnv functor MonoEnv end end mlton-20100608/lib/mlton/env/splay-env.fun0000644000076600000240000000130411404435636016702 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ORDER_ENV_STRUCTS = sig structure Domain: ORDER structure Range: T end functor SplayMonoEnv(S:ORDER_ENV_STRUCTS): MONO_ENV = BasicEnvToEnv (open S structure E = SplayMapFn(type ord_key = Domain.t val compare = Domain.compare) type t = Range.t E.map fun extend(env, d, r) = E.insert(env, d, r) fun fromList l = List.fold(l, E.empty, fn ((d, r), env) => extend(env, d, r)) val toList = E.listItemsi val peek = E.find) mlton-20100608/lib/mlton/heap/0000755000076600000240000000000011404470407014374 5ustar mtfstaffmlton-20100608/lib/mlton/heap/binary.fun0000644000076600000240000000745111404435636016406 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor BinaryHeap (Key: BOUNDED_ORDER): HEAP = struct structure Array = ResizableArray structure Key = Key (*--------------------------------------------------------*) (* Element *) (*--------------------------------------------------------*) structure Element = struct datatype 'a t = T of {key: Key.t ref, value: 'a, index: int ref} fun new(k, v, i) = T{key = ref k, value = v, index = ref i} fun key(T{key, ...}) = !key fun setKey(T{key, ...}, k) = key := k fun value (T{value, ...}) = value fun index (T{index, ...}) = !index fun setIndex(T{index, ...}, i) = index := i end structure Elt = Element (*--------------------------------------------------------*) (* Heap *) (*--------------------------------------------------------*) datatype 'a t = T of 'a Elt.t Array.t fun empty() = T (Array.fromList []) fun fixIndex(a, i) = Elt.setIndex(Array.sub(a, i), i) fun swap(a, i, j) = (Array.swap(a, i, j) ; fixIndex(a, i) ; fixIndex(a, j)) fun isEmpty (T a) = Array.length a = 0 fun parent(i: int) = (i - 1) div 2 fun left(i: int) = 2 * i + 1 fun right(i: int) = 2 * i + 2 fun key(a, i) = Elt.key(Array.sub(a, i)) fun keyOption(a, i) = Option.map(Array.subOption(a, i), Elt.key ) fun siftUp(a, i) = let fun siftUp i = if i = 0 then () else let val p = parent i in if Key.<(key(a, i), key(a, p)) then (swap(a, i, p); siftUp p) else () end in siftUp i end fun siftDown(a, i) = let fun siftDown i = let val l = left i val r = right i in case keyOption(a, l) of NONE => () | SOME kl => let val min = (case keyOption(a, r) of NONE => l | SOME kr => if Key.<(kl, kr) then l else r) in if Key.<(key(a, i), key(a, min)) then () else (swap(a, i, min); siftDown min) end end in siftDown i end fun new es = let val a = Array.fromList (List.mapi (es, fn (i, (k, v)) => Elt.new (k, v, i))) val start = (Array.length a) div 2 in Int.forDown (start, 0, fn i => siftDown (a, i)) ; T a end fun isEmpty (T a) = Array.length a = 0 fun foreach(T a, f) = Array.foreach(a, f) fun insert(T a, k, v) = let val i = Array.length a val e = Elt.new(k, v, i) in Array.addToEnd(a, e) ; siftUp(a, i) ; e end fun min (h as (T a)) = if isEmpty h then Error.bug "min" else Array.sub(a, 0) fun deleteMin (h as (T a)) = if isEmpty h then Error.bug "deleteMin" else Elt.value (if Array.length a = 1 then Array.deleteLast a else let val min = Array.sub(a, 0) in Array.update(a, 0, Array.deleteLast a) ; fixIndex(a, 0) ; siftDown(a, 0) ; min end) fun decreaseKey(T a, e, k) = if Key.<(Elt.key e, k) then Error.bug "decreaseKey" else (Elt.setKey(e, k); siftUp(a, Elt.index e)) fun delete(h, e) = (decreaseKey(h, e, Key.smallest); deleteMin h; ()) fun union(h, h') = foreach(h', fn e => (insert(h, Elt.key e, Elt.value e); ())) end mlton-20100608/lib/mlton/heap/binomial.fun0000644000076600000240000000131711404435636016707 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor EagerBinomialHeap(S: HEAP_STRUCTS): HEAP = struct open S structure Heap = ForestHeap(structure Key = Key) open Heap val new = newEager val insert = insertEager val decreaseKey = decreaseKeySift val delete = deleteSift val union = unionEager end functor LazyBinomialHeap(S: HEAP_STRUCTS): HEAP = struct open S structure Heap = ForestHeap(structure Key = Key) open Heap val new = newLazy val insert = insertLazy val decreaseKey = decreaseKeySift val delete = deleteSift val union = unionLazy end mlton-20100608/lib/mlton/heap/fibonacci.fun0000644000076600000240000000066211404435636017034 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor FibonacciHeap(S: HEAP_STRUCTS): HEAP = struct open S structure Heap = ForestHeap(S) open Heap val new = newLazy val insert = insertLazy val decreaseKey = decreaseKeyCut val delete = deleteCut val union = unionLazy end mlton-20100608/lib/mlton/heap/forest.fun0000644000076600000240000002307211404435636016421 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Forest of heap ordered trees. * Can be specialized to eager or lazy binomial heaps, fibonacci heaps. *) functor ForestHeap (S: FOREST_HEAP_STRUCTS): FOREST_HEAP = struct open S structure Elt = struct (* Can't make child a circular list, because the elements aren't defined yet. *) datatype 'a t = T of {value: 'a Pointer.t, mark: bool ref, parent: 'a t Pointer.t, next: 'a t Pointer.t, prev: 'a t Pointer.t, child: 'a t Pointer.t, numChildren: int ref} fun destruct(T{prev, value, next, ...}) = (prev, Pointer.! value, next) fun make p = T{value = p, mark = ref false, parent = Pointer.null(), next = Pointer.null(), prev = Pointer.null(), child = Pointer.null(), numChildren = ref 0} fun new v = make(Pointer.new v) fun dummy v = make(Pointer.null()) fun valuePtr(T{value, ...}) = value fun value e = Pointer.!(valuePtr e) fun mark(T{mark, ...}) = mark := true fun unMark(T{mark, ...}) = mark := false fun isMarked(T{mark, ...}) = !mark fun parent(T{parent, ...}) = Pointer.! parent fun hasParent(T{parent, ...}) = not(Pointer.isNull parent) fun setParent(T{parent, ...}, p) = Pointer.:=(parent, p) fun clearParent(T{parent, ...}) = Pointer.clear parent fun next(T{next, ...}) = next fun prev(T{prev, ...}) = prev fun child(T{child, ...}) = child fun numChildrenRef(T{numChildren, ...}) = numChildren fun numChildren e = !(numChildrenRef e) fun incNumChildren e = Int.inc(numChildrenRef e) fun decNumChildren e = Int.dec(numChildrenRef e) val equals = fn (e, e') => Pointer.eq(valuePtr e, valuePtr e') end structure CircList = CircularList(structure Elt = DoublyLinked(Elt)) structure Elt = struct open Elt type 'a t = (Key.t * 'a) Elt.t fun key(e: 'a t) = #1(value e) fun value(e: 'a t) = #2(Elt.value e) fun setKey(e, k) = Pointer.:=(valuePtr e, (k, value e)) fun siftUp e = if hasParent e then let val p = parent e in if Key.<(key e, key p) then (Pointer.swap(valuePtr e, valuePtr p) ; siftUp p) else () end else () end (*--------------------------------------------------------*) (* Heap Datatype *) (*--------------------------------------------------------*) datatype 'a t = T of {size: int ref, roots: (Key.t * 'a) CircList.t, min: 'a Elt.t Pointer.t} fun sizeRef (T{size, ...}) = size fun size h = !(sizeRef h) fun setSize(h,n) = sizeRef h := n fun incSize h = Int.inc(sizeRef h) fun decSize h = Int.inc(sizeRef h) fun roots (T{roots, ...}) = roots fun min(T{min, ...}) = Pointer.! min fun clearMin(T{min, ...}) = Pointer.clear min fun updateMin(T{min, ...}, e) = if Pointer.isNull min orelse Key.<(Elt.key e, Elt.key(Pointer.!min)) then Pointer.:=(min, e) else () fun addRoot(h, e) = (CircList.insert(roots h, e) ; updateMin(h, e)) fun isEmpty h = size h = 0 local fun linkPC(parent, child) = (Elt.incNumChildren parent ; CircList.insert(Elt.child parent, child) ; Elt.setParent(Elt.parent child, parent) ; Elt.unMark child ; parent) in fun link(e, e') = (* pre: numChildren e = numChildren e' *) if Key.<(Elt.key e, Elt.key e') then linkPC(e, e') else linkPC(e', e) end fun unlink e = let val p = Elt.parent e in Elt.decNumChildren p ; CircList.delete(Elt.child p, e) ; Elt.clearParent e ; Elt.unMark e end local structure I = Int local open Real in val phi = (1.0 + (Real.sqrt 5.0)) / 2.0 fun maxNumChildren h = floor(log(phi, fromInt(size h))) end in fun consolidate h = (clearMin h ; if size h = 0 then () else let val a = Array.new(maxNumChildren h + 1, NONE) fun insertIntoA e = let val n = Elt.numChildren e in case Array.sub(a,n) of NONE => Array.update(a,n, SOME e) | SOME e' => (Array.update(a,n, NONE) ; insertIntoA(link(e, e'))) end in CircList.deleteEach(roots h, insertIntoA) ; Array.foreach(a, fn NONE => () | SOME e => addRoot(h, e)) end) end (*--------------------------------------------------------*) (* Constructors: empty, insert, new *) (*--------------------------------------------------------*) fun empty() = T{size = ref 0, roots = CircList.empty(), min = Pointer.null()} fun insertLazy(h, k, v) = let val e = Elt.new(k, v) in (incSize h ; addRoot(h, e) ; e) end fun insertEager(h, k, v) = let val e = insertLazy(h, k, v) in (consolidate h ; e) end fun newLazy kvs = let val h = empty() in (List.foreach(kvs, fn (k, v) => (insertLazy(h, k, v) ; ())) ; h) end fun newEager kvs = let val h = newLazy kvs in (consolidate h ; h) end (*--------------------------------------------------------*) (* DeleteMin *) (*--------------------------------------------------------*) fun deleteMin h = let val m = min h val c = Elt.child m val rs = roots h in decSize h ; CircList.delete(rs, m) ; CircList.foreach(c, Elt.clearParent) ; CircList.splice(rs, c) ; consolidate h ; Elt.value m end (*--------------------------------------------------------*) (* DecreaseKey *) (*--------------------------------------------------------*) fun sift(_, e, _) = Elt.siftUp e fun cut(h, e, k) = if Elt.hasParent e andalso Key.<(k, Elt.key(Elt.parent e)) then let val rs = roots h fun cut e = if Elt.hasParent e then let val p = Elt.parent e in unlink e ; CircList.insert(rs, e) ; if Elt.isMarked p then cut p else Elt.mark p end else () in cut e end else () fun decreaseKey(h, e, k) = if Key.>(k, Elt.key e) then Error.bug "decreaseKey" else (Elt.setKey(e, k); updateMin(h, e)) fun decreaseKeySift(h, e, k) = (decreaseKey(h, e, k) ; sift(h, e, k)) fun decreaseKeyCut(h, e, k) = (decreaseKey(h, e, k) ; cut(h, e, k)) (*--------------------------------------------------------*) (* Delete *) (*--------------------------------------------------------*) fun delete(decreaseKey, h, e) = let val k = Elt.key e in decreaseKey(h, e, Key.smallest) ; deleteMin h ; Elt.setKey(e, k) end fun deleteSift(h, e) = delete(decreaseKeySift, h, e) fun deleteCut(h, e) = delete(decreaseKeyCut, h, e) (*--------------------------------------------------------*) (* Union *) (*--------------------------------------------------------*) fun union(h, h') = (setSize(h, size h + size h') ; CircList.splice(roots h, roots h')) fun unionEager(h, h') = (union(h, h'); consolidate h) fun unionLazy(h, h') = (union(h, h') ; updateMin(h, min h') handle Min => ()) (*--------------------------------------------------------*) (* Output *) (*--------------------------------------------------------*) fun output(heap, outputValue, out) = Error.unimplemented "output" (*--------------------------------------------------------*) (* Well-Formed Test *) (*--------------------------------------------------------*) (* local fun sizeInTree e = 1 + sizeInTrees (CircList.T (Elt.children e)) and sizeInTrees l = CircList.fold l 0 (fn (e,n) => n + sizeInTree e) fun sizeInHeap h = sizeInTrees (roots h) fun findMin h = let val min = ref NONE fun updateMin e = (case !min of NONE => min := SOME e | SOME e' => if Key.<(Elt.key e, Elt.key e') then min := SOME e else ()) in (CircList.foreach (roots h) updateMin ; case !min of SOME e => e | NONE => bug "findMin") end fun isTreeWellFormed e = let fun isChildWellFormed e' = (Elt.equals(e, Elt.parent e') andalso Key.<=(Elt.key e, Elt.key e') andalso isTreeWellFormed e') val cs = CircList.T (Elt.children e) in Elt.numChildren e = CircList.length cs andalso CircList.forall cs isChildWellFormed end in fun isFibonacciHeap h = CircList.forall (roots h) isTreeWellFormed andalso size h = sizeInHeap h andalso (isEmpty h orelse Key.equals(Elt.key (min h), Elt.key (findMin h))) end *) end mlton-20100608/lib/mlton/heap/forest.sig0000644000076600000240000000231211404435636016405 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FOREST_HEAP_STRUCTS = sig structure Key: BOUNDED_ORDER end signature FOREST_HEAP = sig include FOREST_HEAP_STRUCTS structure Elt: sig type 'a t val key: 'a t -> Key.t val value: 'a t -> 'a end type 'a t val empty: unit -> 'a t val insertLazy: 'a t * Key.t * 'a -> 'a Elt.t val insertEager: 'a t * Key.t * 'a -> 'a Elt.t val isEmpty: 'a t -> bool val deleteMin: 'a t -> 'a val decreaseKeySift: 'a t * 'a Elt.t * Key.t -> unit val decreaseKeyCut: 'a t * 'a Elt.t * Key.t -> unit val deleteSift: 'a t * 'a Elt.t -> unit val deleteCut: 'a t * 'a Elt.t -> unit val min: 'a t -> 'a Elt.t val newEager: (Key.t * 'a) list -> 'a t val newLazy: (Key.t * 'a) list -> 'a t (* unions second heap into first, destroys second heap *) val unionLazy: 'a t * 'a t -> unit val unionEager: 'a t * 'a t -> unit end mlton-20100608/lib/mlton/heap/heap.sig0000644000076600000240000000164711404435636016032 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature HEAP_STRUCTS = sig structure Key: BOUNDED_ORDER end signature HEAP = sig include HEAP_STRUCTS structure Elt: sig type 'a t val key: 'a t -> Key.t val value: 'a t -> 'a end type 'a t val decreaseKey: 'a t * 'a Elt.t * Key.t -> unit val delete: 'a t * 'a Elt.t -> unit val deleteMin: 'a t -> 'a val empty: unit -> 'a t val insert: 'a t * Key.t * 'a -> 'a Elt.t val isEmpty: 'a t -> bool val min: 'a t -> 'a Elt.t val new: (Key.t * 'a) list -> 'a t (* union(h, h') unions h' into h, destroying h'. *) val union: 'a t * 'a t -> unit end mlton-20100608/lib/mlton/heap/sources.cm0000644000076600000240000000067611404435636016416 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library functor BinaryHeap functor EagerBinomialHeap functor FibonacciHeap functor LazyBinomialHeap is ../basic/sources.cm heap.sig forest.sig forest.fun binomial.fun binary.fun fibonacci.fun mlton-20100608/lib/mlton/heap/test.sml0000644000076600000240000000362611404435636016104 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local structure H = BinaryHeap(structure O = Int open Int fun inject x = x fun project x = x val largest = Int.maxInt val smallest = Int.minInt) open H val h = new[(1, "1"), (2, "2"), (3, "3")] val _ = while not(isEmpty h) do (print(deleteMin h) ; print "\n") in end structure IntegerHeap = FibonacciHeap(structure Key' = Integer) open IntegerHeap ; fun p h = output h Integer.output print val h = new [(1, 1)] ; val w = isWellFormed h ; val _ = p h ; fun i n = insert h n n ; val _ = i 2 ; val _ = i 3 ; val h = new (ListUtil.reverse (ListUtil.map (ListUtil.fromTo 1 10) (fn x => (x, x)))) ; val _ = p h ; val w = isWellFormed h ; val a = min h ; val a = deleteMin h ; val b = deleteMin h ; val c = deleteMin h ; val l = ListUtil.map (ListUtil.fromTo 1 7) (fn _ => deleteMin h) ; isEmpty h ; insert h 100 100 ; isEmpty h ; min h ; ListUtil.foreach (ListUtil.fromTo 1 10) (fn i => (insert h (11 * i) (11 * i) ; ())) ; min h ; deleteMin h ; isEmpty h ; ListUtil.foreach (ListUtil.reverse (ListUtil.fromTo 1 1100)) (fn i => (insert h i i ; ())) ; ListUtil.foreach (ListUtil.fromTo 1 1098) (fn _ => (deleteMin h ; ())) ; insert h 11 11 ; val _ = p h ; val h: int t = new [] ; val elts = ListUtil.map (ListUtil.fromTo 0 9) (fn x => insert h x x) ; val _ = p h ; fun dc i = decreaseKey h (ListUtil.nth elts i) fun d i = delete h (ListUtil.nth elts i) val _ = dc 6 ~1 ; dc 7 0 ; val a = deleteMin h ; val _ = d 4 ; mlton-20100608/lib/mlton/Makefile0000644000076600000240000000044711404435636015131 0ustar mtfstaff## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../../bin/clean mlton-20100608/lib/mlton/pervasive/0000755000076600000240000000000011404470407015463 5ustar mtfstaffmlton-20100608/lib/mlton/pervasive/pervasive.sml0000644000076600000240000000663111404435636020217 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PERVASIVE_REAL = REAL signature PERVASIVE_WORD = WORD structure Pervasive = struct structure Array = Array structure Array2 = Array2 structure Bool = Bool structure Byte = Byte structure Char = Char structure CharArray = CharArray structure CharVector = CharVector structure CommandLine = CommandLine structure Date = Date structure General = General structure IEEEReal = IEEEReal structure Int = Int structure IntInf = IntInf structure LargeInt = LargeInt structure LargeReal = LargeReal structure LargeWord = LargeWord structure ListPair = ListPair structure List = List structure Math = Math structure Option = Option structure OS = OS structure PackReal32Little = PackReal32Little structure PackReal64Little = PackReal64Little structure PackWord32Little = PackWord32Little structure PackWord64Little = PackWord64Little structure Position = Position structure Posix = Posix structure Real = Real structure Real32 = Real32 structure Real64 = Real64 structure Socket = Socket structure String = String structure StringCvt = StringCvt structure Substring = Substring structure SysWord = SysWord structure TextIO = TextIO structure Time = Time structure Unix = Unix structure Vector = Vector structure Word = Word structure Word8 = Word8 structure Word8Array = Word8Array structure Word8Vector = Word8Vector structure Word32 = Word32 structure Word64 = Word64 type unit = General.unit type real = Real.real type char = Char.char type string = String.string type substring = Substring.substring type exn = General.exn type 'a array = 'a Array.array type 'a vector = 'a Vector.vector type 'a ref = 'a ref datatype bool = datatype bool datatype option = datatype option datatype order = datatype General.order datatype list = datatype list val ! = General.! val op := = General.:= val op @ = List.@ val op ^ = String.^ val app = List.app val op before = General.before val ceil = Real.ceil val chr = Char.chr val concat = String.concat val exnMessage = General.exnMessage val exnName = General.exnName val explode = String.explode val floor = Real.floor val foldl = List.foldl val foldr = List.foldr val getOpt = Option.getOpt val hd = List.hd val ignore = General.ignore val implode = String.implode val isSome = Option.isSome val length = List.length val map = List.map val not = Bool.not val null = List.null val op o = General.o val ord = Char.ord val print = TextIO.print val real = Real.fromInt val rev = List.rev val round = Real.round val size = String.size val str = String.str val substring = String.substring val tl = List.tl val trunc = Real.trunc val valOf = Option.valOf val vector = Vector.fromList end mlton-20100608/lib/mlton/pervasive/sources.cm0000644000076600000240000000072511404435636017500 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library signature PERVASIVE_REAL signature PERVASIVE_WORD structure Pervasive is #if (defined (SMLNJ_VERSION)) ../../stubs/basis-stubs-for-smlnj/sources.cm #endif pervasive.sml mlton-20100608/lib/mlton/pervasive/sources.mlb0000644000076600000240000000052311404435636017647 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local $(SML_LIB)/basis/basis.mlb pervasive.sml in signature PERVASIVE_REAL signature PERVASIVE_WORD structure Pervasive end mlton-20100608/lib/mlton/queue/0000755000076600000240000000000011404470407014603 5ustar mtfstaffmlton-20100608/lib/mlton/queue/append-reverse.fun0000644000076600000240000000467211404435636020253 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* AppendReverse *) (*-------------------------------------------------------------------*) functor LazyAppendReverse(): APPEND_REVERSE = struct structure L' = LazyListLength(LazyList) open L' structure L = L' end functor IncrementalAppendReverse(): APPEND_REVERSE = struct structure L' = LazyListLength(LazyList) open L' val appendReverse = L'.appendReverseIncremental structure L = L' end functor ExplicitAppendReverse(): APPEND_REVERSE = struct val {error, ...} = Error.errors("queue", "append-reverse") structure L = StrictList structure I = L.I datatype 'a t = List of 'a L.t | Cons of 'a * 'a t ref | Rot of 'a t * 'a L.t * 'a L.t fun empty() = List(L.empty()) fun destruct(List l) = (case L.destruct l of NONE => NONE | SOME(x, l) => SOME(x, List l)) | destruct(Cons(x, r)) = (force r ; SOME(x, !r)) | destruct _ = error "destruct" and force r = (case !r of Rot lra => r := rot lra | _ => ()) and rot(l, r, a) = (case (destruct l, L.destruct r) of (NONE, SOME(x, _)) => List(L.cons(x, a)) | (SOME(x, l), SOME(x', r)) => Cons(x, ref(Rot(l, r, L.cons(x', a)))) | _ => error "rot") fun appendReverse(l, r) = rot(l, r, L.empty()) fun isEmpty r = case destruct r of NONE => true | SOME _ => false fun length(List l) = L.length l | length(Rot(l, r, a)) = length l + L.length r + L.length a | length(Cons(x, ref r)) = length r + 1 fun output(r, sep, outElt, out) = let val print = Out.outputc out fun outputList l = L.output(l, sep, outElt, out) fun output(List l) = outputList l | output(Rot(l, r, a)) = (print "Rot(" ; output l ; print ", [" ; outputList r ; print "], " ; outputList a ; print ")") | output(Cons(x, ref r)) = (outElt(x, out) ; print sep ; output r) in output r end end mlton-20100608/lib/mlton/queue/append-reverse.sig0000644000076600000240000000100511404435636020230 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature APPEND_REVERSE = sig structure L: LIST structure I: INTEGER sharing L.I = I type 'a t val empty: unit -> 'a t val isEmpty: 'a t -> bool val length: 'a t -> I.t val destruct: 'a t -> ('a * 'a t) option val appendReverse: 'a t * 'a L.t -> 'a t end mlton-20100608/lib/mlton/queue/basic-persistent.sig0000644000076600000240000000063211404435636020574 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BASIC_PERSISTENT_QUEUE = sig type 'a t val empty: unit -> 'a t val isEmpty: 'a t -> bool val destruct: 'a t -> ('a * 'a t) option val enque: 'a t * 'a -> 'a t end mlton-20100608/lib/mlton/queue/bounded-ephemeral.sig0000644000076600000240000000065611404435636020703 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BOUNDED_EPHEMERAL_QUEUE = sig include EPHEMERAL_QUEUE structure I: INTEGER val empty: I.t -> '1a t val size: 'a t -> I.t val maxSize: '1a t -> I.t val isFull: '1a t -> bool end mlton-20100608/lib/mlton/queue/circular.fun0000644000076600000240000000356711404435636017141 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* CircularQueue *) (*-------------------------------------------------------------------*) functor CircularQueue(): BOUNDED_EPHEMERAL_QUEUE = struct structure A = Array1D structure I = A.I open I datatype 'a t = T of {size: I.t ref, elts: 'a option A.t, front: I.t ref, back: I.t ref} fun sizeRef(T{size=s, ...}) = s fun incSize(T{size=s, ...}) = s := add1(!s) fun decSize(T{size=s, ...}) = s := sub1(!s) fun size d = !(sizeRef d) fun elts(T{elts=e, ...}) = e fun frontRef(T{front=f, ...}) = f fun backRef(T{back=b, ...}) = b fun maxSize d = A.size(elts d) fun empty maxSize = T{size = ref zero, elts = A.new(maxSize, NONE), front = ref zero, back = ref zero} fun isEmpty d = isZero(size d) fun isFull d = size d = maxSize d fun inc(q, r) = let val r = r q in r := add1(!r) mod maxSize q end fun incFront q = inc(q, frontRef) fun incBack q = inc(q, backRef) exception Enque fun enque(q as T{size, elts, front, back}, x) = if isFull q then raise Enque else (if isEmpty q then (front := zero ; back := zero) else (incBack q ; incSize q ; A.update(elts, !back, SOME x))) exception Deque fun deque(q as T{size, elts, front, ...}) = if isEmpty q then raise Deque else case A.sub(elts, !front) of NONE => raise Deque | SOME x => (incFront q ; decSize q ; x) end structure CircularQueue = CircularQueue() mlton-20100608/lib/mlton/queue/early.fun0000644000076600000240000000173011404435636016437 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* EarlyQueue *) (*-------------------------------------------------------------------*) (* Error. on Okasaki93, Okasaki96 *) (* reverses tail before it is needed *) functor EarlyQueue(AR: APPEND_REVERSE): BASIC_PERSISTENT_QUEUE = struct structure L = AR.L open L.I datatype 'a t = T of 'a AR.t * 'a L.t fun queue(l, r) = if AR.length l >= L.length r then T(l, r) else T(AR.appendReverse(l, r), L.empty()) fun empty() = T(AR.empty(), L.empty()) fun isEmpty(T(l, _)) = AR.isEmpty l fun destruct(T(l, r)) = case AR.destruct l of NONE => NONE | SOME(x, l) => SOME(x, queue(l, r)) fun enque(T(l, r), x) = queue(l, L.cons(x, r)) end mlton-20100608/lib/mlton/queue/ephemeral.fun0000644000076600000240000000226011404435636017264 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Queue Ephemeral *) (*-------------------------------------------------------------------*) functor QueueEphemeral(): BASIC_QUEUE = struct val {error, ...} = Error.errors("queue", "ephemeral") structure L = MutableList datatype 'a t = T of {head: 'a L.t ref, tail: 'a L.t ref} fun destruct(q as T{head, tail}) = case L.destruct(!head) of NONE => NONE | SOME(x, _) => (if L.eqTail(!head, !tail) then (head := L.empty() ; tail := L.empty()) else head := L.tail(!head) ; SOME(x, q)) fun empty() = T{head = ref(L.empty()), tail = ref(L.empty())} fun isEmpty(T{head, ...}) = L.isEmpty(!head) fun enque(q as T{head, tail}, x) = (let val cell = L.cons(x, L.empty()) in (if isEmpty q then head := cell else L.setTail(!tail, cell) ; tail := cell) end ; q) end mlton-20100608/lib/mlton/queue/ephemeral.sig0000644000076600000240000000054111404435636017256 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature EPHEMERAL_QUEUE = sig type 'a t val isEmpty: 'a t -> bool val enque: 'a t * 'a -> unit val deque: 'a t -> 'a end mlton-20100608/lib/mlton/queue/explicit-append-reverse.fun0000644000076600000240000000370311404435636022064 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ExplicitAppendReverse(): APPEND_REVERSE = struct structure L = StrictList structure I = L.I datatype 'a t = List of 'a L.t | Cons of 'a * 'a t ref | Rotated of 'a t * 'a L.t * 'a L.t fun empty() = List(L.empty()) exception Destruct and Rotate fun destruct(List l) = (case L.destruct l of NONE => NONE | SOME(x, l) => SOME(x, List l)) | destruct(Cons(x, r)) = (force r ; SOME(x, !r)) | destruct _ = raise Destruct and force r = (case !r of Rotated lra => r := rotate lra | _ => ()) and rotate(l, r, a) = (case (destruct l, L.destruct r) of (NONE, SOME(x, _)) => List(L.cons(x, a)) | (SOME(x, l), SOME(x', r)) => Cons(x, ref(Rotated(l, r, L.cons(x', a)))) | _ => raise Rotate) fun appendReverse(l, r) = rotate(l, r, L.empty()) fun isEmpty r = case destruct r of NONE => true | SOME _ => false fun length(List l) = L.length l | length(Rotated(l, r, a)) = length l + L.length r + L.length a | length(Cons(x, ref r)) = length r + 1 fun output(r, sep, outElt, out) = let val print = Out.outputc out fun outputList l = L.output(sep, outElt)(l, out) fun output(List l) = outputList l | output(Rotated(l, r, a)) = (print "Rotated(" ; output l ; print ", [" ; outputList r ; print "], " ; outputList a ; print ")") | output(Cons(x, ref r)) = (outElt(x, out) ; print sep ; output r) in output r end end mlton-20100608/lib/mlton/queue/incremental-append-reverse.fun0000644000076600000240000000125711404435636022546 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor IncrementalAppendReverse(): APPEND_REVERSE = struct structure L' = LazyListLength(LazyList) open L' val appendReverse = L'.appendReverseIncremental structure L = L' end structure IncrementalAppendReverse = IncrementalAppendReverse() (* figure 3 of Okasaki93 *) structure QueueWorstCaseLog = PersistentQueue(EarlyQueue(IncrementalAppendReverse)) (* figure 4 of Okasaki93 *) structure QueueWorstCaseConst = PersistentQueue(IncrementalQueue(IncrementalAppendReverse)) mlton-20100608/lib/mlton/queue/incremental.fun0000644000076600000240000000230711404435636017625 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* IncrementalQueue *) (*-------------------------------------------------------------------*) (* Error. on Okasaki93 *) (* reverses tail before it is needed and walks down list incrementally *) functor IncrementalQueue(AR: APPEND_REVERSE) : BASIC_PERSISTENT_QUEUE = struct structure L = AR.L open L.I datatype 'a t = T of 'a AR.t * 'a AR.t * 'a L.t fun tail l = case AR.destruct l of NONE => l | SOME(_, l) => l fun queue(l, l', r) = if AR.length l >= L.length r then T(l, l', r) else let val l = AR.appendReverse(l, r) in T(l, l, L.empty()) end fun empty() = let val l = AR.empty() in T(l, l, L.empty()) end fun isEmpty(T(l, _, _)) = AR.isEmpty l fun destruct(T(l, l', r)) = case AR.destruct l of NONE => NONE | SOME(x, l) => SOME(x, queue(l, l', r)) fun enque(T(l, l', r), x) = queue(l, l', L.cons(x, r)) end mlton-20100608/lib/mlton/queue/lazy-append-reverse.fun0000644000076600000240000000075011404435636021221 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor LazyAppendReverse(): APPEND_REVERSE = struct structure L' = LazyListLength(LazyList) open L' structure L = L' end structure LazyAppendReverse = LazyAppendReverse() (* figure 1 of Okasaki96 *) structure QueueAmortizedConst = PersistentQueue(EarlyQueue(LazyAppendReverse)) mlton-20100608/lib/mlton/queue/linked-list.fun0000644000076600000240000000226111404435636017542 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* QueueLinkedList *) (*-------------------------------------------------------------------*) functor QueueLinkedList(): QUEUE_EPHEMERAL_UNBOUNDED = struct val {error, ...} = Error.errors("queue", "linked-list") structure L = MutableList datatype 'a t = T of {head: 'a L.t ref, tail: 'a L.t ref} fun empty() = T{head = ref(L.empty()), tail = ref(L.empty())} fun isEmpty(T{head = ref l, ...}) = L.isEmpty l fun enque(q as T{head, tail}, x) = let val cell = L.single x in (if isEmpty q then head := cell else L.setTail(!tail, cell) ; tail := cell) end fun deque(q as T{head, tail}) = case L.destruct(!head) of NONE => error "deque" | SOME(x, _) => (if L.eq(!head, !tail) then (head := L.empty() ; tail := L.empty()) else head := L.tail(!head) ; x) end mlton-20100608/lib/mlton/queue/list.fun0000644000076600000240000000142011404435636016272 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* ListQueue *) (*-------------------------------------------------------------------*) functor ListQueue(): BASIC_PERSISTENT_QUEUE = struct structure L = List datatype 'a t = T of 'a List.t fun destruct(T l) = case L.destruct l of NONE => NONE | SOME(x, l) => SOME(x, T l) fun empty () = T(L.empty()) fun isEmpty(T l) = L.isEmpty l fun enque(T l, x) = T(L.append(l, L.single x)) end structure ListQueue = PersistentQueue(ListQueue()) mlton-20100608/lib/mlton/queue/persistent.fun0000644000076600000240000000114111404435636017517 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* PersistentQueue *) (*-------------------------------------------------------------------*) functor PersistentQueue(Q: BASIC_PERSISTENT_QUEUE) : PERSISTENT_QUEUE = struct open Q exception Deque fun deque q = case destruct q of SOME xq => xq | NONE => raise Deque end mlton-20100608/lib/mlton/queue/persistent.sig0000644000076600000240000000047411404435636017521 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PERSISTENT_QUEUE = sig include BASIC_PERSISTENT_QUEUE val deque: 'a t -> 'a * 'a t end mlton-20100608/lib/mlton/queue/queue.fun0000644000076600000240000000074611404435636016455 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Queue(Q: BASIC_QUEUE): QUEUE = struct val {error, ...} = Error.errors("queue", "queue") structure Q' = Sequence(structure I = Integer structure S = Q) open Q Q' fun deque q = case destruct q of SOME xq => xq | NONE => error "deque" end mlton-20100608/lib/mlton/queue/singly-linked.fun0000644000076600000240000000207511404435636020077 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* SinglyLinked *) (*-------------------------------------------------------------------*) functor SinglyLinkedQueue(): UNBOUNDED_EPHEMERAL_QUEUE = struct structure P = Pointer structure E = SimpleSinglyLinkedElement datatype 'a t = T of {head: 'a E.t P.t, tail: 'a E.t P.t} fun empty() = T{head = P.null(), tail = P.null()} fun isEmpty(T{head, ...}) = P.isNull head fun enque(q as T{head, tail}, x) = let val e = E.new x in if isEmpty q then P.:=(head, e) else E.setNext(P.! tail, e) ; P.:=(tail, e) end fun deque(T{head, tail}) = let val (v, p) = E.destruct(P.! head) in P.copy(head, p) ; if P.isNull p then P.clear tail else () ; v end end structure SinglyLinkedQueue = SinglyLinkedQueue() mlton-20100608/lib/mlton/queue/sources.cm0000644000076600000240000000113711404435636016616 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library structure SinglyLinkedQueue is ../base/sources.cm ephemeral.sig unbounded-ephemeral.sig singly-linked.fun bounded-ephemeral.sig circular.fun basic-persistent.sig list.fun two-list.fun append-reverse.sig lazy-append-reverse.fun incremental-append-reverse.fun explicit-append-reverse.fun early.fun incremental.fun persistent.sig persistent.fun mlton-20100608/lib/mlton/queue/test.sml0000644000076600000240000000232311404435636016304 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Q = QueueLogarithmicExplicit(); fun p q = Q.output(q, ", ", Int.output, Out.standard); let val q = ref(Q.empty()) in Iterate.for(1, 20, fn n => (p(!q) ; Out.newline Out.standard ; q := Q.enqueue(!q,n))) end structure Q = QueuePersistentTwoList structure Q = Queue(QueuePersistentOrderOne()) val q = Q.empty(): int Q.t Q.destruct q Q.dequeue q val q = Q.enqueue(Q.enqueue(q, 1), 2) val (one, q') = Q.dequeue q val (two, q'') = Q.dequeue q' Q.isEmpty q; Q.isEmpty q'; Q.isEmpty q'' local functor Test = QueueTest (structure ListUtil = ListUtil) (structure Queue = QueuePersistentList) ; structure Ephemeral = Test(structure Queue' = QueueEphemeral) structure PersistentTwoList = Test(structure Queue' = QueuePersistentTwoList) structure OrderOne = Test(structure Queue' = QueuePersistentOrderOne) val numOps = 1000 in val _ = (Ephemeral.test numOps ; PersistentTwoList.test numOps ; OrderOne.test numOps) end mlton-20100608/lib/mlton/queue/two-list.fun0000644000076600000240000000176611404435636017116 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* TwoListQueue *) (*-------------------------------------------------------------------*) functor TwoListQueue (): BASIC_PERSISTENT_QUEUE = struct structure L = List datatype 'a t = T of 'a L.t * 'a L.t fun destruct(T(l, r)) = let val (l, r) = if L.isEmpty l then (L.reverse r, L.empty()) else (l, r) in case L.destruct l of NONE => NONE | SOME(x, l) => SOME(x, T(l, r)) end fun empty() = T(L.empty(), L.empty()) fun isEmpty(T(l, r)) = L.isEmpty l andalso L.isEmpty r fun enque(T(l, r), x) = T(l, L.cons(x, r)) fun toList(T(l, r)) = L.append(l, L.reverse r) end structure TwoListQueue = PersistentQueue(TwoListQueue()) mlton-20100608/lib/mlton/queue/unbounded-ephemeral.sig0000644000076600000240000000047111404435636021241 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNBOUNDED_EPHEMERAL_QUEUE = sig include EPHEMERAL_QUEUE val empty: unit -> 'a t end mlton-20100608/lib/mlton/set/0000755000076600000240000000000011404470407014252 5ustar mtfstaffmlton-20100608/lib/mlton/set/bit-vector-set.fun0000644000076600000240000001531211404435636017642 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor BitVectorSet (Element : sig include T val fromInt: int -> t val size: int val toInt: t -> int end) : SET = struct structure Element = Element structure Bin :> sig eqtype t val binSize: int val difference : t * t -> t val empty : t val equals : t * t -> bool val fold : t * 'a * (int * 'a -> 'a) -> 'a val intersect : t * t -> t val singleton : int -> t val union : t * t -> t end = struct open Word val binSize = wordSize val equals : t * t -> bool = op = val empty : t = 0wx0 fun singleton i = <<(0wx1, Word.fromInt i) val difference = fn (b1, b2) => andb (b1, notb b2) val intersect = fn (b1, b2) => andb (b1, b2) val union = fn (b1, b2) => orb (b1, b2) fun fold (w, a, f) = let fun loop (w, a, i) = if Int.< (i, wordSize) then let val a = if andb (w, 0wx1) <> 0wx0 then f (i, a) else a in loop (>>(w, 0wx1), a, Int.+ (i, 1)) end else a in loop (w, a, 0) end end type bin = Bin.t type t = bin vector type index = int (* position in t *) type slot = int (* position in bin *) type pos = index * slot val ltPos : pos * pos -> bool = fn ((index1, slot1), (index2, slot2)) => index1 < index2 orelse (index1 = index2 andalso slot1 < slot2) val intToPos : int -> pos = fn pos => (Int.quot (pos, Bin.binSize), Int.rem (pos, Bin.binSize)) val posToInt : pos -> int = fn (index, slot) => index * Bin.binSize + slot val slotToBin : slot -> bin = fn slot => Bin.singleton slot val eltToPos = intToPos o Element.toInt fun eltToPosBin x = let val pos as (index, slot) = eltToPos x in (pos, slotToBin slot) end val posToElt = Element.fromInt o posToInt val maxPos as (maxIndex,maxSlot) = intToPos (Element.size - 1) val empty : t = Vector.new (maxIndex + 1, Bin.empty) fun isEmpty (v : t) = Vector.forall (v, fn b => b = Bin.empty) fun singleton x = let val ((index,_), bin) = eltToPosBin x in Vector.tabulate (maxIndex + 1, fn i => if i = index then bin else Bin.empty) end fun contains (v, x) = let val ((index,_), bin) = eltToPosBin x in Bin.intersect (bin, Vector.sub (v, index)) <> Bin.empty end fun add (v, x) = let val ((index, _), bin) = eltToPosBin x in Vector.mapi (v, fn (i, b) => if i = index then Bin.union (bin, b) else b) end fun remove (v, x) = let val ((index, _), bin) = eltToPosBin x in Vector.mapi (v, fn (i, b) => if i = index then Bin.difference (b, bin) else b) end fun difference (v1, v2) = Vector.map2 (v1, v2, fn (b1, b2) => Bin.difference (b1, b2)) fun intersect (v1, v2) = Vector.map2 (v1, v2, fn (b1, b2) => Bin.intersect (b1, b2)) fun union (v1, v2) = Vector.map2 (v1, v2, fn (b1, b2) => Bin.union (b1, b2)) fun unions ss = List.fold (ss, empty, union) fun equals (v1, v2) = Vector.equals (v1, v2, Bin.equals) fun isSubsetEq (v1, v2) = Exn.withEscape (fn escape => Vector.fold2 (v1, v2, true, fn (b1, b2, a) => if Bin.difference (b1, b2) = Bin.empty then a else escape false)) fun isSubset (s1, s2) = isSubsetEq (s1, s2) andalso not (equals (s1, s2)) fun isSupersetEq (s1, s2) = isSubsetEq (s2, s1) fun isSuperset (s1, s2) = isSubset (s2, s1) fun areDisjoint (v1, v2) = Exn.withEscape (fn escape => Vector.fold2 (v1, v2, true, fn (b1, b2, a) => if Bin.intersect(b1, b2) = Bin.empty then a else escape false)) fun fold (v, a, f) = Vector.foldi (v, a, fn (i, b, a) => let val check = if i < maxIndex then fn s => true else fn s => s < maxSlot in Bin.fold (b, a, fn (s, a) => if check s then f (posToElt (i, s), a) else a) end) fun foreach (s, f) = fold (s, (), fn (x, ()) => f x) fun peekGen (s, no, f) = Exn.withEscape (fn escape => (foreach (s, fn x => case f x of NONE => () | SOME yes => escape yes) ; no ())) fun exists (s, p) = peekGen (s, fn () => false, fn x => if p x then SOME true else NONE) fun forall (s, p) = not (exists (s, not o p)) fun subsetSize (s, p) = fold (s, 0 : int, fn (x, a) => if p x then a + 1 else a) fun size s = subsetSize (s, fn _ => true) fun replace (s, f) = fold(s, empty, fn (x, s) => case f x of NONE => s | SOME x' => add (s, x')) fun map (s, f) = replace (s, fn x => SOME (f x)) fun subset (s, p) = replace (s, fn x => if p x then SOME x else NONE) fun partition (s, p) = let val yes = subset (s, p) in {yes = yes, no = difference (s, yes)} end fun fromList l = List.fold (l, empty, fn (x, s) => add (s, x)) fun toList s = fold (s, nil, op ::) fun layout s = List.layout Element.layout (toList s) val op + = union val op - = difference val op < = isSubset val op <= = isSubsetEq val op > = isSuperset val op >= = isSupersetEq fun power _ = Error.unimplemented "BitVectorSet.power" fun subsets _ = Error.unimplemented "BitVectorSet.subsets" end mlton-20100608/lib/mlton/set/disjoint-collection.fun0000644000076600000240000000564211404435636020754 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Disjoint Collection *) (*-------------------------------------------------------------------*) functor DisjointCollection(): DISJOINT_COLLECTION = struct structure S = DisjointSet structure CL = CircularList structure D = SimpleDoublyLinkedElement structure Value : sig type 'a t val new: '1a -> '1a t val value: 'a t -> 'a val elt: 'a t -> 'a t S.t D.t val set: 'a t -> 'a t S.t val copy: 'a t * 'a -> 'a t end = struct datatype 'a t = T of {value: 'a, elt: 'a t S.t D.t option ref} fun value(T{value, ...}) = value fun elt(T{elt=ref(SOME d), ...}) = d | elt _ = Error.error "DisjointCollection.Value.elt" fun set v = D.value(elt v) fun new v = let val r = ref NONE val v = T{value = v, elt = r} val d = D.new(S.singleton v) in (r := SOME d ; v) end fun copy(T{elt, ...}, v) = T{value = v, elt = elt} end structure V = Value structure S = struct type 'a t = 'a V.t S.t fun value s = V.value(S.value s) fun elt s = V.elt(S.value s) val representative = S.representative val isRepresentative = S.isRepresentative val union = S.union fun setValue(s, v) = S.setValue(s, V.copy(S.value s, v)) val equals = S.equals end (* ------------------------------------------------- *) (* Datatype *) (* ------------------------------------------------- *) datatype 'a t = T of {sets: 'a S.t CL.t, numSets: int ref} fun sets (T{sets, ...}) = sets fun numSetsRef (T{numSets, ...}) = numSets fun numSets c = !(numSetsRef c) fun incNumSets c = numSetsRef c := numSets c + 1 fun decNumSets c = numSetsRef c := numSets c - 1 fun empty() = T{sets = CL.empty(), numSets = ref 0} fun addSingleton(c, v) = let val v = V.new v in (incNumSets c ; CL.insert(sets c, V.elt v) ; V.set v) end fun new vs = let val c = empty() in (c, List.map(vs, fn v => addSingleton(c, v))) end fun randomSet(T{sets, ...}) = D.value(CL.first sets) fun random c = S.value(randomSet c) fun union(c, s, s') = let val r = S.representative s val d = S.elt r val r' = S.representative s' val d' = S.elt r' in if S.equals(r, r') then () else (decNumSets c ; S.union(r, r') ; CL.delete(sets c, if S.isRepresentative r then d' else d)) end end structure DisjointCollection = DisjointCollection() mlton-20100608/lib/mlton/set/disjoint-collection.sig0000644000076600000240000000132211404435636020735 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DISJOINT_COLLECTION = sig structure S : sig type 'a t val value: 'a t -> 'a val setValue: 'a t * 'a -> unit val equals: 'a t * 'a t -> bool end type 'a t val empty: unit -> 'a t val new: 'a list -> 'a t * 'a S.t list val addSingleton: 'a t * 'a -> 'a S.t val numSets: 'a t -> int val randomSet: 'a t -> 'a S.t val random: 'a t -> 'a val union: 'a t * 'a S.t * 'a S.t -> unit end mlton-20100608/lib/mlton/set/disjoint-max.fun0000644000076600000240000000656411404435636017412 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Taken from * Applications of Path Compression on Balanced Trees * Robert Endre Tarjan * JACM, 26, 4 * October 1979 * 690-715 *) functor DisjointMax(O: ORDER): DISJOINT_MAX = struct structure O = O datatype t = T of {label: O.t ref, info: info ref} and info = Parent of t | Root of {size: int ref, child: t option ref} fun parent (T{info = ref (Parent p), ...}) = p | parent _ = Error.bug "DisjointMax.parent" fun setParent(T{info, ...}, p) = info := Parent p fun labelRef (T{label, ...}) = label val (label, setLabel) = Ref.getAndSet labelRef fun sizeRef (T{info = ref(Root{size, ...}), ...}) = size | sizeRef _ = Error.bug "DisjointMax.sizeRef" val (size, setSize) = Ref.getAndSet sizeRef fun childRef (T{info = ref(Root{child, ...}), ...}) = child | childRef _ = Error.bug "DisjointMax.childRef" val (childOption, setChildOption) = Ref.getAndSet childRef val child = Option.projector childOption fun setChild(r, c) = setChildOption(r, SOME c) fun subsize r = size r - (case childOption r of NONE => 0 | SOME r' => size r') fun hasParent (T{info = ref (Parent _), ...}) = true | hasParent _ = false fun isRoot (T{info = ref (Root _), ...}) = true | isRoot _ = false fun singleton l = T{label = ref l, info = ref (Root{size = ref 0, child = ref NONE})} fun update(r, l) = if not(isRoot r) then Error.error "DisjointMax.update" else if O.<=(l, label r) then () else let fun link r = case childOption r of NONE => r | SOME r' => if O.<=(l, label r') then r else if subsize r >= subsize r' then (setChildOption(r, childOption r') ; setParent(r', r) ; link r) else (setSize(r', size r) ; setParent(r, r') ; link r') in (setLabel(r, l) ; case childOption r of NONE => () | SOME r' => if O.<=(l, label r') then () else let val r' = link r' in (setChild(r, r') ; setLabel(r', l)) end) end fun link(r, r') = if not (isRoot r andalso isRoot r') then Error.error "DisjointMax.link" else let val s = size r val s' = size r' fun move NONE = () | move (SOME r') = let val r'' = childOption r' in (setParent(r', r) ; move r'') end in (update(r', label r) ; setSize(r, s + s') ; if s < s' then move (childOption r) else move (SOME r')) end fun compress s = (* Pre: hasParent s *) let val p = parent s in if hasParent p then (compress p ; setLabel(s, O.max(label s, label p)) ; setParent(s, parent p)) else () end fun eval s = if isRoot s then label s else (compress s ; O.max(label s, label (parent s))) end mlton-20100608/lib/mlton/set/disjoint-max.sig0000644000076600000240000000076311404435636017377 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DISJOINT_MAX = sig structure O: ORDER type t val singleton: O.t -> t val eval: t -> O.t val link: t * t -> unit (* must link roots *) (* Make second tree a child of first tree *) val update: t * O.t -> unit (* must update a root *) end mlton-20100608/lib/mlton/set/disjoint.fun0000644000076600000240000000416711404435636016624 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor DisjointSet ():> DISJOINT_SET = struct datatype 'a t = T of 'a parent ref and 'a parent = Parent of 'a t | Root of {value: 'a, rank: int} fun singleton v = T (ref (Root {value = v, rank = 0})) val rank = fn T (ref (Root {rank, ...})) => rank | _ => Error.bug "DisjointSet.rank" val setRank = fn (T (r as ref (Root {value, ...})), rank) => r := Root {value = value, rank = rank} | _ => Error.bug "DisjointSet.setRootValue" fun incrementRank r = setRank (r, rank r + 1) val parent = fn T (ref (Parent p)) => p | _ => Error.bug "DisjointSet.parent" fun setParent (T r, p) = r := Parent p val rootValue = fn T (ref (Root {value, ...})) => value | _ => Error.bug "DisjointSet.rootValue" val setRootValue = fn (T (r as ref (Root {rank, ...})), v) => r := Root {value = v, rank = rank} | _ => Error.bug "DisjointSet.setRootValue" fun equal (T r, T r') = r = r' val isRoot = fn T (ref (Root _)) => true | _ => false val isRepresentative = isRoot fun root s = if isRoot s then s else let val r = root (parent s) in setParent (s, r) ; r end val representative = root fun ! s = rootValue (root s) fun s := v = setRootValue (root s, v) val equals = fn (s1, s2) => equal (root s1, root s2) fun union (s, s') = let val r = root s val r' = root s' in if equal (r, r') then () else let val n = rank r val n' = rank r' in if n < n' then setParent (r, r') else (setParent (r', r) ; if Int.equals (n, n') then incrementRank r else ()) end end fun canUnion (s, s', f) = equals (s, s') orelse (case f (! s, ! s') of NONE => false | SOME v => (union (s, s') ; s := v ; true)) end structure DisjointSet = DisjointSet () mlton-20100608/lib/mlton/set/disjoint.sig0000644000076600000240000000127411404435636016612 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DISJOINT_SET = sig type 'a t (* Each set is associated with a single value, like a ref cell. *) val := : 'a t * 'a -> unit val ! : 'a t -> 'a val canUnion: 'a t * 'a t * ('a * 'a -> 'a option) -> bool val equals: 'a t * 'a t -> bool val isRepresentative: 'a t -> bool val representative: 'a t -> 'a t val singleton: 'a -> 'a t (* When unions occur, one of the values is chosen. *) val union: 'a t * 'a t -> unit end mlton-20100608/lib/mlton/set/hashed-unique-set.fun0000644000076600000240000002275311404435636020333 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor HashedUniqueSet(structure Set : SET structure Element : sig include T val hash : t -> word end sharing type Set.Element.t = Element.t) : SET = struct structure Set = Set structure Element = Element val hash = Element.hash fun index (w: word, mask: word): int = Word.toInt (Word.andb (w, mask)) datatype t = T of {buckets: Set.t vector, mask: word} ref fun stats' {buckets, mask} = Vector.fold (buckets, (0, NONE, NONE), fn (s', (size, min, max)) => let val n = Set.size s' in (size + n, SOME (Option.fold(min,n,Int.min)), SOME (Option.fold(max,n,Int.max))) end) fun stats s = let val T (ref {buckets, mask}) = s in stats' {buckets = buckets, mask = mask} end fun grow {buckets, mask} = let val mask' = mask val mask = Word.orb (0wx1, Word.<<(mask, 0wx1)) val high = Word.andb (mask, Word.notb mask') val n = Vector.length buckets val buckets = (#1 o Vector.unfoldi) (2 * n, ([], false), fn (i, (l, b)) => if b then case l of h::t => (h, (t, b)) | _ => Error.bug "HashedUniqueSet.grow" else if i = n then case List.rev l of h::t => (h, (t, true)) | _ => Error.bug "HashedUniqueSet.grow" else let val {yes, no} = Set.partition (Vector.sub(buckets, i), fn x => Word.andb(high, hash x) = 0wx0) in (yes, (no::l, b)) end) in {buckets = buckets, mask = mask} end fun shrink {buckets, mask} = let val mask = Word.>>(mask, 0wx1) val n = (Vector.length buckets) div 2 val buckets = (#1 o Vector.unfoldi) (n, (), fn (i, _) => let val s1 = Vector.sub(buckets, i) val s2 = Vector.sub(buckets, i + n) in (Set.+(s1, s2), ()) end) in {buckets = buckets, mask = mask} end fun T' {buckets, mask} = let val (size,min,max) = stats' {buckets = buckets, mask = mask} val max = case max of SOME max => max | NONE => ~1 val n = Vector.length buckets in if max > n then T (ref (grow {buckets = buckets, mask = mask})) else if max < n div 2 andalso n > 2 then T (ref (shrink {buckets = buckets, mask = mask})) else T (ref {buckets = buckets, mask = mask}) end fun coerce (s1 as T (s1' as ref (s1'' as {buckets = buckets1, mask = mask1})), s2 as T (s2' as ref (s2'' as {buckets = buckets2, mask = mask2}))) = if mask1 = mask2 then () else if mask1 < mask2 then (s1' := grow s1''; coerce (s1, s2)) else (s2' := grow s2''; coerce (s1, s2)) val empty = let val mask = 0wx1 val buckets = Vector.new2 (Set.empty, Set.empty) in T (ref {buckets = buckets, mask = mask}) end fun singleton x = let val mask = 0wx1 val buckets = if Word.andb(mask, hash x) = 0wx0 then Vector.new2 (Set.singleton x, Set.empty) else Vector.new2 (Set.empty, Set.singleton x) in T (ref {buckets = buckets, mask = mask}) end fun walk1 (vw, sw) s = let val T (ref {buckets, mask}) = s in vw(buckets, fn s' => sw s') end fun walk2 (vw, sw) (s1, s2) = let val _ = coerce (s1, s2) val T (ref {buckets = buckets1, mask}) = s1 val T (ref {buckets = buckets2, mask}) = s2 in vw(buckets1, buckets2, fn (s1', s2') => sw (s1', s2')) end val areDisjoint = walk2 (Vector.forall2, Set.areDisjoint) val equals = walk2 (Vector.forall2, Set.equals) fun exists (s, p) = walk1 (Vector.exists, fn s' => Set.exists(s', p)) s fun forall (s, p) = walk1 (Vector.forall, fn s' => Set.forall(s', p)) s fun foreach (s, f) = walk1 (Vector.foreach, fn s' => Set.foreach(s', f)) s fun build1 sb s = let val T (ref {buckets, mask}) = s val buckets = (#1 o Vector.unfoldi) (Vector.length buckets, (), fn (i, _) => let val s' = Vector.sub(buckets, i) in (sb s', ()) end) in T' {buckets = buckets, mask = mask} end fun build2 sb (s1, s2) = let val _ = coerce (s1, s2) val T (ref {buckets = buckets1, mask}) = s1 val T (ref {buckets = buckets2, mask}) = s2 val buckets = (#1 o Vector.unfoldi) (Vector.length buckets1, (), fn (i, _) => let val s1' = Vector.sub(buckets1, i) val s2' = Vector.sub(buckets2, i) in (sb(s1', s2'), ()) end) in T' {buckets = buckets, mask = mask} end val difference = build2 Set.- val intersect = build2 Set.intersect fun subset (s, p) = build1 (fn s' => Set.subset(s', p)) s val union = build2 Set.+ fun unions [] = empty | unions [s] = s | unions [s1,s2] = union(s1, s2) | unions (s1::s2::ss) = unions(union(s1,s2)::ss) fun contains (s, x) = let val T (ref {buckets, mask}) = s in Set.contains(Vector.sub(buckets, index(hash x, mask)), x) end fun add (s, x) = if contains(s, x) then s else let val T (ref {buckets, mask}) = s val ix = index(hash x, mask) val buckets = (#1 o Vector.unfoldi) (Vector.length buckets, (), fn (i, _) => let val s' = Vector.sub(buckets, i) in if i = ix then (Set.add(s', x), ()) else (s', ()) end) in T' {buckets = buckets, mask = mask} end fun remove (s, x) = if not (contains(s, x)) then s else let val T (ref {buckets, mask}) = s val ix = index(hash x, mask) val buckets = (#1 o Vector.unfoldi) (Vector.length buckets, (), fn (i, _) => let val s' = Vector.sub(buckets, i) in if i = ix then (Set.remove(s', x), ()) else (s', ()) end) in T' {buckets = buckets, mask = mask} end fun partition (s, p) = let val T (ref {buckets, mask}) = s val n = Vector.length buckets val {yes, no} = Vector.fold (buckets, {yes = [], no = []}, fn (s', {yes, no}) => let val {yes = yes', no = no'} = Set.partition (s', p) in {yes = yes'::yes, no = no'::no} end) val yes = (#1 o Vector.unfoldi) (n, List.rev yes, fn (_, l) => case l of h::t => (h, t) | _ => Error.bug "HashedUniqueSet.partition.yes") val no = (#1 o Vector.unfoldi) (n, List.rev no, fn (_, l) => case l of h::t => (h, t) | _ => Error.bug "HashedUniqueSet.partition.no") in {yes = T' {buckets = yes, mask = mask}, no = T' {buckets = no, mask = mask}} end fun fold (s, b, f) = let val T (ref {buckets, mask}) = s in Vector.fold (buckets, b, fn (s', b) => Set.fold(s', b, f)) end fun fromList l = List.fold(l, empty, fn (x, s) => add(s, x)) fun toList s = fold(s, [], op ::) fun map (s, f) = fold(s, empty, fn (x, s) => add(s, f x)) fun replace (s, f) = fold(s, empty, fn (x, s) => case f x of NONE => s | SOME x' => add(s, x')) fun subsetSize (s, p) = fold(s, 0: int, fn (x, n) => if p x then n + 1 else n) fun size s = subsetSize(s, fn _ => true) fun layout s = List.layout Element.layout (toList s) fun power s = Error.bug "HashedUniqueSet.power" fun subsets (s, n) = Error.bug "HashedUniqueSet.subsets" fun isEmpty s = size s = 0 fun isSubsetEq (s1, s2) = size (difference (s1, s2)) = 0 fun isSubset (s1, s2) = (size s1 <> size s2) andalso isSubsetEq(s1, s2) fun isSupersetEq (s1, s2) = isSubsetEq(s2, s1) fun isSuperset (s1, s2) = isSubset(s2, s1) val op + = union val op - = difference val op < = isSubset val op <= = isSubsetEq val op > = isSuperset val op >= = isSupersetEq end mlton-20100608/lib/mlton/set/object-oriented.sml0000644000076600000240000000114211404435636020047 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Set () = struct type 'a obj = {rep: 'a, equal: 'a * 'a -> bool} datatype 'a t = Empty | NonEmpty of {elts: 'a list, equal: ('a * 'a -> bool)} val empty = Empty fun singleton {rep, equal} = NonEmpty{elts = [rep], equal = equal} fun add(Empty, re) = singleton re | add(NonEmpty{elts, equal}, {rep, equal}) how do you make sure that it's the same equality function?? mlton-20100608/lib/mlton/set/ordered-unique-set.fun0000644000076600000240000002642111404435636020517 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor OrderedUniqueSet(Element : ORDER): SET = struct structure Element = Element datatype t = T of {elements: Element.t list, length: int} fun T' _ s = let (* val _ = Assert.assert ("OrderedUniqueSet, " ^ f, fn () => let val rec check = fn h1::(t as h2::_) => if Element.compare(h1, h2) = LESS then check t else (print (concat [Layout.toString (Element.layout h1), ", ", Layout.toString (Element.layout h2), "\n", Layout.toString (Relation.layout (Element.compare(h1, h2))), "\n", Layout.toString (Relation.layout (Element.compare(h2, h1))), "\n" ]); false) | _ => true in (List.length elements = length) andalso check elements end) handle exn => (print (Layout.toString (List.layout Element.layout elements)); print "\n"; raise exn) *) in T s end val empty' = {elements = [], length = 0: int} val empty = T' "empty'" empty' fun singleton x = T' "singleton" {elements = [x], length = 1} fun contains (T {elements = xs, ...}, x) = let val rec contains' = fn [] => false | h::t => if Element.<(h, x) then contains' t else if Element.>(h,x) then false else true in contains' xs end fun add (s as T s', x) = let val rec add' = fn ({elements = [], ...}, {elements = xsacc, length = nacc}) => {elements = List.appendRev(xsacc, [x]), length = nacc + 1} | ({elements = xs as h::t, length = n}, {elements = xsacc, length = nacc}) => if Element.<(h,x) then add' ({elements = t, length = n - 1}, {elements = h::xsacc, length = 1 + nacc}) else if Element.>(h,x) then {elements = List.appendRev(xsacc, x::xs), length = nacc + 1 + n} else {elements = List.appendRev(xsacc, xs), length = nacc + n} in if contains(s, x) then s else T' "add" (add' (s', empty')) end fun areDisjoint (T {elements = xs1, ...}, T {elements = xs2, ...}) = let val rec areDisjoint' = fn ([], _) => true | (_, []) => true | (xs1 as h1::t1, xs2 as h2::t2) => if Element.<(h1, h2) then areDisjoint'(t1, xs2) else if Element.>(h1, h2) then areDisjoint'(xs1, t2) else false in areDisjoint' (xs1, xs2) end fun difference (T s1', T s2') = let val rec difference' = fn ({elements = [], ...}, _, {elements = xsacc, length = nacc}) => {elements = List.rev xsacc, length = nacc} | ({elements = xs1, length = n1}, {elements = [], ...}, {elements = xsacc, length = nacc}) => {elements = List.appendRev(xsacc, xs1), length = nacc + n1} | (s1 as {elements = h1::t1, length = n1}, s2 as {elements = h2::t2, length = n2}, sacc as {elements = xsacc, length = nacc}) => if Element.<(h1,h2) then difference' ({elements = t1, length = n1 - 1}, s2, {elements = h1::xsacc, length = 1 + nacc}) else if Element.>(h1,h2) then difference' (s1, {elements = t2, length = n2 - 1}, sacc) else difference' ({elements = t1, length = n1 - 1}, {elements = t2, length = n2 - 1}, sacc) in T' "difference" (difference' (s1', s2', empty')) end fun equals (T {elements = xs1, length = n1}, T {elements = xs2, length = n2}) = let val rec equals' = fn ([], []) => true | ([], _) => false | (_, []) => false | (h1::t1, h2::t2) => Element.equals(h1, h2) andalso equals'(t1, t2) in n1 = n2 andalso equals' (xs1, xs2) end fun exists (T {elements = xs, ...}, p) = List.exists(xs, p) fun fold (T {elements = xs, ...}, b, f) = List.fold(xs, b, f) fun forall (T {elements = xs, ...}, p) = List.forall(xs, p) fun foreach (T {elements = xs, ...}, p) = List.foreach(xs, p) fun fromList l = List.fold(l, empty, fn (x, s) => add(s, x)) fun intersect (T s1', T s2') = let val rec intersect' = fn ({elements = [], ...}, _, {elements = xsacc, length = nacc}) => {elements = List.rev xsacc, length = nacc} | (_, {elements = [], ...}, {elements = xsacc, length = nacc}) => {elements = List.rev xsacc, length = nacc} | (s1 as {elements = h1::t1, length = n1}, s2 as {elements = h2::t2, length = n2}, sacc as {elements = xsacc, length = nacc}) => if Element.<(h1,h2) then intersect' ({elements = t1, length = n1 - 1}, s2, sacc) else if Element.>(h1,h2) then intersect' (s1, {elements = t2, length = n2 - 1}, sacc) else intersect' ({elements = t1, length = n1 - 1}, {elements = t2, length = n2 - 1}, {elements = h1::xsacc, length = 1 + nacc}) in T' "intersect" (intersect' (s1', s2', empty')) end fun layout (T {elements = xs, ...}) = List.layout Element.layout xs fun map (T {elements = xs, ...}, f) = fromList(List.map(xs, f)) fun partition (T {elements = xs, ...}, p) = let val {yes = {elements = yxs, length = yn}, no = {elements = nxs, length = nn}} = List.fold(xs, {yes = empty', no = empty'}, fn (x, {yes as {elements = yxs, length = yn}, no as {elements = nxs, length = nn}}) => if p x then {yes = {elements = x::yxs, length = yn + 1}, no = no} else {yes = yes, no = {elements = x::nxs, length = nn + 1}}) in {yes = T' "partition" {elements = List.rev yxs, length = yn}, no = T' "partition" {elements = List.rev nxs, length = nn}} end fun power (T {elements = xs, ...}) = let val rec power' = fn [] => [empty] | h::t => let val rest = power' t in List.fold (rest, rest, fn (T {elements = xs, length = n}, rest) => (T' "power" {elements = h::xs, length = 1 + n})::rest) end in power' xs end fun remove (T s', x) = let val rec remove' = fn ({elements = [], ...}, {elements = xsacc, length = nacc}) => {elements = List.appendRev(xsacc, [x]), length = nacc + 1} | ({elements = xs as h::t, length = n}, {elements = xsacc, length = nacc}) => if Element.<(h, x) then remove' ({elements = t, length = n - 1}, {elements = h::xsacc, length = 1 + nacc}) else if Element.>(h, x) then {elements = List.appendRev(xsacc, xs), length = nacc + n} else {elements = List.appendRev(xsacc, t), length = nacc + n - 1} in T' "remove" (remove' (s', empty')) end fun replace (T {elements = xs, ...}, f) = List.fold(xs, empty, fn (x, s) => (case f x of NONE => s | SOME x' => add(s, x'))) fun size (T {length = n, ...}) = n fun subset (T {elements = xs, ...}, p) = let val {elements = xs, length = n} = List.fold(xs, empty', fn (x, s as {elements = xs, length = n}) => if p x then {elements = x::xs, length = n + 1} else s) in T' "subset" {elements = List.rev xs, length = n} end fun subsets _ = Error.unimplemented "OrderedUniqueSet: subsets" fun subsetSize (T {elements = xs, ...}, p) = List.fold(xs, 0: int, fn (x, n) => if p x then n + 1 else n) fun toList (T {elements = xs, ...}) = xs fun union (T s1', T s2') = let val rec union' = fn ({elements = [], ...}, {elements = xs2, length = n2}, {elements = xsacc, length = nacc}) => {elements = List.appendRev(xsacc, xs2), length = nacc + n2} | ({elements = xs1, length = n1}, {elements = [], ...}, {elements = xsacc, length = nacc}) => {elements = List.appendRev(xsacc, xs1), length = nacc + n1} | (s1 as {elements = h1::t1, length = n1}, s2 as {elements = h2::t2, length = n2}, {elements = xsacc, length = nacc}) => if Element.<(h1,h2) then union' ({elements = t1, length = n1 - 1}, s2, {elements = h1::xsacc, length = 1 + nacc}) else if Element.>(h1,h2) then union' (s1, {elements = t2, length = n2 - 1}, {elements = h2::xsacc, length = 1 + nacc}) else union' ({elements = t1, length = n1 - 1}, {elements = t2, length = n2 - 1}, {elements = h1::xsacc, length = 1 + nacc}) in T' "union" (union' (s1', s2', empty')) end fun unions ss = List.fold(ss, empty, union) fun isEmpty s = size s = 0 fun isSubsetEq (s1, s2) = size (difference (s1, s2)) = 0 fun isSubset (s1, s2) = (size s1 <> size s2) andalso isSubsetEq(s1, s1) fun isSupersetEq (s1, s2) = isSubsetEq(s2, s1) fun isSuperset (s1, s2) = isSubset(s2, s1) val op + = union val op - = difference val op < = isSubset val op <= = isSubsetEq val op > = isSuperset val op >= = isSupersetEq end mlton-20100608/lib/mlton/set/poly-set.sig0000644000076600000240000000214711404435636016543 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature POLY_SET = sig structure I: INTEGER type 'a t val empty: {equal: 'a * 'a -> bool, output: 'a * Out.t -> unit} -> 'a t val size: 'a t -> I.t val foreach: 'a t * ('a -> unit) -> unit val forall: 'a t * ('a -> bool) -> bool val exists: 'a t * ('a -> bool) -> bool val equals: 'a t * 'a t -> bool val <: 'a t * 'a t -> bool val <=: 'a t * 'a t -> bool val >: 'a t * 'a t -> bool val >=: 'a t * 'a t -> bool val +: 'a t * 'a t -> 'a t val -: 'a t * 'a t -> 'a t val intersect: 'a t * 'a t -> 'a t (* val union: 'a t list -> 'a t*) val subset: 'a t * ('a -> bool) -> 'a t val add: 'a t * 'a -> 'a t val remove: 'a t * 'a -> 'a t val contains: 'a t * 'a -> bool val isEmpty: 'a t -> bool val toList: 'a t -> 'a list val output: 'a t * Out.t -> unit end mlton-20100608/lib/mlton/set/poly-unordered.fun0000644000076600000240000000336411404435636017747 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PolyUnorderedSet(): POLY_SET = struct structure I = Int structure L = List type 'a info = {equal: 'a * 'a -> bool, output: 'a * Out.t -> unit} datatype 'a t = T of 'a List.t * 'a info fun elts(T(xs, _)) = xs fun empty info = T([], info) fun isEmpty s = List.isEmpty(elts s) fun forall(s, f) = L.forall(elts s, f) fun exists(s, f) = L.exists(elts s, f) fun foreach(s, f) = L.foreach(elts s, f) fun contains(T(elts, {equal, ...}), x) = L.exists(elts, fn x' => equal(x, x')) fun s <= s' = forall(s, fn x => contains(s', x)) fun equal(s, s') = s <= s' andalso s' <= s fun s >= s' = s' <= s val equals = equal fun s < s' = s <= s' andalso exists(s', fn x => not(contains(s, x))) fun s > s' = s' < s fun add(s as T(elts, info), x) = if contains(s, x) then s else T(x :: elts, info) fun subset(T(elts, info), f) = T(L.keepAll(elts, f), info) fun s1 - s2 = subset(s1, fn x => not(contains(s2, x))) fun s1 + (s2 as T(x2s, _)) = let val T(x1s, info) = s1 - s2 in T(L.append(x1s, x2s), info) end (*fun union ss = L.foldl(ss, empty, op +)*) fun intersect(s, s') = subset(s, fn x => contains(s', x)) fun toList(T(xs, _)) = xs fun remove(T(xs, info as {equal, ...}), x) = T(L.remove(xs, fn x' => equal(x, x')), info) fun size(T(xs, _)) = L.length xs (* fun output(T(elts, {output, ...}), out) = let val print = Outstream.outputc out in (print "{" ; L.output(", ", output) (elts, out) ; print "}") end *) end structure PolySet = PolyUnorderedSet() mlton-20100608/lib/mlton/set/poly-unordered2.fun0000644000076600000240000000125311404435636020024 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Set() : sig type 'a t val make: {equal: 'a * 'a -> bool, output: 'a * Out.t -> unit} -> {empty: 'a t, isEmpty: 'a t -> bool, forall: 'a t * ('a -> bool) -> bool, equal: 'a t * 'a t -> bool, ...} end fun make{equal, output} = let val empty = [] fun isEmpty [] = true | isEmpty _ = false val forall = List.forall in {empty = empty, isEmpty = isEmpty, mlton-20100608/lib/mlton/set/README0000644000076600000240000000725611404435636015151 0ustar mtfstaffMethods of implementing sets (not in terms of the underlying representation, but in terms of the public signature). Polymorphic Elements -------------------------------------------------- pass operations on 'a as arguments when needed (e.g. equality when testing for membership) This is bad, because it requires me to construct my own recursive descent functions. Good because it checks types at compile time. Cumbersome, because I must keep passing the helper functions everywhere. What happens if I want a dynamically varying order type of sets? This can't possibly work. Special case -------------------- Use polymorhpism with equality types - this only works if the built in equality function is what you want. Furthermore, it does nothing when you need functions other than equality (e.g. order relations) Monomorphic Elements -------------------------------------------------- Use monomorphism and encode the type of the set in the ML type. This requires a new functor application for each new type of set. Certainly doesn't work if the order type of the set isn't decided until run time. This can get very cumbersome. Good because it checks types at compile time. Also, it "automatically" constructs the proper recursive descent functions when the functors are applied. Bad because I can't even express the types of some functions (e.g. map) without having two different types (structures) around. This would be better if I could get it to automatically infer the appropriate functor applications based on type inference of the code that uses sets. Not quite, not only do I want it to infer the appropriate functor applications, I want it to *share* the results of functor applications corresponding to objects of the same type. Monomorphic Elements in a Universal Datatype -------------------------------------------------- Bad because it doesn't check types at compile time. However, one can build a layer on top that checks the types at run time. This requires a single functor application (if it works at all). This requires the user to build a union type for all objects that might be members of sets. Furthermore, it doesn't even work if I want to include sets as parts of some of my base datatypes. That is, the set and base datatypes can't be mutually recursive. Maybe this isn't a problem. Can I think of an example where I want this?? This gets very cumbersome, because the programmer must constantly inject to and project from the universal datatype. Furthermore, it reduces modularity, because all of the objects that will ever appear in sets must be collected together in one place to define the universal datatype. I bet you pay a pretty good performance hit both in terms of time and space with this approach, because of all of the explicit unions that are constructed. --- Wait a second! Could you get away without constructing these unions in Scheme? How would be sure that you could differentiate among elements? Do you need to be able to differentiate in correct programs, or only to aid in debugging? When do you ever put things in a union and not know what they are??? It seems to me that this happens whenever you have polymorphic functions that aren't parametric, e.g. print. Object Oriented -------------------------------------------------- Monomorphic elements that include the appropriate operations. I don't like this because each element carries its own equality function, but I know I want only a single equality function for the whole type, and I can't enforce (or even express) that they are the same. Other Considerations -------------------------------------------------- Performance implications? How would each of these options work in scheme? What other options are there in scheme? mlton-20100608/lib/mlton/set/set.sig0000644000076600000240000000312211404435636015554 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SET_STRUCTS = sig structure Element: T end signature SET = sig structure Element: T type t val + : t * t -> t val - : t * t -> t val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val add: t * Element.t -> t val areDisjoint: t * t -> bool val contains: t * Element.t -> bool val empty: t val equals: t * t -> bool val exists: t * (Element.t -> bool) -> bool val fold: t * 'a * (Element.t * 'a -> 'a) -> 'a val forall: t * (Element.t -> bool) -> bool val foreach: t * (Element.t -> unit) -> unit (* list must contain no duplicates *) val fromList: Element.t list -> t val intersect: t * t -> t val isEmpty: t -> bool val layout: t -> Layout.t val map: t * (Element.t -> Element.t) -> t val partition: t * (Element.t -> bool) -> {yes: t, no: t} val power: t -> t list val replace: t * (Element.t -> Element.t option) -> t val remove: t * Element.t -> t val singleton: Element.t -> t val size: t -> int val subset: t * (Element.t -> bool) -> t val subsets: t * int -> t list val subsetSize: t * (Element.t -> bool) -> int val toList: t -> Element.t list val union: t * t -> t val unions: t list -> t end mlton-20100608/lib/mlton/set/sources.cm0000644000076600000240000000106611404435636016266 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library signature SET functor BitVectorSet structure DisjointSet functor HashedUniqueSet functor OrderedUniqueSet functor UnorderedSet is ../basic/sources.cm disjoint.sig disjoint.fun set.sig unordered.fun ordered-unique-set.fun #if (defined (SMLNJ_VERSION)) bit-vector-set.fun hashed-unique-set.fun #endif mlton-20100608/lib/mlton/set/sources.mlb0000644000076600000240000000114711404435636016441 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused false" "forceUsed" in local $(SML_LIB)/basis/basis.mlb ../basic/sources.mlb disjoint.sig disjoint.fun set.sig unordered.fun ordered-unique-set.fun in signature SET structure DisjointSet functor OrderedUniqueSet functor UnorderedSet end end mlton-20100608/lib/mlton/set/test.sml0000644000076600000240000000252011404435636015752 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure S = UnorderedUniverse(Integer) structure S = SetEqual(structure Element = Integer) open S val s = listTo[1, 2, 3, 4] val ss = subsets s 3 structure D = DisjointMax(structure Label = struct open Int open IU end) ; open D ; val ss = LU.mapFromTo 0 10 singleton ; val s = LU.nth ss ; LU.map ss eval ; fun u i n = update (s i) n ; fun l i j = link (s i) (s j) ; fun e i = eval (s i) ; l 3 6 ; l 3 7 ; l 8 3 ; l 8 10 ; u 8 11 ; open DisjointCollection ; val (c, ss) = new (LU.fromTo 0 10) ; fun s i = LU.nth ss i ; fun r() = randomSet c ; fun u i j = union c (s i) (s j) ; fun n() = numSets c ; fun v i = value c (s i) ; r() ; n() ; value c (r()) ; LU.map (LU.fromTo 0 10) v ; u 1 2 ; u 2 3 ; u 3 4 ; u 1 3 ; u 2 4 ; open DisjointSet ; val elts = LU.mapFromTo 0 9 singleton ; val n = ListUtil.nth elts ; fun e i j = areEquivalent (n i) (n j) ; fun u i j = union (n i) (n j) ; u 1 3 ; u 2 3 ; e 1 2 ; u 1 3 ; e 1 3 ; u 2 3 ; e 1 3 ; u 2 4 ; u 1 4 ; u 1 3 ; e 1 2 ; u 1 2 ; e 1 2 ; e 1 3 ; u 3 4 ; u 5 6 ; u 1 4 ; e 2 3 ; u 5 1 ; e 6 4 ; u 7 8 ; u 9 0 ; u 8 9 ; u 1 7 ; elts ; mlton-20100608/lib/mlton/set/type.fun0000644000076600000240000000300211404435636015745 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* Type *) (*-------------------------------------------------------------------*) functor Type (): TYPE = struct datatype set = EmptySet | Set of elt and elt = Base | Pair of elt * elt | EltSet of set exception Incompatible fun combineSet(EmptySet, EmptySet) = EmptySet | combineSet(EmptySet, Set t) = Set t | combineSet(Set t, EmptySet) = Set t | combineSet(Set t, Set t') = Set(combineElt(t, t')) and combineElt(Base, Base) = Base | combineElt(Pair(t, t1), Pair(t', t1')) = Pair(combineElt(t, t'), combineElt(t1, t1')) | combineElt(EltSet t, EltSet t') = EltSet(combineSet(t, t')) | combineElt _ = raise Incompatible fun combineToCompat combine a = (combine a ; true) handle Incompatible => false structure Set = struct type t = set val combine = combineSet val areCompatible = combineToCompat combine end structure Elt = struct type t = elt val combine = combineElt val areCompatible = combineToCompat combine end fun combineSetElt(EmptySet, t) = Set t | combineSetElt(Set t, t') = Set(Elt.combine(t, t')) val areCompatibleSetElt = combineToCompat combineSetElt end structure Type = Type() mlton-20100608/lib/mlton/set/type.sig0000644000076600000240000000160411404435636015745 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYPE = sig datatype set = EmptySet | Set of elt and elt = Base | Pair of elt * elt | EltSet of set exception Incompatible structure Set : sig type t sharing type t = set val combine: t * t -> t val areCompatible: t * t -> bool end structure Elt : sig type t sharing type t = elt val combine: t * t -> t val areCompatible: t * t -> bool end val combineSetElt: set * elt -> set val areCompatibleSetElt: set * elt -> bool end mlton-20100608/lib/mlton/set/universe-equal.fun0000644000076600000240000000666611404435636017754 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* SetEqual *) (*-------------------------------------------------------------------*) functor UniverseEqual (Error.: T): UNIVERSE = struct val {error, ...} = Error.errors("set", "set-equal") structure Error.equals Base structure B = Base structure L = List structure O = Outstream structure Elt = struct datatype set = T of t list and t = Error.of Base.t | Pair of t * t | Set of set fun toError.Base b) = b | toError._ = error "Elt.toBase" fun toPair(Pair p) = p | toPair _ = error "Elt.toPair" fun toSet(Set s) = s | toSet _ = error "Elt.toSet" fun equalSet(s, s') = isSubset(s, s') andalso isSubset(s', s) and isSubset(s, s') = forall(s, fn x => contains(s', x)) and contains(T xs, x) = L.exists(xs, fn x' => equalElt(x, x')) and equalElt(Error.b, Base b') = B.equals(b, b') | equalElt(Pair(x, y), Pair(x', y')) = equalElt(x, x') andalso equalElt(y, y') | equalElt(Set s, Set s') = equalSet(s, s') | equalElt _ = false fun outputSet(T xs, out) = let val print = O.outputc out in (print "{" ; L.output(xs, ", ", outputElt, out) ; print "}") end and outputElt(Error.b, out) = Base.output(b, out) | outputElt(Pair(x, y), out) = let val print = O.outputc out in (print "(" ; outputElt(x, out) ; print ", " ; outputElt(y, out) ; print ")") end | outputElt(Set s, out) = outputSet(s, out) val equals = equalElt val output = outputElt end open Elt val equals = equalSet val output = outputSet type t = set fun cross(sx, sy) = let val ys = toList sy in listTo(L.foldl (toList sx, [], fn (ps, x) => L.mapAppend(ys, fn y => Pair(x, y), ps))) end fun project1 s = replace(s, fn Pair(x, _) => SOME x | _ => error "project1") fun project2 s = replace(s, fn Pair(_, y) => SOME y | _ => error "project2") fun update (c, x, y) = let fun update[] = [Pair(x, y)] | update((Pair(x', y')) :: ps) = if Elt.equals(x, x') then (Pair(x, y)) :: ps else (Pair(x', y')) :: (update ps) | update _ = error "update" in listTo(update(toList c)) end fun updateSet(c, c') = L.foldl(toList c', c, fn (c, Pair(x, y)) => update(c, x, y) | _ => error "updateSet") fun lookup (c, x) = let fun lookup [] = NONE | lookup (Pair(x', y) :: ps) = if Elt.equals(x, x') then SOME y else lookup ps | lookup _ = error "lookup" in lookup(toList c) end fun Union s = L.foldl(toList s, empty, fn (s', Set s) => union(s, s') | _ => error "Union") val Union = Trace.trace("Union", outputSet, outputSet) Union (* fun Cross s = listTo(L.map(L.cross(L.map(toList s, toList o Elt.toSet)), Set o listTo)) *) end mlton-20100608/lib/mlton/set/universe-type-check.fun0000644000076600000240000000540711404435636020671 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* SetCheck *) (*-------------------------------------------------------------------*) functor UniverseTypeCheck(U: UNIVERSE): UNIVERSE = struct structure E = U.Element structure T = Type open U structure L = List fun typeOf s = L.foldl(toList s, T.EmptySet, fn (t, x: E.t) => T.Set.combine(t, T.Set(typeOfElt x))) and typeOfElt(Base _) = T.Base | typeOfElt(Pair(x, y)) = T.Pair(typeOfElt x, typeOfElt y) | typeOfElt(Set s) = T.EltSet(typeOf s) fun setElt (name, f) (s, x) = (Error.assert[(T.areCompatibleSetElt(typeOf s, typeOfElt x), name ^ ": incompatible set and element")] ; f(s, x)) val add = setElt("UniverseTypeCheck.add", add) val remove = setElt("UniverseTypeCheck.remove", remove) val contains = setElt("UniverseTypeCheck.contains", contains) fun setSet (name, f) (s, s') = (Error.assert[(T.Set.areCompatible(typeOf s, typeOf s'), name ^ "incompatible sets")] ; f(s, s')) val op - = setSet("UniverseTypeCheck.difference", op -) val op + = setSet("UniverseTypeCheck.union", op +) val intersect = setSet("UniverseTypeCheck.intersect", intersect) val equals = setSet("UniverseTypeCheck.equals", op =) val op <= = setSet("UniverseTypeCheck.<=", op <=) val op >= = setSet("UniverseTypeCheck.>=", op >=) val op < = setSet("UniverseTypeCheck.<", op <) val op > = setSet("UniverseTypeCheck.>", op >) fun isReasonable s = (typeOf s ; true) handle T.Incompatible => false fun returnSet (name, f) a = let val s = f a in (Error.assert[(isReasonable s, name ^ ": invalid set")] ; s) end val replace = returnSet("UniverseTypeCheck.replace", replace) val map = returnSet("UniverseTypeCheck.map", map) val fromList = returnSet("UniverseTypeCheck.fromList", fromList) fun lookup(s, x) = (case typeOf s of T.EmptySet => NONE | T.Set(T.Pair(x', _)) => (T.Elt.combine(x', typeOfElt x) ; U.lookup(s, x)) | _ => Error.error "UniverseTypeCheck.lookup") handle T.Incompatible => Error.error "UniverseTypeCheck.lookup" fun update(s, x, y) = case typeOf s of T.EmptySet => U.update(s, x, y) | T.Set t => (Error.assert[(T.Elt.areCompatible (t, T.Pair(typeOfElt x, typeOfElt y)), "update: incompatible pairs")] ; U.update(s, x, y)) val updateSet = setSet("UniverseTypeCheck.updateSet", updateSet) end mlton-20100608/lib/mlton/set/universe.sig0000644000076600000240000000133311404435636016623 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNIVERSE = sig include SET structure B: T datatype elt = Base of B.t | Pair of elt * elt | Set of t sharing type elt = E.t val toBase: elt -> B.t val toPair: elt -> elt * elt val toSet: elt -> t val cross: t * t -> t val project1: t -> t val project2: t -> t val Union: t -> t (* val Cross: t -> t *) val lookup: t * E.t -> E.t option val update: t * E.t * E.t -> t val updateSet: t * t -> t end mlton-20100608/lib/mlton/set/unordered-universe.fun0000644000076600000240000000646211404435636020626 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (*-------------------------------------------------------------------*) (* SetEqual *) (*-------------------------------------------------------------------*) functor UnorderedUniverse(B: T): UNIVERSE = struct structure B = B structure O = Outstream structure L = ListSet.L structure Rep = struct datatype elt = Base of B.t | Pair of elt * elt | Set of elt ListSet.t type t = elt fun makeEqual equalSet = let fun equalElt(Base b, Base b') = B.equals(b, b') | equalElt(Pair(x, y), Pair(x', y')) = equalElt(x, x') andalso equalElt(y, y') | equalElt(Set s, Set s') = equalSet(s, s') | equalElt _ = false in equalElt end fun makeOutput outputSet = let fun outputElt(Base b, out) = B.output(b, out) | outputElt(Pair(x, y), out) = let val print = O.outputc out in (print "(" ; outputElt(x, out) ; print ", " ; outputElt(y, out) ; print ")") end | outputElt(Set s, out) = outputSet(s, out) in outputElt end end structure S = UnorderedSetMain(Rep) open Rep S fun toBase(Base b) = b | toBase _ = Error.error "UnorderedUniverse.toBase" fun toPair(Pair p) = p | toPair _ = Error.error "UnorderedUniverse.toPair" fun toSet(Set s) = s | toSet _ = Error.error "UnorderedUniverse.toSet" fun cross(sx, sy) = let val ys = toList sy in fromList(L.foldl (toList sx, [], fn (ps, x) => L.mapAppend(ys, fn y => Pair(x, y), ps))) end fun project1 s = replace(s, fn Pair(x, _) => SOME x | _ => Error.error "UnorderedUniverse.project1") fun project2 s = replace(s, fn Pair(_, y) => SOME y | _ => Error.error "UnorderedUniverse.project2") fun update (c, x, y) = let fun update[] = [Pair(x, y)] | update((Pair(x', y')) :: ps) = if E.equals(x, x') then (Pair(x, y)) :: ps else (Pair(x', y')) :: (update ps) | update _ = Error.error "UnorderedUniverse.update" in fromList(update(toList c)) end fun updateSet(c, c') = L.foldl(toList c', c, fn (c, Pair(x, y)) => update(c, x, y) | _ => Error.error "UnorderedUniverse.updateSet") fun lookup (c, x) = let fun lookup [] = NONE | lookup (Pair(x', y) :: ps) = if E.equals(x, x') then SOME y else lookup ps | lookup _ = Error.error "UnorderedUniverse.lookup" in lookup(toList c) end fun Union s = L.foldl(toList s, empty, fn (s', Set s) => s + s' | _ => Error.error "UnorderedUniverse.Union") val Union = Trace.trace("UnorderedUniverse.Union", output, output) Union (* fun Cross s = listTo(L.map(L.cross(L.map(toList s, toList o Elt.toSet)), Set o listTo)) *) end mlton-20100608/lib/mlton/set/unordered.fun0000644000076600000240000000142211404435636016757 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor UnorderedSet (Element: T):> SET where type Element.t = Element.t = struct structure Element = Element open List type t = Element.t List.t val {empty, singleton, size, equals, <=, >=, <, >, +, -, intersect, unions, add, remove, contains, areDisjoint, subset, subsetSize, map, replace, layout} = List.set{equals = Element.equals, layout = Element.layout} val partition = List.partition val power = List.power val subsets = List.subsets val fromList = fn l => List.fold(l, empty, fn (x, s) => add(s, x)) val toList = fn x => x val union = op + end mlton-20100608/lib/mlton/sources.cm0000644000076600000240000000673211404435636015500 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library signature ARRAY signature ENV signature ERROR signature EUCLIDEAN_RING signature INTEGER signature INT_INF signature LIST (* signature MONO_CONTAINER *) signature MONO_ENV signature OPTION signature ORDER signature ORDERED_RING signature POLY_CACHE signature PROMISE signature REAL signature RING signature RING_WITH_IDENTITY signature SET signature STRING signature SUM signature T signature UNIQUE_ID signature VECTOR structure AppendList structure Array structure Array2 structure Assert structure Base64 structure BinarySearch structure Bool structure Buffer structure Byte structure Char (* structure CharArray *) (* structure CharBuffer *) structure CharVector structure ChoicePattern structure ClearablePromise structure CommandLine structure Computation structure Console structure Counter structure Date structure Dir structure DirectedGraph structure DirectedSubGraph structure DisjointSet structure DotColor structure Dot structure Engine structure Error structure Escape structure Exn structure Export structure File structure FileDesc structure FixedPoint structure Function structure HashSet structure Html structure Http structure In structure InitScript structure Int (* structure Int32 *) structure IntInf structure InsertionSort structure INetSock structure Iterate structure Itimer structure Justify structure LargeInt structure LargeWord structure Lines structure List structure Layout structure List (* structure MergeSortList *) (* structure MergeSortVector *) structure MLton structure Net structure Option structure OS structure Out structure Parse structure Pervasive structure Pid structure Pointer structure PolyCache structure Popt structure Port structure Position structure Posix structure Postscript structure Power structure Process structure Promise structure Property structure PropertyList structure Queue structure QuickSort structure Random structure RDB structure Reader structure Real (* structure RealVector *) structure Real32 structure Real64 structure Ref structure Regexp structure Relation structure ResizableArray structure Result structure Sexp structure Signal structure SMLofNJ structure Socket structure Stream structure String structure StringCvt structure Substring structure SysWord structure Thread structure Time structure Timer structure Trace structure Tree structure TwoListQueue structure Unimplemented structure Unit structure Unsafe structure Url structure Vector structure Word structure Word8 (* structure Word8Array *) (* structure Word8ArraySlice *) (* structure Word8Vector *) (* structure Word16 *) (* structure Word32 *) functor AlphaBeta (* functor BinaryHeap *) functor BitVectorSet functor Cache functor Control functor Env functor EuclideanRing functor HashedUniqueSet functor IntUniqueId functor MakeMonoEnv functor MonoArray functor MonoList functor MonoEnv functor MonoList functor MonoOption functor MonoVector functor MoveToFrontEnv functor OrderedField functor OrderedUniqueSet functor Pair functor PolyEnv functor Ring functor RingWithIdentity (* functor SplayMonoEnv *) functor Sum functor Tree functor UniqueId functor UniqueSet functor UnorderedSet is basic/sources.cm set/sources.cm env/sources.cm #if (defined (SMLNJ_VERSION)) directed-graph/sources.cm #endif mlton-20100608/lib/mlton/sources.mlb0000644000076600000240000000667011404435636015654 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "forceUsed" in local basic/sources.mlb set/sources.mlb env/sources.mlb in signature ARRAY signature ENV signature ERROR signature EUCLIDEAN_RING signature INTEGER signature INT_INF signature LIST (* signature MONO_CONTAINER *) signature MONO_ENV signature OPTION signature ORDER signature ORDERED_RING signature POLY_CACHE signature PROMISE signature REAL signature RING signature RING_WITH_IDENTITY signature SET signature STRING signature T signature UNIQUE_ID signature VECTOR structure AppendList structure Array structure Array2 structure Assert structure Base64 structure BinarySearch structure Bool structure Buffer structure Char (* structure CharArray *) structure CharVector structure ChoicePattern structure ClearablePromise structure CommandLine structure Computation structure Counter structure Date structure Dir structure DirectedGraph structure DisjointSet structure DotColor structure Dot structure Error structure Escape structure Exn structure File structure FileDesc structure FixedPoint structure Function structure HashSet (* structure Http *) structure In structure Int (* structure Int32 *) structure IntInf structure InsertionSort structure Justify structure LargeInt structure LargeWord structure Layout structure List (* structure MergeSortList *) (* structure MergeSortVector *) structure MLton structure Option structure OS structure Out structure Pervasive structure Pid structure PolyCache structure Popt structure Position structure Power structure Process structure Promise structure Property structure PropertyList structure Queue structure QuickSort structure Random structure Real (* structure RealVector *) structure Real32 structure Real64 structure Ref structure Regexp structure Relation structure Result structure Sexp structure Signal structure SMLofNJ structure Stream structure String structure StringCvt structure Substring structure SysWord structure Time structure Trace structure Tree structure TwoListQueue structure Unit structure Vector structure Word structure Word8 (* structure Word8Array *) (* structure Word8Vector *) (* structure Word32 *) (* functor BinaryHeap *) functor Control functor Env functor EuclideanRing functor IntUniqueId functor MakeMonoEnv functor MonoArray functor MonoEnv functor MonoVector functor OrderedField functor OrderedUniqueSet functor PolyEnv functor Ring functor RingWithIdentity functor Tree functor UniqueId functor UniqueSet functor UnorderedSet $(SML_LIB)/basis/pervasive.mlb end end mlton-20100608/lib/mlyacc-lib/0000755000076600000240000000000011404470407014342 5ustar mtfstaffmlton-20100608/lib/mlyacc-lib/base.sig0000644000076600000240000002412111404435637015766 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* base.sig: Base signature file for SML-Yacc. This file contains signatures that must be loaded before any of the files produced by ML-Yacc are loaded *) (* STREAM: signature for a lazy stream.*) signature STREAM = sig type 'xa stream val streamify : (unit -> '_a) -> '_a stream val cons : '_a * '_a stream -> '_a stream val get : '_a stream -> '_a * '_a stream end (* LR_TABLE: signature for an LR Table. The list of actions and gotos passed to mkLrTable must be ordered by state number. The values for state 0 are the first in the list, the values for state 1 are next, etc. *) signature LR_TABLE = sig datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype state = STATE of int datatype term = T of int datatype nonterm = NT of int datatype action = SHIFT of state | REDUCE of int | ACCEPT | ERROR type table val numStates : table -> int val numRules : table -> int val describeActions : table -> state -> (term,action) pairlist * action val describeGoto : table -> state -> (nonterm,state) pairlist val action : table -> state * term -> action val goto : table -> state * nonterm -> state val initialState : table -> state exception Goto of state * nonterm val mkLrTable : {actions : ((term,action) pairlist * action) array, gotos : (nonterm,state) pairlist array, numStates : int, numRules : int, initialState : state} -> table end (* TOKEN: signature revealing the internal structure of a token. This signature TOKEN distinct from the signature {parser name}_TOKENS produced by ML-Yacc. The {parser name}_TOKENS structures contain some types and functions to construct tokens from values and positions. The representation of token was very carefully chosen here to allow the polymorphic parser to work without knowing the types of semantic values or line numbers. This has had an impact on the TOKENS structure produced by SML-Yacc, which is a structure parameter to lexer functors. We would like to have some type 'a token which functions to construct tokens would create. A constructor function for a integer token might be INT: int * 'a * 'a -> 'a token. This is not possible because we need to have tokens with the representation given below for the polymorphic parser. Thus our constructur functions for tokens have the form: INT: int * 'a * 'a -> (svalue,'a) token This in turn has had an impact on the signature that lexers for SML-Yacc must match and the types that a user must declare in the user declarations section of lexers. *) signature TOKEN = sig structure LrTable : LR_TABLE datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken : ('a,'b) token * ('a,'b) token -> bool end (* LR_PARSER: signature for a polymorphic LR parser *) signature LR_PARSER = sig structure Stream: STREAM structure LrTable : LR_TABLE structure Token : TOKEN sharing LrTable = Token.LrTable exception ParseError val parse : {table : LrTable.table, lexer : ('_b,'_c) Token.token Stream.stream, arg: 'arg, saction : int * '_c * (LrTable.state * ('_b * '_c * '_c)) list * 'arg -> LrTable.nonterm * ('_b * '_c * '_c) * ((LrTable.state *('_b * '_c * '_c)) list), void : '_b, ec : { is_keyword : LrTable.term -> bool, noShift : LrTable.term -> bool, preferred_change : (LrTable.term list * LrTable.term list) list, errtermvalue : LrTable.term -> '_b, showTerminal : LrTable.term -> string, terms: LrTable.term list, error : string * '_c * '_c -> unit }, lookahead : int (* max amount of lookahead used in *) (* error correction *) } -> '_b * (('_b,'_c) Token.token Stream.stream) end (* LEXER: a signature that most lexers produced for use with SML-Yacc's output will match. The user is responsible for declaring type token, type pos, and type svalue in the UserDeclarations section of a lexer. Note that type token is abstract in the lexer. This allows SML-Yacc to create a TOKENS signature for use with lexers produced by ML-Lex that treats the type token abstractly. Lexers that are functors parametrized by a Tokens structure matching a TOKENS signature cannot examine the structure of tokens. *) signature LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue end val makeLexer : (int -> string) -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* ARG_LEXER: the %arg option of ML-Lex allows users to produce lexers which also take an argument before yielding a function from unit to a token *) signature ARG_LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue type arg end val makeLexer : (int -> string) -> UserDeclarations.arg -> unit -> (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token end (* PARSER_DATA: the signature of ParserData structures in {parser name}LrValsFun produced by SML-Yacc. All such structures match this signature. The {parser name}LrValsFun produces a structure which contains all the values except for the lexer needed to call the polymorphic parser mentioned before. *) signature PARSER_DATA = sig (* the type of line numbers *) type pos (* the type of semantic values *) type svalue (* the type of the user-supplied argument to the parser *) type arg (* the intended type of the result of the parser. This value is produced by applying extract from the structure Actions to the final semantic value resultiing from a parse. *) type result structure LrTable : LR_TABLE structure Token : TOKEN sharing Token.LrTable = LrTable (* structure Actions contains the functions which mantain the semantic values stack in the parser. Void is used to provide a default value for the semantic stack. *) structure Actions : sig val actions : int * pos * (LrTable.state * (svalue * pos * pos)) list * arg-> LrTable.nonterm * (svalue * pos * pos) * ((LrTable.state *(svalue * pos * pos)) list) val void : svalue val extract : svalue -> result end (* structure EC contains information used to improve error recovery in an error-correcting parser *) structure EC : sig val is_keyword : LrTable.term -> bool val noShift : LrTable.term -> bool val preferred_change : (LrTable.term list * LrTable.term list) list val errtermvalue : LrTable.term -> svalue val showTerminal : LrTable.term -> string val terms: LrTable.term list end (* table is the LR table for the parser *) val table : LrTable.table end (* signature PARSER is the signature that most user parsers created by SML-Yacc will match. *) signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError (* type pos is the type of line numbers *) type pos (* type result is the type of the result from the parser *) type result (* the type of the user-supplied argument to the parser *) type arg (* type svalue is the type of semantic values for the semantic value stack *) type svalue (* val makeLexer is used to create a stream of tokens for the parser *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream (* val parse takes a stream of tokens and a function to print errors and returns a value of type result and a stream containing the unused tokens *) val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end (* signature ARG_PARSER is the signature that will be matched by parsers whose lexer takes an additional argument. *) signature ARG_PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type arg type lexarg type pos type result type svalue val makeLexer : (int -> string) -> lexarg -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end mlton-20100608/lib/mlyacc-lib/join.sml0000644000076600000240000000753611404435637016037 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* functor Join creates a user parser by putting together a Lexer structure, an LrValues structure, and a polymorphic parser structure. Note that the Lexer and LrValues structure must share the type pos (i.e. the type of line numbers), the type svalues for semantic values, and the type of tokens. *) functor Join(structure Lex : LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = LrParser.Stream.streamify o Lex.makeLexer val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end (* functor JoinWithArg creates a variant of the parser structure produced above. In this case, the makeLexer take an additional argument before yielding a value of type unit -> (svalue,pos) token *) functor JoinWithArg(structure Lex : ARG_LEXER structure ParserData: PARSER_DATA structure LrParser : LR_PARSER sharing ParserData.LrTable = LrParser.LrTable sharing ParserData.Token = LrParser.Token sharing type Lex.UserDeclarations.svalue = ParserData.svalue sharing type Lex.UserDeclarations.pos = ParserData.pos sharing type Lex.UserDeclarations.token = ParserData.Token.token) : ARG_PARSER = struct structure Token = ParserData.Token structure Stream = LrParser.Stream exception ParseError = LrParser.ParseError type arg = ParserData.arg type lexarg = Lex.UserDeclarations.arg type pos = ParserData.pos type result = ParserData.result type svalue = ParserData.svalue val makeLexer = fn s => fn arg => LrParser.Stream.streamify (Lex.makeLexer s arg) val parse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (ParserData.Actions.extract a,b)) (LrParser.parse {table = ParserData.table, lexer=lexer, lookahead=lookahead, saction = ParserData.Actions.actions, arg=arg, void= ParserData.Actions.void, ec = {is_keyword = ParserData.EC.is_keyword, noShift = ParserData.EC.noShift, preferred_change = ParserData.EC.preferred_change, errtermvalue = ParserData.EC.errtermvalue, error=error, showTerminal = ParserData.EC.showTerminal, terms = ParserData.EC.terms}} ) val sameToken = Token.sameToken end; mlton-20100608/lib/mlyacc-lib/lrtable.sml0000644000076600000240000000500111404435637016506 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) structure LrTable : LR_TABLE = struct open Array List infix 9 sub datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype term = T of int datatype nonterm = NT of int datatype state = STATE of int datatype action = SHIFT of state | REDUCE of int (* rulenum from grammar *) | ACCEPT | ERROR exception Goto of state * nonterm type table = {states: int, rules : int,initialState: state, action: ((term,action) pairlist * action) array, goto : (nonterm,state) pairlist array} val numStates = fn ({states,...} : table) => states val numRules = fn ({rules,...} : table) => rules val describeActions = fn ({action,...} : table) => fn (STATE s) => action sub s val describeGoto = fn ({goto,...} : table) => fn (STATE s) => goto sub s fun findTerm (T term,row,default) = let fun find (PAIR (T key,data,r)) = if key < term then find r else if key=term then data else default | find EMPTY = default in find row end fun findNonterm (NT nt,row) = let fun find (PAIR (NT key,data,r)) = if key < nt then find r else if key=nt then SOME data else NONE | find EMPTY = NONE in find row end val action = fn ({action,...} : table) => fn (STATE state,term) => let val (row,default) = action sub state in findTerm(term,row,default) end val goto = fn ({goto,...} : table) => fn (a as (STATE state,nonterm)) => case findNonterm(nonterm,goto sub state) of SOME state => state | NONE => raise (Goto a) val initialState = fn ({initialState,...} : table) => initialState val mkLrTable = fn {actions,gotos,initialState,numStates,numRules} => ({action=actions,goto=gotos, states=numStates, rules=numRules, initialState=initialState} : table) end; mlton-20100608/lib/mlyacc-lib/ml-yacc-lib.cm0000644000076600000240000000066611404435637016772 0ustar mtfstaff(* sources file for ML-Yacc library *) Library signature STREAM signature LR_TABLE signature TOKEN signature LR_PARSER signature LEXER signature ARG_LEXER signature PARSER_DATA signature PARSER signature ARG_PARSER functor Join functor JoinWithArg structure LrTable structure Stream structure LrParser is #if defined(NEW_CM) $/basis.cm #endif base.sig join.sml lrtable.sml stream.sml parser2.sml (* error correcting version *) mlton-20100608/lib/mlyacc-lib/mlyacc-lib.mlb0000644000076600000240000000147711404435637017071 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) ann "sequenceNonUnit warn" "nonexhaustiveMatch warn" "redundantMatch warn" "warnUnused false" "forceUsed" in local $(SML_LIB)/basis/basis.mlb base.sig join.sml lrtable.sml stream.sml parser2.sml (* error correcting version *) in signature STREAM signature LR_TABLE signature TOKEN signature LR_PARSER signature LEXER signature ARG_LEXER signature PARSER_DATA signature PARSER signature ARG_PARSER functor Join functor JoinWithArg structure LrTable structure Stream structure LrParser end end mlton-20100608/lib/mlyacc-lib/parser1.sml0000644000076600000240000000744711404435637016456 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* drt (12/15/89) -- the functor should be used during development work, but it is wastes space in the release version. functor ParserGen(structure LrTable : LR_TABLE structure Stream : STREAM) : LR_PARSER = *) structure LrParser :> LR_PARSER = struct val print = fn s => output(std_out,s) val println = fn s => (print s; print "\n") structure LrTable = LrTable structure Stream = Stream structure Token : TOKEN = struct structure LrTable = LrTable datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken = fn (TOKEN (t,_),TOKEN(t',_)) => t=t' end open LrTable open Token val DEBUG = false exception ParseError type ('a,'b) elem = (state * ('a * 'b * 'b)) type ('a,'b) stack = ('a,'b) elem list val showState = fn (STATE s) => ("STATE " ^ (makestring s)) fun printStack(stack: ('a,'b) elem list, n: int) = case stack of (state, _) :: rest => (print(" " ^ makestring n ^ ": "); println(showState state); printStack(rest, n+1) ) | nil => () val parse = fn {arg : 'a, table : LrTable.table, lexer : ('_b,'_c) token Stream.stream, saction : int * '_c * ('_b,'_c) stack * 'a -> nonterm * ('_b * '_c * '_c) * ('_b,'_c) stack, void : '_b, ec = {is_keyword,preferred_change, errtermvalue,showTerminal, error,terms,noShift}, lookahead} => let fun prAction(stack as (state, _) :: _, next as (TOKEN (term,_),_), action) = (println "Parse: state stack:"; printStack(stack, 0); print(" state=" ^ showState state ^ " next=" ^ showTerminal term ^ " action=" ); case action of SHIFT s => println ("SHIFT " ^ showState s) | REDUCE i => println ("REDUCE " ^ (makestring i)) | ERROR => println "ERROR" | ACCEPT => println "ACCEPT"; action) | prAction (_,_,action) = action val action = LrTable.action table val goto = LrTable.goto table fun parseStep(next as (TOKEN (terminal, value as (_,leftPos,_)),lexer) : ('_b,'_c) token * ('_b,'_c) token Stream.stream, stack as (state,_) :: _ : ('_b ,'_c) stack) = case (if DEBUG then prAction(stack, next,action(state, terminal)) else action(state, terminal)) of SHIFT s => parseStep(Stream.get lexer, (s,value) :: stack) | REDUCE i => let val (nonterm,value,stack as (state,_) :: _ ) = saction(i,leftPos,stack,arg) in parseStep(next,(goto(state,nonterm),value)::stack) end | ERROR => let val (_,leftPos,rightPos) = value in error("syntax error\n",leftPos,rightPos); raise ParseError end | ACCEPT => let val (_,(topvalue,_,_)) :: _ = stack val (token,restLexer) = next in (topvalue,Stream.cons(token,lexer)) end val next as (TOKEN (terminal,(_,leftPos,_)),_) = Stream.get lexer in parseStep(next,[(initialState table,(void,leftPos,leftPos))]) end end; mlton-20100608/lib/mlyacc-lib/parser2.sml0000644000076600000240000005453411404435637016456 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* parser.sml: This is a parser driver for LR tables with an error-recovery routine added to it. The routine used is described in detail in this article: 'A Practical Method for LR and LL Syntactic Error Diagnosis and Recovery', by M. Burke and G. Fisher, ACM Transactions on Programming Langauges and Systems, Vol. 9, No. 2, April 1987, pp. 164-197. This program is an implementation is the partial, deferred method discussed in the article. The algorithm and data structures used in the program are described below. This program assumes that all semantic actions are delayed. A semantic action should produce a function from unit -> value instead of producing the normal value. The parser returns the semantic value on the top of the stack when accept is encountered. The user can deconstruct this value and apply the unit -> value function in it to get the answer. It also assumes that the lexer is a lazy stream. Data Structures: ---------------- * The parser: The state stack has the type (state * (semantic value * line # * line #)) list The parser keeps a queue of (state stack * lexer pair). A lexer pair consists of a terminal * value pair and a lexer. This allows the parser to reconstruct the states for terminals to the left of a syntax error, and attempt to make error corrections there. The queue consists of a pair of lists (x,y). New additions to the queue are cons'ed onto y. The first element of x is the top of the queue. If x is nil, then y is reversed and used in place of x. Algorithm: ---------- * The steady-state parser: This parser keeps the length of the queue of state stacks at a steady state by always removing an element from the front when another element is placed on the end. It has these arguments: stack: current stack queue: value of the queue lexPair ((terminal,value),lex stream) When SHIFT is encountered, the state to shift to and the value are are pushed onto the state stack. The state stack and lexPair are placed on the queue. The front element of the queue is removed. When REDUCTION is encountered, the rule is applied to the current stack to yield a triple (nonterm,value,new stack). A new stack is formed by adding (goto(top state of stack,nonterm),value) to the stack. When ACCEPT is encountered, the top value from the stack and the lexer are returned. When an ERROR is encountered, fixError is called. FixError takes the arguments to the parser, fixes the error if possible and returns a new set of arguments. * The distance-parser: This parser includes an additional argument distance. It pushes elements on the queue until it has parsed distance tokens, or an ACCEPT or ERROR occurs. It returns a stack, lexer, the number of tokens left unparsed, a queue, and an action option. *) signature FIFO = sig type 'a queue val empty : 'a queue exception Empty val get : 'a queue -> 'a * 'a queue val put : 'a * 'a queue -> 'a queue end (* drt (12/15/89) -- the functor should be used in development work, but it wastes space in the release version. functor ParserGen(structure LrTable : LR_TABLE structure Stream : STREAM) : LR_PARSER = *) structure LrParser :> LR_PARSER = struct structure LrTable = LrTable structure Stream = Stream fun eqT (LrTable.T i, LrTable.T i') = i = i' structure Token : TOKEN = struct structure LrTable = LrTable datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken = fn (TOKEN(t,_),TOKEN(t',_)) => eqT (t,t') end open LrTable open Token val DEBUG1 = false val DEBUG2 = false exception ParseError exception ParseImpossible of int structure Fifo :> FIFO = struct type 'a queue = ('a list * 'a list) val empty = (nil,nil) exception Empty fun get(a::x, y) = (a, (x,y)) | get(nil, nil) = raise Empty | get(nil, y) = get(rev y, nil) fun put(a,(x,y)) = (x,a::y) end type ('a,'b) elem = (state * ('a * 'b * 'b)) type ('a,'b) stack = ('a,'b) elem list type ('a,'b) lexv = ('a,'b) token type ('a,'b) lexpair = ('a,'b) lexv * (('a,'b) lexv Stream.stream) type ('a,'b) distanceParse = ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int -> ('a,'b) lexpair * ('a,'b) stack * (('a,'b) stack * ('a,'b) lexpair) Fifo.queue * int * action option type ('a,'b) ecRecord = {is_keyword : term -> bool, preferred_change : (term list * term list) list, error : string * 'b * 'b -> unit, errtermvalue : term -> 'a, terms : term list, showTerminal : term -> string, noShift : term -> bool} local val print = fn s => TextIO.output(TextIO.stdOut,s) val println = fn s => (print s; print "\n") val showState = fn (STATE s) => "STATE " ^ (Int.toString s) in fun printStack(stack: ('a,'b) stack, n: int) = case stack of (state,_) :: rest => (print("\t" ^ Int.toString n ^ ": "); println(showState state); printStack(rest, n+1)) | nil => () fun prAction showTerminal (stack as (state,_) :: _, next as (TOKEN (term,_),_), action) = (println "Parse: state stack:"; printStack(stack, 0); print(" state=" ^ showState state ^ " next=" ^ showTerminal term ^ " action=" ); case action of SHIFT state => println ("SHIFT " ^ (showState state)) | REDUCE i => println ("REDUCE " ^ (Int.toString i)) | ERROR => println "ERROR" | ACCEPT => println "ACCEPT") | prAction _ (_,_,action) = () end (* ssParse: parser which maintains the queue of (state * lexvalues) in a steady-state. It takes a table, showTerminal function, saction function, and fixError function. It parses until an ACCEPT is encountered, or an exception is raised. When an error is encountered, fixError is called with the arguments of parseStep (lexv,stack,and queue). It returns the lexv, and a new stack and queue adjusted so that the lexv can be parsed *) val ssParse = fn (table,showTerminal,saction,fixError,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(args as (lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue)) = let val nextAction = action (state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer val (_,newQueue) =Fifo.get(Fifo.put((newStack,newLexPair), queue)) in parseStep(newLexPair,(s,value)::stack,newQueue) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue) | _ => raise (ParseImpossible 197)) | ERROR => parseStep(fixError args) | ACCEPT => (case stack of (_,(topvalue,_,_)) :: _ => let val (token,restLexer) = lexPair in (topvalue,Stream.cons(token,restLexer)) end | _ => raise (ParseImpossible 202)) end | parseStep _ = raise (ParseImpossible 204) in parseStep end (* distanceParse: parse until n tokens are shifted, or accept or error are encountered. Takes a table, showTerminal function, and semantic action function. Returns a parser which takes a lexPair (lex result * lexer), a state stack, a queue, and a distance (must be > 0) to parse. The parser returns a new lex-value, a stack with the nth token shifted on top, a queue, a distance, and action option. *) val distanceParse = fn (table,showTerminal,saction,arg) => let val prAction = prAction showTerminal val action = LrTable.action table val goto = LrTable.goto table fun parseStep(lexPair,stack,queue,0) = (lexPair,stack,queue,0,NONE) | parseStep(lexPair as (TOKEN (terminal, value as (_,leftPos,_)), lexer ), stack as (state,_) :: _, queue,distance) = let val nextAction = action(state,terminal) val _ = if DEBUG1 then prAction(stack,lexPair,nextAction) else () in case nextAction of SHIFT s => let val newStack = (s,value) :: stack val newLexPair = Stream.get lexer in parseStep(newLexPair,(s,value)::stack, Fifo.put((newStack,newLexPair),queue),distance-1) end | REDUCE i => (case saction(i,leftPos,stack,arg) of (nonterm,value,stack as (state,_) :: _) => parseStep(lexPair,(goto(state,nonterm),value)::stack, queue,distance) | _ => raise (ParseImpossible 240)) | ERROR => (lexPair,stack,queue,distance,SOME nextAction) | ACCEPT => (lexPair,stack,queue,distance,SOME nextAction) end | parseStep _ = raise (ParseImpossible 242) in parseStep : ('_a,'_b) distanceParse end (* mkFixError: function to create fixError function which adjusts parser state so that parse may continue in the presence of an error *) fun mkFixError({is_keyword,terms,errtermvalue, preferred_change,noShift, showTerminal,error,...} : ('_a,'_b) ecRecord, distanceParse : ('_a,'_b) distanceParse, minAdvance,maxAdvance) (lexv as (TOKEN (term,value as (_,leftPos,_)),_),stack,queue) = let val _ = if DEBUG2 then error("syntax error found at " ^ (showTerminal term), leftPos,leftPos) else () fun tokAt(t,p) = TOKEN(t,(errtermvalue t,p,p)) val minDelta = 3 (* pull all the state * lexv elements from the queue *) val stateList = let fun f q = let val (elem,newQueue) = Fifo.get q in elem :: (f newQueue) end handle Fifo.Empty => nil in f queue end (* now number elements of stateList, giving distance from error token *) val (_, numStateList) = List.foldr (fn (a,(num,r)) => (num+1,(a,num)::r)) (0, []) stateList (* Represent the set of potential changes as a linked list. Values of datatype Change hold information about a potential change. oper = oper to be applied pos = the # of the element in stateList that would be altered. distance = the number of tokens beyond the error token which the change allows us to parse. new = new terminal * value pair at that point orig = original terminal * value pair at the point being changed. *) datatype ('a,'b) change = CHANGE of {pos : int, distance : int, leftPos: 'b, rightPos: 'b, new : ('a,'b) lexv list, orig : ('a,'b) lexv list} val showTerms = concat o map (fn TOKEN(t,_) => " " ^ showTerminal t) val printChange = fn c => let val CHANGE {distance,new,orig,pos,...} = c in (print ("{distance= " ^ (Int.toString distance)); print (",orig ="); print(showTerms orig); print (",new ="); print(showTerms new); print (",pos= " ^ (Int.toString pos)); print "}\n") end val printChangeList = app printChange (* parse: given a lexPair, a stack, and the distance from the error token, return the distance past the error token that we are able to parse.*) fun parse (lexPair,stack,queuePos : int) = case distanceParse(lexPair,stack,Fifo.empty,queuePos+maxAdvance+1) of (_,_,_,distance,SOME ACCEPT) => if maxAdvance-distance-1 >= 0 then maxAdvance else maxAdvance-distance-1 | (_,_,_,distance,_) => maxAdvance - distance - 1 (* catList: concatenate results of scanning list *) fun catList l f = List.foldr (fn(a,r)=> f a @ r) [] l fun keywordsDelta new = if List.exists (fn(TOKEN(t,_))=>is_keyword t) new then minDelta else 0 fun tryChange{lex,stack,pos,leftPos,rightPos,orig,new} = let val lex' = List.foldr (fn (t',p)=>(t',Stream.cons p)) lex new val distance = parse(lex',stack,pos+length new-length orig) in if distance >= minAdvance + keywordsDelta new then [CHANGE{pos=pos,leftPos=leftPos,rightPos=rightPos, distance=distance,orig=orig,new=new}] else [] end (* tryDelete: Try to delete n terminals. Return single-element [success] or nil. Do not delete unshiftable terminals. *) fun tryDelete n ((stack,lexPair as (TOKEN(term,(_,l,r)),_)),qPos) = let fun del(0,accum,left,right,lexPair) = tryChange{lex=lexPair,stack=stack, pos=qPos,leftPos=left,rightPos=right, orig=rev accum, new=[]} | del(n,accum,left,right,(tok as TOKEN(term,(_,_,r)),lexer)) = if noShift term then [] else del(n-1,tok::accum,left,r,Stream.get lexer) in del(n,[],l,r,lexPair) end (* tryInsert: try to insert tokens before the current terminal; return a list of the successes *) fun tryInsert((stack,lexPair as (TOKEN(_,(_,l,_)),_)),queuePos) = catList terms (fn t => tryChange{lex=lexPair,stack=stack, pos=queuePos,orig=[],new=[tokAt(t,l)], leftPos=l,rightPos=l}) (* trySubst: try to substitute tokens for the current terminal; return a list of the successes *) fun trySubst ((stack,lexPair as (orig as TOKEN (term,(_,l,r)),lexer)), queuePos) = if noShift term then [] else catList terms (fn t => tryChange{lex=Stream.get lexer,stack=stack, pos=queuePos, leftPos=l,rightPos=r,orig=[orig], new=[tokAt(t,r)]}) (* do_delete(toks,lexPair) tries to delete tokens "toks" from "lexPair". If it succeeds, returns SOME(toks',l,r,lp), where toks' is the actual tokens (with positions and values) deleted, (l,r) are the (leftmost,rightmost) position of toks', lp is what remains of the stream after deletion *) fun do_delete(nil,lp as (TOKEN(_,(_,l,_)),_)) = SOME(nil,l,l,lp) | do_delete([t],(tok as TOKEN(t',(_,l,r)),lp')) = if eqT (t, t') then SOME([tok],l,r,Stream.get lp') else NONE | do_delete(t::rest,(tok as TOKEN(t',(_,l,r)),lp')) = if eqT (t,t') then case do_delete(rest,Stream.get lp') of SOME(deleted,l',r',lp'') => SOME(tok::deleted,l,r',lp'') | NONE => NONE else NONE fun tryPreferred((stack,lexPair),queuePos) = catList preferred_change (fn (delete,insert) => if List.exists noShift delete then [] (* should give warning at parser-generation time *) else case do_delete(delete,lexPair) of SOME(deleted,l,r,lp) => tryChange{lex=lp,stack=stack,pos=queuePos, leftPos=l,rightPos=r,orig=deleted, new=map (fn t=>(tokAt(t,r))) insert} | NONE => []) val changes = catList numStateList tryPreferred @ catList numStateList tryInsert @ catList numStateList trySubst @ catList numStateList (tryDelete 1) @ catList numStateList (tryDelete 2) @ catList numStateList (tryDelete 3) val findMaxDist = fn l => foldr (fn (CHANGE {distance,...},high) => Int.max(distance,high)) 0 l (* maxDist: max distance past error taken that we could parse *) val maxDist = findMaxDist changes (* remove changes which did not parse maxDist tokens past the error token *) val changes = catList changes (fn(c as CHANGE{distance,...}) => if distance=maxDist then [c] else []) in case changes of (l as change :: _) => let fun print_msg (CHANGE {new,orig,leftPos,rightPos,...}) = let val s = case (orig,new) of (_::_,[]) => "deleting " ^ (showTerms orig) | ([],_::_) => "inserting " ^ (showTerms new) | _ => "replacing " ^ (showTerms orig) ^ " with " ^ (showTerms new) in error ("syntax error: " ^ s,leftPos,rightPos) end val _ = (if length l > 1 andalso DEBUG2 then (print "multiple fixes possible; could fix it by:\n"; app print_msg l; print "chosen correction:\n") else (); print_msg change) (* findNth: find nth queue entry from the error entry. Returns the Nth queue entry and the portion of the queue from the beginning to the nth-1 entry. The error entry is at the end of the queue. Examples: queue = a b c d e findNth 0 = (e,a b c d) findNth 1 = (d,a b c) *) val findNth = fn n => let fun f (h::t,0) = (h,rev t) | f (h::t,n) = f(t,n-1) | f (nil,_) = let exception FindNth in raise FindNth end in f (rev stateList,n) end val CHANGE {pos,orig,new,...} = change val (last,queueFront) = findNth pos val (stack,lexPair) = last val lp1 = foldl(fn (_,(_,r)) => Stream.get r) lexPair orig val lp2 = foldr(fn(t,r)=>(t,Stream.cons r)) lp1 new val restQueue = Fifo.put((stack,lp2), foldl Fifo.put Fifo.empty queueFront) val (lexPair,stack,queue,_,_) = distanceParse(lp2,stack,restQueue,pos) in (lexPair,stack,queue) end | nil => (error("syntax error found at " ^ (showTerminal term), leftPos,leftPos); raise ParseError) end val parse = fn {arg,table,lexer,saction,void,lookahead, ec=ec as {showTerminal,...} : ('_a,'_b) ecRecord} => let val distance = 15 (* defer distance tokens *) val minAdvance = 1 (* must parse at least 1 token past error *) val maxAdvance = Int.max(lookahead,0)(* max distance for parse check *) val lexPair = Stream.get lexer val (TOKEN (_,(_,leftPos,_)),_) = lexPair val startStack = [(initialState table,(void,leftPos,leftPos))] val startQueue = Fifo.put((startStack,lexPair),Fifo.empty) val distanceParse = distanceParse(table,showTerminal,saction,arg) val fixError = mkFixError(ec,distanceParse,minAdvance,maxAdvance) val ssParse = ssParse(table,showTerminal,saction,fixError,arg) fun loop (lexPair,stack,queue,_,SOME ACCEPT) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,0,_) = ssParse(lexPair,stack,queue) | loop (lexPair,stack,queue,distance,SOME ERROR) = let val (lexPair,stack,queue) = fixError(lexPair,stack,queue) in loop (distanceParse(lexPair,stack,queue,distance)) end | loop _ = let exception ParseInternal in raise ParseInternal end in loop (distanceParse(lexPair,startStack,startQueue,distance)) end end; mlton-20100608/lib/mlyacc-lib/stream.sml0000644000076600000240000000100511404435637016354 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* Stream: a structure implementing a lazy stream. The signature STREAM is found in base.sig *) structure Stream :> STREAM = struct datatype 'a str = EVAL of 'a * 'a str ref | UNEVAL of (unit->'a) type 'a stream = 'a str ref fun get(ref(EVAL t)) = t | get(s as ref(UNEVAL f)) = let val t = (f(), ref(UNEVAL f)) in s := EVAL t; t end fun streamify f = ref(UNEVAL f) fun cons(a,s) = ref(EVAL(a,s)) end; mlton-20100608/lib/smlnj-lib/0000755000076600000240000000000011404470407014215 5ustar mtfstaffmlton-20100608/lib/smlnj-lib/.ignore0000644000076600000240000000001211404435635015476 0ustar mtfstaffsmlnj-lib mlton-20100608/lib/smlnj-lib/Makefile0000644000076600000240000000151711404435635015665 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: smlnj-lib/README.mlton smlnj-lib/README.mlton: smlnj-lib.tgz smlnj-lib.patch rm -rf smlnj-lib gzip -dc smlnj-lib.tgz | tar xf - chmod -R a+r smlnj-lib chmod -R g-s smlnj-lib rm -f smlnj-lib/HTML/.cvsignore patch -s -d smlnj-lib -p1 < smlnj-lib.patch mv smlnj-lib/LICENSE ../../doc/license/SMLNJ-LIB-LICENSE .PHONY: clean clean: ../../bin/clean .PHONY: patch patch: mv smlnj-lib smlnj-lib-mlton gzip -dc smlnj-lib.tgz | tar xf - diff -Naur smlnj-lib smlnj-lib-mlton >smlnj-lib.patch || exit 0 rm -rf smlnj-lib mv smlnj-lib-mlton smlnj-lib mlton-20100608/lib/smlnj-lib/smlnj-lib.patch0000644000076600000240000120607211404435635017141 0ustar mtfstaffdiff -N -C 2 -r smlnj-lib/Controls/controls-lib.mlb smlnj-lib-mlton/Controls/controls-lib.mlb *** smlnj-lib/Controls/controls-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/Controls/controls-lib.mlb 2010-04-02 16:09:14.000000000 -0400 *************** *** 0 **** --- 1,170 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb + end + basis l11 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = Option + end + local + open l4 + in + structure gs_1 = List + end + local + open l11 + in + structure gs_2 = Atom + end + local + open l4 + in + structure gs_3 = Int + end + local + controls-sig.sml + in + signature gs_4 = CONTROLS + end + local + open l11 + in + structure gs_5 = AtomTable + end + local + structure Atom = gs_2 + structure AtomTable = gs_5 + structure Int = gs_3 + structure List = gs_1 + control-reps.sml + in + structure gs_6 = ControlReps + end + local + structure Atom = gs_2 + signature CONTROLS = gs_4 + structure ControlReps = gs_6 + structure Int = gs_3 + structure List = gs_1 + structure Option = gs_0 + controls.sml + in + structure gs_7 = Controls + end + local + open l11 + in + structure gs_8 = ListMergeSort + end + local + structure Atom = gs_2 + structure Controls = gs_7 + control-set-sig.sml + in + signature gs_9 = CONTROL_SET + end + local + structure AtomTable = gs_5 + signature CONTROL_SET = gs_9 + structure ControlReps = gs_6 + structure Controls = gs_7 + structure ListMergeSort = gs_8 + structure Option = gs_0 + control-set.sml + in + structure gs_10 = ControlSet + end + local + structure ControlSet = gs_10 + structure Controls = gs_7 + registry-sig.sml + in + signature gs_11 = CONTROL_REGISTRY + end + local + open l4 + in + structure gs_12 = String + end + local + open l4 + in + structure gs_13 = Real + end + local + open l4 + in + structure gs_14 = Char + end + local + open l4 + in + structure gs_15 = Bool + end + local + structure Controls = gs_7 + control-util-sig.sml + in + signature gs_16 = CONTROL_UTIL + end + local + structure Bool = gs_15 + signature CONTROL_UTIL = gs_16 + structure Char = gs_14 + structure Controls = gs_7 + structure Int = gs_3 + structure List = gs_1 + structure Real = gs_13 + structure String = gs_12 + control-util.sml + in + structure gs_17 = ControlUtil + end + local + open l4 + in + structure gs_18 = OS + end + local + structure Atom = gs_2 + structure AtomTable = gs_5 + signature CONTROL_REGISTRY = gs_11 + structure ControlReps = gs_6 + structure ControlSet = gs_10 + structure Controls = gs_7 + structure List = gs_1 + structure ListMergeSort = gs_8 + structure OS = gs_18 + registry.sml + in + structure gs_19 = ControlRegistry + end + in + signature CONTROLS = gs_4 + signature CONTROL_REGISTRY = gs_11 + signature CONTROL_SET = gs_9 + signature CONTROL_UTIL = gs_16 + structure ControlRegistry = gs_19 + structure ControlSet = gs_10 + structure ControlUtil = gs_17 + structure Controls = gs_7 + end + end + + end diff -N -C 2 -r smlnj-lib/HTML/html-attrs-fn.sml smlnj-lib-mlton/HTML/html-attrs-fn.sml *** smlnj-lib/HTML/html-attrs-fn.sml 2009-10-02 09:51:26.000000000 -0400 --- smlnj-lib-mlton/HTML/html-attrs-fn.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 90,106 **** Err.badAttrVal ctx (attrName, attrValToString attrVal); NONE) ! fun cvt (AT_IMPLICIT, IMPLICIT) = SOME IMPLICIT ! | cvt (AT_INSTANCE, IMPLICIT) = SOME(NAME attrName) ! | cvt (AT_TEXT, v) = SOME v ! | cvt (AT_NUMBER, v) = SOME v ! | cvt (AT_NAMES names, (NAME s | STRING s)) = ( case (List.find (eqName s) names) of NONE => error() | (SOME name) => SOME(NAME name) (* end case *)) ! | cvt (AT_IMPLICIT, (NAME s | STRING s)) = if (s = attrName) then SOME IMPLICIT else error() | cvt _ = error() in --- 90,111 ---- Err.badAttrVal ctx (attrName, attrValToString attrVal); NONE) ! fun atNames (names, s) = ( case (List.find (eqName s) names) of NONE => error() | (SOME name) => SOME(NAME name) (* end case *)) ! fun atImplicit (s) = if (s = attrName) then SOME IMPLICIT else error() + + fun cvt (AT_IMPLICIT, IMPLICIT) = SOME IMPLICIT + | cvt (AT_INSTANCE, IMPLICIT) = SOME(NAME attrName) + | cvt (AT_TEXT, v) = SOME v + | cvt (AT_NUMBER, v) = SOME v + | cvt (AT_NAMES names, NAME s) = atNames (names, s) + | cvt (AT_NAMES names, STRING s) = atNames (names, s) + | cvt (AT_IMPLICIT, NAME s) = atImplicit (s) + | cvt (AT_IMPLICIT, STRING s) = atImplicit (s) | cvt _ = error() in *************** *** 139,143 **** fun get attrVec = (case (getFn attrVec) of NONE => NONE ! | (SOME((STRING s) | (NAME s))) => SOME s | _ => ( Err.missingAttrVal (getContext attrVec) attr; --- 144,149 ---- fun get attrVec = (case (getFn attrVec) of NONE => NONE ! | SOME (STRING s) => SOME s ! | SOME (NAME s) => SOME s | _ => ( Err.missingAttrVal (getContext attrVec) attr; *************** *** 163,176 **** fun getNUMBER (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) ! fun get attrVec = (case (getFn attrVec) of NONE => NONE ! | (SOME((STRING s) | (NAME s))) => (case (Int.fromString s) ! of NONE => ( ! Err.badAttrVal (getContext attrVec) (attr, s); ! NONE) ! | someN => someN ! (* end case *)) | SOME IMPLICIT => raise Fail "getNUMBER: IMPLICIT unexpected" (* end case *)) in get --- 169,187 ---- fun getNUMBER (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) ! fun get attrVec = let ! fun doitStringName s = (case (Int.fromString s) ! of NONE => ( ! Err.badAttrVal (getContext attrVec) (attr, s); ! NONE) ! | someN => someN ! (* end case *)) ! in ! (case (getFn attrVec) of NONE => NONE ! | SOME (STRING s) => doitStringName s ! | SOME (NAME s) => doitStringName s | SOME IMPLICIT => raise Fail "getNUMBER: IMPLICIT unexpected" (* end case *)) + end in get *************** *** 178,191 **** fun getChar (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) ! fun get attrVec = (case (getFn attrVec) ! of NONE => NONE ! | (SOME((STRING s) | (NAME s))) => ! if (size s = 1) then SOME(String.sub(s, 0)) (** NOTE: we should probably accept &#xx; as a character value **) ! else ( ! Err.badAttrVal (getContext attrVec) (attr, s); ! NONE) | SOME IMPLICIT => raise Fail "getChar: IMPLICIT unexpected" (* end case *)) in get --- 189,207 ---- fun getChar (attrMap, attr) = let val getFn = bindFindAttr (attrMap, attr) ! fun get attrVec = let ! fun doitStringName s = ! if (size s = 1) then SOME(String.sub(s, 0)) (** NOTE: we should probably accept &#xx; as a character value **) ! else ( ! Err.badAttrVal (getContext attrVec) (attr, s); ! NONE) ! in ! (case (getFn attrVec) ! of NONE => NONE ! | SOME (STRING s) => doitStringName s ! | SOME (NAME s) => doitStringName s | SOME IMPLICIT => raise Fail "getChar: IMPLICIT unexpected" (* end case *)) + end in get diff -N -C 2 -r smlnj-lib/HTML/html-elements-fn.sml smlnj-lib-mlton/HTML/html-elements-fn.sml *** smlnj-lib/HTML/html-elements-fn.sml 2009-10-02 09:51:26.000000000 -0400 --- smlnj-lib-mlton/HTML/html-elements-fn.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 145,149 **** *) fun scanAttrVal (ctx, attrName, ss) = let ! fun isNameChar (#"." | #"-") = true | isNameChar c = (Char.isAlphaNum c) in --- 145,150 ---- *) fun scanAttrVal (ctx, attrName, ss) = let ! fun isNameChar #"." = true ! | isNameChar #"-" = true | isNameChar c = (Char.isAlphaNum c) in diff -N -C 2 -r smlnj-lib/HTML/html-gram.desc smlnj-lib-mlton/HTML/html-gram.desc *** smlnj-lib/HTML/html-gram.desc 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/HTML/html-gram.desc 2010-04-02 16:09:14.000000000 -0400 *************** *** 0 **** --- 1,6055 ---- + + state 0: + + Document : . StartHTML Head Body EndHTML + + START_HTML shift 2 + + Document goto 282 + StartHTML goto 1 + + . reduce by rule 1 + + + state 1: + + Document : StartHTML . Head Body EndHTML + + START_HEAD shift 5 + + Head goto 4 + StartHEAD goto 3 + + . reduce by rule 6 + + + state 2: + + StartHTML : START_HTML . (reduce by rule 2) + + + + . reduce by rule 2 + + + state 3: + + Head : StartHEAD . HeadContents EndHEAD + + TAG_BASE shift 14 + TAG_ISINDEX shift 13 + TAG_LINK shift 12 + TAG_META shift 11 + START_SCRIPT shift 10 + START_STYLE shift 9 + + HeadContents goto 8 + HeadElements goto 7 + HeadElement goto 6 + + . reduce by rule 11 + + + state 4: + + Document : StartHTML Head . Body EndHTML + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + START_BODY shift 73 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + Body goto 27 + BodyContent0 goto 26 + BodyElement goto 25 + BlockWOIndex goto 24 + Paragraph goto 23 + List goto 22 + Preformatted goto 21 + TextWOScript goto 20 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . error + + + state 5: + + StartHEAD : START_HEAD . (reduce by rule 7) + + + + . reduce by rule 7 + + + state 6: + + HeadElements : HeadElement . HeadElements + + TAG_BASE shift 14 + TAG_ISINDEX shift 13 + TAG_LINK shift 12 + TAG_META shift 11 + START_SCRIPT shift 10 + START_STYLE shift 9 + + HeadElements goto 80 + HeadElement goto 6 + + . reduce by rule 11 + + + state 7: + + HeadContents : HeadElements . START_TITLE PCData END_TITLE HeadElements + + START_TITLE shift 81 + + + . error + + + state 8: + + Head : StartHEAD HeadContents . EndHEAD + + END_HEAD shift 83 + + EndHEAD goto 82 + + . reduce by rule 8 + + + state 9: + + HeadElement : START_STYLE . PCData END_STYLE + + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + PCData goto 86 + PCDataList goto 85 + PCDataElem goto 84 + + . reduce by rule 150 + + + state 10: + + HeadElement : START_SCRIPT . PCData END_SCRIPT + + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + PCData goto 87 + PCDataList goto 85 + PCDataElem goto 84 + + . reduce by rule 150 + + + state 11: + + HeadElement : TAG_META . (reduce by rule 13) + + + + . reduce by rule 13 + + + state 12: + + HeadElement : TAG_LINK . (reduce by rule 14) + + + + . reduce by rule 14 + + + state 13: + + HeadElement : TAG_ISINDEX . (reduce by rule 15) + + + + . reduce by rule 15 + + + state 14: + + HeadElement : TAG_BASE . (reduce by rule 16) + + + + . reduce by rule 16 + + + state 15: + + TextWOScript : PCDataElem . (reduce by rule 108) + + + + . reduce by rule 108 + + + state 16: + + TextWOScript : Form . (reduce by rule 112) + + + + . reduce by rule 112 + + + state 17: + + TextWOScript : Special . (reduce by rule 111) + + + + . reduce by rule 111 + + + state 18: + + TextWOScript : Phrase . (reduce by rule 110) + + + + . reduce by rule 110 + + + state 19: + + TextWOScript : Font . (reduce by rule 109) + + + + . reduce by rule 109 + + + state 20: + + BodyContent0 : TextWOScript . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 94 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 21: + + BlockWOIndex : Preformatted . (reduce by rule 55) + + + + . reduce by rule 55 + + + state 22: + + BlockWOIndex : List . (reduce by rule 54) + + + + . reduce by rule 54 + + + state 23: + + BodyContent0 : Paragraph . END_P BodyContent1 + BodyContent0 : Paragraph . BodyContent2 + + START_ADDRESS shift 78 + START_BLOCKQUOTE shift 74 + START_CENTER shift 71 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + TAG_ISINDEX shift 96 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + END_P shift 101 + START_PRE shift 44 + START_TABLE shift 36 + START_UL shift 32 + + BodyContent2 goto 100 + BodyElement goto 99 + BlockWOIndex goto 92 + Block goto 98 + Paragraph goto 97 + List goto 22 + Preformatted goto 21 + + . reduce by rule 35 + + + state 24: + + BodyContent0 : BlockWOIndex . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 102 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 25: + + BodyContent0 : BodyElement . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 103 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 26: + + Body : BodyContent0 . EndBODY + + END_BODY shift 105 + + EndBODY goto 104 + + . reduce by rule 20 + + + state 27: + + Document : StartHTML Head Body . EndHTML + + END_HTML shift 107 + + EndHTML goto 106 + + . reduce by rule 3 + + + state 28: + + PCDataElem : ENTITY_REF . (reduce by rule 154) + + + + . reduce by rule 154 + + + state 29: + + PCDataElem : CHAR_REF . (reduce by rule 153) + + + + . reduce by rule 153 + + + state 30: + + PCDataElem : PCDATA . (reduce by rule 152) + + + + . reduce by rule 152 + + + state 31: + + Phrase : START_VAR . TextList END_VAR + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 110 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 32: + + List : START_UL . ListItemList END_UL + + START_LI shift 113 + + ListItemList goto 112 + ListItem goto 111 + + . reduce by rule 70 + + + state 33: + + Font : START_U . TextList END_U + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 114 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 34: + + Font : START_TT . TextList END_TT + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 115 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 35: + + Form : START_TEXTAREA . PCData END_TEXTAREA + + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + PCData goto 116 + PCDataList goto 85 + PCDataElem goto 84 + + . reduce by rule 150 + + + state 36: + + BlockWOIndex : START_TABLE . optCaption TableRowList END_TABLE + + START_CAPTION shift 118 + + optCaption goto 117 + + . reduce by rule 93 + + + state 37: + + Font : START_SUP . TextList END_SUP + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 119 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 38: + + Font : START_SUB . TextList END_SUB + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 120 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 39: + + Phrase : START_STRONG . TextList END_STRONG + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 121 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 40: + + Font : START_STRIKE . TextList END_STRIKE + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 122 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 41: + + Font : START_SMALL . TextList END_SMALL + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 123 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 42: + + Form : START_SELECT . OptionList END_SELECT + + START_OPTION shift 125 + + OptionList goto 124 + + . reduce by rule 145 + + + state 43: + + Phrase : START_SAMP . TextList END_SAMP + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 126 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 44: + + Preformatted : START_PRE . TextList END_PRE + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 127 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 45: + + Special : TAG_PARAM . (reduce by rule 139) + + + + . reduce by rule 139 + + + state 46: + + Paragraph : START_P . TextList + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 128 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 47: + + List : START_OL . ListItemList END_OL + + START_LI shift 113 + + ListItemList goto 129 + ListItem goto 111 + + . reduce by rule 70 + + + state 48: + + List : START_MENU . ListItemList END_MENU + + START_LI shift 113 + + ListItemList goto 130 + ListItem goto 111 + + . reduce by rule 70 + + + state 49: + + Special : START_MAP . AreaList END_MAP + + TAG_AREA shift 132 + + AreaList goto 131 + + . reduce by rule 140 + + + state 50: + + Phrase : START_KBD . TextList END_KBD + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 133 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 51: + + Form : TAG_INPUT . (reduce by rule 142) + + + + . reduce by rule 142 + + + state 52: + + Special : TAG_IMG . (reduce by rule 133) + + + + . reduce by rule 133 + + + state 53: + + Font : START_I . TextList END_I + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 134 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 54: + + BlockWOIndex : TAG_HR . (reduce by rule 60) + + + + . reduce by rule 60 + + + state 55: + + BodyElement : START_H6 . TextList END_H6 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 135 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 56: + + BodyElement : START_H5 . TextList END_H5 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 136 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 57: + + BodyElement : START_H4 . TextList END_H4 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 137 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 58: + + BodyElement : START_H3 . TextList END_H3 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 138 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 59: + + BodyElement : START_H2 . TextList END_H2 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 139 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 60: + + BodyElement : START_H1 . TextList END_H1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 140 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 61: + + BlockWOIndex : START_FORM . BodyContent END_FORM + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent goto 142 + BodyContent1 goto 141 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 62: + + Special : START_BASEFONT . TextList END_BASEFONT + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 143 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 63: + + Special : START_FONT . TextList END_FONT + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 144 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 64: + + Phrase : START_EM . TextList END_EM + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 145 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 65: + + List : START_DL . DLItemList END_DL + + START_DD shift 149 + START_DT shift 148 + + DLItemList goto 147 + DLItem goto 146 + + . reduce by rule 73 + + + state 66: + + BlockWOIndex : START_DIV . BodyContent END_DIV + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent goto 150 + BodyContent1 goto 141 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 67: + + List : START_DIR . ListItemList END_DIR + + START_LI shift 113 + + ListItemList goto 151 + ListItem goto 111 + + . reduce by rule 70 + + + state 68: + + Phrase : START_DFN . TextList END_DFN + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 152 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 69: + + Phrase : START_CODE . TextList END_CODE + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 153 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 70: + + Phrase : START_CITE . TextList END_CITE + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 154 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 71: + + BlockWOIndex : START_CENTER . BodyContent END_CENTER + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent goto 155 + BodyContent1 goto 141 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 72: + + Special : TAG_BR . (reduce by rule 137) + + + + . reduce by rule 137 + + + state 73: + + BodyContent0 : START_BODY . BodyContent + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent goto 156 + BodyContent1 goto 141 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 74: + + BlockWOIndex : START_BLOCKQUOTE . BodyContent END_BLOCKQUOTE + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent goto 157 + BodyContent1 goto 141 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 75: + + Font : START_BIG . TextList END_BIG + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 158 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 76: + + Font : START_B . TextList END_B + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 159 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 77: + + Special : START_APPLET . TextList END_APPLET + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 160 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 78: + + BodyElement : START_ADDRESS . AddressContent1 END_ADDRESS + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + START_P shift 46 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + AddressContent1 goto 163 + Paragraph goto 162 + TextWOScript goto 89 + Text goto 161 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 47 + + + state 79: + + Special : START_A . TextList END_A + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 164 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 80: + + HeadElements : HeadElement HeadElements . (reduce by rule 12) + + + + . reduce by rule 12 + + + state 81: + + HeadContents : HeadElements START_TITLE . PCData END_TITLE HeadElements + + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + PCData goto 165 + PCDataList goto 85 + PCDataElem goto 84 + + . reduce by rule 150 + + + state 82: + + Head : StartHEAD HeadContents EndHEAD . (reduce by rule 5) + + + + . reduce by rule 5 + + + state 83: + + EndHEAD : END_HEAD . (reduce by rule 9) + + + + . reduce by rule 9 + + + state 84: + + PCDataList : PCDataElem . PCDataList + + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + PCDataList goto 166 + PCDataElem goto 84 + + . reduce by rule 150 + + + state 85: + + PCData : PCDataList . (reduce by rule 149) + + + + . reduce by rule 149 + + + state 86: + + HeadElement : START_STYLE PCData . END_STYLE + + END_STYLE shift 167 + + + . error + + + state 87: + + HeadElement : START_SCRIPT PCData . END_SCRIPT + + END_SCRIPT shift 168 + + + . error + + + state 88: + + BodyContent1 : Text . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 169 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 89: + + Text : TextWOScript . (reduce by rule 113) + + + + . reduce by rule 113 + + + state 90: + + BodyContent1 : Paragraph . END_P BodyContent1 + BodyContent1 : Paragraph . BodyContent2 + + START_ADDRESS shift 78 + START_BLOCKQUOTE shift 74 + START_CENTER shift 71 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + TAG_ISINDEX shift 96 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + END_P shift 171 + START_PRE shift 44 + START_TABLE shift 36 + START_UL shift 32 + + BodyContent2 goto 170 + BodyElement goto 99 + BlockWOIndex goto 92 + Block goto 98 + Paragraph goto 97 + List goto 22 + Preformatted goto 21 + + . reduce by rule 35 + + + state 91: + + BodyContent1 : Block . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 172 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 92: + + Block : BlockWOIndex . (reduce by rule 62) + + + + . reduce by rule 62 + + + state 93: + + BodyContent1 : BodyElement . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 173 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 94: + + BodyContent0 : TextWOScript BodyContent1 . (reduce by rule 24) + + + + . reduce by rule 24 + + + state 95: + + Text : START_SCRIPT . PCData END_SCRIPT + + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + PCData goto 174 + PCDataList goto 85 + PCDataElem goto 84 + + . reduce by rule 150 + + + state 96: + + Block : TAG_ISINDEX . (reduce by rule 63) + + + + . reduce by rule 63 + + + state 97: + + BodyContent2 : Paragraph . END_P BodyContent1 + BodyContent2 : Paragraph . BodyContent2 + + START_ADDRESS shift 78 + START_BLOCKQUOTE shift 74 + START_CENTER shift 71 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + TAG_ISINDEX shift 96 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + END_P shift 176 + START_PRE shift 44 + START_TABLE shift 36 + START_UL shift 32 + + BodyContent2 goto 175 + BodyElement goto 99 + BlockWOIndex goto 92 + Block goto 98 + Paragraph goto 97 + List goto 22 + Preformatted goto 21 + + . reduce by rule 35 + + + state 98: + + BodyContent2 : Block . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 177 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 99: + + BodyContent2 : BodyElement . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 178 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 100: + + BodyContent0 : Paragraph BodyContent2 . (reduce by rule 28) + + + + . reduce by rule 28 + + + state 101: + + BodyContent0 : Paragraph END_P . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 179 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 102: + + BodyContent0 : BlockWOIndex BodyContent1 . (reduce by rule 26) + + + + . reduce by rule 26 + + + state 103: + + BodyContent0 : BodyElement BodyContent1 . (reduce by rule 25) + + + + . reduce by rule 25 + + + state 104: + + Body : BodyContent0 EndBODY . (reduce by rule 19) + + + + . reduce by rule 19 + + + state 105: + + EndBODY : END_BODY . (reduce by rule 21) + + + + . reduce by rule 21 + + + state 106: + + Document : StartHTML Head Body EndHTML . (reduce by rule 0) + + + + . reduce by rule 0 + + + state 107: + + EndHTML : END_HTML . (reduce by rule 4) + + + + . reduce by rule 4 + + + state 108: + + TextList' : Text . TextList' + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList' goto 180 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 109: + + TextList : TextList' . (reduce by rule 105) + + + + . reduce by rule 105 + + + state 110: + + Phrase : START_VAR TextList . END_VAR + + END_VAR shift 181 + + + . error + + + state 111: + + ListItemList : ListItem . ListItemList + + START_LI shift 113 + + ListItemList goto 182 + ListItem goto 111 + + . reduce by rule 70 + + + state 112: + + List : START_UL ListItemList . END_UL + + END_UL shift 183 + + + . error + + + state 113: + + ListItem : START_LI . Flow1 EndLI + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BlockWOIndex goto 92 + Block goto 187 + Paragraph goto 186 + List goto 22 + Flow1 goto 185 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 184 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 77 + + + state 114: + + Font : START_U TextList . END_U + + END_U shift 188 + + + . error + + + state 115: + + Font : START_TT TextList . END_TT + + END_TT shift 189 + + + . error + + + state 116: + + Form : START_TEXTAREA PCData . END_TEXTAREA + + END_TEXTAREA shift 190 + + + . error + + + state 117: + + BlockWOIndex : START_TABLE optCaption . TableRowList END_TABLE + + START_TR shift 193 + + TableRowList goto 192 + TableRow goto 191 + + . error + + + state 118: + + optCaption : START_CAPTION . TextList END_CAPTION + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 194 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 119: + + Font : START_SUP TextList . END_SUP + + END_SUP shift 195 + + + . error + + + state 120: + + Font : START_SUB TextList . END_SUB + + END_SUB shift 196 + + + . error + + + state 121: + + Phrase : START_STRONG TextList . END_STRONG + + END_STRONG shift 197 + + + . error + + + state 122: + + Font : START_STRIKE TextList . END_STRIKE + + END_STRIKE shift 198 + + + . error + + + state 123: + + Font : START_SMALL TextList . END_SMALL + + END_SMALL shift 199 + + + . error + + + state 124: + + Form : START_SELECT OptionList . END_SELECT + + END_SELECT shift 200 + + + . error + + + state 125: + + OptionList : START_OPTION . PCData EndOPTION OptionList + + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + PCData goto 201 + PCDataList goto 85 + PCDataElem goto 84 + + . reduce by rule 150 + + + state 126: + + Phrase : START_SAMP TextList . END_SAMP + + END_SAMP shift 202 + + + . error + + + state 127: + + Preformatted : START_PRE TextList . END_PRE + + END_PRE shift 203 + + + . error + + + state 128: + + Paragraph : START_P TextList . (reduce by rule 64) + + + + . reduce by rule 64 + + + state 129: + + List : START_OL ListItemList . END_OL + + END_OL shift 204 + + + . error + + + state 130: + + List : START_MENU ListItemList . END_MENU + + END_MENU shift 205 + + + . error + + + state 131: + + Special : START_MAP AreaList . END_MAP + + END_MAP shift 206 + + + . error + + + state 132: + + AreaList : TAG_AREA . AreaList + + TAG_AREA shift 132 + + AreaList goto 207 + + . reduce by rule 140 + + + state 133: + + Phrase : START_KBD TextList . END_KBD + + END_KBD shift 208 + + + . error + + + state 134: + + Font : START_I TextList . END_I + + END_I shift 209 + + + . error + + + state 135: + + BodyElement : START_H6 TextList . END_H6 + + END_H6 shift 210 + + + . error + + + state 136: + + BodyElement : START_H5 TextList . END_H5 + + END_H5 shift 211 + + + . error + + + state 137: + + BodyElement : START_H4 TextList . END_H4 + + END_H4 shift 212 + + + . error + + + state 138: + + BodyElement : START_H3 TextList . END_H3 + + END_H3 shift 213 + + + . error + + + state 139: + + BodyElement : START_H2 TextList . END_H2 + + END_H2 shift 214 + + + . error + + + state 140: + + BodyElement : START_H1 TextList . END_H1 + + END_H1 shift 215 + + + . error + + + state 141: + + BodyContent : BodyContent1 . (reduce by rule 22) + + + + . reduce by rule 22 + + + state 142: + + BlockWOIndex : START_FORM BodyContent . END_FORM + + END_FORM shift 216 + + + . error + + + state 143: + + Special : START_BASEFONT TextList . END_BASEFONT + + END_BASEFONT shift 217 + + + . error + + + state 144: + + Special : START_FONT TextList . END_FONT + + END_FONT shift 218 + + + . error + + + state 145: + + Phrase : START_EM TextList . END_EM + + END_EM shift 219 + + + . error + + + state 146: + + DLItemList : DLItem . DLItemList + + START_DD shift 149 + START_DT shift 148 + + DLItemList goto 220 + DLItem goto 146 + + . reduce by rule 73 + + + state 147: + + List : START_DL DLItemList . END_DL + + END_DL shift 221 + + + . error + + + state 148: + + DLItem : START_DT . TextList EndDT + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + TextList goto 222 + TextList' goto 109 + TextWOScript goto 89 + Text goto 108 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 106 + + + state 149: + + DLItem : START_DD . Flow1 EndDD + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BlockWOIndex goto 92 + Block goto 187 + Paragraph goto 186 + List goto 22 + Flow1 goto 223 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 184 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 77 + + + state 150: + + BlockWOIndex : START_DIV BodyContent . END_DIV + + END_DIV shift 224 + + + . error + + + state 151: + + List : START_DIR ListItemList . END_DIR + + END_DIR shift 225 + + + . error + + + state 152: + + Phrase : START_DFN TextList . END_DFN + + END_DFN shift 226 + + + . error + + + state 153: + + Phrase : START_CODE TextList . END_CODE + + END_CODE shift 227 + + + . error + + + state 154: + + Phrase : START_CITE TextList . END_CITE + + END_CITE shift 228 + + + . error + + + state 155: + + BlockWOIndex : START_CENTER BodyContent . END_CENTER + + END_CENTER shift 229 + + + . error + + + state 156: + + BodyContent0 : START_BODY BodyContent . (reduce by rule 23) + + + + . reduce by rule 23 + + + state 157: + + BlockWOIndex : START_BLOCKQUOTE BodyContent . END_BLOCKQUOTE + + END_BLOCKQUOTE shift 230 + + + . error + + + state 158: + + Font : START_BIG TextList . END_BIG + + END_BIG shift 231 + + + . error + + + state 159: + + Font : START_B TextList . END_B + + END_B shift 232 + + + . error + + + state 160: + + Special : START_APPLET TextList . END_APPLET + + END_APPLET shift 233 + + + . error + + + state 161: + + AddressContent1 : Text . AddressContent1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + START_P shift 46 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + AddressContent1 goto 234 + Paragraph goto 162 + TextWOScript goto 89 + Text goto 161 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 47 + + + state 162: + + AddressContent1 : Paragraph . END_P AddressContent1 + AddressContent1 : Paragraph . AddressContent2 + + START_P shift 46 + END_P shift 237 + + AddressContent2 goto 236 + Paragraph goto 235 + + . reduce by rule 51 + + + state 163: + + BodyElement : START_ADDRESS AddressContent1 . END_ADDRESS + + END_ADDRESS shift 238 + + + . error + + + state 164: + + Special : START_A TextList . END_A + + END_A shift 239 + + + . error + + + state 165: + + HeadContents : HeadElements START_TITLE PCData . END_TITLE HeadElements + + END_TITLE shift 240 + + + . error + + + state 166: + + PCDataList : PCDataElem PCDataList . (reduce by rule 151) + + + + . reduce by rule 151 + + + state 167: + + HeadElement : START_STYLE PCData END_STYLE . (reduce by rule 17) + + + + . reduce by rule 17 + + + state 168: + + HeadElement : START_SCRIPT PCData END_SCRIPT . (reduce by rule 18) + + + + . reduce by rule 18 + + + state 169: + + BodyContent1 : Text BodyContent1 . (reduce by rule 30) + + + + . reduce by rule 30 + + + state 170: + + BodyContent1 : Paragraph BodyContent2 . (reduce by rule 34) + + + + . reduce by rule 34 + + + state 171: + + BodyContent1 : Paragraph END_P . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 241 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 172: + + BodyContent1 : Block BodyContent1 . (reduce by rule 32) + + + + . reduce by rule 32 + + + state 173: + + BodyContent1 : BodyElement BodyContent1 . (reduce by rule 31) + + + + . reduce by rule 31 + + + state 174: + + Text : START_SCRIPT PCData . END_SCRIPT + + END_SCRIPT shift 242 + + + . error + + + state 175: + + BodyContent2 : Paragraph BodyContent2 . (reduce by rule 39) + + + + . reduce by rule 39 + + + state 176: + + BodyContent2 : Paragraph END_P . BodyContent1 + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent1 goto 243 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 177: + + BodyContent2 : Block BodyContent1 . (reduce by rule 37) + + + + . reduce by rule 37 + + + state 178: + + BodyContent2 : BodyElement BodyContent1 . (reduce by rule 36) + + + + . reduce by rule 36 + + + state 179: + + BodyContent0 : Paragraph END_P BodyContent1 . (reduce by rule 27) + + + + . reduce by rule 27 + + + state 180: + + TextList' : Text TextList' . (reduce by rule 107) + + + + . reduce by rule 107 + + + state 181: + + Phrase : START_VAR TextList END_VAR . (reduce by rule 130) + + + + . reduce by rule 130 + + + state 182: + + ListItemList : ListItem ListItemList . (reduce by rule 71) + + + + . reduce by rule 71 + + + state 183: + + List : START_UL ListItemList END_UL . (reduce by rule 65) + + + + . reduce by rule 65 + + + state 184: + + Flow1 : Text . Flow1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BlockWOIndex goto 92 + Block goto 187 + Paragraph goto 186 + List goto 22 + Flow1 goto 244 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 184 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 77 + + + state 185: + + ListItem : START_LI Flow1 . EndLI + + END_LI shift 246 + + EndLI goto 245 + + . reduce by rule 86 + + + state 186: + + Flow1 : Paragraph . END_P Flow1 + Flow1 : Paragraph . Flow2 + + START_BLOCKQUOTE shift 74 + START_CENTER shift 71 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_FORM shift 61 + TAG_HR shift 54 + TAG_ISINDEX shift 96 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + END_P shift 250 + START_PRE shift 44 + START_TABLE shift 36 + START_UL shift 32 + + BlockWOIndex goto 92 + Block goto 249 + Paragraph goto 248 + List goto 22 + Flow2 goto 247 + Preformatted goto 21 + + . reduce by rule 82 + + + state 187: + + Flow1 : Block . Flow1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BlockWOIndex goto 92 + Block goto 187 + Paragraph goto 186 + List goto 22 + Flow1 goto 251 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 184 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 77 + + + state 188: + + Font : START_U TextList END_U . (reduce by rule 118) + + + + . reduce by rule 118 + + + state 189: + + Font : START_TT TextList END_TT . (reduce by rule 115) + + + + . reduce by rule 115 + + + state 190: + + Form : START_TEXTAREA PCData END_TEXTAREA . (reduce by rule 144) + + + + . reduce by rule 144 + + + state 191: + + TableRowList : TableRow . (reduce by rule 95) + TableRowList : TableRow . TableRowList + + START_TR shift 193 + + TableRowList goto 252 + TableRow goto 191 + + . reduce by rule 95 + + + state 192: + + BlockWOIndex : START_TABLE optCaption TableRowList . END_TABLE + + END_TABLE shift 253 + + + . error + + + state 193: + + TableRow : START_TR . TableCellList + TableRow : START_TR . TableCellList END_TR + + START_TD shift 257 + START_TH shift 256 + + TableCellList goto 255 + TableCell goto 254 + + . error + + + state 194: + + optCaption : START_CAPTION TextList . END_CAPTION + + END_CAPTION shift 258 + + + . error + + + state 195: + + Font : START_SUP TextList END_SUP . (reduce by rule 123) + + + + . reduce by rule 123 + + + state 196: + + Font : START_SUB TextList END_SUB . (reduce by rule 122) + + + + . reduce by rule 122 + + + state 197: + + Phrase : START_STRONG TextList END_STRONG . (reduce by rule 125) + + + + . reduce by rule 125 + + + state 198: + + Font : START_STRIKE TextList END_STRIKE . (reduce by rule 119) + + + + . reduce by rule 119 + + + state 199: + + Font : START_SMALL TextList END_SMALL . (reduce by rule 121) + + + + . reduce by rule 121 + + + state 200: + + Form : START_SELECT OptionList END_SELECT . (reduce by rule 143) + + + + . reduce by rule 143 + + + state 201: + + OptionList : START_OPTION PCData . EndOPTION OptionList + + END_OPTION shift 260 + + EndOPTION goto 259 + + . reduce by rule 147 + + + state 202: + + Phrase : START_SAMP TextList END_SAMP . (reduce by rule 128) + + + + . reduce by rule 128 + + + state 203: + + Preformatted : START_PRE TextList END_PRE . (reduce by rule 92) + + + + . reduce by rule 92 + + + state 204: + + List : START_OL ListItemList END_OL . (reduce by rule 66) + + + + . reduce by rule 66 + + + state 205: + + List : START_MENU ListItemList END_MENU . (reduce by rule 68) + + + + . reduce by rule 68 + + + state 206: + + Special : START_MAP AreaList END_MAP . (reduce by rule 138) + + + + . reduce by rule 138 + + + state 207: + + AreaList : TAG_AREA AreaList . (reduce by rule 141) + + + + . reduce by rule 141 + + + state 208: + + Phrase : START_KBD TextList END_KBD . (reduce by rule 129) + + + + . reduce by rule 129 + + + state 209: + + Font : START_I TextList END_I . (reduce by rule 116) + + + + . reduce by rule 116 + + + state 210: + + BodyElement : START_H6 TextList END_H6 . (reduce by rule 45) + + + + . reduce by rule 45 + + + state 211: + + BodyElement : START_H5 TextList END_H5 . (reduce by rule 44) + + + + . reduce by rule 44 + + + state 212: + + BodyElement : START_H4 TextList END_H4 . (reduce by rule 43) + + + + . reduce by rule 43 + + + state 213: + + BodyElement : START_H3 TextList END_H3 . (reduce by rule 42) + + + + . reduce by rule 42 + + + state 214: + + BodyElement : START_H2 TextList END_H2 . (reduce by rule 41) + + + + . reduce by rule 41 + + + state 215: + + BodyElement : START_H1 TextList END_H1 . (reduce by rule 40) + + + + . reduce by rule 40 + + + state 216: + + BlockWOIndex : START_FORM BodyContent END_FORM . (reduce by rule 59) + + + + . reduce by rule 59 + + + state 217: + + Special : START_BASEFONT TextList END_BASEFONT . (reduce by rule 136) + + + + . reduce by rule 136 + + + state 218: + + Special : START_FONT TextList END_FONT . (reduce by rule 135) + + + + . reduce by rule 135 + + + state 219: + + Phrase : START_EM TextList END_EM . (reduce by rule 124) + + + + . reduce by rule 124 + + + state 220: + + DLItemList : DLItem DLItemList . (reduce by rule 74) + + + + . reduce by rule 74 + + + state 221: + + List : START_DL DLItemList END_DL . (reduce by rule 69) + + + + . reduce by rule 69 + + + state 222: + + DLItem : START_DT TextList . EndDT + + END_DT shift 262 + + EndDT goto 261 + + . reduce by rule 88 + + + state 223: + + DLItem : START_DD Flow1 . EndDD + + END_DD shift 264 + + EndDD goto 263 + + . reduce by rule 90 + + + state 224: + + BlockWOIndex : START_DIV BodyContent END_DIV . (reduce by rule 56) + + + + . reduce by rule 56 + + + state 225: + + List : START_DIR ListItemList END_DIR . (reduce by rule 67) + + + + . reduce by rule 67 + + + state 226: + + Phrase : START_DFN TextList END_DFN . (reduce by rule 127) + + + + . reduce by rule 127 + + + state 227: + + Phrase : START_CODE TextList END_CODE . (reduce by rule 126) + + + + . reduce by rule 126 + + + state 228: + + Phrase : START_CITE TextList END_CITE . (reduce by rule 131) + + + + . reduce by rule 131 + + + state 229: + + BlockWOIndex : START_CENTER BodyContent END_CENTER . (reduce by rule 57) + + + + . reduce by rule 57 + + + state 230: + + BlockWOIndex : START_BLOCKQUOTE BodyContent END_BLOCKQUOTE . (reduce by rule 58) + + + + . reduce by rule 58 + + + state 231: + + Font : START_BIG TextList END_BIG . (reduce by rule 120) + + + + . reduce by rule 120 + + + state 232: + + Font : START_B TextList END_B . (reduce by rule 117) + + + + . reduce by rule 117 + + + state 233: + + Special : START_APPLET TextList END_APPLET . (reduce by rule 134) + + + + . reduce by rule 134 + + + state 234: + + AddressContent1 : Text AddressContent1 . (reduce by rule 48) + + + + . reduce by rule 48 + + + state 235: + + AddressContent2 : Paragraph . END_P AddressContent1 + AddressContent2 : Paragraph . AddressContent2 + + START_P shift 46 + END_P shift 266 + + AddressContent2 goto 265 + Paragraph goto 235 + + . reduce by rule 51 + + + state 236: + + AddressContent1 : Paragraph AddressContent2 . (reduce by rule 50) + + + + . reduce by rule 50 + + + state 237: + + AddressContent1 : Paragraph END_P . AddressContent1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + START_P shift 46 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + AddressContent1 goto 267 + Paragraph goto 162 + TextWOScript goto 89 + Text goto 161 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 47 + + + state 238: + + BodyElement : START_ADDRESS AddressContent1 END_ADDRESS . (reduce by rule 46) + + + + . reduce by rule 46 + + + state 239: + + Special : START_A TextList END_A . (reduce by rule 132) + + + + . reduce by rule 132 + + + state 240: + + HeadContents : HeadElements START_TITLE PCData END_TITLE . HeadElements + + TAG_BASE shift 14 + TAG_ISINDEX shift 13 + TAG_LINK shift 12 + TAG_META shift 11 + START_SCRIPT shift 10 + START_STYLE shift 9 + + HeadElements goto 268 + HeadElement goto 6 + + . reduce by rule 11 + + + state 241: + + BodyContent1 : Paragraph END_P BodyContent1 . (reduce by rule 33) + + + + . reduce by rule 33 + + + state 242: + + Text : START_SCRIPT PCData END_SCRIPT . (reduce by rule 114) + + + + . reduce by rule 114 + + + state 243: + + BodyContent2 : Paragraph END_P BodyContent1 . (reduce by rule 38) + + + + . reduce by rule 38 + + + state 244: + + Flow1 : Text Flow1 . (reduce by rule 78) + + + + . reduce by rule 78 + + + state 245: + + ListItem : START_LI Flow1 EndLI . (reduce by rule 72) + + + + . reduce by rule 72 + + + state 246: + + EndLI : END_LI . (reduce by rule 87) + + + + . reduce by rule 87 + + + state 247: + + Flow1 : Paragraph Flow2 . (reduce by rule 81) + + + + . reduce by rule 81 + + + state 248: + + Flow2 : Paragraph . END_P Flow1 + Flow2 : Paragraph . Flow2 + + START_BLOCKQUOTE shift 74 + START_CENTER shift 71 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_FORM shift 61 + TAG_HR shift 54 + TAG_ISINDEX shift 96 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + END_P shift 270 + START_PRE shift 44 + START_TABLE shift 36 + START_UL shift 32 + + BlockWOIndex goto 92 + Block goto 249 + Paragraph goto 248 + List goto 22 + Flow2 goto 269 + Preformatted goto 21 + + . reduce by rule 82 + + + state 249: + + Flow2 : Block . Flow1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BlockWOIndex goto 92 + Block goto 187 + Paragraph goto 186 + List goto 22 + Flow1 goto 271 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 184 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 77 + + + state 250: + + Flow1 : Paragraph END_P . Flow1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BlockWOIndex goto 92 + Block goto 187 + Paragraph goto 186 + List goto 22 + Flow1 goto 272 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 184 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 77 + + + state 251: + + Flow1 : Block Flow1 . (reduce by rule 79) + + + + . reduce by rule 79 + + + state 252: + + TableRowList : TableRow TableRowList . (reduce by rule 96) + + + + . reduce by rule 96 + + + state 253: + + BlockWOIndex : START_TABLE optCaption TableRowList END_TABLE . (reduce by rule 61) + + + + . reduce by rule 61 + + + state 254: + + TableCellList : TableCell . (reduce by rule 99) + TableCellList : TableCell . TableCellList + + START_TD shift 257 + START_TH shift 256 + + TableCellList goto 273 + TableCell goto 254 + + . reduce by rule 99 + + + state 255: + + TableRow : START_TR TableCellList . (reduce by rule 97) + TableRow : START_TR TableCellList . END_TR + + END_TR shift 274 + + + . reduce by rule 97 + + + state 256: + + TableCell : START_TH . BodyContent END_TH + TableCell : START_TH . BodyContent + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent goto 275 + BodyContent1 goto 141 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 257: + + TableCell : START_TD . BodyContent END_TD + TableCell : START_TD . BodyContent + + START_A shift 79 + START_ADDRESS shift 78 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + START_H1 shift 60 + START_H2 shift 59 + START_H3 shift 58 + START_H4 shift 57 + START_H5 shift 56 + START_H6 shift 55 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BodyContent goto 276 + BodyContent1 goto 141 + BodyElement goto 93 + BlockWOIndex goto 92 + Block goto 91 + Paragraph goto 90 + List goto 22 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 88 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 29 + + + state 258: + + optCaption : START_CAPTION TextList END_CAPTION . (reduce by rule 94) + + + + . reduce by rule 94 + + + state 259: + + OptionList : START_OPTION PCData EndOPTION . OptionList + + START_OPTION shift 125 + + OptionList goto 277 + + . reduce by rule 145 + + + state 260: + + EndOPTION : END_OPTION . (reduce by rule 148) + + + + . reduce by rule 148 + + + state 261: + + DLItem : START_DT TextList EndDT . (reduce by rule 75) + + + + . reduce by rule 75 + + + state 262: + + EndDT : END_DT . (reduce by rule 89) + + + + . reduce by rule 89 + + + state 263: + + DLItem : START_DD Flow1 EndDD . (reduce by rule 76) + + + + . reduce by rule 76 + + + state 264: + + EndDD : END_DD . (reduce by rule 91) + + + + . reduce by rule 91 + + + state 265: + + AddressContent2 : Paragraph AddressContent2 . (reduce by rule 53) + + + + . reduce by rule 53 + + + state 266: + + AddressContent2 : Paragraph END_P . AddressContent1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + TAG_BR shift 72 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + START_KBD shift 50 + START_MAP shift 49 + START_P shift 46 + TAG_PARAM shift 45 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + AddressContent1 goto 278 + Paragraph goto 162 + TextWOScript goto 89 + Text goto 161 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 47 + + + state 267: + + AddressContent1 : Paragraph END_P AddressContent1 . (reduce by rule 49) + + + + . reduce by rule 49 + + + state 268: + + HeadContents : HeadElements START_TITLE PCData END_TITLE HeadElements . (reduce by rule 10) + + + + . reduce by rule 10 + + + state 269: + + Flow2 : Paragraph Flow2 . (reduce by rule 85) + + + + . reduce by rule 85 + + + state 270: + + Flow2 : Paragraph END_P . Flow1 + + START_A shift 79 + START_APPLET shift 77 + START_B shift 76 + START_BIG shift 75 + START_BLOCKQUOTE shift 74 + TAG_BR shift 72 + START_CENTER shift 71 + START_CITE shift 70 + START_CODE shift 69 + START_DFN shift 68 + START_DIR shift 67 + START_DIV shift 66 + START_DL shift 65 + START_EM shift 64 + START_FONT shift 63 + START_BASEFONT shift 62 + START_FORM shift 61 + TAG_HR shift 54 + START_I shift 53 + TAG_IMG shift 52 + TAG_INPUT shift 51 + TAG_ISINDEX shift 96 + START_KBD shift 50 + START_MAP shift 49 + START_MENU shift 48 + START_OL shift 47 + START_P shift 46 + TAG_PARAM shift 45 + START_PRE shift 44 + START_SAMP shift 43 + START_SCRIPT shift 95 + START_SELECT shift 42 + START_SMALL shift 41 + START_STRIKE shift 40 + START_STRONG shift 39 + START_SUB shift 38 + START_SUP shift 37 + START_TABLE shift 36 + START_TEXTAREA shift 35 + START_TT shift 34 + START_U shift 33 + START_UL shift 32 + START_VAR shift 31 + PCDATA shift 30 + CHAR_REF shift 29 + ENTITY_REF shift 28 + + BlockWOIndex goto 92 + Block goto 187 + Paragraph goto 186 + List goto 22 + Flow1 goto 279 + Preformatted goto 21 + TextWOScript goto 89 + Text goto 184 + Font goto 19 + Phrase goto 18 + Special goto 17 + Form goto 16 + PCDataElem goto 15 + + . reduce by rule 77 + + + state 271: + + Flow2 : Block Flow1 . (reduce by rule 83) + + + + . reduce by rule 83 + + + state 272: + + Flow1 : Paragraph END_P Flow1 . (reduce by rule 80) + + + + . reduce by rule 80 + + + state 273: + + TableCellList : TableCell TableCellList . (reduce by rule 100) + + + + . reduce by rule 100 + + + state 274: + + TableRow : START_TR TableCellList END_TR . (reduce by rule 98) + + + + . reduce by rule 98 + + + state 275: + + TableCell : START_TH BodyContent . END_TH + TableCell : START_TH BodyContent . (reduce by rule 102) + + END_TH shift 280 + + + . reduce by rule 102 + + + state 276: + + TableCell : START_TD BodyContent . END_TD + TableCell : START_TD BodyContent . (reduce by rule 104) + + END_TD shift 281 + + + . reduce by rule 104 + + + state 277: + + OptionList : START_OPTION PCData EndOPTION OptionList . (reduce by rule 146) + + + + . reduce by rule 146 + + + state 278: + + AddressContent2 : Paragraph END_P AddressContent1 . (reduce by rule 52) + + + + . reduce by rule 52 + + + state 279: + + Flow2 : Paragraph END_P Flow1 . (reduce by rule 84) + + + + . reduce by rule 84 + + + state 280: + + TableCell : START_TH BodyContent END_TH . (reduce by rule 101) + + + + . reduce by rule 101 + + + state 281: + + TableCell : START_TD BodyContent END_TD . (reduce by rule 103) + + + + . reduce by rule 103 + + + state 282: + + + EOF accept + + + . error + + 398 of 2987 action table entries left after compaction + 788 goto table entries diff -N -C 2 -r smlnj-lib/HTML/html-gram.sig smlnj-lib-mlton/HTML/html-gram.sig *** smlnj-lib/HTML/html-gram.sig 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/HTML/html-gram.sig 2010-04-02 16:09:14.000000000 -0400 *************** *** 0 **** --- 1,140 ---- + signature HTML_TOKENS = + sig + type ('a,'b) token + type svalue + val ENTITY_REF: (string) * 'a * 'a -> (svalue,'a) token + val CHAR_REF: (string) * 'a * 'a -> (svalue,'a) token + val PCDATA: (string) * 'a * 'a -> (svalue,'a) token + val END_VAR: 'a * 'a -> (svalue,'a) token + val START_VAR: 'a * 'a -> (svalue,'a) token + val END_UL: 'a * 'a -> (svalue,'a) token + val START_UL: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_U: 'a * 'a -> (svalue,'a) token + val START_U: 'a * 'a -> (svalue,'a) token + val END_TT: 'a * 'a -> (svalue,'a) token + val START_TT: 'a * 'a -> (svalue,'a) token + val END_TR: 'a * 'a -> (svalue,'a) token + val START_TR: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_TITLE: 'a * 'a -> (svalue,'a) token + val START_TITLE: 'a * 'a -> (svalue,'a) token + val END_TH: 'a * 'a -> (svalue,'a) token + val START_TH: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_TEXTAREA: 'a * 'a -> (svalue,'a) token + val START_TEXTAREA: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_TD: 'a * 'a -> (svalue,'a) token + val START_TD: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_TABLE: 'a * 'a -> (svalue,'a) token + val START_TABLE: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_SUP: 'a * 'a -> (svalue,'a) token + val START_SUP: 'a * 'a -> (svalue,'a) token + val END_SUB: 'a * 'a -> (svalue,'a) token + val START_SUB: 'a * 'a -> (svalue,'a) token + val END_STYLE: 'a * 'a -> (svalue,'a) token + val START_STYLE: 'a * 'a -> (svalue,'a) token + val END_STRONG: 'a * 'a -> (svalue,'a) token + val START_STRONG: 'a * 'a -> (svalue,'a) token + val END_STRIKE: 'a * 'a -> (svalue,'a) token + val START_STRIKE: 'a * 'a -> (svalue,'a) token + val END_SMALL: 'a * 'a -> (svalue,'a) token + val START_SMALL: 'a * 'a -> (svalue,'a) token + val END_SELECT: 'a * 'a -> (svalue,'a) token + val START_SELECT: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_SCRIPT: 'a * 'a -> (svalue,'a) token + val START_SCRIPT: 'a * 'a -> (svalue,'a) token + val END_SAMP: 'a * 'a -> (svalue,'a) token + val START_SAMP: 'a * 'a -> (svalue,'a) token + val END_PRE: 'a * 'a -> (svalue,'a) token + val START_PRE: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val TAG_PARAM: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_P: 'a * 'a -> (svalue,'a) token + val START_P: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_OPTION: 'a * 'a -> (svalue,'a) token + val START_OPTION: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_OL: 'a * 'a -> (svalue,'a) token + val START_OL: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val TAG_META: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_MENU: 'a * 'a -> (svalue,'a) token + val START_MENU: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_MAP: 'a * 'a -> (svalue,'a) token + val START_MAP: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val TAG_LINK: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_LI: 'a * 'a -> (svalue,'a) token + val START_LI: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_KBD: 'a * 'a -> (svalue,'a) token + val START_KBD: 'a * 'a -> (svalue,'a) token + val TAG_ISINDEX: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val TAG_INPUT: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val TAG_IMG: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_I: 'a * 'a -> (svalue,'a) token + val START_I: 'a * 'a -> (svalue,'a) token + val END_HTML: 'a * 'a -> (svalue,'a) token + val START_HTML: 'a * 'a -> (svalue,'a) token + val TAG_HR: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_HEAD: 'a * 'a -> (svalue,'a) token + val START_HEAD: 'a * 'a -> (svalue,'a) token + val END_H6: 'a * 'a -> (svalue,'a) token + val START_H6: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_H5: 'a * 'a -> (svalue,'a) token + val START_H5: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_H4: 'a * 'a -> (svalue,'a) token + val START_H4: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_H3: 'a * 'a -> (svalue,'a) token + val START_H3: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_H2: 'a * 'a -> (svalue,'a) token + val START_H2: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_H1: 'a * 'a -> (svalue,'a) token + val START_H1: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_FORM: 'a * 'a -> (svalue,'a) token + val START_FORM: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_BASEFONT: 'a * 'a -> (svalue,'a) token + val START_BASEFONT: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_FONT: 'a * 'a -> (svalue,'a) token + val START_FONT: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_EM: 'a * 'a -> (svalue,'a) token + val START_EM: 'a * 'a -> (svalue,'a) token + val END_DT: 'a * 'a -> (svalue,'a) token + val START_DT: 'a * 'a -> (svalue,'a) token + val END_DL: 'a * 'a -> (svalue,'a) token + val START_DL: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_DIV: 'a * 'a -> (svalue,'a) token + val START_DIV: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_DIR: 'a * 'a -> (svalue,'a) token + val START_DIR: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_DFN: 'a * 'a -> (svalue,'a) token + val START_DFN: 'a * 'a -> (svalue,'a) token + val END_DD: 'a * 'a -> (svalue,'a) token + val START_DD: 'a * 'a -> (svalue,'a) token + val END_CODE: 'a * 'a -> (svalue,'a) token + val START_CODE: 'a * 'a -> (svalue,'a) token + val END_CITE: 'a * 'a -> (svalue,'a) token + val START_CITE: 'a * 'a -> (svalue,'a) token + val END_CENTER: 'a * 'a -> (svalue,'a) token + val START_CENTER: 'a * 'a -> (svalue,'a) token + val END_CAPTION: 'a * 'a -> (svalue,'a) token + val START_CAPTION: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val TAG_BR: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_BODY: 'a * 'a -> (svalue,'a) token + val START_BODY: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_BLOCKQUOTE: 'a * 'a -> (svalue,'a) token + val START_BLOCKQUOTE: 'a * 'a -> (svalue,'a) token + val END_BIG: 'a * 'a -> (svalue,'a) token + val START_BIG: 'a * 'a -> (svalue,'a) token + val TAG_BASE: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_B: 'a * 'a -> (svalue,'a) token + val START_B: 'a * 'a -> (svalue,'a) token + val TAG_AREA: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_APPLET: 'a * 'a -> (svalue,'a) token + val START_APPLET: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val END_ADDRESS: 'a * 'a -> (svalue,'a) token + val START_ADDRESS: 'a * 'a -> (svalue,'a) token + val END_A: 'a * 'a -> (svalue,'a) token + val START_A: (HTMLAttrVals.attrs) * 'a * 'a -> (svalue,'a) token + val EOF: 'a * 'a -> (svalue,'a) token + end + signature HTML_LRVALS= + sig + structure Tokens : HTML_TOKENS + structure ParserData:PARSER_DATA + sharing type ParserData.Token.token = Tokens.token + sharing type ParserData.svalue = Tokens.svalue + end diff -N -C 2 -r smlnj-lib/HTML/html-gram.sml smlnj-lib-mlton/HTML/html-gram.sml *** smlnj-lib/HTML/html-gram.sml 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/HTML/html-gram.sml 2010-04-02 16:09:14.000000000 -0400 *************** *** 0 **** --- 1,2477 ---- + + + functor HTMLLrValsFn ( + structure Token : TOKEN + structure HTMLAttrs : HTML_ATTRS) = + struct + structure ParserData= + struct + structure Header = + struct + (* html-gram + * + * COPYRIGHT (c) 1996 AT&T Research. + * + * This grammar parses HTML 3.2. Note that it does not enforce exclusions + * (for the content of FORM, PRE, etc). Exclusions should be enforced as + * a second pass over the parse tree. + *) + + fun textList [text] = text + | textList l = HTML.TextList l + + fun blockList [blk] = blk + | blockList l = HTML.BlockList l + + fun textBlock l = HTML.TextBlock(textList l) + + (* The elements of a definition list (

) are tags (
) and items (
). + * To avoid shift/reduce problems, we parse them and then group them. + *) + datatype deflist_item + = DL_tag of HTML.text + | DL_item of HTML.block + + fun groupDefListContents [] = [] + | groupDefListContents (h :: t) = let + fun gdlc (DL_tag tag, []) = ({dt=[tag], dd=HTML.BlockList[]}, []) + | gdlc (DL_tag tag, h :: t) = let + val ({dt, dd}, r) = gdlc (h, t) + in + ({dt = tag :: dt, dd = dd}, r) + end + | gdlc (DL_item blk, r) = ({dt=[],dd=blk}, groupDefListContents r) + in + op :: (gdlc (h, t)) + end + + (* A list of Text, paragraphs and blocks requires grouping the Text items and + * making an implicit paragraph. We cannot directly use TextList because of + * conflicts. + *) + datatype blklist_item + = BL_text of HTML.text list + | BL_block of HTML.block list + + fun consText (txt, BL_text tl :: r) = BL_text(txt::tl) :: r + | consText (txt, l) = BL_text[txt] :: l + + fun consBlock (blk, BL_block bl :: r) = BL_block(blk::bl) :: r + | consBlock (blk, l) = BL_block[blk] :: l + + fun mkBlock blks = let + fun f (BL_text tl) = textBlock tl + | f (BL_block bl) = blockList bl + in + blockList(List.map f blks) + end + + fun mkBody blks = HTML.BODY{ + background = NONE, + bgcolor = NONE, + text = NONE, + link = NONE, + vlink = NONE, + alink = NONE, + content = mkBlock blks + } + + + end + structure LrTable = Token.LrTable + structure Token = Token + local open LrTable in + val table=let val actionRows = + "\ + \\001\000\001\000\000\000\000\000\ + \\001\000\002\000\081\000\004\000\080\000\006\000\079\000\009\000\078\000\ + \\012\000\077\000\014\000\076\000\016\000\075\000\018\000\074\000\ + \\021\000\073\000\023\000\072\000\025\000\071\000\029\000\070\000\ + \\031\000\069\000\033\000\068\000\035\000\067\000\039\000\066\000\ + \\041\000\065\000\043\000\064\000\045\000\063\000\047\000\062\000\ + \\049\000\061\000\051\000\060\000\053\000\059\000\055\000\058\000\ + \\057\000\057\000\061\000\056\000\064\000\055\000\066\000\054\000\ + \\067\000\053\000\069\000\052\000\074\000\051\000\076\000\050\000\ + \\079\000\049\000\083\000\048\000\085\000\047\000\086\000\046\000\ + \\088\000\045\000\092\000\044\000\094\000\043\000\096\000\042\000\ + \\098\000\041\000\102\000\040\000\104\000\039\000\106\000\038\000\ + \\110\000\037\000\118\000\036\000\120\000\035\000\122\000\034\000\ + \\124\000\033\000\126\000\032\000\127\000\031\000\128\000\030\000\000\000\ + \\001\000\003\000\241\000\000\000\ + \\001\000\005\000\240\000\000\000\ + \\001\000\007\000\235\000\000\000\ + \\001\000\010\000\234\000\000\000\ + \\001\000\013\000\233\000\000\000\ + \\001\000\015\000\232\000\000\000\ + \\001\000\020\000\004\001\000\000\ + \\001\000\022\000\231\000\000\000\ + \\001\000\024\000\230\000\000\000\ + \\001\000\026\000\229\000\000\000\ + \\001\000\030\000\228\000\000\000\ + \\001\000\032\000\227\000\000\000\ + \\001\000\034\000\226\000\000\000\ + \\001\000\036\000\223\000\000\000\ + \\001\000\040\000\221\000\000\000\ + \\001\000\042\000\220\000\000\000\ + \\001\000\044\000\219\000\000\000\ + \\001\000\046\000\218\000\000\000\ + \\001\000\048\000\217\000\000\000\ + \\001\000\050\000\216\000\000\000\ + \\001\000\052\000\215\000\000\000\ + \\001\000\054\000\214\000\000\000\ + \\001\000\056\000\213\000\000\000\ + \\001\000\058\000\212\000\000\000\ + \\001\000\065\000\211\000\000\000\ + \\001\000\070\000\210\000\000\000\ + \\001\000\075\000\208\000\000\000\ + \\001\000\077\000\207\000\000\000\ + \\001\000\080\000\206\000\000\000\ + \\001\000\087\000\205\000\000\000\ + \\001\000\089\000\204\000\000\000\ + \\001\000\091\000\170\000\000\000\ + \\001\000\091\000\244\000\000\000\ + \\001\000\093\000\202\000\000\000\ + \\001\000\095\000\201\000\000\000\ + \\001\000\097\000\200\000\000\000\ + \\001\000\099\000\199\000\000\000\ + \\001\000\101\000\169\000\000\000\ + \\001\000\103\000\198\000\000\000\ + \\001\000\105\000\197\000\000\000\ + \\001\000\107\000\255\000\000\000\ + \\001\000\108\000\003\001\112\000\002\001\000\000\ + \\001\000\111\000\192\000\000\000\ + \\001\000\114\000\083\000\000\000\ + \\001\000\115\000\242\000\000\000\ + \\001\000\116\000\195\000\000\000\ + \\001\000\119\000\191\000\000\000\ + \\001\000\121\000\190\000\000\000\ + \\001\000\123\000\185\000\000\000\ + \\001\000\125\000\183\000\000\000\ + \\029\001\000\000\ + \\030\001\062\000\004\000\000\000\ + \\031\001\000\000\ + \\032\001\063\000\109\000\000\000\ + \\033\001\000\000\ + \\034\001\000\000\ + \\035\001\059\000\007\000\000\000\ + \\036\001\000\000\ + \\037\001\060\000\085\000\000\000\ + \\038\001\000\000\ + \\039\001\000\000\ + \\040\001\011\000\016\000\068\000\015\000\073\000\014\000\078\000\013\000\ + \\090\000\012\000\100\000\011\000\000\000\ + \\041\001\000\000\ + \\042\001\000\000\ + \\043\001\000\000\ + \\044\001\000\000\ + \\045\001\000\000\ + \\046\001\000\000\ + \\047\001\000\000\ + \\048\001\000\000\ + \\049\001\017\000\107\000\000\000\ + \\050\001\000\000\ + \\051\001\000\000\ + \\052\001\000\000\ + \\053\001\000\000\ + \\054\001\000\000\ + \\055\001\000\000\ + \\056\001\000\000\ + \\057\001\000\000\ + \\058\001\002\000\081\000\004\000\080\000\006\000\079\000\009\000\078\000\ + \\012\000\077\000\014\000\076\000\018\000\074\000\021\000\073\000\ + \\023\000\072\000\025\000\071\000\029\000\070\000\031\000\069\000\ + \\033\000\068\000\035\000\067\000\039\000\066\000\041\000\065\000\ + \\043\000\064\000\045\000\063\000\047\000\062\000\049\000\061\000\ + \\051\000\060\000\053\000\059\000\055\000\058\000\057\000\057\000\ + \\061\000\056\000\064\000\055\000\066\000\054\000\067\000\053\000\ + \\068\000\098\000\069\000\052\000\074\000\051\000\076\000\050\000\ + \\079\000\049\000\083\000\048\000\085\000\047\000\086\000\046\000\ + \\088\000\045\000\090\000\097\000\092\000\044\000\094\000\043\000\ + \\096\000\042\000\098\000\041\000\102\000\040\000\104\000\039\000\ + \\106\000\038\000\110\000\037\000\118\000\036\000\120\000\035\000\ + \\122\000\034\000\124\000\033\000\126\000\032\000\127\000\031\000\ + \\128\000\030\000\000\000\ + \\059\001\000\000\ + \\060\001\000\000\ + \\061\001\000\000\ + \\062\001\000\000\ + \\063\001\000\000\ + \\064\001\004\000\080\000\014\000\076\000\021\000\073\000\031\000\069\000\ + \\033\000\068\000\035\000\067\000\045\000\063\000\047\000\062\000\ + \\049\000\061\000\051\000\060\000\053\000\059\000\055\000\058\000\ + \\057\000\057\000\061\000\056\000\068\000\098\000\076\000\050\000\ + \\079\000\049\000\083\000\048\000\084\000\103\000\086\000\046\000\ + \\106\000\038\000\122\000\034\000\000\000\ + \\064\001\004\000\080\000\014\000\076\000\021\000\073\000\031\000\069\000\ + \\033\000\068\000\035\000\067\000\045\000\063\000\047\000\062\000\ + \\049\000\061\000\051\000\060\000\053\000\059\000\055\000\058\000\ + \\057\000\057\000\061\000\056\000\068\000\098\000\076\000\050\000\ + \\079\000\049\000\083\000\048\000\084\000\173\000\086\000\046\000\ + \\106\000\038\000\122\000\034\000\000\000\ + \\064\001\004\000\080\000\014\000\076\000\021\000\073\000\031\000\069\000\ + \\033\000\068\000\035\000\067\000\045\000\063\000\047\000\062\000\ + \\049\000\061\000\051\000\060\000\053\000\059\000\055\000\058\000\ + \\057\000\057\000\061\000\056\000\068\000\098\000\076\000\050\000\ + \\079\000\049\000\083\000\048\000\084\000\178\000\086\000\046\000\ + \\106\000\038\000\122\000\034\000\000\000\ + \\065\001\000\000\ + \\066\001\000\000\ + \\067\001\000\000\ + \\068\001\000\000\ + \\069\001\000\000\ + \\070\001\000\000\ + \\071\001\000\000\ + \\072\001\000\000\ + \\073\001\000\000\ + \\074\001\000\000\ + \\075\001\000\000\ + \\076\001\002\000\081\000\006\000\079\000\009\000\078\000\012\000\077\000\ + \\018\000\074\000\023\000\072\000\025\000\071\000\029\000\070\000\ + \\039\000\066\000\041\000\065\000\043\000\064\000\064\000\055\000\ + \\066\000\054\000\067\000\053\000\069\000\052\000\074\000\051\000\ + \\083\000\048\000\085\000\047\000\088\000\045\000\090\000\097\000\ + \\092\000\044\000\094\000\043\000\096\000\042\000\098\000\041\000\ + \\102\000\040\000\104\000\039\000\110\000\037\000\118\000\036\000\ + \\120\000\035\000\124\000\033\000\126\000\032\000\127\000\031\000\ + \\128\000\030\000\000\000\ + \\077\001\000\000\ + \\078\001\000\000\ + \\079\001\000\000\ + \\080\001\083\000\048\000\084\000\239\000\000\000\ + \\080\001\083\000\048\000\084\000\012\001\000\000\ + \\081\001\000\000\ + \\082\001\000\000\ + \\083\001\000\000\ + \\084\001\000\000\ + \\085\001\000\000\ + \\086\001\000\000\ + \\087\001\000\000\ + \\088\001\000\000\ + \\089\001\000\000\ + \\090\001\000\000\ + \\091\001\000\000\ + \\092\001\000\000\ + \\093\001\000\000\ + \\094\001\000\000\ + \\095\001\000\000\ + \\096\001\000\000\ + \\097\001\000\000\ + \\098\001\000\000\ + \\099\001\071\000\115\000\000\000\ + \\100\001\000\000\ + \\101\001\000\000\ + \\102\001\027\000\151\000\037\000\150\000\000\000\ + \\103\001\000\000\ + \\104\001\000\000\ + \\105\001\000\000\ + \\106\001\002\000\081\000\006\000\079\000\009\000\078\000\012\000\077\000\ + \\014\000\076\000\018\000\074\000\021\000\073\000\023\000\072\000\ + \\025\000\071\000\029\000\070\000\031\000\069\000\033\000\068\000\ + \\035\000\067\000\039\000\066\000\041\000\065\000\043\000\064\000\ + \\045\000\063\000\061\000\056\000\064\000\055\000\066\000\054\000\ + \\067\000\053\000\068\000\098\000\069\000\052\000\074\000\051\000\ + \\076\000\050\000\079\000\049\000\083\000\048\000\085\000\047\000\ + \\086\000\046\000\088\000\045\000\090\000\097\000\092\000\044\000\ + \\094\000\043\000\096\000\042\000\098\000\041\000\102\000\040\000\ + \\104\000\039\000\106\000\038\000\110\000\037\000\118\000\036\000\ + \\120\000\035\000\122\000\034\000\124\000\033\000\126\000\032\000\ + \\127\000\031\000\128\000\030\000\000\000\ + \\107\001\000\000\ + \\108\001\000\000\ + \\109\001\000\000\ + \\110\001\000\000\ + \\111\001\014\000\076\000\021\000\073\000\031\000\069\000\033\000\068\000\ + \\035\000\067\000\045\000\063\000\061\000\056\000\068\000\098\000\ + \\076\000\050\000\079\000\049\000\083\000\048\000\084\000\252\000\ + \\086\000\046\000\106\000\038\000\122\000\034\000\000\000\ + \\111\001\014\000\076\000\021\000\073\000\031\000\069\000\033\000\068\000\ + \\035\000\067\000\045\000\063\000\061\000\056\000\068\000\098\000\ + \\076\000\050\000\079\000\049\000\083\000\048\000\084\000\016\001\ + \\086\000\046\000\106\000\038\000\122\000\034\000\000\000\ + \\112\001\000\000\ + \\113\001\000\000\ + \\114\001\000\000\ + \\115\001\072\000\248\000\000\000\ + \\116\001\000\000\ + \\117\001\038\000\008\001\000\000\ + \\118\001\000\000\ + \\119\001\028\000\010\001\000\000\ + \\120\001\000\000\ + \\121\001\000\000\ + \\122\001\019\000\120\000\000\000\ + \\123\001\000\000\ + \\124\001\116\000\195\000\000\000\ + \\125\001\000\000\ + \\126\001\117\000\020\001\000\000\ + \\127\001\000\000\ + \\128\001\108\000\003\001\112\000\002\001\000\000\ + \\129\001\000\000\ + \\130\001\000\000\ + \\131\001\113\000\026\001\000\000\ + \\132\001\000\000\ + \\133\001\109\000\027\001\000\000\ + \\134\001\000\000\ + \\135\001\002\000\081\000\006\000\079\000\009\000\078\000\012\000\077\000\ + \\018\000\074\000\023\000\072\000\025\000\071\000\029\000\070\000\ + \\039\000\066\000\041\000\065\000\043\000\064\000\064\000\055\000\ + \\066\000\054\000\067\000\053\000\069\000\052\000\074\000\051\000\ + \\085\000\047\000\088\000\045\000\090\000\097\000\092\000\044\000\ + \\094\000\043\000\096\000\042\000\098\000\041\000\102\000\040\000\ + \\104\000\039\000\110\000\037\000\118\000\036\000\120\000\035\000\ + \\124\000\033\000\126\000\032\000\127\000\031\000\128\000\030\000\000\000\ + \\136\001\000\000\ + \\137\001\000\000\ + \\138\001\000\000\ + \\139\001\000\000\ + \\140\001\000\000\ + \\141\001\000\000\ + \\142\001\000\000\ + \\143\001\000\000\ + \\144\001\000\000\ + \\145\001\000\000\ + \\146\001\000\000\ + \\147\001\000\000\ + \\148\001\000\000\ + \\149\001\000\000\ + \\150\001\000\000\ + \\151\001\000\000\ + \\152\001\000\000\ + \\153\001\000\000\ + \\154\001\000\000\ + \\155\001\000\000\ + \\156\001\000\000\ + \\157\001\000\000\ + \\158\001\000\000\ + \\159\001\000\000\ + \\160\001\000\000\ + \\161\001\000\000\ + \\162\001\000\000\ + \\163\001\000\000\ + \\164\001\000\000\ + \\165\001\000\000\ + \\166\001\000\000\ + \\167\001\000\000\ + \\168\001\000\000\ + \\169\001\008\000\134\000\000\000\ + \\170\001\000\000\ + \\171\001\000\000\ + \\172\001\000\000\ + \\173\001\000\000\ + \\174\001\081\000\127\000\000\000\ + \\175\001\000\000\ + \\176\001\082\000\006\001\000\000\ + \\177\001\000\000\ + \\178\001\000\000\ + \\179\001\126\000\032\000\127\000\031\000\128\000\030\000\000\000\ + \\180\001\000\000\ + \\181\001\000\000\ + \\182\001\000\000\ + \\183\001\000\000\ + \" + val actionRowNumbers = + "\053\000\058\000\054\000\063\000\ + \\001\000\059\000\063\000\045\000\ + \\060\000\206\000\206\000\065\000\ + \\066\000\067\000\068\000\164\000\ + \\168\000\167\000\166\000\165\000\ + \\081\000\110\000\109\000\087\000\ + \\081\000\081\000\072\000\055\000\ + \\210\000\209\000\208\000\162\000\ + \\125\000\162\000\162\000\206\000\ + \\149\000\162\000\162\000\162\000\ + \\162\000\162\000\201\000\162\000\ + \\162\000\195\000\162\000\125\000\ + \\125\000\196\000\162\000\198\000\ + \\189\000\162\000\115\000\162\000\ + \\162\000\162\000\162\000\162\000\ + \\162\000\081\000\162\000\162\000\ + \\162\000\128\000\081\000\125\000\ + \\162\000\162\000\162\000\081\000\ + \\193\000\081\000\081\000\162\000\ + \\162\000\162\000\101\000\162\000\ + \\064\000\206\000\057\000\061\000\ + \\206\000\205\000\039\000\033\000\ + \\081\000\169\000\088\000\081\000\ + \\117\000\081\000\076\000\206\000\ + \\118\000\089\000\081\000\081\000\ + \\080\000\081\000\078\000\077\000\ + \\071\000\073\000\052\000\056\000\ + \\162\000\161\000\051\000\125\000\ + \\050\000\132\000\049\000\048\000\ + \\044\000\047\000\162\000\041\000\ + \\040\000\038\000\037\000\036\000\ + \\035\000\206\000\032\000\031\000\ + \\119\000\030\000\029\000\028\000\ + \\196\000\027\000\026\000\025\000\ + \\024\000\023\000\022\000\021\000\ + \\020\000\074\000\019\000\018\000\ + \\017\000\016\000\128\000\015\000\ + \\162\000\132\000\014\000\013\000\ + \\012\000\011\000\010\000\009\000\ + \\075\000\007\000\006\000\005\000\ + \\004\000\101\000\105\000\003\000\ + \\002\000\046\000\207\000\069\000\ + \\070\000\082\000\086\000\081\000\ + \\084\000\083\000\034\000\093\000\ + \\081\000\091\000\090\000\079\000\ + \\163\000\186\000\126\000\120\000\ + \\132\000\142\000\137\000\132\000\ + \\174\000\171\000\200\000\151\000\ + \\042\000\043\000\008\000\179\000\ + \\178\000\181\000\175\000\177\000\ + \\199\000\203\000\184\000\148\000\ + \\121\000\123\000\194\000\197\000\ + \\185\000\172\000\099\000\098\000\ + \\097\000\096\000\095\000\094\000\ + \\114\000\192\000\191\000\180\000\ + \\129\000\124\000\144\000\146\000\ + \\111\000\122\000\183\000\182\000\ + \\187\000\112\000\113\000\176\000\ + \\173\000\190\000\102\000\106\000\ + \\104\000\101\000\100\000\188\000\ + \\063\000\085\000\170\000\092\000\ + \\133\000\127\000\143\000\136\000\ + \\138\000\132\000\132\000\134\000\ + \\152\000\116\000\155\000\153\000\ + \\081\000\081\000\150\000\201\000\ + \\204\000\130\000\145\000\131\000\ + \\147\000\108\000\101\000\103\000\ + \\062\000\141\000\132\000\139\000\ + \\135\000\156\000\154\000\158\000\ + \\160\000\202\000\107\000\140\000\ + \\157\000\159\000\000\000" + val gotoT = + "\ + \\001\000\026\001\002\000\001\000\000\000\ + \\004\000\004\000\005\000\003\000\000\000\ + \\000\000\ + \\007\000\008\000\008\000\007\000\009\000\006\000\000\000\ + \\010\000\027\000\014\000\026\000\017\000\025\000\020\000\024\000\ + \\022\000\023\000\023\000\022\000\033\000\021\000\041\000\020\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\008\000\080\000\009\000\006\000\000\000\ + \\000\000\ + \\006\000\082\000\000\000\ + \\050\000\086\000\051\000\085\000\052\000\084\000\000\000\ + \\050\000\087\000\051\000\085\000\052\000\084\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\015\000\094\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\016\000\100\000\017\000\099\000\020\000\092\000\021\000\098\000\ + \\022\000\097\000\023\000\022\000\033\000\021\000\000\000\ + \\015\000\102\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\015\000\103\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\012\000\104\000\000\000\ + \\003\000\106\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\039\000\110\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\024\000\112\000\025\000\111\000\000\000\ + \\039\000\114\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\115\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\050\000\116\000\051\000\085\000\052\000\084\000\000\000\ + \\034\000\117\000\000\000\ + \\039\000\119\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\120\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\121\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\122\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\123\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\048\000\124\000\000\000\ + \\039\000\126\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\127\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\039\000\128\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\024\000\129\000\025\000\111\000\000\000\ + \\024\000\130\000\025\000\111\000\000\000\ + \\046\000\131\000\000\000\ + \\039\000\133\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\039\000\134\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\039\000\135\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\136\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\137\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\138\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\139\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\140\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\013\000\142\000\015\000\141\000\017\000\093\000\020\000\092\000\ + \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ + \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ + \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ + \\039\000\143\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\144\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\145\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\026\000\147\000\027\000\146\000\000\000\ + \\013\000\150\000\015\000\141\000\017\000\093\000\020\000\092\000\ + \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ + \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ + \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ + \\024\000\151\000\025\000\111\000\000\000\ + \\039\000\152\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\153\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\154\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\013\000\155\000\015\000\141\000\017\000\093\000\020\000\092\000\ + \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ + \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ + \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\013\000\156\000\015\000\141\000\017\000\093\000\020\000\092\000\ + \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ + \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ + \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ + \\013\000\157\000\015\000\141\000\017\000\093\000\020\000\092\000\ + \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ + \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ + \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ + \\039\000\158\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\159\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\160\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\018\000\163\000\022\000\162\000\041\000\089\000\042\000\161\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\039\000\164\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\050\000\165\000\051\000\085\000\052\000\084\000\000\000\ + \\000\000\ + \\000\000\ + \\051\000\166\000\052\000\084\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\015\000\169\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\016\000\170\000\017\000\099\000\020\000\092\000\021\000\098\000\ + \\022\000\097\000\023\000\022\000\033\000\021\000\000\000\ + \\015\000\172\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\015\000\173\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\050\000\174\000\051\000\085\000\052\000\084\000\000\000\ + \\000\000\ + \\016\000\175\000\017\000\099\000\020\000\092\000\021\000\098\000\ + \\022\000\097\000\023\000\022\000\033\000\021\000\000\000\ + \\015\000\177\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\015\000\178\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\015\000\179\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\040\000\180\000\041\000\089\000\042\000\108\000\043\000\019\000\ + \\044\000\018\000\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\024\000\182\000\025\000\111\000\000\000\ + \\000\000\ + \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ + \\028\000\185\000\033\000\021\000\041\000\089\000\042\000\184\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\035\000\192\000\036\000\191\000\000\000\ + \\039\000\194\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\050\000\201\000\051\000\085\000\052\000\084\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\046\000\207\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\026\000\220\000\027\000\146\000\000\000\ + \\000\000\ + \\039\000\222\000\040\000\109\000\041\000\089\000\042\000\108\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ + \\028\000\223\000\033\000\021\000\041\000\089\000\042\000\184\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\018\000\234\000\022\000\162\000\041\000\089\000\042\000\161\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\019\000\236\000\022\000\235\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\015\000\241\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\015\000\243\000\017\000\093\000\020\000\092\000\021\000\091\000\ + \\022\000\090\000\023\000\022\000\033\000\021\000\041\000\089\000\ + \\042\000\088\000\043\000\019\000\044\000\018\000\045\000\017\000\ + \\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ + \\028\000\244\000\033\000\021\000\041\000\089\000\042\000\184\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\030\000\245\000\000\000\ + \\020\000\092\000\021\000\249\000\022\000\248\000\023\000\022\000\ + \\029\000\247\000\033\000\021\000\000\000\ + \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ + \\028\000\251\000\033\000\021\000\041\000\089\000\042\000\184\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\035\000\252\000\036\000\191\000\000\000\ + \\000\000\ + \\037\000\255\000\038\000\254\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\049\000\003\001\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\031\000\005\001\000\000\ + \\032\000\007\001\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\019\000\009\001\022\000\235\000\000\000\ + \\000\000\ + \\018\000\011\001\022\000\162\000\041\000\089\000\042\000\161\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\008\000\012\001\009\000\006\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\020\000\092\000\021\000\249\000\022\000\248\000\023\000\022\000\ + \\029\000\013\001\033\000\021\000\000\000\ + \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ + \\028\000\015\001\033\000\021\000\041\000\089\000\042\000\184\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ + \\028\000\016\001\033\000\021\000\041\000\089\000\042\000\184\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\037\000\017\001\038\000\254\000\000\000\ + \\000\000\ + \\013\000\019\001\015\000\141\000\017\000\093\000\020\000\092\000\ + \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ + \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ + \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ + \\013\000\020\001\015\000\141\000\017\000\093\000\020\000\092\000\ + \\021\000\091\000\022\000\090\000\023\000\022\000\033\000\021\000\ + \\041\000\089\000\042\000\088\000\043\000\019\000\044\000\018\000\ + \\045\000\017\000\047\000\016\000\052\000\015\000\000\000\ + \\000\000\ + \\048\000\021\001\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\018\000\022\001\022\000\162\000\041\000\089\000\042\000\161\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\020\000\092\000\021\000\187\000\022\000\186\000\023\000\022\000\ + \\028\000\023\001\033\000\021\000\041\000\089\000\042\000\184\000\ + \\043\000\019\000\044\000\018\000\045\000\017\000\047\000\016\000\ + \\052\000\015\000\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \\000\000\ + \" + val numstates = 283 + val numrules = 155 + val s = ref "" and index = ref 0 + val string_to_int = fn () => + let val i = !index + in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256 + end + val string_to_list = fn s' => + let val len = String.size s' + fun f () = + if !index < len then string_to_int() :: f() + else nil + in index := 0; s := s'; f () + end + val string_to_pairlist = fn (conv_key,conv_entry) => + let fun f () = + case string_to_int() + of 0 => EMPTY + | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f()) + in f + end + val string_to_pairlist_default = fn (conv_key,conv_entry) => + let val conv_row = string_to_pairlist(conv_key,conv_entry) + in fn () => + let val default = conv_entry(string_to_int()) + val row = conv_row() + in (row,default) + end + end + val string_to_table = fn (convert_row,s') => + let val len = String.size s' + fun f ()= + if !index < len then convert_row() :: f() + else nil + in (s := s'; index := 0; f ()) + end + local + val memo = Array.array(numstates+numrules,ERROR) + val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1)) + fun f i = + if i=numstates then g i + else (Array.update(memo,i,SHIFT (STATE i)); f (i+1)) + in f 0 handle Subscript => () + end + in + val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2)) + end + val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT)) + val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows) + val actionRowNumbers = string_to_list actionRowNumbers + val actionT = let val actionRowLookUp= + let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end + in Array.fromList(map actionRowLookUp actionRowNumbers) + end + in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules, + numStates=numstates,initialState=STATE 0} + end + end + local open Header in + type pos = int + type arg = int -> HTMLAttrs.context + structure MlyValue = + struct + datatype svalue = VOID | ntVOID of unit | ENTITY_REF of (string) + | CHAR_REF of (string) | PCDATA of (string) + | START_UL of (HTMLAttrVals.attrs) + | START_TR of (HTMLAttrVals.attrs) + | START_TH of (HTMLAttrVals.attrs) + | START_TEXTAREA of (HTMLAttrVals.attrs) + | START_TD of (HTMLAttrVals.attrs) + | START_TABLE of (HTMLAttrVals.attrs) + | START_SELECT of (HTMLAttrVals.attrs) + | START_PRE of (HTMLAttrVals.attrs) + | TAG_PARAM of (HTMLAttrVals.attrs) + | START_P of (HTMLAttrVals.attrs) + | START_OPTION of (HTMLAttrVals.attrs) + | START_OL of (HTMLAttrVals.attrs) + | TAG_META of (HTMLAttrVals.attrs) + | START_MENU of (HTMLAttrVals.attrs) + | START_MAP of (HTMLAttrVals.attrs) + | TAG_LINK of (HTMLAttrVals.attrs) + | START_LI of (HTMLAttrVals.attrs) + | TAG_ISINDEX of (HTMLAttrVals.attrs) + | TAG_INPUT of (HTMLAttrVals.attrs) + | TAG_IMG of (HTMLAttrVals.attrs) | TAG_HR of (HTMLAttrVals.attrs) + | START_H6 of (HTMLAttrVals.attrs) + | START_H5 of (HTMLAttrVals.attrs) + | START_H4 of (HTMLAttrVals.attrs) + | START_H3 of (HTMLAttrVals.attrs) + | START_H2 of (HTMLAttrVals.attrs) + | START_H1 of (HTMLAttrVals.attrs) + | START_FORM of (HTMLAttrVals.attrs) + | START_BASEFONT of (HTMLAttrVals.attrs) + | START_FONT of (HTMLAttrVals.attrs) + | START_DL of (HTMLAttrVals.attrs) + | START_DIV of (HTMLAttrVals.attrs) + | START_DIR of (HTMLAttrVals.attrs) + | START_CAPTION of (HTMLAttrVals.attrs) + | TAG_BR of (HTMLAttrVals.attrs) + | START_BODY of (HTMLAttrVals.attrs) + | TAG_BASE of (HTMLAttrVals.attrs) + | TAG_AREA of (HTMLAttrVals.attrs) + | START_APPLET of (HTMLAttrVals.attrs) + | START_A of (HTMLAttrVals.attrs) | PCDataElem of (HTML.pcdata) + | PCDataList of (HTML.pcdata list) | PCData of (HTML.pcdata) + | OptionList of (HTML.select_option list) | Form of (HTML.text) + | AreaList of (HTML.area list) | Special of (HTML.text) + | Phrase of (HTML.text) | Font of (HTML.text) + | Text of (HTML.text) | TextWOScript of (HTML.text) + | TextList' of (HTML.text list) | TextList of (HTML.text) + | TableCell of (HTML.table_cell) + | TableCellList of (HTML.table_cell list) | TableRow of (HTML.tr) + | TableRowList of (HTML.tr list) + | optCaption of (HTML.caption option) + | Preformatted of (HTML.block) | Flow2 of (blklist_item list) + | Flow1 of (blklist_item list) | DLItem of (deflist_item) + | DLItemList of (deflist_item list) | ListItem of (HTML.list_item) + | ListItemList of (HTML.list_item list) | List of (HTML.block) + | Paragraph of (HTML.block) | Block of (HTML.block) + | BlockWOIndex of (HTML.block) + | AddressContent2 of (blklist_item list) + | AddressContent1 of (blklist_item list) + | BodyElement of (HTML.block) | BodyContent2 of (blklist_item list) + | BodyContent1 of (blklist_item list) | BodyContent0 of (HTML.body) + | BodyContent of (HTML.block) | Body of (HTML.body) + | HeadElement of (HTML.head_content) + | HeadElements of (HTML.head_content list) + | HeadContents of (HTML.head_content list) + | Head of (HTML.head_content list) + | StartHTML of (HTML.cdata option) | Document of (HTML.html) + end + type svalue = MlyValue.svalue + type result = HTML.html + end + structure EC= + struct + open LrTable + infix 5 $$ + fun x $$ y = y::x + val is_keyword = + fn _ => false + val preferred_change : (term list * term list) list = + nil + val noShift = + fn (T 0) => true | _ => false + val showTerminal = + fn (T 0) => "EOF" + | (T 1) => "START_A" + | (T 2) => "END_A" + | (T 3) => "START_ADDRESS" + | (T 4) => "END_ADDRESS" + | (T 5) => "START_APPLET" + | (T 6) => "END_APPLET" + | (T 7) => "TAG_AREA" + | (T 8) => "START_B" + | (T 9) => "END_B" + | (T 10) => "TAG_BASE" + | (T 11) => "START_BIG" + | (T 12) => "END_BIG" + | (T 13) => "START_BLOCKQUOTE" + | (T 14) => "END_BLOCKQUOTE" + | (T 15) => "START_BODY" + | (T 16) => "END_BODY" + | (T 17) => "TAG_BR" + | (T 18) => "START_CAPTION" + | (T 19) => "END_CAPTION" + | (T 20) => "START_CENTER" + | (T 21) => "END_CENTER" + | (T 22) => "START_CITE" + | (T 23) => "END_CITE" + | (T 24) => "START_CODE" + | (T 25) => "END_CODE" + | (T 26) => "START_DD" + | (T 27) => "END_DD" + | (T 28) => "START_DFN" + | (T 29) => "END_DFN" + | (T 30) => "START_DIR" + | (T 31) => "END_DIR" + | (T 32) => "START_DIV" + | (T 33) => "END_DIV" + | (T 34) => "START_DL" + | (T 35) => "END_DL" + | (T 36) => "START_DT" + | (T 37) => "END_DT" + | (T 38) => "START_EM" + | (T 39) => "END_EM" + | (T 40) => "START_FONT" + | (T 41) => "END_FONT" + | (T 42) => "START_BASEFONT" + | (T 43) => "END_BASEFONT" + | (T 44) => "START_FORM" + | (T 45) => "END_FORM" + | (T 46) => "START_H1" + | (T 47) => "END_H1" + | (T 48) => "START_H2" + | (T 49) => "END_H2" + | (T 50) => "START_H3" + | (T 51) => "END_H3" + | (T 52) => "START_H4" + | (T 53) => "END_H4" + | (T 54) => "START_H5" + | (T 55) => "END_H5" + | (T 56) => "START_H6" + | (T 57) => "END_H6" + | (T 58) => "START_HEAD" + | (T 59) => "END_HEAD" + | (T 60) => "TAG_HR" + | (T 61) => "START_HTML" + | (T 62) => "END_HTML" + | (T 63) => "START_I" + | (T 64) => "END_I" + | (T 65) => "TAG_IMG" + | (T 66) => "TAG_INPUT" + | (T 67) => "TAG_ISINDEX" + | (T 68) => "START_KBD" + | (T 69) => "END_KBD" + | (T 70) => "START_LI" + | (T 71) => "END_LI" + | (T 72) => "TAG_LINK" + | (T 73) => "START_MAP" + | (T 74) => "END_MAP" + | (T 75) => "START_MENU" + | (T 76) => "END_MENU" + | (T 77) => "TAG_META" + | (T 78) => "START_OL" + | (T 79) => "END_OL" + | (T 80) => "START_OPTION" + | (T 81) => "END_OPTION" + | (T 82) => "START_P" + | (T 83) => "END_P" + | (T 84) => "TAG_PARAM" + | (T 85) => "START_PRE" + | (T 86) => "END_PRE" + | (T 87) => "START_SAMP" + | (T 88) => "END_SAMP" + | (T 89) => "START_SCRIPT" + | (T 90) => "END_SCRIPT" + | (T 91) => "START_SELECT" + | (T 92) => "END_SELECT" + | (T 93) => "START_SMALL" + | (T 94) => "END_SMALL" + | (T 95) => "START_STRIKE" + | (T 96) => "END_STRIKE" + | (T 97) => "START_STRONG" + | (T 98) => "END_STRONG" + | (T 99) => "START_STYLE" + | (T 100) => "END_STYLE" + | (T 101) => "START_SUB" + | (T 102) => "END_SUB" + | (T 103) => "START_SUP" + | (T 104) => "END_SUP" + | (T 105) => "START_TABLE" + | (T 106) => "END_TABLE" + | (T 107) => "START_TD" + | (T 108) => "END_TD" + | (T 109) => "START_TEXTAREA" + | (T 110) => "END_TEXTAREA" + | (T 111) => "START_TH" + | (T 112) => "END_TH" + | (T 113) => "START_TITLE" + | (T 114) => "END_TITLE" + | (T 115) => "START_TR" + | (T 116) => "END_TR" + | (T 117) => "START_TT" + | (T 118) => "END_TT" + | (T 119) => "START_U" + | (T 120) => "END_U" + | (T 121) => "START_UL" + | (T 122) => "END_UL" + | (T 123) => "START_VAR" + | (T 124) => "END_VAR" + | (T 125) => "PCDATA" + | (T 126) => "CHAR_REF" + | (T 127) => "ENTITY_REF" + | _ => "bogus-term" + local open Header in + val errtermvalue= + fn (T 1) => MlyValue.START_A(([])) | + (T 5) => MlyValue.START_APPLET(( + [ + ("CODE", HTMLAttrs.NAME ""), + ("WIDTH", HTMLAttrs.NAME ""), + ("HEIGHT", HTMLAttrs.NAME "") + ] + )) | + (T 7) => MlyValue.TAG_AREA(([("ALT", HTMLAttrs.NAME "")])) | + (T 10) => MlyValue.TAG_BASE(([("URL", HTMLAttrs.NAME "")])) | + (T 15) => MlyValue.START_BODY(([])) | + (T 17) => MlyValue.TAG_BR(([])) | + (T 18) => MlyValue.START_CAPTION(([])) | + (T 30) => MlyValue.START_DIR(([])) | + (T 32) => MlyValue.START_DIV(([])) | + (T 34) => MlyValue.START_DL(([])) | + (T 40) => MlyValue.START_FONT(([])) | + (T 42) => MlyValue.START_BASEFONT(([])) | + (T 44) => MlyValue.START_FORM(([])) | + (T 46) => MlyValue.START_H1(([])) | + (T 48) => MlyValue.START_H2(([])) | + (T 50) => MlyValue.START_H3(([])) | + (T 52) => MlyValue.START_H4(([])) | + (T 54) => MlyValue.START_H5(([])) | + (T 56) => MlyValue.START_H6(([])) | + (T 60) => MlyValue.TAG_HR(([])) | + (T 65) => MlyValue.TAG_IMG(([("SRC", HTMLAttrs.NAME "")])) | + (T 66) => MlyValue.TAG_INPUT(([])) | + (T 67) => MlyValue.TAG_ISINDEX(([])) | + (T 72) => MlyValue.TAG_LINK(([])) | + (T 73) => MlyValue.START_MAP(([])) | + (T 75) => MlyValue.START_MENU(([])) | + (T 77) => MlyValue.TAG_META(([("CONTENT", HTMLAttrs.NAME "")])) | + (T 78) => MlyValue.START_OL(([])) | + (T 80) => MlyValue.START_OPTION(([])) | + (T 82) => MlyValue.START_P(([])) | + (T 84) => MlyValue.TAG_PARAM(([("NAME", HTMLAttrs.NAME "")])) | + (T 85) => MlyValue.START_PRE(([])) | + (T 91) => MlyValue.START_SELECT(([("NAME", HTMLAttrs.NAME "")])) | + (T 105) => MlyValue.START_TABLE(([])) | + (T 107) => MlyValue.START_TD(([])) | + (T 109) => MlyValue.START_TEXTAREA(( + [ + ("NAME", HTMLAttrs.NAME ""), + ("ROWS", HTMLAttrs.NAME "0"), + ("COLS", HTMLAttrs.NAME "0") + ] + )) | + (T 111) => MlyValue.START_TH(([])) | + (T 115) => MlyValue.START_TR(([])) | + (T 121) => MlyValue.START_UL(([])) | + _ => MlyValue.VOID + end + val terms : term list = nil + $$ (T 124) $$ (T 123) $$ (T 122) $$ (T 120) $$ (T 119) $$ (T 118) $$ + (T 117) $$ (T 116) $$ (T 114) $$ (T 113) $$ (T 112) $$ (T 110) $$ (T + 108) $$ (T 106) $$ (T 104) $$ (T 103) $$ (T 102) $$ (T 101) $$ (T 100) + $$ (T 99) $$ (T 98) $$ (T 97) $$ (T 96) $$ (T 95) $$ (T 94) $$ (T 93) + $$ (T 92) $$ (T 90) $$ (T 89) $$ (T 88) $$ (T 87) $$ (T 86) $$ (T 83) + $$ (T 81) $$ (T 79) $$ (T 76) $$ (T 74) $$ (T 71) $$ (T 69) $$ (T 68) + $$ (T 64) $$ (T 63) $$ (T 62) $$ (T 61) $$ (T 59) $$ (T 58) $$ (T 57) + $$ (T 55) $$ (T 53) $$ (T 51) $$ (T 49) $$ (T 47) $$ (T 45) $$ (T 43) + $$ (T 41) $$ (T 39) $$ (T 38) $$ (T 37) $$ (T 36) $$ (T 35) $$ (T 33) + $$ (T 31) $$ (T 29) $$ (T 28) $$ (T 27) $$ (T 26) $$ (T 25) $$ (T 24) + $$ (T 23) $$ (T 22) $$ (T 21) $$ (T 20) $$ (T 19) $$ (T 16) $$ (T 14) + $$ (T 13) $$ (T 12) $$ (T 11) $$ (T 9) $$ (T 8) $$ (T 6) $$ (T 4) $$ + (T 3) $$ (T 2) $$ (T 0)end + structure Actions = + struct + exception mlyAction of int + local open Header in + val actions = + fn (i392,defaultPos,stack, + (ctx):arg) => + case (i392,stack) + of ( 0, ( ( _, ( _, _, EndHTML1right)) :: ( _, ( MlyValue.Body Body, + _, _)) :: ( _, ( MlyValue.Head Head, _, _)) :: ( _, ( + MlyValue.StartHTML StartHTML, StartHTML1left, _)) :: rest671)) => let + val result = MlyValue.Document ( + HTML.HTML{version=StartHTML, head=Head, body=Body}) + in ( LrTable.NT 0, ( result, StartHTML1left, EndHTML1right), rest671) + + end + | ( 1, ( rest671)) => let val result = MlyValue.StartHTML (NONE) + in ( LrTable.NT 1, ( result, defaultPos, defaultPos), rest671) + end + | ( 2, ( ( _, ( _, START_HTML1left, START_HTML1right)) :: rest671)) + => let val result = MlyValue.StartHTML (NONE) + in ( LrTable.NT 1, ( result, START_HTML1left, START_HTML1right), + rest671) + end + | ( 3, ( rest671)) => let val result = MlyValue.ntVOID () + in ( LrTable.NT 2, ( result, defaultPos, defaultPos), rest671) + end + | ( 4, ( ( _, ( _, END_HTML1left, END_HTML1right)) :: rest671)) => + let val result = MlyValue.ntVOID () + in ( LrTable.NT 2, ( result, END_HTML1left, END_HTML1right), rest671) + + end + | ( 5, ( ( _, ( _, _, EndHEAD1right)) :: ( _, ( MlyValue.HeadContents + HeadContents, _, _)) :: ( _, ( _, StartHEAD1left, _)) :: rest671)) => + let val result = MlyValue.Head (HeadContents) + in ( LrTable.NT 3, ( result, StartHEAD1left, EndHEAD1right), rest671) + + end + | ( 6, ( rest671)) => let val result = MlyValue.ntVOID () + in ( LrTable.NT 4, ( result, defaultPos, defaultPos), rest671) + end + | ( 7, ( ( _, ( _, START_HEAD1left, START_HEAD1right)) :: rest671)) + => let val result = MlyValue.ntVOID () + in ( LrTable.NT 4, ( result, START_HEAD1left, START_HEAD1right), + rest671) + end + | ( 8, ( rest671)) => let val result = MlyValue.ntVOID () + in ( LrTable.NT 5, ( result, defaultPos, defaultPos), rest671) + end + | ( 9, ( ( _, ( _, END_HEAD1left, END_HEAD1right)) :: rest671)) => + let val result = MlyValue.ntVOID () + in ( LrTable.NT 5, ( result, END_HEAD1left, END_HEAD1right), rest671) + + end + | ( 10, ( ( _, ( MlyValue.HeadElements HeadElements2, _, + HeadElements2right)) :: _ :: ( _, ( MlyValue.PCData PCData, _, _)) :: + _ :: ( _, ( MlyValue.HeadElements HeadElements1, HeadElements1left, _ + )) :: rest671)) => let val result = MlyValue.HeadContents ( + HeadElements1 @ (HTML.Head_TITLE PCData :: HeadElements2)) + in ( LrTable.NT 6, ( result, HeadElements1left, HeadElements2right), + rest671) + end + | ( 11, ( rest671)) => let val result = MlyValue.HeadElements ([]) + in ( LrTable.NT 7, ( result, defaultPos, defaultPos), rest671) + end + | ( 12, ( ( _, ( MlyValue.HeadElements HeadElements, _, + HeadElements1right)) :: ( _, ( MlyValue.HeadElement HeadElement, + HeadElement1left, _)) :: rest671)) => let val result = + MlyValue.HeadElements (HeadElement :: HeadElements) + in ( LrTable.NT 7, ( result, HeadElement1left, HeadElements1right), + rest671) + end + | ( 13, ( ( _, ( MlyValue.TAG_META TAG_META, (TAG_METAleft as + TAG_META1left), TAG_META1right)) :: rest671)) => let val result = + MlyValue.HeadElement (HTMLAttrs.mkMETA(ctx TAG_METAleft, TAG_META)) + in ( LrTable.NT 8, ( result, TAG_META1left, TAG_META1right), rest671) + + end + | ( 14, ( ( _, ( MlyValue.TAG_LINK TAG_LINK, (TAG_LINKleft as + TAG_LINK1left), TAG_LINK1right)) :: rest671)) => let val result = + MlyValue.HeadElement (HTMLAttrs.mkLINK(ctx TAG_LINKleft, TAG_LINK)) + in ( LrTable.NT 8, ( result, TAG_LINK1left, TAG_LINK1right), rest671) + + end + | ( 15, ( ( _, ( MlyValue.TAG_ISINDEX TAG_ISINDEX, (TAG_ISINDEXleft + as TAG_ISINDEX1left), TAG_ISINDEX1right)) :: rest671)) => let val + result = MlyValue.HeadElement ( + let val stuff = + HTMLAttrs.mkISINDEX (ctx TAG_ISINDEXleft, TAG_ISINDEX) + in HTML.Head_ISINDEX stuff end + + ) + in ( LrTable.NT 8, ( result, TAG_ISINDEX1left, TAG_ISINDEX1right), + rest671) + end + | ( 16, ( ( _, ( MlyValue.TAG_BASE TAG_BASE, (TAG_BASEleft as + TAG_BASE1left), TAG_BASE1right)) :: rest671)) => let val result = + MlyValue.HeadElement (HTMLAttrs.mkBASE(ctx TAG_BASEleft, TAG_BASE)) + in ( LrTable.NT 8, ( result, TAG_BASE1left, TAG_BASE1right), rest671) + + end + | ( 17, ( ( _, ( _, _, END_STYLE1right)) :: ( _, ( MlyValue.PCData + PCData, _, _)) :: ( _, ( _, START_STYLE1left, _)) :: rest671)) => let + val result = MlyValue.HeadElement (HTML.Head_STYLE(PCData)) + in ( LrTable.NT 8, ( result, START_STYLE1left, END_STYLE1right), + rest671) + end + | ( 18, ( ( _, ( _, _, END_SCRIPT1right)) :: ( _, ( MlyValue.PCData + PCData, _, _)) :: ( _, ( _, START_SCRIPT1left, _)) :: rest671)) => let + val result = MlyValue.HeadElement (HTML.Head_SCRIPT(PCData)) + in ( LrTable.NT 8, ( result, START_SCRIPT1left, END_SCRIPT1right), + rest671) + end + | ( 19, ( ( _, ( _, _, EndBODY1right)) :: ( _, ( + MlyValue.BodyContent0 BodyContent0, BodyContent01left, _)) :: rest671) + ) => let val result = MlyValue.Body (BodyContent0) + in ( LrTable.NT 9, ( result, BodyContent01left, EndBODY1right), + rest671) + end + | ( 20, ( rest671)) => let val result = MlyValue.ntVOID () + in ( LrTable.NT 11, ( result, defaultPos, defaultPos), rest671) + end + | ( 21, ( ( _, ( _, END_BODY1left, END_BODY1right)) :: rest671)) => + let val result = MlyValue.ntVOID () + in ( LrTable.NT 11, ( result, END_BODY1left, END_BODY1right), rest671 + ) + end + | ( 22, ( ( _, ( MlyValue.BodyContent1 BodyContent1, + BodyContent11left, BodyContent11right)) :: rest671)) => let val + result = MlyValue.BodyContent (mkBlock BodyContent1) + in ( LrTable.NT 12, ( result, BodyContent11left, BodyContent11right), + rest671) + end + | ( 23, ( ( _, ( MlyValue.BodyContent BodyContent, _, + BodyContent1right)) :: ( _, ( MlyValue.START_BODY START_BODY, ( + START_BODYleft as START_BODY1left), _)) :: rest671)) => let val + result = MlyValue.BodyContent0 ( + HTMLAttrs.mkBODY(ctx START_BODYleft, START_BODY, BodyContent)) + in ( LrTable.NT 13, ( result, START_BODY1left, BodyContent1right), + rest671) + end + | ( 24, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: ( _, ( MlyValue.TextWOScript TextWOScript, + TextWOScript1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent0 (mkBody(consText(TextWOScript, BodyContent1))) + in ( LrTable.NT 13, ( result, TextWOScript1left, BodyContent11right), + rest671) + end + | ( 25, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: ( _, ( MlyValue.BodyElement BodyElement, + BodyElement1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent0 (mkBody(consBlock(BodyElement, BodyContent1))) + in ( LrTable.NT 13, ( result, BodyElement1left, BodyContent11right), + rest671) + end + | ( 26, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: ( _, ( MlyValue.BlockWOIndex BlockWOIndex, + BlockWOIndex1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent0 (mkBody(consBlock(BlockWOIndex, BodyContent1))) + in ( LrTable.NT 13, ( result, BlockWOIndex1left, BodyContent11right), + rest671) + end + | ( 27, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent0 (mkBody(consBlock(Paragraph, BodyContent1))) + in ( LrTable.NT 13, ( result, Paragraph1left, BodyContent11right), + rest671) + end + | ( 28, ( ( _, ( MlyValue.BodyContent2 BodyContent2, _, + BodyContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent0 (mkBody(consBlock(Paragraph, BodyContent2))) + in ( LrTable.NT 13, ( result, Paragraph1left, BodyContent21right), + rest671) + end + | ( 29, ( rest671)) => let val result = MlyValue.BodyContent1 ([]) + in ( LrTable.NT 14, ( result, defaultPos, defaultPos), rest671) + end + | ( 30, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: ( _, ( MlyValue.Text Text, Text1left, _)) :: + rest671)) => let val result = MlyValue.BodyContent1 ( + consText(Text, BodyContent1)) + in ( LrTable.NT 14, ( result, Text1left, BodyContent11right), rest671 + ) + end + | ( 31, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: ( _, ( MlyValue.BodyElement BodyElement, + BodyElement1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent1 (consBlock(BodyElement, BodyContent1)) + in ( LrTable.NT 14, ( result, BodyElement1left, BodyContent11right), + rest671) + end + | ( 32, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: ( _, ( MlyValue.Block Block, Block1left, _)) + :: rest671)) => let val result = MlyValue.BodyContent1 ( + consBlock(Block, BodyContent1)) + in ( LrTable.NT 14, ( result, Block1left, BodyContent11right), + rest671) + end + | ( 33, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent1 (consBlock(Paragraph, BodyContent1)) + in ( LrTable.NT 14, ( result, Paragraph1left, BodyContent11right), + rest671) + end + | ( 34, ( ( _, ( MlyValue.BodyContent2 BodyContent2, _, + BodyContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent1 (consBlock(Paragraph, BodyContent2)) + in ( LrTable.NT 14, ( result, Paragraph1left, BodyContent21right), + rest671) + end + | ( 35, ( rest671)) => let val result = MlyValue.BodyContent2 ([]) + in ( LrTable.NT 15, ( result, defaultPos, defaultPos), rest671) + end + | ( 36, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: ( _, ( MlyValue.BodyElement BodyElement, + BodyElement1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent2 (consBlock(BodyElement, BodyContent1)) + in ( LrTable.NT 15, ( result, BodyElement1left, BodyContent11right), + rest671) + end + | ( 37, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: ( _, ( MlyValue.Block Block, Block1left, _)) + :: rest671)) => let val result = MlyValue.BodyContent2 ( + consBlock(Block, BodyContent1)) + in ( LrTable.NT 15, ( result, Block1left, BodyContent11right), + rest671) + end + | ( 38, ( ( _, ( MlyValue.BodyContent1 BodyContent1, _, + BodyContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent2 (consBlock(Paragraph, BodyContent1)) + in ( LrTable.NT 15, ( result, Paragraph1left, BodyContent11right), + rest671) + end + | ( 39, ( ( _, ( MlyValue.BodyContent2 BodyContent2, _, + BodyContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.BodyContent2 (consBlock(Paragraph, BodyContent2)) + in ( LrTable.NT 15, ( result, Paragraph1left, BodyContent21right), + rest671) + end + | ( 40, ( ( _, ( _, _, END_H11right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_H1 START_H1, (START_H1left + as START_H11left), _)) :: rest671)) => let val result = + MlyValue.BodyElement ( + HTMLAttrs.mkHn(1, ctx START_H1left, START_H1, TextList)) + in ( LrTable.NT 16, ( result, START_H11left, END_H11right), rest671) + + end + | ( 41, ( ( _, ( _, _, END_H21right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_H2 START_H2, (START_H2left + as START_H21left), _)) :: rest671)) => let val result = + MlyValue.BodyElement ( + HTMLAttrs.mkHn(2, ctx START_H2left, START_H2, TextList)) + in ( LrTable.NT 16, ( result, START_H21left, END_H21right), rest671) + + end + | ( 42, ( ( _, ( _, _, END_H31right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_H3 START_H3, (START_H3left + as START_H31left), _)) :: rest671)) => let val result = + MlyValue.BodyElement ( + HTMLAttrs.mkHn(3, ctx START_H3left, START_H3, TextList)) + in ( LrTable.NT 16, ( result, START_H31left, END_H31right), rest671) + + end + | ( 43, ( ( _, ( _, _, END_H41right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_H4 START_H4, (START_H4left + as START_H41left), _)) :: rest671)) => let val result = + MlyValue.BodyElement ( + HTMLAttrs.mkHn(4, ctx START_H4left, START_H4, TextList)) + in ( LrTable.NT 16, ( result, START_H41left, END_H41right), rest671) + + end + | ( 44, ( ( _, ( _, _, END_H51right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_H5 START_H5, (START_H5left + as START_H51left), _)) :: rest671)) => let val result = + MlyValue.BodyElement ( + HTMLAttrs.mkHn(5, ctx START_H5left, START_H5, TextList)) + in ( LrTable.NT 16, ( result, START_H51left, END_H51right), rest671) + + end + | ( 45, ( ( _, ( _, _, END_H61right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_H6 START_H6, (START_H6left + as START_H61left), _)) :: rest671)) => let val result = + MlyValue.BodyElement ( + HTMLAttrs.mkHn(6, ctx START_H6left, START_H6, TextList)) + in ( LrTable.NT 16, ( result, START_H61left, END_H61right), rest671) + + end + | ( 46, ( ( _, ( _, _, END_ADDRESS1right)) :: ( _, ( + MlyValue.AddressContent1 AddressContent1, _, _)) :: ( _, ( _, + START_ADDRESS1left, _)) :: rest671)) => let val result = + MlyValue.BodyElement (HTML.ADDRESS(mkBlock AddressContent1)) + in ( LrTable.NT 16, ( result, START_ADDRESS1left, END_ADDRESS1right), + rest671) + end + | ( 47, ( rest671)) => let val result = MlyValue.AddressContent1 ([] + ) + in ( LrTable.NT 17, ( result, defaultPos, defaultPos), rest671) + end + | ( 48, ( ( _, ( MlyValue.AddressContent1 AddressContent1, _, + AddressContent11right)) :: ( _, ( MlyValue.Text Text, Text1left, _)) + :: rest671)) => let val result = MlyValue.AddressContent1 ( + consText(Text, AddressContent1)) + in ( LrTable.NT 17, ( result, Text1left, AddressContent11right), + rest671) + end + | ( 49, ( ( _, ( MlyValue.AddressContent1 AddressContent1, _, + AddressContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.AddressContent1 (consBlock(Paragraph, AddressContent1)) + in ( LrTable.NT 17, ( result, Paragraph1left, AddressContent11right), + rest671) + end + | ( 50, ( ( _, ( MlyValue.AddressContent2 AddressContent2, _, + AddressContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.AddressContent1 (consBlock(Paragraph, AddressContent2)) + in ( LrTable.NT 17, ( result, Paragraph1left, AddressContent21right), + rest671) + end + | ( 51, ( rest671)) => let val result = MlyValue.AddressContent2 ([] + ) + in ( LrTable.NT 18, ( result, defaultPos, defaultPos), rest671) + end + | ( 52, ( ( _, ( MlyValue.AddressContent1 AddressContent1, _, + AddressContent11right)) :: _ :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.AddressContent2 (consBlock(Paragraph, AddressContent1)) + in ( LrTable.NT 18, ( result, Paragraph1left, AddressContent11right), + rest671) + end + | ( 53, ( ( _, ( MlyValue.AddressContent2 AddressContent2, _, + AddressContent21right)) :: ( _, ( MlyValue.Paragraph Paragraph, + Paragraph1left, _)) :: rest671)) => let val result = + MlyValue.AddressContent2 (consBlock(Paragraph, AddressContent2)) + in ( LrTable.NT 18, ( result, Paragraph1left, AddressContent21right), + rest671) + end + | ( 54, ( ( _, ( MlyValue.List List, List1left, List1right)) :: + rest671)) => let val result = MlyValue.BlockWOIndex (List) + in ( LrTable.NT 19, ( result, List1left, List1right), rest671) + end + | ( 55, ( ( _, ( MlyValue.Preformatted Preformatted, + Preformatted1left, Preformatted1right)) :: rest671)) => let val + result = MlyValue.BlockWOIndex (Preformatted) + in ( LrTable.NT 19, ( result, Preformatted1left, Preformatted1right), + rest671) + end + | ( 56, ( ( _, ( _, _, END_DIV1right)) :: ( _, ( MlyValue.BodyContent + BodyContent, _, _)) :: ( _, ( MlyValue.START_DIV START_DIV, ( + START_DIVleft as START_DIV1left), _)) :: rest671)) => let val result + = MlyValue.BlockWOIndex ( + HTMLAttrs.mkDIV(ctx START_DIVleft, START_DIV, BodyContent)) + in ( LrTable.NT 19, ( result, START_DIV1left, END_DIV1right), rest671 + ) + end + | ( 57, ( ( _, ( _, _, END_CENTER1right)) :: ( _, ( + MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( _, + START_CENTER1left, _)) :: rest671)) => let val result = + MlyValue.BlockWOIndex (HTML.CENTER BodyContent) + in ( LrTable.NT 19, ( result, START_CENTER1left, END_CENTER1right), + rest671) + end + | ( 58, ( ( _, ( _, _, END_BLOCKQUOTE1right)) :: ( _, ( + MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( _, + START_BLOCKQUOTE1left, _)) :: rest671)) => let val result = + MlyValue.BlockWOIndex (HTML.BLOCKQUOTE BodyContent) + in ( LrTable.NT 19, ( result, START_BLOCKQUOTE1left, + END_BLOCKQUOTE1right), rest671) + end + | ( 59, ( ( _, ( _, _, END_FORM1right)) :: ( _, ( + MlyValue.BodyContent BodyContent, _, _)) :: ( _, ( MlyValue.START_FORM + START_FORM, (START_FORMleft as START_FORM1left), _)) :: rest671)) => + let val result = MlyValue.BlockWOIndex ( + HTMLAttrs.mkFORM(ctx START_FORMleft, START_FORM, BodyContent)) + in ( LrTable.NT 19, ( result, START_FORM1left, END_FORM1right), + rest671) + end + | ( 60, ( ( _, ( MlyValue.TAG_HR TAG_HR, (TAG_HRleft as TAG_HR1left), + TAG_HR1right)) :: rest671)) => let val result = + MlyValue.BlockWOIndex (HTMLAttrs.mkHR(ctx TAG_HRleft, TAG_HR)) + in ( LrTable.NT 19, ( result, TAG_HR1left, TAG_HR1right), rest671) + + end + | ( 61, ( ( _, ( _, _, END_TABLE1right)) :: ( _, ( + MlyValue.TableRowList TableRowList, _, _)) :: ( _, ( + MlyValue.optCaption optCaption, _, _)) :: ( _, ( MlyValue.START_TABLE + START_TABLE, (START_TABLEleft as START_TABLE1left), _)) :: rest671)) + => let val result = MlyValue.BlockWOIndex ( + HTMLAttrs.mkTABLE( + ctx START_TABLEleft, START_TABLE, + {caption = optCaption, body = TableRowList}) + + ) + in ( LrTable.NT 19, ( result, START_TABLE1left, END_TABLE1right), + rest671) + end + | ( 62, ( ( _, ( MlyValue.BlockWOIndex BlockWOIndex, + BlockWOIndex1left, BlockWOIndex1right)) :: rest671)) => let val + result = MlyValue.Block (BlockWOIndex) + in ( LrTable.NT 20, ( result, BlockWOIndex1left, BlockWOIndex1right), + rest671) + end + | ( 63, ( ( _, ( MlyValue.TAG_ISINDEX TAG_ISINDEX, (TAG_ISINDEXleft + as TAG_ISINDEX1left), TAG_ISINDEX1right)) :: rest671)) => let val + result = MlyValue.Block ( + let val stuff = + HTMLAttrs.mkISINDEX (ctx TAG_ISINDEXleft, TAG_ISINDEX) + in HTML.ISINDEX stuff end + + ) + in ( LrTable.NT 20, ( result, TAG_ISINDEX1left, TAG_ISINDEX1right), + rest671) + end + | ( 64, ( ( _, ( MlyValue.TextList TextList, _, TextList1right)) :: ( + _, ( MlyValue.START_P START_P, (START_Pleft as START_P1left), _)) :: + rest671)) => let val result = MlyValue.Paragraph ( + HTMLAttrs.mkP(ctx START_Pleft, START_P, TextList)) + in ( LrTable.NT 21, ( result, START_P1left, TextList1right), rest671) + + end + | ( 65, ( ( _, ( _, _, END_UL1right)) :: ( _, ( MlyValue.ListItemList + ListItemList, _, _)) :: ( _, ( MlyValue.START_UL START_UL, ( + START_ULleft as START_UL1left), _)) :: rest671)) => let val result = + MlyValue.List ( + HTMLAttrs.mkUL(ctx START_ULleft, START_UL, ListItemList)) + in ( LrTable.NT 22, ( result, START_UL1left, END_UL1right), rest671) + + end + | ( 66, ( ( _, ( _, _, END_OL1right)) :: ( _, ( MlyValue.ListItemList + ListItemList, _, _)) :: ( _, ( MlyValue.START_OL START_OL, ( + START_OLleft as START_OL1left), _)) :: rest671)) => let val result = + MlyValue.List ( + HTMLAttrs.mkOL(ctx START_OLleft, START_OL, ListItemList)) + in ( LrTable.NT 22, ( result, START_OL1left, END_OL1right), rest671) + + end + | ( 67, ( ( _, ( _, _, END_DIR1right)) :: ( _, ( + MlyValue.ListItemList ListItemList, _, _)) :: ( _, ( + MlyValue.START_DIR START_DIR, (START_DIRleft as START_DIR1left), _)) + :: rest671)) => let val result = MlyValue.List ( + HTMLAttrs.mkDIR(ctx START_DIRleft, START_DIR, ListItemList)) + in ( LrTable.NT 22, ( result, START_DIR1left, END_DIR1right), rest671 + ) + end + | ( 68, ( ( _, ( _, _, END_MENU1right)) :: ( _, ( + MlyValue.ListItemList ListItemList, _, _)) :: ( _, ( + MlyValue.START_MENU START_MENU, (START_MENUleft as START_MENU1left), _ + )) :: rest671)) => let val result = MlyValue.List ( + HTMLAttrs.mkMENU(ctx START_MENUleft, START_MENU, ListItemList)) + in ( LrTable.NT 22, ( result, START_MENU1left, END_MENU1right), + rest671) + end + | ( 69, ( ( _, ( _, _, END_DL1right)) :: ( _, ( MlyValue.DLItemList + DLItemList, _, _)) :: ( _, ( MlyValue.START_DL START_DL, (START_DLleft + as START_DL1left), _)) :: rest671)) => let val result = + MlyValue.List ( + HTMLAttrs.mkDL( + ctx START_DLleft, START_DL, + groupDefListContents DLItemList) + + ) + in ( LrTable.NT 22, ( result, START_DL1left, END_DL1right), rest671) + + end + | ( 70, ( rest671)) => let val result = MlyValue.ListItemList ([]) + in ( LrTable.NT 23, ( result, defaultPos, defaultPos), rest671) + end + | ( 71, ( ( _, ( MlyValue.ListItemList ListItemList, _, + ListItemList1right)) :: ( _, ( MlyValue.ListItem ListItem, + ListItem1left, _)) :: rest671)) => let val result = + MlyValue.ListItemList (ListItem :: ListItemList) + in ( LrTable.NT 23, ( result, ListItem1left, ListItemList1right), + rest671) + end + | ( 72, ( ( _, ( _, _, EndLI1right)) :: ( _, ( MlyValue.Flow1 Flow1, + _, _)) :: ( _, ( MlyValue.START_LI START_LI, (START_LIleft as + START_LI1left), _)) :: rest671)) => let val result = + MlyValue.ListItem ( + HTMLAttrs.mkLI(ctx START_LIleft, START_LI, mkBlock Flow1)) + in ( LrTable.NT 24, ( result, START_LI1left, EndLI1right), rest671) + + end + | ( 73, ( rest671)) => let val result = MlyValue.DLItemList ([]) + in ( LrTable.NT 25, ( result, defaultPos, defaultPos), rest671) + end + | ( 74, ( ( _, ( MlyValue.DLItemList DLItemList, _, DLItemList1right) + ) :: ( _, ( MlyValue.DLItem DLItem, DLItem1left, _)) :: rest671)) => + let val result = MlyValue.DLItemList (DLItem :: DLItemList) + in ( LrTable.NT 25, ( result, DLItem1left, DLItemList1right), rest671 + ) + end + | ( 75, ( ( _, ( _, _, EndDT1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_DT1left, _)) :: rest671)) => let + val result = MlyValue.DLItem (DL_tag TextList) + in ( LrTable.NT 26, ( result, START_DT1left, EndDT1right), rest671) + + end + | ( 76, ( ( _, ( _, _, EndDD1right)) :: ( _, ( MlyValue.Flow1 Flow1, + _, _)) :: ( _, ( _, START_DD1left, _)) :: rest671)) => let val + result = MlyValue.DLItem (DL_item(mkBlock Flow1)) + in ( LrTable.NT 26, ( result, START_DD1left, EndDD1right), rest671) + + end + | ( 77, ( rest671)) => let val result = MlyValue.Flow1 ([]) + in ( LrTable.NT 27, ( result, defaultPos, defaultPos), rest671) + end + | ( 78, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: ( _, ( + MlyValue.Text Text, Text1left, _)) :: rest671)) => let val result = + MlyValue.Flow1 (consText(Text, Flow1)) + in ( LrTable.NT 27, ( result, Text1left, Flow11right), rest671) + end + | ( 79, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: ( _, ( + MlyValue.Block Block, Block1left, _)) :: rest671)) => let val result + = MlyValue.Flow1 (consBlock(Block, Flow1)) + in ( LrTable.NT 27, ( result, Block1left, Flow11right), rest671) + end + | ( 80, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: _ :: ( _, + ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => + let val result = MlyValue.Flow1 (consBlock(Paragraph, Flow1)) + in ( LrTable.NT 27, ( result, Paragraph1left, Flow11right), rest671) + + end + | ( 81, ( ( _, ( MlyValue.Flow2 Flow2, _, Flow21right)) :: ( _, ( + MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let + val result = MlyValue.Flow1 (consBlock(Paragraph, Flow2)) + in ( LrTable.NT 27, ( result, Paragraph1left, Flow21right), rest671) + + end + | ( 82, ( rest671)) => let val result = MlyValue.Flow2 ([]) + in ( LrTable.NT 28, ( result, defaultPos, defaultPos), rest671) + end + | ( 83, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: ( _, ( + MlyValue.Block Block, Block1left, _)) :: rest671)) => let val result + = MlyValue.Flow2 (consBlock(Block, Flow1)) + in ( LrTable.NT 28, ( result, Block1left, Flow11right), rest671) + end + | ( 84, ( ( _, ( MlyValue.Flow1 Flow1, _, Flow11right)) :: _ :: ( _, + ( MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => + let val result = MlyValue.Flow2 (consBlock(Paragraph, Flow1)) + in ( LrTable.NT 28, ( result, Paragraph1left, Flow11right), rest671) + + end + | ( 85, ( ( _, ( MlyValue.Flow2 Flow2, _, Flow21right)) :: ( _, ( + MlyValue.Paragraph Paragraph, Paragraph1left, _)) :: rest671)) => let + val result = MlyValue.Flow2 (consBlock(Paragraph, Flow2)) + in ( LrTable.NT 28, ( result, Paragraph1left, Flow21right), rest671) + + end + | ( 86, ( rest671)) => let val result = MlyValue.ntVOID () + in ( LrTable.NT 29, ( result, defaultPos, defaultPos), rest671) + end + | ( 87, ( ( _, ( _, END_LI1left, END_LI1right)) :: rest671)) => let + val result = MlyValue.ntVOID () + in ( LrTable.NT 29, ( result, END_LI1left, END_LI1right), rest671) + + end + | ( 88, ( rest671)) => let val result = MlyValue.ntVOID () + in ( LrTable.NT 30, ( result, defaultPos, defaultPos), rest671) + end + | ( 89, ( ( _, ( _, END_DT1left, END_DT1right)) :: rest671)) => let + val result = MlyValue.ntVOID () + in ( LrTable.NT 30, ( result, END_DT1left, END_DT1right), rest671) + + end + | ( 90, ( rest671)) => let val result = MlyValue.ntVOID () + in ( LrTable.NT 31, ( result, defaultPos, defaultPos), rest671) + end + | ( 91, ( ( _, ( _, END_DD1left, END_DD1right)) :: rest671)) => let + val result = MlyValue.ntVOID () + in ( LrTable.NT 31, ( result, END_DD1left, END_DD1right), rest671) + + end + | ( 92, ( ( _, ( _, _, END_PRE1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_PRE START_PRE, ( + START_PREleft as START_PRE1left), _)) :: rest671)) => let val result + = MlyValue.Preformatted ( + HTMLAttrs.mkPRE(ctx START_PREleft, START_PRE, TextList)) + in ( LrTable.NT 32, ( result, START_PRE1left, END_PRE1right), rest671 + ) + end + | ( 93, ( rest671)) => let val result = MlyValue.optCaption (NONE) + in ( LrTable.NT 33, ( result, defaultPos, defaultPos), rest671) + end + | ( 94, ( ( _, ( _, _, END_CAPTION1right)) :: ( _, ( + MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_CAPTION + START_CAPTION, (START_CAPTIONleft as START_CAPTION1left), _)) :: + rest671)) => let val result = MlyValue.optCaption ( + SOME(HTMLAttrs.mkCAPTION( + ctx START_CAPTIONleft, START_CAPTION, TextList)) + ) + in ( LrTable.NT 33, ( result, START_CAPTION1left, END_CAPTION1right), + rest671) + end + | ( 95, ( ( _, ( MlyValue.TableRow TableRow, TableRow1left, + TableRow1right)) :: rest671)) => let val result = + MlyValue.TableRowList ([TableRow]) + in ( LrTable.NT 34, ( result, TableRow1left, TableRow1right), rest671 + ) + end + | ( 96, ( ( _, ( MlyValue.TableRowList TableRowList, _, + TableRowList1right)) :: ( _, ( MlyValue.TableRow TableRow, + TableRow1left, _)) :: rest671)) => let val result = + MlyValue.TableRowList (TableRow :: TableRowList) + in ( LrTable.NT 34, ( result, TableRow1left, TableRowList1right), + rest671) + end + | ( 97, ( ( _, ( MlyValue.TableCellList TableCellList, _, + TableCellList1right)) :: ( _, ( MlyValue.START_TR START_TR, ( + START_TRleft as START_TR1left), _)) :: rest671)) => let val result = + MlyValue.TableRow ( + HTMLAttrs.mkTR(ctx START_TRleft, START_TR, TableCellList)) + in ( LrTable.NT 35, ( result, START_TR1left, TableCellList1right), + rest671) + end + | ( 98, ( ( _, ( _, _, END_TR1right)) :: ( _, ( + MlyValue.TableCellList TableCellList, _, _)) :: ( _, ( + MlyValue.START_TR START_TR, (START_TRleft as START_TR1left), _)) :: + rest671)) => let val result = MlyValue.TableRow ( + HTMLAttrs.mkTR(ctx START_TRleft, START_TR, TableCellList)) + in ( LrTable.NT 35, ( result, START_TR1left, END_TR1right), rest671) + + end + | ( 99, ( ( _, ( MlyValue.TableCell TableCell, TableCell1left, + TableCell1right)) :: rest671)) => let val result = + MlyValue.TableCellList ([TableCell]) + in ( LrTable.NT 36, ( result, TableCell1left, TableCell1right), + rest671) + end + | ( 100, ( ( _, ( MlyValue.TableCellList TableCellList, _, + TableCellList1right)) :: ( _, ( MlyValue.TableCell TableCell, + TableCell1left, _)) :: rest671)) => let val result = + MlyValue.TableCellList (TableCell :: TableCellList) + in ( LrTable.NT 36, ( result, TableCell1left, TableCellList1right), + rest671) + end + | ( 101, ( ( _, ( _, _, END_TH1right)) :: ( _, ( MlyValue.BodyContent + BodyContent, _, _)) :: ( _, ( MlyValue.START_TH START_TH, ( + START_THleft as START_TH1left), _)) :: rest671)) => let val result = + MlyValue.TableCell ( + HTMLAttrs.mkTH(ctx START_THleft, START_TH, BodyContent)) + in ( LrTable.NT 37, ( result, START_TH1left, END_TH1right), rest671) + + end + | ( 102, ( ( _, ( MlyValue.BodyContent BodyContent, _, + BodyContent1right)) :: ( _, ( MlyValue.START_TH START_TH, ( + START_THleft as START_TH1left), _)) :: rest671)) => let val result = + MlyValue.TableCell ( + HTMLAttrs.mkTH(ctx START_THleft, START_TH, BodyContent)) + in ( LrTable.NT 37, ( result, START_TH1left, BodyContent1right), + rest671) + end + | ( 103, ( ( _, ( _, _, END_TD1right)) :: ( _, ( MlyValue.BodyContent + BodyContent, _, _)) :: ( _, ( MlyValue.START_TD START_TD, ( + START_TDleft as START_TD1left), _)) :: rest671)) => let val result = + MlyValue.TableCell ( + HTMLAttrs.mkTD(ctx START_TDleft, START_TD, BodyContent)) + in ( LrTable.NT 37, ( result, START_TD1left, END_TD1right), rest671) + + end + | ( 104, ( ( _, ( MlyValue.BodyContent BodyContent, _, + BodyContent1right)) :: ( _, ( MlyValue.START_TD START_TD, ( + START_TDleft as START_TD1left), _)) :: rest671)) => let val result = + MlyValue.TableCell ( + HTMLAttrs.mkTD(ctx START_TDleft, START_TD, BodyContent)) + in ( LrTable.NT 37, ( result, START_TD1left, BodyContent1right), + rest671) + end + | ( 105, ( ( _, ( MlyValue.TextList' TextList', TextList'1left, + TextList'1right)) :: rest671)) => let val result = MlyValue.TextList + (textList TextList') + in ( LrTable.NT 38, ( result, TextList'1left, TextList'1right), + rest671) + end + | ( 106, ( rest671)) => let val result = MlyValue.TextList' ([]) + in ( LrTable.NT 39, ( result, defaultPos, defaultPos), rest671) + end + | ( 107, ( ( _, ( MlyValue.TextList' TextList', _, TextList'1right)) + :: ( _, ( MlyValue.Text Text, Text1left, _)) :: rest671)) => let val + result = MlyValue.TextList' (Text :: TextList') + in ( LrTable.NT 39, ( result, Text1left, TextList'1right), rest671) + + end + | ( 108, ( ( _, ( MlyValue.PCDataElem PCDataElem, PCDataElem1left, + PCDataElem1right)) :: rest671)) => let val result = + MlyValue.TextWOScript (HTML.PCDATA PCDataElem) + in ( LrTable.NT 40, ( result, PCDataElem1left, PCDataElem1right), + rest671) + end + | ( 109, ( ( _, ( MlyValue.Font Font, Font1left, Font1right)) :: + rest671)) => let val result = MlyValue.TextWOScript (Font) + in ( LrTable.NT 40, ( result, Font1left, Font1right), rest671) + end + | ( 110, ( ( _, ( MlyValue.Phrase Phrase, Phrase1left, Phrase1right)) + :: rest671)) => let val result = MlyValue.TextWOScript (Phrase) + in ( LrTable.NT 40, ( result, Phrase1left, Phrase1right), rest671) + + end + | ( 111, ( ( _, ( MlyValue.Special Special, Special1left, + Special1right)) :: rest671)) => let val result = + MlyValue.TextWOScript (Special) + in ( LrTable.NT 40, ( result, Special1left, Special1right), rest671) + + end + | ( 112, ( ( _, ( MlyValue.Form Form, Form1left, Form1right)) :: + rest671)) => let val result = MlyValue.TextWOScript (Form) + in ( LrTable.NT 40, ( result, Form1left, Form1right), rest671) + end + | ( 113, ( ( _, ( MlyValue.TextWOScript TextWOScript, + TextWOScript1left, TextWOScript1right)) :: rest671)) => let val + result = MlyValue.Text (TextWOScript) + in ( LrTable.NT 41, ( result, TextWOScript1left, TextWOScript1right), + rest671) + end + | ( 114, ( ( _, ( _, _, END_SCRIPT1right)) :: ( _, ( MlyValue.PCData + PCData, _, _)) :: ( _, ( _, START_SCRIPT1left, _)) :: rest671)) => let + val result = MlyValue.Text (HTML.SCRIPT PCData) + in ( LrTable.NT 41, ( result, START_SCRIPT1left, END_SCRIPT1right), + rest671) + end + | ( 115, ( ( _, ( _, _, END_TT1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_TT1left, _)) :: rest671)) => let + val result = MlyValue.Font (HTML.TT(TextList)) + in ( LrTable.NT 42, ( result, START_TT1left, END_TT1right), rest671) + + end + | ( 116, ( ( _, ( _, _, END_I1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_I1left, _)) :: rest671)) => let + val result = MlyValue.Font (HTML.I(TextList)) + in ( LrTable.NT 42, ( result, START_I1left, END_I1right), rest671) + + end + | ( 117, ( ( _, ( _, _, END_B1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_B1left, _)) :: rest671)) => let + val result = MlyValue.Font (HTML.B(TextList)) + in ( LrTable.NT 42, ( result, START_B1left, END_B1right), rest671) + + end + | ( 118, ( ( _, ( _, _, END_U1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_U1left, _)) :: rest671)) => let + val result = MlyValue.Font (HTML.U(TextList)) + in ( LrTable.NT 42, ( result, START_U1left, END_U1right), rest671) + + end + | ( 119, ( ( _, ( _, _, END_STRIKE1right)) :: ( _, ( + MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_STRIKE1left, _)) + :: rest671)) => let val result = MlyValue.Font ( + HTML.STRIKE(TextList)) + in ( LrTable.NT 42, ( result, START_STRIKE1left, END_STRIKE1right), + rest671) + end + | ( 120, ( ( _, ( _, _, END_BIG1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_BIG1left, _)) :: rest671)) => let + val result = MlyValue.Font (HTML.BIG(TextList)) + in ( LrTable.NT 42, ( result, START_BIG1left, END_BIG1right), rest671 + ) + end + | ( 121, ( ( _, ( _, _, END_SMALL1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_SMALL1left, _)) :: rest671)) => + let val result = MlyValue.Font (HTML.SMALL(TextList)) + in ( LrTable.NT 42, ( result, START_SMALL1left, END_SMALL1right), + rest671) + end + | ( 122, ( ( _, ( _, _, END_SUB1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_SUB1left, _)) :: rest671)) => let + val result = MlyValue.Font (HTML.SUB(TextList)) + in ( LrTable.NT 42, ( result, START_SUB1left, END_SUB1right), rest671 + ) + end + | ( 123, ( ( _, ( _, _, END_SUP1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_SUP1left, _)) :: rest671)) => let + val result = MlyValue.Font (HTML.SUP(TextList)) + in ( LrTable.NT 42, ( result, START_SUP1left, END_SUP1right), rest671 + ) + end + | ( 124, ( ( _, ( _, _, END_EM1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_EM1left, _)) :: rest671)) => let + val result = MlyValue.Phrase (HTML.EM(TextList)) + in ( LrTable.NT 43, ( result, START_EM1left, END_EM1right), rest671) + + end + | ( 125, ( ( _, ( _, _, END_STRONG1right)) :: ( _, ( + MlyValue.TextList TextList, _, _)) :: ( _, ( _, START_STRONG1left, _)) + :: rest671)) => let val result = MlyValue.Phrase ( + HTML.STRONG(TextList)) + in ( LrTable.NT 43, ( result, START_STRONG1left, END_STRONG1right), + rest671) + end + | ( 126, ( ( _, ( _, _, END_CODE1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_CODE1left, _)) :: rest671)) => let + val result = MlyValue.Phrase (HTML.CODE(TextList)) + in ( LrTable.NT 43, ( result, START_CODE1left, END_CODE1right), + rest671) + end + | ( 127, ( ( _, ( _, _, END_DFN1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_DFN1left, _)) :: rest671)) => let + val result = MlyValue.Phrase (HTML.DFN(TextList)) + in ( LrTable.NT 43, ( result, START_DFN1left, END_DFN1right), rest671 + ) + end + | ( 128, ( ( _, ( _, _, END_SAMP1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_SAMP1left, _)) :: rest671)) => let + val result = MlyValue.Phrase (HTML.SAMP(TextList)) + in ( LrTable.NT 43, ( result, START_SAMP1left, END_SAMP1right), + rest671) + end + | ( 129, ( ( _, ( _, _, END_KBD1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_KBD1left, _)) :: rest671)) => let + val result = MlyValue.Phrase (HTML.KBD(TextList)) + in ( LrTable.NT 43, ( result, START_KBD1left, END_KBD1right), rest671 + ) + end + | ( 130, ( ( _, ( _, _, END_VAR1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_VAR1left, _)) :: rest671)) => let + val result = MlyValue.Phrase (HTML.VAR(TextList)) + in ( LrTable.NT 43, ( result, START_VAR1left, END_VAR1right), rest671 + ) + end + | ( 131, ( ( _, ( _, _, END_CITE1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( _, START_CITE1left, _)) :: rest671)) => let + val result = MlyValue.Phrase (HTML.CITE(TextList)) + in ( LrTable.NT 43, ( result, START_CITE1left, END_CITE1right), + rest671) + end + | ( 132, ( ( _, ( _, _, END_A1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_A START_A, (START_Aleft as + START_A1left), _)) :: rest671)) => let val result = MlyValue.Special + (HTMLAttrs.mkA(ctx START_Aleft, START_A, TextList)) + in ( LrTable.NT 44, ( result, START_A1left, END_A1right), rest671) + + end + | ( 133, ( ( _, ( MlyValue.TAG_IMG TAG_IMG, (TAG_IMGleft as + TAG_IMG1left), TAG_IMG1right)) :: rest671)) => let val result = + MlyValue.Special (HTMLAttrs.mkIMG(ctx TAG_IMGleft, TAG_IMG)) + in ( LrTable.NT 44, ( result, TAG_IMG1left, TAG_IMG1right), rest671) + + end + | ( 134, ( ( _, ( _, _, END_APPLET1right)) :: ( _, ( + MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_APPLET + START_APPLET, (START_APPLETleft as START_APPLET1left), _)) :: rest671) + ) => let val result = MlyValue.Special ( + HTMLAttrs.mkAPPLET(ctx START_APPLETleft, START_APPLET, TextList)) + in ( LrTable.NT 44, ( result, START_APPLET1left, END_APPLET1right), + rest671) + end + | ( 135, ( ( _, ( _, _, END_FONT1right)) :: ( _, ( MlyValue.TextList + TextList, _, _)) :: ( _, ( MlyValue.START_FONT START_FONT, ( + START_FONTleft as START_FONT1left), _)) :: rest671)) => let val + result = MlyValue.Special ( + HTMLAttrs.mkFONT(ctx START_FONTleft, START_FONT, TextList)) + in ( LrTable.NT 44, ( result, START_FONT1left, END_FONT1right), + rest671) + end + | ( 136, ( ( _, ( _, _, END_BASEFONT1right)) :: ( _, ( + MlyValue.TextList TextList, _, _)) :: ( _, ( MlyValue.START_BASEFONT + START_BASEFONT, (START_BASEFONTleft as START_BASEFONT1left), _)) :: + rest671)) => let val result = MlyValue.Special ( + HTMLAttrs.mkBASEFONT( + ctx START_BASEFONTleft, START_BASEFONT, TextList) + + ) + in ( LrTable.NT 44, ( result, START_BASEFONT1left, END_BASEFONT1right + ), rest671) + end + | ( 137, ( ( _, ( MlyValue.TAG_BR TAG_BR, (TAG_BRleft as TAG_BR1left) + , TAG_BR1right)) :: rest671)) => let val result = MlyValue.Special ( + HTMLAttrs.mkBR(ctx TAG_BRleft, TAG_BR)) + in ( LrTable.NT 44, ( result, TAG_BR1left, TAG_BR1right), rest671) + + end + | ( 138, ( ( _, ( _, _, END_MAP1right)) :: ( _, ( MlyValue.AreaList + AreaList, _, _)) :: ( _, ( MlyValue.START_MAP START_MAP, ( + START_MAPleft as START_MAP1left), _)) :: rest671)) => let val result + = MlyValue.Special ( + HTMLAttrs.mkMAP(ctx START_MAPleft, START_MAP, AreaList)) + in ( LrTable.NT 44, ( result, START_MAP1left, END_MAP1right), rest671 + ) + end + | ( 139, ( ( _, ( MlyValue.TAG_PARAM TAG_PARAM, (TAG_PARAMleft as + TAG_PARAM1left), TAG_PARAM1right)) :: rest671)) => let val result = + MlyValue.Special (HTMLAttrs.mkPARAM(ctx TAG_PARAMleft, TAG_PARAM)) + in ( LrTable.NT 44, ( result, TAG_PARAM1left, TAG_PARAM1right), + rest671) + end + | ( 140, ( rest671)) => let val result = MlyValue.AreaList ([]) + in ( LrTable.NT 45, ( result, defaultPos, defaultPos), rest671) + end + | ( 141, ( ( _, ( MlyValue.AreaList AreaList, _, AreaList1right)) :: + ( _, ( MlyValue.TAG_AREA TAG_AREA, (TAG_AREAleft as TAG_AREA1left), _) + ) :: rest671)) => let val result = MlyValue.AreaList ( + HTMLAttrs.mkAREA(ctx TAG_AREAleft, TAG_AREA) :: AreaList) + in ( LrTable.NT 45, ( result, TAG_AREA1left, AreaList1right), rest671 + ) + end + | ( 142, ( ( _, ( MlyValue.TAG_INPUT TAG_INPUT, (TAG_INPUTleft as + TAG_INPUT1left), TAG_INPUT1right)) :: rest671)) => let val result = + MlyValue.Form (HTMLAttrs.mkINPUT(ctx TAG_INPUTleft, TAG_INPUT)) + in ( LrTable.NT 46, ( result, TAG_INPUT1left, TAG_INPUT1right), + rest671) + end + | ( 143, ( ( _, ( _, _, END_SELECT1right)) :: ( _, ( + MlyValue.OptionList OptionList, _, _)) :: ( _, ( MlyValue.START_SELECT + START_SELECT, (START_SELECTleft as START_SELECT1left), _)) :: rest671 + )) => let val result = MlyValue.Form ( + HTMLAttrs.mkSELECT(ctx START_SELECTleft, START_SELECT, OptionList)) + in ( LrTable.NT 46, ( result, START_SELECT1left, END_SELECT1right), + rest671) + end + | ( 144, ( ( _, ( _, _, END_TEXTAREA1right)) :: ( _, ( + MlyValue.PCData PCData, _, _)) :: ( _, ( MlyValue.START_TEXTAREA + START_TEXTAREA, (START_TEXTAREAleft as START_TEXTAREA1left), _)) :: + rest671)) => let val result = MlyValue.Form ( + HTMLAttrs.mkTEXTAREA( + ctx START_TEXTAREAleft, START_TEXTAREA, + PCData) + + ) + in ( LrTable.NT 46, ( result, START_TEXTAREA1left, END_TEXTAREA1right + ), rest671) + end + | ( 145, ( rest671)) => let val result = MlyValue.OptionList ([]) + in ( LrTable.NT 47, ( result, defaultPos, defaultPos), rest671) + end + | ( 146, ( ( _, ( MlyValue.OptionList OptionList, _, OptionList1right + )) :: _ :: ( _, ( MlyValue.PCData PCData, _, _)) :: ( _, ( + MlyValue.START_OPTION START_OPTION, (START_OPTIONleft as + START_OPTION1left), _)) :: rest671)) => let val result = + MlyValue.OptionList ( + HTMLAttrs.mkOPTION(ctx START_OPTIONleft, START_OPTION, PCData) + :: OptionList + + ) + in ( LrTable.NT 47, ( result, START_OPTION1left, OptionList1right), + rest671) + end + | ( 147, ( rest671)) => let val result = MlyValue.ntVOID () + in ( LrTable.NT 48, ( result, defaultPos, defaultPos), rest671) + end + | ( 148, ( ( _, ( _, END_OPTION1left, END_OPTION1right)) :: rest671)) + => let val result = MlyValue.ntVOID () + in ( LrTable.NT 48, ( result, END_OPTION1left, END_OPTION1right), + rest671) + end + | ( 149, ( ( _, ( MlyValue.PCDataList PCDataList, PCDataList1left, + PCDataList1right)) :: rest671)) => let val result = MlyValue.PCData ( + concat PCDataList) + in ( LrTable.NT 49, ( result, PCDataList1left, PCDataList1right), + rest671) + end + | ( 150, ( rest671)) => let val result = MlyValue.PCDataList ([]) + in ( LrTable.NT 50, ( result, defaultPos, defaultPos), rest671) + end + | ( 151, ( ( _, ( MlyValue.PCDataList PCDataList, _, PCDataList1right + )) :: ( _, ( MlyValue.PCDataElem PCDataElem, PCDataElem1left, _)) :: + rest671)) => let val result = MlyValue.PCDataList ( + PCDataElem :: PCDataList) + in ( LrTable.NT 50, ( result, PCDataElem1left, PCDataList1right), + rest671) + end + | ( 152, ( ( _, ( MlyValue.PCDATA PCDATA, PCDATA1left, PCDATA1right)) + :: rest671)) => let val result = MlyValue.PCDataElem (PCDATA) + in ( LrTable.NT 51, ( result, PCDATA1left, PCDATA1right), rest671) + + end + | ( 153, ( ( _, ( MlyValue.CHAR_REF CHAR_REF, CHAR_REF1left, + CHAR_REF1right)) :: rest671)) => let val result = MlyValue.PCDataElem + (CHAR_REF) + in ( LrTable.NT 51, ( result, CHAR_REF1left, CHAR_REF1right), rest671 + ) + end + | ( 154, ( ( _, ( MlyValue.ENTITY_REF ENTITY_REF, ENTITY_REF1left, + ENTITY_REF1right)) :: rest671)) => let val result = + MlyValue.PCDataElem (ENTITY_REF) + in ( LrTable.NT 51, ( result, ENTITY_REF1left, ENTITY_REF1right), + rest671) + end + | _ => raise (mlyAction i392) + end + val void = MlyValue.VOID + val extract = fn a => (fn MlyValue.Document x => x + | _ => let exception ParseInternal + in raise ParseInternal end) a + end + end + structure Tokens : HTML_TOKENS = + struct + type svalue = ParserData.svalue + type ('a,'b) token = ('a,'b) Token.token + fun EOF (p1,p2) = Token.TOKEN (ParserData.LrTable.T 0,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_A (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 1,( + ParserData.MlyValue.START_A i,p1,p2)) + fun END_A (p1,p2) = Token.TOKEN (ParserData.LrTable.T 2,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_ADDRESS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 3,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_ADDRESS (p1,p2) = Token.TOKEN (ParserData.LrTable.T 4,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_APPLET (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 5,( + ParserData.MlyValue.START_APPLET i,p1,p2)) + fun END_APPLET (p1,p2) = Token.TOKEN (ParserData.LrTable.T 6,( + ParserData.MlyValue.VOID,p1,p2)) + fun TAG_AREA (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 7,( + ParserData.MlyValue.TAG_AREA i,p1,p2)) + fun START_B (p1,p2) = Token.TOKEN (ParserData.LrTable.T 8,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_B (p1,p2) = Token.TOKEN (ParserData.LrTable.T 9,( + ParserData.MlyValue.VOID,p1,p2)) + fun TAG_BASE (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 10,( + ParserData.MlyValue.TAG_BASE i,p1,p2)) + fun START_BIG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 11,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_BIG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 12,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_BLOCKQUOTE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 13,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_BLOCKQUOTE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 14,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_BODY (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 15,( + ParserData.MlyValue.START_BODY i,p1,p2)) + fun END_BODY (p1,p2) = Token.TOKEN (ParserData.LrTable.T 16,( + ParserData.MlyValue.VOID,p1,p2)) + fun TAG_BR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 17,( + ParserData.MlyValue.TAG_BR i,p1,p2)) + fun START_CAPTION (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 18,( + ParserData.MlyValue.START_CAPTION i,p1,p2)) + fun END_CAPTION (p1,p2) = Token.TOKEN (ParserData.LrTable.T 19,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_CENTER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 20,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_CENTER (p1,p2) = Token.TOKEN (ParserData.LrTable.T 21,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_CITE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 22,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_CITE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 23,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_CODE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 24,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_CODE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 25,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_DD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 26,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_DD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 27,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_DFN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 28,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_DFN (p1,p2) = Token.TOKEN (ParserData.LrTable.T 29,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_DIR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 30,( + ParserData.MlyValue.START_DIR i,p1,p2)) + fun END_DIR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 31,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_DIV (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 32,( + ParserData.MlyValue.START_DIV i,p1,p2)) + fun END_DIV (p1,p2) = Token.TOKEN (ParserData.LrTable.T 33,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_DL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 34,( + ParserData.MlyValue.START_DL i,p1,p2)) + fun END_DL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 35,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_DT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 36,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_DT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 37,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_EM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 38,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_EM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 39,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_FONT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 40,( + ParserData.MlyValue.START_FONT i,p1,p2)) + fun END_FONT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 41,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_BASEFONT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 42,( + ParserData.MlyValue.START_BASEFONT i,p1,p2)) + fun END_BASEFONT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 43,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_FORM (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 44,( + ParserData.MlyValue.START_FORM i,p1,p2)) + fun END_FORM (p1,p2) = Token.TOKEN (ParserData.LrTable.T 45,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_H1 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 46,( + ParserData.MlyValue.START_H1 i,p1,p2)) + fun END_H1 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 47,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_H2 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 48,( + ParserData.MlyValue.START_H2 i,p1,p2)) + fun END_H2 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 49,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_H3 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 50,( + ParserData.MlyValue.START_H3 i,p1,p2)) + fun END_H3 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 51,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_H4 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 52,( + ParserData.MlyValue.START_H4 i,p1,p2)) + fun END_H4 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 53,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_H5 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 54,( + ParserData.MlyValue.START_H5 i,p1,p2)) + fun END_H5 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 55,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_H6 (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 56,( + ParserData.MlyValue.START_H6 i,p1,p2)) + fun END_H6 (p1,p2) = Token.TOKEN (ParserData.LrTable.T 57,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_HEAD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 58,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_HEAD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 59,( + ParserData.MlyValue.VOID,p1,p2)) + fun TAG_HR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 60,( + ParserData.MlyValue.TAG_HR i,p1,p2)) + fun START_HTML (p1,p2) = Token.TOKEN (ParserData.LrTable.T 61,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_HTML (p1,p2) = Token.TOKEN (ParserData.LrTable.T 62,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_I (p1,p2) = Token.TOKEN (ParserData.LrTable.T 63,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_I (p1,p2) = Token.TOKEN (ParserData.LrTable.T 64,( + ParserData.MlyValue.VOID,p1,p2)) + fun TAG_IMG (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 65,( + ParserData.MlyValue.TAG_IMG i,p1,p2)) + fun TAG_INPUT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 66,( + ParserData.MlyValue.TAG_INPUT i,p1,p2)) + fun TAG_ISINDEX (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 67,( + ParserData.MlyValue.TAG_ISINDEX i,p1,p2)) + fun START_KBD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 68,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_KBD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 69,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_LI (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 70,( + ParserData.MlyValue.START_LI i,p1,p2)) + fun END_LI (p1,p2) = Token.TOKEN (ParserData.LrTable.T 71,( + ParserData.MlyValue.VOID,p1,p2)) + fun TAG_LINK (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 72,( + ParserData.MlyValue.TAG_LINK i,p1,p2)) + fun START_MAP (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 73,( + ParserData.MlyValue.START_MAP i,p1,p2)) + fun END_MAP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 74,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_MENU (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 75,( + ParserData.MlyValue.START_MENU i,p1,p2)) + fun END_MENU (p1,p2) = Token.TOKEN (ParserData.LrTable.T 76,( + ParserData.MlyValue.VOID,p1,p2)) + fun TAG_META (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 77,( + ParserData.MlyValue.TAG_META i,p1,p2)) + fun START_OL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 78,( + ParserData.MlyValue.START_OL i,p1,p2)) + fun END_OL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 79,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_OPTION (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 80,( + ParserData.MlyValue.START_OPTION i,p1,p2)) + fun END_OPTION (p1,p2) = Token.TOKEN (ParserData.LrTable.T 81,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_P (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 82,( + ParserData.MlyValue.START_P i,p1,p2)) + fun END_P (p1,p2) = Token.TOKEN (ParserData.LrTable.T 83,( + ParserData.MlyValue.VOID,p1,p2)) + fun TAG_PARAM (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 84,( + ParserData.MlyValue.TAG_PARAM i,p1,p2)) + fun START_PRE (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 85,( + ParserData.MlyValue.START_PRE i,p1,p2)) + fun END_PRE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 86,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_SAMP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 87,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_SAMP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 88,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_SCRIPT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 89,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_SCRIPT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 90,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_SELECT (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 91,( + ParserData.MlyValue.START_SELECT i,p1,p2)) + fun END_SELECT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 92,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_SMALL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 93,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_SMALL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 94,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_STRIKE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 95,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_STRIKE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 96,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_STRONG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 97,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_STRONG (p1,p2) = Token.TOKEN (ParserData.LrTable.T 98,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_STYLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 99,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_STYLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 100,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_SUB (p1,p2) = Token.TOKEN (ParserData.LrTable.T 101,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_SUB (p1,p2) = Token.TOKEN (ParserData.LrTable.T 102,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_SUP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 103,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_SUP (p1,p2) = Token.TOKEN (ParserData.LrTable.T 104,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_TABLE (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 105,( + ParserData.MlyValue.START_TABLE i,p1,p2)) + fun END_TABLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 106,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_TD (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 107,( + ParserData.MlyValue.START_TD i,p1,p2)) + fun END_TD (p1,p2) = Token.TOKEN (ParserData.LrTable.T 108,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_TEXTAREA (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 109,( + ParserData.MlyValue.START_TEXTAREA i,p1,p2)) + fun END_TEXTAREA (p1,p2) = Token.TOKEN (ParserData.LrTable.T 110,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_TH (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 111,( + ParserData.MlyValue.START_TH i,p1,p2)) + fun END_TH (p1,p2) = Token.TOKEN (ParserData.LrTable.T 112,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_TITLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 113,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_TITLE (p1,p2) = Token.TOKEN (ParserData.LrTable.T 114,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_TR (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 115,( + ParserData.MlyValue.START_TR i,p1,p2)) + fun END_TR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 116,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_TT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 117,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_TT (p1,p2) = Token.TOKEN (ParserData.LrTable.T 118,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_U (p1,p2) = Token.TOKEN (ParserData.LrTable.T 119,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_U (p1,p2) = Token.TOKEN (ParserData.LrTable.T 120,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_UL (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 121,( + ParserData.MlyValue.START_UL i,p1,p2)) + fun END_UL (p1,p2) = Token.TOKEN (ParserData.LrTable.T 122,( + ParserData.MlyValue.VOID,p1,p2)) + fun START_VAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 123,( + ParserData.MlyValue.VOID,p1,p2)) + fun END_VAR (p1,p2) = Token.TOKEN (ParserData.LrTable.T 124,( + ParserData.MlyValue.VOID,p1,p2)) + fun PCDATA (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 125,( + ParserData.MlyValue.PCDATA i,p1,p2)) + fun CHAR_REF (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 126,( + ParserData.MlyValue.CHAR_REF i,p1,p2)) + fun ENTITY_REF (i,p1,p2) = Token.TOKEN (ParserData.LrTable.T 127,( + ParserData.MlyValue.ENTITY_REF i,p1,p2)) + end + end diff -N -C 2 -r smlnj-lib/HTML/html-lex.sml smlnj-lib-mlton/HTML/html-lex.sml *** smlnj-lib/HTML/html-lex.sml 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/HTML/html-lex.sml 2010-04-02 16:09:14.000000000 -0400 *************** *** 0 **** --- 1,670 ---- + functor HTMLLexFn ( + structure Tokens : HTML_TOKENS + structure Err : HTML_ERROR + structure HTMLAttrs : HTML_ATTRS)= + struct + structure UserDeclarations = + struct + (* html-lex + * + * COPYRIGHT (c) 1995 AT&T Bell Laboratories. + * COPYRIGHT (c) 1996 AT&T Research. + * + * A scanner for HTML. + * + * TODO: + * Recognize the DOCTYPE element + * + * Clean-up the scanning of start tags (do we need Err?). + * Whitespace in PRE elements should be preserved, but how? + *) + + structure T = Tokens + structure Elems = HTMLElementsFn ( + structure Tokens = Tokens + structure Err = Err + structure HTMLAttrs = HTMLAttrs) + + type pos = int + type svalue = T.svalue + type arg = (((string * int * int) -> unit) * string option) + type ('a, 'b) token = ('a, 'b) T.token + type lexresult= (svalue, pos) token + + fun eof _ = Tokens.EOF(0, 0) + + (* a buffer for collecting a string piecewise *) + val buffer = ref ([] : string list) + fun addStr s = (buffer := s :: !buffer) + fun getStr () = (String.concat(List.rev(! buffer)) before (buffer := [])) + + end (* end of user routines *) + exception LexError (* raised if illegal leaf action tried *) + structure Internal = + struct + + datatype yyfinstate = N of int + type statedata = {fin : yyfinstate list, trans: string} + (* transition & final state table *) + val tab = let + val s = [ + (0, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (1, + "\009\009\009\009\009\009\009\009\009\028\029\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\028\009\009\009\009\009\020\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\011\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\ + \\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009" + ), + (3, + "\030\030\030\030\030\030\030\030\030\030\033\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\031\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\ + \\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030" + ), + (5, + "\034\034\034\034\034\034\034\034\034\038\039\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\038\034\034\034\034\034\034\034\034\034\034\034\034\036\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\ + \\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034" + ), + (7, + "\040\040\040\040\040\040\040\040\040\051\053\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\ + \\051\040\048\040\040\040\040\045\040\040\040\040\040\041\041\040\ + \\041\041\041\041\041\041\041\041\041\041\040\040\040\044\043\040\ + \\040\041\041\041\041\041\041\041\041\041\041\041\041\041\041\041\ + \\041\041\041\041\041\041\041\041\041\041\041\040\040\040\040\040\ + \\040\041\041\041\041\041\041\041\041\041\041\041\041\041\041\041\ + \\041\041\041\041\041\041\041\041\041\041\041\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\ + \\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040\040" + ), + (9, + "\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\000\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010" + ), + (11, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\013\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\ + \\012\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\ + \\000\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\ + \\012\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (12, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\012\012\000\ + \\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\000\ + \\000\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\ + \\012\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\ + \\000\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\ + \\012\012\012\012\012\012\012\012\012\012\012\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (13, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\ + \\014\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\ + \\000\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\ + \\014\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (14, + "\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\016\000\000\000\000\000\000\000\000\000\000\000\000\014\014\000\ + \\014\014\014\014\014\014\014\014\014\014\000\000\000\000\015\000\ + \\000\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\ + \\014\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\ + \\000\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\ + \\014\014\014\014\014\014\014\014\014\014\014\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (16, + "\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (17, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (18, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (20, + "\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\023\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\000\010\010\010\ + \\010\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\ + \\021\021\021\021\021\021\021\021\021\021\021\010\010\010\010\010\ + \\010\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\ + \\021\021\021\021\021\021\021\021\021\021\021\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010" + ), + (21, + "\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\021\021\010\ + \\021\021\021\021\021\021\021\021\021\021\010\022\000\010\010\010\ + \\010\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\ + \\021\021\021\021\021\021\021\021\021\021\021\010\010\010\010\010\ + \\010\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\ + \\021\021\021\021\021\021\021\021\021\021\021\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010" + ), + (23, + "\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\026\026\026\026\026\026\026\026\026\026\010\010\000\010\010\010\ + \\010\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\ + \\024\024\024\024\024\024\024\024\024\024\024\010\010\010\010\010\ + \\010\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\ + \\024\024\024\024\024\024\024\024\024\024\024\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010" + ), + (24, + "\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\025\000\010\010\010\ + \\010\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\ + \\024\024\024\024\024\024\024\024\024\024\024\010\010\010\010\010\ + \\010\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\ + \\024\024\024\024\024\024\024\024\024\024\024\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010" + ), + (26, + "\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\026\026\026\026\026\026\026\026\026\026\010\027\000\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\ + \\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010" + ), + (31, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\032\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (36, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\037\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (41, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\042\042\000\ + \\042\042\042\042\042\042\042\042\042\042\000\000\000\000\000\000\ + \\000\042\042\042\042\042\042\042\042\042\042\042\042\042\042\042\ + \\042\042\042\042\042\042\042\042\042\042\042\000\000\000\000\000\ + \\000\042\042\042\042\042\042\042\042\042\042\042\042\042\042\042\ + \\042\042\042\042\042\042\042\042\042\042\042\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (45, + "\046\046\046\046\046\046\046\046\046\046\000\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\047\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\ + \\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046" + ), + (48, + "\049\049\049\049\049\049\049\049\049\049\000\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\050\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\ + \\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049\049" + ), + (51, + "\000\000\000\000\000\000\000\000\000\052\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\052\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + ), + (0, "")] + fun f x = x + val s = map f (rev (tl (rev s))) + exception LexHackingError + fun look ((j,x)::r, i: int) = if i = j then x else look(r, i) + | look ([], i) = raise LexHackingError + fun g {fin=x, trans=i} = {fin=x, trans=look(s,i)} + in Vector.fromList(map g + [{fin = [], trans = 0}, + {fin = [], trans = 1}, + {fin = [], trans = 1}, + {fin = [], trans = 3}, + {fin = [], trans = 3}, + {fin = [], trans = 5}, + {fin = [], trans = 5}, + {fin = [], trans = 7}, + {fin = [], trans = 7}, + {fin = [(N 79),(N 81)], trans = 9}, + {fin = [(N 79)], trans = 9}, + {fin = [(N 81)], trans = 11}, + {fin = [(N 3)], trans = 12}, + {fin = [], trans = 13}, + {fin = [], trans = 14}, + {fin = [(N 32)], trans = 0}, + {fin = [], trans = 16}, + {fin = [], trans = 17}, + {fin = [], trans = 18}, + {fin = [(N 37)], trans = 0}, + {fin = [(N 79),(N 81)], trans = 20}, + {fin = [(N 79)], trans = 21}, + {fin = [(N 72),(N 79)], trans = 9}, + {fin = [(N 79)], trans = 23}, + {fin = [(N 79)], trans = 24}, + {fin = [(N 61),(N 79)], trans = 9}, + {fin = [(N 79)], trans = 26}, + {fin = [(N 67),(N 79)], trans = 9}, + {fin = [(N 76),(N 79),(N 81)], trans = 9}, + {fin = [(N 74),(N 79)], trans = 9}, + {fin = [(N 44)], trans = 0}, + {fin = [(N 44)], trans = 31}, + {fin = [(N 40)], trans = 0}, + {fin = [(N 42)], trans = 0}, + {fin = [(N 55)], trans = 0}, + {fin = [(N 49),(N 55)], trans = 0}, + {fin = [(N 55)], trans = 36}, + {fin = [(N 47)], trans = 0}, + {fin = [(N 53),(N 55)], trans = 0}, + {fin = [(N 51)], trans = 0}, + {fin = [(N 25)], trans = 0}, + {fin = [(N 13),(N 25)], trans = 41}, + {fin = [(N 13)], trans = 41}, + {fin = [(N 5),(N 25)], trans = 0}, + {fin = [(N 15),(N 25)], trans = 0}, + {fin = [(N 25)], trans = 45}, + {fin = [], trans = 45}, + {fin = [(N 23)], trans = 0}, + {fin = [(N 25)], trans = 48}, + {fin = [], trans = 48}, + {fin = [(N 19)], trans = 0}, + {fin = [(N 10),(N 25)], trans = 51}, + {fin = [(N 10)], trans = 51}, + {fin = [(N 7)], trans = 0}]) + end + structure StartStates = + struct + datatype yystartstate = STARTSTATE of int + + (* start state definitions *) + + val COM1 = STARTSTATE 3; + val COM2 = STARTSTATE 5; + val INITIAL = STARTSTATE 1; + val STAG = STARTSTATE 7; + + end + type result = UserDeclarations.lexresult + exception LexerError (* raised if illegal leaf action tried *) + end + + fun makeLexer yyinput = + let val yygone0=1 + val yylineno = ref 0 + + val yyb = ref "\n" (* buffer *) + val yybl = ref 1 (*buffer length *) + val yybufpos = ref 1 (* location of next character to use *) + val yygone = ref yygone0 (* position in file of beginning of buffer *) + val yydone = ref false (* eof found yet? *) + val yybegin = ref 1 (*Current 'start state' for lexer *) + + val YYBEGIN = fn (Internal.StartStates.STARTSTATE x) => + yybegin := x + + fun lex (yyarg as (errorFn, file)) = + let fun continue() : Internal.result = + let fun scan (s,AcceptingLeaves : Internal.yyfinstate list list,l,i0) = + let fun action (i,nil) = raise LexError + | action (i,nil::l) = action (i-1,l) + | action (i,(node::acts)::l) = + case node of + Internal.N yyk => + (let fun yymktext() = substring(!yyb,i0,i-i0) + val yypos = i0+ !yygone + val _ = yylineno := CharVectorSlice.foldli + (fn (_,#"\n", n) => n+1 | (_,_, n) => n) (!yylineno) (CharVectorSlice.slice (!yyb,i0,SOME(i-i0))) + open UserDeclarations Internal.StartStates + in (yybufpos := i; case yyk of + + (* Application actions *) + + 10 => let val yytext=yymktext() in addStr yytext; continue() end + | 13 => let val yytext=yymktext() in addStr yytext; continue() end + | 15 => let val yytext=yymktext() in addStr yytext; continue() end + | 19 => let val yytext=yymktext() in addStr yytext; continue() end + | 23 => let val yytext=yymktext() in addStr yytext; continue() end + | 25 => let val yytext=yymktext() in addStr yytext; continue() end + | 3 => let val yytext=yymktext() in addStr yytext; YYBEGIN STAG; continue() end + | 32 => let val yytext=yymktext() in case Elems.endTag file (yytext, !yylineno, !yylineno) + of NONE => continue() + | (SOME tag) => tag + (* end case *) end + | 37 => (YYBEGIN COM1; continue()) + | 40 => (YYBEGIN COM2; continue()) + | 42 => (continue()) + | 44 => (continue()) + | 47 => (YYBEGIN COM1; continue()) + | 49 => (YYBEGIN INITIAL; continue()) + | 5 => let val yytext=yymktext() in addStr yytext; + YYBEGIN INITIAL; + case Elems.startTag file (getStr(), !yylineno, !yylineno) + of NONE => continue() + | (SOME tag) => tag + (* end case *) end + | 51 => (continue()) + | 53 => (continue()) + | 55 => (errorFn("bad comment syntax", !yylineno, !yylineno+1); + YYBEGIN INITIAL; + continue()) + | 61 => ( + (** At some point, we should support &#SPACE; and &#TAB; **) + continue()) + | 67 => let val yytext=yymktext() in T.CHAR_REF(yytext, !yylineno, !yylineno) end + | 7 => (addStr " "; continue()) + | 72 => let val yytext=yymktext() in T.ENTITY_REF(yytext, !yylineno, !yylineno) end + | 74 => (continue()) + | 76 => (continue()) + | 79 => let val yytext=yymktext() in T.PCDATA(yytext, !yylineno, !yylineno) end + | 81 => let val yytext=yymktext() in errorFn(concat[ + "bogus character #\"", Char.toString(String.sub(yytext, 0)), + "\" in PCDATA\n" + ], !yylineno, !yylineno+1); + continue() end + | _ => raise Internal.LexerError + + ) end ) + + val {fin,trans} = Unsafe.Vector.sub(Internal.tab, s) + val NewAcceptingLeaves = fin::AcceptingLeaves + in if l = !yybl then + if trans = #trans(Vector.sub(Internal.tab,0)) + then action(l,NewAcceptingLeaves + ) else let val newchars= if !yydone then "" else yyinput 1024 + in if (size newchars)=0 + then (yydone := true; + if (l=i0) then UserDeclarations.eof yyarg + else action(l,NewAcceptingLeaves)) + else (if i0=l then yyb := newchars + else yyb := substring(!yyb,i0,l-i0)^newchars; + yygone := !yygone+i0; + yybl := size (!yyb); + scan (s,AcceptingLeaves,l-i0,0)) + end + else let val NewChar = Char.ord(Unsafe.CharVector.sub(!yyb,l)) + val NewState = Char.ord(Unsafe.CharVector.sub(trans,NewChar)) + in if NewState=0 then action(l,NewAcceptingLeaves) + else scan(NewState,NewAcceptingLeaves,l+1,i0) + end + end + (* + val start= if substring(!yyb,!yybufpos-1,1)="\n" + then !yybegin+1 else !yybegin + *) + in scan(!yybegin (* start *),nil,!yybufpos,!yybufpos) + end + in continue end + in lex + end + end diff -N -C 2 -r smlnj-lib/HTML/html-lib.mlb smlnj-lib-mlton/HTML/html-lib.mlb *** smlnj-lib/HTML/html-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/HTML/html-lib.mlb 2010-04-02 16:09:15.000000000 -0400 *************** *** 0 **** --- 1,298 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l5 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb + end + basis l46 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l35 = + bas + (* $/ml-yacc-lib.cm ====> *) $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l5 + in + structure gs_0 = General + end + local + open l5 + in + structure gs_1 = String + end + local + open l5 + in + structure gs_2 = List + end + local + open l5 + in + structure gs_3 = Char + end + local + html-sig.sml + in + signature gs_4 = HTML + end + local + structure Char = gs_3 + structure General = gs_0 + signature HTML = gs_4 + structure List = gs_2 + structure String = gs_1 + html.sml + in + structure gs_5 = HTML + end + local + structure HTML = gs_5 + make-html.sml + in + structure gs_6 = MakeHTML + end + local + structure HTML = gs_5 + html-defaults.sml + in + structure gs_7 = HTMLDefaults + end + local + html-error-sig.sml + in + signature gs_8 = HTML_ERROR + end + local + open l35 + in + functor gs_9 = Join + functor gs_10 = JoinWithArg + end + local + open l35 + in + structure gs_11 = LrParser + end + local + open l5 + in + structure gs_12 = TextIO + end + local + open l46 + in + structure gs_13 = Format + end + local + structure Format = gs_13 + structure HTML = gs_5 + signature HTML_ERROR = gs_8 + structure List = gs_2 + check-html-fn.sml + in + functor gs_14 = CheckHTMLFn + end + local + open l5 + in + structure gs_15 = Unsafe + end + local + open l5 + in + structure gs_16 = CharVectorSlice + end + local + open l5 + in + structure gs_17 = Vector + end + local + open l5 + in + structure gs_18 = Substring + end + local + open l46 + in + functor gs_19 = HashTableFn + end + local + open l46 + in + structure gs_20 = HashString + end + local + html-attr-vals.sml + in + structure gs_21 = HTMLAttrVals + end + local + structure HTML = gs_5 + structure HTMLAttrVals = gs_21 + html-attrs-sig.sml + in + signature gs_22 = HTML_ATTRS + end + local + open l35 + in + signature gs_23 = ARG_LEXER + signature gs_24 = ARG_PARSER + signature gs_25 = LEXER + signature gs_26 = LR_PARSER + signature gs_27 = LR_TABLE + signature gs_28 = PARSER + signature gs_29 = PARSER_DATA + signature gs_30 = STREAM + signature gs_31 = TOKEN + end + local + signature ARG_LEXER = gs_23 + signature ARG_PARSER = gs_24 + structure HTMLAttrVals = gs_21 + signature LEXER = gs_25 + signature LR_PARSER = gs_26 + signature LR_TABLE = gs_27 + signature PARSER = gs_28 + signature PARSER_DATA = gs_29 + signature STREAM = gs_30 + signature TOKEN = gs_31 + html-gram.sig + in + signature gs_32 = HTML_LRVALS + signature gs_33 = HTML_TOKENS + end + local + structure Char = gs_3 + signature HTML_ATTRS = gs_22 + signature HTML_ERROR = gs_8 + signature HTML_LRVALS = gs_32 + signature HTML_TOKENS = gs_33 + structure HashString = gs_20 + functor HashTableFn = gs_19 + structure List = gs_2 + structure String = gs_1 + structure Substring = gs_18 + html-elements-fn.sml + in + functor gs_34 = HTMLElementsFn + end + local + structure Char = gs_3 + structure CharVectorSlice = gs_16 + functor HTMLElementsFn = gs_34 + signature HTML_ATTRS = gs_22 + signature HTML_ERROR = gs_8 + signature HTML_LRVALS = gs_32 + signature HTML_TOKENS = gs_33 + structure List = gs_2 + structure String = gs_1 + structure Unsafe = gs_15 + structure Vector = gs_17 + html-lex.sml + in + functor gs_35 = HTMLLexFn + end + local + open l5 + in + structure gs_36 = Array + end + local + signature ARG_LEXER = gs_23 + signature ARG_PARSER = gs_24 + structure Array = gs_36 + structure Char = gs_3 + structure HTML = gs_5 + structure HTMLAttrVals = gs_21 + signature HTML_ATTRS = gs_22 + signature HTML_LRVALS = gs_32 + signature HTML_TOKENS = gs_33 + signature LEXER = gs_25 + signature LR_PARSER = gs_26 + signature LR_TABLE = gs_27 + structure List = gs_2 + signature PARSER = gs_28 + signature PARSER_DATA = gs_29 + signature STREAM = gs_30 + structure String = gs_1 + signature TOKEN = gs_31 + html-gram.sml + in + functor gs_37 = HTMLLrValsFn + end + local + open l5 + in + structure gs_38 = Int + end + local + structure Array = gs_36 + structure Char = gs_3 + structure HTML = gs_5 + structure HTMLAttrVals = gs_21 + signature HTML_ATTRS = gs_22 + signature HTML_ERROR = gs_8 + structure HashString = gs_20 + functor HashTableFn = gs_19 + structure Int = gs_38 + structure List = gs_2 + structure String = gs_1 + html-attrs-fn.sml + in + functor gs_39 = HTMLAttrsFn + end + local + functor CheckHTMLFn = gs_14 + structure HTML = gs_5 + functor HTMLAttrsFn = gs_39 + functor HTMLLexFn = gs_35 + functor HTMLLrValsFn = gs_37 + signature HTML_ERROR = gs_8 + functor Join = gs_9 + functor JoinWithArg = gs_10 + structure LrParser = gs_11 + structure TextIO = gs_12 + html-parser-fn.sml + in + functor gs_40 = HTMLParserFn + end + local + open l46 + in + structure gs_41 = ListFormat + end + local + structure Format = gs_13 + structure HTML = gs_5 + structure Int = gs_38 + structure List = gs_2 + structure ListFormat = gs_41 + pr-html.sml + in + structure gs_42 = PrHTML + end + in + signature HTML = gs_4 + structure HTML = gs_5 + structure HTMLDefaults = gs_7 + functor HTMLParserFn = gs_40 + signature HTML_ERROR = gs_8 + structure MakeHTML = gs_6 + structure PrHTML = gs_42 + end + end + + end diff -N -C 2 -r smlnj-lib/HashCons/hash-cons-lib.mlb smlnj-lib-mlton/HashCons/hash-cons-lib.mlb *** smlnj-lib/HashCons/hash-cons-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/HashCons/hash-cons-lib.mlb 2010-04-02 16:09:14.000000000 -0400 *************** *** 0 **** --- 1,144 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l8 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb + end + basis l4 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = PrimeSizes + end + local + open l8 + in + structure gs_1 = Array + end + local + open l8 + in + structure gs_2 = Word + end + local + open l8 + in + structure gs_3 = List + end + local + hash-cons-sig.sml + in + signature gs_4 = HASH_CONS + end + local + structure Array = gs_1 + signature HASH_CONS = gs_4 + structure List = gs_3 + structure PrimeSizes = gs_0 + structure Word = gs_2 + hash-cons.sml + in + structure gs_5 = HashCons + end + local + structure HashCons = gs_5 + hash-cons-set-sig.sml + in + signature gs_6 = HASH_CONS_SET + end + local + structure HashCons = gs_5 + hash-cons-map-sig.sml + in + signature gs_7 = HASH_CONS_MAP + end + local + open l4 + in + structure gs_8 = WordRedBlackMap + end + local + signature HASH_CONS_SET = gs_6 + structure HashCons = gs_5 + structure List = gs_3 + structure WordRedBlackMap = gs_8 + hash-cons-set.sml + in + structure gs_9 = HashConsSet + end + local + open l8 + in + structure gs_10 = Option + end + local + signature HASH_CONS_MAP = gs_7 + structure HashCons = gs_5 + structure Option = gs_10 + structure WordRedBlackMap = gs_8 + hash-cons-map.sml + in + structure gs_11 = HashConsMap + end + local + open l4 + in + structure gs_12 = HashString + end + local + open l4 + in + signature gs_13 = HASH_KEY + end + local + signature HASH_KEY = gs_13 + structure HashCons = gs_5 + hash-cons-ground-fn.sml + in + functor gs_14 = HashConsGroundFn + end + local + functor HashConsGroundFn = gs_14 + structure HashString = gs_12 + hash-cons-string.sml + in + structure gs_15 = HashConsString + end + local + open l4 + in + structure gs_16 = Atom + end + local + structure Atom = gs_16 + functor HashConsGroundFn = gs_14 + hash-cons-atom.sml + in + structure gs_17 = HashConsAtom + end + in + signature HASH_CONS = gs_4 + signature HASH_CONS_MAP = gs_7 + signature HASH_CONS_SET = gs_6 + structure HashCons = gs_5 + structure HashConsAtom = gs_17 + functor HashConsGroundFn = gs_14 + structure HashConsMap = gs_11 + structure HashConsSet = gs_9 + structure HashConsString = gs_15 + end + end + + end diff -N -C 2 -r smlnj-lib/INet/inet-lib.mlb smlnj-lib-mlton/INet/inet-lib.mlb *** smlnj-lib/INet/inet-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/INet/inet-lib.mlb 2010-04-02 16:09:15.000000000 -0400 *************** *** 0 **** --- 1,144 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb + end + basis l31 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = StringCvt + end + local + open l4 + in + structure gs_1 = Word8Array + end + local + open l4 + in + structure gs_2 = Word8Vector + end + local + open l4 + in + structure gs_3 = NetHostDB + end + local + open l4 + in + structure gs_4 = Socket + end + local + open l4 + in + structure gs_5 = INetSock + end + local + structure INetSock = gs_5 + structure NetHostDB = gs_3 + structure Socket = gs_4 + structure StringCvt = gs_0 + structure Word8Array = gs_1 + structure Word8Vector = gs_2 + sock-util-sig.sml + in + signature gs_6 = SOCK_UTIL + end + local + open l4 + in + structure gs_7 = UnixSock + end + local + open l31 + in + structure gs_8 = ParserComb + end + local + open l4 + in + structure gs_9 = Char + end + local + open l4 + in + structure gs_10 = Word8VectorSlice + end + local + open l4 + in + structure gs_11 = Word8ArraySlice + end + local + open l4 + in + structure gs_12 = NetServDB + end + local + open l4 + in + structure gs_13 = Byte + end + local + open l4 + in + structure gs_14 = Int + end + local + open l4 + in + structure gs_15 = OS + end + local + structure Byte = gs_13 + structure Char = gs_9 + structure INetSock = gs_5 + structure Int = gs_14 + structure NetHostDB = gs_3 + structure NetServDB = gs_12 + structure OS = gs_15 + structure ParserComb = gs_8 + signature SOCK_UTIL = gs_6 + structure Socket = gs_4 + structure StringCvt = gs_0 + structure Word8Array = gs_1 + structure Word8ArraySlice = gs_11 + structure Word8Vector = gs_2 + structure Word8VectorSlice = gs_10 + sock-util.sml + in + structure gs_16 = SockUtil + end + local + signature SOCK_UTIL = gs_6 + structure SockUtil = gs_16 + structure Socket = gs_4 + structure UnixSock = gs_7 + unix-sock-util.sml + in + signature gs_17 = UNIX_SOCK_UTIL + structure gs_18 = UnixSockUtil + end + in + signature SOCK_UTIL = gs_6 + structure SockUtil = gs_16 + signature UNIX_SOCK_UTIL = gs_17 + structure UnixSockUtil = gs_18 + end + end + + end diff -N -C 2 -r smlnj-lib/JSON/json-lib.mlb smlnj-lib-mlton/JSON/json-lib.mlb *** smlnj-lib/JSON/json-lib.mlb 2009-10-02 09:51:26.000000000 -0400 --- smlnj-lib-mlton/JSON/json-lib.mlb 2010-04-02 16:09:15.000000000 -0400 *************** *** 1,47 **** - (* json-lib.mlb - * - * COPYRIGHT (c) 2008 The Fellowship of SML/NJ (http://www.smlnj.org) - * All rights reserved. - * - * An MLB file for the JSON library, so that it can be used by MLton programs. - * - * TODO: - * This is not complete, since MLton does not have the ml-lpt-lib yet. - *) - - local - - $(SML_LIB)/basis/basis.mlb - $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb - (* I don't know what the path to this library will be - ??/ml-lpt-lib/ml-lpt-lib.mlb - *) - - ann - "nonexhaustiveMatch warn" "redundantMatch warn" - "sequenceNonUnit ignore" - "warnUnused false" "forceUsed" - in - - json-tokens.sml - json.lex.sml - json.sml - json-stream-parser.sml - json-parser.sml - json-stream-printer.sml - json-printer.sml - - end in ! (* DOM-style API (tree based) *) ! structure JSON ! structure JSONParser ! structure JSONPrinter ! ! (* SAX-style API (event based) *) ! structure JSONStreamParser ! structure JSONStreamPrinter end --- 1,176 ---- + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" in ! local ! basis l4 = ! bas ! (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb ! end ! basis l19 = ! bas ! (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb ! end ! basis l8 = ! bas ! (* $/ml-lpt-lib.cm =??=> *) /Users/mtf/devel/smlnj/smlnj-110.72/lib/ml-lpt-lib.cm/ml-lpt-lib.mlb ! end ! in ! local ! $(SML_LIB)/basis/pervasive.mlb ! local ! open l4 ! in ! structure gs_0 = IntInf ! end ! local ! open l8 ! in ! structure gs_1 = AntlrStreamPos ! end ! local ! open l4 ! in ! structure gs_2 = TextIO ! end ! local ! open l4 ! in ! structure gs_3 = String ! end ! local ! open l19 ! in ! structure gs_4 = UTF8 ! end ! local ! open l4 ! in ! structure gs_5 = Real ! end ! local ! open l4 ! in ! structure gs_6 = List ! end ! local ! structure IntInf = gs_0 ! structure List = gs_6 ! structure Real = gs_5 ! structure String = gs_3 ! structure UTF8 = gs_4 ! json-tokens.sml ! in ! structure gs_7 = JSONTokens ! end ! local ! open l4 ! in ! structure gs_8 = StringCvt ! end ! local ! open l4 ! in ! structure gs_9 = LargeReal ! end ! local ! open l4 ! in ! structure gs_10 = Substring ! end ! local ! open l4 ! in ! structure gs_11 = Vector ! end ! local ! open l8 ! in ! structure gs_12 = ULexBuffer ! end ! local ! open l4 ! in ! structure gs_13 = Word ! end ! local ! structure AntlrStreamPos = gs_1 ! structure IntInf = gs_0 ! structure JSONTokens = gs_7 ! structure LargeReal = gs_9 ! structure List = gs_6 ! structure String = gs_3 ! structure StringCvt = gs_8 ! structure Substring = gs_10 ! structure TextIO = gs_2 ! structure ULexBuffer = gs_12 ! structure UTF8 = gs_4 ! structure Vector = gs_11 ! structure Word = gs_13 ! json.lex.sml ! in ! structure gs_14 = JSONLexer ! end ! local ! structure AntlrStreamPos = gs_1 ! structure IntInf = gs_0 ! structure JSONLexer = gs_14 ! structure JSONTokens = gs_7 ! structure TextIO = gs_2 ! json-stream-parser.sml ! in ! structure gs_15 = JSONStreamParser ! end ! local ! structure IntInf = gs_0 ! json.sml ! in ! structure gs_16 = JSON ! end ! local ! structure AntlrStreamPos = gs_1 ! structure JSON = gs_16 ! structure JSONLexer = gs_14 ! structure JSONTokens = gs_7 ! structure List = gs_6 ! structure TextIO = gs_2 ! json-parser.sml ! in ! structure gs_17 = JSONParser ! end ! local ! open l19 ! in ! structure gs_18 = Format ! end ! local ! structure Format = gs_18 ! structure IntInf = gs_0 ! structure String = gs_3 ! structure TextIO = gs_2 ! json-stream-printer.sml ! in ! structure gs_19 = JSONStreamPrinter ! end ! local ! structure JSON = gs_16 ! structure JSONStreamPrinter = gs_19 ! structure List = gs_6 ! structure TextIO = gs_2 ! json-printer.sml ! in ! structure gs_20 = JSONPrinter ! end ! in ! structure JSON = gs_16 ! structure JSONParser = gs_17 ! structure JSONPrinter = gs_20 ! structure JSONStreamParser = gs_15 ! structure JSONStreamPrinter = gs_19 ! end ! end end diff -N -C 2 -r smlnj-lib/PP/pp-lib.mlb smlnj-lib-mlton/PP/pp-lib.mlb *** smlnj-lib/PP/pp-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/PP/pp-lib.mlb 2010-04-02 16:09:15.000000000 -0400 *************** *** 0 **** --- 1,212 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb + end + basis l26 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + basis l83 = + bas + (* $/html-lib.cm ====> *) $(SML_LIB)/smlnj-lib/HTML/html-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = TextIO + end + local + src/pp-stream-sig.sml + in + signature gs_1 = PP_STREAM + end + local + signature PP_STREAM = gs_1 + structure TextIO = gs_0 + src/pp-debug-fn.sml + in + functor gs_2 = PPDebugFn + end + local + src/pp-device-sig.sml + in + signature gs_3 = PP_DEVICE + end + local + open l4 + in + structure gs_4 = StringCvt + end + local + signature PP_DEVICE = gs_3 + structure StringCvt = gs_4 + structure TextIO = gs_0 + devices/simple-textio-dev.sml + in + structure gs_5 = SimpleTextIODev + end + local + open l26 + in + structure gs_6 = Format + end + local + open l26 + in + structure gs_7 = Queue + end + local + open l26 + in + structure gs_8 = ListFormat + end + local + open l4 + in + structure gs_9 = String + end + local + open l4 + in + structure gs_10 = Option + end + local + open l4 + in + structure gs_11 = Int + end + local + src/pp-token-sig.sml + in + signature gs_12 = PP_TOKEN + end + local + structure Format = gs_6 + structure Int = gs_11 + structure ListFormat = gs_8 + structure Option = gs_10 + signature PP_DEVICE = gs_3 + signature PP_STREAM = gs_1 + signature PP_TOKEN = gs_12 + structure Queue = gs_7 + structure String = gs_9 + structure TextIO = gs_0 + src/pp-stream-fn.sml + in + functor gs_13 = PPStreamFn + end + local + signature PP_STREAM = gs_1 + src/pp-desc-sig.sml + in + signature gs_14 = PP_DESC + end + local + signature PP_DESC = gs_14 + signature PP_STREAM = gs_1 + src/pp-desc-fn.sml + in + functor gs_15 = PPDescFn + end + local + signature PP_TOKEN = gs_12 + structure String = gs_9 + devices/string-token.sml + in + structure gs_16 = StringToken + end + local + functor PPStreamFn = gs_13 + signature PP_STREAM = gs_1 + structure SimpleTextIODev = gs_5 + structure StringToken = gs_16 + structure TextIO = gs_0 + devices/textio-pp.sml + in + structure gs_17 = TextIOPP + end + local + open l26 + in + structure gs_18 = ANSITerm + end + local + open l4 + in + structure gs_19 = TextPrimIO + end + local + open l4 + in + structure gs_20 = OS + end + local + structure ANSITerm = gs_18 + structure OS = gs_20 + signature PP_DEVICE = gs_3 + structure StringCvt = gs_4 + structure TextIO = gs_0 + structure TextPrimIO = gs_19 + devices/ansi-term-dev.sml + in + structure gs_21 = ANSITermDev + end + local + open l4 + in + structure gs_22 = List + end + local + open l83 + in + structure gs_23 = HTML + end + local + structure HTML = gs_23 + structure List = gs_22 + signature PP_DEVICE = gs_3 + structure String = gs_9 + devices/html-dev.sml + in + structure gs_24 = HTMLDev + end + local + structure ANSITermDev = gs_21 + functor PPStreamFn = gs_13 + signature PP_STREAM = gs_1 + signature PP_TOKEN = gs_12 + structure String = gs_9 + structure TextIO = gs_0 + devices/ansi-term-pp.sml + in + structure gs_25 = ANSITermPP + end + in + structure ANSITermDev = gs_21 + structure ANSITermPP = gs_25 + structure HTMLDev = gs_24 + functor PPDebugFn = gs_2 + functor PPDescFn = gs_15 + functor PPStreamFn = gs_13 + signature PP_DESC = gs_14 + signature PP_DEVICE = gs_3 + signature PP_STREAM = gs_1 + signature PP_TOKEN = gs_12 + structure SimpleTextIODev = gs_5 + structure StringToken = gs_16 + structure TextIOPP = gs_17 + end + end + + end diff -N -C 2 -r smlnj-lib/README.mlton smlnj-lib-mlton/README.mlton *** smlnj-lib/README.mlton 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/README.mlton 2010-04-02 15:28:21.000000000 -0400 *************** *** 0 **** --- 1,15 ---- + The following changes were made to the SML/NJ Library, in addition to + deriving the {{{.mlb}}} files from the {{{.cm}}} files: + * {{{Util/redblack-set-fn.sml}}} (modified): Rewrote use of {{{where}}} structure specification. + * {{{Util/redblack-map-fn.sml}}} (modified): Rewrote use of {{{where}}} structure specification. + * {{{Util/graph-scc-fn.sml}}} (modified): Rewrote use of {{{where}}} structure specification. + * {{{Util/bit-array.sml}}} (modified): The computation of the {{{maxLen}}} is given by: {{{ + val maxLen = 8*Word8Array.maxLen + }}} This is fine in SML/NJ where {{{Word8Array.maxLen}}} is 16777215, but in MLton, {{{Word8Array.maxLen}}} is equal to {{{valOf(Int.maxInt)}}}, so the computation overflows. To accommodate both SML/NJ and MLton, the computation is replaced by {{{ + val maxLen = (8*Word8Array.maxLen) handle Overflow => Word8Array.maxLen + }}} + * {{{Util/engine.mlton.sml}}} (added, not exported): Implements {{{structure Engine}}}, providing time-limited, resumable computations using ["MLtonThread"], ["MLtonSignal"], and ["MLtonItimer"]. + * {{{Util/time-limit.mlton.sml}}} (added): Implements {{{structure TimeLimit}}} using {{{structure Engine}}}. The SML/NJ implementation of {{{structure TimeLimit}}} uses SML/NJ's first-class continuations, signals, and interval timer. + * {{{Util/time-limit.mlb}}} (added): Exports {{{structure TimeLimit}}}, which is ''not'' exported by {{{smlnj-lib.mlb}}}. Since MLton is very conservative in the presence of threads and signals, program performance may be adversely affected by unnecessarily including {{{structure TimeLimit}}}. + * {{{HTML/html-elements-fn.sml}}} (modified): Rewrote use of ''or-patterns''. + * {{{HTML/html-attrs-fn.sml}}} (modified): Rewrote use of ''or-patterns''. diff -N -C 2 -r smlnj-lib/Reactive/reactive-lib.mlb smlnj-lib-mlton/Reactive/reactive-lib.mlb *** smlnj-lib/Reactive/reactive-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/Reactive/reactive-lib.mlb 2010-04-02 16:09:15.000000000 -0400 *************** *** 0 **** --- 1,71 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l14 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb + end + basis l4 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = Atom + end + local + structure Atom = gs_0 + reactive-sig.sml + in + signature gs_1 = REACTIVE + end + local + open l4 + in + structure gs_2 = AtomBinaryMap + end + local + open l14 + in + structure gs_3 = List + end + local + structure Atom = gs_0 + instruction.sml + in + structure gs_4 = Instruction + end + local + structure Atom = gs_0 + structure Instruction = gs_4 + structure List = gs_3 + machine.sml + in + structure gs_5 = Machine + end + local + structure AtomBinaryMap = gs_2 + structure Instruction = gs_4 + structure List = gs_3 + structure Machine = gs_5 + signature REACTIVE = gs_1 + reactive.sml + in + structure gs_6 = Reactive + end + in + signature REACTIVE = gs_1 + structure Reactive = gs_6 + end + end + + end diff -N -C 2 -r smlnj-lib/RegExp/regexp-lib.mlb smlnj-lib-mlton/RegExp/regexp-lib.mlb *** smlnj-lib/RegExp/regexp-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/RegExp/regexp-lib.mlb 2010-04-02 16:09:15.000000000 -0400 *************** *** 0 **** --- 1,235 ---- + + ann + "nonexhaustiveMatch ignore" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb + end + basis l16 = + bas + (* $/smlnj-lib.cm ====> *) $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = StringCvt + end + local + open l4 + in + structure gs_1 = List + end + local + structure List = gs_1 + Glue/match-tree.sml + in + signature gs_2 = MATCH_TREE + structure gs_3 = MatchTree + end + local + open l16 + in + functor gs_4 = ListSetFn + end + local + open l4 + in + structure gs_5 = Char + end + local + open l16 + in + signature gs_6 = ORD_SET + end + local + signature ORD_SET = gs_6 + FrontEnd/syntax-sig.sml + in + signature gs_7 = REGEXP_SYNTAX + end + local + structure Char = gs_5 + structure List = gs_1 + functor ListSetFn = gs_4 + signature REGEXP_SYNTAX = gs_7 + FrontEnd/syntax.sml + in + structure gs_8 = RegExpSyntax + end + local + signature MATCH_TREE = gs_2 + structure MatchTree = gs_3 + structure RegExpSyntax = gs_8 + structure StringCvt = gs_0 + BackEnd/engine-sig.sml + in + signature gs_9 = REGEXP_ENGINE + end + local + open l4 + in + structure gs_10 = Array + end + local + open l4 + in + structure gs_11 = Vector + end + local + open l4 + in + structure gs_12 = Int + end + local + structure Array = gs_10 + structure Char = gs_5 + structure Int = gs_12 + structure List = gs_1 + signature MATCH_TREE = gs_2 + structure MatchTree = gs_3 + signature REGEXP_ENGINE = gs_9 + structure RegExpSyntax = gs_8 + structure StringCvt = gs_0 + structure Vector = gs_11 + BackEnd/thompson-engine.sml + in + structure gs_13 = ThompsonEngine + end + local + open l16 + in + functor gs_14 = ListMapFn + end + local + open l4 + in + structure gs_15 = Array2 + end + local + open l4 + in + structure gs_16 = TextIO + end + local + open l4 + in + structure gs_17 = ListPair + end + local + structure Array = gs_10 + structure Array2 = gs_15 + structure Char = gs_5 + structure Int = gs_12 + structure List = gs_1 + functor ListMapFn = gs_14 + structure ListPair = gs_17 + functor ListSetFn = gs_4 + signature ORD_SET = gs_6 + structure RegExpSyntax = gs_8 + structure TextIO = gs_16 + BackEnd/fsm.sml + in + signature gs_18 = DFA + structure gs_19 = Dfa + signature gs_20 = NFA + structure gs_21 = Nfa + end + local + signature DFA = gs_18 + structure Dfa = gs_19 + signature MATCH_TREE = gs_2 + structure MatchTree = gs_3 + signature NFA = gs_20 + structure Nfa = gs_21 + signature REGEXP_ENGINE = gs_9 + structure RegExpSyntax = gs_8 + structure Vector = gs_11 + BackEnd/dfa-engine.sml + in + structure gs_22 = DfaEngine + end + local + signature MATCH_TREE = gs_2 + structure MatchTree = gs_3 + structure StringCvt = gs_0 + Glue/regexp-sig.sml + in + signature gs_23 = REGEXP + end + local + structure RegExpSyntax = gs_8 + structure StringCvt = gs_0 + FrontEnd/parser-sig.sml + in + signature gs_24 = REGEXP_PARSER + end + local + signature MATCH_TREE = gs_2 + structure MatchTree = gs_3 + signature REGEXP = gs_23 + signature REGEXP_ENGINE = gs_9 + signature REGEXP_PARSER = gs_24 + structure RegExpSyntax = gs_8 + structure StringCvt = gs_0 + Glue/regexp-fn.sml + in + functor gs_25 = RegExpFn + end + local + open l4 + in + structure gs_26 = Word8 + end + local + structure Char = gs_5 + structure Int = gs_12 + structure List = gs_1 + signature REGEXP_PARSER = gs_24 + structure RegExpSyntax = gs_8 + structure StringCvt = gs_0 + structure Word8 = gs_26 + FrontEnd/awk-syntax.sml + in + structure gs_27 = AwkSyntax + end + local + open l4 + in + structure gs_28 = Option + end + local + structure List = gs_1 + signature MATCH_TREE = gs_2 + structure MatchTree = gs_3 + structure Option = gs_28 + signature REGEXP_ENGINE = gs_9 + structure RegExpSyntax = gs_8 + BackEnd/bt-engine.sml + in + structure gs_29 = BackTrackEngine + end + in + structure AwkSyntax = gs_27 + structure BackTrackEngine = gs_29 + structure DfaEngine = gs_22 + signature MATCH_TREE = gs_2 + structure MatchTree = gs_3 + signature REGEXP = gs_23 + signature REGEXP_ENGINE = gs_9 + signature REGEXP_PARSER = gs_24 + signature REGEXP_SYNTAX = gs_7 + functor RegExpFn = gs_25 + structure RegExpSyntax = gs_8 + structure ThompsonEngine = gs_13 + end + end + + end diff -N -C 2 -r smlnj-lib/Unix/unix-lib.mlb smlnj-lib-mlton/Unix/unix-lib.mlb *** smlnj-lib/Unix/unix-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/Unix/unix-lib.mlb 2010-04-02 16:09:16.000000000 -0400 *************** *** 0 **** --- 1,45 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = Substring + end + local + open l4 + in + structure gs_1 = Posix + end + local + unix-env-sig.sml + in + signature gs_2 = UNIX_ENV + end + local + structure Posix = gs_1 + structure Substring = gs_0 + signature UNIX_ENV = gs_2 + unix-env.sml + in + structure gs_3 = UnixEnv + end + in + signature UNIX_ENV = gs_2 + structure UnixEnv = gs_3 + end + end + + end diff -N -C 2 -r smlnj-lib/Util/bit-array.sml smlnj-lib-mlton/Util/bit-array.sml *** smlnj-lib/Util/bit-array.sml 2009-10-02 09:51:26.000000000 -0400 --- smlnj-lib-mlton/Util/bit-array.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 48,52 **** *) type elem = bool ! val maxLen = 8*Word8Array.maxLen datatype vector = BA of {nbits : int, bits : W8A.array} --- 48,54 ---- *) type elem = bool ! val maxLen = (8*Word8Array.maxLen) ! handle Overflow => Word8Array.maxLen ! datatype vector = BA of {nbits : int, bits : W8A.array} diff -N -C 2 -r smlnj-lib/Util/engine.mlton.sml smlnj-lib-mlton/Util/engine.mlton.sml *** smlnj-lib/Util/engine.mlton.sml 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/Util/engine.mlton.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 0 **** --- 1,99 ---- + (* Copyright (C) 1999-2004 Henry Cejtin, Matthew Fluet, Suresh + * Jagannathan, and Stephen Weeks. + * + * MLton is released under the GNU General Public License (GPL). + * Please see the file MLton-LICENSE for license information. + *) + + signature ENGINE = + sig + type 'a t + + datatype 'a res = + Done of 'a + | Raise of exn + | TimeOut of 'a t + + val new: (unit -> 'a) -> 'a t + val repeat: {thunk: unit -> 'a, + limit: Time.time, + tries: int} -> 'a option + val run: 'a t * Time.time -> 'a res + val timeLimit: Time.time * (unit -> 'a) -> 'a option + end + + structure Engine: ENGINE = + struct + + open MLton + + datatype 'a t = T of {return: 'a res Thread.t option ref, + thread: Thread.Runnable.t} + and 'a res = + Done of 'a + | Raise of exn + | TimeOut of 'a t + + val which = Itimer.Real + val signal = Itimer.signal which + + fun done (return): unit = + (return := NONE + ; Itimer.set (which, {value = Time.zeroTime, + interval = Time.zeroTime}) + ; Signal.setHandler (signal, Signal.Handler.default)) + + fun new (f: unit -> 'a): 'a t = + let + val return = ref NONE + val thread = + Thread.new + (fn () => + let + val res = Done (f ()) handle e => Raise e + val ret = valOf (!return) + val _ = done return + in + Thread.switch (fn _ => Thread.prepare (ret, res)) + end) + val thread = Thread.prepare (thread, ()) + in + T {return = return, thread = thread} + end + + fun run (T {return, thread}, time: Time.time): 'a res = + Thread.switch + (fn cur: 'a res Thread.t => + let + val _ = return := SOME cur + fun handler (me: Thread.Runnable.t): Thread.Runnable.t = + Thread.prepare + (Thread.prepend (cur, fn () => (done return + ; TimeOut (T {return = return, + thread = me}))), + ()) + val _ = Signal.setHandler (signal, Signal.Handler.handler handler) + val _ = Itimer.set (which, {value = time, + interval = Time.zeroTime}) + in + thread + end) + + fun timeLimit (t: Time.time, f: unit -> 'a): 'a option = + case run (new f, t) of + Done a => SOME a + | Raise e => raise e + | TimeOut _ => NONE + + fun repeat {thunk, limit, tries} = + let + fun loop (n: int) = + if n <= 0 + then NONE + else (case timeLimit (limit, thunk) of + NONE => loop (n - 1) + | SOME a => SOME a) + in loop tries + end + + end diff -N -C 2 -r smlnj-lib/Util/graph-scc-fn.sml smlnj-lib-mlton/Util/graph-scc-fn.sml *** smlnj-lib/Util/graph-scc-fn.sml 2009-10-02 09:51:26.000000000 -0400 --- smlnj-lib-mlton/Util/graph-scc-fn.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 9,13 **** *) ! functor GraphSCCFn (Nd: ORD_KEY) :> GRAPH_SCC where Nd = Nd = struct structure Nd = Nd --- 9,13 ---- *) ! functor GraphSCCFn (Nd: ORD_KEY) :> GRAPH_SCC where type Nd.ord_key = Nd.ord_key = struct structure Nd = Nd diff -N -C 2 -r smlnj-lib/Util/real-order-stats.sml smlnj-lib-mlton/Util/real-order-stats.sml *** smlnj-lib/Util/real-order-stats.sml 2009-10-02 09:51:26.000000000 -0400 --- smlnj-lib-mlton/Util/real-order-stats.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 24,28 **** end = struct ! infix 8 $ val op $ = Unsafe.Array.sub infix 3 <- fun (a, i) <- x = Unsafe.Array.update (a, i, x) --- 24,28 ---- end = struct ! infix 8 $$ val op $$ = Unsafe.Array.sub infix 3 <- fun (a, i) <- x = Unsafe.Array.update (a, i, x) *************** *** 37,46 **** (* random partition: *) fun rp (p, r) = ! let fun sw(i,j) = let val t=a$i in (a,i)<-a$j; (a,j)<-t end val q = Random.randRange (p, r) rand ! val qv = a$q ! val _ = if q<>p then ((a,q)<-a$p; (a,p)<-qv) else () ! fun up i = if i>r orelse qv < a$i then i else up(i+1) ! fun dn i = if i>=p andalso qv < a$i then dn(i-1) else i fun lp (i, j) = let val (i, j) = (up i, dn j) --- 37,46 ---- (* random partition: *) fun rp (p, r) = ! let fun sw(i,j) = let val t=a$$i in (a,i)<-a$$j; (a,j)<-t end val q = Random.randRange (p, r) rand ! val qv = a$$q ! val _ = if q<>p then ((a,q)<-a$$p; (a,p)<-qv) else () ! fun up i = if i>r orelse qv < a$$i then i else up(i+1) ! fun dn i = if i>=p andalso qv < a$$i then dn(i-1) else i fun lp (i, j) = let val (i, j) = (up i, dn j) *************** *** 51,55 **** (* random select: *) fun rs (p, r) = ! if p=r then a$r else let val (q, qv) = rp (p, r) in if i=q then qv else if i=mid then m else l(i+1, Real.max(a$i,m)) ! in if len mod 2 = 1 then m0 else (l(p+1,a$p) + m0) / 2.0 end --- 65,70 ---- val r = p + len - 1 val m0 = select0 (a, p, r, mid) ! fun l(i,m) = if i>=mid then m else l(i+1, Real.max(a$$i,m)) ! in if len mod 2 = 1 then m0 else (l(p+1,a$$p) + m0) / 2.0 end diff -N -C 2 -r smlnj-lib/Util/redblack-map-fn.sml smlnj-lib-mlton/Util/redblack-map-fn.sml *** smlnj-lib/Util/redblack-map-fn.sml 2009-10-02 09:51:26.000000000 -0400 --- smlnj-lib-mlton/Util/redblack-map-fn.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 21,25 **** *) ! functor RedBlackMapFn (K : ORD_KEY) :> ORD_MAP where Key = K = struct --- 21,25 ---- *) ! functor RedBlackMapFn (K : ORD_KEY) :> ORD_MAP where type Key.ord_key = K.ord_key = struct diff -N -C 2 -r smlnj-lib/Util/redblack-set-fn.sml smlnj-lib-mlton/Util/redblack-set-fn.sml *** smlnj-lib/Util/redblack-set-fn.sml 2009-10-02 09:51:26.000000000 -0400 --- smlnj-lib-mlton/Util/redblack-set-fn.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 21,25 **** *) ! functor RedBlackSetFn (K : ORD_KEY) :> ORD_SET where Key = K = struct --- 21,25 ---- *) ! functor RedBlackSetFn (K : ORD_KEY) :> ORD_SET where type Key.ord_key = K.ord_key = struct diff -N -C 2 -r smlnj-lib/Util/smlnj-lib.mlb smlnj-lib-mlton/Util/smlnj-lib.mlb *** smlnj-lib/Util/smlnj-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/Util/smlnj-lib.mlb 2010-04-02 16:09:16.000000000 -0400 *************** *** 0 **** --- 1,1108 ---- + + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit ignore" + "warnUnused false" "forceUsed" + in + + local + basis l4 = + bas + (* $/basis.cm ====> *) $(SML_LIB)/basis/basis.mlb $(SML_LIB)/basis/unsafe.mlb $(SML_LIB)/basis/sml-nj.mlb + end + in + local + $(SML_LIB)/basis/pervasive.mlb + local + open l4 + in + structure gs_0 = List + end + local + ord-key-sig.sml + in + signature gs_1 = ORD_KEY + end + local + signature ORD_KEY = gs_1 + ord-set-sig.sml + in + signature gs_2 = ORD_SET + end + local + open l4 + in + structure gs_3 = Int + end + local + lib-base-sig.sml + in + signature gs_4 = LIB_BASE + end + local + structure Int = gs_3 + signature LIB_BASE = gs_4 + lib-base.sml + in + structure gs_5 = LibBase + end + local + structure LibBase = gs_5 + structure List = gs_0 + signature ORD_KEY = gs_1 + signature ORD_SET = gs_2 + list-set-fn.sml + in + functor gs_6 = ListSetFn + end + local + signature ORD_KEY = gs_1 + ord-map-sig.sml + in + signature gs_7 = ORD_MAP + end + local + structure LibBase = gs_5 + structure List = gs_0 + signature ORD_KEY = gs_1 + signature ORD_MAP = gs_7 + list-map-fn.sml + in + functor gs_8 = ListMapFn + end + local + structure Int = gs_3 + structure LibBase = gs_5 + structure List = gs_0 + signature ORD_SET = gs_2 + int-binary-set.sml + in + structure gs_9 = IntBinarySet + end + local + structure Int = gs_3 + structure LibBase = gs_5 + signature ORD_MAP = gs_7 + int-binary-map.sml + in + structure gs_10 = IntBinaryMap + end + local + prime-sizes.sml + in + structure gs_11 = PrimeSizes + end + local + open l4 + in + structure gs_12 = Array + end + local + open l4 + in + structure gs_13 = ArraySlice + end + local + open l4 + in + structure gs_14 = General + end + local + dynamic-array-sig.sml + in + signature gs_15 = DYNAMIC_ARRAY + end + local + structure Array = gs_12 + structure ArraySlice = gs_13 + signature DYNAMIC_ARRAY = gs_15 + structure General = gs_14 + structure Int = gs_3 + dynamic-array.sml + in + structure gs_16 = DynamicArray + end + local + io-util-sig.sml + in + signature gs_17 = IO_UTIL + end + local + splaytree-sig.sml + in + signature gs_18 = SPLAY_TREE + end + local + signature SPLAY_TREE = gs_18 + splaytree.sml + in + structure gs_19 = SplayTree + end + local + structure LibBase = gs_5 + structure List = gs_0 + signature ORD_KEY = gs_1 + signature ORD_SET = gs_2 + structure SplayTree = gs_19 + splay-set-fn.sml + in + functor gs_20 = SplaySetFn + end + local + structure LibBase = gs_5 + signature ORD_KEY = gs_1 + signature ORD_MAP = gs_7 + structure SplayTree = gs_19 + splay-map-fn.sml + in + functor gs_21 = SplayMapFn + end + local + open l4 + in + structure gs_22 = TextIO + end + local + structure Int = gs_3 + structure List = gs_0 + structure TextIO = gs_22 + ansi-term.sml + in + structure gs_23 = ANSITerm + end + local + signature IO_UTIL = gs_17 + structure TextIO = gs_22 + io-util.sml + in + structure gs_24 = IOUtil + end + local + plist-sig.sml + in + signature gs_25 = PROP_LIST + end + local + open l4 + in + structure gs_26 = String + end + local + open l4 + in + structure gs_27 = Substring + end + local + open l4 + in + structure gs_28 = StringCvt + end + local + open l4 + in + structure gs_29 = Char + end + local + getopt-sig.sml + in + signature gs_30 = GET_OPT + end + local + structure Char = gs_29 + signature GET_OPT = gs_30 + structure Int = gs_3 + structure List = gs_0 + structure String = gs_26 + structure StringCvt = gs_28 + structure Substring = gs_27 + getopt.sml + in + structure gs_31 = GetOpt + end + local + interval-domain-sig.sml + in + signature gs_32 = INTERVAL_DOMAIN + end + local + signature INTERVAL_DOMAIN = gs_32 + interval-set-sig.sml + in + signature gs_33 = INTERVAL_SET + end + local + structure StringCvt = gs_28 + parser-comb-sig.sml + in + signature gs_34 = PARSER_COMB + end + local + open l4 + in + structure gs_35 = Word8 + end + local + open l4 + in + structure gs_36 = CharVector + end + local + open l4 + in + structure gs_37 = LargeWord + end + local + open l4 + in + structure gs_38 = LargeInt + end + local + open l4 + in + structure gs_39 = Word + end + local + open l4 + in + structure gs_40 = Real + end + local + open l4 + in + structure gs_41 = LargeReal + end + local + atom-sig.sml + in + signature gs_42 = ATOM + end + local + open l4 + in + structure gs_43 = Unsafe + end + local + structure Char = gs_29 + structure Substring = gs_27 + structure Unsafe = gs_43 + structure Word = gs_39 + hash-string.sml + in + structure gs_44 = HashString + end + local + signature ATOM = gs_42 + structure Array = gs_12 + structure HashString = gs_44 + structure String = gs_26 + structure Substring = gs_27 + structure Word = gs_39 + atom.sml + in + structure gs_45 = Atom + end + local + structure Atom = gs_45 + structure Int = gs_3 + structure LargeInt = gs_38 + structure LargeReal = gs_41 + structure LargeWord = gs_37 + structure Real = gs_40 + structure Word = gs_39 + structure Word8 = gs_35 + format-sig.sml + in + signature gs_46 = FORMAT + end + local + structure Int = gs_3 + structure String = gs_26 + structure StringCvt = gs_28 + real-format.sml + in + structure gs_47 = RealFormat + end + local + structure Atom = gs_45 + structure Char = gs_29 + structure Int = gs_3 + structure LargeInt = gs_38 + structure LargeReal = gs_41 + structure LargeWord = gs_37 + structure Real = gs_40 + structure StringCvt = gs_28 + structure Substring = gs_27 + structure Word = gs_39 + structure Word8 = gs_35 + fmt-fields.sml + in + structure gs_48 = FmtFields + end + local + structure Atom = gs_45 + structure Char = gs_29 + structure CharVector = gs_36 + signature FORMAT = gs_46 + structure FmtFields = gs_48 + structure Int = gs_3 + structure LargeInt = gs_38 + structure LargeWord = gs_37 + structure Real = gs_40 + structure RealFormat = gs_47 + structure String = gs_26 + structure StringCvt = gs_28 + structure Substring = gs_27 + structure Word = gs_39 + structure Word8 = gs_35 + format.sml + in + structure gs_49 = Format + end + local + priority-sig.sml + in + signature gs_50 = PRIORITY + end + local + hash-key-sig.sml + in + signature gs_51 = HASH_KEY + end + local + signature HASH_KEY = gs_51 + mono-hash-table-sig.sml + in + signature gs_52 = MONO_HASH_TABLE + end + local + structure Array = gs_12 + structure Word = gs_39 + hash-table-rep.sml + in + structure gs_53 = HashTableRep + end + local + structure Array = gs_12 + structure HashTableRep = gs_53 + signature MONO_HASH_TABLE = gs_52 + structure Word = gs_39 + int-hash-table.sml + in + structure gs_54 = IntHashTable + end + local + open l4 + in + signature gs_55 = MONO_ARRAY + end + local + signature MONO_ARRAY = gs_55 + bit-array-sig.sml + in + signature gs_56 = BIT_ARRAY + end + local + structure LibBase = gs_5 + signature ORD_KEY = gs_1 + signature ORD_SET = gs_2 + redblack-set-fn.sml + in + functor gs_57 = RedBlackSetFn + end + local + structure Atom = gs_45 + functor RedBlackSetFn = gs_57 + atom-redblack-set.sml + in + structure gs_58 = AtomRedBlackSet + end + local + structure AtomRedBlackSet = gs_58 + atom-set.sml + in + structure gs_59 = AtomSet + end + local + structure LibBase = gs_5 + signature ORD_KEY = gs_1 + signature ORD_MAP = gs_7 + redblack-map-fn.sml + in + functor gs_60 = RedBlackMapFn + end + local + structure Atom = gs_45 + functor RedBlackMapFn = gs_60 + atom-redblack-map.sml + in + structure gs_61 = AtomRedBlackMap + end + local + structure AtomRedBlackMap = gs_61 + atom-map.sml + in + structure gs_62 = AtomMap + end + local + structure List = gs_0 + signature PROP_LIST = gs_25 + plist.sml + in + structure gs_63 = PropList + end + local + open l4 + in + structure gs_64 = Vector + end + local + char-map-sig.sml + in + signature gs_65 = CHAR_MAP + end + local + structure Array = gs_12 + signature CHAR_MAP = gs_65 + structure Char = gs_29 + structure String = gs_26 + structure Vector = gs_64 + char-map.sml + in + structure gs_66 = CharMap + end + local + list-xprod-sig.sml + in + signature gs_67 = LIST_XPROD + end + local + signature ORD_KEY = gs_1 + graph-scc-sig.sml + in + signature gs_68 = GRAPH_SCC + end + local + signature GRAPH_SCC = gs_68 + structure List = gs_0 + signature ORD_KEY = gs_1 + functor RedBlackMapFn = gs_60 + graph-scc-fn.sml + in + functor gs_69 = GraphSCCFn + end + local + structure Array = gs_12 + signature HASH_KEY = gs_51 + structure HashTableRep = gs_53 + signature MONO_HASH_TABLE = gs_52 + structure Word = gs_39 + hash-table-fn.sml + in + functor gs_70 = HashTableFn + end + local + structure Atom = gs_45 + functor HashTableFn = gs_70 + atom-table.sml + in + structure gs_71 = AtomTable + end + local + structure StringCvt = gs_28 + list-format-sig.sml + in + signature gs_72 = LIST_FORMAT + end + local + signature LIST_FORMAT = gs_72 + structure String = gs_26 + structure StringCvt = gs_28 + list-format.sml + in + structure gs_73 = ListFormat + end + local + open l4 + in + signature gs_74 = MONO_VECTOR + end + local + signature MONO_VECTOR = gs_74 + bit-vector-sig.sml + in + signature gs_75 = BIT_VECTOR + end + local + signature PARSER_COMB = gs_34 + structure StringCvt = gs_28 + structure Substring = gs_27 + parser-comb.sml + in + structure gs_76 = ParserComb + end + local + signature HASH_KEY = gs_51 + mono-hash2-table-sig.sml + in + signature gs_77 = MONO_HASH2_TABLE + end + local + signature INTERVAL_DOMAIN = gs_32 + signature INTERVAL_SET = gs_33 + structure List = gs_0 + interval-set-fn.sml + in + functor gs_78 = IntervalSetFn + end + local + structure LibBase = gs_5 + signature ORD_SET = gs_2 + structure Word = gs_39 + word-redblack-set.sml + in + structure gs_79 = WordRedBlackSet + end + local + structure LibBase = gs_5 + signature ORD_MAP = gs_7 + structure Word = gs_39 + word-redblack-map.sml + in + structure gs_80 = WordRedBlackMap + end + local + structure Int = gs_3 + structure LibBase = gs_5 + structure List = gs_0 + signature ORD_SET = gs_2 + int-list-set.sml + in + structure gs_81 = IntListSet + end + local + structure Int = gs_3 + structure LibBase = gs_5 + structure List = gs_0 + signature ORD_MAP = gs_7 + int-list-map.sml + in + structure gs_82 = IntListMap + end + local + open l4 + in + structure gs_83 = OS + end + local + path-util-sig.sml + in + signature gs_84 = PATH_UTIL + end + local + structure OS = gs_83 + signature PATH_UTIL = gs_84 + path-util.sml + in + structure gs_85 = PathUtil + end + local + structure LibBase = gs_5 + structure List = gs_0 + signature ORD_KEY = gs_1 + signature ORD_SET = gs_2 + binary-set-fn.sml + in + functor gs_86 = BinarySetFn + end + local + structure LibBase = gs_5 + signature ORD_KEY = gs_1 + signature ORD_MAP = gs_7 + binary-map-fn.sml + in + functor gs_87 = BinaryMapFn + end + local + open l4 + in + structure gs_88 = Math + end + local + open l4 + in + structure gs_89 = PackWord32Big + end + local + open l4 + in + structure gs_90 = Word8Vector + end + local + open l4 + in + structure gs_91 = Word8Array + end + local + open l4 + in + structure gs_92 = Word31 + end + local + open l4 + in + structure gs_93 = Byte + end + local + random-sig.sml + in + signature gs_94 = RANDOM + end + local + structure Array = gs_12 + structure Byte = gs_93 + structure LargeWord = gs_37 + structure LibBase = gs_5 + structure PackWord32Big = gs_89 + signature RANDOM = gs_94 + structure Word31 = gs_92 + structure Word8Array = gs_91 + structure Word8Vector = gs_90 + random.sml + in + structure gs_95 = Random + end + local + structure Array = gs_12 + structure ArraySlice = gs_13 + structure Random = gs_95 + structure Real = gs_40 + structure Unsafe = gs_43 + structure Word = gs_39 + real-order-stats.sml + in + structure gs_96 = RealOrderStats + end + local + structure Array = gs_12 + structure ArraySlice = gs_13 + structure Math = gs_88 + structure RealOrderStats = gs_96 + structure Unsafe = gs_43 + univariate-stats.sml + in + structure gs_97 = UnivariateStats + end + local + signature BIT_ARRAY = gs_56 + structure Byte = gs_93 + structure Int = gs_3 + structure LibBase = gs_5 + structure List = gs_0 + structure Word = gs_39 + structure Word8 = gs_35 + structure Word8Array = gs_91 + structure Word8Vector = gs_90 + bit-array.sml + in + structure gs_98 = BitArray + end + local + structure Array = gs_12 + signature MONO_ARRAY = gs_55 + structure Vector = gs_64 + mono-array-fn.sml + in + functor gs_99 = MonoArrayFn + end + local + signature MONO_ARRAY = gs_55 + bsearch-fn.sml + in + functor gs_100 = BSearchFn + end + local + mono-dynamic-array-sig.sml + in + signature gs_101 = MONO_DYNAMIC_ARRAY + end + local + open l4 + in + structure gs_102 = Bool + end + local + structure StringCvt = gs_28 + format-comb-sig.sml + in + signature gs_103 = FORMAT_COMB + end + local + structure Bool = gs_102 + structure Char = gs_29 + signature FORMAT_COMB = gs_103 + structure Int = gs_3 + structure List = gs_0 + structure Real = gs_40 + structure String = gs_26 + structure StringCvt = gs_28 + format-comb.sml + in + structure gs_104 = FormatComb + end + local + queue-sig.sml + in + signature gs_105 = QUEUE + end + local + fifo-sig.sml + in + signature gs_106 = FIFO + end + local + signature FIFO = gs_106 + structure List = gs_0 + fifo.sml + in + structure gs_107 = Fifo + end + local + structure Fifo = gs_107 + signature QUEUE = gs_105 + queue.sml + in + structure gs_108 = Queue + end + local + structure Array = gs_12 + signature HASH_KEY = gs_51 + structure HashTableRep = gs_53 + signature MONO_HASH2_TABLE = gs_77 + structure Word = gs_39 + hash2-table-fn.sml + in + functor gs_109 = Hash2TableFn + end + local + structure Array = gs_12 + structure HashTableRep = gs_53 + signature MONO_HASH_TABLE = gs_52 + structure Word = gs_39 + word-hash-table.sml + in + structure gs_110 = WordHashTable + end + local + structure Atom = gs_45 + structure AtomTable = gs_71 + structure List = gs_0 + keyword-fn.sml + in + functor gs_111 = KeywordFn + end + local + mono-priorityq-sig.sml + in + signature gs_112 = MONO_PRIORITYQ + end + local + structure List = gs_0 + signature MONO_PRIORITYQ = gs_112 + signature PRIORITY = gs_50 + left-priorityq-fn.sml + in + functor gs_113 = LeftPriorityQFn + end + local + hash-table-sig.sml + in + signature gs_114 = HASH_TABLE + end + local + structure Array = gs_12 + signature HASH_TABLE = gs_114 + structure HashTableRep = gs_53 + structure Word = gs_39 + hash-table.sml + in + structure gs_115 = HashTable + end + local + structure General = gs_14 + structure Int = gs_3 + signature MONO_ARRAY = gs_55 + signature MONO_DYNAMIC_ARRAY = gs_101 + dynamic-array-fn.sml + in + functor gs_116 = DynamicArrayFn + end + local + signature MONO_ARRAY = gs_55 + mono-array-sort-sig.sml + in + signature gs_117 = MONO_ARRAY_SORT + end + local + structure Int = gs_3 + structure LibBase = gs_5 + signature ORD_SET = gs_2 + int-redblack-set.sml + in + structure gs_118 = IntRedBlackSet + end + local + structure Int = gs_3 + structure LibBase = gs_5 + signature ORD_MAP = gs_7 + int-redblack-map.sml + in + structure gs_119 = IntRedBlackMap + end + local + array-sort-sig.sml + in + signature gs_120 = ARRAY_SORT + end + local + signature ARRAY_SORT = gs_120 + structure Array = gs_12 + structure Int = gs_3 + structure Unsafe = gs_43 + array-qsort.sml + in + structure gs_121 = ArrayQSort + end + local + uref-sig.sml + in + signature gs_122 = UREF + end + local + signature UREF = gs_122 + simple-uref.sml + in + structure gs_123 = SimpleURef + end + local + listsort-sig.sml + in + signature gs_124 = LIST_SORT + end + local + signature LIST_SORT = gs_124 + structure LibBase = gs_5 + list-mergesort.sml + in + structure gs_125 = ListMergeSort + end + local + structure Int = gs_3 + signature MONO_ARRAY = gs_55 + signature MONO_ARRAY_SORT = gs_117 + array-qsort-fn.sml + in + functor gs_126 = ArrayQSortFn + end + local + structure Atom = gs_45 + functor BinarySetFn = gs_86 + atom-binary-set.sml + in + structure gs_127 = AtomBinarySet + end + local + structure Atom = gs_45 + functor BinaryMapFn = gs_87 + atom-binary-map.sml + in + structure gs_128 = AtomBinaryMap + end + local + structure StringCvt = gs_28 + utf8-sig.sml + in + signature gs_129 = UTF8 + end + local + structure Char = gs_29 + structure String = gs_26 + structure StringCvt = gs_28 + structure Substring = gs_27 + signature UTF8 = gs_129 + structure Word = gs_39 + utf8.sml + in + structure gs_130 = UTF8 + end + local + signature UREF = gs_122 + uref.sml + in + structure gs_131 = URef + end + local + structure Atom = gs_45 + structure Int = gs_3 + structure LargeInt = gs_38 + structure LargeReal = gs_41 + structure LargeWord = gs_37 + structure Real = gs_40 + structure StringCvt = gs_28 + structure Word = gs_39 + structure Word8 = gs_35 + scan-sig.sml + in + signature gs_132 = SCAN + end + local + structure Bool = gs_102 + structure Char = gs_29 + structure FmtFields = gs_48 + structure Int = gs_3 + structure LargeInt = gs_38 + structure LargeReal = gs_41 + signature SCAN = gs_132 + structure StringCvt = gs_28 + structure Substring = gs_27 + structure Word8Array = gs_91 + scan.sml + in + structure gs_133 = Scan + end + local + open l4 + in + structure gs_134 = Int32 + end + local + structure Word31 = gs_92 + rand-sig.sml + in + signature gs_135 = RAND + end + local + structure Int32 = gs_134 + structure LibBase = gs_5 + signature RAND = gs_135 + structure Real = gs_40 + structure Word31 = gs_92 + rand.sml + in + structure gs_136 = Rand + end + local + signature LIST_XPROD = gs_67 + list-xprod.sml + in + structure gs_137 = ListXProd + end + in + structure ANSITerm = gs_23 + signature ARRAY_SORT = gs_120 + signature ATOM = gs_42 + structure ArrayQSort = gs_121 + functor ArrayQSortFn = gs_126 + structure Atom = gs_45 + structure AtomBinaryMap = gs_128 + structure AtomBinarySet = gs_127 + structure AtomMap = gs_62 + structure AtomRedBlackMap = gs_61 + structure AtomRedBlackSet = gs_58 + structure AtomSet = gs_59 + structure AtomTable = gs_71 + signature BIT_ARRAY = gs_56 + signature BIT_VECTOR = gs_75 + functor BSearchFn = gs_100 + functor BinaryMapFn = gs_87 + functor BinarySetFn = gs_86 + structure BitArray = gs_98 + signature CHAR_MAP = gs_65 + structure CharMap = gs_66 + signature DYNAMIC_ARRAY = gs_15 + structure DynamicArray = gs_16 + functor DynamicArrayFn = gs_116 + signature FIFO = gs_106 + signature FORMAT = gs_46 + signature FORMAT_COMB = gs_103 + structure Fifo = gs_107 + structure Format = gs_49 + structure FormatComb = gs_104 + signature GET_OPT = gs_30 + signature GRAPH_SCC = gs_68 + structure GetOpt = gs_31 + functor GraphSCCFn = gs_69 + signature HASH_KEY = gs_51 + signature HASH_TABLE = gs_114 + functor Hash2TableFn = gs_109 + structure HashString = gs_44 + structure HashTable = gs_115 + functor HashTableFn = gs_70 + signature INTERVAL_DOMAIN = gs_32 + signature INTERVAL_SET = gs_33 + structure IOUtil = gs_24 + signature IO_UTIL = gs_17 + structure IntBinaryMap = gs_10 + structure IntBinarySet = gs_9 + structure IntHashTable = gs_54 + structure IntListMap = gs_82 + structure IntListSet = gs_81 + structure IntRedBlackMap = gs_119 + structure IntRedBlackSet = gs_118 + functor IntervalSetFn = gs_78 + functor KeywordFn = gs_111 + signature LIB_BASE = gs_4 + signature LIST_FORMAT = gs_72 + signature LIST_SORT = gs_124 + signature LIST_XPROD = gs_67 + functor LeftPriorityQFn = gs_113 + structure LibBase = gs_5 + structure ListFormat = gs_73 + functor ListMapFn = gs_8 + structure ListMergeSort = gs_125 + functor ListSetFn = gs_6 + structure ListXProd = gs_137 + signature MONO_ARRAY_SORT = gs_117 + signature MONO_DYNAMIC_ARRAY = gs_101 + signature MONO_HASH2_TABLE = gs_77 + signature MONO_HASH_TABLE = gs_52 + signature MONO_PRIORITYQ = gs_112 + functor MonoArrayFn = gs_99 + signature ORD_KEY = gs_1 + signature ORD_MAP = gs_7 + signature ORD_SET = gs_2 + signature PARSER_COMB = gs_34 + signature PATH_UTIL = gs_84 + signature PRIORITY = gs_50 + signature PROP_LIST = gs_25 + structure ParserComb = gs_76 + structure PathUtil = gs_85 + structure PrimeSizes = gs_11 + structure PropList = gs_63 + signature QUEUE = gs_105 + structure Queue = gs_108 + signature RAND = gs_135 + signature RANDOM = gs_94 + structure Rand = gs_136 + structure Random = gs_95 + structure RealOrderStats = gs_96 + functor RedBlackMapFn = gs_60 + functor RedBlackSetFn = gs_57 + signature SCAN = gs_132 + signature SPLAY_TREE = gs_18 + structure Scan = gs_133 + structure SimpleURef = gs_123 + functor SplayMapFn = gs_21 + functor SplaySetFn = gs_20 + structure SplayTree = gs_19 + signature UREF = gs_122 + structure URef = gs_131 + signature UTF8 = gs_129 + structure UTF8 = gs_130 + structure UnivariateStats = gs_97 + structure WordHashTable = gs_110 + structure WordRedBlackMap = gs_80 + structure WordRedBlackSet = gs_79 + end + end + + end diff -N -C 2 -r smlnj-lib/Util/time-limit.mlb smlnj-lib-mlton/Util/time-limit.mlb *** smlnj-lib/Util/time-limit.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/Util/time-limit.mlb 2009-10-02 09:51:26.000000000 -0400 *************** *** 0 **** --- 1,16 ---- + ann + "nonexhaustiveMatch warn" "redundantMatch warn" + "sequenceNonUnit warn" + "warnUnused false" "forceUsed" + in + + local + $(SML_LIB)/basis/basis.mlb + $(SML_LIB)/basis/mlton.mlb + engine.mlton.sml + time-limit.mlton.sml + in + structure TimeLimit = TimeLimit + end + + end diff -N -C 2 -r smlnj-lib/Util/time-limit.mlton.sml smlnj-lib-mlton/Util/time-limit.mlton.sml *** smlnj-lib/Util/time-limit.mlton.sml 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/Util/time-limit.mlton.sml 2009-10-02 09:51:26.000000000 -0400 *************** *** 0 **** --- 1,24 ---- + (* time-limit.mlton.sml + * + * Copyright (C) 1999-2004 Henry Cejtin, Matthew Fluet, Suresh + * Jagannathan, and Stephen Weeks. + * + * MLton is released under the GNU General Public License (GPL). + * Please see the file MLton-LICENSE for license information. + * + *) + + structure TimeLimit: + sig + exception TimeOut + val timeLimit : Time.time -> ('a -> 'b) -> 'a -> 'b + end = + struct + exception TimeOut + + fun timeLimit t f x = + case Engine.run (Engine.new (fn () => f x), t) of + Engine.Done res => res + | Engine.Raise exn => raise exn + | Engine.TimeOut _ => raise TimeOut + end diff -N -C 2 -r smlnj-lib/smlnj-lib.mlb smlnj-lib-mlton/smlnj-lib.mlb *** smlnj-lib/smlnj-lib.mlb 1969-12-31 19:00:00.000000000 -0500 --- smlnj-lib-mlton/smlnj-lib.mlb 2009-10-02 09:51:07.000000000 -0400 *************** *** 0 **** --- 1,13 ---- + local + Controls/controls-lib.mlb + HTML/html-lib.mlb + HashCons/hash-cons-lib.mlb + INet/inet-lib.mlb + PP/pp-lib.mlb + Reactive/reactive-lib.mlb + RegExp/regexp-lib.mlb + Unix/unix-lib.mlb + Util/smlnj-lib.mlb + Util/time-limit.mlb + in + end mlton-20100608/lib/smlnj-lib/smlnj-lib.tgz0000644000076600000240000074132511404435635016652 0ustar mtfstaff‹êN¶Kä[[o·¶î«ô+X±º-E’í8ÉFàøÒz7¶UÉmNQ5CISÏ­ÃËÚEÿûùÖ"‡Ã‘œôeçáàm,KCrq]¿u‘Nâô÷A-^~õÅ~Fø9=91¿_½âߣɱùm~¾NNŽON&_Æãã£ÑWâäË‘ÔüTº”…_%åò³Ïá±åçŸø?ù£üÏ¿?»ýîrþÎ ¿:>þ„ü_NŒü'§“ÓÓ1ôd<9>%F_€–½Ÿÿçò¿_GZà?)âH—"[Š`-Ó•Ò¢ÌD¹Vb~óþåí¿ÄûhQÈbûO~ïQ:ÊR‘VÉ/»AVJçYÒ*»¢P±’ZéawðþévŒÆ£Áèh0zó[·s=©P,ª•ˆR±–z¿‚,Õ¸=ä£7ƒÑÉ`|„gaˆGdQÈ­ˆJUÈ2+øÂÛT&QpÆŸ$YXŪY|4Ÿ¸ÅºÊó¬(Å2+˜%QŠ}e,ô6-åSͽ³?ˆÙeýf. ­ qP‚éÝŽ}s#µH³’>dþÓ²¬ˆVQŠÝjNã}luˆK–$-{:ÝzÛí€PU¤âQ‘LKÈ’ä€]¦wóëÿPÜ4”EØ·7y=`Öá&×I^dÊ<¬ŠWI”Ö’¤NÒ»ÿšßÝZ²ÝòÑ«Áxü,# T‹DÌÍûu–äÔ«ï«fˆaâ6 Ý£tå6ÂB>µ-<¬:Œ_³´ (j%IÄü⇭z…˜í·É@†á˜;¢ŒâX¤J…`?ÎY@nI«DAzasÒ‘9éœÏ .K\êw\Ü*Ö²Šk9ÍÔêò)w¤ \YŠ$”f¬JÕ¦Û1·Çó²lŽÓâ•:½Ð¤%‰,ƒ5Ñ)ã4 \'fG˜’®â$os厶ÏCVPy,Ñtì©éŒh±r`i’=òž©¨R|‹mWØŸ,/I½hãa·s{wù–wát‚%=2 žƒúRå Û”"Ì”ùp«ÊZ„Ý+ÂK=de°œ=…Ø­µ’ÅOnç«,½Z½›u¬aœŠÄ&œWDÿƃÄ{¦-Tq”ÙºZ§=†|!ü••Æó¤øLbu Ý5øypÏ[,!E£´=ú¤Gt;üzÕ£ ÓI•®`ƒ½_{¢w(ðÏo½aï*|‹œ]ÒË* ˜¡$‘|"ûU¤Ò½U\©½ºbš [ ça:ì…ù^n x¢W=•*%Û×"Ï´ŽxPq Ý¢gÄØëv ¢û³g0àÇ=¡{¢Fl”s+s è¹Õ%¬Ù/‘¤¡jØP»ˆ™’xøQ5Ûej}@”dåz+ÞeUñ ÷È3½‘¡â]~J£§©,×Ãÿ|äXÄÚ?¤sßZñòEúŽn¸…ɱ“C ¶5R nGËŒ/ýc¥*e9ÞÜz41tÌÈL°þQÁG¬"Hý:-¯Ó%/½¾½ÿx}{EZ¥íÜÞ€Ž?ç¨i\i¡rX,Œ\:>'º¿z=Ü ¼B,E–ˆYM†ðS6é÷°eÌZ”ȧsøøi×7MjÎŽFîú´"β‡*o1Þ¾›]|¼9›š@µ”Áç¶ òÞ“žÛd~yïm"HŸí­ÃÁ"–ÁüT¡”3i±dŽÎó1Sà˜)B)úÒ …ëTIÖY@„4‹ŒÒ¼*µOëäµ£•˜·‚ÂW…9:Rô—]rŠ}JÑŽh¦˜jÎ[ÈÅ6pºv«!É.ˆ$yýyµ0*7”qÜílà‘ $rï/+|àCªt¿QòôÔîØ xȳé5Y1Sß º~©mœPà©Rû»ÖZÂä¤èáZ=8Þ%ltب!èº>·Ì쟇¢ÞÚØWÖìXÙ™SAL-ü†“£ÁÑØá-Y#®ú ¹*¯Òƒþ7Õð þÂI|†ðU*„å¨ÜÖD8‘j²½ËÙÏgï?^ÜÝœ]ßïÞ„.²Ø™VèM‹–¾#€á›9ðHX2_t°# îÁ2¥÷š•§ƒÉ‘¹³˜N‰X¢ž®œÝίïU‘\¨ÇC÷Çtzˆ§/”®ÒC#ÕéôãÅåüÜóá"]Ìs( mf?m”Ù'ÀKÞiPÕÇ(°¸‚U˜>¸ÂÐ1Œ4ô{+àþ‹(HiÃ<ã[¤G+[Ô¾„ ò>(]Q ¶çø^íÔÞ¡à„-£PéBl‘ØíìÓ(Ôp5<$o‚çžÊþÞ¹3Än’µµ]º[X ´1ŠOIr£™bíÚ[ jƒ"âèhœŽJ¶¼2Ë­9³ ç÷³Ë³›–d¡6Šô²ôVmÈ5À²nÄâý}äy2àÿh š€·p¾ï‡oînï>Ng×w³ëû_~Üóçf“ã–?ïýŽÈÑ 8`•cTO8¤Yy4˜:3.œ•‹ÞÅ™œâbS†ê$Ö “|"9‘1þ-v‡æÂdè=rUÎ*™ióPü d†~37§²‰©ÜD)z¦)0ÀŒ4ReêŠmÃ+ é,sßIM…£ÚùÀoëQ‚¸Û™#ˆñ†)¥„ÅJ‘Ò¥ú7`%ªƒ.%<”CR^AÁ `u;”z6˜Ž½ÝÙlvö ;œÉfW¨?ª/¡H¹EC¥ªœð¢A°•D(þ3lätÃ'kÃÀ Îå7”j„Œîe\ç‰æ–  ŸBç*àAÊ«˜é-TKÛ™¼áЈ¸é³­ àjÐ9øXp .£/öEsj@–QJx¿ æýЄ ]¼pDÞBp÷ì1‹B¤Žñv þ Sý (ë¥)å (x0Ǭ"”qCe™)ÈÑZ†n¢ëqî#ùò©«ØRDÿ-™Ý€}óþåºLâwmqÕ[(³Ù4‰LÐ@¾G¸ÜTœ6­"@Ê@« ÈÂeoW ¶„0ü¦ÈJ;«"«ò µ¤ôå<ƒzÂߘ=É ˜'tƒ*uÅþÞEÜqÓéKƒ~´9˜[$uÞº¯y–ÏË­q@BÈåB.u ²Ù§\ dîÔ“…À™©$/·f)¼bðàª}Úľþ4Ëû>º^æùÖ®dÒpºæ ¼ß.ú-”8 qs7[Zí™BÃ^çåƒÛ×èKw>ÐX­Í¦…Œ°øJF1ä(‹•" *%C·é qÑ`³FŒu¦¾Å€ K[w6«¦T]˵I õ:«àQ• À&ÖR}RâµU­,…XÆØΠɦ4 ûIMe|ìC;B[_³•I$n³\¦ª¡‹.3Ú¥ËV4 vxËòNmžºVOØžrM¢×Ôn‡Õ…žèžz–¹´wˆñTdlE“ÖØ#ê|;Ø÷rJÞd|Ú í-ùȘµýgªuÌMÜiÝÅmhŽ2™ •Žšµà4‹r5²Àfͬ~¿UßߥäÛo™ü¯¿µ% Û ¨KA>ôG ÐŠ –²Ûá’ÂPÊW¥Ä ÇöG.«·Û*6ô-*šì*QˆžH|÷ÿ©RÎÄ•ÕfpZºÊn'dÂÅôæ²Ð7˜ÄþŽBÑ ýŒW»é£ÚÂÅ«2ZÜ®6Ú{±ü÷N;2E²ºNh5¼}â¥B| lLAúlzÍ%{v uÎ/T¼m а7¨PQ/e 8QÙ"« µ”ÎÆb84¯NštFXLwî÷”¬ÜÁø …25g êÜ}*TÀ¥=¯Ì:¡œÄK±€;¨¢ÈE»œøò^-ËiQõûãU:t•8öY«ˆRhY“r%G’bå¢ÉùºSQ‚Û¢^ôÔ÷Éðª Ï1KƒøƒÊ¦Ì_²ˆŸDB·cO‚cPNfcm­ ëcÇä/Ç â&¤·Ç×ç’S§ V[ü.En -㟖ë£êòeúX¯…Guí3°¼JW²¡±ƒË0,î³Í{F8Ï‚ßÙ‘ƒ½…ÖíÑc³qü¿£RÓüüÜ»H]!iš°E–ΰuô¹A€ˆ‡ÉÛ^–×äªÓѰÈòç°Æl;k:¦¯ó<ÛŽýªõ"#“–ïøvõ×_Ýð &0ºYñkrËíŽÙ_¹TÄvšªÃ[fé já-^«8·Aå $É $ÀºJÊĦ Á×'ôm˰¼>çv·…áÞêj›’‹Ë5lûºä0È]5†Š€€-vMLY°®h^d‰ŒÒ½z9¥¤Y¥;ÒKÌäD)MÂì5ÙÕØ?©^K‚¿f*|Geõ™Ã!i)hÊ=6>y3®õv´Ó¢ÓÔ ­ ìÎC·`€8`õ÷vûaéK{i}­»W©íIz™šSÖz§‘®Å³·¢ÕD½J]J <ó‡ërŒØ¨ 'Ù¨9†£ái=bà?6j¼q¯n ï2_Чä|îéïþ¡0ޏÛIHyøSñ}Spà‚uë³¹*û{Ç/}AšvŸc·õø[£²;ÀÛêÔx?[¬Mƒ5< áp¦t~C‰”mÊÝ^~øx~Ó¬}eú9ò¾ýýòiÍr‹@Zê.åÀvñ)ygõ³{|rò¦ï¯5 Mex¶~2ý!¼¹Èжëì-ôJŸ€ßõ÷NdäüÏŽ6a/†·zi~Ež4ñݶ¼ù:Ý•¸ÿa70×UÛ…2Àž€[Õ”n MÕ•K*[S¥â—Q{Ðdßð8‹×Û22¥€.!È~©òï ”í•v¿yó†Kˆ+€Á;E÷–îÐÚ¬«ÙÚ<"Gÿvêã[‘m!‘+}PÛOPwÛ)ïÔMÞã\›¹ªžÖ0ªÒ÷Ài†}ŸÚÌsAµ¿Ø¹I݀𠎙/š¶„ÍàÏKF|IŽÁÔ”†‡Qaà®,ÞæœÝàB¹ö* ²ø*¨R8:Óü5³5•qu/ßÁs\¦áË¥6E6ÎMI觤íTmnÏCLµ¸ßNgwÓï¯ç÷­vÒýŽu.Šï†s\—ÚJa^ªœ€ìè“F–Uª`F¾ùÖÇ·†ùÜ,†x&³)cx6<£üT=·­{¶Ä­%lŽ[4Üdçê™DÓ÷ôš™FÔ¡ârªkD6ÃX®›«ëøT…|* Ù¸€¬ð¯èuÄàDìE÷ûw#Ù0JãÈ (G<ßdfÏÆ 8ž¦æg=@w•öÍuáùØÛ9yAJˆ¦ÞêCáýµ‡ÜÆÙ}†gZÏõÛ“>°i1V¸%ž4 «ÇLgïv…ÙâR&wöšïŒûhkzñÚVq,ØqƒiþMgî& háò±Å´ìë¯Ýé¯}+ðçhß^ür{vs}nº8í³´5Pàwìw©¸.ÑîØs3dÎuo$GvÎö˜f=†Á¯Ç,¼È`À÷š¹êé©2Öl¡³ý©¦MB–æJ>ã¾iM«` Eç1ådUiF ¨,1`„µŒx¾àAµ26»=¶Sn ÕœŸ'”f=x3 f}ˆÒ£‰Gù+_>äb~`{¶¬HÑÁ_Ö„¥Y±ày¨8–pH&Kÿ4¬üÄNM‹Ä²—?ëÏÐcà*‰\åó† +ØN WVA£7DÝ$ÀŒw5ñ¤FYEw3éo h-­‚)ìUSÅZe¡³_‰ªÑèjßrM¤¶ÀߪÐHƒ&HuQÊM[ÁÈJvè1’–.¾LA8¹6ë›®aß?Ù«6/µâlºácÓæ”z4gÚ ^³Ói¤éKn%ÁJCê'+6 % ÒM£:¦«HóåïÖoNzå±üÏ›bYP›¼UÚ;KÖøƒâÙŒÿã_E°ÄSÝêb0øo®Oœ|æ¬nwgN¼P« ^Ïky6•Ö$Óe¼õÇ…èjµ)v­)öí\ÎN8´³ÑÆ0Ò9|è\žq<[vEö»ÐôÙ¥î+"ì×Zàö6Ã!{Óê$­óªbÁ‡T{¬•ˆ¾a°£%YŠ;9šÌ`ât 9Ê®;R«3âg‚½×K™²«¨ÖŠ8ËS!´Û3E[k¼Û²ëÕsåö<²DÑÿcÒvÙ­‡ÈfÙqç|PÕÃb°¾lå˨Ï N¡v£7ãI­yŸ;¬f¥‘¨gÕÃðÅî€o{¨¶õ¸©@¾èîÌ7“uG¬qæËȨŒíõ7|ŒÃ®{jÈP›žªõ}RxÞÖÍ·V°Ùk:YÍßi¢ÁUvëoÕäfºc_Ü<Ùm Ë*Ô‹7§4¸‘ÂøÔ¬5dÌÓ«¸ê¦Î4}·Äº|ÊïtMU’»&Dqévt|ú‰ KÖ"f×·4ì´w]VöŠY FÝ!˜’ƒì†&‚¼·³¿þIéjö-Ò}ú³Û~’ÞvÌ-µð"tQ÷L@ÍOyÈãÔ.ŒxC´¦BG29ND …øÚNéc?šV EVƒ®ÞÝ]ü"T펨ÈrÀ6ÛL’ö-è:tc™¦ C*f4±ëÒÕOx ªPl 6”4Z¢‰çÁCßù$úÊÂÜ@¾>&O4ÒL‚ûn—ÓNäŸõ· šúæs£Áhl]ÇØ¸ö"s^[·üï#©'ðH]¿ùä×C¾ØLžh.2jî4þÛ;5ê¼Km]K´Ló ?`'…iº®p×` *MÒ¥æ/Ë~¡ç‘ÛÕ@‰\²ð¹I#Vcj¬?¤ŒàÏ™ 爄}ã÷‡ô溦ƭ,<`‡5¸F,V¥¡LËFkw03Í5¤¥-š|s-CW|äÉ•Ö_Jɺµ[1ÅÅvLþ’â=¥†e:yÓˆ÷³Ï¯t91Ï?áÒºK6÷ÿké9‡!Ã4×’¤ šë$øIë#Ü{µ²P @ÙôK®ª§hNæUõ­ZU[™r·á%B-.¦È+êâì†_(n1£kîãǹêÄ‚.tÉ‹¨bžÄ%Ͳ3´t˜n™¼Íp¢s‚îæUí)ü:V¾äl‘÷"OÑ3=[ßN}œK–2½òÉÕ…õ°~(¶ã2{ j–Í{xH÷mô•$ÆÙZÔ¯‰¢˜JM~‚GÞµÑCÕ6êI?»kš÷“¸eä ‹´}•î#K¯v8yñÚ-„~ÜQdÍ)Îzv•Ä¿äð¶ð®‘9¸IlyR¶aÉ_!Ð8ˆ¢ ‰´ÅáîWQ¼ªšh8N+pžªß5m{¬IFC\‹óšx¾Ð+©À°{=xNwUð >~½ç^õ‰ï}ãÁ?0Ä'þ þÁG=†/+ü¿Û±ï‚»5ÍÅ5°ùTkŽ-ÒsȬv0Ú°à=.‚¥UÜLÕ|?C2øªû}Òx¾n»¤n)Z«øð”Êsørñ¾ux4Ú@ÞZ¬˜†“.›3È = PÏÈZ¡îa$œœ»§£L‘=€¶‡Â¤MKMEñZÔª¡`eÔ„;Ö57Of×K¦Ã(|tÉÙm”¥!;Téxýà!8ýþë3˜UJƒCMÕ¶æêä_’P‘ÃS§mM¨vf’@ßÕ›ï.Zõ×G_r>Ø’Oè.¢P>w—PÙÎÓ@JHÔ“(ežÜ‡ö}hO? +|ð›tª0A5¾¦¿â ý0IÕ]xnHVùç(Í„› ”…™i™.†ÕBWE±]ž ÖJ\¸¯ëÍÆ›Ó“¹Œ]kÔ¿¼‰Ö:øý‹ÍíSS1¹µiž±“OX{~i sD“í¢+dÌT£ ùÖù¦çû–Ži¡ä›â9iˆ%…5àcGƒè bŠÜF9›ZxÛšV¨5t¬xO1 Ê´”!o,Í5OiíŸ #£<É+Ef¤Ta†(*‹½NŸ\”„µ™>S]ÚŠAÇ)\ºµ÷¦Ï>ùa{ aTx]*®Q˜r‡!\0¿àIEÙ¦–ƒ6'ËA“ÔžõÑ%îÿ­Í¼}5¡­µ¯ÅÍ3ò¡K%—©Z=R ³ÔHr¬£Éw3¸<[‘E †PÇýBU¤Qø·ŽSöøù2#þŸ¸³ø@³ÇÜÞÚÞ~ŒÿøÇü —Õ$¹¹wãã?nlmmoÂüo=ÝÜÙØÚ݆÷›O·Ÿî<Æ|ˆOõ/?ßïø¿·zöãùáÛw-¯ÚYñðÖ˜÷cCùmEŽF´¼µÐ1Æ»² 2y߬T*ZÊR÷-‡©·Wñ‹QoЩ¸`†êýTÄ6R-àùE÷uT8ªcèý öDwº‘ÝSwÕö—àûÄôÎ_ŸJ<ñ•Ìž·ŸQø¾O•%ºÓþ\«^kKK™¼éÎö{®Ý-¡Rï96%§'0éKþ­AUSQ™Ùº!!—ÿ¢²„ÀoH‘»Aß¿ƒ±WÙGœs¾[ïmâ½hQVß%zavð*´ç§È‹@ÞVÔ]1šeÈu$ˆÔ;9=i`¼-ô`¥°ÈI®èÐ+B*¤Å“@Ï4QŒ@ÖîéÂÏëŽq[•dÃ7‡Øº$lI=ñ·òâG/TIÍäs5©\OVE°|ÜN;#Q¦>_¶dxO½‚nÿ…w^b¤Œ=’Rmü@yÒsK ­¼ç‚u^*´©BÉEèyŸy½!¯ÌŒ×{Ò^‘õ.p1ìáýôO¬Ï«H¼ª‘g>j¦•H×4(ÉYöÅ~â’M´y~¹DY†´6ôBO/:7Ð=®xq¿Z®VYBˆ¸Ý(Ÿ ¥ /ó^TXÿÂÅì±PjnÞ¶Ìí ã&ÿwiÆ}MªûÍbÞÛóF½Õ8‡æ@Œyd8æ3æü‡E» tæþ,À¤óÎüÜùÿìÙîãùÿãü7æûž,€ÒÐ쟞´ÎO)N³áeÅ¢OúX†r®‰§º¤‹ V”ÊMú¬_vÐ¥Åç^ÕI¤¿ÑÜÀŠÔuzq81½©êR•WÈ=SXCÿOW{Ë›7ðõ ½¬‡j¦œUá:í±º¾X•Ù»©ƒçG”$£=Å¡”§ÈHƒQûNÂÜÓqzpÞŸ 0å÷ûñÇ”.q#C%ÜU1ä‹:÷ÅÙÞ‘Ñ#H]üL·¤8÷u²3‹ÀÎÊ]áX£:+ %&lc3~’‰uµødÌ<33Ý’Ì.ÌÈ»3oR EŽÂ ]Á¡öõ¡‚1¾±T$Dex ådr+YIÿ8™™´2ó;Ôè‘ÏDà)ºX |óeŸœ\`™çÑlOAC‘‘ôâ?ƒ þ/DüŸtþoïnoçÏÿ­ÍGùÿA>öùÿÄÿ& ‚F@é<Ã.{ Q@×zƒÜûz«¬‚“ÆK@õØè~-GXÌ¡[¡+€³6¸æ‹õÕͧ5Ž‹¶,ZË+ºž`=ªï ¢š©’±Žš"þßÒK g÷Hz÷ö^y=¿ŸŠ r¿zøðÂa.¿¡hjÔÐ7+FÔ`®?WOª‚Œ.ÂUðP©0±¶Ÿõ?aÑš·¶¶ö™O‡i©AQ‘š¬rA®ÃÛ\’ða3N€ì¡ãvFs§ÍíXØX*6ÖÅÒ4!x}f*°Æö®âýXÜ=ÖÐÕ4Xc¯y}ZLK!,C(â½Òó…z*twtãöùó>=€x}ÂËaÜ€(4-BõÓÏbHKÌß`Eܸ4qöˆ„ËÑ"oØ“ø¢vô“‡á󊟇<I`Ü`³¾>>Ò5«&V”ó_±è'Eœpõ ¼g´¤Þ’^ ™ØfÒ{^´Õ<%"UðŽ¿æq ÿ‡&á…(€&ð›[[[9þïÙæÎ³Gþï!>ÿgÎ÷¢@ä€gi€ FñÏ]|Á„¿úHH€^µxÕ†"(ÖDD L4ðœOxÕ²øs.<_úœôøÂ§’mÙK †ŠÐŸ²2ÇÕ{Îe4ÜÞ×_•—nñ²Ìu ¬ šLÑ<¥l§Ãl£¬åçøÄQÂÉ“ú×Áó\«ºEGcÜ– N&îÑ´˜ø—t¸ ®-îËŒ†Cù éø—W)¡Ñ—/–kt¼ˆ[G°,~O5LÃBþ› Ú†Ìý5}&Ðÿ‡°ÿo>bŸ“ÿw6¶éÿC|rôÿ („vñ$pªöÉT)Þyâ#)9pi2Dôž· O–kÄ {žaÆÜ# £~ ‹(3&P??[ÝÐ9`÷ƒTGvO¯á•£+³/*RÒ(vgø¨¤3Lô1¡3*btV8vÈ ¼¤»3!êÕê°yzÜðbO\ä¦ÀÚ©Wí"7ü¤¿¶¼‚õ ª”aŠ-/3œ¿z?ÝÒƒ[ùûöùó„Š£ŽŸUo½çÏIŠ!q%¡Žªw,A3µåçÏï@üYÁv‹„Lß‹H¢gläF=îXdÞ³ðÏ…^q!ê1dà–†¦æwÌQ«V7Æ£Rg¤8:S “øýÿ$öQÖ@ŒÐ¡ ]á¡ 8¤™À$$k²!Ø«é ‡j9ýOE°¹ûÓ˜Iô{³àÿµ¹óô‘þ?ÄGÓ9ßåäßAókêLˆ)¸)X¿îŠÖ"U£é²·ºªÃ{QÃè&Lbrj¢+áå(!/´uÙÛ´£QoPíõýKè˜Í)iRVø–å0‰1-ÈšÁeWqò<²“)á6]a‘Ä–VšëDÒš2§aÛU¸IZbñóÆÛÃfëüGW™—ÀYOMW%<\+•0­Tþöd“*FʯsœVøaÆê¬ü•Hðxmm®2æ^Fݰ‡è)ºê£¤EõÈþiû- %²§ƒ%QéŒRòýü­7Òïô3Žþ/Äùç¿&Ûÿ¶žü¶Ÿm=Òÿ‡ø˜ôÿËè~šÏ—Ë®z©MyÒ³Aê#‚äëqyDÄ™ŠlÃUX²÷òÑs„F$㜙 -GØR?XÏø\bgôˆu9Äb»–Sl¡UË'–3xI‡àcÙó·ça :sã&'©8Ö¹âgÛÓH Zdq <ß…fx»?ÓN|ŽE›kÐüL3ÇÁ•CL±ÔŒE)'΢‡¨$E‘\«3 ЗAòÈœí"lMáÕXŒ‡êÛ›Á4žèÞÍ,Jèùžß8Y¹'ì“-¼mÖa“ O;°ëš!ÛóÜÞ¥×2»qmi¢÷F0£1Ý®vŒe’ŠÀ*ó¯åmsËKJ=)/¦þÀ±¿Æ~æKßxNí1¯õìweÁùÉå_X´özU“æ‰w82£˜Úªê|E†«#ï^] X±&Ñ¿ žÈbyÍÑ«™U¯ z¤îc¬íµäò0ÀB¯øAN‹.èQW¼ Ïþo1Î_ÿ5ÿ÷t7Çÿí>ÝÜxäÿâcð_@÷›jÅo³ ôRYÎ^Êæ/7¿ð¶êa;&sth}æë\晿§}œé8µ/Éc5ФMü÷E–Mù†´7ä[¤Ê³çݬH¥t?êDH±<5FyóµDiÞC2¼8~¨é÷ž1<ƒõØ£?ÄehäìÎXüFq¤ði!JU@•Àc‚RÓÌݱt¢â¿'ëãðD‘MÕ qMé„?{Uò !·¹VÄl]¢Óy9NrÆ6Í£šÜøTOXA¼Ä>´“R¶ª W('j5Ço¨¹ì‚7‘8{G ?‘Q†±²=}¦Ž~5öË &Ž`pɯÆZ`Tš·Ÿj8&$ÐÞ~”ŸÛt¥3†Ìåì $8x|Q¶‰–¬=„P+<9q"ˆÕ‚GŸÆÆË¸Í ¬?ª†·’,“Ê2° VÄ«Œ²Ï®ðdr ËY‘‹—.Ã;ñ“mSìs“ÞX|Ÿ‚T¡Ä%goæã,(÷†›rpöã-ÜÒk‚U¬=ÜZydûþqðçúÁqc}Làÿ6¶ ÷ÿv6íÿóiåòévTàñi-#’ ü„AºMŽq ¥ÐftˆôÉU´/ÃvW*û˜þ!K1nå-MÂK ñÍms¸NÛ4D¶ ÉÕÖ7úÿ8öÞÒrï>&É››ÿŸíg›ûÿ!>¤šÍ[Öæ–Éð«3¯ãYt(Ú°IW”[Æòú&[]¨yéNì7œ–ÞŒÂa~ÃÌHG©î"Öãµ2Ti|uØ#$ÄÆ#yýCx€Â.,IAÆùœ¿ˆüÉ¡<^2ðìÔ˜“ÙCU¬9ÕÞêíspTšú÷¼ë‹¼ÝÉeJF¤À1”y(Ä«÷œ*µ¹¦°Pæ a‚MC+Æx\X¢;Jε¥-W&>Leý3¿¸ì{ájÃ…K"œ¨P4ïÚɶZ<ÌO‰èG¾¾ ˆõ{Þ9¥äh?˜;Ùv»®åb½Ào±@?MØ?RKo‰Ï²ÑtÔ@R\†G™9µ²äRD R4˜ º”²Ä ºÎ%3Ù¨õÃõgàßÉì˜ý¹9™½q”©¥"\hòW«;ZyWÕ[…,µFÜ]kl’Ùïô3†ÿ{ ý?ˆzyÿ¿Ý§þò1Ž›/ûMPç%\Ø\×À÷›¤4´|í¦¼&žçêP+èf‚ :-ëfꮸÒÍ­Ð ÕÂñÂÙDnÚ—âPʹU›OÇ“€¤–NF‡*%@ÕüÍÒ/ç|ñ©ÄÏéú¢Ž1Vãoÿ†=<, äª(²ÍÒÈÑñ½c«ná’¦ÍìyÍQ[c¤„Û¢‘âI‰àÑ H÷—Õ0•»Ù2·;˜ÜýY±f¡BFø$•þ€†OûOÍà÷hñc.ñêŠxÎó›Fð­ FàÂÓ²¬;uç?ýlqÊE¾»/ÞV`LjqùN­ØSŸÙ™ V‘¨0•ú$ŠíÉâ+S &H œp¤{ø­$ˆÏö%mu fq"°ª½ªZ]dK€R+ŸWÌ;ÂÔ^™VÁŒ³ )¼XR1Xš¹O¾4ï¢Aš2FOμåäÞû$l,´õöÄ—áe¢Í%¡Vá_øeݘ&“7,nPÑyÙ“p=îýžÉËÂÜD  ¼s‚×U›}±PM´$d!;øƒ1 ¶½¯å„Üõ~ŽªqQó~úßõCÄ¢àWz1Žôô@q\'T¥*Mx´D°’Xj"ZÅ¥°‚óêÄê8jB<8êR²F¯úÑ£è«B4ÉŠ{Q€T,!®Èò4=žXÀ긌r9™KV”Œ‚E·fX«báÊ•è•ÿA¡¢J~¹LêdéWÊ Fñ^ɯª¥F\8âÄű?ý\ó.\Ó- äÇ Ô0·ç•kÒ Š/Å‹rÔ%F ¯d0 å^3:"›ZTõþ-›¤hR:ÕÐ"ÆÖÚR&S‹ ‡¹X {ŠÒ²íÓO>6Wáisí,‰;Aš®ð ´‹[FØïñZ”òk ²*µÏ99rÛ§:f—Hð.‚è&q0Åi_!—fÌÿ‡$Ðyp“ˆ F0 ùN4L˜{¡C{äß‹…oÓ²/£™ ¹¯DHq"†&®Àã™RŽn6ëërá60¿’‡I>’ —W çœ*IçB¼?º•‘pbt•þEó¶t?J$SôµïŒƒ“O!òKõ鸗DŠäèB 3óÜtºÀ1ÒM‰j‹A¢ËôyÔbØ"ºŒà%Š"ËÝì‹2%›Aø?Ð2¢h3 †ÃC]~RYã÷ü’`=ä, ÀÔ¥O… #lxòÓÏÜðбòíæ¬%$žâV†üÜØ¬|V0}‘,“¹`bÄUy¸ˆ[AÓ‘kØ¢ytq-¤P•6ä'ÕíIJ´–7ô[ÝïÍÉ⡌5³T8' Õº êê ö²"I –»îÉãêч³ëdÕ°ê9RÇ‘Àœž'¦Kä¥cÐM…E<€qÉ™ïQãxï¡ÿ;;[|êúÞo¦ü[ðç1ÿÇ|ìù_¸ë}&úÿÐü›úß­g›öÿùÿO7LÌöwGœŠtvìı˜ˆãæ{+Ãen üAZ!'ÞQÊbÃ>ž¦¢(T £NÔE±§Ïƒ~'‰ù._$ Oäû7þèýw¾ú¿éÿC|ìùÁAŒ[èJ˜}þw` <ÎÿC|Êæs ®¡@¿€>Æžÿ››Ï6à:ÿwž¡ýwgûÑÿ÷A>}sxÔÀ€'?qè©Þ2úì#x¤Ã,¿ø™JŒ¢ðV– üÊæ*K„Q7 "Í N|?ézÇG­*™¨rù©YþÚlì·OO¼åC,»#Ò§,ƒœÏº!‚Ë[Ƽ¥7aðqÙzšÅÃU²Ã­v®üa$öë ÑcÐ~Úa¯dû!p?È÷àCÀ$o9Äãzë] Ã8 oW‘ÍY ¢Yö Ÿ’fU’¼Äé*²A«é]*kœ6×ÞÀ£æ]ê@〯9ß«a,+Ÿ5Îë­Ã‹ÃÓ2¸ò½0\¥Qê\Y–RÞËpÃÐæj·m7 M¼.V`æ _íE²B“žÜ"±´QãmÉR­óӷűH8-ö‡Ù°åûïOÏŠõ)¾™(Aêúñ7à>TÏ‹°‡F·‰;תðIa>Õbó˜ V–:Àë-…°’Ybÿ]ý¼l‚éq?7ô¬Øæ ŽâÕ›€ak*€½wêèVÃjÚ; Xʹ|Ñ<:Üo¸é…$ nð<¯vn2cEàuºÇd¤£vn]¼]¶4ìá} _Åq¦®â43–0ÌÕ;xâZÀŒi½èË®¥G.ËaÇBÂ[~æÆÃG ñGµ=¿çŸŽõÁj¯û _‡Fãû9ÀMÂÜn;ƒ'νÆûÒØnú±“š¤@wmd5áI)²,L•,D‹ÖÐ:Ì%ôÖû*[ÖC <Ê€%)6š· 9­Æ­bCÆú·Wµ± ÊÖ6ç·V˜â,É(6¤(ƒ‘”hœ)h¾BeoÉšÒsñT‡ „5¤|/–p ~ü¸)„qÔ–0R5öùÙ cC»ã`ñýε-ÓÕ÷¿»pëÚPºY-Hl(ç\ŒÛPÑòF¨˜ÔvœÁïq2ÙV‘Ør¨’8'>ƒ\âŸÛa¶JÑ”dtغxsTÛ,´úׯñYëGCeg Ç~„¿gü¦’Ÿ/zÉÕ<X;Ï¡•Uñ[ñ‰BÑǧëá–ó©`°r¯Úa„“Qx*Ç›ÒaþÙ]Vh–t?ùg¦–{GÚ¤Ü3¾<]èÎRPäÞ:†üKÿ8î%*òï•Z¬ð‚ùäâc÷ó “ÏñŒ|î)róÏ´¢ôMa9˜n×{¡…*å®kª¥r¯ävË=–z™Üc¾%SxZX‘¦ºøªˆr©½p<šŠ<ؚƹު6ÿ‚H®‡« ÌýªlJwç|®Ôö¥o]c2¯îw¬w¾Ë²Âj »’ÇŽ-E¦™üJ`Uþ©:1Ê^8šÊVçSRÙæß(ýlî©äÏðäηü[Ôl9ž™¤ÏœȽKÇmP©®Í?VËXŸýrRåÑ~~è>¢%¡6µÅ.­®±Ç Ýa™*Ð>ÈÉ’³U¦dÄi)[p;•‹‰©]tðt˜ÉCþÎeÖ`ª¢àR¢kÊ`²EnKŽ t²A¾Y2N¦ÖH„שJÎsY®¹+_˜Úʆ¡­Ì³+%:Mâ[t³Hš\*—¸;êê>F6µ~T÷ŠÊÏšŽŒX#a€ïJ„]ôÇê…AâÖ¢ª(z7èN,zá ²I¥Z˜W²kzS †K.±0ʯŸ¿ÖOößž³›ÍÏü;ž¹%¡ØQýuãˆKeí¾qV ¿ðþÚª¿>j¼p—¥E$?Q/ÔÆT³{ëESõÕ‰»ÁóK6–ýuÿôËäX¤9^ ÅNÃÈ›‡oOê­÷ç a]½ØÿвZ£õö×Ög¦Ç‹ö Þªão/ñ»0?âî·¼ƒÆ¾÷®ñÏÒ_¹Hàc@fý “æë7È ™æþ¡÷æðïmãÄküPßoaCýP?gþuÀ„Óëpø}“¾ýîQÐã+#Ý$öåÓóðòJ\ýöÃLTìø[+ÖØIÈâs”Ç Èx¿O¯ŽÑƒ¶þ<ô6”H^‹˜àÿøõ¯G­üJß±ä~2P”z/˜ Ó“8ˆìȾŸ¦ò±/Ò'ñàÈO.ƒÃ(Sš:€yƒ¸Ó¸ÒÿÏ®"yÛjH€ÿâªTè 脪o ?þÙ3ò€þD¶äû/zp²M($T–âÆ™ë%ì{n0‰´Â£H¤³#5ÚaÏÁ.º¡©äR•8côØуØ¿BœŠV2Š:¢¨‰\!ôÅo‹Â¸È`Ã;´¥ó ‹S9*„@NL*ßc@—éû7VÞ(Ü‹ar-¨–¿Y5G Þãq}#Þ“Ïÿ_~?L`,©ŒP€=ž+œgjȲÙøº½ÞŸÀ.dÞiÌînÃì³3ŒRؼß_4~8l5Ä—&zß„Ôê=o¶NÏÎ&y@2oüd&ÚÞO@ã#æOßÁmЉÅ"<ÅøÎ«à:ìótâÑ}:ʬúÐbþ‘hò0‚3ÚØ`86ñ^,;lÏÇB[ÁÎR‹èäqãKã7óœùÇA_lHþI j娑j‚Òæ…r4i&6kÜ {w¡*!öT(–L?ˆ.³+Þ±CÔ+覌êjw|x6}}8 å®9o¬ž'Bº2¸£¶ükCÞ`ü­í§êW‘Æ`(òÃ_”¢ÝžŸœv,/cðÜžì½?hhçŸäߎ–núÅ&Ý&É;v_ÍÓýï-%†å•úÁÆ™kAÍk·›\ôüAس«»/Pþ-ðäýÉŸíþw¿ó 8/Ù™¢GF™»û.fX Þný©ØË%ûFÈÊûù»Fã¬~tø¡¡ P ˜÷­†.u¾ÿáõû7F‘Æë÷oõÏÆùùé¹þy‚·XŒÊ÷Mxpp®žCstxbt‘ïÚ©·ŽëçßéßPámÃè§yr`A…h6´a|}~Z?د7[ú‘cìÖ@Ób—gAØÌá­£k?; V]JÓ$åÀ¶„7&¹2ÖÉ_Õ"Ë"éÕ(:ºJÀ1ô¼±ÿ¡‰_š“ƒ¦zrN)øÄÊÇÍSH²Ê•©~:C#Qµûò( iÄÂñ0͇£õ7Gè-[Î1õTsVGÃP6ÛdȶWAÔ‘'d_q<ÈÕø‰Œ9c­¡¦¦ö¨Ñlz¿¿‡vÞÛjœ›¬Pp‹Kü¯ög¨çíî_16PH¡`ük(èËAÈò.*qaÕ3*â/K3üÏ)†‹£/¯%•?ö³Î•%ßc¡ÒpŽ947ýüá 'ß?ß“ÅÇÛ8;m^ 9å¢ùcÓ¶LŽÑI —”¦rcÖÑyâþ|~Ø¡ë¢ñCcßÄY7LL&ÕÜ™´[¡á¡„®Ù )ìþƒ› †j3Q,9ù:LAZ¼VËÝú¡ËÈo°žÑ–"ή~pȨN²@ âÉ\ú"¸Þ½²¼©eJ´Wé–TúšÎ•|ˆ}ª)GQ*Tr>ÁeM t´-¼-?[בlT"ö#õµ®é?þ<e9QZÝî0,‹eü,`M¨ãúTäv¸Í?H tÔ£D,Ø,ñ;†b¹.ô‘Ä”|ŠùÈâë R‘Ieïç}ÝŠø*Ù9&³ýF©b‚°~¢ë‹µ¨4äÀ ôa¨§r¡qT6þÑ´°eãN2cXª'«h{* ˆbÖL ™ &+c/ ú]ÁAâ.dú€LšÍÀ((Ów`j¾ÌPZÁðäA… ´GJ5ûëð²|¢”‡0Ó³ iH69‹¹žãÑa³uqV?<7ýMÄ<5~ðˆäÔ†ÕÉSÿ+äi¹ñ )’Ï`ŠÄ³"s]ੱEQê›õÄw¨ ßJš–sL öµ,!öØ4úÉj%þí‘`óæPP*XÉp"ƒIôe~{¤V÷Ý¥Sü -e™g{ MDïŒÈœ³ˆm“6Ax+ ¬°»„sטƒŸÂ«ýäEaß{þüg×Ö“„Ô4(ö ¸’ÒH3p…„TëK.³ˆ q™¦~€¥3| ÌKW] w-GZßO³ö’àÆ8.‘²æ‘ X#I—¡ ýuʺäEÁþ*¥)¾µñ&Ìš¦uÓü®-W?˜¿¿‡v¬?èå3ƶ©ÞÏp¸ œaj³ ]ÁÜJû¥m±fJa^4­ŒÒr‰#WÜ1 ³žùŽ¡s4¨ŒŠdrÓã–CŽÞ Qœñ?ê¶ÅÌê#3g,5ÞÊæL3Ÿ5í°m¤Ÿè˜=D)»‚Mõ7?òÞm`ø¯>Lõ}$f^!>¶ 8ë ºø‰\-Òº˜ÅŠ'dÐ7àÖÕÎ4ø¹f`´¢IknÒv©Ø·r;_Å£Äü¤ÀÁv¬y£›ßì\º]§bvÍí:”Vøb¬­HÙ¿ò%Yï¯|óûÉh 7•*fí6(—vÂP|4,Ѩ2áe¨'iß&Lß&þPjË8 •À±n ¶Ï¾ùNÍ>€u*¶mGÈÃYl6ŸŽ:ÑÏ~”%}ñý]p«A’$ºø£f¨ñ`a5× ìªü~ýdÅû™²¦ø¤¼äùiëâàµöò-c "ŽoL¬’éШt§S¿k-T‡Ðh ‡ŠQl„7òÒ79çµ…t;$ó3ácèèD ClÏU.]Xûüt¿Ñ̽Q^±°èZ×w©Lþ[  Ðo#ÉËsº¼ÇiƒÓKýƒPSÔ•Jã¸EèV¨"ü“îê2…1J$q7žÐÝ’ßÃ7ûGÔà—PÖH…Rãk¿`ÇF~'í¡f»!B4L9Âsz|\?9¸@£`îòA^S¦V Ì6”Ô:¨4`ÏÏ<š¿ÃÐÔë0ê%ÄWCûf¨ñ°Oä·à&T*Þ,“YÒ»AŸµ/µ®Tѧe¨dÅÓ0ÆG×’5ü«.‹e]Kô,îçdS¥, SÔyÐ7h¯cQe*RÝb‡‡‘úÚŠOU!|p–Hêj”Ò6Iƒ8 ã¾$p²>*(^´Ÿ­áƒ›Ÿn·„=F¦æRÌäk.÷ƒËˆAËÖöü/? Zaún܈Ã5Š¡Ÿ3”Ÿœßa¼L¤­íwÙ5ˆ4kŒC?ê€Ö•g\qxV)¶Ð¿”ªÓ®°Z´zй û²©@·]Á¬‡¼¬ú±`ð¼uÍ­ÝJQ ÎÁ°¨ÝÝŠŠ‘~Ó/UH‘´ÞÀøF©dRâv(X¡Àï Õ{÷;ò[– ½»ERåfÂÉ–˜ˆb9€(ˆ)DÔàånÔ¦‚¤#,_ê”Vú/$&`?G&œôÜjOœĽ4GÕyT4#Žu$iwáÎGéjºÌYn&Xr¤"?¯AþS¶_‡ò;œÀ#ù5ì¶bµ’p»µâ·¡t˜4NöÀ¨<¼L”U$ÞkÐ~ª»’Íg¡ná2‰G"sÒÈÑë{QE¸_«ê‚çÊîLhÔ¨îR`Íz ÙodåSBE zc ò{˜ú¸Ns§í¹[>ùs¤9ÁéôH…©uô„é¥2#†ÉÇÛKõ}”&ÆóX~ÿh<¿5¾§#«‘ú.'¿ÇBÈÀvŒç·Æ÷F™[þž÷öj±•¢Ç¦k”oßœŠ¾Z)8yú»ˆôu_ÚoÚˆ{¾Òã=®´Ä´vŸ¬ ÁQ_ÝJšây#‰oA+îeîh.!¸íôÕór;µö¥µmÖãÈÇ<Æã9,[c©’Ä¥M¥ FàµhËp$ÉO³n,¸—^çJzõL’Ò²@yèveU&5"]y¤´.hÅH-x^‚L]²9ÝèTs{ pK\*†oø{fQ²/hìù(ÔsײQªðòÆ›ŽŠ¾1좔êL}I²@º Ij«F?å†ý®§v¨£ÇC1?}UȰã±OöÚ¹Òßd‡ªÖຠޕ¦ÇEmYÂÈ]b, „iú±;†Þ ©€c×ùº’^}¹ý®bU€Win‹¿Å#lLÇtÄMÙï€îî§Óìâ²ãO°‘0%Ó‘>Û.“Kó³…¢3¾ú$î¯Qʉ´Ò?qÌÌàÔvŸÊ4…„() Lu´¡Èoéû jÕxØêk©·Fº-ÐøÏXìP©ÅFÒaVÔj¼;m²VüÖ\Êt…QÞ‡Sj; “å(í’A•ˆôÊa2§é²u%—ùÏ©;±ô7 >üÒ’žDø#'òÚ¡9s×ç ¬‹ …iy O2…QÁÛÖ0S)gY5'—vým“Wƒªç8£F]b*Ïb%µÂapÚkê·ÔL]"¯íªD²eÍ4ß0;Ô_7%‡æA.ºö¯€êòlöGéÕ©†Õmpmգ΅xLPžH0T±¼®âŒ¼åEw·UWya¢„vëIÎXIcÀűÀÚ­Ötbì6ÕŒàCÜI/{©’±ø§7²EÜ~¯a}6Ds’棴e âaßv&”Úe`Ԭ߃ëó ï+Ÿè,¶ \×Û)€”)êv  &dýŒÖ ëTg”˜`YÛ gŽ€¦_†¿¦Õ9ŽWŽ¿0W¬r³”9ŠÈ»=æFH›#} §“¿9«?î°²g yA¨ç‡ý‘4Ø ÜIþ‚µe O¾Ÿ£E褨CÓ¥ë*p¥÷¼Ï¥ÚÁ»WÐú…Ÿ\B;ßÑøàO³~ܸx{~úþ ~Ðß‚¡È3]ñû‹úÉûï°/ù×hå{«©ùqÜ íŠIúü24__Ï[=«Ìq‰šCKLV̆þ(•nCɵjÐØ»Æ%² c,Z8}?qÜR¡òKM+…Y{f””h¢7SáFZ?ÚŪؚ™kx+”•1º4½Ó §uXÒY¸r‡g£Ñ@FDš’mÝ囜À‹$ñmn}ÑíSè] Q­Ó‹“Fý¼â2}}{xò¿á¶äoÿÓ8?ͯRêÿ‚né"V?ñ°0––ìüàlò·|UôOº(÷æôÞCµƒÆ9o)‡ï¾2kª•$‹ƒ—™Ä¥H^¸'lÓ[«¼íÛwzz$"aFñ= ¥çcr8¦‚œ›q$Î:c<ö8<–1>JÙC! $ìµ%¦N謰©€î£ ]«KÇY| ; ”WÐ]tS-餇ë?êÆSÒêv±_Ýl>ŽÁ\ÊbŽŸQfEc¶À.¿£í-‘qAWøHƒÕ¤à·JŸ´\OS×Ã}#\„èä@¦ïÔo-h­‚´]fÑÜp+³Ü¦94Œ¾fÌùøk¹T Ôãþ…ÒÂL«]™Iþ”N•ºÖÔ‰Û§â{ÂÚâܨ`ågƒvﲄdôB¿ë€(ñÐz F«ø ·@"‚u„ÔRJ•*àQŠMÐ0^¹"ѽŸ3R'’#Ò”‘äº%50æ„ͤèaßE«úpØ;ü´(õÈØ3„GzŒkä¼Ä!c‰ª€†%h,F•R~fü”i£Lå4[¬Õ:/¨ƒiâ«ï­ëÊÔì…cfñâÊ÷ÚøþAw‡oΫ8ºÄ5lÜ 7~ñÖuåÛŽ›1KÈŒÿäÊÙŒZœgµ?Œ¡¤Â»Þ¢£@ÞSI)ÌØLYå™!Ým¢NGø îÉ‚£TTªyÃ㠋ʇò6F•áK©ã@äû7%G=ðœb­áwlþNsïSã}¾ƒYŽWÄ‹„ýj4T.K¾º@‚¥¤0Ë'®‚Lƒmý#îvU]õí©úöL}û¶vkß=íJ(Œ?^ø&Û­´Aæ~gü(¸HÅEfÛK-î© ÷Éì«ñ>Ô.r±.5Œba®ŽŸ©i·Ê¥~7ñC-›o¬Ž þßj,õ#S¼ù¨à’ÅÍæ1IoEäΰ&@Ðú‰þÑQߣ¡’ªÂNõÕó~GK×Zr o5þ ÉA¢=÷€¡ê.ÚúÍ- -þÑ àþÐ{=‚ÙГ–*Ñ DEr :W±r<ì 9Ûx¡F‰?®ïE(gqŒü95ÌrQ«½>¥³0«rÑNçt'ÔTÁ1·©:hÿåéGjo»#¾"=B‰üÑ7Äê+Êd8L®ª€G›"èP{Kõ!¿lné¾Mnïòq0nŠ7mëÖŽjh{G|ùÖhQÁØ~Æ´¨½ó­ªñ컪T't\w‡KÍ Ü|`ý Ð-E1áí\ x Ñøé¶HÜÃí «ƒep™dsÝ|Bü‡‡’P3·|³î©éV¤cfÚÑ? Ýk.ˆˆÕ¬|޲®¬fFݯ‰fe¿CºvW”ÊðX³úÿ’Ö ÎxØYÞx¶·ê¨t¼.Ë3]2ÉX¢\J\E‚4Lï ˜:p8:DG•&¤t­ÿÇDæxýcKf¬*Ü ŒðÆ ÓvIºè²_Ë2¶Ñ×V¬cñ`™V¬®£“_óÆVm:É»,ÀÑvòF'Êmœ‚ÕÙÔ¢ÞÈ2°c!zC?¾d’¤Â8¨ ¿ŒbØKùˆ“Fb5+×Ôt¡`Æ»Xksš“í÷ë@Ž*óäe.SaÍqwm¡Š YŽá¯ïÎä;ç•úü*¤L¿*³Ùg÷̹yäùŒ¸†ýàŠ‹bF v9“s'û± ó…42„J>„3”JiJéÃT²ÄÚVV +‚ø.ã™hßX8•¿•qlÐö•ùéä³é¤è ˜[t\´n¹°ÈëðÒD¦â“™¥U vÖ´bgž›–‰Ðë¦#w@Á›37Háªi“27åçĈá:U‡Vgv?¥H¶\cIÊm”zÇýùñv—= ×RŒ +¹âM +}1¨Naà¼Ê¼2ùU«ø^S.#tœ6sŠÄ›:zˆS¤á!zãO¹J¿»Yµ¤F!Gºv ï(̲~0Íž‘™HÍz*²žY²Ir¶N­À©òKB:¯¢#«ùý¬¤s)º’9§L$H³Ïbã”v—2ꃸE4ñà¢*¾‚à•Uöaá±öÇà@±:à ֑ozÒÔžpË×Sy€—ï¬4gÆ*ÐÉaÔ3ø8ÁÙåÊÜnÎ2Û2Ÿä+Bûºö‰tãG<çiç,æ}ìç>¾¦ÞœÐO:Y’Ëeþ¸ššjPæ?!& ÈÇTîÎÂŒ(îìe,2ÿ©û”|¿ÒÕó½ð*VôÔ¨0÷Ìœ]âÅ,™› •Ÿå|Ç\è¤lg"ø=%=sl´iFª@¹7~çËý–8Àî¿} L¹Bf%©ßNÝ8®&\iÐ]¬ÁxÖ G6 ´ºü¼ëÁÚ´S!FƒÙ0óúºU”ÇfÙ9npkÓïô9øˆYªÈYš¹9]¥æ]:7ú"™¡[_*+ˆZ‰V²¤gÞ÷ZVb«—1êJ˜râÇoš7á-z£N(e°ÐÓÉœÂÙÏð„¾Ñ.ÆdÓ\sPJ©«âé‘Õ Ï–1HrŸËX—t+ÐqÍÀ?Í*ŠÏ´=hÅïßdvâÔ¦J¨êäfÙäãvŸÅCMÙèë0šf àÊŸºü=U±ð,^uŒÀÄYUNJP*æÎŠôY*™Jœ©y$E¾ÂbÌÇB߉#‰žtÞûô¿ß(5«4í ûj†“í-§aþÊÎ%cæ™)ô ›—m§C²Öö}ØÜY9•©¹((ʸ_ À-˜Ë×*ÔãÎÎÜj›•“žou™Dx¼LžwÔˆÉÀ÷¨s²$3œ€e‡)†Õ–ÁÀ10xå¯oÞŸ©S9zhƒöj/*¸×ŒI ÎyºØ.£ÎàfÖ¥A@±A®4•›‰ïPÅÑ)DÕqé¬3í0 þ\±d`¹£uvœMÂaRt†‰‘\‘A žhrLÏÏ9£ÿõøù·ý¤ƒ~ôÏÕ~Ø^?ˆ;ëûõVýèôí‚ûØ€ÏÓúûìéSú»±Å¿éëæÆmnn=ÝÜÙØÚ݆÷›Ûðó¿¼ÃáüŒÐÜóþkõÆ–ƒb½ñ%~—ŸÕUÏ÷0€pœøÉ×ñ3¼å„¡n¼ã£UXÞêj¥qÒ:lý¸´ôºâjÑ*üfa.-7Ä·µôrÐ_®ˆ´„Ÿåu¼†–®ÿó*Y‡Ó÷zý¦ëƒþ*´³ŽkNt·\y¤1¿Ñ'·ÿéÊãZ§w¹È>&ìÿÍÍÜþß ûÿ!>ôôœWþXŸ§g?ž¾}×òªo fÌk]^óøÈ‹{ÞÉß¼7A¿L¯Â!•T¢C­ŒøB5ùì jëPç(ly‘ôƒJ­AýJeŸIP A:–±Q?Í‚/b¸¥eü¶Î×ðÎ& hyõµŸ†)v¿ô©òÇ%]|#‹®ÃÒ¦EM¥Ö‹M¨•x×:>’ï1âÝûó# &?êúIwÐ_‹“KÑ"”À[ÑcJ„Q7¸]»Ê0~®T°í%ÕhÛ‘ôð.mºŒ]£²t– o,-=Û€zXm„O¬ÙJTKËCÿ2XËÄÏeYì{´ 2…’­Ó}»\w¬R•³$Ž{«G~+øJÆÃ£à&è7ºÓ³´ŒaC©ào½†?ólúÏ»x-½ZhD÷wwËéÿSäÿ¶·Ÿm=ÝÚü|}¤ÿñùãÖÛa´ž^1o]…©ÇY„ÅþÔË€úû×¢éíQØÇh!ôƦèž÷c<‚v>†ý¾A×ËbïÊ¿ ÈåÝï÷ñ ¶Ç‡ñƒèCËe׫ƒ>4¸:ÝAK”²Ã@}ï.%1{­RAgeÅ ¢[§·üÍU^öVéZˆ÷«£½ ¥ím%AàUW¼O¾"»÷ßèiö€N3ïÞj×ûo|î½@`…W6 ýÕ«âM3´²â¥}$c‹ ,¿ KõÞæJݪ+9Ò q òú7Ðt—#Èn±ÓÐìjíQsëÿ]Å?4ÊÿWÄKÜžU‘/ÂyË NÕ÷–Õ;1”ÞØqô¬A4ÒM¼‚™O¢)¿F'žÆO¥¢Üí>‡‘J½¾bD’,0öOOZç§GMÙªC•âº5ØoËŲ«ç·‡ÍÖù²ÞøH³än\f£Uì]:Ë«¼oꌲ°oTâA¿óÓ+øÔƒ~Wo¾[ÝÇXv¢yL~¶ }¤…¦ÉÁmÊfÑwis9‰VÉ­)ˆn\ƒ¤²ÍÝ,Œ Cò´ j~µyz®°-lFqâÄu½uz¬JfñÀ9ïêç«Çõ35W~\ÊÐUÓöÈr˜ÒÃUæ°…VІ,†7î`sºJÂþÃ=¢ŠV‘»p—m¶Vß` ã–.žf« ¨´Ægç§V…[à⺮ò§çæ2Ž“nÙ Æ’(Í(y8·ÇyýDõŽïÊÊèYJ(œ¢«\óìæ¾uÞPøJA>¾Ë€§qÿûûÆ{U’¢\¸J¡™fµ¸ªLsdÉÒjbçÍ {YàÎzQ¾ôë0‚åmoÓ£²ò‡-K—Î$@EX°´¸0i—Æ~Gùfà'+–”8!üxR?>Ü·!"u17YØ) ׊±¹p­”ì-Z¯æ$àr-ÃþûóÆEZ’ W *çÁeãv8-]’ßøáÌ øÁ­F.„í¼ÙP¸úI8ñ,Š7§xy‹•T/?ìgñs¹åÒì¯tܬ¥ñ(éÀU]kQ-K$¶€¨†÷ãá]^^eÞŸP›ò¢hž >zÀÌw†™Æc ãëb&×yÚ‹û8ʾÆ&ìÿ­­ÂþßÞÚÜ}Üÿñ I ƒ¬”d¬E­ˆçjyð㥥¥?d°{Ä[fxÖ vÁª,^‚ëµÁʸ^ ƸÄ1o üqPÌ)ŽÎ.S3Oö+ ×™ý…øÅ<|ù¥oË^‚äèx,xdg=Ú ¾ë½`éKÞ1ÿîzÉܺã”]¯,NÝñÅYÇc!¾:ÞHiÕùJI¦eoK±FoKq¦EØ’—%S˜èÊJLB’uKÞ¸/iÇ’JÏQ.yì\ˆ,x–bÔ’KK^)½#u”{¿ò{½ÄãGYãÞûüx^pì¿øAûïîîÎγíÝ-òÿÛÝø/owÁp8?ÿáç¿sþ¥Æ{A aöùßy¶»ý8ÿñ?ÿÂF°*ÍLwgícÿ¿ûlÇðÿÝ…÷[ l<òÿñ;×4KûÝÁé>]ÀÅqºï5l¶ÇøF» ž~Ò8ß[FIÔ;A eIvÙû±Q?ßCidÏó&æÂ†¿‡{Ë›kÆ{Tþ¶Þíízõ÷6Ÿ*•6-¬XÊX¦ŒJS²7Jêoêû ©ÔÀš/÷Öóµ×ÍêBýÈàˆ~ßk6õ£æé ouXœGi~”ä¡Ì/E¹WÖSJ'³`ÔuyDDÆç7Mï*H«þz¾Ê˳3ñ“p ckŸb˜ÇÝåï l ¢´q¦E(û÷\Lç2ê2^žžÕÿþ¾¼l¾E5€©t1ËޛãÆ^Þ4I ¨|ÖØ%\B^âºxõòðà•\9ãʈUvÞ•ðôÕ§ ºÁÐkÞs'P þ³£‘õ£WQð‘ª]ý¡ªóÙ[}åY½SyŒÓ8i½ROàH:mýh>ƒ&½O/ëço_a£/×ñÛg³Îº£ÍŽþ‰¹Öü0"#9.tgJƒea'ÅiÇNÞ5Îk¼u ¾âPy@A‚㕃Ã~êd}.I¦×fk^F±î(Rø§GÄ#$áNÁ¿g ÿ®ñkÑû|hT=ù’ÍŽ®f¹0–>ªŒÚEâ JKÌ]€¤Ró×<þ …cz-CfjaSAso|ÂàpJƒÿôx‚´ˆÐ!%Ì/±c†‡jMÂÏ8 ³»š·ÓοÂk a5 ¾ÊFçG)‚çÄ%ƒhaÀ±~+ ¬§Ó#ëŒT@LX~ÞéTÑ?óÄ@ÌËÌH•Õm¼Ò/±ÛgD ¹jα©CXù¡ÏµL°!{83Žý~ø¯€æWî#OÌ·CqÒ „a›i'ŒWuµÎÒ T˜£=i¾:GwJ:ѯEoB\ 5Ï:kž }“ <á½y< ¦£6@“»•€¢·r‹¼\WÐ_Ç)Â]UØú‰X¥+æ)^÷,ë6õªÖTËí>Ìø÷ÊŒs ´ÓœdÒcÃ/ 1©t{Æýí«/`ók&RÑ™ÊÆÉ½$¿5oàßyíЋ ´ØKºö‘ZÇ£LÔ D#i ž‘ù84ç(ùÁuƒžÄÿO'ÿ)]â\2ÆùïéÖ³g9ùþn>Êñ±ä?5Í_­è‡ÎbsI}Pñß_àk¢ñx*YБóàI¹„ÿÖÏëǯžø† ‡äü‰_8P&6R}âמ´WL‘09VJ…><øñŒu½|ÅYN ”ÇèP¨®ÌÀ,yêFŒOMHF 7ÍêôlÍ ´Y°«:§b-hþ£CcÜÎÿÏíGû߃|Lþ??Íú¹Sõ·$6¤‹í_+TÆ’xÍË ¹³Â€`§òŀyeúûÖ;Š‡Í·Rÿ_EÞ»5ï<ï0ÜUã¸~x´·üÏ«ä¯h­§ûK~†N_|mÊ%_^œÙEˆYZQ*™ü-Y%Ì4û˜ÎÌeò•¤ü‚’ÏþrñÌÊ«¸.xmßýJùùŽ)’’)±ì툥 c §Æïó3ý¿‡óÇM¤ÿÏ6·ŸÚôóÙÓíGýσ|,úÿuë~šsé}šÿþ:Ÿt:…OÓVö4ËÝ=^I;•TÜ(ûÜÔî!S–V’9y5fw–ÿuÍÈ€n9e?ñ•ß±T©°-J‰°e· ç•O‘Ý{0q\.úWr§ ¬}¶-¸3k¤å—˜#åö=“û²¾Ä íõÒCáþÌÞ]ša‰ï/nºAÏõ3š„ûN€†lÁs €œoˆ8¨`‹†ƒÀê”úÆ'¯>àkR÷&ƒe’{B»R_²™ÆÖ)L–…Óvi°Í‚÷³g:Í™Ù|êÊ4iÈrŸT½]ùp†µN ˆ‘R@Ẫ×þRóŽÒ<éxª?~)ñþÍŠCzâϱ۲¯`4)¦jûNùó»¡]»ê¼5—«Ôâ†ùdì8ï3Þ'<‡«¥þ9ñ"f<ƒäýC{’ÇÎ 'Ðç™F2÷_øÝ ïßÝš$ ÚP®‚Î5R.@Õ&ð  «\3®ÿ&x’)ðœ¢u¿Eb4}OBí‘gÅ?Ì FÿGUlû£ÚÝк‘~¬ÚÝ•óÙ•Ÿy8n—Ú›é–åKsm0ùƒ69ÍÁRë%› ~?™°ˆvSayK_`1ûk™Ð‰GS¿ÇÇ©ÿ‘ÁŸ»øOwŸ>ÆÿxˆÏøùWA¼ï¥œäÿ“ž×ÿí>}Œÿÿ b'rÓ<»L/lwQ*½Ý *¿][å·a©üTøy`´F)U~¯0ýÞ“eC|Aïçi%ž8Ì[çç7¯dox±€N3|è,qìÇî=cË€Øax³ß2 ¼MâQÔ}½\/øÀ• ³ÞeßàÊ~ý;}-äUæPSfpð¢iœd^ÏîüÃá´_#ùµ‚©dÒšç§ÞÇ ßÇ¿¸&¥DÖIú¯3Ó¦ä±äÐGJøY™ÓBªÉjH•1 \ik ³¶K§hF ~a}Ü7Bˆ>dR/T^»ÓüDð¼PÊâs'C·ÿɪ¬.õ]ó€÷†o˜Ï¾FH?J£šÄ]ÉpCS†8], -Û%±ÝR~~ XR,M(/ö¥²‰Ül¡ªæbªÕtÃFdAÔÂ&7”¯³é®SÅ+0%++È­‹{1ò¡«±­ñ(òVí·®æ·§l¾t§èÇ.æêpgÖáK0KÏvy»sƒ_zsÁbWT@¹×œt€,QÆÊ@ ôã =œOµDéA¢Û×ãMÊ‘{n,XQ|šÍw£Þs“{Üž¾ÇÜ2æöËúW¥§dg@rË{JˆTµiAÛ½h¹e?+Œª~9° ¿ü>ô=ỷþ_Oû;Ï€ÿ ?ùÿ‡øÿŸŸï Ž_›ùË·ÞkäüvœøYœ„è 4Â$^+è\Eq?¾ÄDrN70eছŽÈ`ÞÉM|” (+‹€Ìœò¥]Á`XO]®`r¤î.«Êߎxg,ð<%gkG;„å’&è)w ³KIg°\¡SXåù€’NÁŸT:¶ä_ 2–ߧ˸ßç¿8}9k–·W¾Ÿº÷Ë(ì\{Ytþ‹i·Ó~iÏ5++,f3ƒ3jB±µµõB±ÙÕŠ_æäݶ4 þ…&C«ê"Ü Må¤P®cöŒú·n>åÊ>=ë•‚nòx‡â‚”ÊÐJaê@ºé$A†nöÐ0jøx¢Ö¼Ã ªà+^دÖ3¼ÆDî/4\N“²ŽÜ[ì}¼ ;WónÔ‡íÏ­JÉ5oK †a?èÖ*†FQÝvÄqSïÂdËeQ<‹ ÞÓŠG©6ü¯±1³Òú à¹×aß„xOŠ˜L¥9&à_ûëŒçºA։驴áŽòZ㦘½¬y횇¹A[i?̲>Åøˆ“; wÑ%iÊ¡Å=ÉFCbd¯¿+,ΨtźÑï¦áøªòiÅ|JwÕ J:j›ˆ¼qM+4àŠ=àƒžo#…Y°ê²º^ÂÁ°¨Ôí5q m”VSÖKÐ~‹Òð& %'ùNÙ¨Tir)9³’ø[u¿ÂÆ«­cynˆPŸk<ÉÔ#ŸÔYÍÌšdkß9uÍv Ö7[tj¬ï+/ô¢©>gB'K9n±¯J—ñÚ]+TAMƒ¹Ÿ×8á‰é„d §L׌>ëéú$×Q<å –ù=¨âÄ(Š "•ŒJçbØIs‚7")ò2[Göo²5XÝ€tÕOÃ8ºó~±£ Ìå)ò·F‹‚bƒ:›šI‹0”¬óßË ëLDÖ[XóÑøùV­úùVÝ­ˆQëÞj"÷¶ @£TDQ6ßtüHÝv ü‘”;I³ ÓÒRòÀäP´gDs[?9Åc+ìU"I4=•Í­¸–ú;˜]ã2íW4¿iÉûæÜ¤t}2ŠÉÆã^I'Àg˜ÉÃÑœòÊ SŽõà Ð"Io±xZ)ô#CS¶2¨ ² 'Úoæ˜zÖŽ®¬(Åü„µõ¤½˜ÅÂã§YëϳV\YÑ5"90Þh¨Âç&I,µ÷‰Ð*6ðŒ¹£ñágM'ñI{OÏK¹VÕ œ´+ן@ϽáOÅŠ)®L{Åx‡8~I`*D`j‚õK0tFuqÄ ȯèÀÈ|%”ö¢DÜ–‡¤èúÊ-%Ù¾q‹ÞMçy8¦üŸŸïi5Š”Ò!-ø×)ýkÐgq42„r³ÞWx¹Z0T2_ª¥€…è,KažS"¥“*MãNH1zôE)Š;œŽœ%’¿ÀDòB<Ó™å]²™N`{ßhÞÁ<ôOš¯Ž?"ý 6q)¦'§/@‘TXƒs¬Êì÷^H¼¥ÓyMd/ä¦äâj<‚C~ôò 㻑l¶ŒE‹2…c”†aeÎá@“왎ý²Oúz´>Ñݘ¨ ïÓ ­ š§ï·dÌ¡$°"äTcõù«eÞsŽ–}j·¢ù›Á|‹®hi`Êø¸š÷ñ ¤0*®j?èÑFçlÝUÜ?Mˆ;”ÛFý¾É ¶Ñ&Ú n¡:¿RÎeå2«,œò,´çÞS2Ãau½·>õJ…:æÅ U•AÅé4g®l¤2Ê,T…’-Œõ^Adg"s¤8Jæ‡Ýc àŸ;/`"+ÖSeæÁ«øæÚ±d¦ý{0ŸX)ÕŠ‡1;Vè-àH{€µŠˆoÕ ;xÓRö[Í —.úh4p’ß0š#öÿh0ù…zQ&tÀ”•¿ýQ—Ƀÿ^.ÅŒãÿó™Ùçícÿÿt·hÿÛy´ÿ=ÈÇäÿsóÌh¾¬Ù87d£½¯YÆþ<@®ú¥,€ °õ ‹ª&;4ýVq°ÑÅP…[”W 0üƒÔ8¥lÄc.gÀb.û Ÿ‚j­ñ)a™8Y•Qí; qyEÁa.üZX“äÄÕ?^‹MéˆíXò§VÅ…Z2”æ©ú÷ß™8áú94lAm&Ì“\‡GFW´…yÃáš·õíêö"Âê@Ë•³$¾LüÁÛ;ò£Ë‘Ô–#õ«¸æ}$°™>‹ißaGÕ¥2lª–mŽƒÌÀ[ú\œuËÿXö–ÿü÷ßðßü÷ü÷3ü÷+üW…ÿVà¿oà¿?Ãÿw¹‚ÕðòIØ­£ZéÈcS¤àS“Ôñªˆ”g†±~:R\@ -°ð+tÊBߨ.Ã(¢Ü“=Ò¾F’ËÅ!LÕD€¶Ç|åµ\e?‚jP©o¤Üv‚aæýN.Bø?¢BI#íø N§Á/£ êzÛËV³htN‡~Gõûž]åî^tÕûÈ~l¯ŠÿbA…Á$vÉŽŸ$!Þg^FËìb™ßÖk¡Ûí–Î"™âNæcßnàAÙ5]³3~þƒµËµš÷Ðù|[¦oËúÛåI}_·²ç5º·†¨ÊuÑ9uXʯMØê˜ãµ|û:·rë³âŒª¬}«Ø¿‚$Æv:ÕSUêw©Þ~7ŠýÙ.Fúö|)Ø}uÜ}² ^†í<É6Î'Ò8Û¸(aÙÆùYiˆ€Ž‘T2Þ(ã0e/ÆJƒýÏcÈ›Ú8bç*¦u„ø˜TJu©mÞPç_Þ>N‹»â:n+{‚:Øž0Žÿgïj/ºç-€ üÿü?Ïÿoíl<òÿñ1ùÿÜ|OÍþÓjyœ¿néëbüwlÆ_N N¦âøEu]i!¬þá[bõ‰¯IÃñF¸–J#w¡ \Ì94 ž{—ýQ€v€,Zy%³[ò°óŽ„òlzóþd¿uzî½Ùoѹ#0gJ®³F‡,?CÊh! ¿x|`÷ž%ÍJ›ÄQ†¼`•G´‚´½Œf—ÃÙ0àäéX0œÈ2˜Œb³ôd1cÀk¸`yˆùøªÕQŸþLqþÓm­û°ã<ÝÈçÚØØ}<ÿâCÇVq¢g½pwv@ÖìÆÞÖý¾oܹKÄ+}ñ® %Vûp¶ç¯ß}ûp×ï6õí»ù¯ÛYú7—ól*ܳÒeÿ”5=¾× :ñhØÇ#V £¤çwÔé* ó2ù£«yt²®ÈSlE¥±\ÙmU•<á«Æ•5¯^Tœ¸äaFoÚAö1"}~’2EºeáI%µ+4¦»4Ä*)’ÙžêÍÍu@FÚIÂ6«örx`.CÕ!¸æV®NŽ ©¹}™‡ªC@’¬´¥yn‡RAjó,3M".‹ÁôõÃk€+~.µjŠ…¬ê1í57=cŒ½æÖŠÜÅš‘Žh.(k¤ ` [ÝT̹tûä…]3„"ÕÆ«ËÓMÛs˜WÉÚ¼¨¡SöÓçž8µ-ÜÓ­¡FÀ|¼'ÐÈR.n‡@h5ÓÞ±>L¯¼Å£ *ÃôÂ¥‹¸Ð¹Î_ÙÕ—¼qimPÁuBAj6Î^+G‚>J÷)ÞJ‘k€GÏ‹Kj*Lå°Xϯý4T9`Ûˆ¦*Â?“’y=ù•¼¡ìÅäÁiæÿd©a½’ù×b°fÁlóI{݈bÈy,;³rõ×H‚~‰­²¨y¦ÝU¦òæM[15è[éèòþõH}n „¦¡Ìk¨}êá ]M >¦ßuå½jN÷´ž¬néRßU¹Ÿ„ïj¡{^]ÌLºe9oBFµ ƒŸÃûÖÑpeØs¾¶Y\Ñôßé㎇Zt_óqen@Ó3lͳv½í][óBËA×£‹B ‰dÈ2î%ÃÕ«Ò«v*¬8púÆ4¾^©ãÄ5±JîÖvX‡"8êø1ãv¦·™-ÌBNZc€ˆÔöŽ¼Û³ ì0Ýè¶ß‡)»Z+¤¿ÑÃòûý»TŽN轕§—¸@ÇõÇ«¸¯2žÉqÀáUz-¬"L@úö}žÿ›‚ÿ¿Wî'üLŠÿßsü?^äÿàóŸÁ⟋ÍÑÐZ¥Q—té¼Hsé—ò’LQÊ‘@I¼žÊñRûK8^êëÔåÍö"Ç;í‰íxÉìâc*§ÿØÏôÿ‹ÇØ~Z°ÿìl?ÞÿxÃþ£æ{6ÿ¯¢ùç÷áø5Ç×Â]½òŠÓÿˈ1‹óW©yYxÃ˪9"=„åÅÖ¢RÅHŶ„¡ß•à¦ô8cN…ë”ÙJ|Æ85XÞ zÅ¿Äe¸á?Ák‚ZŒ£„uý*_‰{yKTliVxK8U@B+¬’$˜Š\*(A˜MˆŸÐÌgý¾wà„¦Î)=Eø+€‚A)éX¡SŠŠJ9¡÷™)“0Éßg¢bk¬ÖÐI¦)ÓQÅÒû@5üö³û¨á1PÃW¨A$h›–‚»b*3EuðÃ:,8¬Ãï;(Ã~ÆÉÿ‚%¹wè òÿöîf^þúlãQÿû SþçùžWþ_mþxÒªÿ`¨Œö¾j5€á°>[ëæÒï:„ËwÝeyT‘]'´¥}v3%rî BÞ‰/£ð_¤O¨ä¤ýq$LôŽ»ÊÀ ϾÊÀÏ\:̈»ïGÀN¡¤:¶Ä>ó–c?÷á”ÆŒ>‡¯NÏ.š–fk¾ÇÔ”Jéð]p·'Ý‹ëàN¤Œeñ Ïø—뺜l?ï?Zša웼ÔIó¦¢ôηõ~¦ßéÜÞºÀ>L­?¡Ìa¬ 02ÌLr1Š&!þå•¿’«uJOK!kfœ‹Çùò¬?JK_ŸÚ䌮bNÖÒ ôI ¦*ˆoäå^½Æûg¹g¨«¦nR@¿Û=÷£KV Þ°7ñ‡nü—À7]”шБÊMõmkr¬hED ¡¶ì»ŸÄÜÊF‘œÉf¥ƒfaS‘ñà(ùÐïãxÓ13ÝÀE;7dÔ·A4lû‚ÕCúû¹Ö?õÇÉÿ©‡ Iÿ19ÿÇv!ÿÇÆÎÓGþï!>Ä3äæ{–ôÓ§ýІ rƒ~FÄIY. Ʊüþ¿aâÍÝÒÄ‚Ærû -?ºü>>NúO«cq}Ì‘ÿcãÙöcþ‡ø”Ï?Q‡ ºùâúŸ§››yýÏÓÝgçÿC|èüwÌ÷ìªTм 0nBz’.O7ñ÷Ù„ŒÀÏìŒÀ»––æýÉᓳ¹kÈZ.‡ ÃCfèEDœùÙ•NÏ[L»Kx€¨0Y¹‚Ðt7‚äá¯/üïÿFþ Ø#¥ÿ“'/0 H>úßÿÝ{òÄAºqÀ–v[FV]«œœ¶Ͻv(Ü·¯(ngò$µAÿê¦ŠÍ R§N~Ìq"/“VàýUà½p ®ÂxRéŽ6 RÞw2¯\ù7aŒ¡Ctîæ+º¯6ÝVl£½çuÃ^£28@¥‰Ô&Á†0°zõE£È™]'§ݰ&èô¬þ÷÷WEœq¡Ÿ«ð³L¿ ²7&´kÛÄÄŠŠ‚¸ø=g´=Ý ã¯Ò—ëø‡åðW}þ5QÏy§°1D8¿Ã„×ÐâGw519ÂÊ H7lÁìÄÈl³C]ï¹} /Ëø¸Rô˜Sõ‹°õYck4Q×Þ'B vnáIto=ø÷ç{b¯ˆ4º'ã«AS©™ƒø&˜euå•lÓ…”5»Yìò†’êÐ~ÆkzÏ€¿ÛmÅ_²‡E"Ú40@ÆÌñ×ÐÓ§ïwä…¬[€¿Ë h :Ašâm±éq%z@Ta€Óû"F4Lj¨®0&æß.Er>y‹@{kÝ›¸â¤›s>ÿØäÄ¡+€5Ót¿Èo÷i÷Ÿ ËÕû%>øÿ{ßýÁÏþãÙ³<ÿÿì鯣ÿ÷ƒ|ˆÿwLõ qëe¿;é¯yù ˜¼£™¾;‡°5ïAô~B$yIFŠ24òR}Ÿã ’YA§ùÍ)á¤ìæÐÏÑ«!È4îK>ö?V¼·`’üïÈÿ±±ýÿ÷A>zÿë©þ:eÿ³zëÝÂ?V›AúGÞ¤\ø'l5c‰.ƒ(Hü¾NeÃ~΂ÛL Ï)½žñ6œ(¾"̦üŠ¿Ç^gÀ¹»@ÖÐà«§èäÁHËa°—ª…yØ/lì^Ì%´aòT4Õ.ÞkJ>Sà`=~Yð‹AÜ Èñ¢²C‡–ssÚ\{ƒ.öwé²+ý=¶»+xõu½yØÄÅÿJY³Z£v´×†Ùó$¿´wA7ß ”Ÿ4_½¹8o¼}T?/kþx|txò]ñùé~ñáþ»b¯¾+€_æ7sãm¡7n—y§à¼ñ¢ÖÈyÒ ÂÞü Ùø†}§ÈwÑ ¸ñNsü¤SS‰h‘Ð)Ð…g9HÖKçCÕ|‚ êô+@X:/ÆN{-Ø4´©íôÅWàFa/ûí0*àšw!. ¯÷\š_+vÓÉèýª%}÷ÇÍÿ£áq}Ìcÿ}ºûhÿ}ˆOùüûIâß­þ’ÆIvÏÐä¿­­§yùòß|H¢qMõ´Îÿu¬û÷&TÕ q¯r£Ôæ×t@˜[–€i b†hÐf½bDhKĤ z%ÒÅ:€vzQ??¯ÿ¸® O›?o™¯Ì§Ž …†ÞÉ)J 9€Kúâ£ðÇ«„Ñ*Z60Ü!ÛŽ1ùLì N†Wa‡Hfâ÷/ã$Ì®1Rº¬ˆÈa¾—0þ×MÈDz¿ŒÂÎ5¶ìuGt#îokÞk€¤ÜÑ|°æwûI|W‘±ÈÚü¿ÿËiwÎæááP¼7øÚ“' §¯7ã^öÑO‚Õ34«‡ ‚M6n‡P ss¬×¼­íêææJ ·k”weskç/«@…v×hô“KöVL¯âQ¿‹ û²«0ŠŒ»laFŠØ¨¢rUbjâÞD‚—·JøÐÇ‘2é €Ñ¥:Î]¸ÀU–ŽÚ"Ô!ãû¬ø{4ìúÞðfˆOâŒo]Ð5=1mznÄ%R d$J"t›‹ƒÕ‡°Ä×ǯÝWz•û#Äa¬ZX¿1¨¿ºÏTçÿ—Íÿ°¹»S°ÿl?žÿóÉŸÿóþòèÿ}žú³]ûÓõ\—þЧ¾ó ¬Ù}” õtñ·r—Íz”ãþÝÌQ>ëÁXÐÞk¤ëƒÑfÁ~Ò~ñ3‰þ/€üO”ÿv¶ ö¿­Çûßó1èÿä·À*nß%ùWx6³¢±ñ§²+z­Ó³CëÔXàÑÀ¬¹<\y*³§ÁI(^^»šòlpdÓý9¯g¯Ù˜©×K¹5þ­Ÿ×_=ñÉr‡½—(®`ÒVcšìo< 0³úÊ£ÄÚ2[6 Wó¦ §3o´†"Ü ´81Ú Ö×ê©U‘ܹãhµ`€½”°àÂQkÚ#TgÝ yiÞ1W–ƒöhÐ¥A/ +ÛÞl†»™ŒÄ19`iÎ>ð‡*f¥ {*éR»m‡tc¤0Ù˜ÞÑ‹?¡¡ŽÚ í1Ü{ŒWÁÁCþcÎb–¦h~ïÙ”àŽfµâ¶ôDç2I lµ’^ùŒ†›úƒ .t•ú†Ú[™Ÿ½-Š 6¾Š]ãO»¦ &ÃI;‡»)æßñf_ù[òI SºJ·äq8 Ü×-èTæGÙjÎtÓŽÉ\àD‘™±%Z\²DS©¥©ñ…òe˜ü&à1ú^3qgTÊql(f]?¸¥Ì?ÌÖó² O±È± Aƒ×^®7Ž_Ms†0M)TN{wÖ'J £eìÉÛt²P°ø2N°J“ÚÌ‚!F ¨wýAú„¿T‘Úºôª¥AZáuGá„Éq“îs£¢ÌïûQ'Xsä$7P³ŒBÁúwë2Ž#Ìß kÏ+·í LK2Ñj”²ä ýƒ7Pf À©ÇÜÇ(Æw2Æ\*˱öOòt&Te*¿åÚí8£ó‚åä9Bž ’3d8-:©Ô+^ÇGÙA±c¯ˆÌ:“\|Ä8ÑkÿÁZ±ÿœÏÄó¶Ú—?ÿ7 çÿîãý¿ù˜ç¿9Õ³ÿÍ +œÿ¢µßÁùÏÐÏ|þSµûœÿt‚Û'=·™g ôÓ<÷0ýùoC[vþä}ùóÇý›œÿîãŸ0³Ìš9.s9 €Ñǰ~·›KÍL@d%@JÉ·TñJÙ¹¨ÉZÀÙoÀöxüÿ‡Æÿûðáûÿ›Ï¶Šñ?ðJÐãùÿqþ[S=ýÙŸ‘Š>ø3yëã+òýáƒÿ/¹s_@>“IQÖšàõ©ŒmXáC€Çíºx<õ%iAàx^EyûÐiÐAs»ðð‘÷?JkÊI…Ù€`ÒHøp‰÷"Ô™W÷6¼êæ •ÑÖÊA±’ÌÒ„¡žßOƒu¯ŠßQ˾¾‚²Ò! ¸‹þñi !ÂØƒí BŽ¦Ð¦âÒ“ç}ºæƒ6zw_+ó¯­x÷PñŽjèšWáh…œfàöCÀS FäÞYÓ‡tX”~@íYç+ "VmW¨íx$ìG²æFÔy©æR¹kW+B¿àj`Ó PÁ˜R¯e´éL!ç×ié|}Øâµ"Ìð{•~»ßæýAãÕ\79Dv* ĪÑq ÒW8î'ñÀ•¦Q»wAÁóúa³Ñ|…ŒØ o9ÐFY`†õ7>œU³ß6VMk4唨©¾²£¢[Šá¨+B*Ûó¦|cȲ¬ó‡&€àÖïp<œÛׯ„r¸x_ÈTÚ3ZÛ×Ù6Vÿ«{µGK»¾úF,æ~ü³h½ÁM~ë㪬™ оÕèXÞô{ß.{{Í›ð?üÀõ5¯úšX×ÌŠ†‹ó†¥e‚ÐäÁÙt½'aƒ”fC?EA„ãŇ—W§FÃèlL ‘X mµý —­­˜-µè)^—R†Mš6XÚL®v¾©¦á¿9c+ëfÏý9çyÖ#â$5sŠüƒº9VÉøÓ,”9 àr s¡Î²¢®á/`/5GmÙ†Ù슪H4ò/ivìO¶:¶L–˜6٘Ο(gO±/¨_ŸœÖN:GöaJç›G ³ušW Œf]è)9‚DÞÅ ½¤%ü·Ih25 §ln/ƒìµ˜^å‘)'xæéÍÈÎS"Õªµw9|°åØZ6VË-Bv1~SŒ5ˆPwR\ÏL,;_'ïee‡~“ü¯€ò.t»Ì¨˜½“Ä|›ÉE+“^ùÀoô³ˆ-"p§ aú?д…†¹Ü$¸ù}oÉû o¤r:Ešl<=`ÂË@‡AQwƒ½x"H £E@˜×‹ým>DÓã] A:\Ж`ÂD6ñ£ÊŪ›ST-§›xÈ%; D•!ÂK¢³I²ï¼')Ò¨Í't$3éä…Lé=µ¶µÔ” 6M?FÖ'Õ×d4Ud‡wùp0/Dšg¦Ì4SKDŒU·ä?\g]ºb‘V- ú;¿w·XœBø:…ÇËIi‚È>Ærz-'$ò@²gÅJ þÜâðNfÇŽó¾ü³-›ŠèF\˜‰½ÃT\Ãs®ÚöáU"âCÛŒÍa®SæcucW°BLPÅv8Æ©²í?ÃïVã‡Ö+Ä0*€¸ÔËuñóå:¿Ö½¬›kûž"³„bг<ù '?YìäÃ\–M×À¿­nÔf*oUÁ³ÎFDV¦Úë‡v#wÕ¢?oÖÖÖÖæéjs=·mh¯»?½=oÔ[óÆß_̾k6á3;Â5/0·QzI’øçR2®.J¥Âžßý仜ÁÛžPQ\Áᄃ›Ç3±žkås£ÔÈÃB®tÝàV6gN®ÈqC\ž²¤]¬Y|ŸËÒÌÀ308'µ°†­”½¤ÎíÁå³Á¹·*´ÈÄA*­}œ˜ Êý÷}6˜Ø»Å­‹•³”ØÌD~“¦ýBÒ “MScúKtÇ-¼¬ ÍÄÚ®e{šxUs‚I=½b²…äý™;ŒíëÍV/xB3°ö07:Á$6'È¢:å°šo¢n6 Ǻë’ÉÓ*k>æšÝÖô_º7iQcó™lÒ%É6ß¿æS`ž®à‹ª^¦ÑgTIêkh^Ë%>¯ôEa¥ã!Údf×Ús÷FBág¸³OæH†AÒ‹“ëR ®ø_#×€ÆZѰTcõ Soz"¢Õ”EÓt4@ý«ÌÄ5Ôx’ØÓ˜CÓ±Ùˆµƒ ²D#^vvšT|x†TUÐ4ò‘¨AF¬)8¹+•ÖaãU æ®ø²qÃhIئ_° Ì9´â³J MbHzPrìú5³K6ž‘ ] V‡Ý&CU’À˜¿Àd2Á§´¼Jyà“Ó“ [¶ŠÌ¸ùu1©ËÏ´­aÏû3Îÿí§Vþ'>ÿŸ=æxôöTOË ¡üØÊã_6òzþlÚÉ$$à39þˆJ3þ'}ÙÞÆ¦¦óî)vªCŒ`¾TyùÝU4/U(t+ùPt´ÐK"}î< ¢yö‰9=«ÿý}ãUÑ;fÿ]ý£Í ßü¹ ?]ç¯+…BsÀ•׃kØŸºAÏõ3ï¹÷įáÑ×¥D Ͻªp áFhLý,ÒYíÏrR«ž½Ot0ˆ¾å9-;_ÿ<é°’ox#¨¯*×£ËÍ ‡5·ôžb¼x¸PÕà&Hî²+Q£½3$šØAËh¡9 :aõ«5RëÀÒí¬³ÝTÃ'ó#Vk7+ü>2Úa;|”߬²Éˆ¾A ¬ˆÄ £é2@—Œ®tR¹äTž‹5BU,ÏÈ™wp›áäƒ<Üì[âæÁÃ:¡‚N.vwÂ3&Ù'ÁÀ˜v*Qæg‚¾–ã5D·^Ês¡#ëQãƒý¢@!ßàoäoÌ`ž©rÙÎñ‡ûW ncà¦Àï¼9fßÔ¦d¼„CüdE³ZæláThz3KÜÐë.uŠóƒ;ÐC©*7²iÕ‚ykß8cŸ@\gàUÙmb-µ«°6•×5‘¯EVÎÿuï"vpbþç¼þçÙÓÇøÿó!>Ï1ÕÓ2\•tZd5øµ+„rC˜A+dל&ð4±ÿTa~zðãIýøp|d@[cT—ð–öÚÍ_V|Œ‰][H[ÇfwÔ „'W>ã4k1á*“tEܾ렣ݵºâbú(’qy…LQ#eƒ¯.¯Ï§š‚ª.D5v{a³ ÈòÃ^”¼ýµ}Êé/ìÅ‘ÿqsãûœü¿±õì‘þ?ćH¼žêiÉþ¨!‰=Öþª„~‘íyÇ¢òñL?Ö˜EÜ_ÿû(Ó ö¹¶ÍÍVŒP;4:Fý;A¾2"©A(>¥´ß¦hß1ºšrh½Î z.Ö:•iHÐ_'¤ôŒ¤J`>èQ6Æ”îUPª$o@N ë,¿uþE÷Žá÷Uàw×ÍÔhå7sÎK9oßœ •~VÝ€«ÑQ´ñÃÉ«†²Ì»n0Ìî„<¢™Eæ ¦)0Ü;å©,÷_n亇35ÅrO/œÙƒYÖ#[*õþäEA¦ ´Ê9=7Z¹Q!¿ÒŽ2«_7²8Êò,¢KŠP«d~ØW^ÐSÙ8ÅrÏÍ=äñ.0´ê×Å‚œÝ×E0ûŒÂ qošƒô†ý¿I‚F"çžzí÷2#¡§Û ãÄ ¾Á»PÂùˆ $·`È÷ê§³7Ó£ˆÍù†_ÅæX¹×ZãÖ K­7÷RS¦Iߤq ž´]™4Σ!="‡IÐŃ@γp+3Ó"Š9³Ó¡+«i¼€Onʽùp*s Yé[¾Ìâ¥Å³ˆ•[#}d<ÊP]ª ­v.¾ÐÚäO V‡Ap]Àê¼&ell1[=Ä[^€<æ_h㤼R`®Å9Ì•¥£ìBf£#Œf¿~eºψŠhD÷†zwDz¹xõÌ×Ek”4wdg 'ØÁàË#kDvQ\sÝ:“ÍÍ5p×pñ;“(¾Næ¸æ0ãˆáH•4Y„1éðÜaE YIû¦<±Ïb¿+§Ùˆ8èKb´R@Ϭw?0›ÓÂßóªj{aYÈ §ŽÜ@é“v¡OÚóq¨fŸ§%§läaåDiÛâ‡õ!6':{q¿Û÷ª½È«ÞÔ~Yñö^Iî°úKíŽ~æ««TÇ™Ãýôȧž "‰~ù§03OÅšú ÁÚ¹ý-žu—žŽƒ½5Ï®ûNZÈîßä‹ã7ùòø%‘Aàq½8ü&Óá÷ž†¤rý_˜!;¼ÿïîöÓí\üŸ§»;ñäCº>kª§Ur%©m|UŠ@gÎG ÷Lº@QÉ¥,Ñðkh%ßÇUIJNœ)©ä*ìîIa¯åP—‰f³C¾Þj¥™øUFÅ|™,ëiÐ –©ï¢à—¹Ê#`³©w'ÊŸ¨e‹nâë2P·†¼-¬5¤$¤£8™ÓtXŽ£ìûÊ—YøÆ„˜t‡. ôÄy~škE]^×`Í;:£$á?äT;îphéy½wãíOªðhus˜#ïfÅYgƒjÜ”Ñü1Då¹î‘iù:ìå9?Âø4·Ë‚!0›Ì°G¶R ~-ë“A¼ÇòLqׇ}?‘>Q¡¤ŒAíÈ”_½9) 3• }òh"í¾Z‚ä–L¹Ê†¸¸;#謆¿%èMϘüq«*—ñß!ðÛÈWÃ?oÖzôøo\—ÕZˆòß,Ì`R>ÝF`Ó#è·›|åxßS>EH?¤®0Íâ¡ò1Š:ë+Ó. u: bÎñš%qß‹o(ê Ð?ºä¸·i “í¿"sý—ÛÅ7åSdf2ƒì¡Œª†Ãùì¬/ºg½ú3<5^W{¢†_:óü¹ò9‡ðGrÔ׋ê*â ëd~ÒM¨ˆ· ËâR‚Ѳ ƒÙ 4Wì{¦N¼aœ†vÓ¹‹äºK½¦f6¢/ªÿ­Ó³uoì%:ùQœ3V1–›k.6ÄL(lOCÐ罄¨"´ÆlNC­*|ÑÀ§Ct-©8ÌaÛUS í–Meùzy¼j:í§\þƒg«˜‡û‹ßÿØ}ºµUÿžn>Êñ!AÏžêiÀ£°ý# P6òÛI€›e® O-PÂ=“(*¹@Ä[vü¾'\?^xÀ·Å™f}ÝáGaV9‘XO™¤²SÆ‹ûèvÓ*Xõ×ó ” ¢EÈÍ4µj# °Ùânˆ‘âãS!òA(ɲäJq"Ãvâ'wk•zMq—Wx7!Œ0ë0‰Jð¥*Á–ˆÒ5•®ä&4¢ªj¼Y7|•®žšlßá.àµGa?ÃK¯@ø¥ŽNe‡è$Ï{ŒPGQ ¢ Û˜Up~ßGÊ3&èš‚ ôÚëû—\ñ.`|LÂ, "Œ?SñùêÃ! 'MÃv?0ê×8Z{ríu|­€±ç¦è¢ãÅ`Μ’¾À€SÒ?:|}ǵõá'žÞN_¬Á鈱²HŽñµ.VAdzâ$C;ŽnËë+Ê© {Ö8¹g·ÄÐâ ’$NJû;‰³7è^:[“E›? ãQ*¯ö€* .üžn. âî¨xÏÅ­íãç ½T¿>•^ÜLYžw›WzaÅ•'Z¹9Äò;€;îâS2Φ>ó8$êa¢®Ÿta¿§©ÒêÄülÍËEÉÕÀjv[Œ„9K±¿ÄåšÈèx›JžfIJPD;t9×1`p˜ê ¼Ñ~MÙC!JF,ý òª²„ûì²F<ÖI£AÇÇÃèT?îX‘Š¡Ø6ƒÒÜ ¦"—Æ'LLb¬µô.Åû[ú({vᡌ~úyæÅ#š'É’é8 :q"ñ€ˆ±†ÞF ƒLËfërOèé†-/—<‹yx ¯…`[^³âÕ˜ŽÚüZÂ#DäKÆè’HQŽ¡(¬Îõ“¿I(^°Ö IÃã}&¹‰nÞ!¦•ïMC&ëšͲ¾qÒ¦#¢¹¤=R¥8ðÿ)"šIZ4#x"ú~ R óÓ4î„”'DEô…õ™ Û!jˆ‹öý8 ÓP%!BàøT&í°p]#ŒèÚœ1XÀ D§©YÒM)§“BD;<@»µÒàÌ~´¢prL¿`¹ñšµ–Õ&zŠûbëf [`Ö.× 1 .‹õt$yœbYo®mÔ¼¿¢ÀÛ¬yÀ›>]þŠÄÓqò_š­Š­w?p’ü·µ»“Ïÿ±½³û(ÿ=ÄGȹ©ž^LßÂzZ TM}¦ÀÍœ$¨ÀŸQ”õfº ªäŸ—iá°—© ó¥Óý›Ò˜ByñÊ1}Z±MRˆ}€o´Nò™Ì†²v}Äà/t_€N+¾Ë.ø ;õ‚;ö€† DÂi¶.Þœž×[JÈi¶VùI©!a@v£Oh0Ù¡`hòåëÒø=àp:TúgÃYïÔ±áOB±jû@ Ì‰ú1È&Gøðp‚ya„Wu7+5’êálöñÊ_Uuºb©]} ÉÐ|ZÍ0X+,ùc_ÈKŠsÑW¨˜éª‚¨–‹{ϵÙZÔYó É%°$n¯Ÿ0ôCÍÃÀ‡^ççu ™œŠ&P¯`EÒ,IqîÿŸWEìû+ð g_ünëßиý®ƒïhèSÛ­à–r¿j.¢•Å,"³ÛàØŸÂ‰ Q¦& È]¸ÂÆxÓŸ—_Ȉ׽埖i;í-×–ÅNÚ[þy™6Ñ^ï³çÀ]™ø’s9ûfÅZ ÔÐ[Lѽ5Œ„$â"†óíë‰U™v˜yòÚéI_ÿÌß“`âôbq3³‰?*æO>;ªßø,¥C`z³9#ÐU˜Y>ÄÔƒ òö-‘Œ¬@ÛΨWVKsy”[¶~ ɃTj?ŽòaÞÀÛV·(ÚÝÕÌ;(ˆ)23‘h:jLœÑ¢Iš‹äÔša"¦9s>M8;Á·Ü-Ž5ïû+ø›ýN@‰"/A$Ä+åØùm ²UCp!ù™ºí\k­ÈÕCm=”ͱ¡££_LÂÈ¥*–¾¬G¢?ü½ðVΈY)מÂÅAAUèÇ8¹þŠ$£ÿŒÏùãyõ¢/+ÿmî>ÛÍÇÿØÚ~ú(ÿ=ÄGËæTÏ"ÿûCøÃlé+ý6 ¢C>C¼UišPë§çß5¬€øè¸~FD¬Ø×Þ“[57‡}ßxjÔo6ZÓE)BkÆ5o™Sø¦8ªPn-8ÙÑ*r7 (ö‡¸!.b{Ò‘d‹wŽªg)ûþ#°ý€$6ìØ8ËK‡à—Ô)«²¯¬ÉL9" ºÌNNš•L$rÁˆ£èI&N¬(Í·SÁwœ‚b²óð9/ŠˆÛ¥£”V䩵ÂzûÔÒ¸RÇlõá°V¡¿ðÚLk_Ý6þ§Aöô?ïÿñlk÷1þ÷ƒ|4ý7§zúß ²ý-}õôŸ!Ÿ‘þS¥ûТßyúÏ­æé¿~š??¦¥ÿ6´eôŸÓì.–þSÏDÿ׿[s:ÆhC¥T?*ð2Ñt[qÓc¯Œâ•2ª¯îu-‚ò°ýžˆÿM¤ÿ·úëËæßØÙØÙ,ÐÿÇû_òÑôߘêYÈÿgPÍ"ÿÔÐïÃøÃÀÏlû¡j‹ˆ=“‰ Ÿ‹9½…'§<ÚtäCç¿áHÝ€bÊ–Äi*ÿ±‚ícÌæöªŽ’aÌ¡¦*°bF*¤]1`À ‰ìi¥ºaÝìŘjÛ4<¯}?<ðniòªýÍš×ßZñö¼~ ,ðõà‘… àUÕ¯µ¥§¼qÏ߸lK·ZüZŸoµ |Q•-¬`û…7?ýìõ7Eå êV¤y Ä¼Eè/·nýpv~z`·èA™±Îë¦;+¦Úš^èÖóÆ\ø!wÁ¥¿©²N‘R`ÈÅ\(.„«ÀXU–fwÖkÓf°Z¸*`Òfж03zŸtæ‹ç}å1< ‚íh ˜ŒA6ì3‹¨7õ‹Ÿva¾YÀ­hOþÓ™n.èßÙ­´Øå¸Ù˜öþ64ù_ã**F•¨\­C$¬‡?à;^š8J÷ÿÔÏxþ¥¾/ŸÿåÙÓ|ü×gÏõ?òQü¿žê©¹äYš§ç-“ûÇf~¼?ò_:zºúSóþ²ÚºYy“ç(Õ’wT2œ–É™' ’Úv‘§x¦r&f¸ ÏJÞT‡oOêÌn %vRÎnÒ[ƒÛÄßeç0öiþÊ0žwk™7¦ö0«?KΩH¥…ÀSxz u<²³‘™¼…QôÓbžŽÿý_N7»ò£'Ovœ)WzÕÛÚÝʺ`übÖ NF‘*åvlß6çŒ!×(â&¹S¹Ý8Ô®{™Ã40ü¿Œ‚¦sötê»LŸîèA&1Œfš@WZ9¦J_—k+êßQN<¼£(¤”`•á›!œn§ÌºW `N[|ûä‚ÿÛmŒ¬ºž`$T¿ûOŸ(=úº¤¼7jwV¨ cU”n¯žßO)ª’¿Ã“f«~$œÍlî ’KZ²•â Þ3Ä…;Ò¤J oPt‘ˆÞK1*•ØáX4æ÷/ã$Ì®5ïÆveöð\nN›£<óG}X¶OR\.×*i³ÜHžªq¾4NÌ~»Ozfu@LbçËù?L!xÜ“ œÀÿm={öÌæÿ¶ðø#ÿ÷âóœS=-ˆ¹5V)§†Å æÚü yB; ŒN2c˜«ì`ï Æh]+Œ§È%l3£å€š)*G*nF­’QËdGù…‹¼i®O'‡š/Ã|jni¹¸ÕÅfvÍ9×Jóö¼>&"ã²(çÔAFCï†fœ´9Š{òãX f,8MYc‘Áxnu¯fÄ)Ñ.+»’d²÷1ÔKѪŠEÞBp£Ÿ‘ãÔ’ Ï×E®Â¡ "оӰMÄM«{sc³a+Ïú8ñ6w6"ìq4Ð6Ž˜pþ/$ ܤü?ÛÏröß­§þŸòÑçÿ=’À鵘^[\€ îwÁX¹Âæàì\cØáò“ËÚ6£0õá_™VIU,•V2¹›ã¼Ç[Å“ì;[›yÿ¯ÇûóáèÅæTO«ô;=?Xý®¡4}¢¯P½·k©÷Ä5´Ùtzò*ßTv=ë–÷ÌÿÆÝwß,”ÕÿrEÉit…ÅÛ9ÊÛi†ad*ð›Îi¸T^Ä;Õt}Ðpt## .ð=.·³ŽÓŒ( rêå;V Š•9V€^%§$Ãć¤( Ǥø¦J3Ÿ•¢]qTB[ò¨„¯O¦çås‘t&1SGf“.,y³Ölüý}ýˆNÊì>Se‘˜Á:£ÃéÈÝJ:&!Uëä1ïG5¥íÁðÚêà·ŽzÉâá{Óx L¬2•)ÍY]>òú3þüøÃ/~þomoíìæó?ììl?žÿñQ翚êYÎ8åÌó¿|}çîæ¿8ggðHŸž§½#ÀL‘_æ?¾mx§:¾ ¿óUŠ(Cè|Ðè&«ÏxPvZ¥§5¾Ó§5üïÜó]pgÅÈùí¸yø·~^?~õÄÇš0Ž’³žÒmˆLݲTù™^AÇÙ:p÷èšë¶oiQÁ‡P?È8x{ƶ¦™ •ýŒ€YšZ=(›”¼…ä,ü2¶bÉÖêTlš{|‡‰V… k[©g=Çô‘3±·o¼q8(T}¾>Å:߈*ÅÚÓ³hÜ…ÀâÀW Z >©…bý'^µ82µBé”臶‘ qÔ¾3‚!‰IYå)Бdû3ÍÆAŒKçcenw)Ù´™“×$R]ô–Z—îRæ" •ɰË=H“3öAܪŒ@i Ì®ŠÉŠ]Ã/²±ª¡ÐÍÉÎÑî FbÙy.è…> þÖ&W`úFÆ_UB‡HD=5µ)ªêÂŽŸ! ²Î·.| Ñ‹UÇ$ÂÎâH;8bÇF;>ßç°ÙK ‡€PRíÌÞF5+¤µ©¨ôeúôÊ—B3œOQÓÁñ(ûª±E·lù‘O.tšå—`!VX*m½T:EIÊhlÌ2œ±íY„€{,E{ ‹\Ž’‡PvwÑ‘±0yyäÜQ'­X^§¹{ÉvfeÇšeÊä¾m^½®V„TdŽÑêŸËÝÈr š Rˆ£–Ív¸j¯:Â,ï€Û8ÑÏ kzZóBk[`𵕲¥ì‡F t;0(ZÞFT(Y¤+“[˜~Qb)ë®õ¤Óá[c\€¬Ìµ„Ü?Þí™Õ绸+y-—V½óIŽÐ’yk©}UdwV¦+:+LŒÊe¬IŒ4·×Γ5ø9nŒoaúu¢8üi× Â5ó:q*pñÜIPÉê1ÚPgœX!¤Ê”OÖ¾ZŒpTHnj Gź«ê 4Ãz!Dsy üÂJšÜ=Ÿ¢¹ÉqÇúŽ#UþÉ/šBÝÉ'脦fÐ#N¬µäO¹ Ô©êN¤[Д™1O¿ÐZrÚUGóVH&ak ]~=Œz¦IÕK«-¢¦Áø¾bÕŸ}1%÷XLÉ/¦dþÅ”|%‹)×x‘‹)™r1%_f1…ýŒS ŠCÐ -£•¹ck; '53‹^»OáŠf9| 8»Ê"}ÃÔXW×Ü+†“°ûY˜ö8°M1Ž›‹š‹I‹8¢ø # W .Z-p,æ—I ÕÓbo\™­3Ìèë÷-žKjr§`½DõñØíÍĈ‰NgæÇ$°_€- &³g–ªØ>mLÌò*Õ*È`Æ@Ö=L7×6‚ ѥʱ˔%¸èÁ/+’²]´÷Ä«\5RT`ÈeJ¦Ý3êyfµÔ¸Êñ¯«ˆ÷«×<=nx7X¿q“Åæ !í©€³r x¥t–?–%?¥[‹:*TÀÐÏN×óH3Ië³Åwµ§GÎŽ9a¶ú¢F 2Â_þ+ž$Ë;=«ÿý½Œ•ueÊ5k¼üþ]㼡<'mûJ¯ {µi…gŠK+ÕQ°šY0D›E½ëÒ'2:Ý-Â|Ü5NS-TÚŽ—%3òfyÛïûQ‡óTˆµÅ]âH»³Æ¦¢$&Ô_8œpÄmGœ1I·ö<1>R¢Tð•ôáäWâÈQ¯ÖͰc“0,üyŒ_«Lâ“Q<.#…GºV™eF^©E"ìÑ'ó·øŒ÷ÿ„ÝøÅý?7Ÿîò<Ýyú˜ÿãA>ÊÿSMõ,þŸÍFËôÿÄÄO_Ÿÿç_ îŸöÌîŸèÐy¯ûN÷ÏI‰ŸŠW:¦uÿ´áÓýSd†r¹Žuý„ÎK]?ñvý„_ wý„âÈáñiœ¦ãЧ‚áãšãì 8†?(-çOrËÁìàcwË>Úc“$ˆ›]•ù-%C‹–Jí6]vÃZßFsNè¡)•œ^énf1Ñ©`y‹±l”Í^taøÓÍçqcb‡Rš‹o°Ýû ê‰ÕÎöýåGÅâ»a¯$©ðMÚ0­‹ 7‘ö„b_›TYÊÓš¥ÚÃh}ß¾¥¼ÊMi U0½:t~Ž9±i2ÑËdŠKì–g3/ñš+݈•AlLÕ¢´Â‰~×î—£ƒ–àµo?N'Ó `›ã÷Ü—ó”äÞçÛ¦ì))M™²¢á2)ײ9UÚRPþˆ(¤ V×û§°'ˆ¥§ž˜L>˜eKz Sš ÷syCss÷¡y2xdáÝ ©Œ‰Ê_z …iÃ8ØæwñæfÔŒÞg(r¯âîÂFË@§ËÆ´H‚=×ø¦a~RÒ`o‘²± _ñO*~U¹c¾nji×LgV7&¡Ü¢—‰_T$oÃ1•/+ŒÜd‹šÙÞ—™!vkÎÇ;ø=–KýX¦qœèþ^³³l r¯Ù1»Þòš•`Ëszfàs® 3BoŸ­4³Ø`>ჩ/qÉt,¶yØ æî·Ðòž‹÷‹áT¶ aX~j÷ËëmÒ ˜ ¢Ž‹¢Í3$Ýàýd´•NÍ ×‚µZ΄haVs.È=èß[¥Ò…ô`’‚žÉ¿Í‹Ž‚÷Ñ;Ï6Z‰^Êheا0¨Á)Y;taÉêˆ6­—"k ¦(i0ƒåRºJ$+w@äÅøNå’Ô—yÿ\@¥Dî^è90-ÒŠ™¿¸B€ázýéåq«ñCëUi÷Ça¤}¹Î…É?±¢[¨ø3ìêyÍ«ˆx—n3C­2@¸þÇ›këåèÉãëé¹AoK‡Í¨Mçõ“aqÀ¯å‡Ãê™Ëïa&¶7×pBJøP9B(Œ_ ¯`ö+“ÿ\ò¹$DŠøFá`4 >ðoé»c)R;Œ©u^â~˜x&[ytv^‹Pd—KÏ0 ÊFrY~Ë%óš›M ­Câ5Oá¸sË~ÌJ_âÅë›âz«Žt¢ë4ºr$è“Az ¥ËpÞ…‰3!4QÁmÆ­b††\™@½(Ÿswáø¤€ &÷äaŒºñª…­R·kEYŒÙ”ö®¹fU68ü—”½‘úFP[Äœ56ªgë·^T¹AV’Öz(A}ç¶µ‰œñ+·õßóÁß¿ÓW~S‘”c3ñ­n¬mÔ€r¯ä#cy¾8³¦°ÐÓ‰&9Kd=P _ÄU {k¶ Ú–ûá¿‚.¡’óœt‹gÂŽ yåež[9MZ%7u¸ÕÞùÌwëo@‚Ÿ#!–Í@*5ó?'XôS[ËÔÄýf´S€7Rkرz~’C#ýY÷fYAS/Ÿ"]ñ9¼lIº˜áÞ%,É8£Ñ<ËíH:kõ?EÖj‘õµßX 3^þ‹ÐLðÿÚØØ~š—ÿ·wý¿ä£ä9Õ_¯vôÌ:¤ 3j¦×XÛZ›¿­h‘“yHºkJ!XV‘À­¶ã$‰?VªÍï_¯ò)%²1äüc?IýË~è“ÿ?þs¥V–ëÞIðÑÛïû)iš®N¸ï·J–¯-{”ëQ´æÕÉdÖõÎ’¸½¶îmVQT†IØdyçéÖêηk642 ©5§Éèû—©·ó-Áø-y5k9[ˆ³Uæ6w¾}¶î­zükkçÙúÊ:ˆêâhAï·Ñ¾/Ç *¶³³»Ž\H½ÆÿË+Ñ}£»Á¼†Þ¿wà×ëÇ+ßë‡×È]p—0ì7a;ŽüN'ÔÀWØÛm”¸7 …%ñ¨Ý‡“@†…ðÚa’]u}8á‚4[óZ˜7…R¯¡ù˜‚èWrx¡¯ë¡­×ð¥6CÜ«tM-Ać¡8‘ì9`½QÅ¡jÒ…j23c¡"عo·žm~㯠ânÕPz¬”KÖñ€ekÈÎ)eŸröéñDI»”u28d€+õ m$_P|Ác¸´Vã„Ýnp.‰wVÎÓ6U¾ZÒ\‘€1aH¬42’R\"# Ñ©&þY*¬dq3Ã8¦À’ÒËÌò.Çï§À–S«¡“\Á"½ÁôŠí û‘1@žYÇ·¡!lÂWÃ×÷ñ²Ö9À\Aóa4 Mý$„½0„äL»Æ™Õ€É߇îý\Ž|oƲ»ÑÌÇ8¹VÚØQ6QÔJY(Ëù0XõŠARsRîÌv96ú¥Yíâ6ÎîtBt¯^DJHˆª$A'£D4€Ô(@—¿'?¬,föÖhÄâsצF %ñG–ŽiÚ0v˜1—аó)Ñ.¡ÁŽb!nªe–*Vˆ0䥌—:2"×xÁ =RÆmêÃ(3ó<žF¢qÏi¢WЩܰj#jAÈRgí• h’Þ ežWt©fF8äéĸ©õo]šÂže†°V"¯=Úrò®úX±A¤¬½,Q;M’7v…¹ÕH"¤‹riÉöƬ€!+šyè°ñoØÐCMœ¡ ûŠ1ûÕj¾4ëô`ó÷S¾ëŸ¿Š‰ôþ3PŸßôS®ÿK1íêÀ®ö¢ûi'øÿl>ÝÝÌÝÿ|¶³ñ¨ÿ{éÿŠS=í5PŠVLÁàå]P«­¯å:(‚ÞܰtŠìâžø4ZE]k]W Z~v„‡vd!0ëHûM%ÑJ‚ ß2†}.Ñ`r«Rƒéˆ¥Ã4î‹’Y2Ž*2®Œþì圓šý…¹Õ–ŸüÊÒRàx¨Vzóþd¿uzî8QºÿeÔ­·n…y>$? ùðÅ^®‹fäÈNâ,s)u«WI/nl¦–õûÀ`vïTŠKYŽt²/ õœ²½ªbéA£\›ÀbÖprÒ €²Œ !Ùæ˜+:\bE²+,§– +c)óúv#`èpµö Gñ$ú!Ý¿8ýßÙÈÙžílm>Òÿ‡øôßœê™è?EÔ°é¿hëë§ÿ û¬ô_Ä™Ÿþ•ÎÓÿqQÿ§¦ÿt²LMÿí”Ñ‘à Ðê úøGúý.E&3" åWÁÔ ”?u®Œâ•2z¯np,‚æ°ýÖd_}&М¼{»L ÿ;Ûú¿¹±ûHÿâ£é¿žê™ˆ?Ò ‹öc;_U,&þ»EÚO ÏäR ©î¯‚±É\ Î{*_W¯:X µõ3)2ÙÏ*ÐhrØ1,6ÒðuG–F“¸'Ú[°ÆéjÝ<;ªÿx£”!^èÁ*>pƒqÙ¸b½¦vñ¤ùŠ:>mÿµšŸØ÷¹÷įyIxy•Ñw¾æõƒžù೫¥“Pªš_®+0J4ªÔŠºr(ò¯pV^zIÊÕ*gÖ0žÎ¬ eì³r´3J%NÇôaŽq¥V…ÇjMÕ²¾ÍyÉÁxŠ'¸Ù²êNՎ躅v|6¢ÁÛ­XË5ô0ÂS™nm£ØŸ·çÉ™äY¬­­­}^' j$ýlù|ÍÙL¡ v¼^_+6Ó¹žÙ˜«åÍâ9 ­ê;DM²ðšº° Ì)³wÓzUÔ4 „õU„3¬xþ%r’ì…·€Wyëó ìÍàÖG.La šíE¼šieÉå·.â7Ql!^yÖZè [936D°¹'>; |Äô.é2#ià'+& µ=‡:ŒUÐH;D/#û¢=Z™Åýj¶zS­µ9§Ç’´Â× Ë¶øTJöÞ?c¾cQ•›*¿ëä™÷¶,㉫–gˆ'.¶*ŠIMªxÚШvÇÀv ªvÁÄŠ«I¹Aæçì@w°Ú£¬ ‰•Ì¿&Ÿ"×öÁÅ2¬±í^_vøpÆwÒŠÌz Ãl*_¾RwÏzý;ÉöÃB€&»Òš¦ 6m–ôëEg%òX ($Æ©:•WÞ&5”²'ˆ:w*R»<•m‹ú”óÿ07½‡¸ÿ \ÿÓ|üÇGþÿA>Äæë©þBÜúLó8nß n}›¸õ­m‹]ÜðL±†+]#¥»$›*Èï‚õ~ç=PN)›£ç~”¤8{ë©çEq´ÊAý0È© ×&{{šõ×ó 0é¯ÃA"rQ¬¢ãªÇ9ÉNÜó;D)›È*Eq¶OŽý˜ˆ+ƒÀñÛ¾§"æD˜êæžK¹âU“ʾ?zt Ñ…UË}¹´Wö9úðž5FJ°Qý "Û·ZF6lõשºb{éÑA“¡£—…\)„©3Õ$βS¡,¼§á™ —Ü¡„á˜8¼3ªì,<¶B Á«Û—ëøg«‘ã8í˜J¡O¾¡»´jÐÿ¥†ÖÏ8TüºŸÆ+VvX†z 8V^r&hµ¤=¿Ÿ âÔ3È.?…í3°HnPmkçÜηo„[Òø)lÿœD]°îÌàL¾ÑXA²@ÊB=1˜=ù‚ÉÌ€„ª‰EÐ83¬).R$Nj™KzñlLÅu†IÈÞÒ4#@xhµrÓƒ/q´x]‡Ø„0U;Á>þÆü;RcíÕ6 ëQÉò*ˆª6Zu'|e¾f Ѹ#/T›b½¨Íš‹:8í’‹£EŸ[F.¸ÛEç•‘5Oà=wSª@1(D¸jÙœIh£Þ£¼8švóG o5|e–› iÚ¾%œC鲿¶öñ}±Dp߬ô @뤳`Ëap›Í°.ûat½èe‰mþ;¯JߨEiÐ ÇÒ#ôL¢!FÖ–T²6{(¼¸ßh±ÉNø!„9a……½'’f©òRJKD·eH!‹è}œ€¸û#ùý›’ ®v¤–ˆËW£KQ_[É˾i©UÕ-«5“1Z©U.AèÒŠ}=Fkî† V šé\‚ÈŠuÉbÕNu·d³p+ÄëU°©I¢ ›†¬pܦ‰Ø$üsˆE?òûñe&ÝÿÚ0ãÿo£ÿÿÎî³Çøÿòyù®u|$Oyý) ³~ðB?/Y]ú².×,†Mþr½Žõ6A‚qqÅ yÕ<>Z?ù[á{‡î?ï@þÿS;îÞ½àï/÷(T`û¯~ò õwç7{ˤæ[ñzð<ïWýîOèWek£¤ÿbùÕýpËâ–Y~µ/3s …Q7¸]EuôU†Wñ·«1äUDçðUùùåúk¤ jgH<^ˆìÇ]6Øý x©54»6_½|}NeöÙÛˆŽªŸö³ø¹Ü‘iöWÎwÆ£¤ƒÂ>ì͉¨Àq+ð‹jx?Þ±3üŸ:ðõriψۂÈPa˜À¿IÜyoÔ\¦WáÐc hBÖÅD¯óªø­çãç‹lúÛfáä ú¿§ÿ;;ò߃|œôßIÄ=MJgÇ‚üaè¿¸Š´?‹»þÝ#õü|½Mÿßùéì”t}á}ÝßÝ-£ÿøú¿½»»³ól{w èÿö&ÞîÂ!q|þÃé¿cþ¯àË*šMVý,à5Þ{ö1áüߨÞÉËOQ%üxþ?À§úWœïŠ÷ üœÊ×­ …J+ã˜\Ruh×ÛS?ß&ñ(꾉¼jÅþ1dN&7 „æCðìyXm a¢·˜ú=´¿Óïð§z‡?À_ñV(uëÊãIVþ»ÿ/i¢D —ùû˜Èÿoå÷ÿ³­Çýÿkÿ[ó}"€õÞˆ2èÌE•Ñ2]]êÌÓ›»÷Ðú)}–ÈÀ4EÒÑòž{ïêÍw-f¾§áeÅIEZkò‡~·ÿ oT!Ùú<¯(‚2¸†fU¼vÍo¤@eA·¨´Añö :7?<û6$YÉ<ÅK?Ÿ‚_¨A ?ëb„V*‡ß6°¿,âh±ð_V ¤—ø´Fÿ®ˆÑ=ÒËÿœÏXú×:ƒ{÷1‰þÑÏóPî‘þ?ÄÇ¢ÿ<ß÷$üÄXšòÓÑp'™Hk`gGНºÆ½Â•O¡5Bê¤.ô2íÇp.î§­ä Æ«XD[Òk×Ã:óŸÅÇþÐù¼)ó48^t`”j•JgÆÞˆìÑ­ž4¾¿Ø?Fþÿ^Lj>)MüPÛü1èSN‡µ5¹Ë~uÃvëâóËã ZUE@§üóÂ3G¹b™ s¶Ï‹Ï›ôø·Þ*ÿ–Ÿ±ôߘøûô1!þ|ÝÌóÿùßæcÑk£ßKà&ÈÞ“dƒ1~â æ¾Ùp*RÅ _OÚ+ÈW3»xá¹ýv©ú i¼ù%þýfEW Ó†£’ºŒ…•ÏÙUÖu³œ½Ñ†è¡ËÍ›Mc€¬~Å7Ncú†zàk¯6ˆÂ!—ãíˆ8SF¸)°±—‡ûÏè¨Ð]ù V¶ûÆ*ïô{Æ4CY0Xs@…nù7ÞÖ#†?xS+×äˆ‹Š g"ù¾K'hLe¤qÿ}§ûý0å[K/€^˜¤™Ž½%ïžÛ e¦…0¥»P’ŒÚákçèu›£«U8PV;ÀZŒ ¾{Ë•BЬ8ð¾ìÙXæŽ0¿î£&’Gè\KŽÁ“ï{&ðiÐ(~Ú£Ä0Ô8(*HÙR¤ˆ+ V_sd1žÒš\ü'§' ¹­h®»qFO2žŠÜJ;ˆéª¯áb·+ÖNô®ÉpXúvI—›‹õ¦6»K‚A|ŒbþE[Ъ—("Åv,Š+J¦Dz]#öÔçÄÀí¾öÓ`í$ÎÞ>†€75zø£8¸Î‹MO‚U2tµ©‚1u•ânhš ±r¦UNc˜)¸bA‡P/uôLYhLª‹Qp9ñ]Ü£ÞR³;³U´r³îÁãûbáÉçzHFÄcãG.ØÔ« &~Åv­íw9Þ+÷®úMÆöKáçËzA:ˆ×a°“¶""T%Ž4·l äŸÓ´!”,YAYêT§ORΫSËÊR’]4¿Z鎊:1 åA9BY,6æÎß{÷`Î Õùx§Š‚ˆ£@\êÄ%5/…Ñp”n0“B͈§‰ò1åa56–þÔº#ój”Ï ñUuR-zÌc›¯,‡ñá£;>ºy¶ÂhÜ…õ{õ2Ö¥È'L© ˜ù";¸U8”¸¡] ¬“óEÔ ‹ ØÄêˆÌÓ{g&}üÆbƒÔ<ÃBæi/Ú”k˜ñŽ.ÍI1k&wÊ&ú} W%¢Ua!¼Ð&/òÌæfˆ‘?Öù¼Ätå3Ê™ÇaÜïö KåúÛ±+—/å ­X“-å¹U÷¤™Ã )™'`Œ¨žÊò¡&÷jòÛµL?Ô°wSõ FVoÌÌ\ݵŒ§k‡û†Aà ÈHŠE66 ±Úݘ¸µÔÏ”/wR·UÅ¥MÊ)Ô‰‚òé_Êïå3¼eì÷­--·™v¶hǽÁ§nÑCÌ-ÝÛB¸ÔZ7±ï˜Rè A¬ôhåјñ£-ê‹&éÿàþ3Éþ³ûôé³¼ýg{óQÿ÷ Ÿ¼þo–2QX‡Å©­ÔºBÎâ•zíÇŠ$⡬ö=P‡ó ûºïw®X(û ÔÈ+™Æn\З9V°1d=¢õI™ZÎ|8±:¡/£L—ø2aÏÏ]jÍ)üìwØÒ^~TeªÑý1JQ(bs–ÐΚR–¢ñ¿ö²-¯èEÍóWjþm¯P°Ãª_í¢!–…"Õëbq|D5rªØ=ê–¾4®üNüR]ig`¯y7+¢ ñžù—½—¥4°B3ZÔ<»~ϧià‰W¢ÖK¾¯yƒñ W*¹&HÆ ¦¶µ q „CnP}Ïh‡BfEœþ™BB`‡¨^Ã ÌŠÈ ¾Û¨fÙ{• ʘƒâÒÞ¯^óô¸Svódel%‚·z󄪋ú@ÐÁ…àù†ž"Ú‹=Øðw:Z®?ÅÕ˜IáYо7·]U{Þ)qJ¸ã¼?nyU=.,£`-;¡Ñ¬ší0äÖ£¶ª,ô“VUïüœ²"[µª˜msÂ/o Sκ?ÇøK‡ŽåI²×8é÷<õ¾¨ä—ò§Aޤ¢ µ@¢Oµ1=Ãýz“ÒÜß<Žß~úÙbu ý7 X݆ÎÝ Ð¼ èåš{¹~þüÚî›ê7LSÂ-È'U&¿ðBO¢V…ñ6ÚC´c%ýBumQàWD”y-^q4–¶ hBn^s»]ùtÅZ²¦6‰rg¨ÖíwãàÆz°sº¤1mO€žZwJ›ž˜üNµ/˜f½‚77z­’®F•Ôîs¾ntߢÿÕyÏ:XHq2¡ÿ4*±ú¢g,À¾^æ·¯Óaˆ«·ü#W7tV¾ÎWÆ®ú‰U=™©ï$tVž®o–®QFVD‚žÈyº¥ÊôþÖ$+,Ø›UÌ rrO¯&ýT=kVè€yÄ3OÎiCç —ùUMøwÅÑY8koâ÷´=.Z*+ÿŽ:÷éc‚ü·ól«àÿ±¹±õ(ÿ=ÄÇ’ÿ,Ǭûy‡Qf2shÎѯýO çRÂrúŠ4­ù|EžPÒÏ¢—ˆxnû‡`zÐ2'Þ­«*u¶.™oÃïv=ÕŸmçvŒ‚OlŽ_Éu9ΚÀ ±ŽîÈfèlˆ-—½$P!»Ánƒ Æ‚_4t¯±áÚsÛ«mÝe@Æ]gûÓ¸à°:5ԪȀ9—åê#ºšÁÉ‹;|8Î Ï™_ÎÙ´­£9Šv%¡ m#.§Ž+éE›hÑ]Vb?¸Å …fæ/y—:±qÒµ±Å{Ž€|%¨ÎÊüaì,Sâ 'cÛ?…Ö-±þ›MæMéÓ˜ðK–tíuª{‘ÛXÈŽï©°Óò:C+‡fkSêø¨S6u kä­€šà'áyþÿaí?ÈçÿÎì?Mb ¢ÊCØÌwHöd!ËâSn“±­.ܺep±ì-–Ö™›*tšSW³†ž«ûD(á‰Ùœ±. 9\¬•ñ·PpQˈ‰¾ª „˜*sºŒ(ó7«ZžïÙTß±¤â/«ç U§4y‰xæP{“p±… W•9DiŒ{‘wJŸÆßß×V¬ ¤J‚-A¯° òé¬_ú•+Q€x|b6ôè¤á'—yUu®c(aXº¤qñèIè{ã‡}oY¾Xv0ý½¾Í—©ä™× æã>ªäRŸ¡T@š|´®íPQç[Ð+HóÏù‘êWË6c­½.w/¯ 4L[׬9=C›ã² -«Z³8y˜Õ›å/ãÔœ †…´­LdhÙ«zúˆG’U‰mÉWÔóÕ]|~óÏxþïþº_üLâÿv¶üßæ#ÿ÷›ÿ»ŸîWòLE…®©Ì= µ^ ¢ÄX À‰ËR’ÁÁðê8)ÿ9…¾ #¤3!}¢Y¼Ó|¡gÄØRLwðVŸHÎB«6žäϽÀŽÕ@þaÄ׈ânS «wXÛz‡u Õ2¦–Íi{­‹K rKÿW(Ë2®Qã|˜ã¬b¿ž‘xÓ“|£,¿é,_zª³"ò͇…†¶Æ6DÎÄ¥-Úo MoO×4|éNч]¬ÐÙÎŒÁ—`–^íò…îwçí¾ôæ‚î(ÃÚhˆ´Q¡(m^XY1º4¬¢M¹×åá h×'A[Å혚÷$±ìù4‹”$†"Sa )Aõ¹^²òÖÉøU›ïB½—®Cc{Ûžº·ÜBæ¶ËúV¥§bgv r |JhTµ©ÀÚ½X¹…?+|ª~ ‚-ýàKÇó*øÆ½ú˜ÿqg³ÿaëQÿ÷ ›ÿÓÁV’ƒâÌ2•Ñtò «1ŠÎÏE€U|‘ªrUEDžľ ~¦õü'Lj·ÿ!ûág¢ÿÏÓ-Šÿ»õlëÙ³Í]Øÿ»»»ñäcîÿEÈ~…ï=•— Mù|ÂÆ 3¤D ‡ÿÆ=ïSeÉ%"Ö*KQp›µT£˜¾b]%³÷ZǤGk”úËk¢!B•濠ó$Íð_0òaعöžîhUœˆÒø™áúÄLEm ~©ñ/ æõìy7Äs <«T©Óš÷ÓÏ̱|Ö]± [ÅnD“5l£æ­­­}&Ý2VPƒßî^PFvj~€iJî´Özðª€V ¸€gvô¦GÌyÿ·ûOàɃGšqaíXËâÃ(û¡Jß‚*´@ßÑ+ Þˆ¡÷ƒè2»¢†„§>6Òu®IµÈ…ÒQ±ó¤æ…TD)!úY³D}£céäâ™^s{"&­´=ÍM ni äm$BkLn¾  åý $0d4xþœ¡]yQmFi²IòaÍG¤°|èÂ4‚|çÒ²B“Ï·Ðh‚7SJOÌìóçÉ ú™.…=¯z%b‡® «Åt ~©òˆðdÃæ3ÌöÉ}ÀRì£ã)¶Ÿ˜è C\¸Aª‚.T`o¸¼k¤)–€ºÒ‚T}µçj^[}§ÅúGlÅG; ~i-c*ÓåDC5ÕŽjè埽ªðç/_âo˜Ì˜Ó6• £^x %m&ã©zÕFˆ¾Ìj[Ðvã§v…M£Bö+\nöñV ›«Xp³Â¥¬Ax€ß;Ó5®¿w¨£jÏu¶=Ug5(vwöŽõ÷®šËñ335´tÁý`Ò߃Aœ5ÐEÎ] ÎÊÒŒ€âýçR.-Í̹þÞsŽºÍ„´?6Îûj(tJºjØdɸö‰¨Òªš—Ždgƒ¿Þõ¡ôi‘÷W„¢HꈴnH©…$hçÆ– #¼‡—²ÓØ~ `Ã[/ɵ°5®…­iZØ×Âö4-ìŒkagšvǵ°[Ò‚ÓÚæàÿÏõƒãÆyÌ üÿֳݼýggãÑÿça>ä¬Ó ʳzGyÈ)€ŽŸá+ƒæ\z*J~ '¹ýOJÊUšëûfýÒŸ ñÿww·óûw{ë1ÿûƒ|¤bÚœs§ hó/yêÕ[jyçÀ ùIçjͺï!ÅBñ…÷Ñï_s@à²pq¡Óq€\Ò„cí Iˆï y•›0îóE·¾‚ÛN$b»[ Áö± lMÈýð×Eãüüô¼˜ åÚàíŸ e7æËS5à¸"|F™™P‹}®j¯¾¢N(_°éTXÌ–ë\¿ eµ. U©eüçæBÞ£Ÿ˜÷S‡ÓKmš´ìc ÉMˆC¯Š—k^'»eÓvšÞ+{Û ÷4TANø¨±Ã?Þò( n‡ACØÿŸÔ¼\ýÒeï'ª‚Q«Ù:÷¸3ãô+Êý¬L1tÑv{¸ò@Ù]ë>±*7Œ5„ ¼Ð¿9=?ƒÂøý,K¸Kü& L‘g¯ã9ûøZ! ×ÅkXûŒ=ïSaGŸ½¶º,ÒÆ®P3À«&úK˜n×$Î?sŒl«…=|‚KaT:Wq²G¢(ê±á=þƒ?Ï’@¿ÃÛ™A¶'®“ˆ!–Г_õƒƒóF³éµûqçZ÷\ïvAœJåöÔ@°˜ÕÀk|Bªç6Þñy¥ú#Å2Åì)ËluÅC[#µIí+(¨íRò—d ®\ðc¥k=ýkk¦B R ð¹=œ6=»Í5›J ¡ç3»µçò̦8_°g{%‘Ú¢ËbY-O˜&k‚3IÎ5ó?EÜûû£b÷ª Áw|>ú<“Óä8ˆFܳ»ùÓ/ÛüÁáùýÛÇ;wîæ'ï¿dû±späjßÝÚÙycAKI¤[™m%~˜4š1ßÙä~ã¤Õ8—¯îßÞë£Óýïþþþ´ÕX\›ÈF8Ð^U­b¬ªÏê[âïªËÄ}Ô<þ»ÂnÕ•“a±VÓŠÊaóðä ñƒ¸ Yµ_¾;w?oÕ_5>é~}b¢÷(lOBý¬uxz"Ǹ'Jˆ±ÖtMâa¹µˆfç© ›ªà^“´*²Ïã¥ûÇ…Š’-4®Ñ‘@´àä—ßE8ÑÄ¢,ÛJNË./J«Ò¸#Ó"íù,BãH÷)fIá@¼v¡úä¥ÔiÕÊ•zMYÅÎh`…—h>‘cåÂH’¯#¹¥Á²¼†?m55±´“È7:::,ÙK¢KñöÅ8R.‰Õ oÊ©z™ªUá|fâ˜çG{‹©9Íþ’‰ô>u˜n÷3{æØ­zŸ=W”–>¯p+Ý,O«œÃïvg¸¹Ï>{ þÊ zWÅB|W˜’y©y®áƒ…4, †1Év‹üŠ…A×w ÛB¬8Pdz,çWά˜R=™Ÿ «(#Å3Ù’=¥bµ±iv&"NÛžÊ ‰Ä’bCöê­ºyبW­–Á[_‹®ÔÛÃq/_{ù~ÜKè¿kŒmûð­z]åå-Ží3Šd¢Om(‰Ä 8-ûÌfg,nÙqó¸~t4eãTvÆæß¿ž¶ñ÷¯gmúlê¦Ïfkºq®÷ÃÖØÞëe‡ˆÀoUîß É>=C<‹o6ϸä`¯4¯/ùy¡gÚ ‹3±—_$TÇoÍãáñ[Þæc—”*, !ggGÖdÉEpÓÓœ^zPªŒÃ«æÔ ³šxÕÏëÇŽA ®S x—¡ŸøšzéÝ›ÓÇØÆ" «ŒÅØëz³1G»²Úø¶Ï”3c¸žžœ½o}Êîj”à«&R®–¬lV¼âD‰µ­Õ»ËÔÐr|`µ*6 çM/¤CO5»ó^Š(Ë ¦‡kÝ ¼O0™óš¶ ú‹d+ºŠà4µêwù¤~ÜXÖ¯ðrš³2€«PÈÙ»ß cÝyœpë¥åiƒ´ãÛ•±¨½w€lûÆQc¿UX÷cgŒë,»Q«ñC«~Þ¨ÏÖ ¬ål²¹~xÖ²EXüä"É3éÕ,’ÊUQƺåuLêÊÄï)¦MÎþKV@\«° up’ÿdzg»yûïî³Gÿùàý¿ÂœÏcÖ.³ð# Ð[¼‡C £…îiØCʆÑÝÖ([6½C1 ’6%2êŠVbãK 6œéìÚ\ãIªƒïÂrFÛSîÚ!ŒÙ Dá)ú¨•eÕ»òoè°=Êtˆ åÜ‹¯.nD0/ôíE2Ò°,«t÷“¿ú¯úêÿ¬­þügÙe®1ØÖB¨áËGAÔéÇYËË@à½'OÌ6ÏŽ4ìÎŒiÎÔÝh «HpÌ4ꩲýŸ>˜ÿÇÓ­­g[ùý¿óÿéa>æþOïáÿ1Lâ›ÝMÍ…ÛÔØX¢:Ãû?yo¹YÓ2oúUoµÎ‹WˆãaY»õžaD(†Š.£ãIr©V,BTiÛbb/U›ªPHìÔ Åä^„BË˹‘ ‘ZÔ[ȼ,±š6D¢§7= „Xæ ݵަA3pGc˜C”ÒkÊ(çØBš¯üþøuãœúô9Vâeh*—+­h‹ùì¤ÙªŸì7¨ ŠoTszŠþÇL†¬xYï¹R%Tê½™ÉýëúÿÔ˜¯3žPt|]¥\b´DEŒk^; xB Õ±†:¸Üty€cO¶ÆßÿgÍó¾§œÑIÜuè"„.ÉVŒ±­Pàé;jÔó#MºÞµÌEö㌠‰‚v€,uŠT`¤A˜äd`m´¢…¾ÿ¸5ĺ_*‰’±4M¼‹%w }Xð—;’†ˆ’Á§§5ç”܈V7壜”- sLèb¼áüV°]±)Ÿþ¸c)»X‹~;ÕˆCmÖ1t._÷F"ì»ò;kѽþ*ó·4îŸÑžP‘8†FU7 4"¸/EK Ü^ô\˜üø”‘/qŠ9)–Ž’¬Ã>¨.iŠ'“eY1¬’ªIiU¥ŸBG']~ð£~û’͉߬¸Ê ¥4‘ 0 ïb q EVq G)4q£ï~É3EçN¡Ôtú)½ŽâtS¨  ôû€ša`c"Iö’¼8w‚"ùÏÛ\3îú6k^‡âMï_ù‰Š”@?²ø=6ì‰2Z#R燑Üp_n|êˆîÍQ°h­9Qt‘wBe§´bÁ%”¢’¾ð†Ä±íw3GN£ÅvÇ%ÛÕ†E©@£ßdDƒ$SSÚŠPiñIXôd AVŠ5˜_”­äê!K'R¡ò2˽gþkl ¢—´rj’9Õ¢bºbc‹–^U‡Y®Š•û“šÐdÐܬܕº2ƒÈ®Ê=GÝFj|B&Í)Í,|) »AÖÔ=EKDæóÓ±D„\ƒ*»S®USsGx “‚ð ®=O&p"Ú_ì‰ M–Рܨ«™´‰[X®Bî%ŸN6¯P4"&¦òàâû‰ƒd‘Û4þkŸ—@E¢"'&ÍFÔ¼D$B2Ò«§Ê§F/Èàp@ž1Å“¨FPËÒg÷g«7>£ò'I°ÿþ#œVé s!ý×ñgîô l’ßÍ`?ޝGCk­85ÀKTf}2Ðs: |%:Ï”d¿E^ )û®.À[8²1ÐË Û—®û šÒ>Îð‚½ †Yð°¦ ¼éû—LÝŽ1÷®3X¹:­v IrQIF+‘V—Un@<Ο’ÊJp?ÂÔå𒸿ԱLDõþ7þ5Ïóª!°ÿªDüEà¼Ôbú¬ÃÇpÏǨjL´ì¾œ™ñÆ´·œÔ3|E(”H£…¢ALÍBœÉT ¢úÐQo šú]ä[ÂÁ0”¶1"«ƒ-vS¢ñÄ^Š‘x'ª³“AÕ8užßÿèߥ¤t]ÓMèóÊÌ€ Q]âG>a’èÈþª¦fÌêíFÙš9in>@›Zs\—sÑÓx` µåR+õÒxœPü2k°Žz¬”Ÿ,Bùs]D_Ê™k ‘ÇýL Í(a€8ä–6…å“* –O:`7¸óNN[çÔ@l¼a·AÔ¿ÃTËÁ0óþôÇÛÛxÁÎ÷:€¿ƒù?„~‘ZÄoñ’˜}9È¥0ÍôâtÜsrÕì& H…‰œž)5e5¯Ûëg%SÍg˜ckŠs3\Í_ì*?6¦"%I`êÑÔä7ë"½¸ñ!³(ý¸£LSR@ç„SR}ôSEîÑå³óÓã³ÖrmIH0BÿÙ¨½s©¥=׉/›Xô˜çBJ‚&¹,Œ¹w:£Êv,B¡¼kÔ½Ä °¦baBÏl*JÓJ•nÆñ é:ÌX»ûÏQªÂÿÿ–\ލSǃš²"…d9ôlõš™õ JÝ!yÂÆ 3Fšñ 4]M­«Tî4xBš!ÁÚ³‰N7óNå»óƘÈñ3‰…–ö¬½Cj@-ò–Í)•"sØa?öÀï^à[«+Œnº'»\0šŽ°çES«u¶ÚøûûÃƪ¯é÷ä²c ÑxµzÒjœLÜ-ØÃõP²c VìªØyI%‚+W\4iBÜî9%lææ4§àû DÓñ“hR-½,°tʻʲa༠CáIöNxÂ}K Ã|#Ümø¥“&ÊŒ˜Ï&0qž|·¨íf¬“Ã’­ÃÖQÙâ:o•¾ù0í¾v®64·p–JJì¹²XIY¹P¸lÑã(r… %ÅUŽÕJsö%W+v@«Õ¢`æB¤Â„Eóiôù1 Å~~#Ÿ[ = ³¾Xé4Øû-e<>ç]ʯëûß½=?}rà&‰¯ß»_âï’…‹˜,yõaÌ»zþsÅk KV1ªÜºã)«'F›_¬h²/Y«ˆ‚\qCIq^®ø‡1å?¸*ÔÇT¨ìÓ‰±wjxIz‘ˆ¢VÀÚnûëKÊóÀ \Ï…¹Ú—¸'¢£ÝÚ!l)È7ßôÃèšß90ÞÜèWòï|ý®ž§º7>ÇL½w›5ïÝü· ÿíÀ»ðßSR̞ͻ7з'b3&ã§å£Æ:Ëù¾+~#_åŸÝ…ZXR'jSº:ÆŒXsj D§Žô."û±¹‚p’4 ö/"ë'§è íoO¦aeÄb5+µCrˆ Í™½–-HÎ>}±Î'Òâ÷GóÎö>õ}Áa*û“Im”q+Ž­w§Bk!fêmƒ¯¬¾ÇÉ1Š6Nö1Ëqoe‚5ƒ’#Y ĘÙβáq]ÅÝñ3.S¨Í広)SÕ±Th"\ke¡ÌE9B›}Žö4bMÚ8 Ññ[»ù6ˆ:dòÙ3Æë¦¬róQ×wçB&L Ãió]ý 1†Ë?üŸ²C×$ècñýD~mŽ`H—‡h$Ä0òÂ_².i\+Ž“§¤|éÉóîü‹i€Ï?±¢È¢’–}"N¯ü®4Q0,-÷{æ›Â9X¢ð]ZšnåRª‡^¼¯OÏ%ªàýÆÑQ¸ÚÓ·åÎê¥fYÞ Xß<˜2SˆjÞæ¦YRÏDƒ£²@À˜ÊEέ2ë^áUb‘üO*(Æþ¼Èý£âÃÛBí8éRíKH¶{Ðï§ (qÖ`ãùrCL©a–¨›fÛQŒ<88j3E–¨fãèð¤T%»¨ãúCÉôÃFù0®±¥³ßÊ©zho.”^L8Ç3—nwçRÎAÓHÇÒ¤#lçû¶{W&9–ý¼œÏcŒãÆ+1®Pƒ!!/‹û0Þ~(¼¥Á@r6<—æÛ0U/iQ•i§ä(œêâÕ £¦žwÌ+LKjÇð;¿Sz‰xš|Eà á"4ÇeÚJ9¿ ½‘í{( (öT™Eva<GB&ƪ´ñÞØž9e6ëÕ5ÞZbT)Sø°äô>Ói™žr4ç9Iá8²a8Ê”“±˜ÇîRK©‡²…]æ4ÃÃýBG55>^è(s›™oò0Tõü>s|»Á5yy[¬sîÆ]'p^&˜ÎHš³ÜŸ|yšBqÂÇ1 ý‚¿þ‚ö¡Œ<>ïtN5esÌ€‚k¬¯ ·ÎÝÚ˜| w›×sDöõóe§"›Ù6b1(ï^€.u2Çf¼<ŸƒÑùßôãûY¿„Ùáî]¸/XüEüyé[Ù|¹,±E_8­Ï}#0Œ#þ8ûÖfýlüB„ò2†MƒhRŒþß\²Øרÿ®qPn'9®ÿpÔ8yKÌ»ÓR2ædã¨S®‘)\á@O0z+îÒyËgõfó{)É~„x}úÃrM—;¯žÒ¥÷¯yè&:¾é2oKï_ t$\><®¿åÐþK˜©vfeQ‹˜·¢DÎWÞÇNÎR™EOãý„„Ý—X…ã, Àq-¢ˆ?• aâMšûñ{¼¿”j†2{Œq’ž¬QõPTË@øŠ%3ÖÀ¿qR÷¬u5„3;#²e,^®˜ŠÏ¹X¡÷Bq¿•1Ib´_Ü¢ÁýŒ—0Æq±‹1E¨Ô%‹Ÿ]4Z–ÞôBkéný÷™|ì?ïÓ,BXêÊ ¤·á0ÕO¬Ëcumƒ©Dë_F²§ñ IäXÉÛ°µûK,±û,¯qjU`/š%ÚÑ1ÆàSñ²Ìõ®ž¿ŸzŽiô­TänN~¤$ž7õ÷GcîPL lBãs)-qp¥ò8<¯}œÑà|ª+]D\53…ÿyå—üŒK—~1·3L—ûkÅfH2A<{iÇIW-{DçtÆä(ÖïK“ôóm™Ó{ù^òÉ2Nd˜Ž]–í¸W‰êe¬Ý©ÃGóKPËSéé¹”}ŠÛ&VˆÌ´lÝü´‘b ýÖ™Sþ=>åùÒðòaòínnoòí>}Ìÿ󟪙ÿgÞä?" ¦“Izh¢ÉbÒ#܇«±‚°¥Ò$A*ÇW! PxéLªò©öï¹J¦#®9ô1, ¥ ù¼ø,`Эzf&#Z“4 „jo|z.&Ó:ás˜1¾oäy¿úÊûÄÁE‚¤µ¥áñ~6Z!C`ITñ C^Iåž®G1áæ¨Gauæ¨G‘‰Šõà/Õ¢Äﺺ—¡+¿‹tΗ’øÆ‚ªÍ œéz|Í÷Gcªâ”^à]}šÜòFNцe¸+TáþÍN?™ªMs0%ùÔU+žÞ`]Ìh/RÓŸ8ä$J'üܵ+¦›r¼m=ýJÍU¦û·s×~çšâòâ|õËH¡ß÷Ÿ$?cy ËàfSHO˜N¡ ¼_yghZ ‹nMÈÇ­eÊátÞ×¹U˜%fï¦Ç³nÑlààž ¸¨*y” ýÇoÇÎs®¸ð7™³3v˜¡;2ÎÙ™2¡Î[üÈ•FYyG~øù”›Ò˜ÏСP~–÷ÉbÓ…H%6¶s¥+omH§~ùºp×Öåæ14i׿û³Fó(ýÎ>.ù¯ôüQ?[TúçIòßæÆ³‚ü·³óìQþ{ˆ”ÿÌ9ŸQlÆ–yL9‰ä&ѨwéëÒaÐ {aÐõÚw$0´^À—0ÅfHhãàí©¬‚LÝéÌ…”°HÉÚɹƒ,É›T†ÛIG*ˆô(ëc jª¦œ¿àP%²”šÅ.)–@Ñe8쇉ãúíêÇW±Äê(éC¡¸‹IdÕÀ¢bÎ,lQu.HJU’ ðYaxîµÒDZyÄ¡&W:D£Ç\gZs7ŒQoFÆ1CÚÊ–™W7 ½ƒÖña]ú—8çjk-¥3®ÆZ@¹aœ²²lhíÂÛfîíY'¦9ú=óÜ‹ºp)$T–#EiA 30ý´µç}ϳ€‰«õ5)TL¼´ýê}j´2]]Ï FoÕlÌК‚¤1fwz%ÐÛÎÉ, ‰Õå:Ÿ[kMö¢°ÏÖZãäà¢.mŠPøàà¼Ñ$—9JU‡_ÕÌŠüȨNW‡ôÂî•uAJ´j¶êo/ð!ÖÂqꢯ]ð½¶Zm”æ«YvÃøÐѰP @ñÜäsøò™Qÿð­´Ã·6p‡o:G§ûßýýýi ,ÔT/­ŽÕS£™Óƒˆ§lFVßðÀ¨u^ÄÌy/B‘æh_¼±ºÏŒê"ôH3üÆ®MŒÊ‡­†³êa«aW<4ñ!ïëªÁs»<ÐÕ\•¬*F…7'ÎolœÀo£ÎṕyÙªrxnVùà¬ò!WåƒQåÈUãÈ®pd”o9bïÚcµ7Ž]ÇV…Ʊ® ¶V&ÞWF{S¡ªÚYëü8WëÜèëݦ£Î»M«Æ»M£ü–«ü–]~Ë(¿í*¿m—ß6Êï¸ÊïØåwŒò»®ò»vù]£üSWù§vù§FùFݹÔñ¹] ÕŠãƒ`à)ílžÛ­Ã]íðÿgïÝû›È‘…áý7ù=æa±YÇä 3É„=! ÝÜ613;/Ãá×±;I/vÛën'd€óÙߺèÞj_Biï±¥R©$•J¥R©ä+³cØ1 ÷^䈴<5d?̓bª˜Ï;óàœž/ðÏgÞŽ„d‹pø­ËìîxFk×néîŽ Ï/ÑXabž ÁÁ ©rømÙÞå+Év!H0K5ó 6&æi:ð‰¢› >8(Znò«Í³ØøZo·Ýh9:äA©ùVmûpÙë üÖEŽ7ö}ÌéV)L0ŠmízÅ1çØE)É(LÆ¥œa—¥$£ì]ªòÔ‹vQL1J6vþé]q9Ç.KIVáƒ}¯êÄ9naH2 ÿ¶[P1d8E!Å(ùÊ«IB²]êÕ3³Œ@_9ãùÊN:ÿô ¥[Å(Å(¸å+eË•¦!VäYM^•9¦)ÓŒò/}õ½´ë{iÀË JnwP†] SŒ’> ¨i+@MCÿizgCÓææ¦Áɯ|ð¶83dÙ+Ÿ€ze3ü+ƒÛÙðª³lßtüÿÆÝââ#ó¸™ Óó&Ù¢ÕAl†gh‡x9oßEW¼IFÿ$td¤ä_BYT<Ã{®¾2Pv£RÑj}KW}:¡ÝåI¯×‘[IØÖô> 'L á°™1ÅÞè¾#¢ƒª¸Á¢öuñ®iP©¨mñMû*l{ëÂdÑ{W'óBï]-XŸ™!Ü¡óÔÆ°xÝ.³Î?Y¾¡èEÚû}ªIµ†È¤;§3ÇÇЦãá‰ècåÊÚ “^²~øÂÿø¸‘ Â$í„´[¾œ ‚^€o ÃÆüU¿ j¯ñœÆÀ E•ÚG)²ƒ«v=5c Òwqÿ×c®¹=èõ;\Oœc]C (Žñµ_rœýï°—E}ìzÜ"ÔƒA”ÒÕL@›ö;qé§Ð^~¸;øù©FQ«³{ñ=h(§´.2&é/KoCãÃÍø q'zz|Ÿ+¨ˆ7‰ƒV§—FŒž¬qÜç|»¹ºÑà稿àUøSäªZè}èb`¤¸Û 4qê±bê)|àWñ½,„A*¹+æH/Z …&dg`~RÑ‹'}uÁFlظÅ!T/‰$ði¯Óé]’¿!⃘t•¿øÆvÈÜÂæ²*PýwáƒõPÆ2‹Ð›±ŸÅü†‹{mø‚ï_õaÒZC"[Dd¢{`œ£óhÚøðq¥"!—Æ@>x@5‹ç„w¡áëlì°Íú3øýó{•F%øÜ«ÌU ¦aÄCûÑ£÷®·otúçáþ°´¬™N¯SÃpŸEYKpi`½+L"=æ‰&ÉAòùó{•ß+É^ôh¼5Ìì|Ñ#K>(*تo¹uÏLõáC|ƒûað*¡YÑ6O/Åê'Q€ý‚/$3:¨DW×Þiì‘ô2.Œ…=BÏV_÷Dƒnœ ¤‚œ.°ú¿RŠ]¼RyZiPI~…àRý—]NƒÓ&åó(â€ËáÁ»»( ª¦L‚!ä™È Ò"TöûF/þ±(4YÓ±ƒ·Q½øˆãæÿü²“PïxÖè¹| ’+Ž)d@gÀ²î#ÒtH ¯Ëµa`2`KDˆ,GF0e¤5`I®@ŒV¡ PoådâQpy|Z:YX™w¾[•IýK&q` †5lÁ"”cCO“Ø,—#@ˆ"¹ð«Ò¢¿^¿ñH%)‘ÈŸ‡wýøoÑMH³¸«±ŽÿðõþÂ'µé ÏHíŸ˪ø>ßO‡c%ÕxJ\y„$¢Íë3Uµ[°ãX£ÐBýæ¿X’Vgu ½ÄÉ9W ‘»)¹s}[Æ'À¼ºúV c+UåÕè]Ò»¤Ž§ºzÁ=ÔUÃdÕÐpE0b,C‚€æe†½"†§M‹ì]¥«á®M´Š‰#îÏçs¯ˆÜ²8†[ F¿æQgňo3©SŒ7m–IÃ᮫Ý:ÜÂÒþÛÀIcÀ©îxö?ýñúÿ L¹½û‹Oó÷ÿVJÿŸÛø(ÿsÌoä Øs“}â^·ÿ:èšõ´Kb©âãd扳ø"êÀ”×ј…w˜ý÷Éåçî ·QC°¯*sOeaø6LbKÐq­°Ó†Ào˜ ¢Vï,‰ÿ€ßúã›(¸¤è ”$ªÄ–^Tº-=}®U%Np¬ŒòÙy"Ú^Iï.ÐÄŽÕOTcvÆ¡KªVa^‹¦‡Æ¸Ó!oWss-l3Ü5§ñ ÍlZˆB -dlR M†¯‚jÂä¬T¢É{²¸X0ÆæÄ¯¹‘ ÁÈÝ(Mó¨aÖ™^%Y8uµ\ê:õ ›žwhŠ«¼ÄÝe#6„ÊÎ`º%Áeœ÷†YjíÛSá e9¾ÃàßÌP™Äv4¡i& •2Ì;#+çŠíjmkÀ4ýíÛÖã'O"bôldº ÓäAV4O*¹{ÄR~=ùï[ÿÏa÷&טÑëÿòâüâ’³þ/=yRÞÿ¸•\ÿq̯³ìc¹nÈù£”¯,5A°ß#h˜q´{‰&§(´ƒè}«3LQ# µ_:˘  <‹>{]¢¬UŒÛªŒa A¶¦P®ý0MƒÞEÄx‰<Ð.¢H{“±·ZÁküö&OΡ¾­²:q„S¸0ÝýäÒ'wXþPY£ ?ÓIºjJ´+ ¤ª®œ…Ðl;;Ò‘  wB¾*«+„Aõç­Ý§5¼Î«?ünâo\/ñ¥xLØzJJTÐìáE/]å<>Íh˜ô½¨#6¨C¶X}ìÞ°Oi܋ʥh1/p¯[»èb‹„šw?b:]—|i˜º„oE§ØòMö«èMû†ÊzªçÁêj Âó~‰Ðµ;­ *è }%í}ƒê‡v¶þÞà•ñu{x^¿ù$¬=쪴] 0".(:ÀL.xêkî),E6CMo5àb9‚ËÎj{Q=õð–ÀÎô¿©íå¼Ý2gËXw¯µU ºŒ“çYä® f!äÂ:~3»žÒàÓ(¥rO¹JyB×$“'qÒ= ºá;2“ƒØÅËO0ÿB˜Æ¿âyI‚ ã%«ÎU0LqýIÔ 1¡w:Ë¡€·ZYê°4Þf¹g0RHŠÉs|O™r©6ç‰xtè b…šRͰ$¶¬ƒ}G=/’0u5ëÔ(ƒ;e;ôë % @vt5<ñ«4¦Š®«"JCˆÕÕ·&³xÇ„gA¤ëê¾{&P¿Ksóã4¨ê6Ö„ìcø¬ƒ È’¸ 8)ÅN:{©ä*Ù­ða’SªÓâ2A†ôðÔ;Øúíà[ï«èbYÛ íL† b;'~Áöíþuaÿ íŸ:Ô”Ù'‚<ØýÝ¿OÓà~w•Àe÷aÝ8é¥ä$XtÐ ¶z­aW,MÃ$ëÊ^€¡M#­~2ß Æ¢á`Ÿ‡¹:áe¶5N#.Šä]«‚í-—•€¸”˜'Âo‹Êð^p I㬦š Ô¢‚Ãn5ÄNÀâ›ZpâK¸ ó5 bŠ §eèâ n'8´m´Û &Ó ë¶¡ÇVUýz°“´£÷…}“—t:óPŠâ"€]±åíQL©8¨a¶vMt¦á c@HçãÝÞq=0ãúxqwÇú¹Õ´îp¡}¶eQ»¨Ë@lʈ*R4XV4(9võ.­Þ•ÑVrP„“‰FÚ8ì`)p¨%—fGŸs²x×^è׃ãÖ îÂSõ¼—ežBÒ|™Çxå<ìän ¢Ðj—ŠbÖ<è? á³äC{X¼ÃîÒí›taL–æÐn¶Uƒ8˜…’‹jö>-^ÛÏÙ ‹vq„xê{edòâ7Ì„ÅúŒ/ITÂ쑊 {м?fÃòU4™Ç¿lŽN3%ˆRòú™¿„…ú™(ÿÌ(JÏ&(ºóBÞyaç¨K^@%Øp±lT«Ôº&;š€,9i^c—£Ë[€~Øù;ª9øÕÎáD|µò¶¶DŽ}*ýù¾ÌxnS‚aÈFQùü/cà±áwGƒïÚÐM™Þ´Ò·÷Dúöž•N±‰FáG› dD£‘¬ €œºŽöÆÔudS÷ra$üËzq4ô¢ ½4zɆ^ ½lC¯Œ†^±¡†~lCƒ,s¤FÌîå$ŽôvQ\*ç2oGdìH14×(¬ê‚Óx(ßq<ÿ|&[߬œÝ‘]µkRN‘ÇW†1³Fá„|Ž,Xr<£§ù=Rã¥æA^hŽnè¡A4ÇHO5†‰óȯxûHdáW;®É\úaçs¬±QÕ1ˆ] oÉlünçÒý ™M?Üüƒý:~8ù¿íêâðÝÎ}%løæä¨nxe÷‡0ÕH‚°Ël.`Ï!gmdd—|9ºÌKšžÃYøÝνj6íE³)ù¢iî+‘üÊN=—^Ù<ðˆÔ#૎ƒð’ÝIUÚâ!(Üâ'o¾Ü8z‹±ÝUýõ^»½¦Ë‚вÓü͆Ç[8K6ø·—RŒ‰ûthIRú>´Kà €¢-4Y !bFÙ¥æÅ V ôáäù£†à%‘ûá€]Éjì= #átCœ XÔë“â}?é‘™PO’é›Cü(èôz}òÖ£_<Ö¿ˆWÔúêC_‹ý3Z½ZLqo!c?$s,JŽŠl;MÞÞÇ^J¯È£?(âŒÃ\¥âÑÔ×òéž ªD¥ Z¾“4 &^ ó¸`Áó$ª7täÔ/¬GNlñš 0¯!Ä›=kæ«õÑC–o®½£BÖx%ÕgV Û:Ëɶ,íè33UŽÆÿ|±‰ÇÃëª@=À%a‹Õ)„ñ:þu(¬]$ÉOêa ð ×Kss RgU½n)*!wô›¤÷C¦¹Þ û½E2‹)º]¸u± ÷Ò¬M3ÒÑ”ç­ÞØ Q’ÂTL¬‚5ëÂÖဩ½£•Ra,HIµü½üO F , «v%è±:kã²èFÔâlÖ<ˆQ»[ƒÑK"ùˆù™#ßã¯:ÑiVW¿jD…”`naLS…ñ‡.Œ¿ta!±|'ÊD<±áé)ÝnÀ¹fbU2Tb ¹H¨‰›VîvY–±óE®Pn0MU„?t-ø«f°«ûS°Î¯&&ÖOIU†±ÊòöÆ,Ì{»4¥éâbb‘U<³0 ‡Õ:’§K€ÓLçÉÌ9…ó³yzE³(–‰6;¸)±*v!š^J6 æ ZîƒôkY7*ä}76*ÆÈA3’ãH¶XoÆRou»äß)ͪ™¤×ÓC%UÝÎ;4FøÐì­CKÏrY‰ïÕ®í]%¬òîW»òW»&öW»u ƒÉä9ä&ò ùÁäh:ÍaÇ#þÜ„?²&ü‘=áŠk Ó_® :TÌmÜ÷_•àO³ŠªXÜ]ÓMx¸Øåia4Äꨭ]ž^·l]L“’âµC9ÒÙà,™)cuÕn”ƬlwG8ɱ‹[ÎhatÛîŽÙ¤Ýºò›% ȼº)Åt Ÿ=t¦*b³7>MíVÓP{È Ê’7¾šDÆÐméÆmm Xtï«æ(§/cô“ÓJ$µG°­Íê®ýžBÆRí-H®‹#‹,ʶÚÝEš;Ú6m‚ÙݦLd" ­¦ÊY;  -²äØZŒçGÛ¶žÇô®`?Ú6Eû‘µÒM%S¼“~E«^*,½*z†È1;Ë“*‹&éõàtãß$Nä¹ÒI$›”ʰáµ@œ¹>“iTü&ö‘?Ä‘¨v™™ªÊX]µò ôºÇ›G¶·jN1W‹¦µX4a­°ÊZ*ƒWžúY‡ÖU ¡{]D޵¹6ê¬ÕU§££Ÿ^æTËæË\k^š­yiµæe¡&m£¾!œ[yr·r¨·LÔ[ê­ QN1;é};š›Z™[ÕÍX…º§R ècÖ ¥¬®æI;,âÒ®¼j÷!<,t¡GhÁ¿,wÉš¶eôûýŸI`ðWQxÐ僮 B¶[3c‰§±Ú[Ø'³L­âè¦-Öšºh³Yõ+vìJ{iìxÁŸÙàÏôNÎ þÊWJeã•\8HYe„Ÿ”êúé§mç…CÝÎ MßÎ •ä±e×HŽ[ªBüå/úÊé ô»RÅ^ù{}±œB‡F¡C³d<9ºÛ{vÑmµ nlïu(z”¹ŠŽeF‡ÂOoir]¶—Iô`Vvøá-‡îËV1ôb–¥à»ŸTtÖ³ EŸ=E&üð–C÷M«zqÊRðÝ[½°¬BèŒ% Áww —·Ý;†-˜åf•ˆã·a—ÎnbvÔ²®¡Q¸¸ IïÊ÷^;ò½–…’½–ljø–€K¥štQ‚E?‚ã5…’ŽU ùiçl7ûMËv³ß´m7ûè• =í¥;¸ç蕪r9™nʇqÌ-‘q²›Szži›Ñ3Ãfô̲¡ûº#Ý}Ý}ö†iå€_Ö.{ã°®0hV ·™œN‰Š(ú¥é¢ŸdfÈF,·ÒÏLƒ:<™ªü¡«¡8ì¸2+ša'EKäªvjÊq1&j>Æ_'ãOKn°§qeÈðÍu0sªÑ½œ`ö°xMÀÀgéIÒëÇtÕΫ®Ö$Ò]v“é–%ãØ¬^Þ¡»4!ÅC$,I¼¯‘¤ÉKQ‰Á1KñÆÆ0Må¶4âi ƒ¦ÇÓÂÉ[Máž'RmÔK¹ o] u‘+Ò›¤¶º­03ìè¾1®pÙŒÕU^ÖW¢|#´Ò “åwÑPéz‹YúW­|ÚóOõñÅÿéDïo´Ž1ñÿV–»ï.=^.ãÿÝÊGÆÿ1/ ÿ³Âáž¡Åb7<é ¬7ˆ# È1q°  ŠÄšDŠJGš¨ #t°u°:K±ð¡”iÇÏCl6;Ü–qofæçd"ùƒ¾z¶»³TFå©À±Ù‰ÂdŽãÔp¥ôï„"._PmS¨ö$ŠÚH÷ï>¿êPíq‚Á‡tÐr¨?€Æ .dÈ®óÞåßÝç©W4wJ1¸Ž|á¼xš{ïÔx„Ó~ètÿõßT0èjœ×9ùQNv¸ìâqKNÆ ëAµªûá½úWÅö«©pâÞzËV„õàÁIM<›°®Ä‹™  Ý6ìd`½«É0$‚Qz«šÞØ>x^¯ód­ BèìÓSÁ@­^/ZS˜IU?ŽZÑeÌaN)|!ÃsD}XhuÈ- XeØnc0n줪€_]‡Ÿ°ÖþÀ¿î,Ê(h7…à/ðZÏQOÑEõQc­\TF&JXç…kóýfÍÞþ³ˆêË‹5ãêŠuo%z_Äîs¸#éeMÞj¡k&Ï“:Åã¥d š;{¿Õâ º6¾þzcîÿ çþx³6Koa¬¿žŸû ~àÍŒ>½þzŽ ¹é0ãÖ«¨è§èÓCÀ~‰Ýþú÷à÷ìÍ÷ÍÏ;û;Íݧ•Ÿ+ à§ÙŒ˜+Féê qkÁo¿=Û~±³ÏG. q2ŒªØŽŸ1íiåiÅW,ÉÒ¢ª5# 0ÍІš‡¾Z«?\]aÐФg|­åãk‚œ¾|!ðùYOp^Eÿï‰E~%¨x›ùá2ýô7où€U×O\¤²îíF/èï•Êëÿý½ò{òæ!~Ÿ¸Ü(ö€J=˜¸Pc< ÉI˜•°·*Î0ÆÛ AÍØne¬M˜›„IöDá¶ÓžV| ‹^PÉGž¬FA΢¿”E=ÏÜ9å.$f‘¹0SP*DSµrB'öºäáÉAT+þáúÛBmô”/`˜¿Þ«H÷·Êšh!]ÅÛ€ñ6^¿£ãè¥ æ)oãýõÞñáÆæö…Mûë½æÆ³5º¡7¶>¡º²fCnÖF󣃇ùÜÀ¢÷uÓàù=©øCæ –xý¿?¿ù›$7£c«W…Ñæ5ö5lRsïÜ£Ç;Ä`¼$Ë•9ž¨çkørÜ %Réˆj!O×7ãxÇnä×Ö×oúãÝÿÅ'Ö F€³ÿ[X^tã¿//.,•û¿Ûø¨ýù”`{ÃA+Jyå”û:Š “ðl“²ìj®32c¥ûd®Ö@½ßv L·ÿD¶ËÙ Ja &¢´Š´YŠíž úžKÎéºVÂ^ø.Ê%¼·¢Óö*©s“üƒ¢‚XšÓÙ{ñ)Ç`ÚÕýí_ßnîáõÇÿ÷è$Lã”ú~¨é% «¯ÂVK&ÝÃG] £Ñxô*‹;.|:iǧ³vÕow_ÁâvŒÕ˽vв*áÎAþA` ”O ©æåx"V©ÎθEÖƒÝ7°A &DÑή d±¬MAVÚèÖkSÖvÄiëfÂâ°×ù5ÎÎ7g@Ò:þc¥ T1ùÕÌæ:÷³HÔé.›(ÑI«X×ßåÈ,ç4kœŠW (@7ðöÉ0†ÝY¨^lÈzÁ9…3çÇgtO0 z¦¦!žJ¢ÍÙû “ »ê%™uzn‰ëïPaþ'Y@½ARí¦gu*ˇÍ:¡Ã ÂÊ«GF ðš “¢Æ™ã{„Ø<˜#^?Jv.¢z€&Û'‚ÐÏD”“XxÚ¯‹Anà»KIøÄq‚–,'ýa¶_å¢õ ¡—窲Gê½5õ¤Û¹©=‡§ÇCë…•:Žt§×{¢•ÏU‰Ü÷‚?1lùú—bª)|]d¾pr“ˆ<ÓÁG ø¥flµ¶ B´6Gïåþ^¤ó/A¿·µvç´ ßús/ñgôú¿ðäɲ»ÿ[†?åú ¹þyùëFÎIO ¹Ä›ñ¦ >ඤ-OF) Ú" Èb|ý‚›â ïT‰o|mvq½>=˜}œÁL mïSa =f[©À¶ÿÂQc”ZÒd=¨ÞŠx^§úPWGÑϽü¨Y²ÓˆÞÞ;@¾Š%ñAî]Œ0iüNYAúpÐñ¤öã÷é:T0¥‹uÏÛ:Q7öq§Ñí§$B¿7ƒ.¨i½v*é64†,ëïQ¦ÐÊf¢ÿ~.1Kïã3®«V ˆz'EêT²~C‰ð=x¢Õ<lÌÖË´‰cQ©Ü\«vp-jb3ìFeW‚Xò×V?ñE™ËÞ m$ÑšqÒ{o$ ÂvÜ3~§Ã“nl¢AÆ1‹ÇéäÏó¸Ý¦ t2!î†g&€Ñ…ÙÕ„Ý€]v`Š)÷Ýâùs4åì콨Â5¦±¹˜œž$ì’ì>d ]h(µÜH;éeY¯k§¡›—2ˆÏÎ$£S(uÂ~aX_×XÜ?¦iy [>ñu©ÆK$¿|©A9 ÓH¼Ÿxkíá›SÓ¶ÈGý¥óÕîqvÕqeJŠiŒ½§-«RÒÿqé°ÒZñ ÕqÒ º)uBºvÝÇçaN¦˜&ÅV ¹×HÑê´~¯se§Ó›h6„ª°!;®!¸ÇÇË…›øvÕÜzkÖZirŽZ‰¸¢;IIXßJ3Ú$Ò'l•„ö·K=x„ªŠØ6ãâöp*ÅÅ|kv9´ Z r/¹à£:x50JŸ¢Œ÷¼å²qÛ Zë‰Äf±þЇ6ö3‡¤O6¼ŒÎÿásVQÓq d|輕:õcû¿Ãø€IÑQ-Å\JñeȦ b0Ñ©G†ÃõÄØkqÛÆ¢‰´ÓQ'ßóœqáÏÈâŒæ‹õ2" c¾7õˆ#ª©¥EC¿¶¢ó^§ CÈÇòÔO$HµùaÍn¢¸‹U0t\•ÎT¬ ‚6È÷ ì'šœÞ5å-('•žfÊ¥^ø“C²Z󵃕Íäõ@¿¿G¿¨—¿d_4ÕÛWx,¥ù€^J þH8à¯ÎP¬D¬4ÌÕ!Ç€„Óêýƒæöªûäa˜2*}|øsº è""\®=4Y S‡á×'1½Ú5Pe(>Ä×0W…¨Ûi©8éõ:9ìØíƳ;V=¹z<“ˆ½89ðòMU,ž«øðÙˆdüÏÇ´µ;9|TÇ¥<>*(&Æ'jŸ^ྌÛÙ¹¿?‹9B¼×1‚»rH˜9-,"BOŽsp;¹<ù^†¬šƒa{ÄsWnWõÞµÁiuùÎb+㽟‡ËºgÐ&0WÅÊkÂ2¬›1Íòw4Õ¤ÄÀáa;²Ç=E÷èUi°àåXú~Ç@DÒŸ˜N‘uÂùiÁ¤Ð‘šµ"ˆ~Øn€ñ„VûŬ<‡ >Wk€ž_ë?’1F¶°sôȹ`°1m ñI¥“Ž–â…hÉÓO†C2^ôq:ÞÜÕL#—éÍíÍéXêBU¬¶‡cªuž³)p z^š fïrömþô./7wвn¬e’Ÿ}üv ýßËŒ£D¿6ñgiµà|=A3¼¡9­[ƹïÁ™ÏF8ji³™ÓÁvr)Ïr)¯r)â–~®è΋<(ݮϥ¾ÊWƒ÷âÝ´í=_Ýx¡ÝMÆçnÝ^Ï•Ç[æn"^!wÓð†xãN3ÑÜN‰ “G~Ù½ŽW¤‰¥uó®ò+K‚ètÐbÊÔÔðl-Ì9³S8F2ü¨™2rÁ;çkCþÌ‹Q™Ã4ê’¼Èõ{œv• ±;G?¨§tÄv„V9Ì“UÇ_£c¯ßw£´Tõ`Ób²°ßǰø5(‚üâ¡k@pbEJ¾ö&¹“•2/·{·Æãh7_”› Žˆ¬­M' ‘ÃDÖpÌOö~fãp"¹¡ Ð/hÚsY¾†fj`êü¥¡Î'Ær§od$xµ½Ú²¼¾ïDÉ™ó£¤ÍÄSÀn¯~—ËÓw6i#”MÏk¢¶Öa¼ZU\ª–á'AÖØw,eÊ(u樜%ŠO PÂ!ר3%Ô$ˆÖ§q©0Q“©ºaZƒUC@B§Ó­mIOä\cÈ@CãQ£ÚçS_ƒ^{¤ÖƒWßg—;Gq³wL„“Ðâm?¼æÅ}ÿÇú~àg´ÿÇâÂü²ëÿQÞÿ¾­ðÿø}?,Ç`Õt14Œq˧¤·ŽuÕ˜Øýd],'bg /ÕSxß[»¤ðõïÊ‹ífE{¥ˆDPJ ›ªNï¸ÁØÂ4wj·.ºþ5à­#ž77ïŠâm`våimªECPÍ“n*²ÇÇ¿mU—‘½ùr{óŸÏþ]1ÝWDÞÑÆÖÎAÅòc9°7ÞÛ‘5²G‹,³}¬zZø RúóÝíŠåâ"2^îlmmïWLg‘³³·ñbûZã\Ï—ÿdgÔU»Ñ ”YMª3ý˜ŽôÖyu¦…Y:ò#}Óž3Þg Ó3ö½¾úƒÃŠå¼!Ò÷ _U— /‘õì Ù<Ø«çà"cwû¹TÚÊÉA¥·¯3@h]VTÔŽÜD58ýêq»™ª_ #üq$ËÓ¹ÃͶ“›ÄõŒošá›óµ†]yðÈLØpîîì_o¾yGYÖ0ªLŸžÏËåÓq·tò¶šÏUó­&×!AíÖÎñ¦”Íì?$e3¬ÈG’„“Žäü£ÍÝë 1V]5ÕÚÍco"ã8+×8ò0R«Èfst ”·‘\æv«Ø.G²£¶Ÿo¼Ú½ÞÀ"M²µuª¯.Ñh¼éäíis™X€yùT:'‰äÝÝŠáž$R1PÅgH4ª¸ŽÕÔ m®Õ¥RéŸTú'}_þI¥_QéW”~E¥_QéWTúM6œ¥_QéWTú•~EÓ½–~Eã¼Ò¯¨ô+*ýŠJ¿¢ ô+*ýо¿¢òóm|ÿ/ügi±ÑÎÚ7XÇhÿ¯å'—çü¿Jÿ¯Ûø`àq!Iƒà×¥Í`K¸^ä²…ÎZ1 )Ž_Bú€¶h{áàݰì†ÉÙ]%$)«Ñ Äï ÌâÓDÔÉU½,Bù…uu£î º¡2a2ñy•uñ…8á·zIö'T #}a¯ŽvéèeõÑ£ËËËÆåR£78{4«l…Y:É0JÛáUð0b|Ù…eXš~úé‰Üfç½Á*¸ˆ‚£ðì,ʲàçv:øÆùTƒ*·³0î¦F1(-Ç$oCCûèÓƒn’óèF«àÁOZŠÒ ¶ÎÇI„º:%Ql!\i TLÝÅÆ|P=z¾,üøøqM÷Ó¯q;Üm(Ó» $€Îñ §”ú±Õ"m—çÑ€žW¹RHαÙ'Q”`4óËDP£+CÆm1 ¹Ê"å|(X…ЦÝ^zY%F °=d[*tD«C«æR :HéUÑÔê6û§çQ„žÏPÁ@E  s4/zq›ÄÖ§5Š…ƈlâòôF¤Ad|vÁÄ]¼Wô2è¯ÿãAÔÖ=º³U6w7ŽÍ¦Ú}‰U‹cè/ômLoïÜÌÍûüü‡bîsê/teîÑ#àíG¶š[šÇÈ ñÑ#ôŽRss83ãVØžY·ª³ðSð@ÎôOmx”k'5 ä‘ cjíÜÜz$DmåyD:F_ÆxÚœ‡oïˆ*;û›»¯¶¶+ÅÕîtqèvtØ´¸ªQÕŠ‡ƒçH(VÈÆT1‡¤… ?F³·³·­”,<¨ã´FïJ˜¾ +‹ F1·iÍÃ9áæˆîŠ¸Ó<8nZõTä.™âçÀ ™ÉI.V’‚›0`~w)©GÑö3Åíæˆ_žcHÖ+c„}•Ä(™ÑÑ—¢€»½:×ÍRÇQDÍþqþÇ úa?­Ôhbaê“%HÝŠZÁOˆH ÕŽz;É`‚Ás[‡.zÅTX@}¤ûè?âéy "øìéäz ö>t8Œ•— _.~|¹ôñåòÇ—+_>®Ø€ô`åÕ.Ÿ.~ è¨ÏéòupßeÕ׳‰¤†—Š³Ø¢œÐäP“…šùkœ´ÑõË‹ v@yÇ÷#$C‹1 Æ0;^®„^‹Üâa¡þJcËór£ÙDILeÙÅMkjŠÁ½½ÃÝí-êõßÞ$I5ι^ùÛB¥Î_—¥ŠÄYˆâÞÑыϞ¡Zy½¯32èßU.¸^¹÷ü9îš+ŸÕH5悃`{︗ђŸZFM¨.`KŸÔìfª©'hªnä’Ÿ’#tÈ€©ÑŠÚˆú¤á;§£Ÿ)5€MÊUôBü ò‘?¢ bý21‹“ÀSà³ÉTQÒ¥–Öíµ£Q‹Œ³ÖzBp¢T†™‚ý ë«ÐÐ̉ådÃԺ܉.¢Ža'Â'TïkîS»øC§¥sø]¤ ÒXàñLÝþyª| è.'hša¿3L~w0 ^.̽|L%…ãWnßbøËTP^ß'… ©’‡;ò(Gœ‚ÃÿF8Üh'òa~$R¥t‚ºI»cT ¶¶ˆÆÝœêF žÜH‘[{X¼/XצŽgäLxUûµ!‡j— äÇÀ&D;ÔI’ BE'C$Yúýjpï%}‚ÿùæYwÒ¿ç:É™£ÒüŒJ u~éyŸÿÈé¬ò‰Ü¢Lrr,ʼ™ŽÌµ×Iòæ<€ÿ1ÃÊŽµ$€è6i—Ïû¸Ñ2 Thf2ù8‘¼Th3„Å}·óÖXrr¿Õ¾P„­©s“ë¢m®ÀQ£¶Û°6§0{®Õ ãf7^:\âuß)jâÜ" ¢>³ûÏPkdAÊ÷SX–Ötw!Ó©ÛL Lùž%­ÂÈy‰*g6íÓsXéUš¡@­Ì»;/ö× ÐsE ÄuO#Šä5nW7’Ôˆ—sÇÏWGذWt 0;mCµ‘Žº‚•³Û<#"›ƒè¼9 y1_S±‡°(™êÄÆÙÀ€þ#ª†Ò— qå|·Ð*|1ª0dGøf‚¿0ûUÛqÚ\ 8¼t’¥vÓ0úñõ¾nؽÚj€Paãs"N…Å hÀaRsú§tŸó…ÛO᪘`Ruf›]œ&2ÐOÕ.Q+—®d=~¹q¸ 3/„|äû ñ:H­òÔÛ<88Ú:6¥9Z…CE /Ì8Ç’!Ú¾µ Bp)žŒŸâ6wšC!kvæ•0:æT:˜ÅíÃjvÏréŽÐSéÈ3¸/šdÉVy‡›€@—WE0_f‹âé@ÛŠly†›ІRTKÎñdA¸ti¹*ÎQ«ü·VŒµ±¤']wEéÐÚTGÛÿzµsÄBßÿЍ”s¤> Ë*¾`t&lD³£e]Ô˜X2åÔˆ&MG™ h;(,`Ò­Axš­mü3GÙ)?uBæöÜü|#SŽYô!¢ÎiG%êÕ=Ò\Ó8iñ#ë|8ѯR³¨š'§Ñ%hê¨p²d!hŸ BØ]žÑaNœ5,3ôQÔá—Îã> S9‰I•ƒ)ŠÏ¶bØ>:lª½f/ØR‚MK¯sÒG Êëå9´ æ0ÞR7¨xª,<jTØVsÅé5s!){ž¾æ E®P‹ u©s̲tБƒn×ð<Œðñ&‰ Í9è²ò‰sôèúZH7®Økð–ŸÏ~¨w=»?T(…†ÈO/$[©ásAóL¢òÑB{_tϸÁ(‘ûíSu.âÈ9¯hœ/°¤Þç9v½%µ ðWZRñH&Þ„G"g—}”äJŪ ŸòJ8ŠÉ}N‰¨³ál¾M–áò~pÈE*û¯öžmUòßÈQõX =ÊÅQp½ÖÏ QlÙigçÌÔjç—Dg½, «h}àÎRS6ÞÃYÄú0mâ¡ù÷Cñ)JbaqÜ@Zï:ݹ0¾dÙ ¡NQšƒ:½0ã‰28‹Å9‹TvÓáIýwHG=ây1rÑywÁHr&u¾î\©f½þG¾4ý‘ï$%µs{s€ÏÀ´§@Û A½]×£§”Pœ„^gæ,2VA9‹PˆË&㩼¥Øº‹¨ÉÊ<‡ðf2¨gW4°¨¦i„ÞŒÜ]ààÉ”Ñò ø@ÓÿiHW\åÖÄÔµÙ%4¸/8ÏA•*^€&Ã)$ì::ôâ¾»ãqÐŒÏlû¢NÐÝ/gÃŒvQËŤXTOçq§aƒW,87Z>ÞÄÁîŰé¤/5Ð'€q)^o£:L­§¼8áo¹”_‚®ve¯Ø[!·Fõðʦ%hOx+\äÔÍMȳz@øíübøáE(O!@8N" #"…DÂb±iÕF'™N‡QG ®Ãm¥€5‚ ö5– .êU>Æâ-Àð„i¥5q6è’}ÄX›–HÔÌ."ù¢Ñ_8àUè´ŸÑüTkL¨Þ!âÅáZƒ4^<¼¡‹Òê¸XêðX¢§ êç\’.äŸDçáEÜ4‚~ýÙDT„(oc¥¢¢cD×AË=éú(¦1ÞPèôSJúçl Pø7‚ÏCHŸ£=²8*w~ƒ’¨¿c I_1e:nn±—ú/»¯L×mF„ :¹Gk%[ì IÁGÿuÚk\ ×*éN¢JÅÇ PÁ0qÕ3¸­¯MPtúV“Ï#|ö|k‹~ÄYj‚:£¶µËå×VóãÖVíoÖ)ﮡ/p—ªøbíÒ= "Þ,P¾¶˜3­Eåmq9e¬É–˜]ìÖ}]ƒ‘~ì}Gõ`÷ã«]1Uª»;Ø4Í7ðÙ§qÅžç÷/1m;¯#Ä-u|Féõ`±,Õ•—zÿ‘x†Ó韇j£Ï[=hi@Tù†úÖܨÏêÁ¦ŒFX§ 7̸Äô_¬awRv§ìÐ; «ø‘ÇõÆ> P±7Ï19Gø›5ß9ßfî[eRµ;Þé-ÝŸx¥b±*¿-²’4ЂÌXâ‚m¥a]½ŒwQ•ß<5I,ØÃS¡9Ói¢<àR‚0¯ía+æèº |Œ³’³á®7*h u³·-d²ž¦ø*²§s¹l¥0·xWOËIÏ'_O´žàÞ7'ˆLÇÑD"âÊ«;u’òtsý§åE¦}…2óî~ÜJÃVÜ=òQxò½ÛèŠñ£Ái K¢o›¡¯ì¯oË#T¹y7S#ª{>!–AÎ<‰²Kt¥.(u$\¶b‹)d,RmI^CS²ì ZÏðB† _j«á¢¸{ŒƒÜ)ÙÒ¿’(vŒã•=÷ º–+âþ¾N¸oL¯<ÏÔ-ìIu0!¦‡¯%|^‚½I¡hÞ›z‡­òßšÃ_h†GûN@ï¤éì(B‰ªíË‚Y±Ø«€Œ¥u !vppiqGÇá¡lžëÏM Ox¹=JOæ®æ;þ÷¡(Úª[lxBw%ý¾Ž¡ oÐ'<ÆAJÐãeDdO0uÙ‰Ÿdø«¼á÷wøŠ.)··E/·7¶øÊ_ž“åkÁßªš²š­if6)= mG~Öe2úS!åÔÄ~:hXˆÙ!ÝãIA“¸TjÇ= v2¼ï4„mÄI$Oðö3Ž˜8óÂT¸ œEz¾ÚhÄâ@®¿ ‹X{Ó(nGú·œ©J‹áB4”^‘Ñ…™oø£ Ö¾!,Ù5g°~¥9/)ò³Ž"׫?YÂka”/+Þüä‚D.Üë¡ëözøôÜ#h~ô¾ ž{ÆŠ2ó3ú¼m®Wx—ôè$ {Bå©¶œ³û »Œad 2Hp«µ0ÜN"_"$“ ºÙýa]À®Ðã¶1¢xƒZe¸9÷Šˆ»’¨…]>ˆ;WúÆ’`D$Lkˆ·Ñ ¬Êê–<©(N ŸTõ@j ø 5ôLȈ2KR†˜-lqD­+éò,1æŽÊ©¡^æÂ-½Ð Ÿ7·[ u} F±¼”é@Ø‹ïáU#˜—½úc¹YsÐæ"zO%ØßØÛÆ4K^’ÑH8y«)Æ&ŸÃWP€¦ëd°–3høñÞ" Ӵ׊éäÚÄæ Q^îæ**æe`½„‰ÐMAô†¿tÆ‘±‘HdqÖëXšì«.̯§=ç,N„É]˜ïtÀ®.³CçŒZŽÕƒH“/Hj1-nàF'¨ü²}tŒÊ¥nÏwþ }ÿà¾KkíÁä‘wèÉSµRáT§›Åu}DÿwOð¢bÎ’†$—4£„erA ­£˜]3XæËÇÿsâ?âm ¹›~xtüÇù•'+óNüÇå+ã?Þ‡åc^ôð¨g}鸾®Æº}žõ„L;Ætf¤=í’‰wc1tÙC²i§JºÉȹ—|÷€TñšoŸé|OÔûIüÌoC¿¡Ì=5’T‰L¾" K¨§TŠy­ tß½Ð*FU~Èù?·æT`8´pûéè¾{%ß&nØïö8˜¶ÀÖ®zÌÇnªxÑGú4 ÑË# V¥?;2›°»c‡Ä«è67Þ¾<Ú~ޔЏÉŠù˜ÅªšOö0™hh­4"d5qÜê ˜šº]ö[%ºÄÀéo¬ó–‰~»y°{|¸±”Z/uä¨#3ßÖ4•oÝDå³2zÝzMŸÔ“ñõÉÈ? ÚG#çD>Øxf¤ijz¾Î…~oBed CS'odÃt­&õà¼=¨IÀ—ÉŒ¡ÔŽ?|Q5x@Dˆ/(õÉÄu¨ºE :üàC!þZEaz#§§²ä«ÝÂÿ`ý4ì¤x¯ãÊACð’ÉA1ösYÆ¡ÜrPnåPúÊ 9 ;ôÈêáE-ËSt(Îauünày¦ð<;úÀមl‹N!'wrwçƒj);µÛíP«´*$RÔ'‰mãƒÂ}=8>ØãíªõÖˆèJ# ¾•‚÷‹„ ;A³Ž|ºR?'%©$™Ek,•æb©)ÆÃ7A%ÈCg4¬÷¡,|ž´ êx™«ã¥ýúÑzÀìe?äTÓÉ'NH"›ð¬$a“›¤%fC”Œ•6?²ŸÕ6b‰úÛh6r+7Z[ßæhmM2ZŸÓ¶¯8Z°J¯î$ý_p㻿qû¿¥Å'Üýßâ“årÿwØÿc>n÷·mïþQ–]ÍQĶCÂÖ,DQnãv8ðmÛú2UL¬þ0£@«äwƒJç0‰åc2™r¦ •ÁÙÄçJA¥˜(2Ç«¢j¢^Š™í$?Øß.Ìœ®{@´.ÄwŽÅ#,DsŽ`"6Gi@C„RáêÁñüB^áŸêGfsZ&`*S ˜ À4HJÑŽôÖxþn= »çæ=“C¯~qÆÇ@½—'h¯ÉlRLŠsùˆc=¨×†˜Šª*à°¤—¨ÈQn¡øBäø]™¼>:€U’›ïk˜~VUîûôˆ°ÈRçêUÖ™uÆÅšª~¬U–VEbéjg•0‘Ê ç¬œ_nÊÁž{`_À¶ÔS‹¸ñc¾ˆņ̃]È|ÿ3WlØ!ÿV›,ùørš¢zÙ°üRR2ÓïYàæ»`V!ñèÇàE‘!ùå´›5Cÿ,<«¯ßÔx]k…ÙëÊÏ•z@É•§•7Š­¿Ët"’ãÚ’«˜¹Oš¶š0÷£š\¥e>‹¾‚4i˜7Óœ™!Î|Þ`ûP¹Ÿ®ÿÿü^©¯Ÿ7ŽAwÖ¥ùwú¦6¢Åí#*¸Ÿ^9M[FŸ£o{Ñïì7ƒ$þ­PG0Yãò%²F7ìâÝ H—ð”Àq¨Ån`P´ÎàÅ(@#¿Òu®J@?N1l4þ|Ê?»xšïƒõ§Á{ƈëòC°º*8Óå,6ÛNÚÈ8¿CóØ#‹É´“9‚Øæ9Ì©zرf`•z™4iºl]î¢?¢½j¨%ã^å÷¤¢€ùv~!hP‘O®î4·Wƒž€^ò5ÝvÂ5AU¨YœLQ T:ã<Á÷n(IåÕuÜ'hzÓ(5!¨¾­o±êjÍìM~Ô¾ «K·Nû|ÓìDàtárhHa¡©æ¬FöX€-ì÷ƒ*°Á ²‹8ý¤#ù¶ªeï3DTûü¸‘(„ÉkªÓ1­fc@£’0(é-a"Ù3Cb‘x«ò²ü/FóS"0HˆÉáŸ@r–¨•¤^•½yáZjojk²„A¨Ç “âuþ©× <º?Bßý‰v ¢Ó<õÑ@V’í†vgkbO‡÷5= ;Ö˜þA/Щ®8е$Œ‡ÁwwxVå´KèD ù¢TÂ7ÝâRs-´£ÄR;,7ØÑ$üÍÝjâ^ÒÛ¤­¦ï¼c÷ïOh/ê›U¢†-qRî©akªÝZÍ¥mòâ!1ºÕÎÖ¸îvûZçp-š„™@Zör0dªâ%/ åTÁ:®à¶>bšPÍÍbn’P¶<ÓGÖ•GeM–ܬÄsÄó4¤ÔT‹ÂE^ýò |sªåàÕ'Êä,êµÆjËh¬¹¥ª 8Ú…íõ°…ˆ/Ã8B¹l`Ãu„Oeëò ¶®_•uæÂ^hø[oœ˜’ÕÐÛ—l“1–Î_6í•“î\éî<:ø”µ@¤Y[Ý]Dm€\ÌF/Ó:÷å6žõ©lî—khUÖ(ÓÊ@ŽbÜ«Êt×| x†§§56Ññ(Vˆ{&-ONc9¨¡Ó›½Z¦pN¥B?D1‘ãhcMeµ;ªÒDÆÀ[Däy áS²e Ë[ß-(Yþöì4‹Û³Óô·gC8ù±Câ êà?uvå»»Þ°Vs<#TRÑš2ýhû¹–èøp’±.mïª, ÀÊùÅȹ0rèú¤Ö·‘Zs…(6Cå­þ•š+Kö^ðF0´(:¿Z±Åíl –X×Eêºx· Îo¨Ý ³-ß{auàñÑfÅ>Ì´jÖÒ«WE ˳(ÇþEÙ¿¢NºÞYvÜTêÁàž0U;ÿÂÍçwT>÷œ‘¿s¼gk6üŒƒn‡Ÿ)2<ŸŒn]§ouö?1žÞqôíçI@UZ)ßÐ[gAŠ¥jmmÛ£@æpšO_‰®7Ôל˜Ü¯î줨ëBjÑŽú“PP«6‚ùÄ“öd .µU×Wí´[÷2†,þÀÆ/ñçX+ä¾Í £lX ƒœ\³©Z·ÿä«Êª#)—мGÍ“=5M aŽ.át_H‰<ÏÚÝæPûððãÌãM˜ FŸö¢¨ qv›Ÿ‚\‰¹ÇÜD¡½½ô5ÎÜJƒ‘ÖXX¡ÁÉ`êº N&­¬*4X].K>§`]A´¾³OåZfŸ3Õ3¾9a°*¦ÛÞ²Ž¹D(µÉìµ{ÿÞÝÞa;©†š(ôÂHkâiç´TLŒÿD¼Ï%¦“!¢±ò$[kÌ]“m؆4žq.ïÈà]¢E¸—gÃØvÉ’Óµ ­ÛW‹lCŽõÀA‚j¶øâÝßDÂBQZ“F^q9\?R.o¬[Ö1ΧïšúC—'›±9­Ž³&«Ù.òH\§žÇWJ¥:ÍO„’Êñ‰¼Ú\ … üƒÏž¢%^.MkuÅŸ Vexul™É´Øö!ÆP*äyh&ÙîÕ óJ ¶|Ê(xEÖs·”Ôèbx[¬¨èz¹þõš‰?¯YM±A#g#ÍòÃ÷ÙE&¯][¿‘Ï¸Ž¥XÿR·¡\uÝæ·:çÙÆæ?_¼ÚßÒ ¹ªÔìg/lEBc‚àôÒ{(´™SGf"¹V×[¹nö†•MuG¦èÔcº¦N¨Y#€±…äó¶Ä„(”9 Øæ,„Ë!wÌÉžb[ùÚV¶©Ê/ª¨äØCT¤Ãwfû¥m±>T¹èÆá(%«1EHUÝ?ôyDø*¨)ðÜ|ƒ¥H}f¬·OÓ^‰(4/Æ3ùEê$ åd:Ë&¨—ÛûŽ(3ŒÂ^;²¯=ÈÅâvu¤¨A‚÷uƒv¶$¡±©ݲIÄÓXcE`nh]¥Þ+Z\]0ªx²%XL~¬Rx£œþÄ/«ãº#€B¯Åܺ^§ŒÉ€>`Ô´è´ñà—›‡7ísîA¾!ÌÀ÷Gt©‰Äv¬žÓj"½ÙiP*?ÿ°u@þ#Ü…‡¯žÁJü^™{ôhg»ùüÑ£­ægÝO=ÚÞÿ½ò]©±¬ð‚¿*®ÝWkœHuV~F XÐIÝÞØ2RM½Ô­5 h´6c•ä °×DìE‡ŒG’ã „þ8÷¿œû mímßð³1ñ_—ž,:÷ÿ–æ—Ÿ”÷ÿnãÃϼÅ'ƒpp…«ÜEŒO‰÷šÄãÉü’koú¦ÑtžmÒƒ#ˆ&ï\ŸáUB‚—÷ EdA| °EsxGP¿ Mñ²f¥lÃ÷‚ª¡~T¼Øþ0" ËÙ9^I|bG¯5f‰B‘ª»|ø$•”°NˆyY.¥ÀmÐìÖ >áÒ+ ê½·HnJaÕüÎ*¿Ï‚”"ÜSt¢~:f Ži2ÃæP͇Ø[ƒç‰Ùñ aŠÞ`BãOq»R7[Ѡ겚5mtÒ=):ˆf)~.Ü ;øè¬ŒµSïÎ(œçQ·!:éuzhଠø#ÙBtZßrë\éÀÛ`O½1A{ˆÇ.A/ NÃx€‡t+ã·EC9‚4R"ÎôÚ,>&áY,‡7â$_Æ#™^÷ŽƒÞ€:¼ÇÁÝ),Ñìi'zŸÄCF?5bTâ? g0þ^Žå,ðtßÑÝSÅØ45FNɱ4s€¾lŽk£ù¢‚0ʘ’øTŒÔD+g%ïov öƒ­|N£¹Ê5‰‚çV¶/¶fŒoͱ瑘m¼` ÍYö¢¨MÔOp_â,‹(R];‚ž0RÄtqoˆ_TÇùIRjN`ë8ÃÇ}«@4º¿v²µŠgQ°>_;;óÞyEýþÕìÌ3ôØ OÒz°;ÄhÚA3j'°ï:|³3ÿ9üÏ@†¬:à¹c(ÈÜBø'ý8ë¿Ã‡7Sǘõiy鉳þ¯,<ž/×ÿÛø€*ëŒù”1t¸”)B´ñ…™ÉUYT‘é'n`€v/άëóún¿q¢Yqéª}(Ë`œ. ÍvpÜ8ô0k£WÓqQ¶ƒ`]8 ˆºTO;Zráü@2[Ñ×®È$õ(ŒÖ'S©7 À o©Nƒ*!áBŸêxµ›À³T¦Ôîád‚¹ùÁ# ƒFo˜á£U±/©iÖ††Èͪ¾×K4Þ_j¯t¹/óbîlfäê”ö÷×®â~úú~û¨÷M§‰quXÖ¦öÃùT`×[µëÓ5á¥_ê2¹· ÝÅ­- ÂIØ>Æ‹ghJheïQeاàIäÀ‚4LQ«w–Ðò϶ðN§¸á]íÞ5£ÕTøÅó£`NjԿ`@o\ï9¹æ­ Љ÷Q?¿¤42Y)Œªq÷û|aÕ¾ ®èiõ¢¢›âMW£ºû)šf¸(dªR¬a_£`7NQ“6›.Iò¶WÀ‹6ccE»U›u=¹¶•M^Óø‡É»¤w™L†_{kþÿ⋱í‰{ËQÍÍþÒêãtyDVÌ8•弄‡"ÜŠÜÔTaôaê*C ýS#€Yõ°AkÆs”¶B(ÀàgÆ0àÀS–…fÜZð²9JÍÔöW¯Æg ¾…Ú£ªj ²f­Ãþ­ ›ôÝ|´þ·³e¾H¤÷­¬éøýoieeyùÉÒÊ"è‹‹Ÿü%Xù"Ô8Ÿ?¹þçŒ?,Îþj´º7WÇýþÉb.þóÒüB©ÿ߯ä©1æEºÿOÁè¶Ü ÷†ƒ>IEÖd*¹ç_³ÞØ8†Ýæþ? {@œÉ°a»œ6ð»ì´xlþóí«æëÒKÊq¯õîUwfgïŧÒbX=8<þíøí«ý×,˜òÖèU¿WÈîèÇ×!âÔB»¿ýëÛÍ=Dùÿ„iœR‡Á5‡0á^ÔIñMŒFã"s33Toº@šƒÌ4ú=¢IC vΆ–˜§gþçȺ ¿ÿwíÿ+ËKûÿ­|`þ{Xqª𿄃¸7LDgW¶amwgƒ°Û•ïˆQu‘ŽížŸá´ûVæÓŽÌ…ëÁ!üÙWoHaعÁq4¸ •Vª›†…\FEã6ÚOc~lŠŸ¡ªãCZ'ü:K"„ô°mÜŠ”^©H8陵ÐO_ÂW»J|7Úm¢ fþÜzÖˆ“·!$jëF Ø*¾„¾–X6/²Æ€4Aí|îiPý€µ¨¬¼Î­Zå?l{øT„‡Ûÿ‡A·•æüsñ¸ ª‡@B¯ƒÊj…q¿¡ôKz*‘ÞÈÁ||ƒ&Šñà;º‘^wÁ'B®º'½|'z©›ÄЄ†0Æ©,«{™ûSÚQ+îBÿðØ4‚`7:Ãz_JˆºCŒúžOüâ1t†c‰Õ!yh¨ éÅû« ìôa¿ ¨ÄÎ[]!LØ&àK`ݔޚ›«ñù Àâ›ÅZÝh¼H…г=Ð{!!i÷hË‘F°¸…YÉÆôšmìµçƒ^—DzjM4´VXÅè}+bW°g°ý¬&X^ÕÃÜë\D‚Å&ªD0›„eŒuñÕ{7AX|Û Ì¨Y³‹„1»p 7iôß_±1¢ŠMe=“ø€Tûu¸Žÿ|ªÉ³f( ý¦žá'?$-çr]I+}ï@i9…àu%Ãj±‹>FaIî½E:Z†”(ÌP¦SZäà ÿ÷€øÚ“¢rÆK¢”áÂI[A`Ì]â^½AÞÚÞ¬ë@ ?ºGg‹voë Ä(’å˜L¸IÃa47iô°|²Ee4ÀÀÝ»Òiÿ"qVE¨jȬtxß~¯Ð˳´ªðTÇVTÅUì6¿†Åâ÷\$ßÔJ”r§c¶Tè–gWœ=+#–™ŽDdE.lx™ å›r'€%spÅžæ 44Z’œ©Ðæ„" Tµ&R‘" Ä"¥«˜Ä¨ÌÔGäkp4”SW%ŠZàôb3¬Æˆ±à7 …"´?O:‰a ¥³¤ ¢º3Ì£ŽÇÈZV׸í#œº4¨Ægæ£Ù•ÕŠ¹r´G Ÿ½ÌŒZøØþ°hv…Ɔy爱.ÝØþ¦öØr~»Ö€ºÆ§m*S¬öÿÍÍÆÀWµzGP,0Ãl‚ßu].ë‘\ÐõÔ¤c [DŸ¡¹#œga ÁZ^¥âENÙÔ:´cÁó ß¢-®¬ {ºþýï:&tZÑSµ…ž¾‰>©„Å$m¢‰ô ë­Îë ‚¦‘€E©TV,#*“è2:;>v&º/W﬊ÁŽ:®Yß‹¦Âó’ÉI÷eI|pÜ8¾J·q6P¶E++öd# ™I æþzp±º*Z"#²ËAGš’àg À¬ú8þ#2Ó :kZÈ.F£I8À•ë KƒÆ¦©žW‘5©æE¬jQeèÁH^åbßí€-4–F"l;¢G fs8´ÓAÙòHééTm¬‡ÉAj>Í0j¤øoP õ ®ã3Â…CçAuصÔèQRc?ÚS ÌçúS¡MÀÚØP‡Rêf^훽g4p²Þ=­Qnï¢K ‡üâÞeƒ–è\€Õ¹N]ÖêÛæ¾|ßþ‰¬mwïãØÿò'Ë7Pǘóß……'îûo+Ë÷¿oç"ÉãMðn þ÷,†ù¯ zÚ*zZÀ?¥p°Î°í ¡Îy ò£Õ¶MW÷è…¼8øèE²I׎Æj¾æ¹ b™q®B²Ì°fš%@ޝe†Y³×Gƒšrf™JI™£ªê‡ô¦d^ U½…`Ó¨¡ª «¡TƒWÿôßC-?_ç£åÿ?ŽöïŽÿ'úÿ•þŸ_þãŒÿÒ^rûþŸOVrï¿.•ç·ò…Æsï¿8?ÿ#ÝL~áUÙô<îÓI;pV1XÈê£G——— b¦F÷’€eT…F;LÑØ‰¦†¶ãà9 µoìÍ¥ôÖÆáNP¥›áèôÑ®ñú¥—TdÐ\õå“ù®*Õp¼ño³†èÕ–â*Ži -À+2%ö˜n“rÅ„ng®ÓW.¶„=»´÷ @Þ¾ÉDv¥1o䉮ÖLâß+3òE²Þ»(I)å/Åó¿Û9¹1£ùÿ¸XÿGÙàÌÿå…òþç­|Ìùc~€²’`o÷™ö§À€Ò¼:#‡ˆ3óV;´ïíf½Dú(×s¼ì¾ _fä…T<‘F @ˆo[rÑv/âìóÝÐ=Cƒ«(RŠŸ0Æ\…¦¾ÝÝyVã‰.¦;u—™©ç’ãùÐÑ;Psò ðWpɱ"VÅ)¢„‰ƒbœàqçßÿnÈS” RÞ{„ ߇­$½$zKÇÑ^˜µÎƒËpT‚Ê j“v˜dF*—I£ÿ#è›ý^ò Ÿ[å;R"á^%Ôñô€`‚ÑjE¯ Abá–è ™†BÎN0x¥—Oú’iÙ(·HÝ·¾Â`C¾äü÷Éÿ[¾ÿ¿²´â¹ÿ¿XÊÿÛøHù?æþÿÍ뀾Iæ† ¢ QÜãŽaߘ{J…tGÕn]ÍÏAŽºù¿ Ù:Á÷Èõ,kм&‰9'ó"Ó›†Ä<ªé µGqéÑW [Ëï£?C¿—Öñ’sÖwú¤ÿywä1?Ç0cøJÖϬ3¢¢2·&êP‡k ie•ŸË=”$×€à|ÓѧßP?@=À°gÚ{ ƒ½Oyƒ0G­•+PçØÐ_è¶09Aç#`j¶–Î઄œÈÒ™ˆ™<.Ô!?Ò{ǧgÀdÍh Ô +¢S Y‚Oý Sœü­RÄ?}› ñ ¡§ÒìýW»»5=Ì,˜g»üܦ H«a’_Ù4@é±t ŽRLç»ÍàÔi&¾b²ÿB8hH8™¨ߊzÅVzЦ@…YŒÀ]_/yòH^Kº¯}ƒÊŽÖè‘CA³qô¬¼5ÜÏ©GG¿Ñ!匢“yƒ](”@¯×÷¿¢ÆPÄEœ}AAc5ë *D³Þ÷‘”{X¥^a¯°Ê› 7U£Ô|›Èo{®Øp£¹««L?BÍàðmìímP›6º`ŃG§‚zð¼î2†Q@=¦;Ô @ˆn¥=`|yÚ¹¸†æZ<¾Š}ÄL, Jz<£N[:ŠúxKõsUO{ÔžúÊÍÅ08ï¾Í›‚³f&b¬ÙAlGW.€¾5µšÈânQ–{½­Žî)¶ßݼ+dáFãcšèUsˆO;íTÏY§¿­Î5…T´Ußœ3ªòÉœO£àhóYnÈTe««D¦ÕubÒ¸…œ¶ùJNÔé=bÏIz]E5:tÄÌ$û>?åÄb§fÛÁ³lo6õt£’wô•4W\1«@ˆO¯v¤‚$”¼GkTœ-ù”Gè¾ã‹Ü]tž¬)ÝÅAÃa9àŽ&b&© d@ž~”ì$ X‚]LDÂUNSbôˆ¨‚jÿgUnÉȈ’h$ëÇõכּEÄd½Eì 3!¿ÜÍ@*õoh åÄ-^A/!ë¤×ë|²7’Î]Á ¥Ú:ÉLJ"Ã1ö(ñŠ ä/{Èyú4¨Êƒu‡ÔQª¼ÂWßEWB£©B¥ ^òþ]UÞz5|À ôª„°t)B¨pšŸ‚6žoåZ˜‚5UzÄ.§W1~Ω'í2¸áîfT•¼é0j4êø5Ël²f ç­uñaƒ¶}Š“Ú±‘c=UÃ…I »æ¤fÃóÎM€#ÌY40À\îáDÓN/Ì ðS\må¼0`詵ê&¸z>ÅüàbJÐ hõ‡½ôÓL±´\ÅfÄIt)´¬ §Ôž'rR|ò–@ë&äº( \d¾¶¸+?ÎÇ·þçÌòŸYǘõÿñã•%gý¼ Iåú ¹þ{Žb¾‚Ø<Ñ+=Ј1ÉñÙçr1žŸµãÓÓh€'.rgGç/©tãû!ùP"I1„ëì ­ «œ :þ­ÏÎÈu@d<¤õßÈ—‚_åï$ÙNrŠ ‚ÅÒ^Á 02¶ÎMe(‘­Õ dbÍQ¨Vñôœ+N¸yíÌå©U5ŸC[è‚ ÅâOŽ)^ÁëŽÇ€6®5ÿ!¹nÆJ_rÏ·Æ=ƱHë‹„ºçëE)í¦g*Jò=†ЪʣͿ>BÇ&×~á«¡TÙ€@Uå.ZØç £Í&µ HìZnú”¤ª«}XâÌŸ™Ü£ßÐiyHçääžœj`èeÌ)J¾¨Œ:Q¹'§”*“Xðùã•{<½t¼çœåžàWU"5J˜6ûÖ‰àPqPg½|Ö©‹â”©^î©i‰ôß3&°ȉd,^udD¦Ë슫îÈÉŒ¤¦øPÆ€˜dlùdfêC„ëA~4|'7²ß "=Ãè?DZFß»öŽÃÎ)Nu,·ª¡q˜ãð˜è-½vS±<'#ƒŠwBFàCœ AâÌKÞIŽt¬þ/bÿ˜¸\2ö`Çוãtô”ŸìÇ„Ÿ¤«ÅÑMM¶Àêe“»Ý™&8ZMµI&™U&tsO+KĽÃËqÇ'>¸©K¹l^|‘ýߨýÿMŒ‹ÿµ´ìúÿ?~¼Tîÿoåãîÿo÷ È·õsø.ÓP~AÑ}h&­ä®™_ïÆ$„ÞY€z[¦í™.÷gXnÑìøƒr£¦áôÎÇ&Ô0¶7ÇܺEiîá ûGÜ‹Œ] ¢Ç!ºôÁœ2rÚsÛ¹½ÔŒ²˜¯ð`Ž §ÎX‘—?ÐÛKîß1œ|ŠÔÎÎàú²ªâ4«æþ¶úP†Ù hÿ)ë›$´Rˆéêí>|·ˆÝä¹úP¾€ÄáRûhÔ†´#ÊZ #`æ‹ÊëAóà×ͬןÃçù9¢.ÃÏwŽŽ›H‰ÈCøÓxÀâÉZÌc†$9dC{ ΆÀúQ¶‚^B±îÄÉ£S †Y¯Ì³*æw¢¶jxš‰8°A5 /ù°p|…‰üsÛBAáU±w0 )† ‹Ô?ë)}&bœ~wbÙA‚²…–À¼µŽ<Ì‹DÖ^0†­.%îZ_0ñ“U­D®)5é²´³6Šñ¬ª~°kÅ=™n?ÌÄyôª’ê4ÆóÖrb *Pm—ïxS~Å<`ÂJu-u>óU”+: ŠÚ-’H("`U“¥áÿ–нÓÓ4ÊsO%Çø&"ü*úTô1ì#MD4Œ$øy=X˜WÑ0|m8&iÝ€ WUuÔ¡à\¢cmˆÀ>ª Ü2 Õd*¶ÃlHòªÕ¸µ“Í|,æÏ㤵£:Éî:õ”¢o=è‚¿Éš*ÞŽ¦->‡Å5ÛvŠÓIœ”-ðÝn¨KUäÅT7ù›ñô1fŸKY$ý˜5Ñ Õ~=˜7ŸØîõ³M -mz˜D;íq~ K@;YÒð€6_&ö5’ÐÛ˜«Žš…t¥=7¤/³XbúrP ª:fñõõëŽHÌ^ ðÅ7âZ ׇçô> ÞŽ|q’ø˜:d›™Œ1‰ùÐVµùX(è:bZIQ¾ò:“ü Oo_!Íì ¡º»ˆÓM¹M$^e¹ ¦U4Fí, M”68_–ÒLc“!ÔÇ$»ö-sGƒ¯ìµé}½]²‡¾1‚½ ?ƒ:»x‹žQÑ£íÝàŠB¯?ßù÷Þö*=íj¿äúªù|cQ´Â~”šªü„ÀöU$Þ'Ï“U…ìËz›Çâ¦BíÑï¦lMkzƒ‡?3V>ðô2“!dƒ V¤ S¾–?Ð&Ûœ†J¿6ªçµ°Š“àmMJ4ZìÅûzù»ˆ34gä ìDt U°ñ%¢X’Y¼d¸5sgƒÀfcdÑFãdEí ¼=l9mãä¤yOÓÞ˜Íkd‘ý 59*ŸpŒ¥€Æ!ÛV ±ÀЕŒ¡Q30"ÖšÈyd»S ’u¤šŽW?c¥O õ®2&®Á£ÂB?-‹¾ž‚EÙù>Ç¡j/ö¹£Ç]ìÃ7×C^>äúÄhØô#Ç­Ç*ü„ãVzüøìú"ïÍÔ1Îÿw1wÿeáqùþÛ­|¤ýϼ¼};k…,Ø&¬ÖéHxæà5²oG.ˆ–2èVeîØ>x.O æz§srÀØäï>ƒŽžˆhy©²7)óå¨È“™Og\¸îdììsƪ•!ŽÕ9‹ôJ'µAÎ%½ÐÉ%Õ’rÅ|#uAm¹Ôæ:‡<4TªTqúæ‰N­.„Bïáö÷ç¨wú´¢ ªlô9ÀnËçQÎ_™MÊúà+ÄYŸÅ²ŽS¬£a×rclÔqªë°r‚SO ¦²¡O@M—­óA= ç`Sð£FƒÁêjб‚ı®/"õVp |¿é´×iåkL~T hÂøNúV”Ë÷í}<ë?ú6ÝhcÖÿeXùõéñJÿóV>býoP ªÛYøÉmSßù¡W¸sQ|pÝ ;{jòò„ñBg’è²'™{ŒdvèFiž‰Bò½tõP‡ˆ7zŸ‚÷+Ò5HiG§)l“F†{ Õºé-´gØA;}³!5 Ú›¡W™@ü¬2å +û­UaßpZ‚þT¿*þd¦õ†K°evÃÁYDÒÛ)†!¥‡} ŽÏD­dpPTn† Uk¼0âÐùäÉðT‡Êè€h&³?ÿ_¿$…mŠy4qø‹²üü¥a^áË98ë¯,xÈ4ˆ»¤ÔU~VÐbx¿§RÐŽÏâ 1ORaøN°+‘J:ÅÕP‹BtMùR˜ø1tµû¶ÇËíéQ®hv†—'n’Xw’.;—5ò_•Ã'qz.×DÚØK_¥ª½²É »Uê|Dä$:EgÙWxÝ_¹¿½Âd,¼ý ¾^˜ûéÍš‘ŒióNùÓ·Oé1ÁBÿ÷ªÈõûƒDü‰¿¥ŸþVð§ÀûX Q‘Y"\¬2Ú~óúosoþîä¾—4‰J>¾çN7æž¿Á¦ÐdÃ÷Ÿwöwš;»O_ÿüžýžü>xó·™´â黸}W3¡@ë›Ùì‰ ¹:ó“‘yäf¾6K:yoÌ‚N^ÝÈc%ÒÊ^µ²Q´²IcÔR—´`Hg´`H›´`Xi4aXŸ´zç>©WWhü¨Õ<>àXX 0´EƒLIHÞ n´´:Ùˆß~{¶ýbgX…ì5q2Œ˜%~>¸ß H!f ±â‡}”}Ty’GzRzš=-Mò Iè :(Íò Yè°ògå§ËŸt!¼<žr¯ÿ:§¤UI!¸;{ðÄÀ®Yb17³=¬Tÿ¯ÚxXyø¨ÒxX«áßœ ÐG @IöðZ¹®aÈÙ°6(¤™œ,ùÚ Ówö)ÐÿoòùÏÑúÿÂÂÂü¢ûþûòòrÿíV>¶eUsÇ…JÙÕ®®È!ö-û#­³Çds¢©ê8[½•+juð;ºoµ•Pa.µíRÛþ"Úö¬èupÇ\VîR Te%¾ºÚ?x»·ÑÜ|©ŒbWWôóLŒgC¼)(|¶Ñõއú¡ÄEåðÌœ*¹ëÞ¢²v|™( ÍóÚ½–ëð„ÂV¹/qO ˆ¬ôò6ñ}§¯µÀzW§¡H@ÎÆîdÖãÀ .<Ò}@‚OõXMè¾c]öÁ|ãtÒ(“§  ¾ ö<1_ Ô‡¦…˜|¹@Ìcج Ï™¤]ÙÒõyDH–Ï$xÀʱ̆OÉ'âµÕ€Þã‚úÅUv©¢#Bƒ*ëJŠ õ4 ¾™ž‡a‘ö@> ›ümÞ†å’5£é,®ÐCȰ´ê^©"§ê‹OÔ!?¤õ`^=ô%:"Ñß”ìçÇÁ8‡Îæùf Œoä ë Ü€•÷°Œa=EZ[ª.ý"K¥v4©8I¢^ë­RéîÛ:¢Iù '‰Á ½ÃÝÙ¥õHøÇ>¬9œ…(s6É]R­¥Ü*Aa·áM"µ¢”¦¬77W`G¢%~ø)Þü3»¤+ÇFƒ¬<ì¥ÄƃÔ~/ ª?p±šVv¬š™VgW5ÆšÁ|Qž˜Î¬ôL\ ™5[ ™ÀƒMó‡…ÃÉíŽåêIK}07§b÷™£vp‡r/ðPÅ'z bVFƒŠä¡ó1IJzòûïaÍ õT5‹’­ï±–÷®l¡‘|wá6‰ÆÞƒüy¦CÍÅ”ÉòÊ“G s—*É%FÇH©ª„¨™| »,£—R‚å\ïAÏm&å¯ßÔ©FSÆ$‹¤-ÃäŠî»”4›ªÄæj>kù|>V^Œ«Õ[s1^«öm”AÌŸ1³w~¬`QäMÕ UØå3HÈÉ©åÇ7;Â~|#WB«W>»§ëÛ)÷ç‘6)YEVØRH”B¢¥ O‘¸1íîÆ…Dñþçszìûïì½Á™û}rÖÊ];_Y,Xt€ÒIµô­ûoºÝ€/›Q‰?w7Hn¸aedqåÆäÌRະ2Éü1:k*4EycN\_œŸ–&ç§b§©¢iu׬9#®ê†qayÒ‹jdŸOÙïö}ž>¿.­jžØ·{š—šÊMß ¹9ç§â)°8fêQç§•›¶m—ÀrXn¿35ý¦ÞÊ `ÉY¼`ß°KÍ .ØKEÞÊ+cNG.ØùUÉ[ÍÄG«+cü#Çh¹!Ù¹Œ9ÿœŽú|·î¾ì7õfr‚’¤0¥¼½¾Kúˆ¢E‹Å skE¡¿Î˜³ó©Vбž<£ >‡/5#*ß»^¬Ô†‘[ËÏlƒ3ñ§^é –>‹° ‰*šÑ7¼Í*'E9)¾ýIqÃÛŠé•¿ÏP/nFqu§¥”/êV¨ªp|žásc⇃ϴz¤ð£ß:þ§.Ïa"¨_œDvI6:²¨«Vt·ŸÊ¥~[t=“\ÍÅǶ{˸ƒáæÛñÁ)eŒÓëÍØ¤þµ8.hÇuÌQnL³Â…ŸÆTè­´å¨5!W÷x—µ‚úGb· \› /)Õ0þ&IA …+Âg5Bâ&¦lüRðMEMž’Q&“©Qþ<¥U±{)Û­|q2‡z_›ÆÍÅñNêòk÷îH³Áâ$ç?ãu,”ヘZw”7a¹c«j' slâGeV¶âGUáµx³¥U±ï¢‡Uùd—ü ×f Ç®5Ý¢b2!11¹ÚŸ•.M}ïÄʪlyDS—¦º]s¦íÁ–&Ž2ªÖ"ö†c,~F½©/fdzËGûËEÖâ…©/ûQM,ÚÇVè­tÊ‘7rØÆ_£™ˆÂk^W+Œ12ý8øQYÍÌ8ÞB3ö ç)j½Öu’ñ‘‰ïÌŒ›z+ö¹3n|ÀƯ=ã&¡ðÆgÜÔãðÙ3îË4sÜŒûBñ:ÇF&¿;3n]þFfÜx'²¯=ã&¡ðÆgÜÔãðÙ3îË4sÜŒûBñaǾLpwfܸýûϸi ·?ã¦ri½©7õ8|öŒû2Í7ã&öÓžrÆÝ´ÿÏõƒ¡(ZDüM‡“žúTw’¢Äß´‹Éõ½Ž(Z@ûMû,_? ýˆ¢´ß´+åõ#j(Z@û [Œ®^;¢hí7nráúî`#ŠÐ~×¶ÞŸø—‰ÉW›b,“j$Ó©£±YgnÈâiëõÖ=ëØC_‡†M¶Ïµ¨¹åÅg>&-SGL5rÌo¾Þ»6c³ê,ÙîɆ¯ßîQŠàT0Ó©»Ea»§›ß~,VûFœ'^c\'ºe“;úsûu¿ ƒ‚ëŒkî±³þ…/Ì­ðÑ…©/øåŽÌª/Úý†•íëûD(Z@ûM_K¼¹À¡¹…IðŽö \œ*n¨¿–I}&htŽ·nŒ~>”/ˆâ?1eŸGUWÝÌöÓeÒñn» ŽŸ±ß!ÿ¬Yù¯é®O½À͹M~|òûãÄ?~ÁÃYòþk^3`~¦”o( à…b`·jä—g0€xñP¼†²Ã^Š/"Ò”€ïÕÚšxºÜ~}@F?í½Æ¥ôÃ’â­ï8P‰uQ€+®ÕB–@Å_ÒšÃó€ÈjM'z_5‡ˆ¡Å”Í®úQÐïáÓöIÖgƒ(ìBE HÔi?Lò ˜ªa²Þ;ÉÍd¨þí J‡l–`Ûar­ ­€2ÇÍ£=k£ãRª$xˆ},Gà-ü›Á¨QM™¦‡ ÍÃÀ«½>€rÌhWX-*Ä$¢€²ƒ´ÌV‰¸ªìñnÔíÁ`¯K ÿ¦ÍÎXª f~ ¥j®½õ€=@(h`’h톚d)ŒwÚ­¨ˆì¨ªBü†5"O©¡OÐ¥È(Ü`¥œ kª„IfÕ€” ãÌR`"ÎHYaSˆA®¤ÈaCbÆ´¨2]›#U–mÁÆâü?:û3^ 1óX|z…RoˆÏÅšè8ëA0ϹFo×¥´©åQEa;lØ~ž(vË¡e0Dn@ZU ”Q\ÝN"&JaMë*ªDáW°°‘è¸ÜÛþXò àPx –Âô/åçOôI»ä?søäÑ?Žöý'í% H»Ñ:æáóxy™þ>yü˜þÎ/òoÊ{üä/ ‹–çW– a “‚ù¥¢à3Ä%$þÒÍNGÂØéhˆoòVŽùlðþlþv´óâe–ÈZ°8?ÿcÐ<‚çQ§Ó»LÏã>iv{»öÿTϳ¬¿úèÑååeƒ8©ÑœÕËF§ â³ó,™jÅEÔnˆ šçqÀÿa5 @¼E€Kz”d¤u ú0@n$u#SPzía+j?+v£6¢9¹ÒúáêÀ @‚@¶²á b$ë Û8ÉÑa`qFb©Yžýc{³‰•£ÈŒ“3¨‚ jA'NåVíc°qt´ñ‚Q¦·ÿjwWýxvp°‹p'½^G%îìS;I¶“œ6âD—}¾{°Ay ð5<Èðý˜ÌDIA}cãïÌÿ£í­½íÃΟ1ó§¾;ÿçWæËùšŒ0üƒpp¤Ã~¿7Èxj¢rƒÓ7T—ƒ8Ãï̇<»Ú<=‡)²%¨ü#¼[ƒ¸Ÿ'ÿ‰ZY°ßã9] ªÈ^µFÀ³ÿ´7è† ´µâÓ°\Í=ß –ña>!V2˜:i#޲S”+γnçÑà´µüxñI­1; b &yÿe—=P+/@é¤Ùõè@6¤N@â«ÂšT…ÁTKgáW’Í€~Ù&)‚­¬F³ì|ãw€=8Þø·/Hvðï½ÝõIo˜¡âfÔø4ìFŒ*„}t!´®ÛkãÞ*ˆÞgƒú#í† Ãno˜dDjœpW@Ížz]Øn΢à4îD?.iãÞ—a’!¦v<€Ží\'Ã¸ÓÆ¬AлL: ¨‘*Ä#;¿»Í‡æU¶öæÒì 3Ã>HÚ°ueatÒG8ôQ:‹btÊ„­\/¨;˜S̺qd¾6W—ŸI?Zþïîlnïß´ìÇÏù¿8¿bÈÿ…%ÿ‹Ë‹‹¥ü¿Ïqsckãh+ØÛ žûÛ¿ÿØ>:ÞþÍÐ÷šÀõ@pH%‚­ãÍݽí#˜î›½þ){¤2.üôãOs 7.¢Š¶ zH®fÔ:OzÞY ²dö0tã4EeDÚ0êA PÔQ^¶·Nòµ£Ês2Ì„,M{§Ù% {ÌŒAt·{-Ð¥ÖˆÂ(L®‚þp»Z†ºŒ³sÓÁ)H-À€Ët6Yµë³ ì.â6~w(É“ÞED´ps’^·"”‹0Iœ(¾!ZA`ÁÙ“^vN¥óåjîëYÐ$åjšÚê„q–]•Ѹ Y-­«š©ÒžÞ鬧£ëÁ3PÚƒÝð„ÖìÿÅÙÒœD8m´)†í‹*¤5àûÓNÜB8 ? ãÓi #”uZþÄàÌÊ.ëz«NºC«X#RÕÀ7‚Ùü”ºWô v1"ƒÕå,´±b‹ ê³qÒê YEbq·ßA5Â(´A—¶Îágxw°%Øu§q–DiÚ-z€5€ =G$‚ ÔëÓN¤¸ŠšvêÐM¼CÍân$úï;3ì€6Ô Ï"ÕÓòç% TÚƒJа„–T$˜—ú^Š4Îÿ“.…ý3è}0t°òCÇ2ÓÁÿ[²·ÑÌŒºD=H¢³N|%ÀM@L 3ä˜Þ0€Wb ž³ýÀ 4Q©Xð¸&²Óû*‰ß+­MâH(E’g«ØaCHA‘Øhu…!¹vÚ-(Ûh,¶àWZS„q¿ƒÀ'Ѻ±¤±á DíaÒÆý¼\|E-š¿v™œ›š[0Yìv°É,Ã:‹~1-`Ê`´§«ƒTF-Xe‹çÛcXfgÖןÎhç‰"&6 +ì³ø X`ží¼ØÙHØ ‰òvgÿùìL“YSuÙn/EcùåÈ>dÆBƒö؃Ÿž44ùÌ>[q+“„mílŠ*§=Od¦˜ny`?‚0ËAš(g¶m³‰Ü¿ ;ÜžÙÈ6'4‚>èýųÁ Ž6¯¸Æ WÒ6³ÑI{õà49TìˆRÚH °’§­…”ÄÐ-AsÎV«³33x( =ز¡9xŒ(É™ý(z§3APŠïd¨ìœJŽ-hØÔØp`C ¢ È¡¨: ÁFpÚë´š!e Ñû:ú.IQñÍU#x°w¥<™ÊrØBoÚH²ÝÐvz—¨s'Ñ¥ÁÐõ Üa'…N5²ŸpãÛé€ô®£Ôé%¿‚D0¾Æu®%m²‡ñò¡ÛêÜþ3¨£ˆù` ‡áw)€Å’Nˆ&;?VïÄÀ¢µ<ßÙߨÝùÿ¶L¶Þ¯¦.¤MÖU”ÙXXŠƒ£½&Oí$2í %ÃÖ(¢~ÁìR±`ª(ÀÃñæÆ~ÍêýÓnö–Ó®>Ç9Õ40$ÁË0=§¥C‰¨—Ç/ß67žínóS®3VlÚ#v‰EóRˆ1%V y2½˜¹§™ecÄ…Ž0o7ŒœåÅhgaÝ€$šñ“JýM$6ž…íÁY½oE¬ß‡°`DQ"Ç”Œð3Xæ9¬$‰/C²°ÜbòÏÙYÑ)ÒBGXSEÁ Qаɣ1” Q†Å´ÑZ9ÃZóÓÅ G¢Ø}“ñ…Ïì †‘Æy8# I‚…8é] žâÚy¢·OÃîî4{•AO­»;ÇÍ·¯š;»î"€¸Ý…ËQÅøå0ŒiSNm³ÛaTE­û{‚{Q5ÂŹy°GszFéJ"5ÏÁ{á»è˜Ï6Ó7þ¹Í§‹&Å;‰èÊ:ÑÐZ²pHcÌç ´¦PWÍΨm­dÈžÄÕ{h™zÙ &]µ&_´ Öw!*X)ü ´ð AØn?@Ñßí£%KX¥PX[c~Øë\i1¶Ðf PŠÙÎAc¨uO±Vg«|¢£:ôhc‹Ë`q!&:°f–‚—” >†éM[WÙ(4¶ Pe#”ˆ†Ê&Ód9“2žbÚò ðN\wÒŠ™C»‹á‰ð°öPn›™®bó—æÍN4Un`à =Ø_íïüûíáFó%uƒ¡kb¾h2f‹ÓÌ"Òh®T°Y(iüZzgP6ÿfÃÁqã9ì2ޝxë?íR©DÈ Ÿ1WØ> ³¹D4‹­˜$üe<ô L£˜ÍœxŒ³L+XVøWa)I›J<¸švž›Ùaí+ÕÅÚ\Íþ3ºº„õêy2‹ótQ¨æä¤“åÍ^÷„†æèxûèíæÁÞ3“™Ð´½:BåàÕÑössìÔ›k o?cw£8û² ;T±Už=ŠÐÆ| gÃìp¢÷xLë­ÌúÚV®òSô1쿇¾Pd÷]Y)ôÿƒÏ_–VV–—Ÿ,­,þe~aáÉò“¿+_ˆëó'·ÿZãߎ.bÐ×oš¦ÿ¥¥' åøßÆÇ;þa’Æs vç åóÝÇœÿ,/.,ëóŸ•yÿÇ+ËËóŸÛøT¹Ñ.r^ þÑ;O‚£¨ß¿²\[icØ:[áY¯µ‡þï?çƒq^Àxù'Ë®æú *³—qSDï3é`[Äýã)DóT*qY~‹tÖ€TJyé _’4ç$Œ`MÀ½]€&ûW¶è³w(h‡o·¶ÙÙ”wß/ÉéP\Hº}r]ahp¹ómµÖ “™0‘t0Íkx«†Ý“v4è\‰ÞáÃ%<—V±fó·:ÖýoñQÊûÀ£•Êv= €ËïâÑtýI„¾”Ý | ÷¹ e'Üâí·)MèòƒàeJê€7k08Ÿ‚¹§²·å-S}ÈWâhª†ÃN0ÏPžHñÌÉggƒ 6¥¿:qòNÿvô÷1¬ø'q*~йùiVõì%³cÝÀ 8=[Gr`»-¾`"Ö¼N éX¯ü1ìÈoP§üJ5òÙ™OrŠ÷º}öQC°n„<2¹ª­§½Dö8Îê„Ýuêka|5]@I”ѱ@º(¿ãõ-q7 $QÔN7±G@´f¸Ùý¾¹N¿Ò…:'§‹5¼y‡—hN¼“oúá¼ÂÌà#ßçí›q¯Þ™ÕNU#VPÓpª !¡Ý‹”TÇ®Ó4ˆþ;ŒÉÈ ¤gúï)1œÆƒ4û;ñs"¹nÇÝ;Ew7º°˜Ë:9ÂÌL™Ž,ëKG&òv|€½üàÄlÜ E,†plhDgƒÞ;f˜nt÷Bu@š‹ÃDõ( 'öh-È/‹4b(»Qk‘× ×oø~çëÆóúF gøê­,J%„ xïõ›‚q×ä“°õnŠ&Ÿˆ&Ÿ\»É€•š,Z¬®BRa³7ÏʤšN×i:KXËÐÆirüC5GÃv›çc=huA3è^@•P4ªÊ}¢X±—ɉ[£k xÌdÍ`n> Y]m¡‚øÝèoª‘fEÿœêôAàü ÝýA ;òj·(€‹ûFãhû—"š=³³ÿËα‚Š¾ lq‡È “)^¿¡QªTäæR‰œFÖc3/2±CnÃÿküÝ'ʈ*s…”Í&˜†wÀxý ûý°dÖÅe{½º ûè"D âLdЧg¸Ö512ØõÔ½ÔƒŸè¦nïG9z¦Õ¨å³Ñ?Ï!G²éCÈy ¯‰™{ ~“x®krü¯v§@®‰çjÆ!‡Yu-ìšt®Çæãgâ7©Çº½'R€1;ØO›}šM¡:zªÕ×o04BTku)Ó‚ É8PV¤zæÖ,-\l"Ý£qQU(ÿëlD± Ïvy_@»At ÊlÁ.nvFmãà{š½“Ú$U¤l(Ý™TÑ^—øu­D«¦cV5͠ŢOtXƒ° íÄHõ¾£úJ"$ŵWߦçšõT ´ïÄ^z÷ ÿ½¢•‹ÂPT -¢Ö*†’£¸ÀNòU<¢ò@Q3s“è’r­1‚ê\NÁâ"1£;·ÙU"LkŸU*Qg”5 C]».*…«—eð Ãì…^L'Œl¿bbT…üc÷«™™ùÈmƒñR‘MfÜþÀÞˆtj;#šº¸˜è‰P5=?Cý="öŠÜ+°?@‘ç2oÈiû€ÝÁFm6!K‰9‘ãæXoœ(¢ ¶ìpw¡u¿}ˆ{[Q kJ£ÑøÄA2ôðs¸øre¿âEÈAUä@ªëÈëŒX«´xŽ6 ÎÁq°¼CJ 8áŸÐÈ€ëµz`î‘ÔÂÏ-”Fœ’e>±øÀ¥Q$¬+v‚¯ÄT$:8D÷Ôˆ×8•Õ¹½í†ïãî°Vº~vTñ(öð)ßp¥5³ëGõ] •W 2,û‰YÕýJ 4ˆ^”!Ô}¢‘¥Ã³³ˆ¼É%•=A&”Ö>r¸ ‡<Áèi¯ jñ°{žÛiŸ<˜èö‘bÊgj©£™‹$Ø7”c@£¶w£SØèU‚J€¢Y³é w¸9¢¾°r€ »ú\Ý ¢ò{•ß“|5ìÉð¨uâµ¢Hú")³/KÅÀªªÛiQ¤º(V™+Ø*$¿%I-ö©BmÐJRñ´k ]Â’²µÝ TØs”}€[eÌõÙÑ)­¦tÅŠ“¼¦&m€èê‘I[¢2ãN`P4{XY5‘Z5Q«oWW1®)¸¶9²É±›Ã¨Û'º¸¡@“?ÞFÌ{ÈñíoµÆ;õñ¢Ä•ˆÝkðƒ´Õ@ÏPŒUÔ•%ÙÛ9#m€µ—uü½tk7Ô¢üLüsþ×ïß@4 qñ?//¹çË åùßm|¬ó?í/~üç=~;<4Oßt~³÷NdÌGr̓nq·…§™˜6Ë.þ½wº”Wsùx‚H«¨ܬVÜÝÓÀãæÑöÆ^þ4PíÒLüòŒÒ.¦5Êt¯cG4˜6ëר‰ñ8uÜyvùú¬Tç bf\«ÍªA®¦dõ091*¥€x–Öh?)siGäffW";þ#ŸËŠUƒòRsÀ‰w8 ÿ»C€8 ÿåh£êY$þ~ú鉎&Q÷…õp;×±ƒ.ï ñ@œüH»áàݰOº)†4èu‚NxÕ#Ï{…@è±Îê0ö„vL—=–")ß íé= Ù‰Œm «¦Œ‚¿5”(Õé0*?m*Ýz:ã^µ (j'•ĸ…›MUÔJßñ'?ó'¿ò'£ãù?·ýyÛ{…eö_øó¶žïû36¶ ª9ÞØ;ôçüóÙ–?ã—£‚ZvšnGóÑup•âÏö›AÔ¡Ûi5{ÈtU®<ΟÃÊ5˜#Dhofö0i÷Ö  ×‰Ìæ#°ü†úð®ç‚Züüd‘˜óÙÑF]iÐàŸÂûÂôØ‘¥Û8 Våd„|äΖöëjE7õ´˜lï¾T{?ààÁ†;„ÿ^‰ˆ…Àuƒí=$¸êc€,ô1 ~TdŽp‚ÄÁ‡|i•´y°{pd@”éd ·úLºžVÇÊ.1¨ùíXm{'´· Ô2¤û:’a·}~œ½›™¢z— íJ¸H³;"y:›èXä »§a“Áz袸a&€¼mHæ=¸ D›5„¥X¤ËS<¶‹!g4U<©Žº5¶ñ?…¯#ŽWÚíàpsk£¹! DF‹5iý…·!Ê Ñ–ˆ:a{A JÉ~ž½ÏTÐ @¶ù9\Lw˜´|@~.â'ˆ‹õ© "‰îÛǹصÂ,J螉koáÌ& ‹`Çÿæ”O‡è88gÀ19×–A=è Ô) ¥««š.sbU¡Î2)˜XL 3eP¿s <°Ö?œðï–IiÊÚËA(Ï)HçÆ†gŠÔÌrÁ²Ž3:¡‚*3äÙœ×lŠtê1NþŽ™½ãæ>3sŸ¹¹¯ÌÜWn.K/DÈ3n{Ï„Õ4$žƒe ÑBùè@ °4AHxºµ$µêBÉêÀ€˜5Apýu @øš(‹]Z@0[´à’œ£åuËÃEù-Àê÷iµ?˜¾ëÙ'Ñ­¼,~2Ñm| ³%òë‚ç,XÑ u„yŸN¼Õ÷,Îh +\Åc(S‰ g>¹ãkEGÔŽ·u|e”rabÊ3¥L‰Ø¬C‚5#ÉšÉófdˆ£Jˆª¬S³Î­˜:4åqrY“OMõ{}å>ªn@‹½›H´õ® 2Àx’°,D{ð• ÄGgI¯ïŠA〶;Ò4°SŽÓ)-û‰ˆ|éU-HÉ—ÀP² z¼@ˆ”bªbëLT"dƒ2 µ¤Õ”àÑEò¤JStµŠâH1¨MPÔ j\9æ4FmÍi+Ú»ôÁ”ôwC$âîµ¢šñ¯­Cáæ-Ž7œ1¢«¹ƒ”;-kù Þ]óìNütÎïDêáñ Í?uU"á&öhÀq¶Âz §1OðTΓa‡Ü @ùÿ `\üï•ùÇþÿd¹¼ÿy;4WûFûóO-¨DÒQuãS_öä3LíÛ—¿±É1n’ƒÏ¾ñ8Â8걎÷Äu |²‡ä=V©Yg®Ã$Î<öut¡*¿m{«÷HÖ¶ÊIÏm!¤¾evµ¯t ,]K—@刪Ã7¯,ø×ŽuÛhuo¤Žqï¿=y’;ÿ_zR¾ÿt+\ÿÕh‹µûØ uŒ‹ó¡q wy–udbœC/½ag…á8CÓæðÐJtÖn+Ïp„ñ¦;¨„Ên£'ÑÓd7©8½ŸÊxfÕýí_ßnîá|ÿ8öxþÔ$ ä¡~7ÒA˘³÷ðÚçÀÿ1°š‹ƒsÄ %íøûN¨`Ò Ï™Ãã­W¤À 9’Ú¯ñZ^å×óãä PómÇb…ÙrK4¼ U…86=j2{æ< ¿uÏuïü·äÐç×1Îÿ{>ÿi¾œÿ·óÁ}“½êø'ÿO×òþe|.ôžTî5TÉÅÃÊ8@a9ùyøHDï ³žgó/µŠ‚]‘w¶3ÿ­ îp¡žÜ­ØÔX\å^ìhMS»;å}nÆßþV¦ü\ãcÉÿè}ˆ|rÓ ¯ÿqåñJÿñ6>þñïuÚ7¶ú]ÿÏ/­èõù îÿ—Ÿ”ïÝÊÍ~j°?[óO|*¿zìAŠë¢Š–/—výbÀîÖÛãífó·Ã#|(´ûøL+ñý¾X}ñ$<í~ §nø—éƒ;:ûð²5Xzñ²Áo•$ i›7ìü'Pï»·ro±y°¼sÜÜÞ'ïç}ý“Ké‡3@#y¾±³k?à.¢½{+Û3³j6±JÎÛQšÙà"ôË¢ õOC½•©a©©þû‚êpÌ`Ñ™ü&}¦àHkÆ{ž5ã;Ìš):Éšñœ=ÍØçJ$mõ@õC¹å“é·F\Øsb4cýŒÂ¨½Éð£¥:òhÆ<ÚC¯B‰G;öuËÑtÑùŒ*-îbòÌè‚-³`U¸yÍè•1ÓåÌ9þŽfuä&Ê·}Ò[&%ÏÕ|$Ç¥=qtkÌͲ7‰^;H|è‰0ÍcE´ÎL±ïÊpÙ5þ){Å$@8ÙK:ÌEœì?}|‚¨wò›¦Žpƒ«¾~£WU¼i¤#qfYØ:'&ì c_mêX>ÿ¢Íx«Á˜Ñ\Ò˜ÂoOÈT›Iµ¶þ´ª"E} ª§‰h)úÒÉâ'P^­·n)·ºê¯NˆßÒ ô'ùXûÿ~_œSÞlcÏÿ—žèýÿÒc´ÿ,¯”ñ_nåƒwŠä¨k€k»ýáS^ø—ý\²¼Šœå40+Þ9žå¾0ïÞñf>M¼Â`¥r 'QÌ|$NkV"èË% Ï m£‹;Uä#t· Ïö"‚¼÷ÎÜšÿÐk[{Û7ÎcãüWùߟ”óÿ6>>äWHHÙ'vÃ- $ÏÎ6ÅEµP=ŽÙ‰îÁîÔ×aЂÂ3ˆ[ç°op#`à·aƒ>¨¹s¼_rŽ åÓ}³üê+EEQ‚dîd©kfD‡¿0E§¾„b}@¡Ã8À¼ù5‚¼êf¯E¨@é>ÚÙ@‰ö¸VŸ½<2ƒKP)/q–Áæ$׿ÆÞn=8fÆ1eh¸¶cr L`Š­¢ˆY¨qÄ?§ôrêÉÒ©W\CrÉ;–ŸM‚E«üœ,/cöñذ H ñÙɰ•O—¨iO!+ℨñ q/ùq«÷rŒÀ&¾<ü¤j(Ñë 3~‘ßë½ˆÄÆ„šÇdáP§xÙ‘Ä—[”D@i*9‰6.sJƵƒN˜œ Ã3lÂ@I÷W&¡ƒž¼ˆrpìMθ‘övÔê„XRâ) ¬uÌ"øõIĦënüžšÖK\zÄج)ŠžÒ[ÂD7°Ñ ÂÑ…¥°i\ßUÉôJ1y§t(c¿ ”¢»5zS€‹„úxö,J¨íš~¬W“ÌÒcÀÕ¯øéZyÒcÔG/á³Ë³T«€pz1]£‘Kz—õj Öuz½w²eY”f©Ù¶Ù4nvf´1;óŸóÁÿ`¤¸pÐ:oœð\€a³2ÉRV~®ñ±ÖT)¾@ÓŸÿ’PžÿÞÂ'7þÏŽö6š7ZǸýßòâcçüwiy¹Œÿv+Ÿûçfðm4ò%:Ådöþ…‘rA)ç=3 ~œl¥ŠÄ#>Ño²¸QÂìýŒR8–åý6ýÀÅå Æû)ýfðû-.+ï¡vJÀg¢6B?‹#—ô)•¢Ó—dö÷„ „­xö~±€ÂtË£Qzöþ[ë%s”ÀÑÇŸh­ÉÍÿ~®[à¹Ó›pý¦Ï˜ù¿´¼ò$wÿce©œÿ·ñaû9â·ôú'ÆXUݰ I TºÛÃnߎ’rxp¼tÐFAß%wÑ B»z4^–röÇbÏTеc]è«þ PÊÐ*¯+h›¨ÔE„§ÊjPyÇØ8JV!DÏÙÎu=Šó5)5›Ò©wƒLç.î±1âú·íâ¢`D£*FjÅ9~3Ühô‰˜.i¤Vœs3Uò,ʶ U?mÂ_âd` –‰uÜ ?¬"¿XE¸Ä/f‰_Ü|$k—xiy™/ç¬v™»ÐA®“f—2‹˜ðê6p{V–?t—ñì5* „Š=›@<*úÌ[#Õ®44Rê§^5@üÔø4ߨ*ê _“Eª˜I&0U¤a©ÎfA`÷Ì0ãNj§*y쯡DJÅp ÐÐ'ÇT½ª\$00׈àà X$0 üý;>õëiëÕ¿qúßòââ×ÿwq~¥Ôÿnã#õ?5â·¢þé—¶AGSS<=0²—á=|ÚZñé•k£E<Õ4Šý …ajOù‚ê1_dÕ¬Æ?ð¤1ç?iºžáãadz>½ê¸X±:64+[«Â<­MUùÄ´ß‹- )½æ™´ ¹ø¼q;Ïð§é•C¥Ëè†[aHë-»½SUE;–îI¿ˆÌª î¡¦Ý˜^N x0)ä„`ìÑ'ïªäcØ9šW/óÙ‰‚êiCŸ¿$íË@ÚìŽ&®z)ÐýèrW..ôû/.PXGrùlŠeëÆ1Öa¶ÉÏW†ï4ΈˆÙÓÖ f'@+TŠN®²›S¿ßv¢èöA±¤Ñ¥€sT§Ò³°Ì@ wOÐY#¦³ÁTÔ-Ä‚cV1±…I;ŸÅ“ãzY€ìåõ°¡;¸>?²ë`bÆ®¬™¢€ÑÀWT0kZS’ÁôD´e9’  pvfK(EM0†;tIUª[¾ÑÄë'Eªá’ ©¨`uf¹ZøäH$>©nÆÄ•“¢•už+p©p8å`<9-¢§G«F(µgQW¼;ZäøSuÂÀŠ¢K„m;pnô £6 Os~©So'Òÿ¹Òð­}É…J¶¶çR¿·7ç½ ±#qö'Œ2ÌT­õ7 ”üc-ïT´Ã€3LE^ëéÏ”Z®ýÓ™NÒo=H”ì[æ?yTsxÞ¬5tS`ÚÚ¸àê½ùÝëÙwõS¨ÿ mê&êwÿÿñ“•œý÷qyÿïV>†þ/Füö6ê& é>4ù wÐRç…IÖVå ýߺ)ÅJsNø¯Zê#ßµÓúµ¹¬²:áWg}åŠ1}A±¤L]P.9Ì-K«†¦ã©@®Ræý².¹b *¼jº· \ÒV‹uv/QÂ¥nâ¹r•[ÍåÈ%Í“#–´ÒÜÒ¶êÝ x‹˜ZɪÔùàAöŽRþ›#~S/ÀÍ9ãв‘('FiÎHT˜Mbw¿TG×ïü}pq6ƒ¯ÞLW ա𰱆Ð䊞öp«Ž¡¦)€¸¤ Ÿ×µ¾‹¢~J‘3Ãn©ª¦Ð‡Càw¾ÅqÊ@ÁIDFCrEœoV¸DƒÊï¨ëUƒ”¯ÑCËt¯¤ç½a§ Ûš Ï cñ¶‘|u:%@DÓ‚æf¼ßDI ‚fˆ5£:€„¤º{ë} Ý-¸wF<-ä9eX¥ÈáÔÀfß–V'æËd|+ø3Ÿ;™óÚ uA`ˆ_ãò°IŒfŽÏzÚcfìËö˜ðe“ýÒQ3}^ñ¸ö<õ˜°¼¤¨ÐcðL‘×Y¶MŠã²ýÌÔÁy=«º‡ß&´ëª;6“«W„íx‰ÚÄok®{×>ö·î³‚ä–[óïòãÓÿx¼¹ÀÑúßÒòÊJ.þïJ¹ÿ¿ëֈߒ òÄ "/º¦QÁûÂN‡„–PÈâ4wº'ÝÆDŒ½Ô ¡£…:ÙÂieÕº[H zI5CÕ°ÉQQÅÉÞ–x%™T‚êChIP3  ¢>¤ERx…å=¦ô1c¯°ÂãÉ-E“Ûvˆ¬ÓÿéÿFÃÈça¶•s0SO¨u6ÆµŽ™:„Ü8IÅqÙ -ClyPW‡ð}æ!¯têÂT5ðãŒ.ŽS8úŽX«`p> è NèøW›ÍWGÛÇx­Ísbj.B“¶ÿÝÔG‹3Tç ¼äKR´\Ѱ¦òªU@ü ¨gf¸ë8¸mÈŶ%ý0Ä~5à[¨ZC¥—¸¿_‘®'0iPuŠ-àÿâ6Ì.Úv|¨úh†bz[Z‘ÇÇ95Ë?Öüçdç¡Ï¶_ììÛg·Ðëo±/5¾í}ý¦ïá«ã—Àü¿ín«=‘Î;8ä,Ý’]õuçù[ã×f“¤TS µV¤I£‹r•ŠŽƒ$’NtþMÇßôç¥ü{ ¾ð¿ÏwšÇ¶ºý-¾6‹•°^õò¬P“A| °›ŽˆG0ˆÌÂ`„¯>‰a ÂÈ·®bo¼Kz— ©í3aj\áç™Pž{‚…¸ƒÜP4†k¨|–„Þ>á®Õ#Ítù³se<Ç‚ÕÒÉ'†=ŽŸ é艌ÎTW¼*ëâçˆG3L1#KéŠ 63ÄÉì-¬œöÌé%J–[‡HØaŽtÊIHG¼`-±ÉòÂ'°m¡»tÑK ÚM5İœfÍ^®ª¬—Qø°¶1F°áì@ÿ´åÕPîZ'Æ]xÒÀèezÝ;PË„fÁU‡eÿÕ uÙý …®!~—;® 1œv3|ÅZð(íSI¸hž€È–=Õ¹¢RdÔUÓLìØÔs×d?h‘Ħ{Ÿ\SÚ ñõ*JaÖt[fóqÙ;ùbqÁ‹Ù$ù·Ÿ½z’êEðüÕþfsç`ß”þzA|Sä95K’BšÐ‚fOœÜ“¸X*ø·¢ä‘ õ‹€úe$ÔK ör Ü< )ÀF ,C ü«cõð|P@U\¦ö‰›1¡Rv’ –•¼Qµ¸åq¶ÊcBAy ¢Ö{§ Óª›š¥)å÷JE¾£q€rX M‰…‰ÖB‹JÑ«8-…Œ0U2Òó³?ôµY¿ßVÁ¬î·?U‚×ÏJóWÎ-ª ×R±ŽÂüм>Œz(û>4÷~ZäìÝ💮:/âBÕE®Ë€ ûɀřþTüd+ø[¤°b&øË¨…Àå?ìþ.íïúsI @úR@!*§D~{«yü¿(CÜ(TÒ?긎~²ú³Ö±«Ó?hT@ ©Ùëf¥èü#F¹úCú‡üŽ%u_“Óȸm“ |%–e›ÃXU¬™ÇZ0’P»TXWÀ· @ óXñû}×[Œ®´/3¨iMÊâ¿Nþ54ûƒª¢rD†,)vÛÐ}‰#Θ C&nsà TöLLELGâg§ hEåõ›Šò 2ò;L)z±8o ­üRxŒ)à׿ã)&J‚Ó8 ±Då üH#ôk©èÌ.B Äø$xб݋°ÈðäÄdzÖd*ô\%K7~ÖƒûKm€¨‹Ñ¬Þã<œ7n)­¼P©z ” u)±[õž.è4RÄt,WŸÔ_YŸÒG ꓜÚT±‘µi•.×'€Cç"£0G  5p{&TÿÕï·§Õ{ ‰HÖˆU +6YŽ{3 ÐZ4žüÇv ¨"LU¹ôüšé©†ÊË«æÎîNó·œê¢Œ¼ Š!S_dnÇk7ð­ŠK\7|¿ƒëÉ‚º]ï<ð¦O‰ §Sù"Ûááz­Ùx³mKø,ŠgœÝ2 ž­R\DÚÙÛÈHhV0ůú¶Ì;/¸Ë,»úDTo½Å-¶ÛA(¶AB vŽÕ^LÖ%”ÔÄÍT$™·Î²RáÕI·¿´š¾ü ~ü-¸×a÷OÎ5âªÀƒÔC×,CáÀ¦|º€}³&–myÉ´áGÞŽå‰W”•YLf°VA·¨)˜G6¥]$ìö† GéİYñsÔõ,rH–DÄã&rSRìºè$ü¬á'Fq 5%Ñ ÛKÑ:…Û<„î¾MOUJŸRáºÊ„Ó›Æ …, ã!Ã*ÑVׂƒÇ†ïGveåT_e²çíßD-³4™R@Ÿ6P)n\(,¥étz—@ú*M®‡9¤Ý8©ÒTbRdä͇<õÀØx® 01Ë­ìz i´ Ô Ju|J9¸Çd½–7kž©Ø¦3žs@5¥Kïž3¦Å;ŠÇa7ÒÈõÁp9ƒSGÜjâXMÿAÿšC(j¨ÝL,[›•C–©û!Â`&ÁÌ¡äM§w¡ni˜’‘YPÕ"ÊÙ Ú$Ÿå|ŽÇô+Ö?0„|½ºJª r{!?Åó4ä¼à©Ñ@ÜšÓaãÈ®H¡ò´ ûHÛI*Ž.ÎB“y‹¿}óežk$@÷Éë™|…Îð”&,Gù^Ê~¨Ö4lF° ö0j‹–4Mt2¤xÈ9AîËõ«àÎj`®Ë%iƒ ½VWßÖ4.HÐ %+iâ6ßX!ÅÀã ‘óh±ÎãÒÓ㪶žOYÍqT$|fpâdñô5‚zvª”ìœÂb´ôFõÆëu¦–[±w‹ëá™yñì%Ïž;jò ÛËéó¶¦øÝ–,,Ô´¨Vñ—±ª…_~^éƒ|qœñé¹ Ï3~ܲùN‚8 ˜@Eóð­=F¸~),R(¿9Ôf“«HµªÍ’÷ÑÕIÄÍâw…å÷ßÿþwaµ}æ,dª/­ôiô7Ñ•øCLgS8pO¥ÀéiꨂÔZ*õ;B—]=ÐKÆ•5$lŸ}JyÞZBR§ìÖ¨:X*j²’¢b ÔŽ:®>†WÃjL2âÈð)Äô[¬ ÚAé-²ñˆ¦¥ã›¹Ñ`Ð¬ê ¬­ûÖ6Œ†x-G­Òr¤népb˜’AÓDo§Á+ÝQ%±ð¡Íñó»S϶Aáò3ï¬<>-.§ÆÙÄ éS+d¿°—ÊîG輇7qQ»s\ŽUWؾ¡Š¤@ÅÞÞbYX“´ÙÉÚ‚Û<1r›œ‹ÿjô£è—AB±¯ñià]G5TÚyÅòÉN­¡ëh‚P §ÚÚÏ?HS×SsA¨iRe9Ÿ%P¼ú/ÐmÙÐ@ÿ¢õŠæ¯¥ÆHMðs0Ï¢@™o¨v©œŠ’êhû/‘+ ù¢;ª5­PˆÄGz‰Fm-r²EoYu—ûJËF²‘´7$·Á4‹˜†KÛ:— j9Ôä—òkœïF‰QœK˜Ä ‰øÝÈ› ¦Äf a€¯ðï§|l”sªL=úHãíûÛâôиf*sãêÉG¬aç2¼J)î+­«Â»»co›õÔ>Œt60>#«mõÿÌîÁ_Ü%D?£qgÍ’ÕÓ›.æ6ó…“¶füÝØ‹‰L`Õך˜7ÿqÄf$éä@¦*Ý&Ã!Þ¦AxÓÄé3m³:í„g¸×78„0‚pÜÝÓ§%Ò9½cÇ€’ÇHˆœ‘Œ]p4P»ÐÜ^U-îõ ¼ƒ¢ÃŽäl÷¡ ¥nE³×ÚU2LÕº)øÄÂÇÌÚemUµŠ®p½4O:‘¦Aº†+CàœvÅÕªy Θpé‘bõ©©µžG0ÜØ]= 茱&”; ­/()%.]R ±¨!1f1ˆZ¨X"Q'U£îëYCý ¤Þ:»½UÆWYVaYÚ¡Ó Êá?PÊF Ih°ß@k‘Mä䬤‹|.ö·–íÆ#d WHÒbÄImI“Kª0¿ü1±èÅU ðè8 Ï+– 7¨@Qª™"_Š‹TîÈv-÷hª]ýFÁ²YÖavâ!_ÞЫ+“§U¹…ß0® ''õãoÁÂoxwÐêµ£Ù‹³³sX~u‰Ÿq+À_²’/ÌfùA|R§ÓC)P«ÿ§û¨V«£•¤«½3 Æl!mÕë<Ž—lï=ÜЗ2à!ÞMá5€iópC½]¥ª‹ßõ£b–½73®éLwAû³õ¸9-– &5µÐ0ŠO5½Þ`Ø0Ï=›2̆Ù6E­¨m«y‚Ý«|çåi° FS(h°F{4[ø&š^]çeÀ¶ËXX×T¯yæ^Q& %•kÑ8'ÛFs×\H† ¨˜Ð¤¶Ž®[1¤M?oóvå Æ@”¼âãvô›”H’JÙ#÷Й~[Œ ‰ÛÁCyƒ6á³@¤§ÍØ Ì­æY³NýWƒV!ãð—’sK£0OÍǼJ–gæFªy.Éêøž³Õ91©?oDi½¶’éë¨Äýþ¾febåWñßþ®£×I´Ïé.9ö´ËÓrÂe¼?¸¿ë¸È8øÞ@M˜V´ái'6EÆ4¦þ6ÊVÝà %ÜMôb˜'®rŸ´fíZÔÖB$QL<Ï~kël-x¸ãç;NÐò žQ.;ö1üñö‘×}P‰d>iÛ œØüB—“Ž€~·0•뼡f¯XE–µ”._x³Oó·úº^»®º£VwÎ$Sp†+‰,JŒT9Ñ8q¼4/ϯ‚…@ìÓ3¤Fúhü«Ñ}G× ª‚Fåp!tâYS³rRÝC$t½±ünôPÉóU{ÔŒ'õÛ~èÄÓÁ¸Æ6GG>µ *cAu¯ÉÑ\å÷j5J5ç¶‹‡TÀ.¢ÓQ¤Ð¦‹++®«V)#ü•ëB-ì—\é—Óé)0‚ƒ<†)Š[e­ˆ\TÊ’:ºk3½17åCfOX€=¶ï³™Éx(õ¶ê’tÕ:³T:8ýÔNP$‹FÙš2XFßQ#È´òAb‹¬ny;ƒaIUõ®iØÉk[+ª@Sõ›²_S3z™6vXuj Õ“º[ 6äšû1õÕ¶‡ìì LÐùné¦Â4¦)–Ú¬)~V錙w@"ÍPV¥Á¸˜|Ã@fHC:1ÚFÚÃC|b[ªq»¶ÚÒñ÷@mYM"kb“>YïÌ33ªoì±/ÜÌQä8¨·¥oÖíðÚ© @s+/êyýpk¨ìÈ.ü¼>±)G³ÒPV°ºÑÖ:> —.g‚ª\ô:‡,¬íí7®åÆ?#îÿÞVü—Å'¹÷_Vž,—ñ_nåcÝÿ½À¬H-HÖ˽=艣.âúcÅ¨ßŒÞ ìËa+ĵ-¼~œ‹à lXBqþL6Tù( ê âögê¿þ)}„ÜÉ ´¹7œ (…ï¬Ê‘ËEÁ0íB ­:P»øMB\Æ#&Œh¿Z< 0)4«ÁB«Hqc¡rmS@:(›†P¡Ù,t©—M@¦*B›Õ Þ“êKécƒ÷‘©Ã¶iˆ‘ÜlÒUô6³Ó2+ª‰Ši*ô„œFa™éhoÁ|ñ3³±Ì`Ñ1d 8Oˆ+¦;êÆ#Jœ«ÙÖ Ô‘ä4*÷ôg†ó­ÿÄF7tìûoKsñ?V—ëÿm|xý·Füsÿ½‚…~® i»W2ÔÓ´¹u›Btä—m_Ü O &%ùRo€d À ”LT+?Nä4úSÄ:ÊÍýzøÕ1nþcš­ÿ/¯”ï?Þ·b…èGä?oæ3¦à4±ñY_?”!êvùqžÿ/½a–'¼Á7Ÿ&Âóä%†›¨ƒûæ#Y‰ü(ˆ“DOÅÍÎÆéì½I†U÷·}»¹‡Ëÿÿ{t¦1wüP“î¡I’GðÿWYÜqóØ% ež€›!œ{—Å·Qóoʿ痋ðlÈ5kþÓëÍ7ÿ0Íñ©Þÿ]ZXX(ßÿ½güÅ£{û ?ã⿯,Ì;úßòÊâ|)ÿoãò_Ž÷çKÿ.Æ`êvéY¶ˆŽÊAt„Æ·¹×è†ï¢jm|`ztw 4•tza[^:ëðBÁj¢Žj½ÏØÈj„D³UEv!’* «LíÐŒs < 2éìGßL¦D:+ äÛâìD©ˆ©`žN}Å*RÕëŽ?0ݺnŽ“¯žS<¦y´kµ5 |GÇÝP[•Ÿœ¤K¯ýþóDœj±Ù‡ãú^ ÁÍá?Ðó¡âIäm ^Uï“ê(ý(Ùècx j¥7Ì*5£X¿¬üû1ʪC5eÁßí4[×… ùzÎ:ü÷I¢Æ7Ú*TEìõ¨¦< wø@z.ÖSÜê¦ ~ÙVêt~~IÜÆà^€·zªÆh¬î‘½*hþ¶w ùc}³uŒ”ÿKOV/-¸ï¿?.ß¾ú¹H[ê*ûóÍÚAL‚ÅùYÛ«$@Ÿß$fí"b…aÓa…±J¿‘×4—>(—ÝœKaúÇúÜGåG~l"" y ƒÑq”ó £Ç$ízÂiUtšŸ°ZRÕ9YD9ÖÛPof1ú!ö+¯1×ïÕÅ;׫.BÓ?åÖiD¥µ[Tìî/9¦Kßö˜jîÊø”;s‘M$ÒÕà;àŠ/>Õ—ÿìla¤âï-4LÔƒ/LÌEËõ)z9éû–G ßøsëŒçVX}ü\Õ¸Ö' õäÏÞ_Z0.,–ü9þ4{NÆó ÓJÛ…Å øY£½ƒ ­ÜD¾$OÿéuÀ»ÀÓ.ÖŒïOÈóŸ©c,•üþ=ð»¯Ó–åýliêMÜRŽÏ qÖ¾›ùô™JÑø Uî¿· 5aåSï&Ùa,ä¶Êiû…—AÂQÎÚ?ó¬u+O³n¶°ÆY¹Ó}ò™vÆœ_ïµ:dŠÉõN¦ñýôøÚý4ÙꋎX}o´_WO°&h‚nÛ8>v0çŽ c²jxíÛ¼2Á½…;?_zV<ΟRL?#]ÌsÃ0ÙØ>^ü‚†¹ÇK ›¦à”Õ±‡ÔX÷Snà®á!¨ÛèºÇ·0ƒ¾ôPL­Ýº#‘‹–ðEFâÉTãpM…ùÎ-âc#S<þi\_{.1/¿wBåÛè'ŽÙëIÎÔ»ðÓh4‡5½Á 7×îkhšòn˜Š§aS†¦¼óG^ÓéŸ>LË7ÉehÊ;á»Q†¦,CS~eÆs+,CS–¡)¿>–¡)ËД%Oßh“?Ï—¡)K~/CSÞ¥¨ Mùç›PV^†¦üv—Á24åŸ~Öº•—¡)oqWW†¦,g÷ÍÏî24å7& ÊДyž*õÝe†-CSÞü‘sÉñw™ãËД·¢Œ•¡)ÿl« MY†¦,gÓ]¦ÜéT†¦,CS–“ï¦5ÊДw"V9?ÿ ó³ Mù-ÎM_¯•¡)˹?åÜ/CS~÷“ÂÊËД¥ˆ¹êEš²dùožåËД_=†bš² MY†¦œlÊДehÊ24ešò sIšò6&Sš² M©›V†¦,CS–¡)§i£oèÊДAš² MY†¦ô6º MY†¦¼-SñÔ!lÊДwþÈkú1ýÓ‡iù&¹¢ My'|7ÊДehʯÌxn…ehÊ24å×çÏ24eš²äébòçáù24eÉïehÊ»£•¡)ÿ|jÂÊËДßî2X†¦üÓÏZ·ò24å-îêÊДåì¾ùÙ]†¦üÆdAš2ÏSe ¾»Ì°ehÊ›?r.9þ.s|šòV”±24åŸmb•¡)ËДålº³Ë”;ÊДehÊròÝ”£FšòNDÀ*ççŸa~–¡)¿Å¹éëµ24e9÷§œûehÊï~òOXyš²1w@½(CS–,ÿͳ|šò«ÇP,CS–¡)ËД“ Bš² MY†¦,CS~a.)CSÞÆd*CS–¡)uÓÊДehÊ24å4mô ]š2(CS–¡)ËДÞF—¡)ï^hʉ¯fÞ!3ðÔái¾PØÉ±&ôëuî7u 5ýX|™Ð)SÜ-8ðþ&ëâøù£5™¶ZWü6‚+Þ:?¸øÊ˜‡ßbÌÃ[b›2aŠðû`5k!ð‹4+Ù° ÜwØü ÜWòyOïΦo3ž^9™Ê0wßèŒûvÃÜ•“®Œ>÷§˜¢Ÿ«bæøÊ ú'ž ãÇG_¸™~2—wx¾¶NüÆò›ṵ̈ Ãw—™õφï³ÎÈÊz²9ñMFл!Ï)eeð»?ïDø6ƒß}™ÍI·®œ7ÓØè¾É¸uwxêŒÛ×—SëÏ0µ¾Ísßð´ò5¸ŒWNÛÛÕ$¿R´¸?˼°ò2Ð[)îÀ¢^z+Yþ›gù2ÐÛWHVz+½•Þ&„2Ð[è­ ôVzûÂ\Rz»ÉTz+½é¦•ÞÊ@oe ·iÚèº2Ð[Pz+½•Þ¼¾Þ¦Õl¿@o|ÛÑàü—ï™ø 7A¿~S'Tßk ¸»?Neø·ë„óÛR'94¼ËGleä·/ùíûd˜2èÛ úæ_i¾ùcÿ2ÞÛWæ2ëh/òï” ËPow˜}í0Ô›Ÿ]K÷ª2ÊÛ7ÌâV>ÍΦ 7ug–Š2ÀÛ]Gnåx+'Û ìÊØn¢ùv›±Ý¼³³tÙ¿5² ëVÎÍ›ë6f——u¾¶\Ft+#º};ËTÑ­ dõÝω2¢›¡•Ýþ¼¡Œè6fL6»Êˆn®ySFtû !lÊ©õg˜ZeD·[žV¾—ÝÊi{»šdÑí‹ÎÛ +/#º•Òá,ê7Ñm;—ÁÜJn/ƒ¹}oQǾr0·ï°GË8n_;ÚØˆãöýujÂí[ áæíœ¯Ôw zÛ]êŽ2pÛ­L¡2p[¸M7­ ÜVn+·MÓFßЕۂ2pÛ7¸­x彊îÇl»ýö–áÚ&»‘¶ðEµJ–ñ¦ÛIî#~-CðupmŸÑY.ð÷®­5̾ä L~]ã‹ÞÓzÿþ;Öö]”O[š/Š•5ÑìË+˜#ðÝÁ#´/÷<ýëŽÒ·}žþ95™s»çéßõŒý’G¤·ÈyÕäkœ§ïRã›f–oû<ý+ ¡oü<ýÛe®üékœ§ßîû¶ÏÓsXž§i®é±Ü¢‡[ô—7ڱߧÊ {?oÏ}±]ú×§ïb›~½¡ºÃûôïtÖÞÂÞëVXáNíÔ¿_Éñm³Ëw±Wÿj‚èûج‹ìu§vë_•ÿ¾‹íúËr¿^î×Ëýz¹_/5v²Nø«.s#õgÒ»sƒUªÊ·=s'µt×™!¯¦HEeYðÍóË——ß:ËŒº<árÌd<øÓé§ ì§»Ì`_bïî%[È•ÇGëÑ‹ù‡ÜsHîäÍtµPéêûٛ߉Á-œÃž±x?y½aŸrûxPîïÐZvûÇÛëÙoX½MÉà›ßB~­±ú>ö×®»¼‰üNgïml n‰îÚ6òû•!ß<Ó|/ɯ&”n~'‰¾M³Ùðn¾ÚÆï«ŽÄïü¦Œi7jÓŽÓt;µr›vw–Š[ئÝ`·~—*Þ-hü·»;û^Õª;;Pwx_ö]ÎØ[ЯÿŒ;²ïUn|ÛìòìÅʘѫ_iVnÁ&Þ‚}‰ý×_nç“v;Éæ:ñÉ£ÃÃGY”f飴7´¢´ÑêÞPóðy¼¼LŸ<~Lçù7~V–ÿeaaññÂòüâÊÊü_æVæWþÌßPý#?Ã4 Að—nv:ÀNGC|“Ÿ*¬©j¼gƒ‡ðÿ`óàð·£/›AµU ~úéIð,êt‚Ýð$­»ÃλfÔ:OzÞY E¡Tmvv7>„ƒ+œ ä•õÁá!Oå牕¸ Ï( Öóa+¢à8îö;Q3zŸílEVÞËæÞ.¦å­„Ã%Åéì½ø4hG§qµ«ûÛ¿¾ÝÜéùÿ„iÌí„çY·ƒŒ/÷ûò×½¨“FÖh<‚ÿ#RRÓAë‘Ùq˜ÖŽ.bøm¦ß‹’v|z[“ùÏüÇç°Á ȼ‰:FÏÿÅÅÅ•%wþ¯,=.çÿm|`þãxãPæìßÜktÃwQµ¶ Ò^Ðêuûq' ¤tza;ÈÎa’THÏ^œùÍÞ»( ÖÕ¬¦õ2»êG€Žr„þ¯ÓÓ쪃+¶ úMÙ mt€ |f$b‘Ì-Ôljˆø8¦ò þ Ù0™×Lš¡1ëZœUµ´«.£q‚|ÕH'‹$‡&©Vƒz”w—Õ RÈc¤TØèÓóc¤ºŠ¹u»%Ï °‚]ÀHŒô~¯O(§Æ•]ÆÙ94©š„ݨŽJW-è÷Ÿ#Ý(E/ÂN†¨¢u!ã@ÕÆæãoä-uŒÎ V¹ñ; 4*oôáŸvµÒf•šQ¬ß‡V#ƒ°ð÷вÿÕWßg¿ÂýƒýíOVAATŠ…x Ÿ‹“Ù«ë¸LÝeè½j6çË>³{Mæ!FCe5Òi1jôéOðav1ô‡Y hH|}a×'(þÅ,ê«­¢KÞ¢K¾Z—°•þj_Z…}õ.8…—ý…—}5/cͽ‚ª¬â¾º—OÜâËÅW|µCâkoÕfA_½øÚ[)ä’ C-Ê’ ’¡pUŽO þ2МxÐ,DÓò¡iyÐ,B³èkÔ¢lÔEQ£òœ¸°èk×â‰ÓÒ8L¾¦-¶<˜–Ç`ZòµnI ٸ潴pùÚ·tâÃåk Ë×Â¥–—¯‰®e_—UÝɘGv`aóµrùÄ‹ÍÛL›¯Ë-/6oC-l+¾–®È–Ži¦‰Çׯ•“<_M<¾Ö­´òx|M3ð<öµë±X9\Ábpy~6?öµìñ‰ÓÒ8L¾¶AbÓòLO|­{"[W¼8z'ô_Ÿœx¹ ô!óµñI˃Ìm£Ù¾fþ¨q‚vZ³úG_C<ñ¡+h©Î×Ô[>tmµÐýäkìOª± €ÏšÚ?ùšûÓ‰aQ{m„¾ÿÔò",j±‰pqÞÓdLd„ãÛk¢ò4s¨ Zj¢ò4s¨ Úh ò©7‹ R“,C/½s~ѧã,.œøp-Ååk"):#DQ.Ÿ¶³¸¨Ú8BeöÍùEŸÊ³¸xâC—k¦¯¥‹-º\K=è|ÊÏâ’ÐIZûÒBèkîÒ‰aQ{m„¾/µ¼‹Zl!ôéB‹ËºÉE;“óÞ§-.ŸøQ¶ÚFékör˲°ÝJŸj´¸¢>A«Md¾&¯œxµ×DækìJ˃¬¨¥2Ÿ¦„‰bÓX$¤üÒÀ§-a¢ÛÒxl¾†¢ÆäÁæîjóØ|Z&Jl£¶Ø^iàÓœ0ч0ßXB_{Ÿ´¼óíõ ôiP˜¨:p¢6[òÀ§Ea¢ea«m”¾fÿØò£,l·…Ò§Ma¢B9Ò R |&ú‘·ÝFêküO­¤Å­7‘.ù4+L”H'i»‰ÎÓpLô +lµ‰ÎÓdLô +l¯Î§eaâëbñå“K> sx–Æàñ5µ«b‘åÅãÓ¬0ñu±°*K>­ s¨–Æ£òµn±•Gµ<•O›ÂÄ×#DSÑŒ_òiR˜˜Gæo£Ì×È¥–™¿•2Ÿ…‰¯G ¢â¹íÓž0у® ¥6:_S—[>tmµÐù´¦%aDö‹‚YíÓ˜–„QÙ/pŠù¸ÒÊ!ò·ŽEI{6 Ó’lyžŽ³ÔyºÜ¯7ƒV¯!¶Åy÷pKùÈ9.Ïn¤@%>­ðé%y.râ‚H1v*Õ÷ÁÏÁUm2àL±¤}¶¬†<¹ó¤Jšu³…µÊZ°Û.l®Ó6yLå–ÎWV½„6þQ›®Ð|t{}8½ ^\«LW`iÚËk•¢“>LI¢ËNœD#ú*Ÿ*ÞÃ=ïÀzIXY«Lüx­bøEŒ¢ÕG§> µÏ!×fï°Ý7ü)ðÿ»)×?úŒñÿ[X|2ïøÿ-¯Lã,§½A°·ËÚ¢÷™bªB±v˜…ì CH®¿„ƒæUÐ; Rôícð à9±š]VºFÏMãÔæ–vÎÅ(ù(jõmQ@H*Ä ´œ÷û/¬aκ ó7{ÝnÈK~Õ•bõüBX³ #÷é²#êCF–œ¢ ªÜki½4ÌòéìÌGáN¬¾~SŸ .»NFÇNÅ®‡n_À~Z¬²÷_¿ñÔV©Ö*9@¨A! xÁÉì˜ÕúQøTÉAv”·œîµíNÔþp<ÄÕÙ™™Qй9Ë+7mÄ»¯VŒsTe²h¿½\Wk"è;ßhAàõ!ÒZONó<žW}˜’NP厪K–‡Y²&‰;Dá;®Â‰9½ø ¼ê†ŸÂO–Jd•âtRµéƒ‘%ûýÃpᬇ™½neX$G} 8?öÀ<8ä*”ÜG‘ LH°ÿwÆû³ÍI°qÜÄ_°á £63 ¤­AÜϤ UQÐw4!fxZ—”qàAˆw‹Nã3±\­ãò¸I)XɃpVªéItæMï trU¡ÊÕ÷š‚…Äx`#}|–„¸ÉØÈzÝFÿ¸Ô·²÷÷¸¢ÿãGF®³½þU›™QêFƒ³(x¨Iûë$¥Òè¿Ã(i‘aCMzÙ9$ÍР’^ßÌN³^_åá zµ†4.&Ø0… K[Còo?pØ’lÀ4Î=%]E “;+nI8£$¢³Ê} ’V©¼ÄS(&¸ND56Ï£d»“FÔiU… ÁjvÇ9ݨpˆû2X´Ó\gc3H§g÷'ýV- ¢Ý10劖ç”ÑÏ\FF+þêy~ÿ$%ôC³%'1Œ“UÞˆÚ„/žKèS‹žã{3„ý_ãìüºå£nLcÁE% žEI43?¹áeh–Õ‰’”‡K³¤|òák é/øñ¬ÿݰÒ!º¹#€Ñë?ê}îú¿²´P¾ÿr+\YôxîÚß<ÓþòœNÓ»æúÏ¿(€Nð¼ ˜ HZG4h¾£×¢0Ÿ’QóptszÃ7¤?L]œ´¸¢`5\5T2$tôžJy dÖ,RKqsûhÄ^ÃáØ@|Û¦įÍ‚$AâAŽ ‰.,&-¨õ9¸Å„ä{uï’)ja·w=ïœA:*":ñàtGÀY98J‚\ˆÔ©¢‡œà„{q“ùj½“nS‡ÈêMAuœ6£AwfÆÖŠLºnœ@Ì8ZÔì êìÙL>¦jÔíSŽì©ç€íéd´t†‰ž²8R§/VªÀ¸ÃNmÅ…º£Dl´fPqîg!?æœU)”Ñ ¾\AH½àкD@xUc(´R·©gv ‹«ëð ‚ÔNì¥TYØŒ1ÄH‰Ÿˆü¢@þŒ ÁïºÍ¶ânç‰ÝCA¶Ø@Å'ä+§ Cà€N¾iÈ#4v€´êplMôBagˆ]AˆqÎ !iHÂéBð¾`)ÆB»Ý™¤í*,¤u»0¤ÜK˜ªRÍG¶T)õ”aÝýîŒ]¾a €Ó+j績 ¼Ä¾rí±ž[ˬµÞíåȘžäHì4Ì [®X_xÅRObwV÷>ÀŸuFãžüþ _L¢Ë=è^ݬÁT¿¯Ã êç ãtÛì|(j†Q™ìŒ<ÙèíÀãíãíý&0÷Æ3ñåÕþ?÷~Ý×íPàÕnyõ5XW%Çi2ã›s?p‡ÌH±~ iø/ÅËcí¶ðœ•¥5œ¢‰¤Et£äD õÖPrÕé„nM`à6d[føäÜiRVÔ"ª³«šR3ËNU4ø›ô¶Áâ°š¤èÿUE½º$JhXœ‹Š É ûÙ,µß+¬P•ú?®Ú•‹Z[¹ºOVÉöÒøãìŒ µa=8xÕ,(£¹ÙP–ª;ûÕ·L'Çò!2‘Nü©ŠX*S꘤©8a=]ôBª§ œ"ÅéÚfæ/…óQ‚\£Vuæ+DŽIÌ8yð»9fC«Œ*¤$[PÝü ~¬Ÿê¡=­Ö ‘Aù[ E£/EPBDÒúºùAü’Àõ€ƒD`r›×½¯QªáÅMGøÃi¸éÅ%Q?¬ÕfÝnG!{1}ºç¸Ðš1ŽqMØ ÚÑi8ìd–í eç½¶²Cè1݃ B‚+E•Wþ•g•<¬üá.1¼‹NóF÷èÿÕx¡Ä‹îr Ь£v J‰¬NtšÓrY¤Y‰œA|vîɲ)«J;—ª5…R°ìšF(S óz¼°&¸H—•ˆa¢jºäªÅ ÔD5õ{«ršótQ¨ ùâÝZ$@¬V¡’áE‚aÈaÊ}b 0¦1,ºˆy õ@a«¡'Jhœuž ôX,M«œU¬®¼¥t NG¡K”Øéoi†R¬±~w‚*Âæ‡ Êݺ‡ãëbøYÇ[÷³z]6âPüƒ©J×[7‡s EoÝV))>åTŠ¿N7|ìœçå[aSÁdRx-[0‡9\yQ+™–ýO A›/œ—±3yûMr€iÀ€­É¡ä2íô s•¦ ZñD²I¸Ê¯Ê÷›™b_ޤšòÞZYÙ2W.’Ÿ4¯’]£:£ÞÂX˜¹Æ˜XÍ›ñ¶­ê¬aJ®ÍRi1úN¹¸ñÂvúM7¯>‚ºèènùæ’Mo²Æ’-¶/TŽ*¾)¬Naþ¾’~7Ø?hn¯—ça†:a($w¯ÕRHŽ;Qp Âs¡M;ñ÷ øÒðt&H¢¨‡W­ó09• ð¡ùŠ7W§f×õ‚,|‡‡Ör{Õ°åâY×ÃÚ¤‹Lñ‚Bùè¡&P·Ð¸ˆÅþø`o›:‰5yÊÃ^\ågÙ×HÎÐÕß2_¤3¹ÕR-ØëºèW†ª\T¤¶mÕ.ØCÐÂEæ<&^µF”Áj­jj}?º‰aŒF5¡ jÊ”êz«GvWLÇŽ›F!—èˆCjœØÛr#ýT©9JéÄ\¹9WÙ‹îÈåLj*CRŒcîb’lmª€0[ÅOÞ|_L‘OÝÊ“äSº4M4Ø‚M袛Úh›É1IËN$ìtG uÄW+4v+~mñ;šJâ`¦šÀü™fú év#g%“odA4í2³bCið©çÿ q> æ UßÕéÍA4­'t|oÒ%ñÍé]ʹ$h¦Èm<Ûi7‘úë·É/t<OÌ(P}ªÎ£ögm×LDcWzÛ–5VFåyÄàâ0]¹»@ƒ†¬‘†WhÒ¬ˆ£¦0‰zÔ»ª L+‹Ú¿'ø‚ª133ÒV`,äU»}¬þªÆûOóˆ‰=½£Mò¨Ï0m|7â‹Ï‚'ãÇé™@öš[JtêÿÏÞ¿®· ÃèûWº D³2ÄéÓ„zE¶å¯ø´$M&k{½ J°A€H2vžï2ö¾½ïJvú„IÙ²<É“±H »ºººººººªÚ™ó_‡¤—ßr,§,*ýìð=ÏÙÐUçüuË2ÚŽãs`8äü¡µtÈÏÖ6^éñ¨%6:zÃ:øèû‡êHKö=TUã¸~éªÊ·ÝÂr>¤(lQHEè uJ;tú:èªß¨‘¶$ÐKàœLužvZêÔNÊuëËuËå ¼A—ìN¨F8hk7û+Â;Íf~÷Fä+…»• =PLN¨8ó±T0k¹_Ö±‰u²ôèªÒeÎ@ÔÝ•*uArË?»åšµƒ¢ªÚ#/u5øQE\ÑŒÙ#Øu³¦vÎD)q¿È'™8ÓyCbI£¸W·¼’CqõFDcì"ƬˆŸjµ!Au>µ#ÂHÁvŸñ©³ç µÕ¿ŒÙþÝ]GµŒF/ðÜmL™ÄGVïõ£Ž'—tƒ›?ªmVw¢1‡Ëú»¤zÒ×ð89_éCóO_–¡eåPBÉ ìãi>wǧÚfö/ºØJÿÉmøùjŒ0,_J–.ûÀ«ÌÆ’TÚ§óYJÉA…Õ_Ò?­MÍ¿‘Ät>ãäåíK¸ìE LŠÇëìKÕc²¬̣喠Ï8Þe“ µS¶‘6q—§6Ô%[S|tÚ²¶Ùž§;Á/¨çµ\¦^z†ÝÔ#åOuZ*Sµ*ÙÛ¬’QG÷ n³^™Ÿj°ú·Ùli×ÖO™óò#,ßIT÷ž-e£ yËK×çO§áRqÕ¢l¹'Yœ.àÀÃUl¦Ähesë2Vvãµp²±|Ò6øä½(i~kÁZ°V?UY+)q»/DsÌ]c|¤Ø‚±V2ô¬Lh2bЛÆÉ½VšÙkÍóÔÁÒL7,5CÉ +ÈZýë0ó;ƒDõjM‰¶dA+²Â¸X(‹§ßî†c:¨ÅŽùȪ-ˆ–¶]ÿ*£hqèã½Y†a¦³pˆÃú¤†Ã‡£1£#ÇŠ Ò‰xxZ&+ŒÆŸxaá‘ràiÿc×›ݹ+޾gžÎâä@»”Fœ«UÌB¾Í;¿“&5×XÏJ³æ1u½Í »2(“²ÏÖЕ²yˤ÷¢¥ö”Äwe$å±CŽA4†M2¹â¢yþÞê”F–Ä­ÛA8|Ï0 /žÅµCg7ù/ÄÅdùè‰~ aOŠh"ŸÒ°Räg¼È]xǦ–t³»˜@‹hÊÔ@dåÁ󸘵ÃéÔ #}h|Ï]k|mõØ=U`j.(©.¨I8å¼ËÈ>Æ£—Ë–ü’m`òd4ËßWáø/?^ÿ­btñi{8ùü6–äÙ¹Û¹_Îÿ²s÷öMü÷u|H‚9ãý©1àRï ›çò«^PH§>,åg <†5åMúÃÅåy£û¯§ýÞ|èÿW–n‰þ¿s·SÎÿv÷æþ—ëùXúÿoA÷¯l÷Að¸Û€U²Å”Þ¾€·/l¥ºœ3¥½h;TQ«‰¶IÉén5žµËÛÃE½2Y\ª»Bgá^„J¸[ÄyÁÁF´FSr½Ô,ö˜?A¯(†.»/`!åÍÑ#Pþó øÍŠÎ‡Ÿyý”²y::Ð)Guÿ´µTQç×’Q: MÎG÷”“Ó=SÑ;ê)€Dƒª<~óVÙ°ÓèLZ.‡À!üŽaÉ£b“£²GôÑH>êÇ£ÀSÙ{¨ÅÆaPPéõ¡à-¹¤E!`¯çýNžÈëMãü‡ø!µÉÄ¥§r™Ÿ iÛc õªäT‡1æ4q¨[8ÇêÅ&òQ“ ¡' Ð€¦Àš=œ˜=¹ÍgíL@óC ü¦ºôëžüîòouúò¬ý·æV®¨Ch±šüÐ/Is§7Wf^ÈÎßñëµìà—0¿u*ˆ¯ù»~eýrèÔC}õ¢ZjÕ³Îïñ¼&zÙϤ^¹š +ÀâøÝo(§ý½± ýh*É3Ô/º±%°F”Ï„/{Ž9}AÞö ètÑ8šF àAY™ò=oÍØœŒ |÷ݲVIñ  ÿÐOî®r—»û ~^;®ôºÄêC¬¶ šÑE>¹©šÙŽ«¥Ï3µ\Ôá1Íq¦%¹d=h¢º]Ûl'¤¶~°Jmãà9>FÏñ±\&T²Jèj\ÔþÙ­mùÀ6Á6E–—•À~n¼1VmÚ~f¾È©ášcªj(k[òi%Èí‚ÎÛnÂ#=ª•¹ÅeŠ–Áll{é)õžgÉ(aè¥ß.T§ô9如ˆë5â/ë þ ¬fœ“õm<¶^ãŒ^´´¢g„:2¶œœ¦¨92.½£4s}n«Ds}½ö4RdJí+äñ™²¯öŽà§šÐ-¥¨§‰’y“^ZÇòU{%kfü£Æ@)jYé½mÔ˜" ˜R)Û‰…¬ßµVG,s\_æ•Óšý`½ÆèàÈŽ{ƒ#ª¦†¾5Ûk }{Â:¶Î>).–ü¡&E‡Ö5\Ód_ôŒŠU²oôŒ²I²¯u ×ôØÅ¢ÎfØw4‹²°¯ׯח•¿dÉë«…¾l°+í,,‹\_/×®¥­/KbÕþÕ·V2Çѽz"»­æ}YÖKV¯¾ZÃolC¿éOýöÛO^ì]aËλ;÷JöŸ;;wnü?®å³0c¢êl;‰N£¤âÆác6Þ,KÞdzV°~vOÎ$+fÉk ì»GÞ8Ï&–¥ÇóCï¿ÂÓPWn{Þ!K‚f1ŠÇã(ç¥a"®M ø]ì’0=ž‡ÇQ %oɳütšå³uËg{1d‹:@Äù¢<¿Ø,<¼ÃtžÆC€«ˆ¶7½Î³aTQ±N6+FÚ·êc„j ["ÎèæÇÝ,rŸDy‰b ¨h¯¯¿Ìðj ›Sã%È"¢ÓI¾o¦°H„Þ^ÚÌG!ÝØ² ÓÙ{–޳|ÂÔ 2ØDÂxÐÿf ,=ëk'³Ù´÷í·gggÛE†Še‡íqþí$ŠßEßæÃoMíoa)‰ÎÛ'3ôhÙ-ßÛ„ÀËgè¢MŒŠÚû¼â†ç?Šøªå©¾œ¡m»Ö¬¯ËUv†g Ò<‰¹Ù*V˜L8ñ?€—@»ÄZ†Y:ÃK°PàiÞˆë*»]6®œäØÓ8ÏRd¿¾¾ïvˆ/ïevê‘PÕ¸»Fv´$ Oy¬ô—ÐḆ¨q—=FA§bÎ Ó#KÑ;U4 ý„¬³bÆ©º£‰l“êf¦Q¦¾®“Ñ/d"¥Æàð€º¬Úñå5I¢.Ÿ0ÉQ]Ö¤°±ï­X÷dŽøð§µ¶[ºŒéN§8§3Û€ºƒ*‘ÿ@%C›a\]à;™#X=fó¤@ \®¼Î2ÞÅé5é²{À‹kŽx‰¸ æ¨êå(F¸a,°'‘¹%LAЄ$o¼Q‰Ò^ߨ5P‹€£Žç‹W…GÃu‰Jb¢4#ŠPÌQjFy0€S ÀíÙÌ jÁŠœ4‡Hc\[ÃûDQ¤R˜Ú[-Ô>V‚ý!jèÍ|Ši¥àñ%ŽŽ•A)F£ÒóQŒŠfaœ-¨þ[êu–‡)©{¨^‚èL’h¨´®Ç/¤(:{?FyÄaRyŽÐâš×g8}ØI’õIœÓ}ðkÊKý) ³¶†·d“&HfŸíË~ :•ƒºby•¯­Ù¤å ÌoåâÙ…q‚‡º 6gy–˜¨¾T „º?x{!orøºøÉ9 Óð×Òc†¢‰ @jæÇ°8¦ TN¶á•n§ÚŒ´ðti>¾ƒà€—Úœîd<އ1.-E4£G\F¥€}Ž Æö}t!x¾x l6Ü~+\¦yvãÕm° (ØÞ7»à¦9èéøC`žÿ—JBÿo·»-jãÙKŒï}n¦Û€'gYþëñ Ä¸7ER’"ÿSŸ3xlîgPR²³‚½~ mN5 ×„ʶÆÂZµÓX+ÅX¬­íÖm­­ýˆäxï| Ž£sÓ,<'a¾ Ïðò7Ú[•ÿµ5ÐÏu |äö?Œa L§eŽã¼@¦Jæ“TqmA³¦¼L›€ŸF”Qð0æbškxR­Ó“¦¯Ï;òN]îJØ ’B*†$ZR¹QCÉGë‚·z˜øü¡',ˆ)Ðlßãµ{XéI6|‡‚0Á’7¼¾rúª<Ö˜kNÆáê'rÍ) ýeù6;´ÿ#<lû²ÙÕßþþ)÷¿wïuoî¿–Oeü…Ã÷{éè*ùàòã§ÓéÜŒÿu|Ç0ÛfKïç».Öÿ»î]+þëÎ}ŒÿºsÿÆÿóZ>þ–çŒt­hwgç;2Ò?Ð\QœÄtŸ¹ì|cZn;µAƒo‘7h"WÀtÈžŸF#tôôð¿gÊžOÚ;+3žQf ÐhgC´ BTÐÈM±õhi&­­ˆÂ|xRqEþ=̉‰9Pk¿¾>Ú{ùÃ3ô½óJ^¤Æ×q/ϳ¼ìZz5xju»Ö·0=„]’å]ÊÚ¼÷$8ŽfÃ` ·þúZÍÔÅWÃMØëYyÜð>iy& ‘Êï¢Se/ZûPòˆ<˜Xµ“Œq¾\*­ìÂØ:°+‹ÐR G@zMÉ`?…Í(ær…|€þ ùÆò%Ôlc#\Dšb˜$ª¨` $ èq÷Ú?äÙ|êÑõaþÖ›m*áÑAµBÔz»Õª¤0ó>Ô·²›Ì¼DgÍ{ˆ)«q«[-ž´–{ÌÕ¯ Þ3< ¡”ŽQpQ"¿ËwñO¿èÓj üþĺ¯“yñiu1¡8*“þ&ïkn5p§œEv{´-f‰aËC¶!ëbt+7žy^ж¼ ãE<ÞQ™að^&´32 ã±U¿‰ u‹(šPº™'M ò(ÕÍÐæ~åÑHCÒ_¨[ú„pij–(LÉ©h'i…ÅŒwn"‰XÂ(0س0Nùq%Àbs€ÙÖ%w“"ë±ÌF.¢,Jå~r¾HŒÑüÄòHxñêɳ§Ïï>{õ²çÙøBòÚRèJþ ¢S+<’U×vDç|¨ÉÇ.éqU©^«F@L@À¿y äFG–d¼šhÂþy¯wR’‹üS^nbýá<ÏéŸ*ß´_ã.¥`”Š"$œˆçüZðÏ9Í”JöDIžðõC©¥^ã{ÎÚƒðÏ ïœ X•=IM¥ Øm[ÅøzVÊ€ó±ÃçNê_ΧÎTM(ÄâþúßÜÆ¥ Fds@Ñx6¹9ä©™Eïl:{¬^tÄYž|–è›ow,±e ò:£3J’Cä#ËdÔ` Ï#­fèK Œ‚7oÍëu• F°7>û4ZEÞ®ëÜ]þ ® ³ƒ¢Õë%¹gë!ö?‡òÃsœoˆS~qŒ„¬¨jÈßTA¿EæÁÒÖâ+E7UÙM*¼›\›â|o„Ô£:ž¯×7T0úÔ=Ò0úe{ú1ðÖm~‘FZÐËšö<3Ìš •Ûé´ÔigR¹ujiáyŽòîå|²˜€§hhöaý I¶+æô‹ÈÚ £KâLµÔª£N5‚å=$$X Ò°Í‹t¼7§okGq½4ÿ ؾ vÍJö±×·:-Ï?íõ¨óª,&\«£ÑF%¦S‰öle::c¨ú­ˆ@5î!vP¨YCL‡–oÉZ(R¤#k‚+ˆ¨'8{~ÂíSîwF6ÔšŠ–]Ÿ‹ ƒa¡ŸÖ×O„)\ÑQ;§Ym —Š#fW#Å« X’M-3Û˜è’jð›Žwl µ0Üq¯çË`*©o°e¦Œ%¤z¨å·M3˜Ÿ@}kZ}ê!cE†+úùQñ'|×ZÊVhwZPvZŸÒ­z@ŸÚC€½o ³ySöί°µ[+é ¶*‡ ¨òl¬c÷¸ƒHV ÙlE×LZýMý•DÆÃ> GsO¸)ëãžm°Ù29%™É%¨¹Üjfà4ˆ‚ÿZím–Äö@Ñúì¯/öz5[‚¸H7gx–“€Þ=Êø¤ê‚}Ôˆ¥Yâuä~GxmÏ{4Ÿy'ÙÙª£¦?›_·“üSó’ªDwƒ2R;Ý‘#^í4O#çù2`e60jïexÔéF ·[Š”¼“è0å´æÉÒ“(rJþw5zæ¨uE%–ýd†7Šæ{ʹmiÏz‰£î®°Ø²©ª[hnÂÒH ödsgü”ù¦ôÍ·?Õ"iØNO²Qv–ÍÌ5ͬ«¶ÄëÓR.N›8¯LÈ((WÜv‡òí2~WÆ‹†ùR»”gW*5V„I9Ñ—AdSÇJ;«Ad±Ñyi‰\geè|Â&qÖŽ‹=²×AQµoR¬Q³˜²r"Ń¢FT6Ex’z?e«÷²Â*L&Ñdå¸%P¥V}G~EŒnù梼³*.âæa!lÏX•¶5Æ´Y'Œ—´FUXªµJ…}ß³KÎuöêh £ç6Z& L÷r»þ¶Aaì¿‹–¥5ïÒÄz™¥“… ¸€oêû*ƒo³ ."‹º^³óAÞá%æ¸G€-ü³ÉRÏF LPOš•†ß(-U4íõ€z\Ã&ŸÚ_DËž|™áǸÕ>Y4Ð_gœU¿¯h|uGÝÑlšÏ+hšŸÔ«GÑqœV¶[ÓþÎ’Ý׫¡ö ª;;âE"rMïê»Unx/UÐ%¡ÁjHèƒlR‰Ö @ú²¬ÕÉÆ¹èéÊ“Ñ]ë)TU«r ˆ°¬CÀ¾ñ@ŸÚ•ÇÚ}k€²½ o Hf%½ÐQ{ž¯²©ƒº¾¦âÑcºQ Ê­ x´k³ä*±YfÅÇ@*±íu³P±™XEë#ÑiáîMNw‰ü mî•ãÒ¦@9aꪯ™ãT6 Mû<µæ,V×*wÕ˜ÓW{¸õÔ? $·Œ4t«Ã·8ÃÌ\¹p‡×hsz+÷Ûú3,Óã5';;ïÓÞ¼-‘Œ¨¬Zä2I©ÈºÞ-N蘀3®ûy0æ;0„0çR<ðÆ0!}>Gt·r¨öwØkž#“´øTÂLO±5ÓùîQ Oa¨(ü'¥¹€û¸RsàÜ×±¶Ç¿Â£À>ÚNí<3)ïw¡ìCEïy5Fn³cV2ôV07û,¾µÞM?g‰d>á¿ÿìXœ@,ˆç9ë†ñlnZ7LÆüHhi¦Â‹ÛñÅAôeýßÎ÷ò·ðiôÿër[ÿ}÷þ½²ÿ×½Û;7þ_×ñÑèŽô×qSÎ^\®}¾ð iŒeŒ‹YÂ^¥xZ!.m‰õ-ÁüEJéò ¥U£SYݨ¨VD¥©# ¾ZË_Ùb/rB¼!f\•ÊM„h2ƒOíиK‰E°¦’Þ÷†¥ÔÞü×%Í”õÒå{9ï_f/×ÐÇËïëú´-#\ñ²¶TÓBµZÞåÙ‚ ³D½fÉÏ>©ßt´*Éd(öŠÑjcbrçñõž0 Ôø7±zЄ—=€ÁçðJ™Œ¾/Xóâb®vS󵵿ú?kbWrвøï»w»ýÿîþ-¶öH_‡þ_ºåÇÑÒ×ËWý(} 0¥¨PIð*õvTãtÍ÷×ü65sÒE3ﹺ·DŠl?´;­ÊÖ:—ëôX¥LšÜ­T=µVmãÚræÁfØòf9è9Ogm úSã[Õ½À«+Bh‘ܤp`¨* ÇgÃáœóx©\LÜ%ï×#.¶è""”Ö¼¨êu¢_–÷œfd¶èÌŽ±Ô'ÀgñìsbIG ±W˜}ä ÷;˜DȂǦ1î.6¸ÙÂÔD˜Y@üÔ ÃÛ”ÛJõ•ßS¤;Þ…‚uuè´¢ŠÊï¢ËËåJk&Ó&«4Öð|þèȦÌÝ“©Mû´£ÿ6Fë뙀$£ZLœÆ9¥.ÂB°=ϯãà-ƒ$b¼9@[,ûŒz«°ß`µ®™1Xµ{˜8*Skf ¦Sâô8*†b\šÆÙ˜ããcDI@ 3h¯˜bž)ôüRWz1É~k}ݧqý“«ºdñúûnçžuÿ',ü;»w:Ý›õÿ:>x4Â#}m†¿—YºíÚõp>ÕYú¶ùêÉŦ. ±t‡—OwÙ®'JÚ ædô2›ñ¥ì t¯Y÷…¤³ºÒîÕþ“£ƒ½C‘÷´´ÿ9º€nŒŽÞGxèšbòDz‘¢±îš`SZýâÍQ+ ۸)­v5õ•(.É®S©‡ð9ã‹)Ÿù5™rô[“A‘ZWŸna¼¸ K³Hv]傸'ãÔ8\”˜búÖ;ÚØ¿„×=g€è•·l0µ ßÏÂÖ¹øÓ-šN2:Li¨¡La¡W„8äñ9í=ÊÞÿ´û·ƒ‹ŠÁ„bŸï4–&}aØÒ°ØßÛ=ÜÛ_ZžÿnRø¾-eéðöì6ƒV¢Ž«ÌÛ÷ÌÙðûiJF""±ø¦ls²z£TPl/ΙiTÊQN«Ý…Í6·Êů­Áò|¼!î¶ÿ]'xGYüíhaÞŸÛØaùwµ5¦ a¥«¼R]„&»ô&Ú¸¡gÈaŸBPbкnËúq0 Þµù± C¼Û”› *~]ƒxÓ²>ؽd³ŽTªá4â#ãÂSªí´ò‘±ÍDŠN–ÝÃ~Ô@;ñ »,Wà4®åE{^”Zu˜‘Ùöeœõ´Ë»¥ç/DŒ”?–öøv"´Õãv+Ç„šœÃŠvW($éò$41Ùœ8{8±ê_¬$Rh¢ ½0…^˜B–”KÉô…†êWZïPX?CùXœ‚̆/^”_Ø’ûYß~™È‚ÚGØ8 (®ò±¥N™â¦xXtˆ7#½j€õ5‘úÏJ/¼Œ8j–±–nÊu«É<Ç“,›vE/æ͵W+O˜f[ò|TýêXÏÛÁµh£õ€ž?£Læ“g°S(äÈ£hmwäµ·ñKªOzø(NÙŒøž0ÄRÞÆîÏ{˜TšhòTñKJ^èúzúÓª2jµlxâ¡…(Ææ¼ÚÞþÓ6öÀ.1²K@;Úøo>Ls´~ ô<§IüI:{C·€ƒƒ¹%«3§8O¡@ì—Γ„©ŒGAžÅ†}žDov‚ÎÛ€+÷i¢˜IÂ˾Ͼí0ˆÍòf,úÈñð¸å_'H[MëûÑcºWj›¥¾-†Îàak9'?X4(££°wËC]Ê~G]ÐüPtÓR*oƒ`à˜ ›=PÒ#¡¤ä#ç§·ø» DJæ&qSèÇ«'v1YB±^“3Ûô*:ñ™^“N@wÕÐs§l·Z¶Ke7[%mÞwHê©Zt¨6½ê–^uõ«¢³IïÈð¯©ÖiÙÕ‹n]ÿ}ç0“ lÒá‹ãœ‚4BpbNºMåÐIWuO|„mÂ8«èÌÈPÐðÔáBÀ’ê}÷Vçm«BFg%€{01dv¼)ÍÞyL8»oÞwô+Ä¡òžº,›f晹f)¶óíéÚ’#Å«-9r¹×Ne²œ—³­fVgu|XáØ2ÃzÛÞ2®{ï2\##½Zsýd×-âཱུ(-ä<Ín†Û\ÎÒìd¸©<¨›eèdþjÃXŠÚJy ¹€Ê»ÃJm;sLY´½qb‹£·5›ô/ª:°ª5‰sDêš§=Sm¦ j ¤xiV„ÒK‚ QÜs‡DOvn\MêɶLÒIizê;2-—,•žžÉ*qL^Å”Ud|«ÎxY/±+™À&›Ö ±L-và¶XÉ7n´è­J³}x 'À‹¯<#!0¤¡;Àè(¾E©.%EoÒ÷.ûˆ® ·uj\¯QÇé$††S-ÑcÖFƉñ©ãÞë%Š"ˆ5˜ö=.í0IðEÁN³¢D3gBh²-aëÎR¶æÀ™ÖÐ>ÞWÓÑj¢J"§ÆRÌ\t(rå2"o¤nsq[D¯øÔÎ*±t+¨Û‘Í9l‡S¶'P'én„1^Ûƒ¹—Ñ´ˆº¸åm³Lë è³ð‚TQ°{Oè´EBöÝù¨4ð_?ê÷Ý6°á=0Ëè†FY—¸Ýö<2Ìa§Ž7CÀvÞ/Zúý|O÷¡¤âö†Ö˜¬Å‡@1åäâjž]ïn[ "̉‰Œ3ÕÃs4ÞäHÑ{vQ6SgXJÉ~)v¿­îãKbR„3ÂÌr¤«ÜiCð²#S…‰âLº[k6fŽ=:/€¡sœ­™ø…¼×ƒ‰Llå[\ÖR F||{ËìèsºS¿ÚÑÏQ‘Á¶ëu6ÖÓ $¤:]yù¼ï?|«²ØêØ'¡Öl¡_RN÷'ó……gØNô×aœ·µÛТYžÊÇm­$gñzOµ¢»*ŸT3ܰ¦t¨óB„JU”jš ìZ°öëÔ@©c«‚Q†XGqŽF;X·H&Œ¤ðsß¾bL>Ú­ "ˆ£»ÉÔ*ÔûõDmɨ'šüÔGGÌ|ðÿÙmµÔ8HËÖ^Š!`ù–‹ºgô[þE¹ÐUÊèÆ¥ÁÕtFÅHû~а«flZŽ=°°PÔ…è”1µe«‘¶xhÚrƒ_¥ ƸȳÄP‡µauµºkCŒabòž…o@'ãI“‡ð…k9«;Àw—Cýõ’w²ö–Õž‹,…”Û¢RYÌáÂ%ËÃ4+ŠxDtÝ»’µdØÍòø˜4G‡Ã^N£ ½Yñ`PÇí-€¬cë^/Ú–$ãšGÄŠ…h[…25ÛmÃËrcÄÓUÊüGѺ}n]'¨Éò>"å¤ïP› ÐêFÆešÂ½v±a‹ì‘S5µFVh€­‘Ýß]: E’,¦G@)¶ƒFŬøƒ@äµ}c3vé™ ,g¾åþH} ¬­$È*« õœSJ¸›,.¥›”? Yâ úGÁ€4ëŠá’÷¾nI«V¼ªG£€]å5;(¶ù²^~px«jA-zf`êÕˆfÅøQ³øœz¿†:† pa=kʬÉÁ™,ñHÂÑŠúúT“”W¥¯¿Ñ;3¥¥F¦Þ— Å|ÖÍ!ø’DU†N>ΦUÃfH%‰3ÃÈE›9‘î±—¹å]ôÊ/3`¦HML×ÇÈ?>šf[2kÖ1§Ç™ƒ·]îÿqOŠäÈá…ì¸ÆÆšW-{kbšk‡†'—phX¿„ÑJ~ Û©àe=tq9Õ¹X>o‚Q“7Áš<£ *˜êR¿ŠcÁr,xRv,¸ñ+Xůà%ï{kÝ ^¶kŽTéÉ'œðÚ^(õ>øºþ¤÷Æëà+{T|œzKVs:¨84¹¨òëxT[v gKMåÞ ÕJ«8)˜Ç»l7ÏË®óX=u8-œÊ¾¾¹4R]]8yU¡%3˜Ê™3ÝÅ…>ªÐ—p­¨¢«t­°ßÎÂyð›% F¥"õK@¥¤oж¼ÝjQR„Ta\ÿT¡’GÇ“fƒ…>¥ø ^e§ŽõŸŽ#Ÿ³AØ”ƒka5Y^X{~q|”¢C<ìn)SÖ(:ýXïaaO»©6h®®\cP6€¦ø5üX÷·ÌƆ'޳•—.T»¥ÌVEšð¥Š0ã)ÄßŰkJ¶ˆÅ'qŠ[j÷bê鋱Ĩȸ¡AÎÐUô㲑ÓÊt”¶¬W&Q™µ–}>¨¦èfËi^7±ÖØ4± 6¯Tù»þC#lLB2n–êI I×@S5‚5 ­‘D»§©ÞÄz³©¶'Z技–ÊCSÙzÇLPöÌ¡ÕÈ˲yÙžèmsiÿ„/­{]¢Œ/Ûz÷,oxŒoø¿‘Klvå$D‰mÅxÆ»UùEX¨pÖÇf™Ã4éœÕîvZHóè·ÿXPp$<[*,ç%Hš±)cïå¥5VÚg6:ÎY.Þ,VðäÂür7èj ·hÉÎ3LÊýâ[6È„—ißÅhL{[ñX÷Èti@y(‹E-¡hššë–ÎuÚO›öu®cÿÙ“›qnG0;™¬’#,he Ú¼×KÕÒõ@ŒiXÜDEoÂßA¹Ê@`Ý^ßKou¼^jwXÍYVÄáßvœJü.„Làé2ìyþ´G4IÏô<²@Bë@%Æ4^S>Ý·Ú‚g¼â5žkDjÛHš9Ô(åt…,}óÊøH•8Ç–Ïõ  rFh:‘†õq\ Ëù0íº§n¼ÔÀWc¦ëˆ/Ö§ðXX´&ý»©R×å|ÁC݃û–âÓï¶£c-ˆÕÙ+fÄáƒfº VNªÉOaKÇSzÕ4¡Í“"(n<>É£*JbžÇxß›Ù]¥œéå}IQ)6Ž8Ê<*©9&­YîA“(lT¬^òù†rp"Üœ ºÃØ\Ä¡`›"¸›A ¥‚Æi`fU³øˆ[u¸D±:J¤9/$ç-)·jrã÷ýììEø˜gº¶öh]7<']·ªýÞê¨5CT NŽÒªEîoU5g-HôNu.˜‹ŒÇ-üŠ^èé“ik§í«vÆ„ýò¤å¡èLj}Õêu໨£šsž\î$W»FÑØõy;¢Ö׊­éwß|ýX9R©Â´Gÿ²­=vdíhr&)U1ï0tS5ôµÃ^o>òiŒÿžd“i‘¥WrÉý¿·ow»¥øïû÷»wo⿯ãCYU*#}±àëž\íÓ}®±JÉ÷Rà?Úx(¸mÞþçzÀÜŽarœå ^MÈœL¨î>~áù?Þû®Õ†Å’®ÈÔY$)!aĪ8eÐPÞþ3 ¢ßÈ9¦Þg˜±c˜M¾ýg^ ¿å ò§Ó>™M’JJ…rSÊÆ,”û˜£rÁUÃYÜßSn¶ËòUþæ’ßøt&å“h„wò–Òmp"ÚmHkÚ”OÞÇ’ŽÛÃC‘÷7)+Ýnq‘MÜ»™\cö¹Ðc9Ïh(ørå’¯Ÿ?“’æuCÙG¯žoêNÑ»5ÚV„íÈèúKw¢B™yeËÔÝ[\WòÞ”k=}ör÷ù&3n? ñp+ùk<â ¼÷œÈÐõ£•qiœ‡hyúU%!`‡ùtzFtŒóQ–³éÇ<{ šØ'ÃJÌ@k,¸}Ìjœ$Ea"hö½A²/úh3°ÍŒ¼,/Ã?6ëØœC7‹Ú,Sæ§ÀË¥%ˆE¨„>†vxB¼.Å uuñ€•ötÆ>MÝÙZOj÷:8Ÿü! 2ë°?îãO2ÿwøP´S™Uþm1¦4<“G55^ÖUy¹¸O4žu¨Ÿ1ÑS_ï´¬º]S™gÞœ®#€ï~ ü=«È^}f<,À4]«&¬tÙLgQ.gŽ4hÊéHž§” ðcM¶^íÆ$ÏԥŠàÔß¡u39 /X¦—Œ’Úž,VÊ„#†-~\ØOßÐä{kGÀ£¡ÈL§5FÊ´Lô~‘æë蘆ÃÒY±|eA³¦×+Šô¡t¯çýN:HïÒ=p«Ã¸ø³ 2OrÏp-[ëlN¶ŒsÕaB)_bN»ÎËaC¥ KÛµ¦I µÞåjU®¶ë‘p˜ÏTaÅÅv‘=·Èž)#7ŸŽpäàÙt>+X£@GÕÊHÀû¾÷ÇÀ‘ø>ð4oR€1ÙöÔùgNÉ¢i¤Zžÿ "0n¹ÙéRdz?З™™… »V> Àp„2¾|hJŠ)^ï&3¾R™£\ž†qâm°™"DsÞ]~m¸òèm38?z=L"MRDx—%&-=švMýªk^ù Ì#@N©‚„ÚûßðÜ£„²w-Ë+›ˆ~Ug9E #Ëôíx’o]r©o ¢~q^¥œ{Þ7*µšÉÅ\ŠÑýªy˜÷¨–¾¢K툷e‡*‹w„ÝF¹´>êT …;VaP>/+ *ïZe2ÍS½çˆF^)tp§ÀH~[‡-ECòëüt8$ ÌÝ[bGf”Ë$–›Fdš%„½?o¸ÆŽü|H@^ÁûÌŽ£mõ&)ÌîóZá¼Jk{¸Ú¹Ì6Ökr‘["4:†‹uEŒ†Tæ]…H·å¬º®Ìꨧ]ûi×ZlµÀ`Fñªû©Å–+‹HQ|ÿÓÂ43³ÆF²$WëI¾P‚òø¶LOª“6&=ÁU¡êÉÇÁx˦­žš_eC|tÐÐ ÍRèß²Ðw„Ë×íªUÛd™ã(r¥š8&VVK9£»ÊVÔê ??Bºi”H}¡~©•žâ‰³‚’)ÙByé6÷K5˜kgˆ Ô-"­zsn׌ß[Ñ 2ÍÎ0–4NQg.hû–¢\¥x-)Ú¤RYgXx€È‹žÚ£‘œPà¢ÿ;›ÂÒ™aïWíúAEy @+0-•s¤Ë ²ô“7éÖ“½G?ýàÜ›¥•Ÿ/;@Rn9 „UŠ7¸ö¿ùec#pù0ºbãx ÿw¼Inn´6Þê]j¹-Þ êÖLS¸Ûö·?äËF˜/?(ï?mõÝ¥ ïýý¸j­æEwq‹²ìØøã£@ öª ö.‚ö¿P}ƒ¾lhŽÍY+þU¼˜Ï>ê…JÝÙ ÜlK ¾ ¾˜9\ÎEªŠßËèJ“è®øÖ¾‡mK¬Â=Ñ`}†ê:©zó6zèbjáø@ÜlÙR¹¯©H^ž?0}¶õôY77ä,·½$!võ › aù–;t%nL ¬hïo)9éRߨW#¶Å’“òE¿¼(‰'qªÍj£9¬C’!qª-{¨<O¢p ÜD§~þìIÁi‘3.:™ªNã% TM Ó ¨ r4è>÷ŠàœLeÕÚ9Ó† r ¯ÈÙ¤Õ• b½V.;g;zSjâûô¦PE$Ú‘8JOël1øº1)ÀHmòƇowU Öµï¥/j!ƒá]¹ )PpHQÒÍ¥*lU:&žµ”Åv«vmagÅvF0´ûAEÑ=”/½^©wµ7¶è>iÎUS¹q4Ñ7ÇúCØSõná39ª¨c¢íùd™€â‚oøÔ­ÔÝŽ3rMùÑ÷÷¸  ÚyG¦3½xÙ¶0ô¼ØDO”§8Å]ÄôßÌä£Àãÿ;7‘ë–®\äôAêià)禯HÇá-*;‹•8_yzXÔx÷–ÐÌçѾy–K¯Õõ–½yÊwDÉõ'C•9ßl±ÖÔ«ÊúÕùbÖñn–îiÂË¿Ði‰b¸t ®ù¥J#á¸tÑëååò‰Žga{k ½˜GV!(ƒµ}·¦U=pXÅUµý*¯šªÚ2H”£ ší–»Ûßýá¦1Sœ76d"¦h€õŒ†¥¦+–£ÏÛ:ol®ó–—ÃÏoêå'¶ÕWµkã¢ÚÒæRakš*TÍ©Š˜•äRÝÜ3M;–·t´·éH]m‹ùtšå3XÛ.¢Ù†ÜÊ5S¾‹‘KGöÂj/Eóz¾ ʱU—vf¯×·eóîºE:t›- Öš$Mü­uG}[ßø7VRÚüìg­Á†çÓ†Hë ZÔ2 ´»Þö6^ßhÞnxÒ­¬_²‹vÔ’(’[-#MXÓ<ü†ôÁÀ’€°«Êb¢–›úŽ÷ºëêd-dyàJüCy6yÖ*ë[÷¹WSd˜[©Sã—.gSÐñ~¶ô#ñ‹Ô 8”…W_¬…  ÞR®YW¢•®C³‚òiEÀŽšû²Y©Õš¶qS5+«YÝü•L(‚M ûê4½„‰C§O#‰÷ ¶Ì½i”1“›Ó, •Êq’·`ùj°ºqV³¾|v³V%óI9à ‚ê6~o讯Å3˕”‰ŠNYx›u}Ûš{w›QË<Å*”Ò´ÐQ†suw„yªdWfl[üPßÙmÝ/·étJYp^ê­uíðŒ7RƒFNϘO_‰ÜË­ eÊÂ?ÏùNn_ÏÏ&b®•'£d¼rA•˜kâ……å+#S“.ý¦ôW€-]•¨œœåšoï¡FÍغE¹ê{CÕi~»Â»¹zÖµ²ZWH&J.ý³Ó²òÔÔÜ–÷¡‚”IxûÎÄÜY»òi9jM æŒR>×ÒË~*þŸOsÐIÐôêÚ ¿Ï»w›îÿÃÏÿétnß½{çÎýÛw»ÿg§sçöÎÿñî^ ÍŸÿåþŸÍãž½ß.$'ÌçݵØÿ·sÿöýNÙÿ·sïæþÇkù -Äèkuýd£9,þ±¹ WóÝŸÿ¬.dC+jÍ l|w ‚‘rkPÊþ¾ÓiÛë~·}{‘Ü8¯óì8'TþŸ‡éñ<<Ž‚ 2¸ðvO²Àûs”§€-(MxÀös§°_=ŽrhîçÈ; 1ééù h&žI2Qq60ÈàíÃøÄ;CçZ2l—)±Å úúÕÁ³¿¢2ŸŽÂÜ"HäM¢Yh²ÑÑSÞ­á.gãoðßÀmøï ü÷þûÿùx€àmlÁ·à¿ÿ¤>Ágw–Mâ!êd=yË7/œâl'¾ó‘Öi–n#Ö® (8Õ%rˆ÷Sr:æx2†äH=øåUÅ¡QW’FÛ¦&æsåN uŸó>y¿€0¡û%m Má³jz€FŸ£ù½z ÐA8|_LÃ!ãùËØ¼ŠLÆQ4â©y‘Fg´Ç÷ñ_,Ñâ"¹)2 ó<ÇX~?³ˆddG£Qàð•…ÃÅŽ"J¶¥Ò‚qŒÚÇíÀûåš<¿À· ú¶aã/çЪç-hõ$:Wm¶ 1›vôBej¾mõ­3FXœÂ¶ÛTîoTonUŽ7VÙ„LÓg'1l2ê¡¥Ù Á¶ÙxF*ð E€ÍÓº[a u¯ç.±É#:•ٱ¶ûá‘î®ôzDOí‡|™'  ò‚ßþ§~û(ϰ^0¹[ÐË­ÊËI–ë··ô[º“Ò}ùkúÑðkŠžû05våm°äõdÁ{·eúT^Ø={ϱ&náõîþÁÞþ¢¸…rØBéýæÑÇT¥—?/ÎòÑwåhÿð¸x⣉gÆiœüËßþ£ýæí¿µu ˜éJpBl œá³A÷¸Ž6©ÃÂ=ûć›üÔ6JÈvÇÚ*±‘æJð—Jtºå©["-¿ÏËn—KÌܳòûsó^ç)FJ¬¦zU=œ4ÂÌ̉Žß™ª Š)í¬^椊ÅLG›1eøí†ìA¶š±g‡Õf<@.¡O¾_ÌÞ×,`h¯å‰@%¢¿“1˜édËS®o3¶ÈT,®=Î5<#Du¬ðè½)Y³1ò£Ü6­z´ ‚’ÁENU±VË‚ß$4Q{•ÞÔôÛ9Ü®#€QK*ŒP %× T|TÀ©‡(-%WµÊ: Ñ #ªu ªß"Z¾õŽ‚4Áe‚·Ê«®?!¸ô[ß35¤ !ôR¥É¸ï† > PöfNò*ˆü§ˆÒ„ôz^^æÆV n°­*"¡‚˽G­Zª›B­U ù6ÚQú!Ÿ6¶ß®­¥Töf¼ÿV[oŸ]þ›«ýÇFPWk/5×yÓØ±Ç¸n¬÷Ë/ÅZÅRu”5T*ºHh˙ɓLÿM˜Ù§Sr“…Õð‚–IÒg`VãåUµê"ª{…ÔŸÝ}XÔjêÊÞšV—¯B<©.»´@7¬»J±×\4Z1NVƒµËèe1V³µâ¨G/6í7L`õ~?L£'Øó**û¦áÝ·ѱ–]‚µ4ö¶&¬6´XÍQN«J›Æ®«°³ùÉrbL·¸ –mòdP”¬©z9š8†ÓrPXL›ŸF§¦¶7‘î›í*õn×Ri­°S™Ê.‡ÂÊ£ PÀ|R—A­„O vD*\z˜V¥áÉ{ê“Ó£ÕzqÕeÔTµZb.0o›{ð%ûb<¶¨À>á%Y¥… ÛV™­%h)¼i”{ƒ³÷ì½WÌãYI¸«5]ÜÇѰ°$$ Ú&ù[5ÆL,çdkäTgT‹òµÑ¸Þê`þÆS&#l¼NoéW­–ø¢l‚ñ€Õ±³×¶Ã^\Çt¤‘×$!¦Ãbžþ|(IÐÝ:`ªÊr¢Ë¢R‹©€“~Ö:ª(æ¬]äœ5îo•©Â LÍââ¬Iö¶ÅwíתJy›rô‰°_,¼luÕ*­g]=¹hò+»±ÒWU‹%wCRcÔ®Z” m_æ9¥]ŽTÒrú‹ïþüç£ý½#9Ü´¿öÁûoäÓìÿ1 ó"Ê·‹øøËúììÜíÞ¯øt;7þ×ñ©át­ÿGç¼ëíþáÐ{%‰÷<dy8Ëò/~å#D}…Uͱ!Þd¥öO´ÅTl^]›mÍÞF±z=USEÊCŽ0 :jäÕ`_v0¨ž Ó^•î&±‚~B:F¦¼Vè2€Çè®(>'.`ÞÚŠ⿎tižÿÜËk˜ÿÝùÿ¹óÿÎÿ×µ||åµô9óßNåH¹¨J3óÿyó‚B<Í´©uìBPÏPïÈ1-pÈðŽ“9:ÍÎЖ¤îǨw`Õm˜oŸ“G †£ S £ú8û!ß¹ì%âû…žÑ8ÃMQôZ =Ö Ô·E昑òØä’,ZMñà^îþÕ•ˆ¶³Âã0M³Ùk”Æ ï³³¼ªZ½«ç½Úr„ÑíbœÃ¬dŽ.Ú¥K°€ÉgòMâ§ï±¹“Žñ›µÚpôÉŒðÁ“d@ÕÚ²G©Eí2³©{°è+•“Ë¡ï÷½¦ŒB[T‰Ìâ˪ð9W +øÂ ·‚V‚1:OôºëƒgëÞÕ·¤ÅÂc¾oìƒÇÉgª@á…òA³½ædõa,0—LÝǪ,~s¦š $%ÍV[Åž¥ºñÐ\áhwÁª­®¹è¹}¤ë½ Ùÿ: Ýͧö³lýÿܵ?ËÖÿÛ·Ëþß÷nC±›õÿ>zýÿiŸot…Jöh{³c|0mÕ}0å~ÅÚÃbå¡î2Íê¤5h.¸:Ó¾1³Aµ¨jÚ¬W£_èwõZ†~½ª®¡+\^ãÐU/§wèj—Ó>tµ&DX ‰êÙúˆ~JZ‰ù¹§n¤V‰”…Ù²/{ú.R˲üÙveiÖÑ7ú%Û«}i†ú%—uÜ(&—þTÖÿ@~^aì~.ÿwûnçÞMüßu|êÇŸDÊ6.Å× ÿÁXß)ëð÷Fÿ»Ž,Dî`_—ÈØ*§R¬ª|œ%­˜'œÆZ.ÿ8Vª )iƒŽÕåÅîáã÷÷öl“‹u'iš ….m9ôÒ¨˜E”“sË;FFvêõZ©W¹@ݘA7axrM€[¥·¤Úhsyže3º`Ã.ûõÍP¬ÝúÖ*‰¹Á¢|’aÒ;JQ=A‹2ÇÌNÐ ïÂå» <Ýé€ÇÕ…w0ðÝ)žd‰³ZE8•†˜ð­SÅ ¢#&)MÅ6eÈ䤚*Ù¨v;â¦ðÃlŒb3PH•ˆ0°fX-D fÈ Þi”›îûŒ!вÃ4纱yÏê›Ã7œ=l:M.ônkýÃûð¹¸õ1ßÅ!Íã½ß ½ E‘%tî N0¨²˜) Øoæ®—<Qê>ÔÌ\ SÝxYÃ^tExi¤éžBÒaç5¾q:Læ#\sYŒa6RŬíÎváõVf¨]ö™3‡’åCϬä3ì=Og¤¶R“uуyîû’íY)P‹Js~ó€üo½ó*ÐO‹$ÖJ“Ñ1¢%@ö1 •ÙÓ¢‚îM}öRÝS‚{²—û=Ã[˜y°¨è{¯Gß/wf¾¶º&×)â©°R€Ïðu³nY¸­»i…V­¡¨2¾q‰…_7Q 9fŒj¡Ö93¥ÎÁæq®"òC ÄOª²"¦~AU.0HRýÆwç€ÏMÊ1fº¼ŠB­áúš6;%ØkkPÄûƈ}ÔѾ¶Î{ó1Ÿúý_d´=N¯bû·Üþß­Øÿ;;÷oö×ñ! ÂìëÚþ=Åõ‡RdƒXµò¿Ôùæ¢Âä˜xa˜Mq*–vÔ<òq8Tff†¡Ù*Ê–¼5K“Ìèhå.¥x]IzP*°W¾ÍÞ·P“å‡ö¡»¾ l¯­¿Š‚»¶ìÞF¯ÄoòNÇòåeèˆåYѳ¯9r\½ÀDq^MŽ81®SP°øxv:aÜ«œ-TSÊ3aM'§ãÚ§‡’ˆ†U{c›…²Î&Ÿœc™•˜@:[ª Ô y´ü\ºhe†dÍñc³kš°Ä>KbGì8u·ø¿¬[ŠZ)G#¥‡Ävè‰qkÅn*ÅÀôŽUxñª]«ShO¨3²¨Ü Љ«M”RR:чPÙÊ/êj7ÊÅå> ×ÿ+ðýÃϲõÿnÅÿï^÷Þý÷Z>fý_äÿ÷Eì¿°Õ4ÖÚ¦Doõ¾t ¤!GÛȨë<ÝX¯(ÖÅ‚Y©JæHÝš¾^CÚ[·ÛS]•¥†Ì®ú²®Õ—ØÖ8K- Àð=õ‡Þýe½,L­ñj$OÝuJ@Û¤ÏZ£½^‹¶«8Éå«,Ãk÷a¸¥§Ù{^^l¦‚çÈh$=ÚÂ>äM€"úÙ˧¯öáÈfÍôr,Ž)ç˜á)¦õŒ Ä ºOu¶½î+™ªÕu–jµ=³€žÄQN.ÞCºõL„©-×  EðÓ0³y>ͧSàbî>Q¹™vmoWº‡{ÚhÙÂFc´.9sz½+² f å}-*yp)Ë“#L΋B­r¯©Ú¡AÀùøðì$K"µSý€5ªžß€¤$hÏõj¨¾>Vé’G&ª*ÚÞ"ÆàÏþ+Ðkwa1Ó.ôø™R3ôfÔŒˆ½DEÅú#Xmu½Kkw±N]Јà/J­½~³B¿À_t©¾ZÖ§û¯^z{/Ÿ€ö±«R¢—” |™³É…g]uÈÚGšFŠ™ÖUìE¦Ç³>ë¾=2ë 7E0  ©Íb ±ÍqjpÑ¥}|´ûøÏÒÅCZÊ„¥uÜêXo½Ó‚É€Šª‡ïMQÏWƒ7À :Âé°H”… ¤Ã´·ñÖ‚´€ÅfüI||¢P'¼}ËÆÜ™”§¾ºCjõbpš¶ÖoS§ãÊù3,¶‡' dYºY`¸î‡Š¡»bê3ðFÕ„I‚iÿ'`ÀÛ—OwA姃›ˆ4ùj?¨üÌ¥Ûi„£„÷ÎBk¦¸ÊÄ“HÖÉð  çÙa /É À™Y4Ê0£zfíNØ´ÀÌxÃùmD¾-ùû(Gëkoï–~*ûÑÄàI{8¹š6–ìÿ;wïÜ+íÿïvîßÄÿ]ËÇØÿyÄ›Âÿ¿Ó‘ÿ˜²|>DÖ?Œ†'i–dÇ& Ès64F¿7å ©õÛ®–S÷òó¦º:ÇӺˬg(s’Ê(­7OÆaå™’eò¢âb°Šíú7ñX]Nã¿Üûùèñ < øoa%ˆ "9üÐó|ƒÞ^ð¸Ýþö§Yœ”_‚R=^Ç;Èçð2ž]Xj?=Ô©Lž§–šq1¡'€.¯A)EMª`G†Ò¤úFC#Ë·&0RSQ‚XÎ8£qã%P¿@ T‰À¹0J·aÑ=Q ¨`í‚o=wW\ëÅLÆÔ~‹ÐIoSlè\>=óªT¿åe "ÿY)½Ò6>!þë>¼¾‰ÿº†OÃø‹†}%îK×ÿ޽þóùÿÎÝ›õÿZ>䞣Çú:ÿpwµ€‚nÞ§°vËCãcö2œ`ädžµqà%G:¢–^¿’$½Ì’_~K8ËyËÁ–ÿU|“/„V@\ĴƲ zXx»´9¾rDK:Të&Ùâo÷Ó ÿó9h.'WÔÉýûÍëç~9þ÷îü¿¦Ï7¿ûv§ß'ë߬ãíÏÕ¡%Æ…½ HšIâÙ<F¸Yñ¾ÿþ¯ðY7‚»=ʈgüÖƒu’öK8Ù ÄTø |æ¿ð+hc‰þê~ÙÿóîýÿÏkùp:2·.²H-Â5á;ðŠŽqôÈ›¹ý/òi˜ÿÖÈ~~Ëü¿ïß¹]Ùÿuº7óÿ:>è-mÏâkÙÿ)+ڢ͊rŽ©nN´__騪åAUê:V¯ðbxK*yß‹«N»ˆÿax’¼õÕ‹ùgâüw«#×ÐQÐ’†J—ø) Ð5è>`EÊcÏŽà'úCÊeöfÃó6ëlô¼·:4†òªíëˆ"ñìÉ#•ê>:§h‚æm(¡qˆŽ;¿¤$&':wbi8äÇßçx!Ç·82®;-:å‰0Qè*ÚGÚwÕ¢‰K'º½àë|tx'_÷éÏw‰>¤ð!‡:Œ^À†3$ ^9:ˤïh¨òËÆF ËËø¨RÖx1çøØµÀSXà¿l¾ámkQ°<½²/¯õ­Ø1Qeå¼õr—6xi¤+±‹©FúÖ`¦ÙØéàýZov¶ÿøïoÛÃN÷öùÅ?6ÜbxäÆßÊåFÑø—ôßݯ–¿mÀþGmù;wÜ)UÑå~I¹v©ü]B‰Š–ÞÜÃgmj¶ôæ>ÕgUƒ¿¥÷ßÑûv»Ýðþü~«þugG^Û? Âü—_p©²ø—êÐøÐÃÖF€d*½&Âÿò øå,ÂEÝB·5Œ_»ÁŠâUhw VËÞ]TÖ—I¹Å’¼ ‹ùð~ê•\ÔÍúøêÉ«/³Æ,[ÿïØù_;·aýïvvnÖÿkùü$Gˆâé½¾í~€…^gÉÅ$˧'ñ) qå]ÀÚÂ</(ëÕËè =IÑ[])\ïow_?k¯¯ÿxøâ¹÷¼¦-vM>Ëñ">D§¼<ÎsrSAw"¢juy½WR~¬ÃH¥gÈá! ²unˆe’,{_ÍêKOýB2úš ‰˜=úT“FÓÏ$IÄCÏÞcsrÖéS†¿S9Ø$Èy5A5=ô3š_Rß²hÀú߯\Z )>êT…†R¡TFîߣ^”S/ ¼†‹—ÐÚ®~¸Â¸™ôÖW9j¹°mÙ±yÐjÒŠ×ÚgªžWÑ!='[¼Ök‰:á)á’ˆ»M´;ªô\ת!¦~÷›£êR½¸¬b÷½×YŸ·_çÙ¨Õ–çUp«ëÅ44uб;@¢˜§ì^7¹°¦ßruiYAnTé§Oþ•±¿øYæÿy·s§¬ÿß¹ñÿºžÒÿGÿþq…è_¬xÀnÃf €L¥ÃTåôðê»qÄ‚(ï¼bÏ¢R0±çUmWëë¶Â*²éK†Ûz5vRwëô/)ëæÿ4œ\åÀ²ø¿;÷ÊùÿîÞ½w“ÿïZ>jþÛcþ¥ªÆè×»‡?ºÖhÊÞ†H‘y ï˜!m ãën2SÖJ]…Œ‹ðÞVȨ™:ýÉØ¤õ­FáµÛ£I6BI?~uÐ~ŠN™EÛ*áVEéwDßúÞÓ#•1ð|òŒÿüÏ‹çÏ^þ™¿¿zÌ_ÿÈ/=ÿ󺿵»üp¦nI&h ä‘ÃÆþçz[ asÍïËì`>>¼`ý¬Ž‹1yV9À!±§ÊÄKä™]¨ŸH3ÈЗƒÃv\ìGx Ì:^õÇ£®^<‰sóB±zùµù‘í“ê^#}7à4;%€ÒÊM}:fÅp=ÖSíÅÅî È’9ú9“ÁSφ¨Û[æP&µÔÔYëfB/q9ÔAuʇ£V|áA,VEÿÍÛÀKpˆòèTa¼ÿCÈm@Ó´×KZ}jõÓÕ+}šÇö ýxËí¾y[©iá“ÐýªîàZguzáOxh&>¶U«R³¨¯Z¬RW´}*H‚EáӃ:,DÒ9‚®©Õ +‚–å‘–C㥢 ëjɼvýÏÒÿÑôõEÚøÿß;woü¯ãSÿ0-âmÌá|û¿nÙÿ÷Îý;7÷^˃í1oÚÿÝõþ+;I½ýh:½pb¾‡E{N9ϳv4šûÏw'ù2ïß+i÷åÁ3[Sº ABL@~¢gÑc•z3"Ç… ^O—w0xìiÓ$¼ÀÜöy<˜Ït>R+Ù'´sÍ ;¢22êÝß0K2u Qß{”àÕ  ³#ø÷‡oFøàýí}áË£„6A/Âc nƒo/B,ð3•³‹$Ò€Ÿþ€5†ÖIÀ<ÂôÁ¨âã3£Ì@#nQLªÙXô)ݲ8È’Ñ·¢¸ýö§çôjFy‚9§íš¸“Ñ¿ö÷þ²Æ™Wy˜B9³‹?{ù—gT$N%øÉ\Ÿf©zx úOÉW]¡Åw-EŠì¾DÎ9¤Âhn¤˜È:Ù°ÏÊux+racüã¶³ùl:Ÿ©v)|­Ëï§4 u¨±žçFç³g¯ÚЂÜ%±e!BvC´<«Õ¼_o¹øwa¯¯ÁWxl7¬H*ØŽ ôø0{< UûÞŽk½Ü§ëØ;u¯˜þ}¯[÷R¥ïÝ®{K#Õ÷îÔ½SÃ×÷îÖ½¦1í{÷êÞÑ@ÃËûB‰@¸™ðð6fí=ÆhM™gA¨ ƒñ†¨NßÞñnÙð‡ºQ»ô#)}g•Òž:ä´ÞüôÜ¡ˆ]‡Í&=¬—À#ÔãšWÄðò;ëêÞÉÄïÂ76 ù±Ñ'/¹déìè6l`'Í„ÔKœ´”ÑÁó7~ÙéÞÓXífí1L‘šy³1Ùxëå-Ë?Hò„¨Z„9£ûf'€z«;¡Ë ]ʧðž\‹2XÂJJ¡Å–Ò êL.AY!•9i^;mýÛ\iwó¹Ä§¬ÿc4ÿöß Ð±®,ýÓý¿sûνnùüçþ›óŸkù þ_ó/ðTr?á«8ݦ C¼B\ìÑÃQÝí§Kly?aN‚P%2ˆÐ”ee¢øû<¾GÞhNë#Vy„»†è‚üø_ Ÿ%yv!Xù§v±‰ÿ>€ª˜…jô½¯^¾:ÚÝßßýŸ–óëèàÕþáù]LŠkDqLèøÔ…€oV ¼4a>U‹’§?TaM(+Õ.å›âŠq«Tª8ƒÀƒwÊ&Y±Ú‘Î<™.ÄŸ8…sJ|¡ v•w­Öƒr‰wÁ ñ7' ¯Óh¨Q v('’Ûâ·HJEð7uæ¼ôã[àü—nwZå¾Ç)ì!gDWEÐ*- ’xóA”½•VÊ Lº® É^y+DÃˇ}ÅÞòURò‡½çkq;‘Bƒï´~§pçv U$PSû+ã¡>H¤w›ÐÊ;o[ër Pª’°o`qŸ¸ùÝfÀq”~ØßÛ=ÜÛ_„ŽÑ@†x¼Û>²m.ë;ˆ+ÓË+ñs©CjÌâÚbµDa®b&­kß7°ö€®‰be?L£Ù¢?7²åF¶ÜÈ«½sO¢Ñm? ÁÐ q|ˆŠ!iIý{@¿‡ú÷ÐÄ̰Ÿ ŽC¸@•V€ßð}¸Ùâ3Kr7y¾wpxø/¹œ äôƒzC¹ Ñ£`m@*ˆëc!,0TÎ&aË@8 Ô ì:âJ=ôP•2ô²»ÅZ 5ѽ%>ÍP¹cQS·±—zß÷½ûÌl¡w ~âSma²F«y>Ñisà‡M/'ørpÏœXs±ú™Ø0÷T/îìp7ˆ‹¦`: ¦i=ß/‘ˆ Záß~ë;·FøOwkÔ4Ý49¸Îd{DhNn-®‘êé6@‡~aņÎ-R+§I¸OKÌF;›ÙJcˆ2ƾ¦­¦µ ë ²Ù,›è%ªy<$°nj`OÃ`:@à ÅpÆtà=´.°° q†ž‰$S¦–àaKn˜\ð‘ÙNSvIKôäæ®Q—– j%+H‰€èÊ /Põfžà¢fkÇd–M?m@†Át´Ê€0ð‡Þtøé2\}@´]:ÖÐ M‡ÛìÔ§ WÞ^m@j‡‚CЙ/¦ïÂA¡HRžPN&Yž-¬¥ ãðÔ‘—/jÆ©Ñu°o¬%‘¬¨êPaÐu8`^æD †b‘ÀªUIÖê…°Ž TÆkjš›TÛ`ïUYœª ½Êk•öÚ"å4= éá°¡a½*Ö¾Îá-Zù'q °`áÄ4Òø; ëáa_ÕFƒÊnç,>B CtÃ/ø«¡£v Ða¨° ‰U7A¸®ð›ÀUf*ÜZ¢N³)®h5›šÑ¾h@8Ý\>ÆP™ëèÙYÔ È*ŠÒ³¬=–\I›gTÌ*ë²rœJ˼%L[Õ½8ŠOÙ§÷Íæ\¶´;°éå{Ô=Ù¬ãÝ®¢­&Nº€Ê;wÏ?…mø‚ýêéæ*›ö’é%â48Ýl\,!oüwÝHtÜôÞê¦)y”Ó0þ)ìêV1˜8põ#íxY.*(þìøNyi˦ÆN+pZ•a÷<2‹øß/ö½ùüçê<À–ÿܽ[‰ÿ¹}wçæüç:>îùÏ—>ü9Ð&MÇ?S+Ûø<²Nnô×óV?ë!9L/Èg3Ô2¾î¶Cóž<ŠæxóSZ„ã¨MuQüè×l -—à§Wq¨tEfßeFß’É·dð½1÷Þ˜{¥sï¿úQÒDqér#Qn$Ê¿D)1÷ÍÒÍÒÍRM›¤›$©ts€ts€Tðæ©Ú³›¤º¾Þ Ý 9HÞNàý¦Žn<}€téã£ßæáQíù…‚\]Ð¥ùïîTânßÄÿ\ËGŸÿØcþE€tæÏՀ̱®\>©qò†ªÓë' ‡Ýðn l?„é>ŠrŠáÖÇ7*žÛ®v•zƒ,KìyoüMN|ùÔÍÿî•Þþ·üþ?˜û•üÝ»7óÿ:>jþw¯cîžeÛ£x¥xp‹D}À[Û]=¯+Óºk]¡F³¦'^Žùf4KÉÙå{Ó𫟓à¼å ó(œñ‰rº5(1Lü8LâDtƒÉ9]'æícâ³ÄÖ?ø^— ^h‚‡± 9îÈc ¾þy•òÍ/Á¬Uƒ¡ªMHŽë‘”;(‘Ÿ±ÈÖ|±[QîĘ Á]¦xZͱÓý0ø¤„gÿ(ªxµuËó_®ËÐú;…s6§Ìp9ª¾%Täd¼ 3Ø$µ)!… !^8ÔE4«A‹¸7FŠð[‚›ædL‹lÐd¬á.ßqWÀ¨Ô÷ÌvÄ<;«éªbö à… ¡NóìÞ7R=fÛ:Ì’ù$ý$¸Rµº´ÊuÓ+ÜÍgѧvý¿ÒÛÿ–çÿêVÖÿ;Ýÿ¯ëùèõÿë®ý®;VW¹bum7,h:ó‘‘e}o·‹"ê×õµ! cnüñe~¡à·µlØ?ZþUé(:÷üÝî¯'ð@àµÛí°ftX¼.Gù1.œ-e2ð¹éïû^lž½+!| È;•û–̪z ’4›T#Þâ:· Šº»ëÔÏ[®Çxî ^ÉO÷™‰ø/ab^”:¹Ot€GÕ.BÓVï€Îëk2d}O5EýíK“x‚JÃÖ·)nc«„•ÊúQõyÚ‘ìÓÕ)—šZ-,t¼2)mûS3Eu†[9·¿GÄó‘uêZ!fObMjR‹ \§Î­N =ÆG\_Š«öHÃ@‡ øVGC¢£þ5l' uë­Õ´±¸kŠ1h¨ñ>ÊF޹y¶­´¸Ò–š²M|ä).’¦ýjùÍÛÖÇu $3ÎgkµŠw\ÕÑe T±Ñ|ˆiÀžð+IOû‰úòšÖ’2J&|¶ÊË7è¼.â¢/Â=ðÎ…±m?Ö¦N`éj ÁF5q°ïziM\öcÕÂrÕVµ!ï«ý¬[ÞiÇV¹1ÕÏ,a'cº Å Ç ™ÐÆ]÷÷·ü”W‚VËN*¶Ú€.­„—5]qÖ·Å}À¹º° kARwÛ:~³øzŸ²þ?Ë&Ûƒ8 ó‹íI8½šÀ2ûÿ²ýÿ<»Ñÿ¯ãƒ*euÌ›6÷W¼’|±ž?F o¶žÞYŒçèñ>ªÓýáÍ#ÂãE8%Í_ÿÂü\$ͬ½€X³|tàpÁ„úm/¯Ùú1™†y¤ÞÊÏuYòÿ.rúÄÏ‚ùjÄõÌÿÛ÷Êù¿ïí@±›ù Ÿ/>ÿIż~ÐÊ¢)› 3åá×Í”¿ŽOÝü¿²…_>Ëæ÷v9þóÎÝ›ù=5ÿ—LüU/þô…Ÿ–|ú¶(™7<¹™«_úS7ÿóh4À¸*A°\ÿ¿W^ÿoßîÜÌÿëø¨ù_ó¯'¬éO õûF%¸òÏÂùE;€¥úÿýNeþßœÿ]Ïçæÿò€šâj`ý¾™ò_öS7ÿ¯lã/Ÿ¥ú·rþ÷þþ-Ÿ/§ÿ/Ÿö4ÝËàfb^ë§vþ_©÷ïrÿß»7ûÿ¯ôQó‰÷ï=í´Q˜O¤äîO‡?¾Úï­™ÛáéÚZ½³½z1§óÜã$ ¼—ÿåíÜÿãý;ôæÝIþ§\ÀÃr>ÃE[y½zòªç…£‘zÇQZ\L¼l\5ÿYñ>|õ¢&*€tpD‰Sx¨œ„ÅI¤.ª+øöáB]N3/úûœ§ñßçÜëz<ÂÅ\ŒWv;åby4E§3"œ>/ƪ6ØoLîy>¿ ÷-â`ÚeÔ´QÀ ­Ø´ÆÔ'ÄÊï /vÎðb8oCÁÝ@/2òÆÅÛéÎÂ|Ä:Ý,Ä8$â»^VøjС€ ÂGše‚ˆÜNç€kÀO#.þÀK³YÄ,AWOÆ!O½$:ñ_*ø;×+Þ=þ\LøN'‘a­Á>ƒ6C.€Z±ºuÑ\9s/M”¯qëðÍç·ò©[ÿgá ‰®/þgçöÝ;åøŸÎÎÍþÿZ>jý×cÞ¬8Ë¿RøDyC•—(û‡XÔ}¬@ßqg_ÝÔ£üZ°«Ç׿òZoqéø³©‹?õ†ÿÁ‡Qݧfþ_±÷ÿÒù·{»<ÿ™ÿ×ñ‘ùÿ¯®û;¢Æë=´ö:‡ëhþ(LtiV}n‰ãD;C­,X_‹Gzo`|‚b®Ü8µºïc£¿Æ#ãî\Ø 4A 0$üj`‘Tu1]¨¿;ŽÍøÛíŸtÀ­:ÏzÜ•ÇÝâ+ìŸ`Z‡“n 3v„I‘y>T¢žu•û.ö¤~3à„/ªIŸ¾ê[”¾ÂãËiþä!]£ú»ÎѪË÷h+ýgyç¶õ¦ÄùÈsùïuyL¨$¯T6Ãj·—n3T?¬=Œâ´>aÀ®ÂæQ×0‹±…°„c¯È6©ÏÌGzC)€6‰þàîÝq£<ûvˆF?~µ%¢KÙ ¸t>y6cϨìíð>*NÇñ¹÷{3¼ß{È,?Ú³ìY:û«çÓàÄ0fàM´¯½½mG‡y³s/VÛ»«VñÁŽç«)EÔwä[þÞò ×/ûD&¨º¹Y=Ÿ P+úE=+þ¡Ã$ù ”R/ãttް ÷Ü[Œ¸€Îc­moç¬ÓRg'YöÞóý¼Ç¸ˆG)0:;#&¦Xkæ±éŒþÿ#Žãà4cë:êƒAPë’¦‘ÐEÙœr1I£3 Ù ¡0‚s“ŽÒ¨€¡’È¿*D°IÊ¡¥(ö±¨bG)XЀ½ÓžìvàMBÅÐ HQ). ¿Óœ÷=SŠQK=(…Ó8]¢4`ŸÄ)Ø vRš 36ñ qè;*fÉŒ.Y¡ÁuFù$²q½— ÙùE«W¥,¼|!î8h÷ Ö§x6ÇÁëy{I4œåY ïn4('ùÁ0ŽÒadÈòSÓ/°»ds@x2ñøƒ:1ºXô¼%í..Ë«¾õ ~¼ú£w÷åúåGî=Ê1.\0Ùƒ¹'€ˆWä២aÑ.2¨Û‡íù{‹'HŒ¢g9X¨ÌßÈ?ƒù¾s<„Ç–š dh}”ÍSàH»sÂ$DzE<‰jÀz/ã:{%3 Ì~Þ%#X‘Ÿí¾ðþ«-´"…Óõ;­6:Ø^ç÷o Žb§Ñ)èᱠΕ‚QŠ‹ ?Áë ï}M+½<§Ù’‚,¼ãø”˜ù–TP8 ö‚=,GÍöá‚íŸ0pýN Í[õ÷>êÖTUÊ pÈÖÔB¸åƒ<œ¶\PyT"€ S•4a¥A)ä6KWe,†®¾l–ÚÉ­t?Ý$:zŽW"„§ÁyÀ rpÊU/¤ê?ôt°°xé(øR¸hÿ0é[À)È[^„³áI…}Á0¡  ç‚À!ðË(HÛ‚Ë”¨ °ßˆÂ(›,*œ CAb(HÔÓ¦„Z‰Pt: Î[ð} Ëèjl–  £Úõ;LVBº¨—·J^ðá¦÷é3ÔTæið«”Pª„®ƒßmœ¶ ~Ò°^ ¾5—¦’týºÁ‚­è©ÂÜ$ûiCu©¬ú@E«ú>T×øò¹ƒÜT ß$CeUbPç¦SرP@R1ÁÝ«[­¥ØãâØOR›éùYžž*ݺYÆ1Ù|.i˵l˜²ñwÕÞ¯Ö8Ó¤ÒüÃróû¥æ-ê5vß2Ó‰F¤ía–‘2m×µeñ£ô”¹K±W’3,«sö'7Us©škéŸ7Œ Påa•ÅDÈão±†»š,óñ±f þ¨ÔWy‚©âµâ”'´¨Tî–ÊR•Äùˆ3‹.›]xÀª Ã;Õ½õB&ª§²¿EšèÒž&nO“úž&nO“å=Åßt§§û•žî7ô´ÜË:•¤·òôV§^0 •äMÃ{$4³£žÆzœÎ,¥J}°ké’øŒ”6·Xuq³ZE‰‹!«AÒ/ ž)n%Üj‡›ë@ê˜b­*ÀºXŸàÍ"˜¶€!!æÂàw ¯zIý»\ÝI±@«ïøçTQ./ó tB Õ ç ÅøWjs*¼'1ìz}:y0\ct04õøçÁ©Y£Ï—¬ÑfF÷† .U_ÑCU?ô  /Hk-æ“ì½%êüÙø `ÝóÊ=Öý#pÛ>5† ËÜ`_‡åT¤R›±ÄênEº¯£L ž€ºs}®ŒòHc|,QXT0oB›xnvxïUî8UüIFF*¤$'¡ãûG×Ô=†Ú±ñfXN™ñ!Ð>­£¼^çü2™ÏQ,Ða6¶©‹Ðx†âYâ>å´3çgŠ X–„ÃÚš{o “f K|úï\3ŽñÔlqGikz½ý¤­í7lI[WÚc<{O—õ™eÖóxð@·_f³§h¼f*(\iÿóh’F$gZÍU³O•¡rØ,Uœ¿T¨¬ËÕœölú.P’!›GÛf±â‘ƒxFø"DlÃTb©ƒ•åÊL[vYò™Ö¨†Ûœ<\Þ ´·ÙÜ ß' •o-“jÕ¯\õiI!tAbågdwhÁì&8x^Â+¢p$=]°xsy@ E©\¯çã.˜´\" £€;ʳH¡1ü,ýès°üstqyÖbçܠ̧àTVÓè–lfí›ÅZ×ë‰;”çϘß_Òsûk£‚…]Á¦0!IÇÇ {D}Ò ¨±âާŠRcðt&8Ø:›¤4¥,ÄÃÉt}H‹NàÝ–Ka¼JÌŸÁ›Y×ÈBŸ0Ƨü¥«„¡¨ÁLâ¿äBRP$Ÿ~Ï×õ²—⚺„ת¤œU5Ñ:Âíý í|˜ãá”zßÕï»ú}·¥¯¶ÅYt¡}Rìy×øû`O´ìÖþ|lö¢«œ‚D©¼C-'§âMÙ×±^ü¦"ð×ÖjŠ2ŒjÙË¡ACã Ü$\Wté—æc,+ž6ÄÍ:¬Œœ§ÓØ—g<ݤEÕo©©F–m6ôTß=ðÆ¶­ûƒEÓê=ÙØ —Âkeœ±1ûˆ°ŽNð”ñ1ÚV¸€L çZ~t3ë îzBAPžSU|áP^ò*¦j)=D>¶€à!ŽG»a]»Ï0™IDh¨%Xm/7?ʲhk%aÝðàÙ “ƒ(ƒnk8±ÏiŽñ¯­²fÉ(Aòa> 2 ñ% ZÒO!ùñÂõç”×.)²vì¬úøJ­%yϵFœF¾Uîal#,]Pý< ¼p8œO¤»¾þÝ’*nçóe¿lß®skz.4¹|×ór×óKuÝßÚò3ô¥Ñî ÑÈÛÚÒ§™ã½LÔ­l6¬n¥AÖÒßJUðH×G‰®RÀ¨›Ùšl)qW‘âœýK²3rB÷8J¡™aÉ1£P ó~ýÏйz•ÑpF?ñè×ñ :]àrYˆ¨2»)àå‘'Ùh„)¦ÑP]/ <6 `ŠêÆV),½Š¼"›DÞ4ƒRf§L£„£1¥`R^Úѯ_ƒœËnš—;ÜMÒŽÚìsèoÜ4Ûmª§6u>Çžo¶j aË„¯–,]tï2N:ÞCc8œtõ…dT|“‘ÃÀ(Þïs#ˆIW{î¢-Ю6†](SætM¸x!安pª/K½÷g~~ -Û‹5 jèˆ>Ê3ô݉¼ì4bF×þ1@4,><‰†ïqâL€]ð žÄèÑnµÌhH[5í¬iöÆÁêšÑÒÚŸ³ ëe«òv“º&‹°PÑaÇ $\ya½Ä0ÖuÜ*S 4GdŠxÔûI§"íá«›ÿNãWšb¿ñAt¦ª™©•¡4:™^zšÄ•ðü7oq‡ ž½ôßã&©ƒûÙŽ] ߢ‡Ldø‚ÔÇ™*W…ý÷]Ús¸nTWA`€]ÃåJ €´xFh#‡fá®<5m(c1ªýåýcÿ^obynaß&‚kê«­¤;ÂÛC«žc=lìÿÄ®V³h ƒe7ïgíÖÌ”ñìÝ®=S˜  ‡‹šŽÙýbÙâ$•-köÉþ Ù¯ª²§PüÛ¼ß0ðÿ&Ö~û<¼.>'4Ìáê5Ûìod`Kðl&ûœ[åM„”¢§ê¶q•-o<×7‘vU°q=M)°ÕÞiÊŠê@°i|æxùÛ—$Ý—ir\¥‰š 2Be•Çl+°@­ÚÃ/3¼í¸i( Òñe°vÇñšq_×;þ:/õ› Ãúø¿"š]_üßíjþ§»·ïÜÄÿ]ÇÇÄÿ™1ÿ·‰ÿ» üb€Þ¿aôŸ.Ô¨ßßÄÞÄÞÄš@*%<‚š¯äª9×JnWĬ ƒÈkoM“pÈ¢· I<;Jfþñ¬ef…ºcÅKÂ\ØPHìaÓHûÿ› pèa™•Lj̈Š'ñØ£{P~ÑL‡7@°¢Äá:¹ÅÇ4ƒq#”ÑÈÀfáÂíô§8-t"@æNùâá­ïQ{x¨¤h$0ŸÉ Ùž'3-¿ÌдEdJ(¡ðh>DYpá½ü¯ƒϽöý»6 ¿€5 T5@c$<ï.*ÖÕ¸5wp”ŽHàïi6ºqÅžäÙüø„÷„DS€Fæ$ž˜bâʙ֡.Ÿ0Ú "ˆw½¸¨3YYsèŸÚÅ=È[2Á¦tŒhÀM”Q^ç%¨ƒþ!gÒšH¸ÂK26ëçÑqŒÓ /Bäâަ¢ñdlÃÔ* ôV™R‹ãH_Mlbc-|çŒ ¡xH+ƒô†Ž´%SÌCÓÀÊœ„µ@„ik3ÉW7 ‹‹b? ¿ÈFñ8–;ÞeŸ_UB@²¨DiPŠQ© ~–Kj‚ŸöW ~¦˜d Qí›HãRÈ2zˆr7ëâ•qó›PÔ1íÆmßÎEÁÈèZk=UÈäjy¼Bø°iNœ>!lyò= $ràðWè£ø×§õ¡díy‰³CªÀ×Î-…¨Ÿ´Ì÷¼Å…,# V”¸=nºC?5ªüÞŠ8JMä£z kän¤\>ðöÜ*I¹‘š*V«“J«‘õÁ®銔4¸bôãK*øñ¬ÜFØÃÊ-`[Ÿ²z&í U˜ªÕ±KE§¾$`çùA©N·M j3Zš —F¨!êôZR'¨ÐÖÅD•È-·USâÚ®;S¸jÒXÑnµË3Æ©«b?+æô«Fœ~^¼©„|~ÿ‰ñ¦Ÿm*?üÔhÓOˆ5ý„HSÍ^89(X 7­„šæ¦Vεj"M—D™. 0Eº•Ú]=æt•¨Óšh̺ÈÓ¥|£>nE]¼é²HÓ]^|ºJøiS—K!¨ ¸ui—Y Ùº¸åd=éè,w^—T@ì°rãª5ä;Ll•Î ×á(ÆR Äw@3~‚+‹9ù¡%ˆ:–̃óR`Ÿ9:¦N ª—(XÒO˜c…i!ŒsLi»Ðúo“Ç+ëeÜЩ!….’`úU$©/bÑ«ÃÚ Šôí(ÂaöåSGåUk6Ÿv¹¶JhÐUµ»ŽÂ búåTÒ/#½ 2cD8'] o×NM¬ÙÅšS°íèÊy‡ˆRª©tXK£“Ý¿f)“…Ƽjà"öÕÌE§‹ÃHµíÉáÅj61té*3Q¬URîÖqs·Ž¯¼[ cŸ°lšª[º0ͤÓò\¢nåÖÖ…c´-´þsª{h~'n¹S¦NÅÑHkƒÈ…Dv´¶@ÞHS ?Õã¶¢Ö/n£R'Þ%^çÀo/w‚¾Kâ„‚(µlQ$‹öêßÌ:+ É1ë^Zt,zU+ ”³n«RSÈ7ëÂ%Ä ®úà64öé³à$æÙÓ?8/‹ Uu—E}·gb’!pùU¢-y{¸åOb,O³•×iîb$%­˜r¼\ÀI½0Oã£.Á°,G6Ç`×Õë½`‘ü¡†°ªÛRÜ€þ»²êµjÚs[3\)–€Îô —5Ë<ébêPxrã>4§È¨câ—V5ùJÝÚ* rqJ,ÓÅ>;å%±>í!7ƒŸâÕ±Q“l_¼ þÉ•áZ+A‘¸S]óKŸ-ã©ã†p„ ÆcбÜYÊ–s»*~’¬¿7¤xm|›ÁN.îßÒϬ ]5Ž 7-S;è%ÐÓ™F‹æOe-ÃTZÌÜUÚy%«’4-çU„êÍãˆy¿¾Èn|õòÛˆìIì×MîÊÜEôhîÖÍ\|¹xæ.š¶ÉÒ™z¹™ºxšydšâWž¦§8Í–LÀõ©‡/—ɽK½¼L=„ÿåäܧ 9& Ì! ~UÔ-SHWC8¤ZQûü²½]¥«ŸÀ%(¹—vSo›ésD ý‚¿ôN‡ ¤Æó}Œh1‚ÔÏèܶH²39‹W8o9ç¿7‚Ö36¥éBf£iZ@*w[xRtµŽg½.:8:øºS÷z_s„¼EVm“è"<%Š®Ù›ªaL©ãj©’=B—F ' MXó$Gݰœòh]5gÄ*"™üFçúÌä|YN#Øl? Òœ)þhs4,¥Ä_ø€›ò"aʘµ‰ÃÓlªŸðÆaQÞëòÜшßÚ¡+4TJñ¢L§ï«Ù{à™ð[¦ViàÍN“èïÏ6(Tææ*„Jýí‚Ôw('5Ú24?µ7aÚâ®|NG–µZÍ}‡åÜ2Ê h%íˆ ¼=%¢éC+sé°T½=âå‡gGõõ¬r‚ fmÖ,~ú}Óîª~9hæ,Ý“‡ØíU°“WŸÔö‚¦]ðGN¯ÿÝ2¶H¼Ïo;U Êߨ’ …ž^&- ‚ˆšÒ²”³­|•ä)e«ÖªÉ¸TéŶýÌ—KmûÜÒŠæ})Ü`”Õù¯ô6Wm¥÷YŠZM¸èdÄK–×}_Þf–ßÁã’}-^I£å½V[¨€Ár,r^AÀY›”nfã胞 zæ<eNCry§,As¾¡Pðg–Áîã`¢ÆÚ¦n 8莂,ƬogC[/4üGÏv÷÷wÿ‡ÝîãceËÆËÈ{ñêå+~o67h·”[¢{êžÞí‡ÜkÜ–—a~<Ç'Œ]£P‡“è<EÃxbl}å,nêr€NáŠÉa.¦¸âñI˜‡CŠ_ØÙþ#,~Ûc28ìn?µ8éX4;‹Fmï)PÚǸ¥À¼¶{µÑ Çßm ×>̹Îü?ðÃ*î0X5=|) kǺМî8§ÅˆP騝,Ç’cþAµÔ,£º‘qä¯SVqº}+ÅCŒ!TqY C+—){Hè*suŽK\pC"ïΖOA‚<>­¶©¹[ôBïÑ…£Ýü—ïÐK³tÛ8o¨(oÑXº B’ø:cëLBó kÓ¥‘[5üK—Ò×ðÑcäìȰ1F>JUÉS˜S2q²±§˜†š1øq=9¢šÛkVI€6ÁaOgÜ{*Íæg¼®|ƒŽö‡Ú.G³GÜKÆ}û¡î§éÝ>ݹV0xœ¤»ëÉŒ)YÔSªB•;Ø_îz-úJw ƒÆ³OŸ(ê”_fˆ{Ûe)#]€ÿˆòl{ º¦Ií¶4SC†‡#‘pÖOæÉ,†Y‡­Üi{u¸ÆÅÿÀz6ª(¶ªôRÇ8)²vmð=͘|h ¶È€¨k;Ès z‹}ö†3;‹ .{TÒ¢ 0ÖÎfœÑÙ$`ó©EËgc—”a#;º@~Ò¢’+êR¾"ã­‘×ÒQa•q‚£Û.°l-wD&Õ½¥¿­*éÉõ¼B:Ç#€’$ÔÀD“óe@†-°8¼n™vltáí ¹q,³|à­^ú‹¯TÚLitÖ,œÌ¨o$Ù1R*Á…c2ˆSœ“ÔA¨¨Z-aÅ@ç­ é(@¾BâšdŸ¢9ì4J.¬©„¬•F Ø‘–äw–BŒ8އñ 0ançðÏdÙÚ#b¡Tȶ{Œa@ Ë¿N²Ñ<‰új6tƒïSù>ü÷± ”]?Ï €õèbµõnúµ´N÷ö»÷î÷Çp0EãRÕ$›„Å{¢â_ÚÚ?ðÍÎÙùÎNàáŸÿ¹Íî×;üV?XxLu:üç6ÿ¹ÏÆã·åNÄM˜Œ¥JĆüç»K`2æ¾DügȾ“î¼-ÑILêh,¸À úŒ¨H¥¢IV)Ê­=ÃÇ÷¹(p1Oß°³Ï0iâs¿U¢ W“J³ þÕËš†!wR…çä°‰Š3±AE#•­JlžÖÎÑ*-»_s´Ü½B»ïù>n,î·¼Q|ê}§ 6`ÁZª Áf™“,±Ñ8®¶ƒÅ ¤¯Ôq J4†Hiõ¨±­VeâQ‰žÌ^JcÍìœupÂ. Öi±Ø.6Âé{(üÅSTDʺ¶»Ew©[±õÑÏz4@Â~*TqªÿÌùß(« “ý4Ìã†84z(îRmFÙ±AØQQDËÜxþ žh-ZêÉ»cäm3§5TÁº>³NS[OWok–BX@Vl2ll²fš7´®Ô¢è˜öÁÊÆRmi#N’èØ>fëy¼J‚(Úø›Ï §>ÛUBE5¥‹[ñÃ^¨¸¨á ä~Zu¬óØ×”JC12H•.ÊŠCA8ïôzçÝ^/8~¶uðAË‘º-TvÎî´P£×;­Z‰n[½Õ©!Qí<:Ñ©OL X´`¨mcpºšè¥à5X¾µb*i°±áúPSšÖÅ‹Ö7–Y>/·¼Û¬Þ©_çæcw™#A„ l-»`ÒI?Þ55oŸÊ¢DÛ¯øòȰˆÎ9l6ÞFñ‡­Uà)Þ¥Ð?…M mnZÍLPÖÛ…PaÓˆ|¶(“äV¡u/3ýj;ï86Ðo§z' ˜€·ù’åz}e=m(5«`?EǃnVqjäM0bdƒ}æZF3+^ÊA¤$™ýÇ‚’’‡+l>“ YÎQÞE åÐàR²·¶IŠDh¢Pò¹’Æì×ßšÁÙ©šnâbÉ"vùj^)‹Ðf äŒÕã8šÑF×££€ü†ñë ~IÑ¥ÜHñdiij— @+É+ŸñÒÒY 7+@!Έ+ñÚý8áÎ.X{¹PŸ-›3~² BLŸNP+Óù³X$ ߣ Üaŧ¼:ãŒàFÙGv°”ÎlbXŠ?wÂ(Ú4¬Êá%Våp0§ ¿™I£t¼H^ —c20ùøkÓQÅpMƒ9¦¼µ4MÅO¼4‘$‘ ŒÔiª[I;au€üÙ`5Rìåaí[6q¸äè±°î Ó;#sau ,ì|ó”’IÐj¦߉µpj]ùäò …–L°KO±O™bæSšlÊ'ηŒ;FxóÖð¡ZžÍJ0‡ÌpÃÄõŽH¥Åz¯_³nqœ€Uç™ËT•…B7Á‹ÅqG‰5Xýn§E:‰ j"{@ôFèÕ"€Ÿf^)#‡j+6öý÷È€€Àe·}Ðóÿ ÕV! ªýØt>‘âMMêòÛ4·¡ÂöwA¹ÆèP²Þn2 Ï‘lb&ÝîT›ås 2thuQjÕ–EÉ,l6øsÕ}ƒØt™ÑÀѶ=ß>" ¦[è?Ó°ó·Èä "FÓdè´ùõ»m†`ìmÚ"TžJ¼!¯ö5oe£®Á˜Ó×S@¯ö…©#‰._ ²dSš=`ÿzD_YÖ£.~¡¾½î.’qñ>¸0Œ¦¦¥6ø`ÿ2f(_5õ ‰½W«$•(õÝ8j.~†_uf8½àÎX+„T#ûˆÕÇXø2òøNy»¹:OMÞãåQ+ËçŠÕWq5)Õ KÕ[Ý…°%º~®z(þ±a~¼`„ØÛÇB˜2Y÷0Õ] á¦ý°OÿnÖ礶z:–C"57×uKÌ ðT<—Kµki Ô1ª6Þ4ÀÜëº&I|Ç)o‘k•o`mdÂâ_aÎ’¨çp•î!^DOl‚q[LJ…Ñ2z:ÈÒÏMõ[¡ 8Æ«NIèBiJÖ¤ª)/ñV–Ň.6±^eQŠ—Ó½03¡a¦ˆ‡}™ýÕ2“6,3¾áð:e†CÄLÍÄ]¢É“C2‹ÛکΛ,žªOW$z©§MüV/‚›”}3ŠÜº Õ#@¢M£X“(‡ßÜ`±ÌPÃs©1víA­®ÇZ]äî,ÀfŒ(;}4©Bâ{bö®fQŽÚl °E{müì4,ÅæóÁK;ç4Y3'Ù‘O= &õ•qù˜Q“„~ågïðN·w lðCQ&D¨æ£0ü,ޑ󇤮CïKؾã q ¢è·…Ûcœå}q/c’ŠÈAËû)´k^?to¿¤p!Ùò…eÉ8žùÉ Èñÿ¢ÊúùÀb2~ÌC–Ð 8yQ–ï!dõ²È‡Á(*f$ž“´–he<èE0Z°gµf$Jžsr§4ÓQ˜ÑÍÆ¯ê,•ºH8üJ,PAý¬T|ª×wìÚBÝ‹Åk;D«åÚã¢þ?@-nu‚ÑêÛìN]«µ¼Æîfx3HðæÖi;åOÙ8Û0yxd¬ˆð’´öR+´ùÿÚ Ž¾ÛËUßLD4q§—#°]ù³6Wíu½urµ÷ìæ›M-)8@dz‹D!J‘Vxx‘è#„V(3Hz8–qíròWIßÀаz6G?}ºX1â«J|/©Ñ<< ºÃ£¦èB‹8ý‹ç(+ŸVÄc[2jû{­Á"U´aÃ>áS‹†¤¦C"‹•}‰e gFeÕÒ«Ð’Õª²º]Ǫ¥0öð–‡`§æ úƒ)t+­!fQScbèS¯9IC½å'+8:,âVì(O©Y­cùq'­M²þðr ß.²dg¹€™¡–ÈÊf[g…ÂB:~µ?Y3(q2“¡vmÄ3IE$ËVjÿ¤×…¶émMW.ãÜ¥‡ÌP§4¨+t óD¯Ø!»W‹:ûâ׆©üJõ•üËê+ª¼Ž3¡óO×]Y×Ù¾N]§aN’ì%x_ZÛá[]gÇJ Uê®ršØt®¯Ï º²(_•\óxFN¥µ·AÖ&;ƒ^0ø…¶;éjÞ4‚%üQBɵVw& I› ³W¬¶Ö¬Ö¬v9ÈlUo—V—ñYΓäA¼ºÿ¿ÙÃPÈTqŽj| ÑÊVκ‚–¶I˜$‘•X°ŽÔÈÝV³8X«»ÈÞw9•ˆCÉ`JîÔA„«Î3¶ckf^ubt.=3:_vj P¦¹Aÿš ²Lë|ZLVm?¹iÕ2AlZZÒÁj]S©hû¦ƒ¾’:µU9ÑÐùâç5U(9®UEÉâzbsÖH$(8š‰ën‘_ÃúèŠs™j5ìä•C^i /(¼¹ªS1ÉrÍVSmËmöæ™®Ër7ˆŸÛ²b•YKtv×32«º3—ì¤Í®`ËÏ`›Na.cˆ”aû^ùÃÕ¯„˜Ñ‹=Ñ`8ªI¿ÐÅ&ø|í¤9ýwfoôOšg°,-ƒÍã.Ç»¡þYLåèwKƒHøó…¸LÉ:GpKý-“¹¬„ ÍÀD@Ü$M¦5.šÍ©J=—XÇI<Õ‘1hègíѲXçë¬oã\ìÖ¬(ß5+0%…ã]`PëÃÀw®¿qýá÷o…È éÓb…ÉòGÖ²˜÷µáBÜ5ª¦S±œlÇ­ˆøe)ìgmYƒN„Çý¿ø*›ý–Z/a%9½ëã{ùγ2„÷ˆ×笂+K—…ñ+[’*.ë*²ï“,ä]cªf{?g1_‘0D±Ø—èãbP½py!aV"ʪùC… Î>t¦ï’Ñi¼é[4â¬x)~OÊ… )ñºƒÒ·%ìP#c—.ïò§ÔKöPPämc䔬ôÖ@«øV{ʆ–)^íi§’Ò䨸i•Ê®H ¥ñ­’ìz¹ÍGÝ; S™p™T§Rðñ¦eüñ‡³Gùu@’J1 Ç3hÊÁÔ´½ob`ºléÄÌßswØÏZø®ñ8œ>¼VPIñRVÖNvâýå&Ù>§Ó®RÍNƒOŸýµçíG±f}¾ !âÑNMÎVui¸ê`›Œé¸nÙêk ÉMêÝ*y5Ø9îÒAá5x-r\‘~¡)ìç¡{WC1{}ë“Ç1¯ÇüÓÆñŸÈÚúàŒõϽ+¤¥Á˜-bÉ]rxD\­k(/k¨ùsÉ©X&캢eF¾"0¯zì-íËܪË#p¹EÕ('ÿjk*°ÓU®ªDóëXX¯‡SÊ\°ðè{–Åÿbl°ý¥Ø€9®„Ž£4ÊÃd{:ϧ™2*WøŸnz¿¢}‡Ý¦kj÷ràýF—Ó²ŠÚ2§®4o(½1çcÇf‹É×C4ÕÊ+µò†ZTͧKƒ‹ˆ/-O²³À›FÁ…WFyZþò¥¸mø¨•X á”ZB)³VÉÔ®¯QA¼žäÙ±šðèɈ¿RòŠpÄPt„xâc„Lº¶æ 6lœ‹ÞEv(y@P°IÕÅUU ‹ ðË|êôæëuæÜêÇù§v!: ¼hy'@â#»“ÖÀÞ œàUFfKéõPZiiàY ø¿¼y\v¨y!´Sn^¡…ž›åöáYMûÃ,¡dêC€ŠKØm9¨t,L:ò¬k=ëªrøðY:kObX ÌtÜm1êÐBÍðC?¬ƒg…8L=Íä =Tì`/á‹®P|¬Øbï¿Ú}Ž®,Ø¢Åt$˜rªÅþCõUÓK[„©ßGêJO˜È_ûZӛϊŸšûy!Ü.âã+ºxñý¿;wïÞ½]ºÿ÷îýÎý›û¯ããóý¿î˜áK€ãã4d‰ñìðè/{_íóÍ¿ñ±›a2EÞ‹W/_ÉûukKÔ¾†{Ì·ìëÓ­›ðz_O†÷§ŸÚ—û²‚¢Þ†ùñœöƒxUiëÌItŽ¢a<1 o™[MImQ׸³ç¬Ç|1¦)Îíµ½Ç꦳ÂÛÙþ#,ÛcrbÙÝ~Šê‘©‹\vÚÞSºR>D-)0¯í~mtÂñw¨Xîìt:;ð?üÀ«8lw0ötACƒ_9t`š¥#º¢ž¯¾@T:ö+ BOò;ú ‰F!t#ã+@)pÉFA¡î6¤°„aᲄ0N"ö3eé­ŽBGÑÀÏðz†Adn(¤›»H·¼}4üúNãGw†Kfè¥Yºm ¹dÎ"²ôA®1eðºÅF4°=X"/¶ÐýÖK@ jÕ±ÒcèêLwA:Ä×ÞJ'Ïb kâëj‰>PH1Žs¼º%õ`ðˆl1'0$ö¬Á\Rÿ©t<ƒyb@Up¨í¤º‰¢§‡Þ©®šþíÓe¸ÃW7ø Ï#kЮ*À_2ì@Sƒ+‡»`‡¹ïµˆè{álLxt Ï€›sà)L,e];ØvùJc„T@¯Õíi8’›‰éÞâè|fj¨3¼Å6ƹ?™'³¦¶r§íÕ!+yû\­kl-ŠÑ 11Oø,M.Èý7cÒÞ(šµÐ*Ý40žÀ&Þ+³)ÚYV”ðÙ£²i€¿v6 dÎ&I›]-‚>»ô ßѲ•–š\)Pw&‡¼—5㯥ç^KlØg:¹·ÒX|o]ìÐæï«¦¿ü¥UEx=ÁÚñ…¡eG`¨¨ò^h8Ñâ G–~ë–l”)v¥ »yP1<æR( fÕ ¶´J£³ËŒpJ’#Õ\P&ØóÃ<¥®BEPŽã)¯|…XWò E6)¦Çp%ÖüBVK#E˜ƒ01kBá.“h=ˆ‡ñ °á3¹™x±T·ÆÇý…LÕïZ&#ƒ˜3³—Ó¤»¾Û"J™&xmv”Ï`‘¯kZ¥ô\eBsYtÕL[Þ0Báe!5°¦`œÐ,ŽFÊÓÞZÁI ‡%jÁ9 EË”“ŠQüFXÛ…ü]È—vÁD“‘¦'á9ß(ÉxxÛ臚N«“»ðÈJ•é­ºŠ;•:•Ž#šõÞ%†±iQQÊŽÒ ¡~mU¿öÓ¸ÿ»¢½~–ìÿvºÝ»åýüºÙÿ]ÇÇÙÿ]ÃÞ϶‰µ¾¯-Gm±Õm¢ü/ú”ç[£áÉö8½¾ùßݹ¿<ÿwîÝØ®åƒóßó¦ùçóç?Ìó;ÛCU”"CeÈ›di6ÉòéI<ä-U‰1ž§$%P­§©çï‚nA¶¡ÝýýÝÿi¡‰'>fÄÈ·µ§çÖQ=ñ7CL,ÜÆEšÔÚ¦’U~¨·„ ½;€ªMѪ²¾F"ÔêöŠ Õw‹”+¶äÇ¥ €7$E“A4B5hšgï$ÚW" ©$‘ø/š!ÛÚ÷ÑAÁgmü¦Ô<#"ÊT©Ô÷vñáUu‚´¨Ïïánxž}2¨†›ð¡d€é£íåðã2ï$®õÖýÛ Ÿ®dâÕ‚•×$5²GÏétÏø®ù®.€'nä{àCÓ7á³>É©AÄ¿3Þ‚îÔ27¬-›,9˜åµÀ M”]IÀú¦ºB°ßC\ }7˜¤hdTJŠð­å\ºeéLhçS£ÿo»Ö5Èÿ+Üý-ßÿÝß¹W’ÿwîÞ¹±ÿ\ËÇ’ÿ7²¿d¢ÒòùaiÐ[©•¥~Ý¢ÛøÅ&¯¶ñFýliîyŸ!ÎÝÝ–Y£Ô e§fÓ…òþ{A}’!)žÃrå륭G’×û¦«AàîÏÔNðT‘‹0u;eÜ ø@ˆÛ$ý­-ØÈîõ`¯:Œ¼³È; O#ïg:ÒØ,¸GxÔB~ÈÔÒ0L½yÁÇDÔ*Œû¶4ŠsÀ=¹0nTF2äVKõ7H°$³¥äžAZµ'áù«|D?Évt”=âþzþ›·§|×xWg½Å5è¨ÕëÁ¦2ëMíAèœ"ÝçÝÝõÐB‚ÊèˆÃ7íN 'ØÈ{Cú@UB;Çš¸Š*8Ñù4ÉF^yhãÅøÜ¢­*î­£UJ j»ÆüVXaæä;éócϳ)¥žSô~|¨*ášÌc•õŽ×ik_º@Ÿ€ŽÓÁ¤ÍÒ²øOÈOÔjl8±¨·ò©Vë ÚDÀ5cQËÖMdf~žjRZÿGi8‰‡ÛÄÑWe^æÿwï^yý¿×íÞØ¯åŒT7æµz@wgçdø{¡ŸZqOѪuðâù·°¼ú'³Ù´÷í·gggmâ*`áã­à°@“P.PGù)~S/*¦E„8Oiu‹FÚÁ¶?a|I(Ô›ƒéדÿy¹ûâÙc~ZZ·=çt– ºôgèD‰ø¸šíÁ!!èx7ál¢JÂìiÅ?ê…Ž,´ì;ï0m(µþ£ts…ˆ«£FyE³ðêõ8¬PÃOÆ8ãDû´!=VL'¾Ù´1꘩d¯fG$ ™ù¨f( µ³˜]¤ïz¢úL!“v·¨åW¤M½HY Ö¡¯JÞÆÕ —,M=}–ëö•r‘¨qÞd‘°Ùâ¸IZ{ü0Ø ¸á2¥j—­¾!#l>P³¶’ ¹|Ë˜Š¼P¿¦asàŠËIß½ZSôÂýß.ÿêVöwv:7û¿ëøTö‹¿Àð@Ÿ´¡ÅØlü¦YrQëdŽæj6x@¦,­lÝ3žø¤gêxut“m@ÝŒ•!Ÿ§±¼§¶ ¡Ú$–…™8N7]àiœ sIDy3æ/ài0ãztq‡3ry,!*Œš™,Dz:êAŠ܆'8åëãj´Ö_Ï.¹¬-mð8NÎÏ@'›å"Ö¯‡+ž XR"GÊ\^†áà9M}àóa–âP¤Ôq]ʨ:I: sµųˆÎ@ Û‚ÒÈXkžê®#H-!ÕJÅUšR;%ùÓPÍ4´¬¼$¯±[TgÀUe›§zþyÕAöÒÍ~J=J‚S")FUˆd)4â”lÃ0ô­­ ßK•$ÙËâj:,’Ø%I.S\åRÑ4 ÷µSqËAÖ×1pÿÕ“W´éùPÅ= åaê©jtŸŒþõ±ÂQ*ùÒ²ê<óL}ÇKÈUDÿµ\…íÿ®Ê hñþ2”ý?ïíܾÙÿ]ǧ¼ÿ»Î½ßkÞã­rögœrlkzæ,>æ+E:˜ý >èÓÆ:ëC©äž÷‘˜’Ó¾Ö×9îóõMÃu‡}7g}7g}7g}ússÖwsÖW9ë»9ê«"öIG}‹Núnúnúnú¼KôÁºÍ,³[‘ÄÈ ]Ã씡Y‹S:Éíôs¡}ç; fªmIï(ðD4â"N¤8ÀBm**ç÷;%‰eÙ©tɳÈäêekœ62 lEÒÆ;›bÌëkc¥ò+¿iFAžû\WK+;r¹Š¹\ɼj®Ø\¯¡Z)s¹®ûº @¾@¾@²¥í/n~auNíœó!Z©²y×TuAÍæŠ*{qmUûe-GaâáÚšúM]5/ÕáM‡"Õ)k°Â)¥¡@Yý½Ûú-Z¼¾¤KÂÍç?%ûß8gWûŸ¥ñß·ïTâÿîÞÄÿ]ËÍEÖ˜7Åÿݾ‚ø¿Ý)fíc¿l³¨ÉüôÙÓWµ®Xa½dJ{ý}Í#+;äd:»às6*¯žÇÅžû¦r"¥Ê*aô;°FQ¹¤)D•tIL2êÓ§ø rV3Š@£U‡"Î>RiÕ¡s…£2.úå4ŠÞW-µ*›§”:¢åõBN Ëpt~Ø…ç…ª‚{îZ¥ÕQ˜|àöq•ƒ7S÷RçnV5³ºþ/Ib_#ÿ¯Töãg‰ü¿}÷ÞNYþÃãù‘ÿ_Qöëš§8{ÖÀç88íÓš²}ï¿qûûë8ñ¤Ý³(º<×??®¸`0Ôó6@ð÷£1$©Õï)…ê<¦–=ý]o1¤ìê–RÖ‡€| ÈZª@›}:Š€/­¶qÖÑ÷OF½Þ,i1,2}ªW³„áp+'ÚîðÁ†"ýĄ̀T›®ŠN tiy®›Ì£SCƒ:­† ð&ÓÃÉ(ðjñ7È+8eÌ)¥U]!]®„ª,Äzœ<&!íõJ©ÆFÙS,ÂqÙ\é’íC _µÑbðùJÇ}sMæ[™}ÚMRÆ0²pi€¹†@¨`¶}ƒ'µÏ°sÉLfyç‡oW = ìF_LFŸûôæ­A˜žÖá+{6yQ ¾”Î3²ÿöf„}ôÅä$…Åe’# žAºÃèd¤‡YW¼àÕ2ƒ]Ê… ˜A²€”ª ª¦…€*¸Ú4²K[Ð e½ÿoK&<¿ñ|Q™Ž©¦ª³ m-K„hpšgcÎø“WK1›9Ë ÁoéÕÏzÂo-xÚdÖƒ³,¢ÿ­Y•€p2¿žú楅÷ÇŠ‰kPÓUUf*_ÿââL;‚W1x]ÕPé¡s:eYÿ›Ì¶Çq”ŒŠkËÿÚ¹w»[ÉÿÚéÜä»–êΘ7i÷XÜW9s¤Ü!úwL²Ñø1:w<§Õg@{÷É#ÀÉ}r0+压Ð. gŸdöõlV†b2;Âé©;³žÑ>ósß#w¥T Akˆ?xßæ²-k°·,âUÈ xà]IÝÃW/(ÙÇ,›´a;Ñ =öòRø"£¡ëƒ cÂó»òãç?¿Ú¢+áe»í3øG¿W¯ëß|§^}ç¾{ôêÕsÅ9†N?î+™A;Ü7×$™‘ÛÛ¥ê8‚m#ƒ®zEèÖ¼ß{JÝosE¼²/Þíåá”ăÏX +(Ì™` f'ö॥ßI²´ÒöþQ8R3”’r‡f-„‘vœ¬3Ä=Sb^Í{d¨Uêm™­j]êÍju×'âÆÄÐäìdFËzù_қǧ³›%ïfÉ»YòDòÞ,y7KÞÍ’·lÉ£XAúM 5g|+h^Ø>Z|9<Ì`LñÔ X+¬BH¼ÈW9ùúhØãk®q©ÄçOö+DðI(”kHîbmÏÛ-ŠùD<ß(þ=Nãlnåµ.YÅþú×3Xw6~¿A›H]ç 3Ë•­Ff:C‹9Ž€”ýâ]eëxNúSŸ‚0ÀéXÎÝù”æ¨_òèkM^²¨©{øÿà }͆ž®¢/‚ ›$ø†ˆo`…(6[÷+®"}³4kKçC¨H5Ù(©9¨td×±Pß p!ƒ­e}³”ž^ÏúÞ7ú;aP ½²Á{ýßóÂsúkÕáÕ^ð)Í‹>¥/ôTá ë_ËíÔ­u,”/Eœ[—&Ž=¿UêüóÒ½ú†µ2nÌê–Ö–¾n‡¶ÝyŸÑ#­=~Ý}seCô©œG—?_Yvêûs…ý˪¿À˜ÑÍ<®˜×2Ùw.ßqR+ËP©Š¿ê:ÒSµkæ?.nu’–u/å—êÿÔÕTçø0šŸ~´29ÓâêE Ëš:Ú£$Äqñ$>Žg˜ˆùÕ×$^O¥dKTÚ÷'ù© Šjz¾V,Ôº&%Ô¥Û«"!LJœ>í\SCš™]ØíøDz:·ÖÊ1_‹Dƒ¯6ôHÒi«‚µ Zû‡º²çvÙE3» ÙÉÔ:í«½J]ÉÂ.©v,uvA½Ù©+Ù¶Jâ°ú*ÞÞxÙÕT¾eWîªgoà¯ÁyñMÈ¢RΊ˜²Áï¾ÿ'vÚÆ;Þ¯. `Ùùÿ½Nùþç{;woü?¯åƒçÿÕ1oÊr¿1ˆÔð¼Ÿáå6šGÞÆ4ÓÙ˜íåP,ðÂ÷¡·ñS: s | MÆ)E¢Ée‹–ò(â5$hÑ9ËãÙ ã~/¼álvc(o‚6"ðé¶Úž÷,-¦1*Ù`R¨$]Èó*‰Oã(÷ž„é)&ÕÚx*÷‚B¡‘Ùðβü½rkxqÔ9êiO‡È‹GQˆ h@x04øSñz:´ÁÎÙ$âëvÂ÷hvÊ”³ƒk  >ÞÄð3$•¾!µíQ{£x<Žò3mÄ ºO@á:ò€!¡5}žm Êm*°Óe‘æL%| FxŒqœ­‚Ò§!”I¦P|ÓW™ÙýµñÇkÏ2ï}gúÌȉ›~â<ŒŒÅQ'Q 4¸sî ñ$ÅÆ|„ê– NØMQJ‚Üœx9Žg4„#‰Yxs{}[<ÆÓàlÖbÆâóš"þG¤c䈘ÀÈóN‡ëX¥¥ô¡èPÍQþ(‡†_àÙ<ɤLî0C·qÏ.ÔJ…ýKŧ—XõX(¸Ò²Tû郮½±Qª'F¬1Né(†ÔÙ›[»Ó½}§¹=|[nÓ§áßÀU°øûGÅŸÇÇW3Mˆò³öFK©K?%Ü»ð9Èx]ïÎ¥*5ÓE¸wÚúp3x$ ÐlØ*÷ËÓ£RÖ5¬5=¬ס]¬‡F®Ëu ƒõÎ+«‹ÚCRÃ;=I¦t!ž ˆÊ.>žzw™ Înðµnù…"|çþåðÓm»€ Mütîox9/KHŠQ$Âb‚_X^È yLIÝfƒ›ÆÞ[Cˆ ”oΈdêg¯ôú[‚…_ ç l+@£dy¤ ZB 9”›Ì(§Ôâ ‡Þ4 1ïLÞÐFµ‚N–[(oHŸà“ä¶jåÃ+N€þ°Hˆò(ý3ï¡;°«&­@A ¦0ei„ IŠ.¦€Sƒ ͉j4¾¹LÝÚ¡Ö+s š¹é|ý§èµÅ ç)™áVâ^W«q%ú]­Ä‡ïÕ¦´lòJ•°Œ_·¾R5ª ¸•«P…îíš ŒW¥ AË­€‹at[/ñ¼·¼ÆíÒ,.#USÃKŒ¿æ…a®Yé׎:z´;;äBÓÒâó|ƒzÒí¶o_RI÷±¦zAÉ6µÿb÷ðèñ«¬û½aKü3*3§€ (ÜFÓf»wIµ-kùë+@åçJMåÝ#ÝðZ  7© Idᨻ¤„MÐ+¡t—¬å¯å(ÿFIì›b*¶šë°7Æ!h«F“*+®º×=Ïûe2*g¢bâàˆË„«zQbløê™M%dmH°g]’°¥4>kW!WÛ _TÒ–ÑI±I®nÚíYþŠ4$ä WiBCš2Õf-¥žéÒ:—~µ¶pÌ^7z¨O¢³—Ó{íx#†\Öšqkßn3ªðÎë´½ʯä‰;Ff£ù]WÐ>Á;NÿÍ¢·g;ìÈÀš‹âÝ.J>i¬ÛF‹ 4vnZ›ñUð1b”ôz»EŠ1&îdZãg€lpš½‡õFßë`c)F A9.LMI‚ÛÌ4K·ÍfKÚ :«[%í,ƒœï¤±ÒÍØjèm{±~+K£¼çÀ¢¿Ï3¬å¯kBux½T úÞ£‘dÃ0Y_³”cY Œ­Û1iW¡ 3ÐÉÚú‡…Ó8:e{{$Âc=•-UH3¨›l˜#âEAuùNLN7††r±š)jr:©`ÉÑãš·%gÊ'èKj[ÜgÆÐ2‡ï!N¡¨:aÓöüü‚GÍyds™ÄÛÎTOkdÄãC|s¤›‰WÂX_Tªz?Í“6-§û4±oÀ^òâ'^a"§xÈpÚyŦޙÂeô²Y‡SèH¯({>);ç› „\W±ÿ|6ìÿÐiZ¤›IÒV 3R\”œUµc$ äF¡å0Û¥éY“¥|Ÿ¸É ¾në‡3¥Ë=GR”ŠÑ3.E”G;€‘Æ/‘—5¼”ŒãTɧ‹¨@!tD&åêGvmeBÐñlXÞa·u³L@MF0«y¾Ñóð{ß{*¥~Á)¼U¨bš^âaã«aÛZ ŽJ ü\Y£BÆßu5М’‰Íqùð™ ç9%þÌÐrO#©Dž©ÀeE*Âdã|a³©cxŠaÞ9ÌÜ>~ññAˆŒt.û¥°Elql¨/t©b Zãiº¡`›¶wèù4ï—tÃi58œ*…fTÈ´Š¦ßäò]jNZ/Šhêコ¾öMWAÁ¹àŸð7ðrñJ‡‚”<ñ1F}éT zGÂX¡Å†XC5âoÈ‘±µ’‰ãHàm´¨°:Ø|»¡!)CË1e-ÔàðdžšV!ò¬÷–.HžöØ6ÈV ¿µáPP,*HTÈ]|ÂÕ¼`÷Œ¨åöÑ*Ï]®C)¨5E¿Þþöæ³øS¿ÿ¿Ú–åÿ¿¿²ÿïܾ¹ÿóZ>fÿ¿ä€îdæ 2ûšüä+‘Ê>]9¯+ÏÉŸ|µßó¼ÿÊNRÐ¦Ó xLª{=&êí‹9]Gô#ÞŸè½ü/oçþïßQ/ßäÊUC@§=Ĥ'už!–Sˆw“Cås•j ]ôI5(®«× ¸¾E¬Øö1‰ €54-»~æ„JuF[¬!0uÆNß|Õ·.TàÐÝ ëæzæm¾à Vþ_ñ ‹å÷öÎÝÛåüÿ·ïÜä½––ÿ_Zö_«,'ŸYº1 ­ÁÛ" HP4:F“ªwáhä½Þß{\'VìsUZ¨0ðM]˜M‡…9úK•Õ™œÐÉKA×O°Ùßï÷%ŸQï·(“„ ³.EÃ÷˜~cŽAQA!]ø&N§så½íýÞ’5V‡ÜL¹*-™½˜]EòA` 2ñÖ TÎæWL[ï ¿Èzõر“ÑŽ²˜åv%¶ÕÔ2F¸J5Ì”ñ³Ý57¶S_k¿¡–j̪ÆG‹È/³ÌrCÓYµ|'m!”‹Ž1K`–&ú°‘Ò¼¸QvƒIxÚÀwÇ_:;úÛ=“î@ëüjÝÍxà¥:uƒÊÈå^w ºÑ'è¶mÛ÷[ÞÎYGRqHX¿o—žÌ¯2(“\¤Ræ Ì£ee~Üû+—‘"Ø.éHxç0,o¸u¦ÿ$¼ïÏèêNò²Cz ~^°C~MQ:ÈÕ•á È’ù,’‹±ÅrM R`¡T ù\× ‰>;-˜ÖqŒé0æuV`ó%mzÃxiFƒ‡‡eQ÷e”¿ÓŠŽUƸtò¡![c»18¿·³ãÆ"õ`µa®ôÇè¼ôž ‹,Äǽö¯xƒ-­ØÑOþ|n´þ…n"l[Æ›aà%ÄåbLüiŠn·C´Î&hú%9ÎÅÂ#¢ûÐŒ3^4¨!7Ì_ËK©Ñè×΋RQÎP79JÚ‚@)M'U¥¨„78}÷ ¼Ø¹úÄ>Õ꬛´®˜&1[´ékBäŬ H\J=¡ò/`DOKÝzÂK¦¦KèJÙ5L@Ôå7*Y_ z OqûΨŽ×\t#&#Bù[dB7eÃëÖçÁû½$–R²O’Ũ$7·©ÂJªl(œõ„áa@ëvÀúB¯‡É* p§Õë%:¿ §;Q ¡ð2Šr1†æJªu«²ÉÌÁ„ļJèÆFëΛ·ÕkQÔvÄ=`–‚Éœ1¶n¦¡¾–Ò~à-¤ÇnzBXÑž¦œ×ßÍŽK4? 8›,» _’ˆó8ÅôB[ù{ó–Ÿ©MTªM”j,OjTD®e]J Ëc.UÕç5¢Ü6pÙy‰6t6ýDµ4NÂSš©ÎC ºy,Ü£N}&²ìVr*ÐHá;õP¸@.=À†ð-ôŽ>׌üÚØÐUèzÌËÿ7n¦: *¼ØëQg{= _¯×̉ÕÍ«FŒdk¿Ï26ŽŸ¥äHm‰X‹C(ƒÜß¼8o4™¢ey>‰² Hß7Ò0µVž£€œÍü3Vµsp³=°nå3/”YÙ¶8røe“g`W·îæ¨l*ô=Ÿ:ÕÕÕlç,ߨ!Å>Ú›9µ*òà¹Æ™9æ±j¨$ýŠPä¬ãPj5X•üóâèo+XÙ²åe7ÇkPÞ¼Å#.>8ÄsGaM:$ÔßUa>Xkõzù˜Gyï›§Ÿ¼¹µk³ÞkXð%Ôç—ª ¾ÃÇêDÎ_xŠÖâçR»@Ÿò˜3¿1%Ä*˜äÜ,žä©®˜ó?Oûf9™ø• ž»ç:¨ ß•š”Ì«¹Ç™!ê±?¦GöÑ£òÔ|mWµ›Ïø”ü?£Y6½fÿÿ»÷à{ÙÿÿN÷Æÿó:>˜Åó&Ðï–„ÿ“G#§;>xñÜ›f9¹Býðò§ÍBšð€Íò0¿0 šã‚ bþÐ(OU¼þúk¿Ó4‚ÊXô{|Ò¦'%€dRü¾=OãíÉfÔt¼§|qaä2XÄ€W†%|Çæ"#sµvWõ”3äKZò@•äÛ¢BO“PRÄ“ƒP¡®eßꕪ‰,olöò<˽ &Ç=–áÇÁ›dHÅÒ§»þ‰l@‡×¯žýÕ Þ>I #‹9†zÛ¾"›™}Ö4z˜8Ï`ë‰HÔ0§rÄüœôÓc*@8–ð‡èÀ KÉþ¹ é`*¤„ïˆÓ9¾þÃÜ¿±á¼˜´)NW…ùŒïå ; £3å‡/¢h"1§>Æ,L&,燽ãW¯Aѱs,gÌÍñ(ËñZ¥ûöa·ñ÷yœG¯œÇ¼×Q>™Ï"ëÉ>õõYJ%MŒ•‹ƒÔÜŸé~Ù ÓÚ9aæpÑSð·C5/ë¥E]w¾vQ7/ëÖtóÖYÒ5ÈU !Nx_€§)„ã³èò2Kááå u”Ë:ו¼úææ…-“}¤ˆ¦.$Ë›·-:0ÑíÛ/Ï{½ó¢ÅÁF*±<³ÂŠ0{IÀEP£×ÃßhXƈ"¨j¢·°ù~ý½&r¦ß9£ûb¹%Z»OÇÀ;™ÐÈúÌrG-Tt6´7|Ïý ´—ì­î©©$¼èá¨Õ\5@ÇÿpTAxt9„7!Øx»ñÖÁþ9%ÑÈ'n}¸ˆsùÞuµ og®\B¹¾ò›~=¾È·¿Òdêž1È~‚ßprô1×.r`Ÿ¦ÊG<ɱ5kf1N,ŽqY¾&$FÈømÔ1¤ `·ZÁ²ªÔ¬ ´Êªx®×~*«˜ö”0zô¯J>û('*•OQ×)(—‘Âé—tOG¬’rôJ8¶O õJú˜§ÂY1ÄkÂ!^8Ï0 Œfšu‚¨µ(Ô &]IÃ$‡LÜ*'¨é@Q ¼ù”Êv¡¬D/`§`§ea­ŽJø¨®)©ŸÛ Žåä¥D·["0³é#· G*Pì']”ŸD·¥Ò[:ObÜQæXx”âÔ!ƒ;ŸGº×#tíq#•R‹X™ó ÎÒ¨0lå*zAyÇxmþUí‚…ûÞ”X š<À‹\XéVjº+Ê刊ìN1­ˆìF@}Íοidë¦æ·EqYIÿïF €Â›”¶Áγyñ*áN vQ˜…3÷Ôññ[XÎ4w+–^[ûhcRÊóGª–FÒF¦‘:ÃŽ?̾µÛø)Eï„œæ©Ø[1¥umke ¢¾,Zµ¶Íqî wÕ„¿¥BÝ,Ó1%É…GhôÄ+͆!^s„¦êa˜"Ì)ÙÿÒmN‚ T”V€SÕ°FNôñ=]‘93AP$j UÚ¨–g,¬'š$µß”U[+_•œÅ-NAÍb8÷Ed‚v»ýç=•ŠÎ)“ª°¯óhÓu›-›|ÊRµÅƒ+Ôß°†y¯z KZ¯‡ÿ¡¬<â®oRè‚ñ6vçÍ\zQíR…0 †ú†ù!| Š‘µVIJߋß{Þª”c—\‡ýЇeŽ!6€Ó..ÅPw:oU1È%^ÐK]‘šá£ø§aœxØõždEƒ˜Ü¨¥ +"þ8µ˜:¬V~.iXxX²Ãê´ð ´Z4\A%……¯˜Á2ñ:P F‡¼ ¾½h@(Ñ+¬GyѺ*Æ{9 ž×KªNþTj±¦ Ô:j}¹7&ºf¬?›PèÅ·€\WO¯· Äž½P.{%‰? •ØohG¬t°ŠÈc '“Yèìã˶ç+{½,¡è&éúM\ƒä--‰W)^RZ¶ïüJÙÅÄ ¹ŠçæV‡köI(Ñyέ:ˤװÊijZ«¯rO/s”lBŒ¡…t„uí²ŽÔîÀ!lãÚ·ñ74…ؼç†Î<5:xDø??ïðæañ:Øi6_6§aKÃØ$ïñ Ó–[]kX[y–ëÕ¯q(§MSÒ'˜EM ›š AcnI[ÆžV§‡5ëfî5Åò—^ŸœÎ8B”ûà®2Õµ,ò»ËŪÝY<ÍëÅrÔ›Èo‰ïó\Ê‹åwqLRƾ}”¦a¹­qëÔ0-ïNØ(2pÄÇ…Ós`A÷N~¥ª2Ê{’@ "̬_ÊhûòP)énw:t|yaÄ…-HÔ.VK×$<&’”ZH“¹Cã#Žš¶Ol¹«¦‡ |cu×Ù%uYÏ¡”l`È£‚òëÓ^!Hø‹5Æîk°½^ jte{ô+u q›µê u+šŒ"aªDüÍøz+§5‡.••Vž­×S7‹ ΉùÀgÈhž@@˨¬ªÔ°«©Jþ»h?ªà:oþR""Ë%a*Wä²;²„¶tFï§àñOùü7§'ÛÅp¸=N¯ìx‰ÿïý{÷Ëç¿woßäÿ¾žNêÒ˜7ÿQýV“Àj‡×Ça2Äû*É‘ $}r×=§Ñ“~Ã^/¥³a§#¦ô˜ÚGIô¤ßt)úIxŠþ°‹`7»"JÆÛI–Mu‹á|"¿Wº ™½õu22g¹÷_x¢ÿ%%fLau™ºžNsÌðÔ’}9£Gk ô6“¸fLø&"Yd³±ð3YtË%lcÀ!üe°ˆAé1ýÖÑO”ÏU lBî§F$z ËXy|BÒ»åáÒfË*ÄQ8.‘ôtÂï¥jiÍ”{mÔ Ñ>›ö^ë*4бã ´èÊìɹ„hš¡{sþVn¤B­CFú|ô1·‘sŠy25ýsº†(A”ÉQ4l³Ã('BFÏ qË¥³Ám¹‰,àÛÀÔOøu‘Dú¦®Ñ¸@F]ˆÀ>W£õ_•­ðhª¯ãyJׇág Gs›=¸Ò9ÞHÆnS@mùݦé.>Àè £½=áB¦ ¢Z¦à]u··žâM'ái'tBWnÎÀ8´î'£éÏP’°+º¾Ý9—1•ñæô€c2Îh ð%p «GHk¼9ÔÇZº6^Üæm`)¼zÍX¹Ö͹6nø^ùä2ŽJ²mèDlî q¯]Dwd¼ ö$.tý³ðèÐ͉„álÂBH0÷'°ÍiœÏæx­Fo{Ûê–d˜m%ƒºêz@1V©ê(>ˆÀm±KI²”#âÀÐŒÜðéMyúñiÂß…¸0Q øx8Lð!? +ä^÷¸NxÙ):êŽí"š±*ñÂ’[ ¸?£`íYšÐý?ÂzZÔ ;­ÀFƒUÊѸ8ša )ÌþYjvH±ÈbÚÂôákkk(‡”œ¥G– „_"Žu(¸"í ìÇ(õÎf â^~ïù¿STÕ1ðVä©-±ufCfAø¨Ê^ðHTMÞ(µ¨ßD; š¦™K!Šû5´¥Žù¶úÆÃ÷~;n˜Þ0Õ¶|:Ê¥‹õèY¤ šÉòQzá®%öËÔÔÁE©GC„vy$„½Ü˜Á LH÷â±sPUŒÕ/ñU k›½ûšÆª­Ýé‘)bÑžÙRÀÓò ås€w!êÁiID¼° ±-ŠÃk.&¦Ãå±¶¢Û­õ `ICØ®âÍE\‰‘¬ŽCÏþ±?²pµÏ d ôä~M‚³¡'w höå0w3Ypés¥û{àЩAö<{4lÊ«÷JYL §âUÖ8ä>%÷,@Ì–ìÓÒ`™QT¯€´è¾ƒ‚Qƒ)aìÈK5)-KŸºù1ƒvíLvd]JÂG!o ;¼Î1QCŠ(njæV5úƪ¦ØÃ÷Q•Ȧ!åŠÕÙ €[CQg¨ÚRù<4™A€A)GràÿËÞÚ› –M¢zhã‰2ðÂv ›Z²*‹æ½`úJ¤|K•C·Ê‘kn¦‚*# B*M >_C´kù•Å ëØ­ê»ï¸¸Ý Œ8?Ã…×Q¶´®íL®X[Ë-d‰VÐøQhS×[A5…Þ¼5xêXOÜ™ƒþ^GVÖÞ:‚[56$þÅÉà­vY²É²÷Xëk•-bƒ_ÞêrZ}\ÿÿ³÷æýmIèû×þˆgß t(H_‰yWvä‰'¾FR&;›—Õ‚$(!Ðå$ûÙ_]}¢AR%;3â/±H »ººº»ºººŽå¦ÒkÔÿ,Ñ|^þ·ÇÝ®¯ÿy´Þ¹ÕÿÜÄÇÑÿÌqÿÃ)€,ÇQ­æqRº9j­š¯ÛYXgÃŒØé­š êdb:ád6›¡Ó!yPñˆ Å$6L1Å&äËú•Rœ¬>³¤2v’Ï+sl‹Ë§âcV£³–W™(·&@‰ü?Г ¤®Ic9sÔŸŠU E7>!kË:ª‘*CùíÓáüõøU?@ƒD*Ãö5EŠDLŽKGNØ`ŸR¬Ÿ&÷Üœž»³õ_¯Þ½ÙЭÿJü›ü}sS=/7…¯óûM)¦;róIR=þ˜”‡«0Í—dÿ°^‹ÿñàá­ÿ×|ȦÉó&öÿ`Yàм7éWÔ¨˜ÖCÓ`OŒ…¿gÃÁyÆêŠO©øã2åW«ôJu…X—yŒZŸ>¹èw[»ßá>£÷"½Ý ªf—A¦†Oþ7ô;äV”Ùø àGxœ ¶üV’U!]Y͘0Ñà÷šÃ0Ëd”~…6¢X¿¯Û¡\’”-âËg熺¥Ó ©mÉo`‘AZôöÝÞö–ðñ!Hâ‡ÝV›dY0ÚY/Õ6q¤£} VÝ=Ä|eúG·µf³HäÊš†·©®ô ñÿRÇ.Ë xÿï®?ðó>ê>y|Ëÿoâ£ø¿óK$õ3O~%È;“7Nbhn)å ‚åôw«(2‚MÇO˜îç“bâÊGs%>âšxzþ,jËbU0–Á3V¬åcõÖ=Å^ð»Üp[*j</ñ\eÍíÜ0ož *i…Ù›GÝ-U›3øz!uŒþh2P1œÊɬæižô¬¹üÌ nùÂCWZ›[Ù®ëžÄÇç¶2‹ñ¤‰>˜p²‚¤ÊJé™)ñ:-ÒAÖžëï™]%£³Žî8äSÂ:•ëƒÃ‘[æŽfÀöA{j˜þdzή3Ql¾¿Ò¢AË^2õ`ÜÄ¡²fµœ$E69.eWt,Q&<¢ùî¸$dzIt°ÑÇc;›EViìð†þà6v©ùÆy鲇ú¥QšÆ+_Ó4ëÿ @e9óâw×k÷ÿÞÞÿßÈÇÕÿ˘_Æ,Xá1—ÞQšs;ñ“˜zQþ̃¡=+uÞ&Ãh0*Åëb+à YøFÇ™aš`¢|Ó wÞ¸§ô&â39äç£I1=ÌúlâÊZ{uÇ x¼“I¨üd–bŽ!…ÒîÛ¦Zǯ$íh¥×΢­Q½¦T[Ï)bšM@_Vü§ÿxU[–Õ³~¥˜´WåÝÄ2Rce7ß p«:™Q ÞH&î$‘’²²ì|I§o›¨iÅ'^Nxh¡ICÕjh+ÚÒ*±}Ê"‘¡•rc;ZÁZo}Ó¦¶ŒëOƃŒs¹äçN»’Ñ%ÅƤQæ=—ÈþM™Ä˜²úIÎØ¾1®¬ûßðGIçáp/²]ßtšˆŠ]¥NÂDÑæÐNÕlnÕXfZK ÙÍdÁCɆ~OÍôè;dU”z„™TéóU•[EסC‚ñ“¾šEˆšå'z êÚ,T[À?} þQGf¥ï€ðûÐSÃDf¥gQ€¥\Ðsº0“ØJ²æa–‘œ[Ûà,⪋6®™†êÙ¸ò*¢[Õzm§£Xˬ ”@CËÂcº‚-h…êeÊ hmöñà%^»’îµçÀK™éä”U:Ý(~¶=è¶ø< ~:GúEï¦ÑØ(üè`e¢G#+¬±8ff’žÞºŽÚj͸ºÌ» v/mµV’(«škbºhcÛnT;fWS×xгÝÞý&<Û"u©…ESIiûŽuô’‹I}óÇç1Ö+¢šR]§¹ñä<%ªBÄ8óºJDFIôˆrç4aî8í¢rÍ1RˆF=™tx<âa–SrçĬ]·pmÕ³ Þ§§kÁ¨]¨ŽisŒ CŠë9ªkÛZ'?CÅ@*jQ‹ÙŦ=!H?X~üÊ=•Ü!¢O¶nâìkÇúN¯ä$((þÁhÊv€!^)h!Î#ï¬rm""³t£Ix^¨‰ ÿ¯CÏ÷ýç=›)KCÅ€´yƒåV;ò[àÌß7º|Sú òžllàïÕŽ5Ñ,•ºêFÖ2`ý€y°/:ÏÇtÔœsà¼/„–òÜÐ)D¼ìB½Ÿ·>.Ey®–‡Ejxó²ÆOé¡ÐÅ2}P,ƒ±C•§\\ìBLŽÞkn"½#”\—Š!>¹ ј^Ÿ=¹Ìöy±{I¡æ]} 5;W`ÛŠÔ¦Ú®ž~þ7‹ž•ã¨Ò~BrüX[?áóç*¼ ûrb£¬?þ²Ó°IHÎÌf äÈ„cü±NÞ8g¦ÏŸüûK¼Ô¸õ3û´ŸæûßåE™ãÿýèÑãGµûßG·þ_7òqï¯D_í¦VÐa„öí«Å¥õ=çg’ÃòÌÊBªxãNÅÑ“ð¥sO­#"¯$ÈÏQÇo]¼)O#¹S_vÌù¬îX}µØâ TCßG'-âÂr—@å/ø¶Mp¦z .Š–ðÚQ¿®V¿«â3-¢Zo֪Ϲ¯´¼Ò.-gx@i°â?Ô×¹¶Ò,ÃÙéξNw<\Å·£[sÓ%´¸¤7‰¹ªe†9 ®ô¨¹—Ëó§°nñƃùÍët¡€ÅëË»èVe-Öm×H^5‡ëGµ´˜á¼^5»yw"hëçFéNÓŽ¸³€iuÃÕ~fÞéÏ[K:tÜNó=A,¬"£De«_Ô*š›i\¤îõp€SXUë·Ó A¸s ¥±c `Ý¥÷gµ¦ ,fmÁ \®_ÜËj]ëÆv+m•2Nðæ‘k¡àô†¬.éÎLófµÐ1/0&óLfL£EíæÑ¢ª0ß¶ÁàZ·‰˜­eVá`»;WÒÝqM›½-Þ3½MܺÐ2÷ ?ÏRÃm&³#[^õx~犧óP¸2–/?¯oãùoyá¿æÙÿ>xô¨vþ[Ò½=ÿÝÄÇ9ÿ]ñì÷>xÌûœÌhUPŽy18ˆ®bBVŒ z:Dßœôàä~Ø'u«¶‹3'¾öÌÀªµO’ã_Ú6L‡ aÝwú¡57bˆšì¾*.+j`Ž˜°Ëmd‘¥G‘‘h+êû®Ê×k§Àõġۘ?|¼“Ûx#^¼‘ëŠ-Ò¸.åbé}ƒÑFüÉôùGiæM—Š?rC\i‰ÑšÖÿgŽd 熆çªJšÆä ¤>l7²äó_d·!KnC–܆,¹XÈ’ù§‰†˜îÐAÇAV;ø]W¼“ë ѧ¦ÐmÔ•Û¨+Ñ¿bÔ• ®¸å,8nݬ·ñh-3ƒµ|f÷>ê¸ÿé.;üìûŸnçÁz§–ÿñámþÇùÐ1ž¬Ö>jº z¬o‚ü¸.ß™KæÙ˜ dÖªëœQ1ì;° SJæÊª«ò³àÞ¥¥Šܽ ¡ïÓóŽѽþ¶ë¾uB¾wÕ}SsÄwLw…B€éMwÑ+ª˜OÈõh: Pú‡—ÄÞdK8uȆÑ;J;=M`ÌQÄÐr pB‘°g1 äÛ6Km L¿÷üusdú^Ž„Çˆú5ªE'X¤ˆþ)÷hõ«1¨Ü•Ê]·rg~åæP÷¸ËŸ‘?Ð>ßžiO›>ÒßÞóùúiÜ2ﻳÞ/û^ ñEœÚÔrèvÊœaÕ o=­=ë6\Z-Ë(ðÊ*œ“O€{I€Ù–:{}%æÛŒl•¥oú£EœþCjŸõKj80«´CîàÉ9C·fD4èôËŒ|½²×@w¡ºNÝÙ x3²3c½Õo':®Þ4>êš«TM’/˜Ý¬ëa¤ûö…4h•ì^Xèu¨{¡uýuü5¡YïPS×/Ü¡™7ëmæêj]]«k=Nša­°yl¡;ö(&ÖÌõHPh5ܺÏáÐDE{j¸ªöéÚqÓ!Ï…¢èʃîLÝ{G3C%I­i~È • e^hYGqIJVŠ›9Vɺæq·¦©ï̽¥ÇéÒñ.é±ó¶µ8¼{zªÃ×ô,nÀ`Ÿ¢(Ð/h‹ ê­Y £wNØ`2´ÞÞqEú“S2±¡±Â= „Š Ôš)Ûšm"iS”™¼>ù·LÖ=ÆÔ±ÙxÓu÷%b|³Ù„ê‡ ´‹k¼ææè+ÿB…|Š9B¯:UrÎ’Ù±N ž‘9» ðEt{xBÔ}ã–j‡8yºÇƒ†×?c.pÅPu¦? ±ÅQ´„yÄ$ufQíhA‡4Eûy§@€?rÎäšÛÌ̳`×i¦iÖ]Òz*À„ˆc}N ‚æÙL9SëSdv²IäRLë…9r' gÎt1{Ï ÛžgQsOS½ZŒ¥LlFaH÷èÖÇZ-o‚?668®‰:žÍlæ€Ï¾/Ís#îÙ¸ÖÜ•-oðÖ}~X‚°£‰Ž ño­»ÊFg6(¿§'-©;‰¼¾-!(Þ žß=µC¿h´îxqïX]~ÇÖ‹{~[mU ;³€§—‡á+ò;¿+®ÇŸ¦Jó"HjúâàÙ,Æ‚"}|êÝ«<ÝÒSÑÓž¹— lئgavtbEõÃet¢£øÃg™º–EäK~kºëM­Þ„Ë̽²|̂㫂ž˜‹ãRBóÆWÚòÙ±¸§·wêÚj¿\WÊÔi«E&Q}ï·-’.¶6çÑÃß'L¶(e²¥’æR&S RÎ\Ö.Bµñi*›®C­RÝ&‹ÄèŸÉNÊ'¬Åmâ Å’Oéyj¯º-Û˜ªfQñyÚTý‘>žýW6®V{Ù8)ÎWaÿ¿û¯Çjö_OÖoóÝÈ'¦¬=Þ˜_&@í¦©U8}JªƒAZë/Ü_ýÉ NÑówLÑÝ—.w«tŠ{ÎÖ •+ãUEêgæºËI“`GÈQZù;‘€„P"³“¦¢èpß";8¬û®Û€)Å8•“auŠk£äµÅ”Clç5mr’áýÊ0R+Š:kª;ª`×YŸ/a«*éb• ‰CX¦ Ä(Û†8jk8¨ö.è^ôåÇä¶hO§I!ÞÂqMWí®E[݆`Nc‚Œ Œ "?ÊÆxw(Ø•HE²gI*‡ŒX½CÉá>­†n…¡ƒ0 ¹ë½…sX\¶6ê”…—ߦˆ;Zï««¬:ÆÁÛˆ¶ó´_“qÖ/£‡1MQ¸Ûíg鸟²ü0†>¥ìE»“c@x4­xü#hkP¤e¹ÍhwqX¾]°žÁw_GÞ~§_þèy‘UY"˜lÃÂÉr@$*‹ä?Ó~¹VN îZÒ_;>²&㈌œ6ÌÄÃD¶DîüÆùÓKpþÁ÷ç¼ Øt‘VmòÏQ(Hvçž'y‚I`”å˜úc½ÍRèìAšW@™†„ýv´ûjëMô×5¡<µátcÜ‘ßP{¯Ÿ<I_ NÀò@ÅvÁQÊÊÚ|‚×çpJO§Z<ÑÊ ZÓ¢4^ÐÆCMzœ·0?Ç. l¤êOÓ"D±+ö˜$@:¢CÔ‡1‚uÁô,‰Ä蹑Œ£·ÿ¾³‚vÓÃdÍnh Á2Œ¡½ã¡I« Ï,tA4š)ÃøßÓ—ü aÀJЗ¼¶j­Åd:À´Ó )È6#KWñ„ƒã¤2¤ÌA 9\¶,¡™Ž!ƒe<žu׺ÐTÉ‚hÒï'%eÊAî2) X,°È¡; !ˆÍ. ºjCö]d43sDèy ¾z¶„WÀkâ?È×£ƒtœR‹êeV£íÑøÃ_’q9N ?@Ë«qÅÓ@Ï¢w;ßî¿ÙzÆ Hn4ý>=_›ƒ}ÖC…5JÑt·)„Ë÷XNL6¥ÄØé¹{‡CX¦Èýù±ü’úúôß§?÷ﳃÉUèÇ(ŸVØDÞÂËoÀ ⌠Kéü}Éÿ{!fVT›Ñv$_‹$ÊŒáiØ!‚׎¬§€ãqJ!hœÇýq(LAÝ7¤Qç omêÕÝ;¶l¹ lò[m²56ƒ¸p²†>  úWº}˜Ñ“Øhª:”I0g®1yµOÚÛím:+c³›ðÁnž´aà6;mižæÐæöïº5Uµ@v±ÇAǃ¾Œÿ„vÜrA>¨\Í@Æ•7a¥A)äÈÕZ³¡«/+^;…µpJàøyºÿ:Š“vrÒ>k3Èž€ìpÕs©úQ/ ‹·q¯ ß*ç­öG3œº…}}ƒú&©ú‡> ;ƒaA ÎsB ý±†‚´-¸œC‰ ;(°G‚¦Â© Ñ$ú‚D˜6j¡étÚ>kÁ÷~»ï£«±™ƒ.PŒj‡)v*˜,„tQ/„o¼ὕèò+ÔTæeð«”Pê„Áï6.[?o„NX/ßZËNSï·÷¡ÌØ6÷¢}U˜û@ö¼jì§ Õ¥²ê­ê;Ñô®Æ—=q`PÐÂ¥ÍÑ%I”ÇA–œNAâtÖQM¤…û­¹Øã渙íIÏÏŠ±™S-—p°™äã蛈·!‹ûLÙâaÑÞ/Ö8Ó¤Öü3¿ù¯y‹zÝ·†Ìt¢i{˜e¤LÛ¡¶¬ù(=åÙ¥¦W^0,«sö§0U ©Zhî_4Œ PåÙ&Ê„¹'¾Ï)k'Q/;ÐÓ‚?ÊQ¢ÈÑqW NE^C‹Jn©Â)•½JˆO5\ötá«Oþ¨› üX/¨ŽLꩆßç\Bózš»=ÍÃ=ÍÝžæó{Š5¾!èNOwj=Ýiè©ßË‹ÊÇ_ã/;aaÀTríŠFaz²£œÆrœöoÒ ¥~³ké’øŒ„6·X}s³Z¤¹‹!«AÒ/ ž)n%Üj{+ë¶Ô1ÅZu€¡ XŸñ€e b. ~—ó®—‡ßr3ƾÐêQþ9Q”+üùÐ…Ú¹êFaÏW5)ð¯ÔFà$ÁãÎÌ#¡Ž)>kŸ˜ýùlÎþl_âq±Ý¾P}E í°—˜NºŒh­á³&ž´à2.<¯<‹Îxé8cÌ c‚…5ý6,a|„A•ãƒj0ü>ó"ÓØäªH‰ˆ¤rèëïa:`NÓ3LÀfîÿãY}µl‚+«M€‚¯d©ËÕœë¶} W|4‡(¬72T<j"=ˆX—›Ü¿RoÜ´¼å=¿­[S|_òůk}@Æ]³;`›ÂÝþt.ý«,Æ­Ez¢,g÷…ùÈë¬÷ݵ·_õ¦{§:¶H¿”÷¬ëVsÔ2V¥eï5¯b7c w^ZÄ+Ì_¸)YÖîFM»€¿|WdÝcm[4/ÿpóÁm_¸Ápû+Mˆ‡ÆJlmFjo5³L›\SŠA7Ç1"Û=“x™žÎع9¥Ûõ"¥{Ù"ë{Únðx ¿~̪Ã6™ÔeÚ¯è'Þôâ†6Bk|Bwñ)Uæû÷2µ|-ËiÚÏ’<ûˆ6$“BųI‹1î»÷½øDh.•“¦Š„Rkwíë.ö}óAt–ªY©µ¡4òÞzšØ•ˆâŸ~FQY(<2ªzI^g<ØuìbøvȾLdø‚ÔÇŠ*ç‡äG‡×õAuØe0\ΤÅû'9TGvå©iC))cqn>ê Ú©k¬˜Ó“‘4¯õV1EnšBw‚ÏHEÆvFŸGvñÛ×Rók>ÌÙ­˜eÙG={u0=Ä~cÎ%ïù¼ I*[ªì“ý@²NMfWs¶y¾´ÿì“Vøüçí]±[`_¡¤á¸€}`W. =V©8*šr…ñNF£ÆUcé‹ûMÎ~/aX½ó›•¤KÝ× UY”v§21®ôîH.ÕjüÔeœårw1|b§åå`µø’éû¤¨` ®c tÀÑ£ÉA&j-Èù¢9>` xÃ/fOx!ÚAÓP¤³‹`íŽã ã~—ÿ\“ÿO³ÿW™V7ãÿõ`ýIÝÿ«{›ÿõF>®ÿ—Œù?‹ÿ×Bî_—sþZšë×å¿–çöu§/ÇÕZBOüºûæ5H½‡‹yCL*R÷ù(3¼Æ®è36ÓcìrþbsœÐÔ§ÁeÌ*Qó[Äk¬î3¶D±åø‹-Ç[lI¾b3=Å–å'¶$/±«úˆ-ÃCìªþa x‡E2#P ,8êpàîtÕ2>ƒt˜ç•Å$™¤ûT¦8ŒŽa²‘ñ 8OÏèaf,­Q%ä<¸i#äy¢E!W ¹Œ’ê‹Ü?é”kYÄÍô EKë©ò%ëEË"ù® ¤¹±¹„Kéè×À¸-VÝ{¿BÅþy6»'-Ê[\8R¾v¾TˆÆyË|/Z\ÈR~`Eñ©â¦;ôS£Êï-o±±ÊgT¿Ä…[#÷Ë·£m·Jî7¨bµ:ªµ:vDD/D¤\¯Éù=ÓÞRÁ+ørI³!·€m]ÁðTÚé+B«cò|KÀÄï ƒN·“`3Zš F¨Á#ðF¼×•Ûáì¢J–ý£vQðfm×])\5o¬h·ÚåãÔUþaWòü¤Þ€Wów¼o.é x5O@iüÙe=/áx /@=½pqæÊ‰«æ Xs,L­‚k¼çxÎuþ«™Ê_ÄpÀ€§\È+pî¼QŸ°å¿í 8Ï pF—ç;.âØÔeÏ=pÆlÛefH¶˜nYëÚÛËùì’ hn\±†ì\Bl u5Sé6…Ei­·ñ²bo0ƒ&âw•BßòŠ ·.’S¡¢}ÖÒE´ñ4£Â].ü««³°ÐJñØAˆgí¨´¨g8< #MθÙC]$GÿtU$±ˆÖa‘P¹bvõ:¿“•e`îXKú¤Ëµ•ÇyWÕî:RL˜Õc¼áwµ_VfŒç¼ „îšY®VÖìbÍŽ© Øvtå¢CDñj*AÖëD ç• b^5L¥¯Pm"`‰ÉÐ!™5a´6"wu~Ó³Î&‡.Í“Ë.¾es¿cÍ;¸†Ž)œU „§ƒ¦ÕuÕ1]˜–ÕI»t¬°Î0ìHk!n¡ÝGÛ;7w]}2!‰?F4 zú ‘l—ZÛË·‘ªâå{¢½{m‰­Á©×F%èÌÛìÊ[wäeïܨpæ2tæñÙÇ ùGÕ xÑ2ùªn‚„‚èv—B¥/&ûif<0ÛàoÎËrÆŽU?n±¹áI ~ÒòÈÉÖôú›è0“Œe$¾¯ÙHZÌýŠ~Â/à8À³ýn¶°ï·÷í)}S¯·Û³X 5„UÝ–Œúé²?¨× ´ç¶f¦œùS/*ݹçO:S€Â“¡9E>@f~iÕC`„6PQˆš]ì³ÓQþÐ]ôÉN7cgíÕ$XÁšF“ 3оZÝ pz\œ~F{Q*beëâ:;$=ôœÅ Ú˜ÕåvUüä“ÍÕlô½8‚ë„^=u2k¶+˜Cþ~ånÅÎ+Ùx¤ql»¨£ toF_6,í1Æ)WÃXï±èfqh×Ö/"Hë7´zñåìÕ;kéæsWëav}«uöRòÈRů¼TOp©ÍY„õpF6R_Îã}`|…O=„}¼îrŒŽ kEˆ_u}êé„Cª•Áçíí"]½Ä,Aî=·›úL‰—Ì,ô þÒ;}YAÜzÓÉJ)ëv8ïqEµe>9•ëv…ó}ç—¼,PWÆŠ3]Èœ(M Hån o>Ê®ä¬×eG_wB¯gÍkv¬¶Èª5ð_ó„²k¡êC*Sê ^ÊÓ>¨ñҨႡkž(úÁgîªæÜ3n´™3}Cr6/ œª_c†˜Õäw?ÖØS“\82šÔÏèô]¶™€@fÕð›êç|BgXäîoPEݽµ=(”ØC™iNê1Và™¼H9Ó«á³SÃßiPˆÜ±õ!-»N­ßàè*w¼£Þ”²xͲê„~ˆ[˜f½0ÀFÑ6¥ÛfT%{\‰´:Œ7è4}5ÆhÕŠ"=yø Jxhêó¿ezyCo”4qµÒ†Bþ|®C¨Õ0i¤N˜F œ0Uóмl#nðªÙ]¹JGæµZC†åÜ2JhE{ÈÊÝãêcÙ›½ËQõvŸ7 ^õ×UíÆ&˜y´Ø@âñ7›UõË™fÕ¦˜8±Û®a'¯.ÕöŒ¦]ðûN¯ÿÙB}°}Àgã9pZ‹ìAO/ÏA¤Mñ<ü0Ÿ$ꆯ¼Z4X“*=[—¿ž’"²5è)•*ÚÒJ}S*¤Ù— úW'IqçV²Ÿ%¬ü¦E.£Ùd)kÝ÷þaÓ_¶çh‘ìüsžD&7)l¦²pz?¤uRò™c BxŽ"šóòB§¶fU”(âuC5 >î¬Ë†Ã´@ke}²0¤³_–Jàmx»¸r®AÞ]HÜ]@Ú ^BëÁlbp\\R~ ˜•8é÷ejÁ7+`Œ¼iÚ÷Y`¡(¦›7ùаh s+âÞßvâÞD:vË kšÓªå~*w±(‹„•Wù¹ Ïã’”õäçTeªDQ{°Q¨úTùÝ1¡2æA-{!ú|õêÇWCê;zuG=;ºÊ°w)+¡U†VX,¬ªrÀ•^«5cIQ:4ô'‹ ¶r]è«Ð06öÒ¥e o¢Ñ1úÜx2ÝØ d±xØ0}µ²&Rñ»Êí_ŽodÈG8‘ÜܘÏñ±Nžó*…—ñùÒi íUÉ–9ÔײU‚ ¶-NÁ~ë15ßÑ9rQìá°}ø^ªT¹‚•f´1á§|[}¢€0 eO çÍ+Ì„j€b7*rb4P'ˆ18YŸáòð”Ê>J6 C7æF²Æ¤Ú¥ í öú•àÍqu#™!ETAâ` *1)_ýS—þpW‡rŒdoóîý³|þŸ˜îq•ÒfÞˆÿg§ûäÉßÿóñã'·þŸ7ñÿOwÌ›ü?¿Ö~Ÿ°+¼>î£ÛÇ^Ú?OòÉ:JÅ-ïÂMÝ·Y YéÂmB.gÊuóyk?ì}÷ng#Šþ:9G;étz®°iÔƒ7ǘj:ú.Ëáýö¯Ñú“¯Ÿßd_É}ãµ…¡Y^¢çU?)iî*v}Õ#󾯮X‘\ARð€»¦žÕóÖC)õ’xצ^|èw#o`ZœÑ¦©‹höªSF)—ÅðöÕk¹†àVާ°ÞÒZi•ù¹@±ÂQp…ò¸gJÃi3hògG_F|ÅЊÉ)ÍÒW÷iŠŽ¯±K•o™Â€¢6î$ÌcÅœ9ÙR' QŒ‚VÓýÈäoìXaŒ³Ú’Z-Dù<Ç"Ý3óC´|¿‘Õ¼±Ñ$=ê€\m«ýL“±&qäÐXÎ>&±>lügIxÐ4¤=)èbá†sQ)â $š™$7@èˉ”O´¿¤Mf³xð3gæ_lrûK¤yª;—t3§jg˜Nê Â“ÄÉYcè›aÂÚ†œ+¥ÙðÂøe4ˆ# &i9^©øÐe“_e"°øbøŸÅ8°VÚÉ%¿ì~¢–ñU††J¢'®Y*%âü¡àô—Z7ÄÿíäËNQ¹ŒaØqBoê{s‰ÞÄÃãoÞ*c ’µLÜ ü3³X@ñ‰½êü² øªŸÆ”R]ðãzË+-Ît!ý”r½ãþQZi3&š,ön9Ûƒzêʤ¶ð±J¾å`_Z…$ã~¿¥§™NŒ:>&‹ Ó»ž½Ï9þÅ4w|©Uaànª éLÕÎÙÞÓ®j"â6QÀoûÆC`U´K g—ù°¹›[¤ÏO´ «"0F?ù²Qd5V¹)íª÷_pU§âœzN5Æ;'‚†E2'3vì?”ø'¸:H@3ÃkÜÈsâšxzþ,jËbU0–Á3V¬åcõÖ=Å^ð»Üp[*j</ñ\eÍìxΘpš¤ÊJéÐAv’ŠÚï@0¤YމÉA(gÝqÈ-¦,„u*×Ǻ&š¥˜Ûí©a0El³‰bk$ðý• BXö’á ¤ôvTËèÕr’9GvEN„À‘9« (êrN1ž\A¥ƒäø€C’ Í’DƒŸYA¤¡ ã²Dý)ÀmìRóóÒ)d‡ìÁZå÷’xjHÿ]&´$íÿ\ýÿãÇu_ÿÿàɃ[ýÿM|Dÿoy“öÿ±Žþ¸£ê‹}Ü1дZF“±s ÐŽN³þ!.ÒÖN T"’õÜ!¡p>hhŒ‡óy³õþšƒù\"ÏJBÂÂ&æŸÀ8¨3§jû*eÄýÓÏ–‚\‚àüôsÝ4ÇÒ-Ql«¢¬Œ1ÅEšF1Œ—:_g¤—ksgûÁšÔ¨wiŽÏcÊR# âÈ΋ϢødQ,PÜ˪’N} c”5¡”aüq“ÄÉÂÊÉí¤¡Y¹XñOÖO{DýœÛaœ=cFÍ  J;ÔÓsÊéô|…L*76 cf`[úñIŠ¥¨2ô³±ÝØ å?þ-´zÔ¤AsKš–- ª•vV¼bÎ×ç&ÛX0ª«ò k<ÑŽªTzÏ ª“©¦»£yòlX!gì<ÑŸDßl2 u:ç‚‘<m#“#ØuîÌëeé­fuÉÖ…z¤bëSJMš.|©Âõ¬Èùı¬ô^Û¨¸Z£EúJÊeëz1é¬ÏÎÜz4AšA”…éá*ËÔÈ£ ‡G\ÅÚ8ý+Ÿä6+Ú b…èà ÄÑ&ÕYÙÿôó ;dC;ØB‡ÙY;òÑYËZ"aE4ö9éÉ=hDŠ–N%å±¥a¬“);Ÿ;Q¢‹¼¦Ùœ§r³n"ÆDâþ$jÆÜ…Ò2År·œ±PÓjhÂÒåцÈÚÛ ÿ©+‘7Ó]°A7Ó ª9Ó]¾HŽ·Ür Y01¡ž¹ ÞbÊë¶ŒÞÏwá[àë°÷ƒƒ@¯L‘AºEŠFŠK¡H¤Hq)ŠÔ  P~X[M–ÛfîAÈ ø¡ã¿meeÌ=¥æŠw%c˜ZSRFQx»|ÌÜýœÏa]j]éô–+õ›'û%bl÷a6Ã1þ”ê–¯/?ÕýoÓýÿò²?νÿ__XËÿøp½s{ÿûþNöÇkºÿÇŒ¤…çûÿ¥Üýßh"Ÿ‹Üý¹©¿XLwºr5íÒS‡ j?iJÿ£ßqD*1ßÀ÷Ó™õŠb^ä3oµñ•}zæÆûkÞl°HýÖˆ°}s­Š\Ë•õÜhô&r`=î’%Êçü®ëIùyG݆äïÕ"Îg\~È^eÓë ;KbSÛW£x…L ‹p禌`ÂÅæËôBŠš2ċسÁ~ú¹‘`µW—#Ø2hµT29ñw®J¤›œU7I$,RØPé¹oÒ³•À àŒãîè ”A’B£°o€…ƒ,mÕÄŠwDí«c!òUò¦5—¼Tá)ç÷ÓGÌÂKGÀ<£‡-çGäƒï_âYì§Â:“ùíÏÆ¼I½ˆÉÐÉĬ³f1pØ\N ïg¥D½¯Ï)ãOª”Äš T£M±À€2hž Û€žPîÂ^Ò§$˜jäî› Y=˜Z¯R b3´´„Ã>k=JG)ãŒ!#J°Ç'T _¾¾áF­4T”·\v½%˜i œ•†ø^J]Þ4£Ñ2£Ù*cåêfnÌ×™r‡oÕ¥¥†‹ Ê'Žóê÷VÄŤ‹Ëšk:4ƒ›ÃÐ6Ë`d55â3ÉÊæï(áY6nCË"BUÞ·©kVƒÖ7=¾‘ˆêŸSÀXŠÔ^×ÌEj%Î:ÜŸ³îv"‘gþ¡€xöí:‚Á—,{!±RD1ç犫³)+îU‚c¬*G´?òö%¨ŽÂ:kl÷C«©ä¯€ ì÷‹L{j„»¿Ï[êõɳ V™:¦‚W1Á C4W–•h”C e 0Øi7Œ´*W‘6$Â8Beuœ­›s^¹ŠLóŠ•eŽêL¿4ÁÖä½~`}ÊKÞó/ 8¹½h›ÏK1uû¹‘O@ÿR]/ini>@³õž*'ÇùÀq…m Ÿœ’µÙ`¡a2®Ê Á†76-Ï7¢4é"\JšÎÑ–"n€±n<ŠžÓS Ç€ö ©:MЀE…‹*&p¬ÁƒÜXô†*]{Þ'ñŒÜ´ÍöÍ­aÁ2ŠéúÌÏ)™mËÌ”zÐWhÐ<ÈTŠwŠTùir®À¨¡¡N  è{K8S€)×&c˜0‡YŽA§`úöR¡ß‘û:!zæi2 ©˜{BbQ³v/ÓAÜú°*Q‚Ø1î9½B®$4ÅP£~·<ÙŠl¬¼Ž•ƒ\gG¢ÎÅb ‚îÅ;Pžásj²îÉ…EǯØé/K5 KéÄïQë„aø—’ÝÑ|’B7«B›RâËÎÓ‘õùªÇœQ‹éÌäv4¶ ¸ÁÚÄæì(úž[ö1,ñ'JÛħÖúíè#TÿØŽ0ÆØ½ÃéõÂG‚@5, ˆE_=·`¥íè`‚x«`Qz¹?o§mxÚ¶t£øtІœ·{µDoQ„†ø} ?åN¿ 5?¶-«Û•ºu¾2ö‘.mÖº¤ ©È!Ķ` C" .CéAÚÒñép6W"‚š>û bŸ¸µÃU]â93Êž‚B´že^Ådê}Ò —0Uk´òQ[Î34q輤)æBw&ÛR§˜t»ï®3½úT·Wêv}R(ˆyó¤b69¢ «ŒF¶6ùë‘ÃÖí–•ëèYÝw4BçÑ3Û{ôÊ8ä/ [Ñ„]Fe×ÁÐýG¾öŽÁ+õÔRü8ÞÃju–ËâÑ´cáÏFÙFõS‚ô\] =«\EÉÒœJê´ã]:³Ïd¦éïBªŸŽ-§ÏXØÇp!Åe(q—Óä èXÛsõòDëBä¡*³©c†J;t¡'•¯I»ÒF¹ø¥†CÉ–ù>fÓ)ªO7£½wï1ÕÑëí—®Yù×la>`."yªJˆ†•I9ÅÚ2\ht¡:ŒÚ»÷ø…N5œô1Wì\mzÀaÑn C™˜Øm`kl9€¨;õb©·$×^ï¿д˜L“ƒ¤JÍqlúYÁ,V‡¬èx\e g”—žNÐ ‘î <ÞáݤC+×ïÔéáñà¯ð0hoe»éM&pð:P¡çqÓ/èL_VxRJ4Hu8£!jk¡¥ˆÏ²Ès´ÓJSOJÐ@<×DQª¬2ô à%-n>×|ÝhCØÑ ²‚©€ jÛZ6ó:µð¹k¶TBëA­ð¾+< ,Øø‚x.ªŽçCÁ3¦¯ÍÓØž¢JPmYÍ<÷šiqÝiÂ38žÝF„2ë B¢w¸4VW/Ãc«Ú±i*§§†TuÊ«‡¿hô%eé¯Uü®$¬Ã¹9D+þ•h§ W?1f!´1Z”'r嚣6©)v´OØUð×[Sc¸À²;Q󳺦AHœAè]Ë ×9Im–׉€ÙªuæÃHRŽê3SRܲÇœ½$yÍ£7+pchŒŸ ¥\¤àÔf1¯ù†EÉoöHxùí©Kæ’t\§I~¤BmÐ ÿô½jŽÒtÊÞ¨e…=`÷»¥Äë lE'Y ܦfêä¼–Èü_¯J{ÝÓ)¯Y¸nÈ{ÝœõZU³S_{ìÔK~xɯéN¯JŠŠhIEFÜ2‚&ë1";j;n !iûC ŘZ¦¬Oª¹Q±>ƒ<Û2‚zÓ©¶å…ôB§Øä!ñn|îX—1NKÙ b…Y‘´x€k²î4_)Ø—)ß8HßYÖ2Ýe]h1ì»ú.ÉÅ Y™>h„Èß|SDŒd3)*Zvý6"¾M?ÙJ ~™RÂ+ÊôÃ1zwÀ–®-FÇ^¤wí¬±ÍIk-B-vªM–Û¥®7²ƒL¼ÆT3dÜ@žIq€9dJsþO2EHk@?fQ…£~-2Ú«ÄVbÚ’à¿·wÞé¥Â¤c ài€©ªa0{?¾k.> &z¨,cJmypœ#¨RÔH¤¾¡24“¬“a0ÀGĬrO¦ÄA×/ÎØc,õŸª]TUÁœµÈ:à.Ý…]ä%’0&<Á-镚“«Z¥“£ðü_=0 pËV5„dêÑáË›Êâ£pמÔQçÚÜ7ðä‘ìI c‡ùxÐì­r|´•ç‘—ƒ™jÇeµ–^Þhò1±ñè5+¸óüºÓ²É¦Ï£3Ë€$½ÃU岡›Ñ÷5ÔÔ¶Òok9ƾIÁþžœí¡‘—)âÈ!qLÛæq^ñi$ÀãÚѺ3F| õå¿UÒ¢±fÑÛ“Ó¤…ÞÝpÁІäUT¸”¼]Â!xüe§­Ö›ˤ¸¾áqå±?pErw{9vçºøŸ±@áÓùâ²…34®„AòÊ3"¿Û’*ˆMX ¨`'Tp‡»÷  E…YÓ"$Il6A+BÐd XÊq ³ðaI­¾ô̪3C@¡…MÐüØñvZÜÌ´`¹tá¹Áàoz~,Èì>‹ŽÁ‰«‹\vò.}Y5Œà&V}žB—æ+mŠÐrÛ¯/×yHƒ­ÛS9q ÿõÆË)»‹.õ›2ËVE“ —¸ÌßÀ¾°Èøqì9âyVœºs§ƒ´š1_4V>x,É×v@½ðfµŒéèÍÇ‹b1{v )¢!¢Ý±¢.JèÀì›)00ôêX$f`m c:LóÂ{%óÙœäòvÍÜ®™Ï`ÍèÒŸë² \Ûa3Ý@"Ó)ߢªlç¿ñ£ÚÑ^%OÑú)—ó¬œk>Thä/jÉÖ˜ ™ì*‘&áh“a¶¨qºp°R;qe“ ^Æ«mV‚1e¹`àªÔ©hÙÞ8ϱ6Þ€9LÁ˜ÝÄ„¤NŽCŒ‘ªô:KÔåí&ìLÑ5„HSjëm_ްÑ5ϰ“Žþ,³üAe^NdãÏÁ 0¨C=·¯µºLÙ¿¸j\!NÓZPV¡‚“õÌßó”œÁ››R"I:8„0/«2Ya{¤Û³BÇ.‚£¶ó¹D9®ÆÓÏ6ŒÆ¬øËŠ;'þCçÁú?þCwý6þÃ|üøsbÀÞÆ¸ÿ€ŸÛøXÑ0ß"½° Æš³‚B¸ïŠ ¡l2°ûÁhˆIb,:šâ@@©ËÇÀÊq Τ€‹þ@Ñ#±ŒúÁQ—öá!¼p¨\±MΛƒ=ÔýîÑí^›j-èu?+ÄÇwбìÀ .Ñý)\ÜëñĉéqfÅpà :xÃâ‘ë¥þzȆÃ5 ‚ÌšÎa~á@ ×-‡Õ…Ĩn!²¸7¸x‚[^às<ÀD.çùíÑs†Ç÷â<½kÍx­„=¼Åö‚žÝžW÷%<ºµ ”64¿û¶åº­\­/ä²]Ÿ[!TòÏö}³uÏóÉn‡Å|±uý…|°ç·Öä{m·ã5s ŸkÇYúb¾Ö^Õ…}¬çûWÿëúV__õ‚>ÕK÷§ûR[ç +u£µU1HKsˆit ÖÓÊ–{s´åBíHÀaÿèqÞÙSº$}k+¢Š« ¢Ñ¸BŒ1?¾˜^¬9ºØ¢µ®à§Ld¾&?åe:)Ë0Üœï2{D~®³ª¿æ­ÊƒZZ jÏ®ªgÊUµüÔ®ªŸÆOõªNªsÒG ~_§ƒã¬%$ ˆL…­²Ô÷®~uÏTø¤æ˜jREÔÞnd"¦ë´‰‘Ÿ7‘LYtòDu³"‡.5¸…¶N¢È=µS&Úø+ÛƒZO¢huHžÓÜ Ÿ=j.Ø!ÁJ'Ú†t?W«¾ ìš5÷ó;;ç¶)§…ìÊÖ÷Âb #٩·]ogºÝºò¤ ¨î4Ùä\»Òä];Ïí¡n_«àÕå•°É­·P‚&·Öœy↦¾›yÁ°,×̫ͅ‹:dº ÁsæXž×e}>X°¯iJàæg%x¶sÂZiŸÿL1¾" Üoâ~7ÎÔ¸3WfiLƒç™!Ú"nfõ)Êõ—6;/ïÙu1·.W_¹¸ŒÁбEAýÙPâp:¦õ\Ô·­_Ä¥×ä'p)Ò×KòxùîD×îä²à6éN¥mG¡€\¥«~°V§ñålÊÏiÄŒbz\šXt˜:ÁqBæèÁ«šÛxN·UÒ9ݲG8<Ô|†éøƒ­ö@„é¾é¶êA’Úeœ‘¯P±R»X£§u–F¥c2«_ô®×Àß*Qòa™zü<ÎÍÀÌNé<1¥—ÌÔÏ+ F‰€fàfGInÀ÷|Æð®ë=“UP5i~Î"‡œ´›—“QJj"¨£¾ÏV7.ÐÁÏÚ½ê³ÿÔý¿Òü*GZ-³ƒ«»€ÍöÿZïåÛ®9°qOXÛN[ÑªŠŽ«.Gúý´,)3åT~›ÛõI;¢T†&¸ÌȪ·Ä…ko¹Y¼ ë÷Qü@5<–,²ˆì* ryÑk­ÙrÕpÏк×"ø(g£ãÐHÎè{M‹´8Î}zŠƒ\¤޳"µ‚*Rëã=ªÈù/B"L?Æ¿¶èM–ðTvãWÙ0tÀ=ãS/¹ÏêÓÄÿa½­ÇKqÿÃÿ»€§øüýñ“[þÅÿõXc~#¼k\wfÝ)mݹ„3wenR™u´•£%»£jš"bЛÞ«©\²?åGi2æ;i]”.™ïÃn3.S†§kkmTÓMLÿ0ÁýðéçIY¦eKv!âÕê•4³›V/AXý¸·-µìGèÙì ú-°·oëNœß®¶ÆÏÕ¶ [^B/ä›åÈ3BÓÊDY%“€ý­òåç$fÝÑœƒT7ê@:V:løâ¹aöb†á>`Š#‰fžpDOÆ«Éà—¤Ïv”2DµpǃT÷–®CN ?ý¬ŸÂÀ ’W^yhkhCÇi7hývBG§EGý9S§ ª’øêÌy¥è NüPCé?bû~tïÓàÔ Ý•:·K5y>ÖŸÏ2?jš´ó§­=qck>åÊ9ÁmÖ¶7ÓØuœ¤y]÷Ôs=i˜æÖOês|æOæMðäb<ù\&x²ÈWS˜/Ïü^]h*ÙÓ o…Æ»ÑK–NSx‰6ÞŒM¢”ŵÞÓæz à™ú¦(”è™ÌXM&§œî„j˜ÓÊŸ~¡i¥]ÔÝQ¢&d„ÄÚf±i[“Ųo´€*ÛÆAíæ5•%â+þ´Ãþ,7ú´ êÑ++¦]ÔL;'Úr±­Y{ÁÖj€¾†9JMdnm]¤*eJ¥†Ã†ö6yh<4Þ×½AtѸg­HOb¿,6æ\wÛ¥ÉüìlRË@‰Å,õž;B“tþç–ÇEÕ~žÉH–@QÞ!å”w½Ñb§ ",¿ê*Êó¬È3"ï¸oÈÖ­×ÁÁÅ;f4gëuñW7¸bÈ(nÞ’éuˆÃÞ,æk„ Íð6Ä*fT:—Í Ê¸®­â]·¸Ã—t1kõ…HbwÏYÒ¡Ãç€ø¬ýiêÍݬ-Æ+ØMµ:¬Îr‰PgUá@—»µ.7ˆOaïÃÄ‹¾‰’jóàüÛa3Bª=øoÞNmf3Zƒvê³y’2Ý~_lçìØDH\ýyèzÐ2ði`/¤Óóæ]–Y/?—s¤>!MÐv—\ øŠƒŸ[a¨²–›ÏQµÍÕ1]ÒÛxî1 è¶€,eÒr"¿Ø×b¤÷âº`Ò´zîã¬ã ÷ ÍBšfî1ZsYƒf3†—%óÇCoC´nµÃY !šµÊ^RÔ- žteö/ŽH5x l.Ð@3çð¡ý;qüæÃìZ0„©A±®šÉt–¾oØ[¢ÃÜOj”ri$€)éö}{Œa˜áU¢æô7f¦û«$Ä)C| l† æÙ=š½Fœ®ø‹ä¢Ã\$N þ*™1ö «DÓ Äƒv}ëcζ†M†¶5´o{õ_o¶7PÉš'ýÔ‹I¾E¨)/pÓóÔé Ö§dVØuìaé™u”B‡.j?¨….’jR”N&4zWÒ¤}xé Ëv%¿)¯^}8Ó á†þÖ©”Ÿê¸¡-JÔùŸ“¤¡«aÒàýN™v]¯y'‘Š:Î9“zi¶HÂ8÷ ]ô,ã €wTà~2"û„äšÁç~UórzòâàcŠ¿Öda™ÏF6nŒg19nÅGk–£Nn's¨%‚˜±›{!îòg~u§yñ[gHù¬lØÑëÉ˽™C_¬îG¤Ýýç’XZª¡èY’ZÆVîc-´þ„SDE©‡>hz¡ÒÕþ` ©¿zFAEF±Ó¤Äh–|¡£-a#‘izænä-nƒtŸ¼dm—¿;´¦Œn×¼OÐ…È*Å‹˜¢k"iñŠ‹VpÆaüšL!ï(ã2,È|—} †öí ¾äf¬ÛGÅ(ø`AT®8'–|j¿6èÞ5QË~2VlÆ.d÷S4DŠC¡õä²^Àøh± šÝÊìŽYìéÇÅkøXÜo1 0À»Ê>½©\lO_uƹ+† ýg—«æô'ÆŠèm”癣´â]YÌ´ Î<+Úö Ë´rÖÄ3‘‚ LSa†ùfž¯Ì[×–"Ó㜞=&›ËC©EKÛŽ5ˆ(˜‹«í:FVÌZ¼yèêvmŒƒ1sH4xe‹ÊÀ‘ ìÛGg vÜp¬í­Ž& ïVAÚy¸¨Ç»©¼Ú˜èW­¸D5= ›‡i¸Èlw'ºZöÙ]YœÃœó™0ãCrwÞצ¼7›˜6ö\³©žçM5ôÊ]u¼ ŒÑ¬·e½8R„•–(§”æWÑO\è„i2×O¼Ôõl‰üN¥®×?æý+Ö“é¯ÖàpÄ û•Öáèø– õër"¨ë¹ì° j.;]¨TN4Ôø /Ð~þ‹ƒgå y-ìŸ/ໆ´yÑ~hìÇQªzg±{§®kz×íí5½N3§å]Clêtø@(Åîj±„…”]NôáF¥E”^¶~BheÈ ¬æC«O¨[‹ÈéÏ,ûÏ¥ÿÿ?síÿvëöŸÝ‡·öŸ7ò±íÿ­1¿!ã ü¬­ùí kHª®É'0­Û‚"Թ栧mêÉ ®gÍJô‚VŸ’}ƒŽ¦`m™gòÅŠ *š¶ÄÊBùÎèñŒ=WØ 0ê™¶§Ü° '’êИ¶«‚6KÜà.­>³@°W® ç‘gµ†î¥í€ žmDVÇ-€ÊOaÛô@;'˜·?8}±½Ä]€msø­iÃrq°\ýà6cj’ÞéÖ 2bµb7X®nFÏË2\6 ø–²*¾“?L¢Þñ bQ¿óö\ ›(=Ò¦5+$’”B¢±xp»þoâcÖÿe×¾IŒù§žlm&`ù9:Œ±{éYõêÝÚ Ö` yÜ‚ÜÞN“)­ú%#+WĪDj¤•æ eÔKá Ÿªw¥y'U X— áëa‹묔 ðíb»›±‚]ÁÁ¥ÀB€óÊø o×}ÌõÃ4ŠYÕ,åv©|éç“2}5ŽÛtLL185¢’iE‡pøÇ“߫乩¸õT\¤R7Ö–yÏ¿RíöÁa·1âãÓè TÂ3’+”m¢à ‹‘ç²2$ªI“É#bÄ»Dã5›H`Žê—ÁIjm\‹ÌRAÄ¢ ¨¤r4hÓH=c{cƒ4Œúä‹¡Ñ0Ækkkø‡l@[ð£Õ‚¾ ò;¥¥ ®`×_Wµ³±Î¿pŸYj=O[Åšï Œo¢uU eP/Òiš(õš¯lÂ_*Yèë¦ñC‰éŽ”ž)kŸ°‰Wöe§=¤ŸÐ5¬¯·¹·Üp8ˆÉ3ýo+ˆ&ÖW¡iÛe5™BS03êG÷°h>™Lï¹ÏµyzÉà°/»÷R[ý²¾Kghì\Pœ¥Ö$„IŠƒcÒõO†€ä³ñ£ämã>üZw+G‘J`ªüSÙçúD ›0mÈÊ“"õJm€¯Zߤ×c לaRû¯¬‹›Ù€ÃüÿFÏÿÝO:þùÿQ§sËÿoâcøç ð~£*Ð,ÞÙ,]¥xæ…Û£ò€9]åà"˜_G“ÁqžnÞx÷Ú•i“ÊoÂÿ¿[s¡MäźìrÈF‘ÃF'ÖKŠÐA/ÇüÄãUàÀÑIË*(n'ú§Þ/"ç¹Ø‹©>ÞËTîõ'Ç\á^Ë«Áfß„ÀdîhI5›‰"Ýñúî2£ßªkÃh h¯D$OLËñ˜ö,¸„N3r‹öy}±7lT|Üs{}.>@*Õl™ŒL6Ïñqc#À1Bð#ì&ùùG69´‚6~Ï `ÀÆïÄk?ûª²š¥cós:)ÍÑtÀöDñV5­4¢X¸%ÿKç&S+èžlêQîã@8ÁIÖ3àU­ à$M8-„QB&¸Ùyr Þ`§¼Ç{½\^ì%½<½ëaï¾ÿq­Ž?G,ïjkD…çaRFBS¶$éY?åŽ2.¦o§ˆÀFÅ»5·ÏàXµÏFG„-;ãäéø¶ÀG F[µ£ƒyË´`sDe£ñ°e*H3öˆç¾«xx›„Œü ®8àJñ$}•‰·xN©7ž/.U³úQÓu+$ô´ÿÛî9äl‰+ÆSš©…ŒŠaÊÀ”ÇòÊåóúPd þË1ÇâÇo±´dâC)ç4@•LŒ`4FsbDQ8ÿèv{¾¡·ÿc’ÓÕi‘ÁÑ®:ÿ°$1`Þýÿ㮿ÿCéÛøÿ7òA·ÎИ79tµxÌëc ã»—öÇ“|r¥å¬ØÎªèÃqz ›¶Î⛧ɰBèÃ4™"gLÉ”ÿ=ì@ùyôR¢âÿú6©’hWíN%j%^ q¼;JÊä(óƒ3¿†®½—Vÿ†»ý{ØLÞï¼z·ójï¸É¾y÷öݾzð·‹6Ç¿FÎéô\Ç)¦žÀË¿Y w±¼5 T‚¿ÐòÍû½ oüÖ*)6¸TDÕ3ÖšdÊŽ°áàËõ­ `m\ÿVÆËÌ·ßÆrØ£¢ºF­þ–õ`XЋd|$(ojèoü8†† ʾ¶/ùۢŠ8}ôý$(€ƒ„ó@?uª™àé¾qÐV:#"4z}1þ:¨+îÔûD¿ïQCÓbZ¤ÔƒøPõZ=ÔX[„4‡;(«B›œqî°ÓÁ0ða×¼9ÇŸø¦ËYûbÄ–¶²÷Ú¯ïýšžîÈúuÎ; ŒÉ«&5F€PÛ1N¥ûVq…‡]\°Ââ!™•¸Íý ÓoR/þFº ˜7?¨œÂ!]þ†ô`¢·T¼EWUZ°(ÊÝ!iqXÿ©Ñj½hÙ­éhr’ÖÚãën’󶬿¦|Së‹¶L/ Í…Õ’Aaªu¾Äßu ­ŽG¯8 áëfDîuoÑhä å?þéìçÆ•_+œû‘‹3q­Û‘rô5;¹Üy»Û%ù¹J:é3¯ ŒEsò#?ü™Wëk±ò«CòX—‡¹Ô;¬•ÛØ=ìÀ›®ñÓ—ÇE`d)rŸ¶_‰á„­~æ”MšPö߸œj­¤5É÷¦÷_þËz«¸-/Õ`ÞýçQ××ÿÄÿkc~S6À¯_íîí¿|·ófk¯n<áUë¯Ê‘!«ŒH*'ú†Ù˜¢„¸ 8à‹ÐŒG¬\)ö†õƯšU†2aþÁ¦Äm 2M¨ç¨¬žÒ#ØGFÐzÅàïë:„–st ä%Lm|­R¾B¹‚vB‚.ëZï©$ÿû¿?q¨¶µµµvÔÿye%:@?}®Fwïæÿ—Hø?Ôf[ú¢Ÿüî™ßÇ}×ÇwÔ‹µ•Ž«ÇQØSìUls×[ÍfäJù$G°g@sôeÊÖÒ5ŽÜ»y™' ²y¯{â°yïç{-÷(CñJ—2SRŒa~ÚäÁË]{q‚A ý‡öÒ+Iø¥žVóPÇ› ØS0=›¦}Gw.:“°yú¹ÓŽL)ì‰dÍ7=)/A€Ò%É!4º¸”7ê ÌÃá[9ÅpMYÁžhmõ_©„XSô!c ‡‰ òÔŸ³¼<WÉY[.ðæ˜2J"VHm•OùHi8Æ­×Õ?Íûÿùÿ<|RËÿþèA÷6þÃ|Üýÿ&mÀñšá%Ÿl6ê‚€}¼òvEKÚ Ð6d‚³¬9Šœ!¼ÿÓÆ)›fÿîǸ'ÚÓ‘ BeuØbyO·Frtd¸ØÄ™@þÙ+N‡/7¼}¬c81f¼£êvš;÷ä6¤«ê.Ûhßp•s™ŸDîg®Ü±˜ÉEK¤¥ºæºo]Ò9² ¦7Фl’Cˆ›Ãßýyz™=Ûš£—Ý´Ävmp‰mÛÑa0”]@ƒ(Œ»9ëIH­AY&e¦lBŒ)`Ö¼ÙLY`:ãóßq]õÉýÚµr+²é»xÁ¬%+y„t)ñŠ5ÔŠzGµa&ß»GÞÖci¤6¼m+è¥åýU(õ¬'S;„›}LÑÊîßñ¾/ÒavF1í©¶ø‡“Њ6!x'Ü2 O¨òŸƒënß•$žd—÷lK¥\åÇ=²5¤õgeÇa›}ÁŠ| •+»Ó&§pá%ª,ûÔ³zhf¡ÞŠ–Xw€ "¬»”tÂBǺû-›ð 9ƒGL÷àmD+መáì»ÄàrB¶,Ês˜xæñK:7ð Í/õTÇ~+3\Ì4†Ø=«?&N¶žÎ°›á=³‡×nìL"Çß©O9p(Ò,bÕÃÀ¨xhVêÞ›à9È̈Y­0¢1²Â,41„~ê¸)Ù½l¤‰?2wØ6[‹¯š`än§Ì¢eÖîFXx‡&#jùg¦ü?J¦Ku™-ÿwž¬?öõº[ÿù(ùߌy“üÿXËÿÚýcA±?l :Dv›F#´øÄ'Ôù(=/Ñ5$ë¢ï‰2“…)–À¸Ê·ø„Bo’)yvÀ¹âÝηûßo£©ç3úþfë½ æ›ß§çkÐð>4Š. æ»gjN-ßsIË ¿7õï“k½ ÂkÛsR¾ÎšÝ áó½ÜÄ,6‘Œ(чˆÀj÷Pü¢†[ÎjšmªQ~£ `|œ¶66ö•¡?Y `1 caŒ²&”2À °²Œc#~¯Ü,~²~Ú£ æ°9ÅíãæP'Àú¢}(¾_!?9ñ‚óL†,f¶'SÑjŽ:s½ë Êä?qKš–M©ªK²™é!9Ș,+H{ÌöÑŽ,W•¶8zêM˜Â8Ìâ1C‡ =)VJ‰Øn|6þ–Ÿ õÃtwòu y6¬´å`xq:Û)3BìýöBßÅÈÇyIíéð5–hB"µè8…«f0IËñJÅÑyÝ5ú,²i`T±ä4‹(´öÏ®‘,tA­®Æ£LPÐu{m”e0G 0ÖZË¢V|Ÿ~K#Ý[4{ó OçãôT3]b…bý¬Nô;ATÉ[}‚ à‡îVæÓ 6™tæ’yJç½vä³È³Ö5^§âÚšNŠ‘¢¥rÕF%V,Ó”?L¢ÜòKoãcJ*àg À³®-ÄóH’p‰ßbîB4ºµL09§wÈ ’žZ M`E±BÏù> èœ_XøO]±»pŠgl î*Ê`°fÀ鸙Ãòmú£éÌV7_جtaÍÙ³š’gé—ñY§ëlNg]øå'³ç?kJ3ƈÇçÒc¬–bl¢2…MH-V+<ëT<šº“M«‘ö§‡Š8A›ª¤Tá\2gøU©~V§Öõ1¯@q¼mûZO§y†WZÕ8ñö¦TÏ1;¡QD¢;6 Ð›À$–6}.CxýˆjAXF£ŽžL jt™eÍÛ5@i•MÒ½€—À¨ë•~ã+ß `Ô €µ*tꈧÅG8x¾µ}~Ú¥iEóNi…`pýéQõ#=ÿ«S.î…i$WóFÏ?«h¡ŠÕ´Ö w<Žgõšk)|ó9š«"bÈéÇ6»Üë\®pã¼ ÏÑÉSY³ Í.ÌzŠd|ú,E7;ƒ­ôšgÞMŽø5-⦑µæ5ûnV×âËÛ¡sÓÿƒú êz‰íú ~®3zÈoù _ð Ô™M|¿ér½Â®çÈ\Œ[ÑÕ.0 ‹í.6Á¬òszlÎ^ƒ6¥}PõÞ` Õv#×…Õµ)¥EZ¼Bw$YuõàMxM\jñ<¸$0óë2=w?K.q;y?§É« |ó—åósÇÒ‚ãÁa-Ÿ”dƒRÈ>tœvÒ”dYdršë•!ùÍᕠؾûZýŒZ"þªT/ŠÏÑ )|8Qïëæç(3±,æ!ÊBàù3«†¦IVh%ñE(€’ ^úDO¸ÙÊq¥‚ZO1„• eq R_÷TS}’«¬Fês?Qü÷L$DšÑðm¤0Û[¦S¾³§Œ• žµ0mGI¿,ƒbž«Ç-•:Þo¯ÃÞB½2Eéb))R,…"E"Å¥(¢4ä”—SÕk ü°¶š¨”ZP.„, ‚Þµ§ôû¤@ƒ.µ>l¥èŠwÙd˜š~ê15­p·ù˜¹Õ:ŸÃºÔºœƒÚŽýš0¶û0›á(c¹ÚÅê­3ï?Ñ'hÿ{"^º/ÉdŽý÷£N=þ×z÷6ÿ÷|ÄþCö5![܉ŠÉ1ü… ‹õ=ITŽ&¨)Fi&ë'Uv’Šl†5(Èh‚'1@M;zóšÀîÇIq„Þ“ƒ"0°èëï“ã¼D»ìéAôõ׫õõùùl`Ý€Å}÷ÝÎ0É»õXäˆEO¦Ñ3>¿¨ œ:5ÛO?ª6õEèsŠs^Z﵌Ÿ•m¾É8kx¿±EÎ76ŠS?Ù0:´ÎÙ Š9µ  ™qžéç TW’cè°~ÊA?¢ƒY/)Û!» ÿ—í£쎢ÑduP‡q4ujÅ W <ãœwÚ9i-KÀ(d'Q·ÕˆÙ̸·„–÷=ø]šîðÏ=²ª8Çð?I„ØÈÈQžx­Úå‰àð äp€•¸Çª¸cѲUëyàÃ6¿ªu†ï!\&#YR|YÒÚ‡ƒØÓözËGߪÍÓE¨ÍfþP¸#Ä6Ű’~ýtös°S™ƒ!ÖjÛ£ Uyæ|‰çzü·>!¬ïÏ)ArQNb/Þú?Ã%FšÕn^ò©t=\ßV|8fVÐMA. ­ḣ¦¦Ô§Xèê2Ŷ³öy z˜E–ʡΠjå•j#Ògè™…÷å6Ü2¡˜It-leÆ| ÀÄnæOŠX‘3)\æMŠ[fuÌJìaI ôžŠ/Œ¦7‚çh3ÉQ'U|ö ˜)BoÛ²òiM‡EË"UÑÇK¨àJQ·¹¸OèüW¦Õ Úÿ¯?yò¤žÿïÁmü§ù(û3æ7lÿ_¢o,üTöÿ¤¥¾ªÀnZ5yìnï-ͽm}¼dÒ8qº Õ:\cÿ(÷Mé]íàÒæÀŽ6¹Ä|W7¾3lqæU2`;âvíøÊ6hG{®F vVÊb‘ºu&a;Ûv]¹£uèë å?8CÜá¹hµIýJôvìzÔ°®¼r~×õnÃò޲:Ì;Þ«3¾l;Ÿad(:]›^ü–eRSÛ¿tô ™¶¬oÊ&\lþÝ—¢ftàXð,H°Ÿ~n$XíÕå¶ Z-•Lƒl8„¥>î§K ÒMΪ›$,DRÿ)6TZ4’œ¯£r%pS†«7­èv3|gÓq`[TÇÆA–¶jbÅ»Êí«ëS䫨GôãŸÂaR%2BH§“∮Jól åU &û¸X׎á 6'B7Ì%ië1¹:¹A÷f1pØ^NÈÙO>ex.H:P} $Ö¥m:zeÐ @6,=Aÿ˜¼—ôðrQÜ}cø¬SÛ”‚Ø ûÂaŸ6¥c¼àŒ!#J´é\‚áð—/£ÞØ•*ö† ]o îge†¾—R—whô€hö~X¹ºûƒâzäö0[îðýº´ÔpqÁãº}º.å°)Ñ$>£*"¸9 m÷FVS£Æûkl_¹L˜ÓüÐòBP€ömJ[#×ĬµÝ”úê0Þµ×5Z‰³÷ñ¬»€oFä¹\( ^‡}_Š`" ËGG|‘_LÆù¹âðìØŠ{EFGã~û ‹&PÞ6<.w¹ÄÌqÞ ³¦’¿.°÷/²ì©Zî^?oÙ×'ÏBnOH¡%¹=…!/'ËkI¬°BFXl§Tvd#y ™’HeGCeÛžÅyåÿ˜Wl`☛藘)‘ããÈ{ýÀÏèX)ïù—œòü h7ÿé¸;eÅÒÿœM‹É`‰ æçxèëž<¸½ÿ¿‘Òÿ8c~V/Eº¦€hÄÃÉ @G‡ê“²Œã>¯øÓ «QI$v÷öÿëýλoëÑcaÿeŽäËúG#í·ìø›ô‚¾ÑãcŠÿIŒ>›Qsâ‘K¹hÓ+} øßgáÕ´p«hyƒþÓ_ úWb´æƒËâáDë亽ø,?üÿó?w:µø?°Üòÿ›ø8üÿÀûû­ÿz%•í–µØÁC/ÇËµÞ w‘!kèr_¦Ï§>Æúì!0ói—KâûB´/ø/fù°;daþ)=¦ƒ·­Ãߨ‡öÃZ"(Vùû²[‡% Ïî.bŠ´|Mʼë‡ïµÎ›". œÚTZõIbëR1¡i¤†E 8ïHB)«K®KoqZ«G;í\‚)‹vþ —. —y'ãuŠYm’ióùÅ4(?dªdüƒ³¦Ûµèg—ã…x»Åÿñ>ý/[o4ÿ߃Îcÿàvÿ¿‰eÿ=çô÷Õ×Í€TÁØé8-2>ÎhkoºJ&ýek;nb´’,…Šðí²í#‡ðeÓí¸fí&žP_#:×ÄTë B×CüZêûœ(GRRöµé‹à.§Ñ8 k¤bµ:LÆ++°éäœïé0›JtJ uP™ä‚®edê"M 5`­ì¯s®OèóÆ„¶ÎÕ'• ûüÉŠgmÁu_‡i1Z9ÓÁÅg65¡Ó“oaJ'\.Q ¥ Ma¢¨PyŒÿbù…Ñ ]R‡¦Î“æÇíös‰Ïÿ'É`émÌáÿëŸøüÿAwýöüw#ÔŠ—iô±{~.Ø{í;wîÙ ïµ¹à0NœBøÀ.œêØCOì"°òWÒsSÈ<Æp´Çh¥æ=ö¢×:Q›zÜËÆIq(//œÀ]ðU9Í· ²ç¥]MîÁ¦·ª°³›ÒÏ¡–ÿÜà×ðFÕ?/#[´·þG“ñd5) èÓò,@ç­ÿG}ÿ¿Gnõÿ7óA¥?æM* 'Zð+ÛÑk?ÆU´—öÇ“|r€z -âvOŸÚ}8ÉóÉiœrŽI@XE#– d±HŒ&ÅôDGÂå.§Ã`mOéÙx¾Ò[X ­<ÉV’í26žEoÞ½}·¿µ³³õÛÌ“ 6éÏ]t7®.òêÙâ&£(T\Zò”+¬%nµ“”°“"§_kü𮜛?õxûŸæõ¿¼càÜý¿îÿûd}ývýßÄÇ]ÿ —¢ÞÕÇ;|™Waí§ú¸<¡ÆÊ@úH³Ö'D£*Þ‚#)jå ”“ØÖ­×û‘|qNd[¼Èõý S›OK‹ÖÇc“}tñÑÿ ò¿Ò\œ“QÖWsâÊ,`žÿÿƒ‡¾üÿäÁÃÛýÿF>jýÇ<Ⱥëë_“¦çeJ{:ê=`ÁŠ'>¬ªéÆŸÿ|zzºFskmR´È ˜E‘Väp–l‘`öÒ?÷д}*ˆ ÔÔC´†¾ýÇÛ­7¯^ȶ¯¸€³›{Û¸e'@«s“ÉU¢!¡uk¶v¾F¢bqù±¥-1%&틇! :H‰éë[TT\Ê –}äLä¨+?Fñ³Íh½…š’ã’}HSí±ë§é¤˜Ò…"`’‰Õxõ‰ÿ’uk ýÈFmÄ8=à°  š¡tekº€Põ¸·%dáNa¡Jþ­ÓF“v>ifH¸c ú–¯LF)ªÊ’ã¼²(¥9óÓNœeÄÊ‹»úÓ:@_Í'?Y½UM ,iêõ¼Ê€tþgÓeŸZùÝö³I´™¶¸¶ˆõ„â÷¡Ù2æÊäýÄ™2LèT™¶ æ¹Áoš³zR¨%Í'ÁQ«’Þ1ÚÞÁŠe´xJ7⪪Ñä† ;o†yÕŠ’>¬Ô<;JEÖUåÚŒ•A²„ÍÐvQDõéÓü›h=ˆ½ª®¦œ nðT”ޑЭøízÓØ›Á5 Xfm683ÊK$‹M5&¤g´¦¥ÊKTÓ˜$MÈ{)(Ð*ä¤ãé€H–¼kØǽ²_dÓŠR¦ Îh!š1ôÚ*UMòŠîªæÞ¶aF’ëš^1NÝÞ:Y‹.%ñG{\Kƒ¿Õƒ u:M y<K,aÄˬ"úa¼ imëâB„WGq<îשU#“.„*?¶¢Qr-¦'iqNAÖ„1JÏpF××'¶ß¿Œ ðùø˜ä”\þÇüGtŸôG596ZZI"}lä2ýÉÙñ¯ƒlÐnGƒ²Ú âí¨,úüõw§7ªCgTÔ-Õ+SPB½1òm0Ûc¨ŠÉ>§ìh2Ȇçµ0qÒœ:¦‰™…%ÊŸ ŸÌݰžØäõœÚ+=׬÷ uss‹r/\ ÷}Ÿ€úÂF×Я[ÑdêØ“©°¦f½&<÷jˆåñŒ:tÊÑ"Ï.«òD4Ý©e«k³}¿¾ÒG*W¼ W7ë:ÿÁFv¸J¡AoDÿóèÁßþïñãÎíùïF>êüWó&ýOw†þDz‘7DsR‘’àµJ›—)?g°ñ–ðÃÞwïv6¢è¯“Ãq´“N§¨&#¥FSzûæ˜ØÄw(ÐFp0]òõ“‡êå/‡Å*ŠARUèPíSŸ,ãð£=ê¼9qžÕýºUþN0ÞïS•ZA|’P¬¦ãœd²²0ßa×TÝz©ÊÀ ‡ß6L Æ›£w놋c/é ›ëL/Ú‚ƒ‹Û%¡^"¹°Ñ#“&Ñnè×·N8@¼2Éä’è18'9[%ÇNÊrÒÏ(­:‹eU›z®ÓR£…''„“BVöØ3jÐIè;«-뎛ò®Îy' 1T¢™$Ù®$ÔäËÌäo pÒãnåÛž™JÍ@A‰w®–ÞN·,“jñî7ûüªÖмh.UÔ àçO íž@’Ž1wrz ½öR ¶MœÒÙ¢kJ;“\"mX[ër}˜_øÇ‡K~”;‹Ç^¯ã‹fÐÖ!¡näj‹áZug¡½0Äþ Ùbsô£·¢¶Ëùµ4Ú0€šOTw"²Oœê ݸ4ÿÜU;xÍžÖ ¯‰š³À/7¬Ìââk#uÜÞBhàÚ-‹Ï‘Ëeà42»*Bxs'æ²÷Ïñ¹-ÿp7h2 &¤:*“*+¥¿¤ž%^¥ àj7+Bü£I” *°pG[sÜ?J+Tع š¹h­Ã]Jª+?N’"›—¶$;$J&Ô92 @•wAÂÊAr|ÀéP¹›Uç˜"b‡¾wlõáÏ’Øn çšÎÝ%çÿ×ìnïÿoêcŸÿº‹à¤èwš¥[Ã[à•|ô@ÚçâÌDMªTR¸ÏéÄ×{äëØg¾ÚÛîí‰ðB'ÂŽ½«"ý>ß#b§á¼Ò©ýªÝ†ªÝë=_.†ñJâU[ Ûk>˜.Š{H¯½h®çX{aªsµ Qýö<ÜxžËQ>³ò¢0´/Üù¬ÎÌ‹ô$ûñ9£çô,^ú:YßÔyu‘áCö&Ö?Ï6VgX1 ð'Ÿõy¶{}ÚÐùo ],ÕKòžçÿûä‘oÿùøñ£îíùï&>êüWó&ÛÏî'×D­)š õR+78ºã ±Í=ÕRH°ùHá‘瘲ýôlïw^½Ûyµ÷¿¹Ç5]Ûü"0~í ÿ± ¤½Á° .rÇ"KTY®ÃŬuo^ï8£8'*møs[\¯åÂÌœRøÎ…Û#nh²Y=)]³ƒCÌ!¡‡‚JëƒUzªã‘‚ÀHA0ù¨94E?¹a =‰2=«šÑ±eó‹ceD÷Y¹øpc / ˜2^>Cff“¬»¥dãb®l,íÚc.‘E-p3‰n-wéŒÇÿ=—Ìåð˜yþ?×kñÿºë[þŸ˜ðí1¿N¿Ÿ­^YI¿’ˆÚpRQyPr_ ¸øHú†ºQ¿Ê–`I’vC½âØêÌÌÆbF¸R€ÿÅ/ ëßò½^N³×g“½øñßžÜÊ7ò‘õoùuäQËÞ±KÆv¶ÏÕ²:ÇÚœð)£ŽŒ$ "i9Áˆ…f¶©I‹¼Ùz?Û†K8‚«°ÇDÚ5‰QžãŒê5~<’ ºõm›‹;ûöœØÓ”NÞÝÀëÂilç®±®Ô5n–°QNÓ~6Ì€VB a Â÷#¿«·Öоwº/Å}Ô|%~Ø"©ŽÄµhlm;¬†&©­¼Þ ¾Ø„Î#`éXQ²›Ñ¬eu‡ZnÍ•ôf]ø£k[[5Ñ•ŸÏÕ.ÏΰÀí%2'ÑÂo苲rVLH·e2§P`â9½ >_öŒ5™bR5]²J/¼Ö Õ·4|·?¾ÆÛôw¦ª»¹Ç5öØIBµ˜jÔÐüµªvëvãž1HS³¤™mjdžålÍMÍM$º?´LjFÝ09ë†VJöþkûøéðS'o2R:™ñÊÐCL8m+;jYˆa_¢Mb*Ä^’²è3V¬p!¹\¬k•?W³ñô¸¢nãÛ¶|ËcÜŠaÐì‹g¦§/<Ôw½¨òe}'9´Ÿ:I‹õ»SI$å“Õï}¿ë=Óõ¾·ÕXp º(Ô…êäÀ Ò•oÏm/LWšœA%‹iÅÌŒ{!ß¹üƒ¢r.HC :L¿%´Df{ZAB‚œ!/U›ýɸ*&9O2¬¶½œDÕ4éÒw¤8‡3¿5x¾xV°•¹C"ô—{°l”¤S²Ï[RÖu/°ûîÍ6T%ÓøˆâÑbƒi€ý°¿–Ò|O(œµÙ‚¶&è5Õ¾À- ‰™,rÒª…nÕNÕs'–ÜEƆº5“| § ŠÙŒ$ä ^/l!cœŒÒ?³ ©š­-Æ*çÝæ5&ä]j4΄Í<§ˆ3$x¥hÝú4ÝO7ذæ>—ëcñIû8Hïã¬ûQ#LÙSÔº ÍÒflâBí¡/oåÄv°SÃE¨wÊF‚ FGE6N›ùŽ¿.寨YžŠEÏ[¥RwÆb Éd¨˜ z”éLNãl‘&Q\ÆtM ~÷,ÍÖÿÅ5s7ó èÿ¬ ‹ËicŽþÿáÃGµøÝέþÿF>¬ÿ³†üæÂ~q"NÕ¬3ÕñLÇUêò0‰óuys-ו|øÐÕðI¦±™7Ū–kL!¿zÓå°17_©+ZÈЉq°± ¬XÇ”UÕjm–FN%ütÀûè ÆŒÐÅ. I¤B³®rZ“TaÍ‘w`"‹wu«²üMôáÖK,Pèâ› hs%‡`]›ËŒ6к²†dQ¸xÒùÇ–«UQb|£9Aå$Ϊô $U#+匥À»D4‡—ÆzÁ¼Š!Å›Ð}I–¦žÉ°¾¨ú¬a†ðñTÍB®Ö ~üT&¨™_ù•]ÔYX& õlßš‚þYOñ¡ˆâA®†‡5 q4û°fB ‘²M/Wª§¿Î)ÙBFt™‹žr±ZóYŠCã1*·Xfà$(]îüs%ÄŠ›EÌ:™Í@̤®´ÆOŸ«'‹oÔŽs3ª¹›´CÓT\ÛtÝ4•¦çrgàžDPÔø'>‰xò? ìâ«°ô–w˜#ÿ?x²Þõí?×Þæ¹‘ÌòÀ˜7ÛýþÞ0J=F9c]:cÁ~Å 2%9e4A!p%ÃJ´ß%å)a}w\¡àŒÄ›4û”$Ž“†ÞÚò21Ah7\«õÅ.“u²˜Âª¬%VK¨]_jKîQšŒåz Ý›÷XNÔFY…^dýÃIÖOŸ‚PM£Þ¦W$ãþ!H2ý~šD= <ÔÀa ¤VÖCF‹ H¯Ñ‡¹0°ñx9¥-.Ï ÀºÍ¡PÑÜ^I`⼌ )¨2Ád0}^RøÔ"%©ªJ8J(Ž/òm)ø!Òåáä8 0Lÿðæõê?’~IýgŒ¯þzõuzV;z½ßÚÙÝÞÙñîÍó€±m¼’´£8‰èÀs aéþaRè7»ê¼^œ`bzœrÐøÞ¾Á.9@$ë©êÍYìNÇ…\(6–:-Xê ~ßR{ËMR¯N™~˜ƯÇà´?ŠÕªn€ü<²êfÑ9§u¢ß؉žì³ˆ€mn„šé2ã‹Cò'¥©àì¿îäðkRq<ÖªzÁâšd4uPæ/$kÐ׿¡;ʦÏÓá„çJ»:1æÌ<ŠãØHÄàT¨C3ÀV‚SXŸ½gaò1-&ïŠ7“†e ®ñ8eTCûãT \„1Uò`c}.Ò„Ä/`öJÓ,:Õ3ŽÇ7<=îÐQ‰~ ïUǤÐO O’>Æ”ž_Ýp:žN:H,²x{{{w…2c1*ó1@†cß(öR2žŒWµÁººÉ¨ûjû³üwcú_xõ ¦ÿ½µÿ¼™Ï­üw+ÿÍ“ÿ´nÇù pÓš0hR꘻/¢M#ÒÍ}IñE“ˆøÂ‘ 1[®È†'ÑAZõ±}Ôõ£¹F|Ò¦Ÿ-SV ‡vQrÒ%H0Œ§0-§TÜO€VñÔSÞFææ 3A …¯éÉ0RÏd§Au¾ß²ðTàZì´£i7ŒL'€ 5Su¸•µ¬ŠwMñ%ÖÅ»\¼k!J0ªnK½‘¤Ãngïø=îû$ñ‹Yý4=ÜÔÝŽ‡ãè 럵ôkCWåñÊ•õ£Ê*ÛY‹’oqë`¢Ÿ($b —Ÿ°9QÜg\Vx~d8Øø-‰ X4ÍñÄšXû ¡EÒNÜgá)«ðDÊöWxRÀãþŠ3ëX)ŽXI­ˆM¥L`Cn¼ ªk\JØä§yÆ ¢ä/W`RñÏ®MšaøAJô;ˆ^WH-CÃ+ª´Mš•1~oGûfþ–mÓ¼K¶ÐœUɯ©‡¦;Ãc൥µ`%ÿµË hܦMtÂ+ãN‡ÊîñéãÌÓÀ “fê40£Ã¦f­{÷¢ÌGu#ÀqZÍ=ʼnOàO3G±Ë̘øxlʛơ*ÎߢÏéO?+¶/ÀÕ‹xº±Q´š¸½ƒ¾ªR,ØEpU/¯ÑÛ:´g)Ùá'¿T}â“ &ñå4°üØšßlIRoläîŠQ¥ŠEzYïgôO@böúðª1ËihZ…©Ðòù'÷gccW=÷FæÆâ\RΧAÄ.¼1¿jþ׿KŒ ÓP¬æéIšS+h­M§yV çÀváÀ›Ö}6ßoí}·ÿÃÞ«×îUƒºÍ}‰Çg£ëÕÖHZõ+ß‘á°j¹@U2 ñ®œ©Ù ¥8t¯’/†I’çŒHtIx ½¦Ð }šÖÿò´óãÿ<~â¯ÿ‡OßÞÿÞÈÇ^ÿŸ|í[Цêç#©™6ÀJ&OËô$‡w»kXË{ó’ßàBÛ=/­#»YÌ|lƒªd∦«oUçÐÐ?<‚ñ¦9t•rè"¹Ì;¡cL÷U?bÐSï| ã÷k(õ}›ˆÐ¯ƒ¬ØD±¾o*t~÷ê¢çª¤ºª„rEÍ® t"ȱït–¨“EÞ^™21ARzÆ©e¿,á¨3ç#X Ú0šõs "±Í¦HH—k ÈÊe‰Š,ذ6í©gªö§M3"V¹«ò{ÿãóÜT–ký?—ÿw?ñã<|òäVþ»‘ò{Ì›øÿ× òÿ÷Ådšû…+ÏÏÝ*"sø1MÊ•2ÂY…†-üßï¼{¿ÿúÕî¬ý"sqp8ÉñJÀŽ vú?Û ÓP”j…“1C©OÞ­†c+(+e)ŤÏñù±¾(P¶nÞ€ÅÉ60hæÉ3[ê:þÀÞ4ìX’¡è¥ât"Ù<\‡H½¯´@7$ šcæÜJ›2·øäîfðªaÅ[©Iï—´/Žo&%19<¹º²0å ˜i%*†ÒfóïŠÓýr°ñ¬R~qÊó–àhätbä ­Òs@À&Û0Kó8IŒA€-`·ìúâYÁÞ_’©žè”¬÷£½ó)ÚÅ瀰=xªÔÝc–ª&æ ¶Á¾—r“Œ®ü°wÖ­e/­N1UìVÅK¾åB½«ëL!oÕÓ.wª1k•{ö<•ü³ÜÅA›@´Þøt{ˆqJ)Ï©"g¤vÀ2Îj °ª6D†wœØIEX ¥ÆfG÷È ` AY¼!.²\`Òk` ýゲXÃв—:MY±‰Ò ½U·×úU4‘L½ ß·±Í¯™Öky^ªçŽé.j)ÐÏ »"/÷(úÝaK/a…MkÙþj·¾a¹Ÿ:Í«ÖõÐi…ä«óÿÐþ¿Ì½?óì=|äïÿÝ΃Ûýÿ&>jÿÿÄ{¿9Ê ö5{fËúèÝ­‰(RYMl92Ò¹– â–Ùœ7©ÐO?›bZ6ˆù ž@† `ÄÇá7Sb^ák]²Z™0À^½i„ºù3Ûx\t4&í¨ ûn|¶‰ßMÑïÌ-sè2a¥¶q߯ b¸ÉƉ¶nlD¹~°~¥§±ÆS>¸%îû}…oéw®`ŠAJJyª Ò·ð_žéWôMöÁëWîÒ&ýisÓŒA[•ßT_~¯ÉFGÄvhW§ ´GEë…H‚ ^À óÝòýϽ$3(ÁGåm8ƒòA9—“*•ݦsðYé—²eŽÏ[Ó)ô;> -»þ™UŸ௠x¥Æw"-iï ýúãkªìP?@ìº ©·³CK¤´6XkXp—ü•‡•GšÇôw(Á ÆÐ/”‘•ø «Å„ÏíX wT*Äô'ÉŸz¢ËЙŸ2m-`³hìB‚^P‡¸¸ٸ׎ ÚSxOÔ³-~¢©zôÔU0b3ï(Æ–Zf ¾ –œµ.Ž:rÖ¶À†fƒ~SÆ -bË&ým‹$´IÛ‚É&ÿ Î^Mó%<=Ï ¬lÍ =ܳæ¢B´q–æ|ê@= W Å¥‚Ýo»Û8öŸuúq_þ+²&û»úMÙÿv;ë5û߇·òßM|b ³oySàÿÎbÿ·´a-ÁÇì’Њ„&m@J«~@„š*‡sóçñ#Œ—0f¯Í±ºÃ¥§¯âû:)OøpLÇmÁH!ô”ˉß8 +&gkQù¡¨â®hAò¤8 3åD¸Óºßx=ì-+A0ð|Oh“â C 0 Q.KƘõ 9Jå*¼IYI¤#ë¸KDAè'æ9ñÃ'í;?u:í¨óþÒŽºð÷ü}øäç–œã±ü}ýKbñ¯áŸî#ø /MÉîW_cÑG]xû¤‹…שôÃGX|ýÇ"V…' ÆÃõ¯¿nG¾Z‡r_u×á{§óè+ðø!¢GåLµÎW°ª¿†zºOžÀë‡<„:ñ–°ì>þê!ÚAx\تüð«î׬Ý}Üí<Ä>|€m?yö¿zD ¸Š…÷ú×O:„|cU¾u y•¹wC9ÆëË$Ë£{fb®a KM²òž’¡2Úîì·ÄÔ<ãà Eu¹Âû“,ú&:Ìäþä@ÉyCŠI+´8"2e²±FIcP¦2æ*J¡1,¦ŒÃ+˜+ðîþö9ïn·ŸyŸúþO5–z47ÿã'5ûŸîmþ×ùÄ&ÍÎ’2ÿlÇF§t¢=‘æýzHM®µ@ I~ìË NïSÏ¡jšËðFC5ݳBßh:?l·\ÇDs²šXê­ëçóñÖ? ÂMßÿ>èÖíÝêoäK†£›ÿöj4M JöE†“2îåo?lÿ°]_ê+‰¥Ëèó¾M½ä]££¿Qö#s¬«ràÊ#½HçYr®rY¡ó,ÍLwlÕur=Ô³4U˜¬ Â!ÀjM§ã‚µ®~ß¹Y"-¿°â”ñu#zY6´AZƒ¶ªsXY´†Å€(`1‹—BQ”M|s§uVÕÀ6äèâ0_ÝIÆÕœ§Êô@ÂÄÅ=ì0¯nFh)î ŽgÜÎq§µ‰»ÝØ!z„6ÐÊKÀÅ0^!ŠÝÔi²‚¯œÓªLg‹ È^~žŽ(>„ÝžˆÍv8®ˆ5$œ m«’Ú]z…%VqØÙ€ïÉzSt­a„­ÚN½âõnO#—ù„öÿ¾ÿí®w|ýßÃÎ“Ûø¯7òQûÿ§ÛûµÖOvîg¶`|Ê9 Úį/ÐBÃ+ÝÑ­2±˜#)ð=!··äJ˜ŠÑVäÝîFð–öÞ ˜2¶û¯ìÌñ‡6]¿Pɘ‹ªW_|À»«’Ú¤?°ÎÉ ·GÌ/åƒ\ç$U µìÂÙØúqÛX÷©óøÌúÅ6¿Ö• ìé´Ñ-5Fϰ%ßé !³7¹i(ß4§ÁE¼¿-ZðÝð‡¶8y9äVo¿P¯m݉èa­µz¸Ãê÷|k¿Wb›.¢8¥d£Õ…ä·SFﵺ”~â”ÃÍvh ñO§ÅФ0)yñ#,eŠñ®:Œz˜yää}´V²0%owÎÝ·ÿÉx°ìãÿüüßýü¯=¾=ÿßÈ9Ö˜_J˜/Ô~¥:°šÅ“¾0¨¼è §T1”7vgëí·…¸à“bð ³v ¬ø‚ðî ¥ãÃoîãäL=vž2üÏ ºmv¡g™¦zLråI3ßlF'øÀWÛ'ˆJ•HJù¹•9I%ÚCHé©'$¥ç>oè¥øaK²ø“Áq?õïDËôx0Y傾%Õaš`ÑG;~ß•¶e. ´±Œ޶2(8£]Î¥›2|R8“b>y…ÔØM%ã€\àR®è'i -€FúÅëkëíÎÚº› +`8áqÅ—»-Õy9„G^{í&ôÛl6]¥xÍ,ˆdí_~6dØÖ"íªyñ=`6Œ~‰¾‰2—½˜–>™µþüÙÇ¿¹ù?€ß{üÿÁ“'·ö7òþ?‹÷w®pü»ï_‚Û oQ•`D ryŸç%†‰œNעΓõÕΓmC;)†qƒõÁTÙ&¿†¡ÍŽè²ý{ôjˆ~\‹ÞÏDÆm–ÑÁd‚é Ä-ä0)ˆí¢_›ú¾õâMô ů¿úª…v_wW;Ýõ¾üa:@ æýüxÀšSö·AÊmŒ‘60…%7xøU÷IÇ~Œ€¿~€€×­v:ëX íŒC¶;!àÛI•n±ŠtËÁa‹8ÉäõÓK«Êßdã:Vh6ZË5·i¯uÞ­ÀËWãêAw &r,Ê„0¦P¿@€R‰»¹H„±cm¡†Ú–¬7h)òð«>!ÀÝÿ1X:¶þt´v×#|¬Ÿ} 'ƒì$J ³§g#æÄPíMyÝJæ‚ÆBÑDõ¸šÐƒW–J:¸7Ù>« Yt=6`R³I4Úë§…ìU¥è¢ìª­ÃûŽ6lçggO†üÁžî»oIØ4ýÅßVØ=š@+ªT@‘q˜‘U$¼Fª~ðÞæõéë¿¥k“ÍÕ¿Pp5"ç·Ì*ä)?ð^«<‹Ö%VMJW˜¢¿}¬òi@˜³h7Ñ› !lÅ‘Z6ºÓÞò•J±¢a«mŒïÃJª¸±©[Ž¿ ªO Vò¤ÕØuö±;ðÅ\±3·¢‘Ѹ„vfq Vm2Ge«ýYZr¦Â†‘jÿÒb·MkTHF‰œNÓø¨ÜпèW˜Çyºy |¯Ââæ=‚|¯=*6R>¹÷»M`j†I)´Oæóf(mÇYÅØÅ_`¶¹O²Z­þ‰µŒ+\ÿeÖþÌeíÌYw.¹vˆãPGð^I6GäûŸÁìFŒâØ,Õ­ªxçËNËÕÎYÆÉ1onsåÄÛÏ?ç' ÿOFKÖÍÓÿŸÎí¼zTŠŽ Êœ¶_P5ÙU)ÔÙžc/™Kj¨¿[O;`©AHþìOÆ'˜;‚¹nÛ‚GŸû6H2É(õQ?£Tol]g× ,nèý}˜œØÜ8£†ô¹ˆ!n¶Ö‚È#4%ò—¨ØA(˜¾mý4ÊÆP©=JÎàÏÏ5€o“‹\o„…¢ˆ¯Ãq á“¸mÍ`g®Æ†->tÑ8Ÿ´Ñ([5W*%ÝäOTègÊ`ËÉ Í`‰¤âd·}ªÔ20÷?“ 7Èÿ—¬šÍÿ;OºO|û߇ÞÆ¹‘æÿ×m@9Ó¤”ÀêÒæ¿å –κoÊYaÌÒU4ˆZ…¦‹É)BŒw|Þ²Ê'%´Yö‹¬—bD‹èMR”ÉAžqt’ÿNFɸÝÛŠÞ¦§Ñ‹<))€‰œåÞRãõ/Z¹Ó¾mÇk”ÙGZÐá—Yo2NúýÌ€»+UªCŒñFÛM19FO.în>½¬¨É9º×€ Çe;:M%¹ƒä<!,yPÑè¶Ìƒâ8å¦XL:ŸûI Ž61ªuV;-5Ŷr4˜;84ÂÃ0áìpÀ,0"Æô†þr†7êÊJ¢¹ Õ›×ê¬`†oU”Ÿ!šNhÍðFÙÁ!%_ õŸ(Út©W iËèÆÄ}B¶" ¶Uɹ÷æõø†Ž?*ešyûãW[rý*Tùǯþ®^ÿ=íÓHFn=þÖ'9»Ïm¯»o¾1'Ýo¾ÑŸ=3Ÿ=ÓÿÝ<…Nƒ¾/¿4/&…y~?Ì›3õ*³3lšùw¨l]ïôPÚD½êBàqTE"G ˜œaÃ00–ž’lgO^òLJE>eUmfMß’ªÓÔMàù=Ùaÿí*¼²ì’€Qb°Ôœ NÆÓ¶Dau˰¡¦þ·‚ÙT§“î8=x@Úõõ?Ç1J_ÑúÙWЩÖ}çW+•ëÿAñûvT‹l|Œþæçmй@f>gÀÙÎÛÑyôÌXýf•Ä ¦ ü¿~Ú¡â›Xž* XÀ–¾yçí·ÈØÕrï ʉ‘Gí­µWI;¾Ïb?ýÒ©háÃû ÔBƒcÔåµýYS@ YÕmù©Ú|0lM8Tålôf¿‡ÎÑorIùùn8sW5@@ªúcj”êr IÈ=V`¡D—±* »ŠÌ•#õ˜'mÊ”/{”d}èÑä(™*"\Ç­?-`åîÚÀ`D¡L¸f¹ÉsØŽè:&á6Ðr*áÊÜaW~g Y…ˆä.$vËUÃj_b« ÒŽ±‘èËè­Å°SÀmmVÐ}üðqúø¡žËúdÃtûÉÞ–>µ>„ûï*â€GºÄ(ðVX6ÏBØÕî+„Ú¨¤oyå“uöÓüBæ+PDNÅ„4ÖìHZ z`‘`•y—E¿=(áø³é©Iõo‘‘0ô¸U+BÀãÚã(z¿vL×NQ =jGŒ˜éªŽ‰ÍÆ[k ÎE1S ZkµZOà4®_vÛ/;uTfhÔ=dÖÛL@¯%¯ð §Ò÷Æ_ÐøùØyuºáN~ASÀ¯Ë}Zo?ðž??¯ÒµüSîéY…Sã„öiœ+Au? ©Ñ”Á‰F`á µÁk}oòœ–^Ñ}ž_ (( GUù!Ûƒðziš27dÓ¹g0»×¾—¡l |‡Ñ¸×4Çßã %Š©}>¿¤` £…òELqòŸÉι‹Ž×ñµ`KQEÇ,„pæ#,KV®„\¼iÍÒ…ž_‹™Ÿ©D—°(¸1W§/þº¼ÁSêvku™!ivô–¸»‹ùX„ èïìd«™„»D¬dùœ„k?ÀIèWlï'Ãzçeðèo;ª½Wƒ%›Eí½ž2üå÷`9dÖqiÃl˜ÊŽ€Éá&I')¾"R÷ãÆ´ÜÚ*“€p\¿y÷K˜x]lÞí: ®ûÍ—«y:T—±¹9öçsA´Mº2ŽÍõ󌑆ÙJ ŸI]޹…OVù‰{ƒFw¤Þµ@„À²£ôç‘%h²n#¤Ù^töÓc7À”ñ†vñë[ü¢"ªìnZ•2ýà`Ú±C³FëÀÕMdMkœÍ‚Öò Ï\žŸ2 ë ÖS+5;kgçí^½–øc»·BÜ™$|XÈÎ@´Ÿ·T`YÍ`ªfû#æZ©sK)oº|<Å[ë^£˜ ‰„`ë…C‰3à0B øÎ§²6BqÎãéʼfß.ÐèŠÛ*NŽZ“ÍÔÁfÓàµ4-ÖÛ"búü”çÔë¸Ï­Q[J*´^ð­‹s×Âk’¨ÛÞˆ?¼xJO¦çÄ›9Á&Q…‘†PîOŽ”½lž&ünÀ`é »žžM ¾N*³!µ2 À#' ïŒÆ¦©k$Ôñ5è§²2Šû÷‰=¶<Þºæðšv@ôãWÀQ^w¾jї΃ZmŒåÜ€ž`}¥%gbâè¼tÚ³¶ƒì ©п9ÊËŸ svŒmc çÃâà,ÌFGNñ~»œÅ0!qü~ðu‰¯Q'DÉüP’ÒWuÆÀeMaL¸‚ª#(þ \<ÃÒ1ibþÃßpáV U1+sþ¡õWÚ»bGPq¥-ï#+$_Vñ-,§èûbg; 7cy#âñ*¬d$Ú‰Ï0FG4ñcfƚ䪷ÚÐÖézÛ.ãÃae@ëí’RzqaŠL[O|_.]oìÔk{Ca‚É…W¸43ÿ@wB¤•f‰0øecÃjÝtÙº- ǶŒÂ3MZUÑúµd>µ¾TötîŠѦFæmû§Ÿ¥ÿ‘½ÖóZ2㋱,ŒÛ©K€¶ø¿>C‚Ä÷s¥H,DZ·fAò/iÅz%ç>f¸Muš&GVðoÖä—†Ý*_àèˆöî-ë•ìBní™rlâ#]ý=Œ-¸¬­­Õ¥Zü¤òÍRíP_³ð´¦Ù% Kóý2!… cnÎ(Äc²vÔ¯r¦¶ …ꃈ „vL2œ£/ûGzkËW`°9PæR½³ÃÓ/­…àè”ÅoÕžå[¬Gƒ^»£„f‹Ô‚…‰ÜØ­LvR[MVT7ÇdÀCOïÕµóÃíÖÎ%l•ê@׿׎´y¢gn'–‡Þè*ÓCÔ}êÚ¢5_í ˜W¶õ_UÀòŒwî»d¨mZhôwoó”M$›xw‘ÛÀ¥|˜³Þÿ—ÖjRèÚúbҺ™ñ-õû±êÀ6kìŸ*ƒEà1Ÿ‰ÅûãÙìlo}ûf{ÉmÌ‹ÿö¨ÿáÁmüÿú¨@©¸s>6´èIq®K»o^ÿùí_ñúŸJœÓ2-N²>e #—‘Á]Ì‚7âÅäxÊç ¾‘)7pí®Fß&Ub.œYvX¾3±`åÉK<"â Æ” 4(bÀ;JϽeZ9%Tì)EáÔº/‘]€ŽNžº÷’W¬Kgs½Ó×Ès¼þe%šP$ãÀ*bñ%j ÇÃO=”—úøö_À‚WѺ-Yb9ö_výü_ºOnã?ÞȇÂ\9cÞdÖa&už'eÖg¡Ã×ñ`6¼f$#“6óÅ4K½cŒž|—2GW˜ÈZ«lÒ³)¬TXæŠ;i€úªŠǬÜ–ÔÇdÏìÛKÎäÌ¿z€8È ºUSMQ¬æ%èt™Ž £ç4º_Oð ¯Í‹~ØûîÝÎFm þ%—p<¡õ¯“Ãq´“N§çPŒNùa2©·oŽIƒõÈêí0[òõ“‡êeZüçq~^–@Ö¤ªÖà¬MürXü'^Þ#çRk&F@÷—4Œ&j6 ïëÉ©¤ál˜xv…ºµD/‰1nG<'Ú*ðu?+MZ®)üb6,ëä#5Du6” nÙÝйo}…âk³ãe†ö ˜&w‡­þE·§Ûjl-Éá9l9•´CãÉÀª"Ö ÄVÅÅÛ‹&:kŠ  4ð£n#•^j:²ˆk,†ŦÅ*¤ ›T¡#ÚøûwÌöeÁ´qº³ˆ ñ/Aˆ¨Zª==œPªbIj@BÒ©¤R‘Iݨô<¼×“€¥³R"4®ø¶ ögÆÜ7Ñúšc„ùÞ_¿Çð=h*HéhÔ‹“jmš ^ã5ÌŸî­ß‹NåÚZUÚi®´C×8ºÖ]ÇŸ \Øé^¥a[_[ûšLó#¼›ÉSžX¶Æatô-=Š3¦œi’ÎÕ÷Ö;Ý=~òÕ×÷蘛 ÏñtRRàÉÉxÑ–ƒÕ˜šSñòaXGø:JÎÐIÎó;6EµÕ–dnÜ1ä˜c2øÜ;T‘#øö‡ávÉÆFoc£¿¶¶F¢Å/²RÅŠ'ÂÖö<ÀÊÉZ+"BõèþÇðj(*²’;Îɦ§TÝ®øõJÙ6Eä%åÈFÛ’‡áaZÌ¥ €‘Ë*Mj«Wo3ê<Òg† BG-órle¡{ý~’§?L#Œv•ªÐèg0cÉ­€NþRz½¶~‹­*«®ä€úvìƒz¨­»À¾Çëk‚õeÖèHØ)v`ôµ˜SónÖÄáuëvZJÙìÔËZÊG—óŸàZæ Î,ObÅLûIQœ³®V@¤q°‡xé‰bó-£› §6ê±"N,(X’#'¢xb1¦ `Ÿ×õ6¸óë#âz2b²üPµüða:W 7º±¡1·’µRC‹úCHªi¦êâM eÕHy¥qHUiuk€»IWF³À6Cµh·X ÕïwíYÙTP } m!±•/»-•r+’ã¬be¶Œi äÍ,m Ãì jÛ\Îes££8¦Ä#áj\¸–Õ‹ÞÀHob‹pȱ¬M·hb’cg±EÄ(ÆŒÂZDÁÕ@ÝŽ•\ 4'Bk«¥÷J[Í~¸®fÖú$笢:¼ŸÀë\W<漪‚«h‘EÄ@d‡Íâk&’L•þªQ³i=°|‚u ˆÀl®ûëh»aýeáut™5t ‡Õà2â#íft*§ÙM*\M:7©³ÖiûÔÒ©<®rG8Ūϸ.¥¡y¦·ü=C*­¯8jÎ[Z±n¹I9=d¹‘ÛiÞæ‰dcãôÐìÖ¼¼l¾oÛÑ=u Ê»±(Aic!tÔ¡ Ñ2ø9[ø7Ñÿ=lE“‚W0!Bs¯ÎŽ4Âsø’阃„áEÈ»(¼qêJš ‹ˆÖ°jCÐ öú/íÌw¸[´Ü•ª$Æúm\RY½…Wàñÿ¡©YÚjÙC¬„ýY ³³†¹ ~9Ÿ]†$â ›D ¤Åæ=fŒ›HŸ©ýÅaj*ŽQžÂóO­•¿¹Oèþ‡.ÔVÑ‚b9I@çÅ|²îûÿ?î>ºÿr#uÿã¹\yDbk‰,ÅBk•lmË4OÙŒ„É8:«{Ø2AÇjukòb2=g‹zI#ö5ƨ‘|™Òõða6¥ótK£®ZŽ«ÃI±½Iªê0ƒMéy~ ­Æ=üóŸU•­ö×&°SЈ{ò±ØÅ~عCÑrkçí«·Ùˆ¶1ï§Ü*)“¶ÒÜ/‰ýš¾¦b•É}üÅWv1F†Åx¯á-VKÝ)ãÝ‘Èщƾç«Õ!_\“¥j?û¶SŠbÖ½’wªÊ{ªÚš¢+ª(ÝtïæY?]+ñ_¯–Â¥Ÿäý㜢Ñ:£t%ã ÕUæóo)é`Ð3ËR &µaüöÏÝV«Þ ÌJ§¸§ðUVNNÒƒ@  ¬vZäq: _øÝVçb| p¡f è¾×¯7ØÉü«èßÄ•z ß6£Æe2Lתö­¢¢oVI ÅŒÒY ù5´ë”hk?eòß%ãwܱgÄ1RÝRþÌžƒ­®;˜ñõɃî£ÇµiœR4™Ç%Om&ÞÈ©!Òn¿Û šÒ8™Ì£cæôóã2;I[öu·»Ž·Öèz¦`eóÝ;¨mƲg œœ‹ùŸ –Gƹk_Ê_eD+fµú÷¹ÚöÌj˜ÕEÁè€'t˜áâ§^é6Ši„™[ |UÊSe¨2ÃW›É¿edž´³Ö7«É¿ýò¿ÿß+++¼ò|²ÆQì ¹ŽKeŠž wÓ¿}°‰¿ã‡ožMÅ“šù@MN©É)|ÿp¢.”ÔǾ9dÉŠÆ¢Ï %;CßDˆ<ëú¸;°ØucSw“fÈZ¯ö`gúþ#³jçäVýÂd¼£¨¦žE1¢ÖÆF~¡3’ZúEy^qùh¤-PJÛS Ù‡•ôùÃJ›:L¤»£DÂXFé)·Žž1¿¬vZ|¡¢#6ÅW…6Ø·gÏjoJ”ö”@…éfÁh&ÿV¨;ÝÃíèö뙤Äpéãæ® ”Tòpö<+J죦(üü¸„qf£äèñ…sÚ´Ö( Ñ̟Ľ7Á»í­jj¯Ð…ªY¿Ô©Ä¨]-þÚï¤6 AÁé—9)e¿Ì<™Wër€ŠÓÎ(C–7%wº1ùìuïêuPX¯VY='Àº×UfAÌĦƨ¥'4¶ÄGF9žñ|¡¨x93Š·îÊÄÄ6ѧ‹7‹RQnÛâœæ,F<‚Ö1:jw N‡ŽG¤´hP”–Wc…<»u•ñ[w¯”»¥&ÿzyÒ?Z%ÓÕáx96`³åÿ‡ët}û¯'OnãÝȇäÿÚ˜7Ù€}='°ì‹Í°Êç)ÆH^ðóÝQR&G^绘0÷a³JèDU‘¦¥˜›Úg|N6$DZ? µ„Õucdt’`ÈŸ{/tYŒ©è¿‡²ûwÙøcÚ6±­R•’J{¼ØÝà÷hŒ c€A¼˜Ð‚ð:i· èólĦҘyÍGå!™GH¶J>’õ¹1žb`ø“¤€¥_•æLx¼RÏ7¢Ï3xð#ÉÑ›ÀlÈcÝx§(| äˆÜCU§ ðíµSLØþ óŒR., UÌéðCއƋ[Â%[§`ß`€ùùaJ.Òfn¤Ôƒ¾BƒæÛx©Œ¦ˆ†MËO“sF uâ.‡€ HÆ‚3YžMÆ9ûŠö3 4%Bé¥$Âû:!zæi2”@^’½§öß$Ó— ‡}gŽw;ßî¿ýf®Ãïo¶ÞG§pêI£ïS”U¿¯EÇ7V)á2êÃj½n'ú-zN¯°ï+ ‘Unð7£mùö[´GG)®u_•ƒoßÃy°”žóSýÊœ1ÅØf„¨#(’é–¶ó¥ÅP¯«¶IJ?‹*²¯.¬˜ùô‚ZAÓ‡m 0[\U4–9’´wX 6ä½xÊÂ3|NMZøŒK4æ"tƯªt\iÔ’²Öü¡÷+â Ç¿´³&œÿ·Q&U…0·}ý²ó4„Ad}~£êq‰ºó=Xúí芣™iËÜ7|¿&)Ê©—çG$ÕÁ_oïî’µ•JœÛj½ßŽ>B /·LAÜG§ C\˜ˆb_ß± ¢Þ*âm B¥×wèÍ^ü¼¶ùå°¥Çǃ6tìÜs1çÏ1:êc»X–šé·¡öÇ6Z i’&õëm½²ý·¶^3!©"„ C žªù—í­½í·ïƒ‹õ]pN[º>ÎïúàŠ]<KŠ]I\`Ü~ø"ªNÄDÓ¯§ ÕèÕû<æ_ÂÔ®TÒp†8ý/5á\XÎÔ[ú„“ÎöݵFKW ÝÙÁ;;gŠ Ø™S¬öDEƒÙ¤º#û® YôÂ^‘IËŒÇÊáè)–a8ÄáGŠ©‹Qí+rpgûn8¹'ÙXiua7û[S•¿å÷jãªþ‘wi9{Vhà}KÈÍã=¬6«™:Hü%I»fmrá^˜¸Š–\¨R$Tfþ“#ΖGÁF:ãšr_P¸ðñJ¥gh|ë€AãB$RY]¯“Btñz~Í4¢ûη“êåäxÉ..*«ªˆ’x2³ý ÑÄ:CsªÃؾ{oQJVƒNϱjŸQ2°}´à'«®lÓض[ êT½Bê- CãöþaÆ€ä€Ü§Ôéq³~V¡Yé¢ãq•$Ÿáµ?L)ú=™æÃiS=N 9#s}q íÕàTÅÞZ* UBÎ*i2& t~Ã[¢â8•µX ¡¬ð`–hê,HC4 Ô$оŸ;e‘_L*M=)Añ\Eíô²QrÓƒB·fh]ÿšºcCØÑ ²‚©€ jÛZtôÑ!µð¹köeBëA­ð¾+Õ ,Øø‚x.ªŽçCÁSzÐ4¶§¨CA[V3ϽfZA\wšð Žg·!Ú¨44þüR „…šõZuX@`îø,AÏã§iÃã(Uø‘Ó šÉ½9(XsX†Ê:¥u”jS9„™ ½o c ܇>ÓÙ³x¦wæLæ¾;ykMØì¸adw‚3©iT»…9‹Õ|°õç—jÝ›Î3Ûõšý¨8¶é?ÓÌ}æ˜ 1VŠ-8!BXSxì.Ïg‚ œ¤r½n@Ù#õ¹ ^ðØÌS•¢eäƒ,(‹Œo’ª¨:üË pg·¥éÔ¶†Ã…X”T…þÔu’V‹²‰r‘÷øûõêÛ‚ W½·HuC‚­é QF<§é¨Þ[iY”‚ò°Y»6ŸTÐ6²´ñ I4+­–cr9CøYiYä2©h >¶æŠíTtÖè/$¼”ÙÄ•ëcx$s@“CÀ{Šƒ×0ý8ëü³¬_ÉèÄ•sV°„_¼æEñ+9§z1¬$Á^¬ è²‰¥Æ…•ÎZrŠÇE ÓKYÙfˆôÆ-÷ Š5ÍÌ?¦Ö¨rÊÂ5Fã¿Ouè„yæJ¨Ð¾*4Ä–u°4g$ì’øÈ„4‰äÒX©“›¦³¹§AZ—6±-šB)O[ÕÎØ 6>Éy4ôú‡´p’~ÿ˜t6ôE£Ïï­.œñBQÅÑþËàlÆÇ~%ª„w¬çĤ0êœQ‹´’\sÔ¦"5 ¡Ÿ]½k5v€ ,»N/Šë„Ą޵ BqƒÔay0 ¬¬x± ®“‡$žL£zŒê3SÅp¬wÜõé¼æÑµ•8ÌÎÏʶVÅ ÀŒ‘¬Å¼æè¨ Ü÷øÞoöˆ†Ÿ[=òÛ3Ö°¨$;MrM—ÿ§‡˜Ûë(M§’˜«B°á{f OÀ1gO²¸£â!.ƒ&ã¸â˲}ÍÓH¾ØØ@ç>­·)ž6=S7.¿1¼]Äé‚.øõ«* ä©£ªñ[Ó®ÅNM jÞT‚‰¹ŸD3I¢%qËL´ƒì$5cDA ô˜¬”œ¹í¥ä|¼o•õI›6ÙçöGÓñ»`àtwÞ®åkO¤Á§ü¥«$Ž˜e˶Ș4ö$UˆÜ ßïÓ+PÔ›}§’ºšA½‡A?;ØŽz!â½è2 ãœÃBRzºåàn¤ö~'b ‡:wn›t1¢LÑ¡öìK6Œ…ôeæ]H­¨>òÍ¿ÿ°¸‹f)Hõ]ˆ@Xʤê´Õôê¶Ü=¼<ž¢M:-Æþ d>• d$©)æ9-ÍDSÖùÏ6zmÑ’8ö,½óhgmbZk*ÇSmšÁ°T¤5}ûÂ!"0¨ŽjƤs“lY2Ñqý´Ù>"Q £;)ˆÂÛ¸_‹$ß{íØÚcBL[Lü÷öÎ;ÍPÄĵ1[}L óÙûñݼJ ƒáM¥YךσãF…á‘™RoQŸŠ¶ƒcºïÊm.@pƒ“Ä1µÜ“=qè—@y¤îûOÕn«ªÀÄLÅÀÿ\º ºÈsÐî”7] ˆ[Ò+5&WµJ'Gàø¿z`à–­jÉÔ£ó;–7•Ñ™µpW£ÔQGãÜK8ƒÆ‘=%,š½¥Ž¶ò<ª¼«¬[”ÕŠ~y£ÉÇÄVģ׬àÎóëNË&›>Îb¬®A’j„áªrÙ€ÐÍèëjj[©Èµ¼c_Ì`O 87 gp7E9LŽi{=Î+>µ¸ÁZ3PaÄ—Æè®.”8âI¨C#+ ½9MZà% m\^E…KÉÛ*ŸÇh,ëM‰oR\_¹r±N'¥¾ V‘6ÇlðhÝ]ÖGVSÍ ã`¶%_¥@8–t¤Ú6f+Þ‹ŒS}¬#¯Ma¨ÈY$ŠEzŽz`¤Ò¦/s^?"§¥Àw^ŽÝ¹Îh‹àáÓùâ2ˆ34®$BrÍ3"¿Û’*ˆMX ¨`'Tð&„¥ÒúŠ>³& ‰JlQòˆ QaùÇf©¬ªÁ‘îZu/!ß VüžžBÙíºÑ9¤jª¹41´Ïm"-ÈB)üg)N¨AN*Ò¥b§æ¤tró9¤n¶™Kê"—å78Û,\‹®aåUQÓ¶.ð<šõõžY&ЙS|Þ„ÓÍÕÍЬámà`·ã{9^ò©ÇØr¬Âìë—ÞÈ5cÀ5=›!1[¼Ax$ç| Ðpæv¥±òÁcI¾ QͧËï†CÏÞ 5åŠåܹzQª/¼ï¡¦’“.ö ÀuC(éɦ—U3®È¢ÖJõG‹ñ•´·òÚN>oq0ŸyêuÕÀ8oÖíÂú –.ý¹®­ÀMº(ÿ¦Sÿ* ñus¬•Hô¨vùGt WÉSrö”ËõÕØ<ݨÐÈ_ùð´v©7cä "wa—Âǰ¢¤FxÄøè[xz‡McY»©^QIy?Äô ŒÛXã¦~aÙºÇ<®Ñli8/ŠË#zWe®Åô”“cÔÿã1ÌWÕ#©I}=˜i·åËÊ'°i‘(3ƒøò "ÅÇ)¡Ò˜´R溂5X¨õ÷Ï^\‘à5[à­%ñãf- S– –ý’ókãU¡ÃÜ`™²â ÖÈz‰ªôæéiÅ£õ’.o7aG¶®!Dªb[™j{ß„©® ̇À2ËÿTæåD>‘ÄŠ2š´¯]„±òÃYZ'^!ðâ½í™X¬h“ƒ‘Ù‡hýäîyJáÍM)ÆÒ¢R>Xçó®>ÅÎf… ·lOP¬›„qÔQ7ƒè]N4÷/°)þG™V7ÿãA·Ó]÷ãÿ­wnó?ÝÈÇŽÿaÆü6þÇmüÛø3âì¦USüÝí½ËÅÿ £²Ù4V$3Cƒ¸ïŠ"¦(ÔÌý`4àh‰¼½g…iŠ¥.+7Æ9“v/úÚÏNèKZ]RØ „üh ÷!ÒÈÂÁ>- í¾mø¶`˜…ÆÞC‡ö¸X\Žlqå€âvù@A<8z„ŽÞq±Ð‹önÁ˜—Ž×q‰X73}žC‡æ˜—Ã&ì¥&Œ¢§ÍR'L¢"pØ«ÃîÏà²ýY æÆ’ãm _œo˜ç åck{d¥£¶ŽU+%^£µ9ƒüég,Ujîn¿;ÛØ(>‹á/=f ³Pµh±ð3cÌ `íqðgf wWlpü™ÐÙr®æø?ßé‡ÿ9Îþ·Žþžo¶åzA×¹QÇ~ßVú]gþ…¼ø-O\Ë“xaÏýª[ˆ,î¦/.ú–{þ×|‘˹ä{ôœáŠ¿xcüZ3^+a×{qp¾ Ë½çn W{-G¥ Í/äWoùÔ+ø ùÒ×çV•…ç}§yݳŜå›Ça1'y]!çøù­59ÅÛíxÍ\ÂÞñb¿˜¼Wuaç÷ùŽïÿºNï×ãð¾ ³ûÒÝç8¹ûgÜ {“{šõƒO£kû ·v[*6në–s»#‡=וGµˆ,(™r)Š{I:3Öh*Ï(T¦Ø÷3)©Ì”Þä aèfÅ óGá†"Ð]ÁåœÆåš\Ηéo.ãvs®ÚËôÓ^ù¹~Çί9ó –Æ5zÈI°ÙëøLy«œìŸÌëøÓ¸_ÕßxRîC0(ì<™~8NwA~ ¦B‰Æeê{׿迺“±Åa<cámwNÆÎ+c4‡[ÜN±EþÌòÅŒAcaeŒÎÓm¼{KíçVúÞ½»ÌÓ³ ÷ö<Æe¦Ññ§®ÜØà-×Cü‡oþÛ†¥ÈajP@Ù *{ø]¸h™âý•ãZRîr‰O¿<í7ŸdujÑEš³ Pë#n‰/š*üòÚ†þÖ7ÿJ¾ù 8æ»êÛG|·PC•åûÚ7úÙ×}ìýëm×zÛ›}½•›w“'½íD¯üçC®óŽ×¼ã0?ÓWþúÉÏð‘Ÿã_£Y«Ñ+^;Ä_À°2*4@6Í™/µhLbñSN“¨íFN'ÅQÈö€y•e¥g6…öèÖ…r[³ÍšZú]L›Žkmƒl¼ä™é ÝÙœ•dó¨O!q+KQÿ4‰÷;À°©¾cc©!wmŸ­ûL ¼ÕÉä<Lu‚œ=zÄ''ú>‰ yîÆ­î”ä|¨¦·#Ýh`çrMEû&ɶûgOªH”da½Y•ç4çš‹Hž×Ú…öúÃ(Q¶æZxƒ;ͱ lKY Ù•?¬Ûöu‰'Š,aoíÙžÚ+M~þóܱWšü±/ë‹]7sVíÔÅ °å³· ‚–ÏÖÚùn‡–ˆSnÑ•²,çÜëš3pÉmòÅ]h®\¿»m}ÞXm^ÓÔÁw ‡ wŽûŽÜa=ýƒ0UÄøŠ,u¿‰›~FL’»yAi*Íq(4D¼Š÷`}*3Ü¥ÍâË;ì]Ì[ÏUò.î#2tìPé8”8´ŽÇõ]&ñõû <ÅôeË’™>…—صû.-8uÎì…iÛQ( ÷骬²j|9›ò3@Ú1£˜—f¦Npœ‰zðê£æ6„ÓmÕ†tN·ì5Ÿ¦:þ`«½aºoº­úD ¬H%Ïgä+ÔÿÔ®/éi¥ÑãDå%g2«_ô®×Àß*Ñ`b™z€çÆw~ÿ…¼æþy>žÿ_ÙOÆ«ev°Ç?ùÌöÿ[ï<~äçÿ~øèqçÖÿï&>x•ay“ãßc¼yØÚû÷½h'-Ӥ肈¶›¦VÉ!^ÓãuÈ ­’,×¾€/VËê<'½8òE?ªN˪à `Y¥òÔÕ¶~ØûîÝÎFýur8†V§ÓsxL¼ÈÁC=üå°øÏBá–TLØw º6NÈÝj÷ÅÖ[öÆÊ<¯§á¨ÚG ®¾“ØÚ{÷YëV5¼ÉHëZ_¿zKÖã¯ñºàÕ¸ZƒS¯~)ïüǯ|·ó­®ô#­k§ð~¯^‡ß|¥^}å¾{þîÝkò¿›LrýðÅw;ø¬˜úÙî=cŠë§pˆ¢ê;i’¯Lm`¼V¯ÝÀ{ekÏîaŠxd,Gf¿À²Ê†t…2ÌÒ|€…9Púi6¨•¬NXhkü0ºAZnõS¾'{ž ^NŠQRÝ¡]­— pjÂo5ëT”©J\ÃhC½[}f}S舞ŸÀ›šTÑ©#áÛÑJÒŠvéá‹“ ‰GWÑ•p@6½«ÍÐhҺ׳þü©¼?³ù§Ó©ñÿOž<ºåÿ7ñþÿOËûµ«í.z§lX[@Ð!5VšaNi½|/ÕJ媓)p¡—£ê%ò%eц, é£ÂÖh'•|xá-;Ù¾ØÕŒ}«(’óµÿ¥Âx¥.,’46G/ Ö.‡´¨bì׊±ÀÚ(9{W ð(¹~º®MØDÁƒ%¢í%è³p, ÇSØ Ó_$xƒÆéë§Ê†E5` ©~×:ý3cDïå~1Õ°ºr›È ÕÅÈô£o6¥8Ÿ’éä‡1Ë¡§¤ Ê¾ìˆ:„8Jf‡#ø~á#† +œWf;h½k0?Ä8‘ŸúÝŠ`_Ä£˜…fyÜs©E.Ç“êÕ¥!­·”²å3 [MØY`~ºÐ}žkzÅFᙕo'°q-s´ÜÝ];H«¾+4´·½AÂ&™  AU/‘¬Í¦WpØŸ€, óä ¤5ËÃ!'Eë’ˆo0ý#žU1r§7¼B>U_ðB/£lú# /BôBÈÞ¼‡fØ"‰ ÆÈ 'zÆNåX¤eóUKèŠ^ C«>_zðÅ^Õ?T¥íTw±ÍÞ,û+ŒÀJ‹c³Z TO;”«0¤J_¤*«Ùn—+ë²i®ís¸W͆ަ–é½ÔkÚðd}«Fyt—ÍuIzj¡Š¼™†X…ÖÏŸ~Aš)’ùT"e¼¢’ x…)„_Ýå#Ofö\:eóÙ@b_1-Œ6®X1ça:ÐÌæþ[ô±7M#\q¾R«÷V{+Œ”‹1³¡FÎñ¨‘¡F°@áWcZ[r2øÙãòB6T'Rbýõpm£…£–Õl*±©Õi..æ–ó»*pÈ»~•äÌýaŒSXñï^ìÝUÁAàQ Ä·Û/t‰ïÒ³@‰ï¶ÿK—x‘L(ÓX¡N½øn§]ïöoÑóÉ$wK¢Æ°MÏ™J è:<h:ÀžÎ,m“îî'ŸS…äb‹× Ì0³=Ñ-Õä}¨,|ÜáÇlͯ?®" Ùt÷Ž³Û ¼á˜£ËpS_@yzIòãºã9 3Ž X ò´Úyj:Ôoq±@{ÇlbG|Û¬Ø6ï" 94‰±¬Ú±}ˆ ZÚµ 3äfyLbTÁò¨°Å &*iÛ–Š64¢µM7°á ¸ÝÙÛm$º¡¡sº4Û&wÙksbýªeë/«kÓ_Þ~®öñõ¿“qõVÞòÔÀsîÿºðÖÓÿ>ê>yr«ÿ½‰®qwÌEûÃÛWïÞ¾|õöÛèÛ­½-dP?¼Øûag;úñÕÞwÑû-øçÅ»7ïw¶ww¡ RÜW‡“bCÂD¾,²ê#ìzÓã(ÑÃo_}ÿC;úaœ‘BŽ{À°_ õ09HU¡C©óŸƒìèxmpTSæÊ?ì¤xkH½¬©tÍUÐhËüÍ.Ì ˜{÷·’DØù&xâ º.[Iô%Õû=yB%µ†Ö®õ ܸ<“xŠ~Àð5înlmºbÛTÑæº‚27¬Xaì+ŸâÖÆUWžâ?VçdŒt;“ý•ð±ã~}ñ@R{ø1·ÇÇô»ÄÒ䯭$Ì}£@Ññ;ü]’‘ð½§mì%¶Å˜ÞYè°ö— «ØŽB ]ÜÞϦÅ‘°¬i4Ø­}¨QÖÀ24Ã7ô›ž.†êÀk’GIØ% c€ãð†5¤ÆJ_²ó;8Y}ã-ç0ˆã "ñ¼ú⋎fH•óžý}ûÅÞ»ëá‹ï¶vößl½·}û·[o^½¨Õùêå;ûç»7[{µû Q=·žþegëýwû»/^XϾÛÚýãMûö¶ž¿Þ¶¾z»·½ó÷­×ûß¾{³õêmèÍî¶Â«wû?ì½zm7¿½·ÿî½]æõ«çûÏ·v·G»{ûµþÐSÌôì¿Þï¼ûÖzøæÝÛwûÁQ¡7Mô¤—Á~ë7Ýð«÷;¯Þí¼ÚûÇ߬ÂÛ{⎬„ö¶ž¼ßÚÙÝÞñÇ %cŸªMçÑ»÷ûHëÙß~ØþÁÆwgëí·ÞOg¢¢-ƒýóýk âÞζ …cûçÞ˯lAzëí´Ùðúo»“¢²¢œûóy6†Åõ&™’æ„=è ŠóJQ-B…wÓj‘Â*È:Ànx€¼7õ²õ2{I/O­gϳŠ:‹× ÷ï»/þžb¼÷»øÂF•^nSßž“QÖg@æñËl8±òÅŸÿàÅdÔ³~—”‡¬Kñú˜¿W “_—]€úP¶¡9tÃv;.]2ÃÃðèY/¼ïÃ[þ’Vï¦v ‰Nç<)«E CLæM]|þ_ï‹ÉÀzö-p úï“êÐÃå}‘ÒÝì#l[öÃÉZþvœÛî`f÷§³~P'<ÎÚ§yr¾‡1ýͳ=@çu6Êì¶½jhGC|û;6¨U|‡þU»pR¶I€ÇwL?Q¥µ7Ä`TºÃK^ŽõÃç»$CØOÔ\®=£< ú™½Ö¬Ç)’é!ì’Ö#MïY×ø =Vá|å6ô}zކ¶Ö“×é°‚Ù0)@ù›ýœ×…÷Ä…öf2žø8[CxêÖ§™à¤G\ênVÞ½û'8‘rêêAüvûÇýoðÐýoî%eV¢\÷'8øeûw“q™­B—G¤ê!˱Õ% Êüb=²~S e#ŽÖÐî Öê(™Öža€8ýL§šqJÚ hÌS§ˆó¦Â1Ô?é‹A@õÃ4ožT«ÒÁ]?Ñ¿Nˆíë¼1˜ô÷„K 8õQóªªz@?¨àl´Š£t õ@~@½ùa=3¿­Õÿq7ÕŒ@Ê)r6…Õ…JôO‡qŒ€ºsÛzR/^5ô*0³ôónè…¡™zŒ3ÊžÏøÛ^ÀøÛ°)É î:²žÉïêÐVý„1Õ;üÅßP΀ç h¨ß„­.ú ÷}+@²Ðñ‡þb±hþÉ_aG·ÇÝžìjLBùÀ!m0îß”¸+Ù ø `Ä(L=¡_hÎK$ú‰uIÝ 1omÓ³ÚÒuŸªµKD ¿qà_ ¾0t-ÒØ«áW¦}øA_þ™Ô¥¾þÏÁ¥´1'ÿ_§ûÄ÷ÿ€oõ7òAýŸ¿jt€´ˆÒðM ÀŠŒ²ô-æòRäWúíEøIRtL‘'ÉÈU­$lFö3°)½}HVµŒkd’‚¾æ˜U»’˜+Á7ï÷þ¡ïë°‰É0úUßQƺ @Gåmƒ¾¢_÷W[Oz¿@Qãø»es;š££(>Z‘¸øV`ï•ö‘峦’¨ ^VQ6¢¥çÑ"IÙÜø:³”š› ÝñDl™)Ø9Fã ö[nÌ ¬©Ú%Ã.s½‰¯0£ð¯H¨v´¶¶ö»÷<Ši(Þõ~ù:xœn¢Ñ }kqdæMzÿ6ËM}2¦2ê6ÒÃñ,UÙ!1å4mŸý&jtÏL®5BûžãÅ_`šã…é‡f¨2'ÆÂ´Ìf3»85¡í…èi¼6ªfsÉê'´Z´´Õi€ëi³ÓÆú›xyê÷I«íö˜üJõÏß[¿ËH¾¢ ÂV¢*'½‹iTÚ öº°Ñ+VÚÔƒð5NwíÌnbf#H/&+¥Vµ>1…Yj»¸NŒÊïdcæT±z‡ÿ,ÖAqSàþný ³ôìî^ ïóTÂëËN»örñ±0ï *v'ô¹òZôú(±ª>A7kE¢Èíy €érà¥E… ©¼ ͽ«Á™G°ý¶‚cyþ¨%¯FÓIYf ö;LEÖ‰ªxÏ[´+QqNºÇ©S‰ÂܤwÙø[:Ï«Uλ0ï• ASÆ[•¸äŒÉ}ÃZT†4²£~¼¹!ÌõY³\¼Ô²$QQ¹‹Z³2Àaîöz29"©Lø[[í\j?Ré¢Á$-Ç+‡ùqw&4 aâm¼½ ßÖ™ÕõQ…=hº²_Í¡¹ \ˆ<4÷ìì„ó)””ã©C£†,;ŠjªÆMÒM“l6؇ix§žèÑ,ìûœòqvÆÇ»wlBò •»çPRU™¹0ãZb¯,RzT”èè6Ç6nÆ$ÓoF»wî°[žàlQù[‡)̈ScÆ£Øl­V[søÕÎïíà -cŒæåé!µJ0S’H×5ÉM% ¨ GTqšLydbIñ˜8eËÄ­—Cáy8½ŒÂä§ŸÍ:Ò/ÍÈÆÉtšŸ‹@KÒ/Çrw6¥ßœRÞ™¤åNñcô·9À£llÄê´ó–•‰XrŒZÕD6Ùfðc§oÕ]Íf"»%'„-¾´çw«\’>Ài¾q&лë›Ä8ö[#TZÖL vf\?Ñ‘F˜Ûá[ ß‘¼–œGwìtG†2¦u“÷ȼuÒÝq29ÇÆM9jzr/’•s·?És´c^½ƒ&ÂWéÖç$5j¨JÓÎA9kš î[ U ›¦²šƒ£2÷Æ<êOãMÕb(KaÓퟭzj·t8CO „Ÿ¨ÇŸÞg€×9†„”ñ‚¯Ê›®^z}Þ5eµ—õܘÁÐș瓭#3•ÕÏ;Ô†vÄš•H\-Pƒ[å2sÑ„þ§,Ya_à´€ŸÆ< $DÐ[´ä“?¢šp –qEÊQÙ9Ã{#ð‹,J†šÆ&Æ–zUc‡»AÃzÃ-=NìŸ×Úp¢ŽQ$ì‹>Eœ¨æSÈrÐ|~ذ'`|åF ÜP>Û'"E|ß’ŸOn¦×é+•ªw!\¸¯jÕ¼œä³dìÃ*¦(顟«›ÇzŽm¥×ŠzzÊôÌYvñÊ‹ÓW3âÆËÉÜ» ñÛ½¢‰ÈBô'þS‡ÉßV'Œ6`Y ·˜HÒkX„’ô‘é¶(¡ËJÚ†—óÂT¾ÊæW™Ï Vþ£Ìg&ê¬ MÀ–Aõ Îçæò¼ùl¨¼,Ê"Ó~ƒ×b¢i ³?fÕaÛ$-¢Ÿh¥‚:2~Ä'h&R¤Ÿ”Ò’ 6þpr 2g/eßµ$Ï>¦í¹FǨ˜¹ïG80ŒÚ8Út¥ØO û¡s¬Q‹0N#8AŽºžã© å&\¥jác2^¼ÐuVª³¿ëœæ®‹ê9±ÿ¢³•V å‡WsN¼¥GëGè™ÑT‰Ø£¤Ê£„ÉÞ¼žEœ¾6„0ê:ëìZC(Ð…2ö!Ú![ö9ÐMµq½Ä;¢ŒŠ~ðër$´®=­% cL¹U TƒMNÒ¢–‹÷Ó>enÇe0Jñb¡<̦¨Ï‡Fï·Ì`¨aõvîè¼\cÕ5ƒÅkÈFVd»f6×o ³%”CtØÚ çÇϹÀ(†:î ••=-¸B"êý¨S7“qÆ/´þ™Ð[bŸù(6,Õæ±4O;£QŒ1ñ¢ðH]ÊËøu«±èØÅð-²ÂN[²Ãt82ªxU9>Œº¤ªp]TWA`€]ÃåAÿ/ã°·”6fûu=©åÿyôpýñ­ÿ×M|´ÿ—å¤yÓþ_ds¬“’å,êÿEÁ‚þ_»Û{—÷ÿ"ß/2ðÝ4—w%v¡vã”*Z éj—±ýsA½œCØ&Æ;>ZÁ½oA0 ÁxÐ`AÀÍV°ú¦üsüRØ<µÃêWR*`€”¬ÊNRaô°W®¹V¼Êƒå¤kÇ‘Öו“v´<¿n6ÜÓºƒŠUùrþ)qƒÆ ¯ …RýÍe\SêPftðrÎ)—èãŒN^ƒÏ‰ßMÏ¥$î4̇ƙ/æYƒåæÎsÌi%‡'߬;c„4à”Ù¶múIýƇ³Œ«veùª¨õ£lÕMqïÎáÓ:EÊÔk£|ºð¦R½Â¶F´ gú…f_¦8k㌲˜ÄøsW}´rÚj¸rwµjPŽš¤hÙÕð“qo‘†kà52áÒ“´87~åjÞ­˜Lº”F@¼£mµÒDج|5¶)ë!ÃhR¡e›·È ­y¬ÅpÐõ­f´tÉP5 se€¶xç.×dhìçvóò½›×xÍ¢ƒÊ¹e”<`9^HˆvÃa+a§¿·­g+òpÅÃ?Ã3ƒ¬š–_ø_Ï‚ßT3¾[‡ÃV¸ŒÇTx&c¦VL¥yi4¿YOÓ”µ¡zÌOJì;Üê_ÉUGî6æùè¸ÅBÎ9Rb¶WŽÒÃlÜqÌ£wœ´c;âÔÌ:Ó®å{3Ïéa¥MN7¾+Ígãs]N«J÷œVŒEýMµçõ6˜ô†\-¯àlyî–%%Ù”­¨l:ˆþ†÷«ò’çØ„õq–·¹“Ï<­}Äá¢#2Z§þäxŒ B홯Ö%Ô3kjL;ŸßãßL!ø‹ù±ª„%è~á—c˜;õ\a±²r±ƒò Ó"÷ÓüË.TîU ¸|+Z˜q!Œ‹ñ-ªQºl«l«Q˜WÃ0-³742-½ŠÔ‚ó8Xãäõ—a0oåù«Ž*Í\t î"‹mþB#D>ý:“\<_Kw*Ê»à4•w—¡PÝÌÈR¦ÛŒÙ†å/4=­ Ÿfv"œXç’ss–¼¶¢vË6ÉúÉHš¹FX:·y¦_vV¢—Óp†ÔКy¡c2”"I¿o‰šx{Ñïk›H¯D£ÜuçŽÅ 0«l;R>iZηø¨´( ¢DÎwûo<Ÿ]‡|pN\ÄןTÂŽßû ßþíÚÕ}ûú†îs]ù#ô©mv!ç·‹ÄRÃÜ€ÏýõxƒÏ$Iþy’dùÅš$bIÙÀõôëA¼›Ë¢‡º«Â¿ža• Ó£éž ?¸3Tœe4W4}%T³¾Xƒ[šaòÊ‹lÓKFE#º3­VjUçËY„“Þ¾I[ëíýfiK]¸?»ð:fýˈ)˜Áu5Íz”í¢—háÿaý°óà¢c_×4 ,´·ö]I6_uV°èJË6‘@¸èt¥.G.tf @1š :ÓÐñêuWÓV¼®H¸8©Y‡;%Sñ4‰HLr¦IdÏ“;Aªépi\ÏSï§'kqT(hAᇂÎ,¤`Ÿ¥5Ýû|ýz‘i—žÍ¾ßFp:%•Å YÏÀí® -lh"oÖvI^cX®P®²®´£f.‚]©Ù-x¬›R@7„<§w§ªe™De%àåɪüfQ5ÁÉ¥Hz×5™ßeÔ°ýoÈþÛÎϲ ãÙößë‡ðγÿÆâ·öß7ðQößNNžk4ßÕ©H)вeèMÖÕÆRÛ˜}‡2œòIÞÐÜ·“v0@}PQKݵÈf) ÓS]±¡a˜7tGn^ÈsU~3¡>Œ)6ã°Å1Ç¡«Ó‡š‘!ð4æ«Uë©@†1‰ ýVDw"`"H*ÄîG§‡)…J¢E‘1üs:ˆ%=^òÕoVbveu¶pN2´É¬ m†"HcléMºÉ¥gk¦²S ùn6dHÖ3”Û¬È ²@tÇ’²Ð³ìÙQQhQÝ¢…lqHFŠE6|bc½R‚ YS 3_e0YGa˜[VlÓÌ3|þ©×èu~šøÿÒœþŸ¹ùß;ëÝšÿÏú£G·üÿ&>6ÿ¿vÞobˆÍ×3ßÂò¯±|vêùœØ¾J2.÷QYûv‚nÚxú[ôºÒ_ÿ"_ó bòÀ©‡ÊûÅ•oÙÔþG÷v¢ãæTn‰ƒ¿QÙëyf*-%úîD›s„ÄY«º9Û^ƒ±1f²±—›$ª7ˆÎ¦ëÐä_*iÒ5Ú T Zb¬ Û*cå÷æûëYVfˆùúp›+!G—†î­VÏ™YhLßgÝíGƒ©9¿à0¨ž-iF|?àà~ôEÓßÛ¯Û;ìÀò ÷b.…±^Ñ?ÌòAMà™ƒõLÐ3M ðC¸Î˜;ª-Âm&‰šM1øÓòÌô§Èþ"“ƒ)q±ÙñúzgÇ%&·3ý-8=vŸl> l€+½¾úŒã&ÛÜ¡˜R ›S¤i€­¹ØÀzƒw»Ð©Û[Òq¡-BíÍ·¶Ž…¬ U1alÐÚ¢,ÂN-3šu—ü¬Ó°à—†-cèbîŒùu)€ ï4ù[Œ6ô%^zÖO§t5…oßWú&¨²Jã»5|@7h&|?_ Ñal›Ž®¸]o<Æô=3F°t•—¢-Ñ] £Ý7¯'÷]{…îð!kPÐweÜBÞÁî@.*ãI‘Æûq¾Q«øpØP^g­E|Ò²ŸLÓ“qe!„?×úIž÷ûtøH¹€6Xa?;ûuuXLN¡êÑJ«õÃ÷ V1ýâèB;ƒúa2ä€#ú Ôlû]ºð…)ýùN ÇúYv°õzçM[únëí·¯·wXla=cõ;އ®†K¡!vÆÂWby¤g*!põR˜id ¹ñŸâ>hfå¿NxAÿï½ûöÝÒÛ˜Ãÿ×;ðÌåÿÖ»OnùÿM|^¦ªÇ;Õyþìf©÷y†¹)óz;æ§·ïâ­:É“œ—ýîÝ·é©„žÇ¨ò“ÁqžÞʘŸÏÇ[ÿ0è'I‘ÁÙe&|U.E œsÿ¿þð¡ÿÿøÁíýÿÍ|`Û ¹H°}cÔb|œ•U†”QMÐí4Åó$Zi(˜² ˜‰¾ö1™ž³¾EÉîúúC%÷ÓèeŠ{(É0Fþüö¯Rië¸:œÑ›¤ª38?Ï“¸‡þ³ª²ÕþÚ¤8h‘diË4»Ø•hãÉ—wå ý#º –tô8+A(¨NS4’=DGÙx@©0öQônœŸ“ýÔ½Ã499¿Ç‡ðûT4š¦H %œ÷óþq®¹fr¬îšIO2~È¡ÒY2^S^Qü& 9ÓJf¨Óƒ¶F(¢¤gÓžOî¥ýä݉«è(M§Pc¬ $E‘œS{ ‹SPéÍ«(yà›#¹ïEHŠ´:ÇÆ°*W«eö1]S2YÈuÌ úI}µ‚¡¢ý‘„B|ä|ñRp1LQÛ@Ýn(¬b—‰L™šzÇh¸ûo@9P&H2 ýštSÄ¡KC†áÅósEzÊøm(lHÓÊo6ŒÂ‰pá’ºÔ¡*³·ÂÓ#ê•ÊÑm-‚REŠIPXÉù S´¶ñ9ô`Ø ù #ŒæBEÅmhŠ|ÛLçTeȃJO9ˆ9Þ;a¿’f¥yÑóétRÉAHÑSVKκ7H§xv‚i+s^-‡¸©j~ÃÌ9™àSBážžUEÒçÀ¿Ãè^Ú™Þƒ‘EÛ<©¨'+Šë-§é·‘ÿÙðš]}¦Céb…ñ"hP··¨ã2MŽÒd¼]ƒX:Ÿ/\»;HŠÁ·šmÌ­q‚Õ…°::.ªI sdn†¡Ò3É® —VÈè\¬xj‡ ^@·'#šçy6Na'¶€ /54™Ì@¸[WÆÙYôUôo {2…o›°_”É0]ÛBvºV÷¬¢¢oV錋‰˜²þ:ókO¬Z‡”"LQÎÙQî‰f÷ꜗ«ÿ¿½§ÿjIr…¿BÌî{ÈÄ8Ødބܑ„\²“„ÍÞîíòd[¶ìH2næþö«¯þÒ‡mÀì-~3Ä–ª«««««»««ª—8íb<¤áè€q›w¸¬ù×PƉã6&CÒó«Ëº‡j^!Au¢Fé¶gˆñPà×¼t<ð&ßÒß6õ·–úæmç5½ Ûá N‘˜5¥ÚŠÿh*b«çJ(±†ŸRPÓ>40×Ìh[ÓÃÈš~çÂDƒiÍŒÝ\ۯϺ1+ì‘!6ä›Až…zàHËT¦­8Ú&ÙÊêÒÓ:•Lq2AHäC¨/|ª™BÈ ž]êò$í¶¶4iw-ÅaaVÓ ¹Ë©YnMŠo2»ýfœ¸ÿõ5a±OëÌß'˜š†W$¦Ð.q‘íÂ,¾ãù~­îmÀü",“9Ñ|Ÿ(côÿ°u ¨‘9V£8õÉ6µ‘ë†n:ÙÂ?›ø§…š”Ç|I5OZPñdmÂçÎ7Ù"Z&­5¼® þbžÆGMÂùHÐ>Ìù#¼qÐ9í;Í‘²–^-”6ÅwAM‘û˜Ž×{?%@_©;øCÄqTÔ#,k3EBqíÅú„-‚/®ÍU½˜ñÕ0,Q)KmŽÆJ!Ç‘sÂGï0"^o66 KñBÀñ8.@°okƒâ‹M|ÑZ,0¦)môç#(ãÇkƒõVcc:üq¼jC ìžNé·$ÂV÷¦]lV—E€Ô¶°ÛÂ/–¤g\Ùæ:Tµ Õ`ÅëP×Ú öªnA@`³ Q» =%Ú  ë[\|óoQùMU~«V[ßDnAÏîY ­ÊV§ W¡gb4ƃГþ)oZ•Й$m¢ouÖððõ¬n´üÐú[NÆñžçïQn//1?y8×ýHð"4Z'–7Iá ‘G/é[þµÖ‚4ç!Š‹B-Bbëø%~Ë¿Ö-&ýKYÓêÍÏu.Ìe‰¼o4§ô8áßÇ&Úi7¸ìªÇŠ÷°uÂFŠ©ø†Ü-Gv6éÂoZÍqbõ¸E‡N`l°.%ÂA•òrº‹”J7} ýCj… PGÀÒì‘´S4Îú ÆŠßÊl@šÿÿÞš»ýäíIØ[dè'}fØÿŸ5Ÿnäì[Ož=Üÿs/´ÿY}.Ö7:áì0x³!ÚÔ†ñ[²y3¯ ×FdžBïmeWÞ»¯½@Ÿ-zøæý/_êd• “4Êh‹òïÝ9< èTÊü[7:7ºg‚þÍÞáëƒ÷ŸÞï’'DÉc"…‚Eie~‡Ø„~t&©÷ò†çíÚŒ1‘Ù-å»of˜àj¹Â¸ñþo¹½6½XzÐ=¹¨ÞùÐD{¨Œo1•ÑI˜e&Èâ«vù~q]Ð_Y©å®Þ¥|×Â+ÜGê{z}zàzë±ñ½¨ÎnjÀ¢mqО ÇdHÃgAŠ`GŸ„i qI¢kîP§tºÛÂøõÛ ñ¹ðÆ!EŧHükÑH†Ý1‡¿êOIÕž§«Ñ/"Ü"ÞJI xºB%Tï9ŸÒ‹…ÈŽ€\w>Û¥¥¶·w¨vq¡Hù§Űî¡ôOïrqlELhË‘“½QÙÖ¥wÑ ®Fˆ¹3ƒHB zŒÌâ)ãpœIv¼’ò?m( r+ý&Ó > ÛýK÷0‘§5N# -LjBèb@<½`ã¾h5<‰, ]÷Ú@úâ9½(KÃ~ï‚$ê)ã ž$86/i0ÒN”ÛU/0N[q'Ã,+rgHœ†R«#šáï²\J9ú g¢Ä´o€F¢„þÁF'×z™\ n0ÖiÄBOœœRC K¤Ys1)ÝÆÝd)Iß7ÕÞenÆÆPjU…Ê2åüݶƒ`ñy˜j¶”2Íbfѽ'(  ý”Êê¿Ìe ñŽŽc€#Q¯¥ëým%¥äÒ õa»X}w¥Õ‘ð½æÕ<È—¦‘Zð gU ë,¹~â“‹†J7Ìð¨ 㩈צÃvÒÿ*–ä/„|;)ŽEg¼ µ€ÙÝY·Ù,sؽžäx{ÁœåÓþ3X¹réœ _öÞòu{êœMÙËH‡¢Ù‡`ûp–6UàÜêŒ<)·Vó‚@þþQB9² †ØÄaËô69®iɨYRѧ2t¯² ÒýG-|Ž :§GçÜ¥HqÀ¥Œ Ñ-#Ì”~ö/ëJCë9ÕYÝSrZ¨õ¨ÑØ7=ÿ¼~¾ŠJŒ¯?HC‚qÖ4fÝñŠ*v”Dx°7õÒïçå‡Õ×,é—ü´Sù4¥),0¦9*RcT>zÅI…È÷vi–¢WŠ&ÍDéc¨è…5¿ O4#Әε–tƒš`'B'Yã˜êy&ï èú¬Çb³9ï2›ª²W`‹k°r­¤Yâ!ºàÇû”ØjûÁÏ ûÏææ“‚ýg£¹ù`ÿ¹,¡,ÛÏ—Oï÷?½}ÿé÷f÷h×;<:øòúƯ÷õýÑ;ïó.üy½ÿñóÁÞá!z»x°ûé—½7\òîmCN$ÁX‚.5«ÐŠü0ØÈ×Ëj3¾÷ú@L6kֽ˿zŸ,S=Æ5¤„¼ ns ýacÊj¨ƒnwòFë­Ö¬ÄÛ8?ŒV9,ZÜìhUåR?BË]}Ž,÷0ã ä€EÞíºa[àWV›ºkÅç:ù0¯…‚&`«œ¨”—ƒ]ì?Yç´ìÆHkùn]'7ªcs±BI騛iѤœ*F²¶ô%-Â)ÊüѪ0‘šE×YòÍWðb›: OjסٜÿÒÜ õ+ôŒ¦Øâ9¾ù¦ß|³£"&uÞ×xéÇ)59q*ÓŠ=ùMÝÓ™Om®«Š¹­Œ‰¨K•µ ¾Œ:ÀpàL鳞ƒçß„cËKKÔBJ- »§×ØŠ~ëà,¶e‰`rKœ|±†ßX–ª37‰·U߆xðï^&¶ÄH¾å|K5kÏ=‹?«æÂ2ÂÇX^ÌÀ2‡H^ {7,•5Ÿ[Õ#Ž0é±%Ik{m1“åõ 9[š[ÀT¬‹‘³e§¹,9+#Ø®¬3†¢DPêž-îErÓûËÜ ×lh|Hp¿‹ì.çsÙýs&¾çaÝYñɯÿ²ÞÏ÷}þ×jÁb/þ×|ðÿ¿—®ÿ¬>/þlA·yžÆ°1.=ÿ4ËFÛ_\\4:icÜ9:ÁɰvÇÿ÷¿O“-aN^ÿ8ë¤arNi> ûÁpœEqHÇi䔌&²Õ}9zû3 ×ΰÒ‰:&-ŽT´8^Àõ ìš½ö ˜¼lŸÑëDBU±ãm\L0øä-|ôîÜD‰¾•'5íÆIÕ6Å€ËÚM;c4ˆGðöÀ‘.¨àlþO`oV+$¤î­Ì æäë󬑄&…ÅàÖ‹© DìéÏé¶z<Ö@W](*èØã"ê†ë…W69ádÔþ`.U€53'ñvKn»¹zŸáœxM•rÆA†Oé;²T FËŸ/¥ ¼¸\Åš1ØY¼†±jR©À˜»‡çrX{¬Î¦Dª&OC»•¸îÏ5ÏøY–`v¸FÍTòdˆÎ#4ò,>ÔAŽuÖ(ÝM;Qd£%szŸ ïIœÉÆžwØz:ôž­·#v(ÕŒO†UX•Õc¡¢¬U/ ßôöhŠùVárâñ²TXÑ~š¨¿·*ü§ü”Ìÿ÷mÿyúôI>ÿûæ³'ùîå#óÿ<÷ÃKJS2›¥¥&ÌBíËŒ|IZqWßLÌ÷-@‰ß±xÁoA?AÈY߃ U÷6&üYÒ_ôëËËKïòRž6›øû’Ü@š‹Wð¹ÌA67ð)CR¡Ë%»¼‡ÿ..¼‹ .ýH?mæ57Æã1#xIa´éX‘¾ðWj’A~Œ\;ÁçQSyuì¿ÙW¼Ý.ôÉx4Âb{.'ÉðÍ4£ JŠ >¨3·_Zk5Ë.gÀ¾B_q½æ>ÆÜ„Þá¸-“Lq÷µ1{•ç.ñîe}‡›zXßa ŒW(†ð½ƒë¸º—¦–í†Ãe´Q×ð~Ö¦Œ è9ë’UÚ“sM›x“ûû8ó_C«À/g¶ñ¿6‚¸Ûö ¹Ø ¾ÿ¬ìy3ÿʶáï‹DòÆÅÓZÝ3E7{X´Ædئ"ÙÊ"Rbù¸Í¢Õbñ˜yëMlÎïúAe,ïØqÝÜðDì!ª7èî¶6è •¸îcý»˜Òb=ÁÞÀX ÿÂ{¼m¶~&‹“gn”ñ/¤my1}B÷]Ô¤ K]JY¿Ýf«T³‡¥¹* Í"„e…ïφƒÇBt\.½K%" ÍA(!e6eØ:áŽÎ"vêÎ<¯7¯Ü6lÑÁÂÐiZÇK0Í€09¢«2] JïF~,Òz(GHßäˆ)“{ÆŒæ*-X)¡b•ƒ(]r:=¬ X^­‰r ÇK3d4­Ý¦»æ‡®#føšÒ¿LÈNoŒž{u‚¨¹2¿ ­7_ŒÅý”ŽƒÎ} þpämo×¼¿þ /.Ô9k?¬pÓÞ3Rh"žÈÄ$êx¸·á¥f†¼huHàIÌ;§ ô^6|îZ%$̵ƒÖmämùE‡#@p.“© ';±³¾%þ4€M>‘ÓaÆ‹Ú-XZóå@]…~2wÊûµñò¥žBaÆÌÃü¼¡çU©d³W3©ªþ¶læÖµ…nmÍÖŒêÊLÍ×§P³\Ù,N-¼H1ÂÏj‘¡`•ý"Ë5«ü p§f©lmºè–´KufNŠnl—0d‹ùåj™—TªÙK4ˆ†løšÁ}Õ\.éÑŸþë¿Æ?y‡‘¯ z£ ûo½øýO?y[]eín $¹ý?.«×Oƒôt¶SÀŒü?­gOóûÿ§÷¿ÝÏÆIIŸW™6tòG˜¯>Œ;è^vvNãax™”?»zCFA?ºÒC µ9Ö‘%¼Žc·1$À; /Mñ/Gïö¶=Ëð€[^Cº~õàã˜B¼ßEý~ÝûôGoãÙ¿<ÛR/ÿû4ù7éAÒ9m´¡èzŠ6`VÏoXqú¨;"â`çúqÿÓþñ»ÝÃwÇG»¯>ì©«ÖpúKxÙÀ–Írà0eû ‰·€@,qZÅòM¥Á Ä~€*Ë~ ~ïÀ7Â’B·}ÌÓ¼lÖ ô=h°Ò<‘P@·~ýdˆ(î!=âû“–âavÜŽã.åˆa¾`mÏW­¨“Ÿ*iðË$ì`|eáS*àÞ\yÕx*IÍ!q/³Œ$æœú‚—öé;©|xM?DãcÄù:ÎyZß¿&pq'ØE2bÈ€—)§ø“î~£Ü8b@ZÖÈS’<9OÜ)o“5! ÎXJ|Dø3: 3ä[äO¸ö?¬ï ×v4@]æ á09æ0Ó()‚§PÖP±A)žü7=¿ 0sº“kÏLdÇPÑ>æFºþ‡^Õf ¥¥ìÜBú+U{® ØÞñ6§ßÓ]¿” Þatoæ vtgO• ;%| S_”Õ™áÚ׊QÚ ’nXà;_1ìùY»Î,•MñIñQέ"HÐ*ÄMÓ ^¯tš‚~Ÿu¥^’¾ÚÑã ðª7 èX%¢‹’A<ˆ†Ã3 ŸÞ@æÂËÎãC-uÂR¸W‚E_÷tZ]ãä¬V¯¬¨ï¼&¾bl'Éð‚¤ô}ïSâ¾Àf)øšµ£Qîk’€žºwNîU²¨öSj8Œ(jF”óýŒ6FÔ³• KtþÙšR­‰ì¨@çX¬{i~,«=èô̼±É„ŒeÊn̪Ò×,öËJ7O‰¯—À¿¢íí¥WÕ¥mÌÝhPº¹#ëÈŒ ×RT #Êé(~ÃÖ¨æÀ³Ê É¿žpç‡Hµ¨[žG3Ä 7Ísˆ“7L8× ‰Ý“Óú0g=BÏ)ÑGuÃÎÕÔ² ãEñKoFêÃ4^Íøro›ýXùxä¨T¥ðˆ~`†¦é.ø¹Ns‹®!Hº XuŒ 2£ÍÕìW{£QpOúŸ­É‹ï¹Š|Ýp Ë =©Í$z/éžüä-«ì$k˜¸øÖg÷0€üs{2Ô—É0 WiîSÊÄ‹5£¹¹XÅÛãÎY˜iS„@ K.©51ªçîšÔ^|¬Óâßâo‘,k•ºVÓbVb^d2ëÙóeØÞÓ{’üªUQ7ú({©’ÎRôâíf¦{eNÈ׈mã.° Ú%˜££Žò¸¹™»mŸ†HôlðF†Ê%C0E^¯¨*w¤^õ~…‹:g”sŠ1•ƒf× "èhOïÌØl{‹pÓºÆÞsyÂ5óôýÍÙ}YÜ–Áªp(*K÷X¾^«·î.Îè‚ßlâ@ÛBIãx[uf6KNм¢S‹Ê^w¡ 2#‡m³qQ0ùƒaWEÄû”Í£~Ðq¨fø©n¬äÈ•Úf¶Ëº;ñøÒ¶p1œVwHá’)¦Ñ–D硘tƒüœÙ‹úY˜D0mëŽ]n)ea¬S¸Ø9ôz&jo î<Ꜧ3qŠj›)¶EßßjÐ †E>ïÎ h–Ñ£3·a*žSZ*E)[¸GÑ–s J²(ãµµSûP d ¥ö!š®ãª¯”KÈµÉïmœ¿Ú¤Ìþ½Ú†¡u¶Ji'Óíÿ›Ïž<Íûÿ?Ý|úàÿw/eÿÏ÷ùmOŽ8y7ÄaÑp¿0IJ~îŸipÁ¶¢pëÈ2e î®-^–„ajrš„ABÁé¹É×…%¥&J}£*£ô0ÁôÔO¯5,þ9øB3ï»(¾ ë*¹ Ù^BòñÒS§Ý ~Ÿv’HöDвaí ¾ʽrŠž¶Cr2âV不Ã1Ì€öÔ`%áº@‡3Ι¥*èw½÷êù¶LÖÖ Ùòêq£ó 5tÁWôØÑ$3°…Ò¦cº\“óísF]U²ѹ.ÙÌžkC@Ð@´¢€¶AóóSº$¢fd#¤t$Q˜êÌ LÝ‘p\*4ªk¨’Ò§ ÎÃD3§oÃ-˜j‚ï^Uù!4JJă98¯âg? zßF<…ò‰ \án¿ôöÞÜýœ?$À[ž¹–É?}RÐáCJägþHêt`dâú¶®¯è•äÒÂ.2Ñ:F™Î||.µ¦àpK—u™çH”-‚Â4Ad±©ý].`®x-ìcç>[Ä O>/HÄ\쎰-TĤÙwœéѧšÝ½U³‹Be° åÕBeò#ÜÀ60¢~]݈VY ]=¼êù¢½†ñz(¬Î¡q¡CGfeçe0ýkùq™Ì:Y m±F»«“„UÒáÎ1?ö°XQ%û2xÔA•ï‹~Öö_.~Ðv½DéYÎíùâNGæj´}L1½Í8 ³j§­Y Š…Ž,.&VÜ„d ÿ$®×;µ›Â2—ïé€QûwCÕãž\‹=Td:w,Æ´Ãz’c‹{n£ÄwhmÅõe±ÃÈ)1T‰c…w€ÍK íCºÐZE¦Û—v¨»Óí5ßU4a@òŽw´ÿy4χ½·î*²díÈ߸h ñ6s®µ§*…„DqáˆÉ^Å•õ/‡~ÛÿŒoqÙ©:”ž#íJ¡«it,f]F`€ñIá–LŽ5µ§†˜Ús`‚žm·ÿˆFÉpœHvKÞµtÃ^Ô‰2äXíµ¼qœE}•x’ž1w95%¸Ë »uo˜ÈÞ•ËK"Ýš…A*<¼˜ÎØ¿0ö8 âeÎZp"9É|™ÑFPÆYV(Õº¨K¤I68a>7Êb¿Ï™æž@PG¼ÒLQSªŒ3\éNÁ "œ~š8‹á@c€Â §B‚8IYÝ®èÕYŽ™ªC‹å#¢ÈÚ,!«yÇ]>t-Üùœt΃ªHç–ÐéÓÔWg1¶ET-CkV5¯rÕÔJi=¨¢³´?[•9tz¥¢òW7ª\0ÌUm®VG”ÈN^%h9>pªf4ÜR„9 InÏ Á’aé*k—I*ˆre6ö޵gŠ5ò<ö™”N—â”nÌæŽ+¼…*lu\ѳ¥’TÕ«­JŠÊ5‹U}ií¯nT{Nœ§Ö›«öJilÓ~¦•{7ìͲtèE„%åAƒÝDƒâÕTD“.–-±žHy†Á‹elå© håÑíq¼|^/l0^¿àIc÷¤iÔžÆÃ@¼LT@¿oùºA­ÆÉ\ØPÇsüZ±øž˜+Þž§¸aˆBa¢ˆ}éq?Ã.p½Í …S“µQL€vð°MOÙŠfµ¦7•´´²øYeï³E¨¨®j3—ä:¥÷«æTnºHLY²ûVÊeË\B5´•â.xe6Î⽓Iø™â¿ÙX+Üõ&¯qÉÛÙÞNËÑ­Ù÷Y׋رÓu¬6Ìž2¤v–-ùÈÚZs÷“XÒì ò»ÉâNR¶I8¨“9/&m'y €€ŽP÷KÖÎÐlr¢Ò#RgËéš×Ë ™mñÔ89Qߪzb+¿è°ßíÛ±ËVHòE³ŽÉXB_4ùüÞj„Gƒ %”ͦÌä_‚˜Ǫ8>àT\r duÈnI¿žš*À‹n„ÓŠäî:!p:¡}'Üe'…NX\#JöÐÈÈ]bE2Êüï4dÄñÉBcŸ“\ò˜ßÞî ×—0Æc¸Î-—òW3ƒ¹áå\ Á÷ùjϨû¹Ö³|}æ~JŽôÏÔ+´ÃçûÝñ&xº| ¯„‰/…¥CÞT¼q)€é“‘]¡.‚)];ŽŽÛHûÒ;h°ë Þñ³hÆ¥ãúÔGt‚® xú¯ª!J$'%"#¥Î R ö ?Êó“Ú5BJèeÛL„ig‚¿ììë¡‹I•6`*k4ÌÑ×ý)ð³±@â=É*öPY.OÆè‚,ä,NmiÚC¾ðûÖq•îvqî€}Áé«~nY‰ý®_«±ÑíÍ?U©*’ ö€ÿºZ¨N$ŒdØàBæ ¦àä¢tp¶ àÿlÓTÀ5[Å“)Gûo„7…[5*m?)£¶¶}kÅáË&–ÜF1ys§Ù³e|†)ã²Ü1 ea·8« õòF³™­˜G¯Ù~Àç×ÍšÍ6|Ÿ™Y%™6¯‚CÌ…®FÚPU{ÊÄ­—2öq åEIؼR)æÈ>1¦™sÜÏxCR¢æèÞ]KE| åç¿U FãÒ¢g(§J‹<¿aÀ²9)WPÑ’òŒ™È¥Ý2ÞÔÊLÀõ!O.¼·O§ÃTúÊ-7rqPÏ:6ºŽ¼éFãŒÕ! HëÞ8U‹,œ(Ë›Tçq¨wlCëÔ,âîK×yí!hN©3¿œ ºðfCo‚Þy»².©àyM‘çóõ—N׸‹ Z²¼$ö»5)@¬ÂBE€Í2ÀE¬?Üé_¸(.L‹²ÅÄN¶¤ ›t/t̼þ°ú¤P^Zf•™²F¡ÍW]æöcZ*¢±¸'±à¥éܲÁèï[>æTv|ÃhØÉ*už,ü”⻶ΣíS1ƒT[­Ï4ÈM…wáBdQ”(šC›XåY„n¬Wr¼IʆÛqq¸Î ¶èTeuW…¢ùÝ_vOqß]w¨ßW—™X4$ªzxÑÃ{™æé?¢¦G:­ìuñðâåt)¯¦È‹¦*!ùÄ@US! šƒròx]*¦Kg 6Å´¤Œi,†×ct‰ô¡¡Ž‘)rÅ&­²*µéÑA JˆT‚S‘ÃR’UÚSï² ÒVš×ž+ Y^Íé!S¡âÆÌعß1£¡ÔaSrFlGû;ÃñAªÊô+?*kèUðLž3\ÎÕ¹pæC@ƒü –|×£Ä8°8¤È)ÏèÉ…ú»Š%zôù2=ñË=;Ù¸§^¤¼ï!=(§-Ö´©_[t¢—4wC£qÌ¿9¡’›€cȇc´wÓ¢iY]=Ÿ›çQ‰x‡­ f‘ÿ(¶ÌólÀA+wyœ½„³W¹ày©Új#s–KNK‚–ûóKã!˜£¬\þDäDéKRŒT¤=ׯ˜T¢†·«°óÇ"K©mK´:Ê툮‡†Šà€Á"åÿ\–\”ke$Y„÷=3~X£‹- ÎàÐ&Ñò/>+Ô9çU}˜>0S`ýzÜ9O­3xrSF¤0ÉTXÏåŒ9Ly¬²KR‰Ú‹å4jWŸû!”ó1<ÿ±î¹ššÿ! ³{ÈÿÐÜlµŠùîÿ¾—O!ÿƒôùCþ‡‡üùfæ8 3•ÿápïèGÊÿ@Åɾµ"+„ûn®ÄâyA5¬•fƒM‚>µ{GV*ˆª<uó<X¸2ÄDì ¹ìè.B8©¬Õé‚Ò>\#åC.ÝÚUl‡óêdŸ{ »×ŽZsFÝOKñÀùtn‡ù;pBƒketÀh —öb> aºA‡i98©€NÞ0æ†ùZ©º¿˜²aÎt h³$ÂÙÇϨᎅ%P¹t^†Ê¤ 6û"©’…‰G ’/ØcBµ«{³v"¸]ªÔgÓR-€ÒÃ]‘ìˆHê’ZAC|@g?%[€JµV¶ßM¶·ÁÏ|ø—³#TY:,éæŠ=Ÿx>;êÜš›àŸ©¡æîlV_.KBgª¸]|ùìØò9âÊgÄ”?Ä“çB€­ ÇkÆ‘»1äóÆç#-%nÜŸ+XÜ ø´V矣¸EÈüÑà nEψw¹YäwŽŸS"¾ç¯¬$Ò»PM®–òo‰£½fdw.ªûÝz)VT?Wø¶º­B­¯²]”­2RæŠÏÎÇfë–Í“]ÝóÅbëòsÅ`Ï®­*öÚ®'WÍ b®`éëÅZçŠÎc=;¾úŸ7¶únâªçŒ©^x:š€ÕêŽ8`©ñ ßù4}˜…¤í]Œ'!£$<§ƒIJ|zÝ/‚ç0’ãMxàZš`ç@½ÄWû^’¨8"Y©ƒò¢êï{mÒ‡C}¸BN-kJm«ãÙw)â„Xã­8Æ%¨Kia»S© q‡—¼uÏj<'Ù,ß~B°ËÖV89×L XPÄË÷'ºó —9˜"\húœ—·MEj•–úÁ†Ê—Ó9?¥ÝSÀt¿T0o75Kû •c_±×ÜÊKñ´j….Ñ,»‡Ë»š÷0Í|g«9qºoZµ¢ ÐÍ.)KÓóÚV gkô´¨Òèq ,bÌfõ‹Þµ+ô[&v>„)æoÀíÜÊØ8aÊ4'”©Ÿ· nšB›(¹‚6žó™Âe7z „UH5wýL<‡4›§ÃAHf"(£¾O·8ÎÑÀ/¼ê‡ÿ˜ø¯?üðønê ¸¯'O*â¿èó»fsóÉ“­­g›OZ¿Ûh¶6žmüÎ{r7丟òø/·ÿövß|Ü[tÓãÿ66¶6ñþçÍÍg­§›Í-ìÿg›ÏâÿîãCqzÝ(ð0¹ÄCšŒÒ‡^:ÀI $# àžàÀÒ‹½ )¸¾¥Ð¼÷]µ¶L«i9íUBÔåˆ>?lœ4`ò8A¤8Ÿ½9zƒ^ÇÓpÔvÓÑ]nsÜQ4±š×iüÓ,m?~|qqÑ859ÞqÖ®ŽzœEñådЯ5–—ßâ%qÞ¦q:Ç%¯m»!ˆy” ;aŠíÁ|hœí¬7)8Àò½»æ^>îøþá÷Fg°È:fÿÖÓÜøß|¶õpÿû½|`Áe:½"è·¹A{á·!†¥¦§Ñ|‡ .Ÿþè J’¥Æ09©Q¤+®ÞñhãÒ0á{ÑÓN†®Øþð¸ éë^ŽÈ¹(N "A —í IüýÏ1(ïñSÿЋú·>3Æssc+7þ·šOÆÿ½|düK§ß“pÆ8‡EG'VØrwØ£ÝÎ<Cžyóºû '™˜ƒ,K¢ö#œÖJ®¨Ç×Çtªv­ø´¼{tt°DP]œL„œ U;áÞõëÁþ§?>úÏÏ{9x…mòÖ:¸ÜQ¦þŒ‰´üi÷ÃráX rXøªVE‹ËI˜íÂ[o[;¯¡ZÄ¥ØúKõmH®/v™÷ñ´bã„”;ƒþ”‚ ¼¶K2Ïdˆùh‘t»Uèl¼ãX|]° _å:… ‚æ-ÿÜððyø<|>Ÿ‡ÏÃçásÏÿýo•Nàmlton-20100608/lib/stubs/0000755000076600000240000000000011404470407013466 5ustar mtfstaffmlton-20100608/lib/stubs/basis-stubs-for-polyml/0000755000076600000240000000000011404470407020023 5ustar mtfstaffmlton-20100608/lib/stubs/basis-stubs-for-polyml/int.sml0000644000076600000240000000023611404435635021337 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Int64 = Int mlton-20100608/lib/stubs/basis-stubs-for-polyml/real.sml0000644000076600000240000000442411404435635021473 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Real64 = Real structure Real32 = Real (* Dummy implementation that will not be used at run-time. *) structure PackReal32Big : PACK_REAL where type real = Real32.real = struct type real = Real32.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal32Big.toBytes" fun fromBytes _ = raise Fail "PackReal32Big.fromBytes" fun subVec _ = raise Fail "PackReal32Big.subVec" fun subArr _ = raise Fail "PackReal32Big.subArr" fun update _ = raise Fail "PackReal32Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal32Little : PACK_REAL where type real = Real32.real = struct type real = Real32.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal32Little.toBytes" fun fromBytes _ = raise Fail "PackReal32Little.fromBytes" fun subVec _ = raise Fail "PackReal32Little.subVec" fun subArr _ = raise Fail "PackReal32Little.subArr" fun update _ = raise Fail "PackReal32Little.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal64Big : PACK_REAL where type real = Real64.real = struct type real = Real64.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal64Big.toBytes" fun fromBytes _ = raise Fail "PackReal64Big.fromBytes" fun subVec _ = raise Fail "PackReal64Big.subVec" fun subArr _ = raise Fail "PackReal64Big.subArr" fun update _ = raise Fail "PackReal64Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal64Little : PACK_REAL where type real = Real64.real = struct type real = Real64.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal64Little.toBytes" fun fromBytes _ = raise Fail "PackReal64Little.fromBytes" fun subVec _ = raise Fail "PackReal64Little.subVec" fun subArr _ = raise Fail "PackReal64Little.subArr" fun update _ = raise Fail "PackReal64Little.update" end mlton-20100608/lib/stubs/basis-stubs-for-polyml/sources.use0000644000076600000240000000012311404435635022224 0ustar mtfstaffuse "int.sml"; use "real.sml"; use "unsafe.sig"; use "unsafe.sml"; use "word.sml"; mlton-20100608/lib/stubs/basis-stubs-for-polyml/unsafe.sig0000644000076600000240000000062411404435635022016 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNSAFE = sig structure Array: sig val sub: 'a array * int -> 'a val update: 'a array * int * 'a -> unit end structure Vector: sig val sub: 'a vector * int -> 'a end endmlton-20100608/lib/stubs/basis-stubs-for-polyml/unsafe.sml0000644000076600000240000000051611404435635022027 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Unsafe : UNSAFE = struct structure Array = struct open Array end structure Vector = struct open Vector end endmlton-20100608/lib/stubs/basis-stubs-for-polyml/word.sml0000644000076600000240000000224411404435635021521 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Word64 = Word (* Dummy implementation that will not be used at run-time. *) structure PackWord64Big : PACK_WORD = struct val bytesPerElem = 0 val isBigEndian = true fun subVec _ = raise Fail "PackWord64Big.subVec" fun subVecX _ = raise Fail "PackWord64Big.subVecX" fun subArr _ = raise Fail "PackWord64Big.subArr" fun subArrX _ = raise Fail "PackWord64Big.subArrX" fun update _ = raise Fail "PackWord64Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackWord64Little : PACK_WORD = struct val bytesPerElem = 0 val isBigEndian = false fun subVec _ = raise Fail "PackWord64Little.subVec" fun subVecX _ = raise Fail "PackWord64Little.subVecX" fun subArr _ = raise Fail "PackWord64Little.subArr" fun subArrX _ = raise Fail "PackWord64Little.subArrX" fun update _ = raise Fail "PackWord64Little.update" end mlton-20100608/lib/stubs/basis-stubs-for-smlnj/0000755000076600000240000000000011404470407017632 5ustar mtfstaffmlton-20100608/lib/stubs/basis-stubs-for-smlnj/char.sml0000644000076600000240000000076711404435635021302 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Char : CHAR = struct open Pervasive.Char (* SML/NJ doesn't escape #"\000" to three octal digits. *) val toCString = fn #"\000" => "\\000" | c => toCString c end mlton-20100608/lib/stubs/basis-stubs-for-smlnj/ieee-real.sml0000644000076600000240000000407411404435635022210 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* SML/NJ uses an old version of datatype IEEEReal.float_class. *) signature IEEE_REAL = sig exception Unordered datatype real_order = EQUAL | GREATER | LESS | UNORDERED datatype float_class = INF | NAN | NORMAL | SUBNORMAL | ZERO datatype rounding_mode = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO val setRoundingMode : rounding_mode -> unit val getRoundingMode : unit -> rounding_mode type decimal_approx = {digits:int list, exp:int, kind:float_class, sign:bool} val toString : decimal_approx -> string val fromString : string -> decimal_approx option val scan : (char,'a) StringCvt.reader -> (decimal_approx,'a) StringCvt.reader end structure IEEEReal : IEEE_REAL = struct open IEEEReal datatype float_class = NAN | INF | ZERO | NORMAL | SUBNORMAL type decimal_approx = {digits:int list, exp:int, kind:float_class, sign:bool} local structure P = Pervasive.IEEEReal fun toGoodFC c = case c of P.NAN _ => NAN | P.INF => INF | P.ZERO => ZERO | P.NORMAL => NORMAL | P.SUBNORMAL => SUBNORMAL fun toBadFC c = case c of NAN => P.NAN P.QUIET | INF => P.INF | ZERO => P.ZERO | NORMAL => P.NORMAL | SUBNORMAL => P.SUBNORMAL fun toGoodDA {digits, exp, kind, sign} = {digits = digits, exp = exp, kind = toGoodFC kind, sign = sign} fun toBadDA {digits, exp, kind, sign} = {digits = digits, exp = exp, kind = toBadFC kind, sign = sign} in val toString = P.toString o toBadDA val fromString = (Option.map toGoodDA) o P.fromString fun scan r s = Option.map (fn (da,x) => (toGoodDA da,x)) (P.scan r s) end end mlton-20100608/lib/stubs/basis-stubs-for-smlnj/int-inf.sml0000644000076600000240000000204211404435635021715 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor FixIntInf(PIntInf: sig include INT_INF end) : INT_INF = struct open PIntInf local structure FIntInf = FixInt(struct open PIntInf end) in open FIntInf end (* SML/NJ doesn't properly shift IntInf.int values. *) local fun pow2 w = if w = 0wx0 then 1 else let val p = pow2 (Pervasive.Word.>> (w, 0wx1)) val pp = p * p in if 0wx1 = Pervasive.Word.andb (0wx1, w) then 2 * pp else pp end in val ~>> = fn (a, b) => a div (pow2 b) end end structure IntInf = FixIntInf(struct open Pervasive.IntInf end) mlton-20100608/lib/stubs/basis-stubs-for-smlnj/int.sml0000644000076600000240000000204111404435635021142 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor FixInt(PInt: sig include INTEGER end) : INTEGER = struct open PInt local (* SML/NJ uses lower instead of upper case. *) val toUpper = String.translate (Char.toString o Char.toUpper) in fun fmt r w = toUpper (PInt.fmt r w) fun toString w = toUpper (PInt.toString w) end end structure FixedInt = FixInt(struct open Pervasive.FixedInt end) structure Int = FixInt(struct open Pervasive.Int end) structure Int31 = FixInt(struct open Pervasive.Int31 end) structure Int32 = FixInt(struct open Pervasive.Int32 end) structure Int64 = FixInt(struct open Pervasive.Int64 end) structure LargeInt = FixInt(struct open Pervasive.LargeInt end) structure Position = FixInt(struct open Pervasive.Position end) mlton-20100608/lib/stubs/basis-stubs-for-smlnj/Makefile0000644000076600000240000000051111404435635021273 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## .PHONY: clean clean: ../../../bin/clean mlton-20100608/lib/stubs/basis-stubs-for-smlnj/pervasive.cm0000644000076600000240000000040111404435635022156 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library signature PERVASIVE_REAL structure Pervasive is #if (defined (SMLNJ_VERSION)) $/basis.cm #endif pervasive.sml mlton-20100608/lib/stubs/basis-stubs-for-smlnj/pervasive.sml0000644000076600000240000000201311404435635022353 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PERVASIVE_REAL = REAL structure Pervasive = struct structure Char = Char structure FixedInt = FixedInt structure IEEEReal = IEEEReal structure Int = Int structure Int31 = Int31 structure Int32 = Int32 structure Int64 = Int64 structure IntInf = IntInf structure LargeInt = LargeInt structure LargeReal = LargeReal structure LargeWord = LargeWord structure Position = Position structure Real = Real structure Real64 = Real64 structure Word = Word structure Word8 = Word8 structure Word31 = Word31 structure Word32 = Word32 structure Word64 = Word64 structure String = String structure SysWord = SysWord end mlton-20100608/lib/stubs/basis-stubs-for-smlnj/real.sml0000644000076600000240000002057511404435635021307 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* SML/NJ uses an old version of datatype IEEEReal.float_class. *) signature REAL = sig type real structure Math: MATH where type real = real val != : real * real -> bool val * : real * real -> real val *+ : real * real * real -> real val *- : real * real * real -> real val + : real * real -> real val - : real * real -> real val / : real * real -> real val < : real * real -> bool val <= : real * real -> bool val == : real * real -> bool val > : real * real -> bool val >= : real * real -> bool val ?= : real * real -> bool val abs: real -> real val checkFloat: real -> real val class: real -> IEEEReal.float_class val compare: real * real -> order val compareReal: real * real -> IEEEReal.real_order val copySign: real * real -> real val fmt: StringCvt.realfmt -> real -> string val fromDecimal: IEEEReal.decimal_approx -> real option val fromInt: int -> real val fromLarge: IEEEReal.rounding_mode -> LargeReal.real -> real val fromLargeInt: LargeInt.int -> real val fromManExp: {man: real, exp: int} -> real val fromString: string -> real option val isFinite: real -> bool val isNan: real -> bool val isNormal: real -> bool val max: real * real -> real val maxFinite: real val min: real * real -> real val minNormalPos: real val minPos: real val negInf: real val nextAfter: real * real -> real val posInf: real val precision: int val radix: int val realCeil: real -> real val realFloor: real -> real val realMod: real -> real val realRound: real -> real val realTrunc: real -> real val rem: real * real -> real val round: real -> Int.int val sameSign: real * real -> bool val scan: (char, 'a) StringCvt.reader -> (real, 'a) StringCvt.reader val sign: real -> int val signBit: real -> bool val split: real -> {whole: real, frac: real} val toDecimal: real -> IEEEReal.decimal_approx val toInt: IEEEReal.rounding_mode -> real -> int val toLarge: real -> LargeReal.real val toLargeInt: IEEEReal.rounding_mode -> real -> LargeInt.int val toManExp: real -> {man: real, exp: int} val toString: real -> string val unordered: real * real -> bool val ~ : real -> real val ceil: real -> Int.int val floor: real -> Int.int val trunc: real -> Int.int end functor FixReal(PReal: sig include PERVASIVE_REAL val zero : real end) : REAL = struct open PReal local datatype z = datatype IEEEReal.float_class structure P = Pervasive.IEEEReal fun toGoodFC c = case c of P.NAN _ => NAN | P.INF => INF | P.ZERO => ZERO | P.NORMAL => NORMAL | P.SUBNORMAL => SUBNORMAL fun toBadFC c = case c of NAN => P.NAN P.QUIET | INF => P.INF | ZERO => P.ZERO | NORMAL => P.NORMAL | SUBNORMAL => P.SUBNORMAL fun toGoodDA {digits, exp, kind, sign} = {digits = digits, exp = exp, kind = toGoodFC kind, sign = sign} fun toBadDA {digits, exp, kind, sign} = {digits = digits, exp = exp, kind = toBadFC kind, sign = sign} in val class = toGoodFC o class val fromDecimal = SOME o fromDecimal o toBadDA val toDecimal = toGoodDA o toDecimal end (* SML/NJ doesn't support EXACT * and doesn't include a leading "~" for ~0.0. *) fun fmt f = let val fmt = PReal.fmt (let datatype z = datatype StringCvt.realfmt in case f of EXACT => StringCvt.GEN NONE | FIX io => StringCvt.FIX io | GEN io => StringCvt.GEN io | SCI io => StringCvt.SCI io end) in fn r => if == (zero, r) andalso signBit r then "~" ^ (fmt r) else fmt r end (* SML/NJ doesn't handle "[+~-]?(inf|infinity|nan)" * and raises Overflow on large exponents. *) fun fromString s = case s of "inf" => SOME posInf | "infinity" => SOME posInf | "+inf" => SOME posInf | "+infinity" => SOME posInf | "~inf" => SOME negInf | "~infinity" => SOME negInf | "-inf" => SOME negInf | "-infinity" => SOME negInf | "nan" => SOME (negInf + posInf) | "+nan" => SOME (negInf + posInf) | "~nan" => SOME (negInf + posInf) | "-nan" => SOME (negInf + posInf) | _ => (case SOME (PReal.fromString s) handle Overflow => NONE of NONE => let val manexp = String.tokens (fn c => c = #"e" orelse c = #"E") s fun isNeg s = String.sub (s, 0) = #"~" orelse String.sub (s, 0) = #"+" fun isNonzero s = CharVector.exists (fn c => Char.<= (#"1", c) andalso Char.<= (c, #"9")) s in case manexp of [man,exp] => if isNeg exp then SOME zero else if isNonzero man then SOME posInf else SOME zero | _ => NONE end | SOME ro => ro) end structure LargeReal = FixReal(struct open Pervasive.LargeReal val zero : real = 0.0 end) structure Real = FixReal(struct open Pervasive.Real val zero : real = 0.0 end) structure Real64 = FixReal(struct open Pervasive.Real64 val zero : real = 0.0 end) structure Real32 = Real64 (* Dummy implementation that will not be used at run-time. *) structure PackReal32Big : PACK_REAL where type real = Real32.real = struct type real = Real32.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal32Big.toBytes" fun fromBytes _ = raise Fail "PackReal32Big.fromBytes" fun subVec _ = raise Fail "PackReal32Big.subVec" fun subArr _ = raise Fail "PackReal32Big.subArr" fun update _ = raise Fail "PackReal32Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal32Little : PACK_REAL where type real = Real32.real = struct type real = Real32.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal32Little.toBytes" fun fromBytes _ = raise Fail "PackReal32Little.fromBytes" fun subVec _ = raise Fail "PackReal32Little.subVec" fun subArr _ = raise Fail "PackReal32Little.subArr" fun update _ = raise Fail "PackReal32Little.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal64Big : PACK_REAL where type real = Real64.real = struct type real = Real64.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal64Big.toBytes" fun fromBytes _ = raise Fail "PackReal64Big.fromBytes" fun subVec _ = raise Fail "PackReal64Big.subVec" fun subArr _ = raise Fail "PackReal64Big.subArr" fun update _ = raise Fail "PackReal64Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackReal64Little : PACK_REAL where type real = Real64.real = struct type real = Real64.real val bytesPerElem = 0 val isBigEndian = false fun toBytes _ = raise Fail "PackReal64Little.toBytes" fun fromBytes _ = raise Fail "PackReal64Little.fromBytes" fun subVec _ = raise Fail "PackReal64Little.subVec" fun subArr _ = raise Fail "PackReal64Little.subArr" fun update _ = raise Fail "PackReal64Little.update" end mlton-20100608/lib/stubs/basis-stubs-for-smlnj/sources.cm0000644000076600000240000000422411404435635021644 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library library($/basis.cm) - ( signature IEEE_REAL signature REAL structure Char structure FixedInt structure IEEEReal structure Int structure Int31 structure Int32 structure Int64 structure IntInf structure LargeInt structure LargeReal structure LargeWord structure PackReal32Big structure PackReal64Big structure PackReal32Little structure PackReal64Little structure PackWord64Big structure PackWord64Little structure Position structure Real structure Real32 structure Real64 structure Word structure Word8 structure Word31 structure Word32 structure Word64 structure String structure SysWord ) signature IEEE_REAL signature REAL structure Char structure FixedInt structure IEEEReal structure Int structure Int31 structure Int32 structure Int64 structure IntInf structure LargeInt structure LargeReal structure LargeWord structure PackReal32Little structure PackReal64Little structure PackWord64Little structure Position structure Real structure Real32 structure Real64 structure String structure SysWord structure Word structure Word8 structure Word31 structure Word32 structure Word64 is $/basis.cm pervasive.cm char.sml ieee-real.sml int-inf.sml int.sml real.sml string.sml word.sml mlton-20100608/lib/stubs/basis-stubs-for-smlnj/string.sml0000644000076600000240000000073211404435635021663 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure String : STRING = struct open Pervasive.String (* SML/NJ doesn't escape #"\000" to three octal digits. *) val toCString = translate Char.toCString end mlton-20100608/lib/stubs/basis-stubs-for-smlnj/word.sml0000644000076600000240000000362511404435635021334 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor FixWord(PWord: sig include WORD end) : WORD = struct open PWord local (* SML/NJ uses lower instead of upper case. *) val toUpper = String.translate (Char.toString o Char.toUpper) in fun fmt r w = toUpper (PWord.fmt r w) fun toString w = toUpper (PWord.toString w) end end structure LargeWord = FixWord(struct open Pervasive.LargeWord end) structure Word = FixWord(struct open Pervasive.Word end) structure Word8 = FixWord(struct open Pervasive.Word8 end) structure Word31 = FixWord(struct open Pervasive.Word31 end) structure Word32 = FixWord(struct open Pervasive.Word32 end) structure Word64 = FixWord(struct open Pervasive.Word64 end) structure SysWord = FixWord(struct open Pervasive.SysWord end) (* Dummy implementation that will not be used at run-time. *) structure PackWord64Big : PACK_WORD = struct val bytesPerElem = 0 val isBigEndian = true fun subVec _ = raise Fail "PackWord64Big.subVec" fun subVecX _ = raise Fail "PackWord64Big.subVecX" fun subArr _ = raise Fail "PackWord64Big.subArr" fun subArrX _ = raise Fail "PackWord64Big.subArrX" fun update _ = raise Fail "PackWord64Big.update" end (* Dummy implementation that will not be used at run-time. *) structure PackWord64Little : PACK_WORD = struct val bytesPerElem = 0 val isBigEndian = false fun subVec _ = raise Fail "PackWord64Little.subVec" fun subVecX _ = raise Fail "PackWord64Little.subVecX" fun subArr _ = raise Fail "PackWord64Little.subArr" fun subArrX _ = raise Fail "PackWord64Little.subArrX" fun update _ = raise Fail "PackWord64Little.update" end mlton-20100608/lib/stubs/Makefile0000644000076600000240000000026411404435635015134 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../../bin/clean mlton-20100608/lib/stubs/mlton-stubs/0000755000076600000240000000000011404470407015755 5ustar mtfstaffmlton-20100608/lib/stubs/mlton-stubs/array.sig0000644000076600000240000000061311404435635017603 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_ARRAY = sig val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a array * 'b end mlton-20100608/lib/stubs/mlton-stubs/bin-io.sig0000644000076600000240000000035311404435635017643 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_BIN_IO = MLTON_IO mlton-20100608/lib/stubs/mlton-stubs/cont.sig0000644000076600000240000000063511404435635017434 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_CONT = sig type 'a t val callcc: ('a t -> 'a) -> 'a val prepend: 'a t * ('b -> 'a) -> 'b t val throw: 'a t * 'a -> 'b val throw': 'a t * (unit -> 'a) -> 'b end mlton-20100608/lib/stubs/mlton-stubs/exn.sig0000644000076600000240000000112611404435635017257 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_EXN = sig val addExnMessager: (exn -> string option) -> unit val history: exn -> string list val defaultTopLevelHandler: exn -> 'a (* does not return *) val getTopLevelHandler: unit -> (exn -> unit) val setTopLevelHandler: (exn -> unit) -> unit val topLevelHandler: exn -> 'a (* does not return *) end mlton-20100608/lib/stubs/mlton-stubs/finalizable.sig0000644000076600000240000000071411404435635020747 0ustar mtfstaff(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_FINALIZABLE = sig type 'a t val addFinalizer: 'a t * ('a -> unit) -> unit val finalizeBefore: 'a t * 'b t -> unit val new: 'a -> 'a t val touch: 'a t -> unit val withValue: 'a t * ('a -> 'b) -> 'b end mlton-20100608/lib/stubs/mlton-stubs/gc.sig0000644000076600000240000000160711404435635017062 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_GC = sig val collect: unit -> unit val pack: unit -> unit val setMessages: bool -> unit val setSummary: bool -> unit val unpack: unit -> unit (* Most meaningful immediately after 'collect()'. *) structure Statistics : sig val bytesAllocated: unit -> IntInf.int val lastBytesLive: unit -> IntInf.int val numCopyingGCs: unit -> IntInf.int val numMarkCompactGCs: unit -> IntInf.int val numMinorGCs: unit -> IntInf.int val maxBytesLive: unit -> IntInf.int end end mlton-20100608/lib/stubs/mlton-stubs/io.sig0000644000076600000240000000201211404435635017067 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_IO_ARG = sig type instream type outstream val inFd: instream -> Posix.IO.file_desc val newIn: Posix.IO.file_desc * string -> instream val newOut: Posix.IO.file_desc * string -> outstream val outFd: outstream -> Posix.IO.file_desc end signature MLTON_IO = sig include MLTON_IO_ARG (* mkstemp s creates and opens a new temp file with prefix s, returning * the name of the temp file and the outstream to write to it. *) val mkstemp: string -> string * outstream (* mkstemps is like mkstemp, except it has both a prefix and suffix. *) val mkstemps: {prefix: string, suffix: string} -> string * outstream (* adds a suitable system or user specific prefix (dir) for temp files *) val tempPrefix: string -> string end mlton-20100608/lib/stubs/mlton-stubs/itimer.sig0000644000076600000240000000072111404435635017756 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_ITIMER = sig datatype t = Prof | Real | Virtual val set: t * {interval: Time.time, value: Time.time} -> unit val signal: t -> Posix.Signal.signal end mlton-20100608/lib/stubs/mlton-stubs/Makefile0000644000076600000240000000051111404435635017416 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## .PHONY: clean clean: ../../../bin/clean mlton-20100608/lib/stubs/mlton-stubs/mlton.sig0000644000076600000240000000330111404435635017613 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON = sig val debug: bool (* Pointer equality. The usual caveats about lack of a well-defined * semantics. *) val eq: 'a * 'a -> bool (* Structural equality. Equivalent to SML's polymorphic * equality on equality types and a conservative approximation * of equivalence other types. *) val equal: 'a * 'a -> bool (* Structural hash. *) val hash: 'a -> Word32.word val isMLton: bool val safe: bool val share: 'a -> unit val shareAll: unit -> unit val size: 'a -> int structure Array: MLTON_ARRAY (* structure BinIO: MLTON_BIN_IO *) (* structure Cont: MLTON_CONT *) structure Exn: MLTON_EXN (* structure Finalizable: MLTON_FINALIZABLE *) structure GC: MLTON_GC structure Itimer: MLTON_ITIMER structure Platform: MLTON_PLATFORM structure ProcEnv: MLTON_PROC_ENV structure Process: MLTON_PROCESS structure Profile: MLTON_PROFILE structure Random: MLTON_RANDOM structure Rusage: MLTON_RUSAGE structure Signal: MLTON_SIGNAL structure Socket: MLTON_SOCKET structure TextIO: MLTON_TEXT_IO structure Thread: MLTON_THREAD structure Vector: MLTON_VECTOR (* structure Weak: MLTON_WEAK *) (* structure Word: MLTON_WORD *) (* structure Word8: MLTON_WORD *) (* structure World: MLTON_WORLD *) end mlton-20100608/lib/stubs/mlton-stubs/mlton.sml0000644000076600000240000004125511404435635017636 0ustar mtfstaff(* Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MkIO (S : sig type instream type outstream val openOut: string -> outstream end) = struct open S fun inFd _ = raise Fail "IO.inFd" fun mkstemps {prefix, suffix} = let val name = concat [prefix, MLtonRandom.alphaNumString 6, suffix] in (name, openOut name) end fun mkstemp s = mkstemps {prefix = s, suffix = ""} fun newIn _ = raise Fail "IO.newIn" fun newOut _ = raise Fail "IO.newOut" fun outFd _ = raise Fail "IO.outFd" fun setIn _ = raise Fail "IO.setIn" fun tempPrefix _ = raise Fail "IO.tempPrefix" end functor MkWord(W : WORD) : MLTON_WORD = struct open W type t = word val wordSize = Word.fromInt wordSize val bswap = fn _ => raise Fail "Word.bswap" fun rol (w: word, w': Word.word): word = let val w' = Word.mod (w', wordSize) in orb (>> (w, Word.- (wordSize, w')), << (w, w')) end fun ror (w: word, w': Word.word): word = let val w' = Word.mod (w', wordSize) in orb (>> (w, w'), << (w, Word.- (wordSize, w'))) end end (* This file is just a dummy provided in place of the structure that MLton * supplies so that we can compile under SML/NJ. *) structure MLton: MLTON = struct val debug = false val eq = fn _ => raise Fail "eq" val equal = fn _ => raise Fail "equal" val hash = fn _ => raise Fail "hash" val isMLton = MLton.isMLton val safe = true val share = fn _ => raise Fail "share" val shareAll = fn _ => raise Fail "shareAll" val size = MLton.size structure Array = struct open Array fun unfoldi (n, a, f) = let val r = ref a val a = tabulate (n, fn i => let val (b, a') = f (i, !r) val _ = r := a' in b end) in (a, !r) end end structure BinIO = MkIO (BinIO) structure Exn = struct val addExnMessager = fn _ => raise Fail "Exn.addExnMessager" val history = MLton.Exn.history val defaultTopLevelHandler = fn _ => raise Fail "Exn.defaultTopLevelHandler" val getTopLevelHandler = fn _ => raise Fail "Exn.getTopLevelHandler" val setTopLevelHandler = fn _ => raise Fail "Exn.setTopLevelHandler" val topLevelHandler = fn _ => raise Fail "Exn.topLevelHandler" end structure Finalizable = struct type 'a t = 'a fun addFinalizer _ = () fun finalizeBefore _ = () fun new x = x fun touch _ = () fun withValue (x, f) = f x end structure GC = struct val collect = MLton.GC.collect val pack = MLton.GC.pack val setMessages = MLton.GC.setMessages fun setSummary _ = () fun unpack _ = () structure Statistics = struct val bytesAllocated = fn _ => raise Fail "GC.Statistics.bytesAllocated" val lastBytesLive = fn _ => raise Fail "GC.Statistics.lastBytesLive" val numCopyingGCs = fn _ => raise Fail "GC.Statistics.numCopyingGCs" val numMarkCompactGCs = fn _ => raise Fail "GC.Statistics.numMarkCompactGCs" val numMinorGCs = fn _ => raise Fail "GC.Statistics.numMinorGCs" val maxBytesLive = fn _ => raise Fail "GC.Statistics.maxBytesLive" end end structure Itimer = struct datatype t = Prof | Real | Virtual fun signal _ = Posix.Signal.alrm fun set _ = raise Fail "Itimer.set" end structure Platform = struct fun peek (l, f) = List.find f l fun omap (opt, f) = Option.map f opt structure String = struct open String val toLower = CharVector.map Char.toLower end structure Arch = struct datatype t = Alpha | AMD64 | ARM | HPPA | IA64 | m68k | MIPS | PowerPC | PowerPC64 | S390 | Sparc | X86 val all = [(Alpha, "Alpha"), (AMD64, "AMD64"), (ARM, "ARM"), (HPPA, "HPPA"), (IA64, "IA64"), (m68k, "m68k"), (MIPS, "MIPS"), (PowerPC, "PowerPC"), (PowerPC64, "PowerPC64"), (S390, "S390"), (Sparc, "Sparc"), (X86, "X86")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) val host: t = case fromString (MLton.Platform.Arch.toString MLton.Platform.Arch.host) of NONE => raise Fail "MLton.Platform.Arch.host: strange arch" | SOME host => host end structure OS = struct datatype t = AIX | Cygwin | Darwin | FreeBSD | HPUX | Hurd | Linux | MinGW | NetBSD | OpenBSD | Solaris val all = [(AIX, "AIX"), (Cygwin, "Cygwin"), (Darwin, "Darwin"), (FreeBSD, "FreeBSD"), (HPUX, "HPUX"), (Hurd, "Hurd"), (Linux, "Linux"), (MinGW, "MinGW"), (NetBSD, "NetBSD"), (OpenBSD, "OpenBSD"), (Solaris, "Solaris")] fun fromString s = let val s = String.toLower s in omap (peek (all, fn (_, s') => s = String.toLower s'), #1) end fun toString a = #2 (valOf (peek (all, fn (a', _) => a = a'))) val host: t = case fromString (MLton.Platform.OS.toString MLton.Platform.OS.host) of NONE => raise Fail "MLton.Platform.OS.host: strange os" | SOME os => os end end structure ProcEnv = struct type gid = Posix.ProcEnv.gid fun setenv _ = raise Fail "setenv" fun setgroups _ = raise Fail "setgroups" end structure Process = struct type ('stdin, 'stdout, 'stderr) t = unit type input = unit type output = unit type none = unit type chain = unit type any = unit exception MisuseOfForget exception DoublyRedirected structure Child = struct type ('use, 'dir) t = unit val binIn = fn _ => raise Fail "Child.binIn" val binOut = fn _ => raise Fail "Child.binOut" val fd = fn _ => raise Fail "Child.fd" val remember = fn _ => raise Fail "Child.remember" val textIn = fn _ => raise Fail "Child.textIn" val textOut = fn _ => raise Fail "Child.textOut" end structure Param = struct type ('use, 'dir) t = unit val child = fn _ => raise Fail "Param.child" val fd = fn _ => raise Fail "Param.fd" val file = fn _ => raise Fail "Param.file" val forget = fn _ => raise Fail "Param.forget" val null = () val pipe = () val self = () end val create = fn _ => raise Fail "Process.create" val getStderr = fn _ => raise Fail "Process.getStderr" val getStdin = fn _ => raise Fail "Process.getStdin" val getStdout = fn _ => raise Fail "Process.getStdout" val kill = fn _ => raise Fail "Process.kill" val reap = fn _ => raise Fail "Process.reap" type pid = Posix.Process.pid val atExit = OS.Process.atExit fun exit n = let open OS.Process in exit (if n = 0 then success else failure) end fun spawne {path, args, env} = case Posix.Process.fork () of NONE => Posix.Process.exece (path, args, env) | SOME pid => pid fun spawn {path, args} = spawne {path = path, args = args, env = Posix.ProcEnv.environ ()} fun spawnp {file, args} = case Posix.Process.fork () of NONE => Posix.Process.execp (file, args) | SOME pid => pid end structure Profile = struct structure Data = struct type t = unit val equals = fn _ => raise Fail "Profile.Data.equals" val free = fn _ => raise Fail "Profile.Data.free" val malloc = fn _ => raise Fail "Profile.Data.malloc" val write = fn _ => raise Fail "Profile.Data.write" end val isOn = false val withData = fn _ => raise Fail "Profile.withData" end structure Random = MLtonRandom structure Rusage = struct type t = {stime: Time.time, utime: Time.time} fun measureGC _ = () (* Fake it with Posix.ProcEnv.times * and Timer.totalCPUTimer and Timer.checkCPUTimes. *) fun rusage () = let val zero = {utime = Time.zeroTime, stime = Time.zeroTime} in let val {gc = {usr = gcutime, sys = gcstime}, ...} = Timer.checkCPUTimes (Timer.totalCPUTimer ()) val {utime, stime, cutime, cstime, ...} = Posix.ProcEnv.times () in {self = {utime = utime, stime = stime}, children = {utime = cutime, stime = cstime}, gc = {utime = gcutime, stime = gcstime}} end handle Time => {children = zero, gc = zero, self = zero} (* The handle Time is there because of a bug in SML/NJ that * causes a Time exception to be raised on machines with a * large uptime (enough that the number of clock ticks is * >= 2^31). *) end end structure Signal = struct open Posix.Signal type t = signal val prof = alrm val vtalrm = alrm structure Handler = struct type t = unit val default = () val handler = fn _ => () val ignore = () val isDefault = fn _ => raise Fail "Signal.Handler.isDefault" val isIgnore = fn _ => raise Fail "Signal.Handler.isIgnore" fun simple _ = () end structure Mask = struct type t = unit val all = () fun allBut _ = () fun block _ = raise Fail "Signal.Mask.block" fun getBlocked _ = () fun isMember _ = raise Fail "Signal.Mask.isMember" val none = () fun setBlocked _ = raise Fail "Signal.Mask.setBlocked" fun some _ = () fun unblock _ = raise Fail "Signal.Mask.unblock" end fun getHandler _ = raise Fail "Signal.getHandler" fun handled _ = raise Fail "Signal.handled" val restart = ref true fun setHandler _ = raise Fail "Signal.setHandler" fun suspend _ = raise Fail "Signal.suspend" end structure Socket = struct structure Address = struct type t = NetHostDB.in_addr end structure Ctl = struct fun getERROR _ = NONE end structure Port = struct type t = int end type t = unit fun accept _ = raise Fail "Socket.accept" fun connect _ = raise Fail "Socket.connect" fun listen _ = raise Fail "Socket.listen" fun listenAt _ = raise Fail "Socket.listenAt" fun shutdownRead _ = raise Fail "Socket.shutdownWrite" fun shutdownWrite _ = raise Fail "Socket.shutdownWrite" fun fdToSock _ = raise Fail "Socket.fdToSock" end structure TextIO = MkIO (TextIO) structure Thread = MLtonThread structure Vector = struct open Vector fun create n = let val r = ref (Array.fromList []) val subLim = ref 0 fun sub i = if 0 <= i andalso i < !subLim then Array.sub (!r, i) else raise Subscript val updateLim = ref 0 fun update (i, x) = if 0 <= i andalso i < !updateLim then if i = !updateLim andalso i < n then (r := (Array.tabulate (i + 1, fn j => if i = j then x else Array.sub (!r, j))); subLim := i + 1; updateLim := i + 1) else raise Subscript else Array.update (!r, i, x) val gotIt = ref false fun done () = if !gotIt then raise Fail "already got vector" else if n = !updateLim then (gotIt := true; updateLim := 0; Array.vector (!r)) else raise Fail "vector not full" in {done = done, sub = sub, update = update} end fun unfoldi (n, a, f) = let val r = ref a val v = tabulate (n, fn i => let val (b, a') = f (i, !r) val _ = r := a' in b end) in (v, !r) end end structure Weak = struct type 'a t = 'a val get = SOME fun new x = x end structure World = struct datatype status = Clone | Original fun load _ = raise Fail "World.load" fun save _ = raise Fail "World.save" fun saveThread _ = raise Fail "World.saveThread" end structure Word = MkWord(Word) structure Word8 = MkWord(Word8) end mlton-20100608/lib/stubs/mlton-stubs/platform.sig0000644000076600000240000000150411404435635020311 0ustar mtfstaff(* Copyright (C) 2003-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PLATFORM = sig structure Arch: sig datatype t = Alpha | AMD64 | ARM | HPPA | IA64 | m68k | MIPS | PowerPC | PowerPC64 | S390 | Sparc | X86 val fromString: string -> t option val host: t val toString: t -> string end structure OS: sig datatype t = AIX | Cygwin | Darwin | FreeBSD | HPUX | Hurd | Linux | MinGW | NetBSD | OpenBSD | Solaris val fromString: string -> t option val host: t val toString: t -> string end end mlton-20100608/lib/stubs/mlton-stubs/proc-env.sig0000644000076600000240000000066711404435635020227 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROC_ENV = sig type gid val setenv: {name: string, value: string} -> unit val setgroups: gid list -> unit end mlton-20100608/lib/stubs/mlton-stubs/process.sig0000644000076600000240000000563511404435635020154 0ustar mtfstaff(* Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROCESS = sig type pid (* Process handle *) type ('stdin, 'stdout, 'stderr) t (* is the io 'dir input or output *) type input type output (* to what use can the stdio channel be put *) type none (* it's not connected to a pipe *) type chain (* connect one child to another *) type any (* any use is allowed -- dangerous *) exception MisuseOfForget (* you avoided the type safety and broke it *) exception DoublyRedirected (* you tried to reuse a Param.child *) structure Child: sig type ('use, 'dir) t val binIn: (BinIO.instream, input) t -> BinIO.instream val binOut: (BinIO.outstream, output) t -> BinIO.outstream (* not necessarily available on all systems; may raise an exception *) val fd: (Posix.FileSys.file_desc, 'dir) t -> Posix.FileSys.file_desc (* used for situations where 'forget' was needed for arbitrary redir *) val remember: (any, 'dir) t -> ('use, 'dir) t val textIn: (TextIO.instream, input) t -> TextIO.instream val textOut: (TextIO.outstream, output) t -> TextIO.outstream end structure Param: sig type ('use, 'dir) t (* {child,fd} close their parameter when create is called. * therefore they may only be used once! *) val child: (chain, 'dir) Child.t -> (none, 'dir) t (* Not necessarily available on all systems; may raise an exception *) val fd: Posix.FileSys.file_desc -> (none, 'dir) t val file: string -> (none, 'dir) t (* used if you want to return two posibilities; use with care *) val forget: ('use, 'dir) t -> (any, 'dir) t val null: (none, 'dir) t val pipe: ('use, 'dir) t val self: (none, 'dir) t end val create: {args: string list, env: string list option, path: string, stderr: ('stderr, output) Param.t, stdin: ('stdin, input) Param.t, stdout: ('stdout, output) Param.t} -> ('stdin, 'stdout, 'stderr) t val getStderr: ('stdin, 'stdout, 'stderr) t -> ('stderr, input) Child.t val getStdin: ('stdin, 'stdout, 'stderr) t -> ('stdin, output) Child.t val getStdout: ('stdin, 'stdout, 'stderr) t -> ('stdout, input) Child.t val kill: ('stdin, 'stdout, 'stderr) t * Posix.Signal.signal -> unit val reap: ('stdin, 'stdout, 'stderr) t -> Posix.Process.exit_status val spawn: {args: string list, path: string} -> pid val spawne: {args: string list, env: string list, path: string} -> pid val spawnp: {file: string, args: string list} -> pid end mlton-20100608/lib/stubs/mlton-stubs/profile.sig0000644000076600000240000000105211404435635020123 0ustar mtfstaff(* Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_PROFILE = sig structure Data: sig type t val equals: t * t -> bool val free: t -> unit val malloc: unit -> t val write: t * string -> unit end val isOn: bool (* a compile-time constant *) val withData: Data.t * (unit -> 'a) -> 'a end mlton-20100608/lib/stubs/mlton-stubs/random.sig0000644000076600000240000000200511404435635017742 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RANDOM = sig (* Return a random alphanumeric character. *) val alphaNumChar: unit -> char (* Return a string of random alphanumeric characters of specified * length. *) val alphaNumString: int -> string (* Get the next pseudrandom. *) val rand: unit -> word (* Use /dev/random to get a word. Useful as an arg to srand. * Return NONE if /dev/random can't be read. *) val seed: unit -> word option (* Set the seed used by rand. *) val srand: word -> unit (* Use /dev/urandom to get a word. Useful as an arg to srand. * Return NONE if /dev/urandom can't be read. *) val useed: unit -> word option end mlton-20100608/lib/stubs/mlton-stubs/random.sml0000644000076600000240000000664111404435635017765 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonRandom: MLTON_RANDOM = struct (* Uses /dev/random and /dev/urandom to get a random word. * If they can't be read from, return NONE. *) local fun make (file, name) = let val buf = Word8Array.array (4, 0w0) in fn () => (let val fd = let open Posix.FileSys in openf (file, O_RDONLY, O.flags []) end fun loop rem = let val n = Posix.IO.readArr (fd, Word8ArraySlice.slice (buf, 4 - rem, SOME rem)) val _ = if n = 0 then (Posix.IO.close fd; raise Fail name) else () val rem = rem - n in if rem = 0 then () else loop rem end val _ = loop 4 val _ = Posix.IO.close fd in SOME (Word.fromLarge (PackWord32Little.subArr (buf, 0))) end handle OS.SysErr _ => NONE) end in val seed = make ("/dev/random", "Random.seed") val useed = make ("/dev/urandom", "Random.useed") end local open Word val seed: word ref = ref 0w13 in (* From page 284 of Numerical Recipes in C. *) fun rand (): word = let val res = 0w1664525 * !seed + 0w1013904223 val _ = seed := res in res end fun srand (w: word): unit = seed := w end local val chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" val numChars = String.size chars val refresh = let val numChars = IntInf.fromInt numChars fun loop (i: IntInf.int, c: int): int = if IntInf.< (i, numChars) then c else loop (IntInf.div (i, numChars), c + 1) in loop (IntInf.pow (2, Word.wordSize), 0) end val r: word ref = ref 0w0 val count: int ref = ref refresh val numChars = Word.fromInt numChars in fun alphaNumChar (): char = let val n = !count val _ = if n = refresh then (r := rand () ; count := 1) else (count := n + 1) val w = !r val c = String.sub (chars, Word.toInt (Word.mod (w, numChars))) val _ = r := Word.div (w, numChars) in c end end fun alphaNumString (length: int): string = CharVector.tabulate (length, fn _ => alphaNumChar ()) end mlton-20100608/lib/stubs/mlton-stubs/README0000644000076600000240000000032111404435635016635 0ustar mtfstaffThe files in this directory define the MLton structure within the context of a Standard basis library. Many things are defined to raise exceptions, but enough is emulated so that we can compile MLton itself. mlton-20100608/lib/stubs/mlton-stubs/rusage.sig0000644000076600000240000000101111404435635017744 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_RUSAGE = sig type t = {utime: Time.time, (* user time *) stime: Time.time} (* system time *) val measureGC: bool -> unit val rusage: unit -> {children: t, gc: t, self: t} end mlton-20100608/lib/stubs/mlton-stubs/signal.sig0000644000076600000240000000265311404435635017750 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_SIGNAL = sig type t type signal = t structure Handler: sig type t val default: t val handler: (MLtonThread.Runnable.t -> MLtonThread.Runnable.t) -> t val ignore: t val isDefault: t -> bool val isIgnore: t -> bool val simple: (unit -> unit) -> t end structure Mask: sig type t val all: t val allBut: signal list -> t val block: t -> unit val getBlocked: unit -> t val isMember: t * signal -> bool val none: t val setBlocked: t -> unit val some: signal list -> t val unblock: t -> unit end val getHandler: t -> Handler.t val handled: unit -> Mask.t val prof: t val restart: bool ref val setHandler: t * Handler.t -> unit (* suspend m temporarily sets the signal mask to m and suspends until an * unmasked signal is received and handled, and then resets the mask. *) val suspend: Mask.t -> unit val vtalrm: t end mlton-20100608/lib/stubs/mlton-stubs/socket.sig0000644000076600000240000000210411404435635017752 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_SOCKET = sig structure Address: sig type t = NetHostDB.in_addr end (* structure Ctl: sig val getERROR: ('af, 'sock_type) Socket.sock -> (string * Posix.Error.syserror option) option end *) structure Port: sig type t end type t val accept: t -> Address.t * Port.t * TextIO.instream * TextIO.outstream val connect: string * Port.t -> TextIO.instream * TextIO.outstream val listen: unit -> Port.t * t val listenAt: Port.t -> t val shutdownRead: TextIO.instream -> unit val shutdownWrite: TextIO.outstream -> unit (* val fdToSock: Posix.FileSys.file_desc -> ('af, 'sock_type) Socket.sock *) end mlton-20100608/lib/stubs/mlton-stubs/sources.cm0000644000076600000240000000125111404435635017764 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library signature MLTON_THREAD structure MLton is #if (defined (SMLNJ_VERSION)) ../basis-stubs-for-smlnj/sources.cm ../mlton-stubs-for-smlnj/sources.cm #endif io.sig thread.sig thread.sml array.sig bin-io.sig cont.sig exn.sig finalizable.sig gc.sig itimer.sig platform.sig proc-env.sig process.sig profile.sig random.sig rusage.sig signal.sig socket.sig text-io.sig vector.sig weak.sig word.sig world.sig random.sml mlton.sig mlton.sml mlton-20100608/lib/stubs/mlton-stubs/sources.mlb0000644000076600000240000000122211404435635020135 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local $(SML_LIB)/basis/basis.mlb local $(SML_LIB)/basis/mlton.mlb in structure MLton end io.sig thread.sig thread.sml array.sig bin-io.sig cont.sig exn.sig finalizable.sig gc.sig itimer.sig platform.sig proc-env.sig process.sig profile.sig random.sig rusage.sig signal.sig socket.sig text-io.sig vector.sig weak.sig word.sig world.sig random.sml mlton.sig mlton.sml in signature MLTON_THREAD structure MLton end mlton-20100608/lib/stubs/mlton-stubs/text-io.sig0000644000076600000240000000043611404435635020061 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_TEXT_IO = MLTON_IO mlton-20100608/lib/stubs/mlton-stubs/thread.sig0000644000076600000240000000345511404435635017743 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_THREAD = sig structure AtomicState : sig datatype t = NonAtomic | Atomic of int end val atomically: (unit -> 'a) -> 'a val atomicBegin: unit -> unit val atomicEnd: unit -> unit val atomicState: unit -> AtomicState.t structure Runnable : sig type t end type 'a t (* atomicSwitch f * as switch, but assumes an atomic calling context. Upon * switch-ing back to the current thread, an implicit atomicEnd is * performed. *) val atomicSwitch: ('a t -> Runnable.t) -> 'a (* new f * create a new thread that, when run, applies f to * the value given to the thread. f must terminate by * switch-ing to another thread or exiting the process. *) val new: ('a -> unit) -> 'a t (* prepend(t, f) * create a new thread (destroying t in the process) that first * applies f to the value given to the thread and then continues * with t. This is a constant time operation. *) val prepend: 'a t * ('b -> 'a) -> 'b t (* prepare(t, v) * create a new runnable thread (destroying t in the process) * that will evaluate t on v. *) val prepare: 'a t * 'a -> Runnable.t (* switch f * apply f to the current thread to get rt, and then start * running thread rt. It is an error for f to * perform another switch. f is guaranteed to run * atomically. *) val switch: ('a t -> Runnable.t) -> 'a end mlton-20100608/lib/stubs/mlton-stubs/thread.sml0000644000076600000240000000200011404435635017735 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLtonThread = struct structure AtomicState = struct datatype t = NonAtomic | Atomic of int end val atomicBegin = fn _ => raise Fail "Thread.atomicBegin" val atomicEnd = fn _ => raise Fail "Thread.atomicEnd" val atomically = fn _ => raise Fail "Thread.atomically" val atomicState = fn _ => raise Fail "Thread.atomicState" type 'a t = exn structure Runnable = struct type t = exn end val atomicSwitch = fn _ => raise Fail "Thread.atomicSwitch" val new = fn _ => raise Fail "Thread.new" val prepare = fn _ => raise Fail "Thread.prepare" val prepend = fn _ => raise Fail "Thread.prepend" val switch = fn _ => raise Fail "Thread.switch" end mlton-20100608/lib/stubs/mlton-stubs/vector.sig0000644000076600000240000000103611404435635017767 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_VECTOR = sig val create: int -> {done: unit -> 'a vector, sub: int -> 'a, update: int * 'a -> unit} val unfoldi: int * 'b * (int * 'b -> 'a * 'b) -> 'a vector * 'b end mlton-20100608/lib/stubs/mlton-stubs/weak.sig0000644000076600000240000000047111404435635017416 0ustar mtfstaff(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WEAK = sig type 'a t val get: 'a t -> 'a option val new: 'a -> 'a t end mlton-20100608/lib/stubs/mlton-stubs/word.sig0000644000076600000240000000064511404435635017445 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WORD = sig type t val bswap: t -> t val rol: t * word -> t val ror: t * word -> t end mlton-20100608/lib/stubs/mlton-stubs/world.sig0000644000076600000240000000114611404435635017616 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLTON_WORLD = sig datatype status = Clone | Original val load: string -> 'a (* Save the world to resume with the current thread. *) val save: string -> status (* Save the world to resume with the given thread. *) val saveThread: string * MLtonThread.Runnable.t -> unit end mlton-20100608/lib/stubs/mlton-stubs-for-polyml/0000755000076600000240000000000011404470407020053 5ustar mtfstaffmlton-20100608/lib/stubs/mlton-stubs-for-polyml/mlton.sml0000644000076600000240000000406311404435635021730 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLton = struct val isMLton = false val size : 'a -> int = PolyML.objSize structure Exn = struct val history : exn -> string list = fn _ => [] end structure GC = struct fun collect () = PolyML.fullGC () fun setMessages (b : bool) = () fun pack () = collect () end structure Platform = struct local fun mkHost cmd = let fun findCmd dir = let val cmd = dir ^ "/bin/" ^ cmd val upDir = OS.FileSys.realPath (dir ^ "/..") in if OS.FileSys.access (cmd, [OS.FileSys.A_EXEC]) then SOME cmd else if dir <> upDir then findCmd upDir else NONE end val proc = Unix.execute (valOf (findCmd "."), []) val ins = Unix.textInstreamOf proc val hostString = TextIO.inputAll ins val status = Unix.reap proc in String.extract (hostString, 0, SOME (String.size hostString - 1)) end in structure Arch = struct type t = string val toString = fn s => s val host = mkHost "host-arch" end structure OS = struct type t = string val toString = fn s => s val host = mkHost "host-os" end end end end mlton-20100608/lib/stubs/mlton-stubs-for-polyml/sources.use0000644000076600000240000000002111404435635022251 0ustar mtfstaffuse "mlton.sml"; mlton-20100608/lib/stubs/mlton-stubs-for-smlnj/0000755000076600000240000000000011404470407017662 5ustar mtfstaffmlton-20100608/lib/stubs/mlton-stubs-for-smlnj/Makefile0000644000076600000240000000051111404435635021323 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## .PHONY: clean clean: ../../../bin/clean mlton-20100608/lib/stubs/mlton-stubs-for-smlnj/mlton.sml0000644000076600000240000000410111404435635021530 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure MLton = struct val isMLton = false val size : 'a -> int = fn _ => ~1 structure Exn = struct val history = SMLofNJ.exnHistory end structure GC = struct fun collect () = SMLofNJ.Internals.GC.doGC 8 fun setMessages b = SMLofNJ.Internals.GC.messages b fun pack () = collect () end structure Platform = struct local fun mkHost cmd = let fun findCmd dir = let val cmd = dir ^ "/bin/" ^ cmd val upDir = OS.FileSys.realPath (dir ^ "/..") in if OS.FileSys.access (cmd, [OS.FileSys.A_EXEC]) then SOME cmd else if dir <> upDir then findCmd upDir else NONE end val proc = Unix.execute (valOf (findCmd "."), []) val ins = Unix.textInstreamOf proc val hostString = TextIO.inputAll ins val status = Unix.reap proc in String.extract (hostString, 0, SOME (String.size hostString - 1)) end in structure Arch = struct type t = string val toString = fn s => s val host = mkHost "host-arch" end structure OS = struct type t = string val toString = fn s => s val host = mkHost "host-os" end end end end mlton-20100608/lib/stubs/mlton-stubs-for-smlnj/sources.cm0000644000076600000240000000027411404435635021675 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library structure MLton is $/basis.cm mlton.sml mlton-20100608/Makefile0000644000076600000240000003107211404435642013225 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## export TARGET := self export TARGET_ARCH := $(shell bin/host-arch) export TARGET_OS := $(shell bin/host-os) ROOT := $(shell pwd) BUILD := $(ROOT)/build SRC := $(ROOT) BIN := $(BUILD)/bin LIB := $(BUILD)/lib INC := $(LIB)/include COMP := $(SRC)/mlton RUN := $(SRC)/runtime MLTON := $(BIN)/mlton AOUT := mlton-compile ifeq (mingw, $(TARGET_OS)) EXE := .exe else EXE := endif MLBPATHMAP := $(LIB)/mlb-path-map SPEC := package/rpm/mlton.spec LEX := mllex PROF := mlprof YACC := mlyacc NLFFIGEN := mlnlffigen PATH := $(BIN):$(SRC)/bin:$(shell echo $$PATH) CP := /bin/cp -fpR GZIP := gzip --force --best RANLIB := ranlib # If we're compiling with another version of MLton, then we want to do # another round of compilation so that we get a MLton built without # stubs. ifeq (other, $(shell if [ ! -x "$(BIN)/mlton" ]; then echo other; fi)) BOOTSTRAP_OTHER:=true else BOOTSTRAP_OTHER:=false endif ifeq ($(origin VERSION), undefined) VERSION := $(shell date +%Y%m%d) endif ifeq ($(origin RELEASE), undefined) RELEASE := 1 endif .PHONY: all all: $(MAKE) docs all-no-docs .PHONY: all-no-docs all-no-docs: $(MAKE) dirs runtime compiler basis-no-check script mlbpathmap constants libraries tools # Remove $(AOUT) so that the $(MAKE) compiler below will remake MLton. # We also want to re-run the just-built tools (mllex and mlyacc) # because they may be better than those that were used for the first # round of compilation. So, we clean out the front end. ifeq (true, $(BOOTSTRAP_OTHER)) rm -f "$(COMP)/$(AOUT)$(EXE)" $(MAKE) -C "$(COMP)/front-end" clean endif $(MAKE) compiler basis @echo 'Build of MLton succeeded.' .PHONY: basis-no-check basis-no-check: mkdir -p "$(LIB)/sml" rm -rf "$(LIB)/sml/basis" $(CP) "$(SRC)/basis-library/." "$(LIB)/sml/basis" find "$(LIB)/sml/basis" -type d -name .svn | xargs rm -rf find "$(LIB)/sml/basis" -type f -name .ignore | xargs rm -rf .PHONY: basis basis: $(MAKE) basis-no-check @echo 'Type checking basis.' "$(MLTON)" -disable-ann deadCode \ -stop tc \ '$$(SML_LIB)/basis/libs/all.mlb' \ >/dev/null .PHONY: bootstrap-nj bootstrap-nj: $(MAKE) nj-mlton $(MAKE) all .PHONY: clean clean: bin/clean .PHONY: clean-svn clean-svn: find . -type d | grep .svn | xargs rm -rf .PHONY: compiler compiler: $(MAKE) -C "$(COMP)" $(CP) "$(COMP)/$(AOUT)$(EXE)" "$(LIB)/" .PHONY: constants constants: @echo 'Creating constants file.' "$(BIN)/mlton" -target "$(TARGET)" -build-constants true >tmp.c "$(BIN)/mlton" -target "$(TARGET)" -output tmp tmp.c ./tmp >"$(LIB)/targets/$(TARGET)/constants" rm -f tmp tmp.exe tmp.c .PHONY: debugged debugged: $(MAKE) -C "$(COMP)" "AOUT=$(AOUT).debug" COMPILE_ARGS="-debug true -const 'Exn.keepHistory true' -profile-val true -const 'MLton.debug true' -drop-pass 'deepFlatten'" $(CP) "$(COMP)/$(AOUT).debug" "$(LIB)/" sed 's/mlton-compile/mlton-compile.debug/' < "$(MLTON)" > "$(MLTON).debug" chmod a+x "$(MLTON).debug" .PHONY: dirs dirs: mkdir -p "$(BIN)" "$(INC)" mkdir -p "$(LIB)/targets/$(TARGET)/include" mkdir -p "$(LIB)/targets/$(TARGET)/sml" .PHONY: docs docs: dirs $(MAKE) -C "$(LEX)" docs $(MAKE) -C "$(YACC)" docs if htmldoc --version >/dev/null 2>&1; then \ bin/make-pdf-guide; \ fi LIBRARIES := ckit-lib cml mlnlffi-lib mlrisc-lib mlyacc-lib smlnj-lib .PHONY: libraries-no-check libraries-no-check: mkdir -p "$(LIB)/sml" cd "$(LIB)/sml" && rm -rf $(LIBRARIES) $(MAKE) -C "$(SRC)/lib/ckit-lib" $(MAKE) -C "$(SRC)/lib/mlnlffi-lib" $(MAKE) -C "$(SRC)/lib/mlrisc-lib" $(MAKE) -C "$(SRC)/lib/smlnj-lib" $(CP) "$(SRC)/lib/cml/." "$(LIB)/sml/cml" $(CP) "$(SRC)/lib/ckit-lib/ckit/." "$(LIB)/sml/ckit-lib" $(CP) "$(SRC)/lib/mlnlffi-lib/." "$(LIB)/sml/mlnlffi-lib" $(CP) "$(SRC)/lib/mlrisc-lib/MLRISC/." "$(LIB)/sml/mlrisc-lib" $(CP) "$(SRC)/lib/mlyacc-lib/." "$(LIB)/sml/mlyacc-lib" $(CP) "$(SRC)/lib/smlnj-lib/smlnj-lib/." "$(LIB)/sml/smlnj-lib" find "$(LIB)/sml" -type d -name .cm | xargs rm -rf find "$(LIB)/sml" -type d -name .svn | xargs rm -rf find "$(LIB)/sml" -type f -name .ignore | xargs rm -rf .PHONY: libraries libraries: $(MAKE) libraries-no-check for f in $(LIBRARIES); do \ echo "Type checking $$f library."; \ "$(MLTON)" -disable-ann deadCode \ -stop tc \ '$$(SML_LIB)/'"$$f/$$f.mlb" \ >/dev/null; \ done .PHONY: mlbpathmap mlbpathmap: touch "$(MLBPATHMAP)" ( echo 'MLTON_ROOT $$(LIB_MLTON_DIR)/sml'; \ echo 'SML_LIB $$(LIB_MLTON_DIR)/sml'; ) \ >>"$(MLBPATHMAP).tmp" mv "$(MLBPATHMAP).tmp" "$(MLBPATHMAP)" .PHONY: polyml-mlton polyml-mlton: $(MAKE) dirs runtime $(MAKE) -C "$(COMP)" polyml-mlton $(CP) "$(COMP)/mlton-polyml$(EXE)" "$(LIB)/" $(MAKE) script basis-no-check mlbpathmap constants libraries-no-check @echo 'Build of MLton succeeded.' .PHONY: profiled profiled: for t in alloc count time; do \ $(MAKE) -C "$(COMP)" "AOUT=$(AOUT).$$t" \ COMPILE_ARGS="-profile $$t"; \ $(CP) "$(COMP)/$(AOUT).$$t" "$(LIB)/"; \ sed "s/mlton-compile/mlton-compile.$$t/" \ <"$(MLTON)" \ >"$(MLTON).$$t"; \ chmod a+x "$(MLTON).$$t"; \ done .PHONY: runtime runtime: @echo 'Compiling MLton runtime system for $(TARGET).' $(MAKE) -C runtime $(CP) include/*.h "$(INC)/" $(CP) runtime/*.a "$(LIB)/targets/$(TARGET)/" $(CP) runtime/gen/sizes "$(LIB)/targets/$(TARGET)/" $(CP) runtime/gen/c-types.sml "$(LIB)/targets/$(TARGET)/sml/" echo "$(TARGET_OS)" > "$(LIB)/targets/$(TARGET)/os" echo "$(TARGET_ARCH)" > "$(LIB)/targets/$(TARGET)/arch" $(CP) runtime/gen/basis-ffi.sml \ basis-library/primitive/basis-ffi.sml ifeq ($(OMIT_BYTECODE), yes) else $(CP) runtime/bytecode/opcodes "$(LIB)/" endif $(CP) runtime/*.h "$(INC)/" mv "$(INC)/c-types.h" "$(LIB)/targets/$(TARGET)/include" for d in basis basis/Real basis/Word gc platform util; do \ mkdir -p "$(INC)/$$d"; \ $(CP) runtime/$$d/*.h "$(INC)/$$d"; \ done ifeq ($(OMIT_BYTECODE), yes) else $(CP) runtime/bytecode/interpret.h "$(INC)" endif for x in "$(LIB)/targets/$(TARGET)"/*.a; do $(RANLIB) "$$x"; done .PHONY: script script: $(CP) bin/mlton-script "$(MLTON)" chmod a+x "$(MLTON)" $(CP) "$(SRC)/bin/platform" "$(LIB)" $(CP) "$(SRC)/bin/static-library" "$(LIB)" ifeq (mingw, $(TARGET_OS)) $(CP) "$(SRC)/bin/static-library.bat" "$(LIB)" endif .PHONY: smlnj-mlton smlnj-mlton: $(MAKE) dirs runtime $(MAKE) -C "$(COMP)" smlnj-mlton smlnj_heap_suffix=`echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | sml 2>&1 1> /dev/null` && $(CP) "$(COMP)/mlton-smlnj.$$smlnj_heap_suffix" "$(LIB)/" $(MAKE) script basis-no-check mlbpathmap constants libraries-no-check @echo 'Build of MLton succeeded.' .PHONY: smlnj-mlton-dual smlnj-mlton-dual: $(MAKE) SMLNJ_CM_SERVERS_NUM=2 smlnj-mlton .PHONY: smlnj-mlton-quad smlnj-mlton-quad: $(MAKE) SMLNJ_CM_SERVERS_NUM=4 smlnj-mlton .PHONY: traced traced: $(MAKE) -C "$(COMP)" "AOUT=$(AOUT).trace" COMPILE_ARGS="-const 'Exn.keepHistory true' -profile-val true -const 'MLton.debug true' -drop-pass 'deepFlatten'" $(CP) "$(COMP)/$(AOUT).trace" "$(LIB)/" sed 's/mlton-compile/mlton-compile.trace/' < "$(MLTON)" > "$(MLTON).trace" chmod a+x "$(MLTON).trace" .PHONY: tools tools: $(MAKE) -C "$(LEX)" $(MAKE) -C "$(NLFFIGEN)" $(MAKE) -C "$(PROF)" $(MAKE) -C "$(YACC)" $(CP) "$(LEX)/$(LEX)$(EXE)" \ "$(NLFFIGEN)/$(NLFFIGEN)$(EXE)" \ "$(PROF)/$(PROF)$(EXE)" \ "$(YACC)/$(YACC)$(EXE)" \ "$(BIN)/" .PHONY: version version: @echo 'Instantiating version numbers.' for f in \ "$(SPEC)" \ package/freebsd/Makefile \ mlton/control/version_sml.src; \ do \ sed "s/\(.*\)MLTONVERSION\(.*\)/\1$(VERSION)\2/" <"$$f" >z && \ mv z "$$f"; \ done sed <"$(SPEC)" >z "/^Release:/s;.*;Release: $(RELEASE);" mv z "$(SPEC)" .PHONY: check check: ./bin/regression # The TBIN and TLIB are where the files are going to be after installing. # The DESTDIR and is added onto them to indicate where the Makefile actually # puts them. DESTDIR := $(CURDIR)/install PREFIX := /usr ifeq ($(findstring $(TARGET_OS), darwin freebsd solaris), $(TARGET_OS)) PREFIX := /usr/local endif ifeq ($(TARGET_OS), mingw) PREFIX := /mingw endif prefix := $(PREFIX) MAN_PREFIX_EXTRA := TBIN := $(DESTDIR)$(prefix)/bin ULIB := lib/mlton TLIB := $(DESTDIR)$(prefix)/$(ULIB) TMAN := $(DESTDIR)$(prefix)$(MAN_PREFIX_EXTRA)/man/man1 TDOC := $(DESTDIR)$(prefix)/share/doc/mlton ifeq ($(findstring $(TARGET_OS), solaris mingw), $(TARGET_OS)) TDOC := $(DESTDIR)$(prefix)/doc/mlton endif TEXM := $(TDOC)/examples GZIP_MAN := true ifeq ($(TARGET_OS), solaris) GZIP_MAN := false endif .PHONY: install install: install-no-strip install-strip .PHONY: install-no-strip install-no-strip: install-docs install-no-docs move-docs MAN_PAGES := \ mllex.1 \ mlnlffigen.1 \ mlprof.1 \ mlton.1 \ mlyacc.1 .PHONY: install-no-docs install-no-docs: mkdir -p "$(TLIB)" "$(TBIN)" "$(TMAN)" $(CP) "$(LIB)/." "$(TLIB)/" sed "/^lib=/s;.*;lib='$(prefix)/$(ULIB)';" \ <"$(BIN)/mlton" >"$(TBIN)/mlton" chmod a+x "$(TBIN)/mlton" if [ -x "$(BIN)/mlton.trace" ]; then \ sed "/^lib=/s;.*;lib='$(prefix)/$(ULIB)';" \ <"$(BIN)/mlton.trace" >"$(TBIN)/mlton.trace"; \ chmod a+x "$(TBIN)/mlton.trace"; \ fi if [ -x "$(BIN)/mlton.debug" ]; then \ sed "/^lib=/s;.*;lib='$(prefix)/$(ULIB)';" \ <"$(BIN)/mlton.debug" >"$(TBIN)/mlton.debug"; \ chmod a+x "$(TBIN)/mlton.debug"; \ fi cd "$(BIN)" && $(CP) "$(LEX)$(EXE)" "$(NLFFIGEN)$(EXE)" \ "$(PROF)$(EXE)" "$(YACC)$(EXE)" "$(TBIN)/" ( cd "$(SRC)/man" && tar cf - $(MAN_PAGES)) | \ ( cd "$(TMAN)/" && tar xf - ) if $(GZIP_MAN); then \ cd "$(TMAN)" && $(GZIP) $(MAN_PAGES); \ fi .PHONY: install-strip install-strip: case "$(TARGET_OS)" in \ aix|cygwin|darwin|solaris) \ ;; \ *) \ for f in "$(TLIB)/$(AOUT)$(EXE)" "$(TBIN)/$(LEX)$(EXE)" \ "$(TBIN)/$(NLFFIGEN)$(EXE)" "$(TBIN)/$(PROF)$(EXE)" \ "$(TBIN)/$(YACC)$(EXE)"; do \ strip --remove-section=.comment \ --remove-section=.note "$$f"; \ done \ esac .PHONY: install-docs install-docs: mkdir -p "$(TDOC)" ( \ cd "$(SRC)/doc" && \ $(CP) changelog examples guide license README "$(TDOC)/" \ ) if [ -r "$(TDOC)/guide/mlton-guide.pdf" ]; then \ cp "$(TDOC)/guide/mlton-guide.pdf" "$(TDOC)/"; \ fi ( \ cd "$(SRC)/util" && \ $(CP) cmcat cm2mlb "$(TDOC)/" \ ) for f in callcc command-line hello-world same-fringe signals \ size taut thread1 thread2 thread-switch timeout \ ; do \ $(CP) "$(SRC)/regression/$$f.sml" "$(TEXM)/"; \ done if test -r $(LEX)/$(LEX).pdf; then \ $(CP) $(LEX)/$(LEX).pdf $(TDOC); \ fi if test -r $(YACC)/$(YACC).pdf; then \ $(CP) $(YACC)/$(YACC).pdf $(TDOC); \ fi find "$(TDOC)/" -name .svn -type d | xargs rm -rf find "$(TDOC)/" -name .ignore -type f | xargs rm -rf find "$(TEXM)/" -name .svn -type d | xargs rm -rf find "$(TEXM)/" -name .ignore -type f | xargs rm -rf .PHONY: move-docs move-docs: install-docs install-no-docs cd "$(TLIB)/sml"; for i in *; do test -d "$(TDOC)/$$i" || mkdir -p "$(TDOC)/$$i"; done cd "$(TLIB)/sml"; for i in */[Dd]oc; do mv "$$i" "$(TDOC)/$$i"; done cd "$(TLIB)/sml"; for i in */README*; do mv "$$i" "$(TDOC)/$$i"; done .PHONY: release release: version tar cvzf ../mlton-$(VERSION).tar.gz \ --exclude .svn --exclude package \ --transform "s@^@mlton-$(VERSION)/@" \ * BSDSRC := /tmp/mlton-$(VERSION) .PHONY: freebsd freebsd: $(MAKE) clean clean-svn version rm -rf "$(BSDSRC)" mkdir -p "$(BSDSRC)" ( cd $(SRC) && tar -cpf - . ) | ( cd "$(BSDSRC)" && tar -xpf - ) cd /tmp && tar -cpf - mlton-$(VERSION) | \ $(GZIP) >/usr/ports/distfiles/mlton-$(VERSION)-$(RELEASE).freebsd.src.tgz # do not change "make" to "$(MAKE)" in the following line cd "$(BSDSRC)/package/freebsd" && MAINTAINER_MODE=yes make build-package TOPDIR := 'TOPDIR-unset' SOURCEDIR := $(TOPDIR)/SOURCES/mlton-$(VERSION) .PHONY: rpms rpms: $(MAKE) clean clean-svn version mkdir -p "$(TOPDIR)" cd "$(TOPDIR)" && mkdir -p BUILD RPMS/i386 SOURCES SPECS SRPMS rm -rf "$(SOURCEDIR)" mkdir -p "$(SOURCEDIR)" ( cd "$(SRC)" && tar -cpf - . ) | ( cd "$(SOURCEDIR)" && tar -xpf - ) $(CP) "$(SOURCEDIR)/$(SPEC)" "$(TOPDIR)/SPECS/mlton.spec" ( cd "$(TOPDIR)/SOURCES" && tar -cpf - mlton-$(VERSION) ) \ | $(GZIP) >"$(SOURCEDIR).tgz" rm -rf "$(SOURCEDIR)" rpm -ba --quiet --clean "$(TOPDIR)/SPECS/mlton.spec" mlton-20100608/man/0000755000076600000240000000000011404470407012333 5ustar mtfstaffmlton-20100608/man/.ignore0000644000076600000240000000001311404435642013613 0ustar mtfstaff*.pdf *.ps mlton-20100608/man/Makefile0000644000076600000240000000060411404435642013775 0ustar mtfstaff## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: ps ps: mllex.ps mlprof.ps mlton.ps %.pdf: %.ps ps2pdf $< %.ps: %.1 man -t ./$< >$@ .PHONY: clean clean: ../bin/clean mlton-20100608/man/mllex.10000644000076600000240000000073311404435642013543 0ustar mtfstaff.TH mllex 1 "February 23, 2008" .SH NAME \fBmllex\fP \- lexer generator for use with Standard ML and MLton .SH SYNOPSIS \fBmllex foo.lex\fR .SH DESCRIPTION .PP \fBmllex\fP takes as input a lexer specification \fBfoo.lex\fP and produces as output in \fBfoo.lex.sml\fP a lexer written in SML. For details on the lexer specification, see \fBA Lexical Analyzer Generator for Standard ML\fP, which is in \fB/usr/share/doc/mllex.pdf\fP. .SH "SEE ALSO" .BR mlton (1), mlyacc (1) mlton-20100608/man/mlnlffigen.10000644000076600000240000000073011404435642014540 0ustar mtfstaff.TH mlnlffigen 1 "August 25, 2005" .SH NAME \fBmlnlffigen\fP \- glue-code generator for use with the new "NLFFI" foreign function interface for Standard ML and MLton .SH SYNOPSIS \fBmlnlffigen [option ...] C-file ...\fR .SH DESCRIPTION .PP \fBmlnlffigen\fP takes as input a C source file and produces as output in \fBNLFFI-Generated\fP the glue-code for Standard ML and in \fBNLFFI-Generated\\nlffi-generated.mlb\fP a ML Basis system file. .SH "SEE ALSO" .BR mlton (1) mlton-20100608/man/mlprof.10000644000076600000240000000442311404435642013721 0ustar mtfstaff.TH mlprof 1 "June 8, 2010" .SH NAME \fBmlprof\fP \- display profiling information for a MLton-compiled executable .SH SYNOPSIS \fBmlprof \fI[option ...] a.out [mlmon.out ...]\fR .SH DESCRIPTION .PP \fBmlprof\fP extracts information from an executable compiled by \fBMLton\fP with \fB-profile alloc\fP or \fB-profile time\fP and the resulting \fBmlmon.out\fP file produced by running the executable. The output of \fBmlprof\fP consists of an initial line indicating the total amount of CPU time or bytes allocated. After this, source functions are listed along with the percentage of this total that they used, in decreasing order. If the program was compiled with \fB-profile-stack true\fP, \fBmlprof\fP will display the time spent or bytes allocated while the function was on the stack and in GC in addition to the time or bytes that the function is directly responsible for. With multiple \fBmlmon.out\fP files, \fBmlprof\fP will sum the profiling information. .SH OPTIONS .TP \fB-call-graph \fIfile\fP Write a call graph containing the table data to a dot file. See the \fBMLton User Guide\fP for details. .TP \fB-graph-title \fIstring\fP Set the call-graph title. .TP \fB-gray \fI{\fBfalse\fP|\fBtrue\fP}\fP Gray call-graph nodes according to stack %. This only makes sense if the executable was compiled \fB-profile-stack true\fP. .TP \fB-keep \fIexp\fP Only show functions specified by \fIexp\fP. For details on the allowed expressions, see the \fBMLton User Guide\fP. Multiple \fB-keep\fP expressions are not allowed. .TP \fB-mlmon \fIfile\fP Process the list of whitespace-separated \fBmlmon.out\fP files found in the specified file. .TP \fB-raw \fI{\fBfalse\fP|\fBtrue\fP}\fP Show the raw counts in addition to the percentages. .TP \fB-show-line \fI{\fBfalse\fP|\fBtrue\fP}\fP Show the file and line for each function. .TP \fB-split \fIregexp\fP Treat duplicates of functions whose name matches \fIregexp\fP as different functions. .TP \fB-thresh \fIx\fP An abbreviation for \fB-keep '(thresh x)'\fP, which only prints information about functions whose percentage is greater than or equal to \fBx\fP, where 0 <= \fBx\fP <= 100.0. .TP \fB-tolerant \fI{\fBfalse\fP|\fBtrue\fP}\fP Print a warning about broken \fBmlmon.out\fP files, but do not exit. .SH "SEE ALSO" .BR mlton (1) and the \fBMLton Guide\fP. mlton-20100608/man/mlton.10000644000076600000240000003400111404435642013546 0ustar mtfstaff.TH mlton 1 "June 8, 2010" .SH NAME \fBmlton\fP \- whole-program compiler for the Standard ML (SML) programming language .SH SYNOPSIS \fBmlton\fP \fI[option ...] file\fB.\fP{\fBc\fP|\fBmlb\fP|\fBo\fP|\fBsml\fP} [file\fB.\fP{\fBc\fP|\fBo\fP|\fBs\fP|\fBS\fP} ...]\fR .SH DESCRIPTION .PP \fBMLton\fP is run from the command line with a collection of options followed by a file name and a list of files with which to compile, assemble, and link with. The simplest case is to run \fBmlton foo.sml\fP, where \fBfoo.sml\fP contains a valid SML program, in which case MLton compiles the program to produce an executable \fBfoo\fP. Since \fBMLton\fP does not support separate compilation, the program must be the entire program you wish to compile. However, the program may refer to signatures and structures defined in the Basis Library. Larger programs, spanning many files, may be compiled with the ML Basis system. In this case, \fBmlton foo.mlb\fP will compile the complete SML program described by the basis \fBfoo.mlb\fP, which may specify both SML files and additional bases. See the \fBMLton Guide\fP for details. \fBMLton\fP's compile-time options control the name of the output file, the verbosity of compile-time messages, and whether or not certain optimizations are performed. They also can specify which intermediate files are saved and can stop the compilation process early, at some intermediate pass, in which case compilation can be resumed by passing the generated files to \fBMLton\fP. \fBMLton\fP uses the input file suffix to determine the type of input program. The possibilities are \fB.c\fP, \fB.mlb\fP, \fB.o\fP, \fB.s\fP, and \fB.sml\fP. With no arguments, \fBMLton\fP prints the version number and exits. For a usage message, run \fBMLton\fP with an invalid switch, e.g. \fBmlton \-z\fP. In the explanation below and in the usage message, for flags that take a number of choices (e.g. \fI{\fBtrue\fP|\fBfalse\fP}\fR), the first value listed is the default. .SH Compile-time options .TP \fB\-align \fI{\fB4\fP|\fB8\fP}\fP\fR Aligns object sizes and doubles in memory by the specified alignment. The default varies depending on architecture. .TP \fB\-as\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBgcc\fP when assembling. .TP \fB\-cc\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBgcc\fP when compiling C code. .TP \fB\-codegen \fI{\fBnative\fP|\fBx86\fP|\fBamd64\fP|\fBc\fP}\fP\fR Generate native code or C code. With \fB\-codegen native\fP (\fB\-codegen x86\fP or \fB\-codegen amd64\fP), \fBMLton\fP typically compiles more quickly and generates better code. .TP \fB\-const '\fIname value\fP'\fR Set the value of a compile-time constant. Here is a list of available constants, their default values, and what they control. \fBExn.keepHistory \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR .in +.5i Enable \fBMLton.Exn.history\fP. There is a performance cost to setting this to \fBtrue\fP, both in memory usage of exceptions and in run time, because of additional work that must be performed at each exception construction, raise, and handle. .in -.5i .TP \fB\-default\-ann \fIann\fP\fR Specify default ML Basis annotations. For example, \fB\-default\-ann 'warnUnused true'\fP causes unused variable warnings to be enabled by default. Defaults may be overridden by an annotation in an ML Basis file. .TP \fB\-default\-type \fItype\fP\fR Specify the default binding for a primitive type. For example, \fB\-default\-type word64\fP causes the top-level type \fBword\fP and the top-level structure \fBWord\fP in the Basis Library to be equal to \fBWord64.word\fP and \fBWord64:WORD\fP, respectively. Similarly, \fB\-default\-type intinf\fP causes the top-level type \fBint\fP and the top-level structure \fBInt\fP in the Basis Library to be equal to \fBIntInf.int\fP and \fBIntInf:INTEGER\fP, respectively. .TP \fB\-disable\-ann \fIann\fP\fR Ignore the specified ML Basis annotation in every ML Basis File. For example, to see \fIall\fP match and unused warnings, compile with \fB\-default\-ann 'warnUnused true'\fP, \fB\-disable\-ann forceUsed\fP, \fB\-disable\-ann nonexhaustiveMatch\fP, \fB\-disable\-ann redundantMatch\fP, and \fB\-disable\-ann warnUnused\fP. .TP \fB\-export\-header \fIfile\fP\fR Write C prototypes to \fIfile\fP for all of the functions in the program exported from SML to C. .TP \fB\-ieee\-fp \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR Cause the x86 native code generator to be pedantic about following the IEEE floating point standard. By default, it is not, because of the performance cost. This only has an effect with \fB\-codegen x86\fP. .TP \fB\-inline \fIn\fP\fR Set the inlining threshold used in the optimizer. The threshold is an approximate measure of code size of a procedure. The default is 320. .TP \fB\-keep \fI{\fBg\fP|\fBo\fP}\fP\fR Save intermediate files. If no \fB\-keep\fP argument is given, then only the output file is saved. .in +.5i \fBg\fP generated \fB.c\fP and \fB.s\fP files passed to gcc and the assembler .br \fBo\fP object (\fB.o\fP) files .in -.5i .TP \fB\-link\-opt \fIoption\fP\fR Pass \fIoption\fP to \fBgcc\fP when linking. You can use this to specify library search paths, e.g. \fB\-link\-opt \-Lpath\fP, and libraries to link with, e.g. \fB\-link\-opt \-lfoo\fP, or even both at the same time, e.g. \fB\-link\-opt '\-Lpath \-lfoo'\fP. If you wish to pass an option to the linker, you must use \fBgcc\fP's \fB\-Wl,\fP syntax, e.g., \fB\-link\-opt '\-Wl,\-\-export\-dynamic'\fP. .TP \fB\-mlb\-path\-map \fIfile\fP\fR Use \fIfile\fP as an ML Basis path map to define additional MLB path variables. Multiple uses of \fB\-mlb\-path\-map\fP and \fB\-mlb\-path\-var\fP are allowed, with variable definitions in later path maps taking precedence over earlier ones. .TP \fB\-mlb\-path\-var '\fIname value\fP'\fR Define an additional MLB path variable. Multiple uses of \fB\-mlb\-path\-map\fP and \fB\-mlb\-path\-var\fP are allowed, with variable definitions in later path maps taking precedence over earlier ones. .TP \fB\-output \fIfile\fP\fR Specify the name of the final output file. The default name is the input file name with its suffix removed and an appropriate, possibly empty, suffix added. .TP \fB\-profile \fI{\fBno\fP|\fBalloc\fP|\fBcount\fP|\fBtime\fP}\fP\fR Produce an executable that gathers profiling data. When such an executable is run, it will produce an \fBmlmon.out\fP file. The man page on \fBmlprof\fP describes how to extract information from this file. .TP \fB\-profile\-branch \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR If true, the profiler will separately gather profiling data for each branch of a function definition, \fBcase\fP expression, and \fBif\fP expression. .TP \fB\-profile\-stack \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR If true, the profiler will gather profiling data for all functions on the stack, not just the currently executing function. .TP \fB\-profile\-val \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR If true, the profiler will separately gather profiling data for each (expansive) \fBval\fP declaration. .TP \fB\-runtime \fIarg\fP\fR Pass argument to the runtime system via \fB@MLton\fP. The argument will be processed before other \fB@MLton\fP command line switches. Multiple uses of \fB\-runtime\fP are allowed, and will pass all the arguments in order. If the same runtime switch occurs more than once, then the last setting will take effect. There is no need to supply the leading \fB@MLton\fP or the trailing \fB\-\-\fP; these will be supplied automatically. An argument to \fB\-runtime\fP may contain spaces, which will cause the argument to be treated as a sequence of words by the runtime. For example, the command line: .in +.5i \fBmlton \-runtime 'ram\-slop 0.4' foo.sml\fP .in -.5i will cause foo to run as if it had been called like .in +.5i \fBfoo @MLton ram\-slop 0.4 \-\-\fP .in -.5i An executable created with \fB\-runtime stop\fP doesn't process any \fB@MLton\fP arguments. This is useful to create an executable, e.g. \fBecho\fP, that must treat \fB@MLton\fP like any other command-line argument. .in +.5i \fB% mlton \-runtime stop echo.sml\fP .in -.5i .in +.5i \fB% echo @MLton \-\-\fP .in -.5i .in +.5i \fB@MLton \-\-\fP .in -.5i .TP \fB\-show\-basis \fIfile\fP\fR Pretty print to \fIfile\fP the basis defined by the input program. .TP \fB\-show\-def\-use \fIfile\fP\fR Output def-use information to \fIfile\fP. Each identifier that is defined appears on a line, followed on subsequent lines by the position of each use. .TP \fB\-stop \fI{\fBf\fP|\fBg\fP|\fBo\fP|\fBtc\fP}\fP\fR Specify when to stop. .in +.5i \fBf\fP list of files on stdout (only makes sense when input is \fBfoo.mlb\fP) .br \fBg\fP generated \fB.c\fP and \fB.s\fP files .br \fBo\fP object (\fB.o\fP) files .br \fBtc\fP after type checking .in -.5i If you compile \fB\-stop g\fP or \fB\-stop o\fP, you can resume compilation by running \fBMLton\fP on the generated \fB.c\fP and \fB.s\fP or \fB.o\fP files. .TP \fB\-target \fI{\fBself\fP|...}\fP\fR Generate an executable that runs on the specified platform. The default is \fBself\fP, which means to compile for the machine that \fBMLton\fP is running on. To use any other target, you must first install a cross compiler. See the \fBMLton Guide\fP for details. .TP \fB\-target\-as\-opt \fItarget\fP \fIoption\fP\fR Like \fB\-as\-opt\fP, this passes \fIoption\fP to \fBgcc\fP when assembling, except it only passes \fIoption\fP when the target architecture or operating system is \fItarget\fP. Valid values for \fItarget\fP are: \fBalpha\fP, \fBamd64\fP, \fBarm,\fP, \fBhppa\fP, \fBia64\fP, \fBm68k\fP, \fBmips\fP, \fBpowerpc\fP, \fBpowerpc64\fP, \fBs390\fP, \fBsparc\fP, \fBx86\fP, \fBaix\fP, \fBcygwin\fP, \fBdarwin\fP, \fBfreebsd\fP, \fBhurd\fP, \fBhpux\fP, \fBlinux\fP, \fBmingw\fP, \fBnetbsd\fP, \fBopenbsd\fP, \fBsolaris\fP. .TP \fB\-target\-cc\-opt \fItarget\fP \fIoption\fP\fR Like \fB\-cc\-opt\fP, this passes \fIoption\fP to \fBgcc\fP when compiling C code, except it only passes \fIoption\fP when the target architecture or operating system is \fItarget\fP. Valid values for \fItarget\fR are as for \fB\-target\-as\-opt\fP. .TP \fB\-target\-link\-opt \fItarget\fP \fIoption\fP\fR Like \fB\-link\-opt\fP, this passes \fIoption\fP to \fBgcc\fP when linking, except it only passes \fIoption\fP when the target architecture or operating system is \fItarget\fP. Valid values for \fItarget\fP are as for \fB\-target\-as\-opt\fP. .TP \fB\-verbose \fI{\fB0\fP|\fB1\fP|\fB2\fP|\fB3\fP}\fP\fR How verbose to be about what passes are running. The default is 0. .in +.5i \fB0\fP silent .br \fB1\fP calls to compiler, assembler, and linker .br \fB2\fP 1, plus intermediate compiler passes .br \fB3\fP 2, plus some data structure sizes .in -.5i .SH Runtime system options Executables produced by \fBMLton\fP take command line arguments that control the runtime system. These arguments are optional, and occur before the executable's usual arguments. To use these options, the first argument to the executable must be \fB@MLton\fP. The optional arguments then follow, must be terminated by \fB\-\-\fP, and are followed by any arguments to the program. The optional arguments are \fInot\fP made available to the SML program via \fBCommandLine.arguments\fP. For example, a valid call to \fBhello-world\fP is: .in +.5i \fBhello-world @MLton gc\-summary fixed\-heap 10k \-\- a b c\fP .in -.5i In the above example, \fBCommandLine.arguments () = ["a", "b", "c"]\fP. It is allowed to have a sequence of \fB@MLton\fP arguments, as in: .in +.5i \fBhello-world @MLton gc\-summary \-\- @MLton fixed\-heap 10k \-\- a b c\fP .in -.5i Run-time options can also control \fBMLton\fP, as in .in +.5i \fBmlton @MLton fixed\-heap 0.5g \-\- foo.sml\fP .in -.5i .TP \fBfixed\-heap \fIx{\fBk\fP|\fBK\fP|\fBm\fP|\fBM\fP|\fBg\fP|\fBG\fP}\fP\fR Use a fixed size heap of size \fIx\fP, where \fIx\fP is a real number and the trailing letter indicates its units. .in +.5i \fBk\fP or \fBK\fP 1024 .br \fPm\fP or \fBM\fP 1,048,576 .br \fBg\fP or \fBG\fP 1,073,741,824 .in -.5i A value of \fB0\fP means to use almost all the RAM present on the machine. The heap size used by \fBfixed\-heap\fP includes all memory allocated by SML code, including memory for the stack (or stacks, if there are multiple threads). It does not, however, include any memory used for code itself or memory used by C globals, the C stack, or malloc. .TP \fBgc\-messages\fP Print a message at the start and end of every garbage collection. .TP \fBgc\-summary\fP Print a summary of garbage collection statistics upon program termination. .TP \fBload\-world \fIworld\fP\fR Restart the computation with the file specified by \fIworld\fP, which must have been created by a call to \fBMLton.World.save\fP by the same executable. See the \fBMLton Guide\fP for details. .TP \fBmax\-heap \fIx{\fBk\fP|\fBK\fP|\fBm\fP|\fBM\fP|\fBg\fP|\fBG\fP}\fP\fR Run the computation with an automatically resized heap that is never larger than \fIx\fP, where \fIx\fP is a real number and the trailing letter indicates the units as with \fBfixed\-heap\fP. The heap size for \fBmax\-heap\fP is accounted for as with \fBfixed\-heap\fP. .TP \fBmay\-page\-heap \fI{\fBfalse\fP|\fBtrue\fP}\fP\fR Enable paging the heap to disk when unable to grow the heap to a desired size. .TP \fBno\-load\-world\fP Disable \fBload\-world\fP. This can be used as an argument to the compiler via \fB\-runtime no\-load\-world\fP to create executables that will not load a world. This may be useful to ensure that set-uid executables do not load some strange world. .TP \fBram\-slop \fIx\fP\fR Multiply \fBx\fP by the amount of RAM on the machine to obtain what the runtime views as the amount of RAM it can use. Typically \fBx\fP is less than 1, and is used to account for space used by other programs running on the same machine. .TP \fBstop\fP Causes the runtime to stop processing \fB@MLton\fP arguments once the next \fB\-\-\fP is reached. This can be used as an argument to the compiler via \fB\-runtime stop\fP to create executables that don't process any \fB@MLton\fP arguments. .SH DIAGNOSTICS MLton's type error messages are not in a form suitable for processing by Emacs. For details on how to fix this, see http://mlton.org/Emacs. .SH "SEE ALSO" .BR mlprof (1) and the \fBMLton Guide\fP. mlton-20100608/man/mlyacc.10000644000076600000240000000074611404435642013676 0ustar mtfstaff.TH mlyacc 1 "February 23, 2008" .SH NAME \fBmlyacc\fP \- parser generator for use with Standard ML and MLton .SH SYNOPSIS \fBmlyacc foo.grm\fR .SH DESCRIPTION .PP \fBmlyacc\fP takes as input a parser specification \fBfoo.grm\fP and produces as output in \fBfoo.grm.sig\fP and \fBfoo.grm.sml\fP a parser written in SML. For details on the parser specification, see the \fBML-Yacc User's Manual\fP, which is in \fB/usr/share/doc/mlyacc.pdf\fP. .SH "SEE ALSO" .BR mllex (1), mlton (1) mlton-20100608/mllex/0000755000076600000240000000000011404470407012701 5ustar mtfstaffmlton-20100608/mllex/.ignore0000644000076600000240000000016511404435622014167 0ustar mtfstaff*.call-graph.dot *.ssa html lexgen.aux lexgen.dvi lexgen.log lexgen.toc mllex mllex.exe mllex.pdf mllex.ps mllex.sml mlton-20100608/mllex/call-main.sml0000644000076600000240000000041711404435622015255 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20100608/mllex/lexgen.doc0000644000076600000240000005167611404435622014671 0ustar mtfstaff A lexical analyzer generator for Standard ML. THIS TEXT FILE IS OBSOLETE and IS NOT MAINTAINED. The current (maintained) documentation is in lexgen.tex. Andrew W. Appel James S. Mattson David R. Tarditi Princeton University Version 1.6, October 1994 Copyright (c) 1989-1992 by Andrew W. Appel, James S. Mattson, David R. Tarditi This software comes with ABSOLUTELY NO WARRANTY. This software is subject only to the PRINCETON STANDARD ML SOFTWARE LIBRARY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER, (in the file "COPYRIGHT", distributed with this software). You may copy and distribute this software; see the COPYRIGHT NOTICE for details and restrictions. I. General Description Computer programs often need to divide their input into words and distinguish between different kinds of words. Compilers, for example, need to distinguish between integers, reserved words, and identifiers. Applications programs often need to be able to recognize components of typed commands from users. The problem of segmenting input into words and recognizing classes of words is known as lexical analysis. Small cases of this problem, such as reading text strings separated by spaces, can be solved by using hand-written programs. Larger cases of this problem, such as tokenizing an input stream for a compiler, can also be solved using hand-written programs. A hand-written program for a large lexical analysis problem, however, suffers from two major problems. First, the program requires a fair amount of programmer time to create. Second, the description of classes of words is not explicit in the program. It must be inferred from the program code. This makes it difficult to verify if the program recognizes the correct words for each class. It also makes future maintenance of the program difficult. Lex, a programming tool for the Unix system, is a successful solution to the general problem of lexical analysis. It uses regular expressions to describe classes of words. A program fragment is associated with each class of words. This information is given to Lex as a specification (a Lex program). Lex produces a program for a function that can be used to perform lexical analysis. The function operates as follows. It finds the longest word starting from the current position in the input stream that is in one of the word classes. It executes the program fragment associated with the class, and sets the current position in the input stream to be the character after the word. The program fragment has the actual text of the word available to it, and may be any piece of code. For many applications it returns some kind of value. Lex allows the programmer to make the language description explicit, and to concentrate on what to do with the recognized words, not how to recognize the words. It saves programmer time and increases program maintainability. Unfortunately, Lex is targeted only C. It also places artificial limits on the size of strings that can be recognized. ML-Lex is a variant of Lex for the ML programming language. ML-Lex has a syntax similar to Lex, and produces an ML program instead of a C program. ML-Lex produces a program that runs very efficiently. Typically the program will be as fast or even faster than a hand-coded lexer implemented in Standard ML. The program typically uses only a small amount of space. ML-Lex thus allows ML programmers the same benefits that Lex allows C programmers. It also does not place artificial limits on the size of recognized strings. II. ML-Lex specifications An ML-Lex specification has the general format: {user declarations} %% {ML-Lex definitions} %% {rules} Each section is separated from the others by a '%%' delimiter. The rules are used to define the lexical analysis function. Each rule has two parts - a regular expression and an action. The regular expression defines the word class that a rule matches. The action is a program fragment to be executed when a rule matches the input. The actions are used to compute values, and must all return values of the same type. The user can define values available to all rule actions in the user declarations section. The user must define two values in this section - a type lexresult and a function eof. Lexresult defines the type of values returned by the rule actions. The function "eof" is called by the lexer when the end of the input stream is reached. It will typically return a value signalling eof or raise an exception. It is called with the same argument as lex (see %arg, below), and must return a value of type lexresult. In the definitions section, the user can define named regular expressions, a set of start states, and specify which of the various bells and whistles of ML-Lex are desired. The start states allow the user to control when certain rules are matched. Rules may be defined to match only when the lexer is in specific start states. The user may change the lexer's start state in a rule action. This allows the user to specify special handling of lexical objects. This feature is typically used to handle quoted strings with escapes to denote special characters. The rules to recognize the inside contents of a string are defined for only one start state. This start state is entered when the beginning of a string is recognized, and exited when the end of the string is recognized. III. Regular expressions. Regular expressions are a simple language for denoting classes of strings. A regular expression is defined inductively over an alphabet with a set of basic operations. The alphabet for ML-Lex is the Ascii character set (character codes 0-127; or if %full is used, 0-255). The syntax and semantics of regular expressions will be described in order of decreasing precedence (from the most tightly-binding operators to the most weakly-binding): An individual character stands for itself, except for the reserved characters ? * + | ( ) ^ $ / ; . = < > [ { " \ A backslash followed by one of the reserved characters stands for that character. A set of characters enclosed in square brackets [ ] stands for any one of those characters. Inside the brackets, only the symbols \ - ^ are reserved. An initial up-arrow ^ stands for the complement of the characters listed, e.g. [^abc] stands any character except a, b, or c. The hyphen - denotes a range of characters, e.g. [a-z] stands for any lower-case alphabetic character, and [0-9a-fA-F] stands for any hexadecimal digit. To include ^ literally in a bracketed set, put it anywhere but first; to include - literally in a set, put it first or last. The dot . character stands for any character except newline, i.e. the same as [^\n] The following special escape sequences are available, inside or outside of square-brackets: \b - backspace \n - newline \t - tab \h - stands for all characters with codes >127, when 7-bit characters are used. \ddd - where ddd is a 3 digit decimal escape. A sequence of characters will stand for itself (reserved characters will be taken literally) if it is enclosed in double quotes " ". A named regular expression (defined in the "definitions" section) may be referred to by enclosing its name in braces { }. Any regular expression may be enclosed in parentheses ( ) for syntactic (but, as usual, not semantic) effect. The postfix operator * stands for Kleene closure: zero or more repetitions of the preceding expression. The postfix operator + stands for one or more repetitions of the preceding expression. The postfix operator ? stands for zero or one occurrence of the preceding expression. A postfix repetition range {n1,n2} where n1 and n2 are small integers stands for any number of repetitions between n1 and n2 of the preceding expression. The notation {n1} stands for exactly n1 repetitions. Concatenation of expressions denotes concatenation of strings. The expression e1 e2 stands for any string that results from the concatenation of one string that matches e1 with another string that matches e2. The infix operator | stands for alternation. The expression e1 | e2 stands for anything that either e1 or e2 stands for. The infix operator / denotes lookahead. Lookahead is not implemented and cannot be used, because there is a bug in the algorithm for generating lexers with lookahead. If it could be used, the expression e1 / e2 would match any string that e1 stands for, but only when that string is followed by a string that matches e2. When the up-arrow ^ occurs at the beginning of an expression, that expression will only match strings that occur at the beginning of a line (right after a newline character). The dollar sign $ is not implemented, since it is an abbreviation for lookahead involving the newline character (that is, it is an abbreviation /\n). If it could be used, when the dollar sign $ occurred at the end of an expression, that expression would only match strings that occur at the end of a line (right before a newline character). Here are some examples of regular expressions, and descriptions of the set of strings they denote: 0 | 1 | 2 | 3 A single digit between 0 and 3 [0123] A single digit between 0 and 3 0123 The string "0123" 0* All strings of 0 or more 0's 00* All strings of 1 or more 0's 0+ All strings of 1 or more 0's [0-9]{3} Any three-digit decimal number. \\[ntb] The strings "\n" "\t" "\b" (00)* Any string with an even number of 0's. IV. ML-Lex syntax summary A. User declarations Anything up to the first %% is in the user declarations section. The user should note that no symbolic identifier containing '%%' can be used in this section. B. ML-Lex definitions Start states can be defined with %s {identifier list} ; or %S {identifier list} ; An identifier list consists of one or more identifiers. An identifier consists of one or more letters, digits, underscores, or primes. It must begin with a letter. Named expressions can be defined with {identifier} = {regular expression} ; Regular expressions are defined below. The following % commands are also available: %reject - create REJECT() function %count - count newlines using yylineno %full - create lexer for the full 8-bit character set, with characters in the range 0-255 permitted as input. %structure {identifier} - name the structure in the output program {identifier} instead of Mlex %header - use code following it to create header for lexer structure %arg - extra (curried) formal parameter argument to be passed to the lex functions, and to be passed to the eof function in place of () These functions are discussed below, under values available to actions. C. Rules Each rule has the format: {regular expression} => ( ... code ... ); All parentheses in ... code ... must be balanced, including those used in strings and comments. The start state list is optional. It consists of a list of identifiers separated by commas, and is delimited by triangle brackets < >. Each identifier must be a start state defined in the %s section above. The regular expression is only recognized when the lexer is in one of the start states in the start state list. If no start state list is given, the expression is recognized in all start states. The lexer begins in a pre-defined start state called INITIAL. The lexer resolves conflicts among rules by choosing the rule with the longest match, and in the case two rules match the same string, choosing the rule listed first in the specification. The rules should match all possible input. If some input occurs that does not match any rule, the lexer created by ML-Lex will raise an exception LexError. Note that this differs from C Lex, which prints any unmatched input on the standard output. V. Values available inside the code associated with a rule. Mlex places the value of the string matched by a regular expression in yytext, a string variable. The user may recursively call the lexing function with lex(). (If %arg is used, the lexing function may be re-invoked with the same argument by using continue().) This is convenient for ignoring white space or comments silently: [\ \t\n]+ => ( lex()); To switch start states, the user may call YYBEGIN with the name of a start state. The following values will be available only if the corresponding % command is in the ML-Lex definitions sections: value %command description ----- -------- ----------- REJECT %reject REJECT() causes the current rule to be "rejected." The lexer behaves as if the current rule had not matched; another rule that matches this string, or that matches the longest possible prefix of this string, is used instead. yypos Current character position from beginning of file. yylineno %count Current line number These values should be used only if necessary. Adding REJECT to a lexer will slow it down by 20%; adding yylineno will slow it down by another 20%, or more. (It is much more efficient to recognize \n and have an action that increments the line-number variable.) The use of the lookahead operator / will also slow down the entire lexer. The character-position, yypos, is not costly to maintain, however. VI. Running ML-Lex From the Unix shell, run sml-lex myfile.lex The output file will be myfile.lex.sml. The extension ".lex" is not required but is recommended. Within an interactive system [not the preferred method]: Use "lexgen.sml"; this will create a structure LexGen. The function LexGen.lexGen creates a program for a lexer from an input specification. It takes a string argument -- the name of the file containing the input specification. The output file name is determined by appending ".sml" to the input file name. VII. Using the program produced by ML-Lex. When the output file is loaded, it will create a structure Mlex that contains the function makeLexer. makeLexer takes a function from int -> string and returns a lexing function. For example, val lexer = Mlex.makeLexer (inputc (open_in "f")) creates a lexer that operates on the file whose name is f. The function from int -> string should read a string of characters from the input stream. It should return a null string to indicate that the end of the stream has been reached. The integer is the number of characters that the lexer wishes to read; the function may return any non-zero number of characters. For example, val lexer = let val input_line = fn f => let fun loop result = let val c = input (f,1) val result = c :: result in if String.size c = 0 orelse c = "\n" then String.implode (rev result) else loop result end in loop nil end in Mlex.makeLexer (fn n => input_line std_in) end is appropriate for interactive streams where prompting, etc. occurs; the lexer won't care that input_line might return a string of more than or less than n characters. The lexer tries to read a large number of characters from the input function at once, and it is desirable that the input function return as many as possible. Reading many characters at once makes the lexer more efficient. Fewer input calls and buffering operations are needed, and input is more efficient in large block reads. For interactive streams this is less of a concern, as the limiting factor is the speed at which the user can type. To obtain a value, invoke the lexer by passing it a unit: val nextToken = lexer() If one wanted to restart the lexer, one would just discard "lexer" and create a new lexer on the same stream with another call to makeLexer. This is the best way to discard any characters buffered internally by the lexer. All code in the user declarations section is placed inside a structure UserDeclarations. To access this structure, use the path name Mlex.UserDeclarations. If any input cannot be matched, the program will raise the exception Mlex.LexError. An internal error (i.e. bug) will cause the exception Internal.LexerError to be raised. If %structure is used, remember that the structure name will no longer be Mlex, but the one specified in the command. VIII. Sample Here is a sample lexer for a calculator program: datatype lexresult= DIV | EOF | EOS | ID of string | LPAREN | NUM of int | PLUS | PRINT | RPAREN | SUB | TIMES val linenum = ref 1 val error = fn x => output(std_out,x ^ "\n") val eof = fn () => EOF %% %structure CalcLex alpha=[A-Za-z]; digit=[0-9]; ws = [\ \t]; %% \n => (inc linenum; lex()); {ws}+ => (lex()); "/" => (DIV); ";" => (EOS); "(" => (LPAREN); {digit}+ => (NUM (revfold (fn(a,r)=>ord(a)-ord("0")+10*r) (explode yytext) 0)); ")" => (RPAREN); "+" => (PLUS); {alpha}+ => (if yytext="print" then PRINT else ID yytext); "-" => (SUB); "*" => (TIMES); . => (error ("calc: ignoring bad character "^yytext); lex()); Here is the parser for the calculator: (* Sample interactive calculator to demonstrate use of lexer produced by ML-Lex The original grammar was stmt_list -> stmt_list stmt stmt -> print exp ; | exp ; exp -> exp + t | exp - t | t t -> t * f | t/f | f f -> (exp) | id | num The function parse takes a stream and parses it for the calculator program. If a syntax error occurs, parse prints an error message and calls itself on the stream. On this system that has the effect of ignoring all input to the end of a line. *) structure Calc = struct open CalcLex open UserDeclarations exception Error fun parse strm = let val say = fn s => output(std_out,s) val input_line = fn f => let fun loop result = let val c = input (f,1) val result = c :: result in if String.size c = 0 orelse c = "\n" then String.implode (rev result) else loop result end in loop nil end val lexer = makeLexer (fn n => input_line strm) val nexttok = ref (lexer()) val advance = fn () => (nexttok := lexer(); !nexttok) val error = fn () => (say ("calc: syntax error on line" ^ (makestring(!linenum)) ^ "\n"); raise Error) val lookup = fn i => if i = "ONE" then 1 else if i = "TWO" then 2 else (say ("calc: unknown identifier '" ^ i ^ "'\n"); raise Error) fun STMT_LIST () = case !nexttok of EOF => () | _ => (STMT(); STMT_LIST()) and STMT() = (case !nexttok of EOS => () | PRINT => (advance(); say ((makestring (E():int)) ^ "\n"); ()) | _ => (E(); ()); case !nexttok of EOS => (advance()) | _ => error()) and E () = E' (T()) and E' (i : int ) = case !nexttok of PLUS => (advance (); E'(i+T())) | SUB => (advance (); E'(i-T())) | RPAREN => i | EOF => i | EOS => i | _ => error() and T () = T'(F()) and T' i = case !nexttok of PLUS => i | SUB => i | TIMES => (advance(); T'(i*F())) | DIV => (advance (); T'(i div F())) | EOF => i | EOS => i | RPAREN => i | _ => error() and F () = case !nexttok of ID i => (advance(); lookup i) | LPAREN => let val v = (advance(); E()) in if !nexttok = RPAREN then (advance (); v) else error() end | NUM i => (advance(); i) | _ => error() in STMT_LIST () handle Error => parse strm end end mlton-20100608/mllex/lexgen.sml0000644000076600000240000016313411404435622014710 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-19. * Create line directives in output. *) (* Modified by Matthew Fluet on 2007-11-07. * Add %posint command. *) (* Modified by StephenWeeks on 2005-08-18. * Fix file starting position *) (* Modified by Stephen Weeks on 2004-10-19. * Do not create references to Unsafe structure. *) (* Lexical analyzer generator for Standard ML. Version 1.7.0, June 1998 Copyright (c) 1989-1992 by Andrew W. Appel, David R. Tarditi, James S. Mattson This software comes with ABSOLUTELY NO WARRANTY. This software is subject only to the PRINCETON STANDARD ML SOFTWARE LIBRARY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER, (in the file "COPYRIGHT", distributed with this software). You may copy and distribute this software; see the COPYRIGHT NOTICE for details and restrictions. Changes: 07/25/89 (drt): added %header declaration, code to place user declarations at same level as makeLexer, etc. This is needed for the parser generator. /10/89 (appel): added %arg declaration (see lexgen.doc). /04/90 (drt): fixed following bug: couldn't use the lexer after an error occurred -- NextTok and inquote weren't being reset 10/22/91 (drt): disabled use of lookahead 10/23/92 (drt): disabled use of $ operator (which involves lookahead), added handlers for dictionary lookup routine 11/02/92 (drt): changed handler for exception Reject in generated lexer to Internal.Reject 02/01/94 (appel): Moved the exception handler for Reject in such a way as to allow tail-recursion (improves performance wonderfully!). 02/01/94 (appel): Fixed a bug in parsing of state names. 05/19/94 (Mikael Pettersson, mpe@ida.liu.se): Transition tables are usually represented as strings, but when the range is too large, int vectors constructed by code like "Vector.vector[1,2,3,...]" are used instead. The problem with this isn't that the vector itself takes a lot of space, but that the code generated by SML/NJ to construct the intermediate list at run-time is *HUGE*. My fix is to encode an int vector as a string literal (using two bytes per int) and emit code to decode the string to a vector at run-time. SML/NJ compiles string literals into substrings in the code, so this uses much less space. 06/02/94 (jhr): Modified export-lex.sml to conform to new installation scheme. Also removed tab characters from string literals. 10/05/94 (jhr): Changed generator to produce code that uses the new basis style strings and characters. 10/06/94 (jhr) Modified code to compile under new basis style strings and characters. 02/08/95 (jhr) Modified to use new List module interface. 05/18/95 (jhr) changed Vector.vector to Vector.fromList * Revision 1.9 1998/01/06 19:23:53 appel * added %posarg feature to permit position-within-file to be passed * as a parameter to makeLexer * # Revision 1.8 1998/01/06 19:01:48 appel # repaired error messages like "cannot have both %structure and %header" # # Revision 1.7 1998/01/06 18:55:49 appel # permit %% to be unescaped within regular expressions # # Revision 1.6 1998/01/06 18:46:13 appel # removed undocumented feature that permitted extra %% at end of rules # # Revision 1.5 1998/01/06 18:29:23 appel # put yylineno variable inside makeLexer function # # Revision 1.4 1998/01/06 18:19:59 appel # check for newline inside quoted string # # Revision 1.3 1997/10/04 03:52:13 dbm # Fix to remove output file if ml-lex fails. # 10/17/02 (jhr) changed bad character error message to properly print the bad character. 10/17/02 (jhr) fixed skipws to use Char.isSpace test. 07/27/05 (jhr) add \r as a recognized escape sequence. *) (* Subject: lookahead in sml-lex Reply-to: david.tarditi@CS.CMU.EDU Date: Mon, 21 Oct 91 14:13:26 -0400 There is a serious bug in the implementation of lookahead, as done in sml-lex, and described in Aho, Sethi, and Ullman, p. 134 "Implementing the Lookahead Operator" We have disallowed the use of lookahead for now because of this bug. As a counter-example to the implementation described in ASU, consider the following specification with the input string "aba" (this example is taken from a comp.compilers message from Dec. 1989, I think): type lexresult=unit val linenum = ref 1 fun error x = TextIO.output(TextIO.stdErr, x ^ "\n") val eof = fn () => () %% %structure Lex %% (a|ab)/ba => (print yytext; print "\n"; ()); The ASU proposal works as follows. Suppose that we are using NFA's to represent our regular expressions. Then to build an NFA for e1 / e2, we build an NFA n1 for e1 and an NFA n2 for e2, and add an epsilon transition from e1 to e2. When lexing, when we encounter the end state of e1e2, we take as the end of the string the position in the string that was the last occurrence of the state of the NFA having a transition on the epsilon introduced for /. Using the example we have above, we'll have an NFA with the following states: 1 -- a --> 2 -- b --> 3 | | | epsilon | epsilon | | |------------> 4 -- b --> 5 -- a --> 6 On our example, we get the following list of transitions: a : 2, 4 (make an epsilon transition from 2 to 4) ab : 3, 4, 5 (make an epsilon transition from 3 to 4) aba : 6 If we chose the last state in which we made an epsilon transition, we'll chose the transition from 3 to 4, and end up with "ab" as our token, when we should have "a" as our token. *) functor RedBlack(B : sig type key val > : key*key->bool end): sig type tree type key val empty : tree val insert : key * tree -> tree val lookup : key * tree -> key exception notfound of key end = struct open B datatype color = RED | BLACK datatype tree = empty | tree of key * color * tree * tree exception notfound of key fun insert (key,t) = let fun f empty = tree(key,RED,empty,empty) | f (tree(k,BLACK,l,r)) = if key>k then case f r of r as tree(rk,RED, rl as tree(rlk,RED,rll,rlr),rr) => (case l of tree(lk,RED,ll,lr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(rlk,BLACK,tree(k,RED,l,rll), tree(rk,RED,rlr,rr))) | r as tree(rk,RED,rl, rr as tree(rrk,RED,rrl,rrr)) => (case l of tree(lk,RED,ll,lr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(rk,BLACK,tree(k,RED,l,rl),rr)) | r => tree(k,BLACK,l,r) else if k>key then case f l of l as tree(lk,RED,ll, lr as tree(lrk,RED,lrl,lrr)) => (case r of tree(rk,RED,rl,rr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(lrk,BLACK,tree(lk,RED,ll,lrl), tree(k,RED,lrr,r))) | l as tree(lk,RED, ll as tree(llk,RED,lll,llr), lr) => (case r of tree(rk,RED,rl,rr) => tree(k,RED,tree(lk,BLACK,ll,lr), tree(rk,BLACK,rl,rr)) | _ => tree(lk,BLACK,ll,tree(k,RED,lr,r))) | l => tree(k,BLACK,l,r) else tree(key,BLACK,l,r) | f (tree(k,RED,l,r)) = if key>k then tree(k,RED,l, f r) else if k>key then tree(k,RED, f l, r) else tree(key,RED,l,r) in case f t of tree(k,RED, l as tree(_,RED,_,_), r) => tree(k,BLACK,l,r) | tree(k,RED, l, r as tree(_,RED,_,_)) => tree(k,BLACK,l,r) | t => t end fun lookup (key,t) = let fun look empty = raise (notfound key) | look (tree(k,_,l,r)) = if k>key then look l else if key>k then look r else k in look t end end signature LEXGEN = sig val lexGen: string -> unit end structure LexGen: LEXGEN = struct open Array List infix 9 sub type pos = {line : int, col : int} datatype token = CHARS of bool array | QMARK | STAR | PLUS | BAR | LP | RP | CARAT | DOLLAR | SLASH | STATE of string list | REPS of int * int | ID of string | ACTION of pos * string | BOF | EOF | ASSIGN | SEMI | ARROW | LEXMARK | LEXSTATES | COUNT | REJECT | FULLCHARSET | STRUCT | HEADER | ARG | POSARG | POSINT datatype exp = EPS | CLASS of bool array * int | CLOSURE of exp | ALT of exp * exp | CAT of exp * exp | TRAIL of int | END of int (* flags describing input Lex spec. - unnecessary code is omitted *) (* if possible *) val CharFormat = ref false; val UsesTrailingContext = ref false; val UsesPrevNewLine = ref false; (* flags for various bells & whistles that Lex has. These slow the lexer down and should be omitted from production lexers (if you really want speed) *) val CountNewLines = ref false; val PosArg = ref false; val HaveReject = ref false; (* Can increase size of character set *) val CharSetSize = ref 129; (* Can name structure or declare header code *) val StrName = ref "Mlex" val HeaderCode = ref "" val HeaderPos = ref {line = 0, col = 0} val HeaderDecl = ref false val ArgCode = ref (NONE: (pos * string) option) val StrDecl = ref false (* Can define INTEGER structure for yypos variable. *) val PosIntName = ref "Int" val PosIntDecl = ref false val ResetFlags = fn () => (CountNewLines := false; HaveReject := false; PosArg := false; UsesTrailingContext := false; CharSetSize := 129; StrName := "Mlex"; HeaderCode := ""; HeaderDecl:= false; ArgCode := NONE; StrDecl := false; PosIntName := "Int"; PosIntDecl := false) val LexOut = ref(TextIO.stdOut) val LexOutLine = ref 1 fun setLexOut s = (LexOut := s; LexOutLine := 1) fun say x = (TextIO.output (!LexOut, x) ; CharVector.app (fn #"\n" => LexOutLine := !LexOutLine + 1 | _ => ()) x) val InFile = ref "" val OutFile = ref "" fun fmtLineDir {line, col} file = String.concat ["(*#line ", Int.toString line, ".", Int.toString (col+1), " \"", OS.FileSys.fullPath file, "\"*)"] val sayPos = fn SOME pos => say (fmtLineDir pos (!InFile)) | NONE => (say (fmtLineDir {line = !LexOutLine, col = 0} (!OutFile)); say "\n") (* Union: merge two sorted lists of integers *) fun union(a,b) = let val rec merge = fn (nil,nil,z) => z | (nil,el::more,z) => merge(nil,more,el::z) | (el::more,nil,z) => merge(more,nil,el::z) | (x::morex,y::morey,z) => if (x:int)=(y:int) then merge(morex,morey,x::z) else if x>y then merge(morex,y::morey,x::z) else merge(x::morex,morey,y::z) in merge(rev a,rev b,nil) end (* Nullable: compute if a important expression parse tree node is nullable *) val rec nullable = fn EPS => true | CLASS(_) => false | CLOSURE(_) => true | ALT(n1,n2) => nullable(n1) orelse nullable(n2) | CAT(n1,n2) => nullable(n1) andalso nullable(n2) | TRAIL(_) => true | END(_) => false (* FIRSTPOS: firstpos function for parse tree expressions *) and firstpos = fn EPS => nil | CLASS(_,i) => [i] | CLOSURE(n) => firstpos(n) | ALT(n1,n2) => union(firstpos(n1),firstpos(n2)) | CAT(n1,n2) => if nullable(n1) then union(firstpos(n1),firstpos(n2)) else firstpos(n1) | TRAIL(i) => [i] | END(i) => [i] (* LASTPOS: Lastpos function for parse tree expressions *) and lastpos = fn EPS => nil | CLASS(_,i) => [i] | CLOSURE(n) => lastpos(n) | ALT(n1,n2) => union(lastpos(n1),lastpos(n2)) | CAT(n1,n2) => if nullable(n2) then union(lastpos(n1),lastpos(n2)) else lastpos(n2) | TRAIL(i) => [i] | END(i) => [i] ; (* ++: Increment an integer reference *) fun ++(x) : int = (x := !x + 1; !x); structure dict = struct type 'a relation = 'a * 'a -> bool abstype ('b,'a) dictionary = DATA of { Table : ('b * 'a) list, Leq : 'b * 'b -> bool } with exception LOOKUP fun create Leqfunc = DATA { Table = nil, Leq = Leqfunc } fun lookup (DATA { Table = entrylist, Leq = leq }) key = let fun search [] = raise LOOKUP | search((k,item)::entries) = if leq(key,k) then if leq(k,key) then item else raise LOOKUP else search entries in search entrylist end fun enter (DATA { Table = entrylist, Leq = leq }) (newentry as (key : 'b,item :'a)) : ('b,'a) dictionary = let val gt = fn a => fn b => not (leq(a,b)) val eq = fn k => fn k' => (leq(k,k')) andalso (leq(k',k)) fun update nil = [ newentry ] | update ((entry as (k,_))::entries) = if (eq key k) then newentry::entries else if gt k key then newentry::(entry::entries) else entry::(update entries) in DATA { Table = update entrylist, Leq = leq } end fun listofdict (DATA { Table = entrylist,Leq = leq}) = let fun f (nil,r) = rev r | f (a::b,r) = f (b,a::r) in f(entrylist,nil) end end end open dict; (* INPUT.ML : Input w/ one character push back capability *) val LineNum = ref 1; abstype ibuf = BUF of TextIO.instream * {b : string ref, p : int ref} with local val pos = ref 0 val linePos = ref 0 (* incorrect after ungetch newline, non fatal *) in fun resetLexPos () = (LineNum := 1; pos := 0; linePos :=0) fun getLexPos () = {line = !LineNum, col = !pos - !linePos} fun make_ibuf(s) = BUF (s, {b=ref"", p = ref 0}) fun close_ibuf (BUF (s,_)) = TextIO.closeIn(s) exception eof fun getch (a as (BUF(s,{b,p}))) = if (!p = (size (!b))) then (b := TextIO.inputN(s, 1024); p := 0; if (size (!b))=0 then raise eof else getch a) else (let val ch = String.sub(!b,!p) in (pos := !pos + 1; if ch = #"\n" then (LineNum := !LineNum + 1; linePos := !pos) else (); p := !p + 1; ch) end) fun ungetch(BUF(s,{b,p})) = ( pos := !pos - 1; p := !p - 1; if String.sub(!b,!p) = #"\n" then LineNum := !LineNum - 1 else ()) end end; exception Error fun prErr x = ( TextIO.output (TextIO.stdErr, String.concat [ "ml-lex: error, line ", (Int.toString (!LineNum)), ": ", x, "\n" ]); raise Error) fun prSynErr x = ( TextIO.output (TextIO.stdErr, String.concat [ "ml-lex: syntax error, line ", (Int.toString (!LineNum)), ": ", x, "\n" ]); raise Error) exception SyntaxError; (* error in user's input file *) exception LexError; (* unexpected error in lexer *) val LexBuf = ref(make_ibuf(TextIO.stdIn)); val LexState = ref 0; val NextTok = ref BOF; val inquote = ref false; fun AdvanceTok () : unit = let fun isLetter c = ((c >= #"a") andalso (c <= #"z")) orelse ((c >= #"A") andalso (c <= #"Z")) fun isDigit c = (c >= #"0") andalso (c <= #"9") (* check for valid (non-leading) identifier character (added by JHR) *) fun isIdentChr c = ((isLetter c) orelse (isDigit c) orelse (c = #"_") orelse (c = #"'")) fun atoi s = let fun num (c::r, n) = if isDigit c then num (r, 10*n + (Char.ord c - Char.ord #"0")) else n | num ([], n) = n in num (explode s, 0) end fun skipws () = let val ch = nextch() in if Char.isSpace ch then skipws() else ch end and nextch () = getch(!LexBuf) and escaped () = (case nextch() of #"b" => #"\008" | #"n" => #"\n" | #"r" => #"\r" | #"t" => #"\t" | #"h" => #"\128" | x => let fun err t = prErr("illegal ascii escape '"^(implode(rev t))^"'") fun cvt c = (Char.ord c - Char.ord #"0") fun f (n, c, t) = if c=3 then if n >= (!CharSetSize) then err t else Char.chr n else let val ch=nextch() in if isDigit ch then f(n*10+(cvt ch), c+1, ch::t) else err t end in if isDigit x then f(cvt x, 1, [x]) else x end (* end case *)) and onechar x = let val c = array(!CharSetSize, false) in update(c, Char.ord(x), true); CHARS(c) end in case !LexState of 0 => let val makeTok = fn () => case skipws() (* Lex % operators *) of #"%" => (case nextch() of #"%" => LEXMARK | a => let fun f s = let val a = nextch() in if isLetter a then f(a::s) else (ungetch(!LexBuf); implode(rev s)) end in case f [a] of "reject" => REJECT | "count" => COUNT | "full" => FULLCHARSET | "s" => LEXSTATES | "S" => LEXSTATES | "structure" => STRUCT | "header" => HEADER | "arg" => ARG | "posarg" => POSARG | "posint" => POSINT | _ => prErr "unknown % operator " end ) (* semicolon (for end of LEXSTATES) *) | #";" => SEMI (* anything else *) | ch => if isLetter(ch) then let fun getID matched = let val x = nextch() (**** fix by JHR in if isLetter(x) orelse isDigit(x) orelse x = "_" orelse x = "'" ****) in if (isIdentChr x) then getID (x::matched) else (ungetch(!LexBuf); implode(rev matched)) end in ID(getID [ch]) end else prSynErr (String.concat[ "bad character: \"", Char.toString ch, "\"" ]) in NextTok := makeTok() end | 1 => let val rec makeTok = fn () => if !inquote then case nextch() of (* inside quoted string *) #"\\" => onechar(escaped()) | #"\"" => (inquote := false; makeTok()) | #"\n" => (prSynErr "end-of-line inside quoted string"; inquote := false; makeTok()) | x => onechar(x) else case skipws() of (* single character operators *) #"?" => QMARK | #"*" => STAR | #"+" => PLUS | #"|" => BAR | #"(" => LP | #")" => RP | #"^" => CARAT | #"$" => DOLLAR | #"/" => SLASH | #";" => SEMI | #"." => let val c = array(!CharSetSize,true) in update(c,10,false); CHARS(c) end (* assign and arrow *) | #"=" => let val c = nextch() in if c = #">" then ARROW else (ungetch(!LexBuf); ASSIGN) end (* character set *) | #"[" => let val rec classch = fn () => let val x = skipws() in if x = #"\\" then escaped() else x end; val first = classch(); val flag = (first <> #"^"); val c = array(!CharSetSize,not flag); fun add NONE = () | add (SOME x) = update(c, Char.ord(x), flag) and range (x, y) = if x>y then (prErr "bad char. range") else let val i = ref(Char.ord(x)) and j = Char.ord(y) in while !i<=j do ( add (SOME(Char.chr(!i))); i := !i + 1) end and getClass last = (case classch() of #"]" => (add(last); c) | #"-" => (case last of NONE => getClass(SOME #"-") | (SOME last') => let val x = classch() in if x = #"]" then (add(last); add(SOME #"-"); c) else (range(last',x); getClass(NONE)) end (* end case *)) | x => (add(last); getClass(SOME x)) (* end case *)) in CHARS(getClass(if first = #"^" then NONE else SOME first)) end (* Start States specification *) | #"<" => let val rec get_state = fn (prev,matched) => case nextch() of #">" => matched::prev | #"," => get_state(matched::prev,"") | x => if isIdentChr(x) then get_state(prev,matched ^ String.str x) else (prSynErr "bad start state list") in STATE(get_state(nil,"")) end (* {id} or repititions *) | #"{" => let val ch = nextch() in if isLetter(ch) then let fun getID matched = (case nextch() of #"}" => matched | x => if (isIdentChr x) then getID(matched ^ String.str x) else (prErr "invalid char. class name") (* end case *)) in ID(getID(String.str ch)) end else if isDigit(ch) then let fun get_r (matched, r1) = (case nextch() of #"}" => let val n = atoi(matched) in if r1 = ~1 then (n,n) else (r1,n) end | #"," => if r1 = ~1 then get_r("",atoi(matched)) else (prErr "invalid repetitions spec.") | x => if isDigit(x) then get_r(matched ^ String.str x,r1) else (prErr "invalid char in repetitions spec") (* end case *)) in REPS(get_r(String.str ch,~1)) end else (prErr "bad repetitions spec") end (* Lex % operators *) | #"\\" => onechar(escaped()) (* start quoted string *) | #"\"" => (inquote := true; makeTok()) (* anything else *) | ch => onechar(ch) in NextTok := makeTok() end | 2 => NextTok := (case skipws() of #"(" => let fun loop_to_end (backslash, x) = let val c = getch (! LexBuf) val notb = not backslash val nstr = c :: x in case c of #"\"" => if notb then nstr else loop_to_end (false, nstr) | _ => loop_to_end (c = #"\\" andalso notb, nstr) end fun GetAct (lpct, x) = let val c = getch (! LexBuf) val nstr = c :: x in case c of #"\"" => GetAct (lpct, loop_to_end (false, nstr)) | #"(" => GetAct (lpct + 1, nstr) | #")" => if lpct = 0 then implode (rev x) else GetAct(lpct - 1, nstr) | _ => GetAct(lpct, nstr) end in ACTION (getLexPos (), GetAct (0,nil)) end | #";" => SEMI | c => (prSynErr ("invalid character " ^ String.str c))) | _ => raise LexError end handle eof => NextTok := EOF ; fun GetTok (_:unit) : token = let val t = !NextTok in AdvanceTok(); t end; val SymTab = ref (create String.<=) : (string,exp) dictionary ref fun GetExp () : exp = let val rec optional = fn e => ALT(EPS,e) and lookup' = fn name => lookup(!SymTab) name handle LOOKUP => prErr ("bad regular expression name: "^ name) and newline = fn () => let val c = array(!CharSetSize,false) in update(c,10,true); c end and endline = fn e => trail(e,CLASS(newline(),0)) and trail = fn (e1,e2) => CAT(CAT(e1,TRAIL(0)),e2) and closure1 = fn e => CAT(e,CLOSURE(e)) and repeat = fn (min,max,e) => let val rec rep = fn (0,0) => EPS | (0,1) => ALT(e,EPS) | (0,i) => CAT(rep(0,1),rep(0,i-1)) | (i,j) => CAT(e,rep(i-1,j-1)) in rep(min,max) end and exp0 = fn () => case GetTok() of CHARS(c) => exp1(CLASS(c,0)) | LP => let val e = exp0() in if !NextTok = RP then (AdvanceTok(); exp1(e)) else (prSynErr "missing ')'") end | ID(name) => exp1(lookup' name) | _ => raise SyntaxError and exp1 = fn (e) => case !NextTok of SEMI => e | ARROW => e | EOF => e | LP => exp2(e,exp0()) | RP => e | t => (AdvanceTok(); case t of QMARK => exp1(optional(e)) | STAR => exp1(CLOSURE(e)) | PLUS => exp1(closure1(e)) | CHARS(c) => exp2(e,CLASS(c,0)) | BAR => ALT(e,exp0()) | DOLLAR => (UsesTrailingContext := true; endline(e)) | SLASH => (UsesTrailingContext := true; trail(e,exp0())) | REPS(i,j) => exp1(repeat(i,j,e)) | ID(name) => exp2(e,lookup' name) | _ => raise SyntaxError) and exp2 = fn (e1,e2) => case !NextTok of SEMI => CAT(e1,e2) | ARROW => CAT(e1,e2) | EOF => CAT(e1,e2) | LP => exp2(CAT(e1,e2),exp0()) | RP => CAT(e1,e2) | t => (AdvanceTok(); case t of QMARK => exp1(CAT(e1,optional(e2))) | STAR => exp1(CAT(e1,CLOSURE(e2))) | PLUS => exp1(CAT(e1,closure1(e2))) | CHARS(c) => exp2(CAT(e1,e2),CLASS(c,0)) | BAR => ALT(CAT(e1,e2),exp0()) | DOLLAR => (UsesTrailingContext := true; endline(CAT(e1,e2))) | SLASH => (UsesTrailingContext := true; trail(CAT(e1,e2),exp0())) | REPS(i,j) => exp1(CAT(e1,repeat(i,j,e2))) | ID(name) => exp2(CAT(e1,e2),lookup' name) | _ => raise SyntaxError) in exp0() end; val StateTab = ref(create(String.<=)) : (string,int) dictionary ref val StateNum = ref 0; fun GetStates () : int list = let fun add nil sl = sl | add (x::y) sl = add y (union ([lookup (!StateTab)(x) handle LOOKUP => prErr ("bad state name: "^x) ],sl)) fun addall i sl = if i <= !StateNum then addall (i+2) (union ([i],sl)) else sl fun incall (x::y) = (x+1)::incall y | incall nil = nil fun addincs nil = nil | addincs (x::y) = x::(x+1)::addincs y val state_list = case !NextTok of STATE s => (AdvanceTok(); LexState := 1; add s nil) | _ => addall 1 nil in case !NextTok of CARAT => (LexState := 1; AdvanceTok(); UsesPrevNewLine := true; incall state_list) | _ => addincs state_list end val LeafNum = ref ~1; fun renum(e : exp) : exp = let val rec label = fn EPS => EPS | CLASS(x,_) => CLASS(x,++LeafNum) | CLOSURE(e) => CLOSURE(label(e)) | ALT(e1,e2) => ALT(label(e1),label(e2)) | CAT(e1,e2) => CAT(label(e1),label(e2)) | TRAIL(i) => TRAIL(++LeafNum) | END(i) => END(++LeafNum) in label(e) end; exception ParseError; fun parse() : (string * (int list * exp) list * ((string,pos*string) dictionary)) = let val Accept = ref (create String.<=) : (string,pos*string) dictionary ref val rec ParseRtns = fn l => case getch(!LexBuf) of #"%" => let val c = getch(!LexBuf) in if c = #"%" then (implode (rev l)) else ParseRtns(c :: #"%" :: l) end | c => ParseRtns(c::l) and ParseDefs = fn () => (LexState:=0; AdvanceTok(); case !NextTok of LEXMARK => () | LEXSTATES => let fun f () = (case !NextTok of (ID i) => (StateTab := enter(!StateTab)(i,++StateNum); ++StateNum; AdvanceTok(); f()) | _ => ()) in AdvanceTok(); f (); if !NextTok=SEMI then ParseDefs() else (prSynErr "expected ';'") end | ID x => (LexState:=1; AdvanceTok(); if GetTok() = ASSIGN then (SymTab := enter(!SymTab)(x,GetExp()); if !NextTok = SEMI then ParseDefs() else (prSynErr "expected ';'")) else raise SyntaxError) | REJECT => (HaveReject := true; ParseDefs()) | COUNT => (CountNewLines := true; ParseDefs()) | FULLCHARSET => (CharSetSize := 256; ParseDefs()) | HEADER => (LexState := 2; AdvanceTok(); case GetTok() of ACTION (p, s) => if (!StrDecl) then (prErr "cannot have both %structure and %header \ \declarations") else if (!HeaderDecl) then (prErr "duplicate %header declarations") else (HeaderCode := s; LexState := 0; HeaderPos := p; HeaderDecl := true; ParseDefs()) | _ => raise SyntaxError) | POSARG => (PosArg := true; ParseDefs()) | POSINT => (AdvanceTok(); case !NextTok of (ID i) => if (!PosIntDecl) then (prErr "duplicate %posint declarations") else (PosIntName := i; PosIntDecl := true) | _ => (prErr "expected ID"); ParseDefs()) | ARG => (LexState := 2; AdvanceTok(); case GetTok() of ACTION s => (case !ArgCode of SOME _ => prErr "duplicate %arg declarations" | NONE => ArgCode := SOME s; LexState := 0; ParseDefs()) | _ => raise SyntaxError) | STRUCT => (AdvanceTok(); case !NextTok of (ID i) => if (!HeaderDecl) then (prErr "cannot have both %structure and %header \ \declarations") else if (!StrDecl) then (prErr "duplicate %structure declarations") else (StrName := i; StrDecl := true) | _ => (prErr "expected ID"); ParseDefs()) | _ => raise SyntaxError) and ParseRules = fn rules => (LexState:=1; AdvanceTok(); case !NextTok of EOF => rules | _ => let val s = GetStates() val e = renum(CAT(GetExp(),END(0))) in if !NextTok = ARROW then (LexState:=2; AdvanceTok(); case GetTok() of ACTION(act) => if !NextTok=SEMI then (Accept:=enter(!Accept) (Int.toString (!LeafNum),act); ParseRules((s,e)::rules)) else (prSynErr "expected ';'") | _ => raise SyntaxError) else (prSynErr "expected '=>'") end) in let val usercode = ParseRtns nil in (ParseDefs(); (usercode,ParseRules(nil),!Accept)) end end handle SyntaxError => (prSynErr "") fun makebegin () : unit = let fun make nil = () | make ((x,n:int)::y)=(say "val "; say x; say " = " ; say "STARTSTATE "; say (Int.toString n); say ";\n"; make y) in say "\n(* start state definitions *)\n\n"; make(listofdict(!StateTab)) end structure L = struct nonfix > type key = int list * string fun > ((key,item:string),(key',item')) = let fun f ((a:int)::a') (b::b') = if Int.> (a,b) then true else if a=b then f a' b' else false | f _ _ = false in f key key' end end structure RB = RedBlack(L) fun maketable (fins:(int * (int list)) list, tcs :(int * (int list)) list, tcpairs: (int * int) list, trans : (int*(int list)) list) : unit = (* Fins = (state #, list of final leaves for the state) list tcs = (state #, list of trailing context leaves which begin in this state) list tcpairs = (trailing context leaf, end leaf) list trans = (state #,list of transitions for state) list *) let datatype elem = N of int | T of int | D of int val count = ref 0 val _ = (if length(trans)<256 then CharFormat := true else CharFormat := false; if !UsesTrailingContext then (say "\ndatatype yyfinstate = N of int | \ \ T of int | D of int\n") else say "\ndatatype yyfinstate = N of int"; say "\ntype statedata = {fin : yyfinstate list, trans: "; case !CharFormat of true => say "string}" | false => say "int Vector.vector}"; say "\n(* transition & final state table *)\nval tab = let\n"; case !CharFormat of true => () | false => (say "fun decode s k =\n"; say " let val k' = k + k\n"; say " val hi = Char.ord(String.sub(s, k'))\n"; say " val lo = Char.ord(String.sub(s, k' + 1))\n"; say " in hi * 256 + lo end\n")) val newfins = let fun IsEndLeaf t = let fun f ((l,e)::r) = if (e=t) then true else f r | f nil = false in f tcpairs end fun GetEndLeaf t = let fun f ((tl,el)::r) = if (tl=t) then el else f r | f _ = raise Match in f tcpairs end fun GetTrConLeaves s = let fun f ((s',l)::r) = if (s = s') then l else f r | f nil = nil in f tcs end fun sort_leaves s = let fun insert (x:int) (a::b) = if (x <= a) then x::(a::b) else a::(insert x b) | insert x nil = [x] in List.foldr (fn (x,r) => insert x r) [] s end fun conv a = if (IsEndLeaf a) then (D a) else (N a) fun merge (a::a',b::b') = if (a <= b) then (conv a)::merge(a',b::b') else (T b)::(merge(a::a',b')) | merge (a::a',nil) = (conv a)::(merge (a',nil)) | merge (nil,b::b') = (T b)::(merge (b',nil)) | merge (nil,nil) = nil in map (fn (x,l) => rev (merge (l, sort_leaves (map (fn x => GetEndLeaf x) (GetTrConLeaves x))))) fins end val rs = let open RB fun makeItems x = let fun emit8(x, pos) = let val s = StringCvt.padLeft #"0" 3 (Int.toString x) in case pos of 16 => (say "\\\n\\\\"; say s; 1) | _ => (say "\\"; say s; pos+1) end fun emit16(x, pos) = let val hi8 = x div 256 val lo8 = x - hi8 * 256 (* x rem 256 *) in emit8(lo8, emit8(hi8, pos)) end fun MakeString([], _, _) = () | MakeString(x::xs, emitter, pos) = MakeString(xs, emitter, emitter(x, pos)) in case !CharFormat of true => (say " \n\""; MakeString(x,emit8,0); say "\"\n") | false => (say (Int.toString(length x)); say ", \n\""; MakeString(x,emit16,0); say "\"\n") end fun makeEntry(nil,rs,t) = rev rs | makeEntry(((l:int,x)::y),rs,t) = let val name = (Int.toString l) in let val (r,n) = lookup ((x,name),t) in makeEntry(y,(n::rs),t) end handle notfound _ => (count := !count+1; say " ("; say name; say ","; makeItems x; say "),\n"; makeEntry(y,(name::rs),(insert ((x,name),t)))) end val _ = say "val s = [ \n" val res = makeEntry(trans,nil,empty) val _ = case !CharFormat of true => (say "(0, \"\")]\n"; say "fun f x = x \n") | false => (say "(0, 0, \"\")]\n"; say "fun f(n, i, x) = (n, Vector.tabulate(i, decode x)) \n") val _ = say "val s = map f (rev (tl (rev s))) \n" val _ = say "exception LexHackingError \n" val _ = say "fun look ((j,x)::r, i: int) = if i = j then x else look(r, i) \n" val _ = say " | look ([], i) = raise LexHackingError\n" val _ = say "fun g {fin=x, trans=i} = {fin=x, trans=look(s,i)} \n" in res end fun makeTable args = let fun makeOne (a, b) = let fun item (N i) = ("N", i) | item (T i) = ("T", i) | item (D i) = ("D", i) fun makeItem x = let val (t, n) = item x in app say ["(", t, " ", Int.toString n, ")"] end fun makeItems [] = () | makeItems [x] = makeItem x | makeItems (hd :: tl) = (makeItem hd; say ","; makeItems tl) in say "{fin = ["; makeItems b; app say ["], trans = ", a, "}"] end fun mt ([], []) = () | mt ([a], [b]) = makeOne (a, b) | mt (a :: a', b :: b') = (makeOne (a, b); say ",\n"; mt (a', b')) | mt _ = raise Match in mt args end (* fun makeTable(nil,nil) = () | makeTable(a::a',b::b') = let fun makeItems nil = () | makeItems (hd::tl) = let val (t,n) = case hd of (N i) => ("(N ",i) | (T i) => ("(T ",i) | (D i) => ("(D ",i) in (say t; say (Int.toString n); say ")"; if null tl then () else (say ","; makeItems tl)) end in (say "{fin = ["; makeItems b; say "], trans = "; say a; say "}"; if null a' then () else (say ",\n"; makeTable(a',b'))) end *) fun msg x = TextIO.output(TextIO.stdOut, x) in (say "in Vector.fromList(map g \n["; makeTable(rs,newfins); say "])\nend\n"; msg ("\nNumber of states = " ^ (Int.toString (length trans))); msg ("\nNumber of distinct rows = " ^ (Int.toString (!count))); msg ("\nApprox. memory size of trans. table = " ^ (Int.toString (!count*(!CharSetSize)*(if !CharFormat then 1 else 8)))); msg " bytes\n") end (* makeaccept: Takes a (string,string) dictionary, prints case statement for accepting leaf actions. The key strings are the leaf #'s, the data strings are the actions *) fun makeaccept ends = let fun startline f = if f then say " " else say "| " fun make(nil,f) = (startline f; say "_ => raise Internal.LexerError\n") | make((x,(p,a))::y,f) = (startline f; say x; say " => "; if Substring.size(#2 (Substring.position "yytext" (Substring.full a))) = 0 then (say "("; sayPos (SOME p); say a; sayPos NONE; say ")") else (say "let val yytext=yymktext() in "; sayPos (SOME p); say a; sayPos NONE; say " end"); say "\n"; make(y,false)) in make (listofdict(ends),true) end fun leafdata(e:(int list * exp) list) = let val fp = array(!LeafNum + 1,nil) and leaf = array(!LeafNum + 1,EPS) and tcpairs = ref nil and trailmark = ref ~1; val rec add = fn (nil,x) => () | (hd::tl,x) => (update(fp,hd,union(fp sub hd,x)); add(tl,x)) and moredata = fn CLOSURE(e1) => (moredata(e1); add(lastpos(e1),firstpos(e1))) | ALT(e1,e2) => (moredata(e1); moredata(e2)) | CAT(e1,e2) => (moredata(e1); moredata(e2); add(lastpos(e1),firstpos(e2))) | CLASS(x,i) => update(leaf,i,CLASS(x,i)) | TRAIL(i) => (update(leaf,i,TRAIL(i)); if !trailmark = ~1 then trailmark := i else ()) | END(i) => (update(leaf,i,END(i)); if !trailmark <> ~1 then (tcpairs := (!trailmark,i)::(!tcpairs); trailmark := ~1) else ()) | _ => () and makedata = fn nil => () | (_,x)::tl => (moredata(x);makedata(tl)) in trailmark := ~1; makedata(e); (fp,leaf,!tcpairs) end; fun makedfa(rules) = let val StateTab = ref (create(String.<=)) : (string,int) dictionary ref val fintab = ref (create(Int.<=)) : (int,(int list)) dictionary ref val transtab = ref (create(Int.<=)) : (int,int list) dictionary ref val tctab = ref (create(Int.<=)) : (int,(int list)) dictionary ref val (fp, leaf, tcpairs) = leafdata(rules); fun visit (state,statenum) = let val transitions = gettrans(state) in fintab := enter(!fintab)(statenum,getfin(state)); tctab := enter(!tctab)(statenum,gettc(state)); transtab := enter(!transtab)(statenum,transitions) end and visitstarts (states) = let fun vs nil i = () | vs (hd::tl) i = (visit (hd,i); vs tl (i+1)) in vs states 0 end and hashstate(s: int list) = let val rec hs = fn (nil,z) => z | ((x:int)::y,z) => hs(y,z ^ " " ^ (Int.toString x)) in hs(s,"") end and find(s) = lookup(!StateTab)(hashstate(s)) and add(s,n) = StateTab := enter(!StateTab)(hashstate(s),n) and getstate (state) = find(state) handle LOOKUP => let val n = ++StateNum in add(state,n); visit(state,n); n end and getfin state = let fun f nil fins = fins | f (hd::tl) fins = case (leaf sub hd) of END _ => f tl (hd::fins) | _ => f tl fins in f state nil end and gettc state = let fun f nil fins = fins | f (hd::tl) fins = case (leaf sub hd) of TRAIL _ => f tl (hd::fins) | _ => f tl fins in f state nil end and gettrans (state) = let fun loop c tlist = let fun cktrans nil r = r | cktrans (hd::tl) r = case (leaf sub hd) of CLASS(i,_)=> (if (i sub c) then cktrans tl (union(r,fp sub hd)) else cktrans tl r handle Subscript => cktrans tl r ) | _ => cktrans tl r in if c >= 0 then let val v=cktrans state nil in loop (c-1) (if v=nil then 0::tlist else (getstate v)::tlist) end else tlist end in loop ((!CharSetSize) - 1) nil end and startstates() = let val startarray = array(!StateNum + 1, nil); fun listofarray(a,n) = let fun f i l = if i >= 0 then f (i-1) ((a sub i)::l) else l in f (n-1) nil end val rec makess = fn nil => () | (startlist,e)::tl => (fix(startlist,firstpos(e));makess(tl)) and fix = fn (nil,_) => () | (s::tl,firsts) => (update(startarray,s, union(firsts,startarray sub s)); fix(tl,firsts)) in makess(rules);listofarray(startarray, !StateNum + 1) end in visitstarts(startstates()); (listofdict(!fintab),listofdict(!transtab),listofdict(!tctab),tcpairs) end val skel_hd = " struct\n\ \ structure UserDeclarations =\n\ \ struct\n\ \" val skel_mid2 = " | Internal.D k => action (i,(acts::l),k::rs)\n\ \ | Internal.T k =>\n\ \ let fun f (a::b,r) =\n\ \ if a=k\n\ \ then action(i,(((Internal.N a)::acts)::l),(b@r))\n\ \ else f (b,a::r)\n\ \ | f (nil,r) = action(i,(acts::l),rs)\n\ \ in f (rs,nil)\n\ \ end\n\ \" fun lexGen(infile) = let val outfile = infile ^ ".sml" val () = (InFile := infile; OutFile := outfile) fun PrintLexer (ends) = let val sayln = fn x => (say x; say "\n") in case !ArgCode of NONE => (sayln "fun lex () : Internal.result ="; sayln "let fun continue() = lex() in") | SOME (p,s) => (say "fun lex "; say "(yyarg as ("; sayPos (SOME p); say s; sayPos NONE; sayln ")) ="; sayln "let fun continue() : Internal.result = "); say " let fun scan (s,AcceptingLeaves : Internal.yyfinstate"; sayln " list list,l,i0) ="; if !UsesTrailingContext then say "\tlet fun action (i,nil,rs)" else say "\tlet fun action (i,nil)"; sayln " = raise LexError"; if !UsesTrailingContext then sayln "\t| action (i,nil::l,rs) = action(i-1,l,rs)" else sayln "\t| action (i,nil::l) = action (i-1,l)"; if !UsesTrailingContext then sayln "\t| action (i,(node::acts)::l,rs) =" else sayln "\t| action (i,(node::acts)::l) ="; sayln "\t\tcase node of"; sayln "\t\t Internal.N yyk => "; sayln "\t\t\t(let fun yymktext() = substring(!yyb,i0,i-i0)\n\ \\t\t\t val yypos = YYPosInt.+(YYPosInt.fromInt i0, !yygone)"; if !CountNewLines then (sayln "\t\t\tval _ = yylineno := CharVectorSlice.foldli"; sayln "\t\t\t\t(fn (_,#\"\\n\", n) => n+1 | (_,_, n) => n) (!yylineno) (CharVectorSlice.slice (!yyb,i0,SOME(i-i0)))") else (); if !HaveReject then (say "\t\t\tfun REJECT() = action(i,acts::l"; if !UsesTrailingContext then sayln ",rs)" else sayln ")") else (); sayln "\t\t\topen UserDeclarations Internal.StartStates"; sayln " in (yybufpos := i; case yyk of "; sayln ""; sayln "\t\t\t(* Application actions *)\n"; makeaccept(ends); say "\n\t\t) end "; say ")\n\n"; if (!UsesTrailingContext) then say skel_mid2 else (); sayln "\tval {fin,trans} = Vector.sub(Internal.tab, s)"; sayln "\tval NewAcceptingLeaves = fin::AcceptingLeaves"; sayln "\tin if l = !yybl then"; sayln "\t if trans = #trans(Vector.sub(Internal.tab,0))"; sayln "\t then action(l,NewAcceptingLeaves"; if !UsesTrailingContext then say ",nil" else (); say ") else"; sayln "\t let val newchars= if !yydone then \"\" else yyinput 1024"; sayln "\t in if (size newchars)=0"; sayln "\t\t then (yydone := true;"; say "\t\t if (l=i0) then UserDeclarations.eof "; sayln (case !ArgCode of NONE => "()" | SOME _ => "yyarg"); say "\t\t else action(l,NewAcceptingLeaves"; if !UsesTrailingContext then sayln ",nil))" else sayln "))"; sayln "\t\t else (if i0=l then yyb := newchars"; sayln "\t\t else yyb := substring(!yyb,i0,l-i0)^newchars;"; sayln "\t\t yygone := YYPosInt.+(!yygone, YYPosInt.fromInt i0);"; sayln "\t\t yybl := size (!yyb);"; sayln "\t\t scan (s,AcceptingLeaves,l-i0,0))"; sayln "\t end"; sayln "\t else let val NewChar = Char.ord(CharVector.sub(!yyb,l))"; if !CharSetSize=129 then sayln "\t\tval NewChar = if NewChar<128 then NewChar else 128" else (); say "\t\tval NewState = "; sayln (if !CharFormat then "Char.ord(CharVector.sub(trans,NewChar))" else "Vector.sub(trans, NewChar)"); say "\t\tin if NewState=0 then action(l,NewAcceptingLeaves"; if !UsesTrailingContext then sayln ",nil)" else sayln ")"; sayln "\t\telse scan(NewState,NewAcceptingLeaves,l+1,i0)"; sayln "\tend"; sayln "\tend"; if !UsesPrevNewLine then () else sayln "(*"; sayln "\tval start= if substring(!yyb,!yybufpos-1,1)=\"\\n\""; sayln "then !yybegin+1 else !yybegin"; if !UsesPrevNewLine then () else sayln "*)"; say "\tin scan("; if !UsesPrevNewLine then say "start" else say "!yybegin (* start *)"; sayln ",nil,!yybufpos,!yybufpos)"; sayln " end"; sayln (case !ArgCode of NONE => "end" | SOME _ => "in continue end"); sayln " in lex"; sayln " end"; sayln "end" end in (UsesPrevNewLine := false; ResetFlags(); LexBuf := make_ibuf(TextIO.openIn infile); NextTok := BOF; inquote := false; setLexOut (TextIO.openOut(outfile)); StateNum := 2; resetLexPos (); StateTab := enter(create(String.<=))("INITIAL",1); LeafNum := ~1; let val (user_code,rules,ends) = parse() handle x => (close_ibuf(!LexBuf); TextIO.closeOut(!LexOut); OS.FileSys.remove outfile; raise x) val (fins,trans,tctab,tcpairs) = makedfa(rules) val _ = if !UsesTrailingContext then (close_ibuf(!LexBuf); TextIO.closeOut(!LexOut); OS.FileSys.remove outfile; prErr "lookahead is unimplemented") else () in if (!HeaderDecl) then (sayPos (SOME (!HeaderPos)) ; say (!HeaderCode) ; sayPos NONE) else say ("structure " ^ (!StrName)); say "=\n"; say skel_hd; sayPos (SOME {line = 1, col = 0}); say user_code; sayPos NONE; say "end (* end of user routines *)\n"; say "exception LexError (* raised if illegal leaf "; say "action tried *)\n"; say "structure Internal =\n\tstruct\n"; maketable(fins,tctab,tcpairs,trans); say "structure StartStates =\n\tstruct\n"; say "\tdatatype yystartstate = STARTSTATE of int\n"; makebegin(); say "\nend\n"; say "type result = UserDeclarations.lexresult\n"; say "\texception LexerError (* raised if illegal leaf "; say "action tried *)\n"; say "end\n\n"; say ("structure YYPosInt : INTEGER = " ^ (!PosIntName) ^ "\n"); say (if (!PosArg) then "fun makeLexer (yyinput,yygone0:YYPosInt.int) =\nlet\n" else "fun makeLexer yyinput =\nlet\tval yygone0= YYPosInt.fromInt ~1\n"); if !CountNewLines then say "\tval yylineno = ref 0\n\n" else (); say "\tval yyb = ref \"\\n\" \t\t(* buffer *)\n\ \\tval yybl = ref 1\t\t(*buffer length *)\n\ \\tval yybufpos = ref 1\t\t(* location of next character to use *)\n\ \\tval yygone = ref yygone0\t(* position in file of beginning of buffer *)\n\ \\tval yydone = ref false\t\t(* eof found yet? *)\n\ \\tval yybegin = ref 1\t\t(*Current 'start state' for lexer *)\n\ \\n\tval YYBEGIN = fn (Internal.StartStates.STARTSTATE x) =>\n\ \\t\t yybegin := x\n\n"; PrintLexer(ends); close_ibuf(!LexBuf); TextIO.closeOut(!LexOut) end) end end mlton-20100608/mllex/lexgen.tex0000644000076600000240000005653711404435622014725 0ustar mtfstaff% Modified by Matthew Fluet on 2007-11-07. % Add %posint command. % % Modified by Matthew Fluet on 2007-10-31. % Add \r escape sequence (from Florian Weimer). % Fix TeX formatting bug (from Florian Weimer). % \documentstyle{article} \title{ A lexical analyzer generator for Standard ML.\\ Version 1.6.0, October 1994 } \author{ Andrew W. Appel$^1$\\ James S. Mattson\\ David R. Tarditi$^2$\\ \\ \small $^1$Department of Computer Science, Princeton University \\ \small $^2$School of Computer Science, Carnegie Mellon University } \date{} \begin{document} \maketitle \begin{center} (c) 1989-94 Andrew W. Appel, James S. Mattson, David R. Tarditi \end{center} {\bf This software comes with ABSOLUTELY NO WARRANTY. It is subject only to the terms of the ML-Yacc NOTICE, LICENSE, and DISCLAIMER (in the file COPYRIGHT distributed with this software). } \vspace{1in} New in this version: \begin{itemize} \item REJECT is much less costly than before. \item Lexical analyzers with more than 255 states can now compile in your lifetime. \end{itemize} \newpage \tableofcontents \newpage \section{General Description} Computer programs often need to divide their input into words and distinguish between different kinds of words. Compilers, for example, need to distinguish between integers, reserved words, and identifiers. Applications programs often need to be able to recognize components of typed commands from users. The problem of segmenting input into words and recognizing classes of words is known as lexical analysis. Small cases of this problem, such as reading text strings separated by spaces, can be solved by using hand-written programs. Larger cases of this problem, such as tokenizing an input stream for a compiler, can also be solved using hand-written programs. A hand-written program for a large lexical analysis problem, however, suffers from two major problems. First, the program requires a fair amount of programmer time to create. Second, the description of classes of words is not explicit in the program. It must be inferred from the program code. This makes it difficult to verify if the program recognizes the correct words for each class. It also makes future maintenance of the program difficult. Lex, a programming tool for the Unix system, is a successful solution to the general problem of lexical analysis. It uses regular expressions to describe classes of words. A program fragment is associated with each class of words. This information is given to Lex as a specification (a Lex program). Lex produces a program for a function that can be used to perform lexical analysis. The function operates as follows. It finds the longest word starting from the current position in the input stream that is in one of the word classes. It executes the program fragment associated with the class, and sets the current position in the input stream to be the character after the word. The program fragment has the actual text of the word available to it, and may be any piece of code. For many applications it returns some kind of value. Lex allows the programmer to make the language description explicit, and to concentrate on what to do with the recognized words, not how to recognize the words. It saves programmer time and increases program maintainability. Unfortunately, Lex is targeted only C. It also places artificial limits on the size of strings that can be recognized. ML-Lex is a variant of Lex for the ML programming language. ML-Lex has a syntax similar to Lex, and produces an ML program instead of a C program. ML-Lex produces a program that runs very efficiently. Typically the program will be as fast or even faster than a hand-coded lexer implemented in Standard ML. The program typically uses only a small amount of space. ML-Lex thus allows ML programmers the same benefits that Lex allows C programmers. It also does not place artificial limits on the size of recognized strings. \section{ML-Lex specifications} An ML-Lex specification has the general format: \begin{quote} {user declarations} \verb|%%| {ML-Lex definitions} \verb|%%| {rules} \end{quote} Each section is separated from the others by a \verb|%%| delimiter. The rules are used to define the lexical analysis function. Each rule has two parts---a regular expression and an action. The regular expression defines the word class that a rule matches. The action is a program fragment to be executed when a rule matches the input. The actions are used to compute values, and must all return values of the same type. The user can define values available to all rule actions in the user declarations section. The user must define two values in this section---a type lexresult and a function eof. Lexresult defines the type of values returned by the rule actions. The function "eof" is called by the lexer when the end of the input stream is reached. It will typically return a value signalling eof or raise an exception. It is called with the same argument as lex (see \verb|%arg|, below), and must return a value of type lexresult. In the definitions section, the user can define named regular expressions, a set of start states, and specify which of the various bells and whistles of ML-Lex are desired. The start states allow the user to control when certain rules are matched. Rules may be defined to match only when the lexer is in specific start states. The user may change the lexer's start state in a rule action. This allows the user to specify special handling of lexical objects. This feature is typically used to handle quoted strings with escapes to denote special characters. The rules to recognize the inside contents of a string are defined for only one start state. This start state is entered when the beginning of a string is recognized, and exited when the end of the string is recognized. \section{Regular expressions} Regular expressions are a simple language for denoting classes of strings. A regular expression is defined inductively over an alphabet with a set of basic operations. The alphabet for ML-Lex is the Ascii character set (character codes 0--127; or if \verb|%full| is used, 0--255). The syntax and semantics of regular expressions will be described in order of decreasing precedence (from the most tightly binding operators to the most weakly binding): \begin{itemize} \item An individual character stands for itself, except for the reserved characters \verb@? * + | ( ) ^ $ / ; . = < > [ { " \@ \item[\\] A backslash followed by one of the reserved characters stands for that character. \item A set of characters enclosed in square brackets [ ] stands for any one of those characters. Inside the brackets, only the symbols \verb|\ - ^| are reserved. An initial up-arrow \verb|^| stands for the complement of the characters listed, e.g. \verb|[^abc]| stands any character except a, b, or c. The hyphen - denotes a range of characters, e.g. \verb|[a-z]| stands for any lower-case alphabetic character, and \verb|[0-9a-fA-F]| stands for any hexadecimal digit. To include \verb|^| literally in a bracketed set, put it anywhere but first; to include \verb|-| literally in a set, put it first or last. \item[\verb|.|] The dot \verb|.| character stands for any character except newline, i.e. the same as \verb|[^\n]| \item The following special escape sequences are available, inside or outside of square-brackets: \begin{tabular}{ll} \verb|\b|& backspace\\ \verb|\n|& newline\\ \verb|\r|& carriage return\\ \verb|\t|& tab\\ \verb|\h|& stands for all characters with codes $>127$,\\ &~~~~ when 7-bit characters are used.\\ \verb|\ddd|& where \verb|ddd| is a 3 digit decimal escape.\\ \end{tabular} \item[\verb|"|] A sequence of characters will stand for itself (reserved characters will be taken literally) if it is enclosed in double quotes \verb|" "|. \item[\{\}] A named regular expression (defined in the ``definitions" section) may be referred to by enclosing its name in braces \verb|{ }|. \item[()] Any regular expression may be enclosed in parentheses \verb|( )| for syntactic (but, as usual, not semantic) effect. \item[\verb|*|] The postfix operator \verb|*| stands for Kleene closure: zero or more repetitions of the preceding expression. \item[\verb|+|] The postfix operator \verb|+| stands for one or more repetitions of the preceding expression. \item[\verb|?|] The postfix operator \verb|?| stands for zero or one occurrence of the preceding expression. \item A postfix repetition range $\{n_1,n_2\}$ where $n_1$ and $n_2$ are small integers stands for any number of repetitions between $n_1$ and $n_2$ of the preceding expression. The notation $\{n_1\}$ stands for exactly $n_1$ repetitions. \item Concatenation of expressions denotes concatenation of strings. The expression $e_1 e_2$ stands for any string that results from the concatenation of one string that matches $e_1$ with another string that matches $e_2$. \item\verb-|- The infix operator \verb-|- stands for alternation. The expression $e_1$~\verb"|"~$e_2$ stands for anything that either $e_1$ or $e_2$ stands for. \item[\verb|/|] The infix operator \verb|/| denotes lookahead. Lookahead is not implemented and cannot be used, because there is a bug in the algorithm for generating lexers with lookahead. If it could be used, the expression $e_1 / e_2$ would match any string that $e_1$ stands for, but only when that string is followed by a string that matches $e_2$. \item When the up-arrow \verb|^| occurs at the beginning of an expression, that expression will only match strings that occur at the beginning of a line (right after a newline character). \item[\$] The dollar sign of C Lex \$ is not implemented, since it is an abbreviation for lookahead involving the newline character (that is, it is an abbreviation for \verb|/\n|). \end{itemize} Here are some examples of regular expressions, and descriptions of the set of strings they denote: \begin{tabular}{ll} \verb~0 | 1 | 2 | 3~& A single digit between 0 and 3\\ \verb|[0123]|& A single digit between 0 and 3\\ \verb|0123|& The string ``0123"\\ \verb|0*|& All strings of 0 or more 0's\\ \verb|00*|& All strings of 1 or more 0's\\ \verb|0+|& All strings of 1 or more 0's\\ \verb|[0-9]{3}|& Any three-digit decimal number.\\ \verb|\\[ntb]|& A newline, tab, or backspace.\\ \verb|(00)*|& Any string with an even number of 0's. \end{tabular} \section{ML-Lex syntax summary} \subsection{User declarations} Anything up to the first \verb|%%| is in the user declarations section. The user should note that no symbolic identifier containing \verb|%%| can be used in this section. \subsection{ML-Lex definitions} Start states can be defined with \begin{quote} \verb|%s| {identifier list} \verb|;| \end{quote} An identifier list consists of one or more identifiers. An identifier consists of one or more letters, digits, underscores, or primes, and must begin with a letter. Named expressions can be defined with \begin{quote} {identifier} = {regular expression} ; \end{quote} Regular expressions are defined below. The following \% commands are also available: \begin{description} \item[\tt \%reject] create REJECT() function \item[\tt \%count] count newlines using yylineno \item[\tt \%posarg] pass initial-position argument to makeLexer \item[\tt \%full] create lexer for the full 8-bit character set, with characters in the range 0--255 permitted as input. \item[\tt \%structure \{identifier\}] name the structure in the output program {identifier} instead of Mlex \item[\tt \%header] use code following it to create header for lexer structure \item[\tt \%arg] extra (curried) formal parameter argument to be passed to the lex functions, and to be passed to the eof function in place of () \item[\tt \%posint \{identifier\}] use the {\tt INTEGER} structure for the type of {\tt yypos}; use {\tt Int64} or {\tt Position} to allow lexing of multi-gigabyte input files \end{description} These functions are discussed in section~\ref{avail}. \subsection{Rules} Each rule has the format: \begin{quote} \verb|<|{\it start state list}\verb|>| {\it regular expression} \verb|=> (| {\it code} \verb|);| \end{quote} All parentheses in {\it code} must be balanced, including those used in strings and comments. The {\it start state list} is optional. It consists of a list of identifiers separated by commas, and is delimited by triangle brackets \verb|< >|. Each identifier must be a start state defined in the \verb|%s| section above. The regular expression is only recognized when the lexer is in one of the start states in the start state list. If no start state list is given, the expression is recognized in all start states. The lexer begins in a pre-defined start state called \verb|INITIAL|. The lexer resolves conflicts among rules by choosing the rule with the longest match, and in the case two rules match the same string, choosing the rule listed first in the specification. The rules should match all possible input. If some input occurs that does not match any rule, the lexer created by ML-Lex will raise an exception LexError. Note that this differs from C Lex, which prints any unmatched input on the standard output. \section{Values available inside the code associated with a rule.} \label{avail} ML-Lex places the value of the string matched by a regular expression in \verb|yytext|, a string variable. The user may recursively call the lexing function with \verb|lex()|. (If \verb|%arg| is used, the lexing function may be re-invoked with the same argument by using continue().) This is convenient for ignoring white space or comments silently: \begin{verbatim} [\ \t\n]+ => ( lex()); \end{verbatim} To switch start states, the user may call \verb|YYBEGIN| with the name of a start state. The following values will be available only if the corresponding \verb|%| command is in the ML-Lex definitions sections: \begin{tabular}{lll} \\ {\bf Value}&{\bf \% command}&{\bf description}\\ \hline {\tt REJECT} &{\tt\%reject}&\parbox[t]{2.6in}{{\tt REJECT()} causes the current rule to be ``rejected.'' The lexer behaves as if the current rule had not matched; another rule that matches this string, or that matches the longest possible prefix of this string, is used instead.} \\ {\tt yypos} & & \parbox[t]{2.6in}{The position of the first character of {\tt yytext}, relative to the beginning of the file.}\\ {\tt yylineno } & {\tt \%count} & Current line number\\ \\ \end{tabular} These values should be used only if necessary. Adding {\tt REJECT} to a lexer will slow it down by 20\%; adding {\tt yylineno} will slow it down by another 20\%, or more. (It is much more efficient to recognize \verb|\n| and have an action that increments the line-number variable.) The use of the lookahead operator {\tt /} will also slow down the entire lexer. The character-position, {\tt yypos}, is not costly to maintain, however. \paragraph{Bug.} The position of the first character in the file is reported as 2 (unless the {\tt \%posarg} feature is used). To preserve compatibility, this bug has not been fixed. \section{Running ML-Lex} From the Unix shell, run {\tt sml-lex~myfile.lex} The output file will be myfile.lex.sml. The extension {\tt .lex} is not required but is recommended. Within an interactive system [not the preferred method]: Use {\tt lexgen.sml}; this will create a structure LexGen. The function LexGen.lexGen creates a program for a lexer from an input specification. It takes a string argument -- the name of the file containing the input specification. The output file name is determined by appending ``{\tt .sml}'' to the input file name. \section{Using the program produced by ML-Lex} When the output file is loaded, it will create a structure Mlex that contains the function {\tt makeLexer} which takes a function from ${\it int} \rightarrow {\it string}$ and returns a lexing function: \begin{verbatim} val makeLexer : (int->string) -> yyarg -> lexresult \end{verbatim} where {\tt yyarg} is the type given in the {\tt \%yyarg} directive, or {\tt unit} if there is no {\tt \%yyarg} directive. For example, \begin{verbatim} val lexer = Mlex.makeLexer (inputc (open_in "f")) \end{verbatim} creates a lexer that operates on the file whose name is f. When the {\tt \%posarg} directive is used, the type of {\tt makeLexer} is \begin{verbatim} val makeLexer : ((int->string)*int) -> yyarg -> lexresult \end{verbatim} where the extra {\tt int} argument is one less than the {\tt yypos} of the first character in the input. The value $k$ would be used, for example, when creating a lexer to start in the middle of a file, when $k$ characters have already been read. At the beginning of the file, $k=0$ should be used. The ${\it int} \rightarrow {\it string}$ function should read a string of characters from the input stream. It should return a null string to indicate that the end of the stream has been reached. The integer is the number of characters that the lexer wishes to read; the function may return any non-zero number of characters. For example, \begin{verbatim} val lexer = let val input_line = fn f => let fun loop result = let val c = input (f,1) val result = c :: result in if String.size c = 0 orelse c = "\n" then String.implode (rev result) else loop result end in loop nil end in Mlex.makeLexer (fn n => input_line std_in) end \end{verbatim} is appropriate for interactive streams where prompting, etc. occurs; the lexer won't care that \verb|input_line| might return a string of more than or less than $n$ characters. The lexer tries to read a large number of characters from the input function at once, and it is desirable that the input function return as many as possible. Reading many characters at once makes the lexer more efficient. Fewer input calls and buffering operations are needed, and input is more efficient in large block reads. For interactive streams this is less of a concern, as the limiting factor is the speed at which the user can type. To obtain a value, invoke the lexer by passing it a unit: \begin{verbatim} val nextToken = lexer() \end{verbatim} If one wanted to restart the lexer, one would just discard {\tt lexer} and create a new lexer on the same stream with another call to {\tt makeLexer}. This is the best way to discard any characters buffered internally by the lexer. All code in the user declarations section is placed inside a structure UserDeclarations. To access this structure, use the path name {\tt Mlex.UserDeclarations}. If any input cannot be matched, the program will raise the exception {\tt Mlex.LexError}. An internal error (i.e. bug) will cause the exception {\tt Internal.LexerError} to be raised. If {\tt \%structure} is used, remember that the structure name will no longer be Mlex, but the one specified in the command. \section{Sample} Here is a sample lexer for a calculator program: \small \begin{verbatim} datatype lexresult= DIV | EOF | EOS | ID of string | LPAREN | NUM of int | PLUS | PRINT | RPAREN | SUB | TIMES val linenum = ref 1 val error = fn x => output(std_out,x ^ "\n") val eof = fn () => EOF %% %structure CalcLex alpha=[A-Za-z]; digit=[0-9]; ws = [\ \t]; %% \n => (inc linenum; lex()); {ws}+ => (lex()); "/" => (DIV); ";" => (EOS); "(" => (LPAREN); {digit}+ => (NUM (revfold (fn(a,r)=>ord(a)-ord("0")+10*r) (explode yytext) 0)); ")" => (RPAREN); "+" => (PLUS); {alpha}+ => (if yytext="print" then PRINT else ID yytext); "-" => (SUB); "*" => (TIMES); . => (error ("calc: ignoring bad character "^yytext); lex()); \end{verbatim} Here is the parser for the calculator: \begin{verbatim} (* Sample interactive calculator to demonstrate use of lexer The original grammar was stmt_list -> stmt_list stmt stmt -> print exp ; | exp ; exp -> exp + t | exp - t | t t -> t * f | t/f | f f -> (exp) | id | num The function parse takes a stream and parses it for the calculator program. If a syntax error occurs, parse prints an error message and calls itself on the stream. On this system that has the effect of ignoring all input to the end of a line. *) structure Calc = struct open CalcLex open UserDeclarations exception Error fun parse strm = let val say = fn s => output(std_out,s) val input_line = fn f => let fun loop result = let val c = input (f,1) val result = c :: result in if String.size c = 0 orelse c = "\n" then String.implode (rev result) else loop result end in loop nil end val lexer = makeLexer (fn n => input_line strm) val nexttok = ref (lexer()) val advance = fn () => (nexttok := lexer(); !nexttok) val error = fn () => (say ("calc: syntax error on line" ^ (makestring(!linenum)) ^ "\n"); raise Error) val lookup = fn i => if i = "ONE" then 1 else if i = "TWO" then 2 else (say ("calc: unknown identifier '" ^ i ^ "'\n"); raise Error) fun STMT_LIST () = case !nexttok of EOF => () | _ => (STMT(); STMT_LIST()) and STMT() = (case !nexttok of EOS => () | PRINT => (advance(); say ((makestring (E():int)) ^ "\n"); ()) | _ => (E(); ()); case !nexttok of EOS => (advance()) | _ => error()) and E () = E' (T()) and E' (i : int ) = case !nexttok of PLUS => (advance (); E'(i+T())) | SUB => (advance (); E'(i-T())) | RPAREN => i | EOF => i | EOS => i | _ => error() and T () = T'(F()) and T' i = case !nexttok of PLUS => i | SUB => i | TIMES => (advance(); T'(i*F())) | DIV => (advance (); T'(i div F())) | EOF => i | EOS => i | RPAREN => i | _ => error() and F () = case !nexttok of ID i => (advance(); lookup i) | LPAREN => let val v = (advance(); E()) in if !nexttok = RPAREN then (advance (); v) else error() end | NUM i => (advance(); i) | _ => error() in STMT_LIST () handle Error => parse strm end end \end{verbatim} \end{document} mlton-20100608/mllex/macros.hva0000644000076600000240000000003411404435622014662 0ustar mtfstaff\newcommand{\parbox}[2]{#2} mlton-20100608/mllex/main.sml0000644000076600000240000000127211404435622014344 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Main = struct fun usage s = Process.usage {usage = "file.lex ...", msg = s} fun main args = let val rest = let open Popt in parse {switches = args, opts = []} end in case rest of Result.No msg => usage msg | Result.Yes [] => usage "no files" | Result.Yes files => List.foreach (files, LexGen.lexGen) end val main = Process.makeMain main end mlton-20100608/mllex/Makefile0000644000076600000240000000230211404435622014336 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## SRC := $(shell cd .. && pwd) BUILD := $(SRC)/build BIN := $(BUILD)/bin LIB := $(BUILD)/lib MLTON := mlton TARGET := self FLAGS := -target $(TARGET) NAME := mllex PATH := $(BIN):$(shell echo $$PATH) all: $(NAME) $(NAME): $(NAME).mlb $(shell PATH="$(BIN):$$PATH" && "$(MLTON)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' "$(MLTON)" $(FLAGS) $(NAME).mlb html/index.html: $(TEX_FILES) mkdir -p html hevea -fix -o html/mllex.html -exec xxdate.exe macros.hva lexgen.tex cd html && hacha mllex.html && rm -f mllex.html lexgen.dvi: lexgen.tex latex lexgen.tex latex lexgen.tex mllex.pdf: lexgen.tex latex lexgen.tex pdflatex lexgen.tex mv lexgen.pdf mllex.pdf mllex.ps: lexgen.dvi dvips -o mllex.ps lexgen.dvi .PHONY: clean clean: ../bin/clean .PHONY: docs docs: mllex.pdf .PHONY: test test: $(NAME) cp -p ../mlton/front-end/ml.lex . && \ $(NAME) ml.lex && \ diff ml.lex.sml ../mlton/front-end/ml.lex.sml mlton-20100608/mllex/mlex_int.doc0000644000076600000240000001132511404435622015211 0ustar mtfstaffThis is minimal documentation for the lexer driver produced by ml-lex. Main data structures: The transition table is stored in tab. Tab is an array of records, indexed by state number. The first field of the record, fin, is a list of final leaves assocated with it. The second field of the record, trans, is a transition table for the state indexed by character number. It gives the next state for a given input character. The usual initial start state is state #1. State 0 is a dead state, which has transitions only to itself. The field yyfin has type yyfinstate list. yyfinstate consists of the following three constructors: * N of int - indicates normal end leaf. * D of int - dummy end leaf - for indicating when an end state for a trailing context regular expression has been reached. These are stored and propagated backwards when action is executed. * T of int - indicates an actual end leaf for a trailing context reg. expression, which should be executed only if D i was encountered after this end leaf while scanning forward. The dummy end leaf is removed from the backward propagating list after this node is encountered. The function scan inside the function lex operates as a transition function, scanning the input until it is no longer possible to take any more transitions. It accumulates a list of the accepting leaf list associated with each accepting state passed through. Scan operates as follows: Input: * s - current state * AcceptingLeaves - list of accepting leave lists. Each state has a list of accepting leaves associated with it. This list may be nil if the state is not a final state. * l - position of the next character in the buffer b to read * i0 - starting position in the buffer. Output: If no match is found, it raises the exception LexError. Otherwise, it returns a value of type lexresult. It operates as a transtion function: It (1) adds the list of accepting leaves for the current state to the list of accepting leave lists (2) tries to make a transition on the current input character to the next state. If it can't make a transition, it executes the action function. (a) - if it is past the end of the buffer, it (1) checks if it as at end eof. If it is then: It checks to see if it has made any transitions since it was first called - (l>i0 when this is true.) If it hasn't this implies that scan was called at the end of file. It thus executes eof function declared by the user. Otherwise it must execute action w/ the current accepting state list. (2) otherwise it reads a block of up to 1024 characters, and appends this block to the useful suffix of characters left in the buffer (those character which have been scanned in this call to lex()). The buffer operation should be altered if one intends to process reg. expressions whose lexemes' length will be >> 1024. For most normal applications, the buffer update operation will be fine. This buffer update operation requires O(n^2/1024) char. copies for lexemes > 1024 characters in length, and O(n) char. copies for lexemes <= 1024 characters in length. It can be made O(n) using linked list buffers & a Byte.array of size n (not the ^operator!) for concatenating the buffers to return a value for yytext when a lexeme is longer than the typical buffer length. (3) If the transition is to a dead state (0 is used for the dead state), action is executed instead. mlton-20100608/mllex/mllex.mlb0000644000076600000240000000102211404435622014511 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local local local $(SML_LIB)/basis/basis.mlb lexgen.sml in structure LexGen end local ../lib/mlton/sources.mlb main.sml in structure Main end in structure Main end in call-main.sml end mlton-20100608/mllex/README0000644000076600000240000000206711404435622013566 0ustar mtfstaff Lexical analyzer generator for Standard ML. Version 1.6, October 1994 Copyright (c) 1989-92 by Andrew W. Appel, James S. Mattson, David R. Tarditi This software comes with ABSOLUTELY NO WARRANTY. This software is subject only to the PRINCETON STANDARD ML SOFTWARE LIBRARY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER, (in the file "COPYRIGHT", distributed with this software). You may copy and distribute this software; see the COPYRIGHT NOTICE for details and restrictions. Files of interest: lexgen.doc - User's manual for ML-Lex lexgen.sml - ML version of Lex export-lex.sml - implements an exportable (via SMLofNJ.exportFn) toplevel driver for ML-Lex; the resulting stand-alone program takes the specification file name as a command line argument ml-lex.cm - CM description file for ML-Lex build - script that invokes ../../bin/ml-build in order to construct the stand-alone version of ML-Lex mlton-20100608/mllex/README.MLton0000644000076600000240000000063011404435622014610 0ustar mtfstaffThis is a modified version of the ml-lex directory that comes with SML/NJ. Files from SML/NJ: INSTALL -- deleted README build -- deleted build.bat -- deleted export-lex.sml -- deleted lexgen.doc lexgen.sml -- modified lexgen.tex -- modified ml-lex.cm -- deleted mlex_int.doc tool/* -- deleted Files added: Makefile README.MLton call-main.sml macros.hva main.sml mllex.mlb mlton-20100608/mlnlffigen/0000755000076600000240000000000011404470407013701 5ustar mtfstaffmlton-20100608/mlnlffigen/.ignore0000644000076600000240000000007411404435621015165 0ustar mtfstaff*.call-graph.dot *.ssa cppcmd.sml mlnlffigen mlnlffigen.exe mlton-20100608/mlnlffigen/ast-to-spec.sml0000644000076600000240000005204411404435621016561 0ustar mtfstaff(* ast-to-spec.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * ast-to-spec.sml - Conversion from CKIT "ast" to a "spec" (see spec.sml). * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure AstToSpec = struct structure A = Ast structure B = Bindings structure SS = StringSet structure SM = StringMap datatype context = CONTEXT of { gensym: unit -> string, anon: bool } exception VoidType exception Ellipsis exception Duplicate of string fun bug m = raise Fail ("AstToSpec: bug: " ^ m) fun err m = raise Fail ("AstToSpec: error: " ^ m) fun warn m = TextIO.output (TextIO.stdErr, "AstToSpec: warning: " ^ m) fun build { bundle, sizes: Sizes.sizes, collect_enums, cfiles, match, allSU, eshift, gensym_suffix } = let val curLoc = ref "?" fun warnLoc m = warn (concat [!curLoc, ": ", m]) val { ast, tidtab, errorCount, warningCount, auxiliaryInfo = { aidtab, implicits, env } } = bundle fun realFunctionDefComing sy = let fun isTheDef (A.DECL (A.FunctionDef (id, _, _), _, _)) = Symbol.equal (#name id, sy) | isTheDef _ = false in List.exists isTheDef ast end val srcOf = SourceMap.locToString fun isThisFile SourceMap.UNKNOWN = false | isThisFile (SourceMap.LOC { srcFile, ... }) = List.exists (fn f => f = srcFile) cfiles orelse match srcFile fun includedSU (tag, loc) = (allSU orelse isThisFile loc) fun includedEnum (tag, loc) = isThisFile loc fun includedTy (n, loc) = isThisFile loc fun isFunction t = TypeUtil.isFunction tidtab t fun getFunction t = TypeUtil.getFunction tidtab t fun getCoreType t = TypeUtil.getCoreType tidtab t fun constness t = if TypeUtil.isConst tidtab t then Spec.RO else case getCoreType t of A.Array (_, t) => constness t | _ => Spec.RW val sizerec = { sizes = sizes, err = err, warn = warn, bug = bug } fun sizeOf t = #bytes (Sizeof.byteSizeOf sizerec tidtab t) val bytebits = #bits (#char sizes) val intbits = #bits (#int sizes) val intalign = #align (#int sizes) fun getField (m, l) = Sizeof.getField sizerec (m, l) fun fieldOffsets t = case Sizeof.fieldOffsets sizerec tidtab t of NONE => bug "no field offsets" | SOME l => l val structs = ref [] val unions = ref [] val gtys = ref SM.empty val gvars = ref SM.empty val gfuns = ref SM.empty val named_enums = ref SM.empty val anon_enums = ref SM.empty val seen_structs = ref SS.empty val seen_unions = ref SS.empty val nexttag = ref 0 val tags = Tidtab.uidtab () : (string * bool) Tidtab.uidtab fun mk_context_td tdname = let val next = ref 0 in CONTEXT { gensym = fn () => let val n = !next in next := n + 1; concat ["'", if n = 0 then "" else Int.toString n, tdname] end, anon = false } end fun mk_context_su (parent_tag, anon) = let val next = ref 0 in CONTEXT { gensym = fn () => let val n = !next in next := n + 1; concat [parent_tag, "'", Int.toString n] end, anon = anon } end val tl_context = let val next = ref 0 in CONTEXT { gensym = fn () => let val n = !next in next := n + 1; Int.toString n end, anon = true } end fun tagname (SOME t, _, _) = (t, false) | tagname (NONE, CONTEXT { gensym, anon }, tid) = (case Tidtab.find (tags, tid) of SOME ta => ta | NONE => let val t = gensym () in Tidtab.insert (tags, tid, (t, anon)); (t, anon) end) fun reported_tagname (t, false) = t | reported_tagname (t, true) = t ^ gensym_suffix fun valty C A.Void = raise VoidType | valty C A.Ellipses = raise Ellipsis | valty C (A.Qual (q, t)) = valty C t | valty C (A.Numeric (_, _, A.SIGNED, A.CHAR, _)) = Spec.BASIC Spec.SCHAR | valty C (A.Numeric (_, _, A.UNSIGNED, A.CHAR, _)) = Spec.BASIC Spec.UCHAR | valty C (A.Numeric (_, _, A.SIGNED, A.SHORT, _)) = Spec.BASIC Spec.SSHORT | valty C (A.Numeric (_, _, A.UNSIGNED, A.SHORT, _)) = Spec.BASIC Spec.USHORT | valty C (A.Numeric (_, _, A.SIGNED, A.INT, _)) = Spec.BASIC Spec.SINT | valty C (A.Numeric (_, _, A.UNSIGNED, A.INT, _)) = Spec.BASIC Spec.UINT | valty C (A.Numeric (_, _, A.SIGNED, A.LONG, _)) = Spec.BASIC Spec.SLONG | valty C (A.Numeric (_, _, A.UNSIGNED, A.LONG, _)) = Spec.BASIC Spec.ULONG | valty C (A.Numeric (_, _, A.SIGNED, A.LONGLONG, _)) = Spec.BASIC Spec.SLONGLONG | valty C (A.Numeric (_, _, A.UNSIGNED, A.LONGLONG, _)) = Spec.BASIC Spec.ULONGLONG | valty C (A.Numeric (_, _, _, A.FLOAT, _)) = Spec.BASIC Spec.FLOAT | valty C (A.Numeric (_, _, _, A.DOUBLE, _)) = Spec.BASIC Spec.DOUBLE | valty C (A.Numeric (_, _, _, A.LONGDOUBLE, _)) = Spec.UNIMPLEMENTED "long double" | valty C (A.Array (NONE, t)) = valty C (A.Pointer t) | valty C (A.Array (SOME (n, _), t)) = let val d = Int.fromLarge n in if d < 0 then err "negative dimension" else Spec.ARR { t = valty C t, d = d, esz = sizeOf t } end | valty C (A.Pointer t) = (case getCoreType t of A.Void => Spec.VOIDPTR | A.Function f => fptrty C f | _ => Spec.PTR (cobj C t)) | valty C (A.Function f) = fptrty C f | valty C (A.StructRef tid) = typeref (tid, Spec.STRUCT, C) | valty C (A.UnionRef tid) = typeref (tid, Spec.UNION, C) | valty C (A.EnumRef tid) = typeref (tid, fn t => Spec.ENUM (t, false), C) | valty C (A.TypeRef tid) = typeref (tid, fn _ => bug "missing typedef info", C) | valty C A.Error = err "Error type" and valty_nonvoid C t = valty C t handle VoidType => err "void variable type" and typeref (tid, otherwise, C) = case Tidtab.find (tidtab, tid) of NONE => bug "tid not bound in tidtab" | SOME { name = SOME n, ntype = NONE, ... } => otherwise n | SOME { name = NONE, ntype = NONE, ... } => bug "both name and ntype missing in tidtab binding" | SOME { name, ntype = SOME nct, location, ... } => (case nct of B.Struct (tid, members) => structty (tid, name, C, members, location) | B.Union (tid, members) => unionty (tid, name, C, members, location) | B.Enum (tid, edefs) => enumty (tid, name, C, edefs, location) | B.Typedef (_, t) => let val n = case name of NONE => bug "missing name in typedef" | SOME n => n val C' = mk_context_td n val res = valty C' t fun sameName { src, name, spec } = name = n in if includedTy (n, location) andalso not (SM.inDomain (!gtys, n)) then gtys := SM.insert (!gtys, n, { src = srcOf location, name = n, spec = res }) else (); res end) and enumty (tid, name, C, edefs, location) = let val (tag_stem, anon) = tagname (name, C, tid) val tag = reported_tagname (tag_stem, anon) fun one ({ name, uid, location, ctype, kind }, i) = { name = Symbol.name name, spec = i } val enums = if anon then anon_enums else named_enums in enums := SM.insert (!enums, tag, { src = srcOf location, tag = tag, anon = anon, descr = tag, exclude = not (includedEnum (tag, location)), spec = map one edefs }); Spec.ENUM (tag, anon) end and structty (tid, name, C, members, location) = let val (tag_stem, anon) = tagname (name, C, tid) val tag = reported_tagname (tag_stem, anon) val ty = Spec.STRUCT tag val C' = mk_context_su (tag_stem, anon) in if SS.member (!seen_structs, tag) then () else let val _ = seen_structs := SS.add (!seen_structs, tag) val fol = fieldOffsets (A.StructRef tid) val ssize = sizeOf (A.StructRef tid) fun bfspec (offset, bits, shift, (c, t)) = let val offset = offset val bits = Word.fromLargeInt bits val shift = eshift (shift, intbits, bits) val r = { offset = offset, constness = c, bits = bits, shift = shift } in case t of Spec.BASIC Spec.UINT => Spec.UBF r | Spec.BASIC Spec.SINT => Spec.SBF r | _ => err "non-int bitfield" end fun synthetic (synth, (_, false), _) = ([], synth) | synthetic (synth, (endp, true), startp) = if endp = startp then ([], synth) else ([{ name = Int.toString synth, spec = Spec.OFIELD { offset = endp, spec = (Spec.RW, Spec.ARR { t = Spec.BASIC Spec.UCHAR, d = startp - endp, esz = 1 }), synthetic = true } }], synth+1) fun build ([], synth, gap) = #1 (synthetic (synth, gap, ssize)) | build ((t, SOME m, NONE) :: rest, synth, gap) = let val bitoff = #bitOffset (getField (m, fol)) val bytoff = bitoff div bytebits val (filler, synth) = synthetic (synth, gap, bytoff) val endp = bytoff + sizeOf t in if bitoff mod bytebits <> 0 then bug "non-bitfield not on byte boundary" else filler @ { name = Symbol.name (#name m), spec = Spec.OFIELD { offset = bytoff, spec = cobj C' t, synthetic = false } } :: build (rest, synth, (endp, false)) end | build ((t, SOME m, SOME b) :: rest, synth, gap) = let val bitoff = #bitOffset (getField (m, fol)) val bytoff = (intalign * (bitoff div intalign)) div bytebits val gap = (#1 gap, true) in { name = Symbol.name (#name m), spec = bfspec (bytoff, b, bitoff mod intalign, cobj C' t) } :: build (rest, synth, gap) end | build ((t, NONE, SOME _) :: rest, synth, gap) = build (rest, synth, (#1 gap, true)) | build ((_, NONE, NONE) :: _, _, _) = bug "unnamed struct member (not bitfield)" val fields = build (members, 0, (0, false)) in structs := { src = srcOf location, tag = tag, anon = anon, size = Word.fromInt ssize, exclude = not (includedSU (tag, location)), fields = fields } :: !structs end; ty end and unionty (tid, name, C, members, location) = let val (tag_stem, anon) = tagname (name, C, tid) val tag = reported_tagname (tag_stem, anon) val C' = mk_context_su (tag_stem, anon) val ty = Spec.UNION tag val lsz = ref 0 fun mkField (t, m: A.member) = let val sz = sizeOf t in { name = Symbol.name (#name m), spec = Spec.OFIELD { offset = 0, spec = cobj C' t, synthetic = false } } end in if SS.member (!seen_unions, tag) then () else let val _ = seen_unions := SS.add (!seen_unions, tag) val all = map mkField members in unions := { src = srcOf location, tag = tag, anon = anon, size = Word.fromInt (sizeOf (A.UnionRef tid)), exclude = not (includedSU (tag, location)), all = all } :: !unions end; ty end and cobj C t = (constness t, valty_nonvoid C t) and fptrty C f = Spec.FPTR (cft C f) and cft C (res, args) = { res = case getCoreType res of A.Void => NONE | _ => SOME (valty_nonvoid C res), args = case args of [(arg, _)] => (case getCoreType arg of A.Void => [] | _ => [valty_nonvoid C arg]) | _ => let fun build [] = [] | build [(x, _)] = ([valty_nonvoid C x] handle Ellipsis => (warnLoc ("varargs not supported; \ \ignoring the ellipsis\n"); [])) | build ((x, _) :: xs) = valty_nonvoid C x :: build xs in build args end } fun ft_argnames (res, args) = let val optids = map (fn (_, optid) => optid) args in if List.exists (not o isSome) optids then NONE else SOME (map valOf optids) end fun functionName (f: A.id, ailo: A.id list option) = let val n = Symbol.name (#name f) val anlo = Option.map (map (Symbol.name o #name)) ailo in if n = "_init" orelse n = "_fini" orelse SM.inDomain (!gfuns, n) then () else let fun doit () = (case getFunction (#ctype f) of SOME fs => gfuns := SM.insert (!gfuns, n, { src = !curLoc, name = n, spec = cft tl_context fs, argnames = anlo }) | NONE => bug "function without function type") in case #stClass f of A.EXTERN => doit () | A.DEFAULT => doit () | A.AUTO => () | A.REGISTER => () | A.STATIC => () end end fun varDecl (v: A.id) = let fun doit () = (case getFunction (#ctype v) of SOME fs => if realFunctionDefComing (#name v) then () else functionName (v, ft_argnames fs) | NONE => let val n = Symbol.name (#name v) in if SM.inDomain (!gvars, n) then () else gvars := SM.insert (!gvars, n, { src = !curLoc, name = n, spec = cobj tl_context (#ctype v) }) end) in case #stClass v of A.EXTERN => doit () | A.DEFAULT => doit () | A.AUTO => () | A.REGISTER => () | A.STATIC => () end fun dotid tid = (* Spec.SINT is an arbitrary choice; the value gets * ignored anyway *) (ignore (typeref (tid, fn _ => Spec.BASIC Spec.SINT, tl_context)) handle VoidType => ()) (* ignore type aliases for void *) fun declaration (A.TypeDecl { tid, ... }) = dotid tid | declaration (A.VarDecl (v, _)) = varDecl v fun coreExternalDecl (A.ExternalDecl d) = declaration d | coreExternalDecl (A.FunctionDef (f, argids, _)) = functionName (f, SOME argids) | coreExternalDecl (A.ExternalDeclExt _) = () fun externalDecl (A.DECL (d, _, l)) = if isThisFile l then (curLoc := SourceMap.locToString l; coreExternalDecl d) else () fun doast l = app externalDecl l fun gen_enums () = let val ael = SM.listItems (!anon_enums) val nel = SM.listItems (!named_enums) infix $ fun x $ [] = [x] | x $ y = x :: ", " :: y fun onev (v as { name, spec }, m) = if SM.inDomain (m, name) then raise Duplicate name else SM.insert (m, name, v) fun onee ({ src, tag, anon, spec, descr, exclude }, (m, sl)) = (foldl onev m spec, src $ sl) in if collect_enums then let val (m, sl) = foldl onee (SM.empty, []) ael in if SM.isEmpty m then nel else { src = concat (rev sl), tag = "'", anon = false, descr = "collected from unnamed enumerations", exclude = false, spec = SM.listItems m } :: nel end handle Duplicate name => (warn (concat ["constant ", name, " defined more than once;\ \ disabling `-collect'\n"]); ael @ nel) else ael @ nel end in doast ast; app (dotid o #1) (Tidtab.listItemsi tidtab); { structs = !structs, unions = !unions, gtys = SM.listItems (!gtys), gvars = SM.listItems (!gvars), gfuns = SM.listItems (!gfuns), enums = gen_enums () } : Spec.spec end end mlton-20100608/mlnlffigen/call-main.sml0000644000076600000240000000041711404435621016254 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20100608/mlnlffigen/control.sig0000644000076600000240000000266211404435621016072 0ustar mtfstaff(* Copyright (C) 2005-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONTROL = sig (* set all flags to their default values *) val defaults: unit -> unit (*------------------------------------*) (* Begin Flags *) (*------------------------------------*) val debug : bool ref val allSU : bool ref val collect_enums : bool ref val cppopts : string list ref val dir : string ref val enum_cons : bool ref val extramembers : string list ref val gensym : string ref val libhandle : string ref structure Linkage : sig datatype t = Archive | Dynamic | Shared end val linkage : Linkage.t ref val match : (string -> bool) ref val mlbfile : string ref val namedargs : bool ref val prefix : string ref structure Target : sig type t val fromString : string -> t option val make: t -> {name: string, sizes: Sizes.sizes, endianShift: Endian.shift} option end val target: {name: string, sizes: Sizes.sizes, endianShift: Endian.shift} option ref val weight: {heavy: bool, light: bool} ref val width : int ref end mlton-20100608/mlnlffigen/control.sml0000644000076600000240000001170411404435621016100 0ustar mtfstaff(* Copyright (C) 2004-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Control: CONTROL = struct structure C = Control () open C val debug = control {name = "debug", default = false, toString = Bool.toString} val allSU = control {name = "allSU", default = false, toString = Bool.toString} val collect_enums = control {name = "collect_enums", default = true, toString = Bool.toString} val cppopts = control {name = "cppopts", default = [], toString = List.toString (fn s => s)} val dir = control {name = "dir", default = "NLFFI-Generated", toString = fn s => s} val enum_cons = control {name = "enum_cons", default = false, toString = Bool.toString} val extramembers = control {name = "extramembers", default = [], toString = List.toString (fn s => s)} val gensym = control {name = "gensym", default = "", toString = fn s => s} val libhandle = control {name = "libhandle", default = "Library.libh", toString = fn s => s} structure Linkage = struct datatype t = Archive | Dynamic | Shared val toString = fn Archive => "archive" | Dynamic => "dynamic" | Shared => "shared" end val linkage = control {name = "linkage", default = Linkage.Dynamic, toString = Linkage.toString} val match = control {name = "match", default = fn _ => false, toString = fn _ => ""} val mlbfile = control {name = "mlbfile", default = "nlffi-generated.mlb", toString = fn s => s} val namedargs = control {name = "namedargs", default = false, toString = Bool.toString} val prefix = control {name = "prefix", default = "", toString = fn s => s} structure Target = struct open MLton.Platform datatype arch = datatype Arch.t datatype os = datatype OS.t datatype t = T of {arch: arch, os: os} val host = T {arch = Arch.host, os = OS.host} fun toString (T {arch, os}) = concat [Arch.toString arch, "-", OS.toString os] fun fromString s = case String.split (s, #"-") of [arch, os] => (case (Arch.fromString arch, OS.fromString os) of (SOME arch, SOME os) => SOME (T {arch = arch, os = os}) | _ => NONE) | _ => NONE fun make (t as T {arch, os}) = case (arch, os) of (AMD64, _) => SOME {name = toString t, sizes = SizesAMD64.sizes, endianShift = EndianLittle.shift} | (HPPA, _) => SOME {name = toString t, sizes = SizesHPPA.sizes, endianShift = EndianBig.shift} | (IA64, Hurd) => SOME {name = toString t, sizes = SizesIA64.sizes, endianShift = EndianBig.shift} | (IA64, HPUX) => SOME {name = toString t, sizes = SizesIA64.sizes, endianShift = EndianBig.shift} | (IA64, Linux) => SOME {name = toString t, sizes = SizesIA64.sizes, endianShift = EndianLittle.shift} | (Sparc, _) => SOME {name = toString t, sizes = SizesSparc.sizes, endianShift = EndianBig.shift} | (PowerPC, _) => SOME {name = toString t, sizes = SizesPPC.sizes, endianShift = EndianLittle.shift} | (PowerPC64, _) => SOME {name = toString t, sizes = SizesPowerPC64.sizes, endianShift = EndianLittle.shift} | (X86, _) => SOME {name = toString t, sizes = SizesX86.sizes, endianShift = EndianLittle.shift} | _ => NONE end val target = control {name = "target", default = Target.make Target.host, toString = Option.toString (fn {name, ...} => name)} val weight = control {name = "weight", default = {heavy = true, light = true}, toString = fn {heavy, light} => concat ["{heavy = ", Bool.toString heavy, ", light = ", Bool.toString light, "}"]} val width = control {name = "width", default = 75, toString = Int.toString} val defaults = setDefaults val _ = defaults () end mlton-20100608/mlnlffigen/cpif-dev.sml0000644000076600000240000000405411404435621016115 0ustar mtfstaff(* cpif-dev.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* cpif-dev.sml * A simple pretty-printing device that eventually writes to a * text file unless the current contents of that file coincides * with what's being written. * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure CPIFDev : sig include PP_DEVICE val openOut : string * int -> device val closeOut : device -> unit end = struct datatype device = DEV of { filename: string, buffer : string list ref, wid : int } (* no style support *) type style = unit fun sameStyle _ = true fun pushStyle _ = () fun popStyle _ = () fun defaultStyle _ = () (* Allocate an empty buffer and remember the file name. *) fun openOut (f, w) = DEV { filename = f, buffer = ref [], wid = w } (* Calculate the final output and compare it with the current * contents of the file. If they do not coincide, write the file. *) fun closeOut (DEV { buffer = ref l, filename, ... }) = let val s = concat (rev l) fun write () = let val f = TextIO.openOut filename in TextIO.output (f, s); TextIO.closeOut f end in let val f = TextIO.openIn filename val s' = TextIO.inputAll f in TextIO.closeIn f; if s = s' then () else write () end handle _ => write () end (* maximum printing depth (in terms of boxes) *) fun depth _ = NONE (* the width of the device *) fun lineWidth (DEV{wid, ...}) = SOME wid (* the suggested maximum width of text on a line *) fun textWidth _ = NONE (* output a string/character in the current style to the device *) fun string (DEV { buffer, ... }, s) = buffer := s :: !buffer fun char (d, c) = string (d, String.str c) fun space (d, n) = string (d, StringCvt.padLeft #" " n "") fun newline d = string (d, "\n") fun flush d = () end mlton-20100608/mlnlffigen/endian-big.sml0000644000076600000240000000042711404435621016415 0ustar mtfstaff(* * endian-big.sml - How to get at a bit field on a "big endian" machine. * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure EndianBig = struct fun shift (s: int, ib: int, b: word) = Word.fromInt s end mlton-20100608/mlnlffigen/endian-little.sml0000644000076600000240000000045311404435621017150 0ustar mtfstaff(* * endian-little.sml - How to get at a bit field on a "little endian" machine. * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure EndianLittle = struct fun shift (s: int, ib: int, b: word) = Word.fromInt (ib - s) - b end mlton-20100608/mlnlffigen/endian.sml0000644000076600000240000000012011404435621015644 0ustar mtfstaffstructure Endian = struct type shift = int * int * word -> word end mlton-20100608/mlnlffigen/gen-cppcmd0000755000076600000240000000103711404435621015644 0ustar mtfstaff#!/usr/bin/env bash set -e dir=`dirname "$0"` src=`cd "$dir/.." && pwd` lib="$src/build/lib" eval `"$lib/platform"` output () { echo "val defaultCppCmd = \"gcc $1 -E -U__GNUC__ %o %s > %t\"" } # The flags here should match the flags used by mlton. At least the # 64 vs 32 bit flags have an effect on what the system headers look # like. case "$HOST_OS-$HOST_ARCH" in aix-*) output "-maix64" ;; *-ia64) output "-mlp64" ;; *-amd64) output "-m64" ;; *-x86) output "-m32" ;; *-sparc) output "-m32" ;; *) output "" ;; esac mlton-20100608/mlnlffigen/gen.sml0000644000076600000240000016317511404435621015203 0ustar mtfstaff(* gen.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. (* Copyright (C) 2005-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) *) (* * gen.sml - Generating and pretty-printing ML code implementing a * typed interface to a C program. * * (C) 2004 The Fellowship of SML/NJ * * author: Matthias Blume (blume@tti-c.org) *) structure Gen : sig val gen : {cfiles: string list} -> unit end = struct structure Linkage = Control.Linkage structure P = PrettyPrint structure PP = P.PP structure S = Spec structure IM = IntMap structure LIS = LargeIntSet structure SM = StringMap structure SS = StringSet exception Incomplete val Tuple = P.TUPLE fun Record [] = P.Unit | Record l = P.RECORD l val Con = P.CON val Arrow = P.ARROW val Type = P.Type val Unit = P.Unit val ETuple = P.ETUPLE val EUnit = ETuple [] fun ERecord [] = P.ETUPLE [] | ERecord l = P.ERECORD l val EVar = P.EVAR val EApp = P.EAPP val EConstr = P.ECONSTR val ESeq = P.ESEQ val EPrim = P.EPRIM val ELet = P.ELET fun EWord w = EVar ("0wx" ^ Word.toString w) fun EInt i = EVar (Int.toString i) fun ELInt i = EVar (LargeInt.toString i) fun EString s = EVar (concat ["\"", String.toString s, "\""]) fun warn m = Out.output (Out.error, "warning: " ^ m) fun err m = raise Fail (concat ("gen: " :: m)) fun unimp what = raise Fail ("unimplemented type: " ^ what) fun unimp_arg what = raise Fail ("unimplemented argument type: " ^ what) fun unimp_res what = raise Fail ("unimplemented result type: " ^ what) val writeto = "write'to" fun gen args = let val {cfiles} = args val allSU = !Control.allSU val collect_enums = !Control.collect_enums val dir = !Control.dir val enum_cons = !Control.enum_cons val extramembers = !Control.extramembers val gensym = !Control.gensym val libhandle = !Control.libhandle val linkage = !Control.linkage val match = !Control.match val mlbfile = !Control.mlbfile val namedargs = !Control.namedargs val prefix = !Control.prefix val target = valOf (!Control.target) val weight = !Control.weight val width = !Control.width val gensym_suffix = if gensym = "" then "" else "_" ^ gensym val {name = targetName, sizes = targetSizes, endianShift = targetEndianShift} = target val targetName = String.toLower targetName val {heavy = doheavy, light = dolight} = weight val hash_cft = Hash.mkFHasher () val hash_mltype = Hash.mkTHasher () val $? = SM.find val %? = IM.find local val program = "ml-nlffigen" val version = "0.9.1" val author = "Matthias Blume" val email = "blume@tti-c.org" val modifications = [{author = "Matthew Fluet", email = "mfluet@acm.org", note = "Adapted for MLton."}] val credits = concat (["(* [by ", author, "'s ", program, " (version ", version, ") for ", targetName, "] *)"] @ (map (fn {author, email, note} => concat ["\n(* [modified by ", author, " (", email, ") <", note, ">] *)"])) modifications) val commentsto = concat ["(* Send comments and suggestions to ", email, ". Thanks! *)"] val dontedit = "(* This file has been generated automatically. DO NOT EDIT! *)" in fun openPP (f, src) = let val device = CPIFDev.openOut (f, width) val stream = PP.openStream device fun nl () = PP.newline stream fun str s = PP.string stream s fun sp () = PP.space stream 1 fun nsp () = PP.nbSpace stream 1 fun Box a = PP.openBox stream (PP.Abs a) fun HBox () = PP.openHBox stream fun HVBox x = PP.openHVBox stream x fun HOVBox a = PP.openHOVBox stream (PP.Abs a) fun VBox a = PP.openVBox stream (PP.Abs a) fun endBox () = PP.closeBox stream fun ppty t = P.ppType stream t fun ppExp e = P.ppExp stream e fun ppFun x = P.ppFun stream x fun line s = (nl (); str s) fun pr_vdef (v, e) = (nl (); HOVBox 4 ; str "val"; nsp (); str v; nsp (); str "=" ; sp (); ppExp e ; endBox ()) fun pr_fdef (f, args, res) = (nl (); ppFun (f, args, res)) fun pr_decl (keyword, connector) (v, t) = (nl (); HOVBox 4 ; str keyword; nsp (); str v; nsp (); str connector; sp (); ppty t ; endBox ()) val pr_tdef = pr_decl ("type", "=") val pr_vdecl = pr_decl ("val", ":") fun closePP () = (PP.closeStream stream; CPIFDev.closeOut device) in str dontedit; case src of NONE => () | SOME s => (nl (); str (concat ["(* [from code at ", s, "] *)"])); line credits; line commentsto; nl (); {stream = stream, line = line, nl = nl, str = str, sp = sp, nsp = nsp, Box = Box, endBox = endBox, HVBox = HVBox, HBox = HBox, HOVBox = HOVBox, VBox = VBox, ppty = ppty, ppExp = ppExp, ppFun = ppFun, pr_vdef = pr_vdef, pr_fdef = pr_fdef, pr_tdef = pr_tdef, pr_vdecl = pr_vdecl, closePP = closePP} end end local val cpp_tmpl = Option.fold (Process.getEnv "FFIGEN_CPP", defaultCppCmd, fn (cpp_tmpl,_) => cpp_tmpl) val cpp_tmpl = String.substituteFirst (cpp_tmpl, {substring = "%o", replacement = String.concatWith (List.rev (!Control.cppopts), " ")}) fun mkidlsource (cfile,ifile) = let val cpp = List.fold ([{substring = "%s", replacement = cfile}, {substring = "%t", replacement = ifile}], cpp_tmpl, fn (s, subst) => String.substituteFirst (subst, s)) in Process.system cpp end fun getSpec (cfile, s) = File.withTemp (fn ifile => let val () = mkidlsource (cfile, ifile) val astbundle = ParseToAst.fileToAst' Out.error (targetSizes, State.INITIAL) ifile val s' = AstToSpec.build {bundle = astbundle, sizes = targetSizes, collect_enums = collect_enums, cfiles = cfiles, match = match, allSU = allSU, eshift = targetEndianShift, gensym_suffix = gensym_suffix} in S.join (s', s) end) in val spec = List.fold (cfiles, S.empty, getSpec) end val {structs, unions, gvars, gfuns, gtys, enums} = spec val (structs, unions, enums) = let val structs = List.fold (structs, SM.empty, fn (s, m) => SM.insert (m, #tag s, s)) val unions = List.fold (unions, SM.empty, fn (s, m) => SM.insert (m, #tag s, s)) val enums = List.fold (enums, SM.empty, fn (s, m) => SM.insert (m, #tag s, s)) val sdone = ref SS.empty val udone = ref SS.empty val edone = ref SS.empty val smap = ref SM.empty val umap = ref SM.empty val emap = ref SM.empty val ty_queue = ref [] fun ty_sched ty = List.push (ty_queue, ty) fun fs_sched (S.OFIELD { spec = (_, ty), ... }) = ty_sched ty | fs_sched _ = () fun f_sched { name, spec } = fs_sched spec fun xenter (xdone, xall, xmap, xfields) t = if SS.member (!xdone, t) then () else (xdone := SS.add (!xdone, t); case $? (xall, t) of SOME x => (xmap := SM.insert (!xmap, t, x); app f_sched (xfields x)) | NONE => ()) val senter = xenter (sdone, structs, smap, #fields) val uenter = xenter (udone, unions, umap, #all) val eenter = xenter (edone, enums, emap, fn _ => []) fun sinclude (s: S.s) = if #exclude s then () else senter (#tag s) fun uinclude (u: S.u) = if #exclude u then () else uenter (#tag u) fun einclude (e: S.enum) = if #exclude e then () else eenter (#tag e) fun gty {src, name, spec} = ty_sched spec fun gvar {src, name, spec = (_, t)} = ty_sched t fun gfun {src, name, spec, argnames} = ty_sched (S.FPTR spec) fun loop tys = let fun do_ty ty = case ty of S.BASIC _ => () | S.STRUCT t => senter t | S.UNION t => uenter t | S.ENUM (t, anon) => if collect_enums andalso anon then eenter "'" else eenter t | S.VOIDPTR => () | S.FPTR {args, res} => (List.foreach (args, do_ty); Option.app (res, do_ty)) | S.PTR (_, S.STRUCT t) => () | S.PTR (_, S.UNION t) => () | S.PTR (_, t) => do_ty t | S.ARR {t, ... } => do_ty t | S.UNIMPLEMENTED _ => () fun ty_loop tys = case tys of [] => nextround () | ty :: tys => (do_ty ty; ty_loop tys) in case tys of [] => () | _ => (ty_queue := []; ty_loop tys) end and nextround () = loop (!ty_queue) in SM.app sinclude structs; SM.app uinclude unions; SM.app einclude enums; app gty gtys; app gvar gvars; app gfun gfuns; nextround (); (!smap, !umap, !emap) end val (fptr_types,incomplete_structs, incomplete_unions, incomplete_enums) = let fun taginsert (t, ss) = if SS.member (ss, t) then ss else SS.add (ss, t) fun sinsert (t, (f, s, u, e)) = (f, taginsert (t, s), u, e) fun uinsert (t, (f, s, u, e)) = (f, s, taginsert (t, u), e) fun einsert (t, (f, s, u, e)) = (f, s, u, taginsert (t, e)) fun maybe_insert (t, ss, acc, insert) = case $? (ss, t) of SOME _ => acc | NONE => insert (t, acc) fun do_ty (ty, acc) = case ty of S.BASIC _ => acc | S.STRUCT t => maybe_insert (t, structs, acc, sinsert) | S.UNION t => maybe_insert (t, unions, acc, uinsert) | S.ENUM (t, anon) => if collect_enums andalso anon then acc else maybe_insert (t, enums, acc, einsert) | S.VOIDPTR => acc | S.FPTR (cft as {args, res}) => let val acc as (f, s, u, e) = Option.fold (res, List.fold (args, acc, do_ty), do_ty) val cfth = hash_cft cft val i = IM.numItems f in if IM.inDomain (f, cfth) then acc else (IM.insert (f, cfth, (cft, i)), s, u, e) end | S.PTR (_, ty) => do_ty (ty, acc) | S.ARR {t = ty, ...} => do_ty (ty, acc) | S.UNIMPLEMENTED _ => acc fun fs (S.OFIELD {spec = (_, ty), ...}, acc) = do_ty (ty, acc) | fs (_, acc) = acc fun f ({name, spec}, acc) = fs (spec, acc) fun s ({src, tag, size, anon, fields, exclude}, acc) = List.fold (fields, acc, f) fun u ({src, tag, size, anon, all, exclude}, acc) = List.fold (all, acc, f) fun gvar ({src, name, spec = (_, ty)}, acc) = do_ty (ty, acc) fun gfun ({src, name, spec, argnames}, acc) = do_ty (S.FPTR spec, acc) fun gty ({src, name, spec}, acc) = do_ty (spec, acc) fun lfold (l, f, b) = List.fold (l, b, f) fun mfold (m, f, b) = SM.foldl f b m in lfold (gvars, gvar, lfold (gfuns, gfun, lfold (gtys, gty, mfold (structs, s, mfold (unions, u, (IM.empty, SS.empty, SS.empty, SS.empty)))))) end fun s_inc t = SS.member (incomplete_structs, t) fun u_inc t = SS.member (incomplete_unions, t) fun Gstruct n = concat [prefix, "G_", n] fun Fstruct n = concat [prefix, "F_", n] fun fptr_rtti_struct_id i = "FPtrRTTI_" ^ Int.toString i fun Tstruct n = concat [prefix, "T_", n] fun SUETstruct K t = concat [K, "T_", t] val STstruct = SUETstruct "S" val UTstruct = SUETstruct "U" fun Suobj'rw p sut = Con ("su_obj" ^ p, [sut, Type "rw"]) fun Suobj'ro sut = Con ("su_obj'", [sut, Type "ro"]) fun SUEstruct K t = concat [prefix, K, "_", t] val Sstruct = SUEstruct "S" val Ustruct = SUEstruct "U" val Estruct = SUEstruct "E" fun Estruct' (n, anon) = Estruct (if anon andalso collect_enums then "'" else n) fun fieldtype_id n = "t_f_" ^ n fun fieldrtti_id n = "typ_f_" ^ n fun field_id (n, p) = concat ["f_", n, p] fun enum_id n = "e_" ^ n val pending = ref [] val exports = ref [] val files = ref [] local val dir_exists = ref false val checkDir = fn () => if !dir_exists then () else (dir_exists := true; if OS.FileSys.isDir dir handle _ => false then () else OS.FileSys.mkDir dir) in fun smlFileAndExport (file,export,do_export) = let (* We don't want apostrophes in file names -> turn them into minuses. * We also want to use only lowercase characters as some file systems * are case insensitive. *) val base = Vector.map (file, fn #"'" => #"-" | c => Char.toLower c) fun pick i = let val file = OS.Path.joinBaseExt {base = if i=0 then base else concat [base, "-", Int.toString i], ext = SOME "sml"} in if List.exists (!files, fn f => f = file) then pick (i+1) else file end val file = pick 0 val result = OS.Path.joinDirFile {dir = dir, file = file} in checkDir () ; List.push (pending, export) ; (result, fn () => (List.push (files, file) ; if do_export then List.push (exports, export) else () ; ignore (List.pop pending))) end fun descrFile file = let val result = OS.Path.joinDirFile {dir = dir, file = file} in checkDir () ; result end end fun rwro_str S.RW = "rw" | rwro_str S.RO = "ro" fun rwro_type c = Type (rwro_str c) fun rwro_c_type S.RW = Type "'c" | rwro_c_type S.RO = Type "ro" fun dim_ty 0 = Type "dec" | dim_ty n = Con ("dg" ^ Int.toString (n mod 10), [dim_ty (n div 10)]) val dim_ty = fn n => if n < 0 then raise Fail "negative dimension" else dim_ty n fun dim_val n = let fun build 0 = EVar "dec" | build n = EApp (build (n div 10), EVar ("dg" ^ Int.toString (n mod 10))) in EApp (build n, EVar "dim") end fun stem basic_t = case basic_t of S.SCHAR => "schar" | S.UCHAR => "uchar" | S.SSHORT => "sshort" | S.USHORT => "ushort" | S.SINT => "sint" | S.UINT => "uint" | S.SLONG => "slong" | S.ULONG => "ulong" | S.SLONGLONG => "slonglong" | S.ULONGLONG => "ulonglong" | S.FLOAT => "float" | S.DOUBLE => "double" val bytebits = #bits (#char targetSizes) fun sizeof_basic basic_t = case basic_t of S.SCHAR => #bits (#char targetSizes) | S.UCHAR => #bits (#char targetSizes) | S.SSHORT => #bits (#short targetSizes) | S.USHORT => #bits (#short targetSizes) | S.SINT => #bits (#int targetSizes) | S.UINT => #bits (#int targetSizes) | S.SLONG => #bits (#long targetSizes) | S.ULONG => #bits (#long targetSizes) | S.SLONGLONG => #bits (#longlong targetSizes) | S.ULONGLONG => #bits (#longlong targetSizes) | S.FLOAT => #bits (#float targetSizes) | S.DOUBLE => #bits (#double targetSizes) and sizeof t = case t of S.BASIC basic_t => Word.fromInt ((sizeof_basic basic_t) div bytebits) | S.STRUCT t => (case $? (structs, t) of SOME {size, ...} => size | NONE => err ["incomplete struct argument: struct ", t]) | S.UNION t => (case $? (unions, t) of SOME {size, ...} => size | NONE => err ["incomplete union argument: union ", t]) | S.ENUM _ => Word.fromInt ((#bits (#int targetSizes)) div bytebits) | S.VOIDPTR => Word.fromInt ((#bits (#pointer targetSizes)) div bytebits) | S.FPTR _ => Word.fromInt ((#bits (#pointer targetSizes)) div bytebits) | S.PTR _ => Word.fromInt ((#bits (#pointer targetSizes)) div bytebits) | S.ARR {d, esz, ...} => Word.fromInt (d * esz) | S.UNIMPLEMENTED what => unimp what val genStructTable : (String.t * unit Promise.t) HashSet.t = HashSet.new {hash = fn (structname, _) => String.hash structname} fun fillGenStructTable (app, coll, pr_promise) = app (coll, fn elem => let val (structname, promise) = pr_promise elem in (ignore o HashSet.lookupOrInsert) (genStructTable, String.hash structname, fn (s,_) => String.equals (structname, s), fn () => (structname, promise)) end) fun fillGenStructTable' (app, coll, pr_promise) = fillGenStructTable (fn (c, f) => app f c, coll, pr_promise) fun forceGenStruct structname = case HashSet.peek (genStructTable, String.hash structname, fn (s,_) => String.equals (structname, s)) of SOME (_,promise) => (Promise.force promise; structname) | NONE => err ["missing structure: ", structname] fun SUEtag K tag = Type ((forceGenStruct (SUETstruct K tag)) ^ ".tag") val Stag = SUEtag "S" val Utag = SUEtag "U" fun Etag (tag, anon) = SUEtag "E" (if collect_enums andalso anon then "'" else tag) fun SUEtyp K tag = EVar ((forceGenStruct (SUETstruct K tag)) ^ ".typ") val Styp = SUEtyp "S" val Utyp = SUEtyp "U" fun fptr_rtti_qid i = (forceGenStruct (fptr_rtti_struct_id i)) ^ ".typ" fun fptr_mkcall_qid i = (forceGenStruct (fptr_rtti_struct_id i)) ^ ".mkcall" fun witness_fptr_type_p prime {args, res} = let fun top_type ty = case ty of S.STRUCT t => Suobj'ro (Stag t) | S.UNION t => Suobj'ro (Utag t) | ty => witness_type' ty val (res_t, extra_arg_t) = case res of NONE => (Unit, []) | SOME (S.STRUCT t) => let val ot = Suobj'rw "'" (Stag t) in (ot, [ot]) end | SOME (S.UNION t) => let val ot = Suobj'rw "'" (Utag t) in (ot, [ot]) end | SOME ty => (top_type ty, []) val arg_tl = extra_arg_t @ (List.map (args, top_type)) val dom_t = Tuple arg_tl val fct_t = Arrow (dom_t, res_t) in Con ("fptr" ^ prime, [fct_t]) end and witness_type_p prime ty = (case ty of S.BASIC basic_t => Type (stem basic_t) | S.STRUCT t => Con ("su", [Stag t]) | S.UNION t => Con ("su", [Utag t]) | S.ENUM t => Con ("enum", [Etag t]) | S.VOIDPTR => Type "voidptr" | S.FPTR spec => witness_fptr_type_p prime spec | S.PTR (c, ty) => Con ("ptr" ^ prime, [Con ("obj", [witness_type ty, rwro_type c])]) | S.ARR {t = ty, d, ...} => Con ("arr", [witness_type ty, dim_ty d]) | S.UNIMPLEMENTED what => unimp what) and witness_type ty = witness_type_p "" ty and witness_type' ty = witness_type_p "'" ty fun topfunc_type prime ({args, res}, argnames) = let fun top_type ty = case ty of S.BASIC S.SCHAR => Type "MLRep.Char.Signed.int" | S.BASIC S.UCHAR => Type "MLRep.Char.Unsigned.word" | S.BASIC S.SSHORT => Type "MLRep.Short.Signed.int" | S.BASIC S.USHORT => Type "MLRep.Short.Unsigned.word" | S.BASIC S.SINT => Type "MLRep.Int.Signed.int" | S.BASIC S.UINT => Type "MLRep.Int.Unsigned.word" | S.BASIC S.SLONG => Type "MLRep.Long.Signed.int" | S.BASIC S.ULONG => Type "MLRep.Long.Unsigned.word" | S.BASIC S.SLONGLONG => Type "MLRep.LongLong.Signed.int" | S.BASIC S.ULONGLONG => Type "MLRep.LongLong.Unsigned.word" | S.BASIC S.FLOAT => Type "MLRep.Float.real" | S.BASIC S.DOUBLE => Type "MLRep.Double.real" | S.STRUCT t => Con ("su_obj" ^ prime, [Stag t, Type "'c"]) | S.UNION t => Con ("su_obj" ^ prime, [Utag t, Type "'c"]) | S.ENUM _ => Type "MLRep.Int.Signed.int" | ty => witness_type_p prime ty val (res_t, extra_arg_t, extra_argname) = case res of NONE => (Unit, [], []) | SOME (S.STRUCT t) => let val ot = Suobj'rw prime (Stag t) in (ot, [ot], [writeto]) end | SOME (S.UNION t) => let val ot = Suobj'rw prime (Utag t) in (ot, [ot], [writeto]) end | SOME ty => (top_type ty, [], []) val arg_tl = List.map (args, top_type) val arg_t = case (namedargs, argnames) of (true, SOME nl) => (Record o List.zip) (extra_argname @ nl, extra_arg_t @ arg_tl) | _ => Tuple (extra_arg_t @ arg_tl) in Arrow (arg_t, res_t) end fun rtti_type ty = Con ("T.typ", [witness_type ty]) local fun simple v = EVar ("T." ^ v) in fun rtti_val ty = case ty of S.BASIC basic_t => simple (stem basic_t) | S.STRUCT t => if s_inc t then raise Incomplete else Styp t | S.UNION t => if u_inc t then raise Incomplete else Utyp t | S.ENUM t => EConstr (EVar "T.enum", Con ("T.typ", [Con ("enum", [Etag t])])) | S.VOIDPTR => simple "voidptr" | S.FPTR cft => let val cfth = hash_cft cft in case %? (fptr_types, cfth) of SOME (_, i) => EVar (fptr_rtti_qid i) | NONE => raise Fail "fptr type missing" end | S.PTR (S.RW, ty) => EApp (EVar "T.pointer", rtti_val ty) | S.PTR (S.RO, ty) => EApp (EVar "T.ro", EApp (EVar "T.pointer", rtti_val ty)) | S.ARR {t = ty, d, ...} => EApp (EVar "T.arr", ETuple [rtti_val ty, dim_val d]) | S.UNIMPLEMENTED what => raise Incomplete end fun fptr_mkcall spec = let val h = hash_cft spec in case %? (fptr_types, h) of SOME (_, i) => fptr_mkcall_qid i | NONE => raise Fail "missing fptr_type (mkcall)" end fun pr_addr_import (pr_fdef, name, attrs) = pr_fdef ("h", [EUnit], EPrim ("_address \"" ^ name ^ "\" " ^ attrs, Type "CMemory.addr")) fun pr_gvar_promise x = let val {src, name, spec = (c, t)} = x val gstruct = Gstruct name val gstruct_export = "structure " ^ gstruct in (gstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("g-" ^ name, gstruct_export, true) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, SOME src) fun doit () = let val () = pr_tdef ("t", witness_type t) val incomplete = (pr_vdef ("typ", EConstr (rtti_val t, Con ("T.typ", [Type "t"]))) ; false) handle Incomplee => true val obj' = EConstr (EApp (EVar "mk_obj'", EApp (EVar "h", EUnit)), Con ("obj'", [Type "t", rwro_type c])) val dolight = dolight orelse incomplete in if dolight then pr_fdef ("obj'", [EUnit], obj') else (); if doheavy andalso not incomplete then pr_fdef ("obj", [EUnit], EApp (EApp (EVar "Heavy.obj", EVar "typ"), if dolight then EApp (EVar "obj'", EUnit) else obj')) else () end in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; case linkage of Control.Linkage.Archive => pr_addr_import (pr_fdef, name, "public") | Control.Linkage.Dynamic => pr_vdef ("h", EApp (EVar libhandle, EString name)) | Control.Linkage.Shared => pr_addr_import (pr_fdef, name, "external"); endBox (); nl (); str "in"; VBox 4; nl (); str (gstruct_export ^ " = struct"); Box 4; doit (); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable (List.foreach, gvars, pr_gvar_promise) fun pr_gfun_promise x = let val {src, name, spec as {args, res}, argnames} = x val fstruct = Fstruct name val fstruct_export = "structure " ^ fstruct in (fstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("f-" ^ name, fstruct_export, true) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_vdecl, ...} = openPP (file, SOME src) fun doit is_light = let val ml_vars = List.mapi (args, fn (i, _) => EVar ("x" ^ Int.toString (i + 1))) fun app0 (what, e) = if is_light then e else EApp (EVar what, e) fun light (what, e) = app0 ("Light." ^ what, e) fun heavy (what, t, e) = if is_light then e else EApp (EApp (EVar ("Heavy." ^ what), rtti_val t), e) fun oneArg (e, t) = case t of S.BASIC basic_t => EApp (EVar ("Cvt.c_" ^ stem basic_t), e) | S.STRUCT _ => EApp (EVar "ro'", light ("obj", e)) | S.UNION _ => EApp (EVar "ro'", light ("obj", e)) | S.ENUM _ => EApp (EVar "Cvt.i2c_enum", e) | S.PTR _ => light ("ptr", e) | S.FPTR _ => light ("fptr", e) | S.VOIDPTR => e | S.UNIMPLEMENTED what => unimp_arg what | S.ARR _ => raise Fail "array argument type" val c_exps = List.map2 (ml_vars, args, oneArg) val (ml_vars, c_exps, extra_argname) = let fun do_su () = let val x0 = EVar "x0" in (x0 :: ml_vars, light ("obj", x0) :: c_exps, [writeto]) end in case res of SOME (S.STRUCT _) => do_su () | SOME (S.UNION _) => do_su () | _ => (ml_vars, c_exps, []) end val call = EApp (EVar "call", ETuple [EApp (EVar "fptr", EUnit), ETuple c_exps]) val ml_res = case res of NONE => call | SOME t => (case t of S.BASIC basic_t => EApp (EVar ("Cvt.ml_" ^ stem basic_t), call) | S.STRUCT _ => heavy ("obj", t, call) | S.UNION _ => heavy ("obj", t, call) | S.ENUM _ => EApp (EVar "Cvt.c2i_enum", call) | S.PTR _ => heavy ("ptr", t, call) | S.FPTR _ => heavy ("fptr", t, call) | S.VOIDPTR => call | S.UNIMPLEMENTED what => unimp_res what | S.ARR _ => raise Fail "array result type") in fn () => pr_fdef (if is_light then "f'" else "f", [ETuple ml_vars], ml_res) end fun do_fsig is_light = let val prime = if is_light then "'" else "" in pr_vdecl ("f" ^ prime, topfunc_type prime (spec, argnames)) end val (do_f_heavy, incomplete) = (if doheavy then doit false else (fn () => ()), false) handle Incomplete => (fn () => (), true) val do_f_light = if dolight orelse incomplete then doit true else (fn () => ()) in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; case linkage of Control.Linkage.Archive => pr_addr_import (pr_fdef, name, "public") | Control.Linkage.Dynamic => pr_vdef ("h", EApp (EVar libhandle, EString name)) | Control.Linkage.Shared => pr_addr_import (pr_fdef, name, "external"); endBox (); nl (); str "in"; VBox 4; nl (); str (fstruct_export ^ " : sig"); Box 4; pr_vdecl ("typ", rtti_type (S.FPTR spec)); pr_vdecl ("fptr", Arrow (Unit, witness_type (S.FPTR spec))); if doheavy andalso not incomplete then do_fsig false else (); if dolight orelse incomplete then do_fsig true else (); endBox (); nl (); str "end = struct"; Box 4; pr_vdef ("typ", rtti_val (S.FPTR spec)); pr_fdef ("fptr", [EUnit], EApp (EVar "mk_fptr", ETuple [EVar (fptr_mkcall spec), EApp (EVar "h", EUnit)])); do_f_heavy (); do_f_light (); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable (List.foreach, gfuns, pr_gfun_promise) val get_callop = let val ncallops = ref 0 val callops = ref IM.empty fun callop_sid i = "Callop_" ^ Int.toString i fun callop_qid i = callop_sid i ^ ".callop" fun get (ml_args_t, ml_res_t) = let val e_proto_hash = hash_mltype (Arrow (ml_args_t, ml_res_t)) in case %? (!callops, e_proto_hash) of SOME i => callop_qid i | NONE => let val i = !ncallops val sn = callop_sid i val sn_export = "structure " ^ sn val (file, done) = smlFileAndExport ("callop-" ^ Int.toString i, sn_export, false) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, NONE) in ncallops := i + 1; callops := IM.insert (!callops, e_proto_hash, i); str (sn_export ^ " = struct"); Box 4; pr_vdef ("callop", EPrim ("_import *", Arrow (Type "CMemory.addr", Arrow (ml_args_t, ml_res_t)))); endBox (); nl (); str "end"; nl (); closePP (); done (); callop_qid i end end in get end fun pr_fptr_rtti_promise x = let val ({args, res}, i) = x val fstruct = fptr_rtti_struct_id i val fstruct_export = "structure " ^ fstruct in (fstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("fptr-rtti-" ^ (Int.toString i), fstruct_export, false) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, NONE) fun mlty ty = case ty of S.BASIC basic_t => Type ("CMemory.cc_" ^ stem basic_t) | S.STRUCT _ => Type "CMemory.cc_addr" | S.UNION _ => Type "CMemory.cc_addr" | S.ENUM _ => Type "CMemory.cc_sint" | S.VOIDPTR => Type "CMemory.cc_addr" | S.FPTR _ => Type "CMemory.cc_addr" | S.PTR _ => Type "CMemory.cc_addr" | S.ARR _ => raise Fail "unexpected type" | S.UNIMPLEMENTED what => unimp what fun wrap (e, n) = EApp (EVar ("CMemory.wrap_" ^ n), EApp (EVar ("Cvt.ml_" ^ n), e)) fun fldwrap (e, n, alt) = EApp (EVar ("CMemory.wrap_" ^ n), EApp (EVar ("Get." ^ n ^ alt), e)) fun vwrap e = EApp (EVar "CMemory.wrap_addr", EApp (EVar "reveal", e)) fun fwrap e = EApp (EVar "CMemory.wrap_addr", EApp (EVar "freveal", e)) fun pwrap e = EApp (EVar "CMemory.wrap_addr", EApp (EVar "reveal", EApp (EVar "Ptr.inject'", e))) fun fldvwrap (e, alt) = EApp (EVar "CMemory.wrap_addr", EApp (EVar "reveal", EApp (EVar ("Get.voidptr" ^ alt), e))) fun fldfwrap (e, alt) = EApp (EVar "CMemory.wrap_addr", EApp (EVar "freveal", if alt = "'" then EApp (EVar "Get.fptr'", e) else EApp (EVar "Light.fptr", EApp (EVar "Get.fptr", e)))) fun fldpwrap (e, alt) = EApp (EVar "CMemory.wrap_addr", EApp (EVar "reveal", EApp (EVar ("Ptr.inject" ^ alt), EApp (EVar ("Get.ptr" ^ alt), e)))) fun suwrap e = pwrap (EApp (EVar "Ptr.|&!", e)) fun ewrap e = EApp (EVar "CMemory.wrap_sint", EApp (EVar "Cvt.c2i_enum", e)) fun fldewrap (e, alt) = EApp (EVar "CMemory.wrap_sint", EApp (EVar ("Get.enum" ^ alt), e)) val (ml_res_t, extra_arg_v, extra_arg_e, extra_ml_arg_t, res_wrap) = case res of NONE => (Unit, [], [], [], fn r => r) | SOME (S.STRUCT _) => (Unit, [EVar "x0"], [suwrap (EVar "x0")], [Type "CMemory.cc_addr"], fn r => ESeq (r, EVar "x0")) | SOME (S.UNION _) => (Unit, [EVar "x0"], [suwrap (EVar "x0")], [Type "CMemory.cc_addr"], fn r => ESeq (r, EVar "x0")) | SOME t => let fun unwrap n r = EApp (EVar ("Cvt.c_" ^ n), EApp (EVar ("CMemory.unwrap_" ^ n), r)) fun punwrap cast r = EApp (EVar cast, EApp (EVar "CMemory.unwrap_addr", r)) fun eunwrap r = EApp (EVar "Cvt.i2c_enum", EApp (EVar "CMemory.unwrap_sint", r)) val res_wrap = case t of S.BASIC basic_t => unwrap (stem basic_t) | S.STRUCT _ => raise Fail "unexpected result type" | S.UNION _ => raise Fail "unexpected result type" | S.ENUM _ => eunwrap | S.VOIDPTR => punwrap "vcast" | S.FPTR _ => punwrap "fcast" | S.PTR _ => punwrap "pcast" | S.ARR _ => raise Fail "unexpected result type" | S.UNIMPLEMENTED what => unimp_res what in (mlty t, [], [], [], res_wrap) end fun doarg (h, p) = let fun sel e = ([mlty h], [e], []) in case h of S.BASIC basic_t => sel (wrap (p, stem basic_t)) | S.STRUCT t => (* sel (suwrap p) *) raise Fail "struct argument not (yet) supported" | S.UNION t => (* sel (suwrap p) *) raise Fail "union argument not (yet) supported" | S.ENUM _ => sel (ewrap p) | S.VOIDPTR => sel (vwrap p) | S.FPTR _ => sel (fwrap p) | S.PTR _ => sel (pwrap p) | S.ARR _ => raise Fail "unexpected array argument" | S.UNIMPLEMENTED what => unimp_arg what end and arglist ([], _) = ([], [], []) | arglist (h :: tl, i) = let val p = EVar ("x" ^ Int.toString i) val (ta, ea, bnds) = arglist (tl, i + 1) val (ta', ea', bnds') = doarg (h, p) in (ta' @ ta, ea' @ ea, bnds' @ bnds) end val (ml_args_tl, args_el, bnds) = arglist (args, 1) val ml_args_t = Tuple (extra_ml_arg_t @ ml_args_tl) val arg_vl = List.mapi (args, fn (i, _) => EVar ("x" ^ Int.toString (i + 1))) val arg_e = ETuple (extra_arg_e @ args_el) val callop_n = get_callop (ml_args_t, ml_res_t) in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; endBox (); nl (); str "in"; VBox 4; nl (); str (fstruct_export ^ " = struct"); Box 4; pr_fdef ("mkcall", [EVar "a", ETuple (extra_arg_v @ arg_vl)], res_wrap (ELet (bnds, EApp (EApp (EVar callop_n, EVar "a"), arg_e)))); pr_vdef ("typ", EConstr (EApp (EVar "mk_fptr_typ", EVar "mkcall"), rtti_type (S.FPTR {args = args, res = res}))); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable' (IM.app, fptr_types, pr_fptr_rtti_promise) fun pr_gty_promise x = let val {src, name, spec} = x val tstruct = Tstruct name val tstruct_export = "structure " ^ tstruct in (tstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("t-" ^ name, tstruct_export, true) val {closePP, str, nl, Box, VBox, endBox, pr_vdef, pr_tdef, ...} = openPP (file, SOME src) val rtti_val_opt = (SOME (rtti_val spec)) handle Incomplete => NONE in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; endBox (); nl (); str "in"; VBox 4; nl (); str (tstruct_export ^ " = struct"); Box 4; pr_tdef ("t", witness_type spec); Option.app (rtti_val_opt, fn rtti_val => pr_vdef ("typ", EConstr (rtti_val, Con ("T.typ", [Type "t"])))); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable (List.foreach, gtys, pr_gty_promise) datatype sue_szinfo = T_INC (* generate no RTTI *) | T_SU of word (* generate struct/union RTTI *) | T_E (* generate enum RTTI *) fun pr_suet_promise x = let val (src, tag, anon, tinfo, k, K) = x val suetstruct = SUETstruct K tag val suetstruct_export = "structure " ^ suetstruct in (suetstruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport (k ^ "t-" ^ tag, suetstruct_export, tinfo = T_INC) val {closePP, str, nl, Box, VBox, endBox, pr_vdef, pr_tdef, ...} = openPP (file, src) val (utildef, tag_t) = if anon then ("structure X :> sig type t end \ \= struct type t = unit end", Type "X.t") else ("open Tag", Vector.foldr (tag, Type k, fn (c, tag_t) => Con ("t_" ^ String.fromChar c, [tag_t]))) fun do_susize size = let in pr_vdef ("size", EConstr (EApp (EVar "mk_su_size", EWord size), Con ("S.size", [Con ("su", [Type "tag"])]))); pr_vdef ("typ", EApp (EVar "mk_su_typ", EVar "size")) end in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; nl (); str (concat ["structure ", SUEstruct K tag, " = struct"]); Box 4; nl (); str "local"; VBox 4; nl (); str utildef; endBox (); nl (); str "in"; VBox 4; pr_tdef ("tag", tag_t); endBox (); nl (); str "end"; case tinfo of T_INC => () | T_SU size => do_susize size | T_E => (); endBox (); nl (); str "end"; endBox (); nl (); str "in"; VBox 4; nl (); str (concat [suetstruct_export, " = ", SUEstruct K tag]); endBox (); nl (); str "end"; nl (); closePP (); done () end)) end local fun pr_st_promise {src, tag, anon, size, fields, exclude} = pr_suet_promise (SOME src, tag, anon, T_SU size, "s", "S") fun pr_ut_promise {src, tag, anon, size, all, exclude} = pr_suet_promise (SOME src, tag, anon, T_SU size, "u", "U") fun pr_et_promise {src, tag, anon, descr, spec, exclude} = pr_suet_promise (SOME src, tag, anon, T_E, "e", "E") in val () = fillGenStructTable' (SM.app, structs, pr_st_promise) val () = fillGenStructTable' (SM.app, unions, pr_ut_promise) val () = fillGenStructTable' (SM.app, enums, pr_et_promise) end local fun pr_i_suet_promise (tag, k, K) = pr_suet_promise (NONE, tag, false, T_INC, k, K) fun pr_i_st_promise tag = pr_i_suet_promise (tag, "s", "S") fun pr_i_ut_promise tag = pr_i_suet_promise (tag, "u", "U") fun pr_i_et_promise tag = pr_i_suet_promise (tag, "e", "E") in val () = fillGenStructTable' (SS.app, incomplete_structs, pr_i_st_promise) val () = fillGenStructTable' (SS.app, incomplete_unions, pr_i_ut_promise) val () = fillGenStructTable' (SS.app, incomplete_enums, pr_i_et_promise) end fun pr_su_promise x = let val (src, tag, fields, k, K) = x val sustruct = SUEstruct K tag val sustruct_export = "structure " ^ sustruct in (sustruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport (k ^ "-" ^ tag, sustruct_export, true) val {closePP, str, nl, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, SOME src) fun pr_field_type {name, spec} = case spec of S.OFIELD {spec = (c, ty), synthetic = false, offset} => pr_tdef (fieldtype_id name, witness_type ty) | _ => () fun pr_field_rtti {name, spec} = case spec of S.OFIELD {spec = (c, ty), synthetic = false, offset} => pr_vdef (fieldrtti_id name, EConstr (rtti_val ty, Con ("T.typ", [Type (fieldtype_id name)]))) | _ => () fun arg_x prime = EConstr (EVar "x", Con ("su_obj" ^ prime, [Type "tag", Type "'c"])) fun pr_bf_acc (name, prime, sign, {offset, constness, bits, shift}) = let val maker = concat ["mk_", rwro_str constness, "_", sign, "bf", prime] in pr_fdef (field_id (name, prime), [arg_x prime], EApp (EApp (EVar maker, ETuple [EInt offset, EWord bits, EWord shift]), EVar "x")) end fun pr_field_acc' {name, spec} = case spec of S.OFIELD {spec = (c, ty), synthetic, offset} => if synthetic then () else pr_fdef (field_id (name, "'"), [arg_x "'"], EConstr (EApp (EVar "mk_field'", ETuple [EInt offset, EVar "x"]), Con ("obj'", [Type (fieldtype_id name), rwro_c_type c]))) | S.SBF bf => pr_bf_acc (name, "'", "s", bf) | S.UBF bf => pr_bf_acc (name, "'", "u", bf) fun pr_field_acc {name, spec} = case spec of S.OFIELD {spec = (c, ty), synthetic, offset} => if synthetic then () else let val maker = concat ["mk_", rwro_str c, "_field"] in pr_fdef (field_id (name, ""), [arg_x ""], EApp (EVar maker, ETuple [EVar (fieldrtti_id name), EInt offset, EVar "x"])) end | S.SBF bf => pr_bf_acc (name, "", "s", bf) | S.UBF bf => pr_bf_acc (name, "", "u", bf) fun pr_one_field f = let val _ = pr_field_type f val incomplete = (pr_field_rtti f; false) handle Incomplete => true in if dolight orelse incomplete then pr_field_acc' f else (); if doheavy andalso not incomplete then pr_field_acc f else () end in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; endBox (); nl (); str "in"; VBox 4; nl (); str (sustruct_export ^ " = struct"); Box 4; nl (); str ("open " ^ (forceGenStruct (SUETstruct K tag))); List.foreach (fields, pr_one_field); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end local fun pr_s_promise { src, tag, anon, size, fields, exclude } = pr_su_promise (src, tag, fields, "s", "S") fun pr_u_promise { src, tag, anon, size, all, exclude } = pr_su_promise (src, tag, all, "u", "U") in val () = fillGenStructTable' (SM.app, structs, pr_s_promise) val () = fillGenStructTable' (SM.app, unions, pr_u_promise) end fun pr_e_promise x = let val {src, tag, anon, descr, spec, exclude} = x val estruct = Estruct' (tag, anon) val estruct_export = "structure " ^ estruct in (estruct, Promise.delay (fn () => let val (file, done) = smlFileAndExport ("e-" ^ tag, estruct_export, true) val {closePP, str, line, nl, sp, Box, VBox, endBox, pr_fdef, pr_vdef, pr_tdef, ...} = openPP (file, SOME src) fun no_duplicate_values () = let fun loop (l, s) = case l of [] => true | {name, spec} :: l => if LIS.member (s, spec) then (warn (concat ["enum ", descr, " has duplicate values;\ \ using sing,\ \ not generating constructors\n"]); false) else loop (l, LIS.add (s, spec)) in loop (spec, LIS.empty) end val dodt = enum_cons andalso no_duplicate_values () fun dt_mlrep () = let fun pcl () = let fun loop (c, l) = case l of [] => () | {name, spec} :: l => (str (c ^ enum_id name); nextround l) and nextround [] = () | nextround l = (sp (); loop ("| ", l)) in Box 2; nl (); loop (" ", spec); endBox () end fun pfl (fname, arg, res, fini: unit -> unit) = let fun loop (pfx, l) = case l of [] => () | v :: l => (line (concat [pfx, " ", arg v, " => ", res v]); loop (" |", l)) in line (concat ["fun ", fname, " x ="]); Box 4; line ("case x of"); loop (" ", spec); fini (); endBox () end fun cstr {name, spec} = enum_id name fun vstr {name, spec} = LargeInt.toString spec ^ " : MLRep.Int.Signed.int" in line "datatype mlrep ="; pcl (); pfl ("m2i", cstr, vstr, fn () => ()); pfl ("i2m", vstr, cstr, fn () => line " | _ => raise General.Domain") end fun int_mlrep () = let fun v {name, spec} = pr_vdef (enum_id name, EConstr (ELInt spec, Type "mlrep")) val mlx = EConstr (EVar "x", Type "mlrep") val ty = Type "MLRep.Int.Signed.int" val ix = EConstr (EVar "x", ty) in pr_tdef ("mlrep", ty); List.foreach (spec, v); pr_fdef ("m2i", [mlx], ix); pr_fdef ("i2m", [ix], mlx) end fun getset p = let fun constr c = Con ("enum_obj" ^ p, [Type "tag", Type c]) in pr_fdef ("get" ^ p, [EConstr (EVar "x", constr "'c")], EApp (EVar "i2m", EApp (EVar ("Get.enum" ^ p), EVar "x"))); pr_fdef ("set" ^ p, [ETuple [EConstr (EVar "x", constr "rw"), EVar "v"]], EApp (EVar ("Set.enum" ^ p), ETuple [EVar "x", EApp (EVar "m2i", EVar "v")])) end in str "local"; VBox 4; nl (); str "open C.Dim C_Int"; endBox (); nl (); str "in"; VBox 4; nl (); str (estruct_export ^ " = struct"); Box 4; nl (); str ("open " ^ (forceGenStruct (SUETstruct "E" tag))); if dodt then dt_mlrep () else int_mlrep (); endBox (); nl (); str "end"; endBox (); nl (); str "end"; nl (); closePP (); done () end)) end val () = fillGenStructTable' (SM.app, enums, pr_e_promise) fun do_mlbfile () = let val file = descrFile mlbfile val () = File.remove file val {closePP, line, str, nl, VBox, endBox, ... } = openPP (file, NONE) in line "local ann \"allowFFI true\" in"; VBox 4; app line ["$(SML_LIB)/basis/basis.mlb", "$(SML_LIB)/mlnlffi-lib/internals/c-int.mlb"]; app line (rev extramembers); app line (rev (!files)); endBox (); nl (); str "end in"; VBox 4; app line (rev (!exports)); endBox (); nl (); str "end"; nl (); closePP () end in (HashSet.foreach (genStructTable, fn (_, promise) => Promise.force promise) ; do_mlbfile ()) handle Promise.Force => warn ("cyclic dependency: " ^ (String.concatWith (!pending, " "))) end end mlton-20100608/mlnlffigen/hash.sml0000644000076600000240000000520511404435621015342 0ustar mtfstaff(* hash.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * hash.sml - Generating unique hash codes for C function types and * for ML types. * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure Hash : sig val mkFHasher : unit -> Spec.cft -> int val mkTHasher : unit -> PrettyPrint.mltype -> int end = struct structure S = Spec structure PP = PrettyPrint structure SM = StringMap structure LM = IntListMap fun tyConId S.SCHAR = 0 | tyConId S.UCHAR = 1 | tyConId S.SSHORT = 2 | tyConId S.USHORT = 3 | tyConId S.SINT = 4 | tyConId S.UINT = 5 | tyConId S.SLONG = 6 | tyConId S.ULONG = 7 | tyConId S.SLONGLONG = 8 | tyConId S.ULONGLONG = 9 | tyConId S.FLOAT = 10 | tyConId S.DOUBLE = 11 fun conConId S.RW = 0 | conConId S.RO = 1 fun look (next, find, insert) tab k = case find (!tab, k) of SOME i => i | NONE => let val i = !next in next := i + 1; tab := insert (!tab, k, i); i end fun mkFHasher () = let val stab = ref SM.empty val utab = ref SM.empty val etab = ref SM.empty val ltab = ref LM.empty val next = ref 13 val tlook = look (next, SM.find, SM.insert) val llook = look (next, LM.find, LM.insert) ltab fun hash (S.STRUCT t) = tlook stab t | hash (S.UNION t) = tlook utab t | hash (S.ENUM (t, _)) = tlook etab t | hash (S.FPTR x) = cfthash x | hash (S.PTR (c, ty)) = llook [1, conConId c, hash ty] | hash (S.ARR { t, d, esz }) = llook [2, hash t, d, esz] | hash (S.BASIC ty) = tyConId ty | hash (S.VOIDPTR) = 12 | hash _ = raise Fail "hash" and cfthash { args, res } = llook (0 :: opthash res :: map hash args) and opthash NONE = 0 | opthash (SOME ty) = 1 + hash ty in cfthash end fun mkTHasher () = let val stab = ref SM.empty val ltab = ref LM.empty val next = ref 0 val slook = look (next, SM.find, SM.insert) stab val llook = look (next, LM.find, LM.insert) ltab fun hash (PP.ARROW (t, t')) = llook [0, hash t, hash t'] | hash (PP.TUPLE tl) = llook (1 :: map hash tl) | hash (PP.CON (c, tl)) = llook (2 :: slook c :: map hash tl) | hash (PP.RECORD pl) = llook (3 :: map phash pl) and phash (n, t) = llook [4, slook n, hash t] in hash end end mlton-20100608/mlnlffigen/main.sml0000644000076600000240000001334411404435622015347 0ustar mtfstaff(* Copyright (C) 2005-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Main : sig val main : unit -> unit end = struct structure RE = RegExpFn (structure P = AwkSyntax structure E = DfaEngine) fun makeOptions {usage} = let open Popt Control in List.map ([(Expert, "debug", " {false|true}", "", boolRef debug), (Normal, "allSU", " {false|true}", "generate ML definitions for all #include-d struct and union definitions", boolRef allSU), (Normal, "collect", " {true|false}", "collect enum constants from unnamed enumerateions", boolRef collect_enums), (Normal, "cppopt", " ", "pass option to preprocessor", SpaceString (fn s => List.push (cppopts, s))), (Normal, "dir", " ", "output directory for generated files", SpaceString (fn s => dir := s)), (Normal, "enum-constructors", " {false|true}", "when possible, make the ML representation type of enumerations a datatype", boolRef enum_cons), (Normal, "gensym", " ", "suffix for \"gensym-ed\" generated ML structure names", SpaceString (fn s => gensym := s)), (Normal, "heavy", "", "suppress 'light' versions of function wrappers and field accessors", None (fn () => weight := {heavy = true, light = false})), (Normal, "include", " ", "include file in the generated .mlb file", SpaceString (fn s => List.push (extramembers, s))), (Normal, "libhandle", " ", "Use the to refer to the handle to the shared library", SpaceString (fn s => libhandle := s)), (Normal, "light", "", "suppress 'heavy' versions of function wrappers and field accessors", None (fn () => weight := {heavy = false, light = true})), (Normal, "linkage", " {archive|dynamic|shared}", "how to link C objects", SpaceString (fn s => if s = "archive" orelse s = "static" then linkage := Linkage.Archive else if s = "dynamic" then linkage := Linkage.Dynamic else if s = "shared" then linkage := Linkage.Shared else usage (concat ["invalid -linkage arg: ", s]))), (Normal, "match", " ", "generate ML definitions for #include-d definitions matching ", SpaceString (fn re => let val regexp = SOME (RE.compileString re) handle RegExpSyntax.CannotParse => NONE | RegExpSyntax.CannotCompile => NONE in case regexp of SOME regexp => let val scanFn = RE.prefix regexp fun matchFn s = let val n = String.length s fun getc i = if (i < n) then SOME (String.sub (s, i), i + 1) else NONE in case scanFn getc 0 of NONE => false | SOME (x, k) => k = n end in match := matchFn end | NONE => usage (concat ["invalid -match arg: ", re]) end)), (Normal, "mlbfile", " ", "name of the generated .mlb file", SpaceString (fn s => mlbfile := s)), (Normal, "namedargs", " {false|true}", "generate function wrappers with named arguments", boolRef namedargs), (Normal, "prefix", " ", "prefix for generated ML structure names", SpaceString (fn s => prefix := s)), (Normal, "target", " -", "platform that executable will run on", SpaceString (fn s => (case Target.fromString s of NONE => usage (concat ["invalid -target arg: ", s]) | SOME t => (case Target.make t of NONE => usage (concat ["unsupported -target arg: ", s]) | SOME z => target := SOME z)))), (Normal, "width", " 75", "output line width for pretty-printing", intRef width)], fn (style, name, arg, desc, opt) => {arg = arg, desc = desc, name = name, opt = opt, style = style}) end val mainUsage = "mlnlffigen [option ...] C-file ..." val {parse, usage} = Popt.makeUsage {mainUsage = mainUsage, makeOptions = makeOptions, showExpert = fn () => !Control.debug} val die = Process.fail fun commandLine args = let val rest = parse args val () = if Option.isNone (!Control.target) then usage "no -target specified" else () in case rest of Result.No msg => usage msg | Result.Yes [] => usage "no C-file(s)" | Result.Yes cfiles => Gen.gen {cfiles = cfiles} end val main = Process.makeMain commandLine end mlton-20100608/mlnlffigen/Makefile0000644000076600000240000000124511404435621015342 0ustar mtfstaff## Copyright (C) 2005-2009 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## SRC := $(shell cd .. && pwd) BUILD := $(SRC)/build BIN := $(BUILD)/bin LIB := $(BUILD)/lib MLTON := mlton TARGET := self FLAGS := -target $(TARGET) -default-ann 'sequenceNonUnit warn' NAME := mlnlffigen PATH := $(BIN):$(shell echo $$PATH) all: $(NAME) cppcmd.sml : gen-cppcmd ./gen-cppcmd > $@ $(NAME): $(NAME).mlb $(shell PATH="$(BIN):$$PATH" && "$(MLTON)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' $(MLTON) $(FLAGS) $(NAME).mlb .PHONY: clean clean: ../bin/clean mlton-20100608/mlnlffigen/mlnlffigen.mlb0000644000076600000240000000036511404435621016521 0ustar mtfstaff(* Copyright (C) 2005-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local sources.mlb in call-main.sml end mlton-20100608/mlnlffigen/pp.sml0000644000076600000240000002637311404435621015047 0ustar mtfstaff(* pp.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * pp.sml - Some simple pretty-printing infrastructure for the ml-ffigen * program. * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure PrettyPrint = struct structure PP = PPStreamFn (structure Token = StringToken structure Device = CPIFDev) datatype mltype = ARROW of mltype * mltype | TUPLE of mltype list | CON of string * mltype list | RECORD of (string * mltype) list val Unit = TUPLE [] fun Type t = CON (t, []) fun St tag = Type (concat ["ST_", tag, ".tag"]) fun Un tag = Type (concat ["UT_", tag, ".tag"]) fun En tag = Type (concat ["ET_", tag, ".tag"]) datatype tcontext = C_STAR | C_ARROW | C_COMMA | C_CON fun simplify (CON ("unit", [])) = Unit | simplify (TUPLE [t]) = simplify t | simplify (CON (k, tl)) = let fun doDefault () = CON (k, map simplify tl) fun doObj obj = case tl of [CON (k, tl), c] => if List.exists (fn k' => k = k') ["schar","uchar","sshort","ushort", "sint","uint","slong","ulong", "slonglong","ulonglong","float","double", "voidptr"] then CON (concat [k, "_", obj], [simplify c]) else if k = "fptr" then case tl of [f] => CON ("fptr_" ^ obj, [simplify f, simplify c]) | _ => doDefault () else if k = "su" then case tl of [su] => CON ("su_" ^ obj, [simplify su, simplify c]) | _ => doDefault () else doDefault () | _ => doDefault () fun doDim d = if d = "dim" then case tl of [n, CON (k', [])] => if k' = "Dim.nonzero" orelse k' = "nonzero" then CON ("dim", [simplify n]) else doDefault () | _ => doDefault () else if d = "dec" then case tl of [] => CON ("dec", []) | _ => doDefault () else if List.exists (fn d' => d = d') ["dg0","dg1","dg2","dg3","dg4", "dg5","dg6","dg7","dg8","dg9"] then case tl of [n] => CON (d, [simplify n]) | _ => doDefault () else doDefault () in if k = "obj" orelse k = "obj'" then doObj k else if String.isPrefix "Dim." k then doDim (String.extract(k,4,NONE)) else doDefault () end | simplify (ARROW (t1, t2)) = ARROW (simplify t1, simplify t2) | simplify (TUPLE tl) = TUPLE (map simplify tl) | simplify (RECORD ml) = RECORD (map (fn (n, t) => (n, simplify t)) ml) fun ppType0 s (t as ARROW _, c) = let fun loop (ARROW (x, y)) = (ppType0 s (x, C_ARROW); PP.string s " ->"; PP.space s 1; loop y) | loop t = ppType0 s (t, C_ARROW) val paren = not (c = C_COMMA) val indent = if paren then 5 else 4 in PP.openHOVBox s (PP.Rel indent); if paren then PP.string s "(" else (); loop t; if paren then PP.string s ")" else (); PP.closeBox s end | ppType0 s (TUPLE [], _) = PP.string s "unit" | ppType0 s (TUPLE [t], c) = ppType0 s (t, c) | ppType0 s (TUPLE tl, c) = let fun loop [] = () (* cannot happen *) | loop [t] = ppType0 s (t, C_STAR) | loop (h :: tl) = (ppType0 s (h, C_STAR); PP.string s " *"; PP.space s 1; loop tl) val paren = case c of (C_STAR) => true | (C_CON) => true | (C_ARROW) => false | (C_COMMA) => false val indent = if paren then 1 else 0 in PP.openHVBox s (PP.Rel indent); if paren then PP.string s "(" else (); loop tl; if paren then PP.string s ")" else (); PP.closeBox s end | ppType0 s (RECORD [], _) = PP.string s "{}" | ppType0 s (RECORD tl, _) = let fun loop [] = () (* cannot happen *) | loop [(n, t)] = (PP.string s (n ^ " : "); ppType0 s (t, C_COMMA)) | loop ((n, t) :: tl) = (PP.string s (n ^ " : "); ppType0 s (t, C_COMMA); PP.string s ","; PP.space s 1; loop tl) in PP.openHVBox s (PP.Rel 2); PP.string s "{ "; loop tl; PP.string s " }"; PP.closeBox s end | ppType0 s (CON (k, []), _) = PP.string s k | ppType0 s (CON (k, [t]), _) = (PP.openHBox s; ppType0 s (t, C_CON); PP.space s 1; PP.string s k; PP.closeBox s) | ppType0 s (CON (k, tl), _) = let fun loop [] = () (* cannot happen *) | loop [t] = ppType0 s (t, C_COMMA) | loop (h :: tl) = (ppType0 s (h, C_COMMA); PP.string s ","; PP.space s 1; loop tl) in PP.openHBox s; PP.openHVBox s (PP.Rel 1); PP.string s "("; loop tl; PP.string s ")"; PP.closeBox s; PP.space s 1; PP.string s k; PP.closeBox s end (* start with comma context *) fun ppType s t = ppType0 s (simplify t, C_COMMA) fun ppType' s (t, c) = ppType0 s (simplify t, c) datatype mlexp = ETUPLE of mlexp list | ERECORD of (string * mlexp) list | EVAR of string | EAPP of mlexp * mlexp | ECONSTR of mlexp * mltype | ESEQ of mlexp * mlexp | EPRIM of string * mltype | ELET of (string * mlexp) list * mlexp datatype econtext = EC_APP | EC_COMMA fun ppExp0 s (ETUPLE [], _) = PP.string s "()" | ppExp0 s (ETUPLE [x], c) = ppExp0 s (x, c) | ppExp0 s (ETUPLE xl, _) = let fun loop [] = () | loop [x] = ppExp0 s (x, EC_COMMA) | loop (x :: xl) = (ppExp0 s (x, EC_COMMA); PP.string s ","; PP.space s 1; loop xl) in PP.openHVBox s (PP.Rel 1); PP.string s "("; loop xl; PP.string s ")"; PP.closeBox s end | ppExp0 s (ERECORD [], _) = PP.string s "{}" | ppExp0 s (ERECORD xl, _) = let fun loop [] = () | loop [(n, x)] = (PP.string s (n ^ " ="); PP.space s 1; ppExp0 s (x, EC_COMMA)) | loop ((n, x) :: xl) = (PP.string s (n ^ " ="); PP.space s 1; ppExp0 s (x, EC_COMMA); PP.string s ","; PP.space s 1; loop xl) in PP.openHVBox s (PP.Rel 2); PP.string s "{ "; loop xl; PP.string s " }"; PP.closeBox s end | ppExp0 s (EVAR v, _) = PP.string s v | ppExp0 s (EAPP (x, y), c) = let fun loop (EAPP (x, y)) = (loop x; ppExp0 s (y, EC_APP); PP.space s 1) | loop x = (ppExp0 s (x, EC_APP); PP.space s 1; PP.openHOVBox s (PP.Rel 0)) val paren = c = EC_APP in PP.openHOVBox s (PP.Abs 4); if paren then PP.string s "(" else (); loop x; ppExp0 s (y, EC_APP); if paren then PP.string s ")" else (); PP.closeBox s; PP.closeBox s end | ppExp0 s (ECONSTR (x, t), c) = let val paren = c = EC_APP val indent = if paren then 5 else 4 val tc = if paren then C_CON else C_COMMA in PP.openHOVBox s (PP.Rel indent); if paren then PP.string s "(" else (); ppExp0 s (x, c); PP.nbSpace s 1; PP.string s ":"; PP.space s 1; ppType' s (t, tc); if paren then PP.string s ")" else (); PP.closeBox s end | ppExp0 s (ESEQ (x, y), c) = let in PP.string s "("; PP.openHVBox s (PP.Rel 0); ppExp0 s (x, EC_COMMA); PP.string s ";"; PP.space s 1; ppExp0 s (y, EC_COMMA); PP.string s ")"; PP.closeBox s end | ppExp0 s (EPRIM (p, t), c) = let val paren = c = EC_APP val indent = if paren then 5 else 4 val tc = if paren then C_CON else C_COMMA in PP.openHOVBox s (PP.Rel indent); if paren then PP.string s "(" else (); PP.string s p; PP.nbSpace s 1; PP.string s ":"; PP.space s 1; ppType' s (t, tc); PP.string s ";"; if paren then PP.string s ")" else (); PP.closeBox s end | ppExp0 s (ELET ([], e), c) = ppExp0 s (e, c) | ppExp0 s (ELET (bnds, e), c) = let fun loop [] = () | loop ((v, e) :: bnds) = (PP.newline s; PP.openHOVBox s (PP.Abs 4); PP.string s "val"; PP.nbSpace s 1; PP.string s v; PP.nbSpace s 1; PP.string s "="; PP.space s 1; ppExp0 s (e, EC_COMMA); PP.closeBox s; loop bnds) in PP.string s "let"; PP.openVBox s (PP.Abs 4); loop bnds; PP.closeBox s; PP.newline s; PP.string s "in"; PP.openVBox s (PP.Abs 4); PP.newline s; ppExp0 s (e, EC_COMMA); PP.closeBox s; PP.newline s; PP.string s "end" end fun ppExp s x = ppExp0 s (x, EC_COMMA) fun ppExp' s x = ppExp0 s (x, EC_APP) fun ppFun s (name, args, body) = (PP.openHOVBox s (PP.Rel 4); PP.string s ("fun " ^ name); PP.nbSpace s 1; app (fn a => (ppExp' s a; PP.space s 1)) args; PP.string s "="; PP.nbSpace s 1; PP.openBox s (PP.Rel 0); ppExp s body; PP.closeBox s; PP.closeBox s) end mlton-20100608/mlnlffigen/README0000644000076600000240000004327111404435621014567 0ustar mtfstaffCopyright (c) 2001, 2002, Lucent Technologies, Bell Laboratories author: Matthias Blume (blume@research.bell-labs.com) This directory contains ML-NLFFI-Gen, a glue-code generator for the new "NLFFI" foreign function interface. The generator reads C source code and emits ML code along with a description file for CM. Compiling this generator requires the C-Kit ($/ckit-lib.cm) to be installed. --------------------------------------------------------------------- February 21, 2002: Major changes: I reworked the glue code generator in a way that lets generated code scale better -- at the expense of some (mostly academic) generality. Changes involve the following: 1. The functorization is gone. 2. Every top-level C declaration results in a separate top-level ML equivalent (implemented by its own ML source file). 3. Incomplete pointer types are treated just like their complete versions -- the only difference being that no RTTI will be available for them. In the "light" interface, this rules out precisely those operations over them that C would disallow. 4. All related C sources must be supplied to ml-nlffigen together. Types incomplete in one source but complete in another get automatically completed in a cross-file fashion. 5. The handle for the shared library to link to is now abstracted as a function closure. Moreover, it must be supplied as a top-level variable (by the programmer). For this purpose, ml-nlffigen has corresponding command-line options. These changes mean that even very large (in number of exported definitions) libraries such as, e.g., GTK can now be handled gracefully without reaching the limits of the ML compiler's abilities. [The example of GTK -- for which ml-nlffigen creates several thousands (!) of separate ML source files -- puts an unusal burden on CM, though. However, aside from running a bit longer than usual, CM handles loads of this magnitute just fine. Stabilizing the resulting library solves the problem entirely as far as later clients are concerned.] Sketch of translation- (and naming-) scheme: struct foo { ... } --> structure ST_foo in st-foo.sml (not exported) basic type info (name, size) & structure S_foo in s-foo.sml abstract interface to the type field accessors f_xxx (unless -light) and f_xxx' (unless -heavy) field types t_f_xxx field RTTI typ_f_xxx & (unless "-nosucvt" was set) structures IS_foo in /is-foo.sml (see discussion of struct *foo below) union foo { ... } --> structure UT_foo in ut-foo.sml (not exported) basic type info (name, size) & structure U_foo in u-foo.sml abstract interface to the type field accessors f_xxx (unless -light) and f_xxx' (unless -heavy) field types t_f_xxx field RTTI typ_f_xxx & (unless "-nosucvt" was set) structures IU_foo in /iu-foo.sml (see discussion of union *foo below) struct { ... } like struct { ... }, where is a fresh integer or 'bar if 'struct { ... }' occurs in the context of a 'typedef struct { ... } bar' union { ... } like union { ... }, where is a fresh integer or 'bar if 'union { ... }' occurs in the context of a 'typedef union { ... } bar' enum foo { ... } --> structure E_foo in e-foo.sml external type mlrep with enum constants e_xxx conversion functions between tag enum and mlrep between mlrep and sint access functions (get/set) that operate on mlrep (as an alternative to C.Get.enum/C.Set.enum which operate on sint) If the command-line optino "-ec" ("-enum-constructors") was set and the values of all enum constants are different from each other, then mlrep will be a datatype (thus making it possible to pattern-match). enum { ... } If this construct appears in the context of a surrounding (non-anonymous) struct or union or typedef, the enumeration gets assigned an artificial tag (just like similar structs and unions, see above). Unless the command-line option "-nocollect" was specified, then all constants in other (truly) unnamed enumerations will be collected into a single enumeration represented by structure E_'. This single enumeration is then treated like a regular enumeration (including handling of "-ec" -- see above). The default behavior ("collect") is to assign a fresh integer tag (again, just like in the struct/union case). T foo (T, ..., T) (global function/function prototype) --> structure F_foo in f-foo.sml containing three/four members: typ : RTTI fptr: thunkified fptr representing the C function maybe f' : light-weight function wrapper around fptr Turned off by -heavy (see below). maybe f : heavy-weight function wrapper around fptr Turned off by -light (see below). T foo; (global variable) --> structure G_foo in g-foo.sml containing three members: t : type typ : RTTI obj : thunkified object representing the C variable struct foo * (without existing definition of struct foo; incomplete type) --> an internal structure ST_foo with a type "tag" (just like in the struct foo { ... } case) The difference is that no structure S_foo will be generated, so there is no field-access interface and no RTTI (size or typ) for this. All "light-weight" functions referring to this pointer type will be generated, heavy-weight functions will be generated only if they do not require access to RTTI. If "-heavy" was specified but a heavy interface function cannot be generated because of incomplete types, then its light counterpart will be issued generated anyway. union foo * Same as with struct foo *, but replace S_foo with U_foo and ST_foo with UT_foo. Additional files for implementing function entry sequences are created and used internally. They do not contribute exports, though. Command-line options for ml-nlffigen: General syntax: ml-nlffigen output directory where all generated files are placed -d default: "NLFFI-Generated" -allSU instructs ml-nlffigen to include all structs and unions, even those that are defined in included files (as opposed to files explicitly listed as arguments) default: off -width sets output line width (just a guess) to -w default: 75 -smloption instructs ml-nlffigen to include into the list of options to annotate .sml entries in the generated .cm file with. By default, the list consists just of "noguid". -guid Removes the default "noguid" from the list of sml options. (This re-enables strict handling of type- and object-identity but can have negative impact on CM cutoff recompilation performance if the programmer routinely removes the entire tree of ml-nlffigen-generated files during development.) (* -lambdasplit instructs ml-nlffigen to generate "lambdasplit" -ls options for all ML files (see CM manual for what this means; it does not currently work anyway because cross-module inlining is broken). default: nothing *) -target Sets the target to (which must be one of "sparc-unix", -t "x86-unix", or "x86-win32"). default: current architecture -light suppress "heavy" versions of function wrappers and -l field accessors; also resets any earlier -heavy to default default: not suppressed -heavy suppress "light" versions of function wrappers and -h field accessors; also resets any earlier -light to default default: not suppressed -namedargs instruct ml-nlffigen to generated function wrappers that -na use named arguments (ML records) instead of tuples if there is enough information for this in the C source; (this is not always very useful) default: off -nocollect Do not do the following: Collect enum constants from truly unnamed enumerations (those without tags that occur at toplevel or in an unnamed context, i.e., not in a typedef or another named struct or union) into a single artificial enumeration tagged by ' (single apostrohe). The corresponding ML-side representative will be a structure named E_'. -enum-constructors -ec When possible (i.e., if all values of a given enumeration are different from each other), make the ML representation type of the enumeration a datatype. The default (and fallback) is to make that type the same as MLRep.Signed.int. -libhandle Use the variable to refer to the handle to the -lh shared library object. Given the constraints of CM, must have the form of a long ML identifier, e.g., MyLibrary.libhandle. default: Library.libh -include Mention file in the generated .cm file. This option -add is necessary at least once for providing the library handle. It can be used arbitrarily many times, resulting in more than one such programmer-supplied file to be mentioned. If is relative, then it must be relative to the directory specified in the -dir option. -cmfile Specify name of the generated .cm file, relative to -cm the directory specified by the -dir option. default: nlffi-generated.cm -cppopt The string gets added to the list of options to be passed to cpp (the C preprocessor). The list of options gets substituted for %o in the cpp command line template. -U The string -U gets added to the list of cpp options. -D The string -D gets added to the list of cpp options. -I The string -I gets added to the list of cpp options. -version Just write the version number of ml-nlffigen to standard output and then quit. -match Normally ml-nlffigen will include ML definitions for a C -m declaration if the C declaration textually appears in one of the files specified at the command line. Definitions in #include-d files will normally not appear (unless their absence would lead to inconsistencies). By specifying -match , ml-nlffigen will also include definitions that occur in recursively #include-d files for which the AWK-style regular expression matches their names. -prefix

Generated ML structure names will all have prefix

-p

(in addition to the usual "S_" or "U_" or "F_" ...) -gensym Names "gensym-ed" by ml-nlffigen (for anonymous struct/union/ -g enums) will get an additional suffix _. (This should be used if output from several indepdendent runs of ml-nlffigen are to coexist in the same ML program.) -- Terminate processing of options, remaining arguments are taken to be C sources. ---------------------------------------------------------------------- Sample usage: Suppose we have a C interface defined in foo.h. 1. Running ml-nlffigen: It is best to let a tool such as Unix' "make" handle the invocation of ml-nlffigen. The following "Makefile" can be used as a template for other projects: +---------------------------------------------------------- |FILES = foo.h |H = FooH.libh |D = FFI |HF = ../foo-h.sml |CF = foo.cm | |$(D)/$(CF): $(FILES) | ml-nlffigen -include $(HF) -libhandle $(H) -dir $(D) -cmfile $(CF) $^ +---------------------------------------------------------- Suppose the above file is stored as "foo.make". Running $ make -f foo.make will generate a subdirectory "FFI" full of ML files corresponding to the definitions in foo.h. Access to the generated ML code is gained by refering to the CM library FFI/foo.cm; the .cm-file (foo.cm) is also produced by ml-nlffigen. 2. The ML code uses the library handle specified in the command line (here: FooH.libh) for dynamic linking. The type of FooH.libh must be: FooH.libh : string -> unit -> CMemory.addr That is, FooH.libh takes the name of a symbol and produces that symbol's suspended address. The code that implements FooH.libh must be provided by the programmer. In the above example, we assume that it is stored in file foo-h.sml. The name of that file must appear in the generated .cm-file, hence the "-include" command-line argument. Notice that the name provided to ml-nlffigen must be relative to the output directory. Therefore, in our case it is "../foo-h.sml" and not just foo-h.sml (because the full path would be FFI/../foo-h.sml). 3. To actually implement FooH.libh, use the "DynLinkage" module. Suppose the shared library's name is "/usr/lib/foo.so". Here is the corresponding contents of foo-h.sml: +------------------------------------------------------------- |structure FooH = struct | local | val lh = DynLinkage.open_lib | { name = "/usr/lib/foo.so", global = true, lazy = true } | in | fun libh s = let | val sh = DynLinkage.lib_symbol (lh, s) | in | fn () => DynLinkage.addr sh | end | end |end +------------------------------------------------------------- If all the symbols you are linking to are already available within the ML runtime system, then you don't need to open a new shared object. As a result, your FooH implementation would look like this: +------------------------------------------------------------- |structure FooH = struct | fun libh s = let | val sh = DynLinkage.lib_symbol (DynLinkage.main_lib, s) | in | fn () => DynLinkage.addr sh | end |end +------------------------------------------------------------- If the symbols your are accessing are strewn across several separate shared objects, then there are two possible solutions: a) Open several shared libraries and perform a trial-and-error search for every symbol you are looking up. (The DynLinkage module raises an exception (DynLinkError of string) if the lookup fails. This could be used to daisy-chain lookup operations.) [Be careful: Sometimes there are non-obvious inter-dependencies between shared libraries. Consider using DynLinkage.open_lib' to express those.] b) A simpler and more robust way of accessing several shared libraries is to create a new "summary" library object at the OS level. Supposed you are trying to access /usr/lib/foo.so and /usr/lib/bar.so. The solution is to make a "foobar.so" object by saying: $ ld -shared -o foobar.so /usr/lib/foo.so /usr/lib/bar.so The ML code then referes to foobar.so and the Linux dynamic loader does the rest. 4. To put it all together, let's wrap it up in a .cm-file. For example, if we simply want to directly make the ml-nlffigen-generated definitions available to the "end user", we could write this wrapper .cm-file (let's call it foo.cm): +------------------------------------------------------------- |library | library(FFI/foo.cm) |is | $/basis.cm | $/c.cm | FFI/foo.cm : make (-f foo.make) +------------------------------------------------------------- Now, saying $ sml -m foo.cm is all one need's to do in order to compile. (CM will automatically invoke "make", so you don't have to run "make" separately.) If the goal is not to export the "raw" ml-nlffigen-generated stuff but rather something more nicely "wrapped", consider writing wrapper ML code. Suppose you have wrapper definitions for structure Foo_a and structure Foo_b with code for those in wrap-foo-a.sml and wrap-foo-b.sml. In this case the corresponding .cm-file would look like the following: +------------------------------------------------------------- |library | structure Foo_a | structure Foo_b |is | $/basis.cm | $/c.cm | FFI/foo.cm : make (-f foo.make) | wrapper-foo-a.sml | wrapper-foo-b.sml +------------------------------------------------------------- mlton-20100608/mlnlffigen/README.mlton0000644000076600000240000000050411404435621015707 0ustar mtfstaffThis is a (heavily) modified version of the ml-nlffigen directory that comes with SML/NJ version 110.52. The sources have been modified to generate MLNLFFI Library clients that are compatible with MLton's native FFI. At the current time, functions with struct/union arguments are not supported. mfluet@acm.org 2005-02-12 mlton-20100608/mlnlffigen/sets-and-maps.sml0000644000076600000240000000313211404435621017070 0ustar mtfstaff(*************************************************************************) (* string-key.sml * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure StringKey = struct type ord_key = string val compare = String.compare end (*************************************************************************) (* string-set.sml * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure StringSet = RedBlackSetFn (StringKey) (*************************************************************************) (* string-map.sml * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure StringMap = RedBlackMapFn (StringKey) (*************************************************************************) structure IntListKey = struct type ord_key = int list val compare = List.collate Int.compare end (*************************************************************************) (* intlist-map.sml * * (C) 2002, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure IntListMap = RedBlackMapFn (IntListKey) (*************************************************************************) structure LargeIntKey = struct type ord_key = LargeInt.int val compare = LargeInt.compare end (*************************************************************************) structure LargeIntSet = RedBlackSetFn (LargeIntKey) (*************************************************************************) mlton-20100608/mlnlffigen/sizes-amd64.sml0000644000076600000240000000142511404435621016465 0ustar mtfstaff(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesAMD64 = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 64, align = 64}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 64}, longdouble = {bits = 128, align = 128}, pointer = {bits = 64, align = 64}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20100608/mlnlffigen/sizes-hppa.sml0000644000076600000240000000142311404435621016500 0ustar mtfstaff(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesHPPA = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 32, align = 32}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 64}, longdouble = {bits = 128, align = 64}, pointer = {bits = 32, align = 32}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20100608/mlnlffigen/sizes-ia64.sml0000644000076600000240000000142411404435621016314 0ustar mtfstaff(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesIA64 = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 64, align = 64}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 64}, longdouble = {bits = 128, align = 128}, pointer = {bits = 64, align = 64}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20100608/mlnlffigen/sizes-powerpc64.sml0000644000076600000240000000143011404435622017400 0ustar mtfstaff(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesPowerPC64 = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 64, align = 64}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 32}, longdouble = {bits = 64, align = 32}, pointer = {bits = 64, align = 64}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20100608/mlnlffigen/sizes-ppc.sml0000644000076600000240000000142111404435621016330 0ustar mtfstaff(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesPPC = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 32, align = 32}, longlong = {bits = 64, align = 32}, float = {bits = 32, align = 32}, double = {bits = 64, align = 32}, longdouble = {bits = 64, align = 32}, pointer = {bits = 32, align = 32}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20100608/mlnlffigen/sizes-sparc.sml0000644000076600000240000000142411404435621016661 0ustar mtfstaff(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesSparc = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 32, align = 32}, longlong = {bits = 64, align = 64}, float = {bits = 32, align = 32}, double = {bits = 64, align = 64}, longdouble = {bits = 128, align = 64}, pointer = {bits = 32, align = 32}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20100608/mlnlffigen/sizes-x86.sml0000644000076600000240000000142111404435621016173 0ustar mtfstaff(* This file was automatically generated using size.c. * It contains information about c data sizes and layout. * Limitations: * 1. write proper test for bitFieldAlignment. * 2. include date and system information in this file? *) structure SizesX86 = struct val sizes = { (*** all sizes in bits ***) char = {bits = 8, align = 8}, short = {bits = 16, align = 16}, int = {bits = 32, align = 32}, long = {bits = 32, align = 32}, longlong = {bits = 64, align = 32}, float = {bits = 32, align = 32}, double = {bits = 64, align = 32}, longdouble = {bits = 96, align = 32}, pointer = {bits = 32, align = 32}, min_struct = {bits = 8, align = 8}, min_union = {bits = 8, align = 8}, onlyPackBitFields = false, ignoreUnnamedBitFieldAlignment = true } end mlton-20100608/mlnlffigen/sizes.sml0000644000076600000240000000114311404435621015551 0ustar mtfstaffstructure Sizes = struct type t = {char: {bits: int, align: int}, short: {bits: int, align: int}, int: {bits: int, align: int}, long: {bits: int, align: int}, longlong: {bits: int, align: int}, float: {bits: int, align: int}, double: {bits: int, align: int}, longdouble: {bits: int, align: int}, pointer: {bits: int, align: int}, min_struct: {bits: int, align: int}, min_union: {bits: int, align: int}, onlyPackBitFields: bool, ignoreUnnamedBitFieldAlignment: bool} endmlton-20100608/mlnlffigen/sources.mlb0000644000076600000240000000273411404435621016065 0ustar mtfstaff(* Copyright (C) 2005-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local basis basis_lib = bas $(SML_LIB)/basis/basis.mlb end basis mlton_lib = bas ../lib/mlton/sources.mlb end basis smlnj_lib = bas $(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb end basis pp_lib = bas $(SML_LIB)/smlnj-lib/PP/pp-lib.mlb end basis regexp_lib = bas $(SML_LIB)/smlnj-lib/RegExp/regexp-lib.mlb end basis ckit_lib = bas $(SML_LIB)/ckit-lib/src/ckit-lib.mlb end local open basis_lib in endian.sml endian-big.sml endian-little.sml sizes-amd64.sml sizes-hppa.sml sizes-ia64.sml sizes-ppc.sml sizes-powerpc64.sml sizes-sparc.sml sizes-x86.sml end cppcmd.sml local open basis_lib pp_lib in cpif-dev.sml pp.sml end local open mlton_lib ckit_lib in control.sig control.sml end local open basis_lib in spec.sml end local open basis_lib smlnj_lib sets-and-maps.sml in structure IntListMap structure IntMap = IntRedBlackMap structure LargeIntSet structure StringMap structure StringSet end local open basis_lib ckit_lib in ast-to-spec.sml hash.sml end local open mlton_lib ckit_lib in gen.sml end local open mlton_lib regexp_lib in main.sml end in structure Main end mlton-20100608/mlnlffigen/spec.sml0000644000076600000240000000610511404435621015351 0ustar mtfstaff(* spec.sml * 2005 Matthew Fluet (mfluet@acm.org) * Adapted for MLton. *) (* * spec.sml - A data structure describing the export interface of a * C program. * * (C) 2001, Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) structure Spec = struct datatype constness = RO | RW type tag = string datatype basic_ctype = SCHAR | UCHAR | SSHORT | USHORT | SINT | UINT | SLONG | ULONG | SLONGLONG | ULONGLONG | FLOAT | DOUBLE datatype ctype = BASIC of basic_ctype | VOIDPTR | STRUCT of tag | UNION of tag | ENUM of tag * bool | FPTR of cft | PTR of cobj | ARR of { t: ctype, d: int, esz: int } | UNIMPLEMENTED of string withtype cft = { args: ctype list, res: ctype option } and cobj = constness * ctype datatype fieldspec = OFIELD of { offset: int, spec: cobj, synthetic: bool } | SBF of { offset: int, constness: constness, bits: word, shift: word } | UBF of { offset: int, constness: constness, bits: word, shift: word } type field = { name: string, spec: fieldspec } type s = { src: string, tag: tag, anon: bool, size: word, fields: field list, exclude: bool } type u = { src: string, tag: tag, anon: bool, size: word, all: field list, exclude: bool } type gty = { src: string, name: string, spec: ctype } type gvar = { src: string, name: string, spec: cobj } type gfun = { src: string, name: string, spec: cft, argnames: string list option } type enumval = { name: string, spec: LargeInt.int } type enum = { src: string, tag: tag, anon: bool, descr: string, spec: enumval list, exclude: bool } type spec = { structs: s list, unions: u list, gtys: gty list, gvars: gvar list, gfuns: gfun list, enums: enum list } fun join (x: spec, y: spec) = let fun uniq sel = let fun loop ([], a) = rev a | loop (h :: t, a) = loop (t, if List.exists (fn x => (sel x : string) = sel h) a then a else h :: a) in loop end in { structs = uniq #tag (#structs x, #structs y), unions = uniq #tag (#unions x, #unions y), gtys = uniq #name (#gtys x, #gtys y), gvars = uniq #name (#gvars x, #gvars y), gfuns = uniq #name (#gfuns x, #gfuns y), enums = uniq #tag (#enums x, #enums y) } : spec end val empty : spec = { structs = [], unions = [], gtys = [], gvars = [], gfuns = [], enums = [] } end mlton-20100608/mlprof/0000755000076600000240000000000011404470407013057 5ustar mtfstaffmlton-20100608/mlprof/.ignore0000644000076600000240000000006411404435631014343 0ustar mtfstaff*.call-graph.dot *.ssa mlprof mlprof.exe mlprof.sml mlton-20100608/mlprof/call-main.sml0000644000076600000240000000041711404435631015433 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20100608/mlprof/main.sml0000644000076600000240000012031711404435631014524 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Main : sig val main : unit -> unit end = struct type int = Int.t type word = Word.t val debug = false val callGraphFile: File.t option ref = ref NONE val gray: bool ref = ref false val longName: bool ref = ref true val mlmonFiles: string list ref = ref [] val raw = ref false val showLine = ref false val splitReg: Regexp.t ref = ref Regexp.none val title: string option ref = ref NONE val tolerant: bool ref = ref false structure Source = struct datatype t = NamePos of {name: string, pos: string} | Simple of string fun toString n = case n of NamePos {name, pos} => concat [name, " ", pos] | Simple s => s fun toStringMaybeLine n = case n of NamePos {name, pos} => if !showLine then concat [name, " ", pos] else name | Simple s => s val layout = Layout.str o toString fun fromString s = case String.tokens (s, fn c => Char.equals (c, #"\t")) of [s] => Simple s | [name, pos] => let val name = if !longName then name else List.last (String.tokens (name, fn c => Char.equals (c, #"."))) in NamePos {name = name, pos = pos} end | _ => Error.bug "strange source" fun toDotLabel s = case s of NamePos {name, pos} => if !showLine then [(name, Dot.Center), (pos, Dot.Center)] else [(name, Dot.Center)] | Simple s => [(s, Dot.Center)] end structure Graph = DirectedGraph local open Graph in structure Edge = Edge structure Node = Node end local open Dot in structure EdgeOption = EdgeOption structure NodeOption = NodeOption end structure AFile = struct datatype t = T of {callGraph: unit Graph.t, magic: word, master: {isSplit: bool, source: Source.t} vector, name: string, split: {masterIndex: int, node: unit Node.t} vector} fun layout (T {magic, name, master, ...}) = Layout.record [("name", String.layout name), ("magic", Word.layout magic), ("master", Vector.layout (fn {isSplit, source} => Layout.record [("isSplit", Bool.layout isSplit), ("source", Source.layout source)]) master)] fun new {afile: File.t}: t = let fun userBug m = Error.bug (concat ["Error: executable '", afile, "' ", m, "."]) in if not (File.doesExist afile) then userBug "does not exist" else if not (File.canRun afile) then userBug "does not run" else Process.callWithIn (OS.Path.mkAbsolute {path = afile, relativeTo = OS.FileSys.getDir ()}, ["@MLton", "show-sources"], fn ins => let fun line () = case In.inputLine ins of NONE => Error.bug "unexpected end of show-sources data" | SOME l => l val magic = case Word.fromString (line ()) of NONE => Error.bug "expected magic" | SOME w => w fun vector (f: string -> 'a): 'a vector = Vector.tabulate (valOf (Int.fromString (line ())), fn _ => f (line ())) val rc = Regexp.compileNFA (!splitReg) val master = vector (fn s => let val source = Source.fromString (String.dropSuffix (s, 1)) val isSplit = Regexp.Compiled.matchesPrefix (rc, Source.toString source) in {isSplit = isSplit, source = source} end) val _ = if 0 = Vector.length master then userBug "is not compiled for profiling" else () val sources = vector (fn s => case String.tokens (s, Char.isSpace) of [masterIndex, successorsIndex] => {masterIndex = valOf (Int.fromString masterIndex), successorsIndex = valOf (Int.fromString successorsIndex)} | _ => Error.bug "AFile.new") val sourceSeqs = vector (fn s => Vector.fromListMap (String.tokens (s, Char.isSpace), fn s => valOf (Int.fromString s))) val graph = Graph.new () val split = Vector.map (sources, fn {masterIndex, ...} => let val n = Graph.newNode graph in {masterIndex = masterIndex, node = n} end) val _ = Vector.foreach2 (sources, split, fn ({successorsIndex, ...}, {node = from, ...}) => Vector.foreach (Vector.sub (sourceSeqs, successorsIndex), fn to => (ignore o Graph.addEdge) (graph, {from = from, to = #node (Vector.sub (split, to))}))) val _ = case In.inputLine ins of NONE => () | SOME _ => Error.bug "expected end of file" in T {callGraph = graph, magic = magic, master = master, name = afile, split = split} end) end end structure Kind = struct datatype t = Alloc | Count | Empty | Time val toString = fn Alloc => "Alloc" | Count => "Count" | Empty => "Empty" | Time => "Time" val layout = Layout.str o toString val merge: t * t -> t = fn (k, k') => case (k, k') of (Alloc, Alloc) => Alloc | (Count, Count) => Count | (_, Empty) => k | (Empty, _) => k' | (Time, Time) => Time | _ => Error.bug "Kind.merge" end structure Style = struct datatype t = Current | Stack (* val toString = fn Current => "Current" | Stack => "Stack" *) (* val layout = Layout.str o toString *) end structure Counts = struct datatype t = Current of {master: IntInf.t vector, split: IntInf.t vector} | Empty | Stack of {master: {current: IntInf.t, stack: IntInf.t, stackGC: IntInf.t} vector, split: {current: IntInf.t, stack: IntInf.t, stackGC: IntInf.t} vector} val layout = fn Current {master, split} => Layout.record [("master", Vector.layout IntInf.layout master), ("split", Vector.layout IntInf.layout split)] | Empty => Layout.str "empty" | Stack {master, split} => let fun lay v = Vector.layout (fn {current, stack, stackGC} => Layout.record [("current", IntInf.layout current), ("stack", IntInf.layout stack), ("stackGC", IntInf.layout stackGC)]) v in Layout.record [("master", lay master), ("split", lay split)] end fun merge (c: t, c': t): t = case (c, c') of (Current {master = m, split = s}, Current {master = m', split = s'}) => let fun merge (v, v') = Vector.map2 (v, v', op +) in Current {master = merge (m, m'), split = merge (s, s')} end | (Empty, _) => c' | (_, Empty) => c | (Stack {master = m, split = s}, Stack {master = m', split = s'}) => let fun merge (v, v') = Vector.map2 (v, v', fn ({current = c, stack = s, stackGC = g}, {current = c', stack = s', stackGC = g'}) => {current = c + c', stack = s + s', stackGC = g + g'}) in Stack {master = merge (m, m'), split = merge (s, s')} end | _ => Error.bug "cannot merge -profile-stack false with -profile-stack true" end structure ProfFile = struct datatype t = T of {counts: Counts.t, kind: Kind.t, magic: word, total: IntInf.t, totalGC: IntInf.t} fun empty (AFile.T {magic, ...}) = T {counts = Counts.Empty, kind = Kind.Empty, magic = magic, total = 0, totalGC = 0} fun layout (T {counts, kind, magic, total, totalGC}) = Layout.record [("kind", Kind.layout kind), ("magic", Word.layout magic), ("total", IntInf.layout total), ("totalGC", IntInf.layout totalGC), ("counts", Counts.layout counts)] fun new {mlmonfile: File.t}: t = File.withIn (mlmonfile, fn ins => let fun line () = case In.inputLine ins of NONE => Error.bug "unexpected end of mlmon file" | SOME s => String.dropSuffix (s, 1) val _ = if "MLton prof" = line () then () else Error.bug "bad header" val kind = case line () of "alloc" => Kind.Alloc | "count" => Kind.Count | "time" => Kind.Time | _ => Error.bug "invalid profile kind" val style = case line () of "current" => Style.Current | "stack" => Style.Stack | _ => Error.bug "invalid profile style" val magic = case Word.fromString (line ()) of NONE => Error.bug "invalid magic" | SOME w => w fun s2i s = case IntInf.fromString s of NONE => Error.bug "invalid count" | SOME i => i val (total, totalGC) = case String.tokens (line (), Char.isSpace) of [total, totalGC] => (s2i total, s2i totalGC) | _ => Error.bug "invalid totals" fun getCounts (f: string -> 'a): {master: 'a vector, split: 'a vector} = let fun vector () = Vector.tabulate (valOf (Int.fromString (line ())), fn _ => f (line ())) val split = vector () val master = vector () in {master = master, split = split} end val counts = case style of Style.Current => Counts.Current (getCounts s2i) | Style.Stack => Counts.Stack (getCounts (fn s => case String.tokens (s, Char.isSpace) of [c, s, sGC] => {current = s2i c, stack = s2i s, stackGC = s2i sGC} | _ => Error.bug (concat ["strange line: ", String.dropSuffix (s, 1)]))) in T {counts = counts, kind = kind, magic = magic, total = total, totalGC = totalGC} end) fun merge (T {counts = c, kind = k, magic = m, total = t, totalGC = g}, T {counts = c', kind = k', magic = m', total = t', totalGC = g'}): t = if m <> m' then Error.bug "wrong magic number" else T {counts = Counts.merge (c, c'), kind = Kind.merge (k, k'), magic = m, total = t + t', totalGC = g + g'} end structure Atomic = struct datatype t = Name of string * Regexp.Compiled.t | Thresh of real | ThreshGC of real | ThreshStack of real val toSexp: t -> Sexp.t = fn a => let datatype z = datatype Sexp.t in case a of Name (s, _) => String s | Thresh x => List [Atom "thresh", Atom (Real.toString x)] | ThreshGC x => List [Atom "thresh-gc", Atom (Real.toString x)] | ThreshStack x => List [Atom "thresh-stack", Atom (Real.toString x)] end end structure NodePred = struct datatype t = All | And of t vector | Atomic of Atomic.t | Not of t | Or of t vector | PathFrom of t | PathTo of t | Pred of t | Succ of t val rec toSexp: t -> Sexp.t = fn p => let datatype z = datatype Sexp.t fun nAry (name, ps) = List (Atom name :: Vector.toListMap (ps, toSexp)) fun unary (name, p) = List [Atom name, toSexp p] in case p of All => Sexp.Atom "all" | And ps => nAry ("and", ps) | Atomic a => Atomic.toSexp a | Not p => unary ("not", p) | Or ps => nAry ("or", ps) | PathFrom p => unary ("from", p) | PathTo p => unary ("to", p) | Pred p => unary ("pred", p) | Succ p => unary ("succ", p) end (* val layout = Sexp.layout o toSexp *) val fromString: string -> t = fn s => case Sexp.fromString s of Sexp.Eof => Error.bug "empty" | Sexp.Error s => Error.bug s | Sexp.Sexp s => let fun parse (s: Sexp.t): t = let fun err () = Error.bug (Sexp.toString s) in case s of Sexp.Atom s => (case s of "all" => All | _ => err ()) | Sexp.List ss => (case ss of [] => err () | s :: ss => let fun nAry f = f (Vector.fromListMap (ss, parse)) fun unary f = case ss of [s] => f (parse s) | _ => err () fun thresh f = case ss of [Sexp.Atom x] => (case Real.fromString x of NONE => err () | SOME x => if 0.0 <= x andalso x <= 100.0 then Atomic (f x) else err ()) | _ => err () datatype z = datatype Atomic.t in case s of Sexp.Atom s => (case s of "and" => nAry And | "from" => unary PathFrom | "not" => unary Not | "or" => nAry Or | "pred" => unary Pred | "succ" => unary Succ | "thresh" => thresh Thresh | "thresh-gc" => thresh ThreshGC | "thresh-stack" => thresh ThreshStack | "to" => unary PathTo | _ => err ()) | _ => err () end) | Sexp.String s => (case Regexp.fromString s of NONE => err () | SOME (r, _) => Atomic (Atomic.Name (s, Regexp.compileNFA r))) end in parse s end fun nodes (p: t, g: 'a Graph.t, atomic: 'a Node.t * Atomic.t -> bool): 'a Node.t vector = let val {get = nodeIndex: 'a Node.t -> int, set = setNodeIndex, ...} = Property.getSet (Node.plist, Property.initRaise ("index", Node.layout)) val nodes = Vector.fromList (Graph.nodes g) val numNodes = Vector.length nodes val _ = Vector.foreachi (nodes, fn (i, n) => setNodeIndex (n, i)) val transpose = Promise.lazy (fn () => let val {get = nodeIndex': 'a Graph.u Node.t -> int, set = setNodeIndex, ...} = Property.getSet (Node.plist, Property.initRaise ("index", Node.layout)) val (transpose, {newNode, ...}) = Graph.transpose g val _ = Graph.foreachNode (g, fn n => setNodeIndex (newNode n, nodeIndex n)) in (transpose, newNode, nodeIndex') end) fun vectorToNodes (v: bool vector): 'a Node.t vector = Vector.keepAllMapi (v, fn (i, b) => if b then SOME (Vector.sub (nodes, i)) else NONE) val all = Promise.lazy (fn () => Vector.tabulate (numNodes, fn _ => true)) val none = Promise.lazy (fn () => Vector.tabulate (numNodes, fn _ => false)) fun path (v: bool vector, (g: 'b Graph.t, getNode: 'a Node.t -> 'b Node.t, nodeIndex: 'b Node.t -> int)): bool vector = let val roots = vectorToNodes v val a = Array.array (numNodes, false) val _ = Graph.dfsNodes (g, Vector.toListMap (roots, getNode), Graph.DfsParam.startNode (fn n => Array.update (a, nodeIndex n, true))) in Vector.fromArray a end fun loop (p: t): bool vector = case p of All => all () | And ps => Vector.fold (ps, all (), fn (p, v) => Vector.map2 (v, loop p, fn (b, b') => b andalso b')) | Atomic a => Vector.map (nodes, fn n => atomic (n, a)) | Not p => Vector.map (loop p, not) | Or ps => Vector.fold (ps, none (), fn (p, v) => Vector.map2 (v, loop p, fn (b, b') => b orelse b')) | PathFrom p => path (loop p, (g, fn n => n, nodeIndex)) | PathTo p => path (loop p, transpose ()) | Pred p => let val ns = vectorToNodes (loop p) val {destroy, get, set, ...} = Property.destGetSetOnce (Node.plist, Property.initConst false) val _ = Vector.foreach (ns, fn n => set (n, true)) val v = Vector.map (nodes, fn n => get n orelse List.exists (Node.successors n, get o Edge.to)) val _ = destroy () in v end | Succ p => let val a = Array.array (numNodes, false) fun yes n = Array.update (a, nodeIndex n, true) val _ = Vector.foreach (vectorToNodes (loop p), fn n => (yes n ; List.foreach (Node.successors n, yes o Edge.to))) in Vector.fromArray a end val v = loop p in vectorToNodes v end end val keep: NodePred.t ref = ref NodePred.All val ticksPerSecond = 100.0 fun display (AFile.T {callGraph, master, name = aname, split, ...}, ProfFile.T {counts, kind, total, totalGC, ...}): unit = let val {get = nodeInfo: (unit Node.t -> {index: int, keep: bool ref, mayKeep: (Atomic.t -> bool) ref}), set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("info", Node.layout)) val _ = Vector.foreachi (split, fn (i, {node, ...}) => setNodeInfo (node, {index = i, keep = ref false, mayKeep = ref (fn _ => false)})) val profileStack = case counts of Counts.Current _ => false | Counts.Empty => false | Counts.Stack _ => true val totalReal = Real.fromIntInf (total + totalGC) val per: IntInf.t -> real = if Real.equals (0.0, totalReal) then fn _ => 0.0 else fn ticks => 100.0 * Real.fromIntInf ticks / totalReal fun doit ({master = masterCount: 'a vector, split = splitCount: 'a vector}, f: 'a -> {current: IntInf.t, stack: IntInf.t, stackGC: IntInf.t}) = let val _ = Vector.foreachi (split, fn (i, {masterIndex, node, ...}) => let val {mayKeep, ...} = nodeInfo node val {isSplit, source, ...} = Vector.sub (master, masterIndex) val name = Source.toString source in mayKeep := (fn a => let fun thresh (x: real, sel) = let val (v, i) = if isSplit then (splitCount, i) else (masterCount, masterIndex) in per (sel (f (Vector.sub (v, i)))) >= x end datatype z = datatype Atomic.t in case a of Name (_, rc) => Regexp.Compiled.matchesPrefix (rc, name) | Thresh x => thresh (x, #current) | ThreshGC x => thresh (x, #stackGC) | ThreshStack x => thresh (x, #stack) end) end) fun row (ticks: IntInf.t): string list = (concat [Real.format (per ticks, Real.Format.fix (SOME 1)), "%"]) :: (if !raw then [concat (case kind of Kind.Alloc => ["(", IntInf.toCommaString ticks, ")"] | Kind.Count => ["(", IntInf.toCommaString ticks, ")"] | Kind.Empty => [] | Kind.Time => ["(", Real.format (Real.fromIntInf ticks / ticksPerSecond, Real.Format.fix (SOME 2)), "s)"])] else []) fun info (source: Source.t, a: 'a) = let val {current, stack, stackGC} = f a val row = row current @ (if profileStack then row stack @ row stackGC else []) val pc = per current val isNonZero = current > 0 orelse stack > 0 orelse stackGC > 0 val tableInfo = if isNonZero orelse (kind = Kind.Count andalso (case source of Source.NamePos _ => true | _ => false)) then SOME {per = pc, row = Source.toStringMaybeLine source :: row} else NONE val nodeOptions = [Dot.NodeOption.Shape Dot.Box, Dot.NodeOption.Label (Source.toDotLabel source @ (if isNonZero then [(concat (List.separate (row, " ")), Dot.Center)] else [])), Dot.NodeOption.Color (if !gray then DotColor.gray (100 - Real.round (per stack)) else DotColor.Black)] in {nodeOptions = nodeOptions, tableInfo = tableInfo} end val masterOptions = Vector.map2 (master, masterCount, fn ({source, ...}, a) => info (source, a)) val splitOptions = Vector.map2 (split, splitCount, fn ({masterIndex, ...}, a) => info (#source (Vector.sub (master, masterIndex)), a)) in (masterOptions, splitOptions) end val (masterInfo, splitInfo) = case counts of Counts.Current ms => doit (ms, fn z => {current = z, stack = 0, stackGC = 0}) | Counts.Empty => doit ({master = Vector.new (Vector.length master, ()), split = Vector.new (Vector.length split, ())}, fn () => {current = 0, stack = 0, stackGC = 0}) | Counts.Stack ms => doit (ms, fn z => z) val keep = !keep val keepNodes = NodePred.nodes (keep, callGraph, fn (n, a) => (! (#mayKeep (nodeInfo n))) a) val _ = Vector.foreach (keepNodes, fn n => #keep (nodeInfo n) := true) (* keep a master node if it is not split and some copy of it is kept. *) val keepMaster = Array.new (Vector.length master, false) val _ = Vector.foreach (split, fn {masterIndex, node, ...} => let val {keep, ...} = nodeInfo node val {isSplit, ...} = Vector.sub (master, masterIndex) in if !keep andalso not isSplit then Array.update (keepMaster, masterIndex, true) else () end) datatype keep = T val keepGraph: keep Graph.t = Graph.new () val {get = nodeOptions: keep Node.t -> NodeOption.t list, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("options", Node.layout)) val tableInfos = ref [] fun newNode {nodeOptions: NodeOption.t list, tableInfo} = let val _ = Option.app (tableInfo, fn z => List.push (tableInfos, z)) val n = Graph.newNode keepGraph val _ = setNodeOptions (n, nodeOptions) in n end val masterNodes = Vector.tabulate (Vector.length master, fn i => if Array.sub (keepMaster, i) then SOME (newNode (Vector.sub (masterInfo, i))) else NONE) val splitNodes = Vector.mapi (split, fn (i, {masterIndex, node, ...}) => let val {keep, ...} = nodeInfo node val {isSplit, ...} = Vector.sub (master, masterIndex) in if isSplit then if !keep then SOME (newNode (Vector.sub (splitInfo, i))) else NONE else Vector.sub (masterNodes, masterIndex) end) val _ = Graph.foreachEdge (callGraph, fn (from, e) => let val to = Edge.to e fun f n = Vector.sub (splitNodes, #index (nodeInfo n)) in case (f from, f to) of (SOME from, SOME to) => (ignore o Graph.addEdge) (keepGraph, {from = from, to = to}) | _ => () end) val {get = edgeOptions: keep Edge.t -> EdgeOption.t list ref, ...} = Property.get (Edge.plist, Property.initFun (fn _ => ref [])) (* Add a dashed edge from A to B if there is path from A to B of length * >= 2 going through only ignored nodes. *) fun newNode (n: unit Node.t): keep Node.t option = Vector.sub (splitNodes, #index (nodeInfo n)) fun reach (root: unit Node.t, f: keep Node.t -> unit): unit = let val {get = isKept: keep Node.t -> bool ref, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref false)) val {get = isSeen: unit Node.t -> bool ref, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref false)) fun loop n = List.foreach (Node.successors n, fn e => let val n = Edge.to e val s = isSeen n in if !s then () else let val _ = s := true in case newNode n of NONE => loop n | SOME keepN => let val r = isKept keepN in if !r then () else (r := true; f keepN) end end end) val _ = List.foreach (Node.successors root, fn e => let val n = Edge.to e in if Option.isNone (newNode n) then loop n else () end) in () end val _ = Vector.foreach2 (split, splitNodes, fn ({node = from, ...}, z) => Option.app (z, fn from' => (reach (from, fn to => let val e = Graph.addEdge (keepGraph, {from = from', to = to}) val _ = List.push (edgeOptions e, EdgeOption.Style Dot.Dashed) in () end)))) val _ = Graph.removeDuplicateEdges keepGraph val title = case !title of NONE => concat [aname, " call-stack graph"] | SOME s => s val _ = Option.app (!callGraphFile, fn f => File.withOut (f, fn out => Layout.output (Graph.layoutDot (keepGraph, fn _ => {edgeOptions = ! o edgeOptions, nodeOptions = nodeOptions, options = [], title = title}), out))) (* Display the table. *) val tableRows = QuickSort.sortVector (Vector.fromList (!tableInfos), fn (z, z') => #per z >= #per z') val _ = print (concat (case kind of Kind.Alloc => [IntInf.toCommaString total, " bytes allocated (", IntInf.toCommaString totalGC, " bytes by GC)\n"] | Kind.Count => [IntInf.toCommaString total, " ticks\n"] | Kind.Empty => [] | Kind.Time => let fun t2s i = Real.format (Real.fromIntInf i / ticksPerSecond, Real.Format.fix (SOME 2)) in [t2s total, " seconds of CPU time (", t2s totalGC, " seconds GC)\n"] end)) val columnHeads = "function" :: let val pers = if profileStack then ["cur", "stack", "GC"] else ["cur"] in if !raw then List.concatMap (pers, fn p => [p, "raw"]) else pers end val cols = (if profileStack then 3 else 1) * (if !raw then 2 else 1) val _ = let open Justify in outputTable (table {columnHeads = SOME columnHeads, justs = Left :: List.duplicate (cols, fn () => Right), rows = Vector.toListMap (tableRows, #row)}, Out.standard) end in () end fun makeOptions {usage} = let open Popt in List.map ([(Normal, "call-graph", " ", "write call graph to dot file", SpaceString (fn s => callGraphFile := SOME s)), (Normal, "graph-title", " ", "set call-graph title", SpaceString (fn s => title := SOME s)), (Normal, "gray", " {false|true}", "gray nodes according to stack %", boolRef gray), (Normal, "keep", " ", "which functions to display", SpaceString (fn s => keep := NodePred.fromString s handle e => usage (concat ["invalid -keep arg: ", Exn.toString e]))), (Expert, "long-name", " {true|false}", " show long names of functions", boolRef longName), (Normal, "mlmon", " ", "process mlmon files listed in ", SpaceString (fn s => mlmonFiles := List.concat [String.tokens (File.contents s, Char.isSpace), !mlmonFiles])), (Normal, "raw", " {false|true}", "show raw counts", boolRef raw), (Normal, "show-line", " {false|true}", "show line numbers", boolRef showLine), (Normal, "split", " ", "split matching functions", SpaceString (fn s => case Regexp.fromString s of NONE => usage (concat ["invalid -split regexp: ", s]) | SOME (r, _) => splitReg := Regexp.or [r, !splitReg])), (Normal, "thresh", " [0.0,100.0]", "-keep (thresh x)", Real (fn x => if x < 0.0 orelse x > 100.0 then usage "invalid -thresh" else keep := NodePred.Atomic (Atomic.Thresh x))), (Normal, "tolerant", " {false|true}", "ignore broken mlmon files", boolRef tolerant)], fn (style, name, arg, desc, opt) => {arg = arg, desc = desc, name = name, opt = opt, style = style}) end val mainUsage = "mlprof [option ...] a.out [mlmon.out ...]" val {parse, usage} = Popt.makeUsage {mainUsage = mainUsage, makeOptions = makeOptions, showExpert = fn () => false} val die = Process.fail fun commandLine args = let val rest = parse args in case rest of Result.No msg => usage msg | Result.Yes (afile :: files) => let val mlmonFiles = files @ !mlmonFiles val aInfo = AFile.new {afile = afile} val _ = if debug then (print "AFile:\n" ; Layout.outputl (AFile.layout aInfo, Out.standard)) else () val profFile = List.fold (mlmonFiles, ProfFile.empty aInfo, fn (mlmonfile, profFile) => ProfFile.merge (profFile, ProfFile.new {mlmonfile = mlmonfile}) handle e => let val msg = concat ["Error loading mlmon file '", mlmonfile, "': ", Exn.toString e] in if !tolerant then (Out.outputl (Out.error, msg) ; profFile) else die msg end) val _ = if debug then (print "ProfFile:\n" ; Layout.outputl (ProfFile.layout profFile, Out.standard)) else () val _ = display (aInfo, profFile) in () end | Result.Yes _ => usage "wrong number of args" end val main = Process.makeMain commandLine end mlton-20100608/mlprof/Makefile0000644000076600000240000000143611404435631014523 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## SRC := $(shell cd .. && pwd) BUILD := $(SRC)/build BIN := $(BUILD)/bin LIB := $(BUILD)/lib MLTON := mlton TARGET := self FLAGS := -target $(TARGET) -default-ann 'sequenceNonUnit warn' -default-ann 'warnUnused true' NAME := mlprof PATH := $(BIN):$(shell echo $$PATH) all: $(NAME) $(NAME): $(NAME).mlb $(shell PATH="$(BIN):$$PATH" && "$(MLTON)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' $(MLTON) $(FLAGS) $(NAME).mlb .PHONY: clean clean: ../bin/clean .PHONY: test test: $(NAME) ./mlprof z mlmon.out mlton-20100608/mlprof/mlprof.mlb0000644000076600000240000000036511404435631015056 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local sources.mlb in call-main.sml end mlton-20100608/mlprof/sources.mlb0000644000076600000240000000042011404435631015232 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../lib/mlton/sources.mlb main.sml in structure Main end mlton-20100608/mlton/0000755000076600000240000000000011404470407012711 5ustar mtfstaffmlton-20100608/mlton/.ignore0000644000076600000240000000021711404435625014200 0ustar mtfstaffmlton-compile mlton-compile.exe mlton-polyml mlton-polyml.exe mlton-polyml.use mlton-smlnj.*-* mlton-stubs.mlb mlton.def-use upgrade-basis.sml mlton-20100608/mlton/ast/0000755000076600000240000000000011404470407013500 5ustar mtfstaffmlton-20100608/mlton/ast/admits-equality.fun0000644000076600000240000000153611404435623017334 0ustar mtfstaff(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AdmitsEquality (S: ADMITS_EQUALITY_STRUCTS): ADMITS_EQUALITY = struct open S datatype t = Always | Never | Sometimes val toString = fn Always => "Always" | Never => "Never" | Sometimes => "Sometimes" val layout = Layout.str o toString val op <= = fn (Never, _) => true | (Sometimes, Never) => false | (Sometimes, _) => true | (Always, Always) => true | (Always, _) => false val op <= = Trace.trace2 ("AdmitsEquality.<=", layout, layout, Bool.layout) (op <=) val or = fn (Always, _) => Always | (_, Always) => Always | (Sometimes, _) => Sometimes | (_, Sometimes) => Sometimes | _ => Never end mlton-20100608/mlton/ast/admits-equality.sig0000644000076600000240000000076311404435623017327 0ustar mtfstaff(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ADMITS_EQUALITY_STRUCTS = sig end signature ADMITS_EQUALITY = sig include ADMITS_EQUALITY_STRUCTS datatype t = Always | Never | Sometimes val <= : t * t -> bool val layout: t -> Layout.t val or: t * t -> t val toString: t -> string end mlton-20100608/mlton/ast/ast-atoms.fun0000644000076600000240000003652611404435623016137 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AstAtoms (S: AST_ATOMS_STRUCTS): AST_ATOMS = struct open S structure Wrap = Region.Wrap structure AdmitsEquality = AdmitsEquality () structure CharSize = CharSize () structure Const = AstConst () structure IntSize = IntSize () structure Kind = TyconKind () structure RealSize = RealSize () structure WordSize = WordSize () structure Field = Record.Field structure Tycon = struct structure Id = AstId (structure Symbol = Symbol) open Id structure P = PrimTycons (structure AdmitsEquality = AdmitsEquality structure CharSize = CharSize structure IntSize = IntSize structure Kind = Kind structure RealSize = RealSize structure WordSize = WordSize open Id fun fromString s = Id.fromSymbol (Symbol.fromString s, Region.bogus)) open P end structure Var = AstId (structure Symbol = Symbol) structure Con = struct structure Id = AstId (structure Symbol = Symbol) open Id structure P = PrimCons (open Id fun fromString s = fromSymbol (Symbol.fromString s, Region.bogus)) open P val it = fromSymbol (Symbol.itt, Region.bogus) fun ensure oper c = if List.exists ([cons, falsee, it, nill, reff, truee], fn c' => equals (c, c')) then let open Layout in Control.error (region c, seq [str (concat ["can not ", oper, " "]), layout c], empty) end else () val ensureRedefine = ensure "redefine" val ensureSpecify = ensure "specify" end structure Basid = AstId (structure Symbol = Symbol) structure Sigid = AstId (structure Symbol = Symbol) structure Strid = AstId (structure Symbol = Symbol) structure Fctid = AstId (structure Symbol = Symbol) structure Vid = struct structure I = AstId (structure Symbol = Symbol) open I fun fromCon c = fromSymbol (Con.toSymbol c, Con.region c) fun fromVar x = fromSymbol (Var.toSymbol x, Var.region x) local fun make f v = f (toSymbol v, region v) in val toCon = make Con.fromSymbol val toVar = make Var.fromSymbol end end structure Longtycon = struct structure T = Longid (structure Id = Tycon structure Strid = Strid structure Symbol = Symbol) open T val arrow = short Tycon.arrow end structure Longvar = Longid (structure Id = Var structure Strid = Strid structure Symbol = Symbol) structure Longcon = struct structure L = Longid (structure Id = Con structure Strid = Strid structure Symbol = Symbol) open L end structure Longstrid = Longid (structure Id = Strid structure Strid = Strid structure Symbol = Symbol) structure Longvid = struct structure L = Longid (structure Id = Vid structure Strid = Strid structure Symbol = Symbol) open L local fun to (make,node, conv) x = let val (T {strids, id}, region) = dest x in make (node {strids = strids, id = conv id}, region) end in val toLongcon = to (Longcon.makeRegion, Longcon.T, Vid.toCon) end end open Layout fun reportDuplicates (v: 'a vector, {equals: 'a * 'a -> bool, layout: 'a -> Layout.t, name: string, region: 'a -> Region.t, term: unit -> Layout.t}) = Vector.foreachi (v, fn (i, a) => let fun loop i' = if i = i' then () else if not (equals (a, Vector.sub (v, i'))) then loop (i' + 1) else let open Layout in Control.error (region a, seq [str (concat ["duplicate ", name, ": "]), layout a], seq [str "in: ", term ()]) end in loop 0 end) fun reportDuplicateFields (v: (Field.t * 'a) vector, {region: Region.t, term: unit -> Layout.t}): unit = reportDuplicates (v, {equals = fn ((f, _), (f', _)) => Field.equals (f, f'), layout = Field.layout o #1, name = "label", region = fn _ => region, term = term}) structure Type = struct structure Record = SortedRecord open Wrap datatype node = Con of Longtycon.t * t vector | Record of t Record.t | Var of Tyvar.t withtype t = node Wrap.t type node' = node type obj = t fun make n = makeRegion (n, Region.bogus) val var = make o Var val record = make o Record val tuple = record o Record.tuple val unit = tuple (Vector.new0 ()) fun con (c: Tycon.t, ts: t vector): t = if Tycon.equals (c, Tycon.tuple) then tuple ts else make (Con (Longtycon.short c, ts)) fun arrow (t1, t2) = con (Tycon.arrow, Vector.new2 (t1, t2)) fun layoutApp (tycon, args: 'a vector, layoutArg) = case Vector.length args of 0 => tycon | 1 => seq [layoutArg (Vector.sub (args, 0)), str " ", tycon] | _ => seq [Vector.layout layoutArg args, str " ", tycon] fun layout ty = case node ty of Var v => Tyvar.layout v | Con (c, tys) => if Longtycon.equals (c, Longtycon.arrow) then if 2 = Vector.length tys then paren (mayAlign [layout (Vector.sub (tys, 0)), seq [str "-> ", layout (Vector.sub (tys, 1))]]) else Error.bug "AstAtoms.Type.layout: non-binary -> tyc" else layoutApp (Longtycon.layout c, tys, layout) | Record r => Record.layout {record = r, separator = ":", extra = "", layoutElt = layout, layoutTuple = layoutTupleTy} and layoutTupleTy tys = case Vector.length tys of 0 => str "unit" | 1 => layout (Vector.sub (tys, 0)) | _ => paren (mayAlign (separateLeft (Vector.toListMap (tys, layout), "* "))) fun layoutOption ty = case ty of NONE => empty | SOME ty => seq [str " of ", layout ty] fun checkSyntax (t: t): unit = case node t of Con (_, ts) => Vector.foreach (ts, checkSyntax) | Record r => (reportDuplicateFields (Record.toVector r, {region = region t, term = fn () => layout t}) ; Record.foreach (r, checkSyntax)) | Var _ => () end fun bind (x, y) = mayAlign [seq [x, str " ="], y] fun 'a layoutAnds (prefix: string, xs: 'a vector, layoutX: Layout.t * 'a -> Layout.t): Layout.t = case Vector.toList xs of [] => empty | x :: xs => align (layoutX (str (concat [prefix, " "]), x) :: List.map (xs, fn x => layoutX (str "and ", x))) datatype bindStyle = OneLine | Split of int fun 'a layoutBind (bind: string, layout: 'a -> bindStyle * Layout.t * Layout.t) (prefix: Layout.t, x: 'a): Layout.t = let val (style, lhs, rhs) = layout x val lhs = seq [prefix, lhs, str " " , str bind] in case style of OneLine => seq [lhs, str " ", rhs] | Split indentation => align [lhs, indent (rhs, indentation)] end fun layoutAndsBind (prefix, bind, xs, layout) = layoutAnds (prefix, xs, layoutBind (bind, layout)) (*---------------------------------------------------*) (* TypBind *) (*---------------------------------------------------*) structure TypBind = struct datatype node = T of {tycon: Tycon.t, def: Type.t, tyvars: Tyvar.t vector} vector open Wrap type t = node Wrap.t type node' = node type obj = t fun layout t = let val T ds = node t in layoutAndsBind ("type", "=", ds, fn {tycon, def, tyvars} => (OneLine, Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout), Type.layout def)) end val empty = makeRegion (T (Vector.new0 ()), Region.bogus) fun checkSyntax (b: t): unit = let val T v = node b val () = Vector.foreach (v, fn {def, ...} => Type.checkSyntax def) in reportDuplicates (v, {equals = (fn ({tycon = t, ...}, {tycon = t', ...}) => Tycon.equals (t, t')), layout = Tycon.layout o #tycon, name = "type definition", region = Tycon.region o #tycon, term = fn () => layout b}) end end (*---------------------------------------------------*) (* DatBind *) (*---------------------------------------------------*) structure DatBind = struct datatype node = T of {datatypes: {cons: (Con.t * Type.t option) vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector, withtypes: TypBind.t} open Wrap type t = node Wrap.t type node' = node type obj = t fun layout (prefix, d) = let val T {datatypes, withtypes} = node d in align [layoutAndsBind (prefix, "=", datatypes, fn {tyvars, tycon, cons} => (OneLine, Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout), alignPrefix (Vector.toListMap (cons, fn (c, to) => seq [Con.layout c, Type.layoutOption to]), "| "))), case TypBind.node withtypes of TypBind.T v => if 0 = Vector.length v then empty else seq [str "with", TypBind.layout withtypes]] end fun checkSyntax (b: t): unit = let val T {datatypes, withtypes} = node b val () = Vector.foreach (datatypes, fn {cons, ...} => Vector.foreach (cons, fn (c, to) => (Con.ensureRedefine c ; Option.app (to, Type.checkSyntax)))) fun term () = layout ("datatype", b) val () = reportDuplicates (Vector.concatV (Vector.map (datatypes, #cons)), {equals = fn ((c, _), (c', _)) => Con.equals (c, c'), layout = Con.layout o #1, name = "constructor", region = Con.region o #1, term = term}) val () = reportDuplicates (Vector.concat [Vector.map (datatypes, #tycon), let val TypBind.T v = TypBind.node withtypes in Vector.map (v, #tycon) end], {equals = Tycon.equals, layout = Tycon.layout, name = "type definition", region = Tycon.region, term = term}) in () end end structure DatatypeRhs = struct datatype node = DatBind of DatBind.t | Repl of {lhs: Tycon.t, rhs: Longtycon.t} open Wrap type t = node Wrap.t type node' = node type obj = t fun layout d = case node d of DatBind d => DatBind.layout ("datatype", d) | Repl {lhs, rhs} => seq [str "datatype ", Tycon.layout lhs, str " = datatype ", Longtycon.layout rhs] fun checkSyntax (rhs: t): unit = case node rhs of DatBind b => DatBind.checkSyntax b | Repl _ => () end (*---------------------------------------------------*) (* ModIdBind *) (*---------------------------------------------------*) structure ModIdBind = struct datatype node = Fct of {lhs: Fctid.t, rhs: Fctid.t} vector | Sig of {lhs: Sigid.t, rhs: Sigid.t} vector | Str of {lhs: Strid.t, rhs: Strid.t} vector open Wrap type t = node Wrap.t type node' = node type obj = t fun layout d = let fun doit (prefix, l, bds) = layoutAndsBind (prefix, "=", bds, fn {lhs, rhs} => (OneLine, l lhs, l rhs)) in case node d of Fct bds => doit ("functor", Fctid.layout, bds) | Sig bds => doit ("signature", Sigid.layout, bds) | Str bds => doit ("structure", Strid.layout, bds) end fun checkSyntax d = let fun doit (bds : {lhs: 'a, rhs: 'a} Vector.t, {equalsId, layoutId, regionId, name}) = reportDuplicates (bds, {equals = (fn ({lhs = id, ...}, {lhs = id', ...}) => equalsId (id, id')), layout = layoutId o #lhs, name = concat [name, " definition"], region = regionId o #lhs, term = fn () => layout d}) in case node d of Fct bds => doit (bds, {equalsId = Fctid.equals, layoutId = Fctid.layout, regionId = Fctid.region, name = "functor"}) | Sig bds => doit (bds, {equalsId = Sigid.equals, layoutId = Sigid.layout, regionId = Sigid.region, name = "signature"}) | Str bds => doit (bds, {equalsId = Strid.equals, layoutId = Strid.layout, regionId = Strid.region, name = "structure"}) end end end mlton-20100608/mlton/ast/ast-atoms.sig0000644000076600000240000001267111404435623016124 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AST_ATOMS_STRUCTS = sig structure Record: RECORD structure SortedRecord: RECORD structure Symbol: SYMBOL structure Tyvar: TYVAR sharing Record.Field = SortedRecord.Field sharing Symbol = Record.Field.Symbol end signature AST_ATOMS = sig include AST_ATOMS_STRUCTS structure Const: AST_CONST structure Tycon: sig include AST_ID include PRIM_TYCONS sharing type tycon = t end structure Var: AST_ID structure Con: sig include AST_ID include PRIM_CONS sharing type con = t val ensureRedefine: t -> unit val ensureSpecify: t -> unit end structure Basid: AST_ID structure Sigid: AST_ID structure Strid: AST_ID structure Fctid: AST_ID structure Vid: sig include AST_ID (* conversions to and from variables and constructors *) val fromVar: Var.t -> t val fromCon: Con.t -> t val toVar: t -> Var.t val toCon: t -> Con.t end structure Longtycon: sig include LONGID val arrow: t end sharing Longtycon.Id = Tycon structure Longvar: LONGID sharing Longvar.Id = Var structure Longcon: LONGID sharing Longcon.Id = Con structure Longstrid: LONGID sharing Longstrid.Id = Strid structure Longvid: sig include LONGID val toLongcon: t -> Longcon.t end sharing Longvid.Id = Vid sharing Strid = Longtycon.Strid = Longvar.Strid = Longcon.Strid = Longvid.Strid = Longstrid.Strid sharing Symbol = Basid.Symbol = Con.Symbol = Fctid.Symbol = Longcon.Symbol = Longstrid.Symbol = Longtycon.Symbol = Longvar.Symbol = Longvid.Symbol = Sigid.Symbol = Strid.Symbol = Tycon.Symbol = Vid.Symbol = Var.Symbol structure Type: sig type t datatype node = Con of Longtycon.t * t vector | Record of t SortedRecord.t | Var of Tyvar.t include WRAPPED sharing type node' = node sharing type obj = t val arrow: t * t -> t val checkSyntax: t -> unit val con: Tycon.t * t vector -> t val layout: t -> Layout.t val layoutApp: Layout.t * 'a vector * ('a -> Layout.t) -> Layout.t val layoutOption: t option -> Layout.t val record: t SortedRecord.t -> t val tuple: t vector -> t val unit: t val var: Tyvar.t -> t end structure TypBind: sig type t datatype node = T of {def: Type.t, tycon: Tycon.t, tyvars: Tyvar.t vector} vector include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val empty: t val layout: t -> Layout.t end structure DatBind: sig type t datatype node = T of {datatypes: {cons: (Con.t * Type.t option) vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector, withtypes: TypBind.t} include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val layout: string * t -> Layout.t end structure DatatypeRhs: sig type t datatype node = DatBind of DatBind.t | Repl of {lhs: Tycon.t, rhs: Longtycon.t} include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val layout: t -> Layout.t end structure ModIdBind: sig type t datatype node = Fct of {lhs: Fctid.t, rhs: Fctid.t} vector | Sig of {lhs: Sigid.t, rhs: Sigid.t} vector | Str of {lhs: Strid.t, rhs: Strid.t} vector include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val layout: t -> Layout.t end val bind: Layout.t * Layout.t -> Layout.t val layoutAnds: (string * 'a vector * (Layout.t * 'a -> Layout.t) -> Layout.t) datatype bindStyle = OneLine | Split of int val layoutAndsBind: string * string * 'a vector * ('a -> bindStyle * Layout.t * Layout.t) -> Layout.t val reportDuplicates: 'a vector * {equals: 'a * 'a -> bool, layout: 'a -> Layout.t, name: string, region: 'a -> Region.t, term: unit -> Layout.t} -> unit val reportDuplicateFields: (Record.Field.t * 'a) vector * {region: Region.t, term: unit -> Layout.t} -> unit end mlton-20100608/mlton/ast/ast-const.fun0000644000076600000240000000310111404435623016121 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AstConst (S: AST_CONST_STRUCTS): AST_CONST = struct open S Region.Wrap datatype node = Bool of bool | Char of IntInf.t | Int of IntInf.t | Real of string | String of IntInf.t vector | Word of IntInf.t type t = node Region.Wrap.t type node' = node type obj = t fun ordToString (c: IntInf.t): string = let fun loop (n: int, c: IntInf.t, ac: char list) = if n = 0 then implode ac else let val (q, r) = IntInf.quotRem (c, 0x10) in loop (n - 1, q, Char.fromHexDigit (Int.fromIntInf r) :: ac) end fun doit (n, esc) = concat ["\\", esc, loop (n, c, [])] in if c <= 0xFF then Char.escapeSML (Char.fromInt (Int.fromIntInf c)) else if c <= 0xFFFF then doit (4, "u") else doit (8, "U") end local open Layout in fun layout c = case node c of Bool b => if b then str "true" else str "false" | Char c => str (concat ["#\"", ordToString c, "\""]) | Int s => str (IntInf.toString s) | Real l => String.layout l | String s => str (concat ["\"", concat (Vector.toListMap (s, ordToString)), "\""]) | Word w => str (concat ["0wx", IntInf.format (w, StringCvt.HEX)]) end end mlton-20100608/mlton/ast/ast-const.sig0000644000076600000240000000132411404435623016120 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AST_CONST_STRUCTS = sig end signature AST_CONST = sig include AST_CONST_STRUCTS type t datatype node = Bool of bool | Char of IntInf.t | Int of IntInf.t | Real of string | String of IntInf.t vector | Word of IntInf.t include WRAPPED sharing type node' = node sharing type obj = t val layout: t -> Layout.t val ordToString: IntInf.t -> string end mlton-20100608/mlton/ast/ast-core.fun0000644000076600000240000005330711404435623015740 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AstCore (S: AST_CORE_STRUCTS): AST_CORE = struct open S Layout structure Field = Record.Field structure Wrap = Region.Wrap structure Fixity = struct datatype t = Infix of int option | Infixr of int option | Nonfix val toString = fn Infix NONE => "infix" | Infix (SOME n) => "infix " ^ Int.toString n | Infixr NONE => "infixr" | Infixr (SOME n) => "infixr " ^ Int.toString n | Nonfix => "nonfix" val layout = Layout.str o toString end structure Fixop = struct datatype t = Op | None val layout = fn Op => str "op " | None => empty end fun layoutConstraint (t, ty) = mayAlign [seq [t, str ":"], Type.layout ty] fun maybeConstrain (e, tyo) = case tyo of NONE => e | SOME ty => layoutConstraint (e, ty) fun layoutLongvid x = str (let val s = Longvid.toString x in if s = "*" then " * " else if String.hasSuffix (s, {suffix = "*"}) then s ^ " " else s end) (*---------------------------------------------------*) (* Patterns *) (*---------------------------------------------------*) structure Pat = struct open Wrap datatype node = App of Longcon.t * t | Const of Const.t | Constraint of t * Type.t | FlatApp of t vector | Layered of {fixop: Fixop.t, var: Var.t, constraint: Type.t option, pat: t} | List of t vector | Record of {flexible: bool, items: (Record.Field.t * item) vector} | Tuple of t vector | Var of {fixop: Fixop.t, name: Longvid.t} | Wild and item = Field of t | Vid of Vid.t * Type.t option * t option withtype t = node Wrap.t type node' = node type obj = t structure Item = struct type pat = t datatype t = datatype item end fun make n = makeRegion (n, Region.bogus) val wild = make Wild val constraint = make o Constraint val layered = make o Layered fun longvid x = make (Var {name = x, fixop = Fixop.None}) val var = longvid o Longvid.short o Vid.fromVar fun tuple ps = if 1 = Vector.length ps then Vector.sub (ps, 0) else make (Tuple ps) fun layout (p, isDelimited) = let fun delimit t = if isDelimited then t else paren t in case node p of App (c, p) => delimit (mayAlign [Longcon.layout c, layoutF p]) | Const c => Const.layout c | Constraint (p, t) => delimit (layoutConstraint (layoutF p, t)) | FlatApp ps => delimit (layoutFlatApp ps) | Layered {fixop, var, constraint, pat} => delimit (mayAlign [maybeConstrain (seq [Fixop.layout fixop, Var.layout var], constraint), seq [str "as ", layoutT pat]]) | List ps => list (Vector.toListMap (ps, layoutT)) | Record {items, flexible} => seq [str "{", mayAlign (separateRight (Vector.toListMap (items, layoutItem), ",")), if flexible then str (if Vector.isEmpty items then "..." else ", ...") else empty, str "}"] | Tuple ps => Vector.layout layoutT ps | Var {name, fixop} => seq [Fixop.layout fixop, layoutLongvid name] | Wild => str "_" end and layoutF p = layout (p, false) and layoutT p = layout (p, true) and layoutFlatApp ps = seq (separate (Vector.toListMap (ps, layoutF), " ")) and layoutItem (f, i) = seq [Field.layout f, case i of Field p => seq [str " = ", layoutT p] | Vid (_, tyo, po) => seq [case tyo of NONE => empty | SOME ty => seq [str ": ", Type.layout ty], case po of NONE => empty | SOME p => seq [str " as ", layoutT p]]] val layoutDelimit = layoutF val layout = layoutT fun checkSyntax (p: t): unit = let val c = checkSyntax in case node p of App (_, p) => c p | Const _ => () | Constraint (p, t) => (c p; Type.checkSyntax t) | FlatApp ps => Vector.foreach (ps, c) | Layered {constraint, pat, ...} => (c pat; Option.app (constraint, Type.checkSyntax)) | List ps => Vector.foreach (ps, c) | Record {items, ...} => (Vector.foreach (items, fn (_, i) => case i of Item.Field p => c p | Item.Vid (_, to, po) => (Option.app (to, Type.checkSyntax) ; Option.app (po, c))) ; reportDuplicateFields (items, {region = region p, term = fn () => layout p})) | Tuple ps => Vector.foreach (ps, c) | Var _ => () | Wild => () end end structure Eb = struct structure Rhs = struct open Wrap datatype node = Def of Longcon.t | Gen of Type.t option type t = node Wrap.t type node' = node type obj = t fun layout rhs = case node rhs of Def c => seq [str " = ", Longcon.layout c] | Gen to => Type.layoutOption to fun checkSyntax (e: t): unit = case node e of Def _ => () | Gen to => Option.app (to, Type.checkSyntax) end type t = Con.t * Rhs.t fun layout (exn, rhs) = seq [Con.layout exn, Rhs.layout rhs] end structure EbRhs = Eb.Rhs structure PrimKind = struct structure ImportExportAttribute = struct datatype t = Cdecl | External | Private | Public | Stdcall val toString: t -> string = fn Cdecl => "cdecl" | External => "external" | Private => "private" | Public => "public" | Stdcall => "stdcall" val layout = Layout.str o toString end structure SymbolAttribute = struct datatype t = Alloc | External | Private | Public val toString: t -> string = fn Alloc => "alloc" | External => "external" | Private => "private" | Public => "public" val layout = Layout.str o toString end datatype t = Address of {attributes: SymbolAttribute.t list, name: string, ty: Type.t} | BuildConst of {name: string, ty: Type.t} | CommandLineConst of {name: string, ty: Type.t, value: Const.t} | Const of {name: string, ty: Type.t} | Export of {attributes: ImportExportAttribute.t list, name: string, ty: Type.t} | IImport of {attributes: ImportExportAttribute.t list, ty: Type.t} | Import of {attributes: ImportExportAttribute.t list, name: string, ty: Type.t} | ISymbol of {ty: Type.t} | Prim of {name: string, ty: Type.t} | Symbol of {attributes: SymbolAttribute.t list, name: string, ty: Type.t} fun name pk = case pk of Address {name, ...} => name | BuildConst {name, ...} => name | CommandLineConst {name, ...} => name | Const {name, ...} => name | Export {name, ...} => name | IImport {...} => "" | Import {name, ...} => name | ISymbol {...} => "" | Prim {name, ...} => name | Symbol {name, ...} => name end structure Priority = struct datatype t = T of int option val op <= = fn (T x, T y) => case (x, y) of (NONE, NONE) => true | (NONE, _) => true | (_, NONE) => false | (SOME x, SOME y) => Int.<= (x, y) val default = T NONE fun layout (T x) = case x of NONE => Layout.empty | SOME x => Int.layout x end datatype expNode = Var of {name: Longvid.t, fixop: Fixop.t} | Fn of match | FlatApp of exp vector | App of exp * exp | Case of exp * match | Let of dec * exp | Seq of exp vector | Const of Const.t | Record of expNode Wrap.t Record.t (* the Kit barfs on exp Record.t *) | List of exp vector | Selector of Field.t | Constraint of exp * Type.t | Handle of exp * match | Raise of exp | If of exp * exp * exp | Andalso of exp * exp | Orelse of exp * exp | While of {test: exp, expr: exp} | Prim of PrimKind.t and decNode = Abstype of {body: dec, datBind: DatBind.t} | Datatype of DatatypeRhs.t | Exception of Eb.t vector | Fix of {fixity: Fixity.t, ops: Vid.t vector} | Fun of Tyvar.t vector * {body: exp, pats: Pat.t vector, resultType: Type.t option} vector vector | Local of dec * dec | Open of Longstrid.t vector | Overload of Priority.t * Var.t * Tyvar.t vector * Type.t * Longvid.t vector | SeqDec of dec vector | Type of TypBind.t | Val of {tyvars: Tyvar.t vector, vbs: {exp: exp, pat: Pat.t} vector, rvbs: {match: match, pat: Pat.t} vector} and matchNode = T of (Pat.t * exp) vector withtype dec = decNode Wrap.t and exp = expNode Wrap.t and match = matchNode Wrap.t open Wrap structure Match = struct open Wrap type t = match datatype node = datatype matchNode type node' = node type obj = t end fun layoutAndsTyvars (prefix, (tyvars, xs), layoutX) = layoutAnds (prefix, Vector.fromList (case Vector.toListMap (xs, layoutX) of [] => [] | x :: xs => (if Vector.isEmpty tyvars then x else seq [Tyvar.layouts tyvars, str " ", x]) :: xs), fn (prefix, x) => seq [prefix, x]) fun expNodeName e = case node e of Andalso _ => "Andalso" | App _ => "App" | Case _ => "Case" | Const _ => "Const" | Constraint _ => "Constraint" | FlatApp _ => "FlatApp" | Fn _ => "Fn" | Handle _ => "Handle" | If _ => "If" | Let _ => "Let" | List _ => "List" | Orelse _ => "Orelse" | Prim _ => "Prim" | Raise _ => "Raise" | Record _ => "Record" | Selector _ => "Selector" | Seq _ => "Seq" | Var _ => "Var" | While _ => "While" val traceLayoutExp = Trace.traceInfo' (Trace.info "AstCore.layoutExp", fn (e, _: bool) => Layout.str (expNodeName e), Layout.ignore: Layout.t -> Layout.t) fun layoutExp arg = traceLayoutExp (fn (e, isDelimited) => let fun delimit t = if isDelimited then t else paren t in case node e of Andalso (e, e') => delimit (mayAlign [layoutExpF e, seq [str "andalso ", layoutExpF e']]) | App (function, argument) => delimit (mayAlign [layoutExpF function, layoutExpF argument]) | Case (expr, match) => delimit (align [seq [str "case ", layoutExpT expr, str " of"], indent (layoutMatch match, 2)]) | Const c => Const.layout c | Constraint (expr, constraint) => delimit (layoutConstraint (layoutExpF expr, constraint)) | FlatApp es => delimit (seq (separate (Vector.toListMap (es, layoutExpF), " "))) | Fn m => delimit (seq [str "fn ", layoutMatch m]) | Handle (try, match) => delimit (align [layoutExpF try, seq [str "handle ", layoutMatch match]]) | If (test, thenCase, elseCase) => delimit (mayAlign [seq [str "if ", layoutExpT test], seq [str "then ", layoutExpT thenCase], seq [str "else ", layoutExpT elseCase]]) | Let (dec, expr) => Pretty.lett (layoutDec dec, layoutExpT expr) | List es => list (Vector.toListMap (es, layoutExpT)) | Orelse (e, e') => delimit (mayAlign [layoutExpF e, seq [str "orelse ", layoutExpF e']]) | Prim kind => str (PrimKind.name kind) | Raise exn => delimit (seq [str "raise ", layoutExpF exn]) | Record r => let fun layoutTuple es = if 1 = Vector.length es then layoutExp (Vector.sub (es, 0), isDelimited) else tuple (layoutExpsT es) in Record.layout {record = r, separator = " = ", extra = "", layoutTuple = layoutTuple, layoutElt = layoutExpT} end | Selector f => seq [str "#", Field.layout f] | Seq es => paren (align (separateRight (layoutExpsT es, " ;"))) | Var {name, fixop} => seq [Fixop.layout fixop, layoutLongvid name] | While {test, expr} => delimit (align [seq [str "while ", layoutExpT test], seq [str "do ", layoutExpT expr]]) end) arg and layoutExpsT es = Vector.toListMap (es, layoutExpT) and layoutExpT e = layoutExp (e, true) and layoutExpF e = layoutExp (e, false) and layoutMatch m = let val Match.T rules = node m in alignPrefix (Vector.toListMap (rules, layoutRule), "| ") end and layoutRule (pat, exp) = mayAlign [seq [Pat.layoutF pat, str " =>"], layoutExpF exp] and layoutDec d = case node d of Abstype {datBind, body} => align [DatBind.layout ("abstype", datBind), seq [str "with ", layoutDec body], str "end"] | Datatype rhs => DatatypeRhs.layout rhs | Exception ebs => layoutAnds ("exception", ebs, fn (prefix, eb) => seq [prefix, Eb.layout eb]) | Fix {fixity, ops} => seq [Fixity.layout fixity, str " ", seq (separate (Vector.toListMap (ops, Vid.layout), " "))] | Fun fbs => layoutAndsTyvars ("fun", fbs, layoutFb) | Local (d, d') => Pretty.locall (layoutDec d, layoutDec d') | Open ss => seq [str "open ", seq (separate (Vector.toListMap (ss, Longstrid.layout), " "))] | Overload (p, x, _, t, xs) => seq [str "_overload ", Priority.layout p, str " ", align [layoutConstraint (Var.layout x, t), layoutAnds ("as", xs, fn (prefix, x) => seq [prefix, Longvid.layout x])]] | SeqDec ds => align (Vector.toListMap (ds, layoutDec)) | Type typBind => TypBind.layout typBind | Val {tyvars, vbs, rvbs} => align [layoutAndsTyvars ("val", (tyvars, vbs), layoutVb), layoutAndsTyvars ("val rec", (tyvars, rvbs), layoutRvb)] and layoutVb {pat, exp} = bind (Pat.layoutT pat, layoutExpT exp) and layoutRvb {pat, match, ...} = bind (Pat.layout pat, seq [str "fn ", layoutMatch match]) and layoutFb clauses = alignPrefix (Vector.toListMap (clauses, layoutClause), "| ") and layoutClause ({pats, resultType, body}) = mayAlign [seq [maybeConstrain (Pat.layoutFlatApp pats, resultType), str " ="], layoutExpF body] (* this has to be layoutExpF in case body is a case expression *) fun checkSyntaxExp (e: exp): unit = let val c = checkSyntaxExp in case node e of Andalso (e1, e2) => (c e1; c e2) | App (e1, e2) => (c e1; c e2) | Case (e, m) => (c e; checkSyntaxMatch m) | Const _ => () | Constraint (e, t) => (c e; Type.checkSyntax t) | FlatApp es => Vector.foreach (es, c) | Fn m => checkSyntaxMatch m | Handle (e, m) => (c e; checkSyntaxMatch m) | If (e1, e2, e3) => (c e1; c e2; c e3) | Let (d, e) => (checkSyntaxDec d; c e) | List es => Vector.foreach (es, c) | Orelse (e1, e2) => (c e1; c e2) | Prim _ => () | Raise e => c e | Record r => (Record.foreach (r, c) ; reportDuplicateFields (Record.toVector r, {region = region e, term = fn () => layoutExp (e, true)})) | Selector _ => () | Seq es => Vector.foreach (es, c) | Var _ => () | While {expr, test} => (c expr; c test) end and checkSyntaxMatch (m: match): unit = let val T v = node m in Vector.foreach (v, fn (p, e) => (Pat.checkSyntax p; checkSyntaxExp e)) end and checkSyntaxDec (d: dec): unit = case node d of Abstype {datBind, body} => (DatBind.checkSyntax datBind ; checkSyntaxDec body) | Datatype rhs => DatatypeRhs.checkSyntax rhs | Exception v => (Vector.foreach (v, fn (_, ebrhs) => EbRhs.checkSyntax ebrhs) ; (reportDuplicates (v, {equals = fn ((c, _), (c', _)) => Con.equals (c, c'), layout = Con.layout o #1, name = "exception declaration", region = Con.region o #1, term = fn () => layoutDec d}))) | Fix _ => () (* The Definition allows, e.g., "infix + +". *) | Fun (_, fs) => Vector.foreach (fs, fn clauses => Vector.foreach (clauses, fn {body, pats, resultType} => (checkSyntaxExp body ; Vector.foreach (pats, Pat.checkSyntax) ; Option.app (resultType, Type.checkSyntax)))) | Local (d, d') => (checkSyntaxDec d; checkSyntaxDec d') | Open _ => () | Overload (_, _, _, ty, _) => Type.checkSyntax ty | SeqDec v => Vector.foreach (v, checkSyntaxDec) | Type b => TypBind.checkSyntax b | Val {rvbs, vbs, ...} => (Vector.foreach (rvbs, fn {match, pat} => (checkSyntaxMatch match ; Pat.checkSyntax pat)) ; Vector.foreach (vbs, fn {exp, pat} => (checkSyntaxExp exp ; Pat.checkSyntax pat))) structure Exp = struct open Wrap type dec = dec type match = match type t = exp datatype node = datatype expNode type node' = node type obj = t fun const c = makeRegion (Const c, Const.region c) fun constraint (e, t) = makeRegion (Constraint (e, t), region e) fun fnn rs = let val r = if 0 = Vector.length rs then Region.bogus else Region.append (Pat.region (#1 (Vector.sub (rs, 0))), region (#2 (Vector.last rs))) in makeRegion (Fn (Match.makeRegion (Match.T rs, r)), r) end fun longvid name = makeRegion (Var {name = name, fixop = Fixop.None}, Longvid.region name) val var = longvid o Longvid.short o Vid.fromVar fun app (e1: t, e2: t): t = makeRegion (App (e1, e2), Region.append (region e1, region e2)) fun lett (ds: dec vector, e: t, r: Region.t): t = makeRegion (Let (makeRegion (SeqDec ds, r), e), r) fun tuple (es: t vector): t = if 1 = Vector.length es then Vector.sub (es, 0) else let val r = if 0 = Vector.length es then Region.bogus else Region.append (region (Vector.sub (es, 0)), region (Vector.last es)) in makeRegion (Record (Record.tuple es), r) end val unit: t = tuple (Vector.new0 ()) val layout = layoutExpT end structure Dec = struct open Wrap type t = dec datatype node = datatype decNode type node' = node type obj = t val checkSyntax = checkSyntaxDec fun make n = makeRegion (n, Region.bogus) val openn = make o Open fun vall (tyvars, var, exp): t = make (Val {tyvars = tyvars, vbs = Vector.new1 {exp = exp, pat = Pat.var var}, rvbs = Vector.new0 ()}) local val it = Var.fromSymbol (Symbol.fromString "it", Region.bogus) in fun fromExp (e: Exp.t): t = vall (Vector.new0 (), it, e) end val layout = layoutDec end end mlton-20100608/mlton/ast/ast-core.sig0000644000076600000240000001625611404435623015734 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AST_CORE_STRUCTS = sig include AST_ATOMS end signature AST_CORE = sig include AST_CORE_STRUCTS structure Fixity: sig datatype t = Infix of int option | Infixr of int option | Nonfix val layout: t -> Layout.t end structure Fixop: sig datatype t = Op | None end structure Pat: sig type t structure Item: sig type pat datatype t = Field of pat | Vid of Vid.t * Type.t option * pat option (* vid <:ty> *) end sharing type Item.pat = t datatype node = App of Longcon.t * t | Const of Const.t | Constraint of t * Type.t | FlatApp of t vector | Layered of {constraint: Type.t option, fixop: Fixop.t, pat: t, var: Var.t} | List of t vector | Record of {flexible: bool, items: (Record.Field.t * Item.t) vector} | Tuple of t vector | Var of {fixop: Fixop.t, name: Longvid.t} | Wild include WRAPPED sharing type node' = node sharing type obj = t val constraint: t * Type.t -> t val layered: {fixop: Fixop.t, var: Var.t, constraint: Type.t option, pat: t} -> t val layout: t -> Layout.t val layoutDelimit: t -> Layout.t val longvid: Longvid.t -> t val tuple: t vector -> t val var: Var.t -> t val wild: t end structure PrimKind: sig structure ImportExportAttribute: sig datatype t = Cdecl | External | Private | Public | Stdcall val layout: t -> Layout.t end structure SymbolAttribute: sig datatype t = Alloc | External | Private | Public val layout: t -> Layout.t end datatype t = Address of {attributes: SymbolAttribute.t list, name: string, ty: Type.t} | BuildConst of {name: string, ty: Type.t} | CommandLineConst of {name: string, ty: Type.t, value: Const.t} | Const of {name: string, ty: Type.t} | Export of {attributes: ImportExportAttribute.t list, name: string, ty: Type.t} | IImport of {attributes: ImportExportAttribute.t list, ty: Type.t} | Import of {attributes: ImportExportAttribute.t list, name: string, ty: Type.t} | ISymbol of {ty: Type.t} | Prim of {name: string, ty: Type.t} | Symbol of {attributes: SymbolAttribute.t list, name: string, ty: Type.t} end structure Priority: sig datatype t = T of int option val <= : t * t -> bool val default: t val layout: t -> Layout.t end structure Exp: sig type dec type match type t datatype node = Andalso of t * t | App of t * t | Case of t * match | Const of Const.t | Constraint of t * Type.t | FlatApp of t vector | Fn of match | Handle of t * match | If of t * t * t | Let of dec * t | List of t vector | Orelse of t * t | Prim of PrimKind.t | Raise of t | Record of t Record.t | Selector of Record.Field.t | Seq of t vector | Var of {fixop: Fixop.t, name: Longvid.t} | While of {expr: t, test: t} include WRAPPED sharing type node' = node sharing type obj = t val app: t * t -> t val const: Const.t -> t val constraint: t * Type.t -> t val fnn: (Pat.t * t) vector -> t val layout: t -> Layout.t val lett: dec vector * t * Region.t -> t val longvid: Longvid.t -> t val tuple: t vector -> t val unit: t val var: Var.t -> t end structure Match: sig type t datatype node = T of (Pat.t * Exp.t) vector include WRAPPED sharing type node' = node sharing type obj = t end sharing type Exp.match = Match.t structure EbRhs: sig type t datatype node = Def of Longcon.t | Gen of Type.t option include WRAPPED sharing type node' = node sharing type obj = t end structure Dec: sig type t datatype node = Abstype of {datBind: DatBind.t, body: t} | Datatype of DatatypeRhs.t | Exception of (Con.t * EbRhs.t) vector | Fix of {fixity: Fixity.t, ops: Vid.t vector} | Fun of Tyvar.t vector * {body: Exp.t, pats: Pat.t vector, resultType: Type.t option} vector vector | Local of t * t | Open of Longstrid.t vector | Overload of Priority.t * Var.t * Tyvar.t vector * Type.t * Longvid.t vector | SeqDec of t vector | Type of TypBind.t | Val of {rvbs: {match: Match.t, pat: Pat.t} vector, tyvars: Tyvar.t vector, vbs: {exp: Exp.t, pat: Pat.t} vector} include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val fromExp: Exp.t -> t val layout: t -> Layout.t val openn: Longstrid.t vector -> t val vall: Tyvar.t vector * Var.t * Exp.t -> t end sharing type Dec.t = Exp.dec end mlton-20100608/mlton/ast/ast-id.fun0000644000076600000240000000306611404435623015401 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AstId (S: AST_ID_STRUCTS): AST_ID = struct open S datatype t = T of {name: Symbol.t, region: Region.t} type obj = t type node' = Symbol.t local fun make f (T r) = f r in val name = make #name val region = make #region end val node = name (* quell unused warning *) val _ = node val toSymbol = name fun makeRegion (s, r) = T {name = s, region = r} val fromSymbol = makeRegion fun makeRegion' (s, x, y) = makeRegion (s, Region.make {left = x, right = y}) (* quell unused warning *) val _ = makeRegion' fun dest (T {name, region, ...}) = (name, region) (* quell unused warning *) val _ = dest val bogus = makeRegion (Symbol.bogus, Region.bogus) fun isAlphaNumeric id = let val c = String.sub (Symbol.toString (name id), 0) in Char.isAlphaNum c orelse c = #"'" end val isSymbolic = not o isAlphaNumeric val toString = Symbol.toString o name val layout = String.layout o toString (* val left = Region.left o region *) (* val right = Region.left o region *) local fun binary (f: string * string -> 'a) (x :t, y: t): 'a = f (toString x, toString y) in val compare = binary String.compare end fun equals (x, x') = Symbol.equals (name x, name x') val equals = Trace.trace2 ("AstId.equals", layout, layout, Bool.layout) equals end mlton-20100608/mlton/ast/ast-id.sig0000644000076600000240000000131511404435623015366 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AST_ID_STRUCTS = sig structure Symbol: SYMBOL end signature AST_ID = sig include AST_ID_STRUCTS include WRAPPED type t sharing type obj = t val bogus: t val compare: t * t -> Relation.t val equals: t * t -> bool val fromSymbol: Symbol.t * Region.t -> t val isSymbolic: t -> bool val layout: t -> Layout.t val toString: t -> string val toSymbol: t -> Symbol.t end mlton-20100608/mlton/ast/ast-mlbs.fun0000644000076600000240000001301211404435623015732 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AstMLBs (S: AST_MLBS_STRUCTS): AST_MLBS = struct open S structure AstPrograms = AstPrograms (S) open AstPrograms Layout val layouts = List.map structure Wrap = Region.Wrap val node = Wrap.node (*---------------------------------------------------*) (* Basdecs and Basexps *) (*---------------------------------------------------*) datatype basexpNode = Bas of basdec | Let of basdec * basexp | Var of Basid.t and basdecNode = Ann of string * Region.t * basdec | Basis of {name: Basid.t, def: basexp} vector | Defs of ModIdBind.t | Local of basdec * basdec | MLB of {fileAbs: File.t, fileUse: File.t} * basdec Promise.t | Open of Basid.t vector | Prim | Prog of {fileAbs: File.t, fileUse: File.t} * Program.t Promise.t | Seq of basdec list withtype basexp = basexpNode Wrap.t and basdec = basdecNode Wrap.t fun layoutBasexp exp = case node exp of Bas dec => align [str "bas", indent (layoutBasdec dec, 3), str "end"] | Let (dec, exp) => Pretty.lett (layoutBasdec dec, layoutBasexp exp) | Var basid => Basid.layout basid and layoutBasdec dec = case node dec of Ann (anns,_, dec) => align [str "ann", indent (seq [str String.dquote, str anns, str String.dquote], 3), str "in", indent (layoutBasdec dec, 3), str "end"] | Basis basbnds => layoutAndsBind ("basis", "=", basbnds, fn {name, def} => (case node def of Var _ => OneLine | _ => Split 3, Basid.layout name, layoutBasexp def)) | Defs def => ModIdBind.layout def | Local (dec1, dec2) => Pretty.locall (layoutBasdec dec1, layoutBasdec dec2) | MLB ({fileUse, ...}, _) => File.layout fileUse | Open bs => seq [str "open ", seq (separate (Vector.toListMap (bs, Basid.layout), " "))] | Prim => str "_prim" | Prog ({fileUse, ...}, _) => File.layout fileUse | Seq decs => align (layoutBasdecs decs) and layoutBasdecs decs = layouts (decs, layoutBasdec) fun checkSyntaxBasexp (e: basexp): unit = case node e of Bas dec => checkSyntaxBasdec dec | Let (dec, exp) => (checkSyntaxBasdec dec ; checkSyntaxBasexp exp) | Var _ => () and checkSyntaxBasdec (d: basdec): unit = case node d of Ann (_, _, dec) => checkSyntaxBasdec dec | Basis basbnds => reportDuplicates (basbnds, {equals = (fn ({name = id, ...}, {name = id', ...}) => Basid.equals (id, id')), layout = Basid.layout o #name, name = "basis definition", region = Basid.region o #name, term = fn () => layoutBasdec d}) | Defs def => ModIdBind.checkSyntax def | Local (dec1, dec2) => (checkSyntaxBasdec dec1 ; checkSyntaxBasdec dec2) | MLB _ => () | Open _ => () | Prim => () | Prog _ => () | Seq decs => List.foreach (decs, checkSyntaxBasdec) fun sourceFiles (d: basdec): File.t vector = let val sourceFiles : File.t Buffer.t = Buffer.new {dummy = ""} val psi : File.t -> bool ref = String.memoize (fn _ => ref false) fun sourceFilesBasexp (e: basexp): unit = case node e of Bas dec => sourceFilesBasdec dec | Let (dec, exp) => (sourceFilesBasdec dec ; sourceFilesBasexp exp) | Var _ => () and sourceFilesBasdec (d: basdec): unit = case node d of Ann (_, _, dec) => sourceFilesBasdec dec | Basis basbnds => Vector.foreach (basbnds, fn {def, ...} => sourceFilesBasexp def) | Defs _ => () | Local (dec1, dec2) => (sourceFilesBasdec dec1 ; sourceFilesBasdec dec2) | MLB ({fileAbs, ...}, dec) => let val b = psi fileAbs in if !b then () else let val () = b := true in Buffer.add (sourceFiles, fileAbs) ; sourceFilesBasdec (Promise.force dec) end end | Open _ => () | Prim => () | Prog ({fileUse, ...}, _) => Buffer.add (sourceFiles, fileUse) | Seq decs => List.foreach (decs, sourceFilesBasdec) val () = sourceFilesBasdec d in Buffer.toVector sourceFiles end val sourceFiles = Trace.trace ("AstMLBs.sourceFiles", Layout.ignore, Vector.layout File.layout) sourceFiles structure Basexp = struct open Wrap type basdec = basdec type t = basexp datatype node = datatype basexpNode type node' = node type obj = t val layout = layoutBasexp end structure Basdec = struct open Wrap type t = basdec datatype node = datatype basdecNode type node' = node type obj = t fun make n = makeRegion (n, Region.bogus) val seq = make o Seq val empty = seq [] val checkSyntax = checkSyntaxBasdec val layout = layoutBasdec val sourceFiles = sourceFiles end end mlton-20100608/mlton/ast/ast-mlbs.sig0000644000076600000240000000306311404435623015731 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AST_MLBS_STRUCTS = sig include AST_ATOMS_STRUCTS end signature AST_MLBS = sig include AST_PROGRAMS structure Basexp: sig type basdec type t datatype node = Bas of basdec | Let of basdec * t | Var of Basid.t include WRAPPED sharing type node' = node sharing type obj = t val layout: t -> Layout.t end structure Basdec: sig type t datatype node = Ann of string * Region.t * t | Basis of {name: Basid.t, def: Basexp.t} vector | Defs of ModIdBind.t | Local of t * t | MLB of {fileAbs: File.t, fileUse: File.t} * t Promise.t | Open of Basid.t vector | Prim | Prog of {fileAbs: File.t, fileUse: File.t} * Program.t Promise.t | Seq of t list include WRAPPED sharing type node' = node sharing type obj = t val empty: t val seq: t list -> t val checkSyntax: t -> unit val layout: t -> Layout.t val sourceFiles: t -> File.t vector end sharing type Basdec.t = Basexp.basdec end mlton-20100608/mlton/ast/ast-modules.fun0000644000076600000240000004173111404435623016456 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AstModules (S: AST_MODULES_STRUCTS): AST_MODULES = struct open S structure AstCore = AstCore (AstAtoms (S)) open AstCore Layout val layouts = List.map structure Wrap = Region.Wrap val node = Wrap.node structure Equation = struct open Wrap datatype node = Type of Longtycon.t list | Structure of Longstrid.t list type t = node Wrap.t type node' = node type obj = t fun layout eq = case node eq of Type longtycons => seq (str "sharing type " :: separate (List.map (longtycons, Longtycon.layout), " = ")) | Structure longstrids => seq (str "sharing " :: separate (List.map (longstrids, Longstrid.layout), " = ")) end type typedescs = {tyvars: Tyvar.t vector, tycon: Tycon.t} vector datatype sigexpNode = Var of Sigid.t | Where of sigexp * {tyvars: Tyvar.t vector, longtycon: Longtycon.t, ty: Type.t} vector | Spec of spec and sigConst = None | Transparent of sigexp | Opaque of sigexp and specNode = Datatype of DatatypeRhs.t | Empty | Eqtype of typedescs | Exception of (Con.t * Type.t option) vector | IncludeSigexp of sigexp | IncludeSigids of Sigid.t vector | Seq of spec * spec | Sharing of {equations: Equation.t vector, spec: spec} | Structure of (Strid.t * sigexp) vector | Type of typedescs | TypeDefs of TypBind.t | Val of (Var.t * Type.t) vector withtype spec = specNode Wrap.t and sigexp = sigexpNode Wrap.t fun layoutTypedescs (prefix, typedescs) = layoutAnds (prefix, typedescs, fn (prefix, {tyvars, tycon}) => seq [prefix, Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout)]) fun layoutTypedefs (prefix, typBind) = let val TypBind.T ds = TypBind.node typBind in layoutAnds (prefix, ds, fn (prefix, {def, tycon, tyvars}) => seq [prefix, Type.layoutApp (Tycon.layout tycon, tyvars, Tyvar.layout), str " = ", Type.layout def]) end fun layoutSigexp (e: sigexp): Layout.t = case node e of Var s => Sigid.layout s | Where (e, ws) => let val e = layoutSigexp e in if 0 = Vector.length ws then e else seq [e, layoutAndsBind (" where", "=", ws, fn {tyvars, longtycon, ty} => (OneLine, seq [str "type ", Type.layoutApp (Longtycon.layout longtycon, tyvars, Tyvar.layout)], Type.layout ty))] end | Spec s => align [str "sig", indent (layoutSpec s, 3), str "end"] and layoutSigConst sigConst = case sigConst of None => empty | Transparent s => seq [str ": ", layoutSigexp s] | Opaque s => seq [str " :> ", layoutSigexp s] and layoutSpec (s: spec): t = case node s of Datatype rhs => DatatypeRhs.layout rhs | Empty => empty | Eqtype typedescs => layoutTypedescs ("eqtype", typedescs) | Exception sts => layoutAnds ("exception", sts, fn (prefix, (c, to)) => seq [prefix, Con.layout c, Type.layoutOption to]) | IncludeSigexp s => seq [str "include ", layoutSigexp s] | IncludeSigids sigids => seq (str "include " :: separate (Vector.toListMap (sigids, Sigid.layout), " ")) | Seq (s, s') => align [layoutSpec s, layoutSpec s'] | Sharing {spec, equations} => align [layoutSpec spec, align (Vector.toListMap (equations, Equation.layout))] | Structure l => layoutAndsBind ("structure", ":", l, fn (strid, sigexp) => (case node sigexp of Var _ => OneLine | _ => Split 3, Strid.layout strid, layoutSigexp sigexp)) | Type typedescs => layoutTypedescs ("type", typedescs) | TypeDefs typedefs => layoutTypedefs ("type", typedefs) | Val sts => layoutAndsBind ("val", ":", sts, fn (x, t) => (OneLine, Var.layout x, Type.layout t)) fun checkSyntaxSigexp (e: sigexp): unit = case node e of Spec s => checkSyntaxSpec s | Var _ => () | Where (e, v) => (checkSyntaxSigexp e ; Vector.foreach (v, fn {ty, ...} => Type.checkSyntax ty)) and checkSyntaxSigConst (s: sigConst): unit = case s of None => () | Opaque e => checkSyntaxSigexp e | Transparent e => checkSyntaxSigexp e and checkSyntaxSpec (s: spec): unit = let fun term () = layoutSpec s in case node s of Datatype d => DatatypeRhs.checkSyntax d | Eqtype v => reportDuplicates (v, {equals = (fn ({tycon = c, ...}, {tycon = c', ...}) => Tycon.equals (c, c')), layout = Tycon.layout o #tycon, name = "type", region = Tycon.region o #tycon, term = term}) | Empty => () | Exception v => (Vector.foreach (v, fn (_, to) => Option.app (to, Type.checkSyntax)) ; (reportDuplicates (v, {equals = fn ((c, _), (c', _)) => Con.equals (c, c'), layout = Con.layout o #1, name = "exception", region = Con.region o #1, term = term}))) | IncludeSigexp e => checkSyntaxSigexp e | IncludeSigids _ => () | Seq (s, s') => (checkSyntaxSpec s; checkSyntaxSpec s') | Sharing {spec, ...} => checkSyntaxSpec spec | Structure v => (Vector.foreach (v, checkSyntaxSigexp o #2) ; (reportDuplicates (v, {equals = fn ((s, _), (s', _)) => Strid.equals (s, s'), layout = Strid.layout o #1, name = "structure specification", region = Strid.region o #1, term = term}))) | Type v => reportDuplicates (v, {equals = (fn ({tycon = c, ...}, {tycon = c', ...}) => Tycon.equals (c, c')), layout = Tycon.layout o #tycon, name = "type specification", region = Tycon.region o #tycon, term = term}) | TypeDefs b => TypBind.checkSyntax b | Val v => (Vector.foreach (v, fn (_, t) => Type.checkSyntax t) ; (reportDuplicates (v, {equals = fn ((x, _), (x', _)) => Var.equals (x, x'), layout = Var.layout o #1, name = "value specification", region = Var.region o #1, term = term}))) end structure Sigexp = struct open Wrap type spec = spec type t = sigexp datatype node = datatype sigexpNode type node' = node type obj = t val checkSyntax = checkSyntaxSigexp fun wheree (sigexp: t, wherespecs, region): t = if 0 = Vector.length wherespecs then sigexp else makeRegion (Where (sigexp, wherespecs), region) fun make n = makeRegion (n, Region.bogus) val spec = make o Spec val layout = layoutSigexp end structure SigConst = struct datatype t = datatype sigConst val checkSyntax = checkSyntaxSigConst val layout = layoutSigConst end structure Spec = struct open Wrap datatype node = datatype specNode type t = spec type node' = node type obj = t val checkSyntax = checkSyntaxSpec val layout = layoutSpec end (*---------------------------------------------------*) (* Strdecs and Strexps *) (*---------------------------------------------------*) datatype strdecNode = Core of Dec.t | Local of strdec * strdec | Seq of strdec list | Structure of {constraint: SigConst.t, def: strexp, name: Strid.t} vector and strexpNode = App of Fctid.t * strexp | Constrained of strexp * SigConst.t | Let of strdec * strexp | Struct of strdec | Var of Longstrid.t withtype strexp = strexpNode Wrap.t and strdec = strdecNode Wrap.t fun layoutStrdec d = case node d of Core d => Dec.layout d | Local (d, d') => Pretty.locall (layoutStrdec d, layoutStrdec d') | Seq ds => align (layoutStrdecs ds) | Structure strbs => layoutAndsBind ("structure", "=", strbs, fn {name, def, constraint} => (case node def of Var _ => OneLine | _ => Split 3, seq [Strid.layout name, SigConst.layout constraint], layoutStrexp def)) and layoutStrdecs ds = layouts (ds, layoutStrdec) and layoutStrexp exp = case node exp of App (f, e) => seq [Fctid.layout f, str " ", paren (layoutStrexp e)] | Constrained (e, c) => mayAlign [layoutStrexp e, SigConst.layout c] | Let (dec, strexp) => Pretty.lett (layoutStrdec dec, layoutStrexp strexp) | Struct d => align [str "struct", indent (layoutStrdec d, 3), str "end"] | Var s => Longstrid.layout s fun checkSyntaxStrdec (d: strdec): unit = case node d of Core d => Dec.checkSyntax d | Local (d, d') => (checkSyntaxStrdec d; checkSyntaxStrdec d') | Seq ds => List.foreach (ds, checkSyntaxStrdec) | Structure v => (Vector.foreach (v, fn {constraint, def, ...} => (SigConst.checkSyntax constraint ; checkSyntaxStrexp def)) ; (reportDuplicates (v, {equals = (fn ({name = n, ...}, {name = n', ...}) => Strid.equals (n, n')), layout = Strid.layout o #name, name = "structure definition", region = Strid.region o #name, term = fn () => layoutStrdec d}))) and checkSyntaxStrexp (e: strexp): unit = case node e of App (_, e) => checkSyntaxStrexp e | Constrained (e, c) => (checkSyntaxStrexp e ; SigConst.checkSyntax c) | Let (d, e) => (checkSyntaxStrdec d ; checkSyntaxStrexp e) | Struct d => checkSyntaxStrdec d | Var _ => () structure Strexp = struct open Wrap type strdec = strdec type t = strexp datatype node = datatype strexpNode type node' = node type obj = t val checkSyntax = checkSyntaxStrexp fun make n = makeRegion (n, Region.bogus) val constrained = make o Constrained val lett = make o Let val layout = layoutStrexp end structure Strdec = struct open Wrap type t = strdec datatype node = datatype strdecNode type node' = node type obj = t val checkSyntax = checkSyntaxStrdec fun make n = makeRegion (n, Region.bogus) val core = make o Core val openn = core o Dec.openn val layout = layoutStrdec val fromExp = core o Dec.fromExp val trace = Trace.trace ("AstModules.Strdec.coalesce", layout, layout) fun coalesce (d: t): t = trace (fn d => case node d of Core _ => d | Local (d1, d2) => let val d1 = coalesce d1 val d2 = coalesce d2 val node = case (node d1, node d2) of (Core d1', Core d2') => Core (Dec.makeRegion (Dec.Local (d1', d2'), Region.append (region d1, region d2))) | _ => Local (d1, d2) in makeRegion (node, region d) end | Seq ds => let fun finish (ds: Dec.t list, ac: t list): t list = case ds of [] => ac | _ => let val d = makeRegion (Core (Dec.makeRegion (Dec.SeqDec (Vector.fromListRev ds), Region.bogus)), Region.bogus) in d :: ac end fun loop (ds, cores, ac) = case ds of [] => finish (cores, ac) | d :: ds => let val d = coalesce d in case node d of Core d => loop (ds, d :: cores, ac) | Seq ds' => loop (ds' @ ds, cores, ac) | _ => loop (ds, [], d :: finish (cores, ac)) end val r = region d in case loop (ds, [], []) of [] => makeRegion (Core (Dec.makeRegion (Dec.SeqDec (Vector.new0 ()), r)), r) | [d] => d | ds => makeRegion (Seq (rev ds), r) end | Structure _ => d) d end structure FctArg = struct open Wrap datatype node = Structure of Strid.t * Sigexp.t | Spec of Spec.t type t = node Wrap.t type node' = node type obj = t fun layout a = case node a of Structure (strid, sigexp) => seq [Strid.layout strid, str ": ", Sigexp.layout sigexp] | Spec spec => Spec.layout spec fun checkSyntax (fa: t): unit = case node fa of Structure (_, e) => Sigexp.checkSyntax e | Spec s => Spec.checkSyntax s end structure Topdec = struct open Wrap datatype node = Functor of {arg: FctArg.t, body: Strexp.t, name: Fctid.t, result: SigConst.t} vector | Signature of (Sigid.t * Sigexp.t) vector | Strdec of Strdec.t type t = node Wrap.t type node' = node type obj = t fun layout d = case node d of Functor fctbs => layoutAndsBind ("functor", "=", fctbs, fn {name, arg, result, body} => (Split 0, seq [Fctid.layout name, str " ", paren (FctArg.layout arg), layoutSigConst result], layoutStrexp body)) | Signature sigbs => layoutAndsBind ("signature", "=", sigbs, fn (name, def) => (case Sigexp.node def of Sigexp.Var _ => OneLine | _ => Split 3, Sigid.layout name, Sigexp.layout def)) | Strdec d => Strdec.layout d fun make n = makeRegion (n, Region.bogus) val fromExp = make o Strdec o Strdec.fromExp fun checkSyntax (d: t): unit = case node d of Functor v => (Vector.foreach (v, fn {arg, body, result, ...} => (FctArg.checkSyntax arg ; Strexp.checkSyntax body ; SigConst.checkSyntax result)) ; (reportDuplicates (v, {equals = (fn ({name = n, ...}, {name = n', ...}) => Fctid.equals (n, n')), layout = Fctid.layout o #name, name = "functor definition", region = Fctid.region o #name, term = fn () => layout d}))) | Signature bs => (Vector.foreach (bs, Sigexp.checkSyntax o #2) ; (reportDuplicates (bs, {equals = fn ((s, _), (s', _)) => Sigid.equals (s, s'), layout = Sigid.layout o #1, name = "signature definition", region = Sigid.region o #1, term = fn () => layout d}))) | Strdec d => Strdec.checkSyntax d end end mlton-20100608/mlton/ast/ast-modules.sig0000644000076600000240000001062611404435623016447 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AST_MODULES_STRUCTS = sig include AST_ATOMS_STRUCTS end signature AST_MODULES = sig include AST_CORE structure Sigexp: sig type spec type t datatype node = Spec of spec | Var of Sigid.t | Where of t * {longtycon: Longtycon.t, ty: Type.t, tyvars: Tyvar.t vector} vector include WRAPPED sharing type node' = node sharing type obj = t val wheree: t * {tyvars: Tyvar.t vector, longtycon: Longtycon.t, ty: Type.t} vector * Region.t -> t val spec: spec -> t val layout: t -> Layout.t end structure SigConst: sig datatype t = None | Opaque of Sigexp.t | Transparent of Sigexp.t end structure Equation: sig type t datatype node = Structure of Longstrid.t list | Type of Longtycon.t list include WRAPPED sharing type node' = node sharing type obj = t end structure Spec: sig type t datatype node = Datatype of DatatypeRhs.t | Eqtype of {tycon: Tycon.t, tyvars: Tyvar.t vector} vector | Empty | Exception of (Con.t * Type.t option) vector | IncludeSigexp of Sigexp.t | IncludeSigids of Sigid.t vector | Seq of t * t | Sharing of {equations: Equation.t vector, spec: t} | Structure of (Strid.t * Sigexp.t) vector | Type of {tycon: Tycon.t, tyvars: Tyvar.t vector} vector | TypeDefs of TypBind.t | Val of (Var.t * Type.t) vector include WRAPPED sharing type node' = node sharing type obj = t val layout: t -> Layout.t end sharing type Spec.t = Sigexp.spec structure Strexp: sig type strdec type t datatype node = App of Fctid.t * t | Constrained of t * SigConst.t | Let of strdec * t | Struct of strdec | Var of Longstrid.t include WRAPPED sharing type node' = node sharing type obj = t val constrained: t * SigConst.t -> t val lett: strdec * t -> t val layout: t -> Layout.t end structure Strdec: sig type t datatype node = Core of Dec.t | Local of t * t | Seq of t list | Structure of {constraint: SigConst.t, def: Strexp.t, name: Strid.t} vector include WRAPPED sharing type node' = node sharing type obj = t val coalesce: t -> t val core: Dec.t -> t val layout: t -> Layout.t val openn: Longstrid.t vector -> t end sharing type Strdec.t = Strexp.strdec structure FctArg: sig type t datatype node = Structure of Strid.t * Sigexp.t | Spec of Spec.t include WRAPPED sharing type node' = node sharing type obj = t end structure Topdec: sig type t datatype node = Functor of {arg: FctArg.t, body: Strexp.t, name: Fctid.t, result: SigConst.t} vector | Signature of (Sigid.t * Sigexp.t) vector | Strdec of Strdec.t include WRAPPED sharing type node' = node sharing type obj = t val checkSyntax: t -> unit val fromExp: Exp.t -> t val layout: t -> Layout.t end end mlton-20100608/mlton/ast/ast-programs.fun0000644000076600000240000001235211404435623016635 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AstPrograms (S: AST_PROGRAMS_STRUCTS): AST_PROGRAMS = struct open S structure AstModules = AstModules (S) open AstModules Layout structure Program = struct datatype t = T of Topdec.t list list val empty = T [] fun layout (T dss) = Layout.align (List.map (dss, fn ds => Layout.paren (Layout.align (List.map (ds, Topdec.layout))))) fun checkSyntax (T dss) = List.foreach (dss, fn ds => List.foreach (ds, Topdec.checkSyntax)) fun coalesce (T dss): t = let fun finish (sds, ac) = case sds of [] => ac | _ => let val t = Topdec.makeRegion (Topdec.Strdec (Strdec.makeRegion (Strdec.Seq (rev sds), Region.bogus)), Region.bogus) in t :: ac end fun loop (ds, sds, ac) = case ds of [] => finish (sds, ac) | d :: ds => case Topdec.node d of Topdec.Strdec d => loop (ds, d :: sds, ac) | _ => loop (ds, [], d :: finish (sds, ac)) in T (List.map (dss, fn ds => rev (loop (ds, [], [])))) end val coalesce = Trace.trace ("AstPrograms.Program.coalesce", layout, layout) coalesce fun size (T dss): int = let val n = ref 0 fun inc () = n := 1 + !n fun dec (d: Dec.t): unit = let datatype z = datatype Dec.node in case Dec.node d of Abstype {body, ...} => dec body | Exception cs => Vector.foreach (cs, fn _ => inc ()) | Fun (_, ds) => Vector.foreach (ds, fn clauses => Vector.foreach (clauses, exp o #body)) | Local (d, d') => (dec d; dec d') | SeqDec ds => Vector.foreach (ds, dec) | Val {vbs, rvbs, ...} => (Vector.foreach (vbs, exp o #exp) ; Vector.foreach (rvbs, match o #match)) | _ => () end and exp (e: Exp.t): unit = let val _ = inc () datatype z = datatype Exp.node in case Exp.node e of Andalso (e1, e2) => (exp e1; exp e2) | App (e, e') => (exp e; exp e') | Case (e, m) => (exp e; match m) | Constraint (e, _) => exp e | FlatApp es => exps es | Fn m => match m | Handle (e, m) => (exp e; match m) | If (e1, e2, e3) => (exp e1; exp e2; exp e3) | Let (d, e) => (dec d; exp e) | List es => Vector.foreach (es, exp) | Orelse (e1, e2) => (exp e1; exp e2) | Raise exn => exp exn | Record r => Record.foreach (r, exp) | Seq es => exps es | While {test, expr} => (exp test; exp expr) | _ => () end and exps es = Vector.foreach (es, exp) and match m = let val Match.T rules = Match.node m in Vector.foreach (rules, exp o #2) end fun strdec d = let datatype z = datatype Strdec.node in case Strdec.node d of Core d => dec d | Local (d, d') => (strdec d; strdec d') | Seq ds => List.foreach (ds, strdec) | Structure ds => Vector.foreach (ds, fn {def, ...} => strexp def) end and strexp e = let datatype z = datatype Strexp.node in case Strexp.node e of Struct d => strdec d | Constrained (e, _) => strexp e | App (_, e) => strexp e | Let (d, e) => (strdec d; strexp e) | _ => () end fun topdec d = let datatype z = datatype Topdec.node in case Topdec.node d of Functor ds => Vector.foreach (ds, fn {body, ...} => strexp body) | Strdec d => strdec d | _ => () end val _ = List.foreach (dss, fn ds => List.foreach (ds, topdec)) in !n end (* quell unused warning *) val _ = size end end mlton-20100608/mlton/ast/ast-programs.sig0000644000076600000240000000123011404435623016620 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AST_PROGRAMS_STRUCTS = sig include AST_ATOMS_STRUCTS end signature AST_PROGRAMS = sig include AST_MODULES structure Program: sig datatype t = T of Topdec.t list list val checkSyntax: t -> unit val coalesce: t -> t val empty: t val size: t -> int val layout: t -> Layout.t end end mlton-20100608/mlton/ast/ast.fun0000644000076600000240000000054211404435623015003 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Ast (S: AST_STRUCTS): AST = struct open S structure AstMLBs = AstMLBs (S) open AstMLBs end mlton-20100608/mlton/ast/ast.sig0000644000076600000240000000056711404435623015004 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AST_STRUCTS = sig include AST_ATOMS_STRUCTS end signature AST = sig include AST_MLBS end mlton-20100608/mlton/ast/char-size.fun0000644000076600000240000000154511404435623016105 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CharSize (S: CHAR_SIZE_STRUCTS): CHAR_SIZE = struct open S datatype t = C8 | C16 | C32 val all = [C8, C16, C32] fun bits s = Bits.fromInt (case s of C8 => 8 | C16 => 16 | C32 => 32) val equals = op = fun fromBits b = case Bits.toInt b of 8 => C8 | 16 => C16 | 32 => C32 | _ => Error.bug "CharSize.frombits" val memoize = fn f => let val c8 = f C8 val c16 = f C16 val c32 = f C32 in fn C8 => c8 | C16 => c16 | C32 => c32 end val cardinality = memoize (fn s => IntInf.pow (2, Bits.toInt (bits s))) fun isInRange (s, i) = 0 <= i andalso i < cardinality s end mlton-20100608/mlton/ast/char-size.sig0000644000076600000240000000104311404435623016070 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHAR_SIZE_STRUCTS = sig end signature CHAR_SIZE = sig include CHAR_SIZE_STRUCTS datatype t = C8 | C16 | C32 val all: t list val bits: t -> Bits.t val equals: t * t -> bool val fromBits: Bits.t -> t val isInRange: t * IntInf.t -> bool val memoize: (t -> 'a) -> t -> 'a end mlton-20100608/mlton/ast/field.fun0000644000076600000240000000141711404435623015301 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Field (S: FIELD_STRUCTS): FIELD = struct open S datatype t = Int of int | Symbol of Symbol.t val equals = fn (Int n, Int n') => Int.equals (n, n') | (Symbol s, Symbol s') => Symbol.equals (s, s') | _ => false val toString = fn Int n => Int.toString (n + 1) | Symbol s => Symbol.toString s val layout = Layout.str o toString val op <= = fn (Int n, Int n') => Int.<= (n, n') | (Symbol s, Symbol s') => Symbol.<= (s, s') | (Symbol _, Int _) => false | (Int _, Symbol _) => true end mlton-20100608/mlton/ast/field.sig0000644000076600000240000000121011404435623015262 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FIELD_STRUCTS = sig structure Symbol: SYMBOL end signature FIELD = sig include FIELD_STRUCTS datatype t = Int of int | Symbol of Symbol.t val <= : t * t -> bool (* ordering used for sorting *) val equals: t * t -> bool val layout: t -> Layout.t val toString: t -> string end mlton-20100608/mlton/ast/int-size.fun0000644000076600000240000000271111404435623015756 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor IntSize (S: INT_SIZE_STRUCTS): INT_SIZE = struct open S datatype t = T of {bits: Bits.t} fun bits (T {bits, ...}) = bits fun compare (s, s') = Bits.compare (bits s, bits s') val {equals, ...} = Relation.compare compare fun isValidSize (i: int) = (1 <= i andalso i <= 32) orelse i = 64 val sizes: Bits.t list = Vector.toList (Vector.keepAllMap (Vector.tabulate (65, fn i => if isValidSize i then SOME (Bits.fromInt i) else NONE), fn i => i)) fun make i = T {bits = i} val allVector = Vector.tabulate (65, fn i => if isValidSize i then SOME (make (Bits.fromInt i)) else NONE) fun fromBits (b: Bits.t): t = case Vector.sub (allVector, Bits.toInt b) handle Subscript => NONE of NONE => Error.bug (concat ["IntSize.fromBits: strange int size: ", Bits.toString b]) | SOME s => s val all = List.map (sizes, fromBits) val memoize: (t -> 'a) -> t -> 'a = fn f => let val v = Vector.map (allVector, fn opt => Option.map (opt, f)) in fn T {bits = b, ...} => valOf (Vector.sub (v, Bits.toInt b)) end end mlton-20100608/mlton/ast/int-size.sig0000644000076600000240000000074011404435623015750 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INT_SIZE_STRUCTS = sig end signature INT_SIZE = sig include INT_SIZE_STRUCTS type t val all: t list val bits: t -> Bits.t val equals: t * t -> bool val fromBits : Bits.t -> t val memoize: (t -> 'a) -> t -> 'a end mlton-20100608/mlton/ast/longid.fun0000644000076600000240000000515111404435623015471 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Longid (S: LONGID_STRUCTS): LONGID = struct open S datatype node = T of {strids: Strid.t list, id: Id.t} type node' = node structure Wrap = Region.Wrap open Wrap type t = node Wrap.t type obj = t fun split id = let val T {strids, id, ...} = node id in (strids, id) end val equals = fn (id, id') => let val T {strids=ss, id=i} = node id val T {strids=ss', id=i'} = node id' in List.equals (ss, ss', Strid.equals) andalso Id.equals (i, i') end fun long (strids, id) = makeRegion (T {strids = strids, id = id}, case strids of [] => Id.region id | s :: _ => Region.append (Strid.region s, Id.region id)) fun short id = long ([], id) fun layout id = let val T {strids, id} = node id open Layout in seq [case strids of [] => empty | _ => seq [seq (separate (List.map (strids, Strid.layout), ".")), str "."], Id.layout id] end val toString = Layout.toString o layout fun fromSymbols (ss: Symbol.t list, region: Region.t): t = let val srs = case Region.left region of NONE => List.map (ss, fn s => (s, region)) | SOME p => let val file = SourcePos.file p val line = SourcePos.line p in List.unfold ((ss, SourcePos.column p), fn (s::ss, cl) => let val cr = cl + String.length (Symbol.toString s) in SOME ((s, Region.make {left = SourcePos.make {column = cl, file = file, line = line}, right = SourcePos.make {column = cr, file = file, line = line}}), (ss, cr + 1)) end | ([], _) => NONE) end val (strids, id) = List.splitLast srs in makeRegion (T {strids = List.map (strids, Strid.fromSymbol), id = Id.fromSymbol id}, region) end end mlton-20100608/mlton/ast/longid.sig0000644000076600000240000000156411404435623015467 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LONGID_STRUCTS = sig structure Id: AST_ID structure Strid: AST_ID structure Symbol: SYMBOL sharing Symbol = Id.Symbol = Strid.Symbol end signature LONGID = sig include LONGID_STRUCTS include T datatype node = T of {strids: Strid.t list, id: Id.t} include WRAPPED sharing type node' = node sharing type obj = t val fromSymbols: Symbol.t list * Region.t -> t val long: Strid.t list * Id.t -> t val short: Id.t -> t val split: t -> Strid.t list * Id.t val toString: t -> string end mlton-20100608/mlton/ast/prim-cons.fun0000644000076600000240000000114311404435623016121 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PrimCons (S: PRIM_CONS_STRUCTS): PRIM_CONS = struct open S type con = t val cons = fromString "::" val falsee = fromString "false" val nill = fromString "nil" val reff = fromString "ref" val truee = fromString "true" (* exception constructors *) val bind = fromString "Bind" val match = fromString "Match" val overflow = fromString "Overflow" end mlton-20100608/mlton/ast/prim-cons.sig0000644000076600000240000000112311404435623016111 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRIM_CONS_STRUCTS = sig type t val equals: t * t -> bool val fromString: string -> t end signature PRIM_CONS = sig type con val bind: con val cons: con val falsee: con val match: con val nill: con val overflow: con val reff: con val truee: con end mlton-20100608/mlton/ast/prim-tycons.fun0000644000076600000240000001650511404435623016506 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PrimTycons (S: PRIM_TYCONS_STRUCTS): PRIM_TYCONS = struct open S structure BindingStrength = struct datatype t = Arrow | Tuple | Unit val unit = Unit end datatype z = datatype RealSize.t type tycon = t local fun make s = (s, fromString s) in val array = make "array" val arrow = make "->" val bool = make "bool" val cpointer = make "cpointer" val exn = make "exn" val intInf = make "intInf" val list = make "list" val reff = make "ref" val thread = make "thread" val tuple = make "*" val vector = make "vector" val weak = make "weak" end datatype z = datatype Kind.t datatype z = datatype AdmitsEquality.t local fun 'a make (prefix: string, all: 'a list, bits: 'a -> Bits.t, equalsA: 'a * 'a -> bool, memo: ('a -> t) -> ('a -> t), admitsEquality: AdmitsEquality.t) = let val all = Vector.fromListMap (all, fn s => let val name = concat [prefix, Bits.toString (bits s)] in {name = name, size = s, tycon = fromString name} end) val fromSize = memo (fn s => case Vector.peek (all, fn {size = s', ...} => equalsA (s, s')) of NONE => Error.bug "PrimTycons.make.fromSize" | SOME {tycon, ...} => tycon) fun is t = Vector.exists (all, fn {tycon = t', ...} => equals (t, t')) fun de t = case Vector.peek (all, fn {tycon = t', ...} => equals (t, t')) of NONE => Error.bug "PrimTycons.make.de" | SOME {size, ...} => size val prims = Vector.toListMap (all, fn {name, tycon, ...} => {admitsEquality = admitsEquality, kind = Arity 0, name = name, tycon = tycon}) val all = Vector.map (all, fn {tycon, size, ...} => (tycon, size)) in (fromSize, all, is, de, prims) end in val (char, _, isCharX, deCharX, primChars) = let open CharSize in make ("char", all, bits, equals, memoize, Sometimes) end val (int, ints, isIntX, deIntX, primInts) = let open IntSize in make ("int", all, bits, equals, memoize, Sometimes) end val (real, reals, isRealX, deRealX, primReals) = let open RealSize in make ("real", all, bits, equals, memoize, Never) end val (word, words, isWordX, deWordX, primWords) = let open WordSize in make ("word", all, bits, equals, memoize, Sometimes) end end val prims = List.map ([(array, Arity 1, Always), (arrow, Arity 2, Never), (bool, Arity 0, Sometimes), (cpointer, Arity 0, Always), (exn, Arity 0, Never), (intInf, Arity 0, Sometimes), (list, Arity 1, Sometimes), (reff, Arity 1, Always), (thread, Arity 0, Never), (tuple, Nary, Sometimes), (vector, Arity 1, Sometimes), (weak, Arity 1, Never)], fn ((name, tycon), kind, admitsEquality) => {admitsEquality = admitsEquality, kind = kind, name = name, tycon = tycon}) @ primChars @ primInts @ primReals @ primWords val array = #2 array val arrow = #2 arrow val bool = #2 bool val cpointer = #2 cpointer val exn = #2 exn val intInf = #2 intInf val list = #2 list val reff = #2 reff val thread = #2 thread val tuple = #2 tuple val vector = #2 vector val weak = #2 weak val defaultChar = fn () => case !Control.defaultChar of "char8" => char CharSize.C8 | _ => Error.bug "PrimTycons.defaultChar" val defaultInt = fn () => case !Control.defaultInt of "int8" => int (IntSize.fromBits (Bits.fromInt 8)) | "int16" => int (IntSize.fromBits (Bits.fromInt 16)) | "int32" => int (IntSize.fromBits (Bits.fromInt 32)) | "int64" => int (IntSize.fromBits (Bits.fromInt 64)) | "intinf" => intInf | _ => Error.bug "PrimTycons.defaultInt" val defaultReal = fn () => case !Control.defaultReal of "real32" => real RealSize.R32 | "real64" => real RealSize.R64 | _ => Error.bug "PrimTycons.defaultReal" val defaultWord = fn () => case !Control.defaultWord of "word8" => word (WordSize.fromBits (Bits.fromInt 8)) | "word16" => word (WordSize.fromBits (Bits.fromInt 16)) | "word32" => word (WordSize.fromBits (Bits.fromInt 32)) | "word64" => word (WordSize.fromBits (Bits.fromInt 64)) | _ => Error.bug "PrimTycons.defaultWord" val isBool = fn c => equals (c, bool) val isCPointer = fn c => equals (c, cpointer) val isIntX = fn c => equals (c, intInf) orelse isIntX c val deIntX = fn c => if equals (c, intInf) then NONE else SOME (deIntX c) fun layoutApp (c: t, args: (Layout.t * ({isChar: bool} * BindingStrength.t)) vector) = let local open Layout in val mayAlign = mayAlign val seq = seq val str = str end datatype z = datatype BindingStrength.t datatype binding_context = ArrowLhs | ArrowRhs | TupleElem | Tyseq1 | TyseqN fun maybe bindingContext (l, ({isChar = _}, bindingStrength)) = case (bindingStrength, bindingContext) of (Unit, _) => l | (Tuple, ArrowLhs) => l | (Tuple, ArrowRhs) => l | (Tuple, TyseqN) => l | (Arrow, ArrowRhs) => l | (Arrow, TyseqN) => l | _ => Layout.paren l fun normal () = let val ({isChar}, lay) = case Vector.length args of 0 => ({isChar = equals (c, defaultChar ())}, layout c) | 1 => ({isChar = false}, seq [maybe Tyseq1 (Vector.sub (args, 0)), str " ", layout c]) | _ => ({isChar = false}, seq [Layout.tuple (Vector.toListMap (args, maybe TyseqN)), str " ", layout c]) in (lay, ({isChar = isChar}, Unit)) end in if equals (c, arrow) then (mayAlign [maybe ArrowLhs (Vector.sub (args, 0)), seq [str "-> ", maybe ArrowRhs (Vector.sub (args, 1))]], ({isChar = false}, Arrow)) else if equals (c, tuple) then if 0 = Vector.length args then (str "unit", ({isChar = false}, Unit)) else (mayAlign (Layout.separateLeft (Vector.toListMap (args, maybe TupleElem), "* ")), ({isChar = false}, Tuple)) else if equals (c, vector) then if #isChar (#1 (#2 (Vector.sub (args, 0)))) then (str "string", ({isChar = false}, Unit)) else normal () else normal () end end mlton-20100608/mlton/ast/prim-tycons.sig0000644000076600000240000000440411404435623016473 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRIM_TYCONS_SUBSTRUCTS = sig structure AdmitsEquality: ADMITS_EQUALITY structure CharSize: CHAR_SIZE structure IntSize: INT_SIZE structure Kind: TYCON_KIND structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE end signature PRIM_TYCONS_STRUCTS = sig include PRIM_TYCONS_SUBSTRUCTS type t val fromString: string -> t val equals: t * t -> bool val layout: t -> Layout.t end signature BINDING_STRENGTH = sig type t val unit: t end signature PRIM_TYCONS = sig include PRIM_TYCONS_SUBSTRUCTS structure BindingStrength: BINDING_STRENGTH type tycon val array: tycon val arrow: tycon val bool: tycon val char: CharSize.t -> tycon val cpointer: tycon val deCharX: tycon -> CharSize.t val defaultChar: unit -> tycon val defaultInt: unit -> tycon val defaultReal: unit -> tycon val defaultWord: unit -> tycon val deIntX: tycon -> IntSize.t option val deRealX: tycon -> RealSize.t val deWordX: tycon -> WordSize.t val exn: tycon val int: IntSize.t -> tycon val ints: (tycon * IntSize.t) vector val intInf: tycon val isBool: tycon -> bool val isCharX: tycon -> bool val isCPointer: tycon -> bool val isIntX: tycon -> bool val isRealX: tycon -> bool val isWordX: tycon -> bool val layoutApp: tycon * (Layout.t * ({isChar: bool} * BindingStrength.t)) vector -> Layout.t * ({isChar: bool} * BindingStrength.t) val list: tycon val prims: {admitsEquality: AdmitsEquality.t, kind: Kind.t, name: string, tycon: tycon} list val real: RealSize.t -> tycon val reals: (tycon * RealSize.t) vector val reff: tycon val thread: tycon val tuple: tycon val vector: tycon val weak: tycon val word: WordSize.t -> tycon val words: (tycon * WordSize.t) vector end mlton-20100608/mlton/ast/real-size.fun0000644000076600000240000000126111404435623016106 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RealSize (S: REAL_SIZE_STRUCTS): REAL_SIZE = struct open S datatype t = R32 | R64 val all = [R32, R64] val equals: t * t -> bool = op = val memoize: (t -> 'a) -> t -> 'a = fn f => let val r32 = f R32 val r64 = f R64 in fn R32 => r32 | R64 => r64 end val toString = fn R32 => "32" | R64 => "64" val bytes: t -> Bytes.t = fn R32 => Bytes.fromInt 4 | R64 => Bytes.fromInt 8 val bits: t -> Bits.t = Bytes.toBits o bytes end mlton-20100608/mlton/ast/real-size.sig0000644000076600000240000000102211404435623016073 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REAL_SIZE_STRUCTS = sig end signature REAL_SIZE = sig include REAL_SIZE_STRUCTS datatype t = R32 | R64 val all: t list val bits: t -> Bits.t val bytes: t -> Bytes.t val equals: t * t -> bool val memoize: (t -> 'a) -> t -> 'a val toString: t -> string end mlton-20100608/mlton/ast/record.fun0000644000076600000240000000626411404435623015501 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* empty tuple is also a record *) functor Record (S: RECORD_STRUCTS): RECORD = struct open S datatype 'a t = Tuple of 'a vector | Record of (Field.t * 'a) vector val tuple = Tuple fun toVector r = case r of Tuple v => Vector.mapi (v, fn (i, x) => (Field.Int i, x)) | Record r => r fun detupleOpt (r: 'a t): 'a vector option = case r of Tuple t => SOME t | Record _ => NONE fun sort v = QuickSort.sortVector (v, fn ((s, _), (s', _)) => Field.<= (s, s')) fun fromVector v = let fun isTuple v : bool = Vector.foralli (v, fn (i, (f, _)) => case f of Field.Int i' => Int.equals (i, i') | _ => false) val v = if isSorted then sort v else v in if isTuple v then Tuple (Vector.map (v, #2)) else Record v end val peek: 'a t * Field.t -> 'a option = fn (r, f) => case r of Record r => (case Vector.peek (r, fn (f', _) => Field.equals (f, f')) of NONE => NONE | SOME (_, x) => SOME x) | Tuple t => if Vector.isEmpty t then NONE else (case f of Field.Int i => if 0 <= i andalso i < Vector.length t then SOME (Vector.sub (t, i)) else NONE | Field.Symbol _ => NONE) fun range r = case r of Tuple t => t | Record r => Vector.map (r, #2) fun exists (r, p) = case r of Tuple xs => Vector.exists (xs, p) | Record r => Vector.exists (r, fn (_, x) => p x) fun forall (r, p) = not (exists (r, not o p)) fun map (r: 'a t, f: 'a -> 'b): 'b t = case r of Tuple xs => Tuple (Vector.map (xs, f)) | Record r => Record (Vector.map (r, fn (field, a) => (field, f a))) fun foreach (r: 'a t, f: 'a -> unit): unit = case r of Tuple xs => Vector.foreach (xs, f) | Record r => Vector.foreach (r, f o #2) fun change (r: 'a t, f: 'a vector -> 'b vector * 'c): 'b t * 'c = case r of Tuple xs => let val (ys, c) = f xs in (Tuple ys, c) end | Record r => let val (fs, xs) = Vector.unzip r val (ys, c) = f xs in (Record (Vector.zip (fs, ys)), c) end fun zip z = fromVector (Vector.zip z) fun layout {record, layoutTuple, separator, extra, layoutElt} = case (record, extra) of (Tuple xs, "") => layoutTuple xs | _ => let val r = toVector record open Layout in seq [str "{", mayAlign (separateRight (Vector.toListMap (r, fn (f, x) => seq [Field.layout f, str separator, layoutElt x]), ",")), str extra, str "}"] end end mlton-20100608/mlton/ast/record.sig0000644000076600000240000000273611404435623015473 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RECORD_STRUCTS = sig val isSorted: bool structure Field: FIELD end signature RECORD = sig include RECORD_STRUCTS type 'a t (* Create a record with the same fields but a new range. * Also return some additional info. *) val change: 'a t * ('a vector -> 'b vector * 'c) -> 'b t * 'c (* detuple r returns the components, if r is a tuple *) val detupleOpt: 'a t -> 'a vector option val exists: 'a t * ('a -> bool) -> bool val forall: 'a t * ('a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val fromVector: (Field.t * 'a) vector -> 'a t val layout: {record: 'a t, separator: string, extra: string, layoutTuple: 'a vector -> Layout.t, layoutElt: 'a -> Layout.t} -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val peek: 'a t * Field.t -> 'a option (* range {1 = a, 2 = b, 3 = c} returns [a, b, c] *) val range: 'a t -> 'a vector val toVector: 'a t -> (Field.t * 'a) vector (* tuple [a, b, c] creates {1 = a, 2 = b, 3 = c} *) val tuple: 'a vector -> 'a t val zip: Field.t vector * 'a vector -> 'a t end mlton-20100608/mlton/ast/sources.cm0000644000076600000240000000247511404435623015515 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature ADMITS_EQUALITY signature AST signature BINDING_STRENGTH signature CHAR_SIZE signature FIELD signature INT_SIZE signature LONGID signature PRIM_CONS signature PRIM_TYCONS signature REAL_SIZE signature RECORD signature SYMBOL signature TYCON_KIND signature TYVAR signature WORD_SIZE signature WRAPPED functor AdmitsEquality functor Ast functor Field functor PrimCons functor PrimTycons functor Record functor Symbol functor TyconKind functor Tyvar is ../../lib/mlton/sources.cm ../control/sources.cm admits-equality.sig admits-equality.fun wrapped.sig ast-const.sig ast-const.fun symbol.sig symbol.fun ast-id.sig ast-id.fun field.sig field.fun char-size.sig char-size.fun int-size.sig int-size.fun longid.sig longid.fun prim-cons.sig prim-cons.fun real-size.sig real-size.fun word-size.sig word-size.fun tycon-kind.sig tycon-kind.fun prim-tycons.sig prim-tycons.fun record.sig record.fun tyvar.sig tyvar.fun ast-atoms.sig ast-atoms.fun ast-core.sig ast-core.fun ast-modules.sig ast-modules.fun ast-programs.sig ast-programs.fun ast-mlbs.sig ast-mlbs.fun ast.sig ast.fun mlton-20100608/mlton/ast/sources.mlb0000644000076600000240000000272511404435623015666 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../control/sources.mlb admits-equality.sig admits-equality.fun wrapped.sig ast-const.sig ast-const.fun symbol.sig symbol.fun ast-id.sig ast-id.fun field.sig field.fun char-size.sig char-size.fun int-size.sig int-size.fun longid.sig longid.fun prim-cons.sig prim-cons.fun real-size.sig real-size.fun word-size.sig word-size.fun tycon-kind.sig tycon-kind.fun prim-tycons.sig prim-tycons.fun record.sig record.fun tyvar.sig tyvar.fun ast-atoms.sig ast-atoms.fun ast-core.sig ast-core.fun ast-modules.sig ast-modules.fun ast-programs.sig ast-programs.fun ast-mlbs.sig ast-mlbs.fun ast.sig ast.fun in signature ADMITS_EQUALITY signature AST signature BINDING_STRENGTH signature CHAR_SIZE signature FIELD signature INT_SIZE signature PRIM_CONS signature PRIM_TYCONS signature REAL_SIZE signature RECORD signature TYCON_KIND signature TYVAR signature WORD_SIZE functor AdmitsEquality functor Ast functor Field functor PrimCons functor PrimTycons functor Record functor Symbol functor TyconKind functor Tyvar end mlton-20100608/mlton/ast/symbol.fun0000644000076600000240000000232411404435623015521 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Symbol (S: SYMBOL_STRUCTS): SYMBOL = struct open S datatype t = T of {hash: word, name: string, plist: PropertyList.t} local fun make f (T r) = f r in val hash = make #hash val plist = make #plist val name = make #name end val table: t HashSet.t = HashSet.new {hash = hash} fun fromString s = let val hash = String.hash s in HashSet.lookupOrInsert (table, hash, fn T {name, ...} => s = name, fn () => T {hash = hash, name = s, plist = PropertyList.new ()}) end fun foreach f = HashSet.foreach (table, f) val toString = name val layout = Layout.str o toString fun equals (s, s') = PropertyList.equals (plist s, plist s') local fun make f (s, s') = f (name s, name s') in val op <= = make String.<= val compare = make String.compare end val asterisk = fromString "*" val bogus = fromString "" val equal = fromString "=" val itt = fromString "it" val unit = fromString "unit" end mlton-20100608/mlton/ast/symbol.sig0000644000076600000240000000142611404435623015515 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SYMBOL_STRUCTS = sig end signature SYMBOL = sig include SYMBOL_STRUCTS type t (* <= is alphabetical order *) val <= : t * t -> bool val asterisk: t val bogus: t val compare: t * t -> Relation.t val equal: t val equals: t * t -> bool val foreach: (t -> unit) -> unit val fromString: string -> t val hash: t -> word val itt: t val layout: t -> Layout.t val plist: t -> PropertyList.t val toString: t -> string val unit: t end mlton-20100608/mlton/ast/tycon-kind.fun0000644000076600000240000000110011404435623016262 0ustar mtfstaff(* Copyright (C) 2003-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TyconKind (S: TYCON_KIND_STRUCTS): TYCON_KIND = struct open S datatype t = Arity of int | Nary val layout = fn Arity n => Int.layout n | Nary => Layout.str "n-ary" val equals = fn (Arity n, Arity n') => n = n' | (Nary, Nary) => true | _ => false val equals = Trace.trace2 ("TyconKind.equals", layout, layout, Bool.layout) equals end mlton-20100608/mlton/ast/tycon-kind.sig0000644000076600000240000000073411404435623016270 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYCON_KIND_STRUCTS = sig end signature TYCON_KIND = sig include TYCON_KIND_STRUCTS datatype t = Arity of int | Nary val equals: t * t -> bool val layout: t -> Layout.t end mlton-20100608/mlton/ast/tyvar.fun0000644000076600000240000000437611404435623015372 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Tyvar (S: TYVAR_STRUCTS): TYVAR = struct open S structure Wrap = Region.Wrap open Wrap type node' = {name: string, equality: bool, hash: Word.t, plist: PropertyList.t} type t = node' Wrap.t type obj = t fun toString (tyvar: t) = let val {name, equality, ...} = node tyvar in (if equality then "''" else "'") ^ name end val layout = Layout.str o toString local fun make sel (tyvar:t) = sel (node tyvar) in val name = make #name val hash = make #hash val plist = make #plist val isEquality = make #equality end val clear = PropertyList.clear o plist fun equals (a, a') = PropertyList.equals (plist a, plist a') fun sameName (a, a') = String.equals (name a, name a') fun newRegion ({name, equality}, region) = makeRegion ({name = name, equality = equality, hash = Random.word (), plist = PropertyList.new ()}, region) fun new f = newRegion (f, Region.bogus) fun newLike a = newRegion ({equality = isEquality a, name = name a}, region a) fun newString (s, {left, right}) = newRegion (if String.size s > 1 andalso Char.equals (#"'", String.sub (s, 1)) then {name = String.dropPrefix (s, 2), equality = true} else {name = String.dropPrefix (s, 1), equality = false}, Region.make {left = left, right = right}) (*val make = Trace.trace2 ("Tyvar.make", String.layout, Bool.layout, * layout) make *) local val c = Counter.new 0 in fun reset () = Counter.reset (c, 0) (* quell unused warning *) val _ = reset fun newNoname {equality} = new {name = "a_" ^ Int.toString (Counter.next c), equality = equality} end local open Layout in fun layouts ts = case Vector.length ts of 0 => empty | 1 => layout (Vector.sub (ts, 0)) | _ => Vector.layout layout ts end end mlton-20100608/mlton/ast/tyvar.sig0000644000076600000240000000222111404435623015347 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYVAR_STRUCTS = sig end signature TYVAR = sig include TYVAR_STRUCTS include T include WRAPPED sharing type obj = t val clear: t -> unit val hash: t -> Word.t val isEquality: t -> bool val layouts: t vector -> Layout.t val name: t -> string val newLike: t -> t (* newNoname creates a new type variable named a_n, where n is a * counter. *) val newNoname: {equality: bool} -> t (* newString "'a" creates a type variable named a * newString "''a" creates an equality type variable named a *) val newString: string * {left: SourcePos.t, right: SourcePos.t} -> t val plist: t -> PropertyList.t (* reset the counter for new type variables *) val reset: unit -> unit val sameName: t * t -> bool val toString: t -> string end mlton-20100608/mlton/ast/word-size.fun0000644000076600000240000000630311404435623016140 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor WordSize (S: WORD_SIZE_STRUCTS): WORD_SIZE = struct open S datatype t = T of Bits.t fun bits (T b) = b val toString = Bits.toString o bits fun compare (s, s') = Bits.compare (bits s, bits s') val {equals, ...} = Relation.compare compare fun fromBits (b: Bits.t): t = if Bits.>= (b, Bits.zero) then T b else Error.bug (concat ["WordSize.fromBits: strange word size: ", Bits.toString b]) fun isValidSize (i: int) = (1 <= i andalso i <= 32) orelse i = 64 val byte = fromBits (Bits.inByte) fun bigIntInfWord () = fromBits (Control.Target.Size.mplimb ()) fun cint () = fromBits (Control.Target.Size.cint ()) fun cpointer () = fromBits (Control.Target.Size.cpointer ()) fun cptrdiff () = fromBits (Control.Target.Size.cptrdiff ()) fun csize () = fromBits (Control.Target.Size.csize ()) fun objptr () = fromBits (Control.Target.Size.objptr ()) fun objptrHeader () = fromBits (Control.Target.Size.header ()) fun seqIndex () = fromBits (Control.Target.Size.seqIndex ()) fun smallIntInfWord () = objptr () val bool = fromBits (Bits.fromInt 32) val compareRes = fromBits (Bits.fromInt 32) val shiftArg = fromBits (Bits.fromInt 32) val word8 = fromBits (Bits.fromInt 8) val word16 = fromBits (Bits.fromInt 16) val word32 = fromBits (Bits.fromInt 32) val word64 = fromBits (Bits.fromInt 64) val allVector = Vector.tabulate (65, fn i => if isValidSize i then SOME (fromBits (Bits.fromInt i)) else NONE) val all: t list = Vector.toList (Vector.keepAllMap (allVector, fn so => so)) val prims = List.map ([8, 16, 32, 64], fromBits o Bits.fromInt) val memoize: (t -> 'a) -> t -> 'a = fn f => let val v = Vector.map (allVector, fn opt => Option.map (opt, f)) in fn s => valOf (Vector.sub (v, Bits.toInt (bits s))) end fun roundUpToPrim s = let val bits = Bits.toInt (bits s) val bits = if bits <= 8 then 8 else if bits <= 16 then 16 else if bits <= 32 then 32 else if bits = 64 then 64 else Error.bug "WordSize.roundUpToPrim" in fromBits (Bits.fromInt bits) end val bytes: t -> Bytes.t = Bits.toBytes o bits fun cardinality s = IntInf.<< (1, Bits.toWord (bits s)) fun range (s, {signed}) = if signed then let val pow = IntInf.<< (1, Bits.toWord (bits s) - 0w1) in (~ pow, pow - 1) end else (0, cardinality s - 1) val min = #1 o range val max = #2 o range fun isInRange (s, i, sg) = let val (min, max) = range (s, sg) in min <= i andalso i <= max end datatype prim = W8 | W16 | W32 | W64 fun primOpt (s: t): prim option = case Bits.toInt (bits s) of 8 => SOME W8 | 16 => SOME W16 | 32 => SOME W32 | 64 => SOME W64 | _ => NONE fun prim s = case primOpt s of NONE => Error.bug "WordSize.prim" | SOME p => p end mlton-20100608/mlton/ast/word-size.sig0000644000076600000240000000254111404435623016132 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature WORD_SIZE_STRUCTS = sig end signature WORD_SIZE = sig include WORD_SIZE_STRUCTS type t val all: t list val bits: t -> Bits.t val bigIntInfWord: unit -> t val bool: t val bytes: t -> Bytes.t val byte: t val cardinality: t -> IntInf.t val cint: unit -> t val compare: t * t -> Relation.t val compareRes: t val cpointer: unit -> t val cptrdiff: unit -> t val csize: unit -> t val equals: t * t -> bool val fromBits: Bits.t -> t val isInRange: t * IntInf.t * {signed: bool} -> bool val max: t * {signed: bool} -> IntInf.t val min: t * {signed: bool} -> IntInf.t val memoize: (t -> 'a) -> t -> 'a val objptr: unit -> t val objptrHeader: unit -> t datatype prim = W8 | W16 | W32 | W64 val prim: t -> prim val prims: t list val roundUpToPrim: t -> t val seqIndex: unit -> t val shiftArg: t val smallIntInfWord: unit -> t val toString: t -> string val word8: t val word16: t val word32: t val word64: t end mlton-20100608/mlton/ast/wrapped.sig0000644000076600000240000000102311404435623015643 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature WRAPPED = sig type node' type obj val dest: obj -> node' * Region.t val makeRegion': node' * SourcePos.t * SourcePos.t -> obj val makeRegion: node' * Region.t -> obj val node: obj -> node' val region: obj -> Region.t end mlton-20100608/mlton/atoms/0000755000076600000240000000000011404470407014034 5ustar mtfstaffmlton-20100608/mlton/atoms/atoms.fun0000644000076600000240000000430511404435623015674 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Atoms (S: ATOMS_STRUCTS): ATOMS = struct structure Atoms = struct open S structure ProfileLabel = ProfileLabel () structure SourceInfo = SourceInfo () structure ProfileExp = ProfileExp (structure SourceInfo = SourceInfo) structure Var = Var () structure Tycon = Tycon (structure CharSize = CharSize structure IntSize = IntSize structure RealSize = RealSize structure WordSize = WordSize) structure Con = Con () structure CType = CType (structure RealSize = RealSize structure WordSize = WordSize) structure WordX = WordX (structure WordSize = WordSize) structure RealX = RealX (structure RealSize = RealSize structure WordX = WordX) structure WordXVector = WordXVector (structure WordSize = WordSize structure WordX = WordX) structure Func = struct open Var fun newNoname () = newString "F" end structure Label = struct open Func fun newNoname () = newString "L" end structure Const = Const (structure RealX = RealX structure WordX = WordX structure WordXVector = WordXVector) structure CFunction = CFunction (structure CType = CType) structure Prim = Prim (structure CFunction = CFunction structure CType = CType structure Con = Con structure Const = Const structure RealSize = RealSize structure WordSize = WordSize) structure Ffi = Ffi (structure CFunction = CFunction structure CType = CType) structure Vars = UnorderedSet (Var) end open Atoms end mlton-20100608/mlton/atoms/atoms.sig0000644000076600000240000000630511404435623015670 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ATOMS_STRUCTS = sig structure Field: FIELD structure CharSize: CHAR_SIZE structure IntSize: INT_SIZE structure RealSize: REAL_SIZE structure Record: RECORD structure SortedRecord: RECORD structure Tyvar: TYVAR structure WordSize: WORD_SIZE sharing Field = Record.Field = SortedRecord.Field end signature ATOMS' = sig include ATOMS_STRUCTS structure CFunction: C_FUNCTION structure CType: C_TYPE structure Con: CON structure Const: CONST structure Ffi: FFI structure Func: FUNC structure Label: LABEL structure Prim: PRIM structure ProfileLabel: PROFILE_LABEL structure ProfileExp: PROFILE_EXP structure RealX: REAL_X structure SourceInfo: SOURCE_INFO structure Tycon: TYCON structure Var: VAR structure Vars: SET structure WordX: WORD_X structure WordXVector: WORD_X_VECTOR sharing CFunction = Ffi.CFunction = Prim.CFunction sharing CType = CFunction.CType = Ffi.CType = Prim.CType sharing CharSize = Tycon.CharSize sharing Con = Prim.Con sharing Const = Prim.Const sharing IntSize = Tycon.IntSize sharing RealSize = CType.RealSize = Prim.RealSize = RealX.RealSize = Tycon.RealSize sharing RealX = Const.RealX sharing SourceInfo = ProfileExp.SourceInfo sharing WordSize = CType.WordSize = Prim.WordSize = Tycon.WordSize = WordX.WordSize sharing WordX = Const.WordX = WordXVector.WordX sharing WordXVector = Const.WordXVector end signature ATOMS = sig structure Atoms: ATOMS' include ATOMS' (* For each structure, like CFunction, I would like to write two sharing * constraints * sharing Atoms = CFunction * sharing CFunction = Atoms.CFunction * but I can't because of a bug in SML/NJ that reports "Sharing structure * with a descendent substructure". So, I am forced to write out lots * of individual sharing constraints. Blech. *) sharing CFunction = Atoms.CFunction sharing CType = Atoms.CType sharing Con = Atoms.Con (* sharing Cons = Atoms.Cons *) sharing Const = Atoms.Const sharing Ffi = Atoms.Ffi sharing Field = Atoms.Field sharing Func = Atoms.Func sharing Label = Atoms.Label sharing Prim = Atoms.Prim sharing ProfileLabel = Atoms.ProfileLabel sharing ProfileExp = Atoms.ProfileExp sharing RealSize = Atoms.RealSize sharing RealX = Atoms.RealX sharing Record = Atoms.Record sharing SortedRecord = Atoms.SortedRecord sharing SourceInfo = Atoms.SourceInfo sharing Tycon = Atoms.Tycon (* sharing Tycons = Atoms.Tycons *) sharing Tyvar = Atoms.Tyvar (* sharing Tyvars = Atoms.Tyvars *) sharing Var = Atoms.Var sharing Vars = Atoms.Vars sharing WordSize = Atoms.WordSize sharing WordX = Atoms.WordX end mlton-20100608/mlton/atoms/c-function.fun0000644000076600000240000001526111404435623016621 0ustar mtfstaff(* Copyright (C) 2003-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CFunction (S: C_FUNCTION_STRUCTS): C_FUNCTION = struct open S structure Convention = struct datatype t = Cdecl | Stdcall val toString = fn Cdecl => "cdecl" | Stdcall => "stdcall" val layout = Layout.str o toString end structure SymbolScope = struct datatype t = External | Private | Public val toString = fn External => "external" | Private => "private" | Public => "public" val layout = Layout.str o toString end structure Target = struct datatype t = Direct of string | Indirect val toString = fn Direct name => name | Indirect => "<*>" val layout = Layout.str o toString val equals = fn (Direct name, Direct name') => name = name' | (Indirect, Indirect) => true | _ => false end datatype z = datatype Target.t datatype 'a t = T of {args: 'a vector, bytesNeeded: int option, convention: Convention.t, ensuresBytesFree: bool, mayGC: bool, maySwitchThreads: bool, modifiesFrontier: bool, prototype: CType.t vector * CType.t option, readsStackTop: bool, return: 'a, symbolScope: SymbolScope.t, target: Target.t, writesStackTop: bool} fun layout (T {args, bytesNeeded, convention, ensuresBytesFree, mayGC, maySwitchThreads, modifiesFrontier, prototype, readsStackTop, return, symbolScope, target, writesStackTop, ...}, layoutType) = Layout.record [("args", Vector.layout layoutType args), ("bytesNeeded", Option.layout Int.layout bytesNeeded), ("convention", Convention.layout convention), ("ensuresBytesFree", Bool.layout ensuresBytesFree), ("mayGC", Bool.layout mayGC), ("maySwitchThreads", Bool.layout maySwitchThreads), ("modifiesFrontier", Bool.layout modifiesFrontier), ("prototype", (fn (args,ret) => Layout.record [("args", Vector.layout CType.layout args), ("res", Option.layout CType.layout ret)]) prototype), ("readsStackTop", Bool.layout readsStackTop), ("return", layoutType return), ("symbolScope", SymbolScope.layout symbolScope), ("target", Target.layout target), ("writesStackTop", Bool.layout writesStackTop)] local fun make f (T r) = f r in fun args z = make #args z fun bytesNeeded z = make #bytesNeeded z fun convention z = make #convention z fun ensuresBytesFree z = make #ensuresBytesFree z fun mayGC z = make #mayGC z fun maySwitchThreads z = make #maySwitchThreads z fun modifiesFrontier z = make #modifiesFrontier z fun prototype z = make #prototype z fun readsStackTop z = make #readsStackTop z fun return z = make #return z fun symbolScope z = make #symbolScope z fun target z = make #target z fun writesStackTop z = make #writesStackTop z end (* quell unused warnings *) val _ = (modifiesFrontier, readsStackTop, writesStackTop) fun equals (f, f') = Target.equals (target f, target f') fun map (T {args, bytesNeeded, convention, ensuresBytesFree, mayGC, maySwitchThreads, modifiesFrontier, prototype, readsStackTop, return, symbolScope, target, writesStackTop}, f) = T {args = Vector.map (args, f), bytesNeeded = bytesNeeded, convention = convention, ensuresBytesFree = ensuresBytesFree, mayGC = mayGC, maySwitchThreads = maySwitchThreads, modifiesFrontier = modifiesFrontier, prototype = prototype, readsStackTop = readsStackTop, return = f return, symbolScope = symbolScope, target = target, writesStackTop = writesStackTop} fun isOk (T {ensuresBytesFree, mayGC, maySwitchThreads, modifiesFrontier, readsStackTop, return, writesStackTop, ...}, {isUnit}): bool = (if maySwitchThreads then mayGC andalso isUnit return else true) andalso (if ensuresBytesFree orelse maySwitchThreads then mayGC else true) andalso (if mayGC then (modifiesFrontier andalso readsStackTop andalso writesStackTop) else true) andalso (not writesStackTop orelse readsStackTop ) fun vanilla {args, name, prototype, return} = T {args = args, bytesNeeded = NONE, convention = Convention.Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = false, prototype = prototype, readsStackTop = false, return = return, symbolScope = SymbolScope.Private, target = Direct name, writesStackTop = false} fun cPrototype (T {convention, prototype = (args, return), symbolScope, target, ...}) = let val convention = if convention <> Convention.Cdecl then concat [" __attribute__ ((", Convention.toString convention, ")) "] else " " val symbolScope = case symbolScope of SymbolScope.External => "EXTERNAL " | SymbolScope.Private => "PRIVATE " | SymbolScope.Public => "PUBLIC " val name = case target of Direct name => name | Indirect => Error.bug "CFunction.cPrototype: Indirect" val c = Counter.new 0 fun arg t = concat [CType.toString t, " x", Int.toString (Counter.next c)] val return = case return of NONE => "void" | SOME t => CType.toString t in concat [symbolScope, return, convention, name, " (", concat (List.separate (Vector.toListMap (args, arg), ", ")), ")"] end fun cPointerType (T {convention, prototype = (args, return), ...}) = let val attributes = if convention <> Convention.Cdecl then concat [" __attribute__ ((", Convention.toString convention, ")) "] else " " fun arg t = CType.toString t val return = case return of NONE => "void" | SOME t => CType.toString t in concat ["(", return, attributes, "(*)(", concat (List.separate (Vector.toListMap (args, arg), ", ")), "))"] end end mlton-20100608/mlton/atoms/c-function.sig0000644000076600000240000000625411404435622016614 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature C_FUNCTION_STRUCTS = sig structure CType: C_TYPE end signature C_FUNCTION = sig include C_FUNCTION_STRUCTS structure Convention: sig datatype t = Cdecl | Stdcall val layout: t -> Layout.t val toString: t -> string end structure SymbolScope: sig datatype t = External | Private | Public val layout: t -> Layout.t val toString: t -> string end structure Target: sig datatype t = Direct of string | Indirect val layout: t -> Layout.t val toString: t -> string end datatype 'a t = T of {args: 'a vector, (* bytesNeeded = SOME i means that the i'th * argument to the function is a word that * specifies the number of bytes that must be * free in order for the C function to succeed. * Limit check insertion is responsible for * making sure that the bytesNeeded is available. *) bytesNeeded: int option, convention: Convention.t, ensuresBytesFree: bool, mayGC: bool, maySwitchThreads: bool, modifiesFrontier: bool, prototype: CType.t vector * CType.t option, readsStackTop: bool, return: 'a, symbolScope: SymbolScope.t, (* target = Indirect means that the 0'th * argument to the function is a word * that specifies the target. *) target: Target.t, writesStackTop: bool} val args: 'a t -> 'a vector val bytesNeeded: 'a t -> int option val convention: 'a t -> Convention.t val ensuresBytesFree: 'a t -> bool val equals: 'a t * 'a t -> bool val cPointerType: 'a t -> string val cPrototype: 'a t -> string val isOk: 'a t * {isUnit: 'a -> bool} -> bool val layout: 'a t * ('a -> Layout.t) -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val mayGC: 'a t -> bool val maySwitchThreads: 'a t -> bool val modifiesFrontier: 'a t -> bool val prototype: 'a t -> CType.t vector * CType.t option val readsStackTop: 'a t -> bool val return: 'a t -> 'a val symbolScope: 'a t -> SymbolScope.t val target: 'a t -> Target.t val writesStackTop: 'a t -> bool val vanilla: {args: 'a vector, name: string, prototype: CType.t vector * CType.t option, return: 'a} -> 'a t end mlton-20100608/mlton/atoms/c-type.fun0000644000076600000240000000716611404435623015762 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CType (S: C_TYPE_STRUCTS): C_TYPE = struct open S datatype t = CPointer | Int8 | Int16 | Int32 | Int64 | Objptr | Real32 | Real64 | Word8 | Word16 | Word32 | Word64 val all = [CPointer, Int8, Int16, Int32, Int64, Objptr, Real32, Real64, Word8, Word16, Word32, Word64] val cpointer = CPointer val objptr = Objptr val thread = objptr val equals: t * t -> bool = op = fun memo (f: t -> 'a): t -> 'a = let val cpointer = f CPointer val int8 = f Int8 val int16 = f Int16 val int32 = f Int32 val int64 = f Int64 val objptr = f Objptr val real32 = f Real32 val real64 = f Real64 val word8 = f Word8 val word16 = f Word16 val word32 = f Word32 val word64 = f Word64 in fn CPointer => cpointer | Int8 => int8 | Int16 => int16 | Int32 => int32 | Int64 => int64 | Objptr => objptr | Real32 => real32 | Real64 => real64 | Word8 => word8 | Word16 => word16 | Word32 => word32 | Word64 => word64 end val toString = fn CPointer => "CPointer" | Int8 => "Int8" | Int16 => "Int16" | Int32 => "Int32" | Int64 => "Int64" | Objptr => "Objptr" (* CHECK *) | Real32 => "Real32" | Real64 => "Real64" | Word8 => "Word8" | Word16 => "Word16" | Word32 => "Word32" | Word64 => "Word64" val layout = Layout.str o toString fun size (t: t): Bytes.t = case t of CPointer => Bits.toBytes (Control.Target.Size.cpointer ()) | Int8 => Bytes.fromInt 1 | Int16 => Bytes.fromInt 2 | Int32 => Bytes.fromInt 4 | Int64 => Bytes.fromInt 8 | Objptr => Bits.toBytes (Control.Target.Size.objptr ()) | Real32 => Bytes.fromInt 4 | Real64 => Bytes.fromInt 8 | Word8 => Bytes.fromInt 1 | Word16 => Bytes.fromInt 2 | Word32 => Bytes.fromInt 4 | Word64 => Bytes.fromInt 8 fun name t = case t of CPointer => "Q" (* CHECK *) | Int8 => "I8" | Int16 => "I16" | Int32 => "I32" | Int64 => "I64" | Objptr => "P" (* CHECK *) | Real32 => "R32" | Real64 => "R64" | Word8 => "W8" | Word16 => "W16" | Word32 => "W32" | Word64 => "W64" fun align (t: t, b: Bytes.t): Bytes.t = Bytes.align (b, {alignment = size t}) fun real (s: RealSize.t): t = case Bits.toInt (RealSize.bits s) of 32 => Real32 | 64 => Real64 | _ => Error.bug "CType.real" fun word' (b: Bits.t, {signed: bool}): t = case (signed, Bits.toInt b) of (false, 8) => Word8 | (true, 8) => Int8 | (false, 16) => Word16 | (true, 16) => Int16 | (false, 32) => Word32 | (true, 32) => Int32 | (false, 64) => Word64 | (true, 64) => Int64 | _ => Error.bug "CType.word'" fun word (s: WordSize.t, {signed: bool}): t = word' (WordSize.bits s, {signed = signed}) val cint = Promise.lazy (fn () => word' (Control.Target.Size.cint (), {signed = true})) val csize = Promise.lazy (fn () => word' (Control.Target.Size.csize (), {signed = false})) val seqIndex = Promise.lazy (fn () => word' (Control.Target.Size.seqIndex (), {signed = true})) val objptrHeader = Promise.lazy (fn () => word' (Control.Target.Size.header (), {signed = false})) val bool = word (WordSize.bool, {signed = true}) val shiftArg = word (WordSize.shiftArg, {signed = false}) end mlton-20100608/mlton/atoms/c-type.sig0000644000076600000240000000225211404435622015742 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature C_TYPE_STRUCTS = sig structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE end signature C_TYPE = sig include C_TYPE_STRUCTS datatype t = CPointer | Int8 | Int16 | Int32 | Int64 | Objptr | Real32 | Real64 | Word8 | Word16 | Word32 | Word64 val align: t * Bytes.t -> Bytes.t val all: t list val bool: t val cpointer: t val cint: unit -> t val csize: unit -> t val equals: t * t -> bool val objptrHeader: unit -> t val memo: (t -> 'a) -> t -> 'a (* name: I{8,16,32,64} R{32,64} W{8,16,32,64} *) val name: t -> string val layout: t -> Layout.t val objptr: t val real: RealSize.t -> t val seqIndex: unit -> t val shiftArg: t val size: t -> Bytes.t val thread: t val toString: t -> string val word: WordSize.t * {signed: bool} -> t end mlton-20100608/mlton/atoms/cases.fun0000644000076600000240000000070511404435623015647 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Cases (S: CASES_STRUCTS): CASES = struct open S datatype 'a t = Char of (char * 'a) vector | Con of (con * 'a) vector | Int of (IntInf.t * 'a) vector | Word of (word * 'a) vector end mlton-20100608/mlton/atoms/cases.sig0000644000076600000240000000205211404435623015636 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CASES_STRUCTS = sig type con type word val conEquals: con * con -> bool val wordEquals: word * word -> bool end signature CASES = sig include CASES_STRUCTS datatype 'a t = Char of (char * 'a) vector | Con of (con * 'a) vector | Int of (IntInf.t * 'a) vector | Word of (word * 'a) vector val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val forall: 'a t * ('a -> bool) -> bool val foreach: 'a t * ('a -> unit) -> unit val foreach': 'a t * ('a -> unit) * (con -> unit) -> unit val hd: 'a t -> 'a val isEmpty: 'a t -> bool val length: 'a t -> int val map: 'a t * ('a -> 'b) -> 'b t end mlton-20100608/mlton/atoms/con-.fun0000644000076600000240000000151111404435623015401 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Con (S: CON_STRUCTS): CON = struct open S structure C = Id (val noname = "C") open C structure P = PrimCons (C) open P val all = [cons, falsee, nill, reff, truee, bind, match] fun stats () = let open Layout in align (List.map (all, fn c => seq [layout c, str " size is ", Int.layout (MLton.size c), str " plist length is ", Int.layout (PropertyList.length (plist c))])) end (* quell unused warning *) val _ = stats fun fromBool b = if b then truee else falsee end mlton-20100608/mlton/atoms/con-.sig0000644000076600000240000000071511404435623015400 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CON_STRUCTS = sig end signature CON = sig include ID include PRIM_CONS sharing type t = con val fromBool: bool -> t val stats: unit -> Layout.t end mlton-20100608/mlton/atoms/const-type.fun0000644000076600000240000000061511404435623016656 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ConstType (S: CONST_TYPE_STRUCTS): CONST_TYPE = struct open S datatype t = Bool | Real of RealSize.t | String | Word of WordSize.t end mlton-20100608/mlton/atoms/const-type.sig0000644000076600000240000000100311404435622016637 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONST_TYPE_STRUCTS = sig structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE end signature CONST_TYPE = sig include CONST_TYPE_STRUCTS datatype t = Bool | Real of RealSize.t | String | Word of WordSize.t end mlton-20100608/mlton/atoms/const.fun0000644000076600000240000000504611404435623015702 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Const (S: CONST_STRUCTS): CONST = struct open S structure ConstType = ConstType (struct structure RealSize = RealX.RealSize structure WordSize = WordX.WordSize end) structure SmallIntInf = struct structure WordSize = WordX.WordSize fun toWord (i: IntInf.t): WordX.t option = let val ws = WordSize.smallIntInfWord () val ws' = WordSize.fromBits (Bits.- (WordSize.bits ws, Bits.one)) in if WordSize.isInRange (ws', i, {signed = true}) then SOME (WordX.orb (WordX.one ws, WordX.lshift (WordX.fromIntInf (i, ws), WordX.one ws))) else NONE end val isSmall = isSome o toWord fun fromWord (w: WordX.t): IntInf.t = WordX.toIntInfX (WordX.rshift (w, WordX.one (WordX.size w), {signed = true})) end datatype t = IntInf of IntInf.t | Null | Real of RealX.t | Word of WordX.t | WordVector of WordXVector.t val intInf = IntInf val null = Null val real = Real val word = Word val wordVector = WordVector val string = wordVector o WordXVector.fromString local open Layout fun wrap (pre, post, s) = seq [str pre, String.layout s, str post] in val layout = fn IntInf i => IntInf.layout i | Null => str "NULL" | Real r => RealX.layout r | Word w => WordX.layout w | WordVector v => wrap ("\"", "\"", WordXVector.toString v) end val toString = Layout.toString o layout fun hash (c: t): word = case c of IntInf i => IntInf.hash i | Null => 0wx0 | Real r => RealX.hash r | Word w => WordX.hash w | WordVector v => WordXVector.hash v fun equals (c, c') = case (c, c') of (IntInf i, IntInf i') => IntInf.equals (i, i') | (Null, Null) => true | (Real r, Real r') => RealX.equals (r, r') | (Word w, Word w') => WordX.equals (w, w') | (WordVector v, WordVector v') => WordXVector.equals (v, v') | _ => false val equals = Trace.trace2 ("Const.equals", layout, layout, Bool.layout) equals val lookup: ({default: string option, name: string} * ConstType.t -> t) ref = ref (fn _ => Error.bug "Const.lookup: not set") end mlton-20100608/mlton/atoms/const.sig0000644000076600000240000000305111404435623015666 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONST_STRUCTS = sig structure RealX: REAL_X structure WordX: WORD_X structure WordXVector: WORD_X_VECTOR sharing WordX = RealX.WordX = WordXVector.WordX end signature CONST = sig include CONST_STRUCTS structure ConstType: CONST_TYPE sharing ConstType.RealSize = RealX.RealSize sharing ConstType.WordSize = WordX.WordSize structure SmallIntInf: sig val fromWord: WordX.t -> IntInf.t val isSmall: IntInf.t -> bool val toWord: IntInf.t -> WordX.t option end datatype t = IntInf of IntInf.t | Null | Real of RealX.t | Word of WordX.t | WordVector of WordXVector.t val equals: t * t -> bool val intInf: IntInf.t -> t val hash: t -> word val layout: t -> Layout.t (* lookup is for constants defined by _const, _build_const, and * _command_line_const. It is set in main/compile.fun. *) val lookup: ({default: string option, name: string} * ConstType.t -> t) ref val null: t val real: RealX.t -> t val string: string -> t val toString: t -> string val word: WordX.t -> t val wordVector: WordXVector.t -> t end mlton-20100608/mlton/atoms/ffi.fun0000644000076600000240000001254511404435623015322 0ustar mtfstaff(* Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Ffi (S: FFI_STRUCTS): FFI = struct open S structure Convention = CFunction.Convention structure SymbolScope = CFunction.SymbolScope local val scopes: (Word.t * String.t * SymbolScope.t) HashSet.t = HashSet.new {hash = #1} in fun checkScope {name, symbolScope} = let val hash = String.hash name in (#3 o HashSet.lookupOrInsert) (scopes, hash, fn (hash', name', _) => hash = hash' andalso name = name', fn () => (hash, name, symbolScope)) end end val exports: {args: CType.t vector, convention: Convention.t, id: int, name: string, res: CType.t option, symbolScope: SymbolScope.t} list ref = ref [] val symbols: {name: string, ty: CType.t, symbolScope: SymbolScope.t} list ref = ref [] fun numExports () = List.length (!exports) local val exportCounter = Counter.new 0 in fun addExport {args, convention, name, res, symbolScope} = let val id = Counter.next exportCounter val _ = List.push (exports, {args = args, convention = convention, id = id, name = name, res = res, symbolScope = symbolScope}) in id end fun addSymbol {name, ty, symbolScope} = ignore (List.push (symbols, {name = name, ty = ty, symbolScope = symbolScope})) end val headers: string list ref = ref [] fun declareExports {print} = let val _ = print "PRIVATE Pointer MLton_FFI_opArgsResPtr;\n" in List.foreach (!symbols, fn {name, ty, symbolScope} => let val (headerSymbolScope, symbolScope) = case symbolScope of SymbolScope.External => Error.bug "Ffi.declareExports.symbols: External" | SymbolScope.Private => ("MLLIB_PRIVATE", "PRIVATE") | SymbolScope.Public => ("MLLIB_PUBLIC", "PUBLIC") val headerDecl = concat [headerSymbolScope, "(extern ", CType.toString ty, " ", name, ";)"] val decl = concat [symbolScope, " ", CType.toString ty, " ", name] in List.push (headers, headerDecl); print (decl ^ ";\n") end); List.foreach (!exports, fn {args, convention, id, name, res, symbolScope} => let val args = Vector.mapi (args, fn (i,t) => let val x = concat ["x", Int.toString i] val t = CType.toString t in (concat [t, " ", x], concat ["\tlocalOpArgsRes[", Int.toString (i + 1), "] = ", "(Pointer)(&", x, ");\n"]) end) val (headerSymbolScope, symbolScope) = case symbolScope of SymbolScope.External => Error.bug "Ffi.declareExports.exports: External" | SymbolScope.Private => ("MLLIB_PRIVATE","PRIVATE") | SymbolScope.Public => ("MLLIB_PUBLIC","PUBLIC") val prototype = concat [case res of NONE => "void" | SOME t => CType.toString t, if convention <> Convention.Cdecl then concat [" __attribute__ ((", Convention.toString convention, ")) "] else " ", name, " (", concat (List.separate (Vector.toListMap (args, #1), ", ")), ")"] val n = 1 + (Vector.length args) + (case res of NONE => 0 | SOME _ => 1) in List.push (headers, concat [headerSymbolScope, "(", prototype, ";)"]) ; print (concat [symbolScope, " ", prototype, " {\n"]) ; print (concat ["\tPointer localOpArgsRes[", Int.toString n,"];\n"]) ; print (concat ["\tMLton_FFI_opArgsResPtr = (Pointer)(localOpArgsRes);\n"]) ; print (concat ["\tInt32 localOp = ", Int.toString id, ";\n", "\tlocalOpArgsRes[0] = (Pointer)(&localOp);\n"]) ; Vector.foreach (args, fn (_, set) => print set) ; (case res of NONE => () | SOME t => print (concat ["\t", CType.toString t, " localRes;\n", "\tlocalOpArgsRes[", Int.toString (Vector.length args + 1), "] = ", "(Pointer)(&localRes);\n"])) ; print ("\tMLton_callFromC ();\n") ; (case res of NONE => () | SOME _ => print "\treturn localRes;\n") ; print "}\n" end) end fun declareHeaders {print} = (declareExports {print = fn _ => ()} ; List.foreach (!headers, fn s => (print s; print "\n"))) end mlton-20100608/mlton/atoms/ffi.sig0000644000076600000240000000207711404435622015312 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FFI_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE end signature FFI = sig include FFI_STRUCTS val addExport: {args: CType.t vector, convention: CFunction.Convention.t, name: string, res: CType.t option, symbolScope: CFunction.SymbolScope.t} -> int val addSymbol: {ty: CType.t, name: string, symbolScope: CFunction.SymbolScope.t} -> unit val checkScope: {name: string, symbolScope: CFunction.SymbolScope.t} -> CFunction.SymbolScope.t val declareExports: {print: string -> unit} -> unit val declareHeaders: {print: string -> unit} -> unit val numExports: unit -> int end mlton-20100608/mlton/atoms/func.sig0000644000076600000240000000033411404435623015474 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FUNC = ID mlton-20100608/mlton/atoms/generic-scheme.fun0000644000076600000240000000206311404435623017426 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor GenericScheme (S: GENERIC_SCHEME_STRUCTS): GENERIC_SCHEME = struct open S type ty = Type.t type tyvar = Tyvar.t datatype t = T of {tyvars: tyvar vector, ty: ty} local fun make f (T r) = f r in val ty = make #ty end fun layout (T {tyvars, ty}) = let open Layout val ty = Type.layout ty in if 0 = Vector.length tyvars then ty else align [seq [str "Forall ", Vector.layout Tyvar.layout tyvars, str "."], ty] end fun apply (T {tyvars, ty}, args) = if Vector.isEmpty tyvars andalso Vector.isEmpty args then ty (* Must special case this, since don't want to substitute * in monotypes. *) else Type.substitute (ty, Vector.zip (tyvars, args)) end mlton-20100608/mlton/atoms/generic-scheme.sig0000644000076600000240000000150311404435623017416 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature GENERIC_SCHEME_STRUCTS = sig structure Tyvar: TYVAR structure Type: sig type t val var: Tyvar.t -> t val substitute: t * (Tyvar.t * t) vector -> t val layout: t -> Layout.t end end signature GENERIC_SCHEME = sig type tyvar type ty datatype t = T of {tyvars: tyvar vector, ty: ty} val apply: t * ty vector -> ty val layout: t -> Layout.t val ty: t -> ty end mlton-20100608/mlton/atoms/hash-type.fun0000644000076600000240000001522611404435623016457 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor HashType (S: HASH_TYPE_STRUCTS): HASH_TYPE = struct open S structure Type = struct datatype t = T of { hash: Word.t, plist: PropertyList.t, tree: tree } and tree = Var of Tyvar.t | Con of Tycon.t * t vector local fun make f (T r) = f r in val hash = make #hash val plist = make #plist val tree = make #tree end local open Layout in val rec layoutTree = fn Var a => Tyvar.layout a | Con (c, ts) => seq [Tycon.layout c, Vector.layout (layoutTree o tree) ts] end structure Dest = struct datatype dest = datatype tree val dest = tree end open Dest fun deConOpt t = case dest t of Con x => SOME x | _ => NONE fun makeHom {con, var} = let val {get, destroy, ...} = Property.destGet (plist, Property.initRec (fn (t, get) => case dest t of Var a => var (t, a) | Con (c, ts) => con (t, c, Vector.map (ts, get)))) in {hom = get, destroy = destroy} end fun hom {ty, var, con} = let val {hom, destroy} = makeHom {var = var o #2, con = fn (_, c, xs) => con (c, xs)} val res = hom ty val _ = destroy () in res end fun makeMonoHom {con} = makeHom {var = fn _ => Error.bug "HashType.Type.makeMonoHom: type variable", con = con} fun equals (t, t'): bool = PropertyList.equals (plist t, plist t') fun layout (ty: t): Layout.t = #1 (hom {con = Tycon.layoutApp, ty = ty, var = fn a => (Tyvar.layout a, ({isChar = false}, Tycon.BindingStrength.unit))}) local val same: tree * tree -> bool = fn (Var a, Var a') => Tyvar.equals (a, a') | (Con (c, ts), Con (c', ts')) => Tycon.equals (c, c') andalso Vector.equals (ts, ts', equals) | _ => false val same = Trace.trace2 ("HashType.Type.same", layoutTree, layoutTree, Bool.layout) same val table: t HashSet.t = HashSet.new {hash = hash} in fun lookup (hash, tr) = HashSet.lookupOrInsert (table, hash, fn t => same (tr, tree t), fn () => T {hash = hash, plist = PropertyList.new (), tree = tr}) fun stats () = let open Layout in align [seq [str "num types in hash table = ", Int.layout (HashSet.size table)], Control.sizeMessage ("types hash table", table)] end end fun var a = lookup (Tyvar.hash a, Var a) local val generator: Word.t = 0wx5555 in fun con (c, ts) = lookup (Vector.fold (ts, Tycon.hash c, fn (t, w) => Word.xorb (w * generator, hash t)), Con (c, ts)) val con = Trace.trace2 ("HashType.Type.con", Tycon.layout, Vector.layout layout, layout) con end end structure Ops = TypeOps (structure Tycon = Tycon open Type) open Type Ops val string = word8Vector fun ofConst c = let datatype z = datatype Const.t in case c of IntInf _ => intInf | Null => cpointer | Real r => real (RealX.size r) | Word w => word (WordX.size w) | WordVector v => vector (word (WordXVector.elementSize v)) end fun isUnit t = case dest t of Con (c, ts) => 0 = Vector.length ts andalso Tycon.equals (c, Tycon.tuple) | _ => false fun substitute (ty, v) = if Vector.isEmpty v then ty (* This optimization is important so that monotypes * are not substituted inside of. *) else hom {ty = ty, var = fn a => (case Vector.peek (v, fn (a', _) => Tyvar.equals (a, a')) of NONE => var a | SOME (_, ty) => ty), con = con} val substitute = Trace.trace2 ("HashType.substitute", layout, Vector.layout (Layout.tuple2 (Tyvar.layout, Type.layout)), layout) substitute (* fun equalss (ts: t list): t option = * case ts of * t :: ts => * let fun loop [] = SOME t * | loop (t' :: ts) = if equals (t, t') then loop ts else NONE * in loop ts * end * | [] => Error.bug "HashType.equals" *) local val out = Out.error val print = Out.outputc out exception TypeError in fun error (msg, lay) = (print (concat ["Type error: ", msg, "\n"]) ; Layout.output (lay, out) ; print "\n" ; raise TypeError) end fun tycon t = case dest t of Con (c, _) => c | _ => Error.bug "HashType.tycon: type variable" fun containsTycon (ty, tycon) = hom {ty = ty, var = fn _ => false, con = fn (tycon', bs) => (Tycon.equals (tycon, tycon') orelse Vector.exists (bs, fn b => b))} fun checkPrimApp {args, prim, result, targs}: bool = Prim.checkApp (prim, {args = args, result = result, targs = targs, typeOps = {array = array, arrow = arrow, bool = bool, cpointer = cpointer, equals = equals, exn = exn, intInf = intInf, real = real, reff = reff, thread = thread, unit = unit, vector = vector, weak = weak, word = word}}) end mlton-20100608/mlton/atoms/hash-type.sig0000644000076600000240000000373211404435622016447 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature HASH_TYPE_STRUCTS = sig include ATOMS end signature HASH_TYPE = sig include HASH_TYPE_STRUCTS include TYPE_OPS sharing type realSize = RealSize.t sharing type tycon = Tycon.t sharing type wordSize = WordSize.t structure Dest: sig datatype dest = Con of Tycon.t * t vector | Var of Tyvar.t val dest: t -> dest end val checkPrimApp: {args: t vector, prim: t Prim.t, result: t, targs: t vector} -> bool val containsTycon: t * Tycon.t -> bool (* O(1) time *) val equals: t * t -> bool (* for reporting type errors *) val error: string * Layout.t -> 'a val hash: t -> Word.t val hom: {ty: t, var: Tyvar.t -> 'a, con: Tycon.t * 'a vector -> 'a} -> 'a val isUnit: t -> bool val layout: t -> Layout.t val makeHom: {var: t * Tyvar.t -> 'a, con: t * Tycon.t * 'a vector -> 'a} -> {hom: t -> 'a, destroy: unit -> unit} val makeMonoHom: {con: t * Tycon.t * 'a vector -> 'a} -> {hom: t -> 'a, destroy: unit -> unit} val ofConst: Const.t -> t val plist: t -> PropertyList.t val stats: unit -> Layout.t val string: t (* synonym for word8Vector *) (* substitute (t, [(a1, t1), ..., (an, tn)]) performs simultaneous * substitution of the ti for ai in t. * The ai's are not required to contain every free variable in t *) val substitute: t * (Tyvar.t * t) vector -> t val tycon: t -> Tycon.t val var: Tyvar.t -> t end mlton-20100608/mlton/atoms/id.fun0000644000076600000240000000666511404435622015157 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure UniqueString: sig val unique: string -> string end = struct val set: {counter: Counter.t, hash: word, original: string} HashSet.t = HashSet.new {hash = #hash} fun unique (s: string): string = let val hash = String.hash s val {counter, ...} = HashSet.lookupOrInsert (set, hash, fn {original, ...} => s = original, fn () => {counter = Counter.new 0, hash = hash, original = s}) in concat [s, "_", Int.toString (Counter.next counter)] end end functor Id (S: ID_STRUCTS): ID = struct open S structure Plist = PropertyList datatype t = T of {hash: word, originalName: string, printName: string option ref, plist: Plist.t} local fun make f (T r) = f r in val hash = make #hash val originalName = make #originalName val plist = make #plist val printName = make #printName end fun isAlphaNum (s: string): bool = String.forall (s, fn c => Char.isAlphaNum c orelse c = #"_") fun clearPrintName (T {originalName, printName, ...}): unit = if isAlphaNum originalName then () else printName := NONE fun setPrintName (x, s) = printName x := SOME s val printNameAlphaNumeric: bool ref = ref false fun toString (T {originalName, printName, ...}) = case !printName of NONE => let val s = if not (!printNameAlphaNumeric) orelse isAlphaNum originalName then originalName else String.translate (originalName, fn #"!" => "Bang" | #"#" => "Hash" | #"$" => "Dollar" | #"%" => "Percent" | #"&" => "Ampersand" | #"'" => "P" | #"*" => "Star" | #"+" => "Plus" | #"-" => "Minus" | #"." => "D" | #"/" => "Divide" | #":" => "Colon" | #"<" => "Lt" | #"=" => "Eq" | #">" => "Gt" | #"?" => "Ques" | #"@" => "At" | #"\\" => "Slash" | #"^" => "Caret" | #"`" => "Quote" | #"|" => "Pipe" | #"~" => "Tilde" | c => str c) val s = UniqueString.unique s val _ = printName := SOME s in s end | SOME s => s val layout = String.layout o toString fun equals (id, id') = Plist.equals (plist id, plist id') local fun make (originalName, printName) = T {hash = Random.word (), originalName = originalName, printName = ref printName, plist = Plist.new ()} in fun fromString s = make (s, SOME s) fun newString s = make (s, NONE) end val new = newString o originalName fun newNoname () = newString noname val bogus = newString "bogus" val clear = Plist.clear o plist end mlton-20100608/mlton/atoms/id.sig0000644000076600000240000000204311404435623015134 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ID_STRUCTS = sig val noname: string end signature ID = sig include ID_STRUCTS type t val bogus: t val clear: t -> unit val clearPrintName: t -> unit val equals: t * t -> bool val layout: t -> Layout.t val fromString: string -> t (* doesn't add uniquefying suffix *) val hash: t -> word val new: t -> t (* new id with the same originalName *) val newNoname: unit -> t (* prefix is noname *) val newString: string -> t (* new id with printName not set *) val originalName: t -> string (* raw destructor *) val plist: t -> PropertyList.t val printNameAlphaNumeric: bool ref val setPrintName: t * string -> unit val toString: t -> string end mlton-20100608/mlton/atoms/label.sig0000644000076600000240000000033511404435623015621 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LABEL = ID mlton-20100608/mlton/atoms/prim.fun0000644000076600000240000025265611404435623015536 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * If you add new polymorphic primitives, you must modify extractTargs. *) functor Prim (S: PRIM_STRUCTS): PRIM = struct open S local open Const in structure RealX = RealX structure WordX = WordX structure WordXVector = WordXVector end structure Kind = struct datatype t = DependsOnState | Functional | Moveable | SideEffect end datatype 'a t = Array_array (* backend *) | Array_array0Const (* constant propagation *) | Array_length (* ssa to rssa *) | Array_sub (* backend *) | Array_toVector (* backend *) | Array_update (* backend *) | CPointer_add (* codegen *) | CPointer_diff (* codegen *) | CPointer_equal (* codegen *) | CPointer_fromWord (* codegen *) | CPointer_getCPointer (* ssa to rssa *) | CPointer_getObjptr (* ssa to rssa *) | CPointer_getReal of RealSize.t (* ssa to rssa *) | CPointer_getWord of WordSize.t (* ssa to rssa *) | CPointer_lt (* codegen *) | CPointer_setCPointer (* ssa to rssa *) | CPointer_setObjptr (* ssa to rssa *) | CPointer_setReal of RealSize.t (* ssa to rssa *) | CPointer_setWord of WordSize.t (* ssa to rssa *) | CPointer_sub (* codegen *) | CPointer_toWord (* codegen *) | Exn_extra (* implement exceptions *) | Exn_name (* implement exceptions *) | Exn_setExtendExtra (* implement exceptions *) | FFI of 'a CFunction.t (* ssa to rssa *) | FFI_Symbol of {name: string, cty: CType.t option, symbolScope: CFunction.SymbolScope.t } (* codegen *) | GC_collect (* ssa to rssa *) | IntInf_add (* ssa to rssa *) | IntInf_andb (* ssa to rssa *) | IntInf_arshift (* ssa to rssa *) | IntInf_compare (* ssa to rssa *) | IntInf_equal (* ssa to rssa *) | IntInf_gcd (* ssa to rssa *) | IntInf_lshift (* ssa to rssa *) | IntInf_mul (* ssa to rssa *) | IntInf_neg (* ssa to rssa *) | IntInf_notb (* ssa to rssa *) | IntInf_orb (* ssa to rssa *) | IntInf_quot (* ssa to rssa *) | IntInf_rem (* ssa to rssa *) | IntInf_sub (* ssa to rssa *) | IntInf_toString (* ssa to rssa *) | IntInf_toVector (* ssa to rssa *) | IntInf_toWord (* ssa to rssa *) | IntInf_xorb (* ssa to rssa *) | MLton_bogus (* ssa to rssa *) (* of type unit -> 'a. * Makes a bogus value of any type. *) | MLton_bug (* ssa to rssa *) | MLton_deserialize (* unused *) | MLton_eq (* codegen *) | MLton_equal (* polymorphic equality *) | MLton_halt (* ssa to rssa *) | MLton_hash (* polymorphic hash *) (* MLton_handlesSignals and MLton_installSignalHandler work together * to inform the optimizer and basis library whether or not the * program uses signal handlers. * * MLton_installSignalHandler is called by MLton.Signal.setHandler, * and is effectively a noop, but is left in the program until the * end of the backend, so that the optimizer can test whether or * not the program installs signal handlers. * * MLton_handlesSignals is translated by closure conversion into * a boolean, and is true iff MLton_installsSignalHandler is called. *) | MLton_handlesSignals (* closure conversion *) | MLton_installSignalHandler (* backend *) | MLton_serialize (* unused *) | MLton_share | MLton_size (* ssa to rssa *) | MLton_touch (* backend *) | Real_Math_acos of RealSize.t (* codegen *) | Real_Math_asin of RealSize.t (* codegen *) | Real_Math_atan of RealSize.t (* codegen *) | Real_Math_atan2 of RealSize.t (* codegen *) | Real_Math_cos of RealSize.t (* codegen *) | Real_Math_exp of RealSize.t (* codegen *) | Real_Math_ln of RealSize.t (* codegen *) | Real_Math_log10 of RealSize.t (* codegen *) | Real_Math_sin of RealSize.t (* codegen *) | Real_Math_sqrt of RealSize.t (* codegen *) | Real_Math_tan of RealSize.t (* codegen *) | Real_abs of RealSize.t (* codegen *) | Real_add of RealSize.t (* codegen *) | Real_castToWord of RealSize.t * WordSize.t (* codegen *) | Real_div of RealSize.t (* codegen *) | Real_equal of RealSize.t (* codegen *) | Real_ldexp of RealSize.t (* codegen *) | Real_le of RealSize.t (* codegen *) | Real_lt of RealSize.t (* codegen *) | Real_mul of RealSize.t (* codegen *) | Real_muladd of RealSize.t (* codegen *) | Real_mulsub of RealSize.t (* codegen *) | Real_neg of RealSize.t (* codegen *) | Real_qequal of RealSize.t (* codegen *) | Real_rndToReal of RealSize.t * RealSize.t (* codegen *) | Real_rndToWord of RealSize.t * WordSize.t * {signed: bool} (* codegen *) | Real_round of RealSize.t (* codegen *) | Real_sub of RealSize.t (* codegen *) | Ref_assign (* backend *) | Ref_deref (* backend *) | Ref_ref (* backend *) | String_toWord8Vector (* defunctorize *) | Thread_atomicBegin (* backend *) | Thread_atomicEnd (* backend *) | Thread_atomicState (* backend *) | Thread_copy (* ssa to rssa *) | Thread_copyCurrent (* ssa to rssa *) | Thread_returnToC (* codegen *) (* switchTo has to be a _prim because we have to know that it * enters the runtime -- because everything must be saved * on the stack. *) | Thread_switchTo (* ssa to rssa *) | TopLevel_getHandler (* implement exceptions *) | TopLevel_getSuffix (* implement suffix *) | TopLevel_setHandler (* implement exceptions *) | TopLevel_setSuffix (* implement suffix *) | Vector_length (* ssa to rssa *) | Vector_sub (* ssa to rssa *) | Weak_canGet (* ssa to rssa *) | Weak_get (* ssa to rssa *) | Weak_new (* ssa to rssa *) | Word_add of WordSize.t (* codegen *) | Word_addCheck of WordSize.t * {signed: bool} (* codegen *) | Word_andb of WordSize.t (* codegen *) | Word_castToReal of WordSize.t * RealSize.t (* codegen *) | Word_equal of WordSize.t (* codegen *) | Word_extdToWord of WordSize.t * WordSize.t * {signed: bool} (* codegen *) | Word_lshift of WordSize.t (* codegen *) | Word_lt of WordSize.t * {signed: bool} (* codegen *) | Word_mul of WordSize.t * {signed: bool} (* codegen *) | Word_mulCheck of WordSize.t * {signed: bool} (* codegen *) | Word_neg of WordSize.t (* codegen *) | Word_negCheck of WordSize.t (* codegen *) | Word_notb of WordSize.t (* codegen *) | Word_orb of WordSize.t (* codegen *) | Word_quot of WordSize.t * {signed: bool} (* codegen *) | Word_rem of WordSize.t * {signed: bool} (* codegen *) | Word_rndToReal of WordSize.t * RealSize.t * {signed: bool} (* codegen *) | Word_rol of WordSize.t (* codegen *) | Word_ror of WordSize.t (* codegen *) | Word_rshift of WordSize.t * {signed: bool} (* codegen *) | Word_sub of WordSize.t (* codegen *) | Word_subCheck of WordSize.t * {signed: bool} (* codegen *) | Word_toIntInf (* ssa to rssa *) | Word_xorb of WordSize.t (* codegen *) | WordVector_toIntInf (* ssa to rssa *) | Word8Array_subWord of WordSize.t (* ssa to rssa *) | Word8Array_updateWord of WordSize.t (* ssa to rssa *) | Word8Vector_subWord of WordSize.t (* ssa to rssa *) | Word8Vector_toString (* defunctorize *) | World_save (* ssa to rssa *) fun name p = p (* The values of these strings are important since they are referred to * in the basis library code. See basis-library/misc/primitive.sml. *) fun toString (n: 'a t): string = let fun real (s: RealSize.t, str: string): string = concat ["Real", RealSize.toString s, "_", str] fun sign {signed} = if signed then "WordS" else "WordU" fun word (s: WordSize.t, str: string): string = concat ["Word", WordSize.toString s, "_", str] fun word8Seq (seq: string, oper: string, s: WordSize.t): string = concat ["Word8", seq, "_", oper, "Word", WordSize.toString s] fun wordS (s: WordSize.t, sg, str: string): string = concat [sign sg, WordSize.toString s, "_", str] val realC = ("Real", RealSize.toString) val wordC = ("Word", WordSize.toString) fun wordCS sg = (sign sg, WordSize.toString) fun coerce (k, (n, sizeToString), (n', sizeToString'), s, s'): string = concat [n, sizeToString s, "_", k ,"To", n', sizeToString' s'] fun cast (c, c', s, s') = coerce ("cast", c, c', s, s') fun extd (c, c', s, s') = coerce ("extd", c, c', s, s') fun rnd (c, c', s, s') = coerce ("rnd", c, c', s, s') fun cpointerGet (ty, s) = concat ["CPointer_get", ty, s] fun cpointerSet (ty, s) = concat ["CPointer_set", ty, s] in case n of Array_array => "Array_array" | Array_array0Const => "Array_array0Const" | Array_length => "Array_length" | Array_sub => "Array_sub" | Array_toVector => "Array_toVector" | Array_update => "Array_update" | CPointer_add => "CPointer_add" | CPointer_diff => "CPointer_diff" | CPointer_equal => "CPointer_equal" | CPointer_fromWord => "CPointer_fromWord" | CPointer_getCPointer => "CPointer_getCPointer" | CPointer_getObjptr => "CPointer_getObjptr" | CPointer_getReal s => cpointerGet ("Real", RealSize.toString s) | CPointer_getWord s => cpointerGet ("Word", WordSize.toString s) | CPointer_lt => "CPointer_lt" | CPointer_setCPointer => "CPointer_setCPointer" | CPointer_setObjptr => "CPointer_setObjptr" | CPointer_setReal s => cpointerSet ("Real", RealSize.toString s) | CPointer_setWord s => cpointerSet ("Word", WordSize.toString s) | CPointer_sub => "CPointer_sub" | CPointer_toWord => "CPointer_toWord" | Exn_extra => "Exn_extra" | Exn_name => "Exn_name" | Exn_setExtendExtra => "Exn_setExtendExtra" | FFI f => (CFunction.Target.toString o CFunction.target) f | FFI_Symbol {name, ...} => name | GC_collect => "GC_collect" | IntInf_add => "IntInf_add" | IntInf_andb => "IntInf_andb" | IntInf_arshift => "IntInf_arshift" | IntInf_compare => "IntInf_compare" | IntInf_equal => "IntInf_equal" | IntInf_gcd => "IntInf_gcd" | IntInf_lshift => "IntInf_lshift" | IntInf_mul => "IntInf_mul" | IntInf_neg => "IntInf_neg" | IntInf_notb => "IntInf_notb" | IntInf_orb => "IntInf_orb" | IntInf_quot => "IntInf_quot" | IntInf_rem => "IntInf_rem" | IntInf_sub => "IntInf_sub" | IntInf_toString => "IntInf_toString" | IntInf_toVector => "IntInf_toVector" | IntInf_toWord => "IntInf_toWord" | IntInf_xorb => "IntInf_xorb" | MLton_bogus => "MLton_bogus" | MLton_bug => "MLton_bug" | MLton_deserialize => "MLton_deserialize" | MLton_eq => "MLton_eq" | MLton_equal => "MLton_equal" | MLton_halt => "MLton_halt" | MLton_hash => "MLton_hash" | MLton_handlesSignals => "MLton_handlesSignals" | MLton_installSignalHandler => "MLton_installSignalHandler" | MLton_serialize => "MLton_serialize" | MLton_share => "MLton_share" | MLton_size => "MLton_size" | MLton_touch => "MLton_touch" | Real_Math_acos s => real (s, "Math_acos") | Real_Math_asin s => real (s, "Math_asin") | Real_Math_atan s => real (s, "Math_atan") | Real_Math_atan2 s => real (s, "Math_atan2") | Real_Math_cos s => real (s, "Math_cos") | Real_Math_exp s => real (s, "Math_exp") | Real_Math_ln s => real (s, "Math_ln") | Real_Math_log10 s => real (s, "Math_log10") | Real_Math_sin s => real (s, "Math_sin") | Real_Math_sqrt s => real (s, "Math_sqrt") | Real_Math_tan s => real (s, "Math_tan") | Real_abs s => real (s, "abs") | Real_add s => real (s, "add") | Real_castToWord (s1, s2) => cast (realC, wordC, s1, s2) | Real_div s => real (s, "div") | Real_equal s => real (s, "equal") | Real_ldexp s => real (s, "ldexp") | Real_le s => real (s, "le") | Real_lt s => real (s, "lt") | Real_mul s => real (s, "mul") | Real_muladd s => real (s, "muladd") | Real_mulsub s => real (s, "mulsub") | Real_neg s => real (s, "neg") | Real_qequal s => real (s, "qequal") | Real_rndToReal (s1, s2) => rnd (realC, realC, s1, s2) | Real_rndToWord (s1, s2, sg) => rnd (realC, wordCS sg, s1, s2) | Real_round s => real (s, "round") | Real_sub s => real (s, "sub") | Ref_assign => "Ref_assign" | Ref_deref => "Ref_deref" | Ref_ref => "Ref_ref" | String_toWord8Vector => "String_toWord8Vector" | Thread_atomicBegin => "Thread_atomicBegin" | Thread_atomicEnd => "Thread_atomicEnd" | Thread_atomicState => "Thread_atomicState" | Thread_copy => "Thread_copy" | Thread_copyCurrent => "Thread_copyCurrent" | Thread_returnToC => "Thread_returnToC" | Thread_switchTo => "Thread_switchTo" | TopLevel_getHandler => "TopLevel_getHandler" | TopLevel_getSuffix => "TopLevel_getSuffix" | TopLevel_setHandler => "TopLevel_setHandler" | TopLevel_setSuffix => "TopLevel_setSuffix" | Vector_length => "Vector_length" | Vector_sub => "Vector_sub" | Weak_canGet => "Weak_canGet" | Weak_get => "Weak_get" | Weak_new => "Weak_new" | Word8Array_subWord w => word8Seq ("Array", "sub", w) | Word8Array_updateWord w => word8Seq ("Array", "update", w) | Word8Vector_subWord w => word8Seq ("Vector", "sub", w) | Word8Vector_toString => "Word8Vector_toString" | WordVector_toIntInf => "WordVector_toIntInf" | Word_add s => word (s, "add") | Word_addCheck (s, sg) => wordS (s, sg, "addCheck") | Word_andb s => word (s, "andb") | Word_castToReal (s1, s2) => cast (wordC, realC, s1, s2) | Word_equal s => word (s, "equal") | Word_extdToWord (s1, s2, sg) => extd (wordCS sg, wordC, s1, s2) | Word_lshift s => word (s, "lshift") | Word_lt (s, sg) => wordS (s, sg, "lt") | Word_mul (s, sg) => wordS (s, sg, "mul") | Word_mulCheck (s, sg) => wordS (s, sg, "mulCheck") | Word_neg s => word (s, "neg") | Word_negCheck s => word (s, "negCheck") | Word_notb s => word (s, "notb") | Word_orb s => word (s, "orb") | Word_quot (s, sg) => wordS (s, sg, "quot") | Word_rem (s, sg) => wordS (s, sg, "rem") | Word_rndToReal (s1, s2, sg) => rnd (wordCS sg, realC, s1, s2) | Word_rol s => word (s, "rol") | Word_ror s => word (s, "ror") | Word_rshift (s, sg) => wordS (s, sg, "rshift") | Word_sub s => word (s, "sub") | Word_subCheck (s, sg) => wordS (s, sg, "subCheck") | Word_toIntInf => "Word_toIntInf" | Word_xorb s => word (s, "xorb") | World_save => "World_save" end fun layout p = Layout.str (toString p) val equals: 'a t * 'a t -> bool = fn (Array_array, Array_array) => true | (Array_array0Const, Array_array0Const) => true | (Array_length, Array_length) => true | (Array_sub, Array_sub) => true | (Array_toVector, Array_toVector) => true | (Array_update, Array_update) => true | (CPointer_add, CPointer_add) => true | (CPointer_diff, CPointer_diff) => true | (CPointer_equal, CPointer_equal) => true | (CPointer_fromWord, CPointer_fromWord) => true | (CPointer_getCPointer, CPointer_getCPointer) => true | (CPointer_getObjptr, CPointer_getObjptr) => true | (CPointer_getReal s, CPointer_getReal s') => RealSize.equals (s, s') | (CPointer_getWord s, CPointer_getWord s') => WordSize.equals (s, s') | (CPointer_lt, CPointer_lt) => true | (CPointer_setCPointer, CPointer_setCPointer) => true | (CPointer_setObjptr, CPointer_setObjptr) => true | (CPointer_setReal s, CPointer_setReal s') => RealSize.equals (s, s') | (CPointer_setWord s, CPointer_setWord s') => WordSize.equals (s, s') | (CPointer_sub, CPointer_sub) => true | (CPointer_toWord, CPointer_toWord) => true | (Exn_extra, Exn_extra) => true | (Exn_name, Exn_name) => true | (Exn_setExtendExtra, Exn_setExtendExtra) => true | (FFI f, FFI f') => CFunction.equals (f, f') | (FFI_Symbol {name = n, ...}, FFI_Symbol {name = n', ...}) => n = n' | (GC_collect, GC_collect) => true | (IntInf_add, IntInf_add) => true | (IntInf_andb, IntInf_andb) => true | (IntInf_arshift, IntInf_arshift) => true | (IntInf_compare, IntInf_compare) => true | (IntInf_equal, IntInf_equal) => true | (IntInf_gcd, IntInf_gcd) => true | (IntInf_lshift, IntInf_lshift) => true | (IntInf_mul, IntInf_mul) => true | (IntInf_neg, IntInf_neg) => true | (IntInf_notb, IntInf_notb) => true | (IntInf_orb, IntInf_orb) => true | (IntInf_quot, IntInf_quot) => true | (IntInf_rem, IntInf_rem) => true | (IntInf_sub, IntInf_sub) => true | (IntInf_toString, IntInf_toString) => true | (IntInf_toVector, IntInf_toVector) => true | (IntInf_toWord, IntInf_toWord) => true | (IntInf_xorb, IntInf_xorb) => true | (MLton_bogus, MLton_bogus) => true | (MLton_bug, MLton_bug) => true | (MLton_deserialize, MLton_deserialize) => true | (MLton_eq, MLton_eq) => true | (MLton_equal, MLton_equal) => true | (MLton_halt, MLton_halt) => true | (MLton_hash, MLton_hash) => true | (MLton_handlesSignals, MLton_handlesSignals) => true | (MLton_installSignalHandler, MLton_installSignalHandler) => true | (MLton_serialize, MLton_serialize) => true | (MLton_share, MLton_share) => true | (MLton_size, MLton_size) => true | (MLton_touch, MLton_touch) => true | (Real_Math_acos s, Real_Math_acos s') => RealSize.equals (s, s') | (Real_Math_asin s, Real_Math_asin s') => RealSize.equals (s, s') | (Real_Math_atan s, Real_Math_atan s') => RealSize.equals (s, s') | (Real_Math_atan2 s, Real_Math_atan2 s') => RealSize.equals (s, s') | (Real_Math_cos s, Real_Math_cos s') => RealSize.equals (s, s') | (Real_Math_exp s, Real_Math_exp s') => RealSize.equals (s, s') | (Real_Math_ln s, Real_Math_ln s') => RealSize.equals (s, s') | (Real_Math_log10 s, Real_Math_log10 s') => RealSize.equals (s, s') | (Real_Math_sin s, Real_Math_sin s') => RealSize.equals (s, s') | (Real_Math_sqrt s, Real_Math_sqrt s') => RealSize.equals (s, s') | (Real_Math_tan s, Real_Math_tan s') => RealSize.equals (s, s') | (Real_abs s, Real_abs s') => RealSize.equals (s, s') | (Real_add s, Real_add s') => RealSize.equals (s, s') | (Real_castToWord (s1, s2), Real_castToWord (s1', s2')) => RealSize.equals (s1, s1') andalso WordSize.equals (s2, s2') | (Real_div s, Real_div s') => RealSize.equals (s, s') | (Real_equal s, Real_equal s') => RealSize.equals (s, s') | (Real_ldexp s, Real_ldexp s') => RealSize.equals (s, s') | (Real_le s, Real_le s') => RealSize.equals (s, s') | (Real_lt s, Real_lt s') => RealSize.equals (s, s') | (Real_mul s, Real_mul s') => RealSize.equals (s, s') | (Real_muladd s, Real_muladd s') => RealSize.equals (s, s') | (Real_mulsub s, Real_mulsub s') => RealSize.equals (s, s') | (Real_neg s, Real_neg s') => RealSize.equals (s, s') | (Real_qequal s, Real_qequal s') => RealSize.equals (s, s') | (Real_rndToReal (s1, s2), Real_rndToReal (s1', s2')) => RealSize.equals (s1, s1') andalso RealSize.equals (s2, s2') | (Real_rndToWord (s1, s2, sg), Real_rndToWord (s1', s2', sg')) => RealSize.equals (s1, s1') andalso WordSize.equals (s2, s2') andalso sg = sg' | (Real_round s, Real_round s') => RealSize.equals (s, s') | (Real_sub s, Real_sub s') => RealSize.equals (s, s') | (Ref_assign, Ref_assign) => true | (Ref_deref, Ref_deref) => true | (Ref_ref, Ref_ref) => true | (String_toWord8Vector, String_toWord8Vector) => true | (Thread_atomicBegin, Thread_atomicBegin) => true | (Thread_atomicEnd, Thread_atomicEnd) => true | (Thread_atomicState, Thread_atomicState) => true | (Thread_copy, Thread_copy) => true | (Thread_copyCurrent, Thread_copyCurrent) => true | (Thread_returnToC, Thread_returnToC) => true | (Thread_switchTo, Thread_switchTo) => true | (TopLevel_getHandler, TopLevel_getHandler) => true | (TopLevel_getSuffix, TopLevel_getSuffix) => true | (TopLevel_setHandler, TopLevel_setHandler) => true | (TopLevel_setSuffix, TopLevel_setSuffix) => true | (Vector_length, Vector_length) => true | (Vector_sub, Vector_sub) => true | (Weak_canGet, Weak_canGet) => true | (Weak_get, Weak_get) => true | (Weak_new, Weak_new) => true | (Word_add s, Word_add s') => WordSize.equals (s, s') | (Word_addCheck (s, sg), Word_addCheck (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_andb s, Word_andb s') => WordSize.equals (s, s') | (Word_castToReal (s1, s2), Word_castToReal (s1', s2')) => WordSize.equals (s1, s1') andalso RealSize.equals (s2, s2') | (Word_extdToWord (s1, s2, sg), Word_extdToWord (s1', s2', sg')) => WordSize.equals (s1, s1') andalso WordSize.equals (s2, s2') andalso sg = sg' | (Word_equal s, Word_equal s') => WordSize.equals (s, s') | (Word_lshift s, Word_lshift s') => WordSize.equals (s, s') | (Word_lt (s, sg), Word_lt (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_mul (s, sg), Word_mul (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_mulCheck (s, sg), Word_mulCheck (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_neg s, Word_neg s') => WordSize.equals (s, s') | (Word_negCheck s, Word_negCheck s') => WordSize.equals (s, s') | (Word_notb s, Word_notb s') => WordSize.equals (s, s') | (Word_orb s, Word_orb s') => WordSize.equals (s, s') | (Word_quot (s, sg), Word_quot (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_rem (s, sg), Word_rem (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_rndToReal (s1, s2, sg), Word_rndToReal (s1', s2', sg')) => WordSize.equals (s1, s1') andalso RealSize.equals (s2, s2') andalso sg = sg' | (Word_rol s, Word_rol s') => WordSize.equals (s, s') | (Word_ror s, Word_ror s') => WordSize.equals (s, s') | (Word_rshift (s, sg), Word_rshift (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_sub s, Word_sub s') => WordSize.equals (s, s') | (Word_subCheck (s, sg), Word_subCheck (s', sg')) => WordSize.equals (s, s') andalso sg = sg' | (Word_toIntInf, Word_toIntInf) => true | (Word_xorb s, Word_xorb s') => WordSize.equals (s, s') | (WordVector_toIntInf, WordVector_toIntInf) => true | (Word8Array_subWord s, Word8Array_subWord s') => WordSize.equals (s, s') | (Word8Array_updateWord s, Word8Array_updateWord s') => WordSize.equals (s, s') | (Word8Vector_subWord s, Word8Vector_subWord s') => WordSize.equals (s, s') | (Word8Vector_toString, Word8Vector_toString) => true | (World_save, World_save) => true | _ => false val map: 'a t * ('a -> 'b) -> 'b t = fn (p, f) => case p of Array_array => Array_array | Array_array0Const => Array_array0Const | Array_length => Array_length | Array_sub => Array_sub | Array_toVector => Array_toVector | Array_update => Array_update | CPointer_add => CPointer_add | CPointer_diff => CPointer_diff | CPointer_equal => CPointer_equal | CPointer_fromWord => CPointer_fromWord | CPointer_getCPointer => CPointer_getCPointer | CPointer_getObjptr => CPointer_getObjptr | CPointer_getReal z => CPointer_getReal z | CPointer_getWord z => CPointer_getWord z | CPointer_lt => CPointer_lt | CPointer_setCPointer => CPointer_setCPointer | CPointer_setObjptr => CPointer_setObjptr | CPointer_setReal z => CPointer_setReal z | CPointer_setWord z => CPointer_setWord z | CPointer_sub => CPointer_sub | CPointer_toWord => CPointer_toWord | Exn_extra => Exn_extra | Exn_name => Exn_name | Exn_setExtendExtra => Exn_setExtendExtra | FFI func => FFI (CFunction.map (func, f)) | FFI_Symbol {name, cty, symbolScope} => FFI_Symbol {name = name, cty = cty, symbolScope = symbolScope} | GC_collect => GC_collect | IntInf_add => IntInf_add | IntInf_andb => IntInf_andb | IntInf_arshift => IntInf_arshift | IntInf_compare => IntInf_compare | IntInf_equal => IntInf_equal | IntInf_gcd => IntInf_gcd | IntInf_lshift => IntInf_lshift | IntInf_mul => IntInf_mul | IntInf_neg => IntInf_neg | IntInf_notb => IntInf_notb | IntInf_orb => IntInf_orb | IntInf_quot => IntInf_quot | IntInf_rem => IntInf_rem | IntInf_sub => IntInf_sub | IntInf_toString => IntInf_toString | IntInf_toVector => IntInf_toVector | IntInf_toWord => IntInf_toWord | IntInf_xorb => IntInf_xorb | MLton_bogus => MLton_bogus | MLton_bug => MLton_bug | MLton_deserialize => MLton_deserialize | MLton_eq => MLton_eq | MLton_equal => MLton_equal | MLton_halt => MLton_halt | MLton_hash => MLton_hash | MLton_handlesSignals => MLton_handlesSignals | MLton_installSignalHandler => MLton_installSignalHandler | MLton_serialize => MLton_serialize | MLton_share => MLton_share | MLton_size => MLton_size | MLton_touch => MLton_touch | Real_Math_acos z => Real_Math_acos z | Real_Math_asin z => Real_Math_asin z | Real_Math_atan z => Real_Math_atan z | Real_Math_atan2 z => Real_Math_atan2 z | Real_Math_cos z => Real_Math_cos z | Real_Math_exp z => Real_Math_exp z | Real_Math_ln z => Real_Math_ln z | Real_Math_log10 z => Real_Math_log10 z | Real_Math_sin z => Real_Math_sin z | Real_Math_sqrt z => Real_Math_sqrt z | Real_Math_tan z => Real_Math_tan z | Real_abs z => Real_abs z | Real_add z => Real_add z | Real_castToWord z => Real_castToWord z | Real_div z => Real_div z | Real_equal z => Real_equal z | Real_ldexp z => Real_ldexp z | Real_le z => Real_le z | Real_lt z => Real_lt z | Real_mul z => Real_mul z | Real_muladd z => Real_muladd z | Real_mulsub z => Real_mulsub z | Real_neg z => Real_neg z | Real_qequal z => Real_qequal z | Real_rndToReal z => Real_rndToReal z | Real_rndToWord z => Real_rndToWord z | Real_round z => Real_round z | Real_sub z => Real_sub z | Ref_assign => Ref_assign | Ref_deref => Ref_deref | Ref_ref => Ref_ref | String_toWord8Vector => String_toWord8Vector | Thread_atomicBegin => Thread_atomicBegin | Thread_atomicEnd => Thread_atomicEnd | Thread_atomicState => Thread_atomicState | Thread_copy => Thread_copy | Thread_copyCurrent => Thread_copyCurrent | Thread_returnToC => Thread_returnToC | Thread_switchTo => Thread_switchTo | TopLevel_getHandler => TopLevel_getHandler | TopLevel_getSuffix => TopLevel_getSuffix | TopLevel_setHandler => TopLevel_setHandler | TopLevel_setSuffix => TopLevel_setSuffix | Vector_length => Vector_length | Vector_sub => Vector_sub | Weak_canGet => Weak_canGet | Weak_get => Weak_get | Weak_new => Weak_new | Word_add z => Word_add z | Word_addCheck z => Word_addCheck z | Word_andb z => Word_andb z | Word_castToReal z => Word_castToReal z | Word_equal z => Word_equal z | Word_extdToWord z => Word_extdToWord z | Word_lshift z => Word_lshift z | Word_lt z => Word_lt z | Word_mul z => Word_mul z | Word_mulCheck z => Word_mulCheck z | Word_neg z => Word_neg z | Word_negCheck z => Word_negCheck z | Word_notb z => Word_notb z | Word_orb z => Word_orb z | Word_quot z => Word_quot z | Word_rem z => Word_rem z | Word_rndToReal z => Word_rndToReal z | Word_rol z => Word_rol z | Word_ror z => Word_ror z | Word_rshift z => Word_rshift z | Word_sub z => Word_sub z | Word_subCheck z => Word_subCheck z | Word_toIntInf => Word_toIntInf | Word_xorb z => Word_xorb z | WordVector_toIntInf => WordVector_toIntInf | Word8Array_subWord z => Word8Array_subWord z | Word8Array_updateWord z => Word8Array_updateWord z | Word8Vector_subWord z => Word8Vector_subWord z | Word8Vector_toString => Word8Vector_toString | World_save => World_save val cast: 'a t -> 'b t = fn p => map (p, fn _ => Error.bug "Prim.cast") val array = Array_array val arrayLength = Array_length val assign = Ref_assign val bogus = MLton_bogus val bug = MLton_bug val cpointerAdd = CPointer_add val cpointerDiff = CPointer_diff val cpointerEqual = CPointer_equal fun cpointerGet ctype = let datatype z = datatype CType.t in case ctype of CPointer => CPointer_getCPointer | Int8 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 8)) | Int16 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 16)) | Int32 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 32)) | Int64 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 64)) | Objptr => CPointer_getObjptr | Real32 => CPointer_getReal RealSize.R32 | Real64 => CPointer_getReal RealSize.R64 | Word8 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 8)) | Word16 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 16)) | Word32 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 32)) | Word64 => CPointer_getWord (WordSize.fromBits (Bits.fromInt 64)) end val cpointerLt = CPointer_lt fun cpointerSet ctype = let datatype z = datatype CType.t in case ctype of CPointer => CPointer_setCPointer | Int8 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 8)) | Int16 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 16)) | Int32 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 32)) | Int64 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 64)) | Objptr => CPointer_setObjptr | Real32 => CPointer_setReal RealSize.R32 | Real64 => CPointer_setReal RealSize.R64 | Word8 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 8)) | Word16 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 16)) | Word32 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 32)) | Word64 => CPointer_setWord (WordSize.fromBits (Bits.fromInt 64)) end val cpointerSub = CPointer_sub val cpointerToWord = CPointer_toWord val deref = Ref_deref val eq = MLton_eq val equal = MLton_equal val ffi = FFI val ffiSymbol = FFI_Symbol val hash = MLton_hash val intInfEqual = IntInf_equal val intInfToVector = IntInf_toVector val intInfToWord = IntInf_toWord val intInfNeg = IntInf_neg val intInfNotb = IntInf_notb val realCastToWord = Real_castToWord val reff = Ref_ref val touch = MLton_touch val vectorLength = Vector_length val vectorSub = Vector_sub val wordAdd = Word_add val wordAddCheck = Word_addCheck val wordAndb = Word_andb val wordCastToReal = Word_castToReal val wordEqual = Word_equal val wordExtdToWord = Word_extdToWord val wordLshift = Word_lshift val wordLt = Word_lt val wordMul = Word_mul val wordNeg = Word_neg val wordNegCheck = Word_negCheck val wordNotb = Word_notb val wordOrb = Word_orb val wordQuot = Word_quot val wordRshift = Word_rshift val wordSub = Word_sub val wordXorb = Word_xorb val isCommutative = fn IntInf_equal => true | MLton_eq => true | MLton_equal => true | Real_add _ => true | Real_mul _ => true | Real_equal _ => true | Real_qequal _ => true | Word_add _ => true | Word_addCheck _ => true | Word_andb _ => true | Word_equal _ => true | Word_mul _ => true | Word_mulCheck _ => true | Word_orb _ => true | Word_xorb _ => true | _ => false val mayOverflow = fn Word_addCheck _ => true | Word_mulCheck _ => true | Word_negCheck _ => true | Word_subCheck _ => true | _ => false val kind: 'a t -> Kind.t = fn p => let datatype z = datatype Kind.t in case p of Array_array => Moveable | Array_array0Const => Moveable | Array_length => Functional | Array_sub => DependsOnState | Array_toVector => DependsOnState | Array_update => SideEffect | CPointer_add => Functional | CPointer_diff => Functional | CPointer_equal => Functional | CPointer_fromWord => Functional | CPointer_getCPointer => DependsOnState | CPointer_getObjptr => DependsOnState | CPointer_getReal _ => DependsOnState | CPointer_getWord _ => DependsOnState | CPointer_lt => Functional | CPointer_setCPointer => SideEffect | CPointer_setObjptr => SideEffect | CPointer_setReal _ => SideEffect | CPointer_setWord _ => SideEffect | CPointer_sub => Functional | CPointer_toWord => Functional | Exn_extra => Functional | Exn_name => Functional | Exn_setExtendExtra => SideEffect | FFI _ => Kind.SideEffect | FFI_Symbol _ => Functional | GC_collect => SideEffect | IntInf_add => Functional | IntInf_andb => Functional | IntInf_arshift => Functional | IntInf_compare => Functional | IntInf_equal => Functional | IntInf_gcd => Functional | IntInf_lshift => Functional | IntInf_mul => Functional | IntInf_neg => Functional | IntInf_notb => Functional | IntInf_orb => Functional | IntInf_quot => Functional | IntInf_rem => Functional | IntInf_sub => Functional | IntInf_toString => Functional | IntInf_toVector => Functional | IntInf_toWord => Functional | IntInf_xorb => Functional | MLton_bogus => Functional | MLton_bug => SideEffect | MLton_deserialize => Moveable | MLton_eq => Functional | MLton_equal => Functional | MLton_halt => SideEffect | MLton_hash => Functional | MLton_handlesSignals => Functional | MLton_installSignalHandler => SideEffect | MLton_serialize => DependsOnState | MLton_share => SideEffect | MLton_size => DependsOnState | MLton_touch => SideEffect | Real_Math_acos _ => DependsOnState (* depends on rounding mode *) | Real_Math_asin _ => DependsOnState (* depends on rounding mode *) | Real_Math_atan _ => DependsOnState (* depends on rounding mode *) | Real_Math_atan2 _ => DependsOnState (* depends on rounding mode *) | Real_Math_cos _ => DependsOnState (* depends on rounding mode *) | Real_Math_exp _ => DependsOnState (* depends on rounding mode *) | Real_Math_ln _ => DependsOnState (* depends on rounding mode *) | Real_Math_log10 _ => DependsOnState (* depends on rounding mode *) | Real_Math_sin _ => DependsOnState (* depends on rounding mode *) | Real_Math_sqrt _ => DependsOnState (* depends on rounding mode *) | Real_Math_tan _ => DependsOnState (* depends on rounding mode *) | Real_abs _ => Functional | Real_add _ => DependsOnState (* depends on rounding mode *) | Real_castToWord _ => Functional | Real_div _ => DependsOnState (* depends on rounding mode *) | Real_equal _ => Functional | Real_ldexp _ => DependsOnState (* depends on rounding mode *) | Real_le _ => Functional | Real_lt _ => Functional | Real_mul _ => DependsOnState (* depends on rounding mode *) | Real_muladd _ => DependsOnState (* depends on rounding mode *) | Real_mulsub _ => DependsOnState (* depends on rounding mode *) | Real_neg _ => Functional | Real_qequal _ => Functional | Real_rndToReal _ => DependsOnState (* depends on rounding mode *) | Real_rndToWord _ => Functional | Real_round _ => DependsOnState (* depends on rounding mode *) | Real_sub _ => DependsOnState (* depends on rounding mode *) | Ref_assign => SideEffect | Ref_deref => DependsOnState | Ref_ref => Moveable | String_toWord8Vector => Functional | Thread_atomicBegin => SideEffect | Thread_atomicEnd => SideEffect | Thread_atomicState => DependsOnState | Thread_copy => Moveable | Thread_copyCurrent => SideEffect | Thread_returnToC => SideEffect | Thread_switchTo => SideEffect | TopLevel_getHandler => DependsOnState | TopLevel_getSuffix => DependsOnState | TopLevel_setHandler => SideEffect | TopLevel_setSuffix => SideEffect | Vector_length => Functional | Vector_sub => Functional | Weak_canGet => DependsOnState | Weak_get => DependsOnState | Weak_new => Moveable | Word8Array_subWord _ => DependsOnState | Word8Array_updateWord _ => SideEffect | Word8Vector_subWord _ => Functional | Word8Vector_toString => Functional | WordVector_toIntInf => Functional | Word_add _ => Functional | Word_addCheck _ => SideEffect | Word_andb _ => Functional | Word_castToReal _ => Functional | Word_equal _ => Functional | Word_extdToWord _ => Functional | Word_lshift _ => Functional | Word_lt _ => Functional | Word_mul _ => Functional | Word_mulCheck _ => SideEffect | Word_neg _ => Functional | Word_negCheck _ => SideEffect | Word_notb _ => Functional | Word_orb _ => Functional | Word_quot _ => Functional | Word_rem _ => Functional | Word_rndToReal _ => DependsOnState (* depends on rounding mode *) | Word_rol _ => Functional | Word_ror _ => Functional | Word_rshift _ => Functional | Word_sub _ => Functional | Word_subCheck _ => SideEffect | Word_toIntInf => Functional | Word_xorb _ => Functional | World_save => SideEffect end fun isFunctional p = Kind.Functional = kind p fun maySideEffect p = Kind.SideEffect = kind p local fun reals (s: RealSize.t) = [(Real_Math_acos s), (Real_Math_asin s), (Real_Math_atan s), (Real_Math_atan2 s), (Real_Math_cos s), (Real_Math_exp s), (Real_Math_ln s), (Real_Math_log10 s), (Real_Math_sin s), (Real_Math_sqrt s), (Real_Math_tan s), (Real_abs s), (Real_add s), (Real_div s), (Real_equal s), (Real_ldexp s), (Real_le s), (Real_lt s), (Real_mul s), (Real_muladd s), (Real_mulsub s), (Real_neg s), (Real_qequal s), (Real_round s), (Real_sub s)] fun wordSigns (s: WordSize.t, signed: bool) = let val sg = {signed = signed} in List.map ([Word_addCheck, Word_lt, Word_mul, Word_mulCheck, Word_quot, Word_rem, Word_rshift, Word_subCheck], fn p => p (s, sg)) end fun words (s: WordSize.t) = [(Word_add s), (Word_andb s), (Word_equal s), (Word_lshift s), (Word_neg s), (Word_negCheck s), (Word_notb s), (Word_orb s), (Word_rol s), (Word_ror s), (Word_sub s), (Word_xorb s)] @ wordSigns (s, true) @ wordSigns (s, false) fun word8Seqs (s: WordSize.t) = [(Word8Array_subWord s), (Word8Array_updateWord s), (Word8Vector_subWord s)] in val all: unit t list = [Array_array, Array_array0Const, Array_length, Array_sub, Array_toVector, Array_update, CPointer_add, CPointer_diff, CPointer_equal, CPointer_fromWord, CPointer_getCPointer, CPointer_getObjptr, CPointer_lt, CPointer_setCPointer, CPointer_setObjptr, CPointer_sub, CPointer_toWord, Exn_extra, Exn_name, Exn_setExtendExtra, GC_collect, IntInf_add, IntInf_andb, IntInf_arshift, IntInf_compare, IntInf_equal, IntInf_gcd, IntInf_lshift, IntInf_mul, IntInf_notb, IntInf_neg, IntInf_orb, IntInf_quot, IntInf_rem, IntInf_sub, IntInf_toString, IntInf_toVector, IntInf_toWord, IntInf_xorb, MLton_bogus, MLton_bug, MLton_deserialize, MLton_eq, MLton_equal, MLton_halt, MLton_hash, MLton_handlesSignals, MLton_installSignalHandler, MLton_serialize, MLton_share, MLton_size, MLton_touch, Ref_assign, Ref_deref, Ref_ref, String_toWord8Vector, Thread_atomicBegin, Thread_atomicEnd, Thread_atomicState, Thread_copy, Thread_copyCurrent, Thread_returnToC, Thread_switchTo, TopLevel_getHandler, TopLevel_getSuffix, TopLevel_setHandler, TopLevel_setSuffix, Vector_length, Vector_sub, Weak_canGet, Weak_get, Weak_new, Word_toIntInf, WordVector_toIntInf, Word8Vector_toString, World_save] @ List.concat [List.concatMap (RealSize.all, reals), List.concatMap (WordSize.prims, words)] @ let val real = RealSize.all val word = WordSize.all fun coerces (name, sizes, sizes', ac) = List.fold (sizes, ac, fn (s, ac) => List.fold (sizes', ac, fn (s', ac) => name (s, s') :: ac)) fun coercesS (name, sizes, sizes', ac) = List.fold ([false, true], ac, fn (signed, ac) => coerces (fn (s, s') => name (s, s', {signed = signed}), sizes, sizes', ac)) fun casts (name, sizes, ac) = List.fold (sizes, ac, fn (s, ac) => name s :: ac) in casts (fn rs => Real_castToWord (rs, WordSize.fromBits (RealSize.bits rs)), real, coerces (Real_rndToReal, real, real, coercesS (Real_rndToWord, real, word, casts (fn rs => Word_castToReal (WordSize.fromBits (RealSize.bits rs), rs), real, coercesS (Word_extdToWord, word, word, coercesS (Word_rndToReal, word, real, [])))))) end @ List.concatMap (WordSize.prims, word8Seqs) @ let fun doit (all, get, set) = List.concatMap (all, fn s => [get s, set s]) in List.concat [doit (RealSize.all, CPointer_getReal, CPointer_setReal), doit (WordSize.prims, CPointer_getWord, CPointer_setWord)] end end local val table: {hash: word, prim: unit t, string: string} HashSet.t = HashSet.new {hash = #hash} val () = List.foreach (all, fn prim => let val string = toString prim val hash = String.hash string val _ = HashSet.lookupOrInsert (table, hash, fn _ => false, fn () => {hash = hash, prim = prim, string = string}) in () end) in val fromString: string -> 'a t option = fn name => Option.map (HashSet.peek (table, String.hash name, fn {string, ...} => name = string), fn {prim, ...} => cast prim) end fun 'a checkApp (prim: 'a t, {args: 'a vector, result: 'a, targs: 'a vector, typeOps = {array: 'a -> 'a, arrow: 'a * 'a -> 'a, bool: 'a, cpointer: 'a, equals: 'a * 'a -> bool, exn: 'a, intInf: 'a, real: RealSize.t -> 'a, reff: 'a -> 'a, thread: 'a, unit: 'a, vector: 'a -> 'a, weak: 'a -> 'a, word: WordSize.t -> 'a}}): bool = let fun arg i = Vector.sub (args, i) fun noArgs () = 0 = Vector.length args fun oneArg arg0' () = 1 = Vector.length args andalso equals (arg0', arg 0) fun twoArgs (arg0', arg1') () = 2 = Vector.length args andalso equals (arg0', arg 0) andalso equals (arg1', arg 1) fun threeArgs (arg0', arg1', arg2') () = 3 = Vector.length args andalso equals (arg0', arg 0) andalso equals (arg1', arg 1) andalso equals (arg2', arg 2) fun nArgs args' () = Vector.equals (args', args, equals) fun done (args, result') = args () andalso equals (result', result) fun targ i = Vector.sub (targs, i) fun noTargs f = 0 = Vector.length targs andalso done (f ()) fun oneTarg f = 1 = Vector.length targs andalso done (f (targ 0)) local fun make f s = let val t = f s in noTargs (fn () => (oneArg t, t)) end in val realUnary = make real val wordUnary = make word end local fun make f s = let val t = f s in noTargs (fn () => (twoArgs (t, t), t)) end in val realBinary = make real val wordBinary = make word end local fun make f s = let val t = f s in noTargs (fn () => (twoArgs (t, t), bool)) end in val realCompare = make real val wordCompare = make word end val cint = word (WordSize.cint ()) val compareRes = word WordSize.compareRes val csize = word (WordSize.csize ()) val cptrdiff = word (WordSize.cptrdiff ()) val seqIndex = word (WordSize.seqIndex ()) val shiftArg = word WordSize.shiftArg val bigIntInfWord = word (WordSize.bigIntInfWord ()) val smallIntInfWord = word (WordSize.smallIntInfWord ()) val word8 = word WordSize.word8 val word32 = word WordSize.word32 fun intInfBinary () = noTargs (fn () => (threeArgs (intInf, intInf, csize), intInf)) fun intInfShift () = noTargs (fn () => (threeArgs (intInf, shiftArg, csize), intInf)) fun intInfUnary () = noTargs (fn () => (twoArgs (intInf, csize), intInf)) fun realTernary s = noTargs (fn () => (threeArgs (real s, real s, real s), real s)) val word8Array = array word8 fun wordShift s = noTargs (fn () => (twoArgs (word s, shiftArg), word s)) val word8Vector = vector word8 val string = word8Vector in case prim of Array_array => oneTarg (fn targ => (oneArg seqIndex, array targ)) | Array_array0Const => oneTarg (fn targ => (noArgs, array targ)) | Array_length => oneTarg (fn t => (oneArg (array t), seqIndex)) | Array_sub => oneTarg (fn t => (twoArgs (array t, seqIndex), t)) | Array_toVector => oneTarg (fn t => (oneArg (array t), vector t)) | Array_update => oneTarg (fn t => (threeArgs (array t, seqIndex, t), unit)) | CPointer_add => noTargs (fn () => (twoArgs (cpointer, cptrdiff), cpointer)) | CPointer_diff => noTargs (fn () => (twoArgs (cpointer, cpointer), cptrdiff)) | CPointer_equal => noTargs (fn () => (twoArgs (cpointer, cpointer), bool)) | CPointer_fromWord => noTargs (fn () => (oneArg (csize), cpointer)) | CPointer_getCPointer => noTargs (fn () => (twoArgs (cpointer, cptrdiff), cpointer)) | CPointer_getObjptr => oneTarg (fn t => (twoArgs (cpointer, cptrdiff), t)) | CPointer_getReal s => noTargs (fn () => (twoArgs (cpointer, cptrdiff), real s)) | CPointer_getWord s => noTargs (fn () => (twoArgs (cpointer, cptrdiff), word s)) | CPointer_lt => noTargs (fn () => (twoArgs (cpointer, cpointer), bool)) | CPointer_setCPointer => noTargs (fn () => (threeArgs (cpointer, cptrdiff, cpointer), unit)) | CPointer_setObjptr => oneTarg (fn t => (threeArgs (cpointer, cptrdiff, t), unit)) | CPointer_setReal s => noTargs (fn () => (threeArgs (cpointer, cptrdiff, real s), unit)) | CPointer_setWord s => noTargs (fn () => (threeArgs (cpointer, cptrdiff, word s), unit)) | CPointer_sub => noTargs (fn () => (twoArgs (cpointer, cptrdiff), cpointer)) | CPointer_toWord => noTargs (fn () => (oneArg cpointer, csize)) | Exn_extra => oneTarg (fn t => (oneArg exn, t)) | Exn_name => noTargs (fn () => (oneArg exn, string)) | Exn_setExtendExtra => oneTarg (fn t => (oneArg (arrow (t, t)), unit)) | FFI f => noTargs (fn () => (nArgs (CFunction.args f), CFunction.return f)) | FFI_Symbol _ => noTargs (fn () => (noArgs, cpointer)) | GC_collect => noTargs (fn () => (noArgs, unit)) | IntInf_add => intInfBinary () | IntInf_andb => intInfBinary () | IntInf_arshift => intInfShift () | IntInf_compare => noTargs (fn () => (twoArgs (intInf, intInf), compareRes)) | IntInf_equal => noTargs (fn () => (twoArgs (intInf, intInf), bool)) | IntInf_gcd => intInfBinary () | IntInf_lshift => intInfShift () | IntInf_mul => intInfBinary () | IntInf_neg => intInfUnary () | IntInf_notb => intInfUnary () | IntInf_orb => intInfBinary () | IntInf_quot => intInfBinary () | IntInf_rem => intInfBinary () | IntInf_sub => intInfBinary () | IntInf_toString => noTargs (fn () => (threeArgs (intInf, word32, csize), string)) | IntInf_toVector => noTargs (fn () => (oneArg intInf, vector bigIntInfWord)) | IntInf_toWord => noTargs (fn () => (oneArg intInf, smallIntInfWord)) | IntInf_xorb => intInfBinary () | MLton_bogus => oneTarg (fn t => (noArgs, t)) | MLton_bug => noTargs (fn () => (oneArg string, unit)) | MLton_deserialize => oneTarg (fn t => (oneArg word8Vector, t)) | MLton_eq => oneTarg (fn t => (twoArgs (t, t), bool)) | MLton_equal => oneTarg (fn t => (twoArgs (t, t), bool)) | MLton_halt => noTargs (fn () => (oneArg cint, unit)) | MLton_hash => oneTarg (fn t => (oneArg t, word32)) | MLton_handlesSignals => noTargs (fn () => (noArgs, bool)) | MLton_installSignalHandler => noTargs (fn () => (noArgs, unit)) | MLton_serialize => oneTarg (fn t => (oneArg t, word8Vector)) | MLton_share => oneTarg (fn t => (oneArg t, unit)) | MLton_size => oneTarg (fn t => (oneArg t, csize)) | MLton_touch => oneTarg (fn t => (oneArg t, unit)) | Real_Math_acos s => realUnary s | Real_Math_asin s => realUnary s | Real_Math_atan s => realUnary s | Real_Math_atan2 s => realBinary s | Real_Math_cos s => realUnary s | Real_Math_exp s => realUnary s | Real_Math_ln s => realUnary s | Real_Math_log10 s => realUnary s | Real_Math_sin s => realUnary s | Real_Math_sqrt s => realUnary s | Real_Math_tan s => realUnary s | Real_abs s => realUnary s | Real_add s => realBinary s | Real_castToWord (s, s') => noTargs (fn () => (oneArg (real s), word s')) | Real_div s => realBinary s | Real_equal s => realCompare s | Real_ldexp s => noTargs (fn () => (twoArgs (real s, cint), real s)) | Real_le s => realCompare s | Real_lt s => realCompare s | Real_mul s => realBinary s | Real_muladd s => realTernary s | Real_mulsub s => realTernary s | Real_neg s => realUnary s | Real_qequal s => realCompare s | Real_rndToReal (s, s') => noTargs (fn () => (oneArg (real s), real s')) | Real_rndToWord (s, s', _) => noTargs (fn () => (oneArg (real s), word s')) | Real_round s => realUnary s | Real_sub s => realBinary s | Ref_assign => oneTarg (fn t => (twoArgs (reff t, t), unit)) | Ref_deref => oneTarg (fn t => (oneArg (reff t), t)) | Ref_ref => oneTarg (fn t => (oneArg t, reff t)) | Thread_atomicBegin => noTargs (fn () => (noArgs, unit)) | Thread_atomicEnd => noTargs (fn () => (noArgs, unit)) | Thread_atomicState => noTargs (fn () => (noArgs, word32)) | Thread_copy => noTargs (fn () => (oneArg thread, thread)) | Thread_copyCurrent => noTargs (fn () => (noArgs, unit)) | Thread_returnToC => noTargs (fn () => (noArgs, unit)) | Thread_switchTo => noTargs (fn () => (oneArg thread, unit)) | TopLevel_getHandler => noTargs (fn () => (noArgs, arrow (exn, unit))) | TopLevel_getSuffix => noTargs (fn () => (noArgs, arrow (unit, unit))) | TopLevel_setHandler => noTargs (fn () => (oneArg (arrow (exn, unit)), unit)) | TopLevel_setSuffix => noTargs (fn () => (oneArg (arrow (unit, unit)), unit)) | String_toWord8Vector => noTargs (fn () => (oneArg string, word8Vector)) | Vector_length => oneTarg (fn t => (oneArg (vector t), seqIndex)) | Vector_sub => oneTarg (fn t => (twoArgs (vector t, seqIndex), t)) | Weak_canGet => oneTarg (fn t => (oneArg (weak t), bool)) | Weak_get => oneTarg (fn t => (oneArg (weak t), t)) | Weak_new => oneTarg (fn t => (oneArg t, weak t)) | Word8Array_subWord s => noTargs (fn () => (twoArgs (word8Array, seqIndex), word s)) | Word8Array_updateWord s => noTargs (fn () => (threeArgs (word8Array, seqIndex, word s), unit)) | Word8Vector_subWord s => noTargs (fn () => (twoArgs (word8Vector, seqIndex), word s)) | Word8Vector_toString => noTargs (fn () => (oneArg (word8Vector), string)) | WordVector_toIntInf => noTargs (fn () => (oneArg (vector bigIntInfWord), intInf)) | Word_add s => wordBinary s | Word_addCheck (s, _) => wordBinary s | Word_andb s => wordBinary s | Word_castToReal (s, s') => noTargs (fn () => (oneArg (word s), real s')) | Word_equal s => wordCompare s | Word_extdToWord (s, s', _) => noTargs (fn () => (oneArg (word s), word s')) | Word_lshift s => wordShift s | Word_lt (s, _) => wordCompare s | Word_mul (s, _) => wordBinary s | Word_mulCheck (s, _) => wordBinary s | Word_neg s => wordUnary s | Word_negCheck s => wordUnary s | Word_notb s => wordUnary s | Word_orb s => wordBinary s | Word_quot (s, _) => wordBinary s | Word_rem (s, _) => wordBinary s | Word_rndToReal (s, s', _) => noTargs (fn () => (oneArg (word s), real s')) | Word_rol s => wordShift s | Word_ror s => wordShift s | Word_rshift (s, _) => wordShift s | Word_sub s => wordBinary s | Word_subCheck (s, _) => wordBinary s | Word_toIntInf => noTargs (fn () => (oneArg smallIntInfWord, intInf)) | Word_xorb s => wordBinary s | World_save => noTargs (fn () => (oneArg string, unit)) end val checkApp = fn z => Trace.trace ("Prim.check", layout o #1, Layout.ignore) checkApp z fun ('a, 'b) extractTargs (prim: 'b t, {args: 'a vector, result: 'a, typeOps = {deArray: 'a -> 'a, deArrow: 'a -> 'a * 'a, deRef: 'a -> 'a, deVector: 'a -> 'a, deWeak: 'a -> 'a}}) = let val one = Vector.new1 fun arg i = Vector.sub (args, i) datatype z = datatype t in case prim of Array_array => one (deArray result) | Array_array0Const => one (deArray result) | Array_length => one (deArray (arg 0)) | Array_sub => one (deArray (arg 0)) | Array_toVector => one (deArray (arg 0)) | Array_update => one (deArray (arg 0)) | CPointer_getObjptr => one result | CPointer_setObjptr => one (arg 2) | Exn_extra => one result | Exn_setExtendExtra => one (#2 (deArrow (arg 0))) | MLton_bogus => one result | MLton_deserialize => one result | MLton_eq => one (arg 0) | MLton_equal => one (arg 0) | MLton_hash => one (arg 0) | MLton_serialize => one (arg 0) | MLton_share => one (arg 0) | MLton_size => one (arg 0) | MLton_touch => one (arg 0) | Ref_assign => one (deRef (arg 0)) | Ref_deref => one (deRef (arg 0)) | Ref_ref => one (deRef result) | Vector_length => one (deVector (arg 0)) | Vector_sub => one (deVector (arg 0)) | Weak_canGet => one (deWeak (arg 0)) | Weak_get => one result | Weak_new => one (arg 0) | _ => Vector.new0 () end val extractTargs = fn z => Trace.trace ("Prim.extractTargs", layout o #1, Layout.ignore) extractTargs z structure SmallIntInf = Const.SmallIntInf structure ApplyArg = struct datatype 'a t = Con of {con: Con.t, hasArg: bool} | Const of Const.t | Var of 'a fun layout layoutX = fn Con {con, hasArg} => Layout.record [("con", Con.layout con), ("hasArg", Bool.layout hasArg)] | Const c => Const.layout c | Var x => layoutX x end structure ApplyResult = struct type 'a prim = 'a t val layoutPrim = layout datatype ('a, 'b) t = Apply of 'a prim * 'b list | Bool of bool | Const of Const.t | Overflow | Unknown | Var of 'b fun layout layoutX ar = let open Layout in case ar of Apply (p, args) => seq [layoutPrim p, List.layout layoutX args] | Bool b => Bool.layout b | Const c => Const.layout c | Overflow => str "Overflow" | Unknown => str "Unknown" | Var x => layoutX x end end (* * In addition to constant folding, here are the algebraic identities currently * handled. * * x * 1 = 1 * x = x * x * ~1 = ~1 * x = ~x * x * 0 = 0 * x = 0 * x + 0 = 0 + x = x * x mod x = x rem x = 0 * x mod 1 = x rem 1 = x mod ~1 = x rem ~1 = 0 * x div x = x quot x = 1 * x div 1 = x quot 1 = x * andb (x, x) = orb (x, x) = x * xorb (x, x) = 0 * x - 0 = x * 0 - x = ~x * x - x = 0 * x > x = x < x = false * x >= x = x <= x = true * x = x --> true * * Also, simple equality tests on constructors are handled. * A = A --> true * A = B --> false * A x = B y --> false *) fun ('a, 'b) apply (p: 'a t, args: 'b ApplyArg.t list, varEquals: 'b * 'b -> bool): ('a, 'b) ApplyResult.t = let datatype z = datatype t datatype z = datatype Const.t val bool = ApplyResult.Bool val boolOpt = fn NONE => ApplyResult.Unknown | SOME b => bool b val f = bool false val t = bool true fun seqIndexConst i = ApplyResult.Const (Const.word (WordX.fromIntInf (i, WordSize.seqIndex ()))) local val maxIntInf = IntInf.<< (1, 0w128) val minIntInf = IntInf.~ maxIntInf in fun intInfTooBig ii = IntInf.< (ii, minIntInf) orelse IntInf.> (ii, maxIntInf) end val intInfTooBig = Trace.trace ("Prim.intInfTooBig", IntInf.layout, Bool.layout) intInfTooBig fun intInf (ii: IntInf.t): ('a, 'b) ApplyResult.t = if intInfTooBig ii then ApplyResult.Unknown else ApplyResult.Const (Const.intInf ii) val intInfConst = intInf o IntInf.fromInt val null = ApplyResult.Const Const.null fun real (r: RealX.t): ('a, 'b) ApplyResult.t = ApplyResult.Const (Const.real r) val realOpt = fn NONE => ApplyResult.Unknown | SOME r => real r fun realNeg (s, x): ('a, 'b) ApplyResult.t = ApplyResult.Apply (Real_neg s, [x]) fun realAdd (s, x, y): ('a, 'b) ApplyResult.t = ApplyResult.Apply (Real_add s, [x, y]) fun word (w: WordX.t): ('a, 'b) ApplyResult.t = ApplyResult.Const (Const.word w) val wordOpt = fn NONE => ApplyResult.Unknown | SOME w => word w fun iio (f, c1, c2) = intInf (f (c1, c2)) fun wordS (f: WordX.t * WordX.t * {signed: bool} -> WordX.t, (_: WordSize.t, sg), w: WordX.t, w': WordX.t) = word (f (w, w', sg)) fun wordCmp (f: WordX.t * WordX.t * {signed: bool} -> bool, (_: WordSize.t, sg), w: WordX.t, w': WordX.t) = bool (f (w, w', sg)) fun wordOrOverflow (s, sg, w) = if WordSize.isInRange (s, w, sg) then word (WordX.fromIntInf (w, s)) else ApplyResult.Overflow fun wcheck (f: IntInf.t * IntInf.t -> IntInf.t, (s: WordSize.t, sg as {signed}), w: WordX.t, w': WordX.t) = let val conv = if signed then WordX.toIntInfX else WordX.toIntInf in wordOrOverflow (s, sg, f (conv w, conv w')) end val eq = fn (Word w1, Word w2) => bool (WordX.equals (w1, w2)) | _ => ApplyResult.Unknown val equal = fn (IntInf ii1, IntInf ii2) => bool (IntInf.equals (ii1, ii2)) | (Word w1, Word w2) => bool (WordX.equals (w1, w2)) | (WordVector v1, WordVector v2) => bool (WordXVector.equals (v1, v2)) | _ => ApplyResult.Unknown fun intInfBinary (i1, i2) = if intInfTooBig i1 orelse intInfTooBig i2 then ApplyResult.Unknown else case p of IntInf_add => iio (IntInf.+, i1, i2) | IntInf_andb => iio (IntInf.andb, i1, i2) | IntInf_gcd => iio (IntInf.gcd, i1, i2) | IntInf_mul => iio (IntInf.*, i1, i2) | IntInf_orb => iio (IntInf.orb, i1, i2) | IntInf_quot => iio (IntInf.quot, i1, i2) | IntInf_rem => iio (IntInf.rem, i1, i2) | IntInf_sub => iio (IntInf.-, i1, i2) | IntInf_xorb => iio (IntInf.xorb, i1, i2) | _ => ApplyResult.Unknown fun intInfUnary (i1) = if intInfTooBig i1 then ApplyResult.Unknown else case p of IntInf_neg => intInf (IntInf.~ i1) | IntInf_notb => intInf (IntInf.notb i1) | _ => ApplyResult.Unknown fun intInfShiftOrToString (i1, w2) = if intInfTooBig i1 then ApplyResult.Unknown else case p of IntInf_arshift => intInf (IntInf.~>> (i1, Word.fromIntInf (WordX.toIntInf w2))) | IntInf_lshift => let val maxShift = WordX.fromIntInf (128, WordSize.shiftArg) in if WordX.lt (w2, maxShift, {signed = false}) then intInf (IntInf.<< (i1, Word.fromIntInf (WordX.toIntInf w2))) else ApplyResult.Unknown end | IntInf_toString => let val base = case WordX.toInt w2 of 2 => StringCvt.BIN | 8 => StringCvt.OCT | 10 => StringCvt.DEC | 16 => StringCvt.HEX | _ => Error.bug "Prim.apply: strange base for IntInf_toString" in ApplyResult.Const (Const.string (IntInf.format (i1, base))) end | _ => ApplyResult.Unknown fun allConsts (cs: Const.t list) = (case (p, cs) of (MLton_eq, [c1, c2]) => eq (c1, c2) | (MLton_equal, [c1, c2]) => equal (c1, c2) | (CPointer_fromWord, [Word w]) => if WordX.isZero w then null else ApplyResult.Unknown | (CPointer_toWord, [Null]) => word (WordX.zero (WordSize.cpointer ())) | (IntInf_compare, [IntInf i1, IntInf i2]) => let val i = case IntInf.compare (i1, i2) of Relation.LESS => ~1 | Relation.EQUAL => 0 | Relation.GREATER => 1 in word (WordX.fromIntInf (i, WordSize.compareRes)) end | (IntInf_equal, [IntInf i1, IntInf i2]) => bool (i1 = i2) | (IntInf_toWord, [IntInf i]) => (case SmallIntInf.toWord i of NONE => ApplyResult.Unknown | SOME w => word w) | (_, [IntInf i1, IntInf i2, _]) => intInfBinary (i1, i2) | (_, [IntInf i1, Word w2, _]) => intInfShiftOrToString (i1, w2) | (_, [IntInf i1, _]) => intInfUnary (i1) | (Vector_length, [WordVector v]) => seqIndexConst (IntInf.fromInt (WordXVector.length v)) | (Vector_sub, [WordVector v, Word i]) => word (WordXVector.sub (v, WordX.toInt i)) | (Real_neg _, [Real r]) => realOpt (RealX.neg r) | (Real_abs _, [Real r]) => realOpt (RealX.abs r) | (Real_Math_acos _, [Real r]) => realOpt (RealX.acos r) | (Real_Math_asin _, [Real r]) => realOpt (RealX.asin r) | (Real_Math_atan _, [Real r]) => realOpt (RealX.atan r) | (Real_Math_atan2 _, [Real r1, Real r2]) => realOpt (RealX.atan2 (r1, r2)) | (Real_Math_cos _, [Real r]) => realOpt (RealX.cos r) | (Real_Math_exp _, [Real r]) => realOpt (RealX.exp r) | (Real_Math_ln _, [Real r]) => realOpt (RealX.ln r) | (Real_Math_log10 _, [Real r]) => realOpt (RealX.log10 r) | (Real_Math_sin _, [Real r]) => realOpt (RealX.sin r) | (Real_Math_sqrt _, [Real r]) => realOpt (RealX.sqrt r) | (Real_Math_tan _, [Real r]) => realOpt (RealX.tan r) | (Real_add _, [Real r1, Real r2]) => realOpt (RealX.add (r1, r2)) | (Real_div _, [Real r1, Real r2]) => realOpt (RealX.div (r1, r2)) | (Real_mul _, [Real r1, Real r2]) => realOpt (RealX.mul (r1, r2)) | (Real_sub _, [Real r1, Real r2]) => realOpt (RealX.sub (r1, r2)) | (Real_muladd _, [Real r1, Real r2, Real r3]) => realOpt (RealX.muladd (r1, r2, r3)) | (Real_mulsub _, [Real r1, Real r2, Real r3]) => realOpt (RealX.mulsub (r1, r2, r3)) | (Real_equal _, [Real r1, Real r2]) => boolOpt (RealX.equal (r1, r2)) | (Real_le _, [Real r1, Real r2]) => boolOpt (RealX.le (r1, r2)) | (Real_lt _, [Real r1, Real r2]) => boolOpt (RealX.lt (r1, r2)) | (Real_qequal _, [Real r1, Real r2]) => boolOpt (RealX.qequal (r1, r2)) | (Real_castToWord _, [Real r]) => wordOpt (RealX.castToWord r) | (Word_castToReal _, [Word w]) => realOpt (RealX.castFromWord w) | (Word_rndToReal (_, s, {signed}), [Word w]) => realOpt (RealX.fromIntInf (if signed then WordX.toIntInfX w else WordX.toIntInf w, s)) | (Word_add _, [Word w1, Word w2]) => word (WordX.add (w1, w2)) | (Word_addCheck s, [Word w1, Word w2]) => wcheck (op +, s, w1, w2) | (Word_andb _, [Word w1, Word w2]) => word (WordX.andb (w1, w2)) | (Word_equal _, [Word w1, Word w2]) => bool (WordX.equals (w1, w2)) | (Word_lshift _, [Word w1, Word w2]) => word (WordX.lshift (w1, w2)) | (Word_lt s, [Word w1, Word w2]) => wordCmp (WordX.lt, s, w1, w2) | (Word_mul s, [Word w1, Word w2]) => wordS (WordX.mul, s, w1, w2) | (Word_mulCheck s, [Word w1, Word w2]) => wcheck (op *, s, w1, w2) | (Word_neg _, [Word w]) => word (WordX.neg w) | (Word_negCheck s, [Word w]) => wordOrOverflow (s, {signed = true}, ~ (WordX.toIntInfX w)) | (Word_notb _, [Word w]) => word (WordX.notb w) | (Word_orb _, [Word w1, Word w2]) => word (WordX.orb (w1, w2)) | (Word_quot s, [Word w1, Word w2]) => if WordX.isZero w2 then ApplyResult.Unknown else wordS (WordX.quot, s, w1, w2) | (Word_rem s, [Word w1, Word w2]) => if WordX.isZero w2 then ApplyResult.Unknown else wordS (WordX.rem, s, w1, w2) | (Word_rol _, [Word w1, Word w2]) => word (WordX.rol (w1, w2)) | (Word_ror _, [Word w1, Word w2]) => word (WordX.ror (w1, w2)) | (Word_rshift s, [Word w1, Word w2]) => wordS (WordX.rshift, s, w1, w2) | (Word_sub _, [Word w1, Word w2]) => word (WordX.sub (w1, w2)) | (Word_subCheck s, [Word w1, Word w2]) => wcheck (op -, s, w1, w2) | (Word_toIntInf, [Word w]) => intInf (SmallIntInf.fromWord w) | (Word_extdToWord (_, s, {signed}), [Word w]) => word (if signed then WordX.resizeX (w, s) else WordX.resize (w, s)) | (Word_xorb _, [Word w1, Word w2]) => word (WordX.xorb (w1, w2)) | _ => ApplyResult.Unknown) handle Chr => ApplyResult.Unknown | Div => ApplyResult.Unknown | Exn.Overflow => ApplyResult.Overflow | Subscript => ApplyResult.Unknown fun someVars () = let datatype z = datatype ApplyResult.t fun varIntInf (x, i: IntInf.t, space, inOrder) = let fun neg () = Apply (intInfNeg, [x, space]) fun notb () = Apply (intInfNotb, [x, space]) val i = IntInf.toInt i in case p of IntInf_add => if i = 0 then Var x else Unknown | IntInf_andb => if i = 0 then intInfConst 0 else if i = ~1 then Var x else Unknown | IntInf_arshift => if i = 0 then intInfConst 0 else if i = ~1 then intInfConst ~1 else Unknown | IntInf_gcd => if (i = ~1 orelse i = 1) then intInfConst 1 else Unknown | IntInf_lshift => if i = 0 then intInfConst 0 else Unknown | IntInf_mul => (case i of 0 => intInfConst 0 | 1 => Var x | ~1 => neg () | _ => Unknown) | IntInf_orb => if i = 0 then Var x else if i = ~1 then intInfConst ~1 else Unknown | IntInf_quot => if inOrder then (case i of 1 => Var x | ~1 => neg () | _ => Unknown) else Unknown | IntInf_rem => if inOrder andalso (i = ~1 orelse i = 1) then intInfConst 0 else Unknown | IntInf_sub => if i = 0 then if inOrder then Var x else neg () else Unknown | IntInf_xorb => if i = 0 then Var x else if i = ~1 then notb () else Unknown | _ => Unknown end handle Exn.Overflow => Unknown fun varReal (x, r, inOrder) = let datatype z = datatype RealX.decon datatype z = datatype ApplyResult.t fun negIf (s, signBit) = if signBit then realNeg (s, x) else Var x (* The SML Basis library does not distinguish between different NaN values, so optimizations that may only produce a different NaN value can be considered safe. For example, SNaN*1.0 = SNaN/1.0 = QNaN, so it is safe to optimize x*1.0 and x/1.0 to x. *) in case RealX.decon r of NONE => Unknown | SOME d => case d of ZERO _ => Unknown | ONE {signBit} => (case p of Real_mul s => negIf (s, signBit) | Real_div s => if inOrder then negIf (s, signBit) else Unknown | _ => Unknown) | NAN => (case p of Real_Math_atan2 _ => real r | Real_add _ => real r | Real_div _ => real r | Real_mul _ => real r | Real_sub _ => real r | Real_equal _ => bool false | Real_qequal _ => bool true | Real_le _ => bool false | Real_lt _ => bool false | _ => Unknown) | POW2 {signBit, exp} => (case p of Real_mul s => if not signBit andalso exp = 2 then realAdd (s, x, x) else Unknown | Real_div s => if inOrder andalso not signBit andalso exp = 0 then realAdd (s, x, x) else Unknown | _ => Unknown) | INF _ => Unknown | FIN _ => Unknown end fun varWord (x, w, inOrder) = let val zero = word o WordX.zero fun add () = if WordX.isZero w then Var x else Unknown fun mul ((s, {signed}), neg) = if WordX.isZero w then word w else if WordX.isOne w then Var x else if signed andalso WordX.isNegOne w then Apply (neg s, [x]) else Unknown fun sub (s, neg) = if WordX.isZero w then if inOrder then Var x else Apply (neg s, [x]) else Unknown fun ro s = if inOrder then if WordX.isZero (WordX.rem (w, WordX.fromIntInf (IntInf.fromInt (Bits.toInt (WordSize.bits s)), WordX.size w), {signed = false})) then Var x else Unknown else if WordX.isZero w orelse WordX.isAllOnes w then word w else Unknown fun shift s = if inOrder then if WordX.isZero w then Var x else if (WordX.ge (w, WordX.fromIntInf (Bits.toIntInf (WordSize.bits s), WordSize.shiftArg), {signed = false})) then zero s else Unknown else if WordX.isZero w then zero s else Unknown in case p of CPointer_add => if WordX.isZero w then Var x else Unknown | CPointer_sub => if WordX.isZero w andalso inOrder then Var x else Unknown | Word_add _ => add () | Word_addCheck _ => add () | Word_andb s => if WordX.isZero w then zero s else if WordX.isAllOnes w then Var x else Unknown | Word_lshift s => shift s | Word_lt (_, sg) => if inOrder then if WordX.isMin (w, sg) then f else Unknown else if WordX.isMax (w, sg) then f else Unknown | Word_mul s => mul (s, wordNeg) | Word_mulCheck s => mul (s, wordNegCheck) | Word_orb _ => if WordX.isZero w then Var x else if WordX.isAllOnes w then word w else Unknown | Word_quot (s, {signed}) => if inOrder then if WordX.isOne w then Var x else if signed andalso WordX.isNegOne w then Apply (wordNeg s, [x]) else Unknown else Unknown | Word_rem (s, {signed}) => if inOrder andalso (WordX.isOne w orelse signed andalso WordX.isNegOne w) then zero s else Unknown | Word_rol s => ro s | Word_ror s => ro s | Word_rshift (s, {signed}) => if signed then if WordX.isZero w then if inOrder then Var x else zero s else if WordX.isAllOnes w andalso not inOrder then word w else Unknown else shift s | Word_sub s => sub (s, wordNeg) | Word_subCheck s => sub (s, wordNegCheck o #1) | Word_xorb s => if WordX.isZero w then Var x else if WordX.isAllOnes w then Apply (wordNotb s, [x]) else Unknown | _ => Unknown end datatype z = datatype ApplyArg.t in case (p, args) of (_, [Con {con = c, hasArg = h}, Con {con = c', ...}]) => if (case p of MLton_eq => true | MLton_equal => true | _ => false) then if Con.equals (c, c') then if h then Unknown else t else f else Unknown | (_, [Var x, Const (Real r)]) => varReal (x, r, true) | (_, [Const (Real r), Var x]) => varReal (x, r, false) | (_, [Var x, Const (Word i)]) => varWord (x, i, true) | (_, [Const (Word i), Var x]) => varWord (x, i, false) | (_, [Const (IntInf i1), Const (IntInf i2), _]) => intInfBinary (i1, i2) | (_, [Const (IntInf i1), Const (Word w2), _]) => intInfShiftOrToString (i1, w2) | (_, [Const (IntInf i1), _]) => intInfUnary (i1) | (_, [Var x, Const (IntInf i), Var space]) => varIntInf (x, i, space, true) | (_, [Const (IntInf i), Var x, Var space]) => varIntInf (x, i, space, false) | (_, [Var x, Const (Word w), _]) => if WordX.isZero w then let datatype z = datatype ApplyResult.t in case p of IntInf_arshift => Var x | IntInf_lshift => Var x | _ => Unknown end else Unknown | (_, [Var x, Var y, _]) => if varEquals (x, y) then let datatype z = datatype ApplyResult.t in case p of IntInf_andb => Var x | IntInf_orb => Var x | IntInf_quot => intInfConst 1 | IntInf_rem => intInfConst 0 | IntInf_sub => intInfConst 0 | IntInf_xorb => intInfConst 0 | _ => Unknown end else Unknown | (_, [Var x, Var y]) => if varEquals (x, y) then let datatype z = datatype ApplyResult.t in case p of CPointer_diff => word (WordX.zero (WordSize.cptrdiff ())) | CPointer_equal => t | CPointer_lt => f | IntInf_compare => word (WordX.zero WordSize.compareRes) | IntInf_equal => t | MLton_eq => t | MLton_equal => t | Real_lt _ => f | Real_qequal _ => t | Word_andb _ => Var x | Word_equal _ => t | Word_lt _ => f | Word_orb _ => Var x | Word_quot (s, _) => word (WordX.one s) | Word_rem (s, _) => word (WordX.zero s) | Word_sub s => word (WordX.zero s) | Word_subCheck (s, _) => word (WordX.zero s) | Word_xorb s => word (WordX.zero s) | _ => Unknown end else Unknown | _ => Unknown end in if List.forall (args, fn ApplyArg.Const _ => true | _ => false) then allConsts (List.map (args, fn ApplyArg.Const c => c | _ => Error.bug "Prim.apply")) else someVars () end fun ('a, 'b) layoutApp (p: 'a t, args: 'b vector, layoutArg: 'b -> Layout.t): Layout.t = let fun arg i = layoutArg (Vector.sub (args, i)) open Layout fun one name = seq [str name, str " ", arg 0] fun two name = seq [arg 0, str " ", str name, str " ", arg 1] in case p of Array_length => one "length" | Real_Math_acos _ => one "acos" | Real_Math_asin _ => one "asin" | Real_Math_atan _ => one "atan" | Real_Math_cos _ => one "cos" | Real_Math_exp _ => one "exp" | Real_Math_ln _ => one "ln" | Real_Math_log10 _ => one "log10" | Real_Math_sin _ => one "sin" | Real_Math_sqrt _ => one "sqrt" | Real_Math_tan _ => one "tan" | Real_add _ => two "+" | Real_div _ => two "/" | Real_equal _ => two "==" | Real_le _ => two "<=" | Real_lt _ => two "<" | Real_mul _ => two "*" | Real_neg _ => one "-" | Real_qequal _ => two "?=" | Real_sub _ => two "-" | Ref_assign => two ":=" | Ref_deref => one "!" | Ref_ref => one "ref" | Vector_length => one "length" | Word_add _ => two "+" | Word_addCheck _ => two "+" | Word_andb _ => two "&" | Word_equal _ => two "=" | Word_lshift _ => two "<<" | Word_lt _ => two "<" | Word_mul _ => two "*" | Word_mulCheck _ => two "*" | Word_neg _ => one "-" | Word_negCheck _ => one "-" | Word_orb _ => two "|" | Word_rol _ => two "rol" | Word_ror _ => two "ror" | Word_rshift (_, {signed}) => two (if signed then "~>>" else ">>") | Word_sub _ => two "-" | Word_subCheck _ => two "-" | Word_xorb _ => two "^" | _ => seq [layout p, str " ", Vector.layout layoutArg args] end structure Name = struct datatype t = datatype t val toString = toString end end mlton-20100608/mlton/atoms/prim.sig0000644000076600000240000003276611404435623015526 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRIM_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Con: CON structure Const: CONST structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE sharing RealSize = Const.RealX.RealSize sharing WordSize = Const.WordX.WordSize end signature PRIM = sig include PRIM_STRUCTS structure Name: sig datatype 'a t = Array_array (* backend *) | Array_array0Const (* constant propagation *) | Array_length (* ssa to rssa *) | Array_sub (* ssa to ssa2 *) | Array_toVector (* backend *) | Array_update (* ssa to ssa2 *) | CPointer_add (* codegen *) | CPointer_diff (* codegen *) | CPointer_equal (* codegen *) | CPointer_fromWord (* codegen *) | CPointer_getCPointer (* ssa to rssa *) | CPointer_getObjptr (* ssa to rssa *) | CPointer_getReal of RealSize.t (* ssa to rssa *) | CPointer_getWord of WordSize.t (* ssa to rssa *) | CPointer_lt (* codegen *) | CPointer_setCPointer (* ssa to rssa *) | CPointer_setObjptr (* ssa to rssa *) | CPointer_setReal of RealSize.t (* ssa to rssa *) | CPointer_setWord of WordSize.t (* ssa to rssa *) | CPointer_sub (* codegen *) | CPointer_toWord (* codegen *) | Exn_extra (* implement exceptions *) | Exn_name (* implement exceptions *) | Exn_setExtendExtra (* implement exceptions *) | FFI of 'a CFunction.t (* ssa to rssa *) | FFI_Symbol of {name: string, (* codegen *) cty: CType.t option, symbolScope: CFunction.SymbolScope.t} | GC_collect (* ssa to rssa *) | IntInf_add (* ssa to rssa *) | IntInf_andb (* ssa to rssa *) | IntInf_arshift (* ssa to rssa *) | IntInf_compare (* ssa to rssa *) | IntInf_equal (* ssa to rssa *) | IntInf_gcd (* ssa to rssa *) | IntInf_lshift (* ssa to rssa *) | IntInf_mul (* ssa to rssa *) | IntInf_neg (* ssa to rssa *) | IntInf_notb (* ssa to rssa *) | IntInf_orb (* ssa to rssa *) | IntInf_quot (* ssa to rssa *) | IntInf_rem (* ssa to rssa *) | IntInf_sub (* ssa to rssa *) | IntInf_toString (* ssa to rssa *) | IntInf_toVector (* ssa to rssa *) | IntInf_toWord (* ssa to rssa *) | IntInf_xorb (* ssa to rssa *) | MLton_bogus (* ssa to rssa *) (* of type unit -> 'a. * Makes a bogus value of any type. *) | MLton_bug (* ssa to rssa *) | MLton_deserialize (* unused *) | MLton_eq (* ssa to rssa *) | MLton_equal (* polymorphic equality *) | MLton_halt (* ssa to rssa *) | MLton_hash (* polymorphic hash *) (* MLton_handlesSignals and MLton_installSignalHandler work together * to inform the optimizer and basis library whether or not the * program uses signal handlers. * * MLton_installSignalHandler is called by MLton.Signal.setHandler, * and is effectively a noop, but is left in the program until the * end of the backend, so that the optimizer can test whether or * not the program installs signal handlers. * * MLton_handlesSignals is translated by closure conversion into * a boolean, and is true iff MLton_installsSignalHandler is called. *) | MLton_handlesSignals (* closure conversion *) | MLton_installSignalHandler (* backend *) | MLton_serialize (* unused *) | MLton_share | MLton_size (* ssa to rssa *) | MLton_touch (* backend *) | Real_Math_acos of RealSize.t (* codegen *) | Real_Math_asin of RealSize.t (* codegen *) | Real_Math_atan of RealSize.t (* codegen *) | Real_Math_atan2 of RealSize.t (* codegen *) | Real_Math_cos of RealSize.t (* codegen *) | Real_Math_exp of RealSize.t (* codegen *) | Real_Math_ln of RealSize.t (* codegen *) | Real_Math_log10 of RealSize.t (* codegen *) | Real_Math_sin of RealSize.t (* codegen *) | Real_Math_sqrt of RealSize.t (* codegen *) | Real_Math_tan of RealSize.t (* codegen *) | Real_abs of RealSize.t (* codegen *) | Real_add of RealSize.t (* codegen *) | Real_castToWord of RealSize.t * WordSize.t (* codegen *) | Real_div of RealSize.t (* codegen *) | Real_equal of RealSize.t (* codegen *) | Real_ldexp of RealSize.t (* codegen *) | Real_le of RealSize.t (* codegen *) | Real_lt of RealSize.t (* codegen *) | Real_mul of RealSize.t (* codegen *) | Real_muladd of RealSize.t (* codegen *) | Real_mulsub of RealSize.t (* codegen *) | Real_neg of RealSize.t (* codegen *) | Real_qequal of RealSize.t (* codegen *) | Real_rndToReal of RealSize.t * RealSize.t (* codegen *) | Real_rndToWord of RealSize.t * WordSize.t * {signed: bool} (* codegen *) | Real_round of RealSize.t (* codegen *) | Real_sub of RealSize.t (* codegen *) | Ref_assign (* ssa to ssa2 *) | Ref_deref (* ssa to ssa2 *) | Ref_ref (* ssa to ssa2 *) | String_toWord8Vector (* defunctorize *) | Thread_atomicBegin (* backend *) | Thread_atomicEnd (* backend *) | Thread_atomicState (* backend *) | Thread_copy (* ssa to rssa *) | Thread_copyCurrent (* ssa to rssa *) | Thread_returnToC (* codegen *) (* switchTo has to be a _prim because we have to know that it * enters the runtime -- because everything must be saved * on the stack. *) | Thread_switchTo (* ssa to rssa *) | TopLevel_getHandler (* implement exceptions *) | TopLevel_getSuffix (* implement suffix *) | TopLevel_setHandler (* implement exceptions *) | TopLevel_setSuffix (* implement suffix *) | Vector_length (* ssa to ssa2 *) | Vector_sub (* ssa to ssa2 *) | Weak_canGet (* ssa to rssa *) | Weak_get (* ssa to rssa *) | Weak_new (* ssa to rssa *) | Word_add of WordSize.t (* codegen *) | Word_addCheck of WordSize.t * {signed: bool} (* codegen *) | Word_andb of WordSize.t (* codegen *) | Word_castToReal of WordSize.t * RealSize.t (* codegen *) | Word_equal of WordSize.t (* codegen *) | Word_extdToWord of WordSize.t * WordSize.t * {signed: bool} (* codegen *) | Word_lshift of WordSize.t (* codegen *) | Word_lt of WordSize.t * {signed: bool} (* codegen *) | Word_mul of WordSize.t * {signed: bool} (* codegen *) | Word_mulCheck of WordSize.t * {signed: bool} (* codegen *) | Word_neg of WordSize.t (* codegen *) | Word_negCheck of WordSize.t (* codegen *) | Word_notb of WordSize.t (* codegen *) | Word_orb of WordSize.t (* codegen *) | Word_quot of WordSize.t * {signed: bool} (* codegen *) | Word_rem of WordSize.t * {signed: bool} (* codegen *) | Word_rndToReal of WordSize.t * RealSize.t * {signed: bool} (* codegen *) | Word_rol of WordSize.t (* codegen *) | Word_ror of WordSize.t (* codegen *) | Word_rshift of WordSize.t * {signed: bool} (* codegen *) | Word_sub of WordSize.t (* codegen *) | Word_subCheck of WordSize.t* {signed: bool} (* codegen *) | Word_toIntInf (* ssa to rssa *) | Word_xorb of WordSize.t (* codegen *) | WordVector_toIntInf (* ssa to rssa *) | Word8Array_subWord of WordSize.t (* ssa to rssa *) | Word8Array_updateWord of WordSize.t (* ssa to rssa *) | Word8Vector_subWord of WordSize.t (* ssa to rssa *) | Word8Vector_toString (* defunctorize *) | World_save (* ssa to rssa *) val toString: 'a t -> string end structure ApplyArg: sig datatype 'a t = Con of {con: Con.t, hasArg: bool} | Const of Const.t | Var of 'a val layout: ('a -> Layout.t) -> 'a t -> Layout.t end structure ApplyResult: sig type 'a prim datatype ('a, 'b) t = Apply of 'a prim * 'b list | Bool of bool | Const of Const.t | Overflow | Unknown | Var of 'b val layout: ('b -> Layout.t) -> ('a, 'b) t -> Layout.t end type 'a t sharing type t = ApplyResult.prim val apply: 'a t * 'b ApplyArg.t list * ('b * 'b -> bool) -> ('a, 'b) ApplyResult.t val array: 'a t val arrayLength: 'a t val assign: 'a t val bogus: 'a t val bug: 'a t val checkApp: 'a t * {args: 'a vector, result: 'a, targs: 'a vector, typeOps: {array: 'a -> 'a, arrow: 'a * 'a -> 'a, bool: 'a, cpointer: 'a, equals: 'a * 'a -> bool, exn: 'a, intInf: 'a, real: RealSize.t -> 'a, reff: 'a -> 'a, thread: 'a, unit: 'a, vector: 'a -> 'a, weak: 'a -> 'a, word: WordSize.t -> 'a}} -> bool val cpointerAdd: 'a t val cpointerDiff: 'a t val cpointerEqual: 'a t val cpointerGet: CType.t -> 'a t val cpointerLt: 'a t val cpointerSet: CType.t -> 'a t val cpointerSub: 'a t val cpointerToWord: 'a t val deref: 'a t val eq: 'a t (* pointer equality *) val equal: 'a t (* polymorphic equality *) val equals: 'a t * 'a t -> bool val extractTargs: 'a t * {args: 'b vector, result: 'b, typeOps: {deArray: 'b -> 'b, deArrow: 'b -> 'b * 'b, deRef: 'b -> 'b, deVector: 'b -> 'b, deWeak: 'b -> 'b}} -> 'b vector val ffi: 'a CFunction.t -> 'a t val ffiSymbol: {name: string, cty: CType.t option, symbolScope: CFunction.SymbolScope.t } -> 'a t val fromString: string -> 'a t option val hash: 'a t (* polymorphic hash *) val intInfEqual: 'a t val intInfToWord: 'a t val intInfToVector: 'a t val isCommutative: 'a t -> bool (* * isFunctional p = true iff p always returns same result when given * same args and has no side effects. * isFuntional implies not maySideEffect. * examples: Array_length, MLton_equal, Word_add * not examples: Array_array, Array_sub, Ref_deref, Ref_ref *) val isFunctional: 'a t -> bool val layout: 'a t -> Layout.t val layoutApp: 'a t * 'b vector * ('b -> Layout.t) -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t (* examples: Word_addCheck, Word_mulCheck, Word_subCheck *) val mayOverflow: 'a t -> bool (* examples: Array_update, Ref_assign * not examples: Array_array, Array_sub, Ref_deref, Ref_ref *) val maySideEffect: 'a t -> bool val name: 'a t -> 'a Name.t val realCastToWord: RealSize.t * WordSize.t -> 'a t val reff: 'a t val toString: 'a t -> string val touch: 'a t val vectorLength: 'a t val vectorSub: 'a t val wordAdd: WordSize.t -> 'a t val wordAddCheck: WordSize.t * {signed: bool} -> 'a t val wordAndb: WordSize.t -> 'a t val wordCastToReal : WordSize.t * RealSize.t -> 'a t val wordEqual: WordSize.t -> 'a t val wordExtdToWord: WordSize.t * WordSize.t * {signed: bool} -> 'a t val wordLshift: WordSize.t -> 'a t val wordLt: WordSize.t * {signed: bool} -> 'a t val wordMul: WordSize.t * {signed: bool} -> 'a t val wordNeg: WordSize.t -> 'a t val wordOrb: WordSize.t -> 'a t val wordQuot: WordSize.t * {signed: bool} -> 'a t val wordRshift: WordSize.t * {signed: bool} -> 'a t val wordSub: WordSize.t -> 'a t val wordXorb: WordSize.t -> 'a t end mlton-20100608/mlton/atoms/profile-exp.fun0000644000076600000240000000157411404435623017010 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ProfileExp (S: PROFILE_EXP_STRUCTS): PROFILE_EXP = struct open S datatype t = Enter of SourceInfo.t | Leave of SourceInfo.t val toString = fn Enter si => concat ["Enter ", SourceInfo.toString si] | Leave si => concat ["Leave " , SourceInfo.toString si] val layout = Layout.str o toString val equals = fn (Enter si, Enter si') => SourceInfo.equals (si, si') | (Leave si, Leave si') => SourceInfo.equals (si, si') | _ => false local val newHash = Random.word val enter = newHash () val leave = newHash () in val hash = fn Enter si => Word.xorb (enter, SourceInfo.hash si) | Leave si => Word.xorb (leave, SourceInfo.hash si) end end mlton-20100608/mlton/atoms/profile-exp.sig0000644000076600000240000000113111404435623016767 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PROFILE_EXP_STRUCTS = sig structure SourceInfo: SOURCE_INFO end signature PROFILE_EXP = sig include PROFILE_EXP_STRUCTS datatype t = Enter of SourceInfo.t | Leave of SourceInfo.t val equals: t * t -> bool val hash: t -> word val layout: t -> Layout.t val toString: t -> string end mlton-20100608/mlton/atoms/profile-label.fun0000644000076600000240000000153111404435623017264 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ProfileLabel (S: PROFILE_LABEL_STRUCTS): PROFILE_LABEL = struct open S datatype t = T of {plist: PropertyList.t, uniq: int} local fun make f (T r) = f r in val plist = make #plist end local val c = Counter.new 0 in fun new () = T {plist = PropertyList.new (), uniq = Counter.next c} end fun toString (T {uniq, ...}) = concat ["MLtonProfile", Int.toString uniq] val layout = Layout.str o toString val clear = PropertyList.clear o plist end mlton-20100608/mlton/atoms/profile-label.sig0000644000076600000240000000071011404435623017254 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PROFILE_LABEL_STRUCTS = sig end signature PROFILE_LABEL = sig type t val clear: t -> unit val layout: t -> Layout.t val new: unit -> t val plist: t -> PropertyList.t val toString: t -> string end mlton-20100608/mlton/atoms/real-x.fun0000644000076600000240000002130211404435623015735 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RealX (S: REAL_X_STRUCTS): REAL_X = struct open S datatype z = datatype RealSize.t datatype t = Real32 of Real32.t | Real64 of Real64.t fun zero s = case s of R32 => Real32 0.0 | R64 => Real64 0.0 fun size r = case r of Real32 _ => R32 | Real64 _ => R64 fun make (r: string, s: RealSize.t): t option = let fun doit (fromString, isFinite, con): t option = case fromString r of NONE => Error.bug "RealX.make: unexpected real constant" | SOME r => if isFinite r then SOME (con r) else NONE in case s of R32 => doit (Real32.fromString, Real32.isFinite, Real32) | R64 => doit (Real64.fromString, Real64.isFinite, Real64) end (* We need to check the sign bit when comparing reals so that we don't treat * 0.0 and ~0.0 identically. The difference between the two is detectable by * user programs that look at the sign bit. *) fun equals (r, r') = case (r, r') of (Real32 r, Real32 r') => let open Real32 in equals (r, r') andalso signBit r = signBit r' end | (Real64 r, Real64 r') => let open Real64 in equals (r, r') andalso signBit r = signBit r' end | _ => false fun toString r = case r of Real32 r => Real32.format (r, Real32.Format.exact) | Real64 r => Real64.format (r, Real64.Format.exact) val layout = Layout.str o toString val hash = String.hash o toString structure P = Pervasive structure PR32 = P.Real32 structure PR64 = P.Real64 structure PIR = P.IEEEReal (* Disable constant folding when it might change the results. *) fun disableCF () = PR32.precision = PR64.precision orelse !Control.target <> Control.Self local fun make (o32, o64) arg = if disableCF () then NONE else SOME (case arg of Real32 x => Real32 (o32 x) | Real64 x => Real64 (o64 x)) in val neg = make (Real32.~, Real64.~) val abs = make (Real32.abs, Real64.abs) end datatype 'r r = R of {zero: 'r, half: 'r, one: 'r, inf: 'r, abs: 'r -> 'r, signBit: 'r -> bool, isNan: 'r -> bool, toManExp: 'r -> {exp: int, man: 'r}, compareReal: 'r * 'r -> PIR.real_order, bits: Bits.t, subVec: P.Word8Vector.vector * int -> P.LargeWord.word, update: P.Word8Array.array * int * P.LargeWord.word -> unit, toBytes: 'r -> P.Word8Vector.vector, subArr: P.Word8Array.array * int -> 'r, tag: 'r -> t} val r32 = R {zero = 0.0, half = 0.5, one = 1.0, inf = PR32.posInf, abs = PR32.abs, signBit = PR32.signBit, isNan = PR32.isNan, toManExp = PR32.toManExp, compareReal = PR32.compareReal, bits = Bits.inWord32, subVec = P.PackWord32Little.subVec, update = P.PackWord32Little.update, toBytes = P.PackReal32Little.toBytes, subArr = P.PackReal32Little.subArr, tag = Real32} val r64 = R {zero = 0.0, half = 0.5, one = 1.0, inf = PR64.posInf, abs = PR64.abs, signBit = PR64.signBit, isNan = PR64.isNan, toManExp = PR64.toManExp, compareReal = PR64.compareReal, bits = Bits.inWord64, subVec = P.PackWord64Little.subVec, update = P.PackWord64Little.update, toBytes = P.PackReal64Little.toBytes, subArr = P.PackReal64Little.subArr, tag = Real64} local fun doit (R {compareReal, signBit, isNan, tag, ...}) (f, arg) = if disableCF () then NONE else let val old = PIR.getRoundingMode () in (* According to the Basis Library specification, * setRoundingMode can fail (raise an exception). *) let val () = PIR.setRoundingMode PIR.TO_NEGINF val min = f arg val () = PIR.setRoundingMode PIR.TO_POSINF val max = f arg val () = PIR.setRoundingMode old in if PIR.EQUAL = compareReal (min, max) andalso signBit min = signBit max orelse isNan min andalso isNan max then SOME (tag min) else NONE end handle _ => (if PIR.getRoundingMode () = old then () else PIR.setRoundingMode old ; NONE) end fun make1 (o32, o64) = fn Real32 x => doit r32 (o32, x) | Real64 x => doit r64 (o64, x) fun make2 (o32, o64) = fn (Real32 x, Real32 y) => doit r32 (o32, (x, y)) | (Real64 x, Real64 y) => doit r64 (o64, (x, y)) | _ => Error.bug "impossible" fun make3 (o32, o64) = fn (Real32 x, Real32 y, Real32 z) => doit r32 (o32, (x, y, z)) | (Real64 x, Real64 y, Real64 z) => doit r64 (o64, (x, y, z)) | _ => Error.bug "impossible" in val acos = make1 (PR32.Math.acos, PR64.Math.acos) val asin = make1 (PR32.Math.asin, PR64.Math.asin) val atan = make1 (PR32.Math.atan, PR64.Math.atan) val atan2 = make2 (PR32.Math.atan2, PR64.Math.atan2) val cos = make1 (PR32.Math.cos, PR64.Math.cos) val exp = make1 (PR32.Math.exp, PR64.Math.exp) val ln = make1 (PR32.Math.ln, PR64.Math.ln) val log10 = make1 (PR32.Math.log10, PR64.Math.log10) val sin = make1 (PR32.Math.sin, PR64.Math.sin) val sqrt = make1 (PR32.Math.sqrt, PR64.Math.sqrt) val tan = make1 (PR32.Math.tan, PR64.Math.tan) val add = make2 (PR32.+, PR64.+) val op div = make2 (PR32./, PR64./) val mul = make2 (PR32.*, PR64.* ) val sub = make2 (PR32.-, PR64.-) val muladd = make3 (PR32.*+, PR64.*+) val mulsub = make3 (PR32.*-, PR64.*-) fun fromIntInf (i, s) = case s of R32 => doit r32 (Real32.fromIntInf, i) | R64 => doit r64 (Real64.fromIntInf, i) end local fun make (o32, o64) args = if disableCF () then NONE else SOME (case args of (Real32 r1, Real32 r2) => o32 (r1, r2) | (Real64 r1, Real64 r2) => o64 (r1, r2) | _ => Error.bug "impossible") in val equal = make (PR32.==, PR64.==) val le = make (PR32.<=, PR64.<=) val lt = make (PR32.<, PR64.<) val qequal = make (PR32.?=, PR64.?=) end datatype decon = NAN | ZERO of {signBit: bool} | ONE of {signBit: bool} | POW2 of {signBit: bool, exp: Int.t} (* man = 0.5 *) | FIN of {signBit: bool, exp: Int.t, man: t} | INF of {signBit: bool} local fun doit (R {zero, half, one, inf, abs, signBit, isNan, toManExp, compareReal, tag, ...}) value = if isNan value then NAN else let val signBit = signBit value val absValue = abs value in if PIR.EQUAL = compareReal (zero, absValue) then ZERO {signBit = signBit} else if PIR.EQUAL = compareReal (one, absValue) then ONE {signBit = signBit} else if PIR.EQUAL = compareReal (inf, absValue) then INF {signBit = signBit} else let val {man, exp} = toManExp absValue in if PIR.EQUAL = compareReal (half, man) then POW2 {signBit = signBit, exp = exp} else FIN {signBit = signBit, exp = exp, man = tag man} end end in fun decon x = if disableCF () then NONE else SOME (case x of Real32 x => doit r32 x | Real64 x => doit r64 x) end local fun doit (R {bits, toBytes, subVec, ...}) x = let in (SOME o WordX.fromIntInf) (P.LargeWord.toLargeInt (subVec (toBytes x, 0)), WordX.WordSize.fromBits bits) end handle _ => NONE in fun castToWord x = if disableCF () then NONE else (case x of Real32 x => doit r32 x | Real64 x => doit r64 x) end local fun doit (R {bits, update, subArr, tag, ...}) w = let val a = P.Word8Array.array (Bytes.toInt (Bits.toBytes bits), 0w0) in update (a, 0, P.LargeWord.fromLargeInt (WordX.toIntInf w)) ; SOME (tag (subArr (a, 0))) end handle _ => NONE in fun castFromWord w = if disableCF () then NONE else if WordX.WordSize.bits (WordX.size w) = Bits.inWord32 then doit r32 w else if WordX.WordSize.bits (WordX.size w) = Bits.inWord64 then doit r64 w else Error.bug "Invalid word size" end end mlton-20100608/mlton/atoms/real-x.sig0000644000076600000240000000351411404435623015734 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REAL_X_STRUCTS = sig structure RealSize: REAL_SIZE structure WordX: WORD_X end signature REAL_X = sig include REAL_X_STRUCTS (* reals of all RealSize.t sizes. *) type t datatype decon = NAN | ZERO of {signBit: bool} | ONE of {signBit: bool} | POW2 of {signBit: bool, exp: int} (* man = 0.5 *) | FIN of {signBit: bool, exp: int, man: t} | INF of {signBit: bool} val abs: t -> t option val acos: t -> t option val add: t * t -> t option val asin: t -> t option val atan2: t * t -> t option val atan: t -> t option val castFromWord: WordX.t -> t option val castToWord: t -> WordX.t option val cos: t -> t option val decon: t -> decon option val div: t * t -> t option val equal: t * t -> bool option val equals: t * t -> bool val exp: t -> t option val fromIntInf: IntInf.t * RealSize.t -> t option val hash: t -> word val layout: t -> Layout.t val le: t * t -> bool option val ln: t -> t option val log10: t -> t option val lt: t * t -> bool option val make: string * RealSize.t -> t option val mul: t * t -> t option val muladd: t * t * t -> t option val mulsub: t * t * t -> t option val neg: t -> t option val qequal: t * t -> bool option val sin: t -> t option val size: t -> RealSize.t val sqrt: t -> t option val sub: t * t -> t option val tan: t -> t option val toString: t -> string val zero: RealSize.t -> t end mlton-20100608/mlton/atoms/source-info.fun0000644000076600000240000000610711404435623017004 0ustar mtfstaff(* Copyright (C) 2003-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SourceInfo (S: SOURCE_INFO_STRUCTS): SOURCE_INFO = struct open S structure Pos = struct datatype t = Known of SourcePos.t | Unknown fun toString p = case p of Known p => if !Control.profile = Control.ProfileCallStack then SourcePos.toString p else concat [SourcePos.file p, ": ", Int.toString (SourcePos.line p)] | Unknown => "" fun fromRegion r = case Region.left r of NONE => Unknown | SOME p => Known p fun file p = case p of Known p => SOME (SourcePos.file p) | Unknown => NONE end datatype info = Anonymous of Pos.t | C of string | Function of {name: string list, pos: Pos.t} datatype t = T of {hash: word, info: info, plist: PropertyList.t} local val r: t list ref = ref [] in fun new info = let val res = T {hash = Random.word (), info = info, plist = PropertyList.new ()} val () = if !Control.profile = Control.ProfileCount then List.push (r, res) else () in res end fun all () = !r end local fun make f (T r) = f r in val hash = make #hash val info = make #info val plist = make #plist end local val set: {hash: word, name: string, sourceInfo: t} HashSet.t = HashSet.new {hash = #hash} in fun fromC (name: string) = let val hash = String.hash name in #sourceInfo (HashSet.lookupOrInsert (set, hash, fn {hash = h, ...} => hash = h, fn () => {hash = hash, name = name, sourceInfo = new (C name)})) end end fun function {name, region} = new (Function {name = name, pos = Pos.fromRegion region}) fun toString' (si, sep) = case info si of Anonymous pos => Pos.toString pos | C s => concat ["<", s, ">"] | Function {name, pos} => concat [concat (List.separate (List.rev name, ".")), sep, Pos.toString pos] fun toString si = toString' (si, " ") val layout = Layout.str o toString val equals: t * t -> bool = fn (s, s') => PropertyList.equals (plist s, plist s') val equals = Trace.trace2 ("SourceInfo.equals", layout, layout, Bool.layout) equals fun file (s: t): File.t option = case info s of Anonymous pos => Pos.file pos | C _ => NONE | Function {pos, ...} => Pos.file pos fun isC (s: t): bool = case info s of C _ => true | _ => false val gc = fromC "gc" val gcArrayAllocate = fromC "GC_arrayAllocate" val main = fromC "main" val polyEqual = fromC "poly-equal" val polyHash = fromC "poly-hash" val unknown = fromC "unknown" end mlton-20100608/mlton/atoms/source-info.sig0000644000076600000240000000161011404435623016770 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2003-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SOURCE_INFO_STRUCTS = sig end signature SOURCE_INFO = sig include SOURCE_INFO_STRUCTS type t val all: unit -> t list val equals: t * t -> bool val file: t -> File.t option val gc: t val gcArrayAllocate: t val hash: t -> word val fromC: string -> t val function: {name: string list, region: Region.t} -> t val isC: t -> bool val layout: t -> Layout.t val main: t val plist: t -> PropertyList.t val polyEqual: t val polyHash: t val toString: t -> string val toString': t * string -> string val unknown: t end mlton-20100608/mlton/atoms/sources.cm0000644000076600000240000000267011404435623016046 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature AST signature ATOMS signature ID signature C_FUNCTION signature C_TYPE signature CON signature CONST signature CONST_TYPE signature FFI signature GENERIC_SCHEME signature ID signature HASH_TYPE signature LABEL signature PRIM signature PROFILE_EXP signature PROFILE_LABEL signature REAL_X signature RECORD signature SOURCE_INFO signature TYCON signature TYPE_OPS signature TYVAR signature VAR signature WORD_X signature WORD_X_VECTOR functor Atoms functor Id functor GenericScheme functor HashType functor TypeOps functor UseName is ../../lib/mlton/sources.cm ../ast/sources.cm ../control/sources.cm id.sig id.fun (* Windows doesn't like files named con, so use con- instead. *) con-.sig con-.fun word-x.sig word-x.fun real-x.sig real-x.fun word-x-vector.sig word-x-vector.fun c-type.sig c-type.fun label.sig c-function.sig c-function.fun const-type.sig const-type.fun const.sig const.fun prim.sig prim.fun ffi.sig ffi.fun func.sig generic-scheme.sig generic-scheme.fun profile-label.sig profile-label.fun source-info.sig source-info.fun profile-exp.sig profile-exp.fun tycon.sig tycon.fun type-ops.sig type-ops.fun use-name.fun var.sig var.fun atoms.sig atoms.fun hash-type.sig hash-type.fun mlton-20100608/mlton/atoms/sources.mlb0000644000076600000240000000301711404435623016215 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../ast/sources.mlb ../control/sources.mlb id.sig id.fun (* Windows doesn't like files named con, so use con- instead. *) con-.sig con-.fun word-x.sig word-x.fun real-x.sig real-x.fun word-x-vector.sig word-x-vector.fun c-type.sig c-type.fun label.sig c-function.sig c-function.fun const-type.sig const-type.fun const.sig const.fun prim.sig prim.fun ffi.sig ffi.fun func.sig generic-scheme.sig generic-scheme.fun profile-label.sig profile-label.fun source-info.sig source-info.fun profile-exp.sig profile-exp.fun tycon.sig tycon.fun type-ops.sig type-ops.fun use-name.fun var.sig var.fun atoms.sig atoms.fun hash-type.sig hash-type.fun in signature AST signature ATOMS signature ID signature C_FUNCTION signature C_TYPE signature CONST signature CONST_TYPE signature FFI signature ID signature HASH_TYPE signature LABEL signature PRIM signature PROFILE_LABEL signature RECORD signature TYCON signature TYPE_OPS signature WORD_X signature WORD_X_VECTOR functor Atoms functor Id functor GenericScheme functor HashType functor TypeOps functor UseName end mlton-20100608/mlton/atoms/tycon.fun0000644000076600000240000000241711404435622015706 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Tycon (S: TYCON_STRUCTS): TYCON = struct open S structure Id = Id (val noname = "t") open Id structure AdmitsEquality = AdmitsEquality () structure Kind = TyconKind () structure P = PrimTycons (structure AdmitsEquality = AdmitsEquality structure CharSize = CharSize structure IntSize = IntSize structure Kind = Kind structure RealSize = RealSize structure WordSize = WordSize open Id) open P val setPrintName = Trace.trace2 ("Tycon.setPrintName", layout, String.layout, Unit.layout) setPrintName fun stats () = let open Layout in align (List.map (prims, fn {tycon = c, ...} => seq [layout c, str " size is ", Int.layout (MLton.size c), str " plist length is ", Int.layout (PropertyList.length (plist c))])) end (* quell unused warning *) val _ = stats end mlton-20100608/mlton/atoms/tycon.sig0000644000076600000240000000110611404435623015673 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYCON_STRUCTS = sig structure CharSize: CHAR_SIZE structure IntSize: INT_SIZE structure RealSize: REAL_SIZE structure WordSize: WORD_SIZE end signature TYCON = sig include ID include PRIM_TYCONS sharing type t = tycon val stats: unit -> Layout.t end mlton-20100608/mlton/atoms/type-ops.fun0000644000076600000240000000524411404435623016334 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TypeOps (S: TYPE_OPS_STRUCTS): TYPE_OPS = struct open S local open Tycon in structure RealSize = RealSize structure WordSize = WordSize end type realSize = RealSize.t type tycon = Tycon.t type wordSize = WordSize.t local fun nullary tycon = con (tycon, Vector.new0 ()) in val bool = nullary Tycon.bool val cpointer = nullary Tycon.cpointer val exn = nullary Tycon.exn val intInf = nullary Tycon.intInf val real = RealSize.memoize (fn s => nullary (Tycon.real s)) val thread = nullary Tycon.thread val word = WordSize.memoize (fn s => nullary (Tycon.word s)) end local fun unary tycon t = con (tycon, Vector.new1 t) in val array = unary Tycon.array val list = unary Tycon.list val reff = unary Tycon.reff val vector = unary Tycon.vector val weak = unary Tycon.weak end val word8 = word WordSize.word8 val word8Vector = vector word8 val word32 = word WordSize.word32 local fun binary tycon (t1, t2) = con (tycon, Vector.new2 (t1, t2)) in val arrow = binary Tycon.arrow end val arrow = Trace.trace ("TypeOps.arrow", Layout.tuple2 (layout, layout), layout) arrow fun deUnaryOpt tycon t = case deConOpt t of SOME (c, ts) => if Tycon.equals (c, tycon) then SOME (Vector.sub (ts, 0)) else NONE | _ => NONE fun deUnary tycon t = case deUnaryOpt tycon t of SOME t => t | NONE => Error.bug "TypeOps.deUnary" val deArray = deUnary Tycon.array val deRef = deUnary Tycon.reff val deVector = deUnary Tycon.vector val deWeak = deUnary Tycon.weak fun tuple ts = if 1 = Vector.length ts then Vector.sub (ts, 0) else con (Tycon.tuple, ts) val unit = tuple (Vector.new0 ()) fun deTupleOpt t = case deConOpt t of SOME (c, ts) => if Tycon.equals (c, Tycon.tuple) then SOME ts else NONE | NONE => NONE val isTuple = Option.isSome o deTupleOpt fun deTuple t = case deTupleOpt t of SOME t => t | NONE => Error.bug "TypeOps.deTuple" val unitRef = reff unit fun deArrowOpt t = case deConOpt t of SOME (c, ts) => if Tycon.equals (c, Tycon.arrow) then SOME (Vector.sub (ts, 0), Vector.sub (ts, 1)) else NONE | _ => NONE fun deArrow t = case deArrowOpt t of SOME x => x | NONE => Error.bug "TypeOps.deArrow" val deArrow = Trace.trace ("TypeOps.deArrow", layout, Layout.tuple2 (layout, layout)) deArrow end mlton-20100608/mlton/atoms/type-ops.sig0000644000076600000240000000302211404435623016316 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYPE_OPS_STRUCTS = sig structure Tycon: TYCON type t val con: Tycon.t * t vector -> t val deConOpt: t -> (Tycon.t * t vector) option val layout: t -> Layout.t end signature TYPE_OPS = sig (* Don't want to include TYPE_OPS_STRUCTS because don't want to propagate * the Tycon structure, which will cause duplicate specifications later * on. *) type realSize type tycon type wordSize type t val array: t -> t val arrow: t * t -> t val bool: t val con: tycon * t vector -> t val cpointer: t val deArray: t -> t val deArrow: t -> t * t val deArrowOpt: t -> (t * t) option val deConOpt: t -> (tycon * t vector) option val deRef: t -> t val deTuple: t -> t vector val deTupleOpt: t -> t vector option val deVector: t -> t val deWeak: t -> t val exn: t val intInf: t val isTuple: t -> bool val list: t -> t val real: realSize -> t val reff: t -> t val thread: t val tuple: t vector -> t val unit: t val unitRef: t val vector: t -> t val weak: t -> t val word: wordSize -> t val word8: t val word8Vector: t val word32: t end mlton-20100608/mlton/atoms/unary-tycon.fun0000644000076600000240000000114511404435622017037 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor UnaryTycon(S: UNARY_TYCON_STRUCTS): UNARY_TYCON = struct open S datatype t = Ref | Array | Vector val toTycon = fn Ref => Tycon.reff | Array => Tycon.array | Vector => Tycon.vector val toString = fn Ref => "Ref" | Array => "Array" | Vector => "Vector" val equals: t * t -> bool = op = val layout = Layout.str o toString end mlton-20100608/mlton/atoms/unary-tycon.sig0000644000076600000240000000107311404435623017032 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNARY_TYCON_STRUCTS = sig structure Tycon: TYCON end signature UNARY_TYCON = sig include UNARY_TYCON_STRUCTS datatype t = Ref | Array | Vector val toTycon: t -> Tycon.t val toString: t -> string val equals: t * t -> bool val layout: t -> Layout.t end mlton-20100608/mlton/atoms/use-name.fun0000644000076600000240000000067611404435623016272 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor UseName(S: sig include T val sameName: t * t -> bool end): T = struct open S val equals = sameName end mlton-20100608/mlton/atoms/var.fun0000644000076600000240000000054011404435622015335 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Var (S: VAR_STRUCTS): VAR = struct open S structure V = Id (val noname = "x") open V end mlton-20100608/mlton/atoms/var.sig0000644000076600000240000000046511404435623015336 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature VAR_STRUCTS = sig end signature VAR = ID mlton-20100608/mlton/atoms/word-x-vector.fun0000644000076600000240000000424711404435623017276 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor WordXVector (S: WORD_X_VECTOR_STRUCTS): WORD_X_VECTOR = struct open S datatype t = T of {elementSize: WordSize.t, elements: WordX.t vector} local fun make f (T r) = f r in val elementSize = make #elementSize val elements = make #elements end fun toString (T {elements, elementSize}): string = let val n = Bits.toInt (WordSize.bits elementSize) in implode (rev (Vector.fold (elements, [], fn (w, ac) => let fun loop (i, w, ac) = if i = 0 then ac else let val (q, r) = IntInf.quotRem (w, 0x100) in loop (i - 8, q, Char.fromInt (IntInf.toInt r) :: ac) end in (* Control.Target.bigEndian is not always set, so * only use it if we really need to know the value. *) if n > 8 andalso Control.Target.bigEndian () then rev (loop (n, WordX.toIntInf w, [])) @ ac else loop (n, WordX.toIntInf w, []) @ ac end))) end val hash = String.hash o toString val layout = Layout.str o toString fun equals (v, v') = WordSize.equals (elementSize v, elementSize v') andalso Vector.equals (elements v, elements v', WordX.equals) fun forall (v, f) = Vector.forall (elements v, f) fun fromString s = T {elementSize = WordSize.byte, elements = Vector.tabulate (String.size s, fn i => WordX.fromChar (String.sub (s, i)))} fun length v = Vector.length (elements v) fun sub (v, i) = Vector.sub (elements v, i) fun tabulate ({elementSize}, n, f) = T {elementSize = elementSize, elements = Vector.tabulate (n, f)} end mlton-20100608/mlton/atoms/word-x-vector.sig0000644000076600000240000000147311404435623017266 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature WORD_X_VECTOR_STRUCTS = sig structure WordSize: WORD_SIZE structure WordX: WORD_X sharing WordSize = WordX.WordSize end signature WORD_X_VECTOR = sig include WORD_X_VECTOR_STRUCTS type t val elementSize: t -> WordSize.t val equals: t * t -> bool val forall: t * (WordX.t -> bool) -> bool val fromString: string -> t val hash : t -> word val layout: t -> Layout.t val length: t -> int val sub: t * int -> WordX.t val tabulate: {elementSize: WordSize.t} * int * (int -> WordX.t) -> t val toString: t -> string end mlton-20100608/mlton/atoms/word-x.fun0000644000076600000240000001163311404435623015773 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor WordX (S: WORD_X_STRUCTS): WORD_X = struct open S val modulus: WordSize.t -> IntInf.t = fn s => IntInf.<< (1, Bits.toWord (WordSize.bits s)) local datatype t = T of {size: WordSize.t, value: IntInf.t} in type t = t fun make (i: IntInf.t, s: WordSize.t) = T {size = s, value = i mod modulus s} fun dest (T r) = r end local fun make f = f o dest in val size = make #size val value = make #value end val toIntInf = value fun toIntInfX w = let val v = value w val m = modulus (size w) in if v >= m div 2 then v - m else v end val toInt = IntInf.toInt o toIntInf fun toString w = IntInf.format (toIntInf w, StringCvt.HEX) fun layout w = Layout.str (concat ["0x", toString w]) fun zero s = make (0, s) val hash = IntInf.hash o toIntInf local val make: (IntInf.t * Word.t -> IntInf.t) -> t * t -> t = fn f => fn (w, w') => let val s = size w val v' = value w' in if v' >= Bits.toIntInf (WordSize.bits s) then zero s else make (f (value w, Word.fromIntInf v'), s) end in val lshift = make IntInf.<< val >> = make IntInf.~>> (* OK because we know the value is positive. *) end fun equals (w, w') = WordSize.equals (size w, size w') andalso value w = value w' fun fromChar (c: Char.t) = make (Int.toIntInf (Char.toInt c), WordSize.byte) val fromIntInf = make fun isAllOnes w = value w = modulus (size w) - 1 fun isOne w = 1 = value w fun isZero w = 0 = value w fun isNegOne w = ~1 = toIntInfX w local fun make f (s, sg) = fromIntInf (f (s, sg), s) in val max = make WordSize.max val min = make WordSize.min end fun allOnes s = max (s, {signed = false}) local fun make f (w, sg) = equals (w, f (size w, sg)) in val isMax = make max val isMin = make min end fun notb w = make (IntInf.notb (value w), size w) fun one s = make (1, s) fun toIntInfSg (w, {signed}) = if signed then toIntInfX w else toIntInf w fun resize (w, s) = make (toIntInf w, s) fun resizeX (w, s) = make (toIntInfX w, s) fun toChar (w: t): char = Char.fromInt (Int.fromIntInf (value w)) fun ~>> (w, w') = let val shift = value w' val s = size w val b = WordSize.bits s val shift = if shift > Bits.toIntInf b then Bits.toWord b else Word.fromIntInf shift in make (IntInf.~>> (toIntInfX w, shift), s) end fun rshift (w, w', {signed}) = if signed then ~>> (w, w') else >> (w, w') fun swap (i: IntInf.t, {hi: word, lo: word}) = let open IntInf in orb (~>> (i, lo), << (i mod << (1, lo), hi)) end fun rol (w, w') = let val s = size w val b = WordSize.bits s val shift = Word.fromIntInf (value w' mod Bits.toIntInf b) in make (swap (value w, {hi = shift, lo = Bits.toWord b - shift}), s) end fun ror (w, w') = let val s = size w val b = WordSize.bits s val shift = Word.fromIntInf (value w' mod Bits.toIntInf b) in make (swap (value w, {hi = Bits.toWord b - shift, lo = shift}), s) end local val make: ((IntInf.t * IntInf.t -> IntInf.t) * string) -> t * t -> t = fn (f,name) => fn (w, w') => if WordSize.equals (size w, size w') then make (f (value w, value w'), size w) else Error.bug (concat ["WordX.", name]) in val add = make (IntInf.+, "add") val sub = make (IntInf.-, "sub") val andb = make (IntInf.andb, "andb") val orb = make (IntInf.orb, "orb") val xorb = make (IntInf.xorb, "xorb") end fun neg w = make (~ (toIntInfX w), size w) local val make: ((IntInf.t * IntInf.t -> IntInf.t) * string) -> t * t * {signed: bool}-> t = fn (f,name) => fn (w, w', s) => if WordSize.equals (size w, size w') then make (f (toIntInfSg (w, s), toIntInfSg (w', s)), size w) else Error.bug (concat ["WordX.", name]) in val op div = make (IntInf.div, "div") val op mod = make (IntInf.mod, "mod") val mul = make (IntInf.*, "mul") val quot = make (IntInf.quot, "quot") val rem = make (IntInf.rem, "rem") end local val make: ((IntInf.t * IntInf.t -> 'a) * string) -> t * t * {signed: bool} -> 'a = fn (f,name) => fn (w, w', sg) => if WordSize.equals (size w, size w') then f (toIntInfSg (w, sg), toIntInfSg (w', sg)) else Error.bug (concat ["WordX.", name]) in val compare = make (IntInf.compare, "compare") val lt = make (IntInf.<, "lt") val le = make (IntInf.<=, "le") val gt = make (IntInf.>, "gt") val ge = make (IntInf.>=, "ge") end fun layoutSg {signed} = Layout.record [("signed", Bool.layout signed)] val lt = Trace.trace3 ("WordX.lt", layout, layout, layoutSg, Bool.layout) lt end mlton-20100608/mlton/atoms/word-x.sig0000644000076600000240000000400311404435623015756 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature WORD_X_STRUCTS = sig structure WordSize: WORD_SIZE end signature WORD_X = sig include WORD_X_STRUCTS (* Words of all WordSize.t sizes. *) type t val add: t * t -> t val allOnes: WordSize.t -> t val andb: t * t -> t val compare: t * t * {signed: bool} -> order val div: t * t * {signed: bool} -> t val equals: t * t -> bool val fromChar: char -> t (* returns a word of size 8 *) val fromIntInf: IntInf.t * WordSize.t -> t val ge: t * t * {signed: bool} -> bool val gt: t * t * {signed: bool} -> bool val hash: t -> word val isAllOnes: t -> bool val isOne: t -> bool val isMax: t * {signed: bool} -> bool val isMin: t * {signed: bool} -> bool val isNegOne: t -> bool val isZero: t -> bool val layout: t -> Layout.t val le: t * t * {signed: bool} -> bool val lshift: t * t -> t val lt: t * t * {signed: bool} -> bool val max: WordSize.t * {signed: bool} -> t val min: WordSize.t * {signed: bool} -> t val mod: t * t * {signed: bool} -> t val mul: t * t * {signed: bool} -> t val neg: t -> t val notb: t -> t val one: WordSize.t -> t val orb: t * t -> t val quot: t * t * {signed: bool} -> t val rem: t * t * {signed: bool} -> t val resize: t * WordSize.t -> t val resizeX: t * WordSize.t -> t val rol: t * t -> t val ror: t * t -> t val rshift : t * t * {signed: bool} -> t val size: t -> WordSize.t val sub: t * t -> t val toChar: t -> char val toInt: t -> int val toIntInf: t -> IntInf.t val toIntInfX: t -> IntInf.t val toString: t -> string val xorb: t * t -> t val zero: WordSize.t -> t end mlton-20100608/mlton/backend/0000755000076600000240000000000011404470407014300 5ustar mtfstaffmlton-20100608/mlton/backend/allocate-registers.fun0000644000076600000240000005264411404435623020617 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AllocateRegisters (S: ALLOCATE_REGISTERS_STRUCTS): ALLOCATE_REGISTERS = struct open S structure R = Rssa local open Rssa in structure Func = Func structure Function = Function structure Kind = Kind structure Label = Label structure Type = Type structure Var = Var end local open Machine in structure CType = CType structure Operand = Operand structure Register = Register structure Runtime = Runtime structure StackOffset = StackOffset end structure Live = Live (Rssa) structure Allocation: sig structure Stack: sig type t val get: t * Type.t -> t * {offset: Bytes.t} val layout: t -> Layout.t val new: StackOffset.t list -> t val size: t -> Bytes.t end type t val getRegister: t * Type.t -> Register.t val getStack: t * Type.t -> {offset: Bytes.t} val layout: t -> Layout.t val new: StackOffset.t list * Register.t list -> t val stack: t -> Stack.t val stackSize: t -> Bytes.t end = struct structure Stack = struct (* Keep a list of allocated slots sorted in increasing order of offset. *) datatype t = T of {offset: Bytes.t, size: Bytes.t} list fun layout (T alloc) = List.layout (fn {offset, size} => Layout.record [("offset", Bytes.layout offset), ("size", Bytes.layout size)]) alloc fun size (T alloc) = case alloc of [] => Bytes.zero | _ => let val {offset, size} = List.last alloc in Bytes.+ (offset, size) end fun new (alloc): t = let val a = Array.fromListMap (alloc, fn StackOffset.T {offset, ty} => {offset = offset, size = Type.bytes ty}) val () = QuickSort.sortArray (a, fn (r, r') => Bytes.<= (#offset r, #offset r')) in T (Array.toList a) end fun get (T alloc, ty) = let val slotSize = Type.bytes ty in case alloc of [] => (T [{offset = Bytes.zero, size = slotSize}], {offset = Bytes.zero}) | a :: alloc => let fun loop (alloc, a as {offset, size}, ac) = let val prevEnd = Bytes.+ (offset, size) val begin = Type.align (ty, prevEnd) fun coalesce () = if Bytes.equals (prevEnd, begin) then ({offset = offset, size = Bytes.+ (size, slotSize)}, ac) else ({offset = begin, size = slotSize}, {offset = offset, size = size} :: ac) in case alloc of [] => let val (a, ac) = coalesce () in (T (rev (a :: ac)), {offset = begin}) end | (a' as {offset, size}) :: alloc => if Bytes.> (Bytes.+ (begin, slotSize), offset) then loop (alloc, a', a :: ac) else let val (a'' as {offset = o', size = s'}, ac) = coalesce () val alloc = List.appendRev (ac, if Bytes.equals (Bytes.+ (o', s'), offset) then {offset = o', size = Bytes.+ (size, s')} :: alloc else a'' :: a' :: alloc) in (T alloc, {offset = begin}) end end in loop (alloc, a, []) end end end structure Registers = struct (* A register allocation keeps track of the registers that have * already been allocated, for each runtime type. The reason that * we associate them with runtime types rather than Rssa types is * that the register indices that the codegens use are based on * runtime types. *) datatype t = T of CType.t -> {alloc: Register.t list, next: int} ref fun layout (T f) = List.layout (fn t => let val {alloc, next} = ! (f t) in Layout.record [("ty", CType.layout t), ("next", Int.layout next), ("alloc", List.layout Register.layout alloc)] end) CType.all fun compress {next, alloc} = let fun loop (next, alloc) = let fun done () = {alloc = alloc, next = next} in case alloc of [] => done () | r :: alloc => if next = Register.index r then loop (next + 1, alloc) else done () end in loop (next, alloc) end fun new (rs: Register.t list): t = let fun sameType (r, r') = CType.equals (Type.toCType (Register.ty r), Type.toCType (Register.ty r')) val rss = List.equivalence (rs, sameType) in T (CType.memo (fn t => case List.peek (rss, fn rs => case rs of [] => false | r :: _ => CType.equals (t, Type.toCType (Register.ty r))) of NONE => ref {alloc = [], next = 0} | SOME rs => ref (compress {next = 0, alloc = QuickSort.sortList (rs, fn (r, r') => Register.index r <= Register.index r')}))) end fun get (T f, ty: Type.t) = let val t = Type.toCType ty val r = f t val {alloc, next} = !r val reg = Register.new (ty, SOME next) val _ = r := compress {alloc = alloc, next = next + 1} in reg end end datatype t = T of {registers: Registers.t, stack: Stack.t ref} local fun make s (T x) = s x in val stack = ! o (make #stack) val stackSize = Stack.size o stack end fun layout (T {registers, stack}) = Layout.record [("stack", Stack.layout (!stack)), ("registers", Registers.layout registers)] fun getStack (T {stack, ...}, ty) = let val (s, offset) = Stack.get (!stack, ty) val _ = stack := s in offset end fun getRegister (T {registers, ...}, ty) = Registers.get (registers, ty) fun new (stack, registers) = T {registers = Registers.new registers, stack = ref (Stack.new stack)} end structure Info = struct type t = {live: Operand.t vector, liveNoFormals: Operand.t vector, size: Bytes.t} fun layout ({live, liveNoFormals, size, ...}: t) = Layout.record [("live", Vector.layout Operand.layout live), ("liveNoFormals", Vector.layout Operand.layout liveNoFormals), ("size", Bytes.layout size)] end (* ------------------------------------------------- *) (* allocate *) (* ------------------------------------------------- *) fun allocate {argOperands, function = f: Rssa.Function.t, varInfo: Var.t -> {operand: Machine.Operand.t option ref option, ty: Type.t}} = let fun diagnostics f = Control.diagnostics (fn display => let open Layout fun diagVar (x: Var.t): unit = display (seq [Var.layout x, str " ", Option.layout (fn r => Option.layout Operand.layout (!r)) (#operand (varInfo x))]) fun diagStatement (s: R.Statement.t): unit = R.Statement.foreachDef (s, diagVar o #1) in f (display, diagVar, diagStatement) end) val _ = Control.diagnostic (fn () => let open Layout in seq [str "Function allocs for ", Func.layout (Function.name f)] end) val {labelLive, remLabelLive} = Live.live (f, {shouldConsider = isSome o #operand o varInfo}) val {args, blocks, name, ...} = Function.dest f (* * Decide which variables will live in stack slots and which * will live in registers. * Initially, * - all formals are put in stack slots * - everything else is put everything in a register. * Variables get moved to the stack if they are * - live at the beginning of a basic block (i.e. Fun dec) * - live at a primitive that enters the runtime system *) datatype place = Stack | Register val {get = place: Var.t -> place ref, rem = removePlace, ...} = Property.get (Var.plist, Property.initFun (fn _ => ref Register)) (* !hasHandler = true iff handlers are installed in this function. *) val hasHandler: bool ref = ref false fun forceStack (x: Var.t): unit = place x := Stack val _ = Vector.foreach (args, forceStack o #1) val _ = Vector.foreach (blocks, fn R.Block.T {args, kind, label, statements, ...} => let val {beginNoFormals, ...} = labelLive label val _ = case Kind.frameStyle kind of Kind.None => () | Kind.OffsetsAndSize => Vector.foreach (beginNoFormals, forceStack) | Kind.SizeOnly => () val _ = case kind of Kind.Cont _ => Vector.foreach (args, forceStack o #1) | _ => () val _ = if not (!hasHandler) andalso (Vector.exists (statements, fn s => let datatype z = datatype R.Statement.t in case s of SetHandler _ => true | SetExnStackLocal => true | SetExnStackSlot => true | SetSlotExnStack => true | _ => false end)) then hasHandler := true else () in () end) fun allocateVar (x: Var.t, a: Allocation.t): unit = let val {operand, ty} = varInfo x in if isSome operand then let val oper = case ! (place x) of Stack => let val {offset} = Allocation.getStack (a, ty) in Operand.StackOffset (StackOffset.T {offset = offset, ty = ty}) end | Register => Operand.Register (Allocation.getRegister (a, ty)) val () = removePlace x val _ = case operand of NONE => () | SOME r => r := SOME oper in () end else () end val allocateVar = Trace.trace2 ("AllocateRegisters.allocateVar", Var.layout, Allocation.layout, Unit.layout) allocateVar (* Create the initial stack and set the stack slots for the formals. *) val stack = Allocation.Stack.new (Vector.foldr2 (args, argOperands, [], fn ((x, t), z, ac) => case z of Operand.StackOffset (StackOffset.T {offset, ...}) => (valOf (#operand (varInfo x)) := SOME z ; StackOffset.T {offset = offset, ty = t} :: ac) | _ => Error.bug "AllocateRegisters.allocate: strange argOperand")) (* Allocate slots for the link and handler, if necessary. *) val handlerLinkOffset = if !hasHandler then let val (stack, {offset = handler, ...}) = Allocation.Stack.get (stack, Type.label (Label.newNoname ())) val (_, {offset = link, ...}) = Allocation.Stack.get (stack, Type.exnStack ()) in SOME {handler = handler, link = link} end else NONE fun getOperands (xs: Var.t vector): Operand.t vector = Vector.map (xs, fn x => valOf (! (valOf (#operand (varInfo x))))) val getOperands = Trace.trace ("AllocateRegisters.getOperands", Vector.layout Var.layout, Vector.layout Operand.layout) getOperands val {get = labelInfo: R.Label.t -> Info.t, set = setLabelInfo, ...} = Property.getSetOnce (R.Label.plist, Property.initRaise ("labelInfo", R.Label.layout)) val setLabelInfo = Trace.trace2 ("AllocateRegisters.setLabelInfo", R.Label.layout, Info.layout, Unit.layout) setLabelInfo (* Do a DFS of the control-flow graph. *) val () = Function.dfs (f, fn R.Block.T {args, label, kind, statements, transfer, ...} => let val {begin, beginNoFormals, handler = handlerLive, link = linkLive} = labelLive label val () = remLabelLive label fun addHS (ops: Operand.t vector): Operand.t vector = case handlerLinkOffset of NONE => ops | SOME {handler, link} => let val extra = [] val extra = case handlerLive of NONE => extra | SOME h => Operand.stackOffset {offset = handler, ty = Type.label h} :: extra val extra = if linkLive then Operand.stackOffset {offset = link, ty = Type.exnStack ()} :: extra else extra in Vector.concat [Vector.fromList extra, ops] end val liveNoFormals = getOperands beginNoFormals val (stackInit, registersInit) = Vector.fold (liveNoFormals, ([],[]), fn (oper, (stack, registers)) => case oper of Operand.StackOffset s => (s::stack, registers) | Operand.Register r => (stack, r::registers) | _ => (stack, registers)) val stackInit = case handlerLinkOffset of NONE => stackInit | SOME {handler, link} => StackOffset.T {offset = handler, ty = Type.label (Label.newNoname ())} :: StackOffset.T {offset = link, ty = Type.exnStack ()} :: stackInit val a = Allocation.new (stackInit, registersInit) val size = case kind of Kind.Handler => (case handlerLinkOffset of NONE => Error.bug "AllocateRegisters.allocate: Handler with no handler offset" | SOME {handler, ...} => Bytes.+ (Runtime.labelSize (), handler)) | _ => let val size = Bytes.+ (Runtime.labelSize (), Bytes.alignWord32 (Allocation.stackSize a)) in case !Control.align of Control.Align4 => size | Control.Align8 => Bytes.alignWord64 size end val _ = if Bytes.isWord32Aligned size then () else Error.bug (concat ["AllocateRegisters.allocate: ", "bad size ", Bytes.toString size, " in ", Label.toString label]) val _ = Vector.foreach (args, fn (x, _) => allocateVar (x, a)) (* Must compute live after allocateVar'ing the args, since that * sets the operands for the args. *) val live = getOperands begin fun one (var, _) = allocateVar (var, a) val _ = Vector.foreach (statements, fn statement => R.Statement.foreachDef (statement, one)) val _ = R.Transfer.foreachDef (transfer, one) val _ = setLabelInfo (label, {live = addHS live, liveNoFormals = addHS liveNoFormals, size = size}) in fn () => () end) val () = diagnostics (fn (display, diagVar, diagStatement) => let open Layout val _ = display (seq [str "function ", Func.layout name, str " handlerLinkOffset ", Option.layout (fn {handler, link} => record [("handler", Bytes.layout handler), ("link", Bytes.layout link)]) handlerLinkOffset]) val _ = Vector.foreach (args, diagVar o #1) val _ = Vector.foreach (blocks, fn R.Block.T {label, args, statements, ...} => let val {live, ...} = labelInfo label val () = display (R.Label.layout label) val () = display (seq [str "live: ", Vector.layout Operand.layout live]) val () = Vector.foreach (args, diagVar o #1) val () = Vector.foreach (statements, diagStatement) in () end) in () end) in {handlerLinkOffset = handlerLinkOffset, labelInfo = labelInfo} end val allocate = Trace.trace ("AllocateRegisters.allocate", fn {function, ...} => Func.layout (Function.name function), Layout.ignore) allocate end mlton-20100608/mlton/backend/allocate-registers.sig0000644000076600000240000000363111404435623020601 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ALLOCATE_REGISTERS_STRUCTS = sig structure Rssa: RSSA structure Machine: MACHINE sharing Rssa.Runtime = Machine.Runtime sharing Rssa.Type = Machine.Type end signature ALLOCATE_REGISTERS = sig include ALLOCATE_REGISTERS_STRUCTS val allocate: {argOperands: Machine.Operand.t vector, function: Rssa.Function.t, varInfo: Rssa.Var.t -> { (* If (isSome operand) then a stack slot or * register needs to be allocated for the * variable. *) operand: Machine.Operand.t option ref option, ty: Machine.Type.t } } -> {(* If handlers are used, handlerLinkOffset gives the stack offsets * where the handler and link (old exnStack) should be stored. *) handlerLinkOffset: {handler: Bytes.t, link: Bytes.t} option, labelInfo: Rssa.Label.t -> {(* Live operands at the beginning of the block. *) live: Machine.Operand.t vector, (* Live operands at the beginning of the block, * excepting its formals. *) liveNoFormals: Machine.Operand.t vector, (* Size of frame including return address. *) size: Bytes.t}} end mlton-20100608/mlton/backend/backend.fun0000644000076600000240000014257711404435623016422 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Backend (S: BACKEND_STRUCTS): BACKEND = struct open S structure M = Machine local open Machine in structure Global = Global structure Label = Label structure Live = Live structure ObjptrTycon = ObjptrTycon structure RealX = RealX structure Register = Register structure Runtime = Runtime structure StackOffset = StackOffset structure WordSize = WordSize structure WordX = WordX structure WordXVector = WordXVector end local open Runtime in structure GCField = GCField end structure Rssa = Rssa (open Ssa Machine) structure R = Rssa local open Rssa in structure CType = CType structure Const = Const structure Func = Func structure Function = Function structure Prim = Prim structure Type = Type structure Var = Var end structure AllocateRegisters = AllocateRegisters (structure Machine = Machine structure Rssa = Rssa) structure Chunkify = Chunkify (Rssa) structure ImplementHandlers = ImplementHandlers (structure Rssa = Rssa) structure ImplementProfiling = ImplementProfiling (structure Machine = Machine structure Rssa = Rssa) structure LimitCheck = LimitCheck (structure Rssa = Rssa) structure ParallelMove = ParallelMove () structure SignalCheck = SignalCheck(structure Rssa = Rssa) structure SsaToRssa = SsaToRssa (structure Rssa = Rssa structure Ssa = Ssa) nonfix ^ fun ^ r = valOf (!r) structure VarOperand = struct datatype t = Allocate of {operand: M.Operand.t option ref} | Const of M.Operand.t fun layout i = let open Layout in case i of Allocate {operand, ...} => seq [str "Allocate ", record [("operand", Option.layout M.Operand.layout (!operand))]] | Const oper => seq [str "Const ", M.Operand.layout oper] end val operand: t -> M.Operand.t = fn Allocate {operand, ...} => ^operand | Const oper => oper end structure IntSet = UniqueSet (val cacheSize: int = 1 val bits: int = 14 structure Element = struct open Int fun hash n = Word.fromInt n end) structure Chunk = struct datatype t = T of {blocks: M.Block.t list ref, chunkLabel: M.ChunkLabel.t} fun label (T {chunkLabel, ...}) = chunkLabel fun new (): t = T {blocks = ref [], chunkLabel = M.ChunkLabel.newNoname ()} fun newBlock (T {blocks, ...}, z) = List.push (blocks, M.Block.T z) end val traceGenBlock = Trace.trace ("Backend.genBlock", Label.layout o R.Block.label, Unit.layout) fun eliminateDeadCode (f: R.Function.t): R.Function.t = let val {args, blocks, name, returns, raises, start} = R.Function.dest f val {get, rem, set, ...} = Property.getSetOnce (Label.plist, Property.initConst false) val get = Trace.trace ("Backend.labelIsReachable", Label.layout, Bool.layout) get val _ = R.Function.dfs (f, fn R.Block.T {label, ...} => (set (label, true) ; fn () => ())) val blocks = Vector.keepAll (blocks, fn R.Block.T {label, ...} => let val res = get label val () = rem label in res end) in R.Function.new {args = args, blocks = blocks, name = name, returns = returns, raises = raises, start = start} end fun toMachine (program: Ssa.Program.t, codegen) = let fun pass (name, doit, program) = Control.passTypeCheck {display = Control.Layouts Rssa.Program.layouts, name = name, stats = R.Program.layoutStats, style = Control.No, suffix = "rssa", thunk = fn () => doit program, typeCheck = R.Program.typeCheck} val program = pass ("toRssa", SsaToRssa.convert, (program, codegen)) fun rssaSimplify p = let open Rssa fun pass' ({name, doit}, sel, p) = let val _ = let open Control in maybeSaveToFile ({name = name, suffix = "pre.rssa"}, Control.No, p, Control.Layouts Program.layouts) end val p = Control.passTypeCheck {display = Control.Layouts (fn (r,output) => Program.layouts (sel r, output)), name = name, stats = Program.layoutStats o sel, style = Control.No, suffix = "post.rssa", thunk = fn () => doit p, typeCheck = Program.typeCheck o sel} in p end fun pass ({name, doit}, p) = pass' ({name = name, doit = doit}, fn p => p, p) fun maybePass ({name, doit}, p) = if List.exists (!Control.dropPasses, fn re => Regexp.Compiled.matchesAll (re, name)) then p else pass ({name = name, doit = doit}, p) val p = maybePass ({name = "rssaShrink1", doit = Program.shrink}, p) val p = pass ({name = "insertLimitChecks", doit = LimitCheck.insert}, p) val p = pass ({name = "insertSignalChecks", doit = SignalCheck.insert}, p) val p = pass ({name = "implementHandlers", doit = ImplementHandlers.doit}, p) val p = maybePass ({name = "rssaShrink2", doit = Program.shrink}, p) val () = Program.checkHandlers p val (p, makeProfileInfo) = pass' ({name = "implementProfiling", doit = ImplementProfiling.doit}, fn (p,_) => p, p) val p = maybePass ({name = "rssaOrderFunctions", doit = Program.orderFunctions}, p) in (p, makeProfileInfo) end val (program, makeProfileInfo) = Control.passTypeCheck {display = Control.Layouts (fn ((program, _), output) => Rssa.Program.layouts (program, output)), name = "rssaSimplify", stats = fn (program,_) => Rssa.Program.layoutStats program, style = Control.No, suffix = "rssa", thunk = fn () => rssaSimplify program, typeCheck = R.Program.typeCheck o #1} val _ = let open Control in if !keepRSSA then saveToFile ({suffix = "rssa"}, No, program, Layouts Rssa.Program.layouts) else () end val program = Control.pass {display = Control.Layouts Machine.Program.layouts, name = "toMachine", stats = fn _ => Layout.empty, style = Control.No, suffix = "machine", thunk = fn () => let val R.Program.T {functions, handlesSignals, main, objectTypes} = program (* Chunk information *) val {get = labelChunk, set = setLabelChunk, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("labelChunk", Label.layout)) val {get = funcChunk: Func.t -> Chunk.t, set = setFuncChunk, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("funcChunk", Func.layout)) val chunks = ref [] fun newChunk () = let val c = Chunk.new () val _ = List.push (chunks, c) in c end val handlers = ref [] (* Set funcChunk and labelChunk. *) val _ = Vector.foreach (Chunkify.chunkify program, fn {funcs, labels} => let val c = newChunk () val _ = Vector.foreach (funcs, fn f => setFuncChunk (f, c)) val _ = Vector.foreach (labels, fn l => setLabelChunk (l, c)) in () end) (* FrameInfo. *) local val frameLabels = ref [] val frameLayouts = ref [] val frameLayoutsCounter = Counter.new 0 val _ = IntSet.reset () val table = HashSet.new {hash = Word.fromInt o #frameOffsetsIndex} val frameOffsets: Bytes.t vector list ref = ref [] val frameOffsetsCounter = Counter.new 0 val {get = frameOffsetsIndex: IntSet.t -> int, ...} = Property.get (IntSet.plist, Property.initFun (fn offsets => let val _ = List.push (frameOffsets, QuickSort.sortVector (Vector.fromListMap (IntSet.toList offsets, Bytes.fromInt), Bytes.<=)) in Counter.next frameOffsetsCounter end)) in fun allFrameInfo () = let (* Reverse lists because the index is from back of list. *) val frameLabels = Vector.fromListRev (!frameLabels) val frameLayouts = Vector.fromListRev (!frameLayouts) val frameOffsets = Vector.fromListRev (!frameOffsets) in (frameLabels, frameLayouts, frameOffsets) end fun getFrameLayoutsIndex {isC: bool, label: Label.t, offsets: Bytes.t list, size: Bytes.t}: int = let val foi = frameOffsetsIndex (IntSet.fromList (List.map (offsets, Bytes.toInt))) fun new () = let val _ = List.push (frameLayouts, {frameOffsetsIndex = foi, isC = isC, size = size}) val _ = List.push (frameLabels, label) in Counter.next frameLayoutsCounter end in (* We need to give each frame its own layout index in two cases. * 1. If we are using the C codegen, in which case we want the * indices in a chunk to be consecutive integers so that gcc * will use a jump table. * 2. If we are profiling, we want every frame to have a * different index so that it can have its own profiling info. * This will be created by the call to makeProfileInfo at the * end of the backend. *) if !Control.codegen = Control.CCodegen orelse !Control.profile <> Control.ProfileNone then new () else #frameLayoutsIndex (HashSet.lookupOrInsert (table, Word.fromInt foi, fn {frameOffsetsIndex = foi', isC = isC', size = s', ...} => foi = foi' andalso isC = isC' andalso Bytes.equals (size, s'), fn () => {frameLayoutsIndex = new (), frameOffsetsIndex = foi, isC = isC, size = size})) end end val {get = frameInfo: Label.t -> M.FrameInfo.t option, set = setFrameInfo, ...} = Property.getSetOnce (Label.plist, Property.initConst NONE) val setFrameInfo = Trace.trace2 ("Backend.setFrameInfo", Label.layout, Option.layout M.FrameInfo.layout, Unit.layout) setFrameInfo (* The global raise operands. *) local val table: (Type.t vector * M.Live.t vector) list ref = ref [] in fun raiseOperands (ts: Type.t vector): M.Live.t vector = case List.peek (!table, fn (ts', _) => Vector.equals (ts, ts', Type.equals)) of NONE => let val gs = Vector.map (ts, fn ty => M.Live.Global (Global.new {isRoot = false, ty = ty})) val _ = List.push (table, (ts, gs)) in gs end | SOME (_, gs) => gs end val {get = varInfo: Var.t -> {operand: VarOperand.t, ty: Type.t}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("Backend.info", Var.layout)) val setVarInfo = Trace.trace2 ("Backend.setVarInfo", Var.layout, VarOperand.layout o #operand, Unit.layout) setVarInfo val varInfo = Trace.trace ("Backend.varInfo", Var.layout, fn {operand, ...} => Layout.record [("operand", VarOperand.layout operand)]) varInfo val varOperand: Var.t -> M.Operand.t = VarOperand.operand o #operand o varInfo (* Hash tables for uniquifying globals. *) local fun ('a, 'b) make (equals: 'a * 'a -> bool, info: 'a -> string * Type.t * 'b) = let val set: {a: 'a, global: M.Global.t, hash: word, value: 'b} HashSet.t = HashSet.new {hash = #hash} fun get (a: 'a): M.Operand.t = let val (string, ty, value) = info a val hash = String.hash string in M.Operand.Global (#global (HashSet.lookupOrInsert (set, hash, fn {a = a', ...} => equals (a, a'), fn () => {a = a, hash = hash, global = M.Global.new {isRoot = true, ty = ty}, value = value}))) end fun all () = HashSet.fold (set, [], fn ({global, value, ...}, ac) => (global, value) :: ac) in (all, get) end in val (allIntInfs, globalIntInf) = make (IntInf.equals, fn i => (IntInf.toString i, Type.intInf (), i)) val (allReals, globalReal) = make (RealX.equals, fn r => (RealX.toString r, Type.real (RealX.size r), r)) val (allVectors, globalVector) = make (WordXVector.equals, fn v => (WordXVector.toString v, Type.ofWordXVector v, v)) end fun bogusOp (t: Type.t): M.Operand.t = case Type.deReal t of NONE => M.Operand.Word (WordX.fromIntInf (0, WordSize.fromBits (Type.width t))) | SOME s => globalReal (RealX.zero s) fun constOperand (c: Const.t): M.Operand.t = let datatype z = datatype Const.t in case c of IntInf i => (case Const.SmallIntInf.toWord i of NONE => globalIntInf i | SOME w => M.Operand.Cast (M.Operand.Word w, Type.intInf ())) | Null => M.Operand.Null | Real r => globalReal r | Word w => M.Operand.Word w | WordVector v => globalVector v end fun parallelMove {chunk = _, dsts: M.Operand.t vector, srcs: M.Operand.t vector}: M.Statement.t vector = let val moves = Vector.fold2 (srcs, dsts, [], fn (src, dst, ac) => {src = src, dst = dst} :: ac) fun temp r = M.Operand.Register (Register.new (M.Operand.ty r, NONE)) in Vector.fromList (ParallelMove.move { equals = M.Operand.equals, move = M.Statement.move, moves = moves, interfere = M.Operand.interfere, temp = temp }) end fun runtimeOp (field: GCField.t): M.Operand.t = case field of GCField.Frontier => M.Operand.Frontier | GCField.StackTop => M.Operand.StackTop | _ => M.Operand.Offset {base = M.Operand.GCState, offset = GCField.offset field, ty = Type.ofGCField field} val exnStackOp = runtimeOp GCField.ExnStack val stackBottomOp = runtimeOp GCField.StackBottom val stackTopOp = runtimeOp GCField.StackTop fun translateOperand (oper: R.Operand.t): M.Operand.t = let datatype z = datatype R.Operand.t in case oper of ArrayOffset {base, index, offset, scale, ty} => M.Operand.ArrayOffset {base = translateOperand base, index = translateOperand index, offset = offset, scale = scale, ty = ty} | Cast (z, t) => M.Operand.Cast (translateOperand z, t) | Const c => constOperand c | EnsuresBytesFree => Error.bug "Backend.translateOperand: EnsuresBytesFree" | GCState => M.Operand.GCState | Offset {base, offset, ty} => let val base = translateOperand base in if M.Operand.isLocation base then M.Operand.Offset {base = base, offset = offset, ty = ty} else bogusOp ty end | ObjptrTycon opt => M.Operand.Word (WordX.fromIntInf (Word.toIntInf (Runtime.typeIndexToHeader (ObjptrTycon.index opt)), WordSize.objptrHeader ())) | Runtime f => runtimeOp f | Var {var, ...} => varOperand var end fun translateOperands ops = Vector.map (ops, translateOperand) fun genStatement (s: R.Statement.t, handlerLinkOffset: {handler: Bytes.t, link: Bytes.t} option) : M.Statement.t vector = let fun handlerOffset () = #handler (valOf handlerLinkOffset) fun linkOffset () = #link (valOf handlerLinkOffset) datatype z = datatype R.Statement.t in case s of Bind {dst = (var, _), isMutable, src} => if isMutable orelse (case #operand (varInfo var) of VarOperand.Const _ => false | _ => true) then (Vector.new1 (M.Statement.move {dst = varOperand var, src = translateOperand src})) else Vector.new0 () | Move {dst, src} => Vector.new1 (M.Statement.move {dst = translateOperand dst, src = translateOperand src}) | Object {dst, header, size} => M.Statement.object {dst = varOperand (#1 dst), header = header, size = size} | PrimApp {dst, prim, args} => let datatype z = datatype Prim.Name.t in case Prim.name prim of MLton_touch => Vector.new0 () | _ => Vector.new1 (M.Statement.PrimApp {args = translateOperands args, dst = Option.map (dst, varOperand o #1), prim = prim}) end | ProfileLabel s => Vector.new1 (M.Statement.ProfileLabel s) | SetExnStackLocal => (* ExnStack = stackTop + (offset + LABEL_SIZE) - StackBottom; *) let val tmp1 = M.Operand.Register (Register.new (Type.cpointer (), NONE)) val tmp2 = M.Operand.Register (Register.new (Type.csize (), NONE)) in Vector.new3 (M.Statement.PrimApp {args = (Vector.new2 (stackTopOp, M.Operand.Word (WordX.fromIntInf (Int.toIntInf (Bytes.toInt (Bytes.+ (handlerOffset (), Runtime.labelSize ()))), WordSize.cpointer ())))), dst = SOME tmp1, prim = Prim.cpointerAdd}, M.Statement.PrimApp {args = Vector.new2 (tmp1, stackBottomOp), dst = SOME tmp2, prim = Prim.cpointerDiff}, M.Statement.move {dst = exnStackOp, src = M.Operand.Cast (tmp2, Type.exnStack ())}) end | SetExnStackSlot => (* ExnStack = *(uint* )(stackTop + offset); *) Vector.new1 (M.Statement.move {dst = exnStackOp, src = M.Operand.stackOffset {offset = linkOffset (), ty = Type.exnStack ()}}) | SetHandler h => Vector.new1 (M.Statement.move {dst = M.Operand.stackOffset {offset = handlerOffset (), ty = Type.label h}, src = M.Operand.Label h}) | SetSlotExnStack => (* *(uint* )(stackTop + offset) = ExnStack; *) Vector.new1 (M.Statement.move {dst = M.Operand.stackOffset {offset = linkOffset (), ty = Type.exnStack ()}, src = exnStackOp}) | _ => Error.bug (concat ["Backend.genStatement: strange statement: ", R.Statement.toString s]) end val genStatement = Trace.trace ("Backend.genStatement", R.Statement.layout o #1, Vector.layout M.Statement.layout) genStatement val bugTransfer = fn () => M.Transfer.CCall {args = (Vector.new1 (globalVector (WordXVector.fromString "backend thought control shouldn't reach here"))), frameInfo = NONE, func = Type.BuiltInCFunction.bug (), return = NONE} val {get = labelInfo: Label.t -> {args: (Var.t * Type.t) vector}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("labelInfo", Label.layout)) val setLabelInfo = Trace.trace2 ("Backend.setLabelInfo", Label.layout, Layout.ignore, Unit.layout) setLabelInfo fun callReturnOperands (xs: 'a vector, ty: 'a -> Type.t, shift: Bytes.t): StackOffset.t vector = #1 (Vector.mapAndFold (xs, Bytes.zero, fn (x, offset) => let val ty = ty x val offset = Type.align (ty, offset) in (StackOffset.T {offset = Bytes.+ (shift, offset), ty = ty}, Bytes.+ (offset, Type.bytes ty)) end)) val operandLive: M.Operand.t -> M.Live.t = valOf o M.Live.fromOperand val operandsLive: M.Operand.t vector -> M.Live.t vector = fn ops => Vector.map (ops, operandLive) fun genFunc (f: Function.t, isMain: bool): unit = let val f = eliminateDeadCode f val {args, blocks, name, raises, returns, start, ...} = Function.dest f val raises = Option.map (raises, fn ts => raiseOperands ts) val returns = Option.map (returns, fn ts => callReturnOperands (ts, fn t => t, Bytes.zero)) val chunk = funcChunk name fun labelArgOperands (l: R.Label.t): M.Operand.t vector = Vector.map (#args (labelInfo l), varOperand o #1) fun newVarInfo (x, ty: Type.t) = let val operand = if isMain then VarOperand.Const (M.Operand.Global (M.Global.new {isRoot = true, ty = ty})) else VarOperand.Allocate {operand = ref NONE} in setVarInfo (x, {operand = operand, ty = ty}) end fun newVarInfos xts = Vector.foreach (xts, newVarInfo) (* Set the constant operands, labelInfo, and varInfo. *) val _ = newVarInfos args val _ = Rssa.Function.dfs (f, fn R.Block.T {args, label, statements, transfer, ...} => let val _ = setLabelInfo (label, {args = args}) val _ = newVarInfos args val _ = Vector.foreach (statements, fn s => let fun normal () = R.Statement.foreachDef (s, newVarInfo) in case s of R.Statement.Bind {dst = (var, _), isMutable, src} => if isMutable then normal () else let fun set (z: M.Operand.t, casts: Type.t list) = let val z = List.fold (casts, z, fn (t, z) => M.Operand.Cast (z, t)) in setVarInfo (var, {operand = VarOperand.Const z, ty = M.Operand.ty z}) end fun loop (z: R.Operand.t, casts) = case z of R.Operand.Cast (z, t) => loop (z, t :: casts) | R.Operand.Const c => set (constOperand c, casts) | R.Operand.Var {var = var', ...} => (case #operand (varInfo var') of VarOperand.Const z => set (z, casts) | VarOperand.Allocate _ => normal ()) | _ => normal () in loop (src, []) end | _ => normal () end) val _ = R.Transfer.foreachDef (transfer, newVarInfo) in fn () => () end) (* Allocate stack slots. *) local val varInfo = fn x => let val {operand, ty, ...} = varInfo x in {operand = (case operand of VarOperand.Allocate {operand, ...} => SOME operand | _ => NONE), ty = ty} end in val {handlerLinkOffset, labelInfo = labelRegInfo, ...} = let val argOperands = Vector.map (callReturnOperands (args, #2, Bytes.zero), M.Operand.StackOffset) in AllocateRegisters.allocate {argOperands = argOperands, function = f, varInfo = varInfo} end end (* Set the frameInfo for blocks in this function. *) val _ = Vector.foreach (blocks, fn R.Block.T {kind, label, ...} => let fun doit (useOffsets: bool): unit = let val {liveNoFormals, size, ...} = labelRegInfo label val offsets = if useOffsets then Vector.fold (liveNoFormals, [], fn (oper, ac) => case oper of M.Operand.StackOffset (StackOffset.T {offset, ty}) => if Type.isObjptr ty then offset :: ac else ac | _ => ac) else [] val isC = case kind of R.Kind.CReturn _ => true | _ => false val frameLayoutsIndex = getFrameLayoutsIndex {isC = isC, label = label, offsets = offsets, size = size} in setFrameInfo (label, SOME (M.FrameInfo.T {frameLayoutsIndex = frameLayoutsIndex})) end in case R.Kind.frameStyle kind of R.Kind.None => () | R.Kind.OffsetsAndSize => doit true | R.Kind.SizeOnly => doit false end) (* ------------------------------------------------- *) (* genTransfer *) (* ------------------------------------------------- *) fun genTransfer (t: R.Transfer.t, chunk: Chunk.t) : M.Statement.t vector * M.Transfer.t = let fun simple t = (Vector.new0 (), t) in case t of R.Transfer.Arith {args, dst, overflow, prim, success, ...} => simple (M.Transfer.Arith {args = translateOperands args, dst = varOperand dst, overflow = overflow, prim = prim, success = success}) | R.Transfer.CCall {args, func, return} => simple (M.Transfer.CCall {args = translateOperands args, frameInfo = (case return of NONE => NONE | SOME l => frameInfo l), func = func, return = return}) | R.Transfer.Call {func, args, return} => let datatype z = datatype R.Return.t val (contLive, frameSize, return) = case return of Dead => (Vector.new0 (), Bytes.zero, NONE) | Tail => (Vector.new0 (), Bytes.zero, NONE) | NonTail {cont, handler} => let val {liveNoFormals, size, ...} = labelRegInfo cont datatype z = datatype R.Handler.t val handler = case handler of Caller => NONE | Dead => NONE | Handle h => SOME h in (liveNoFormals, size, SOME {return = cont, handler = handler, size = size}) end val dsts = callReturnOperands (args, R.Operand.ty, frameSize) val setupArgs = parallelMove {chunk = chunk, dsts = Vector.map (dsts, M.Operand.StackOffset), srcs = translateOperands args} val live = Vector.concat [operandsLive contLive, Vector.map (dsts, Live.StackOffset)] val transfer = M.Transfer.Call {label = funcToLabel func, live = live, return = return} in (setupArgs, transfer) end | R.Transfer.Goto {dst, args} => (parallelMove {srcs = translateOperands args, dsts = labelArgOperands dst, chunk = labelChunk dst}, M.Transfer.Goto dst) | R.Transfer.Raise srcs => (M.Statement.moves {dsts = Vector.map (valOf raises, Live.toOperand), srcs = translateOperands srcs}, M.Transfer.Raise) | R.Transfer.Return xs => (parallelMove {chunk = chunk, dsts = Vector.map (valOf returns, M.Operand.StackOffset), srcs = translateOperands xs}, M.Transfer.Return) | R.Transfer.Switch switch => let val R.Switch.T {cases, default, size, test} = switch in simple (case (Vector.length cases, default) of (0, NONE) => bugTransfer () | (1, NONE) => M.Transfer.Goto (#2 (Vector.sub (cases, 0))) | (0, SOME dst) => M.Transfer.Goto dst | _ => M.Transfer.Switch (M.Switch.T {cases = cases, default = default, size = size, test = translateOperand test})) end end val genTransfer = Trace.trace ("Backend.genTransfer", R.Transfer.layout o #1, Layout.tuple2 (Vector.layout M.Statement.layout, M.Transfer.layout)) genTransfer fun genBlock (R.Block.T {args, kind, label, statements, transfer, ...}) : unit = let val _ = if Label.equals (label, start) then let val live = #live (labelRegInfo start) val returns = Option.map (returns, fn returns => Vector.map (returns, Live.StackOffset)) in Chunk.newBlock (chunk, {label = funcToLabel name, kind = M.Kind.Func, live = operandsLive live, raises = raises, returns = returns, statements = Vector.new0 (), transfer = M.Transfer.Goto start}) end else () val {live, liveNoFormals, size, ...} = labelRegInfo label val chunk = labelChunk label val statements = Vector.concatV (Vector.map (statements, fn s => genStatement (s, handlerLinkOffset))) val (preTransfer, transfer) = genTransfer (transfer, chunk) val (kind, live, pre) = case kind of R.Kind.Cont _ => let val srcs = callReturnOperands (args, #2, size) in (M.Kind.Cont {args = Vector.map (srcs, Live.StackOffset), frameInfo = valOf (frameInfo label)}, liveNoFormals, parallelMove {chunk = chunk, dsts = Vector.map (args, varOperand o #1), srcs = Vector.map (srcs, M.Operand.StackOffset)}) end | R.Kind.CReturn {func, ...} => let val dst = case Vector.length args of 0 => NONE | 1 => SOME (operandLive (varOperand (#1 (Vector.sub (args, 0))))) | _ => Error.bug "Backend.genBlock: CReturn" in (M.Kind.CReturn {dst = dst, frameInfo = frameInfo label, func = func}, liveNoFormals, Vector.new0 ()) end | R.Kind.Handler => let val _ = List.push (handlers, {chunkLabel = Chunk.label chunk, label = label}) val dsts = Vector.map (args, varOperand o #1) val handles = raiseOperands (Vector.map (dsts, M.Operand.ty)) in (M.Kind.Handler {frameInfo = valOf (frameInfo label), handles = handles}, liveNoFormals, M.Statement.moves {dsts = dsts, srcs = Vector.map (handles, Live.toOperand)}) end | R.Kind.Jump => (M.Kind.Jump, live, Vector.new0 ()) val (first, statements) = if !Control.profile = Control.ProfileTimeLabel then case (if 0 = Vector.length statements then NONE else (case Vector.sub (statements, 0) of s as M.Statement.ProfileLabel _ => SOME s | _ => NONE)) of NONE => Error.bug (concat ["Backend.genBlock: ", "missing ProfileLabel in ", Label.toString label]) | SOME s => (Vector.new1 s, Vector.dropPrefix (statements, 1)) else (Vector.new0 (), statements) val statements = Vector.concat [first, pre, statements, preTransfer] val returns = Option.map (returns, fn returns => Vector.map (returns, Live.StackOffset)) in Chunk.newBlock (chunk, {kind = kind, label = label, live = operandsLive live, raises = raises, returns = returns, statements = statements, transfer = transfer}) end val genBlock = traceGenBlock genBlock val _ = Vector.foreach (blocks, genBlock) val _ = if isMain then () else Vector.foreach (blocks, R.Block.clear) in () end val genFunc = Trace.trace2 ("Backend.genFunc", Func.layout o Function.name, Bool.layout, Unit.layout) genFunc (* Generate the main function first. * Need to do this in order to set globals. *) val _ = genFunc (main, true) val _ = List.foreach (functions, fn f => genFunc (f, false)) val chunks = !chunks fun chunkToMachine (Chunk.T {chunkLabel, blocks}) = let val blocks = Vector.fromList (!blocks) val regMax = CType.memo (fn _ => ref ~1) val regsNeedingIndex = Vector.fold (blocks, [], fn (b, ac) => M.Block.foldDefs (b, ac, fn (z, ac) => case z of M.Operand.Register r => (case Register.indexOpt r of NONE => r :: ac | SOME i => let val z = regMax (Type.toCType (Register.ty r)) val _ = if i > !z then z := i else () in ac end) | _ => ac)) val _ = List.foreach (regsNeedingIndex, fn r => let val z = regMax (Type.toCType (Register.ty r)) val i = 1 + !z val _ = z := i val _ = Register.setIndex (r, i) in () end) in Machine.Chunk.T {chunkLabel = chunkLabel, blocks = blocks, regMax = ! o regMax} end val mainName = R.Function.name main val main = {chunkLabel = Chunk.label (funcChunk mainName), label = funcToLabel mainName} val chunks = List.revMap (chunks, chunkToMachine) (* The clear is necessary because properties have been attached to Funcs * and Labels, and they appear as labels in the resulting program. *) val _ = List.foreach (chunks, fn M.Chunk.T {blocks, ...} => Vector.foreach (blocks, Label.clear o M.Block.label)) val (frameLabels, frameLayouts, frameOffsets) = allFrameInfo () val maxFrameSize: Bytes.t = List.fold (chunks, Bytes.zero, fn (M.Chunk.T {blocks, ...}, max) => Vector.fold (blocks, max, fn (M.Block.T {kind, statements, transfer, ...}, max) => let fun doOperand (z: M.Operand.t, max: Bytes.t): Bytes.t = let datatype z = datatype M.Operand.t in case z of ArrayOffset {base, index, ...} => doOperand (base, doOperand (index, max)) | Cast (z, _) => doOperand (z, max) | Contents {oper, ...} => doOperand (oper, max) | Offset {base, ...} => doOperand (base, max) | StackOffset (StackOffset.T {offset, ty}) => Bytes.max (Bytes.+ (offset, Type.bytes ty), max) | _ => max end val max = case M.Kind.frameInfoOpt kind of NONE => max | SOME (M.FrameInfo.T {frameLayoutsIndex, ...}) => Bytes.max (max, #size (Vector.sub (frameLayouts, frameLayoutsIndex))) val max = Vector.fold (statements, max, fn (s, max) => M.Statement.foldOperands (s, max, doOperand)) val max = M.Transfer.foldOperands (transfer, max, doOperand) in max end)) val maxFrameSize = Bytes.alignWord32 maxFrameSize val profileInfo = makeProfileInfo {frames = frameLabels} in Machine.Program.T {chunks = chunks, frameLayouts = frameLayouts, frameOffsets = frameOffsets, handlesSignals = handlesSignals, intInfs = allIntInfs (), main = main, maxFrameSize = maxFrameSize, objectTypes = objectTypes, profileInfo = profileInfo, reals = allReals (), vectors = allVectors ()} end} in program end end mlton-20100608/mlton/backend/backend.sig0000644000076600000240000000127311404435623016377 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BACKEND_STRUCTS = sig structure Machine: MACHINE structure Ssa: SSA2 sharing Machine.Atoms = Ssa.Atoms val funcToLabel: Ssa.Func.t -> Machine.Label.t end signature BACKEND = sig include BACKEND_STRUCTS val toMachine: Ssa.Program.t * {codegenImplementsPrim: Machine.Type.t Machine.Prim.t -> bool} -> Machine.Program.t end mlton-20100608/mlton/backend/chunkify.fun0000644000076600000240000002175411404435623016644 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Chunkify (S: CHUNKIFY_STRUCTS): CHUNKIFY = struct open S datatype z = datatype Transfer.t (* A chunkifier that puts each function in its own chunk. *) fun chunkPerFunc (Program.T {functions, main, ...}) = Vector.fromListMap (main :: functions, fn f => let val {name, blocks, ...} = Function.dest f in {funcs = Vector.new1 name, labels = Vector.map (blocks, Block.label)} end) (* A simple chunkifier that puts all code in the same chunk. *) fun oneChunk (Program.T {functions, main, ...}) = let val functions = main :: functions in Vector.new1 {funcs = Vector.fromListMap (functions, Function.name), labels = Vector.concatV (Vector.fromListMap (functions, fn f => Vector.map (Function.blocks f, Block.label)))} end fun blockSize (Block.T {statements, transfer, ...}): int = let val transferSize = case transfer of Switch (Switch.T {cases, ...}) => 1 + Vector.length cases | _ => 1 val statementsSize = if !Control.profile = Control.ProfileNone then Vector.length statements else Vector.fold (statements, 0, fn (s, ac) => case s of Statement.ProfileLabel _ => ac | _ => 1 + ac) in statementsSize + transferSize end (* Compute the list of functions that each function returns to *) fun returnsTo (Program.T {functions, main, ...}) = let val functions = main :: functions val {get: Func.t -> {returnsTo: Label.t list ref, tailCalls: Func.t list ref}, rem, ...} = Property.get (Func.plist, Property.initFun (fn _ => {returnsTo = ref [], tailCalls = ref []})) fun returnTo (f: Func.t, j: Label.t): unit = let val {returnsTo, tailCalls} = get f in if List.exists (!returnsTo, fn j' => Label.equals (j, j')) then () else (List.push (returnsTo, j) ; List.foreach (!tailCalls, fn f => returnTo (f, j))) end fun tailCall (from: Func.t, to: Func.t): unit = let val {returnsTo, tailCalls} = get from in if List.exists (!tailCalls, fn f => Func.equals (to, f)) then () else (List.push (tailCalls, to) ; List.foreach (!returnsTo, fn j => returnTo (to, j))) end val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, return, ...} => (case return of Return.NonTail {cont, ...} => returnTo (func, cont) | _ => tailCall (name, func)) | _ => ()) end) in {rem = rem, returnsTo = ! o #returnsTo o get} end structure Graph = EquivalenceGraph structure Class = Graph.Class fun coalesce (program as Program.T {functions, main, ...}, limit) = let val functions = main :: functions val graph = Graph.new () val {get = funcClass: Func.t -> Class.t, set = setFuncClass, rem = remFuncClass, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("class", Func.layout)) val {get = labelClass: Label.t -> Class.t, set = setLabelClass, rem = remLabelClass, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("class", Label.layout)) (* Build the initial partition. * Ensure that all Ssa labels that jump to one another are in the same * equivalence class. *) val _ = List.foreach (functions, fn f => let val {name, blocks, start, ...} = Function.dest f val _ = Vector.foreach (blocks, fn b as Block.T {label, ...} => setLabelClass (label, Graph.newClass (graph, {size = blockSize b}))) val _ = setFuncClass (name, labelClass start) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val c = labelClass label fun same (j: Label.t): unit = Graph.== (graph, c, labelClass j) in case transfer of Arith {overflow, success, ...} => (same overflow; same success) | CCall {return, ...} => Option.app (return, same) | Goto {dst, ...} => same dst | Switch s => Switch.foreachLabel (s, same) | _ => () end) in () end) val {returnsTo, rem = remReturnsTo} = returnsTo program (* Add edges, and then coalesce the graph. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val returnsTo = List.revMap (returnsTo name, labelClass) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => case transfer of Call {func, ...} => Graph.addEdge (graph, labelClass label, funcClass func) | Return _ => let val from = labelClass label in List.foreach (returnsTo, fn c => Graph.addEdge (graph, from, c)) end | _ => ()) in () end) val _ = if limit = 0 then () else Graph.coarsen (graph, {maxClassSize = limit}) type chunk = {funcs: Func.t list ref, labels: Label.t list ref} val chunks: chunk list ref = ref [] val {get = classChunk: Class.t -> chunk, ...} = Property.get (Class.plist, Property.initFun (fn _ => let val c = {funcs = ref [], labels = ref []} val _ = List.push (chunks, c) in c end)) val _ = let fun 'a new (l: 'a, get: 'a -> Class.t, sel: chunk -> 'a list ref): unit = List.push (sel (classChunk (get l)), l) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val _ = new (name, funcClass, #funcs) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => new (label, labelClass, #labels)) in () end) in () end val _ = List.foreach (functions, fn f => let val {blocks, name, ...} = Function.dest f val _ = remFuncClass name val _ = remReturnsTo name val _ = Vector.foreach (blocks, remLabelClass o Block.label) in () end) in Vector.fromListMap (!chunks, fn {funcs, labels} => {funcs = Vector.fromList (!funcs), labels = Vector.fromList (!labels)}) end fun chunkify p = case !Control.chunk of Control.ChunkPerFunc => chunkPerFunc p | Control.OneChunk => oneChunk p | Control.Coalesce {limit} => coalesce (p, limit) val chunkify = fn p => let val chunks = chunkify p val _ = Control.diagnostics (fn display => let open Layout val _ = display (str "Chunkification:") val _ = Vector.foreach (chunks, fn {funcs, labels} => display (record ([("funcs", Vector.layout Func.layout funcs), ("jumps", Vector.layout Label.layout labels)]))) in () end) in chunks end end mlton-20100608/mlton/backend/chunkify.sig0000644000076600000240000000156311404435623016632 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CHUNKIFY_STRUCTS = sig include RSSA end signature CHUNKIFY = sig include CHUNKIFY_STRUCTS (* Partitions all the labels declared into disjoint sets, referred * to as chunks. Returns the list of chunks. * All funcs, conts, and handlers are assumed to be entry points. * All conts and handlers are assumed to be return points. *) val chunkify: Program.t -> { funcs: Func.t vector, labels: Label.t vector } vector end mlton-20100608/mlton/backend/equivalence-graph.fun0000644000076600000240000000577111404435623020425 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor EquivalenceGraph (S: EQUIVALENCE_GRAPH_STRUCTS): EQUIVALENCE_GRAPH = struct open S structure Set = DisjointSet structure Plist = PropertyList structure Class = struct datatype t = T of {plist: Plist.t, size: int ref} Set.t local fun make sel (T s) = sel (Set.! s) in val plist = make #plist val size = make (! o #size) end fun setSize (T s, n) = #size (Set.! s) := n fun new (size: int): t = T (Set.singleton {plist = Plist.new (), size = ref size}) fun == (c as T s, T s') = if Set.equals (s, s') then () else let val {size = ref n, ...} = Set.! s val {size = ref n', ...} = Set.! s' in Set.union (s, s') ; setSize (c, n + n') end end datatype t = T of {classes: Class.t list ref, edges: (Class.t * Class.t) list ref} fun new () = T {classes = ref [], edges = ref []} fun newClass (T {classes, ...}, {size}) = let val c = Class.new size val _ = List.push (classes, c) in c end fun addEdge (T {edges, ...}, c, c') = List.push (edges, (c, c')) fun == (_, c, c') = Class.== (c, c') fun coarsen (T {classes, edges, ...}, {maxClassSize}) = let (* Combine classes with an edge between them where possible. *) val _ = List.foreach (!edges, fn (c, c') => if Class.size c + Class.size c' <= maxClassSize then Class.== (c, c') else ()) (* Get a list of all classes without duplicates. *) val {get, ...} = Property.get (Class.plist, Property.initFun (fn _ => ref false)) val classes = List.fold (!classes, [], fn (class, ac) => let val r = get class in if !r then ac else (r := true ; class :: ac) end) (* Sort classes in decreasing order of size. *) val classes = QuickSort.sortList (classes, fn (c, c') => Class.size c >= Class.size c') (* Combine classes where possible. *) fun loop (cs: Class.t list): unit = case cs of [] => () | c :: cs => loop (rev (List.fold (cs, [], fn (c', ac) => if Class.size c + Class.size c' <= maxClassSize then (Class.== (c, c') ; ac) else c' :: ac))) val _ = loop classes in () end end structure EquivalenceGraph = EquivalenceGraph () mlton-20100608/mlton/backend/equivalence-graph.sig0000644000076600000240000000361111404435623020406 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature EQUIVALENCE_GRAPH_STRUCTS = sig end (* An equivalence graph is an equivalence relation with a weight function on * classes and an edge relation between classes. * * The main operation is coarsen, which takes an equivalence graph and coarsens * the equivalence relation so that the class weights are as large as possible * subject to a constraint. *) signature EQUIVALENCE_GRAPH = sig include EQUIVALENCE_GRAPH_STRUCTS structure Class: sig (* The type of equivalence classes. *) type t val plist: t -> PropertyList.t end (* The type of equivalence graphs. *) type t (* Make two classes equivalent. * The size of the resulting class is the sum of the sizes of the original * two classes. This is a no-op if the classes are already equivalent. *) val == : t * Class.t * Class.t -> unit (* Add a new edge between two classes. *) val addEdge: t * Class.t * Class.t -> unit (* Make the equivalence relation as coarse as possible so that the * number of edges between classes is minimized, subject to the constraint * that the sum of the node sizes in an equivalence class is * <= maxClassSize. Classes for which this constraint was violated by * previous calls to == should not be made coarser. *) val coarsen: t * {maxClassSize: int} -> unit (* Return a new relation. *) val new: unit -> t (* newClass (g, {classSize}) adds a new class to the equivalence graph. *) val newClass: t * {size: int} -> Class.t end mlton-20100608/mlton/backend/err.sml0000644000076600000240000000250311404435623015606 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Err = struct datatype t = T of {inner: t option, name: string, obj: Layout.t} fun layout (T {inner, name, obj}): Layout.t = let open Layout in align [case inner of NONE => empty | SOME e => layout e, seq [str (concat ["invalid ", name, ": "]), obj]] end exception E of t fun check' (name: string, ok: unit -> 'a option, layout: unit -> Layout.t): 'a = case ok () handle E e => raise E (T {inner = SOME e, name = name, obj = layout ()}) of NONE => raise E (T {inner = NONE, name = name, obj = layout ()}) | SOME a => a fun boolToUnitOpt b = if b then SOME () else NONE fun check (name, ok, layout) = check' (name, boolToUnitOpt o ok, layout) end mlton-20100608/mlton/backend/implement-handlers.fun0000644000076600000240000001743511404435623020615 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ImplementHandlers (S: IMPLEMENT_HANDLERS_STRUCTS): IMPLEMENT_HANDLERS = struct open S open Rssa datatype z = datatype Statement.t datatype z = datatype Transfer.t structure Function = struct open Function fun hasHandler (f: t): bool = let val {blocks, ...} = dest f in Vector.exists (blocks, fn Block.T {transfer, ...} => case transfer of Transfer.Call {return = (Return.NonTail {handler = Handler.Handle _, ...}), ...} => true | _ => false) end end structure HandlerLat = FlatLattice (structure Point = Label) structure ExnStack = struct local structure ZPoint = struct datatype t = Local | Slot val equals: t * t -> bool = op = val toString = fn Local => "Local" | Slot => "Slot" val layout = Layout.str o toString end structure L = FlatLattice (structure Point = ZPoint) in open L structure Point = ZPoint val locall = point Point.Local val slot = point Point.Slot end end fun flow (f: Function.t): Function.t = if not (Function.hasHandler f) then f else let val debug = false val {args, blocks, name, raises, returns, start} = Function.dest f val {get = labelInfo: Label.t -> {global: ExnStack.t, handler: HandlerLat.t}, rem, ...} = Property.get (Label.plist, Property.initFun (fn _ => {global = ExnStack.new (), handler = HandlerLat.new ()})) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val {global, handler} = labelInfo label val _ = if Label.equals (label, start) then let val _ = ExnStack.<= (ExnStack.slot, global) val _ = HandlerLat.forceTop handler in () end else () fun goto' {global = g, handler = h}: unit = let val _ = ExnStack.<= (global, g) val _ = HandlerLat.<= (handler, h) in () end val goto = goto' o labelInfo in case transfer of Call {return, ...} => (case return of Return.Dead => () | Return.NonTail {cont, handler = h} => let val li as {global = g', handler = h'} = labelInfo cont in case h of Handler.Caller => let val _ = ExnStack.<= (ExnStack.slot, g') val _ = HandlerLat.<= (handler, h') in () end | Handler.Dead => goto' li | Handler.Handle l => let fun doit {global = g'', handler = h''} = let val _ = ExnStack.<= (ExnStack.locall, g'') val _ = HandlerLat.<= (HandlerLat.point l, h'') in () end in doit (labelInfo l) ; doit li end end | Return.Tail => ()) | _ => Transfer.foreachLabel (transfer, goto) end) val _ = if debug then Layout.outputl (Vector.layout (fn Block.T {label, ...} => let val {global, handler} = labelInfo label in Layout.record [("label", Label.layout label), ("global", ExnStack.layout global), ("handler", HandlerLat.layout handler)] end) blocks, Out.error) else () val blocks = Vector.map (blocks, fn Block.T {args, kind, label, statements, transfer} => let val {global, handler} = labelInfo label fun setExnStackSlot () = if ExnStack.isPointEq (global, ExnStack.Point.Slot) then Vector.new0 () else Vector.new1 SetExnStackSlot fun setExnStackLocal () = if ExnStack.isPointEq (global, ExnStack.Point.Local) then Vector.new0 () else Vector.new1 SetExnStackLocal fun setHandler (l: Label.t) = if HandlerLat.isPointEq (handler, l) then Vector.new0 () else Vector.new1 (SetHandler l) val post = case transfer of Call {return, ...} => (case return of Return.Dead => Vector.new0 () | Return.NonTail {handler, ...} => (case handler of Handler.Caller => setExnStackSlot () | Handler.Dead => Vector.new0 () | Handler.Handle l => Vector.concat [setHandler l, setExnStackLocal ()]) | Return.Tail => setExnStackSlot ()) | Raise _ => setExnStackSlot () | Return _ => setExnStackSlot () | _ => Vector.new0 () val statements = Vector.concat [statements, post] in Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer} end) val newStart = Label.newNoname () val startBlock = Block.T {args = Vector.new0 (), kind = Kind.Jump, label = newStart, statements = Vector.new1 SetSlotExnStack, transfer = Goto {args = Vector.new0 (), dst = start}} val blocks = Vector.concat [blocks, Vector.new1 startBlock] val () = Vector.foreach (blocks, rem o Block.label) in Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = newStart} end fun doit (Program.T {functions, handlesSignals, main, objectTypes}) = Program.T {functions = List.revMap (functions, flow), handlesSignals = handlesSignals, main = flow main, objectTypes = objectTypes} end mlton-20100608/mlton/backend/implement-handlers.sig0000644000076600000240000000072611404435623020602 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature IMPLEMENT_HANDLERS_STRUCTS = sig structure Rssa: RSSA end signature IMPLEMENT_HANDLERS = sig include IMPLEMENT_HANDLERS_STRUCTS val doit: Rssa.Program.t -> Rssa.Program.t end mlton-20100608/mlton/backend/implement-profiling.fun0000644000076600000240000012323711404435623021004 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ImplementProfiling (S: IMPLEMENT_PROFILING_STRUCTS): IMPLEMENT_PROFILING = struct open S open Rssa structure CFunction = struct open CFunction structure CType = struct open CType val gcState = cpointer end local fun make {args, name, prototype} = T {args = args, bytesNeeded = NONE, convention = Convention.Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = false, prototype = (prototype, NONE), readsStackTop = true, return = Type.unit, symbolScope = SymbolScope.Private, target = Target.Direct name, writesStackTop = false} in val profileEnter = fn () => make {args = Vector.new1 (Type.gcState ()), name = "GC_profileEnter", prototype = Vector.new1 CType.gcState} val profileInc = fn () => make {args = Vector.new2 (Type.gcState (), Type.csize ()), name = "GC_profileInc", prototype = Vector.new2 (CType.gcState, CType.csize ())} val profileLeave = fn () => make {args = Vector.new1 (Type.gcState ()), name = "GC_profileLeave", prototype = Vector.new1 CType.gcState} end end type sourceSeq = int list structure InfoNode = struct datatype t = T of {info: SourceInfo.t, nameIndex: int, sourcesIndex: int, successors: t list ref} local fun make f (T r) = f r in val info = make #info val sourcesIndex = make #sourcesIndex end fun layout (T {info, ...}) = Layout.record [("info", SourceInfo.layout info)] fun equals (n: t, n': t): bool = SourceInfo.equals (info n, info n') fun call {from = T {successors, ...}, to as T {info = i', ...}} = if let open SourceInfo in equals (i', gc) orelse equals (i', main) orelse equals (i', unknown) end orelse List.exists (!successors, fn n => equals (n, to)) then () else List.push (successors, to) val call = Trace.trace ("Profile.InfoNode.call", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) call end structure FuncInfo = struct datatype t = T of {callers: InfoNode.t list ref, enters: InfoNode.t list ref, seen: bool ref, tailCalls: t list ref} fun new () = T {callers = ref [], enters = ref [], seen = ref false, tailCalls = ref []} end structure Push = struct datatype t = Enter of InfoNode.t | Skip of SourceInfo.t fun layout z = let open Layout in case z of Enter n => seq [str "Enter ", InfoNode.layout n] | Skip i => seq [str "Skip ", SourceInfo.layout i] end fun toSources (ps: t list): int list = List.fold (rev ps, [], fn (p, ac) => case p of Enter (InfoNode.T {sourcesIndex, ...}) => sourcesIndex :: ac | Skip _ => ac) end val traceEnter = Trace.trace2 ("Profile.enter", List.layout Push.layout, SourceInfo.layout, Layout.tuple2 (List.layout Push.layout, Bool.layout)) fun doit program = if !Control.profile = Control.ProfileNone then (program, fn _ => NONE) else let val Program.T {functions, handlesSignals, main, objectTypes} = program val debug = false datatype z = datatype Control.profile val profile = !Control.profile val profileStack: bool = !Control.profileStack val needProfileLabels: bool = profile = ProfileTimeLabel orelse profile = ProfileLabel val needCodeCoverage: bool = needProfileLabels orelse (profile = ProfileTimeField) val frameProfileIndices: (Label.t * int) list ref = ref [] val infoNodes: InfoNode.t list ref = ref [] val nameCounter = Counter.new 0 val names: string list ref = ref [] local val sourceCounter = Counter.new 0 val sep = if profile = ProfileCallStack then " " else "\t" val {get = nameIndex, ...} = Property.get (SourceInfo.plist, Property.initFun (fn si => (List.push (names, SourceInfo.toString' (si, sep)) ; Counter.next nameCounter))) in fun sourceInfoNode (si: SourceInfo.t) = let val infoNode = InfoNode.T {info = si, nameIndex = nameIndex si, sourcesIndex = Counter.next sourceCounter, successors = ref []} val _ = List.push (infoNodes, infoNode) in infoNode end end fun firstEnter (ps: Push.t list): InfoNode.t option = List.peekMap (ps, fn p => case p of Push.Enter n => SOME n | _ => NONE) (* unknown must be 0, which == SOURCES_INDEX_UNKNOWN from gc.h *) val unknownInfoNode = sourceInfoNode SourceInfo.unknown (* gc must be 1 which == SOURCES_INDEX_GC from gc.h *) val gcInfoNode = sourceInfoNode SourceInfo.gc val mainInfoNode = sourceInfoNode SourceInfo.main fun wantedSource (si: SourceInfo.t): bool = if SourceInfo.isC si then List.length (!Control.profileC) > 0 else (case SourceInfo.file si of NONE => true | SOME file => List.foldr (!Control.profileInclExcl, true, fn ((re, keep), b) => if Regexp.Compiled.matchesAll (re, file) then keep else b)) val wantedSource = Trace.trace ("Profile.wantedSource", SourceInfo.layout, Bool.layout) wantedSource fun wantedCSource (si: SourceInfo.t): bool = wantedSource si andalso if SourceInfo.isC si then false else (case SourceInfo.file si of NONE => false | SOME file => List.foldr (!Control.profileC, false, fn (re, b) => if Regexp.Compiled.matchesAll (re, file) then true else b)) val wantedCSource = Trace.trace ("Profile.wantedCSource", SourceInfo.layout, Bool.layout) wantedCSource fun keepSource (si: SourceInfo.t): bool = profile <> ProfileCount orelse wantedSource si val keepSource = Trace.trace ("Profile.keepSource", SourceInfo.layout, Bool.layout) keepSource (* With -profile count, we want to get zero counts for all functions, * whether or not they made it into the final executable. *) val () = case profile of ProfileCount => List.foreach (SourceInfo.all (), fn si => if wantedSource si then ignore (sourceInfoNode si) else ()) | _ => () val sourceInfoNode = fn si => let open SourceInfo in if equals (si, unknown) then unknownInfoNode else if equals (si, gc) then gcInfoNode else if equals (si, main) then mainInfoNode else sourceInfoNode si end val sourceInfoNode = Trace.trace ("Profile.sourceInfoNode", SourceInfo.layout, InfoNode.layout) sourceInfoNode local val table: {hash: word, index: int, sourceSeq: int vector} HashSet.t = HashSet.new {hash = #hash} val c = Counter.new 0 val sourceSeqs: int vector list ref = ref [] in fun sourceSeqIndex (s: sourceSeq): int = let val s = Vector.fromListRev s val hash = Vector.fold (s, 0w0, fn (i, w) => w * 0w31 + Word.fromInt i) in #index (HashSet.lookupOrInsert (table, hash, fn {sourceSeq = s', ...} => s = s', fn () => let val _ = List.push (sourceSeqs, s) in {hash = hash, index = Counter.next c, sourceSeq = s} end)) end fun makeSourceSeqs () = Vector.fromListRev (!sourceSeqs) end (* Ensure that [SourceInfo.unknown] is index 0. *) val _ = sourceSeqIndex [InfoNode.sourcesIndex unknownInfoNode] (* Ensure that [SourceInfo.gc] is index 1. *) val _ = sourceSeqIndex [InfoNode.sourcesIndex gcInfoNode] fun addFrameProfileIndex (label: Label.t, index: int): unit = List.push (frameProfileIndices, (label, index)) fun addFrameProfilePushes (label: Label.t, pushes: Push.t list): unit = addFrameProfileIndex (label, sourceSeqIndex (Push.toSources pushes)) val {get = labelInfo: Label.t -> {block: Block.t, visited1: bool ref, visited2: bool ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val labels = ref [] fun profileLabelFromIndex (sourceSeqsIndex: int): Statement.t = let val l = ProfileLabel.new () val _ = List.push (labels, {label = l, sourceSeqsIndex = sourceSeqsIndex}) in Statement.ProfileLabel l end fun setCurSourceSeqsIndexFromIndex (sourceSeqsIndex: int): Statement.t = let val curSourceSeqsIndex = Operand.Runtime Runtime.GCField.CurSourceSeqsIndex in Statement.Move {dst = curSourceSeqsIndex, src = Operand.word (WordX.fromIntInf (IntInf.fromInt sourceSeqsIndex, WordSize.word32))} end fun codeCoverageStatementFromIndex (sourceSeqsIndex: int): Statement.t = if needProfileLabels then profileLabelFromIndex sourceSeqsIndex else if profile = ProfileTimeField then setCurSourceSeqsIndexFromIndex sourceSeqsIndex else Error.bug "Profile.codeCoverageStatement" fun codeCoverageStatement (sourceSeq: int list): Statement.t = codeCoverageStatementFromIndex (sourceSeqIndex sourceSeq) local val {get: Func.t -> FuncInfo.t, ...} = Property.get (Func.plist, Property.initFun (fn _ => FuncInfo.new ())) in val funcInfo = get fun addFuncEdges () = (* Don't need to add edges for main because no one calls it. *) List.foreach (functions, fn f => let val allSeen: bool ref list ref = ref [] val func = Function.name f val fi as FuncInfo.T {callers, ...} = get func (* Add edges from all the callers to the enters in f and all * functions that f tail calls. *) fun call (FuncInfo.T {enters, seen, tailCalls, ...}): unit = if !seen then () else let val _ = seen := true val _ = List.push (allSeen, seen) val _ = List.foreach (!callers, fn from => List.foreach (!enters, fn to => InfoNode.call {from = from, to = to})) in List.foreach (!tailCalls, call) end val _ = call fi val _ = List.foreach (!allSeen, fn r => r := false) in () end) end fun doFunction (f: Function.t): Function.t = let val {args, blocks, name, raises, returns, start} = Function.dest f val _ = if not debug then () else print (concat ["doFunction ", Func.toString name, "\n"]) val FuncInfo.T {enters, tailCalls, ...} = funcInfo name fun enter (ps: Push.t list, si: SourceInfo.t): Push.t list * bool = let val node = Promise.lazy (fn () => sourceInfoNode si) fun yes () = (Push.Enter (node ()) :: ps, true) fun no () = (Push.Skip si :: ps, false) in if SourceInfo.equals (si, SourceInfo.unknown) then no () else case firstEnter ps of NONE => if keepSource si then (List.push (enters, node ()) ; yes ()) else no () | SOME (node' as InfoNode.T {info = si', ...}) => (* * si : callee * si' : caller *) if keepSource si andalso let open SourceInfo in equals (si', unknown) orelse (wantedSource si andalso not (equals (si, gcArrayAllocate)) andalso (not (isC si) orelse (wantedCSource si' andalso not (equals (si', main))))) end then (InfoNode.call {from = node', to = node ()} ; yes ()) else no () end val enter = traceEnter enter val _ = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelInfo (label, {block = block, visited1 = ref false, visited2 = ref false})) (* Find the first Enter statement and (conceptually) move it to the * front of the function. *) local exception Yes of Label.t * Statement.t fun goto l = let val {block, visited1, ...} = labelInfo l in if !visited1 then () else let val () = visited1 := true val Block.T {statements, transfer, ...} = block val () = Vector.foreach (statements, fn s => case s of Statement.Profile (ProfileExp.Enter _) => raise Yes (l, s) | _ => ()) val () = Transfer.foreachLabel (transfer, goto) in () end end in val first = (goto start; NONE) handle Yes z => SOME z end val blocks = ref [] datatype z = datatype Statement.t datatype z = datatype ProfileExp.t fun backward {args, kind, label, leaves, sourceSeq: int list, statements: Statement.t list, transfer: Transfer.t}: unit = let val (_, ncc, sourceSeq, statements) = List.fold (statements, (leaves, true, sourceSeq, []), fn (s, (leaves, ncc, sourceSeq, ss)) => case s of Object _ => (leaves, true, sourceSeq, s :: ss) | Profile ps => let val (ncc, ss) = if needCodeCoverage then if ncc andalso not (List.isEmpty sourceSeq) then (false, codeCoverageStatement sourceSeq :: ss) else (true, ss) else (false, ss) val (leaves, sourceSeq) = case ps of Enter _ => (case sourceSeq of [] => Error.bug "Profile.backward: unmatched Enter" | _ :: sis => (leaves, sis)) | Leave _ => (case leaves of [] => Error.bug "Profile.backward: missing Leave" | infoNode :: leaves => (leaves, InfoNode.sourcesIndex infoNode :: sourceSeq)) in (leaves, ncc, sourceSeq, ss) end | _ => (leaves, true, sourceSeq, s :: ss)) val statements = if needCodeCoverage andalso ncc then codeCoverageStatement sourceSeq :: statements else statements val {args, kind, label} = if profileStack andalso (case kind of Kind.Cont _ => true | Kind.Handler => true | _ => false) then let val func = CFunction.profileLeave () val newLabel = Label.newNoname () val _ = addFrameProfileIndex (newLabel, sourceSeqIndex sourceSeq) val statements = if needCodeCoverage then (Vector.new1 (codeCoverageStatement sourceSeq)) else Vector.new0 () val _ = List.push (blocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = Transfer.CCall {args = Vector.new1 Operand.GCState, func = func, return = SOME newLabel}}) in {args = Vector.new0 (), kind = Kind.CReturn {func = func}, label = newLabel} end else {args = args, kind = kind, label = label} in List.push (blocks, Block.T {args = args, kind = kind, label = label, statements = Vector.fromList statements, transfer = transfer}) end val backward = Trace.trace ("Profile.backward", fn {leaves, statements, sourceSeq, ...} => let open Layout in record [("leaves", List.layout InfoNode.layout leaves), ("sourceSeq", List.layout Int.layout sourceSeq), ("statements", List.layout Statement.layout statements)] end, Unit.layout) backward fun profileEnter (pushes: Push.t list, transfer: Transfer.t): Transfer.t = let val func = CFunction.profileEnter () val newLabel = Label.newNoname () val index = sourceSeqIndex (Push.toSources pushes) val _ = addFrameProfileIndex (newLabel, index) val statements = if needCodeCoverage then Vector.new1 (codeCoverageStatementFromIndex index) else Vector.new0 () val _ = List.push (blocks, Block.T {args = Vector.new0 (), kind = Kind.CReturn {func = func}, label = newLabel, statements = statements, transfer = transfer}) in Transfer.CCall {args = Vector.new1 Operand.GCState, func = func, return = SOME newLabel} end fun goto (l: Label.t, pushes: Push.t list): unit = let val _ = if not debug then () else let open Layout in outputl (seq [str "goto (", Label.layout l, str ", ", List.layout Push.layout pushes, str ")"], Out.error) end val {block, visited2, ...} = labelInfo l in if !visited2 then () else let val _ = visited2 := true val Block.T {args, kind, label, statements, transfer, ...} = block val statements = case first of NONE => statements | SOME (firstLabel, firstEnter) => if Label.equals (label, firstLabel) then Vector.removeFirst (statements, fn s => case s of Profile (Enter _) => true | _ => false) else if Label.equals (label, start) then Vector.concat [Vector.new1 firstEnter, statements] else statements val _ = let fun add pushes = addFrameProfilePushes (label, pushes) datatype z = datatype Kind.t in case kind of Cont _ => add pushes | CReturn {func, ...} => let datatype z = datatype CFunction.Target.t val target = CFunction.target func fun doit si = add (#1 (enter (pushes, si))) in case target of Direct "GC_collect" => doit SourceInfo.gc | Direct "GC_arrayAllocate" => doit SourceInfo.gcArrayAllocate | Direct "MLton_bug" => add pushes | Direct name => doit (SourceInfo.fromC name) | Indirect => doit (SourceInfo.fromC "") end | Handler => add pushes | Jump => () end fun maybeSplit {args, bytesAllocated: Bytes.t, kind, label, leaves, pushes: Push.t list, shouldSplit: bool, statements} = if not shouldSplit then {args = args, bytesAllocated = Bytes.zero, kind = kind, label = label, leaves = leaves, statements = statements} else let val newLabel = Label.newNoname () val _ = addFrameProfilePushes (newLabel, pushes) val func = CFunction.profileInc () val amount = case profile of ProfileAlloc => Bytes.toInt bytesAllocated | ProfileCount => 1 | _ => Error.bug "Profile.maybeSplit: amount" val transfer = Transfer.CCall {args = (Vector.new2 (Operand.GCState, Operand.word (WordX.fromIntInf (IntInf.fromInt amount, WordSize.csize ())))), func = func, return = SOME newLabel} val sourceSeq = Push.toSources pushes val _ = backward {args = args, kind = kind, label = label, leaves = leaves, sourceSeq = sourceSeq, statements = statements, transfer = transfer} in {args = Vector.new0 (), bytesAllocated = Bytes.zero, kind = Kind.CReturn {func = func}, label = newLabel, leaves = [], statements = []} end val {args, bytesAllocated, kind, label, leaves, pushes, statements} = Vector.fold (statements, {args = args, bytesAllocated = Bytes.zero, kind = kind, label = label, leaves = [], pushes = pushes, statements = []}, fn (s, {args, bytesAllocated, kind, label, leaves, pushes: Push.t list, statements}) => (if not debug then () else let open Layout in outputl (seq [List.layout Push.layout pushes, str " ", Statement.layout s], Out.error) end ; case s of Object {size, ...} => {args = args, bytesAllocated = Bytes.+ (bytesAllocated, size), kind = kind, label = label, leaves = leaves, pushes = pushes, statements = s :: statements} | Profile ps => let val shouldSplit = profile = ProfileAlloc andalso Bytes.> (bytesAllocated, Bytes.zero) val {args, bytesAllocated, kind, label, leaves, statements} = maybeSplit {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, shouldSplit = shouldSplit, statements = statements} datatype z = datatype ProfileExp.t val (pushes, keep, leaves) = case ps of Enter si => let val (pushes, keep) = enter (pushes, si) in (pushes, keep, leaves) end | Leave si => (case pushes of [] => Error.bug "Profile.goto: unmatched Leave" | p :: pushes => let val (keep, si', leaves) = case p of Push.Enter (infoNode as InfoNode.T {info, ...}) => (true, info, infoNode :: leaves) | Push.Skip si' => (false, si', leaves) in if SourceInfo.equals (si, si') then (pushes, keep, leaves) else Error.bug "Profile.goto: mismatched Leave" end) val shouldSplit = profile = ProfileCount andalso (case ps of Enter _ => keep | _ => false) val {args, bytesAllocated, kind, label, leaves, statements} = maybeSplit {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, shouldSplit = shouldSplit, statements = statements} val statements = if keep then s :: statements else statements in {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, statements = statements} end | _ => {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, statements = s :: statements}) ) val shouldSplit = profile = ProfileAlloc andalso Bytes.> (bytesAllocated, Bytes.zero) val {args, kind, label, leaves, statements, ...} = maybeSplit {args = args, bytesAllocated = bytesAllocated, kind = kind, label = label, leaves = leaves, pushes = pushes, shouldSplit = shouldSplit, statements = statements} val _ = Transfer.foreachLabel (transfer, fn l => goto (l, pushes)) val transfer = case transfer of Transfer.Call {func, return, ...} => let val fi as FuncInfo.T {callers, ...} = funcInfo func in case return of Return.NonTail _ => let val _ = case firstEnter pushes of NONE => List.push (tailCalls, fi) | SOME n => List.push (callers, n) in if profileStack then profileEnter (pushes, transfer) else transfer end | _ => (List.push (tailCalls, fi) ; transfer) end | _ => transfer in backward {args = args, kind = kind, label = label, leaves = leaves, sourceSeq = Push.toSources pushes, statements = statements, transfer = transfer} end end val _ = goto (start, []) val blocks = Vector.fromList (!blocks) in Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} end val program = Program.T {functions = List.revMap (functions, doFunction), handlesSignals = handlesSignals, main = doFunction main, objectTypes = objectTypes} val _ = addFuncEdges () val names = Vector.fromListRev (!names) val sources = Vector.map (Vector.fromListRev (!infoNodes), fn InfoNode.T {nameIndex, successors, ...} => {nameIndex = nameIndex, successorsIndex = (sourceSeqIndex (List.revMap (!successors, InfoNode.sourcesIndex)))}) (* makeSourceSeqs () must happen after making sources, since that creates * new sourceSeqs. *) val sourceSeqs = makeSourceSeqs () fun makeProfileInfo {frames} = let val {get, set, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("frameProfileIndex", Label.layout)) val _ = List.foreach (!frameProfileIndices, fn (l, i) => set (l, i)) val frameSources = Vector.map (frames, get) in SOME (Machine.ProfileInfo.T {frameSources = frameSources, labels = Vector.fromList (!labels), names = names, sourceSeqs = sourceSeqs, sources = sources}) end in (program, makeProfileInfo) end end mlton-20100608/mlton/backend/implement-profiling.sig0000644000076600000240000000122511404435623020766 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature IMPLEMENT_PROFILING_STRUCTS = sig structure Machine: MACHINE structure Rssa: RSSA sharing Machine.ProfileLabel = Rssa.ProfileLabel end signature IMPLEMENT_PROFILING = sig include IMPLEMENT_PROFILING_STRUCTS val doit: Rssa.Program.t -> Rssa.Program.t * ({frames: Rssa.Label.t vector} -> Machine.ProfileInfo.t option) end mlton-20100608/mlton/backend/limit-check.fun0000644000076600000240000010621311404435623017207 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * The goal of limit check insertion is to ensure that * 1. At any allocation of b bytes, frontier + b <= base + heapSize * 2. At entry to each function, stackTop <= stackLimit * * It assumes that runtime provides several operands to help with this. * Frontier * Limit * LimitPlusSlop * StackLimit * StackTop * * There are three different kinds of checks inserted, depending on the * amount being allocated and whether or not the program uses signal * handlers. * * 1. If b <= LIMIT_SLOP, then continue (don't GC) if * * frontier <= limit * * The reason this works is that if frontier <= limit and b <= * LIMIT_SLOP, then * frontier + b <= limit + LIMIT_SLOP * = limitPlusSlop * = base + heapSize * This works even if the program uses signal handlers, which set * limit to zero, since frontier <= 0 will always be false. * * 2. If b > LIMIT_SLOP and if the program doesn't use signal handlers, * then continue (don't GC) if * * b <= limitPlusSlop - frontier * * The reason this works is that the condition is equivalent to * * b + frontier <= limitPlusSlop = base + heapSize * * We write the condition the way we do instead of the more obvious way * because "b + frontier" may overflow, while limitPlusSlop - frontier * can not, unless the program uses signal handlers. * * 3. If b > LIMIT_SLOP and if the program uses signal handlers, then * continue (don't GC) if * * limit > 0 * and b <= limitPlusSlop - frontier * * This is like case (2), except that because the program uses signal * handlers, the runtime may have set limit to zero to indicate that a * signal needs to be handled. So, we first check that this is not * the case before continuing as in case (2). * * Stack limit checks are completely orthogonal to heap checks, and are simply * inserted at the start of each function. *) functor LimitCheck (S: LIMIT_CHECK_STRUCTS): LIMIT_CHECK = struct open S open Rssa structure LimitCheck = struct datatype t = PerBlock | ExtBasicBlocks | LoopHeaders of {fullCFG: bool, loopExits: bool} end structure Control = struct open Control datatype limitCheck = datatype LimitCheck.t val limitCheck = ref (LoopHeaders {fullCFG = false, loopExits = true}) end datatype z = datatype Transfer.t structure CFunction = struct open CFunction Type.BuiltInCFunction end structure Statement = struct open Statement fun bytesAllocated (s: t): Bytes.t = case s of Object {size, ...} => size | _ => Bytes.zero end structure Transfer = struct open Transfer datatype bytesAllocated = Big of Operand.t | Small of Bytes.t fun bytesAllocated (t: t): bytesAllocated = case t of CCall {args, func, ...} => (case CFunction.bytesNeeded func of NONE => Small Bytes.zero | SOME i => let val z = Vector.sub (args, i) in case z of Operand.Const c => (case c of Const.Word w => let val w = WordX.toIntInf w in (* 512 is small and arbitrary *) if w <= 512 then Small (Bytes.fromIntInf w) else Big z end | _ => Error.bug "LimitCheck.Transfer.bytesAllocated: strange numBytes") | _ => Big z end) | _ => Small Bytes.zero end structure Block = struct open Block fun objectBytesAllocated (T {statements, transfer, ...}): Bytes.t = Bytes.+ (Vector.fold (statements, Bytes.zero, fn (s, ac) => Bytes.+ (ac, Statement.bytesAllocated s)), case Transfer.bytesAllocated transfer of Transfer.Big _ => Bytes.zero | Transfer.Small b => b) end val extraGlobals: Var.t list ref = ref [] fun insertFunction (f: Function.t, handlesSignals: bool, blockCheckAmount: {blockIndex: int} -> Bytes.t, ensureFree: Label.t -> Bytes.t) = let val {args, blocks, name, raises, returns, start} = Function.dest f val lessThan = Prim.wordLt (WordSize.csize (), {signed = false}) val newBlocks = ref [] local val r: Label.t option ref = ref NONE in fun heapCheckTooLarge () = case !r of SOME l => l | NONE => let val l = Label.newNoname () val _ = r := SOME l val cfunc = CFunction.T {args = Vector.new0 (), bytesNeeded = NONE, convention = CFunction.Convention.Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = false, prototype = (Vector.new0 (), NONE), readsStackTop = false, return = Type.unit, symbolScope = CFunction.SymbolScope.Private, target = CFunction.Target.Direct "MLton_heapCheckTooLarge", writesStackTop = false} val _ = newBlocks := Block.T {args = Vector.new0 (), kind = Kind.Jump, label = l, statements = Vector.new0 (), transfer = Transfer.CCall {args = Vector.new0 (), func = cfunc, return = NONE}} :: !newBlocks in l end end val _ = Vector.foreachi (blocks, fn (i, Block.T {args, kind, label, statements, transfer}) => let val transfer = case transfer of Transfer.CCall {args, func, return} => (if CFunction.ensuresBytesFree func then Transfer.CCall {args = (Vector.map (args, fn z => case z of Operand.EnsuresBytesFree => Operand.word (WordX.fromIntInf (Bytes.toIntInf (ensureFree (valOf return)), WordSize.csize ())) | _ => z)), func = func, return = return} else transfer) | _ => transfer val stack = Label.equals (start, label) fun insert (amount: Operand.t (* of type word *)) = let val collect = Label.newNoname () val collectReturn = Label.newNoname () val dontCollect = Label.newNoname () val (dontCollect', collectReturnStatements, force) = case !Control.gcCheck of Control.First => let val global = Var.newNoname () val _ = List.push (extraGlobals, global) val global = Operand.Var {var = global, ty = Type.bool} val dontCollect' = Label.newNoname () val _ = List.push (newBlocks, Block.T {args = Vector.new0 (), kind = Kind.Jump, label = dontCollect', statements = Vector.new0 (), transfer = Transfer.ifBool (global, {falsee = dontCollect, truee = collect})}) in (dontCollect', Vector.new1 (Statement.Move {dst = global, src = Operand.bool false}), global) end | Control.Limit => (dontCollect, Vector.new0 (), Operand.bool false) | Control.Every => (collect, Vector.new0 (), Operand.bool true) val func = CFunction.gc {maySwitchThreads = handlesSignals} val _ = newBlocks := Block.T {args = Vector.new0 (), kind = Kind.Jump, label = collect, statements = Vector.new0 (), transfer = (Transfer.CCall {args = Vector.new3 (Operand.GCState, amount, force), func = func, return = SOME collectReturn})} :: (Block.T {args = Vector.new0 (), kind = Kind.CReturn {func = func}, label = collectReturn, statements = collectReturnStatements, transfer = Transfer.Goto {dst = dontCollect, args = Vector.new0 ()}}) :: Block.T {args = Vector.new0 (), kind = Kind.Jump, label = dontCollect, statements = statements, transfer = transfer} :: !newBlocks in {collect = collect, dontCollect = dontCollect'} end fun newBlock (isFirst, statements, transfer) = let val (args, kind, label) = if isFirst then (args, kind, label) else (Vector.new0 (), Kind.Jump, Label.newNoname ()) val _ = List.push (newBlocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer}) in label end fun gotoHeapCheckTooLarge () = newBlock (true, Vector.new0 (), Transfer.Goto {args = Vector.new0 (), dst = heapCheckTooLarge ()}) fun primApp (prim, op1, op2, {collect, dontCollect}) = let val res = Var.newNoname () val s = Statement.PrimApp {args = Vector.new2 (op1, op2), dst = SOME (res, Type.bool), prim = prim} val transfer = Transfer.ifBool (Operand.Var {var = res, ty = Type.bool}, {falsee = dontCollect, truee = collect}) in (Vector.new1 s, transfer) end datatype z = datatype Runtime.GCField.t fun stackCheck (maybeFirst, z): Label.t = let val (statements, transfer) = primApp (Prim.cpointerLt, Operand.Runtime StackLimit, Operand.Runtime StackTop, z) in newBlock (maybeFirst, statements, transfer) end fun maybeStack (): unit = if stack then ignore (stackCheck (true, insert (Operand.word (WordX.zero (WordSize.csize ()))))) else (* No limit check, just keep the block around. *) List.push (newBlocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer}) fun frontierCheck (isFirst, prim, op1, op2, z as {collect, dontCollect = _}): Label.t = let val (statements, transfer) = primApp (prim, op1, op2, z) val l = newBlock (isFirst andalso not stack, statements, transfer) in if stack then stackCheck (isFirst, {collect = collect, dontCollect = l}) else l end fun heapCheck (isFirst: bool, amount: Operand.t (* of type word *)): Label.t = let val z as {collect, ...} = insert amount val res = Var.newNoname () val s = (* Can't do Limit - Frontier, because don't know that * Frontier < Limit. *) Statement.PrimApp {args = Vector.new2 (Operand.Runtime LimitPlusSlop, Operand.Runtime Frontier), dst = SOME (res, Type.csize ()), prim = Prim.cpointerDiff} val (statements, transfer) = primApp (lessThan, Operand.Var {var = res, ty = Type.csize ()}, amount, z) val statements = Vector.concat [Vector.new1 s, statements] in if handlesSignals then frontierCheck (isFirst, Prim.cpointerEqual, Operand.Runtime Limit, Operand.null, {collect = collect, dontCollect = newBlock (false, statements, transfer)}) else if stack then stackCheck (isFirst, {collect = collect, dontCollect = newBlock (false, statements, transfer)}) else newBlock (isFirst, statements, transfer) end fun heapCheckNonZero (bytes: Bytes.t): unit = ignore (if Bytes.<= (bytes, Runtime.limitSlop) then frontierCheck (true, Prim.cpointerLt, Operand.Runtime Limit, Operand.Runtime Frontier, insert (Operand.word (WordX.zero (WordSize.csize ())))) else let val bytes = let val bytes = WordX.fromIntInf (Bytes.toIntInf bytes, WordSize.csize ()) in SOME bytes end handle Overflow => NONE in case bytes of NONE => gotoHeapCheckTooLarge () | SOME bytes => heapCheck (true, Operand.word bytes) end) fun smallAllocation (): unit = let val b = blockCheckAmount {blockIndex = i} in if Bytes.isZero b then maybeStack () else heapCheckNonZero b end fun bigAllocation (bytesNeeded: Operand.t): unit = let val extraBytes = blockCheckAmount {blockIndex = i} in case bytesNeeded of Operand.Const c => (case c of Const.Word w => heapCheckNonZero (Bytes.+ (Bytes.fromIntInf (WordX.toIntInf w), extraBytes)) | _ => Error.bug "LimitCheck.bigAllocation: strange constant bytesNeeded") | _ => let val bytes = Var.newNoname () val extraBytes = let val extraBytes = WordX.fromIntInf (Bytes.toIntInf extraBytes, WordSize.csize ()) in SOME extraBytes end handle Overflow => NONE in case extraBytes of NONE => ignore (gotoHeapCheckTooLarge ()) | SOME extraBytes => (ignore o newBlock) (true, Vector.new0 (), Transfer.Arith {args = Vector.new2 (Operand.word extraBytes, bytesNeeded), dst = bytes, overflow = heapCheckTooLarge (), prim = Prim.wordAddCheck (WordSize.csize (), {signed = false}), success = (heapCheck (false, Operand.Var {var = bytes, ty = Type.csize ()})), ty = Type.csize ()}) end end in case Transfer.bytesAllocated transfer of Transfer.Big z => bigAllocation z | Transfer.Small _ => smallAllocation () end) in Function.new {args = args, blocks = Vector.fromList (!newBlocks), name = name, raises = raises, returns = returns, start = start} end fun insertPerBlock (f: Function.t, handlesSignals) = let val {blocks, ...} = Function.dest f fun blockCheckAmount {blockIndex} = Block.objectBytesAllocated (Vector.sub (blocks, blockIndex)) in insertFunction (f, handlesSignals, blockCheckAmount, fn _ => Bytes.zero) end structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge structure Forest = Graph.LoopForest val traceMaxPath = Trace.trace ("LimitCheck.maxPath", Int.layout, Bytes.layout) fun isolateBigTransfers (f: Function.t): Function.t = let val {args, blocks, name, raises, returns, start} = Function.dest f val newBlocks = ref [] val () = Vector.foreach (blocks, fn block as Block.T {args, kind, label, statements, transfer} => case Transfer.bytesAllocated transfer of Transfer.Big _ => let val l = Label.newNoname () in List.push (newBlocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = Goto {args = Vector.new0 (), dst = l}}) ; List.push (newBlocks, Block.T {args = Vector.new0 (), kind = Kind.Jump, label = l, statements = Vector.new0 (), transfer = transfer}) end | Transfer.Small _ => List.push (newBlocks, block)) val blocks = Vector.fromListRev (!newBlocks) in Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} end fun insertCoalesce (f: Function.t, handlesSignals) = let val f = isolateBigTransfers f val {blocks, start, ...} = Function.dest f val n = Vector.length blocks val {get = labelIndex, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("LimitCheck.labelIndex", Label.layout)) val {get = nodeIndex, set = setNodeIndex, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("LimitCheck.nodeIndex", Node.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) (* Build the graph. *) val g = Graph.new () val nodes = Vector.tabulate (n, fn i => let val n = Graph.newNode g val _ = setNodeIndex (n, i) in n end) fun indexNode i = Vector.sub (nodes, i) val labelNode = indexNode o labelIndex val root = Graph.newNode g (* mayHaveCheck == E U D * E = set of entry nodes * = start, Cont, Handler, * or CReturn that doesn't ensure bytesFree * Jump that calls a cfunction with bytesneeded * D = set of decycling nodes *) val mayHaveCheck = Array.tabulate (n, fn i => let val Block.T {kind, transfer, ...} = Vector.sub (blocks, i) datatype z = datatype Kind.t val isBigAlloc = case Transfer.bytesAllocated transfer of Transfer.Big _ => true | Transfer.Small _ => false val b = case kind of Cont _ => true | CReturn {func, ...} => CFunction.mayGC func andalso not (CFunction.ensuresBytesFree func) | Handler => true | Jump => (case transfer of Transfer.CCall {args, func, ...} => (case CFunction.bytesNeeded func of NONE => true | SOME i => (case Vector.sub (args, i) of Operand.Const _ => false | _ => true)) | _ => false) in b orelse isBigAlloc end) val _ = Array.update (mayHaveCheck, labelIndex start, true) (* Build cfg. *) val _ = Graph.addEdge (g, {from = root, to = labelNode start}) datatype z = datatype Control.limitCheck val fullCFG = case !Control.limitCheck of ExtBasicBlocks => true | LoopHeaders {fullCFG, ...} => fullCFG | _ => Error.bug "LimitCheck.insertCoalesce: fullCFG" val _ = Vector.foreachi (blocks, fn (i, Block.T {transfer, ...}) => let val from = indexNode i in Transfer.foreachLabel (transfer, fn l => let val i' = labelIndex l val to = indexNode i' fun addEdge from = (ignore o Graph.addEdge) (g, {from = from, to = to}) in if fullCFG then addEdge from else if Array.sub (mayHaveCheck, i') then addEdge root else addEdge from end) end) val objectBytesAllocated = Vector.map (blocks, Block.objectBytesAllocated) fun insertCoalesceExtBasicBlocks () = let val preds = Array.new (n, 0) fun incPred i = Array.update (preds, i, 1 + (Array.sub (preds, i))) val _ = Vector.foreach (nodes, fn node => List.foreach (Node.successors node, incPred o nodeIndex o Edge.to)) val _ = Array.foreachi (preds, fn (i, n) => if n > 1 then Array.update (mayHaveCheck, i, true) else ()) in () end fun insertCoalesceLoopHeaders loopExits = let (* Set equivalence classes, where two nodes are equivalent if they * are in the same loop in the loop forest. * Also mark loop headers as mayHaveCheck. *) val classes = Array.array (n, ~1) fun indexClass i = Array.sub (classes, i) val c = Counter.new 0 fun setClass (f: unit Forest.t) = let val {loops, notInLoop} = Forest.dest f val class = Counter.next c val _ = Vector.foreach (notInLoop, fn n => if Node.equals (n, root) then () else Array.update (classes, nodeIndex n, class)) val _ = Vector.foreach (loops, fn {headers, child} => (Vector.foreach (headers, fn n => Array.update (mayHaveCheck, nodeIndex n, true)) ; setClass child)) in () end val _ = setClass (Graph.loopForestSteensgaard (g, {root = root})) val numClasses = Counter.value c datatype z = datatype Control.limitCheck val _ = if loopExits then let (* Determine which classes allocate. *) val classDoesAllocate = Array.array (numClasses, false) val _ = List.foreach (Graph.nodes g, fn n => if Node.equals (n, root) then () else let val i = nodeIndex n in if (Bytes.< (Bytes.zero, Vector.sub (objectBytesAllocated, i))) then Array.update (classDoesAllocate, indexClass i, true) else () end) (* Mark nodes that are post-exits of non-allocating * loops as mayHaveCheck. *) val _ = List.foreach (Graph.nodes g, fn n => if Node.equals (n, root) then () else let val i = nodeIndex n val c = indexClass i in if Array.sub (classDoesAllocate, c) then () else List.foreach (Node.successors n, fn e => let val i' = nodeIndex (Edge.to e) in if c <> indexClass i' then Array.update (mayHaveCheck, i', true) else () end) end) in () end else () in () end datatype z = datatype Control.limitCheck val _ = case !Control.limitCheck of ExtBasicBlocks => insertCoalesceExtBasicBlocks () | LoopHeaders {loopExits, ...} => insertCoalesceLoopHeaders loopExits | _ => Error.bug "LimitCheck.insertCoalesce" (* If we remove edges into nodes that are mayHaveCheck, we have an * acyclic graph. * So, we can compute a function, maxPath, inductively that for each node * tells the maximum amount allocated along any path that passes only * through nodes that are not mayHaveCheck. *) local val a = Array.array (n, NONE) in fun maxPath arg : Bytes.t = (* i is a node index *) traceMaxPath (fn (i: int) => case Array.sub (a, i) of SOME x => x | NONE => let val x = Vector.sub (objectBytesAllocated, i) val max = List.fold (Node.successors (indexNode i), Bytes.zero, fn (e, max) => let val i' = nodeIndex (Edge.to e) in if Array.sub (mayHaveCheck, i') then max else Bytes.max (max, maxPath i') end) val x = Bytes.+ (x, max) val _ = Array.update (a, i, SOME x) in x end ) arg end fun blockCheckAmount {blockIndex} = if Array.sub (mayHaveCheck, blockIndex) then maxPath blockIndex else Bytes.zero val f = insertFunction (f, handlesSignals, blockCheckAmount, maxPath o labelIndex) val _ = Control.diagnostics (fn display => Vector.foreach (blocks, fn Block.T {label, ...} => display (let open Layout in seq [Label.layout label, str " ", Bytes.layout (maxPath (labelIndex label))] end))) val _ = Function.clear f in f end fun insert (Program.T {functions, handlesSignals, main, objectTypes}) = let val _ = Control.diagnostic (fn () => Layout.str "Limit Check maxPaths") datatype z = datatype Control.limitCheck fun insert f = case !Control.limitCheck of PerBlock => insertPerBlock (f, handlesSignals) | _ => insertCoalesce (f, handlesSignals) val functions = List.revMap (functions, insert) val {args, blocks, name, raises, returns, start} = Function.dest (insert main) val newStart = Label.newNoname () val block = Block.T {args = Vector.new0 (), kind = Kind.Jump, label = newStart, statements = (Vector.fromListMap (!extraGlobals, fn x => Statement.Bind {dst = (x, Type.bool), isMutable = true, src = Operand.cast (Operand.bool true, Type.bool)})), transfer = Transfer.Goto {args = Vector.new0 (), dst = start}} val blocks = Vector.concat [Vector.new1 block, blocks] val main = Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = newStart} in Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes} end end mlton-20100608/mlton/backend/limit-check.sig0000644000076600000240000000075011404435623017200 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LIMIT_CHECK_STRUCTS = sig structure Rssa: RSSA end signature LIMIT_CHECK = sig include LIMIT_CHECK_STRUCTS val insert: Rssa.Program.t -> Rssa.Program.t end mlton-20100608/mlton/backend/live.fun0000644000076600000240000003447711404435623015771 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. * * This pass is based on the liveness algorithm described in section 4.13, * page 132, of Morgan's "Building an Optimizing Compiler". BTW, the Dragon * book and Muchnick's book provided no help at all on speeding up liveness. * They suggest using bit-vectors, which is infeasible for MLton due to the * large size of and number of variables in SSA functions. * * Here is a description of the algorithm. * * Walk over the whole program and * 1. Build the predecessor graph of basic blocks. Each basic block records the * set of its predecessors and the set of variables live at the beginning of * the block. * 2. For each variable record the block in which is defined and the list of * blocks where it is used. * * Now, for each variable, propagate the liveness information backwards from uses * along basic blocks until the definition block is reached. * * That's it. The reason why it's so fast is that it processes one variable at a * time, and hence the operation to determine if that variable is in the live * list for a particular block is constant time -- the variable is either at the * head of the list or it's not there. *) functor Live (S: LIVE_STRUCTS): LIVE = struct open S datatype z = datatype Statement.t datatype z = datatype Transfer.t structure LiveInfo = struct datatype t = T of {live: Var.t Buffer.t, liveHS: {handler: Label.t option ref, link: unit option ref}, name: string, preds: t list ref} fun layout (T {name, ...}) = Layout.str name fun new (name: string) = T {live = Buffer.new {dummy = Var.bogus}, liveHS = {handler = ref NONE, link = ref NONE}, name = name, preds = ref []} fun live (T {live, ...}) = Buffer.toVector live fun liveHS (T {liveHS = {handler, link}, ...}) = {handler = !handler, link = isSome (!link)} fun equals (T {preds = r, ...}, T {preds = r', ...}) = r = r' fun addEdge (b, T {preds, ...}) = if List.exists (!preds, fn b' => equals (b, b')) then () else List.push (preds, b) val addEdge = Trace.trace2 ("Live.LiveInfo.addEdge", layout, layout, Unit.layout) addEdge end val traceConsider = Trace.trace ("Live.consider", LiveInfo.layout, Bool.layout) fun live (function, {shouldConsider: Var.t -> bool}) = let val shouldConsider = Trace.trace ("Live.shouldConsider", Var.layout, Bool.layout) shouldConsider val {args, blocks, ...} = Function.dest function val _ = Control.diagnostic (fn () => let val numVars = ref 0 fun loopVar (x, _) = if shouldConsider x then Int.inc numVars else () fun loopFormals v = Vector.foreach (v, loopVar) val () = Vector.foreach (blocks, fn Block.T {args, statements, transfer, ...} => (loopFormals args ; Vector.foreach (statements, fn s => Statement.foreachDef (s, loopVar)) ; Transfer.foreachDef (transfer, loopVar))) open Layout in align [seq [str "Live info for ", Func.layout (Function.name function)], seq [str " num blocks ", Int.layout (Vector.length blocks)], seq [str " num vars ", Int.layout (!numVars)]] end) val {get = labelInfo: Label.t -> {argInfo: LiveInfo.t, block: Block.t, bodyInfo: LiveInfo.t}, rem = removeLabelInfo, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("live info", Label.layout)) val {get = varInfo: Var.t -> {defined: LiveInfo.t option ref, used: LiveInfo.t list ref}, rem = removeVarInfo, ...} = Property.get (Var.plist, Property.initFun (fn _ => {defined = ref NONE, used = ref []})) datatype 'a defuse = Def of LiveInfo.t | Use of 'a * LiveInfo.t val handlerCodeDefUses: Label.t defuse list ref = ref [] val handlerLinkDefUses: unit defuse list ref = ref [] val allVars: Var.t list ref = ref [] fun setDefined (x: Var.t, defined): unit = if shouldConsider x then (List.push (allVars, x) ; #defined (varInfo x) := SOME defined) else () val setDefined = Trace.trace2 ("Live.setDefined", Var.layout, LiveInfo.layout, Unit.layout) setDefined (* Set the labelInfo for each block. *) val _ = Vector.foreach (blocks, fn block as Block.T {args, label, ...} => let val name = Label.toString label val (argInfo, bodyInfo) = case Vector.length args of 0 => let val b = LiveInfo.new (name ^ "a") in (b, b) end | _ => let val b = LiveInfo.new (name ^ "b") val b' = LiveInfo.new (name ^ "c") val _ = LiveInfo.addEdge (b, b') in (b, b') end in setLabelInfo (label, {argInfo = argInfo, block = block, bodyInfo = bodyInfo}) end) (* Add the control-flow edges and set the defines and uses for each * variable. *) val head = LiveInfo.new "main" val _ = Vector.foreach (args, fn (x, _) => setDefined (x, head)) val _ = Vector.foreach (blocks, fn Block.T {args, kind, label, statements, transfer, ...} => let val {argInfo, bodyInfo = b, ...} = labelInfo label val _ = Vector.foreach (args, fn (x, _) => setDefined (x, argInfo)) fun goto l = LiveInfo.addEdge (b, #argInfo (labelInfo l)) (* Make sure that a cont's live vars includes variables live in its * handler. *) val _ = case kind of Kind.Cont {handler, ...} => Handler.foreachLabel (handler, goto) | _ => () fun define (x: Var.t): unit = setDefined (x, b) fun use (x: Var.t): unit = if shouldConsider x then let val {used, ...} = varInfo x in if (case !used of [] => false | b' :: _ => LiveInfo.equals (b, b')) then () else List.push (used, b) end else () val use = Trace.trace ("Live.use", Var.layout, Unit.layout) use val _ = Vector.foreach (statements, fn s => let val _ = Statement.foreachDefUse (s, {def = define o #1, use = use}) val _ = case s of SetExnStackSlot => List.push (handlerLinkDefUses, Use ((), b)) | SetHandler _ => List.push (handlerCodeDefUses, Def b) | SetSlotExnStack => List.push (handlerLinkDefUses, Def b) | _ => () in () end) fun label l = let val {block = Block.T {kind, ...}, ...} = labelInfo l in case kind of Kind.Handler => List.push (handlerCodeDefUses, Use (l, b)) | _ => goto l end val _ = Transfer.foreachDefLabelUse (transfer, {def = define o #1, label = label, use = use}) in () end) (* Back-propagate every variable from uses to define point. *) fun processVar (x: Var.t): unit = if not (shouldConsider x) then () else let val {defined, used, ...} = varInfo x val defined = valOf (!defined) val todo: LiveInfo.t list ref = ref [] fun consider (b as LiveInfo.T {live, ...}) = if LiveInfo.equals (b, defined) orelse (case Buffer.last live of NONE => false | SOME x' => Var.equals (x, x')) then false else (Buffer.add (live, x) ; List.push (todo, b) ; true) val consider = traceConsider consider val consider = ignore o consider val _ = List.foreach (!used, consider) fun loop () = case !todo of [] => () | LiveInfo.T {preds, ...} :: bs => (todo := bs ; List.foreach (!preds, consider) ; loop ()) val _ = loop () in () end val processVar = Trace.trace ("Live.processVar", Var.layout, Unit.layout) processVar val _ = List.foreach (!allVars, processVar) val _ = Function.foreachVar (function, fn (x, _) => removeVarInfo x) (* handler code and link slots are harder; in particular, they don't * satisfy the SSA invariant -- there are multiple definitions; * furthermore, a def and use in a block does not mean that the def * occurs before the use. But, a back propagated use will always * come after a def in the same block *) fun handlerLink (defuse: 'a defuse list ref, sel: {handler: Label.t option ref, link: unit option ref} -> 'a option ref) = let val todo: ('a * LiveInfo.t) list ref = ref [] (* The foldr is important because the statements in each block were * visited in order, meaning that the earlier statements appear * later in !defuse. Hence, with the foldr, the defs and uses are * visited in order for each block. *) val defs = List.foldr (!defuse, [], fn (du, defs) => case du of Def b => b::defs | Use (a, b as LiveInfo.T {liveHS, ...}) => let val _ = if (* Since we are visiting all of the statements * in the block together, in order, we are * guaranteed that if there is a prior definition * then it will be first on defs. *) (case defs of [] => false | b' :: _ => LiveInfo.equals (b, b')) then () else (sel liveHS := SOME a ; List.push (todo, (a, b))) in defs end) fun consider (b as LiveInfo.T {liveHS, ...}, a: 'a) = if List.exists (defs, fn b' => LiveInfo.equals (b, b')) orelse isSome (!(sel liveHS)) then () else (sel liveHS := SOME a ; List.push (todo, (a, b))) fun loop () = case !todo of [] => () | (a, LiveInfo.T {preds, ...}) :: bs => (todo := bs ; List.foreach (!preds, fn b => consider (b, a)) ; loop ()) val _ = loop () in () end val _ = handlerLink (handlerCodeDefUses, #handler) val _ = handlerLink (handlerLinkDefUses, #link) val {get = labelLive, rem = remLabelLive, ...} = Property.get (Label.plist, Property.initFun (fn l => let val {bodyInfo, argInfo, ...} = labelInfo l val () = removeLabelInfo l val {handler, link} = LiveInfo.liveHS bodyInfo in {begin = LiveInfo.live bodyInfo, beginNoFormals = LiveInfo.live argInfo, handler = handler, link = link} end)) val () = Vector.foreach (blocks, fn b => ignore (labelLive (Block.label b))) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (blocks, fn b => let val l = Block.label b val {begin, beginNoFormals, handler, link} = labelLive l in display (seq [Label.layout l, str " ", record [("begin", Vector.layout Var.layout begin), ("beginNoFormals", Vector.layout Var.layout beginNoFormals), ("handler", Option.layout Label.layout handler), ("link", Bool.layout link)]]) end) end) in {labelLive = labelLive, remLabelLive = remLabelLive} end val live = Trace.trace2 ("Live.live", Func.layout o Function.name, Layout.ignore, Layout.ignore) live end mlton-20100608/mlton/backend/live.sig0000644000076600000240000000161111404435623015743 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LIVE_STRUCTS = sig include RSSA end signature LIVE = sig include LIVE_STRUCTS val live: Function.t * {shouldConsider: Var.t -> bool} -> {labelLive: Label.t -> {(* live at beginning of block. *) begin: Var.t vector, (* live at the beginning of a block, except formals. *) beginNoFormals: Var.t vector, (* live handler slots at beginning of block. *) handler: Label.t option, link: bool}, remLabelLive: Label.t -> unit} end mlton-20100608/mlton/backend/machine.fun0000644000076600000240000017253111404435623016430 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Machine (S: MACHINE_STRUCTS): MACHINE = struct open S structure ObjptrTycon = ObjptrTycon () structure Runtime = Runtime () structure Scale = Scale () structure RepType = RepType (structure CFunction = CFunction structure CType = CType structure Label = Label structure ObjptrTycon = ObjptrTycon structure Prim = Prim structure RealSize = RealSize structure Runtime = Runtime structure Scale = Scale structure WordSize = WordSize structure WordX = WordX structure WordXVector = WordXVector) structure ObjectType = RepType.ObjectType structure Type = RepType structure ChunkLabel = Id (val noname = "ChunkLabel") structure Register = struct datatype t = T of {index: int option ref, ty: Type.t} local fun make f (T r) = f r in val indexOpt = ! o (make #index) val ty = make #ty end fun layout (T {index, ty, ...}) = let open Layout in seq [str (concat ["R", Type.name ty]), paren (case !index of NONE => str "NONE" | SOME i => Int.layout i), str ": ", Type.layout ty] end val toString = Layout.toString o layout fun index (r as T {index, ...}) = case !index of NONE => Error.bug (concat ["Machine.Register: register ", toString r, " missing index"]) | SOME i => i fun setIndex (r as T {index, ...}, i) = case !index of NONE => index := SOME i | SOME _ => Error.bug (concat ["Machine.Register: register ", toString r, " index already set"]) fun new (ty, i) = T {index = ref i, ty = ty} fun equals (r, r') = (case (indexOpt r, indexOpt r') of (SOME i, SOME i') => i = i' | _ => false) andalso CType.equals (Type.toCType (ty r), Type.toCType (ty r')) val equals = Trace.trace2 ("Machine.Register.equals", layout, layout, Bool.layout) equals val isSubtype: t * t -> bool = fn (T {index = i, ty = t}, T {index = i', ty = t'}) => (case (!i, !i') of (SOME i, SOME i') => i = i' | _ => false) andalso Type.isSubtype (t, t') andalso CType.equals (Type.toCType t, Type.toCType t') end structure Global = struct datatype t = T of {index: int, isRoot: bool, ty: Type.t} fun layout (T {index, isRoot, ty, ...}) = let open Layout in seq [str "glob ", record [("index", Int.layout index), ("isRoot", Bool.layout isRoot), ("ty", Type.layout ty)]] end local fun make f (T r) = f r in val index = make #index val isRoot = make #isRoot val ty = make #ty end val nonRootCounter = Counter.new 0 fun numberOfNonRoot () = Counter.value nonRootCounter val memo = CType.memo (fn _ => Counter.new 0) fun numberOfType t = Counter.value (memo t) fun new {isRoot, ty} = let val isRoot = isRoot orelse not (Type.isObjptr ty) val counter = if isRoot then memo (Type.toCType ty) else nonRootCounter val g = T {index = Counter.next counter, isRoot = isRoot, ty = ty} in g end fun equals (T {index = i, isRoot = r, ty}, T {index = i', isRoot = r', ty = ty'}) = i = i' andalso r = r' andalso Type.equals (ty, ty') val isSubtype: t * t -> bool = fn (T {index = i, isRoot = r, ty}, T {index = i', isRoot = r', ty = ty'}) => i = i' andalso r = r' andalso Type.isSubtype (ty, ty') andalso CType.equals (Type.toCType ty, Type.toCType ty') end structure StackOffset = struct datatype t = T of {offset: Bytes.t, ty: Type.t} local fun make f (T r) = f r in val ty = make #ty end fun layout (T {offset, ty}): Layout.t = let open Layout in seq [str (concat ["S", Type.name ty]), paren (Bytes.layout offset), str ": ", Type.layout ty] end val equals: t * t -> bool = fn (T {offset = b, ty}, T {offset = b', ty = ty'}) => Bytes.equals (b, b') andalso Type.equals (ty, ty') val isSubtype: t * t -> bool = fn (T {offset = b, ty = t}, T {offset = b', ty = t'}) => Bytes.equals (b, b') andalso Type.isSubtype (t, t') val interfere: t * t -> bool = fn (T {offset = b, ty = ty}, T {offset = b', ty = ty'}) => let val max = Bytes.+ (b, Type.bytes ty) val max' = Bytes.+ (b', Type.bytes ty') in Bytes.> (max, b') andalso Bytes.> (max', b) end fun shift (T {offset, ty}, size): t = T {offset = Bytes.- (offset, size), ty = ty} end structure Operand = struct datatype t = ArrayOffset of {base: t, index: t, offset: Bytes.t, scale: Scale.t, ty: Type.t} | Cast of t * Type.t | Contents of {oper: t, ty: Type.t} | Frontier | GCState | Global of Global.t | Label of Label.t | Null | Offset of {base: t, offset: Bytes.t, ty: Type.t} | Register of Register.t | Real of RealX.t | StackOffset of StackOffset.t | StackTop | Word of WordX.t val ty = fn ArrayOffset {ty, ...} => ty | Cast (_, ty) => ty | Contents {ty, ...} => ty | Frontier => Type.cpointer () | GCState => Type.gcState () | Global g => Global.ty g | Label l => Type.label l | Null => Type.cpointer () | Offset {ty, ...} => ty | Real r => Type.real (RealX.size r) | Register r => Register.ty r | StackOffset s => StackOffset.ty s | StackTop => Type.cpointer () | Word w => Type.ofWordX w fun layout (z: t): Layout.t = let open Layout fun constrain (ty: Type.t): Layout.t = if !Control.showTypes then seq [str ": ", Type.layout ty] else empty in case z of ArrayOffset {base, index, offset, scale, ty} => seq [str (concat ["X", Type.name ty, " "]), tuple [layout base, layout index, Scale.layout scale, Bytes.layout offset], constrain ty] | Cast (z, ty) => seq [str "Cast ", tuple [layout z, Type.layout ty]] | Contents {oper, ty} => seq [str (concat ["C", Type.name ty, " "]), paren (layout oper)] | Frontier => str "" | GCState => str "" | Global g => Global.layout g | Label l => Label.layout l | Null => str "NULL" | Offset {base, offset, ty} => seq [str (concat ["O", Type.name ty, " "]), tuple [layout base, Bytes.layout offset], constrain ty] | Real r => RealX.layout r | Register r => Register.layout r | StackOffset so => StackOffset.layout so | StackTop => str "" | Word w => WordX.layout w end val toString = Layout.toString o layout val rec equals = fn (ArrayOffset {base = b, index = i, ...}, ArrayOffset {base = b', index = i', ...}) => equals (b, b') andalso equals (i, i') | (Cast (z, t), Cast (z', t')) => Type.equals (t, t') andalso equals (z, z') | (Contents {oper = z, ...}, Contents {oper = z', ...}) => equals (z, z') | (GCState, GCState) => true | (Global g, Global g') => Global.equals (g, g') | (Label l, Label l') => Label.equals (l, l') | (Offset {base = b, offset = i, ...}, Offset {base = b', offset = i', ...}) => equals (b, b') andalso Bytes.equals (i, i') | (Real r, Real r') => RealX.equals (r, r') | (Register r, Register r') => Register.equals (r, r') | (StackOffset so, StackOffset so') => StackOffset.equals (so, so') | (Word w, Word w') => WordX.equals (w, w') | _ => false val stackOffset = StackOffset o StackOffset.T fun interfere (write: t, read: t): bool = let fun inter read = interfere (write, read) in case (read, write) of (Cast (z, _), _) => interfere (write, z) | (_, Cast (z, _)) => interfere (z, read) | (ArrayOffset {base, index, ...}, _) => inter base orelse inter index | (Contents {oper, ...}, _) => inter oper | (Global g, Global g') => Global.equals (g, g') | (Offset {base, ...}, _) => inter base | (Register r, Register r') => Register.equals (r, r') | (StackOffset so, StackOffset so') => StackOffset.interfere (so, so') | _ => false end val rec isLocation = fn ArrayOffset _ => true | Cast (z, _) => isLocation z | Contents _ => true | GCState => true | Global _ => true | Offset _ => true | Register _ => true | StackOffset _ => true | _ => false end structure Switch = Switch (open Atoms structure Type = Type structure Use = Operand) structure Statement = struct datatype t = Move of {dst: Operand.t, src: Operand.t} | Noop | PrimApp of {args: Operand.t vector, dst: Operand.t option, prim: Type.t Prim.t} | ProfileLabel of ProfileLabel.t val layout = let open Layout in fn Move {dst, src} => mayAlign [Operand.layout dst, seq [str " = ", Operand.layout src]] | Noop => str "Noop" | PrimApp {args, dst, prim, ...} => let val rest = seq [Prim.layout prim, str " ", Vector.layout Operand.layout args] in case dst of NONE => rest | SOME z => mayAlign [Operand.layout z, seq [str " = ", rest]] end | ProfileLabel l => seq [str "ProfileLabel ", ProfileLabel.layout l] end fun move (arg as {dst, src}) = if Operand.equals (dst, src) then Noop else Move arg val move = Trace.trace ("Machine.Statement.move", fn {dst, src} => Layout.record [("dst", Operand.layout dst), ("src", Operand.layout src)], layout) move fun moves {srcs, dsts} = Vector.fromListRev (Vector.fold2 (srcs, dsts, [], fn (src, dst, ac) => move {src = src, dst = dst} :: ac)) fun object {dst, header, size} = let datatype z = datatype Operand.t fun bytes (b: Bytes.t): Operand.t = Word (WordX.fromIntInf (Bytes.toIntInf b, WordSize.csize ())) val temp = Register (Register.new (Type.cpointer (), NONE)) in Vector.new4 (Move {dst = Contents {oper = Frontier, ty = Type.objptrHeader ()}, src = Word (WordX.fromIntInf (Word.toIntInf header, WordSize.objptrHeader ()))}, PrimApp {args = Vector.new2 (Frontier, bytes (Runtime.headerSize ())), dst = SOME temp, prim = Prim.cpointerAdd}, (* CHECK; if objptr <> cpointer, need non-trivial coercion here. *) Move {dst = dst, src = Cast (temp, Operand.ty dst)}, PrimApp {args = Vector.new2 (Frontier, bytes size), dst = SOME Frontier, prim = Prim.cpointerAdd}) end fun foldOperands (s, ac, f) = case s of Move {dst, src} => f (dst, f (src, ac)) | PrimApp {args, dst, ...} => Vector.fold (args, Option.fold (dst, ac, f), f) | _ => ac fun foldDefs (s, a, f) = case s of Move {dst, ...} => f (dst, a) | PrimApp {dst, ...} => (case dst of NONE => a | SOME z => f (z, a)) | _ => a end structure FrameInfo = struct datatype t = T of {frameLayoutsIndex: int} fun layout (T {frameLayoutsIndex, ...}) = Layout.record [("frameLayoutsIndex", Int.layout frameLayoutsIndex)] fun equals (T {frameLayoutsIndex = i}, T {frameLayoutsIndex = i'}) = i = i' end structure Live = struct datatype t = Global of Global.t | Register of Register.t | StackOffset of StackOffset.t val layout: t -> Layout.t = fn Global g => Global.layout g | Register r => Register.layout r | StackOffset s => StackOffset.layout s val equals: t * t -> bool = fn (Global g, Global g') => Global.equals (g, g') | (Register r, Register r') => Register.equals (r, r') | (StackOffset s, StackOffset s') => StackOffset.equals (s, s') | _ => false val ty = fn Global g => Global.ty g | Register r => Register.ty r | StackOffset s => StackOffset.ty s val isSubtype: t * t -> bool = fn (Global g, Global g') => Global.isSubtype (g, g') | (Register r, Register r') => Register.isSubtype (r, r') | (StackOffset s, StackOffset s') => StackOffset.isSubtype (s, s') | _ => false val interfere: t * t -> bool = fn (l, l') => equals (l, l') orelse (case (l, l') of (StackOffset s, StackOffset s') => StackOffset.interfere (s, s') | _ => false) val fromOperand: Operand.t -> t option = fn Operand.Global g => SOME (Global g) | Operand.Register r => SOME (Register r) | Operand.StackOffset s => SOME (StackOffset s) | _ => NONE val toOperand: t -> Operand.t = fn Global g => Operand.Global g | Register r => Operand.Register r | StackOffset s => Operand.StackOffset s end structure Transfer = struct datatype t = Arith of {args: Operand.t vector, dst: Operand.t, overflow: Label.t, prim: Type.t Prim.t, success: Label.t} | CCall of {args: Operand.t vector, frameInfo: FrameInfo.t option, func: Type.t CFunction.t, return: Label.t option} | Call of {label: Label.t, live: Live.t vector, return: {return: Label.t, handler: Label.t option, size: Bytes.t} option} | Goto of Label.t | Raise | Return | Switch of Switch.t fun layout t = let open Layout in case t of Arith {prim, args, dst, overflow, success, ...} => seq [str "Arith ", record [("prim", Prim.layout prim), ("args", Vector.layout Operand.layout args), ("dst", Operand.layout dst), ("overflow", Label.layout overflow), ("success", Label.layout success)]] | CCall {args, frameInfo, func, return} => seq [str "CCall ", record [("args", Vector.layout Operand.layout args), ("frameInfo", Option.layout FrameInfo.layout frameInfo), ("func", CFunction.layout (func, Type.layout)), ("return", Option.layout Label.layout return)]] | Call {label, live, return} => seq [str "Call ", record [("label", Label.layout label), ("live", Vector.layout Live.layout live), ("return", Option.layout (fn {return, handler, size} => record [("return", Label.layout return), ("handler", Option.layout Label.layout handler), ("size", Bytes.layout size)]) return)]] | Goto l => seq [str "Goto ", Label.layout l] | Raise => str "Raise" | Return => str "Return " | Switch s => Switch.layout s end fun foldOperands (t, ac, f) = case t of Arith {args, dst, ...} => Vector.fold (args, f (dst, ac), f) | CCall {args, ...} => Vector.fold (args, ac, f) | Switch s => Switch.foldLabelUse (s, ac, {label = fn (_, a) => a, use = f}) | _ => ac fun foldDefs (t, a, f) = case t of Arith {dst, ...} => f (dst, a) | _ => a end structure Kind = struct datatype t = Cont of {args: Live.t vector, frameInfo: FrameInfo.t} | CReturn of {dst: Live.t option, frameInfo: FrameInfo.t option, func: Type.t CFunction.t} | Func | Handler of {frameInfo: FrameInfo.t, handles: Live.t vector} | Jump fun layout k = let open Layout in case k of Cont {args, frameInfo} => seq [str "Cont ", record [("args", Vector.layout Live.layout args), ("frameInfo", FrameInfo.layout frameInfo)]] | CReturn {dst, frameInfo, func} => seq [str "CReturn ", record [("dst", Option.layout Live.layout dst), ("frameInfo", Option.layout FrameInfo.layout frameInfo), ("func", CFunction.layout (func, Type.layout))]] | Func => str "Func" | Handler {frameInfo, handles} => seq [str "Handler ", record [("frameInfo", FrameInfo.layout frameInfo), ("handles", Vector.layout Live.layout handles)]] | Jump => str "Jump" end val frameInfoOpt = fn Cont {frameInfo, ...} => SOME frameInfo | CReturn {frameInfo, ...} => frameInfo | Handler {frameInfo, ...} => SOME frameInfo | _ => NONE end structure Block = struct datatype t = T of {kind: Kind.t, label: Label.t, live: Live.t vector, raises: Live.t vector option, returns: Live.t vector option, statements: Statement.t vector, transfer: Transfer.t} fun clear (T {label, ...}) = Label.clear label local fun make g (T r) = g r in val kind = make #kind val label = make #label end fun layout (T {kind, label, live, raises, returns, statements, transfer}) = let open Layout in align [seq [Label.layout label, str ": ", record [("kind", Kind.layout kind), ("live", Vector.layout Live.layout live), ("raises", Option.layout (Vector.layout Live.layout) raises), ("returns", Option.layout (Vector.layout Live.layout) returns)]], indent (align [align (Vector.toListMap (statements, Statement.layout)), Transfer.layout transfer], 4)] end fun layouts (block, output' : Layout.t -> unit) = output' (layout block) fun foldDefs (T {kind, statements, transfer, ...}, a, f) = let val a = case kind of Kind.CReturn {dst, ...} => (case dst of NONE => a | SOME z => f (Live.toOperand z, a)) | _ => a val a = Vector.fold (statements, a, fn (s, a) => Statement.foldDefs (s, a, f)) val a = Transfer.foldDefs (transfer, a, f) in a end end structure Chunk = struct datatype t = T of {blocks: Block.t vector, chunkLabel: ChunkLabel.t, regMax: CType.t -> int} fun layouts (T {blocks, ...}, output : Layout.t -> unit) = Vector.foreach (blocks, fn block => Block.layouts (block, output)) fun clear (T {blocks, ...}) = Vector.foreach (blocks, Block.clear) end structure ProfileInfo = struct datatype t = T of {frameSources: int vector, labels: {label: ProfileLabel.t, sourceSeqsIndex: int} vector, names: string vector, sourceSeqs: int vector vector, sources: {nameIndex: int, successorsIndex: int} vector} val empty = T {frameSources = Vector.new0 (), labels = Vector.new0 (), names = Vector.new0 (), sourceSeqs = Vector.new0 (), sources = Vector.new0 ()} fun clear (T {labels, ...}) = Vector.foreach (labels, ProfileLabel.clear o #label) fun layout (T {frameSources, labels, names, sourceSeqs, sources}) = Layout.record [("frameSources", Vector.layout Int.layout frameSources), ("labels", Vector.layout (fn {label, sourceSeqsIndex} => Layout.record [("label", ProfileLabel.layout label), ("sourceSeqsIndex", Int.layout sourceSeqsIndex)]) labels), ("names", Vector.layout String.layout names), ("sourceSeqs", Vector.layout (Vector.layout Int.layout) sourceSeqs), ("sources", Vector.layout (fn {nameIndex, successorsIndex} => Layout.record [("nameIndex", Int.layout nameIndex), ("successorsIndex", Int.layout successorsIndex)]) sources)] fun layouts (pi, output) = output (layout pi) fun isOK (T {frameSources, labels, names, sourceSeqs, sources}): bool = let val namesLength = Vector.length names val sourceSeqsLength = Vector.length sourceSeqs val sourcesLength = Vector.length sources in !Control.profile = Control.ProfileNone orelse (Vector.forall (frameSources, fn i => 0 <= i andalso i < sourceSeqsLength) andalso (Vector.forall (labels, fn {sourceSeqsIndex = i, ...} => 0 <= i andalso i < sourceSeqsLength)) andalso (Vector.forall (sourceSeqs, fn v => Vector.forall (v, fn i => 0 <= i andalso i < sourcesLength))) andalso (Vector.forall (sources, fn {nameIndex, successorsIndex} => 0 <= nameIndex andalso nameIndex < namesLength andalso 0 <= successorsIndex andalso successorsIndex < sourceSeqsLength))) end fun modify (T {frameSources, labels, names, sourceSeqs, sources}) : {newProfileLabel: ProfileLabel.t -> ProfileLabel.t, delProfileLabel: ProfileLabel.t -> unit, getProfileInfo: unit -> t} = let val {get: ProfileLabel.t -> int, set, ...} = Property.getSet (ProfileLabel.plist, Property.initRaise ("ProfileInfo.extend", ProfileLabel.layout)) val _ = Vector.foreach (labels, fn {label, sourceSeqsIndex} => set (label, sourceSeqsIndex)) val new = ref [] fun newProfileLabel l = let val i = get l val l' = ProfileLabel.new () val _ = set (l', i) val _ = List.push (new, {label = l', sourceSeqsIndex = i}) in l' end fun delProfileLabel l = set (l, ~1) fun getProfileInfo () = let val labels = Vector.concat [labels, Vector.fromList (!new)] val labels = Vector.keepAll (labels, fn {label, ...} => get label <> ~1) val pi = T {frameSources = frameSources, labels = Vector.concat [labels, Vector.fromList (!new)], names = names, sourceSeqs = sourceSeqs, sources = sources} in Assert.assert ("Machine.getProfileInfo", fn () => isOK pi); pi end in {newProfileLabel = newProfileLabel, delProfileLabel = delProfileLabel, getProfileInfo = getProfileInfo} end end structure Program = struct datatype t = T of {chunks: Chunk.t list, frameLayouts: {frameOffsetsIndex: int, isC: bool, size: Bytes.t} vector, frameOffsets: Bytes.t vector vector, handlesSignals: bool, intInfs: (Global.t * IntInf.t) list, main: {chunkLabel: ChunkLabel.t, label: Label.t}, maxFrameSize: Bytes.t, objectTypes: ObjectType.t vector, profileInfo: ProfileInfo.t option, reals: (Global.t * RealX.t) list, vectors: (Global.t * WordXVector.t) list} fun clear (T {chunks, profileInfo, ...}) = (List.foreach (chunks, Chunk.clear) ; Option.app (profileInfo, ProfileInfo.clear)) fun frameSize (T {frameLayouts, ...}, FrameInfo.T {frameLayoutsIndex, ...}) = #size (Vector.sub (frameLayouts, frameLayoutsIndex)) fun layouts (T {chunks, frameLayouts, frameOffsets, handlesSignals, main = {label, ...}, maxFrameSize, objectTypes, profileInfo, ...}, output': Layout.t -> unit) = let open Layout val output = output' in output (record [("handlesSignals", Bool.layout handlesSignals), ("main", Label.layout label), ("maxFrameSize", Bytes.layout maxFrameSize), ("frameOffsets", Vector.layout (Vector.layout Bytes.layout) frameOffsets), ("frameLayouts", Vector.layout (fn {frameOffsetsIndex, isC, size} => record [("frameOffsetsIndex", Int.layout frameOffsetsIndex), ("isC", Bool.layout isC), ("size", Bytes.layout size)]) frameLayouts)]) ; Option.app (profileInfo, fn pi => (output (str "\nProfileInfo:") ; ProfileInfo.layouts (pi, output))) ; output (str "\nObjectTypes:") ; Vector.foreachi (objectTypes, fn (i, ty) => output (seq [str "opt_", Int.layout i, str " = ", ObjectType.layout ty])) ; output (str "\n") ; List.foreach (chunks, fn chunk => Chunk.layouts (chunk, output)) end structure Alloc = struct datatype t = T of Live.t list fun layout (T ds) = List.layout Live.layout ds fun forall (T ds, f) = List.forall (ds, f o Live.toOperand) fun defineLive (T ls, l) = T (l :: ls) fun define (T ds, z) = case Live.fromOperand z of NONE => T ds | SOME d => T (d :: ds) val new: Live.t list -> t = T fun doesDefine (T ls, l': Live.t): bool = let val oper' = Live.toOperand l' in case List.peek (ls, fn l => Operand.interfere (Live.toOperand l, oper')) of NONE => false | SOME l => Live.isSubtype (l, l') end val doesDefine = Trace.trace2 ("Machine.Program.Alloc.doesDefine", layout, Live.layout, Bool.layout) doesDefine end fun typeCheck (program as T {chunks, frameLayouts, frameOffsets, intInfs, maxFrameSize, objectTypes, profileInfo, reals, vectors, ...}) = let val _ = if !Control.profile = Control.ProfileTimeLabel then List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {kind, label, statements, ...} => if (case kind of Kind.Func => true | _ => false) orelse (0 < Vector.length statements andalso (case Vector.sub (statements, 0) of Statement.ProfileLabel _ => true | _ => false)) then () else print (concat ["missing profile info: ", Label.toString label, "\n"]))) else () val profileLabelIsOk = case profileInfo of NONE => if !Control.profile = Control.ProfileNone then fn _ => false else Error.bug "Machine.Program.typeCheck.profileLabelIsOk: profileInfo = NONE" | SOME (ProfileInfo.T {frameSources, labels = profileLabels, ...}) => if !Control.profile = Control.ProfileNone orelse (Vector.length frameSources <> Vector.length frameLayouts) then Error.bug "Machine.Program.typeCheck.profileLabelIsOk: profileInfo = SOME" else let val {get = profileLabelCount, ...} = Property.get (ProfileLabel.plist, Property.initFun (fn _ => ref 0)) val _ = Vector.foreach (profileLabels, fn {label, ...} => let val r = profileLabelCount label in if 0 = !r then r := 1 else Error.bug "Machine.Program.typeCheck.profileLabelIsOk: duplicate profile label" end) in fn l => let val r = profileLabelCount l in if 1 = !r then (r := 2; true) else false end end fun getFrameInfo (FrameInfo.T {frameLayoutsIndex, ...}) = Vector.sub (frameLayouts, frameLayoutsIndex) val _ = Vector.foreach (frameLayouts, fn {frameOffsetsIndex, size, ...} => Err.check ("frameLayouts", fn () => (0 <= frameOffsetsIndex andalso frameOffsetsIndex < Vector.length frameOffsets andalso Bytes.<= (size, maxFrameSize) andalso Bytes.<= (size, Runtime.maxFrameSize) andalso Bytes.isWord32Aligned size), fn () => Layout.record [("frameOffsetsIndex", Int.layout frameOffsetsIndex), ("size", Bytes.layout size)])) val _ = Vector.foreach (objectTypes, fn ty => Err.check ("objectType", fn () => ObjectType.isOk ty, fn () => ObjectType.layout ty)) fun tyconTy (opt: ObjptrTycon.t): ObjectType.t = Vector.sub (objectTypes, ObjptrTycon.index opt) open Layout fun globals (name, gs, isOk, layout) = List.foreach (gs, fn (g, s) => let val ty = Global.ty g in Err.check (concat ["global ", name], fn () => isOk (ty, s), fn () => seq [layout s, str ": ", Type.layout ty]) end) val _ = globals ("real", reals, fn (t, r) => Type.equals (t, Type.real (RealX.size r)), RealX.layout) val _ = globals ("intInf", intInfs, fn (t, _) => Type.isSubtype (t, Type.intInf ()), IntInf.layout) val _ = globals ("vector", vectors, fn (t, v) => Type.equals (t, Type.ofWordXVector v), WordXVector.layout) (* Check for no duplicate labels. *) local val {get, ...} = Property.get (Label.plist, Property.initFun (fn _ => ref false)) in val _ = List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {label, ...} => let val r = get label in if !r then Error.bug "Machine.Program.typeCheck: duplicate label" else r := true end)) end val {get = labelBlock: Label.t -> Block.t, set = setLabelBlock, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("block", Label.layout)) val _ = List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn b as Block.T {label, ...} => setLabelBlock (label, b))) fun checkOperand (x: Operand.t, alloc: Alloc.t): unit = let datatype z = datatype Operand.t fun ok () = case x of ArrayOffset {base, index, offset, scale, ty} => (checkOperand (base, alloc) ; checkOperand (index, alloc) ; (Operand.isLocation base andalso (Type.arrayOffsetIsOk {base = Operand.ty base, index = Operand.ty index, offset = offset, tyconTy = tyconTy, result = ty, scale = scale}))) | Cast (z, t) => (checkOperand (z, alloc) ; (Type.castIsOk {from = Operand.ty z, to = t, tyconTy = tyconTy})) | Contents {oper, ...} => (checkOperand (oper, alloc) ; Type.isCPointer (Operand.ty oper)) | Frontier => true | GCState => true | Global _ => (* We don't check that globals are defined because * they aren't captured by liveness info. It would * be nice to fix this. *) true | Label l => (let val _ = labelBlock l in true end handle _ => false) | Null => true | Offset {base, offset, ty} => (checkOperand (base, alloc) ; (Operand.isLocation base andalso (case base of Operand.GCState => true | _ => Type.offsetIsOk {base = Operand.ty base, offset = offset, tyconTy = tyconTy, result = ty}))) | Real _ => true | Register r => Alloc.doesDefine (alloc, Live.Register r) | StackOffset (so as StackOffset.T {offset, ty, ...}) => Bytes.<= (Bytes.+ (offset, Type.bytes ty), maxFrameSize) andalso Alloc.doesDefine (alloc, Live.StackOffset so) andalso (case Type.deLabel ty of NONE => true | SOME l => let val Block.T {kind, ...} = labelBlock l fun doit fi = let val {size, ...} = getFrameInfo fi in Bytes.equals (size, Bytes.+ (offset, Runtime.labelSize ())) end in case kind of Kind.Cont {frameInfo, ...} => doit frameInfo | Kind.CReturn {frameInfo, ...} => (case frameInfo of NONE => true | SOME fi => doit fi) | Kind.Func => true | Kind.Handler {frameInfo, ...} => doit frameInfo | Kind.Jump => true end) | StackTop => true | Word _ => true in Err.check ("operand", ok, fn () => Operand.layout x) end fun checkOperands (v, a) = Vector.foreach (v, fn z => checkOperand (z, a)) fun check' (x, name, isOk, layout) = Err.check (name, fn () => isOk x, fn () => layout x) val labelKind = Block.kind o labelBlock fun checkKind (k: Kind.t, alloc: Alloc.t): Alloc.t option = let datatype z = datatype Kind.t exception No fun frame (FrameInfo.T {frameLayoutsIndex}, useSlots: bool, isC: bool): bool = let val {frameOffsetsIndex, isC = isC', ...} = Vector.sub (frameLayouts, frameLayoutsIndex) handle Subscript => raise No in isC = isC' andalso (not useSlots orelse let val Alloc.T zs = alloc val liveOffsets = List.fold (zs, [], fn (z, liveOffsets) => case z of Live.StackOffset (StackOffset.T {offset, ty}) => if Type.isObjptr ty then offset :: liveOffsets else liveOffsets | _ => raise No) val liveOffsets = Array.fromList liveOffsets val () = QuickSort.sortArray (liveOffsets, Bytes.<=) val liveOffsets = Vector.fromArray liveOffsets val liveOffsets' = Vector.sub (frameOffsets, frameOffsetsIndex) handle Subscript => raise No in Vector.equals (liveOffsets, liveOffsets', Bytes.equals) end) end handle No => false fun slotsAreInFrame (fi: FrameInfo.t): bool = let val {size, ...} = getFrameInfo fi in Alloc.forall (alloc, fn z => case z of Operand.StackOffset (StackOffset.T {offset, ty}) => Bytes.<= (Bytes.+ (offset, Type.bytes ty), size) | _ => false) end in case k of Cont {args, frameInfo} => if frame (frameInfo, true, false) andalso slotsAreInFrame frameInfo then SOME (Vector.fold (args, alloc, fn (z, alloc) => Alloc.defineLive (alloc, z))) else NONE | CReturn {dst, frameInfo, func, ...} => let val ok = (case dst of NONE => true | SOME z => Type.isSubtype (CFunction.return func, Live.ty z)) andalso (if CFunction.mayGC func then (case frameInfo of NONE => false | SOME fi => (frame (fi, true, true) andalso slotsAreInFrame fi)) else if !Control.profile = Control.ProfileNone then true else (case frameInfo of NONE => false | SOME fi => frame (fi, false, true))) in if ok then SOME (case dst of NONE => alloc | SOME z => Alloc.defineLive (alloc, z)) else NONE end | Func => SOME alloc | Handler {frameInfo, ...} => if frame (frameInfo, false, false) then SOME alloc else NONE | Jump => SOME alloc end fun checkStatement (s: Statement.t, alloc: Alloc.t) : Alloc.t option = let datatype z = datatype Statement.t in case s of Move {dst, src} => let val _ = checkOperand (src, alloc) val alloc = Alloc.define (alloc, dst) val _ = checkOperand (dst, alloc) in if Type.isSubtype (Operand.ty src, Operand.ty dst) andalso Operand.isLocation dst then SOME alloc else NONE end | Noop => SOME alloc | PrimApp {args, dst, prim, ...} => let val _ = checkOperands (args, alloc) val alloc = case dst of NONE => SOME alloc | SOME z => let val alloc = Alloc.define (alloc, z) val _ = checkOperand (z, alloc) in SOME alloc end val ok = Type.checkPrimApp {args = Vector.map (args, Operand.ty), prim = prim, result = Option.map (dst, Operand.ty)} in if ok then alloc else NONE end | ProfileLabel l => if profileLabelIsOk l then SOME alloc else NONE end fun liveIsOk (live: Live.t vector, a: Alloc.t): bool = Vector.forall (live, fn z => Alloc.doesDefine (a, z)) fun liveSubset (live: Live.t vector, live': Live.t vector): bool = Vector.forall (live, fn z => Vector.exists (live', fn z' => Live.equals (z, z'))) fun goto (Block.T {live, raises = raises', returns = returns', ...}, raises: Live.t vector option, returns: Live.t vector option, alloc: Alloc.t): bool = liveIsOk (live, alloc) andalso (case (raises, raises') of (_, NONE) => true | (SOME gs, SOME gs') => Vector.equals (gs', gs, Live.isSubtype) | _ => false) andalso (case (returns, returns') of (_, NONE) => true | (SOME os, SOME os') => Vector.equals (os', os, Live.isSubtype) | _ => false) fun checkCont (cont: Label.t, size: Bytes.t, alloc: Alloc.t) = let val Block.T {kind, live, ...} = labelBlock cont in if Vector.forall (live, fn z => Alloc.doesDefine (alloc, z)) then (case kind of Kind.Cont {args, frameInfo, ...} => (if Bytes.equals (size, #size (getFrameInfo frameInfo)) then SOME (live, SOME (Vector.map (args, fn z => case z of Live.StackOffset s => Live.StackOffset (StackOffset.shift (s, size)) | _ => z))) else NONE) | _ => NONE) else NONE end fun callIsOk {alloc: Alloc.t, dst: Label.t, live: Live.t vector, raises: Live.t vector option, return, returns: Live.t vector option} = let val {raises, returns, size} = case return of NONE => {raises = raises, returns = returns, size = Bytes.zero} | SOME {handler, return, size} => let val (contLive, returns) = Err.check' ("cont", fn () => checkCont (return, size, alloc), fn () => Label.layout return) fun checkHandler () = case handler of NONE => SOME raises | SOME h => let val Block.T {kind, live, ...} = labelBlock h in if liveSubset (live, contLive) then (case kind of Kind.Handler {handles, ...} => SOME (SOME handles) | _ => NONE) else NONE end val raises = Err.check' ("handler", checkHandler, fn () => Option.layout Label.layout handler) in {raises = raises, returns = returns, size = size} end val b = labelBlock dst val alloc = Alloc.T (Vector.fold (live, [], fn (z, ac) => case z of Live.StackOffset (StackOffset.T {offset, ty}) => if Bytes.< (offset, size) then ac else (Live.StackOffset (StackOffset.T {offset = Bytes.- (offset, size), ty = ty})) :: ac | _ => ac)) in goto (b, raises, returns, alloc) end fun transferOk (t: Transfer.t, raises: Live.t vector option, returns: Live.t vector option, alloc: Alloc.t): bool = let fun jump (l: Label.t, a: Alloc.t) = let val b as Block.T {kind, ...} = labelBlock l in (case kind of Kind.Jump => true | _ => false) andalso goto (b, raises, returns, a) end datatype z = datatype Transfer.t in case t of Arith {args, dst, overflow, prim, success, ...} => let val _ = checkOperands (args, alloc) val alloc = Alloc.define (alloc, dst) val _ = checkOperand (dst, alloc) in Prim.mayOverflow prim andalso jump (overflow, alloc) andalso jump (success, alloc) andalso Type.checkPrimApp {args = Vector.map (args, Operand.ty), prim = prim, result = SOME (Operand.ty dst)} end | CCall {args, frameInfo = fi, func, return} => let val _ = checkOperands (args, alloc) in CFunction.isOk (func, {isUnit = Type.isUnit}) andalso Vector.equals (args, CFunction.args func, fn (z, t) => Type.isSubtype (Operand.ty z, t)) andalso case return of NONE => true | SOME l => let val Block.T {live, ...} = labelBlock l in liveIsOk (live, alloc) andalso case labelKind l of Kind.CReturn {frameInfo = fi', func = f, ...} => CFunction.equals (func, f) andalso (Option.equals (fi, fi', FrameInfo.equals)) | _ => false end end | Call {label, live, return} => Vector.forall (live, fn z => Alloc.doesDefine (alloc, z)) andalso callIsOk {alloc = alloc, dst = label, live = live, raises = raises, return = return, returns = returns} | Goto l => jump (l, alloc) | Raise => (case raises of NONE => false | SOME zs => Vector.forall (zs, fn z => Alloc.doesDefine (alloc, z))) | Return => (case returns of NONE => false | SOME zs => Vector.forall (zs, fn z => Alloc.doesDefine (alloc, z))) | Switch s => Switch.isOk (s, {checkUse = fn z => checkOperand (z, alloc), labelIsOk = fn l => jump (l, alloc)}) end val transferOk = Trace.trace ("Machine.Program.typeCheck.transferOk", fn (t, _, _, a) => Layout.tuple [Transfer.layout t, Alloc.layout a], Bool.layout) transferOk fun blockOk (Block.T {kind, live, raises, returns, statements, transfer, ...}): bool = let val live = Vector.toList live val _ = Err.check ("live", fn () => let fun loop zs = case zs of [] => true | z :: zs => List.forall (zs, fn z' => not (Live.interfere (z, z'))) in loop live end, fn () => List.layout Live.layout live) val alloc = Alloc.new live val alloc = Err.check' ("kind", fn () => checkKind (kind, alloc), fn () => Kind.layout kind) val alloc = Vector.fold (statements, alloc, fn (s, alloc) => Err.check' ("statement", fn () => checkStatement (s, alloc), fn () => Statement.layout s)) val _ = Err.check ("transfer", fn () => transferOk (transfer, raises, returns, alloc), fn () => Transfer.layout transfer) in true end val _ = List.foreach (chunks, fn Chunk.T {blocks, ...} => let in Vector.foreach (blocks, fn b => check' (b, "block", blockOk, Block.layout)) end) val _ = clear program in () end handle Err.E e => (Layout.outputl (Err.layout e, Out.error) ; Error.bug "Machine.typeCheck") fun clearLabelNames (T {chunks, ...}): unit = List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {label, ...} => Label.clearPrintName label)) end end mlton-20100608/mlton/backend/machine.sig0000644000076600000240000002303111404435623016410 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MACHINE_STRUCTS = sig include ATOMS end signature MACHINE = sig include MACHINE_STRUCTS structure ObjectType: OBJECT_TYPE structure ObjptrTycon: OBJPTR_TYCON structure Runtime: RUNTIME structure Switch: SWITCH structure Type: REP_TYPE sharing Atoms = Type sharing Atoms = Switch sharing ObjectType = Type.ObjectType sharing ObjptrTycon = ObjectType.ObjptrTycon = Type.ObjptrTycon sharing Runtime = ObjectType.Runtime = Type.Runtime structure ChunkLabel: ID structure Register: sig type t val equals: t * t -> bool val index: t -> int val indexOpt: t -> int option val layout: t -> Layout.t val new: Type.t * int option -> t val setIndex: t * int -> unit val toString: t -> string val ty: t -> Type.t end structure Global: sig type t val equals: t * t -> bool val index: t -> int val isRoot: t -> bool val layout: t -> Layout.t val new: {isRoot: bool, ty: Type.t} -> t val numberOfNonRoot: unit -> int val numberOfType: CType.t -> int val ty: t -> Type.t end structure StackOffset: sig datatype t = T of {offset: Bytes.t, ty: Type.t} val ty: t -> Type.t end structure Scale: SCALE sharing Scale = Type.Scale structure Operand: sig datatype t = ArrayOffset of {base: t, index: t, offset: Bytes.t, scale: Scale.t, ty: Type.t} | Cast of t * Type.t | Contents of {oper: t, ty: Type.t} | Frontier | GCState | Global of Global.t | Label of Label.t | Null | Offset of {base: t, offset: Bytes.t, ty: Type.t} | Real of RealX.t | Register of Register.t | StackOffset of StackOffset.t | StackTop | Word of WordX.t val equals: t * t -> bool val interfere: t * t -> bool val isLocation: t -> bool val layout: t -> Layout.t val stackOffset: {offset: Bytes.t, ty: Type.t} -> t val toString: t -> string val ty: t -> Type.t end sharing Operand = Switch.Use structure Live: sig datatype t = Global of Global.t | Register of Register.t | StackOffset of StackOffset.t val equals: t * t -> bool val fromOperand: Operand.t -> t option val layout: t -> Layout.t val toOperand: t -> Operand.t val ty: t -> Type.t end structure Statement: sig datatype t = (* When registers or offsets appear in operands, there is an * implicit contents of. * When they appear as locations, there is not. *) Move of {dst: Operand.t, src: Operand.t} | Noop | PrimApp of {args: Operand.t vector, dst: Operand.t option, prim: Type.t Prim.t} | ProfileLabel of ProfileLabel.t val foldOperands: t * 'a * (Operand.t * 'a -> 'a) -> 'a val layout: t -> Layout.t val move: {dst: Operand.t, src: Operand.t} -> t (* Error if dsts and srcs aren't of same length. *) val moves: {dsts: Operand.t vector, srcs: Operand.t vector} -> t vector val object: {dst: Operand.t, header: word, size: Bytes.t} -> t vector end structure FrameInfo: sig datatype t = T of {frameLayoutsIndex: int} val equals: t * t -> bool val layout: t -> Layout.t end structure Transfer: sig datatype t = (* In an arith transfer, dst is modified whether or not the * prim succeeds. *) Arith of {args: Operand.t vector, dst: Operand.t, overflow: Label.t, prim: Type.t Prim.t, success: Label.t} | CCall of {args: Operand.t vector, frameInfo: FrameInfo.t option, func: Type.t CFunction.t, (* return is NONE iff the func doesn't return. * Else, return must be SOME l, where l is of CReturn * kind with a matching func. *) return: Label.t option} | Call of {label: Label.t, (* label must be a Func *) live: Live.t vector, return: {return: Label.t, handler: Label.t option, size: Bytes.t} option} | Goto of Label.t (* label must be a Jump *) | Raise | Return | Switch of Switch.t val foldOperands: t * 'a * (Operand.t * 'a -> 'a) -> 'a val layout: t -> Layout.t end structure Kind: sig datatype t = Cont of {args: Live.t vector, frameInfo: FrameInfo.t} | CReturn of {dst: Live.t option, frameInfo: FrameInfo.t option, func: Type.t CFunction.t} | Func | Handler of {frameInfo: FrameInfo.t, handles: Live.t vector} | Jump val frameInfoOpt: t -> FrameInfo.t option end structure Block: sig datatype t = T of {kind: Kind.t, label: Label.t, (* Live registers and stack offsets at start of block. *) live: Live.t vector, raises: Live.t vector option, returns: Live.t vector option, statements: Statement.t vector, transfer: Transfer.t} val foldDefs: t * 'a * (Operand.t * 'a -> 'a) -> 'a val label: t -> Label.t end structure Chunk: sig datatype t = T of {blocks: Block.t vector, chunkLabel: ChunkLabel.t, (* Register.index r * <= regMax (Type.toCType (Register.ty r)) * for all registers in the chunk. *) regMax: CType.t -> int} end structure ProfileInfo: sig datatype t = T of {(* For each frame, gives the index into sourceSeqs of the * source functions corresponding to the frame. *) frameSources: int vector, labels: {label: ProfileLabel.t, sourceSeqsIndex: int} vector, names: string vector, (* Each sourceSeq describes a sequence of source functions, * each given as an index into the source vector. *) sourceSeqs: int vector vector, sources: {nameIndex: int, successorsIndex: int} vector} val empty: t val modify: t -> {newProfileLabel: ProfileLabel.t -> ProfileLabel.t, delProfileLabel: ProfileLabel.t -> unit, getProfileInfo: unit -> t} end structure Program: sig datatype t = T of {chunks: Chunk.t list, frameLayouts: {frameOffsetsIndex: int, isC: bool, size: Bytes.t} vector, (* Each vector in frame Offsets specifies the offsets * of live pointers in a stack frame. A vector is referred * to by index as the offsetsIndex in frameLayouts. *) frameOffsets: Bytes.t vector vector, handlesSignals: bool, intInfs: (Global.t * IntInf.t) list, main: {chunkLabel: ChunkLabel.t, label: Label.t}, maxFrameSize: Bytes.t, objectTypes: Type.ObjectType.t vector, profileInfo: ProfileInfo.t option, reals: (Global.t * RealX.t) list, vectors: (Global.t * WordXVector.t) list} val frameSize: t * FrameInfo.t -> Bytes.t val clearLabelNames: t -> unit val layouts: t * (Layout.t -> unit) -> unit val typeCheck: t -> unit end end mlton-20100608/mlton/backend/object-type.sig0000644000076600000240000000133411404435623017233 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature OBJECT_TYPE = sig structure ObjptrTycon: OBJPTR_TYCON structure Runtime: RUNTIME type ty datatype t = Array of {elt: ty, hasIdentity: bool} | Normal of {hasIdentity: bool, ty: ty} | Stack | Weak of ty option (* in Weak (SOME t), must have Type.isPointer t *) val basic: unit -> (ObjptrTycon.t * t) vector val isOk: t -> bool val layout: t -> Layout.t val toRuntime: t -> Runtime.RObjectType.t end mlton-20100608/mlton/backend/objptr-tycon.fun0000644000076600000240000000241011404435623017442 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ObjptrTycon (S: OBJPTR_TYCON_STRUCTS): OBJPTR_TYCON = struct open S datatype t = T of {index: int ref} local fun make f (T r) = f r in val index = ! o (make #index) end local val c = Counter.new 0 in fun new () = T {index = ref (Counter.next c)} end fun setIndex (T {index = r}, i) = r := i fun fromIndex i = T {index = ref i} fun compare (opt, opt') = Int.compare (index opt, index opt') fun equals (opt, opt') = index opt = index opt' val op <= = fn (opt, opt') => index opt <= index opt' fun toString (opt: t): string = concat ["opt_", Int.toString (index opt)] val layout = Layout.str o toString val stack = new () val thread = new () val weakGone = new () local val word8Vector = new () val word16Vector = new () val word32Vector = new () val word64Vector = new () in fun wordVector (b: Bits.t): t = case Bits.toInt b of 8 => word8Vector | 16 => word16Vector | 32 => word32Vector | 64 => word64Vector | _ => Error.bug "ObjptrTycon.wordVector" end end mlton-20100608/mlton/backend/objptr-tycon.sig0000644000076600000240000000146011404435623017440 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature OBJPTR_TYCON_STRUCTS = sig end signature OBJPTR_TYCON = sig include OBJPTR_TYCON_STRUCTS type t val <= : t * t -> bool val compare: t * t -> Relation.t val equals: t * t -> bool val fromIndex: int -> t val index: t -> int (* index into objectTypes array *) val layout: t -> Layout.t val new: unit -> t val setIndex: t * int -> unit val toString: t -> string (* See gc/object.h. *) val stack: t val thread: t val weakGone: t val wordVector: Bits.t -> t end mlton-20100608/mlton/backend/packed-representation.fun0000644000076600000240000034536511404435623021322 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Has a special case to make sure that true is represented as 1 * and false is represented as 0. *) functor PackedRepresentation (S: REPRESENTATION_STRUCTS): REPRESENTATION = struct open S local open Rssa in structure Block = Block structure Kind = Kind structure Label = Label structure ObjectType = ObjectType structure Operand = Operand structure ObjptrTycon = ObjptrTycon structure Prim = Prim structure RealSize = RealSize structure Runtime = Runtime structure Scale = Scale structure Statement = Statement structure Switch = Switch structure Transfer = Transfer structure Type = Type structure Var = Var structure WordSize = WordSize structure WordX = WordX end structure S = Ssa local open Ssa in structure Base = Base structure Con = Con structure ObjectCon = ObjectCon structure Prod = Prod structure Tycon = Tycon end datatype z = datatype Operand.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure Type = struct open Type local fun mkPadToCheck (t: t, mk): (Bits.t * (unit -> t) -> t) = let val b = width t fun check (b', continue) = if Bits.< (b, b') then let val pad = zero (Bits.- (b', b)) in mk (t, pad) end else if Bits.equals (b, b') then t else continue () in check end fun mkPadToPrim (t: t, mk): t = let val check = mkPadToCheck (t, mk) in check (Bits.zero, fn () => check (Bits.inWord8, fn () => check (Bits.inWord16, fn () => check (Bits.inWord32, fn () => check (Bits.inWord64, fn () => Error.bug "PackedRepresentation.Type.mkPadToPrim"))))) end fun mkPadToWidth (t: t, b': Bits.t, mk): t = let val check = mkPadToCheck (t, mk) in check (b', fn () => Error.bug "PackedRepresentation.Type.mkPadToWidth") end fun mk (t, pad) = seq (Vector.new2 (t, pad)) fun mkLow (t, pad) = seq (Vector.new2 (pad, t)) in fun padToPrim (t: t): t = mkPadToPrim (t, mk) fun padToPrimLow (t: t): t = mkPadToPrim (t, mkLow) fun padToWidth (t: t, b: Bits.t): t = mkPadToWidth (t, b, mk) fun padToWidthLow (t: t, b: Bits.t): t = mkPadToWidth (t, b, mkLow) end val padToPrim = Trace.trace ("PackedRepresentation.Type.padToPrim", layout, layout) padToPrim val padToPrimLow = Trace.trace ("PackedRepresentation.Type.padToPrimLow", layout, layout) padToPrimLow val padToWidth = Trace.trace2 ("PackedRepresentation.Type.padToWidth", layout, Bits.layout, layout) padToWidth val padToWidthLow = Trace.trace2 ("PackedRepresentation.Type.padToWidthLow", layout, Bits.layout, layout) padToWidthLow end structure Rep = struct datatype rep = NonObjptr | Objptr of {endsIn00: bool} datatype t = T of {rep: rep, ty: Type.t} fun layout (T {rep, ty}) = let open Layout in record [("rep", case rep of NonObjptr => str "NonObjptr" | Objptr {endsIn00} => seq [str "Objptr ", record [("endsIn00", Bool.layout endsIn00)]]), ("ty", Type.layout ty)] end local fun make f (T r) = f r in val ty = make #ty val rep = make #rep end fun equals (r, r') = Type.equals (ty r, ty r') val equals = Trace.trace2 ("PackedRepresentation.Rep.equals", layout, layout, Bool.layout) equals fun nonObjptr ty = T {rep = NonObjptr, ty = ty} val bool = nonObjptr Type.bool val width = Type.width o ty val unit = T {rep = NonObjptr, ty = Type.unit} fun isObjptr (T {rep, ...}) = case rep of Objptr _ => true | _ => false fun isObjptrEndingIn00 (T {rep, ...}) = case rep of Objptr {endsIn00} => endsIn00 | _ => false fun padToWidth (r as T {rep, ty}, width: Bits.t) = if Bits.equals (Type.width ty, width) then r else case rep of NonObjptr => T {rep = NonObjptr, ty = Type.padToWidth (ty, width)} | Objptr _ => Error.bug "PackedRepresentation.Rep.padToWidth" fun padToWidthLow (r as T {rep, ty}, width: Bits.t) = if Bits.equals (Type.width ty, width) then r else case rep of NonObjptr => T {rep = NonObjptr, ty = Type.padToWidthLow (ty, width)} | Objptr _ => Error.bug "PackedRepresentation.Rep.padToWidth" end structure Statement = struct open Statement local fun make prim (z1: Operand.t, z2: Operand.t) = let val ty = Operand.ty z1 val tmp = Var.newNoname () in (PrimApp {args = Vector.new2 (z1, z2), dst = SOME (tmp, ty), prim = prim (WordSize.fromBits (Type.width ty))}, Var {ty = ty, var = tmp}) end in val andb = make Prim.wordAndb val lshift = make Prim.wordLshift val orb = make Prim.wordOrb val rshift = make (fn s => Prim.wordRshift (s, {signed = false})) end end structure WordRep = struct (* WordRep describes the representation of (some of) the components in a * tuple as a word. * Components are stored from lowest to highest, just like in Type.seq. * The width of the rep must be less than the width of an objptr. * The sum of the widths of the component reps must be equal to the * width of the rep. *) datatype t = T of {components: {index: int, rep: Rep.t} vector, rep: Rep.t} fun layout (T {components, rep}) = let open Layout in record [("components", Vector.layout (fn {index, rep} => record [("index", Int.layout index), ("rep", Rep.layout rep)]) components), ("rep", Rep.layout rep)] end local fun make f (T r) = f r in val rep = make #rep end val unit = T {components = Vector.new0 (), rep = Rep.unit} fun equals (wr, wr') = Rep.equals (rep wr, rep wr') fun make {components, rep} = if Bits.<= (Rep.width rep, Control.Target.Size.objptr ()) andalso Bits.equals (Vector.fold (components, Bits.zero, fn ({rep, ...}, ac) => Bits.+ (ac, Rep.width rep)), Rep.width rep) then T {components = components, rep = rep} else Error.bug "PackedRepresentation.WordRep.make" val make = Trace.trace ("PackedRepresentation.WordRep.make", layout o T, layout) make fun padToWidth (T {components, rep}, b: Bits.t): t = let val newRep = Rep.padToWidth (rep, b) val padBits = Bits.- (Rep.width newRep, Rep.width rep) val newComponent = {index = ~1, rep = Rep.nonObjptr (Type.bits padBits)} val newComponents = Vector.concat [components, Vector.new1 newComponent] in make {components = newComponents, rep = newRep} end fun padToWidthLow (T {components, rep}, b: Bits.t): t = let val newRep = Rep.padToWidthLow (rep, b) val padBits = Bits.- (Rep.width newRep, Rep.width rep) val newComponent = {index = ~1, rep = Rep.nonObjptr (Type.bits padBits)} val newComponents = Vector.concat [Vector.new1 newComponent, components] in make {components = newComponents, rep = newRep} end fun tuple (T {components, ...}, {dst = (dstVar, dstTy): Var.t * Type.t, src: {index: int} -> Operand.t}): Statement.t list = let val bits = Type.width dstTy val (accOpt,_,statements) = Vector.fold (components, (NONE,Bits.zero,[]), fn ({index, rep, ...}, (accOpt,shift,statements)) => if index < 0 then (accOpt, Bits.+ (shift, Rep.width rep), statements) else let val (src, ss) = Statement.resize (src {index = index}, Type.bits bits) val ss = List.rev ss val (src, ss) = if Bits.equals (shift, Bits.zero) then (src, ss) else let val (s, src) = Statement.lshift (src, Operand.word (WordX.fromIntInf (Bits.toIntInf shift, WordSize.shiftArg))) in (src, s :: ss) end val (acc, ss) = case accOpt of NONE => (src, ss) | SOME acc => let val (s, acc) = Statement.orb (src, acc) in (acc, s :: ss) end in (SOME acc, Bits.+ (shift, Rep.width rep), ss :: statements) end) val (src, statements) = case accOpt of NONE => (Operand.word (WordX.zero (WordSize.fromBits bits)), []) | SOME acc => (acc, statements) val statements = [Bind {dst = (dstVar, dstTy), isMutable = false, src = src}] :: statements in List.fold (statements, [], fn (ss, ac) => List.fold (ss, ac, op ::)) end val tuple = Trace.trace ("PackedRepresentation.WordRep.tuple", layout o #1, List.layout Statement.layout) tuple end structure Component = struct datatype t = Direct of {index: int, rep: Rep.t} | Word of WordRep.t fun layout c = let open Layout in case c of Direct {index, rep} => seq [str "Direct ", record [("index", Int.layout index), ("rep", Rep.layout rep)]] | Word wr => seq [str "Word ", WordRep.layout wr] end val rep: t -> Rep.t = fn Direct {rep, ...} => rep | Word wr => WordRep.rep wr val ty = Rep.ty o rep val unit = Word WordRep.unit val equals: t * t -> bool = fn z => case z of (Direct {rep = r, ...}, Direct {rep = r', ...}) => Rep.equals (r, r') | (Word wr, Word wr') => WordRep.equals (wr, wr') | _ => false local fun mkPadToWidth (c: t, b: Bits.t, repPadToWidth, wordRepPadToWidth): t = case c of Direct {index, rep} => Direct {index = index, rep = repPadToWidth (rep, b)} | Word r => Word (wordRepPadToWidth (r, b)) in fun padToWidth (c, b) = mkPadToWidth (c, b, Rep.padToWidth, WordRep.padToWidth) fun padToWidthLow (c, b) = mkPadToWidth (c, b, Rep.padToWidthLow, WordRep.padToWidthLow) end local fun mkPadToPrim (c: t, typePadToPrim, padToWidth) = let val ty = ty c val ty' = typePadToPrim ty in if Type.equals (ty, ty') then c else padToWidth (c, Type.width ty') end in fun padToPrim c = mkPadToPrim (c, Type.padToPrim, padToWidth) fun padToPrimLow c = mkPadToPrim (c, Type.padToPrimLow, padToWidthLow) end fun tuple (c: t, {dst: Var.t * Type.t, src: {index: int} -> Operand.t}) : Statement.t list = case c of Direct {index, ...} => let val (src, ss) = Statement.resize (src {index = index}, #2 dst) in ss @ [Bind {dst = dst, isMutable = false, src = src}] end | Word wr => WordRep.tuple (wr, {dst = dst, src = src}) val tuple = Trace.trace2 ("PackedRepresentation.Component.tuple", layout, fn {dst = (dst, _), ...} => Var.layout dst, List.layout Statement.layout) tuple end structure Unpack = struct datatype t = T of {shift: Bits.t, ty: Type.t} fun layout (T {shift, ty}) = let open Layout in record [("shift", Bits.layout shift), ("ty", Type.layout ty)] end val lshift: t * Bits.t -> t = fn (T {shift, ty}, b) => T {shift = Bits.+ (shift, b), ty = ty} fun select (T {shift, ty}, {dst = (dst, dstTy), src: Operand.t}): Statement.t list = let val (src, ss1) = if Bits.isZero shift then (src, []) else let val shift = WordX.fromIntInf (Bits.toIntInf shift, WordSize.shiftArg) val (s, tmp) = Statement.rshift (src, Operand.word shift) in (tmp, [s]) end val w = Type.width ty val sz = WordSize.fromBits w val w' = Type.width dstTy val sz' = WordSize.fromBits w' val (src, ss2) = Statement.resize (src, dstTy) val (src, ss3) = if Bits.equals (w, w') (* orelse Type.isZero (Type.dropPrefix (Operand.ty src, * WordSize.bits sz)) *) then (src, []) else let val mask = WordX.resize (WordX.max (sz, {signed = false}), sz') val (s, src) = Statement.andb (src, Operand.word mask) in (src, [s]) end in ss1 @ ss2 @ ss3 @ [Bind {dst = (dst, dstTy), isMutable = false, src = src}] end val select = Trace.trace2 ("PackedRepresentation.Unpack.select", layout, fn {dst = (dst, _), src} => Layout.record [("dst", Var.layout dst), ("src", Operand.layout src)], List.layout Statement.layout) select fun update (T {shift, ty}, {chunk: Operand.t, component: Operand.t}): Operand.t * Statement.t list = let val shift = WordX.fromIntInf (Bits.toIntInf shift, WordSize.shiftArg) val chunkTy = Operand.ty chunk val chunkWidth = Type.width chunkTy val mask = Operand.word (WordX.notb (WordX.lshift (WordX.resize (WordX.allOnes (WordSize.fromBits (Type.width ty)), WordSize.fromBits chunkWidth), shift))) val (s1, chunk) = Statement.andb (chunk, mask) val (component, s2) = Statement.resize (component, chunkTy) val (s3, component) = Statement.lshift (component, Operand.word shift) val (s4, result) = Statement.orb (chunk, component) in (result, [s1] @ s2 @ [s3, s4]) end val update = Trace.trace2 ("PackedRepresentation.Unpack.update", layout, fn {chunk, component} => Layout.record [("chunk", Operand.layout chunk), ("component", Operand.layout component)], Layout.tuple2 (Operand.layout, List.layout Statement.layout)) update end structure Base = struct open Base fun toOperand {base: Operand.t t, eltWidth: Bytes.t option, offset: Bytes.t, ty: Type.t}: Operand.t * Statement.t list = case base of Object base => (Offset {base = base, offset = offset, ty = ty}, []) | VectorSub {index, vector} => let val eltWidth = case eltWidth of NONE => Error.bug "PackedRepresentation.Base.toOperand: eltWidth" | SOME w => w in case Scale.fromBytes eltWidth of NONE => let val seqIndexSize = WordSize.seqIndex () val seqIndexTy = Type.word seqIndexSize val prod = Var.newNoname () val s = PrimApp {args = (Vector.new2 (index, Operand.word (WordX.fromIntInf (Bytes.toIntInf eltWidth, seqIndexSize)))), dst = SOME (prod, seqIndexTy), prim = (Prim.wordMul (seqIndexSize, {signed = false}))} in (ArrayOffset {base = vector, index = Var {var = prod, ty = seqIndexTy}, offset = offset, scale = Scale.One, ty = ty}, [s]) end | SOME s => (ArrayOffset {base = vector, index = index, offset = offset, scale = s, ty = ty}, []) end end structure Select = struct datatype t = None | Direct of {ty: Type.t} | Indirect of {offset: Bytes.t, ty: Type.t} | IndirectUnpack of {offset: Bytes.t, rest: Unpack.t, ty: Type.t} | Unpack of Unpack.t fun layout s = let open Layout in case s of None => str "None" | Direct {ty} => seq [str "Direct ", record [("ty", Type.layout ty)]] | Indirect {offset, ty} => seq [str "Indirect ", record [("offset", Bytes.layout offset), ("ty", Type.layout ty)]] | IndirectUnpack {offset, rest, ty} => seq [str "IndirectUnpack ", record [("offset", Bytes.layout offset), ("rest", Unpack.layout rest), ("ty", Type.layout ty)]] | Unpack u => seq [str "Unpack ", Unpack.layout u] end val lshift: t * Bits.t -> t = fn (s, b) => case s of None => None | Direct {ty} => Unpack (Unpack.T {shift = b, ty = ty}) | Unpack u => Unpack (Unpack.lshift (u, b)) | _ => Error.bug "PackedRepresentation.Select.lshift" fun select (s: t, {base: Operand.t Base.t, dst: Var.t * Type.t, eltWidth: Bytes.t option}): Statement.t list = let fun move (src, ss) = let val (dst, dstTy) = dst val (src, ss') = Statement.resize (src, dstTy) in ss @ ss' @ [Bind {dst = (dst, dstTy), isMutable = false, src = src}] end in case s of None => [] | Direct _ => move (Base.object base, []) | Indirect {offset, ty} => move (Base.toOperand {base = base, eltWidth = eltWidth, offset = offset, ty = ty}) | IndirectUnpack {offset, rest, ty} => let val tmpVar = Var.newNoname () val tmpOp = Var {ty = ty, var = tmpVar} val (src, ss) = Base.toOperand {base = base, eltWidth = eltWidth, offset = offset, ty = ty} in ss @ (Bind {dst = (tmpVar, ty), isMutable = false, src = src} :: Unpack.select (rest, {dst = dst, src = tmpOp})) end | Unpack u => Unpack.select (u, {dst = dst, src = Base.object base}) end val select = Trace.trace ("PackedRepresentation.Select.select", layout o #1, List.layout Statement.layout) select fun update (s: t, {base: Operand.t Base.t, eltWidth: Bytes.t option, value: Operand.t}): Statement.t list = case s of Indirect {offset, ty} => let val (dst, ss) = Base.toOperand {base = base, eltWidth = eltWidth, offset = offset, ty = ty} in ss @ [Move {dst = dst, src = value}] end | IndirectUnpack {offset, rest, ty} => let val (chunk, ss) = Base.toOperand {base = base, eltWidth = eltWidth, offset = offset, ty = ty} val (newChunk, ss') = Unpack.update (rest, {chunk = chunk, component = value}) in ss @ ss' @ [Move {dst = chunk, src = newChunk}] end | _ => Error.bug "PackedRepresentation.Select.update: non-indirect" val update = Trace.trace ("PackedRepresentation.Select.update", layout o #1, List.layout Statement.layout) update end structure Selects = struct datatype t = T of {orig: S.Type.t, select: Select.t} vector fun layout (T v) = Vector.layout (Select.layout o #select) v val empty = T (Vector.new0 ()) fun map (T v, f) = T (Vector.map (v, fn {orig, select} => {orig = orig, select = f select})) fun select (T v, {base: Operand.t Base.t, dst: Var.t * Type.t, eltWidth: Bytes.t option, offset: int}): Statement.t list = Select.select (#select (Vector.sub (v, offset)), {base = base, eltWidth = eltWidth, dst = dst}) fun update (T v, {base, eltWidth, offset, value}) = Select.update (#select (Vector.sub (v, offset)), {base = base, eltWidth = eltWidth, value = value}) fun lshift (T v, b: Bits.t) = T (Vector.map (v, fn {orig, select} => {orig = orig, select = Select.lshift (select, b)})) end structure ObjptrRep = struct datatype t = T of {components: {component: Component.t, offset: Bytes.t} vector, componentsTy: Type.t, selects: Selects.t, ty: Type.t, tycon: ObjptrTycon.t} fun layout (T {components, componentsTy, selects, ty, tycon}) = let open Layout in record [("components", Vector.layout (fn {component, offset} => record [("component", Component.layout component), ("offset", Bytes.layout offset)]) components), ("componentsTy", Type.layout componentsTy), ("selects", Selects.layout selects), ("ty", Type.layout ty), ("tycon", ObjptrTycon.layout tycon)] end local fun make f (T r) = f r in val componentsTy = make #componentsTy val ty = make #ty end fun equals (T {tycon = c, ...}, T {tycon = c', ...}) = ObjptrTycon.equals (c, c') fun rep (T {ty, ...}) = Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = ty} fun make {components, isVector, selects, tycon} = let val width = Vector.fold (components, Bytes.zero, fn ({component = c, ...}, ac) => Bytes.+ (ac, Type.bytes (Component.ty c))) val padBytes: Bytes.t = if isVector then let val alignWidth = case !Control.align of Control.Align4 => width | Control.Align8 => if (Vector.exists (components, fn {component = c, ...} => (case Type.deReal (Component.ty c) of NONE => false | SOME s => RealSize.equals (s, RealSize.R64)) orelse (case Type.deWord (Component.ty c) of NONE => false | SOME s => WordSize.equals (s, WordSize.word64)) orelse (Type.isObjptr (Component.ty c) andalso WordSize.equals (WordSize.objptr (), WordSize.word64)))) then Bytes.alignWord64 width else width in Bytes.- (alignWidth, width) end else let (* An object needs space for a forwarding objptr. *) val width' = Bytes.max (width, Runtime.objptrSize ()) (* Note that with Align8 and objptrSize == 64bits, * the following ensures that objptrs will be * mod 8 aligned. *) val width'' = Bytes.+ (width', Runtime.headerSize ()) val alignWidth'' = case !Control.align of Control.Align4 => Bytes.alignWord32 width'' | Control.Align8 => Bytes.alignWord64 width'' val alignWidth' = Bytes.- (alignWidth'', Runtime.headerSize ()) in Bytes.- (alignWidth', width) end val (components, selects) = if Bytes.isZero padBytes then (components, selects) else (* Need to insert a pad before the first objptr. *) let val {no = nonObjptrs, yes = objptrs} = Vector.partition (components, fn {component = c, ...} => Rep.isObjptr (Component.rep c)) val padOffset = if 0 = Vector.length objptrs then width else #offset (Vector.sub (objptrs, 0)) val pad = (#1 o Vector.unfoldi) ((Bytes.toInt padBytes) div (Bytes.toInt Bytes.inWord32), padOffset, fn (_, padOffset) => ({component = (Component.padToWidth (Component.unit, Bits.inWord32)), offset = padOffset}, Bytes.+ (padOffset, Bytes.inWord32))) val objptrs = Vector.map (objptrs, fn {component = c, offset} => {component = c, offset = Bytes.+ (offset, padBytes)}) val components = Vector.concat [nonObjptrs, pad, objptrs] val selects = Selects.map (selects, fn s => case s of Select.Indirect {offset, ty} => if Bytes.>= (offset, padOffset) then Select.Indirect {offset = Bytes.+ (offset, padBytes), ty = ty} else s | _ => s) in (components, selects) end val componentsTy = Type.seq (Vector.map (components, Component.ty o #component)) (* If there are no components, then add a pad. *) val componentsTy = if Bits.isZero (Type.width componentsTy) then Type.zero (case !Control.align of Control.Align4 => Bits.inWord32 | Control.Align8 => Bits.inWord64) else componentsTy in T {components = components, componentsTy = componentsTy, selects = selects, ty = Type.objptr tycon, tycon = tycon} end val make = let open Layout in Trace.trace ("PackedRepresentation.ObjptrRep.make", fn {components, isVector, selects, tycon} => record [("components", Vector.layout (fn {component, offset} => record [("component", Component.layout component), ("offset", Bytes.layout offset)]) components), ("isVector", Bool.layout isVector), ("selects", Selects.layout selects), ("tycon", ObjptrTycon.layout tycon)], layout) end make fun box (component: Component.t, opt: ObjptrTycon.t, selects: Selects.t) = let val selects = Selects.map (selects, fn s => let datatype z = datatype Select.t in case s of None => None | Direct {ty} => Indirect {offset = Bytes.zero, ty = ty} | Unpack u => IndirectUnpack {offset = Bytes.zero, rest = u, ty = Component.ty component} | _ => Error.bug "PackedRepresentation.ObjptrRep.box: cannot lift selects" end) in make {components = Vector.new1 {component = component, offset = Bytes.zero}, isVector = false, selects = selects, tycon = opt} end fun tuple (T {components, componentsTy, ty, tycon, ...}, {dst = dst: Var.t, src: {index: int} -> Operand.t}) = let val object = Var {ty = ty, var = dst} val stores = Vector.foldr (components, [], fn ({component, offset}, ac) => let val tmpVar = Var.newNoname () val tmpTy = Component.ty component in Component.tuple (component, {dst = (tmpVar, tmpTy), src = src}) @ (Move {dst = Offset {base = object, offset = offset, ty = tmpTy}, src = Var {ty = tmpTy, var = tmpVar}} :: ac) end) in Object {dst = (dst, ty), header = Runtime.typeIndexToHeader (ObjptrTycon.index tycon), size = Bytes.+ (Type.bytes componentsTy, Runtime.headerSize ())} :: stores end val tuple = Trace.trace2 ("PackedRepresentation.ObjptrRep.tuple", layout, Var.layout o #dst, List.layout Statement.layout) tuple end structure TupleRep = struct datatype t = Direct of {component: Component.t, selects: Selects.t} | Indirect of ObjptrRep.t fun layout tr = let open Layout in case tr of Direct {component, selects} => seq [str "Direct ", record [("component", Component.layout component), ("selects", Selects.layout selects)]] | Indirect pr => seq [str "Indirect ", ObjptrRep.layout pr] end val unit = Direct {component = Component.unit, selects = Selects.empty} val equals: t * t -> bool = fn z => case z of (Direct {component = c, ...}, Direct {component = c', ...}) => Component.equals (c, c') | (Indirect pr, Indirect pr') => ObjptrRep.equals (pr, pr') | _ => false fun rep (tr: t): Rep.t = case tr of Direct {component, ...} => Component.rep component | Indirect p => ObjptrRep.rep p val ty = Rep.ty o rep fun selects (tr: t): Selects.t = case tr of Direct {selects, ...} => selects | Indirect (ObjptrRep.T {selects, ...}) => selects fun tuple (tr: t, {dst: Var.t * Type.t, src: {index: int} -> Operand.t}): Statement.t list = case tr of Direct {component = c, ...} => Component.tuple (c, {dst = dst, src = src}) | Indirect pr => ObjptrRep.tuple (pr, {dst = #1 dst, src = src}) val tuple = Trace.trace2 ("PackedRepresentation.TupleRep.tuple", layout, Var.layout o #1 o #dst, List.layout Statement.layout) tuple (* TupleRep.make decides how to layout a sequence of types in an object, * or in the case of a vector, in a vector element. * Vectors are treated slightly specially because we don't require element * widths to be a multiple of the word32 size. * At the front of the object, we place all the word64s, followed by * all the word32s. Then, we pack in all the types that are smaller than a * word32. This is done by packing in a sequence of words, greedily, * starting with the largest type and moving to the smallest. We pad to * ensure that a value never crosses a word32 boundary. Finally, if there * are any objptrs, they go at the end of the object. * * There is some extra logic here to specially represent (boxed) * tuples that are entirely comprised of primitive types. The * primary motivation is that "word8 ref" and "word16 ref" are * FFI types, and must have representations that are compatible * with C. In particular, on a big-endian platform, such * sub-word32 components must be at the low byte offset (but * high bit offset) of the containing word32. *) fun make (objptrTycon: ObjptrTycon.t, rs: {isMutable: bool, rep: Rep.t, ty: S.Type.t} vector, {forceBox: bool, isVector: bool}): t = let val objptrs = ref [] val numObjptrs = ref 0 val word64s = ref [] val numWord64s = ref 0 val word32s = ref [] val numWord32s = ref 0 val subword32s = Array.array (Bits.toInt Bits.inWord32, []) val widthSubword32s = ref 0 val hasNonPrim = ref false val () = Vector.foreachi (rs, fn (i, {rep, ...}) => let fun addDirect (l, n) = (List.push (l, {component = Component.Direct {index = i, rep = rep}, index = i}) ; Int.inc n) fun addSubword32 b = (Array.update (subword32s, b, {index = i, rep = rep} :: Array.sub (subword32s, b)) ; widthSubword32s := !widthSubword32s + b) in case Rep.rep rep of Rep.NonObjptr => let val b = Bits.toInt (Rep.width rep) in case b of 0 => () | 8 => addSubword32 b | 16 => addSubword32 b | 32 => addDirect (word32s, numWord32s) | 64 => addDirect (word64s, numWord64s) | _ => (addSubword32 b ; hasNonPrim := true) end | Rep.Objptr _ => addDirect (objptrs, numObjptrs) end) val selects = Array.array (Vector.length rs, Select.None) val hasNonPrim = !hasNonPrim val numComponents = !numObjptrs + !numWord64s + !numWord32s + (let val widthSubword32s = !widthSubword32s in Int.quot (widthSubword32s, 32) + Int.min (1, Int.rem (widthSubword32s, 32)) end) val needsBox = forceBox orelse Vector.exists (rs, #isMutable) orelse numComponents > 1 val padToPrim = isVector andalso 1 = numComponents val isBigEndian = Control.Target.bigEndian () fun byteShiftToByteOffset (compSz: Bytes.t, tySz: Bytes.t, shift: Bytes.t) = if not isBigEndian then shift else Bytes.- (compSz, Bytes.+ (tySz, shift)) fun simple (l, tyWidth: Bytes.t, offset: Bytes.t, components) = List.fold (l, (offset, components), fn ({component, index}, (offset, ac)) => (Bytes.+ (offset, tyWidth), let val ty = Component.ty component val () = Array.update (selects, index, if needsBox then Select.Indirect {offset = offset, ty = ty} else Select.Direct {ty = ty}) in {component = component, offset = offset} :: ac end)) val offset = Bytes.zero val components = [] val (offset, components) = simple (!word64s, Bytes.inWord64, offset, components) val (offset, components) = simple (!word32s, Bytes.inWord32, offset, components) (* j is the maximum index <= remainingWidth at which an * element of subword32s may be nonempty. *) fun getSubword32Components (j: int, remainingWidth: Bits.t, components) = if 0 = j then Vector.fromListRev components else let val elts = Array.sub (subword32s, j) in case elts of [] => getSubword32Components (j - 1, remainingWidth, components) | {index, rep} :: elts => let val () = Array.update (subword32s, j, elts) val remainingWidth = Bits.- (remainingWidth, Rep.width rep) in getSubword32Components (Bits.toInt remainingWidth, remainingWidth, {index = index, rep = rep} :: components) end end (* max is the maximum index at which an element of * subword32s may be nonempty. *) fun makeSubword32s (max: int, offset: Bytes.t, ac) = if 0 = max then (offset, ac) else if List.isEmpty (Array.sub (subword32s, max)) then makeSubword32s (max - 1, offset, ac) else let val components = getSubword32Components (max, Bits.inWord32, []) val componentTy = Type.seq (Vector.map (components, Rep.ty o #rep)) val component = (Component.Word o WordRep.T) {components = components, rep = Rep.T {rep = Rep.NonObjptr, ty = componentTy}} val (component, componentTy) = if needsBox then if padToPrim then (Component.padToPrim component, Type.padToPrim componentTy) else (Component.padToWidth (component, Bits.inWord32), Type.padToWidth (componentTy, Bits.inWord32)) else (component, componentTy) val _ = Vector.fold (components, Bits.zero, fn ({index, rep}, shift) => let val repTy = Rep.ty rep val repTyWidth = Type.width repTy val repWidth = Rep.width rep val unpack = Unpack.T {shift = shift, ty = repTy} fun getByteOffset () = Bytes.+ (offset, byteShiftToByteOffset (Type.bytes componentTy, Bits.toBytes repTyWidth, Bits.toBytes shift)) val select = if needsBox then if ((Bits.isWord8Aligned shift andalso (Bits.equals (repTyWidth, Bits.inWord8))) orelse (Bits.isWord16Aligned shift andalso (Bits.equals (repTyWidth, Bits.inWord16)))) then (Select.Indirect {offset = getByteOffset (), ty = repTy}) else (Select.IndirectUnpack {offset = offset, rest = unpack, ty = componentTy}) else Select.Unpack unpack val () = Array.update (selects, index, select) in Bits.+ (shift, repWidth) end) val ac = {component = component, offset = offset} :: ac in makeSubword32s (max, (* Either the width of the word rep component * is 32 bits, or this is the only * component, so offset doesn't matter. *) Bytes.+ (offset, Bytes.inWord32), ac) end fun makeSubword32sAllPrims (max: int, offset: Bytes.t, ac) = (* hasNonPrim = false, needsBox = true *) if 0 = max then (offset, ac) else if List.isEmpty (Array.sub (subword32s, max)) then makeSubword32sAllPrims (max - 1, offset, ac) else let val origComponents = getSubword32Components (max, Bits.inWord32, []) val components = if isBigEndian then Vector.rev origComponents else origComponents val componentTy = Type.seq (Vector.map (components, Rep.ty o #rep)) val component = (Component.Word o WordRep.T) {components = components, rep = Rep.T {rep = Rep.NonObjptr, ty = componentTy}} val component = if padToPrim then if isBigEndian then Component.padToPrimLow component else Component.padToPrim component else if isBigEndian then Component.padToWidthLow (component, Bits.inWord32) else Component.padToWidth (component, Bits.inWord32) val _ = Vector.fold (origComponents, offset, fn ({index, rep}, offset) => let val () = Array.update (selects, index, Select.Indirect {offset = offset, ty = Rep.ty rep}) in Bytes.+ (offset, Bits.toBytes (Rep.width rep)) end) val ac = {component = component, offset = offset} :: ac in makeSubword32sAllPrims (max, (* Either the width of the word rep component * is 32 bits, or this is the only * component, so offset doesn't matter. *) Bytes.+ (offset, Bytes.inWord32), ac) end val (offset, components) = if (not hasNonPrim) andalso needsBox then makeSubword32sAllPrims (Array.length subword32s - 1, offset, components) else makeSubword32s (Array.length subword32s - 1, offset, components) val (_, components) = simple (!objptrs, Runtime.objptrSize (), offset, components) val components = Vector.fromListRev components (* val () = Assert.assert ("PackedRepresentation.TupleRep.make", fn () => numComponents = Vector.length components) *) val getSelects = Selects.T (Vector.tabulate (Array.length selects, fn i => {orig = #ty (Vector.sub (rs, i)), select = Array.sub (selects, i)})) in if needsBox then Indirect (ObjptrRep.make {components = components, isVector = isVector, selects = getSelects, tycon = objptrTycon}) else if numComponents = 0 then unit else Direct {component = #component (Vector.sub (components, 0)), selects = getSelects} end val make = Trace.trace3 ("PackedRepresentation.TupleRep.make", ObjptrTycon.layout, Vector.layout (fn {isMutable, rep, ty} => Layout.record [("isMutable", Bool.layout isMutable), ("rep", Rep.layout rep), ("ty", S.Type.layout ty)]), fn {forceBox, isVector} => Layout.record [("forceBox", Bool.layout forceBox), ("isVector", Bool.layout isVector)], layout) make end structure ConRep = struct datatype t = ShiftAndTag of {component: Component.t, selects: Selects.t, tag: WordX.t, ty: Type.t (* alread padded to prim *)} | Tag of {tag: WordX.t, ty: Type.t} | Tuple of TupleRep.t val layout = let open Layout in fn ShiftAndTag {component, selects, tag, ty} => seq [str "ShiftAndTag ", record [("component", Component.layout component), ("selects", Selects.layout selects), ("tag", WordX.layout tag), ("ty", Type.layout ty)]] | Tag {tag, ...} => seq [str "Tag ", WordX.layout tag] | Tuple tr => TupleRep.layout tr end val equals: t * t -> bool = fn (ShiftAndTag {component = c1, tag = t1, ...}, ShiftAndTag {component = c2, tag = t2, ...}) => Component.equals (c1, c2) andalso WordX.equals (t1, t2) | (Tag {tag = t1, ty = ty1}, Tag {tag = t2, ty = ty2}) => WordX.equals (t1, t2) andalso Type.equals (ty1, ty2) | (Tuple tr1, Tuple tr2) => TupleRep.equals (tr1, tr2) | _ => false val rep: t -> Rep.t = fn ShiftAndTag {ty, ...} => Rep.nonObjptr ty | Tag {ty, ...} => Rep.nonObjptr ty | Tuple tr => TupleRep.rep tr val box = Tuple o TupleRep.Indirect local fun make i = let val tag = WordX.fromIntInf (i, WordSize.bool) in Tag {tag = tag, ty = Type.ofWordX tag} end in val falsee = make 0 val truee = make 1 end val unit = Tuple TupleRep.unit fun conApp (r: t, {dst: Var.t * Type.t, src: {index: int} -> Operand.t}): Statement.t list = case r of ShiftAndTag {component, tag, ...} => let val (dstVar, dstTy) = dst val shift = Operand.word (WordX.fromIntInf (Bits.toIntInf (WordSize.bits (WordX.size tag)), WordSize.shiftArg)) val tmpVar = Var.newNoname () val tmpTy = Type.padToWidth (Component.ty component, Type.width dstTy) val tmp = Var {ty = tmpTy, var = tmpVar} val component = Component.tuple (component, {dst = (tmpVar, tmpTy), src = src}) val (s1, tmp) = Statement.lshift (tmp, shift) val mask = Operand.word (WordX.resize (tag, WordSize.fromBits (Type.width (Operand.ty tmp)))) val (s2, tmp) = Statement.orb (tmp, mask) val s3 = Bind {dst = (dstVar, dstTy), isMutable = false, src = tmp} in component @ [s1, s2, s3] end | Tag {tag, ...} => let val (dstVar, dstTy) = dst val src = Operand.word (WordX.resize (tag, WordSize.fromBits (Type.width dstTy))) in [Bind {dst = (dstVar, dstTy), isMutable = false, src = src}] end | Tuple tr => TupleRep.tuple (tr, {dst = dst, src = src}) val conApp = Trace.trace ("PackedRepresentation.ConRep.conApp", layout o #1, List.layout Statement.layout) conApp end structure Block = struct open Block val extra: t list ref = ref [] fun getExtra () = !extra before extra := [] fun new {statements: Statement.t vector, transfer: Transfer.t}: Label.t = let val l = Label.newNoname () val _ = List.push (extra, Block.T {args = Vector.new0 (), kind = Kind.Jump, label = l, statements = statements, transfer = transfer}) in l end end structure Cases = struct type t = {con: Con.t, dst: Label.t, dstHasArg: bool} vector fun layout (v: t): Layout.t = Vector.layout (fn {con, dst, dstHasArg} => Layout.record [("con", Con.layout con), ("dst", Label.layout dst), ("dstHasArg", Bool.layout dstHasArg)]) v end structure Objptrs = struct (* 1 < Vector.length variants *) datatype t = T of {rep: Rep.t, variants: {con: Con.t, objptr: ObjptrRep.t} vector} fun layout (T {rep, variants}) = let open Layout in record [("rep", Rep.layout rep), ("variants", Vector.layout (fn {con, objptr} => record [("con", Con.layout con), ("objptr", ObjptrRep.layout objptr)]) variants)] end local fun make f (T r) = f r in val rep = make #rep end val ty = Rep.ty o rep fun make {rep, variants}: t = T {rep = rep, variants = variants} fun genCase (T {variants, ...}, {cases: Cases.t, conRep: Con.t -> ConRep.t, default: Label.t option, test: Operand.t}) : Statement.t list * Transfer.t = let val cases = Vector.keepAllMap (cases, fn {con, dst, dstHasArg} => case conRep con of ConRep.Tuple (TupleRep.Indirect (ObjptrRep.T {ty, tycon, ...})) => SOME (WordX.fromIntInf (Int.toIntInf (ObjptrTycon.index tycon), WordSize.objptrHeader ()), Block.new {statements = Vector.new0 (), transfer = Goto {args = if dstHasArg then (Vector.new1 (Operand.cast (test, ty))) else Vector.new0 (), dst = dst}}) | _ => NONE) val default = if Vector.length variants = Vector.length cases then NONE else default val cases = QuickSort.sortVector (cases, fn ((w, _), (w', _)) => WordX.le (w, w', {signed = false})) val shift = Operand.word (WordX.one WordSize.shiftArg) val (s, tag) = Statement.rshift (Offset {base = test, offset = Runtime.headerOffset (), ty = Type.objptrHeader ()}, shift) in ([s], Switch (Switch.T {cases = cases, default = default, size = WordSize.objptrHeader (), test = tag})) end end structure Small = struct datatype t = T of {isEnum: bool, rep: Rep.t, tagBits: Bits.t, variants: Con.t vector} fun layout (T {isEnum, rep, tagBits, variants}) = let open Layout in record [("isEnum", Bool.layout isEnum), ("rep", Rep.layout rep), ("tagBits", Bits.layout tagBits), ("variants", Vector.layout Con.layout variants)] end local fun make f (T r) = f r in val rep = make #rep end val bool = T {isEnum = true, rep = Rep.bool, tagBits = Bits.one, variants = Vector.new2 (Con.falsee, Con.truee)} fun genCase (T {isEnum, tagBits, variants, ...}, {cases: Cases.t, conRep: Con.t -> ConRep.t, isObjptr: bool, notSmall: Label.t option, smallDefault: Label.t option, test: Operand.t}) : Statement.t list * Transfer.t = let val tagSize = WordSize.fromBits tagBits val testBits = Type.width (Operand.ty test) val testSize = WordSize.fromBits testBits val cases = Vector.keepAllMap (cases, fn {con, dst, dstHasArg} => case conRep con of ConRep.ShiftAndTag {tag, ty, ...} => let val test = Operand.cast (test, Type.padToWidth (ty, testBits)) val (test, ss) = Statement.resize (test, ty) val transfer = Goto {args = if dstHasArg then Vector.new1 test else Vector.new0 (), dst = dst} in SOME (WordX.resize (tag, testSize), Block.new {statements = Vector.fromList ss, transfer = transfer}) end | ConRep.Tag {tag, ...} => let val transfer = Goto {args = if dstHasArg then Vector.new1 test else Vector.new0 (), dst = dst} in SOME (WordX.resize (tag, testSize), Block.new {statements = Vector.new0 (), transfer = transfer}) end | _ => NONE) val cases = QuickSort.sortVector (cases, fn ((w, _), (w', _)) => WordX.le (w, w', {signed = false})) val tagOp = if isObjptr then Operand.cast (test, Type.bits testBits) else test val (tagOp, ss) = if isEnum then (tagOp, []) else let val mask = Operand.word (WordX.resize (WordX.max (tagSize, {signed = false}), testSize)) val (s, tagOp) = Statement.andb (tagOp, mask) in (tagOp, [s]) end val default = if Vector.length variants = Vector.length cases then notSmall else case (notSmall, smallDefault) of (NONE, _) => smallDefault | (_, NONE) => notSmall | (SOME notSmall, SOME smallDefault) => let val (s, test) = Statement.andb (Operand.cast (test, Type.bits testBits), Operand.word (WordX.fromIntInf (3, testSize))) val t = Switch (Switch.T {cases = Vector.new1 (WordX.zero testSize, notSmall), default = SOME smallDefault, size = testSize, test = test}) in SOME (Block.new {statements = Vector.new1 s, transfer = t}) end val transfer = Switch (Switch.T {cases = cases, default = default, size = testSize, test = tagOp}) in (ss, transfer) end val genCase = Trace.trace ("PackedRepresentation.Small.genCase", fn (s, {test, ...}) => Layout.tuple [layout s, Layout.record [("test", Operand.layout test)]], Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) genCase end structure TyconRep = struct datatype t = One of {con: Con.t, tupleRep: TupleRep.t} | Objptrs of Objptrs.t | Small of Small.t | SmallAndBox of {box: {con: Con.t, objptr: ObjptrRep.t}, rep: Rep.t, small: Small.t} | SmallAndObjptr of {objptr: {component: Component.t, con: Con.t}, rep: Rep.t, small: Small.t} | SmallAndObjptrs of {objptrs: Objptrs.t, rep: Rep.t, small: Small.t} | Unit fun layout (r: t): Layout.t = let open Layout in case r of One {con, tupleRep} => seq [str "One ", record [("con", Con.layout con), ("tupleRep", TupleRep.layout tupleRep)]] | Objptrs ps => seq [str "Objptrs ", Objptrs.layout ps] | Small s => seq [str "Small ", Small.layout s] | SmallAndBox {box = {con, objptr}, rep, small} => seq [str "SmallAndBox ", record [("box", record [("con", Con.layout con), ("objptr", ObjptrRep.layout objptr)]), ("rep", Rep.layout rep), ("small", Small.layout small)]] | SmallAndObjptr {objptr = {component, con}, rep, small} => seq [str "SmallAndObjptr ", record [("objptr", record [("component", Component.layout component), ("con", Con.layout con)]), ("rep", Rep.layout rep), ("small", Small.layout small)]] | SmallAndObjptrs {objptrs, rep, small} => seq [str "SmallAndObjptrs ", record [("objptrs", Objptrs.layout objptrs), ("rep", Rep.layout rep), ("small", Small.layout small)]] | Unit => str "Unit" end val bool = Small Small.bool val unit = Unit val rep: t -> Rep.t = fn One {tupleRep, ...} => TupleRep.rep tupleRep | Objptrs p => Objptrs.rep p | Small s => Small.rep s | SmallAndBox {rep, ...} => rep | SmallAndObjptr {rep, ...} => rep | SmallAndObjptrs {rep, ...} => rep | Unit => Rep.unit fun equals (r, r') = Rep.equals (rep r, rep r') val objptrBytes = Runtime.objptrSize val objptrBits = Promise.lazy (fn () => Bytes.toBits (objptrBytes ())) val objptrBitsAsInt = Promise.lazy (fn () => Bits.toInt (objptrBits ())) local val aWithout = Promise.lazy (fn () => Array.tabulate (objptrBitsAsInt () + 1, fn i => IntInf.pow (2, i))) (* If there is an objptr, then multiply the number of tags by * 3/4 to remove all the tags that have 00 as their low bits. *) val aWith = Promise.lazy (fn () => Array.tabulate (objptrBitsAsInt () + 1, fn i => (Array.sub (aWithout (), i) * 3) div 4)) in fun numTagsAvailable {tagBits: int, withObjptr: bool} = let val a = if withObjptr then aWith () else aWithout () in Array.sub (a, tagBits) end val numTagsAvailable = Trace.trace ("PackedRepresentation.TyconRep.numTagsAvailable", fn {tagBits, withObjptr} => Layout.record [("tagBits", Int.layout tagBits), ("withObjptr", Bool.layout withObjptr)], IntInf.layout) numTagsAvailable fun tagBitsNeeded {numVariants: int, withObjptr: bool}: Bits.t = let val numVariants = Int.toIntInf numVariants val a = if withObjptr then aWith () else aWithout () in case (BinarySearch.smallest (a, fn numTags => numVariants <= numTags)) of NONE => Error.bug "PackedRepresentation.TyconRep.tagBitsNeeded" | SOME i => Bits.fromInt i end val tagBitsNeeded = Trace.trace ("PackedRepresentation.TyconRep.tagBitsNeeded", fn {numVariants, withObjptr} => Layout.record [("numVariants", Int.layout numVariants), ("withObjptr", Bool.layout withObjptr)], Bits.layout) tagBitsNeeded end fun make (variants: {args: {isMutable: bool, rep: Rep.t, ty: S.Type.t} vector, con: Con.t, objptrTycon: ObjptrTycon.t} vector) : t * {con: Con.t, rep: ConRep.t} vector = if 0 = Vector.length variants then (Unit, Vector.new0 ()) else if 1 = Vector.length variants then let val {args, con, objptrTycon} = Vector.sub (variants, 0) val tupleRep = TupleRep.make (objptrTycon, args, {forceBox = false, isVector = false}) val conRep = ConRep.Tuple tupleRep in (One {con = con, tupleRep = tupleRep}, Vector.new1 {con = con, rep = conRep}) end else if (2 = Vector.length variants andalso let val c = #con (Vector.sub (variants, 0)) in Con.equals (c, Con.falsee) orelse Con.equals (c, Con.truee) end) then (bool, Vector.new2 ({con = Con.falsee, rep = ConRep.falsee}, {con = Con.truee, rep = ConRep.truee})) else let val numSmall : IntInf.t ref = ref 0 val small = Array.array (objptrBitsAsInt (), []) val big = ref [] val () = Vector.foreach (variants, fn {args, con, objptrTycon} => let val tr = TupleRep.make (objptrTycon, args, {forceBox = false, isVector = false}) fun makeBig () = List.push (big, {con = con, objptrTycon = objptrTycon, tupleRep = tr}) val Rep.T {rep, ty} = TupleRep.rep tr in case rep of Rep.NonObjptr => let val i = Bits.toInt (Type.width ty) in if i >= objptrBitsAsInt () then makeBig () else let val {component, selects} = case tr of TupleRep.Direct z => z | TupleRep.Indirect _ => Error.bug "PackedRepresentation.TyconRep.make: small Indirect" val () = IntInf.inc numSmall val () = Array.update (small, i, {component = component, con = con, objptrTycon = objptrTycon, selects = selects} :: Array.sub (small, i)) in () end end | Rep.Objptr _ => makeBig () end) val big = !big val numSmall = !numSmall fun noLargerThan (i, ac) = if i < 0 then ac else (noLargerThan (i - 1, List.fold (Array.sub (small, i), ac, op ::))) (* Box as few things as possible so that the number of tags available * is >= the number of unboxed variants. *) fun loop (maxSmallWidth: int, forced, withObjptr: bool, numSmall: IntInf.t) = if 0 = numSmall then (maxSmallWidth, forced, []) else let val vs = Array.sub (small, maxSmallWidth) in if List.isEmpty vs then loop (maxSmallWidth - 1, forced, withObjptr, numSmall) else let val numTags = numTagsAvailable {tagBits = objptrBitsAsInt () - maxSmallWidth, withObjptr = withObjptr} in if numSmall <= numTags then (* There are enough tag bits available. *) (maxSmallWidth, forced, noLargerThan (maxSmallWidth - 1, vs)) else let val z = Int.toIntInf (List.length vs) val remaining = numSmall - z in if remaining <= numTags then let val (front, back) = List.splitAt (vs, IntInf.toInt (numSmall - numTags)) in (maxSmallWidth, List.append (front, forced), noLargerThan (maxSmallWidth - 1, back)) end else loop (maxSmallWidth - 1, vs @ forced, true, remaining) end end end val (maxSmallWidth, forced, small) = loop (objptrBitsAsInt () - 1, [], not (List.isEmpty big), numSmall) val maxSmallWidth = Bits.fromInt maxSmallWidth val withObjptr = not (List.isEmpty big andalso List.isEmpty forced) (* ShiftAndTag all the small. *) val (small: Small.t option, smallReps) = let val numSmall = List.length small in if 0 = numSmall then (NONE, Vector.new0 ()) else let val tagBits = tagBitsNeeded {numVariants = numSmall, withObjptr = withObjptr} val r = ref 0w0 fun getTag (): IntInf.t = let val w = !r val w = if withObjptr andalso 0w0 = Word.andb (w, 0w3) then w + 0w1 else w val () = r := w + 0w1 in Word.toIntInf w end val small = Vector.fromListMap (small, fn {component, con, selects, ...} => let val tag = WordX.fromIntInf (getTag (), WordSize.fromBits tagBits) val isUnit = Type.isUnit (Component.ty component) val component = Component.padToWidth (component, maxSmallWidth) val selects = Selects.lshift (selects, tagBits) val ty = Type.seq (Vector.new2 (Type.ofWordX tag, Component.ty component)) val ty = if withObjptr then Type.resize (ty, objptrBits ()) else Type.padToPrim ty in {component = component, con = con, isUnit = isUnit, selects = selects, tag = tag, ty = ty} end) val ty = Type.sum (Vector.map (small, #ty)) val rep = Rep.T {rep = Rep.NonObjptr, ty = ty} val reps = Vector.map (small, fn {component, con, isUnit, selects, tag, ty, ...} => {con = con, rep = if isUnit then ConRep.Tag {tag = tag, ty = ty} else (ConRep.ShiftAndTag {component = component, selects = selects, tag = tag, ty = ty})}) val isEnum = Vector.forall (reps, fn {rep, ...} => case rep of ConRep.Tag _ => true | _ => false) in (SOME (Small.T {isEnum = isEnum, rep = rep, tagBits = tagBits, variants = Vector.map (reps, #con)}), reps) end end fun makeSmallObjptr {component, con, objptrTycon, selects} = {con = con, objptr = (ObjptrRep.box (Component.padToWidth (component, objptrBits ()), objptrTycon, selects))} fun makeBigObjptr {con, objptrTycon, tupleRep} = let val objptr = case tupleRep of TupleRep.Direct {component, selects} => ObjptrRep.box (component, objptrTycon, selects) | TupleRep.Indirect p => p in {con = con, objptr = objptr} end fun sumWithSmall (r: Rep.t): Rep.t = Rep.T {rep = Rep.Objptr {endsIn00 = false}, ty = Type.sum (Vector.new2 (Rep.ty r, Rep.ty (Small.rep (valOf small))))} fun box () = let val objptrs = Vector.concat [Vector.fromListMap (forced, makeSmallObjptr), Vector.fromListMap (big, makeBigObjptr)] val sumRep = if 1 = Vector.length objptrs then let val objptr = Vector.sub (objptrs, 0) val small = valOf small val rep = sumWithSmall (ObjptrRep.rep (#objptr objptr)) in SmallAndBox {box = objptr, rep = rep, small = small} end else let val ty = Type.sum (Vector.map (objptrs, ObjptrRep.ty o #objptr)) val objptrs = Objptrs.make {rep = Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = ty}, variants = objptrs} in case small of NONE => Objptrs objptrs | SOME small => SmallAndObjptrs {objptrs = objptrs, rep = sumWithSmall (Objptrs.rep objptrs), small = small} end in (sumRep, Vector.map (objptrs, fn {con, objptr} => {con = con, rep = ConRep.box objptr})) end val (sumRep, objptrReps) = case (forced, big) of ([], []) => (Small (valOf small), Vector.new0 ()) | ([], [{con, tupleRep, ...}]) => (* If there is only one big and it is an objptr that * ends in 00, then there is no need to box it. *) (case tupleRep of TupleRep.Direct {component, ...} => let val rep = TupleRep.rep tupleRep in if Rep.isObjptrEndingIn00 rep then let val small = valOf small in (SmallAndObjptr {objptr = {component = component, con = con}, rep = sumWithSmall rep, small = small}, Vector.new1 {con = con, rep = ConRep.Tuple tupleRep}) end else box () end | _ => box ()) | _ => box () in (sumRep, Vector.concat [smallReps, objptrReps]) end val make = Trace.trace ("PackedRepresentation.TyconRep.make", Vector.layout (fn {args, con, ...} => Layout.record [("args", Vector.layout (Rep.layout o #rep) args), ("con", Con.layout con)]), Layout.tuple2 (layout, Vector.layout (fn {con, rep} => Layout.record [("con", Con.layout con), ("rep", ConRep.layout rep)]))) make fun genCase (r: t, {cases: Cases.t, conRep: Con.t -> ConRep.t, default: Label.t option, test: unit -> Operand.t}) : Statement.t list * Transfer.t * Block.t list = let val (statements, transfer) = case r of One {con, ...} => (case (Vector.length cases, default) of (1, _) => (* Use _ instead of NONE for the default becuase * there may be an unreachable default case. *) let val {con = c, dst, dstHasArg} = Vector.sub (cases, 0) in if not (Con.equals (c, con)) then Error.bug "PackedRepresentation.genCase: One" else ([], Goto {args = (if dstHasArg then Vector.new1 (test ()) else Vector.new0 ()), dst = dst}) end | (0, SOME l) => ([], Goto {dst = l, args = Vector.new0 ()}) | _ => Error.bug "PackedRepresentation.genCase: One,prim datatype with more than one case") | Objptrs ps => Objptrs.genCase (ps, {cases = cases, conRep = conRep, default = default, test = test ()}) | Small s => Small.genCase (s, {cases = cases, conRep = conRep, isObjptr = false, notSmall = NONE, smallDefault = default, test = test ()}) | SmallAndBox {box = {con, objptr}, small, ...} => let val notSmall = case Vector.peek (cases, fn {con = c, ...} => Con.equals (c, con)) of NONE => default | SOME {dst, dstHasArg, ...} => let val test = Operand.cast (test (), ObjptrRep.ty objptr) in SOME (Block.new {statements = Vector.new0 (), transfer = Goto {args = (if dstHasArg then Vector.new1 test else Vector.new0 ()), dst = dst}}) end in Small.genCase (small, {cases = cases, conRep = conRep, isObjptr = true, notSmall = notSmall, smallDefault = default, test = test ()}) end | SmallAndObjptr {objptr = {component, con}, small, ...} => let val notSmall = case Vector.peek (cases, fn {con = c, ...} => Con.equals (c, con)) of NONE => default | SOME {dst, dstHasArg, ...} => let val args = if dstHasArg then (Vector.new1 (Operand.cast (test (), Component.ty component))) else Vector.new0 () in SOME (Block.new {statements = Vector.new0 (), transfer = Goto {args = args, dst = dst}}) end in Small.genCase (small, {cases = cases, conRep = conRep, isObjptr = true, notSmall = notSmall, smallDefault = default, test = test ()}) end | SmallAndObjptrs {objptrs, small, ...} => let val test = test () val (ss, t) = Objptrs.genCase (objptrs, {cases = cases, conRep = conRep, default = default, test = (Operand.cast (test, Objptrs.ty objptrs))}) val objptr = Block.new {statements = Vector.fromList ss, transfer = t} in Small.genCase (small, {cases = cases, conRep = conRep, isObjptr = true, notSmall = SOME objptr, smallDefault = default, test = test}) end | Unit => Error.bug "PackedRepresentation.TyconRep.genCase: Unit" in (statements, transfer, Block.getExtra ()) end val genCase = Trace.trace ("PackedRepresentation.TyconRep.genCase", fn (r, {cases, default, ...}) => Layout.tuple [layout r, Layout.record [("cases", Cases.layout cases), ("default", Option.layout Label.layout default)]], Layout.tuple3 (List.layout Statement.layout, Transfer.layout, List.layout Block.layout)) genCase end structure Value: sig type 'a t val affect: 'a t * 'b t -> unit val constant: 'a -> 'a t val fixedPoint: unit -> unit val get: 'a t -> 'a val layout: ('a -> Layout.t) -> 'a t -> Layout.t val new: {compute: unit -> 'a, equals: 'a * 'a -> bool, init: 'a} -> 'a t end = struct structure Dep = struct datatype t = T of {affects: t list ref, compute: unit -> {change: bool}, needToCompute: bool ref} (* A list of all ts such that !needToCompute = true. *) val todo: t list ref = ref [] fun recompute (me as T {needToCompute, ...}) = if !needToCompute then () else (List.push (todo, me) ; needToCompute := true) fun fixedPoint () = case !todo of [] => () | T {affects, compute, needToCompute, ...} :: l => let val () = todo := l val () = needToCompute := false val {change} = compute () val () = if change then List.foreach (!affects, recompute) else () in fixedPoint () end fun affect (T {affects, ...}, z) = List.push (affects, z) fun new {compute: unit -> 'a, equals: 'a * 'a -> bool, init: 'a}: t * 'a ref = let val r: 'a ref = ref init val affects = ref [] val compute = fn () => let val old = !r val new = compute () val () = r := new in {change = not (equals (old, new))} end val me = T {affects = affects, compute = compute, needToCompute = ref false} val () = recompute me in (me, r) end end datatype 'a t = Constant of 'a | Variable of Dep.t * 'a ref val get = fn Constant a => a | Variable (_, r) => !r fun layout l v = l (get v) val constant = Constant fun new z = Variable (Dep.new z) val affect = fn (Variable (d, _), Variable (d', _)) => Dep.affect (d, d') | (Constant _, _) => () | (_, Constant _) => Error.bug "PackedRepresentation.Value.affect: Constant" val fixedPoint = Dep.fixedPoint end fun compute (program as Ssa.Program.T {datatypes, ...}) = let type tyconRepAndCons = (TyconRep.t * {con: Con.t, rep: ConRep.t} vector) Value.t val {get = conInfo: Con.t -> {rep: ConRep.t ref, tyconRep: tyconRepAndCons}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("info", Con.layout)) val {get = tupleRep: S.Type.t -> TupleRep.t Value.t, set = setTupleRep, ...} = Property.getSetOnce (S.Type.plist, Property.initRaise ("tupleRep", S.Type.layout)) val setTupleRep = Trace.trace ("PackedRepresentation.setTupleRep", S.Type.layout o #1, Layout.ignore) setTupleRep fun vectorRep (t: S.Type.t): TupleRep.t = Value.get (tupleRep t) fun setVectorRep (t: S.Type.t, tr: TupleRep.t): unit = setTupleRep (t, Value.new {compute = fn () => tr, equals = TupleRep.equals, init = tr}) val setVectorRep = Trace.trace2 ("PackedRepresentation.setVectorRep", S.Type.layout, TupleRep.layout, Unit.layout) setVectorRep val {get = tyconRep: Tycon.t -> tyconRepAndCons, set = setTyconRep, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("tyconRep", Tycon.layout)) (* Initialize the datatypes. *) val typeRepRef = ref (fn _ => Error.bug "PackedRepresentation.typeRep") fun typeRep t = !typeRepRef t val datatypes = Vector.map (datatypes, fn S.Datatype.T {cons, tycon} => let val cons = Vector.map (cons, fn {args, con} => {args = args, con = con, objptrTycon = ObjptrTycon.new ()}) fun compute () = let val (tr, cons) = TyconRep.make (Vector.map (cons, fn {args, con, objptrTycon} => {args = Vector.map (Prod.dest args, fn {elt, isMutable} => {isMutable = isMutable, rep = Value.get (typeRep elt), ty = elt}), con = con, objptrTycon = objptrTycon})) val () = Vector.foreach (cons, fn {con, rep} => #rep (conInfo con) := rep) in (tr, cons) end fun equals ((r, v), (r', v')) = TyconRep.equals (r, r') andalso Vector.equals (v, v', fn ({con = c, rep = r}, {con = c', rep = r'}) => Con.equals (c, c') andalso ConRep.equals (r, r')) val rep = Value.new {compute = compute, equals = equals, init = (TyconRep.unit, Vector.new0 ())} val () = setTyconRep (tycon, rep) val () = Vector.foreach (cons, fn {con, ...} => setConInfo (con, {rep = ref ConRep.unit, tyconRep = rep})) in {cons = cons, rep = rep, tycon = tycon} end) val delayedObjectTypes : (unit -> (ObjptrTycon.t * ObjectType.t) option) list ref = ref [] val {get = typeRep: S.Type.t -> Rep.t Value.t, ...} = Property.get (S.Type.plist, Property.initRec (fn (t, typeRep: S.Type.t -> Rep.t Value.t) => let val constant = Value.constant val nonObjptr = constant o Rep.nonObjptr datatype z = datatype S.Type.dest in case S.Type.dest t of CPointer => nonObjptr (Type.cpointer ()) | Datatype tycon => let val r = tyconRep tycon fun compute () = TyconRep.rep (#1 (Value.get r)) val r' = Value.new {compute = compute, equals = Rep.equals, init = Rep.unit} val () = Value.affect (r, r') in r' end | IntInf => constant (Rep.T {rep = Rep.Objptr {endsIn00 = false}, ty = Type.intInf ()}) | Object {args, con} => (case con of ObjectCon.Con con => let val {rep, tyconRep} = conInfo con fun compute () = ConRep.rep (!rep) val r = Value.new {compute = compute, equals = Rep.equals, init = Rep.unit} val () = Value.affect (tyconRep, r) in r end | ObjectCon.Tuple => let val opt = ObjptrTycon.new () val rs = Vector.map (Prod.dest args, typeRep o #elt) fun compute () = TupleRep.make (opt, Vector.map2 (rs, Prod.dest args, fn (r, {elt, isMutable}) => {isMutable = isMutable, rep = Value.get r, ty = elt}), {forceBox = false, isVector = false}) val tr = Value.new {compute = compute, equals = TupleRep.equals, init = TupleRep.unit} val () = Vector.foreach (rs, fn r => Value.affect (r, tr)) val hasIdentity = Prod.isMutable args val () = List.push (delayedObjectTypes, fn () => case Value.get tr of TupleRep.Indirect opr => SOME (opt, (ObjectType.Normal {hasIdentity = hasIdentity, ty = ObjptrRep.componentsTy opr})) | _ => NONE) val () = setTupleRep (t, tr) fun compute () = TupleRep.rep (Value.get tr) val r = Value.new {compute = compute, equals = Rep.equals, init = Rep.unit} val () = Value.affect (tr, r) in r end | ObjectCon.Vector => let val hasIdentity = Prod.isMutable args val args = Prod.dest args fun tupleRep opt = let val tr = TupleRep.make (opt, Vector.map (args, fn {elt, isMutable} => {isMutable = isMutable, rep = Value.get (typeRep elt), ty = elt}), {forceBox = true, isVector = true}) val () = setVectorRep (t, tr) in tr end fun now opt = (ignore (tupleRep opt); opt) fun delay () = let val opt = ObjptrTycon.new () val () = List.push (delayedObjectTypes, fn () => let (* Delay computing tupleRep until the * delayedObjectTypes are computed * because the vector component types * may not be known yet. *) val tr = tupleRep opt val ty = case tr of TupleRep.Direct _ => TupleRep.ty tr | TupleRep.Indirect opr => ObjptrRep.componentsTy opr val elt = if Type.isUnit ty then Type.zero Bits.inByte else ty in SOME (opt, ObjectType.Array {elt = elt, hasIdentity = hasIdentity}) end) in opt end val opt = if 1 <> Vector.length args then delay () else let val {elt, isMutable, ...} = Vector.sub (args, 0) in if isMutable then delay () else (case S.Type.dest elt of S.Type.Word s => let val nBits = WordSize.bits s val nInt = Bits.toInt nBits in if nInt = 8 orelse nInt = 16 orelse nInt = 32 orelse nInt = 64 then now (ObjptrTycon.wordVector nBits) else delay () end | _ => delay ()) end in constant (Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = Type.objptr opt}) end) | Real s => nonObjptr (Type.real s) | Thread => constant (Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = Type.thread ()}) | Weak t => let val opt = ObjptrTycon.new () val rep = Rep.T {rep = Rep.Objptr {endsIn00 = true}, ty = Type.objptr opt} val r = typeRep t fun compute () = if Rep.isObjptr (Value.get r) then rep else Rep.unit val r' = Value.new {compute = compute, equals = Rep.equals, init = Rep.unit} val () = Value.affect (r, r') val () = List.push (delayedObjectTypes, fn () => let val r = Value.get r in if Rep.isObjptr r then SOME (opt, ObjectType.Weak (SOME (Rep.ty r))) else NONE end) in r' end | Word s => nonObjptr (Type.word s) end)) val () = typeRepRef := typeRep val _ = typeRep (S.Type.vector1 (S.Type.word WordSize.byte)) (* Establish dependence between constructor argument type representations * and tycon representations. *) val () = Vector.foreach (datatypes, fn {cons, rep, ...} => Vector.foreach (cons, fn {args, ...} => Vector.foreach (Prod.dest args, fn {elt, ...} => Value.affect (typeRep elt, rep)))) val typeRep = Trace.trace ("PackedRepresentation.typeRep", S.Type.layout, Value.layout Rep.layout) typeRep val () = S.Program.foreachVar (program, fn (_, t) => ignore (typeRep t)) val () = Value.fixedPoint () val conRep = ! o #rep o conInfo val tyconRep = #1 o Value.get o tyconRep val objectTypes = Vector.fold (datatypes, [], fn ({cons, ...}, ac) => Vector.fold (cons, ac, fn ({args, con, objptrTycon, ...}, ac) => case conRep con of ConRep.Tuple (TupleRep.Indirect opr) => (objptrTycon, ObjectType.Normal {hasIdentity = Prod.isMutable args, ty = ObjptrRep.componentsTy opr}) :: ac | _ => ac)) val objectTypes = ref objectTypes val () = List.foreach (!delayedObjectTypes, fn f => Option.app (f (), fn z => List.push (objectTypes, z))) val objectTypes = Vector.fromList (!objectTypes) fun diagnostic () = Control.diagnostics (fn display => (display (Layout.str "Representations:") ; (Vector.foreach (datatypes, fn {cons, tycon, ...} => let open Layout in display (seq [Tycon.layout tycon, str " ", TyconRep.layout (tyconRep tycon)]) ; display (indent (Vector.layout (fn {con, ...} => record [("con", Con.layout con), ("rep", ConRep.layout (conRep con))]) cons, 2)) end)))) fun toRtype (t: S.Type.t): Type.t option = let val ty = Rep.ty (Value.get (typeRep t)) in if Type.isUnit ty then NONE else SOME (Type.padToPrim ty) end fun makeSrc (v, oper) {index} = oper (Vector.sub (v, index)) fun genCase {cases, default, test, tycon} = TyconRep.genCase (tyconRep tycon, {cases = cases, conRep = conRep, default = default, test = test}) val tupleRep = Value.get o tupleRep val tupleRep = Trace.trace ("PackedRepresentation.tupleRep", S.Type.layout, TupleRep.layout) tupleRep fun object {args, con, dst, objectTy, oper} = let val src = makeSrc (args, oper) in case con of NONE => TupleRep.tuple (tupleRep objectTy, {dst = dst, src = src}) | SOME con => ConRep.conApp (conRep con, {dst = dst, src = src}) end fun getSelects (con, objectTy) = let datatype z = datatype ObjectCon.t in case con of Con con => (case conRep con of ConRep.ShiftAndTag {selects, ...} => (selects, NONE) | ConRep.Tuple tr => (TupleRep.selects tr, NONE) | _ => Error.bug "PackedRepresentation.getSelects: Con,non-select") | Tuple => (TupleRep.selects (tupleRep objectTy), NONE) | Vector => case vectorRep objectTy of tr as TupleRep.Indirect pr => (TupleRep.selects tr, SOME (Type.bytes (ObjptrRep.componentsTy pr))) | _ => Error.bug "PackedRepresentation.getSelects: Vector,non-Indirect" end fun select {base, baseTy, dst, offset} = case S.Type.dest baseTy of S.Type.Object {con, ...} => let val (ss, eltWidth) = getSelects (con, baseTy) in Selects.select (ss, {base = base, eltWidth = eltWidth, dst = dst, offset = offset}) end | _ => Error.bug "PackedRepresentation.select: non-object" fun update {base, baseTy, offset, value} = case S.Type.dest baseTy of S.Type.Object {con, ...} => let val (ss, eltWidth) = getSelects (con, baseTy) in Selects.update (ss, {base = base, eltWidth = eltWidth, offset = offset, value = value}) end | _ => Error.bug "PackedRepresentation.update: non-object" in {diagnostic = diagnostic, genCase = genCase, object = object, objectTypes = objectTypes, select = select, toRtype = toRtype, update = update} end end mlton-20100608/mlton/backend/parallel-move.fun0000644000076600000240000000443211404435623017556 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ParallelMove (S: PARALLEL_MOVE_STRUCTS): PARALLEL_MOVE = struct open S fun ('register, 'statement) move {moves, equals, move, interfere, temp} : 'statement list = let val mvs = List.fold (moves, [], fn (mv as {src, dst}, mvs) => if equals (src, dst) then mvs else mv :: mvs) fun loopTop (mvs, moves) = loop (mvs, [], moves, false) and loop (mvs, hard, moves, changed) = case mvs of [] => (case hard of [] => List.rev moves | {src, dst} :: hard' => if changed then loopTop (hard, moves) else let val (hard, moves) = List.fold (hard', ([], moves), fn (mv as {src = s, dst = d}, (hard, moves)) => if interfere (dst, s) then let val temp = temp s in ({src = temp, dst = d} :: hard, move {dst = temp, src = s} :: moves) end else (mv :: hard, moves)) val moves = move {src = src, dst = dst} :: moves in loopTop (hard, moves) end) | (mv as {src, dst}) :: mvs => let fun isHard l = List.exists (l, fn {src, dst = _} => interfere (dst, src)) in if isHard mvs orelse isHard hard then loop (mvs, mv :: hard, moves, changed) else loop (mvs, hard, move {src = src, dst = dst} :: moves, true) end in loopTop (mvs, []) end end mlton-20100608/mlton/backend/parallel-move.sig0000644000076600000240000000203711404435623017547 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PARALLEL_MOVE_STRUCTS = sig end signature PARALLEL_MOVE = sig include PARALLEL_MOVE_STRUCTS (* Allows overlapping froms and tos. * Hence, has to be careful to use temps. *) val move: { (* Are two registers the same. *) equals: 'register * 'register -> bool, (* How to create a move statement. *) move: {src: 'register, dst: 'register} -> 'statement, (* The moves to occur. *) moves: {src: 'register, dst: 'register} list, (* Would writing the write invalidate the read? *) interfere: 'register * 'register -> bool, (* Return a new temporary register like input register. *) temp: 'register -> 'register } -> 'statement list end mlton-20100608/mlton/backend/rep-type.fun0000644000076600000240000007351711404435623016575 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RepType (S: REP_TYPE_STRUCTS): REP_TYPE = struct open S structure CFunction = CFunction structure Type = struct datatype t = T of {node: node, width: Bits.t} and node = Bits | CPointer | ExnStack | GCState | Label of Label.t | Objptr of ObjptrTycon.t vector | Real of RealSize.t | Seq of t vector | Word of WordSize.t local fun make f (T r) = f r in val node = make #node val width = make #width end val bytes: t -> Bytes.t = Bits.toBytes o width val rec layout: t -> Layout.t = fn t => let open Layout in case node t of Bits => str (concat ["Bits", Bits.toString (width t)]) | CPointer => str "CPointer" | ExnStack => str "ExnStack" | GCState => str "GCState" | Label l => seq [str "Label ", Label.layout l] | Objptr opts => seq [str "Objptr ", tuple (Vector.toListMap (opts, ObjptrTycon.layout))] | Real s => str (concat ["Real", RealSize.toString s]) | Seq ts => List.layout layout (Vector.toList ts) | Word s => str (concat ["Word", WordSize.toString s]) end val rec equals: t * t -> bool = fn (t, t') => Bits.equals (width t, width t') andalso (case (node t, node t') of (Bits, Bits) => true | (CPointer, CPointer) => true | (ExnStack, ExnStack) => true | (GCState, GCState) => true | (Label l, Label l') => Label.equals (l, l') | (Objptr opts, Objptr opts') => Vector.equals (opts, opts', ObjptrTycon.equals) | (Real s, Real s') => RealSize.equals (s, s') | (Seq ts, Seq ts') => Vector.equals (ts, ts', equals) | (Word s, Word s') => WordSize.equals (s, s') | _ => false) val sameWidth: t * t -> bool = fn (t, t') => Bits.equals (width t, width t') val bits: Bits.t -> t = fn width => T {node = Bits, width = width} val cpointer: unit -> t = fn () => T {node = CPointer, width = WordSize.bits (WordSize.cpointer ())} val exnStack: unit -> t = fn () => T {node = ExnStack, width = WordSize.bits (WordSize.csize ())} val gcState: unit -> t = fn () => T {node = GCState, width = WordSize.bits (WordSize.cpointer ())} val label: Label.t -> t = fn l => T {node = Label l, width = WordSize.bits (WordSize.cpointer ())} val objptr: ObjptrTycon.t -> t = fn opt => T {node = Objptr (Vector.new1 opt), width = WordSize.bits (WordSize.objptr ())} val real: RealSize.t -> t = fn s => T {node = Real s, width = RealSize.bits s} val word: WordSize.t -> t = fn s => T {node = Word s, width = WordSize.bits s} val bool: t = word WordSize.bool val csize: unit -> t = word o WordSize.csize val cint: unit -> t = word o WordSize.cint val objptrHeader: unit -> t = word o WordSize.objptrHeader val seqIndex: unit -> t = word o WordSize.seqIndex val shiftArg: t = word WordSize.shiftArg val stack : unit -> t = fn () => objptr ObjptrTycon.stack val thread : unit -> t = fn () => objptr ObjptrTycon.thread val word0: t = bits Bits.zero val word8: t = word WordSize.word8 val word32: t = word WordSize.word32 val wordVector: WordSize.t -> t = objptr o ObjptrTycon.wordVector o WordSize.bits val word8Vector: unit -> t = fn () => wordVector WordSize.word8 val string: unit -> t = word8Vector val unit: t = bits Bits.zero val zero: Bits.t -> t = bits val ofWordX: WordX.t -> t = fn w => word (WordX.size w) fun ofWordXVector (v: WordXVector.t): t = wordVector (WordXVector.elementSize v) val seq: t vector -> t = fn ts => if 0 = Vector.length ts then unit else let fun seqOnto (ts, ac) = Vector.foldr (ts, ac, fn (t, ac) => if Bits.equals (width t, Bits.zero) then ac else (case node t of Seq ts => seqOnto (ts, ac) | _ => (case ac of [] => [t] | t' :: ac' => (case (node t, node t') of (Bits, Bits) => bits (Bits.+ (width t, width t')) :: ac' | _ => t :: ac)))) in case seqOnto (ts, []) of [] => word0 | [t] => t | ts => let val ts = Vector.fromList ts in T {node = Seq ts, width = Vector.fold (ts, Bits.zero, fn (t, ac) => Bits.+ (ac, width t))} end end val seq = Trace.trace ("RepType.Type.seq", Vector.layout layout, layout) seq val sum: t vector -> t = fn ts => if 0 = Vector.length ts then Error.bug "RepType.Type.sum: empty" else let val opts = Vector.concatV (Vector.keepAllMap (ts, fn t => case node t of Objptr opts => SOME opts | _ => NONE)) in if 0 = Vector.length opts then Vector.sub (ts, 0) else T {node = (Objptr (QuickSort.sortVector (opts, ObjptrTycon.<=))), width = WordSize.bits (WordSize.objptr ())} end val sum = Trace.trace ("RepType.Type.sum", Vector.layout layout, layout) sum val intInf: unit -> t = fn () => sum (Vector.new2 (wordVector (WordSize.bigIntInfWord ()), seq (Vector.new2 (bits Bits.one, word (WordSize.fromBits (Bits.- (WordSize.bits (WordSize.smallIntInfWord ()), Bits.one))))))) val deLabel: t -> Label.t option = fn t => case node t of Label l => SOME l | _ => NONE val deObjptr: t -> ObjptrTycon.t option = fn t => case node t of Objptr opts => if 1 = Vector.length opts then SOME (Vector.sub (opts, 0)) else NONE | _ => NONE val deReal: t -> RealSize.t option = fn t => case node t of Real s => SOME s | _ => NONE val deSeq: t -> t vector option = fn t => case node t of Seq v => SOME v | _ => NONE val deWord: t -> WordSize.t option = fn t => case node t of Word s => SOME s | _ => NONE val isCPointer: t -> bool = fn t => case node t of CPointer => true | _ => false val isObjptr: t -> bool = fn t => case node t of Objptr _ => true | _ => false val isUnit: t -> bool = fn t => Bits.equals (Bits.zero, width t) val isSubtype: t * t -> bool = fn (t, t') => if not (sameWidth (t, t')) then false (* Error.bug "RepType.Type.isSubtype" *) else (equals (t, t') orelse case (node t, node t') of (Objptr opts, Objptr opts') => Vector.isSubsequence (opts, opts', ObjptrTycon.equals) | (Real _, _) => false | (Bits, Objptr _) => true | (Word _, Objptr _) => true | (Seq ts, Objptr _) => Vector.forall (ts, (fn Bits => true | Real _ => true | Word _ => true | _ => false) o node) | (_, Bits) => true | (_, Word _) => true | (_, Seq ts) => Vector.forall (ts, (fn Bits => true | Real _ => true | Word _ => true | _ => false) o node) | _ => false) val isSubtype = Trace.trace2 ("RepType.Type.isSubtype", layout, layout, Bool.layout) isSubtype fun exists (t, p) = if p t then true else (case node t of Seq ts => Vector.exists (ts, fn t => exists (t, p)) | _ => false) val resize: t * Bits.t -> t = fn (_, b) => bits b val bogusWord: t -> WordX.t = fn t => WordX.one (WordSize.fromBits (width t)) local structure C = struct open CType fun fromBits (b: Bits.t): t = case Bits.toInt b of 8 => Word8 | 16 => Word16 | 32 => Word32 | 64 => Word64 | _ => Error.bug (concat ["RepType.Type.CType.fromBits: ", Bits.toString b]) end in val toCType: t -> CType.t = fn t => if isObjptr t then C.Objptr else case node t of CPointer => C.CPointer | GCState => C.CPointer | Label _ => C.CPointer | Real s => (case s of RealSize.R32 => C.Real32 | RealSize.R64 => C.Real64) | _ => C.fromBits (width t) val name = C.name o toCType val align: t * Bytes.t -> Bytes.t = fn (t, n) => C.align (toCType t, n) end fun bytesAndObjptrs (t: t): Bytes.t * int = case node t of Objptr _ => (Bytes.zero, 1) | Seq ts => (case Vector.peeki (ts, isObjptr o #2) of NONE => (bytes t, 0) | SOME (i, _) => let val b = bytes (seq (Vector.prefix (ts, i))) val j = (Vector.length ts) - i in (b, j) end) | _ => (bytes t, 0) end structure ObjectType = struct structure ObjptrTycon = ObjptrTycon structure Runtime = Runtime type ty = Type.t datatype t = Array of {elt: ty, hasIdentity: bool} | Normal of {hasIdentity: bool, ty: ty} | Stack | Weak of Type.t option fun layout (t: t) = let open Layout in case t of Array {elt, hasIdentity} => seq [str "Array ", record [("elt", Type.layout elt), ("hasIdentity", Bool.layout hasIdentity)]] | Normal {hasIdentity, ty} => seq [str "Normal ", record [("hasIdentity", Bool.layout hasIdentity), ("ty", Type.layout ty)]] | Stack => str "Stack" | Weak t => seq [str "Weak ", Option.layout Type.layout t] end fun isOk (t: t): bool = case t of Array {elt, ...} => let val b = Type.width elt in Bits.> (b, Bits.zero) andalso Bits.isByteAligned b end | Normal {ty, ...} => let val b = Bits.+ (Type.width ty, Type.width (Type.objptrHeader ())) in not (Type.isUnit ty) andalso (case !Control.align of Control.Align4 => Bits.isWord32Aligned b | Control.Align8 => Bits.isWord64Aligned b) end | Stack => true | Weak to => Option.fold (to, true, fn (t,_) => Type.isObjptr t) val stack = Stack val thread = fn () => let val padding = let val align = case !Control.align of Control.Align4 => Bytes.fromInt 4 | Control.Align8 => Bytes.fromInt 8 val bytesHeader = Bits.toBytes (Control.Target.Size.header ()) val bytesCSize = Bits.toBytes (Control.Target.Size.csize ()) val bytesExnStack = Bits.toBytes (Type.width (Type.exnStack ())) val bytesStack = Bits.toBytes (Type.width (Type.stack ())) val bytesObject = Bytes.+ (bytesHeader, Bytes.+ (bytesCSize, Bytes.+ (bytesExnStack, bytesStack))) val bytesTotal = Bytes.align (bytesObject, {alignment = align}) val bytesPad = Bytes.- (bytesTotal, bytesObject) in Type.bits (Bytes.toBits bytesPad) end in Normal {hasIdentity = true, ty = Type.seq (Vector.new4 (padding, Type.csize (), Type.exnStack (), Type.stack ()))} end (* Order in the following vector matters. The basic pointer tycons must * correspond to the constants in gc/object.h. * STACK_TYPE_INDEX, * THREAD_TYPE_INDEX, * WEAK_GONE_TYPE_INDEX, * WORD8_VECTOR_TYPE_INDEX, * WORD16_VECTOR_TYPE_INDEX, * WORD32_VECTOR_TYPE_INDEX. * WORD64_VECTOR_TYPE_INDEX. *) val basic = fn () => let fun wordVec i = let val b = Bits.fromInt i in (ObjptrTycon.wordVector b, Array {hasIdentity = false, elt = Type.word (WordSize.fromBits b)}) end in Vector.fromList [(ObjptrTycon.stack, stack), (ObjptrTycon.thread, thread ()), (ObjptrTycon.weakGone, Weak NONE), wordVec 8, wordVec 32, wordVec 16, wordVec 64] end local structure R = Runtime.RObjectType in fun toRuntime (t: t): R.t = case t of Array {elt, hasIdentity} => let val (b, nops) = Type.bytesAndObjptrs elt in R.Array {hasIdentity = hasIdentity, bytesNonObjptrs = b, numObjptrs = nops} end | Normal {hasIdentity, ty} => let val (b, nops) = Type.bytesAndObjptrs ty in R.Normal {hasIdentity = hasIdentity, bytesNonObjptrs = b, numObjptrs = nops} end | Stack => R.Stack | Weak to => R.Weak {gone = Option.isNone to} end end open Type structure GCField = Runtime.GCField fun ofGCField (f: GCField.t): t = let datatype z = datatype GCField.t in case f of AtomicState => word32 | CardMapAbsolute => cpointer () | CurrentThread => thread () | CurSourceSeqsIndex => word32 | ExnStack => exnStack () | Frontier => cpointer () | Limit => cpointer () | LimitPlusSlop => cpointer () | MaxFrameSize => word32 | SignalIsPending => word32 | StackBottom => cpointer () | StackLimit => cpointer () | StackTop => cpointer () end fun castIsOk {from, to, tyconTy = _} = Bits.equals (width from, width to) fun checkPrimApp {args, prim, result} = let datatype z = datatype Prim.Name.t fun done (argsP, resultP) = let val argsP = Vector.fromList argsP in (Vector.length args = Vector.length argsP) andalso (Vector.forall2 (args, argsP, fn (arg, argP) => argP arg)) andalso (case (result, resultP) of (NONE, NONE) => true | (SOME result, SOME resultP) => resultP result | _ => false) end val bits = fn s => fn t => equals (t, bits s) val bool = fn t => equals (t, bool) val cpointer = fn t => equals (t, cpointer ()) val objptr = fn t => (case node t of Objptr _ => true | _ => false) val real = fn s => fn t => equals (t, real s) val seq = fn s => fn t => (case node t of Seq _ => Bits.equals (width t, WordSize.bits s) | _ => false) val word = fn s => fn t => equals (t, word s) val cint = word (WordSize.cint ()) val csize = word (WordSize.csize ()) val cptrdiff = word (WordSize.cptrdiff ()) val shiftArg = word WordSize.shiftArg val or = fn (p1, p2) => fn t => p1 t orelse p2 t val bitsOrSeq = fn s => or (bits (WordSize.bits s), seq s) val wordOrBitsOrSeq = fn s => or (word s, bitsOrSeq s) local fun make f s = let val t = f s in done ([t], SOME t) end in val realUnary = make real val wordUnary = make wordOrBitsOrSeq end local fun make f s = let val t = f s in done ([t, t], SOME t) end in val realBinary = make real val wordBinary = make wordOrBitsOrSeq end local fun make f s = let val t = f s in done ([t, t], SOME bool) end in val realCompare = make real val wordCompare = make wordOrBitsOrSeq val objptrCompare = make (fn _ => objptr) () end fun realTernary s = done ([real s, real s, real s], SOME (real s)) fun wordShift s = done ([wordOrBitsOrSeq s, shiftArg], SOME (wordOrBitsOrSeq s)) in case Prim.name prim of CPointer_add => done ([cpointer, cptrdiff], SOME cpointer) | CPointer_diff => done ([cpointer, cpointer], SOME cptrdiff) | CPointer_equal => done ([cpointer, cpointer], SOME bool) | CPointer_fromWord => done ([csize], SOME cpointer) | CPointer_lt => done ([cpointer, cpointer], SOME bool) | CPointer_sub => done ([cpointer, cptrdiff], SOME cpointer) | CPointer_toWord => done ([cpointer], SOME csize) | FFI f => done (Vector.toListMap (CFunction.args f, fn t' => fn t => equals (t', t)), SOME (fn t => equals (t, CFunction.return f))) | FFI_Symbol _ => done ([], SOME cpointer) | MLton_touch => done ([objptr], NONE) | Real_Math_acos s => realUnary s | Real_Math_asin s => realUnary s | Real_Math_atan s => realUnary s | Real_Math_atan2 s => realBinary s | Real_Math_cos s => realUnary s | Real_Math_exp s => realUnary s | Real_Math_ln s => realUnary s | Real_Math_log10 s => realUnary s | Real_Math_sin s => realUnary s | Real_Math_sqrt s => realUnary s | Real_Math_tan s => realUnary s | Real_abs s => realUnary s | Real_add s => realBinary s | Real_castToWord (s, s') => done ([real s], SOME (word s')) | Real_div s => realBinary s | Real_equal s => realCompare s | Real_ldexp s => done ([real s, cint], SOME (real s)) | Real_le s => realCompare s | Real_lt s => realCompare s | Real_mul s => realBinary s | Real_muladd s => realTernary s | Real_mulsub s => realTernary s | Real_neg s => realUnary s | Real_qequal s => realCompare s | Real_rndToReal (s, s') => done ([real s], SOME (real s')) | Real_rndToWord (s, s', _) => done ([real s], SOME (word s')) | Real_round s => realUnary s | Real_sub s => realBinary s | Thread_returnToC => done ([], NONE) | Word_add s => wordBinary s | Word_addCheck (s, _) => wordBinary s | Word_andb s => wordBinary s | Word_castToReal (s, s') => done ([word s], SOME (real s')) | Word_equal s => (wordCompare s) orelse objptrCompare | Word_extdToWord (s, s', _) => done ([wordOrBitsOrSeq s], SOME (wordOrBitsOrSeq s')) | Word_lshift s => wordShift s | Word_lt (s, _) => wordCompare s | Word_mul (s, _) => wordBinary s | Word_mulCheck (s, _) => wordBinary s | Word_neg s => wordUnary s | Word_negCheck s => wordUnary s | Word_notb s => wordUnary s | Word_orb s => wordBinary s | Word_quot (s, _) => wordBinary s | Word_rem (s, _) => wordBinary s | Word_rndToReal (s, s', _) => done ([word s], SOME (real s')) | Word_rol s => wordShift s | Word_ror s => wordShift s | Word_rshift (s, _) => wordShift s | Word_sub s => wordBinary s | Word_subCheck (s, _) => wordBinary s | Word_xorb s => wordBinary s | _ => Error.bug (concat ["RepType.checkPrimApp got strange prim: ", Prim.toString prim]) end fun checkOffset {base, isVector, offset, result} = Exn.withEscape (fn escape => let fun getTys ty = case node ty of Seq tys => Vector.toList tys | _ => [ty] fun dropTys (tys, bits) = let fun loop (tys, bits) = if Bits.equals (bits, Bits.zero) then tys else (case tys of [] => escape false | ty::tys => let val b = width ty in if Bits.>= (bits, b) then loop (tys, Bits.- (bits, b)) else (case node ty of Bits => (Type.bits (Bits.- (b, bits))) :: tys | _ => escape false) end) in if Bits.< (bits, Bits.zero) then escape false else loop (tys, bits) end val dropTys = Trace.trace2 ("RepType.checkOffset.dropTys", List.layout Type.layout, Bits.layout, List.layout Type.layout) dropTys fun takeTys (tys, bits) = let fun loop (tys, bits, acc) = if Bits.equals (bits, Bits.zero) then acc else (case tys of [] => escape false | ty::tys => let val b = width ty in if Bits.>= (bits, b) then loop (tys, Bits.- (bits, b), ty :: acc) else (case node ty of Bits => (Type.bits bits) :: acc | _ => escape false) end) in if Bits.< (bits, Bits.zero) then escape false else List.rev (loop (tys, bits, [])) end fun extractTys (tys, dropBits, takeBits) = takeTys (dropTys (tys, dropBits), takeBits) fun equalsTys (tys1, tys2) = case (tys1, tys2) of ([], []) => true | (ty1::tys1, ty2::tys2) => equals (ty1, ty2) andalso equalsTys (tys1, tys2) | _ => false val alignBits = case !Control.align of Control.Align4 => Bits.inWord32 | Control.Align8 => Bits.inWord64 val baseBits = width base val baseTys = getTys base val offsetBytes = offset val offsetBits = Bytes.toBits offsetBytes val resultBits = width result val resultTys = getTys result val adjOffsetBits = if Control.Target.bigEndian () andalso Bits.< (resultBits, Bits.inWord32) andalso Bits.> (baseBits, resultBits) then let val paddedComponentBits = if isVector then Bits.min (baseBits, Bits.inWord32) else Bits.inWord32 val paddedComponentOffsetBits = Bits.alignDown (offsetBits, {alignment = paddedComponentBits}) in Bits.+ (paddedComponentOffsetBits, Bits.- (paddedComponentBits, Bits.- (Bits.+ (resultBits, offsetBits), paddedComponentOffsetBits))) end else offsetBits in List.exists ([Bits.inWord8, Bits.inWord16, Bits.inWord32, Bits.inWord64], fn primBits => Bits.equals (resultBits, primBits) andalso Bits.isAligned (offsetBits, {alignment = Bits.min (primBits, alignBits)})) andalso equalsTys (resultTys, extractTys (baseTys, adjOffsetBits, resultBits)) end) fun offsetIsOk {base, offset, tyconTy, result} = case node base of Objptr opts => if Bytes.equals (offset, Runtime.headerOffset ()) then equals (result, objptrHeader ()) else if Bytes.equals (offset, Runtime.arrayLengthOffset ()) then (1 = Vector.length opts) andalso (case tyconTy (Vector.sub (opts, 0)) of ObjectType.Array _ => true | _ => false) andalso (equals (result, seqIndex ())) else (1 = Vector.length opts) andalso (case tyconTy (Vector.sub (opts, 0)) of ObjectType.Normal {ty, ...} => checkOffset {base = ty, isVector = false, offset = offset, result = result} | _ => false) | _ => false fun arrayOffsetIsOk {base, index, offset, tyconTy, result, scale} = case node base of CPointer => (equals (index, csize ())) andalso (case node result of CPointer => true | Objptr _ => true (* for FFI export of indirect types *) | Real _ => true | Word _ => true | _ => false) andalso (case Scale.fromBytes (bytes result) of NONE => false | SOME s => scale = s) andalso (Bytes.equals (offset, Bytes.zero)) | Objptr opts => (equals (index, seqIndex ())) andalso (1 = Vector.length opts) andalso (case tyconTy (Vector.sub (opts, 0)) of ObjectType.Array {elt, ...} => if equals (elt, word8) then (* special case for PackWord operations *) (case node result of Word wsRes => (case Scale.fromBytes (WordSize.bytes wsRes) of NONE => false | SOME s => scale = s) andalso (Bytes.equals (offset, Bytes.zero)) | _ => false) else (case Scale.fromBytes (bytes elt) of NONE => scale = Scale.One | SOME s => scale = s) andalso (checkOffset {base = elt, isVector = true, offset = offset, result = result}) | _ => false) | _ => false structure BuiltInCFunction = struct open CFunction datatype z = datatype Convention.t datatype z = datatype Target.t fun bug () = vanilla {args = Vector.new1 (string ()), name = "MLton_bug", prototype = (Vector.new1 CType.objptr, NONE), return = unit} local fun make b = fn () => T {args = Vector.new3 (Type.gcState (), Type.csize (), Type.bool), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = true, mayGC = true, maySwitchThreads = b, modifiesFrontier = true, prototype = (Vector.new3 (CType.cpointer, CType.csize (), CType.bool), NONE), readsStackTop = true, return = Type.unit, symbolScope = SymbolScope.Private, target = Direct "GC_collect", writesStackTop = true} val t = make true val f = make false in fun gc {maySwitchThreads = b} = if b then t () else f () end end end mlton-20100608/mlton/backend/rep-type.sig0000644000076600000240000000717211404435623016561 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REP_TYPE_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: LABEL structure ObjptrTycon: OBJPTR_TYCON structure Prim: PRIM structure RealSize: REAL_SIZE structure Runtime: RUNTIME structure Scale: SCALE structure WordSize: WORD_SIZE structure WordX: WORD_X structure WordXVector: WORD_X_VECTOR sharing CFunction = Prim.CFunction sharing RealSize = Prim.RealSize sharing WordSize = Prim.WordSize = WordX.WordSize sharing WordX = WordXVector.WordX end signature REP_TYPE = sig include REP_TYPE_STRUCTS structure ObjectType: OBJECT_TYPE (* * - Junk is used for padding. You can stick any value in, but you * can't get any value out. * - In Seq, the components are listed in increasing order of * address. * - In Seq ts, length ts <> 1 * - In Sum ts, length ts >= 2 * - In Sum ts, all t in ts must have same width. * - In Sum ts, there are no duplicates, and the types are in order. *) type t sharing type t = ObjectType.ty val bogusWord: t -> WordX.t val align: t * Bytes.t -> Bytes.t val arrayOffsetIsOk: {base: t, index: t, offset: Bytes.t, tyconTy: ObjptrTycon.t -> ObjectType.t, result: t, scale: Scale.t} -> bool val bits: Bits.t -> t val bool: t val bytes: t -> Bytes.t val castIsOk: {from: t, to: t, tyconTy: ObjptrTycon.t -> ObjectType.t} -> bool val checkPrimApp: {args: t vector, prim: t Prim.t, result: t option} -> bool val cpointer: unit -> t val csize: unit -> t val cint: unit -> t val deLabel: t -> Label.t option val deObjptr: t -> ObjptrTycon.t option val deReal: t -> RealSize.t option val deSeq: t -> t vector option val deWord: t -> WordSize.t option val equals: t * t -> bool val exnStack: unit -> t val gcState: unit -> t val exists: t * (t -> bool) -> bool val intInf: unit -> t val isCPointer: t -> bool val isObjptr: t -> bool val isUnit: t -> bool val isSubtype: t * t -> bool val label: Label.t -> t val layout: t -> Layout.t val name: t -> string (* simple one letter abbreviation *) val ofGCField: Runtime.GCField.t -> t val ofWordXVector: WordXVector.t -> t val ofWordX: WordX.t -> t val offsetIsOk: {base: t, offset: Bytes.t, tyconTy: ObjptrTycon.t -> ObjectType.t, result: t} -> bool val objptr: ObjptrTycon.t -> t val objptrHeader: unit -> t val real: RealSize.t -> t val resize: t * Bits.t -> t val seq: t vector -> t val seqIndex: unit -> t val shiftArg: t val string: unit -> t val sum: t vector -> t val thread: unit -> t val toCType: t -> CType.t val unit: t val width: t -> Bits.t val word: WordSize.t -> t val wordVector: WordSize.t -> t val zero: Bits.t -> t structure BuiltInCFunction: sig val bug: unit -> t CFunction.t val gc: {maySwitchThreads: bool} -> t CFunction.t end end mlton-20100608/mlton/backend/representation.sig0000644000076600000240000000355711404435623020061 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REPRESENTATION_STRUCTS = sig structure Rssa: RSSA structure Ssa: SSA2 sharing Rssa.RealSize = Ssa.RealSize sharing Rssa.WordSize = Ssa.WordSize end signature REPRESENTATION = sig include REPRESENTATION_STRUCTS val compute: Ssa.Program.t -> {diagnostic: unit -> unit, genCase: {cases: {con: Ssa.Con.t, dst: Rssa.Label.t, dstHasArg: bool} vector, default: Rssa.Label.t option, test: unit -> Rssa.Operand.t, tycon: Ssa.Tycon.t} -> (Rssa.Statement.t list * Rssa.Transfer.t * Rssa.Block.t list), object: {args: 'a vector, con: Ssa.Con.t option, dst: Rssa.Var.t * Rssa.Type.t, objectTy: Ssa.Type.t, oper: 'a -> Rssa.Operand.t} -> Rssa.Statement.t list, objectTypes: (Rssa.ObjptrTycon.t * Rssa.ObjectType.t) vector, select: {base: Rssa.Operand.t Ssa.Base.t, baseTy: Ssa.Type.t, dst: Rssa.Var.t * Rssa.Type.t, offset: int} -> Rssa.Statement.t list, toRtype: Ssa.Type.t -> Rssa.Type.t option, update: {base: Rssa.Operand.t Ssa.Base.t, baseTy: Ssa.Type.t, offset: int, value: Rssa.Operand.t} -> Rssa.Statement.t list} end mlton-20100608/mlton/backend/rssa.fun0000644000076600000240000022726711404435623016003 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Rssa (S: RSSA_STRUCTS): RSSA = struct open S local open Prim in structure ApplyArg = ApplyArg structure ApplyResult = ApplyResult end local open Runtime in structure CFunction = CFunction structure GCField = GCField end fun constrain (ty: Type.t): Layout.t = let open Layout in if !Control.showTypes then seq [str ": ", Type.layout ty] else empty end structure Operand = struct datatype t = ArrayOffset of {base: t, index: t, offset: Bytes.t, scale: Scale.t, ty: Type.t} | Cast of t * Type.t | Const of Const.t | EnsuresBytesFree | GCState | Offset of {base: t, offset: Bytes.t, ty: Type.t} | ObjptrTycon of ObjptrTycon.t | Runtime of GCField.t | Var of {var: Var.t, ty: Type.t} val null = Const Const.null val word = Const o Const.word fun zero s = word (WordX.fromIntInf (0, s)) fun bool b = word (WordX.fromIntInf (if b then 1 else 0, WordSize.bool)) val ty = fn ArrayOffset {ty, ...} => ty | Cast (_, ty) => ty | Const c => let datatype z = datatype Const.t in case c of IntInf _ => Type.intInf () | Null => Type.cpointer () | Real r => Type.real (RealX.size r) | Word w => Type.ofWordX w | WordVector v => Type.ofWordXVector v end | EnsuresBytesFree => Type.csize () | GCState => Type.gcState () | Offset {ty, ...} => ty | ObjptrTycon _ => Type.objptrHeader () | Runtime z => Type.ofGCField z | Var {ty, ...} => ty fun layout (z: t): Layout.t = let open Layout in case z of ArrayOffset {base, index, offset, scale, ty} => seq [str (concat ["X", Type.name ty, " "]), tuple [layout base, layout index, Scale.layout scale, Bytes.layout offset]] | Cast (z, ty) => seq [str "Cast ", tuple [layout z, Type.layout ty]] | Const c => seq [Const.layout c, constrain (ty z)] | EnsuresBytesFree => str "" | GCState => str "" | Offset {base, offset, ty} => seq [str (concat ["O", Type.name ty, " "]), tuple [layout base, Bytes.layout offset], constrain ty] | ObjptrTycon opt => ObjptrTycon.layout opt | Runtime r => GCField.layout r | Var {var, ...} => Var.layout var end fun cast (z: t, t: Type.t): t = if Type.equals (t, ty z) then z else Cast (z, t) val cast = Trace.trace2 ("Rssa.Operand.cast", layout, Type.layout, layout) cast val rec isLocation = fn ArrayOffset _ => true | Cast (z, _) => isLocation z | Offset _ => true | Runtime _ => true | Var _ => true | _ => false fun 'a foldVars (z: t, a: 'a, f: Var.t * 'a -> 'a): 'a = case z of ArrayOffset {base, index, ...} => foldVars (index, foldVars (base, a, f), f) | Cast (z, _) => foldVars (z, a, f) | Offset {base, ...} => foldVars (base, a, f) | Var {var, ...} => f (var, a) | _ => a fun replaceVar (z: t, f: Var.t -> t): t = let fun loop (z: t): t = case z of ArrayOffset {base, index, offset, scale, ty} => ArrayOffset {base = loop base, index = loop index, offset = offset, scale = scale, ty = ty} | Cast (t, ty) => Cast (loop t, ty) | Offset {base, offset, ty} => Offset {base = loop base, offset = offset, ty = ty} | Var {var, ...} => f var | _ => z in loop z end end structure Switch = struct local structure S = Switch (open S structure Type = Type structure Use = Operand) in open S end fun replaceVar (T {cases, default, size, test}, f) = T {cases = cases, default = default, size = size, test = Operand.replaceVar (test, f)} end structure Statement = struct datatype t = Bind of {dst: Var.t * Type.t, isMutable: bool, src: Operand.t} | Move of {dst: Operand.t, src: Operand.t} | Object of {dst: Var.t * Type.t, header: word, size: Bytes.t} | PrimApp of {args: Operand.t vector, dst: (Var.t * Type.t) option, prim: Type.t Prim.t} | Profile of ProfileExp.t | ProfileLabel of ProfileLabel.t | SetExnStackLocal | SetExnStackSlot | SetHandler of Label.t | SetSlotExnStack fun 'a foldDefUse (s, a: 'a, {def: Var.t * Type.t * 'a -> 'a, use: Var.t * 'a -> 'a}): 'a = let fun useOperand (z: Operand.t, a) = Operand.foldVars (z, a, use) in case s of Bind {dst = (x, t), src, ...} => def (x, t, useOperand (src, a)) | Move {dst, src} => useOperand (src, useOperand (dst, a)) | Object {dst = (dst, ty), ...} => def (dst, ty, a) | PrimApp {dst, args, ...} => Vector.fold (args, Option.fold (dst, a, fn ((x, t), a) => def (x, t, a)), useOperand) | Profile _ => a | ProfileLabel _ => a | SetExnStackLocal => a | SetExnStackSlot => a | SetHandler _ => a | SetSlotExnStack => a end fun foreachDefUse (s: t, {def, use}) = foldDefUse (s, (), {def = fn (x, t, ()) => def (x, t), use = use o #1}) fun 'a foldDef (s: t, a: 'a, f: Var.t * Type.t * 'a -> 'a): 'a = foldDefUse (s, a, {def = f, use = #2}) fun foreachDef (s:t , f: Var.t * Type.t -> unit) = foldDef (s, (), fn (x, t, ()) => f (x, t)) fun 'a foldUse (s: t, a: 'a, f: Var.t * 'a -> 'a) = foldDefUse (s, a, {def = #3, use = f}) fun foreachUse (s, f) = foldUse (s, (), f o #1) fun replaceUses (s: t, f: Var.t -> Operand.t): t = let fun oper (z: Operand.t): Operand.t = Operand.replaceVar (z, f) in case s of Bind {dst, isMutable, src} => Bind {dst = dst, isMutable = isMutable, src = oper src} | Move {dst, src} => Move {dst = oper dst, src = oper src} | Object _ => s | PrimApp {args, dst, prim} => PrimApp {args = Vector.map (args, oper), dst = dst, prim = prim} | Profile _ => s | ProfileLabel _ => s | SetExnStackLocal => s | SetExnStackSlot => s | SetHandler _ => s | SetSlotExnStack => s end val layout = let open Layout in fn Bind {dst = (x, t), src, ...} => seq [Var.layout x, constrain t, str " = ", Operand.layout src] | Move {dst, src} => mayAlign [Operand.layout dst, seq [str "= ", Operand.layout src]] | Object {dst = (dst, ty), header, size} => mayAlign [seq [Var.layout dst, constrain ty], seq [str "= Object ", record [("header", seq [str "0x", Word.layout header]), ("size", Bytes.layout size)]]] | PrimApp {dst, prim, args, ...} => let val rest = seq [Prim.layout prim, str " ", Vector.layout Operand.layout args] in case dst of NONE => rest | SOME (x, t) => mayAlign [seq [Var.layout x, constrain t], seq [str "= ", rest]] end | Profile e => ProfileExp.layout e | ProfileLabel p => seq [str "ProfileLabel ", ProfileLabel.layout p] | SetExnStackLocal => str "SetExnStackLocal" | SetExnStackSlot => str "SetExnStackSlot " | SetHandler l => seq [str "SetHandler ", Label.layout l] | SetSlotExnStack => str "SetSlotExnStack " end val toString = Layout.toString o layout fun clear (s: t) = foreachDef (s, Var.clear o #1) fun resize (src: Operand.t, dstTy: Type.t): Operand.t * t list = let val srcTy = Operand.ty src val (src, srcTy, ssSrc, dstTy, finishDst) = case (Type.deReal srcTy, Type.deReal dstTy) of (NONE, NONE) => (src, srcTy, [], dstTy, fn dst => (dst, [])) | (SOME rs, NONE) => let val ws = WordSize.fromBits (RealSize.bits rs) val tmp = Var.newNoname () val tmpTy = Type.word ws in (Operand.Var {ty = tmpTy, var = tmp}, tmpTy, [PrimApp {args = Vector.new1 src, dst = SOME (tmp, tmpTy), prim = Prim.realCastToWord (rs, ws)}], dstTy, fn dst => (dst, [])) end | (NONE, SOME rs) => let val ws = WordSize.fromBits (RealSize.bits rs) val tmp = Var.newNoname () val tmpTy = Type.real rs in (src, srcTy, [], Type.word ws, fn dst => (Operand.Var {ty = tmpTy, var = tmp}, [PrimApp {args = Vector.new1 dst, dst = SOME (tmp, tmpTy), prim = Prim.wordCastToReal (ws, rs)}])) end | (SOME _, SOME _) => (src, srcTy, [], dstTy, fn dst => (dst, [])) val srcW = Type.width srcTy val dstW = Type.width dstTy val (dst, ssConv) = if Bits.equals (srcW, dstW) then (Operand.cast (src, dstTy), []) else let val tmp = Var.newNoname () val tmpTy = dstTy in (Operand.Var {ty = tmpTy, var = tmp}, [PrimApp {args = Vector.new1 src, dst = SOME (tmp, tmpTy), prim = (Prim.wordExtdToWord (WordSize.fromBits srcW, WordSize.fromBits dstW, {signed = false}))}]) end val (dst, ssDst) = finishDst dst in (dst, ssSrc @ ssConv @ ssDst) end end datatype z = datatype Statement.t structure Transfer = struct datatype t = Arith of {args: Operand.t vector, dst: Var.t, overflow: Label.t, prim: Type.t Prim.t, success: Label.t, ty: Type.t} | CCall of {args: Operand.t vector, func: Type.t CFunction.t, return: Label.t option} | Call of {args: Operand.t vector, func: Func.t, return: Return.t} | Goto of {args: Operand.t vector, dst: Label.t} | Raise of Operand.t vector | Return of Operand.t vector | Switch of Switch.t fun layout t = let open Layout in case t of Arith {args, dst, overflow, prim, success, ty} => seq [str "Arith ", record [("args", Vector.layout Operand.layout args), ("dst", Var.layout dst), ("overflow", Label.layout overflow), ("prim", Prim.layout prim), ("success", Label.layout success), ("ty", Type.layout ty)]] | CCall {args, func, return} => seq [str "CCall ", record [("args", Vector.layout Operand.layout args), ("func", CFunction.layout (func, Type.layout)), ("return", Option.layout Label.layout return)]] | Call {args, func, return} => seq [Func.layout func, str " ", Vector.layout Operand.layout args, str " ", Return.layout return] | Goto {dst, args} => seq [Label.layout dst, str " ", Vector.layout Operand.layout args] | Raise xs => seq [str "raise ", Vector.layout Operand.layout xs] | Return xs => seq [str "return ", Vector.layout Operand.layout xs] | Switch s => Switch.layout s end fun bug () = CCall {args = (Vector.new1 (Operand.Const (Const.string "control shouldn't reach here"))), func = Type.BuiltInCFunction.bug (), return = NONE} fun foreachFunc (t, f : Func.t -> unit) : unit = case t of Call {func, ...} => f func | _ => () fun 'a foldDefLabelUse (t, a: 'a, {def: Var.t * Type.t * 'a -> 'a, label: Label.t * 'a -> 'a, use: Var.t * 'a -> 'a}): 'a = let fun useOperand (z, a) = Operand.foldVars (z, a, use) fun useOperands (zs: Operand.t vector, a) = Vector.fold (zs, a, useOperand) in case t of Arith {args, dst, overflow, success, ty, ...} => let val a = label (overflow, a) val a = label (success, a) val a = def (dst, ty, a) val a = useOperands (args, a) in a end | CCall {args, return, ...} => useOperands (args, case return of NONE => a | SOME l => label (l, a)) | Call {args, return, ...} => useOperands (args, Return.foldLabel (return, a, label)) | Goto {args, dst, ...} => label (dst, useOperands (args, a)) | Raise zs => useOperands (zs, a) | Return zs => useOperands (zs, a) | Switch s => Switch.foldLabelUse (s, a, {label = label, use = useOperand}) end fun foreachDefLabelUse (t, {def, label, use}) = foldDefLabelUse (t, (), {def = fn (x, t, ()) => def (x, t), label = label o #1, use = use o #1}) fun foldLabel (t, a, f) = foldDefLabelUse (t, a, {def = #3, label = f, use = #2}) fun foreachLabel (t, f) = foldLabel (t, (), f o #1) fun foldDef (t, a, f) = foldDefLabelUse (t, a, {def = f, label = #2, use = #2}) fun foreachDef (t, f) = foldDef (t, (), fn (x, t, ()) => f (x, t)) fun foldUse (t, a, f) = foldDefLabelUse (t, a, {def = #3, label = #2, use = f}) fun foreachUse (t, f) = foldUse (t, (), f o #1) fun clear (t: t): unit = foreachDef (t, Var.clear o #1) local fun make i = WordX.fromIntInf (i, WordSize.bool) in fun ifBool (test, {falsee, truee}) = Switch (Switch.T {cases = Vector.new2 ((make 0, falsee), (make 1, truee)), default = NONE, size = WordSize.bool, test = test}) fun ifZero (test, {falsee, truee}) = Switch (Switch.T {cases = Vector.new1 (make 0, truee), default = SOME falsee, size = WordSize.bool, test = test}) end fun replaceUses (t: t, f: Var.t -> Operand.t): t = let fun oper z = Operand.replaceVar (z, f) fun opers zs = Vector.map (zs, oper) in case t of Arith {args, dst, overflow, prim, success, ty} => Arith {args = opers args, dst = dst, overflow = overflow, prim = prim, success = success, ty = ty} | CCall {args, func, return} => CCall {args = opers args, func = func, return = return} | Call {args, func, return} => Call {args = opers args, func = func, return = return} | Goto {args, dst} => Goto {args = opers args, dst = dst} | Raise zs => Raise (opers zs) | Return zs => Return (opers zs) | Switch s => Switch (Switch.replaceVar (s, f)) end end structure Kind = struct datatype t = Cont of {handler: Handler.t} | CReturn of {func: Type.t CFunction.t} | Handler | Jump fun layout k = let open Layout in case k of Cont {handler} => seq [str "Cont ", record [("handler", Handler.layout handler)]] | CReturn {func} => seq [str "CReturn ", record [("func", CFunction.layout (func, Type.layout))]] | Handler => str "Handler" | Jump => str "Jump" end datatype frameStyle = None | OffsetsAndSize | SizeOnly fun frameStyle (k: t): frameStyle = case k of Cont _ => OffsetsAndSize | CReturn {func, ...} => if CFunction.mayGC func then OffsetsAndSize else if !Control.profile = Control.ProfileNone then None else SizeOnly | Handler => SizeOnly | Jump => None end local open Layout in fun layoutFormals (xts: (Var.t * Type.t) vector) = Vector.layout (fn (x, t) => seq [Var.layout x, if !Control.showTypes then seq [str ": ", Type.layout t] else empty]) xts end structure Block = struct datatype t = T of {args: (Var.t * Type.t) vector, kind: Kind.t, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} local fun make f (T r) = f r in val kind = make #kind val label = make #label end fun clear (T {args, label, statements, transfer, ...}) = (Vector.foreach (args, Var.clear o #1) ; Label.clear label ; Vector.foreach (statements, Statement.clear) ; Transfer.clear transfer) fun layout (T {args, kind, label, statements, transfer, ...}) = let open Layout in align [seq [Label.layout label, str " ", Vector.layout (fn (x, t) => if !Control.showTypes then seq [Var.layout x, str ": ", Type.layout t] else Var.layout x) args, str " ", Kind.layout kind, str " = "], indent (align [align (Vector.toListMap (statements, Statement.layout)), Transfer.layout transfer], 2)] end end structure Function = struct datatype t = T of {args: (Var.t * Type.t) vector, blocks: Block.t vector, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} local fun make f (T r) = f r in val blocks = make #blocks val name = make #name end fun dest (T r) = r val new = T fun clear (T {name, args, blocks, ...}) = (Func.clear name ; Vector.foreach (args, Var.clear o #1) ; Vector.foreach (blocks, Block.clear)) fun layoutHeader (T {args, name, raises, returns, start, ...}): Layout.t = let open Layout in seq [str "fun ", Func.layout name, str " ", layoutFormals args, if !Control.showTypes then seq [str ": ", record [("raises", Option.layout (Vector.layout Type.layout) raises), ("returns", Option.layout (Vector.layout Type.layout) returns)]] else empty, str " = ", Label.layout start, str " ()"] end fun layouts (f as T {blocks, ...}, output) = (output (layoutHeader f) ; Vector.foreach (blocks, fn b => output (Layout.indent (Block.layout b, 2)))) fun layout (f as T {blocks, ...}) = let open Layout in align [layoutHeader f, indent (align (Vector.toListMap (blocks, Block.layout)), 2)] end fun foreachVar (T {args, blocks, ...}, f) = (Vector.foreach (args, f) ; (Vector.foreach (blocks, fn Block.T {args, statements, transfer, ...} => (Vector.foreach (args, f) ; Vector.foreach (statements, fn s => Statement.foreachDef (s, f)) ; Transfer.foreachDef (transfer, f))))) fun dfs (T {blocks, start, ...}, v) = let val numBlocks = Vector.length blocks val {get = labelIndex, set = setLabelIndex, rem, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val visited = Array.array (numBlocks, false) fun visit (l: Label.t): unit = let val i = labelIndex l in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val b as Block.T {transfer, ...} = Vector.sub (blocks, i) val v' = v b val _ = Transfer.foreachLabel (transfer, visit) val _ = v' () in () end end val _ = visit start val _ = Vector.foreach (blocks, rem o Block.label) in () end structure Graph = DirectedGraph structure Node = Graph.Node fun dominatorTree (T {blocks, start, ...}): Block.t Tree.t = let open Dot val g = Graph.new () fun newNode () = Graph.newNode g val {get = labelNode, ...} = Property.get (Label.plist, Property.initFun (fn _ => newNode ())) val {get = nodeInfo: unit Node.t -> {block: Block.t}, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("info", Node.layout)) val () = Vector.foreach (blocks, fn b as Block.T {label, ...}=> setNodeInfo (labelNode label, {block = b})) val () = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val from = labelNode label val _ = Transfer.foreachLabel (transfer, fn to => (ignore o Graph.addEdge) (g, {from = from, to = labelNode to})) in () end) in Graph.dominatorTree (g, {root = labelNode start, nodeValue = #block o nodeInfo}) end fun dropProfile (f: t): t = let val {args, blocks, name, raises, returns, start} = dest f val blocks = Vector.map (blocks, fn Block.T {args, kind, label, statements, transfer} => Block.T {args = args, kind = kind, label = label, statements = Vector.keepAll (statements, fn Statement.Profile _ => false | Statement.ProfileLabel _ => false | _ => true), transfer = transfer}) in new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} end fun shrink (f: t): t = let val {args, blocks, name, raises, returns, start} = dest f val {get = labelInfo, rem, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val () = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelInfo (label, {block = block, inline = ref false, occurrences = ref 0})) fun visitLabel l = Int.inc (#occurrences (labelInfo l)) val () = visitLabel start val () = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, visitLabel)) datatype z = datatype Statement.t datatype z = datatype Transfer.t val () = Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Goto {dst, ...} => let val {inline, occurrences, ...} = labelInfo dst in if 1 = !occurrences then inline := true else () end | _ => ()) fun expand (ss: Statement.t vector list, t: Transfer.t) : Statement.t vector * Transfer.t = let fun done () = (Vector.concat (rev ss), t) in case t of Goto {args, dst} => let val {block, inline, ...} = labelInfo dst in if not (!inline) then done () else let val Block.T {args = formals, statements, transfer, ...} = block val binds = Vector.map2 (formals, args, fn (dst, src) => Bind {dst = dst, isMutable = false, src = src}) in expand (statements :: binds :: ss, transfer) end end | _ => done () end val blocks = Vector.fromList (Vector.fold (blocks, [], fn (Block.T {args, kind, label, statements, transfer}, ac) => let val {inline, ...} = labelInfo label in if !inline then ac else let val (statements, transfer) = expand ([statements], transfer) in Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer} :: ac end end)) val () = Vector.foreach (blocks, rem o Block.label) in new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} end end structure Program = struct datatype t = T of {functions: Function.t list, handlesSignals: bool, main: Function.t, objectTypes: ObjectType.t vector} fun clear (T {functions, main, ...}) = (List.foreach (functions, Function.clear) ; Function.clear main) fun layouts (T {functions, main, objectTypes, ...}, output': Layout.t -> unit): unit = let open Layout val output = output' in output (str "\nObjectTypes:") ; Vector.foreachi (objectTypes, fn (i, ty) => output (seq [str "opt_", Int.layout i, str " = ", ObjectType.layout ty])) ; output (str "\nMain:") ; Function.layouts (main, output) ; output (str "\nFunctions:") ; List.foreach (functions, fn f => Function.layouts (f, output)) end fun layoutStats (T {functions, main, objectTypes, ...}) = let val numStatements = ref 0 val numBlocks = ref 0 val _ = List.foreach (main::functions, fn f => let val {blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {statements, ...} => (Int.inc numBlocks ; numStatements := !numStatements + Vector.length statements)) end) val numFunctions = 1 + List.length functions val numObjectTypes = Vector.length objectTypes open Layout in align [seq [str "num functions in program = ", Int.layout numFunctions], seq [str "num blocks in program = ", Int.layout (!numBlocks)], seq [str "num statements in program = ", Int.layout (!numStatements)], seq [str "num object types in program = ", Int.layout (numObjectTypes)]] end fun dropProfile (T {functions, handlesSignals, main, objectTypes}) = (Control.profile := Control.ProfileNone ; T {functions = List.map (functions, Function.dropProfile), handlesSignals = handlesSignals, main = Function.dropProfile main, objectTypes = objectTypes}) (* quell unused warning *) val _ = dropProfile fun dfs (p, v) = let val T {functions, main, ...} = p val functions = Vector.fromList (main::functions) val numFunctions = Vector.length functions val {get = funcIndex, set = setFuncIndex, rem, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("index", Func.layout)) val _ = Vector.foreachi (functions, fn (i, f) => setFuncIndex (#name (Function.dest f), i)) val visited = Array.array (numFunctions, false) fun visit (f: Func.t): unit = let val i = funcIndex f in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val f = Vector.sub (functions, i) val v' = v f val _ = Function.dfs (f, fn Block.T {transfer, ...} => (Transfer.foreachFunc (transfer, visit) ; fn () => ())) val _ = v' () in () end end val _ = visit (Function.name main) val _ = Vector.foreach (functions, rem o Function.name) in () end fun orderFunctions (p as T {handlesSignals, objectTypes, ...}) = let val functions = ref [] val () = dfs (p, fn f => let val {args, name, raises, returns, start, ...} = Function.dest f val blocks = ref [] val () = Function.dfs (f, fn b => (List.push (blocks, b) ; fn () => ())) val f = Function.new {args = args, blocks = Vector.fromListRev (!blocks), name = name, raises = raises, returns = returns, start = start} in List.push (functions, f) ; fn () => () end) val (main, functions) = case List.rev (!functions) of main::functions => (main, functions) | _ => Error.bug "Rssa.orderFunctions: main/functions" in T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes} end fun copyProp (T {functions, handlesSignals, main, objectTypes, ...}): t = let val tracePrimApply = Trace.trace3 ("Rssa.copyProp.primApply", Prim.layout, List.layout (ApplyArg.layout (Var.layout o #var)), Layout.ignore, ApplyResult.layout (Var.layout o #var)) val {get = replaceVar: Var.t -> Operand.t, set = setReplaceVar, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("replacement", Var.layout)) fun dontReplace (x: Var.t, t: Type.t): unit = setReplaceVar (x, Operand.Var {var = x, ty = t}) fun loopStatement (s: Statement.t): Statement.t option = let val s = Statement.replaceUses (s, replaceVar) fun keep () = (Statement.foreachDef (s, dontReplace) ; SOME s) in case s of Bind {dst = (dst, dstTy), isMutable, src} => if isMutable then keep () else let datatype z = datatype Operand.t fun getSrc src = case src of Cast (src, _) => getSrc src | Const _ => SOME src | Var _ => SOME src | _ => NONE in case getSrc src of NONE => keep () | SOME src => let val src = if Type.equals (Operand.ty src, dstTy) then src else Cast (src, dstTy) in setReplaceVar (dst, src) ; NONE end end | PrimApp {args, dst, prim} => let fun replace (z: Operand.t): Statement.t option = (Option.app (dst, fn (x, _) => setReplaceVar (x, z)) ; NONE) val applyArgs = Vector.keepAllMap (args, fn z => case z of Operand.Const c => SOME (ApplyArg.Const c) | Operand.Var x => SOME (ApplyArg.Var x) | _ => NONE) datatype z = datatype ApplyResult.t in if Vector.length args <> Vector.length applyArgs then keep () else case (tracePrimApply Prim.apply (prim, Vector.toList applyArgs, fn ({var = x, ...}, {var = y, ...}) => Var.equals (x, y))) of Apply (prim, args) => let val args = Vector.fromListMap (args, Operand.Var) val () = Option.app (dst, dontReplace) in SOME (PrimApp {args = args, dst = dst, prim = prim}) end | Bool b => replace (Operand.bool b) | Const c => replace (Operand.Const c) | Overflow => keep () | Unknown => keep () | Var x => replace (Operand.Var x) end | _ => keep () end fun loopTransfer t = (Transfer.foreachDef (t, dontReplace) ; Transfer.replaceUses (t, replaceVar)) fun loopFormals args = Vector.foreach (args, dontReplace) fun loopFunction (f: Function.t): Function.t = let val {args, name, raises, returns, start, ...} = Function.dest f val () = loopFormals args val blocks = ref [] val () = Function.dfs (f, fn Block.T {args, kind, label, statements, transfer} => let val () = loopFormals args val statements = Vector.keepAllMap (statements, loopStatement) val transfer = loopTransfer transfer val () = List.push (blocks, Block.T {args = args, kind = kind, label = label, statements = statements, transfer = transfer}) in fn () => () end) val blocks = Vector.fromList (!blocks) in Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = start} end (* Must process main first, because it defines globals that are * used in other functions. *) val main = loopFunction main val functions = List.revMap (functions, loopFunction) in T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes} end fun shrink (T {functions, handlesSignals, main, objectTypes}) = let val p = T {functions = List.revMap (functions, Function.shrink), handlesSignals = handlesSignals, main = Function.shrink main, objectTypes = objectTypes} val p = copyProp p val () = clear p in p end structure ExnStack = struct structure ZPoint = struct datatype t = Caller | Me val equals: t * t -> bool = op = val toString = fn Caller => "Caller" | Me => "Me" val layout = Layout.str o toString end structure L = FlatLattice (structure Point = ZPoint) open L structure Point = ZPoint val me = point Point.Me end structure HandlerLat = FlatLattice (structure Point = Label) structure HandlerInfo = struct datatype t = T of {block: Block.t, global: ExnStack.t, handler: HandlerLat.t, slot: ExnStack.t, visited: bool ref} fun new (b: Block.t): t = T {block = b, global = ExnStack.new (), handler = HandlerLat.new (), slot = ExnStack.new (), visited = ref false} fun layout (T {global, handler, slot, ...}) = Layout.record [("global", ExnStack.layout global), ("slot", ExnStack.layout slot), ("handler", HandlerLat.layout handler)] end val traceGoto = Trace.trace ("Rssa.checkHandlers.goto", Label.layout, Unit.layout) fun checkHandlers (T {functions, ...}) = let val debug = false fun checkFunction (f: Function.t): unit = let val {name, start, blocks, ...} = Function.dest f val {get = labelInfo: Label.t -> HandlerInfo.t, rem = remLabelInfo, set = setLabelInfo} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val _ = Vector.foreach (blocks, fn b => setLabelInfo (Block.label b, HandlerInfo.new b)) (* Do a DFS of the control-flow graph. *) fun visitLabel l = visitInfo (labelInfo l) and visitInfo (hi as HandlerInfo.T {block, global, handler, slot, visited, ...}): unit = if !visited then () else let val _ = visited := true val Block.T {label, statements, transfer, ...} = block val _ = if debug then let open Layout in outputl (seq [str "visiting ", Label.layout label], Out.error) end else () datatype z = datatype Statement.t val {global, handler, slot} = Vector.fold (statements, {global = global, handler = handler, slot = slot}, fn (s, {global, handler, slot}) => case s of SetExnStackLocal => {global = ExnStack.me, handler = handler, slot = slot} | SetExnStackSlot => {global = slot, handler = handler, slot = slot} | SetSlotExnStack => {global = global, handler = handler, slot = global} | SetHandler l => {global = global, handler = HandlerLat.point l, slot = slot} | _ => {global = global, handler = handler, slot = slot}) fun fail msg = (Control.message (Control.Silent, fn () => let open Layout in align [str "before: ", HandlerInfo.layout hi, str "block: ", Block.layout block, seq [str "after: ", Layout.record [("global", ExnStack.layout global), ("slot", ExnStack.layout slot), ("handler", HandlerLat.layout handler)]], Vector.layout (fn Block.T {label, ...} => seq [Label.layout label, str " ", HandlerInfo.layout (labelInfo label)]) blocks] end) ; Error.bug (concat ["Rssa.checkHandlers: handler mismatch at ", msg])) fun assert (msg, f) = if f then () else fail msg fun goto (l: Label.t): unit = let val HandlerInfo.T {global = g, handler = h, slot = s, ...} = labelInfo l val _ = assert ("goto", ExnStack.<= (global, g) andalso ExnStack.<= (slot, s) andalso HandlerLat.<= (handler, h)) in visitLabel l end val goto = traceGoto goto fun tail name = assert (name, ExnStack.forcePoint (global, ExnStack.Point.Caller)) datatype z = datatype Transfer.t in case transfer of Arith {overflow, success, ...} => (goto overflow; goto success) | CCall {return, ...} => Option.app (return, goto) | Call {return, ...} => assert ("return", let datatype z = datatype Return.t in case return of Dead => true | NonTail {handler = h, ...} => (case h of Handler.Caller => ExnStack.forcePoint (global, ExnStack.Point.Caller) | Handler.Dead => true | Handler.Handle l => let val res = ExnStack.forcePoint (global, ExnStack.Point.Me) andalso HandlerLat.forcePoint (handler, l) val _ = goto l in res end) | Tail => true end) | Goto {dst, ...} => goto dst | Raise _ => tail "raise" | Return _ => tail "return" | Switch s => Switch.foreachLabel (s, goto) end val info as HandlerInfo.T {global, ...} = labelInfo start val _ = ExnStack.forcePoint (global, ExnStack.Point.Caller) val _ = visitInfo info val _ = Control.diagnostics (fn display => let open Layout val _ = display (seq [str "checkHandlers ", Func.layout name]) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str " ", HandlerInfo.layout (labelInfo label)])) in () end) val _ = Vector.foreach (blocks, fn b => remLabelInfo (Block.label b)) in () end val _ = List.foreach (functions, checkFunction) in () end fun checkScopes (program as T {functions, main, ...}): unit = let datatype status = Defined | Global | InScope | Undefined fun make (layout, plist) = let val {get, set, ...} = Property.getSet (plist, Property.initConst Undefined) fun bind (x, isGlobal) = case get x of Global => () | Undefined => set (x, if isGlobal then Global else InScope) | _ => Error.bug ("Rssa.checkScopes: duplicate definition of " ^ (Layout.toString (layout x))) fun reference x = case get x of Global => () | InScope => () | _ => Error.bug (concat ["Rssa.checkScopes: reference to ", Layout.toString (layout x), " not in scope"]) fun unbind x = case get x of Global => () | _ => set (x, Defined) in (bind, reference, unbind) end val (bindVar, getVar, unbindVar) = make (Var.layout, Var.plist) val bindVar = Trace.trace2 ("Rssa.bindVar", Var.layout, Bool.layout, Unit.layout) bindVar val getVar = Trace.trace ("Rssa.getVar", Var.layout, Unit.layout) getVar val unbindVar = Trace.trace ("Rssa.unbindVar", Var.layout, Unit.layout) unbindVar val (bindFunc, _, _) = make (Func.layout, Func.plist) val bindFunc = fn f => bindFunc (f, false) val (bindLabel, getLabel, unbindLabel) = make (Label.layout, Label.plist) val bindLabel = fn l => bindLabel (l, false) fun loopFunc (f: Function.t, isMain: bool): unit = let val bindVar = fn x => bindVar (x, isMain) val {args, blocks, ...} = Function.dest f val _ = Vector.foreach (args, bindVar o #1) val _ = Vector.foreach (blocks, bindLabel o Block.label) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, getLabel)) (* Descend the dominator tree, verifying that variable * definitions dominate variable uses. *) val _ = Tree.traverse (Function.dominatorTree f, fn Block.T {args, statements, transfer, ...} => let val _ = Vector.foreach (args, bindVar o #1) val _ = Vector.foreach (statements, fn s => (Statement.foreachUse (s, getVar) ; Statement.foreachDef (s, bindVar o #1))) val _ = Transfer.foreachUse (transfer, getVar) val _ = Transfer.foreachDef (transfer, bindVar o #1) in fn () => if isMain then () else let val _ = Vector.foreach (statements, fn s => Statement.foreachDef (s, unbindVar o #1)) val _ = Transfer.foreachDef (transfer, unbindVar o #1) val _ = Vector.foreach (args, unbindVar o #1) in () end end) val _ = Vector.foreach (blocks, unbindLabel o Block.label) val _ = Vector.foreach (args, unbindVar o #1) in () end val _ = List.foreach (functions, bindFunc o Function.name) val _ = loopFunc (main, true) val _ = List.foreach (functions, fn f => loopFunc (f, false)) val _ = clear program in () end fun typeCheck (p as T {functions, main, objectTypes, ...}) = let val _ = Vector.foreach (objectTypes, fn ty => Err.check ("objectType", fn () => ObjectType.isOk ty, fn () => ObjectType.layout ty)) fun tyconTy (opt: ObjptrTycon.t): ObjectType.t = Vector.sub (objectTypes, ObjptrTycon.index opt) val () = checkScopes p val {get = labelBlock: Label.t -> Block.t, set = setLabelBlock, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("block", Label.layout)) val {get = funcInfo, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("info", Func.layout)) val {get = varType: Var.t -> Type.t, set = setVarType, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("type", Var.layout)) val setVarType = Trace.trace2 ("Rssa.setVarType", Var.layout, Type.layout, Unit.layout) setVarType fun checkOperand (x: Operand.t): unit = let datatype z = datatype Operand.t fun ok () = case x of ArrayOffset {base, index, offset, scale, ty} => (checkOperand base ; checkOperand index ; Type.arrayOffsetIsOk {base = Operand.ty base, index = Operand.ty index, offset = offset, tyconTy = tyconTy, result = ty, scale = scale}) | Cast (z, ty) => (checkOperand z ; Type.castIsOk {from = Operand.ty z, to = ty, tyconTy = tyconTy}) | Const _ => true | EnsuresBytesFree => true | GCState => true | Offset {base, offset, ty} => Type.offsetIsOk {base = Operand.ty base, offset = offset, tyconTy = tyconTy, result = ty} | ObjptrTycon _ => true | Runtime _ => true | Var {ty, var} => Type.isSubtype (varType var, ty) in Err.check ("operand", ok, fn () => Operand.layout x) end val checkOperand = Trace.trace ("Rssa.checkOperand", Operand.layout, Unit.layout) checkOperand fun checkOperands v = Vector.foreach (v, checkOperand) fun check' (x, name, isOk, layout) = Err.check (name, fn () => isOk x, fn () => layout x) val labelKind = Block.kind o labelBlock fun statementOk (s: Statement.t): bool = let datatype z = datatype Statement.t in case s of Bind {src, dst = (_, dstTy), ...} => (checkOperand src ; Type.isSubtype (Operand.ty src, dstTy)) | Move {dst, src} => (checkOperand dst ; checkOperand src ; (Type.isSubtype (Operand.ty src, Operand.ty dst) andalso Operand.isLocation dst)) | Object {dst = (_, ty), header, size} => let val tycon = ObjptrTycon.fromIndex (Runtime.headerToTypeIndex header) in Type.isSubtype (Type.objptr tycon, ty) andalso Bytes.equals (size, Bytes.align (size, {alignment = (case !Control.align of Control.Align4 => Bytes.inWord32 | Control.Align8 => Bytes.inWord64)})) andalso (case tyconTy tycon of ObjectType.Normal {ty, ...} => Bytes.equals (size, Bytes.+ (Runtime.headerSize (), Type.bytes ty)) | _ => false) end | PrimApp {args, dst, prim} => (Vector.foreach (args, checkOperand) ; (Type.checkPrimApp {args = Vector.map (args, Operand.ty), prim = prim, result = Option.map (dst, #2)})) | Profile _ => true | ProfileLabel _ => true | SetExnStackLocal => true | SetExnStackSlot => true | SetHandler l => (case labelKind l of Kind.Handler => true | _ => false) | SetSlotExnStack => true end val statementOk = Trace.trace ("Rssa.statementOk", Statement.layout, Bool.layout) statementOk fun gotoOk {args: Type.t vector, dst: Label.t}: bool = let val Block.T {args = formals, kind, ...} = labelBlock dst in Vector.equals (args, formals, fn (t, (_, t')) => Type.isSubtype (t, t')) andalso (case kind of Kind.Jump => true | _ => false) end fun labelIsNullaryJump l = gotoOk {dst = l, args = Vector.new0 ()} fun tailIsOk (caller: Type.t vector option, callee: Type.t vector option): bool = case (caller, callee) of (_, NONE) => true | (SOME caller, SOME callee) => Vector.equals (callee, caller, Type.isSubtype) | _ => false fun nonTailIsOk (formals: (Var.t * Type.t) vector, returns: Type.t vector option): bool = case returns of NONE => true | SOME ts => Vector.equals (formals, ts, fn ((_, t), t') => Type.isSubtype (t', t)) fun callIsOk {args, func, raises, return, returns} = let val Function.T {args = formals, raises = raises', returns = returns', ...} = funcInfo func in Vector.equals (args, formals, fn (z, (_, t)) => Type.isSubtype (Operand.ty z, t)) andalso (case return of Return.Dead => Option.isNone raises' andalso Option.isNone returns' | Return.NonTail {cont, handler} => let val Block.T {args = cArgs, kind = cKind, ...} = labelBlock cont in nonTailIsOk (cArgs, returns') andalso (case cKind of Kind.Cont {handler = h} => Handler.equals (handler, h) andalso (case h of Handler.Caller => tailIsOk (raises, raises') | Handler.Dead => true | Handler.Handle l => let val Block.T {args = hArgs, kind = hKind, ...} = labelBlock l in nonTailIsOk (hArgs, raises') andalso (case hKind of Kind.Handler => true | _ => false) end) | _ => false) end | Return.Tail => tailIsOk (raises, raises') andalso tailIsOk (returns, returns')) end fun checkFunction (Function.T {args, blocks, raises, returns, start, ...}) = let val _ = Vector.foreach (args, setVarType) val _ = Vector.foreach (blocks, fn b as Block.T {args, label, statements, transfer, ...} => (setLabelBlock (label, b) ; Vector.foreach (args, setVarType) ; Vector.foreach (statements, fn s => Statement.foreachDef (s, setVarType)) ; Transfer.foreachDef (transfer, setVarType))) val _ = labelIsNullaryJump start fun transferOk (t: Transfer.t): bool = let datatype z = datatype Transfer.t in case t of Arith {args, overflow, prim, success, ty, ...} => let val _ = checkOperands args in Prim.mayOverflow prim andalso labelIsNullaryJump overflow andalso labelIsNullaryJump success andalso Type.checkPrimApp {args = Vector.map (args, Operand.ty), prim = prim, result = SOME ty} end | CCall {args, func, return} => let val _ = checkOperands args in CFunction.isOk (func, {isUnit = Type.isUnit}) andalso Vector.equals (args, CFunction.args func, fn (z, t) => Type.isSubtype (Operand.ty z, t)) andalso case return of NONE => true | SOME l => case labelKind l of Kind.CReturn {func = f} => CFunction.equals (func, f) | _ => false end | Call {args, func, return} => let val _ = checkOperands args in callIsOk {args = args, func = func, raises = raises, return = return, returns = returns} end | Goto {args, dst} => (checkOperands args ; gotoOk {args = Vector.map (args, Operand.ty), dst = dst}) | Raise zs => (checkOperands zs ; (case raises of NONE => false | SOME ts => Vector.equals (zs, ts, fn (z, t) => Type.isSubtype (Operand.ty z, t)))) | Return zs => (checkOperands zs ; (case returns of NONE => false | SOME ts => Vector.equals (zs, ts, fn (z, t) => Type.isSubtype (Operand.ty z, t)))) | Switch s => Switch.isOk (s, {checkUse = checkOperand, labelIsOk = labelIsNullaryJump}) end val transferOk = Trace.trace ("Rssa.transferOk", Transfer.layout, Bool.layout) transferOk fun blockOk (Block.T {args, kind, statements, transfer, ...}) : bool = let fun kindOk (k: Kind.t): bool = let datatype z = datatype Kind.t in case k of Cont _ => true | CReturn {func} => let val return = CFunction.return func in 0 = Vector.length args orelse (1 = Vector.length args andalso let val expects = #2 (Vector.sub (args, 0)) in Type.isSubtype (return, expects) andalso CType.equals (Type.toCType return, Type.toCType expects) end) end | Handler => true | Jump => true end val _ = check' (kind, "kind", kindOk, Kind.layout) val _ = Vector.foreach (statements, fn s => check' (s, "statement", statementOk, Statement.layout)) val _ = check' (transfer, "transfer", transferOk, Transfer.layout) in true end val blockOk = Trace.trace ("Rssa.blockOk", Block.layout, Bool.layout) blockOk val _ = Vector.foreach (blocks, fn b => check' (b, "block", blockOk, Block.layout)) in () end val _ = List.foreach (functions, fn f as Function.T {name, ...} => setFuncInfo (name, f)) val _ = checkFunction main val _ = List.foreach (functions, checkFunction) val _ = check' (main, "main function", fn f => let val {args, ...} = Function.dest f in 0 = Vector.length args end, Function.layout) val _ = clear p in () end handle Err.E e => (Layout.outputl (Err.layout e, Out.error) ; Error.bug "Rssa.typeCheck") end end mlton-20100608/mlton/backend/rssa.sig0000644000076600000240000002176611404435623015771 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RSSA_STRUCTS = sig include ATOMS structure Handler: HANDLER structure ObjectType: OBJECT_TYPE structure ObjptrTycon: OBJPTR_TYCON structure Return: RETURN structure Runtime: RUNTIME structure Scale: SCALE structure Type: REP_TYPE sharing Atoms = Type sharing Handler = Return.Handler sharing Label = Handler.Label = Return.Label sharing ObjectType = Type.ObjectType sharing ObjptrTycon = ObjectType.ObjptrTycon = Type.ObjptrTycon sharing Runtime = Type.Runtime sharing Scale = Type.Scale end signature RSSA = sig include RSSA_STRUCTS structure Switch: SWITCH sharing Atoms = Switch structure Operand: sig datatype t = ArrayOffset of {base: t, index: t, offset: Bytes.t, scale: Scale.t, ty: Type.t} | Cast of t * Type.t | Const of Const.t (* EnsuresBytesFree is a pseudo-op used by C functions (like * GC_allocateArray) that take a number of bytes as an argument * and ensure that that number of bytes is free upon return. * EnsuresBytesFree is replaced by the limit check pass with * a real operand. *) | EnsuresBytesFree | GCState | Offset of {base: t, offset: Bytes.t, ty: Type.t} | ObjptrTycon of ObjptrTycon.t | Runtime of Runtime.GCField.t | Var of {ty: Type.t, var: Var.t} val bool: bool -> t val cast: t * Type.t -> t val layout: t -> Layout.t val null: t val replaceVar: t * (Var.t -> t) -> t val ty: t -> Type.t val word: WordX.t -> t val zero: WordSize.t -> t end sharing Operand = Switch.Use structure Statement: sig datatype t = Bind of {dst: Var.t * Type.t, isMutable: bool, src: Operand.t} | Move of {dst: Operand.t, src: Operand.t} | Object of {dst: Var.t * Type.t, header: word, size: Bytes.t (* including header *)} | PrimApp of {args: Operand.t vector, dst: (Var.t * Type.t) option, prim: Type.t Prim.t} | Profile of ProfileExp.t | ProfileLabel of ProfileLabel.t | SetExnStackLocal | SetExnStackSlot | SetHandler of Label.t (* label must be of Handler kind. *) | SetSlotExnStack (* foldDef (s, a, f) * If s defines a variable x, then return f (x, a), else return a. *) val foldDef: t * 'a * (Var.t * Type.t * 'a -> 'a) -> 'a (* foreachDef (s, f) = foldDef (s, (), fn (x, ()) => f x) *) val foreachDef: t * (Var.t * Type.t -> unit) -> unit val foreachDefUse: t * {def: (Var.t * Type.t) -> unit, use: Var.t -> unit} -> unit val foldUse: t * 'a * (Var.t * 'a -> 'a) -> 'a val foreachUse: t * (Var.t -> unit) -> unit val layout: t -> Layout.t val replaceUses: t * (Var.t -> Operand.t) -> t val resize: Operand.t * Type.t -> Operand.t * t list val toString: t -> string end structure Transfer: sig datatype t = Arith of {args: Operand.t vector, dst: Var.t, overflow: Label.t, (* Must be nullary. *) prim: Type.t Prim.t, success: Label.t, (* Must be nullary. *) ty: Type.t} | CCall of {args: Operand.t vector, func: Type.t CFunction.t, (* return is NONE iff the CFunction doesn't return. * Else, return must be SOME l, where l is of kind * CReturn. The return should be nullary if the C * function returns void. Else, it should be unary with * a var of the appropriate type to accept the result. *) return: Label.t option} | Call of {args: Operand.t vector, func: Func.t, return: Return.t} | Goto of {args: Operand.t vector, dst: Label.t} (* Raise implicitly raises to the caller. * I.E. the local handler stack must be empty. *) | Raise of Operand.t vector | Return of Operand.t vector | Switch of Switch.t val bug: unit -> t (* foldDef (t, a, f) * If t defines a variable x, then return f (x, a), else return a. *) val foldDef: t * 'a * (Var.t * Type.t * 'a -> 'a) -> 'a (* foreachDef (t, f) = foldDef (t, (), fn (x, ()) => f x) *) val foreachDef: t * (Var.t * Type.t -> unit) -> unit val foreachDefLabelUse: t * {def: Var.t * Type.t -> unit, label: Label.t -> unit, use: Var.t -> unit} -> unit val foreachFunc: t * (Func.t -> unit) -> unit val foreachLabel: t * (Label.t -> unit) -> unit val foreachUse: t * (Var.t -> unit) -> unit val ifBool: Operand.t * {falsee: Label.t, truee: Label.t} -> t (* in ifZero, the operand should be of type defaultWord *) val ifZero: Operand.t * {falsee: Label.t, truee: Label.t} -> t val layout: t -> Layout.t val replaceUses: t * (Var.t -> Operand.t) -> t end structure Kind: sig datatype t = Cont of {handler: Handler.t} | CReturn of {func: Type.t CFunction.t} | Handler | Jump datatype frameStyle = None | OffsetsAndSize | SizeOnly val frameStyle: t -> frameStyle end structure Block: sig datatype t = T of {args: (Var.t * Type.t) vector, kind: Kind.t, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} val clear: t -> unit val kind: t -> Kind.t val label: t -> Label.t val layout: t -> Layout.t end structure Function: sig type t val blocks: t -> Block.t vector val clear: t -> unit val dest: t -> {args: (Var.t * Type.t) vector, blocks: Block.t vector, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* dfs (f, v) visits the blocks in depth-first order, applying v b * for block b to yield v', then visiting b's descendents, * then applying v' (). *) val dfs: t * (Block.t -> unit -> unit) -> unit val foreachVar: t * (Var.t * Type.t -> unit) -> unit val name: t -> Func.t val new: {args: (Var.t * Type.t) vector, blocks: Block.t vector, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} -> t end structure Program: sig datatype t = T of {functions: Function.t list, handlesSignals: bool, main: Function.t, objectTypes: ObjectType.t vector} val clear: t -> unit val checkHandlers: t -> unit (* dfs (p, v) visits the functions in depth-first order, applying v f * for function f to yield v', then visiting b's descendents, * then applying v' (). *) val dfs: t * (Function.t -> unit -> unit) -> unit val dropProfile: t -> t val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t val orderFunctions: t -> t val shrink: t -> t val typeCheck: t -> unit end end mlton-20100608/mlton/backend/runtime.fun0000644000076600000240000002005411404435623016477 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Runtime (S: RUNTIME_STRUCTS): RUNTIME = struct open S structure GCField = struct datatype t = AtomicState | CardMapAbsolute | CurrentThread | CurSourceSeqsIndex | ExnStack | Frontier | Limit | LimitPlusSlop | MaxFrameSize | SignalIsPending | StackBottom | StackLimit | StackTop val atomicStateOffset: Bytes.t ref = ref Bytes.zero val cardMapAbsoluteOffset: Bytes.t ref = ref Bytes.zero val currentThreadOffset: Bytes.t ref = ref Bytes.zero val curSourceSeqsIndexOffset: Bytes.t ref = ref Bytes.zero val exnStackOffset: Bytes.t ref = ref Bytes.zero val frontierOffset: Bytes.t ref = ref Bytes.zero val limitOffset: Bytes.t ref = ref Bytes.zero val limitPlusSlopOffset: Bytes.t ref = ref Bytes.zero val maxFrameSizeOffset: Bytes.t ref = ref Bytes.zero val signalIsPendingOffset: Bytes.t ref = ref Bytes.zero val stackBottomOffset: Bytes.t ref = ref Bytes.zero val stackLimitOffset: Bytes.t ref = ref Bytes.zero val stackTopOffset: Bytes.t ref = ref Bytes.zero fun setOffsets {atomicState, cardMapAbsolute, currentThread, curSourceSeqsIndex, exnStack, frontier, limit, limitPlusSlop, maxFrameSize, signalIsPending, stackBottom, stackLimit, stackTop} = (atomicStateOffset := atomicState ; cardMapAbsoluteOffset := cardMapAbsolute ; currentThreadOffset := currentThread ; curSourceSeqsIndexOffset := curSourceSeqsIndex ; exnStackOffset := exnStack ; frontierOffset := frontier ; limitOffset := limit ; limitPlusSlopOffset := limitPlusSlop ; maxFrameSizeOffset := maxFrameSize ; signalIsPendingOffset := signalIsPending ; stackBottomOffset := stackBottom ; stackLimitOffset := stackLimit ; stackTopOffset := stackTop) val offset = fn AtomicState => !atomicStateOffset | CardMapAbsolute => !cardMapAbsoluteOffset | CurrentThread => !currentThreadOffset | CurSourceSeqsIndex => !curSourceSeqsIndexOffset | ExnStack => !exnStackOffset | Frontier => !frontierOffset | Limit => !limitOffset | LimitPlusSlop => !limitPlusSlopOffset | MaxFrameSize => !maxFrameSizeOffset | SignalIsPending => !signalIsPendingOffset | StackBottom => !stackBottomOffset | StackLimit => !stackLimitOffset | StackTop => !stackTopOffset val atomicStateSize: Bytes.t ref = ref Bytes.zero val cardMapAbsoluteSize: Bytes.t ref = ref Bytes.zero val currentThreadSize: Bytes.t ref = ref Bytes.zero val curSourceSeqsIndexSize: Bytes.t ref = ref Bytes.zero val exnStackSize: Bytes.t ref = ref Bytes.zero val frontierSize: Bytes.t ref = ref Bytes.zero val limitSize: Bytes.t ref = ref Bytes.zero val limitPlusSlopSize: Bytes.t ref = ref Bytes.zero val maxFrameSizeSize: Bytes.t ref = ref Bytes.zero val signalIsPendingSize: Bytes.t ref = ref Bytes.zero val stackBottomSize: Bytes.t ref = ref Bytes.zero val stackLimitSize: Bytes.t ref = ref Bytes.zero val stackTopSize: Bytes.t ref = ref Bytes.zero fun setSizes {atomicState, cardMapAbsolute, currentThread, curSourceSeqsIndex, exnStack, frontier, limit, limitPlusSlop, maxFrameSize, signalIsPending, stackBottom, stackLimit, stackTop} = (atomicStateSize := atomicState ; cardMapAbsoluteSize := cardMapAbsolute ; currentThreadSize := currentThread ; curSourceSeqsIndexSize := curSourceSeqsIndex ; exnStackSize := exnStack ; frontierSize := frontier ; limitSize := limit ; limitPlusSlopSize := limitPlusSlop ; maxFrameSizeSize := maxFrameSize ; signalIsPendingSize := signalIsPending ; stackBottomSize := stackBottom ; stackLimitSize := stackLimit ; stackTopSize := stackTop) val size = fn AtomicState => !atomicStateSize | CardMapAbsolute => !cardMapAbsoluteSize | CurrentThread => !currentThreadSize | CurSourceSeqsIndex => !curSourceSeqsIndexSize | ExnStack => !exnStackSize | Frontier => !frontierSize | Limit => !limitSize | LimitPlusSlop => !limitPlusSlopSize | MaxFrameSize => !maxFrameSizeSize | SignalIsPending => !signalIsPendingSize | StackBottom => !stackBottomSize | StackLimit => !stackLimitSize | StackTop => !stackTopSize val toString = fn AtomicState => "AtomicState" | CardMapAbsolute => "CardMapAbsolute" | CurrentThread => "CurrentThread" | CurSourceSeqsIndex => "CurSourceSeqsIndex" | ExnStack => "ExnStack" | Frontier => "Frontier" | Limit => "Limit" | LimitPlusSlop => "LimitPlusSlop" | MaxFrameSize => "MaxFrameSize" | SignalIsPending => "SignalIsPending" | StackBottom => "StackBottom" | StackLimit => "StackLimit" | StackTop => "StackTop" val layout = Layout.str o toString end structure RObjectType = struct datatype t = Array of {hasIdentity: bool, bytesNonObjptrs: Bytes.t, numObjptrs: int} | Normal of {hasIdentity: bool, bytesNonObjptrs: Bytes.t, numObjptrs: int} | Stack | Weak of {gone: bool} fun layout (t: t): Layout.t = let open Layout in case t of Array {hasIdentity, bytesNonObjptrs, numObjptrs} => seq [str "Array ", record [("hasIdentity", Bool.layout hasIdentity), ("bytesNonObjptrs", Bytes.layout bytesNonObjptrs), ("numObjptrs", Int.layout numObjptrs)]] | Normal {hasIdentity, bytesNonObjptrs, numObjptrs} => seq [str "Normal ", record [("hasIdentity", Bool.layout hasIdentity), ("bytesNonObjptrs", Bytes.layout bytesNonObjptrs), ("numObjptrs", Int.layout numObjptrs)]] | Stack => str "Stack" | Weak {gone} => seq [str "Weak", record [("gone", Bool.layout gone)]] end val _ = layout (* quell unused warning *) end (* see gc/object.h *) local val maxTypeIndex = Int.pow (2, 19) in (* see gc/object.c:buildHeaderFromTypeIndex *) fun typeIndexToHeader typeIndex = (Assert.assert ("Runtime.header", fn () => 0 <= typeIndex andalso typeIndex < maxTypeIndex) ; Word.orb (0w1, Word.<< (Word.fromInt typeIndex, 0w1))) fun headerToTypeIndex w = Word.toInt (Word.>> (w, 0w1)) end (* see gc/object.h *) val objptrSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.objptr) (* see gc/object.h *) val headerSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.header) val headerOffset : unit -> Bytes.t = Promise.lazy (Bytes.~ o headerSize) (* see gc/array.h *) val arrayLengthSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.seqIndex) val arrayLengthOffset : unit -> Bytes.t = Promise.lazy (fn () => Bytes.~ (Bytes.+ (headerSize (), arrayLengthSize ()))) val cpointerSize : unit -> Bytes.t = Promise.lazy (Bits.toBytes o Control.Target.Size.cpointer) val labelSize = cpointerSize (* See gc/heap.h. *) val limitSlop = Bytes.fromInt 512 (* See gc/frame.h. *) val maxFrameSize = Bytes.fromInt (Int.pow (2, 16)) end mlton-20100608/mlton/backend/runtime.sig0000644000076600000240000000654111404435623016476 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RUNTIME_STRUCTS = sig end signature RUNTIME = sig include RUNTIME_STRUCTS structure GCField: sig datatype t = AtomicState | CardMapAbsolute | CurrentThread | CurSourceSeqsIndex | ExnStack | Frontier (* The place where the next object is allocated. *) | Limit (* frontier + heapSize - LIMIT_SLOP *) | LimitPlusSlop (* frontier + heapSize *) | MaxFrameSize | SignalIsPending | StackBottom | StackLimit (* Must have StackTop <= StackLimit *) | StackTop (* Points at the next available byte on the stack. *) val layout: t -> Layout.t val offset: t -> Bytes.t (* Field offset in struct GC_state. *) val setOffsets: {atomicState: Bytes.t, cardMapAbsolute: Bytes.t, currentThread: Bytes.t, curSourceSeqsIndex: Bytes.t, exnStack: Bytes.t, frontier: Bytes.t, limit: Bytes.t, limitPlusSlop: Bytes.t, maxFrameSize: Bytes.t, signalIsPending: Bytes.t, stackBottom: Bytes.t, stackLimit: Bytes.t, stackTop: Bytes.t} -> unit val setSizes: {atomicState: Bytes.t, cardMapAbsolute: Bytes.t, currentThread: Bytes.t, curSourceSeqsIndex: Bytes.t, exnStack: Bytes.t, frontier: Bytes.t, limit: Bytes.t, limitPlusSlop: Bytes.t, maxFrameSize: Bytes.t, signalIsPending: Bytes.t, stackBottom: Bytes.t, stackLimit: Bytes.t, stackTop: Bytes.t} -> unit val size: t -> Bytes.t (* Field size in struct GC_state. *) val toString: t -> string end structure RObjectType: sig datatype t = Array of {hasIdentity: bool, bytesNonObjptrs: Bytes.t, numObjptrs: int} | Normal of {hasIdentity: bool, bytesNonObjptrs: Bytes.t, numObjptrs: int} | Stack | Weak of {gone: bool} end val arrayLengthOffset: unit -> Bytes.t val arrayLengthSize: unit -> Bytes.t val headerOffset: unit -> Bytes.t val headerSize: unit -> Bytes.t val headerToTypeIndex: word -> int val labelSize: unit -> Bytes.t val limitSlop: Bytes.t val maxFrameSize: Bytes.t val cpointerSize: unit -> Bytes.t val objptrSize: unit -> Bytes.t val typeIndexToHeader: int -> word end mlton-20100608/mlton/backend/scale.fun0000644000076600000240000000130011404435623016074 0ustar mtfstaff(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Scale (S: SCALE_STRUCTS): SCALE = struct open S datatype t = One | Two | Four | Eight val toString = fn One => "1" | Two => "2" | Four => "4" | Eight => "8" val layout = Layout.str o toString val fromInt: int -> t option = fn 1 => SOME One | 2 => SOME Two | 4 => SOME Four | 8 => SOME Eight | _ => NONE val fromBytes: Bytes.t -> t option = fromInt o Bytes.toInt val toInt: t -> int = fn One => 1 | Two => 2 | Four => 4 | Eight => 8 end mlton-20100608/mlton/backend/scale.sig0000644000076600000240000000100311404435623016066 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SCALE_STRUCTS = sig end signature SCALE = sig include SCALE_STRUCTS datatype t = One | Two | Four | Eight val fromBytes: Bytes.t -> t option val layout: t -> Layout.t val toInt: t -> int val toString: t -> string end mlton-20100608/mlton/backend/signal-check.fun0000644000076600000240000001523611404435623017352 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SignalCheck (S: SIGNAL_CHECK_STRUCTS): SIGNAL_CHECK = struct open S open Rssa structure CFunction = struct open CFunction Type.BuiltInCFunction end structure Graph = DirectedGraph local open Graph in structure Node = Node structure Forest = LoopForest end fun insertInFunction (f: Function.t): Function.t = let val {args, blocks, name, raises, returns, start} = Function.dest f val {get = labelIndex: Label.t -> int, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val g = Graph.new () val n = Vector.length blocks val {get = nodeIndex: unit Node.t -> int, set = setNodeIndex, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("index", Node.layout)) val nodes = Vector.tabulate (n, fn i => let val n = Graph.newNode g val _ = setNodeIndex (n, i) in n end) val isHeader = Array.new (n, false) fun indexNode i = Vector.sub (nodes, i) val labelNode = indexNode o labelIndex val _ = Vector.foreachi (blocks, fn (i, Block.T {transfer, ...}) => let val from = indexNode i in if (case transfer of Transfer.CCall {func, ...} => CFunction.maySwitchThreads func | _ => false) then () else Transfer.foreachLabel (transfer, fn to => (ignore o Graph.addEdge) (g, {from = from, to = labelNode to})) end) val extra: Block.t list ref = ref [] fun addSignalCheck (Block.T {args, kind, label, statements, transfer}) : unit = let val collect = Label.newNoname () val collectReturn = Label.newNoname () val dontCollect = Label.newNoname () val res = Var.newNoname () val compare = Vector.new1 (Statement.PrimApp {args = (Vector.new2 (Operand.Runtime Runtime.GCField.Limit, Operand.null)), dst = SOME (res, Type.bool), prim = Prim.cpointerEqual}) val compareTransfer = Transfer.ifBool (Operand.Var {var = res, ty = Type.bool}, {falsee = dontCollect, truee = collect}) val func = CFunction.gc {maySwitchThreads = true} val _ = extra := Block.T {args = args, kind = kind, label = label, statements = compare, transfer = compareTransfer} :: (Block.T {args = Vector.new0 (), kind = Kind.Jump, label = collect, statements = Vector.new0 (), transfer = Transfer.CCall {args = Vector.new3 (Operand.GCState, Operand.word (WordX.zero (WordSize.csize ())), Operand.bool false), func = func, return = SOME collectReturn}}) :: (Block.T {args = Vector.new0 (), kind = Kind.CReturn {func = func}, label = collectReturn, statements = Vector.new0 (), transfer = Transfer.Goto {dst = dontCollect, args = Vector.new0 ()}}) :: Block.T {args = Vector.new0 (), kind = Kind.Jump, label = dontCollect, statements = statements, transfer = transfer} :: !extra in () end (* Create extra blocks with signal checks for all blocks that are * loop headers. *) fun loop (f: unit Forest.t) = let val {loops, ...} = Forest.dest f in Vector.foreach (loops, fn {headers, child} => let val _ = Vector.foreach (headers, fn n => let val i = nodeIndex n val _ = Array.update (isHeader, i, true) in addSignalCheck (Vector.sub (blocks, i)) end) val _ = loop child in () end) end (* Add a signal check at the function entry. *) val newStart = Label.newNoname () val _ = addSignalCheck (Block.T {args = Vector.new0 (), kind = Kind.Jump, label = newStart, statements = Vector.new0 (), transfer = Transfer.Goto {args = Vector.new0 (), dst = start}}) val () = loop (Graph.loopForestSteensgaard (g, {root = labelNode start})) val blocks = Vector.keepAllMap (blocks, fn b as Block.T {label, ...} => if Array.sub (isHeader, labelIndex label) then NONE else SOME b) val blocks = Vector.concat [blocks, Vector.fromList (!extra)] val f = Function.new {args = args, blocks = blocks, name = name, raises = raises, returns = returns, start = newStart} val _ = Function.clear f in f end fun insert p = let val Program.T {functions, handlesSignals, main, objectTypes} = p in if not handlesSignals then p else Program.T {functions = List.revMap (functions, insertInFunction), handlesSignals = handlesSignals, main = main, objectTypes = objectTypes} end end mlton-20100608/mlton/backend/signal-check.sig0000644000076600000240000000075311404435623017342 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SIGNAL_CHECK_STRUCTS = sig structure Rssa: RSSA end signature SIGNAL_CHECK = sig include SIGNAL_CHECK_STRUCTS val insert: Rssa.Program.t -> Rssa.Program.t end mlton-20100608/mlton/backend/sources.cm0000644000076600000240000000207011404435623016304 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature MACHINE signature REP_TYPE signature RUNTIME functor Backend functor Machine is ../../lib/mlton/sources.cm ../ast/sources.cm ../atoms/sources.cm ../control/sources.cm ../ssa/sources.cm runtime.sig runtime.fun objptr-tycon.sig objptr-tycon.fun object-type.sig scale.sig scale.fun rep-type.sig rep-type.fun switch.sig switch.fun err.sml rssa.sig rssa.fun machine.sig machine.fun representation.sig packed-representation.fun ssa-to-rssa.sig ssa-to-rssa.fun implement-handlers.sig implement-handlers.fun implement-profiling.sig implement-profiling.fun limit-check.sig limit-check.fun signal-check.sig signal-check.fun live.sig live.fun allocate-registers.sig allocate-registers.fun equivalence-graph.sig equivalence-graph.fun chunkify.sig chunkify.fun parallel-move.sig parallel-move.fun backend.sig backend.fun mlton-20100608/mlton/backend/sources.mlb0000644000076600000240000000232411404435623016461 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../ast/sources.mlb ../atoms/sources.mlb ../control/sources.mlb ../ssa/sources.mlb runtime.sig runtime.fun objptr-tycon.sig objptr-tycon.fun object-type.sig scale.sig scale.fun rep-type.sig rep-type.fun switch.sig switch.fun err.sml rssa.sig rssa.fun machine.sig machine.fun representation.sig packed-representation.fun ssa-to-rssa.sig ssa-to-rssa.fun implement-handlers.sig implement-handlers.fun implement-profiling.sig implement-profiling.fun limit-check.sig limit-check.fun signal-check.sig signal-check.fun live.sig live.fun allocate-registers.sig allocate-registers.fun equivalence-graph.sig equivalence-graph.fun chunkify.sig chunkify.fun parallel-move.sig parallel-move.fun backend.sig backend.fun in signature MACHINE signature REP_TYPE signature RUNTIME functor Backend functor Machine end mlton-20100608/mlton/backend/ssa-to-rssa.fun0000644000076600000240000022016611404435623017176 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SsaToRssa (S: SSA_TO_RSSA_STRUCTS): SSA_TO_RSSA = struct open S open Rssa datatype z = datatype WordSize.prim structure S = Ssa local open Ssa in structure Base = Base end local open Runtime in structure GCField = GCField end structure Prim = struct open Prim type t = Type.t Prim.t end structure CFunction = struct open CFunction open Type.BuiltInCFunction type t = Type.t CFunction.t structure CType = struct open CType val gcState = CPointer val thread = CPointer (* CHECK; thread (= objptr) would be better? *) end datatype z = datatype Convention.t datatype z = datatype SymbolScope.t datatype z = datatype Target.t val copyCurrentThread = fn () => T {args = Vector.new1 (Type.gcState ()), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = true, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new1 CType.gcState, NONE), readsStackTop = true, return = Type.unit, symbolScope = Private, target = Direct "GC_copyCurrentThread", writesStackTop = true} (* CHECK; thread as objptr *) val copyThread = fn () => T {args = Vector.new2 (Type.gcState (), Type.thread ()), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = true, maySwitchThreads = false, modifiesFrontier = true, prototype = let open CType in (Vector.new2 (CPointer, CPointer), SOME CPointer) end, readsStackTop = true, return = Type.thread (), symbolScope = Private, target = Direct "GC_copyThread", writesStackTop = true} val halt = fn () => T {args = Vector.new2 (Type.gcState (), Type.cint ()), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new2 (CType.gcState, CType.cint ()), NONE), readsStackTop = true, return = Type.unit, symbolScope = Private, target = Direct "MLton_halt", writesStackTop = true} fun gcArrayAllocate {return} = T {args = Vector.new4 (Type.gcState (), Type.csize (), Type.seqIndex (), Type.objptrHeader ()), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = true, mayGC = true, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new4 (CType.gcState, CType.csize (), CType.seqIndex (), CType.objptrHeader ()), SOME CType.objptr), readsStackTop = true, return = return, symbolScope = Private, target = Direct "GC_arrayAllocate", writesStackTop = true} val returnToC = fn () => T {args = Vector.new0 (), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = true, maySwitchThreads = true, modifiesFrontier = true, prototype = (Vector.new0 (), NONE), readsStackTop = true, return = Type.unit, symbolScope = Private, target = Direct "Thread_returnToC", writesStackTop = true} (* CHECK; thread as objptr *) val threadSwitchTo = fn () => T {args = Vector.new3 (Type.gcState (), Type.thread (), Type.csize ()), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = true, mayGC = true, maySwitchThreads = true, modifiesFrontier = true, prototype = (Vector.new3 (CType.gcState, CType.thread, CType.csize ()), NONE), readsStackTop = true, return = Type.unit, symbolScope = Private, target = Direct "GC_switchToThread", writesStackTop = true} (* CHECK; weak as objptr *) fun weakCanGet {arg} = T {args = Vector.new2 (Type.gcState (), arg), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = false, prototype = (Vector.new2 (CType.gcState, CType.cpointer), SOME CType.bool), readsStackTop = false, return = Type.bool, symbolScope = Private, target = Direct "GC_weakCanGet", writesStackTop = false} (* CHECK; weak as objptr *) fun weakGet {arg, return} = T {args = Vector.new2 (Type.gcState (), arg), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = false, prototype = (Vector.new2 (CType.gcState, CType.cpointer), SOME CType.cpointer), readsStackTop = false, return = return, symbolScope = Private, target = Direct "GC_weakGet", writesStackTop = false} (* CHECK; weak as objptr *) fun weakNew {arg, return} = T {args = Vector.new3 (Type.gcState (), Type.objptrHeader (), arg), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = true, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new3 (CType.gcState, CType.objptrHeader (), CType.cpointer), SOME (CType.cpointer)), readsStackTop = true, return = return, symbolScope = Private, target = Direct "GC_weakNew", writesStackTop = true} val worldSave = fn () => T {args = Vector.new2 (Type.gcState (), Type.string ()), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = true, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new2 (CType.gcState, CType.cpointer), NONE), readsStackTop = true, return = Type.unit, symbolScope = Private, target = Direct "GC_saveWorld", writesStackTop = true} (* CHECK; share with objptr *) fun share t = T {args = Vector.new2 (Type.gcState (), t), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = true, (* MLton.share works by tracing an object. * Make sure all the GC invariants are true, * because tracing might encounter the current * stack in the heap. *) maySwitchThreads = false, modifiesFrontier = true, (* actually, just readsFrontier *) prototype = (Vector.new2 (CType.gcState, CType.cpointer), NONE), readsStackTop = true, return = Type.unit, symbolScope = Private, target = Direct "GC_share", writesStackTop = true} (* CHECK; size with objptr *) fun size t = T {args = Vector.new2 (Type.gcState (), t), bytesNeeded = NONE, convention = Cdecl, ensuresBytesFree = false, mayGC = true, (* MLton.size works by tracing an object. * Make sure all the GC invariants are true, * because tracing might encounter the current * stack in the heap. *) maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new2 (CType.gcState, CType.cpointer), SOME (CType.csize ())), readsStackTop = true, return = Type.csize (), symbolScope = Private, target = Direct "GC_size", writesStackTop = true} end structure Name = struct open Prim.Name type t = Type.t t structure CType = struct open CType val intInf = Objptr val string = Objptr end fun cFunctionRaise (n: t): CFunction.t = let datatype z = datatype CFunction.Convention.t datatype z = datatype CFunction.SymbolScope.t datatype z = datatype CFunction.Target.t val name = toString n val real = Type.real val word = Type.word val vanilla = CFunction.vanilla fun wordCType (s, sg) = CType.word (s, sg) fun realCType s = CType.real s fun coerce (t1, ct1, t2, ct2) = vanilla {args = Vector.new1 t1, name = name, prototype = (Vector.new1 ct1, SOME ct2), return = t2} fun amAllocationProfiling () = Control.ProfileAlloc = !Control.profile val intInfBinary = fn () => CFunction.T {args = Vector.new3 (Type.intInf (), Type.intInf (), Type.csize ()), bytesNeeded = SOME 2, convention = Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new3 (CType.intInf, CType.intInf, CType.csize ()), SOME CType.intInf), readsStackTop = amAllocationProfiling (), return = Type.intInf (), symbolScope = Private, target = Direct name, writesStackTop = false} val intInfShift = fn () => CFunction.T {args = Vector.new3 (Type.intInf (), Type.shiftArg, Type.csize ()), bytesNeeded = SOME 2, convention = Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new3 (CType.intInf, CType.shiftArg, CType.csize ()), SOME CType.intInf), readsStackTop = amAllocationProfiling (), return = Type.intInf (), symbolScope = Private, target = Direct name, writesStackTop = false} val intInfToString = fn () => (* CHECK; cint would be better? *) CFunction.T {args = Vector.new3 (Type.intInf (), Type.word WordSize.word32, Type.csize ()), bytesNeeded = SOME 2, convention = Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new3 (CType.intInf, CType.Int32, CType.csize ()), SOME CType.string), readsStackTop = amAllocationProfiling (), return = Type.string (), symbolScope = Private, target = Direct name, writesStackTop = false} val intInfUnary = fn () => CFunction.T {args = Vector.new2 (Type.intInf (), Type.csize ()), bytesNeeded = SOME 1, convention = Cdecl, ensuresBytesFree = false, mayGC = false, maySwitchThreads = false, modifiesFrontier = true, prototype = (Vector.new2 (CType.intInf, CType.csize ()), SOME CType.intInf), readsStackTop = amAllocationProfiling (), return = Type.intInf (), symbolScope = Private, target = Direct name, writesStackTop = false} local fun make n s = let val t = real s val ct = CType.real s in vanilla {args = Vector.new (n, t), name = name, prototype = (Vector.new (n, ct), SOME ct), return = t} end in val realBinary = make 2 val realTernary = make 3 val realUnary = make 1 end fun realCompare s = let val t = real s in vanilla {args = Vector.new2 (t, t), name = name, prototype = let val t = CType.real s in (Vector.new2 (t, t), SOME CType.bool) end, return = Type.bool} end local fun make n (s, sg) = let val t = word s val ct = CType.word (s, sg) in vanilla {args = Vector.new (n, t), name = name, prototype = (Vector.new (n, ct), SOME ct), return = t} end fun makeOverflows n (s, sg) = let val t = word s val ct = CType.word (s, sg) in vanilla {args = Vector.new (n, t), name = name ^ "Overflows", prototype = (Vector.new (n, ct), SOME CType.bool), return = Type.bool} end in val wordBinary = make 2 val wordBinaryOverflows = makeOverflows 2 val wordUnary = make 1 val wordUnaryOverflows = makeOverflows 1 end fun wordCompare (s, sg) = let val t = word s val ct = CType.word (s, sg) in vanilla {args = Vector.new2 (t, t), name = name, prototype = (Vector.new2 (ct, ct), SOME CType.bool), return = Type.bool} end fun wordShift (s, sg) = let val t = word s val ct = CType.word (s, sg) in vanilla {args = Vector.new2 (t, Type.shiftArg), name = name, prototype = (Vector.new2 (ct, CType.shiftArg), SOME ct), return = t} end in case n of IntInf_add => intInfBinary () | IntInf_andb => intInfBinary () | IntInf_arshift => intInfShift () | IntInf_compare => (* CHECK; cint would be better? *) vanilla {args = Vector.new2 (Type.intInf (), Type.intInf ()), name = name, prototype = (Vector.new2 (CType.intInf, CType.intInf), SOME CType.Int32), return = Type.word WordSize.word32} | IntInf_equal => vanilla {args = Vector.new2 (Type.intInf (), Type.intInf ()), name = name, prototype = (Vector.new2 (CType.intInf, CType.intInf), SOME CType.bool), return = Type.bool} | IntInf_gcd => intInfBinary () | IntInf_lshift => intInfShift () | IntInf_mul => intInfBinary () | IntInf_neg => intInfUnary () | IntInf_notb => intInfUnary () | IntInf_orb => intInfBinary () | IntInf_quot => intInfBinary () | IntInf_rem => intInfBinary () | IntInf_sub => intInfBinary () | IntInf_toString => intInfToString () | IntInf_xorb => intInfBinary () | MLton_bug => CFunction.bug () | Real_Math_acos s => realUnary s | Real_Math_asin s => realUnary s | Real_Math_atan s => realUnary s | Real_Math_atan2 s => realBinary s | Real_Math_cos s => realUnary s | Real_Math_exp s => realUnary s | Real_Math_ln s => realUnary s | Real_Math_log10 s => realUnary s | Real_Math_sin s => realUnary s | Real_Math_sqrt s => realUnary s | Real_Math_tan s => realUnary s | Real_abs s => realUnary s | Real_add s => realBinary s | Real_castToWord (s1, s2) => coerce (real s1, realCType s1, word s2, wordCType (s2, {signed = false})) | Real_div s => realBinary s | Real_equal s => realCompare s | Real_ldexp s => let val t = real s val ct = CType.real s in vanilla {args = Vector.new2 (t, Type.cint ()), name = name, prototype = (Vector.new2 (ct, CType.cint ()), SOME ct), return = t} end | Real_le s => realCompare s | Real_lt s => realCompare s | Real_mul s => realBinary s | Real_muladd s => realTernary s | Real_mulsub s => realTernary s | Real_neg s => realUnary s | Real_qequal s => realCompare s | Real_rndToReal (s1, s2) => coerce (real s1, realCType s1, real s2, realCType s2) | Real_rndToWord (s1, s2, sg) => coerce (real s1, realCType s1, word s2, wordCType (s2, sg)) | Real_round s => realUnary s | Real_sub s => realBinary s | Thread_returnToC => CFunction.returnToC () | Word_add s => wordBinary (s, {signed = false}) | Word_addCheck (s, sg) => wordBinaryOverflows (s, sg) | Word_andb s => wordBinary (s, {signed = false}) | Word_castToReal (s1, s2) => coerce (word s1, wordCType (s1, {signed = false}), real s2, realCType s2) | Word_equal s => wordCompare (s, {signed = false}) | Word_extdToWord (s1, s2, sg) => coerce (word s1, wordCType (s1, sg), word s2, wordCType (s2, {signed = false})) | Word_lshift s => wordShift (s, {signed = false}) | Word_lt z => wordCompare z | Word_mul z => wordBinary z | Word_mulCheck (s, sg) => wordBinaryOverflows (s, sg) | Word_neg s => wordUnary (s, {signed = true}) | Word_negCheck s => wordUnaryOverflows (s, {signed = true}) | Word_notb s => wordUnary (s, {signed = false}) | Word_orb s => wordBinary (s, {signed = false}) | Word_quot z => wordBinary z | Word_rem z => wordBinary z | Word_rndToReal (s1, s2, sg) => coerce (word s1, wordCType (s1, sg), real s2, realCType s2) | Word_xorb s => wordBinary (s, {signed = false}) | Word_rol s => wordShift (s, {signed = false}) | Word_ror s => wordShift (s, {signed = false}) | Word_rshift z => wordShift z | Word_sub s => wordBinary (s, {signed = false}) | Word_subCheck (s, sg) => wordBinaryOverflows (s, sg) | _ => Error.bug "SsaToRssa.Name.cFunctionRaise" end fun cFunction n = SOME (cFunctionRaise n) handle _ => NONE end datatype z = datatype Operand.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure PackedRepresentation = PackedRepresentation (structure Rssa = Rssa structure Ssa = Ssa) structure Type = struct open Type fun scale (ty: t): Scale.t = case Scale.fromBytes (bytes ty) of NONE => Error.bug "SsaToRssa.Type.scale" | SOME s => s end val cardSizeLog2 : IntInf.t = 8 (* must agree with CARD_SIZE_LOG2 in gc.c *) fun updateCard (addr: Operand.t): Statement.t list = let val index = Var.newNoname () (* CHECK; WordSize.objptr or WordSize.cpointer? *) val sz = WordSize.objptr () val indexTy = Type.word sz val cardElemSize = WordSize.fromBits Bits.inByte in [PrimApp {args = (Vector.new2 (Operand.cast (addr, Type.bits (WordSize.bits sz)), Operand.word (WordX.fromIntInf (cardSizeLog2, WordSize.shiftArg)))), dst = SOME (index, indexTy), prim = Prim.wordRshift (sz, {signed = false})}, Move {dst = (ArrayOffset {base = Runtime GCField.CardMapAbsolute, index = Var {ty = indexTy, var = index}, offset = Bytes.zero, scale = Scale.One, ty = Type.word cardElemSize}), src = Operand.word (WordX.one cardElemSize)}] end fun convertConst (c: Const.t): Const.t = let datatype z = datatype Const.t in case c of Word w => Word (WordX.resize (w, WordSize.roundUpToPrim (WordX.size w))) | _ => c end fun convert (program as S.Program.T {functions, globals, main, ...}, {codegenImplementsPrim: Rssa.Type.t Rssa.Prim.t -> bool}): Rssa.Program.t = let val {diagnostic, genCase, object, objectTypes, select, toRtype, update} = PackedRepresentation.compute program val objectTypes = Vector.concat [ObjectType.basic (), objectTypes] val () = Vector.foreachi (objectTypes, fn (i, (opt, _)) => ObjptrTycon.setIndex (opt, i)) val objectTypes = Vector.map (objectTypes, #2) val () = diagnostic () val {get = varInfo: Var.t -> {ty: S.Type.t}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("varInfo", Var.layout)) val setVarInfo = Trace.trace2 ("SsaToRssa.setVarInfo", Var.layout, S.Type.layout o #ty, Unit.layout) setVarInfo val varType = #ty o varInfo fun varOp (x: Var.t): Operand.t = Var {var = x, ty = valOf (toRtype (varType x))} val varOp = Trace.trace ("SsaToRssa.varOp", Var.layout, Operand.layout) varOp fun varOps xs = Vector.map (xs, varOp) val extraBlocks = ref [] fun newBlock {args, kind, statements: Statement.t vector, transfer: Transfer.t}: Label.t = let val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = args, kind = kind, label = l, statements = statements, transfer = transfer}) in l end val {get = labelInfo: (Label.t -> {args: (Var.t * S.Type.t) vector, cont: (Handler.t * Label.t) list ref, handler: Label.t option ref}), set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("label info", Label.layout)) fun translateCase ({test: Var.t, cases: S.Cases.t, default: Label.t option}) : Statement.t list * Transfer.t = case cases of S.Cases.Con cases => (case (Vector.length cases, default) of (0, NONE) => ([], Transfer.bug ()) | _ => (case S.Type.dest (varType test) of S.Type.Datatype tycon => let val test = fn () => varOp test val cases = Vector.map (cases, fn (con, dst) => {con = con, dst = dst, dstHasArg = Vector.fold (#args (labelInfo dst), false, fn ((_,ty),b) => b orelse isSome (toRtype ty))}) val (ss, t, blocks) = genCase {cases = cases, default = default, test = test, tycon = tycon} val () = extraBlocks := blocks @ !extraBlocks in (ss, t) end | _ => Error.bug "SsaToRssa.translateCase: strange type")) | S.Cases.Word (s, cs) => ([], Switch (Switch.T {cases = (QuickSort.sortVector (cs, fn ((w, _), (w', _)) => WordX.le (w, w', {signed = false}))), default = default, size = s, test = varOp test})) fun eta (l: Label.t, kind: Kind.t): Label.t = let val {args, ...} = labelInfo l val args = Vector.keepAllMap (args, fn (x, t) => Option.map (toRtype t, fn t => (Var.new x, t))) val l' = Label.new l val _ = List.push (extraBlocks, Block.T {args = args, kind = kind, label = l', statements = Vector.new0 (), transfer = (Transfer.Goto {dst = l, args = Vector.map (args, fn (var, ty) => Var {var = var, ty = ty})})}) in l' end fun labelHandler (l: Label.t): Label.t = let val {handler, ...} = labelInfo l in case !handler of NONE => let val l' = eta (l, Kind.Handler) val _ = handler := SOME l' in l' end | SOME l => l end fun labelCont (l: Label.t, h: Handler.t): Label.t = let val {cont, ...} = labelInfo l datatype z = datatype Handler.t in case List.peek (!cont, fn (h', _) => Handler.equals (h, h')) of SOME (_, l) => l | NONE => let val l' = eta (l, Kind.Cont {handler = h}) val _ = List.push (cont, (h, l')) in l' end end val labelCont = Trace.trace2 ("SsaToRssa.labelCont", Label.layout, Handler.layout, Label.layout) labelCont fun vos (xs: Var.t vector) = Vector.keepAllMap (xs, fn x => Option.map (toRtype (varType x), fn _ => varOp x)) fun bogus (t: Type.t): Operand.t = case Type.deReal t of NONE => Operand.cast (Operand.word (Type.bogusWord t), t) | SOME s => Operand.Const (Const.real (RealX.zero s)) val handlesSignals = S.Program.hasPrim (program, fn p => case Prim.name p of Prim.Name.MLton_installSignalHandler => true | _ => false) fun translateFormals v = Vector.keepAllMap (v, fn (x, t) => Option.map (toRtype t, fn t => (x, t))) fun translatePrim p = Prim.map (p, fn t => case toRtype t of NONE => Type.unit | SOME t => t) fun translateTransfer (t: S.Transfer.t): (Statement.t list * Transfer.t) = case t of S.Transfer.Arith {args, overflow, prim, success, ty} => let val prim = translatePrim prim val ty = valOf (toRtype ty) val res = Var.newNoname () val noOverflow = newBlock {args = Vector.new0 (), kind = Kind.Jump, statements = Vector.new0 (), transfer = (Transfer.Goto {dst = success, args = (Vector.new1 (Var {var = res, ty = ty}))})} in if codegenImplementsPrim prim then ([], Transfer.Arith {dst = res, args = vos args, overflow = overflow, prim = prim, success = noOverflow, ty = ty}) else let datatype z = datatype Prim.Name.t fun doOperCheckCF (operCheck) = let val operCheckCF = case Name.cFunction operCheck of NONE => Error.bug (concat ["SsaToRssa.translateTransfer: ", "unimplemented arith:", Name.toString operCheck]) | SOME operCheckCF => operCheckCF val afterOperCheck = let val checkRes = Var.newNoname () in newBlock {args = Vector.new1 (checkRes, Type.bool), kind = Kind.CReturn {func = operCheckCF}, statements = Vector.new0 (), transfer = (Transfer.ifBool (Var {var = checkRes, ty = Type.bool}, {falsee = noOverflow, truee = overflow}))} end in Transfer.CCall {args = vos args, func = operCheckCF, return = SOME afterOperCheck} end fun doOperCF (oper, operCheck) = let val operCF = case Name.cFunction oper of NONE => Error.bug (concat ["SsaToRssa.translateTransfer: ", "unimplemented arith:", Name.toString oper]) | SOME operCF => operCF val afterOper = newBlock {args = Vector.new1 (res, ty), kind = Kind.CReturn {func = operCF}, statements = Vector.new0 (), transfer = doOperCheckCF operCheck} in Transfer.CCall {args = vos args, func = operCF, return = SOME afterOper} end fun doPrim prim = [Statement.PrimApp {dst = SOME (res, ty), prim = prim, args = vos args}] fun doit (prim, operCheck) = if codegenImplementsPrim prim then (doPrim prim, doOperCheckCF operCheck) else ([], doOperCF (Prim.name prim, operCheck)) in case Prim.name prim of Word_addCheck (s, sg) => doit (Prim.wordAdd s, Word_addCheck (s, sg)) | Word_mulCheck (s, sg) => doit (Prim.wordMul (s, sg), Word_mulCheck (s, sg)) | Word_negCheck s => doit (Prim.wordNeg s, Word_negCheck s) | Word_subCheck (s, sg) => doit (Prim.wordSub s, Word_subCheck (s, sg)) | _ => Error.bug (concat ["SsaToRssa.translateTransfer: ", "strange arith:", Name.toString (Prim.name prim)]) end end | S.Transfer.Bug => ([], Transfer.bug ()) | S.Transfer.Call {func, args, return} => let datatype z = datatype S.Return.t val return = case return of Dead => Return.Dead | NonTail {cont, handler} => let datatype z = datatype S.Handler.t val handler = case handler of Caller => Handler.Caller | Dead => Handler.Dead | Handle l => Handler.Handle (labelHandler l) in Return.NonTail {cont = labelCont (cont, handler), handler = handler} end | Tail => Return.Tail in ([], Transfer.Call {func = func, args = vos args, return = return}) end | S.Transfer.Case r => translateCase r | S.Transfer.Goto {dst, args} => ([], Transfer.Goto {dst = dst, args = vos args}) | S.Transfer.Raise xs => ([], Transfer.Raise (vos xs)) | S.Transfer.Return xs => ([], Transfer.Return (vos xs)) | S.Transfer.Runtime {args, prim, return} => let datatype z = datatype Prim.Name.t in case Prim.name prim of MLton_halt => ([], Transfer.CCall {args = Vector.concat [Vector.new1 GCState, vos args], func = CFunction.halt (), return = NONE}) | Thread_copyCurrent => let val func = CFunction.copyCurrentThread () val l = newBlock {args = Vector.new0 (), kind = Kind.CReturn {func = func}, statements = Vector.new0 (), transfer = (Goto {args = Vector.new0 (), dst = return})} in ([], Transfer.CCall {args = Vector.concat [Vector.new1 GCState, vos args], func = func, return = SOME l}) end | _ => Error.bug (concat ["SsaToRssa.translateTransfer: ", "strange Runtime prim: ", Prim.toString prim]) end fun translateStatementsTransfer (statements, ss, transfer) = let fun loop (i, ss, t): Statement.t vector * Transfer.t = if i < 0 then (Vector.fromList ss, t) else let fun none () = loop (i - 1, ss, t) fun add s = loop (i - 1, s :: ss, t) fun adds ss' = loop (i - 1, ss' @ ss, t) val s = Vector.sub (statements, i) in case s of S.Statement.Profile e => add (Statement.Profile e) | S.Statement.Update {base, offset, value} => (case toRtype (varType value) of NONE => none () | SOME t => let val baseOp = Base.map (base, varOp) val ss = update {base = baseOp, baseTy = varType (Base.object base), offset = offset, value = varOp value} val ss = if !Control.markCards andalso Type.isObjptr t then updateCard (Base.object baseOp) @ ss else ss in adds ss end) | S.Statement.Bind {exp, ty, var} => let fun split (args, kind, ss: Statement.t list, make: Label.t -> Statement.t list * Transfer.t) = let val l = newBlock {args = args, kind = kind, statements = Vector.fromList ss, transfer = t} val (ss, t) = make l in loop (i - 1, ss, t) end fun maybeMove (f: Type.t -> Operand.t) = case toRtype ty of NONE => none () | SOME ty => add (Bind {dst = (valOf var, ty), isMutable = false, src = f ty}) fun move (src: Operand.t) = maybeMove (fn _ => src) in case exp of S.Exp.Const c => move (Const (convertConst c)) | S.Exp.Inject {variant, ...} => if isSome (toRtype ty) then move (varOp variant) else none () | S.Exp.Object {args, con} => (case toRtype ty of NONE => none () | SOME dstTy => adds (object {args = args, con = con, dst = (valOf var, dstTy), objectTy = ty, oper = varOp})) | S.Exp.PrimApp {args, prim} => let val prim = translatePrim prim fun arg i = Vector.sub (args, i) fun a i = varOp (arg i) fun cast () = move (Operand.cast (a 0, valOf (toRtype ty))) fun ifIsWeakPointer (ty: S.Type.t, yes, no) = case S.Type.dest ty of S.Type.Weak ty => (case toRtype ty of NONE => no () | SOME t => if Type.isObjptr t then yes t else no ()) | _ => Error.bug "SsaToRssa.ifIsWeakPointer" fun arrayOrVectorLength () = move (Offset {base = a 0, offset = Runtime.arrayLengthOffset (), ty = Type.seqIndex ()}) fun subWord s = let val ty = Type.word s in move (ArrayOffset {base = a 0, index = a 1, offset = Bytes.zero, scale = Type.scale ty, ty = ty}) end fun dst () = case var of SOME x => Option.map (toRtype (varType x), fn t => (x, t)) | NONE => NONE fun primApp prim = add (PrimApp {dst = dst (), prim = prim, args = varOps args}) datatype z = datatype Prim.Name.t fun bumpAtomicState n = let val atomicState = Runtime GCField.AtomicState val res = Var.newNoname () val resTy = Operand.ty atomicState in [Statement.PrimApp {args = (Vector.new2 (atomicState, (Operand.word (WordX.fromIntInf (IntInf.fromInt n, WordSize.word32))))), dst = SOME (res, resTy), prim = Prim.wordAdd WordSize.word32}, Statement.Move {dst = atomicState, src = Var {ty = resTy, var = res}}] end fun ccall {args: Operand.t vector, func: CFunction.t} = let val formals = case dst () of NONE => Vector.new0 () | SOME (x, t) => Vector.new1 (x, t) in split (formals, Kind.CReturn {func = func}, ss, fn l => ([], Transfer.CCall {args = args, func = func, return = SOME l})) end fun simpleCCall (f: CFunction.t) = ccall {args = vos args, func = f} fun simpleCCallWithGCState (f: CFunction.t) = ccall {args = Vector.concat [Vector.new1 GCState, vos args], func = f} fun array (numElts: Operand.t) = let val result = valOf (toRtype ty) val opt = case Type.deObjptr result of NONE => Error.bug "SsaToRssa.array" | SOME opt => ObjptrTycon opt val args = Vector.new4 (GCState, EnsuresBytesFree, numElts, opt) val func = CFunction.gcArrayAllocate {return = result} in ccall {args = args, func = func} end fun cpointerGet () = maybeMove (fn ty => ArrayOffset {base = a 0, index = a 1, offset = Bytes.zero, scale = Type.scale ty, ty = ty}) fun cpointerSet () = let val src = a 2 val ty = Operand.ty src in add (Move {dst = ArrayOffset {base = a 0, index = a 1, offset = Bytes.zero, scale = Type.scale ty, ty = ty}, src = a 2}) end fun codegenOrC (p: Prim.t) = let val n = Prim.name p in if codegenImplementsPrim p then primApp p else (case Name.cFunction n of NONE => Error.bug (concat ["SsaToRssa.codegenOrC: ", "unimplemented prim:", Name.toString n]) | SOME f => simpleCCall f) end datatype z = datatype Prim.Name.t in case Prim.name prim of Array_array => array (a 0) | Array_length => arrayOrVectorLength () | Array_toVector => let val array = a 0 val vecTy = valOf (toRtype ty) val opt = case Type.deObjptr vecTy of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Array_toVector" | SOME opt => opt in loop (i - 1, Move {dst = (Offset {base = array, offset = Runtime.headerOffset (), ty = Type.objptrHeader ()}), src = ObjptrTycon opt} :: Bind {dst = (valOf var, vecTy), isMutable = false, src = Operand.cast (array, vecTy)} :: ss, t) end | CPointer_getCPointer => cpointerGet () | CPointer_getObjptr => cpointerGet () | CPointer_getReal _ => cpointerGet () | CPointer_getWord _ => cpointerGet () | CPointer_setCPointer => cpointerSet () | CPointer_setObjptr => cpointerSet () | CPointer_setReal _ => cpointerSet () | CPointer_setWord _ => cpointerSet () | FFI f => simpleCCall f | GC_collect => ccall {args = (Vector.new3 (GCState, Operand.zero (WordSize.csize ()), Operand.bool true)), func = (CFunction.gc {maySwitchThreads = handlesSignals})} | IntInf_toVector => cast () | IntInf_toWord => cast () | MLton_bogus => (case toRtype ty of NONE => none () | SOME t => move (bogus t)) | MLton_eq => (case toRtype (varType (arg 0)) of NONE => move (Operand.bool true) | SOME t => codegenOrC (Prim.wordEqual (WordSize.fromBits (Type.width t)))) | MLton_installSignalHandler => none () | MLton_share => (case toRtype (varType (arg 0)) of NONE => none () | SOME t => if not (Type.isObjptr t) then none () else simpleCCallWithGCState (CFunction.share (Operand.ty (a 0)))) | MLton_size => simpleCCallWithGCState (CFunction.size (Operand.ty (a 0))) | MLton_touch => let val a = arg 0 val args = if isSome (toRtype (varType a)) then Vector.new1 (varOp a) else Vector.new0 () in add (PrimApp {args = args, dst = NONE, prim = prim}) end | Thread_atomicBegin => (* gcState.atomicState++; * if (gcState.signalsInfo.signalIsPending) * gcState.limit = gcState.limitPlusSlop - LIMIT_SLOP; *) split (Vector.new0 (), Kind.Jump, ss, fn continue => let datatype z = datatype GCField.t val tmp = Var.newNoname () val size = WordSize.cpointer () val ty = Type.cpointer () val statements = Vector.new2 (Statement.PrimApp {args = (Vector.new2 (Runtime LimitPlusSlop, Operand.word (WordX.fromIntInf (IntInf.fromInt (Bytes.toInt Runtime.limitSlop), size)))), dst = SOME (tmp, ty), prim = Prim.cpointerSub}, Statement.Move {dst = Runtime Limit, src = Var {ty = ty, var = tmp}}) val signalIsPending = newBlock {args = Vector.new0 (), kind = Kind.Jump, statements = statements, transfer = (Transfer.Goto {args = Vector.new0 (), dst = continue})} in (bumpAtomicState 1, if handlesSignals then Transfer.ifBool (Runtime SignalIsPending, {falsee = continue, truee = signalIsPending}) else Transfer.Goto {args = Vector.new0 (), dst = continue}) end) | Thread_atomicEnd => (* gcState.atomicState--; * if (gcState.signalsInfo.signalIsPending * and 0 == gcState.atomicState) * gc; *) split (Vector.new0 (), Kind.Jump, ss, fn continue => let datatype z = datatype GCField.t val func = CFunction.gc {maySwitchThreads = true} val returnFromHandler = newBlock {args = Vector.new0 (), kind = Kind.CReturn {func = func}, statements = Vector.new0 (), transfer = Goto {args = Vector.new0 (), dst = continue}} val args = Vector.new3 (GCState, Operand.zero (WordSize.csize ()), Operand.bool false) val switchToHandler = newBlock {args = Vector.new0 (), kind = Kind.Jump, statements = Vector.new0 (), transfer = Transfer.CCall {args = args, func = func, return = SOME returnFromHandler}} val testAtomicState = newBlock {args = Vector.new0 (), kind = Kind.Jump, statements = Vector.new0 (), transfer = Transfer.ifZero (Runtime AtomicState, {falsee = continue, truee = switchToHandler})} in (bumpAtomicState ~1, if handlesSignals then Transfer.ifBool (Runtime SignalIsPending, {falsee = continue, truee = testAtomicState}) else Transfer.Goto {args = Vector.new0 (), dst = continue}) end) | Thread_atomicState => move (Runtime GCField.AtomicState) | Thread_copy => simpleCCallWithGCState (CFunction.copyThread ()) | Thread_switchTo => ccall {args = (Vector.new3 (GCState, a 0, EnsuresBytesFree)), func = CFunction.threadSwitchTo ()} | Vector_length => arrayOrVectorLength () | Weak_canGet => ifIsWeakPointer (varType (arg 0), fn _ => simpleCCallWithGCState (CFunction.weakCanGet {arg = Operand.ty (a 0)}), fn () => move (Operand.bool false)) | Weak_get => ifIsWeakPointer (varType (arg 0), fn t => simpleCCallWithGCState (CFunction.weakGet {arg = Operand.ty (a 0), return = t}), none) | Weak_new => ifIsWeakPointer (ty, fn t => let val result = valOf (toRtype ty) val header = ObjptrTycon (case Type.deObjptr result of NONE => Error.bug "SsaToRssa.translateStatementsTransfer: PrimApp,Weak_new" | SOME opt => opt) val func = CFunction.weakNew {arg = t, return = result} in ccall {args = (Vector.concat [Vector.new2 (GCState, header), vos args]), func = func} end, none) | Word_equal s => codegenOrC (Prim.wordEqual (WordSize.roundUpToPrim s)) | Word_toIntInf => cast () | Word_extdToWord (s1, s2, {signed}) => if WordSize.equals (s1, s2) then move (a 0) else let val signed = signed andalso Bits.< (WordSize.bits s1, WordSize.bits s2) val s1 = WordSize.roundUpToPrim s1 val s2 = WordSize.roundUpToPrim s2 in if WordSize.equals (s1, s2) then cast () else codegenOrC (Prim.wordExtdToWord (s1, s2, {signed = signed})) end | WordVector_toIntInf => move (a 0) | Word8Array_subWord s => subWord s | Word8Array_updateWord s => let val ty = Type.word s in add (Move {dst = (ArrayOffset {base = a 0, index = a 1, offset = Bytes.zero, scale = Type.scale ty, ty = ty}), src = a 2}) end | Word8Vector_subWord s => subWord s | World_save => simpleCCallWithGCState (CFunction.worldSave ()) | _ => codegenOrC prim end | S.Exp.Select {base, offset} => (case var of NONE => none () | SOME var => (case toRtype ty of NONE => none () | SOME ty => adds (select {base = Base.map (base, varOp), baseTy = varType (Base.object base), dst = (var, ty), offset = offset}))) | S.Exp.Var y => (case toRtype ty of NONE => none () | SOME _ => move (varOp y)) end end in loop (Vector.length statements - 1, ss, transfer) end fun translateBlock (S.Block.T {label, args, statements, transfer}) = let val (ss, t) = translateTransfer transfer val (ss, t) = translateStatementsTransfer (statements, ss, t) in Block.T {args = translateFormals args, kind = Kind.Jump, label = label, statements = ss, transfer = t} end fun translateFunction (f: S.Function.t): Function.t = let val _ = S.Function.foreachVar (f, fn (x, t) => setVarInfo (x, {ty = t})) val {args, blocks, name, raises, returns, start, ...} = S.Function.dest f val _ = Vector.foreach (blocks, fn S.Block.T {label, args, ...} => setLabelInfo (label, {args = args, cont = ref [], handler = ref NONE})) val blocks = Vector.map (blocks, translateBlock) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] val _ = extraBlocks := [] fun transTypes (ts : S.Type.t vector option) : Type.t vector option = Option.map (ts, fn ts => Vector.keepAllMap (ts, toRtype)) in Function.new {args = translateFormals args, blocks = blocks, name = name, raises = transTypes raises, returns = transTypes returns, start = start} end val main = let val start = Label.newNoname () val bug = Label.newNoname () in translateFunction (S.Function.profile (S.Function.new {args = Vector.new0 (), blocks = (Vector.new2 (S.Block.T {label = start, args = Vector.new0 (), statements = globals, transfer = (S.Transfer.Call {args = Vector.new0 (), func = main, return = S.Return.NonTail {cont = bug, handler = S.Handler.Dead}})}, S.Block.T {label = bug, args = Vector.new0 (), statements = Vector.new0 (), transfer = S.Transfer.Bug})), mayInline = false, (* doesn't matter *) name = Func.newNoname (), raises = NONE, returns = NONE, start = start}, S.SourceInfo.main)) end val functions = List.revMap (functions, translateFunction) val p = Program.T {functions = functions, handlesSignals = handlesSignals, main = main, objectTypes = objectTypes} val _ = Program.clear p in p end end mlton-20100608/mlton/backend/ssa-to-rssa.sig0000644000076600000240000000155611404435623017170 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SSA_TO_RSSA_STRUCTS = sig structure Rssa: RSSA structure Ssa: SSA2 sharing Rssa.CFunction = Ssa.CFunction sharing Rssa.Const = Ssa.Const sharing Rssa.Func = Ssa.Func sharing Rssa.Label = Ssa.Label sharing Rssa.Prim = Ssa.Prim sharing Rssa.ProfileExp = Ssa.ProfileExp sharing Rssa.SourceInfo = Ssa.SourceInfo sharing Rssa.Var = Ssa.Var end signature SSA_TO_RSSA = sig include SSA_TO_RSSA_STRUCTS val convert: Ssa.Program.t * {codegenImplementsPrim: Rssa.Type.t Rssa.Prim.t -> bool} -> Rssa.Program.t end mlton-20100608/mlton/backend/switch.fun0000644000076600000240000000526311404435623016322 0ustar mtfstaff(* Copyright (C) 2002-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Switch (S: SWITCH_STRUCTS): SWITCH = struct open S fun isRedundant {cases: 'a vector, equals: 'a * 'a -> bool}: bool = let val nCases = Vector.length cases in 0 < nCases andalso let fun loop (i: int, prev: 'a): bool = i < nCases andalso let val cur = Vector.sub (cases, i) in equals (cur, prev) orelse loop (i + 1, cur) end in loop (1, Vector.sub (cases, 0)) end end datatype t = T of {cases: (WordX.t * Label.t) vector, default: Label.t option, size: WordSize.t, test: Use.t} fun layout (T {cases, default, test, ...})= let open Layout in seq [str "switch ", record [("test", Use.layout test), ("default", Option.layout Label.layout default), ("cases", Vector.layout (Layout.tuple2 (WordX.layout, Label.layout)) cases)]] end fun isOk (T {cases, default, size = _, test}, {checkUse, labelIsOk}): bool = let val () = checkUse test val ty = Use.ty test in Vector.forall (cases, labelIsOk o #2) andalso (case default of NONE => true | SOME l => labelIsOk l) andalso Vector.isSorted (cases, fn ((w, _), (w', _)) => WordX.le (w, w', {signed = false})) andalso not (isRedundant {cases = cases, equals = fn ((w, _), (w', _)) => WordX.equals (w, w')}) andalso if 0 = Vector.length cases then isSome default else let val casesTy = Type.sum (Vector.map (cases, fn (w, _) => Type.ofWordX w)) in Bits.equals (Type.width ty, Type.width casesTy) andalso not (Type.isObjptr ty) andalso (isSome default orelse Type.isSubtype (ty, casesTy)) end end fun foldLabelUse (T {cases, default, test, ...}, a: 'a, {label, use}): 'a = let val a = use (test, a) val a = Option.fold (default, a, label) val a = Vector.fold (cases, a, fn ((_, l), a) => label (l, a)) in a end fun foreachLabel (s, f) = foldLabelUse (s, (), {label = f o #1, use = fn _ => ()}) end mlton-20100608/mlton/backend/switch.sig0000644000076600000240000000231411404435623016306 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2002-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SWITCH_STRUCTS = sig structure Label: LABEL structure Type: REP_TYPE structure WordSize: WORD_SIZE structure WordX: WORD_X sharing WordX = Type.WordX structure Use: sig type t val layout: t -> Layout.t val ty: t -> Type.t end end signature SWITCH = sig include SWITCH_STRUCTS datatype t = T of {(* Cases are in increasing order of word. *) cases: (WordX.t * Label.t) vector, default: Label.t option, size: WordSize.t, test: Use.t} val foldLabelUse: t * 'a * {label: Label.t * 'a -> 'a, use: Use.t * 'a -> 'a} -> 'a val foreachLabel: t * (Label.t -> unit) -> unit val isOk: t * {checkUse: Use.t -> unit, labelIsOk: Label.t -> bool} -> bool val layout: t -> Layout.t end mlton-20100608/mlton/call-main.sml0000644000076600000240000000047411404435625015273 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val _ = Main.mainWrapped () mlton-20100608/mlton/closure-convert/0000755000076600000240000000000011404470407016043 5ustar mtfstaffmlton-20100608/mlton/closure-convert/abstract-value.fun0000644000076600000240000004003011404435623021470 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor AbstractValue (S: ABSTRACT_VALUE_STRUCTS): ABSTRACT_VALUE = struct open S open Sxml structure Dset = DisjointSet structure Lambda = struct datatype t = Lambda of {lambda: Sxml.Lambda.t, hash: Word.t} val newHash = Random.word fun new lambda = Lambda {lambda = lambda, hash = newHash ()} fun hash (Lambda {hash, ...}) = hash fun dest (Lambda {lambda, ...}) = lambda fun equals (Lambda r, Lambda r') = #hash r = #hash r' andalso Sxml.Lambda.equals (#lambda r, #lambda r') fun layout (Lambda {lambda, ...}) = let open Layout in seq [str "lambda ", Sxml.Var.layout (Sxml.Lambda.arg lambda)] end end structure Lambdas = UniqueSet (structure Element = Lambda val cacheSize: int = 5 val bits: int = 13) structure LambdaNode: sig type t val addHandler: t * (Lambda.t -> unit) -> unit val coerce: {from: t, to: t} -> unit val lambda: Sxml.Lambda.t -> t val layout: t -> Layout.t val new: unit -> t val toSet: t -> Lambdas.t val unify: t * t -> unit end = struct datatype t = LambdaNode of {me: Lambdas.t ref, handlers: (Lambda.t -> unit) list ref, coercedTo: t list ref} Dset.t fun toSet (LambdaNode d) = !(#me (Dset.! d)) val layout = Lambdas.layout o toSet fun newSet s = LambdaNode (Dset.singleton {me = ref s, handlers = ref [], coercedTo = ref []}) fun new () = newSet Lambdas.empty fun lambda l = newSet (Lambdas.singleton (Lambda.new l)) fun handles (h: Lambda.t -> unit, s: Lambdas.t): unit = Lambdas.foreach (s, fn l => h l) fun handless (hs: (Lambda.t -> unit) list, s: Lambdas.t): unit = List.foreach (hs, fn h => handles (h, s)) fun addHandler (LambdaNode d, h: Lambda.t -> unit) = let val {me, handlers, ...} = Dset.! d in List.push (handlers, h) ; handles (h, !me) end fun send (LambdaNode d, s): unit = let val {me, coercedTo, handlers, ...} = Dset.! d val diff = Lambdas.- (s, !me) in if Lambdas.isEmpty diff then () else (me := Lambdas.+ (diff, !me) ; List.foreach (!coercedTo, fn to => send (to, diff)) ; handless (!handlers, diff)) end val send = Trace.trace2 ("AbstractValue.LambdaNode.send", layout, Lambdas.layout, Unit.layout) send fun equals (LambdaNode d, LambdaNode d') = Dset.equals (d, d') fun coerce {from = from as LambdaNode d, to: t}: unit = if equals (from, to) then () else let val {me, coercedTo, ...} = Dset.! d in if List.exists (!coercedTo, fn ls => equals (ls, to)) then () else (List.push (coercedTo, to) ; send (to, !me)) end fun update (c, h, diff) = if Lambdas.isEmpty diff then () else (List.foreach (c, fn to => send (to, diff)) ; handless (h, diff)) fun unify (LambdaNode d, LambdaNode d'): unit = if Dset.equals (d, d') then () else let val {me = ref m, coercedTo = ref c, handlers = ref h, ...} = Dset.! d val {me = ref m', coercedTo = ref c', handlers = ref h', ...} = Dset.! d' val diff = Lambdas.- (m, m') val diff' = Lambdas.- (m', m) in Dset.union (d, d') ; (Dset.:= (d, {me = ref (if Lambdas.isEmpty diff then m' else Lambdas.+ (m', diff)), coercedTo = ref (List.fold (c', c, fn (n', ac) => if List.exists (c, fn n => equals (n, n')) then ac else n' :: ac)), handlers = ref (List.appendRev (h, h'))})) ; update (c, h, diff') ; update (c', h', diff) end (* val unify = Trace.trace2 ("AbstractValue.LambdaNode.unify", layout, layout, Unit.layout) unify *) end structure UnaryTycon = struct datatype t = Array | Ref | Vector | Weak val toString = fn Array => "Array" | Ref => "Ref" | Vector => "Vector" | Weak => "Weak" val equals: t * t -> bool = op = val layout = Layout.str o toString end datatype tree = Lambdas of LambdaNode.t | Tuple of t vector | Type of Type.t | Unify of UnaryTycon.t * t withtype t = {tree: tree, ty: Type.t, ssaType: Ssa.Type.t option ref} Dset.t fun new (tree: tree, ty: Type.t): t = Dset.singleton {ssaType = ref NONE, tree = tree, ty = ty} local fun make sel : t -> 'a = sel o Dset.! in val ssaType = make #ssaType val tree = make #tree val ty = make #ty end fun layout v = let open Layout in case tree v of Type t => seq [str "Type ", Type.layout t] | Unify (t, v) => paren (seq [UnaryTycon.layout t, str " ", layout v]) | Tuple vs => Vector.layout layout vs | Lambdas l => LambdaNode.layout l end fun isEmpty v = case tree v of Lambdas n => Lambdas.isEmpty (LambdaNode.toSet n) | Tuple vs => Vector.exists (vs, isEmpty) | Unify (UnaryTycon.Ref, v) => isEmpty v | _ => false (* used in closure converter *) fun equals (v, v') = Dset.equals (v, v') orelse (case (tree v, tree v') of (Type t, Type t') => if Type.equals (t, t') then true else Error.bug "AbstractValue.equals: different types" | (Unify (t, v), Unify (t', v')) => UnaryTycon.equals (t, t') andalso equals (v, v') | (Tuple vs, Tuple vs') => Vector.forall2 (vs, vs', equals) | (Lambdas n, Lambdas n') => Lambdas.equals (LambdaNode.toSet n, LambdaNode.toSet n') | _ => Error.bug "AbstractValue.equals: different values") fun addHandler (v, h) = case tree v of Lambdas n => LambdaNode.addHandler (n, h) | _ => Error.bug "AbstractValue.addHandler: non-lambda" local val {hom, destroy} = Type.makeMonoHom {con = fn (t, tycon, vs) => let val new = fn tree => new (tree, t) in if Tycon.equals (tycon, Tycon.arrow) then {isFirstOrder = false, make = fn () => new (Lambdas (LambdaNode.new ()))} else if Vector.forall (vs, #isFirstOrder) then {isFirstOrder = true, make = let val v = new (Type t) in fn () => v end} else {isFirstOrder = false, make = let fun mutable mt = let val make = #make (Vector.sub (vs, 0)) in fn () => new (Unify (mt, make ())) end in if Tycon.equals (tycon, Tycon.reff) then mutable UnaryTycon.Ref else if Tycon.equals (tycon, Tycon.array) then mutable UnaryTycon.Array else if Tycon.equals (tycon, Tycon.vector) then mutable UnaryTycon.Vector else if Tycon.equals (tycon, Tycon.weak) then mutable UnaryTycon.Weak else if Tycon.equals (tycon, Tycon.tuple) then (fn () => new (Tuple (Vector.map (vs, fn {make, ...} => make ())))) else Error.bug "AbstractValue.fromType: non-arrow" end} end} in val destroy = destroy val typeIsFirstOrder = #isFirstOrder o hom fun fromType t = #make (hom t) () end val fromType = Trace.trace ("AbstractValue.fromType", Type.layout, layout) fromType fun tuple (vs: t vector): t = new (Tuple vs, Type.tuple (Vector.map (vs, ty))) fun select (v, i) = case tree v of Type t => fromType (Vector.sub (Type.deTuple t, i)) | Tuple vs => Vector.sub (vs, i) | _ => Error.bug "AbstractValue.select: expected tuple" fun deRef v = case tree v of Type t => fromType (Type.deRef t) | Unify (_, v) => v | _ => Error.bug "AbstractValue.deRef" val deRef = Trace.trace ("AbstractValue.deRef", layout, layout) deRef fun deWeak v = case tree v of Type t => fromType (Type.deWeak t) | Unify (_, v) => v | _ => Error.bug "AbstractValue.deWeak" fun deArray v = case tree v of Type t => fromType (Type.deArray t) | Unify (_, v) => v | _ => Error.bug "AbstractValue.deArray" fun lambda (l: Sxml.Lambda.t, t: Type.t): t = new (Lambdas (LambdaNode.lambda l), t) fun unify (v, v') = if Dset.equals (v, v') then () else let val t = tree v val t' = tree v' in Dset.union (v, v') ; (case (t, t') of (Type t, Type t') => if Type.equals (t, t') then () else Error.bug "AbstractValue.unify: different types" | (Unify (_, v), Unify (_, v')) => unify (v, v') | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', unify) | (Lambdas l, Lambdas l') => LambdaNode.unify (l, l') | _ => Error.bug "AbstractValue.unify: different values") end val unify = Trace.trace2 ("AbstractValue.unify", layout, layout, Unit.layout) unify fun coerce {from: t, to: t}: unit = if Dset.equals (from, to) then () else (case (tree from, tree to) of (Type t, Type t') => if Type.equals (t, t') then () else Error.bug "coerce" | (Unify _, Unify _) => (* Can't do a coercion for vectors, since that would imply * walking over the entire vector and coercing each element *) unify (from, to) | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', fn (v, v') => coerce {from = v, to = v'}) | (Lambdas l, Lambdas l') => LambdaNode.coerce {from = l, to = l'} | _ => Error.bug "AbstractValue.coerce: different values") val coerce = Trace.trace ("AbstractValue.coerce", fn {from, to} => let open Layout in record [("from", layout from), ("to" , layout to)] end, Unit.layout) coerce structure Dest = struct datatype dest = Array of t | Lambdas of Lambdas.t | Ref of t | Tuple of t vector | Type of Type.t | Vector of t | Weak of t end fun dest v = case tree v of Type t => Dest.Type t | Unify (mt, v) => (case mt of UnaryTycon.Array => Dest.Array v | UnaryTycon.Ref => Dest.Ref v | UnaryTycon.Vector => Dest.Vector v | UnaryTycon.Weak => Dest.Weak v) | Tuple vs => Dest.Tuple vs | Lambdas l => Dest.Lambdas (LambdaNode.toSet l) open Dest (*---------------------------------------------------*) (* primApply *) (*---------------------------------------------------*) val {get = serialValue: Type.t -> t, ...} = Property.get (Type.plist, Property.initFun fromType) fun primApply {prim: Type.t Prim.t, args: t vector, resultTy: Type.t}: t = let fun result () = fromType resultTy fun typeError () = (Control.message (Control.Silent, fn () => let open Layout in align [seq [str "prim: ", Prim.layout prim], seq [str "args: ", Vector.layout layout args]] end) ; Error.bug "AbstractValue.primApply: type error") fun arg i = Vector.sub (args, i) val n = Vector.length args fun oneArg () = if n = 1 then arg 0 else Error.bug "AbstractValue.primApply.oneArg" fun twoArgs () = if n = 2 then (arg 0, arg 1) else Error.bug "AbstractValue.primApply.twoArgs" fun threeArgs () = if n = 3 then (arg 0, arg 1, arg 2) else Error.bug "AbstractValue.primApply.threeArgs" datatype z = datatype Prim.Name.t in case Prim.name prim of Array_sub => (case dest (#1 (twoArgs ())) of Array x => x | Type _ => result () | _ => typeError ()) | Array_update => let val (a, _, x) = threeArgs () in (case dest a of Array x' => coerce {from = x, to = x'} (* unify (x, x') *) | Type _ => () | _ => typeError ()) ; result () end | MLton_deserialize => serialValue resultTy | MLton_serialize => let val arg = oneArg () in coerce {from = arg, to = serialValue (ty arg)} ; result () end | Ref_assign => let val (r, x) = twoArgs () in (case dest r of Ref x' => coerce {from = x, to = x'} (* unify (x, x') *) | Type _ => () | _ => typeError ()) ; result () end | Ref_deref => (case dest (oneArg ()) of Ref v => v | Type _ => result () | _ => typeError ()) | Ref_ref => let val r = result () val _ = case dest r of Ref x => coerce {from = oneArg (), to = x} (* unify (oneArg (), x) *) | Type _ => () | _ => typeError () in r end | Array_toVector => let val r = result () in (case (dest (oneArg ()), dest r) of (Type _, Type _) => () | (Array x, Vector y) => (* Can't do a coercion here because that would imply * walking over each element of the array and coercing it. *) unify (x, y) | _ => typeError ()) ; r end | Vector_sub => (case dest (#1 (twoArgs ())) of Vector x => x | Type _ => result () | _ => typeError ()) | Weak_get => (case dest (oneArg ()) of Weak v => v | Type _ => result () | _ => typeError ()) | Weak_new => let val r = result () val _ = case dest r of Type _ => () | Weak x => coerce {from = oneArg (), to = x} | _ => typeError () in r end | _ => result () end end mlton-20100608/mlton/closure-convert/abstract-value.sig0000644000076600000240000000405411404435623021470 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ABSTRACT_VALUE_STRUCTS = sig structure Sxml: SXML structure Ssa: SSA end signature ABSTRACT_VALUE = sig include ABSTRACT_VALUE_STRUCTS structure Lambda: sig type t val dest: t -> Sxml.Lambda.t val layout: t -> Layout.t end structure Lambdas: sig type t val equals: t * t -> bool val plist: t -> PropertyList.t val toList: t -> Lambda.t list end type t datatype dest = Array of t | Lambdas of Lambdas.t | Ref of t | Tuple of t vector | Type of Sxml.Type.t (* type doesn't contain any arrows *) | Vector of t | Weak of t val addHandler: t * (Lambda.t -> unit) -> unit val coerce: {from: t, to: t} -> unit val ssaType: t -> Ssa.Type.t option ref val deArray: t -> t val deRef: t -> t val deWeak: t -> t val dest: t -> dest (* Destroy info associated with Sxml.Type used to keep track of arrows. *) val destroy: unit -> unit val equals: t * t -> bool val fromType: Sxml.Type.t -> t val isEmpty: t -> bool (* no possible values correspond to me *) val lambda: Sxml.Lambda.t * Sxml.Type.t (* The type of the lambda. *) -> t val layout: t -> Layout.t val primApply: {prim: Sxml.Type.t Sxml.Prim.t, args: t vector, resultTy: Sxml.Type.t} -> t val select: t * int -> t val serialValue: Sxml.Type.t -> t (* In tuple vs, there must be one argument that is not Type _. *) val tuple: t vector -> t val ty: t -> Sxml.Type.t val typeIsFirstOrder: Sxml.Type.t -> bool val unify: t * t -> unit end mlton-20100608/mlton/closure-convert/closure-convert.fun0000644000076600000240000014361611404435623021723 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * All local variables in the Sxml are renamed to new variables in Ssa, * unless they are global, as determined by the Globalization pass. * Renaming must happen because an Sxml variable will be bound in the Ssa * once for each lambda it occurs in. The main trickiness is caused because a * property is used to implement the renamer map. Hence, a variable binding * must always be visited with "newVar" or "newScope" before it is looked up * with "getNewVar". "newScope" also handles resetting the variable to its * old value once the processing of the lambda is done. *) functor ClosureConvert (S: CLOSURE_CONVERT_STRUCTS): CLOSURE_CONVERT = struct open S structure Globalize = Globalize (open Sxml) local open Sxml in structure Scases = Cases structure Sexp = Exp structure Sdec = Dec structure Slambda = Lambda structure Spat = Pat structure SprimExp = PrimExp structure SvarExp = VarExp structure Stype = Type open Atoms end local open Ssa in structure Block = Block structure Datatype = Datatype structure Dexp = DirectExp structure Func = Func structure Function = Function structure SourceInfo = SourceInfo structure Type = Type end structure Value = AbstractValue (structure Ssa = Ssa structure Sxml = Sxml) local open Value in structure Lambdas = Lambdas end (* Accum.t is one of the results returned internally by the converter -- an * accumulation of toplevel Ssa globals and function declarations. *) structure Accum = struct structure AL = AppendList datatype t = T of {globals: {var: Var.t, ty: Type.t, exp: Dexp.t} AL.t, functions: Function.t list} val empty = T {globals = AL.empty, functions = []} fun addGlobals (T {globals, functions}, gs) = T {globals = AL.append (globals, AL.fromList gs), functions = functions} fun addGlobal (ac, g) = addGlobals (ac, [g]) fun addFunc (T {globals, functions}, f) = T {globals = globals, functions = f :: functions} fun done (T {globals, functions}) = {functions = functions, globals = let (* Must shrink because coercions may be inserted at constructor * applications. I'm pretty sure the shrinking will eliminate * any case expressions/local functions. * We must rebind eliminated variables because the shrinker is * just processing globals and hence cannot safely delete a * variable that has no occurrences, since there may still be * occurrences in functions. *) val globals = AL.toList globals val vars = Vector.fromListMap (globals, #var) val tys = Vector.fromListMap (globals, #ty) val (start, blocks) = Dexp.linearize (Dexp.lett {decs = List.map (globals, fn {var, exp, ...} => {var = var, exp = exp}), body = Dexp.tuple {exps = (Vector.fromListMap (globals, fn {var, ty, ...} => Dexp.var (var, ty))), ty = Type.tuple tys}}, Ssa.Handler.Caller) val {blocks, ...} = Function.dest (Ssa.shrinkFunction {globals = Vector.new0 ()} (Function.new {args = Vector.new0 (), blocks = Vector.fromList blocks, mayInline = false, (* doesn't matter *) name = Func.newNoname (), raises = NONE, returns = SOME (Vector.new1 (Type.tuple tys)), start = start})) in if 1 <> Vector.length blocks then Error.bug (concat ["ClosureConvert.Accum.done: ", "shrinker didn't completely simplify"]) else let val ss = Block.statements (Vector.sub (blocks, 0)) val vs = case Ssa.Statement.exp (Vector.last ss) of Ssa.Exp.Tuple vs => if Vector.length vars = Vector.length vs then vs else Error.bug (concat ["ClosureConvert.Accum.done: ", "shrinker didn't simplify right"]) | _ => Error.bug (concat ["ClosureConvert.Accum.done: ", "shrinker didn't produce tuple"]) val ss = Vector.dropSuffix (ss, 1) val rebinds = Vector.keepAllMapi (vs, fn (i, v) => if Var.equals (v, Vector.sub (vars, i)) then NONE else SOME (Ssa.Statement.T {exp = Ssa.Exp.Var v, ty = Vector.sub (tys, i), var = SOME (Vector.sub (vars, i))})) in Vector.concat [ss, rebinds] end end} end (* val traceConvertExp = Trace.trace2 ("ClosureConvert.convertExp", Sexp.layout, Instance.layout, Dexp.layout) *) val convertPrimExpInfo = Trace.info "ClosureConvert.convertPrimExp" val valueTypeInfo = Trace.info "ClosureConvert.valueType" structure LambdaFree = LambdaFree (Sxml) local open LambdaFree in structure Status = Status end structure LambdaInfo = struct datatype t = T of { con: Con.t ref, frees: Var.t vector ref, (* name is the original name in the source (i.e. SXML) program, * so the closure conversion output has some readability. *) name: Func.t, recs: Var.t vector ref, (* The type of its environment record. *) ty: Type.t option ref } fun frees (T {frees, ...}) = !frees end structure VarInfo = struct type t = {frees: Var.t list ref ref, isGlobal: bool ref, lambda: Slambda.t option, replacement: Var.t ref, status: Status.t ref, value: Value.t} local fun make sel (r: t) = sel r in val lambda = valOf o make #lambda val value = make #value end end val traceLoopBind = Trace.trace ("ClosureConvert.loopBind", fn {exp, ty = _: Stype.t, var} => Layout.record [("var", Var.layout var), ("exp", SprimExp.layout exp)], Unit.layout) fun closureConvert (program as Sxml.Program.T {datatypes, body, overflow}): Ssa.Program.t = let val {get = conArg: Con.t -> Value.t option, set = setConArg, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("conArg", Con.layout)) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("closure convert info", Var.layout)) val varInfo = Trace.trace ("ClosureConvert.varInfo", Var.layout, Layout.ignore) varInfo val varExpInfo = varInfo o SvarExp.var val isGlobal = ! o #isGlobal o varInfo val isGlobal = Trace.trace ("ClosureConvert.isGlobal", Var.layout, Bool.layout) isGlobal val value = #value o varInfo val varExp = value o SvarExp.var val expValue = varExp o Sexp.result (* ---------------------------------- *) (* lambdaInfo *) (* ---------------------------------- *) val {get = lambdaInfo: Slambda.t -> LambdaInfo.t, set = setLambdaInfo, ...} = Property.getSetOnce (Slambda.plist, Property.initRaise ("closure convert info", Layout.ignore)) val allLambdas: Slambda.t list ref = ref [] (* Do the flow analysis. * Initialize lambdaInfo and varInfo. *) val _ = Vector.foreach (datatypes, fn {cons, ...} => Vector.foreach (cons, fn {con, arg} => setConArg (con, (case arg of NONE => NONE | SOME t => SOME (Value.fromType t))))) val _ = let open Sxml val bogusFrees = ref [] fun newVar' (x, v, lambda) = setVarInfo (x, {frees = ref bogusFrees, isGlobal = ref false, lambda = lambda, replacement = ref x, status = ref Status.init, value = v}) fun newVar (x, v) = newVar' (x, v, NONE) val newVar = Trace.trace2 ("ClosureConvert.newVar", Var.layout, Layout.ignore, Unit.layout) newVar fun varExps xs = Vector.map (xs, varExp) fun loopExp (e: Exp.t): Value.t = let val {decs, result} = Exp.dest e val () = List.foreach (decs, loopDec) in varExp result end and loopDec (d: Dec.t): unit = let datatype z = datatype Dec.t in case d of Fun {decs, ...} => (Vector.foreach (decs, fn {var, lambda, ty, ...} => newVar' (var, Value.fromType ty, SOME lambda)) ; (Vector.foreach (decs, fn {var, lambda, ...} => Value.unify (value var, loopLambda (lambda, var))))) | MonoVal b => loopBind b | _ => Error.bug "ClosureConvert.loopDec: strange dec" end and loopBind arg = traceLoopBind (fn {var, ty, exp} => let fun set v = newVar (var, v) fun new () = let val v = Value.fromType ty in set v; v end val new' = ignore o new datatype z = datatype PrimExp.t in case exp of App {func, arg} => let val arg = varExp arg val result = new () in Value.addHandler (varExp func, fn l => let val lambda = Value.Lambda.dest l val {arg = formal, body, ...} = Lambda.dest lambda in Value.coerce {from = arg, to = value formal} ; Value.coerce {from = expValue body, to = result} end) end | Case {cases, default, ...} => let val result = new () fun branch e = Value.coerce {from = loopExp e, to = result} fun handlePat (Pat.T {con, arg, ...}) = case (arg, conArg con) of (NONE, NONE) => () | (SOME (x, _), SOME v) => newVar (x, v) | _ => Error.bug "ClosureConvert.loopBind: Case" val _ = Cases.foreach' (cases, branch, handlePat) val _ = Option.app (default, branch o #1) in () end | ConApp {con, arg, ...} => (case (arg, conArg con) of (NONE, NONE) => () | (SOME x, SOME v) => Value.coerce {from = varExp x, to = v} | _ => Error.bug "ClosureConvert.loopBind: ConApp" ; new' ()) | Const _ => new' () | Handle {try, catch = (x, t), handler} => let val result = new () in Value.coerce {from = loopExp try, to = result} ; newVar (x, Value.fromType t) ; Value.coerce {from = loopExp handler, to = result} end | Lambda l => set (loopLambda (l, var)) | PrimApp {prim, args, ...} => set (Value.primApply {prim = prim, args = varExps args, resultTy = ty}) | Profile _ => new' () | Raise _ => new' () | Select {tuple, offset} => set (Value.select (varExp tuple, offset)) | Tuple xs => if Value.typeIsFirstOrder ty then new' () else set (Value.tuple (Vector.map (xs, varExp))) | Var x => set (varExp x) end) arg and loopLambda (lambda: Lambda.t, x: Var.t): Value.t = let val _ = List.push (allLambdas, lambda) val {arg, argType, body, ...} = Lambda.dest lambda val _ = setLambdaInfo (lambda, LambdaInfo.T {con = ref Con.bogus, frees = ref (Vector.new0 ()), name = Func.newString (Var.originalName x), recs = ref (Vector.new0 ()), ty = ref NONE}) val _ = newVar (arg, Value.fromType argType) in Value.lambda (lambda, Type.arrow (argType, Value.ty (loopExp body))) end val _ = Control.trace (Control.Pass, "flow analysis") loopExp body in () end val _ = Control.diagnostics (fn display => Sexp.foreachBoundVar (body, fn (x, _, _) => display (let open Layout in seq [Var.layout x, str " ", Value.layout (value x)] end))) val overflow = valOf overflow val _ = Control.trace (Control.Pass, "free variables") LambdaFree.lambdaFree {program = program, overflow = overflow, varInfo = fn x => let val {frees, status, ...} = varInfo x in {frees = frees, status = status} end, lambdaInfo = fn l => let val LambdaInfo.T {frees, recs, ...} = lambdaInfo l in {frees = frees, recs = recs} end} val _ = if !Control.closureConvertGlobalize then Control.trace (Control.Pass, "globalize") Globalize.globalize {program = program, lambdaFree = LambdaInfo.frees o lambdaInfo, varGlobal = #isGlobal o varInfo} else () local fun removeGlobal v = Vector.keepAll (v, not o isGlobal) val _ = List.foreach (!allLambdas, fn l => let val LambdaInfo.T {frees, recs, ...} = lambdaInfo l in frees := removeGlobal (!frees) ; recs := removeGlobal (!recs) end) in end val {get = lambdasInfoOpt, ...} = Property.get (Lambdas.plist, Property.initFun (fn _ => ref NONE)) val (convertType, destroyConvertType) = let val {get, set, destroy, ...} = Property.destGetSetOnce (Tycon.plist, Property.initConst NONE) fun nullary c v = if Vector.isEmpty v then c else Error.bug "ClosureConvert.convertType.nullary: bogus application of nullary tycon" fun unary make v = if 1 = Vector.length v then make (Vector.sub (v, 0)) else Error.bug "ClosureConvert.convertType.unary: bogus application of unary tycon" val tycons = [(Tycon.arrow, fn _ => Error.bug "ClosureConvert.convertType.array"), (Tycon.array, unary Type.array), (Tycon.cpointer, nullary Type.cpointer), (Tycon.intInf, nullary Type.intInf), (Tycon.reff, unary Type.reff), (Tycon.thread, nullary Type.thread), (Tycon.tuple, Type.tuple), (Tycon.vector, unary Type.vector), (Tycon.weak, unary Type.weak)] @ Vector.toListMap (Tycon.reals, fn (t, s) => (t, nullary (Type.real s))) @ Vector.toListMap (Tycon.words, fn (t, s) => (t, nullary (Type.word s))) val _ = List.foreach (tycons, fn (tycon, f) => set (tycon, SOME f)) val {hom = convertType, destroy = destroyConvertType} = Stype.makeMonoHom {con = fn (_, tycon, ts) => case get tycon of NONE => nullary (Type.datatypee tycon) ts | SOME f => f ts} in (convertType, fn () => (destroy () ; destroyConvertType ())) end (* newDatatypes accumulates the new datatypes built for sets of lambdas. *) val newDatatypes: Datatype.t list ref = ref [] fun valueType arg: Type.t = Trace.traceInfo (valueTypeInfo, Layout.ignore, Type.layout, Trace.assertTrue) (fn (v: Value.t) => let val r = Value.ssaType v in case !r of SOME t => t | NONE => let val t = case Value.dest v of Value.Array v => Type.array (valueType v) | Value.Lambdas ls => #ty (lambdasInfo ls) | Value.Ref v => Type.reff (valueType v) | Value.Type t => convertType t | Value.Tuple vs => Type.tuple (Vector.map (vs, valueType)) | Value.Vector v => Type.vector (valueType v) | Value.Weak v => Type.weak (valueType v) in r := SOME t; t end end) arg and lambdasInfo (ls: Lambdas.t): {cons: {lambda: Slambda.t, con: Con.t} vector, ty: Type.t} = let val r = lambdasInfoOpt ls in case !r of SOME info => info | NONE => let val tycon = Tycon.newString "lambdas" val cons = Vector.fromListMap (Lambdas.toList ls, fn l => {lambda = Value.Lambda.dest l, con = Con.newString "Env"}) val ty = Type.datatypee tycon val info = {ty = ty, cons = cons} val _ = r := SOME info (* r must be set before the following, because calls to * lambdaInfoType may refer to the type of this lambdasInfo. *) val cons = Vector.map (cons, fn {con, lambda} => {con = con, args = Vector.new1 (lambdaInfoType (lambdaInfo lambda))}) val _ = List.push (newDatatypes, Datatype.T {tycon = tycon, cons = cons}) in info end end and varInfoType ({value, ...}: VarInfo.t) = valueType value and lambdaInfoType (LambdaInfo.T {frees, ty, ...}): Type.t = case !ty of NONE => let val t = Type.tuple (Vector.map (!frees, varInfoType o varInfo)) in ty := SOME t; t end | SOME t => t fun valueLambdasInfo v = case Value.dest v of Value.Lambdas l => lambdasInfo l | _ => Error.bug "ClosureConvert.valueLambdasInfo: non-lambda" val varLambdasInfo = valueLambdasInfo o value val emptyTypes = Vector.new0 () val datatypes = Vector.map (datatypes, fn {tycon, cons, ...} => Datatype.T {tycon = tycon, cons = (Vector.map (cons, fn {con, ...} => {con = con, args = (case conArg con of NONE => emptyTypes | SOME v => Vector.new1 (valueType v))}))}) (* Variable renaming *) fun newVarInfo (x: Var.t, {isGlobal, replacement, ...}: VarInfo.t): Var.t = if !isGlobal then x else let val x' = Var.new x in replacement := x'; x' end fun newVar x = newVarInfo (x, varInfo x) val newVar = Trace.trace ("ClosureConvert.newVar", Var.layout, Var.layout) newVar fun newScope (xs: Var.t vector, f: Var.t vector -> 'a): 'a = let val old = Vector.map (xs, ! o #replacement o varInfo) val res = f (Vector.map (xs, newVar)) val _ = Vector.foreach2 (xs, old, fn (x, x') => #replacement (varInfo x) := x') in res end (*------------------------------------*) (* coerce *) (*------------------------------------*) val traceCoerce = Trace.trace3 ("ClosureConvert.coerce", Dexp.layout, Value.layout, Value.layout, Dexp.layout) (* val traceCoerceTuple = * let val layoutValues = List.layout (", ", Value.layout) * in Trace.trace3 ("ClosureConvert.coerceTuple", Dexp.layout, * layoutValues, layoutValues, Dexp.layout) * end *) fun coerce arg: Dexp.t = traceCoerce (fn (e: Dexp.t, from: Value.t, to: Value.t) => if Value.equals (from, to) then e else case (Value.dest from, Value.dest to) of (Value.Tuple vs, Value.Tuple vs') => coerceTuple (e, valueType from, vs, valueType to, vs') | (Value.Lambdas ls, Value.Lambdas ls') => if Lambdas.equals (ls, ls') then e else let val {cons, ...} = lambdasInfo ls val {cons = cons', ty, ...} = lambdasInfo ls' val _ = Vector.foreach (cons', fn {lambda, con, ...} => let val LambdaInfo.T {con = r, ...} = lambdaInfo lambda in r := con end) val exp = Dexp.casee {test = e, default = NONE, ty = ty, cases = Dexp.Con (Vector.map (cons, fn {lambda, con} => let val info as LambdaInfo.T {con = r, ...} = lambdaInfo lambda val tuple = (Var.newNoname (), lambdaInfoType info) in {con = con, args = Vector.new1 tuple, body = (Dexp.conApp {con = !r, ty = ty, args = Vector.new1 (Dexp.var tuple)})} end))} in exp end | _ => Error.bug "ClosureConvert.coerce") arg and coerceTuple arg = (* traceCoerceTuple *) (fn (e: Dexp.t, ty: Type.t, vs: Value.t vector, ty': Type.t, vs': Value.t vector) => if Type.equals (ty, ty') then e else Dexp.detuple {tuple = e, length = Vector.length vs, body = fn components => Dexp.tuple {exps = Vector.map3 (components, vs, vs', fn (x, v, v') => coerce (Dexp.var (x, valueType v), v, v')), ty = ty'}}) arg fun convertVarInfo (info as {replacement, ...}: VarInfo.t) = Dexp.var (!replacement, varInfoType info) val convertVar = convertVarInfo o varInfo val convertVarExp = convertVar o SvarExp.var val handlesSignals = Sexp.hasPrim (body, fn p => case Prim.name p of Prim.Name.MLton_installSignalHandler => true | _ => false) (*------------------------------------*) (* apply *) (*------------------------------------*) fun apply {func, arg, resultVal}: Dexp.t = let val func = varExpInfo func val arg = varExpInfo arg val funcVal = VarInfo.value func val argVal = VarInfo.value arg val argExp = convertVarInfo arg val ty = valueType resultVal val {cons, ...} = valueLambdasInfo funcVal in Dexp.casee {test = convertVarInfo func, ty = ty, default = NONE, cases = Dexp.Con (Vector.map (cons, fn {lambda, con} => let val {arg = param, body, ...} = Slambda.dest lambda val info as LambdaInfo.T {name, ...} = lambdaInfo lambda val result = expValue body val env = (Var.newString "env", lambdaInfoType info) in {con = con, args = Vector.new1 env, body = coerce (Dexp.call {func = name, args = Vector.new2 (Dexp.var env, coerce (argExp, argVal, value param)), ty = valueType result}, result, resultVal)} end))} end (*------------------------------------*) (* convertExp *) (*------------------------------------*) fun lambdaInfoTuple (info as LambdaInfo.T {frees, ...}): Dexp.t = Dexp.tuple {exps = Vector.map (!frees, convertVar), ty = lambdaInfoType info} fun recursives (old: Var.t vector, new: Var.t vector, env) = Vector.fold2 (old, new, [], fn (old, new, ac) => let val {cons, ty, ...} = varLambdasInfo old val l = VarInfo.lambda (varInfo old) in case Vector.peek (cons, fn {lambda = l', ...} => Slambda.equals (l, l')) of NONE => Error.bug "ClosureConvert.recursives: lambda must exist in its own set" | SOME {con, ...} => {var = new, ty = ty, exp = Dexp.conApp {con = con, ty = ty, args = Vector.new1 (Dexp.var env)}} :: ac end) val recursives = Trace.trace ("ClosureConvert.recursives", fn (a, b, _) => Layout.tuple [Vector.layout Var.layout a, Vector.layout Var.layout b], Layout.ignore) recursives val raises: Type.t vector option = let exception Yes of Type.t vector in (Sexp.foreachPrimExp (body, fn (_, _, e) => case e of SprimExp.Handle {catch = (x, _), ...} => raise (Yes (Vector.new1 (varInfoType (varInfo x)))) | _ => ()) ; NONE) handle Yes ts => SOME ts end val shrinkFunction = if !Control.closureConvertShrink then Ssa.shrinkFunction {globals = Vector.new0 ()} else fn f => f fun addFunc (ac, {args, body, isMain, mayInline, name, returns}) = let val (start, blocks) = Dexp.linearize (body, Ssa.Handler.Caller) val f = shrinkFunction (Function.new {args = args, blocks = Vector.fromList blocks, mayInline = mayInline, name = name, raises = if isMain then NONE else raises, returns = SOME returns, start = start}) val f = if isMain then Function.profile (f, SourceInfo.main) else f in Accum.addFunc (ac, f) end (* Closure convert an expression, returning: * - the target ssa expression * - a list of global declarations (in order) * - a list of function declarations * Accumulate the globals onto the end of the given ones. *) fun convertExp (e: Sexp.t, ac: Accum.t): Dexp.t * Accum.t = let val {decs, result} = Sexp.dest e (* Process decs left to right, since bindings of variables * must be visited before uses. *) val (decs, ac) = List.fold (decs, ([], ac), fn (d, (binds, ac)) => case d of Sdec.MonoVal {exp, var, ...} => let val info as {isGlobal, value, ...} = varInfo var val (exp, ac) = convertPrimExp (exp, value, ac) val bind = {var = newVarInfo (var, info), ty = valueType value, exp = exp} in if !isGlobal then (binds, Accum.addGlobal (ac, bind)) else (bind :: binds, ac) end | Sdec.Fun {decs, ...} => if Vector.isEmpty decs then (binds, ac) else let val {lambda, var, ...} = Vector.sub (decs, 0) val info = lambdaInfo lambda val tupleVar = Var.newString "tuple" val tupleTy = lambdaInfoType info val binds' = {var = tupleVar, ty = tupleTy, exp = lambdaInfoTuple info} :: (recursives (Vector.map (decs, #var), Vector.map (decs, newVar o #var), (tupleVar, tupleTy))) val (binds, ac) = if isGlobal var then (binds, Accum.addGlobals (ac, binds')) else (List.fold (binds', binds, op ::), ac) in (binds, Vector.fold (decs, ac, fn ({lambda, ...}, ac) => convertLambda (lambda, lambdaInfo lambda, ac))) end | _ => Error.bug "ClosureConvert.convertExp: strange dec") in (Dexp.lett {decs = List.fold (decs, [], fn ({var, exp, ...}, ac) => {var = var, exp = exp} :: ac), body = convertVarExp result}, ac) end and convertPrimExp arg : Dexp.t * Accum.t = Trace.traceInfo (convertPrimExpInfo, SprimExp.layout o #1, Layout.ignore, Trace.assertTrue) (fn (e: SprimExp.t, v: Value.t, ac: Accum.t) => let val ty = valueType v fun convertJoin (e, ac) = let val (e', ac) = convertExp (e, ac) in (coerce (e', expValue e, v), ac) end fun simple e = (e, ac) in case e of SprimExp.App {func, arg} => (apply {func = func, arg = arg, resultVal = v}, ac) | SprimExp.Case {test, cases, default} => let val (default, ac) = case default of NONE => (NONE, ac) | SOME (e, _) => let val (e, ac) = convertJoin (e, ac) in (SOME e, ac) end fun doCases (cases, finish, make) = let val (cases, ac) = Vector.mapAndFold (cases, ac, fn ((x, e), ac) => let val make = make x val (body, ac) = convertJoin (e, ac) in (make body, ac) end) in (finish cases, ac) end val (cases, ac) = case cases of Scases.Con cases => doCases (cases, Dexp.Con, fn Spat.T {con, arg, ...} => let val args = case (conArg con, arg) of (NONE, NONE) => Vector.new0 () | (SOME v, SOME (arg, _)) => Vector.new1 (newVar arg, valueType v) | _ => Error.bug "ClosureConvert.convertPrimExp: Case,constructor mismatch" in fn body => {args = args, body = body, con = con} end) | Scases.Word (s, cs) => doCases (cs, fn cs => Dexp.Word (s, cs), fn i => fn e => (i, e)) in (Dexp.casee {test = convertVarExp test, ty = ty, cases = cases, default = default}, ac) end | SprimExp.ConApp {con = con, arg, ...} => simple (Dexp.conApp {con = con, ty = ty, args = (case (arg, conArg con) of (NONE, NONE) => Vector.new0 () | (SOME arg, SOME conArg) => let val arg = varExpInfo arg val argVal = VarInfo.value arg val arg = convertVarInfo arg in if Value.equals (argVal, conArg) then Vector.new1 arg else Vector.new1 (coerce (arg, argVal, conArg)) end | _ => Error.bug "ClosureConvert.convertPrimExp: ConApp,constructor mismatch")}) | SprimExp.Const c => simple (Dexp.const c) | SprimExp.Handle {try, catch = (catch, _), handler} => let val catchInfo = varInfo catch val (try, ac) = convertJoin (try, ac) val catch = (newVarInfo (catch, catchInfo), varInfoType catchInfo) val (handler, ac) = convertJoin (handler, ac) in (Dexp.handlee {try = try, ty = ty, catch = catch, handler = handler}, ac) end | SprimExp.Lambda l => let val info = lambdaInfo l val ac = convertLambda (l, info, ac) val {cons, ...} = valueLambdasInfo v in case Vector.peek (cons, fn {lambda = l', ...} => Slambda.equals (l, l')) of NONE => Error.bug "ClosureConvert.convertPrimExp: Lambda,lambda must exist in its own set" | SOME {con, ...} => (Dexp.conApp {con = con, ty = ty, args = Vector.new1 (lambdaInfoTuple info)}, ac) end | SprimExp.PrimApp {prim, targs, args} => let val prim = Prim.map (prim, convertType) open Prim.Name fun arg i = Vector.sub (args, i) val v1 = Vector.new1 val v2 = Vector.new2 val v3 = Vector.new3 fun primApp (targs, args) = Dexp.primApp {args = args, prim = prim, targs = targs, ty = ty} in if Prim.mayOverflow prim then simple (Dexp.arith {args = Vector.map (args, convertVarExp), overflow = Dexp.raisee (convertVar overflow), prim = prim, ty = ty}) else let datatype z = datatype Prim.Name.t in simple (case Prim.name prim of Array_update => let val a = varExpInfo (arg 0) val y = varExpInfo (arg 2) val v = Value.deArray (VarInfo.value a) in primApp (v1 (valueType v), v3 (convertVarInfo a, convertVarExp (arg 1), coerce (convertVarInfo y, VarInfo.value y, v))) end | MLton_eq => let val a0 = varExpInfo (arg 0) val a1 = varExpInfo (arg 1) fun doit () = primApp (v1 (valueType (VarInfo.value a0)), v2 (convertVarInfo a0, convertVarInfo a1)) in case (Value.dest (VarInfo.value a0), Value.dest (VarInfo.value a1)) of (Value.Lambdas l, Value.Lambdas l') => if Lambdas.equals (l, l') then doit () else Dexp.falsee | _ => doit () end | MLton_equal => let val a0 = varExpInfo (arg 0) val a1 = varExpInfo (arg 1) fun doit () = primApp (v1 (valueType (VarInfo.value a0)), v2 (convertVarInfo a0, convertVarInfo a1)) in case (Value.dest (VarInfo.value a0), Value.dest (VarInfo.value a1)) of (Value.Lambdas l, Value.Lambdas l') => if Lambdas.equals (l, l') then doit () else Dexp.falsee | _ => doit () end | MLton_handlesSignals => if handlesSignals then Dexp.truee else Dexp.falsee | Ref_assign => let val r = varExpInfo (arg 0) val y = varExpInfo (arg 1) val v = Value.deRef (VarInfo.value r) in primApp (v1 (valueType v), v2 (convertVarInfo r, coerce (convertVarInfo y, VarInfo.value y, v))) end | Ref_ref => let val y = varExpInfo (arg 0) val v = Value.deRef v in primApp (v1 (valueType v), v1 (coerce (convertVarInfo y, VarInfo.value y, v))) end | MLton_serialize => let val y = varExpInfo (arg 0) val v = Value.serialValue (Vector.sub (targs, 0)) in primApp (v1 (valueType v), v1 (coerce (convertVarInfo y, VarInfo.value y, v))) end | Weak_new => let val y = varExpInfo (arg 0) val v = Value.deWeak v in primApp (v1 (valueType v), v1 (coerce (convertVarInfo y, VarInfo.value y, v))) end | _ => let val args = Vector.map (args, varExpInfo) in primApp (Prim.extractTargs (prim, {args = Vector.map (args, varInfoType), result = ty, typeOps = {deArray = Type.deArray, deArrow = fn _ => Error.bug "ClosureConvert.convertPrimExp: deArrow", deRef = Type.deRef, deVector = Type.deVector, deWeak = Type.deWeak}}), Vector.map (args, convertVarInfo)) end) end end | SprimExp.Profile e => simple (Dexp.profile e) | SprimExp.Raise {exn, ...} => simple (Dexp.raisee (convertVarExp exn)) | SprimExp.Select {offset, tuple} => simple (Dexp.select {offset = offset, tuple = convertVarExp tuple, ty = ty}) | SprimExp.Tuple xs => simple (Dexp.tuple {exps = Vector.map (xs, convertVarExp), ty = ty}) | SprimExp.Var y => simple (convertVarExp y) end) arg and convertLambda (lambda: Slambda.t, info as LambdaInfo.T {frees, name, recs, ...}, ac: Accum.t): Accum.t = let val {arg = argVar, body, mayInline, ...} = Slambda.dest lambda val argVarInfo = varInfo argVar val env = Var.newString "env" val envType = lambdaInfoType info val args = Vector.new2 ((env, envType), (newVarInfo (argVar, argVarInfo), varInfoType argVarInfo)) val returns = Vector.new1 (valueType (expValue body)) val recs = !recs in newScope (!frees, fn components => newScope (recs, fn recs' => let val decs = recursives (recs, recs', (env, envType)) val (body, ac) = convertExp (body, ac) val body = Dexp.lett {decs = List.fold (decs, [], fn ({var, exp, ...}, ac) => {var = var, exp = exp} :: ac), body = Dexp.detupleBind {tuple = env, tupleTy = envType, components = components, body = body}} in addFunc (ac, {args = args, body = body, isMain = false, mayInline = mayInline, name = name, returns = returns}) end)) end (*------------------------------------*) (* main body of closure convert *) (*------------------------------------*) val main = Func.newString "main" val {functions, globals} = Control.trace (Control.Pass, "convert") (fn () => let val (body, ac) = convertExp (body, Accum.empty) val ac = addFunc (ac, {args = Vector.new0 (), body = body, mayInline = false, isMain = true, name = main, returns = Vector.new1 Type.unit}) in Accum.done ac end) () val datatypes = Vector.concat [datatypes, Vector.fromList (!newDatatypes)] val program = Ssa.Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = destroyConvertType () val _ = Value.destroy () val _ = Ssa.Program.clear program in program end end mlton-20100608/mlton/closure-convert/closure-convert.sig0000644000076600000240000000102411404435623021677 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CLOSURE_CONVERT_STRUCTS = sig structure Ssa: SSA structure Sxml: SXML sharing Sxml.Atoms = Ssa.Atoms end signature CLOSURE_CONVERT = sig include CLOSURE_CONVERT_STRUCTS val closureConvert: Sxml.Program.t -> Ssa.Program.t end mlton-20100608/mlton/closure-convert/globalize.fun0000644000076600000240000001535611404435623020540 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Globalize (S: GLOBALIZE_STRUCTS): GLOBALIZE = struct open S open Dec PrimExp fun globalize {program = Program.T {datatypes, body, ...}, lambdaFree, varGlobal: Var.t -> bool ref} = let val noConts = not (Exp.hasPrim (body, fn p => case Prim.name p of Prim.Name.Thread_switchTo => true | _ => false)) local val {get: Tycon.t -> bool, set, destroy} = Property.destGetSetOnce (Tycon.plist, Property.initConst false) fun makeBig tycon = set (tycon, true) val _ = (Vector.foreach (datatypes, makeBig o #tycon) ; makeBig Tycon.array ; makeBig Tycon.arrow ; makeBig Tycon.vector) in val tyconIsBig = get val destroyTycon = destroy end fun typeIsSmall t = let open Type in case dest t of Con (c, ts) => not (tyconIsBig c) andalso if (Tycon.equals (c, Tycon.tuple) orelse Tycon.equals (c, Tycon.reff)) then Vector.forall (ts, typeIsSmall) else true | _ => Error.bug "Globalize.typeIsSmall: type variable" end val typeIsSmall = Trace.trace ("Globalize.typeIsSmall", Type.layout, Bool.layout) typeIsSmall val varIsGlobal = ! o varGlobal val isGlobal = varIsGlobal o VarExp.var fun areGlobal xs = Vector.forall (xs, isGlobal) fun makeGlobal x = varGlobal x := true val traceLoopExp = Trace.trace2 ("Globalize.loopExp", Exp.layout, Bool.layout, Bool.layout) val traceLoopDec = Trace.trace2 ("Globalize.loopDec", Dec.layout, Bool.layout, Bool.layout) fun loopExp arg = traceLoopExp (fn (e: Exp.t, once: bool) => List.fold (Exp.decs e, once, loopDec)) arg and loopDec arg = traceLoopDec (fn (d, once) => case d of MonoVal {var, ty, exp} => let val (global, once) = case exp of App _ => (* If conts are used, then the application might * call Thread_copyCurrent, in which case, * subsequent stuff might run many times. *) (false, once andalso noConts) | Case {cases, default, ...} => let val once' = Cases.fold (cases, once, fn (e, b) => loopExp (e, once) andalso b) val once' = Option.fold (default, once', fn ((e, _), b) => loopExp (e, once) andalso b) in (false, once') end | ConApp {arg, ...} => (case arg of NONE => true | SOME x => isGlobal x, once) | Const _ => (true, once) | Handle {try, handler, ...} => (false, loopExp (handler, loopExp (try, once))) | Lambda l => (loopLambda l ; (Vector.forall (lambdaFree l, varIsGlobal), once)) | PrimApp {prim, args, ...} => let val global = areGlobal args andalso ((Prim.isFunctional prim (* Don't want to move MLton_equal or MLton_hash * into the globals because polymorphic * equality and hasing isn't implemented * there. *) andalso (case Prim.name prim of Prim.Name.MLton_equal => false | Prim.Name.MLton_hash => false | _ => true)) orelse (once andalso (case Prim.name prim of Prim.Name.Ref_ref => typeIsSmall ty | _ => false))) val once = once andalso (case Prim.name prim of Prim.Name.Thread_copyCurrent => false | _ => true) in (global, once) end | Profile _ => (false, once) | Raise _ => (false, once) | Select {tuple, ...} => (isGlobal tuple, once) | Tuple xs => (areGlobal xs, once) | Var x => (isGlobal x, once) val _ = if global then makeGlobal var else () in once end | Fun {decs, ...} => (if Vector.isEmpty decs then () else let val {lambda, ...} = Vector.sub (decs, 0) in if Vector.forall (lambdaFree lambda, varIsGlobal) then Vector.foreach (decs, makeGlobal o #var) else () end ; Vector.foreach (decs, loopLambda o #lambda) ; once) | _ => Error.bug "Globalize.loopDec: strange dec") arg and loopLambda (l: Lambda.t): unit = ignore (loopExp (Lambda.body l, false)) val _ = loopExp (body, true) val _ = destroyTycon () in () end end mlton-20100608/mlton/closure-convert/globalize.sig0000644000076600000240000000112111404435623020513 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature GLOBALIZE_STRUCTS = sig include SXML end signature GLOBALIZE = sig include GLOBALIZE_STRUCTS val globalize: { program: Program.t, lambdaFree: Lambda.t -> Var.t vector, varGlobal: Var.t -> bool ref } -> unit end mlton-20100608/mlton/closure-convert/lambda-free.fun0000644000076600000240000001274411404435623020725 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor LambdaFree (S: LAMBDA_FREE_STRUCTS): LAMBDA_FREE = struct open S open Dec PrimExp structure Status = struct datatype t = Unseen | Free | Bound val init = Unseen end datatype status = datatype Status.t fun lambdaFree {program = Program.T {body, ...}, overflow: Var.t, varInfo: Var.t -> {frees: Var.t list ref ref, status: Status.t ref}, lambdaInfo: Lambda.t -> {frees: Var.t vector ref, recs: Var.t vector ref}} = let fun setFree (l: Lambda.t, xs: Var.t vector): unit = #frees (lambdaInfo l) := xs fun setRec (l: Lambda.t, xs: Var.t vector): unit = #recs (lambdaInfo l) := xs type scope = {frees: Var.t list ref, get: Var.t -> Status.t, set: Var.t * Status.t -> unit} fun bind (x: Var.t, {set, ...}: scope) = set (x, Bound) fun var (x: Var.t, {get, set, frees}: scope) = case get x of Unseen => (set (x, Free); List.push (frees, x)) | _ => () fun vars (xs, s) = Vector.foreach (xs, fn x => var (x, s)) fun varExp (x: VarExp.t, s: scope) = var (VarExp.var x, s) fun varExpOpt (x, s) = case x of NONE => () | SOME x => varExp (x, s) fun varExps (xs, s) = Vector.foreach (xs, fn x => varExp (x, s)) fun newScope th = let val frees = ref [] val all = ref [] fun statusRef x = let val {frees = frees', status, ...} = varInfo x in if frees = !frees' then () else (List.push (all, (frees', !frees', status, !status)) ; frees' := frees; status := Unseen) ; status end fun get x = !(statusRef x) fun set (x, s) = statusRef x := s val _ = th {frees = frees, get = get, set = set} val _ = List.foreach (!all, fn (r, v, r', v') => (r := v; r' := v')) in Vector.fromList (!frees) end fun exp (e, s) = let val {decs, result} = Exp.dest e in List.foreach (decs, fn Exception _ => () | MonoVal {var, exp, ...} => (primExp (exp, s); bind (var, s)) | PolyVal {var, exp = e, ...} => (exp (e, s); bind (var, s)) | Fun {decs, ...} => let val {get = isBound, set, destroy} = Property.destGetSetOnce (Var.plist, Property.initConst false) val _ = Vector.foreach (decs, fn {var, ...} => set (var, true)) val xs = newScope (fn s => Vector.foreach (decs, fn {lambda = l, ...} => setRec (l, Vector.keepAll (lambda l, fn x => if isBound x then true else (var (x, s); false))))) val _ = destroy () val _ = Vector.foreach (decs, fn {var, lambda, ...} => (setFree (lambda, xs) ; bind (var, s))) in vars (xs, s) end) ; varExp (result, s) end and primExp (e, s) = case e of App {func, arg} => (varExp (func, s); varExp (arg, s)) | Case {test, cases, default} => (varExp (test, s) ; Option.app (default, fn (e, _) => exp (e, s)) ; Cases.foreach' (cases, fn e => exp (e, s), fn Pat.T {arg, ...} => Option.app (arg, fn (x, _) => bind (x, s)))) | ConApp {arg, ...} => varExpOpt (arg, s) | Const _ => () | Handle {try, catch, handler} => (exp (try, s); bind (#1 catch, s); exp (handler, s)) | Lambda l => let val xs = lambda l in setFree (l, xs); vars (xs, s) end | PrimApp {prim, args, ...} => (if Prim.mayOverflow prim then var (overflow, s) else (); varExps (args, s)) | Profile _ => () | Raise {exn, ...} => varExp (exn, s) | Select {tuple, ...} => varExp (tuple, s) | Tuple xs => varExps (xs, s) | Var x => varExp (x, s) and lambda (l: Lambda.t) : Var.t vector = let val {arg, body, ...} = Lambda.dest l in newScope (fn s => (bind (arg, s); exp (body, s))) end val frees = newScope (fn s => exp (body, s)) val _ = if Vector.isEmpty frees then () else Error.bug ("LambdaFree.lambdaFree: program has free variables: " ^ (Layout.toString (Vector.layout Var.layout frees))) in () end end mlton-20100608/mlton/closure-convert/lambda-free.sig0000644000076600000240000000322311404435623020707 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LAMBDA_FREE_STRUCTS = sig include SXML end signature LAMBDA_FREE = sig include LAMBDA_FREE_STRUCTS structure Status: sig type t val init: t end (* * When called, descends the entire program and attaches a property * to each lambda primExp in the program. Then, you can use * lambdaFree to get free variables of that lambda. * For lambdas bound in a Fun dec, lambdaFree gives the union of the * frees of the entire group of mutually recursive functions. Hence, * lambdaFree for every lambda in a single Fun dec is the same. * Furthermore, for a lambda bound in a Fun dec, lambdaRec gives * the list of other funs bound in the same dec that the lambda refers * to. For example: * * val rec f = fn x => ... y ... g ... f ... * and g = fn z => ... f ... w ... * * lambdaFree(fn x =>) = [y, w] * lambdaFree(fn z =>) = [y, w] * lambdaRec(fn x =>) = [g, f] * lambdaRec(fn z =>) = [f] *) val lambdaFree: {program: Program.t, overflow: Var.t, varInfo: Var.t -> {frees: Var.t list ref ref, status: Status.t ref}, lambdaInfo: Lambda.t -> {frees: Var.t vector ref, recs: Var.t vector ref}} -> unit end mlton-20100608/mlton/closure-convert/sources.cm0000644000076600000240000000102211404435623020043 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group functor ClosureConvert is ../../lib/mlton/sources.cm ../atoms/sources.cm ../control/sources.cm ../ssa/sources.cm ../xml/sources.cm abstract-value.sig abstract-value.fun globalize.sig globalize.fun lambda-free.sig lambda-free.fun closure-convert.sig closure-convert.fun mlton-20100608/mlton/closure-convert/sources.mlb0000644000076600000240000000110211404435623020215 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb ../ssa/sources.mlb ../xml/sources.mlb abstract-value.sig abstract-value.fun globalize.sig globalize.fun lambda-free.sig lambda-free.fun closure-convert.sig closure-convert.fun in functor ClosureConvert end mlton-20100608/mlton/cm/0000755000076600000240000000000011404470407013310 5ustar mtfstaffmlton-20100608/mlton/cm/cm.sig0000644000076600000240000000070511404435623014416 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CM = sig (* cmfile can be relative or absolute. * The resulting list of files will have the same path as cmfile. *) val cm: {cmfile: File.t} -> File.t list end mlton-20100608/mlton/cm/cm.sml0000644000076600000240000000766011404435623014436 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure CM: CM = struct val maxAliasNesting: int = 32 fun cm {cmfile: File.t} = let val files = ref [] (* The files in seen are absolute. *) val seen = String.memoize (fn _ => ref false) fun loop (cmfile: File.t, nesting: int, relativize: Dir.t option): unit = let val relativize = case relativize of NONE => NONE | _ => if OS.Path.isAbsolute cmfile then NONE else relativize val {dir, file} = OS.Path.splitDirFile cmfile in Dir.inDir (if dir = "" then "." else dir, fn () => let val cwd = Dir.current () fun abs f = OS.Path.mkAbsolute {path = f, relativeTo = cwd} fun finalize f = case relativize of NONE => abs f | SOME d => OS.Path.mkRelative {path = f, relativeTo = d} fun region () = let val sourcePos = SourcePos.make {column = 0, file = finalize cmfile, line = 0} in Region.make {left = sourcePos, right = sourcePos} end fun fail msg = Control.error (region (), Layout.str msg, Layout.empty) datatype z = datatype Parse.result in case Parse.parse {cmfile = file} of Alias f => if nesting > maxAliasNesting then fail "alias nesting too deep." else loop (f, nesting + 1, relativize) | Bad s => fail (concat ["bad CM file: ", s]) | Members members => List.foreach (members, fn m => let val m' = abs m val seen = seen m' in if !seen then () else let val _ = seen := true fun sml () = List.push (files, finalize m') in Control.checkFile (m, {fail = fail, name = m, ok = fn () => case File.suffix m of SOME "cm" => loop (m, 0, relativize) | SOME "sml" => sml () | SOME "sig" => sml () | SOME "fun" => sml () | SOME "ML" => sml () | _ => fail (concat ["MLton can't process ", m])}) end end) end) end val d = Dir.current () val _ = loop (cmfile, 0, SOME d) val files = rev (!files) in files end end mlton-20100608/mlton/cm/lexer.sig0000644000076600000240000000260711404435623015141 0ustar mtfstaff(* Based on the file entity/lexer.sig in the SML/NJ CM sources. *) (* * entity/lexer.sig: lexical analysis of description files * * Copyright (c) 1995 by AT&T Bell Laboratories * * author: Matthias Blume (blume@cs.princeton.edu) *) signature CM_LEXER = sig exception LexicalError of string * string exception SyntaxError of string * string exception UserError of string * string datatype keyword = K_GROUP | K_LIBRARY | K_ALIAS | K_IS | K_SIGNATURE | K_STRUCTURE | K_FUNSIG | K_FUNCTOR | K_IF | K_ELIF | K_ELSE | K_ENDIF | K_DEFINED | K_ERROR datatype lconn = L_AND | L_OR | L_NOT datatype arith = A_PLUS | A_MINUS | A_TIMES | A_DIV | A_MOD datatype compare = C_LT | C_LE | C_GT | C_GE | C_EQ | C_NE datatype token = T_COLON | T_HASH | T_KEYWORD of keyword | T_SYMBOL of string | T_STRING of string | T_NUMBER of int | T_LPAREN | T_RPAREN | T_ARITH of arith | T_LCONN of lconn | T_COMPARE of compare | T_NL | T_EOF type mode val NORMAL: mode val MEMBERS: mode val lexer: { strdef: string -> bool, sigdef: string -> bool, fctdef: string -> bool, fsigdef: string -> bool, symval: string -> int option } -> string * In.t -> mode -> token end mlton-20100608/mlton/cm/lexer.sml0000644000076600000240000005002711404435623015151 0ustar mtfstaff(* Based on the file entity/lexer.sml in the SML/NJ CM sources. *) (* * entity/lexer.sml: lexical analysis of description files * * Copyright (c) 1995 by AT&T Bell Laboratories * * author: Matthias Blume (blume@cs.princeton.edu) *) structure CMLexer: CM_LEXER = struct exception LexicalError of string * string exception UserError of string * string exception SyntaxError of string * string exception LexerBug datatype keyword = K_GROUP | K_LIBRARY | K_ALIAS | K_IS | K_SIGNATURE | K_STRUCTURE | K_FUNSIG | K_FUNCTOR | K_IF | K_ELIF | K_ELSE | K_ENDIF | K_DEFINED | K_ERROR datatype lconn = L_AND | L_OR | L_NOT datatype arith = A_PLUS | A_MINUS | A_TIMES | A_DIV | A_MOD datatype compare = C_LT | C_LE | C_GT | C_GE | C_EQ | C_NE datatype token = T_COLON | T_HASH | T_KEYWORD of keyword | T_SYMBOL of string | T_STRING of string | T_NUMBER of int | T_LPAREN | T_RPAREN | T_ARITH of arith | T_LCONN of lconn | T_COMPARE of compare | T_NL | T_EOF datatype mode = NORMAL | PREPROC | MEMBERS | ERRORMSG fun lexer { strdef, sigdef, fctdef, fsigdef, symval } (fname, stream) = let fun lexerr s = raise LexicalError (fname, s) fun synerr s = raise SyntaxError (fname, s) fun usererr s = raise UserError (fname, s) val lookahead: char list ref = ref [] fun getc () = case !lookahead of [] => let val new = String.explode (In.input stream) in case new of [] => NONE | h :: t => (lookahead := t; SOME h) end | h :: t => (lookahead := t; SOME h) fun ungetc c = (lookahead := (c :: (!lookahead))) fun skip_white mode = let fun skip_scheme_comment () = case getc () of NONE => () | SOME #"\n" => (ungetc #"\n") | _ => skip_scheme_comment () fun skip_ml_comment () = let fun incomplete () = lexerr "incomplete ML-style comment" in case getc () of SOME #"*" => (case getc () of SOME #")" => () | NONE => incomplete () | SOME c => (ungetc c; skip_ml_comment ())) | SOME #"(" => (case getc () of SOME #"*" => (skip_ml_comment (); skip_ml_comment ()) | NONE => incomplete () | SOME c => (ungetc c; skip_ml_comment ())) (*| SOME #";" => (skip_scheme_comment (); skip_ml_comment ())*) | NONE => incomplete () | SOME _ => skip_ml_comment () end fun skip () = let fun done () = () fun preproc_nl thunk = (if mode = PREPROC orelse mode = ERRORMSG then ungetc #"\n" else thunk ()) in case getc () of NONE => () | SOME #";" => (skip_scheme_comment (); skip ()) | SOME #"\n" => (case getc () of NONE => preproc_nl done | SOME #"#" => (ungetc #"#"; preproc_nl done) | SOME c => (ungetc c; preproc_nl skip)) | SOME #"(" => (case getc () of NONE => ungetc #"(" | SOME #"*" => (skip_ml_comment (); skip ()) | SOME c => (ungetc c; ungetc #"(")) | SOME c => if Char.isSpace c then skip () else ungetc c end in skip end fun rawlex mode = let val skip = skip_white mode fun getc_nonwhite () = (skip (); getc ()) fun getnum c = let fun loop (n, c) = let val n = 10 * n + Char.ord c - Char.ord #"0" in case getc () of NONE => n | SOME c => if Char.isDigit c then loop (n, c) else (ungetc c; n) end in loop (0, c) handle Overflow => lexerr "arithmetic overflow" end fun expect (c, t) = if getc () = SOME c then t else lexerr (concat ["expecting ", String.implode [c]]) fun ifnext (c, ty, tn) = case getc () of NONE => tn | SOME c1 => if c = c1 then ty else (ungetc c1; tn) fun getsym (c, delim) = let fun loop (accu, c) = let val accu = c :: accu in case getc () of NONE => String.implode (rev accu) | SOME c => if Char.isSpace c orelse String.contains(delim, c) then (ungetc c; String.implode (rev accu)) else loop (accu, c) end in loop ([], c) end fun getline c = let fun loop accu = case getc () of NONE => String.implode (rev accu) | SOME #"\n" => String.implode (rev accu) | SOME c => loop (c :: accu) in loop [c] end val preproc_delim = "():;#+-*/%&!|><=" val non_preproc_delim = "():;#" fun preproc_sym "if" = T_KEYWORD K_IF | preproc_sym "elif" = T_KEYWORD K_ELIF | preproc_sym "else" = T_KEYWORD K_ELSE | preproc_sym "endif" = T_KEYWORD K_ENDIF | preproc_sym "defined" = T_KEYWORD K_DEFINED | preproc_sym "structure" = T_KEYWORD K_STRUCTURE | preproc_sym "signature" = T_KEYWORD K_SIGNATURE | preproc_sym "functor" = T_KEYWORD K_FUNCTOR | preproc_sym "funsig" = T_KEYWORD K_FUNSIG | preproc_sym "error" = T_KEYWORD K_ERROR | preproc_sym s = T_SYMBOL s fun normal_sym "group" = T_KEYWORD K_GROUP | normal_sym "Group" = T_KEYWORD K_GROUP | normal_sym "GROUP" = T_KEYWORD K_GROUP | normal_sym "library" = T_KEYWORD K_LIBRARY | normal_sym "Library" = T_KEYWORD K_LIBRARY | normal_sym "LIBRARY" = T_KEYWORD K_LIBRARY | normal_sym "alias" = T_KEYWORD K_ALIAS | normal_sym "Alias" = T_KEYWORD K_ALIAS | normal_sym "ALIAS" = T_KEYWORD K_ALIAS | normal_sym "is" = T_KEYWORD K_IS | normal_sym "IS" = T_KEYWORD K_IS | normal_sym "structure" = T_KEYWORD K_STRUCTURE | normal_sym "signature" = T_KEYWORD K_SIGNATURE | normal_sym "functor" = T_KEYWORD K_FUNCTOR | normal_sym "funsig" = T_KEYWORD K_FUNSIG | normal_sym s = T_SYMBOL s fun string () = let fun collect l = case getc () of NONE => lexerr "missing string delimiter" | SOME #"\"" => (case getc () of SOME #"\"" => collect (#"\"" :: l) | SOME c => (ungetc c; String.implode (rev l)) | NONE => String.implode (rev l)) | SOME c => collect (c :: l) in collect [] end in if mode = ERRORMSG then T_SYMBOL (case getc_nonwhite () of NONE => "error" | SOME #"\n" => "error" | SOME c => getline c) else case getc_nonwhite () of NONE => T_EOF | SOME #":" => T_COLON | SOME #"\n" => T_NL | SOME #"#" => T_HASH | SOME #"\"" => (case mode of NORMAL => T_STRING (string ()) | MEMBERS => T_STRING (string ()) | _ => synerr "quoted string in wrong context") | SOME c => if mode = PREPROC then case c of #"(" => T_LPAREN | #")" => T_RPAREN | #"+" => T_ARITH A_PLUS | #"-" => T_ARITH A_MINUS | #"*" => T_ARITH A_TIMES | #"/" => T_ARITH A_DIV | #"%" => T_ARITH A_MOD | #"&" => expect (#"&", T_LCONN L_AND) | #"|" => expect (#"|", T_LCONN L_OR) | #"!" => ifnext (#"=", T_COMPARE C_NE, T_LCONN L_NOT) | #">" => ifnext (#"=", T_COMPARE C_GE, T_COMPARE C_GT) | #"<" => ifnext (#"=", T_COMPARE C_LE, T_COMPARE C_LT) | #"=" => expect (#"=", T_COMPARE C_EQ) | _ => if Char.isDigit c then T_NUMBER (getnum c) else if Char.isAlpha c then preproc_sym (getsym (c, preproc_delim)) else synerr "illegal preprocessor line" else let val s = getsym (c, non_preproc_delim) in if mode = NORMAL then normal_sym s else T_SYMBOL s end end val lex = let val lookahead: token list ref = ref [] fun gett () = case !lookahead of [] => rawlex PREPROC | (h :: t) => (lookahead := t; h) fun ungett t = lookahead := (t :: (!lookahead)) fun leftrec (f, tokf) = let fun loop accu = let val nt = gett () in case tokf nt of NONE => (ungett nt; accu) | SOME c => loop (c (accu, f ())) end in loop (f ()) end fun nonassoc (f, tokf) = let val lhs = f () val nt = gett () in case tokf nt of NONE => (ungett nt; lhs) | SOME c => c (lhs, f ()) end fun expect (t, m) = if gett () = t then () else synerr (concat ["missing ", m]) fun intbool f (x: unit -> int, y: unit -> int) = fn () => if f (x (), y ()) then 1 else 0 fun orf (x, y) = fn () => if (x () <> 0) orelse (y () <> 0) then 1 else 0 fun andf (x, y) = fn () => if (x () <> 0) andalso (y () <> 0) then 1 else 0 fun notf x = fn () => if x () <> 0 then 0 else 1 val eqf = intbool (op =) val nef = intbool (op <>) val gtf = intbool (op >) val gef = intbool (op >=) val ltf = intbool (op <) val lef = intbool (op <=) fun binaryf binop (x: unit -> int, y: unit -> int) = fn () => (binop (x (), y ())) fun unaryf uop (x: unit -> int) = fn () => uop (x ()) val plusf = binaryf (op +) val minusf = binaryf (op -) val timesf = binaryf (op * ) val divf = binaryf (op div) val modf = binaryf (op mod) val negatef = unaryf ~ fun expression () = disjunction () and disjunction () = let fun tokf (T_LCONN L_OR) = SOME orf | tokf _ = NONE in leftrec (conjunction, tokf) end and conjunction () = let fun tokf (T_LCONN L_AND) = SOME andf | tokf _ = NONE in leftrec (equivalence, tokf) end and equivalence () = let fun tokf (T_COMPARE C_EQ) = SOME eqf | tokf (T_COMPARE C_NE) = SOME nef | tokf _ = NONE in nonassoc (comparison, tokf) end and comparison () = let fun tokf (T_COMPARE C_GT) = SOME gtf | tokf (T_COMPARE C_GE) = SOME gef | tokf (T_COMPARE C_LT) = SOME ltf | tokf (T_COMPARE C_LE) = SOME lef | tokf _ = NONE in nonassoc (sum, tokf) end and sum () = let fun tokf (T_ARITH A_PLUS) = SOME plusf | tokf (T_ARITH A_MINUS) = SOME minusf | tokf _ = NONE in leftrec (product, tokf) end and product () = let fun tokf (T_ARITH A_TIMES) = SOME timesf | tokf (T_ARITH A_DIV) = SOME divf | tokf (T_ARITH A_MOD) = SOME modf | tokf _ = NONE in leftrec (unary, tokf) end and unary () = case gett () of T_LCONN L_NOT => notf (unary ()) | T_ARITH A_MINUS => negatef (unary ()) | nt => (ungett nt; primary ()) and primary () = case gett () of T_LPAREN => expression () before expect (T_RPAREN, "right parenthesis") | T_NUMBER n => (fn () => n) | T_SYMBOL s => (fn () => (case symval s of NONE => synerr (concat ["undefined symbol: ", s]) | SOME v => v)) | T_KEYWORD K_DEFINED => let val _ = expect (T_LPAREN, "left parenthesis") in case gett () of T_KEYWORD k => let val look = case k of K_STRUCTURE => strdef | K_SIGNATURE => sigdef | K_FUNCTOR => fctdef | K_FUNSIG => fsigdef | _ => synerr "unexpected keyword" in case gett () of T_SYMBOL s => (expect (T_RPAREN, "right parenthesis"); fn () => if look s then 1 else 0) | _ => synerr "missing symbol" end | T_SYMBOL s => (expect (T_RPAREN, "right parenthesis"); fn () => (case symval s of NONE => 0 | SOME _ => 1)) | _ => synerr "illegal `defined' construct" end | _ => synerr "unexpected token" datatype localstate = T_C | T | E_C | E datatype cmd = IF of unit -> int | ELIF of unit -> int | ELSE | ENDIF type state = localstate * bool fun iscopying s = case s of [] => true | (_, copying) :: _ => copying fun transform (IF c, s) = if iscopying s andalso c () <> 0 then (T_C, true) :: s else (T, false) :: s | transform (ELIF _, (T_C, _) :: s) = (T_C, false) :: s | transform (ELIF c, (T, _) :: s) = if iscopying s andalso c () <> 0 then (T_C, true) :: s else (T, false) :: s | transform (ELIF _, _) = synerr "unexpected #elif" | transform (ELSE, (T_C, _) :: s) = (E, false) :: s | transform (ELSE, (T, _) :: s) = (E_C, iscopying s) :: s | transform (ELSE, _) = synerr "unexpected #else" | transform (ENDIF, []) = synerr "unexpected #endif" | transform (ENDIF, _ :: s) = s val state: state list ref = ref [] fun checklook () = case !lookahead of [] => () | _ => raise LexerBug fun condition () = let val e = expression () in fn () => (e () handle Overflow => synerr "arithmetic overflow in condition" | Div => synerr "divide by zero in condition") end fun nexttoken mode = case rawlex mode of T_HASH => (case rawlex PREPROC of T_KEYWORD K_IF => let val c = condition () val _ = expect (T_NL, "line break (#if)") val _ = checklook () in state := transform (IF c, !state); nexttoken mode end | T_KEYWORD K_ELSE => (expect (T_NL, "line break (#else)"); checklook (); state := transform (ELSE, !state); nexttoken mode) | T_KEYWORD K_ELIF => let val c = condition () val _ = expect (T_NL, "line break (#elif)") val _ = checklook () in state := transform (ELIF c, !state); nexttoken mode end | T_KEYWORD K_ENDIF => (expect (T_NL, "line break (#endif)"); checklook (); state := transform (ENDIF, !state); nexttoken mode) | T_KEYWORD K_ERROR => let val msg = case rawlex ERRORMSG of T_SYMBOL msg => msg | _ => raise LexerBug in if iscopying (!state) then usererr msg else (checklook (); nexttoken mode) end | _ => synerr "illegal preprocessor line") | T_EOF => if (!state) = [] then T_EOF else synerr "missing #endif" | t => if iscopying (!state) then t else nexttoken mode in nexttoken end in lex end end mlton-20100608/mlton/cm/parse.sig0000644000076600000240000000123011404435623015123 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PARSE = sig datatype result = Alias of File.t | Bad of string (* error message *) | Members of File.t list (* Pre: cmfile must not contain any path, i.e. it must be in the * current directory. * The resulting members are either absolute or relative to the current * directory. *) val parse: {cmfile: string} -> result end mlton-20100608/mlton/cm/parse.sml0000644000076600000240000001047411404435623015146 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Based on the file entity/description.sml in the SML/NJ CM sources. *) (* * entity/description.sml: Entity description file parser. * * Copyright (c) 1995 by AT&T Bell Laboratories * * author: Matthias Blume (blume@cs.princeton.edu) *) structure Parse: PARSE = struct val fail = Process.fail structure Lexer = CMLexer datatype result = Alias of File.t | Bad of string | Members of File.t list (* The main read function for CM entities. *) fun parse {cmfile: string} = Exn.withEscape (fn escape => let fun bad m = (ignore (escape (Bad m)); raise Fail "impossible") in File.withIn (cmfile, fn ins => let fun no _ = false val lex = Lexer.lexer {strdef = no, sigdef = no, fctdef = no, fsigdef = no, symval = fn _ => NONE} (cmfile, ins) val lex = fn m => lex m handle Lexer.LexicalError (_, s) => bad s | Lexer.SyntaxError (_, s) => bad s | Lexer.UserError (_, s) => bad s val lookahead: Lexer.token list ref = ref [] fun normal () = case !lookahead of [] => lex Lexer.NORMAL | h :: t => (lookahead := t; h) fun member () = case !lookahead of [] => lex Lexer.MEMBERS | h :: t => (lookahead := t; h) fun unget t = lookahead := (t :: (!lookahead)) fun readExport () = let fun name () = (case normal () of Lexer.T_SYMBOL _ => () | Lexer.T_STRING _ => () | _ => bad "missing exported name" ; SOME ()) in case normal () of Lexer.T_KEYWORD Lexer.K_SIGNATURE => name () | Lexer.T_KEYWORD Lexer.K_STRUCTURE => name () | Lexer.T_KEYWORD Lexer.K_FUNCTOR => name () | Lexer.T_KEYWORD Lexer.K_FUNSIG => name () | x => (unget x; NONE) end fun readList readItem = let fun loop ac = case readItem () of NONE => rev ac | SOME i => loop (i :: ac) in loop [] end fun getFileName () = case member () of Lexer.T_SYMBOL name => SOME name | Lexer.T_STRING name => SOME name | t => (unget t; NONE) fun readMember () = case getFileName () of NONE => NONE | SOME f => (case member () of Lexer.T_COLON => (case member () of Lexer.T_SYMBOL _ => () | Lexer.T_STRING _ => () | _ => bad "missing class name") | t => unget t ; SOME f) fun readMembers () = case normal () of Lexer.T_KEYWORD Lexer.K_IS => (if !lookahead <> [] then fail "Bug in parser" else () ; readList readMember) | _ => bad "missing keyword 'is'" fun parseAlias () = case getFileName () of NONE => bad "alias name missing" | SOME f => let val _ = In.close ins in Alias f end fun parseGroup () = let val _ = readList readExport val members = readMembers () val _ = In.close ins in Members members end in case normal () of Lexer.T_KEYWORD Lexer.K_GROUP => parseGroup () | Lexer.T_KEYWORD Lexer.K_LIBRARY => parseGroup () | Lexer.T_KEYWORD Lexer.K_ALIAS => parseAlias () | _ => bad "expected 'group' or 'library'" end) end) end mlton-20100608/mlton/cm/sources.cm0000644000076600000240000000057311404435623015322 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group structure CM is ../../lib/mlton/sources.cm ../control/sources.cm lexer.sig lexer.sml parse.sig parse.sml cm.sig cm.sml mlton-20100608/mlton/cm/sources.mlb0000644000076600000240000000063211404435623015471 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../control/sources.mlb lexer.sig lexer.sml parse.sig parse.sml cm.sig cm.sml in structure CM end mlton-20100608/mlton/codegen/0000755000076600000240000000000011404470407014315 5ustar mtfstaffmlton-20100608/mlton/codegen/amd64-codegen/0000755000076600000240000000000011404470407016632 5ustar mtfstaffmlton-20100608/mlton/codegen/amd64-codegen/amd64-allocate-registers.fun0000644000076600000240000170666111404435625024072 0ustar mtfstaff(* Copyright (C) 1999-2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64AllocateRegisters(S: AMD64_ALLOCATE_REGISTERS_STRUCTS) : AMD64_ALLOCATE_REGISTERS = struct open S open amd64 val tracer = amd64.tracer val tracerTop = amd64.tracerTop fun track memloc = let val trackClasses = ClassSet.+(ClassSet.+ (!amd64MLton.Classes.livenessClasses, !amd64MLton.Classes.holdClasses), ClassSet.fromList [amd64MLton.Classes.StaticNonTemp, amd64MLton.Classes.CArg]) in ClassSet.contains(trackClasses, MemLoc.class memloc) end fun volatile memloc = let val volatileClasses = !amd64MLton.Classes.volatileClasses in ClassSet.contains(volatileClasses, MemLoc.class memloc) end fun partition(l, p) = let val rec partition' = fn ([],PS) => PS | (h::t,PS) => let val rec partition'' = fn [] => [[h]] | P::PS => if List.exists(P,fn x => p(h, x)) then (h::P)::PS else P::(partition'' PS) in partition'(t,partition'' PS) end in partition'(l,[]) end fun totalOrder (l, plt) = let val rec totalOrder' = fn ([],l) => l | (h::t,l) => let val rec split = fn (lt,t) => case List.splitPrefix (t, fn x => plt(x,h)) of (nil,t) => lt@[h]@t | (lt',t) => split(lt@lt',t) in totalOrder'(t,split([],l)) end in totalOrder'(l,[]) end val bool_lt = fn (false, true) => true | _ => false val bool_gt = fn (true, false) => true | _ => false fun option_lt lt = fn (SOME x, SOME y) => lt (x,y) | (NONE, SOME _) => true | _ => false structure Liveness = struct datatype futureMemlocTag = FLIVE | FCOMMIT | FREMOVE | FDEAD | FUSE | FUSEDEF | FDEF val futureMemlocTag_toString = fn FLIVE => "FLIVE" | FCOMMIT => "FCOMMIT" | FREMOVE => "FREMOVE" | FDEAD => "FDEAD" | FUSE => "FUSE" | FUSEDEF => "FUSEDEF" | FDEF => "FDEF" type futureMemloc = futureMemlocTag * MemLoc.t datatype futureMemlocPredTag = FCOMMITP | FREMOVEP | FDEADP | FMCOMMITP | FMREMOVEP val futureMemlocPredTag_toString = fn FCOMMITP => "FCOMMITP" | FREMOVEP => "FREMOVEP" | FDEADP => "FDEADP" | FMCOMMITP => "FMCOMMITP" | FMREMOVEP => "FMREMOVEP" type futureMemlocPred = futureMemlocPredTag * (MemLoc.t -> bool) datatype future = M of futureMemloc | MP of futureMemlocPred val future_toString = fn (M (tag, memloc)) => concat [futureMemlocTag_toString tag, " ", MemLoc.toString memloc] | (MP (tag, _)) => concat [futureMemlocPredTag_toString tag] type hint = Register.t * MemLoc.t list * MemLocSet.t type xmmhint = XmmRegister.t * MemLoc.t list * MemLocSet.t val hint_toString = fn (register, memlocs, _) => concat ["{ ", List.fold (memlocs, "", fn (memloc, s) => s ^ (MemLoc.toString memloc) ^ " "), "} -> ", Register.toString register] val xmmhint_toString = fn (register, memlocs, _) => concat ["{ ", List.fold (memlocs, "", fn (memloc, s) => s ^ (MemLoc.toString memloc) ^ " "), "} -> ", XmmRegister.toString register] type t = {dead: MemLocSet.t, commit: MemLocSet.t, remove: MemLocSet.t, futures: {pre: future list, post: future list}, hint: hint list, xmmhint: xmmhint list} (* fun toString {dead, commit, remove, futures = {pre, post}, hint, xmmhint} = let fun doit (name, l, toString, s) = List.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) fun doit' (name, l, toString, s) = MemLocSet.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) in doit'("dead: ", dead, MemLoc.toString, doit'("commit: ", commit, MemLoc.toString, doit'("remove: ", remove, MemLoc.toString, doit("future (pre): ", List.rev pre, future_toString, doit("future (post): ", List.rev post, future_toString, doit("hint: ", hint, hint_toString, doit("xmmhint: ", xmmhint, xmmhint_toString, ""))))))) end *) fun toComments {dead, commit, remove, futures = {pre, post}, hint, xmmhint} = let fun doit (name, l, toString, ac) = List.fold(l, ac, fn (x, ac) => (Assembly.comment (concat [name, toString x])):: ac) fun doit' (name, l, toString, ac) = MemLocSet.fold(l, ac, fn (x, ac) => (Assembly.comment (concat [name, toString x])):: ac) in doit'("dead: ", dead, MemLoc.toString, doit'("commit: ", commit, MemLoc.toString, doit'("remove: ", remove, MemLoc.toString, doit("future (pre): ", List.rev pre, future_toString, doit("future (post): ", List.rev post, future_toString, doit("hint: ", hint, hint_toString, doit("xmmhint: ", xmmhint, xmmhint_toString, []))))))) end datatype commit = NO | COMMIT | REMOVE | DEAD fun predict(future, memloc) = let val rec sawNothing = fn [] => if track memloc then DEAD else REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => NO | FCOMMIT => sawCommit future | FREMOVE => sawRemove future | FDEAD => DEAD | FUSE => sawUse future | FUSEDEF => NO | FDEF => DEAD else if ((tag' = FUSEDEF) orelse (tag' = FDEF)) andalso List.exists (MemLoc.utilized memloc, fn memloc'' => MemLoc.mayAlias(memloc'', memloc')) then REMOVE else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawCommit future | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawNothing future else sawNothing future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawCommit future | FREMOVEP => sawRemove future | FDEADP => DEAD | FMCOMMITP => sawCommit future | FMREMOVEP => sawRemove future else sawNothing future and sawCommit = fn [] => REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => COMMIT | FCOMMIT => sawCommit future | FREMOVE => REMOVE | FDEAD => REMOVE | FUSE => COMMIT | FUSEDEF => COMMIT | FDEF => REMOVE else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawCommit future | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawCommit future else sawCommit future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawCommit future | FREMOVEP => REMOVE | FDEADP => REMOVE | FMCOMMITP => sawCommit future | FMREMOVEP => REMOVE else sawCommit future and sawRemove = fn [] => REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => REMOVE | FCOMMIT => REMOVE | FREMOVE => sawRemove future | FDEAD => DEAD | FUSE => REMOVE | FUSEDEF => REMOVE | FDEF => DEAD else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => REMOVE | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawRemove future else sawRemove future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => REMOVE | FREMOVEP => REMOVE | FDEADP => DEAD | FMCOMMITP => REMOVE | FMREMOVEP => sawRemove future else sawRemove future and sawUse = fn [] => if track memloc then NO else COMMIT | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => NO | FCOMMIT => sawUseCommit future | FREMOVE => NO | FDEAD => NO | FUSE => sawUse future | FUSEDEF => NO | FDEF => NO else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawUseCommit future | FUSEDEF => NO | FDEF => NO | _ => sawUse future else sawUse future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawUseCommit future | FREMOVEP => NO | FDEADP => NO | FMCOMMITP => sawUseCommit future | FMREMOVEP => NO else sawUse future and sawUseCommit = fn [] => if track memloc then NO else COMMIT | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => COMMIT | FCOMMIT => sawUseCommit future | FREMOVE => NO | FDEAD => NO | FUSE => COMMIT | FUSEDEF => COMMIT | FDEF => NO else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawUseCommit future | FUSEDEF => NO | FDEF => NO | _ => sawUseCommit future else sawUseCommit future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawUseCommit future | FREMOVEP => NO | FDEADP => NO | FMCOMMITP => sawUseCommit future | FMREMOVEP => NO else sawUseCommit future fun check commit = if List.exists (MemLoc.utilized memloc, fn memloc' => case predict (future, memloc') of REMOVE => true | DEAD => true | _ => false) then REMOVE else commit val default = case sawNothing future of REMOVE => REMOVE | DEAD => DEAD | commit => check commit in default end val split = fn (set, p) => MemLocSet.fold (set, (MemLocSet.empty,MemLocSet.empty,MemLocSet.empty,MemLocSet.empty), fn (memloc, (no, commit, remove, dead)) => let val add = fn set => MemLocSet.add(set, memloc) in case p memloc of NO => (add no, commit, remove, dead) | COMMIT => (no, add commit, remove, dead) | REMOVE => (no, commit, add remove, dead) | DEAD => (no, commit, remove, add dead) end) fun liveness {uses: MemLocSet.t, defs: MemLocSet.t, future: future list} : {dead: MemLocSet.t, commit: MemLocSet.t, remove: MemLocSet.t, future: future list} = let local fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) in val allUses = doit'(defs, doit'(uses, uses)) val allDefs = defs end val current = MemLocSet.+(allUses, allDefs) val current_usedef = MemLocSet.intersect(allUses, allDefs) val current_use = MemLocSet.-(allUses, current_usedef) val current_def = MemLocSet.-(allDefs, current_usedef) val (_,commit,remove,dead) = split(current, fn memloc => predict(future, memloc)) val future = let fun doit(memlocs, tag, future) = MemLocSet.fold (memlocs, future, fn (memloc,future) => (M (tag, memloc))::future) in doit(current_use, FUSE, doit(current_usedef, FUSEDEF, doit(current_def, FDEF, future))) end val info = {dead = dead, commit = commit, remove = remove, future = future} in info end fun livenessInstruction {instruction: Instruction.t, future: future list} = let val future_post = future val {uses, defs, ...} = Instruction.uses_defs_kills instruction local fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand, memlocs) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(memlocs, memloc) | NONE => memlocs) in val uses = doit uses val defs = doit defs end val {dead,commit,remove,future} = liveness {uses = uses, defs = defs, future = future_post} val future_pre = future val info = {dead = dead, commit = commit, remove = remove, futures = {pre = future_pre, post = future_post}} in info end fun livenessDirective {directive: Directive.t, future: future list} = let val future_post = future fun addLive (memlocsX, f) = List.fold (memlocsX, future, fn (X, future) => (M (FLIVE, f X))::future) fun addLive' (memlocs) = MemLocSet.fold (memlocs, future, fn (memloc, future) => (M (FLIVE, memloc))::future) val future_pre = case directive of Directive.Reset => [] | Directive.Cache {caches, ...} => addLive(caches, fn {memloc, ...} => memloc) | Directive.XmmCache {caches, ...} => addLive(caches, fn {memloc, ...} => memloc) | Directive.Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes, ...} => MemLocSet.fold (commit_memlocs, MemLocSet.fold (remove_memlocs, MemLocSet.fold (dead_memlocs, (MP (FCOMMITP, fn memloc => ClassSet.contains(commit_classes, MemLoc.class memloc))):: (MP (FREMOVEP, fn memloc => ClassSet.contains(remove_classes, MemLoc.class memloc))):: (MP (FDEADP, fn memloc => ClassSet.contains(dead_classes, MemLoc.class memloc))):: future, fn (memloc,future) => (M (FDEAD, memloc))::future), fn (memloc,future) => (M (FREMOVE, memloc))::future), fn (memloc,future) => (M (FCOMMIT, memloc))::future) | Directive.CCall => (MP (FCOMMITP, fn memloc => MemLoc.Class.eq (MemLoc.class memloc, MemLoc.Class.CStack))):: (MP (FMREMOVEP, fn memloc => (not (MemLoc.Class.eq (MemLoc.class memloc, MemLoc.Class.CStack))) andalso (Size.class (MemLoc.size memloc) <> Size.INT))):: future | Directive.Return {returns} => (List.map(returns, fn {dst, ...} => M (FDEF, dst))) @ future | Directive.SaveRegAlloc {live, ...} => addLive'(live) | _ => future val info = {dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = future_pre, post = future_post}} in info end fun livenessAssembly {assembly: Assembly.t, future: future list, hint: hint list, xmmhint: xmmhint list} : t = let fun default () = {dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = future, post = future}} val {dead, commit, remove, futures} = case assembly of Assembly.Comment _ => default () | Assembly.Directive d => livenessDirective {directive = d, future = future} | Assembly.Instruction i => livenessInstruction {instruction = i, future = future} | Assembly.Label _ => default () | Assembly.PseudoOp _ => default () val hint' = Assembly.hints assembly val hint = List.fold (case assembly of Assembly.Directive Directive.Reset => [] | _ => hint, List.revMap (hint', fn (memloc, register) => (register, [memloc], MemLocSet.empty)), fn ((hint_register,hint_memlocs,hint_ignore),hint) => if List.exists (hint, fn (hint_register',_,_) => Register.coincide(hint_register, hint_register')) then hint else let val hint_memloc = hd hint_memlocs in if List.fold (hint, false, fn ((_,hint_memlocs',_),b) => b orelse List.contains (hint_memlocs', hint_memloc, MemLoc.eq)) then hint else (hint_register, [hint_memloc], MemLocSet.union(dead, hint_ignore))::hint end) val hint = case assembly of (Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc src', dst = Operand.MemLoc dst', ...})) => List.revMap (hint, fn (hint_register,hint_memlocs,hint_ignore) => if List.contains(hint_memlocs, dst', MemLoc.eq) then (hint_register, src'::hint_memlocs, hint_ignore) else (hint_register,hint_memlocs,hint_ignore)) | _ => hint val xmmhint = case assembly of (Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc src', dst = Operand.MemLoc dst', ...})) => List.revMap (xmmhint, fn (hint_register,hint_memlocs,hint_ignore) => if List.contains(hint_memlocs, dst', MemLoc.eq) then (hint_register, src'::hint_memlocs, hint_ignore) else (hint_register,hint_memlocs,hint_ignore)) | _ => xmmhint val info = {dead = dead, commit = commit, remove = remove, futures = futures, hint = hint, xmmhint = xmmhint} in info end fun toLiveness (assembly: Assembly.t list) : ((Assembly.t * t) list) = let val {assembly,...} = List.foldr (assembly, {assembly = [], future = [], hint = [], xmmhint = []}, fn (asm, {assembly,future,hint,xmmhint}) => let val info as {futures = {pre, ...}, hint, xmmhint, ...} = livenessAssembly {assembly = asm, future = future, hint = hint, xmmhint = xmmhint} in {assembly = (asm,info)::assembly, future = pre, hint = hint, xmmhint = xmmhint} end) in assembly end val (toLiveness,toLiveness_msg) = tracer "toLiveness" toLiveness fun toNoLiveness (assembly: Assembly.t list) : ((Assembly.t * t) list) = List.map(assembly, fn asm => (asm,{dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = [], post = []}, hint = [], xmmhint = []})) val (toNoLiveness,toNoLiveness_msg) = tracer "toNoLiveness" toNoLiveness end structure RegisterAllocation = struct exception Spill val spill : Int.t ref = ref 0 val spillLabel = Label.fromString "spill" val depth : Int.t ref = ref 0 datatype commit = NO | COMMIT of int | REMOVE of int | TRYCOMMIT of int | TRYREMOVE of int val commit_toString = fn NO => "NO" | COMMIT i => "COMMIT " ^ (Int.toString i) | REMOVE i => "REMOVE " ^ (Int.toString i) | TRYCOMMIT i => "TRYCOMMIT " ^ (Int.toString i) | TRYREMOVE i => "TRYREMOVE " ^ (Int.toString i) type value = {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, commit: commit} fun value_toString {register, memloc, weight, sync, commit} = concat [Register.toString register, " ", MemLoc.toString memloc, " ", Int.toString weight, " ", Bool.toString sync, " ", commit_toString commit] type xmmvalue = {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, commit: commit} fun xmmvalue_toString {register, memloc, weight, sync, commit} = concat [XmmRegister.toString register, " ", MemLoc.toString memloc, " ", Int.toString weight, " ", Bool.toString sync, " ", commit_toString commit] type t = {entries: value list, reserved: Register.t list, xmmentries: xmmvalue list, xmmreserved: XmmRegister.t list} fun toString ({entries, reserved, xmmentries, xmmreserved}: t) = let fun doit (name, l, toString, ac) = (name ^ "\n") ^ (List.fold(l, ac, fn (x, ac) => (toString x) ^ "\n" ^ ac)) in doit("entries:", entries, value_toString, doit("reserved:", reserved, Register.toString, doit("xmmentries:", xmmentries, xmmvalue_toString, doit("xmmreserved:", xmmreserved, XmmRegister.toString, "")))) end fun toComments ({entries, reserved, xmmentries, xmmreserved}: t) = let fun doit (name, l, toString, ac) = (Assembly.comment name):: (List.fold(l, ac, fn (x, ac) => (Assembly.comment (toString x)):: ac)) in AppendList.fromList (doit("entries:", entries, value_toString, doit("reserved:", reserved, Register.toString, doit("xmmentries:", xmmentries, xmmvalue_toString, doit("xmmreserved:", xmmreserved, XmmRegister.toString, []))))) end val {get = getRA : Directive.Id.t -> {registerAllocation: t}, set = setRA, ...} = Property.getSetOnce (Directive.Id.plist, Property.initRaise ("getRA", fn _ => Layout.empty)) fun empty () : t = {entries = [], reserved = [], xmmentries = [], xmmreserved = []} fun reserve' {register: Register.t, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = register::reserved, xmmentries = xmmentries, xmmreserved = xmmreserved}} fun xmmreserve' {register: XmmRegister.t, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = reserved, xmmentries = xmmentries, xmmreserved = register::xmmreserved}} fun reserve {registers: Register.t list, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = registers @ reserved, xmmentries = xmmentries, xmmreserved = xmmreserved}} fun xmmreserve {registers: XmmRegister.t list, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = reserved, xmmentries = xmmentries, xmmreserved = registers @ xmmreserved}} fun unreserve' {register: Register.t, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = List.revRemoveAll (reserved, fn register' => Register.eq (register', register)), xmmentries = xmmentries, xmmreserved = xmmreserved}} fun xmmunreserve' {register: XmmRegister.t, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = reserved, xmmentries = xmmentries, xmmreserved = List.revRemoveAll (xmmreserved, fn register' => XmmRegister.eq (register', register))}} fun unreserve {registers: Register.t list, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = List.revRemoveAll (reserved, fn register' => List.contains (registers, register', Register.eq)), xmmentries = xmmentries, xmmreserved = xmmreserved}} fun xmmunreserve {registers: XmmRegister.t list, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = reserved, xmmentries = xmmentries, xmmreserved = List.revRemoveAll (xmmreserved, fn register' => List.contains (registers, register', XmmRegister.eq))}} fun valueMap {map, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = List.revMap(entries, map), reserved = reserved, xmmentries = xmmentries, xmmreserved = xmmreserved} fun xmmvalueMap {map, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = entries, reserved = reserved, xmmentries = List.revMap(xmmentries, map), xmmreserved = xmmreserved} fun valueFilter {filter, registerAllocation = {entries, ...}: t} = List.revKeepAll(entries, filter) fun xmmvalueFilter {filter, registerAllocation = {xmmentries, ...}: t} = List.revKeepAll(xmmentries, filter) fun valueRegister {register, registerAllocation} = case valueFilter {filter = fn {register = register', ...} => Register.eq(register, register'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.valueRegister" (* fun xmmvalueRegister {register, registerAllocation} = case xmmvalueFilter {filter = fn {register = register', ...} => XmmRegister.eq(register, register'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.xmmvalueRegister" *) fun valuesRegister {register = Register.T {reg, ...}, registerAllocation = {entries, ...}: t} = List.revKeepAll(entries, fn {register = Register.T {reg = reg', ...}, ...} => reg = reg') fun xmmvaluesXmmRegister {register = XmmRegister.T {reg, ...}, registerAllocation = {xmmentries, ...}: t} = List.revKeepAll(xmmentries, fn {register = XmmRegister.T {reg = reg', ...}, ...} => reg = reg') fun update {value as {register,...}, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = let val entries = List.revRemoveAll(entries, fn {register = register',...} => Register.eq(register,register')) in value::entries end, reserved = reserved, xmmentries = xmmentries, xmmreserved = xmmreserved} fun xmmupdate {value as {register,...}, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = entries, reserved = reserved, xmmentries = let val xmmentries = List.revRemoveAll(xmmentries, fn {register = register',...} => XmmRegister.eq(register,register')) in value::xmmentries end, xmmreserved = xmmreserved} fun delete {register, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = List.revRemoveAll(entries, fn {register = register',...} => Register.eq(register, register')), reserved = reserved, xmmentries = xmmentries, xmmreserved = xmmreserved} fun xmmdelete {register, registerAllocation = {entries, reserved, xmmentries, xmmreserved}: t} = {entries = entries, reserved = reserved, xmmentries = List.revRemoveAll(xmmentries, fn {register = register',...} => XmmRegister.eq(register, register')), xmmreserved = xmmreserved} fun deletes {registers, registerAllocation: t} = List.fold(registers, registerAllocation, fn (register, registerAllocation) => delete {register = register, registerAllocation = registerAllocation}) fun xmmdeletes {registers, registerAllocation: t} = List.fold(registers, registerAllocation, fn (register, registerAllocation) => xmmdelete {register = register, registerAllocation = registerAllocation}) fun allocated {memloc, registerAllocation: t} = case valueFilter {filter = fn {memloc = memloc',...} => MemLoc.eq(memloc,memloc'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.allocated" fun xmmallocated {memloc, registerAllocation: t} = case xmmvalueFilter {filter = fn {memloc = memloc',...} => MemLoc.eq(memloc,memloc'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.xmmallocated" fun remove {memloc, registerAllocation: t} = case allocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register, ...} => delete {register = register, registerAllocation = registerAllocation} | NONE => registerAllocation fun xmmremove {memloc, registerAllocation: t} = case xmmallocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register, ...} => xmmdelete {register = register, registerAllocation = registerAllocation} | NONE => registerAllocation fun removes {memlocs, registerAllocation: t} = List.fold(memlocs, registerAllocation, fn (memloc,registerAllocation) => remove {memloc = memloc, registerAllocation = registerAllocation}) fun xmmremoves {memlocs, registerAllocation: t} = List.fold(memlocs, registerAllocation, fn (memloc,registerAllocation) => xmmremove {memloc = memloc, registerAllocation = registerAllocation}) local val commitPush' = fn NO => NO | COMMIT i => COMMIT (i + 1) | REMOVE i => REMOVE (i + 1) | TRYCOMMIT i => TRYCOMMIT (i + 1) | TRYREMOVE i => TRYREMOVE (i + 1) val commitPop' = fn NO => NO | COMMIT i => COMMIT (i - 1) | REMOVE i => REMOVE (i - 1) | TRYCOMMIT i => TRYCOMMIT (i - 1) | TRYREMOVE i => TRYREMOVE (i - 1) in fun commitPush {registerAllocation: t} = valueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPush' commit}, registerAllocation = registerAllocation} fun xmmcommitPush {registerAllocation: t} = xmmvalueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPush' commit}, registerAllocation = registerAllocation} fun commitPop {registerAllocation: t} = valueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPop' commit}, registerAllocation = registerAllocation} fun xmmcommitPop {registerAllocation: t} = xmmvalueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPop' commit}, registerAllocation = registerAllocation} end fun savedRegisters {saves: Operand.t list, registerAllocation: t} : Register.t list = List.concatMap (saves, fn Operand.MemLoc m => (case allocated {memloc = m, registerAllocation = registerAllocation} of SOME {register, ...} => [register] | NONE => []) | Operand.Register r => [r] | Operand.Address (Address.T {base, index, ...}) => (case (base, index) of (NONE, NONE ) => [] | (SOME rb, NONE ) => [rb] | (NONE, SOME ro) => [ro] | (SOME rb, SOME ro) => [rb,ro]) | _ => []) fun savedXmmRegisters {saves: Operand.t list, registerAllocation: t} : XmmRegister.t list = List.concatMap (saves, fn Operand.MemLoc m => (case xmmallocated {memloc = m, registerAllocation = registerAllocation} of SOME {register, ...} => [register] | NONE => []) | Operand.XmmRegister r => [r] | _ => []) fun supportedRegisters {supports: Operand.t list, registerAllocation: t} : Register.t list = let fun supportedRegisters' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, xmmallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME {register, ...}, _) => [register] | (_, SOME _) => [] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedRegisters') in List.concatMap (supports, fn Operand.MemLoc m => supportedRegisters' m | _ => []) end fun supportedXmmRegisters {supports: Operand.t list, registerAllocation: t} : XmmRegister.t list = let fun supportedXmmRegisters' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, xmmallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME _, _) => [] | (_, SOME {register, ...}) => [register] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedXmmRegisters') in List.concatMap (supports, fn Operand.MemLoc m => supportedXmmRegisters' m | _ => []) end fun supportedMemLocs {supports: Operand.t list, registerAllocation: t} : MemLoc.t list = let fun supportedMemLocs' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, xmmallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME _, _) => [memloc] | (_, SOME _) => [memloc] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedMemLocs') in List.concatMap (supports, fn Operand.MemLoc m => supportedMemLocs' m | _ => []) end fun 'a spillAndReissue {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t, spiller : {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} -> {assembly: Assembly.t AppendList.t, registerAllocation: t}, msg : string, reissue : {assembly: Assembly.t AppendList.t, registerAllocation: t} -> 'a} : 'a = (Int.dec depth; if !depth = 0 then let val _ = Int.inc depth val {assembly, registerAllocation} = spiller {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val return = reissue {assembly = assembly, registerAllocation = registerAllocation} handle Spill => (Error.bug (concat [msg, ":reSpill"])) val _ = Int.dec depth in return end else raise Spill) fun potentialRegisters ({size, force, ...}: {size: Size.t, saves: Operand.t list, force: Register.t list, registerAllocation: t}): Register.t list = case force of [] => Register.registers size | registers => List.revKeepAll(Register.registers size, fn register => List.contains(registers, register, Register.eq)) fun potentialXmmRegisters ({size, force, ...}: {size: Size.t, saves: Operand.t list, force: XmmRegister.t list, registerAllocation: t}): XmmRegister.t list = case force of [] => XmmRegister.registers size | registers => List.revKeepAll(XmmRegister.registers size, fn register => List.contains(registers, register, XmmRegister.eq)) fun chooseRegister {info = {futures = {pre = future, ...}, hint,...}: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation as {reserved,...}: t} : {register: Register.t, coincide_values: value list} = let val registers = potentialRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} val saved = savedRegisters {saves = saves, registerAllocation = registerAllocation} val preserved = let fun doit(registers, preserved) = List.fold (registers, preserved, fn (register,preserved) => if List.contains(preserved, register, Register.eq) then preserved else register::preserved) in doit(saved, doit(reserved, [])) end val registers = List.revRemoveAll (registers, fn register' => List.exists (preserved, fn register'' => Register.coincide(register',register''))) val supported = supportedRegisters {supports = supports, registerAllocation = registerAllocation} val values = valueFilter {filter = fn _ => true, registerAllocation = registerAllocation} val memlocs = List.revMap(values, #memloc) val registers_costs = List.revMap (registers, fn register' => let val hint_cost = List.fold (hint, 0, fn ((hint_register,hint_memlocs,hint_ignore), hint_cost) => if Register.eq(register', hint_register) then case memloc of SOME memloc => (case (List.contains (hint_memlocs, memloc, MemLoc.eq), MemLocSet.contains (hint_ignore, memloc)) of (true, _) => hint_cost + 5 | (false, true) => hint_cost | (false, false) => hint_cost - 5) | NONE => hint_cost - 5 else if Register.coincide(register', hint_register) then hint_cost - 5 else hint_cost) val values = valuesRegister {register = register', registerAllocation = registerAllocation} val (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost) = List.fold (values, (false,false,NONE,0,true,0), fn ({register,memloc,weight,sync,commit,...}, cost as (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost)) => if Register.coincide(register,register') then let val support_cost' = List.contains(supported, register, Register.eq) val commit_cost' = case commit of TRYREMOVE _ => false | REMOVE _ => false | _ => true val future_cost' = List.index (future, fn Liveness.M (tag, memloc') => let val eq = MemLoc.eq(memloc, memloc') in case tag of Liveness.FLIVE => eq | Liveness.FUSE => eq | Liveness.FUSEDEF => eq | _ => false end | _ => false) val utilized_cost' = List.fold (memlocs, 0, fn (memloc',uc') => List.fold (MemLoc.utilized memloc', 0, fn (memloc'',uc'') => if MemLoc.eq (memloc, memloc'') then uc'' + 1 else uc'') + uc') val sync_cost' = sync val weight_cost' = weight in (support_cost orelse support_cost', commit_cost orelse commit_cost', case (future_cost,future_cost') of (_, NONE) => future_cost | (NONE, _) => future_cost' | (SOME f,SOME f') => SOME (Int.min(f,f')), utilized_cost + utilized_cost', sync_cost andalso sync_cost', weight_cost + weight_cost') end else cost) in (register', (support_cost, commit_cost, future_cost, hint_cost, utilized_cost, sync_cost, weight_cost)) end) val registers_costs_sorted = List.insertionSort (registers_costs, fn ((_,(support_c1, commit_c1, future_c1, hint_c1, utilized_c1, sync_c1, weight_c1)), (_,(support_c2, commit_c2, future_c2, hint_c2, utilized_c2, sync_c2, weight_c2))) => bool_lt(support_c1,support_c2) orelse (support_c1 = support_c2 andalso (bool_lt(commit_c1,commit_c2) orelse (commit_c1 = commit_c2 andalso (option_lt (op >) (future_c1, future_c2) orelse (future_c1 = future_c2 andalso (hint_c1 > hint_c2 orelse (hint_c1 = hint_c2 andalso (utilized_c1 < utilized_c2 orelse (utilized_c1 = utilized_c2 andalso (bool_gt(sync_c1,sync_c2) orelse (sync_c1 = sync_c2 andalso weight_c1 < weight_c2)))))))))))) val registers = List.map(registers_costs_sorted, #1) val register = case registers of [] (* => raise Spill *) => let fun listToString(ss: string list): string = "[" ^ (concat(List.separate(ss, ", "))) ^ "]" val size = Size.toString size val supports = listToString(List.map(supports,Operand.toString)) val saves = listToString(List.map(saves,Operand.toString)) val force = listToString(List.map(force,Register.toString)) val reserved = listToString(List.map(reserved,Register.toString)) val msg = concat["\n", "chooseRegister:\n", (toString registerAllocation), "size = ", size, "\n", "supports = ", supports, "\n", "saves = ", saves, "\n", "force = ", force, "\n", "reserved = ", reserved, "\n", "depth = ", Int.toString (!depth), "\n"] val _ = print msg in print "Raising Spill in chooseRegister\n"; raise Spill end | register::_ => register val values = valuesRegister {register = register, registerAllocation = registerAllocation} val coincide_values = List.revKeepAll(values, fn {register = register',...} => Register.coincide(register',register)) in {register = register, coincide_values = coincide_values} end fun chooseXmmRegister {info = {futures = {pre = future, ...}, xmmhint,...}: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: XmmRegister.t list, registerAllocation as {xmmreserved,...}: t} : {register: XmmRegister.t, coincide_values: xmmvalue list} = let val registers = potentialXmmRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} val saved = savedXmmRegisters {saves = saves, registerAllocation = registerAllocation} val preserved = let fun doit(registers, preserved) = List.fold (registers, preserved, fn (register,preserved) => if List.contains(preserved, register, XmmRegister.eq) then preserved else register::preserved) in doit(saved, doit(xmmreserved, [])) end val registers = List.revRemoveAll (registers, fn register' => List.exists (preserved, fn register'' => XmmRegister.coincide(register',register''))) val supported = supportedXmmRegisters {supports = supports, registerAllocation = registerAllocation} val values = xmmvalueFilter {filter = fn _ => true, registerAllocation = registerAllocation} val memlocs = List.revMap(values, #memloc) val registers_costs = List.revMap (registers, fn register' => let val hint_cost = List.fold (xmmhint, 0, fn ((hint_register,hint_memlocs,hint_ignore), hint_cost) => if XmmRegister.eq(register', hint_register) then case memloc of SOME memloc => (case (List.contains (hint_memlocs, memloc, MemLoc.eq), MemLocSet.contains (hint_ignore, memloc)) of (true, _) => hint_cost + 5 | (false, true) => hint_cost | (false, false) => hint_cost - 5) | NONE => hint_cost - 5 else if XmmRegister.coincide(register', hint_register) then hint_cost - 5 else hint_cost) val values = xmmvaluesXmmRegister {register = register', registerAllocation = registerAllocation} val (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost) = List.fold (values, (false,false,NONE,0,true,0), fn ({register,memloc,weight,sync,commit,...}, cost as (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost)) => if XmmRegister.coincide(register,register') then let val support_cost' = List.contains(supported, register, XmmRegister.eq) val commit_cost' = case commit of TRYREMOVE _ => false | REMOVE _ => false | _ => true val future_cost' = List.index (future, fn Liveness.M (tag, memloc') => let val eq = MemLoc.eq(memloc, memloc') in case tag of Liveness.FLIVE => eq | Liveness.FUSE => eq | Liveness.FUSEDEF => eq | _ => false end | _ => false) val utilized_cost' = List.fold (memlocs, 0, fn (memloc',uc') => List.fold (MemLoc.utilized memloc', 0, fn (memloc'',uc'') => if MemLoc.eq (memloc, memloc'') then uc'' + 1 else uc'') + uc') val sync_cost' = sync val weight_cost' = weight in (support_cost orelse support_cost', commit_cost orelse commit_cost', case (future_cost,future_cost') of (_, NONE) => future_cost | (NONE, _) => future_cost' | (SOME f,SOME f') => SOME (Int.min(f,f')), utilized_cost + utilized_cost', sync_cost andalso sync_cost', weight_cost + weight_cost') end else cost) in (register', (support_cost, commit_cost, future_cost, hint_cost, utilized_cost, sync_cost, weight_cost)) end) val registers_costs_sorted = List.insertionSort (registers_costs, fn ((_,(support_c1, commit_c1, future_c1, hint_c1, utilized_c1, sync_c1, weight_c1)), (_,(support_c2, commit_c2, future_c2, hint_c2, utilized_c2, sync_c2, weight_c2))) => bool_lt(support_c1,support_c2) orelse (support_c1 = support_c2 andalso (bool_lt(commit_c1,commit_c2) orelse (commit_c1 = commit_c2 andalso (option_lt (op >) (future_c1, future_c2) orelse (future_c1 = future_c2 andalso (hint_c1 > hint_c2 orelse (hint_c1 = hint_c2 andalso (utilized_c1 < utilized_c2 orelse (utilized_c1 = utilized_c2 andalso (bool_gt(sync_c1,sync_c2) orelse (sync_c1 = sync_c2 andalso weight_c1 < weight_c2)))))))))))) val registers = List.map(registers_costs_sorted, #1) val register = case registers of [] (* => raise Spill *) => let fun listToString(ss: string list): string = "[" ^ (concat(List.separate(ss, ", "))) ^ "]" val size = Size.toString size val supports = listToString(List.map(supports,Operand.toString)) val saves = listToString(List.map(saves,Operand.toString)) val force = listToString(List.map(force,XmmRegister.toString)) val xmmreserved = listToString(List.map(xmmreserved,XmmRegister.toString)) val msg = concat["\n", "chooseXmmRegister:\n", (toString registerAllocation), "size = ", size, "\n", "supports = ", supports, "\n", "saves = ", saves, "\n", "force = ", force, "\n", "xmmreserved = ", xmmreserved, "\n", "depth = ", Int.toString (!depth), "\n"] val _ = print msg in print "Raising Spill in chooseXmmRegister\n"; raise Spill end | register::_ => register val values = xmmvaluesXmmRegister {register = register, registerAllocation = registerAllocation} val coincide_values = List.revKeepAll(values, fn {register = register',...} => XmmRegister.coincide(register',register)) in {register = register, coincide_values = coincide_values} end fun freeRegister ({info: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t}) : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, coincide_values} = chooseRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val supported = supportedMemLocs {supports = supports, registerAllocation = registerAllocation} fun supportRemove memloc = let fun supportRemove' memlocs = List.concatMap (memlocs, fn memloc' => if MemLoc.eq(memloc,memloc') then [] else supportRemove' (MemLoc.utilized memloc')) in List.fold (supports, [], fn (Operand.MemLoc memloc', supports) => List.concat [(supportRemove' [memloc']), supports] | (_, supports) => supports) end val {assembly = assembly_support, registerAllocation} = List.fold (coincide_values, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc,...}, {assembly, registerAllocation}) => if List.contains(supported, memloc, MemLoc.eq) then let val supports = supportRemove memloc val force = List.revRemoveAll (Register.registers (MemLoc.size memloc), fn register' => Register.coincide(final_register, register')) val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = (Operand.register final_register)::saves, force = force, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end else {assembly = assembly, registerAllocation = registerAllocation}) val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if Register.coincide(register, final_register) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val _ = Int.dec depth in {register = final_register, assembly = AppendList.appends [assembly_support, assembly_commit], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "freeRegister", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = freeRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and freeXmmRegister ({info: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: XmmRegister.t list, registerAllocation: t}) : {register: XmmRegister.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, coincide_values} = chooseXmmRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val supported = supportedMemLocs {supports = supports, registerAllocation = registerAllocation} fun supportRemove memloc = let fun supportRemove' memlocs = List.concatMap (memlocs, fn memloc' => if MemLoc.eq(memloc,memloc') then [] else supportRemove' (MemLoc.utilized memloc')) in List.fold (supports, [], fn (Operand.MemLoc memloc', supports) => List.concat [(supportRemove' [memloc']), supports] | (_, supports) => supports) end val {assembly = assembly_support, registerAllocation} = List.fold (coincide_values, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc,...}, {assembly, registerAllocation}) => if List.contains(supported, memloc, MemLoc.eq) then let val supports = supportRemove memloc val force = List.revRemoveAll (XmmRegister.registers (MemLoc.size memloc), fn register' => XmmRegister.coincide(final_register, register')) val {assembly = assembly_register, registerAllocation, ...} = toXmmRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = (Operand.xmmregister final_register)::saves, force = force, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end else {assembly = assembly, registerAllocation = registerAllocation}) val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, ...} => if XmmRegister.coincide(register, final_register) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitXmmRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val _ = Int.dec depth in {register = final_register, assembly = AppendList.appends [assembly_support, assembly_commit], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "freeXmmRegister", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = freeXmmRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and commitRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation as {reserved,...}: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val commit_values = valueFilter {filter = fn {commit = COMMIT 0, ...} => true | {commit = REMOVE 0, ...} => true | {commit = TRYCOMMIT 0, ...} => true | {commit = TRYREMOVE 0, ...} => true | _ => false, registerAllocation = registerAllocation} val commit_memlocs = List.revMap(commit_values, #memloc) val commit_memlocs = totalOrder (commit_memlocs, fn (memloc1,memloc2) => List.contains(MemLoc.utilized memloc1, memloc2, MemLoc.eq)) val {assembly = assembly_commit, registerAllocation} = List.fold (commit_memlocs, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (memloc, {assembly, registerAllocation}) => (case allocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => {assembly = assembly, registerAllocation = registerAllocation} | SOME ({register, memloc, weight, sync, commit}) => let fun doCommitFalse () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = commitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.register register)::saves, Operand.eq) val size = Register.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = commitPop {registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.Address address, src = Operand.Register register, size = size})], registerAllocation = registerAllocation} end fun doCommitTrue () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end fun doRemoveFalse () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = commitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.register register)::saves, Operand.eq) val size = Register.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = commitPop {registerAllocation = registerAllocation} val registerAllocation = if List.contains (reserved, register, Register.eq) then registerAllocation else remove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.Address address, src = Operand.Register register, size = size})], registerAllocation = registerAllocation} end fun doRemoveTrue () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = if List.contains (reserved, register, Register.eq) then registerAllocation else remove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end in case (commit,sync) of (COMMIT 0, false) => doCommitFalse () | (COMMIT 0, true) => doCommitTrue () | (REMOVE 0, false) => doRemoveFalse () | (REMOVE 0, true) => doRemoveTrue () | (TRYCOMMIT 0, false) => doCommitFalse () | (TRYCOMMIT 0, true) => doCommitTrue () | (TRYREMOVE 0, false) => doRemoveFalse () | (TRYREMOVE 0, true) => doRemoveTrue () | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.commitRegisters" end)) val _ = Int.dec depth in {assembly = assembly_commit, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "commitRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and commitXmmRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation as {xmmreserved,...}: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val commit_values = xmmvalueFilter {filter = fn {commit = COMMIT 0, ...} => true | {commit = REMOVE 0, ...} => true | {commit = TRYCOMMIT 0, ...} => true | {commit = TRYREMOVE 0, ...} => true | _ => false, registerAllocation = registerAllocation} val commit_memlocs = List.revMap(commit_values, #memloc) val commit_memlocs = totalOrder (commit_memlocs, fn (memloc1,memloc2) => List.contains(MemLoc.utilized memloc1, memloc2, MemLoc.eq)) val {assembly = assembly_commit, registerAllocation} = List.fold (commit_memlocs, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (memloc, {assembly, registerAllocation}) => (case xmmallocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => {assembly = assembly, registerAllocation = registerAllocation} | SOME ({register, memloc, weight, sync, commit}) => let fun doCommitFalse () = let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = xmmcommitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.xmmregister register)::saves, Operand.eq) val size = XmmRegister.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = xmmcommitPop {registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_sse_movs {dst = Operand.Address address, src = Operand.XmmRegister register, size = size})], registerAllocation = registerAllocation} end fun doCommitTrue () = let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end fun doRemoveFalse () = let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = xmmcommitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.xmmregister register)::saves, Operand.eq) val size = XmmRegister.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = xmmcommitPop {registerAllocation = registerAllocation} val registerAllocation = if List.contains (xmmreserved, register, XmmRegister.eq) then registerAllocation else xmmremove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_sse_movs {dst = Operand.Address address, src = Operand.XmmRegister register, size = size})], registerAllocation = registerAllocation} end fun doRemoveTrue () = let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = if List.contains (xmmreserved, register, XmmRegister.eq) then registerAllocation else xmmremove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end in case (commit,sync) of (COMMIT 0, false) => doCommitFalse () | (COMMIT 0, true) => doCommitTrue () | (REMOVE 0, false) => doRemoveFalse () | (REMOVE 0, true) => doRemoveTrue () | (TRYCOMMIT 0, false) => doCommitFalse () | (TRYCOMMIT 0, true) => doCommitTrue () | (TRYREMOVE 0, false) => doRemoveFalse () | (TRYREMOVE 0, true) => doRemoveTrue () | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.commitXmmRegisters" end)) val _ = Int.dec depth in {assembly = assembly_commit, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "commitXmmRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, registerAllocation} = commitXmmRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and spillRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val spillStart = !spill val {reserved, ...} = registerAllocation val {assembly = assembly_unreserve, registerAllocation} = List.fold (reserved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val saved = savedRegisters {saves = saves, registerAllocation = registerAllocation} val saved = List.fold (reserved, saved, fn (register,saved) => if List.contains(saved,register,Register.eq) then saved else register::saved) val saves = valueFilter {filter = fn {register, ...} => List.contains(saved, register, Register.eq), registerAllocation = registerAllocation} val all = valueFilter {filter = fn _ => true, registerAllocation = registerAllocation} (* partition the values in the register file * by their base register. *) val groups = partition (all, fn ({register = Register.T {reg = reg1, ...},...}, {register = Register.T {reg = reg2, ...},...}) => reg1 = reg2) (* order the groups by number of registers used *) val groups = List.insertionSort (groups, fn (g1,g2) => (List.length g1) < (List.length g2)) (* choose four registers to spill *) val spills = case groups of g1::g2::g3::g4::_ => List.concat [g1,g2,g3,g4] | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.spillRegisters" (* totally order the spills by utilization *) val spills = totalOrder (spills, fn ({memloc = memloc1, ...}, {memloc = memloc2, ...}) => List.contains(MemLoc.utilized memloc2, memloc1, MemLoc.eq)) fun mkReplacer (spillMap : (value * MemLoc.t) list) = fn memloc' => case List.peek(spillMap, fn ({memloc,...},_) => MemLoc.eq(memloc,memloc')) of SOME (_,spillMemloc) => spillMemloc | NONE => memloc' (* associate each spilled value with a spill slot *) val (spillMap, spillEnd) = List.fold (spills, ([], spillStart), fn (value as {memloc, ...}, (spillMap, spillEnd)) => let val spillMemLoc = MemLoc.imm {base = Immediate.label spillLabel, index = Immediate.int spillEnd, scale = amd64MLton.wordScale, size = MemLoc.size memloc, class = amd64MLton.Classes.Temp} in ((value,spillMemLoc)::spillMap, spillEnd + 1) end) val replacer = mkReplacer spillMap (* commit everything in the register file; * also replace all memlocs that are spilled with their spill slot *) val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => if List.exists (spillMap, fn ({memloc = memloc',...},_) => MemLoc.eq(memloc,memloc')) then {register = register, memloc = MemLoc.replace replacer memloc, weight = weight, sync = false, commit = NO} else {register = register, memloc = MemLoc.replace replacer memloc, weight = weight, sync = sync, commit = case commit of NO => COMMIT 0 | COMMIT _ => COMMIT 0 | TRYCOMMIT _ => COMMIT 0 | REMOVE _ => REMOVE 0 | TRYREMOVE _ => REMOVE 0}, registerAllocation = registerAllocation} (* update next available spill slot for cascading spills *) val _ = spill := spillEnd (* commit everything; * since the spilt memlocs look like they are spill slots, * they can all be committed to memory without any additional * registers. *) val {assembly = assembly_commit1, registerAllocation = registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} (* unspill; as we pull values in, we update the memloc to what it * looks under the pending unspills, and then replace any occurences * of the spill slot with the updated memloc; * by the time we are done, everything should be mapped back to * its original form. *) val {assembly = assembly_unspill, registerAllocation = registerAllocation} = let val rec doit = fn ([],{assembly,registerAllocation}) => {assembly = assembly, registerAllocation = registerAllocation} | (({memloc, weight, sync, commit, ...}, spillMemLoc)::spillMap, {assembly, registerAllocation}) => let val replacer = mkReplacer spillMap val memloc' = MemLoc.replace replacer memloc val {register, assembly = assembly_unspill, registerAllocation} = toRegisterMemLoc {memloc = spillMemLoc, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc', weight = weight, sync = sync, commit = case commit of NO => COMMIT 0 | COMMIT _ => COMMIT 0 | TRYCOMMIT _ => COMMIT 0 | REMOVE _ => REMOVE 0 | TRYREMOVE _ => REMOVE 0}, registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => {register = register, memloc = MemLoc.replace (fn memloc'' => if MemLoc.eq (memloc'', spillMemLoc) then memloc' else memloc'') memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in doit(spillMap, {assembly = AppendList.append (assembly, assembly_unspill), registerAllocation = registerAllocation}) end in doit(spillMap, {assembly = AppendList.empty, registerAllocation = registerAllocation}) end (* everything is unspilled *) val _ = spill := spillStart (* commit all the memlocs that got spilled. *) val {assembly = assembly_commit2, registerAllocation = registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val _ = spill := spillStart (* restore the saved operands to their previous locations. *) val {assembly = assembly_restore, registerAllocation} = List.fold (saves, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, commit, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = memloc, info = info, size = Register.size register, move = true, supports = supports, saves = [], force = [register], registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_register, assembly_reserve], registerAllocation = registerAllocation} end) val {assembly = assembly_unreserve', registerAllocation} = List.fold (saved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve', registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve'), registerAllocation = registerAllocation} end) val {assembly = assembly_reserve, registerAllocation} = List.fold (reserved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val _ = Int.dec depth in {assembly = AppendList.appends [assembly_unreserve, assembly_commit1, assembly_unspill, assembly_commit2, assembly_restore, assembly_unreserve', assembly_reserve], registerAllocation = registerAllocation} end and toRegisterMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (case allocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register,memloc,weight,sync,commit} => let val registers = potentialRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} in if List.contains(registers, register, Register.eq) then {register = register, assembly = AppendList.empty, registerAllocation = registerAllocation} else let val {register = final_register, coincide_values} = chooseRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val {memloc, sync, registerAllocation} = if List.contains(saves, Operand.register final_register, Operand.eq) orelse List.contains(saves, Operand.memloc memloc, Operand.eq) then {memloc = MemLoc.imm {base = Immediate.label (Label.fromString "BUG"), index = Immediate.zero, scale = Scale.One, size = MemLoc.size memloc, class = MemLoc.Class.Temp}, sync = true, registerAllocation = registerAllocation} else {memloc = memloc, sync = sync, registerAllocation = delete {register = register, registerAllocation = registerAllocation}} in case coincide_values of [] => if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.empty, registerAllocation = registerAllocation} end | [{register = register', memloc = memloc', weight = weight', sync = sync', commit = commit'}] => if Register.eq(register',final_register) then let val registerAllocation = delete {register = register', registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc', weight = weight', sync = sync', commit = commit'}, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_xchg {src = Operand.register register, dst = Operand.register final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.register final_register, dst = Operand.register register, size = size}), registerAllocation = registerAllocation} end end else let val {register = final_register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end | _ => let val {register = final_register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end end end | NONE => if move then case MemLoc.size memloc of Size.BYTE => let val {register = register', assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = (Operand.memloc memloc):: supports, saves = saves, force = [], registerAllocation = registerAllocation} val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = (Operand.register register'):: saves, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_register, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.register register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end | _ => let val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val saves' = case address of Address.T {base = SOME base', index = SOME index', ...} => (Operand.register base'):: (Operand.register index')::saves | Address.T {base = SOME base', ...} => (Operand.register base')::saves | Address.T {index = SOME index', ...} => (Operand.register index')::saves | _ => saves val {register = register', assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves', force = [], registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_address, assembly_register, AppendList.single (Assembly.instruction_mov {dst = Operand.register register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end else let val {register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} in {register = register, assembly = assembly_register, registerAllocation = registerAllocation} end) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toRegisterMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toXmmRegisterMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: XmmRegister.t list, registerAllocation: t} : {register: XmmRegister.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (case xmmallocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register,memloc,weight,sync,commit} => let val registers = potentialXmmRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} in if List.contains(registers, register, XmmRegister.eq) then {register = register, assembly = AppendList.empty, registerAllocation = registerAllocation} else let val {register = final_register, coincide_values} = chooseXmmRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.xmmregister register)::saves, force = force, registerAllocation = registerAllocation} val {memloc, sync, registerAllocation} = if List.contains(saves, Operand.xmmregister final_register, Operand.eq) orelse List.contains(saves, Operand.memloc memloc, Operand.eq) then {memloc = MemLoc.imm {base = Immediate.label (Label.fromString "BUG"), index = Immediate.zero, scale = Scale.One, size = MemLoc.size memloc, class = MemLoc.Class.Temp}, sync = true, registerAllocation = registerAllocation} else {memloc = memloc, sync = sync, registerAllocation = xmmdelete {register = register, registerAllocation = registerAllocation}} in case coincide_values of [] => if move then let val registerAllocation = xmmupdate {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_sse_movs {src = Operand.xmmregister register, dst = Operand.xmmregister final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = xmmupdate {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.empty, registerAllocation = registerAllocation} end | _ => let val {register = final_register, assembly = assembly_register, registerAllocation} = freeXmmRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.xmmregister register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = xmmremove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = xmmupdate {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_sse_movs {src = Operand.xmmregister register, dst = Operand.xmmregister final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = xmmupdate {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end end end | NONE => if move then let val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val saves' = case address of Address.T {base = SOME base', index = SOME index', ...} => (Operand.register base'):: (Operand.register index')::saves | Address.T {base = SOME base', ...} => (Operand.register base')::saves | Address.T {index = SOME index', ...} => (Operand.register index')::saves | _ => saves val {register = register', assembly = assembly_register, registerAllocation} = freeXmmRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves', force = [], registerAllocation = registerAllocation} val registerAllocation = xmmremove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = xmmupdate {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toXmmRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_address, assembly_register, AppendList.single (Assembly.instruction_sse_movs {dst = Operand.xmmregister register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end else let val {register, assembly = assembly_register, registerAllocation} = freeXmmRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val registerAllocation = xmmremove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} in {register = register, assembly = assembly_register, registerAllocation = registerAllocation} end) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toXmmRegisterMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toXmmRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toAddressMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {address: Address.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (let val MemLoc.U {immBase, memBase, immIndex, memIndex, scale, ...} = MemLoc.destruct memloc (* Whenever possible, find labels with RIP-relative addressing. * It's smaller code and faster even for position dependent code. * However, RIP-relative addressing cannot be used with an index * register. For PIC code we will thus break the access down * into a leal for the symbol and a toRegister for the memIndex. *) (* Combine all immediate offsets into one *) val disp = case (immBase, immIndex) of (NONE, NONE) => Immediate.zero | (SOME immBase, NONE) => immBase | (NONE, SOME immIndex) => (case Immediate.destruct immIndex of Immediate.Word _ => immIndex | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.toAddressMemLoc:indexLabel") | (SOME immBase, SOME immIndex) => (case (Immediate.destruct immBase, Immediate.destruct immIndex) of (Immediate.Label l1, Immediate.Word w2) => Immediate.labelPlusWord (l1, w2) | (Immediate.LabelPlusWord (l1, w1), Immediate.Word w2) => Immediate.labelPlusWord (l1, WordX.add (w1, w2)) | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.toAddressMemLoc:disp") (* The base register gets supplied by three distinct cases: * 1 - memBase (which means that there is no label) * 2 - RIP (which means there is no index) * 3 - lea (which means this is PIC) * else nothing *) val {disp, register = register_base, assembly = assembly_base, registerAllocation} = case (Immediate.destruct disp, memBase, memIndex) of (Immediate.Word _, NONE, _) => {disp = SOME disp, register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} | (Immediate.Word _, SOME memBase, _) (* no label, no rip *) => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memBase, info = info, size = MemLoc.size memBase, move = true, supports = case memIndex of NONE => supports | SOME memIndex => (Operand.memloc memIndex):: supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in {disp = SOME disp, register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end | (_, SOME _, _) (* label & memBase? bad input *) => Error.bug "amd64AllocateRegisters.RegisterAllocation.toAddressMemLoc:base*2" | (_, NONE, NONE) (* no index => safe to use RIP-relative *) => {disp = SOME disp, register = SOME Register.rip, assembly = AppendList.empty, registerAllocation = registerAllocation} | (_, NONE, SOME memIndex) (* label + index => use lea if PIC *) => if !Control.positionIndependent = false then {disp = SOME disp, register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} else let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = disp, info = info, size = MemLoc.size memIndex, supports = Operand.memloc memIndex :: supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in { disp = NONE, register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end val {register = register_index, assembly = assembly_index, registerAllocation} = case memIndex of NONE => {register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} | SOME memIndex => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memIndex, info = info, size = MemLoc.size memIndex, move = true, supports = supports, saves = case (memBase, register_base) of (NONE, NONE) => saves | (NONE, SOME register_base) => if register_base = Register.rip then saves else Operand.register register_base :: saves | (SOME memBase, SOME register_base) => (Operand.memloc memBase):: (Operand.register register_base):: saves | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.toAddressMemLoc", force = Register.indexRegisters, registerAllocation = registerAllocation} in {register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end in {address = Address.T {disp = disp, base = register_base, index = register_index, scale = case memIndex of SOME _ => SOME scale | NONE => NONE}, assembly = AppendList.append (assembly_base, assembly_index), registerAllocation = registerAllocation} end) (* (case MemLoc.destruct memloc of MemLoc.U {base = MemLoc.Imm base, index = MemLoc.Imm index, scale, size, ...} => let val disp' = if Immediate.eq(index, Immediate.const_int 0) then NONE else SOME (Immediate.binexp {oper = Immediate.Multiplication, exp1 = index, exp2 = Scale.toImmediate scale}) val disp = case disp' of NONE => SOME base | SOME disp' => SOME (Immediate.binexp {oper = Immediate.Addition, exp1 = base, exp2 = disp'}) in {address = Address.T {disp = disp, base = NONE, index = NONE, scale = NONE}, assembly = AppendList.empty, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Imm base, index = MemLoc.Mem index, scale, size, ...} => let val disp = SOME base val {register = register_index, assembly = assembly_index, registerAllocation} = toRegisterMemLoc {memloc = index, info = info, size = MemLoc.size index, move = true, supports = supports, saves = saves, force = Register.indexRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = disp, base = NONE, index = SOME register_index, scale = SOME scale}, assembly = assembly_index, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Mem base, index = MemLoc.Imm index, scale, size, ...} => let val disp = if Immediate.eq(index, Immediate.const_int 0) then NONE else SOME (Immediate.binexp {oper = Immediate.Multiplication, exp1 = index, exp2 = Scale.toImmediate scale}) val {register = register_base, assembly = assembly_base, registerAllocation} = toRegisterMemLoc {memloc = base, info = info, size = MemLoc.size base, move = true, supports = supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = disp, base = SOME register_base, index = NONE, scale = NONE}, assembly = assembly_base, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Mem base, index = MemLoc.Mem index, scale, size, ...} => let val {register = register_base, assembly = assembly_base, registerAllocation} = toRegisterMemLoc {memloc = base, info = info, size = MemLoc.size base, move = true, supports = (Operand.memloc index)::supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} val {register = register_index, assembly = assembly_index, registerAllocation} = toRegisterMemLoc {memloc = index, info = info, size = MemLoc.size index, move = true, supports = supports, saves = (Operand.memloc base):: (Operand.register register_base):: saves, force = Register.indexRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = NONE, base = SOME register_base, index = SOME register_index, scale = SOME scale}, assembly = AppendList.append (assembly_base, assembly_index), registerAllocation = registerAllocation} end) *) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toAddressMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {address = address, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toRegisterImmediate {immediate: Immediate.t, info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, assembly, registerAllocation} = freeRegister {info = info, memloc = NONE, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val _ = Int.dec depth val instruction = case Immediate.destruct immediate of Immediate.Word x => if size = Size.QUAD andalso WordX.equals (x, WordX.resize (WordX.resize (x, WordSize.word32), WordSize.word64)) then (* use the implicit zero-extend of 32 bit ops *) Assembly.instruction_mov {dst = Operand.Register (Register.lowPartOf (final_register, Size.LONG)), src = Operand.immediate_word (WordX.resize (x, WordSize.word32)), size = Size.LONG} else Assembly.instruction_mov {dst = Operand.Register final_register, src = Operand.Immediate immediate, size = size} | _ => Assembly.instruction_lea {dst = Operand.Register final_register, src = Operand.Address (Address.T { disp = SOME immediate, base = SOME Register.rip, index = NONE, scale = NONE }), size = size} in {register = final_register, assembly = AppendList.appends [assembly, AppendList.single instruction], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toRegisterImmediate", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = immediate, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} fun pre {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list, info as {dead, remove, ...}: Liveness.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val ra = registerAllocation val dead_memlocs = dead val remove_memlocs = remove val (allUses, allDefs, allKills) = let fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand,set) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(set, memloc) | NONE => set) val uses = doit uses val defs = doit defs val kills = doit kills fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) val allUses = doit'(uses, doit'(defs, uses)) val allDefs = defs val allKills = kills in (allUses, allDefs, allKills) end val allDest = MemLocSet.unions [allDefs, allKills, dead_memlocs, remove_memlocs] val allKeep = MemLocSet.unions [allUses, allDefs, allKills] val registerAllocation = xmmvalueMap {map = fn {register, memloc, weight, sync, commit} => let val must_commit0 = (MemLocSet.exists (allDefs, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit1 = (MemLocSet.exists (allUses, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit2 = (List.exists (MemLoc.utilized memloc, fn memloc => MemLocSet.contains (allDest, memloc))) val must_commit3 = (MemLocSet.contains (MemLocSet.-(allKills, dead_memlocs), memloc)) val sync = if volatile memloc then true else sync val commit = if volatile memloc then REMOVE 0 else if must_commit3 then COMMIT 0 else if must_commit2 then if MemLocSet.contains (allKeep, memloc) then COMMIT 0 else REMOVE 0 else if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit in {register = register, memloc = memloc, weight = weight, sync = sync, commit = commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => let val must_commit0 = (MemLocSet.exists (allDefs, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit1 = (MemLocSet.exists (allUses, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit2 = (List.exists (MemLoc.utilized memloc, fn memloc => MemLocSet.contains (allDest, memloc))) val must_commit3 = (MemLocSet.contains (MemLocSet.-(allKills, dead_memlocs), memloc)) val sync = if volatile memloc then true else sync val commit = if volatile memloc then REMOVE 0 else if MemLocSet.contains(allDefs, memloc) then if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit else if must_commit3 then COMMIT 0 else if must_commit2 then if MemLocSet.contains (allKeep, memloc) then COMMIT 0 else REMOVE 0 else if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit in {register = register, memloc = memloc, weight = weight, sync = sync, commit = commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [if !Control.Native.commented > 3 then AppendList.cons ((Assembly.comment "pre begin:"), (toComments ra)) else AppendList.empty, assembly_commit_xmmregisters, assembly_commit_registers, if !Control.Native.commented > 3 then AppendList.cons ((Assembly.comment "pre end:"), (toComments registerAllocation)) else AppendList.empty], registerAllocation = registerAllocation} end val (pre, pre_msg) = tracer "pre" pre fun post {uses: Operand.t list, final_uses: Operand.t list, defs: Operand.t list, final_defs: Operand.t list, kills: Operand.t list, info as {dead, commit, remove, ...}: Liveness.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val ra = registerAllocation val (final_uses_registers, final_defs_registers, final_uses_xmmregisters, final_defs_xmmregisters) = let fun doit(operands, (final_registers, final_xmmregisters)) = List.fold (operands, (final_registers, final_xmmregisters), fn (operand, (final_registers, final_xmmregisters)) => case (Operand.deRegister operand, Operand.deXmmregister operand) of (SOME register, _) => if List.contains(final_registers, register, Register.eq) then (final_registers, final_xmmregisters) else (register::final_registers, final_xmmregisters) | (_, SOME register) => if List.contains(final_xmmregisters, register, XmmRegister.eq) then (final_registers, final_xmmregisters) else (final_registers, register::final_xmmregisters) | _ => (final_registers, final_xmmregisters)) val (final_uses_registers, final_uses_xmmregisters) = doit(final_uses, ([], [])) val (final_defs_registers, final_defs_xmmregisters) = doit(final_defs, ([], [])) in (final_uses_registers, final_defs_registers, final_uses_xmmregisters, final_defs_xmmregisters) end val dead_memlocs = dead val commit_memlocs = commit val remove_memlocs = remove val (_, allDefs, allKills) = let fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand,set) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(set, memloc) | NONE => set) val uses = doit uses val defs = doit defs val kills = doit kills fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) val allUses = doit'(uses, doit'(defs, uses)) val allDefs = defs val allKills = kills in (allUses, allDefs, allKills) end val allDest = MemLocSet.unions [allDefs, allKills, dead_memlocs, remove_memlocs] val registerAllocation = xmmvalueMap {map = fn {register, memloc, weight, sync, commit} => if volatile memloc then let val isDst = List.contains (final_defs_xmmregisters, register, XmmRegister.eq) val isDef = isDst in {register = register, memloc = memloc, sync = sync andalso (not isDef), weight = weight - 500, commit = REMOVE 0} end else if MemLocSet.contains (dead_memlocs, memloc) then {register = register, memloc = memloc, sync = true, weight = weight - 500, commit = TRYREMOVE 0} else let val isSrc = List.contains (final_uses_xmmregisters, register, XmmRegister.eq) val isDst = List.contains (final_defs_xmmregisters, register, XmmRegister.eq) val isDef = isDst in {register = register, memloc = memloc, weight = weight - 5 + (if isSrc then 5 else 0) + (if isDst then 10 else 0), sync = sync andalso (not isDef), commit = if List.exists (MemLoc.utilized memloc, fn memloc' => MemLocSet.contains (allDest, memloc')) then REMOVE 0 else if MemLocSet.contains (remove_memlocs, memloc) then TRYREMOVE 0 else if MemLocSet.contains (commit_memlocs, memloc) then TRYCOMMIT 0 else commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, commit} => if volatile memloc then let val isDst = List.contains (final_defs_registers, register, Register.eq) val isDef = isDst in {register = register, memloc = memloc, sync = sync andalso (not isDef), weight = weight - 500, commit = REMOVE 0} end else if MemLocSet.contains (dead_memlocs, memloc) then value else let val isSrc = List.contains (final_uses_registers, register, Register.eq) val isDst = List.contains (final_defs_registers, register, Register.eq) val isDef = isDst in {register = register, memloc = memloc, weight = weight - 5 + (if isSrc then 5 else 0) + (if isDst then 10 else 0), sync = sync andalso (not isDef), commit = if List.exists (MemLoc.utilized memloc, fn memloc' => MemLocSet.contains (allDest, memloc')) then REMOVE 0 else if MemLocSet.contains (remove_memlocs, memloc) then TRYREMOVE 0 else if MemLocSet.contains (commit_memlocs, memloc) then TRYCOMMIT 0 else commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, ...} => if MemLocSet.contains (dead_memlocs, memloc) then {register = register, memloc = memloc, sync = true, weight = weight, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_dead_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [if !Control.Native.commented > 3 then AppendList.cons ((Assembly.comment "post begin:"), (toComments ra)) else AppendList.empty, assembly_commit_xmmregisters, assembly_commit_registers, assembly_dead_registers, if !Control.Native.commented > 3 then AppendList.cons ((Assembly.comment "post end:"), (toComments registerAllocation)) else AppendList.empty], registerAllocation = registerAllocation} end val (post, post_msg) = tracer "post" post fun allocateOperand {operand: Operand.t, options = {register: bool, immediate: WordSize.t option, label: bool, address: bool}, info as {dead, remove, ...}: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {operand: Operand.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = case operand of Operand.Immediate i => if Option.isSome immediate andalso (case Immediate.destruct i of Immediate.Word w => let val dstSize = Option.valOf immediate val srcSize = WordX.size w in case WordSize.compare (srcSize, dstSize) of LESS => true | EQUAL => true | GREATER => WordX.equals (w, WordX.resizeX (WordX.resizeX (w, dstSize), srcSize)) end | _ => false) then {operand = operand, assembly = AppendList.empty, registerAllocation = registerAllocation} else if register then let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = i, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.register register, assembly = assembly, registerAllocation = registerAllocation} end else if address then let val address = Address.T {disp = SOME (Immediate.label (Label.fromString "raTemp1")), base = NONE, index = NONE, scale = NONE} in {operand = Operand.address address, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.immediate i, dst = Operand.address address, size = size}), registerAllocation = registerAllocation} end else Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateOperand: operand:Immediate" | Operand.Label l => if label then {operand = operand, assembly = AppendList.empty, registerAllocation = registerAllocation} else if Option.isSome immediate andalso (* FIXME: could use RIP relative with 32bit immediate. *) (let val dstSize = Option.valOf immediate in case WordSize.compare (WordSize.word64, dstSize) of LESS => true | EQUAL => true | GREATER => false end) then {operand = Operand.immediate_label l, assembly = AppendList.empty, registerAllocation = registerAllocation} else if register then let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = Immediate.label l, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.register register, assembly = assembly, registerAllocation = registerAllocation} end else Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateOperand: operand:Label" | Operand.MemLoc m => let fun toRegisterMemLoc' () = let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.Register register, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLoc' () = let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLocRemove' () = let val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if MemLoc.eq(memloc, m) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = AppendList.append (assembly_commit, assembly), registerAllocation = registerAllocation} end in if register andalso address then case allocated {memloc = m, registerAllocation = registerAllocation} of NONE => if MemLocSet.contains(dead, m) orelse MemLocSet.contains(remove, m) then toAddressMemLoc' () else toRegisterMemLoc' () | SOME _ => toRegisterMemLoc' () else if register then toRegisterMemLoc' () else if address then toAddressMemLocRemove' () else Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateOperand: operand:MemLoc" end | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateOperand: operand" val (allocateOperand, allocateOperand_msg) = tracer "allocateOperand" allocateOperand fun allocateXmmOperand {operand: Operand.t, options = {xmmregister: bool, address: bool}, info as {dead, remove, ...}: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: XmmRegister.t list, registerAllocation: t} : {operand: Operand.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = case operand of Operand.MemLoc m => let fun toXmmRegisterMemLoc' () = let val {register, assembly, registerAllocation} = toXmmRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.XmmRegister register, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLoc' () = let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLocRemove' () = let val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, ...} => if MemLoc.eq(memloc, m) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitXmmRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = AppendList.append (assembly_commit, assembly), registerAllocation = registerAllocation} end in if xmmregister andalso address then case xmmallocated {memloc = m, registerAllocation = registerAllocation} of NONE => if MemLocSet.contains(dead, m) orelse MemLocSet.contains(remove, m) then toAddressMemLoc' () else toXmmRegisterMemLoc' () | SOME _ => toXmmRegisterMemLoc' () else if xmmregister then toXmmRegisterMemLoc' () else if address then toAddressMemLocRemove' () else Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateXmmOperand: operand:MemLoc" end | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.allocateXmmOperand: operand" val (allocateXmmOperand, allocateXmmOperand_msg) = tracer "allocateXmmOperand" allocateXmmOperand (* Implementation of directives. *) fun assume {assumes : {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list, info = _, registerAllocation} = let val {assembly, registerAllocation} = List.foldr (assumes, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, sync, reserve}, {assembly, registerAllocation}) => let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = sync, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then reserve' {register = register, registerAllocation = registerAllocation} else unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun xmmassume {assumes : {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list, info = _, registerAllocation} = let val {assembly, registerAllocation} = List.foldr (assumes, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, sync, reserve}, {assembly, registerAllocation}) => let val registerAllocation = xmmupdate {value = {register = register, memloc = memloc, weight = weight, sync = sync, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then xmmreserve' {register = register, registerAllocation = registerAllocation} else xmmunreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun cache {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.revMap (caches, fn {memloc, ...} => Operand.memloc memloc) datatype u = None | Reg of Register.t | Mem of MemLoc.t fun computeEdges' {reg, registerAllocation} = List.revMap (Register.coincident' reg, fn register' => let val (from, m) = case List.peek (caches, fn {register, ...} => Register.eq(register, register')) of NONE => (None, NONE) | SOME {memloc, ...} => (case allocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => (Mem memloc, SOME memloc) | SOME {register, ...} => (Reg register, SOME memloc)) val to = case valueRegister {register = register', registerAllocation = registerAllocation} of NONE => None | SOME {memloc = memloc', ...} => (case List.peek (caches, fn {memloc, ...} => MemLoc.eq(memloc, memloc')) of NONE => None | SOME {register, ...} => Reg register) in (from, m, register', to) end) fun computeEdges {registerAllocation} = List.revMap (Register.allReg, fn reg => (reg, computeEdges' {reg = reg, registerAllocation = registerAllocation})) fun doitSelf {edges, saves, assembly, registerAllocation} = let val {yes = self, no = edges} = List.partition (edges, fn (_, edges') => List.forall (edges', fn (Reg rf, _, r, Reg rt) => Register.eq(rf, r) andalso Register.eq(r, rt) | _ => false)) in if not (List.isEmpty self) then let val saves_self = List.fold (self, [], fn ((_, edges'), saves) => List.fold (edges', saves, fn ((_,_,r,_), saves) => (Operand.register r)::saves)) in doit {edges = edges, saves = saves_self @ saves, assembly = assembly, registerAllocation = registerAllocation} end else doitEasy {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitEasy {edges, saves, assembly, registerAllocation} = let val {easy} = List.fold (edges, {easy = NONE}, fn ((_, edges'), {easy = NONE}) => let val {easy} = List.fold (edges', {easy = NONE}, fn ((Reg _, SOME m, r, None), {easy = NONE}) => {easy = SOME (m, r)} | (_, {easy}) => {easy = easy}) in {easy = easy} end | ((_, _), {easy}) => {easy = easy}) in case easy of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitHard {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitHard {edges, saves, assembly, registerAllocation} = let val {hard} = List.fold (edges, {hard = NONE}, fn ((_, edges'), {hard = NONE}) => let val {hard} = List.fold (edges', {hard = NONE}, fn ((Mem _, SOME m, r, None), {hard = NONE}) => {hard = SOME (m, r)} | (_, {hard}) => {hard = hard}) in {hard = hard} end | ((_, _), {hard}) => {hard = hard}) in case hard of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitCycle {edges, saves, assembly, registerAllocation = registerAllocation} = let val {cycle} = List.fold (edges, {cycle = NONE}, fn ((_, edges'), {cycle = NONE}) => let val {cycle} = List.fold (edges', {cycle = NONE}, fn ((Reg _, SOME m, r, Reg _), {cycle = NONE}) => {cycle = SOME (m, r)} | (_, {cycle}) => {cycle = cycle}) in {cycle = cycle} end | ((_, _), {cycle}) => {cycle = cycle}) in case cycle of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doit {edges, saves, assembly, registerAllocation} = let val edges = List.fold (edges, [], fn ((reg, edges'), edges) => let val edges' = List.revRemoveAll (edges', fn (None, _, _, None) => true | _ => false) in if List.isEmpty edges' then edges else (reg, edges')::edges end) in if List.isEmpty edges then {assembly = assembly, registerAllocation = registerAllocation} else doitSelf {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end val {assembly = assembly_force, registerAllocation} = doit {edges = computeEdges {registerAllocation = registerAllocation}, saves = [], assembly = AppendList.empty, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = reserve {registers = List.revKeepAllMap (caches, fn {register, reserve, ...} => if reserve then SOME register else NONE), registerAllocation = registerAllocation} in {assembly = AppendList.append(assembly_force, assembly_reserve), registerAllocation = registerAllocation} end (* fun xmmcache {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.revMap (caches, fn {memloc, ...} => Operand.memloc memloc) datatype u = None | XmmReg of XmmRegister.t | Mem of MemLoc.t fun computeEdges' {reg, registerAllocation} = List.revMap (XmmRegister.coincident' reg, fn register' => let val (from, m) = case List.peek (caches, fn {register, ...} => XmmRegister.eq(register, register')) of NONE => (None, NONE) | SOME {memloc, ...} => (case xmmallocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => (Mem memloc, SOME memloc) | SOME {register, ...} => (XmmReg register, SOME memloc)) val to = case xmmvalueRegister {register = register', registerAllocation = registerAllocation} of NONE => None | SOME {memloc = memloc', ...} => (case List.peek (caches, fn {memloc, ...} => MemLoc.eq(memloc, memloc')) of NONE => None | SOME {register, ...} => XmmReg register) in (from, m, register', to) end) fun computeEdges {registerAllocation} = List.revMap (XmmRegister.allReg, fn reg => (reg, computeEdges' {reg = reg, registerAllocation = registerAllocation})) fun doitSelf {edges, saves, assembly, registerAllocation} = let val {yes = self, no = edges} = List.partition (edges, fn (_, edges') => List.forall (edges', fn (XmmReg rf, _, r, XmmReg rt) => XmmRegister.eq(rf, r) andalso XmmRegister.eq(r, rt) | _ => false)) in if not (List.isEmpty self) then let val saves_self = List.fold (self, [], fn ((_, edges'), saves) => List.fold (edges', saves, fn ((_,_,r,_), saves) => (Operand.xmmregister r)::saves)) in doit {edges = edges, saves = saves_self @ saves, assembly = assembly, registerAllocation = registerAllocation} end else doitEasy {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitEasy {edges, saves, assembly, registerAllocation} = let val {easy} = List.fold (edges, {easy = NONE}, fn ((_, edges'), {easy = NONE}) => let val {easy} = List.fold (edges', {easy = NONE}, fn ((XmmReg _, SOME m, r, None), {easy = NONE}) => {easy = SOME (m, r)} | (_, {easy}) => {easy = easy}) in {easy = easy} end | ((_, _), {easy}) => {easy = easy}) in case easy of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toXmmRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitHard {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitHard {edges, saves, assembly, registerAllocation} = let val {hard} = List.fold (edges, {hard = NONE}, fn ((_, edges'), {hard = NONE}) => let val {hard} = List.fold (edges', {hard = NONE}, fn ((Mem _, SOME m, r, None), {hard = NONE}) => {hard = SOME (m, r)} | (_, {hard}) => {hard = hard}) in {hard = hard} end | ((_, _), {hard}) => {hard = hard}) in case hard of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toXmmRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitCycle {edges, saves, assembly, registerAllocation = registerAllocation} = let val {cycle} = List.fold (edges, {cycle = NONE}, fn ((_, edges'), {cycle = NONE}) => let val {cycle} = List.fold (edges', {cycle = NONE}, fn ((XmmReg _, SOME m, r, XmmReg _), {cycle = NONE}) => {cycle = SOME (m, r)} | (_, {cycle}) => {cycle = cycle}) in {cycle = cycle} end | ((_, _), {cycle}) => {cycle = cycle}) in case cycle of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toXmmRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doit {edges, saves, assembly, registerAllocation} = let val edges = List.fold (edges, [], fn ((reg, edges'), edges) => let val edges' = List.revRemoveAll (edges', fn (None, _, _, None) => true | _ => false) in if List.isEmpty edges' then edges else (reg, edges')::edges end) in if List.isEmpty edges then {assembly = assembly, registerAllocation = registerAllocation} else doitSelf {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end val {assembly = assembly_force, registerAllocation} = doit {edges = computeEdges {registerAllocation = registerAllocation}, saves = [], assembly = AppendList.empty, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = xmmreserve {registers = List.revKeepAllMap (caches, fn {register, reserve, ...} => if reserve then SOME register else NONE), registerAllocation = registerAllocation} in {assembly = AppendList.append(assembly_force, assembly_reserve), registerAllocation = registerAllocation} end *) fun xmmcache {caches : {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.map (caches, fn {memloc, ...} => Operand.memloc memloc) val {assembly, registerAllocation, ...} = List.foldr (caches, {assembly = AppendList.empty, registerAllocation = registerAllocation, saves = []}, fn ({register, memloc, reserve}, {assembly, registerAllocation, saves}) => let val {register, assembly = assembly_register, registerAllocation} = toXmmRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = saves, force = [register], registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then xmmreserve' {register = register, registerAllocation = registerAllocation} else {assembly = AppendList.empty, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_register, assembly_reserve], registerAllocation = registerAllocation, saves = (Operand.memloc memloc)::saves} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun reset ({...}: {registerAllocation: t}) = {assembly = AppendList.empty, registerAllocation = empty ()} fun force {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t, info: Liveness.t, registerAllocation: t} = let val toCommit = fn TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 val toRemove = fn _ => REMOVE 0 val shouldCommit = fn memloc => (MemLocSet.contains(commit_memlocs, memloc) orelse ClassSet.contains(commit_classes, MemLoc.class memloc)) val shouldRemove = fn memloc => (MemLocSet.contains(remove_memlocs, memloc) orelse ClassSet.contains(remove_classes, MemLoc.class memloc)) val shouldDead = fn memloc => (MemLocSet.contains(dead_memlocs, memloc) orelse ClassSet.contains(dead_classes, MemLoc.class memloc)) val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, commit} => case (shouldCommit memloc, shouldRemove memloc, shouldDead memloc) of (true,false,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} | (false,true,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} | (false,false,true) => {register = register, memloc = memloc, weight = weight, sync = true, commit = toRemove commit} | (false,false,false) => if List.exists (MemLoc.utilized memloc, fn memloc' => shouldDead memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} else if List.exists (MemLoc.utilized memloc, fn memloc' => shouldRemove memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} else value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.force", registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, commit} => case (shouldCommit memloc, shouldRemove memloc, shouldDead memloc) of (true,false,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} | (false,true,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} | (false,false,true) => value | (false,false,false) => if List.exists (MemLoc.utilized memloc, fn memloc' => shouldDead memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} else if List.exists (MemLoc.utilized memloc, fn memloc' => shouldRemove memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} else value | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.force", registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, commit, ...} => if shouldDead memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = toRemove commit} else value, registerAllocation = registerAllocation} val {assembly = assembly_dead_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_commit_xmmregisters, assembly_commit_registers, assembly_dead_registers], registerAllocation = registerAllocation} end fun ccall {info: Liveness.t, registerAllocation: t} = let val cargClasses = !amd64MLton.Classes.cargClasses val cstaticClasses = !amd64MLton.Classes.cstaticClasses val {reserved = reservedStart, xmmreserved = xmmreservedStart, ...} = registerAllocation val {assembly = assembly_xmmreserve, registerAllocation} = List.fold (XmmRegister.callerSaveRegisters, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = xmmreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val {assembly = assembly_reserve, registerAllocation} = List.fold (Register.callerSaveRegisters, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val availCalleeSaveXmmRegisters = List.keepAll (XmmRegister.calleeSaveRegisters, fn calleeSaveReg => List.forall (#xmmreserved registerAllocation, fn reservedReg => not (XmmRegister.coincide (reservedReg, calleeSaveReg)))) val {assembly = assembly_xmmshuffle, registerAllocation, ...} = if !Control.Native.shuffle then List.fold (xmmvalueFilter {filter = fn {register, memloc, ...} => (List.contains (XmmRegister.callerSaveRegisters, register, XmmRegister.eq) andalso (not o ClassSet.contains) (cargClasses, MemLoc.class memloc)) andalso List.exists (availCalleeSaveXmmRegisters, fn calleeSaveReg => Size.eq (XmmRegister.size register, XmmRegister.size calleeSaveReg)), registerAllocation = registerAllocation}, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_shuffle, registerAllocation, ...} = allocateXmmOperand {operand = Operand.memloc memloc, options = {xmmregister = true, address = true}, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = XmmRegister.calleeSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_shuffle), registerAllocation = registerAllocation} end) else {assembly = AppendList.empty, registerAllocation = registerAllocation} val availCalleeSaveRegisters = List.keepAll (Register.calleeSaveRegisters, fn calleeSaveReg => List.forall (#reserved registerAllocation, fn reservedReg => not (Register.coincide (reservedReg, calleeSaveReg)))) val {assembly = assembly_shuffle, registerAllocation, ...} = if !Control.Native.shuffle then List.fold (valueFilter {filter = fn {register, memloc, ...} => (List.contains (Register.callerSaveRegisters, register, Register.eq) andalso (not o ClassSet.contains) (cargClasses, MemLoc.class memloc)) andalso List.exists (availCalleeSaveRegisters, fn calleeSaveReg => Size.eq (Register.size register, Register.size calleeSaveReg)), registerAllocation = registerAllocation}, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_shuffle, registerAllocation, ...} = allocateOperand {operand = Operand.memloc memloc, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = Register.calleeSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_shuffle), registerAllocation = registerAllocation} end) else {assembly = AppendList.empty, registerAllocation = registerAllocation} val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, ...} => if (List.contains (XmmRegister.callerSaveRegisters, register, XmmRegister.eq) andalso (not o ClassSet.contains) (cargClasses, MemLoc.class memloc)) orelse ClassSet.contains (cstaticClasses, MemLoc.class memloc) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if (List.contains (Register.callerSaveRegisters, register, Register.eq) andalso (not o ClassSet.contains) (cargClasses, MemLoc.class memloc)) orelse ClassSet.contains (cstaticClasses, MemLoc.class memloc) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_xmmunreserve, registerAllocation} = List.fold (List.removeAll (XmmRegister.callerSaveRegisters, fn register => List.contains(xmmreservedStart, register, XmmRegister.eq)), {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = xmmunreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val {assembly = assembly_unreserve, registerAllocation} = List.fold (List.removeAll (Register.callerSaveRegisters, fn register => List.contains(reservedStart, register, Register.eq)), {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val registerAllocation = xmmdeletes {registers = XmmRegister.callerSaveRegisters, registerAllocation = registerAllocation} val registerAllocation = deletes {registers = Register.callerSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_xmmreserve, assembly_reserve, assembly_xmmshuffle, assembly_shuffle, assembly_commit_xmmregisters, assembly_commit_registers, assembly_xmmunreserve, assembly_unreserve], registerAllocation = registerAllocation} end fun return {returns: {src: Operand.t, dst: MemLoc.t} list, info: Liveness.t, registerAllocation: t} = let val killed_values = valueFilter {filter = fn {memloc, ...} => List.exists (returns, fn {dst = return_memloc, ...} => List.exists(MemLoc.utilized memloc, fn memloc' => MemLoc.eq(memloc', return_memloc)) orelse MemLoc.mayAlias(return_memloc, memloc)), registerAllocation = registerAllocation} val killed_memlocs = List.revMap(killed_values, #memloc) val registerAllocation = removes {memlocs = killed_memlocs, registerAllocation = registerAllocation} val registerAllocation = xmmremoves {memlocs = killed_memlocs, registerAllocation = registerAllocation} val registerAllocation = List.fold (returns, registerAllocation, fn ({src = operand, dst = return_memloc}, registerAllocation) => case operand of Operand.Register return_register => update {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} | Operand.XmmRegister return_register => xmmupdate {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} | _ => Error.bug "amd64AllocateRegisters.RegisterAllocation.return") val (final_defs, defs) = List.fold (returns, ([],[]), fn ({src,dst},(final_defs,defs)) => (src::final_defs,(Operand.memloc dst)::defs)) val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = defs, final_defs = final_defs, kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end (* fun return {memloc = return_memloc, info: Liveness.t, registerAllocation: t} = let val killed_values = valueFilter {filter = fn value as {memloc,...} => List.exists (MemLoc.utilized memloc, fn memloc' => MemLoc.eq(memloc', return_memloc)) orelse MemLoc.mayAlias(return_memloc, memloc), registerAllocation = registerAllocation} val killed_memlocs = List.revMap(killed_values, #memloc) val registerAllocation = removes {memlocs = killed_memlocs, registerAllocation = registerAllocation} val return_register = Register.return (MemLoc.size return_memloc) val registerAllocation = update {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = [Operand.memloc return_memloc], final_defs = [Operand.register return_register], kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end fun fltreturn {memloc = return_memloc, info: Liveness.t, registerAllocation: t} = let val return_register = FltRegister.return val {fltrename = fltrename_push, registerAllocation} = fltpush {value = {fltregister = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = [Operand.memloc return_memloc], final_defs = [Operand.fltregister return_register], kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end *) fun saveregalloc ({id, registerAllocation, ...}: {live: MemLocSet.t, id: Directive.Id.t, info: Liveness.t, registerAllocation: t}) = let val _ = setRA(id, {registerAllocation = registerAllocation}) in {assembly = if !Control.Native.commented > 2 then (toComments registerAllocation) else AppendList.empty, registerAllocation = registerAllocation} end fun restoreregalloc ({live, id, info, ...}: {live: MemLocSet.t, id: Directive.Id.t, info: Liveness.t, registerAllocation: t}) = let val {registerAllocation} = getRA id fun dump memloc = (track memloc) andalso not (MemLocSet.contains(live,memloc)) val registerAllocation = xmmvalueMap {map = fn value as {register, memloc, weight, sync, ...} => if dump memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = TRYREMOVE 0} else if List.exists(MemLoc.utilized memloc, dump) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = TRYREMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_xmmregisters, registerAllocation, ...} = commitXmmRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if dump memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = TRYREMOVE 0} else if List.exists(MemLoc.utilized memloc, dump) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = TRYREMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation, ...} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_commit_xmmregisters, assembly_commit_registers), registerAllocation = registerAllocation} end end structure Instruction = struct structure RA = RegisterAllocation open Instruction (* * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) fun allocateSrcDst {src: Operand.t, dst: Operand.t, move_dst: bool, size: Size.t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else case (src, dst) of (Operand.MemLoc _, Operand.MemLoc memloc_dst) => if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = move_dst, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val options_src = case final_dst of Operand.Register _ => {register = true, immediate = NONE, label = false, address = true} | _ => {register = true, immediate = NONE, label = false, address = false} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = options_src, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end else let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | (_, Operand.MemLoc memloc_dst) => let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = SOME WordSize.word32, label = false, address = false}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} fun default () = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then case RA.allocated {memloc = memloc_dst, registerAllocation = registerAllocation} of SOME {register, sync, ...} => if sync then let val registerAllocation = RA.delete {register = register, registerAllocation = registerAllocation} in RA.allocateOperand {operand = dst, options = {register = false, immediate = NONE, label = false, address = true}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} end else default () | NONE => default () else default () in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateSrcDst" (* * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) fun allocateSrc1Src2 {src1: Operand.t, src2: Operand.t, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src1, src2) then let val {operand = final_src1_src2, assembly = assembly_src1_src2, registerAllocation} = RA.allocateOperand {operand = src1, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, registerAllocation = registerAllocation} end else let val {operand = final_src1, assembly = assembly_src1, registerAllocation} = RA.allocateOperand {operand = src1, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [src2], saves = [], force = [], registerAllocation = registerAllocation} val options_src2 = case final_src1 of Operand.Register _ => {register = true, immediate = SOME WordSize.word32, label = false, address = true} | _ => {register = true, immediate = SOME WordSize.word32, label = false, address = false} val {operand = final_src2, assembly = assembly_src2, registerAllocation} = RA.allocateOperand {operand = src2, options = options_src2, info = info, size = size, move = true, supports = [], saves = [src1,final_src1], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src1, assembly_src2], registerAllocation = registerAllocation} end (* * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add ? *) fun allocateXmmSrcDstAux {src: Operand.t, address_src: bool, dst: Operand.t, move_dst: bool, size: Size.t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else case (src, dst) of (Operand.MemLoc _, Operand.MemLoc memloc_dst) => if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = size, move = move_dst, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = address_src}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end else let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = address_src}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | (_, Operand.MemLoc memloc_dst) => let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = false}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} fun default () = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then case RA.xmmallocated {memloc = memloc_dst, registerAllocation = registerAllocation} of SOME {register, sync, ...} => if sync then let val registerAllocation = RA.xmmdelete {register = register, registerAllocation = registerAllocation} in RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} end else default () | NONE => default () else default () in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateXmmSrcDstAux" (* * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X *) fun allocateXmmSrcDst {src: Operand.t, dst: Operand.t, move_dst: bool, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = allocateXmmSrcDstAux {src = src, address_src = true, dst = dst, move_dst = move_dst, size = size, info = info, registerAllocation = registerAllocation} (* * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add *) fun allocateXmmSrcDstReg {src: Operand.t, dst: Operand.t, move_dst: bool, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = allocateXmmSrcDstAux {src = src, address_src = false, dst = dst, move_dst = move_dst, size = size, info = info, registerAllocation = registerAllocation} (* * Require src1/src2 operands as follows: * * src2 * reg xmm imm lab add * reg * xmm X * src1 imm * lab * add X *) fun allocateXmmSrc1Src2 {src1: Operand.t, src2: Operand.t, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src1, src2) then let val {operand = final_src1_src2, assembly = assembly_src1_src2, registerAllocation} = RA.allocateXmmOperand {operand = src1, options = {xmmregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, registerAllocation = registerAllocation} end else let val {operand = final_src1, assembly = assembly_src1, registerAllocation} = RA.allocateXmmOperand {operand = src1, options = {xmmregister = true, address = true}, info = info, size = size, move = true, supports = [src2], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_src2, assembly = assembly_src2, registerAllocation} = RA.allocateXmmOperand {operand = src2, options = {xmmregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src1,final_src1], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src1, assembly_src2], registerAllocation = registerAllocation} end fun allocateRegisters {instruction: t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = case instruction of NOP (* No operation *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.NOP val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | HLT (* Halt *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.HLT val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | BinAL {oper, src, dst, size} (* Integer binary arithmetic(w/o mult & div)/logic instructions. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.BinAL {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | pMD {oper, dst, src, size} (* Integer multiplication and division. * Require src operand as follows: * * src * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: pMD, size" val {assembly = assembly_clear, registerAllocation, ...} = RA.freeRegister {info = info, memloc = NONE, size = size, supports = [src,dst], saves = [], force = [hi], registerAllocation = registerAllocation} val registerAllocation = RA.delete {register = hi, registerAllocation = registerAllocation} val {final_src, assembly_src_dst, registerAllocation, ...} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [Operand.register hi], force = [lo], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else let val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [src], saves = [Operand.register hi], force = [lo], registerAllocation = registerAllocation} val force_src = List.revKeepAll (Register.registers size, fn r => not (Register.eq(r, hi) orelse Register.eq(r, lo))) val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [Operand.register hi, dst,final_dst], force = force_src, registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end val oper' = case oper of Instruction.IMUL => Instruction.IMUL | Instruction.MUL => Instruction.MUL | Instruction.IDIV => Instruction.IDIV | Instruction.DIV => Instruction.DIV | Instruction.IMOD => Instruction.IDIV | Instruction.MOD => Instruction.DIV val registerAllocation = if oper = Instruction.IMOD orelse oper = Instruction.MOD then case RA.valuesRegister {register = lo, registerAllocation = registerAllocation} of [{memloc, weight, sync, commit, ...}] => let val registerAllocation = RA.delete {register = lo, registerAllocation = registerAllocation} val registerAllocation = RA.update {value = {register = hi, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in registerAllocation end | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: pMD, lo" else registerAllocation val instruction = Instruction.MD {oper = oper', src = final_src, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_clear, assembly_src_dst, (if oper = Instruction.IDIV orelse oper = Instruction.IMOD then AppendList.single (Assembly.instruction_cx {size = size}) else if oper = Instruction.DIV orelse oper = Instruction.MOD then AppendList.single (Assembly.instruction_binal {oper = Instruction.XOR, dst = Operand.register hi, src = Operand.register hi, size = size}) else AppendList.empty), AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | IMUL2 {src, dst, size} (* Integer signed/unsigned multiplication (two operand form). * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = SOME WordSize.word32, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end val instruction = Instruction.IMUL2 {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | UnAL {oper, dst, size} (* Integer unary arithmetic/logic instructions. * Require dst operand as follows: * * dst * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.UnAL {oper = oper, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SRAL {oper, count, dst, size} (* Integer shift/rotate arithmetic/logic instructions. * Require count operand as follows: * * count * reg imm lab add * * X * * only register %cl * * Require dst operand as follows: * * dst * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_count, assembly_count, final_dst, assembly_dst, registerAllocation} = if Operand.eq(count,dst) then let val {operand = final_count, assembly = assembly_count, registerAllocation} = RA.allocateOperand {operand = count, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [Register.T {reg = Register.RCX, part = Register.L}, Register.T {reg = Register.RCX, part = Register.X}, Register.T {reg = Register.RCX, part = Register.E}, Register.T {reg = Register.RCX, part = Register.R}], registerAllocation = registerAllocation} val final_dst = final_count val assembly_dst = AppendList.empty in {final_count = final_count, assembly_count = assembly_count, final_dst = final_dst, assembly_dst = assembly_dst, registerAllocation = registerAllocation} end else let val count_size = case Operand.size count of NONE => Size.BYTE | SOME size => size val {operand = final_count, assembly = assembly_count, registerAllocation} = RA.allocateOperand {operand = count, options = {register = true, immediate = SOME WordSize.word8, label = false, address = false}, info = info, size = count_size, move = true, supports = [dst], saves = [], force = [Register.T {reg = Register.RCX, part = Register.L}, Register.T {reg = Register.RCX, part = Register.X}, Register.T {reg = Register.RCX, part = Register.E}, Register.T {reg = Register.RCX, part = Register.R}], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [count,final_count], force = [], registerAllocation = registerAllocation} in {final_count = final_count, assembly_count = assembly_count, final_dst = final_dst, assembly_dst = assembly_dst, registerAllocation = registerAllocation} end val final_count = case final_count of Operand.Register _ => Operand.register (Register.T {reg = Register.RCX, part = Register.L}) | _ => final_count val instruction = Instruction.SRAL {oper = oper, count = final_count, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_count, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | CMP {src2, src1, size} (* Arithmetic compare * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.CMP {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | TEST {src2, src1, size} (* Logical compare * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.TEST {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SETcc {condition, dst, size} (* Set byte on condition * Require dst operand as follows: * * dst * reg imm lab add * * X * * only byte registers *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [], force = if Size.lt (Size.BYTE, size) then Register.withLowPart (size, Size.BYTE) else Register.registers Size.BYTE, registerAllocation = registerAllocation} val temp_dst = case final_dst of Operand.Register r => let val register = Register.lowPartOf (r, Size.BYTE) in Operand.register register end | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: SETcc, temp_reg" val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills (Instruction.SETcc {condition = condition, dst = final_dst, size = size}) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction_setcc {condition = condition, dst = temp_dst, size = Size.BYTE}), if size = Size.BYTE then if Operand.eq (final_dst, temp_dst) then AppendList.empty else AppendList.single (Assembly.instruction_mov {dst = final_dst, src = temp_dst, size = Size.BYTE}) else AppendList.single (Assembly.instruction_movx {oper = Instruction.MOVZX, dst = final_dst, src = temp_dst, dstsize = size, srcsize = Size.BYTE}), assembly_post], registerAllocation = registerAllocation} end | JMP {target, absolute} (* Jump * Require target operand as follows: * * target * reg imm lab add * X X X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = false, immediate = SOME WordSize.word64, label = true, address = true}, info = info, size = Size.QUAD, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.JMP {target = final_target, absolute = absolute} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | Jcc {condition, target} (* Jump if condition is met * Require target operand as follows: * * target * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = false, immediate = SOME WordSize.word64, label = true, address = false}, info = info, size = Size.QUAD, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.Jcc {condition = condition, target = final_target} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | CALL {target, absolute} (* Call procedure * Require target operand as follows: * * target * reg imm lab add * X X X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = true, immediate = SOME WordSize.word64, label = true, address = true}, info = info, size = Size.QUAD, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.CALL {target = final_target, absolute = absolute} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | RET {src = SOME src} (* Return from procedure * Require optional src operand as follows: * * src * reg imm lab add * X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation = registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = SOME WordSize.word32, label = false, address = false}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.RET {src = SOME final_src} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | RET {src = NONE} => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.RET {src = NONE} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | MOV {src, dst, size} (* Move * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val isConst0 = Immediate.isZero (* special case moving 0 to a register *) val instruction = case (final_src, final_dst) of (Operand.Immediate immediate, Operand.Register _) => if isConst0 immediate then Instruction.BinAL {oper = XOR, src = final_dst, dst = final_dst, size = size} else Instruction.MOV {src = final_src, dst = final_dst, size = size} | _ => Instruction.MOV {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' ({register = register_src, commit = commit_src, ...} : RegisterAllocation.value, memloc_dst) = let val registerAllocation = RA.remove {memloc = memloc_dst, registerAllocation = registerAllocation} val registerAllocation = RA.update {value = {register = register_src, memloc = memloc_dst, weight = 1024, sync = false, commit = commit_src}, registerAllocation = registerAllocation} val final_uses = [] val final_defs = [Operand.register register_src] val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_post], registerAllocation = registerAllocation} end fun default'' (memloc_dst) = let val registerAllocation = RA.remove {memloc = memloc_dst, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.MOV {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end val memloc_src = Operand.deMemloc src val value_src = case memloc_src of NONE => NONE | SOME memloc_src => RA.allocated {memloc = memloc_src, registerAllocation = registerAllocation} val memloc_dst = Operand.deMemloc dst in case memloc_dst of SOME memloc_dst => if MemLocSet.contains(remove,memloc_dst) then (case memloc_src of SOME memloc_src => if List.contains (memloc_src::(MemLoc.utilized memloc_src), memloc_dst, MemLoc.eq) then default () else default'' memloc_dst | NONE => default'' memloc_dst) else (case value_src of SOME (value_src as {memloc = memloc_src, sync = sync_src, ...}) => if MemLocSet.contains(dead,memloc_src) orelse (MemLocSet.contains(remove,memloc_src) andalso sync_src) then default' (value_src, memloc_dst) else default () | NONE => default ()) | NONE => default () end | CMOVcc {condition, src, dst, size} (* Conditional move * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.CMOVcc {condition = condition, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | XCHG {src, dst, size} (* Exchange register/memory with register * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.XCHG {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pPUSH {src, base, size} (* Pseudo push a value onto the stack * Require src operand as follows: * * src * reg imm lab add * * X X * * only word or long registers * * base * reg imm lab add * * * * only %esp *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_base, registerAllocation, ...} = RA.allocateOperand {operand = base, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = Size.QUAD, move = true, supports = [src], saves = [], force = [Register.rsp], registerAllocation = registerAllocation} val options = case size of Size.WORD => {register = true, immediate = SOME WordSize.word16, label = false, address = true} | Size.LONG => {register = true, immediate = SOME WordSize.word32, label = false, address = true} | Size.QUAD => {register = true, immediate = SOME WordSize.word32, label = false, address = true} | _ => {register = false, immediate = SOME WordSize.word32, label = false, address = true} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = options, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.PUSH {src = final_src, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_base, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pPOP {dst, base, size} (* Pseudo pop a value from the stack * Require dst operand as follows: * * dst * reg imm lab add * * X * * only word or long registers * base * reg imm lab add * * * * only %esp *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_base, registerAllocation, ...} = RA.allocateOperand {operand = base, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = Size.QUAD, move = true, supports = [dst], saves = [], force = [Register.rsp], registerAllocation = registerAllocation} val options = case size of Size.WORD => {register = true, immediate = NONE, label = false, address = true} | Size.LONG => {register = true, immediate = NONE, label = false, address = true} | Size.QUAD => {register = true, immediate = NONE, label = false, address = true} | _ => {register = false, immediate = NONE, label = false, address = true} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = options, info = info, size = size, move = false, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.POP {dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_base, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | MOVX {oper, src, dst, srcsize, dstsize} (* Move with extention. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.MOVX {oper = oper, src = final_src, dst = final_dst, srcsize = srcsize, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | XVOM {src, dst, srcsize, dstsize} (* Move with contraction. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm * lab * add *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = Register.withLowPart (srcsize, dstsize), registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills (Instruction.XVOM {src = final_src, dst = final_dst, srcsize = srcsize, dstsize = dstsize}) val temp_reg = case final_src of Operand.Register r => Register.lowPartOf (r, dstsize) | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: XVOM, temp_reg" val instruction = Instruction.MOV {src = Operand.register temp_reg, dst = final_dst, size = dstsize} val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | LEA {src, dst, size} (* Load effective address * Require src/dst operands as follows: * * dst * reg imm lab add * reg * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = NONE, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.LEA {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_BinAS {oper, src, dst, size} (* SSE scalar binary arithmetic instructions. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_BinAS {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | SSE_UnAS {oper, src, dst, size} (* SSE scalar unary arithmetic instructions. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_UnAS {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | SSE_BinLP {oper, src, dst, size} (* Packed SSE binary logical instructions (used as scalar). * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add (x) * * Disallow address for src, since it would be a 128-bit load. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDstReg {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_BinLP {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | SSE_MOVS {src, dst, size} (* Scalar SSE move instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_MOVS {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' ({register = register_src, commit = commit_src, ...} : RegisterAllocation.xmmvalue, memloc_dst) = let val registerAllocation = RA.xmmremove {memloc = memloc_dst, registerAllocation = registerAllocation} val registerAllocation = RA.xmmupdate {value = {register = register_src, memloc = memloc_dst, weight = 1024, sync = false, commit = commit_src}, registerAllocation = registerAllocation} val final_uses = [] val final_defs = [Operand.xmmregister register_src] val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_post], registerAllocation = registerAllocation} end fun default'' (memloc_dst) = let val registerAllocation = RA.xmmremove {memloc = memloc_dst, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateXmmSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_MOVS {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end val memloc_src = Operand.deMemloc src val value_src = case memloc_src of NONE => NONE | SOME memloc_src => RA.xmmallocated {memloc = memloc_src, registerAllocation = registerAllocation} val memloc_dst = Operand.deMemloc dst in case memloc_dst of SOME memloc_dst => if MemLocSet.contains(remove,memloc_dst) then (case memloc_src of SOME memloc_src => if List.contains (memloc_src::(MemLoc.utilized memloc_src), memloc_dst, MemLoc.eq) then default () else default'' memloc_dst | NONE => default'' memloc_dst) else (case value_src of SOME (value_src as {memloc = memloc_src, sync = sync_src, ...}) => if MemLocSet.contains(dead,memloc_src) orelse (MemLocSet.contains(remove,memloc_src) andalso sync_src) then default' (value_src, memloc_dst) else default () | NONE => default ()) | NONE => default () end | SSE_COMIS {src1, src2, size} (* Scalar SSE compare instruction. * Require src1/src2 operands as follows: * * src2 * reg xmm imm lab add * reg * xmm X * src1 imm * lab * add X * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateXmmSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_COMIS {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_UCOMIS {src1, src2, size} (* Scalar SSE unordered compare instruction. * Require src1/src2 operands as follows: * * src2 * reg xmm imm lab add * reg * xmm X * src1 imm * lab * add X * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateXmmSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.SSE_UCOMIS {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_CVTSFP2SFP {src, srcsize, dst, dstsize, ...} (* Scalar SSE floating-point/floating-point convert instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X * * Require srcsize/dstsize modifier class as follows: FLT != FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.SSE_CVTSFP2SFP {src = final_src, srcsize = srcsize, dst = final_dst, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_CVTSFP2SI {src, srcsize, dst, dstsize, ...} (* Scalar SSE floating-point/signed-integer convert instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg * xmm X * src imm * lab * add X * * Require srcsize/dstsize modifier class as follows: FLT/INT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.SSE_CVTSFP2SI {src = final_src, srcsize = srcsize, dst = final_dst, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_CVTSI2SFP {src, srcsize, dst, dstsize, ...} (* Scalar SSE floating-point/signed-integer convert instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg X * xmm * src imm * lab * add X * * Require srcsize/dstsize modifier class as follows: INT/FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.SSE_CVTSI2SFP {src = final_src, srcsize = srcsize, dst = final_dst, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SSE_MOVD {src, srcsize, dst, dstsize, ...} (* Scalar SSE move data instruction. * Require src/dst operands as follows: * * dst * reg xmm imm lab add * reg X * xmm X X * src imm * lab * add X * * Require size modifier class as follows: FLT/INT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = let fun doitINT () = RA.allocateOperand {operand = src, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} fun doitFLT () = RA.allocateXmmOperand {operand = src, options = {xmmregister = true, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} in case src of Operand.MemLoc memloc => (case Size.class (MemLoc.size memloc) of Size.INT => doitINT () | Size.FLT => doitFLT ()) | Operand.Immediate _ => doitINT () | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: SSE_MOVD, src" end val {operand = final_dst, assembly = assembly_dst, registerAllocation} = let fun doitINT () = RA.allocateOperand {operand = dst, options = {register = true, immediate = NONE, label = false, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} fun doitFLT () = RA.allocateXmmOperand {operand = dst, options = {xmmregister = true, address = false}, info = info, size = dstsize, move = false, supports = [src,final_src], saves = [], force = [], registerAllocation = registerAllocation} in case dst of Operand.MemLoc memloc => (case Size.class (MemLoc.size memloc) of Size.INT => doitINT () | Size.FLT => doitFLT ()) | _ => Error.bug "amd64AllocateRegisters.Instruction.allocateRegisters: SSE_MOVD, dst" end val instruction = Instruction.SSE_MOVD {src = final_src, srcsize = srcsize, dst = final_dst, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | _ => Error.bug (concat ["amd64AllocateRegisters.Instruction.allocateRegisters: unimplemented: ", Instruction.toString instruction]) val (allocateRegisters, allocateRegisters_msg) = tracer "Instruction.allocateRegisters" allocateRegisters end structure Directive = struct open Directive fun allocateRegisters {directive, info, registerAllocation} = let val {assembly, registerAllocation} = case directive of Assume {assumes} => RegisterAllocation.assume {assumes = assumes, info = info, registerAllocation = registerAllocation} | XmmAssume {assumes} => RegisterAllocation.xmmassume {assumes = assumes, info = info, registerAllocation = registerAllocation} | Cache {caches} => RegisterAllocation.cache {caches = caches, info = info, registerAllocation = registerAllocation} | XmmCache {caches} => RegisterAllocation.xmmcache {caches = caches, info = info, registerAllocation = registerAllocation} | Reset => RegisterAllocation.reset {registerAllocation = registerAllocation} | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => RegisterAllocation.force {commit_memlocs = commit_memlocs, commit_classes = commit_classes, remove_memlocs = remove_memlocs, remove_classes = remove_classes, dead_memlocs = dead_memlocs, dead_classes = dead_classes, info = info, registerAllocation = registerAllocation} | CCall => RegisterAllocation.ccall {info = info, registerAllocation = registerAllocation} | Return {returns} => RegisterAllocation.return {returns = returns, info = info, registerAllocation = registerAllocation} | Reserve {registers} => RegisterAllocation.reserve {registers = registers, registerAllocation = registerAllocation} | XmmReserve {registers} => RegisterAllocation.xmmreserve {registers = registers, registerAllocation = registerAllocation} | Unreserve {registers} => RegisterAllocation.unreserve {registers = registers, registerAllocation = registerAllocation} | XmmUnreserve {registers} => RegisterAllocation.xmmunreserve {registers = registers, registerAllocation = registerAllocation} | SaveRegAlloc {live, id} => RegisterAllocation.saveregalloc {live = live, id = id, info = info, registerAllocation = registerAllocation} | RestoreRegAlloc {live, id} => RegisterAllocation.restoreregalloc {live = live, id = id, info = info, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end val (allocateRegisters, allocateRegisters_msg) = tracer "Directive.allocateRegisters" allocateRegisters end structure Assembly = struct open Assembly fun allocateRegisters {assembly: (t * Liveness.t) list, registerAllocation: RegisterAllocation.t} = let val {assembly, registerAllocation} = List.fold (assembly, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ((Comment s,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, Comment s), registerAllocation = registerAllocation} | ((Directive d,info), {assembly, registerAllocation}) => let val {assembly = assembly', registerAllocation} = Directive.allocateRegisters {directive = d, info = info, registerAllocation = registerAllocation} val assembly'' = AppendList.appends [if !Control.Native.commented > 1 then AppendList.fromList [Assembly.comment (String.make (60, #"*")), (Assembly.comment (Directive.toString d))] else AppendList.empty, if !Control.Native.commented > 4 then AppendList.fromList (Liveness.toComments info) else AppendList.empty, assembly', if !Control.Native.commented > 5 then (RegisterAllocation.toComments registerAllocation) else AppendList.empty] in {assembly = AppendList.append (assembly, assembly''), registerAllocation = registerAllocation} end | ((PseudoOp p,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, PseudoOp p), registerAllocation = registerAllocation} | ((Label l,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, Label l), registerAllocation = registerAllocation} | ((Instruction i,info), {assembly, registerAllocation}) => let val {assembly = assembly', registerAllocation} = Instruction.allocateRegisters {instruction = i, info = info, registerAllocation = registerAllocation} val assembly'' = AppendList.appends [if !Control.Native.commented > 1 then AppendList.fromList [Assembly.comment (String.make (60, #"*")), (Assembly.comment (Instruction.toString i))] else AppendList.empty, if !Control.Native.commented > 4 then AppendList.fromList (Liveness.toComments info) else AppendList.empty, assembly', if !Control.Native.commented > 5 then (RegisterAllocation.toComments registerAllocation) else AppendList.empty] in {assembly = AppendList.append (assembly, assembly''), registerAllocation = registerAllocation} end) val assembly = AppendList.toList assembly val assembly = if !Control.Native.commented > 1 then (Assembly.comment (String.make (60, #"&")):: Assembly.comment (String.make (60, #"&")):: assembly) else assembly in {assembly = assembly, registerAllocation = registerAllocation} end val (allocateRegisters, allocateRegisters_msg) = tracer "Assembly.allocateRegisters" allocateRegisters end fun allocateRegisters {assembly : Assembly.t list list, liveness : bool} : Assembly.t list list = let val {get = getInfo : Label.t -> Label.t option, set = setInfo, ...} = Property.getSetOnce (Label.plist, Property.initConst NONE) fun unroll label = case getInfo label of NONE => label | SOME label' => unroll label' val assembly = List.fold (assembly, [], fn (assembly,assembly') => let val assembly = if liveness then Liveness.toLiveness assembly else Liveness.toNoLiveness assembly val {assembly, ...} = Assembly.allocateRegisters {assembly = assembly, registerAllocation = RegisterAllocation.empty ()} val rec doit = fn (Assembly.Comment _)::assembly => doit assembly | (Assembly.PseudoOp (PseudoOp.P2align _))::assembly => doit' (assembly, []) | _ => false and doit' = fn ((Assembly.Comment _)::assembly, labels) => doit' (assembly, labels) | ((Assembly.PseudoOp (PseudoOp.Local _))::assembly, labels) => doit' (assembly, labels) | ((Assembly.Label l)::assembly, labels) => doit' (assembly, l::labels) | (assembly, labels) => doit'' (assembly, labels) and doit'' = fn ((Assembly.Comment _)::assembly, labels) => doit'' (assembly, labels) | ((Assembly.Instruction (Instruction.JMP {target = Operand.Label label, absolute = false}))::assembly, labels) => doit''' (assembly, labels, label) | _ => false and doit''' = fn ([], labels, label) => let val label' = unroll label in if List.contains(labels, label', Label.equals) then false else (List.foreach (labels, fn label'' => setInfo(label'', SOME label')); true) end | ((Assembly.Comment _)::assembly, labels, label) => doit''' (assembly, labels, label) | _ => false in if doit assembly then assembly' else assembly::assembly' end) fun replacer _ oper = (case (Operand.deImmediate oper, Operand.deLabel oper) of (SOME immediate, _) => (case Immediate.deLabel immediate of SOME label => Operand.immediate_label (unroll label) | NONE => oper) | (_, SOME label) => Operand.label (unroll label) | _ => oper) val assembly = List.fold (assembly, [], fn (assembly,assembly') => (List.map(assembly, Assembly.replace replacer))::assembly') in assembly end val (allocateRegisters, allocateRegisters_msg) = tracerTop "allocateRegisters" allocateRegisters fun allocateRegisters_totals () = (allocateRegisters_msg (); Control.indent (); Liveness.toLiveness_msg (); Liveness.toNoLiveness_msg (); Assembly.allocateRegisters_msg (); Control.indent (); Instruction.allocateRegisters_msg (); Control.indent (); RegisterAllocation.pre_msg (); RegisterAllocation.post_msg (); RegisterAllocation.allocateOperand_msg (); RegisterAllocation.allocateXmmOperand_msg (); Control.unindent (); Directive.allocateRegisters_msg (); Control.unindent (); Control.unindent()) end mlton-20100608/mlton/codegen/amd64-codegen/amd64-allocate-registers.sig0000644000076600000240000000137511404435625024051 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_ALLOCATE_REGISTERS_STRUCTS = sig structure amd64 : AMD64 structure amd64MLton : AMD64_MLTON sharing amd64 = amd64MLton.amd64 end signature AMD64_ALLOCATE_REGISTERS = sig include AMD64_ALLOCATE_REGISTERS_STRUCTS val allocateRegisters : {assembly: amd64.Assembly.t list list, liveness: bool} -> amd64.Assembly.t list list val allocateRegisters_totals : unit -> unit end mlton-20100608/mlton/codegen/amd64-codegen/amd64-codegen.fun0000644000076600000240000005101411404435625021665 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64Codegen (S: AMD64_CODEGEN_STRUCTS): AMD64_CODEGEN = struct open S structure amd64 = amd64 (open Machine structure RepType = Type) structure amd64Pseudo = amd64PseudoCheck (structure S = amd64) structure amd64MLtonBasic = amd64MLtonBasic (structure amd64 = amd64Pseudo structure Machine = Machine) structure amd64Liveness = amd64Liveness (structure amd64 = amd64 structure amd64MLtonBasic = amd64MLtonBasic) structure amd64JumpInfo = amd64JumpInfo (structure amd64 = amd64) structure amd64LoopInfo = amd64LoopInfo (structure amd64 = amd64) structure amd64EntryTransfer = amd64EntryTransfer (structure amd64 = amd64) structure amd64MLton = amd64MLton (structure amd64MLtonBasic = amd64MLtonBasic structure amd64Liveness = amd64Liveness) val implementsPrim = amd64MLton.implementsPrim structure amd64Translate = amd64Translate (structure amd64 = amd64 structure amd64MLton = amd64MLton structure amd64Liveness = amd64Liveness) structure amd64Simplify = amd64Simplify (structure amd64 = amd64 structure amd64Liveness = amd64Liveness structure amd64JumpInfo = amd64JumpInfo structure amd64EntryTransfer = amd64EntryTransfer) structure amd64GenerateTransfers = amd64GenerateTransfers (structure amd64 = amd64 structure amd64MLton = amd64MLton structure amd64Liveness = amd64Liveness structure amd64JumpInfo = amd64JumpInfo structure amd64LoopInfo = amd64LoopInfo structure amd64EntryTransfer = amd64EntryTransfer) structure amd64AllocateRegisters = amd64AllocateRegisters (structure amd64 = amd64 structure amd64MLton = amd64MLton) open amd64 fun output {program as Machine.Program.T {chunks, frameLayouts, handlesSignals, main, ...}, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}}: unit = let val reserveRsp = (* There is no sigaltstack on cygwin, we need to reserve %rsp to * hold the C stack pointer. We only need to do this in programs * that handle signals. *) handlesSignals andalso let open Control.Target in !os = Cygwin end val makeC = outputC val makeS = outputS val Machine.Program.T {profileInfo, ...} = program val profileInfo = case profileInfo of NONE => Machine.ProfileInfo.empty | SOME pi => pi val {newProfileLabel, delProfileLabel, getProfileInfo} = Machine.ProfileInfo.modify profileInfo (* C specific *) fun outputC () = let local val Machine.Program.T {chunks, frameLayouts, frameOffsets, handlesSignals, intInfs, main, maxFrameSize, objectTypes, reals, vectors, ...} = program in val program = Machine.Program.T {chunks = chunks, frameLayouts = frameLayouts, frameOffsets = frameOffsets, handlesSignals = handlesSignals, intInfs = intInfs, main = main, maxFrameSize = maxFrameSize, objectTypes = objectTypes, profileInfo = SOME (getProfileInfo ()), reals = reals, vectors = vectors} end val {print, done, ...} = makeC () val additionalMainArgs = let val mainLabel = Label.toString (#label main) (* Drop the leading _, because gcc will add it. *) val mainLabel = if !Control.labelsHaveExtra_ then String.dropPrefix (mainLabel, 1) else mainLabel in [mainLabel] end fun declareLocals () = List.foreach (CType.all, fn t => let val m = List.fold (chunks, ~1, fn (Machine.Chunk.T {regMax, ...}, max) => Int.max (max, regMax t)) val m = m + 1 in print (concat ["PRIVATE ", CType.toString t, " local", CType.toString t, "[", Int.toString m, "];\n"]) end) fun rest () = declareLocals () in CCodegen.outputDeclarations {additionalMainArgs = additionalMainArgs, includes = ["amd64-main.h"], print = print, program = program, rest = rest} ; done () end val outputC = Control.trace (Control.Pass, "outputC") outputC (* Assembly specific *) val _ = amd64MLtonBasic.init () fun outputJumpToSML print = let val win64 = case !Control.Target.os of MLton.Platform.OS.Cygwin => true | MLton.Platform.OS.MinGW => true | _ => false val jumpToSML = amd64.Label.fromString "MLton_jumpToSML" val returnToC = amd64.Label.fromString "Thread_returnToC" val {frontierReg, stackTopReg} = {frontierReg = amd64.Register.r12, stackTopReg = amd64.Register.rbp} val asm = [ amd64.Assembly.pseudoop_text (), amd64.Assembly.pseudoop_p2align (amd64.Immediate.int 4, NONE, NONE), amd64.Assembly.pseudoop_global jumpToSML, amd64.Assembly.pseudoop_hidden jumpToSML, amd64.Assembly.label jumpToSML, amd64.Assembly.instruction_binal {oper = amd64.Instruction.SUB, src = amd64.Operand.immediate_int 72, dst = amd64.Operand.register amd64.Register.rsp, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rbp, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 64), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rbx, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 56), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.r12, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 48), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.r13, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 40), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.r14, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 32), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.r15, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 24), base = SOME amd64.Register.rsp, index= NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.label amd64MLton.c_stackP), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rbx, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rbx, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 16), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rsp, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.label amd64MLton.c_stackP), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = (SOME o amd64.Immediate.labelPlusInt) (amd64MLton.gcState_label, Bytes.toInt (Machine.Runtime.GCField.offset Machine.Runtime.GCField.StackTop)), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, dst = amd64.Operand.register stackTopReg, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = (SOME o amd64.Immediate.labelPlusInt) (amd64MLton.gcState_label, Bytes.toInt (Machine.Runtime.GCField.offset Machine.Runtime.GCField.Frontier)), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, dst = amd64.Operand.register frontierReg, size = amd64.Size.QUAD}, amd64.Assembly.instruction_jmp {target = amd64.Operand.register (if win64 then amd64.Register.rcx else amd64.Register.rdi), absolute = true}, amd64.Assembly.pseudoop_p2align (amd64.Immediate.int 4, NONE, NONE), amd64.Assembly.pseudoop_global returnToC, amd64.Assembly.pseudoop_hidden returnToC, amd64.Assembly.label returnToC, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.label amd64MLton.c_stackP), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rsp, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 16), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rbx, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = amd64.Operand.register amd64.Register.rbx, dst = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.label amd64MLton.c_stackP), base = SOME amd64.Register.rip, index = NONE, scale = NONE}, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 24), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.r15, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 32), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.r14, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 40), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.r13, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 48), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.r12, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 56), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rbx, size = amd64.Size.QUAD}, amd64.Assembly.instruction_mov {src = (amd64.Operand.address o amd64.Address.T) {disp = SOME (amd64.Immediate.int 64), base = SOME amd64.Register.rsp, index = NONE, scale = NONE}, dst = amd64.Operand.register amd64.Register.rbp, size = amd64.Size.QUAD}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, src = amd64.Operand.immediate_int 72, dst = amd64.Operand.register amd64.Register.rsp, size = amd64.Size.QUAD}, amd64.Assembly.instruction_ret {src = NONE} ] in List.foreach (asm, fn asm => (Layout.print(Assembly.layout asm, print); print "\n")) end val liveInfo = amd64Liveness.LiveInfo.newLiveInfo () val jumpInfo = amd64JumpInfo.newJumpInfo () fun frameInfoToAMD64 (Machine.FrameInfo.T {frameLayoutsIndex, ...}) = amd64.FrameInfo.T {frameLayoutsIndex = frameLayoutsIndex, size = Bytes.toInt (#size (Vector.sub (frameLayouts, frameLayoutsIndex)))} fun outputChunk (chunk as Machine.Chunk.T {blocks, chunkLabel, ...}, print) = let val isMain = Machine.ChunkLabel.equals(#chunkLabel main, chunkLabel) val () = if isMain then outputJumpToSML print else () val {chunk} = amd64Translate.translateChunk {chunk = chunk, frameInfoToAMD64 = frameInfoToAMD64, liveInfo = liveInfo} val chunk : amd64.Chunk.t = amd64Simplify.simplify {chunk = chunk, (* don't perform optimizations on * the main function (initGlobals) *) optimize = if isMain then 0 else !Control.Native.optimize, delProfileLabel = delProfileLabel, liveInfo = liveInfo, jumpInfo = jumpInfo} val unallocated_assembly : amd64.Assembly.t list list = (amd64GenerateTransfers.generateTransfers {chunk = chunk, optimize = !Control.Native.optimize, newProfileLabel = newProfileLabel, liveInfo = liveInfo, jumpInfo = jumpInfo, reserveRsp = reserveRsp}) val allocated_assembly : Assembly.t list list = amd64AllocateRegisters.allocateRegisters {assembly = unallocated_assembly, (* don't calculate liveness info * on the main function (initGlobals) *) liveness = not isMain} val _ = Vector.foreach (blocks, Label.clear o Machine.Block.label) val _ = amd64.Immediate.clearAll () val _ = amd64.MemLoc.clearAll () in List.fold (allocated_assembly, if isMain then 30 else 0, fn (block, n) => List.fold (block, n, fn (asm, n) => (Layout.print (Assembly.layout asm, print); print "\n"; n + 1))) end fun outputAssembly () = let val split = !Control.Native.split fun loop chunks = let val {print, done, ...} = makeS() fun loop' (chunks, size) = case chunks of [] => done () | chunk::chunks => if (case split of NONE => false | SOME maxSize => size > maxSize) then (done (); loop (chunk::chunks)) else loop'(chunks, size + outputChunk (chunk, print)) in loop' (chunks, 0) end in loop chunks ; amd64Translate.translateChunk_totals () ; amd64Simplify.simplify_totals () ; amd64GenerateTransfers.generateTransfers_totals () ; amd64AllocateRegisters.allocateRegisters_totals () end val outputAssembly = Control.trace (Control.Pass, "outputAssembly") outputAssembly in outputAssembly() ; outputC() end end mlton-20100608/mlton/codegen/amd64-codegen/amd64-codegen.sig0000644000076600000240000000166011404435625021661 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_CODEGEN_STRUCTS = sig structure CCodegen: C_CODEGEN structure Machine: MACHINE sharing Machine = CCodegen.Machine end signature AMD64_CODEGEN = sig include AMD64_CODEGEN_STRUCTS val implementsPrim: Machine.Type.t Machine.Prim.t -> bool val output: {program: Machine.Program.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} -> unit end mlton-20100608/mlton/codegen/amd64-codegen/amd64-entry-transfer.fun0000644000076600000240000000631011404435625023243 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64EntryTransfer(S: AMD64_ENTRY_TRANSFER_STRUCTS) : AMD64_ENTRY_TRANSFER = struct open S open amd64 val tracer = amd64.tracer fun verifyEntryTransfer {chunk = Chunk.T {blocks, ...}} = let val {get : Label.t -> Block.t option, set, destroy} = Property.destGetSetOnce(Label.plist, Property.initConst NONE) val _ = List.foreach (blocks, fn block as Block.T {entry,...} => set(Entry.label entry, SOME block)) fun isJump l = case get l of SOME (Block.T {entry = Entry.Jump _, ...}) => true | _ => false fun isFunc l = case get l of SOME (Block.T {entry = Entry.Func _, ...}) => true | NONE => true | _ => false fun isCont l = case get l of SOME (Block.T {entry = Entry.Cont _, ...}) => true | _ => false fun isHandler l = case get l of SOME (Block.T {entry = Entry.Handler _, ...}) => true | _ => false fun isCReturn l f = case get l of SOME (Block.T {entry = Entry.CReturn {func, ...}, ...}) => CFunction.equals (f, func) | _ => false val b = List.forall (blocks, fn Block.T {transfer, ...} => (case transfer of Transfer.Goto {target, ...} => isJump target | Transfer.Iff {truee, falsee, ...} => isJump truee andalso isJump falsee | Transfer.Switch {cases, default, ...} => isJump default andalso Transfer.Cases.forall(cases, isJump o #2) | Transfer.Tail {target, ...} => isFunc target | Transfer.NonTail {target, return, handler, ...} => isFunc target andalso isCont return andalso (case handler of SOME handler => isHandler handler | NONE => true) | Transfer.Return {...} => true | Transfer.Raise {...} => true | Transfer.CCall {return, func, ...} => (case return of NONE => true | SOME l => isCReturn l func))) val _ = destroy () val _ = if b then () else List.foreach(blocks, Block.printBlock) in b end val (verifyEntryTransfer, verifyEntryTransfer_msg) = tracer "verifyEntryTransfer" verifyEntryTransfer end mlton-20100608/mlton/codegen/amd64-codegen/amd64-entry-transfer.sig0000644000076600000240000000102011404435625023226 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_ENTRY_TRANSFER_STRUCTS = sig structure amd64 : AMD64 end signature AMD64_ENTRY_TRANSFER = sig include AMD64_ENTRY_TRANSFER_STRUCTS val verifyEntryTransfer : {chunk: amd64.Chunk.t} -> bool val verifyEntryTransfer_msg : unit -> unit end mlton-20100608/mlton/codegen/amd64-codegen/amd64-generate-transfers.fun0000644000076600000240000033531311404435625024067 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64GenerateTransfers(S: AMD64_GENERATE_TRANSFERS_STRUCTS): AMD64_GENERATE_TRANSFERS = struct open S open amd64 open amd64JumpInfo open amd64LoopInfo open amd64Liveness open LiveInfo open Liveness local open Runtime in structure CFunction = CFunction end val ones : int * WordSize.t -> WordX.t = fn (i, ws) => (WordX.notb o WordX.lshift) (WordX.allOnes ws, WordX.fromIntInf (IntInf.fromInt i, ws)) val tracerTop = amd64.tracerTop structure amd64LiveTransfers = amd64LiveTransfers(structure amd64 = amd64 structure amd64Liveness = amd64Liveness structure amd64JumpInfo = amd64JumpInfo structure amd64LoopInfo = amd64LoopInfo) val pointerSize = amd64MLton.pointerSize val wordSize = amd64MLton.wordSize val normalRegs = let val transferRegs = (* Register.rax:: Register.eax:: Register.al:: *) Register.rbx:: Register.ebx:: Register.bl:: Register.rcx:: Register.ecx:: Register.cl:: Register.rdx:: Register.edx:: Register.dl:: Register.rdi:: Register.rsi:: (* Register.rsp:: Register.rbp:: *) Register.r8:: Register.r8w:: Register.r9:: Register.r9w:: Register.r10:: Register.r10w:: Register.r11:: Register.r11w:: (* Register.r12:: Register.r12w:: *) Register.r13:: Register.r13w:: Register.r14:: Register.r14w:: Register.r15:: Register.r15w:: nil val transferXmmRegs = XmmRegister.xmm1D:: XmmRegister.xmm1S:: XmmRegister.xmm2D:: XmmRegister.xmm2S:: XmmRegister.xmm3D:: XmmRegister.xmm3S:: XmmRegister.xmm4D:: XmmRegister.xmm4S:: XmmRegister.xmm5D:: XmmRegister.xmm5S:: XmmRegister.xmm6D:: XmmRegister.xmm6S:: XmmRegister.xmm7D:: XmmRegister.xmm7S:: nil in {frontierReg = Register.r12, stackTopReg = Register.rbp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.rax::Register.eax::Register.al::transferRegs | _ => [], transferXmmRegs = fn Entry.Jump _ => transferXmmRegs | Entry.CReturn _ => XmmRegister.xmm0D::XmmRegister.xmm0S::transferXmmRegs | _ => []} end val reserveRspRegs = let val transferRegs = (* Register.rax:: Register.eax:: Register.al:: *) Register.rbx:: Register.ebx:: Register.bl:: Register.rcx:: Register.ecx:: Register.cl:: Register.rdx:: Register.edx:: Register.dl:: Register.rdi:: Register.rsi:: (* Register.rsp:: Register.rbp:: *) Register.r8:: Register.r8w:: Register.r9:: Register.r9w:: Register.r10:: Register.r10w:: Register.r11:: Register.r11w:: (* Register.r12:: Register.r12w:: *) Register.r13:: Register.r13w:: Register.r14:: Register.r14w:: Register.r15:: Register.r15w:: nil val transferXmmRegs = XmmRegister.xmm8D:: XmmRegister.xmm8S:: XmmRegister.xmm9D:: XmmRegister.xmm9S:: XmmRegister.xmm10D:: XmmRegister.xmm10S:: XmmRegister.xmm11D:: XmmRegister.xmm11S:: XmmRegister.xmm12D:: XmmRegister.xmm12S:: XmmRegister.xmm13D:: XmmRegister.xmm13S:: XmmRegister.xmm14D:: XmmRegister.xmm14S:: nil in {frontierReg = Register.r12, stackTopReg = Register.rbp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.rax::Register.eax::Register.al::transferRegs | _ => [], transferXmmRegs = fn Entry.Jump _ => transferXmmRegs | Entry.CReturn _ => XmmRegister.xmm0D::XmmRegister.xmm0S::transferXmmRegs | _ => []} end val indexReg = amd64.Register.rax val stackTop = amd64MLton.gcState_stackTopContents val frontier = amd64MLton.gcState_frontierContents datatype gef = GEF of {generate : gef -> {label : Label.t, falling : bool, unique : bool} -> Assembly.t AppendList.t, effect : gef -> {label : Label.t, transfer : Transfer.t} -> Assembly.t AppendList.t, fall : gef -> {label : Label.t, live : LiveSet.t} -> Assembly.t AppendList.t} fun generateTransfers {chunk as Chunk.T {data, blocks, ...}, optimize: int, newProfileLabel: amd64.ProfileLabel.t -> amd64.ProfileLabel.t, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t, reserveRsp: bool} = let val {frontierReg, stackTopReg, transferRegs, transferXmmRegs} = if reserveRsp then reserveRspRegs else normalRegs val allClasses = !amd64MLton.Classes.allClasses val livenessClasses = !amd64MLton.Classes.livenessClasses val livenessClasses = ClassSet.+(livenessClasses, ClassSet.fromList [amd64MLton.Classes.StaticNonTemp, amd64MLton.Classes.CArg]) val nonlivenessClasses = ClassSet.-(allClasses, livenessClasses) val holdClasses = !amd64MLton.Classes.holdClasses val farflushClasses = ClassSet.-(nonlivenessClasses, holdClasses) val nearflushClasses = ClassSet.-(nonlivenessClasses, holdClasses) val runtimeClasses = !amd64MLton.Classes.runtimeClasses val cstaticClasses = !amd64MLton.Classes.cstaticClasses val heapClasses = !amd64MLton.Classes.heapClasses val ccallflushClasses = ClassSet.+(cstaticClasses, heapClasses) fun removeHoldMemLocs memlocs = MemLocSet.subset (memlocs, fn m => not (ClassSet.contains(holdClasses, MemLoc.class m))) val stackAssume = {register = stackTopReg, memloc = stackTop (), weight = 1024, sync = false, reserve = false} val frontierAssume = {register = frontierReg, memloc = frontier (), weight = 2048, sync = false, reserve = false} val cStackAssume = {register = Register.rsp, memloc = amd64MLton.c_stackPContents, weight = 2048, (* ??? *) sync = false, reserve = true} fun blockAssumes l = let val l = frontierAssume :: stackAssume :: l in Assembly.directive_assume {assumes = if reserveRsp then cStackAssume :: l else l} end fun runtimeTransfer live setup trans = AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = removeHoldMemLocs live, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), setup, AppendList.fromList [(Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = farflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], trans] fun farEntry l = AppendList.cons (blockAssumes [], l) fun farTransfer live setup trans = AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = removeHoldMemLocs live, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), setup, AppendList.fromList [(Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}), (Assembly.directive_xmmcache {caches = []}), (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = farflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], trans] val profileStackTopCommit' = amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton (stackTop ()), commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty} val profileStackTopCommit = if !Control.profile <> Control.ProfileNone then AppendList.single profileStackTopCommit' else AppendList.empty val _ = Assert.assert ("amd64GenerateTransfers.verifyLiveInfo", fn () => amd64Liveness.LiveInfo.verifyLiveInfo {chunk = chunk, liveInfo = liveInfo}) val _ = Assert.assert ("amd64GenerateTransfers.verifyJumpInfo", fn () => amd64JumpInfo.verifyJumpInfo {chunk = chunk, jumpInfo = jumpInfo}) val _ = Assert.assert ("amd64GenerateTransfers.verifyEntryTransfer", fn () => amd64EntryTransfer.verifyEntryTransfer {chunk = chunk}) local val {get: Label.t -> {block:Block.t}, set, destroy} = Property.destGetSetOnce (Label.plist, Property.initRaise ("gotoInfo", Label.layout)) val labels = List.fold (blocks, [], fn (block as Block.T {entry, ...}, labels) => let val label = Entry.label entry in set(label, {block = block}) ; label::labels end) fun loop labels = let val (labels, b) = List.fold (labels, ([], false), fn (label, (labels, b)) => case amd64JumpInfo.getNear (jumpInfo, label) of amd64JumpInfo.Count 0 => let val {block = Block.T {transfer, ...}} = get label in List.foreach (Transfer.nearTargets transfer, fn label => amd64JumpInfo.decNear (jumpInfo, label)); (labels, true) end | _ => (label::labels, b)) in if b then loop labels else List.map (labels, #block o get) end val blocks = loop labels val _ = destroy () in val chunk = Chunk.T {data = data, blocks = blocks} end val loopInfo = amd64LoopInfo.createLoopInfo {chunk = chunk, farLoops = false} val isLoopHeader = fn label => isLoopHeader(loopInfo, label) handle _ => false val liveTransfers = amd64LiveTransfers.computeLiveTransfers {chunk = chunk, transferRegs = transferRegs, transferXmmRegs = transferXmmRegs, liveInfo = liveInfo, jumpInfo = jumpInfo, loopInfo = loopInfo} val getLiveRegsTransfers = #1 o amd64LiveTransfers.getLiveTransfers val getLiveXmmRegsTransfers = #2 o amd64LiveTransfers.getLiveTransfers val {get = getLayoutInfo : Label.t -> Block.t option, set = setLayoutInfo, destroy = destLayoutInfo} = Property.destGetSet(Label.plist, Property.initRaise ("layoutInfo", Label.layout)) val _ = List.foreach (blocks, fn block as Block.T {entry, ...} => let val label = Entry.label entry in setLayoutInfo(label, SOME block) end) val {get = getProfileLabel : Label.t -> ProfileLabel.t option, set = setProfileLabel, destroy = destProfileLabel} = Property.destGetSetOnce (Label.plist, Property.initRaise ("profileLabel", Label.layout)) val _ = List.foreach (blocks, fn Block.T {entry, profileLabel, ...} => let val label = Entry.label entry in setProfileLabel(label, profileLabel) end) local val stack = ref [] val queue = ref (Queue.empty ()) in fun enque x = queue := Queue.enque(!queue, x) fun push x = stack := x::(!stack) fun deque () = (case (!stack) of [] => (case Queue.deque(!queue) of NONE => NONE | SOME(queue', x) => (queue := queue'; SOME x)) | x::stack' => (stack := stack'; SOME x)) end fun pushCompensationBlock {label, id} = let val label' = Label.new label val live = getLive(liveInfo, label) val profileLabel = getProfileLabel label val profileLabel' = Option.map (profileLabel, newProfileLabel) val block = Block.T {entry = Entry.jump {label = label'}, profileLabel = profileLabel', statements = (Assembly.directive_restoreregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet live, stackTop ()), frontier ()), id = id}):: nil, transfer = Transfer.goto {target = label}} in setLive(liveInfo, label', live); setProfileLabel(label', profileLabel'); incNear(jumpInfo, label'); Assert.assert("amd64GenerateTransfers.pushCompensationBlock", fn () => getNear(jumpInfo, label') = Count 1); amd64LiveTransfers.setLiveTransfersEmpty(liveTransfers, label'); setLayoutInfo(label', SOME block); push label'; label' end val c_stackP = amd64MLton.c_stackPContentsOperand fun cacheRsp () = if reserveRsp then AppendList.empty else AppendList.single ((* explicit cache in case there are no args *) Assembly.directive_cache {caches = [{register = Register.rsp, memloc = valOf (Operand.deMemloc c_stackP), reserve = true}]}) fun unreserveRsp () = if reserveRsp then AppendList.empty else AppendList.single (Assembly.directive_unreserve {registers = [Register.rsp]}) datatype z = datatype Entry.t datatype z = datatype Transfer.t fun generateAll (gef as GEF {effect,...}) {label, falling, unique} : Assembly.t AppendList.t = (case getLayoutInfo label of NONE => AppendList.empty | SOME (Block.T {entry, profileLabel, statements, transfer}) => let val _ = setLayoutInfo(label, NONE) (* val isLoopHeader = fn _ => false *) fun near label = let val align = if isLoopHeader label handle _ => false then AppendList.single (Assembly.pseudoop_p2align (Immediate.int 4, NONE, SOME (Immediate.int 7))) else if falling then AppendList.empty else AppendList.single (Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE)) val assumes = if falling andalso unique then AppendList.empty else (* near entry & live transfer assumptions *) AppendList.fromList [(blockAssumes (List.map (getLiveRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))), (Assembly.directive_xmmassume {assumes = (List.map (getLiveXmmRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))})] in AppendList.appends [align, AppendList.single (Assembly.label label), AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), assumes] end val pre = case entry of Jump {label} => near label | CReturn {dsts, frameInfo, func, label} => let fun getReturn () = if Vector.length dsts = 0 then AppendList.empty else let val srcs = Vector.fromList (List.map (Operand.cReturnTemps (CFunction.return func), #dst)) in (AppendList.fromList o Vector.fold2) (dsts, srcs, [], fn ((dst,dstsize),src,stmts) => case Size.class dstsize of Size.INT => (amd64.Assembly.instruction_mov {dst = dst, src = Operand.memloc src, size = dstsize})::stmts | Size.FLT => (amd64.Assembly.instruction_sse_movs {dst = dst, src = Operand.memloc src, size = dstsize})::stmts) end in case frameInfo of SOME fi => let val FrameInfo.T {size, frameLayoutsIndex} = fi val finish = AppendList.appends [let val stackTop = amd64MLton.gcState_stackTopContentsOperand () val bytes = amd64.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end, (* assignTo dst *) getReturn ()] in AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameLayoutsIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), if CFunction.maySwitchThreads func then (* entry from far assumptions *) farEntry finish else (* near entry & live transfer assumptions *) AppendList.append (AppendList.fromList [(blockAssumes (List.map (getLiveRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))), (Assembly.directive_xmmassume {assumes = (List.map (getLiveXmmRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))})], finish)] end | NONE => AppendList.append (near label, getReturn ()) end | Func {label,...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_global label, Assembly.pseudoop_hidden label, Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry AppendList.empty)] | Cont {label, frameInfo = FrameInfo.T {size, frameLayoutsIndex}, ...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameLayoutsIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry (let val stackTop = amd64MLton.gcState_stackTopContentsOperand () val bytes = amd64.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end))] | Handler {frameInfo = (FrameInfo.T {frameLayoutsIndex, size}), label, ...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameLayoutsIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry (let val stackTop = amd64MLton.gcState_stackTopContentsOperand () val bytes = amd64.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end))] val pre = AppendList.appends [if !Control.Native.commented > 1 then AppendList.single (Assembly.comment (Entry.toString entry)) else AppendList.empty, if !Control.Native.commented > 2 then AppendList.single (Assembly.comment (LiveSet.fold (getLive(liveInfo, label), "", fn (memloc, s) => concat [s, MemLoc.toString memloc, " "]))) else AppendList.empty, pre] val (statements,_) = List.foldr (statements, ([], Liveness.liveIn (livenessTransfer {transfer = transfer, liveInfo = liveInfo})), fn (assembly,(statements,live)) => let val Liveness.T {liveIn,dead, ...} = livenessAssembly {assembly = assembly, live = live} in (if LiveSet.isEmpty dead then assembly::statements else assembly:: (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}):: statements, liveIn) end) val statements = AppendList.fromList statements val transfer = effect gef {label = label, transfer = transfer} in AppendList.appends [pre, statements, transfer] end) and effectDefault (gef as GEF {fall,...}) {label, transfer} : Assembly.t AppendList.t = AppendList.append (if !Control.Native.commented > 1 then AppendList.single (Assembly.comment (Transfer.toString transfer)) else AppendList.empty, case transfer of Goto {target} => fall gef {label = target, live = getLive(liveInfo, target)} | Iff {condition, truee, falsee} => let val condition_neg = Instruction.condition_negate condition val truee_live = getLive(liveInfo, truee) val truee_live_length = LiveSet.size truee_live val falsee_live = getLive(liveInfo, falsee) val falsee_live_length = LiveSet.size falsee_live fun fall_truee () = let val id = Directive.Id.new () val falsee' = pushCompensationBlock {label = falsee, id = id}; in AppendList.append (AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = condition_neg, target = Operand.label falsee'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet falsee_live, stackTop ()), frontier ()), id = id}], (fall gef {label = truee, live = truee_live})) end fun fall_falsee () = let val id = Directive.Id.new () val truee' = pushCompensationBlock {label = truee, id = id}; in AppendList.append (AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = condition, target = Operand.label truee'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet truee_live, stackTop ()), frontier ()), id = id}], (fall gef {label = falsee, live = falsee_live})) end in case (getLayoutInfo truee, getLayoutInfo falsee) of (NONE, SOME _) => fall_falsee () | (SOME _, NONE) => fall_truee () | _ => let fun default' () = if truee_live_length <= falsee_live_length then fall_falsee () else fall_truee () fun default () = case (getNear(jumpInfo, truee), getNear(jumpInfo, falsee)) of (Count 1, Count 1) => default' () | (Count 1, _) => fall_truee () | (_, Count 1) => fall_falsee () | _ => default' () in case (getLoopDistance(loopInfo, label, truee), getLoopDistance(loopInfo, label, falsee)) of (NONE, NONE) => default () | (SOME _, NONE) => fall_truee () | (NONE, SOME _) => fall_falsee () | (SOME dtruee, SOME dfalsee) => (case Int.compare(dtruee, dfalsee) of EQUAL => default () | LESS => fall_falsee () | GREATER => fall_truee ()) end end | Switch {test, cases, default} => let val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val size = case Operand.size test of SOME size => size | NONE => Size.QUAD val default_live = getLive(liveInfo, default) val cases = Transfer.Cases.mapToList (cases, fn (k, target) => let val target_live = getLive(liveInfo, target) val id = Directive.Id.new () val target' = pushCompensationBlock {label = target, id = id} in AppendList.fromList [Assembly.instruction_cmp {src1 = test, src2 = Operand.immediate_word k, size = size}, Assembly.instruction_jcc {condition = Instruction.E, target = Operand.label target'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet target_live, stackTop ()), frontier ()), id = id}] end) in AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), AppendList.appends cases, if LiveSet.isEmpty dead then AppendList.empty else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}), (fall gef {label = default, live = default_live})] end | Tail {target, live} => (* flushing at far transfer *) (farTransfer live AppendList.empty (AppendList.single (Assembly.instruction_jmp {target = Operand.label target, absolute = false}))) | NonTail {target, live, return, handler, size} => let val _ = enque return val _ = case handler of SOME handler => enque handler | NONE => () val stackTopTemp = amd64MLton.stackTopTempContentsOperand () val stackTopTempMinusWordDeref' = amd64MLton.stackTopTempMinusWordDeref () val stackTopTempMinusWordDeref = amd64MLton.stackTopTempMinusWordDerefOperand () val stackTop = amd64MLton.gcState_stackTopContentsOperand () val stackTopMinusWordDeref' = amd64MLton.gcState_stackTopMinusWordDeref () val stackTopMinusWordDeref = amd64MLton.gcState_stackTopMinusWordDerefOperand () val bytes = amd64.Operand.immediate_int size val liveReturn = amd64Liveness.LiveInfo.getLive(liveInfo, return) val liveHandler = case handler of SOME handler => amd64Liveness.LiveInfo.getLive(liveInfo, handler) | _ => LiveSet.empty val live = MemLocSet.unions [live, LiveSet.toMemLocSet liveReturn, LiveSet.toMemLocSet liveHandler] in (* flushing at far transfer *) (farTransfer live (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackTop + bytes *) amd64.Assembly.instruction_mov {dst = stackTopTemp, src = stackTop, size = pointerSize}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTopTemp, src = bytes, size = pointerSize}, (* *(stackTopTemp - WORD_SIZE) = return *) amd64.Assembly.instruction_lea {dst = stackTopTempMinusWordDeref, src = Operand.memloc_label return, size = pointerSize}, amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopTempMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, (* stackTop = stackTopTemp *) amd64.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, (* *(stackTop - WORD_SIZE) = return *) amd64.Assembly.instruction_lea {dst = stackTopMinusWordDeref, src = Operand.memloc_label return, size = pointerSize}, amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}])) (AppendList.single (Assembly.instruction_jmp {target = Operand.label target, absolute = false}))) end | Return {live} => let val stackTopMinusWordDeref = amd64MLton.gcState_stackTopMinusWordDerefOperand () in (* flushing at far transfer *) (farTransfer live AppendList.empty (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (amd64.Assembly.instruction_jmp {target = stackTopMinusWordDeref, absolute = true}))) end | Raise {live} => let val exnStack = amd64MLton.gcState_exnStackContentsOperand () val stackTopTemp = amd64MLton.stackTopTempContentsOperand () val stackTop = amd64MLton.gcState_stackTopContentsOperand () val stackBottom = amd64MLton.gcState_stackBottomContentsOperand () in (* flushing at far transfer *) (farTransfer live (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackBottom + exnStack *) amd64.Assembly.instruction_mov {dst = stackTopTemp, src = stackBottom, size = pointerSize}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTopTemp, src = exnStack, size = pointerSize}, (* stackTop = stackTopTemp *) amd64.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop = stackBottom + exnStack *) amd64.Assembly.instruction_mov {dst = stackTop, src = stackBottom, size = pointerSize}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = exnStack, size = pointerSize}])) (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (amd64.Assembly.instruction_jmp {target = amd64MLton.gcState_stackTopMinusWordDerefOperand (), absolute = true}))) end | CCall {args, frameInfo, func, return} => let datatype z = datatype CFunction.Convention.t datatype z = datatype CFunction.SymbolScope.t datatype z = datatype CFunction.Target.t val CFunction.T {convention=_, maySwitchThreads, modifiesFrontier, readsStackTop, return = returnTy, symbolScope, target, writesStackTop, ...} = func val stackTopMinusWordDeref = amd64MLton.gcState_stackTopMinusWordDerefOperand () val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val c_stackP = amd64MLton.c_stackPContentsOperand val c_stackPDerefWord = amd64MLton.c_stackPDerefWordOperand val c_stackPDerefFloat = amd64MLton.c_stackPDerefFloatOperand val c_stackPDerefDouble = amd64MLton.c_stackPDerefDoubleOperand val applyFFTempFun = amd64MLton.applyFFTempFunContentsOperand val applyFFTempRegArg = amd64MLton.applyFFTempRegArgContents val applyFFTempXmmRegArg = amd64MLton.applyFFTempXmmRegArgContents val (fptrArg, args) = case target of Direct _ => (AppendList.empty, args) | Indirect => let val (fptrArg, args) = case args of fptrArg::args => (fptrArg, args) | _ => Error.bug "amd64GenerateTransfers.generateAll: CCall" in (AppendList.single (Assembly.instruction_mov {src = #1 fptrArg, dst = applyFFTempFun, size = #2 fptrArg}), args) end val win64 = case !Control.Target.os of MLton.Platform.OS.Cygwin => true | MLton.Platform.OS.MinGW => true | _ => false val (setup_args, (reg_args, xmmreg_args), size_stack_args, _) = List.fold (args, (AppendList.empty, ([],[]),0, (if win64 then [Register.rcx,Register.rdx, Register.r8,Register.r9] else [Register.rdi,Register.rsi,Register.rdx, Register.rcx,Register.r8,Register.r9], if win64 then [(XmmRegister.xmm0D,XmmRegister.xmm0S), (XmmRegister.xmm1D,XmmRegister.xmm1S), (XmmRegister.xmm2D,XmmRegister.xmm2S), (XmmRegister.xmm3D,XmmRegister.xmm3S)] else [(XmmRegister.xmm0D,XmmRegister.xmm0S), (XmmRegister.xmm1D,XmmRegister.xmm1S), (XmmRegister.xmm2D,XmmRegister.xmm2S), (XmmRegister.xmm3D,XmmRegister.xmm3S), (XmmRegister.xmm4D,XmmRegister.xmm4S), (XmmRegister.xmm5D,XmmRegister.xmm5S), (XmmRegister.xmm6D,XmmRegister.xmm6S), (XmmRegister.xmm7D,XmmRegister.xmm7S)])), fn ((arg, size), (setup_args, (reg_args, xmmreg_args), size_stack_args, (regs, xmmregs))) => let fun prune [] = [] | prune (x::r) = if win64 then r else (x::r) val (setup_arg, (reg_args, xmmreg_args), size_stack_arg, (regs, xmmregs)) = if Size.eq (size, Size.DBLE) orelse Size.eq (size, Size.SNGL) then (case xmmregs of xmmreg::xmmregs => let val i = List.length xmmregs val mem = applyFFTempXmmRegArg (size, i) val xmmreg = if Size.eq (size, Size.DBLE) then #1 xmmreg else #2 xmmreg in (AppendList.fromList [Assembly.instruction_sse_movs {src = arg, dst = Operand.memloc mem, size = size}, Assembly.directive_xmmcache {caches = [{register = xmmreg, memloc = mem, reserve = true}]}], (reg_args, (mem, xmmreg)::xmmreg_args), 0, (prune regs, xmmregs)) end | [] => (AppendList.fromList [Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 8, size = pointerSize}, Assembly.instruction_sse_movs {src = arg, dst = if Size.eq (size, Size.DBLE) then c_stackPDerefDouble else c_stackPDerefFloat, size = size}], (reg_args, xmmreg_args), 8, (regs, xmmregs))) else if Size.eq (size, Size.BYTE) orelse Size.eq (size, Size.WORD) orelse Size.eq (size, Size.LONG) orelse Size.eq (size, Size.QUAD) then (case regs of reg::regs => let val i = List.length regs val mem = applyFFTempRegArg i in (AppendList.fromList [if Size.lt (size, Size.QUAD) then Assembly.instruction_movx {oper = Instruction.MOVZX, src = arg, dst = Operand.memloc mem, srcsize = size, dstsize = wordSize} else Assembly.instruction_mov {src = arg, dst = Operand.memloc mem, size = size}, Assembly.directive_cache {caches = [{register = reg, memloc = mem, reserve = true}]}], ((mem,reg)::reg_args, xmmreg_args), 0, (regs, prune xmmregs)) end | [] => (AppendList.fromList [Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 8, size = pointerSize}, if Size.lt (size, Size.QUAD) then Assembly.instruction_movx {oper = Instruction.MOVZX, src = arg, dst = c_stackPDerefWord, srcsize = size, dstsize = wordSize} else Assembly.instruction_mov {src = arg, dst = c_stackPDerefWord, size = size}], (reg_args, xmmreg_args), 8, (regs, xmmregs))) else Error.bug "amd64GenerateTransfers.generateAll: CCall" in (AppendList.append (setup_arg, setup_args), (reg_args, xmmreg_args), size_stack_arg + size_stack_args, (regs, xmmregs)) end) val (setup_args, size_stack_args) = let val space = 16 - (size_stack_args mod 16) in if space = 16 then (setup_args, size_stack_args) else (AppendList.append (AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int space, size = pointerSize}), setup_args), size_stack_args + space) end (* Allocate shadow space *) val (setup_args, size_stack_args) = if win64 then (AppendList.append (setup_args, AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 32, size = pointerSize})), size_stack_args + 32) else (setup_args, size_stack_args) (* val reserve_args = AppendList.fromList [amd64.Assembly.directive_xmmcache {caches = List.map (xmmreg_args, fn (mem,reg) => {register = reg, memloc = mem, reserve = true})}, amd64.Assembly.directive_cache {caches = List.map (reg_args, fn (mem,reg) => {register = reg, memloc = mem, reserve = true})}] *) val flush = case frameInfo of SOME (FrameInfo.T {size, ...}) => (* Entering runtime *) let val return = valOf return val _ = enque return val stackTopTemp = amd64MLton.stackTopTempContentsOperand () val stackTopTempMinusWordDeref' = amd64MLton.stackTopTempMinusWordDeref () val stackTopTempMinusWordDeref = amd64MLton.stackTopTempMinusWordDerefOperand () val stackTop = amd64MLton.gcState_stackTopContentsOperand () val stackTopMinusWordDeref' = amd64MLton.gcState_stackTopMinusWordDeref () val stackTopMinusWordDeref = amd64MLton.gcState_stackTopMinusWordDerefOperand () val bytes = amd64.Operand.immediate_int size val live = amd64Liveness.LiveInfo.getLive(liveInfo, return) val {defs, ...} = Transfer.uses_defs_kills transfer val live = List.fold (defs, live, fn (oper,live) => case Operand.deMemloc oper of SOME memloc => LiveSet.remove (live, memloc) | NONE => live) in (runtimeTransfer (LiveSet.toMemLocSet live) (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackTop + bytes *) amd64.Assembly.instruction_mov {dst = stackTopTemp, src = stackTop, size = pointerSize}, amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTopTemp, src = bytes, size = pointerSize}, (* *(stackTopTemp - WORD_SIZE) = return *) amd64.Assembly.instruction_lea {dst = stackTopTempMinusWordDeref, src = Operand.memloc_label return, size = pointerSize}, amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopTempMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, (* stackTop = stackTopTemp *) amd64.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop += bytes *) amd64.Assembly.instruction_binal {oper = amd64.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, (* *(stackTop - WORD_SIZE) = return *) amd64.Assembly.instruction_lea {dst = stackTopMinusWordDeref, src = Operand.memloc_label return, size = pointerSize}, amd64.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}])) (AppendList.single (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = runtimeClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}))) end | NONE => AppendList.single (Assembly.directive_force {commit_memlocs = let val s = MemLocSet.empty val s = if modifiesFrontier then MemLocSet.add (s, frontier ()) else s val s = if readsStackTop then MemLocSet.add (s, stackTop ()) else s in s end, commit_classes = ccallflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}) val call = case target of Direct name => let datatype z = datatype MLton.Platform.OS.t datatype z = datatype Control.Format.t val label = fn () => Label.fromString name (* how to access imported functions: *) (* Windows rewrites the symbol __imp__name *) val coff = fn () => Label.fromString ("_imp__" ^ name) val macho = fn () => label () (* @PLT is implicit *) val elf = fn () => Label.fromString (name ^ "@PLT") val importLabel = fn () => case !Control.Target.os of Cygwin => coff () | Darwin => macho () | MinGW => coff () | _ => elf () val direct = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.label (label ()), absolute = false}] val plt = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.label (importLabel ()), absolute = false}] val indirect = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.memloc_label (importLabel ()), absolute = true}] in case (symbolScope, !Control.Target.os, !Control.positionIndependent) of (* Private functions can be easily reached * with a direct (rip-relative) call. *) (Private, _, _) => direct () (* Call at the point of definition. *) | (Public, MinGW, _) => direct () | (Public, Cygwin, _) => direct () | (Public, Darwin, _) => direct () (* ELF requires PLT even for public fns. *) | (Public, _, true) => plt () | (Public, _, false) => direct () (* Windows always does indirect calls to * imported functions. The importLabel has * the function address written to it. *) | (External, MinGW, _) => indirect () | (External, Cygwin, _) => indirect () | (External, Darwin, _) => plt () (* ELF systems (and darwin too) create * procedure lookup tables (PLT) which * proxy the call to libraries. The PLT * does not contain an address, but instead * a stub function. Often the PLT is auto- * matically created. This applies to all * darwin-x86_64 function calls and calls * made from an ELF executable. *) | (External, _, true) => plt () | (External, _, false) => direct () end | Indirect => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = applyFFTempFun, absolute = true}] val unreserve_args = AppendList.fromList [amd64.Assembly.directive_xmmunreserve {registers = List.map (xmmreg_args, #2)}, amd64.Assembly.directive_unreserve {registers = List.map (reg_args, #2)}] val kill = if isSome frameInfo then AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = runtimeClasses}) else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = let val s = MemLocSet.empty val s = if modifiesFrontier then MemLocSet.add (s, frontier ()) else s val s = if writesStackTop then MemLocSet.add (s, stackTop ()) else s in s end, dead_classes = ccallflushClasses}) val getResult = AppendList.single (Assembly.directive_return {returns = Operand.cReturnTemps returnTy}) val fixCStack = if size_stack_args > 0 then (AppendList.single (Assembly.instruction_binal {oper = Instruction.ADD, dst = c_stackP, src = Operand.immediate_int size_stack_args, size = pointerSize})) else AppendList.empty val continue = if maySwitchThreads then (* Returning from runtime *) (farTransfer MemLocSet.empty AppendList.empty (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (amd64.Assembly.instruction_jmp {target = stackTopMinusWordDeref, absolute = true}))) else case return of NONE => AppendList.empty | SOME l => (if isSome frameInfo then (* Don't need to trampoline, * since didn't switch threads, * but can't fall because * frame layout data is prefixed * to l's code; use fallNone * to force a jmp with near * jump assumptions. *) fallNone else fall) gef {label = l, live = getLive (liveInfo, l)} in AppendList.appends [cacheRsp (), fptrArg, setup_args, (*reserve_args,*) flush, call, unreserve_args, kill, getResult, fixCStack, unreserveRsp (), continue] end) and effectJumpTable (gef as GEF {...}) {label, transfer} : Assembly.t AppendList.t = case transfer of Switch {test, cases, default} => let val ws = case Operand.size test of SOME Size.BYTE => WordSize.word8 | SOME Size.WORD => WordSize.word16 | SOME Size.LONG => WordSize.word32 | SOME Size.QUAD => WordSize.word64 | _ => Error.bug "amd64GenerateTransfers.effectJumpTable: Switch" val zero = WordX.zero ws val one = WordX.one ws val two = WordX.add (one, one) fun even w = WordX.isZero (WordX.mod (w, two, {signed = false})) fun incFn w = WordX.add (w, one) fun decFn w = WordX.sub (w, one) fun halfFn w = WordX.div (w, two, {signed = false}) fun ltFn (w1, w2) = WordX.lt (w1, w2, {signed = false}) val min = WordX.min (ws, {signed = false}) fun minFn (w1, w2) = if WordX.lt (w1, w2, {signed = false}) then w1 else w2 val max = WordX.max (ws, {signed = false}) fun maxFn (w1, w2) = if WordX.gt (w1, w2, {signed = false}) then w1 else w2 fun range (w1, w2) = WordX.sub (w2, w1) val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} fun reduce(cases) = let fun reduce' cases = let val (minK,maxK,length, allEven,allOdd) = List.fold (cases, (max, min, 0, true, true), fn ((k,_), (minK,maxK,length, allEven,allOdd)) => let val isEven = even k in (minFn(k,minK), maxFn(k,maxK), length + 1, allEven andalso isEven, allOdd andalso not isEven) end) in if length > 1 andalso (allEven orelse allOdd) then let val f = if allOdd then halfFn o decFn else halfFn val cases' = List.map (cases, fn (k,target) => (f k, target)) val (cases'', minK'', maxK'', length'', shift'', mask'') = reduce' cases' val shift' = 1 + shift'' val mask' = WordX.orb (WordX.lshift(mask'', WordX.one WordSize.word64), if allOdd then WordX.one WordSize.word64 else WordX.zero WordSize.word64) in (cases'', minK'', maxK'', length'', shift', mask') end else (cases, minK, maxK, length, 0, WordX.zero WordSize.word64) end in reduce' cases end fun doitTable(cases, minK, _, rangeK, shift, mask) = let val jump_table_label = Label.newString "jumpTable" val idT = Directive.Id.new () val defaultT = Promise.delay (fn () => let val _ = incNear(jumpInfo, default) in pushCompensationBlock {label = default, id = idT} end) val rec filler = fn ([],_) => [] | (cases as (i,target)::cases',j) => if WordX.equals (i, j) then let val target' = pushCompensationBlock {label = target, id = idT} in (Immediate.label target'):: (filler(cases', incFn j)) end else (Immediate.label (Promise.force defaultT)):: (filler(cases, incFn j)) val jump_table = filler (cases, minK) val idD = Directive.Id.new () val defaultD = pushCompensationBlock {label = default, id = idD} val default_live = getLive(liveInfo, default) val live = List.fold (cases, default_live, fn ((_,target), live) => LiveSet.+(live, getLive(liveInfo, target))) val indexTemp = MemLoc.imm {base = Immediate.label (Label.fromString "indexTemp"), index = Immediate.zero, scale = Scale.Eight, size = Size.QUAD, class = MemLoc.Class.Temp} val checkTemp = MemLoc.imm {base = Immediate.label (Label.fromString "checkTemp"), index = Immediate.zero, scale = Scale.Eight, size = Size.QUAD, class = MemLoc.Class.Temp} val address = MemLoc.basic {base = Immediate.label jump_table_label, index = indexTemp, scale = Scale.Eight, size = Size.QUAD, class = MemLoc.Class.Code} val size = case Operand.size test of SOME size => size | NONE => Size.QUAD val indexTemp' = indexTemp val indexTemp = Operand.memloc indexTemp val checkTemp' = checkTemp val checkTemp = Operand.memloc checkTemp val address = Operand.memloc address in AppendList.appends [if Size.lt(size, Size.QUAD) then AppendList.single (Assembly.instruction_movx {oper = Instruction.MOVZX, src = test, srcsize = size, dst = indexTemp, dstsize = Size.QUAD}) else AppendList.single (Assembly.instruction_mov {src = test, dst = indexTemp, size = Size.QUAD}), if LiveSet.isEmpty dead then AppendList.empty else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}), if shift > 0 then let val idC = Directive.Id.new () val defaultC = pushCompensationBlock {label = default, id = idC} val _ = incNear(jumpInfo, default) in AppendList.appends [AppendList.fromList [Assembly.instruction_mov {src = indexTemp, dst = checkTemp, size = Size.QUAD}, Assembly.instruction_binal {oper = Instruction.AND, src = Operand.immediate_word (ones (shift, WordSize.word64)), dst = checkTemp, size = Size.QUAD}], if WordX.isZero mask then AppendList.empty else AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, src = Operand.immediate_word mask, dst = checkTemp, size = Size.QUAD}), AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.singleton checkTemp', dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = Instruction.NZ, target = Operand.label defaultC}, Assembly.directive_saveregalloc {id = idC, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet default_live, stackTop ()), frontier ())}, Assembly.instruction_sral {oper = Instruction.SAR, count = Operand.immediate_int shift, dst = indexTemp, size = Size.QUAD}]] end else AppendList.empty, if WordX.equals (minK, zero) then AppendList.empty else AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, src = Operand.immediate_word minK, dst = indexTemp, size = Size.QUAD}), AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.directive_cache {caches = [{register = indexReg, memloc = indexTemp', reserve = false}]}, Assembly.instruction_cmp {src1 = indexTemp, src2 = Operand.immediate_word rangeK, size = Size.QUAD}, Assembly.instruction_jcc {condition = Instruction.A, target = Operand.label defaultD}, Assembly.directive_saveregalloc {id = idD, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet default_live, stackTop ()), frontier ())}, Assembly.instruction_jmp {target = address, absolute = true}, Assembly.directive_saveregalloc {id = idT, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet live, stackTop ()), frontier ())}, Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.singleton indexTemp', dead_classes = ClassSet.empty}], AppendList.fromList [Assembly.pseudoop_data (), Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.label jump_table_label, Assembly.pseudoop_quad jump_table, Assembly.pseudoop_text ()]] end fun doit(cases) = let val (cases, minK, maxK, length, shift, mask) = reduce(cases) val rangeK = range(minK,maxK) in if length >= 8 andalso WordX.lt (WordX.div(rangeK,two,{signed=false}), WordX.fromIntInf (IntInf.fromInt length, ws), {signed = false}) then let val cases = List.insertionSort (cases, fn ((k,_),(k',_)) => ltFn(k,k')) in doitTable(cases, minK, maxK, rangeK, shift, mask) end else effectDefault gef {label = label, transfer = transfer} end in case cases of Transfer.Cases.Word cases => doit cases end | _ => effectDefault gef {label = label, transfer = transfer} and fallNone (GEF {...}) {label, live} : Assembly.t AppendList.t = let val liveRegsTransfer = getLiveRegsTransfers (liveTransfers, label) val liveXmmRegsTransfer = getLiveXmmRegsTransfers (liveTransfers, label) val live = List.fold (liveRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) val live = List.fold (liveXmmRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) fun default () = AppendList.fromList ((* flushing at near transfer *) (Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}):: (Assembly.directive_xmmcache {caches = List.map (liveXmmRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}):: (Assembly.directive_cache {caches = List.map (liveRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}):: (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}):: (Assembly.instruction_jmp {target = Operand.label label, absolute = false}):: (Assembly.directive_unreserve {registers = (stackTopReg):: (frontierReg):: (List.map (liveRegsTransfer, fn (_,register,_) => register))}):: (Assembly.directive_xmmunreserve {registers = (List.map (liveXmmRegsTransfer, fn (_,register,_) => register))}):: nil) in case getLayoutInfo label of NONE => default () | SOME (Block.T {...}) => (push label; default ()) end and fallDefault (gef as GEF {generate,...}) {label, live} : Assembly.t AppendList.t = let datatype z = datatype amd64JumpInfo.status val liveRegsTransfer = getLiveRegsTransfers (liveTransfers, label) val liveXmmRegsTransfer = getLiveXmmRegsTransfers (liveTransfers, label) val live = List.fold (liveRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) val live = List.fold (liveXmmRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) fun default jmp = AppendList.appends [AppendList.fromList [(* flushing at near transfer *) (Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}), (Assembly.directive_cache {caches = List.map (liveRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}), (Assembly.directive_xmmcache {caches = List.map (liveXmmRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}), (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], if jmp then AppendList.single (Assembly.instruction_jmp {target = Operand.label label, absolute = false}) else AppendList.empty, AppendList.fromList [(Assembly.directive_unreserve {registers = (stackTopReg):: (frontierReg):: (List.map (liveRegsTransfer, fn (_,register,_) => register))}), (Assembly.directive_xmmunreserve {registers = (List.map (liveXmmRegsTransfer, fn (_,register,_) => register))})]] in case getLayoutInfo label of NONE => default true | SOME (Block.T {...}) => (case getNear(jumpInfo, label) of Count 1 => generate gef {label = label, falling = true, unique = true} | _ => AppendList.append (default false, AppendList.cons (Assembly.directive_reset (), (generate gef {label = label, falling = true, unique = false})))) end fun make {generate, effect, fall} = generate (GEF {generate = generate, effect = effect, fall = fall}) val generate = case optimize of 0 => make {generate = generateAll, effect = effectDefault, fall = fallNone} | _ => make {generate = generateAll, effect = effectJumpTable, fall = fallDefault} val _ = List.foreach (blocks, fn Block.T {entry, ...} => (case entry of Func {label, ...} => enque label | _ => ())) fun doit () : Assembly.t list list = (case deque () of NONE => [] | SOME label => (case AppendList.toList (generate {label = label, falling = false, unique = false}) of [] => doit () | block => block::(doit ()))) val assembly = doit () val _ = destLayoutInfo () val _ = destProfileLabel () val assembly = [Assembly.pseudoop_text ()]::assembly val assembly = if List.isEmpty data then assembly else data::assembly in assembly end val (generateTransfers, generateTransfers_msg) = tracerTop "generateTransfers" generateTransfers fun generateTransfers_totals () = (generateTransfers_msg (); Control.indent (); amd64Liveness.LiveInfo.verifyLiveInfo_msg (); amd64JumpInfo.verifyJumpInfo_msg (); amd64EntryTransfer.verifyEntryTransfer_msg (); amd64LoopInfo.createLoopInfo_msg (); amd64LiveTransfers.computeLiveTransfers_totals (); Control.unindent ()) end mlton-20100608/mlton/codegen/amd64-codegen/amd64-generate-transfers.sig0000644000076600000240000000232511404435625024053 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_GENERATE_TRANSFERS_STRUCTS = sig structure amd64 : AMD64 structure amd64MLton : AMD64_MLTON sharing amd64 = amd64MLton.amd64 structure amd64Liveness : AMD64_LIVENESS sharing amd64 = amd64Liveness.amd64 structure amd64JumpInfo : AMD64_JUMP_INFO sharing amd64 = amd64JumpInfo.amd64 structure amd64LoopInfo : AMD64_LOOP_INFO sharing amd64 = amd64LoopInfo.amd64 structure amd64EntryTransfer : AMD64_ENTRY_TRANSFER sharing amd64 = amd64EntryTransfer.amd64 end signature AMD64_GENERATE_TRANSFERS = sig include AMD64_GENERATE_TRANSFERS_STRUCTS val generateTransfers: {chunk: amd64.Chunk.t, optimize: int, newProfileLabel: amd64.ProfileLabel.t -> amd64.ProfileLabel.t, liveInfo: amd64Liveness.LiveInfo.t, jumpInfo: amd64JumpInfo.t, reserveRsp: bool} -> amd64.Assembly.t list list val generateTransfers_totals : unit -> unit end mlton-20100608/mlton/codegen/amd64-codegen/amd64-jump-info.fun0000644000076600000240000000730011404435625022164 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64JumpInfo(S: AMD64_JUMP_INFO_STRUCTS) : AMD64_JUMP_INFO = struct open S open amd64 val tracer = amd64.tracer datatype status = Count of int | None val status_eq = fn (None , None ) => true | (Count i1, Count i2) => i1 = i2 | _ => false val status_toString = fn None => "None" | Count i => concat ["Count ", Int.toString i] datatype t = T of {get: Label.t -> status ref} fun newJumpInfo () = let val {get : Label.t -> status ref, ...} = Property.get(Label.plist, Property.initFun (fn _ => ref (Count 0))) in T {get = get} end local fun doit (status_ref, maybe_fn) = case !status_ref of None => () | Count i => status_ref := (maybe_fn i) in fun incNear (T {get}, label) = doit (get label, fn i => Count (i+1)) fun decNear (T {get}, label) = doit (get label, fn i => Count (i-1)) fun forceNear (T {get}, label) = doit (get label, fn _ => None) end fun getNear (T {get}, label) = !(get label) fun completeJumpInfo {chunk = Chunk.T {blocks, ...}, jumpInfo: t} = List.foreach (blocks, fn Block.T {entry, transfer,...} => (case entry of Entry.Jump _ => () | Entry.Func {label, ...} => forceNear (jumpInfo, label) | Entry.Cont {label, ...} => forceNear (jumpInfo, label) | Entry.Handler {label, ...} => forceNear (jumpInfo, label) | Entry.CReturn {label, func, ...} => if CFunction.maySwitchThreads func then forceNear (jumpInfo, label) else (); List.foreach (Transfer.nearTargets transfer, fn label => incNear (jumpInfo, label)))) val (completeJumpInfo, completeJumpInfo_msg) = tracer "completeJumpInfo" completeJumpInfo fun verifyJumpInfo {chunk as Chunk.T {blocks, ...}, jumpInfo: t} = let local val {get : Label.t -> status ref, destroy} = Property.destGet(Label.plist, Property.initFun (fn _ => ref (Count 0))) in val jumpInfo' = T {get = get} val destroy = destroy end val _ = completeJumpInfo {chunk = chunk, jumpInfo = jumpInfo'} val verified = List.forall (blocks, fn Block.T {entry,...} => let val label = Entry.label entry in if status_eq(getNear(jumpInfo, label), getNear(jumpInfo', label)) then true else (print "verifyJumpInfo: "; print (Label.toString label); print "\n"; print "jumpInfo: "; print (status_toString (getNear(jumpInfo, label))); print "\n"; print "jumpInfo': "; print (status_toString (getNear(jumpInfo', label))); print "\n"; false) end) val _ = destroy () in verified end val (verifyJumpInfo, verifyJumpInfo_msg) = tracer "verifyJumpInfo" verifyJumpInfo end mlton-20100608/mlton/codegen/amd64-codegen/amd64-jump-info.sig0000644000076600000240000000166011404435625022161 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_JUMP_INFO_STRUCTS = sig structure amd64 : AMD64 end signature AMD64_JUMP_INFO = sig include AMD64_JUMP_INFO_STRUCTS datatype status = Count of int | None type t val newJumpInfo : unit -> t val completeJumpInfo : {chunk: amd64.Chunk.t, jumpInfo: t} -> unit val completeJumpInfo_msg : unit -> unit val verifyJumpInfo : {chunk: amd64.Chunk.t, jumpInfo: t} -> bool val verifyJumpInfo_msg : unit -> unit val incNear : t * amd64.Label.t -> unit val decNear : t * amd64.Label.t -> unit val getNear : t * amd64.Label.t -> status end mlton-20100608/mlton/codegen/amd64-codegen/amd64-live-transfers.fun0000644000076600000240000015233111404435625023231 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * Some of this doesn't make sense if we track the liveness of the GCHold class. * Need to update the enque'' of returns, handlers of NonTail and Runtime * so they reflect what happens at these transfers; (i.e., stackTop and frontier * are defed on return from NonTail). *) functor amd64LiveTransfers(S: AMD64_LIVE_TRANSFERS_STRUCTS) : AMD64_LIVE_TRANSFERS = struct open S open amd64 local open Runtime in structure CFunction = CFunction end structure LiveSet = amd64Liveness.LiveSet structure LiveInfo = amd64Liveness.LiveInfo open amd64JumpInfo open amd64LoopInfo val track = amd64Liveness.track val tracerTop = amd64.tracerTop fun temp_uses_defs {uses : Operand.t list, defs : Operand.t list} = let val baseUses = List.fold (uses, MemLocSet.empty, fn (operand, baseUses) => case Operand.deMemloc operand of SOME memloc => if amd64Liveness.track memloc then MemLocSet.add(baseUses, memloc) else baseUses | NONE => baseUses) val tempUses = let fun doit (operands, tempUses) = List.fold (operands, tempUses, fn (operand, tempUses) => case Operand.deMemloc operand of SOME memloc => List.fold(MemLoc.utilized memloc, tempUses, fn (memloc, tempUses) => if amd64Liveness.track memloc then MemLocSet.add(tempUses, memloc) else tempUses) | NONE => tempUses) in doit(defs, doit(uses, baseUses)) end val baseDefs = List.fold (defs, MemLocSet.empty, fn (operand, baseDefs) => case Operand.deMemloc operand of SOME memloc => if amd64Liveness.track memloc then MemLocSet.add(baseDefs, memloc) else baseDefs | NONE => baseDefs) val tempDefs = baseDefs in {uses = tempUses, defs = tempDefs} end datatype t = T of {get: Label.t -> ((MemLoc.t * Register.t * bool) list * (MemLoc.t * XmmRegister.t * bool) list), set: Label.t * ((MemLoc.t * Register.t * bool) list * (MemLoc.t * XmmRegister.t * bool) list) -> unit} local in structure I' = struct open Int fun sign x = if x = 0 then 0 else if x > 0 then 1 else ~1 end structure I = struct datatype t = NegInfinity | Finite of I'.t | PosInfinity val toString = fn NegInfinity => "-inf" | Finite n => I'.toString n | PosInfinity => "+inf" val zero = Finite (I'.zero) fun NegInfinity < NegInfinity = false | NegInfinity < _ = true | (Finite _) < NegInfinity = false | (Finite x) < (Finite y) = I'.<(x,y) | (Finite _) < PosInfinity = true | PosInfinity < _ = false fun NegInfinity + PosInfinity = zero | NegInfinity + _ = NegInfinity | (Finite _) + NegInfinity = NegInfinity | (Finite x) + (Finite y) = ((Finite (I'.+(x,y))) handle Overflow => if x > 0 then PosInfinity else NegInfinity) | (Finite _) + PosInfinity = PosInfinity | PosInfinity + NegInfinity = zero | PosInfinity + _ = PosInfinity fun NegInfinity * NegInfinity = PosInfinity | NegInfinity * (Finite x) = (case I'.sign x of ~1 => PosInfinity | 0 => zero | _ => NegInfinity) | NegInfinity * PosInfinity = NegInfinity | (Finite x) * NegInfinity = (case I'.sign x of ~1 => PosInfinity | 0 => zero | _ => NegInfinity) | (Finite x) * (Finite y) = ((Finite (I'.*(x, y))) handle Overflow => (case (I'.sign x, I'.sign y) of (~1, ~1) => PosInfinity | (1, ~1) => NegInfinity | (~1, 1) => NegInfinity | _ => PosInfinity)) | (Finite x) * PosInfinity = (case I'.sign x of ~1 => NegInfinity | 0 => zero | _ => PosInfinity) | PosInfinity * NegInfinity = NegInfinity | PosInfinity * (Finite x) = (case I'.sign x of ~1 => NegInfinity | 0 => zero | _ => PosInfinity) | PosInfinity * PosInfinity = PosInfinity end end fun computeLiveTransfers {chunk = Chunk.T {blocks,...}, transferRegs : Entry.t -> Register.t list, transferXmmRegs : Entry.t -> XmmRegister.t list, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t, loopInfo : amd64LoopInfo.t} = let val (useLF, useB, sync) = case !Control.Native.liveTransfer of 1 => (false, false, false) | 2 => (false, false, true) | 3 => (false, true, false) | 4 => (false, true, true) | 5 => (true, false, false) | 6 => (true, false, true) | 7 => (true, true, false) | _ => (true, true, true) val cutoff = !Control.Native.cutoff datatype u = Position of I.t | Length of I'.t val {get = getInfo : Label.t -> {block: Block.t, pred: Label.t list ref, succ: Label.t list ref, live: {memloc: MemLoc.t, distanceF': u option ref, distanceF: (I.t * Label.t option) option ref, distanceB': u option ref, distanceB: (I.t * Label.t option) option ref} vector, liveTransfers: ((MemLoc.t * Register.t * bool ref) list * (MemLoc.t * XmmRegister.t * bool ref) list) option ref, defed: MemLocSet.t option ref}, set = setInfo, destroy = destInfo} = Property.destGetSetOnce (Label.plist, Property.initRaise ("amd64LiveTransfers:getInfo", Label.layout)) val (labels, funcs) = List.fold (blocks, ([], []), fn (block as Block.T {entry, transfer, ...}, (labels, funcs)) => let val label = Entry.label entry val succ = Transfer.nearTargets transfer val live = LiveInfo.getLive(liveInfo, label) val live = List.fold (succ, live, fn (label, live) => LiveSet.+(live, LiveInfo.getLive(liveInfo, label))) val live = LiveSet.toList live val _ = setInfo(label, {block = block, pred = ref [], succ = ref succ, live = Vector.fromListMap (live, fn memloc => {memloc = memloc, distanceF' = ref NONE, distanceF = ref NONE, distanceB' = ref NONE, distanceB = ref NONE}), liveTransfers = ref NONE, defed = ref NONE}) val labels = label::labels val funcs = case entry of Entry.Func _ => label::funcs | _ => funcs in (labels, funcs) end) val labels = Vector.fromList labels val funcs = Vector.fromList funcs val _ = Vector.foreach (labels, fn label => let val {block, ...} = getInfo label fun doit target = let val {pred = pred', ...} = getInfo target in List.push (pred', label) end val Block.T {transfer, ...} = block datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => doit target | Iff {truee, falsee, ...} => (doit truee; doit falsee) | Switch {cases, default, ...} => (doit default; Transfer.Cases.foreach(cases, doit o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit return; case handler of SOME handler => doit handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {return, ...} => Option.app (return, doit) end) val _ = Vector.foreach (labels, fn label => let val {block, live, ...} = getInfo label val Block.T {entry, statements, transfer, ...} = block val l = List.fold (statements, I'.two, fn (Assembly.Comment _, l) => l | (_, l) => I'.+(l, I'.one)) fun pos ([], n, m) = let val {uses, defs, ...} = Transfer.uses_defs_kills transfer val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else distanceF' := SOME (Length l) | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else ()) end | pos ((Assembly.Comment _)::assembly,n,m) = pos (assembly,n,m) | pos (asm::assembly,n,m) = let val {uses,defs,...} = Assembly.uses_defs_kills asm val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else () | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else ()); pos(assembly, I'.+(n, I'.one), I'.-(m, I'.one)) end in let val n = I'.zero val m = I'.-(l, I'.one) val {uses,defs,...} = Entry.uses_defs_kills entry val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else () | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else distanceB' := SOME (Length l)); pos(statements, I'.+(n, I'.one), I'.-(m, I'.one)) end end) fun get_distanceF {temp: MemLoc.t, label: Label.t} = let val {block, succ, live, ...} = getInfo label val Block.T {transfer, ...} = block in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceF = ref (SOME (df, dfl)), ...} => (df, dfl) | SOME {distanceF', distanceF, ...} => (case valOf (!distanceF') of Position n => (distanceF := SOME (n, SOME label); (n, SOME label)) | Length n => let val loopLabels = getLoopLabels (loopInfo, label) val _ = distanceF := SOME (I.PosInfinity, NONE) fun default () = let val n = I.Finite n val (min, minl) = List.fold (!succ, (I.PosInfinity, NONE), fn (label, (min, minl)) => let val (n', l') = get_distanceF {temp = temp, label = label} val n' = I.+(n, n') val n'' = case (l', useLF) of (NONE, _) => n' | (_, false) => n' | (SOME l', true) => if List.contains (loopLabels, l', Label.equals) then n' else I.*(I.Finite 5, n') in if I.<(n'', min) then (n', l') else (min, minl) end) in (min, minl) end datatype z = datatype Transfer.t val (n, l) = case transfer of Tail _ => (I.PosInfinity, NONE) | NonTail _ => (I.PosInfinity, NONE) | Return _ => (I.PosInfinity, NONE) | Raise _ => (I.PosInfinity, NONE) | CCall {func, ...} => if CFunction.maySwitchThreads func orelse Size.class (MemLoc.size temp) <> Size.INT then (I.PosInfinity, NONE) else default () | _ => default () in distanceF := SOME (n, l) ; (n, l) end) | _ => (I.PosInfinity, NONE) end fun get_distanceB {temp: MemLoc.t, label: Label.t} = let val {block, pred, live, ...} = getInfo label val Block.T {entry, ...} = block in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceB = ref (SOME (db, dbl)), ...} => (db, dbl) | SOME {distanceB, ...} => let val loopLabels = getLoopLabels(loopInfo, label) val _ = distanceB := SOME (I.PosInfinity, NONE) fun default () = List.fold (!pred, (I.PosInfinity, NONE), fn (label, (min, minl)) => let val {live, ...} = getInfo label in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceB', ...} => (case valOf(!distanceB') of Position n => if I.<(n, min) then (n, SOME label) else (min, minl) | Length n => let val n = I.Finite n val (n', l') = get_distanceB {temp = temp, label = label} val n' = I.+(n, n') val n'' = case (l', useLF) of (NONE, _) => n' | (_, false) => n' | (SOME l', true) => if List.contains (loopLabels, l', Label.equals) then n' else I.*(I.Finite 5, n') in if I.<(n'', min) then (n', l') else (min, minl) end) | _ => (min, minl) end) datatype z = datatype Entry.t val (n, l) = case entry of Func {...} => (I.PosInfinity, NONE) | Cont {...} => (I.PosInfinity, NONE) | Handler {...} => (I.PosInfinity, NONE) | CReturn {func, ...} => if (CFunction.maySwitchThreads func orelse Size.class (MemLoc.size temp) <> Size.INT) then (I.PosInfinity, NONE) else default () | _ => default () in distanceB := SOME (n, l) ; (n, l) end | _ => (I.PosInfinity, NONE) end local val queue = ref (Queue.empty ()) in fun enque x = queue := Queue.enque(!queue, x) fun deque () = case Queue.deque (!queue) of NONE => NONE | SOME (queue', x) => (queue := queue'; SOME x) end fun doit {label, hints} = let val {block as Block.T {entry, ...}, live = liveData, liveTransfers, ...} = getInfo label in case !liveTransfers of SOME _ => () | NONE => let val loopLabels = getLoopLabels(loopInfo, label) val Block.T {transfer, ...} = block val (regHints, xmmregHints) = hints val live = LiveSet.toList(LiveInfo.getLive(liveInfo, label)) val _ = if true then () else (print (Label.toString label); print "\nloopLabels: "; print (List.toString Label.toString loopLabels); print "\nliveData:\n"; Vector.foreach (liveData, fn {memloc, distanceF', distanceB', ...} => (print (MemLoc.toString memloc); print ": "; case !distanceF' of NONE => print "?" | SOME (Position i) => (print "Pos "; print (I.toString i)) | SOME (Length i) => (print "Len "; print (I'.toString i)); print " "; case !distanceB' of NONE => print "?" | SOME (Position i) => (print "Pos "; print (I.toString i)) | SOME (Length i) => (print "Len "; print (I'.toString i)); print "\n")); print "regHints:\n"; List.foreach (regHints, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (Register.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "xmmregHints:\n"; List.foreach (xmmregHints, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (XmmRegister.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "live:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print "\n")); print "distance_F:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print ": "; let val (n, l) = get_distanceF {temp = memloc, label = label} in print (I.toString n); print " "; print (Option.toString Label.toString l) end; print "\n")); print "distance_B:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print ": "; let val (n, l) = get_distanceB {temp = memloc, label = label} in print (I.toString n); print " "; print (Option.toString Label.toString l) end; print "\n"))) val live = if not useB then List.keepAllMap (live, fn memloc => case get_distanceF {temp = memloc, label = label} of (I.Finite n, SOME l) => if n < cutoff then if useLF then if List.contains (loopLabels, l, Label.equals) then SOME (memloc, n) else SOME (memloc, n * 5) else SOME (memloc, n) else NONE | (I.PosInfinity, _) => NONE | _ => Error.bug "amd64LiveTransfers.computeLiveTransfers.live: get_distanceF") else List.keepAllMap (live, fn memloc => case (get_distanceB {temp = memloc, label = label}, get_distanceF {temp = memloc, label = label}) of ((I.PosInfinity, _), _) => NONE | (_, (I.PosInfinity, _)) => NONE | ((I.Finite n, SOME nl), (I.Finite m, SOME ml)) => if (n + m) < cutoff then if useLF then case (List.contains (loopLabels, nl, Label.equals), List.contains (loopLabels, ml, Label.equals)) of (true, true) => SOME (memloc, n + m) | (true, false) => SOME (memloc, n + 5 * m) | (false, true) => SOME (memloc, 5 * n + m) | (false, false) => SOME (memloc, 5 * n + 5 * m) else SOME (memloc, n + m) else NONE | _ => Error.bug "amd64LiveTransfers.computeLiveTransfers.live: get_distanceB") (* List.partition will reverse the lists. * So sort in increasing order. *) val live = List.insertionSort (live, fn ((_,n1),(_,n2)) => I'.>(n1, n2)) val _ = if true then () else (print "live:\n"; List.foreach (live, fn (memloc,n) => (print (MemLoc.toString memloc); print ": "; print (I'.toString n); print "\n"))) val {yes = liveRegs, no = liveXmmRegs} = List.partition (live, fn (memloc,_) => Size.class (MemLoc.size memloc) = Size.INT) val liveRegs = List.map (liveRegs, fn (memloc,weight) => case List.peek (regHints, fn (memloc',_,_) => MemLoc.eq(memloc,memloc')) of SOME (_,register',_) => (memloc,weight,SOME register') | NONE => (memloc,weight,NONE)) val rec doitRegs = fn ([],_,liveTransfers) => liveTransfers | (_,[],liveTransfers) => liveTransfers | (transferRegs, (memloc,_,register)::live, liveTransfers) => let fun finish register = let val transferRegs = List.removeAll (transferRegs, fn register' => Register.coincide(register, register')) in doitRegs (transferRegs, live, (memloc,register,ref true)::liveTransfers) end fun default () = let val size = MemLoc.size memloc val transferRegs' = List.keepAllMap (transferRegs, fn register => if Size.eq (size, Register.size register) then SOME (register, List.index (live, fn (_,_,SOME register') => Register.eq (register, register') | (_,_,NONE) => false)) else NONE) val transferRegs' = List.insertionSort (transferRegs', fn ((_,SOME index1),(_,SOME index2)) => Int.>(index1, index2) | ((_, NONE),_) => true | (_, (_, NONE)) => false) in case transferRegs' of nil => doitRegs (transferRegs, live, liveTransfers) | (register,_)::_ => finish register end in case register of SOME register => if List.contains(transferRegs, register, Register.eq) then finish register else default () | NONE => default () end val liveRegsTransfers = doitRegs(transferRegs entry, liveRegs, []) val liveXmmRegs = List.map (liveXmmRegs, fn (memloc,weight) => case List.peek (xmmregHints, fn (memloc',_,_) => MemLoc.eq(memloc,memloc')) of SOME (_,register',_) => (memloc,weight,SOME register') | NONE => (memloc,weight,NONE)) val rec doitXmmRegs = fn ([],_,liveTransfers) => liveTransfers | (_,[],liveTransfers) => liveTransfers | (transferXmmRegs, (memloc,_,register)::live, liveTransfers) => let fun finish register = let val transferXmmRegs = List.removeAll (transferXmmRegs, fn register' => XmmRegister.coincide(register, register')) in doitXmmRegs (transferXmmRegs, live, (memloc,register,ref true)::liveTransfers) end fun default () = let val size = MemLoc.size memloc val transferXmmRegs' = List.keepAllMap (transferXmmRegs, fn register => if Size.eq (size, XmmRegister.size register) then SOME (register, List.index (live, fn (_,_,SOME register') => XmmRegister.eq (register, register') | (_,_,NONE) => false)) else NONE) val transferXmmRegs' = List.insertionSort (transferXmmRegs', fn ((_,SOME index1),(_,SOME index2)) => Int.>(index1, index2) | ((_, NONE),_) => true | (_, (_, NONE)) => false) in case transferXmmRegs' of nil => doitXmmRegs (transferXmmRegs, live, liveTransfers) | (register,_)::_ => finish register end in case register of SOME register => if List.contains(transferXmmRegs, register, XmmRegister.eq) then finish register else default () | NONE => default () end val liveXmmRegsTransfers = doitXmmRegs(transferXmmRegs entry, liveXmmRegs, []) val _ = liveTransfers := SOME (liveRegsTransfers, liveXmmRegsTransfers) (* val _ = (print "liveRegsTransfers:\n"; List.foreach (liveRegsTransfers, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (Register.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "liveFltRegsTransfers:\n"; List.foreach (liveFltRegsTransfers, fn (memloc,sync) => (print (MemLoc.toString memloc); print ": "; print (Bool.toString (!sync)); print "\n")); print "") *) fun doit' label = enque {label = label, hints = (liveRegsTransfers, liveXmmRegsTransfers)} fun doit'' label = enque {label = label, hints = ([],[])} fun doit''' func label = let val hints = List.fold (Operand.cReturnTemps (CFunction.return func), ([],[]), fn ({src, dst}, (regHints, xmmregHints)) => case src of Operand.Register reg => ((dst, reg, ref true) :: regHints, xmmregHints) | Operand.XmmRegister reg => (regHints, (dst, reg, ref true) :: xmmregHints) | _ => (regHints, xmmregHints)) in enque {hints = hints, label = label} end datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => (doit' target) | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (doit' default; Transfer.Cases.foreach(cases, doit' o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {func, return, ...} => if CFunction.maySwitchThreads func then Option.app (return, doit'') else Option.app (return, doit''' func) end end val _ = Vector.foreach (funcs, fn label => enque {label = label, hints = ([],[])}) fun loop () = (case deque () of NONE => () | SOME {label, hints} => (doit {label = label, hints = hints}; loop ())) val _ = loop () fun doit {label, defed = defed'} = let val {block, liveTransfers, defed, ...} = getInfo label val (liveRegs, liveXmmRegs) = valOf (!liveTransfers) val defed' = case getNear(jumpInfo, label) of None => MemLocSet.empty | Count 0 => MemLocSet.empty | Count 1 => defed' | Count _ => MemLocSet.subset (defed', fn memloc => List.exists (liveRegs, fn (memloc',_,_) => MemLoc.eq(memloc', memloc)) orelse List.exists (liveXmmRegs, fn (memloc',_,_) => MemLoc.eq(memloc', memloc))) fun default defed'' = let val Block.T {entry, statements, transfer, ...} = block val _ = List.foreach (liveRegs, fn (memloc,_,sync) => if MemLocSet.contains(defed', memloc) then sync := false else ()) val _ = List.foreach (liveXmmRegs, fn (memloc,_,sync) => if MemLocSet.contains(defed', memloc) then sync := false else ()) val defed' = MemLocSet.+(defed'', defed') val _ = defed := SOME defed' fun doit' (defed', defs) = List.fold (defs, defed', fn (def,defed') => case Operand.deMemloc def of SOME def => if track def then MemLocSet.add(defed', def) else defed' | NONE => defed') val {defs, ...} = Entry.uses_defs_kills entry val defed' = doit' (defed', defs) val defed' = List.fold (statements, defed', fn (asm,defed') => let val {defs, ...} = Assembly.uses_defs_kills asm in doit' (defed', defs) end) val {defs, ...} = Transfer.uses_defs_kills transfer val defed' = doit' (defed', defs) fun doit' label = doit {label = label, defed = defed'} fun doit'' label = doit {label = label, defed = MemLocSet.empty} datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => (doit' target) | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (Transfer.Cases.foreach(cases, doit' o #2); doit' default) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {func, return, ...} => if CFunction.maySwitchThreads func then Option.app (return, doit'') else Option.app (return, doit') end in case !defed of NONE => default MemLocSet.empty | SOME defed => if MemLocSet.<=(defed',defed) then () else default defed end val _ = Vector.foreach (funcs, fn label => doit {label = label, defed = MemLocSet.empty}) val {get = getLiveTransfers : Label.t -> ((MemLoc.t * Register.t * bool) list * (MemLoc.t * XmmRegister.t * bool) list), set = setLiveTransfers, ...} = Property.getSet (Label.plist, Property.initRaise ("amd64LiveTransfers:getLiveTransfers", Label.layout)) val _ = Vector.foreach (labels, fn label => let val {liveTransfers, ...} = getInfo label val (liveRegs, liveXmmRegs) = valOf (!liveTransfers) val (liveRegs, liveXmmRegs) = if sync then (List.map (liveRegs, fn (memloc,reg, sync) => (memloc, reg, !sync)), List.map (liveXmmRegs, fn (memloc,reg, sync) => (memloc, reg, !sync))) else (List.map (liveRegs, fn (memloc,reg, _) => (memloc, reg, false)), List.map (liveXmmRegs, fn (memloc,reg, _) => (memloc, reg, false))) in setLiveTransfers(label, (liveRegs, liveXmmRegs)) end) val _ = destInfo () in T {get = getLiveTransfers, set = setLiveTransfers} end val computeLiveTransfers = fn {chunk, transferRegs, transferXmmRegs, liveInfo, jumpInfo, loopInfo} => if !Control.Native.liveTransfer > 0 then computeLiveTransfers {chunk = chunk, transferRegs = transferRegs, transferXmmRegs = transferXmmRegs, liveInfo = liveInfo, jumpInfo = jumpInfo, loopInfo = loopInfo} else let val {get = getLiveTransfers, set = setLiveTransfers, ...} = Property.getSetOnce(Label.plist, Property.initConst ([], [])) in T {get = getLiveTransfers, set = setLiveTransfers} end val (computeLiveTransfers : {chunk : Chunk.t, transferRegs : Entry.t -> Register.t list, transferXmmRegs : Entry.t -> XmmRegister.t list, liveInfo : LiveInfo.t, jumpInfo : amd64JumpInfo.t, loopInfo : amd64LoopInfo.t} -> t, computeLiveTransfers_msg) = tracerTop "computeLiveTransfers" computeLiveTransfers fun computeLiveTransfers_totals () = (computeLiveTransfers_msg ()) fun getLiveTransfers (T {get, ...}, label) = get label fun setLiveTransfersEmpty (T {set, ...}, label) = set(label, ([], [])) end mlton-20100608/mlton/codegen/amd64-codegen/amd64-live-transfers.sig0000644000076600000240000000263511404435625023224 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_LIVE_TRANSFERS_STRUCTS = sig structure amd64 : AMD64 structure amd64Liveness : AMD64_LIVENESS sharing amd64 = amd64Liveness.amd64 structure amd64JumpInfo : AMD64_JUMP_INFO sharing amd64 = amd64JumpInfo.amd64 structure amd64LoopInfo : AMD64_LOOP_INFO sharing amd64 = amd64LoopInfo.amd64 end signature AMD64_LIVE_TRANSFERS = sig include AMD64_LIVE_TRANSFERS_STRUCTS type t val computeLiveTransfers : {chunk : amd64.Chunk.t, transferRegs : amd64.Entry.t -> amd64.Register.t list, transferXmmRegs : amd64.Entry.t -> amd64.XmmRegister.t list, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t, loopInfo : amd64LoopInfo.t} -> t val computeLiveTransfers_totals : unit -> unit val getLiveTransfers : t * amd64.Label.t -> ((amd64.MemLoc.t * amd64.Register.t * bool) list * (amd64.MemLoc.t * amd64.XmmRegister.t * bool) list) val setLiveTransfersEmpty : t * amd64.Label.t -> unit end mlton-20100608/mlton/codegen/amd64-codegen/amd64-liveness.fun0000644000076600000240000006367211404435625022126 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64Liveness(S: AMD64_LIVENESS_STRUCTS) : AMD64_LIVENESS = struct open S open amd64 val tracer = amd64.tracer val tracerTop = amd64.tracerTop structure LiveSet = struct open MemLocSet fun toMemLocSet s = s end fun track memloc = ClassSet.contains(!amd64MLtonBasic.Classes.livenessClasses, MemLoc.class memloc) fun livenessOperands live = List.fold (live, LiveSet.empty, fn (operand, live) => (case Operand.deMemloc operand of NONE => live | SOME memloc => if track memloc then LiveSet.add(live, memloc) else live)) structure LiveInfo = struct datatype t = T of {get: Label.t -> LiveSet.t, set: Label.t * LiveSet.t -> unit} fun newLiveInfo () = let val {get : Label.t -> LiveSet.t, set : Label.t * LiveSet.t -> unit, ...} = Property.getSet (Label.plist, Property.initRaise ("liveInfo", Label.layout)) in T {get = get, set = set} end fun setLiveOperands (T {set, ...}, label, live) = set(label, livenessOperands live) fun setLive (T {set, ...}, label, live) = set(label, live) fun getLive (T {get, ...}, label) = get label end fun liveness_uses_defs {uses : Operand.t list, defs : Operand.t list} : {uses : LiveSet.t, defs : LiveSet.t} = let val baseUses = livenessOperands uses val livenessUses = let fun doit (operands, livenessUses) = List.fold (operands, livenessUses, fn (operand, livenessUses) => case Operand.deMemloc operand of SOME memloc => List.fold (MemLoc.utilized memloc, livenessUses, fn (memloc, livenessUses) => if track memloc then LiveSet.add(livenessUses, memloc) else livenessUses) | NONE => livenessUses) in doit(defs, doit(uses, baseUses)) end val baseDefs = livenessOperands defs val livenessDefs = baseDefs in {uses = livenessUses, defs = livenessDefs} end structure Liveness = struct datatype t = T of {liveIn: LiveSet.t, liveOut: LiveSet.t, dead: LiveSet.t} local fun make f (T r) = f r in val dead = make #dead val liveIn = make #liveIn end fun toString (T {liveIn, liveOut, dead}) = let fun doit (name, l, toString, s) = LiveSet.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) in doit("liveIn: ", liveIn, MemLoc.toString, doit("liveOut: ", liveOut, MemLoc.toString, doit("dead: ", dead, MemLoc.toString, ""))) end fun eq (T {liveIn = liveIn1, liveOut = liveOut1, dead = dead1}, T {liveIn = liveIn2, liveOut = liveOut2, dead = dead2}) = LiveSet.equals(liveIn1, liveIn2) andalso LiveSet.equals(liveOut1, liveOut2) andalso LiveSet.equals(dead1, dead2) fun liveness ({uses : LiveSet.t, defs : LiveSet.t, live : LiveSet.t}) : t = let val liveOut = live (* liveIn = uses \/ (liveOut - defs) *) val liveIn = LiveSet.+(uses, LiveSet.-(live, defs)) (* dead = (liveIn \/ defs) - liveOut *) val dead = LiveSet.-(LiveSet.+(liveIn, defs), liveOut) in T {liveIn = liveIn, liveOut = liveOut, dead = dead} end fun livenessEntry {entry : Entry.t, live : LiveSet.t} : t = let val {uses, defs, ...} = Entry.uses_defs_kills entry val {uses, defs} = liveness_uses_defs {uses = uses, defs = defs} val defs = MemLocSet.fold (Entry.live entry, defs, fn (memloc, defs) => if track memloc then LiveSet.add(defs, memloc) else defs) in liveness {uses = uses, defs = defs, live = live} end fun livenessAssembly {assembly : Assembly.t, live : LiveSet.t} : t = let val {uses, defs, ...} = Assembly.uses_defs_kills assembly val {uses, defs} = liveness_uses_defs {uses = uses, defs = defs} in liveness {uses = uses, defs = defs, live = live} end fun livenessTransfer' {transfer: Transfer.t, live : LiveSet.t} : t = let val {uses,defs,...} = Transfer.uses_defs_kills transfer val {uses,defs} = liveness_uses_defs {uses = uses, defs = defs} (* Transfer.live transfer could be considered uses, * but the Liveness.t of a transfer should have * Transfer.live transfer as liveOut. *) val live = MemLocSet.fold (Transfer.live transfer, live, fn (memloc, live) => if track memloc then LiveSet.add(live, memloc) else live) in liveness {uses = uses, defs = defs, live = live} end fun livenessTransfer {transfer: Transfer.t, liveInfo: LiveInfo.t} : t = let val targets = Transfer.nearTargets transfer val live = List.fold (targets, LiveSet.empty, fn (target, live) => LiveSet.union(LiveInfo.getLive(liveInfo, target), live)) in livenessTransfer' {transfer = transfer, live = live} end fun livenessBlock {block = Block.T {entry, statements, transfer, ...}, liveInfo : LiveInfo.t} = let val T {liveIn = live, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val live = List.foldr (statements, live, fn (asm,live) => let val T {liveIn = live, ...} = livenessAssembly {assembly = asm, live = live} in live end) val T {liveIn = live, ...} = livenessEntry {entry = entry, live = live} in live end end structure LiveInfo = struct open LiveInfo fun completeLiveInfo {chunk = Chunk.T {blocks, ...}, liveInfo : LiveInfo.t, pass: string} = let val {get = getBlockInfo : Label.t -> {pred: Label.t list ref, block: Block.t option ref, topo: int ref}, destroy = destBlockInfo} = Property.destGet (Label.plist, Property.initFun (fn _ => {pred = ref [], block = ref NONE, topo = ref ~1})) val get_pred = (#pred o getBlockInfo) val get_topo = (#topo o getBlockInfo) val get_pred' = (! o #pred o getBlockInfo) val get_block' = (! o #block o getBlockInfo) val get_topo' = (! o #topo o getBlockInfo) val labels = List.map (blocks, fn block' as Block.T {entry, transfer,...} => let val label = Entry.label entry val {block,topo,...} = getBlockInfo label val targets = Transfer.nearTargets transfer in block := SOME block'; topo := 0; List.foreach (targets, fn target => List.push(get_pred target, label)); label end) local val todo = ref [] fun topo_order(x,y) = Int.compare(get_topo' x, get_topo' y) fun insert (l, x, compare) = let val rec insert' = fn ([],acc) => List.appendRev(acc, [x]) | (l as h::t,acc) => (case compare(h,x) of LESS => insert' (t, h::acc) | EQUAL => List.appendRev(acc, l) | GREATER => List.appendRev(acc, x::l)) in insert' (l,[]) end in fun add_todo x = todo := insert(!todo, x, topo_order) fun push_todo x = todo := x::(!todo) fun rev_todo () = todo := List.rev (!todo) fun get_todo () = (case !todo of [] => NONE | (x::todo') => (todo := todo'; SOME x)) end local val num = Counter.new 1 in fun topo_sort label = let val {topo, pred, ...} = getBlockInfo label in if !topo = 0 then (topo := Counter.next num; push_todo label; List.foreach(!pred, topo_sort)) else () end fun topo_root label = (get_topo label := Counter.next num; push_todo label) end fun loop (labels, n) = if List.isEmpty labels then () else let val {yes = exits, no = labels} = List.partition (labels, fn label => let val Block.T {transfer, ...} = valOf (get_block' label) val targets = Transfer.nearTargets transfer val targets' = List.fold(targets, 0, fn (target,targets') => if get_topo' target = ~1 then targets' else targets' + 1) in targets' = n end) val exits = List.removeAll (exits, fn label => get_topo' label <> 0) val _ = (List.foreach (exits, fn label => topo_root label); List.foreach (exits, fn label => List.foreach(get_pred' label, topo_sort))) in loop(labels, n + 1) end val _ = loop(labels, 0) val _ = rev_todo () val changed = ref false fun doit () = (case get_todo () of NONE => () | SOME label => let val {pred, block, ...} = getBlockInfo label val block = valOf (!block) val live = Liveness.livenessBlock {block = block, liveInfo = liveInfo} val live' = LiveInfo.getLive(liveInfo, label) in if LiveSet.equals(live, live') then () else (LiveInfo.setLive(liveInfo, label, live); List.foreach(!pred, add_todo); if true then () else (print "completeLiveInfo:"; print pass; print ": "; print (Label.toString label); print ": "; if LiveSet.<(live, live') then print "new < old" else if LiveSet.<(live', live) then print "old < new" else print "?"; print "\n"; if true then (print "old: "; LiveSet.foreach (live', fn m => (print (MemLoc.toString m); print " ")); print "\n"; print "new: "; LiveSet.foreach (live, fn m => (print (MemLoc.toString m); print " ")); print "\n") else ()); changed := true); doit () end) val _ = doit () val _ = destBlockInfo () in () end val (completeLiveInfo : {chunk: Chunk.t, liveInfo: LiveInfo.t, pass: string} -> unit, completeLiveInfo_msg) = tracerTop "completeLiveInfo" completeLiveInfo fun verifyLiveInfo {chunk = Chunk.T {blocks, ...}, liveInfo : t} = List.forall (blocks, fn block as Block.T {entry, ...} => let val label = Entry.label entry val live = LiveInfo.getLive(liveInfo, label) val live' = Liveness.livenessBlock {block = block, liveInfo = liveInfo} in LiveSet.equals(live, live') end) val (verifyLiveInfo : {chunk: Chunk.t, liveInfo: LiveInfo.t} -> bool, verifyLiveInfo_msg) = tracer "verifyLiveInfo" verifyLiveInfo end structure LivenessBlock = struct datatype t = T of {entry: (Entry.t * Liveness.t), profileLabel: ProfileLabel.t option, statements: (Assembly.t * Liveness.t) list, transfer: Transfer.t * Liveness.t} fun printBlock (T {entry, statements, transfer, ...}) = (let val (entry,info) = entry in print (Entry.toString entry); print "\n"; print (Liveness.toString info) end; List.foreach (statements, fn (asm,info) => (print (Assembly.toString asm); print "\n"; print (Liveness.toString info))); let val (trans,info) = transfer in print (Transfer.toString trans); print "\n"; print (Liveness.toString info); print "\n" end) fun toLivenessEntry {entry, live} = let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessEntry {entry = entry, live = live} in {entry = (entry,info), live = live} end fun reLivenessEntry {entry, live} = let val (entry,_) = entry val info as Liveness.T {liveIn = live, ...} = Liveness.livenessEntry {entry = entry, live = live} in {entry = (entry,info), live = live} end fun toLivenessStatements {statements, live} = let val {statements,live} = List.foldr(statements, {statements = [], live = live}, fn (asm,{statements,live}) => let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessAssembly {assembly = asm, live = live} in {statements = (asm, info)::statements, live = live} end) in {statements = statements, live = live} end fun reLivenessStatements {statements: (Assembly.t * Liveness.t) list, live} = let val {statements,live,...} = List.foldr(statements, {statements = [], live = live, continue = false}, fn ((asm,info),{statements,live,continue}) => if continue then {statements = (asm,info)::statements, live = Liveness.liveIn info, continue = continue} else let val info' as Liveness.T {liveIn = live',...} = Liveness.livenessAssembly {assembly = asm, live = live} in {statements = (asm, info')::statements, live = live', continue = Liveness.eq(info,info')} end) in {statements = statements, live = live} end fun toLivenessTransfer {transfer, liveInfo} = let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessTransfer {transfer = transfer, liveInfo = liveInfo} in {transfer = (transfer,info), live = live} end fun reLivenessTransfer {transfer: Transfer.t * Liveness.t} = let val (transfer, Liveness.T {liveOut,...}) = transfer val info as Liveness.T {liveIn = live, ...} = Liveness.livenessTransfer' {transfer = transfer, live = liveOut} in {transfer = (transfer, info), live = live} end fun toLivenessBlock {block = Block.T {entry, profileLabel, statements, transfer}, liveInfo : LiveInfo.t} = let val {transfer, live} = toLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {statements, live} = toLivenessStatements {statements =statements, live = live} val {entry, ...} = toLivenessEntry {entry = entry, live = live} val liveness_block = T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} in liveness_block end val (toLivenessBlock: {block: Block.t, liveInfo: LiveInfo.t} -> t, toLivenessBlock_msg) = tracer "toLivenessBlock" toLivenessBlock fun verifyLivenessEntry {entry = (entry,info), live} = let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessEntry {entry = entry, live = live} in {verified = Liveness.eq(info, info'), live = live'} end fun verifyLivenessStatements {statements, live} = List.foldr(statements, {verified = true, live = live}, fn ((asm,info),{verified, live}) => let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessAssembly {assembly = asm, live = live} val eq = Liveness.eq(info, info') val () = if eq then () else (print "asm ::\n"; print (Assembly.toString asm); print "\n"; print "info ::\n"; print (Liveness.toString info); print "\n"; print "info' ::\n"; print (Liveness.toString info'); print "\n") in {verified = verified andalso Liveness.eq(info, info'), live = live'} end) fun verifyLivenessTransfer {transfer = (transfer,info), liveInfo} = let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessTransfer {transfer = transfer, liveInfo = liveInfo} in {verified = Liveness.eq(info, info'), live = live'} end fun verifyLivenessBlock {block = T {entry, statements, transfer, ...}, liveInfo: LiveInfo.t} = let val {verified = verified_transfer, live} = verifyLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {verified = verified_statements, live} = verifyLivenessStatements {statements =statements, live = live} val {verified = verified_entry, ...} = verifyLivenessEntry {entry = entry, live = live} (* FIXME -- the live-in set changed because of dead code elimination. val live' = get label val verified_live = List.equalsAsSet(live, live', MemLoc.eq) *) val verified_live = true in verified_transfer andalso verified_statements andalso verified_entry andalso verified_live end val (verifyLivenessBlock: {block: t, liveInfo: LiveInfo.t} -> bool, verifyLivenessBlock_msg) = tracer "verifyLivenessBlock" verifyLivenessBlock fun toBlock {block = T {entry, profileLabel, statements, transfer}} = let val (entry,_) = entry val statements = List.map(statements, fn (asm,_) => asm) val (transfer,_) = transfer in Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} end val (toBlock: {block: t} -> Block.t, toBlock_msg) = tracer "toBlock" toBlock end end mlton-20100608/mlton/codegen/amd64-codegen/amd64-liveness.sig0000644000076600000240000000776311404435625022117 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_LIVENESS_STRUCTS = sig structure amd64: AMD64 structure amd64MLtonBasic: AMD64_MLTON_BASIC sharing amd64 = amd64MLtonBasic.amd64 end signature AMD64_LIVENESS = sig include AMD64_LIVENESS_STRUCTS structure LiveSet: sig include SET val toMemLocSet: t -> amd64.MemLocSet.t end sharing type LiveSet.Element.t = amd64.MemLoc.t val track : amd64.MemLoc.t -> bool structure LiveInfo: sig type t val newLiveInfo : unit -> t val setLiveOperands : t * amd64.Label.t * amd64.Operand.t list -> unit val setLive : t * amd64.Label.t * LiveSet.t -> unit val getLive : t * amd64.Label.t -> LiveSet.t val completeLiveInfo : {chunk: amd64.Chunk.t, liveInfo: t, pass: string} -> unit val completeLiveInfo_msg : unit -> unit val verifyLiveInfo : {chunk: amd64.Chunk.t, liveInfo: t} -> bool val verifyLiveInfo_msg : unit -> unit end structure Liveness: sig datatype t = T of {liveIn: LiveSet.t, liveOut: LiveSet.t, dead: LiveSet.t} val dead: t -> LiveSet.t val liveIn: t -> LiveSet.t val livenessAssembly : {assembly : amd64.Assembly.t, live : LiveSet.t} -> t val livenessEntry : {entry : amd64.Entry.t, live : LiveSet.t} -> t val livenessTransfer : {transfer: amd64.Transfer.t, liveInfo: LiveInfo.t} -> t end structure LivenessBlock: sig datatype t = T of {entry: (amd64.Entry.t * Liveness.t), profileLabel: amd64.ProfileLabel.t option, statements: (amd64.Assembly.t * Liveness.t) list, transfer: (amd64.Transfer.t * Liveness.t)} val printBlock : t -> unit val toLivenessEntry : {entry: amd64.Entry.t, live: LiveSet.t} -> {entry: (amd64.Entry.t * Liveness.t), live: LiveSet.t} val reLivenessEntry : {entry: (amd64.Entry.t * Liveness.t), live: LiveSet.t} -> {entry: (amd64.Entry.t * Liveness.t), live: LiveSet.t} val toLivenessStatements : {statements: amd64.Assembly.t list, live: LiveSet.t} -> {statements: (amd64.Assembly.t * Liveness.t) list, live: LiveSet.t} val reLivenessStatements : {statements: (amd64.Assembly.t * Liveness.t) list, live: LiveSet.t} -> {statements: (amd64.Assembly.t * Liveness.t) list, live: LiveSet.t} val toLivenessTransfer : {transfer: amd64.Transfer.t, liveInfo: LiveInfo.t} -> {transfer: (amd64.Transfer.t * Liveness.t), live: LiveSet.t} val reLivenessTransfer : {transfer: (amd64.Transfer.t * Liveness.t)} -> {transfer: (amd64.Transfer.t * Liveness.t), live: LiveSet.t} val toLivenessBlock : {block: amd64.Block.t, liveInfo: LiveInfo.t} -> t val toLivenessBlock_msg : unit -> unit val verifyLivenessBlock : {block: t, liveInfo: LiveInfo.t} -> bool val verifyLivenessBlock_msg : unit -> unit val toBlock : {block: t} -> amd64.Block.t val toBlock_msg : unit -> unit end end mlton-20100608/mlton/codegen/amd64-codegen/amd64-loop-info.fun0000644000076600000240000001342711404435625022171 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64LoopInfo(S: AMD64_LOOP_INFO_STRUCTS) : AMD64_LOOP_INFO = struct open S open amd64 structure Graph = DirectedGraph structure Node = Graph.Node structure LoopForest = Graph.LoopForest val tracer = amd64.tracer datatype t = T of {getLoopInfo : Label.t -> {loopHeader: bool, loopLabels: Label.t list, loopPath: int list}} fun createLoopInfo {chunk = Chunk.T {blocks, ...}, farLoops} = let val G = Graph.new () val {get = getNodeInfo : unit Node.t -> Label.t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("amd64LoopInfo:getNodeInfo", Node.layout)) val {get = getInfo : Label.t -> unit Node.t, destroy = destInfo} = Property.destGet (Label.plist, Property.initFun (fn l => let val n = Graph.newNode G val _ = setNodeInfo(n, l) in n end)) val {get = getLoopInfo : Label.t -> {loopHeader: bool, loopLabels: Label.t list, loopPath: int list}, set = setLoopInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("amd64LoopInfo:getLoopInfo", Label.layout)) val rootLabel = Label.newString "root" val root = getInfo rootLabel fun addEdge edge = ignore (Graph.addEdge (G, edge)) val _ = List.foreach (blocks, fn Block.T {entry, transfer, ...} => let val label = Entry.label entry val node = getInfo label fun doit' target = let val node' = getInfo target in addEdge {from = node, to = node'} end fun doit'' target = let val node' = getInfo target in if farLoops then addEdge {from = node, to = node'} else addEdge {from = root, to = node'} end datatype z = datatype Transfer.t in if Entry.isFunc entry then addEdge {from = root, to = node} else () ; case transfer of Goto {target, ...} => doit' target | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (doit' default; Transfer.Cases.foreach(cases, doit' o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {return, func, ...} => Option.app (return, if CFunction.mayGC func then doit'' else doit') end) val _ = destInfo () val lf = Graph.loopForestSteensgaard (G, {root = root}) fun doit (f: unit LoopForest.t, headers, path) = let val {loops, notInLoop} = LoopForest.dest f val notInLoop = Vector.toListMap (notInLoop, getNodeInfo) val path' = List.rev path in List.foreach (notInLoop, fn l => setLoopInfo (l, {loopHeader = Vector.contains (headers, l, Label.equals), loopLabels = notInLoop, loopPath = path'})) ; Vector.foreachi (loops, fn (i,{headers, child}) => doit (child, Vector.map (headers, getNodeInfo), i::path)) end val _ = doit (lf, Vector.new0 (), []) in T {getLoopInfo = getLoopInfo} end val (createLoopInfo, createLoopInfo_msg) = tracer "createLoopInfo" createLoopInfo fun getLoopDistance (T {getLoopInfo, ...}, from, to) = (case (#loopPath (getLoopInfo from), #loopPath (getLoopInfo to)) of ([], _) => NONE | (_, []) => NONE | (pfrom, pto) => let val rec check = fn ([], pto) => SOME (List.length pto) | (pfrom, []) => SOME (~(List.length pfrom)) | (f::pfrom,t::pto) => if f = t then check (pfrom, pto) else NONE in check (pfrom, pto) end) fun getLoopLabels (T {getLoopInfo, ...}, label) = #loopLabels (getLoopInfo label) fun isLoopHeader (T {getLoopInfo, ...}, l) = #loopHeader (getLoopInfo l) end mlton-20100608/mlton/codegen/amd64-codegen/amd64-loop-info.sig0000644000076600000240000000136111404435625022155 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_LOOP_INFO_STRUCTS = sig structure amd64 : AMD64 end signature AMD64_LOOP_INFO = sig include AMD64_LOOP_INFO_STRUCTS type t val createLoopInfo : {chunk: amd64.Chunk.t, farLoops: bool} -> t val createLoopInfo_msg : unit -> unit val getLoopDistance : t * amd64.Label.t * amd64.Label.t -> int option val getLoopLabels : t * amd64.Label.t -> amd64.Label.t list val isLoopHeader : t * amd64.Label.t -> bool end mlton-20100608/mlton/codegen/amd64-codegen/amd64-mlton-basic.fun0000644000076600000240000002650311404435625022476 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64MLtonBasic (S: AMD64_MLTON_BASIC_STRUCTS): AMD64_MLTON_BASIC = struct open S open amd64 local open Machine in structure CType = CType structure Runtime = Runtime end (* * amd64.Size.t equivalents *) val wordBytes = Bytes.toInt Bytes.inWord64 val wordSize = Size.fromBytes wordBytes val wordScale = Scale.fromBytes wordBytes val pointerBytes = Bytes.toInt Bytes.inWord64 val pointerSize = Size.fromBytes pointerBytes (* * Memory classes *) structure Classes = struct local fun new s = MemLoc.Class.new {name = s} in val Heap = new "Heap" val Stack = new "Stack" val Locals = new "Locals" val Globals = new "Globals" val Temp = MemLoc.Class.Temp val StaticTemp = MemLoc.Class.StaticTemp val CArg = MemLoc.Class.CArg val CStack = MemLoc.Class.CStack val Code = MemLoc.Class.Code val CStatic = new "CStatic" val StaticNonTemp = new "StaticNonTemp" val GCState = new "GCState" val GCStateHold = new "GCStateHold" val GCStateVolatile = new "GCStateVolatile" end val allClasses = ref amd64.ClassSet.empty val livenessClasses = ref amd64.ClassSet.empty val holdClasses = ref amd64.ClassSet.empty val volatileClasses = ref amd64.ClassSet.empty val runtimeClasses = ref amd64.ClassSet.empty val heapClasses = ref amd64.ClassSet.empty val cargClasses = ref amd64.ClassSet.empty val cstaticClasses = ref amd64.ClassSet.empty fun initClasses () = let val _ = allClasses := amd64.ClassSet.fromList ( Heap:: Stack:: Locals:: Globals:: Temp:: StaticTemp:: CArg:: CStack:: Code:: CStatic:: StaticNonTemp:: GCState:: GCStateHold:: GCStateVolatile:: nil) val _ = livenessClasses := (if !Control.Native.liveStack then amd64.ClassSet.fromList ( Temp:: Locals:: StaticTemp:: Stack:: nil) else amd64.ClassSet.fromList ( Temp:: Locals:: StaticTemp:: nil)) val _ = holdClasses := amd64.ClassSet.fromList ( GCStateHold:: (* GCStateVolatile:: *) nil) val _ = volatileClasses := amd64.ClassSet.fromList ( GCStateVolatile:: nil) val _ = runtimeClasses := amd64.ClassSet.fromList ( Heap:: Stack:: Globals:: GCState:: GCStateHold:: GCStateVolatile:: nil) val _ = heapClasses := amd64.ClassSet.fromList ( Heap:: nil) val _ = cstaticClasses := amd64.ClassSet.fromList ( CStatic:: nil) val _ = cargClasses := amd64.ClassSet.fromList ( CArg:: nil) in () end end val makeContents = amd64.MemLoc.makeContents val c_stackP = Label.fromString "c_stackP" val c_stackPContents = makeContents {base = Immediate.label c_stackP, size = pointerSize, class = Classes.StaticNonTemp} val c_stackPContentsOperand = Operand.memloc c_stackPContents val c_stackPDerefWord = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.QUAD, class = Classes.CStack} val c_stackPDerefWordOperand = Operand.memloc c_stackPDerefWord val c_stackPDerefDouble = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.DBLE, class = Classes.CStack} val c_stackPDerefDoubleOperand = Operand.memloc c_stackPDerefDouble val c_stackPDerefFloat = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.SNGL, class = Classes.CStack} val c_stackPDerefFloatOperand = Operand.memloc c_stackPDerefFloat val applyFFTempFun = Label.fromString "applyFFTempFun" val applyFFTempFunContents = makeContents {base = Immediate.label applyFFTempFun, size = wordSize, class = Classes.CStatic} val applyFFTempFunContentsOperand = Operand.memloc applyFFTempFunContents val applyFFTempRegArg = Label.fromString "applyFFTempRegArg" fun applyFFTempRegArgContents i = MemLoc.imm {base = Immediate.label applyFFTempRegArg, index = Immediate.int i, scale = Scale.Eight, size = wordSize, class = Classes.CArg} val applyFFTempXmmRegArgS = Label.fromString "applyFFTempXmmRegArgS" fun applyFFTempXmmRegArgSContents i = MemLoc.imm {base = Immediate.label applyFFTempXmmRegArgS, index = Immediate.int i, scale = Scale.Four, size = Size.SNGL, class = Classes.CArg} val applyFFTempXmmRegArgD = Label.fromString "applyFFTempXmmRegArgD" fun applyFFTempXmmRegArgDContents i = MemLoc.imm {base = Immediate.label applyFFTempXmmRegArgD, index = Immediate.int i, scale = Scale.Eight, size = Size.DBLE, class = Classes.CArg} fun applyFFTempXmmRegArgContents (floatSize, i) = case floatSize of Size.DBLE => applyFFTempXmmRegArgDContents i | Size.SNGL => applyFFTempXmmRegArgSContents i | _ => Error.bug "amd64MLtonBasic.applyFFTempXmmRegArgContents" val fpcvtTemp = Label.fromString "fpcvtTemp" val fpcvtTempContents = makeContents {base = Immediate.label fpcvtTemp, size = wordSize, class = Classes.StaticTemp} val fpcvtTempContentsOperand = Operand.memloc fpcvtTempContents val fpeqTemp = Label.fromString "fpeqTemp" fun fpeqTempContents size = makeContents {base = Immediate.label fpeqTemp, size = size, class = Classes.StaticTemp} fun fpeqTempContentsOperand size = Operand.memloc (fpeqTempContents size) local fun make prefix = let fun make name size = Label.fromString (concat [prefix, name, size]) val r = make "Real" val w = make "Word" datatype z = datatype CType.t in CType.memo (fn t => case t of CPointer => Label.fromString (concat [prefix, "CPointer"]) | Int8 => w "8" | Int16 => w "16" | Int32 => w "32" | Int64 => w "64" | Objptr => Label.fromString (concat [prefix, "Objptr"]) | Real32 => r "32" | Real64 => r "64" | Word8 => w "8" | Word16 => w "16" | Word32 => w "32" | Word64 => w "64") end in val local_base = make "local" val global_base = make "global" end val globalObjptrNonRoot_base = Label.fromString "globalObjptrNonRoot" val gcState_label = Label.fromString "gcState" structure Field = Runtime.GCField fun make' (offset: int, size, class) = let fun imm () = Immediate.labelPlusInt (gcState_label, offset) fun contents () = makeContents {base = imm (), size = size, class = class} fun operand () = Operand.memloc (contents ()) in (imm, contents, operand) end fun make (f: Field.t, size, class) = let fun imm () = Immediate.labelPlusInt (gcState_label, Bytes.toInt (Field.offset f)) fun contents () = makeContents {base = imm (), size = size, class = class} fun operand () = Operand.memloc (contents ()) in (imm, contents, operand) end val (_, gcState_exnStackContents, gcState_exnStackContentsOperand) = make (Field.ExnStack, wordSize, Classes.GCState) val (_, gcState_frontierContents, gcState_frontierContentsOperand) = make (Field.Frontier, pointerSize, Classes.GCStateHold) val (_, gcState_stackBottomContents, gcState_stackBottomContentsOperand) = make (Field.StackBottom, pointerSize, Classes.GCState) val (_, gcState_stackTopContents, gcState_stackTopContentsOperand) = make (Field.StackTop, pointerSize, Classes.GCStateHold) local val stackTopTemp = Immediate.label (Label.fromString "stackTopTemp") val stackTopTempContents = makeContents {base = stackTopTemp, size = wordSize, class = Classes.StaticTemp} val stackTopTempContentsOperand = Operand.memloc (stackTopTempContents) in val stackTopTempContents = fn () => stackTopTempContents val stackTopTempContentsOperand = fn () => stackTopTempContentsOperand end fun gcState_stackTopMinusWordDeref () = MemLoc.simple {base = gcState_stackTopContents (), index = Immediate.int ~1, scale = wordScale, size = pointerSize, class = Classes.Stack} fun gcState_stackTopMinusWordDerefOperand () = Operand.memloc (gcState_stackTopMinusWordDeref ()) fun stackTopTempMinusWordDeref () = MemLoc.simple {base = stackTopTempContents (), index = Immediate.int ~1, scale = wordScale, size = pointerSize, class = Classes.Stack} fun stackTopTempMinusWordDerefOperand () = Operand.memloc (stackTopTempMinusWordDeref ()) fun gcState_offset {offset, ty} = let val (_,_,operand) = make' (offset, Vector.sub(amd64.Size.fromCType ty, 0), Classes.GCState) in operand () end (* init *) fun init () = let val _ = Classes.initClasses () in () end end mlton-20100608/mlton/codegen/amd64-codegen/amd64-mlton-basic.sig0000644000076600000240000001017111404435625022462 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_MLTON_BASIC_STRUCTS = sig structure Machine: MACHINE structure amd64: AMD64_PSEUDO sharing amd64.CFunction = Machine.CFunction sharing amd64.CType = Machine.CType sharing amd64.Label = Machine.Label sharing amd64.ProfileLabel = Machine.ProfileLabel sharing amd64.RepType = Machine.Type sharing amd64.Runtime = Machine.Runtime sharing amd64.WordSize = Machine.WordSize sharing amd64.WordX = Machine.WordX end signature AMD64_MLTON_BASIC = sig include AMD64_MLTON_BASIC_STRUCTS structure CFunction: C_FUNCTION structure CType: C_TYPE structure RepType: REP_TYPE sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing RepType = Machine.Type val init : unit -> unit (* * amd64.Size.t equivalents *) val wordBytes : int val wordSize : amd64.Size.t val wordScale : amd64.Scale.t val pointerBytes : int val pointerSize : amd64.Size.t (* * Memory classes *) structure Classes : sig val Heap : amd64.MemLoc.Class.t val Stack : amd64.MemLoc.Class.t val Locals : amd64.MemLoc.Class.t val Globals : amd64.MemLoc.Class.t val Temp : amd64.MemLoc.Class.t val StaticTemp : amd64.MemLoc.Class.t val CArg : amd64.MemLoc.Class.t val CStack : amd64.MemLoc.Class.t val Code : amd64.MemLoc.Class.t val CStatic : amd64.MemLoc.Class.t val StaticNonTemp : amd64.MemLoc.Class.t val GCState : amd64.MemLoc.Class.t val GCStateHold : amd64.MemLoc.Class.t val GCStateVolatile : amd64.MemLoc.Class.t val allClasses : amd64.ClassSet.t ref val livenessClasses : amd64.ClassSet.t ref val holdClasses : amd64.ClassSet.t ref val volatileClasses : amd64.ClassSet.t ref val runtimeClasses : amd64.ClassSet.t ref val heapClasses : amd64.ClassSet.t ref val cstaticClasses : amd64.ClassSet.t ref val cargClasses : amd64.ClassSet.t ref end (* CStack locations *) val c_stackP : amd64.Label.t val c_stackPContents : amd64.MemLoc.t val c_stackPContentsOperand : amd64.Operand.t val c_stackPDerefWordOperand : amd64.Operand.t val c_stackPDerefDoubleOperand : amd64.Operand.t val c_stackPDerefFloatOperand : amd64.Operand.t (* Static temps defined in amd64-main.h *) val applyFFTempFunContentsOperand : amd64.Operand.t val applyFFTempRegArgContents : int -> amd64.MemLoc.t val applyFFTempXmmRegArgContents : amd64.Size.t * int -> amd64.MemLoc.t val fpcvtTempContentsOperand : amd64.Operand.t val fpeqTempContentsOperand : amd64.Size.t -> amd64.Operand.t (* Static arrays defined in main.h and amd64-main.h *) val local_base : amd64.CType.t -> amd64.Label.t val global_base : amd64.CType.t -> amd64.Label.t val globalObjptrNonRoot_base : amd64.Label.t (* gcState relative locations defined in gc.h *) val gcState_label: amd64.Label.t val gcState_offset: {offset: int, ty: amd64.CType.t} -> amd64.Operand.t val gcState_exnStackContents: unit -> amd64.MemLoc.t val gcState_exnStackContentsOperand: unit -> amd64.Operand.t val gcState_frontierContents: unit -> amd64.MemLoc.t val gcState_frontierContentsOperand: unit -> amd64.Operand.t val gcState_stackBottomContents: unit -> amd64.MemLoc.t val gcState_stackBottomContentsOperand: unit -> amd64.Operand.t val gcState_stackTopContents: unit -> amd64.MemLoc.t val gcState_stackTopContentsOperand: unit -> amd64.Operand.t val gcState_stackTopMinusWordDeref: unit -> amd64.MemLoc.t val gcState_stackTopMinusWordDerefOperand: unit -> amd64.Operand.t val stackTopTempContentsOperand: unit -> amd64.Operand.t val stackTopTempMinusWordDeref: unit -> amd64.MemLoc.t val stackTopTempMinusWordDerefOperand: unit -> amd64.Operand.t end mlton-20100608/mlton/codegen/amd64-codegen/amd64-mlton.fun0000644000076600000240000015435011404435625021421 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64MLton (S: AMD64_MLTON_STRUCTS): AMD64_MLTON = struct open S open amd64MLtonBasic open amd64 local open Machine in structure CFunction = CFunction structure RealSize = RealSize structure Prim = Prim structure WordSize = WordSize datatype z = datatype RealSize.t datatype z = datatype WordSize.prim end type transInfo = {addData : amd64.Assembly.t list -> unit, frameInfoToAMD64: (amd64MLtonBasic.Machine.FrameInfo.t -> amd64.FrameInfo.t), live: amd64.Label.t -> amd64.Operand.t list, liveInfo: amd64Liveness.LiveInfo.t} fun implementsPrim (p: 'a Prim.t) = let datatype z = datatype RealSize.t datatype z = datatype WordSize.prim fun w32168 s = case WordSize.prim s of W8 => true | W16 => true | W32 => true | W64 => false datatype z = datatype Prim.Name.t in case Prim.name p of CPointer_add => true | CPointer_diff => true | CPointer_equal => true | CPointer_fromWord => true | CPointer_lt => true | CPointer_sub => true | CPointer_toWord => true | FFI_Symbol _ => true | Real_Math_acos _ => false | Real_Math_asin _ => false | Real_Math_atan _ => false | Real_Math_atan2 _ => false | Real_Math_cos _ => false | Real_Math_exp _ => false | Real_Math_ln _ => false | Real_Math_log10 _ => false | Real_Math_sin _ => false | Real_Math_sqrt _ => true | Real_Math_tan _ => false | Real_abs _ => true | Real_add _ => true | Real_castToWord _ => true | Real_div _ => true | Real_equal _ => true | Real_ldexp _ => false | Real_le _ => true | Real_lt _ => true | Real_mul _ => true | Real_muladd _ => true | Real_mulsub _ => true | Real_neg _ => true | Real_qequal _ => true | Real_rndToReal _ => true | Real_rndToWord (_, s2, {signed}) => signed orelse w32168 s2 | Real_round _ => false | Real_sub _ => true | Thread_returnToC => false | Word_add _ => true | Word_addCheck _ => true | Word_andb _ => true | Word_castToReal _ => true | Word_equal _ => true | Word_extdToWord _ => true | Word_lshift _ => true | Word_lt _ => true | Word_mul _ => true | Word_mulCheck _ => true | Word_neg _ => true | Word_negCheck _ => true | Word_notb _ => true | Word_orb _ => true | Word_quot _ => true | Word_rem _ => true | Word_rndToReal (s1, _, {signed}) => signed orelse w32168 s1 | Word_rol _ => true | Word_ror _ => true | Word_rshift _ => true | Word_sub _ => true | Word_subCheck _ => true | Word_xorb _ => true | _ => false end val implementsPrim: Machine.Type.t Prim.t -> bool = Trace.trace ("amd64MLton.implementsPrim", Prim.layout, Bool.layout) implementsPrim fun prim {prim : RepType.t Prim.t, args : (Operand.t * Size.t) vector, dsts : (Operand.t * Size.t) vector, transInfo = {...} : transInfo} = let val primName = Prim.toString prim datatype z = datatype Prim.Name.t fun getDst1 () = Vector.sub (dsts, 0) handle _ => Error.bug "amd64MLton.prim: getDst1" fun getSrc1 () = Vector.sub (args, 0) handle _ => Error.bug "amd64MLton.prim: getSrc1" fun getSrc2 () = (Vector.sub (args, 0), Vector.sub (args, 1)) handle _ => Error.bug "amd64MLton.prim: getSrc2" fun getSrc3 () = (Vector.sub (args, 0), Vector.sub (args, 1), Vector.sub (args, 2)) handle _ => Error.bug "amd64MLton.prim: getSrc3" fun mov () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: mov, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src, size = srcsize}], transfer = NONE}] end fun movx oper = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: movx, dstsize/srcsize", fn () => Size.lt(srcsize,dstsize)) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_movx {oper = oper, dst = dst, src = src, dstsize = dstsize, srcsize = srcsize}], transfer = NONE}] end fun xvom () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: xvom, dstsize/srcsize", fn () => Size.lt(dstsize,srcsize)) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_xvom {dst = dst, src = src, dstsize = dstsize, srcsize = srcsize}], transfer = NONE}] end fun binal oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_binal {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun pmd oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: pmd, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pmd {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun imul2 () = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: imul2, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_imul2 {dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun unal oper = let val (src,srcsize) = getSrc1 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: unal, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src, size = srcsize}, Assembly.instruction_unal {oper = oper, dst = dst, size = dstsize}], transfer = NONE}] end fun sral oper = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.prim: sral, dstsize/src1size", fn () => src1size = dstsize) val _ = Assert.assert ("amd64MLton.prim: sral, src2size", fn () => src2size = Size.LONG) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_sral {oper = oper, dst = dst, count = src2, size = dstsize}], transfer = NONE}] end fun cmp condition = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.prim: cmp, src1size/src2size", fn () => src1size = src2size) in (* Can't have an immediate in src1 position, * so reverse the srcs and reverse the condition. * * This won't fix an immediate in both positions. * Either constant folding eliminated it * or the register allocator will raise an error. *) case Operand.deImmediate src1 of SOME _ => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_cmp {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_setcc {condition = Instruction.condition_reverse condition, dst = dst, size = dstsize}], transfer = NONE}] | NONE => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_cmp {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun compare ({signed}, s, u) = let val f = if signed then s else u in cmp f end fun sse_movs () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: sse_movs, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movs {dst = dst, src = src, size = srcsize}], transfer = NONE}] end (* fun sse_ucomis condition = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.prim: cmp, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end *) fun sse_cvtsfp2sfp () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: sse_cvtsfp2sfp, dstsize/srcsize", fn () => srcsize <> dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_cvtsfp2sfp {dst = dst, dstsize = dstsize, src = src, srcsize = srcsize}], transfer = NONE}] end fun sse_movd () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: sse_movd, dstsize/srcsize", fn () => srcsize <> dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movd {dst = dst, dstsize = dstsize, src = src, srcsize = srcsize}], transfer = NONE}] end fun sse_binas oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.SSE_ADDS) orelse (oper = Instruction.SSE_MULS) orelse (oper = Instruction.SSE_MAXS) orelse (oper = Instruction.SSE_MINS) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movs {dst = dst, src = src1, size = src1size}, Assembly.instruction_sse_binas {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun sse_binas_mul oper = let val ((src1,src1size), (src2,src2size), (src3,src3size)) = getSrc3 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize andalso src3size = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movs {dst = dst, src = src1, size = src1size}, Assembly.instruction_sse_binas {oper = Instruction.SSE_MULS, dst = dst, src = src2, size = dstsize}, Assembly.instruction_sse_binas {oper = oper, dst = dst, src = src3, size = dstsize}], transfer = NONE}] end fun sse_unas oper = let val (src,srcsize) = getSrc1 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("amd64MLton.prim: unal, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_unas {oper = oper, src = src, dst = dst, size = dstsize}], transfer = NONE}] end val (comment_begin, comment_end) = if !Control.Native.commented > 0 then let val comment = primName in (AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment ("begin prim: " ^ comment)], transfer = NONE}), AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment ("end prim: " ^ comment)], transfer = NONE})) end else (AppendList.empty,AppendList.empty) in AppendList.appends [comment_begin, (case Prim.name prim of CPointer_add => binal Instruction.ADD | CPointer_diff => binal Instruction.SUB | CPointer_equal => cmp Instruction.E | CPointer_fromWord => mov () | CPointer_lt => cmp Instruction.B | CPointer_sub => binal Instruction.SUB | CPointer_toWord => mov () | FFI_Symbol {name, symbolScope, ...} => let datatype z = datatype CFunction.SymbolScope.t datatype z = datatype Control.Format.t datatype z = datatype MLton.Platform.OS.t val (dst, dstsize) = getDst1 () val label = fn () => Label.fromString name (* how to access an imported label's address *) (* windows coff will add another leading _ to label *) val coff = fn () => Label.fromString ("_imp__" ^ name) val macho = fn () => Label.fromString (name ^ "@GOTPCREL") val elf = fn () => Label.fromString (name ^ "@GOTPCREL") val importLabel = fn () => case !Control.Target.os of Cygwin => coff () | Darwin => macho () | MinGW => coff () | _ => elf () val direct = fn () => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_lea {dst = dst, src = Operand.memloc_label (label ()), size = dstsize}], transfer = NONE}] val indirect = fn () => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = Operand.memloc_label (importLabel ()), size = dstsize}], transfer = NONE}] in case (symbolScope, !Control.Target.os, !Control.positionIndependent) of (* As long as the symbol is private (this means it is not * exported to code outside this text segment), then * RIP-relative addressing works on every OS/format. *) (Private, _, _) => direct () (* When linking an executable, ELF and darwin-x86_64 use * a special trick to "simplify" the code. All exported * functions and symbols have pointers that correspond to * to the executable. Function pointers point to the * automatically created PLT entry in the executable. * Variables are copied/relocated into the executable bss. * This means that direct access is fine for executable * and archive formats. (It also means direct access is * NOT fine for a library, even if it defines the symbol) * * On ELF&darwin, a public symbol must be accessed via * the GOT. This is because the final value may not be * in this text segment. If the executable uses it, then * the unique C address resides in the executable's * text segment. The loader does this by creating a PLT * proxy or copying values to the executable text segment. *) | (Public, _, true) => indirect () | (Public, _, false) => direct () (* On windows, the address is the point of definition. So * we must use an indirect lookup even in executables. *) | (External, MinGW, _) => indirect () | (External, Cygwin, _) => indirect () (* When compiling to a library, we need to access external * symbols via some address that is updated by the loader. * That address resides within our data segment, and can * be easily referenced using RIP-relative addressing. * This trick is used on every platform MLton supports. * Windows rewrites __imp__name symbols in our segment. * ELF and darwin-x86_64 rewrite name@GOTPCREL. *) | (External, _, true) => indirect () | (External, _, false) => direct () end | Real_Math_sqrt _ => sse_unas Instruction.SSE_SQRTS | Real_abs s => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: Real_abs, dstsize/srcsize", fn () => srcsize = dstsize) fun mkConst wordSize = WordX.rshift (WordX.allOnes wordSize, WordX.one wordSize, {signed = false}) val (const,constsize) = case s of R32 => (mkConst WordSize.word32, Size.LONG) | R64 => (mkConst WordSize.word64, Size.QUAD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movd {dst = dst, dstsize = dstsize, src = Operand.immediate_word const, srcsize = constsize}, Assembly.instruction_sse_binlp {oper = Instruction.SSE_ANDP, src = src, dst = dst, size = dstsize}], transfer = NONE}] end | Real_add _ => sse_binas Instruction.SSE_ADDS | Real_castToWord _ => sse_movd () | Real_div _ => sse_binas Instruction.SSE_DIVS | Real_equal _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val tmp = fpeqTempContentsOperand dstsize val _ = Assert.assert ("amd64MLton.prim: Real_equal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = Instruction.NP, dst = tmp, size = dstsize}, Assembly.instruction_setcc {condition = Instruction.Z, dst = dst, size = dstsize}, Assembly.instruction_binal {oper = Instruction.AND, src = tmp, dst = dst, size = dstsize}], transfer = NONE}] end | Real_lt _ => (* sse_ucomis Instruction.A *) let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val tmp = fpeqTempContentsOperand dstsize val _ = Assert.assert ("amd64MLton.prim: Real_equal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_setcc {condition = Instruction.NP, dst = tmp, size = dstsize}, Assembly.instruction_setcc {condition = Instruction.C, dst = dst, size = dstsize}, Assembly.instruction_binal {oper = Instruction.AND, src = tmp, dst = dst, size = dstsize}], transfer = NONE}] end | Real_le _ => (* sse_ucomis Instruction.AE *) let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val tmp = fpeqTempContentsOperand dstsize val _ = Assert.assert ("amd64MLton.prim: Real_equal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_setcc {condition = Instruction.NP, dst = tmp, size = dstsize}, Assembly.instruction_setcc {condition = Instruction.NA, dst = dst, size = dstsize}, Assembly.instruction_binal {oper = Instruction.AND, src = tmp, dst = dst, size = dstsize}], transfer = NONE}] end | Real_mul _ => sse_binas Instruction.SSE_MULS | Real_muladd _ => sse_binas_mul Instruction.SSE_ADDS | Real_mulsub _ => sse_binas_mul Instruction.SSE_SUBS | Real_neg s => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("amd64MLton.prim: Real_neg, dstsize/srcsize", fn () => srcsize = dstsize) fun mkConst wordSize = (WordX.notb o WordX.rshift) (WordX.allOnes wordSize, WordX.one wordSize, {signed = false}) val (const,constsize) = case s of R32 => (mkConst WordSize.word32, Size.LONG) | R64 => (mkConst WordSize.word64, Size.QUAD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_movd {dst = dst, dstsize = dstsize, src = Operand.immediate_word const, srcsize = constsize}, Assembly.instruction_sse_binlp {oper = Instruction.SSE_XORP, src = src, dst = dst, size = dstsize}], transfer = NONE}] end | Real_qequal _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val tmp = fpeqTempContentsOperand dstsize val _ = Assert.assert ("amd64MLton.prim: Real_qequal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_ucomis {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = Instruction.P, dst = tmp, size = dstsize}, Assembly.instruction_setcc {condition = Instruction.E, dst = dst, size = dstsize}, Assembly.instruction_binal {oper = Instruction.OR, src = tmp, dst = dst, size = dstsize}], transfer = NONE}] end | Real_rndToReal (s, s') => let val b = RealSize.bits s val b' = RealSize.bits s' in if Bits.equals (b, b') then sse_movs () else sse_cvtsfp2sfp () end | Real_rndToWord (_, s', {signed}) => let fun default () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_cvtsfp2si {src = src, dst = dst, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] end fun default' () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val (tmp,tmpsize) = (fpcvtTempContentsOperand, Size.QUAD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_cvtsfp2si {src = src, dst = tmp, srcsize = srcsize, dstsize = tmpsize}, Assembly.instruction_xvom {src = tmp, dst = dst, dstsize = dstsize, srcsize = tmpsize}], transfer = NONE}] end in case (WordSize.prim s', signed) of (W8, _) => default' () | (W16, _) => default' () | (W32, false) => default' () | (W32, true) => default () | (W64, true) => default () | _ => Error.bug "amd64MLton.prim: Real_rndToWord, W64, false" end | Real_sub _ => sse_binas Instruction.SSE_SUBS | Word_add _ => binal Instruction.ADD | Word_andb _ => binal Instruction.AND | Word_castToReal _ => sse_movd () | Word_equal _ => cmp Instruction.E | Word_lshift _ => sral Instruction.SHL | Word_lt (_, sg) => compare (sg, Instruction.L, Instruction.B) | Word_mul (s, {signed}) => (case WordSize.prim s of W8 => pmd (if signed then Instruction.IMUL else Instruction.MUL) | W16 => imul2 () | W32 => imul2 () | W64 => imul2 ()) | Word_neg _ => unal Instruction.NEG | Word_notb _ => unal Instruction.NOT | Word_orb _ => binal Instruction.OR | Word_quot (_, {signed}) => pmd (if signed then Instruction.IDIV else Instruction.DIV) | Word_rem (_, {signed}) => pmd (if signed then Instruction.IMOD else Instruction.MOD) | Word_rndToReal (s, _, {signed}) => let fun default () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_sse_cvtsi2sfp {src = src, dst = dst, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] end fun default' () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val (tmp,tmpsize) = (fpcvtTempContentsOperand, Size.QUAD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_movx {oper = if signed then Instruction.MOVSX else Instruction.MOVZX, src = src, dst = tmp, dstsize = tmpsize, srcsize = srcsize}, Assembly.instruction_sse_cvtsi2sfp {src = tmp, dst = dst, srcsize = tmpsize, dstsize = dstsize}], transfer = NONE}] end in case (WordSize.prim s, signed) of (W8, _) => default' () | (W16, _) => default' () | (W32, false) => default' () | (W32, true) => default () | (W64, true) => default () | _ => Error.bug "amd64MLton.prim: Word_rndToReal, W64, false" end | Word_rol _ => sral Instruction.ROL | Word_ror _ => sral Instruction.ROR | Word_rshift (_, {signed}) => sral (if signed then Instruction.SAR else Instruction.SHR) | Word_sub _ => binal Instruction.SUB | Word_extdToWord (s, s', {signed}) => let val b = WordSize.bits s val b' = WordSize.bits s' in if Bits.< (b, b') then movx (if signed then Instruction.MOVSX else Instruction.MOVZX) else if Bits.equals (b, b') then mov () else xvom () end | Word_xorb _ => binal Instruction.XOR | _ => Error.bug ("amd64MLton.prim: strange Prim.Name.t: " ^ primName)), comment_end] end fun ccall {args: (amd64.Operand.t * amd64.Size.t) vector, frameInfo, func, return: amd64.Label.t option, transInfo = {...}: transInfo} = let val CFunction.T {convention, target, ...} = func val comment_begin = if !Control.Native.commented > 0 then AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment (concat ["begin ccall: ", CFunction.Convention.toString convention, " ", CFunction.Target.toString target])], transfer = NONE}) else AppendList.empty in AppendList.appends [comment_begin, AppendList.single (Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (Transfer.ccall {args = Vector.toList args, frameInfo = frameInfo, func = func, return = return})})] end fun creturn {dsts: (amd64.Operand.t * amd64.Size.t) vector, frameInfo: amd64.FrameInfo.t option, func: RepType.t CFunction.t, label: amd64.Label.t, transInfo = {live, liveInfo, ...}: transInfo} = let val CFunction.T {convention, target, ...} = func fun default () = let val _ = amd64Liveness.LiveInfo.setLiveOperands (liveInfo, label, live label) in AppendList.single (amd64.Block.mkBlock' {entry = SOME (Entry.creturn {dsts = dsts, frameInfo = frameInfo, func = func, label = label}), statements = [], transfer = NONE}) end val comment_end = if !Control.Native.commented > 0 then AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment (concat ["begin creturn: ", CFunction.Convention.toString convention, " ", CFunction.Target.toString target])], transfer = NONE}) else AppendList.empty in AppendList.appends [default (), comment_end] end fun arith {prim : RepType.t Prim.t, args : (Operand.t * Size.t) vector, dsts : (Operand.t * Size.t) vector, overflow : Label.t, success : Label.t, transInfo = {...} : transInfo} = let val primName = Prim.toString prim datatype z = datatype Prim.Name.t fun getDst1 () = Vector.sub (dsts, 0) handle _ => Error.bug "amd64MLton.arith: getDst1" fun getSrc1 () = Vector.sub (args, 0) handle _ => Error.bug "amd64MLton.arith: getSrc1" fun getSrc2 () = (Vector.sub (args, 0), Vector.sub (args, 1)) handle _ => Error.bug "amd64MLton.arith: getSrc2" fun check (statements, condition) = AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = statements, transfer = SOME (amd64.Transfer.iff {condition = condition, truee = overflow, falsee = success})}) fun binal (oper: amd64.Instruction.binal, condition) = let val (dst, dstsize) = getDst1 () val ((src1, src1size), (src2, src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.arith: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are * temporaries and the oper is commutative. *) val (src1,src2) = if (oper = amd64.Instruction.ADD) then case (amd64.Operand.deMemloc src1, amd64.Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in check ([Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_binal {oper = oper, dst = dst, src = src2, size = dstsize}], condition) end fun pmd (oper: amd64.Instruction.md, condition) = let val (dst, dstsize) = getDst1 () val ((src1, src1size), (src2, src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.arith: pmd, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are * temporaries and the oper is commutative. *) val (src1, src2) = if oper = amd64.Instruction.MUL then case (amd64.Operand.deMemloc src1, amd64.Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in check ([Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_pmd {oper = oper, dst = dst, src = src2, size = dstsize}], condition) end fun unal (oper: amd64.Instruction.unal, condition) = let val (dst, dstsize) = getDst1 () val (src1, src1size) = getSrc1 () val _ = Assert.assert ("amd64MLton.arith: unal, dstsize/src1size", fn () => src1size = dstsize) in check ([Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_unal {oper = oper, dst = dst, size = dstsize}], condition) end fun imul2 condition = let val (dst, dstsize) = getDst1 () val ((src1, src1size), (src2, src2size)) = getSrc2 () val _ = Assert.assert ("amd64MLton.arith: imul2, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are * temporaries and the oper is commutative. *) val (src1, src2) = case (amd64.Operand.deMemloc src1, amd64.Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if amd64Liveness.track memloc_src1 andalso amd64Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) in check ([Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_imul2 {dst = dst, src = src2, size = dstsize}], condition) end val (comment_begin,_) = if !Control.Native.commented > 0 then let val comment = primName in (AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment ("begin arith: " ^ comment)], transfer = NONE}), AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment ("end arith: " ^ comment)], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun flag {signed} = if signed then amd64.Instruction.O else amd64.Instruction.C in AppendList.appends [comment_begin, (case Prim.name prim of Word_addCheck (_, sg) => binal (amd64.Instruction.ADD, flag sg) | Word_mulCheck (s, {signed}) => let in if signed then (case WordSize.prim s of W8 => pmd (amd64.Instruction.IMUL, amd64.Instruction.O) | W16 => imul2 amd64.Instruction.O | W32 => imul2 amd64.Instruction.O | W64 => imul2 amd64.Instruction.O) else pmd (amd64.Instruction.MUL, amd64.Instruction.C) end | Word_negCheck _ => unal (amd64.Instruction.NEG, amd64.Instruction.O) | Word_subCheck (_, sg) => binal (amd64.Instruction.SUB, flag sg) | _ => Error.bug ("amd64MLton.arith: strange Prim.Name.t: " ^ primName))] end end mlton-20100608/mlton/codegen/amd64-codegen/amd64-mlton.sig0000644000076600000240000000436111404435625021407 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_MLTON_STRUCTS = sig structure amd64MLtonBasic : AMD64_MLTON_BASIC structure amd64Liveness : AMD64_LIVENESS sharing amd64MLtonBasic.amd64 = amd64Liveness.amd64 end signature AMD64_MLTON = sig include AMD64_MLTON_STRUCTS include AMD64_MLTON_BASIC sharing amd64 = amd64MLtonBasic.amd64 sharing amd64 = amd64Liveness.amd64 sharing amd64.Label = Machine.Label sharing Machine = amd64MLtonBasic.Machine type transInfo = {addData : amd64.Assembly.t list -> unit, frameInfoToAMD64: (amd64MLtonBasic.Machine.FrameInfo.t -> amd64.FrameInfo.t), live: amd64.Label.t -> amd64.Operand.t list, liveInfo: amd64Liveness.LiveInfo.t} (* arith, c call, and primitive assembly sequences. *) val arith: {prim: RepType.t Machine.Prim.t, args: (amd64.Operand.t * amd64.Size.t) vector, dsts: (amd64.Operand.t * amd64.Size.t) vector, overflow: amd64.Label.t, success: amd64.Label.t, transInfo : transInfo} -> amd64.Block.t' AppendList.t val ccall: {args: (amd64.Operand.t * amd64.Size.t) vector, frameInfo: amd64.FrameInfo.t option, func: RepType.t Machine.CFunction.t, return: amd64.Label.t option, transInfo: transInfo} -> amd64.Block.t' AppendList.t val creturn: {dsts: (amd64.Operand.t * amd64.Size.t) vector, frameInfo: amd64.FrameInfo.t option, func: RepType.t Machine.CFunction.t, label: amd64.Label.t, transInfo: transInfo} -> amd64.Block.t' AppendList.t val implementsPrim: RepType.t Machine.Prim.t -> bool val prim: {prim: RepType.t Machine.Prim.t, args: (amd64.Operand.t * amd64.Size.t) vector, dsts: (amd64.Operand.t * amd64.Size.t) vector, transInfo: transInfo} -> amd64.Block.t' AppendList.t end mlton-20100608/mlton/codegen/amd64-codegen/amd64-pseudo.sig0000644000076600000240000004104311404435625021553 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_PSEUDO = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize val tracer : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val tracerTop : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) structure Size : sig datatype class = INT | FLT datatype t = BYTE | WORD | LONG | QUAD | SNGL | DBLE val fromBytes : int -> t val toBytes : t -> int val fromCType : CType.t -> t vector val class : t -> class val eq : t * t -> bool val lt : t * t -> bool val toString : t -> string end structure Immediate : sig type t val word : WordX.t -> t val int' : int * WordSize.t -> t val int : int -> t val zero : t val label : Label.t -> t val labelPlusWord : Label.t * WordX.t -> t val labelPlusInt : Label.t * int -> t end structure Scale : sig datatype t = One | Two | Four | Eight val fromBytes : int -> t val fromCType : CType.t -> t end structure MemLoc : sig structure Class : sig type t val new : {name: string} -> t val Temp : t val StaticTemp : t val CArg : t val CStack : t val Code : t val eq : t * t -> bool end type t val layout : t -> Layout.t val imm : {base: Immediate.t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val basic : {base: Immediate.t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val simple : {base: t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val complex : {base: t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val shift : {origin: t, disp: Immediate.t, scale: Scale.t, size: Size.t} -> t val class : t -> Class.t val compare : t * t -> order (* * Static memory locations *) val makeContents : {base: Immediate.t, size: Size.t, class: Class.t} -> t end structure ClassSet : SET sharing type ClassSet.Element.t = MemLoc.Class.t structure MemLocSet : SET sharing type MemLocSet.Element.t = MemLoc.t structure Operand : sig type t val layout : t -> Layout.t val toString : t -> string val immediate : Immediate.t -> t val immediate_word : WordX.t -> t val immediate_int' : int * WordSize.t -> t val immediate_int : int -> t val immediate_zero : t val immediate_label : Label.t -> t val deImmediate : t -> Immediate.t option val label : Label.t -> t val deLabel : t -> Label.t option val memloc : MemLoc.t -> t val memloc_label: Label.t -> t val deMemloc : t -> MemLoc.t option val size : t -> Size.t option val eq : t * t -> bool val mayAlias : t * t -> bool end structure Instruction : sig (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 58 *) | ADC (* signed/unsigned addition with carry; p. 56 *) | SUB (* signed/unsigned subtraction; p. 234 *) | SBB (* signed/unsigned subtraction with borrow; p. 216 *) | AND (* logical and; p. 60 *) | OR (* logical or; p. 176 *) | XOR (* logical xor; p. 243 *) (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 114 *) | MUL (* unsigned multiplication; p. 170 *) | IDIV (* signed division; p. 112 *) | DIV (* unsigned division; p. 108 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 117 *) | DEC (* decrement by 1; p. 106 *) | NEG (* two's complement negation; p. 172 *) | NOT (* one's complement negation; p. 175 *) (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 211 *) | SHL (* shift logical left; p. 211 *) | SAR (* shift arithmetic right; p. 214 *) | SHR (* shift logical right; p. 214 *) | ROL (* rotate left; p. 206 *) | RCL (* rotate through carry left; p. 197 *) | ROR (* rotate right; p. 208 *) | RCR (* rotate through carry right; p. 199 *) (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 167 *) | MOVZX (* move with zero extention; p. 169 *) (* Condition test field; p. 340 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate : condition -> condition val condition_reverse : condition -> condition (* Scalar SSE binary arithmetic instructions. *) datatype sse_binas = SSE_ADDS (* addition; p. 7,10 *) | SSE_SUBS (* subtraction; p. 371,374 *) | SSE_MULS (* multiplication; p. 201,204 *) | SSE_DIVS (* division; p. 97,100 *) | SSE_MAXS (* maximum; p. 128, 130 *) | SSE_MINS (* minimum; p. 132, 134 *) (* Scalar SSE unary arithmetic instructions. *) datatype sse_unas = SSE_SQRTS (* square root; p. 360,362 *) (* Packed SSE binary logical instructions (used as scalar). *) datatype sse_binlp = SSE_ANDNP (* and-not; p. 17,19 *) | SSE_ANDP (* and; p. 21,23 *) | SSE_ORP (* or; p. 206,208 *) | SSE_XORP (* xor; p. 391,393 *) type t end structure PseudoOp : sig type t val toString : t -> string val data : unit -> t val text : unit -> t val p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val byte : Immediate.t list -> t val word : Immediate.t list -> t val long : Immediate.t list -> t val quad : Immediate.t list -> t end structure Assembly : sig type t val toString : t -> string val comment : string -> t val isComment : t -> bool val pseudoop : PseudoOp.t -> t val pseudoop_data : unit -> t val pseudoop_text : unit -> t val pseudoop_p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val pseudoop_byte : Immediate.t list -> t val pseudoop_global: Label.t -> t val pseudoop_word : Immediate.t list -> t val pseudoop_long : Immediate.t list -> t val pseudoop_quad : Immediate.t list -> t val label : Label.t -> t val instruction : Instruction.t -> t val instruction_nop : unit -> t val instruction_binal : {oper: Instruction.binal, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pmd : {oper: Instruction.md, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_imul2 : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_unal : {oper: Instruction.unal, dst: Operand.t, size: Size.t} -> t val instruction_sral : {oper: Instruction.sral, count: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmp : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_test : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_setcc : {condition: Instruction.condition, dst: Operand.t, size: Size.t} -> t val instruction_jmp : {target: Operand.t, absolute: bool} -> t val instruction_jcc : {condition: Instruction.condition, target: Operand.t} -> t val instruction_call : {target: Operand.t, absolute: bool} -> t val instruction_ret : {src: Operand.t option} -> t val instruction_mov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmovcc : {condition: Instruction.condition, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_xchg : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_ppush : {src: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_ppop : {dst: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_movx : {oper: Instruction.movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_xvom : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_lea : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_binas : {oper: Instruction.sse_binas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_unas : {oper: Instruction.sse_unas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_binlp : {oper: Instruction.sse_binlp, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_movs : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_comis : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_sse_ucomis : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_sse_cvtsfp2sfp : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_cvtsfp2si : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_cvtsi2sfp : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_movd : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t end structure FrameInfo: sig datatype t = T of {size: int, frameLayoutsIndex: int} end structure Entry: sig type t val cont: {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} -> t val creturn: {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} -> t val func: {label: Label.t, live: MemLocSet.t} -> t val handler: {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} -> t val jump: {label: Label.t} -> t val label: t -> Label.t end structure Transfer : sig structure Cases : sig type 'a t val word : (WordX.t * 'a) list -> 'a t end type t val goto : {target: Label.t} -> t val iff : {condition: Instruction.condition, truee: Label.t, falsee: Label.t} -> t val switch : {test: Operand.t, cases: Label.t Cases.t, default: Label.t} -> t val tail : {target: Label.t, live: MemLocSet.t} -> t val nontail : {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} -> t val return : {live: MemLocSet.t} -> t val raisee : {live: MemLocSet.t} -> t val ccall : {args: (Operand.t * Size.t) list, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, return: Label.t option} -> t end structure ProfileLabel : sig type t end structure Block : sig type t' val mkBlock': {entry: Entry.t option, statements: Assembly.t list, transfer: Transfer.t option} -> t' val mkProfileBlock': {profileLabel: ProfileLabel.t} -> t' val printBlock' : t' -> unit type t val printBlock : t -> unit val compress: t' list -> t list end structure Chunk : sig datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end functor amd64PseudoCheck(structure S : AMD64) : AMD64_PSEUDO = S mlton-20100608/mlton/codegen/amd64-codegen/amd64-simplify.fun0000644000076600000240000057316311404435625022133 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64Simplify(S: AMD64_SIMPLIFY_STRUCTS): AMD64_SIMPLIFY = struct open S open amd64 val tracer = amd64.tracer val tracerTop = amd64.tracerTop structure PeepholeBlock = struct structure Peephole = Peephole(type entry_type = Entry.t type profileLabel_type = ProfileLabel.t option type statement_type = Assembly.t type transfer_type = Transfer.t datatype block = datatype Block.t) open Peephole fun make_callback_msg name = let val count = ref 0 val total = ref 0 val callback = fn true => (Int.inc count; Int.inc total) | false => Int.inc total val msg = fn () => Control.messageStr (Control.Detail, concat [name, ": ", Int.toString (!count), " / ", Int.toString (!total)]) in (callback,msg) end val isComment : statement_type -> bool = fn Assembly.Comment _ => true | _ => false local val isInstructionMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV _) => true | _ => false val isInstructionBinALMD : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL _) => true | Assembly.Instruction (Instruction.pMD _) => true | Assembly.Instruction (Instruction.IMUL2 _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV, All isComment, One isInstructionBinALMD], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_binal {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pmd {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_imul2 {src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeepholeBlock: elimBinALMDDouble" val (callback,elimBinALMDDouble_msg) = make_callback_msg "elimBinALMDDouble" in val elimBinALMDDouble : optimization = {template = template, rewriter = rewriter, callback = callback} val elimBinALMDDouble_msg = elimBinALMDDouble_msg end local val isInstructionSSEMOVS : statement_type -> bool = fn Assembly.Instruction (Instruction.SSE_MOVS _) => true | _ => false val isInstructionSSEBinAS : statement_type -> bool = fn Assembly.Instruction (Instruction.SSE_BinAS _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSSEMOVS, All isComment, One isInstructionSSEBinAS], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.SSE_MOVS {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.SSE_BinAS {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_sse_movs {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_sse_binas {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeepholeBlock: elimSSEBinASDouble" val (callback,elimSSEBinASDouble_msg) = make_callback_msg "elimSSEBinASDouble" in val elimSSEBinASDouble : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSSEBinASDouble_msg = elimSSEBinASDouble_msg end local val isInstructionMOV_srcImmediate : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV {src = Operand.Immediate _, ...}) => true | _ => false val isInstructionBinALMD_operCommute : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL {oper, src, dst, ...}) => ((oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR)) andalso (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | Assembly.Instruction (Instruction.pMD {oper, src, dst, ...}) => ((oper = Instruction.IMUL) orelse (oper = Instruction.MUL)) andalso (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | Assembly.Instruction (Instruction.IMUL2 {src, dst, ...}) => (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_srcImmediate, All isComment, One isInstructionBinALMD_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_binal {oper = oper2, src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_pmd {oper = oper2, src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_imul2 {src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | _ => Error.bug "amd64Simplify.PeepholeBlock: commuteBinALMD" val (callback,commuteBinALMD_msg) = make_callback_msg "commuteBinALMD" in val commuteBinALMD : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteBinALMD_msg = commuteBinALMD_msg end local val getImmediate1 = fn Immediate.Word w => if WordX.isOne w then SOME false else if WordX.isNegOne w then SOME true else NONE | _ => NONE val isInstructionADDorSUB_srcImmediate1 : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL {oper, src = Operand.Immediate immediate, ...}) => (case oper of Instruction.ADD => true | Instruction.SUB => true | _ => false) andalso isSome (getImmediate1 (Immediate.destruct immediate)) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionADDorSUB_srcImmediate1], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.BinAL {oper, src = Operand.Immediate immediate, dst, size})]], finish, transfer} => if (case List.fold (finish, (false, false), fn (asm, (b, b')) => case asm of Assembly.Comment _ => (b, b') | Assembly.Instruction (Instruction.BinAL {oper = Instruction.ADC, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.BinAL {oper = Instruction.SBB, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.SETcc {condition = Instruction.C, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.SETcc {condition = Instruction.NC, ...}) => (true, if b then b' else true) | _ => (true, b')) of (_, true) => true | (false, _) => (case transfer of Transfer.Iff {condition = Instruction.C, ...} => true | Transfer.Iff {condition = Instruction.NC, ...} => true | _ => false) | _ => false) then NONE else let val oper = case (oper, getImmediate1 (Immediate.destruct immediate)) of (Instruction.ADD, SOME false) => Instruction.INC | (Instruction.ADD, SOME true ) => Instruction.DEC | (Instruction.SUB, SOME false) => Instruction.DEC | (Instruction.SUB, SOME true ) => Instruction.INC | _ => Error.bug "amd64Simplify.PeeholeBlock: elimAddSub1:oper" val statements = (Assembly.instruction_unal {oper = oper, dst = dst, size = size}):: finish val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimAddSub1" val (callback,elimAddSub1_msg) = make_callback_msg "elimAddSub1" in val elimAddSub1: optimization = {template = template, rewriter = rewriter, callback = callback} val elimAddSub1_msg = elimAddSub1_msg end local val rec log2' = fn (w : WordX.t, i : int) => if WordX.isZero w then NONE else if WordX.isOne (WordX.andb (w, WordX.one (WordX.size w))) then if WordX.isOne w then SOME (i, false) else if WordX.isNegOne w then SOME (i, true) else NONE else log2' (WordX.rshift (w, WordX.one (WordX.size w), {signed = true}), i + 1) fun log2 w = log2' (w, 0 : int) fun divTemp size = MemLoc.imm {base = Immediate.label (Label.fromString "divTemp"), index = Immediate.zero, scale = Scale.Four, size = size, class = MemLoc.Class.Temp} val isImmediatePow2 = fn Immediate.Word w => isSome (log2 w) | _ => false val getImmediateLog2 = fn Immediate.Word w => log2 w | _ => NONE val isInstructionMULorDIV_srcImmediatePow2 : statement_type -> bool = fn Assembly.Instruction (Instruction.pMD {oper, src = Operand.Immediate immediate, ...}) => (case oper of Instruction.IMUL => true | Instruction.MUL => true | Instruction.IDIV => true | Instruction.DIV => true | _ => false) andalso isImmediatePow2 (Immediate.destruct immediate) | Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, ...}) => isImmediatePow2 (Immediate.destruct immediate) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMULorDIV_srcImmediatePow2, All isComment], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IMUL, src = Operand.Immediate immediate, dst, size})], comments], finish = [], transfer as Transfer.Iff {condition, truee, falsee}} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => let val transfer = case condition of Instruction.O => Transfer.Goto {target = falsee} | Instruction.NO => Transfer.Goto {target = truee} | _ => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:transfer" val statements = List.fold(start, comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (0,true) => let val statements = List.fold (start, (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: comments), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IMUL, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: (List.concat [comments, finish])), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val statements = (fn l => (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.MUL, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (i,false) => if i < (8 * Size.toBytes size) then let val statements = (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | SOME (_,true) => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IDIV, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val divTemp = Operand.MemLoc (divTemp size) val width = 8 * Size.toBytes size val statements = ((fn l => (Assembly.instruction_mov {src = dst, dst = divTemp, size = size}):: l) o (fn l => if i > 1 then (Assembly.instruction_sral {oper = Instruction.SAR, dst = divTemp, count = Operand.immediate_int (i - 1), size = size}):: l else l) o (fn l => if i < width then (Assembly.instruction_sral {oper = Instruction.SHR, dst = divTemp, count = Operand.immediate_int (width - i), size = size}):: l else l) o (fn l => (Assembly.instruction_binal {oper = Instruction.ADD, src = divTemp, dst = dst, size = size}):: (Assembly.instruction_sral {oper = Instruction.SAR, count = Operand.immediate_int i, dst = dst, size = size}):: l) o (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.DIV, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (i,false) => if i < (8 * Size.toBytes size) then let val statements = (Assembly.instruction_sral {oper = Instruction.SHR, count = Operand.immediate_int i, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | SOME (_,true) => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, dst, size})], comments], finish = [], transfer as Transfer.Iff {condition, truee, falsee}} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => let val transfer = case condition of Instruction.O => Transfer.Goto {target = falsee} | Instruction.NO => Transfer.Goto {target = truee} | _ => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:transfer" val statements = List.fold(start, comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (0,true) => let val statements = List.fold (start, (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: comments), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: (List.concat [comments, finish])), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val statements = (fn l => (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | _ => Error.bug "amd64Simplify.PeeholeBlock: elimMDPow2" val (callback,elimMDPow2_msg) = make_callback_msg "elimMDPow2" in val elimMDPow2 : optimization = {template = template, rewriter = rewriter, callback = callback} val elimMDPow2_msg = elimMDPow2_msg end local val isInstructionCMPorTEST : statement_type -> bool = fn Assembly.Instruction (Instruction.CMP _) => true | Assembly.Instruction (Instruction.TEST _) => true | _ => false val isInstructionMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV _) => true | _ => false val isInstructionSETcc : statement_type -> bool = fn Assembly.Instruction (Instruction.SETcc _) => true | _ => false val isInstruction : statement_type -> bool = fn Assembly.Instruction _ => true | _ => false val isTransfer_Iff : transfer_type -> bool = fn Transfer.Iff _ => true | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionCMPorTEST, All isComment], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction _], comments], finish, transfer} => let val rec scan = fn [] => not (isTransfer_Iff transfer) | asm::statements => if isComment asm orelse isInstructionMOV asm then scan statements else if isInstructionSETcc asm then false else if isInstruction asm then true else false in if scan finish then let val statements = List.fold(start, List.concat [comments, finish], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimCMPTEST" val (callback,elimCMPTEST_msg) = make_callback_msg "elimCMPTEST" in val elimCMPTEST : optimization = {template = template, rewriter = rewriter, callback = callback} val elimCMPTEST_msg = elimCMPTEST_msg end local val isInstructionCMP_srcImmediate0 = fn Assembly.Instruction (Instruction.CMP {src1 = Operand.Immediate immediate, ...}) => Immediate.isZero immediate | Assembly.Instruction (Instruction.CMP {src2 = Operand.Immediate immediate, ...}) => Immediate.isZero immediate | _ => false val isTransfer_Iff_E_NE = fn Transfer.Iff {condition, ...} => condition = Instruction.E orelse condition = Instruction.NE | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionCMP_srcImmediate0, All isComment], finish = Empty, transfer = isTransfer_Iff_E_NE} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.CMP {src1, src2, size})], comments], finish = [], transfer = Transfer.Iff {condition, truee, falsee}} => let val condition = case condition of Instruction.E => Instruction.Z | Instruction.NE => Instruction.NZ | _ => Error.bug "amd64Simplify.PeeholeBlock: elimCMP0:condition" val src = case (Operand.deImmediate src1, Operand.deImmediate src2) of (SOME _, NONE) => src2 | (NONE, SOME _) => src1 | (SOME immediate1, SOME _) => if Immediate.isZero immediate1 then src2 else src1 | _ => Error.bug "amd64Simplify.PeeholeBlock: elimCMP0:src" val statements = List.fold(start, (Assembly.instruction_test {src1 = src, src2 = src, size = size}):: comments, op ::) val transfer = Transfer.Iff {condition = condition, truee = truee, falsee = falsee} in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimCMP0" val (callback,elimCMP0_msg) = make_callback_msg "elimCMP0" in val elimCMP0 : optimization = {template = template, rewriter = rewriter, callback = callback} val elimCMP0_msg = elimCMP0_msg end local val isInstructionAL_setZF = fn Assembly.Instruction (Instruction.BinAL _) => true | Assembly.Instruction (Instruction.UnAL {oper, ...}) => (case oper of Instruction.NOT => false | _ => true) | Assembly.Instruction (Instruction.SRAL {oper, ...}) => (case oper of Instruction.ROL => false | Instruction.RCL => false | Instruction.ROR => false | Instruction.RCR => false | _ => true) | _ => false val isInstructionTEST_eqSrcs = fn Assembly.Instruction (Instruction.TEST {src1, src2, ...}) => Operand.eq(src1, src2) | _ => false val isTransfer_Iff_Z_NZ = fn Transfer.Iff {condition, ...} => condition = Instruction.Z orelse condition = Instruction.NZ | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionAL_setZF, All isComment, One isInstructionTEST_eqSrcs, All isComment], finish = Empty, transfer = isTransfer_Iff_Z_NZ} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction instruction], comments1, [Assembly.Instruction (Instruction.TEST {src1, ...})], comments2], finish = [], transfer as Transfer.Iff {...}} => let val dst = case instruction of Instruction.BinAL {dst, ...} => dst | Instruction.UnAL {dst, ...} => dst | Instruction.SRAL {dst, ...} => dst | _ => Error.bug "amd64Simplify.PeeholeBlock: elimALTEST:dst" in if Operand.eq(dst,src1) then let val statements = List.fold (start, (Assembly.instruction instruction):: (List.concat [comments1, comments2]), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimALTEST" val (callback,elimALTEST_msg) = make_callback_msg "elimALTEST" in val elimALTEST : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALTEST_msg = elimALTEST_msg end local val optimizations_pre = commuteBinALMD:: (* elimBinAL0L:: *) (* elimBinAL0R:: *) elimAddSub1:: elimMDPow2:: elimCMPTEST:: nil val optimizations_pre_msg = commuteBinALMD_msg:: (* elimBinAL0L_msg:: *) (* elimBinAL0R_msg:: *) elimAddSub1_msg:: elimMDPow2_msg:: nil val optimizations_post = elimBinALMDDouble:: elimSSEBinASDouble:: elimCMPTEST:: elimCMP0:: elimALTEST:: nil val optimizations_post_msg = elimBinALMDDouble_msg:: elimSSEBinASDouble_msg:: elimCMPTEST_msg:: elimCMP0_msg:: elimALTEST_msg:: nil in val peepholeBlock_pre = fn block => (peepholeBlock {optimizations = optimizations_pre, block = block}) val (peepholeBlock_pre, peepholeBlock_pre_msg) = tracer "peepholeBlock_pre" peepholeBlock_pre val peepholeBlock_pre_msg = fn () => (peepholeBlock_pre_msg (); Control.indent (); List.foreach(optimizations_pre_msg, fn msg => msg ()); Control.unindent ()) val peepholeBlock_post = fn block => (peepholeBlock {optimizations = optimizations_post, block = block}) val (peepholeBlock_post, peepholeBlock_post_msg) = tracer "peepholeBlock_post" peepholeBlock_post val peepholeBlock_post_msg = fn () => (peepholeBlock_post_msg (); Control.indent (); List.foreach(optimizations_post_msg, fn msg => msg ()); Control.unindent ()) end val (callback_elimIff,elimIff_msg) = make_callback_msg "elimIff" fun makeElimIff {jumpInfo : amd64JumpInfo.t} : optimization = let val isTransferIff_eqTargets = fn Transfer.Iff {truee, falsee, ...} => Label.equals(truee, falsee) | _ => false val template = {start = EmptyOrNonEmpty, statements = [], finish = Empty, transfer = isTransferIff_eqTargets} val rewriter = fn {entry, profileLabel, start, statements = [], finish = [], transfer = Transfer.Iff {truee, falsee, ...}} => let val _ = amd64JumpInfo.decNear(jumpInfo, falsee) val statements = List.fold(start, [], op ::) val transfer = Transfer.goto {target = truee} in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimIff" in {template = template, rewriter = rewriter, callback = callback_elimIff} end val (callback_elimSwitchTest,elimSwitchTest_msg) = make_callback_msg "elimSwitchTest" fun makeElimSwitchTest {jumpInfo : amd64JumpInfo.t} : optimization = let val isTransferSwitch_testImmediateEval = fn Transfer.Switch {test = Operand.Immediate immediate, ...} => isSome (Immediate.eval immediate) | _ => false val template = {start = Empty, statements = [All (fn _ => true)], finish = Empty, transfer = isTransferSwitch_testImmediateEval} val rewriter = fn {entry, profileLabel, start = [], statements = [statements'], finish = [], transfer = Transfer.Switch {test = Operand.Immediate immediate, cases, default}} => let val statements = statements' val test = valOf (Immediate.eval immediate) val cases = Transfer.Cases.keepAll (cases, fn (w,target) => (amd64JumpInfo.decNear(jumpInfo, target); WordX.equals (w, test))) val transfer = if Transfer.Cases.isEmpty cases then Transfer.goto {target = default} else if Transfer.Cases.isSingle cases then let val _ = amd64JumpInfo.decNear (jumpInfo, default) val target = Transfer.Cases.extract (cases, #2) val _ = amd64JumpInfo.incNear (jumpInfo, target) in Transfer.goto {target = target} end else Error.bug "amd64Simplify.PeeholeBlock: elimSwitchTest:transfer" in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSwitchTest" in {template = template, rewriter = rewriter, callback = callback_elimSwitchTest} end val (callback_elimSwitchCases,elimSwitchCases_msg) = make_callback_msg "elimSwitchCases" fun makeElimSwitchCases {jumpInfo : amd64JumpInfo.t} : optimization = let val isTransferSwitch_casesDefault = fn Transfer.Switch {cases, default, ...} => let val n = Transfer.Cases.count (cases, fn target => Label.equals(target, default)) in n > 0 end | _ => false val template = {start = Empty, statements = [All (fn _ => true)], finish = Empty, transfer = isTransferSwitch_casesDefault} val rewriter = fn {entry, profileLabel, start = [], statements = [statements'], finish = [], transfer = Transfer.Switch {test, cases, default}} => let val statements = statements' val cases = Transfer.Cases.keepAll (cases, fn (_,target) => if Label.equals(target, default) then (amd64JumpInfo.decNear (jumpInfo, target); false) else true) val (statements, transfer) = if Transfer.Cases.isEmpty cases then (statements, Transfer.goto {target = default}) else if Transfer.Cases.isSingle cases then let val (k,target) = Transfer.Cases.extract (cases, fn (w,target) => (Immediate.word w, target)) val size = case Operand.size test of SOME size => size | NONE => Size.QUAD in (List.concat [statements, [Assembly.instruction_cmp {src1 = test, src2 = Operand.immediate k, size = size}]], Transfer.iff {condition = Instruction.E, truee = target, falsee = default}) end else (statements, Transfer.switch {test = test, cases = cases, default = default}) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSwitchCases" in {template = template, rewriter = rewriter, callback = callback_elimSwitchCases} end end structure ElimGoto = struct fun elimSimpleGoto {chunk = Chunk.T {data, blocks, ...}, delProfileLabel : amd64.ProfileLabel.t -> unit, jumpInfo : amd64JumpInfo.t} = let val {get: Label.t -> Label.t option, set: Label.t * Label.t option -> unit, destroy} = Property.destGetSet(Label.plist, Property.initConst NONE) val changed = ref false val labels = List.keepAllMap (blocks, fn Block.T {entry = Entry.Jump {label}, profileLabel, statements, transfer = Transfer.Goto {target}} => if List.forall(statements, fn Assembly.Comment _ => true | _ => false) (* andalso not (Label.equals(label, target)) *) then (Option.app(profileLabel, delProfileLabel); set(label, SOME target); SOME label) else NONE | _ => NONE) fun loop () = if List.fold(labels, false, fn (label,b) => case get label of NONE => b | SOME target => (case get target of NONE => b | SOME target' => if Label.equals(label, target') then (set(label, NONE); b) else (set(label, SOME target'); true))) then loop () else () val _ = loop () fun update target = case get target of SOME target' => (changed := true; amd64JumpInfo.decNear(jumpInfo, target); amd64JumpInfo.incNear(jumpInfo, target'); target') | NONE => target val elimSimpleGoto' = fn Transfer.Goto {target} => Transfer.Goto {target = update target} | Transfer.Iff {condition, truee, falsee} => Transfer.Iff {condition = condition, truee = update truee, falsee = update falsee} | Transfer.Switch {test, cases, default} => Transfer.Switch {test = test, cases = Transfer.Cases.map (cases, update o #2), default = update default} | transfer => transfer val blocks = List.map (blocks, fn Block.T {entry, profileLabel, statements, transfer} => Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = elimSimpleGoto' transfer}) val blocks = List.removeAll (blocks, fn Block.T {entry,...} => (case get (Entry.label entry) of SOME label' => (changed := true; amd64JumpInfo.decNear(jumpInfo, label'); true) | NONE => false)) val _ = destroy () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimSimpleGoto,elimSimpleGoto_msg) = tracer "elimSimpleGoto" elimSimpleGoto fun elimComplexGoto {chunk = Chunk.T {data, blocks, ...}, jumpInfo : amd64JumpInfo.t} = let datatype z = datatype amd64JumpInfo.status val {get: Label.t -> Block.t option, set: Label.t * Block.t option -> unit, destroy} = Property.destGetSet(Label.plist, Property.initConst NONE) val labels = List.keepAllMap (blocks, fn block as Block.T {entry = Entry.Jump {label},...} => if amd64JumpInfo.getNear(jumpInfo, label) = Count 1 then (set(label, SOME block); SOME label) else NONE | _ => NONE) fun loop () = if List.fold (labels, false, fn (label,b) => case get label of SOME (Block.T {entry, profileLabel, statements, transfer = Transfer.Goto {target}}) => (if Label.equals(label,target) then b else (case get target of NONE => b | SOME (Block.T {entry = entry', profileLabel = profileLabel', statements = statements', transfer = transfer'}) => (set(label, SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.concat [statements, [Assembly.Label (Entry.label entry')], ProfileLabel.toAssemblyOpt profileLabel', statements'], transfer = transfer'})); true))) | _ => b) then loop () else () val _ = loop () val changed = ref false val elimComplexGoto' = fn block as Block.T {entry, profileLabel, statements, transfer = Transfer.Goto {target}} => if Label.equals(Entry.label entry,target) then block else (case get target of NONE => block | SOME (Block.T {entry = entry', profileLabel = profileLabel', statements = statements', transfer = transfer'}) => let val _ = changed := true val _ = amd64JumpInfo.decNear (jumpInfo, Entry.label entry') val _ = List.foreach (Transfer.nearTargets transfer', fn target => amd64JumpInfo.incNear (jumpInfo, target)) val block = Block.T {entry = entry, profileLabel = profileLabel, statements = List.concat [statements, [Assembly.label (Entry.label entry')], ProfileLabel.toAssemblyOpt profileLabel', statements'], transfer = transfer'} in block end) | block => block val blocks = List.map(blocks, elimComplexGoto') val _ = destroy () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimComplexGoto, elimComplexGoto_msg) = tracer "elimComplexGoto" elimComplexGoto fun elimBlocks {chunk = Chunk.T {data, blocks, ...}, jumpInfo : amd64JumpInfo.t} = let val {get = getIsBlock, set = setIsBlock, destroy = destroyIsBlock} = Property.destGetSetOnce (Label.plist, Property.initConst false) val {get: Label.t -> {block: Block.t, reach: bool ref}, set, destroy} = Property.destGetSetOnce (Label.plist, Property.initRaise ("gotoInfo", Label.layout)) val (labels, funcs) = List.fold (blocks, ([], []), fn (block as Block.T {entry, ...}, (labels, funcs)) => let val label = Entry.label entry in setIsBlock(label, true); set(label, {block = block, reach = ref false}) ; case entry of Entry.Func _ => (label::labels, label::funcs) | _ => (label::labels, funcs) end) fun loop label = let val {block = Block.T {transfer, ...}, reach} = get label in if !reach then () else (reach := true ; List.foreach (Transfer.nearTargets transfer, loop)) end val _ = List.foreach (funcs, loop) fun check oper = case (Operand.deImmediate oper, Operand.deLabel oper) of (SOME immediate, _) => (case Immediate.deLabel immediate of SOME label => if getIsBlock label then ! (#reach (get label)) else true | NONE => true) | (_, SOME label) => if getIsBlock label then ! (#reach (get label)) else true | _ => true val changed = ref false val blocks = List.keepAllMap (labels, fn label => let val {block = Block.T {entry, profileLabel, statements, transfer}, reach} = get label in if !reach then SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.keepAll (statements, fn Assembly.Instruction i => (case #srcs (Instruction.srcs_dsts i) of NONE => true | SOME srcs => List.forall(srcs, check)) | _ => true), transfer = transfer}) else (changed := true ; List.foreach (Transfer.nearTargets transfer, fn label => amd64JumpInfo.decNear (jumpInfo, label)); NONE) end) val _ = destroy () val _ = destroyIsBlock () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimBlocks, elimBlocks_msg) = tracer "elimBlocks" elimBlocks fun elimGoto {chunk : Chunk.t, delProfileLabel: amd64.ProfileLabel.t -> unit, jumpInfo : amd64JumpInfo.t} = let val elimIff = PeepholeBlock.makeElimIff {jumpInfo = jumpInfo} val elimSwitchTest = PeepholeBlock.makeElimSwitchTest {jumpInfo = jumpInfo} val elimSwitchCases = PeepholeBlock.makeElimSwitchCases {jumpInfo = jumpInfo} fun loop {chunk, changed} = let val {chunk, changed = changed_elimSimpleGoto} = elimSimpleGoto {chunk = chunk, delProfileLabel = delProfileLabel, jumpInfo = jumpInfo} val Chunk.T {data, blocks, ...} = chunk val {blocks, changed = changed_peepholeBlocks} = PeepholeBlock.peepholeBlocks {blocks = blocks, optimizations = [elimIff, elimSwitchTest, elimSwitchCases]} val chunk = Chunk.T {data = data, blocks = blocks} in if changed_elimSimpleGoto orelse changed_peepholeBlocks then loop {chunk = chunk, changed = true} else {chunk = chunk, changed = changed} end val {chunk, changed = changed_loop} = loop {chunk = chunk, changed = false} val {chunk, changed = changed_elimComplexGoto} = elimComplexGoto {chunk = chunk, jumpInfo = jumpInfo} val {chunk, changed = changed_elimBlocks} = elimBlocks {chunk = chunk, jumpInfo = jumpInfo} in {chunk = chunk, changed = changed_loop orelse changed_elimComplexGoto orelse changed_elimBlocks} end val (elimGoto, elimGoto_msg) = tracer "elimGoto" elimGoto val elimGoto_msg = fn () => (elimGoto_msg (); Control.indent (); PeepholeBlock.elimIff_msg (); PeepholeBlock.elimSwitchTest_msg (); PeepholeBlock.elimSwitchCases_msg (); elimSimpleGoto_msg (); elimComplexGoto_msg (); elimBlocks_msg (); Control.unindent ()) end structure MoveHoistLivenessBlock = struct structure LiveSet = amd64Liveness.LiveSet structure Liveness = amd64Liveness.Liveness structure LivenessBlock = amd64Liveness.LivenessBlock fun moveHoist {block = LivenessBlock.T {entry, profileLabel, statements, transfer}} = let val {transfer,live} = LivenessBlock.reLivenessTransfer {transfer = transfer} val {statements, changed, moves, live} = List.foldr (statements, {statements = [], changed = false, moves = [], live = live}, fn ((asm: Assembly.t, Liveness.T {dead,...}), {statements: (Assembly.t * Liveness.t) list, changed : bool, moves, live: amd64Liveness.LiveSet.t}) => let fun default () = let val {uses,defs,...} = Assembly.uses_defs_kills asm val baseUses = List.fold (uses, [], fn (operand,baseUses) => case Operand.deMemloc operand of SOME memloc => if List.contains (baseUses, memloc, MemLoc.eq) then baseUses else memloc::baseUses | NONE => baseUses) val baseDefs = List.fold (defs, [], fn (operand,baseDefs) => case Operand.deMemloc operand of SOME memloc => if List.contains (baseDefs, memloc, MemLoc.eq) then baseDefs else memloc::baseDefs | NONE => baseDefs) val allUses = let fun doit(memlocs,allUses) = List.fold (memlocs, allUses, fn (memloc,allUses) => List.fold (MemLoc.utilized memloc, allUses, fn (memloc,allUses) => if List.contains (allUses, memloc, MemLoc.eq) then allUses else memloc::allUses)) in doit(baseDefs, doit(baseUses, baseUses)) end val allDefs = baseDefs val {forces, moves, ...} = List.fold (moves, {forces = [], moves = [], allUses = allUses, allDefs = allDefs}, fn (move as {src,dst,...}, {forces, moves, allUses, allDefs}) => let val utilized_src = MemLoc.utilized src val utilized_dst = MemLoc.utilized dst in if List.exists (allDefs, fn memloc' => List.exists (src::utilized_src, fn memloc'' => MemLoc.mayAlias (memloc', memloc''))) orelse List.exists (allDefs, fn memloc' => List.exists (dst::utilized_dst, fn memloc'' => MemLoc.mayAlias (memloc', memloc''))) orelse List.exists (allUses, fn memloc' => MemLoc.mayAlias (memloc',dst) orelse MemLoc.mayAlias (memloc',src)) then {forces = move::forces, moves = moves, allUses = src::(List.concat [utilized_src, utilized_dst, allUses]), allDefs = dst::allDefs} else {forces = forces, moves = move::moves, allUses = allUses, allDefs = allDefs} end) val moves = List.revMap (moves, fn {src,dst,size,age} => {src = src, dst = dst, size = size, age = age + 1}) val statements_forces = List.revMap (forces, fn {src,dst,size,...} => (case Size.class size of Size.INT => Assembly.instruction_mov {src = Operand.memloc src, dst = Operand.memloc dst, size = size} | Size.FLT => Assembly.instruction_sse_movs {src = Operand.memloc src, dst = Operand.memloc dst, size = size})) val {statements = statements_asm_forces, live} = LivenessBlock.toLivenessStatements {statements = asm::statements_forces, live = live} in {statements = List.concat [statements_asm_forces, statements], changed = changed orelse List.exists(forces, fn {age,...} => age <> 0), moves = moves, live = live} end in case asm of Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc_src, dst = Operand.MemLoc memloc_dst, size}) => if LiveSet.contains(dead, memloc_src) orelse List.exists(moves, fn {src,...} => MemLoc.eq(memloc_src,src)) then {statements = statements, changed = changed, moves = {src = memloc_src, dst = memloc_dst, size = size, age = 0}::moves, live = live} else default () | Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc memloc_src, dst = Operand.MemLoc memloc_dst, size}) => if LiveSet.contains(dead, memloc_src) orelse List.exists(moves, fn {src,...} => MemLoc.eq(memloc_src,src)) then {statements = statements, changed = changed, moves = {src = memloc_src, dst = memloc_dst, size = size, age = 0}::moves, live = live} else default () | _ => default () end) val forces = moves val statements_forces = List.map (forces, fn {src,dst,size,...} => (case Size.class size of Size.INT => Assembly.instruction_mov {src = Operand.memloc src, dst = Operand.memloc dst, size = size} | Size.FLT => Assembly.instruction_sse_movs {src = Operand.memloc src, dst = Operand.memloc dst, size = size})) val {statements = statements_forces, ...} = LivenessBlock.toLivenessStatements {statements = statements_forces, live = live} val statements = List.concat [statements_forces, statements] val changed = changed orelse List.exists(forces, fn {age,...} => age <> 0) val block = LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} in {block = block, changed = changed} end val moveHoist = fn {block} => (moveHoist {block = block}) val (moveHoist: {block: LivenessBlock.t} -> {block: LivenessBlock.t, changed: bool}, moveHoist_msg) = tracer "moveHoist" moveHoist end structure CopyPropagateLivenessBlock = struct structure LiveSet = amd64Liveness.LiveSet structure LiveInfo = amd64Liveness.LiveInfo structure Liveness = amd64Liveness.Liveness structure LivenessBlock = amd64Liveness.LivenessBlock fun copyPropagate' {src, dst as Operand.MemLoc memloc_dst, pblock = {statements, transfer}, liveInfo} = let val changed = ref 0 val (all,replacer) = case src of Operand.MemLoc memloc_src => let val all = let fun doit (memlocs, all) = List.fold (memlocs, all, fn (memloc,all) => if List.contains(all, memloc, MemLoc.eq) then all else memloc::all) in doit(memloc_dst::(MemLoc.utilized memloc_dst), doit(memloc_src::(MemLoc.utilized memloc_src), [])) end fun replacer' memloc = if MemLoc.eq(memloc,memloc_dst) then (changed := !changed + 1; memloc_src) else memloc val replacer = fn {use,def} => fn operand => case Operand.deMemloc operand of SOME memloc => if (use andalso not def) orelse (not (MemLoc.eq(memloc, memloc_dst))) then Operand.memloc (MemLoc.replace replacer' memloc) else operand | _ => operand in (all, replacer) end | _ => let val all = let fun doit (memlocs, all) = List.fold (memlocs, all, fn (memloc,all) => if List.contains(all, memloc, MemLoc.eq) then all else memloc::all) in doit(memloc_dst::(MemLoc.utilized memloc_dst), []) end val replacer = fn {use,def} => fn operand => if use andalso not def then if Operand.eq(operand,dst) then (changed := !changed + 1; src) else operand else operand in (all, replacer) end val (transfer,_) = transfer fun doit (statements : (Assembly.t * Liveness.t) list) = let fun uses_defs {uses, defs} = let local fun doit operands = List.fold (operands, [], fn (operand,memlocs) => case Operand.deMemloc operand of SOME memloc => if List.contains(memlocs, memloc, MemLoc.eq) then memlocs else memloc::memlocs | NONE => memlocs) fun doit'(memlocs,uses) = List.fold (memlocs, uses, fn (memloc,uses) => if List.contains(uses, memloc, MemLoc.eq) then uses else memloc::uses) fun doit''(memlocs,uses) = List.fold (memlocs, uses, fn (memloc,uses) => doit'(MemLoc.utilized memloc, uses)) in val uses = doit uses val defs = doit defs val uses = doit''(defs, doit''(uses, uses)) end in {uses = uses, defs = defs} end in case statements of [] => let val transfer = Transfer.replace replacer transfer val {uses,defs,...} = Transfer.uses_defs_kills transfer val {uses, defs} = uses_defs {uses = uses, defs = defs} in if not (List.contains(uses, memloc_dst, MemLoc.eq)) andalso not (MemLocSet.contains(Transfer.live transfer, memloc_dst)) then if List.forall (all, fn memloc => List.forall (defs, fn memloc' => not (MemLoc.mayAlias(memloc, memloc')))) then SOME {statements = [], transfer = transfer} else NONE else NONE end | (asm, Liveness.T {dead, ...}) :: statements => let val asm = Assembly.replace replacer asm val {uses,defs,...} = Assembly.uses_defs_kills asm val {uses, defs} = uses_defs {uses = uses, defs = defs} in if not (List.contains(uses, memloc_dst, MemLoc.eq)) then if LiveSet.contains(dead,memloc_dst) then let val statements = List.map (statements, #1) in SOME {statements = asm::statements, transfer = transfer} end else if List.forall (all, fn memloc => List.forall (defs, fn memloc' => not (MemLoc.mayAlias(memloc, memloc')))) then case doit statements of NONE => NONE | SOME {statements, transfer} => SOME {statements = asm::statements, transfer = transfer} else NONE else NONE end end in case doit statements of NONE => NONE | SOME {statements, transfer} => let val {transfer, live} = LivenessBlock.toLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = live} in SOME {pblock = {statements = statements, transfer = transfer}, changed = !changed > 0} end end | copyPropagate' _ = Error.bug "amd64Simplify.PeeholeBlock: copyPropagate'" fun copyPropagate {block = LivenessBlock.T {entry, profileLabel, statements, transfer}, liveInfo} = let val {pblock = {statements,transfer},changed} = List.foldr (statements, {pblock = {statements = [], transfer = transfer}, changed = false}, fn ((asm as Assembly.Instruction (Instruction.MOV {src, dst as Operand.MemLoc memloc_dst, ...}), info: Liveness.t), {pblock as {statements, transfer}, changed}) => let val pblock' = {statements = (asm,info)::statements, transfer = transfer} in if amd64Liveness.track memloc_dst andalso (List.fold (statements, false, fn ((_, Liveness.T {dead,...}),b) => b orelse LiveSet.contains(dead,memloc_dst)) orelse LiveSet.contains(Liveness.dead(#2(transfer)),memloc_dst)) then case copyPropagate' {src = src, dst = dst, pblock = pblock, liveInfo = liveInfo} of NONE => {pblock = pblock', changed = changed} | SOME {pblock, changed = changed'} => {pblock = pblock, changed = changed orelse changed'} else {pblock = pblock', changed = changed} end | ((asm as Assembly.Instruction (Instruction.SSE_MOVS {src, dst as Operand.MemLoc memloc_dst, ...}), info), {pblock as {statements, transfer}, changed}) => let val pblock' = {statements = (asm,info)::statements, transfer = transfer} in if amd64Liveness.track memloc_dst andalso (List.fold (statements, false, fn ((_, Liveness.T {dead,...}),b) => b orelse LiveSet.contains(dead,memloc_dst)) orelse LiveSet.contains(Liveness.dead (#2 transfer), memloc_dst)) then case copyPropagate' {src = src, dst = dst, pblock = pblock, liveInfo = liveInfo} of NONE => {pblock = pblock', changed = changed} | SOME {pblock, changed = changed'} => {pblock = pblock, changed = changed orelse changed'} else {pblock = pblock', changed = changed} end | ((asm,info), {pblock = {statements, transfer}, changed}) => {pblock = {statements = (asm,info)::statements, transfer = transfer}, changed = changed}) in {block = LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}, changed = changed} end val copyPropagate = fn {block, liveInfo} => (copyPropagate {block = block, liveInfo = liveInfo}) val (copyPropagate : {block: LivenessBlock.t, liveInfo: LiveInfo.t} -> {block: LivenessBlock.t, changed: bool}, copyPropagate_msg) = tracer "copyPropagate" copyPropagate val copyPropagate = fn arg as {block as LivenessBlock.T {statements, ...}, ...} => if List.length statements <= !Control.Native.copyPropCutoff then copyPropagate arg else {block = block, changed = false} end structure PeepholeLivenessBlock = struct structure LiveSet = amd64Liveness.LiveSet structure Liveness = amd64Liveness.Liveness structure LivenessBlock = amd64Liveness.LivenessBlock structure Peephole = Peephole(type entry_type = Entry.t * Liveness.t type profileLabel_type = ProfileLabel.t option type statement_type = Assembly.t * Liveness.t type transfer_type = Transfer.t * Liveness.t datatype block = datatype LivenessBlock.t) open Peephole fun make_callback_msg name = let val count = ref 0 val total = ref 0 val callback = fn true => (Int.inc count; Int.inc total) | false => Int.inc total val msg = fn () => Control.messageStr (Control.Detail, concat [name, ": ", Int.toString (!count), " / ", Int.toString (!total)]) in (callback,msg) end val isComment : statement_type -> bool = fn (Assembly.Comment _, _) => true | _ => false local val isInstruction_dstsTemp_dstsDead : statement_type -> bool = fn (Assembly.Instruction instruction, Liveness.T {dead,...}) => let val {dsts,...} = Instruction.srcs_dsts instruction in case dsts of NONE => false | SOME dsts => List.forall (dsts, fn Operand.MemLoc memloc => amd64Liveness.track memloc andalso LiveSet.contains(dead,memloc) | _ => false) end | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstruction_dstsTemp_dstsDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction _, Liveness.T {liveOut,...})]], finish, transfer} => if (case List.fold (finish, (false, false), fn ((asm, _), (b, b')) => case asm of Assembly.Comment _ => (b, b') | Assembly.Instruction (Instruction.SETcc _) => (true, if b then b' else true) | _ => (true, b')) of (_, true) => true | (false, _) => (case #1 transfer of Transfer.Iff _ => true | _ => false) | _ => false) then NONE else let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimDeadDsts" val (callback,elimDeadDsts_msg) = make_callback_msg "elimDeadDsts" in val elimDeadDsts : optimization = {template = template, rewriter = rewriter, callback = callback} val elimDeadDsts_msg = elimDeadDsts_msg end local val isInstructionMOV_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | _ => false val isInstructionAL_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.pMD {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.SRAL {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | _ => false val isInstructionMOV_srcTemp_srcDead : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc,...}), Liveness.T {dead,...}) => amd64Liveness.track memloc andalso LiveSet.contains(dead, memloc) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_dstTemp, All (fn asm => (isComment asm) orelse (isInstructionAL_dstTemp asm)), One isInstructionMOV_srcTemp_srcDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc1, size = size1}), _)], statements', [(Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc2, dst = dst2, size = size2}), Liveness.T {liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso MemLoc.eq(memloc1,memloc2) andalso List.forall (statements', fn (Assembly.Comment _, _) => true | (Assembly.Instruction (Instruction.BinAL {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.pMD {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.IMUL2 {src, dst = Operand.MemLoc memloc, size}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | (Assembly.Instruction (Instruction.SRAL {count, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (count,dst2) of (Operand.MemLoc memloc_count, Operand.MemLoc memloc_dst2) => List.forall (memloc_count::(MemLoc.utilized memloc_count), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | _ => Error.bug "amd64Simplify.PeeholeBlock: elimALCopy") then let val statements = List.map (statements', fn (asm,_) => Assembly.replace (fn {...} => fn operand => if Operand.eq(operand,dst1) then dst2 else operand) asm) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = (Assembly.instruction_mov {src = src1, dst = dst2, size = size1})::statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: elimALCopy" val (callback,elimALCopy_msg) = make_callback_msg "elimALCopy" in val elimALCopy : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALCopy_msg = elimALCopy_msg end local val isInstructionSSEMOVS_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_MOVS {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | _ => false val isInstructionSSEAS_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_BinAS {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | (Assembly.Instruction (Instruction.SSE_UnAS {dst = Operand.MemLoc memloc,...}), _) => amd64Liveness.track memloc | _ => false val isInstructionSSEMOVS_srcTemp_srcDead : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc memloc,...}), Liveness.T {dead,...}) => amd64Liveness.track memloc andalso LiveSet.contains(dead, memloc) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSSEMOVS_dstTemp, All (fn asm => (isComment asm) orelse (isInstructionSSEAS_dstTemp asm)), One isInstructionSSEMOVS_srcTemp_srcDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.SSE_MOVS {src = src1, dst = dst1 as Operand.MemLoc memloc1, size = size1}), _)], statements', [(Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc memloc2, dst = dst2, size = size2}), Liveness.T {liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso MemLoc.eq(memloc1,memloc2) andalso List.forall (statements', fn (Assembly.Comment _, _) => true | (Assembly.Instruction (Instruction.SSE_BinAS {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | _ => false) | (Assembly.Instruction (Instruction.SSE_UnAS {dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSSEASCopy") then let val statements = List.map (statements', fn (asm,_) => Assembly.replace (fn {...} => fn operand => if Operand.eq(operand,dst1) then dst2 else operand) asm) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = (Assembly.instruction_sse_movs {src = src1, dst = dst2, size = size1})::statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSSEASCopy" val (callback,elimSSEASCopy_msg) = make_callback_msg "elimSSEASCopy" in val elimSSEASCopy : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSSEASCopy_msg = elimSSEASCopy_msg end local val isInstructionMOV_eqSrcDst : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc1, src = Operand.MemLoc memloc2,...}), _) => MemLoc.eq(memloc1,memloc2) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_eqSrcDst], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc, ...}), Liveness.T {liveOut,...})]], finish, transfer} => if List.exists (MemLoc.utilized memloc, amd64Liveness.track) then let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else let val statements = List.fold(start, finish, op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSelfMove" val (callback,elimSelfMove_msg) = make_callback_msg "elimSelfMove" in val elimSelfMove : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSelfMove_msg = elimSelfMove_msg end local val isInstructionSSEMOVS_eqSrcDst : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_MOVS {dst = Operand.MemLoc memloc1, src = Operand.MemLoc memloc2,...}), _) => MemLoc.eq(memloc1,memloc2) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSSEMOVS_eqSrcDst], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.SSE_MOVS {src = Operand.MemLoc memloc, ...}), Liveness.T {liveOut,...})]], finish, transfer} => if List.exists (MemLoc.utilized memloc, amd64Liveness.track) then let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else let val statements = List.fold(start, finish, op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "amd64Simplify.PeeholeBlock: elimSSESSelfMove" val (callback,elimSSESSelfMove_msg) = make_callback_msg "elimSSESSelfMove" in val elimSSESSelfMove : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSSESSelfMove_msg = elimSSESSelfMove_msg end local val isInstructionMOV_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc _,...}), _) => true | _ => false val isInstructionBinALMD_dstMemloc_operCommute : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) | (Assembly.Instruction (Instruction.pMD {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc _,...}), _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_dstMemloc, All isComment, One isInstructionBinALMD_dstMemloc_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2, ...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_binal {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_pmd {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_imul2 {src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: commuteBinALMD" val (callback,commuteBinALMD_msg) = make_callback_msg "commuteBinALMD" in val commuteBinALMD : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteBinALMD_msg = commuteBinALMD_msg end local val isInstructionSSEMOVS_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_MOVS {dst = Operand.MemLoc _,...}), _) => true | _ => false val isInstructionSSEBinAS_dstMemloc_operCommute : statement_type -> bool = fn (Assembly.Instruction (Instruction.SSE_BinAS {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.SSE_ADDS) orelse (oper = Instruction.SSE_MULS) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSSEMOVS_dstMemloc, All isComment, One isInstructionSSEBinAS_dstMemloc_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.SSE_MOVS {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.SSE_BinAS {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2, ...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_sse_movs {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_sse_binas {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: commuteSSEBinAS" val (callback,commuteSSEBinAS_msg) = make_callback_msg "commuteSSEBinAS" in val commuteSSEBinAS : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteSSEBinAS_msg = commuteSSEBinAS_msg end local val isInstructionSETcc : statement_type -> bool = fn (Assembly.Instruction (Instruction.SETcc {...}), _) => true | _ => false val isInstructionTEST_eqSrcs : statement_type -> bool = fn (Assembly.Instruction (Instruction.TEST {src1 = Operand.MemLoc memloc1, src2 = Operand.MemLoc memloc2,...}), Liveness.T {...}) => MemLoc.eq(memloc1, memloc2) | _ => false val isIff_conditionZorNZ : transfer_type -> bool = fn (Transfer.Iff {condition,...}, _) => (case condition of Instruction.Z => true | Instruction.NZ => true | _ => false) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSETcc, All isComment, One isInstructionTEST_eqSrcs, All isComment], finish = Empty, transfer = isIff_conditionZorNZ} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(statement as Assembly.Instruction (Instruction.SETcc {condition = condition1, dst = Operand.MemLoc memloc1, ...}), _)], comments1, [(Assembly.Instruction (Instruction.TEST {src1 = Operand.MemLoc memloc12, ...}), Liveness.T {dead, ...})], comments2], finish = [], transfer = (Transfer.Iff {condition, truee, falsee}, infoT as _)} => if MemLoc.eq(memloc1,memloc12) then let val condition = case condition of Instruction.Z => Instruction.condition_negate condition1 | Instruction.NZ => condition1 | _ => Error.bug "amd64Simplify.PeeholeBlock: conditionalJump:condition" val transfer = (Transfer.iff {condition = condition, truee = truee, falsee = falsee}, infoT) val {transfer,live} = LivenessBlock.reLivenessTransfer {transfer = transfer} val statements = List.concat [List.map(comments1, #1), List.map(comments2, #1)] val statements = if amd64Liveness.track memloc1 andalso LiveSet.contains(dead, memloc1) then statements else statement::statements val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = live} val statements = List.fold(start, statements, op ::) val live = case statements of (_, Liveness.T {liveIn,...})::_ => liveIn | _ => Error.bug "amd64Simplify.PeeholeBlock: conditionalJump:live" val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "amd64Simplify.PeeholeBlock: conditionalJump" val (callback,conditionalJump_msg) = make_callback_msg "conditionalJump" in val conditionalJump : optimization = {template = template, rewriter = rewriter, callback = callback} val conditionalJump_msg = conditionalJump_msg end local val {template, rewriter, ...} = elimDeadDsts val (callback,elimDeadDsts_minor_msg) = make_callback_msg "elimDeadDsts_minor" in val elimDeadDsts_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimDeadDsts_minor_msg = elimDeadDsts_minor_msg end local val {template, rewriter, ...} = elimSelfMove val (callback,elimSelfMove_minor_msg) = make_callback_msg "elimSelfMove_minor" in val elimSelfMove_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSelfMove_minor_msg = elimSelfMove_minor_msg end local val {template, rewriter, ...} = elimSSESSelfMove val (callback,elimSSESSelfMove_minor_msg) = make_callback_msg "elimSSESSelfMove_minor" in val elimSSESSelfMove_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSSESSelfMove_minor_msg = elimSSESSelfMove_minor_msg end local val optimizations = elimALCopy:: elimSSEASCopy:: elimDeadDsts:: elimSelfMove:: elimSSESSelfMove:: commuteBinALMD:: commuteSSEBinAS:: conditionalJump:: nil val optimizations_msg = elimALCopy_msg:: elimSSEASCopy_msg:: elimDeadDsts_msg:: elimSelfMove_msg:: elimSSESSelfMove_msg:: commuteBinALMD_msg:: commuteSSEBinAS_msg:: conditionalJump_msg:: nil val optimizations_minor = elimDeadDsts_minor:: elimSelfMove_minor:: elimSSESSelfMove_minor:: nil val optimizations_minor_msg = elimDeadDsts_minor_msg:: elimSelfMove_minor_msg:: elimSSESSelfMove_minor_msg:: nil in val peepholeLivenessBlock = fn block => (peepholeBlock {optimizations = optimizations, block = block}) val (peepholeLivenessBlock, peepholeLivenessBlock_msg) = tracer "peepholeLivenessBlock" peepholeLivenessBlock val peepholeLivenessBlock_msg = fn () => (peepholeLivenessBlock_msg (); Control.indent (); List.foreach(optimizations_msg, fn msg => msg ()); Control.unindent ()) val peepholeLivenessBlock_minor = fn block => (peepholeBlock {optimizations = optimizations_minor, block = block}) val (peepholeLivenessBlock_minor, peepholeLivenessBlock_minor_msg) = tracer "peepholeLivenessBlock_minor" peepholeLivenessBlock_minor val peepholeLivenessBlock_minor_msg = fn () => (peepholeLivenessBlock_minor_msg (); Control.indent (); List.foreach(optimizations_minor_msg, fn msg => msg ()); Control.unindent ()) end end fun simplify {chunk : Chunk.t, optimize : int, delProfileLabel : amd64.ProfileLabel.t -> unit, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t} : Chunk.t = let (* fun changedChunk_msg {chunk as Chunk.T {blocks, ...}, changed, msg} = (print ("finished " ^ msg ^ "\n")) fun changedBlock_msg {block as Block.T {entry, ...}, changed, msg} = (print ("finished " ^ msg ^ "\n")) fun changedLivenessBlock_msg {block as amd64Liveness.LivenessBlock.T {entry, ...}, changed, msg} = if changed then (print ("finished " ^ msg ^ "\n")) else () *) fun changedChunk_msg {chunk = Chunk.T {blocks, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; List.foreach(blocks, fn b as Block.T {entry, ...} => (print (concat ["liveIn: ", (concat o List.separate) (List.map (amd64Liveness.LiveSet.toList (amd64Liveness.LiveInfo.getLive (liveInfo, Entry.label entry)), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); amd64.Block.printBlock b))) fun changedBlock_msg {block as Block.T {entry, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; (print (concat ["liveIn: ", (concat o List.separate) (List.map (amd64Liveness.LiveSet.toList (amd64Liveness.LiveInfo.getLive (liveInfo, Entry.label entry)), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); amd64.Block.printBlock block)) fun changedLivenessBlock_msg {block as amd64Liveness.LivenessBlock.T {entry, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; (print (concat ["liveIn: ", (concat o List.separate) (List.map (amd64Liveness.LiveSet.toList (amd64Liveness.LiveInfo.getLive (liveInfo, Entry.label (#1 entry))), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); amd64Liveness.LivenessBlock.printBlock block)) val debug = false val changedChunk_msg : {chunk : Chunk.t, changed: bool, msg: string} -> unit = if debug then changedChunk_msg else (fn _ => ()) val changedBlock_msg : {block : Block.t, changed: bool, msg: string} -> unit = if debug then changedBlock_msg else (fn _ => ()) val changedLivenessBlock_msg : {block : amd64Liveness.LivenessBlock.t, changed: bool, msg: string} -> unit = if debug then changedLivenessBlock_msg else (fn _ => ()) fun checkLivenessBlock {block, block', msg} = Assert.assert ("amd64Simplify.checkLivenessBlock: " ^ msg, fn () => if amd64Liveness.LivenessBlock.verifyLivenessBlock {block = block, liveInfo = liveInfo} then true else (print ("pre: " ^ msg); amd64Liveness.LivenessBlock.printBlock block; print (String.make(60, #"*")); print ("\n"); print ("post: " ^ msg); amd64Liveness.LivenessBlock.printBlock block'; print (String.make(60, #"*")); print ("\n"); false)) (*********************************************************************) (* simplify *) (*********************************************************************) val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "simplify:"} (*********************************************************************) (* completeLiveInfo *) (*********************************************************************) val _ = amd64Liveness.LiveInfo.completeLiveInfo {chunk = chunk, liveInfo = liveInfo, pass = "pre"} val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "completeLiveInfo (pre):"} (*********************************************************************) (* completeJumpInfo *) (*********************************************************************) val _ = amd64JumpInfo.completeJumpInfo {chunk = chunk, jumpInfo = jumpInfo} val _ = Assert.assert ("amd64Simplify.verifyEntryTransfer", fn () => amd64EntryTransfer.verifyEntryTransfer {chunk = chunk}) (*********************************************************************) (* optimizer *) (*********************************************************************) fun optimizer chunk = let val chunk = chunk val changed = false (**************************************************************) (* elimGoto *) (**************************************************************) val {chunk = chunk', changed = changed'} = ElimGoto.elimGoto {chunk = chunk, delProfileLabel = delProfileLabel, jumpInfo = jumpInfo} val _ = Assert.assert ("amd64Simplify.verifyJumpInfo", fn () => amd64JumpInfo.verifyJumpInfo {chunk = chunk', jumpInfo = jumpInfo}) val _ = Assert.assert ("amd64Simplify.verifyEntryTransfer", fn () => amd64EntryTransfer.verifyEntryTransfer {chunk = chunk'}) val _ = changedChunk_msg {chunk = chunk, changed = changed', msg = "ElimGoto.elimGoto:"} val chunk = chunk' val changed = changed orelse changed' (**************************************************************) (* peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate*) (**************************************************************) val Chunk.T {data, blocks} = chunk val {blocks = blocks', changed = changed'} = List.fold (blocks, {blocks = [], changed = false}, fn (block, {blocks, changed}) => let val _ = changedBlock_msg {block = block, changed = false, msg = "peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate"} (***************************************************) (* peepholeBlock_pre *) (***************************************************) val {block = block', changed = changed'} = PeepholeBlock.peepholeBlock_pre block val _ = changedBlock_msg {block = block', changed = changed', msg = "PeepholeBlock.peepholeBlock_pre"} val block = block' val changed = changed orelse changed' (***************************************************) (* toLivenessBlock *) (***************************************************) val block' = amd64Liveness.LivenessBlock.toLivenessBlock {block = block, liveInfo = liveInfo} val block = block' val _ = changedLivenessBlock_msg {block = block', changed = false, msg = "amd64Liveness.LivenessBlock.toLivenessBlock"} (***************************************************) (* moveHoist *) (***************************************************) val {block = block', changed = changed'} = if !Control.Native.moveHoist then MoveHoistLivenessBlock.moveHoist {block = block} else {block = block, changed = false} val _ = checkLivenessBlock {block = block, block' = block', msg = "MoveHoistLivenessBlock.moveHoist"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "MoveHoistLivenessBlock.moveHoist"} val block = block' val changed = changed orelse changed' (***************************************************) (* peepholeLivenessBlock *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock"} val block = block' val changed = changed orelse changed' (***************************************************) (* copyPropagate *) (***************************************************) val {block = block', changed = changed'} = if !Control.Native.copyProp then CopyPropagateLivenessBlock.copyPropagate {block = block, liveInfo = liveInfo} else {block = block, changed = false} val _ = checkLivenessBlock {block = block, block' = block', msg = "CopyPropagateLivenessBlock.copyPropagate"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "CopyPropagateLivenessBlock.copyPropagate"} val block = block' val changed = changed orelse changed' (***************************************************) (* peepholeLivenessBlock_minor *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock_minor block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_minor"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_minor"} val block = block' val changed = changed orelse changed' (***************************************************) (* toBlock *) (***************************************************) val block' = amd64Liveness.LivenessBlock.toBlock {block = block} val _ = changedBlock_msg {block = block', changed = false, msg = "amd64Liveness.LivenessBlock.toBlock"} val block = block' (***************************************************) (* peepholeBlock_post *) (***************************************************) val {block = block', changed = changed'} = PeepholeBlock.peepholeBlock_post block val _ = changedBlock_msg {block = block', changed = changed', msg = "PeepholeBlock.peepholeBlock_post"} val block = block' val changed = changed orelse changed' in {blocks = block::blocks, changed = changed} end) val chunk' = Chunk.T {data = data, blocks = blocks'} val _ = changedChunk_msg {chunk = chunk', changed = changed', msg = "peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate"} val chunk = chunk' val changed = changed orelse changed' (**************************************************************) (* completeLiveInfo *) (**************************************************************) val _ = amd64Liveness.LiveInfo.completeLiveInfo {chunk = chunk, liveInfo = liveInfo, pass = "post"} val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "completeLiveInfo (post):"} in {chunk = chunk, changed = changed} end (*********************************************************************) (* optimizer_loop *) (*********************************************************************) fun optimizer_loop chunk = let fun loop {chunk, changed} = let val {chunk, changed = changed'} = optimizer chunk in if changed' then loop {chunk = chunk, changed = true} else {chunk = chunk, changed = changed} end val {chunk, changed} = loop {chunk = chunk, changed = false} in {chunk = chunk, changed = changed} end (*********************************************************************) (* chunk *) (*********************************************************************) val {chunk, ...} = case optimize of 0 => {chunk = chunk, changed = false} | 1 => optimizer chunk | _ => optimizer_loop chunk in chunk end val (simplify, simplify_msg) = tracerTop "simplify" simplify fun simplify_totals () = (simplify_msg (); Control.indent (); amd64Liveness.LiveInfo.completeLiveInfo_msg (); amd64JumpInfo.completeJumpInfo_msg (); ElimGoto.elimGoto_msg (); amd64JumpInfo.verifyJumpInfo_msg (); amd64EntryTransfer.verifyEntryTransfer_msg (); PeepholeBlock.peepholeBlock_pre_msg (); amd64Liveness.LivenessBlock.toLivenessBlock_msg (); MoveHoistLivenessBlock.moveHoist_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_msg (); CopyPropagateLivenessBlock.copyPropagate_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_minor_msg (); amd64Liveness.LivenessBlock.verifyLivenessBlock_msg (); amd64Liveness.LivenessBlock.toBlock_msg (); PeepholeBlock.peepholeBlock_post_msg (); Control.unindent ()) end mlton-20100608/mlton/codegen/amd64-codegen/amd64-simplify.sig0000644000076600000240000000177411404435625022117 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_SIMPLIFY_STRUCTS = sig structure amd64 : AMD64 structure amd64Liveness : AMD64_LIVENESS sharing amd64 = amd64Liveness.amd64 structure amd64JumpInfo : AMD64_JUMP_INFO sharing amd64 = amd64JumpInfo.amd64 structure amd64EntryTransfer : AMD64_ENTRY_TRANSFER sharing amd64 = amd64EntryTransfer.amd64 end signature AMD64_SIMPLIFY = sig include AMD64_SIMPLIFY_STRUCTS val simplify : {chunk : amd64.Chunk.t, optimize : int, delProfileLabel : amd64.ProfileLabel.t -> unit, liveInfo : amd64Liveness.LiveInfo.t, jumpInfo : amd64JumpInfo.t} -> amd64.Chunk.t val simplify_totals : unit -> unit end mlton-20100608/mlton/codegen/amd64-codegen/amd64-translate.fun0000644000076600000240000010317311404435625022262 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64Translate(S: AMD64_TRANSLATE_STRUCTS): AMD64_TRANSLATE = struct open S val tracerTop = amd64.tracerTop fun argsToString(ss: string list): string = "(" ^ (concat (List.separate(ss, ", "))) ^ ")" structure Machine = amd64MLton.Machine local open Machine in structure Label = Label structure Live = Live structure Register = Register structure Scale = Scale structure StackOffset = StackOffset structure Type = Type structure WordSize = WordSize structure WordX = WordX end datatype z = datatype WordSize.prim structure Global = struct open Machine.Global fun toAMD64Operand (g: t) : (amd64.Operand.t * amd64.Size.t) vector = let val ty = Machine.Type.toCType (ty g) val index = index g val base = amd64.Immediate.label (if isRoot g then amd64MLton.global_base ty else amd64MLton.globalObjptrNonRoot_base) val origin = amd64.MemLoc.imm {base = base, index = amd64.Immediate.int index, scale = amd64.Scale.fromCType ty, size = amd64.Size.BYTE, class = amd64MLton.Classes.Globals} val sizes = amd64.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((amd64.Operand.memloc o amd64.MemLoc.shift) {origin = origin, disp = amd64.Immediate.int offset, scale = amd64.Scale.One, size = size}, size), offset + amd64.Size.toBytes size)) end end structure Operand = struct open Machine.Operand fun get (f: ('a * 'b) -> 'c) (i: int) (v: ('a * 'b) vector) = f (Vector.sub (v, i)) fun getOp0 v = get #1 0 v val rec toAMD64Operand : t -> (amd64.Operand.t * amd64.Size.t) vector = fn ArrayOffset {base, index, offset, scale, ty} => let val base = toAMD64Operand base val _ = Assert.assert("amd64Translate.Operand.toAMD64Operand: Array/base", fn () => Vector.length base = 1) val base = getOp0 base val index = toAMD64Operand index val _ = Assert.assert("amd64Translate.Operand.toAMD64Operand: Array/index", fn () => Vector.length index = 1) val index = getOp0 index val scale = case scale of Scale.One => amd64.Scale.One | Scale.Two => amd64.Scale.Two | Scale.Four => amd64.Scale.Four | Scale.Eight => amd64.Scale.Eight val ty = Type.toCType ty val origin = case (amd64.Operand.deMemloc base, amd64.Operand.deImmediate index, amd64.Operand.deMemloc index) of (SOME base, SOME index, _) => amd64.MemLoc.simple {base = base, index = index, scale = scale, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | (SOME base, _, SOME index) => amd64.MemLoc.complex {base = base, index = index, scale = scale, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | _ => Error.bug (concat ["amd64Translate.Operand.toAMD64Operand: ", "strange Offset: base: ", amd64.Operand.toString base, " index: ", amd64.Operand.toString index]) val origin = if Bytes.isZero offset then origin else amd64.MemLoc.shift {origin = origin, disp = amd64.Immediate.int (Bytes.toInt offset), scale = amd64.Scale.One, size = amd64.Size.BYTE} val sizes = amd64.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((amd64.Operand.memloc o amd64.MemLoc.shift) {origin = origin, disp = amd64.Immediate.int offset, scale = amd64.Scale.One, size = size}, size), offset + amd64.Size.toBytes size)) end | Cast (z, _) => toAMD64Operand z | Contents {oper, ty} => let val ty = Type.toCType ty val base = toAMD64Operand oper val _ = Assert.assert("amd64Translate.Operand.toAMD64Operand: Contents/base", fn () => Vector.length base = 1) val base = getOp0 base val origin = case amd64.Operand.deMemloc base of SOME base => amd64.MemLoc.simple {base = base, index = amd64.Immediate.zero, scale = amd64.Scale.One, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | _ => Error.bug (concat ["amd64Translate.Operand.toAMD64Operand: ", "strange Contents: base: ", amd64.Operand.toString base]) val sizes = amd64.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((amd64.Operand.memloc o amd64.MemLoc.shift) {origin = origin, disp = amd64.Immediate.int offset, scale = amd64.Scale.One, size = size}, size), offset + amd64.Size.toBytes size)) end | Frontier => let val frontier = amd64MLton.gcState_frontierContentsOperand () in Vector.new1 (frontier, valOf (amd64.Operand.size frontier)) end | GCState => Vector.new1 (amd64.Operand.label amd64MLton.gcState_label, amd64MLton.pointerSize) | Global g => Global.toAMD64Operand g | Label l => Vector.new1 (amd64.Operand.immediate_label l, amd64MLton.pointerSize) | Null => Vector.new1 (amd64.Operand.immediate_zero, amd64MLton.wordSize) | Offset {base = GCState, offset, ty} => let val offset = Bytes.toInt offset val ty = Type.toCType ty val offset = amd64MLton.gcState_offset {offset = offset, ty = ty} in Vector.new1 (offset, valOf (amd64.Operand.size offset)) end | Offset {base, offset, ty} => let val offset = Bytes.toInt offset val ty = Type.toCType ty val base = toAMD64Operand base val _ = Assert.assert("amd64Translate.Operand.toAMD64Operand: Offset/base", fn () => Vector.length base = 1) val base = getOp0 base val origin = case amd64.Operand.deMemloc base of SOME base => amd64.MemLoc.simple {base = base, index = amd64.Immediate.int offset, scale = amd64.Scale.One, size = amd64.Size.BYTE, class = amd64MLton.Classes.Heap} | _ => Error.bug (concat ["amd64Translate.Operand.toAMD64Operand: ", "strange Offset: base: ", amd64.Operand.toString base]) val sizes = amd64.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((amd64.Operand.memloc o amd64.MemLoc.shift) {origin = origin, disp = amd64.Immediate.int offset, scale = amd64.Scale.One, size = size}, size), offset + amd64.Size.toBytes size)) end | Real _ => Error.bug "amd64Translate.Operand.toAMD64Operand: Real unimplemented" | Register r => let val ty = Machine.Type.toCType (Register.ty r) val index = Machine.Register.index r val base = amd64.Immediate.label (amd64MLton.local_base ty) val origin = amd64.MemLoc.imm {base = base, index = amd64.Immediate.int index, scale = amd64.Scale.fromCType ty, size = amd64.Size.BYTE, class = amd64MLton.Classes.Locals} val sizes = amd64.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((amd64.Operand.memloc o amd64.MemLoc.shift) {origin = origin, disp = amd64.Immediate.int offset, scale = amd64.Scale.One, size = size}, size), offset + amd64.Size.toBytes size)) end | StackOffset (StackOffset.T {offset, ty}) => let val offset = Bytes.toInt offset val ty = Type.toCType ty val origin = amd64.MemLoc.simple {base = amd64MLton.gcState_stackTopContents (), index = amd64.Immediate.int offset, scale = amd64.Scale.One, size = amd64.Size.BYTE, class = amd64MLton.Classes.Stack} val sizes = amd64.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((amd64.Operand.memloc o amd64.MemLoc.shift) {origin = origin, disp = amd64.Immediate.int offset, scale = amd64.Scale.One, size = size}, size), offset + amd64.Size.toBytes size)) end | StackTop => let val stackTop = amd64MLton.gcState_stackTopContentsOperand () in Vector.new1 (stackTop, valOf (amd64.Operand.size stackTop)) end | Word w => let fun single size = Vector.new1 (amd64.Operand.immediate_word w, size) in case WordSize.prim (WordX.size w) of W8 => single amd64.Size.BYTE | W16 => single amd64.Size.WORD | W32 => single amd64.Size.LONG | W64 => single amd64.Size.QUAD end end type transInfo = amd64MLton.transInfo structure Entry = struct structure Kind = Machine.Kind fun toAMD64Blocks {label, kind, transInfo as {frameInfoToAMD64, live, liveInfo, ...}: transInfo} = ( amd64Liveness.LiveInfo.setLiveOperands (liveInfo, label, live label); case kind of Kind.Jump => let in AppendList.single (amd64.Block.mkBlock' {entry = SOME (amd64.Entry.jump {label = label}), statements = [], transfer = NONE}) end | Kind.Func => let val args = List.fold (live label, amd64.MemLocSet.empty, fn (operand, args) => case amd64.Operand.deMemloc operand of SOME memloc => amd64.MemLocSet.add(args, memloc) | NONE => args) in AppendList.single (amd64.Block.mkBlock' {entry = SOME (amd64.Entry.func {label = label, live = args}), statements = [], transfer = NONE}) end | Kind.Cont {args, frameInfo, ...} => let val frameInfo = frameInfoToAMD64 frameInfo val args = Vector.fold (args, amd64.MemLocSet.empty, fn (operand,args) => Vector.fold (Operand.toAMD64Operand (Live.toOperand operand), args, fn ((operand,_),args) => case amd64.Operand.deMemloc operand of SOME memloc => amd64.MemLocSet.add(args, memloc) | NONE => args)) in AppendList.single (amd64.Block.mkBlock' {entry = SOME (amd64.Entry.cont {label = label, live = args, frameInfo = frameInfo}), statements = [], transfer = NONE}) end | Kind.Handler {frameInfo, ...} => let in AppendList.single (amd64.Block.mkBlock' {entry = SOME (amd64.Entry.handler {frameInfo = frameInfoToAMD64 frameInfo, label = label, live = amd64.MemLocSet.empty}), statements = [], transfer = NONE}) end | Kind.CReturn {dst, frameInfo, func} => let val dsts = case dst of NONE => Vector.new0 () | SOME dst => Operand.toAMD64Operand (Live.toOperand dst) in amd64MLton.creturn {dsts = dsts, frameInfo = Option.map (frameInfo, frameInfoToAMD64), func = func, label = label, transInfo = transInfo} end) end structure Statement = struct open Machine.Statement fun comments statement = if !Control.Native.commented > 0 then let val comment = (Layout.toString o layout) statement in (AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment (concat ["begin: ", comment])], transfer = NONE}), AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment (concat ["end: ", comment])], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun toAMD64Blocks {statement, transInfo as {...} : transInfo} = (case statement of Noop => AppendList.empty | Move {src, dst} => let val (comment_begin, comment_end) = comments statement val dsts = Operand.toAMD64Operand dst val srcs = Operand.toAMD64Operand src (* Operand.toAMD64Operand returns multi-word * operands in and they will be moved in order, * so it suffices to check for aliasing between * the first dst and second src. *) val (dsts,srcs) = if Vector.length srcs > 1 andalso amd64.Operand.mayAlias (#1 (Vector.sub (dsts, 0)), #1 (Vector.sub (srcs, 1))) then (Vector.rev dsts, Vector.rev srcs) else (dsts,srcs) in AppendList.appends [comment_begin, AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = (Vector.toList o Vector.map2) (dsts,srcs,fn ((dst,_),(src,srcsize)) => (* dst = src *) case amd64.Size.class srcsize of amd64.Size.INT => amd64.Assembly.instruction_mov {dst = dst, src = src, size = srcsize} | amd64.Size.FLT => amd64.Assembly.instruction_sse_movs {dst = dst, src = src, size = srcsize}), transfer = NONE}), comment_end] end | PrimApp {dst, prim, args} => let val (comment_begin, comment_end) = comments statement val args = (Vector.concatV o Vector.map) (args, Operand.toAMD64Operand) val dsts = case dst of NONE => Vector.new0 () | SOME dst => Operand.toAMD64Operand dst in AppendList.appends [comment_begin, (amd64MLton.prim {prim = prim, args = args, dsts = dsts, transInfo = transInfo}), comment_end] end | ProfileLabel l => AppendList.single (amd64.Block.mkProfileBlock' {profileLabel = l})) end structure Transfer = struct open Machine.Transfer fun goto l = AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.goto {target = l})}) fun iff (test, a, b) = let val (test,testsize) = Vector.sub (Operand.toAMD64Operand test, 0) in if Label.equals(a, b) then AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.goto {target = a})}) else AppendList.single ((* if (test) goto a * goto b *) amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.instruction_test {src1 = test, src2 = test, size = testsize}], transfer = SOME (amd64.Transfer.iff {condition = amd64.Instruction.NZ, truee = a, falsee = b})}) end fun cmp (test, k, a, b) = let val (test,testsize) = Vector.sub (Operand.toAMD64Operand test, 0) in if Label.equals(a, b) then AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.goto {target = a})}) else AppendList.single ((* if (test = k) goto a * goto b *) amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.instruction_cmp {src1 = test, src2 = amd64.Operand.immediate k, size = testsize}], transfer = SOME (amd64.Transfer.iff {condition = amd64.Instruction.E, truee = a, falsee = b})}) end fun switch(test, cases, default) = let val test = Operand.toAMD64Operand test val (test,_) = Vector.sub(test, 0) in AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.switch {test = test, cases = cases, default = default})}) end fun doSwitchWord (test, cases, default) = (case (cases, default) of ([], NONE) => Error.bug "amd64Translate.Transfer.doSwitchWord" | ([(_,l)], NONE) => goto l | ([], SOME l) => goto l | ([(w1,l1),(w2,l2)], NONE) => if WordX.isZero w1 andalso WordX.isOne w2 then iff(test,l2,l1) else if WordX.isZero w2 andalso WordX.isOne w1 then iff(test,l1,l2) else cmp(test,amd64.Immediate.word w1,l1,l2) | ([(k',l')], SOME l) => cmp(test,amd64.Immediate.word k',l',l) | ((_,l)::cases, NONE) => switch(test, amd64.Transfer.Cases.word cases, l) | (cases, SOME l) => switch(test, amd64.Transfer.Cases.word cases, l)) fun comments transfer = if !Control.Native.commented > 0 then let val comment = (Layout.toString o layout) transfer in AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [amd64.Assembly.comment comment], transfer = NONE}) end else AppendList.empty fun toAMD64Blocks {returns, transfer, transInfo as {frameInfoToAMD64, ...}: transInfo} = (case transfer of Arith {prim, args, dst, overflow, success, ...} => let val args = (Vector.concatV o Vector.map) (args, Operand.toAMD64Operand) val dsts = Operand.toAMD64Operand dst in AppendList.append (comments transfer, amd64MLton.arith {prim = prim, args = args, dsts = dsts, overflow = overflow, success = success, transInfo = transInfo}) end | CCall {args, frameInfo, func, return} => let val args = (Vector.concatV o Vector.map) (args, Operand.toAMD64Operand) in AppendList.append (comments transfer, amd64MLton.ccall {args = args, frameInfo = (Option.map (frameInfo, frameInfoToAMD64)), func = func, return = return, transInfo = transInfo}) end | Return => AppendList.append (comments transfer, AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.return {live = Vector.fold ((case returns of NONE => Error.bug "amd64Translate.Transfer.toAMD64Blocsk: Return" | SOME zs => zs), amd64.MemLocSet.empty, fn (operand, live) => Vector.fold (Operand.toAMD64Operand operand, live, fn ((operand,_),live) => case amd64.Operand.deMemloc operand of SOME memloc => amd64.MemLocSet.add(live, memloc) | NONE => live))})})) | Raise => AppendList.append (comments transfer, AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.raisee {live = amd64.MemLocSet.add (amd64.MemLocSet.add (amd64.MemLocSet.empty, amd64MLton.gcState_stackBottomContents ()), amd64MLton.gcState_exnStackContents ())})})) | Switch (Machine.Switch.T {cases, default, test, ...}) => AppendList.append (comments transfer, doSwitchWord (test, Vector.toList cases, default)) | Goto label => (AppendList.append (comments transfer, AppendList.single ((* goto label *) amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (amd64.Transfer.goto {target = label})}))) | Call {label, live, return, ...} => let val live = Vector.fold (live, amd64.MemLocSet.empty, fn (operand, live) => Vector.fold (Operand.toAMD64Operand (Live.toOperand operand), live, fn ((operand, _), live) => case amd64.Operand.deMemloc operand of NONE => live | SOME memloc => amd64.MemLocSet.add (live, memloc))) val com = comments transfer val transfer = case return of NONE => amd64.Transfer.tail {target = label, live = live} | SOME {return, handler, size} => amd64.Transfer.nontail {target = label, live = live, return = return, handler = handler, size = Bytes.toInt size} in AppendList.append (com, AppendList.single (amd64.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME transfer})) end) end structure Block = struct open Machine.Block fun toAMD64Blocks {block = T {label, live, kind, returns, statements, transfer, ...}, transInfo as {...} : transInfo} = let val pseudo_blocks = AppendList.append (AppendList.snoc (Entry.toAMD64Blocks {label = label, kind = kind, transInfo = transInfo}, amd64.Block.mkBlock' {entry = NONE, statements = if !Control.Native.commented > 0 then let val comment = concat ["Live: ", argsToString (Vector.toListMap (live, fn l => Operand.toString (Live.toOperand l)))] in [amd64.Assembly.comment comment] end else [], transfer = NONE}), Vector.foldr(statements, (Transfer.toAMD64Blocks {returns = (Option.map (returns, fn v => Vector.map (v, Live.toOperand))), transfer = transfer, transInfo = transInfo}), fn (statement,l) => AppendList.append (Statement.toAMD64Blocks {statement = statement, transInfo = transInfo}, l))) val pseudo_blocks = AppendList.toList pseudo_blocks val blocks = amd64.Block.compress pseudo_blocks in blocks end end structure Chunk = struct open Machine.Chunk fun toAMD64Chunk {chunk = T {blocks, ...}, frameInfoToAMD64, liveInfo} = let val data = ref [] val addData = fn l => List.push (data, l) val {get = live : Label.t -> amd64.Operand.t list, set = setLive, rem = remLive, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("live", Label.layout)) val _ = Vector.foreach (blocks, fn Block.T {label, live, ...} => setLive (label, (Vector.toList o #1 o Vector.unzip o Vector.concatV o Vector.map) (live, Operand.toAMD64Operand o Live.toOperand))) val transInfo = {addData = addData, frameInfoToAMD64 = frameInfoToAMD64, live = live, liveInfo = liveInfo} val amd64Blocks = List.concat (Vector.toListMap (blocks, fn block => Block.toAMD64Blocks {block = block, transInfo = transInfo})) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => remLive label) val data = List.concatRev (!data) val data = if List.isEmpty data then [] else (amd64.Assembly.pseudoop_data())::data in amd64.Chunk.T {data = data, blocks = amd64Blocks} end end fun translateChunk {chunk: amd64MLton.Machine.Chunk.t, frameInfoToAMD64, liveInfo: amd64Liveness.LiveInfo.t}: {chunk: amd64.Chunk.t} = {chunk = Chunk.toAMD64Chunk {chunk = chunk, frameInfoToAMD64 = frameInfoToAMD64, liveInfo = liveInfo}} val (translateChunk, translateChunk_msg) = tracerTop "translateChunk" translateChunk fun translateChunk_totals () = (translateChunk_msg (); Control.indent (); Control.unindent ()) end mlton-20100608/mlton/codegen/amd64-codegen/amd64-translate.sig0000644000076600000240000000200111404435625022240 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_TRANSLATE_STRUCTS = sig structure amd64: AMD64_PSEUDO structure amd64MLton : AMD64_MLTON sharing amd64 = amd64MLton.amd64 structure amd64Liveness : AMD64_LIVENESS sharing amd64 = amd64Liveness.amd64 sharing amd64MLton.amd64Liveness = amd64Liveness end signature AMD64_TRANSLATE = sig include AMD64_TRANSLATE_STRUCTS val translateChunk : {chunk: amd64MLton.Machine.Chunk.t, frameInfoToAMD64: (amd64MLton.Machine.FrameInfo.t -> amd64.FrameInfo.t), liveInfo: amd64Liveness.LiveInfo.t} -> {chunk: amd64.Chunk.t} val translateChunk_totals : unit -> unit end mlton-20100608/mlton/codegen/amd64-codegen/amd64.fun0000644000076600000240000045072511404435625020277 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor amd64 (S: AMD64_STRUCTS): AMD64 = struct val tracerTop = fn s => Control.traceBatch (Control.Pass, s) (* = fn s => fn f => (Control.trace (Control.Pass, s) f, fn () => ()) *) val tracer = fn s => Control.traceBatch (Control.Detail, s) (* = fn s => fn f => (Control.trace (Control.Detail, s) f, fn () => ()) *) (* compensate for differences between * C-escape sequences and ASM-escape sequences *) val Char_escapeASM = fn #"\000" => "\\000" | #"\^G" => "\\007" | #"\^K" => "\\013" | #"?" => "?" | #"'" => "'" | c => Char.escapeC c fun String_escapeASM s = String.translate(s, Char_escapeASM) val rec lexical = fn [] => EQUAL | thunk::tl => let val ord = thunk () in if Relation.equals(ord, EQUAL) then lexical tl else ord end open S structure Label = struct open Label fun toString l = if !Control.labelsHaveExtra_ then concat ["_", Label.toString l] else Label.toString l val layout = Layout.str o toString end structure Size = struct datatype class = INT | FLT datatype t = BYTE | WORD | LONG | QUAD | SNGL | DBLE val layout = let open Layout in fn BYTE => str "b" | WORD => str "w" | LONG => str "l" | QUAD => str "q" | SNGL => str "s" | DBLE => str "d" end val toString = Layout.toString o layout val fromBytes : int -> t = fn 1 => BYTE | 2 => WORD | 4 => LONG | 8 => QUAD | _ => Error.bug "amd64.Size.fromBytes" val toBytes : t -> int = fn BYTE => 1 | WORD => 2 | LONG => 4 | QUAD => 8 | SNGL => 4 | DBLE => 8 local datatype z = datatype CType.t in fun fromCType t = case t of CPointer => Vector.new1 QUAD | Int8 => Vector.new1 BYTE | Int16 => Vector.new1 WORD | Int32 => Vector.new1 LONG | Int64 => Vector.new1 QUAD | Objptr => Vector.new1 QUAD | Real32 => Vector.new1 SNGL | Real64 => Vector.new1 DBLE | Word8 => Vector.new1 BYTE | Word16 => Vector.new1 WORD | Word32 => Vector.new1 LONG | Word64 => Vector.new1 QUAD end val class = fn BYTE => INT | WORD => INT | LONG => INT | QUAD => INT | SNGL => FLT | DBLE => FLT val eq = fn (s1, s2) => s1 = s2 val lt = fn (s1, s2) => (toBytes s1) < (toBytes s2) end structure Register = struct datatype reg = RAX | RBX | RCX | RDX | RDI | RSI | RBP | RSP | R8 | R9 | R10 | R11 | R12 | R13 | R14 | R15 | RIP val allReg = [RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8, R9, R10, R11, R12, R13, R14, R15] datatype part = R | E | X | L datatype t = T of {reg: reg, part: part} fun size (T {part, ...}) = case part of R => Size.QUAD | E => Size.LONG | X => Size.WORD | L => Size.BYTE fun layout (T {reg, part}) = let open Layout fun doit1 base = let val {prefix, suffix} = case part of R => {prefix = "%r", suffix = "x"} | E => {prefix = "%e", suffix = "x"} | X => {prefix = "%", suffix = "x"} | L => {prefix = "%", suffix = "l"} in str (String.concat [prefix, base, suffix]) end fun doit2 base = let val {prefix, suffix} = case part of R => {prefix = "%r", suffix = ""} | E => {prefix = "%e", suffix = ""} | X => {prefix = "%", suffix = ""} | L => {prefix = "%", suffix = "l"} in str (String.concat [prefix, base, suffix]) end fun doit3 base = let val {suffix} = case part of R => {suffix = ""} | E => {suffix = "d"} | X => {suffix = "w"} | L => {suffix = "b"} in str (String.concat ["%", base, suffix]) end in case reg of RAX => doit1 "a" | RBX => doit1 "b" | RCX => doit1 "c" | RDX => doit1 "d" | RDI => doit2 "di" | RSI => doit2 "si" | RBP => doit2 "bp" | RSP => doit2 "sp" | R8 => doit3 "r8" | R9 => doit3 "r9" | R10 => doit3 "r10" | R11 => doit3 "r11" | R12 => doit3 "r12" | R13 => doit3 "r13" | R14 => doit3 "r14" | R15 => doit3 "r15" | RIP => doit3 "rip" end val toString = Layout.toString o layout fun eq(T r1, T r2) = r1 = r2 val rax = T {reg = RAX, part = R} val eax = T {reg = RAX, part = E} val ax = T {reg = RAX, part = X} val al = T {reg = RAX, part = L} val rbx = T {reg = RBX, part = R} val ebx = T {reg = RBX, part = E} val bl = T {reg = RBX, part = L} val rcx = T {reg = RCX, part = R} val ecx = T {reg = RCX, part = E} val cl = T {reg = RCX, part = L} val rdx = T {reg = RDX, part = R} val edx = T {reg = RCX, part = E} val dl = T {reg = RDX, part = L} val rdi = T {reg = RDI, part = R} val rsi = T {reg = RSI, part = R} val rsp = T {reg = RSP, part = R} val rbp = T {reg = RBP, part = R} val r8 = T {reg = R8, part = R} val r8w = T {reg = R8, part = X} val r9 = T {reg = R9, part = R} val r9w = T {reg = R9, part = X} val r10 = T {reg = R10, part = R} val r10w = T {reg = R10, part = X} val r11 = T {reg = R11, part = R} val r11w = T {reg = R11, part = X} val r12 = T {reg = R12, part = R} val r12w = T {reg = R12, part = X} val r13 = T {reg = R13, part = R} val r13w = T {reg = R13, part = X} val r14 = T {reg = R14, part = R} val r14w = T {reg = R14, part = X} val r15 = T {reg = R15, part = R} val r15w = T {reg = R15, part = X} val rip = T {reg = RIP, part = R} local fun make part = List.rev [T {reg = RAX, part = part}, T {reg = RBX, part = part}, T {reg = RCX, part = part}, T {reg = RDX, part = part}, T {reg = RDI, part = part}, T {reg = RSI, part = part}, T {reg = RBP, part = part}, T {reg = RSP, part = part}, T {reg = R8, part = part}, T {reg = R9, part = part}, T {reg = R10, part = part}, T {reg = R11, part = part}, T {reg = R12, part = part}, T {reg = R13, part = part}, T {reg = R14, part = part}, T {reg = R15, part = part}] in val byteRegisters = make L val wordRegisters = make X val longRegisters = make E val quadRegisters = make R end val all = List.concat [byteRegisters, wordRegisters, longRegisters, quadRegisters] fun valid r = List.contains(all, r, eq) val contains = fn (R, R) => true | (R, E) => true | (R, X) => true | (R, L) => true | (E, E) => true | (E, X) => true | (E, L) => true | (X, X) => true | (X, L) => true | (L, L) => true | _ => false fun coincide (T {reg = reg1, part = part1}, T {reg = reg2, part = part2}) = reg1 = reg2 andalso (contains(part1,part2) orelse contains(part2,part1)) fun coincident' reg = List.keepAllMap([R, E, X, L], fn part => let val register' = T {reg = reg, part = part} in if valid register' andalso coincide(T {reg = reg, part = E}, register') then SOME register' else NONE end) val registers = fn Size.BYTE => byteRegisters | Size.WORD => wordRegisters | Size.LONG => longRegisters | Size.QUAD => quadRegisters | _ => Error.bug "amd64.Register.registers" val baseRegisters = quadRegisters val indexRegisters = [T {reg = RAX, part = R}, T {reg = RBX, part = R}, T {reg = RCX, part = R}, T {reg = RDX, part = R}, T {reg = RDI, part = R}, T {reg = RSI, part = R}, T {reg = RBP, part = R}, T {reg = R8, part = R}, T {reg = R9, part = R}, T {reg = R10, part = R}, T {reg = R11, part = R}, T {reg = R12, part = R}, T {reg = R13, part = R}, T {reg = R14, part = R}, T {reg = R15, part = R}] local fun make reg = [T {reg = reg, part = R}, T {reg = reg, part = E}, T {reg = reg, part = X}, T {reg = reg, part = L}] in val callerSaveRegisters = List.concatMap ([RAX, RCX, RDX, RDI, RSI, R8, R9, R10, R11], make) val calleeSaveRegisters = List.concatMap ([RBX, R12, R13, R14, R15], make) end val withLowPart (* (fullsize,lowsize) *) = fn (Size.WORD,Size.BYTE) => wordRegisters | (Size.LONG,Size.BYTE) => longRegisters | (Size.QUAD,Size.BYTE) => quadRegisters | (Size.LONG,Size.WORD) => longRegisters | (Size.QUAD,Size.WORD) => quadRegisters | (Size.QUAD,Size.LONG) => quadRegisters | _ => Error.bug "amd64.Register.withLowPart: fullsize,lowsize" val lowPartOf (* (register,lowsize) *) = fn (T {reg, ...},Size.BYTE) => T {reg = reg, part = L} | (T {reg, ...},Size.WORD) => T {reg = reg, part = X} | (T {reg, ...},Size.LONG) => T {reg = reg, part = E} | _ => Error.bug "amd64.Register.lowPartOf: register,lowsize" end structure XmmRegister = struct datatype reg = XMM0 | XMM1 | XMM2 | XMM3 | XMM4 | XMM5 | XMM6 | XMM7 | XMM8 | XMM9 | XMM10 | XMM11 | XMM12 | XMM13 | XMM14 | XMM15 val allReg = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15] datatype part = D | S datatype t = T of {reg: reg, part: part} fun size (T {part, ...}) = case part of D => Size.DBLE | S => Size.SNGL fun layout (T {reg, ...}) = let open Layout in case reg of XMM0 => str "%xmm0" | XMM1 => str "%xmm1" | XMM2 => str "%xmm2" | XMM3 => str "%xmm3" | XMM4 => str "%xmm4" | XMM5 => str "%xmm5" | XMM6 => str "%xmm6" | XMM7 => str "%xmm7" | XMM8 => str "%xmm8" | XMM9 => str "%xmm9" | XMM10 => str "%xmm10" | XMM11 => str "%xmm11" | XMM12 => str "%xmm12" | XMM13 => str "%xmm13" | XMM14 => str "%xmm14" | XMM15 => str "%xmm15" end val toString = Layout.toString o layout fun eq(T r1, T r2) = r1 = r2 val xmm0S = T {reg = XMM0, part = S} val xmm0D = T {reg = XMM0, part = D} val xmm1S = T {reg = XMM1, part = S} val xmm1D = T {reg = XMM1, part = D} val xmm2S = T {reg = XMM2, part = S} val xmm2D = T {reg = XMM2, part = D} val xmm3S = T {reg = XMM3, part = S} val xmm3D = T {reg = XMM3, part = D} val xmm4S = T {reg = XMM4, part = S} val xmm4D = T {reg = XMM4, part = D} val xmm5S = T {reg = XMM5, part = S} val xmm5D = T {reg = XMM5, part = D} val xmm6S = T {reg = XMM6, part = S} val xmm6D = T {reg = XMM6, part = D} val xmm7S = T {reg = XMM7, part = S} val xmm7D = T {reg = XMM7, part = D} val xmm8S = T {reg = XMM8, part = S} val xmm8D = T {reg = XMM8, part = D} val xmm9S = T {reg = XMM9, part = S} val xmm9D = T {reg = XMM9, part = D} val xmm10S = T {reg = XMM10, part = S} val xmm10D = T {reg = XMM10, part = D} val xmm11S = T {reg = XMM11, part = S} val xmm11D = T {reg = XMM11, part = D} val xmm12S = T {reg = XMM12, part = S} val xmm12D = T {reg = XMM12, part = D} val xmm13S = T {reg = XMM13, part = S} val xmm13D = T {reg = XMM13, part = D} val xmm14S = T {reg = XMM14, part = S} val xmm14D = T {reg = XMM14, part = D} val xmm15S = T {reg = XMM15, part = S} val xmm15D = T {reg = XMM15, part = D} local fun make part = List.rev [T {reg = XMM0, part = part}, T {reg = XMM1, part = part}, T {reg = XMM2, part = part}, T {reg = XMM3, part = part}, T {reg = XMM4, part = part}, T {reg = XMM5, part = part}, T {reg = XMM6, part = part}, T {reg = XMM7, part = part}, T {reg = XMM8, part = part}, T {reg = XMM9, part = part}, T {reg = XMM10, part = part}, T {reg = XMM11, part = part}, T {reg = XMM12, part = part}, T {reg = XMM13, part = part}, T {reg = XMM14, part = part}, T {reg = XMM15, part = part}] in val singleRegisters = make S val doubleRegisters = make D end val all = List.concat [singleRegisters, doubleRegisters] fun valid r = List.contains(all, r, eq) val contains = fn (D, D) => true | (D, S) => true | (S, S) => true | _ => false fun coincide (T {reg = reg1, part = part1}, T {reg = reg2, part = part2}) = reg1 = reg2 andalso (contains(part1,part2) orelse contains(part2,part1)) fun coincident' reg = List.keepAllMap([D, S], fn part => let val register' = T {reg = reg, part = part} in if valid register' andalso coincide(T {reg = reg, part = D}, register') then SOME register' else NONE end) fun coincident (T {reg, ...}) = coincident' reg (* quell unused warning *) val _ = coincident val registers = fn Size.SNGL => singleRegisters | Size.DBLE => doubleRegisters | _ => Error.bug "amd64.XmmRegister.registers" val callerSaveRegisters = all val calleeSaveRegisters = [] end structure Immediate = struct datatype u = Word of WordX.t | Label of Label.t | LabelPlusWord of Label.t * WordX.t and t = T of {immediate: u, plist: PropertyList.t, hash: Word.t} local open Layout in val rec layoutU = fn Word w => WordX.layout w | Label l => Label.layout l | LabelPlusWord (l, w) => paren (seq [Label.layout l, str "+", WordX.layout w]) and layout = fn T {immediate, ...} => layoutU immediate end val rec eqU = fn (Word w1, Word w2) => WordX.equals (w1, w2) | (Label l1, Label l2) => Label.equals(l1, l2) | (LabelPlusWord (l1, w1), LabelPlusWord (l2,w2)) => Label.equals(l1,l2) andalso WordX.equals(w1, w2) | _ => false and eq = fn (T {plist = plist1, ...}, T {plist = plist2, ...}) => PropertyList.equals(plist1, plist2) local open WordX in val rec evalU = fn Word w => SOME w | Label _ => NONE | LabelPlusWord _ => NONE and eval = fn T {immediate, ...} => evalU immediate end val isZero = fn i => case eval i of SOME w => WordX.isZero w | _ => false local open Word in val rec hashU = fn Word w => WordX.hash w | Label l => Label.hash l | LabelPlusWord (l,w) => Word.xorb(0wx5555 * (Label.hash l), WordX.hash w) and hash = fn T {hash, ...} => hash end local val table: t HashSet.t ref = ref (HashSet.new {hash = hash}) in val construct = fn immediate => let val hash = hashU immediate in HashSet.lookupOrInsert (!table, hash, fn T {immediate = immediate', ...} => eqU(immediate', immediate), fn () => T {immediate = immediate, hash = hash, plist = PropertyList.new ()}) end val destruct = fn T {immediate, ...} => immediate fun clearAll () = HashSet.foreach (!table, fn T {immediate, plist, ...} => let in PropertyList.clear plist; case immediate of Word _ => () | Label l => Label.clear l | LabelPlusWord (l, _) => Label.clear l end) end val word = construct o Word val label = construct o Label val labelPlusWord = fn (l, w) => if WordSize.equals (WordX.size w, WordSize.word64) then construct (LabelPlusWord (l, w)) else Error.bug "amd64.Immediate.labelPlusWord" val int' = fn (i, ws) => word (WordX.fromIntInf (IntInf.fromInt i, ws)) val int = fn i => int' (i, WordSize.word64) val zero = int 0 val labelPlusInt = fn (l, i) => labelPlusWord (l, WordX.fromIntInf (IntInf.fromInt i, WordSize.word64)) val deLabel = fn T {immediate = Label l, ...} => SOME l | _ => NONE end structure Scale = struct datatype t = One | Two | Four | Eight val layout = let open Layout in fn One => str "1" | Two => str "2" | Four => str "4" | Eight => str "8" end val fromBytes : int -> t = fn 1 => One | 2 => Two | 4 => Four | 8 => Eight | _ => Error.bug "amd64.Scale.fromBytes" local datatype z = datatype CType.t in fun fromCType t = case t of CPointer => Eight | Int8 => One | Int16 => Two | Int32 => Four | Int64 => Eight | Objptr => Eight | Real32 => Four | Real64 => Eight | Word8 => One | Word16 => Two | Word32 => Four | Word64 => Eight end fun eq(s1, s2) = s1 = s2 val toWordX = fn One => WordX.fromIntInf (1, WordSize.word64) | Two => WordX.fromIntInf (2, WordSize.word64) | Four => WordX.fromIntInf (4, WordSize.word64) | Eight => WordX.fromIntInf (8, WordSize.word64) val toImmediate = Immediate.word o toWordX end structure Address = struct datatype t = T of {disp: Immediate.t option, base: Register.t option, index: Register.t option, scale: Scale.t option} fun layout (T {disp, base, index, scale}) = let open Layout in seq [case disp of NONE => empty | SOME disp => Immediate.layout disp, if (isSome base orelse isSome index) then paren (seq [case base of NONE => empty | SOME base => Register.layout base, case index of NONE => empty | SOME index => seq [str ",", Register.layout index], case scale of NONE => empty | SOME scale => seq [str ",", Scale.layout scale]]) else empty] end fun eq(T {disp = disp, base = base, index = index, scale = scale}, T {disp = disp', base = base', index = index', scale = scale'}) = (case (disp, disp') of (NONE, NONE) => true | (SOME disp, SOME disp') => Immediate.eq(disp, disp') | _ => false) andalso base = base' andalso index = index' andalso scale = scale' end structure MemLoc = struct structure Class = struct val counter = Counter.new 0 datatype t = T of {counter: int, name: string} fun layout (T {name, ...}) = let open Layout in str name end val toString = Layout.toString o layout fun new {name} = let val class = T {counter = Counter.next counter, name = name} in class end val eq = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => counter1 = counter2 val compare = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => Int.compare (counter1, counter2) val counter = fn (T {counter, ...}) => counter val mayAlias = eq val Temp = new {name = "Temp"} val StaticTemp = new {name = "StaticTemp"} val CArg = new {name = "CArg"} val CStack = new {name = "CStack"} val Code = new {name = "Code"} end datatype u = U of {immBase: Immediate.t option, memBase: t option, immIndex: Immediate.t option, memIndex: t option, scale: Scale.t, size: Size.t, class: Class.t} and t = T of {memloc: u, hash: Word.t, plist: PropertyList.t, counter: Int.t, utilized: t list} local open Layout in val rec layoutImmMem = fn (NONE, NONE) => str "0" | (SOME imm, NONE) => Immediate.layout imm | (NONE, SOME mem) => layout mem | (SOME imm, SOME mem) => seq [Immediate.layout imm, str "+", layout mem] and layoutImmMemScale = fn (NONE, NONE, _) => str "0" | (SOME imm, NONE, _) => Immediate.layout imm | (NONE, SOME mem, scale) => seq [layout mem, str "*", Scale.layout scale] | (SOME imm, SOME mem, scale) => seq [Immediate.layout imm, str "+(", layout mem, str "*", Scale.layout scale, str ")"] and layoutU = fn U {immBase, memBase, immIndex, memIndex, scale, size, class} => seq [str "MEM<", Size.layout size, str ">{", Class.layout class, str "}[(", layoutImmMem (immBase, memBase), str ")+(", layoutImmMemScale (immIndex, memIndex, scale), str ")]"] and layout = fn T {memloc, ...} => layoutU memloc end val toString = Layout.toString o layout val rec hashImmMem = fn (NONE, NONE) => 0wx55555555 | (SOME imm, NONE) => Immediate.hash imm | (NONE, SOME mem) => hash mem | (SOME imm, SOME mem) => Word.xorb(0wx5555 * (Immediate.hash imm), hash mem) and hashU = fn U {immBase, memBase, immIndex, memIndex, ...} => let val hashBase = hashImmMem(immBase, memBase) val hashIndex = hashImmMem(immIndex, memIndex) in Word.xorb(0wx5555 * hashBase, hashIndex) end and hash = fn T {hash, ...} => hash val rec eqImm = fn (NONE, NONE) => true | (SOME imm1, SOME imm2) => Immediate.eq(imm1, imm2) | _ => false and eqMem = fn (NONE, NONE) => true | (SOME mem1, SOME mem2) => eq(mem1, mem2) | _ => false and eqU = fn (U {immBase = immBase1, memBase = memBase1, immIndex = immIndex1, memIndex = memIndex1, scale = scale1, size = size1, class = class1}, U {immBase = immBase2, memBase = memBase2, immIndex = immIndex2, memIndex = memIndex2, scale = scale2, size = size2, class = class2}) => Class.eq(class1, class2) andalso eqImm(immBase1, immBase2) andalso eqMem(memBase1, memBase2) andalso eqImm(immIndex1, immIndex2) andalso eqMem(memIndex1, memIndex2) andalso Scale.eq(scale1, scale2) andalso Size.eq(size1, size2) and eq = fn (T {plist = plist1, ...}, T {plist = plist2, ...}) => PropertyList.equals(plist1, plist2) val rec utilizedMem = fn NONE => [] | SOME m => m::(utilized m) and utilizedU = fn U {memBase, memIndex, ...} => (utilizedMem memBase) @ (utilizedMem memIndex) and utilized = fn T {utilized, ...} => utilized local val counter = Counter.new 0 val table: t HashSet.t ref = ref (HashSet.new {hash = hash}) in val construct = fn memloc => let val hash = hashU memloc in HashSet.lookupOrInsert (!table, hash, fn T {memloc = memloc', ...} => eqU(memloc', memloc), fn () => T {memloc = memloc, hash = hash, plist = PropertyList.new (), counter = Counter.next counter, utilized = utilizedU memloc}) end val destruct = fn T {memloc, ...} => memloc fun clearAll () = HashSet.foreach (!table, fn T {plist, ...} => let in PropertyList.clear plist end) end val rec mayAliasImmIndex = fn ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) => let val size1 = IntInf.fromInt (Size.toBytes size1) val size2 = IntInf.fromInt (Size.toBytes size2) in case (Immediate.eval (case immIndex1 of NONE => Immediate.zero | SOME immIndex => immIndex), Immediate.eval (case immIndex2 of NONE => Immediate.zero | SOME immIndex => immIndex)) of (SOME pos1, SOME pos2) => (let val pos1 = WordX.toIntInfX pos1 val pos2 = WordX.toIntInfX pos2 in if pos1 < pos2 then pos2 < (pos1 + size1) else pos1 < (pos2 + size2) end handle Overflow => false) | _ => true end and mayAliasU = fn (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => Immediate.eq(immBase1, immBase2) andalso mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => not (Immediate.eq(immBase1, immBase2)) andalso (not (eq(memIndex1, memIndex2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2})) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => not (eq(memBase1, memBase2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => not (eq(memBase1, memBase2)) orelse not (eq(memIndex1, memIndex2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | _ => true and mayAlias = fn (T {memloc = memloc1 as U {class = class1, ...}, ...}, T {memloc = memloc2 as U {class = class2, ...}, ...}) => Class.mayAlias(class1, class2) andalso mayAliasU(memloc1, memloc2) val rec mayAliasOrdImmIndex = fn ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) => let val size1 = IntInf.fromInt (Size.toBytes size1) val size2 = IntInf.fromInt (Size.toBytes size2) in case (Immediate.eval (case immIndex1 of NONE => Immediate.zero | SOME immIndex => immIndex), Immediate.eval (case immIndex2 of NONE => Immediate.zero | SOME immIndex => immIndex)) of (SOME pos1, SOME pos2) => (let val pos1 = WordX.toIntInfX pos1 val pos2 = WordX.toIntInfX pos2 in if pos1 < pos2 then if pos2 < (pos1 + size1) then SOME LESS else NONE else if pos1 < (pos2 + size2) then SOME GREATER else NONE end handle Overflow => NONE) | _ => SOME EQUAL end and mayAliasOrdU = fn (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => if Immediate.eq(immBase1, immBase2) then mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) else NONE | (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => if Immediate.eq(immBase1, immBase2) then if not (eq(memIndex1, memIndex2)) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) else NONE | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => if not (eq(memBase1, memBase2)) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => if (not (eq(memBase1, memBase2)) orelse not (eq(memIndex1, memIndex2))) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | _ => SOME EQUAL and mayAliasOrd = fn (T {memloc = memloc1 as U {class = class1, ...}, ...}, T {memloc = memloc2 as U {class = class2, ...}, ...}) => if Class.mayAlias(class1, class2) then mayAliasOrdU(memloc1, memloc2) else NONE val compare = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => Int.compare(counter1, counter2) fun replaceMem replacer = fn NONE => NONE | SOME mem => SOME (replace replacer mem) and replaceU replacer = fn memloc as T {memloc = U {immBase, memBase, immIndex, memIndex, scale, size, class}, ...} => let val memBase' = replaceMem replacer memBase val memIndex' = replaceMem replacer memIndex in if eqMem(memBase, memBase') andalso eqMem(memIndex, memIndex') then memloc else construct (U {immBase = immBase, memBase = memBase', immIndex = immIndex, memIndex = memIndex', scale = scale, size = size, class = class}) end and replace replacer = fn memloc => let val memloc' = replacer memloc in if eq(memloc', memloc) then replaceU replacer memloc else memloc' end val rec sizeU = fn U {size, ...} => size and size = fn T {memloc, ...} => sizeU memloc val rec classU = fn U {class, ...} => class and class = fn T {memloc, ...} => classU memloc fun scaleImmediate (imm, scale) = case Immediate.destruct imm of Immediate.Word w => Immediate.word (WordX.mul (w, Scale.toWordX scale, {signed = true})) | _ => Error.bug "amd64.MemLoc.scaleImmediate" fun addImmediate (imm1, imm2) = case (Immediate.destruct imm1, Immediate.destruct imm2) of (Immediate.Word w1, Immediate.Word w2) => Immediate.word (WordX.add (w1, w2)) | _ => Error.bug "amd64.MemLoc.scaleImmediate" val imm = fn {base, index, scale, size, class} => construct (U {immBase = SOME base, memBase = NONE, immIndex = SOME (scaleImmediate (index, scale)), memIndex = NONE, scale = scale, size = size, class = class}) val basic = fn {base, index, scale, size, class} => construct (U {immBase = SOME base, memBase = NONE, immIndex = NONE, memIndex = SOME index, scale = scale, size = size, class = class}) val simple = fn {base, index, scale, size, class} => construct (U {immBase = NONE, memBase = SOME base, immIndex = SOME (scaleImmediate (index, scale)), memIndex = NONE, scale = scale, size = size, class = class}) val complex = fn {base, index, scale, size, class} => construct (U {immBase = NONE, memBase = SOME base, immIndex = NONE, memIndex = SOME index, scale = scale, size = size, class = class}) val shift = fn {origin, disp, scale, size} => let val disp = scaleImmediate (disp, scale) val U {immBase, memBase, immIndex, memIndex, scale, class, ...} = destruct origin in construct (U {immBase = immBase, memBase = memBase, immIndex = case immIndex of NONE => SOME disp | SOME immIndex => SOME (addImmediate (immIndex, disp)), memIndex = memIndex, scale = scale, size = size, class = class}) end local val num : int ref = ref 0 in val temp = fn {size} => (Int.inc num; imm {base = Immediate.zero, index = Immediate.int (!num), scale = Scale.One, size = size, class = Class.Temp}) end (* * Static memory locations *) fun makeContents {base, size, class} = imm {base = base, index = Immediate.zero, scale = Scale.Eight, size = size, class = class} (* local datatype z = datatype CType.t datatype z = datatype Size.t in fun cReturnTempContents sizes = (List.rev o #1) (List.fold (sizes, ([],0), fn (size, (contents, index)) => ((cReturnTempContent (index, size))::contents, index + Size.toBytes size))) fun cReturnTempContent size = List.first(cReturnTempContents [size]) val cReturnTempContents = fn size => cReturnTempContents ( case size of Int s => let datatype z = datatype IntSize.t in case s of I8 => [BYTE] | I16 => [WORD] | I32 => [LONG] | I64 => [LONG, LONG] end | Pointer => [LONG] | Real s => let datatype z = datatype RealSize.t in case s of R32 => [SNGL] | R64 => [DBLE] end | Word s => let datatype z = datatype WordSize.t in case s of W8 => [BYTE] | W16 => [WORD] | W32 => [LONG] end) end *) end local structure ClassElement = struct type t = MemLoc.Class.t val compare = MemLoc.Class.compare local fun make f = fn (a, b) => f (MemLoc.Class.counter a, MemLoc.Class.counter b) in val op < = make Int.< val op > = make Int.> val op >= = make Int.>= val op <= = make Int.<= end val min = fn (a, b) => if Int.<(MemLoc.Class.counter a, MemLoc.Class.counter b) then a else b val max = fn (a, b) => min (b, a) val equals = MemLoc.Class.eq val layout = MemLoc.Class.layout end in structure ClassSet = OrderedUniqueSet(open ClassElement) end local structure MemLocElement = struct type t = MemLoc.t val equals = MemLoc.eq val layout = MemLoc.layout (* val compare = MemLoc.compare local fun make f = fn (a, b) => f (MemLoc.counter a, MemLoc.counter b) in val op < = make Int.< val op > = make Int.> val op >= = make Int.>= val op <= = make Int.<= end val min = fn (a, b) => if Int.<(MemLoc.counter a, MemLoc.counter b) then a else b val max = fn (a, b) => min (b, a) val hash = MemLoc.hash *) end in structure MemLocSet = UnorderedSet(open MemLocElement) (* structure MemLocSet = OrderedUniqueSet(open MemLocElement) *) (* structure MemLocSet' = UnorderedSet(open MemLocElement) structure MemLocSet = HashedUniqueSet(structure Set = MemLocSet' structure Element = MemLocElement) *) end structure Operand = struct datatype t = Register of Register.t | XmmRegister of XmmRegister.t | Immediate of Immediate.t | Label of Label.t | Address of Address.t | MemLoc of MemLoc.t val size = fn Register r => SOME (Register.size r) | XmmRegister x => SOME (XmmRegister.size x) | Immediate _ => NONE | Label _ => NONE | Address _ => NONE | MemLoc m => SOME (MemLoc.size m) val layout = let open Layout in fn Register r => Register.layout r | XmmRegister x => XmmRegister.layout x | Immediate i => seq [str "$", Immediate.layout i] | Label l => Label.layout l | Address a => Address.layout a | MemLoc m => MemLoc.layout m end val toString = Layout.toString o layout val eq = fn (Register r1, Register r2) => Register.eq(r1, r2) | (XmmRegister x1, XmmRegister x2) => XmmRegister.eq(x1, x2) | (Immediate i1, Immediate i2) => Immediate.eq(i1, i2) | (Label l1, Label l2) => Label.equals(l1, l2) | (Address a1, Address a2) => Address.eq(a1, a2) | (MemLoc m1, MemLoc m2) => MemLoc.eq(m1, m2) | _ => false val mayAlias = fn (Register r1, Register r2) => Register.eq(r1, r2) | (Register _, _) => false | (XmmRegister x1, XmmRegister x2) => XmmRegister.eq(x1, x2) | (XmmRegister _, _) => false | (Immediate i1, Immediate i2) => Immediate.eq(i1, i2) | (Immediate _, _) => false | (Label l1, Label l2) => Label.equals(l1, l2) | (Label _, _) => false | (Address _, Address _) => true | (Address _, MemLoc _) => true | (Address _, _) => false | (MemLoc m1, MemLoc m2) => MemLoc.mayAlias(m1, m2) | (MemLoc _, Address _) => true | (MemLoc _, _) => false val register = Register val deRegister = fn Register x => SOME x | _ => NONE val xmmregister = XmmRegister val deXmmregister = fn XmmRegister x => SOME x | _ => NONE val immediate = Immediate val deImmediate = fn Immediate x => SOME x | _ => NONE val immediate_word = immediate o Immediate.word val immediate_int' = immediate o Immediate.int' val immediate_int = immediate o Immediate.int val immediate_zero = immediate Immediate.zero val immediate_label = immediate o Immediate.label val label = Label val deLabel = fn Label x => SOME x | _ => NONE val address = Address val memloc = MemLoc fun memloc_label l = memloc (MemLoc.makeContents { base = Immediate.label l, size = Size.QUAD, class = MemLoc.Class.Code }) val deMemloc = fn MemLoc x => SOME x | _ => NONE local val cReturnTemp = Label.fromString "cReturnTemp" fun cReturnTempContent (index, size) = MemLoc.imm {base = Immediate.label cReturnTemp, index = Immediate.int index, scale = Scale.One, size = size, class = MemLoc.Class.StaticTemp} datatype z = datatype CType.t datatype z = datatype Size.t in fun cReturnTemps ty = if RepType.isUnit ty then [] else let fun w (r, s) = [{src = register r, dst = cReturnTempContent (0, s)}] val w8 = w (Register.al, BYTE) val w16 = w (Register.ax, WORD) val w32 = w (Register.eax, LONG) val w64 = w (Register.rax, QUAD) fun x (x, s) = [{src = xmmregister x, dst = cReturnTempContent (0, s)}] val x32 = x (XmmRegister.xmm0S, SNGL) val x64 = x (XmmRegister.xmm0D, DBLE) in case RepType.toCType ty of CPointer => w64 | Int8 => w8 | Int16 => w16 | Int32 => w32 | Int64 => w64 | Objptr => w64 | Real32 => x32 | Real64 => x64 | Word8 => w8 | Word16 => w16 | Word32 => w32 | Word64 => w64 end end end structure Instruction = struct (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 58 *) | ADC (* signed/unsigned addition with carry; p. 56 *) | SUB (* signed/unsigned subtraction; p. 234 *) | SBB (* signed/unsigned subtraction with borrow; p. 216 *) | AND (* logical and; p. 60 *) | OR (* logical or; p. 176 *) | XOR (* logical xor; p. 243 *) val binal_layout = let open Layout in fn ADD => str "add" | ADC => str "adc" | SUB => str "sub" | SBB => str "sbb" | AND => str "and" | OR => str "or" | XOR => str "xor" end (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 114 *) | MUL (* unsigned multiplication; p. 170 *) | IDIV (* signed division; p. 112 *) | DIV (* unsigned division; p. 108 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) val md_layout = let open Layout in fn IMUL => str "imul" | MUL => str "mul" | IDIV => str "idiv" | DIV => str "div" | IMOD => str "imod" | MOD => str "mod" end (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 117 *) | DEC (* decrement by 1; p. 106 *) | NEG (* two's complement negation; p. 172 *) | NOT (* one's complement negation; p. 175 *) val unal_layout = let open Layout in fn INC => str "inc" | DEC => str "dec" | NEG => str "neg" | NOT => str "not" end (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 211 *) | SHL (* shift logical left; p. 211 *) | SAR (* shift arithmetic right; p. 214 *) | SHR (* shift logical right; p. 214 *) | ROL (* rotate left; p. 206 *) | RCL (* rotate through carry left; p. 197 *) | ROR (* rotate right; p. 208 *) | RCR (* rotate through carry right; p. 199 *) val sral_layout = let open Layout in fn SAL => str "sal" | SHL => str "shl" | SAR => str "sar" | SHR => str "shr" | ROL => str "rol" | RCL => str "rcl" | ROR => str "ror" | RCR => str "rcr" end (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 167 *) | MOVZX (* move with zero extention; p. 169 *) val movx_layout = let open Layout in fn MOVSX => str "movs" | MOVZX => str "movz" end (* Condition test field; p. 340 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate = fn O => NO | NO => O | B => NB | NB => B | AE => NAE | NAE => AE | C => NC | NC => C | E => NE | NE => E | Z => NZ | NZ => Z | BE => NBE | NBE => BE | A => NA | NA => A | S => NS | NS => S | P => NP | NP => P | PE => PO | PO => PE | L => NL | NL => L | LE => NLE | NLE => LE | G => NG | NG => G | GE => NGE | NGE => GE val condition_reverse = fn B => A | NB => NA | AE => BE | NAE => NBE | E => E | NE => NE | BE => AE | NBE => NAE | A => B | NA => NB | L => G | NL => NG | LE => GE | NLE => NGE | G => L | NG => NL | GE => LE | NGE => NLE | c => c local open Layout in val rec condition_layout = fn O => str "o" | B => str "b" | AE => str "ae" | C => str "c" | E => str "e" | Z => str "z" | BE => str "be" | A => str "a" | S => str "s" | P => str "p" | PE => str "pe" | PO => str "po" | L => str "l" | LE => str "le" | G => str "g" | GE => str "ge" | c => seq [str "n", condition_layout (condition_negate c)] end val condition_toString = Layout.toString o condition_layout (* Scalar SSE binary arithmetic instructions. *) datatype sse_binas = SSE_ADDS (* addition; p. 7,10 *) | SSE_SUBS (* subtraction; p. 371,374 *) | SSE_MULS (* multiplication; p. 201,204 *) | SSE_DIVS (* division; p. 97,100 *) | SSE_MAXS (* maximum; p. 128, 130 *) | SSE_MINS (* minimum; p. 132, 134 *) val sse_binas_layout = let open Layout in fn SSE_ADDS => str "adds" | SSE_SUBS => str "subs" | SSE_MULS => str "muls" | SSE_DIVS => str "divs" | SSE_MAXS => str "maxs" | SSE_MINS => str "mins" end (* Scalar SSE unary arithmetic instructions. *) datatype sse_unas = SSE_SQRTS (* square root; p. 360,362 *) val sse_unas_layout = let open Layout in fn SSE_SQRTS => str "sqrts" end (* Packed SSE binary logical instructions (used as scalar). *) datatype sse_binlp = SSE_ANDNP (* and-not; p. 17,19 *) | SSE_ANDP (* and; p. 21,23 *) | SSE_ORP (* or; p. 206,208 *) | SSE_XORP (* xor; p. 391,393 *) val sse_binlp_layout = let open Layout in fn SSE_ANDNP => str "andnp" | SSE_ANDP => str "andp" | SSE_ORP => str "orp" | SSE_XORP => str "xorp" end (* amd64 Instructions. * src operands are not changed by the instruction. * dst operands are changed by the instruction. *) datatype t (* No operation *) = NOP (* Halt *) | HLT (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) | BinAL of {oper: binal, src: Operand.t, dst: Operand.t, size: Size.t} (* Psuedo integer multiplication and division. *) | pMD of {oper: md, src: Operand.t, dst: Operand.t, size: Size.t} (* Integer multiplication and division. *) | MD of {oper: md, src: Operand.t, size: Size.t} (* Integer signed/unsiged multiplication (two operand form); p. 335 *) | IMUL2 of {src: Operand.t, dst: Operand.t, size: Size.t} (* Integer unary arithmetic/logic instructions. *) | UnAL of {oper: unal, dst: Operand.t, size: Size.t} (* Integer shift/rotate arithmetic/logic instructions. *) | SRAL of {oper: sral, count: Operand.t, dst: Operand.t, size: Size.t} (* Arithmetic compare. *) | CMP of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Logical compare. *) | TEST of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Set byte on condition. *) | SETcc of {condition: condition, dst: Operand.t, size: Size.t} (* Jump. *) | JMP of {target: Operand.t, absolute: bool} (* Jump if condition is met. *) | Jcc of {condition: condition, target: Operand.t} (* Call procedure. *) | CALL of {target: Operand.t, absolute: bool} (* Return from procedure. *) | RET of {src: Operand.t option} (* Move. *) | MOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Conditional move. *) | CMOVcc of {condition: condition, src: Operand.t, dst: Operand.t, size: Size.t} (* Exchange register/memory with register. *) | XCHG of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo-push a value onto a stack. *) | pPUSH of {src: Operand.t, base: Operand.t, size: Size.t} (* Pseudo-pop a value from a stack. *) | pPOP of {dst: Operand.t, base: Operand.t, size: Size.t} (* Push a value onto the stack. *) | PUSH of {src: Operand.t, size: Size.t} (* Pop a value from the stack. *) | POP of {dst: Operand.t, size: Size.t} (* Convert X to 2X with sign extension. *) | CX of {size: Size.t} (* Move with extention. *) | MOVX of {oper: movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Move with contraction. *) | XVOM of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Load effective address. *) | LEA of {src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE binary arithmetic instructions. *) | SSE_BinAS of {oper: sse_binas, src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE unary arithmetic instructions. *) | SSE_UnAS of {oper: sse_unas, src: Operand.t, dst: Operand.t, size: Size.t} (* Packed SSE binary logical instructions (used as scalar). *) | SSE_BinLP of {oper: sse_binlp, src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE move instruction. *) | SSE_MOVS of {src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE compare instruction. *) | SSE_COMIS of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Scalar SSE unordered compare instruction. *) | SSE_UCOMIS of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Scalar SSE floating-point/floating-point convert instruction. *) | SSE_CVTSFP2SFP of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Scalar SSE floating-point/signed-integer convert instruction. *) | SSE_CVTSFP2SI of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} | SSE_CVTSI2SFP of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Scalar SSE move data instruction. *) | SSE_MOVD of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} val layout = let open Layout fun bin (oper, size, oper1, oper2) = seq [oper, size, str " ", oper1, str ",", oper2] fun un (oper, size, oper1) = seq [oper, size, str " ", oper1] in fn NOP => str "nop" | HLT => str "hlt" | BinAL {oper, src, dst, size} => bin (binal_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | pMD {oper, src, dst, size} => bin (md_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | MD {oper, src, size} => let val s = un (md_layout oper, Size.layout size, Operand.layout src) in case size of Size.BYTE => seq [str "movb %dl,%ah", str ";", s, str ";", str "movb %ah,%dl"] | _ => s end | IMUL2 {src, dst, size} => bin (str "imul", Size.layout size, Operand.layout src, Operand.layout dst) | UnAL {oper, dst, size} => un (unal_layout oper, Size.layout size, Operand.layout dst) | SRAL {oper, count, dst, size} => bin (sral_layout oper, Size.layout size, Operand.layout count, Operand.layout dst) | CMP {src1, src2, size} => bin (str "cmp", Size.layout size, Operand.layout src2, Operand.layout src1) | TEST {src1, src2, size} => bin (str "test", Size.layout size, Operand.layout src2, Operand.layout src1) | SETcc {condition, dst, ...} => seq [str "set", condition_layout condition, str " ", Operand.layout dst] | JMP {target, absolute} => seq [str "jmp ", if absolute then str "*" else empty, Operand.layout target] | Jcc {condition, target} => seq [str "j", condition_layout condition, str " ", Operand.layout target] | CALL {target, absolute} => seq [str "call ", if absolute then str "*" else empty, Operand.layout target] | RET {src} => seq [str "ret", case src of NONE => empty | SOME src => seq [str " ", Operand.layout src]] | MOV {src, dst, size} => bin (str "mov", Size.layout size, Operand.layout src, Operand.layout dst) | CMOVcc {condition, src, dst, size} => seq [str "cmov", condition_layout condition, Size.layout size, str " ", Operand.layout src, str ",", Operand.layout dst] | XCHG {src, dst, size} => bin (str "xchg", Size.layout size, Operand.layout src, Operand.layout dst) | pPUSH {src, base, size} => seq [str "ppush", Size.layout size, str " [", Operand.layout base, str "] ", Operand.layout src] | pPOP {dst, base, size} => seq [str "ppop", Size.layout size, str " [", Operand.layout base, str " ]", Operand.layout dst] | PUSH {src, size} => seq [str "push", Size.layout size, str " ", Operand.layout src] | POP {dst, size} => seq [str "pop", Size.layout size, str " ", Operand.layout dst] | CX {size} => (case size of Size.BYTE => str "cbtw ; movb %ah,%dl" | Size.WORD => str "cwtd" | Size.LONG => str "cltd" | Size.QUAD => str "cqto" | _ => Error.bug "amd64.Instruction.layout: CX,unsupported conversion") | MOVX {oper, src, srcsize, dst, dstsize} => let val (oper, suffix, src, dst) = case (oper, src, srcsize, dst, dstsize) of (MOVZX, _, Size.LONG, Operand.Register (Register.T {reg, ...}), Size.QUAD) => (str "mov", str "l", src, Operand.Register (Register.T {reg = reg, part = Register.E})) | _ => (movx_layout oper, seq [Size.layout srcsize, Size.layout dstsize], src, dst) in bin (oper, suffix, Operand.layout src, Operand.layout dst) end | XVOM {src, srcsize, dst, dstsize} => bin (str "xvom", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | LEA {src, dst, size} => bin (str "lea", Size.layout size, Operand.layout src, Operand.layout dst) | SSE_BinAS {oper, src, dst, size} => bin (sse_binas_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | SSE_UnAS {oper, src, dst, size} => bin (sse_unas_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | SSE_BinLP {oper, src, dst, size} => bin (sse_binlp_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | SSE_MOVS {src, dst, size} => bin (str "movs", Size.layout size, Operand.layout src, Operand.layout dst) | SSE_COMIS {src1, src2, size} => bin (str "comis", Size.layout size, Operand.layout src1, Operand.layout src2) | SSE_UCOMIS {src1, src2, size} => bin (str "ucomis", Size.layout size, Operand.layout src1, Operand.layout src2) | SSE_CVTSFP2SFP {src, srcsize, dst, dstsize} => bin (str "cvt", seq [str "s", Size.layout srcsize, str "2", str "s", Size.layout dstsize], Operand.layout src, Operand.layout dst) | SSE_CVTSFP2SI {src, srcsize, dst, dstsize, ...} => bin (str "cvt", seq [str "s", Size.layout srcsize, str "2", str "si", Size.layout dstsize], Operand.layout src, Operand.layout dst) | SSE_CVTSI2SFP {src, srcsize, dst, dstsize, ...} => bin (str "cvt", seq [str "si", str "2", str "s", Size.layout dstsize, Size.layout srcsize], Operand.layout src, Operand.layout dst) | SSE_MOVD {src, dst, ...} => bin (str "movd", empty, Operand.layout src, Operand.layout dst) end val toString = Layout.toString o layout val uses_defs_kills = fn NOP => {uses = [], defs = [], kills = []} | HLT => {uses = [], defs = [], kills = []} | BinAL {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | pMD {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | MD {oper, src, size} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.uses_defs: MD, size" in if oper = IMUL orelse oper = MUL then {uses = [src, Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} else {uses = [src, Operand.register hi, Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} end | IMUL2 {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | UnAL {dst, ...} => {uses = [dst], defs = [dst], kills = []} | SRAL {count, dst, size, ...} => if isSome (Operand.deMemloc count) then let val reg = case size of Size.BYTE => Register.T {reg = Register.RCX, part = Register.L} | Size.WORD => Register.T {reg = Register.RCX, part = Register.X} | Size.LONG => Register.T {reg = Register.RCX, part = Register.E} | Size.QUAD => Register.T {reg = Register.RCX, part = Register.R} | _ => Error.bug "amd64.Instruction.uses_defs: SRAL, size" in {uses = [count, dst, Operand.register reg], defs = [dst], kills = []} end else {uses = [count, dst], defs = [dst], kills = []} | CMP {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | TEST {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | SETcc {dst, ...} => {uses = [], defs = [dst], kills = []} | JMP {target, ...} => {uses = [target], defs = [], kills = []} | Jcc {target, ...} => {uses = [target], defs = [], kills = []} | CALL {target, ...} => {uses = [target], defs = [], kills = []} | RET {src} => {uses = case src of NONE => [] | SOME src => [src], defs = [], kills = []} | MOV {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | CMOVcc {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | XCHG {src, dst, ...} => {uses = [src,dst], defs = [src,dst], kills = []} | pPUSH {src, base, size, ...} => {uses = [src,base], defs = base:: (case base of Operand.MemLoc base => [Operand.MemLoc (MemLoc.simple {base = base, index = Immediate.zero, size = size, scale = Scale.One, class = MemLoc.Class.CStack})] | _ => []), kills = []} | pPOP {dst, base, size, ...} => {uses = base:: (case base of Operand.MemLoc base => [Operand.MemLoc (MemLoc.simple {base = base, index = Immediate.zero, size = size, scale = Scale.One, class = MemLoc.Class.CStack})] | _ => []), defs = [dst,base], kills = []} | PUSH {src, ...} => {uses = [src, Operand.register Register.rsp], defs = [Operand.register Register.rsp, Operand.address (Address.T {disp = NONE, base = SOME Register.rsp, index = NONE, scale = NONE})], kills = []} | POP {dst, ...} => {uses = [Operand.register Register.rsp, Operand.address (Address.T {disp = NONE, base = SOME Register.rsp, index = NONE, scale = NONE})], defs = [dst, Operand.register Register.rsp], kills = []} | CX {size} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.uses_defs: CX, size" in {uses = [Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} end | MOVX {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | XVOM {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | LEA {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_BinAS {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | SSE_UnAS {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_BinLP {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | SSE_MOVS {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_COMIS {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | SSE_UCOMIS {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | SSE_CVTSFP2SFP {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_CVTSFP2SI {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_CVTSI2SFP {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | SSE_MOVD {src, dst, ...} => {uses = [src], defs = [dst], kills = []} val hints = fn pMD {dst, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.hints: MD, size" val temp = MemLoc.temp {size = size} in [(temp, hi), (case Operand.deMemloc dst of SOME memloc => (memloc, lo) | NONE => (temp, lo))] end | MD {src, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.hints: MD, size" val temp = MemLoc.temp {size = size} in [(temp, hi), (case Operand.deMemloc src of SOME memloc => (memloc, lo) | NONE => (temp, lo))] end | SRAL {count, size, ...} => (case Operand.deMemloc count of SOME memloc => let val reg = case size of Size.BYTE => Register.T {reg = Register.RCX, part = Register.L} | Size.WORD => Register.T {reg = Register.RCX, part = Register.X} | Size.LONG => Register.T {reg = Register.RCX, part = Register.E} | Size.QUAD => Register.T {reg = Register.RCX, part = Register.R} | _ => Error.bug "amd64.Instruction.hints: SRAL, size" in [(memloc, reg)] end | NONE => []) | pPUSH {base, ...} => (case Operand.deMemloc base of SOME base => [(base,Register.rsp)] | NONE => []) | pPOP {base, ...} => (case Operand.deMemloc base of SOME base => [(base,Register.rsp)] | NONE => []) | PUSH {...} => let val temp = MemLoc.temp {size = Size.QUAD} in [(temp,Register.rsp)] end | POP {...} => let val temp = MemLoc.temp {size = Size.QUAD} in [(temp,Register.rsp)] end | _ => [] val srcs_dsts = fn NOP => {srcs = NONE, dsts = NONE} | HLT => {srcs = NONE, dsts = NONE} | BinAL {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | pMD {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | MD {oper, src, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.srcs_dsts: MD, size" in if oper = IMUL orelse oper = MUL then {srcs = SOME [src, Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} else {srcs = SOME [src, Operand.register hi, Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} end | IMUL2 {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | UnAL {dst, ...} => {srcs = SOME [dst], dsts = SOME [dst]} | SRAL {count, dst, size, ...} => if isSome (Operand.deMemloc count) then let val reg = case size of Size.BYTE => Register.T {reg = Register.RCX, part = Register.L} | Size.WORD => Register.T {reg = Register.RCX, part = Register.X} | Size.LONG => Register.T {reg = Register.RCX, part = Register.E} | Size.QUAD => Register.T {reg = Register.RCX, part = Register.R} | _ => Error.bug "amd64.Instruction.srcs_dsts: SRAL, size" in {srcs = SOME [count, dst, Operand.register reg], dsts = SOME [dst]} end else {srcs = SOME [count, dst], dsts = SOME [dst]} | CMP {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | TEST {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | SETcc {dst, ...} => {srcs = NONE, dsts = SOME [dst]} | JMP {target, ...} => {srcs = SOME [target], dsts = NONE} | Jcc {target, ...} => {srcs = SOME [target], dsts = NONE} | CALL {target, ...} => {srcs = SOME [target], dsts = NONE} | RET {src} => {srcs = case src of NONE => NONE | SOME src => SOME [src], dsts = NONE} | MOV {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | CMOVcc {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | XCHG {src, dst, ...} => {srcs = SOME [src,dst], dsts = SOME [src,dst]} | pPUSH {src, base, ...} => {srcs = SOME [src,base], dsts = SOME [base]} | pPOP {dst, base, ...} => {srcs = SOME [base], dsts = SOME [dst,base]} | PUSH {src, ...} => {srcs = SOME [src, Operand.register Register.rsp], dsts = SOME [Operand.register Register.rsp]} | POP {dst, ...} => {srcs = SOME [Operand.register Register.rsp], dsts = SOME [dst, Operand.register Register.rsp]} | CX {size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.RDX, part = Register.L}, Register.T {reg = Register.RAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.RDX, part = Register.X}, Register.T {reg = Register.RAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.RDX, part = Register.E}, Register.T {reg = Register.RAX, part = Register.E}) | Size.QUAD => (Register.T {reg = Register.RDX, part = Register.R}, Register.T {reg = Register.RAX, part = Register.R}) | _ => Error.bug "amd64.Instruction.srcs_dsts: CX, size" in {srcs = SOME [Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} end | MOVX {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | XVOM {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | LEA {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_BinAS {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | SSE_UnAS {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_BinLP {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | SSE_MOVS {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_COMIS {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | SSE_UCOMIS {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | SSE_CVTSFP2SFP {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_CVTSFP2SI {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_CVTSI2SFP {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | SSE_MOVD {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} fun replace replacer = fn NOP => NOP | HLT => HLT | BinAL {oper, src, dst, size} => BinAL {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | pMD {oper, src, dst, size} => pMD {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | MD {oper, src, size} => MD {oper = oper, src = replacer {use = true, def = false} src, size = size} | IMUL2 {src, dst, size} => IMUL2 {src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | UnAL {oper, dst, size} => UnAL {oper = oper, dst = replacer {use = true, def = true} dst, size = size} | SRAL {oper, count, dst, size} => SRAL {oper = oper, count = replacer {use = true, def = false} count, dst = replacer {use = true, def = true} dst, size = size} | CMP {src1, src2, size} => CMP {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | TEST {src1, src2, size} => TEST {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | SETcc {condition, dst, size} => SETcc {condition = condition, dst = replacer {use = false, def = true} dst, size = size} | JMP {target, absolute} => JMP {target = replacer {use = true, def = false} target, absolute = absolute} | Jcc {condition, target} => Jcc {condition = condition, target = replacer {use = true, def = false} target} | CALL {target, absolute} => CALL {target = replacer {use = true, def = false} target, absolute = absolute} | RET {src} => (case src of NONE => RET {src = NONE} | SOME src => RET {src = SOME (replacer {use = true, def = false} src)}) | MOV {src, dst, size} => MOV {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | CMOVcc {condition, src, dst, size} => CMOVcc {condition = condition, src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | XCHG {src, dst, size} => XCHG {src = replacer {use = true, def = true} src, dst = replacer {use = true, def = true} dst, size = size} | pPUSH {src, base, size} => pPUSH {src = replacer {use = true, def = false} src, base = replacer {use = true, def = true} base, size = size} | pPOP {dst, base, size} => pPOP {dst = replacer {use = false, def = true} dst, base = replacer {use = true, def = true} base, size = size} | PUSH {src, size} => PUSH {src = replacer {use = true, def = false} src, size = size} | POP {dst, size} => POP {dst = replacer {use = false, def = true} dst, size = size} | CX {size} => CX {size = size} | MOVX {oper, src, srcsize, dst, dstsize} => MOVX {oper = oper, src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | XVOM {src, srcsize, dst, dstsize} => XVOM {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | LEA {src, dst, size} => LEA {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | SSE_BinAS {oper, src, dst, size} => SSE_BinAS {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | SSE_UnAS {oper, src, dst, size} => SSE_UnAS {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | SSE_BinLP {oper, src, dst, size} => SSE_BinLP {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | SSE_MOVS {src, dst, size} => SSE_MOVS {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | SSE_COMIS {src1, src2, size} => SSE_COMIS {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | SSE_UCOMIS {src1, src2, size} => SSE_UCOMIS {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | SSE_CVTSFP2SFP {src, srcsize, dst, dstsize} => SSE_CVTSFP2SFP {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | SSE_CVTSFP2SI {src, srcsize, dst, dstsize} => SSE_CVTSFP2SI {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | SSE_CVTSI2SFP {src, srcsize, dst, dstsize} => SSE_CVTSI2SFP {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | SSE_MOVD {src, srcsize, dst, dstsize} => SSE_MOVD {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} val nop = fn () => NOP val hlt = fn () => HLT val binal = BinAL val pmd = pMD val md = MD val imul2 = IMUL2 val unal = UnAL val sral = SRAL val cmp = CMP val test = TEST val setcc = SETcc val jmp = JMP val jcc = Jcc val call = CALL val ret = RET val mov = MOV val cmovcc = CMOVcc val xchg = XCHG val ppush = pPUSH val ppop = pPOP val push = PUSH val pop = POP val cx = CX val movx = MOVX val xvom = XVOM val lea = LEA val sse_binas = SSE_BinAS val sse_unas = SSE_UnAS val sse_binlp = SSE_BinLP val sse_movs = SSE_MOVS val sse_comis = SSE_COMIS val sse_ucomis = SSE_UCOMIS val sse_cvtsfp2sfp = SSE_CVTSFP2SFP val sse_cvtsfp2si = SSE_CVTSFP2SI val sse_cvtsi2sfp = SSE_CVTSI2SFP val sse_movd = SSE_MOVD end structure Directive = struct structure Id = struct val num : int ref = ref 0 datatype t = T of {num : int, plist: PropertyList.t} fun new () = let val id = T {num = !num, plist = PropertyList.new ()} val _ = Int.inc num in id end val plist = fn T {plist, ...} => plist val layout = let open Layout in fn T {num, ...} => seq [str "RegAlloc", Int.layout num] end val toString = Layout.toString o layout end datatype t (* Transfers *) (* Assert that a memloc is in a register with properties; * used at top of basic blocks to establish passing convention. *) = Assume of {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} | XmmAssume of {assumes: {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} (* Ensure that memloc is in the register, possibly reserved; * used at bot of basic blocks to establish passing convention, * also used before C calls to set-up %rsp. *) | Cache of {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} | XmmCache of {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list} (* Reset the register allocation; * used at bot of basic blocks that fall-thru * to a block with multiple incoming paths of control. *) | Reset (* Ensure that memlocs are commited to memory; * used at bot of basic blocks to establish passing conventions *) | Force of {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} (* C calls *) (* Prepare for a C call; i.e., clear all caller save registers; * used before C calls. *) | CCall (* Assert the return value; * used after C calls. *) | Return of {returns: {src: Operand.t, dst: MemLoc.t} list} (* Misc. *) (* Assert that the register is not free for the allocator; * used ??? *) | Reserve of {registers: Register.t list} | XmmReserve of {registers: XmmRegister.t list} (* Assert that the register is free for the allocator; * used to free registers at fall-thru; * also used after C calls to free %rsp. *) | Unreserve of {registers : Register.t list} | XmmUnreserve of {registers : XmmRegister.t list} (* Save the register allocation in id and * assert that live are used at this point; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | SaveRegAlloc of {live: MemLocSet.t, id: Id.t} (* Restore the register allocation from id and * remove anything tracked that is not live; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | RestoreRegAlloc of {live: MemLocSet.t, id: Id.t} val toString = fn Assume {assumes} => concat["Assume: ", "assumes: ", List.fold (assumes, "", fn ({register, memloc, sync, reserve, ...}, s) => concat[MemLoc.toString memloc, " -> ", Register.toString register, if reserve then " (reserved)" else "", if sync then " (sync)" else "", " ", s])] | XmmAssume {assumes} => concat["XmmAssume: ", "assumes: ", List.fold (assumes, "", fn ({register, memloc, sync, reserve, ...}, s) => concat[MemLoc.toString memloc, " -> ", XmmRegister.toString register, if reserve then " (reserved)" else "", if sync then " (sync)" else "", " ", s])] | Cache {caches} => concat["Cache: ", "caches: ", List.fold (caches, "", fn ({register, memloc, reserve}, s) => concat[MemLoc.toString memloc, " -> ", Register.toString register, if reserve then " (reserved)" else "", " ", s])] | XmmCache {caches} => concat["XmmCache: ", "caches: ", List.fold (caches, "", fn ({register, memloc, reserve}, s) => concat[MemLoc.toString memloc, " -> ", XmmRegister.toString register, if reserve then " (reserved)" else "", " ", s])] | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => concat["Force: ", "commit_memlocs: ", MemLocSet.fold (commit_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "commit_classes: ", ClassSet.fold (commit_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s]), "remove_memlocs: ", MemLocSet.fold (remove_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "remove_classes: ", ClassSet.fold (remove_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s]), "dead_memlocs: ", MemLocSet.fold (dead_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "dead_classes: ", ClassSet.fold (dead_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s])] | Reset => concat["Reset"] | CCall => concat["CCall"] | Return {returns} => concat["Return: ", List.toString (fn {src,dst} => concat ["(", Operand.toString src, ",", MemLoc.toString dst, ")"]) returns] | Reserve {registers} => concat["Reserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[Register.toString register, " ", s])] | XmmReserve {registers} => concat["XmmReserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[XmmRegister.toString register, " ", s])] | Unreserve {registers} => concat["Unreserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[Register.toString register, " ", s])] | XmmUnreserve {registers} => concat["XmmUnreserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[XmmRegister.toString register, " ", s])] | SaveRegAlloc {live, id} => concat["SaveRegAlloc: ", "live: ", MemLocSet.fold (live, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), Id.toString id] | RestoreRegAlloc {live, id} => concat["RestoreRegAlloc: ", "live: ", MemLocSet.fold (live, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), Id.toString id] val layout = Layout.str o toString val uses_defs_kills = fn Assume {assumes} => List.fold (assumes, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.register register)::defs, kills = []}) | XmmAssume {assumes} => List.fold (assumes, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.xmmregister register)::defs, kills = []}) | Cache {caches} => List.fold (caches, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.register register)::defs, kills = []}) | XmmCache {caches} => List.fold (caches, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.xmmregister register)::defs, kills = []}) | Reset => {uses = [], defs = [], kills = []} | Force {commit_memlocs, remove_memlocs, ...} => {uses = List.map(MemLocSet.toList commit_memlocs, Operand.memloc) @ List.map(MemLocSet.toList remove_memlocs, Operand.memloc), defs = [], kills = []} | CCall => {uses = [], defs = [], kills = []} | Return {returns} => let val uses = List.map(returns, fn {src, ...} => src) val defs = List.map(returns, fn {dst, ...} => Operand.memloc dst) in {uses = uses, defs = defs, kills = []} end | Reserve {...} => {uses = [], defs = [], kills = []} | XmmReserve {...} => {uses = [], defs = [], kills = []} | Unreserve {...} => {uses = [], defs = [], kills = []} | XmmUnreserve {...} => {uses = [], defs = [], kills = []} | SaveRegAlloc {live, ...} => {uses = List.map(MemLocSet.toList live, Operand.memloc), defs = [], kills = []} | RestoreRegAlloc {...} => {uses = [], defs = [], kills = []} val hints = fn Cache {caches} => List.map (caches, fn {register, memloc, ...} => (memloc, register)) | _ => [] fun replace replacer = fn Assume {assumes} => Assume {assumes = List.map (assumes, fn {register, memloc, weight, sync, reserve} => {register = register, memloc = memloc, weight = weight, sync = sync, reserve = reserve})} | XmmAssume {assumes} => XmmAssume {assumes = List.map (assumes, fn {register, memloc, weight, sync, reserve} => {register = register, memloc = memloc, weight = weight, sync = sync, reserve = reserve})} | Cache {caches} => Cache {caches = List.map (caches, fn {register, memloc, reserve} => {register = case replacer {use = false, def = true} (Operand.register register) of Operand.Register register => register | _ => Error.bug "amd64.Directive.replace: Cache, register", memloc = case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Cache, memloc", reserve = reserve})} | XmmCache {caches} => XmmCache {caches = List.map (caches, fn {register, memloc, reserve} => {register = case replacer {use = false, def = true} (Operand.xmmregister register) of Operand.XmmRegister register => register | _ => Error.bug "amd64.Directive.replace: XmmCache, xmmregister", memloc = case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: XmmCache, memloc", reserve = reserve})} | Reset => Reset | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => Force {commit_memlocs = MemLocSet.map (commit_memlocs, fn memloc => case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Force, commit_memlocs"), commit_classes = commit_classes, remove_memlocs = MemLocSet.map (remove_memlocs, fn memloc => case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Force, remove_memlocs"), remove_classes = remove_classes, dead_memlocs = MemLocSet.map (dead_memlocs, fn memloc => case replacer {use = false, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Force, dead_memlocs"), dead_classes = dead_classes} | CCall => CCall | Return {returns} => Return {returns = List.map (returns, fn {src,dst} => {src = src, dst = case replacer {use = true, def = false} (Operand.memloc dst) of Operand.MemLoc memloc => memloc | _ => Error.bug "amd64.Directive.replace: Return, returns"})} | Reserve {registers} => Reserve {registers = registers} | XmmReserve {registers} => XmmReserve {registers = registers} | Unreserve {registers} => Unreserve {registers = registers} | XmmUnreserve {registers} => XmmUnreserve {registers = registers} | SaveRegAlloc {live, id} => SaveRegAlloc {live = live, id = id} | RestoreRegAlloc {live, id} => RestoreRegAlloc {live = live, id = id} val assume = Assume val xmmassume = XmmAssume val cache = Cache val xmmcache = XmmCache val reset = fn () => Reset val force = Force val ccall = fn () => CCall val return = Return val reserve = Reserve val xmmreserve = XmmReserve val unreserve = Unreserve val xmmunreserve = XmmUnreserve val saveregalloc = SaveRegAlloc val restoreregalloc = RestoreRegAlloc end structure PseudoOp = struct datatype t = Data | Text | SymbolStub | Balign of Immediate.t * Immediate.t option * Immediate.t option | P2align of Immediate.t * Immediate.t option * Immediate.t option | Space of Immediate.t * Immediate.t | Byte of Immediate.t list | Word of Immediate.t list | Long of Immediate.t list | Quad of Immediate.t list | String of string list | Global of Label.t | Hidden of Label.t | IndirectSymbol of Label.t | Local of Label.t | Comm of Label.t * Immediate.t * Immediate.t option val layout = let open Layout in fn Data => str ".data" | Text => str ".text" | SymbolStub => str ".section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5" | Balign (i,fill,max) => seq [str ".balign ", Immediate.layout i, case (fill, max) of (NONE, NONE) => empty | (SOME fill, NONE) => seq [str ",", Immediate.layout fill] | (NONE, SOME max) => seq [str ",,", Immediate.layout max] | (SOME fill, SOME max) => seq [str ",", Immediate.layout fill, str ",", Immediate.layout max]] | P2align (i,fill,max) => seq [str ".p2align ", Immediate.layout i, case (fill, max) of (NONE, NONE) => empty | (SOME fill, NONE) => seq [str ",", Immediate.layout fill] | (NONE, SOME max) => seq [str ",,", Immediate.layout max] | (SOME fill, SOME max) => seq [str ",", Immediate.layout fill, str ",", Immediate.layout max]] | Space (i,f) => seq [str ".space ", Immediate.layout i, str ",", Immediate.layout f] | Byte bs => seq [str ".byte ", seq (separate(List.map (bs, Immediate.layout), ","))] | Word ws => seq [str ".word ", seq (separate(List.map (ws, Immediate.layout), ","))] | Long ls => seq [str ".long ", seq (separate(List.map (ls, Immediate.layout), ","))] | Quad ls => seq [str ".quad ", seq (separate(List.map (ls, Immediate.layout), ","))] | String ss => seq [str ".ascii ", seq (separate(List.map (ss, fn s => seq [str "\"", str (String_escapeASM s), str "\""]), ","))] | Global l => seq [str ".globl ", Label.layout l] | Hidden l => (* visibility directive depends on target object file *) let val elf = seq [str ".hidden ", Label.layout l] val macho = seq [str ".private_extern ", Label.layout l] val coff = seq [str "/* ", str ".hidden ", Label.layout l, str " */"] in case !Control.Target.os of MLton.Platform.OS.Cygwin => coff | MLton.Platform.OS.Darwin => macho | MLton.Platform.OS.MinGW => coff | _ => elf end | IndirectSymbol l => seq [str ".indirect_symbol ", Label.layout l] | Local l => seq [str ".local ", Label.layout l] | Comm (l, i, a) => seq [str ".comm ", Label.layout l, str ",", Immediate.layout i, case a of NONE => empty | SOME i => seq [str ",", Immediate.layout i]] end val toString = Layout.toString o layout fun replace replacer = let val replacerLabel = fn label => case Operand.deLabel (replacer {use = true, def = false} (Operand.label label)) of SOME label => label | NONE => Error.bug "amd64.PseudoOp.replace.replacerLabel" val replacerImmediate = fn immediate => case Operand.deImmediate (replacer {use = true, def = false} (Operand.immediate immediate)) of SOME immediate => immediate | NONE => Error.bug "amd64.PseudoOp.replace.replacerImmediate" in fn Data => Data | Text => Text | SymbolStub => SymbolStub | Balign (i,fill,max) => Balign (replacerImmediate i, Option.map(fill, replacerImmediate), Option.map(max, replacerImmediate)) | P2align (i,fill,max) => P2align (replacerImmediate i, Option.map(fill, replacerImmediate), Option.map(max, replacerImmediate)) | Space (i,f) => Space (replacerImmediate i, replacerImmediate f) | Byte bs => Byte (List.map(bs, replacerImmediate)) | Word ws => Word (List.map(ws, replacerImmediate)) | Long ls => Long (List.map(ls, replacerImmediate)) | Quad ls => Quad (List.map(ls, replacerImmediate)) | String ss => String ss | Global l => Global (replacerLabel l) | Hidden l => Hidden (replacerLabel l) | IndirectSymbol l => IndirectSymbol (replacerLabel l) | Local l => Local (replacerLabel l) | Comm (l, i, a) => Comm (replacerLabel l, replacerImmediate i, Option.map(a, replacerImmediate)) end val data = fn () => Data val text = fn () => Text val symbol_stub = fn () => SymbolStub val balign = Balign val p2align = P2align val space = Space val byte = Byte val word = Word val long = Long val quad = Quad val string = String val global = Global val hidden = Hidden val indirect_symbol = IndirectSymbol val locall = Local val comm = Comm end structure Assembly = struct datatype t = Comment of string | Directive of Directive.t | PseudoOp of PseudoOp.t | Label of Label.t | Instruction of Instruction.t val layout = let open Layout in fn Comment s => seq [str "/* ", str s, str " */"] | Directive d => seq [str "# directive: ", Directive.layout d] | PseudoOp p => seq [PseudoOp.layout p] | Label l => seq [Label.layout l, str ":"] | Instruction i => seq [str "\t", Instruction.layout i] end val toString = Layout.toString o layout val uses_defs_kills = fn Comment _ => {uses = [], defs = [], kills = []} | Directive d => Directive.uses_defs_kills d | PseudoOp _ => {uses = [], defs = [], kills = []} | Label _ => {uses = [], defs = [], kills = []} | Instruction i => Instruction.uses_defs_kills i val hints = fn Comment _ => [] | Directive d => Directive.hints d | PseudoOp _ => [] | Label _ => [] | Instruction i => Instruction.hints i fun replace replacer = fn Comment s => Comment s | Directive d => Directive (Directive.replace replacer d) | PseudoOp p => PseudoOp (PseudoOp.replace replacer p) | Label l => Label (case Operand.deLabel (replacer {use = false, def = true} (Operand.label l)) of SOME l => l | NONE => Error.bug "amd64.Assembly.replace, Label") | Instruction i => Instruction (Instruction.replace replacer i) val comment = Comment val isComment = fn Comment _ => true | _ => false val directive = Directive val directive_assume = Directive o Directive.assume val directive_xmmassume = Directive o Directive.xmmassume val directive_cache = Directive o Directive.cache val directive_xmmcache = Directive o Directive.xmmcache val directive_reset = Directive o Directive.reset val directive_force = Directive o Directive.force val directive_ccall = Directive o Directive.ccall val directive_return = Directive o Directive.return val directive_reserve = Directive o Directive.reserve val directive_xmmreserve = Directive o Directive.xmmreserve val directive_unreserve = Directive o Directive.unreserve val directive_xmmunreserve = Directive o Directive.xmmunreserve val directive_saveregalloc = Directive o Directive.saveregalloc val directive_restoreregalloc = Directive o Directive.restoreregalloc val pseudoop = PseudoOp val pseudoop_data = PseudoOp o PseudoOp.data val pseudoop_text = PseudoOp o PseudoOp.text val pseudoop_symbol_stub = PseudoOp o PseudoOp.symbol_stub val pseudoop_balign = PseudoOp o PseudoOp.balign val pseudoop_p2align = PseudoOp o PseudoOp.p2align val pseudoop_space = PseudoOp o PseudoOp.space val pseudoop_byte = PseudoOp o PseudoOp.byte val pseudoop_word = PseudoOp o PseudoOp.word val pseudoop_long = PseudoOp o PseudoOp.long val pseudoop_quad = PseudoOp o PseudoOp.quad val pseudoop_string = PseudoOp o PseudoOp.string val pseudoop_global = PseudoOp o PseudoOp.global val pseudoop_hidden = PseudoOp o PseudoOp.hidden val pseudoop_indirect_symbol = PseudoOp o PseudoOp.indirect_symbol val pseudoop_local = PseudoOp o PseudoOp.locall val pseudoop_comm = PseudoOp o PseudoOp.comm val label = Label val instruction = Instruction val instruction_nop = Instruction o Instruction.nop val instruction_hlt = Instruction o Instruction.hlt val instruction_binal = Instruction o Instruction.binal val instruction_pmd = Instruction o Instruction.pmd val instruction_md = Instruction o Instruction.md val instruction_imul2 = Instruction o Instruction.imul2 val instruction_unal = Instruction o Instruction.unal val instruction_sral = Instruction o Instruction.sral val instruction_cmp = Instruction o Instruction.cmp val instruction_test = Instruction o Instruction.test val instruction_setcc = Instruction o Instruction.setcc val instruction_jmp = Instruction o Instruction.jmp val instruction_jcc = Instruction o Instruction.jcc val instruction_call = Instruction o Instruction.call val instruction_ret = Instruction o Instruction.ret val instruction_mov = Instruction o Instruction.mov val instruction_cmovcc = Instruction o Instruction.cmovcc val instruction_xchg = Instruction o Instruction.xchg val instruction_ppush = Instruction o Instruction.ppush val instruction_ppop = Instruction o Instruction.ppop val instruction_push = Instruction o Instruction.push val instruction_pop = Instruction o Instruction.pop val instruction_cx = Instruction o Instruction.cx val instruction_movx = Instruction o Instruction.movx val instruction_xvom = Instruction o Instruction.xvom val instruction_lea = Instruction o Instruction.lea val instruction_sse_binas = Instruction o Instruction.sse_binas val instruction_sse_unas = Instruction o Instruction.sse_unas val instruction_sse_binlp = Instruction o Instruction.sse_binlp val instruction_sse_movs = Instruction o Instruction.sse_movs val instruction_sse_comis = Instruction o Instruction.sse_comis val instruction_sse_ucomis = Instruction o Instruction.sse_ucomis val instruction_sse_cvtsfp2sfp = Instruction o Instruction.sse_cvtsfp2sfp val instruction_sse_cvtsfp2si = Instruction o Instruction.sse_cvtsfp2si val instruction_sse_cvtsi2sfp = Instruction o Instruction.sse_cvtsi2sfp val instruction_sse_movd = Instruction o Instruction.sse_movd end structure FrameInfo = struct datatype t = T of {size: int, frameLayoutsIndex: int} fun toString (T {size, frameLayoutsIndex}) = concat ["{", "size = ", Int.toString size, ", ", "frameLayoutsIndex = ", Int.toString frameLayoutsIndex, "}"] end structure Entry = struct datatype t = Jump of {label: Label.t} | Func of {label: Label.t, live: MemLocSet.t} | Cont of {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} | Handler of {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} | CReturn of {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} val toString = fn Jump {label} => concat ["Jump::", Label.toString label] | Func {label, live} => concat ["Func::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | Cont {label, live, frameInfo} => concat ["Cont::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] ", FrameInfo.toString frameInfo] | Handler {frameInfo, label, live} => concat ["Handler::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] (", FrameInfo.toString frameInfo, ")"] | CReturn {dsts, frameInfo, func, label} => concat ["CReturn::", Label.toString label, " ", Vector.toString (fn (dst,_) => Operand.toString dst) dsts, " ", (CFunction.Target.toString o CFunction.target) func, " ", case frameInfo of NONE => "" | SOME f => FrameInfo.toString f] val uses_defs_kills = fn CReturn {dsts, func, ...} => let val uses = List.map (Operand.cReturnTemps (CFunction.return func), fn {dst, ...} => Operand.memloc dst) in {uses = uses, defs = Vector.toListMap(dsts, fn (dst, _) => dst), kills = []} end | _ => {uses = [], defs = [], kills = []} val label = fn Jump {label, ...} => label | Func {label, ...} => label | Cont {label, ...} => label | Handler {label, ...} => label | CReturn {label, ...} => label val live = fn Func {live, ...} => live | Cont {live, ...} => live | Handler {live, ...} => live | _ => MemLocSet.empty val jump = Jump val func = Func val isFunc = fn Func _ => true | _ => false val cont = Cont val handler = Handler val creturn = CReturn end structure Transfer = struct structure Cases = struct datatype 'a t = Word of (WordX.t * 'a) list val word = Word fun isEmpty cases = case cases of Word [] => true | _ => false fun isSingle cases = case cases of Word [_] => true | _ => false fun extract(cases,f) = let fun doit [(k,target)] = f (k, target) | doit _ = Error.bug "amd64.Transfer.Cases.extract" in case cases of Word cases => doit cases end fun count(cases, p) = let fun doit [] = (0 : int) | doit ((_,target)::cases) = let val n = doit cases in if p target then 1 + n else n end in case cases of Word cases => doit cases end fun keepAll(cases, p) = let fun doit l = List.keepAll(l, fn (k,target) => p (k,target)) in case cases of Word cases => Word(doit cases) end fun forall(cases, f) = let fun doit l = List.forall(l, fn (k, target) => f (k, target)) in case cases of Word cases => doit cases end fun foreach(cases, f) = let fun doit l = List.foreach(l, fn (k, target) => f (k, target)) in case cases of Word cases => doit cases end fun map(cases, f) = let fun doit l = List.map(l, fn (k,target) => (k, f (k, target))) in case cases of Word cases => Word(doit cases) end fun mapToList(cases, f) = let fun doit l = List.map(l, fn (k,target) => f (k, target)) in case cases of Word cases => doit cases end end datatype t = Goto of {target: Label.t} | Iff of {condition: Instruction.condition, truee: Label.t, falsee: Label.t} | Switch of {test: Operand.t, cases: Label.t Cases.t, default: Label.t} | Tail of {target: Label.t, live: MemLocSet.t} | NonTail of {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} | Return of {live: MemLocSet.t} | Raise of {live: MemLocSet.t} | CCall of {args: (Operand.t * Size.t) list, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, return: Label.t option} val toString = fn Goto {target} => concat ["GOTO ", Label.toString target] | Iff {condition, truee, falsee} => concat["IF ", Instruction.condition_toString condition, " THEN GOTO ", Label.toString truee, " ELSE GOTO ", Label.toString falsee] | Switch {test, cases, default} => (concat["SWITCH ", Operand.toString test]) ^ (concat o Cases.mapToList) (cases, fn (w, target) => concat[" (", WordX.toString w, " -> GOTO ", Label.toString target, ")"]) ^ (concat[" GOTO ", Label.toString default]) | Tail {target, live} => concat ["TAIL ", Label.toString target, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | NonTail {target, live, return, handler, size} => concat ["NONTAIL ", Label.toString target, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] <", Label.toString return, " ", Int.toString size, "> {", case handler of SOME handler => Label.toString handler | NONE => "", "}"] | Return {live} => concat ["RETURN", " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | Raise {live} => concat ["RAISE", " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | CCall {args, func, return, ...} => concat ["CCALL ", (CFunction.Convention.toString o CFunction.convention) func, " ", (CFunction.Target.toString o CFunction.target) func, "(", (concat o List.separate) (List.map(args, fn (oper,_) => Operand.toString oper), ", "), ") <", Option.toString Label.toString return, ">"] val uses_defs_kills = fn Switch {test, ...} => {uses = [test], defs = [], kills = []} | CCall {args, func, ...} => let val defs = List.map (Operand.cReturnTemps (CFunction.return func), fn {dst, ...} => Operand.memloc dst) in {uses = List.map(args, fn (oper,_) => oper), defs = defs, kills = []} end | _ => {uses = [], defs = [], kills = []} val nearTargets = fn Goto {target} => [target] | Iff {truee,falsee,...} => [truee,falsee] | Switch {cases,default,...} => default::(Cases.mapToList (cases, fn (_,target) => target)) | NonTail {return,handler,...} => return::(case handler of NONE => nil | SOME handler => [handler]) | CCall {return, ...} => (case return of NONE => [] | SOME l => [l]) | _ => [] val live = fn Tail {live,...} => live | NonTail {live,...} => live | Return {live,...} => live | Raise {live,...} => live | _ => MemLocSet.empty fun replace replacer = fn Switch {test, cases, default} => Switch {test = replacer {use = true, def = false} test, cases = cases, default = default} | CCall {args, frameInfo, func, return} => CCall {args = List.map(args, fn (oper,size) => (replacer {use = true, def = false} oper, size)), frameInfo = frameInfo, func = func, return = return} | transfer => transfer val goto = Goto val iff = Iff val switch = Switch val tail = Tail val nontail = NonTail val return = Return val raisee = Raise val ccall = CCall end structure ProfileLabel = struct open ProfileLabel fun toAssembly pl = let val label = Label.fromString (toString pl) in [Assembly.pseudoop_global label, Assembly.pseudoop_hidden label, Assembly.label label] end fun toAssemblyOpt pl = case pl of NONE => [] | SOME pl => toAssembly pl end structure Block = struct datatype t' = T' of {entry: Entry.t option, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t option} fun mkBlock' {entry, statements, transfer} = T' {entry = entry, profileLabel = NONE, statements = statements, transfer = transfer} fun mkProfileBlock' {profileLabel} = T' {entry = NONE, profileLabel = SOME profileLabel, statements = [], transfer = NONE} datatype t = T of {entry: Entry.t, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t} fun printBlock (T {entry, profileLabel, statements, transfer, ...}) = (print (Entry.toString entry); print ":\n"; Option.app (profileLabel, fn profileLabel => (print (ProfileLabel.toString profileLabel); print ":\n")); List.foreach (statements, fn asm => (print (Assembly.toString asm); print "\n")); print (Transfer.toString transfer); print "\n") fun printBlock' (T' {entry, profileLabel, statements, transfer, ...}) = (print (if isSome entry then Entry.toString (valOf entry) else "---"); print ":\n"; Option.app (profileLabel, fn profileLabel => (print (ProfileLabel.toString profileLabel); print ":\n")); List.foreach (statements, fn asm => (print (Assembly.toString asm); print "\n")); print (if isSome transfer then Transfer.toString (valOf transfer) else "NONE"); print "\n") val compress': t' list -> t' list = fn l => List.fold (rev l, [], fn (b' as T' {entry, profileLabel, statements, transfer}, ac) => case transfer of SOME _ => b' :: ac | NONE => case ac of [] => Error.bug "amd64.Block.compress': dangling transfer" | b2' :: ac => let val T' {entry = entry2, profileLabel = profileLabel2, statements = statements2, transfer = transfer2} = b2' in case entry2 of SOME _ => Error.bug "amd64.Block.compress': mismatched transfer" | NONE => let val (pl, ss) = case (profileLabel, statements) of (NONE, []) => (profileLabel2, statements2) | _ => (profileLabel, statements @ (ProfileLabel.toAssemblyOpt profileLabel2) @ statements2) in T' {entry = entry, profileLabel = pl, statements = ss, transfer = transfer2} :: ac end end) val compress: t' list -> t list = fn l => List.map (compress' l, fn T' {entry, profileLabel, statements, transfer} => case (entry, transfer) of (SOME e, SOME t) => T {entry = e, profileLabel = profileLabel, statements = statements, transfer = t} | _ => Error.bug "amd64.Block.compress") end structure Chunk = struct datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end mlton-20100608/mlton/codegen/amd64-codegen/amd64.sig0000644000076600000240000012356611404435625020271 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature AMD64_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure ProfileLabel: PROFILE_LABEL structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize end signature AMD64 = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize val tracer : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val tracerTop : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) structure Size : sig datatype class = INT | FLT datatype t = BYTE | WORD | LONG | QUAD | SNGL | DBLE val toString : t -> string val fromBytes : int -> t val toBytes : t -> int val fromCType : CType.t -> t vector val class : t -> class val eq : t * t -> bool val lt : t * t -> bool end structure Register : sig datatype reg = RAX | RBX | RCX | RDX | RDI | RSI | RBP | RSP | R8 | R9 | R10 | R11 | R12 | R13 | R14 | R15 | RIP val allReg : reg list datatype part = R | E | X | L datatype t = T of {reg: reg, part: part} val all : t list val toString : t -> string val size : t -> Size.t val eq : t * t -> bool val valid : t -> bool val coincide : t * t -> bool val coincident' : reg -> t list (* val return : Size.t -> t *) val rax : t val eax : t val al : t val rbx : t val ebx : t val bl : t val rcx : t val ecx : t val cl : t val rdx : t val edx : t val dl : t val rdi : t val rsi : t val rsp : t val rbp : t val r8 : t val r8w : t val r9 : t val r9w : t val r10 : t val r10w : t val r11 : t val r11w : t val r12 : t val r12w : t val r13 : t val r13w : t val r14 : t val r14w : t val r15 : t val r15w : t val rip : t val registers : Size.t -> t list val baseRegisters : t list val indexRegisters : t list val callerSaveRegisters : t list val calleeSaveRegisters : t list val withLowPart : Size.t * Size.t -> t list val lowPartOf : t * Size.t -> t end structure XmmRegister : sig datatype reg = XMM0 | XMM1 | XMM2 | XMM3 | XMM4 | XMM5 | XMM6 | XMM7 | XMM8 | XMM9 | XMM10 | XMM11 | XMM12 | XMM13 | XMM14 | XMM15 val allReg : reg list datatype part = D | S datatype t = T of {reg: reg, part: part} val all : t list val toString : t -> string val size : t -> Size.t val eq : t * t -> bool val valid : t -> bool val coincide : t * t -> bool val coincident' : reg -> t list val coincident : t -> t list (* val return : Size.t -> t *) val xmm0D : t val xmm0S : t val xmm1D : t val xmm1S : t val xmm2D : t val xmm2S : t val xmm3D : t val xmm3S : t val xmm4D : t val xmm4S : t val xmm5D : t val xmm5S : t val xmm6D : t val xmm6S : t val xmm7D : t val xmm7S : t val xmm8D : t val xmm8S : t val xmm9D : t val xmm9S : t val xmm10D : t val xmm10S : t val xmm11D : t val xmm11S : t val xmm12D : t val xmm12S : t val xmm13D : t val xmm13S : t val xmm14D : t val xmm14S : t val xmm15D : t val xmm15S : t val registers : Size.t -> t list val callerSaveRegisters : t list val calleeSaveRegisters : t list end structure Immediate : sig type t datatype u = Word of WordX.t | Label of Label.t | LabelPlusWord of Label.t * WordX.t val word : WordX.t -> t val int' : int * WordSize.t -> t val int : int -> t val zero : t val label : Label.t -> t val labelPlusWord : Label.t * WordX.t -> t val labelPlusInt : Label.t * int -> t val deLabel : t -> Label.t option val destruct : t -> u val clearAll : unit -> unit val eval : t -> WordX.t option val isZero : t -> bool val eq : t * t -> bool end structure Scale : sig datatype t = One | Two | Four | Eight val eq : t * t -> bool val toWordX : t -> WordX.t val toImmediate : t -> Immediate.t val fromBytes : int -> t val fromCType : CType.t -> t end structure Address : sig datatype t = T of {disp: Immediate.t option, base: Register.t option, index: Register.t option, scale: Scale.t option} end structure MemLoc : sig structure Class : sig type t val toString : t -> string val new : {name: string} -> t val Temp : t val StaticTemp : t val CArg : t val CStack : t val Code : t val eq : t * t -> bool val compare : t * t -> order end type t datatype u = U of {immBase: Immediate.t option, memBase: t option, immIndex: Immediate.t option, memIndex: t option, scale: Scale.t, size: Size.t, class: Class.t} val layout : t -> Layout.t val toString : t -> string val imm : {base: Immediate.t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val basic : {base: Immediate.t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val simple : {base: t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val complex : {base: t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val shift : {origin: t, disp: Immediate.t, scale: Scale.t, size: Size.t} -> t val destruct : t -> u val clearAll : unit -> unit val size : t -> Size.t val class : t -> Class.t val eq : t * t -> bool val compare : t * t -> order val utilized : t -> t list val mayAlias : t * t -> bool val mayAliasOrd : t * t -> order option val replace : (t -> t) -> t -> t (* * Static memory locations *) val makeContents : {base: Immediate.t, size: Size.t, class: Class.t} -> t (* CReturn locations *) (* val cReturnTempContent : Size.t -> t val cReturnTempContents : CFunction.CType.t -> t list *) end structure ClassSet : SET sharing type ClassSet.Element.t = MemLoc.Class.t structure MemLocSet : SET sharing type MemLocSet.Element.t = MemLoc.t structure Operand : sig datatype t = Register of Register.t | XmmRegister of XmmRegister.t | Immediate of Immediate.t | Label of Label.t | Address of Address.t | MemLoc of MemLoc.t val layout : t -> Layout.t val toString : t -> string val register : Register.t -> t val deRegister : t -> Register.t option val xmmregister : XmmRegister.t -> t val deXmmregister : t -> XmmRegister.t option val immediate : Immediate.t -> t val immediate_word : WordX.t -> t val immediate_int' : int * WordSize.t -> t val immediate_int : int -> t val immediate_zero : t val immediate_label : Label.t -> t val deImmediate : t -> Immediate.t option val label : Label.t -> t val deLabel : t -> Label.t option val address : Address.t -> t val memloc : MemLoc.t -> t val memloc_label : Label.t -> t val deMemloc : t -> MemLoc.t option val size : t -> Size.t option val eq : t * t -> bool val mayAlias : t * t -> bool val cReturnTemps: RepType.t -> {src: t, dst: MemLoc.t} list end structure Instruction : sig (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 58 *) | ADC (* signed/unsigned addition with carry; p. 56 *) | SUB (* signed/unsigned subtraction; p. 234 *) | SBB (* signed/unsigned subtraction with borrow; p. 216 *) | AND (* logical and; p. 60 *) | OR (* logical or; p. 176 *) | XOR (* logical xor; p. 243 *) (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 114 *) | MUL (* unsigned multiplication; p. 170 *) | IDIV (* signed division; p. 112 *) | DIV (* unsigned division; p. 108 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 117 *) | DEC (* decrement by 1; p. 106 *) | NEG (* two's complement negation; p. 172 *) | NOT (* one's complement negation; p. 175 *) (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 211 *) | SHL (* shift logical left; p. 211 *) | SAR (* shift arithmetic right; p. 214 *) | SHR (* shift logical right; p. 214 *) | ROL (* rotate left; p. 206 *) | RCL (* rotate through carry left; p. 197 *) | ROR (* rotate right; p. 208 *) | RCR (* rotate through carry right; p. 199 *) (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 167 *) | MOVZX (* move with zero extention; p. 169 *) (* Condition test field; p. 340 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate : condition -> condition val condition_reverse : condition -> condition (* Scalar SSE binary arithmetic instructions. *) datatype sse_binas = SSE_ADDS (* addition; p. 7,10 *) | SSE_SUBS (* subtraction; p. 371,374 *) | SSE_MULS (* multiplication; p. 201,204 *) | SSE_DIVS (* division; p. 97,100 *) | SSE_MAXS (* maximum; p. 128, 130 *) | SSE_MINS (* minimum; p. 132, 134 *) (* Scalar SSE unary arithmetic instructions. *) datatype sse_unas = SSE_SQRTS (* square root; p. 360,362 *) (* Packed SSE binary logical instructions (used as scalar). *) datatype sse_binlp = SSE_ANDNP (* and-not; p. 17,19 *) | SSE_ANDP (* and; p. 21,23 *) | SSE_ORP (* or; p. 206,208 *) | SSE_XORP (* xor; p. 391,393 *) (* amd64 Instructions. * src operands are not changed by the instruction. * dst operands are changed by the instruction. *) datatype t (* No operation *) = NOP (* Halt *) | HLT (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) | BinAL of {oper: binal, src: Operand.t, dst: Operand.t, size: Size.t} (* Psuedo integer multiplication and division. *) | pMD of {oper: md, src: Operand.t, dst: Operand.t, size: Size.t} (* Integer multiplication and division. *) | MD of {oper: md, src: Operand.t, size: Size.t} (* Integer signed/unsiged multiplication (two operand form); p. 114 *) | IMUL2 of {src: Operand.t, dst: Operand.t, size: Size.t} (* Integer unary arithmetic/logic instructions. *) | UnAL of {oper: unal, dst: Operand.t, size: Size.t} (* Integer shift/rotate arithmetic/logic instructions. *) | SRAL of {oper: sral, count: Operand.t, dst: Operand.t, size: Size.t} (* Arithmetic compare. *) | CMP of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Logical compare. *) | TEST of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Set byte on condition. *) | SETcc of {condition: condition, dst: Operand.t, size: Size.t} (* Jump; p. 373 *) | JMP of {target: Operand.t, absolute: bool} (* Jump if condition is met. *) | Jcc of {condition: condition, target: Operand.t} (* Call procedure. *) | CALL of {target: Operand.t, absolute: bool} (* Return from procedure. *) | RET of {src: Operand.t option} (* Move. *) | MOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Conditional move. *) | CMOVcc of {condition: condition, src: Operand.t, dst: Operand.t, size: Size.t} (* Exchange register/memory with register. *) | XCHG of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo push a value onto a stack. *) | pPUSH of {src: Operand.t, base: Operand.t, size: Size.t} (* Pseudo pop a value from a stack. *) | pPOP of {dst: Operand.t, base: Operand.t, size: Size.t} (* Push a value onto the stack. *) | PUSH of {src: Operand.t, size: Size.t} (* Pop a value from the stack. *) | POP of {dst: Operand.t, size: Size.t} (* Convert X to 2X with sign extension. *) | CX of {size: Size.t} (* Move with extention. *) | MOVX of {oper: movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Move with contraction. *) | XVOM of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Load effective address. *) | LEA of {src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE binary arithmetic instructions. *) | SSE_BinAS of {oper: sse_binas, src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE unary arithmetic instructions. *) | SSE_UnAS of {oper: sse_unas, src: Operand.t, dst: Operand.t, size: Size.t} (* Packed SSE binary logic instructions (used as scalar). *) | SSE_BinLP of {oper: sse_binlp, src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE move instruction. *) | SSE_MOVS of {src: Operand.t, dst: Operand.t, size: Size.t} (* Scalar SSE compare instruction. *) | SSE_COMIS of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Scalar SSE unordered compare instruction. *) | SSE_UCOMIS of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Scalar SSE floating-point/floating-point convert instruction. *) | SSE_CVTSFP2SFP of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Scalar SSE floating-point/signed-integer convert instruction. *) | SSE_CVTSFP2SI of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} | SSE_CVTSI2SFP of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Scalar SSE move data instruction. *) | SSE_MOVD of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val srcs_dsts : t -> {srcs: Operand.t list option, dsts: Operand.t list option} val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t end structure Directive : sig structure Id : sig type t val new : unit -> t val plist : t -> PropertyList.t end datatype t (* Transfers *) (* Assert that a memloc is in a register with properties; * used at top of basic blocks to establish passing convention. *) = Assume of {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} | XmmAssume of {assumes: {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} (* Ensure that memloc is in the register, possibly reserved; * used at bot of basic blocks to establish passing convention, * also used before C calls to set-up %esp. *) | Cache of {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} | XmmCache of {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list} (* Reset the register allocation; * used at bot of basic blocks that fall-thru * to a block with multiple incoming paths of control. *) | Reset (* Ensure that memlocs are commited to memory; * used at bot of basic blocks to establish passing conventions *) | Force of {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} (* C calls *) (* Prepare for a C call; i.e., clear all caller save registers; * used before C calls. *) | CCall (* Assert the return value; * used after C calls. *) | Return of {returns: {src:Operand.t, dst: MemLoc.t} list} (* Misc. *) (* Assert that the register is not free for the allocator; * used ??? *) | Reserve of {registers: Register.t list} | XmmReserve of {registers: XmmRegister.t list} (* Assert that the register is free for the allocator; * used to free registers at fall-thru; * also used after C calls to free %esp. *) | Unreserve of {registers: Register.t list} | XmmUnreserve of {registers: XmmRegister.t list} (* Save the register allocation in id and * assert that live are used at this point; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | SaveRegAlloc of {live: MemLocSet.t, id: Id.t} (* Restore the register allocation from id and * remove anything tracked that is not live; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | RestoreRegAlloc of {live: MemLocSet.t, id: Id.t} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val assume : {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val xmmassume : {assumes: {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val cache : {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} -> t val xmmcache : {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list} -> t val reset : unit -> t val force : {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} -> t val ccall : unit -> t val return : {returns: {src: Operand.t, dst: MemLoc.t} list} -> t val reserve : {registers: Register.t list} -> t val xmmreserve : {registers: XmmRegister.t list} -> t val unreserve : {registers: Register.t list} -> t val xmmunreserve : {registers: XmmRegister.t list} -> t val saveregalloc : {live: MemLocSet.t, id: Id.t} -> t val restoreregalloc : {live: MemLocSet.t, id: Id.t} -> t end structure PseudoOp : sig datatype t = Data | Text | SymbolStub | Balign of Immediate.t * Immediate.t option * Immediate.t option | P2align of Immediate.t * Immediate.t option * Immediate.t option | Space of Immediate.t * Immediate.t | Byte of Immediate.t list | Word of Immediate.t list | Long of Immediate.t list | Quad of Immediate.t list | String of string list | Global of Label.t | Hidden of Label.t | IndirectSymbol of Label.t | Local of Label.t | Comm of Label.t * Immediate.t * Immediate.t option val toString : t -> string val data : unit -> t val text : unit -> t val symbol_stub : unit -> t val balign : Immediate.t * Immediate.t option * Immediate.t option -> t val p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val space : Immediate.t * Immediate.t -> t val byte : Immediate.t list -> t val word : Immediate.t list -> t val long : Immediate.t list -> t val quad : Immediate.t list -> t val string : string list -> t val global : Label.t -> t val hidden : Label.t -> t val indirect_symbol : Label.t -> t val locall : Label.t -> t val comm : Label.t * Immediate.t * Immediate.t option -> t end structure Assembly : sig datatype t = Comment of string | Directive of Directive.t | PseudoOp of PseudoOp.t | Label of Label.t | Instruction of Instruction.t val layout : t -> Layout.t val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val comment : string -> t val isComment : t -> bool val directive : Directive.t -> t val directive_assume : {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val directive_xmmassume : {assumes: {register: XmmRegister.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val directive_cache : {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} -> t val directive_xmmcache : {caches: {register: XmmRegister.t, memloc: MemLoc.t, reserve: bool} list} -> t val directive_reset : unit -> t val directive_force : {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} -> t val directive_ccall : unit -> t val directive_return : {returns: {src: Operand.t, dst: MemLoc.t} list} -> t val directive_reserve : {registers: Register.t list} -> t val directive_xmmreserve : {registers: XmmRegister.t list} -> t val directive_unreserve : {registers: Register.t list} -> t val directive_xmmunreserve : {registers: XmmRegister.t list} -> t val directive_saveregalloc : {live: MemLocSet.t, id: Directive.Id.t} -> t val directive_restoreregalloc : {live: MemLocSet.t, id: Directive.Id.t} -> t val pseudoop : PseudoOp.t -> t val pseudoop_data : unit -> t val pseudoop_text : unit -> t val pseudoop_symbol_stub : unit -> t val pseudoop_balign : Immediate.t * Immediate.t option * Immediate.t option ->t val pseudoop_p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val pseudoop_space : Immediate.t * Immediate.t -> t val pseudoop_byte : Immediate.t list -> t val pseudoop_word : Immediate.t list -> t val pseudoop_long : Immediate.t list -> t val pseudoop_quad : Immediate.t list -> t val pseudoop_string : string list -> t val pseudoop_global : Label.t -> t val pseudoop_hidden : Label.t -> t val pseudoop_indirect_symbol : Label.t -> t val pseudoop_local : Label.t -> t val pseudoop_comm : Label.t * Immediate.t * Immediate.t option -> t val label : Label.t -> t val instruction : Instruction.t -> t val instruction_nop : unit -> t val instruction_hlt : unit -> t val instruction_binal : {oper: Instruction.binal, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pmd : {oper: Instruction.md, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_md : {oper: Instruction.md, src: Operand.t, size: Size.t} -> t val instruction_imul2 : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_unal : {oper: Instruction.unal, dst: Operand.t, size: Size.t} -> t val instruction_sral : {oper: Instruction.sral, count: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmp : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_test : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_setcc : {condition: Instruction.condition, dst: Operand.t, size: Size.t} -> t val instruction_jmp : {target: Operand.t, absolute: bool} -> t val instruction_jcc : {condition: Instruction.condition, target: Operand.t} -> t val instruction_call : {target: Operand.t, absolute: bool} -> t val instruction_ret : {src: Operand.t option} -> t val instruction_mov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmovcc : {condition: Instruction.condition, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_xchg : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_ppush : {src: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_ppop : {dst: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_push : {src: Operand.t, size: Size.t} -> t val instruction_pop : {dst: Operand.t, size: Size.t} -> t val instruction_cx : {size: Size.t} -> t val instruction_movx : {oper: Instruction.movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_xvom : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_lea : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_binas : {oper: Instruction.sse_binas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_unas : {oper: Instruction.sse_unas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_binlp : {oper: Instruction.sse_binlp, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_movs : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_sse_comis : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_sse_ucomis : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_sse_cvtsfp2sfp : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_cvtsfp2si : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_cvtsi2sfp : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_sse_movd : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t end structure FrameInfo: sig datatype t = T of {size: int, frameLayoutsIndex: int} end structure Entry: sig datatype t = Jump of {label: Label.t} | Func of {label: Label.t, live: MemLocSet.t} | Cont of {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} | Handler of {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} | CReturn of {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} val cont : {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} -> t val creturn: {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} -> t val func : {label: Label.t, live: MemLocSet.t} -> t val handler : {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} -> t val isFunc : t -> bool val jump : {label: Label.t} -> t val label : t -> Label.t val live : t -> MemLocSet.t val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} end structure Transfer : sig structure Cases : sig datatype 'a t = Word of (WordX.t * 'a) list val word : (WordX.t * 'a) list -> 'a t val isEmpty : 'a t -> bool val isSingle : 'a t -> bool val extract : 'a t * (WordX.t * 'a -> 'b) -> 'b val count : 'a t * ('a -> bool) -> int val keepAll : 'a t * (WordX.t * 'a -> bool) -> 'a t val forall : 'a t * (WordX.t * 'a -> bool) -> bool val foreach : 'a t * (WordX.t * 'a -> unit) -> unit val map : 'a t * (WordX.t * 'a -> 'b) -> 'b t val mapToList : 'a t * (WordX.t * 'a -> 'b) -> 'b list end datatype t = Goto of {target: Label.t} | Iff of {condition: Instruction.condition, truee: Label.t, falsee: Label.t} | Switch of {test: Operand.t, cases: Label.t Cases.t, default: Label.t} | Tail of {target: Label.t, live: MemLocSet.t} | NonTail of {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} | Return of {live: MemLocSet.t} | Raise of {live: MemLocSet.t} | CCall of {args: (Operand.t * Size.t) list, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, return: Label.t option} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val nearTargets : t -> Label.t list val live : t -> MemLocSet.t val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val goto : {target: Label.t} -> t val iff : {condition: Instruction.condition, truee: Label.t, falsee: Label.t} -> t val switch : {test: Operand.t, cases: Label.t Cases.t, default: Label.t} -> t val tail : {target: Label.t, live: MemLocSet.t} -> t val nontail : {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} -> t val return : {live: MemLocSet.t} -> t val raisee : {live: MemLocSet.t} -> t val ccall: {args: (Operand.t * Size.t) list, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, return: Label.t option} -> t end structure ProfileLabel : sig include PROFILE_LABEL val toAssembly : t -> Assembly.t list val toAssemblyOpt : t option -> Assembly.t list end structure Block : sig datatype t' = T' of {entry: Entry.t option, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t option} val mkBlock': {entry: Entry.t option, statements: Assembly.t list, transfer: Transfer.t option} -> t' val mkProfileBlock': {profileLabel: ProfileLabel.t} -> t' val printBlock' : t' -> unit datatype t = T of {entry: Entry.t, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t} val printBlock : t -> unit val compress : t' list -> t list end structure Chunk : sig datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end mlton-20100608/mlton/codegen/amd64-codegen/peephole.fun0000644000076600000240000003516011404435625021155 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Peephole(T : PEEPHOLE_TYPES): PEEPHOLE = struct open T datatype statement_border = Empty | EmptyOrNonEmpty type statement_element = (int * int option) * (statement_type -> bool) type transfer_element = transfer_type -> bool val One : (statement_type -> bool) -> statement_element = fn p => ((1, SOME 1), p) val All : (statement_type -> bool) -> statement_element = fn p => ((0, NONE), p) type template = {start: statement_border, statements: statement_element list, finish: statement_border, transfer: transfer_element} type match = {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, statements: statement_type list list, finish: statement_type list, transfer: transfer_type} type rewriter = match -> block option type callback = bool -> unit type optimization = {template: template, rewriter: rewriter, callback: callback} datatype match_state = Start of {block: block} | Continue of {remaining: optimization list, match: match} | Done of {block: block} type find_state = {remaining: optimization list, state: {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, finish: statement_type list, transfer: transfer_type}} fun split (l, p) = case l of [] => ([],[]) | l as h::t => if p h then let val (tt,ff) = split (t, p) in (h::tt,ff) end else ([],l) val rec matcher' : {template_statement: statement_element, statement: statement_type list, finish: statement_type list} -> {statement: statement_type list, finish: statement_type list} option = fn (* Zero *) {template_statement = ((0, SOME 0), _), statement, finish} => SOME {statement = List.rev statement, finish = finish} | (* ZeroOrOne *) {template_statement = ((0, SOME 1), p), statement, finish} => (case finish of [] => SOME {statement = List.rev statement, finish = finish} | (statement'::finish') => if p statement' then SOME {statement = List.rev (statement'::statement), finish = finish'} else SOME {statement = List.rev statement, finish = finish}) | (* One *) {template_statement = ((1, SOME 1), p), statement, finish} => (case finish of [] => NONE | (statement'::finish') => if p statement' then SOME {statement = List.rev (statement'::statement), finish = finish'} else NONE) | (* *) {template_statement = ((0, SOME i), p), statement, finish} => (case finish of [] => SOME {statement = List.rev statement, finish = finish} | (statement'::finish') => if p statement' then matcher' {template_statement = ((0, SOME (i-1)), p), statement = statement'::statement, finish = finish'} else SOME {statement = List.rev statement, finish = finish}) | (* All *) {template_statement = ((0, NONE), p), statement, finish} => let val (statement',finish') = split (finish, p) in SOME {statement = List.fold(statement, statement', op ::), finish = finish'} end | {template_statement = ((min, max), p), statement, finish = (statement'::finish')} => if p statement' then matcher' {template_statement = ((Int.max(min-1,0), Option.map(max,fn i => i - 1)), p), statement = statement'::statement, finish = finish'} else NONE | _ => NONE val rec matcher : {template_statements: statement_element list, statements: statement_type list list, finish: statement_type list} -> {statements: statement_type list list, finish: statement_type list} option = fn {template_statements = [], statements, finish} => SOME {statements = List.rev statements, finish = finish} | {template_statements = (template_statement::template_statements), statements, finish} => (case matcher' {template_statement = template_statement, statement = [], finish = finish} of NONE => NONE | SOME {statement, finish} => matcher {template_statements = template_statements, statements = statement::statements, finish = finish}) fun peepholeBlock' {optimizations: optimization list, match_state: match_state} = let fun next {remaining: optimization list, state as {entry, profileLabel, start, finish, transfer}} : find_state option = (case remaining of [] => NONE | _::nil => (case finish of [] => NONE | statement::finish => SOME {remaining = optimizations, state = {entry = entry, profileLabel = profileLabel, start = statement::start, finish = finish, transfer = transfer}}) | _::remaining => SOME {remaining = remaining, state = state}) fun findMatch' (find_state as {remaining as {template = {start = template_start, statements = template_statements, finish = template_finish, transfer = template_transfer}, ...}::_, state = {entry, profileLabel, start, finish, transfer}}) : match_state = let fun loop () = (case next find_state of SOME find_state => findMatch' find_state | NONE => Done {block = T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, finish, op ::), transfer = transfer}}) in if not (template_transfer transfer) then loop () else if template_start = Empty andalso not (List.isEmpty start) then loop () else case matcher {template_statements = template_statements, statements = [], finish = finish} of NONE => loop () | SOME {statements, finish} => if template_finish = Empty andalso not (List.isEmpty finish) then loop () else Continue {remaining = remaining, match = {entry = entry, profileLabel = profileLabel, start = start, statements = statements, finish = finish, transfer = transfer}} end | findMatch' _ = Error.bug "Peephole.peepholeBlock'.findMatch'" fun findMatch (match_state: match_state) : match_state = case match_state of Start {block = T {entry, profileLabel, statements, transfer}} => let val find_state = {remaining = optimizations, state = {entry = entry, profileLabel = profileLabel, start = [], finish = statements, transfer = transfer}} in findMatch' find_state end | Continue {remaining, match = {entry, profileLabel, start, statements, finish, transfer}, ...} => let val finish = List.foldr(statements, finish, op @) val find_state = {remaining = remaining, state = {entry = entry, profileLabel = profileLabel, start = start, finish = finish, transfer = transfer}} in case next find_state of NONE => Done {block = T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, finish, op ::), transfer = transfer}} | SOME find_state => findMatch' find_state end | Done _ => match_state fun peepholeBlock'' {match_state: match_state, changed: bool} = case findMatch match_state of match_state as Continue {remaining = {rewriter, callback, ...}::_, match} => (case rewriter match of SOME block => (callback true; peepholeBlock'' {match_state = Start {block = block}, changed = true}) | NONE => (callback false; peepholeBlock'' {match_state = match_state, changed = changed})) | Done {block} => {block = block, changed = changed} | _ => Error.bug "Peephole.peepholeBlock''" in case optimizations of [] => (case match_state of Start {block = block} => {block = block, changed = false} | _ => Error.bug "Peephole.peepholeBlock'") | _ => peepholeBlock'' {match_state = match_state, changed = false} end fun peepholeBlock {block: block, optimizations: optimization list} = peepholeBlock' {optimizations = optimizations, match_state = Start {block = block}} fun peepholeBlocks {blocks: block list, optimizations: optimization list} = let val {blocks, changed} = List.foldr (blocks, {blocks = [], changed = false}, fn (block,{blocks,changed}) => let val {block = block', changed = changed'} = peepholeBlock' {optimizations = optimizations, match_state = Start {block = block}} in {blocks = block'::blocks, changed = changed orelse changed'} end) in {blocks = blocks, changed = changed} end end mlton-20100608/mlton/codegen/amd64-codegen/peephole.sig0000644000076600000240000000407211404435625021145 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PEEPHOLE_TYPES = sig type entry_type type profileLabel_type type statement_type type transfer_type datatype block = T of {entry: entry_type, profileLabel: profileLabel_type, statements: statement_type list, transfer: transfer_type} end signature PEEPHOLE = sig include PEEPHOLE_TYPES datatype statement_border = Empty | EmptyOrNonEmpty type statement_element = (int * int option) * (statement_type -> bool) type transfer_element = transfer_type -> bool val One : (statement_type -> bool) -> statement_element val All : (statement_type -> bool) -> statement_element type template = {start: statement_border, statements: statement_element list, finish: statement_border, transfer: transfer_element} type match = {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, statements: statement_type list list, finish: statement_type list, transfer: transfer_type} type rewriter = match -> block option type callback = bool -> unit type optimization = {template: template, rewriter: rewriter, callback: callback} val peepholeBlock : {block: block, optimizations: optimization list} -> {block: block, changed: bool} val peepholeBlocks : {blocks: block list, optimizations: optimization list} -> {blocks: block list, changed: bool} end mlton-20100608/mlton/codegen/amd64-codegen/sources.cm0000644000076600000240000000204111404435625020636 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group functor amd64Codegen is ../../../lib/mlton/sources.cm ../../ast/sources.cm ../../atoms/sources.cm ../../control/sources.cm ../../backend/sources.cm ../c-codegen/sources.cm peephole.sig peephole.fun amd64.sig amd64.fun amd64-pseudo.sig amd64-mlton-basic.sig amd64-mlton-basic.fun amd64-liveness.sig amd64-liveness.fun amd64-mlton.sig amd64-mlton.fun amd64-allocate-registers.sig amd64-allocate-registers.fun amd64-entry-transfer.sig amd64-entry-transfer.fun amd64-jump-info.sig amd64-jump-info.fun amd64-loop-info.sig amd64-loop-info.fun amd64-live-transfers.sig amd64-live-transfers.fun amd64-generate-transfers.sig amd64-generate-transfers.fun amd64-simplify.sig amd64-simplify.fun amd64-translate.sig amd64-translate.fun amd64-codegen.sig amd64-codegen.fun mlton-20100608/mlton/codegen/amd64-codegen/sources.mlb0000644000076600000240000000222411404435625021014 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../../lib/mlton/sources.mlb ../../ast/sources.mlb ../../atoms/sources.mlb ../../control/sources.mlb ../../backend/sources.mlb ../c-codegen/sources.mlb peephole.sig peephole.fun amd64.sig amd64.fun amd64-pseudo.sig amd64-mlton-basic.sig amd64-mlton-basic.fun amd64-liveness.sig amd64-liveness.fun amd64-mlton.sig amd64-mlton.fun amd64-allocate-registers.sig amd64-allocate-registers.fun amd64-entry-transfer.sig amd64-entry-transfer.fun amd64-jump-info.sig amd64-jump-info.fun amd64-loop-info.sig amd64-loop-info.fun amd64-live-transfers.sig amd64-live-transfers.fun amd64-generate-transfers.sig amd64-generate-transfers.fun amd64-simplify.sig amd64-simplify.fun amd64-translate.sig amd64-translate.fun amd64-codegen.sig amd64-codegen.fun in functor amd64Codegen end mlton-20100608/mlton/codegen/bytecode/0000755000076600000240000000000011404470407016113 5ustar mtfstaffmlton-20100608/mlton/codegen/bytecode/bytecode.fun0000644000076600000240000010536111404435625020434 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Bytecode (S: BYTECODE_STRUCTS): BYTECODE = struct open S local open Machine in structure Block = Block structure CFunction = CFunction structure Chunk = Chunk structure CType = CType structure FrameInfo = FrameInfo structure Global = Global structure Kind = Kind structure Label = Label structure Live = Live structure Operand = Operand structure Prim = Prim structure Program = Program structure Register = Register structure Runtime = Runtime structure Scale = Scale structure StackOffset = StackOffset structure Statement = Statement structure Switch = Switch structure Transfer = Transfer structure Type = Type structure WordSize = WordSize structure WordX = WordX end structure Target = CFunction.Target fun implementsPrim p = let datatype z = datatype Prim.Name.t in case Prim.name p of CPointer_add => true | CPointer_diff => true | CPointer_equal => true | CPointer_fromWord => true | CPointer_lt => true | CPointer_sub => true | CPointer_toWord => true | FFI_Symbol _ => true | Real_Math_acos _ => true | Real_Math_asin _ => true | Real_Math_atan _ => true | Real_Math_atan2 _ => true | Real_Math_cos _ => true | Real_Math_exp _ => true | Real_Math_ln _ => true | Real_Math_log10 _ => true | Real_Math_sin _ => true | Real_Math_sqrt _ => true | Real_Math_tan _ => true | Real_abs _ => true | Real_add _ => true | Real_castToWord _ => true | Real_div _ => true | Real_equal _ => true | Real_ldexp _ => false | Real_le _ => true | Real_lt _ => true | Real_mul _ => true | Real_muladd _ => false | Real_mulsub _ => false | Real_neg _ => true | Real_qequal _ => false | Real_rndToReal _ => true | Real_rndToWord _ => true | Real_round _ => true | Real_sub _ => true | Word_add _ => true | Word_addCheck _ => true | Word_andb _ => true | Word_castToReal _ => true | Word_equal _ => true | Word_extdToWord _ => true | Word_lshift _ => true | Word_lt _ => true | Word_mul _ => true | Word_mulCheck _ => true | Word_neg _ => true | Word_negCheck _ => true | Word_notb _ => true | Word_orb _ => true | Word_quot _ => true | Word_rem _ => true | Word_rndToReal _ => true | Word_rol _ => true | Word_ror _ => true | Word_rshift _ => true | Word_sub _ => true | Word_subCheck _ => true | Word_xorb _ => true | _ => false end structure Opcode = IntInf structure CType = struct open CType val memo: (t -> 'a) -> t -> 'a = fn f => let val m = CType.memo (fn t => case t of CType.CPointer => NONE | CType.Objptr => NONE | _ => SOME (f t)) in fn t => valOf (case t of CType.CPointer => m (CType.csize ()) | CType.Objptr => m (CType.csize ()) | _ => m t) end val noSigned = memo (fn t => case t of Int8 => Word8 | Int16 => Word16 | Int32 => Word32 | Int64 => Word64 | _ => t) val toStringOrig = toString val toString = memo toString end structure LoadStore = struct datatype t = Load | Store val toString = fn Load => "load" | Store => "store" val layout = Layout.str o toString end fun output {program as Program.T {chunks, main, ...}, outputC} = let datatype z = datatype LoadStore.t datatype z = datatype Statement.t datatype z = datatype Transfer.t (* Build a table of the opcodes. *) val table = HashSet.new {hash = #hash} val _ = File.withIn (concat [!Control.libDir, "/opcodes"], fn ins => In.foldLines (ins, 0, fn (l, i) => case String.tokens (l, Char.isSpace) of [name] => let val hash = String.hash name val _ = HashSet.insertIfNew (table, hash, fn {name = name', ...} => name = name', fn () => {hash = hash, opcode = Int.toIntInf i, name = name}, fn _ => Error.bug (concat ["Bytecode.output: duplicate opcode: ", name])) in i + 1 end | _ => Error.bug "Bytecode.output: strange opcode file")) val opcode: string -> Opcode.t = fn name => #opcode (HashSet.lookupOrInsert (table, String.hash name, fn {name = name', ...} => name = name', fn () => Error.bug (concat ["Bytecode.output: missing opcode: ", name]))) val callCounter = Counter.new 0 val callCs = ref [] fun callC {function: string, prototype}: string = let val (args, result) = prototype val c = Counter.new 0 fun temp () = concat ["t", Int.toString (Counter.next c)] fun cast (cty, src) = concat ["(", cty, ")(", src, ")"] val args = Vector.map (args, fn cty => let val mty = CType.noSigned cty val (declarePop,mtemp) = let val mty = CType.toString mty val mtemp = temp () in (concat ["\t", mty, " ", mtemp, " = PopReg (", mty, ");\n"], mtemp) end val (declareCast, ctemp) = if mty = cty then ("", mtemp) else let val cty = CType.toString cty val ctemp = temp () in (concat ["\t", cty, " ", ctemp, " = ", cast (cty, mtemp), ";\n"], ctemp) end in {declare = concat [declarePop, declareCast], temp = ctemp} end) val call = concat [function, " (", (concat o List.separate) (Vector.toListMap (args, #temp), ", "), ");\n"] val result = case result of NONE => concat ["\t", call] | SOME cty => let val mty = CType.noSigned cty in if mty = cty then concat ["\tPushReg (", CType.toString cty, ") = ", call] else let val cty = CType.toString cty val ctemp = temp () val mty = CType.toString mty in concat ["\t", cty, " ", ctemp, " = ", call, "\tPushReg (", mty, ") = ", cast (mty, ctemp), ";\n"] end end in concat ["{\n", concat (Vector.toListMap (args, #declare)), "\tassertRegsEmpty ();\n", result, "\t}\n"] end local val calls = HashSet.new {hash = #hash} in val () = (* Visit each direct C Call in the program. *) List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {statements, transfer, ...} => (Vector.foreach (statements, fn s => case s of PrimApp {dst, prim, ...} => (case Prim.name prim of Prim.Name.FFI_Symbol {name, ...} => Option.app (dst, fn _ => let val hash = String.hash name in ignore (HashSet.lookupOrInsert (calls, hash, fn {name = n, symbol, ...} => n = name andalso symbol, fn () => let val index = Counter.next callCounter val display = let val ptr = CType.toString CType.CPointer in concat ["PushReg (",ptr,") = ", "((",ptr,")(&",name,"));\n"] end val () = List.push (callCs, {display = display, index = index}) in {hash = hash, index = index, name = name, symbol = true} end)) end) | _ => ()) | _ => ()) ; (case transfer of CCall {func, ...} => let val CFunction.T {prototype, target, ...} = func datatype z = datatype Target.t in case target of Direct "Thread_returnToC" => () | Direct name => let val hash = String.hash name in ignore (HashSet.lookupOrInsert (calls, hash, fn {name = n, symbol, ...} => n = name andalso (not symbol), fn () => let val index = Counter.next callCounter val display = callC {function = name, prototype = prototype} val () = List.push (callCs, {display = display, index = index}) in {hash = hash, index = index, name = name, symbol = false} end)) end | Indirect => () end | _ => ())))) fun directIndex (name: string) = #index (HashSet.lookupOrInsert (calls, String.hash name, fn {name = n, symbol, ...} => n = name andalso (not symbol), fn () => Error.bug "Bytecode.output.directIndex")) fun ffiSymbolIndex (name: string) = #index (HashSet.lookupOrInsert (calls, String.hash name, fn {name = n, symbol, ...} => n = name andalso symbol, fn () => Error.bug "Bytecode.output.ffiSymbolIndex")) end fun indirectIndex (f: 'a CFunction.t): int = let val index = Counter.next callCounter val function = concat ["(", "*(", CFunction.cPointerType f, " fptr)) "] val display = concat ["{\n\t", CType.toStringOrig (CType.csize ()), " fptr = PopReg (", CType.toStringOrig (CType.csize ()), ");\n\t", callC {function = function, prototype = CFunction.prototype f}, "\t}\n"] val () = List.push (callCs, {display = display, index = index}) in index end val callC = opcode "CallC" val jumpOnOverflow = opcode "JumpOnOverflow" val raisee = opcode "Raise" val returnOp = opcode "Return" val returnToC = opcode "Thread_returnToC" datatype z = datatype WordSize.prim val switch: WordSize.t -> Opcode.t = let val s8 = opcode "Switch8" val s16 = opcode "Switch16" val s32 = opcode "Switch32" val s64 = opcode "Switch64" in fn w => case WordSize.prim w of W8 => s8 | W16 => s16 | W32 => s32 | W64 => s64 end local fun make (name, distinguishPointers: bool) (ls: LoadStore.t, cty: CType.t): Opcode.t = opcode (concat [if distinguishPointers then CType.toStringOrig cty else CType.toString cty, "_", LoadStore.toString ls, name]) in val arrayOffset = make ("ArrayOffset", false) val contents = make ("Contents", false) val global = make ("Global", true) val offsetOp = make ("Offset", false) val register = make ("Register", true) val stackOffset = make ("StackOffset", false) val wordOpcode = make ("Word", false) end val branchIfZero = opcode "BranchIfZero" fun gpnr ls = opcode (concat [LoadStore.toString ls, "GPNR"]) local fun make name (ls: LoadStore.t): Opcode.t = opcode (concat [LoadStore.toString ls, name]) in val frontier = make "Frontier" val gcState = make "GCState" val stackTop = make "StackTop" end val code: Word8.t list ref = ref [] val offset = ref 0 val emitByte: Word8.t -> unit = fn w => (List.push (code, w) ; Int.inc offset) local fun make (bits: int, {signed}): IntInf.t -> unit = let val bits = Bits.fromInt bits in fn i => if not (WordSize.isInRange (WordSize.fromBits bits, i, {signed = signed})) then Error.bug (concat ["Bytecode.output: emitWord", Bits.toString bits, " failed on ", IntInf.toString i]) else let fun loop (j, i) = if 0 = j then () else let val (q, r) = IntInf.quotRem (i, 0x100) val () = emitByte (Word8.fromIntInf r) in loop (j - 1, q) end in loop (Bytes.toInt (Bits.toBytes bits), IntInf.mod (i, IntInf.<< (1, Bits.toWord bits))) end end in val emitWord8 = make (8, {signed = false}) val emitWord16 = make (16, {signed = false}) val emitWordS16 = make (16, {signed = true}) val emitWord32 = make (32, {signed = false}) val emitWord64 = make (64, {signed = false}) end val emitWordX: WordX.t -> unit = fn w => (case WordSize.prim (WordX.size w) of W8 => emitWord8 | W16 => emitWord16 | W32 => emitWord32 | W64 => emitWord64) (WordX.toIntInf w) val emitOpcode = emitWord16 val emitPrim: 'a Prim.t -> unit = fn p => emitOpcode (opcode (Prim.toString p)) fun emitCallC (index: int): unit = (emitOpcode callC ; emitWord16 (Int.toIntInf index)) val {get = labelInfo: Label.t -> {block: Block.t, emitted: bool ref, occurrenceOffsets: int list ref, offset: int option ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val needToEmit: Label.t list ref = ref [] val emitLabel: Label.t -> unit = fn l => let val {emitted, occurrenceOffsets, ...} = labelInfo l val () = List.push (occurrenceOffsets, !offset) val () = if !emitted then () else List.push (needToEmit, l) in emitWordX (WordX.zero (WordSize.cpointer ())) end val emitLabel = Trace.trace ("Bytecode.emitLabel", Label.layout, Unit.layout) emitLabel fun loadStoreStackOffset (offset, cty, ls) = (emitOpcode (stackOffset (ls, cty)) ; emitWord16 (Bytes.toIntInf offset)) val rec emitLoadOperand = fn z => emitOperand (z, Load) and emitOperand: Operand.t * LoadStore.t -> unit = fn (z, ls) => let val cty = Type.toCType (Operand.ty z) datatype z = datatype Operand.t in case z of ArrayOffset {base, index, offset, scale, ...} => (emitLoadOperand base ; emitLoadOperand index ; emitOpcode (arrayOffset (ls, cty)) ; emitWord16 (Bytes.toIntInf offset) ; emitWord8 (Int.toIntInf (Scale.toInt scale))) | Cast (z, _) => emitOperand (z, ls) | Contents {oper, ...} => (emitLoadOperand oper ; emitOpcode (contents (ls, cty))) | Frontier => emitOpcode (frontier ls) | GCState => emitOpcode (gcState ls) | Global g => (if Global.isRoot g then emitOpcode (global (ls, cty)) else emitOpcode (gpnr ls) ; emitWord16 (Int.toIntInf (Global.index g))) | Label l => (emitOpcode (wordOpcode (ls, cty)) ; emitLabel l) | Null => (emitOpcode (wordOpcode (ls, cty)) ; emitWordX (WordX.zero (WordSize.cpointer ()))) | Offset {base, offset = off, ...} => (emitLoadOperand base ; emitOpcode (offsetOp (ls, cty)) ; emitWordS16 (Bytes.toIntInf off)) | Real _ => Error.bug "Bytecode.emitOperand: Real" | Register r => (emitOpcode (register (ls, cty)) ; emitWord16 (Int.toIntInf (Register.index r))) | StackOffset (StackOffset.T {offset, ...}) => loadStoreStackOffset (offset, cty, ls) | StackTop => emitOpcode (stackTop ls) | Word w => case ls of Load => (emitOpcode (wordOpcode (ls, cty)); emitWordX w) | Store => Error.bug "Bytecode.emitOperand: Word, Store" end val emitLoadOperand = Trace.trace ("Bytecode.emitLoadOperand", Operand.layout, Unit.layout) emitLoadOperand val emitOperand = Trace.trace2 ("Bytecode.emitOperand", Operand.layout, LoadStore.layout, Unit.layout) emitOperand fun emitStoreOperand z = emitOperand (z, Store) fun move {dst, src} = (emitLoadOperand src ; emitStoreOperand dst) fun emitArgs args = Vector.foreach (Vector.rev args, emitLoadOperand) fun primApp {args, dst, prim} = case Prim.name prim of Prim.Name.FFI_Symbol {name, ...} => Option.app (dst, fn dst => (emitCallC (ffiSymbolIndex name) ; emitStoreOperand dst)) | _ => (emitArgs args ; emitPrim prim ; Option.app (dst, emitStoreOperand)) val emitStatement: Statement.t -> unit = fn s => case s of Move z => move z | Noop => () | PrimApp z => primApp z | ProfileLabel _ => Error.bug "Bytecode.output.emitStatement: profileLabel" val emitStatement = Trace.trace ("Bytecode.emitStatement", Statement.layout, Unit.layout) emitStatement val gotoOp = opcode "Goto" val pointerSize = WordSize.cpointer () val flushStackTopOp = opcode "FlushStackTop" val amTimeProfiling = !Control.profile = Control.ProfileTimeField orelse !Control.profile = Control.ProfileTimeLabel fun shiftStackTop (size: Bytes.t) = (primApp {args = (Vector.new2 (Operand.StackTop, Operand.Word (WordX.fromIntInf (Bytes.toIntInf size, pointerSize)))), dst = SOME Operand.StackTop, prim = Prim.wordAdd pointerSize} ; if amTimeProfiling then emitOpcode flushStackTopOp else ()) fun push (label: Label.t, size: Bytes.t): unit = (move {dst = (Operand.StackOffset (StackOffset.T {offset = Bytes.- (size, Runtime.labelSize ()), ty = Type.label label})), src = Operand.Label label} ; shiftStackTop size) fun pop (size: Bytes.t) = shiftStackTop (Bytes.~ size) val () = List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn block => setLabelInfo (Block.label block, {block = block, emitted = ref false, occurrenceOffsets = ref [], offset = ref NONE}))) val traceEmitTransfer = Trace.trace ("Bytecode.emitTransfer", Transfer.layout, Unit.layout) fun emitBlock (Block.T {kind, label, statements, transfer, ...}): unit = let val () = Option.app (Kind.frameInfoOpt kind, fn FrameInfo.T {frameLayoutsIndex} => ((* This load will never be used. We just have it there * so the disassembler doesn't get confused when it * sees the frameLayoutsIndex. *) emitOpcode (wordOpcode (Load, CType.Word32)) ; emitWord32 (Int.toIntInf frameLayoutsIndex))) val () = #offset (labelInfo label) := SOME (!offset) fun popFrame () = Option.app (Kind.frameInfoOpt kind, fn fi => pop (Program.frameSize (program, fi))) val () = case kind of Kind.CReturn {dst, func, ...} => (case #2 (CFunction.prototype func) of NONE => popFrame () | SOME cty => case dst of NONE => (* Even if there is no dst, we still need to * pop the value returned by the C function. * We write it to a bogus location in the * callee's frame before popping back to the * caller. * We mediated between the signed/unsigned treatment * in the stub. *) (loadStoreStackOffset (Bytes.zero, CType.noSigned cty, Store) ; popFrame ()) | SOME z => (popFrame () ; emitStoreOperand (Live.toOperand z))) | _ => popFrame () val () = (Vector.foreach (statements, emitStatement) ; emitTransfer transfer) in () end and goto (l: Label.t): unit = let val {block as Block.T {kind, ...}, emitted, ...} = labelInfo l in if !emitted orelse isSome (Kind.frameInfoOpt kind) then (emitOpcode gotoOp; emitLabel l) else (emitted := true; emitBlock block) end and emitTransfer arg: unit = traceEmitTransfer (fn (t: Transfer.t) => let datatype z = datatype Transfer.t in case t of Arith {args, dst, overflow, prim, success} => (emitArgs args ; emitPrim prim ; emitStoreOperand dst ; emitOpcode jumpOnOverflow ; emitLabel overflow ; goto success) | CCall {args, frameInfo, func, return} => let val () = emitArgs args val CFunction.T {maySwitchThreads, target, ...} = func val () = Option.app (frameInfo, fn frameInfo => push (valOf return, Program.frameSize (program, frameInfo))) datatype z = datatype Target.t val () = case target of Direct "Thread_returnToC" => emitOpcode returnToC | Direct name => emitCallC (directIndex name) | Indirect => emitCallC (indirectIndex func) val () = if maySwitchThreads then emitOpcode returnOp else Option.app (return, goto) in () end | Call {label, return, ...} => (Option.app (return, fn {return, size, ...} => push (return, size)) ; goto label) | Goto l => goto l | Raise => emitOpcode raisee | Return => emitOpcode returnOp | Switch (Switch.T {cases, default, size, test}) => let val () = emitLoadOperand test fun bool (a: Label.t, b: Label.t) = (emitOpcode branchIfZero ; emitLabel b ; goto a) fun normal () = let val numCases = Vector.length cases + (if isSome default then 1 else 0) - 1 val () = (emitOpcode (switch size) ; emitWord16 (Int.toIntInf numCases)) fun emitCases cases = Vector.foreach (cases, fn (w, l) => (emitWordX w; emitLabel l)) in case default of NONE => (emitCases (Vector.dropSuffix (cases, 1)) ; goto (#2 (Vector.last cases))) | SOME l => (emitCases cases; goto l) end in if 2 = Vector.length cases andalso Option.isNone default andalso WordSize.equals (size, WordSize.bool) then let val (c0, l0) = Vector.sub (cases, 0) val (c1, l1) = Vector.sub (cases, 1) val i0 = WordX.toIntInf c0 val i1 = WordX.toIntInf c1 in if i0 = 0 andalso i1 = 1 then bool (l1, l0) else if i0 = 1 andalso i1 = 0 then bool (l0, l1) else normal () end else normal () end end) arg fun loop () = case !needToEmit of [] => () | l :: ls => let val () = needToEmit := ls val {block, emitted, ...} = labelInfo l val () = if !emitted then () else (emitted := true; emitBlock block) in loop () end val () = List.push (needToEmit, #label main) val () = loop () (* Discard unreachable blocks *) val chunks = List.map (chunks, fn Chunk.T {blocks, chunkLabel, regMax} => let val blocks = Vector.keepAll (blocks, fn Block.T {label, ...} => ! (#emitted (labelInfo label))) in Chunk.T {blocks = blocks, chunkLabel = chunkLabel, regMax = regMax} end) fun labelOffset l = valOf (! (#offset (labelInfo l))) val code = Array.fromListRev (!code) (* Backpatch all label references. *) val () = List.foreach (chunks, fn Chunk.T {blocks, ...} => Vector.foreach (blocks, fn Block.T {label, ...} => let val {occurrenceOffsets = r, offset, ...} = labelInfo label val offset = valOf (!offset) fun loop (i, address) = if 0 = address then () else (Array.update (code, i, Word8.fromInt (Int.rem (address, 0x100))) ; loop (i + 1, Int.quot (address, 0x100))) in List.foreach (!r, fn occ => loop (occ, offset)) end)) val {done, file = _, print} = outputC () val print = Trace.trace ("Bytecode.print", String.layout, Unit.layout) print val () = CCodegen.outputDeclarations {additionalMainArgs = [Int.toString (labelOffset (#label main))], includes = ["bytecode-main.h"], print = print, program = program, rest = fn () => ()} val () = done () val {done, print, ...} = outputC () fun declareCallC () = (print "PRIVATE void MLton_callC (int i) {\n" ; print "switch (i) {\n" ; List.foreach (!callCs, fn {display, index} => (print (concat ["case ", Int.toString index, ":\n\t"]) ; print display ; print "break;\n")) ; print "}}\n") val () = (print "#include \"bytecode.h\"\n\n" ; List.foreach (chunks, fn c => CCodegen.declareFFI (c, {print = print})) ; print "\n" ; declareCallC () ; print "\n") val word8ArrayToString: Word8.t array -> string = fn a => String.tabulate (Array.length a, fn i => Char.fromWord8 (Array.sub (a, i))) val {labels, offsets, ...} = List.fold (chunks, {labels = [], offset = 0, offsets = []}, fn (Chunk.T {blocks, ...}, ac) => Vector.fold (blocks, ac, fn (Block.T {label, ...}, {labels, offset, offsets}) => let val offsets = {code = labelOffset label, name = offset} :: offsets val label = Label.toString label in {labels = label :: labels, offset = offset + String.size label + 1, offsets = offsets} end)) val labels = concat (List.fold (labels, [], fn (l, ac) => l :: "\000" :: ac)) val offsets = rev offsets fun printString s = (print "\t\""; print (String.escapeC s); print "\",\n") fun printInt i = print (concat ["\t", Int.toString i, ",\n"]) val () = (print "static struct NameOffsets nameOffsets [] = {\n" ; List.foreach (offsets, fn {code, name} => print (concat ["\t{ ", Int.toString code, ", ", Int.toString name, " },\n"])) ; print "};\n" ; print "PRIVATE struct Bytecode MLton_bytecode = {\n" ; printString labels ; printString (word8ArrayToString code) ; printInt (Array.length code) ; print "\tnameOffsets,\n" ; printInt (List.length offsets) ; print "};\n") val () = done () in () end end mlton-20100608/mlton/codegen/bytecode/bytecode.sig0000644000076600000240000000127311404435625020423 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature BYTECODE_STRUCTS = sig structure CCodegen: C_CODEGEN structure Machine: MACHINE sharing Machine = CCodegen.Machine end signature BYTECODE = sig include BYTECODE_STRUCTS val implementsPrim: 'a Machine.Prim.t -> bool val output: {program: Machine.Program.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} -> unit end mlton-20100608/mlton/codegen/bytecode/sources.cm0000644000076600000240000000052411404435625020123 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group is ../../../lib/mlton/sources.cm ../../backend/sources.cm ../../control/sources.cm ../c-codegen/sources.cm bytecode.sig bytecode.fun mlton-20100608/mlton/codegen/bytecode/sources.mlb0000644000076600000240000000060511404435625020276 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../../lib/mlton/sources.mlb ../../backend/sources.mlb ../../control/sources.mlb ../c-codegen/sources.mlb bytecode.sig bytecode.fun in functor Bytecode end mlton-20100608/mlton/codegen/c-codegen/0000755000076600000240000000000011404470407016141 5ustar mtfstaffmlton-20100608/mlton/codegen/c-codegen/c-codegen.fun0000644000076600000240000014561311404435624020513 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CCodegen (S: C_CODEGEN_STRUCTS): C_CODEGEN = struct open S open Machine datatype z = datatype RealSize.t datatype z = datatype WordSize.prim local open Runtime in structure GCField = GCField end structure Kind = struct open Kind fun isEntry (k: t): bool = case k of Cont _ => true | CReturn {func, ...} => CFunction.mayGC func | Func => true | Handler _ => true | _ => false end val traceGotoLabel = Trace.trace ("CCodegen.gotoLabel", Label.layout, Unit.layout) structure RealX = struct open RealX fun toC (r: t): string = let (* The main difference between SML reals and C floats/doubles is that * SML uses "~" while C uses "-". *) val s = String.translate (toString r, fn #"~" => "-" | c => String.fromChar c) (* Also, inf is spelled INFINITY and nan is NAN in C. *) val s = case s of "-inf" => "-INFINITY" | "inf" => "INFINITY" | "nan" => "NAN" | other => other in case size r of R32 => concat ["(Real32)", s] | R64 => s end end structure WordX = struct open WordX fun toC (w: t): string = let fun simple s = concat ["(Word", s, ")0x", toString w] in case WordSize.prim (size w) of W8 => simple "8" | W16 => simple "16" | W32 => concat ["0x", toString w] | W64 => concat ["0x", toString w, "llu"] end end structure C = struct val truee = "TRUE" val falsee = "FALSE" fun bool b = if b then truee else falsee fun args (ss: string list): string = concat ("(" :: List.separate (ss, ", ") @ [")"]) fun callNoSemi (f: string, xs: string list, print: string -> unit): unit = (print f ; print " (" ; (case xs of [] => () | x :: xs => (print x ; List.foreach (xs, fn x => (print ", "; print x)))) ; print ")") fun call (f, xs, print) = (callNoSemi (f, xs, print) ; print ";\n") fun int (i: int) = if i >= 0 then Int.toString i else concat ["-", Int.toString (~ i)] val bytes = int o Bytes.toInt fun string s = let val quote = "\"" in concat [quote, String.escapeC s, quote] end fun word (w: Word.t) = "0x" ^ Word.toString w fun push (size: Bytes.t, print) = call ("\tPush", [bytes size], print) end structure Operand = struct open Operand fun isMem (z: t): bool = case z of ArrayOffset _ => true | Cast (z, _) => isMem z | Contents _ => true | Offset _ => true | StackOffset _ => true | _ => false end fun implementsPrim (p: 'a Prim.t): bool = let datatype z = datatype Prim.Name.t in case Prim.name p of CPointer_add => true | CPointer_diff => true | CPointer_equal => true | CPointer_fromWord => true | CPointer_lt => true | CPointer_sub => true | CPointer_toWord => true | FFI_Symbol _ => true | Real_Math_acos _ => true | Real_Math_asin _ => true | Real_Math_atan _ => true | Real_Math_atan2 _ => true | Real_Math_cos _ => true | Real_Math_exp _ => true | Real_Math_ln _ => true | Real_Math_log10 _ => true | Real_Math_sin _ => true | Real_Math_sqrt _ => true | Real_Math_tan _ => true | Real_abs _ => true | Real_add _ => true | Real_castToWord _ => true | Real_div _ => true | Real_equal _ => true | Real_ldexp _ => true | Real_le _ => true | Real_lt _ => true | Real_mul _ => true | Real_muladd _ => true | Real_mulsub _ => true | Real_neg _ => true | Real_qequal _ => false | Real_rndToReal _ => true | Real_rndToWord _ => true | Real_round _ => true | Real_sub _ => true | Word_add _ => true | Word_addCheck _ => true | Word_andb _ => true | Word_castToReal _ => true | Word_equal _ => true | Word_extdToWord _ => true | Word_lshift _ => true | Word_lt _ => true | Word_mul _ => true | Word_mulCheck _ => true | Word_neg _ => true | Word_negCheck _ => true | Word_notb _ => true | Word_orb _ => true | Word_quot (_, {signed}) => not signed | Word_rem (_, {signed}) => not signed | Word_rndToReal _ => true | Word_rol _ => true | Word_ror _ => true | Word_rshift _ => true | Word_sub _ => true | Word_subCheck _ => true | Word_xorb _ => true | _ => false end fun creturn (t: Type.t): string = concat ["CReturn", CType.name (Type.toCType t)] fun outputIncludes (includes, print) = (print "#define _ISOC99_SOURCE\n" ; List.foreach (includes, fn i => (print "#include <"; print i; print ">\n")) ; print "\n") fun declareProfileLabel (l, print) = C.call ("DeclareProfileLabel", [ProfileLabel.toString l], print) fun declareGlobals (prefix: string, print) = let (* gcState can't be static because stuff in mlton-lib.c refers to * it. *) val _ = print (concat [prefix, "struct GC_state gcState;\n"]) val _ = List.foreach (CType.all, fn t => let val s = CType.toString t in print (concat [prefix, s, " global", s, " [", C.int (Global.numberOfType t), "];\n"]) ; print (concat [prefix, s, " CReturn", CType.name t, ";\n"]) end) val _ = print (concat [prefix, "Pointer globalObjptrNonRoot [", C.int (Global.numberOfNonRoot ()), "];\n"]) in () end fun outputDeclarations {additionalMainArgs: string list, includes: string list, print: string -> unit, program = (Program.T {frameLayouts, frameOffsets, intInfs, maxFrameSize, objectTypes, profileInfo, reals, vectors, ...}), rest: unit -> unit }: unit = let fun declareExports () = Ffi.declareExports {print = print} fun declareLoadSaveGlobals () = let val _ = (print "static int saveGlobals (FILE *f) {\n" ; (List.foreach (CType.all, fn t => print (concat ["\tSaveArray (global", CType.toString t, ", f);\n"]))) ; print "\treturn 0;\n}\n") val _ = (print "static int loadGlobals (FILE *f) {\n" ; (List.foreach (CType.all, fn t => print (concat ["\tLoadArray (global", CType.toString t, ", f);\n"]))) ; print "\treturn 0;\n}\n") in () end fun declareIntInfs () = (print "BeginIntInfInits\n" ; (List.foreach (intInfs, fn (g, i) => (C.callNoSemi ("IntInfInitElem", [C.int (Global.index g), C.string (IntInf.toString i)], print) ; print "\n"))) ; print "EndIntInfInits\n") fun declareStrings () = (print "BeginVectorInits\n" ; (List.foreach (vectors, fn (g, v) => (C.callNoSemi ("VectorInitElem", [C.string (WordXVector.toString v), C.int (Bytes.toInt (WordSize.bytes (WordXVector.elementSize v))), C.int (Global.index g), C.int (WordXVector.length v)], print) ; print "\n"))) ; print "EndVectorInits\n") fun declareReals () = (print "static void real_Init() {\n" ; List.foreach (reals, fn (g, r) => print (concat ["\tglobalReal", RealSize.toString (RealX.size r), "[", C.int (Global.index g), "] = ", RealX.toC r, ";\n"])) ; print "}\n") fun declareFrameOffsets () = Vector.foreachi (frameOffsets, fn (i, v) => (print (concat ["static uint16_t frameOffsets", C.int i, "[] = {"]) ; print (C.int (Vector.length v)) ; Vector.foreach (v, fn i => (print ","; print (C.bytes i))) ; print "};\n")) fun declareArray (ty: string, name: string, v: 'a vector, toString: int * 'a -> string) = (print (concat ["static ", ty, " ", name, "[] = {\n"]) ; Vector.foreachi (v, fn (i, x) => print (concat ["\t", toString (i, x), ",\n"])) ; print "};\n") fun declareFrameLayouts () = declareArray ("struct GC_frameLayout", "frameLayouts", frameLayouts, fn (_, {frameOffsetsIndex, isC, size}) => concat ["{", if isC then "C_FRAME" else "ML_FRAME", ", frameOffsets", C.int frameOffsetsIndex, ", ", C.bytes size, "}"]) fun declareAtMLtons () = declareArray ("char*", "atMLtons", !Control.atMLtons, C.string o #2) fun declareObjectTypes () = declareArray ("struct GC_objectType", "objectTypes", objectTypes, fn (_, ty) => let datatype z = datatype Runtime.RObjectType.t val (tag, hasIdentity, bytesNonObjptrs, numObjptrs) = case ObjectType.toRuntime ty of Array {hasIdentity, bytesNonObjptrs, numObjptrs} => ("ARRAY_TAG", hasIdentity, Bytes.toInt bytesNonObjptrs, numObjptrs) | Normal {hasIdentity, bytesNonObjptrs, numObjptrs} => ("NORMAL_TAG", hasIdentity, Bytes.toInt bytesNonObjptrs, numObjptrs) | Stack => ("STACK_TAG", false, 0, 0) | Weak {gone} => let val bytesObjptr = Bits.toBytes (Control.Target.Size.objptr ()) val bytesNonObjptrs = let val align = case !Control.align of Control.Align4 => Bytes.fromInt 4 | Control.Align8 => Bytes.fromInt 8 val bytesCPointer = Bits.toBytes (Control.Target.Size.cpointer ()) val bytesHeader = Bits.toBytes (Control.Target.Size.header ()) val bytesObject = Bytes.+ (bytesHeader, Bytes.+ (bytesCPointer, bytesObjptr)) val bytesTotal = Bytes.align (bytesObject, {alignment = align}) val bytesPad = Bytes.- (bytesTotal, bytesObject) in Bytes.+ (bytesPad, bytesCPointer) end val (bytesNonObjptrs, bytesObjptr) = (Bytes.toInt bytesNonObjptrs, Bytes.toInt bytesObjptr) val (bytesNonObjptrs, numObjptrs) = if gone then (bytesNonObjptrs + bytesObjptr, 0) else (bytesNonObjptrs, 1) in ("WEAK_TAG", false, bytesNonObjptrs, numObjptrs) end in concat ["{ ", tag, ", ", C.bool hasIdentity, ", ", C.int bytesNonObjptrs, ", ", C.int numObjptrs, " }"] end) fun declareMLtonMain () = let val align = case !Control.align of Control.Align4 => 4 | Control.Align8 => 8 val magic = C.word (case Random.useed () of NONE => String.hash (!Control.inputFile) | SOME w => w) val profile = case !Control.profile of Control.ProfileNone => "PROFILE_NONE" | Control.ProfileAlloc => "PROFILE_ALLOC" | Control.ProfileCallStack => "PROFILE_NONE" | Control.ProfileCount => "PROFILE_COUNT" | Control.ProfileDrop => "PROFILE_NONE" | Control.ProfileLabel => "PROFILE_NONE" | Control.ProfileTimeField => "PROFILE_TIME_FIELD" | Control.ProfileTimeLabel => "PROFILE_TIME_LABEL" in C.callNoSemi (case !Control.format of Control.Archive => "MLtonLibrary" | Control.Executable => "MLtonMain" | Control.LibArchive => "MLtonLibrary" | Control.Library => "MLtonLibrary", [C.int align, magic, C.bytes maxFrameSize, C.bool (!Control.markCards), profile, C.bool (!Control.profileStack)] @ additionalMainArgs, print) ; print "\n" end fun declareMain () = if !Control.emitMain andalso !Control.format = Control.Executable then List.foreach (["int main (int argc, char* argv[]) {", "return (MLton_main (argc, argv));", "}"], fn s => (print s; print "\n")) else () fun declareProfileInfo () = let fun doit (ProfileInfo.T {frameSources, labels, names, sourceSeqs, sources}) = (Vector.foreach (labels, fn {label, ...} => declareProfileLabel (label, print)) ; (Vector.foreachi (sourceSeqs, fn (i, v) => (print (concat ["static uint32_t sourceSeq", Int.toString i, "[] = {"]) ; print (C.int (Vector.length v)) ; Vector.foreach (v, fn i => (print (concat [",", C.int i]))) ; print "};\n"))) ; declareArray ("uint32_t*", "sourceSeqs", sourceSeqs, fn (i, _) => concat ["sourceSeq", Int.toString i]) ; declareArray ("GC_sourceSeqIndex", "frameSources", frameSources, C.int o #2) ; (declareArray ("struct GC_sourceLabel", "sourceLabels", labels, fn (_, {label, sourceSeqsIndex}) => concat ["{(pointer)&", ProfileLabel.toString label, ", ", C.int sourceSeqsIndex, "}"])) ; declareArray ("char*", "sourceNames", names, C.string o #2) ; declareArray ("struct GC_source", "sources", sources, fn (_, {nameIndex, successorsIndex}) => concat ["{ ", Int.toString nameIndex, ", ", Int.toString successorsIndex, " }"])) in case profileInfo of NONE => doit ProfileInfo.empty | SOME z => doit z end in outputIncludes (includes, print) ; declareGlobals ("PRIVATE ", print) ; declareExports () ; declareLoadSaveGlobals () ; declareIntInfs () ; declareStrings () ; declareReals () ; declareFrameOffsets () ; declareFrameLayouts () ; declareObjectTypes () ; declareProfileInfo () ; declareAtMLtons () ; rest () ; declareMLtonMain () ; declareMain () end structure Type = struct open Type fun toC (t: t): string = CType.toString (Type.toCType t) end structure StackOffset = struct open StackOffset fun toString (T {offset, ty}): string = concat ["S", C.args [Type.toC ty, C.bytes offset]] end fun contents (ty, z) = concat ["C", C.args [Type.toC ty, z]] fun declareFFI (Chunk.T {blocks, ...}, {print: string -> unit}) = let val seen = String.memoize (fn _ => ref false) fun doit (name: string, declare: unit -> string): unit = let val r = seen name in if !r then () else (r := true; print (declare ())) end in Vector.foreach (blocks, fn Block.T {statements, transfer, ...} => let datatype z = datatype CFunction.SymbolScope.t val _ = Vector.foreach (statements, fn s => case s of Statement.PrimApp {prim, ...} => (case Prim.name prim of Prim.Name.FFI_Symbol {name, cty, symbolScope} => doit (name, fn () => concat [case symbolScope of External => "EXTERNAL " | Private => "PRIVATE " | Public => "PUBLIC ", "extern ", case cty of SOME x => CType.toString x | NONE => "void", " ", name, ";\n"]) | _ => ()) | _ => ()) val _ = case transfer of Transfer.CCall {func, ...} => let datatype z = datatype CFunction.Target.t val CFunction.T {target, ...} = func in case target of Direct "Thread_returnToC" => () | Direct name => doit (name, fn () => concat [CFunction.cPrototype func, ";\n"]) | Indirect => () end | _ => () in () end) end fun output {program as Machine.Program.T {chunks, frameLayouts, main = {chunkLabel, label}, ...}, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} = let datatype status = None | One | Many val {get = labelInfo: Label.t -> {block: Block.t, chunkLabel: ChunkLabel.t, frameIndex: int option, status: status ref, layedOut: bool ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("CCodeGen.info", Label.layout)) val entryLabels: (Label.t * int) list ref = ref [] val indexCounter = Counter.new (Vector.length frameLayouts) val _ = List.foreach (chunks, fn Chunk.T {blocks, chunkLabel, ...} => Vector.foreach (blocks, fn b as Block.T {kind, label, ...} => let fun entry (index: int) = List.push (entryLabels, (label, index)) val frameIndex = case Kind.frameInfoOpt kind of NONE => (if Kind.isEntry kind then entry (Counter.next indexCounter) else () ; NONE) | SOME (FrameInfo.T {frameLayoutsIndex, ...}) => (entry frameLayoutsIndex ; SOME frameLayoutsIndex) in setLabelInfo (label, {block = b, chunkLabel = chunkLabel, frameIndex = frameIndex, layedOut = ref false, status = ref None}) end)) val a = Array.fromList (!entryLabels) val () = QuickSort.sortArray (a, fn ((_, i), (_, i')) => i <= i') val entryLabels = Vector.map (Vector.fromArray a, #1) val labelChunk = #chunkLabel o labelInfo val {get = chunkLabelIndex: ChunkLabel.t -> int, ...} = Property.getSet (ChunkLabel.plist, Property.initFun (let val c = Counter.new 0 in fn _ => Counter.next c end)) val chunkLabelToString = C.int o chunkLabelIndex fun declareChunk (Chunk.T {chunkLabel, ...}, print) = C.call ("DeclareChunk", [chunkLabelToString chunkLabel], print) val {get = labelIndex, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (entryLabels, fn (i, l) => setLabelIndex (l, i)) fun labelToStringIndex (l: Label.t): string = let val s = C.int (labelIndex l) in if 0 = !Control.Native.commented then s else concat [s, " /* ", Label.toString l, " */"] end val handleMisaligned = let open Control in !align = Align4 andalso (case !Control.Target.arch of Target.HPPA => true | Target.Sparc => true | _ => false) end val handleMisaligned = fn ty => handleMisaligned andalso (Type.equals (ty, Type.real R64) orelse Type.equals (ty, Type.word WordSize.word64)) fun addr z = concat ["&(", z, ")"] fun fetch (z, ty) = concat [CType.toString (Type.toCType ty), "_fetch(", addr z, ")"] fun move' ({dst, src}, ty) = concat [CType.toString (Type.toCType ty), "_move(", addr dst, ", ", addr src, ");\n"] fun store ({dst, src}, ty) = concat [CType.toString (Type.toCType ty), "_store(", addr dst, ", ", src, ");\n"] fun move {dst: string, dstIsMem: bool, src: string, srcIsMem: bool, ty: Type.t}: string = if handleMisaligned ty then case (dstIsMem, srcIsMem) of (false, false) => concat [dst, " = ", src, ";\n"] | (false, true) => concat [dst, " = ", fetch (src, ty), ";\n"] | (true, false) => store ({dst = dst, src = src}, ty) | (true, true) => move' ({dst = dst, src = src}, ty) else concat [dst, " = ", src, ";\n"] local datatype z = datatype Operand.t fun toString (z: Operand.t): string = case z of ArrayOffset {base, index, offset, scale, ty} => concat ["X", C.args [Type.toC ty, toString base, toString index, Scale.toString scale, C.bytes offset]] | Cast (z, ty) => concat ["(", Type.toC ty, ")", toString z] | Contents {oper, ty} => contents (ty, toString oper) | Frontier => "Frontier" | GCState => "GCState" | Global g => if Global.isRoot g then concat ["G", C.args [Type.toC (Global.ty g), Int.toString (Global.index g)]] else concat ["GPNR", C.args [Int.toString (Global.index g)]] | Label l => labelToStringIndex l | Null => "NULL" | Offset {base, offset, ty} => concat ["O", C.args [Type.toC ty, toString base, C.bytes offset]] | Real r => RealX.toC r | Register r => concat [Type.name (Register.ty r), "_", Int.toString (Register.index r)] | StackOffset s => StackOffset.toString s | StackTop => "StackTop" | Word w => WordX.toC w in val operandToString = toString end fun fetchOperand (z: Operand.t): string = if handleMisaligned (Operand.ty z) andalso Operand.isMem z then fetch (operandToString z, Operand.ty z) else operandToString z fun outputStatement (s, print) = let datatype z = datatype Statement.t in case s of Noop => () | _ => (print "\t" ; (case s of Move {dst, src} => print (move {dst = operandToString dst, dstIsMem = Operand.isMem dst, src = operandToString src, srcIsMem = Operand.isMem src, ty = Operand.ty dst}) | Noop => () | PrimApp {args, dst, prim} => let fun call (): string = concat [Prim.toString prim, " (", concat (List.separate (Vector.toListMap (args, fetchOperand), ", ")), ")"] fun app (): string = case Prim.name prim of Prim.Name.FFI_Symbol {name, ...} => concat ["((",CType.toString CType.CPointer, ")(&", name, "))"] | _ => call () in case dst of NONE => (print (app ()) ; print ";\n") | SOME dst => print (move {dst = operandToString dst, dstIsMem = Operand.isMem dst, src = app (), srcIsMem = false, ty = Operand.ty dst}) end | ProfileLabel l => C.call ("ProfileLabel", [ProfileLabel.toString l], print) )) end val amTimeProfiling = !Control.profile = Control.ProfileTimeField orelse !Control.profile = Control.ProfileTimeLabel fun outputChunk (chunk as Chunk.T {chunkLabel, blocks, regMax, ...}) = let val {done, print, ...} = outputC () fun declareChunks () = let val {get, ...} = Property.get (ChunkLabel.plist, Property.initFun (fn _ => ref false)) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Transfer.Call {label, ...} => get (labelChunk label) := true | _ => ()) val _ = List.foreach (chunks, fn c as Chunk.T {chunkLabel, ...} => if ! (get chunkLabel) then declareChunk (c, print) else ()) in () end fun declareProfileLabels () = Vector.foreach (blocks, fn Block.T {statements, ...} => Vector.foreach (statements, fn s => case s of Statement.ProfileLabel l => declareProfileLabel (l, print) | _ => ())) (* Count how many times each label is jumped to. *) fun jump l = let val {status, ...} = labelInfo l in case !status of None => status := One | One => status := Many | Many => () end fun force l = #status (labelInfo l) := Many val _ = Vector.foreach (blocks, fn Block.T {kind, label, transfer, ...} => let val _ = if Kind.isEntry kind then jump label else () datatype z = datatype Transfer.t in case transfer of Arith {overflow, success, ...} => (jump overflow; jump success) | CCall {func, return, ...} => if CFunction.maySwitchThreads func then () else Option.app (return, jump) | Call {label, ...} => jump label | Goto dst => jump dst | Raise => () | Return => () | Switch s => Switch.foreachLabel (s, jump) end) fun push (return: Label.t, size: Bytes.t) = (print "\t" ; print (move {dst = (StackOffset.toString (StackOffset.T {offset = Bytes.- (size, Runtime.labelSize ()), ty = Type.label return})), dstIsMem = true, src = operandToString (Operand.Label return), srcIsMem = false, ty = Type.label return}) ; C.push (size, print) ; if amTimeProfiling then print "\tFlushStackTop();\n" else ()) fun copyArgs (args: Operand.t vector): string list * (unit -> unit) = let fun usesStack z = case z of Operand.ArrayOffset {base, index, ...} => (usesStack base) orelse (usesStack index) | Operand.Cast (z, _) => (usesStack z) | Operand.Contents {oper, ...} => (usesStack oper) | Operand.Offset {base, ...} => (usesStack base) | Operand.StackOffset _ => true | _ => false in if Vector.exists (args, usesStack) then let val _ = print "\t{\n" val c = Counter.new 0 val args = Vector.toListMap (args, fn z => if usesStack z then let val ty = Operand.ty z val tmp = concat ["tmp", Int.toString (Counter.next c)] val _ = print (concat ["\t", Type.toC ty, " ", tmp, " = ", fetchOperand z, ";\n"]) in tmp end else fetchOperand z) in (args, fn () => print "\t}\n") end else (Vector.toListMap (args, fetchOperand), fn () => ()) end val tracePrintLabelCode = Trace.trace ("CCodegen.printLabelCode", fn {block, layedOut, ...} => Layout.record [("block", Label.layout (Block.label block)), ("layedOut", Bool.layout (!layedOut))], Unit.layout) fun maybePrintLabel l = if ! (#layedOut (labelInfo l)) then () else gotoLabel l and gotoLabel arg = traceGotoLabel (fn l => let val info as {layedOut, ...} = labelInfo l in if !layedOut then print (concat ["\tgoto ", Label.toString l, ";\n"]) else printLabelCode info end) arg and printLabelCode arg = tracePrintLabelCode (fn {block = Block.T {kind, label = l, live, statements, transfer, ...}, layedOut, status, ...} => let val _ = layedOut := true val _ = case !status of Many => let val s = Label.toString l in print s ; print ":\n" end | _ => () fun pop (fi: FrameInfo.t) = (C.push (Bytes.~ (Program.frameSize (program, fi)), print) ; if amTimeProfiling then print "\tFlushStackTop();\n" else ()) val _ = case kind of Kind.Cont {frameInfo, ...} => pop frameInfo | Kind.CReturn {dst, frameInfo, ...} => (case frameInfo of NONE => () | SOME fi => pop fi ; (Option.app (dst, fn x => let val x = Live.toOperand x val ty = Operand.ty x in print (concat ["\t", move {dst = operandToString x, dstIsMem = Operand.isMem x, src = creturn ty, srcIsMem = false, ty = ty}]) end))) | Kind.Func => () | Kind.Handler {frameInfo, ...} => pop frameInfo | Kind.Jump => () val _ = if 0 = !Control.Native.commented then () else print (let open Layout in toString (seq [str "\t/* live: ", Vector.layout Live.layout live, str " */\n"]) end) val _ = Vector.foreach (statements, fn s => outputStatement (s, print)) val _ = outputTransfer (transfer, l) in () end) arg and outputTransfer (t, source: Label.t) = let fun iff (test, a, b) = (force a ; C.call ("\tBNZ", [test, Label.toString a], print) ; gotoLabel b ; maybePrintLabel a) datatype z = datatype Transfer.t in case t of Arith {prim, args, dst, overflow, success, ...} => let val prim = let datatype z = datatype Prim.Name.t fun const i = case Vector.sub (args, i) of Operand.Word _ => true | _ => false fun const0 () = const 0 fun const1 () = const 1 in case Prim.name prim of Word_addCheck _ => concat [Prim.toString prim, if const0 () then "CX" else if const1 () then "XC" else ""] | Word_mulCheck _ => Prim.toString prim | Word_negCheck _ => Prim.toString prim | Word_subCheck _ => concat [Prim.toString prim, if const0 () then "CX" else if const1 () then "XC" else ""] | _ => Error.bug "CCodegen.outputTransfer: Arith" end val _ = force overflow in print "\t" ; C.call (prim, operandToString dst :: (Vector.toListMap (args, operandToString) @ [Label.toString overflow]), print) ; gotoLabel success ; maybePrintLabel overflow end | CCall {args, frameInfo, func, return} => let val CFunction.T {maySwitchThreads, modifiesFrontier, readsStackTop, return = returnTy, target, writesStackTop,...} = func val (args, afterCall) = case frameInfo of NONE => (Vector.toListMap (args, fetchOperand), fn () => ()) | SOME frameInfo => let val size = Program.frameSize (program, frameInfo) val res = copyArgs args val _ = push (valOf return, size) in res end val _ = if modifiesFrontier then print "\tFlushFrontier();\n" else () val _ = if readsStackTop then print "\tFlushStackTop();\n" else () val _ = print "\t" val _ = if Type.isUnit returnTy then () else print (concat [creturn returnTy, " = "]) datatype z = datatype CFunction.Target.t val _ = case target of Direct name => C.call (name, args, print) | Indirect => let val (fptr,args) = case args of (fptr::args) => (fptr, args) | _ => Error.bug "CCodegen.outputTransfer: CCall,Indirect" val name = concat ["(*(", CFunction.cPointerType func, " ", fptr, "))"] in C.call (name, args, print) end val _ = afterCall () val _ = if modifiesFrontier then print "\tCacheFrontier();\n" else () val _ = if writesStackTop then print "\tCacheStackTop();\n" else () val _ = if maySwitchThreads then print "\tReturn();\n" else Option.app (return, gotoLabel) in () end | Call {label, return, ...} => let val dstChunk = labelChunk label val _ = case return of NONE => () | SOME {return, size, ...} => push (return, size) in if ChunkLabel.equals (labelChunk source, dstChunk) then gotoLabel label else C.call ("\tFarJump", [chunkLabelToString dstChunk, labelToStringIndex label], print) end | Goto dst => gotoLabel dst | Raise => C.call ("\tRaise", [], print) | Return => C.call ("\tReturn", [], print) | Switch switch => let fun bool (test: Operand.t, t, f) = iff (operandToString test, t, f) fun doit {cases: (string * Label.t) vector, default: Label.t option, test: Operand.t}: unit = let val test = operandToString test fun switch (cases: (string * Label.t) vector, default: Label.t): unit = (print "switch (" ; print test ; print ") {\n" ; (Vector.foreach (cases, fn (n, l) => (print "case " ; print n ; print ":\n" ; gotoLabel l))) ; print "default:\n" ; gotoLabel default ; print "}\n") in case (Vector.length cases, default) of (0, NONE) => Error.bug "CCodegen.outputTransfers: Switch" | (0, SOME l) => gotoLabel l | (1, NONE) => gotoLabel (#2 (Vector.sub (cases, 0))) | (_, NONE) => switch (Vector.dropPrefix (cases, 1), #2 (Vector.sub (cases, 0))) | (_, SOME l) => switch (cases, l) end val Switch.T {cases, default, test, ...} = switch fun normal () = doit {cases = Vector.map (cases, fn (c, l) => (WordX.toC c, l)), default = default, test = test} in if 2 = Vector.length cases andalso Option.isNone default then let val (c0, l0) = Vector.sub (cases, 0) val (c1, l1) = Vector.sub (cases, 1) val i0 = WordX.toIntInf c0 val i1 = WordX.toIntInf c1 in if i0 = 0 andalso i1 = 1 then bool (test, l1, l0) else if i0 = 1 andalso i1 = 0 then bool (test, l0, l1) else normal () end else normal () end end fun declareRegisters () = List.foreach (CType.all, fn t => let val pre = concat ["\t", CType.toString t, " ", CType.name t, "_"] in Int.for (0, 1 + regMax t, fn i => print (concat [pre, C.int i, ";\n"])) end) fun outputOffsets () = List.foreach ([("ExnStackOffset", GCField.ExnStack), ("FrontierOffset", GCField.Frontier), ("StackBottomOffset", GCField.StackBottom), ("StackTopOffset", GCField.StackTop)], fn (name, f) => print (concat ["#define ", name, " ", Bytes.toString (GCField.offset f), "\n"])) in outputIncludes (["c-chunk.h"], print) ; outputOffsets () ; declareGlobals ("PRIVATE extern ", print) ; declareFFI (chunk, {print = print}) ; declareChunks () ; declareProfileLabels () ; C.callNoSemi ("Chunk", [chunkLabelToString chunkLabel], print) ; print "\n" ; declareRegisters () ; C.callNoSemi ("ChunkSwitch", [chunkLabelToString chunkLabel], print) ; print "\n" ; Vector.foreach (blocks, fn Block.T {kind, label, ...} => if Kind.isEntry kind then (print "case " ; print (labelToStringIndex label) ; print ":\n" ; gotoLabel label) else ()) ; print "EndChunk\n" ; done () end val additionalMainArgs = [chunkLabelToString chunkLabel, labelToStringIndex label] val {print, done, ...} = outputC () fun rest () = (List.foreach (chunks, fn c => declareChunk (c, print)) ; print "PRIVATE struct cont ( *nextChunks []) () = {" ; Vector.foreach (entryLabels, fn l => let val {chunkLabel, ...} = labelInfo l in print "\t" ; C.callNoSemi ("Chunkp", [chunkLabelToString chunkLabel], print) ; print ",\n" end) ; print "};\n") val _ = outputDeclarations {additionalMainArgs = additionalMainArgs, includes = ["c-main.h"], program = program, print = print, rest = rest} val _ = done () val _ = List.foreach (chunks, outputChunk) in () end end mlton-20100608/mlton/codegen/c-codegen/c-codegen.sig0000644000076600000240000000221111404435624020467 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature C_CODEGEN_STRUCTS = sig structure Ffi: FFI structure Machine: MACHINE sharing Ffi.CFunction = Machine.CFunction end signature C_CODEGEN = sig include C_CODEGEN_STRUCTS val declareFFI: Machine.Chunk.t * {print: string -> unit} -> unit val implementsPrim: 'a Machine.Prim.t -> bool val output: {program: Machine.Program.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit} } -> unit val outputDeclarations: {additionalMainArgs: string list, includes: string list, print: string -> unit, program: Machine.Program.t, rest: unit -> unit } -> unit end mlton-20100608/mlton/codegen/c-codegen/sources.cm0000644000076600000240000000066011404435624020151 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature C_CODEGEN functor CCodegen is ../../atoms/sources.cm ../../control/sources.cm ../../../lib/mlton/sources.cm ../../backend/sources.cm c-codegen.sig c-codegen.fun mlton-20100608/mlton/codegen/c-codegen/sources.mlb0000644000076600000240000000071511404435624020325 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../atoms/sources.mlb ../../control/sources.mlb ../../../lib/mlton/sources.mlb ../../backend/sources.mlb c-codegen.sig c-codegen.fun in signature C_CODEGEN functor CCodegen end mlton-20100608/mlton/codegen/sources.cm0000644000076600000240000000065211404435625016327 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group functor amd64Codegen functor Bytecode functor CCodegen functor x86Codegen is amd64-codegen/sources.cm bytecode/sources.cm c-codegen/sources.cm x86-codegen/sources.cm mlton-20100608/mlton/codegen/sources.mlb0000644000076600000240000000070711404435625016503 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local amd64-codegen/sources.mlb c-codegen/sources.mlb bytecode/sources.mlb x86-codegen/sources.mlb in functor amd64Codegen functor Bytecode functor CCodegen functor x86Codegen end mlton-20100608/mlton/codegen/x86-codegen/0000755000076600000240000000000011404470407016344 5ustar mtfstaffmlton-20100608/mlton/codegen/x86-codegen/peephole.fun0000644000076600000240000003516011404435625020667 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Peephole(T : PEEPHOLE_TYPES): PEEPHOLE = struct open T datatype statement_border = Empty | EmptyOrNonEmpty type statement_element = (int * int option) * (statement_type -> bool) type transfer_element = transfer_type -> bool val One : (statement_type -> bool) -> statement_element = fn p => ((1, SOME 1), p) val All : (statement_type -> bool) -> statement_element = fn p => ((0, NONE), p) type template = {start: statement_border, statements: statement_element list, finish: statement_border, transfer: transfer_element} type match = {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, statements: statement_type list list, finish: statement_type list, transfer: transfer_type} type rewriter = match -> block option type callback = bool -> unit type optimization = {template: template, rewriter: rewriter, callback: callback} datatype match_state = Start of {block: block} | Continue of {remaining: optimization list, match: match} | Done of {block: block} type find_state = {remaining: optimization list, state: {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, finish: statement_type list, transfer: transfer_type}} fun split (l, p) = case l of [] => ([],[]) | l as h::t => if p h then let val (tt,ff) = split (t, p) in (h::tt,ff) end else ([],l) val rec matcher' : {template_statement: statement_element, statement: statement_type list, finish: statement_type list} -> {statement: statement_type list, finish: statement_type list} option = fn (* Zero *) {template_statement = ((0, SOME 0), _), statement, finish} => SOME {statement = List.rev statement, finish = finish} | (* ZeroOrOne *) {template_statement = ((0, SOME 1), p), statement, finish} => (case finish of [] => SOME {statement = List.rev statement, finish = finish} | (statement'::finish') => if p statement' then SOME {statement = List.rev (statement'::statement), finish = finish'} else SOME {statement = List.rev statement, finish = finish}) | (* One *) {template_statement = ((1, SOME 1), p), statement, finish} => (case finish of [] => NONE | (statement'::finish') => if p statement' then SOME {statement = List.rev (statement'::statement), finish = finish'} else NONE) | (* *) {template_statement = ((0, SOME i), p), statement, finish} => (case finish of [] => SOME {statement = List.rev statement, finish = finish} | (statement'::finish') => if p statement' then matcher' {template_statement = ((0, SOME (i-1)), p), statement = statement'::statement, finish = finish'} else SOME {statement = List.rev statement, finish = finish}) | (* All *) {template_statement = ((0, NONE), p), statement, finish} => let val (statement',finish') = split (finish, p) in SOME {statement = List.fold(statement, statement', op ::), finish = finish'} end | {template_statement = ((min, max), p), statement, finish = (statement'::finish')} => if p statement' then matcher' {template_statement = ((Int.max(min-1,0), Option.map(max,fn i => i - 1)), p), statement = statement'::statement, finish = finish'} else NONE | _ => NONE val rec matcher : {template_statements: statement_element list, statements: statement_type list list, finish: statement_type list} -> {statements: statement_type list list, finish: statement_type list} option = fn {template_statements = [], statements, finish} => SOME {statements = List.rev statements, finish = finish} | {template_statements = (template_statement::template_statements), statements, finish} => (case matcher' {template_statement = template_statement, statement = [], finish = finish} of NONE => NONE | SOME {statement, finish} => matcher {template_statements = template_statements, statements = statement::statements, finish = finish}) fun peepholeBlock' {optimizations: optimization list, match_state: match_state} = let fun next {remaining: optimization list, state as {entry, profileLabel, start, finish, transfer}} : find_state option = (case remaining of [] => NONE | _::nil => (case finish of [] => NONE | statement::finish => SOME {remaining = optimizations, state = {entry = entry, profileLabel = profileLabel, start = statement::start, finish = finish, transfer = transfer}}) | _::remaining => SOME {remaining = remaining, state = state}) fun findMatch' (find_state as {remaining as {template = {start = template_start, statements = template_statements, finish = template_finish, transfer = template_transfer}, ...}::_, state = {entry, profileLabel, start, finish, transfer}}) : match_state = let fun loop () = (case next find_state of SOME find_state => findMatch' find_state | NONE => Done {block = T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, finish, op ::), transfer = transfer}}) in if not (template_transfer transfer) then loop () else if template_start = Empty andalso not (List.isEmpty start) then loop () else case matcher {template_statements = template_statements, statements = [], finish = finish} of NONE => loop () | SOME {statements, finish} => if template_finish = Empty andalso not (List.isEmpty finish) then loop () else Continue {remaining = remaining, match = {entry = entry, profileLabel = profileLabel, start = start, statements = statements, finish = finish, transfer = transfer}} end | findMatch' _ = Error.bug "Peephole.peepholeBlock'.findMatch'" fun findMatch (match_state: match_state) : match_state = case match_state of Start {block = T {entry, profileLabel, statements, transfer}} => let val find_state = {remaining = optimizations, state = {entry = entry, profileLabel = profileLabel, start = [], finish = statements, transfer = transfer}} in findMatch' find_state end | Continue {remaining, match = {entry, profileLabel, start, statements, finish, transfer}, ...} => let val finish = List.foldr(statements, finish, op @) val find_state = {remaining = remaining, state = {entry = entry, profileLabel = profileLabel, start = start, finish = finish, transfer = transfer}} in case next find_state of NONE => Done {block = T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, finish, op ::), transfer = transfer}} | SOME find_state => findMatch' find_state end | Done _ => match_state fun peepholeBlock'' {match_state: match_state, changed: bool} = case findMatch match_state of match_state as Continue {remaining = {rewriter, callback, ...}::_, match} => (case rewriter match of SOME block => (callback true; peepholeBlock'' {match_state = Start {block = block}, changed = true}) | NONE => (callback false; peepholeBlock'' {match_state = match_state, changed = changed})) | Done {block} => {block = block, changed = changed} | _ => Error.bug "Peephole.peepholeBlock''" in case optimizations of [] => (case match_state of Start {block = block} => {block = block, changed = false} | _ => Error.bug "Peephole.peepholeBlock'") | _ => peepholeBlock'' {match_state = match_state, changed = false} end fun peepholeBlock {block: block, optimizations: optimization list} = peepholeBlock' {optimizations = optimizations, match_state = Start {block = block}} fun peepholeBlocks {blocks: block list, optimizations: optimization list} = let val {blocks, changed} = List.foldr (blocks, {blocks = [], changed = false}, fn (block,{blocks,changed}) => let val {block = block', changed = changed'} = peepholeBlock' {optimizations = optimizations, match_state = Start {block = block}} in {blocks = block'::blocks, changed = changed orelse changed'} end) in {blocks = blocks, changed = changed} end end mlton-20100608/mlton/codegen/x86-codegen/peephole.sig0000644000076600000240000000407211404435625020657 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PEEPHOLE_TYPES = sig type entry_type type profileLabel_type type statement_type type transfer_type datatype block = T of {entry: entry_type, profileLabel: profileLabel_type, statements: statement_type list, transfer: transfer_type} end signature PEEPHOLE = sig include PEEPHOLE_TYPES datatype statement_border = Empty | EmptyOrNonEmpty type statement_element = (int * int option) * (statement_type -> bool) type transfer_element = transfer_type -> bool val One : (statement_type -> bool) -> statement_element val All : (statement_type -> bool) -> statement_element type template = {start: statement_border, statements: statement_element list, finish: statement_border, transfer: transfer_element} type match = {entry: entry_type, profileLabel: profileLabel_type, start: statement_type list, statements: statement_type list list, finish: statement_type list, transfer: transfer_type} type rewriter = match -> block option type callback = bool -> unit type optimization = {template: template, rewriter: rewriter, callback: callback} val peepholeBlock : {block: block, optimizations: optimization list} -> {block: block, changed: bool} val peepholeBlocks : {blocks: block list, optimizations: optimization list} -> {blocks: block list, changed: bool} end mlton-20100608/mlton/codegen/x86-codegen/sources.cm0000644000076600000240000000175111404435625020357 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group functor x86Codegen is ../../../lib/mlton/sources.cm ../../ast/sources.cm ../../atoms/sources.cm ../../control/sources.cm ../../backend/sources.cm ../c-codegen/sources.cm peephole.sig peephole.fun x86.sig x86.fun x86-pseudo.sig x86-mlton-basic.sig x86-mlton-basic.fun x86-liveness.sig x86-liveness.fun x86-mlton.sig x86-mlton.fun x86-allocate-registers.sig x86-allocate-registers.fun x86-entry-transfer.sig x86-entry-transfer.fun x86-jump-info.sig x86-jump-info.fun x86-loop-info.sig x86-loop-info.fun x86-live-transfers.sig x86-live-transfers.fun x86-generate-transfers.sig x86-generate-transfers.fun x86-simplify.sig x86-simplify.fun x86-translate.sig x86-translate.fun x86-codegen.sig x86-codegen.fun mlton-20100608/mlton/codegen/x86-codegen/sources.mlb0000644000076600000240000000213411404435625020526 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../../lib/mlton/sources.mlb ../../ast/sources.mlb ../../atoms/sources.mlb ../../control/sources.mlb ../../backend/sources.mlb ../c-codegen/sources.mlb peephole.sig peephole.fun x86.sig x86.fun x86-pseudo.sig x86-mlton-basic.sig x86-mlton-basic.fun x86-liveness.sig x86-liveness.fun x86-mlton.sig x86-mlton.fun x86-allocate-registers.sig x86-allocate-registers.fun x86-entry-transfer.sig x86-entry-transfer.fun x86-jump-info.sig x86-jump-info.fun x86-loop-info.sig x86-loop-info.fun x86-live-transfers.sig x86-live-transfers.fun x86-generate-transfers.sig x86-generate-transfers.fun x86-simplify.sig x86-simplify.fun x86-translate.sig x86-translate.fun x86-codegen.sig x86-codegen.fun in functor x86Codegen end mlton-20100608/mlton/codegen/x86-codegen/x86-allocate-registers.fun0000644000076600000240000201052111404435625023276 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86AllocateRegisters(S: X86_ALLOCATE_REGISTERS_STRUCTS) : X86_ALLOCATE_REGISTERS = struct open S open x86 val tracer = x86.tracer val tracerTop = x86.tracerTop fun picRelative () = (* When outputing position-independent-code (PIC), we need to keep * one register pointing at a known local address. Addresses are * then computed relative to this register. *) let datatype z = datatype Control.Format.t datatype z = datatype MLton.Platform.OS.t (* If the ELF symbol is external, we already setup an indirect * mov to load the address. Don't munge the symbol more. *) fun mungeLabelELF l = case Label.toString l of s => if String.hasSuffix (s, { suffix = "@GOT" }) then l else Label.fromString (s ^ "@GOTOFF") (* !!! PIC on darwin not done yet !!! *) (* It will work using %esp -> MLtonLocalBaseSymbol *) fun mungeLabelDarwin l = Label.fromString (Label.toString l ^ "-MLtonLocalBaseSymbol") in case (!Control.Target.os, !Control.positionIndependent) of (* Only darwin and ELF might be using PIC *) (Darwin, true) => (mungeLabelDarwin, SOME Register.esp) | (_, true) => (mungeLabelELF, SOME Register.ebx) | (_, false) => (fn l => l, NONE) end fun track memloc = let val trackClasses = ClassSet.add(ClassSet.+ (!x86MLton.Classes.livenessClasses, !x86MLton.Classes.holdClasses), x86MLton.Classes.StaticNonTemp) in ClassSet.contains(trackClasses, MemLoc.class memloc) end fun volatile memloc = let val volatileClasses = !x86MLton.Classes.volatileClasses in ClassSet.contains(volatileClasses, MemLoc.class memloc) end fun partition(l, p) = let val rec partition' = fn ([],PS) => PS | (h::t,PS) => let val rec partition'' = fn [] => [[h]] | P::PS => if List.exists(P,fn x => p(h, x)) then (h::P)::PS else P::(partition'' PS) in partition'(t,partition'' PS) end in partition'(l,[]) end fun totalOrder (l, plt) = let val rec totalOrder' = fn ([],l) => l | (h::t,l) => let val rec split = fn (lt,t) => case List.splitPrefix (t, fn x => plt(x,h)) of (nil,t) => lt@[h]@t | (lt',t) => split(lt@lt',t) in totalOrder'(t,split([],l)) end in totalOrder'(l,[]) end val bool_lt = fn (false, true) => true | _ => false val bool_gt = fn (true, false) => true | _ => false fun option_lt lt = fn (SOME x, SOME y) => lt (x,y) | (NONE, SOME _) => true | _ => false structure Liveness = struct datatype futureMemlocTag = FLIVE | FCOMMIT | FREMOVE | FDEAD | FUSE | FUSEDEF | FDEF val futureMemlocTag_toString = fn FLIVE => "FLIVE" | FCOMMIT => "FCOMMIT" | FREMOVE => "FREMOVE" | FDEAD => "FDEAD" | FUSE => "FUSE" | FUSEDEF => "FUSEDEF" | FDEF => "FDEF" type futureMemloc = futureMemlocTag * MemLoc.t datatype futureMemlocPredTag = FCOMMITP | FREMOVEP | FDEADP | FMCOMMITP | FMREMOVEP val futureMemlocPredTag_toString = fn FCOMMITP => "FCOMMITP" | FREMOVEP => "FREMOVEP" | FDEADP => "FDEADP" | FMCOMMITP => "FMCOMMITP" | FMREMOVEP => "FMREMOVEP" type futureMemlocPred = futureMemlocPredTag * (MemLoc.t -> bool) datatype future = M of futureMemloc | MP of futureMemlocPred val future_toString = fn (M (tag, memloc)) => concat [futureMemlocTag_toString tag, " ", MemLoc.toString memloc] | (MP (tag, _)) => concat [futureMemlocPredTag_toString tag] type hint = Register.t * MemLoc.t list * MemLocSet.t val hint_toString = fn (register, memlocs, _) => concat ["{ ", List.fold (memlocs, "", fn (memloc, s) => s ^ (MemLoc.toString memloc) ^ " "), "} -> ", Register.toString register] type t = {dead: MemLocSet.t, commit: MemLocSet.t, remove: MemLocSet.t, futures: {pre: future list, post: future list}, hint: hint list} (* fun toString {dead, commit, remove, futures = {pre, post}, hint} = let fun doit (name, l, toString, s) = List.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) fun doit' (name, l, toString, s) = MemLocSet.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) in doit'("dead: ", dead, MemLoc.toString, doit'("commit: ", commit, MemLoc.toString, doit'("remove: ", remove, MemLoc.toString, doit("future (pre): ", List.rev pre, future_toString, doit("future (post): ", List.rev post, future_toString, doit("hint: ", hint, hint_toString, "")))))) end *) fun toComments {dead, commit, remove, futures = {pre, post}, hint} = let fun doit (name, l, toString, ac) = List.fold(l, ac, fn (x, ac) => (Assembly.comment (concat [name, toString x])):: ac) fun doit' (name, l, toString, ac) = MemLocSet.fold(l, ac, fn (x, ac) => (Assembly.comment (concat [name, toString x])):: ac) in doit'("dead: ", dead, MemLoc.toString, doit'("commit: ", commit, MemLoc.toString, doit'("remove: ", remove, MemLoc.toString, doit("future (pre): ", List.rev pre, future_toString, doit("future (post): ", List.rev post, future_toString, doit("hint: ", hint, hint_toString, [])))))) end datatype commit = NO | COMMIT | REMOVE | DEAD fun predict(future, memloc) = let val rec sawNothing = fn [] => if track memloc then DEAD else REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => NO | FCOMMIT => sawCommit future | FREMOVE => sawRemove future | FDEAD => DEAD | FUSE => sawUse future | FUSEDEF => NO | FDEF => DEAD else if ((tag' = FUSEDEF) orelse (tag' = FDEF)) andalso List.exists (MemLoc.utilized memloc, fn memloc'' => MemLoc.mayAlias(memloc'', memloc')) then REMOVE else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawCommit future | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawNothing future else sawNothing future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawCommit future | FREMOVEP => sawRemove future | FDEADP => DEAD | FMCOMMITP => sawCommit future | FMREMOVEP => sawRemove future else sawNothing future and sawCommit = fn [] => REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => COMMIT | FCOMMIT => sawCommit future | FREMOVE => REMOVE | FDEAD => REMOVE | FUSE => COMMIT | FUSEDEF => COMMIT | FDEF => REMOVE else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawCommit future | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawCommit future else sawCommit future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawCommit future | FREMOVEP => REMOVE | FDEADP => REMOVE | FMCOMMITP => sawCommit future | FMREMOVEP => REMOVE else sawCommit future and sawRemove = fn [] => REMOVE | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => REMOVE | FCOMMIT => REMOVE | FREMOVE => sawRemove future | FDEAD => DEAD | FUSE => REMOVE | FUSEDEF => REMOVE | FDEF => DEAD else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => REMOVE | FUSEDEF => REMOVE | FDEF => REMOVE | _ => sawRemove future else sawRemove future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => REMOVE | FREMOVEP => REMOVE | FDEADP => DEAD | FMCOMMITP => REMOVE | FMREMOVEP => sawRemove future else sawRemove future and sawUse = fn [] => if track memloc then NO else COMMIT | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => NO | FCOMMIT => sawUseCommit future | FREMOVE => NO | FDEAD => NO | FUSE => sawUse future | FUSEDEF => NO | FDEF => NO else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawUseCommit future | FUSEDEF => NO | FDEF => NO | _ => sawUse future else sawUse future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawUseCommit future | FREMOVEP => NO | FDEADP => NO | FMCOMMITP => sawUseCommit future | FMREMOVEP => NO else sawUse future and sawUseCommit = fn [] => if track memloc then NO else COMMIT | (M (tag',memloc'))::future => if MemLoc.eq(memloc, memloc') then case tag' of FLIVE => COMMIT | FCOMMIT => sawUseCommit future | FREMOVE => NO | FDEAD => NO | FUSE => COMMIT | FUSEDEF => COMMIT | FDEF => NO else if MemLoc.mayAlias(memloc, memloc') then case tag' of FUSE => sawUseCommit future | FUSEDEF => NO | FDEF => NO | _ => sawUseCommit future else sawUseCommit future | (MP (tag',pred'))::future => if pred' memloc then case tag' of FCOMMITP => sawUseCommit future | FREMOVEP => NO | FDEADP => NO | FMCOMMITP => sawUseCommit future | FMREMOVEP => NO else sawUseCommit future fun check commit = if List.exists (MemLoc.utilized memloc, fn memloc' => case predict (future, memloc') of REMOVE => true | DEAD => true | _ => false) then REMOVE else commit val default = case sawNothing future of REMOVE => REMOVE | DEAD => DEAD | commit => check commit in default end val split = fn (set, p) => MemLocSet.fold (set, (MemLocSet.empty,MemLocSet.empty,MemLocSet.empty,MemLocSet.empty), fn (memloc, (no, commit, remove, dead)) => let val add = fn set => MemLocSet.add(set, memloc) in case p memloc of NO => (add no, commit, remove, dead) | COMMIT => (no, add commit, remove, dead) | REMOVE => (no, commit, add remove, dead) | DEAD => (no, commit, remove, add dead) end) fun liveness {uses: MemLocSet.t, defs: MemLocSet.t, future: future list} : {dead: MemLocSet.t, commit: MemLocSet.t, remove: MemLocSet.t, future: future list} = let local fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) in val allUses = doit'(defs, doit'(uses, uses)) val allDefs = defs end val current = MemLocSet.+(allUses, allDefs) val current_usedef = MemLocSet.intersect(allUses, allDefs) val current_use = MemLocSet.-(allUses, current_usedef) val current_def = MemLocSet.-(allDefs, current_usedef) val (_,commit,remove,dead) = split(current, fn memloc => predict(future, memloc)) val future = let fun doit(memlocs, tag, future) = MemLocSet.fold (memlocs, future, fn (memloc,future) => (M (tag, memloc))::future) in doit(current_use, FUSE, doit(current_usedef, FUSEDEF, doit(current_def, FDEF, future))) end val info = {dead = dead, commit = commit, remove = remove, future = future} in info end fun livenessInstruction {instruction: Instruction.t, future: future list} = let val future_post = future val {uses, defs, ...} = Instruction.uses_defs_kills instruction local fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand, memlocs) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(memlocs, memloc) | NONE => memlocs) in val uses = doit uses val defs = doit defs end val {dead,commit,remove,future} = liveness {uses = uses, defs = defs, future = future_post} val future_pre = future val info = {dead = dead, commit = commit, remove = remove, futures = {pre = future_pre, post = future_post}} in info end fun livenessDirective {directive: Directive.t, future: future list} = let val future_post = future fun addLive (memlocsX, f) = List.fold (memlocsX, future, fn (X, future) => (M (FLIVE, f X))::future) fun addLive' (memlocs) = MemLocSet.fold (memlocs, future, fn (memloc, future) => (M (FLIVE, memloc))::future) val future_pre = case directive of Directive.Reset => [] | Directive.Cache {caches, ...} => addLive(caches, fn {memloc, ...} => memloc) | Directive.FltCache {caches, ...} => addLive(caches, fn {memloc, ...} => memloc) | Directive.Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes, ...} => MemLocSet.fold (commit_memlocs, MemLocSet.fold (remove_memlocs, MemLocSet.fold (dead_memlocs, (MP (FCOMMITP, fn memloc => ClassSet.contains(commit_classes, MemLoc.class memloc))):: (MP (FREMOVEP, fn memloc => ClassSet.contains(remove_classes, MemLoc.class memloc))):: (MP (FDEADP, fn memloc => ClassSet.contains(dead_classes, MemLoc.class memloc))):: future, fn (memloc,future) => (M (FDEAD, memloc))::future), fn (memloc,future) => (M (FREMOVE, memloc))::future), fn (memloc,future) => (M (FCOMMIT, memloc))::future) | Directive.CCall => (MP (FCOMMITP, fn memloc => MemLoc.Class.eq (MemLoc.class memloc, MemLoc.Class.CStack))):: (MP (FMREMOVEP, fn memloc => (not (MemLoc.Class.eq (MemLoc.class memloc, MemLoc.Class.CStack))) andalso (Size.class (MemLoc.size memloc) <> Size.INT))):: future | Directive.Return {returns} => (List.map(returns, fn {dst, ...} => M (FDEF, dst))) @ future | Directive.ClearFlt => (MP (FMREMOVEP, fn memloc => (Size.class (MemLoc.size memloc) <> Size.INT))):: future | Directive.SaveRegAlloc {live, ...} => addLive'(live) | _ => future val info = {dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = future_pre, post = future_post}} in info end fun livenessAssembly {assembly: Assembly.t, future: future list, hint: hint list} : t = let fun default () = {dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = future, post = future}} val {dead, commit, remove, futures} = case assembly of Assembly.Comment _ => default () | Assembly.Directive d => livenessDirective {directive = d, future = future} | Assembly.Instruction i => livenessInstruction {instruction = i, future = future} | Assembly.Label _ => default () | Assembly.PseudoOp _ => default () val hint' = Assembly.hints assembly val hint = List.fold (case assembly of Assembly.Directive Directive.Reset => [] | _ => hint, List.revMap (hint', fn (memloc, register) => (register, [memloc], MemLocSet.empty)), fn ((hint_register,hint_memlocs,hint_ignore),hint) => if List.exists (hint, fn (hint_register',_,_) => Register.coincide(hint_register, hint_register')) then hint else let val hint_memloc = hd hint_memlocs in if List.fold (hint, false, fn ((_,hint_memlocs',_),b) => b orelse List.contains (hint_memlocs', hint_memloc, MemLoc.eq)) then hint else (hint_register, [hint_memloc], MemLocSet.union(dead, hint_ignore))::hint end) val hint = case assembly of (Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc src', dst = Operand.MemLoc dst', ...})) => List.revMap (hint, fn (hint_register,hint_memlocs,hint_ignore) => if List.contains(hint_memlocs, dst', MemLoc.eq) then (hint_register, src'::hint_memlocs, hint_ignore) else (hint_register,hint_memlocs,hint_ignore)) | _ => hint val info = {dead = dead, commit = commit, remove = remove, futures = futures, hint = hint} in info end fun toLiveness (assembly: Assembly.t list) : ((Assembly.t * t) list) = let val {assembly,...} = List.foldr (assembly, {assembly = [], future = [], hint = []}, fn (asm, {assembly,future,hint}) => let val info as {futures = {pre, ...}, hint, ...} = livenessAssembly {assembly = asm, future = future, hint = hint} in {assembly = (asm,info)::assembly, future = pre, hint = hint} end) in assembly end val (toLiveness,toLiveness_msg) = tracer "toLiveness" toLiveness fun toNoLiveness (assembly: Assembly.t list) : ((Assembly.t * t) list) = List.map(assembly, fn asm => (asm,{dead = MemLocSet.empty, commit = MemLocSet.empty, remove = MemLocSet.empty, futures = {pre = [], post = []}, hint = []})) val (toNoLiveness,toNoLiveness_msg) = tracer "toNoLiveness" toNoLiveness end structure RegisterAllocation = struct exception Spill val spill : Int.t ref = ref 0 val spillLabel = Label.fromString "spill" val depth : Int.t ref = ref 0 datatype commit = NO | COMMIT of int | REMOVE of int | TRYCOMMIT of int | TRYREMOVE of int val commit_toString = fn NO => "NO" | COMMIT i => "COMMIT " ^ (Int.toString i) | REMOVE i => "REMOVE " ^ (Int.toString i) | TRYCOMMIT i => "TRYCOMMIT " ^ (Int.toString i) | TRYREMOVE i => "TRYREMOVE " ^ (Int.toString i) type value = {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, commit: commit} fun value_toString {register, memloc, weight, sync, commit} = concat [Register.toString register, " ", MemLoc.toString memloc, " ", Int.toString weight, " ", Bool.toString sync, " ", commit_toString commit] type fltvalue = {fltregister: FltRegister.t, memloc: MemLoc.t, weight: int, sync: bool, commit: commit} fun fltvalue_toString {fltregister, memloc, weight, sync, commit} = concat [FltRegister.toString fltregister, " ", MemLoc.toString memloc, " ", Int.toString weight, " ", Bool.toString sync, " ", commit_toString commit] type t = {entries: value list, reserved: Register.t list, fltstack: fltvalue list} (* fun unique ({entries, fltstack, ...}: t) = let fun check_entries (entries: value list, res) = case entries of [] => res | ({register, memloc, ...})::entries => check_entries (entries, List.foldr (entries, res, fn ({register = register', memloc = memloc', ...}, res) => res andalso (not (Register.coincide (register, register'))) andalso (not (MemLoc.eq (memloc, memloc'))))) fun check_fltstack (fltstack: fltvalue list, res) = case fltstack of [] => res | ({fltregister, memloc, ...})::fltstack => check_fltstack (fltstack, List.foldr (fltstack, res, fn ({fltregister = fltregister', memloc = memloc', ...}, res) => res andalso (not (FltRegister.eq (fltregister, fltregister'))) andalso (not (MemLoc.eq (memloc, memloc'))))) in check_entries(entries, true) andalso check_fltstack(fltstack, true) end *) fun toString ({entries, reserved, fltstack}: t) = let fun doit (name, l, toString, ac) = (name ^ "\n") ^ (List.fold(l, ac, fn (x, ac) => (toString x) ^ "\n" ^ ac)) in doit("entries:", entries, value_toString, doit("reserved:", reserved, Register.toString, doit("fltstack:", fltstack, fltvalue_toString, ""))) end fun toComments ({entries, reserved, fltstack}: t) = let fun doit (name, l, toString, ac) = (Assembly.comment name):: (List.fold(l, ac, fn (x, ac) => (Assembly.comment (toString x)):: ac)) in AppendList.fromList (doit("entries:", entries, value_toString, doit("reserved:", reserved, Register.toString, doit("fltstack:", fltstack, fltvalue_toString, [])))) end val {get = getRA : Directive.Id.t -> {registerAllocation: t}, set = setRA, ...} = Property.getSetOnce (Directive.Id.plist, Property.initRaise ("getRA", fn _ => Layout.empty)) fun empty () : t = {entries = [], reserved = [], fltstack = []} fun reserve' {register: Register.t, registerAllocation = {entries, reserved, fltstack}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = register::reserved, fltstack = fltstack}} fun reserve {registers: Register.t list, registerAllocation = {entries, reserved, fltstack}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = registers @ reserved, fltstack = fltstack}} fun unreserve' {register: Register.t, registerAllocation = {entries, reserved, fltstack}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = List.revRemoveAll (reserved, fn register' => Register.eq (register', register)), fltstack = fltstack}} fun unreserve {registers: Register.t list, registerAllocation = {entries, reserved, fltstack}: t} = {assembly = AppendList.empty, registerAllocation = {entries = entries, reserved = List.revRemoveAll (reserved, fn register' => List.contains (registers, register', Register.eq)), fltstack = fltstack}} fun valueMap {map, registerAllocation = {entries, reserved, fltstack}: t} = {entries = List.revMap(entries, map), reserved = reserved, fltstack = fltstack} fun valueFilter {filter, registerAllocation = {entries, ...}: t} = List.revKeepAll(entries, filter) fun valueRegister {register, registerAllocation} = case valueFilter {filter = fn {register = register', ...} => Register.eq(register, register'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.valueRegister" fun valuesRegister {register = Register.T {reg, ...}, registerAllocation = {entries, ...}: t} = List.revKeepAll(entries, fn {register = Register.T {reg = reg', ...}, ...} => reg = reg') fun fltvalueMap {map, registerAllocation = {entries, reserved, fltstack}: t} = {entries = entries, reserved = reserved, fltstack = List.map(fltstack, map)} fun fltvalueFilter {filter, registerAllocation = {fltstack, ...} :t} = List.keepAll(fltstack, filter) fun update {value as {register,...}, registerAllocation = {entries, reserved, fltstack}: t} = {entries = let val entries = List.revRemoveAll(entries, fn {register = register',...} => Register.eq(register,register')) in value::entries end, reserved = reserved, fltstack = fltstack} fun fltupdate {value as {fltregister, ...}, registerAllocation = {entries, reserved, fltstack}: t} = {entries = entries, reserved = reserved, fltstack = let val rec fltupdate' = fn [] => Error.bug "x86AllocateRegisters.RegisterAllocation.fltupdate" | (value' as {fltregister = fltregister', ...})::l => if FltRegister.eq(fltregister, fltregister') then value::l else value'::(fltupdate' l) in fltupdate' fltstack end} fun delete {register, registerAllocation = {entries, reserved, fltstack}: t} = {entries = List.revRemoveAll(entries, fn {register = register',...} => Register.eq(register, register')), reserved = reserved, fltstack = fltstack} fun deletes {registers, registerAllocation: t} = List.fold(registers, registerAllocation, fn (register, registerAllocation) => delete {register = register, registerAllocation = registerAllocation}) fun fltpush {value, registerAllocation = {entries, reserved, fltstack}: t} = {fltrename = FltRegister.push, registerAllocation = {entries = entries, reserved = reserved, fltstack = case #fltregister value of FltRegister.T 0 => value::(List.map(fltstack, fn {fltregister = FltRegister.T i, memloc, weight, sync, commit} => {fltregister = FltRegister.T (i + 1), memloc = memloc, weight = weight, sync = sync, commit = commit})) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.fltpush"}} fun fltpop {registerAllocation = {entries, reserved, fltstack}: t} = {fltrename = FltRegister.pop, registerAllocation = {entries = entries, reserved = reserved, fltstack = case fltstack of [] => Error.bug "x86AllocateRegisters.RegisterAllocation.fltpop" | _::fltstack => List.map(fltstack, fn {fltregister = FltRegister.T i, memloc, weight, sync, commit} => {fltregister = FltRegister.T (i - 1), memloc = memloc, weight = weight, sync = sync, commit = commit})}} fun fltxch' {fltregister: FltRegister.t, registerAllocation = {entries, reserved, fltstack}: t} = let val rec split = fn (_ : fltvalue list, []) => Error.bug "x86AllocateRegisters.RegisterAllocation.fltxch'.split" | (fltstack_pre,value::fltstack_post) => if FltRegister.eq(fltregister, #fltregister value) then (List.rev fltstack_pre, value, fltstack_post) else split (value::fltstack_pre, fltstack_post) val (fltstack_pre, {fltregister = fltregister', memloc = memloc', weight = weight', sync = sync', commit = commit'}, fltstack_post) = split ([], fltstack) in {fltrename = fn fltregister => if FltRegister.eq(fltregister, fltregister') then FltRegister.top else if FltRegister.eq(fltregister, FltRegister.top) then fltregister' else fltregister, registerAllocation = {entries = entries, reserved = reserved, fltstack = case fltstack_pre of [] => Error.bug "x86AllocateRegisters.RegisterAllocation.fltxch'" | ({fltregister, memloc, weight, sync, commit})::fltstack_pre => ({fltregister = fltregister, memloc = memloc', weight = weight', sync = sync', commit = commit'}):: (List.concat [fltstack_pre, ({fltregister = fltregister', memloc = memloc, weight = weight, sync = sync, commit = commit}):: fltstack_post])}} end fun fltxch {value: fltvalue, registerAllocation: t} = fltxch' {fltregister = #fltregister value, registerAllocation = registerAllocation} fun fltxch1 {registerAllocation: t} = fltxch' {fltregister = FltRegister.one, registerAllocation = registerAllocation} fun allocated {memloc, registerAllocation: t} = case valueFilter {filter = fn {memloc = memloc',...} => MemLoc.eq(memloc,memloc'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocated" fun fltallocated {memloc, registerAllocation: t} = case fltvalueFilter {filter = fn {memloc = memloc',...} => MemLoc.eq(memloc,memloc'), registerAllocation = registerAllocation} of [] => NONE | [value] => SOME value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.fltallocated" fun remove {memloc, registerAllocation: t} = case allocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register, ...} => delete {register = register, registerAllocation = registerAllocation} | NONE => registerAllocation fun removes {memlocs, registerAllocation: t} = List.fold(memlocs, registerAllocation, fn (memloc,registerAllocation) => remove {memloc = memloc, registerAllocation = registerAllocation}) local val commitPush' = fn NO => NO | COMMIT i => COMMIT (i + 1) | REMOVE i => REMOVE (i + 1) | TRYCOMMIT i => TRYCOMMIT (i + 1) | TRYREMOVE i => TRYREMOVE (i + 1) val commitPop' = fn NO => NO | COMMIT i => COMMIT (i - 1) | REMOVE i => REMOVE (i - 1) | TRYCOMMIT i => TRYCOMMIT (i - 1) | TRYREMOVE i => TRYREMOVE (i - 1) in fun commitPush {registerAllocation: t} = valueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPush' commit}, registerAllocation = registerAllocation} fun commitPop {registerAllocation: t} = valueMap {map = fn {register,memloc,weight,sync,commit} => {register = register, memloc = memloc, weight = weight, sync = sync, commit = commitPop' commit}, registerAllocation = registerAllocation} end fun savedRegisters {saves: Operand.t list, registerAllocation: t} : Register.t list = List.concatMap (saves, fn Operand.MemLoc m => (case allocated {memloc = m, registerAllocation = registerAllocation} of SOME {register, ...} => [register] | NONE => []) | Operand.Register r => [r] | Operand.Address (Address.T {base, index, ...}) => (case (base, index) of (NONE, NONE ) => [] | (SOME rb, NONE ) => [rb] | (NONE, SOME ro) => [ro] | (SOME rb, SOME ro) => [rb,ro]) | _ => []) fun supportedRegisters {supports: Operand.t list, registerAllocation: t} : Register.t list = let fun supportedRegisters' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, fltallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME {register, ...}, _) => [register] | (_, SOME _) => [] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedRegisters') in List.concatMap (supports, fn Operand.MemLoc m => supportedRegisters' m | _ => []) end fun supportedMemLocs {supports: Operand.t list, registerAllocation: t} : MemLoc.t list = let fun supportedMemLocs' memloc = case (allocated {memloc = memloc, registerAllocation = registerAllocation}, fltallocated {memloc = memloc, registerAllocation = registerAllocation}) of (SOME _, _) => [memloc] | (_, SOME _) => [memloc] | (NONE, NONE) => List.concatMap(MemLoc.utilized memloc, supportedMemLocs') in List.concatMap (supports, fn Operand.MemLoc m => supportedMemLocs' m | _ => []) end fun fltsavedMemLocs {saves: Operand.t list, registerAllocation: t} : MemLoc.t list = List.revKeepAllMap (saves, fn Operand.MemLoc m => (case fltallocated {memloc = m, registerAllocation = registerAllocation} of SOME _ => SOME m | NONE => NONE) | _ => NONE) fun fltsupportedMemLocs {supports: Operand.t list, registerAllocation: t} : MemLoc.t list = List.revKeepAllMap (supports, fn Operand.MemLoc m => (case fltallocated {memloc = m, registerAllocation = registerAllocation} of SOME _ => SOME m | NONE => NONE) | _ => NONE) fun 'a spillAndReissue {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t, spiller : {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} -> {assembly: Assembly.t AppendList.t, registerAllocation: t}, msg : string, reissue : {assembly: Assembly.t AppendList.t, registerAllocation: t} -> 'a} : 'a = (Int.dec depth; if !depth = 0 then let val _ = Int.inc depth val {assembly, registerAllocation} = spiller {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val return = reissue {assembly = assembly, registerAllocation = registerAllocation} handle Spill => (Error.bug (concat [msg, ":reSpill"])) val _ = Int.dec depth in return end else raise Spill) fun potentialRegisters ({size, force, ...}: {size: Size.t, saves: Operand.t list, force: Register.t list, registerAllocation: t}): Register.t list = case force of [] => Register.registers size | registers => List.revKeepAll(Register.registers size, fn register => List.contains(registers, register, Register.eq)) fun chooseRegister {info = {futures = {pre = future, ...}, hint,...}: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation as {reserved,...}: t} : {register: Register.t, coincide_values: value list} = let val registers = potentialRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} val saved = savedRegisters {saves = saves, registerAllocation = registerAllocation} val preserved = let fun doit(registers, preserved) = List.fold (registers, preserved, fn (register,preserved) => if List.contains(preserved, register, Register.eq) then preserved else register::preserved) in doit(saved, doit(reserved, [])) end val registers = List.revRemoveAll (registers, fn register' => List.exists (preserved, fn register'' => Register.coincide(register',register''))) val supported = supportedRegisters {supports = supports, registerAllocation = registerAllocation} val values = valueFilter {filter = fn _ => true, registerAllocation = registerAllocation} val memlocs = List.revMap(values, #memloc) val registers_costs = List.revMap (registers, fn register' => let val hint_cost = List.fold (hint, 0, fn ((hint_register,hint_memlocs,hint_ignore), hint_cost) => if Register.eq(register', hint_register) then case memloc of SOME memloc => (case (List.contains (hint_memlocs, memloc, MemLoc.eq), MemLocSet.contains (hint_ignore, memloc)) of (true, _) => hint_cost + 5 | (false, true) => hint_cost | (false, false) => hint_cost - 5) | NONE => hint_cost - 5 else if Register.coincide(register', hint_register) then hint_cost - 5 else hint_cost) val values = valuesRegister {register = register', registerAllocation = registerAllocation} val (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost) = List.fold (values, (false,false,NONE,0,true,0), fn ({register,memloc,weight,sync,commit,...}, cost as (support_cost, commit_cost, future_cost, utilized_cost, sync_cost, weight_cost)) => if Register.coincide(register,register') then let val support_cost' = List.contains(supported, register, Register.eq) val commit_cost' = case commit of TRYREMOVE _ => false | REMOVE _ => false | _ => true val future_cost' = List.index (future, fn Liveness.M (tag, memloc') => let val eq = MemLoc.eq(memloc, memloc') in case tag of Liveness.FLIVE => eq | Liveness.FUSE => eq | Liveness.FUSEDEF => eq | _ => false end | _ => false) val utilized_cost' = List.fold (memlocs, 0, fn (memloc',uc') => List.fold (MemLoc.utilized memloc', 0, fn (memloc'',uc'') => if MemLoc.eq (memloc, memloc'') then uc'' + 1 else uc'') + uc') val sync_cost' = sync val weight_cost' = weight in (support_cost orelse support_cost', commit_cost orelse commit_cost', case (future_cost,future_cost') of (_, NONE) => future_cost | (NONE, _) => future_cost' | (SOME f,SOME f') => SOME (Int.min(f,f')), utilized_cost + utilized_cost', sync_cost andalso sync_cost', weight_cost + weight_cost') end else cost) in (register', (support_cost, commit_cost, future_cost, hint_cost, utilized_cost, sync_cost, weight_cost)) end) val registers_costs_sorted = List.insertionSort (registers_costs, fn ((_,(support_c1, commit_c1, future_c1, hint_c1, utilized_c1, sync_c1, weight_c1)), (_,(support_c2, commit_c2, future_c2, hint_c2, utilized_c2, sync_c2, weight_c2))) => bool_lt(support_c1,support_c2) orelse (support_c1 = support_c2 andalso (bool_lt(commit_c1,commit_c2) orelse (commit_c1 = commit_c2 andalso (option_lt (op >) (future_c1, future_c2) orelse (future_c1 = future_c2 andalso (hint_c1 > hint_c2 orelse (hint_c1 = hint_c2 andalso (utilized_c1 < utilized_c2 orelse (utilized_c1 = utilized_c2 andalso (bool_gt(sync_c1,sync_c2) orelse (sync_c1 = sync_c2 andalso weight_c1 < weight_c2)))))))))))) val registers = List.map(registers_costs_sorted, #1) val register = case registers of [] (* => raise Spill *) => let fun listToString(ss: string list): string = "[" ^ (concat(List.separate(ss, ", "))) ^ "]" val size = Size.toString size val supports = listToString(List.map(supports,Operand.toString)) val saves = listToString(List.map(saves,Operand.toString)) val force = listToString(List.map(force,Register.toString)) val reserved = listToString(List.map(reserved,Register.toString)) val msg = concat["\n", "chooseRegister:\n", (toString registerAllocation), "size = ", size, "\n", "supports = ", supports, "\n", "saves = ", saves, "\n", "force = ", force, "\n", "reserved = ", reserved, "\n", "depth = ", Int.toString (!depth), "\n"] val _ = print msg in print "Raising Spill in chooseRegister\n"; raise Spill end | register::_ => register val values = valuesRegister {register = register, registerAllocation = registerAllocation} val coincide_values = List.revKeepAll(values, fn {register = register',...} => Register.coincide(register',register)) in {register = register, coincide_values = coincide_values} end fun freeRegister ({info: Liveness.t, memloc: MemLoc.t option, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t}) : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, coincide_values} = chooseRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val supported = supportedMemLocs {supports = supports, registerAllocation = registerAllocation} fun supportRemove memloc = let fun supportRemove' memlocs = List.concatMap (memlocs, fn memloc' => if MemLoc.eq(memloc,memloc') then [] else supportRemove' (MemLoc.utilized memloc')) in List.fold (supports, [], fn (Operand.MemLoc memloc', supports) => List.concat [(supportRemove' [memloc']), supports] | (_, supports) => supports) end val {assembly = assembly_support, registerAllocation} = List.fold (coincide_values, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc,...}, {assembly, registerAllocation}) => if List.contains(supported, memloc, MemLoc.eq) then let val supports = supportRemove memloc val force = List.revRemoveAll (Register.registers (MemLoc.size memloc), fn register' => Register.coincide(final_register, register')) val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = (Operand.register final_register)::saves, force = force, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end else {assembly = assembly, registerAllocation = registerAllocation}) val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if Register.coincide(register, final_register) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val _ = Int.dec depth in {register = final_register, assembly = AppendList.appends [assembly_support, assembly_commit], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "freeRegister", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = freeRegister {info = info, memloc = memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and freeFltRegister {info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = let val info as {futures = {pre = future, ...},...} = info val values = fltvalueFilter {filter = fn _ => true, registerAllocation = registerAllocation} in if List.length values >= FltRegister.total then let val saved = fltsavedMemLocs {saves = saves, registerAllocation = registerAllocation} val supported = fltsupportedMemLocs {supports = supports, registerAllocation = registerAllocation} val values = List.revRemoveAll(values, fn {memloc,...} => List.contains(saved, memloc, MemLoc.eq)) val values_costs = List.revMap (values, fn value as {memloc,weight,sync,commit,...} => let val support_cost = List.contains(supported, memloc, MemLoc.eq) val commit_cost = case commit of TRYREMOVE _ => false | REMOVE _ => false | _ => true val future_cost = List.index (future, fn Liveness.M (tag, memloc') => let val eq = MemLoc.eq(memloc, memloc') in case tag of Liveness.FLIVE => eq | Liveness.FUSE => eq | Liveness.FUSEDEF => eq | _ => false end | _ => false) val sync_cost = sync val weight_cost = weight in (value, (support_cost, commit_cost, future_cost, sync_cost, weight_cost)) end) val values_costs_sorted = List.insertionSort (values_costs, fn ((_,(support_c1, commit_c1, future_c1, sync_c1, weight_c1)), (_,(support_c2, commit_c2, future_c2, sync_c2, weight_c2))) => bool_lt(support_c1,support_c2) orelse (support_c1 = support_c2 andalso (bool_lt(commit_c1,commit_c2) orelse (commit_c1 = commit_c2 andalso (option_lt (op >) (future_c1, future_c2) orelse (future_c1 = future_c2 andalso (bool_gt(sync_c1,sync_c2) orelse (sync_c1 = sync_c2 andalso weight_c1 < weight_c2)))))))) val values = List.map(values_costs_sorted, #1) in case values of [] => Error.bug "x86AllocateRegisters.RegisterAllocation.freeFltRegister" | {fltregister, memloc, weight, sync, ...}::_ => let val registerAllocation = fltupdate {value = {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0}, registerAllocation = registerAllocation} val {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation} = commitFltRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation = registerAllocation} end end else {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "freeFltRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, fltrename, registerAllocation} = freeFltRegister {info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), fltrename = fltrename, registerAllocation = registerAllocation} end} and commitRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation as {reserved,...}: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val commit_values = valueFilter {filter = fn {commit = COMMIT 0, ...} => true | {commit = REMOVE 0, ...} => true | {commit = TRYCOMMIT 0, ...} => true | {commit = TRYREMOVE 0, ...} => true | _ => false, registerAllocation = registerAllocation} val commit_memlocs = List.revMap(commit_values, #memloc) val commit_memlocs = totalOrder (commit_memlocs, fn (memloc1,memloc2) => List.contains(MemLoc.utilized memloc1, memloc2, MemLoc.eq)) val {assembly = assembly_commit, registerAllocation} = List.fold (commit_memlocs, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (memloc, {assembly, registerAllocation}) => (case allocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => {assembly = assembly, registerAllocation = registerAllocation} | SOME ({register, memloc, weight, sync, commit}) => let fun doCommitFalse () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = commitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.register register)::saves, Operand.eq) val size = Register.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = commitPop {registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.Address address, src = Operand.Register register, size = size})], registerAllocation = registerAllocation} end fun doCommitTrue () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end fun doRemoveFalse () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = commitPush {registerAllocation = registerAllocation} val commit_saves = List.removeDuplicates ((Operand.register register)::saves, Operand.eq) val size = Register.size register val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = commit_saves, registerAllocation = registerAllocation} val registerAllocation = commitPop {registerAllocation = registerAllocation} val registerAllocation = if List.contains (reserved, register, Register.eq) then registerAllocation else remove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.Address address, src = Operand.Register register, size = size})], registerAllocation = registerAllocation} end fun doRemoveTrue () = let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} val registerAllocation = if List.contains (reserved, register, Register.eq) then registerAllocation else remove {memloc = memloc, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end in case (commit,sync) of (COMMIT 0, false) => doCommitFalse () | (COMMIT 0, true) => doCommitTrue () | (REMOVE 0, false) => doRemoveFalse () | (REMOVE 0, true) => doRemoveTrue () | (TRYCOMMIT 0, false) => doCommitFalse () | (TRYCOMMIT 0, true) => doCommitTrue () | (TRYREMOVE 0, false) => doRemoveFalse () | (TRYREMOVE 0, true) => doRemoveTrue () | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitRegisters" end)) val _ = Int.dec depth in {assembly = assembly_commit, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "commitRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and commitFltRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = let val _ = Int.inc depth val commit_values = fltvalueFilter {filter = fn {commit = COMMIT 0, ...} => true | {commit = REMOVE 0, ...} => true | {commit = TRYCOMMIT 0, ...} => true | {commit = TRYREMOVE 0, ...} => true | _ => false, registerAllocation = registerAllocation} val {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation} = List.fold (commit_values, {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation}, fn ({fltregister, memloc, weight, sync, commit}, {assembly, fltrename, registerAllocation}) => let fun doCommitFalse () = let val fltregister = fltrename fltregister val {assembly = assembly_xch, fltrename = fltrename_xch, registerAllocation} = if FltRegister.eq(fltregister, FltRegister.top) then {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} else let val {fltrename = fltrename_xch, registerAllocation} = fltxch' {fltregister = fltregister, registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}), fltrename = fltrename_xch, registerAllocation = registerAllocation} end val size = MemLoc.size memloc val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val registerAllocation = fltupdate {value = {fltregister = FltRegister.top, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_xch, assembly_address, case Size.class size of Size.FLT => AppendList.single (Assembly.instruction_fst {dst = Operand.Address address, size = size, pop = false}) | Size.FPI => AppendList.single (Assembly.instruction_fist {dst = Operand.Address address, size = size, pop = false}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitFltRegisters"], fltrename = fltrename_xch o fltrename, registerAllocation = registerAllocation} end fun doCommitTrue () = let val fltregister = fltrename fltregister val registerAllocation = fltupdate {value = {fltregister = fltregister, memloc = memloc, weight = weight, sync = true, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} end fun doRemoveFalse () = let val fltregister = fltrename fltregister val {assembly = assembly_xch, fltrename = fltrename_xch, registerAllocation} = if FltRegister.eq(fltregister, FltRegister.top) then {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} else let val {fltrename = fltrename_xch, registerAllocation} = fltxch' {fltregister = fltregister, registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}), fltrename = fltrename_xch, registerAllocation = registerAllocation} end val size = MemLoc.size memloc val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val {fltrename = fltrename_pop, registerAllocation} = fltpop {registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_xch, assembly_address, case Size.class size of Size.FLT => AppendList.single (Assembly.instruction_fst {dst = Operand.Address address, size = size, pop = true}) | Size.FPI => AppendList.single (Assembly.instruction_fist {dst = Operand.Address address, size = size, pop = true}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitFltRegisters"], fltrename = fltrename_pop o fltrename_xch o fltrename, registerAllocation = registerAllocation} end fun doRemoveTrue () = let val fltregister = fltrename fltregister val {assembly = assembly_xch, fltrename = fltrename_xch, registerAllocation} = if FltRegister.eq(fltregister, FltRegister.top) then {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} else let val {fltrename = fltrename_xch, registerAllocation} = fltxch' {fltregister = fltregister, registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}), fltrename = fltrename_xch, registerAllocation = registerAllocation} end val {fltrename = fltrename_pop, registerAllocation} = fltpop {registerAllocation = registerAllocation} val size = MemLoc.size memloc in {assembly = AppendList.appends [assembly, assembly_xch, case Size.class size of Size.FLT => AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = size, pop = true}) | Size.FPI => AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = Size.DBLE, pop = true}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitFltRegisters"], fltrename = fltrename_pop o fltrename_xch o fltrename, registerAllocation = registerAllocation} end fun doNothing () = {assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} in case (commit,sync) of (COMMIT 0, false) => doCommitFalse () | (COMMIT 0, true) => doCommitTrue () | (REMOVE 0, false) => doRemoveFalse () | (REMOVE 0, true) => doRemoveTrue () | (TRYCOMMIT 0, false) => if FltRegister.eq(fltrename fltregister, FltRegister.top) then doCommitFalse () else doNothing () | (TRYCOMMIT 0, true) => if FltRegister.eq(fltrename fltregister, FltRegister.top) then doCommitTrue () else doNothing () | (TRYREMOVE 0, false) => if FltRegister.eq(fltrename fltregister, FltRegister.top) then doRemoveFalse () else doNothing () | (TRYREMOVE 0, true) => if FltRegister.eq(fltrename fltregister, FltRegister.top) then doRemoveTrue () else doNothing () | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.commitFltRegisters" end) val _ = Int.dec depth in {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "commitFltRegisters", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {assembly, fltrename, registerAllocation} = commitFltRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_spill, assembly), fltrename = fltrename, registerAllocation = registerAllocation} end} and spillRegisters {info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val spillStart = !spill val {reserved, ...} = registerAllocation val {assembly = assembly_unreserve, registerAllocation} = List.fold (reserved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val saved = savedRegisters {saves = saves, registerAllocation = registerAllocation} val saved = List.fold (reserved, saved, fn (register,saved) => if List.contains(saved,register,Register.eq) then saved else register::saved) val saves = valueFilter {filter = fn {register, ...} => List.contains(saved, register, Register.eq), registerAllocation = registerAllocation} val all = valueFilter {filter = fn _ => true, registerAllocation = registerAllocation} (* partition the values in the register file * by their base register. *) val groups = partition (all, fn ({register = Register.T {reg = reg1, ...},...}, {register = Register.T {reg = reg2, ...},...}) => reg1 = reg2) (* order the groups by number of registers used *) val groups = List.insertionSort (groups, fn (g1,g2) => (List.length g1) < (List.length g2)) (* choose four registers to spill *) val spills = case groups of g1::g2::g3::g4::_ => List.concat [g1,g2,g3,g4] | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.spillRegisters" (* totally order the spills by utilization *) val spills = totalOrder (spills, fn ({memloc = memloc1, ...}, {memloc = memloc2, ...}) => List.contains(MemLoc.utilized memloc2, memloc1, MemLoc.eq)) fun mkReplacer (spillMap : (value * MemLoc.t) list) = fn memloc' => case List.peek(spillMap, fn ({memloc,...},_) => MemLoc.eq(memloc,memloc')) of SOME (_,spillMemloc) => spillMemloc | NONE => memloc' (* associate each spilled value with a spill slot *) val (spillMap, spillEnd) = List.fold (spills, ([], spillStart), fn (value as {memloc, ...}, (spillMap, spillEnd)) => let val spillMemLoc = MemLoc.imm {base = Immediate.label spillLabel, index = Immediate.int spillEnd, scale = x86MLton.wordScale, size = MemLoc.size memloc, class = x86MLton.Classes.Temp} in ((value,spillMemLoc)::spillMap, spillEnd + 1) end) val replacer = mkReplacer spillMap (* commit everything in the register file; * also replace all memlocs that are spilled with their spill slot *) val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => if List.exists (spillMap, fn ({memloc = memloc',...},_) => MemLoc.eq(memloc,memloc')) then {register = register, memloc = MemLoc.replace replacer memloc, weight = weight, sync = false, commit = NO} else {register = register, memloc = MemLoc.replace replacer memloc, weight = weight, sync = sync, commit = case commit of NO => COMMIT 0 | COMMIT _ => COMMIT 0 | TRYCOMMIT _ => COMMIT 0 | REMOVE _ => REMOVE 0 | TRYREMOVE _ => REMOVE 0}, registerAllocation = registerAllocation} (* update next available spill slot for cascading spills *) val _ = spill := spillEnd (* commit everything; * since the spilt memlocs look like they are spill slots, * they can all be committed to memory without any additional * registers. *) val {assembly = assembly_commit1, registerAllocation = registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} (* unspill; as we pull values in, we update the memloc to what it * looks under the pending unspills, and then replace any occurences * of the spill slot with the updated memloc; * by the time we are done, everything should be mapped back to * its original form. *) val {assembly = assembly_unspill, registerAllocation = registerAllocation} = let val rec doit = fn ([],{assembly,registerAllocation}) => {assembly = assembly, registerAllocation = registerAllocation} | (({memloc, weight, sync, commit, ...}, spillMemLoc)::spillMap, {assembly, registerAllocation}) => let val replacer = mkReplacer spillMap val memloc' = MemLoc.replace replacer memloc val {register, assembly = assembly_unspill, registerAllocation} = toRegisterMemLoc {memloc = spillMemLoc, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc', weight = weight, sync = sync, commit = case commit of NO => COMMIT 0 | COMMIT _ => COMMIT 0 | TRYCOMMIT _ => COMMIT 0 | REMOVE _ => REMOVE 0 | TRYREMOVE _ => REMOVE 0}, registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => {register = register, memloc = MemLoc.replace (fn memloc'' => if MemLoc.eq (memloc'', spillMemLoc) then memloc' else memloc'') memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in doit(spillMap, {assembly = AppendList.append (assembly, assembly_unspill), registerAllocation = registerAllocation}) end in doit(spillMap, {assembly = AppendList.empty, registerAllocation = registerAllocation}) end (* everything is unspilled *) val _ = spill := spillStart (* commit all the memlocs that got spilled. *) val {assembly = assembly_commit2, registerAllocation = registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val _ = spill := spillStart (* restore the saved operands to their previous locations. *) val {assembly = assembly_restore, registerAllocation} = List.fold (saves, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, commit, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = memloc, info = info, size = Register.size register, move = true, supports = supports, saves = [], force = [register], registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_register, assembly_reserve], registerAllocation = registerAllocation} end) val {assembly = assembly_unreserve', registerAllocation} = List.fold (saved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve', registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve'), registerAllocation = registerAllocation} end) val {assembly = assembly_reserve, registerAllocation} = List.fold (reserved, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val _ = Int.dec depth in {assembly = AppendList.appends [assembly_unreserve, assembly_commit1, assembly_unspill, assembly_commit2, assembly_restore, assembly_unreserve', assembly_reserve], registerAllocation = registerAllocation} end and toRegisterMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (case allocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {register,memloc,weight,sync,commit} => let val registers = potentialRegisters {size = size, saves = saves, force = force, registerAllocation = registerAllocation} in if List.contains(registers, register, Register.eq) then {register = register, assembly = AppendList.empty, registerAllocation = registerAllocation} else let val {register = final_register, coincide_values} = chooseRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val {memloc, sync, registerAllocation} = if List.contains(saves, Operand.register final_register, Operand.eq) orelse List.contains(saves, Operand.memloc memloc, Operand.eq) then {memloc = MemLoc.imm {base = Immediate.label (Label.fromString "BUG"), index = Immediate.zero, scale = Scale.One, size = MemLoc.size memloc, class = MemLoc.Class.Temp}, sync = true, registerAllocation = registerAllocation} else {memloc = memloc, sync = sync, registerAllocation = delete {register = register, registerAllocation = registerAllocation}} in case coincide_values of [] => if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.empty, registerAllocation = registerAllocation} end | [{register = register', memloc = memloc', weight = weight', sync = sync', commit = commit'}] => if Register.eq(register',final_register) then let val registerAllocation = delete {register = register', registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc', weight = weight', sync = sync', commit = commit'}, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_xchg {src = Operand.register register, dst = Operand.register final_register, size = size}), registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.register final_register, dst = Operand.register register, size = size}), registerAllocation = registerAllocation} end end else let val {register = final_register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end | _ => let val {register = final_register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = (Operand.register register)::saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} in if move then let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = AppendList.appends [assembly_register, AppendList.single (Assembly.instruction_mov {src = Operand.register register, dst = Operand.register final_register, size = size})], registerAllocation = registerAllocation} end else let val registerAllocation = update {value = {register = final_register, memloc = memloc, weight = weight, sync = true, commit = commit}, registerAllocation = registerAllocation} in {register = final_register, assembly = assembly_register, registerAllocation = registerAllocation} end end end end | NONE => if move then case MemLoc.size memloc of Size.BYTE => let val {register = register', assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = (Operand.memloc memloc):: supports, saves = saves, force = [], registerAllocation = registerAllocation} val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = (Operand.register register'):: saves, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_register, assembly_address, AppendList.single (Assembly.instruction_mov {dst = Operand.register register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end | _ => let val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val saves' = case address of Address.T {base = SOME base', index = SOME index', ...} => (Operand.register base'):: (Operand.register index')::saves | Address.T {base = SOME base', ...} => (Operand.register base')::saves | Address.T {index = SOME index', ...} => (Operand.register index')::saves | _ => saves val {register = register', assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves', force = [], registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register', memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val {register, assembly = assembly_force, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.appends [assembly_address, assembly_register, AppendList.single (Assembly.instruction_mov {dst = Operand.register register', src = Operand.address address, size = size}), assembly_force], registerAllocation = registerAllocation} end else let val {register, assembly = assembly_register, registerAllocation} = freeRegister {info = info, memloc = SOME memloc, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val registerAllocation = remove {memloc = memloc, registerAllocation = registerAllocation} val registerAllocation = update {value = {register = register, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} in {register = register, assembly = assembly_register, registerAllocation = registerAllocation} end) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toRegisterMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toFltRegisterMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, top: bool option, registerAllocation: t} : {fltregister: FltRegister.t, assembly: Assembly.t AppendList.t, fltrename : FltRegister.t -> FltRegister.t, registerAllocation: t} = (Int.inc depth; (case fltallocated {memloc = memloc, registerAllocation = registerAllocation} of SOME (value as {fltregister,memloc,weight,sync,commit}) => (case (FltRegister.eq(fltregister, FltRegister.top), top) of (true, NONE) => let val {fltrename = fltrename_pop, registerAllocation} = fltpop {registerAllocation = registerAllocation} val assembly_pop = AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = size, pop = true}) val {registerAllocation, ...} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {fltregister = FltRegister.top, assembly = assembly_pop, fltrename = fltrename_pop, registerAllocation = registerAllocation} end | (false, NONE) => let val {fltrename = fltrename_xch, registerAllocation} = fltxch {value = value, registerAllocation = registerAllocation} val assembly_xch = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}) val {fltrename = fltrename_pop, registerAllocation} = fltpop {registerAllocation = registerAllocation} val assembly_pop = AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = size, pop = true}) val {registerAllocation, ...} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in {fltregister = FltRegister.top, assembly = AppendList.append (assembly_xch, assembly_pop), fltrename = fltrename_pop o fltrename_xch, registerAllocation = registerAllocation} end | (false, SOME true) => let val {fltrename = fltrename_xch, registerAllocation} = fltxch {value = value, registerAllocation = registerAllocation} val assembly_xch = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister}) in {fltregister = FltRegister.top, assembly = assembly_xch, fltrename = fltrename_xch, registerAllocation = registerAllocation} end | (_, SOME _) => {fltregister = fltregister, assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation}) | NONE => (case (top, move) of (NONE, _) => let val {assembly = assembly_free, fltrename = fltrename_free, registerAllocation = registerAllocation} = freeFltRegister {info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val {registerAllocation, ...} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} in {fltregister = FltRegister.top, assembly = assembly_free, fltrename = fltrename_free, registerAllocation = registerAllocation} end | (SOME _, true) => let val {assembly = assembly_free, fltrename = fltrename_free, registerAllocation = registerAllocation} = freeFltRegister {info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} val {fltrename = fltrename_push, registerAllocation} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = 1024, sync = true, commit = NO}, registerAllocation = registerAllocation} val assembly_load = case Size.class size of Size.FLT => AppendList.single (Assembly.instruction_fld {src = Operand.address address, size = size}) | Size.FPI => AppendList.single (Assembly.instruction_fild {src = Operand.address address, size = size}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.toFltRegisterMemLoc: size" in {fltregister = FltRegister.top, assembly = AppendList.appends [assembly_free, assembly_address, assembly_load], fltrename = fltrename_push o fltrename_free, registerAllocation = registerAllocation} end | (SOME _, false) => Error.bug "x86AllocateRegisters.RegisterAllocation.toFltRegisterMemLoc: (top, move)")) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toFltRegisterMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {fltregister, assembly, fltrename, registerAllocation} = toFltRegisterMemLoc {memloc = memloc, info = info, size = size, move = move, supports = supports, saves = saves, top = top, registerAllocation = registerAllocation} in {fltregister = fltregister, assembly = AppendList.append (assembly_spill, assembly), fltrename = fltrename, registerAllocation = registerAllocation} end} and toAddressMemLoc {memloc: MemLoc.t, info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {address: Address.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = (Int.inc depth; (let val MemLoc.U {immBase, memBase, immIndex, memIndex, scale, ...} = MemLoc.destruct memloc (* If PIC, find labels with RBX-relative addressing. * It's bigger and slower, so only use it if we must. *) val (mungeLabel, base) = picRelative () val disp = case (immBase, immIndex) of (NONE, NONE) => Immediate.zero | (SOME immBase, NONE) => (case Immediate.destruct immBase of Immediate.Word _ => immBase | Immediate.Label l => Immediate.label (mungeLabel l) | Immediate.LabelPlusWord (l, w) => Immediate.labelPlusWord (mungeLabel l, w)) | (NONE, SOME immIndex) => (case Immediate.destruct immIndex of Immediate.Word _ => immIndex | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.toAddressMemLoc:indexLabel") | (SOME immBase, SOME immIndex) => (case (Immediate.destruct immBase, Immediate.destruct immIndex) of (Immediate.Label l1, Immediate.Word w2) => Immediate.labelPlusWord (mungeLabel l1, w2) | (Immediate.LabelPlusWord (l1, w1), Immediate.Word w2) => Immediate.labelPlusWord (mungeLabel l1, WordX.add (w1, w2)) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.toAddressMemLoc:disp") val {register = register_base, assembly = assembly_base, registerAllocation} = case (Immediate.destruct disp, memBase) of (Immediate.Word _, NONE) => {register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} | (Immediate.Word _, SOME memBase) (* no label, no PIC *) => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memBase, info = info, size = MemLoc.size memBase, move = true, supports = case memIndex of NONE => supports | SOME memIndex => (Operand.memloc memIndex):: supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in {register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end | (_, SOME _) (* label & memBase? bad input *) => Error.bug "x86AllocateRegisters.RegisterAllocation.toAddressMemLoc:base*2" | (_, NONE) (* label only -> use PIC if needed *) => {register = base, assembly = AppendList.empty, registerAllocation = registerAllocation} val {register = register_index, assembly = assembly_index, registerAllocation} = case memIndex of NONE => {register = NONE, assembly = AppendList.empty, registerAllocation = registerAllocation} | SOME memIndex => let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = memIndex, info = info, size = MemLoc.size memIndex, move = true, supports = supports, saves = case (memBase, register_base) of (NONE, _) => saves | (SOME memBase, SOME register_base) => (Operand.memloc memBase):: (Operand.register register_base):: saves | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.toAddressMemLoc", force = Register.indexRegisters, registerAllocation = registerAllocation} in {register = SOME register, assembly = assembly, registerAllocation = registerAllocation} end in {address = Address.T {disp = SOME disp, base = register_base, index = register_index, scale = case memIndex of SOME _ => SOME scale | NONE => NONE}, assembly = AppendList.append (assembly_base, assembly_index), registerAllocation = registerAllocation} end) (* (case MemLoc.destruct memloc of MemLoc.U {base = MemLoc.Imm base, index = MemLoc.Imm index, scale, size, ...} => let val disp' = if Immediate.eq(index, Immediate.const_int 0) then NONE else SOME (Immediate.binexp {oper = Immediate.Multiplication, exp1 = index, exp2 = Scale.toImmediate scale}) val disp = case disp' of NONE => SOME base | SOME disp' => SOME (Immediate.binexp {oper = Immediate.Addition, exp1 = base, exp2 = disp'}) in {address = Address.T {disp = disp, base = NONE, index = NONE, scale = NONE}, assembly = AppendList.empty, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Imm base, index = MemLoc.Mem index, scale, size, ...} => let val disp = SOME base val {register = register_index, assembly = assembly_index, registerAllocation} = toRegisterMemLoc {memloc = index, info = info, size = MemLoc.size index, move = true, supports = supports, saves = saves, force = Register.indexRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = disp, base = NONE, index = SOME register_index, scale = SOME scale}, assembly = assembly_index, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Mem base, index = MemLoc.Imm index, scale, size, ...} => let val disp = if Immediate.eq(index, Immediate.const_int 0) then NONE else SOME (Immediate.binexp {oper = Immediate.Multiplication, exp1 = index, exp2 = Scale.toImmediate scale}) val {register = register_base, assembly = assembly_base, registerAllocation} = toRegisterMemLoc {memloc = base, info = info, size = MemLoc.size base, move = true, supports = supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = disp, base = SOME register_base, index = NONE, scale = NONE}, assembly = assembly_base, registerAllocation = registerAllocation} end | MemLoc.U {base = MemLoc.Mem base, index = MemLoc.Mem index, scale, size, ...} => let val {register = register_base, assembly = assembly_base, registerAllocation} = toRegisterMemLoc {memloc = base, info = info, size = MemLoc.size base, move = true, supports = (Operand.memloc index)::supports, saves = saves, force = Register.baseRegisters, registerAllocation = registerAllocation} val {register = register_index, assembly = assembly_index, registerAllocation} = toRegisterMemLoc {memloc = index, info = info, size = MemLoc.size index, move = true, supports = supports, saves = (Operand.memloc base):: (Operand.register register_base):: saves, force = Register.indexRegisters, registerAllocation = registerAllocation} in {address = Address.T {disp = NONE, base = SOME register_base, index = SOME register_index, scale = SOME scale}, assembly = AppendList.append (assembly_base, assembly_index), registerAllocation = registerAllocation} end) *) before (Int.dec depth)) handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toAddressMemLoc", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = memloc, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {address = address, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} and toRegisterImmediate {immediate: Immediate.t, info: Liveness.t, size: Size.t, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {register: Register.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = let val _ = Int.inc depth val {register = final_register, assembly, registerAllocation} = freeRegister {info = info, memloc = NONE, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} val _ = Int.dec depth val (mungeLabel, base) = picRelative () val instruction = case Immediate.destruct immediate of Immediate.Word _ => Assembly.instruction_mov {dst = Operand.Register final_register, src = Operand.Immediate immediate, size = size} | Immediate.Label l => Assembly.instruction_lea {dst = Operand.Register final_register, src = Operand.Address (Address.T { disp = SOME (Immediate.label (mungeLabel l)), base = base, index = NONE, scale = NONE }), size = size} | Immediate.LabelPlusWord (l, w) => Assembly.instruction_lea {dst = Operand.Register final_register, src = Operand.Address (Address.T { disp = SOME (Immediate.labelPlusWord (mungeLabel l, w)), base = base, index = NONE, scale = NONE }), size = size} in {register = final_register, assembly = AppendList.appends [assembly, AppendList.single instruction], registerAllocation = registerAllocation} end handle Spill => spillAndReissue {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation, spiller = spillRegisters, msg = "toRegisterImmediate", reissue = fn {assembly = assembly_spill, registerAllocation} => let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = immediate, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {register = register, assembly = AppendList.append (assembly_spill, assembly), registerAllocation = registerAllocation} end} fun pre {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list, info as {dead, remove, ...}: Liveness.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val ra = registerAllocation val dead_memlocs = dead val remove_memlocs = remove val (allUses, allDefs, allKills) = let fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand,set) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(set, memloc) | NONE => set) val uses = doit uses val defs = doit defs val kills = doit kills fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) val allUses = doit'(uses, doit'(defs, uses)) val allDefs = defs val allKills = kills in (allUses, allDefs, allKills) end val allDest = MemLocSet.unions [allDefs, allKills, dead_memlocs, remove_memlocs] val allKeep = MemLocSet.unions [allUses, allDefs, allKills] val registerAllocation = fltvalueMap {map = fn {fltregister, memloc, weight, sync, commit} => let val must_commit0 = (MemLocSet.exists (allDefs, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit1 = (MemLocSet.exists (allUses, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit2 = (List.exists (MemLoc.utilized memloc, fn memloc => MemLocSet.contains (allDest, memloc))) val must_commit3 = (MemLocSet.contains (MemLocSet.-(allKills, dead_memlocs), memloc)) val sync = if volatile memloc then true else sync val commit = if volatile memloc then REMOVE 0 else if must_commit3 then COMMIT 0 else if must_commit2 then if MemLocSet.contains (allKeep, memloc) then COMMIT 0 else REMOVE 0 else if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit in {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn {register, memloc, weight, sync, commit} => let val must_commit0 = (MemLocSet.exists (allDefs, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit1 = (MemLocSet.exists (allUses, fn memloc' => not (MemLoc.eq(memloc', memloc)) andalso (MemLoc.mayAlias(memloc', memloc)))) val must_commit2 = (List.exists (MemLoc.utilized memloc, fn memloc => MemLocSet.contains (allDest, memloc))) val must_commit3 = (MemLocSet.contains (MemLocSet.-(allKills, dead_memlocs), memloc)) val sync = if volatile memloc then true else sync val commit = if volatile memloc then REMOVE 0 else if MemLocSet.contains(allDefs, memloc) then if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit else if must_commit3 then COMMIT 0 else if must_commit2 then if MemLocSet.contains (allKeep, memloc) then COMMIT 0 else REMOVE 0 else if must_commit1 orelse must_commit0 then case commit of TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 else commit in {register = register, memloc = memloc, weight = weight, sync = sync, commit = commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [if !Control.Native.commented > 3 then AppendList.cons ((Assembly.comment "pre begin:"), (toComments ra)) else AppendList.empty, assembly_commit_fltregisters, assembly_commit_registers, if !Control.Native.commented > 3 then AppendList.cons ((Assembly.comment "pre end:"), (toComments registerAllocation)) else AppendList.empty], registerAllocation = registerAllocation} end val (pre, pre_msg) = tracer "pre" pre fun post {uses: Operand.t list, final_uses: Operand.t list, defs: Operand.t list, final_defs: Operand.t list, kills: Operand.t list, info as {dead, commit, remove, ...}: Liveness.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, registerAllocation: t} = let val ra = registerAllocation val (final_uses_registers, final_defs_registers, final_uses_fltregisters, final_defs_fltregisters) = let fun doit(operands, (final_registers, final_fltregisters)) = List.fold (operands, (final_registers, final_fltregisters), fn (operand, (final_registers, final_fltregisters)) => case (Operand.deRegister operand, Operand.deFltregister operand) of (SOME register, _) => if List.contains(final_registers, register, Register.eq) then (final_registers, final_fltregisters) else (register::final_registers, final_fltregisters) | (_, SOME fltregister) => if List.contains(final_fltregisters, fltregister, FltRegister.eq) then (final_registers, final_fltregisters) else (final_registers, fltregister::final_fltregisters) | _ => (final_registers, final_fltregisters)) val (final_uses_registers, final_uses_fltregisters) = doit(final_uses, ([], [])) val (final_defs_registers, final_defs_fltregisters) = doit(final_defs, ([], [])) in (final_uses_registers, final_defs_registers, final_uses_fltregisters, final_defs_fltregisters) end val dead_memlocs = dead val commit_memlocs = commit val remove_memlocs = remove val (_, allDefs, allKills) = let fun doit operands = List.fold (operands, MemLocSet.empty, fn (operand,set) => case Operand.deMemloc operand of SOME memloc => MemLocSet.add(set, memloc) | NONE => set) val uses = doit uses val defs = doit defs val kills = doit kills fun doit' (memlocs, set) = MemLocSet.fold (memlocs, set, fn (memloc, set) => MemLocSet.union (set, MemLocSet.fromList (MemLoc.utilized memloc))) val allUses = doit'(uses, doit'(defs, uses)) val allDefs = defs val allKills = kills in (allUses, allDefs, allKills) end val allDest = MemLocSet.unions [allDefs, allKills, dead_memlocs, remove_memlocs] val registerAllocation = fltvalueMap {map = fn {fltregister, memloc, weight, sync, commit} => if volatile memloc then let val isDst = List.contains (final_defs_fltregisters, fltregister, FltRegister.eq) val isDef = isDst in {fltregister = fltregister, memloc = memloc, sync = sync andalso (not isDef), weight = weight - 500, commit = REMOVE 0} end else if MemLocSet.contains (dead_memlocs, memloc) then {fltregister = fltregister, memloc = memloc, sync = true, weight = weight - 500, commit = TRYREMOVE 0} else let val isSrc = List.contains (final_uses_fltregisters, fltregister, FltRegister.eq) val isDst = List.contains (final_defs_fltregisters, fltregister, FltRegister.eq) val isDef = isDst in {fltregister = fltregister, memloc = memloc, weight = weight - 5 + (if isSrc then 5 else 0) + (if isDst then 10 else 0), sync = sync andalso (not isDef), commit = if !Control.Native.IEEEFP andalso not (sync andalso (not isDef)) then REMOVE 0 else if List.exists (MemLoc.utilized memloc, fn memloc' => MemLocSet.contains (allDest, memloc')) then REMOVE 0 else if MemLocSet.contains (remove_memlocs, memloc) then TRYREMOVE 0 else if MemLocSet.contains (commit_memlocs, memloc) then TRYCOMMIT 0 else commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, commit} => if volatile memloc then let val isDst = List.contains (final_defs_registers, register, Register.eq) val isDef = isDst in {register = register, memloc = memloc, sync = sync andalso (not isDef), weight = weight - 500, commit = REMOVE 0} end else if MemLocSet.contains (dead_memlocs, memloc) then value else let val isSrc = List.contains (final_uses_registers, register, Register.eq) val isDst = List.contains (final_defs_registers, register, Register.eq) val isDef = isDst in {register = register, memloc = memloc, weight = weight - 5 + (if isSrc then 5 else 0) + (if isDst then 10 else 0), sync = sync andalso (not isDef), commit = if List.exists (MemLoc.utilized memloc, fn memloc' => MemLocSet.contains (allDest, memloc')) then REMOVE 0 else if MemLocSet.contains (remove_memlocs, memloc) then TRYREMOVE 0 else if MemLocSet.contains (commit_memlocs, memloc) then TRYCOMMIT 0 else commit} end, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, ...} => if MemLocSet.contains (dead_memlocs, memloc) then {register = register, memloc = memloc, sync = true, weight = weight, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_dead_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [if !Control.Native.commented > 3 then AppendList.cons ((Assembly.comment "post begin:"), (toComments ra)) else AppendList.empty, assembly_commit_fltregisters, assembly_commit_registers, assembly_dead_registers, if !Control.Native.commented > 3 then AppendList.cons ((Assembly.comment "post end:"), (toComments registerAllocation)) else AppendList.empty], registerAllocation = registerAllocation} end val (post, post_msg) = tracer "post" post fun allocateOperand {operand: Operand.t, options = {register: bool, immediate: bool, label: bool, address: bool}, info as {dead, remove, ...}: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, force: Register.t list, registerAllocation: t} : {operand: Operand.t, assembly: Assembly.t AppendList.t, registerAllocation: t} = case operand of Operand.Immediate i => if immediate andalso (let val (_, picBase) = picRelative () val pic = picBase <> NONE val hasLabel = case Immediate.destruct i of Immediate.Word _ => false | _ => true in not (pic andalso hasLabel) end) then {operand = operand, assembly = AppendList.empty, registerAllocation = registerAllocation} else if register then let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = i, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.register register, assembly = assembly, registerAllocation = registerAllocation} end else if address then let val (mungeLabel, picBase) = picRelative () val label = mungeLabel (Label.fromString "raTemp1") val address = Address.T {disp = SOME (Immediate.label label), base = picBase, index = NONE, scale = NONE} in {operand = Operand.address address, assembly = AppendList.single (Assembly.instruction_mov {src = Operand.immediate i, dst = Operand.address address, size = size}), registerAllocation = registerAllocation} end else Error.bug "x86AllocateRegisters.RegisterAllocation.allocateOperand: operand:Immediate" | Operand.Label l => if label then {operand = operand, assembly = AppendList.empty, registerAllocation = registerAllocation} else if immediate then {operand = Operand.immediate_label l, assembly = AppendList.empty, registerAllocation = registerAllocation} else if register then let val {register, assembly, registerAllocation} = toRegisterImmediate {immediate = Immediate.label l, info = info, size = size, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.register register, assembly = assembly, registerAllocation = registerAllocation} end else Error.bug "x86AllocateRegisters.RegisterAllocation.allocateOperand: operand:Label" | Operand.MemLoc m => let fun toRegisterMemLoc' () = let val {register, assembly, registerAllocation} = toRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, force = force, registerAllocation = registerAllocation} in {operand = Operand.Register register, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLoc' () = let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = assembly, registerAllocation = registerAllocation} end fun toAddressMemLocRemove' () = let val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if MemLoc.eq(memloc, m) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation} = commitRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = AppendList.append (assembly_commit, assembly), registerAllocation = registerAllocation} end in if register andalso address then case allocated {memloc = m, registerAllocation = registerAllocation} of NONE => if MemLocSet.contains(dead, m) orelse MemLocSet.contains(remove, m) then toAddressMemLoc' () else toRegisterMemLoc' () | SOME _ => toRegisterMemLoc' () else if register then toRegisterMemLoc' () else if address then toAddressMemLocRemove' () else Error.bug "x86AllocateRegisters.RegisterAllocation.allocateOperand: operand:MemLoc" end | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocateOperand: operand" val (allocateOperand, allocateOperand_msg) = tracer "allocateOperand" allocateOperand fun allocateFltOperand {operand: Operand.t, options = {fltregister: bool, address: bool}, info as {dead, remove, ...}: Liveness.t, size: Size.t, move: bool, supports: Operand.t list, saves: Operand.t list, top: bool option, registerAllocation: t} : {operand: Operand.t, assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = case operand of Operand.MemLoc m => if fltregister andalso address then case fltallocated {memloc = m, registerAllocation = registerAllocation} of NONE => if MemLocSet.contains(dead, m) orelse MemLocSet.contains(remove, m) then let val {address, assembly, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = assembly, fltrename = FltRegister.id, registerAllocation = registerAllocation} end else let val {fltregister, assembly, fltrename, registerAllocation} = toFltRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, top = top, registerAllocation = registerAllocation} in {operand = Operand.FltRegister fltregister, assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} end | SOME _ => let val {fltregister, assembly, fltrename, registerAllocation} = toFltRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, top = top, registerAllocation = registerAllocation} in {operand = Operand.FltRegister fltregister, assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} end else if fltregister then let val {fltregister, assembly, fltrename, registerAllocation} = toFltRegisterMemLoc {memloc = m, info = info, size = size, move = move, supports = supports, saves = saves, top = top, registerAllocation = registerAllocation} in {operand = Operand.FltRegister fltregister, assembly = assembly, fltrename = fltrename, registerAllocation = registerAllocation} end else if address then let val registerAllocation = fltvalueMap {map = fn value as {fltregister, memloc, weight, sync, ...} => if MemLoc.eq(memloc, m) then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, fltrename = fltrename_commit, registerAllocation} = commitFltRegisters {info = info, supports = supports, saves = saves, registerAllocation = registerAllocation} val {address, assembly = assembly_address, registerAllocation} = toAddressMemLoc {memloc = m, info = info, size = size, supports = supports, saves = saves, registerAllocation = registerAllocation} in {operand = Operand.Address address, assembly = AppendList.append (assembly_commit, assembly_address), fltrename = fltrename_commit, registerAllocation = registerAllocation} end else Error.bug "x86AllocateRegisters.RegisterAllocation.allocateFltOperand: operand:MemLoc" | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocateFltOperand: operand" val (allocateFltOperand, allocateFltOperand_msg) = tracer "allocateFltOperand" allocateFltOperand local fun allocateFltStackOperands' {fltregister_top: FltRegister.t, fltregister_one: FltRegister.t, registerAllocation: t} : {assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = case (fltregister_top, fltregister_one) of (FltRegister.T 0, FltRegister.T 1) => {assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} | (FltRegister.T 1, FltRegister.T 0) => let val {fltrename = fltrename, registerAllocation} = fltxch1 {registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}), fltrename = fltrename, registerAllocation = registerAllocation} end | (FltRegister.T 0, FltRegister.T j) => let val {fltrename = fltrename, registerAllocation} = fltxch1 {registerAllocation = registerAllocation} val {fltrename = fltrename', registerAllocation} = fltxch' {fltregister = FltRegister.T j, registerAllocation = registerAllocation} val {fltrename = fltrename'', registerAllocation} = fltxch1 {registerAllocation = registerAllocation} in {assembly = AppendList.fromList [Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T j)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}], fltrename = fltrename'' o fltrename' o fltrename, registerAllocation = registerAllocation} end | (FltRegister.T 1, FltRegister.T j) => let val {fltrename = fltrename, registerAllocation} = fltxch' {fltregister = FltRegister.T j, registerAllocation = registerAllocation} val {fltrename = fltrename', registerAllocation} = fltxch1 {registerAllocation = registerAllocation} in {assembly = AppendList.fromList [Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T j)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}], fltrename = fltrename' o fltrename, registerAllocation = registerAllocation} end | (FltRegister.T i, FltRegister.T 1) => let val {fltrename = fltrename, registerAllocation} = fltxch' {fltregister = FltRegister.T i, registerAllocation = registerAllocation} in {assembly = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T i)}), fltrename = fltrename, registerAllocation = registerAllocation} end | (FltRegister.T i, FltRegister.T 0) => let val {fltrename = fltrename, registerAllocation} = fltxch1 {registerAllocation = registerAllocation} val {fltrename = fltrename', registerAllocation} = fltxch' {fltregister = FltRegister.T i, registerAllocation = registerAllocation} in {assembly = AppendList.fromList [Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T i)}], fltrename = fltrename' o fltrename, registerAllocation = registerAllocation} end | (FltRegister.T i, FltRegister.T j) => let val {fltrename = fltrename, registerAllocation} = fltxch' {fltregister = FltRegister.T j, registerAllocation = registerAllocation} val {fltrename = fltrename', registerAllocation} = fltxch1 {registerAllocation = registerAllocation} val {fltrename = fltrename'', registerAllocation} = fltxch' {fltregister = FltRegister.T i, registerAllocation = registerAllocation} in {assembly = AppendList.fromList [Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T j)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T 1)}, Assembly.instruction_fxch {src = Operand.fltregister (FltRegister.T i)}], fltrename = fltrename'' o fltrename' o fltrename, registerAllocation = registerAllocation} end in fun allocateFltStackOperands {operand_top: Operand.t, size_top: Size.t, move_top: bool, operand_one: Operand.t, move_one: bool, size_one: Size.t, info: Liveness.t, supports: Operand.t list, saves: Operand.t list, registerAllocation: t} : {operand_top: Operand.t, operand_one: Operand.t, assembly: Assembly.t AppendList.t, fltrename: FltRegister.t -> FltRegister.t, registerAllocation: t} = if Operand.eq(operand_top, operand_one) then let val {assembly = assembly_free, fltrename = fltrename_free, registerAllocation} = freeFltRegister {info = info, size = size_top, supports = operand_top::supports, saves = saves, registerAllocation = registerAllocation} val {assembly = assembly_allocate_top_one, fltrename = fltrename_allocate_top_one, registerAllocation, ...} = allocateFltOperand {operand = operand_top, options = {fltregister = true, address = false}, info = info, size = size_top, move = move_top, supports = supports, saves = saves, top = SOME true, registerAllocation = registerAllocation} val temp = MemLoc.imm {base = Immediate.label (Label.fromString "raTemp2"), index = Immediate.zero, scale = Scale.Eight, size = Size.DBLE, class = MemLoc.Class.Temp} val {fltrename = fltrename_push, registerAllocation} = fltpush {value = {fltregister = FltRegister.top, memloc = temp, weight = 0, sync = true, commit = NO}, registerAllocation = registerAllocation} in {operand_top = Operand.FltRegister FltRegister.top, operand_one = Operand.FltRegister FltRegister.one, assembly = AppendList.appends [assembly_free, assembly_allocate_top_one, AppendList.single (Assembly.instruction_fld {src = Operand.FltRegister FltRegister.top, size = size_top})], fltrename = fltrename_push o fltrename_allocate_top_one o fltrename_free, registerAllocation = registerAllocation} end else let val {operand = operand_allocate_one, assembly = assembly_allocate_one, fltrename = fltrename_allocate_one, registerAllocation} = case operand_one of (Operand.MemLoc memloc_one) => (case fltallocated {memloc = memloc_one, registerAllocation = registerAllocation} of SOME value_one => {operand = Operand.FltRegister (#fltregister value_one), assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} | NONE => allocateFltOperand {operand = operand_one, options = {fltregister = true, address = false}, info = info, size = size_one, move = move_one, supports = supports, saves = operand_top::saves, top = SOME true, registerAllocation = registerAllocation}) | _ => allocateFltOperand {operand = operand_one, options = {fltregister = true, address = false}, info = info, size = size_one, move = move_one, supports = supports, saves = operand_top::saves, top = SOME true, registerAllocation = registerAllocation} val {operand = operand_allocate_top, assembly = assembly_allocate_top, fltrename = fltrename_allocate_top, registerAllocation} = case operand_top of (Operand.MemLoc memloc_top) => (case fltallocated {memloc = memloc_top, registerAllocation = registerAllocation} of SOME value_top => {operand = Operand.FltRegister (#fltregister value_top), assembly = AppendList.empty, fltrename = FltRegister.id, registerAllocation = registerAllocation} | NONE => allocateFltOperand {operand = operand_top, options = {fltregister = true, address = false}, info = info, size = size_top, move = move_top, supports = supports, saves = operand_top::saves, top = SOME true, registerAllocation = registerAllocation}) | _ => allocateFltOperand {operand = operand_top, options = {fltregister = true, address = false}, info = info, size = size_top, move = move_top, supports = supports, saves = operand_top::saves, top = SOME true, registerAllocation = registerAllocation} val fltregister_one = case operand_allocate_one of Operand.FltRegister f => f | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocateFltStackOperand: one" val fltregister_one = fltrename_allocate_top fltregister_one val fltregister_top = case operand_allocate_top of Operand.FltRegister f => f | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.allocateFltStackOperand: top" val {assembly, fltrename, registerAllocation} = allocateFltStackOperands' {fltregister_top = fltregister_top, fltregister_one = fltregister_one, registerAllocation = registerAllocation} in {operand_top = Operand.FltRegister FltRegister.top, operand_one = Operand.FltRegister FltRegister.one, assembly = AppendList.appends [assembly_allocate_one, assembly_allocate_top, assembly], fltrename = fltrename o fltrename_allocate_top o fltrename_allocate_one, registerAllocation = registerAllocation} end end val (allocateFltStackOperands, allocateFltStackOperands_msg) = tracer "allocateFltStackOperands" allocateFltStackOperands fun fltrenameLift fltrename = fn Operand.FltRegister f => Operand.FltRegister (fltrename f) | operand => operand (* Implementation of directives. *) fun assume {assumes : {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list, info = _, registerAllocation} = let val {assembly, registerAllocation} = List.foldr (assumes, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({register, memloc, weight, sync, reserve}, {assembly, registerAllocation}) => let val registerAllocation = update {value = {register = register, memloc = memloc, weight = weight, sync = sync, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then reserve' {register = register, registerAllocation = registerAllocation} else unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun fltassume {assumes : {memloc: MemLoc.t, weight: int, sync: bool} list, info = _, registerAllocation = {entries, reserved, ...} : t} = let val registerAllocation = {entries = entries, reserved = reserved, fltstack = []} val {assembly, registerAllocation} = List.foldr (assumes, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc, weight, sync}, {assembly, registerAllocation}) => let val {registerAllocation, ...} = fltpush {value = {fltregister = FltRegister.top, memloc = memloc, weight = weight, sync = sync, commit = NO}, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end) in {assembly = assembly, registerAllocation = registerAllocation} end fun cache {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.revMap (caches, fn {memloc, ...} => Operand.memloc memloc) datatype u = None | Reg of Register.t | Mem of MemLoc.t fun computeEdges' {reg, registerAllocation} = List.revMap (Register.coincident' reg, fn register' => let val (from, m) = case List.peek (caches, fn {register, ...} => Register.eq(register, register')) of NONE => (None, NONE) | SOME {memloc, ...} => (case allocated {memloc = memloc, registerAllocation = registerAllocation} of NONE => (Mem memloc, SOME memloc) | SOME {register, ...} => (Reg register, SOME memloc)) val to = case valueRegister {register = register', registerAllocation = registerAllocation} of NONE => None | SOME {memloc = memloc', ...} => (case List.peek (caches, fn {memloc, ...} => MemLoc.eq(memloc, memloc')) of NONE => None | SOME {register, ...} => Reg register) in (from, m, register', to) end) fun computeEdges {registerAllocation} = List.revMap (Register.allReg, fn reg => (reg, computeEdges' {reg = reg, registerAllocation = registerAllocation})) fun doitSelf {edges, saves, assembly, registerAllocation} = let val {yes = self, no = edges} = List.partition (edges, fn (_, edges') => List.forall (edges', fn (Reg rf, _, r, Reg rt) => Register.eq(rf, r) andalso Register.eq(r, rt) | _ => false)) in if not (List.isEmpty self) then let val saves_self = List.fold (self, [], fn ((_, edges'), saves) => List.fold (edges', saves, fn ((_,_,r,_), saves) => (Operand.register r)::saves)) in doit {edges = edges, saves = saves_self @ saves, assembly = assembly, registerAllocation = registerAllocation} end else doitEasy {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitEasy {edges, saves, assembly, registerAllocation} = let val {easy} = List.fold (edges, {easy = NONE}, fn ((_, edges'), {easy = NONE}) => let val {easy} = List.fold (edges', {easy = NONE}, fn ((Reg _, SOME m, r, None), {easy = NONE}) => {easy = SOME (m, r)} | (_, {easy}) => {easy = easy}) in {easy = easy} end | ((_, _), {easy}) => {easy = easy}) in case easy of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitHard {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitHard {edges, saves, assembly, registerAllocation} = let val {hard} = List.fold (edges, {hard = NONE}, fn ((_, edges'), {hard = NONE}) => let val {hard} = List.fold (edges', {hard = NONE}, fn ((Mem _, SOME m, r, None), {hard = NONE}) => {hard = SOME (m, r)} | (_, {hard}) => {hard = hard}) in {hard = hard} end | ((_, _), {hard}) => {hard = hard}) in case hard of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doitCycle {edges, saves, assembly, registerAllocation = registerAllocation} = let val {cycle} = List.fold (edges, {cycle = NONE}, fn ((_, edges'), {cycle = NONE}) => let val {cycle} = List.fold (edges', {cycle = NONE}, fn ((Reg _, SOME m, r, Reg _), {cycle = NONE}) => {cycle = SOME (m, r)} | (_, {cycle}) => {cycle = cycle}) in {cycle = cycle} end | ((_, _), {cycle}) => {cycle = cycle}) in case cycle of SOME (m, r) => let val {assembly = assembly_register, registerAllocation, ...} = toRegisterMemLoc {memloc = m, info = info, size = MemLoc.size m, move = true, supports = supports, saves = saves, force = [r], registerAllocation = registerAllocation} val edges = computeEdges {registerAllocation = registerAllocation} in doit {edges = edges, saves = [], assembly = AppendList.append (assembly, assembly_register), registerAllocation = registerAllocation} end | NONE => doitCycle {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end and doit {edges, saves, assembly, registerAllocation} = let val edges = List.fold (edges, [], fn ((reg, edges'), edges) => let val edges' = List.revRemoveAll (edges', fn (None, _, _, None) => true | _ => false) in if List.isEmpty edges' then edges else (reg, edges')::edges end) in if List.isEmpty edges then {assembly = assembly, registerAllocation = registerAllocation} else doitSelf {edges = edges, saves = saves, assembly = assembly, registerAllocation = registerAllocation} end val {assembly = assembly_force, registerAllocation} = doit {edges = computeEdges {registerAllocation = registerAllocation}, saves = [], assembly = AppendList.empty, registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = reserve {registers = List.revKeepAllMap (caches, fn {register, reserve, ...} => if reserve then SOME register else NONE), registerAllocation = registerAllocation} in {assembly = AppendList.append(assembly_force, assembly_reserve), registerAllocation = registerAllocation} end (* fun cache {caches : {register: Register.t, memloc: MemLoc.t, reserve: bool} list, info, registerAllocation} = let val supports = List.map (caches, fn {memloc, ...} => Operand.memloc memloc) val {assembly, registerAllocation, ...} = List.foldr (caches, {assembly = AppendList.empty, registerAllocation = registerAllocation, saves = []}, fn (cache as {register, memloc, reserve}, {assembly, registerAllocation, saves}) => let val {register, assembly = assembly_register, registerAllocation} = toRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = saves, force = [register], registerAllocation = registerAllocation} val {assembly = assembly_reserve, registerAllocation} = if reserve then reserve' {register = register, registerAllocation = registerAllocation} else {assembly = AppendList.empty, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly, assembly_register, assembly_reserve], registerAllocation = registerAllocation, saves = (Operand.memloc memloc)::saves} end) in {assembly = assembly, registerAllocation = registerAllocation} end *) fun fltcache {caches : {memloc: MemLoc.t} list, info, registerAllocation} = let val supports = List.revMap (caches, fn {memloc, ...} => Operand.memloc memloc) val {assembly = assembly_load, registerAllocation, ...} = List.foldr (caches, {assembly = AppendList.empty, registerAllocation = registerAllocation, saves = []}, fn ({memloc: MemLoc.t}, {assembly, registerAllocation, saves}) => let val {assembly = assembly_fltregister, registerAllocation, ...} = toFltRegisterMemLoc {memloc = memloc, info = info, size = MemLoc.size memloc, move = true, supports = supports, saves = saves, top = SOME false, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_fltregister), registerAllocation = registerAllocation, saves = (Operand.memloc memloc)::saves} end) val (num_caches, dest_caches) = List.fold (caches, (0,[]), fn ({memloc}, (num_caches, dest_caches)) => (num_caches + 1, {memloc = memloc, fltregister = FltRegister.T num_caches}::dest_caches)) fun check {assembly, registerAllocation} = let val {fltstack, ...} = registerAllocation val disp = (List.length fltstack) - num_caches val dest = fn (FltRegister.T i) => FltRegister.T (i + disp) val rec check' = fn [] => {assembly = assembly, registerAllocation = registerAllocation} | ({fltregister, memloc, ...}: fltvalue)::fltstack => (case List.peek (dest_caches, fn {memloc = memloc', ...} => MemLoc.eq(memloc, memloc')) of SOME {fltregister = fltregister', ...} => let val fltregister' = dest fltregister' in if FltRegister.eq (fltregister, fltregister') then check' fltstack else let val fltregister'' = if FltRegister.eq (fltregister, FltRegister.top) then fltregister' else fltregister val {registerAllocation, ...} = fltxch' {fltregister = fltregister'', registerAllocation = registerAllocation} val assembly_xch = AppendList.single (Assembly.instruction_fxch {src = Operand.fltregister fltregister''}) in check {assembly = AppendList.append (assembly, assembly_xch), registerAllocation = registerAllocation} end end | NONE => let val registerAllocation = fltvalueMap {map = fn value as {fltregister, memloc, weight, sync, ...} => if FltRegister.eq (fltregister, FltRegister.top) then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit, registerAllocation, ...} = commitFltRegisters {info = info, supports = supports, saves = [], registerAllocation = registerAllocation} in check {assembly = AppendList.append (assembly, assembly_commit), registerAllocation = registerAllocation} end) in check' fltstack end val {assembly = assembly_shuffle, registerAllocation} = check {assembly = AppendList.empty, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_load, assembly_shuffle], registerAllocation = registerAllocation} end fun reset ({...}: {registerAllocation: t}) = {assembly = AppendList.empty, registerAllocation = empty ()} fun force {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t, info: Liveness.t, registerAllocation: t} = let val toCommit = fn TRYREMOVE _ => REMOVE 0 | REMOVE _ => REMOVE 0 | _ => COMMIT 0 val toRemove = fn _ => REMOVE 0 val shouldCommit = fn memloc => (MemLocSet.contains(commit_memlocs, memloc) orelse ClassSet.contains(commit_classes, MemLoc.class memloc)) val shouldRemove = fn memloc => (MemLocSet.contains(remove_memlocs, memloc) orelse ClassSet.contains(remove_classes, MemLoc.class memloc)) val shouldDead = fn memloc => (MemLocSet.contains(dead_memlocs, memloc) orelse ClassSet.contains(dead_classes, MemLoc.class memloc)) val registerAllocation = fltvalueMap {map = fn value as {fltregister, memloc, weight, sync, commit} => case (shouldCommit memloc, shouldRemove memloc, shouldDead memloc) of (true,false,false) => {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} | (false,true,false) => {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} | (false,false,true) => {fltregister = fltregister, memloc = memloc, weight = weight, sync = true, commit = toRemove commit} | (false,false,false) => if List.exists (MemLoc.utilized memloc, fn memloc' => shouldDead memloc') then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} else if List.exists (MemLoc.utilized memloc, fn memloc' => shouldRemove memloc') then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} else value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.force", registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, commit} => case (shouldCommit memloc, shouldRemove memloc, shouldDead memloc) of (true,false,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} | (false,true,false) => {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} | (false,false,true) => value | (false,false,false) => if List.exists (MemLoc.utilized memloc, fn memloc' => shouldDead memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toRemove commit} else if List.exists (MemLoc.utilized memloc, fn memloc' => shouldRemove memloc') then {register = register, memloc = memloc, weight = weight, sync = sync, commit = toCommit commit} else value | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.force", registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, commit, ...} => if shouldDead memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = toRemove commit} else value, registerAllocation = registerAllocation} val {assembly = assembly_dead_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_commit_fltregisters, assembly_commit_registers, assembly_dead_registers], registerAllocation = registerAllocation} end fun ccall {info: Liveness.t, registerAllocation: t} = let val cstaticClasses = !x86MLton.Classes.cstaticClasses val {reserved = reservedStart, ...} = registerAllocation val {assembly = assembly_reserve, registerAllocation} = List.fold (Register.callerSaveRegisters, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_reserve, registerAllocation} = reserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_reserve), registerAllocation = registerAllocation} end) val availCalleeSaveRegisters = List.keepAll (Register.calleeSaveRegisters, fn calleeSaveReg => List.forall (#reserved registerAllocation, fn reservedReg => not (Register.coincide (reservedReg, calleeSaveReg)))) val {assembly = assembly_shuffle, registerAllocation, ...} = if !Control.Native.shuffle then List.fold (valueFilter {filter = fn {register, ...} => List.contains (Register.callerSaveRegisters, register, Register.eq) andalso List.exists (availCalleeSaveRegisters, fn calleeSaveReg => Size.eq (Register.size register, Register.size calleeSaveReg)), registerAllocation = registerAllocation}, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ({memloc, ...}, {assembly, registerAllocation}) => let val {assembly = assembly_shuffle, registerAllocation, ...} = allocateOperand {operand = Operand.memloc memloc, options = {register = true, immediate = false, label = false, address = true}, info = info, size = MemLoc.size memloc, move = true, supports = [], saves = [], force = Register.calleeSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_shuffle), registerAllocation = registerAllocation} end) else {assembly = AppendList.empty, registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if List.contains (Register.callerSaveRegisters, register, Register.eq) orelse ClassSet.contains (cstaticClasses, MemLoc.class memloc) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0} else value, registerAllocation = registerAllocation} val registerAllocation = fltvalueMap {map = fn {fltregister, memloc, weight, sync, ...} => {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0}, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_unreserve, registerAllocation} = List.fold (List.removeAll (Register.callerSaveRegisters, fn register => List.contains(reservedStart, register, Register.eq)), {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn (register, {assembly, registerAllocation}) => let val {assembly = assembly_unreserve, registerAllocation} = unreserve' {register = register, registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly, assembly_unreserve), registerAllocation = registerAllocation} end) val registerAllocation = deletes {registers = Register.callerSaveRegisters, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_reserve, assembly_shuffle, assembly_commit_fltregisters, assembly_commit_registers, assembly_unreserve], registerAllocation = registerAllocation} end fun return {returns: {src: Operand.t, dst: MemLoc.t} list, info: Liveness.t, registerAllocation: t} = let val killed_values = valueFilter {filter = fn {memloc, ...} => List.exists (returns, fn {dst = return_memloc, ...} => List.exists(MemLoc.utilized memloc, fn memloc' => MemLoc.eq(memloc', return_memloc)) orelse MemLoc.mayAlias(return_memloc, memloc)), registerAllocation = registerAllocation} val killed_memlocs = List.revMap(killed_values, #memloc) val registerAllocation = removes {memlocs = killed_memlocs, registerAllocation = registerAllocation} val registerAllocation = List.fold (returns, registerAllocation, fn ({src = operand, dst = return_memloc}, registerAllocation) => case operand of Operand.Register return_register => update {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} | Operand.FltRegister return_register => #registerAllocation (fltpush {value = {fltregister = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation}) | _ => Error.bug "x86AllocateRegisters.RegisterAllocation.return") val (final_defs, defs) = List.fold (returns, ([],[]), fn ({src,dst},(final_defs,defs)) => (src::final_defs,(Operand.memloc dst)::defs)) val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = defs, final_defs = final_defs, kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end (* fun return {memloc = return_memloc, info: Liveness.t, registerAllocation: t} = let val killed_values = valueFilter {filter = fn value as {memloc,...} => List.exists (MemLoc.utilized memloc, fn memloc' => MemLoc.eq(memloc', return_memloc)) orelse MemLoc.mayAlias(return_memloc, memloc), registerAllocation = registerAllocation} val killed_memlocs = List.revMap(killed_values, #memloc) val registerAllocation = removes {memlocs = killed_memlocs, registerAllocation = registerAllocation} val return_register = Register.return (MemLoc.size return_memloc) val registerAllocation = update {value = {register = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = [Operand.memloc return_memloc], final_defs = [Operand.register return_register], kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end fun fltreturn {memloc = return_memloc, info: Liveness.t, registerAllocation: t} = let val return_register = FltRegister.return val {fltrename = fltrename_push, registerAllocation} = fltpush {value = {fltregister = return_register, memloc = return_memloc, weight = 1024, sync = false, commit = NO}, registerAllocation = registerAllocation} val {assembly = assembly_post, registerAllocation} = post {uses = [], final_uses = [], defs = [Operand.memloc return_memloc], final_defs = [Operand.fltregister return_register], kills = [], info = info, registerAllocation = registerAllocation} in {assembly = assembly_post, registerAllocation = registerAllocation} end *) fun clearflt {info: Liveness.t, registerAllocation: t} = let val registerAllocation = fltvalueMap {map = fn {fltregister, memloc, weight, sync, ...} => {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = REMOVE 0}, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = assembly_commit_fltregisters, registerAllocation = registerAllocation} end fun saveregalloc ({id, registerAllocation, ...}: {live: MemLocSet.t, id: Directive.Id.t, info: Liveness.t, registerAllocation: t}) = let val _ = setRA(id, {registerAllocation = registerAllocation}) in {assembly = if !Control.Native.commented > 2 then (toComments registerAllocation) else AppendList.empty, registerAllocation = registerAllocation} end fun restoreregalloc ({live, id, info, ...}: {live: MemLocSet.t, id: Directive.Id.t, info: Liveness.t, registerAllocation: t}) = let val {registerAllocation} = getRA id fun dump memloc = (track memloc) andalso not (MemLocSet.contains(live,memloc)) val registerAllocation = fltvalueMap {map = fn value as {fltregister, memloc, weight, sync, ...} => if dump memloc then {fltregister = fltregister, memloc = memloc, weight = weight, sync = true, commit = TRYREMOVE 0} else if List.exists(MemLoc.utilized memloc, dump) then {fltregister = fltregister, memloc = memloc, weight = weight, sync = sync, commit = TRYREMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_fltregisters, registerAllocation, ...} = commitFltRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} val registerAllocation = valueMap {map = fn value as {register, memloc, weight, sync, ...} => if dump memloc then {register = register, memloc = memloc, weight = weight, sync = true, commit = TRYREMOVE 0} else if List.exists(MemLoc.utilized memloc, dump) then {register = register, memloc = memloc, weight = weight, sync = sync, commit = TRYREMOVE 0} else value, registerAllocation = registerAllocation} val {assembly = assembly_commit_registers, registerAllocation, ...} = commitRegisters {info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {assembly = AppendList.append (assembly_commit_fltregisters, assembly_commit_registers), registerAllocation = registerAllocation} end end structure Instruction = struct structure RA = RegisterAllocation open Instruction (* * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) fun allocateSrcDst {src: Operand.t, dst: Operand.t, move_dst: bool, size: Size.t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else case (src, dst) of (Operand.MemLoc _, Operand.MemLoc memloc_dst) => if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = move_dst, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val options_src = case final_dst of Operand.Register _ => {register = true, immediate = true, label = false, address = true} | _ => {register = true, immediate = true, label = false, address = false} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = options_src, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end else let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = true, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | (_, Operand.MemLoc memloc_dst) => let val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = true, label = false, address = false}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} fun default () = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = if MemLocSet.contains(dead, memloc_dst) orelse MemLocSet.contains(remove, memloc_dst) then case RA.allocated {memloc = memloc_dst, registerAllocation = registerAllocation} of SOME {register, sync, ...} => if sync then let val registerAllocation = RA.delete {register = register, registerAllocation = registerAllocation} in RA.allocateOperand {operand = dst, options = {register = false, immediate = false, label = false, address = true}, info = info, size = size, move = move_dst, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} end else default () | NONE => default () else default () in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], registerAllocation = registerAllocation} end | _ => Error.bug "x86AllocateRegisters.Instruction.allocateSrcDst" (* * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) fun allocateSrc1Src2 {src1: Operand.t, src2: Operand.t, size: Size.t, info: Liveness.t, registerAllocation: RegisterAllocation.t} = if Operand.eq(src1, src2) then let val {operand = final_src1_src2, assembly = assembly_src1_src2, registerAllocation} = RA.allocateOperand {operand = src1, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, registerAllocation = registerAllocation} end else let val {operand = final_src1, assembly = assembly_src1, registerAllocation} = RA.allocateOperand {operand = src1, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [src2], saves = [], force = [], registerAllocation = registerAllocation} val options_src2 = case final_src1 of Operand.Register _ => {register = true, immediate = true, label = false, address = true} | _ => {register = true, immediate = true, label = false, address = false} val {operand = final_src2, assembly = assembly_src2, registerAllocation} = RA.allocateOperand {operand = src2, options = options_src2, info = info, size = size, move = true, supports = [], saves = [src1,final_src1], force = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src1, assembly_src2], registerAllocation = registerAllocation} end fun pfmov {instruction, info as {dead, remove, ...}, registerAllocation, src, dst, srcsize, dstsize} = let fun default () = let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation, ...} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], top = SOME false, registerAllocation = registerAllocation} val {assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], top = NONE, registerAllocation = registerAllocation} val final_src = (RA.fltrenameLift fltrename_dst) final_src val instruction = Instruction.FLD {src = final_src, size = srcsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' () = let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation, ...} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], top = SOME true, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], top = SOME false, registerAllocation = registerAllocation} val instruction = Instruction.FST {dst = final_dst, size = dstsize, pop = true} val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in case (src,dst) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst) => (case (RA.fltallocated {memloc = memloc_src, registerAllocation = registerAllocation}, RA.fltallocated {memloc = memloc_dst, registerAllocation = registerAllocation}) of (SOME {fltregister = fltregister_src, sync = sync_src, commit = commit_src, ...}, NONE) => if MemLocSet.contains(dead,memloc_src) orelse (MemLocSet.contains(remove,memloc_src) andalso sync_src) then if MemLocSet.contains(remove, memloc_dst) then default' () else let val registerAllocation = RA.fltupdate {value = {fltregister = fltregister_src, memloc = memloc_dst, weight = 1024, sync = false, commit = commit_src}, registerAllocation = registerAllocation} val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val final_uses = [] val final_defs = [Operand.fltregister fltregister_src] val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_post], registerAllocation = registerAllocation} end else default () | _ => default ()) | _ => default () end fun removable {memloc, info = {dead, remove, ...}: Liveness.t, registerAllocation} = MemLocSet.contains(dead, memloc) orelse (MemLocSet.contains(remove, memloc) andalso (case RA.fltallocated {memloc = memloc, registerAllocation = registerAllocation} of SOME {sync,...} => sync | NONE => true)) fun allocateRegisters {instruction: t, info as {dead, remove, ...}: Liveness.t, registerAllocation: RegisterAllocation.t} = case instruction of NOP (* No operation; p. 496 *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.NOP val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | HLT (* Halt; p. 331 *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.HLT val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | BinAL {oper, src, dst, size} (* Integer binary arithmetic(w/o mult & div)/logic instructions. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.BinAL {oper = oper, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in default () end | pMD {oper, dst, src, size} (* Integer multiplication and division. * Require src operand as follows: * * src * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: pMD, size" val {assembly = assembly_clear, registerAllocation, ...} = RA.freeRegister {info = info, memloc = NONE, size = size, supports = [src,dst], saves = [], force = [hi], registerAllocation = registerAllocation} val registerAllocation = RA.delete {register = hi, registerAllocation = registerAllocation} val {final_src, assembly_src_dst, registerAllocation, ...} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [Operand.register hi], force = [lo], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else let val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [src], saves = [Operand.register hi], force = [lo], registerAllocation = registerAllocation} val force_src = List.revKeepAll (Register.registers size, fn r => not (Register.eq(r, hi) orelse Register.eq(r, lo))) val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [Operand.register hi, dst,final_dst], force = force_src, registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end val oper' = case oper of Instruction.IMUL => Instruction.IMUL | Instruction.MUL => Instruction.MUL | Instruction.IDIV => Instruction.IDIV | Instruction.DIV => Instruction.DIV | Instruction.IMOD => Instruction.IDIV | Instruction.MOD => Instruction.DIV val registerAllocation = if oper = Instruction.IMOD orelse oper = Instruction.MOD then case RA.valuesRegister {register = lo, registerAllocation = registerAllocation} of [{memloc, weight, sync, commit, ...}] => let val registerAllocation = RA.delete {register = lo, registerAllocation = registerAllocation} val registerAllocation = RA.update {value = {register = hi, memloc = memloc, weight = weight, sync = sync, commit = commit}, registerAllocation = registerAllocation} in registerAllocation end | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: pMD, lo" else registerAllocation val instruction = Instruction.MD {oper = oper', src = final_src, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_clear, assembly_src_dst, (if oper = Instruction.IDIV orelse oper = Instruction.IMOD then AppendList.single (Assembly.instruction_cx {size = size}) else if oper = Instruction.DIV orelse oper = Instruction.MOD then AppendList.single (Assembly.instruction_binal {oper = Instruction.XOR, dst = Operand.register hi, src = Operand.register hi, size = size}) else AppendList.empty), AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | IMUL2 {src, dst, size} (* Integer signed/unsigned multiplication (two operand form). * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = if Operand.eq(src, dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, registerAllocation = registerAllocation} end else let val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [src], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = true, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], force = [], registerAllocation = registerAllocation} in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], registerAllocation = registerAllocation} end val instruction = Instruction.IMUL2 {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | UnAL {oper, dst, size} (* Integer unary arithmetic/logic instructions. * Require dst operand as follows: * * dst * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.UnAL {oper = oper, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SRAL {oper, count, dst, size} (* Integer shift/rotate arithmetic/logic instructions. * Require count operand as follows: * * count * reg imm lab add * * X * * only register %cl * * Require dst operand as follows: * * dst * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_count, assembly_count, final_dst, assembly_dst, registerAllocation} = if Operand.eq(count,dst) then let val {operand = final_count, assembly = assembly_count, registerAllocation} = RA.allocateOperand {operand = count, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = true, supports = [], saves = [], force = [Register.T {reg = Register.ECX, part = Register.L}, Register.T {reg = Register.ECX, part = Register.X}, Register.T {reg = Register.ECX, part = Register.E}], registerAllocation = registerAllocation} val final_dst = final_count val assembly_dst = AppendList.empty in {final_count = final_count, assembly_count = assembly_count, final_dst = final_dst, assembly_dst = assembly_dst, registerAllocation = registerAllocation} end else let val count_size = case Operand.size count of NONE => Size.BYTE | SOME size => size val {operand = final_count, assembly = assembly_count, registerAllocation} = RA.allocateOperand {operand = count, options = {register = true, immediate = true, label = false, address = false}, info = info, size = count_size, move = true, supports = [dst], saves = [], force = [Register.T {reg = Register.ECX, part = Register.L}, Register.T {reg = Register.ECX, part = Register.X}, Register.T {reg = Register.ECX, part = Register.E}], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [], saves = [count,final_count], force = [], registerAllocation = registerAllocation} in {final_count = final_count, assembly_count = assembly_count, final_dst = final_dst, assembly_dst = assembly_dst, registerAllocation = registerAllocation} end val final_count = case final_count of Operand.Register _ => Operand.register (Register.T {reg = Register.ECX, part = Register.L}) | _ => final_count val instruction = Instruction.SRAL {oper = oper, count = final_count, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_count, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | CMP {src2, src1, size} (* Arithmetic compare; p. 116 * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.CMP {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | TEST {src2, src1, size} (* Logical compare; p. 728 * Require src1/src2 operands as follows: * * src2 * reg imm lab add * reg X X X * src1 imm * lab * add X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src1, final_src2, assembly_src1_src2, registerAllocation} = allocateSrc1Src2 {src1 = src1, src2 = src2, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.TEST {src1 = final_src1, src2 = final_src2, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | SETcc {condition, dst, size} (* Set byte on condition; p. 672 * Require dst operand as follows: * * dst * reg imm lab add * * X * * only byte registers *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [], force = Register.withLowPart (size, Size.BYTE), registerAllocation = registerAllocation} val temp_dst = case final_dst of Operand.Register r => let val register = Register.lowPartOf (r, Size.BYTE) in Operand.register register end | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: SETcc, temp_reg" val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills (Instruction.SETcc {condition = condition, dst = final_dst, size = size}) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction_setcc {condition = condition, dst = temp_dst, size = Size.BYTE}), if size = Size.BYTE then if Operand.eq (final_dst, temp_dst) then AppendList.empty else AppendList.single (Assembly.instruction_mov {dst = final_dst, src = temp_dst, size = Size.BYTE}) else AppendList.single (Assembly.instruction_movx {oper = Instruction.MOVZX, dst = final_dst, src = temp_dst, dstsize = size, srcsize = Size.BYTE}), assembly_post], registerAllocation = registerAllocation} end | JMP {target, absolute} (* Jump; p. 373 * Require target operand as follows: * * target * reg imm lab add * X X X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = false, immediate = true, label = true, address = true}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.JMP {target = final_target, absolute = absolute} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | Jcc {condition, target} (* Jump if condition is met; p. 369 * Require target operand as follows: * * target * reg imm lab add * X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = false, immediate = true, label = true, address = false}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.Jcc {condition = condition, target = final_target} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | CALL {target, absolute} (* Call procedure; p. 93 * Require target operand as follows: * * target * reg imm lab add * X X X X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_target, assembly = assembly_target, registerAllocation = registerAllocation} = RA.allocateOperand {operand = target, options = {register = true, immediate = true, label = true, address = true}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.CALL {target = final_target, absolute = absolute} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_target, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | RET {src = SOME src} (* Return from procedure; p. 648 * Require optional src operand as follows: * * src * reg imm lab add * X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation = registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = true, label = false, address = false}, info = info, size = Size.LONG, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.RET {src = SOME final_src} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | RET {src = NONE} => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val instruction = Instruction.RET {src = NONE} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | MOV {src, dst, size} (* Move; p. 442 * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm X X * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val isConst0 = Immediate.isZero (* special case moving 0 to a register *) val instruction = case (final_src, final_dst) of (Operand.Immediate immediate, Operand.Register _) => if isConst0 immediate then Instruction.BinAL {oper = XOR, src = final_dst, dst = final_dst, size = size} else Instruction.MOV {src = final_src, dst = final_dst, size = size} | _ => Instruction.MOV {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' ({register = register_src, commit = commit_src, ...} : RegisterAllocation.value, memloc_dst) = let val registerAllocation = RA.remove {memloc = memloc_dst, registerAllocation = registerAllocation} val registerAllocation = RA.update {value = {register = register_src, memloc = memloc_dst, weight = 1024, sync = false, commit = commit_src}, registerAllocation = registerAllocation} val final_uses = [] val final_defs = [Operand.register register_src] val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_post], registerAllocation = registerAllocation} end fun default'' (memloc_dst) = let val registerAllocation = RA.remove {memloc = memloc_dst, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = false, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.MOV {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end val memloc_src = Operand.deMemloc src val value_src = case memloc_src of NONE => NONE | SOME memloc_src => RA.allocated {memloc = memloc_src, registerAllocation = registerAllocation} val memloc_dst = Operand.deMemloc dst in case memloc_dst of SOME memloc_dst => if MemLocSet.contains(remove,memloc_dst) then (case memloc_src of SOME memloc_src => if List.contains (memloc_src::(MemLoc.utilized memloc_src), memloc_dst, MemLoc.eq) then default () else default'' memloc_dst | NONE => default'' memloc_dst) else (case value_src of SOME (value_src as {memloc = memloc_src, sync = sync_src, ...}) => if MemLocSet.contains(dead,memloc_src) orelse (MemLocSet.contains(remove,memloc_src) andalso sync_src) then default' (value_src, memloc_dst) else default () | NONE => default ()) | NONE => default () end | CMOVcc {condition, src, dst, size} (* Conditional move; p. 112 * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.CMOVcc {condition = condition, src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | XCHG {src, dst, size} (* Exchange register/memory with register; p. 754 * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, registerAllocation} = allocateSrcDst {src = src, dst = dst, move_dst = true, size = size, info = info, registerAllocation = registerAllocation} val instruction = Instruction.XCHG {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pPUSH {src, base, size} (* Pseudo push a value onto the stack; p. 621 * Require src operand as follows: * * src * reg imm lab add * * X X * * only word or long registers * * base * reg imm lab add * * * * only %esp *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_base, registerAllocation, ...} = RA.allocateOperand {operand = base, options = {register = true, immediate = false, label = false, address = false}, info = info, size = Size.LONG, move = true, supports = [src], saves = [], force = [Register.esp], registerAllocation = registerAllocation} val options = case size of Size.WORD => {register = true, immediate = true, label = false, address = true} | Size.LONG => {register = true, immediate = true, label = false, address = true} | _ => {register = false, immediate = true, label = false, address = true} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = options, info = info, size = size, move = true, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.PUSH {src = final_src, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_base, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pPOP {dst, base, size} (* Pseudo pop a value from the stack; p. 571 * Require dst operand as follows: * * dst * reg imm lab add * * X * * only word or long registers * base * reg imm lab add * * * * only %esp *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_base, registerAllocation, ...} = RA.allocateOperand {operand = base, options = {register = true, immediate = false, label = false, address = false}, info = info, size = Size.LONG, move = true, supports = [dst], saves = [], force = [Register.esp], registerAllocation = registerAllocation} val options = case size of Size.WORD => {register = true, immediate = false, label = false, address = true} | Size.LONG => {register = true, immediate = false, label = false, address = true} | _ => {register = false, immediate = false, label = false, address = true} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = options, info = info, size = size, move = false, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.POP {dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_base, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | MOVX {oper, src, dst, srcsize, dstsize} (* Move with extention. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.MOVX {oper = oper, src = final_src, dst = final_dst, srcsize = srcsize, dstsize = dstsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | XVOM {src, dst, srcsize, dstsize} (* Move with contraction. * Require src/dst operands as follows: * * dst * reg imm lab add * reg X X * src imm * lab * add *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = true, immediate = false, label = false, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = Register.withLowPart (srcsize, dstsize), registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills (Instruction.XVOM {src = final_src, dst = final_dst, srcsize = srcsize, dstsize = dstsize}) val temp_reg = case final_src of Operand.Register r => Register.lowPartOf (r, dstsize) | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: XVOM, temp_reg" val instruction = Instruction.MOV {src = Operand.register temp_reg, dst = final_dst, size = dstsize} val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | LEA {src, dst, size} (* Load effective address; p. 393 * Require src/dst operands as follows: * * dst * reg imm lab add * reg * src imm * lab * add X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = false, label = false, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation = registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = size, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.LEA {src = final_src, dst = final_dst, size = size} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFMOV {src, dst, size} => pfmov {instruction = instruction, info = info, registerAllocation = registerAllocation, src = src, dst = dst, srcsize = size, dstsize = size} | pFMOVX {src, dst, srcsize, dstsize} => pfmov {instruction = instruction, info = info, registerAllocation = registerAllocation, src = src, dst = dst, srcsize = srcsize, dstsize = dstsize} | pFXVOM {src, dst, srcsize, dstsize} => pfmov {instruction = instruction, info = info, registerAllocation = registerAllocation, src = src, dst = dst, srcsize = srcsize, dstsize = dstsize} | pFLDC {oper, dst, size} (* Pseudo floating-point load constant. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = false, supports = [], saves = [], top = NONE, registerAllocation = registerAllocation} val instruction = Instruction.FLDC {oper = oper} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFMOVFI {src, dst, srcsize, dstsize} (* Pseudo floating-point from integer. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = false, label = false, address = true}, info = info, size = srcsize, move = true, supports = [dst], saves = [], force = [], registerAllocation = registerAllocation} val {assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], top = NONE, registerAllocation = registerAllocation} val instruction = Instruction.FILD {src = final_src, size = Size.toFPI srcsize} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFMOVTI {src, dst, srcsize, dstsize} (* Pseudo floating-point to integer. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} fun default () = let val {operand = final_src, assembly = assembly_src, registerAllocation, ...} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], top = SOME true, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = false, immediate = false, label = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], force = [], registerAllocation = registerAllocation} val instruction = Instruction.FIST {dst = final_dst, size = Size.toFPI dstsize, pop = false} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end fun default' () = let val {operand = final_src, assembly = assembly_src, registerAllocation, ...} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = srcsize, move = true, supports = [dst], saves = [], top = SOME true, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = false, address = true}, info = info, size = dstsize, move = false, supports = [], saves = [src,final_src], top = SOME false, registerAllocation = registerAllocation} val instruction = Instruction.FIST {dst = final_dst, size = Size.toFPI dstsize, pop = true} val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end in case src of Operand.MemLoc memloc_src => if removable {memloc = memloc_src, info = info, registerAllocation = registerAllocation} then default' () else default () | _ => default () end | pFCOM {src1, src2, size} (* Floating-point compare real; p. 220 * Require src operand as follows: * * src * fltreg add * * X * * only st(1) if pop and pop' * * Require size modifier class as follows: FLT(SNGL,DBLE) *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src2, assembly_src1_src2, pop, pop', registerAllocation, ...} = if Operand.eq(src1,src2) then let fun default b = let val {operand = final_src1_src2, assembly = assembly_src1_src2, fltrename = fltrename_src1_src2, registerAllocation} = RA.allocateFltOperand {operand = src1, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, fltrename_src1_src2 = fltrename_src1_src2, pop = b, pop' = false, registerAllocation = registerAllocation} end in case src1 of Operand.MemLoc memloc_src1 => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then default true else default false | _ => default false end else let fun default b = let val {operand = final_src2, assembly = assembly_src2, fltrename = fltrename_src2, registerAllocation} = RA.allocateFltOperand {operand = src2, options = {fltregister = true, address = true}, info = info, size = size, move = true, supports = [src1], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_src1, assembly = assembly_src1, fltrename = fltrename_src1, registerAllocation} = RA.allocateFltOperand {operand = src1, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src2,final_src2], top = SOME true, registerAllocation = registerAllocation} val final_src2 = (RA.fltrenameLift fltrename_src1) final_src2 in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src2, assembly_src1], fltrename_src1_src2 = fltrename_src1 o fltrename_src2, pop = b, pop' = false, registerAllocation = registerAllocation} end fun default' () = let val {operand_top = final_src1, operand_one = final_src2, assembly = assembly_src1_src2, fltrename = fltrename_src1_src2, registerAllocation} = RA.allocateFltStackOperands {operand_top = src1, move_top = true, size_top = size, operand_one = src2, move_one = true, size_one = size, info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = assembly_src1_src2, fltrename_src1_src2 = fltrename_src1_src2, pop = true, pop' = true, registerAllocation = registerAllocation} end in case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then if removable {memloc = memloc_src2, info = info, registerAllocation = registerAllocation} then default' () else default true else default false | (Operand.MemLoc memloc_src1, _) => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then default true else default false | _ => default false end val instruction = Instruction.FCOM {src = final_src2, size = size, pop = pop, pop' = pop'} val {fltrename = fltrename_pop, registerAllocation} = if pop then if pop' then let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {fltrename = fltrename_pop', registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop' o fltrename_pop, registerAllocation= registerAllocation} end else let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop, registerAllocation = registerAllocation} end else {fltrename = FltRegister.id, registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFUCOM {src1, src2, size} (* Floating-point unordered compare real; p. 307 * Require src operand as follows: * * src * fltreg add * * * * only st(1) if pop and pop' *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src2, assembly_src1_src2, pop, pop', registerAllocation, ...} = if Operand.eq(src1,src2) then let fun default b = let val {operand = final_src1_src2, assembly = assembly_src1_src2, fltrename = fltrename_src1_src2, registerAllocation} = RA.allocateFltOperand {operand = src1, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} in {final_src1 = final_src1_src2, final_src2 = final_src1_src2, assembly_src1_src2 = assembly_src1_src2, fltrename_src1_src2 = fltrename_src1_src2, pop = b, pop' = false, registerAllocation = registerAllocation} end in case src1 of Operand.MemLoc memloc_src1 => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then default true else default false | _ => default false end else let fun default b = let val {operand = final_src2, assembly = assembly_src2, fltrename = fltrename_src2, registerAllocation} = RA.allocateFltOperand {operand = src2, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [src1], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_src1, assembly = assembly_src1, fltrename = fltrename_src1, registerAllocation} = RA.allocateFltOperand {operand = src1, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src2,final_src2], top = SOME true, registerAllocation = registerAllocation} val final_src2 = (RA.fltrenameLift fltrename_src1) final_src2 in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = AppendList.appends [assembly_src2, assembly_src1], fltrename_src1_src2 = fltrename_src1 o fltrename_src2, pop = b, pop' = false, registerAllocation = registerAllocation} end in case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => let fun default' () = case RA.fltallocated {memloc = memloc_src2, registerAllocation = registerAllocation} of SOME _ => let val {operand_top = final_src1, operand_one = final_src2, assembly = assembly_src1_src2, fltrename = fltrename_src1_src2, registerAllocation} = RA.allocateFltStackOperands {operand_top = src1, move_top = true, size_top = size, operand_one = src2, move_one = true, size_one = size, info = info, supports = [], saves = [], registerAllocation = registerAllocation} in {final_src1 = final_src1, final_src2 = final_src2, assembly_src1_src2 = assembly_src1_src2, fltrename_src1_src2 = fltrename_src1_src2, pop = true, pop' = true, registerAllocation = registerAllocation} end | NONE => default true in if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then if removable {memloc = memloc_src2, info = info, registerAllocation = registerAllocation} then default' () else default true else default false end | (Operand.MemLoc memloc_src1, _) => if removable {memloc = memloc_src1, info = info, registerAllocation = registerAllocation} then default true else default false | _ => default false end val instruction = Instruction.FUCOM {src = final_src2, pop = pop, pop' = pop'} val {fltrename = fltrename_pop, registerAllocation} = if pop then if pop' then let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {fltrename = fltrename_pop', registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop' o fltrename_pop, registerAllocation= registerAllocation} end else let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop, registerAllocation = registerAllocation} end else {fltrename = FltRegister.id, registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src1_src2, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFBinA {oper, src, dst, size} (* Floating-point binary arithmetic instructions. * Require src operand as follows: * * src * fltreg add * * X * * only st(0) if pop * * Require dst operand as follows: * * dst * fltreg add * * * * only st(0) if src add * * * one of src,dst must be st(0) * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {final_src, final_dst, assembly_src_dst, oper, pop, registerAllocation, ...} = if Operand.eq(src,dst) then let val {operand = final_src_dst, assembly = assembly_src_dst, fltrename = fltrename_src_dst, registerAllocation} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} in {final_src = final_src_dst, final_dst = final_src_dst, assembly_src_dst = assembly_src_dst, fltrename_src_dst = fltrename_src_dst, oper = oper, pop = false, registerAllocation = registerAllocation} end else let fun default () = let val {operand = final_src, assembly = assembly_src, fltrename = fltrename_src, registerAllocation} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = true}, info = info, size = size, move = true, supports = [dst], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation} = case final_src of Operand.Address _ => RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src,final_src], top = SOME true, registerAllocation = registerAllocation} | Operand.FltRegister f => if FltRegister.eq (f, FltRegister.top) then RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src,final_src], top = SOME false, registerAllocation = registerAllocation} else RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [src,final_src], top = SOME true, registerAllocation = registerAllocation} | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: pFBinA, final_src" val final_src = (RA.fltrenameLift fltrename_dst) final_src in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_src, assembly_dst], fltrename_src_dst = fltrename_dst o fltrename_src, oper = oper, pop = false, registerAllocation = registerAllocation} end fun default' () = let val {operand = final_dst, assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [src], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, fltrename = fltrename_src, registerAllocation} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], top = SOME true, registerAllocation = registerAllocation} val final_dst = (RA.fltrenameLift fltrename_src) final_dst in {final_src = final_src, final_dst = final_dst, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], fltrename_src_dst = fltrename_src o fltrename_dst, oper = oper, pop = true, registerAllocation = registerAllocation} end fun default'' value_dst = let val {operand = final_dst, assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [src], saves = [], top = SOME true, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, fltrename = fltrename_src, registerAllocation} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], top = SOME false, registerAllocation = registerAllocation} val final_dst = (RA.fltrenameLift fltrename_src) final_dst val {memloc = memloc_dst, weight = weight_dst, sync = sync_dst, commit = commit_dst, ...} : RegisterAllocation.fltvalue = value_dst val fltregister_src = case Operand.deFltregister final_src of SOME fltregister => fltregister | NONE => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: pFBinA, final_src" val registerAllocation = RA.fltupdate {value = {fltregister = fltregister_src, memloc = memloc_dst, weight = weight_dst, sync = sync_dst, commit = commit_dst}, registerAllocation = registerAllocation} in {final_src = final_dst, final_dst = final_src, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], fltrename_src_dst = fltrename_src o fltrename_dst, oper = Instruction.fbina_reverse oper, pop = true, registerAllocation = registerAllocation} end fun default''' memloc_dst = let val {operand = final_dst, assembly = assembly_dst, fltrename = fltrename_dst, registerAllocation} = RA.allocateFltOperand {operand = dst, options = {fltregister = false, address = true}, info = info, size = size, move = true, supports = [src], saves = [], top = SOME false, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, fltrename = fltrename_src, registerAllocation} = RA.allocateFltOperand {operand = src, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [dst,final_dst], top = SOME true, registerAllocation = registerAllocation} val final_dst = (RA.fltrenameLift fltrename_src) final_dst val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {fltrename = fltrename_push, registerAllocation} = RA.fltpush {value = {fltregister = FltRegister.top, memloc = memloc_dst, weight = 1024, sync = false, commit = RA.NO}, registerAllocation = registerAllocation} in {final_src = final_dst, final_dst = final_src, assembly_src_dst = AppendList.appends [assembly_dst, assembly_src], fltrename_src_dst = fltrename_push o fltrename_pop o fltrename_src o fltrename_dst, oper = Instruction.fbina_reverse oper, pop = false, registerAllocation = registerAllocation} end in case (src,dst) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst) => (case (RA.fltallocated {memloc = memloc_src, registerAllocation = registerAllocation}, RA.fltallocated {memloc = memloc_dst, registerAllocation = registerAllocation}) of (SOME ({sync = sync_src, ...}), SOME (value_dst as {fltregister = fltregister_dst, ...})) => if MemLocSet.contains(dead, memloc_src) orelse (MemLocSet.contains(remove, memloc_src) andalso sync_src) then if FltRegister.eq (fltregister_dst, FltRegister.top) then default'' value_dst else default' () else default () | (SOME {sync = sync_src,...}, NONE) => if MemLocSet.contains(dead, memloc_src) orelse (MemLocSet.contains(remove, memloc_src) andalso sync_src) then default''' memloc_dst else default () | _ => default ()) | (Operand.MemLoc memloc_src, _) => (case RA.fltallocated {memloc = memloc_src, registerAllocation = registerAllocation} of SOME {sync = sync_src,...} => if MemLocSet.contains(dead, memloc_src) orelse (MemLocSet.contains(remove, memloc_src) andalso sync_src) then default' () else default () | _ => default ()) | _ => default () end val oper = if Operand.eq(final_src, Operand.fltregister FltRegister.top) andalso isSome (Operand.deFltregister final_dst) then fbina_reverse oper else oper val instruction = Instruction.FBinA {oper = oper, src = final_src, dst = final_dst, size = size, pop = pop} val {fltrename = fltrename_pop, registerAllocation} = if pop then let val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} in {fltrename = fltrename_pop, registerAllocation = registerAllocation} end else {fltrename = FltRegister.id, registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFUnA {oper, dst, size} (* Floating-point unary arithmetic instructions. * Require src operand as follows: * * src * fltreg add * * * * only st(0) * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} val instruction = Instruction.FUnA {oper = oper} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFPTAN {dst, size} (* Floating-point partial tangent instruction. * Require src operand as follows: * * src * fltreg add * * * * only st(0) * * Require size modifier class as follows: FLT * Automatically pushes 1.0 onto stack. *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_free, registerAllocation, ...} = RA.freeFltRegister {info = info, size = Size.DBLE, supports = [dst], saves = [], registerAllocation = registerAllocation} val {assembly = assembly_dst, registerAllocation, ...} = RA.allocateFltOperand {operand = dst, options = {fltregister = true, address = false}, info = info, size = size, move = true, supports = [], saves = [], top = SOME true, registerAllocation = registerAllocation} val instruction = Instruction.FPTAN val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_free, assembly_dst, AppendList.single (Assembly.instruction instruction), AppendList.single (Assembly.instruction_fst {dst = Operand.fltregister FltRegister.top, size = Size.DBLE, pop = true}), assembly_post], registerAllocation = registerAllocation} end | pFBinAS {oper, src, dst, size} (* Floating-point binary arithmetic stack instructions. * Require src operand as follows: * * src * fltreg add * * * * only st(1) * * Require dst operand as follows: * * dst * fltreg add * * * * only st(0) * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_dst_src, registerAllocation, ...} = RA.allocateFltStackOperands {operand_top = dst, move_top = true, size_top = size, operand_one = src, move_one = true, size_one = size, info = info, supports = [], saves = [], registerAllocation = registerAllocation} val instruction = Instruction.FBinAS {oper = oper} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | pFBinASP {oper, src, dst, size} (* Floating-point binary arithmetic stack pop instructions. * Require src operand as follows: * * src * fltreg add * * * * only st(0) * * Require dst operand as follows: * * dst * fltreg add * * * * only st(1) * * Require size modifier class as follows: FLT *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {assembly = assembly_src_dst, registerAllocation, ...} = RA.allocateFltStackOperands {operand_top = src, move_top = true, size_top = size, operand_one = dst, move_one = true, size_one = size, info = info, supports = [], saves = [], registerAllocation = registerAllocation} val instruction = Instruction.FBinASP {oper = oper} val {fltrename = fltrename_pop, registerAllocation} = RA.fltpop {registerAllocation = registerAllocation} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val final_uses = List.revMap(final_uses, RA.fltrenameLift fltrename_pop) val final_defs = List.revMap(final_defs, RA.fltrenameLift fltrename_pop) val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | FLDCW {src} (* Floating-point load control word; p. 252 * Require src operand as follows: * * dst * reg imm lab add * X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_src, assembly = assembly_src, registerAllocation} = RA.allocateOperand {operand = src, options = {register = false, immediate = false, label = false, address = true}, info = info, size = Size.WORD, move = false, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.FLDCW {src = final_src} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_src, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | FSTCW {dst, check} (* Floating-point store control word; p. 289 * Require dst operand as follows: * * dst * reg imm lab add * X *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = false, immediate = false, label = false, address = true}, info = info, size = Size.WORD, move = false, supports = [], saves = [], force = [], registerAllocation = registerAllocation} val instruction = Instruction.FSTCW {dst = final_dst, check = check} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | FSTSW {dst, check} (* Floating-point store status word; p. 294 * Require dst operand as follows: * * dst * reg imm lab add * * X * * only register %ax *) => let val {uses,defs,kills} = Instruction.uses_defs_kills instruction val {assembly = assembly_pre, registerAllocation} = RA.pre {uses = uses, defs = defs, kills = kills, info = info, registerAllocation = registerAllocation} val {operand = final_dst, assembly = assembly_dst, registerAllocation} = RA.allocateOperand {operand = dst, options = {register = true, immediate = false, label = false, address = false}, info = info, size = Size.WORD, move = false, supports = [], saves = [], force = [Register.T {reg = Register.EAX, part = Register.X}], registerAllocation = registerAllocation} val instruction = Instruction.FSTSW {dst = final_dst, check = check} val {uses = final_uses, defs = final_defs, ...} = Instruction.uses_defs_kills instruction val {assembly = assembly_post, registerAllocation} = RA.post {uses = uses, final_uses = final_uses, defs = defs, final_defs = final_defs, kills = kills, info = info, registerAllocation = registerAllocation} in {assembly = AppendList.appends [assembly_pre, assembly_dst, AppendList.single (Assembly.instruction instruction), assembly_post], registerAllocation = registerAllocation} end | _ => Error.bug "x86AllocateRegisters.Instruction.allocateRegisters: unimplemented" val (allocateRegisters, allocateRegisters_msg) = tracer "Instruction.allocateRegisters" allocateRegisters end structure Directive = struct open Directive fun allocateRegisters {directive, info, registerAllocation} = let val {assembly, registerAllocation} = case directive of Assume {assumes} => RegisterAllocation.assume {assumes = assumes, info = info, registerAllocation = registerAllocation} | FltAssume {assumes} => RegisterAllocation.fltassume {assumes = assumes, info = info, registerAllocation = registerAllocation} | Cache {caches} => RegisterAllocation.cache {caches = caches, info = info, registerAllocation = registerAllocation} | FltCache {caches} => RegisterAllocation.fltcache {caches = caches, info = info, registerAllocation = registerAllocation} | Reset => RegisterAllocation.reset {registerAllocation = registerAllocation} | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => RegisterAllocation.force {commit_memlocs = commit_memlocs, commit_classes = commit_classes, remove_memlocs = remove_memlocs, remove_classes = remove_classes, dead_memlocs = dead_memlocs, dead_classes = dead_classes, info = info, registerAllocation = registerAllocation} | CCall => RegisterAllocation.ccall {info = info, registerAllocation = registerAllocation} | Return {returns} => RegisterAllocation.return {returns = returns, info = info, registerAllocation = registerAllocation} | Reserve {registers} => RegisterAllocation.reserve {registers = registers, registerAllocation = registerAllocation} | Unreserve {registers} => RegisterAllocation.unreserve {registers = registers, registerAllocation = registerAllocation} | ClearFlt => RegisterAllocation.clearflt {info = info, registerAllocation = registerAllocation} | SaveRegAlloc {live, id} => RegisterAllocation.saveregalloc {live = live, id = id, info = info, registerAllocation = registerAllocation} | RestoreRegAlloc {live, id} => RegisterAllocation.restoreregalloc {live = live, id = id, info = info, registerAllocation = registerAllocation} in {assembly = assembly, registerAllocation = registerAllocation} end val (allocateRegisters, allocateRegisters_msg) = tracer "Directive.allocateRegisters" allocateRegisters end structure Assembly = struct open Assembly fun allocateRegisters {assembly: (t * Liveness.t) list, registerAllocation: RegisterAllocation.t} = let val {assembly, registerAllocation} = List.fold (assembly, {assembly = AppendList.empty, registerAllocation = registerAllocation}, fn ((Comment s,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, Comment s), registerAllocation = registerAllocation} | ((Directive d,info), {assembly, registerAllocation}) => let val {assembly = assembly', registerAllocation} = Directive.allocateRegisters {directive = d, info = info, registerAllocation = registerAllocation} val assembly'' = AppendList.appends [if !Control.Native.commented > 1 then AppendList.fromList [Assembly.comment (String.make (60, #"*")), (Assembly.comment (Directive.toString d))] else AppendList.empty, if !Control.Native.commented > 4 then AppendList.fromList (Liveness.toComments info) else AppendList.empty, assembly', if !Control.Native.commented > 5 then (RegisterAllocation.toComments registerAllocation) else AppendList.empty] in {assembly = AppendList.append (assembly, assembly''), registerAllocation = registerAllocation} end | ((PseudoOp p,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, PseudoOp p), registerAllocation = registerAllocation} | ((Label l,_), {assembly, registerAllocation}) => {assembly = AppendList.snoc (assembly, Label l), registerAllocation = registerAllocation} | ((Instruction i,info), {assembly, registerAllocation}) => let val {assembly = assembly', registerAllocation} = Instruction.allocateRegisters {instruction = i, info = info, registerAllocation = registerAllocation} val assembly'' = AppendList.appends [if !Control.Native.commented > 1 then AppendList.fromList [Assembly.comment (String.make (60, #"*")), (Assembly.comment (Instruction.toString i))] else AppendList.empty, if !Control.Native.commented > 4 then AppendList.fromList (Liveness.toComments info) else AppendList.empty, assembly', if !Control.Native.commented > 5 then (RegisterAllocation.toComments registerAllocation) else AppendList.empty] in {assembly = AppendList.append (assembly, assembly''), registerAllocation = registerAllocation} end) val assembly = AppendList.toList assembly val assembly = if !Control.Native.commented > 1 then (Assembly.comment (String.make (60, #"&")):: Assembly.comment (String.make (60, #"&")):: assembly) else assembly in {assembly = assembly, registerAllocation = registerAllocation} end val (allocateRegisters, allocateRegisters_msg) = tracer "Assembly.allocateRegisters" allocateRegisters end fun allocateRegisters {assembly : Assembly.t list list, liveness : bool} : Assembly.t list list = let val {get = getInfo : Label.t -> Label.t option, set = setInfo, ...} = Property.getSetOnce (Label.plist, Property.initConst NONE) fun unroll label = case getInfo label of NONE => label | SOME label' => unroll label' val assembly = List.fold (assembly, [], fn (assembly,assembly') => let val assembly = if liveness then Liveness.toLiveness assembly else Liveness.toNoLiveness assembly val {assembly, ...} = Assembly.allocateRegisters {assembly = assembly, registerAllocation = RegisterAllocation.empty ()} val rec doit = fn (Assembly.Comment _)::assembly => doit assembly | (Assembly.PseudoOp (PseudoOp.P2align _))::assembly => doit' (assembly, []) | _ => false and doit' = fn ((Assembly.Comment _)::assembly, labels) => doit' (assembly, labels) | ((Assembly.PseudoOp (PseudoOp.Local _))::assembly, labels) => doit' (assembly, labels) | ((Assembly.Label l)::assembly, labels) => doit' (assembly, l::labels) | (assembly, labels) => doit'' (assembly, labels) and doit'' = fn ((Assembly.Comment _)::assembly, labels) => doit'' (assembly, labels) | ((Assembly.Instruction (Instruction.JMP {target = Operand.Label label, absolute = false}))::assembly, labels) => doit''' (assembly, labels, label) | _ => false and doit''' = fn ([], labels, label) => let val label' = unroll label in if List.contains(labels, label', Label.equals) then false else (List.foreach (labels, fn label'' => setInfo(label'', SOME label')); true) end | ((Assembly.Comment _)::assembly, labels, label) => doit''' (assembly, labels, label) | _ => false in if doit assembly then assembly' else assembly::assembly' end) fun replacer _ oper = (case (Operand.deImmediate oper, Operand.deLabel oper) of (SOME immediate, _) => (case Immediate.deLabel immediate of SOME label => Operand.immediate_label (unroll label) | NONE => oper) | (_, SOME label) => Operand.label (unroll label) | _ => oper) val assembly = List.fold (assembly, [], fn (assembly,assembly') => (List.map(assembly, Assembly.replace replacer))::assembly') in assembly end val (allocateRegisters, allocateRegisters_msg) = tracerTop "allocateRegisters" allocateRegisters fun allocateRegisters_totals () = (allocateRegisters_msg (); Control.indent (); Liveness.toLiveness_msg (); Liveness.toNoLiveness_msg (); Assembly.allocateRegisters_msg (); Control.indent (); Instruction.allocateRegisters_msg (); Control.indent (); RegisterAllocation.pre_msg (); RegisterAllocation.post_msg (); RegisterAllocation.allocateOperand_msg (); RegisterAllocation.allocateFltOperand_msg (); RegisterAllocation.allocateFltStackOperands_msg (); Control.unindent (); Directive.allocateRegisters_msg (); Control.unindent (); Control.unindent()) end mlton-20100608/mlton/codegen/x86-codegen/x86-allocate-registers.sig0000644000076600000240000000153411404435625023272 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_ALLOCATE_REGISTERS_STRUCTS = sig structure x86 : X86 structure x86MLton : X86_MLTON sharing x86 = x86MLton.x86 end signature X86_ALLOCATE_REGISTERS = sig include X86_ALLOCATE_REGISTERS_STRUCTS val allocateRegisters : {assembly: x86.Assembly.t list list, liveness: bool} -> x86.Assembly.t list list val allocateRegisters_totals : unit -> unit val picRelative : unit -> (x86.Label.t -> x86.Label.t) * x86.Register.t option end mlton-20100608/mlton/codegen/x86-codegen/x86-codegen.fun0000644000076600000240000005077511404435625021126 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86Codegen (S: X86_CODEGEN_STRUCTS): X86_CODEGEN = struct open S structure x86 = x86 (open Machine structure RepType = Type) structure x86Pseudo = x86PseudoCheck (structure S = x86) structure x86MLtonBasic = x86MLtonBasic (structure x86 = x86Pseudo structure Machine = Machine) structure x86Liveness = x86Liveness (structure x86 = x86 structure x86MLtonBasic = x86MLtonBasic) structure x86JumpInfo = x86JumpInfo (structure x86 = x86) structure x86LoopInfo = x86LoopInfo (structure x86 = x86) structure x86EntryTransfer = x86EntryTransfer (structure x86 = x86) structure x86MLton = x86MLton (structure x86MLtonBasic = x86MLtonBasic structure x86Liveness = x86Liveness) val implementsPrim = x86MLton.implementsPrim structure x86Translate = x86Translate (structure x86 = x86 structure x86MLton = x86MLton structure x86Liveness = x86Liveness) structure x86Simplify = x86Simplify (structure x86 = x86 structure x86Liveness = x86Liveness structure x86JumpInfo = x86JumpInfo structure x86EntryTransfer = x86EntryTransfer) structure x86GenerateTransfers = x86GenerateTransfers (structure x86 = x86 structure x86MLton = x86MLton structure x86Liveness = x86Liveness structure x86JumpInfo = x86JumpInfo structure x86LoopInfo = x86LoopInfo structure x86EntryTransfer = x86EntryTransfer) structure x86AllocateRegisters = x86AllocateRegisters (structure x86 = x86 structure x86MLton = x86MLton) open x86 fun output {program as Machine.Program.T {chunks, frameLayouts, handlesSignals, main, ...}, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}}: unit = let val reserveEsp = (* There is no sigaltstack on cygwin, we need to reserve %esp to * hold the C stack pointer. We only need to do this in programs * that handle signals. *) handlesSignals andalso let open Control.Target in !os = Cygwin end val (picMungeLabel, picBase) = x86AllocateRegisters.picRelative () val makeC = outputC val makeS = outputS val Machine.Program.T {profileInfo, ...} = program val profileInfo = case profileInfo of NONE => Machine.ProfileInfo.empty | SOME pi => pi val {newProfileLabel, delProfileLabel, getProfileInfo} = Machine.ProfileInfo.modify profileInfo (* C specific *) fun outputC () = let local val Machine.Program.T {chunks, frameLayouts, frameOffsets, handlesSignals, intInfs, main, maxFrameSize, objectTypes, reals, vectors, ...} = program in val program = Machine.Program.T {chunks = chunks, frameLayouts = frameLayouts, frameOffsets = frameOffsets, handlesSignals = handlesSignals, intInfs = intInfs, main = main, maxFrameSize = maxFrameSize, objectTypes = objectTypes, profileInfo = SOME (getProfileInfo ()), reals = reals, vectors = vectors} end val {print, done, ...} = makeC () val additionalMainArgs = let val mainLabel = Label.toString (#label main) (* Drop the leading _, because gcc will add it. *) val mainLabel = if !Control.labelsHaveExtra_ then String.dropPrefix (mainLabel, 1) else mainLabel in [mainLabel] end fun declareLocals () = List.foreach (CType.all, fn t => let val m = List.fold (chunks, ~1, fn (Machine.Chunk.T {regMax, ...}, max) => Int.max (max, regMax t)) val m = m + 1 in print (concat ["PRIVATE ", CType.toString t, " local", CType.toString t, "[", Int.toString m, "];\n"]) end) fun rest () = declareLocals () in CCodegen.outputDeclarations {additionalMainArgs = additionalMainArgs, includes = ["x86-main.h"], print = print, program = program, rest = rest} ; done () end val outputC = Control.trace (Control.Pass, "outputC") outputC (* Assembly specific *) val _ = x86MLtonBasic.init () fun outputJumpToSML print = let val jumpToSML = x86.Label.fromString "MLton_jumpToSML" val findEIP = x86.Label.fromString "MLton_findEIP" val returnToC = x86.Label.fromString "Thread_returnToC" val c_stackP = picMungeLabel x86MLton.c_stackP val gcState = picMungeLabel x86MLton.gcState_label val {frontierReg, stackTopReg} = if reserveEsp then {frontierReg = x86.Register.edi, stackTopReg = x86.Register.ebp} else {frontierReg = x86.Register.esp, stackTopReg = x86.Register.ebp} val prefixJumpToSML = [ x86.Assembly.pseudoop_text (), x86.Assembly.pseudoop_p2align (x86.Immediate.int 4, NONE, NONE), x86.Assembly.pseudoop_global jumpToSML, x86.Assembly.pseudoop_hidden jumpToSML, x86.Assembly.label jumpToSML, x86.Assembly.instruction_binal {oper = x86.Instruction.SUB, src = x86.Operand.immediate_int 28, dst = x86.Operand.register x86.Register.esp, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 32), base = SOME x86.Register.esp, index= NONE, scale = NONE}, dst = x86.Operand.register x86.Register.eax, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.ebp, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 24), base = SOME x86.Register.esp, index= NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.ebx, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 20), base = SOME x86.Register.esp, index= NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.edi, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 16), base = SOME x86.Register.esp, index= NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.esi, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 12), base = SOME x86.Register.esp, index = NONE, scale = NONE}, size = x86.Size.LONG} ] (* This is only included if PIC *) val loadGOT = [ x86.Assembly.instruction_call {target = x86.Operand.label findEIP, absolute = false}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, src = x86.Operand.immediate_label x86MLton.globalOffsetTable, dst = x86.Operand.register x86.Register.ebx, size = x86.Size.LONG} ] val suffixJumpToSML = [ x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.label c_stackP), base = picBase, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebp, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.ebp, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 8), base = SOME x86.Register.esp, index = NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.esp, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.label c_stackP), base = picBase, index = NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = (SOME o x86.Immediate.labelPlusInt) (gcState, Bytes.toInt (Machine.Runtime.GCField.offset Machine.Runtime.GCField.StackTop)), base = picBase, index = NONE, scale = NONE}, dst = x86.Operand.register stackTopReg, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = (SOME o x86.Immediate.labelPlusInt) (gcState, Bytes.toInt (Machine.Runtime.GCField.offset Machine.Runtime.GCField.Frontier)), base = picBase, index = NONE, scale = NONE}, dst = x86.Operand.register frontierReg, size = x86.Size.LONG}, x86.Assembly.instruction_jmp {target = x86.Operand.register x86.Register.eax, absolute = true} ] val bodyReturnToC = [ x86.Assembly.pseudoop_p2align (x86.Immediate.int 4, NONE, NONE), x86.Assembly.pseudoop_global returnToC, x86.Assembly.pseudoop_hidden returnToC, x86.Assembly.label returnToC, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.label c_stackP), base = picBase, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.esp, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 8), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebp, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = x86.Operand.register x86.Register.ebp, dst = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.label c_stackP), base = picBase, index = NONE, scale = NONE}, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 12), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.esi, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 16), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.edi, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 20), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebx, size = x86.Size.LONG}, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {disp = SOME (x86.Immediate.int 24), base = SOME x86.Register.esp, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebp, size = x86.Size.LONG}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, src = x86.Operand.immediate_int 28, dst = x86.Operand.register x86.Register.esp, size = x86.Size.LONG}, x86.Assembly.instruction_ret {src = NONE} ] (* This is only included if PIC *) val bodyFindEIP = [ x86.Assembly.pseudoop_p2align (x86.Immediate.int 4, NONE, NONE), x86.Assembly.pseudoop_global findEIP, x86.Assembly.pseudoop_hidden findEIP, x86.Assembly.label findEIP, x86.Assembly.instruction_mov {src = (x86.Operand.address o x86.Address.T) {base = SOME x86.Register.esp, disp = NONE, index = NONE, scale = NONE}, dst = x86.Operand.register x86.Register.ebx, size = x86.Size.LONG}, x86.Assembly.instruction_ret {src = NONE} ] val asm = List.concat (if picBase <> NONE then [prefixJumpToSML, loadGOT, suffixJumpToSML, bodyReturnToC, bodyFindEIP] else [prefixJumpToSML, suffixJumpToSML, bodyReturnToC]) in List.foreach (asm, fn asm => (Layout.print(Assembly.layout asm, print); print "\n")) end val liveInfo = x86Liveness.LiveInfo.newLiveInfo () val jumpInfo = x86JumpInfo.newJumpInfo () fun frameInfoToX86 (Machine.FrameInfo.T {frameLayoutsIndex, ...}) = x86.FrameInfo.T {frameLayoutsIndex = frameLayoutsIndex, size = Bytes.toInt (#size (Vector.sub (frameLayouts, frameLayoutsIndex)))} fun outputChunk (chunk as Machine.Chunk.T {blocks, chunkLabel, ...}, print) = let val isMain = Machine.ChunkLabel.equals(#chunkLabel main, chunkLabel) val () = if isMain then outputJumpToSML print else () val {chunk} = x86Translate.translateChunk {chunk = chunk, frameInfoToX86 = frameInfoToX86, liveInfo = liveInfo} val chunk : x86.Chunk.t = x86Simplify.simplify {chunk = chunk, (* don't perform optimizations on * the main function (initGlobals) *) optimize = if isMain then 0 else !Control.Native.optimize, delProfileLabel = delProfileLabel, liveInfo = liveInfo, jumpInfo = jumpInfo} val unallocated_assembly : x86.Assembly.t list list = (x86GenerateTransfers.generateTransfers {chunk = chunk, optimize = !Control.Native.optimize, newProfileLabel = newProfileLabel, liveInfo = liveInfo, jumpInfo = jumpInfo, reserveEsp = reserveEsp, picUsesEbx = picBase <> NONE}) val allocated_assembly : Assembly.t list list = x86AllocateRegisters.allocateRegisters {assembly = unallocated_assembly, (* don't calculate liveness info * on the main function (initGlobals) *) liveness = not isMain} val _ = Vector.foreach (blocks, Label.clear o Machine.Block.label) val _ = x86.Immediate.clearAll () val _ = x86.MemLoc.clearAll () in List.fold (allocated_assembly, if isMain then 30 else 0, fn (block, n) => List.fold (block, n, fn (asm, n) => (Layout.print (Assembly.layout asm, print); print "\n"; n + 1))) end fun outputAssembly () = let val split = !Control.Native.split fun loop chunks = let val {print, done, ...} = makeS() fun loop' (chunks, size) = case chunks of [] => done () | chunk::chunks => if (case split of NONE => false | SOME maxSize => size > maxSize) then (done (); loop (chunk::chunks)) else loop'(chunks, size + outputChunk (chunk, print)) in loop' (chunks, 0) end in loop chunks ; x86Translate.translateChunk_totals () ; x86Simplify.simplify_totals () ; x86GenerateTransfers.generateTransfers_totals () ; x86AllocateRegisters.allocateRegisters_totals () end val outputAssembly = Control.trace (Control.Pass, "outputAssembly") outputAssembly in outputAssembly() ; outputC() end end mlton-20100608/mlton/codegen/x86-codegen/x86-codegen.sig0000644000076600000240000000166011404435625021105 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_CODEGEN_STRUCTS = sig structure CCodegen: C_CODEGEN structure Machine: MACHINE sharing Machine = CCodegen.Machine end signature X86_CODEGEN = sig include X86_CODEGEN_STRUCTS val implementsPrim: Machine.Type.t Machine.Prim.t -> bool val output: {program: Machine.Program.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} -> unit end mlton-20100608/mlton/codegen/x86-codegen/x86-entry-transfer.fun0000644000076600000240000000627611404435625022502 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86EntryTransfer(S: X86_ENTRY_TRANSFER_STRUCTS) : X86_ENTRY_TRANSFER = struct open S open x86 val tracer = x86.tracer fun verifyEntryTransfer {chunk = Chunk.T {blocks, ...}} = let val {get : Label.t -> Block.t option, set, destroy} = Property.destGetSetOnce(Label.plist, Property.initConst NONE) val _ = List.foreach (blocks, fn block as Block.T {entry,...} => set(Entry.label entry, SOME block)) fun isJump l = case get l of SOME (Block.T {entry = Entry.Jump _, ...}) => true | _ => false fun isFunc l = case get l of SOME (Block.T {entry = Entry.Func _, ...}) => true | NONE => true | _ => false fun isCont l = case get l of SOME (Block.T {entry = Entry.Cont _, ...}) => true | _ => false fun isHandler l = case get l of SOME (Block.T {entry = Entry.Handler _, ...}) => true | _ => false fun isCReturn l f = case get l of SOME (Block.T {entry = Entry.CReturn {func, ...}, ...}) => CFunction.equals (f, func) | _ => false val b = List.forall (blocks, fn Block.T {transfer, ...} => (case transfer of Transfer.Goto {target, ...} => isJump target | Transfer.Iff {truee, falsee, ...} => isJump truee andalso isJump falsee | Transfer.Switch {cases, default, ...} => isJump default andalso Transfer.Cases.forall(cases, isJump o #2) | Transfer.Tail {target, ...} => isFunc target | Transfer.NonTail {target, return, handler, ...} => isFunc target andalso isCont return andalso (case handler of SOME handler => isHandler handler | NONE => true) | Transfer.Return {...} => true | Transfer.Raise {...} => true | Transfer.CCall {return, func, ...} => (case return of NONE => true | SOME l => isCReturn l func))) val _ = destroy () val _ = if b then () else List.foreach(blocks, Block.printBlock) in b end val (verifyEntryTransfer, verifyEntryTransfer_msg) = tracer "verifyEntryTransfer" verifyEntryTransfer end mlton-20100608/mlton/codegen/x86-codegen/x86-entry-transfer.sig0000644000076600000240000000100411404435625022454 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_ENTRY_TRANSFER_STRUCTS = sig structure x86 : X86 end signature X86_ENTRY_TRANSFER = sig include X86_ENTRY_TRANSFER_STRUCTS val verifyEntryTransfer : {chunk: x86.Chunk.t} -> bool val verifyEntryTransfer_msg : unit -> unit end mlton-20100608/mlton/codegen/x86-codegen/x86-generate-transfers.fun0000644000076600000240000031301711404435625023310 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86GenerateTransfers(S: X86_GENERATE_TRANSFERS_STRUCTS): X86_GENERATE_TRANSFERS = struct open S open x86 open x86JumpInfo open x86LoopInfo open x86Liveness open LiveInfo open Liveness local open Runtime in structure CFunction = CFunction end val ones : int * WordSize.t -> WordX.t = fn (i, ws) => (WordX.notb o WordX.lshift) (WordX.allOnes ws, WordX.fromIntInf (IntInf.fromInt i, ws)) val tracerTop = x86.tracerTop structure x86LiveTransfers = x86LiveTransfers(structure x86 = x86 structure x86Liveness = x86Liveness structure x86JumpInfo = x86JumpInfo structure x86LoopInfo = x86LoopInfo) val pointerSize = x86MLton.pointerSize val wordSize = x86MLton.wordSize val normalRegs = let val transferRegs = (* Register.eax:: Register.al:: *) Register.ebx:: Register.bl:: Register.ecx:: Register.cl:: Register.edx:: Register.dl:: Register.edi:: Register.esi:: (* Register.esp:: Register.ebp:: *) nil in {frontierReg = Register.esp, stackTopReg = Register.ebp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.eax::Register.al::transferRegs | _ => []} end val reserveEspRegs = let val transferRegs = (* Register.eax:: Register.al:: *) Register.ebx:: Register.bl:: Register.ecx:: Register.cl:: Register.edx:: Register.dl:: (* Register.edi:: *) Register.esi:: (* Register.esp:: Register.ebp:: *) nil in {frontierReg = Register.edi, stackTopReg = Register.ebp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.eax::Register.al::transferRegs | _ => []} end val picUsesEbxRegs = let val transferRegs = (* Register.eax:: Register.al:: *) (* Register.ebx:: Register.bl:: *) Register.ecx:: Register.cl:: Register.edx:: Register.dl:: Register.edi:: Register.esi:: (* Register.esp:: Register.ebp:: *) nil in {frontierReg = Register.esp, stackTopReg = Register.ebp, transferRegs = fn Entry.Jump _ => transferRegs | Entry.CReturn _ => Register.eax::Register.al::transferRegs | _ => []} end val transferFltRegs : Entry.t -> Int.t = fn Entry.Jump _ => 6 | Entry.CReturn _ => 6 | _ => 0 val indexReg = x86.Register.eax val stackTop = x86MLton.gcState_stackTopContents val frontier = x86MLton.gcState_frontierContents datatype gef = GEF of {generate : gef -> {label : Label.t, falling : bool, unique : bool} -> Assembly.t AppendList.t, effect : gef -> {label : Label.t, transfer : Transfer.t} -> Assembly.t AppendList.t, fall : gef -> {label : Label.t, live : LiveSet.t} -> Assembly.t AppendList.t} fun generateTransfers {chunk as Chunk.T {data, blocks, ...}, optimize: int, newProfileLabel: x86.ProfileLabel.t -> x86.ProfileLabel.t, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t, reserveEsp: bool, picUsesEbx: bool} = let val {frontierReg, stackTopReg, transferRegs} = if reserveEsp then reserveEspRegs else if picUsesEbx then picUsesEbxRegs else normalRegs val allClasses = !x86MLton.Classes.allClasses val livenessClasses = !x86MLton.Classes.livenessClasses val livenessClasses = ClassSet.add(livenessClasses, x86MLton.Classes.StaticNonTemp) val nonlivenessClasses = ClassSet.-(allClasses, livenessClasses) val holdClasses = !x86MLton.Classes.holdClasses val farflushClasses = ClassSet.-(nonlivenessClasses, holdClasses) val nearflushClasses = ClassSet.-(nonlivenessClasses, holdClasses) val runtimeClasses = !x86MLton.Classes.runtimeClasses val cstaticClasses = !x86MLton.Classes.cstaticClasses val heapClasses = !x86MLton.Classes.heapClasses val ccallflushClasses = ClassSet.+(cstaticClasses, heapClasses) fun removeHoldMemLocs memlocs = MemLocSet.subset (memlocs, fn m => not (ClassSet.contains(holdClasses, MemLoc.class m))) val stackAssume = {register = stackTopReg, memloc = stackTop (), weight = 1024, sync = false, reserve = false} val frontierAssume = {register = frontierReg, memloc = frontier (), weight = 2048, sync = false, reserve = false} val cStackAssume = {register = Register.esp, memloc = x86MLton.c_stackPContents, weight = 2048, (* ??? *) sync = false, reserve = true} val picUsesEbxAssume = {register = Register.ebx, memloc = x86MLton.globalOffsetTableContents, weight = 2048, (* ??? *) sync = false, reserve = true} fun blockAssumes l = let val l = frontierAssume :: stackAssume :: l val l = if reserveEsp then cStackAssume :: l else l val l = if picUsesEbx then picUsesEbxAssume :: l else l in Assembly.directive_assume {assumes = l } end fun runtimeTransfer live setup trans = AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = removeHoldMemLocs live, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), setup, AppendList.fromList [(Assembly.directive_clearflt ()), (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = farflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], trans] fun farEntry l = AppendList.cons (blockAssumes [], l) fun farTransfer live setup trans = AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = removeHoldMemLocs live, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), setup, AppendList.fromList [(Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}), (Assembly.directive_clearflt ()), (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = farflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], trans] val profileStackTopCommit' = x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton (stackTop ()), commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty} val profileStackTopCommit = if !Control.profile <> Control.ProfileNone then AppendList.single profileStackTopCommit' else AppendList.empty val _ = Assert.assert ("x86GenerateTransfers.verifyLiveInfo", fn () => x86Liveness.LiveInfo.verifyLiveInfo {chunk = chunk, liveInfo = liveInfo}) val _ = Assert.assert ("x86GenerateTransfers.verifyJumpInfo", fn () => x86JumpInfo.verifyJumpInfo {chunk = chunk, jumpInfo = jumpInfo}) val _ = Assert.assert ("x86GenerateTransfers.verifyEntryTransfer", fn () => x86EntryTransfer.verifyEntryTransfer {chunk = chunk}) local val {get: Label.t -> {block:Block.t}, set, destroy} = Property.destGetSetOnce (Label.plist, Property.initRaise ("gotoInfo", Label.layout)) val labels = List.fold (blocks, [], fn (block as Block.T {entry, ...}, labels) => let val label = Entry.label entry in set(label, {block = block}) ; label::labels end) fun loop labels = let val (labels, b) = List.fold (labels, ([], false), fn (label, (labels, b)) => case x86JumpInfo.getNear (jumpInfo, label) of x86JumpInfo.Count 0 => let val {block = Block.T {transfer, ...}} = get label in List.foreach (Transfer.nearTargets transfer, fn label => x86JumpInfo.decNear (jumpInfo, label)); (labels, true) end | _ => (label::labels, b)) in if b then loop labels else List.map (labels, #block o get) end val blocks = loop labels val _ = destroy () in val chunk = Chunk.T {data = data, blocks = blocks} end val loopInfo = x86LoopInfo.createLoopInfo {chunk = chunk, farLoops = false} val isLoopHeader = fn label => isLoopHeader(loopInfo, label) handle _ => false val liveTransfers = x86LiveTransfers.computeLiveTransfers {chunk = chunk, transferRegs = transferRegs, transferFltRegs = transferFltRegs, liveInfo = liveInfo, jumpInfo = jumpInfo, loopInfo = loopInfo} val getLiveRegsTransfers = #1 o x86LiveTransfers.getLiveTransfers val getLiveFltRegsTransfers = #2 o x86LiveTransfers.getLiveTransfers val {get = getLayoutInfo : Label.t -> Block.t option, set = setLayoutInfo, destroy = destLayoutInfo} = Property.destGetSet(Label.plist, Property.initRaise ("layoutInfo", Label.layout)) val _ = List.foreach (blocks, fn block as Block.T {entry, ...} => let val label = Entry.label entry in setLayoutInfo(label, SOME block) end) val {get = getProfileLabel : Label.t -> ProfileLabel.t option, set = setProfileLabel, destroy = destProfileLabel} = Property.destGetSetOnce (Label.plist, Property.initRaise ("profileLabel", Label.layout)) val _ = List.foreach (blocks, fn Block.T {entry, profileLabel, ...} => let val label = Entry.label entry in setProfileLabel(label, profileLabel) end) local val stack = ref [] val queue = ref (Queue.empty ()) in fun enque x = queue := Queue.enque(!queue, x) fun push x = stack := x::(!stack) fun deque () = (case (!stack) of [] => (case Queue.deque(!queue) of NONE => NONE | SOME(queue', x) => (queue := queue'; SOME x)) | x::stack' => (stack := stack'; SOME x)) end fun pushCompensationBlock {label, id} = let val label' = Label.new label val live = getLive(liveInfo, label) val profileLabel = getProfileLabel label val profileLabel' = Option.map (profileLabel, newProfileLabel) val block = Block.T {entry = Entry.jump {label = label'}, profileLabel = profileLabel', statements = (Assembly.directive_restoreregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet live, stackTop ()), frontier ()), id = id}):: nil, transfer = Transfer.goto {target = label}} in setLive(liveInfo, label', live); setProfileLabel(label', profileLabel'); incNear(jumpInfo, label'); Assert.assert("x86GenerateTransfers.pushCompensationBlock", fn () => getNear(jumpInfo, label') = Count 1); x86LiveTransfers.setLiveTransfersEmpty(liveTransfers, label'); setLayoutInfo(label', SOME block); push label'; label' end val c_stackP = x86MLton.c_stackPContentsOperand fun cacheEsp () = if reserveEsp then AppendList.empty else AppendList.single ((* explicit cache in case there are no args *) Assembly.directive_cache {caches = [{register = Register.esp, memloc = valOf (Operand.deMemloc c_stackP), reserve = true}]}) fun unreserveEsp () = if reserveEsp then AppendList.empty else AppendList.single (Assembly.directive_unreserve {registers = [Register.esp]}) local val set: (word * String.t * Label.t) HashSet.t = HashSet.new {hash = #1} in fun makeDarwinSymbolStubLabel name = let val hash = String.hash name in (#3 o HashSet.lookupOrInsert) (set, hash, fn (hash', name', _) => hash = hash' andalso name = name', fn () => (hash, name, Label.newString (concat ["L_", name, "_stub"]))) end fun makeDarwinSymbolStubs () = HashSet.fold (set, [], fn ((_, name, label), assembly) => (Assembly.pseudoop_symbol_stub ()) :: (Assembly.label label) :: (Assembly.pseudoop_indirect_symbol (Label.fromString name)) :: (Assembly.instruction_hlt ()) :: (Assembly.instruction_hlt ()) :: (Assembly.instruction_hlt ()) :: (Assembly.instruction_hlt ()) :: (Assembly.instruction_hlt ()) :: assembly) end datatype z = datatype Entry.t datatype z = datatype Transfer.t fun generateAll (gef as GEF {effect,...}) {label, falling, unique} : Assembly.t AppendList.t = (case getLayoutInfo label of NONE => AppendList.empty | SOME (Block.T {entry, profileLabel, statements, transfer}) => let val _ = setLayoutInfo(label, NONE) (* val isLoopHeader = fn _ => false *) fun near label = let val align = if isLoopHeader label handle _ => false then AppendList.single (Assembly.pseudoop_p2align (Immediate.int 4, NONE, SOME (Immediate.int 7))) else if falling then AppendList.empty else AppendList.single (Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE)) val assumes = if falling andalso unique then AppendList.empty else (* near entry & live transfer assumptions *) AppendList.fromList [(blockAssumes (List.map (getLiveRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))), (Assembly.directive_fltassume {assumes = (List.map (getLiveFltRegsTransfers (liveTransfers, label), fn (memloc,sync) => {memloc = memloc, sync = sync, weight = 1024}))})] in AppendList.appends [align, AppendList.single (Assembly.label label), AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), assumes] end val pre = case entry of Jump {label} => near label | CReturn {dsts, frameInfo, func, label} => let fun getReturn () = if Vector.length dsts = 0 then AppendList.empty else let val srcs = Vector.fromList (List.map (Operand.cReturnTemps (CFunction.return func), #dst)) in (AppendList.fromList o Vector.fold2) (dsts, srcs, [], fn ((dst,dstsize),src,stmts) => case Size.class dstsize of Size.INT => (x86.Assembly.instruction_mov {dst = dst, src = Operand.memloc src, size = dstsize})::stmts | Size.FLT => (x86.Assembly.instruction_pfmov {dst = dst, src = Operand.memloc src, size = dstsize})::stmts | _ => Error.bug "x86GenerateTransfers.generateAll: CReturn") end in case frameInfo of SOME fi => let val FrameInfo.T {size, frameLayoutsIndex} = fi val finish = AppendList.appends [let val stackTop = x86MLton.gcState_stackTopContentsOperand () val bytes = x86.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end, (* assignTo dst *) getReturn ()] in AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameLayoutsIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), if CFunction.maySwitchThreads func then (* entry from far assumptions *) farEntry finish else (* near entry & live transfer assumptions *) AppendList.append (AppendList.fromList [(blockAssumes (List.map (getLiveRegsTransfers (liveTransfers, label), fn (memloc,register,sync) => {register = register, memloc = memloc, sync = sync, weight = 1024, reserve = false}))), (Assembly.directive_fltassume {assumes = (List.map (getLiveFltRegsTransfers (liveTransfers, label), fn (memloc,sync) => {memloc = memloc, sync = sync, weight = 1024}))})], finish)] end | NONE => AppendList.append (near label, getReturn ()) end | Func {label,...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_global label, Assembly.pseudoop_hidden label, Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry AppendList.empty)] | Cont {label, frameInfo = FrameInfo.T {size, frameLayoutsIndex}, ...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameLayoutsIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry (let val stackTop = x86MLton.gcState_stackTopContentsOperand () val bytes = x86.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end))] | Handler {frameInfo = (FrameInfo.T {frameLayoutsIndex, size}), label, ...} => AppendList.appends [AppendList.fromList [Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.pseudoop_long [Immediate.int frameLayoutsIndex], Assembly.label label], AppendList.fromList (ProfileLabel.toAssemblyOpt profileLabel), (* entry from far assumptions *) (farEntry (let val stackTop = x86MLton.gcState_stackTopContentsOperand () val bytes = x86.Operand.immediate_int (~ size) in AppendList.cons ((* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, profileStackTopCommit) end))] val pre = AppendList.appends [if !Control.Native.commented > 1 then AppendList.single (Assembly.comment (Entry.toString entry)) else AppendList.empty, if !Control.Native.commented > 2 then AppendList.single (Assembly.comment (LiveSet.fold (getLive(liveInfo, label), "", fn (memloc, s) => concat [s, MemLoc.toString memloc, " "]))) else AppendList.empty, pre] val (statements,_) = List.foldr (statements, ([], Liveness.liveIn (livenessTransfer {transfer = transfer, liveInfo = liveInfo})), fn (assembly,(statements,live)) => let val Liveness.T {liveIn,dead, ...} = livenessAssembly {assembly = assembly, live = live} in (if LiveSet.isEmpty dead then assembly::statements else assembly:: (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}):: statements, liveIn) end) val statements = AppendList.fromList statements val transfer = effect gef {label = label, transfer = transfer} in AppendList.appends [pre, statements, transfer] end) and effectDefault (gef as GEF {fall,...}) {label, transfer} : Assembly.t AppendList.t = AppendList.append (if !Control.Native.commented > 1 then AppendList.single (Assembly.comment (Transfer.toString transfer)) else AppendList.empty, case transfer of Goto {target} => fall gef {label = target, live = getLive(liveInfo, target)} | Iff {condition, truee, falsee} => let val condition_neg = Instruction.condition_negate condition val truee_live = getLive(liveInfo, truee) val truee_live_length = LiveSet.size truee_live val falsee_live = getLive(liveInfo, falsee) val falsee_live_length = LiveSet.size falsee_live fun fall_truee () = let val id = Directive.Id.new () val falsee' = pushCompensationBlock {label = falsee, id = id}; in AppendList.append (AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = condition_neg, target = Operand.label falsee'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet falsee_live, stackTop ()), frontier ()), id = id}], (fall gef {label = truee, live = truee_live})) end fun fall_falsee () = let val id = Directive.Id.new () val truee' = pushCompensationBlock {label = truee, id = id}; in AppendList.append (AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = condition, target = Operand.label truee'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet truee_live, stackTop ()), frontier ()), id = id}], (fall gef {label = falsee, live = falsee_live})) end in case (getLayoutInfo truee, getLayoutInfo falsee) of (NONE, SOME _) => fall_falsee () | (SOME _, NONE) => fall_truee () | _ => let fun default' () = if truee_live_length <= falsee_live_length then fall_falsee () else fall_truee () fun default () = case (getNear(jumpInfo, truee), getNear(jumpInfo, falsee)) of (Count 1, Count 1) => default' () | (Count 1, _) => fall_truee () | (_, Count 1) => fall_falsee () | _ => default' () in case (getLoopDistance(loopInfo, label, truee), getLoopDistance(loopInfo, label, falsee)) of (NONE, NONE) => default () | (SOME _, NONE) => fall_truee () | (NONE, SOME _) => fall_falsee () | (SOME dtruee, SOME dfalsee) => (case Int.compare(dtruee, dfalsee) of EQUAL => default () | LESS => fall_falsee () | GREATER => fall_truee ()) end end | Switch {test, cases, default} => let val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val size = case Operand.size test of SOME size => size | NONE => Size.LONG val default_live = getLive(liveInfo, default) val cases = Transfer.Cases.mapToList (cases, fn (k, target) => let val target_live = getLive(liveInfo, target) val id = Directive.Id.new () val target' = pushCompensationBlock {label = target, id = id} in AppendList.fromList [Assembly.instruction_cmp {src1 = test, src2 = Operand.immediate_word k, size = size}, Assembly.instruction_jcc {condition = Instruction.E, target = Operand.label target'}, Assembly.directive_saveregalloc {live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet target_live, stackTop ()), frontier ()), id = id}] end) in AppendList.appends [AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}), AppendList.appends cases, if LiveSet.isEmpty dead then AppendList.empty else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}), (fall gef {label = default, live = default_live})] end | Tail {target, live} => (* flushing at far transfer *) (farTransfer live AppendList.empty (AppendList.single (Assembly.instruction_jmp {target = Operand.label target, absolute = false}))) | NonTail {target, live, return, handler, size} => let val _ = enque return val _ = case handler of SOME handler => enque handler | NONE => () val stackTopTemp = x86MLton.stackTopTempContentsOperand () val stackTopTempMinusWordDeref' = x86MLton.stackTopTempMinusWordDeref () val stackTopTempMinusWordDeref = x86MLton.stackTopTempMinusWordDerefOperand () val stackTop = x86MLton.gcState_stackTopContentsOperand () val stackTopMinusWordDeref' = x86MLton.gcState_stackTopMinusWordDeref () val stackTopMinusWordDeref = x86MLton.gcState_stackTopMinusWordDerefOperand () val bytes = x86.Operand.immediate_int size val liveReturn = x86Liveness.LiveInfo.getLive(liveInfo, return) val liveHandler = case handler of SOME handler => x86Liveness.LiveInfo.getLive(liveInfo, handler) | _ => LiveSet.empty val live = MemLocSet.unions [live, LiveSet.toMemLocSet liveReturn, LiveSet.toMemLocSet liveHandler] in (* flushing at far transfer *) (farTransfer live (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackTop + bytes *) x86.Assembly.instruction_mov {dst = stackTopTemp, src = stackTop, size = pointerSize}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTopTemp, src = bytes, size = pointerSize}, (* *(stackTopTemp - WORD_SIZE) = return *) x86.Assembly.instruction_mov {dst = stackTopTempMinusWordDeref, src = Operand.immediate_label return, size = pointerSize}, x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopTempMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, (* stackTop = stackTopTemp *) x86.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, (* *(stackTop - WORD_SIZE) = return *) x86.Assembly.instruction_mov {dst = stackTopMinusWordDeref, src = Operand.immediate_label return, size = pointerSize}, x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}])) (AppendList.single (Assembly.instruction_jmp {target = Operand.label target, absolute = false}))) end | Return {live} => let val stackTopMinusWordDeref = x86MLton.gcState_stackTopMinusWordDerefOperand () in (* flushing at far transfer *) (farTransfer live AppendList.empty (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (x86.Assembly.instruction_jmp {target = stackTopMinusWordDeref, absolute = true}))) end | Raise {live} => let val exnStack = x86MLton.gcState_exnStackContentsOperand () val stackTopTemp = x86MLton.stackTopTempContentsOperand () val stackTop = x86MLton.gcState_stackTopContentsOperand () val stackBottom = x86MLton.gcState_stackBottomContentsOperand () in (* flushing at far transfer *) (farTransfer live (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackBottom + exnStack *) x86.Assembly.instruction_mov {dst = stackTopTemp, src = stackBottom, size = pointerSize}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTopTemp, src = exnStack, size = pointerSize}, (* stackTop = stackTopTemp *) x86.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop = stackBottom + exnStack *) x86.Assembly.instruction_mov {dst = stackTop, src = stackBottom, size = pointerSize}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = exnStack, size = pointerSize}])) (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (x86.Assembly.instruction_jmp {target = x86MLton.gcState_stackTopMinusWordDerefOperand (), absolute = true}))) end | CCall {args, frameInfo, func, return} => let datatype z = datatype CFunction.Convention.t datatype z = datatype CFunction.SymbolScope.t datatype z = datatype CFunction.Target.t val CFunction.T {convention, maySwitchThreads, modifiesFrontier, readsStackTop, return = returnTy, symbolScope, target, writesStackTop, ...} = func val stackTopMinusWordDeref = x86MLton.gcState_stackTopMinusWordDerefOperand () val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val c_stackP = x86MLton.c_stackPContentsOperand val c_stackPDerefFloat = x86MLton.c_stackPDerefFloatOperand val c_stackPDerefDouble = x86MLton.c_stackPDerefDoubleOperand val applyFFTempFun = x86MLton.applyFFTempFunContentsOperand val applyFFTempArg = x86MLton.applyFFTempArgContentsOperand val (fptrArg, args) = case target of Direct _ => (AppendList.empty, args) | Indirect => let val (fptrArg, args) = case args of fptrArg::args => (fptrArg, args) | _ => Error.bug "x86GenerateTransfers.generateAll: CCall" in (AppendList.single (Assembly.instruction_mov {src = #1 fptrArg, dst = applyFFTempFun, size = #2 fptrArg}), args) end val (pushArgs, size_args) = List.fold (args, (AppendList.empty, 0), fn ((arg, size), (assembly_args, size_args)) => let val (assembly_arg, size_arg) = if Size.eq (size, Size.DBLE) then (AppendList.fromList [Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 8, size = pointerSize}, Assembly.instruction_pfmov {src = arg, dst = c_stackPDerefDouble, size = size}], Size.toBytes size) else if Size.eq (size, Size.SNGL) then (AppendList.fromList [Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int 4, size = pointerSize}, Assembly.instruction_pfmov {src = arg, dst = c_stackPDerefFloat, size = size}], Size.toBytes size) else if Size.eq (size, Size.BYTE) orelse Size.eq (size, Size.WORD) then (AppendList.fromList [Assembly.instruction_movx {oper = Instruction.MOVZX, dst = applyFFTempArg, src = arg, dstsize = wordSize, srcsize = size}, Assembly.instruction_ppush {src = applyFFTempArg, base = c_stackP, size = wordSize}], Size.toBytes wordSize) else (AppendList.single (Assembly.instruction_ppush {src = arg, base = c_stackP, size = size}), Size.toBytes size) in (AppendList.append (assembly_arg, assembly_args), size_arg + size_args) end) val (pushArgs, aligned_size_args) = let val space = 16 - (size_args mod 16) in if space = 16 then (pushArgs, size_args) else (AppendList.append (AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, dst = c_stackP, src = Operand.immediate_int space, size = pointerSize}), pushArgs), size_args + space) end val flush = case frameInfo of SOME (FrameInfo.T {size, ...}) => (* Entering runtime *) let val return = valOf return val _ = enque return val stackTopTemp = x86MLton.stackTopTempContentsOperand () val stackTopTempMinusWordDeref' = x86MLton.stackTopTempMinusWordDeref () val stackTopTempMinusWordDeref = x86MLton.stackTopTempMinusWordDerefOperand () val stackTop = x86MLton.gcState_stackTopContentsOperand () val stackTopMinusWordDeref' = x86MLton.gcState_stackTopMinusWordDeref () val stackTopMinusWordDeref = x86MLton.gcState_stackTopMinusWordDerefOperand () val bytes = x86.Operand.immediate_int size val live = x86Liveness.LiveInfo.getLive(liveInfo, return) val {defs, ...} = Transfer.uses_defs_kills transfer val live = List.fold (defs, live, fn (oper,live) => case Operand.deMemloc oper of SOME memloc => LiveSet.remove (live, memloc) | NONE => live) in (runtimeTransfer (LiveSet.toMemLocSet live) (if !Control.profile <> Control.ProfileNone then (AppendList.fromList [(* stackTopTemp = stackTop + bytes *) x86.Assembly.instruction_mov {dst = stackTopTemp, src = stackTop, size = pointerSize}, x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTopTemp, src = bytes, size = pointerSize}, (* *(stackTopTemp - WORD_SIZE) = return *) x86.Assembly.instruction_mov {dst = stackTopTempMinusWordDeref, src = Operand.immediate_label return, size = pointerSize}, x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopTempMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, (* stackTop = stackTopTemp *) x86.Assembly.instruction_mov {dst = stackTop, src = stackTopTemp, size = pointerSize}, profileStackTopCommit']) else (AppendList.fromList [(* stackTop += bytes *) x86.Assembly.instruction_binal {oper = x86.Instruction.ADD, dst = stackTop, src = bytes, size = pointerSize}, (* *(stackTop - WORD_SIZE) = return *) x86.Assembly.instruction_mov {dst = stackTopMinusWordDeref, src = Operand.immediate_label return, size = pointerSize}, x86.Assembly.directive_force {commit_memlocs = MemLocSet.singleton stackTopMinusWordDeref', commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}])) (AppendList.single (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = runtimeClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}))) end | NONE => AppendList.single (Assembly.directive_force {commit_memlocs = let val s = MemLocSet.empty val s = if modifiesFrontier then MemLocSet.add (s, frontier ()) else s val s = if readsStackTop then MemLocSet.add (s, stackTop ()) else s in s end, commit_classes = ccallflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}) val call = case target of Direct name => let datatype z = datatype MLton.Platform.OS.t datatype z = datatype Control.Format.t val name = case convention of Cdecl => name | Stdcall => concat [name, "@", Int.toString size_args] val label = fn () => Label.fromString name (* how to access imported functions: *) (* Windows rewrites the symbol __imp__name *) val coff = fn () => Label.fromString ("_imp__" ^ name) val macho = fn () => makeDarwinSymbolStubLabel name val elf = fn () => Label.fromString (name ^ "@PLT") val importLabel = fn () => case !Control.Target.os of Cygwin => coff () | Darwin => macho () | MinGW => coff () | _ => elf () val direct = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.label (label ()), absolute = false}] val plt = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.label (importLabel ()), absolute = false}] val indirect = fn () => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = Operand.memloc_label (importLabel ()), absolute = true}] in case (symbolScope, !Control.Target.os, !Control.positionIndependent) of (* Private functions can be easily reached * with a direct (eip-relative) call. *) (Private, _, _) => direct () (* Call at the point of definition. *) | (Public, MinGW, _) => direct () | (Public, Cygwin, _) => direct () | (Public, Darwin, _) => direct () (* ELF requires PLT even for public fns. *) | (Public, _, true) => plt () | (Public, _, false) => direct () (* Windows always does indirect calls to * imported functions. The importLabel has * the function address written to it. *) | (External, MinGW, _) => indirect () | (External, Cygwin, _) => indirect () (* Darwin needs to generate special stubs * that are filled in by the dynamic linker. * This is needed even for non-PIC. *) | (External, Darwin, _) => plt () (* ELF systems create procedure lookup * tables (PLT) which proxy the call to * libraries. The PLT does not contain an * address, but instead a stub function. *) | (External, _, true) => plt () | (External, _, false) => direct () end | Indirect => AppendList.fromList [Assembly.directive_ccall (), Assembly.instruction_call {target = applyFFTempFun, absolute = true}] val kill = if isSome frameInfo then AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = runtimeClasses}) else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = let val s = MemLocSet.empty val s = if modifiesFrontier then MemLocSet.add (s, frontier ()) else s val s = if writesStackTop then MemLocSet.add (s, stackTop ()) else s in s end, dead_classes = ccallflushClasses}) val getResult = AppendList.single (Assembly.directive_return {returns = Operand.cReturnTemps returnTy}) val fixCStack = if aligned_size_args > 0 andalso convention = CFunction.Convention.Cdecl then (AppendList.single (Assembly.instruction_binal {oper = Instruction.ADD, dst = c_stackP, src = Operand.immediate_int aligned_size_args, size = pointerSize})) else AppendList.empty val continue = if maySwitchThreads then (* Returning from runtime *) (farTransfer MemLocSet.empty AppendList.empty (AppendList.single (* jmp *(stackTop - WORD_SIZE) *) (x86.Assembly.instruction_jmp {target = stackTopMinusWordDeref, absolute = true}))) else case return of NONE => AppendList.empty | SOME l => (if isSome frameInfo then (* Don't need to trampoline, * since didn't switch threads, * but can't fall because * frame layout data is prefixed * to l's code; use fallNone * to force a jmp with near * jump assumptions. *) fallNone else fall) gef {label = l, live = getLive (liveInfo, l)} in AppendList.appends [cacheEsp (), fptrArg, pushArgs, flush, call, kill, getResult, fixCStack, unreserveEsp (), continue] end) and effectJumpTable (gef as GEF {...}) {label, transfer} : Assembly.t AppendList.t = case transfer of Switch {test, cases, default} => let val ws = case Operand.size test of SOME Size.BYTE => WordSize.word8 | SOME Size.WORD => WordSize.word16 | SOME Size.LONG => WordSize.word32 | _ => Error.bug "x86GenerateTransfers.effectJumpTable: Switch" val zero = WordX.zero ws val one = WordX.one ws val two = WordX.add (one, one) fun even w = WordX.isZero (WordX.mod (w, two, {signed = false})) fun incFn w = WordX.add (w, one) fun decFn w = WordX.sub (w, one) fun halfFn w = WordX.div (w, two, {signed = false}) fun ltFn (w1, w2) = WordX.lt (w1, w2, {signed = false}) val min = WordX.min (ws, {signed = false}) fun minFn (w1, w2) = if WordX.lt (w1, w2, {signed = false}) then w1 else w2 val max = WordX.max (ws, {signed = false}) fun maxFn (w1, w2) = if WordX.gt (w1, w2, {signed = false}) then w1 else w2 fun range (w1, w2) = WordX.sub (w2, w1) val Liveness.T {dead, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} fun reduce(cases) = let fun reduce' cases = let val (minK,maxK,length, allEven,allOdd) = List.fold (cases, (max, min, 0, true, true), fn ((k,_), (minK,maxK,length, allEven,allOdd)) => let val isEven = even k in (minFn(k,minK), maxFn(k,maxK), length + 1, allEven andalso isEven, allOdd andalso not isEven) end) in if length > 1 andalso (allEven orelse allOdd) then let val f = if allOdd then halfFn o decFn else halfFn val cases' = List.map (cases, fn (k,target) => (f k, target)) val (cases'', minK'', maxK'', length'', shift'', mask'') = reduce' cases' val shift' = 1 + shift'' val mask' = WordX.orb (WordX.lshift(mask'', WordX.one WordSize.word32), if allOdd then WordX.one WordSize.word32 else WordX.zero WordSize.word32) in (cases'', minK'', maxK'', length'', shift', mask') end else (cases, minK, maxK, length, 0, WordX.zero WordSize.word32) end in reduce' cases end fun doitTable(cases, minK, _, rangeK, shift, mask) = let val jump_table_label = Label.newString "jumpTable" val idT = Directive.Id.new () val defaultT = Promise.delay (fn () => let val _ = incNear(jumpInfo, default) in pushCompensationBlock {label = default, id = idT} end) val rec filler = fn ([],_) => [] | (cases as (i,target)::cases',j) => if WordX.equals (i, j) then let val target' = pushCompensationBlock {label = target, id = idT} in (Immediate.label target'):: (filler(cases', incFn j)) end else (Immediate.label (Promise.force defaultT)):: (filler(cases, incFn j)) val jump_table = filler (cases, minK) val idD = Directive.Id.new () val defaultD = pushCompensationBlock {label = default, id = idD} val default_live = getLive(liveInfo, default) val live = List.fold (cases, default_live, fn ((_,target), live) => LiveSet.+(live, getLive(liveInfo, target))) val indexTemp = MemLoc.imm {base = Immediate.label (Label.fromString "indexTemp"), index = Immediate.zero, scale = Scale.Four, size = Size.LONG, class = MemLoc.Class.Temp} val checkTemp = MemLoc.imm {base = Immediate.label (Label.fromString "checkTemp"), index = Immediate.zero, scale = Scale.Four, size = Size.LONG, class = MemLoc.Class.Temp} val address = MemLoc.basic {base = Immediate.label jump_table_label, index = indexTemp, scale = Scale.Four, size = Size.LONG, class = MemLoc.Class.Code} val size = case Operand.size test of SOME size => size | NONE => Size.LONG val indexTemp' = indexTemp val indexTemp = Operand.memloc indexTemp val checkTemp' = checkTemp val checkTemp = Operand.memloc checkTemp val address = Operand.memloc address in AppendList.appends [if Size.lt(size, Size.LONG) then AppendList.single (Assembly.instruction_movx {oper = Instruction.MOVZX, src = test, srcsize = size, dst = indexTemp, dstsize = Size.LONG}) else AppendList.single (Assembly.instruction_mov {src = test, dst = indexTemp, size = Size.LONG}), if LiveSet.isEmpty dead then AppendList.empty else AppendList.single (Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = LiveSet.toMemLocSet dead, dead_classes = ClassSet.empty}), if shift > 0 then let val idC = Directive.Id.new () val defaultC = pushCompensationBlock {label = default, id = idC} val _ = incNear(jumpInfo, default) in AppendList.appends [AppendList.fromList [Assembly.instruction_mov {src = indexTemp, dst = checkTemp, size = Size.LONG}, Assembly.instruction_binal {oper = Instruction.AND, src = Operand.immediate_word (ones (shift, WordSize.word32)), dst = checkTemp, size = Size.LONG}], if WordX.isZero mask then AppendList.empty else AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, src = Operand.immediate_word mask, dst = checkTemp, size = Size.LONG}), AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.singleton checkTemp', dead_classes = ClassSet.empty}, Assembly.instruction_jcc {condition = Instruction.NZ, target = Operand.label defaultC}, Assembly.directive_saveregalloc {id = idC, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet default_live, stackTop ()), frontier ())}, Assembly.instruction_sral {oper = Instruction.SAR, count = Operand.immediate_int shift, dst = indexTemp, size = Size.LONG}]] end else AppendList.empty, if WordX.equals (minK, zero) then AppendList.empty else AppendList.single (Assembly.instruction_binal {oper = Instruction.SUB, src = Operand.immediate_word minK, dst = indexTemp, size = Size.LONG}), AppendList.fromList [Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}, Assembly.directive_cache {caches = [{register = indexReg, memloc = indexTemp', reserve = false}]}, Assembly.instruction_cmp {src1 = indexTemp, src2 = Operand.immediate_word rangeK, size = Size.LONG}, Assembly.instruction_jcc {condition = Instruction.A, target = Operand.label defaultD}, Assembly.directive_saveregalloc {id = idD, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet default_live, stackTop ()), frontier ())}, Assembly.instruction_jmp {target = address, absolute = true}, Assembly.directive_saveregalloc {id = idT, live = MemLocSet.add (MemLocSet.add (LiveSet.toMemLocSet live, stackTop ()), frontier ())}, Assembly.directive_force {commit_memlocs = MemLocSet.empty, commit_classes = ClassSet.empty, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.singleton indexTemp', dead_classes = ClassSet.empty}], AppendList.fromList [Assembly.pseudoop_data (), Assembly.pseudoop_p2align (Immediate.int 4, NONE, NONE), Assembly.label jump_table_label, Assembly.pseudoop_long jump_table, Assembly.pseudoop_text ()]] end fun doit(cases) = let val (cases, minK, maxK, length, shift, mask) = reduce(cases) val rangeK = range(minK,maxK) in if length >= 8 andalso WordX.lt (WordX.div(rangeK,two,{signed=false}), WordX.fromIntInf (IntInf.fromInt length, ws), {signed = false}) then let val cases = List.insertionSort (cases, fn ((k,_),(k',_)) => ltFn(k,k')) in doitTable(cases, minK, maxK, rangeK, shift, mask) end else effectDefault gef {label = label, transfer = transfer} end in case cases of Transfer.Cases.Word cases => doit cases end | _ => effectDefault gef {label = label, transfer = transfer} and fallNone (GEF {...}) {label, live} : Assembly.t AppendList.t = let val liveRegsTransfer = getLiveRegsTransfers (liveTransfers, label) val liveFltRegsTransfer = getLiveFltRegsTransfers (liveTransfers, label) val live = List.fold (liveRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) val live = List.fold (liveFltRegsTransfer, live, fn ((memloc,_),live) => LiveSet.remove(live,memloc)) fun default () = AppendList.fromList ((* flushing at near transfer *) (Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}):: (Assembly.directive_fltcache {caches = List.map (liveFltRegsTransfer, fn (memloc,_) => {memloc = memloc})}):: (Assembly.directive_cache {caches = List.map (liveRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}):: (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty}):: (Assembly.instruction_jmp {target = Operand.label label, absolute = false}):: (Assembly.directive_unreserve {registers = (stackTopReg):: (frontierReg):: (List.map (liveRegsTransfer, fn (_,register,_) => register))}):: nil) in case getLayoutInfo label of NONE => default () | SOME (Block.T {...}) => (push label; default ()) end and fallDefault (gef as GEF {generate,...}) {label, live} : Assembly.t AppendList.t = let datatype z = datatype x86JumpInfo.status val liveRegsTransfer = getLiveRegsTransfers (liveTransfers, label) val liveFltRegsTransfer = getLiveFltRegsTransfers (liveTransfers, label) val live = List.fold (liveRegsTransfer, live, fn ((memloc,_,_),live) => LiveSet.remove(live,memloc)) val live = List.fold (liveFltRegsTransfer, live, fn ((memloc,_),live) => LiveSet.remove(live,memloc)) fun default jmp = AppendList.appends [AppendList.fromList [(* flushing at near transfer *) (Assembly.directive_cache {caches = [{register = stackTopReg, memloc = stackTop (), reserve = true}, {register = frontierReg, memloc = frontier (), reserve = true}]}), (Assembly.directive_fltcache {caches = List.map (liveFltRegsTransfer, fn (memloc,_) => {memloc = memloc})}), (Assembly.directive_cache {caches = List.map (liveRegsTransfer, fn (temp,register,_) => {register = register, memloc = temp, reserve = true})}), (Assembly.directive_force {commit_memlocs = LiveSet.toMemLocSet live, commit_classes = nearflushClasses, remove_memlocs = MemLocSet.empty, remove_classes = ClassSet.empty, dead_memlocs = MemLocSet.empty, dead_classes = ClassSet.empty})], if jmp then AppendList.single (Assembly.instruction_jmp {target = Operand.label label, absolute = false}) else AppendList.empty, AppendList.single (Assembly.directive_unreserve {registers = (stackTopReg):: (frontierReg):: (List.map (liveRegsTransfer, fn (_,register,_) => register))})] in case getLayoutInfo label of NONE => default true | SOME (Block.T {...}) => (case getNear(jumpInfo, label) of Count 1 => generate gef {label = label, falling = true, unique = true} | _ => AppendList.append (default false, AppendList.cons (Assembly.directive_reset (), (generate gef {label = label, falling = true, unique = false})))) end fun make {generate, effect, fall} = generate (GEF {generate = generate, effect = effect, fall = fall}) val generate = case optimize of 0 => make {generate = generateAll, effect = effectDefault, fall = fallNone} | _ => make {generate = generateAll, effect = effectJumpTable, fall = fallDefault} val _ = List.foreach (blocks, fn Block.T {entry, ...} => (case entry of Func {label, ...} => enque label | _ => ())) fun doit () : Assembly.t list list = (case deque () of NONE => [] | SOME label => (case AppendList.toList (generate {label = label, falling = false, unique = false}) of [] => doit () | block => block::(doit ()))) val assembly = doit () val symbol_stubs = makeDarwinSymbolStubs () val _ = destLayoutInfo () val _ = destProfileLabel () val assembly = [Assembly.pseudoop_text ()]::assembly val assembly = if List.isEmpty symbol_stubs then assembly else symbol_stubs :: assembly val assembly = if List.isEmpty data then assembly else data::assembly in assembly end val (generateTransfers, generateTransfers_msg) = tracerTop "generateTransfers" generateTransfers fun generateTransfers_totals () = (generateTransfers_msg (); Control.indent (); x86Liveness.LiveInfo.verifyLiveInfo_msg (); x86JumpInfo.verifyJumpInfo_msg (); x86EntryTransfer.verifyEntryTransfer_msg (); x86LoopInfo.createLoopInfo_msg (); x86LiveTransfers.computeLiveTransfers_totals (); Control.unindent ()) end mlton-20100608/mlton/codegen/x86-codegen/x86-generate-transfers.sig0000644000076600000240000000224711404435625023302 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_GENERATE_TRANSFERS_STRUCTS = sig structure x86 : X86 structure x86MLton : X86_MLTON sharing x86 = x86MLton.x86 structure x86Liveness : X86_LIVENESS sharing x86 = x86Liveness.x86 structure x86JumpInfo : X86_JUMP_INFO sharing x86 = x86JumpInfo.x86 structure x86LoopInfo : X86_LOOP_INFO sharing x86 = x86LoopInfo.x86 structure x86EntryTransfer : X86_ENTRY_TRANSFER sharing x86 = x86EntryTransfer.x86 end signature X86_GENERATE_TRANSFERS = sig include X86_GENERATE_TRANSFERS_STRUCTS val generateTransfers: {chunk: x86.Chunk.t, optimize: int, newProfileLabel: x86.ProfileLabel.t -> x86.ProfileLabel.t, liveInfo: x86Liveness.LiveInfo.t, jumpInfo: x86JumpInfo.t, reserveEsp: bool, picUsesEbx: bool} -> x86.Assembly.t list list val generateTransfers_totals : unit -> unit end mlton-20100608/mlton/codegen/x86-codegen/x86-jump-info.fun0000644000076600000240000000727411404435625021422 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86JumpInfo(S: X86_JUMP_INFO_STRUCTS) : X86_JUMP_INFO = struct open S open x86 val tracer = x86.tracer datatype status = Count of int | None val status_eq = fn (None , None ) => true | (Count i1, Count i2) => i1 = i2 | _ => false val status_toString = fn None => "None" | Count i => concat ["Count ", Int.toString i] datatype t = T of {get: Label.t -> status ref} fun newJumpInfo () = let val {get : Label.t -> status ref, ...} = Property.get(Label.plist, Property.initFun (fn _ => ref (Count 0))) in T {get = get} end local fun doit (status_ref, maybe_fn) = case !status_ref of None => () | Count i => status_ref := (maybe_fn i) in fun incNear (T {get}, label) = doit (get label, fn i => Count (i+1)) fun decNear (T {get}, label) = doit (get label, fn i => Count (i-1)) fun forceNear (T {get}, label) = doit (get label, fn _ => None) end fun getNear (T {get}, label) = !(get label) fun completeJumpInfo {chunk = Chunk.T {blocks, ...}, jumpInfo: t} = List.foreach (blocks, fn Block.T {entry, transfer,...} => (case entry of Entry.Jump _ => () | Entry.Func {label, ...} => forceNear (jumpInfo, label) | Entry.Cont {label, ...} => forceNear (jumpInfo, label) | Entry.Handler {label, ...} => forceNear (jumpInfo, label) | Entry.CReturn {label, func, ...} => if CFunction.maySwitchThreads func then forceNear (jumpInfo, label) else (); List.foreach (Transfer.nearTargets transfer, fn label => incNear (jumpInfo, label)))) val (completeJumpInfo, completeJumpInfo_msg) = tracer "completeJumpInfo" completeJumpInfo fun verifyJumpInfo {chunk as Chunk.T {blocks, ...}, jumpInfo: t} = let local val {get : Label.t -> status ref, destroy} = Property.destGet(Label.plist, Property.initFun (fn _ => ref (Count 0))) in val jumpInfo' = T {get = get} val destroy = destroy end val _ = completeJumpInfo {chunk = chunk, jumpInfo = jumpInfo'} val verified = List.forall (blocks, fn Block.T {entry,...} => let val label = Entry.label entry in if status_eq(getNear(jumpInfo, label), getNear(jumpInfo', label)) then true else (print "verifyJumpInfo: "; print (Label.toString label); print "\n"; print "jumpInfo: "; print (status_toString (getNear(jumpInfo, label))); print "\n"; print "jumpInfo': "; print (status_toString (getNear(jumpInfo', label))); print "\n"; false) end) val _ = destroy () in verified end val (verifyJumpInfo, verifyJumpInfo_msg) = tracer "verifyJumpInfo" verifyJumpInfo end mlton-20100608/mlton/codegen/x86-codegen/x86-jump-info.sig0000644000076600000240000000163411404435625021406 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_JUMP_INFO_STRUCTS = sig structure x86 : X86 end signature X86_JUMP_INFO = sig include X86_JUMP_INFO_STRUCTS datatype status = Count of int | None type t val newJumpInfo : unit -> t val completeJumpInfo : {chunk: x86.Chunk.t, jumpInfo: t} -> unit val completeJumpInfo_msg : unit -> unit val verifyJumpInfo : {chunk: x86.Chunk.t, jumpInfo: t} -> bool val verifyJumpInfo_msg : unit -> unit val incNear : t * x86.Label.t -> unit val decNear : t * x86.Label.t -> unit val getNear : t * x86.Label.t -> status end mlton-20100608/mlton/codegen/x86-codegen/x86-live-transfers.fun0000644000076600000240000014137711404435625022465 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * Some of this doesn't make sense if we track the liveness of the GCHold class. * Need to update the enque'' of returns, handlers of NonTail and Runtime * so they reflect what happens at these transfers; (i.e., stackTop and frontier * are defed on return from NonTail). *) functor x86LiveTransfers(S: X86_LIVE_TRANSFERS_STRUCTS) : X86_LIVE_TRANSFERS = struct open S open x86 local open Runtime in structure CFunction = CFunction end structure LiveSet = x86Liveness.LiveSet structure LiveInfo = x86Liveness.LiveInfo open x86JumpInfo open x86LoopInfo fun take (l, n) = let val rec take' = fn ([], _, ac) => List.rev ac | (_, 0 : Int.t, ac) => List.rev ac | (h::t, i, ac) => take' (t, i - 1, h::ac) in take' (l, n, []) end val track = x86Liveness.track val tracerTop = x86.tracerTop fun temp_uses_defs {uses : Operand.t list, defs : Operand.t list} = let val baseUses = List.fold (uses, MemLocSet.empty, fn (operand, baseUses) => case Operand.deMemloc operand of SOME memloc => if x86Liveness.track memloc then MemLocSet.add(baseUses, memloc) else baseUses | NONE => baseUses) val tempUses = let fun doit (operands, tempUses) = List.fold (operands, tempUses, fn (operand, tempUses) => case Operand.deMemloc operand of SOME memloc => List.fold(MemLoc.utilized memloc, tempUses, fn (memloc, tempUses) => if x86Liveness.track memloc then MemLocSet.add(tempUses, memloc) else tempUses) | NONE => tempUses) in doit(defs, doit(uses, baseUses)) end val baseDefs = List.fold (defs, MemLocSet.empty, fn (operand, baseDefs) => case Operand.deMemloc operand of SOME memloc => if x86Liveness.track memloc then MemLocSet.add(baseDefs, memloc) else baseDefs | NONE => baseDefs) val tempDefs = baseDefs in {uses = tempUses, defs = tempDefs} end datatype t = T of {get: Label.t -> ((MemLoc.t * Register.t * bool) list * (MemLoc.t * bool) list), set: Label.t * ((MemLoc.t * Register.t * bool) list * (MemLoc.t * bool) list) -> unit} local in structure I' = struct open Int fun sign x = if x = 0 then 0 else if x > 0 then 1 else ~1 end structure I = struct datatype t = NegInfinity | Finite of I'.t | PosInfinity val toString = fn NegInfinity => "-inf" | Finite n => I'.toString n | PosInfinity => "+inf" val zero = Finite (I'.zero) fun NegInfinity < NegInfinity = false | NegInfinity < _ = true | (Finite _) < NegInfinity = false | (Finite x) < (Finite y) = I'.<(x,y) | (Finite _) < PosInfinity = true | PosInfinity < _ = false fun NegInfinity + PosInfinity = zero | NegInfinity + _ = NegInfinity | (Finite _) + NegInfinity = NegInfinity | (Finite x) + (Finite y) = ((Finite (I'.+(x,y))) handle Overflow => if x > 0 then PosInfinity else NegInfinity) | (Finite _) + PosInfinity = PosInfinity | PosInfinity + NegInfinity = zero | PosInfinity + _ = PosInfinity fun NegInfinity * NegInfinity = PosInfinity | NegInfinity * (Finite x) = (case I'.sign x of ~1 => PosInfinity | 0 => zero | _ => NegInfinity) | NegInfinity * PosInfinity = NegInfinity | (Finite x) * NegInfinity = (case I'.sign x of ~1 => PosInfinity | 0 => zero | _ => NegInfinity) | (Finite x) * (Finite y) = ((Finite (I'.*(x, y))) handle Overflow => (case (I'.sign x, I'.sign y) of (~1, ~1) => PosInfinity | (1, ~1) => NegInfinity | (~1, 1) => NegInfinity | _ => PosInfinity)) | (Finite x) * PosInfinity = (case I'.sign x of ~1 => NegInfinity | 0 => zero | _ => PosInfinity) | PosInfinity * NegInfinity = NegInfinity | PosInfinity * (Finite x) = (case I'.sign x of ~1 => NegInfinity | 0 => zero | _ => PosInfinity) | PosInfinity * PosInfinity = PosInfinity end end fun computeLiveTransfers {chunk = Chunk.T {blocks,...}, transferRegs : Entry.t -> Register.t list, transferFltRegs : Entry.t -> Int.t, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t, loopInfo : x86LoopInfo.t} = let val (useLF, useB, sync) = case !Control.Native.liveTransfer of 1 => (false, false, false) | 2 => (false, false, true) | 3 => (false, true, false) | 4 => (false, true, true) | 5 => (true, false, false) | 6 => (true, false, true) | 7 => (true, true, false) | _ => (true, true, true) val cutoff = !Control.Native.cutoff datatype u = Position of I.t | Length of I'.t val {get = getInfo : Label.t -> {block: Block.t, pred: Label.t list ref, succ: Label.t list ref, live: {memloc: MemLoc.t, distanceF': u option ref, distanceF: (I.t * Label.t option) option ref, distanceB': u option ref, distanceB: (I.t * Label.t option) option ref} vector, liveTransfers: ((MemLoc.t * Register.t * bool ref) list * (MemLoc.t * bool ref) list) option ref, defed: MemLocSet.t option ref}, set = setInfo, destroy = destInfo} = Property.destGetSetOnce (Label.plist, Property.initRaise ("x86LiveTransfers:getInfo", Label.layout)) val (labels, funcs) = List.fold (blocks, ([], []), fn (block as Block.T {entry, transfer, ...}, (labels, funcs)) => let val label = Entry.label entry val succ = Transfer.nearTargets transfer val live = LiveInfo.getLive(liveInfo, label) val live = List.fold (succ, live, fn (label, live) => LiveSet.+(live, LiveInfo.getLive(liveInfo, label))) val live = LiveSet.toList live val _ = setInfo(label, {block = block, pred = ref [], succ = ref succ, live = Vector.fromListMap (live, fn memloc => {memloc = memloc, distanceF' = ref NONE, distanceF = ref NONE, distanceB' = ref NONE, distanceB = ref NONE}), liveTransfers = ref NONE, defed = ref NONE}) val labels = label::labels val funcs = case entry of Entry.Func _ => label::funcs | _ => funcs in (labels, funcs) end) val labels = Vector.fromList labels val funcs = Vector.fromList funcs val _ = Vector.foreach (labels, fn label => let val {block, ...} = getInfo label fun doit target = let val {pred = pred', ...} = getInfo target in List.push (pred', label) end val Block.T {transfer, ...} = block datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => doit target | Iff {truee, falsee, ...} => (doit truee; doit falsee) | Switch {cases, default, ...} => (doit default; Transfer.Cases.foreach(cases, doit o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit return; case handler of SOME handler => doit handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {return, ...} => Option.app (return, doit) end) val _ = Vector.foreach (labels, fn label => let val {block, live, ...} = getInfo label val Block.T {entry, statements, transfer, ...} = block val l = List.fold (statements, I'.two, fn (Assembly.Comment _, l) => l | (_, l) => I'.+(l, I'.one)) fun pos ([], n, m) = let val {uses, defs, ...} = Transfer.uses_defs_kills transfer val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else distanceF' := SOME (Length l) | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else ()) end | pos ((Assembly.Comment _)::assembly,n,m) = pos (assembly,n,m) | pos (asm::assembly,n,m) = let val {uses,defs,...} = Assembly.uses_defs_kills asm val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else () | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else ()); pos(assembly, I'.+(n, I'.one), I'.-(m, I'.one)) end in let val n = I'.zero val m = I'.-(l, I'.one) val {uses,defs,...} = Entry.uses_defs_kills entry val {uses,defs} = temp_uses_defs {uses = uses, defs = defs} in Vector.foreach (live, fn {memloc, distanceF' as ref NONE, ...} => if MemLocSet.contains(uses,memloc) then distanceF' := SOME (Position (I.Finite n)) else () | _ => ()); Vector.foreach (live, fn {memloc, distanceB', ...} => if MemLocSet.contains(uses,memloc) orelse MemLocSet.contains(defs,memloc) then distanceB' := SOME (Position (I.Finite m)) else distanceB' := SOME (Length l)); pos(statements, I'.+(n, I'.one), I'.-(m, I'.one)) end end) fun get_distanceF {temp: MemLoc.t, label: Label.t} = let val {block, succ, live, ...} = getInfo label val Block.T {transfer, ...} = block in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceF = ref (SOME (df, dfl)), ...} => (df, dfl) | SOME {distanceF', distanceF, ...} => (case valOf (!distanceF') of Position n => (distanceF := SOME (n, SOME label); (n, SOME label)) | Length n => let val loopLabels = getLoopLabels (loopInfo, label) val _ = distanceF := SOME (I.PosInfinity, NONE) fun default () = let val n = I.Finite n val (min, minl) = List.fold (!succ, (I.PosInfinity, NONE), fn (label, (min, minl)) => let val (n', l') = get_distanceF {temp = temp, label = label} val n' = I.+(n, n') val n'' = case (l', useLF) of (NONE, _) => n' | (_, false) => n' | (SOME l', true) => if List.contains (loopLabels, l', Label.equals) then n' else I.*(I.Finite 5, n') in if I.<(n'', min) then (n', l') else (min, minl) end) in (min, minl) end datatype z = datatype Transfer.t val (n, l) = case transfer of Tail _ => (I.PosInfinity, NONE) | NonTail _ => (I.PosInfinity, NONE) | Return _ => (I.PosInfinity, NONE) | Raise _ => (I.PosInfinity, NONE) | CCall {func, ...} => if CFunction.maySwitchThreads func orelse Size.class (MemLoc.size temp) <> Size.INT then (I.PosInfinity, NONE) else default () | _ => default () in distanceF := SOME (n, l) ; (n, l) end) | _ => (I.PosInfinity, NONE) end fun get_distanceB {temp: MemLoc.t, label: Label.t} = let val {block, pred, live, ...} = getInfo label val Block.T {entry, ...} = block in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceB = ref (SOME (db, dbl)), ...} => (db, dbl) | SOME {distanceB, ...} => let val loopLabels = getLoopLabels(loopInfo, label) val _ = distanceB := SOME (I.PosInfinity, NONE) fun default () = List.fold (!pred, (I.PosInfinity, NONE), fn (label, (min, minl)) => let val {live, ...} = getInfo label in case Vector.peek (live, fn {memloc, ...} => MemLoc.eq(temp, memloc)) of SOME {distanceB', ...} => (case valOf(!distanceB') of Position n => if I.<(n, min) then (n, SOME label) else (min, minl) | Length n => let val n = I.Finite n val (n', l') = get_distanceB {temp = temp, label = label} val n' = I.+(n, n') val n'' = case (l', useLF) of (NONE, _) => n' | (_, false) => n' | (SOME l', true) => if List.contains (loopLabels, l', Label.equals) then n' else I.*(I.Finite 5, n') in if I.<(n'', min) then (n', l') else (min, minl) end) | _ => (min, minl) end) datatype z = datatype Entry.t val (n, l) = case entry of Func {...} => (I.PosInfinity, NONE) | Cont {...} => (I.PosInfinity, NONE) | Handler {...} => (I.PosInfinity, NONE) | CReturn {func, ...} => if (CFunction.maySwitchThreads func orelse Size.class (MemLoc.size temp) <> Size.INT) then (I.PosInfinity, NONE) else default () | _ => default () in distanceB := SOME (n, l) ; (n, l) end | _ => (I.PosInfinity, NONE) end local val queue = ref (Queue.empty ()) in fun enque x = queue := Queue.enque(!queue, x) fun deque () = case Queue.deque (!queue) of NONE => NONE | SOME (queue', x) => (queue := queue'; SOME x) end fun doit {label, hints} = let val {block as Block.T {entry, ...}, live = liveData, liveTransfers, ...} = getInfo label in case !liveTransfers of SOME _ => () | NONE => let val loopLabels = getLoopLabels(loopInfo, label) val Block.T {transfer, ...} = block val (regHints, fltregHints) = hints val live = LiveSet.toList(LiveInfo.getLive(liveInfo, label)) val _ = if true then () else (print (Label.toString label); print "\nloopLabels: "; print (List.toString Label.toString loopLabels); print "\nliveData:\n"; Vector.foreach (liveData, fn {memloc, distanceF', distanceB', ...} => (print (MemLoc.toString memloc); print ": "; case !distanceF' of NONE => print "?" | SOME (Position i) => (print "Pos "; print (I.toString i)) | SOME (Length i) => (print "Len "; print (I'.toString i)); print " "; case !distanceB' of NONE => print "?" | SOME (Position i) => (print "Pos "; print (I.toString i)) | SOME (Length i) => (print "Len "; print (I'.toString i)); print "\n")); print "regHints:\n"; List.foreach (regHints, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (Register.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "fltregHints:\n"; List.foreach (fltregHints, fn (memloc,sync) => (print (MemLoc.toString memloc); print ": "; print (Bool.toString (!sync)); print "\n")); print "live:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print "\n")); print "distance_F:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print ": "; let val (n, l) = get_distanceF {temp = memloc, label = label} in print (I.toString n); print " "; print (Option.toString Label.toString l) end; print "\n")); print "distance_B:\n"; List.foreach (live, fn memloc => (print (MemLoc.toString memloc); print ": "; let val (n, l) = get_distanceB {temp = memloc, label = label} in print (I.toString n); print " "; print (Option.toString Label.toString l) end; print "\n"))) val live = if not useB then List.keepAllMap (live, fn memloc => case get_distanceF {temp = memloc, label = label} of (I.Finite n, SOME l) => if n < cutoff then if useLF then if List.contains (loopLabels, l, Label.equals) then SOME (memloc, n) else SOME (memloc, n * 5) else SOME (memloc, n) else NONE | (I.PosInfinity, _) => NONE | _ => Error.bug "x86LiveTransfers.computeLiveTransfers.live: get_distanceF") else List.keepAllMap (live, fn memloc => case (get_distanceB {temp = memloc, label = label}, get_distanceF {temp = memloc, label = label}) of ((I.PosInfinity, _), _) => NONE | (_, (I.PosInfinity, _)) => NONE | ((I.Finite n, SOME nl), (I.Finite m, SOME ml)) => if (n + m) < cutoff then if useLF then case (List.contains (loopLabels, nl, Label.equals), List.contains (loopLabels, ml, Label.equals)) of (true, true) => SOME (memloc, n + m) | (true, false) => SOME (memloc, n + 5 * m) | (false, true) => SOME (memloc, 5 * n + m) | (false, false) => SOME (memloc, 5 * n + 5 * m) else SOME (memloc, n + m) else NONE | _ => Error.bug "x86LiveTransfers.computeLiveTransfers.live: get_distanceB") (* List.partition will reverse the lists. * So sort in increasing order. *) val live = List.insertionSort (live, fn ((_,n1),(_,n2)) => I'.>(n1, n2)) val _ = if true then () else (print "live:\n"; List.foreach (live, fn (memloc,n) => (print (MemLoc.toString memloc); print ": "; print (I'.toString n); print "\n"))) val {yes = liveRegs, no = liveFltRegs} = List.partition (live, fn (memloc,_) => Size.class (MemLoc.size memloc) = Size.INT) val liveRegs = List.map (liveRegs, fn (memloc,weight) => case List.peek (regHints, fn (memloc',_,_) => MemLoc.eq(memloc,memloc')) of SOME (_,register',_) => (memloc,weight,SOME register') | NONE => (memloc,weight,NONE)) val rec doitRegs = fn ([],_,liveTransfers) => liveTransfers | (_,[],liveTransfers) => liveTransfers | (transferRegs, (memloc,_,register)::live, liveTransfers) => let fun finish register = let val transferRegs = List.removeAll (transferRegs, fn register' => Register.coincide(register, register')) in doitRegs (transferRegs, live, (memloc,register,ref true)::liveTransfers) end fun default () = let val size = MemLoc.size memloc val transferRegs' = List.keepAllMap (transferRegs, fn register => if Size.eq (size, Register.size register) then SOME (register, List.index (live, fn (_,_,SOME register') => Register.eq (register, register') | (_,_,NONE) => false)) else NONE) val transferRegs' = List.insertionSort (transferRegs', fn ((_,SOME index1),(_,SOME index2)) => Int.>(index1, index2) | ((_, NONE),_) => true | (_, (_, NONE)) => false) in case transferRegs' of nil => doitRegs (transferRegs, live, liveTransfers) | (register,_)::_ => finish register end in case register of SOME register => if List.contains(transferRegs, register, Register.eq) then finish register else default () | NONE => default () end val liveRegsTransfers = doitRegs(transferRegs entry, liveRegs, []) val liveFltRegs = take(liveFltRegs, transferFltRegs entry) val liveFltRegsTransfers = List.map(liveFltRegs, fn (memloc, _) => (memloc, ref true)) val _ = liveTransfers := SOME (liveRegsTransfers, liveFltRegsTransfers) (* val _ = (print "liveRegsTransfers:\n"; List.foreach (liveRegsTransfers, fn (memloc,register,sync) => (print (MemLoc.toString memloc); print ": "; print (Register.toString register); print ": "; print (Bool.toString (!sync)); print "\n")); print "liveFltRegsTransfers:\n"; List.foreach (liveFltRegsTransfers, fn (memloc,sync) => (print (MemLoc.toString memloc); print ": "; print (Bool.toString (!sync)); print "\n")); print "") *) fun doit' label = enque {label = label, hints = (liveRegsTransfers, liveFltRegsTransfers)} fun doit'' label = enque {label = label, hints = ([],[])} fun doit''' func label = let val hints = List.fold (Operand.cReturnTemps (CFunction.return func), ([],[]), fn ({src, dst}, (regHints, fltregHints)) => case src of Operand.Register reg => ((dst, reg, ref true) :: regHints, fltregHints) | Operand.FltRegister _ => (regHints, (dst, ref true) :: fltregHints) | _ => (regHints, fltregHints)) in enque {hints = hints, label = label} end datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => (doit' target) | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (doit' default; Transfer.Cases.foreach(cases, doit' o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {func, return, ...} => if CFunction.maySwitchThreads func then Option.app (return, doit'') else Option.app (return, doit''' func) end end val _ = Vector.foreach (funcs, fn label => enque {label = label, hints = ([],[])}) fun loop () = (case deque () of NONE => () | SOME {label, hints} => (doit {label = label, hints = hints}; loop ())) val _ = loop () fun doit {label, defed = defed'} = let val {block, liveTransfers, defed, ...} = getInfo label val (liveRegs, liveFltRegs) = valOf (!liveTransfers) val defed' = case getNear(jumpInfo, label) of None => MemLocSet.empty | Count 0 => MemLocSet.empty | Count 1 => defed' | Count _ => MemLocSet.subset (defed', fn memloc => List.exists (liveRegs, fn (memloc',_,_) => MemLoc.eq(memloc', memloc)) orelse List.exists (liveFltRegs, fn (memloc',_) => MemLoc.eq(memloc', memloc))) fun default defed'' = let val Block.T {entry, statements, transfer, ...} = block val _ = List.foreach (liveRegs, fn (memloc,_,sync) => if MemLocSet.contains(defed', memloc) then sync := false else ()) val _ = List.foreach (liveFltRegs, fn (memloc,sync) => if MemLocSet.contains(defed', memloc) then sync := false else ()) val defed' = MemLocSet.+(defed'', defed') val _ = defed := SOME defed' fun doit' (defed', defs) = List.fold (defs, defed', fn (def,defed') => case Operand.deMemloc def of SOME def => if track def then MemLocSet.add(defed', def) else defed' | NONE => defed') val {defs, ...} = Entry.uses_defs_kills entry val defed' = doit' (defed', defs) val defed' = List.fold (statements, defed', fn (asm,defed') => let val {defs, ...} = Assembly.uses_defs_kills asm in doit' (defed', defs) end) val {defs, ...} = Transfer.uses_defs_kills transfer val defed' = doit' (defed', defs) fun doit' label = doit {label = label, defed = defed'} fun doit'' label = doit {label = label, defed = MemLocSet.empty} datatype z = datatype Transfer.t in case transfer of Goto {target, ...} => (doit' target) | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (Transfer.Cases.foreach(cases, doit' o #2); doit' default) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {func, return, ...} => if CFunction.maySwitchThreads func then Option.app (return, doit'') else Option.app (return, doit') end in case !defed of NONE => default MemLocSet.empty | SOME defed => if MemLocSet.<=(defed',defed) then () else default defed end val _ = Vector.foreach (funcs, fn label => doit {label = label, defed = MemLocSet.empty}) val {get = getLiveTransfers : Label.t -> ((MemLoc.t * Register.t * bool) list * (MemLoc.t * bool) list), set = setLiveTransfers, ...} = Property.getSet (Label.plist, Property.initRaise ("x86LiveTransfers:getLiveTransfers", Label.layout)) val _ = Vector.foreach (labels, fn label => let val {liveTransfers, ...} = getInfo label val (liveRegs, liveFltRegs) = valOf (!liveTransfers) val (liveRegs, liveFltRegs) = if sync then (List.map (liveRegs, fn (memloc,reg, sync) => (memloc, reg, !sync)), List.map (liveFltRegs, fn (memloc, sync) => (memloc, !sync))) else (List.map (liveRegs, fn (memloc,reg, _) => (memloc, reg, false)), List.map (liveFltRegs, fn (memloc, _) => (memloc, false))) in setLiveTransfers(label, (liveRegs, liveFltRegs)) end) val _ = destInfo () in T {get = getLiveTransfers, set = setLiveTransfers} end val computeLiveTransfers = fn {chunk, transferRegs, transferFltRegs, liveInfo, jumpInfo, loopInfo} => if !Control.Native.liveTransfer > 0 then computeLiveTransfers {chunk = chunk, transferRegs = transferRegs, transferFltRegs = transferFltRegs, liveInfo = liveInfo, jumpInfo = jumpInfo, loopInfo = loopInfo} else let val {get = getLiveTransfers, set = setLiveTransfers, ...} = Property.getSetOnce(Label.plist, Property.initConst ([], [])) in T {get = getLiveTransfers, set = setLiveTransfers} end val (computeLiveTransfers : {chunk : Chunk.t, transferRegs : Entry.t -> Register.t list, transferFltRegs : Entry.t -> Int.t, liveInfo : LiveInfo.t, jumpInfo : x86JumpInfo.t, loopInfo : x86LoopInfo.t} -> t, computeLiveTransfers_msg) = tracerTop "computeLiveTransfers" computeLiveTransfers fun computeLiveTransfers_totals () = (computeLiveTransfers_msg ()) fun getLiveTransfers (T {get, ...}, label) = get label fun setLiveTransfersEmpty (T {set, ...}, label) = set(label, ([], [])) end mlton-20100608/mlton/codegen/x86-codegen/x86-live-transfers.sig0000644000076600000240000000246411404435625022450 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_LIVE_TRANSFERS_STRUCTS = sig structure x86 : X86 structure x86Liveness : X86_LIVENESS sharing x86 = x86Liveness.x86 structure x86JumpInfo : X86_JUMP_INFO sharing x86 = x86JumpInfo.x86 structure x86LoopInfo : X86_LOOP_INFO sharing x86 = x86LoopInfo.x86 end signature X86_LIVE_TRANSFERS = sig include X86_LIVE_TRANSFERS_STRUCTS type t val computeLiveTransfers : {chunk : x86.Chunk.t, transferRegs : x86.Entry.t -> x86.Register.t list, transferFltRegs : x86.Entry.t -> Int.t, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t, loopInfo : x86LoopInfo.t} -> t val computeLiveTransfers_totals : unit -> unit val getLiveTransfers : t * x86.Label.t -> ((x86.MemLoc.t * x86.Register.t * bool) list * (x86.MemLoc.t * bool) list) val setLiveTransfersEmpty : t * x86.Label.t -> unit end mlton-20100608/mlton/codegen/x86-codegen/x86-liveness.fun0000644000076600000240000006365411404435625021352 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86Liveness(S: X86_LIVENESS_STRUCTS) : X86_LIVENESS = struct open S open x86 val tracer = x86.tracer val tracerTop = x86.tracerTop structure LiveSet = struct open MemLocSet fun toMemLocSet s = s end fun track memloc = ClassSet.contains(!x86MLtonBasic.Classes.livenessClasses, MemLoc.class memloc) fun livenessOperands live = List.fold (live, LiveSet.empty, fn (operand, live) => (case Operand.deMemloc operand of NONE => live | SOME memloc => if track memloc then LiveSet.add(live, memloc) else live)) structure LiveInfo = struct datatype t = T of {get: Label.t -> LiveSet.t, set: Label.t * LiveSet.t -> unit} fun newLiveInfo () = let val {get : Label.t -> LiveSet.t, set : Label.t * LiveSet.t -> unit, ...} = Property.getSet (Label.plist, Property.initRaise ("liveInfo", Label.layout)) in T {get = get, set = set} end fun setLiveOperands (T {set, ...}, label, live) = set(label, livenessOperands live) fun setLive (T {set, ...}, label, live) = set(label, live) fun getLive (T {get, ...}, label) = get label end fun liveness_uses_defs {uses : Operand.t list, defs : Operand.t list} : {uses : LiveSet.t, defs : LiveSet.t} = let val baseUses = livenessOperands uses val livenessUses = let fun doit (operands, livenessUses) = List.fold (operands, livenessUses, fn (operand, livenessUses) => case Operand.deMemloc operand of SOME memloc => List.fold (MemLoc.utilized memloc, livenessUses, fn (memloc, livenessUses) => if track memloc then LiveSet.add(livenessUses, memloc) else livenessUses) | NONE => livenessUses) in doit(defs, doit(uses, baseUses)) end val baseDefs = livenessOperands defs val livenessDefs = baseDefs in {uses = livenessUses, defs = livenessDefs} end structure Liveness = struct datatype t = T of {liveIn: LiveSet.t, liveOut: LiveSet.t, dead: LiveSet.t} local fun make f (T r) = f r in val dead = make #dead val liveIn = make #liveIn end fun toString (T {liveIn, liveOut, dead}) = let fun doit (name, l, toString, s) = LiveSet.fold(l, s, fn (x, s) => concat [name, toString x, "\n", s]) in doit("liveIn: ", liveIn, MemLoc.toString, doit("liveOut: ", liveOut, MemLoc.toString, doit("dead: ", dead, MemLoc.toString, ""))) end fun eq (T {liveIn = liveIn1, liveOut = liveOut1, dead = dead1}, T {liveIn = liveIn2, liveOut = liveOut2, dead = dead2}) = LiveSet.equals(liveIn1, liveIn2) andalso LiveSet.equals(liveOut1, liveOut2) andalso LiveSet.equals(dead1, dead2) fun liveness ({uses : LiveSet.t, defs : LiveSet.t, live : LiveSet.t}) : t = let val liveOut = live (* liveIn = uses \/ (liveOut - defs) *) val liveIn = LiveSet.+(uses, LiveSet.-(live, defs)) (* dead = (liveIn \/ defs) - liveOut *) val dead = LiveSet.-(LiveSet.+(liveIn, defs), liveOut) in T {liveIn = liveIn, liveOut = liveOut, dead = dead} end fun livenessEntry {entry : Entry.t, live : LiveSet.t} : t = let val {uses, defs, ...} = Entry.uses_defs_kills entry val {uses, defs} = liveness_uses_defs {uses = uses, defs = defs} val defs = MemLocSet.fold (Entry.live entry, defs, fn (memloc, defs) => if track memloc then LiveSet.add(defs, memloc) else defs) in liveness {uses = uses, defs = defs, live = live} end fun livenessAssembly {assembly : Assembly.t, live : LiveSet.t} : t = let val {uses, defs, ...} = Assembly.uses_defs_kills assembly val {uses, defs} = liveness_uses_defs {uses = uses, defs = defs} in liveness {uses = uses, defs = defs, live = live} end fun livenessTransfer' {transfer: Transfer.t, live : LiveSet.t} : t = let val {uses,defs,...} = Transfer.uses_defs_kills transfer val {uses,defs} = liveness_uses_defs {uses = uses, defs = defs} (* Transfer.live transfer could be considered uses, * but the Liveness.t of a transfer should have * Transfer.live transfer as liveOut. *) val live = MemLocSet.fold (Transfer.live transfer, live, fn (memloc, live) => if track memloc then LiveSet.add(live, memloc) else live) in liveness {uses = uses, defs = defs, live = live} end fun livenessTransfer {transfer: Transfer.t, liveInfo: LiveInfo.t} : t = let val targets = Transfer.nearTargets transfer val live = List.fold (targets, LiveSet.empty, fn (target, live) => LiveSet.union(LiveInfo.getLive(liveInfo, target), live)) in livenessTransfer' {transfer = transfer, live = live} end fun livenessBlock {block = Block.T {entry, statements, transfer, ...}, liveInfo : LiveInfo.t} = let val T {liveIn = live, ...} = livenessTransfer {transfer = transfer, liveInfo = liveInfo} val live = List.foldr (statements, live, fn (asm,live) => let val T {liveIn = live, ...} = livenessAssembly {assembly = asm, live = live} in live end) val T {liveIn = live, ...} = livenessEntry {entry = entry, live = live} in live end end structure LiveInfo = struct open LiveInfo fun completeLiveInfo {chunk = Chunk.T {blocks, ...}, liveInfo : LiveInfo.t, pass: string} = let val {get = getBlockInfo : Label.t -> {pred: Label.t list ref, block: Block.t option ref, topo: int ref}, destroy = destBlockInfo} = Property.destGet (Label.plist, Property.initFun (fn _ => {pred = ref [], block = ref NONE, topo = ref ~1})) val get_pred = (#pred o getBlockInfo) val get_topo = (#topo o getBlockInfo) val get_pred' = (! o #pred o getBlockInfo) val get_block' = (! o #block o getBlockInfo) val get_topo' = (! o #topo o getBlockInfo) val labels = List.map (blocks, fn block' as Block.T {entry, transfer,...} => let val label = Entry.label entry val {block,topo,...} = getBlockInfo label val targets = Transfer.nearTargets transfer in block := SOME block'; topo := 0; List.foreach (targets, fn target => List.push(get_pred target, label)); label end) local val todo = ref [] fun topo_order(x,y) = Int.compare(get_topo' x, get_topo' y) fun insert (l, x, compare) = let val rec insert' = fn ([],acc) => List.appendRev(acc, [x]) | (l as h::t,acc) => (case compare(h,x) of LESS => insert' (t, h::acc) | EQUAL => List.appendRev(acc, l) | GREATER => List.appendRev(acc, x::l)) in insert' (l,[]) end in fun add_todo x = todo := insert(!todo, x, topo_order) fun push_todo x = todo := x::(!todo) fun rev_todo () = todo := List.rev (!todo) fun get_todo () = (case !todo of [] => NONE | (x::todo') => (todo := todo'; SOME x)) end local val num = Counter.new 1 in fun topo_sort label = let val {topo, pred, ...} = getBlockInfo label in if !topo = 0 then (topo := Counter.next num; push_todo label; List.foreach(!pred, topo_sort)) else () end fun topo_root label = (get_topo label := Counter.next num; push_todo label) end fun loop (labels, n) = if List.isEmpty labels then () else let val {yes = exits, no = labels} = List.partition (labels, fn label => let val Block.T {transfer, ...} = valOf (get_block' label) val targets = Transfer.nearTargets transfer val targets' = List.fold(targets, 0, fn (target,targets') => if get_topo' target = ~1 then targets' else targets' + 1) in targets' = n end) val exits = List.removeAll (exits, fn label => get_topo' label <> 0) val _ = (List.foreach (exits, fn label => topo_root label); List.foreach (exits, fn label => List.foreach(get_pred' label, topo_sort))) in loop(labels, n + 1) end val _ = loop(labels, 0) val _ = rev_todo () val changed = ref false fun doit () = (case get_todo () of NONE => () | SOME label => let val {pred, block, ...} = getBlockInfo label val block = valOf (!block) val live = Liveness.livenessBlock {block = block, liveInfo = liveInfo} val live' = LiveInfo.getLive(liveInfo, label) in if LiveSet.equals(live, live') then () else (LiveInfo.setLive(liveInfo, label, live); List.foreach(!pred, add_todo); if true then () else (print "completeLiveInfo:"; print pass; print ": "; print (Label.toString label); print ": "; if LiveSet.<(live, live') then print "new < old" else if LiveSet.<(live', live) then print "old < new" else print "?"; print "\n"; if true then (print "old: "; LiveSet.foreach (live', fn m => (print (MemLoc.toString m); print " ")); print "\n"; print "new: "; LiveSet.foreach (live, fn m => (print (MemLoc.toString m); print " ")); print "\n") else ()); changed := true); doit () end) val _ = doit () val _ = destBlockInfo () in () end val (completeLiveInfo : {chunk: Chunk.t, liveInfo: LiveInfo.t, pass: string} -> unit, completeLiveInfo_msg) = tracerTop "completeLiveInfo" completeLiveInfo fun verifyLiveInfo {chunk = Chunk.T {blocks, ...}, liveInfo : t} = List.forall (blocks, fn block as Block.T {entry, ...} => let val label = Entry.label entry val live = LiveInfo.getLive(liveInfo, label) val live' = Liveness.livenessBlock {block = block, liveInfo = liveInfo} in LiveSet.equals(live, live') end) val (verifyLiveInfo : {chunk: Chunk.t, liveInfo: LiveInfo.t} -> bool, verifyLiveInfo_msg) = tracer "verifyLiveInfo" verifyLiveInfo end structure LivenessBlock = struct datatype t = T of {entry: (Entry.t * Liveness.t), profileLabel: ProfileLabel.t option, statements: (Assembly.t * Liveness.t) list, transfer: Transfer.t * Liveness.t} fun printBlock (T {entry, statements, transfer, ...}) = (let val (entry,info) = entry in print (Entry.toString entry); print "\n"; print (Liveness.toString info) end; List.foreach (statements, fn (asm,info) => (print (Assembly.toString asm); print "\n"; print (Liveness.toString info))); let val (trans,info) = transfer in print (Transfer.toString trans); print "\n"; print (Liveness.toString info); print "\n" end) fun toLivenessEntry {entry, live} = let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessEntry {entry = entry, live = live} in {entry = (entry,info), live = live} end fun reLivenessEntry {entry, live} = let val (entry,_) = entry val info as Liveness.T {liveIn = live, ...} = Liveness.livenessEntry {entry = entry, live = live} in {entry = (entry,info), live = live} end fun toLivenessStatements {statements, live} = let val {statements,live} = List.foldr(statements, {statements = [], live = live}, fn (asm,{statements,live}) => let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessAssembly {assembly = asm, live = live} in {statements = (asm, info)::statements, live = live} end) in {statements = statements, live = live} end fun reLivenessStatements {statements: (Assembly.t * Liveness.t) list, live} = let val {statements,live,...} = List.foldr(statements, {statements = [], live = live, continue = false}, fn ((asm,info),{statements,live,continue}) => if continue then {statements = (asm,info)::statements, live = Liveness.liveIn info, continue = continue} else let val info' as Liveness.T {liveIn = live',...} = Liveness.livenessAssembly {assembly = asm, live = live} in {statements = (asm, info')::statements, live = live', continue = Liveness.eq(info,info')} end) in {statements = statements, live = live} end fun toLivenessTransfer {transfer, liveInfo} = let val info as Liveness.T {liveIn = live, ...} = Liveness.livenessTransfer {transfer = transfer, liveInfo = liveInfo} in {transfer = (transfer,info), live = live} end fun reLivenessTransfer {transfer: Transfer.t * Liveness.t} = let val (transfer, Liveness.T {liveOut,...}) = transfer val info as Liveness.T {liveIn = live, ...} = Liveness.livenessTransfer' {transfer = transfer, live = liveOut} in {transfer = (transfer, info), live = live} end fun toLivenessBlock {block = Block.T {entry, profileLabel, statements, transfer}, liveInfo : LiveInfo.t} = let val {transfer, live} = toLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {statements, live} = toLivenessStatements {statements =statements, live = live} val {entry, ...} = toLivenessEntry {entry = entry, live = live} val liveness_block = T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} in liveness_block end val (toLivenessBlock: {block: Block.t, liveInfo: LiveInfo.t} -> t, toLivenessBlock_msg) = tracer "toLivenessBlock" toLivenessBlock fun verifyLivenessEntry {entry = (entry,info), live} = let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessEntry {entry = entry, live = live} in {verified = Liveness.eq(info, info'), live = live'} end fun verifyLivenessStatements {statements, live} = List.foldr(statements, {verified = true, live = live}, fn ((asm,info),{verified, live}) => let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessAssembly {assembly = asm, live = live} val eq = Liveness.eq(info, info') val () = if eq then () else (print "asm ::\n"; print (Assembly.toString asm); print "\n"; print "info ::\n"; print (Liveness.toString info); print "\n"; print "info' ::\n"; print (Liveness.toString info'); print "\n") in {verified = verified andalso Liveness.eq(info, info'), live = live'} end) fun verifyLivenessTransfer {transfer = (transfer,info), liveInfo} = let val info' as Liveness.T {liveIn = live', ...} = Liveness.livenessTransfer {transfer = transfer, liveInfo = liveInfo} in {verified = Liveness.eq(info, info'), live = live'} end fun verifyLivenessBlock {block = T {entry, statements, transfer, ...}, liveInfo: LiveInfo.t} = let val {verified = verified_transfer, live} = verifyLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {verified = verified_statements, live} = verifyLivenessStatements {statements =statements, live = live} val {verified = verified_entry, ...} = verifyLivenessEntry {entry = entry, live = live} (* FIXME -- the live-in set changed because of dead code elimination. val live' = get label val verified_live = List.equalsAsSet(live, live', MemLoc.eq) *) val verified_live = true in verified_transfer andalso verified_statements andalso verified_entry andalso verified_live end val (verifyLivenessBlock: {block: t, liveInfo: LiveInfo.t} -> bool, verifyLivenessBlock_msg) = tracer "verifyLivenessBlock" verifyLivenessBlock fun toBlock {block = T {entry, profileLabel, statements, transfer}} = let val (entry,_) = entry val statements = List.map(statements, fn (asm,_) => asm) val (transfer,_) = transfer in Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} end val (toBlock: {block: t} -> Block.t, toBlock_msg) = tracer "toBlock" toBlock end end mlton-20100608/mlton/codegen/x86-codegen/x86-liveness.sig0000644000076600000240000000764311404435625021340 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_LIVENESS_STRUCTS = sig structure x86: X86 structure x86MLtonBasic: X86_MLTON_BASIC sharing x86 = x86MLtonBasic.x86 end signature X86_LIVENESS = sig include X86_LIVENESS_STRUCTS structure LiveSet: sig include SET val toMemLocSet: t -> x86.MemLocSet.t end sharing type LiveSet.Element.t = x86.MemLoc.t val track : x86.MemLoc.t -> bool structure LiveInfo: sig type t val newLiveInfo : unit -> t val setLiveOperands : t * x86.Label.t * x86.Operand.t list -> unit val setLive : t * x86.Label.t * LiveSet.t -> unit val getLive : t * x86.Label.t -> LiveSet.t val completeLiveInfo : {chunk: x86.Chunk.t, liveInfo: t, pass: string} -> unit val completeLiveInfo_msg : unit -> unit val verifyLiveInfo : {chunk: x86.Chunk.t, liveInfo: t} -> bool val verifyLiveInfo_msg : unit -> unit end structure Liveness: sig datatype t = T of {liveIn: LiveSet.t, liveOut: LiveSet.t, dead: LiveSet.t} val dead: t -> LiveSet.t val liveIn: t -> LiveSet.t val livenessAssembly : {assembly : x86.Assembly.t, live : LiveSet.t} -> t val livenessEntry : {entry : x86.Entry.t, live : LiveSet.t} -> t val livenessTransfer : {transfer: x86.Transfer.t, liveInfo: LiveInfo.t} -> t end structure LivenessBlock: sig datatype t = T of {entry: (x86.Entry.t * Liveness.t), profileLabel: x86.ProfileLabel.t option, statements: (x86.Assembly.t * Liveness.t) list, transfer: (x86.Transfer.t * Liveness.t)} val printBlock : t -> unit val toLivenessEntry : {entry: x86.Entry.t, live: LiveSet.t} -> {entry: (x86.Entry.t * Liveness.t), live: LiveSet.t} val reLivenessEntry : {entry: (x86.Entry.t * Liveness.t), live: LiveSet.t} -> {entry: (x86.Entry.t * Liveness.t), live: LiveSet.t} val toLivenessStatements : {statements: x86.Assembly.t list, live: LiveSet.t} -> {statements: (x86.Assembly.t * Liveness.t) list, live: LiveSet.t} val reLivenessStatements : {statements: (x86.Assembly.t * Liveness.t) list, live: LiveSet.t} -> {statements: (x86.Assembly.t * Liveness.t) list, live: LiveSet.t} val toLivenessTransfer : {transfer: x86.Transfer.t, liveInfo: LiveInfo.t} -> {transfer: (x86.Transfer.t * Liveness.t), live: LiveSet.t} val reLivenessTransfer : {transfer: (x86.Transfer.t * Liveness.t)} -> {transfer: (x86.Transfer.t * Liveness.t), live: LiveSet.t} val toLivenessBlock : {block: x86.Block.t, liveInfo: LiveInfo.t} -> t val toLivenessBlock_msg : unit -> unit val verifyLivenessBlock : {block: t, liveInfo: LiveInfo.t} -> bool val verifyLivenessBlock_msg : unit -> unit val toBlock : {block: t} -> x86.Block.t val toBlock_msg : unit -> unit end end mlton-20100608/mlton/codegen/x86-codegen/x86-loop-info.fun0000644000076600000240000001341111404435625021406 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86LoopInfo(S: X86_LOOP_INFO_STRUCTS) : X86_LOOP_INFO = struct open S open x86 structure Graph = DirectedGraph structure Node = Graph.Node structure LoopForest = Graph.LoopForest val tracer = x86.tracer datatype t = T of {getLoopInfo : Label.t -> {loopHeader: bool, loopLabels: Label.t list, loopPath: int list}} fun createLoopInfo {chunk = Chunk.T {blocks, ...}, farLoops} = let val G = Graph.new () val {get = getNodeInfo : unit Node.t -> Label.t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("x86LoopInfo:getNodeInfo", Node.layout)) val {get = getInfo : Label.t -> unit Node.t, destroy = destInfo} = Property.destGet (Label.plist, Property.initFun (fn l => let val n = Graph.newNode G val _ = setNodeInfo(n, l) in n end)) val {get = getLoopInfo : Label.t -> {loopHeader: bool, loopLabels: Label.t list, loopPath: int list}, set = setLoopInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("x86LoopInfo:getLoopInfo", Label.layout)) val rootLabel = Label.newString "root" val root = getInfo rootLabel fun addEdge edge = ignore (Graph.addEdge (G, edge)) val _ = List.foreach (blocks, fn Block.T {entry, transfer, ...} => let val label = Entry.label entry val node = getInfo label fun doit' target = let val node' = getInfo target in addEdge {from = node, to = node'} end fun doit'' target = let val node' = getInfo target in if farLoops then addEdge {from = node, to = node'} else addEdge {from = root, to = node'} end datatype z = datatype Transfer.t in if Entry.isFunc entry then addEdge {from = root, to = node} else () ; case transfer of Goto {target, ...} => doit' target | Iff {truee, falsee, ...} => (doit' truee; doit' falsee) | Switch {cases, default, ...} => (doit' default; Transfer.Cases.foreach(cases, doit' o #2)) | Tail {...} => () | NonTail {return, handler, ...} => (doit'' return; case handler of SOME handler => doit'' handler | NONE => ()) | Return {...} => () | Raise {...} => () | CCall {return, func, ...} => Option.app (return, if CFunction.mayGC func then doit'' else doit') end) val _ = destInfo () val lf = Graph.loopForestSteensgaard (G, {root = root}) fun doit (f: unit LoopForest.t, headers, path) = let val {loops, notInLoop} = LoopForest.dest f val notInLoop = Vector.toListMap (notInLoop, getNodeInfo) val path' = List.rev path in List.foreach (notInLoop, fn l => setLoopInfo (l, {loopHeader = Vector.contains (headers, l, Label.equals), loopLabels = notInLoop, loopPath = path'})) ; Vector.foreachi (loops, fn (i,{headers, child}) => doit (child, Vector.map (headers, getNodeInfo), i::path)) end val _ = doit (lf, Vector.new0 (), []) in T {getLoopInfo = getLoopInfo} end val (createLoopInfo, createLoopInfo_msg) = tracer "createLoopInfo" createLoopInfo fun getLoopDistance (T {getLoopInfo, ...}, from, to) = (case (#loopPath (getLoopInfo from), #loopPath (getLoopInfo to)) of ([], _) => NONE | (_, []) => NONE | (pfrom, pto) => let val rec check = fn ([], pto) => SOME (List.length pto) | (pfrom, []) => SOME (~(List.length pfrom)) | (f::pfrom,t::pto) => if f = t then check (pfrom, pto) else NONE in check (pfrom, pto) end) fun getLoopLabels (T {getLoopInfo, ...}, label) = #loopLabels (getLoopInfo label) fun isLoopHeader (T {getLoopInfo, ...}, l) = #loopHeader (getLoopInfo l) end mlton-20100608/mlton/codegen/x86-codegen/x86-loop-info.sig0000644000076600000240000000133311404435625021400 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_LOOP_INFO_STRUCTS = sig structure x86 : X86 end signature X86_LOOP_INFO = sig include X86_LOOP_INFO_STRUCTS type t val createLoopInfo : {chunk: x86.Chunk.t, farLoops: bool} -> t val createLoopInfo_msg : unit -> unit val getLoopDistance : t * x86.Label.t * x86.Label.t -> int option val getLoopLabels : t * x86.Label.t -> x86.Label.t list val isLoopHeader : t * x86.Label.t -> bool end mlton-20100608/mlton/codegen/x86-codegen/x86-mlton-basic.fun0000644000076600000240000003325211404435625021721 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86MLtonBasic (S: X86_MLTON_BASIC_STRUCTS): X86_MLTON_BASIC = struct open S open x86 local open Machine in structure CType = CType structure Runtime = Runtime end (* * x86.Size.t equivalents *) val wordBytes = Bytes.toInt Bytes.inWord32 val wordSize = Size.fromBytes wordBytes val wordScale = Scale.fromBytes wordBytes val pointerBytes = Bytes.toInt Bytes.inWord32 val pointerSize = Size.fromBytes pointerBytes (* * Memory classes *) structure Classes = struct local fun new s = MemLoc.Class.new {name = s} in val Heap = new "Heap" val Stack = new "Stack" val Locals = new "Locals" val Globals = new "Globals" val Temp = MemLoc.Class.Temp val StaticTemp = MemLoc.Class.StaticTemp val CStack = MemLoc.Class.CStack val Code = MemLoc.Class.Code val CStatic = new "CStatic" val StaticNonTemp = new "StaticNonTemp" val GCState = new "GCState" val GCStateHold = new "GCStateHold" val GCStateVolatile = new "GCStateVolatile" end val allClasses = ref x86.ClassSet.empty val livenessClasses = ref x86.ClassSet.empty val holdClasses = ref x86.ClassSet.empty val volatileClasses = ref x86.ClassSet.empty val runtimeClasses = ref x86.ClassSet.empty val heapClasses = ref x86.ClassSet.empty val cstaticClasses = ref x86.ClassSet.empty fun initClasses () = let val _ = allClasses := x86.ClassSet.fromList ( Heap:: Stack:: Locals:: Globals:: Temp:: StaticTemp:: CStack:: Code:: CStatic:: StaticNonTemp:: GCState:: GCStateHold:: GCStateVolatile:: nil) val _ = livenessClasses := (if !Control.Native.liveStack then x86.ClassSet.fromList ( Temp:: Locals:: StaticTemp:: Stack:: nil) else x86.ClassSet.fromList ( Temp:: Locals:: StaticTemp:: nil)) val _ = holdClasses := x86.ClassSet.fromList ( GCStateHold:: (* GCStateVolatile:: *) nil) val _ = volatileClasses := x86.ClassSet.fromList ( GCStateVolatile:: nil) val _ = runtimeClasses := x86.ClassSet.fromList ( Heap:: Stack:: Globals:: GCState:: GCStateHold:: GCStateVolatile:: nil) val _ = heapClasses := x86.ClassSet.fromList ( Heap:: nil) val _ = cstaticClasses := x86.ClassSet.fromList ( CStatic:: nil) in () end end val makeContents = x86.MemLoc.makeContents val c_stackP = Label.fromString "c_stackP" val c_stackPContents = makeContents {base = Immediate.label c_stackP, size = pointerSize, class = Classes.StaticNonTemp} val c_stackPContentsOperand = Operand.memloc c_stackPContents val c_stackPDerefDouble = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.DBLE, class = Classes.CStack} val c_stackPDerefDoubleOperand = Operand.memloc c_stackPDerefDouble val c_stackPDerefFloat = MemLoc.simple {base = c_stackPContents, index = Immediate.zero, scale = wordScale, size = Size.SNGL, class = Classes.CStack} val c_stackPDerefFloatOperand = Operand.memloc c_stackPDerefFloat (* This is more a pseudo-location. The GOT is special and cannot * be simply loaded. Similarly, we don't really read the contents. *) val globalOffsetTable = Label.fromString "_GLOBAL_OFFSET_TABLE_" val globalOffsetTableContents = makeContents {base = Immediate.label globalOffsetTable, size = pointerSize, class = Classes.StaticNonTemp} val applyFFTempFun = Label.fromString "applyFFTempFun" val applyFFTempFunContents = makeContents {base = Immediate.label applyFFTempFun, size = wordSize, class = Classes.StaticTemp} val applyFFTempFunContentsOperand = Operand.memloc applyFFTempFunContents val applyFFTempArg = Label.fromString "applyFFTempArg" val applyFFTempArgContents = makeContents {base = Immediate.label applyFFTempArg, size = wordSize, class = Classes.StaticTemp} val applyFFTempArgContentsOperand = Operand.memloc applyFFTempArgContents val realTemp1D = Label.fromString "realTemp1D" val realTemp1ContentsD = makeContents {base = Immediate.label realTemp1D, size = Size.DBLE, class = Classes.StaticTemp} val realTemp1ContentsOperandD = Operand.memloc realTemp1ContentsD val realTemp1S = Label.fromString "realTemp1S" val realTemp1ContentsS = makeContents {base = Immediate.label realTemp1S, size = Size.SNGL, class = Classes.StaticTemp} val realTemp1ContentsOperandS = Operand.memloc realTemp1ContentsS fun realTemp1ContentsOperand floatSize = case floatSize of Size.DBLE => realTemp1ContentsOperandD | Size.SNGL => realTemp1ContentsOperandS | _ => Error.bug "x86MLtonBasic.realTemp1ContentsOperand: floatSize" val realTemp2D = Label.fromString "realTemp2D" val realTemp2ContentsD = makeContents {base = Immediate.label realTemp2D, size = Size.DBLE, class = Classes.StaticTemp} val realTemp2ContentsOperandD = Operand.memloc realTemp2ContentsD val realTemp2S = Label.fromString "realTemp2S" val realTemp2ContentsS = makeContents {base = Immediate.label realTemp2S, size = Size.SNGL, class = Classes.StaticTemp} val realTemp2ContentsOperandS = Operand.memloc realTemp2ContentsS fun realTemp2ContentsOperand floatSize = case floatSize of Size.DBLE => realTemp2ContentsOperandD | Size.SNGL => realTemp2ContentsOperandS | _ => Error.bug "x86MLtonBasic.realTemp2ContentsOperand: floatSize" val realTemp3D = Label.fromString "realTemp3D" val realTemp3ContentsD = makeContents {base = Immediate.label realTemp3D, size = Size.DBLE, class = Classes.StaticTemp} val realTemp3ContentsOperandD = Operand.memloc realTemp3ContentsD val realTemp3S = Label.fromString "realTemp3S" val realTemp3ContentsS = makeContents {base = Immediate.label realTemp3S, size = Size.SNGL, class = Classes.StaticTemp} val realTemp3ContentsOperandS = Operand.memloc realTemp3ContentsS fun realTemp3ContentsOperand floatSize = case floatSize of Size.DBLE => realTemp3ContentsOperandD | Size.SNGL => realTemp3ContentsOperandS | _ => Error.bug "x86MLtonBasic.realTemp3ContentsOperand: floatSize" val fpswTemp = Label.fromString "fpswTemp" val fpswTempContents = makeContents {base = Immediate.label fpswTemp, size = Size.WORD, class = Classes.StaticTemp} val fpswTempContentsOperand = Operand.memloc fpswTempContents val fildTemp = Label.fromString "fildTemp" val fildTempContents = makeContents {base = Immediate.label fildTemp, size = Size.WORD, class = Classes.StaticTemp} val fildTempContentsOperand = Operand.memloc fildTempContents val wordTemp1B = Label.fromString "wordTemp1B" val wordTemp1ContentsB = makeContents {base = Immediate.label wordTemp1B, size = Size.BYTE, class = Classes.StaticTemp} val wordTemp1ContentsOperandB = Operand.memloc wordTemp1ContentsB val wordTemp1W = Label.fromString "wordTemp1W" val wordTemp1ContentsW = makeContents {base = Immediate.label wordTemp1W, size = Size.WORD, class = Classes.StaticTemp} val wordTemp1ContentsOperandW = Operand.memloc wordTemp1ContentsW val wordTemp1L = Label.fromString "wordTemp1L" val wordTemp1ContentsL = makeContents {base = Immediate.label wordTemp1L, size = Size.LONG, class = Classes.StaticTemp} val wordTemp1ContentsOperandL = Operand.memloc wordTemp1ContentsL fun wordTemp1ContentsOperand wordSize = case wordSize of Size.BYTE => wordTemp1ContentsOperandB | Size.WORD => wordTemp1ContentsOperandW | Size.LONG => wordTemp1ContentsOperandL | _ => Error.bug "x86MLtonBasic.wordTemp1ContentsOperand: wordSize" local fun make prefix = let fun make name size = Label.fromString (concat [prefix, name, size]) val r = make "Real" val w = make "Word" datatype z = datatype CType.t in CType.memo (fn t => case t of CPointer => Label.fromString (concat [prefix, "CPointer"]) | Int8 => w "8" | Int16 => w "16" | Int32 => w "32" | Int64 => w "64" | Objptr => Label.fromString (concat [prefix, "Objptr"]) | Real32 => r "32" | Real64 => r "64" | Word8 => w "8" | Word16 => w "16" | Word32 => w "32" | Word64 => w "64") end in val local_base = make "local" val global_base = make "global" end val globalObjptrNonRoot_base = Label.fromString "globalObjptrNonRoot" val gcState_label = Label.fromString "gcState" structure Field = Runtime.GCField fun make' (offset: int, size, class) = let fun imm () = Immediate.labelPlusInt (gcState_label, offset) fun contents () = makeContents {base = imm (), size = size, class = class} fun operand () = Operand.memloc (contents ()) in (imm, contents, operand) end fun make (f: Field.t, size, class) = let fun imm () = Immediate.labelPlusInt (gcState_label, Bytes.toInt (Field.offset f)) fun contents () = makeContents {base = imm (), size = size, class = class} fun operand () = Operand.memloc (contents ()) in (imm, contents, operand) end val (_, gcState_exnStackContents, gcState_exnStackContentsOperand) = make (Field.ExnStack, wordSize, Classes.GCState) val (_, gcState_frontierContents, gcState_frontierContentsOperand) = make (Field.Frontier, pointerSize, Classes.GCStateHold) val (_, gcState_stackBottomContents, gcState_stackBottomContentsOperand) = make (Field.StackBottom, pointerSize, Classes.GCState) val (_, gcState_stackTopContents, gcState_stackTopContentsOperand) = make (Field.StackTop, pointerSize, Classes.GCStateHold) local val stackTopTemp = Immediate.label (Label.fromString "stackTopTemp") val stackTopTempContents = makeContents {base = stackTopTemp, size = wordSize, class = Classes.StaticTemp} val stackTopTempContentsOperand = Operand.memloc (stackTopTempContents) in val stackTopTempContents = fn () => stackTopTempContents val stackTopTempContentsOperand = fn () => stackTopTempContentsOperand end fun gcState_stackTopMinusWordDeref () = MemLoc.simple {base = gcState_stackTopContents (), index = Immediate.int ~1, scale = wordScale, size = pointerSize, class = Classes.Stack} fun gcState_stackTopMinusWordDerefOperand () = Operand.memloc (gcState_stackTopMinusWordDeref ()) fun stackTopTempMinusWordDeref () = MemLoc.simple {base = stackTopTempContents (), index = Immediate.int ~1, scale = wordScale, size = pointerSize, class = Classes.Stack} fun stackTopTempMinusWordDerefOperand () = Operand.memloc (stackTopTempMinusWordDeref ()) fun gcState_offset {offset, ty} = let val (_,_,operand) = make' (offset, Vector.sub(x86.Size.fromCType ty, 0), Classes.GCState) in operand () end (* init *) fun init () = let val _ = Classes.initClasses () in () end end mlton-20100608/mlton/codegen/x86-codegen/x86-mlton-basic.sig0000644000076600000240000001020411404435625021703 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_MLTON_BASIC_STRUCTS = sig structure Machine: MACHINE structure x86: X86_PSEUDO sharing x86.CFunction = Machine.CFunction sharing x86.CType = Machine.CType sharing x86.Label = Machine.Label sharing x86.ProfileLabel = Machine.ProfileLabel sharing x86.RepType = Machine.Type sharing x86.Runtime = Machine.Runtime sharing x86.WordSize = Machine.WordSize sharing x86.WordX = Machine.WordX end signature X86_MLTON_BASIC = sig include X86_MLTON_BASIC_STRUCTS structure CFunction: C_FUNCTION structure CType: C_TYPE structure RepType: REP_TYPE sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing RepType = Machine.Type val init : unit -> unit (* * x86.Size.t equivalents *) val wordBytes : int val wordSize : x86.Size.t val wordScale : x86.Scale.t val pointerBytes : int val pointerSize : x86.Size.t (* * Memory classes *) structure Classes : sig val Heap : x86.MemLoc.Class.t val Stack : x86.MemLoc.Class.t val Locals : x86.MemLoc.Class.t val Globals : x86.MemLoc.Class.t val Temp : x86.MemLoc.Class.t val StaticTemp : x86.MemLoc.Class.t val CStack : x86.MemLoc.Class.t val Code : x86.MemLoc.Class.t val CStatic : x86.MemLoc.Class.t val StaticNonTemp : x86.MemLoc.Class.t val GCState : x86.MemLoc.Class.t val GCStateHold : x86.MemLoc.Class.t val GCStateVolatile : x86.MemLoc.Class.t val allClasses : x86.ClassSet.t ref val livenessClasses : x86.ClassSet.t ref val holdClasses : x86.ClassSet.t ref val volatileClasses : x86.ClassSet.t ref val runtimeClasses : x86.ClassSet.t ref val heapClasses : x86.ClassSet.t ref val cstaticClasses : x86.ClassSet.t ref end (* CStack locations *) val c_stackP : x86.Label.t val c_stackPContents : x86.MemLoc.t val c_stackPContentsOperand : x86.Operand.t val c_stackPDerefDoubleOperand : x86.Operand.t val c_stackPDerefFloatOperand : x86.Operand.t (* Global offset table (GOT) *) val globalOffsetTable : x86.Label.t val globalOffsetTableContents : x86.MemLoc.t (* Static temps defined in x86-main.h *) val applyFFTempFunContentsOperand : x86.Operand.t val applyFFTempArgContentsOperand : x86.Operand.t val realTemp1ContentsOperand : x86.Size.t -> x86.Operand.t val realTemp2ContentsOperand : x86.Size.t -> x86.Operand.t val realTemp3ContentsOperand : x86.Size.t -> x86.Operand.t val fildTempContentsOperand : x86.Operand.t val fpswTempContentsOperand : x86.Operand.t val wordTemp1ContentsOperand : x86.Size.t -> x86.Operand.t (* Static arrays defined in main.h and x86-main.h *) val local_base : x86.CType.t -> x86.Label.t val global_base : x86.CType.t -> x86.Label.t val globalObjptrNonRoot_base : x86.Label.t (* gcState relative locations defined in gc.h *) val gcState_label: x86.Label.t val gcState_offset: {offset: int, ty: x86.CType.t} -> x86.Operand.t val gcState_exnStackContents: unit -> x86.MemLoc.t val gcState_exnStackContentsOperand: unit -> x86.Operand.t val gcState_frontierContents: unit -> x86.MemLoc.t val gcState_frontierContentsOperand: unit -> x86.Operand.t val gcState_stackBottomContents: unit -> x86.MemLoc.t val gcState_stackBottomContentsOperand: unit -> x86.Operand.t val gcState_stackTopContents: unit -> x86.MemLoc.t val gcState_stackTopContentsOperand: unit -> x86.Operand.t val gcState_stackTopMinusWordDeref: unit -> x86.MemLoc.t val gcState_stackTopMinusWordDerefOperand: unit -> x86.Operand.t val stackTopTempContentsOperand: unit -> x86.Operand.t val stackTopTempMinusWordDeref: unit -> x86.MemLoc.t val stackTopTempMinusWordDerefOperand: unit -> x86.Operand.t end mlton-20100608/mlton/codegen/x86-codegen/x86-mlton.fun0000644000076600000240000022731111404435625020643 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86MLton (S: X86_MLTON_STRUCTS): X86_MLTON = struct open S open x86MLtonBasic open x86 local open Machine in structure CFunction = CFunction structure RealSize = RealSize structure Prim = Prim structure WordSize = WordSize datatype z = datatype RealSize.t datatype z = datatype WordSize.prim end type transInfo = {addData : x86.Assembly.t list -> unit, frameInfoToX86: (x86MLtonBasic.Machine.FrameInfo.t -> x86.FrameInfo.t), live: x86.Label.t -> x86.Operand.t list, liveInfo: x86Liveness.LiveInfo.t} fun implementsPrim (p: 'a Prim.t) = let datatype z = datatype RealSize.t datatype z = datatype WordSize.prim fun w32168 s = case WordSize.prim s of W8 => true | W16 => true | W32 => true | W64 => false datatype z = datatype Prim.Name.t in case Prim.name p of CPointer_add => true | CPointer_diff => true | CPointer_equal => true | CPointer_fromWord => true | CPointer_lt => true | CPointer_sub => true | CPointer_toWord => true | FFI_Symbol _ => true | Real_Math_acos _ => true | Real_Math_asin _ => true | Real_Math_atan _ => true | Real_Math_atan2 _ => true | Real_Math_cos _ => true | Real_Math_exp _ => true | Real_Math_ln _ => true | Real_Math_log10 _ => true | Real_Math_sin _ => true | Real_Math_sqrt _ => true | Real_Math_tan _ => true | Real_abs _ => true | Real_add _ => true | Real_castToWord _ => false (* !! *) | Real_div _ => true | Real_equal _ => true | Real_ldexp _ => true | Real_le _ => true | Real_lt _ => true | Real_mul _ => true | Real_muladd _ => true | Real_mulsub _ => true | Real_neg _ => true | Real_qequal _ => true | Real_rndToReal _ => true | Real_rndToWord (_, s2, {signed}) => signed andalso w32168 s2 | Real_round _ => true | Real_sub _ => true | Thread_returnToC => false | Word_add _ => true | Word_addCheck _ => true | Word_andb _ => true | Word_castToReal _ => false (* !! *) | Word_equal s => w32168 s | Word_extdToWord (s1, s2, _) => w32168 s1 andalso w32168 s2 | Word_lshift s => w32168 s | Word_lt (s, _) => w32168 s | Word_mul (s, _) => w32168 s | Word_mulCheck (s, _) => w32168 s | Word_neg _ => true | Word_negCheck _ => true | Word_notb _ => true | Word_orb _ => true | Word_quot (s, _) => w32168 s | Word_rem (s, _) => w32168 s | Word_rndToReal (s1, _, {signed}) => signed andalso w32168 s1 | Word_rol s => w32168 s | Word_ror s => w32168 s | Word_rshift (s, _) => w32168 s | Word_sub _ => true | Word_subCheck _ => true | Word_xorb _ => true | _ => false end val implementsPrim: Machine.Type.t Prim.t -> bool = Trace.trace ("x86MLton.implementsPrim", Prim.layout, Bool.layout) implementsPrim fun prim {prim : RepType.t Prim.t, args : (Operand.t * Size.t) vector, dsts : (Operand.t * Size.t) vector, transInfo = {addData, ...} : transInfo} = let val primName = Prim.toString prim datatype z = datatype Prim.Name.t fun getDst1 () = Vector.sub (dsts, 0) handle _ => Error.bug "x86MLton.prim: getDst1" fun getDst2 () = (Vector.sub (dsts, 0), Vector.sub (dsts, 1)) handle _ => Error.bug "x86MLton.prim: getDst2" fun getSrc1 () = Vector.sub (args, 0) handle _ => Error.bug "x86MLton.prim: getSrc1" fun getSrc2 () = (Vector.sub (args, 0), Vector.sub (args, 1)) handle _ => Error.bug "x86MLton.prim: getSrc2" fun getSrc3 () = (Vector.sub (args, 0), Vector.sub (args, 1), Vector.sub (args, 2)) handle _ => Error.bug "x86MLton.prim: getSrc3" fun getSrc4 () = (Vector.sub (args, 0), Vector.sub (args, 1), Vector.sub (args, 2), Vector.sub (args, 3)) handle _ => Error.bug "x86MLton.prim: getSrc4" fun mov () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: mov, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src, size = srcsize}], transfer = NONE}] end fun movx oper = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: movx, dstsize/srcsize", fn () => Size.lt(srcsize,dstsize)) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_movx {oper = oper, dst = dst, src = src, dstsize = dstsize, srcsize = srcsize}], transfer = NONE}] end fun xvom () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: xvom, dstsize/srcsize", fn () => Size.lt(dstsize,srcsize)) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_xvom {dst = dst, src = src, dstsize = dstsize, srcsize = srcsize}], transfer = NONE}] end fun binal oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_binal {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun binal64 (oper1, oper2) = let val ((src1,src1size), (src2,src2size), (src3,src3size), (src4,src4size)) = getSrc4 () val ((dst1,dst1size), (dst2,dst2size)) = getDst2 () val _ = Assert.assert ("x86MLton.prim: binal64, dst1size/dst2size/src1size/src2size/src3size/src4size", fn () => src1size = dst1size andalso src3size = dst1size andalso src2size = dst2size andalso src4size = dst2size andalso dst1size = dst2size) val tdst1 = if List.exists ([src2,src3,src4], fn src => Operand.mayAlias (dst1, src)) then wordTemp1ContentsOperand dst1size else dst1 val tdst2 = if List.exists ([src3,src4], fn src => Operand.mayAlias (dst2, src)) then wordTemp1ContentsOperand dst2size else dst2 in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tdst1, src = src1, size = src1size}, Assembly.instruction_mov {dst = tdst2, src = src2, size = src2size}, Assembly.instruction_binal {oper = oper1, dst = tdst1, src = src3, size = dst1size}, Assembly.instruction_binal {oper = oper2, dst = tdst2, src = src4, size = dst2size}, Assembly.instruction_mov {dst = dst1, src = tdst1, size = dst1size}, Assembly.instruction_mov {dst = dst2, src = tdst2, size = dst2size}], transfer = NONE}] end fun pmd oper = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: pmd, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = if (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) then case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pmd {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun imul2 () = let val ((src1,src1size), (src2,src2size)) = getSrc2 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: imul2, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries * and the oper is commutative. *) val (src1,src2) = case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = src1size}, Assembly.instruction_imul2 {dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun unal oper = let val (src,srcsize) = getSrc1 () val (dst,dstsize) = getDst1 () val _ = Assert.assert ("x86MLton.prim: unal, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src, size = srcsize}, Assembly.instruction_unal {oper = oper, dst = dst, size = dstsize}], transfer = NONE}] end fun unal64 (oper, mk) = let val ((src1,src1size),(src2,src2size)) = getSrc2 () val ((dst1,dst1size),(dst2,dst2size)) = getDst2 () val _ = Assert.assert ("x86MLton.prim: unal64, dst1size/dst2size/src1size/src2size", fn () => src1size = dst1size andalso src2size = dst2size andalso dst1size = dst2size) val tdst1 = if List.exists ([src2], fn src => Operand.mayAlias (dst1, src)) then wordTemp1ContentsOperand dst1size else dst1 in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tdst1, src = src1, size = src1size}, Assembly.instruction_mov {dst = dst2, src = src2, size = src2size}, Assembly.instruction_mov {dst = dst1, src = tdst1, size = dst1size}, Assembly.instruction_unal {oper = oper, dst = dst1, size = dst1size}] @ (mk (dst2,dst2size)) @ [Assembly.instruction_unal {oper = oper, dst = dst2, size = dst2size}], transfer = NONE}] end fun sral oper = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.prim: sral, dstsize/src1size", fn () => src1size = dstsize) val _ = Assert.assert ("x86MLton.prim: sral, src2size", fn () => src2size = wordSize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_sral {oper = oper, dst = dst, count = src2, size = dstsize}], transfer = NONE}] end fun cmp condition = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.prim: cmp, src1size/src2size", fn () => src1size = src2size) in (* Can't have an immediate in src1 position, * so reverse the srcs and reverse the condition. * * This won't fix an immediate in both positions. * Either constant folding eliminated it * or the register allocator will raise an error. *) case Operand.deImmediate src1 of SOME _ => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_cmp {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_setcc {condition = Instruction.condition_reverse condition, dst = dst, size = dstsize}], transfer = NONE}] | NONE => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_cmp {src1 = src1, src2 = src2, size = src1size}, Assembly.instruction_setcc {condition = condition, dst = dst, size = dstsize}], transfer = NONE}] end fun fbina oper = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.prim: fbina, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are temporaries. *) val (oper,src1,src2) = case (Operand.deMemloc src1, Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (Instruction.fbina_reverse oper,src2,src1) else (oper,src1,src2) | _ => (oper,src1,src2) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pfbina {oper = oper, dst = dst, src = src2, size = dstsize}], transfer = NONE}] end fun fbina_fmul oper = let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size), (src3,src3size)) = getSrc3 () val _ = Assert.assert ("x86MLton.prim: fbina_fmul, dstsize/src1size/src2size/src3size", fn () => src1size = dstsize andalso src2size = dstsize andalso src3size = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pfbina {oper = Instruction.FMUL, dst = dst, src = src2, size = dstsize}, Assembly.instruction_pfbina {oper = oper, dst = dst, src = src3, size = dstsize}], transfer = NONE}] end fun funa oper = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: funa, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize}, Assembly.instruction_pfuna {oper = oper, dst = dst, size = dstsize}], transfer = NONE}] end fun flogarithm oper = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: flogarithm, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfldc {oper = oper, dst = dst, size = dstsize}, Assembly.instruction_pfbinasp {oper = Instruction.FYL2X, src = src, dst = dst, size = dstsize}], transfer = NONE}] end val (comment_begin, comment_end) = if !Control.Native.commented > 0 then let val comment = primName in (AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment ("begin prim: " ^ comment)], transfer = NONE}), AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment ("end prim: " ^ comment)], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun bitop (size, i) = case WordSize.prim size of W8 => binal i | W16 => binal i | W32 => binal i | W64 => binal64 (i, i) fun compare (size, {signed}, s, u) = let val f = if signed then s else u in case WordSize.prim size of W8 => cmp f | W16 => cmp f | W32 => cmp f | W64 => Error.bug "x86MLton.prim: compare, W64" end fun shift (size, i) = case WordSize.prim size of W8 => sral i | W16 => sral i | W32 => sral i | W64 => Error.bug "x86MLton.prim: shift, W64" in AppendList.appends [comment_begin, (case Prim.name prim of CPointer_add => binal Instruction.ADD | CPointer_diff => binal Instruction.SUB | CPointer_equal => cmp Instruction.E | CPointer_fromWord => mov () | CPointer_lt => cmp Instruction.B | CPointer_sub => binal Instruction.SUB | CPointer_toWord => mov () | FFI_Symbol {name, symbolScope, ...} => let datatype z = datatype CFunction.SymbolScope.t datatype z = datatype Control.Format.t datatype z = datatype MLton.Platform.OS.t val (dst, dstsize) = getDst1 () val label = fn () => Label.fromString name (* how to access an imported label's address *) (* windows coff will add another leading _ to label *) val coff = fn () => Label.fromString ("_imp__" ^ name) val macho = fn () => let val label = Label.newString (concat ["L_", name, "_non_lazy_ptr"]) val () = addData [Assembly.pseudoop_non_lazy_symbol_pointer (), Assembly.label label, Assembly.pseudoop_indirect_symbol (Label.fromString name), Assembly.pseudoop_long [Immediate.zero]] in label end val elf = fn () => Label.fromString (name ^ "@GOT") val importLabel = fn () => case !Control.Target.os of Cygwin => coff () | Darwin => macho () | MinGW => coff () | _ => elf () val direct = fn () => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_lea {dst = dst, src = Operand.memloc_label (label ()), size = dstsize}], transfer = NONE}] val indirect = fn () => AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = dst, src = Operand.memloc_label (importLabel ()), size = dstsize}], transfer = NONE}] in case (symbolScope, !Control.Target.os, !Control.positionIndependent) of (* Even private PIC symbols on darwin need indirection. *) (Private, Darwin, true) => indirect () (* As long as the symbol is private (thus it is not * exported to code outside this text segment), then * use normal addressing. If PIC is needed, then the * memloc_label is updated to relative access in the * allocate-registers pass. *) | (Private, _, _) => direct () (* On darwin, even executables use the defintion address. * Therefore we don't need to do indirection. *) | (Public, Darwin, _) => direct () (* On ELF, a public symbol must be accessed via * the GOT. This is because the final value may not be * in this text segment. If the executable uses it, then * the unique C address resides in the executable's * text segment. The loader does this by creating a PLT * proxy or copying values to the executable text segment. * When linking an executable, ELF uses a special trick * to "simplify" the code. All exported functions and * symbols have pointers that correspond to the * executable. Function pointers point to the * automatically created PLT entry in the executable. * Variables are copied/relocated into the executable bss. * * This means that direct access is fine for executable * and archive formats. (It also means direct access is * NOT fine for a library, even if it defines the symbol) * *) | (Public, _, true) => indirect () | (Public, _, false) => direct () (* On darwin, the address is the point of definition. So * indirection is needed. We also need to make a stub! *) | (External, Darwin, _) => indirect () (* On windows, the address is the point of definition. So * we must always use an indirect lookup to the symbols * windows rewrites (__imp__name) in our segment. *) | (External, MinGW, _) => indirect () | (External, Cygwin, _) => indirect () (* When compiling ELF to a library, we access external * symbols via some address that is updated by the loader. * That address resides within our data segment, and can * be easily referenced using RBX-relative addressing. * This trick is used on every platform MLton supports. * ELF rewrites symbols of form name@GOT. *) | (External, _, true) => indirect () | (External, _, false) => direct () end | Real_Math_acos _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_acos, dstsize/srcsize", fn () => srcsize = dstsize) val realTemp1ContentsOperand = realTemp1ContentsOperand srcsize val realTemp2ContentsOperand = realTemp2ContentsOperand srcsize val realTemp3ContentsOperand = realTemp3ContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = realTemp1ContentsOperand, src = src, size = srcsize}, Assembly.instruction_pfmov {dst = realTemp2ContentsOperand, src = realTemp1ContentsOperand, size = srcsize}, Assembly.instruction_pfbina {oper = Instruction.FMUL, dst = realTemp2ContentsOperand, src = realTemp2ContentsOperand, size = srcsize}, Assembly.instruction_pfldc {oper = Instruction.ONE, dst = realTemp3ContentsOperand, size = srcsize}, Assembly.instruction_pfbina {oper = Instruction.FSUB, dst = realTemp3ContentsOperand, src = realTemp2ContentsOperand, size = srcsize}, Assembly.instruction_pfuna {oper = Instruction.FSQRT, dst = realTemp3ContentsOperand, size = srcsize}, Assembly.instruction_pfmov {dst = dst, src = realTemp3ContentsOperand, size = dstsize}, Assembly.instruction_pfbinasp {oper = Instruction.FPATAN, src = realTemp1ContentsOperand, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_asin _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_asin, dstsize/srcsize", fn () => srcsize = dstsize) val realTemp1ContentsOperand = realTemp1ContentsOperand srcsize val realTemp2ContentsOperand = realTemp2ContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize}, Assembly.instruction_pfmov {dst = realTemp1ContentsOperand, src = dst, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FMUL, dst = realTemp1ContentsOperand, src = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfldc {oper = Instruction.ONE, dst = realTemp2ContentsOperand, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FSUB, dst = realTemp2ContentsOperand, src = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfuna {oper = Instruction.FSQRT, dst = realTemp2ContentsOperand, size = dstsize}, Assembly.instruction_pfbinasp {oper = Instruction.FPATAN, src = realTemp2ContentsOperand, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_atan _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_atan, dstsize/srcsize", fn () => srcsize = dstsize) val realTemp1ContentsOperand = realTemp1ContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize}, Assembly.instruction_pfldc {oper = Instruction.ONE, dst = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfbinasp {oper = Instruction.FPATAN, src = realTemp1ContentsOperand, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_atan2 _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_Math_atan2, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src1, size = src1size}, Assembly.instruction_pfbinasp {oper = Instruction.FPATAN, src = src2, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_cos _ => funa Instruction.FCOS | Real_Math_exp _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_exp, dstsize/srcsize", fn () => srcsize = dstsize) val realTemp1ContentsOperand = realTemp1ContentsOperand srcsize val realTemp2ContentsOperand = realTemp2ContentsOperand srcsize in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfldc {oper = Instruction.L2E, dst = dst, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FMUL, src = src, dst = dst, size = dstsize}, Assembly.instruction_pfmov {src = dst, dst = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfuna {oper = Instruction.FRNDINT, dst = realTemp1ContentsOperand, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FSUB, src = realTemp1ContentsOperand, dst = dst, size = dstsize}, Assembly.instruction_pfuna {oper = Instruction.F2XM1, dst = dst, size = dstsize}, Assembly.instruction_pfldc {oper = Instruction.ONE, dst = realTemp2ContentsOperand, size = dstsize}, Assembly.instruction_pfbina {oper = Instruction.FADD, src = realTemp2ContentsOperand, dst = dst, size = dstsize}, Assembly.instruction_pfbinas {oper = Instruction.FSCALE, src = realTemp1ContentsOperand, dst = dst, size = dstsize}], transfer = NONE}] end | Real_Math_ln _ => flogarithm Instruction.LN2 | Real_Math_log10 _ => flogarithm Instruction.LG2 | Real_Math_sin _ => funa Instruction.FSIN | Real_Math_sqrt _ => funa Instruction.FSQRT | Real_Math_tan _ => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val _ = Assert.assert ("x86MLton.prim: Real_Math_tan, dstsize/srcsize", fn () => srcsize = dstsize) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {src = src, dst = dst, size = dstsize}, Assembly.instruction_pfptan {dst = dst, size = dstsize}], transfer = NONE}] end | Real_mul _ => fbina Instruction.FMUL | Real_muladd _ => fbina_fmul Instruction.FADD | Real_mulsub _ => fbina_fmul Instruction.FSUB | Real_add _ => fbina Instruction.FADD | Real_sub _ => fbina Instruction.FSUB | Real_div _ => fbina Instruction.FDIV | Real_lt _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_lt, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfcom {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_fstsw {dst = fpswTempContentsOperand, check = false}, Assembly.instruction_test {src1 = fpswTempContentsOperand, src2 = Operand.immediate_int' (0x4500, WordSize.word16), size = Size.WORD}, Assembly.instruction_setcc {condition = Instruction.Z, dst = dst, size = dstsize}], transfer = NONE}] end | Real_le _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_le, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfcom {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_fstsw {dst = fpswTempContentsOperand, check = false}, Assembly.instruction_test {src1 = fpswTempContentsOperand, src2 = Operand.immediate_int' (0x500, WordSize.word16), size = Size.WORD}, Assembly.instruction_setcc {condition = Instruction.Z, dst = dst, size = dstsize}], transfer = NONE}] end | Real_equal _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_equal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfucom {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_fstsw {dst = fpswTempContentsOperand, check = false}, Assembly.instruction_binal {oper = Instruction.AND, dst = fpswTempContentsOperand, src = Operand.immediate_int' (0x4500, WordSize.word16), size = Size.WORD}, Assembly.instruction_cmp {src1 = fpswTempContentsOperand, src2 = Operand.immediate_int' (0x4000, WordSize.word16), size = Size.WORD}, Assembly.instruction_setcc {condition = Instruction.E, dst = dst, size = dstsize}], transfer = NONE}] end | Real_qequal _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size))= getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_qequal, src1size/src2size", fn () => src1size = src2size) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfucom {src1 = src2, src2 = src1, size = src1size}, Assembly.instruction_fstsw {dst = fpswTempContentsOperand, check = false}, Assembly.instruction_test {src1 = fpswTempContentsOperand, src2 = Operand.immediate_int' (0x4400, WordSize.word16), size = Size.WORD}, Assembly.instruction_setcc {condition = Instruction.NE, dst = dst, size = dstsize}], transfer = NONE}] end | Real_abs _ => funa Instruction.FABS | Real_rndToReal (s, s') => let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () fun mov () = AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize}], transfer = NONE}] fun movx () = AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovx {dst = dst, src = src, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] fun xvom () = AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfxvom {dst = dst, src = src, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] in case (s, s') of (R64, R64) => mov () | (R64, R32) => xvom () | (R32, R64) => movx () | (R32, R32) => mov () end | Real_rndToWord (s, s', _) => let fun default () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovti {dst = dst, src = src, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] end fun default' () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val (tmp,tmpsize) = (fildTempContentsOperand, Size.WORD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovti {dst = tmp, src = src, srcsize = srcsize, dstsize = tmpsize}, Assembly.instruction_xvom {src = tmp, dst = dst, dstsize = dstsize, srcsize = tmpsize}], transfer = NONE}] end in case (s, WordSize.prim s') of (R64, W64) => Error.bug "x86MLton.prim: Real_toWord, W64" | (R64, W32) => default () | (R64, W16) => default () | (R64, W8) => default' () | (R32, W64) => Error.bug "x86MLton.prim: Real_toWord, W64" | (R32, W32) => default () | (R32, W16) => default () | (R32, W8) => default' () end | Real_ldexp _ => let val (dst,dstsize) = getDst1 () val ((src1,src1size), (src2,src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.prim: Real_ldexp, dstsize/src1size", fn () => src1size = dstsize) val _ = Assert.assert ("x86MLton.prim: Real_ldexp, src2size", fn () => src2size = Size.LONG) val realTemp1ContentsOperand = realTemp1ContentsOperand src1size in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovfi {dst = realTemp1ContentsOperand, src = src2, srcsize = src2size, dstsize = dstsize}, Assembly.instruction_pfmov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_pfbinas {oper = Instruction.FSCALE, dst = dst, src = realTemp1ContentsOperand, size = dstsize}], transfer = NONE}] end | Real_neg _ => funa Instruction.FCHS | Real_round _ => funa Instruction.FRNDINT | Word_add s => (case WordSize.prim s of W8 => binal Instruction.ADD | W16 => binal Instruction.ADD | W32 => binal Instruction.ADD | W64 => binal64 (Instruction.ADD, Instruction.ADC)) | Word_andb s => bitop (s, Instruction.AND) | Word_equal _ => cmp Instruction.E | Word_lshift s => shift (s, Instruction.SHL) | Word_lt (s, sg) => compare (s, sg, Instruction.L, Instruction.B) | Word_mul (s, {signed}) => (case WordSize.prim s of W8 => pmd (if signed then Instruction.IMUL else Instruction.MUL) | W16 => imul2 () | W32 => imul2 () | W64 => Error.bug "x86MLton.prim: Word_mul, W64") | Word_neg s => (case WordSize.prim s of W8 => unal Instruction.NEG | W16 => unal Instruction.NEG | W32 => unal Instruction.NEG | W64 => unal64 (Instruction.NEG, fn (dst,dstsize) => [Assembly.instruction_binal {dst = dst, oper = Instruction.ADC, src = Operand.immediate_zero, size = dstsize}])) | Word_notb s => (case WordSize.prim s of W8 => unal Instruction.NOT | W16 => unal Instruction.NOT | W32 => unal Instruction.NOT | W64 => unal64 (Instruction.NOT, fn _ => [])) | Word_orb s => bitop (s, Instruction.OR) | Word_quot (_, {signed}) => pmd (if signed then Instruction.IDIV else Instruction.DIV) | Word_rem (_, {signed}) => pmd (if signed then Instruction.IMOD else Instruction.MOD) | Word_rol s => shift (s, Instruction.ROL) | Word_ror s => shift (s, Instruction.ROR) | Word_rshift (s, {signed}) => shift (s, if signed then Instruction.SAR else Instruction.SHR) | Word_sub s => (case WordSize.prim s of W8 => binal Instruction.SUB | W16 => binal Instruction.SUB | W32 => binal Instruction.SUB | W64 => binal64 (Instruction.SUB, Instruction.SBB)) | Word_rndToReal (s, s', _) => let fun default () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_pfmovfi {src = src, dst = dst, srcsize = srcsize, dstsize = dstsize}], transfer = NONE}] end fun default' () = let val (dst,dstsize) = getDst1 () val (src,srcsize) = getSrc1 () val (tmp,tmpsize) = (fildTempContentsOperand, Size.WORD) in AppendList.fromList [Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_movx {oper = Instruction.MOVSX, src = src, dst = tmp, dstsize = tmpsize, srcsize = srcsize}, Assembly.instruction_pfmovfi {src = tmp, dst = dst, srcsize = tmpsize, dstsize = dstsize}], transfer = NONE}] end in case (WordSize.prim s, s') of (W32, R64) => default () | (W32, R32) => default () | (W16, R64) => default () | (W16, R32) => default () | (W8, R64) => default' () | (W8, R32) => default' () | _ => Error.bug "x86MLton.prim: Word_toReal, W64" end | Word_extdToWord (s, s', {signed}) => let val b = WordSize.bits s val b' = WordSize.bits s' in if Bits.< (b, b') then movx (if signed then Instruction.MOVSX else Instruction.MOVZX) else if Bits.equals (b, b') then mov () else xvom () end | Word_xorb s => bitop (s, Instruction.XOR) | _ => Error.bug ("x86MLton.prim: strange Prim.Name.t: " ^ primName)), comment_end] end fun ccall {args: (x86.Operand.t * x86.Size.t) vector, frameInfo, func, return: x86.Label.t option, transInfo = {...}: transInfo} = let val CFunction.T {convention, target, ...} = func val comment_begin = if !Control.Native.commented > 0 then AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment (concat ["begin ccall: ", CFunction.Convention.toString convention, " ", CFunction.Target.toString target])], transfer = NONE}) else AppendList.empty in AppendList.appends [comment_begin, AppendList.single (Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (Transfer.ccall {args = Vector.toList args, frameInfo = frameInfo, func = func, return = return})})] end fun creturn {dsts: (x86.Operand.t * x86.Size.t) vector, frameInfo: x86.FrameInfo.t option, func: RepType.t CFunction.t, label: x86.Label.t, transInfo = {live, liveInfo, ...}: transInfo} = let val CFunction.T {convention, target, ...} = func fun default () = let val _ = x86Liveness.LiveInfo.setLiveOperands (liveInfo, label, live label) in AppendList.single (x86.Block.mkBlock' {entry = SOME (Entry.creturn {dsts = dsts, frameInfo = frameInfo, func = func, label = label}), statements = [], transfer = NONE}) end val comment_end = if !Control.Native.commented > 0 then AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment (concat ["begin creturn: ", CFunction.Convention.toString convention, " ", CFunction.Target.toString target])], transfer = NONE}) else AppendList.empty in AppendList.appends [default (), comment_end] end fun arith {prim : RepType.t Prim.t, args : (Operand.t * Size.t) vector, dsts : (Operand.t * Size.t) vector, overflow : Label.t, success : Label.t, transInfo = {live, liveInfo, ...} : transInfo} = let val primName = Prim.toString prim datatype z = datatype Prim.Name.t fun getDst1 () = Vector.sub (dsts, 0) handle _ => Error.bug "x86MLton.arith: getDst1" fun getDst2 () = (Vector.sub (dsts, 0), Vector.sub (dsts, 1)) handle _ => Error.bug "x86MLton.arith: getDst2" fun getSrc1 () = Vector.sub (args, 0) handle _ => Error.bug "x86MLton.arith: getSrc1" fun getSrc2 () = (Vector.sub (args, 0), Vector.sub (args, 1)) handle _ => Error.bug "x86MLton.arith: getSrc2" fun getSrc4 () = (Vector.sub (args, 0), Vector.sub (args, 1), Vector.sub (args, 2), Vector.sub (args, 3)) handle _ => Error.bug "x86MLton.arith: getSrc4" fun check (statements, condition) = AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = statements, transfer = SOME (x86.Transfer.iff {condition = condition, truee = overflow, falsee = success})}) fun binal (oper: x86.Instruction.binal, condition) = let val (dst, dstsize) = getDst1 () val ((src1, src1size), (src2, src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.arith: binal, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are * temporaries and the oper is commutative. *) val (src1,src2) = if (oper = x86.Instruction.ADD) then case (x86.Operand.deMemloc src1, x86.Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in check ([Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_binal {oper = oper, dst = dst, src = src2, size = dstsize}], condition) end fun binal64 (oper1: x86.Instruction.binal, oper2: x86.Instruction.binal, condition) = let val ((dst1, dst1size), (dst2, dst2size)) = getDst2 () val ((src1, src1size), (src2, src2size), (src3, src3size), (src4, src4size)) = getSrc4 () val _ = Assert.assert ("x86MLton.arith: binal64, dst1size/dst2size/src1size/src2size/src3size/src4size", fn () => src1size = dst1size andalso src3size = dst1size andalso src2size = dst2size andalso src4size = dst2size andalso dst1size = dst2size) val tdst1 = if List.exists ([src2,src3,src4], fn src => Operand.mayAlias (dst1, src)) then wordTemp1ContentsOperand dst1size else dst1 val tdst2 = if List.exists ([src3,src4], fn src => Operand.mayAlias (dst2, src)) then wordTemp1ContentsOperand dst2size else dst2 in check ([Assembly.instruction_mov {dst = tdst1, src = src1, size = dst1size}, Assembly.instruction_mov {dst = tdst2, src = src2, size = dst2size}, Assembly.instruction_binal {oper = oper1, dst = tdst1, src = src3, size = dst1size}, Assembly.instruction_binal {oper = oper2, dst = tdst2, src = src4, size = dst2size}, Assembly.instruction_mov {dst = dst1, src = tdst1, size = dst1size}, Assembly.instruction_mov {dst = dst2, src = tdst2, size = dst2size}], condition) end fun pmd (oper: x86.Instruction.md, condition) = let val (dst, dstsize) = getDst1 () val ((src1, src1size), (src2, src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.arith: pmd, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are * temporaries and the oper is commutative. *) val (src1, src2) = if oper = x86.Instruction.MUL then case (x86.Operand.deMemloc src1, x86.Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) else (src1,src2) in check ([Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_pmd {oper = oper, dst = dst, src = src2, size = dstsize}], condition) end fun unal (oper: x86.Instruction.unal, condition) = let val (dst, dstsize) = getDst1 () val (src1, src1size) = getSrc1 () val _ = Assert.assert ("x86MLton.arith: unal, dstsize/src1size", fn () => src1size = dstsize) in check ([Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_unal {oper = oper, dst = dst, size = dstsize}], condition) end fun neg64 () = let val ((dst1, dst1size), (dst2, dst2size)) = getDst2 () val ((src1, src1size), (src2, src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.arith: neg64, dst1size/dst2size/src1size/src2size", fn () => src1size = dst1size andalso src2size = dst2size andalso dst1size = dst2size) val tdst1 = if List.exists ([src2], fn src => Operand.mayAlias (dst1, src)) then wordTemp1ContentsOperand dst1size else dst1 val loZ = Label.newString "loZ" val _ = x86Liveness.LiveInfo.setLiveOperands (liveInfo, loZ, dst2::((live success) @ (live overflow))) val loNZ = Label.newString "loNZ" val _ = x86Liveness.LiveInfo.setLiveOperands (liveInfo, loNZ, dst2::(live success)) in AppendList.fromList [x86.Block.mkBlock' {entry = NONE, statements = [Assembly.instruction_mov {dst = tdst1, src = src1, size = dst1size}, Assembly.instruction_mov {dst = dst2, src = src2, size = dst2size}, Assembly.instruction_mov {dst = dst1, src = tdst1, size = dst1size}, Assembly.instruction_unal {oper = x86.Instruction.NEG, dst = dst1, size = dst1size}], transfer = SOME (x86.Transfer.iff {condition = x86.Instruction.Z, truee = loZ, falsee = loNZ})}, x86.Block.mkBlock' {entry = SOME (x86.Entry.jump {label = loNZ}), statements = [Assembly.instruction_unal {dst = dst2, oper = Instruction.INC, size = dst2size}, Assembly.instruction_unal {oper = x86.Instruction.NEG, dst = dst2, size = dst2size}], transfer = SOME (x86.Transfer.goto {target = success})}, x86.Block.mkBlock' {entry = SOME (x86.Entry.jump {label = loZ}), statements = [Assembly.instruction_unal {oper = x86.Instruction.NEG, dst = dst2, size = dst2size}], transfer = SOME (x86.Transfer.iff {condition = x86.Instruction.O, truee = overflow, falsee = success})}] end fun imul2 condition = let val (dst, dstsize) = getDst1 () val ((src1, src1size), (src2, src2size)) = getSrc2 () val _ = Assert.assert ("x86MLton.arith: imul2, dstsize/src1size/src2size", fn () => src1size = dstsize andalso src2size = dstsize) (* Reverse src1/src2 when src1 and src2 are * temporaries and the oper is commutative. *) val (src1, src2) = case (x86.Operand.deMemloc src1, x86.Operand.deMemloc src2) of (SOME memloc_src1, SOME memloc_src2) => if x86Liveness.track memloc_src1 andalso x86Liveness.track memloc_src2 then (src2,src1) else (src1,src2) | _ => (src1,src2) in check ([Assembly.instruction_mov {dst = dst, src = src1, size = dstsize}, Assembly.instruction_imul2 {dst = dst, src = src2, size = dstsize}], condition) end val (comment_begin,_) = if !Control.Native.commented > 0 then let val comment = primName in (AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment ("begin arith: " ^ comment)], transfer = NONE}), AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment ("end arith: " ^ comment)], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun flag {signed} = if signed then x86.Instruction.O else x86.Instruction.C in AppendList.appends [comment_begin, (case Prim.name prim of Word_addCheck (s, sg) => let val flag = flag sg in case WordSize.prim s of W8 => binal (x86.Instruction.ADD, flag) | W16 => binal (x86.Instruction.ADD, flag) | W32 => binal (x86.Instruction.ADD, flag) | W64 => binal64 (x86.Instruction.ADD, x86.Instruction.ADC, flag) end | Word_mulCheck (s, {signed}) => let in if signed then (case WordSize.prim s of W8 => pmd (x86.Instruction.IMUL, x86.Instruction.O) | W16 => imul2 x86.Instruction.O | W32 => imul2 x86.Instruction.O | W64 => Error.bug "x86MLton.arith: Word_mulCheck, W64") else (case WordSize.prim s of W8 => pmd (x86.Instruction.MUL, x86.Instruction.C) | W16 => pmd (x86.Instruction.MUL, x86.Instruction.C) | W32 => pmd (x86.Instruction.MUL, x86.Instruction.C) | W64 => Error.bug "x86MLton.arith: Word_mulCheck, W64") end | Word_negCheck s => (case WordSize.prim s of W8 => unal (x86.Instruction.NEG, x86.Instruction.O) | W16 => unal (x86.Instruction.NEG, x86.Instruction.O) | W32 => unal (x86.Instruction.NEG, x86.Instruction.O) | W64 => neg64 ()) | Word_subCheck (s, sg) => let val flag = flag sg in case WordSize.prim s of W8 => binal (x86.Instruction.SUB, flag) | W16 => binal (x86.Instruction.SUB, flag) | W32 => binal (x86.Instruction.SUB, flag) | W64 => binal64 (x86.Instruction.SUB, x86.Instruction.SBB, flag) end | _ => Error.bug ("x86MLton.arith: strange Prim.Name.t: " ^ primName))] end end mlton-20100608/mlton/codegen/x86-codegen/x86-mlton.sig0000644000076600000240000000421711404435625020633 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_MLTON_STRUCTS = sig structure x86MLtonBasic : X86_MLTON_BASIC structure x86Liveness : X86_LIVENESS sharing x86MLtonBasic.x86 = x86Liveness.x86 end signature X86_MLTON = sig include X86_MLTON_STRUCTS include X86_MLTON_BASIC sharing x86 = x86MLtonBasic.x86 sharing x86 = x86Liveness.x86 sharing x86.Label = Machine.Label sharing Machine = x86MLtonBasic.Machine type transInfo = {addData : x86.Assembly.t list -> unit, frameInfoToX86: (x86MLtonBasic.Machine.FrameInfo.t -> x86.FrameInfo.t), live: x86.Label.t -> x86.Operand.t list, liveInfo: x86Liveness.LiveInfo.t} (* arith, c call, and primitive assembly sequences. *) val arith: {prim: RepType.t Machine.Prim.t, args: (x86.Operand.t * x86.Size.t) vector, dsts: (x86.Operand.t * x86.Size.t) vector, overflow: x86.Label.t, success: x86.Label.t, transInfo : transInfo} -> x86.Block.t' AppendList.t val ccall: {args: (x86.Operand.t * x86.Size.t) vector, frameInfo: x86.FrameInfo.t option, func: RepType.t Machine.CFunction.t, return: x86.Label.t option, transInfo: transInfo} -> x86.Block.t' AppendList.t val creturn: {dsts: (x86.Operand.t * x86.Size.t) vector, frameInfo: x86.FrameInfo.t option, func: RepType.t Machine.CFunction.t, label: x86.Label.t, transInfo: transInfo} -> x86.Block.t' AppendList.t val implementsPrim: RepType.t Machine.Prim.t -> bool val prim: {prim: RepType.t Machine.Prim.t, args: (x86.Operand.t * x86.Size.t) vector, dsts: (x86.Operand.t * x86.Size.t) vector, transInfo: transInfo} -> x86.Block.t' AppendList.t end mlton-20100608/mlton/codegen/x86-codegen/x86-pseudo.sig0000644000076600000240000004362511404435625021007 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_PSEUDO = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize val tracer : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val tracerTop : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) structure Size : sig datatype class = INT | FLT | FPI datatype t = BYTE | WORD | LONG | SNGL | DBLE | EXTD | FPIS | FPIL | FPIQ val fromBytes : int -> t val toBytes : t -> int val fromCType : CType.t -> t vector val class : t -> class val eq : t * t -> bool val lt : t * t -> bool end structure Immediate : sig type t val word : WordX.t -> t val int' : int * WordSize.t -> t val int : int -> t val zero : t val label : Label.t -> t val labelPlusWord : Label.t * WordX.t -> t val labelPlusInt : Label.t * int -> t end structure Scale : sig datatype t = One | Two | Four | Eight val fromBytes : int -> t val fromCType : CType.t -> t end structure MemLoc : sig structure Class : sig type t val new : {name: string} -> t val Temp : t val StaticTemp : t val CStack : t val Code : t val eq : t * t -> bool end type t val layout : t -> Layout.t val imm : {base: Immediate.t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val basic : {base: Immediate.t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val simple : {base: t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val complex : {base: t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val shift : {origin: t, disp: Immediate.t, scale: Scale.t, size: Size.t} -> t val class : t -> Class.t val compare : t * t -> order (* * Static memory locations *) val makeContents : {base: Immediate.t, size: Size.t, class: Class.t} -> t end structure ClassSet : SET sharing type ClassSet.Element.t = MemLoc.Class.t structure MemLocSet : SET sharing type MemLocSet.Element.t = MemLoc.t structure Operand : sig type t val layout : t -> Layout.t val toString : t -> string val immediate : Immediate.t -> t val immediate_word : WordX.t -> t val immediate_int' : int * WordSize.t -> t val immediate_int : int -> t val immediate_zero : t val immediate_label : Label.t -> t val deImmediate : t -> Immediate.t option val label : Label.t -> t val deLabel : t -> Label.t option val memloc : MemLoc.t -> t val memloc_label : Label.t -> t val deMemloc : t -> MemLoc.t option val size : t -> Size.t option val eq : t * t -> bool val mayAlias : t * t -> bool end structure Instruction : sig (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 63 *) | ADC (* signed/unsigned addition with carry; p. 61 *) | SUB (* signed/unsigned subtraction; p. 713 *) | SBB (* signed/unsigned subtraction with borrow; p. 667 *) | AND (* logical and; p. 70 *) | OR (* logical or; p. 499 *) | XOR (* logical xor; p. 758 *) (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 335 *) | MUL (* unsigned multiplication; p. 488 *) | IDIV (* signed division; p. 332 *) | DIV (* unsigned division; p. 188 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) datatype unal = INC (* increment by 1; p. 341 *) | DEC (* decrement by 1; p. 186 *) | NEG (* two's complement negation; p. 494 *) | NOT (* one's complement negation; p. 497 *) (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 662 *) | SHL (* shift logical left; p. 662 *) | SAR (* shift arithmetic right; p. 662 *) | SHR (* shift logical right; p. 662 *) | ROL (* rotate left; p. 631 *) | RCL (* rotate through carry left; p. 631 *) | ROR (* rotate right; p. 631 *) | RCR (* rotate through carry right; p. 631 *) (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 481 *) | MOVZX (* move with zero extention; p. 486 *) (* Condition test field; p. 795 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate : condition -> condition val condition_reverse : condition -> condition (* Floating-point binary arithmetic instructions. *) datatype fbina = FADD (* addition; p. 205 *) | FSUB (* subtraction; p. 297 *) | FSUBR (* reversed subtraction; p. 301 *) | FMUL (* multiplication; p. 256 *) | FDIV (* division; p. 229 *) | FDIVR (* reversed division; p. 233 *) val fbina_reverse : fbina -> fbina (* Floating-point unary arithmetic instructions. *) datatype funa = F2XM1 (* compute 2^x-1; p. 201 *) | FABS (* absolute value; p. 203 *) | FCHS (* change sign; p. 214 *) | FSQRT (* square root; p. 284 *) | FSIN (* sine; p. 280 *) | FCOS (* cosine; p. 226 *) | FRNDINT (* round to integer; p. 271 *) (* Floating-point binary arithmetic stack instructions. *) datatype fbinas = FSCALE (* scale; p. 278 *) | FPREM (* partial remainder; p. 263 *) | FPREM1 (* IEEE partial remainder; p. 266 *) (* floating point binary arithmetic stack pop instructions. *) datatype fbinasp = FYL2X (* compute y * log_2 x; p. 327 *) | FYL2XP1 (* compute y * log_2 (x + 1.0); p. 329 *) | FPATAN (* partial arctangent; p. 261 *) (* Floating-point constants. *) datatype fldc = ONE (* +1.0; p. 250 *) | ZERO (* +0.0; p. 250 *) | PI (* pi; p. 250 *) | L2E (* log_2 e; p. 250 *) | LN2 (* log_e 2; p. 250 *) | L2T (* log_2 10; p. 250 *) | LG2 (* log_10 2; p. 250 *) type t end structure PseudoOp : sig type t val toString : t -> string val data : unit -> t val text : unit -> t val p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val byte : Immediate.t list -> t val word : Immediate.t list -> t val long : Immediate.t list -> t end structure Assembly : sig type t val toString : t -> string val comment : string -> t val isComment : t -> bool val pseudoop : PseudoOp.t -> t val pseudoop_data : unit -> t val pseudoop_text : unit -> t val pseudoop_symbol_stub : unit -> t val pseudoop_non_lazy_symbol_pointer : unit -> t val pseudoop_p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val pseudoop_byte : Immediate.t list -> t val pseudoop_global: Label.t -> t val pseudoop_hidden : Label.t -> t val pseudoop_indirect_symbol : Label.t -> t val pseudoop_word : Immediate.t list -> t val pseudoop_long : Immediate.t list -> t val label : Label.t -> t val instruction : Instruction.t -> t val instruction_nop : unit -> t val instruction_binal : {oper: Instruction.binal, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pmd : {oper: Instruction.md, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_imul2 : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_unal : {oper: Instruction.unal, dst: Operand.t, size: Size.t} -> t val instruction_sral : {oper: Instruction.sral, count: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmp : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_test : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_setcc : {condition: Instruction.condition, dst: Operand.t, size: Size.t} -> t val instruction_jmp : {target: Operand.t, absolute: bool} -> t val instruction_jcc : {condition: Instruction.condition, target: Operand.t} -> t val instruction_call : {target: Operand.t, absolute: bool} -> t val instruction_ret : {src: Operand.t option} -> t val instruction_mov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmovcc : {condition: Instruction.condition, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_xchg : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_ppush : {src: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_ppop : {dst: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_movx : {oper: Instruction.movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_xvom : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_lea : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfmov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfmovx : {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} -> t val instruction_pfxvom : {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} -> t val instruction_pfldc : {oper: Instruction.fldc, dst: Operand.t, size: Size.t} -> t val instruction_pfmovfi : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_pfmovti : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_pfcom : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_pfucom : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_pfbina : {oper: Instruction.fbina, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfuna : {oper: Instruction.funa, dst: Operand.t, size: Size.t} -> t val instruction_pfptan : {dst: Operand.t, size: Size.t} -> t val instruction_pfbinas : {oper: Instruction.fbinas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfbinasp : {oper: Instruction.fbinasp, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_fldcw : {src: Operand.t} -> t val instruction_fstcw : {dst: Operand.t, check: bool} -> t val instruction_fstsw : {dst: Operand.t, check: bool} -> t end structure FrameInfo: sig datatype t = T of {size: int, frameLayoutsIndex: int} end structure Entry: sig type t val cont: {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} -> t val creturn: {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} -> t val func: {label: Label.t, live: MemLocSet.t} -> t val handler: {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} -> t val jump: {label: Label.t} -> t val label: t -> Label.t end structure Transfer : sig structure Cases : sig type 'a t val word : (WordX.t * 'a) list -> 'a t end type t val goto : {target: Label.t} -> t val iff : {condition: Instruction.condition, truee: Label.t, falsee: Label.t} -> t val switch : {test: Operand.t, cases: Label.t Cases.t, default: Label.t} -> t val tail : {target: Label.t, live: MemLocSet.t} -> t val nontail : {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} -> t val return : {live: MemLocSet.t} -> t val raisee : {live: MemLocSet.t} -> t val ccall : {args: (Operand.t * Size.t) list, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, return: Label.t option} -> t end structure ProfileLabel : sig type t end structure Block : sig type t' val mkBlock': {entry: Entry.t option, statements: Assembly.t list, transfer: Transfer.t option} -> t' val mkProfileBlock': {profileLabel: ProfileLabel.t} -> t' val printBlock' : t' -> unit type t val printBlock : t -> unit val compress: t' list -> t list end structure Chunk : sig datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end functor x86PseudoCheck(structure S : X86) : X86_PSEUDO = S mlton-20100608/mlton/codegen/x86-codegen/x86-simplify.fun0000644000076600000240000060552411404435625021354 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86Simplify(S: X86_SIMPLIFY_STRUCTS): X86_SIMPLIFY = struct open S open x86 val tracer = x86.tracer val tracerTop = x86.tracerTop structure PeepholeBlock = struct structure Peephole = Peephole(type entry_type = Entry.t type profileLabel_type = ProfileLabel.t option type statement_type = Assembly.t type transfer_type = Transfer.t datatype block = datatype Block.t) open Peephole fun make_callback_msg name = let val count = ref 0 val total = ref 0 val callback = fn true => (Int.inc count; Int.inc total) | false => Int.inc total val msg = fn () => Control.messageStr (Control.Detail, concat [name, ": ", Int.toString (!count), " / ", Int.toString (!total)]) in (callback,msg) end val isComment : statement_type -> bool = fn Assembly.Comment _ => true | _ => false local val isInstructionMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV _) => true | _ => false val isInstructionBinALMD : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL _) => true | Assembly.Instruction (Instruction.pMD _) => true | Assembly.Instruction (Instruction.IMUL2 _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV, All isComment, One isInstructionBinALMD], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_binal {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pmd {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_mov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_imul2 {src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeepholeBlock: elimBinALMDDouble" val (callback,elimBinALMDDouble_msg) = make_callback_msg "elimBinALMDDouble" in val elimBinALMDDouble : optimization = {template = template, rewriter = rewriter, callback = callback} val elimBinALMDDouble_msg = elimBinALMDDouble_msg end local val isInstructionFMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.pFMOV _) => true | _ => false val isInstructionFBinA : statement_type -> bool = fn Assembly.Instruction (Instruction.pFBinA _) => true | Assembly.Instruction (Instruction.pFBinAS _) => true | Assembly.Instruction (Instruction.pFBinASP _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionFMOV, All isComment, One isInstructionFBinA], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pFBinA {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_pfmov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pfbina {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pFBinAS {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_pfmov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pfbinas {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pFBinASP {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) andalso Operand.eq(src1, src2) then let val statements = (Assembly.instruction_pfmov {src = src1, dst = dst1, size = size1}):: (Assembly.instruction_pfbinasp {oper = oper2, src = dst1, dst = dst2, size = size1}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeepholeBlock: elimFltBinADouble" val (callback,elimFltBinADouble_msg) = make_callback_msg "elimFltBinADouble" in val elimFltBinADouble : optimization = {template = template, rewriter = rewriter, callback = callback} val elimFltBinADouble_msg = elimFltBinADouble_msg end local val isInstructionMOV_srcImmediate : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV {src = Operand.Immediate _, ...}) => true | _ => false val isInstructionBinALMD_operCommute : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL {oper, src, dst, ...}) => ((oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR)) andalso (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | Assembly.Instruction (Instruction.pMD {oper, src, dst, ...}) => ((oper = Instruction.IMUL) orelse (oper = Instruction.MUL)) andalso (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | Assembly.Instruction (Instruction.IMUL2 {src, dst, ...}) => (case (Operand.deMemloc src, Operand.deMemloc dst) of (SOME src, SOME dst) => not (List.exists (src::(MemLoc.utilized src), fn memloc => MemLoc.mayAlias(memloc, dst))) | _ => true) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_srcImmediate, All isComment, One isInstructionBinALMD_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_binal {oper = oper2, src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_pmd {oper = oper2, src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1, size = size1})], comments, [Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2, size = size2})]], finish, transfer} => if Size.eq(size1, size2) andalso Operand.eq(dst1, dst2) then case (src1, src2) of (Operand.Immediate _, Operand.Immediate _) => NONE | (Operand.Immediate _, _) => let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (Assembly.instruction_imul2 {src = src1, dst = dst2, size = size2}):: finish val statements = List.fold(start, List.concat [comments, statements], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE else NONE | _ => Error.bug "x86Simplify.PeepholeBlock: commuteBinALMD" val (callback,commuteBinALMD_msg) = make_callback_msg "commuteBinALMD" in val commuteBinALMD : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteBinALMD_msg = commuteBinALMD_msg end local val getImmediate1 = fn Immediate.Word w => if WordX.isOne w then SOME false else if WordX.isNegOne w then SOME true else NONE | _ => NONE val isInstructionADDorSUB_srcImmediate1 : statement_type -> bool = fn Assembly.Instruction (Instruction.BinAL {oper, src = Operand.Immediate immediate, ...}) => (case oper of Instruction.ADD => true | Instruction.SUB => true | _ => false) andalso isSome (getImmediate1 (Immediate.destruct immediate)) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionADDorSUB_srcImmediate1], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.BinAL {oper, src = Operand.Immediate immediate, dst, size})]], finish, transfer} => if (case List.fold (finish, (false, false), fn (asm, (b, b')) => case asm of Assembly.Comment _ => (b, b') | Assembly.Instruction (Instruction.BinAL {oper = Instruction.ADC, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.BinAL {oper = Instruction.SBB, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.SETcc {condition = Instruction.C, ...}) => (true, if b then b' else true) | Assembly.Instruction (Instruction.SETcc {condition = Instruction.NC, ...}) => (true, if b then b' else true) | _ => (true, b')) of (_, true) => true | (false, _) => (case transfer of Transfer.Iff {condition = Instruction.C, ...} => true | Transfer.Iff {condition = Instruction.NC, ...} => true | _ => false) | _ => false) then NONE else let val oper = case (oper, getImmediate1 (Immediate.destruct immediate)) of (Instruction.ADD, SOME false) => Instruction.INC | (Instruction.ADD, SOME true ) => Instruction.DEC | (Instruction.SUB, SOME false) => Instruction.DEC | (Instruction.SUB, SOME true ) => Instruction.INC | _ => Error.bug "x86Simplify.PeeholeBlock: elimAddSub1:oper" val statements = (Assembly.instruction_unal {oper = oper, dst = dst, size = size}):: finish val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimAddSub1" val (callback,elimAddSub1_msg) = make_callback_msg "elimAddSub1" in val elimAddSub1: optimization = {template = template, rewriter = rewriter, callback = callback} val elimAddSub1_msg = elimAddSub1_msg end local val rec log2' = fn (w : WordX.t, i : int) => if WordX.isZero w then NONE else if WordX.isOne (WordX.andb (w, WordX.one (WordX.size w))) then if WordX.isOne w then SOME (i, false) else if WordX.isNegOne w then SOME (i, true) else NONE else log2' (WordX.rshift (w, WordX.one (WordX.size w), {signed = true}), i + 1) fun log2 w = log2' (w, 0 : int) fun divTemp size = MemLoc.imm {base = Immediate.label (Label.fromString "divTemp"), index = Immediate.zero, scale = Scale.Four, size = size, class = MemLoc.Class.Temp} val isImmediatePow2 = fn Immediate.Word w => isSome (log2 w) | _ => false val getImmediateLog2 = fn Immediate.Word w => log2 w | _ => NONE val isInstructionMULorDIV_srcImmediatePow2 : statement_type -> bool = fn Assembly.Instruction (Instruction.pMD {oper, src = Operand.Immediate immediate, ...}) => (case oper of Instruction.IMUL => true | Instruction.MUL => true | Instruction.IDIV => true | Instruction.DIV => true | _ => false) andalso isImmediatePow2 (Immediate.destruct immediate) | Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, ...}) => isImmediatePow2 (Immediate.destruct immediate) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMULorDIV_srcImmediatePow2, All isComment], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IMUL, src = Operand.Immediate immediate, dst, size})], comments], finish = [], transfer as Transfer.Iff {condition, truee, falsee}} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => let val transfer = case condition of Instruction.O => Transfer.Goto {target = falsee} | Instruction.NO => Transfer.Goto {target = truee} | _ => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:transfer" val statements = List.fold(start, comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (0,true) => let val statements = List.fold (start, (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: comments), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IMUL, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: (List.concat [comments, finish])), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val statements = (fn l => (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.MUL, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (i,false) => if i < (8 * Size.toBytes size) then let val statements = (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | SOME (_,true) => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.IDIV, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val divTemp = Operand.MemLoc (divTemp size) val width = 8 * Size.toBytes size val statements = ((fn l => (Assembly.instruction_mov {src = dst, dst = divTemp, size = size}):: l) o (fn l => if i > 1 then (Assembly.instruction_sral {oper = Instruction.SAR, dst = divTemp, count = Operand.immediate_int (i - 1), size = size}):: l else l) o (fn l => if i < width then (Assembly.instruction_sral {oper = Instruction.SHR, dst = divTemp, count = Operand.immediate_int (width - i), size = size}):: l else l) o (fn l => (Assembly.instruction_binal {oper = Instruction.ADD, src = divTemp, dst = dst, size = size}):: (Assembly.instruction_sral {oper = Instruction.SAR, count = Operand.immediate_int i, dst = dst, size = size}):: l) o (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.pMD {oper = Instruction.DIV, src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (i,false) => if i < (8 * Size.toBytes size) then let val statements = (Assembly.instruction_sral {oper = Instruction.SHR, count = Operand.immediate_int i, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | SOME (_,true) => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, dst, size})], comments], finish = [], transfer as Transfer.Iff {condition, truee, falsee}} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => let val transfer = case condition of Instruction.O => Transfer.Goto {target = falsee} | Instruction.NO => Transfer.Goto {target = truee} | _ => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:transfer" val statements = List.fold(start, comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (0,true) => let val statements = List.fold (start, (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: comments, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: comments), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => NONE) | {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.IMUL2 {src = Operand.Immediate immediate, dst, size})], comments], finish, transfer} => (case getImmediateLog2 (Immediate.destruct immediate) of NONE => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2:getImmediateLog2" | SOME (0,false) => SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.fold(start, List.concat [comments, finish], op ::), transfer = transfer}) | SOME (0,true) => let val statements = (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (1,b) => let val statements = List.fold (start, (fn l => if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l) ((Assembly.instruction_binal {oper = Instruction.ADD, src = dst, dst = dst, size = size}):: (List.concat [comments, finish])), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | SOME (i,b) => if i < (8 * Size.toBytes size) then let val statements = (fn l => (Assembly.instruction_sral {oper = Instruction.SAL, count = Operand.immediate_int i, dst = dst, size = size}):: (if b then (Assembly.instruction_unal {oper = Instruction.NEG, dst = dst, size = size}):: l else l)) (List.concat [comments, finish]) val statements = List.fold(start, statements, op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE) | _ => Error.bug "x86Simplify.PeeholeBlock: elimMDPow2" val (callback,elimMDPow2_msg) = make_callback_msg "elimMDPow2" in val elimMDPow2 : optimization = {template = template, rewriter = rewriter, callback = callback} val elimMDPow2_msg = elimMDPow2_msg end local val isInstructionCMPorTEST : statement_type -> bool = fn Assembly.Instruction (Instruction.CMP _) => true | Assembly.Instruction (Instruction.TEST _) => true | _ => false val isInstructionMOV : statement_type -> bool = fn Assembly.Instruction (Instruction.MOV _) => true | _ => false val isInstructionSETcc : statement_type -> bool = fn Assembly.Instruction (Instruction.SETcc _) => true | _ => false val isInstruction : statement_type -> bool = fn Assembly.Instruction _ => true | _ => false val isTransfer_Iff : transfer_type -> bool = fn Transfer.Iff _ => true | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionCMPorTEST, All isComment], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction _], comments], finish, transfer} => let val rec scan = fn [] => not (isTransfer_Iff transfer) | asm::statements => if isComment asm orelse isInstructionMOV asm then scan statements else if isInstructionSETcc asm then false else if isInstruction asm then true else false in if scan finish then let val statements = List.fold(start, List.concat [comments, finish], op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE end | _ => Error.bug "x86Simplify.PeeholeBlock: elimCMPTEST" val (callback,elimCMPTEST_msg) = make_callback_msg "elimCMPTEST" in val elimCMPTEST : optimization = {template = template, rewriter = rewriter, callback = callback} val elimCMPTEST_msg = elimCMPTEST_msg end local val isInstructionCMP_srcImmediate0 = fn Assembly.Instruction (Instruction.CMP {src1 = Operand.Immediate immediate, ...}) => Immediate.isZero immediate | Assembly.Instruction (Instruction.CMP {src2 = Operand.Immediate immediate, ...}) => Immediate.isZero immediate | _ => false val isTransfer_Iff_E_NE = fn Transfer.Iff {condition, ...} => condition = Instruction.E orelse condition = Instruction.NE | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionCMP_srcImmediate0, All isComment], finish = Empty, transfer = isTransfer_Iff_E_NE} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction (Instruction.CMP {src1, src2, size})], comments], finish = [], transfer = Transfer.Iff {condition, truee, falsee}} => let val condition = case condition of Instruction.E => Instruction.Z | Instruction.NE => Instruction.NZ | _ => Error.bug "x86Simplify.PeeholeBlock: elimCMP0:condition" val src = case (Operand.deImmediate src1, Operand.deImmediate src2) of (SOME _, NONE) => src2 | (NONE, SOME _) => src1 | (SOME immediate1, SOME _) => if Immediate.isZero immediate1 then src2 else src1 | _ => Error.bug "x86Simplify.PeeholeBlock: elimCMP0:src" val statements = List.fold(start, (Assembly.instruction_test {src1 = src, src2 = src, size = size}):: comments, op ::) val transfer = Transfer.Iff {condition = condition, truee = truee, falsee = falsee} in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimCMP0" val (callback,elimCMP0_msg) = make_callback_msg "elimCMP0" in val elimCMP0 : optimization = {template = template, rewriter = rewriter, callback = callback} val elimCMP0_msg = elimCMP0_msg end local val isInstructionAL_setZF = fn Assembly.Instruction (Instruction.BinAL _) => true | Assembly.Instruction (Instruction.UnAL {oper, ...}) => (case oper of Instruction.NOT => false | _ => true) | Assembly.Instruction (Instruction.SRAL {oper, ...}) => (case oper of Instruction.ROL => false | Instruction.RCL => false | Instruction.ROR => false | Instruction.RCR => false | _ => true) | _ => false val isInstructionTEST_eqSrcs = fn Assembly.Instruction (Instruction.TEST {src1, src2, ...}) => Operand.eq(src1, src2) | _ => false val isTransfer_Iff_Z_NZ = fn Transfer.Iff {condition, ...} => condition = Instruction.Z orelse condition = Instruction.NZ | _ => false val template = {start = EmptyOrNonEmpty, statements = [One isInstructionAL_setZF, All isComment, One isInstructionTEST_eqSrcs, All isComment], finish = Empty, transfer = isTransfer_Iff_Z_NZ} val rewriter = fn {entry, profileLabel, start, statements = [[Assembly.Instruction instruction], comments1, [Assembly.Instruction (Instruction.TEST {src1, ...})], comments2], finish = [], transfer as Transfer.Iff {...}} => let val dst = case instruction of Instruction.BinAL {dst, ...} => dst | Instruction.UnAL {dst, ...} => dst | Instruction.SRAL {dst, ...} => dst | _ => Error.bug "x86Simplify.PeeholeBlock: elimALTEST:dst" in if Operand.eq(dst,src1) then let val statements = List.fold (start, (Assembly.instruction instruction):: (List.concat [comments1, comments2]), op ::) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE end | _ => Error.bug "x86Simplify.PeeholeBlock: elimALTEST" val (callback,elimALTEST_msg) = make_callback_msg "elimALTEST" in val elimALTEST : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALTEST_msg = elimALTEST_msg end local val optimizations_pre = commuteBinALMD:: (* elimBinAL0L:: *) (* elimBinAL0R:: *) elimAddSub1:: elimMDPow2:: elimCMPTEST:: nil val optimizations_pre_msg = commuteBinALMD_msg:: (* elimBinAL0L_msg:: *) (* elimBinAL0R_msg:: *) elimAddSub1_msg:: elimMDPow2_msg:: nil val optimizations_post = elimBinALMDDouble:: elimFltBinADouble:: elimCMPTEST:: elimCMP0:: elimALTEST:: nil val optimizations_post_msg = elimBinALMDDouble_msg:: elimFltBinADouble_msg:: elimCMPTEST_msg:: elimCMP0_msg:: elimALTEST_msg:: nil in val peepholeBlock_pre = fn block => (peepholeBlock {optimizations = optimizations_pre, block = block}) val (peepholeBlock_pre, peepholeBlock_pre_msg) = tracer "peepholeBlock_pre" peepholeBlock_pre val peepholeBlock_pre_msg = fn () => (peepholeBlock_pre_msg (); Control.indent (); List.foreach(optimizations_pre_msg, fn msg => msg ()); Control.unindent ()) val peepholeBlock_post = fn block => (peepholeBlock {optimizations = optimizations_post, block = block}) val (peepholeBlock_post, peepholeBlock_post_msg) = tracer "peepholeBlock_post" peepholeBlock_post val peepholeBlock_post_msg = fn () => (peepholeBlock_post_msg (); Control.indent (); List.foreach(optimizations_post_msg, fn msg => msg ()); Control.unindent ()) end val (callback_elimIff,elimIff_msg) = make_callback_msg "elimIff" fun makeElimIff {jumpInfo : x86JumpInfo.t} : optimization = let val isTransferIff_eqTargets = fn Transfer.Iff {truee, falsee, ...} => Label.equals(truee, falsee) | _ => false val template = {start = EmptyOrNonEmpty, statements = [], finish = Empty, transfer = isTransferIff_eqTargets} val rewriter = fn {entry, profileLabel, start, statements = [], finish = [], transfer = Transfer.Iff {truee, falsee, ...}} => let val _ = x86JumpInfo.decNear(jumpInfo, falsee) val statements = List.fold(start, [], op ::) val transfer = Transfer.goto {target = truee} in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimIff" in {template = template, rewriter = rewriter, callback = callback_elimIff} end val (callback_elimSwitchTest,elimSwitchTest_msg) = make_callback_msg "elimSwitchTest" fun makeElimSwitchTest {jumpInfo : x86JumpInfo.t} : optimization = let val isTransferSwitch_testImmediateEval = fn Transfer.Switch {test = Operand.Immediate immediate, ...} => isSome (Immediate.eval immediate) | _ => false val template = {start = Empty, statements = [All (fn _ => true)], finish = Empty, transfer = isTransferSwitch_testImmediateEval} val rewriter = fn {entry, profileLabel, start = [], statements = [statements'], finish = [], transfer = Transfer.Switch {test = Operand.Immediate immediate, cases, default}} => let val statements = statements' val test = valOf (Immediate.eval immediate) val cases = Transfer.Cases.keepAll (cases, fn (w,target) => (x86JumpInfo.decNear(jumpInfo, target); WordX.equals (w, test))) val transfer = if Transfer.Cases.isEmpty cases then Transfer.goto {target = default} else if Transfer.Cases.isSingle cases then let val _ = x86JumpInfo.decNear (jumpInfo, default) val target = Transfer.Cases.extract (cases, #2) val _ = x86JumpInfo.incNear (jumpInfo, target) in Transfer.goto {target = target} end else Error.bug "x86Simplify.PeeholeBlock: elimSwitchTest:transfer" in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimSwitchTest" in {template = template, rewriter = rewriter, callback = callback_elimSwitchTest} end val (callback_elimSwitchCases,elimSwitchCases_msg) = make_callback_msg "elimSwitchCases" fun makeElimSwitchCases {jumpInfo : x86JumpInfo.t} : optimization = let val isTransferSwitch_casesDefault = fn Transfer.Switch {cases, default, ...} => let val n = Transfer.Cases.count (cases, fn target => Label.equals(target, default)) in n > 0 end | _ => false val template = {start = Empty, statements = [All (fn _ => true)], finish = Empty, transfer = isTransferSwitch_casesDefault} val rewriter = fn {entry, profileLabel, start = [], statements = [statements'], finish = [], transfer = Transfer.Switch {test, cases, default}} => let val statements = statements' val cases = Transfer.Cases.keepAll (cases, fn (_,target) => if Label.equals(target, default) then (x86JumpInfo.decNear (jumpInfo, target); false) else true) val (statements, transfer) = if Transfer.Cases.isEmpty cases then (statements, Transfer.goto {target = default}) else if Transfer.Cases.isSingle cases then let val (k,target) = Transfer.Cases.extract (cases, fn (w,target) => (Immediate.word w, target)) val size = case Operand.size test of SOME size => size | NONE => Size.LONG in (List.concat [statements, [Assembly.instruction_cmp {src1 = test, src2 = Operand.immediate k, size = size}]], Transfer.iff {condition = Instruction.E, truee = target, falsee = default}) end else (statements, Transfer.switch {test = test, cases = cases, default = default}) in SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimSwitchCases" in {template = template, rewriter = rewriter, callback = callback_elimSwitchCases} end end structure ElimGoto = struct fun elimSimpleGoto {chunk = Chunk.T {data, blocks, ...}, delProfileLabel : x86.ProfileLabel.t -> unit, jumpInfo : x86JumpInfo.t} = let val {get: Label.t -> Label.t option, set: Label.t * Label.t option -> unit, destroy} = Property.destGetSet(Label.plist, Property.initConst NONE) val changed = ref false val labels = List.keepAllMap (blocks, fn Block.T {entry = Entry.Jump {label}, profileLabel, statements, transfer = Transfer.Goto {target}} => if List.forall(statements, fn Assembly.Comment _ => true | _ => false) (* andalso not (Label.equals(label, target)) *) then (Option.app(profileLabel, delProfileLabel); set(label, SOME target); SOME label) else NONE | _ => NONE) fun loop () = if List.fold(labels, false, fn (label,b) => case get label of NONE => b | SOME target => (case get target of NONE => b | SOME target' => if Label.equals(label, target') then (set(label, NONE); b) else (set(label, SOME target'); true))) then loop () else () val _ = loop () fun update target = case get target of SOME target' => (changed := true; x86JumpInfo.decNear(jumpInfo, target); x86JumpInfo.incNear(jumpInfo, target'); target') | NONE => target val elimSimpleGoto' = fn Transfer.Goto {target} => Transfer.Goto {target = update target} | Transfer.Iff {condition, truee, falsee} => Transfer.Iff {condition = condition, truee = update truee, falsee = update falsee} | Transfer.Switch {test, cases, default} => Transfer.Switch {test = test, cases = Transfer.Cases.map (cases, update o #2), default = update default} | transfer => transfer val blocks = List.map (blocks, fn Block.T {entry, profileLabel, statements, transfer} => Block.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = elimSimpleGoto' transfer}) val blocks = List.removeAll (blocks, fn Block.T {entry,...} => (case get (Entry.label entry) of SOME label' => (changed := true; x86JumpInfo.decNear(jumpInfo, label'); true) | NONE => false)) val _ = destroy () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimSimpleGoto,elimSimpleGoto_msg) = tracer "elimSimpleGoto" elimSimpleGoto fun elimComplexGoto {chunk = Chunk.T {data, blocks, ...}, jumpInfo : x86JumpInfo.t} = let datatype z = datatype x86JumpInfo.status val {get: Label.t -> Block.t option, set: Label.t * Block.t option -> unit, destroy} = Property.destGetSet(Label.plist, Property.initConst NONE) val labels = List.keepAllMap (blocks, fn block as Block.T {entry = Entry.Jump {label},...} => if x86JumpInfo.getNear(jumpInfo, label) = Count 1 then (set(label, SOME block); SOME label) else NONE | _ => NONE) fun loop () = if List.fold (labels, false, fn (label,b) => case get label of SOME (Block.T {entry, profileLabel, statements, transfer = Transfer.Goto {target}}) => (if Label.equals(label,target) then b else (case get target of NONE => b | SOME (Block.T {entry = entry', profileLabel = profileLabel', statements = statements', transfer = transfer'}) => (set(label, SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.concat [statements, [Assembly.Label (Entry.label entry')], ProfileLabel.toAssemblyOpt profileLabel', statements'], transfer = transfer'})); true))) | _ => b) then loop () else () val _ = loop () val changed = ref false val elimComplexGoto' = fn block as Block.T {entry, profileLabel, statements, transfer = Transfer.Goto {target}} => if Label.equals(Entry.label entry,target) then block else (case get target of NONE => block | SOME (Block.T {entry = entry', profileLabel = profileLabel', statements = statements', transfer = transfer'}) => let val _ = changed := true val _ = x86JumpInfo.decNear (jumpInfo, Entry.label entry') val _ = List.foreach (Transfer.nearTargets transfer', fn target => x86JumpInfo.incNear (jumpInfo, target)) val block = Block.T {entry = entry, profileLabel = profileLabel, statements = List.concat [statements, [Assembly.label (Entry.label entry')], ProfileLabel.toAssemblyOpt profileLabel', statements'], transfer = transfer'} in block end) | block => block val blocks = List.map(blocks, elimComplexGoto') val _ = destroy () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimComplexGoto, elimComplexGoto_msg) = tracer "elimComplexGoto" elimComplexGoto fun elimBlocks {chunk = Chunk.T {data, blocks, ...}, jumpInfo : x86JumpInfo.t} = let val {get = getIsBlock, set = setIsBlock, destroy = destroyIsBlock} = Property.destGetSetOnce (Label.plist, Property.initConst false) val {get: Label.t -> {block: Block.t, reach: bool ref}, set, destroy} = Property.destGetSetOnce (Label.plist, Property.initRaise ("gotoInfo", Label.layout)) val (labels, funcs) = List.fold (blocks, ([], []), fn (block as Block.T {entry, ...}, (labels, funcs)) => let val label = Entry.label entry in setIsBlock(label, true); set(label, {block = block, reach = ref false}) ; case entry of Entry.Func _ => (label::labels, label::funcs) | _ => (label::labels, funcs) end) fun loop label = let val {block = Block.T {transfer, ...}, reach} = get label in if !reach then () else (reach := true ; List.foreach (Transfer.nearTargets transfer, loop)) end val _ = List.foreach (funcs, loop) fun check oper = case (Operand.deImmediate oper, Operand.deLabel oper) of (SOME immediate, _) => (case Immediate.deLabel immediate of SOME label => if getIsBlock label then ! (#reach (get label)) else true | NONE => true) | (_, SOME label) => if getIsBlock label then ! (#reach (get label)) else true | _ => true val changed = ref false val blocks = List.keepAllMap (labels, fn label => let val {block = Block.T {entry, profileLabel, statements, transfer}, reach} = get label in if !reach then SOME (Block.T {entry = entry, profileLabel = profileLabel, statements = List.keepAll (statements, fn Assembly.Instruction i => (case #srcs (Instruction.srcs_dsts i) of NONE => true | SOME srcs => List.forall(srcs, check)) | _ => true), transfer = transfer}) else (changed := true ; List.foreach (Transfer.nearTargets transfer, fn label => x86JumpInfo.decNear (jumpInfo, label)); NONE) end) val _ = destroy () val _ = destroyIsBlock () in {chunk = Chunk.T {data = data, blocks = blocks}, changed = !changed} end val (elimBlocks, elimBlocks_msg) = tracer "elimBlocks" elimBlocks fun elimGoto {chunk : Chunk.t, delProfileLabel: x86.ProfileLabel.t -> unit, jumpInfo : x86JumpInfo.t} = let val elimIff = PeepholeBlock.makeElimIff {jumpInfo = jumpInfo} val elimSwitchTest = PeepholeBlock.makeElimSwitchTest {jumpInfo = jumpInfo} val elimSwitchCases = PeepholeBlock.makeElimSwitchCases {jumpInfo = jumpInfo} fun loop {chunk, changed} = let val {chunk, changed = changed_elimSimpleGoto} = elimSimpleGoto {chunk = chunk, delProfileLabel = delProfileLabel, jumpInfo = jumpInfo} val Chunk.T {data, blocks, ...} = chunk val {blocks, changed = changed_peepholeBlocks} = PeepholeBlock.peepholeBlocks {blocks = blocks, optimizations = [elimIff, elimSwitchTest, elimSwitchCases]} val chunk = Chunk.T {data = data, blocks = blocks} in if changed_elimSimpleGoto orelse changed_peepholeBlocks then loop {chunk = chunk, changed = true} else {chunk = chunk, changed = changed} end val {chunk, changed = changed_loop} = loop {chunk = chunk, changed = false} val {chunk, changed = changed_elimComplexGoto} = elimComplexGoto {chunk = chunk, jumpInfo = jumpInfo} val {chunk, changed = changed_elimBlocks} = elimBlocks {chunk = chunk, jumpInfo = jumpInfo} in {chunk = chunk, changed = changed_loop orelse changed_elimComplexGoto orelse changed_elimBlocks} end val (elimGoto, elimGoto_msg) = tracer "elimGoto" elimGoto val elimGoto_msg = fn () => (elimGoto_msg (); Control.indent (); PeepholeBlock.elimIff_msg (); PeepholeBlock.elimSwitchTest_msg (); PeepholeBlock.elimSwitchCases_msg (); elimSimpleGoto_msg (); elimComplexGoto_msg (); elimBlocks_msg (); Control.unindent ()) end structure MoveHoistLivenessBlock = struct structure LiveSet = x86Liveness.LiveSet structure Liveness = x86Liveness.Liveness structure LivenessBlock = x86Liveness.LivenessBlock fun moveHoist {block = LivenessBlock.T {entry, profileLabel, statements, transfer}} = let val {transfer,live} = LivenessBlock.reLivenessTransfer {transfer = transfer} val {statements, changed, moves, live} = List.foldr (statements, {statements = [], changed = false, moves = [], live = live}, fn ((asm: Assembly.t, Liveness.T {dead,...}), {statements: (Assembly.t * Liveness.t) list, changed : bool, moves, live: x86Liveness.LiveSet.t}) => let fun default () = let val {uses,defs,...} = Assembly.uses_defs_kills asm val baseUses = List.fold (uses, [], fn (operand,baseUses) => case Operand.deMemloc operand of SOME memloc => if List.contains (baseUses, memloc, MemLoc.eq) then baseUses else memloc::baseUses | NONE => baseUses) val baseDefs = List.fold (defs, [], fn (operand,baseDefs) => case Operand.deMemloc operand of SOME memloc => if List.contains (baseDefs, memloc, MemLoc.eq) then baseDefs else memloc::baseDefs | NONE => baseDefs) val allUses = let fun doit(memlocs,allUses) = List.fold (memlocs, allUses, fn (memloc,allUses) => List.fold (MemLoc.utilized memloc, allUses, fn (memloc,allUses) => if List.contains (allUses, memloc, MemLoc.eq) then allUses else memloc::allUses)) in doit(baseDefs, doit(baseUses, baseUses)) end val allDefs = baseDefs val {forces, moves, ...} = List.fold (moves, {forces = [], moves = [], allUses = allUses, allDefs = allDefs}, fn (move as {src,dst,...}, {forces, moves, allUses, allDefs}) => let val utilized_src = MemLoc.utilized src val utilized_dst = MemLoc.utilized dst in if List.exists (allDefs, fn memloc' => List.exists (src::utilized_src, fn memloc'' => MemLoc.mayAlias (memloc', memloc''))) orelse List.exists (allDefs, fn memloc' => List.exists (dst::utilized_dst, fn memloc'' => MemLoc.mayAlias (memloc', memloc''))) orelse List.exists (allUses, fn memloc' => MemLoc.mayAlias (memloc',dst) orelse MemLoc.mayAlias (memloc',src)) then {forces = move::forces, moves = moves, allUses = src::(List.concat [utilized_src, utilized_dst, allUses]), allDefs = dst::allDefs} else {forces = forces, moves = move::moves, allUses = allUses, allDefs = allDefs} end) val moves = List.revMap (moves, fn {src,dst,size,age} => {src = src, dst = dst, size = size, age = age + 1}) val statements_forces = List.revMap (forces, fn {src,dst,size,...} => (case Size.class size of Size.INT => Assembly.instruction_mov {src = Operand.memloc src, dst = Operand.memloc dst, size = size} | _ => Assembly.instruction_pfmov {src = Operand.memloc src, dst = Operand.memloc dst, size = size})) val {statements = statements_asm_forces, live} = LivenessBlock.toLivenessStatements {statements = asm::statements_forces, live = live} in {statements = List.concat [statements_asm_forces, statements], changed = changed orelse List.exists(forces, fn {age,...} => age <> 0), moves = moves, live = live} end in case asm of Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc_src, dst = Operand.MemLoc memloc_dst, size}) => if LiveSet.contains(dead, memloc_src) orelse List.exists(moves, fn {src,...} => MemLoc.eq(memloc_src,src)) then {statements = statements, changed = changed, moves = {src = memloc_src, dst = memloc_dst, size = size, age = 0}::moves, live = live} else default () | Assembly.Instruction (Instruction.pFMOV {src = Operand.MemLoc memloc_src, dst = Operand.MemLoc memloc_dst, size}) => if LiveSet.contains(dead, memloc_src) orelse List.exists(moves, fn {src,...} => MemLoc.eq(memloc_src,src)) then {statements = statements, changed = changed, moves = {src = memloc_src, dst = memloc_dst, size = size, age = 0}::moves, live = live} else default () | _ => default () end) val forces = moves val statements_forces = List.map (forces, fn {src,dst,size,...} => (case Size.class size of Size.INT => Assembly.instruction_mov {src = Operand.memloc src, dst = Operand.memloc dst, size = size} | _ => Assembly.instruction_pfmov {src = Operand.memloc src, dst = Operand.memloc dst, size = size})) val {statements = statements_forces, ...} = LivenessBlock.toLivenessStatements {statements = statements_forces, live = live} val statements = List.concat [statements_forces, statements] val changed = changed orelse List.exists(forces, fn {age,...} => age <> 0) val block = LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer} in {block = block, changed = changed} end val moveHoist = fn {block} => (moveHoist {block = block}) val (moveHoist: {block: LivenessBlock.t} -> {block: LivenessBlock.t, changed: bool}, moveHoist_msg) = tracer "moveHoist" moveHoist end structure CopyPropagateLivenessBlock = struct structure LiveSet = x86Liveness.LiveSet structure LiveInfo = x86Liveness.LiveInfo structure Liveness = x86Liveness.Liveness structure LivenessBlock = x86Liveness.LivenessBlock fun copyPropagate' {src, dst as Operand.MemLoc memloc_dst, pblock = {statements, transfer}, liveInfo} = let val changed = ref 0 val (all,replacer) = case src of Operand.MemLoc memloc_src => let val all = let fun doit (memlocs, all) = List.fold (memlocs, all, fn (memloc,all) => if List.contains(all, memloc, MemLoc.eq) then all else memloc::all) in doit(memloc_dst::(MemLoc.utilized memloc_dst), doit(memloc_src::(MemLoc.utilized memloc_src), [])) end fun replacer' memloc = if MemLoc.eq(memloc,memloc_dst) then (changed := !changed + 1; memloc_src) else memloc val replacer = fn {use,def} => fn operand => case Operand.deMemloc operand of SOME memloc => if (use andalso not def) orelse (not (MemLoc.eq(memloc, memloc_dst))) then Operand.memloc (MemLoc.replace replacer' memloc) else operand | _ => operand in (all, replacer) end | _ => let val all = let fun doit (memlocs, all) = List.fold (memlocs, all, fn (memloc,all) => if List.contains(all, memloc, MemLoc.eq) then all else memloc::all) in doit(memloc_dst::(MemLoc.utilized memloc_dst), []) end val replacer = fn {use,def} => fn operand => if use andalso not def then if Operand.eq(operand,dst) then (changed := !changed + 1; src) else operand else operand in (all, replacer) end val (transfer,_) = transfer fun doit (statements : (Assembly.t * Liveness.t) list) = let fun uses_defs {uses, defs} = let local fun doit operands = List.fold (operands, [], fn (operand,memlocs) => case Operand.deMemloc operand of SOME memloc => if List.contains(memlocs, memloc, MemLoc.eq) then memlocs else memloc::memlocs | NONE => memlocs) fun doit'(memlocs,uses) = List.fold (memlocs, uses, fn (memloc,uses) => if List.contains(uses, memloc, MemLoc.eq) then uses else memloc::uses) fun doit''(memlocs,uses) = List.fold (memlocs, uses, fn (memloc,uses) => doit'(MemLoc.utilized memloc, uses)) in val uses = doit uses val defs = doit defs val uses = doit''(defs, doit''(uses, uses)) end in {uses = uses, defs = defs} end in case statements of [] => let val transfer = Transfer.replace replacer transfer val {uses,defs,...} = Transfer.uses_defs_kills transfer val {uses, defs} = uses_defs {uses = uses, defs = defs} in if not (List.contains(uses, memloc_dst, MemLoc.eq)) andalso not (MemLocSet.contains(Transfer.live transfer, memloc_dst)) then if List.forall (all, fn memloc => List.forall (defs, fn memloc' => not (MemLoc.mayAlias(memloc, memloc')))) then SOME {statements = [], transfer = transfer} else NONE else NONE end | (asm, Liveness.T {dead, ...}) :: statements => let val asm = Assembly.replace replacer asm val {uses,defs,...} = Assembly.uses_defs_kills asm val {uses, defs} = uses_defs {uses = uses, defs = defs} in if not (List.contains(uses, memloc_dst, MemLoc.eq)) then if LiveSet.contains(dead,memloc_dst) then let val statements = List.map (statements, #1) in SOME {statements = asm::statements, transfer = transfer} end else if List.forall (all, fn memloc => List.forall (defs, fn memloc' => not (MemLoc.mayAlias(memloc, memloc')))) then case doit statements of NONE => NONE | SOME {statements, transfer} => SOME {statements = asm::statements, transfer = transfer} else NONE else NONE end end in case doit statements of NONE => NONE | SOME {statements, transfer} => let val {transfer, live} = LivenessBlock.toLivenessTransfer {transfer = transfer, liveInfo = liveInfo} val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = live} in SOME {pblock = {statements = statements, transfer = transfer}, changed = !changed > 0} end end | copyPropagate' _ = Error.bug "x86Simplify.PeeholeBlock: copyPropagate'" fun copyPropagate {block = LivenessBlock.T {entry, profileLabel, statements, transfer}, liveInfo} = let val {pblock = {statements,transfer},changed} = List.foldr (statements, {pblock = {statements = [], transfer = transfer}, changed = false}, fn ((asm as Assembly.Instruction (Instruction.MOV {src, dst as Operand.MemLoc memloc_dst, ...}), info: Liveness.t), {pblock as {statements, transfer}, changed}) => let val pblock' = {statements = (asm,info)::statements, transfer = transfer} in if x86Liveness.track memloc_dst andalso (List.fold (statements, false, fn ((_, Liveness.T {dead,...}),b) => b orelse LiveSet.contains(dead,memloc_dst)) orelse LiveSet.contains(Liveness.dead(#2(transfer)),memloc_dst)) then case copyPropagate' {src = src, dst = dst, pblock = pblock, liveInfo = liveInfo} of NONE => {pblock = pblock', changed = changed} | SOME {pblock, changed = changed'} => {pblock = pblock, changed = changed orelse changed'} else {pblock = pblock', changed = changed} end | ((asm as Assembly.Instruction (Instruction.pFMOV {src, dst as Operand.MemLoc memloc_dst, ...}), info), {pblock as {statements, transfer}, changed}) => let val pblock' = {statements = (asm,info)::statements, transfer = transfer} in if x86Liveness.track memloc_dst andalso (List.fold (statements, false, fn ((_, Liveness.T {dead,...}),b) => b orelse LiveSet.contains(dead,memloc_dst)) orelse LiveSet.contains(Liveness.dead (#2 transfer), memloc_dst)) then case copyPropagate' {src = src, dst = dst, pblock = pblock, liveInfo = liveInfo} of NONE => {pblock = pblock', changed = changed} | SOME {pblock, changed = changed'} => {pblock = pblock, changed = changed orelse changed'} else {pblock = pblock', changed = changed} end | ((asm,info), {pblock = {statements, transfer}, changed}) => {pblock = {statements = (asm,info)::statements, transfer = transfer}, changed = changed}) in {block = LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}, changed = changed} end val copyPropagate = fn {block, liveInfo} => (copyPropagate {block = block, liveInfo = liveInfo}) val (copyPropagate : {block: LivenessBlock.t, liveInfo: LiveInfo.t} -> {block: LivenessBlock.t, changed: bool}, copyPropagate_msg) = tracer "copyPropagate" copyPropagate val copyPropagate = fn arg as {block as LivenessBlock.T {statements, ...}, ...} => if List.length statements <= !Control.Native.copyPropCutoff then copyPropagate arg else {block = block, changed = false} end structure PeepholeLivenessBlock = struct structure LiveSet = x86Liveness.LiveSet structure Liveness = x86Liveness.Liveness structure LivenessBlock = x86Liveness.LivenessBlock structure Peephole = Peephole(type entry_type = Entry.t * Liveness.t type profileLabel_type = ProfileLabel.t option type statement_type = Assembly.t * Liveness.t type transfer_type = Transfer.t * Liveness.t datatype block = datatype LivenessBlock.t) open Peephole fun make_callback_msg name = let val count = ref 0 val total = ref 0 val callback = fn true => (Int.inc count; Int.inc total) | false => Int.inc total val msg = fn () => Control.messageStr (Control.Detail, concat [name, ": ", Int.toString (!count), " / ", Int.toString (!total)]) in (callback,msg) end val isComment : statement_type -> bool = fn (Assembly.Comment _, _) => true | _ => false local val isInstruction_dstsTemp_dstsDead : statement_type -> bool = fn (Assembly.Instruction instruction, Liveness.T {dead,...}) => let val {dsts,...} = Instruction.srcs_dsts instruction in case dsts of NONE => false | SOME dsts => List.forall (dsts, fn Operand.MemLoc memloc => x86Liveness.track memloc andalso LiveSet.contains(dead,memloc) | _ => false) end | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstruction_dstsTemp_dstsDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction _, Liveness.T {liveOut,...})]], finish, transfer} => if (case List.fold (finish, (false, false), fn ((asm, _), (b, b')) => case asm of Assembly.Comment _ => (b, b') | Assembly.Instruction (Instruction.SETcc _) => (true, if b then b' else true) | _ => (true, b')) of (_, true) => true | (false, _) => (case #1 transfer of Transfer.Iff _ => true | _ => false) | _ => false) then NONE else let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimDeadDsts" val (callback,elimDeadDsts_msg) = make_callback_msg "elimDeadDsts" in val elimDeadDsts : optimization = {template = template, rewriter = rewriter, callback = callback} val elimDeadDsts_msg = elimDeadDsts_msg end local val isInstructionMOV_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | _ => false val isInstructionAL_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pMD {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.SRAL {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | _ => false val isInstructionMOV_srcTemp_srcDead : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc,...}), Liveness.T {dead,...}) => x86Liveness.track memloc andalso LiveSet.contains(dead, memloc) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_dstTemp, All (fn asm => (isComment asm) orelse (isInstructionAL_dstTemp asm)), One isInstructionMOV_srcTemp_srcDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc1, size = size1}), _)], statements', [(Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc2, dst = dst2, size = size2}), Liveness.T {liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso MemLoc.eq(memloc1,memloc2) andalso List.forall (statements', fn (Assembly.Comment _, _) => true | (Assembly.Instruction (Instruction.BinAL {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.pMD {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.IMUL2 {src, dst = Operand.MemLoc memloc, size}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.UnAL {dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | (Assembly.Instruction (Instruction.SRAL {count, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (count,dst2) of (Operand.MemLoc memloc_count, Operand.MemLoc memloc_dst2) => List.forall (memloc_count::(MemLoc.utilized memloc_count), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | _ => Error.bug "x86Simplify.PeeholeBlock: elimALCopy") then let val statements = List.map (statements', fn (asm,_) => Assembly.replace (fn {...} => fn operand => if Operand.eq(operand,dst1) then dst2 else operand) asm) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = (Assembly.instruction_mov {src = src1, dst = dst2, size = size1})::statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: elimALCopy" val (callback,elimALCopy_msg) = make_callback_msg "elimALCopy" in val elimALCopy : optimization = {template = template, rewriter = rewriter, callback = callback} val elimALCopy_msg = elimALCopy_msg end local val isInstructionMOV_eqSrcDst : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc memloc1, src = Operand.MemLoc memloc2,...}), _) => MemLoc.eq(memloc1,memloc2) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_eqSrcDst], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = Operand.MemLoc memloc, ...}), Liveness.T {liveOut,...})]], finish, transfer} => if List.exists (MemLoc.utilized memloc, x86Liveness.track) then let val {statements, live} = LivenessBlock.reLivenessStatements {statements = List.rev start, live = liveOut} val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} val statements = List.concat [statements, finish] in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else let val statements = List.fold(start, finish, op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimSelfMove" val (callback,elimSelfMove_msg) = make_callback_msg "elimSelfMove" in val elimSelfMove : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSelfMove_msg = elimSelfMove_msg end local val isInstructionMOV_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.MOV {dst = Operand.MemLoc _,...}), _) => true | _ => false val isInstructionBinALMD_dstMemloc_operCommute : statement_type -> bool = fn (Assembly.Instruction (Instruction.BinAL {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.ADD) orelse (oper = Instruction.ADC) orelse (oper = Instruction.AND) orelse (oper = Instruction.OR) orelse (oper = Instruction.XOR) | (Assembly.Instruction (Instruction.pMD {oper, dst = Operand.MemLoc _,...}), _) => (oper = Instruction.IMUL) orelse (oper = Instruction.MUL) | (Assembly.Instruction (Instruction.IMUL2 {dst = Operand.MemLoc _,...}), _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionMOV_dstMemloc, All isComment, One isInstructionBinALMD_dstMemloc_operCommute], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.BinAL {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2, ...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_binal {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.pMD {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_pmd {oper = oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.MOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.IMUL2 {src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1,src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_mov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_imul2 {src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: commuteBinALMD" val (callback,commuteBinALMD_msg) = make_callback_msg "commuteBinALMD" in val commuteBinALMD : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteBinALMD_msg = commuteBinALMD_msg end local val isInstructionFMOV_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFMOV {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | _ => false val isInstructionFltA_dstTemp : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFBinA {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pFUnA {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pFPTAN {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pFBinAS {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | (Assembly.Instruction (Instruction.pFBinASP {dst = Operand.MemLoc memloc,...}), _) => x86Liveness.track memloc | _ => false val isInstructionFMOV_srcTemp_srcDead : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFMOV {src = Operand.MemLoc memloc,...}), Liveness.T {dead,...}) => x86Liveness.track memloc andalso LiveSet.contains(dead, memloc) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionFMOV_dstTemp, All (fn asm => (isComment asm) orelse (isInstructionFltA_dstTemp asm)), One isInstructionFMOV_srcTemp_srcDead], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1 as Operand.MemLoc memloc1, size = size1}), _)], statements', [(Assembly.Instruction (Instruction.pFMOV {src = Operand.MemLoc memloc2, dst = dst2, size = size2}), Liveness.T {liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso MemLoc.eq(memloc1,memloc2) andalso List.forall (statements', fn (Assembly.Comment _, _) => true | (Assembly.Instruction (Instruction.pFBinA {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.pFUnA {dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | (Assembly.Instruction (Instruction.pFPTAN {dst = Operand.MemLoc memloc, size}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) | (Assembly.Instruction (Instruction.pFBinAS {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | (Assembly.Instruction (Instruction.pFBinASP {src, dst = Operand.MemLoc memloc, size, ...}), _) => Size.eq(size1,size) andalso MemLoc.eq(memloc1,memloc) andalso (case (src,dst2) of (Operand.MemLoc memloc_src, Operand.MemLoc memloc_dst2) => List.forall (memloc_src::(MemLoc.utilized memloc_src), fn memloc' => not (MemLoc.mayAlias(memloc_dst2,memloc'))) | (Operand.Immediate _, _) => true | _ => false) | _ => Error.bug "x86Simplify.PeeholeBlock: elimFltACopy") then let val statements = List.map (statements', fn (asm,_) => Assembly.replace (fn {...} => fn operand => if Operand.eq(operand,dst1) then dst2 else operand) asm) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = (Assembly.instruction_pfmov {src = src1, dst = dst2, size = size1})::statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: elimFltACopy" val (callback,elimFltACopy_msg) = make_callback_msg "elimFltACopy" in val elimFltACopy : optimization = {template = template, rewriter = rewriter, callback = callback} val elimFltACopy_msg = elimFltACopy_msg end local val isInstructionFMOV_eqSrcDst : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFMOV {dst = Operand.MemLoc memloc1, src = Operand.MemLoc memloc2,...}), _) => MemLoc.eq(memloc1,memloc2) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionFMOV_eqSrcDst], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.pFMOV {...}), _)]], finish, transfer} => let val statements = List.fold (start, finish, op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end | _ => Error.bug "x86Simplify.PeeholeBlock: elimFltSelfMove" val (callback,elimFltSelfMove_msg) = make_callback_msg "elimFltSelfMove" in val elimFltSelfMove : optimization = {template = template, rewriter = rewriter, callback = callback} val elimFltSelfMove_msg = elimFltSelfMove_msg end local val isInstructionFMOV_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFMOV {dst = Operand.MemLoc _,...}), _) => true | _ => false val isInstructionFltBinA_dstMemloc : statement_type -> bool = fn (Assembly.Instruction (Instruction.pFBinA {dst = Operand.MemLoc _,...}), _) => true | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionFMOV_dstMemloc, All isComment, One isInstructionFltBinA_dstMemloc], finish = EmptyOrNonEmpty, transfer = fn _ => true} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(Assembly.Instruction (Instruction.pFMOV {src = src1, dst = dst1 as Operand.MemLoc memloc_dst1, size = size1}), Liveness.T {dead = dead1,...})], comments, [(Assembly.Instruction (Instruction.pFBinA {oper = oper2, src = src2, dst = dst2 as Operand.MemLoc _, size = size2}), Liveness.T {dead = dead2, liveOut = liveOut2,...})]], finish, transfer} => if Size.eq(size1,size2) andalso Operand.eq(dst1,dst2) andalso not (Operand.eq(src1, src2)) andalso (case (src1,src2) of (Operand.MemLoc memloc_src1, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) andalso not (LiveSet.contains(dead1, memloc_src1)) | (_, Operand.MemLoc memloc_src2) => LiveSet.contains(dead2, memloc_src2) | _ => false) andalso (case src1 of Operand.MemLoc memloc_src1 => not (List.exists (memloc_src1::(MemLoc.utilized memloc_src1), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) andalso (case src2 of Operand.MemLoc memloc_src2 => not (List.exists (memloc_src2::(MemLoc.utilized memloc_src2), fn memloc' => MemLoc.mayAlias(memloc',memloc_dst1))) | _ => true) then let val statements = (Assembly.instruction_pfmov {src = src2, dst = dst1, size = size1}):: (List.concat [List.map(comments, #1), [Assembly.instruction_pfbina {oper = Instruction.fbina_reverse oper2, src = src1, dst = dst2, size = size2}]]) val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = liveOut2} val statements = List.fold(start, List.concat [statements, finish], op ::) in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: commuteFltBinA" val (callback,commuteFltBinA_msg) = make_callback_msg "commuteFltBinA" in val commuteFltBinA : optimization = {template = template, rewriter = rewriter, callback = callback} val commuteFltBinA_msg = commuteFltBinA_msg end local val isInstructionSETcc : statement_type -> bool = fn (Assembly.Instruction (Instruction.SETcc {...}), _) => true | _ => false val isInstructionTEST_eqSrcs : statement_type -> bool = fn (Assembly.Instruction (Instruction.TEST {src1 = Operand.MemLoc memloc1, src2 = Operand.MemLoc memloc2,...}), Liveness.T {...}) => MemLoc.eq(memloc1, memloc2) | _ => false val isIff_conditionZorNZ : transfer_type -> bool = fn (Transfer.Iff {condition,...}, _) => (case condition of Instruction.Z => true | Instruction.NZ => true | _ => false) | _ => false val template : template = {start = EmptyOrNonEmpty, statements = [One isInstructionSETcc, All isComment, One isInstructionTEST_eqSrcs, All isComment], finish = Empty, transfer = isIff_conditionZorNZ} val rewriter : rewriter = fn {entry, profileLabel, start, statements = [[(statement as Assembly.Instruction (Instruction.SETcc {condition = condition1, dst = Operand.MemLoc memloc1, ...}), _)], comments1, [(Assembly.Instruction (Instruction.TEST {src1 = Operand.MemLoc memloc12, ...}), Liveness.T {dead, ...})], comments2], finish = [], transfer = (Transfer.Iff {condition, truee, falsee}, infoT as _)} => if MemLoc.eq(memloc1,memloc12) then let val condition = case condition of Instruction.Z => Instruction.condition_negate condition1 | Instruction.NZ => condition1 | _ => Error.bug "x86Simplify.PeeholeBlock: conditionalJump:condition" val transfer = (Transfer.iff {condition = condition, truee = truee, falsee = falsee}, infoT) val {transfer,live} = LivenessBlock.reLivenessTransfer {transfer = transfer} val statements = List.concat [List.map(comments1, #1), List.map(comments2, #1)] val statements = if x86Liveness.track memloc1 andalso LiveSet.contains(dead, memloc1) then statements else statement::statements val {statements, ...} = LivenessBlock.toLivenessStatements {statements = statements, live = live} val statements = List.fold(start, statements, op ::) val live = case statements of (_, Liveness.T {liveIn,...})::_ => liveIn | _ => Error.bug "x86Simplify.PeeholeBlock: conditionalJump:live" val {entry, ...} = LivenessBlock.reLivenessEntry {entry = entry, live = live} in SOME (LivenessBlock.T {entry = entry, profileLabel = profileLabel, statements = statements, transfer = transfer}) end else NONE | _ => Error.bug "x86Simplify.PeeholeBlock: conditionalJump" val (callback,conditionalJump_msg) = make_callback_msg "conditionalJump" in val conditionalJump : optimization = {template = template, rewriter = rewriter, callback = callback} val conditionalJump_msg = conditionalJump_msg end local val {template, rewriter, ...} = elimDeadDsts val (callback,elimDeadDsts_minor_msg) = make_callback_msg "elimDeadDsts_minor" in val elimDeadDsts_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimDeadDsts_minor_msg = elimDeadDsts_minor_msg end local val {template, rewriter, ...} = elimSelfMove val (callback,elimSelfMove_minor_msg) = make_callback_msg "elimSelfMove_minor" in val elimSelfMove_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimSelfMove_minor_msg = elimSelfMove_minor_msg end local val {template, rewriter, ...} = elimFltSelfMove val (callback,elimFltSelfMove_minor_msg) = make_callback_msg "elimFltSelfMove_minor" in val elimFltSelfMove_minor : optimization = {template = template, rewriter = rewriter, callback = callback} val elimFltSelfMove_minor_msg = elimFltSelfMove_minor_msg end local val optimizations = elimALCopy:: elimFltACopy:: elimDeadDsts:: elimSelfMove:: elimFltSelfMove:: commuteBinALMD:: commuteFltBinA:: conditionalJump:: nil val optimizations_msg = elimALCopy_msg:: elimFltACopy_msg:: elimDeadDsts_msg:: elimSelfMove_msg:: elimFltSelfMove_msg:: commuteBinALMD_msg:: commuteFltBinA_msg:: conditionalJump_msg:: nil val optimizations_minor = elimDeadDsts_minor:: elimSelfMove_minor:: elimFltSelfMove_minor:: nil val optimizations_minor_msg = elimDeadDsts_minor_msg:: elimSelfMove_minor_msg:: elimFltSelfMove_minor_msg:: nil in val peepholeLivenessBlock = fn block => (peepholeBlock {optimizations = optimizations, block = block}) val (peepholeLivenessBlock, peepholeLivenessBlock_msg) = tracer "peepholeLivenessBlock" peepholeLivenessBlock val peepholeLivenessBlock_msg = fn () => (peepholeLivenessBlock_msg (); Control.indent (); List.foreach(optimizations_msg, fn msg => msg ()); Control.unindent ()) val peepholeLivenessBlock_minor = fn block => (peepholeBlock {optimizations = optimizations_minor, block = block}) val (peepholeLivenessBlock_minor, peepholeLivenessBlock_minor_msg) = tracer "peepholeLivenessBlock_minor" peepholeLivenessBlock_minor val peepholeLivenessBlock_minor_msg = fn () => (peepholeLivenessBlock_minor_msg (); Control.indent (); List.foreach(optimizations_minor_msg, fn msg => msg ()); Control.unindent ()) end end fun simplify {chunk : Chunk.t, optimize : int, delProfileLabel : x86.ProfileLabel.t -> unit, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t} : Chunk.t = let (* fun changedChunk_msg {chunk as Chunk.T {blocks, ...}, changed, msg} = (print ("finished " ^ msg ^ "\n")) fun changedBlock_msg {block as Block.T {entry, ...}, changed, msg} = (print ("finished " ^ msg ^ "\n")) fun changedLivenessBlock_msg {block as x86Liveness.LivenessBlock.T {entry, ...}, changed, msg} = if changed then (print ("finished " ^ msg ^ "\n")) else () *) fun changedChunk_msg {chunk = Chunk.T {blocks, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; List.foreach(blocks, fn b as Block.T {entry, ...} => (print (concat ["liveIn: ", (concat o List.separate) (List.map (x86Liveness.LiveSet.toList (x86Liveness.LiveInfo.getLive (liveInfo, Entry.label entry)), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); x86.Block.printBlock b))) fun changedBlock_msg {block as Block.T {entry, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; (print (concat ["liveIn: ", (concat o List.separate) (List.map (x86Liveness.LiveSet.toList (x86Liveness.LiveInfo.getLive (liveInfo, Entry.label entry)), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); x86.Block.printBlock block)) fun changedLivenessBlock_msg {block as x86Liveness.LivenessBlock.T {entry, ...}, changed, msg} = if not changed then () else (print (String.make (60, #"*")); print "\n"; print msg; print "\n"; (print (concat ["liveIn: ", (concat o List.separate) (List.map (x86Liveness.LiveSet.toList (x86Liveness.LiveInfo.getLive (liveInfo, Entry.label (#1 entry))), fn memloc => MemLoc.toString memloc), "\n "), "\n"]); x86Liveness.LivenessBlock.printBlock block)) val debug = false val changedChunk_msg : {chunk : Chunk.t, changed: bool, msg: string} -> unit = if debug then changedChunk_msg else (fn _ => ()) val changedBlock_msg : {block : Block.t, changed: bool, msg: string} -> unit = if debug then changedBlock_msg else (fn _ => ()) val changedLivenessBlock_msg : {block : x86Liveness.LivenessBlock.t, changed: bool, msg: string} -> unit = if debug then changedLivenessBlock_msg else (fn _ => ()) fun checkLivenessBlock {block, block', msg} = Assert.assert ("x86Simplify.checkLivenessBlock: " ^ msg, fn () => if x86Liveness.LivenessBlock.verifyLivenessBlock {block = block, liveInfo = liveInfo} then true else (print ("pre: " ^ msg); x86Liveness.LivenessBlock.printBlock block; print (String.make(60, #"*")); print ("\n"); print ("post: " ^ msg); x86Liveness.LivenessBlock.printBlock block'; print (String.make(60, #"*")); print ("\n"); false)) (*********************************************************************) (* simplify *) (*********************************************************************) val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "simplify:"} (*********************************************************************) (* completeLiveInfo *) (*********************************************************************) val _ = x86Liveness.LiveInfo.completeLiveInfo {chunk = chunk, liveInfo = liveInfo, pass = "pre"} val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "completeLiveInfo (pre):"} (*********************************************************************) (* completeJumpInfo *) (*********************************************************************) val _ = x86JumpInfo.completeJumpInfo {chunk = chunk, jumpInfo = jumpInfo} val _ = Assert.assert ("x86Simplify.verifyEntryTransfer", fn () => x86EntryTransfer.verifyEntryTransfer {chunk = chunk}) (*********************************************************************) (* optimizer *) (*********************************************************************) fun optimizer chunk = let val chunk = chunk val changed = false (**************************************************************) (* elimGoto *) (**************************************************************) val {chunk = chunk', changed = changed'} = ElimGoto.elimGoto {chunk = chunk, delProfileLabel = delProfileLabel, jumpInfo = jumpInfo} val _ = Assert.assert ("x86Simplify.verifyJumpInfo", fn () => x86JumpInfo.verifyJumpInfo {chunk = chunk', jumpInfo = jumpInfo}) val _ = Assert.assert ("x86Simplify.verifyEntryTransfer", fn () => x86EntryTransfer.verifyEntryTransfer {chunk = chunk'}) val _ = changedChunk_msg {chunk = chunk, changed = changed', msg = "ElimGoto.elimGoto:"} val chunk = chunk' val changed = changed orelse changed' (**************************************************************) (* peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate*) (**************************************************************) val Chunk.T {data, blocks} = chunk val {blocks = blocks', changed = changed'} = List.fold (blocks, {blocks = [], changed = false}, fn (block, {blocks, changed}) => let val _ = changedBlock_msg {block = block, changed = false, msg = "peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate"} (***************************************************) (* peepholeBlock_pre *) (***************************************************) val {block = block', changed = changed'} = PeepholeBlock.peepholeBlock_pre block val _ = changedBlock_msg {block = block', changed = changed', msg = "PeepholeBlock.peepholeBlock_pre"} val block = block' val changed = changed orelse changed' (***************************************************) (* toLivenessBlock *) (***************************************************) val block' = x86Liveness.LivenessBlock.toLivenessBlock {block = block, liveInfo = liveInfo} val block = block' val _ = changedLivenessBlock_msg {block = block', changed = false, msg = "x86Liveness.LivenessBlock.toLivenessBlock"} (***************************************************) (* moveHoist *) (***************************************************) val {block = block', changed = changed'} = if !Control.Native.moveHoist then MoveHoistLivenessBlock.moveHoist {block = block} else {block = block, changed = false} val _ = checkLivenessBlock {block = block, block' = block', msg = "MoveHoistLivenessBlock.moveHoist"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "MoveHoistLivenessBlock.moveHoist"} val block = block' val changed = changed orelse changed' (***************************************************) (* peepholeLivenessBlock *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock"} val block = block' val changed = changed orelse changed' (***************************************************) (* copyPropagate *) (***************************************************) val {block = block', changed = changed'} = if !Control.Native.copyProp then CopyPropagateLivenessBlock.copyPropagate {block = block, liveInfo = liveInfo} else {block = block, changed = false} val _ = checkLivenessBlock {block = block, block' = block', msg = "CopyPropagateLivenessBlock.copyPropagate"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "CopyPropagateLivenessBlock.copyPropagate"} val block = block' val changed = changed orelse changed' (***************************************************) (* peepholeLivenessBlock_minor *) (***************************************************) val {block = block', changed = changed'} = PeepholeLivenessBlock.peepholeLivenessBlock_minor block val _ = checkLivenessBlock {block = block, block' = block', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_minor"} val _ = changedLivenessBlock_msg {block = block', changed = changed', msg = "PeepholeLivenessBlock.peepholeLivenessBlock_minor"} val block = block' val changed = changed orelse changed' (***************************************************) (* toBlock *) (***************************************************) val block' = x86Liveness.LivenessBlock.toBlock {block = block} val _ = changedBlock_msg {block = block', changed = false, msg = "x86Liveness.LivenessBlock.toBlock"} val block = block' (***************************************************) (* peepholeBlock_post *) (***************************************************) val {block = block', changed = changed'} = PeepholeBlock.peepholeBlock_post block val _ = changedBlock_msg {block = block', changed = changed', msg = "PeepholeBlock.peepholeBlock_post"} val block = block' val changed = changed orelse changed' in {blocks = block::blocks, changed = changed} end) val chunk' = Chunk.T {data = data, blocks = blocks'} val _ = changedChunk_msg {chunk = chunk', changed = changed', msg = "peepholeBlock/moveHoist/peepholeLivenessBlock/copyPropagate"} val chunk = chunk' val changed = changed orelse changed' (**************************************************************) (* completeLiveInfo *) (**************************************************************) val _ = x86Liveness.LiveInfo.completeLiveInfo {chunk = chunk, liveInfo = liveInfo, pass = "post"} val _ = changedChunk_msg {chunk = chunk, changed = false, msg = "completeLiveInfo (post):"} in {chunk = chunk, changed = changed} end (*********************************************************************) (* optimizer_loop *) (*********************************************************************) fun optimizer_loop chunk = let fun loop {chunk, changed} = let val {chunk, changed = changed'} = optimizer chunk in if changed' then loop {chunk = chunk, changed = true} else {chunk = chunk, changed = changed} end val {chunk, changed} = loop {chunk = chunk, changed = false} in {chunk = chunk, changed = changed} end (*********************************************************************) (* chunk *) (*********************************************************************) val {chunk, ...} = case optimize of 0 => {chunk = chunk, changed = false} | 1 => optimizer chunk | _ => optimizer_loop chunk in chunk end val (simplify, simplify_msg) = tracerTop "simplify" simplify fun simplify_totals () = (simplify_msg (); Control.indent (); x86Liveness.LiveInfo.completeLiveInfo_msg (); x86JumpInfo.completeJumpInfo_msg (); ElimGoto.elimGoto_msg (); x86JumpInfo.verifyJumpInfo_msg (); x86EntryTransfer.verifyEntryTransfer_msg (); PeepholeBlock.peepholeBlock_pre_msg (); x86Liveness.LivenessBlock.toLivenessBlock_msg (); MoveHoistLivenessBlock.moveHoist_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_msg (); CopyPropagateLivenessBlock.copyPropagate_msg (); PeepholeLivenessBlock.peepholeLivenessBlock_minor_msg (); x86Liveness.LivenessBlock.verifyLivenessBlock_msg (); x86Liveness.LivenessBlock.toBlock_msg (); PeepholeBlock.peepholeBlock_post_msg (); Control.unindent ()) end mlton-20100608/mlton/codegen/x86-codegen/x86-simplify.sig0000644000076600000240000000171211404435625021333 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_SIMPLIFY_STRUCTS = sig structure x86 : X86 structure x86Liveness : X86_LIVENESS sharing x86 = x86Liveness.x86 structure x86JumpInfo : X86_JUMP_INFO sharing x86 = x86JumpInfo.x86 structure x86EntryTransfer : X86_ENTRY_TRANSFER sharing x86 = x86EntryTransfer.x86 end signature X86_SIMPLIFY = sig include X86_SIMPLIFY_STRUCTS val simplify : {chunk : x86.Chunk.t, optimize : int, delProfileLabel : x86.ProfileLabel.t -> unit, liveInfo : x86Liveness.LiveInfo.t, jumpInfo : x86JumpInfo.t} -> x86.Chunk.t val simplify_totals : unit -> unit end mlton-20100608/mlton/codegen/x86-codegen/x86-translate.fun0000644000076600000240000010341311404435625021503 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86Translate(S: X86_TRANSLATE_STRUCTS): X86_TRANSLATE = struct open S val tracerTop = x86.tracerTop fun argsToString(ss: string list): string = "(" ^ (concat (List.separate(ss, ", "))) ^ ")" structure Machine = x86MLton.Machine local open Machine in structure Label = Label structure Live = Live structure Register = Register structure Scale = Scale structure StackOffset = StackOffset structure Type = Type structure WordSize = WordSize structure WordX = WordX end datatype z = datatype WordSize.prim structure Global = struct open Machine.Global fun toX86Operand (g: t) : (x86.Operand.t * x86.Size.t) vector = let val ty = Machine.Type.toCType (ty g) val index = index g val base = x86.Immediate.label (if isRoot g then x86MLton.global_base ty else x86MLton.globalObjptrNonRoot_base) val origin = x86.MemLoc.imm {base = base, index = x86.Immediate.int index, scale = x86.Scale.fromCType ty, size = x86.Size.BYTE, class = x86MLton.Classes.Globals} val sizes = x86.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((x86.Operand.memloc o x86.MemLoc.shift) {origin = origin, disp = x86.Immediate.int offset, scale = x86.Scale.One, size = size}, size), offset + x86.Size.toBytes size)) end end structure Operand = struct open Machine.Operand fun get (f: ('a * 'b) -> 'c) (i: int) (v: ('a * 'b) vector) = f (Vector.sub (v, i)) fun getOp0 v = get #1 0 v val rec toX86Operand : t -> (x86.Operand.t * x86.Size.t) vector = fn ArrayOffset {base, index, offset, scale, ty} => let val base = toX86Operand base val _ = Assert.assert("x86Translate.Operand.toX86Operand: Array/base", fn () => Vector.length base = 1) val base = getOp0 base val index = toX86Operand index val _ = Assert.assert("x86Translate.Operand.toX86Operand: Array/index", fn () => Vector.length index = 1) val index = getOp0 index val scale = case scale of Scale.One => x86.Scale.One | Scale.Two => x86.Scale.Two | Scale.Four => x86.Scale.Four | Scale.Eight => x86.Scale.Eight val ty = Type.toCType ty val origin = case (x86.Operand.deMemloc base, x86.Operand.deImmediate index, x86.Operand.deMemloc index) of (SOME base, SOME index, _) => x86.MemLoc.simple {base = base, index = index, scale = scale, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | (SOME base, _, SOME index) => x86.MemLoc.complex {base = base, index = index, scale = scale, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | _ => Error.bug (concat ["x86Translate.Operand.toX86Operand: ", "strange Offset: base: ", x86.Operand.toString base, " index: ", x86.Operand.toString index]) val origin = if Bytes.isZero offset then origin else x86.MemLoc.shift {origin = origin, disp = x86.Immediate.int (Bytes.toInt offset), scale = x86.Scale.One, size = x86.Size.BYTE} val sizes = x86.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((x86.Operand.memloc o x86.MemLoc.shift) {origin = origin, disp = x86.Immediate.int offset, scale = x86.Scale.One, size = size}, size), offset + x86.Size.toBytes size)) end | Cast (z, _) => toX86Operand z | Contents {oper, ty} => let val ty = Type.toCType ty val base = toX86Operand oper val _ = Assert.assert("x86Translate.Operand.toX86Operand: Contents/base", fn () => Vector.length base = 1) val base = getOp0 base val origin = case x86.Operand.deMemloc base of SOME base => x86.MemLoc.simple {base = base, index = x86.Immediate.zero, scale = x86.Scale.One, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | _ => Error.bug (concat ["x86Translate.Operand.toX86Operand: ", "strange Contents: base: ", x86.Operand.toString base]) val sizes = x86.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((x86.Operand.memloc o x86.MemLoc.shift) {origin = origin, disp = x86.Immediate.int offset, scale = x86.Scale.One, size = size}, size), offset + x86.Size.toBytes size)) end | Frontier => let val frontier = x86MLton.gcState_frontierContentsOperand () in Vector.new1 (frontier, valOf (x86.Operand.size frontier)) end | GCState => Vector.new1 (x86.Operand.immediate_label x86MLton.gcState_label, x86MLton.pointerSize) | Global g => Global.toX86Operand g | Label l => Vector.new1 (x86.Operand.immediate_label l, x86MLton.pointerSize) | Null => Vector.new1 (x86.Operand.immediate_zero, x86MLton.wordSize) | Offset {base = GCState, offset, ty} => let val offset = Bytes.toInt offset val ty = Type.toCType ty val offset = x86MLton.gcState_offset {offset = offset, ty = ty} in Vector.new1 (offset, valOf (x86.Operand.size offset)) end | Offset {base, offset, ty} => let val offset = Bytes.toInt offset val ty = Type.toCType ty val base = toX86Operand base val _ = Assert.assert("x86Translate.Operand.toX86Operand: Offset/base", fn () => Vector.length base = 1) val base = getOp0 base val origin = case x86.Operand.deMemloc base of SOME base => x86.MemLoc.simple {base = base, index = x86.Immediate.int offset, scale = x86.Scale.One, size = x86.Size.BYTE, class = x86MLton.Classes.Heap} | _ => Error.bug (concat ["x86Translate.Operand.toX86Operand: ", "strange Offset: base: ", x86.Operand.toString base]) val sizes = x86.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((x86.Operand.memloc o x86.MemLoc.shift) {origin = origin, disp = x86.Immediate.int offset, scale = x86.Scale.One, size = size}, size), offset + x86.Size.toBytes size)) end | Real _ => Error.bug "x86Translate.Operand.toX86Operand: Real unimplemented" | Register r => let val ty = Machine.Type.toCType (Register.ty r) val index = Machine.Register.index r val base = x86.Immediate.label (x86MLton.local_base ty) val origin = x86.MemLoc.imm {base = base, index = x86.Immediate.int index, scale = x86.Scale.fromCType ty, size = x86.Size.BYTE, class = x86MLton.Classes.Locals} val sizes = x86.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((x86.Operand.memloc o x86.MemLoc.shift) {origin = origin, disp = x86.Immediate.int offset, scale = x86.Scale.One, size = size}, size), offset + x86.Size.toBytes size)) end | StackOffset (StackOffset.T {offset, ty}) => let val offset = Bytes.toInt offset val ty = Type.toCType ty val origin = x86.MemLoc.simple {base = x86MLton.gcState_stackTopContents (), index = x86.Immediate.int offset, scale = x86.Scale.One, size = x86.Size.BYTE, class = x86MLton.Classes.Stack} val sizes = x86.Size.fromCType ty in (#1 o Vector.mapAndFold) (sizes, 0, fn (size,offset) => (((x86.Operand.memloc o x86.MemLoc.shift) {origin = origin, disp = x86.Immediate.int offset, scale = x86.Scale.One, size = size}, size), offset + x86.Size.toBytes size)) end | StackTop => let val stackTop = x86MLton.gcState_stackTopContentsOperand () in Vector.new1 (stackTop, valOf (x86.Operand.size stackTop)) end | Word w => let fun single size = Vector.new1 (x86.Operand.immediate_word w, size) in case WordSize.prim (WordX.size w) of W8 => single x86.Size.BYTE | W16 => single x86.Size.WORD | W32 => single x86.Size.LONG | W64 => let val lo = WordX.resize (w, WordSize.word32) val w = WordX.rshift (w, WordX.fromIntInf (32, WordSize.word64), {signed = true}) val hi = WordX.resize (w, WordSize.word32) in Vector.new2 ((x86.Operand.immediate_word lo, x86.Size.LONG), (x86.Operand.immediate_word hi, x86.Size.LONG)) end end end type transInfo = x86MLton.transInfo structure Entry = struct structure Kind = Machine.Kind fun toX86Blocks {label, kind, transInfo as {frameInfoToX86, live, liveInfo, ...}: transInfo} = ( x86Liveness.LiveInfo.setLiveOperands (liveInfo, label, live label); case kind of Kind.Jump => let in AppendList.single (x86.Block.mkBlock' {entry = SOME (x86.Entry.jump {label = label}), statements = [], transfer = NONE}) end | Kind.Func => let val args = List.fold (live label, x86.MemLocSet.empty, fn (operand, args) => case x86.Operand.deMemloc operand of SOME memloc => x86.MemLocSet.add(args, memloc) | NONE => args) in AppendList.single (x86.Block.mkBlock' {entry = SOME (x86.Entry.func {label = label, live = args}), statements = [], transfer = NONE}) end | Kind.Cont {args, frameInfo, ...} => let val frameInfo = frameInfoToX86 frameInfo val args = Vector.fold (args, x86.MemLocSet.empty, fn (operand,args) => Vector.fold (Operand.toX86Operand (Live.toOperand operand), args, fn ((operand,_),args) => case x86.Operand.deMemloc operand of SOME memloc => x86.MemLocSet.add(args, memloc) | NONE => args)) in AppendList.single (x86.Block.mkBlock' {entry = SOME (x86.Entry.cont {label = label, live = args, frameInfo = frameInfo}), statements = [], transfer = NONE}) end | Kind.Handler {frameInfo, ...} => let in AppendList.single (x86.Block.mkBlock' {entry = SOME (x86.Entry.handler {frameInfo = frameInfoToX86 frameInfo, label = label, live = x86.MemLocSet.empty}), statements = [], transfer = NONE}) end | Kind.CReturn {dst, frameInfo, func} => let val dsts = case dst of NONE => Vector.new0 () | SOME dst => Operand.toX86Operand (Live.toOperand dst) in x86MLton.creturn {dsts = dsts, frameInfo = Option.map (frameInfo, frameInfoToX86), func = func, label = label, transInfo = transInfo} end) end structure Statement = struct open Machine.Statement fun comments statement = if !Control.Native.commented > 0 then let val comment = (Layout.toString o layout) statement in (AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment (concat ["begin: ", comment])], transfer = NONE}), AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment (concat ["end: ", comment])], transfer = NONE})) end else (AppendList.empty,AppendList.empty) fun toX86Blocks {statement, transInfo as {...} : transInfo} = (case statement of Noop => AppendList.empty | Move {src, dst} => let val (comment_begin, comment_end) = comments statement val dsts = Operand.toX86Operand dst val srcs = Operand.toX86Operand src (* Operand.toX86Operand returns multi-word * operands in and they will be moved in order, * so it suffices to check for aliasing between * the first dst and second src. *) val (dsts,srcs) = if Vector.length srcs > 1 andalso x86.Operand.mayAlias (#1 (Vector.sub (dsts, 0)), #1 (Vector.sub (srcs, 1))) then (Vector.rev dsts, Vector.rev srcs) else (dsts,srcs) in AppendList.appends [comment_begin, AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = (Vector.toList o Vector.map2) (dsts,srcs,fn ((dst,_),(src,srcsize)) => (* dst = src *) case x86.Size.class srcsize of x86.Size.INT => x86.Assembly.instruction_mov {dst = dst, src = src, size = srcsize} | x86.Size.FLT => x86.Assembly.instruction_pfmov {dst = dst, src = src, size = srcsize} | _ => Error.bug "x86Translate.Statement.toX86Blocks: Move"), transfer = NONE}), comment_end] end | PrimApp {dst, prim, args} => let val (comment_begin, comment_end) = comments statement val args = (Vector.concatV o Vector.map) (args, Operand.toX86Operand) val dsts = case dst of NONE => Vector.new0 () | SOME dst => Operand.toX86Operand dst in AppendList.appends [comment_begin, (x86MLton.prim {prim = prim, args = args, dsts = dsts, transInfo = transInfo}), comment_end] end | ProfileLabel l => AppendList.single (x86.Block.mkProfileBlock' {profileLabel = l})) end structure Transfer = struct open Machine.Transfer fun goto l = AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.goto {target = l})}) fun iff (test, a, b) = let val (test,testsize) = Vector.sub (Operand.toX86Operand test, 0) in if Label.equals(a, b) then AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.goto {target = a})}) else AppendList.single ((* if (test) goto a * goto b *) x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.instruction_test {src1 = test, src2 = test, size = testsize}], transfer = SOME (x86.Transfer.iff {condition = x86.Instruction.NZ, truee = a, falsee = b})}) end fun cmp (test, k, a, b) = let val (test,testsize) = Vector.sub (Operand.toX86Operand test, 0) in if Label.equals(a, b) then AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.goto {target = a})}) else AppendList.single ((* if (test = k) goto a * goto b *) x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.instruction_cmp {src1 = test, src2 = x86.Operand.immediate k, size = testsize}], transfer = SOME (x86.Transfer.iff {condition = x86.Instruction.E, truee = a, falsee = b})}) end fun switch(test, cases, default) = let val test = Operand.toX86Operand test val (test,_) = Vector.sub(test, 0) in AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.switch {test = test, cases = cases, default = default})}) end fun doSwitchWord (test, cases, default) = (case (cases, default) of ([], NONE) => Error.bug "x86Translate.Transfer.doSwitchWord" | ([(_,l)], NONE) => goto l | ([], SOME l) => goto l | ([(w1,l1),(w2,l2)], NONE) => if WordX.isZero w1 andalso WordX.isOne w2 then iff(test,l2,l1) else if WordX.isZero w2 andalso WordX.isOne w1 then iff(test,l1,l2) else cmp(test,x86.Immediate.word w1,l1,l2) | ([(k',l')], SOME l) => cmp(test,x86.Immediate.word k',l',l) | ((_,l)::cases, NONE) => switch(test, x86.Transfer.Cases.word cases, l) | (cases, SOME l) => switch(test, x86.Transfer.Cases.word cases, l)) fun comments transfer = if !Control.Native.commented > 0 then let val comment = (Layout.toString o layout) transfer in AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [x86.Assembly.comment comment], transfer = NONE}) end else AppendList.empty fun toX86Blocks {returns, transfer, transInfo as {frameInfoToX86, ...}: transInfo} = (case transfer of Arith {prim, args, dst, overflow, success, ...} => let val args = (Vector.concatV o Vector.map) (args, Operand.toX86Operand) val dsts = Operand.toX86Operand dst in AppendList.append (comments transfer, x86MLton.arith {prim = prim, args = args, dsts = dsts, overflow = overflow, success = success, transInfo = transInfo}) end | CCall {args, frameInfo, func, return} => let val args = (Vector.concatV o Vector.map) (args, Operand.toX86Operand) in AppendList.append (comments transfer, x86MLton.ccall {args = args, frameInfo = (Option.map (frameInfo, frameInfoToX86)), func = func, return = return, transInfo = transInfo}) end | Return => AppendList.append (comments transfer, AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.return {live = Vector.fold ((case returns of NONE => Error.bug "x86Translate.Transfer.toX86Blocsk: Return" | SOME zs => zs), x86.MemLocSet.empty, fn (operand, live) => Vector.fold (Operand.toX86Operand operand, live, fn ((operand,_),live) => case x86.Operand.deMemloc operand of SOME memloc => x86.MemLocSet.add(live, memloc) | NONE => live))})})) | Raise => AppendList.append (comments transfer, AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.raisee {live = x86.MemLocSet.add (x86.MemLocSet.add (x86.MemLocSet.empty, x86MLton.gcState_stackBottomContents ()), x86MLton.gcState_exnStackContents ())})})) | Switch (Machine.Switch.T {cases, default, test, ...}) => AppendList.append (comments transfer, doSwitchWord (test, Vector.toList cases, default)) | Goto label => (AppendList.append (comments transfer, AppendList.single ((* goto label *) x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME (x86.Transfer.goto {target = label})}))) | Call {label, live, return, ...} => let val live = Vector.fold (live, x86.MemLocSet.empty, fn (operand, live) => Vector.fold (Operand.toX86Operand (Live.toOperand operand), live, fn ((operand, _), live) => case x86.Operand.deMemloc operand of NONE => live | SOME memloc => x86.MemLocSet.add (live, memloc))) val com = comments transfer val transfer = case return of NONE => x86.Transfer.tail {target = label, live = live} | SOME {return, handler, size} => x86.Transfer.nontail {target = label, live = live, return = return, handler = handler, size = Bytes.toInt size} in AppendList.append (com, AppendList.single (x86.Block.mkBlock' {entry = NONE, statements = [], transfer = SOME transfer})) end) end structure Block = struct open Machine.Block fun toX86Blocks {block = T {label, live, kind, returns, statements, transfer, ...}, transInfo as {...} : transInfo} = let val pseudo_blocks = AppendList.append (AppendList.snoc (Entry.toX86Blocks {label = label, kind = kind, transInfo = transInfo}, x86.Block.mkBlock' {entry = NONE, statements = if !Control.Native.commented > 0 then let val comment = concat ["Live: ", argsToString (Vector.toListMap (live, fn l => Operand.toString (Live.toOperand l)))] in [x86.Assembly.comment comment] end else [], transfer = NONE}), Vector.foldr(statements, (Transfer.toX86Blocks {returns = (Option.map (returns, fn v => Vector.map (v, Live.toOperand))), transfer = transfer, transInfo = transInfo}), fn (statement,l) => AppendList.append (Statement.toX86Blocks {statement = statement, transInfo = transInfo}, l))) val pseudo_blocks = AppendList.toList pseudo_blocks val blocks = x86.Block.compress pseudo_blocks in blocks end end structure Chunk = struct open Machine.Chunk fun toX86Chunk {chunk = T {blocks, ...}, frameInfoToX86, liveInfo} = let val data = ref [] val addData = fn l => List.push (data, l) val {get = live : Label.t -> x86.Operand.t list, set = setLive, rem = remLive, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("live", Label.layout)) val _ = Vector.foreach (blocks, fn Block.T {label, live, ...} => setLive (label, (Vector.toList o #1 o Vector.unzip o Vector.concatV o Vector.map) (live, Operand.toX86Operand o Live.toOperand))) val transInfo = {addData = addData, frameInfoToX86 = frameInfoToX86, live = live, liveInfo = liveInfo} val x86Blocks = List.concat (Vector.toListMap (blocks, fn block => Block.toX86Blocks {block = block, transInfo = transInfo})) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => remLive label) val data = List.concatRev (!data) val data = if List.isEmpty data then [] else (x86.Assembly.pseudoop_data())::data in x86.Chunk.T {data = data, blocks = x86Blocks} end end fun translateChunk {chunk: x86MLton.Machine.Chunk.t, frameInfoToX86, liveInfo: x86Liveness.LiveInfo.t}: {chunk: x86.Chunk.t} = {chunk = Chunk.toX86Chunk {chunk = chunk, frameInfoToX86 = frameInfoToX86, liveInfo = liveInfo}} val (translateChunk, translateChunk_msg) = tracerTop "translateChunk" translateChunk fun translateChunk_totals () = (translateChunk_msg (); Control.indent (); Control.unindent ()) end mlton-20100608/mlton/codegen/x86-codegen/x86-translate.sig0000644000076600000240000000172111404435625021474 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_TRANSLATE_STRUCTS = sig structure x86: X86_PSEUDO structure x86MLton : X86_MLTON sharing x86 = x86MLton.x86 structure x86Liveness : X86_LIVENESS sharing x86 = x86Liveness.x86 sharing x86MLton.x86Liveness = x86Liveness end signature X86_TRANSLATE = sig include X86_TRANSLATE_STRUCTS val translateChunk : {chunk: x86MLton.Machine.Chunk.t, frameInfoToX86: (x86MLton.Machine.FrameInfo.t -> x86.FrameInfo.t), liveInfo: x86Liveness.LiveInfo.t} -> {chunk: x86.Chunk.t} val translateChunk_totals : unit -> unit end mlton-20100608/mlton/codegen/x86-codegen/x86.fun0000644000076600000240000047023511404435625017521 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor x86 (S: X86_STRUCTS): X86 = struct val tracerTop = fn s => Control.traceBatch (Control.Pass, s) (* = fn s => fn f => (Control.trace (Control.Pass, s) f, fn () => ()) *) val tracer = fn s => Control.traceBatch (Control.Detail, s) (* = fn s => fn f => (Control.trace (Control.Detail, s) f, fn () => ()) *) (* compensate for differences between * C-escape sequences and ASM-escape sequences *) val Char_escapeASM = fn #"\000" => "\\000" | #"\^G" => "\\007" | #"\^K" => "\\013" | #"?" => "?" | #"'" => "'" | c => Char.escapeC c fun String_escapeASM s = String.translate(s, Char_escapeASM) val rec lexical = fn [] => EQUAL | thunk::tl => let val ord = thunk () in if Relation.equals(ord, EQUAL) then lexical tl else ord end open S structure Label = struct open Label fun toString l = if !Control.labelsHaveExtra_ then concat ["_", Label.toString l] else Label.toString l val layout = Layout.str o toString end structure Size = struct datatype class = INT | FLT | FPI datatype t = BYTE | WORD | LONG | SNGL | DBLE | EXTD | FPIS | FPIL | FPIQ val layout = let open Layout in fn BYTE => str "b" | WORD => str "w" | LONG => str "l" | SNGL => str "S" | DBLE => str "L" | EXTD => str "T" | FPIS => str "s" | FPIL => str "l" | FPIQ => str "q" end val toString = Layout.toString o layout val fromBytes : int -> t = fn 1 => BYTE | 2 => WORD | 4 => LONG | _ => Error.bug "x86.Size.fromBytes" val toBytes : t -> int = fn BYTE => 1 | WORD => 2 | LONG => 4 | SNGL => 4 | DBLE => 8 | EXTD => 10 | FPIS => 2 | FPIL => 4 | FPIQ => 8 local datatype z = datatype CType.t in fun fromCType t = case t of CPointer => Vector.new1 LONG | Int8 => Vector.new1 BYTE | Int16 => Vector.new1 WORD | Int32 => Vector.new1 LONG | Int64 => Vector.new2 (LONG, LONG) | Objptr => Vector.new1 LONG | Real32 => Vector.new1 SNGL | Real64 => Vector.new1 DBLE | Word8 => Vector.new1 BYTE | Word16 => Vector.new1 WORD | Word32 => Vector.new1 LONG | Word64 => Vector.new2 (LONG, LONG) end val class = fn BYTE => INT | WORD => INT | LONG => INT | SNGL => FLT | DBLE => FLT | EXTD => FLT | FPIS => FPI | FPIL => FPI | FPIQ => FPI val toFPI = fn WORD => FPIS | LONG => FPIL | FPIS => FPIS | FPIL => FPIL | FPIQ => FPIQ | _ => Error.bug "x86.Size.toFPI" val eq = fn (s1, s2) => s1 = s2 val lt = fn (s1, s2) => (toBytes s1) < (toBytes s2) end structure Register = struct datatype reg = EAX | EBX | ECX | EDX | EDI | ESI | EBP | ESP val allReg = [EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP] datatype part = E | X | L | H datatype t = T of {reg: reg, part: part} fun size (T {part, ...}) = case part of E => Size.LONG | X => Size.WORD | L => Size.BYTE | H => Size.BYTE fun layout (T {reg, part}) = let open Layout val {prefix, suffix} = case part of E => {prefix = str "%e", suffix = str "x"} | X => {prefix = str "%", suffix = str "x"} | L => {prefix = str "%", suffix = str "l"} | H => {prefix = str "%", suffix = str "h"} in case reg of EAX => seq [prefix, str "a", suffix] | EBX => seq [prefix, str "b", suffix] | ECX => seq [prefix, str "c", suffix] | EDX => seq [prefix, str "d", suffix] | EDI => seq [prefix, str "di"] | ESI => seq [prefix, str "si"] | EBP => seq [prefix, str "bp"] | ESP => seq [prefix, str "sp"] end val toString = Layout.toString o layout fun eq(T r1, T r2) = r1 = r2 val eax = T {reg = EAX, part = E} val ebx = T {reg = EBX, part = E} val ecx = T {reg = ECX, part = E} val edx = T {reg = EDX, part = E} val ax = T {reg= EAX, part = X} val al = T {reg = EAX, part = L} val bl = T {reg = EBX, part = L} val cl = T {reg = ECX, part = L} val dl = T {reg = EDX, part = L} val edi = T {reg = EDI, part = E} val esi = T {reg = ESI, part = E} val esp = T {reg = ESP, part = E} val ebp = T {reg = EBP, part = E} val byteRegisters = [T {reg = EAX, part = L}, T {reg = EAX, part = H}, T {reg = EBX, part = L}, T {reg = EBX, part = H}, T {reg = ECX, part = L}, T {reg = ECX, part = H}, T {reg = EDX, part = L}, T {reg = EDX, part = H}] val byteRegisters = List.rev byteRegisters val wordRegisters = [T {reg = EAX, part = X}, T {reg = EBX, part = X}, T {reg = ECX, part = X}, T {reg = EDX, part = X}, T {reg = EDI, part = X}, T {reg = ESI, part = X}, T {reg = EBP, part = X}, T {reg = ESP, part = X}] val wordRegisters = List.rev wordRegisters val longRegisters = [T {reg = EAX, part = E}, T {reg = EBX, part = E}, T {reg = ECX, part = E}, T {reg = EDX, part = E}, T {reg = EDI, part = E}, T {reg = ESI, part = E}, T {reg = EBP, part = E}, T {reg = ESP, part = E}] val longRegisters = List.rev longRegisters val all = List.concat [byteRegisters, wordRegisters, longRegisters] fun valid r = List.contains(all, r, eq) val contains = fn (E, E) => true | (E, X) => true | (E, L) => true | (E, H) => true | (X, X) => true | (X, L) => true | (X, H) => true | (L, L) => true | (H, H) => true | _ => false fun coincide (T {reg = reg1, part = part1}, T {reg = reg2, part = part2}) = reg1 = reg2 andalso (contains(part1,part2) orelse contains(part2,part1)) fun coincident' reg = List.keepAllMap([E, X, L, H], fn part => let val register' = T {reg = reg, part = part} in if valid register' andalso coincide(T {reg = reg, part = E}, register') then SOME register' else NONE end) val registers = fn Size.BYTE => byteRegisters | Size.WORD => wordRegisters | Size.LONG => longRegisters | _ => Error.bug "x86.Register.registers" val baseRegisters = longRegisters val indexRegisters = [T {reg = EAX, part = E}, T {reg = EBX, part = E}, T {reg = ECX, part = E}, T {reg = EDX, part = E}, T {reg = EDI, part = E}, T {reg = ESI, part = E}, T {reg = EBP, part = E}] val callerSaveRegisters = [T {reg = EAX, part = E}, T {reg = EAX, part = X}, T {reg = EAX, part = L}, T {reg = EAX, part = H}, T {reg = ECX, part = E}, T {reg = ECX, part = X}, T {reg = ECX, part = L}, T {reg = ECX, part = H}, T {reg = EDX, part = E}, T {reg = EDX, part = X}, T {reg = EDX, part = L}, T {reg = EDX, part = H}] val calleeSaveRegisters = [T {reg = EBX, part = E}, T {reg = EBX, part = X}, T {reg = EBX, part = L}, T {reg = EBX, part = H}, T {reg = EDI, part = E}, T {reg = EDI, part = X}, T {reg = ESI, part = E}, T {reg = ESI, part = X}] val withLowPart (* (fullsize,lowsize) *) = fn (Size.WORD,Size.BYTE) => [T {reg = EAX, part = X}, T {reg = EBX, part = X}, T {reg = ECX, part = X}, T {reg = EDX, part = X}] | (Size.LONG,Size.BYTE) => [T {reg = EAX, part = E}, T {reg = EBX, part = E}, T {reg = ECX, part = E}, T {reg = EDX, part = E}] | (Size.LONG,Size.WORD) => longRegisters | _ => Error.bug "x86.Register.withLowPart: fullsize,lowsize" val lowPartOf (* (register,lowsize) *) = fn (T {reg, part = L},Size.BYTE) => T {reg = reg, part = L} | (T {reg, part = H},Size.BYTE) => T {reg = reg, part = H} | (T {reg = EAX, ...}, Size.BYTE) => T {reg = EAX, part = L} | (T {reg = EBX, ...}, Size.BYTE) => T {reg = EBX, part = L} | (T {reg = ECX, ...}, Size.BYTE) => T {reg = ECX, part = L} | (T {reg = EDX, ...}, Size.BYTE) => T {reg = EDX, part = L} | (T {reg, part = X},Size.WORD) => T {reg = reg, part = X} | (T {reg, ...}, Size.WORD) => T {reg = reg, part = X} | _ => Error.bug "x86.Register.lowPartOf: register,lowsize" end structure FltRegister = struct datatype t = T of int fun layout (T i) = let open Layout in if i = 0 then str "%st" else seq [str "%st", paren (Int.layout i)] end val toString = Layout.toString o layout fun eq (T f1, T f2) = f1 = f2 fun push (T i) = T (i + 1) fun pop (T i) = T (i - 1) fun id (T i) = T i (* val return = T 0 *) val top = T 0 val one = T 1 val total = 8 : int end structure Immediate = struct datatype u = Word of WordX.t | Label of Label.t | LabelPlusWord of Label.t * WordX.t and t = T of {immediate: u, plist: PropertyList.t, hash: Word.t} local open Layout in val rec layoutU = fn Word w => WordX.layout w | Label l => Label.layout l | LabelPlusWord (l, w) => paren (seq [Label.layout l, str "+", WordX.layout w]) and layout = fn T {immediate, ...} => layoutU immediate end val rec eqU = fn (Word w1, Word w2) => WordX.equals (w1, w2) | (Label l1, Label l2) => Label.equals(l1, l2) | (LabelPlusWord (l1, w1), LabelPlusWord (l2,w2)) => Label.equals(l1,l2) andalso WordX.equals(w1, w2) | _ => false and eq = fn (T {plist = plist1, ...}, T {plist = plist2, ...}) => PropertyList.equals(plist1, plist2) local open WordX in val rec evalU = fn Word w => SOME w | Label _ => NONE | LabelPlusWord _ => NONE and eval = fn T {immediate, ...} => evalU immediate end val isZero = fn i => case eval i of SOME w => WordX.isZero w | _ => false local open Word in val rec hashU = fn Word w => WordX.hash w | Label l => Label.hash l | LabelPlusWord (l,w) => Word.xorb(0wx5555 * (Label.hash l), WordX.hash w) and hash = fn T {hash, ...} => hash end local val table: t HashSet.t ref = ref (HashSet.new {hash = hash}) in val construct = fn immediate => let val hash = hashU immediate in HashSet.lookupOrInsert (!table, hash, fn T {immediate = immediate', ...} => eqU(immediate', immediate), fn () => T {immediate = immediate, hash = hash, plist = PropertyList.new ()}) end val destruct = fn T {immediate, ...} => immediate fun clearAll () = HashSet.foreach (!table, fn T {immediate, plist, ...} => let in PropertyList.clear plist; case immediate of Word _ => () | Label l => Label.clear l | LabelPlusWord (l, _) => Label.clear l end) end val word = construct o Word val label = construct o Label val labelPlusWord = fn (l, w) => if WordSize.equals (WordX.size w, WordSize.word32) then construct (LabelPlusWord (l, w)) else Error.bug "x86.Immediate.labelPlusWord" val int' = fn (i, ws) => word (WordX.fromIntInf (IntInf.fromInt i, ws)) val int = fn i => int' (i, WordSize.word32) val zero = int 0 val labelPlusInt = fn (l, i) => labelPlusWord (l, WordX.fromIntInf (IntInf.fromInt i, WordSize.word32)) val deLabel = fn T {immediate = Label l, ...} => SOME l | _ => NONE end structure Scale = struct datatype t = One | Two | Four | Eight val layout = let open Layout in fn One => str "1" | Two => str "2" | Four => str "4" | Eight => str "8" end val fromBytes : int -> t = fn 1 => One | 2 => Two | 4 => Four | 8 => Eight | _ => Error.bug "x86.Scale.fromBytes" local datatype z = datatype CType.t in fun fromCType t = case t of CPointer => Four | Int8 => One | Int16 => Two | Int32 => Four | Int64 => Eight | Objptr => Four | Real32 => Four | Real64 => Eight | Word8 => One | Word16 => Two | Word32 => Four | Word64 => Eight end fun eq(s1, s2) = s1 = s2 val toWordX = fn One => WordX.fromIntInf (1, WordSize.word32) | Two => WordX.fromIntInf (2, WordSize.word32) | Four => WordX.fromIntInf (4, WordSize.word32) | Eight => WordX.fromIntInf (8, WordSize.word32) val toImmediate = Immediate.word o toWordX end structure Address = struct datatype t = T of {disp: Immediate.t option, base: Register.t option, index: Register.t option, scale: Scale.t option} fun layout (T {disp, base, index, scale}) = let open Layout in seq [case disp of NONE => empty | SOME disp => Immediate.layout disp, if (isSome base orelse isSome index) then paren (seq [case base of NONE => empty | SOME base => Register.layout base, case index of NONE => empty | SOME index => seq [str ",", Register.layout index], case scale of NONE => empty | SOME scale => seq [str ",", Scale.layout scale]]) else empty] end fun eq(T {disp = disp, base = base, index = index, scale = scale}, T {disp = disp', base = base', index = index', scale = scale'}) = (case (disp, disp') of (NONE, NONE) => true | (SOME disp, SOME disp') => Immediate.eq(disp, disp') | _ => false) andalso base = base' andalso index = index' andalso scale = scale' end structure MemLoc = struct structure Class = struct val counter = Counter.new 0 datatype t = T of {counter: int, name: string} fun layout (T {name, ...}) = let open Layout in str name end val toString = Layout.toString o layout fun new {name} = let val class = T {counter = Counter.next counter, name = name} in class end val eq = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => counter1 = counter2 val compare = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => Int.compare (counter1, counter2) val counter = fn (T {counter, ...}) => counter val mayAlias = eq val Temp = new {name = "Temp"} val StaticTemp = new {name = "StaticTemp"} val CStack = new {name = "CStack"} val Code = new {name = "Code"} end datatype u = U of {immBase: Immediate.t option, memBase: t option, immIndex: Immediate.t option, memIndex: t option, scale: Scale.t, size: Size.t, class: Class.t} and t = T of {memloc: u, hash: Word.t, plist: PropertyList.t, counter: Int.t, utilized: t list} local open Layout in val rec layoutImmMem = fn (NONE, NONE) => str "0" | (SOME imm, NONE) => Immediate.layout imm | (NONE, SOME mem) => layout mem | (SOME imm, SOME mem) => seq [Immediate.layout imm, str "+", layout mem] and layoutImmMemScale = fn (NONE, NONE, _) => str "0" | (SOME imm, NONE, _) => Immediate.layout imm | (NONE, SOME mem, scale) => seq [layout mem, str "*", Scale.layout scale] | (SOME imm, SOME mem, scale) => seq [Immediate.layout imm, str "+(", layout mem, str "*", Scale.layout scale, str ")"] and layoutU = fn U {immBase, memBase, immIndex, memIndex, scale, size, class} => seq [str "MEM<", Size.layout size, str ">{", Class.layout class, str "}[(", layoutImmMem (immBase, memBase), str ")+(", layoutImmMemScale (immIndex, memIndex, scale), str ")]"] and layout = fn T {memloc, ...} => layoutU memloc end val toString = Layout.toString o layout val rec hashImmMem = fn (NONE, NONE) => 0wx55555555 | (SOME imm, NONE) => Immediate.hash imm | (NONE, SOME mem) => hash mem | (SOME imm, SOME mem) => Word.xorb(0wx5555 * (Immediate.hash imm), hash mem) and hashU = fn U {immBase, memBase, immIndex, memIndex, ...} => let val hashBase = hashImmMem(immBase, memBase) val hashIndex = hashImmMem(immIndex, memIndex) in Word.xorb(0wx5555 * hashBase, hashIndex) end and hash = fn T {hash, ...} => hash val rec eqImm = fn (NONE, NONE) => true | (SOME imm1, SOME imm2) => Immediate.eq(imm1, imm2) | _ => false and eqMem = fn (NONE, NONE) => true | (SOME mem1, SOME mem2) => eq(mem1, mem2) | _ => false and eqU = fn (U {immBase = immBase1, memBase = memBase1, immIndex = immIndex1, memIndex = memIndex1, scale = scale1, size = size1, class = class1}, U {immBase = immBase2, memBase = memBase2, immIndex = immIndex2, memIndex = memIndex2, scale = scale2, size = size2, class = class2}) => Class.eq(class1, class2) andalso eqImm(immBase1, immBase2) andalso eqMem(memBase1, memBase2) andalso eqImm(immIndex1, immIndex2) andalso eqMem(memIndex1, memIndex2) andalso Scale.eq(scale1, scale2) andalso Size.eq(size1, size2) and eq = fn (T {plist = plist1, ...}, T {plist = plist2, ...}) => PropertyList.equals(plist1, plist2) val rec utilizedMem = fn NONE => [] | SOME m => m::(utilized m) and utilizedU = fn U {memBase, memIndex, ...} => (utilizedMem memBase) @ (utilizedMem memIndex) and utilized = fn T {utilized, ...} => utilized local val counter = Counter.new 0 val table: t HashSet.t ref = ref (HashSet.new {hash = hash}) in val construct = fn memloc => let val hash = hashU memloc in HashSet.lookupOrInsert (!table, hash, fn T {memloc = memloc', ...} => eqU(memloc', memloc), fn () => T {memloc = memloc, hash = hash, plist = PropertyList.new (), counter = Counter.next counter, utilized = utilizedU memloc}) end val destruct = fn T {memloc, ...} => memloc fun clearAll () = HashSet.foreach (!table, fn T {plist, ...} => let in PropertyList.clear plist end) end val rec mayAliasImmIndex = fn ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) => let val size1 = IntInf.fromInt (Size.toBytes size1) val size2 = IntInf.fromInt (Size.toBytes size2) in case (Immediate.eval (case immIndex1 of NONE => Immediate.zero | SOME immIndex => immIndex), Immediate.eval (case immIndex2 of NONE => Immediate.zero | SOME immIndex => immIndex)) of (SOME pos1, SOME pos2) => (let val pos1 = WordX.toIntInfX pos1 val pos2 = WordX.toIntInfX pos2 in if pos1 < pos2 then pos2 < (pos1 + size1) else pos1 < (pos2 + size2) end handle Overflow => false) | _ => true end and mayAliasU = fn (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => Immediate.eq(immBase1, immBase2) andalso mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => not (Immediate.eq(immBase1, immBase2)) andalso (not (eq(memIndex1, memIndex2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2})) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => not (eq(memBase1, memBase2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => not (eq(memBase1, memBase2)) orelse not (eq(memIndex1, memIndex2)) orelse mayAliasImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | _ => true and mayAlias = fn (T {memloc = memloc1 as U {class = class1, ...}, ...}, T {memloc = memloc2 as U {class = class2, ...}, ...}) => Class.mayAlias(class1, class2) andalso mayAliasU(memloc1, memloc2) val rec mayAliasOrdImmIndex = fn ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) => let val size1 = IntInf.fromInt (Size.toBytes size1) val size2 = IntInf.fromInt (Size.toBytes size2) in case (Immediate.eval (case immIndex1 of NONE => Immediate.zero | SOME immIndex => immIndex), Immediate.eval (case immIndex2 of NONE => Immediate.zero | SOME immIndex => immIndex)) of (SOME pos1, SOME pos2) => (let val pos1 = WordX.toIntInfX pos1 val pos2 = WordX.toIntInfX pos2 in if pos1 < pos2 then if pos2 < (pos1 + size1) then SOME LESS else NONE else if pos1 < (pos2 + size2) then SOME GREATER else NONE end handle Overflow => NONE) | _ => SOME EQUAL end and mayAliasOrdU = fn (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => if Immediate.eq(immBase1, immBase2) then mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) else NONE | (U {immBase = SOME immBase1, memBase = NONE, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = SOME immBase2, memBase = NONE, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => if Immediate.eq(immBase1, immBase2) then if not (eq(memIndex1, memIndex2)) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) else NONE | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = NONE, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = NONE, size = size2, ...}) => if not (eq(memBase1, memBase2)) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | (U {immBase = NONE, memBase = SOME memBase1, immIndex = immIndex1, memIndex = SOME memIndex1, size = size1, ...}, U {immBase = NONE, memBase = SOME memBase2, immIndex = immIndex2, memIndex = SOME memIndex2, size = size2, ...}) => if (not (eq(memBase1, memBase2)) orelse not (eq(memIndex1, memIndex2))) then SOME EQUAL else mayAliasOrdImmIndex ({immIndex = immIndex1, size = size1}, {immIndex = immIndex2, size = size2}) | _ => SOME EQUAL and mayAliasOrd = fn (T {memloc = memloc1 as U {class = class1, ...}, ...}, T {memloc = memloc2 as U {class = class2, ...}, ...}) => if Class.mayAlias(class1, class2) then mayAliasOrdU(memloc1, memloc2) else NONE val compare = fn (T {counter = counter1, ...}, T {counter = counter2, ...}) => Int.compare(counter1, counter2) fun replaceMem replacer = fn NONE => NONE | SOME mem => SOME (replace replacer mem) and replaceU replacer = fn memloc as T {memloc = U {immBase, memBase, immIndex, memIndex, scale, size, class}, ...} => let val memBase' = replaceMem replacer memBase val memIndex' = replaceMem replacer memIndex in if eqMem(memBase, memBase') andalso eqMem(memIndex, memIndex') then memloc else construct (U {immBase = immBase, memBase = memBase', immIndex = immIndex, memIndex = memIndex', scale = scale, size = size, class = class}) end and replace replacer = fn memloc => let val memloc' = replacer memloc in if eq(memloc', memloc) then replaceU replacer memloc else memloc' end val rec sizeU = fn U {size, ...} => size and size = fn T {memloc, ...} => sizeU memloc val rec classU = fn U {class, ...} => class and class = fn T {memloc, ...} => classU memloc fun scaleImmediate (imm, scale) = case Immediate.destruct imm of Immediate.Word w => Immediate.word (WordX.mul (w, Scale.toWordX scale, {signed = true})) | _ => Error.bug "x86.MemLoc.scaleImmediate" fun addImmediate (imm1, imm2) = case (Immediate.destruct imm1, Immediate.destruct imm2) of (Immediate.Word w1, Immediate.Word w2) => Immediate.word (WordX.add (w1, w2)) | _ => Error.bug "x86.MemLoc.scaleImmediate" val imm = fn {base, index, scale, size, class} => construct (U {immBase = SOME base, memBase = NONE, immIndex = SOME (scaleImmediate (index, scale)), memIndex = NONE, scale = scale, size = size, class = class}) val basic = fn {base, index, scale, size, class} => construct (U {immBase = SOME base, memBase = NONE, immIndex = NONE, memIndex = SOME index, scale = scale, size = size, class = class}) val simple = fn {base, index, scale, size, class} => construct (U {immBase = NONE, memBase = SOME base, immIndex = SOME (scaleImmediate (index, scale)), memIndex = NONE, scale = scale, size = size, class = class}) val complex = fn {base, index, scale, size, class} => construct (U {immBase = NONE, memBase = SOME base, immIndex = NONE, memIndex = SOME index, scale = scale, size = size, class = class}) val shift = fn {origin, disp, scale, size} => let val disp = scaleImmediate (disp, scale) val U {immBase, memBase, immIndex, memIndex, scale, class, ...} = destruct origin in construct (U {immBase = immBase, memBase = memBase, immIndex = case immIndex of NONE => SOME disp | SOME immIndex => SOME (addImmediate (immIndex, disp)), memIndex = memIndex, scale = scale, size = size, class = class}) end local val num : int ref = ref 0 in val temp = fn {size} => (Int.inc num; imm {base = Immediate.zero, index = Immediate.int (!num), scale = Scale.One, size = size, class = Class.Temp}) end (* * Static memory locations *) fun makeContents {base, size, class} = imm {base = base, index = Immediate.zero, scale = Scale.Four, size = size, class = class} (* local datatype z = datatype CType.t datatype z = datatype Size.t in fun cReturnTempContents sizes = (List.rev o #1) (List.fold (sizes, ([],0), fn (size, (contents, index)) => ((cReturnTempContent (index, size))::contents, index + Size.toBytes size))) fun cReturnTempContent size = List.first(cReturnTempContents [size]) val cReturnTempContents = fn size => cReturnTempContents ( case size of Int s => let datatype z = datatype IntSize.t in case s of I8 => [BYTE] | I16 => [WORD] | I32 => [LONG] | I64 => [LONG, LONG] end | Pointer => [LONG] | Real s => let datatype z = datatype RealSize.t in case s of R32 => [SNGL] | R64 => [DBLE] end | Word s => let datatype z = datatype WordSize.t in case s of W8 => [BYTE] | W16 => [WORD] | W32 => [LONG] end) end *) end local structure ClassElement = struct type t = MemLoc.Class.t val compare = MemLoc.Class.compare local fun make f = fn (a, b) => f (MemLoc.Class.counter a, MemLoc.Class.counter b) in val op < = make Int.< val op > = make Int.> val op >= = make Int.>= val op <= = make Int.<= end val min = fn (a, b) => if Int.<(MemLoc.Class.counter a, MemLoc.Class.counter b) then a else b val max = fn (a, b) => min (b, a) val equals = MemLoc.Class.eq val layout = MemLoc.Class.layout end in structure ClassSet = OrderedUniqueSet(open ClassElement) end local structure MemLocElement = struct type t = MemLoc.t val equals = MemLoc.eq val layout = MemLoc.layout (* val compare = MemLoc.compare local fun make f = fn (a, b) => f (MemLoc.counter a, MemLoc.counter b) in val op < = make Int.< val op > = make Int.> val op >= = make Int.>= val op <= = make Int.<= end val min = fn (a, b) => if Int.<(MemLoc.counter a, MemLoc.counter b) then a else b val max = fn (a, b) => min (b, a) val hash = MemLoc.hash *) end in structure MemLocSet = UnorderedSet(open MemLocElement) (* structure MemLocSet = OrderedUniqueSet(open MemLocElement) *) (* structure MemLocSet' = UnorderedSet(open MemLocElement) structure MemLocSet = HashedUniqueSet(structure Set = MemLocSet' structure Element = MemLocElement) *) end structure Operand = struct datatype t = Register of Register.t | FltRegister of FltRegister.t | Immediate of Immediate.t | Label of Label.t | Address of Address.t | MemLoc of MemLoc.t val size = fn Register r => SOME (Register.size r) | FltRegister _ => SOME Size.EXTD | Immediate _ => NONE | Label _ => NONE | Address _ => NONE | MemLoc m => SOME (MemLoc.size m) val layout = let open Layout in fn Register r => Register.layout r | FltRegister f => FltRegister.layout f | Immediate i => seq [str "$", Immediate.layout i] | Label l => Label.layout l | Address a => Address.layout a | MemLoc m => MemLoc.layout m end val toString = Layout.toString o layout val eq = fn (Register r1, Register r2) => Register.eq(r1, r2) | (FltRegister f1, FltRegister f2) => FltRegister.eq(f1, f2) | (Immediate i1, Immediate i2) => Immediate.eq(i1, i2) | (Label l1, Label l2) => Label.equals(l1, l2) | (Address a1, Address a2) => Address.eq(a1, a2) | (MemLoc m1, MemLoc m2) => MemLoc.eq(m1, m2) | _ => false val mayAlias = fn (Register r1, Register r2) => Register.eq(r1, r2) | (Register _, _) => false | (FltRegister f1, FltRegister f2) => FltRegister.eq(f1, f2) | (FltRegister _, _) => false | (Immediate i1, Immediate i2) => Immediate.eq(i1, i2) | (Immediate _, _) => false | (Label l1, Label l2) => Label.equals(l1, l2) | (Label _, _) => false | (Address _, Address _) => true | (Address _, MemLoc _) => true | (Address _, _) => false | (MemLoc m1, MemLoc m2) => MemLoc.mayAlias(m1, m2) | (MemLoc _, Address _) => true | (MemLoc _, _) => false val register = Register val deRegister = fn Register x => SOME x | _ => NONE val fltregister = FltRegister val deFltregister = fn FltRegister x => SOME x | _ => NONE val immediate = Immediate val deImmediate = fn Immediate x => SOME x | _ => NONE val immediate_word = immediate o Immediate.word val immediate_int' = immediate o Immediate.int' val immediate_int = immediate o Immediate.int val immediate_zero = immediate Immediate.zero val immediate_label = immediate o Immediate.label val label = Label val deLabel = fn Label x => SOME x | _ => NONE val address = Address val memloc = MemLoc fun memloc_label l = memloc (MemLoc.makeContents { base = Immediate.label l, size = Size.LONG, class = MemLoc.Class.Code }) val deMemloc = fn MemLoc x => SOME x | _ => NONE local val cReturnTemp = Label.fromString "cReturnTemp" fun cReturnTempContent (index, size) = MemLoc.imm {base = Immediate.label cReturnTemp, index = Immediate.int index, scale = Scale.One, size = size, class = MemLoc.Class.StaticTemp} datatype z = datatype CType.t datatype z = datatype Size.t in fun cReturnTemps ty = if RepType.isUnit ty then [] else let fun w (r, s) = [{src = register r, dst = cReturnTempContent (0, s)}] val w8 = w (Register.al, BYTE) val w16 = w (Register.ax, WORD) val w32 = w (Register.eax, LONG) val w64 =[{src = register Register.eax, dst = cReturnTempContent (0, LONG)}, {src = register Register.edx, dst = cReturnTempContent (4, LONG)}] in case RepType.toCType ty of CPointer => w32 | Int8 => w8 | Int16 => w16 | Int32 => w32 | Int64 => w64 | Objptr => w32 | Real32 => [{src = fltregister FltRegister.top, dst = cReturnTempContent (0, SNGL)}] | Real64 => [{src = fltregister FltRegister.top, dst = cReturnTempContent (0, DBLE)}] | Word8 => w8 | Word16 => w16 | Word32 => w32 | Word64 => w64 end end end structure Instruction = struct (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 63 *) | ADC (* signed/unsigned addition with carry; p. 61 *) | SUB (* signed/unsigned subtraction; p. 713 *) | SBB (* signed/unsigned subtraction with borrow; p. 667 *) | AND (* logical and; p. 70 *) | OR (* logical or; p. 499 *) | XOR (* logical xor; p. 758 *) val binal_layout = let open Layout in fn ADD => str "add" | ADC => str "adc" | SUB => str "sub" | SBB => str "sbb" | AND => str "and" | OR => str "or" | XOR => str "xor" end (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 335 *) | MUL (* unsigned multiplication; p. 488 *) | IDIV (* signed division; p. 332 *) | DIV (* unsigned division; p. 188 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) val md_layout = let open Layout in fn IMUL => str "imul" | MUL => str "mul" | IDIV => str "idiv" | DIV => str "div" | IMOD => str "imod" | MOD => str "mod" end (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 341 *) | DEC (* decrement by 1; p. 186 *) | NEG (* two's complement negation; p. 494 *) | NOT (* one's complement negation; p. 497 *) val unal_layout = let open Layout in fn INC => str "inc" | DEC => str "dec" | NEG => str "neg" | NOT => str "not" end (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 662 *) | SHL (* shift logical left; p. 662 *) | SAR (* shift arithmetic right; p. 662 *) | SHR (* shift logical right; p. 662 *) | ROL (* rotate left; p. 631 *) | RCL (* rotate through carry left; p. 631 *) | ROR (* rotate right; p. 631 *) | RCR (* rotate through carry right; p. 631 *) val sral_layout = let open Layout in fn SAL => str "sal" | SHL => str "shl" | SAR => str "sar" | SHR => str "shr" | ROL => str "rol" | RCL => str "rcl" | ROR => str "ror" | RCR => str "rcr" end (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 481 *) | MOVZX (* move with zero extention; p. 486 *) val movx_layout = let open Layout in fn MOVSX => str "movs" | MOVZX => str "movz" end (* Condition test field; p. 795 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate = fn O => NO | NO => O | B => NB | NB => B | AE => NAE | NAE => AE | C => NC | NC => C | E => NE | NE => E | Z => NZ | NZ => Z | BE => NBE | NBE => BE | A => NA | NA => A | S => NS | NS => S | P => NP | NP => P | PE => PO | PO => PE | L => NL | NL => L | LE => NLE | NLE => LE | G => NG | NG => G | GE => NGE | NGE => GE val condition_reverse = fn B => A | NB => NA | AE => BE | NAE => NBE | E => E | NE => NE | BE => AE | NBE => NAE | A => B | NA => NB | L => G | NL => NG | LE => GE | NLE => NGE | G => L | NG => NL | GE => LE | NGE => NLE | c => c local open Layout in val rec condition_layout = fn O => str "o" | B => str "b" | AE => str "ae" | C => str "c" | E => str "e" | Z => str "z" | BE => str "be" | A => str "a" | S => str "s" | P => str "p" | PE => str "pe" | PO => str "po" | L => str "l" | LE => str "le" | G => str "g" | GE => str "ge" | c => seq [str "n", condition_layout (condition_negate c)] end val condition_toString = Layout.toString o condition_layout (* Floating-point binary arithmetic instructions. *) datatype fbina = FADD (* addition; p. 205 *) | FSUB (* subtraction; p. 297 *) | FSUBR (* reversed subtraction; p. 301 *) | FMUL (* multiplication; p. 256 *) | FDIV (* division; p. 229 *) | FDIVR (* reversed division; p. 233 *) val fbina_layout = let open Layout in fn FADD => str "fadd" | FSUB => str "fsub" | FSUBR => str "fsubr" | FMUL => str "fmul" | FDIV => str "fdiv" | FDIVR => str "fdivr" end val fbina_reverse = fn FADD => FADD | FSUB => FSUBR | FSUBR => FSUB | FMUL => FMUL | FDIV => FDIVR | FDIVR => FDIV (* Floating-point unary arithmetic instructions. *) datatype funa = F2XM1 (* compute 2^x-1; p. 201 *) | FABS (* absolute value; p. 203 *) | FCHS (* change sign; p. 214 *) | FSQRT (* square root; p. 284 *) | FSIN (* sine; p. 280 *) | FCOS (* cosine; p. 226 *) | FRNDINT (* round to integer; p. 271 *) val funa_layout = let open Layout in fn F2XM1 => str "f2xm1" | FABS => str "fabs" | FCHS => str "fchs" | FSQRT => str "fsqrt" | FSIN => str "fsin" | FCOS => str "fcos" | FRNDINT => str "frndint" end (* Floating-point binary arithmetic stack instructions. *) datatype fbinas = FSCALE (* scale; p. 278 *) | FPREM (* partial remainder; p. 263 *) | FPREM1 (* IEEE partial remainder; p. 266 *) val fbinas_layout = let open Layout in fn FSCALE => str "fscale" | FPREM=> str "fprem" | FPREM1 => str "fprem1" end (* floating point binary arithmetic stack pop instructions. *) datatype fbinasp = FYL2X (* compute y * log_2 x; p. 327 *) | FYL2XP1 (* compute y * log_2 (x + 1.0); p. 329 *) | FPATAN (* partial arctangent; p. 261 *) val fbinasp_layout = let open Layout in fn FYL2X => str "fyl2x" | FYL2XP1 => str "fyl2xp1" | FPATAN => str "fpatan" end (* Floating-point constants. *) datatype fldc = ONE (* +1.0; p. 250 *) | ZERO (* +0.0; p. 250 *) | PI (* pi; p. 250 *) | L2E (* log_2 e; p. 250 *) | LN2 (* log_e 2; p. 250 *) | L2T (* log_2 10; p. 250 *) | LG2 (* log_10 2; p. 250 *) val fldc_layout = let open Layout in fn ONE => str "fld1" | ZERO => str "fldz" | PI => str "fldpi" | L2E => str "fldl2e" | LN2 => str "fldln2" | L2T => str "fldl2t" | LG2 => str "fldlg2" end (* x86 Instructions. * src operands are not changed by the instruction. * dst operands are changed by the instruction. *) datatype t (* No operation *) = NOP (* Halt *) | HLT (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) | BinAL of {oper: binal, src: Operand.t, dst: Operand.t, size: Size.t} (* Psuedo integer multiplication and division. *) | pMD of {oper: md, src: Operand.t, dst: Operand.t, size: Size.t} (* Integer multiplication and division. *) | MD of {oper: md, src: Operand.t, size: Size.t} (* Integer signed/unsiged multiplication (two operand form); p. 335 *) | IMUL2 of {src: Operand.t, dst: Operand.t, size: Size.t} (* Integer unary arithmetic/logic instructions. *) | UnAL of {oper: unal, dst: Operand.t, size: Size.t} (* Integer shift/rotate arithmetic/logic instructions. *) | SRAL of {oper: sral, count: Operand.t, dst: Operand.t, size: Size.t} (* Arithmetic compare. *) | CMP of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Logical compare. *) | TEST of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Set byte on condition. *) | SETcc of {condition: condition, dst: Operand.t, size: Size.t} (* Jump. *) | JMP of {target: Operand.t, absolute: bool} (* Jump if condition is met. *) | Jcc of {condition: condition, target: Operand.t} (* Call procedure. *) | CALL of {target: Operand.t, absolute: bool} (* Return from procedure. *) | RET of {src: Operand.t option} (* Move. *) | MOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Conditional move. *) | CMOVcc of {condition: condition, src: Operand.t, dst: Operand.t, size: Size.t} (* Exchange register/memory with register. *) | XCHG of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo-push a value onto a stack. *) | pPUSH of {src: Operand.t, base: Operand.t, size: Size.t} (* Pseudo-pop a value from a stack. *) | pPOP of {dst: Operand.t, base: Operand.t, size: Size.t} (* Push a value onto the stack. *) | PUSH of {src: Operand.t, size: Size.t} (* Pop a value from the stack. *) | POP of {dst: Operand.t, size: Size.t} (* Convert X to 2X with sign extension. *) | CX of {size: Size.t} (* Move with extention. *) | MOVX of {oper: movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Move with contraction. *) | XVOM of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Load effective address. *) | LEA of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point move. *) | pFMOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point move with extension. *) | pFMOVX of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point move with contraction. *) | pFXVOM of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point load constant. *) | pFLDC of {oper: fldc, dst: Operand.t, size: Size.t} (* Pseudo floating-point move from integer. *) | pFMOVFI of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point move to integer. *) | pFMOVTI of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point compare. *) | pFCOM of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Pseudo floating-point unordered compare. *) | pFUCOM of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic instructions. *) | pFBinA of {oper: fbina, src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point unary arithmetic instructions. *) | pFUnA of {oper: funa, dst: Operand.t, size: Size.t} (* Pseudo floating-point partial tangent instruction. *) | pFPTAN of {dst: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic stack instructions. *) | pFBinAS of {oper: fbinas, src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic stack pop instructions. *) | pFBinASP of {oper: fbinasp, src: Operand.t, dst: Operand.t, size: Size.t} (* Floating-point load real. *) | FLD of {src: Operand.t, size: Size.t} (* Floating-point store real. *) | FST of {dst: Operand.t, size: Size.t, pop: bool} (* Floating-point load integer. *) | FILD of {src: Operand.t, size: Size.t} (* Floating-point store integer. *) | FIST of {dst: Operand.t, size: Size.t, pop: bool} (* Floating-point exchange. *) | FXCH of {src: Operand.t} (* Floating-point load constant. *) | FLDC of {oper: fldc} (* Floating-point load control word. *) | FLDCW of {src: Operand.t} (* Floating-point store control word. *) | FSTCW of {dst: Operand.t, check: bool} (* Floating-point store status word. *) | FSTSW of {dst: Operand.t, check: bool} (* Floating-point compare. *) | FCOM of {src: Operand.t, size: Size.t, pop: bool, pop': bool} (* Floating-point unordered compare. *) | FUCOM of {src: Operand.t, pop: bool, pop': bool} (* Floating-point binary arithmetic instructions. *) | FBinA of {oper: fbina, src: Operand.t, dst: Operand.t, size: Size.t, pop: bool} (* Floating-point unary arithmetic instructions. *) | FUnA of {oper: funa} (* Floating-point partial tangent instruction. *) | FPTAN (* Floating-point binary arithmetic stack instructions. *) | FBinAS of {oper: fbinas} (* Floating-point binary arithmetic stack pop instructions. *) | FBinASP of {oper: fbinasp} val layout = let open Layout fun bin (oper, size, oper1, oper2) = seq [oper, size, str " ", oper1, str ",", oper2] fun un (oper, size, oper1) = seq [oper, size, str " ", oper1] in fn NOP => str "nop" | HLT => str "hlt" | BinAL {oper, src, dst, size} => bin (binal_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | pMD {oper, src, dst, size} => bin (md_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | MD {oper, src, size} => un (md_layout oper, Size.layout size, Operand.layout src) | IMUL2 {src, dst, size} => bin (str "imul", Size.layout size, Operand.layout src, Operand.layout dst) | UnAL {oper, dst, size} => un (unal_layout oper, Size.layout size, Operand.layout dst) | SRAL {oper, count, dst, size} => bin (sral_layout oper, Size.layout size, Operand.layout count, Operand.layout dst) | CMP {src1, src2, size} => bin (str "cmp", Size.layout size, Operand.layout src2, Operand.layout src1) | TEST {src1, src2, size} => bin (str "test", Size.layout size, Operand.layout src2, Operand.layout src1) | SETcc {condition, dst, ...} => seq [str "set", condition_layout condition, str " ", Operand.layout dst] | JMP {target, absolute} => seq [str "jmp ", if absolute then str "*" else empty, Operand.layout target] | Jcc {condition, target} => seq [str "j", condition_layout condition, str " ", Operand.layout target] | CALL {target, absolute} => seq [str "call ", if absolute then str "*" else empty, Operand.layout target] | RET {src} => seq [str "ret", case src of NONE => empty | SOME src => seq [str " ", Operand.layout src]] | MOV {src, dst, size} => bin (str "mov", Size.layout size, Operand.layout src, Operand.layout dst) | CMOVcc {condition, src, dst, size} => seq [str "cmov", condition_layout condition, Size.layout size, str " ", Operand.layout src, str ",", Operand.layout dst] | XCHG {src, dst, size} => bin (str "xchg", Size.layout size, Operand.layout src, Operand.layout dst) | pPUSH {src, base, size} => seq [str "ppush", Size.layout size, str " [", Operand.layout base, str "] ", Operand.layout src] | pPOP {dst, base, size} => seq [str "ppop", Size.layout size, str " [", Operand.layout base, str " ]", Operand.layout dst] | PUSH {src, size} => seq [str "push", Size.layout size, str " ", Operand.layout src] | POP {dst, size} => seq [str "pop", Size.layout size, str " ", Operand.layout dst] | CX {size} => (case size of Size.BYTE => str "cbtw" | Size.WORD => str "cwtd" | Size.LONG => str "cltd" | _ => Error.bug "x86.Instruction.layout: CX,unsupported conversion") | MOVX {oper, src, srcsize, dst, dstsize} => bin (movx_layout oper, seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | XVOM {src, srcsize, dst, dstsize} => bin (str "xvom", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | LEA {src, dst, size} => bin (str "lea", Size.layout size, Operand.layout src, Operand.layout dst) | pFMOV {src, dst, size} => bin (str "fmov", Size.layout size, Operand.layout src, Operand.layout dst) | pFMOVX {src, dst, srcsize, dstsize} => bin (str "fmovx", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | pFXVOM {src, dst, srcsize, dstsize} => bin (str "fmov", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | pFLDC {oper, dst, size} => un (fldc_layout oper, Size.layout size, Operand.layout dst) | pFMOVFI {src, dst, srcsize, dstsize} => bin (str "fmovfi", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | pFMOVTI {src, dst, srcsize, dstsize} => bin (str "fmovti", seq [Size.layout srcsize, Size.layout dstsize], Operand.layout src, Operand.layout dst) | pFCOM {src1, src2, size} => bin (str "fcom", Size.layout size, Operand.layout src1, Operand.layout src2) | pFUCOM {src1, src2, size} => bin (str "fucom", Size.layout size, Operand.layout src1, Operand.layout src2) | pFBinA {oper, src, dst, size} => bin (fbina_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | pFUnA {oper, dst, size} => un (funa_layout oper, Size.layout size, Operand.layout dst) | pFPTAN {dst, size} => un (str "fptan", Size.layout size, Operand.layout dst) | pFBinAS {oper, src, dst, size} => bin (fbinas_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | pFBinASP {oper, src, dst, size} => bin (fbinasp_layout oper, Size.layout size, Operand.layout src, Operand.layout dst) | FLD {src, size} => un (str "fld", case src of Operand.FltRegister _ => empty | _ => Size.layout size, Operand.layout src) | FST {dst, size, pop} => un (str "fst", seq [if pop then str "p" else empty, case dst of Operand.FltRegister _ => empty | _ => Size.layout size], Operand.layout dst) | FILD {src, size} => un (str "fild", Size.layout size, Operand.layout src) | FIST {dst, size, pop} => un (str "fist", seq [if pop then str "p" else empty, Size.layout size], Operand.layout dst) | FXCH {src} => seq [str "fxch ", Operand.layout src] | FLDC {oper} => seq [fldc_layout oper] | FLDCW {src} => seq [str "fldcw ", Operand.layout src] | FSTCW {dst, check} => seq [if check then str "fstcw " else str "fnstcw ", Operand.layout dst] | FSTSW {dst, check} => seq [if check then str "fstsw " else str "fnstsw ", Operand.layout dst] | FCOM {src, size, pop, pop'} => seq [str "fcom", if pop andalso pop' then str "pp" else seq [if pop then str "p" else empty, case src of Operand.FltRegister _ => empty | _ => Size.layout size, str " ", Operand.layout src]] | FUCOM {src, pop, pop'} => seq [str "fucom", if pop andalso pop' then str "pp" else seq [if pop then str "p " else str " ", Operand.layout src]] | FBinA {oper, src, dst, size, pop} => seq [fbina_layout oper, case src of Operand.FltRegister _ => seq [if pop then str "p " else str " ", Operand.layout src, str ", ", Operand.layout dst] | _ => seq [Size.layout size, str " ", Operand.layout src]] | FUnA {oper} => seq [funa_layout oper] | FPTAN => seq [str "fptan"] | FBinAS {oper} => seq [fbinas_layout oper] | FBinASP {oper} => seq [fbinasp_layout oper] end val toString = Layout.toString o layout val uses_defs_kills = fn NOP => {uses = [], defs = [], kills = []} | HLT => {uses = [], defs = [], kills = []} | BinAL {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | pMD {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | MD {oper, src, size} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.uses_defs: MD, size" in if oper = IMUL orelse oper = MUL then {uses = [src, Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} else {uses = [src, Operand.register hi, Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} end | IMUL2 {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | UnAL {dst, ...} => {uses = [dst], defs = [dst], kills = []} | SRAL {count, dst, size, ...} => if isSome (Operand.deMemloc count) then let val reg = case size of Size.BYTE => Register.T {reg = Register.ECX, part = Register.L} | Size.WORD => Register.T {reg = Register.ECX, part = Register.X} | Size.LONG => Register.T {reg = Register.ECX, part = Register.E} | _ => Error.bug "x86.Instruction.uses_defs: SRAL, size" in {uses = [count, dst, Operand.register reg], defs = [dst], kills = []} end else {uses = [count, dst], defs = [dst], kills = []} | CMP {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | TEST {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | SETcc {dst, ...} => {uses = [], defs = [dst], kills = []} | JMP {target, ...} => {uses = [target], defs = [], kills = []} | Jcc {target, ...} => {uses = [target], defs = [], kills = []} | CALL {target, ...} => {uses = [target], defs = [], kills = []} | RET {src} => {uses = case src of NONE => [] | SOME src => [src], defs = [], kills = []} | MOV {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | CMOVcc {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | XCHG {src, dst, ...} => {uses = [src,dst], defs = [src,dst], kills = []} | pPUSH {src, base, size, ...} => {uses = [src,base], defs = base:: (case base of Operand.MemLoc base => [Operand.MemLoc (MemLoc.simple {base = base, index = Immediate.zero, size = size, scale = Scale.One, class = MemLoc.Class.CStack})] | _ => []), kills = []} | pPOP {dst, base, size, ...} => {uses = base:: (case base of Operand.MemLoc base => [Operand.MemLoc (MemLoc.simple {base = base, index = Immediate.zero, size = size, scale = Scale.One, class = MemLoc.Class.CStack})] | _ => []), defs = [dst,base], kills = []} | PUSH {src, ...} => {uses = [src, Operand.register Register.esp], defs = [Operand.register Register.esp, Operand.address (Address.T {disp = NONE, base = SOME Register.esp, index = NONE, scale = NONE})], kills = []} | POP {dst, ...} => {uses = [Operand.register Register.esp, Operand.address (Address.T {disp = NONE, base = SOME Register.esp, index = NONE, scale = NONE})], defs = [dst, Operand.register Register.esp], kills = []} | CX {size} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.uses_defs: CX, size" in {uses = [Operand.register lo], defs = [Operand.register hi, Operand.register lo], kills = []} end | MOVX {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | XVOM {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | LEA {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFMOV {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFMOVX {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFXVOM {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFLDC {dst, ...} => {uses = [], defs = [dst], kills = []} | pFMOVFI {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFMOVTI {src, dst, ...} => {uses = [src], defs = [dst], kills = []} | pFCOM {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | pFUCOM {src1, src2, ...} => {uses = [src1, src2], defs = [], kills = []} | pFBinA {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | pFUnA {dst, ...} => {uses = [dst], defs = [dst], kills = []} | pFPTAN {dst, ...} => {uses = [dst], defs = [dst], kills = []} | pFBinAS {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = []} | pFBinASP {src, dst, ...} => {uses = [src, dst], defs = [dst], kills = if Operand.eq(src,dst) then [] else [src]} | FLD {src, ...} => {uses = [src], defs = [Operand.fltregister FltRegister.top], kills = []} | FST {dst, pop, ...} => {uses = [Operand.fltregister FltRegister.top], defs = [dst], kills = if pop then [Operand.fltregister FltRegister.top] else []} | FILD {src, ...} => {uses = [src], defs = [Operand.fltregister FltRegister.top], kills = []} | FIST {dst, pop, ...} => {uses = [Operand.fltregister FltRegister.top], defs = [dst], kills = if pop then [Operand.fltregister FltRegister.top] else []} | FXCH {src} => {uses = [src, Operand.fltregister FltRegister.top], defs = [src, Operand.fltregister FltRegister.top], kills = []} | FLDC {...} => {uses = [], defs = [Operand.fltregister FltRegister.top], kills = []} | FLDCW {src} => {uses = [src], defs = [], kills = []} | FSTCW {dst, ...} => {uses = [], defs = [dst], kills = []} | FSTSW {dst, ...} => {uses = [], defs = [dst], kills = []} | FCOM {src, pop, pop', ...} => {uses = [src, Operand.fltregister FltRegister.top], defs = [], kills = if pop andalso pop' then [Operand.fltregister FltRegister.top, src] else if pop then [Operand.fltregister FltRegister.top] else []} | FUCOM {src, pop, pop'} => {uses = [src, Operand.fltregister FltRegister.top], defs = [], kills = if pop andalso pop' then [Operand.fltregister FltRegister.top, src] else if pop then [Operand.fltregister FltRegister.top] else []} | FBinA {src, dst, pop, ...} => {uses = [src, dst], defs = [dst], kills = if pop then [src] else []} | FUnA {...} => {uses = [Operand.fltregister FltRegister.top], defs = [Operand.fltregister FltRegister.top], kills = []} | FPTAN => {uses = [Operand.fltregister FltRegister.top], defs = [Operand.fltregister FltRegister.top], kills = []} | FBinAS {...} => {uses = [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], defs = [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], kills = []} | FBinASP {...} => {uses = [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], defs = [Operand.fltregister FltRegister.one], kills = [Operand.fltregister FltRegister.top]} val hints = fn pMD {dst, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.hints: MD, size" val temp = MemLoc.temp {size = size} in [(temp, hi), (case Operand.deMemloc dst of SOME memloc => (memloc, lo) | NONE => (temp, lo))] end | MD {src, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.hints: MD, size" val temp = MemLoc.temp {size = size} in [(temp, hi), (case Operand.deMemloc src of SOME memloc => (memloc, lo) | NONE => (temp, lo))] end | SRAL {count, size, ...} => (case Operand.deMemloc count of SOME memloc => let val reg = case size of Size.BYTE => Register.T {reg = Register.ECX, part = Register.L} | Size.WORD => Register.T {reg = Register.ECX, part = Register.X} | Size.LONG => Register.T {reg = Register.ECX, part = Register.E} | _ => Error.bug "x86.Instruction.hints: SRAL, size" in [(memloc, reg)] end | NONE => []) | pPUSH {base, ...} => (case Operand.deMemloc base of SOME base => [(base,Register.esp)] | NONE => []) | pPOP {base, ...} => (case Operand.deMemloc base of SOME base => [(base,Register.esp)] | NONE => []) | PUSH {...} => let val temp = MemLoc.temp {size = Size.LONG} in [(temp,Register.esp)] end | POP {...} => let val temp = MemLoc.temp {size = Size.LONG} in [(temp,Register.esp)] end | _ => [] val srcs_dsts = fn NOP => {srcs = NONE, dsts = NONE} | HLT => {srcs = NONE, dsts = NONE} | BinAL {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | pMD {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | MD {oper, src, size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.srcs_dsts: MD, size" in if oper = IMUL orelse oper = MUL then {srcs = SOME [src, Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} else {srcs = SOME [src, Operand.register hi, Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} end | IMUL2 {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | UnAL {dst, ...} => {srcs = SOME [dst], dsts = SOME [dst]} | SRAL {count, dst, size, ...} => if isSome (Operand.deMemloc count) then let val reg = case size of Size.BYTE => Register.T {reg = Register.ECX, part = Register.L} | Size.WORD => Register.T {reg = Register.ECX, part = Register.X} | Size.LONG => Register.T {reg = Register.ECX, part = Register.E} | _ => Error.bug "x86.Instruction.srcs_dsts: SRAL, size" in {srcs = SOME [count, dst, Operand.register reg], dsts = SOME [dst]} end else {srcs = SOME [count, dst], dsts = SOME [dst]} | CMP {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | TEST {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | SETcc {dst, ...} => {srcs = NONE, dsts = SOME [dst]} | JMP {target, ...} => {srcs = SOME [target], dsts = NONE} | Jcc {target, ...} => {srcs = SOME [target], dsts = NONE} | CALL {target, ...} => {srcs = SOME [target], dsts = NONE} | RET {src} => {srcs = case src of NONE => NONE | SOME src => SOME [src], dsts = NONE} | MOV {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | CMOVcc {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | XCHG {src, dst, ...} => {srcs = SOME [src,dst], dsts = SOME [src,dst]} | pPUSH {src, base, ...} => {srcs = SOME [src,base], dsts = SOME [base]} | pPOP {dst, base, ...} => {srcs = SOME [base], dsts = SOME [dst,base]} | PUSH {src, ...} => {srcs = SOME [src, Operand.register Register.esp], dsts = SOME [Operand.register Register.esp]} | POP {dst, ...} => {srcs = SOME [Operand.register Register.esp], dsts = SOME [dst, Operand.register Register.esp]} | CX {size, ...} => let val (hi,lo) = case size of Size.BYTE => (Register.T {reg = Register.EAX, part = Register.H}, Register.T {reg = Register.EAX, part = Register.L}) | Size.WORD => (Register.T {reg = Register.EDX, part = Register.X}, Register.T {reg = Register.EAX, part = Register.X}) | Size.LONG => (Register.T {reg = Register.EDX, part = Register.E}, Register.T {reg = Register.EAX, part = Register.E}) | _ => Error.bug "x86.Instruction.srcs_dsts: CX, size" in {srcs = SOME [Operand.register lo], dsts = SOME [Operand.register hi, Operand.register lo]} end | MOVX {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | XVOM {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | LEA {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFMOV {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFMOVX {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFXVOM {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFLDC {dst, ...} => {srcs = SOME [], dsts = SOME [dst]} | pFMOVFI {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFMOVTI {src, dst, ...} => {srcs = SOME [src], dsts = SOME [dst]} | pFCOM {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | pFUCOM {src1, src2, ...} => {srcs = SOME [src1, src2], dsts = NONE} | pFBinA {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | pFUnA {dst, ...} => {srcs = SOME [dst], dsts = SOME [dst]} | pFPTAN {dst, ...} => {srcs = SOME [dst], dsts = SOME [dst]} | pFBinAS {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | pFBinASP {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | FLD {src, ...} => {srcs = SOME [src], dsts = SOME [Operand.fltregister FltRegister.top]} | FST {dst, ...} => {srcs = SOME [Operand.fltregister FltRegister.top], dsts = SOME [dst]} | FILD {src, ...} => {srcs = SOME [src], dsts = SOME [Operand.fltregister FltRegister.top]} | FIST {dst, ...} => {srcs = SOME [Operand.fltregister FltRegister.top], dsts = SOME [dst]} | FXCH {src} => {srcs = SOME [src, Operand.fltregister FltRegister.top], dsts = SOME [src, Operand.fltregister FltRegister.top]} | FLDC {...} => {srcs = NONE, dsts = SOME [Operand.fltregister FltRegister.top]} | FLDCW {src} => {srcs = SOME [src], dsts = NONE} | FSTCW {dst, ...} => {srcs = NONE, dsts = SOME [dst]} | FSTSW {dst, ...} => {srcs = NONE, dsts = SOME [dst]} | FCOM {src, ...} => {srcs = SOME [src, Operand.fltregister FltRegister.top], dsts = NONE} | FUCOM {src, ...} => {srcs = SOME [src, Operand.fltregister FltRegister.top], dsts = NONE} | FBinA {src, dst, ...} => {srcs = SOME [src, dst], dsts = SOME [dst]} | FUnA {...} => {srcs = SOME [Operand.fltregister FltRegister.top], dsts = SOME [Operand.fltregister FltRegister.top]} | FPTAN => {srcs = SOME [Operand.fltregister FltRegister.top], dsts = SOME [Operand.fltregister FltRegister.top]} | FBinAS {...} => {srcs = SOME [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], dsts = SOME [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one]} | FBinASP {...} => {srcs = SOME [Operand.fltregister FltRegister.top, Operand.fltregister FltRegister.one], dsts = SOME [Operand.fltregister FltRegister.one]} fun replace replacer = fn NOP => NOP | HLT => HLT | BinAL {oper, src, dst, size} => BinAL {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | pMD {oper, src, dst, size} => pMD {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | MD {oper, src, size} => MD {oper = oper, src = replacer {use = true, def = false} src, size = size} | IMUL2 {src, dst, size} => IMUL2 {src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | UnAL {oper, dst, size} => UnAL {oper = oper, dst = replacer {use = true, def = true} dst, size = size} | SRAL {oper, count, dst, size} => SRAL {oper = oper, count = replacer {use = true, def = false} count, dst = replacer {use = true, def = true} dst, size = size} | CMP {src1, src2, size} => CMP {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | TEST {src1, src2, size} => TEST {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | SETcc {condition, dst, size} => SETcc {condition = condition, dst = replacer {use = false, def = true} dst, size = size} | JMP {target, absolute} => JMP {target = replacer {use = true, def = false} target, absolute = absolute} | Jcc {condition, target} => Jcc {condition = condition, target = replacer {use = true, def = false} target} | CALL {target, absolute} => CALL {target = replacer {use = true, def = false} target, absolute = absolute} | RET {src} => (case src of NONE => RET {src = NONE} | SOME src => RET {src = SOME (replacer {use = true, def = false} src)}) | MOV {src, dst, size} => MOV {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | CMOVcc {condition, src, dst, size} => CMOVcc {condition = condition, src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | XCHG {src, dst, size} => XCHG {src = replacer {use = true, def = true} src, dst = replacer {use = true, def = true} dst, size = size} | pPUSH {src, base, size} => pPUSH {src = replacer {use = true, def = false} src, base = replacer {use = true, def = true} base, size = size} | pPOP {dst, base, size} => pPOP {dst = replacer {use = false, def = true} dst, base = replacer {use = true, def = true} base, size = size} | PUSH {src, size} => PUSH {src = replacer {use = true, def = false} src, size = size} | POP {dst, size} => POP {dst = replacer {use = false, def = true} dst, size = size} | CX {size} => CX {size = size} | MOVX {oper, src, srcsize, dst, dstsize} => MOVX {oper = oper, src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | XVOM {src, srcsize, dst, dstsize} => XVOM {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | LEA {src, dst, size} => LEA {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | pFMOV {src, dst, size} => pFMOV {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, size = size} | pFMOVX {src, dst, srcsize, dstsize} => pFMOVX {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, srcsize = srcsize, dstsize = dstsize} | pFXVOM {src, dst, srcsize, dstsize} => pFXVOM {src = replacer {use = true, def = false} src, dst = replacer {use = false, def = true} dst, srcsize = srcsize, dstsize = dstsize} | pFLDC {oper, dst, size} => pFLDC {oper = oper, dst = replacer {use = false, def = true} dst, size = size} | pFMOVFI {src, srcsize, dst, dstsize} => pFMOVFI {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | pFMOVTI {src, dst, srcsize, dstsize} => pFMOVTI {src = replacer {use = true, def = false} src, srcsize = srcsize, dst = replacer {use = false, def = true} dst, dstsize = dstsize} | pFCOM {src1, src2, size} => pFCOM {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | pFUCOM {src1, src2, size} => pFUCOM {src1 = replacer {use = true, def = false} src1, src2 = replacer {use = true, def = false} src2, size = size} | pFBinA {oper, src, dst, size} => pFBinA {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | pFUnA {oper, dst, size} => pFUnA {oper = oper, dst = replacer {use = true, def = true} dst, size = size} | pFPTAN {dst, size} => pFPTAN {dst = replacer {use = true, def = true} dst, size = size} | pFBinAS {oper, src, dst, size} => pFBinAS {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size} | pFBinASP {oper, src, dst, size} => pFBinASP {oper = oper, src = replacer {use = true, def = true} src, dst = replacer {use = true, def = true} dst, size = size} | FLD {src, size} => FLD {src = replacer {use = true, def = false} src, size = size} | FST {dst, size, pop} => FST {dst = replacer {use = false, def = true} dst, size = size, pop = pop} | FILD {src, size} => FILD {src = replacer {use = true, def = false} src, size = size} | FIST {dst, size, pop} => FIST {dst = replacer {use = false, def = true} dst, size = size, pop = pop} | FXCH {src} => FXCH {src = replacer {use = true, def = true} src} | FLDC {oper} => FLDC {oper = oper} | FLDCW {src} => FLDCW {src = replacer {use = true, def = false} src} | FSTCW {dst, check} => FSTCW {dst = replacer {use = false, def = true} dst, check = check} | FSTSW {dst, check} => FSTSW {dst = replacer {use = false, def = true} dst, check = check} | FCOM {src, size, pop, pop'} => FCOM {src = replacer {use = true, def = false} src, size = size, pop = pop, pop' = pop'} | FUCOM {src, pop, pop'} => FUCOM {src = replacer {use = true, def = false} src, pop = pop, pop' = pop'} | FBinA {oper, src, dst, size, pop} => FBinA {oper = oper, src = replacer {use = true, def = false} src, dst = replacer {use = true, def = true} dst, size = size, pop = pop} | FUnA {oper} => FUnA {oper = oper} | FPTAN => FPTAN | FBinAS {oper} => FBinAS {oper = oper} | FBinASP {oper} => FBinASP {oper = oper} val nop = fn () => NOP val hlt = fn () => HLT val binal = BinAL val pmd = pMD val md = MD val imul2 = IMUL2 val unal = UnAL val sral = SRAL val cmp = CMP val test = TEST val setcc = SETcc val jmp = JMP val jcc = Jcc val call = CALL val ret = RET val mov = MOV val cmovcc = CMOVcc val xchg = XCHG val ppush = pPUSH val ppop = pPOP val push = PUSH val pop = POP val cx = CX val movx = MOVX val xvom = XVOM val lea = LEA val pfmov = pFMOV val pfmovx = pFMOVX val pfxvom = pFXVOM val pfldc = pFLDC val pfmovfi = pFMOVFI val pfmovti = pFMOVTI val pfcom = pFCOM val pfucom = pFUCOM val pfbina = pFBinA val pfuna = pFUnA val pfptan = pFPTAN val pfbinas = pFBinAS val pfbinasp = pFBinASP val fld = FLD val fst = FST val fild = FILD val fist = FIST val fxch = FXCH val fldc = FLDC val fldcw = FLDCW val fstcw = FSTCW val fstsw = FSTSW val fcom = FCOM val fucom = FUCOM val fbina = FBinA val funa = FUnA val fptan = fn () => FPTAN val fbinas = FBinAS val fbinasp = FBinASP end structure Directive = struct structure Id = struct val num : int ref = ref 0 datatype t = T of {num : int, plist: PropertyList.t} fun new () = let val id = T {num = !num, plist = PropertyList.new ()} val _ = Int.inc num in id end val plist = fn T {plist, ...} => plist val layout = let open Layout in fn T {num, ...} => seq [str "RegAlloc", Int.layout num] end val toString = Layout.toString o layout end datatype t (* Transfers *) (* Assert that a memloc is in a register with properties; * used at top of basic blocks to establish passing convention. *) = Assume of {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} | FltAssume of {assumes: {memloc: MemLoc.t, weight: int, sync: bool} list} (* Ensure that memloc is in the register, possibly reserverd; * used at bot of basic blocks to establish passing convention, * also used before C calls to set-up %esp. *) | Cache of {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} | FltCache of {caches: {memloc: MemLoc.t} list} (* Reset the register allocation; * used at bot of basic blocks that fall-thru * to a block with multiple incoming paths of control. *) | Reset (* Ensure that memlocs are commited to memory; * used at bot of basic blocks to establish passing conventions *) | Force of {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} (* C calls *) (* Prepare for a C call; i.e., clear all caller save registers; * also, clear the flt. register stack; * used before C calls. *) | CCall (* Assert the return value; * used after C calls. *) | Return of {returns: {src: Operand.t, dst: MemLoc.t} list} (* Misc. *) (* Assert that the register is not free for the allocator; * used ??? *) | Reserve of {registers: Register.t list} (* Assert that the register is free for the allocator; * used to free registers at fall-thru; * also used after C calls to free %esp. *) | Unreserve of {registers : Register.t list} (* Clear the floating point stack; * used at bot of basic blocks to establish passing convention *) | ClearFlt (* Save the register allocation in id and * assert that live are used at this point; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | SaveRegAlloc of {live: MemLocSet.t, id: Id.t} (* Restore the register allocation from id and * remove anything tracked that is not live; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | RestoreRegAlloc of {live: MemLocSet.t, id: Id.t} val toString = fn Assume {assumes} => concat["Assume: ", "assumes: ", List.fold (assumes, "", fn ({register, memloc, sync, reserve, ...}, s) => concat[MemLoc.toString memloc, " -> ", Register.toString register, if reserve then " (reserved)" else "", if sync then " (sync)" else "", " ", s])] | FltAssume {assumes} => concat["FltAssume: ", "assumes: ", List.fold (assumes, "", fn ({memloc, sync, ...}, s) => concat[MemLoc.toString memloc, if sync then " (sync)" else "", " ", s])] | Cache {caches} => concat["Cache: ", "caches: ", List.fold (caches, "", fn ({register, memloc, reserve}, s) => concat[MemLoc.toString memloc, " -> ", Register.toString register, if reserve then " (reserved)" else "", " ", s])] | FltCache {caches} => concat["FltCache: ", "caches: ", List.fold (caches, "", fn ({memloc}, s) => concat[MemLoc.toString memloc, " ", s])] | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => concat["Force: ", "commit_memlocs: ", MemLocSet.fold (commit_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "commit_classes: ", ClassSet.fold (commit_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s]), "remove_memlocs: ", MemLocSet.fold (remove_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "remove_classes: ", ClassSet.fold (remove_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s]), "dead_memlocs: ", MemLocSet.fold (dead_memlocs, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), "dead_classes: ", ClassSet.fold (dead_classes, "", fn (class,s) => concat[MemLoc.Class.toString class, " ", s])] | Reset => concat["Reset"] | CCall => concat["CCall"] | Return {returns} => concat["Return: ", List.toString (fn {src,dst} => concat ["(", Operand.toString src, ",", MemLoc.toString dst, ")"]) returns] | Reserve {registers} => concat["Reserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[Register.toString register, " ", s])] | Unreserve {registers} => concat["Unreserve: ", "registers: ", List.fold(registers, "", fn (register,s) => concat[Register.toString register, " ", s])] | ClearFlt => concat["ClearFlt"] | SaveRegAlloc {live, id} => concat["SaveRegAlloc: ", "live: ", MemLocSet.fold (live, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), Id.toString id] | RestoreRegAlloc {live, id} => concat["RestoreRegAlloc: ", "live: ", MemLocSet.fold (live, "", fn (memloc,s) => concat[MemLoc.toString memloc, " ", s]), Id.toString id] val layout = Layout.str o toString val uses_defs_kills = fn Assume {assumes} => List.fold (assumes, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.register register)::defs, kills = []}) | FltAssume {assumes} => List.fold (assumes, {uses = [], defs = [], kills = []}, fn ({memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = defs, kills = []}) | Cache {caches} => List.fold (caches, {uses = [], defs = [], kills = []}, fn ({register, memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = (Operand.register register)::defs, kills = []}) | FltCache {caches} => List.fold (caches, {uses = [], defs = [], kills = []}, fn ({memloc, ...}, {uses, defs, ...}) => {uses = (Operand.memloc memloc)::uses, defs = defs, kills = []}) | Reset => {uses = [], defs = [], kills = []} | Force {commit_memlocs, remove_memlocs, ...} => {uses = List.map(MemLocSet.toList commit_memlocs, Operand.memloc) @ List.map(MemLocSet.toList remove_memlocs, Operand.memloc), defs = [], kills = []} | CCall => {uses = [], defs = [], kills = []} | Return {returns} => let val uses = List.map(returns, fn {src, ...} => src) val defs = List.map(returns, fn {dst, ...} => Operand.memloc dst) in {uses = uses, defs = defs, kills = []} end | Reserve {...} => {uses = [], defs = [], kills = []} | Unreserve {...} => {uses = [], defs = [], kills = []} | ClearFlt => {uses = [], defs = [], kills = []} | SaveRegAlloc {live, ...} => {uses = List.map(MemLocSet.toList live, Operand.memloc), defs = [], kills = []} | RestoreRegAlloc {...} => {uses = [], defs = [], kills = []} val hints = fn Cache {caches} => List.map (caches, fn {register, memloc, ...} => (memloc, register)) | _ => [] fun replace replacer = fn Assume {assumes} => Assume {assumes = List.map (assumes, fn {register, memloc, weight, sync, reserve} => {register = register, memloc = memloc, weight = weight, sync = sync, reserve = reserve})} | FltAssume {assumes} => FltAssume {assumes = List.map (assumes, fn {memloc, weight, sync} => {memloc = memloc, weight = weight, sync = sync})} | Cache {caches} => Cache {caches = List.map (caches, fn {register, memloc, reserve} => {register = case replacer {use = false, def = true} (Operand.register register) of Operand.Register register => register | _ => Error.bug "x86.Directive.replace: Cache, register", memloc = case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Cache, memloc", reserve = reserve})} | FltCache {caches} => FltCache {caches = List.map (caches, fn {memloc} => {memloc = case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: FltCache, memloc"})} | Reset => Reset | Force {commit_memlocs, commit_classes, remove_memlocs, remove_classes, dead_memlocs, dead_classes} => Force {commit_memlocs = MemLocSet.map (commit_memlocs, fn memloc => case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Force, commit_memlocs"), commit_classes = commit_classes, remove_memlocs = MemLocSet.map (remove_memlocs, fn memloc => case replacer {use = true, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Force, remove_memlocs"), remove_classes = remove_classes, dead_memlocs = MemLocSet.map (dead_memlocs, fn memloc => case replacer {use = false, def = false} (Operand.memloc memloc) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Force, dead_memlocs"), dead_classes = dead_classes} | CCall => CCall | Return {returns} => Return {returns = List.map (returns, fn {src,dst} => {src = src, dst = case replacer {use = true, def = false} (Operand.memloc dst) of Operand.MemLoc memloc => memloc | _ => Error.bug "x86.Directive.replace: Return, returns"})} | Reserve {registers} => Reserve {registers = registers} | Unreserve {registers} => Unreserve {registers = registers} | ClearFlt => ClearFlt | SaveRegAlloc {live, id} => SaveRegAlloc {live = live, id = id} | RestoreRegAlloc {live, id} => RestoreRegAlloc {live = live, id = id} val assume = Assume val fltassume = FltAssume val cache = Cache val fltcache = FltCache val reset = fn () => Reset val force = Force val ccall = fn () => CCall val return = Return val reserve = Reserve val unreserve = Unreserve val saveregalloc = SaveRegAlloc val restoreregalloc = RestoreRegAlloc val clearflt = fn () => ClearFlt end structure PseudoOp = struct datatype t = Data | Text | SymbolStub | NonLazySymbolPointer | Balign of Immediate.t * Immediate.t option * Immediate.t option | P2align of Immediate.t * Immediate.t option * Immediate.t option | Space of Immediate.t * Immediate.t | Byte of Immediate.t list | Word of Immediate.t list | Long of Immediate.t list | String of string list | Global of Label.t | Hidden of Label.t | IndirectSymbol of Label.t | Local of Label.t | Comm of Label.t * Immediate.t * Immediate.t option val layout = let open Layout in fn Data => str ".data" | Text => str ".text" | SymbolStub => str ".section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5" | NonLazySymbolPointer => str ".section __IMPORT,__pointers,non_lazy_symbol_pointers" | Balign (i,fill,max) => seq [str ".balign ", Immediate.layout i, case (fill, max) of (NONE, NONE) => empty | (SOME fill, NONE) => seq [str ",", Immediate.layout fill] | (NONE, SOME max) => seq [str ",,", Immediate.layout max] | (SOME fill, SOME max) => seq [str ",", Immediate.layout fill, str ",", Immediate.layout max]] | P2align (i,fill,max) => seq [str ".p2align ", Immediate.layout i, case (fill, max) of (NONE, NONE) => empty | (SOME fill, NONE) => seq [str ",", Immediate.layout fill] | (NONE, SOME max) => seq [str ",,", Immediate.layout max] | (SOME fill, SOME max) => seq [str ",", Immediate.layout fill, str ",", Immediate.layout max]] | Space (i,f) => seq [str ".space ", Immediate.layout i, str ",", Immediate.layout f] | Byte bs => seq [str ".byte ", seq (separate(List.map (bs, Immediate.layout), ","))] | Word ws => seq [str ".word ", seq (separate(List.map (ws, Immediate.layout), ","))] | Long ls => seq [str ".long ", seq (separate(List.map (ls, Immediate.layout), ","))] | String ss => seq [str ".ascii ", seq (separate(List.map (ss, fn s => seq [str "\"", str (String_escapeASM s), str "\""]), ","))] | Global l => seq [str ".globl ", Label.layout l] | Hidden l => (* visibility directive depends on target object file *) let val elf = seq [str ".hidden ", Label.layout l] val macho = seq [str ".private_extern ", Label.layout l] val coff = seq [str "/* ", str ".hidden ", Label.layout l, str " */"] in case !Control.Target.os of MLton.Platform.OS.Cygwin => coff | MLton.Platform.OS.Darwin => macho | MLton.Platform.OS.MinGW => coff | _ => elf end | IndirectSymbol l => seq [str ".indirect_symbol ", Label.layout l] | Local l => seq [str ".local ", Label.layout l] | Comm (l, i, a) => seq [str ".comm ", Label.layout l, str ",", Immediate.layout i, case a of NONE => empty | SOME i => seq [str ",", Immediate.layout i]] end val toString = Layout.toString o layout fun replace replacer = let val replacerLabel = fn label => case Operand.deLabel (replacer {use = true, def = false} (Operand.label label)) of SOME label => label | NONE => Error.bug "x86.PseudoOp.replace.replacerLabel" val replacerImmediate = fn immediate => case Operand.deImmediate (replacer {use = true, def = false} (Operand.immediate immediate)) of SOME immediate => immediate | NONE => Error.bug "x86.PseudoOp.replace.replacerImmediate" in fn Data => Data | Text => Text | SymbolStub => SymbolStub | NonLazySymbolPointer => NonLazySymbolPointer | Balign (i,fill,max) => Balign (replacerImmediate i, Option.map(fill, replacerImmediate), Option.map(max, replacerImmediate)) | P2align (i,fill,max) => P2align (replacerImmediate i, Option.map(fill, replacerImmediate), Option.map(max, replacerImmediate)) | Space (i,f) => Space (replacerImmediate i, replacerImmediate f) | Byte bs => Byte (List.map(bs, replacerImmediate)) | Word ws => Word (List.map(ws, replacerImmediate)) | Long ls => Long (List.map(ls, replacerImmediate)) | String ss => String ss | Global l => Global (replacerLabel l) | Hidden l => Hidden (replacerLabel l) | IndirectSymbol l => IndirectSymbol (replacerLabel l) | Local l => Local (replacerLabel l) | Comm (l, i, a) => Comm (replacerLabel l, replacerImmediate i, Option.map(a, replacerImmediate)) end val data = fn () => Data val text = fn () => Text val symbol_stub = fn () => SymbolStub val non_lazy_symbol_pointer = fn () => NonLazySymbolPointer val balign = Balign val p2align = P2align val space = Space val byte = Byte val word = Word val long = Long val string = String val global = Global val hidden = Hidden val indirect_symbol = IndirectSymbol val locall = Local val comm = Comm end structure Assembly = struct datatype t = Comment of string | Directive of Directive.t | PseudoOp of PseudoOp.t | Label of Label.t | Instruction of Instruction.t val layout = let open Layout in fn Comment s => seq [str "/* ", str s, str " */"] | Directive d => seq [str "# directive: ", Directive.layout d] | PseudoOp p => seq [PseudoOp.layout p] | Label l => seq [Label.layout l, str ":"] | Instruction i => seq [str "\t", Instruction.layout i] end val toString = Layout.toString o layout val uses_defs_kills = fn Comment _ => {uses = [], defs = [], kills = []} | Directive d => Directive.uses_defs_kills d | PseudoOp _ => {uses = [], defs = [], kills = []} | Label _ => {uses = [], defs = [], kills = []} | Instruction i => Instruction.uses_defs_kills i val hints = fn Comment _ => [] | Directive d => Directive.hints d | PseudoOp _ => [] | Label _ => [] | Instruction i => Instruction.hints i fun replace replacer = fn Comment s => Comment s | Directive d => Directive (Directive.replace replacer d) | PseudoOp p => PseudoOp (PseudoOp.replace replacer p) | Label l => Label (case Operand.deLabel (replacer {use = false, def = true} (Operand.label l)) of SOME l => l | NONE => Error.bug "x86.Assembly.replace, Label") | Instruction i => Instruction (Instruction.replace replacer i) val comment = Comment val isComment = fn Comment _ => true | _ => false val directive = Directive val directive_assume = Directive o Directive.assume val directive_fltassume = Directive o Directive.fltassume val directive_cache = Directive o Directive.cache val directive_fltcache = Directive o Directive.fltcache val directive_reset = Directive o Directive.reset val directive_force = Directive o Directive.force val directive_ccall = Directive o Directive.ccall val directive_return = Directive o Directive.return val directive_reserve = Directive o Directive.reserve val directive_unreserve = Directive o Directive.unreserve val directive_saveregalloc = Directive o Directive.saveregalloc val directive_restoreregalloc = Directive o Directive.restoreregalloc val directive_clearflt = Directive o Directive.clearflt val pseudoop = PseudoOp val pseudoop_data = PseudoOp o PseudoOp.data val pseudoop_text = PseudoOp o PseudoOp.text val pseudoop_symbol_stub = PseudoOp o PseudoOp.symbol_stub val pseudoop_non_lazy_symbol_pointer = PseudoOp o PseudoOp.non_lazy_symbol_pointer val pseudoop_balign = PseudoOp o PseudoOp.balign val pseudoop_p2align = PseudoOp o PseudoOp.p2align val pseudoop_space = PseudoOp o PseudoOp.space val pseudoop_byte = PseudoOp o PseudoOp.byte val pseudoop_word = PseudoOp o PseudoOp.word val pseudoop_long = PseudoOp o PseudoOp.long val pseudoop_string = PseudoOp o PseudoOp.string val pseudoop_global = PseudoOp o PseudoOp.global val pseudoop_hidden = PseudoOp o PseudoOp.hidden val pseudoop_indirect_symbol = PseudoOp o PseudoOp.indirect_symbol val pseudoop_local = PseudoOp o PseudoOp.locall val pseudoop_comm = PseudoOp o PseudoOp.comm val label = Label val instruction = Instruction val instruction_nop = Instruction o Instruction.nop val instruction_hlt = Instruction o Instruction.hlt val instruction_binal = Instruction o Instruction.binal val instruction_pmd = Instruction o Instruction.pmd val instruction_md = Instruction o Instruction.md val instruction_imul2 = Instruction o Instruction.imul2 val instruction_unal = Instruction o Instruction.unal val instruction_sral = Instruction o Instruction.sral val instruction_cmp = Instruction o Instruction.cmp val instruction_test = Instruction o Instruction.test val instruction_setcc = Instruction o Instruction.setcc val instruction_jmp = Instruction o Instruction.jmp val instruction_jcc = Instruction o Instruction.jcc val instruction_call = Instruction o Instruction.call val instruction_ret = Instruction o Instruction.ret val instruction_mov = Instruction o Instruction.mov val instruction_cmovcc = Instruction o Instruction.cmovcc val instruction_xchg = Instruction o Instruction.xchg val instruction_ppush = Instruction o Instruction.ppush val instruction_ppop = Instruction o Instruction.ppop val instruction_push = Instruction o Instruction.push val instruction_pop = Instruction o Instruction.pop val instruction_cx = Instruction o Instruction.cx val instruction_movx = Instruction o Instruction.movx val instruction_xvom = Instruction o Instruction.xvom val instruction_lea = Instruction o Instruction.lea val instruction_pfmov = Instruction o Instruction.pfmov val instruction_pfmovx = Instruction o Instruction.pfmovx val instruction_pfxvom = Instruction o Instruction.pfxvom val instruction_pfldc = Instruction o Instruction.pfldc val instruction_pfmovfi = Instruction o Instruction.pfmovfi val instruction_pfmovti = Instruction o Instruction.pfmovti val instruction_pfcom = Instruction o Instruction.pfcom val instruction_pfucom = Instruction o Instruction.pfucom val instruction_pfbina = Instruction o Instruction.pfbina val instruction_pfuna = Instruction o Instruction.pfuna val instruction_pfptan = Instruction o Instruction.pfptan val instruction_pfbinas = Instruction o Instruction.pfbinas val instruction_pfbinasp = Instruction o Instruction.pfbinasp val instruction_fld = Instruction o Instruction.fld val instruction_fst = Instruction o Instruction.fst val instruction_fild = Instruction o Instruction.fild val instruction_fist = Instruction o Instruction.fist val instruction_fxch = Instruction o Instruction.fxch val instruction_fldc = Instruction o Instruction.fldc val instruction_fldcw = Instruction o Instruction.fldcw val instruction_fstcw = Instruction o Instruction.fstcw val instruction_fstsw = Instruction o Instruction.fstsw val instruction_fcom = Instruction o Instruction.fcom val instruction_fucom = Instruction o Instruction.fucom val instruction_fbina = Instruction o Instruction.fbina val instruction_funa = Instruction o Instruction.funa val instruction_fptan = Instruction o Instruction.fptan val instruction_fbinas = Instruction o Instruction.fbinas val instruction_fbinasp = Instruction o Instruction.fbinasp end structure FrameInfo = struct datatype t = T of {size: int, frameLayoutsIndex: int} fun toString (T {size, frameLayoutsIndex}) = concat ["{", "size = ", Int.toString size, ", ", "frameLayoutsIndex = ", Int.toString frameLayoutsIndex, "}"] end structure Entry = struct datatype t = Jump of {label: Label.t} | Func of {label: Label.t, live: MemLocSet.t} | Cont of {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} | Handler of {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} | CReturn of {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} val toString = fn Jump {label} => concat ["Jump::", Label.toString label] | Func {label, live} => concat ["Func::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | Cont {label, live, frameInfo} => concat ["Cont::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] ", FrameInfo.toString frameInfo] | Handler {frameInfo, label, live} => concat ["Handler::", Label.toString label, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] (", FrameInfo.toString frameInfo, ")"] | CReturn {dsts, frameInfo, func, label} => concat ["CReturn::", Label.toString label, " ", Vector.toString (fn (dst,_) => Operand.toString dst) dsts, " ", (CFunction.Target.toString o CFunction.target) func, " ", case frameInfo of NONE => "" | SOME f => FrameInfo.toString f] val uses_defs_kills = fn CReturn {dsts, func, ...} => let val uses = List.map (Operand.cReturnTemps (CFunction.return func), fn {dst, ...} => Operand.memloc dst) in {uses = uses, defs = Vector.toListMap(dsts, fn (dst, _) => dst), kills = []} end | _ => {uses = [], defs = [], kills = []} val label = fn Jump {label, ...} => label | Func {label, ...} => label | Cont {label, ...} => label | Handler {label, ...} => label | CReturn {label, ...} => label val live = fn Func {live, ...} => live | Cont {live, ...} => live | Handler {live, ...} => live | _ => MemLocSet.empty val jump = Jump val func = Func val isFunc = fn Func _ => true | _ => false val cont = Cont val handler = Handler val creturn = CReturn end structure Transfer = struct structure Cases = struct datatype 'a t = Word of (WordX.t * 'a) list val word = Word fun isEmpty cases = case cases of Word [] => true | _ => false fun isSingle cases = case cases of Word [_] => true | _ => false fun extract(cases,f) = let fun doit [(k,target)] = f (k, target) | doit _ = Error.bug "x86.Transfer.Cases.extract" in case cases of Word cases => doit cases end fun count(cases, p) = let fun doit [] = (0 : int) | doit ((_,target)::cases) = let val n = doit cases in if p target then 1 + n else n end in case cases of Word cases => doit cases end fun keepAll(cases, p) = let fun doit l = List.keepAll(l, fn (k,target) => p (k,target)) in case cases of Word cases => Word(doit cases) end fun forall(cases, f) = let fun doit l = List.forall(l, fn (k, target) => f (k, target)) in case cases of Word cases => doit cases end fun foreach(cases, f) = let fun doit l = List.foreach(l, fn (k, target) => f (k, target)) in case cases of Word cases => doit cases end fun map(cases, f) = let fun doit l = List.map(l, fn (k,target) => (k, f (k, target))) in case cases of Word cases => Word(doit cases) end fun mapToList(cases, f) = let fun doit l = List.map(l, fn (k,target) => f (k, target)) in case cases of Word cases => doit cases end end datatype t = Goto of {target: Label.t} | Iff of {condition: Instruction.condition, truee: Label.t, falsee: Label.t} | Switch of {test: Operand.t, cases: Label.t Cases.t, default: Label.t} | Tail of {target: Label.t, live: MemLocSet.t} | NonTail of {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} | Return of {live: MemLocSet.t} | Raise of {live: MemLocSet.t} | CCall of {args: (Operand.t * Size.t) list, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, return: Label.t option} val toString = fn Goto {target} => concat ["GOTO ", Label.toString target] | Iff {condition, truee, falsee} => concat["IF ", Instruction.condition_toString condition, " THEN GOTO ", Label.toString truee, " ELSE GOTO ", Label.toString falsee] | Switch {test, cases, default} => (concat["SWITCH ", Operand.toString test]) ^ (concat o Cases.mapToList) (cases, fn (w, target) => concat[" (", WordX.toString w, " -> GOTO ", Label.toString target, ")"]) ^ (concat[" GOTO ", Label.toString default]) | Tail {target, live} => concat ["TAIL ", Label.toString target, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | NonTail {target, live, return, handler, size} => concat ["NONTAIL ", Label.toString target, " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "] <", Label.toString return, " ", Int.toString size, "> {", case handler of SOME handler => Label.toString handler | NONE => "", "}"] | Return {live} => concat ["RETURN", " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | Raise {live} => concat ["RAISE", " [", (concat o List.separate) (MemLocSet.fold (live, [], fn (memloc, l) => (MemLoc.toString memloc)::l), ", "), "]"] | CCall {args, func, return, ...} => concat ["CCALL ", (CFunction.Convention.toString o CFunction.convention) func, " ", (CFunction.Target.toString o CFunction.target) func, "(", (concat o List.separate) (List.map(args, fn (oper,_) => Operand.toString oper), ", "), ") <", Option.toString Label.toString return, ">"] val uses_defs_kills = fn Switch {test, ...} => {uses = [test], defs = [], kills = []} | CCall {args, func, ...} => let val defs = List.map (Operand.cReturnTemps (CFunction.return func), fn {dst, ...} => Operand.memloc dst) in {uses = List.map(args, fn (oper,_) => oper), defs = defs, kills = []} end | _ => {uses = [], defs = [], kills = []} val nearTargets = fn Goto {target} => [target] | Iff {truee,falsee,...} => [truee,falsee] | Switch {cases,default,...} => default::(Cases.mapToList (cases, fn (_,target) => target)) | NonTail {return,handler,...} => return::(case handler of NONE => nil | SOME handler => [handler]) | CCall {return, ...} => (case return of NONE => [] | SOME l => [l]) | _ => [] val live = fn Tail {live,...} => live | NonTail {live,...} => live | Return {live,...} => live | Raise {live,...} => live | _ => MemLocSet.empty fun replace replacer = fn Switch {test, cases, default} => Switch {test = replacer {use = true, def = false} test, cases = cases, default = default} | CCall {args, frameInfo, func, return} => CCall {args = List.map(args, fn (oper,size) => (replacer {use = true, def = false} oper, size)), frameInfo = frameInfo, func = func, return = return} | transfer => transfer val goto = Goto val iff = Iff val switch = Switch val tail = Tail val nontail = NonTail val return = Return val raisee = Raise val ccall = CCall end structure ProfileLabel = struct open ProfileLabel fun toAssembly pl = let val label = Label.fromString (toString pl) in [Assembly.pseudoop_global label, Assembly.pseudoop_hidden label, Assembly.label label] end fun toAssemblyOpt pl = case pl of NONE => [] | SOME pl => toAssembly pl end structure Block = struct datatype t' = T' of {entry: Entry.t option, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t option} fun mkBlock' {entry, statements, transfer} = T' {entry = entry, profileLabel = NONE, statements = statements, transfer = transfer} fun mkProfileBlock' {profileLabel} = T' {entry = NONE, profileLabel = SOME profileLabel, statements = [], transfer = NONE} datatype t = T of {entry: Entry.t, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t} fun printBlock (T {entry, profileLabel, statements, transfer, ...}) = (print (Entry.toString entry); print ":\n"; Option.app (profileLabel, fn profileLabel => (print (ProfileLabel.toString profileLabel); print ":\n")); List.foreach (statements, fn asm => (print (Assembly.toString asm); print "\n")); print (Transfer.toString transfer); print "\n") fun printBlock' (T' {entry, profileLabel, statements, transfer, ...}) = (print (if isSome entry then Entry.toString (valOf entry) else "---"); print ":\n"; Option.app (profileLabel, fn profileLabel => (print (ProfileLabel.toString profileLabel); print ":\n")); List.foreach (statements, fn asm => (print (Assembly.toString asm); print "\n")); print (if isSome transfer then Transfer.toString (valOf transfer) else "NONE"); print "\n") val compress': t' list -> t' list = fn l => List.fold (rev l, [], fn (b' as T' {entry, profileLabel, statements, transfer}, ac) => case transfer of SOME _ => b' :: ac | NONE => case ac of [] => Error.bug "x86.Block.compress': dangling transfer" | b2' :: ac => let val T' {entry = entry2, profileLabel = profileLabel2, statements = statements2, transfer = transfer2} = b2' in case entry2 of SOME _ => Error.bug "x86.Block.compress': mismatched transfer" | NONE => let val (pl, ss) = case (profileLabel, statements) of (NONE, []) => (profileLabel2, statements2) | _ => (profileLabel, statements @ (ProfileLabel.toAssemblyOpt profileLabel2) @ statements2) in T' {entry = entry, profileLabel = pl, statements = ss, transfer = transfer2} :: ac end end) val compress: t' list -> t list = fn l => List.map (compress' l, fn T' {entry, profileLabel, statements, transfer} => case (entry, transfer) of (SOME e, SOME t) => T {entry = e, profileLabel = profileLabel, statements = statements, transfer = t} | _ => Error.bug "x86.Block.compress") end structure Chunk = struct datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end mlton-20100608/mlton/codegen/x86-codegen/x86.sig0000644000076600000240000013140011404435625017477 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature X86_STRUCTS = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure ProfileLabel: PROFILE_LABEL structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize end signature X86 = sig structure CFunction: C_FUNCTION structure CType: C_TYPE structure Label: ID structure RepType: REP_TYPE structure Runtime: RUNTIME structure WordSize: WORD_SIZE structure WordX: WORD_X sharing CFunction = RepType.CFunction sharing CType = RepType.CType sharing WordSize = CType.WordSize = WordX.WordSize val tracer : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val tracerTop : string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) structure Size : sig datatype class = INT | FLT | FPI datatype t = BYTE | WORD | LONG | SNGL | DBLE | EXTD | FPIS | FPIL | FPIQ val toString : t -> string val fromBytes : int -> t val toBytes : t -> int val fromCType : CType.t -> t vector val class : t -> class val toFPI : t -> t val eq : t * t -> bool val lt : t * t -> bool end structure Register : sig datatype reg = EAX | EBX | ECX | EDX | EDI | ESI | EBP | ESP val allReg : reg list datatype part = E | X | L | H datatype t = T of {reg: reg, part: part} val all : t list val toString : t -> string val size : t -> Size.t val eq : t * t -> bool val valid : t -> bool val coincide : t * t -> bool val coincident' : reg -> t list (* val return : Size.t -> t *) val eax : t val ebx : t val ecx : t val edx : t val al : t val bl : t val cl : t val dl : t val edi : t val esi : t val esp : t val ebp : t val registers : Size.t -> t list val baseRegisters : t list val indexRegisters : t list val callerSaveRegisters : t list val calleeSaveRegisters : t list val withLowPart : Size.t * Size.t -> t list val lowPartOf : t * Size.t -> t end structure FltRegister : sig datatype t = T of int val toString : t -> string val eq: t * t -> bool (* val return : t *) val top : t val one : t val total : int val push : t -> t val pop : t -> t val id : t -> t end structure Immediate : sig type t datatype u = Word of WordX.t | Label of Label.t | LabelPlusWord of Label.t * WordX.t val word : WordX.t -> t val int' : int * WordSize.t -> t val int : int -> t val zero : t val label : Label.t -> t val labelPlusWord : Label.t * WordX.t -> t val labelPlusInt : Label.t * int -> t val deLabel : t -> Label.t option val destruct : t -> u val clearAll : unit -> unit val eval : t -> WordX.t option val isZero : t -> bool val eq : t * t -> bool end structure Scale : sig datatype t = One | Two | Four | Eight val eq : t * t -> bool val toWordX : t -> WordX.t val toImmediate : t -> Immediate.t val fromBytes : int -> t val fromCType : CType.t -> t end structure Address : sig datatype t = T of {disp: Immediate.t option, base: Register.t option, index: Register.t option, scale: Scale.t option} end structure MemLoc : sig structure Class : sig type t val toString : t -> string val new : {name: string} -> t val Temp : t val StaticTemp : t val CStack : t val Code : t val eq : t * t -> bool val compare : t * t -> order end type t datatype u = U of {immBase: Immediate.t option, memBase: t option, immIndex: Immediate.t option, memIndex: t option, scale: Scale.t, size: Size.t, class: Class.t} val layout : t -> Layout.t val toString : t -> string val imm : {base: Immediate.t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val basic : {base: Immediate.t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val simple : {base: t, index: Immediate.t, scale: Scale.t, size: Size.t, class: Class.t} -> t val complex : {base: t, index: t, scale: Scale.t, size: Size.t, class: Class.t} -> t val shift : {origin: t, disp: Immediate.t, scale: Scale.t, size: Size.t} -> t val destruct : t -> u val clearAll : unit -> unit val size : t -> Size.t val class : t -> Class.t val eq : t * t -> bool val compare : t * t -> order val utilized : t -> t list val mayAlias : t * t -> bool val mayAliasOrd : t * t -> order option val replace : (t -> t) -> t -> t (* * Static memory locations *) val makeContents : {base: Immediate.t, size: Size.t, class: Class.t} -> t (* CReturn locations *) (* val cReturnTempContent : Size.t -> t val cReturnTempContents : CFunction.CType.t -> t list *) end structure ClassSet : SET sharing type ClassSet.Element.t = MemLoc.Class.t structure MemLocSet : SET sharing type MemLocSet.Element.t = MemLoc.t structure Operand : sig datatype t = Register of Register.t | FltRegister of FltRegister.t | Immediate of Immediate.t | Label of Label.t | Address of Address.t | MemLoc of MemLoc.t val layout : t -> Layout.t val toString : t -> string val register : Register.t -> t val deRegister : t -> Register.t option val fltregister : FltRegister.t -> t val deFltregister : t -> FltRegister.t option val immediate : Immediate.t -> t val immediate_word : WordX.t -> t val immediate_int' : int * WordSize.t -> t val immediate_int : int -> t val immediate_zero : t val immediate_label : Label.t -> t val deImmediate : t -> Immediate.t option val label : Label.t -> t val deLabel : t -> Label.t option val address : Address.t -> t val memloc : MemLoc.t -> t val memloc_label : Label.t -> t val deMemloc : t -> MemLoc.t option val size : t -> Size.t option val eq : t * t -> bool val mayAlias : t * t -> bool val cReturnTemps: RepType.t -> {src: t, dst: MemLoc.t} list end structure Instruction : sig (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) datatype binal = ADD (* signed/unsigned addition; p. 63 *) | ADC (* signed/unsigned addition with carry; p. 61 *) | SUB (* signed/unsigned subtraction; p. 713 *) | SBB (* signed/unsigned subtraction with borrow; p. 667 *) | AND (* logical and; p. 70 *) | OR (* logical or; p. 499 *) | XOR (* logical xor; p. 758 *) (* Integer multiplication and division. *) datatype md = IMUL (* signed multiplication (one operand form); p. 335 *) | MUL (* unsigned multiplication; p. 488 *) | IDIV (* signed division; p. 332 *) | DIV (* unsigned division; p. 188 *) | IMOD (* signed modulus; *) | MOD (* unsigned modulus; *) (* Integer unary arithmetic/logic instructions. *) datatype unal = INC (* increment by 1; p. 341 *) | DEC (* decrement by 1; p. 186 *) | NEG (* two's complement negation; p. 494 *) | NOT (* one's complement negation; p. 497 *) (* Integer shift/rotate arithmetic/logic instructions. *) datatype sral = SAL (* shift arithmetic left; p. 662 *) | SHL (* shift logical left; p. 662 *) | SAR (* shift arithmetic right; p. 662 *) | SHR (* shift logical right; p. 662 *) | ROL (* rotate left; p. 631 *) | RCL (* rotate through carry left; p. 631 *) | ROR (* rotate right; p. 631 *) | RCR (* rotate through carry right; p. 631 *) (* Move with extention instructions. *) datatype movx = MOVSX (* move with sign extention; p. 481 *) | MOVZX (* move with zero extention; p. 486 *) (* Condition test field; p. 795 *) datatype condition = O (* overflow *) | NO (* not overflow *) | B (* below *) | NB (* not below *) | AE (* above or equal *) | NAE (* not above or equal *) | C (* carry *) | NC (* not carry *) | E (* equal *) | NE (* not equal *) | Z (* zero *) | NZ (* not zero *) | BE (* below or equal *) | NBE (* not below or equal *) | A (* above *) | NA (* not above *) | S (* sign *) | NS (* not sign *) | P (* parity *) | NP (* not parity *) | PE (* parity even *) | PO (* parity odd *) | L (* less than *) | NL (* not less than *) | LE (* less than or equal *) | NLE (* not less than or equal *) | G (* greater than *) | NG (* not greater than *) | GE (* greater than or equal *) | NGE (* not greater than or equal *) val condition_negate : condition -> condition val condition_reverse : condition -> condition (* Floating-point binary arithmetic instructions. *) datatype fbina = FADD (* addition; p. 205 *) | FSUB (* subtraction; p. 297 *) | FSUBR (* reversed subtraction; p. 301 *) | FMUL (* multiplication; p. 256 *) | FDIV (* division; p. 229 *) | FDIVR (* reversed division; p. 233 *) val fbina_reverse : fbina -> fbina (* Floating-point unary arithmetic instructions. *) datatype funa = F2XM1 (* compute 2^x-1; p. 201 *) | FABS (* absolute value; p. 203 *) | FCHS (* change sign; p. 214 *) | FSQRT (* square root; p. 284 *) | FSIN (* sine; p. 280 *) | FCOS (* cosine; p. 226 *) | FRNDINT (* round to integer; p. 271 *) (* Floating-point binary arithmetic stack instructions. *) datatype fbinas = FSCALE (* scale; p. 278 *) | FPREM (* partial remainder; p. 263 *) | FPREM1 (* IEEE partial remainder; p. 266 *) (* floating point binary arithmetic stack pop instructions. *) datatype fbinasp = FYL2X (* compute y * log_2 x; p. 327 *) | FYL2XP1 (* compute y * log_2 (x + 1.0); p. 329 *) | FPATAN (* partial arctangent; p. 261 *) (* Floating-point constants. *) datatype fldc = ONE (* +1.0; p. 250 *) | ZERO (* +0.0; p. 250 *) | PI (* pi; p. 250 *) | L2E (* log_2 e; p. 250 *) | LN2 (* log_e 2; p. 250 *) | L2T (* log_2 10; p. 250 *) | LG2 (* log_10 2; p. 250 *) (* x86 Instructions. * src operands are not changed by the instruction. * dst operands are changed by the instruction. *) datatype t (* No operation *) = NOP (* Halt *) | HLT (* Integer binary arithmetic(w/o mult & div)/logic instructions. *) | BinAL of {oper: binal, src: Operand.t, dst: Operand.t, size: Size.t} (* Psuedo integer multiplication and division. *) | pMD of {oper: md, src: Operand.t, dst: Operand.t, size: Size.t} (* Integer multiplication and division. *) | MD of {oper: md, src: Operand.t, size: Size.t} (* Integer signed/unsiged multiplication (two operand form); p. 335 *) | IMUL2 of {src: Operand.t, dst: Operand.t, size: Size.t} (* Integer unary arithmetic/logic instructions. *) | UnAL of {oper: unal, dst: Operand.t, size: Size.t} (* Integer shift/rotate arithmetic/logic instructions. *) | SRAL of {oper: sral, count: Operand.t, dst: Operand.t, size: Size.t} (* Arithmetic compare. *) | CMP of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Logical compare. *) | TEST of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Set byte on condition. *) | SETcc of {condition: condition, dst: Operand.t, size: Size.t} (* Jump; p. 373 *) | JMP of {target: Operand.t, absolute: bool} (* Jump if condition is met. *) | Jcc of {condition: condition, target: Operand.t} (* Call procedure. *) | CALL of {target: Operand.t, absolute: bool} (* Return from procedure. *) | RET of {src: Operand.t option} (* Move. *) | MOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Conditional move. *) | CMOVcc of {condition: condition, src: Operand.t, dst: Operand.t, size: Size.t} (* Exchange register/memory with register. *) | XCHG of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo push a value onto a stack. *) | pPUSH of {src: Operand.t, base: Operand.t, size: Size.t} (* Pseudo pop a value from a stack. *) | pPOP of {dst: Operand.t, base: Operand.t, size: Size.t} (* Push a value onto the stack. *) | PUSH of {src: Operand.t, size: Size.t} (* Pop a value from the stack. *) | POP of {dst: Operand.t, size: Size.t} (* Convert X to 2X with sign extension. *) | CX of {size: Size.t} (* Move with extention. *) | MOVX of {oper: movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Move with contraction. *) | XVOM of {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} (* Load effective address. *) | LEA of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point move. *) | pFMOV of {src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point move with extension. *) | pFMOVX of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point move with contraction. *) | pFXVOM of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point load constant. *) | pFLDC of {oper: fldc, dst: Operand.t, size: Size.t} (* Pseudo floating-point move from integer. *) | pFMOVFI of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point move to integer. *) | pFMOVTI of {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} (* Pseudo floating-point compare. *) | pFCOM of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Pseudo floating-point unordered compare. *) | pFUCOM of {src1: Operand.t, src2: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic instructions. *) | pFBinA of {oper: fbina, src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point unary arithmetic instructions. *) | pFUnA of {oper: funa, dst: Operand.t, size: Size.t} (* Pseudo floating-point partial tangetn instruction. *) | pFPTAN of {dst: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic stack instructions. *) | pFBinAS of {oper: fbinas, src: Operand.t, dst: Operand.t, size: Size.t} (* Pseudo floating-point binary arithmetic stack pop instructions. *) | pFBinASP of {oper: fbinasp, src: Operand.t, dst: Operand.t, size: Size.t} (* Floating-point load real. *) | FLD of {src: Operand.t, size: Size.t} (* Floating-point store real. *) | FST of {dst: Operand.t, size: Size.t, pop: bool} (* Floating-point load integer. *) | FILD of {src: Operand.t, size: Size.t} (* Floating-point store integer. *) | FIST of {dst: Operand.t, size: Size.t, pop: bool} (* Floating-point exchange. *) | FXCH of {src: Operand.t} (* Floating-point load constant. *) | FLDC of {oper: fldc} (* Floating-point load control word. *) | FLDCW of {src: Operand.t} (* Floating-point store control word. *) | FSTCW of {dst: Operand.t, check: bool} (* Floating-point store status word. *) | FSTSW of {dst: Operand.t, check: bool} (* Floating-point compare. *) | FCOM of {src: Operand.t, size: Size.t, pop: bool, pop': bool} (* Floating-point unordered compare. *) | FUCOM of {src: Operand.t, pop: bool, pop': bool} (* Floating-point binary arithmetic instructions. *) | FBinA of {oper: fbina, src: Operand.t, dst: Operand.t, size: Size.t, pop: bool} (* Floating-point unary arithmetic instructions. *) | FUnA of {oper: funa} (* Floating-point partial tangent instruction. *) | FPTAN (* Floating-point binary arithmetic stack instructions. *) | FBinAS of {oper: fbinas} (* Floating-point binary arithmetic stack pop instructions. *) | FBinASP of {oper: fbinasp} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val srcs_dsts : t -> {srcs: Operand.t list option, dsts: Operand.t list option} val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t end structure Directive : sig structure Id : sig type t val new : unit -> t val plist : t -> PropertyList.t end datatype t (* Transfers *) (* Assert that a memloc is in a register with properties; * used at top of basic blocks to establish passing convention. *) = Assume of {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} | FltAssume of {assumes: {memloc: MemLoc.t, weight: int, sync: bool} list} (* Ensure that memloc is in the register, possibly reserved; * used at bot of basic blocks to establish passing convention, * also used before C calls to set-up %esp. *) | Cache of {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} | FltCache of {caches: {memloc: MemLoc.t} list} (* Reset the register allocation; * used at bot of basic blocks that fall-thru * to a block with multiple incoming paths of control. *) | Reset (* Ensure that memlocs are commited to memory; * used at bot of basic blocks to establish passing conventions *) | Force of {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} (* C calls *) (* Prepare for a C call; i.e., clear all caller save registers; * also, clear the flt. register stack; * used before C calls. *) | CCall (* Assert the return value; * used after C calls. *) | Return of {returns: {src:Operand.t, dst: MemLoc.t} list} (* Misc. *) (* Assert that the register is not free for the allocator; * used ??? *) | Reserve of {registers: Register.t list} (* Assert that the register is free for the allocator; * used to free registers at fall-thru; * also used after C calls to free %esp. *) | Unreserve of {registers: Register.t list} (* Clear the floating point stack; * used at bot of basic blocks to establish passing convention, *) | ClearFlt (* Save the register allocation in id and * assert that live are used at this point; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | SaveRegAlloc of {live: MemLocSet.t, id: Id.t} (* Restore the register allocation from id and * remove anything tracked that is not live; * used at bot of basic blocks to delay establishment * of passing convention to compensation block *) | RestoreRegAlloc of {live: MemLocSet.t, id: Id.t} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val assume : {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val fltassume : {assumes: {memloc: MemLoc.t, weight: int, sync: bool} list} -> t val cache : {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} -> t val fltcache : {caches: {memloc: MemLoc.t} list} -> t val reset : unit -> t val force : {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} -> t val ccall : unit -> t val return : {returns: {src: Operand.t, dst: MemLoc.t} list} -> t val reserve : {registers: Register.t list} -> t val unreserve : {registers: Register.t list} -> t val clearflt : unit -> t val saveregalloc : {live: MemLocSet.t, id: Id.t} -> t val restoreregalloc : {live: MemLocSet.t, id: Id.t} -> t end structure PseudoOp : sig datatype t = Data | Text | SymbolStub | NonLazySymbolPointer | Balign of Immediate.t * Immediate.t option * Immediate.t option | P2align of Immediate.t * Immediate.t option * Immediate.t option | Space of Immediate.t * Immediate.t | Byte of Immediate.t list | Word of Immediate.t list | Long of Immediate.t list | String of string list | Global of Label.t | Hidden of Label.t | IndirectSymbol of Label.t | Local of Label.t | Comm of Label.t * Immediate.t * Immediate.t option val toString : t -> string val data : unit -> t val text : unit -> t val symbol_stub : unit -> t val non_lazy_symbol_pointer : unit -> t val balign : Immediate.t * Immediate.t option * Immediate.t option -> t val p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val space : Immediate.t * Immediate.t -> t val byte : Immediate.t list -> t val word : Immediate.t list -> t val long : Immediate.t list -> t val string : string list -> t val global : Label.t -> t val hidden : Label.t -> t val indirect_symbol : Label.t -> t val locall : Label.t -> t val comm : Label.t * Immediate.t * Immediate.t option -> t end structure Assembly : sig datatype t = Comment of string | Directive of Directive.t | PseudoOp of PseudoOp.t | Label of Label.t | Instruction of Instruction.t val layout : t -> Layout.t val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val hints : t -> (MemLoc.t * Register.t) list val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val comment : string -> t val isComment : t -> bool val directive : Directive.t -> t val directive_assume : {assumes: {register: Register.t, memloc: MemLoc.t, weight: int, sync: bool, reserve: bool} list} -> t val directive_fltassume : {assumes: {memloc: MemLoc.t, weight: int, sync: bool} list} -> t val directive_cache : {caches: {register: Register.t, memloc: MemLoc.t, reserve: bool} list} -> t val directive_fltcache : {caches: {memloc: MemLoc.t} list} -> t val directive_reset : unit -> t val directive_force : {commit_memlocs: MemLocSet.t, commit_classes: ClassSet.t, remove_memlocs: MemLocSet.t, remove_classes: ClassSet.t, dead_memlocs: MemLocSet.t, dead_classes: ClassSet.t} -> t val directive_ccall : unit -> t val directive_return : {returns: {src: Operand.t, dst: MemLoc.t} list} -> t val directive_reserve : {registers: Register.t list} -> t val directive_unreserve : {registers: Register.t list} -> t val directive_saveregalloc : {live: MemLocSet.t, id: Directive.Id.t} -> t val directive_restoreregalloc : {live: MemLocSet.t, id: Directive.Id.t} -> t val directive_clearflt : unit -> t val pseudoop : PseudoOp.t -> t val pseudoop_data : unit -> t val pseudoop_text : unit -> t val pseudoop_symbol_stub : unit -> t val pseudoop_non_lazy_symbol_pointer : unit -> t val pseudoop_balign : Immediate.t * Immediate.t option * Immediate.t option ->t val pseudoop_p2align : Immediate.t * Immediate.t option * Immediate.t option -> t val pseudoop_space : Immediate.t * Immediate.t -> t val pseudoop_byte : Immediate.t list -> t val pseudoop_word : Immediate.t list -> t val pseudoop_long : Immediate.t list -> t val pseudoop_string : string list -> t val pseudoop_global : Label.t -> t val pseudoop_hidden : Label.t -> t val pseudoop_indirect_symbol : Label.t -> t val pseudoop_local : Label.t -> t val pseudoop_comm : Label.t * Immediate.t * Immediate.t option -> t val label : Label.t -> t val instruction : Instruction.t -> t val instruction_nop : unit -> t val instruction_hlt : unit -> t val instruction_binal : {oper: Instruction.binal, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pmd : {oper: Instruction.md, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_md : {oper: Instruction.md, src: Operand.t, size: Size.t} -> t val instruction_imul2 : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_unal : {oper: Instruction.unal, dst: Operand.t, size: Size.t} -> t val instruction_sral : {oper: Instruction.sral, count: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmp : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_test : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_setcc : {condition: Instruction.condition, dst: Operand.t, size: Size.t} -> t val instruction_jmp : {target: Operand.t, absolute: bool} -> t val instruction_jcc : {condition: Instruction.condition, target: Operand.t} -> t val instruction_call : {target: Operand.t, absolute: bool} -> t val instruction_ret : {src: Operand.t option} -> t val instruction_mov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_cmovcc : {condition: Instruction.condition, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_xchg : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_ppush : {src: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_ppop : {dst: Operand.t, base: Operand.t, size: Size.t} -> t val instruction_push : {src: Operand.t, size: Size.t} -> t val instruction_pop : {dst: Operand.t, size: Size.t} -> t val instruction_cx : {size: Size.t} -> t val instruction_movx : {oper: Instruction.movx, src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_xvom : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_lea : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfmov : {src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfmovx : {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} -> t val instruction_pfxvom : {src: Operand.t, dst: Operand.t, srcsize: Size.t, dstsize: Size.t} -> t val instruction_pfldc : {oper: Instruction.fldc, dst: Operand.t, size: Size.t} -> t val instruction_pfmovfi : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_pfmovti : {src: Operand.t, srcsize: Size.t, dst: Operand.t, dstsize: Size.t} -> t val instruction_pfcom : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_pfucom : {src1: Operand.t, src2: Operand.t, size: Size.t} -> t val instruction_pfbina : {oper: Instruction.fbina, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfuna : {oper: Instruction.funa, dst: Operand.t, size: Size.t} -> t val instruction_pfptan : {dst: Operand.t, size: Size.t} -> t val instruction_pfbinas : {oper: Instruction.fbinas, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_pfbinasp : {oper: Instruction.fbinasp, src: Operand.t, dst: Operand.t, size: Size.t} -> t val instruction_fld : {src: Operand.t, size: Size.t} -> t val instruction_fst : {dst: Operand.t, size: Size.t, pop: bool} -> t val instruction_fild : {src: Operand.t, size: Size.t} -> t val instruction_fist : {dst: Operand.t, size: Size.t, pop: bool} -> t val instruction_fxch : {src: Operand.t} -> t val instruction_fldc : {oper: Instruction.fldc} -> t val instruction_fldcw : {src: Operand.t} -> t val instruction_fstcw : {dst: Operand.t, check: bool} -> t val instruction_fstsw : {dst: Operand.t, check: bool} -> t val instruction_fcom : {src: Operand.t, size: Size.t, pop: bool, pop': bool} -> t val instruction_fucom : {src: Operand.t, pop: bool, pop': bool} -> t val instruction_fbina : {oper: Instruction.fbina, src: Operand.t, dst: Operand.t, size: Size.t, pop: bool} -> t val instruction_funa : {oper: Instruction.funa} -> t val instruction_fptan : unit -> t val instruction_fbinas : {oper: Instruction.fbinas} -> t val instruction_fbinasp : {oper: Instruction.fbinasp} -> t end structure FrameInfo: sig datatype t = T of {size: int, frameLayoutsIndex: int} end structure Entry: sig datatype t = Jump of {label: Label.t} | Func of {label: Label.t, live: MemLocSet.t} | Cont of {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} | Handler of {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} | CReturn of {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} val cont : {label: Label.t, live: MemLocSet.t, frameInfo: FrameInfo.t} -> t val creturn: {dsts: (Operand.t * Size.t) vector, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, label: Label.t} -> t val func : {label: Label.t, live: MemLocSet.t} -> t val handler : {frameInfo: FrameInfo.t, label: Label.t, live: MemLocSet.t} -> t val isFunc : t -> bool val jump : {label: Label.t} -> t val label : t -> Label.t val live : t -> MemLocSet.t val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} end structure Transfer : sig structure Cases : sig datatype 'a t = Word of (WordX.t * 'a) list val word : (WordX.t * 'a) list -> 'a t val isEmpty : 'a t -> bool val isSingle : 'a t -> bool val extract : 'a t * (WordX.t * 'a -> 'b) -> 'b val count : 'a t * ('a -> bool) -> int val keepAll : 'a t * (WordX.t * 'a -> bool) -> 'a t val forall : 'a t * (WordX.t * 'a -> bool) -> bool val foreach : 'a t * (WordX.t * 'a -> unit) -> unit val map : 'a t * (WordX.t * 'a -> 'b) -> 'b t val mapToList : 'a t * (WordX.t * 'a -> 'b) -> 'b list end datatype t = Goto of {target: Label.t} | Iff of {condition: Instruction.condition, truee: Label.t, falsee: Label.t} | Switch of {test: Operand.t, cases: Label.t Cases.t, default: Label.t} | Tail of {target: Label.t, live: MemLocSet.t} | NonTail of {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} | Return of {live: MemLocSet.t} | Raise of {live: MemLocSet.t} | CCall of {args: (Operand.t * Size.t) list, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, return: Label.t option} val toString : t -> string val uses_defs_kills : t -> {uses: Operand.t list, defs: Operand.t list, kills: Operand.t list} val nearTargets : t -> Label.t list val live : t -> MemLocSet.t val replace : ({use: bool, def: bool} -> Operand.t -> Operand.t) -> t -> t val goto : {target: Label.t} -> t val iff : {condition: Instruction.condition, truee: Label.t, falsee: Label.t} -> t val switch : {test: Operand.t, cases: Label.t Cases.t, default: Label.t} -> t val tail : {target: Label.t, live: MemLocSet.t} -> t val nontail : {target: Label.t, live: MemLocSet.t, return: Label.t, handler: Label.t option, size: int} -> t val return : {live: MemLocSet.t} -> t val raisee : {live: MemLocSet.t} -> t val ccall: {args: (Operand.t * Size.t) list, frameInfo: FrameInfo.t option, func: RepType.t CFunction.t, return: Label.t option} -> t end structure ProfileLabel : sig include PROFILE_LABEL val toAssembly : t -> Assembly.t list val toAssemblyOpt : t option -> Assembly.t list end structure Block : sig datatype t' = T' of {entry: Entry.t option, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t option} val mkBlock': {entry: Entry.t option, statements: Assembly.t list, transfer: Transfer.t option} -> t' val mkProfileBlock': {profileLabel: ProfileLabel.t} -> t' val printBlock' : t' -> unit datatype t = T of {entry: Entry.t, profileLabel: ProfileLabel.t option, statements: Assembly.t list, transfer: Transfer.t} val printBlock : t -> unit val compress : t' list -> t list end structure Chunk : sig datatype t = T of {data: Assembly.t list, blocks: Block.t list} end end mlton-20100608/mlton/control/0000755000076600000240000000000011404470407014371 5ustar mtfstaffmlton-20100608/mlton/control/.ignore0000644000076600000240000000001411404435622015650 0ustar mtfstaffversion.sml mlton-20100608/mlton/control/bits.sml0000644000076600000240000001365211404435622016056 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local structure All:> sig type bits type bytes structure Bits: sig eqtype t val + : t * t -> t val - : t * t -> t val ~ : t -> t val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool (* val align: t * {alignment: t} -> t *) val alignDown: t * {alignment: t} -> t (* val alignWord32: t -> t *) (* val alignWord64: t -> t *) val compare: t * t -> Relation.t val equals: t * t -> bool val fromInt: int -> t val fromIntInf: IntInf.t -> t val inByte: t val inWord8: t val inWord16: t val inWord32: t val inWord64: t val isAligned: t * {alignment: t} -> bool val isByteAligned: t -> bool val isWord8Aligned: t -> bool val isWord16Aligned: t -> bool val isWord32Aligned: t -> bool val isWord64Aligned: t -> bool val isZero: t -> bool val layout: t -> Layout.t val max: t * t -> t val min: t * t -> t val one: t val toBytes: t -> bytes val toInt: t -> int val toIntInf: t -> IntInf.t val toString: t -> string val toWord: t -> word val zero: t end structure Bytes: sig type t val + : t * t -> t val - : t * t -> t val ~ : t -> t val < : t * t -> bool val <= : t * t -> bool val > : t * t -> bool val >= : t * t -> bool val align: t * {alignment: t} -> t (* val alignDown: t * {alignment: t} -> t *) (* val alignWord8: t -> t *) (* val alignWord16: t -> t *) val alignWord32: t -> t val alignWord64: t -> t val compare: t * t -> Relation.t val equals: t * t -> bool val fromInt: int -> t val fromIntInf: IntInf.t -> t (* val inWord8: t *) (* val inWord16: t *) val inWord32: t val inWord64: t (* val isAligned: t * {alignment: t} -> bool *) val isWord32Aligned: t -> bool (* val isWord64Aligned: t -> bool *) val isZero: t -> bool val layout: t -> Layout.t val max: t * t -> t val min: t * t -> t val one: t val toBits: t -> Bits.t val toInt: t -> int val toIntInf: t -> IntInf.t val toString: t -> string val zero: t end sharing type bits = Bits.t sharing type bytes = Bytes.t end = struct type bits = IntInf.t type bytes = IntInf.t val rem = IntInf.rem fun align (b, {alignment = a}) = let val b = b + (a - 1) in b - rem (b, a) end fun alignDown (b, {alignment = a}) = let in b - rem (b, a) end structure Bits = struct open IntInf val inByte: bits = 8 val inWord8: bits = 8 val inWord16: bits = 16 val inWord32: bits = 32 val inWord64: bits = 64 fun isAligned (b, {alignment = a}) = 0 = rem (b, a) fun isByteAligned b = isAligned (b, {alignment = inByte}) fun isWord8Aligned b = isAligned (b, {alignment = inWord8}) fun isWord16Aligned b = isAligned (b, {alignment = inWord16}) fun isWord32Aligned b = isAligned (b, {alignment = inWord32}) fun isWord64Aligned b = isAligned (b, {alignment = inWord64}) fun toBytes b = if isByteAligned b then quot (b, inByte) else Error.bug "Bits.toBytes" val toWord = Word.fromIntInf (* val align = align *) val alignDown = alignDown (* fun alignWord32 b = align (b, {alignment = inWord32}) *) (* fun alignWord64 b = align (b, {alignment = inWord64}) *) end structure Bytes = struct open IntInf (* val inWord8: bytes = 1 *) (* val inWord16: bytes = 2 *) val inWord32: bytes = 4 val inWord64: bytes = 8 fun isAligned (b, {alignment = a}) = 0 = rem (b, a) (* fun isWord8Aligned b = isAligned (b, {alignment = inWord8}) *) (* fun isWord16Aligned b = isAligned (b, {alignment = inWord16}) *) fun isWord32Aligned b = isAligned (b, {alignment = inWord32}) (* fun isWord64Aligned b = isAligned (b, {alignment = inWord64}) *) fun toBits b = b * Bits.inByte val align = align (* val alignDown = alignDown *) (* fun alignWord8 b = align (b, {alignment = inWord8}) *) (* fun alignWord16 b = align (b, {alignment = inWord16}) *) fun alignWord32 b = align (b, {alignment = inWord32}) fun alignWord64 b = align (b, {alignment = inWord64}) end end open All in structure Bits = Bits structure Bytes = Bytes end mlton-20100608/mlton/control/control-flags.sig0000644000076600000240000002525111404435622017654 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONTROL_FLAGS = sig (* set all flags to their default values *) val defaults: unit -> unit val all : unit -> {name: string, value: string} list (*------------------------------------*) (* Begin Flags *) (*------------------------------------*) datatype align = Align4 | Align8 val align: align ref val atMLtons: string vector ref datatype chunk = OneChunk | ChunkPerFunc | Coalesce of {limit: int} val chunk: chunk ref val closureConvertGlobalize: bool ref val closureConvertShrink: bool ref structure Codegen: sig datatype t = Bytecode | CCodegen | x86Codegen | amd64Codegen val all: t list val toString: t -> string end datatype codegen = datatype Codegen.t val codegen: Codegen.t ref val contifyIntoMain: bool ref (* Generate an executable with debugging info. *) val debug: bool ref val defaultChar: string ref val defaultWideChar: string ref val defaultInt: string ref val defaultReal: string ref val defaultWord: string ref (* List of pass names to keep diagnostic info on. *) val diagPasses: Regexp.Compiled.t list ref (* List of optimization passes to skip. *) val dropPasses: Regexp.Compiled.t list ref structure Elaborate: sig structure DiagEIW : sig datatype t = Error | Ignore | Warn end structure DiagDI : sig datatype t = Default | Ignore end type ('args, 'st) t val document: {expert: bool} -> Layout.t val allowConstant: (bool,bool) t val allowFFI: (bool,bool) t val allowOverload: (bool,bool) t val allowPrim: (bool,bool) t val allowRebindEquals: (bool,bool) t val deadCode: (bool,bool) t val forceUsed: (unit,bool) t val ffiStr: (string,string option) t val nonexhaustiveExnMatch: (DiagDI.t,DiagDI.t) t val nonexhaustiveMatch: (DiagEIW.t,DiagEIW.t) t val redundantMatch: (DiagEIW.t,DiagEIW.t) t val sequenceNonUnit: (DiagEIW.t,DiagEIW.t) t val warnUnused: (bool,bool) t val current: ('args, 'st) t -> 'st val default: ('args, 'st) t -> 'st val enabled: ('args, 'st) t -> bool val expert: ('args, 'st) t -> bool val name: ('args, 'st) t -> string datatype ('a, 'b) parseResult = Bad | Deprecated of 'a | Good of 'b | Other structure Id : sig type t val name: t -> string end val equalsId: ('args, 'st) t * Id.t -> bool val parseId: string -> (Id.t list , Id.t) parseResult structure Args : sig type t val processAnn: t -> (unit -> unit) end val parseIdAndArgs: string -> ((Id.t * Args.t) list, Id.t * Args.t) parseResult val processDefault: string -> (Id.t list, unit) parseResult val processEnabled: string * bool -> (Id.t list, unit) parseResult val withDef: (unit -> 'a) -> 'a val snapshot: unit -> (unit -> 'a) -> 'a end (* stop after elaboration. So, no need for the elaborator to generate * valid CoreML. *) val elaborateOnly: bool ref val emitMain: bool ref val exportHeader: File.t option ref val exnHistory: bool ref structure Format: sig datatype t = Archive | Executable | LibArchive | Library val all: t list val toString: t -> string end datatype format = datatype Format.t val format: Format.t ref (* *) datatype gcCheck = Limit | First | Every val gcCheck: gcCheck ref (* Indentation used in laying out ILs. *) val indentation: int ref val inlineIntoMain: bool ref val inlineLeafA: {loops: bool, repeat: bool, size: int option} ref val inlineLeafB: {loops: bool, repeat: bool, size: int option} ref val inlineNonRec: {small: int, product: int} ref (* The input file on the command line, minus path and extension. *) val inputFile: File.t ref (* Whether or not the elaborator keeps def-use information. *) val keepDefUse: bool ref (* Keep dot files for whatever SSA files are produced. *) val keepDot: bool ref (* List of pass names to save the input/output. *) val keepPasses: Regexp.Compiled.t list ref (* Save the final CoreML to a file. *) val keepCoreML: bool ref (* Save the final Machine to a file. *) val keepMachine: bool ref (* Save the final RSSA to a file. *) val keepRSSA: bool ref (* Save the final SSA to a file. *) val keepSSA: bool ref (* Save the final SSA2 to a file. *) val keepSSA2: bool ref (* Save the final SXML to a file. *) val keepSXML: bool ref (* Save the final XML to a file. *) val keepXML: bool ref (* For the codegen -- do labels for gcc and assembler need an extra leading * underscore. *) val labelsHaveExtra_: bool ref (* lib/mlton directory *) val libDir: Dir.t ref (* lib/mlton/target directory *) val libTargetDir: Dir.t ref (* name of the output library *) val libname : string ref (* Number of times to loop through optimization passes. *) val loopPasses: int ref (* Should the mutator mark cards? *) val markCards: bool ref val maxFunctionSize: int ref val mlbPathVars: {var: string, path: string} list ref val mlbPathMap: unit -> {var: string, path: string} list structure Native: sig (* whether or not to use comments in native codegen *) val commented: int ref (* whether or not to track liveness of stack slots *) val liveStack: bool ref (* level of optimization to use in native codegen *) val optimize: int ref (* whether or not to use move hoisting in native codegen *) val moveHoist: bool ref (* whether or not to use copy propagation in native codegen *) val copyProp: bool ref (* Don't use copy propagation on blocks larger than this. *) val copyPropCutoff: int ref (* live transfer cutoff distance *) val cutoff: int ref (* whether or not to use live transfer in native codegen *) val liveTransfer: int ref (* whether or not to shuffle registers around C-calls *) val shuffle: bool ref (* whether or not to use strict IEEE floating-point in native codegen *) val IEEEFP: bool ref (* whether or not to split assembly file in native codegen *) val split: int option ref end val optimizationPasses: {il: string, set: string -> unit Result.t, get: unit -> string} list ref val positionIndependent : bool ref (* Only duplicate big functions when * (size - small) * (number of occurrences - 1) <= product *) val polyvariance: { hofo: bool, rounds: int, small: int, product: int } option ref val preferAbsPaths: bool ref (* List of pass names to keep profiling info on. *) val profPasses: Regexp.Compiled.t list ref (* Insert profiling information. *) datatype profile = ProfileNone | ProfileAlloc | ProfileCallStack | ProfileCount | ProfileDrop | ProfileLabel | ProfileTimeField | ProfileTimeLabel val profile: profile ref val profileBranch: bool ref val profileC: Regexp.Compiled.t list ref datatype profileIL = ProfileSource | ProfileSSA | ProfileSSA2 val profileIL: profileIL ref val profileInclExcl: (Regexp.Compiled.t * bool) list ref val profileRaise: bool ref val profileStack: bool ref val profileVal: bool ref (* Show the basis library. *) val showBasis: File.t option ref (* Show def-use information. *) val showDefUse: File.t option ref (* Should types be printed in ILs. *) val showTypes: bool ref datatype target = Cross of string | Self val target: target ref structure Target: sig datatype arch = datatype MLton.Platform.Arch.t val arch: arch ref val bigEndian: unit -> bool val setBigEndian: bool -> unit datatype os = datatype MLton.Platform.OS.t val os: os ref structure Size: sig val cint: unit -> Bits.t val cpointer: unit -> Bits.t val cptrdiff: unit -> Bits.t val csize: unit -> Bits.t val header: unit -> Bits.t val mplimb: unit -> Bits.t val objptr: unit -> Bits.t val seqIndex: unit -> Bits.t end val setSizes: {cint: Bits.t, cpointer: Bits.t, cptrdiff: Bits.t, csize: Bits.t, header: Bits.t, mplimb: Bits.t, objptr: Bits.t, seqIndex: Bits.t} -> unit end (* Type check ILs. *) val typeCheck: bool ref datatype verbosity = Silent | Top | Pass | Detail val verbosity: verbosity ref val warnAnn: bool ref val warnDeprecated: bool ref val zoneCutDepth: int ref (*------------------------------------*) (* End Flags *) (*------------------------------------*) end mlton-20100608/mlton/control/control-flags.sml0000644000076600000240000011654411404435622017673 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure ControlFlags: CONTROL_FLAGS = struct structure C = Control () open C structure Align = struct datatype t = Align4 | Align8 val toString = fn Align4 => "4" | Align8 => "8" end datatype align = datatype Align.t val align = control {name = "align", default = Align4, toString = Align.toString} val atMLtons = control {name = "atMLtons", default = Vector.new0 (), toString = fn v => Layout.toString (Vector.layout String.layout v)} structure Chunk = struct datatype t = OneChunk | ChunkPerFunc | Coalesce of {limit: int} val toString = fn OneChunk => "one chunk" | ChunkPerFunc => "chunk per function" | Coalesce {limit} => concat ["coalesce ", Int.toString limit] end datatype chunk = datatype Chunk.t val chunk = control {name = "chunk", default = Coalesce {limit = 4096}, toString = Chunk.toString} val closureConvertGlobalize = control {name = "closureConvertGlobalize", default = true, toString = Bool.toString} val closureConvertShrink = control {name = "closureConvertShrink", default = true, toString = Bool.toString} structure Codegen = struct datatype t = amd64Codegen | Bytecode | CCodegen | x86Codegen val all = [x86Codegen,amd64Codegen,CCodegen,Bytecode] val toString: t -> string = fn amd64Codegen => "amd64" | Bytecode => "bytecode" | CCodegen => "c" | x86Codegen => "x86" end datatype codegen = datatype Codegen.t val codegen = control {name = "codegen", default = Codegen.x86Codegen, toString = Codegen.toString} val contifyIntoMain = control {name = "contifyIntoMain", default = false, toString = Bool.toString} val debug = control {name = "debug", default = false, toString = Bool.toString} val defaultChar = control {name = "defaultChar", default = "char8", toString = fn s => s} val defaultWideChar = control {name = "defaultWideChar", default = "widechar32", toString = fn s => s} val defaultInt = control {name = "defaultInt", default = "int32", toString = fn s => s} val defaultReal = control {name = "defaultReal", default = "real64", toString = fn s => s} val defaultWord = control {name = "defaultWord", default = "word32", toString = fn s => s} val diagPasses = control {name = "diag passes", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} val dropPasses = control {name = "drop passes", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} structure Elaborate = struct structure DiagEIW = struct datatype t = Error | Ignore | Warn val fromString: string -> t option = fn "error" => SOME Error | "ignore" => SOME Ignore | "warn" => SOME Warn | _ => NONE val toString: t -> string = fn Error => "error" | Ignore => "ignore" | Warn => "warn" end structure DiagDI = struct datatype t = Default | Ignore val fromString: string -> t option = fn "default" => SOME Default | "ignore" => SOME Ignore | _ => NONE val toString: t -> string = fn Default => "default" | Ignore => "ignore" end structure Id = struct datatype t = T of {enabled: bool ref, expert: bool, name: string} fun equals (T {enabled = enabled1, ...}, T {enabled = enabled2, ...}) = enabled1 = enabled2 val enabled = fn (T {enabled, ...}) => !enabled val setEnabled = fn (T {enabled, ...}, b) => (enabled := b; true) val expert = fn (T {expert, ...}) => expert val name = fn (T {name, ...}) => name end structure Args = struct datatype t = T of {fillArgs: unit -> (unit -> unit), processAnn: unit -> (unit -> unit), processDef: unit -> bool} local fun make sel (T r) = sel r in fun processAnn args = (make #processAnn args) () fun processDef args = (make #processDef args) () end end datatype ('args, 'st) t = T of {args: 'args option ref, cur: 'st ref, def: 'st ref, id: Id.t} fun current (T {cur, ...}) = !cur fun default (T {def, ...}) = !def fun id (T {id, ...}) = id fun enabled ctrl = Id.enabled (id ctrl) fun expert ctrl = Id.expert (id ctrl) fun name ctrl = Id.name (id ctrl) fun equalsId (ctrl, id') = Id.equals (id ctrl, id') datatype ('a, 'b) parseResult = Bad | Deprecated of 'a | Good of 'b | Other val deGood = fn Good z => z | _ => Error.bug "Control.Elaborate.deGood" val documentation: {choices: string list option, expert: bool, name: string} list ref = ref [] fun document {expert} = let val all = !documentation val all = if expert then all else List.keepAll (all, not o #expert) val all = List.insertionSort (all, fn ({name = n, ...}, {name = n', ...}) => n <= n') open Layout in align (List.map (all, fn {choices, name, ...} => str (concat [name, case choices of NONE => "" | SOME cs => concat [" {", concat (List.separate (cs, "|")), "}"]]))) end local fun make ({choices: 'st list option, default: 'st, expert: bool, toString: 'st -> string, name: string, newCur: 'st * 'args -> 'st, newDef: 'st * 'args -> 'st, parseArgs: string list -> 'args option}, {parseId: string -> (Id.t list, Id.t) parseResult, parseIdAndArgs: string -> ((Id.t * Args.t) list, (Id.t * Args.t)) parseResult, withDef: unit -> (unit -> unit), snapshot: unit -> unit -> (unit -> unit)}) = let val () = List.push (documentation, {choices = Option.map (choices, fn cs => List.map (cs, toString)), expert = expert, name = name}) val ctrl as T {args = argsRef, cur, def, id as Id.T {enabled, ...}, ...} = T {args = ref NONE, cur = ref default, def = control {name = concat ["elaborate ", name, " (default)"], default = default, toString = toString}, id = Id.T {enabled = control {name = concat ["elaborate ", name, " (enabled)"], default = true, toString = Bool.toString}, expert = expert, name = name}} val parseId = fn name' => if String.equals (name', name) then Good id else parseId name' val parseIdAndArgs = fn s => case String.tokens (s, Char.isSpace) of name'::args' => if String.equals (name', name) then case parseArgs args' of SOME v => let fun fillArgs () = (argsRef := SOME v ; fn () => argsRef := NONE) fun processAnn () = if !enabled then let val old = !cur val new = newCur (old, v) in cur := new ; fn () => cur := old end else fn () => () fun processDef () = let val old = !def val new = newDef (old, v) in def := new ; true end val args = Args.T {fillArgs = fillArgs, processAnn = processAnn, processDef = processDef} in Good (id, args) end | NONE => Bad else parseIdAndArgs s | _ => Bad val withDef : unit -> (unit -> unit) = fn () => let val restore = withDef () val old = !cur in cur := !def ; fn () => (cur := old ; restore ()) end val snapshot : unit -> unit -> (unit -> unit) = fn () => let val withSaved = snapshot () val saved = !cur in fn () => let val restore = withSaved () val old = !cur in cur := saved ; fn () => (cur := old ; restore ()) end end in (ctrl, {parseId = parseId, parseIdAndArgs = parseIdAndArgs, withDef = withDef, snapshot = snapshot}) end fun makeBool ({default: bool, expert: bool, name: string}, ac) = make ({choices = SOME (if default then [true, false] else [false, true]), default = default, expert = expert, toString = Bool.toString, name = name, newCur = fn (_,b) => b, newDef = fn (_,b) => b, parseArgs = fn args' => case args' of [arg'] => Bool.fromString arg' | _ => NONE}, ac) fun makeDiagnostic ({choices, default, diagToString, diagFromString, expert: bool, name: string}, ac) = make ({choices = choices, default = default, expert = expert, toString = diagToString, name = name, newCur = fn (_,d) => d, newDef = fn (_,d) => d, parseArgs = fn args' => case args' of [arg'] => diagFromString arg' | _ => NONE}, ac) fun makeDiagEIW ({default: DiagEIW.t, expert: bool, name: string}, ac) = makeDiagnostic ({choices = (SOME (let datatype z = datatype DiagEIW.t in case default of Error => [Error, Ignore, Warn] | Ignore => [Ignore, Error, Warn] | Warn => [Warn, Ignore, Error] end)), default = default, diagToString = DiagEIW.toString, diagFromString = DiagEIW.fromString, expert = expert, name = name}, ac) fun makeDiagDI ({default: DiagDI.t, expert: bool, name: string}, ac) = makeDiagnostic ({choices = (SOME (let datatype z = datatype DiagDI.t in case default of Default => [Default, Ignore] | Ignore => [Ignore, Default] end)), default = default, diagToString = DiagDI.toString, diagFromString = DiagDI.fromString, expert = expert, name = name}, ac) in val ac = {parseId = fn _ => Bad, parseIdAndArgs = fn _ => Bad, withDef = fn () => (fn () => ()), snapshot = fn () => fn () => (fn () => ())} val (allowConstant, ac) = makeBool ({name = "allowConstant", default = false, expert = true}, ac) val (allowFFI, ac) = makeBool ({name = "allowFFI", default = false, expert = false}, ac) val (allowPrim, ac) = makeBool ({name = "allowPrim", default = false, expert = true}, ac) val (allowOverload, ac) = makeBool ({name = "allowOverload", default = false, expert = true}, ac) val (allowRebindEquals, ac) = makeBool ({name = "allowRebindEquals", default = false, expert = true}, ac) val (deadCode, ac) = makeBool ({name = "deadCode", default = false, expert = true}, ac) val (forceUsed, ac) = make ({choices = NONE, default = false, expert = false, toString = Bool.toString, name = "forceUsed", newCur = fn (b,()) => b, newDef = fn (_,()) => true, parseArgs = fn args' => case args' of [] => SOME () | _ => NONE}, ac) val (ffiStr, ac) = make ({choices = SOME [SOME ""], default = NONE, expert = true, toString = fn NONE => "" | SOME s => s, name = "ffiStr", newCur = fn (_,s) => SOME s, newDef = fn _ => NONE, parseArgs = fn args' => case args' of [s] => SOME s | _ => NONE}, ac) val (nonexhaustiveExnMatch, ac) = makeDiagDI ({name = "nonexhaustiveExnMatch", default = DiagDI.Default, expert = false}, ac) val (nonexhaustiveMatch, ac) = makeDiagEIW ({name = "nonexhaustiveMatch", default = DiagEIW.Warn, expert = false}, ac) val (redundantMatch, ac) = makeDiagEIW ({name = "redundantMatch", default = DiagEIW.Warn, expert = false}, ac) val (sequenceNonUnit, ac) = makeDiagEIW ({name = "sequenceNonUnit", default = DiagEIW.Ignore, expert = false}, ac) val (warnUnused, ac) = makeBool ({name = "warnUnused", default = false, expert = false}, ac) val {parseId, parseIdAndArgs, withDef, snapshot} = ac end local fun makeDeprecated ({alts: string list, name: string, parseArgs: string list -> string list option}, {parseId: string -> (Id.t list, Id.t) parseResult, parseIdAndArgs: string -> ((Id.t * Args.t) list, (Id.t * Args.t)) parseResult}) = let val parseId = fn name' => if String.equals (name', name) then Deprecated (List.map (alts, deGood o parseId)) else parseId name' val parseIdAndArgs = fn s => case String.tokens (s, Char.isSpace) of name'::args' => if String.equals (name', name) then case parseArgs args' of SOME alts => Deprecated (List.map (alts, deGood o parseIdAndArgs)) | NONE => Bad else parseIdAndArgs s | _ => Bad in {parseId = parseId, parseIdAndArgs = parseIdAndArgs} end fun makeDeprecatedBool ({altIds: string list, altArgs: bool -> string list list, name: string}, ac) = let local fun make b = List.map2 (altIds, altArgs b, fn (altId, altArgs) => String.concatWith (altId::altArgs, " ")) in val trueAltIdAndArgs = make true val falseAltIdAndArgs = make false end in makeDeprecated ({alts = altIds, name = name, parseArgs = fn args' => case args' of [arg'] => (case Bool.fromString arg' of SOME true => SOME trueAltIdAndArgs | SOME false => SOME falseAltIdAndArgs | NONE => NONE) | _ => NONE}, ac) end val _ = makeDeprecatedBool in val ac = {parseId = parseId, parseIdAndArgs = parseIdAndArgs} val {parseId, parseIdAndArgs} = ac end local fun checkPrefix (s, f) = case String.peeki (s, fn (_, c) => c = #":") of NONE => f s | SOME (i, _) => let val comp = String.prefix (s, i) val comp = String.deleteSurroundingWhitespace comp val s = String.dropPrefix (s, i + 1) in if String.equals (comp, "mlton") then f s else Other end in val parseId = fn s => checkPrefix (s, parseId) val parseIdAndArgs = fn s => checkPrefix (s, parseIdAndArgs) end val processDefault = fn s => case parseIdAndArgs s of Bad => Bad | Deprecated alts => List.fold (alts, Deprecated (List.map (alts, #1)), fn ((_,args),res) => if Args.processDef args then res else Bad) | Good (_, args) => if Args.processDef args then Good () else Bad | Other => Bad val processEnabled = fn (s, b) => case parseId s of Bad => Bad | Deprecated alts => List.fold (alts, Deprecated alts, fn (id,res) => if Id.setEnabled (id, b) then res else Bad) | Good id => if Id.setEnabled (id, b) then Good () else Bad | Other => Bad val withDef : (unit -> 'a) -> 'a = fn f => let val restore = withDef () in Exn.finally (f, restore) end val snapshot : unit -> (unit -> 'a) -> 'a = fn () => let val withSaved = snapshot () in fn f => let val restore = withSaved () in Exn.finally (f, restore) end end end val elaborateOnly = control {name = "elaborate only", default = false, toString = Bool.toString} val emitMain = control {name = "emit main", default = true, toString = Bool.toString} val exportHeader = control {name = "export header", default = NONE, toString = Option.toString File.toString} val exnHistory = control {name = "exn history", default = false, toString = Bool.toString} structure Format = struct datatype t = Archive | Executable | LibArchive | Library (* Default option first for usage message. *) val all = [Executable, Archive, LibArchive, Library] val toString: t -> string = fn Archive => "archive" | Executable => "executable" | LibArchive => "libarchive" | Library => "library" end datatype format = datatype Format.t val format = control {name = "generated output format", default = Format.Executable, toString = Format.toString} structure GcCheck = struct datatype t = Limit | First | Every local open Layout in val layout = fn Limit => str "Limit" | First => str "First" | Every => str "Every" end val toString = Layout.toString o layout end datatype gcCheck = datatype GcCheck.t val gcCheck = control {name = "gc check", default = Limit, toString = GcCheck.toString} val indentation = control {name = "indentation", default = 3, toString = Int.toString} val inlineIntoMain = control {name = "inlineIntoMain", default = true, toString = Bool.toString} val inlineLeafA = control {name = "inlineLeafA", default = {loops = true, repeat = true, size = SOME 20}, toString = fn {loops, repeat, size} => Layout.toString (Layout.record [("loops", Bool.layout loops), ("repeat", Bool.layout repeat), ("size", Option.layout Int.layout size)])} val inlineLeafB = control {name = "inlineLeafB", default = {loops = true, repeat = true, size = SOME 40}, toString = fn {loops, repeat, size} => Layout.toString (Layout.record [("loops", Bool.layout loops), ("repeat", Bool.layout repeat), ("size", Option.layout Int.layout size)])} val inlineNonRec = control {name = "inlineNonRec", default = {small = 60, product = 320}, toString = fn {small, product} => Layout.toString (Layout.record [("small", Int.layout small), ("product", Int.layout product)])} val inputFile = control {name = "input file", default = "", toString = File.toString} val keepCoreML = control {name = "keep CoreML", default = false, toString = Bool.toString} val keepDefUse = control {name = "keep def use", default = true, toString = Bool.toString} val keepDot = control {name = "keep dot", default = false, toString = Bool.toString} val keepMachine = control {name = "keep Machine", default = false, toString = Bool.toString} val keepPasses = control {name = "keep passes", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} val keepRSSA = control {name = "keep RSSA", default = false, toString = Bool.toString} val keepSSA = control {name = "keep SSA", default = false, toString = Bool.toString} val keepSSA2 = control {name = "keep SSA2", default = false, toString = Bool.toString} val keepSXML = control {name = "keep SXML", default = false, toString = Bool.toString} val keepXML = control {name = "keep XML", default = false, toString = Bool.toString} val labelsHaveExtra_ = control {name = "extra_", default = false, toString = Bool.toString} val libDir = control {name = "lib dir", default = "", toString = fn s => s} val libTargetDir = control {name = "lib target dir", default = "", toString = fn s => s} val libname = ref "" val loopPasses = control {name = "loop passes", default = 1, toString = Int.toString} val markCards = control {name = "mark cards", default = true, toString = Bool.toString} val maxFunctionSize = control {name = "max function size", default = 10000, toString = Int.toString} val mlbPathVars = control {name = "mlb path vars", default = [], toString = List.toString (fn {var, path} => concat ["{var = ", var, ", path = ", path, "}"])} structure Native = struct val commented = control {name = "native commented", default = 0, toString = Int.toString} val liveStack = control {name = "native live stack", default = false, toString = Bool.toString} val optimize = control {name = "native optimize", default = 1, toString = Int.toString} val moveHoist = control {name = "native move hoist", default = true, toString = Bool.toString} val copyProp = control {name = "native copy prop", default = true, toString = Bool.toString} val copyPropCutoff = control {name = "native copy prop cutoff", default = 1000, toString = Int.toString} val cutoff = control {name = "native cutoff", default = 100, toString = Int.toString} val liveTransfer = control {name = "native live transfer", default = 8, toString = Int.toString} val shuffle = control {name = "native shuffle", default = true, toString = Bool.toString} val IEEEFP = control {name = "native ieee fp", default = false, toString = Bool.toString} val split = control {name = "native split", default = SOME 20000, toString = Option.toString Int.toString} end val optimizationPasses: {il: string, set: string -> unit Result.t, get: unit -> string} list ref = control {name = "optimizationPasses", default = [], toString = List.toString (fn {il,get,...} => concat ["<",il,"::",get (),">"])} val polyvariance = control {name = "polyvariance", default = SOME {hofo = true, rounds = 2, small = 30, product = 300}, toString = fn p => Layout.toString (Option.layout (fn {hofo, rounds, small, product} => Layout.record [("hofo", Bool.layout hofo), ("rounds", Int.layout rounds), ("small", Int.layout small), ("product", Int.layout product)]) p)} val positionIndependent = ref false val preferAbsPaths = control {name = "prefer abs paths", default = false, toString = Bool.toString} val profPasses = control {name = "prof passes", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} structure Profile = struct datatype t = ProfileNone | ProfileAlloc | ProfileCallStack | ProfileCount | ProfileDrop | ProfileLabel | ProfileTimeField | ProfileTimeLabel val toString = fn ProfileNone => "None" | ProfileAlloc => "Alloc" | ProfileCallStack => "CallStack" | ProfileCount => "Count" | ProfileDrop => "Drop" | ProfileLabel => "Label" | ProfileTimeField => "TimeField" | ProfileTimeLabel => "TimeLabel" end datatype profile = datatype Profile.t val profile = control {name = "profile", default = ProfileNone, toString = Profile.toString} val profileBranch = control {name = "profile branch", default = false, toString = Bool.toString} val profileC = control {name = "profile C", default = [], toString = List.toString (Layout.toString o Regexp.Compiled.layout)} structure ProfileIL = struct datatype t = ProfileSource | ProfileSSA | ProfileSSA2 val toString = fn ProfileSource => "ProfileSource" | ProfileSSA => "ProfileSSA" | ProfileSSA2 => "ProfileSSA2" end datatype profileIL = datatype ProfileIL.t val profileIL = control {name = "profile IL", default = ProfileSource, toString = ProfileIL.toString} val profileInclExcl = control {name = "profile include/exclude", default = [], toString = List.toString (Layout.toString o (Layout.tuple2 (Regexp.Compiled.layout, Bool.layout)))} val profileRaise = control {name = "profile raise", default = false, toString = Bool.toString} val profileStack = control {name = "profile stack", default = false, toString = Bool.toString} val profileVal = control {name = "profile val", default = false, toString = Bool.toString} val showBasis = control {name = "show basis", default = NONE, toString = Option.toString File.toString} val showDefUse = control {name = "show def-use", default = NONE, toString = Option.toString File.toString} val showTypes = control {name = "show types", default = true, toString = Bool.toString} structure Target = struct datatype t = Cross of string | Self val toString = fn Cross s => s | Self => "self" end datatype target = datatype Target.t val target = control {name = "target", default = Self, toString = Target.toString} structure Target = struct open Target datatype arch = datatype MLton.Platform.Arch.t val arch = control {name = "target arch", default = X86, toString = MLton.Platform.Arch.toString} datatype os = datatype MLton.Platform.OS.t val os = control {name = "target OS", default = Linux, toString = MLton.Platform.OS.toString} fun make s = let val r = ref NONE fun get () = case !r of NONE => Error.bug ("ControlFlags.Target." ^ s ^ ": not set") | SOME x => x fun set x = r := SOME x in (get, set) end val (bigEndian: unit -> bool, setBigEndian) = make "bigEndian" structure Size = struct val (cint: unit -> Bits.t, set_cint) = make "Size.cint" val (cpointer: unit -> Bits.t, set_cpointer) = make "Size.cpointer" val (cptrdiff: unit -> Bits.t, set_cptrdiff) = make "Size.cptrdiff" val (csize: unit -> Bits.t, set_csize) = make "Size.csize" val (header: unit -> Bits.t, set_header) = make "Size.header" val (mplimb: unit -> Bits.t, set_mplimb) = make "Size.mplimb" val (objptr: unit -> Bits.t, set_objptr) = make "Size.objptr" val (seqIndex: unit -> Bits.t, set_seqIndex) = make "Size.seqIndex" end fun setSizes {cint, cpointer, cptrdiff, csize, header, mplimb, objptr, seqIndex} = (Size.set_cint cint ; Size.set_cpointer cpointer ; Size.set_cptrdiff cptrdiff ; Size.set_csize csize ; Size.set_header header ; Size.set_mplimb mplimb ; Size.set_objptr objptr ; Size.set_seqIndex seqIndex) end fun mlbPathMap () = List.rev (List.concat [[{var = "LIB_MLTON_DIR", path = !libDir}, {var = "TARGET", path = Target.toString (!target)}, {var = "TARGET_ARCH", path = String.toLower (MLton.Platform.Arch.toString (!Target.arch))}, {var = "TARGET_OS", path = String.toLower (MLton.Platform.OS.toString (!Target.os))}, {var = "OBJPTR_REP", path = (case Bits.toInt (Target.Size.objptr ()) of 32 => "rep32" | 64 => "rep64" | _ => Error.bug "Control.mlbPathMap")}, {var = "HEADER_WORD", path = (case Bits.toInt (Target.Size.header ()) of 32 => "word32" | 64 => "word64" | _ => Error.bug "Control.mlbPathMap")}, {var = "SEQINDEX_INT", path = (case Bits.toInt (Target.Size.seqIndex ()) of 32 => "int32" | 64 => "int64" | _ => Error.bug "Control.mlbPathMap")}, {var = "DEFAULT_CHAR", path = !defaultChar}, {var = "DEFAULT_WIDECHAR", path = !defaultWideChar}, {var = "DEFAULT_INT", path = !defaultInt}, {var = "DEFAULT_REAL", path = !defaultReal}, {var = "DEFAULT_WORD", path = !defaultWord}], !mlbPathVars]) val typeCheck = control {name = "type check", default = false, toString = Bool.toString} structure Verbosity = struct datatype t = Silent | Top | Pass | Detail val toString = fn Silent => "Silent" | Top => "Top" | Pass => "Pass" | Detail => "Detail" end datatype verbosity = datatype Verbosity.t val verbosity = control {name = "verbosity", default = Silent, toString = Verbosity.toString} val warnAnn = control {name = "warn unrecognized annotation", default = true, toString = Bool.toString} val warnDeprecated = control {name = "warn deprecated features", default = true, toString = Bool.toString} val zoneCutDepth: int ref = control {name = "zone cut depth", default = 100, toString = Int.toString} val defaults = setDefaults val _ = defaults () end mlton-20100608/mlton/control/control.sig0000644000076600000240000000566311404435622016567 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONTROL = sig include CONTROL_FLAGS (* Tracing and other informative messages. * Some take a verbosity argument that specifies the verbosity level at * which messages should be printed. *) val message: verbosity * (unit -> Layout.t) -> unit val messageStr: verbosity * string -> unit val sizeMessage: string * 'a -> Layout.t val trace: verbosity * string -> ('a -> 'b) -> 'a -> 'b type traceAccum val traceAccum: verbosity * string -> (traceAccum * (unit -> unit)) val traceAdd: traceAccum * string -> ('a -> 'b) -> 'a -> 'b val traceBatch: verbosity * string -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) val indent: unit -> unit val unindent: unit -> unit val getDepth: unit -> int (*------------------------------------*) (* Error Reporting *) (*------------------------------------*) val checkFile: File.t * {fail: string -> 'a, name: string, ok: unit -> 'a} -> 'a val checkForErrors: string -> unit val error: Region.t * Layout.t * Layout.t -> unit val errorStr: Region.t * string -> unit (* abort compilation once this many errors reached *) val errorThreshhold: int ref val numErrors: int ref val warning: Region.t * Layout.t * Layout.t -> unit (*------------------------------------*) (* Compiler Passes *) (*------------------------------------*) datatype style = No | Assembly | C | Dot | ML datatype 'a display = NoDisplay | Layout of 'a -> Layout.t | Layouts of 'a * (Layout.t -> unit) -> unit val diagnostic: (unit -> Layout.t) -> unit val diagnostics: ((Layout.t -> unit) -> unit) -> unit val maybeSaveToFile: {name: string, suffix: string} * style * 'a * 'a display -> unit val saveToFile: {suffix: string} * style * 'a * 'a display -> unit val outputHeader: style * (Layout.t -> unit) -> unit val outputHeader': style * Out.t -> unit val pass: {display: 'a display, name: string, stats: 'a -> Layout.t, style: style, suffix: string, thunk: unit -> 'a} -> 'a val passTypeCheck: {display: 'a display, name: string, stats: 'a -> Layout.t, style: style, suffix: string, thunk: unit -> 'a, typeCheck: 'a -> unit} -> 'a end mlton-20100608/mlton/control/control.sml0000644000076600000240000002774011404435622016600 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Control: CONTROL = struct open ControlFlags structure Verbosity = struct datatype t = datatype verbosity val op <= = fn (Silent, _) => true | (Top, Silent) => false | (Top, _) => true | (Pass, Pass) => true | (_, Detail) => true | _ => false end datatype style = No | Assembly | C | Dot | ML val preSuf = fn No => ("", "") | Assembly => ("/* ", " */") | C => ("/* ", " */") | Dot => ("// ", "") | ML => ("(* ", " *)") fun outputHeader (style: style, output: Layout.t -> unit) = let val (pre, suf) = preSuf style val lines = Version.banner :: concat [" created this file on ", Date.toString (Date.now ()), "."] :: "Do not edit this file." :: "Flag settings: " :: (List.map (all (), fn {name, value} => concat [" ", name, ": ", value])) in List.foreach (lines, fn l => output (Layout.str (concat [pre, l, suf]))) end fun outputHeader' (style, out: Out.t) = outputHeader (style, fn l => (Layout.output (l, out); Out.newline out)) val depth: int ref = ref 0 fun getDepth () = !depth fun indent () = depth := !depth + 3 fun unindent () = depth := !depth - 3 fun message (verb: Verbosity.t, th: unit -> Layout.t): unit = if Verbosity.<= (verb, !verbosity) then let val out = Out.error val lay = th () in if Layout.isEmpty lay then () else (Layout.output (Layout.indent (lay, !depth), out) ; Out.newline out) end else () fun messageStr (verb, s: string): unit = message (verb, fn () => Layout.str s) fun time () = let open Time val {children, self, gc, ...} = times () fun add {utime, stime} = utime + stime in (add self + add children, add gc) end fun timeToString {total, gc} = let fun fmt (x, n) = Real.format (x, Real.Format.fix (SOME n)) val toReal = Real.fromIntInf o Time.toMilliseconds val per = if Time.equals (total, Time.zero) then "0" else fmt (100.0 * (toReal gc / toReal total), 0) fun t2s t = fmt (Real./ (toReal t, 1000.0), 2) in concat [t2s (Time.- (total, gc)), " + ", t2s gc, " (", per, "% GC)"] end fun trace (verb, name: string) (f: 'a -> 'b) (a: 'a): 'b = if Verbosity.<= (verb, !verbosity) then let val _ = messageStr (verb, concat [name, " starting"]) val (t, gc) = time () val _ = indent () fun done () = let val _ = unindent () val (t', gc') = time () in timeToString {total = Time.- (t', t), gc = Time.- (gc', gc)} end in (f a before messageStr (verb, concat [name, " finished in ", done ()])) handle e => (messageStr (verb, concat [name, " raised in ", done ()]) ; messageStr (verb, concat [name, " raised: ", Exn.name e]) ; (case Exn.history e of [] => () | history => (messageStr (verb, concat [name, " raised with history: "]) ; (List.foreach (history, fn s => messageStr (verb, concat ["\t", s]))))) ; raise e) end else f a type traceAccum = {verb: verbosity, total: Time.t ref, totalGC: Time.t ref} val traceAccum: (verbosity * string) -> (traceAccum * (unit -> unit)) = fn (verb, name) => let val total = ref Time.zero val totalGC = ref Time.zero in ({verb = verb, total = total, totalGC = totalGC}, fn () => messageStr (verb, concat [name, " totals ", timeToString {total = !total, gc = !totalGC}])) end val ('a, 'b) traceAdd: (traceAccum * string) -> ('a -> 'b) -> 'a -> 'b = fn ({verb, total, totalGC}, name) => fn f => fn a => if Verbosity.<= (verb, !verbosity) then let val (t, gc) = time () fun done () = let val (t', gc') = time () in total := Time.+ (!total, Time.- (t', t)) ; totalGC := Time.+ (!totalGC, Time.- (gc', gc)) end in (f a before done ()) handle e => (messageStr (verb, concat [name, " raised"]) ; (case Exn.history e of [] => () | history => (messageStr (verb, concat [name, " raised with history: "]) ; (List.foreach (history, fn s => messageStr (verb, concat ["\t", s]))))) ; raise e) end else f a val ('a, 'b) traceBatch: (verbosity * string) -> ('a -> 'b) -> (('a -> 'b) * (unit -> unit)) = fn (verb, name) => let val (ta,taMsg) = traceAccum (verb, name) in fn f => (traceAdd (ta,name) f, taMsg) end (*------------------------------------*) (* Errors *) (*------------------------------------*) val numErrors: int ref = ref 0 val errorThreshhold: int ref = ref 20 val die = Process.fail local fun msg (kind: string, r: Region.t, msg: Layout.t, extra: Layout.t): unit = let open Layout val p = case Region.left r of NONE => "" | SOME p => SourcePos.toString p val msg = Layout.toString msg val msg = Layout.str (concat [String.fromChar (Char.toUpper (String.sub (msg, 0))), String.dropPrefix (msg, 1), "."]) in outputl (align [seq [str (concat [kind, ": "]), str p, str "."], indent (align [msg, indent (extra, 2)], 2)], Out.error) end in fun warning (r, m, e) = msg ("Warning", r, m, e) fun error (r, m, e) = let val _ = Int.inc numErrors val _ = msg ("Error", r, m, e) in if !numErrors = !errorThreshhold then die "compilation aborted: too many errors" else () end end fun errorStr (r, msg) = error (r, Layout.str msg, Layout.empty) fun checkForErrors (name: string) = if !numErrors > 0 then die (concat ["compilation aborted: ", name, " reported errors"]) else () fun checkFile (f: File.t, {fail: string -> 'a, name, ok: unit -> 'a}): 'a = let fun check (test, msg, k) = if test f then k () else fail (concat ["File ", name, " ", msg]) in check (File.doesExist, "does not exist", fn () => check (File.canRead, "cannot be read", ok)) end (*---------------------------------------------------*) (* Compiler Passes *) (*---------------------------------------------------*) datatype 'a display = NoDisplay | Layout of 'a -> Layout.t | Layouts of 'a * (Layout.t -> unit) -> unit fun 'a sizeMessage (name: string, a: 'a): Layout.t = let open Layout in str (concat [name, " size = ", Int.toCommaString (MLton.size a), " bytes"]) end val diagnosticWriter: (Layout.t -> unit) option ref = ref NONE fun diagnostics f = case !diagnosticWriter of NONE => () | SOME w => f w fun diagnostic f = diagnostics (fn disp => disp (f ())) fun saveToFile ({suffix: string}, style, a: 'a, d: 'a display): unit = let fun doit f = trace (Pass, "display") Ref.fluidLet (inputFile, concat [!inputFile, ".", suffix], fn () => File.withOut (!inputFile, fn out => f (fn l => (Layout.outputl (l, out))))) in case d of NoDisplay => () | Layout layout => doit (fn output => (outputHeader (style, output) ; output (layout a))) | Layouts layout => doit (fn output => (outputHeader (style, output) ; layout (a, output))) end fun maybeSaveToFile ({name: string, suffix: string}, style: style, a: 'a, d: 'a display): unit = if not (List.exists (!keepPasses, fn re => Regexp.Compiled.matchesAll (re, name))) then () else saveToFile ({suffix = concat [name, ".", suffix]}, style, a, d) (* Code for diagnosing a pass. *) val wrapDiagnosing = fn {name: string, thunk: unit -> 'a} => if not (List.exists (!diagPasses, fn re => Regexp.Compiled.matchesAll (re, name))) then thunk else fn () => let val result = ref NONE val _ = saveToFile ({suffix = concat [name, ".diagnostic"]}, No, (), Layouts (fn ((), disp) => (diagnosticWriter := SOME disp ; result := SOME (thunk ()) ; diagnosticWriter := NONE))) in valOf (!result) end (* Code for profiling a pass. *) val wrapProfiling = fn {name: string, thunk: unit -> 'a} => if MLton.Profile.isOn then if not (List.exists (!profPasses, fn re => Regexp.Compiled.matchesAll (re, name))) then thunk else fn () => let open MLton.Profile val d = Data.malloc () in Exn.finally (fn () => withData (d, thunk), fn () => (Data.write (d, concat [!inputFile, ".", name, ".mlmon"]) ; Data.free d)) end else thunk fun pass {display: 'a display, name: string, suffix: string, stats: 'a -> Layout.t, style: style, thunk: unit -> 'a}: 'a = let val thunk = wrapDiagnosing {name = name, thunk = thunk} val thunk = wrapProfiling {name = name, thunk = thunk} val result = trace (Pass, name) thunk () val verb = Detail val _ = message (verb, fn () => Layout.str (concat [name, " stats"])) val _ = indent () val _ = message (verb, fn () => sizeMessage (suffix, result)) val _ = message (verb, fn () => stats result) val _ = message (verb, PropertyList.stats) val _ = message (verb, HashSet.stats) val _ = unindent () val _ = checkForErrors name val _ = maybeSaveToFile ({name = name, suffix = suffix}, style, result, display) in result end fun passTypeCheck {display: 'a display, name: string, stats: 'a -> Layout.t, style: style, suffix: string, thunk: unit -> 'a, typeCheck = tc: 'a -> unit}: 'a = let val result = pass {display = display, name = name, stats = stats, style = style, suffix = suffix, thunk = thunk} val _ = if !typeCheck then trace (Pass, "typeCheck") tc result else () in result end end mlton-20100608/mlton/control/pretty.sig0000644000076600000240000000147611404435622016434 0ustar mtfstaff(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRETTY = sig type t = Layout.t val casee: {default: t option, rules: (t * t) vector, test: t} -> t val conApp: {arg: t option, con: Layout.t, targs: Layout.t vector} -> t val handlee: {catch: t, handler: t, try: t} -> t val lett: t * t -> t val locall: t * t -> t val longid: t list * t -> t val primApp: {args: t vector, prim: t, targs: t vector} -> t val raisee: t -> t val seq: t vector -> t end mlton-20100608/mlton/control/pretty.sml0000644000076600000240000000322311404435622016435 0ustar mtfstaff(* Copyright (C) 2003-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Pretty: PRETTY = struct open Layout fun casee {default, rules, test} = let val rules = case default of NONE => rules | SOME l => Vector.concat [rules, Vector.new1 (str "_", l)] in align [seq [str "case ", test, str " of"], indent (alignPrefix (Vector.toListMap (rules, fn (lhs, rhs) => mayAlign [seq [lhs, str " =>"], rhs]), "| "), 2)] end fun conApp {arg, con, targs} = seq [con, if !Control.showTypes then tuple (Vector.toList targs) else empty, case arg of NONE => empty | SOME x => seq [str " ", x]] fun handlee {catch, handler, try} = align [try, seq [str "handle ", catch, str " => ", handler]] fun longid (ls, l) = seq (separate (ls @ [l], ".")) fun nest (prefix, x, y) = align [seq [str prefix, x], str "in", indent (y, 3), str "end"] fun lett (d, e) = nest ("let ", d, e) fun locall (d, d') = nest ("local ", d, d') fun primApp {args, prim, targs} = seq [prim, if !Control.showTypes andalso 0 < Vector.length targs then list (Vector.toList targs) else empty, str " ", tuple (Vector.toList args)] fun raisee exn = seq [str "raise ", exn] fun seq es = mayAlign (separateLeft (Vector.toList es, ";")) end mlton-20100608/mlton/control/region.sig0000644000076600000240000000233211404435622016360 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REGION_STRUCTS = sig end signature REGION = sig include REGION_STRUCTS type t val <= : t * t -> bool val append: t * t -> t val bogus: t val compare: t * t -> Relation.t val equals: t * t -> bool val extendRight: t * SourcePos.t -> t val left: t -> SourcePos.t option val layout: t -> Layout.t val make: {left: SourcePos.t, right: SourcePos.t} -> t val right: t -> SourcePos.t option val toString: t -> string structure Wrap: sig type region type 'a t val region: 'a t -> region val node: 'a t -> 'a val makeRegion: 'a * region -> 'a t val makeRegion': 'a * SourcePos.t * SourcePos.t -> 'a t (* val make: 'a -> 'a t *) val dest: 'a t -> 'a * region (* val left: 'a t -> int *) (* val right: 'a t -> int *) end sharing type Wrap.region = t end mlton-20100608/mlton/control/region.sml0000644000076600000240000000372211404435622016375 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Region: REGION = struct datatype t = Bogus | T of {left: SourcePos.t, right: SourcePos.t} val bogus = Bogus local fun make f r = case r of Bogus => NONE | T r => SOME (f r) in val left = make #left val right = make #right end val extendRight = fn (Bogus, _) => Bogus | (T {left, ...}, right) => T {left = left, right = right} val toString = fn Bogus => "Bogus" | T {left, right} => concat [SourcePos.file left, ":", SourcePos.posToString left, "-", SourcePos.posToString right] val layout = Layout.str o toString val make = T val append = fn (Bogus, r) => r | (r, Bogus) => r | (T {left, ...}, T {right, ...}) => T {left = left, right = right} fun compare (r, r') = case (left r, left r') of (NONE, NONE) => EQUAL | (NONE, _) => LESS | (_, NONE) => GREATER | (SOME p, SOME p') => SourcePos.compare (p, p') val compare = Trace.trace2 ("Region.compare", layout, layout, Relation.layout) compare fun equals (r, r') = compare (r, r') = EQUAL fun r <= r' = case compare (r, r') of EQUAL => true | GREATER => false | LESS => true structure Wrap = struct type region = t datatype 'a t = T of {node: 'a, region: region} fun node (T {node, ...}) = node fun region (T {region, ...}) = region fun makeRegion (node, region) = T {node = node, region = region} fun makeRegion' (node, left, right) = T {node = node, region = make {left = left, right = right}} fun dest (T {node, region}) = (node, region) end end mlton-20100608/mlton/control/source-pos.sig0000644000076600000240000000136011404435622017174 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SOURCE_POS_STRUCTS = sig end signature SOURCE_POS = sig include SOURCE_POS_STRUCTS type t val bogus: t val column: t -> int val compare: t * t -> Relation.t val equals: t * t -> bool val file: t -> File.t val line: t -> int val make: {column: int, file: File.t, line: int} -> t val posToString: t -> string val toString: t -> string end mlton-20100608/mlton/control/source-pos.sml0000644000076600000240000000315211404435622017206 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure SourcePos: SOURCE_POS = struct datatype t = T of {column: int, file: File.t, line: int} local fun f g (T r) = g r in val column = f #column val line = f #line end fun compare (T {column = c, file = f, line = l}, T {column = c', file = f', line = l'}) = case String.compare (f, f') of EQUAL => (case Int.compare (l, l') of EQUAL => Int.compare (c, c') | r => r) | r => r fun equals (T r, T r') = r = r' val _ = equals fun make {column, file, line} = T {column = column, file = file, line = line} fun getLib (T {file, ...}) = let val libDir = concat [!ControlFlags.libDir, "/sml"] in if String.hasPrefix (file, {prefix = libDir}) then SOME (String.size libDir) else NONE end fun file (p as T {file, ...}) = if !ControlFlags.preferAbsPaths then file else case getLib p of NONE => file | SOME i => concat ["$(SML_LIB)", String.dropPrefix (file, i)] val bogus = T {column = ~1, file = "", line = ~1} fun toString (p as T {column, line, ...}) = concat [file p, " ", Int.toString line, ".", Int.toString column] fun posToString (T {line, column, ...}) = concat [Int.toString line, ".", Int.toString column] end mlton-20100608/mlton/control/source.sig0000644000076600000240000000122511404435622016375 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SOURCE = sig type t (* The pos in the following specs is a file position (e.g. yypos of mllex). *) val getPos: t * int -> SourcePos.t val lineDirective: t * File.t option * {lineNum: int, lineStart: int} -> unit val lineStart: t -> SourcePos.t val new: File.t -> t val newline: t * int -> unit end mlton-20100608/mlton/control/source.sml0000644000076600000240000000246711404435622016417 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Source: SOURCE = struct datatype t = T of {file: File.t ref, lineNum: int ref, lineStart: int ref} fun getPos (T {file, lineNum, lineStart, ...}, n) = SourcePos.make {column = n - !lineStart, file = !file, line = !lineNum} fun lineStart (s as T {lineStart, ...}) = getPos (s, !lineStart) fun lineDirective (T {file, lineNum, lineStart}, f, {lineNum = n, lineStart = s}) = (Option.app (f, fn f => file := f) ; lineNum := n ; lineStart := s) fun new file = T {file = ref file, lineNum = ref 1, (* mllex file positions start at zero, while we report errors * starting in column 1, so we need to pretend the first line * starts at position ~1, which will translate position 0 to * column 1. *) lineStart = ref ~1} fun newline (T {lineStart, lineNum, ...}, n) = (Int.inc lineNum ; lineStart := n) end mlton-20100608/mlton/control/sources.cm0000644000076600000240000000127411404435622016401 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature REGION structure Bits structure Bytes structure Control structure Pretty structure Region structure Source structure SourcePos structure System structure Version is ../../lib/mlton/sources.cm bits.sml control-flags.sig control-flags.sml source-pos.sig source-pos.sml region.sig region.sml source.sig source.sml version.sml control.sig control.sml system.sig system.sml pretty.sig pretty.sml mlton-20100608/mlton/control/sources.mlb0000644000076600000240000000137211404435622016553 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb bits.sml control-flags.sig control-flags.sml source-pos.sig source-pos.sml region.sig region.sml source.sig source.sml version.sml control.sig control.sml system.sig system.sml pretty.sig pretty.sml in structure Bits structure Bytes structure Control structure Pretty structure Region structure Source structure SourcePos structure System structure Version end mlton-20100608/mlton/control/system.sig0000644000076600000240000000056011404435622016422 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SYSTEM = sig val system: string * string list -> unit end mlton-20100608/mlton/control/system.sml0000644000076600000240000000534111404435622016435 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure System: SYSTEM = struct fun insertBackslashes (ss: string list, width: int, indent: int): string list = let val indentation = String.make (indent, #" ") fun loop (ss, pos, line, lines) = (* pos + 2 < width (so the backslash can be inserted) *) case ss of [] => rev (concat (rev line) :: lines) | s :: ss => let val n = String.size s val (pos, line') = case line of [] => (pos + n, [s]) | _ => (pos + n + 1, s :: " " :: line) fun newLine () = loop (ss, indent + n, [s, indentation], concat (rev (" \\" :: line)) :: lines) in if pos <= width then case ss of [] => rev (concat (rev line') :: lines) | _ => if pos + 2 <= width then loop (ss, pos, line', lines) else newLine () else newLine () end in loop (ss, 0, [], []) end fun system (com: string, args: string list): unit = let (* Many terminal emulators do the line folding one character early, * so we use 79 instead of 80 columns. *) val width = 79 val indentAmount = 4 val s = concat (List.separate (com :: args, " ")) val _ = let open Control in message (Top, fn () => Layout.align (List.map (insertBackslashes (com :: args, width - getDepth (), indentAmount), Layout.str))) end in Process.wait (MLton.Process.spawnp {file = com, args = com :: args}) handle e => Error.bug (concat ["call to system failed with ", Exn.toString e, ":\n", s]) end end mlton-20100608/mlton/control/version_sml.src0000644000076600000240000000065611404470407017451 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Version = struct val version = "20100608" val buildDate = "MLTONBUILDDATE" val buildNode = "MLTONBUILDNODE" val banner = concat ["MLton ", version, " (built ", buildDate, " on ", buildNode, ")"] end mlton-20100608/mlton/core-ml/0000755000076600000240000000000011404470407014247 5ustar mtfstaffmlton-20100608/mlton/core-ml/core-ml.fun0000644000076600000240000004323711404435623016331 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CoreML (S: CORE_ML_STRUCTS): CORE_ML = struct open S structure Field = Record.Field fun maybeConstrain (x, t) = let open Layout in if !Control.showTypes then seq [x, str ": ", Type.layout t] else x end fun layoutTargs (ts: Type.t vector) = let open Layout in if !Control.showTypes andalso 0 < Vector.length ts then list (Vector.toListMap (ts, Type.layout)) else empty end structure Pat = struct datatype t = T of {node: node, ty: Type.t} and node = Con of {arg: t option, con: Con.t, targs: Type.t vector} | Const of unit -> Const.t | Layered of Var.t * t | List of t vector | Record of t Record.t | Tuple of t vector | Var of Var.t | Wild local fun make f (T r) = f r in val dest = make (fn {node, ty} => (node, ty)) val node = make #node val ty = make #ty end fun make (n, t) = T {node = n, ty = t} fun layout p = let val t = ty p open Layout in case node p of Con {arg, con, targs} => seq [Con.layout con, layoutTargs targs, case arg of NONE => empty | SOME p => seq [str " ", layout p]] | Const f => Const.layout (f ()) | Layered (x, p) => seq [maybeConstrain (Var.layout x, t), str " as ", layout p] | List ps => list (Vector.toListMap (ps, layout)) | Record r => record (Vector.toListMap (Record.toVector r, fn (f, p) => (Field.toString f, layout p))) | Tuple ps => tuple (Vector.toListMap (ps, layout)) | Var x => maybeConstrain (Var.layout x, t) | Wild => str "_" end fun wild t = make (Wild, t) fun var (x, t) = make (Var x, t) fun tuple ps = make (Tuple ps, Type.tuple (Vector.map (ps, ty))) local fun bool c = make (Con {arg = NONE, con = c, targs = Vector.new0 ()}, Type.bool) in val falsee: t = bool Con.falsee val truee: t = bool Con.truee end fun isUnit (p: t): bool = case node p of Tuple v => 0 = Vector.length v | _ => false fun isWild (p: t): bool = case node p of Wild => true | _ => false fun isRefutable (p: t): bool = case node p of Con _ => true | Const _ => true | Layered (_, p) => isRefutable p | List _ => true | Record r => Record.exists (r, isRefutable) | Tuple ps => Vector.exists (ps, isRefutable) | Var _ => false | Wild => false fun foreachVar (p: t, f: Var.t -> unit): unit = let fun loop (p: t): unit = case node p of Con _ => () | Const _ => () | Layered (x, p) => (f x; loop p) | List ps => Vector.foreach (ps, loop) | Record r => Record.foreach (r, loop) | Tuple ps => Vector.foreach (ps, loop) | Var x => f x | Wild => () in loop p end end structure NoMatch = struct datatype t = Impossible | RaiseAgain | RaiseBind | RaiseMatch end datatype noMatch = datatype NoMatch.t datatype dec = Datatype of {cons: {arg: Type.t option, con: Con.t} vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector | Exception of {arg: Type.t option, con: Con.t} | Fun of {decs: {lambda: lambda, var: Var.t} vector, tyvars: unit -> Tyvar.t vector} | Val of {nonexhaustiveExnMatch: Control.Elaborate.DiagDI.t, nonexhaustiveMatch: Control.Elaborate.DiagEIW.t, rvbs: {lambda: lambda, var: Var.t} vector, tyvars: unit -> Tyvar.t vector, vbs: {exp: exp, lay: unit -> Layout.t, nest: string list, pat: Pat.t, patRegion: Region.t} vector} and exp = Exp of {node: expNode, ty: Type.t} and expNode = App of exp * exp | Case of {kind: string, lay: unit -> Layout.t, nest: string list, noMatch: noMatch, nonexhaustiveExnMatch: Control.Elaborate.DiagDI.t, nonexhaustiveMatch: Control.Elaborate.DiagEIW.t, redundantMatch: Control.Elaborate.DiagEIW.t, region: Region.t, rules: {exp: exp, lay: (unit -> Layout.t) option, pat: Pat.t} vector, test: exp} | Con of Con.t * Type.t vector | Const of unit -> Const.t | EnterLeave of exp * SourceInfo.t | Handle of {catch: Var.t * Type.t, handler: exp, try: exp} | Lambda of lambda | Let of dec vector * exp | List of exp vector | PrimApp of {args: exp vector, prim: Type.t Prim.t, targs: Type.t vector} | Raise of exp | Record of exp Record.t | Seq of exp vector | Var of (unit -> Var.t) * (unit -> Type.t vector) and lambda = Lam of {arg: Var.t, argType: Type.t, body: exp, mayInline: bool} local open Layout in fun layoutTyvars (ts: Tyvar.t vector) = case Vector.length ts of 0 => empty | 1 => seq [str " ", Tyvar.layout (Vector.sub (ts, 0))] | _ => seq [str " ", tuple (Vector.toListMap (ts, Tyvar.layout))] fun layoutConArg {arg, con} = seq [Con.layout con, case arg of NONE => empty | SOME t => seq [str " of ", Type.layout t]] fun layoutDec d = case d of Datatype v => seq [str "datatype", align (Vector.toListMap (v, fn {cons, tycon, tyvars} => seq [layoutTyvars tyvars, str " ", Tycon.layout tycon, str " = ", align (separateLeft (Vector.toListMap (cons, layoutConArg), "| "))]))] | Exception ca => seq [str "exception ", layoutConArg ca] | Fun {decs, tyvars, ...} => layoutFuns (tyvars, decs) | Val {rvbs, tyvars, vbs, ...} => align [layoutFuns (tyvars, rvbs), align (Vector.toListMap (vbs, fn {exp, pat, ...} => seq [str "val", mayAlign [seq [layoutTyvars (tyvars ()), str " ", Pat.layout pat, str " ="], layoutExp exp]]))] and layoutExp (Exp {node, ...}) = case node of App (e1, e2) => paren (seq [layoutExp e1, str " ", layoutExp e2]) | Case {rules, test, ...} => Pretty.casee {default = NONE, rules = Vector.map (rules, fn {exp, pat, ...} => (Pat.layout pat, layoutExp exp)), test = layoutExp test} | Con (c, targs) => seq [Con.layout c, layoutTargs targs] | Const f => Const.layout (f ()) | EnterLeave (e, si) => seq [str "EnterLeave ", tuple [layoutExp e, SourceInfo.layout si]] | Handle {catch, handler, try} => Pretty.handlee {catch = Var.layout (#1 catch), handler = layoutExp handler, try = layoutExp try} | Lambda l => layoutLambda l | Let (ds, e) => Pretty.lett (align (Vector.toListMap (ds, layoutDec)), layoutExp e) | List es => list (Vector.toListMap (es, layoutExp)) | PrimApp {args, prim, targs} => Pretty.primApp {args = Vector.map (args, layoutExp), prim = Prim.layout prim, targs = Vector.map (targs, Type.layout)} | Raise e => Pretty.raisee (layoutExp e) | Record r => Record.layout {extra = "", layoutElt = layoutExp, layoutTuple = fn es => tuple (Vector.toListMap (es, layoutExp)), record = r, separator = " = "} | Seq es => Pretty.seq (Vector.map (es, layoutExp)) | Var (var, targs) => if !Control.showTypes then let open Layout val targs = targs () in if Vector.isEmpty targs then Var.layout (var ()) else seq [Var.layout (var ()), str " ", Vector.layout Type.layout targs] end else Var.layout (var ()) and layoutFuns (tyvars, decs) = if 0 = Vector.length decs then empty else align [seq [str "val rec", layoutTyvars (tyvars ())], indent (align (Vector.toListMap (decs, fn {lambda as Lam {argType, body = Exp {ty = bodyType, ...}, ...}, var} => align [seq [maybeConstrain (Var.layout var, Type.arrow (argType, bodyType)), str " = "], indent (layoutLambda lambda, 3)])), 3)] and layoutLambda (Lam {arg, argType, body, ...}) = paren (align [seq [str "fn ", maybeConstrain (Var.layout arg, argType), str " =>"], layoutExp body]) fun layoutExpWithType (exp as Exp {ty, ...}) = let val node = layoutExp exp in if !Control.showTypes then seq [node, str " : ", Type.layout ty] else node end end structure Lambda = struct datatype t = datatype lambda val make = Lam fun dest (Lam r) = r val bogus = make {arg = Var.newNoname (), argType = Type.unit, body = Exp {node = Seq (Vector.new0 ()), ty = Type.unit}, mayInline = true} end structure Exp = struct type dec = dec type lambda = lambda datatype t = datatype exp datatype node = datatype expNode datatype noMatch = datatype noMatch val layout = layoutExp val layoutWithType = layoutExpWithType local fun make f (Exp r) = f r in val dest = make (fn {node, ty} => (node, ty)) val node = make #node val ty = make #ty end fun make (n, t) = Exp {node = n, ty = t} fun var (x: Var.t, ty: Type.t): t = make (Var (fn () => x, fn () => Vector.new0 ()), ty) fun isExpansive (e: t): bool = case node e of App (e1, e2) => (case node e1 of Con (c, _) => Con.equals (c, Con.reff) orelse isExpansive e2 | _ => true) | Case _ => true | Con _ => false | Const _ => false | EnterLeave _ => true | Handle _ => true | Lambda _ => false | Let _ => true | List es => Vector.exists (es, isExpansive) | PrimApp _ => true | Raise _ => true | Record r => Record.exists (r, isExpansive) | Seq _ => true | Var _ => false fun tuple es = if 1 = Vector.length es then Vector.sub (es, 0) else make (Record (Record.tuple es), Type.tuple (Vector.map (es, ty))) val unit = tuple (Vector.new0 ()) local fun bool c = make (Con (c, Vector.new0 ()), Type.bool) in val falsee: t = bool Con.falsee val truee: t = bool Con.truee end fun lambda (l as Lam {argType, body, ...}) = make (Lambda l, Type.arrow (argType, ty body)) fun casee (z as {rules, ...}) = if 0 = Vector.length rules then Error.bug "CoreML.Exp.casee" else make (Case z, ty (#exp (Vector.sub (rules, 0)))) fun iff (test, thenCase, elseCase): t = casee {kind = "if", lay = fn () => Layout.empty, nest = [], noMatch = Impossible, nonexhaustiveExnMatch = Control.Elaborate.DiagDI.Default, nonexhaustiveMatch = Control.Elaborate.DiagEIW.Ignore, redundantMatch = Control.Elaborate.DiagEIW.Ignore, region = Region.bogus, rules = Vector.new2 ({exp = thenCase, lay = NONE, pat = Pat.truee}, {exp = elseCase, lay = NONE, pat = Pat.falsee}), test = test} fun andAlso (e1, e2) = iff (e1, e2, falsee) fun orElse (e1, e2) = iff (e1, truee, e2) fun whilee {expr, test} = let val loop = Var.newNoname () val loopTy = Type.arrow (Type.unit, Type.unit) val call = make (App (var (loop, loopTy), unit), Type.unit) val lambda = Lambda.make {arg = Var.newNoname (), argType = Type.unit, body = iff (test, make (Seq (Vector.new2 (expr, call)), Type.unit), unit), mayInline = true} in make (Let (Vector.new1 (Fun {decs = Vector.new1 {lambda = lambda, var = loop}, tyvars = fn () => Vector.new0 ()}), call), Type.unit) end fun foreachVar (e: t, f: Var.t -> unit): unit = let fun loop (e: t): unit = case node e of App (e1, e2) => (loop e1; loop e2) | Case {rules, test, ...} => (loop test ; Vector.foreach (rules, loop o #exp)) | Con _ => () | Const _ => () | EnterLeave (e, _) => loop e | Handle {handler, try, ...} => (loop handler; loop try) | Lambda l => loopLambda l | Let (ds, e) => (Vector.foreach (ds, loopDec) ; loop e) | List es => Vector.foreach (es, loop) | PrimApp {args, ...} => Vector.foreach (args, loop) | Raise e => loop e | Record r => Record.foreach (r, loop) | Seq es => Vector.foreach (es, loop) | Var (x, _) => f (x ()) and loopDec d = case d of Datatype _ => () | Exception _ => () | Fun {decs, ...} => Vector.foreach (decs, loopLambda o #lambda) | Val {rvbs, vbs, ...} => (Vector.foreach (rvbs, loopLambda o #lambda) ; Vector.foreach (vbs, loop o #exp)) and loopLambda (Lam {body, ...}) = loop body in loop e end end structure Dec = struct datatype t = datatype dec val layout = layoutDec end structure Program = struct datatype t = T of {decs: Dec.t vector} fun layouts (T {decs, ...}, output') = let open Layout (* Layout includes an output function, so we need to rebind output * to the one above. *) val output = output' in output (Layout.str "\n\nDecs:") ; Vector.foreach (decs, output o Dec.layout) end (* fun typeCheck (T {decs, ...}) = * let * fun checkExp (e: Exp.t): Ty.t = * let * val (n, t) = Exp.dest e * val * datatype z = datatype Exp.t * val t' = * case n of * App (e1, e2) => * let * val t1 = checkExp e1 * val t2 = checkExp e2 * in * case Type.deArrowOpt t1 of * NONE => error "application of non-function" * | SOME (u1, u2) => * if Type.equals (u1, t2) * then t2 * else error "function/argument mismatch" * end * | Case {rules, test} => * let * val {pat, exp} = Vector.sub (rules, 0) * in * Vector.foreach (rules, fn {pat, exp} => * Type.equals * (checkPat pat, * end * in * * end * in * end *) end end mlton-20100608/mlton/core-ml/core-ml.sig0000644000076600000240000001501511404435623016314 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CORE_ML_STRUCTS = sig include ATOMS structure Type: sig type t val arrow: t * t -> t val bool: t val deConOpt: t -> (Tycon.t * t vector) option val deRecord: t -> (Record.Field.t * t) vector val isCharX: t -> bool val isInt: t -> bool val layout: t -> Layout.t val makeHom: {con: Tycon.t * 'a vector -> 'a, var: Tyvar.t -> 'a} -> {destroy: unit -> unit, hom: t -> 'a} val tuple: t vector -> t val unit: t end end signature CORE_ML = sig include CORE_ML_STRUCTS structure Pat: sig type t datatype node = Con of {arg: t option, con: Con.t, targs: Type.t vector} | Const of unit -> Const.t | Layered of Var.t * t | List of t vector | Record of t Record.t | Tuple of t vector | Var of Var.t | Wild val dest: t -> node * Type.t val falsee: t val foreachVar: t * (Var.t -> unit) -> unit (* true if pattern contains a constant, constructor or variable *) val isRefutable: t -> bool val isUnit: t -> bool val isWild: t -> bool val layout: t -> Layout.t val make: node * Type.t -> t val node: t -> node val var: Var.t * Type.t -> t val truee: t val tuple: t vector -> t val ty: t -> Type.t val wild: Type.t -> t end structure Exp: sig type dec type lambda type t datatype noMatch = Impossible | RaiseAgain | RaiseBind | RaiseMatch datatype node = App of t * t | Case of {kind: string, lay: unit -> Layout.t, nest: string list, noMatch: noMatch, nonexhaustiveExnMatch: Control.Elaborate.DiagDI.t, nonexhaustiveMatch: Control.Elaborate.DiagEIW.t, redundantMatch: Control.Elaborate.DiagEIW.t, region: Region.t, rules: {exp: t, lay: (unit -> Layout.t) option, pat: Pat.t} vector, test: t} | Con of Con.t * Type.t vector | Const of unit -> Const.t | EnterLeave of t * SourceInfo.t | Handle of {catch: Var.t * Type.t, handler: t, try: t} | Lambda of lambda | Let of dec vector * t | List of t vector | PrimApp of {args: t vector, prim: Type.t Prim.t, targs: Type.t vector} | Raise of t | Record of t Record.t | Seq of t vector | Var of (unit -> Var.t) * (unit -> Type.t vector) val andAlso: t * t -> t val casee: {kind: string, lay: unit -> Layout.t, nest: string list, noMatch: noMatch, nonexhaustiveExnMatch: Control.Elaborate.DiagDI.t, nonexhaustiveMatch: Control.Elaborate.DiagEIW.t, redundantMatch: Control.Elaborate.DiagEIW.t, region: Region.t, rules: {exp: t, lay: (unit -> Layout.t) option, pat: Pat.t} vector, test: t} -> t val dest: t -> node * Type.t val iff: t * t * t -> t val falsee: t val foreachVar: t * (Var.t -> unit) -> unit (* true if the expression may side-effect. See p 19 of Definition *) val isExpansive: t -> bool val lambda: lambda -> t val layout: t -> Layout.t val layoutWithType: t -> Layout.t val make: node * Type.t -> t val node: t -> node val orElse: t * t -> t val truee: t val tuple: t vector -> t val ty: t -> Type.t val unit: t val var: Var.t * Type.t -> t val whilee: {expr: t, test: t} -> t end structure Lambda: sig type t val bogus: t val dest: t -> {arg: Var.t, argType: Type.t, body: Exp.t, mayInline: bool} val make: {arg: Var.t, argType: Type.t, body: Exp.t, mayInline: bool} -> t end sharing type Exp.lambda = Lambda.t structure Dec: sig datatype t = Datatype of {cons: {arg: Type.t option, con: Con.t} vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector | Exception of {arg: Type.t option, con: Con.t} | Fun of {decs: {lambda: Lambda.t, var: Var.t} vector, tyvars: unit -> Tyvar.t vector} | Val of {nonexhaustiveExnMatch: Control.Elaborate.DiagDI.t, nonexhaustiveMatch: Control.Elaborate.DiagEIW.t, rvbs: {lambda: Lambda.t, var: Var.t} vector, tyvars: unit -> Tyvar.t vector, vbs: {exp: Exp.t, lay: unit -> Layout.t, nest: string list, pat: Pat.t, patRegion: Region.t} vector} val layout: t -> Layout.t end sharing type Exp.dec = Dec.t structure Program: sig datatype t = T of {decs: Dec.t vector} val layouts: t * (Layout.t -> unit) -> unit end end mlton-20100608/mlton/core-ml/dead-code.fun0000644000076600000240000000523011404435623016567 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor DeadCode (S: DEAD_CODE_STRUCTS): DEAD_CODE = struct open S open CoreML open Dec fun deadCode {prog} = let val {get = varIsUsed, set = setVarIsUsed, destroy, ...} = Property.destGetSet (Var.plist, Property.initConst false) fun patVarIsUsed (p: Pat.t): bool = Exn.withEscape (fn escape => (Pat.foreachVar (p, fn x => if varIsUsed x then escape true else ()) ; false)) fun decIsWild (d: Dec.t): bool = case d of Val {rvbs, vbs, ...} => 0 = Vector.length rvbs andalso 1 = Vector.length vbs andalso let val pat = #pat (Vector.sub (vbs, 0)) in Pat.isWild pat orelse Pat.isUnit pat end | _ => false fun decIsNeeded (d: Dec.t): bool = case d of Datatype _ => true | Exception _ => true | Fun {decs, ...} => Vector.exists (decs, varIsUsed o #var) | Val {rvbs, vbs, ...} => Vector.exists (rvbs, varIsUsed o #var) orelse Vector.exists (vbs, patVarIsUsed o #pat) orelse decIsWild d fun useVar x = setVarIsUsed (x, true) fun useExp (e: Exp.t): unit = Exp.foreachVar (e, useVar) fun useLambda (l: Lambda.t): unit = useExp (#body (Lambda.dest l)) fun useDec (d: Dec.t): unit = case d of Datatype _ => () | Exception _ => () | Fun {decs, ...} => Vector.foreach (decs, useLambda o #lambda) | Val {rvbs, vbs, ...} => (Vector.foreach (rvbs, useLambda o #lambda) ; Vector.foreach (vbs, useExp o #exp)) val n = Vector.length prog val m = n - 1 val prog = Vector.tabulate (n, fn i => let val (decs, deadCode) = Vector.sub (prog, m - i) in if deadCode then List.fold (rev decs, [], fn (dec, decs) => if decIsWild dec orelse decIsNeeded dec then (useDec dec; dec :: decs) else decs) else (List.foreach (decs, useDec) ; decs) end) val _ = destroy () in {prog = Vector.rev prog} end end mlton-20100608/mlton/core-ml/dead-code.sig0000644000076600000240000000100311404435623016553 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DEAD_CODE_STRUCTS = sig structure CoreML: CORE_ML end signature DEAD_CODE = sig include DEAD_CODE_STRUCTS val deadCode: {prog: (CoreML.Dec.t list * bool) vector} -> {prog: CoreML.Dec.t list vector} end mlton-20100608/mlton/core-ml/sources.cm0000644000076600000240000000070511404435623016256 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature CORE_ML functor CoreML functor DeadCode is ../ast/sources.cm ../atoms/sources.cm ../control/sources.cm ../../lib/mlton/sources.cm core-ml.sig core-ml.fun dead-code.sig dead-code.fun mlton-20100608/mlton/core-ml/sources.mlb0000644000076600000240000000075311404435623016434 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../ast/sources.mlb ../atoms/sources.mlb ../control/sources.mlb ../../lib/mlton/sources.mlb core-ml.sig core-ml.fun dead-code.sig dead-code.fun in signature CORE_ML functor CoreML functor DeadCode end mlton-20100608/mlton/defunctorize/0000755000076600000240000000000011404470407015412 5ustar mtfstaffmlton-20100608/mlton/defunctorize/defunctorize.fun0000644000076600000240000013744111404435624020641 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Defunctorize (S: DEFUNCTORIZE_STRUCTS): DEFUNCTORIZE = struct open S local open CoreML in structure Const = Const structure Cdec = Dec structure Cexp = Exp structure Clambda = Lambda structure Cpat = Pat structure Prim = Prim structure RealSize = RealSize structure Record = Record structure SourceInfo = SourceInfo structure Ctype = Type structure WordSize = WordSize structure WordX = WordX end structure Field = Record.Field local open Xml in structure Xcases = Cases structure Con = Con structure Xdec = Dec structure Xexp = DirectExp structure Xlambda = Lambda structure Xpat = Pat structure XprimExp = PrimExp structure Tycon = Tycon structure Xtype = Type structure Tyvar = Tyvar structure Var = Var structure XvarExp = VarExp end structure NestedPat = NestedPat (open Xml) structure MatchCompile = MatchCompile (open CoreML structure Type = Xtype structure NestedPat = NestedPat structure Cases = struct type exp = Xexp.t open Xcases type t = exp t val word = Word fun con v = Con (Vector.map (v, fn {con, targs, arg, rhs} => (Xpat.T {con = con, targs = targs, arg = arg}, rhs))) end structure Exp = struct open Xexp val lett = let1 val var = monoVar fun detuple {tuple, body} = Xexp.detuple {tuple = tuple, body = fn xts => body (Vector.map (xts, fn (x, t) => (XvarExp.var x, t)))} end) structure Xexp = struct open Xexp local fun exn (c: Con.t): Xexp.t = conApp {arg = NONE, con = c, targs = Vector.new0 (), ty = Xtype.exn} in val bind = exn Con.bind val match = exn Con.match end end fun enterLeave (e: Xexp.t, t, si): Xexp.t = Xexp.fromExp (Xml.Exp.enterLeave (Xexp.toExp e, t, si), t) val diagnostics: (unit -> unit) list ref = ref [] fun casee {caseType: Xtype.t, cases: {exp: Xexp.t, lay: (unit -> Layout.t) option, pat: NestedPat.t} vector, conTycon, kind: string, lay: unit -> Layout.t, nest: string list, noMatch, nonexhaustiveExnMatch: Control.Elaborate.DiagDI.t, nonexhaustiveMatch: Control.Elaborate.DiagEIW.t, redundantMatch: Control.Elaborate.DiagEIW.t, region: Region.t, test = (test: Xexp.t, testType: Xtype.t), tyconCons}: Xexp.t = let val cases = Vector.map (cases, fn {exp, lay, pat} => {exp = fn () => exp, isDefault = false, lay = lay, numUses = ref 0, pat = pat}) fun raiseExn (f, mayWrap) = let val e = Var.newNoname () val exp = Xexp.raisee {exn = f e, extend = true, ty = caseType} val exp = fn () => if let open Control in !profile <> ProfileNone andalso !profileIL = ProfileSource andalso !profileRaise end then case mayWrap of NONE => exp | SOME kind => enterLeave (exp, caseType, SourceInfo.function {name = (concat [""]) :: nest, region = region}) else exp in Vector.concat [cases, Vector.new1 {exp = exp, isDefault = true, lay = NONE, numUses = ref 0, pat = NestedPat.make (NestedPat.Var e, testType)}] end val cases = let datatype z = datatype Cexp.noMatch in case noMatch of Impossible => cases | RaiseAgain => raiseExn (fn e => Xexp.monoVar (e, Xtype.exn), NONE) | RaiseBind => raiseExn (fn _ => Xexp.bind, SOME "Bind") | RaiseMatch => raiseExn (fn _ => Xexp.match, SOME "Match") end val examples = ref (fn () => Vector.new0 ()) fun matchCompile () = let val testVar = Var.newNoname () val decs = ref [] val cases = Vector.map (cases, fn {exp = e, numUses, pat = p, ...} => let val args = Vector.fromList (NestedPat.varsAndTypes p) val (vars, tys) = Vector.unzip args val func = Var.newNoname () val arg = Var.newNoname () val argType = Xtype.tuple tys val funcType = Xtype.arrow (argType, caseType) fun dec () = Xdec.MonoVal {var = func, ty = funcType, exp = XprimExp.Lambda (Xlambda.make {arg = arg, argType = argType, body = (Xexp.toExp (Xexp.detupleBind {tuple = Xexp.monoVar (arg, argType), components = vars, body = e ()})), mayInline = true})} fun finish rename = (if 0 = !numUses then List.push (decs, dec ()) else () ; Int.inc numUses ; (Xexp.app {func = Xexp.monoVar (func, funcType), arg = Xexp.tuple {exps = (Vector.map (args, fn (x, t) => Xexp.monoVar (rename x, t))), ty = argType}, ty = caseType})) in (p, finish) end) val (body, es) = MatchCompile.matchCompile {caseType = caseType, cases = cases, conTycon = conTycon, region = region, test = testVar, testType = testType, tyconCons = tyconCons} (* Must convert to a normal expression to force everything. *) val body = Xexp.toExp body val () = examples := es in Xexp.let1 {var = testVar, exp = test, body = Xexp.lett {decs = !decs, body = Xexp.fromExp (body, caseType)}} end datatype z = datatype NestedPat.node fun lett (x, e) = Xexp.let1 {var = x, exp = test, body = e} fun wild e = lett (Var.newNoname (), e) val exp = if Vector.isEmpty cases then Error.bug "Defunctorize.casee: case with no patterns" else let val {exp = e, pat = p, numUses, ...} = Vector.sub (cases, 0) fun use () = Int.inc numUses in case NestedPat.node p of Wild => (use (); wild (e ())) | Var x => (use (); lett (x, e ())) | Tuple ps => if Vector.forall (ps, NestedPat.isVar) then (* It's a flat tuple pattern. * Generate the selects. *) let val _ = use () val t = Var.newNoname () val tuple = XvarExp.mono t val tys = Xtype.deTuple testType val (_, decs) = Vector.fold2 (ps, tys, (0, []), fn (p, ty, (i, decs)) => case NestedPat.node p of Var x => (i + 1, Xdec.MonoVal {var = x, ty = ty, exp = (XprimExp.Select {tuple = tuple, offset = i})} :: decs) | _ => Error.bug "Defunctorize.casee: infer flat tuple") in Xexp.let1 {var = t, exp = test, body = Xexp.lett {decs = decs, body = e ()}} end else matchCompile () | _ => matchCompile () end fun diagnoseNonexhaustiveMatch () = if noMatch = Cexp.RaiseAgain then () else case Vector.peeki (cases, fn (_, {isDefault, numUses, ...}) => isDefault andalso !numUses > 0) of NONE => () | SOME (i, _) => let val es = Vector.sub (!examples (), i) val es = case nonexhaustiveExnMatch of Control.Elaborate.DiagDI.Default => Vector.map (es, #1) | Control.Elaborate.DiagDI.Ignore => Vector.keepAllMap (es, fn (e, {isOnlyExns}) => if isOnlyExns then NONE else SOME e) open Layout in if 0 = Vector.length es then () else (if nonexhaustiveMatch = Control.Elaborate.DiagEIW.Error then Control.error else Control.warning) (region, str (concat [kind, " is not exhaustive"]), align [seq [str "missing pattern: ", Layout.alignPrefix (Vector.toList es, "| ")], lay ()]) end fun diagnoseRedundantMatch () = let val redundant = Vector.keepAll (cases, fn {isDefault, numUses, ...} => not isDefault andalso !numUses = 0) in if 0 = Vector.length redundant then () else let open Layout in (if redundantMatch = Control.Elaborate.DiagEIW.Error then Control.error else Control.warning) (region, str (concat [kind, " has redundant rules"]), align [seq [str "rules: ", align (Vector.toListMap (redundant, fn {lay, ...} => case lay of NONE => Error.bug "Defunctorize.casee: redundant match with no lay" | SOME l => l ()))], lay ()]) end end in if redundantMatch <> Control.Elaborate.DiagEIW.Ignore then List.push (diagnostics, diagnoseRedundantMatch) else () ; if nonexhaustiveMatch <> Control.Elaborate.DiagEIW.Ignore then List.push (diagnostics, diagnoseNonexhaustiveMatch) else () ; exp end val casee = Trace.trace ("Defunctorize.casee", Region.layout o #region, Xml.Exp.layout o Xexp.toExp) casee fun 'a sortByField (v: (Field.t * 'a) vector): 'a vector = Vector.map (QuickSort.sortVector (v, fn ((f, _), (f', _)) => Field.<= (f, f')), #2) fun valDec (tyvars: Tyvar.t vector, x: Var.t, e: Xexp.t, et: Xtype.t, e': Xexp.t): Xexp.t = Xexp.lett {body = e', decs = [Xdec.PolyVal {exp = Xexp.toExp e, ty = et, tyvars = tyvars, var = x}]} structure Xexp = struct open Xexp fun list (es: Xexp.t vector, ty: Xtype.t, {forceLeftToRight: bool}) : Xexp.t = let val targs = #2 (valOf (Xtype.deConOpt ty)) val eltTy = Vector.sub (targs, 0) val nill: Xexp.t = Xexp.conApp {arg = NONE, con = Con.nill, targs = targs, ty = ty} val consArgTy = Xtype.tuple (Vector.new2 (eltTy, ty)) val cons: Xexp.t * Xexp.t -> Xexp.t = fn (e1, e2) => Xexp.conApp {arg = SOME (Xexp.tuple {exps = Vector.new2 (e1, e2), ty = consArgTy}), con = Con.cons, targs = targs, ty = ty} in if not forceLeftToRight then (* Build the list right to left. *) Vector.foldr (es, nill, fn (e, rest) => let val var = Var.newNoname () in Xexp.let1 {body = cons (e, monoVar (var, ty)), exp = rest, var = var} end) else if Vector.length es < 20 then Vector.foldr (es, nill, cons) else let val revArgTy = Xtype.tuple (Vector.new2 (ty, ty)) val revTy = Xtype.arrow (revArgTy, ty) val revVar = Var.newString "rev" fun rev (e1, e2) = Xexp.app {func = Xexp.monoVar (revVar, revTy), arg = Xexp.tuple {exps = Vector.new2 (e1, e2), ty = revArgTy}, ty = ty} fun detuple2 (tuple: Xexp.t, f: XvarExp.t * XvarExp.t -> Xexp.t): Xexp.t = Xexp.detuple {body = fn xs => let fun x i = #1 (Vector.sub (xs, i)) in f (x 0, x 1) end, tuple = tuple} val revArg = Var.newNoname () val revLambda = Xlambda.make {arg = revArg, argType = revArgTy, mayInline = true, body = Xexp.toExp (detuple2 (Xexp.monoVar (revArg, revArgTy), fn (l, ac) => let val ac = Xexp.varExp (ac, ty) val consArg = Var.newNoname () in Xexp.casee {cases = Xcases.Con (Vector.new2 ((Xpat.T {arg = NONE, con = Con.nill, targs = targs}, ac), (Xpat.T {arg = SOME (consArg, consArgTy), con = Con.cons, targs = targs}, detuple2 (Xexp.monoVar (consArg, consArgTy), fn (x, l) => rev (Xexp.varExp (l, ty), cons (Xexp.varExp (x, eltTy), ac)))))), default = NONE, test = Xexp.varExp (l, ty), ty = ty} end))} val revDec = Xdec.Fun {decs = Vector.new1 {lambda = revLambda, ty = revTy, var = revVar}, tyvars = Vector.new0 ()} val l = Var.newNoname () val (l, body) = Vector.foldr (es, (l, Xexp.lett {decs = [revDec], body = rev (Xexp.monoVar (l, ty), nill)}), fn (e, (l, body)) => let val l' = Var.newNoname () in (l', Xexp.let1 {body = body, exp = cons (e, Xexp.monoVar (l', ty)), var = l}) end) in Xexp.let1 {body = body, exp = nill, var = l} end end end fun defunctorize (CoreML.Program.T {decs}) = let val {get = conExtraArgs: Con.t -> Xtype.t vector option, set = setConExtraArgs, destroy = destroy1, ...} = Property.destGetSetOnce (Con.plist, Property.initConst NONE) val {get = tyconExtraArgs: Tycon.t -> Xtype.t vector option, set = setTyconExtraArgs, destroy = destroy2, ...} = Property.destGetSetOnce (Tycon.plist, Property.initConst NONE) val {destroy = destroy3, hom = loopTy} = let fun con (c, ts) = let val ts = case tyconExtraArgs c of NONE => ts | SOME ts' => Vector.concat [ts', ts] in Xtype.con (c, ts) end in Ctype.makeHom {con = con, var = Xtype.var} end val loopTy = Trace.trace ("Defunctorize.loopTy", Ctype.layout, Xtype.layout) loopTy fun conTargs (c: Con.t, ts: Ctype.t vector): Xtype.t vector = let val ts = Vector.map (ts, loopTy) in case conExtraArgs c of NONE => ts | SOME ts' => Vector.concat [ts', ts] end val {get = conTycon, set = setConTycon, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("conTycon", Con.layout)) val {get = tyconCons: Tycon.t -> {con: Con.t, hasArg: bool} vector, set = setTyconCons, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("tyconCons", Tycon.layout)) val setConTycon = Trace.trace2 ("Defunctorize.setConTycon", Con.layout, Tycon.layout, Unit.layout) setConTycon val datatypes = ref [] (* Process all the datatypes. *) fun loopDec (d: Cdec.t) = let (* Use open Cdec instead of the following due to an SML/NJ bug *) (* datatype z = datatype Cdec.t *) open Cdec in case d of Datatype dbs => let val frees: Tyvar.t list ref = ref [] val _ = Vector.foreach (dbs, fn {cons, tyvars, ...} => let fun var (a: Tyvar.t): unit = let fun eq a' = Tyvar.equals (a, a') in if Vector.exists (tyvars, eq) orelse List.exists (!frees, eq) then () else List.push (frees, a) end val {destroy, hom} = Ctype.makeHom {con = fn _ => (), var = var} val _ = Vector.foreach (cons, fn {arg, ...} => Option.app (arg, hom)) val _ = destroy () in () end) val frees = !frees val dbs = if List.isEmpty frees then dbs else let val frees = Vector.fromList frees val extra = Vector.map (frees, Xtype.var) in Vector.map (dbs, fn {cons, tycon, tyvars} => let val _ = setTyconExtraArgs (tycon, SOME extra) val _ = Vector.foreach (cons, fn {con, ...} => setConExtraArgs (con, SOME extra)) in {cons = cons, tycon = tycon, tyvars = Vector.concat [frees, tyvars]} end) end in Vector.foreach (dbs, fn {cons, tycon, tyvars} => let val _ = setTyconCons (tycon, Vector.map (cons, fn {arg, con} => {con = con, hasArg = isSome arg})) val cons = Vector.map (cons, fn {arg, con} => (setConTycon (con, tycon) ; {arg = Option.map (arg, loopTy), con = con})) val _ = if Tycon.equals (tycon, Tycon.reff) then () else List.push (datatypes, {cons = cons, tycon = tycon, tyvars = tyvars}) in () end) end | Exception {con, ...} => setConTycon (con, Tycon.exn) | Fun {decs, ...} => Vector.foreach (decs, loopLambda o #lambda) | Val {rvbs, vbs, ...} => (Vector.foreach (rvbs, loopLambda o #lambda) ; Vector.foreach (vbs, loopExp o #exp)) end and loopExp (e: Cexp.t): unit = let datatype z = datatype Cexp.node in case Cexp.node e of App (e, e') => (loopExp e; loopExp e') | Case {rules, test, ...} => (loopExp test ; Vector.foreach (rules, loopExp o #exp)) | Con _ => () | Const _ => () | EnterLeave (e, _) => loopExp e | Handle {handler, try, ...} => (loopExp handler; loopExp try) | Lambda l => loopLambda l | Let (ds, e) => (Vector.foreach (ds, loopDec); loopExp e) | List es => Vector.foreach (es, loopExp) | PrimApp {args, ...} => Vector.foreach (args, loopExp) | Raise e => loopExp e | Record r => Record.foreach (r, loopExp) | Seq es => Vector.foreach (es, loopExp) | Var _ => () end and loopLambda (l: Clambda.t): unit = loopExp (#body (Clambda.dest l)) fun loopPat (p: Cpat.t): NestedPat.t = let val (p, t) = Cpat.dest p val t' = loopTy t datatype z = datatype Cpat.node val p = case p of Con {arg, con, targs} => NestedPat.Con {arg = Option.map (arg, loopPat), con = con, targs = conTargs (con, targs)} | Const f => NestedPat.Const {const = f (), isChar = Ctype.isCharX t, isInt = Ctype.isInt t} | Layered (x, p) => NestedPat.Layered (x, loopPat p) | List ps => let val targs = Vector.map (#2 (valOf (Ctype.deConOpt t)), loopTy) in Vector.foldr (ps, NestedPat.Con {arg = NONE, con = Con.nill, targs = targs}, fn (p, np) => NestedPat.Con {arg = SOME (NestedPat.tuple (Vector.new2 (loopPat p, NestedPat.make (np, t')))), con = Con.cons, targs = targs}) end | Record r => NestedPat.Tuple (Vector.map (Ctype.deRecord t, fn (f, t: Ctype.t) => case Record.peek (r, f) of NONE => NestedPat.make (NestedPat.Wild, loopTy t) | SOME p => loopPat p)) | Tuple ps => NestedPat.Tuple (Vector.map (ps, loopPat)) | Var x => NestedPat.Var x | Wild => NestedPat.Wild in NestedPat.make (p, t') end val _ = Vector.foreach (decs, loopDec) (* Now, do the actual defunctorization. *) fun loopDec (d: Cdec.t, e: Xexp.t, et: Xtype.t): Xexp.t = let fun prefix (d: Xdec.t) = Xexp.lett {decs = [d], body = e} fun processLambdas v = Vector.map (v, fn {lambda, var} => let val {arg, argType, body, bodyType, mayInline} = loopLambda lambda in {lambda = Xlambda.make {arg = arg, argType = argType, body = Xexp.toExp body, mayInline = mayInline}, ty = Xtype.arrow (argType, bodyType), var = var} end) (* Use open Cdec instead of the following due to an SML/NJ bug *) (* datatype z = datatype Cdec.t *) open Cdec in case d of Datatype _ => e | Exception {arg, con} => prefix (Xdec.Exception {arg = Option.map (arg, loopTy), con = con}) | Fun {decs, tyvars} => prefix (Xdec.Fun {decs = processLambdas decs, tyvars = tyvars ()}) | Val {nonexhaustiveExnMatch, nonexhaustiveMatch, rvbs, tyvars, vbs} => let val tyvars = tyvars () val bodyType = et val e = Vector.foldr (vbs, e, fn ({exp, lay, nest, pat, patRegion}, e) => let fun patDec (p: NestedPat.t, e: Xexp.t, body: Xexp.t, bodyType: Xtype.t, mayWarn: bool) = casee {caseType = bodyType, cases = Vector.new1 {exp = body, lay = SOME lay, pat = p}, conTycon = conTycon, kind = "declaration", lay = lay, nest = nest, noMatch = Cexp.RaiseBind, nonexhaustiveExnMatch = nonexhaustiveExnMatch, nonexhaustiveMatch = if mayWarn then nonexhaustiveMatch else Control.Elaborate.DiagEIW.Ignore, redundantMatch = Control.Elaborate.DiagEIW.Ignore, region = patRegion, test = (e, NestedPat.ty p), tyconCons = tyconCons} val isExpansive = Cexp.isExpansive exp val (exp, expType) = loopExp exp val pat = loopPat pat fun vd (x: Var.t) = valDec (tyvars, x, exp, expType, e) in if Vector.isEmpty tyvars orelse isExpansive then let val (pat, exp) = if Vector.isEmpty tyvars then (pat, exp) else let val x = Var.newNoname () val thunk = let open Xexp in toExp (lambda {arg = Var.newNoname (), argType = Xtype.unit, body = exp, bodyType = expType, mayInline = true}) end val thunkTy = Xtype.arrow (Xtype.unit, expType) fun subst t = Xtype.substitute (t, Vector.map (tyvars, fn a => (a, Xtype.unit))) val body = Xexp.app {arg = Xexp.unit (), func = Xexp.var {targs = (Vector.map (tyvars, fn _ => Xtype.unit)), ty = subst thunkTy, var = x}, ty = subst expType} val decs = [Xdec.PolyVal {exp = thunk, ty = thunkTy, tyvars = tyvars, var = x}] in (NestedPat.replaceTypes (pat, subst), Xexp.lett {body = body, decs = decs}) end in patDec (pat, exp, e, bodyType, true) end else case NestedPat.node pat of NestedPat.Wild => vd (Var.newNoname ()) | NestedPat.Var x => vd x | _ => (* Polymorphic pattern. * val 'a Foo (y1, y2) = e * Expands to * val 'a x = e * val Foo _ = x * val 'a y1 = case x of Foo (y1', _) => y1' * val 'a y2 = case x of Foo (_, y2') => y2' *) let val x = Var.newNoname () val xt = expType val targs = Vector.map (tyvars, Xtype.var) val e = List.fold (NestedPat.varsAndTypes pat, e, fn ((y, yt), e) => let val y' = Var.new y val pat = NestedPat.removeOthersReplace (pat, {old = y, new = y'}) in valDec (tyvars, y, patDec (pat, Xexp.var {targs = targs, ty = xt, var = x}, Xexp.monoVar (y', yt), yt, false), yt, e) end) fun instantiatePat () = let val pat = NestedPat.removeVars pat fun con (_, c, ts) = Xtype.con (c, ts) fun var (t, a) = if (Vector.exists (tyvars, fn a' => Tyvar.equals (a, a'))) then Xtype.unit else t val {destroy, hom} = Xtype.makeHom {con = con, var = var} val pat = NestedPat.replaceTypes (pat, hom) val _ = destroy () in pat end val e = if NestedPat.isRefutable pat then let val targs = Vector.map (tyvars, fn _ => Xtype.unit) val pat = instantiatePat () in patDec (pat, Xexp.var {targs = targs, ty = NestedPat.ty pat, var = x}, e, bodyType, true) end else e in valDec (tyvars, x, exp, expType, e) end end) in if 0 = Vector.length rvbs then e else Xexp.lett {decs = [Xdec.Fun {decs = processLambdas rvbs, tyvars = tyvars}], body = e} end end and loopDecs (ds: Cdec.t vector, (e: Xexp.t, t: Xtype.t)): Xexp.t = loopDecsList (Vector.toList ds, (e, t)) (* Convert vector->list to allow processed Cdecs to be GC'ed. *) and loopDecsList (ds: Cdec.t list, (e: Xexp.t, t: Xtype.t)): Xexp.t = List.foldr (ds, e, fn (d, e) => loopDec (d, e, t)) and loopExp (e: Cexp.t): Xexp.t * Xtype.t = let val (n, ty) = Cexp.dest e val ty = loopTy ty fun conApp {arg, con, targs, ty} = if Con.equals (con, Con.reff) then Xexp.primApp {args = Vector.new1 arg, prim = Prim.reff, targs = targs, ty = ty} else Xexp.conApp {arg = SOME arg, con = con, targs = targs, ty = ty} datatype z = datatype Cexp.node val exp = case n of App (e1, e2) => let val (e2, _) = loopExp e2 in case Cexp.node e1 of Con (con, targs) => conApp {arg = e2, con = con, targs = conTargs (con, targs), ty = ty} | _ => Xexp.app {arg = e2, func = #1 (loopExp e1), ty = ty} end | Case {kind, lay, nest, noMatch, nonexhaustiveExnMatch, nonexhaustiveMatch, redundantMatch, region, rules, test, ...} => casee {caseType = ty, cases = Vector.map (rules, fn {exp, lay, pat} => {exp = #1 (loopExp exp), lay = lay, pat = loopPat pat}), conTycon = conTycon, kind = kind, lay = lay, nest = nest, noMatch = noMatch, nonexhaustiveExnMatch = nonexhaustiveExnMatch, nonexhaustiveMatch = nonexhaustiveMatch, redundantMatch = redundantMatch, region = region, test = loopExp test, tyconCons = tyconCons} | Con (con, targs) => let val targs = conTargs (con, targs) in case Xtype.deArrowOpt ty of NONE => Xexp.conApp {arg = NONE, con = con, targs = targs, ty = ty} | SOME (argType, bodyType) => let val arg = Var.newNoname () in Xexp.lambda {arg = arg, argType = argType, body = (conApp {arg = Xexp.monoVar (arg, argType), con = con, targs = targs, ty = bodyType}), bodyType = bodyType, mayInline = true} end end | Const f => let val c = f () in if Xtype.equals (ty, Xtype.bool) then (case c of Const.Word w => if WordX.isZero w then Xexp.falsee () else Xexp.truee () | _ => Error.bug "Defunctorize.loopExp: Const:strange boolean constant") else Xexp.const c end | EnterLeave (e, si) => let val (e, t) = loopExp e in enterLeave (e, t, si) end | Handle {catch = (x, t), handler, try} => Xexp.handlee {catch = (x, loopTy t), handler = #1 (loopExp handler), try = #1 (loopExp try), ty = ty} | Lambda l => Xexp.lambda (loopLambda l) | Let (ds, e) => loopDecs (ds, loopExp e) | List es => let (* Must evaluate list components left-to-right if there * is more than one expansive expression. *) val numExpansive = Vector.fold (es, 0, fn (e, n) => if Cexp.isExpansive e then n + 1 else n) in Xexp.list (Vector.map (es, #1 o loopExp), ty, {forceLeftToRight = 2 <= numExpansive}) end | PrimApp {args, prim, targs} => let val args = Vector.map (args, #1 o loopExp) datatype z = datatype Prim.Name.t in if (case Prim.name prim of Real_rndToReal (s1, s2) => RealSize.equals (s1, s2) | String_toWord8Vector => true | Word_extdToWord (s1, s2, _) => WordSize.equals (s1, s2) | Word8Vector_toString => true | _ => false) then Vector.sub (args, 0) else Xexp.primApp {args = args, prim = Prim.map (prim, loopTy), targs = Vector.map (targs, loopTy), ty = ty} end | Raise e => Xexp.raisee {exn = #1 (loopExp e), extend = true, ty = ty} | Record r => (* The components of the record have to be evaluated left to * right as they appeared in the source program, but then * ordered according to sorted field name within the tuple. *) let val fes = Record.toVector r in Xexp.seq (Vector.map (fes, #1 o loopExp o #2), fn es => Xexp.tuple {exps = (sortByField (Vector.map2 (fes, es, fn ((f, _), e) => (f, e)))), ty = ty}) end | Seq es => Xexp.sequence (Vector.map (es, #1 o loopExp)) | Var (var, targs) => Xexp.var {targs = Vector.map (targs (), loopTy), ty = ty, var = var ()} in (exp, ty) end and loopLambda (l: Clambda.t) = let val {arg, argType, body, mayInline} = Clambda.dest l val (body, bodyType) = loopExp body in {arg = arg, argType = loopTy argType, body = body, bodyType = bodyType, mayInline = mayInline} end val body = Xexp.toExp (loopDecs (decs, (Xexp.unit (), Xtype.unit))) val _ = List.foreach (!diagnostics, fn f => f ()) val _ = (destroy1 (); destroy2 (); destroy3 ()) in Xml.Program.T {body = body, datatypes = Vector.fromList (!datatypes), overflow = NONE} end end mlton-20100608/mlton/defunctorize/defunctorize.sig0000644000076600000240000000073711404435624020630 0ustar mtfstaff(* Copyright (C) 2003-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DEFUNCTORIZE_STRUCTS = sig structure CoreML: CORE_ML structure Xml: XML sharing CoreML.Atoms = Xml.Atoms end signature DEFUNCTORIZE = sig include DEFUNCTORIZE_STRUCTS val defunctorize: CoreML.Program.t -> Xml.Program.t end mlton-20100608/mlton/defunctorize/sources.cm0000644000076600000240000000066411404435624017426 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group functor Defunctorize is ../../lib/mlton/sources.cm ../control/sources.cm ../core-ml/sources.cm ../match-compile/sources.cm ../xml/sources.cm defunctorize.sig defunctorize.fun mlton-20100608/mlton/defunctorize/sources.mlb0000644000076600000240000000072211404435624017574 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../control/sources.mlb ../core-ml/sources.mlb ../match-compile/sources.mlb ../xml/sources.mlb defunctorize.sig defunctorize.fun in functor Defunctorize end mlton-20100608/mlton/elaborate/0000755000076600000240000000000011404470407014647 5ustar mtfstaffmlton-20100608/mlton/elaborate/decs.fun0000644000076600000240000000104511404435623016300 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Decs (S: DECS_STRUCTS): DECS = struct open S structure Dec = CoreML.Dec type dec = CoreML.Dec.t open AppendList type t = dec t fun add (ds, d) = append (ds, single d) fun layout ds = let open Layout in align (Vector.toListMap (toVector ds, Dec.layout)) end end mlton-20100608/mlton/elaborate/decs.sig0000644000076600000240000000172011404435623016272 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DECS_STRUCTS = sig structure CoreML: CORE_ML end signature DECS = sig include DECS_STRUCTS type dec = CoreML.Dec.t type t val add: t * dec -> t (* add a dec to the end of the list *) val append: t * t -> t val appends: t list -> t val appendsV: t vector -> t val cons: dec * t -> t val empty: t val fold: t * 'a * (dec * 'a -> 'a) -> 'a val foreach: t * (dec -> unit) -> unit val fromList: dec list -> t val fromVector: dec vector -> t val layout: t -> Layout.t val map: t * (dec -> dec) -> t val single: dec -> t val toList: t -> dec list val toVector: t -> dec vector end mlton-20100608/mlton/elaborate/elaborate-core.fun0000644000076600000240000045356611404435623020271 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ElaborateCore (S: ELABORATE_CORE_STRUCTS): ELABORATE_CORE = struct open S local open Control.Elaborate in val allowRebindEquals = fn () => current allowRebindEquals val nonexhaustiveExnMatch = fn () => current nonexhaustiveExnMatch val nonexhaustiveMatch = fn () => current nonexhaustiveMatch val redundantMatch = fn () => current redundantMatch val sequenceNonUnit = fn () => current sequenceNonUnit end local open Ast in structure Acon = Con structure Aconst = Const structure Adec = Dec structure Aexp = Exp structure Amatch = Match structure Apat = Pat structure Atype = Type structure Avar = Var structure Avid = Vid structure DatatypeRhs = DatatypeRhs structure DatBind = DatBind structure EbRhs = EbRhs structure Fixop = Fixop structure Longvid = Longvid structure Longtycon = Longtycon structure PrimKind = PrimKind structure ImportExportAttribute = PrimKind.ImportExportAttribute structure SymbolAttribute = PrimKind.SymbolAttribute structure Priority = Priority structure Record = Record structure SortedRecord = SortedRecord structure Symbol = Symbol structure TypBind = TypBind end local open Env in structure TypeEnv = TypeEnv structure TypeStr = TypeStr structure Vid = Vid end local open TypeStr in structure Kind = Kind end local open TypeEnv in structure Scheme = Scheme structure Time = Time structure Type = Type end local open CoreML in structure CFunction = CFunction structure CType = CType structure CharSize = CharSize structure Convention = CFunction.Convention structure SymbolScope = CFunction.SymbolScope structure Con = Con structure Const = Const structure ConstType = Const.ConstType structure Cdec = Dec structure Cexp = Exp structure Ffi = Ffi structure IntSize = IntSize structure Lambda = Lambda structure Cpat = Pat structure Prim = Prim structure RealSize = RealSize structure RealX = RealX structure SourceInfo = SourceInfo structure Tycon = Tycon structure Tyvar = Tyvar structure Var = Var structure WordSize = WordSize structure WordX = WordX structure WordXVector = WordXVector end structure AdmitsEquality = Tycon.AdmitsEquality local open Record in structure Field = Field end structure Parse = PrecedenceParse (structure Ast = Ast structure Env = Env) structure Scope = Scope (structure Ast = Ast) structure Apat = struct open Apat fun getName (p: t): string option = case node p of Var {name, ...} => SOME (Longvid.toString name) | Constraint (p, _) => getName p | FlatApp v => if 1 = Vector.length v then getName (Vector.sub (v, 0)) else NONE | Layered {var, ...} => SOME (Avar.toString var) | _ => NONE val getName = Trace.trace ("ElaborateCore.Apat.getName", layout, Option.layout String.layout) getName end structure Lookup = struct type t = Longtycon.t -> TypeStr.t option fun fromEnv (E: Env.t) longtycon = Env.lookupLongtycon (E, longtycon) end fun elaborateType (ty: Atype.t, lookup: Lookup.t): Type.t = let fun loop (ty: Atype.t): Type.t = case Atype.node ty of Atype.Var a => (* rule 44 *) Type.var a | Atype.Con (c, ts) => (* rules 46, 47 *) let val ts = Vector.map (ts, loop) fun normal () = case lookup c of NONE => Type.new () | SOME s => let val kind = TypeStr.kind s val numArgs = Vector.length ts in if (case kind of Kind.Arity n => n = numArgs | Kind.Nary => true) then TypeStr.apply (s, ts) else let open Layout val _ = Control.error (Atype.region ty, seq [str "type ", Ast.Longtycon.layout c, str " given ", Int.layout numArgs, str (if numArgs = 1 then " argument" else " arguments"), str " but wants ", Kind.layout kind], empty) in Type.new () end end in case (Ast.Longtycon.split c, Vector.length ts) of (([], c), 2) => if Ast.Tycon.equals (c, Ast.Tycon.arrow) then Type.arrow (Vector.sub (ts, 0), Vector.sub (ts, 1)) else normal () | _ => normal () end | Atype.Record r => (* rules 45, 49 *) Type.record (SortedRecord.map (r, loop)) in loop ty end val overloads: (Ast.Priority.t * (unit -> unit)) list ref = ref [] val freeTyvarChecks: (unit -> unit) list ref = ref [] val sequenceTypeChecks: (unit -> unit) list ref = ref [] val {hom = typeTycon: Type.t -> Tycon.t option, ...} = Type.makeHom {con = fn (c, _) => SOME c, expandOpaque = false, var = fn _ => NONE} val typeTycon = Trace.trace ("ElaborateCore.typeTycon", Type.layout, Option.layout Tycon.layout) typeTycon fun 'a elabConst (c: Aconst.t, make: (unit -> Const.t) * Type.t -> 'a, {false = f: 'a, true = t: 'a}): 'a = let fun error (ty: Type.t): unit = let open Layout in Control.error (Aconst.region c, seq [Type.layoutPretty ty, str " too big: ", Aconst.layout c], empty) end fun ensureChar (cs: CharSize.t, ch: IntInf.t): unit = if CharSize.isInRange (cs, ch) then () else let open Layout in Control.error (Aconst.region c, str (concat ["character too big: ", "#\"", Aconst.ordToString ch, "\""]), empty) end fun choose (tycon, all, sizeTycon, make) = case List.peek (all, fn s => Tycon.equals (tycon, sizeTycon s)) of NONE => Const.string "" | SOME s => make s fun delay (ty: unit -> Type.t, resolve: Type.t -> Const.t): 'a = let val ty = ty () val resolve = Promise.lazy (fn () => resolve ty) val _ = List.push (overloads, (Priority.default, ignore o resolve)) in make (resolve, ty) end val typeTycon = fn ty => case typeTycon ty of NONE => Tycon.bogus | SOME c => c in case Aconst.node c of Aconst.Bool b => if b then t else f | Aconst.Char c => delay (Type.unresolvedChar, fn ty => choose (typeTycon ty, List.map ([8, 16, 32], WordSize.fromBits o Bits.fromInt), Tycon.word, fn s => (ensureChar (CharSize.fromBits (WordSize.bits s), c) ; Const.Word (WordX.fromIntInf (c, s))))) | Aconst.Int i => delay (Type.unresolvedInt, fn ty => let val tycon = typeTycon ty in if Tycon.equals (tycon, Tycon.intInf) then Const.IntInf i else choose (tycon, WordSize.all, Tycon.word, fn s => Const.Word (if WordSize.isInRange (s, i, {signed = true}) then WordX.fromIntInf (i, s) else (error ty; WordX.zero s))) end) | Aconst.Real r => delay (Type.unresolvedReal, fn ty => choose (typeTycon ty, RealSize.all, Tycon.real, fn s => Const.Real (case RealX.make (r, s) of NONE => (error ty; RealX.zero s) | SOME r => r))) | Aconst.String v => delay (Type.unresolvedString, fn ty => choose (typeTycon (Type.deVector ty), List.map ([8, 16, 32], WordSize.fromBits o Bits.fromInt), Tycon.word, fn s => let val cs = CharSize.fromBits (WordSize.bits s) in Const.WordVector (WordXVector.tabulate ({elementSize = s}, Vector.length v, fn i => let val ch = Vector.sub (v, i) val () = ensureChar (cs, ch) in WordX.fromIntInf (ch, s) end)) end)) | Aconst.Word w => delay (Type.unresolvedWord, fn ty => choose (typeTycon ty, WordSize.all, Tycon.word, fn s => Const.Word (if WordSize.isInRange (s, w, {signed = false}) then WordX.fromIntInf (w, s) else (error ty; WordX.zero s)))) end local open Layout in val align = align val empty = empty val seq = seq val str = str end val unify = fn (t, t', preError, error) => Type.unify (t, t', {error = Control.error o error, preError = preError}) fun unifyList (trs: (Type.t * Region.t) vector, z, lay: unit -> Layout.t): Type.t = if 0 = Vector.length trs then Type.list (Type.new ()) else let val (t, _) = Vector.sub (trs, 0) val _ = Vector.foreach (trs, fn (t', r) => unify (t, t', z, fn (l, l') => (r, str "list element types disagree", align [seq [str "element: ", l'], seq [str "previous: ", l], lay ()]))) in Type.list t end val elabPatInfo = Trace.info "ElaborateCore.elabPat" structure Var = struct open Var val fromAst = fromString o Avar.toString end local val eq = Avar.fromSymbol (Symbol.equal, Region.bogus) in fun ensureNotEquals x = if not (allowRebindEquals ()) andalso Avar.equals (x, eq) then let open Layout in Control.error (Avar.region x, str "= can't be redefined", empty) end else () end fun approximateN (l: Layout.t, prefixMax, suffixMax): Layout.t = let val s = Layout.toString l val n = String.size s in Layout.str (case suffixMax of NONE => if n <= prefixMax then s else concat [String.prefix (s, prefixMax - 5), " ..."] | SOME suffixMax => if n <= prefixMax + suffixMax then s else concat [String.prefix (s, prefixMax - 2), " ... ", String.suffix (s, suffixMax - 5)]) end fun approximate (l: Layout.t): Layout.t = approximateN (l, 35, SOME 25) fun approximatePrefix (l: Layout.t): Layout.t = approximateN (l, 15, NONE) val elaboratePat: unit -> Apat.t * Env.t * {bind: bool, isRvb: bool} * (unit -> unit) -> Cpat.t * (Avar.t * Var.t * Type.t) vector = fn () => let val others: (Apat.t * (Avar.t * Var.t * Type.t) vector) list ref = ref [] in fn (p: Apat.t, E: Env.t, {bind, isRvb}, preError: unit -> unit) => let val xts: (Avar.t * Var.t * Type.t) list ref = ref [] fun bindToType (x: Avar.t, t: Type.t): Var.t = let val _ = ensureNotEquals x val x' = Var.fromAst x val _ = if List.exists (!xts, fn (x', _, _) => Avar.equals (x, x')) then let open Layout in Control.error (Avar.region x, seq [str "variable ", Avar.layout x, str " occurs more than once in pattern"], seq [str "in: ", approximate (Apat.layout p)]) end else () val _ = case (List.peekMap (!others, fn (p, v) => if Vector.exists (v, fn (x', _, _) => Avar.equals (x, x')) then SOME p else NONE)) of NONE => () | SOME p' => let open Layout in Control.error (Apat.region p, seq [str "variable ", Avar.layout x, str " occurs in multiple patterns"], align [seq [str "in: ", approximate (Apat.layout p)], seq [str "and in: ", approximate (Apat.layout p')]]) end val _ = List.push (xts, (x, x', t)) val _ = if bind then Env.extendVar (E, x, x', Scheme.fromType t, {isRebind = false}) else () in x' end fun bind (x: Avar.t): Var.t * Type.t = let val t = Type.new () in (bindToType (x, t), t) end fun loop arg: Cpat.t = Trace.traceInfo' (elabPatInfo, Apat.layout, Cpat.layout) (fn p: Apat.t => let val region = Apat.region p val unify = fn (t, t', f) => unify (t, t', preError, f) fun unifyPatternConstraint (p, lay, c) = unify (p, c, fn (l1, l2) => (region, str "pattern and constraint disagree", align [seq [str "expects: ", l2], seq [str "but got: ", l1], seq [str "in: ", lay ()]])) fun lay () = approximate (Apat.layout p) fun dontCare () = Cpat.wild (Type.new ()) in case Apat.node p of Apat.App (c, p) => let val (con, s) = Env.lookupLongcon (E, c) in case s of NONE => dontCare () | SOME s => let val {args, instance} = Scheme.instantiate s val args = args () val p = loop p val (argType, resultType) = case Type.deArrowOpt instance of SOME types => types | NONE => let val types = (Type.new (), Type.new ()) val _ = unify (instance, Type.arrow types, fn _ => (region, str "constant constructor\ \ applied to argument", seq [str "in: ", lay ()])) in types end val _ = unify (Cpat.ty p, argType, fn (l, l') => (region, str "constructor applied to incorrect argument", align [seq [str "expects: ", l'], seq [str "but got: ", l], seq [str "in: ", lay ()]])) in Cpat.make (Cpat.Con {arg = SOME p, con = con, targs = args}, resultType) end end | Apat.Const c => elabConst (c, fn (resolve, ty) => Cpat.make (Cpat.Const resolve, ty), {false = Cpat.falsee, true = Cpat.truee}) | Apat.Constraint (p, t) => let val p' = loop p val _ = unifyPatternConstraint (Cpat.ty p', fn () => Apat.layout p, elaborateType (t, Lookup.fromEnv E)) in p' end | Apat.FlatApp items => loop (Parse.parsePat (items, E, fn () => seq [str "in: ", lay ()])) | Apat.Layered {var = x, constraint, pat, ...} => let val t = case constraint of NONE => Type.new () | SOME t => elaborateType (t, Lookup.fromEnv E) val x = bindToType (x, t) val pat' = loop pat val _ = unifyPatternConstraint (Cpat.ty pat', fn () => Apat.layout pat, t) in Cpat.make (Cpat.Layered (x, pat'), t) end | Apat.List ps => let val ps' = Vector.map (ps, loop) in Cpat.make (Cpat.List ps', unifyList (Vector.map2 (ps, ps', fn (p, p') => (Cpat.ty p', Apat.region p)), preError, fn () => seq [str "in: ", lay ()])) end | Apat.Record {flexible, items} => (* rules 36, 38, 39 and Appendix A, p.57 *) let val (fs, ps) = Vector.unzip (Vector.map (items, fn (f, i) => (f, case i of Apat.Item.Field p => p | Apat.Item.Vid (vid, tyo, po) => let val p = case po of NONE => Apat.longvid (Longvid.short vid) | SOME p => Apat.layered {fixop = Fixop.None, var = Ast.Vid.toVar vid, constraint = NONE, pat = p} in case tyo of NONE => p | SOME ty => Apat.constraint (p, ty) end))) val ps = Vector.map (ps, loop) val r = SortedRecord.zip (fs, Vector.map (ps, Cpat.ty)) val ty = if flexible then let val (t, isResolved) = Type.flexRecord r fun resolve () = if isResolved () then () else Control.error (region, str "unresolved ... in record pattern", seq [str "in: ", lay ()]) val _ = List.push (overloads, (Priority.default, resolve)) in t end else Type.record r in Cpat.make (Cpat.Record (Record.fromVector (Vector.zip (fs, ps))), ty) end | Apat.Tuple ps => let val ps = Vector.map (ps, loop) in Cpat.make (Cpat.Tuple ps, Type.tuple (Vector.map (ps, Cpat.ty))) end | Apat.Var {name, ...} => let val (strids, x) = Ast.Longvid.split name fun var () = let val (x, t) = bind (Ast.Vid.toVar x) in Cpat.make (Cpat.Var x, t) end in case Env.peekLongcon (E, Ast.Longvid.toLongcon name) of NONE => if List.isEmpty strids then var () else let val _ = Control.error (region, seq [str "undefined constructor: ", Ast.Longvid.layout name], empty) in Cpat.make (Cpat.Wild, Type.new ()) end | SOME (c, s) => let val _ = if not isRvb then () else Control.error (region, seq [str "constructor can not be redefined by val rec: ", Ast.Longvid.layout name], empty) in case s of NONE => dontCare () | SOME s => let val {args, instance} = Scheme.instantiate s in if Type.isArrow instance then (Control.error (region, seq [str "constructor must be used with argument in pattern: ", Ast.Longvid.layout name], empty) ; dontCare ()) else Cpat.make (Cpat.Con {arg = NONE, con = c, targs = args ()}, instance) end end end | Apat.Wild => Cpat.make (Cpat.Wild, Type.new ()) end) arg val p' = loop p val xts = Vector.fromList (!xts) val _ = List.push (others, (p, xts)) in (p', xts) end end (*---------------------------------------------------*) (* Declarations *) (*---------------------------------------------------*) structure Nest = struct type t = string list val layout = List.layout String.layout end val elabDecInfo = Trace.info "ElaborateCore.elabDec" val elabExpInfo = Trace.info "ElaborateCore.elabExp" structure Type = struct open Type fun layoutPrettyBracket ty = let open Layout in seq [str "[", layoutPretty ty, str "]"] end val nullary: (string * CType.t * Tycon.t) list = let fun sized (tycon: Bits.t -> Tycon.t, ctypes) = List.map (ctypes, fn cty => let val c = tycon (Bytes.toBits (CType.size cty)) val s = Tycon.toString c val s = CharVector.tabulate (String.size s, fn i => let val c = String.sub (s, i) in if i = 0 then Char.toUpper c else c end) in (s, cty, c) end) in [("Bool", CType.bool, Tycon.bool), ("CPointer", CType.cpointer, Tycon.cpointer), ("Real32", CType.real RealSize.R32, Tycon.real RealSize.R32), ("Real64", CType.real RealSize.R64, Tycon.real RealSize.R64), ("Thread", CType.thread, Tycon.thread)] @ sized (Tycon.char o CharSize.fromBits, let open CType in [Word8, Word16, Word32] end) @ sized (Tycon.int o IntSize.fromBits, let open CType in [Int8, Int16, Int32, Int64] end) @ sized (Tycon.word o WordSize.fromBits, let open CType in [Word8, Word16, Word32, Word64] end) end val nullary = List.map (nullary, fn (name, ctype, tycon) => {ctype = ctype, name = name, tycon = tycon}) val unary: Tycon.t list = [Tycon.array, Tycon.reff, Tycon.vector] fun toNullaryCType (t: t): {ctype: CType.t, name: string} option = case deConOpt t of NONE => NONE | SOME (c, _) => Option.map (List.peek (nullary, fn {tycon = c', ...} => Tycon.equals (c, c')), fn {ctype, name, ...} => {ctype = ctype, name = name}) and toUnaryCType (t: t): {ctype: CType.t, name: string} option = case deConOpt t of NONE => NONE | SOME (c, ts) => if List.exists (unary, fn c' => Tycon.equals (c, c')) andalso 1 = Vector.length ts andalso isSome (toCType (Vector.sub (ts, 0))) then SOME {ctype = CType.objptr, name = "Objptr"} else NONE and toCType (ty: t): {ctype: CType.t, name: string} option = case toNullaryCType ty of NONE => toUnaryCType ty | SOME {ctype, name} => SOME {ctype = ctype, name = name} val toCType = Trace.trace ("ElaborateCore.Type.toCType", layout, Option.layout (fn {ctype, name} => Layout.record [("ctype", CType.layout ctype), ("name", String.layout name)])) toCType type z = {ctype: CType.t, name: string, ty: t} fun toCBaseType (ty: t): z option = case toCType ty of NONE => NONE | SOME {ctype, name} => SOME {ctype = ctype, name = name, ty = ty} fun toCArgType (ty: t): z vector option = case deTupleOpt ty of NONE => (case toCBaseType ty of NONE => NONE | SOME z => SOME (Vector.new1 z)) | SOME tys => Exn.withEscape (fn esc => (SOME o Vector.map) (tys, fn ty => case toCBaseType ty of NONE => esc NONE | SOME z => z)) fun toCRetType (ty: t): z option option = case toCBaseType ty of NONE => if Type.isUnit ty then SOME NONE else NONE | SOME z => SOME (SOME z) fun toCFunType (ty: t): (z vector * z option) option = case deArrowOpt ty of NONE => NONE | SOME (arg, ret) => (case toCArgType arg of NONE => NONE | SOME arg => (case toCRetType ret of NONE => NONE | SOME ret => SOME (arg, ret))) fun toCPtrType (ty: t): z option = if Type.isCPointer ty then let val {ctype, name} = valOf (toCType ty) in SOME {ctype = ctype, name = name, ty = ty} end else NONE end val isIEAttributeConvention = fn ImportExportAttribute.Cdecl => true | ImportExportAttribute.Stdcall => true | _ => false fun parseIEAttributesConvention (attributes: ImportExportAttribute.t list) : Convention.t option = case attributes of [] => SOME Convention.Cdecl | [a] => (case a of ImportExportAttribute.Cdecl => SOME Convention.Cdecl | ImportExportAttribute.Stdcall => if let open Control in case !Target.os of Target.Cygwin => true | Target.MinGW => true | _ => false end then SOME Convention.Stdcall else SOME Convention.Cdecl | _ => NONE) | _ => NONE val isIEAttributeSymbolScope = fn ImportExportAttribute.External => true | ImportExportAttribute.Private => true | ImportExportAttribute.Public => true | _ => false fun parseIEAttributesSymbolScope (attributes: ImportExportAttribute.t list, defScope : SymbolScope.t) : SymbolScope.t option = case attributes of [] => SOME defScope | [a] => (case a of ImportExportAttribute.External => SOME SymbolScope.External | ImportExportAttribute.Private => SOME SymbolScope.Private | ImportExportAttribute.Public => SOME SymbolScope.Public | _ => NONE) | _ => NONE fun scopeCheck {name, symbolScope, region} = let fun warn l = Control.warning (region, seq (List.map (l, str)), Layout.empty) val oldScope = Ffi.checkScope {name = name, symbolScope = symbolScope} in if symbolScope = oldScope then () else warn [ "symbol '", name, "' redeclared as ", SymbolScope.toString symbolScope, " (previously ", SymbolScope.toString oldScope, "). This may cause linker errors"] end fun import {attributes: ImportExportAttribute.t list, elabedTy: Type.t, expandedTy: Type.t, name: string option, region: Region.t}: Type.t Prim.t = let fun error l = Control.error (region, l, Layout.empty) fun invalidAttributes () = error (seq [str "invalid attributes for _import: ", List.layout ImportExportAttribute.layout attributes]) fun invalidType () = Control.error (region, str "invalid type for _import", Type.layoutPretty elabedTy) in case Type.toCFunType expandedTy of NONE => let val () = invalidType () in Prim.bogus end | SOME (args, result) => let datatype z = datatype CFunction.Target.t val convention = List.keepAll (attributes, isIEAttributeConvention) val convention = case parseIEAttributesConvention convention of NONE => (invalidAttributes () ; Convention.Cdecl) | SOME c => c val symbolScope = List.keepAll (attributes, isIEAttributeSymbolScope) val symbolScope = case name of NONE => (if List.isEmpty symbolScope then () else invalidAttributes () ; SymbolScope.External) | SOME name => let val symbolScope = case parseIEAttributesSymbolScope (symbolScope, SymbolScope.External) of NONE => (invalidAttributes () ; SymbolScope.External) | SOME s => s val () = scopeCheck {name = name, symbolScope = symbolScope, region = region} in symbolScope end val addrTy = Type.cpointer val func = CFunction.T {args = let val args = Vector.map (args, #ty) in if isSome name then args else Vector.concat [Vector.new1 addrTy, args] end, bytesNeeded = NONE, convention = convention, ensuresBytesFree = false, modifiesFrontier = true, mayGC = true, maySwitchThreads = false, prototype = (Vector.map (args, #ctype), Option.map (result, #ctype)), readsStackTop = true, return = (case result of NONE => Type.unit | SOME {ty, ...} => ty), symbolScope = symbolScope, target = (case name of NONE => Indirect | SOME name => Direct name), writesStackTop = true} in Prim.ffi func end end fun primApp {args, prim, result: Type.t} = let val targs = Prim.extractTargs (prim, {args = Vector.map (args, Cexp.ty), result = result, typeOps = {deArray = Type.deArray, deArrow = Type.deArrow, deRef = Type.deRef, deVector = Type.deVector, deWeak = Type.deWeak}}) in Cexp.make (Cexp.PrimApp {args = args, prim = prim, targs = targs}, result) end local val zeroExpBool = Cexp.make (Cexp.Const (fn () => Const.word (WordX.zero WordSize.bool)), Type.word WordSize.bool) val oneExpBool = Cexp.make (Cexp.Const (fn () => Const.word (WordX.one WordSize.bool)), Type.word WordSize.bool) fun zeroExpPtrdiff () = Cexp.make (Cexp.Const (fn () => Const.word (WordX.zero (WordSize.cptrdiff ()))), Type.word (WordSize.cptrdiff ())) fun mkAddress {expandedPtrTy: Type.t, name: string, cty: CType.t option, symbolScope: SymbolScope.t }: Cexp.t = primApp {args = Vector.new0 (), prim = Prim.ffiSymbol {name = name, cty = cty, symbolScope = symbolScope}, result = expandedPtrTy} fun mkFetch {ctypeCbTy, isBool, expandedCbTy, ptrExp: Cexp.t}: Cexp.t = let val fetchExp = primApp {args = Vector.new2 (ptrExp, zeroExpPtrdiff ()), prim = Prim.cpointerGet ctypeCbTy, result = if isBool then Type.word WordSize.bool else expandedCbTy} in if not isBool then fetchExp else Cexp.casee {kind = "", lay = fn () => Layout.empty, nest = [], noMatch = Cexp.Impossible, nonexhaustiveExnMatch = Control.Elaborate.DiagDI.Default, nonexhaustiveMatch = Control.Elaborate.DiagEIW.Ignore, redundantMatch = Control.Elaborate.DiagEIW.Ignore, region = Region.bogus, rules = Vector.new2 ({exp = Cexp.truee, lay = NONE, pat = Cpat.falsee}, {exp = Cexp.falsee, lay = NONE, pat = Cpat.truee}), test = primApp {args = Vector.new2 (fetchExp, zeroExpBool), prim = Prim.wordEqual WordSize.bool, result = expandedCbTy}} end fun mkStore {ctypeCbTy, isBool, ptrExp: Cexp.t, valueExp: Cexp.t}: Cexp.t = let val valueExp = if not isBool then valueExp else Cexp.casee {kind = "", lay = fn () => Layout.empty, nest = [], noMatch = Cexp.Impossible, nonexhaustiveExnMatch = Control.Elaborate.DiagDI.Default, nonexhaustiveMatch = Control.Elaborate.DiagEIW.Ignore, redundantMatch = Control.Elaborate.DiagEIW.Ignore, region = Region.bogus, rules = Vector.new2 ({exp = oneExpBool, lay = NONE, pat = Cpat.truee}, {exp = zeroExpBool, lay = NONE, pat = Cpat.falsee}), test = valueExp} in primApp {args = Vector.new3 (ptrExp, zeroExpPtrdiff (), valueExp), prim = Prim.cpointerSet ctypeCbTy, result = Type.unit} end fun mkSymbol {ctypeCbTy: CType.t, expandedCbTy: Type.t, ptrExp: Cexp.t}: Cexp.t = let val isBool = Type.isBool expandedCbTy val getArg = Var.newNoname () val setArg = Var.newNoname () in (Cexp.tuple o Vector.new2) ((Cexp.lambda o Lambda.make) {arg = getArg, argType = Type.unit, body = mkFetch {ctypeCbTy = ctypeCbTy, isBool = isBool, expandedCbTy = expandedCbTy, ptrExp = ptrExp}, mayInline = true}, (Cexp.lambda o Lambda.make) {arg = setArg, argType = expandedCbTy, body = mkStore {ctypeCbTy = ctypeCbTy, isBool = isBool, ptrExp = ptrExp, valueExp = Cexp.var (setArg, expandedCbTy)}, mayInline = true}) end val isSymbolAttributeAlloc = fn SymbolAttribute.Alloc => true | _ => false fun parseSymbolAttributesAlloc (attributes: SymbolAttribute.t list) : bool option = case attributes of [] => SOME false | [a] => (case a of SymbolAttribute.Alloc => SOME true | _=> NONE) | _ => NONE val isSymbolAttributeSymbolScope = fn SymbolAttribute.Private => true | SymbolAttribute.Public => true | SymbolAttribute.External => true | _ => false fun parseSymbolAttributesSymbolScope (attributes: SymbolAttribute.t list, defScope: SymbolScope.t) : SymbolScope.t option = case attributes of [] => SOME defScope | [a] => (case a of SymbolAttribute.Private => SOME SymbolScope.Private | SymbolAttribute.Public => SOME SymbolScope.Public | SymbolAttribute.External => SOME SymbolScope.External | _=> NONE) | _ => NONE in fun address {attributes: SymbolAttribute.t list, elabedTy: Type.t, expandedTy: Type.t, name: string, region: Region.t}: Cexp.t = let fun error l = Control.error (region, l, Layout.empty) fun invalidAttributes () = error (seq [str "invalid attributes for _address: ", List.layout SymbolAttribute.layout attributes]) fun invalidType () = Control.error (region, str "invalid type for _address", Type.layoutPretty elabedTy) val () = case Type.toCPtrType expandedTy of NONE => (invalidType (); ()) | SOME _ => () val expandedPtrTy = expandedTy val () = case List.keepAll (attributes, isSymbolAttributeAlloc) of [] => () | _ => invalidAttributes () val symbolScope = List.keepAll (attributes, isSymbolAttributeSymbolScope) val symbolScope = case parseSymbolAttributesSymbolScope (symbolScope, SymbolScope.External) of NONE => (invalidAttributes () ; SymbolScope.External) | SOME s => s val () = scopeCheck {name = name, symbolScope = symbolScope, region = region} val addrExp = mkAddress {expandedPtrTy = expandedPtrTy, name = name, symbolScope = symbolScope, cty = NONE} fun wrap (e, t) = Cexp.make (Cexp.node e, t) in wrap (addrExp, elabedTy) end fun symbolDirect {attributes: SymbolAttribute.t list, elabedTy: Type.t, expandedTy: Type.t, name: string, region: Region.t}: Cexp.t = let fun error l = Control.error (region, l, Layout.empty) fun invalidAttributes () = error (seq [str "invalid attributes for _symbol: ", List.layout SymbolAttribute.layout attributes]) fun invalidType () = Control.error (region, str "invalid type for _symbol", Type.layoutPretty elabedTy) val expandedCbTy = Exn.withEscape (fn escape => let val invalidType = fn () => (invalidType () ; ignore (escape Type.word8) ; Error.bug "ElaborateCore.symbolDirect.escape") in case Type.deTupleOpt expandedTy of NONE => invalidType () | SOME tys => if Vector.length tys <> 2 then invalidType () else let fun doit ty = case Type.deArrowOpt ty of NONE => invalidType () | SOME tys => tys val (getArgTy, getResTy) = doit (Vector.sub (tys, 0)) val (setArgTy, setResTy) = doit (Vector.sub (tys, 1)) val () = if Type.isUnit getArgTy then () else invalidType () val () = if Type.isUnit setResTy then () else invalidType () val () = if Type.canUnify (getResTy, setArgTy) then () else invalidType () in getResTy end end) val ctypeCbTy = case Type.toCBaseType expandedCbTy of NONE => (invalidType () ; CType.word (WordSize.word8, {signed = false})) | SOME {ctype, ...} => ctype val alloc = List.keepAll (attributes, isSymbolAttributeAlloc) val alloc = case parseSymbolAttributesAlloc alloc of NONE => (invalidAttributes () ; false) | SOME a => a val defScope = if alloc then SymbolScope.Public else SymbolScope.External val symbolScope = List.keepAll (attributes, isSymbolAttributeSymbolScope) val symbolScope = case parseSymbolAttributesSymbolScope (symbolScope, defScope) of NONE => (invalidAttributes () ; defScope) | SOME s => s val () = if alloc andalso symbolScope = SymbolScope.External then invalidAttributes () else () val () = scopeCheck {name = name, symbolScope = symbolScope, region = region} val () = if not alloc then () else Ffi.addSymbol {name = name, ty = ctypeCbTy, symbolScope = symbolScope} val addrExp = mkAddress {expandedPtrTy = Type.cpointer, name = name, cty = SOME ctypeCbTy, symbolScope = symbolScope} val symExp = mkSymbol {ctypeCbTy = ctypeCbTy, expandedCbTy = expandedCbTy, ptrExp = addrExp} fun wrap (e, t) = Cexp.make (Cexp.node e, t) in wrap (symExp, elabedTy) end fun symbolIndirect {elabedTy: Type.t, expandedTy: Type.t, region: Region.t}: Cexp.t = let fun invalidType () = Control.error (region, str "invalid type for _symbol", Type.layoutPretty elabedTy) val (expandedPtrTy, expandedCbTy) = Exn.withEscape (fn escape => let val invalidType = fn () => (invalidType () ; ignore (escape (Type.cpointer, Type.word8)) ; Error.bug "ElaborateCore.symbolIndirect.escape") in case Type.deArrowOpt expandedTy of NONE => invalidType () | SOME (ptrTy, symTy) => (case Type.deTupleOpt symTy of NONE => invalidType () | SOME tys => if Vector.length tys <> 2 then invalidType () else let fun doit ty = case Type.deArrowOpt ty of NONE => invalidType () | SOME tys => tys val (getArgTy, getResTy) = doit (Vector.sub (tys, 0)) val (setArgTy, setResTy) = doit (Vector.sub (tys, 1)) val () = if Type.isUnit getArgTy then () else invalidType () val () = if Type.isUnit setResTy then () else invalidType () val () = if Type.canUnify (getResTy, setArgTy) then () else invalidType () in (ptrTy, getResTy) end) end) val ctypeCbTy = case Type.toCBaseType expandedCbTy of NONE => (invalidType (); CType.word (WordSize.word8, {signed = false})) | SOME {ctype, ...} => ctype val () = case Type.toCPtrType expandedPtrTy of NONE => (invalidType (); ()) | SOME _ => () val ptrArg = Var.newNoname () val ptrExp = Cexp.var (ptrArg, expandedPtrTy) val symExp = mkSymbol {ctypeCbTy = ctypeCbTy, expandedCbTy = expandedCbTy, ptrExp = ptrExp} fun wrap (e, t) = Cexp.make (Cexp.node e, t) in wrap ((Cexp.lambda o Lambda.make) {arg = ptrArg, argType = expandedPtrTy, body = symExp, mayInline = true}, elabedTy) end end fun export {attributes: ImportExportAttribute.t list, elabedTy: Type.t, expandedTy: Type.t, name: string, region: Region.t}: Aexp.t = let fun error l = Control.error (region, l, Layout.empty) fun invalidAttributes () = error (seq [str "invalid attributes for _export: ", List.layout ImportExportAttribute.layout attributes]) fun invalidType () = Control.error (region, str "invalid type for _export", Type.layoutPretty elabedTy) val convention = List.keepAll (attributes, isIEAttributeConvention) val convention = case parseIEAttributesConvention convention of NONE => (invalidAttributes () ; Convention.Cdecl) | SOME c => c val symbolScope = List.keepAll (attributes, isIEAttributeSymbolScope) val symbolScope = case parseIEAttributesSymbolScope (symbolScope, SymbolScope.Public) of NONE => (invalidAttributes () ; SymbolScope.Public) | SOME SymbolScope.External => (invalidAttributes () ; SymbolScope.Public) | SOME s => s val () = scopeCheck {name = name, symbolScope = symbolScope, region = region} val (exportId, args, res) = case Type.toCFunType expandedTy of NONE => (invalidType () ; (0, Vector.new0 (), NONE)) | SOME (args, result) => let val id = Ffi.addExport {args = Vector.map (args, #ctype), convention = convention, name = name, res = Option.map (result, #ctype), symbolScope = symbolScope} in (id, args, result) end open Ast fun id (name: string) = Aexp.longvid (Longvid.short (Vid.fromSymbol (Symbol.fromString name, region))) fun int (i: int): Aexp.t = Aexp.const (Aconst.makeRegion (Aconst.Int (IntInf.fromInt i), region)) val f = Var.fromSymbol (Symbol.fromString "f", region) val p = Var.fromSymbol (Symbol.fromString "p", region) in Exp.fnn (Vector.new1 (Pat.var f, Exp.app (id "register", Exp.tuple (Vector.new2 (int exportId, Exp.fnn (Vector.new1 (Pat.var p, let val (args, decs) = Vector.unzip (Vector.mapi (args, fn (i, {name, ...}) => let val x = Var.fromSymbol (Symbol.fromString (concat ["x", Int.toString i]), region) val dec = Dec.vall (Vector.new0 (), x, Exp.app (id (concat ["get", name]), (Exp.tuple o Vector.new2) (Exp.var p, int (i + 1)))) in (x, dec) end)) val resVar = Var.fromSymbol (Symbol.fromString "res", region) fun newVar () = Var.fromSymbol (Symbol.fromString "none", region) in Exp.lett (Vector.concat [decs, Vector.map (Vector.new2 ((resVar, Exp.app (Exp.var f, Exp.tuple (Vector.map (args, Exp.var)))), (newVar (), (case res of NONE => Exp.constraint (Exp.var resVar, Type.unit) | SOME {name, ...} => Exp.app (id (concat ["set", name]), (Exp.tuple o Vector.new3) (Exp.var p, int (Vector.length args + 1), Exp.var resVar))))), fn (x, e) => Dec.vall (Vector.new0 (), x, e))], Exp.tuple (Vector.new0 ()), region) end))))))) end val export = Trace.trace ("ElaborateCore.export", fn {name, ...} => String.layout name, Aexp.layout) export structure Aexp = struct open Aexp local val x = Avar.fromSymbol (Symbol.fromString "#", Region.bogus) val xField = Apat.Item.Field (Apat.var x) val xVar = var x in fun selector (f: Field.t, r: Region.t): t = fnn (Vector.new1 (Apat.makeRegion (Apat.Record {flexible = true, items = Vector.new1 (f, xField)}, r), xVar)) end end structure Con = struct open Con val fromAst = fromString o Ast.Con.toString end structure Cexp = struct open Cexp fun enterLeave (e: t, doit: bool, si): t = if not doit (* Don't create the sourceInfo if we're in the middle of elaborating * a functor body. Count profiling keeps track of all sourceInfos * created and would show it with a count of zero, which would be * bad. *) orelse Env.amInsideFunctor () (* Don't create the source info if we're profiling some IL. *) orelse !Control.profileIL <> Control.ProfileSource then e else make (EnterLeave (e, si ()), ty e) end (* This property must be outside of elaborateDec, since we don't want it to * be created for each call to elaborateDec. If it were, then property lists * on variables would be littered with lots of these. *) val {get = recursiveTargs: Var.t -> (unit -> Type.t vector) option ref, ...} = Property.get (Var.plist, Property.initFun (fn _ => ref NONE)) structure ElabControl = Control.Elaborate fun check (c: (bool,bool) ElabControl.t, keyword: string, region) = if ElabControl.current c then () else let open Layout in Control.error (region, str (concat (if ElabControl.expert c then [keyword, " disallowed"] else [keyword, " disallowed, compile with -default-ann '", ElabControl.name c, " true'"])), empty) end fun elaborateDec (d, {env = E, nest}) = let val profileBody = let open Control in !profile <> ProfileNone end fun recursiveFun () = let val boundRef: (unit -> Tyvar.t vector) option ref = ref NONE val targs = Promise.lazy (fn () => case !boundRef of NONE => Error.bug "ElaborateCore.elaborateDec: boundRef not set" | SOME f => Vector.map (f (), Type.var)) fun markFunc func = recursiveTargs func := SOME targs fun unmarkFunc func = recursiveTargs func := NONE fun setBound b = boundRef := SOME b in {markFunc = markFunc, setBound = setBound, unmarkFunc = unmarkFunc} end fun elabType (t: Atype.t): Type.t = elaborateType (t, Lookup.fromEnv E) fun elabTypBind (typBind: TypBind.t) = let val TypBind.T types = TypBind.node typBind val strs = Vector.map (types, fn {def, tyvars, ...} => TypeStr.def (Scheme.make {canGeneralize = true, ty = elabType def, tyvars = tyvars}, Kind.Arity (Vector.length tyvars))) in Vector.foreach2 (types, strs, fn ({tycon, ...}, str) => Env.extendTycon (E, tycon, str, {forceUsed = false, isRebind = false})) end fun elabDatBind (datBind: DatBind.t, nest: string list) : Decs.t * {tycon: Ast.Tycon.t, typeStr: TypeStr.t} vector = (* rules 28, 29, 81, 82 *) let val DatBind.T {datatypes, withtypes} = DatBind.node datBind (* Build enough of an env so that that the withtypes and the * constructor argument types can be elaborated. *) val datatypes = Vector.map (datatypes, fn {cons, tycon = name, tyvars} => let val kind = Kind.Arity (Vector.length tyvars) val tycon = Env.newTycon (concat (List.separate (rev (Ast.Tycon.toString name :: nest), ".")), kind, AdmitsEquality.Sometimes, Ast.Tycon.region name) val _ = Env.extendTycon (E, name, TypeStr.tycon (tycon, kind), {forceUsed = true, isRebind = false}) val cons = Vector.map (cons, fn (name, arg) => {con = Con.fromAst name, name = name, arg = arg}) val makeCons = Env.newCons (E, Vector.map (cons, fn {con, name, ...} => {con = con, name = name})) in {cons = cons, kind = kind, makeCons = makeCons, name = name, tycon = tycon, tyvars = tyvars} end) val _ = elabTypBind withtypes val (dbs, strs) = (Vector.unzip o Vector.map) (datatypes, fn {cons, kind, makeCons, name, tycon, tyvars} => let val resultType: Type.t = Type.con (tycon, Vector.map (tyvars, Type.var)) val (schemes, datatypeCons) = Vector.unzip (Vector.map (cons, fn {arg, con, ...} => let val (arg, ty) = case arg of NONE => (NONE, resultType) | SOME t => let val t = elabType t in (SOME t, Type.arrow (t, resultType)) end val scheme = Scheme.make {canGeneralize = true, ty = ty, tyvars = tyvars} in (scheme, {arg = arg, con = con}) end)) val typeStr = TypeStr.data (tycon, kind, makeCons schemes) in ({cons = datatypeCons, tycon = tycon, tyvars = tyvars}, {tycon = name, typeStr = typeStr}) end) val _ = Vector.map (strs, fn {tycon, typeStr} => Env.extendTycon (E, tycon, typeStr, {forceUsed = false, isRebind = true})) (* Maximize equality. *) val change = ref false fun loop () = let val _ = Vector.foreach (dbs, fn {cons, tycon, tyvars} => let val r = TypeEnv.tyconAdmitsEquality tycon datatype z = datatype AdmitsEquality.t in case !r of Always => Error.bug "ElaborateCore.elaborateDec.elabDatBind: Always" | Never => () | Sometimes => if Vector.forall (cons, fn {arg, ...} => case arg of NONE => true | SOME ty => Scheme.admitsEquality (Scheme.make {canGeneralize = true, ty = ty, tyvars = tyvars})) then () else (r := Never; change := true) end) in if !change then (change := false; loop ()) else () end val _ = loop () in (Decs.single (Cdec.Datatype dbs), strs) end fun elabDec arg : Decs.t = Trace.traceInfo (elabDecInfo, Layout.tuple3 (Ast.Dec.layout, Nest.layout, Bool.layout), Decs.layout, Trace.assertTrue) (fn (d, nest, isTop) => let val region = Adec.region d fun lay () = seq [str "in: ", approximate (Adec.layout d)] val preError = Promise.lazy (fn () => Env.setTyconNames E) fun reportUnable (unable: Tyvar.t vector) = if 0 = Vector.length unable then () else let open Layout in Control.error (region, seq [str (concat ["can't bind type variable", if Vector.length unable > 1 then "s" else "", ": "]), seq (List.separate (Vector.toListMap (unable, Tyvar.layout), str ", "))], lay ()) end fun useBeforeDef (c: Tycon.t) = let val _ = preError () open Layout in Control.error (region, seq [str "type escapes the scope of its definition at ", str (case ! (TypeEnv.tyconRegion c) of NONE => "" | SOME r => case Region.left r of NONE => "" | SOME p => SourcePos.toString p)], align [seq [str "type: ", Tycon.layout c], lay ()]) end val () = TypeEnv.tick {useBeforeDef = useBeforeDef} val unify = fn (t, t', f) => unify (t, t', preError, f) fun checkSchemes (v: (Var.t * Scheme.t) vector): unit = if isTop then List.push (freeTyvarChecks, fn () => Vector.foreach2 (v, Scheme.haveFrees (Vector.map (v, #2)), fn ((x, s), b) => if b then let val _ = preError () open Layout in Control.warning (region, seq [str "unable to locally determine type of variable: ", Var.layout x], align [seq [str "type: ", Scheme.layoutPretty s], lay ()]) end else ())) else () val elabDec = fn (d, isTop) => elabDec (d, nest, isTop) in case Adec.node d of Adec.Abstype {datBind, body} => (* rule 19 and p.57 *) let val ((decs, strs), decs') = Env.localCore (E, fn () => elabDatBind (datBind, nest), fn z => (z, elabDec (body, isTop))) val _ = Vector.foreach (strs, fn {tycon, typeStr} => Env.extendTycon (E, tycon, TypeStr.abs typeStr, {forceUsed = true, isRebind = false})) in Decs.append (decs, decs') end | Adec.Datatype rhs => (case DatatypeRhs.node rhs of DatatypeRhs.DatBind datBind => (* rule 17 *) #1 (elabDatBind (datBind, nest)) | DatatypeRhs.Repl {lhs, rhs} => (* rule 18 *) let val () = Option.app (Env.lookupLongtycon (E, rhs), fn s => let val forceUsed = case TypeStr.node s of TypeStr.Datatype _ => true | _ => false in Env.extendTycon (E, lhs, s, {forceUsed = forceUsed, isRebind = false}) end) in Decs.empty end) | Adec.Exception ebs => let val decs = Vector.fold (ebs, Decs.empty, fn ((exn, rhs), decs) => let val (decs, exn', scheme) = case EbRhs.node rhs of EbRhs.Def c => let val (c, s) = Env.lookupLongcon (E, c) in (decs, c, s) end | EbRhs.Gen arg => let val exn' = Con.fromAst exn val (arg, ty) = case arg of NONE => (NONE, Type.exn) | SOME t => let val t = elabType t in (SOME t, Type.arrow (t, Type.exn)) end val scheme = Scheme.fromType ty in (Decs.add (decs, Cdec.Exception {arg = arg, con = exn'}), exn', SOME scheme) end val _ = Env.extendExn (E, exn, exn', scheme) in decs end) in decs end | Adec.Fix {ops, fixity} => (Vector.foreach (ops, fn op' => Env.extendFix (E, op', fixity)) ; Decs.empty) | Adec.Fun (tyvars, fbs) => let val fbs = Vector.map (fbs, fn clauses => Vector.map (clauses, fn {body, pats, resultType} => let fun lay () = approximate (let open Layout in seq [seq (List.separate (Vector.toListMap (pats, Apat.layoutDelimit), str " ")), str " = ", Aexp.layout body] end) val {args, func} = Parse.parseClause (pats, E, region, lay) in {args = args, body = body, func = func, lay = lay, resultType = resultType} end)) val close = TypeEnv.close (tyvars, {useBeforeDef = useBeforeDef}) val {markFunc, setBound, unmarkFunc} = recursiveFun () val fbs = Vector.map (fbs, fn clauses => if Vector.isEmpty clauses then Error.bug "ElaborateCore.elabDec: Fun:no clauses" else let fun lay () = let open Layout in seq [str "in: ", approximate (seq (separate (Vector.toListMap (clauses, fn {lay, ...} => lay ()), " | ")))] end val {args, func, lay = lay0, ...} = Vector.sub (clauses, 0) val numArgs = Vector.length args val _ = Vector.foreach (clauses, fn {args, lay = layN, ...} => if numArgs = Vector.length args then () else let fun one lay = seq [str "clause: ", approximate (lay ())] in Control.error (region, seq [str "function defined with different numbers of arguments"], align [one lay0, one layN]) end) val diff = Vector.fold (clauses, [], fn ({func = func', ...}, ac) => if Avar.equals (func, func') then ac else func' :: ac) val _ = case diff of [] => () | _ => let val diff = List.removeDuplicates (func :: diff, Avar.equals) in Control.error (region, seq [str "function defined with multiple names: ", seq (Layout.separateRight (List.map (diff, Avar.layout), ", "))], lay ()) end val var = Var.fromAst func val ty = Type.new () val _ = Env.extendVar (E, func, var, Scheme.fromType ty, {isRebind = false}) val _ = markFunc var val _ = Acon.ensureRedefine (Avid.toCon (Avid.fromVar func)) in {clauses = clauses, func = func, lay = lay, ty = ty, var = var} end) val _ = Vector.fold (fbs, [], fn ({func = f, ...}, ac) => if List.exists (ac, fn f' => Avar.equals (f, f')) then (Control.error (Avar.region f, seq [str "function ", Avar.layout f, str " defined multiple times: "], lay ()) ; ac) else f :: ac) val decs = Vector.map (fbs, fn {clauses, func: Avar.t, lay, ty: Type.t, var: Var.t} => let val nest = Avar.toString func :: nest fun sourceInfo () = SourceInfo.function {name = nest, region = Avar.region func} val rs = Vector.map (clauses, fn {args: Apat.t vector, body: Aexp.t, lay: unit -> Layout.t, resultType: Atype.t option, ...} => Env.scope (E, fn () => let val elaboratePat = elaboratePat () val pats = Vector.map (args, fn p => {pat = #1 (elaboratePat (p, E, {bind = true, isRvb = false}, preError)), region = Apat.region p}) val bodyRegion = Aexp.region body val body = elabExp (body, nest, NONE) val body = Cexp.enterLeave (body, profileBody andalso !Control.profileBranch, fn () => let open Layout val name = concat [""] in SourceInfo.function {name = name :: nest, region = bodyRegion} end) val _ = Option.app (resultType, fn t => unify (elabType t, Cexp.ty body, fn (l1, l2) => (Atype.region t, str "function result type disagrees with expression", align [seq [str "result type: ", l1], seq [str "expression: ", l2], lay ()]))) in {body = body, bodyRegion = bodyRegion, lay = lay, pats = pats} end)) val numArgs = Vector.length (#pats (Vector.sub (rs, 0))) val argTypes = Vector.tabulate (numArgs, fn i => let val t = Cpat.ty (#pat (Vector.sub (#pats (Vector.sub (rs, 0)), i))) val _ = Vector.foreach (rs, fn {pats, ...} => let val {pat, region} = Vector.sub (pats, i) in unify (t, Cpat.ty pat, fn (l1, l2) => (region, str "function with argument of different types", align [seq [str "argument: ", l2], seq [str "previous: ", l1], lay ()])) end) in t end) val t = Cexp.ty (#body (Vector.sub (rs, 0))) val _ = Vector.foreach (rs, fn {body, bodyRegion, ...} => unify (t, Cexp.ty body, fn (l1, l2) => (bodyRegion, str "function with result of different types", align [seq [str "result: ", l2], seq [str "previous: ", l1], lay ()]))) val xs = Vector.tabulate (numArgs, fn _ => Var.newNoname ()) fun make (i: int): Cexp.t = if i = Vector.length xs then let val e = Cexp.casee {kind = "function", lay = lay, nest = nest, noMatch = Cexp.RaiseMatch, nonexhaustiveExnMatch = nonexhaustiveExnMatch (), nonexhaustiveMatch = nonexhaustiveMatch (), redundantMatch = redundantMatch (), region = region, rules = Vector.map (rs, fn {body, lay, pats, ...} => let val pats = Vector.map (pats, #pat) in {exp = body, lay = SOME lay, pat = (Cpat.make (Cpat.Tuple pats, Type.tuple (Vector.map (pats, Cpat.ty))))} end), test = Cexp.tuple (Vector.map2 (xs, argTypes, Cexp.var))} in Cexp.enterLeave (e, profileBody, sourceInfo) end else let val body = make (i + 1) val argType = Vector.sub (argTypes, i) in Cexp.make (Cexp.Lambda (Lambda.make {arg = Vector.sub (xs, i), argType = argType, body = body, mayInline = true}), Type.arrow (argType, Cexp.ty body)) end val lambda = make 0 val _ = unify (Cexp.ty lambda, ty, fn (l1, l2) => (Avar.region func, str "Recursive use of function disagrees with its type", align [seq [str "expects: ", l1], seq [str "but got: ", l2], lay ()])) val lambda = case Cexp.node lambda of Cexp.Lambda l => l | _ => Lambda.bogus in {lambda = lambda, ty = ty, var = var} end) val {bound, schemes, unable} = close (Vector.map (decs, fn {ty, ...} => {isExpansive = false, ty = ty})) val () = reportUnable unable val _ = checkSchemes (Vector.zip (Vector.map (decs, #var), schemes)) val _ = setBound bound val _ = Vector.foreach3 (fbs, decs, schemes, fn ({func, ...}, {var, ...}, scheme) => (Env.extendVar (E, func, var, scheme, {isRebind = true}) ; unmarkFunc var)) val decs = Vector.map (decs, fn {lambda, var, ...} => {lambda = lambda, var = var}) in Decs.single (Cdec.Fun {decs = decs, tyvars = bound}) end | Adec.Local (d, d') => Env.localCore (E, fn () => elabDec (d, false), fn decs => Decs.append (decs, elabDec (d', isTop))) | Adec.Open paths => let (* The following code is careful to first lookup all of the * paths in the current environment, and then extend the * environment with all of the results. * See rule 22 of the Definition. *) val _ = Vector.foreach (Vector.map (paths, fn p => Env.lookupLongstrid (E, p)), fn so => Option.app (so, fn s => Env.openStructure (E, s))) in Decs.empty end | Adec.Overload (p, x, tyvars, ty, xs) => (check (ElabControl.allowOverload, "_overload", region) ; let (* Lookup the overloads before extending the var in case * x appears in the xs. *) val ovlds = Vector.concatV (Vector.map (xs, fn x => case Env.lookupLongvid (E, x) of (Vid.Var v, t) => Vector.new1 (Longvid.region x, (v, t)) | (Vid.Overload (_, vs), _) => Vector.map (vs, fn vt => (Longvid.region x, vt)) | _ => (Control.error (Longvid.region x, str "cannot overload", seq [str "constructor: ", Longvid.layout x]) ; Vector.new0 ()))) val s = Scheme.make {canGeneralize = false, tyvars = tyvars, ty = elabType ty} val _ = Vector.foreach (ovlds, fn (_, (_, NONE)) => () | (r, (_, SOME s')) => let val is = Scheme.instantiate s val is' = Scheme.instantiate s' in unify (#instance is, #instance is', fn (l1, l2) => (r, str "variant does not unify with overload", align [seq [str "overload: ", l1], seq [str "variant: ", l2], lay ()])) end) val _ = Env.extendOverload (E, p, x, Vector.map (ovlds, fn (_, vt) => vt), s) in Decs.empty end) | Adec.SeqDec ds => Vector.fold (ds, Decs.empty, fn (d, decs) => Decs.append (decs, elabDec (d, isTop))) | Adec.Type typBind => (elabTypBind typBind ; Decs.empty) | Adec.Val {tyvars, rvbs, vbs} => let val close = TypeEnv.close (tyvars, {useBeforeDef = useBeforeDef}) (* Must do all the es and rvbs before the ps because of * scoping rules. *) val vbs = Vector.map (vbs, fn {exp, pat, ...} => let fun lay () = let open Layout in seq [str "in: ", approximate (seq [Apat.layout pat, str " = ", Aexp.layout exp])] end val patRegion = Apat.region pat val expRegion = Aexp.region exp val exp = elabExp (exp, nest, Apat.getName pat) val exp = Cexp.enterLeave (exp, profileBody andalso !Control.profileVal andalso Cexp.isExpansive exp, fn () => let val name = concat [""] in SourceInfo.function {name = name :: nest, region = expRegion} end) in {exp = exp, expRegion = expRegion, lay = lay, pat = pat, patRegion = patRegion} end) val {markFunc, setBound, unmarkFunc} = recursiveFun () val elaboratePat = elaboratePat () val rvbs = Vector.map (rvbs, fn {pat, match} => let val region = Apat.region pat val (pat, bound) = elaboratePat (pat, E, {bind = false, isRvb = true}, preError) val (nest, var, ty) = if 0 = Vector.length bound then ("rec" :: nest, Var.newNoname (), Type.new ()) else let val (x, x', t) = Vector.sub (bound, 0) in (Avar.toString x :: nest, x', t) end val _ = markFunc var val scheme = Scheme.fromType ty val bound = Vector.map (bound, fn (x, _, _) => (Acon.ensureRedefine (Avid.toCon (Avid.fromVar x)) ; Env.extendVar (E, x, var, scheme, {isRebind = false}) ; (x, var, ty))) in {bound = bound, match = match, nest = nest, pat = pat, region = region, var = var} end) val rvbs = Vector.map (rvbs, fn {bound, match, nest, pat, var, ...} => let val {argType, region, resultType, rules} = elabMatch (match, preError, nest) val _ = unify (Cpat.ty pat, Type.arrow (argType, resultType), fn (l1, l2) => (region, str "function type disagrees with recursive uses", align [seq [str "function type: ", l1], seq [str "recursive uses: ", l2], lay ()])) val arg = Var.newNoname () val body = Cexp.enterLeave (Cexp.casee {kind = "function", lay = lay, nest = nest, noMatch = Cexp.RaiseMatch, nonexhaustiveExnMatch = nonexhaustiveExnMatch (), nonexhaustiveMatch = nonexhaustiveMatch (), redundantMatch = redundantMatch (), region = region, rules = rules, test = Cexp.var (arg, argType)}, profileBody, fn () => SourceInfo.function {name = nest, region = region}) val lambda = Lambda.make {arg = arg, argType = argType, body = body, mayInline = true} in {bound = bound, lambda = lambda, var = var} end) val boundVars = Vector.map (Vector.concatV (Vector.map (rvbs, #bound)), fn x => (x, {isExpansive = false, isRebind = true})) val rvbs = Vector.map (rvbs, fn {bound, lambda, var} => (Vector.foreach (bound, unmarkFunc o #2) ; {lambda = lambda, var = var})) val vbs = Vector.map (vbs, fn {exp, expRegion, lay, pat, patRegion, ...} => let val (pat, bound) = elaboratePat (pat, E, {bind = false, isRvb = false}, preError) val _ = unify (Cpat.ty pat, Cexp.ty exp, fn (p, e) => (patRegion, str "pattern and expression disagree", align [seq [str "pattern: ", p], seq [str "expression: ", e], lay ()])) in {bound = bound, exp = exp, expRegion = expRegion, lay = lay, pat = pat, patRegion = patRegion} end) val boundVars = Vector.concat [boundVars, Vector.concatV (Vector.map (vbs, fn {bound, exp, ...} => (Vector.map (bound, fn z => (z, {isExpansive = Cexp.isExpansive exp, isRebind = false})))))] val {bound, schemes, unable} = close (Vector.map (boundVars, fn ((_, _, ty), {isExpansive, ...}) => {isExpansive = isExpansive, ty = ty})) val () = reportUnable unable val () = checkSchemes (Vector.zip (Vector.map (boundVars, #2 o #1), schemes)) val () = setBound bound val () = Vector.foreach2 (boundVars, schemes, fn (((x, x', _), {isRebind, ...}), scheme) => Env.extendVar (E, x, x', scheme, {isRebind = isRebind})) val vbs = Vector.map (vbs, fn {exp, lay, pat, patRegion, ...} => {exp = exp, lay = lay, nest = nest, pat = pat, patRegion = patRegion}) (* According to page 28 of the Definition, we should * issue warnings for nonexhaustive valdecs only when it's * not a top level dec. It seems harmless enough to go * ahead and always issue them. *) in Decs.single (Cdec.Val {nonexhaustiveExnMatch = nonexhaustiveExnMatch (), nonexhaustiveMatch = nonexhaustiveMatch (), rvbs = rvbs, tyvars = bound, vbs = vbs}) end end) arg and elabExp (arg: Aexp.t * Nest.t * string option): Cexp.t = Trace.traceInfo (elabExpInfo, Layout.tuple3 (Aexp.layout, Nest.layout, Layout.ignore), Cexp.layoutWithType, Trace.assertTrue) (fn (e: Aexp.t, nest, maybeName) => let val preError = Promise.lazy (fn () => Env.setTyconNames E) val unify = fn (t, t', f) => unify (t, t', preError, f) fun lay () = seq [str "in: ", approximate (Aexp.layout e)] val unify = fn (a, b, f) => unify (a, b, fn z => let val (r, l, l') = f z in (r, l, align [l', lay ()]) end) val region = Aexp.region e fun elab e = elabExp (e, nest, NONE) in case Aexp.node e of Aexp.Andalso (e, e') => let val ce = elab e val ce' = elab e' fun doit (ce, br) = unify (Cexp.ty ce, Type.bool, fn (l, _) => (Aexp.region e, str (concat [br, " branch of andalso not of type bool"]), seq [str " branch: ", l])) val _ = doit (ce, "left") val _ = doit (ce', "right") in Cexp.andAlso (ce, ce') end | Aexp.App (e1, e2) => let val e1 = elab e1 val e2 = elab e2 val (argType, resultType) = case Type.deArrowOpt (Cexp.ty e1) of SOME types => types | NONE => let val types = (Type.new (), Type.new ()) val _ = unify (Cexp.ty e1, Type.arrow types, fn (l, _) => (region, str "function not of arrow type", seq [str "function: ", l])) in types end val _ = unify (argType, Cexp.ty e2, fn (l1, l2) => (region, str "function applied to incorrect argument", align [seq [str "expects: ", l1], seq [str "but got: ", l2]])) in Cexp.make (Cexp.App (e1, e2), resultType) end | Aexp.Case (e, m) => let val e = elab e val {argType, rules, ...} = elabMatch (m, preError, nest) val _ = unify (Cexp.ty e, argType, fn (l1, l2) => (region, str "case object and rules disagree", align [seq [str "object type: ", l1], seq [str "rules expect: ", l2]])) in Cexp.casee {kind = "case", lay = lay, nest = nest, noMatch = Cexp.RaiseMatch, nonexhaustiveExnMatch = nonexhaustiveExnMatch (), nonexhaustiveMatch = nonexhaustiveMatch (), redundantMatch = redundantMatch (), region = region, rules = rules, test = e} end | Aexp.Const c => elabConst (c, fn (resolve, ty) => Cexp.make (Cexp.Const resolve, ty), {false = Cexp.falsee, true = Cexp.truee}) | Aexp.Constraint (e, t') => let val e = elab e val _ = unify (Cexp.ty e, elabType t', fn (l1, l2) => (region, str "expression and constraint disagree", align [seq [str "expects: ", l2], seq [str "but got: ", l1]])) in e end | Aexp.FlatApp items => elab (Parse.parseExp (items, E, lay)) | Aexp.Fn m => let val nest = case maybeName of NONE => "fn" :: nest | SOME s => s :: nest val {arg, argType, body} = elabMatchFn (m, preError, nest, "function", lay, Cexp.RaiseMatch) val body = Cexp.enterLeave (body, profileBody, fn () => SourceInfo.function {name = nest, region = region}) in Cexp.make (Cexp.Lambda (Lambda.make {arg = arg, argType = argType, body = body, mayInline = true}), Type.arrow (argType, Cexp.ty body)) end | Aexp.Handle (try, match) => let val try = elab try val {arg, argType, body} = elabMatchFn (match, preError, nest, "handler", lay, Cexp.RaiseAgain) val _ = unify (Cexp.ty try, Cexp.ty body, fn (l1, l2) => (region, str "expression and handler disagree", align [seq [str "expression: ", l1], seq [str "handler: ", l2]])) val _ = unify (argType, Type.exn, fn (l1, _) => (Amatch.region match, seq [str "handler handles wrong type: ", l1], empty)) in Cexp.make (Cexp.Handle {catch = (arg, Type.exn), handler = body, try = try}, Cexp.ty try) end | Aexp.If (a, b, c) => let val a' = elab a val b' = elab b val c' = elab c val _ = unify (Cexp.ty a', Type.bool, fn (l1, _) => (Aexp.region a, str "if test not of type bool", seq [str "test type: ", l1])) val _ = unify (Cexp.ty b', Cexp.ty c', fn (l1, l2) => (region, str "then and else branches disagree", align [seq [str "then: ", l1], seq [str "else: ", l2]])) val (b', c') = if not (!Control.profileBranch) then (b', c') else let fun wrap (e, e', name) = Cexp.enterLeave (e', profileBody, fn () => SourceInfo.function {name = name :: nest, region = Aexp.region e}) in (wrap (b, b', ""), wrap (c, c', "")) end in Cexp.iff (a', b', c') end | Aexp.Let (d, e) => Env.scope (E, fn () => let val time = Time.now () val d = Decs.toVector (elabDec (d, nest, false)) val e = elab e val ty = Cexp.ty e val () = Type.minTime (ty, time) in Cexp.make (Cexp.Let (d, e), ty) end) | Aexp.List es => let val es' = Vector.map (es, elab) in Cexp.make (Cexp.List es', unifyList (Vector.map2 (es, es', fn (e, e') => (Cexp.ty e', Aexp.region e)), preError, lay)) end | Aexp.Orelse (e, e') => let val ce = elab e val ce' = elab e' fun doit (ce, br) = unify (Cexp.ty ce, Type.bool, fn (l, _) => (Aexp.region e, str (concat [br, " branch of orelse not of type bool"]), seq [str " branch: ", l])) val _ = doit (ce, "left") val _ = doit (ce', "right") in Cexp.orElse (ce, ce') end | Aexp.Prim kind => let fun elabAndExpandTy ty = let val elabedTy = elabType ty val expandedTy = Type.hom (elabedTy, {con = Type.con, expandOpaque = true, record = Type.record, replaceSynonyms = false, var = Type.var}) in (elabedTy, expandedTy) end (* We use expandedTy to get the underlying primitive right * but we use wrap in the end to make the result of the * final expression be ty, because that is what the rest * of the code expects to see. *) fun wrap (e, t) = Cexp.make (Cexp.node e, t) fun etaExtraNoWrap {expandedTy, extra, prim: Type.t Prim.t}: Cexp.t = case Type.deArrowOpt expandedTy of NONE => primApp {args = extra, prim = prim, result = expandedTy} | SOME (argType, bodyType) => let val arg = Var.newNoname () fun app args = primApp {args = Vector.concat [extra, args], prim = prim, result = bodyType} val body = case Type.deTupleOpt argType of NONE => app (Vector.new1 (Cexp.var (arg, argType))) | SOME ts => let val vars = Vector.map (ts, fn t => (Var.newNoname (), t)) in Cexp.casee {kind = "", lay = fn _ => Layout.empty, nest = [], noMatch = Cexp.Impossible, nonexhaustiveExnMatch = Control.Elaborate.DiagDI.Default, nonexhaustiveMatch = Control.Elaborate.DiagEIW.Ignore, redundantMatch = Control.Elaborate.DiagEIW.Ignore, region = Region.bogus, rules = Vector.new1 {exp = app (Vector.map (vars, Cexp.var)), lay = NONE, pat = Cpat.tuple (Vector.map (vars, Cpat.var))}, test = Cexp.var (arg, argType)} end in (Cexp.lambda o Lambda.make) {arg = arg, argType = argType, body = body, mayInline = true} end fun etaNoWrap {expandedTy, prim: Type.t Prim.t} : Cexp.t = etaExtraNoWrap {expandedTy = expandedTy, extra = Vector.new0 (), prim = prim} fun eta {elabedTy, expandedTy, prim: Type.t Prim.t} : Cexp.t = wrap (etaNoWrap {expandedTy = expandedTy, prim = prim}, elabedTy) fun lookConst {default: string option, elabedTy, expandedTy, name: string} = let fun bug () = let open Layout val _ = Control.error (region, seq [str "strange constant type: ", Type.layout expandedTy], empty) in Error.bug "ElaborateCore.elabExp.lookConst" end in case Type.deConOpt expandedTy of NONE => bug () | SOME (c, ts) => let val ct = if Tycon.equals (c, Tycon.bool) then ConstType.Bool else if Tycon.isIntX c then case Tycon.deIntX c of NONE => bug () | SOME is => ConstType.Word (WordSize.fromBits (IntSize.bits is)) else if Tycon.isRealX c then ConstType.Real (Tycon.deRealX c) else if Tycon.isWordX c then ConstType.Word (Tycon.deWordX c) else if Tycon.equals (c, Tycon.vector) andalso 1 = Vector.length ts andalso (case (Type.deConOpt (Vector.sub (ts, 0))) of NONE => false | SOME (c, _) => Tycon.isCharX c andalso (Tycon.deCharX c = CharSize.C8)) then ConstType.String else bug () val finish = fn () => ! Const.lookup ({default = default, name = name}, ct) in Cexp.make (Cexp.Const finish, elabedTy) end end val check = fn (c, n) => check (c, n, region) datatype z = datatype Ast.PrimKind.t in case kind of Address {attributes, name, ty} => let val () = check (ElabControl.allowFFI, "_address") val (elabedTy, expandedTy) = elabAndExpandTy ty in address {attributes = attributes, elabedTy = elabedTy, expandedTy = expandedTy, name = name, region = region} end | BuildConst {name, ty} => let val () = check (ElabControl.allowConstant, "_build_const") val (elabedTy, expandedTy) = elabAndExpandTy ty in lookConst {default = NONE, elabedTy = elabedTy, expandedTy = expandedTy, name = name} end | CommandLineConst {name, ty, value} => let val () = check (ElabControl.allowConstant, "_command_line_const") val (elabedTy, expandedTy) = elabAndExpandTy ty val value = elabConst (value, fn (resolve, _) => case resolve () of Const.Word w => IntInf.toString (WordX.toIntInf w) | c => Const.toString c, {false = "false", true = "true"}) in lookConst {default = SOME value, elabedTy = elabedTy, expandedTy = expandedTy, name = name} end | Const {name, ty} => let val () = check (ElabControl.allowConstant, "_const") val (elabedTy, expandedTy) = elabAndExpandTy ty in lookConst {default = NONE, elabedTy = elabedTy, expandedTy = expandedTy, name = name} end | Export {attributes, name, ty} => let val () = check (ElabControl.allowFFI, "_export") val (elabedTy, expandedTy) = elabAndExpandTy ty fun error () = Control.error (region, str "invalid type for _export", Type.layoutPretty elabedTy) val (expandedCfTy, elabedExportTy) = Exn.withEscape (fn escape => let val error = fn () => (error () ; ignore (escape (Type.arrow (Type.unit, Type.unit), elabedTy)) ; Error.bug "ElaborateCore.elabExp.Export.escape") in case Type.deArrowOpt expandedTy of NONE => error () | SOME (argTy, resTy) => (case Type.deArrowOpt argTy of NONE => error () | SOME _ => let val () = if Type.isUnit resTy then () else error () in (argTy, elabedTy) end) end) val exp = Env.scope (E, fn () => (Env.openStructure (E, valOf (!Env.Structure.ffi)) ; elab (export {attributes = attributes, elabedTy = elabedTy, expandedTy = expandedCfTy, name = name, region = region}))) val _ = unify (Cexp.ty exp, Type.arrow (expandedCfTy, Type.unit), fn (l1, l2) => let open Layout in (region, str "_export unify bug", align [seq [str "inferred: ", l1], seq [str "expanded: ", l2]]) end) in wrap (exp, elabedExportTy) end | IImport {attributes, ty} => let val () = check (ElabControl.allowFFI, "_import") val (elabedTy, expandedTy) = elabAndExpandTy ty fun error () = Control.error (region, str "invalid type for _import", Type.layoutPretty elabedTy) val (expandedFPtrTy, expandedCfTy) = Exn.withEscape (fn escape => let val error = fn () => (error () ; ignore (escape (Type.cpointer, Type.arrow (Type.unit, Type.unit))) ; Error.bug "ElaborateCore.elabExp.IImport.escape") in case Type.deArrowOpt expandedTy of NONE => error () | SOME (fptrTy, cfTy) => (fptrTy, cfTy) end) val () = case Type.toCPtrType expandedFPtrTy of NONE => (error (); ()) | SOME _ => () val fptr = Var.newNoname () val fptrArg = Cexp.var (fptr, expandedFPtrTy) in wrap ((Cexp.lambda o Lambda.make) {arg = fptr, argType = expandedFPtrTy, body = etaExtraNoWrap {expandedTy = expandedCfTy, extra = Vector.new1 fptrArg, prim = import {attributes = attributes, name = NONE, region = region, elabedTy = elabedTy, expandedTy = expandedCfTy}}, mayInline = true}, elabedTy) end | Import {attributes, name, ty} => let val () = check (ElabControl.allowFFI, "_import") val (elabedTy, expandedTy) = elabAndExpandTy ty in eta ({elabedTy = elabedTy, expandedTy = expandedTy, prim = import {attributes = attributes, name = SOME name, region = region, elabedTy = elabedTy, expandedTy = expandedTy}}) end | ISymbol {ty} => let val () = check (ElabControl.allowFFI, "_symbol") val (elabedTy, expandedTy) = elabAndExpandTy ty in symbolIndirect {elabedTy = elabedTy, expandedTy = expandedTy, region = region} end | Prim {name, ty} => let val () = check (ElabControl.allowPrim, "_prim") val (elabedTy, expandedTy) = elabAndExpandTy ty val prim = case Prim.fromString name of NONE => (Control.error (region, str (concat ["unknown primitive: ", name]), empty) ; Prim.bogus) | SOME p => p in eta {elabedTy = elabedTy, expandedTy = expandedTy, prim = prim} end | Symbol {attributes, name, ty} => let val () = check (ElabControl.allowFFI, "_symbol") val (elabedTy, expandedTy) = elabAndExpandTy ty in symbolDirect {attributes = attributes, elabedTy = elabedTy, expandedTy = expandedTy, name = name, region = region} end end | Aexp.Raise exn => let val region = Aexp.region exn val exn = elab exn val _ = unify (Cexp.ty exn, Type.exn, fn (l1, _) => (region, str "raise of non exception", seq [str "exp type: ", l1])) val resultType = Type.new () in Cexp.enterLeave (Cexp.make (Cexp.Raise exn, resultType), profileBody andalso !Control.profileRaise, fn () => SourceInfo.function {name = "" :: nest, region = region}) end | Aexp.Record r => let val r = Record.map (r, elab) val ty = Type.record (SortedRecord.fromVector (Record.toVector (Record.map (r, Cexp.ty)))) in Cexp.make (Cexp.Record r, ty) end | Aexp.Selector f => elab (Aexp.selector (f, region)) | Aexp.Seq es => let val es' = Vector.map (es, elab) val last = Vector.length es - 1 (* Diagnose expressions before a ; that don't return unit. *) val _ = let fun doit f = List.push (sequenceTypeChecks, fn () => Vector.foreachi (es', fn (i, e') => if i = last then () else let val ty = Cexp.ty e' in if Type.isUnit ty then () else let val e = Vector.sub (es, i) open Layout in f (Aexp.region e, str "sequence expression not of type unit", align [seq [str "type: ", Type.layoutPrettyBracket ty], seq [str "in: ", approximate (Aexp.layout e)]]) end end)) in case sequenceNonUnit () of Control.Elaborate.DiagEIW.Error => doit Control.error | Control.Elaborate.DiagEIW.Ignore => () | Control.Elaborate.DiagEIW.Warn => doit Control.warning end in Cexp.make (Cexp.Seq es', Cexp.ty (Vector.sub (es', last))) end | Aexp.Var {name = id, ...} => let val (vid, scheme) = Env.lookupLongvid (E, id) fun dontCare () = Cexp.var (Var.newNoname (), Type.new ()) in case scheme of NONE => dontCare () | SOME scheme => let val {args, instance} = Scheme.instantiate scheme fun con c = Cexp.Con (c, args ()) val e = case vid of Vid.Con c => con c | Vid.Exn c => con c | Vid.Overload (p, yts) => let val resolve = Promise.lazy (fn () => case Vector.peekMap (yts, fn (x, s) => case s of NONE => NONE | SOME s => let val is = Scheme.instantiate s in if Type.canUnify (instance, #instance is) then SOME (x, SOME is) else NONE end) of NONE => let val _ = Control.error (region, seq [str "impossible use of overloaded var: ", str (Longvid.toString id)], Type.layoutPretty instance) in {id = Var.newNoname (), args = Vector.new0 ()} end | SOME (y, is) => (unify (instance, #instance (valOf is), fn _ => Error.bug "ElaborateCore.elabExp: Var:overload unify") ; {id = y, args = #args (valOf is) ()})) val _ = List.push (overloads, (p, ignore o resolve)) in Cexp.Var (#id o resolve, #args o resolve) end | Vid.Var x => Cexp.Var (fn () => x, case ! (recursiveTargs x) of NONE => args | SOME f => f) in Cexp.make (e, instance) end end | Aexp.While {expr, test} => let val test' = elab test val _ = unify (Cexp.ty test', Type.bool, fn (l1, _) => (Aexp.region test, str "while test not of type bool", seq [str "test type: ", l1])) val expr' = elab expr (* Diagnose if expr is not of type unit. *) val _ = let fun doit f = List.push (sequenceTypeChecks, fn () => let val ty = Cexp.ty expr' in if Type.isUnit ty then () else f (Aexp.region expr, str "while body not of type unit", seq [str "body type: ", Type.layoutPrettyBracket ty]) end) in case sequenceNonUnit () of Control.Elaborate.DiagEIW.Error => doit Control.error | Control.Elaborate.DiagEIW.Ignore => () | Control.Elaborate.DiagEIW.Warn => doit Control.warning end in Cexp.whilee {expr = expr', test = test'} end end) arg and elabMatchFn (m: Amatch.t, preError, nest, kind, lay, noMatch) = let val arg = Var.newNoname () val {argType, region, rules, ...} = elabMatch (m, preError, nest) val body = Cexp.casee {kind = kind, lay = lay, nest = nest, noMatch = noMatch, nonexhaustiveExnMatch = nonexhaustiveExnMatch (), nonexhaustiveMatch = nonexhaustiveMatch (), redundantMatch = redundantMatch (), region = region, rules = rules, test = Cexp.var (arg, argType)} in {arg = arg, argType = argType, body = body} end and elabMatch (m: Amatch.t, preError, nest: Nest.t) = let val region = Amatch.region m val Amatch.T rules = Amatch.node m val argType = Type.new () val resultType = Type.new () val rules = Vector.map (rules, fn (pat, exp) => Env.scope (E, fn () => let fun lay () = let open Layout in approximate (seq [Apat.layout pat, str " => ", Aexp.layout exp]) end val patOrig = pat val (pat, _) = elaboratePat () (pat, E, {bind = true, isRvb = false}, preError) val _ = unify (Cpat.ty pat, argType, preError, fn (l1, l2) => (Apat.region patOrig, str "rule patterns disagree", align [seq [str "pattern: ", l1], seq [str "previous: ", l2], seq [str "in: ", lay ()]])) val expOrig = exp val exp = elabExp (exp, nest, NONE) val _ = unify (Cexp.ty exp, resultType, preError, fn (l1, l2) => (Aexp.region expOrig, str "rule results disagree", align [seq [str "result: ", l1], seq [str "previous: ", l2], seq [str "in: ", lay ()]])) val exp = Cexp.enterLeave (exp, profileBody andalso !Control.profileBranch, fn () => let val name = concat [""] in SourceInfo.function {name = name :: nest, region = Aexp.region expOrig} end) in {exp = exp, lay = SOME lay, pat = pat} end)) in {argType = argType, region = region, resultType = resultType, rules = rules} end val ds = elabDec (Scope.scope d, nest, true) (* List.insertionSort is anti-stable; * hence, it sorts and reverses the overloads. *) val _ = List.foreach (List.insertionSort (!overloads, fn ((x,_),(y,_)) => Priority.<= (y, x)), fn (_,p) => (p (); ())) val _ = overloads := [] in ds end fun reportUndeterminedTypes () = (List.foreach (rev (!freeTyvarChecks), fn p => p ()) ; freeTyvarChecks := []) fun reportSequenceNonUnit () = (List.foreach (rev (!sequenceTypeChecks), fn p => p ()) ; sequenceTypeChecks := []) end mlton-20100608/mlton/elaborate/elaborate-core.sig0000644000076600000240000000162111404435623020240 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_CORE_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure Decs: DECS structure Env: ELABORATE_ENV sharing Ast = Env.Ast sharing Ast.Tyvar = CoreML.Tyvar sharing CoreML = Decs.CoreML = Env.CoreML sharing Decs = Env.Decs end signature ELABORATE_CORE = sig include ELABORATE_CORE_STRUCTS (* Elaborate dec in env, returning Core ML decs. *) val elaborateDec: Ast.Dec.t * {env: Env.t, nest: string list} -> Decs.t val reportSequenceNonUnit: unit -> unit val reportUndeterminedTypes: unit -> unit end mlton-20100608/mlton/elaborate/elaborate-env.fun0000644000076600000240000040034611404435623020115 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ElaborateEnv (S: ELABORATE_ENV_STRUCTS): ELABORATE_ENV = struct open S local open Control.Elaborate in val nonexhaustiveExnMatch = fn () => current nonexhaustiveExnMatch val nonexhaustiveMatch = fn () => current nonexhaustiveMatch val warnUnused = fn () => current warnUnused end local open Ast in structure Basid = Basid structure Fctid = Fctid structure Field = SortedRecord.Field structure Strid = Strid structure Longvid = Longvid structure Longstrid = Longstrid structure Longtycon = Longtycon structure Priority = Priority structure Sigid = Sigid structure SortedRecord = SortedRecord structure Strid = Strid structure Symbol = Symbol end local open CoreML in structure Con = Con structure Dec = Dec structure Exp = Exp structure Pat = Pat structure Tycon = Tycon structure Tyvar = Tyvar structure Var = Var end local open Tycon in structure AdmitsEquality = AdmitsEquality structure Kind = Kind structure Symbol = Symbol end local open TypeEnv in structure Scheme = Scheme structure Type = Type end structure Decs = Decs (structure CoreML = CoreML) structure Tycon = struct open Tycon val admitsEquality = TypeEnv.tyconAdmitsEquality end structure Type = struct open Type fun bracket l = let open Layout in seq [str "[", l, str "]"] end fun explainDoesNotAdmitEquality (t: t): Layout.t = let open Layout val wild = (str "_", ({isChar = false}, Tycon.BindingStrength.unit)) fun con (c, ts) = let fun keep {showInside: bool} = Tycon.layoutApp (c, Vector.map (ts, fn t => if showInside then case t of NONE => wild | SOME t => t else wild)) datatype z = datatype AdmitsEquality.t in case ! (Tycon.admitsEquality c) of Always => NONE | Never => SOME (bracket (#1 (keep {showInside = false})), ({isChar = false}, Tycon.BindingStrength.unit)) | Sometimes => if Vector.exists (ts, Option.isSome) then SOME (keep {showInside = true}) else NONE end fun record r = if SortedRecord.forall (r, Option.isNone) then NONE else SOME (case SortedRecord.detupleOpt r of NONE => let val v = SortedRecord.toVector r val ending = if SortedRecord.exists (r, Option.isNone) then ", ...}" else "}" in (seq [str "{", mayAlign (separateRight (Vector.foldr (v, [], fn ((f, z), ac) => case z of NONE => ac | SOME (z, _) => seq [Field.layout f, str ": ", z] :: ac), ",")), str ending], ({isChar = false}, Tycon.BindingStrength.unit)) end | SOME v => Tycon.layoutApp (Tycon.tuple, Vector.map (v, fn NONE => wild | SOME t => t))) val exp = hom (t, {con = con, expandOpaque = false, record = record, replaceSynonyms = false, var = fn _ => NONE}) in case exp of NONE => str "???" | SOME (exp, _) => exp end end structure Scheme = struct open Scheme fun explainDoesNotAdmitEquality (s: t): Layout.t = Type.explainDoesNotAdmitEquality (ty s) end val insideFunctor = ref false fun amInsideFunctor () = !insideFunctor structure Scope = struct structure Unique = UniqueId () datatype t = T of {isTop: bool, unique: Unique.t} local fun make f (T r) = f r in val isTop = make #isTop val unique = make #unique end fun new {isTop: bool}: t = T {isTop = isTop, unique = Unique.new ()} fun equals (s, s') = Unique.equals (unique s, unique s') end structure Uses: sig type 'a t val add: 'a t * 'a -> unit val all: 'a t -> 'a list val clear: 'a t -> unit val forceUsed: 'a t -> unit val hasUse: 'a t -> bool val isUsed: 'a t -> bool val new: unit -> 'a t end = struct datatype 'a t = T of {direct: 'a list ref, forceUsed: bool ref} fun new () = T {direct = ref [], forceUsed = ref false} fun add (T {direct, ...}, a) = List.push (direct, a) fun forceUsed (T {forceUsed = r, ...}) = r := true fun clear (T {direct, ...}) = direct := [] fun all (T {direct, ...}) = !direct fun hasUse (T {direct, ...}): bool = not (List.isEmpty (!direct)) fun isUsed (u as T {forceUsed, ...}): bool = !forceUsed orelse hasUse u end structure Class = struct datatype t = Bas | Con | Exn | Fix | Fct | Sig | Str | Typ | Var val toString = fn Bas => "basis" | Con => "constructor" | Exn => "exception" | Fix => "fixity" | Fct => "functor" | Sig => "signature" | Str => "structure" | Typ => "type" | Var => "variable" end structure Vid = struct datatype t = Con of Con.t | Exn of Con.t | Overload of Priority.t * (Var.t * Scheme.t option) vector | Var of Var.t val statusPretty = fn Con _ => "constructor" | Exn _ => "exception" | Overload _ => "overload" | Var _ => "variable" val bogus = Var Var.bogus fun layout vid = let open Layout val (name, l) = case vid of Con c => ("Con", Con.layout c) | Exn c => ("Exn", Con.layout c) | Overload (p,xts) => (concat ["Overload (", Layout.toString (Priority.layout p), ")"], Vector.layout (Layout.tuple2 (Var.layout, Option.layout Scheme.layout)) xts) | Var v => ("Var", Var.layout v) in paren (seq [str name, str " ", l]) end val deVar = fn Var v => SOME v | _ => NONE val deCon = fn Con c => SOME c | Exn c => SOME c | _ => NONE val class = fn Con _ => Class.Con | Exn _ => Class.Exn | Overload _ => Class.Var | Var _ => Class.Var end structure TypeStr = struct structure AdmitsEquality = AdmitsEquality structure Kind = Kind structure Tycon = Tycon structure Cons = struct datatype t = T of {con: Con.t, name: Ast.Con.t, scheme: Scheme.t, uses: Ast.Vid.t Uses.t} vector fun layout (T v) = Vector.layout (fn {name, scheme, ...} => let open Layout in seq [Ast.Con.layout name, str ": ", Scheme.layout scheme] end) v end datatype node = Datatype of {cons: Cons.t, tycon: Tycon.t} | Scheme of Scheme.t | Tycon of Tycon.t datatype t = T of {kind: Kind.t, node: node} local fun make f (T r) = f r in val kind = make #kind val node = make #node end fun layout t = let open Layout in case node t of Datatype {tycon, cons} => seq [str "Datatype ", record [("tycon", Tycon.layout tycon), ("cons", Cons.layout cons)]] | Scheme s => Scheme.layout s | Tycon t => seq [str "Tycon ", Tycon.layout t] end fun admitsEquality (s: t): AdmitsEquality.t = case node s of Datatype {tycon = c, ...} => ! (Tycon.admitsEquality c) | Scheme s => if Scheme.admitsEquality s then AdmitsEquality.Sometimes else AdmitsEquality.Never | Tycon c => ! (Tycon.admitsEquality c) fun explainDoesNotAdmitEquality (s: t): Layout.t = let open Layout in case node s of Datatype {cons = Cons.T v, ...} => align (Vector.toList (Vector.keepAllMap (v, fn {name, scheme, ...} => case (Type.deArrowOpt (#instance (Scheme.instantiate scheme))) of NONE => NONE | SOME (arg, _) => if Type.admitsEquality arg then NONE else SOME (seq [Ast.Con.layout name, str " of ", Type.explainDoesNotAdmitEquality arg])))) | Scheme s => Scheme.explainDoesNotAdmitEquality s | Tycon c => Tycon.layout c end fun abs t = case node t of Datatype {tycon, ...} => T {kind = kind t, node = Tycon tycon} | _ => t fun apply (t: t, tys: Type.t vector): Type.t = case node t of Datatype {tycon, ...} => Type.con (tycon, tys) | Scheme s => Scheme.apply (s, tys) | Tycon t => Type.con (t, tys) fun data (tycon, kind, cons) = T {kind = kind, node = Datatype {tycon = tycon, cons = cons}} fun def (s: Scheme.t, k: Kind.t) = let val (tyvars, ty) = Scheme.dest s in T {kind = k, node = (case Type.deEta (ty, tyvars) of NONE => Scheme s | SOME c => Tycon c)} end fun toTyconOpt s = case node s of Datatype {tycon, ...} => SOME tycon | Scheme _ => NONE | Tycon c => SOME c fun tycon (c, kind) = T {kind = kind, node = Tycon c} end local open TypeStr in structure Cons = Cons end structure Interface = Interface (structure Ast = Ast structure EnvTypeStr = TypeStr) local open Interface in structure FlexibleTycon = FlexibleTycon structure Status = Status structure TyconMap = TyconMap end structure Interface = struct structure Econs = Cons structure Escheme = Scheme structure Etype = Type structure EtypeStr = TypeStr open Interface fun flexibleTyconToEnv (c: FlexibleTycon.t): EtypeStr.t option = let datatype z = datatype FlexibleTycon.realization in case FlexibleTycon.realization c of ETypeStr s => s | TypeStr s => typeStrToEnv s end and tyconToEnv (t: Tycon.t): EtypeStr.t option = let open Tycon in case t of Flexible c => flexibleTyconToEnv c | Rigid (c, k) => SOME (EtypeStr.tycon (c, k)) end and typeToEnv (t: Type.t): Etype.t option = Exn.withEscape (fn escape => SOME (Type.hom (t, {con = fn (c, ts) => (case tyconToEnv c of NONE => escape NONE | SOME s => EtypeStr.apply (s, ts)), record = Etype.record, var = Etype.var}))) and schemeToEnv (Scheme.T {ty, tyvars}): Escheme.t option = Exn.withEscape (fn escape => SOME (Escheme.make {canGeneralize = true, ty = (case typeToEnv ty of NONE => escape NONE | SOME ty => ty), tyvars = tyvars})) and consToEnv (Cons.T v): Econs.t option = Exn.withEscape (fn escape => SOME (Econs.T (Vector.map (v, fn {name, scheme} => {con = Con.newNoname (), name = name, scheme = (case schemeToEnv scheme of NONE => escape NONE | SOME s => s), uses = Uses.new ()})))) and typeStrToEnv (s: TypeStr.t): EtypeStr.t option = let val k = TypeStr.kind s datatype z = datatype TypeStr.node in case TypeStr.node s of Datatype {cons, tycon} => let fun data c = Option.map (consToEnv cons, fn cs => EtypeStr.data (c, k, cs)) in case tycon of Tycon.Flexible c => (case flexibleTyconToEnv c of NONE => NONE | SOME typeStr => case EtypeStr.node typeStr of EtypeStr.Datatype {tycon, ...} => data tycon | EtypeStr.Tycon c => data c | _ => let open Layout in Error.bug (toString (seq [str "ElaborateEnv.Interface.typeStrToEnv", str "datatype ", TypeStr.layout s, str " realized with scheme ", EtypeStr.layout typeStr])) end) | Tycon.Rigid (c, _) => data c end | Scheme s => Option.map (schemeToEnv s, fn s => EtypeStr.def (s, k)) | Tycon c => Option.map (tyconToEnv c, EtypeStr.abs) end structure Tycon = struct open Tycon val fromEnv = Rigid end structure Type = struct open Type fun fromEnv (t: Etype.t): t = let fun con (c, ts) = Type.con (Tycon.fromEnv (c, Kind.Arity (Vector.length ts)), ts) in Etype.hom (t, {con = con, expandOpaque = false, record = record, replaceSynonyms = false, var = var}) end end structure Scheme = struct open Scheme val toEnv = schemeToEnv fun fromEnv (s: Escheme.t): t = let val (tyvars, ty) = Escheme.dest s in Scheme.T {ty = Type.fromEnv ty, tyvars = tyvars} end end structure Cons = struct open Cons fun fromEnv (Econs.T v): t = T (Vector.map (v, fn {name, scheme, ...} => {name = name, scheme = Scheme.fromEnv scheme})) end structure TypeStr = struct open TypeStr val toEnv = typeStrToEnv fun toEnvNoNone s = case toEnv s of NONE => EtypeStr.tycon (EtypeStr.Tycon.tuple, TypeStr.kind s) | SOME s => s fun fromEnv (s: EtypeStr.t) = let val kind = EtypeStr.kind s in case EtypeStr.node s of EtypeStr.Datatype {cons, tycon} => data (Tycon.fromEnv (tycon, kind), kind, Cons.fromEnv cons) | EtypeStr.Scheme s => def (Scheme.fromEnv s, kind) | EtypeStr.Tycon c => tycon (Tycon.fromEnv (c, kind), kind) end end end structure Status = struct open Status val pretty: t -> string = fn Con => "constructor" | Exn => "exception" | Var => "variable" end structure Time:> sig type t val >= : t * t -> bool val next: unit -> t end = struct type t = int val layout = Int.layout val op >= : t * t -> bool = op >= val c = Counter.new 0 fun next () = Counter.next c val next = Trace.trace ("ElaborateEnv.Time.next", Unit.layout, layout) next end structure Info = struct (* The array is sorted by domain element. *) datatype ('a, 'b) t = T of {domain: 'a, range: 'b, time: Time.t, uses: 'a Uses.t} array fun layout (layoutDomain, layoutRange) (T a) = Array.layout (fn {domain, range, ...} => Layout.tuple [layoutDomain domain, layoutRange range]) a fun foreach (T a, f) = Array.foreach (a, fn {domain, range, ...} => f (domain, range)) fun peek (T a, domain: 'a, toSymbol: 'a -> Symbol.t) = Option.map (BinarySearch.search (a, fn {domain = d, ...} => Symbol.compare (toSymbol domain, toSymbol d)), fn i => let val v as {uses, ...} = Array.sub (a, i) val _ = Uses.add (uses, domain) in v end) val map: ('a, 'b) t * ('b -> 'b) -> ('a, 'b) t = fn (T a, f) => T (Array.map (a, fn {domain, range, time, uses} => {domain = domain, range = f range, time = time, uses = uses})) val map2: ('a, 'b) t * ('a, 'b) t * ('b * 'b -> 'b) -> ('a, 'b) t = fn (T a, T a', f) => T (Array.map2 (a, a', fn ({domain, range = r, time, uses}, {range = r', ...}) => {domain = domain, range = f (r, r'), time = time, uses = uses})) end val allTycons: Tycon.t list ref = ref (List.map (Tycon.prims, #tycon)) val newTycons: (Tycon.t * Kind.t * Region.t) list ref = ref [] val newTycon: string * Kind.t * AdmitsEquality.t * Region.t -> Tycon.t = fn (s, k, a, r) => let val c = Tycon.fromString s val _ = TypeEnv.initAdmitsEquality (c, a) val _ = TypeEnv.tyconRegion c := SOME r val _ = List.push (allTycons, c) val _ = List.push (newTycons, (c, k, r)) in c end fun foreach2Sorted (abs: ('a * 'b) array, info: ('a, 'c) Info.t, equals: ('a * 'a -> bool), f: ('a * 'b * (int * 'c) option -> unit)): unit = let val Info.T acs = info val _ = Array.fold (abs, 0, fn ((a, b), i) => let fun find j = if j = Array.length acs then (i, NONE) else let val {domain = a', range = c, ...} = Array.sub (acs, j) in if equals (a, a') then (j + 1, SOME (j, c)) else find (j + 1) end val (i, co) = find i val () = f (a, b, co) in i end) in () end (* ------------------------------------------------- *) (* Structure *) (* ------------------------------------------------- *) structure Structure = struct datatype t = T of {interface: Interface.t option, plist: PropertyList.t, strs: (Ast.Strid.t, t) Info.t, types: (Ast.Tycon.t, TypeStr.t) Info.t, vals: (Ast.Vid.t, Vid.t * Scheme.t option) Info.t} local fun make f (T r) = f r in val interface = make #interface val plist = make #plist end fun eq (s: t, s': t): bool = PropertyList.equals (plist s, plist s') local fun make (field, toSymbol) (T fields, domain) = Info.peek (field fields, domain, toSymbol) in val peekStrid' = make (#strs, Ast.Strid.toSymbol) val peekVid' = make (#vals, Ast.Vid.toSymbol) val peekTycon' = make (#types, Ast.Tycon.toSymbol) end fun peekStrid z = Option.map (peekStrid' z, #range) fun peekTycon z = Option.map (peekTycon' z, #range) fun peekVid z = Option.map (peekVid' z, #range) local fun make (from, de) (S, x) = case peekVid (S, from x) of NONE => NONE | SOME (vid, s) => Option.map (de vid, fn z => (z, s)) in val peekCon = make (Ast.Vid.fromCon, Vid.deCon) val peekVar = make (Ast.Vid.fromVar, Vid.deVar) end fun layout (T {strs, vals, types, ...}) = Layout.record [("types", Info.layout (Ast.Tycon.layout, TypeStr.layout) types), ("vals", (Info.layout (Ast.Vid.layout, Layout.tuple2 (Vid.layout, Option.layout Scheme.layout)) vals)), ("strs", Info.layout (Strid.layout, layout) strs)] local datatype handleUses = Clear | Force fun make handleUses = let fun loop (T f) = let fun doit (sel, forceRange) = let val Info.T a = sel f in Array.foreach (a, fn {range, uses, ...} => let val _ = case handleUses of Clear => Uses.clear uses | Force => Uses.forceUsed uses val _ = forceRange range in () end) end val _ = doit (#strs, loop) val _ = doit (#types, ignore) val _ = doit (#vals, ignore) in () end in loop end in val forceUsed = make Force end fun realize (S: t, tm: 'a TyconMap.t, f: (Ast.Tycon.t * 'a * TypeStr.t option * {nest: Strid.t list}) -> unit): unit = let fun allNone (TyconMap.T {strs, types}, nest) = (Array.foreach (strs, fn (name, tm) => allNone (tm, name :: nest)) ; Array.foreach (types, fn (name, flex) => f (name, flex, NONE, {nest = nest}))) fun loop (TyconMap.T {strs, types}, T {strs = strs', types = types', ...}, nest: Strid.t list) = let val () = foreach2Sorted (strs, strs', Ast.Strid.equals, fn (name, tm, S) => case S of NONE => allNone (tm, nest) | SOME (_, S) => loop (tm, S, name :: nest)) val () = foreach2Sorted (types, types', Ast.Tycon.equals, fn (name, flex, opt) => f (name, flex, Option.map (opt, #2), {nest = nest})) in () end in loop (tm, S, []) end local open Layout in fun layouts ({showUsed: bool}, interfaceSigid: Interface.t -> Sigid.t option) = let fun layoutTypeSpec (n, s) = layoutTypeSpec' (Ast.Tycon.layout n, s, {isWhere = false}) and layoutTypeSpec' (name: Layout.t, s, {isWhere: bool}) = let val {destroy, lay} = Type.makeLayoutPretty {expandOpaque = false, localTyvarNames = true} val lay = #1 o lay val tyvars = case TypeStr.kind s of Kind.Arity n => Vector.tabulate (n, fn _ => Type.var (Tyvar.newNoname {equality = false})) | Kind.Nary => Vector.new0 () val args = case Vector.length tyvars of 0 => empty | 1 => seq [lay (Vector.sub (tyvars, 0)), str " "] | _ => seq [paren (seq (separateRight (Vector.toList (Vector.map (tyvars, lay)), ", "))), str " "] val t = if isWhere then "type" else (case TypeStr.node s of TypeStr.Datatype _ => "datatype" | _ => let datatype z = datatype AdmitsEquality.t in case TypeStr.admitsEquality s of Always => "eqtype" | Never => "type" | Sometimes => "eqtype" end) val def = seq [str t, str " ", args, name, str " = "] val res = case TypeStr.node s of TypeStr.Datatype {cons = Cons.T cs, tycon} => if isWhere then seq [def, lay (Type.con (tycon, tyvars))] else let val cs = Vector.toListMap (cs, fn {name, scheme, ...} => seq [Ast.Con.layout name, case (Type.deArrowOpt (Scheme.apply (scheme, tyvars))) of NONE => empty | SOME (t, _) => seq [str " of ", lay t]]) in seq [def, alignPrefix (cs, "| ")] end | TypeStr.Scheme s => seq [def, lay (Scheme.apply (s, tyvars))] | TypeStr.Tycon c => seq [def, lay (Type.con (c, tyvars))] val _ = destroy () in res end fun layoutValSpec (d: Ast.Vid.t, (vid, scheme))= let fun simple s = seq [str s, str " ", Ast.Vid.layout d, if Ast.Vid.isSymbolic d then str " " else empty, str ": ", case scheme of NONE => str "" | SOME s => Scheme.layoutPretty s] datatype z = datatype Vid.t in case vid of Con _ => NONE | Exn c => SOME (seq [str "exception ", Con.layout c, case scheme of NONE => str " of " | SOME s => case Type.deArrowOpt (Scheme.ty s) of NONE => empty | SOME (t, _) => seq [str " of ", Type.layoutPretty t]]) | Overload _ => SOME (simple "val") | Var _ => SOME (simple "val") end fun layoutStrSpec (d: Strid.t, r) = let val (l, {messy}) = layoutAbbrev r val bind = seq [str "structure ", Strid.layout d, str ":"] in if messy then align [bind, indent (l, 3)] else seq [bind, str " ", l] end and layoutStr (T {strs, vals, types, ...}) = let fun doit (Info.T a, layout) = align (Array.foldr (a, [], fn ({domain, range, uses, ...}, ac) => if showUsed andalso not (Uses.hasUse uses) then ac else case layout (domain, range) of NONE => ac | SOME l => l :: ac)) in align [str "sig", indent (align [doit (types, SOME o layoutTypeSpec), doit (vals, layoutValSpec), doit (strs, SOME o layoutStrSpec)], 3), str "end"] end and layoutAbbrev (S as T {interface, ...}) = case if showUsed then NONE else (case interface of NONE => NONE | SOME I => let val I = Interface.original I in Option.map (interfaceSigid I, fn s => (s, I)) end) of NONE => (layoutStr S, {messy = true}) | SOME (s, I) => let val wheres = ref [] val () = realize (S, Interface.flexibleTycons I, fn (name, _, typeStr, {nest}) => case typeStr of NONE => Error.bug "ElaborateEnv.Structure.layoutAbbrev: missing typeStr" | SOME typeStr => List.push (wheres, seq [str "where ", layoutTypeSpec' (Ast.Longtycon.layout (Ast.Longtycon.long (rev nest, name)), typeStr, {isWhere = true})])) in (align (Sigid.layout s :: (rev (!wheres))), {messy = false}) end in {layoutAbbrev = layoutAbbrev, layoutStr = layoutStr, strSpec = layoutStrSpec, typeSpec = layoutTypeSpec, valSpec = layoutValSpec} end end fun layoutPretty S = #layoutStr (layouts ({showUsed = false}, fn _ => NONE)) S datatype 'a peekResult = Found of 'a | UndefinedStructure of Strid.t list fun peekStrids (S, strids) = let fun loop (S, strids, ac) = case strids of [] => Found S | strid :: strids => case peekStrid (S, strid) of NONE => UndefinedStructure (rev (strid :: ac)) | SOME S => loop (S, strids, strid :: ac) in loop (S, strids, []) end val ffi: t option ref = ref NONE end (* ------------------------------------------------- *) (* FunctorClosure *) (* ------------------------------------------------- *) structure FunctorClosure = struct datatype t = T of {apply: Structure.t * string list -> Decs.t * Structure.t option, arg: Strid.t, argInt: Interface.t, formal: Structure.t, result: Structure.t option} local fun make f (T r) = f r in val argInterface = make #argInt val result = make #result end fun layout _ = Layout.str "" fun apply (T {apply, ...}, S, nest) = apply (S, nest) val apply = Trace.trace3 ("ElaborateEnv.FunctorClosure.apply", layout, Structure.layout, List.layout String.layout, (Option.layout Structure.layout) o #2) apply end (* ------------------------------------------------- *) (* Basis *) (* ------------------------------------------------- *) structure Basis = struct datatype t = T of {plist: PropertyList.t, bass: (Ast.Basid.t, t) Info.t, fcts: (Ast.Fctid.t, FunctorClosure.t) Info.t, fixs: (Ast.Vid.t, Ast.Fixity.t) Info.t, sigs: (Ast.Sigid.t, Interface.t) Info.t, strs: (Ast.Strid.t, Structure.t) Info.t, types: (Ast.Tycon.t, TypeStr.t) Info.t, vals: (Ast.Vid.t, Vid.t * Scheme.t option) Info.t} fun layout (T {bass, fcts, sigs, strs, types, vals, ...}) = Layout.record [("bass", Info.layout (Ast.Basid.layout, layout) bass), ("fcts", Info.layout (Ast.Fctid.layout, FunctorClosure.layout) fcts), ("sigs", Info.layout (Ast.Sigid.layout, Interface.layout) sigs), ("strs", Info.layout (Ast.Strid.layout, Structure.layout) strs), ("types", Info.layout (Ast.Tycon.layout, TypeStr.layout) types), ("vals", (Info.layout (Ast.Vid.layout, Layout.tuple2 (Vid.layout, Option.layout Scheme.layout)) vals))] end (* ------------------------------------------------- *) (* NameSpace *) (* ------------------------------------------------- *) structure Values = struct type ('a, 'b) value = {domain: 'a, range: 'b, scope: Scope.t, time: Time.t, uses: 'a Uses.t} (* The domains of all elements in a values list have the same symbol. *) datatype ('a, 'b) t = T of ('a, 'b) value list ref fun new (): ('a, 'b) t = T (ref []) fun ! (T r) = Ref.! r fun pop (T r) = List.pop r end structure NameSpace = struct datatype ('a, 'b) t = T of {class: 'b -> Class.t, current: ('a, 'b) Values.t list ref, defUses: {class: Class.t, def: 'a, range: 'b list, uses: 'a Uses.t} list ref, lookup: 'a -> ('a, 'b) Values.t, region: 'a -> Region.t, toSymbol: 'a -> Symbol.t} fun values (T {lookup, ...}, a) = lookup a fun new {class, lookup, region, toSymbol} = T {class = class, current = ref [], defUses = ref [], lookup = lookup, region = region, toSymbol = toSymbol} fun newUses (T {defUses, ...}, class, def, range) = let val u = Uses.new () val _ = if !Control.keepDefUse then List.push (defUses, {class = class, def = def, range = range, uses = u}) else () in u end fun ('a, 'b) peek (ns, a: 'a, {markUse: 'b -> bool}) : 'b option = case Values.! (values (ns, a)) of [] => NONE | {range, uses, ...} :: _ => (if markUse range then Uses.add (uses, a) else () ; SOME range) fun collect (T {current, toSymbol, ...}: ('a, 'b) t) : unit -> ('a, 'b) Info.t = let val old = !current val _ = current := [] in fn () => let val elts = List.revMap (!current, fn values => let val {domain, range, time, uses, ...} = Values.pop values in {domain = domain, range = range, time = time, uses = uses} end) val _ = current := old val a = Array.fromList elts val () = QuickSort.sortArray (a, fn ({domain = d, ...}, {domain = d', ...}) => Symbol.<= (toSymbol d, toSymbol d')) in Info.T a end end end (*---------------------------------------------------*) (* Main Env Datatype *) (*---------------------------------------------------*) structure All = struct datatype t = Bas of (Basid.t, Basis.t) Values.t | Fct of (Fctid.t, FunctorClosure.t) Values.t | Fix of (Ast.Vid.t, Ast.Fixity.t) Values.t | Sig of (Sigid.t, Interface.t) Values.t | Str of (Strid.t, Structure.t) Values.t | Tyc of (Ast.Tycon.t, TypeStr.t) Values.t | Val of (Ast.Vid.t, Vid.t * Scheme.t option) Values.t val basOpt = fn Bas z => SOME z | _ => NONE val fctOpt = fn Fct z => SOME z | _ => NONE val fixOpt = fn Fix z => SOME z | _ => NONE val sigOpt = fn Sig z => SOME z | _ => NONE val strOpt = fn Str z => SOME z | _ => NONE val tycOpt = fn Tyc z => SOME z | _ => NONE val valOpt = fn Val z => SOME z | _ => NONE end datatype t = T of {currentScope: Scope.t ref, bass: (Ast.Basid.t, Basis.t) NameSpace.t, fcts: (Ast.Fctid.t, FunctorClosure.t) NameSpace.t, fixs: (Ast.Vid.t, Ast.Fixity.t) NameSpace.t, interface: {strs: (Ast.Strid.t, Interface.t) NameSpace.t, types: (Ast.Tycon.t, Interface.TypeStr.t) NameSpace.t, vals: (Ast.Vid.t, Interface.Status.t * Interface.Scheme.t) NameSpace.t}, lookup: Symbol.t -> All.t list ref, maybeAddTop: Symbol.t -> unit, sigs: (Ast.Sigid.t, Interface.t) NameSpace.t, strs: (Ast.Strid.t, Structure.t) NameSpace.t, (* topSymbols is a list of all symbols that are defined at * the top level (in any namespace). *) topSymbols: Symbol.t list ref, types: (Ast.Tycon.t, TypeStr.t) NameSpace.t, vals: (Ast.Vid.t, Vid.t * Scheme.t option) NameSpace.t} fun sizeMessage (E: t): Layout.t = let val size = MLton.size open Layout in record [("total", Int.layout (size E))] end (* quell unused warning *) val _ = sizeMessage fun empty () = let val {get = lookupAll: Symbol.t -> All.t list ref, ...} = Property.get (Symbol.plist, Property.initFun (fn _ => ref [])) val topSymbols = ref [] val {get = maybeAddTop: Symbol.t -> unit, ...} = Property.get (Symbol.plist, Property.initFun (fn s => List.push (topSymbols, s))) fun ('a, 'b) make (class: 'b -> Class.t, region: 'a -> Region.t, toSymbol: 'a -> Symbol.t, extract: All.t -> ('a, 'b) Values.t option, make: ('a, 'b) Values.t -> All.t) : ('a, 'b) NameSpace.t = let fun lookup (a: 'a): ('a, 'b) Values.t = let val r = lookupAll (toSymbol a) in case List.peekMap (!r, extract) of NONE => let val v = Values.new () val _ = List.push (r, make v) in v end | SOME v => v end in NameSpace.new {class = class, lookup = lookup, region = region, toSymbol = toSymbol} end val bass = make (fn _ => Class.Bas, Basid.region, Basid.toSymbol, All.basOpt, All.Bas) val fcts = make (fn _ => Class.Fct, Fctid.region, Fctid.toSymbol, All.fctOpt, All.Fct) val fixs = make (fn _ => Class.Fix, Ast.Vid.region, Ast.Vid.toSymbol, All.fixOpt, All.Fix) val sigs = make (fn _ => Class.Sig, Sigid.region, Sigid.toSymbol, All.sigOpt, All.Sig) val strs = make (fn _ => Class.Str, Strid.region, Strid.toSymbol, All.strOpt, All.Str) val types = make (fn _ => Class.Typ, Ast.Tycon.region, Ast.Tycon.toSymbol, All.tycOpt, All.Tyc) val vals = make (Vid.class o #1, Ast.Vid.region, Ast.Vid.toSymbol, All.valOpt, All.Val) local val {get = lookupAll: (Symbol.t -> {strs: (Strid.t, Interface.t) Values.t, types: (Ast.Tycon.t, Interface.TypeStr.t) Values.t, vals: (Ast.Vid.t, Status.t * Interface.Scheme.t) Values.t}), ...} = Property.get (Symbol.plist, Property.initFun (fn _ => {strs = Values.new (), types = Values.new (), vals = Values.new ()})) fun make (sel, class, region, toSymbol: 'a -> Symbol.t) : ('a, 'b) NameSpace.t = NameSpace.new {class = fn _ => class, lookup = sel o lookupAll o toSymbol, region = region, toSymbol = toSymbol} in val interface = {strs = make (#strs, Class.Str, Strid.region, Strid.toSymbol), types = make (#types, Class.Typ, Ast.Tycon.region, Ast.Tycon.toSymbol), vals = make (#vals, Class.Var, Ast.Vid.region, Ast.Vid.toSymbol)} end in T {currentScope = ref (Scope.new {isTop = true}), bass = bass, fcts = fcts, fixs = fixs, interface = interface, lookup = lookupAll, maybeAddTop = maybeAddTop, sigs = sigs, strs = strs, topSymbols = topSymbols, types = types, vals = vals} end local fun foreach (T {lookup, ...}, s, {bass, fcts, fixs, sigs, strs, types, vals}) = List.foreach (! (lookup s), fn a => let datatype z = datatype All.t in case a of Bas vs => bass vs | Fct vs => fcts vs | Fix vs => fixs vs | Sig vs => sigs vs | Str vs => strs vs | Tyc vs => types vs | Val vs => vals vs end) in fun foreachDefinedSymbol (E, z) = Symbol.foreach (fn s => foreach (E, s, z)) fun foreachTopLevelSymbol (E as T {topSymbols, ...}, z) = List.foreach (!topSymbols, fn s => foreach (E, s, z)) end fun collect (E, keep: {hasUse: bool, scope: Scope.t} -> bool, le: {domain: Symbol.t, time: Time.t} * {domain: Symbol.t, time: Time.t} -> bool) = let val bass = ref [] val fcts = ref [] val sigs = ref [] val strs = ref [] val types = ref [] val vals = ref [] fun doit ac vs = case Values.! vs of [] => () | (z as {scope, uses, ...}) :: _ => if keep {hasUse = Uses.hasUse uses, scope = scope} then List.push (ac, z) else () val _ = foreachDefinedSymbol (E, {bass = doit bass, fcts = doit fcts, fixs = fn _ => (), sigs = doit sigs, strs = doit strs, types = doit types, vals = doit vals}) fun ('a, 'b) finish (r, toSymbol: 'a -> Symbol.t) = let val a = Array.fromList (!r) val () = QuickSort.sortArray (a, fn ({domain = d, time = t, ...}: ('a, 'b) Values.value, {domain = d', time = t',...}: ('a, 'b) Values.value) => le ({domain = toSymbol d, time = t}, {domain = toSymbol d', time = t'})) in a end in {bass = finish (bass, Basid.toSymbol), fcts = finish (fcts, Fctid.toSymbol), sigs = finish (sigs, Sigid.toSymbol), strs = finish (strs, Strid.toSymbol), types = finish (types, Ast.Tycon.toSymbol), vals = finish (vals, Ast.Vid.toSymbol)} end fun setTyconNames (E as T {currentScope, ...}): unit = let val {get = shortest: Tycon.t -> int option ref, ...} = Property.get (Tycon.plist, Property.initFun (fn _ => ref NONE)) fun doType (typeStr: TypeStr.t, name: Ast.Tycon.t, length: int, strids: Strid.t list): unit = case TypeStr.toTyconOpt typeStr of NONE => () | SOME c => let val r = shortest c in if isSome (!r) andalso length >= valOf (!r) then () else let val _ = r := SOME length val name = Pretty.longid (List.map (strids, Strid.layout), Ast.Tycon.layout name) in Tycon.setPrintName (c, Layout.toString name) end end val {get = strShortest: Structure.t -> int option ref, ...} = Property.get (Structure.plist, Property.initFun (fn _ => ref NONE)) fun loopStr (s as Structure.T {strs, types, ...}, length: int, strids: Strid.t list) : unit = let val r = strShortest s in if isSome (!r) andalso length >= valOf (!r) then () else (r := SOME length ; Info.foreach (types, fn (name, typeStr) => doType (typeStr, name, length, strids)) ; Info.foreach (strs, fn (strid, str) => loopStr (str, 1 + length, strids @ [strid]))) end (* Sort the declarations in decreasing order of definition time so that * later declarations will be processed first, and hence will take * precedence. *) val {strs, types, ...} = collect (E, fn _ => true, fn ({time = t, ...}, {time = t', ...}) => Time.>= (t, t')) val _ = Array.foreach (types, fn {domain = name, range = typeStr, ...} => doType (typeStr, name, 0, [])) val _ = Array.foreach (strs, fn {domain = strid, range = str, ...} => loopStr (str, 1, [strid])) val _ = if Scope.isTop (!currentScope) then () else List.foreach (!allTycons, fn c => if isSome (! (shortest c)) then () else Tycon.setPrintName (c, concat ["?.", Tycon.originalName c])) in () end fun dummyStructure (I: Interface.t, {prefix: string}) : Structure.t * (Structure.t * (Tycon.t * TypeStr.t -> unit) -> unit) = let val time = Time.next () val I = Interface.copy I fun realize (TyconMap.T {strs, types}, nest) = let val strs = Array.map (strs, fn (name, tm) => (name, realize (tm, name :: nest))) val types = Array.map (types, fn (tycon, flex) => let val {admitsEquality = a, kind = k, ...} = FlexibleTycon.dest flex val name = concat (prefix :: (List.fold (nest, [Ast.Tycon.toString tycon], fn (s, ss) => Strid.toString s :: "." :: ss))) val c = newTycon (name, k, a, Ast.Tycon.region tycon) val () = FlexibleTycon.realize (flex, SOME (TypeStr.tycon (c, k))) in (tycon, c) end) in TyconMap.T {strs = strs, types = types} end val flexible = realize (Interface.flexibleTycons I, []) val {get, ...} = Property.get (Interface.plist, Property.initRec (fn (I, get) => let val {strs, types, vals} = Interface.dest I val strs = Array.map (strs, fn (name, I) => {domain = name, range = get I, time = time, uses = Uses.new ()}) val types = Array.map (types, fn (name, s) => {domain = name, range = Interface.TypeStr.toEnvNoNone s, time = time, uses = Uses.new ()}) val vals = Array.map (vals, fn (name, (status, scheme)) => let val con = CoreML.Con.newString o Ast.Vid.toString val var = CoreML.Var.newString o Ast.Vid.toString val vid = case status of Status.Con => Vid.Con (con name) | Status.Exn => Vid.Exn (con name) | Status.Var => Vid.Var (var name) in {domain = name, range = (vid, Interface.Scheme.toEnv scheme), time = time, uses = Uses.new ()} end) in Structure.T {interface = SOME I, plist = PropertyList.new (), strs = Info.T strs, types = Info.T types, vals = Info.T vals} end)) val S = get I fun instantiate (S, f) = Structure.realize (S, flexible, fn (_, c, so, _) => case so of NONE => Error.bug "ElaborateEnv.dummyStructure.instantiate" | SOME s => f (c, s)) in (S, instantiate) end val dummyStructure = Trace.trace ("ElaborateEnv.dummyStructure", Interface.layout o #1, Structure.layoutPretty o #1) dummyStructure fun layout' (E: t, keep, showUsed): Layout.t = let val _ = setTyconNames E val {bass, fcts, sigs, strs, types, vals} = collect (E, keep, fn ({domain = d, ...}, {domain = d', ...}) => Symbol.<= (d, d')) open Layout fun doit (a, layout) = align (Array.toListMap (a, layout)) val {get = interfaceSigid: Interface.t -> Sigid.t option, set = setInterfaceSigid, ...} = Property.getSet (Interface.plist, Property.initConst NONE) val _ = Array.foreach (sigs, fn {domain = s, range = I, ...} => setInterfaceSigid (I, SOME s)) val {strSpec, typeSpec, valSpec, ...} = Structure.layouts (showUsed, interfaceSigid) val {layoutAbbrev, layoutStr, ...} = Structure.layouts ({showUsed = false}, interfaceSigid) val bass = doit (bass, fn {domain = basid, ...} => seq [str "basis ", Basid.layout basid, str " = "]) val sigs = doit (sigs, fn {domain = sigid, range = I, ...} => let val (S, _) = dummyStructure (I, {prefix = "?."}) in align [seq [str "signature ", Sigid.layout sigid, str " = "], indent (layoutStr S, 3)] end) val fcts = doit (fcts, fn {domain, range = FunctorClosure.T {arg, formal, result, ...}, ...} => align [seq [str "functor ", Fctid.layout domain, str " ", paren (seq [Strid.layout arg, str ": ", #1 (layoutAbbrev formal)])], case result of NONE => empty | SOME S => indent (seq [str ": ", #1 (layoutAbbrev S)], 3)]) val vals = align (Array.foldr (vals, [], fn ({domain, range, ...}, ac) => case valSpec (domain, range) of NONE => ac | SOME l => l :: ac)) val types = doit (types, fn {domain, range, ...} => typeSpec (domain, range)) val strs = doit (strs, fn {domain, range, ...} => strSpec (domain, range)) in align [types, vals, strs, fcts, sigs, bass] end fun layout E = layout' (E, fn _ => true, {showUsed = false}) fun layoutCurrentScope (E as T {currentScope, ...}) = let val s = !currentScope in layout' (E, fn {scope, ...} => Scope.equals (s, scope), {showUsed = false}) end fun layoutUsed (E: t): Layout.t = layout' (E, #hasUse, {showUsed = true}) (* Force everything that is currently in scope to be marked as used. *) fun forceUsed E = let fun doit forceRange (Values.T r) = case !r of [] => () | {uses, range, ...} :: _ => (Uses.forceUsed uses ; forceRange range) val _ = foreachDefinedSymbol (E, {bass = doit ignore, fcts = doit (fn f => Option.app (FunctorClosure.result f, Structure.forceUsed)), fixs = doit ignore, sigs = doit ignore, strs = doit Structure.forceUsed, types = doit ignore, vals = doit ignore}) in () end fun processDefUse (E as T f) = let val _ = setTyconNames E val _ = forceUsed E val all: {class: Class.t, def: Layout.t, extra: Layout.t list, isUsed: bool, region: Region.t, uses: Region.t list} list ref = ref [] fun doit (sel, mkExtra) = let val NameSpace.T {defUses, region, toSymbol, ...} = sel f in List.foreach (!defUses, fn {class, def, uses, range, ...} => List.push (all, {class = class, def = Symbol.layout (toSymbol def), extra = mkExtra range, isUsed = Uses.isUsed uses, region = region def, uses = List.fold (Uses.all uses, [], fn (u, ac) => region u :: ac)})) end val _ = doit (#fcts, fn _ => []) val _ = doit (#sigs, fn _ => []) val _ = doit (#strs, fn _ => []) val _ = doit (#types, fn _ => []) local fun mkExtraFromSchemes l = List.keepAllMap (l, fn (_, s) => Option.map (s, Type.layoutPretty o Scheme.ty)) in val _ = doit (#vals, mkExtraFromSchemes) end val a = Array.fromList (!all) val _ = QuickSort.sortArray (a, fn ({region = r, ...}, {region = r', ...}) => Region.<= (r, r')) val l = Array.foldr (a, [], fn (z as {class, def, extra, isUsed, region, uses}, ac) => case ac of [] => [z] | {extra = e', isUsed = i', region = r', uses = u', ...} :: ac' => if Region.equals (region, r') then {class = class, def = def, extra = extra @ e', isUsed = isUsed orelse i', region = region, uses = uses @ u'} :: ac' else z :: ac) val _ = List.foreach (l, fn {class, def, isUsed, region, ...} => if isUsed orelse Option.isNone (Region.left region) then () else let open Layout in Control.warning (region, seq [str (concat ["unused ", Class.toString class, ": "]), def], empty) end) val _ = case !Control.showDefUse of NONE => () | SOME f => File.withOut (f, fn out => List.foreach (l, fn {class, def, extra, region, uses, ...} => case Region.left region of NONE => () | SOME p => let val uses = Array.fromList uses val _ = QuickSort.sortArray (uses, Region.<=) val uses = Array.foldr (uses, [], fn (r, ac) => case ac of [] => [r] | r' :: _ => if Region.equals (r, r') then ac else r :: ac) open Layout in outputl (align [seq [str (Class.toString class), str " ", def, str " ", str (SourcePos.toString p), case extra of [] => empty | ss => let val ts = List.map (ss, toString) val uts = List.map (List.equivalence (ts, String.equals), hd) val sts = List.insertionSort (uts, fn (l, r) => size l < size r orelse size l = size r andalso l < r) in str (concat (" \"" :: List.separate (sts, " andalso ") @ ["\""])) end], indent (align (List.map (uses, fn r => str (case Region.left r of NONE => "NONE" | SOME p => SourcePos.toString p))), 4)], out) end)) in () end fun newCons (T {vals, ...}, v) = fn v' => let val forceUsed = 1 = Vector.length v in Cons.T (Vector.map2 (v, v', fn ({con, name}, scheme) => let val uses = NameSpace.newUses (vals, Class.Con, Ast.Vid.fromCon name, if isSome (!Control.showDefUse) then [(Vid.Con con, SOME scheme)] else []) val () = if not (warnUnused ()) orelse forceUsed then Uses.forceUsed uses else () in {con = con, name = name, scheme = scheme, uses = uses} end)) end (* ------------------------------------------------- *) (* peek *) (* ------------------------------------------------- *) local fun make sel (T r, a) = NameSpace.peek (sel r, a, {markUse = fn _ => true}) in val peekBasid = make #bass val peekFctid = make #fcts val peekFix = make #fixs val peekSigid = make #sigs val peekStrid = make #strs val peekTycon = make #types val peekVid = make #vals fun peekVar (E, x) = case peekVid (E, Ast.Vid.fromVar x) of NONE => NONE | SOME (vid, s) => Option.map (Vid.deVar vid, fn x => (x, s)) end fun peekCon (T {vals, ...}, c: Ast.Con.t): (Con.t * Scheme.t option) option = case NameSpace.peek (vals, Ast.Vid.fromCon c, {markUse = fn (vid, _) => isSome (Vid.deCon vid)}) of NONE => NONE | SOME (vid, s) => Option.map (Vid.deCon vid, fn c => (c, s)) fun layoutLong (ids: Layout.t list) = let open Layout in seq (separate (ids, ".")) end fun layoutStrids (ss: Strid.t list): Layout.t = layoutLong (List.map (ss, Strid.layout)) structure PeekResult = struct datatype 'a t = Found of 'a | UndefinedStructure of Strid.t list | Undefined fun map (r: 'a t, f: 'a -> 'b): 'b t = case r of Found a => Found (f a) | UndefinedStructure ss => UndefinedStructure ss | Undefined => Undefined val toOption: 'a t -> 'a option = fn Found z => SOME z | _ => NONE end local datatype z = datatype PeekResult.t fun make (split: 'a -> Strid.t list * 'b, peek: t * 'b -> 'c option, strPeek: Structure.t * 'b -> 'c option) (E, x) = let val (strids, x) = split x in case strids of [] => (case peek (E, x) of NONE => Undefined | SOME z => Found z) | strid :: strids => case peekStrid (E, strid) of NONE => UndefinedStructure [strid] | SOME S => case Structure.peekStrids (S, strids) of Structure.Found S => (case strPeek (S, x) of NONE => Undefined | SOME z => Found z) | Structure.UndefinedStructure ss => UndefinedStructure (strid :: ss) end in val peekLongstrid = make (Ast.Longstrid.split, peekStrid, Structure.peekStrid) val peekLongtycon = make (Longtycon.split, peekTycon, Structure.peekTycon) val peekLongvar = make (Ast.Longvar.split, peekVar, Structure.peekVar) val peekLongvid = make (Ast.Longvid.split, peekVid, Structure.peekVid) val peekLongcon = make (Ast.Longcon.split, peekCon, Structure.peekCon) end (* ------------------------------------------------- *) (* lookup *) (* ------------------------------------------------- *) fun unbound (r: Region.t, className, x: Layout.t): unit = Control.error (r, let open Layout in seq [str "undefined ", str className, str " ", x] end, Layout.empty) fun lookupBasid (E, x) = case peekBasid (E, x) of NONE => (unbound (Ast.Basid.region x, "basis", Ast.Basid.layout x) ; NONE) | SOME f => SOME f fun lookupFctid (E, x) = case peekFctid (E, x) of NONE => (unbound (Ast.Fctid.region x, "functor", Ast.Fctid.layout x) ; NONE) | SOME f => SOME f fun lookupSigid (E, x) = case peekSigid (E, x) of NONE => (unbound (Ast.Sigid.region x, "signature", Ast.Sigid.layout x) ; NONE) | SOME I => SOME I fun lookupStrid (E, x) = case peekStrid (E, x) of NONE => (unbound (Ast.Strid.region x, "structure", Ast.Strid.layout x) ; NONE) | SOME S => SOME S local fun make (peek: t * 'a -> 'b PeekResult.t, bogus: unit -> 'b, className: string, region: 'a -> Region.t, layout: 'a -> Layout.t) (E: t, x: 'a): 'b = let datatype z = datatype PeekResult.t in case peek (E, x) of Found z => z | UndefinedStructure ss => (unbound (region x, "structure", layoutStrids ss); bogus ()) | Undefined => (unbound (region x, className, layout x); bogus ()) end in val lookupLongcon = make (peekLongcon, fn () => (Con.bogus, NONE), "constructor", Ast.Longcon.region, Ast.Longcon.layout) val lookupLongstrid = make (fn (E, x) => PeekResult.map (peekLongstrid (E, x), SOME), fn () => NONE, "structure", Ast.Longstrid.region, Ast.Longstrid.layout) val lookupLongtycon = make (fn z => PeekResult.map (peekLongtycon z, SOME), fn () => NONE, "type", Ast.Longtycon.region, Ast.Longtycon.layout) val lookupLongvid = make (peekLongvid, fn () => (Vid.bogus, NONE), "variable", Ast.Longvid.region, Ast.Longvid.layout) val lookupLongvar = make (peekLongvar, fn () => (Var.bogus, NONE), "variable", Ast.Longvar.region, Ast.Longvar.layout) end val peekLongcon = PeekResult.toOption o peekLongcon (* ------------------------------------------------- *) (* extend *) (* ------------------------------------------------- *) structure ExtendUses = struct datatype 'a t = New | Old of 'a Uses.t | Rebind fun fromIsRebind {isRebind} = if isRebind then Rebind else New end val extend: t * ('a, 'b) NameSpace.t * {domain: 'a, forceUsed: bool, range: 'b, scope: Scope.t, time: Time.t, uses: 'a ExtendUses.t} -> unit = fn (T {maybeAddTop, ...}, ns as NameSpace.T {class, current, lookup, toSymbol, ...}, {domain, forceUsed, range, scope, time, uses}) => let fun newUses () = let val u = NameSpace.newUses (ns, class range, domain, if isSome (!Control.showDefUse) andalso (class range = Class.Var orelse class range = Class.Exn orelse class range = Class.Con) then [range] else []) val () = if not (warnUnused ()) orelse forceUsed then Uses.forceUsed u else () in u end val values as Values.T r = lookup domain datatype z = datatype ExtendUses.t fun new () = let val _ = List.push (current, values) val uses = case uses of New => newUses () | Old u => u | Rebind => Error.bug "ElaborateEnv.extend.rebind.new: Rebind" in {domain = domain, range = range, scope = scope, time = time, uses = uses} end in case !r of [] => let val _ = if Scope.isTop scope then maybeAddTop (toSymbol domain) else () in r := [new ()] end | all as ({scope = scope', uses = uses', ...} :: rest) => if Scope.equals (scope, scope') then let val uses = case uses of New => newUses () | Old u => u | Rebind => uses' in r := {domain = domain, range = range, scope = scope, time = time, uses = uses} :: rest end else r := new () :: all end local val extend = fn (E as T (fields as {currentScope, ...}), get, domain: 'a, range: 'b, forceUsed: bool, uses: 'a ExtendUses.t) => let val ns = get fields in extend (E, ns, {domain = domain, forceUsed = forceUsed, range = range, scope = !currentScope, time = Time.next (), uses = uses}) end in fun extendBasid (E, d, r) = extend (E, #bass, d, r, false, ExtendUses.New) fun extendFctid (E, d, r) = extend (E, #fcts, d, r, false, ExtendUses.New) fun extendFix (E, d, r) = extend (E, #fixs, d, r, false, ExtendUses.New) fun extendSigid (E, d, r) = extend (E, #sigs, d, r, false, ExtendUses.New) fun extendStrid (E, d, r) = extend (E, #strs, d, r, false, ExtendUses.New) fun extendVals (E, d, r, eu) = extend (E, #vals, d, r, false, eu) fun extendTycon (E, d, s, {forceUsed, isRebind}) = let val () = let datatype z = datatype TypeStr.node in case TypeStr.node s of Datatype {cons = Cons.T v , ...} => Vector.foreach (v, fn {con, name, scheme, uses} => extendVals (E, Ast.Vid.fromCon name, (Vid.Con con, SOME scheme), ExtendUses.Old uses)) | _ => () end val _ = extend (E, #types, d, s, forceUsed, ExtendUses.fromIsRebind {isRebind = isRebind}) in () end end fun extendExn (E, c, c', s) = extendVals (E, Ast.Vid.fromCon c, (Vid.Exn c', s), ExtendUses.New) fun extendVar (E, x, x', s, ir) = extendVals (E, Ast.Vid.fromVar x, (Vid.Var x', SOME s), ExtendUses.fromIsRebind ir) val extendVar = Trace.trace ("ElaborateEnv.extendVar", fn (_, x, x', s, _) => Layout.tuple [Ast.Var.layout x, Var.layout x', Scheme.layoutPretty s], Unit.layout) extendVar fun extendOverload (E, p, x, yts, s) = extendVals (E, Ast.Vid.fromVar x, (Vid.Overload (p, yts), SOME s), ExtendUses.New) (* ------------------------------------------------- *) (* local *) (* ------------------------------------------------- *) local fun doit (E: t, ns as NameSpace.T {current, ...}, s0) = let val old = !current val _ = current := [] in fn () => let val c1 = !current val _ = current := [] in fn () => let val c2 = !current val lift = List.revMap (c2, Values.pop) val _ = List.foreach (c1, fn v => ignore (Values.pop v)) val _ = current := old val _ = List.foreach (lift, fn {domain, range, time, uses, ...} => extend (E, ns, {domain = domain, forceUsed = false, range = range, scope = s0, time = time, uses = ExtendUses.Old uses})) in () end end end in fun localAll (E as T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}, f1, f2) = let val s0 = !currentScope val bass = doit (E, bass, s0) val fcts = doit (E, fcts, s0) val fixs = doit (E, fixs, s0) val sigs = doit (E, sigs, s0) val strs = doit (E, strs, s0) val types = doit (E, types, s0) val vals = doit (E, vals, s0) val _ = currentScope := Scope.new {isTop = true} val a1 = f1 () val bass = bass () val fcts = fcts () val fixs = fixs () val sigs = sigs () val strs = strs () val types = types () val vals = vals () val _ = currentScope := Scope.new {isTop = true} val a2 = f2 a1 val _ = (bass(); fcts (); fixs (); sigs (); strs (); types (); vals ()) val _ = currentScope := s0 in a2 end fun localModule (E as T {currentScope, fixs, strs, types, vals, ...}, f1, f2) = let val s0 = !currentScope val fixs = doit (E, fixs, s0) val strs = doit (E, strs, s0) val types = doit (E, types, s0) val vals = doit (E, vals, s0) val _ = currentScope := Scope.new {isTop = false} val a1 = f1 () val fixs = fixs () val strs = strs () val types = types () val vals = vals () val _ = currentScope := Scope.new {isTop = false} val a2 = f2 a1 val _ = (fixs (); strs (); types (); vals ()) val _ = currentScope := s0 in a2 end (* Can't eliminate the use of strs in localCore, because openn still modifies * module level constructs. *) val localCore = localModule end fun forceUsedLocal (E as T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}, th) = let fun doit (forceRange: 'b -> unit, ns as NameSpace.T {current, ...}, s0) = let val old = !current val _ = current := [] in fn () => let val c = !current val lift = List.revMap (c, Values.pop) val _ = current := old val _ = List.foreach (lift, fn {domain, range, time, uses, ...} => (Uses.forceUsed uses ; forceRange range ; extend (E, ns, {domain = domain, forceUsed = false, range = range, scope = s0, time = time, uses = ExtendUses.Old uses}))) in () end end val s0 = !currentScope val bass = doit (ignore, bass, s0) val fcts = doit (fn f => Option.app (FunctorClosure.result f, Structure.forceUsed), fcts, s0) val fixs = doit (ignore, fixs, s0) val sigs = doit (ignore, sigs, s0) val strs = doit (Structure.forceUsed, strs, s0) val types = doit (ignore, types, s0) val vals = doit (ignore, vals, s0) val _ = currentScope := Scope.new {isTop = true} val res = th () val _ = (bass(); fcts (); fixs (); sigs (); strs (); types (); vals ()) val _ = currentScope := s0 in res end fun makeStructure (T {currentScope, fixs, strs, types, vals, ...}, make) = let val f = NameSpace.collect fixs val s = NameSpace.collect strs val t = NameSpace.collect types val v = NameSpace.collect vals val s0 = !currentScope val _ = currentScope := Scope.new {isTop = false} val res = make () val _ = f () val S = Structure.T {interface = NONE, plist = PropertyList.new (), strs = s (), types = t (), vals = v ()} val _ = currentScope := s0 in (res, S) end fun makeBasis (T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}, make) = let val bass = NameSpace.collect bass val fcts = NameSpace.collect fcts val fixs = NameSpace.collect fixs val sigs = NameSpace.collect sigs val strs = NameSpace.collect strs val types = NameSpace.collect types val vals = NameSpace.collect vals val s0 = !currentScope val _ = currentScope := Scope.new {isTop = true} val res = make () val B = Basis.T {plist = PropertyList.new (), bass = bass (), fcts = fcts (), fixs = fixs (), sigs = sigs (), strs = strs (), types = types (), vals = vals ()} val _ = currentScope := s0 in (res, B) end fun scope (T {currentScope, fixs, strs, types, vals, ...}, th) = let fun doit (NameSpace.T {current, ...}) = let val old = !current val _ = current := [] in fn () => (List.foreach (!current, fn v => ignore (Values.pop v)) ; current := old) end val s0 = !currentScope val _ = currentScope := Scope.new {isTop = false} val f = doit fixs val s = doit strs val t = doit types val v = doit vals val res = th () val _ = (f (); s (); t (); v ()) val _ = currentScope := s0 in res end fun scopeAll (T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}, th) = let fun doit (NameSpace.T {current, ...}) = let val old = !current val _ = current := [] in fn () => (List.foreach (!current, fn v => ignore (Values.pop v)) ; current := old) end val s0 = !currentScope val _ = currentScope := Scope.new {isTop = true} val b = doit bass val fc = doit fcts val f = doit fixs val si = doit sigs val s = doit strs val t = doit types val v = doit vals val res = th () val _ = (b (); fc (); f (); si (); s (); t (); v ()) val _ = currentScope := s0 in res end fun openStructure (E as T {currentScope, strs, vals, types, ...}, Structure.T {strs = strs', vals = vals', types = types', ...}): unit = let val scope = !currentScope fun doit (ns, Info.T a) = Array.foreach (a, fn {domain, range, time, uses} => extend (E, ns, {domain = domain, forceUsed = false, range = range, scope = scope, time = time, uses = ExtendUses.Old uses})) val _ = doit (strs, strs') val _ = doit (vals, vals') val _ = doit (types, types') in () end fun openBasis (E as T {currentScope, bass, fcts, fixs, sigs, strs, vals, types, ...}, Basis.T {bass = bass', fcts = fcts', fixs = fixs', sigs = sigs', strs = strs', vals = vals', types = types', ...}): unit = let val scope = !currentScope fun doit (ns, Info.T a) = Array.foreach (a, fn {domain, range, time, uses} => extend (E, ns, {domain = domain, forceUsed = false, range = range, scope = scope, time = time, uses = ExtendUses.Old uses})) val _ = doit (bass, bass') val _ = doit (fcts, fcts') val _ = doit (fixs, fixs') val _ = doit (sigs, sigs') val _ = doit (strs, strs') val _ = doit (vals, vals') val _ = doit (types, types') in () end fun makeOpaque (S: Structure.t, I: Interface.t, {prefix: string}) = let fun fixCons (Cons.T cs, Cons.T cs') = Cons.T (Vector.map (cs', fn {name, scheme, ...} => let val (con, uses) = case Vector.peek (cs, fn {name = n, ...} => Ast.Con.equals (n, name)) of NONE => (Con.bogus, Uses.new ()) | SOME {con, uses, ...} => (con, uses) in {con = con, name = name, scheme = scheme, uses = uses} end)) val (S', instantiate) = dummyStructure (I, {prefix = prefix}) val _ = instantiate (S, fn (c, s) => TypeEnv.setOpaqueTyconExpansion (c, fn ts => TypeStr.apply (s, ts))) val {destroy, get : Structure.t -> {formal: Structure.t, new: Structure.t} list ref, ...} = Property.destGet (Structure.plist, Property.initFun (fn _ => ref [])) (* fun replace (S, S'): Structure.t = reallyReplace (S, S') *) fun replace (S, S'): Structure.t = let val seen = get S in case List.peek (!seen, fn {formal, ...} => Structure.eq (S', formal)) of NONE => let val new = reallyReplace (S, S') val _ = List.push (seen, {formal = S', new = new}) in new end | SOME {new, ...} => new end and reallyReplace (S, S'): Structure.t = let val Structure.T {strs, types, vals, ...} = S val Structure.T {strs = strs', types = types', vals = vals', ...} = S' val strs = Info.map2 (strs, strs', replace) val types = Info.map2 (types, types', fn (s, s') => let datatype z = datatype TypeStr.node in case TypeStr.node s' of Datatype {cons = cs', tycon} => (case TypeStr.node s of Datatype {cons = cs, ...} => TypeStr.data (tycon, TypeStr.kind s', fixCons (cs, cs')) | _ => s') | Scheme _ => s' | Tycon _ => s' end) val vals = Info.map2 (vals, vals', fn ((v, _), (_, s')) => (v, s')) in Structure.T {interface = Structure.interface S', plist = PropertyList.new (), strs = strs, types = types, vals = vals} end val S'' = replace (S, S') val _ = destroy () in S'' end fun transparentCut (E: t, S: Structure.t, I: Interface.t, {isFunctor: bool}, region: Region.t): Structure.t * Decs.t = let (* This tick is so that the type schemes for any values that need to be * instantiated and then re-generalized will be at a new time, so we can * check if something should not be generalized. *) val () = TypeEnv.tick {useBeforeDef = fn _ => Error.bug "ElaborateEnv.transparentCut: cut tick"} val sign = if isFunctor then "argument signature" else "signature" val preError = Promise.lazy (fn () => scope (E, fn () => (openStructure (E, S) ; setTyconNames E))) val decs = ref [] (* pre: arities are equal. *) fun equalSchemes (structScheme: Scheme.t, sigScheme: Scheme.t, name: string, thing: string, lay: unit -> Layout.t, r: Region.t): unit = let fun error (l1, l2) = let open Layout in Control.error (r, seq [str (concat [thing, " in structure disagrees with ", sign])], align [seq [str (concat [name, ": "]), lay ()], seq [str "structure: ", l1], seq [str "signature: ", l2]]) end val (tyvars', ty') = Scheme.dest sigScheme val tyvars = Vector.tabulate (Vector.length tyvars', fn _ => Type.var (Tyvar.newNoname {equality = false})) in Type.unify (Scheme.apply (structScheme, tyvars), Scheme.apply (Scheme.make {canGeneralize = true, ty = ty', tyvars = tyvars'}, tyvars), {error = error, preError = preError}) end val equalSchemes = Trace.trace ("ElaborateEnv.transparentCut.equalSchemes", fn (s, s', _, _, _, _) => Layout.tuple [Scheme.layout s, Scheme.layout s'], Unit.layout) equalSchemes fun layout (strids, x) = layoutLong (List.fold (strids, [x], fn (s, ac) => Strid.layout s :: ac)) fun checkCons (Cons.T v, Cons.T v', strids: Strid.t list, tycon: Ast.Tycon.t): unit = let fun lay (c: Ast.Con.t) = layout (strids, Ast.Con.layout c) val extraStr = Vector.keepAllMap (v, fn {name = n, scheme = s, ...} => case Vector.peek (v', fn {name = n', ...} => Ast.Con.equals (n, n')) of NONE => SOME n | SOME {scheme = s', ...} => let val _ = equalSchemes (s, s', "constructor", "constructor type", fn () => lay n, region) in NONE end) fun extras (v, name) = if 0 = Vector.length v then () else let open Layout in Control.error (region, seq [str "type ", layout (strids, Ast.Tycon.layout tycon), str (concat [" has constructors in ", name, " only: "]), seq (List.separate (Vector.toListMap (v, lay), str ", "))], empty) end val _ = extras (extraStr, "structure") val extraSig = Vector.keepAllMap (v', fn {name = n', ...} => if Vector.exists (v, fn {name = n, ...} => Ast.Con.equals (n, n')) then NONE else SOME n') val _ = extras (extraSig, "signature") in () end (* isPlausible checks if a type structure in a structure can plausibly be * substituted for a type structure in a signature having the specified * equality, arity, and constructors. *) fun isPlausible (structStr: TypeStr.t, strids, name, sigAdmits: AdmitsEquality.t, sigKind: Kind.t, consMismatch: bool): bool = if not (AdmitsEquality.<= (sigAdmits, TypeStr.admitsEquality structStr)) then let val () = preError () open Layout val () = Control.error (region, seq [str "type ", layout (strids, Ast.Tycon.layout name), str " admits equality in ", str sign, str " but not in structure"], seq [str "not equality: ", TypeStr.explainDoesNotAdmitEquality structStr]) in false end else let val structKind = TypeStr.kind structStr in if not (Kind.equals (structKind, sigKind)) then let open Layout val () = Control.error (region, seq [str "type ", layout (strids, Ast.Tycon.layout name), str " has arity ", Kind.layout structKind, str " in structure but arity ", Kind.layout sigKind, str " in ", str sign], empty) in false end else if consMismatch then let open Layout val () = Control.error (region, seq [str "type ", layout (strids, Ast.Tycon.layout name), str " is a datatype in ", str sign, str " but not in structure"], Layout.empty) in false end else true end fun handleType (structStr: TypeStr.t, sigStr: Interface.TypeStr.t, strids: Strid.t list, name: Ast.Tycon.t): TypeStr.t = case Interface.TypeStr.toEnv sigStr of NONE => structStr | SOME sigStr => let fun tyconScheme (c: Tycon.t): Scheme.t = let val tyvars = case TypeStr.kind structStr of Kind.Arity n => Vector.tabulate (n, fn _ => Tyvar.newNoname {equality = false}) | _ => Error.bug "ElaborateEnv.transparentCut.handleType: Nary tycon" in Scheme.make {canGeneralize = true, ty = Type.con (c, Vector.map (tyvars, Type.var)), tyvars = tyvars} end datatype z = datatype TypeStr.node fun checkScheme (sigScheme: Scheme.t) = let val structScheme = case TypeStr.node structStr of Datatype {tycon = c, ...} => tyconScheme c | Scheme s => s | Tycon c => tyconScheme c in equalSchemes (structScheme, sigScheme, "type", "type definition", fn () => layout (strids, Ast.Tycon.layout name), region) end val (return, consMismatch) = case TypeStr.node sigStr of Datatype {cons = sigCons, ...} => (case TypeStr.node structStr of Datatype {cons = structCons, ...} => (fn () => (checkCons (structCons, sigCons, strids, name) ; structStr), false) | _ => (fn () => sigStr, true)) | Scheme s => (fn () => (checkScheme s; sigStr), false) | Tycon c => (fn () => (checkScheme (tyconScheme c); sigStr), false) in if isPlausible (structStr, strids, name, TypeStr.admitsEquality sigStr, TypeStr.kind sigStr, consMismatch) then return () else sigStr end fun map (structInfo: ('a, 'b) Info.t, sigArray: ('a * 'c) array, strids: Strid.t list, nameSpace: string, namesEqual: 'a * 'a -> bool, layoutName: 'a -> Layout.t, bogus: 'c -> 'd, doit: 'a * 'b * 'c -> 'd): ('a, 'd) Info.t = let val Info.T structArray = structInfo val n = Array.length structArray val r = ref 0 val array = Array.map (sigArray, fn (name, c) => let fun find i = if i = n then let open Layout val _ = Control.error (region, seq [str (concat [nameSpace, " "]), layout (strids, layoutName name), str (concat [" in ", sign, " but not in structure"])], empty) in {domain = name, range = bogus c, time = Time.next (), uses = Uses.new ()} end else let val {domain, range, time, uses} = Array.sub (structArray, i) in if namesEqual (domain, name) then (r := i + 1 ; {domain = domain, range = doit (name, range, c), time = time, uses = uses}) else find (i + 1) end in find (!r) end) in Info.T array end fun checkMatch (TyconMap.T {strs, types}, Structure.T {strs = strsS, types = typesS, ...}, I: Interface.t, strids): unit = let val {strs = strsI, types = typesI, ...} = Interface.dest I val _ = foreach2Sorted (strs, strsS, Strid.equals, fn (strid, tm, opt) => case opt of NONE => Error.bug "ElaborateEnv.transparentCut.checkMatch: str" | SOME (i, S) => checkMatch (tm, S, #2 (Array.sub (strsI, i)), strid :: strids)) val _ = foreach2Sorted (types, typesS, Ast.Tycon.equals, fn (name, _, opt) => case opt of NONE => Error.bug "ElaborateEnv.transparentCut.checkMatch: type" | SOME (i, typeStr) => ignore (handleType (typeStr, #2 (Array.sub (typesI, i)), strids, name))) in () end val checkMatch = Trace.trace4 ("ElaborateEnv.transparentCut.checkMatch", TyconMap.layout FlexibleTycon.layout, Structure.layout, Interface.layout, List.layout Strid.layout, Unit.layout) checkMatch (* quell unused warning *) val _ = checkMatch val {destroy, get: Structure.t -> (Interface.t * Structure.t) list ref, ...} = Property.destGet (Structure.plist, Property.initFun (fn _ => ref [])) (* fun cut (S, I, strids): Structure.t = reallyCut (S, I, strids) *) fun cut (S, I, strids): Structure.t = let val seen = get S in case List.peek (!seen, fn (I', _) => Interface.equals (I, I')) of NONE => let fun really () = reallyCut (S, I, strids) val S = case Structure.interface S of NONE => really () | SOME I' => if Interface.equals (I, I') then S else really () (* let val origI = Interface.original I val origI' = Interface.original I' in if Interface.equals (origI, origI') then (checkMatch (Interface.flexibleTycons origI, S, I, strids) ; S) else really () end *) val _ = List.push (seen, (I, S)) in S end | SOME (_, S) => S end and reallyCut (Structure.T {strs = structStrs, types = structTypes, vals = structVals, ...}, I, strids) = let val {strs = sigStrs, types = sigTypes, vals = sigVals} = Interface.dest I val strs = map (structStrs, sigStrs, strids, "structure", Strid.equals, Strid.layout, fn I => #1 (dummyStructure (I, {prefix = ""})), fn (name, S, I) => cut (S, I, name :: strids)) val types = map (structTypes, sigTypes, strids, "type", Ast.Tycon.equals, Ast.Tycon.layout, Interface.TypeStr.toEnvNoNone, fn (name, s, s') => handleType (s, s', strids, name)) val vals = map (structVals, sigVals, strids, "variable", Ast.Vid.equals, Ast.Vid.layout, fn (status, sigScheme) => let val vid = case status of Status.Con => Vid.Con (Con.newNoname ()) | Status.Exn => Vid.Exn (Con.newNoname ()) | Status.Var => Vid.Var (Var.newNoname ()) in (vid, Interface.Scheme.toEnv sigScheme) end, fn (name, (vid, strScheme), (status, sigScheme)) => case (strScheme, Interface.Scheme.toEnv sigScheme) of (SOME strScheme, SOME sigScheme) => let val (sigArgs, sigType) = Scheme.dest sigScheme val generalize = TypeEnv.generalize sigArgs val {args = strArgs, instance = strType} = Scheme.instantiate strScheme fun error rest = let open Layout in Control.error (region, seq [str "variable type in structure disagrees with ", str sign], align [seq [str "variable: ", Longvid.layout (Longvid.long (rev strids, name))], rest]) end val _ = Type.unify (strType, sigType, {error = (fn (l, l') => let open Layout in error (align [seq [str "structure: ", l], seq [str "signature: ", l']]) end), preError = preError}) (* Now that we've unified, find any type variables that * can't be generalized because they occur at an earlier * point. *) val {unable} = generalize () val () = if 0 = Vector.length unable then () else let val () = preError () open Layout in error (align [seq [str "unable to generalize: ", seq (List.separate (Vector.toListMap (unable, Tyvar.layout), str ", "))], seq [str "signature: ", Scheme.layoutPretty sigScheme]]) end val strArgs = strArgs () fun addDec (name: string, n: Exp.node): Vid.t = let val x = Var.newString name val e = Exp.make (n, strType) val _ = List.push (decs, Dec.Val {nonexhaustiveExnMatch = nonexhaustiveExnMatch (), nonexhaustiveMatch = nonexhaustiveMatch (), rvbs = Vector.new0 (), tyvars = fn () => sigArgs, vbs = (Vector.new1 {exp = e, lay = fn _ => Layout.empty, nest = [], pat = Pat.var (x, strType), patRegion = region})}) in Vid.Var x end fun con (c: Con.t): Vid.t = addDec (Con.originalName c, Exp.Con (c, strArgs)) val vid = case (vid, status) of (Vid.Con c, Status.Var) => con c | (Vid.Exn c, Status.Var) => con c | (Vid.Var x, Status.Var) => if 0 < Vector.length sigArgs orelse 0 < Vector.length strArgs then addDec (Var.originalName x, Exp.Var (fn () => x, fn () => strArgs)) else vid | (Vid.Con _, Status.Con) => vid | (Vid.Exn _, Status.Exn) => vid | _ => let open Layout val _ = Control.error (region, seq [str (concat [Vid.statusPretty vid, " in structure but ", Status.pretty status, " in ", sign, ": "]), layout (strids, Ast.Vid.layout name)], Layout.empty) in vid end in (vid, SOME sigScheme) end | _ => (* We don't want to cause spurious errors by guessing. * Putting strScheme here would be * wrong, because it isn't what the signature says -- * it might expose stuff hidden by the signature. *) (vid, NONE)) in Structure.T {interface = SOME I, plist = PropertyList.new (), strs = strs, types = types, vals = vals} end val I = Interface.copy I val () = Structure.realize (S, Interface.flexibleTycons I, fn (name, flex, typeStr, {nest}) => let val {admitsEquality = a, hasCons, kind = k, ...} = FlexibleTycon.dest flex val typeStr = case typeStr of NONE => NONE | SOME typeStr => (* Makes sure we only realize a plausible candidate for * typeStr. *) if isPlausible (typeStr, nest, name, a, k, hasCons andalso Option.isNone (TypeStr.toTyconOpt typeStr)) then SOME typeStr else NONE val () = FlexibleTycon.realize (flex, typeStr) in () end) val S = cut (S, I, []) val () = destroy () in (S, Decs.fromList (!decs)) end (* section 5.3, 5.5, 5.6 and rules 52, 53 *) fun cut (E: t, S: Structure.t, I: Interface.t, {isFunctor: bool, opaque: bool, prefix: string}, region) : Structure.t * Decs.t = let val (S, decs) = transparentCut (E, S, I, {isFunctor = isFunctor}, region) (* Avoid doing the opaque match if numErrors > 0 because it can lead * to internal errors that might be confusing to the user. *) val S = if opaque andalso 0 = !Control.numErrors then makeOpaque (S, I, {prefix = prefix}) else S in (S, decs) end val cut = Trace.trace ("ElaborateEnv.cut", fn (_, S, I, _, _) => Layout.tuple [Structure.layoutPretty S, Interface.layout I], Structure.layoutPretty o #1) cut (* ------------------------------------------------- *) (* functorClosure *) (* ------------------------------------------------- *) fun snapshot (E as T {currentScope, bass, fcts, fixs, sigs, strs, types, vals, ...}) : (unit -> 'a) -> 'a = let val add: (Scope.t -> unit) list ref = ref [] (* Push onto add everything currently in scope. *) fun doit (NameSpace.T {current, ...}) (v as Values.T vs) = case ! vs of [] => () | {domain, range, uses, ...} :: _ => List.push (add, fn s0 => (List.push (vs, {domain = domain, range = range, scope = s0, time = Time.next (), uses = uses}) ; List.push (current, v))) val _ = foreachTopLevelSymbol (E, {bass = doit bass, fcts = doit fcts, fixs = doit fixs, sigs = doit sigs, strs = doit strs, types = doit types, vals = doit vals}) in fn th => let val s0 = Scope.new {isTop = false} val restore: (unit -> unit) list ref = ref [] fun doit (NameSpace.T {current, ...}) = let val current0 = !current val _ = current := [] in List.push (restore, fn () => (List.foreach (!current, fn v => ignore (Values.pop v)) ; current := current0)) end val _ = (doit bass; doit fcts; doit fixs; doit sigs ; doit strs; doit types; doit vals) val _ = List.foreach (!add, fn f => f s0) (* Clear out any symbols that weren't available in the old scope. *) fun doit (Values.T vs) = let val cur = !vs in case cur of [] => () | {scope, ...} :: _ => if Scope.equals (s0, scope) then () else (vs := [] ; List.push (restore, fn () => vs := cur)) end val _ = (* Can't use foreachToplevelSymbol here, because a constructor C may * have been defined in a local scope but may not have been defined * at the snapshot point. This will make the identifier C, which * originally would have elaborated as a variable instead elaborate * as a constructor. *) foreachDefinedSymbol (E, {bass = doit, fcts = doit, fixs = doit, sigs = doit, strs = doit, types = doit, vals = doit}) val s1 = !currentScope val _ = currentScope := s0 val res = th () val _ = currentScope := s1 val _ = List.foreach (!restore, fn f => f ()) in res end end fun functorClosure (E: t, arg: Strid.t, nest: string list, prefix: string, argInt: Interface.t, makeBody: Structure.t * string list -> Decs.t * Structure.t option) = let (* Keep track of the first tycon currently at the front of allTycons. * Once we are done elaborating the body, we can remove all the dummy * tycons created while elaborating the body by removing everything from * allTycons up to firstTycon. *) val firstTycon = case !allTycons of [] => Error.bug "ElaborateEnv.functorClosure: firstTycons" | c :: _ => c (* Need to tick here so that any tycons created in the dummy structure * for the functor formal have a new time, and will therefore report an * error if they occur before the functor declaration. *) val _ = TypeEnv.tick {useBeforeDef = fn _ => Error.bug "ElaborateEnv.functorClosure: tick"} val (formal, instantiate) = dummyStructure (argInt, {prefix = prefix}) val _ = insideFunctor := true (* Keep track of all tycons created during the instantiation of the * functor. These will later become the generative tycons that will need * to be recreated for each functor application. * This has two beneficial effects. * 1. It keeps allTycons smaller. * 2. It keeps the names of these tycons from being set by setTyconNames, * which they always would be because they are now out of scope. *) val _ = newTycons := [] val (_, result) = makeBody (formal, nest) val _ = Option.app (result, Structure.forceUsed) val generative = !newTycons val _ = allTycons := let fun loop cs = case cs of [] => Error.bug "ElaborateEnv.functorClosure: missing firstTycon" | c :: cs' => if Tycon.equals (c, firstTycon) then cs else loop cs' in loop (!allTycons) end val _ = newTycons := [] val _ = insideFunctor := false val restore = if !Control.elaborateOnly then fn f => f () else let val withSaved = Control.Elaborate.snapshot () val snapshot = snapshot E in fn f => snapshot (fn () => withSaved f) end fun apply (actual, nest) = if not (!insideFunctor) andalso not (!Control.elaborateOnly) then restore (fn () => makeBody (actual, nest)) else let val _ = Structure.forceUsed actual val {destroy = destroy1, get = tyconTypeStr: Tycon.t -> TypeStr.t option, set = setTyconTypeStr, ...} = Property.destGetSet (Tycon.plist, Property.initConst NONE) (* Match the actual against the formal, to set the tycons. * Then duplicate the result, replacing tycons. Want to generate * new tycons just like the functor body did. *) val _ = instantiate (actual, fn (c, s) => setTyconTypeStr (c, SOME s)) val _ = List.foreach (generative, fn (c, k, r) => setTyconTypeStr (c, SOME (TypeStr.tycon (newTycon (Tycon.originalName c, k, ! (TypeEnv.tyconAdmitsEquality c), r), k)))) fun replaceType (t: Type.t): Type.t = let fun con (c, ts) = case tyconTypeStr c of NONE => Type.con (c, ts) | SOME s => TypeStr.apply (s, ts) in Type.hom (t, {con = con, expandOpaque = false, record = Type.record, replaceSynonyms = false, var = Type.var}) end fun replaceScheme (s: Scheme.t): Scheme.t = let val (tyvars, ty) = Scheme.dest s in Scheme.make {canGeneralize = true, ty = replaceType ty, tyvars = tyvars} end fun replaceCons (Cons.T v): Cons.t = Cons.T (Vector.map (v, fn {con, name, scheme, uses} => {con = con, name = name, scheme = replaceScheme scheme, uses = uses})) fun replaceTypeStr (s: TypeStr.t): TypeStr.t = let val k = TypeStr.kind s datatype z = datatype TypeStr.node in case TypeStr.node s of Datatype {cons, tycon} => let val tycon = case tyconTypeStr tycon of NONE => tycon | SOME s => (case TypeStr.node s of Datatype {tycon, ...} => tycon | Scheme _ => Error.bug "ElaborateEnv.functorClosure.apply: bad datatype" | Tycon c => c) in TypeStr.data (tycon, k, replaceCons cons) end | Scheme s => TypeStr.def (replaceScheme s, k) | Tycon c => (case tyconTypeStr c of NONE => s | SOME s' => s') end val {destroy = destroy2, get = replacement: Structure.t -> Structure.t, ...} = Property.destGet (Structure.plist, Property.initRec (fn (Structure.T {interface, strs, types, vals, ... }, replacement) => Structure.T {interface = interface, plist = PropertyList.new (), strs = Info.map (strs, replacement), types = Info.map (types, replaceTypeStr), vals = Info.map (vals, fn (v, s) => (v, Option.map (s, replaceScheme)))})) val result = Option.map (result, replacement) val _ = destroy1 () val _ = destroy2 () in (Decs.empty, result) end in FunctorClosure.T {apply = apply, arg = arg, argInt = argInt, formal = formal, result = result} end structure Env = struct val lookupLongtycon = lookupLongtycon end structure InterfaceEnv = struct local open Interface in structure Scheme = Scheme structure Status = Status structure TypeStr = TypeStr end val allowDuplicates = ref false type t = t fun extend (T {currentScope, interface, ...}, domain, range, kind: string, ns, region): unit = let val scope = !currentScope val NameSpace.T {current, lookup, toSymbol, ...} = ns interface fun value () = {domain = domain, range = range, scope = scope, time = Time.next (), uses = Uses.new ()} val values as Values.T r = lookup domain fun new () = (List.push (current, values) ; List.push (r, value ())) in case !r of [] => new () | {scope = scope', ...} :: l => if Scope.equals (scope, scope') then if !allowDuplicates then r := value () :: l else Control.error (region, Layout.str (concat ["duplicate ", kind, " specification: ", Symbol.toString (toSymbol domain)]), Layout.empty) else new () end fun extendStrid (E, s, I, r) = extend (E, s, I, "structure", #strs, r) fun extendTycon (E, c, s, r) = extend (E, c, s, "type", #types, r) fun extendVid (E, v, st, s, r) = extend (E, v, (st, s), "value", #vals, r) val lookupSigid = lookupSigid local fun make sel (T {interface, ...}, a) = NameSpace.peek (sel interface, a, {markUse = fn _ => true}) in val peekStrid = make #strs val peekTycon = make #types end fun lookupLongstrid (E: t, s: Longstrid.t): Interface.t option = let fun error l = (unbound (Longstrid.region s, "structure", l) ; NONE) val (strids, strid) = Longstrid.split s in case strids of [] => (case peekStrid (E, strid) of NONE => error (Strid.layout strid) | SOME I => SOME I) | s :: ss => case peekStrid (E, s) of NONE => error (Strid.layout s) | SOME I => let datatype z = datatype Interface.peekResult in case Interface.peekStrids (I, ss @ [strid]) of Found I => SOME I | UndefinedStructure ss => error (layoutStrids (s :: ss)) end end fun lookupLongtycon (E: t, long: Longtycon.t): TypeStr.t option = let fun doit () = Option.map (Env.lookupLongtycon (E, long), TypeStr.fromEnv) val (strids, c) = Longtycon.split long in case strids of [] => (case peekTycon (E, c) of NONE => doit () | SOME s => SOME s) | s :: ss => case peekStrid (E, s) of NONE => doit () | SOME I => Interface.lookupLongtycon (I, Longtycon.long (ss, c), Longtycon.region long, {prefix = [s]}) end fun makeInterface (T {currentScope, interface = {strs, types, vals}, ...}, {isTop}, make) = let val s = NameSpace.collect strs val t = NameSpace.collect types val v = NameSpace.collect vals val s0 = !currentScope val _ = currentScope := Scope.new {isTop = false} val res = make () val Info.T s = s () val s = Array.map (s, fn {domain, range, ...} => (domain, range)) val Info.T t = t () val t = Array.map (t, fn {domain, range, ...} => (domain, range)) val Info.T v = v () val v = Array.map (v, fn {domain, range = (status, scheme), ...} => (domain, (status, scheme))) val I = Interface.new {isClosed = isTop, strs = s, types = t, vals = v} val _ = currentScope := s0 in (I, res) end fun openInterface (E, I, r: Region.t) = let val {strs, vals, types} = Interface.dest I val _ = Array.foreach (strs, fn (s, I) => extendStrid (E, s, I, r)) val _ = Array.foreach (types, fn (c, s) => extendTycon (E, c, s, r)) val _ = Array.foreach (vals, fn (x, (s, sc)) => extendVid (E, x, s, sc, r)) in () end val extendStrid = fn (E, s, I) => extendStrid (E, s, I, Strid.region s) val extendTycon = fn (E, c, s) => extendTycon (E, c, s, Ast.Tycon.region c) val extendVid = fn (E, v, st, s) => extendVid (E, v, st, s, Ast.Vid.region v) fun extendCon (E, c, s) = extendVid (E, Ast.Vid.fromCon c, Status.Con, s) fun extendExn (E, c, s) = extendVid (E, Ast.Vid.fromCon c, Status.Exn, s) end val makeInterfaceEnv = fn E => E end mlton-20100608/mlton/elaborate/elaborate-env.sig0000644000076600000240000002007411404435623020103 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_ENV_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure TypeEnv: TYPE_ENV sharing Ast.Record = CoreML.Record sharing Ast.SortedRecord = CoreML.SortedRecord sharing Ast.Tyvar = CoreML.Tyvar sharing CoreML.Atoms = TypeEnv.Atoms sharing CoreML.Type = TypeEnv.Type end signature ELABORATE_ENV = sig include ELABORATE_ENV_STRUCTS structure AdmitsEquality: ADMITS_EQUALITY sharing AdmitsEquality = TypeEnv.Tycon.AdmitsEquality structure Decs: DECS sharing CoreML = Decs.CoreML structure Tycon: TYCON sharing Tycon = TypeEnv.Tycon structure Type: sig type t end sharing Type = TypeEnv.Type structure Scheme: sig type t end sharing Scheme = TypeEnv.Scheme (* The value of a vid. This is used to distinguish between vids whose * status cannot be determined at parse time. *) structure Vid: sig datatype t = Con of CoreML.Con.t | Exn of CoreML.Con.t | Overload of Ast.Priority.t * (CoreML.Var.t * Scheme.t option) vector | Var of CoreML.Var.t val layout: t -> Layout.t end structure TypeStr: sig structure Cons: sig type t val layout: t -> Layout.t end structure Kind: TYCON_KIND structure Tycon: sig type t end type t datatype node = Datatype of {cons: Cons.t, tycon: Tycon.t} | Scheme of Scheme.t | Tycon of Tycon.t val abs: t -> t val admitsEquality: t -> AdmitsEquality.t val apply: t * Type.t vector -> Type.t val data: Tycon.t * Kind.t * Cons.t -> t val def: Scheme.t * Kind.t -> t val kind: t -> Kind.t val layout: t -> Layout.t val node: t -> node val toTyconOpt: t -> Tycon.t option (* NONE on Scheme *) val tycon: Tycon.t * Kind.t -> t end sharing TypeStr.Kind = Tycon.Kind sharing TypeStr.Tycon = CoreML.Tycon structure Interface: INTERFACE sharing Interface.Ast = Ast sharing Interface.EnvTypeStr = TypeStr structure Structure: sig type t (* ffi represents MLtonFFI, which is built by the basis library and * set via the special ffiStr MLB annotation. *) val ffi: t option ref val forceUsed: t -> unit val layout: t -> Layout.t end structure FunctorClosure: sig type t val apply: (t * Structure.t * string list -> Decs.t * Structure.t option) val argInterface: t -> Interface.t end structure InterfaceEnv: sig structure Scheme: sig type t end structure Status: sig type t end structure TypeStr: sig type t end type t val allowDuplicates: bool ref val extendCon: t * Ast.Con.t * Scheme.t -> unit val extendExn: t * Ast.Con.t * Scheme.t -> unit val extendStrid: t * Ast.Strid.t * Interface.t -> unit val extendTycon: t * Ast.Tycon.t * TypeStr.t -> unit val extendVid: t * Ast.Vid.t * Status.t * Scheme.t -> unit val lookupLongstrid: t * Ast.Longstrid.t -> Interface.t option val lookupLongtycon: t * Ast.Longtycon.t -> TypeStr.t option val lookupSigid: t * Ast.Sigid.t -> Interface.t option val makeInterface: t * {isTop: bool} * (unit -> 'a) -> Interface.t * 'a val openInterface: t * Interface.t * Region.t -> unit end sharing Interface.Scheme = InterfaceEnv.Scheme sharing Interface.Status = InterfaceEnv.Status sharing Interface.TypeStr = InterfaceEnv.TypeStr structure Basis: sig type t val layout: t -> Layout.t end type t val amInsideFunctor: unit -> bool (* cut keeps only those bindings in the structure that also appear * in the interface. It proceeds recursively on substructures. *) val cut: t * Structure.t * Interface.t * {isFunctor: bool, opaque: bool, prefix: string} * Region.t -> Structure.t * Decs.t val empty: unit -> t val extendBasid: t * Ast.Basid.t * Basis.t -> unit val extendExn: t * Ast.Con.t * CoreML.Con.t * Scheme.t option -> unit val extendFctid: t * Ast.Fctid.t * FunctorClosure.t -> unit val extendFix: t * Ast.Vid.t * Ast.Fixity.t -> unit val extendSigid: t * Ast.Sigid.t * Interface.t -> unit val extendStrid: t * Ast.Strid.t * Structure.t -> unit val extendTycon: t * Ast.Tycon.t * TypeStr.t * {forceUsed: bool, isRebind: bool} -> unit val extendVar: t * Ast.Var.t * CoreML.Var.t * Scheme.t * {isRebind: bool} -> unit val extendOverload: t * Ast.Priority.t * Ast.Var.t * (CoreML.Var.t * Scheme.t option) vector * Scheme.t -> unit val forceUsed: t -> unit val forceUsedLocal: t * (unit -> 'a) -> 'a val functorClosure: t * Ast.Strid.t * string list * string * Interface.t * (Structure.t * string list -> Decs.t * Structure.t option) -> FunctorClosure.t val layout: t -> Layout.t val layoutCurrentScope: t -> Layout.t val layoutUsed: t -> Layout.t val localAll: t * (unit -> 'a) * ('a -> 'b) -> 'b val localCore: t * (unit -> 'a) * ('a -> 'b) -> 'b val localModule: t * (unit -> 'a) * ('a -> 'b) -> 'b val lookupBasid: t * Ast.Basid.t -> Basis.t option val lookupFctid: t * Ast.Fctid.t -> FunctorClosure.t option val lookupLongcon: t * Ast.Longcon.t -> CoreML.Con.t * Scheme.t option val lookupLongstrid: t * Ast.Longstrid.t -> Structure.t option val lookupLongtycon: t * Ast.Longtycon.t -> TypeStr.t option val lookupLongvar: t * Ast.Longvar.t -> CoreML.Var.t * Scheme.t option val lookupLongvid: t * Ast.Longvid.t -> Vid.t * Scheme.t option val lookupSigid: t * Ast.Sigid.t -> Interface.t option val lookupStrid: t * Ast.Strid.t -> Structure.t option val makeBasis: t * (unit -> 'a) -> 'a * Basis.t val makeInterfaceEnv: t -> InterfaceEnv.t val makeStructure: t * (unit -> 'a) -> 'a * Structure.t val newCons: ((t * {con: CoreML.Con.t, name: Ast.Con.t} vector) -> Scheme.t vector -> TypeStr.Cons.t) val newTycon: string * Tycon.Kind.t * AdmitsEquality.t * Region.t -> Tycon.t (* openStructure (E, S) opens S in the environment E. *) val openStructure: t * Structure.t -> unit (* openBasis (E, B) opens B in the environment E. *) val openBasis: t * Basis.t -> unit val peekFix: t * Ast.Vid.t -> Ast.Fixity.t option val peekLongcon: t * Ast.Longcon.t -> (CoreML.Con.t * Scheme.t option) option val processDefUse: t -> unit (* scope f evaluates f () in a new scope so that extensions that occur * during f () are forgotten afterwards. * scope works for infixes, types, values, and structures *) val scope: t * (unit -> 'a) -> 'a (* like scope, but works for bases, signatures and functors as well *) val scopeAll: t * (unit -> 'a) -> 'a val setTyconNames: t -> unit val sizeMessage: t -> Layout.t val snapshot: t -> (unit -> 'a) -> 'a end mlton-20100608/mlton/elaborate/elaborate-mlbs.fun0000644000076600000240000002453211404435623020261 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ElaborateMLBs (S: ELABORATE_MLBS_STRUCTS): ELABORATE_MLBS = struct open S local open Control.Elaborate in val deadCode = fn () => current deadCode end structure ElabControl = Control.Elaborate fun check (c: (bool,bool) ElabControl.t, keyword: string, region) = if ElabControl.current c then () else let open Layout in Control.error (region, str (concat (if ElabControl.expert c then [keyword, " disallowed"] else [keyword, " disallowed, compile with -default-ann '", ElabControl.name c, " true'"])), empty) end local open Ast in structure Basexp = Basexp structure Basdec = Basdec structure Longstrid = Longstrid structure ModIdBind = ModIdBind end local open Env in structure Decs = Decs end structure ElaboratePrograms = ElaboratePrograms (structure Ast = Ast structure CoreML = CoreML structure Decs = Decs structure Env = Env) local open ElaboratePrograms in structure Decs = Decs structure Env = Env end fun elaborateMLB (mlb : Basdec.t, {addPrim}) = let val decs = Buffer.new {dummy = ([], false)} val E = Env.empty () fun withDef f = ElabControl.withDef (fn () => if ElabControl.default ElabControl.forceUsed then Env.forceUsedLocal (E, f) else f ()) val emptySnapshot : (unit -> Env.Basis.t) -> Env.Basis.t = Env.snapshot E val emptySnapshot = fn (f: unit -> Env.Basis.t) => emptySnapshot (fn () => withDef f) val primBasis = emptySnapshot (fn () => (#2 o Env.makeBasis) (E, fn () => let val primDecs = addPrim E in Buffer.add (decs, (primDecs, false)) end)) fun elabProg p = ElaboratePrograms.elaborateProgram (p, {env = E}) val psi : (File.t * Env.Basis.t Promise.t) HashSet.t = HashSet.new {hash = String.hash o #1} val elabBasexpInfo = Trace.info "ElaborateMLBs.elabBasexp" val elabBasdecInfo = Trace.info "ElaborateMLBs.elabBasdec" fun elabBasexp (basexp: Basexp.t) : Env.Basis.t option = Trace.traceInfo' (elabBasexpInfo, Basexp.layout, Layout.ignore) (fn (basexp: Basexp.t) => case Basexp.node basexp of Basexp.Bas basdec => let val ((), B) = Env.makeBasis (E, fn () => elabBasdec basdec) in SOME B end | Basexp.Var basid => Env.lookupBasid (E, basid) | Basexp.Let (basdec, basexp) => Env.scopeAll (E, fn () => (elabBasdec basdec ; elabBasexp basexp))) basexp and elabBasdec (basdec: Basdec.t) : unit = Trace.traceInfo' (elabBasdecInfo, Basdec.layout, Layout.ignore) (fn (basdec: Basdec.t) => case Basdec.node basdec of Basdec.Defs def => let fun doit (lookup, extend, bnds) = Vector.foreach (Vector.map (bnds, fn {lhs, rhs} => {lhs = lhs, rhs = lookup (E, rhs)}), fn {lhs, rhs} => Option.app (rhs, fn z => extend (E, lhs, z))) in case ModIdBind.node def of ModIdBind.Fct bnds => doit (Env.lookupFctid, Env.extendFctid, bnds) | ModIdBind.Sig bnds => doit (Env.lookupSigid, Env.extendSigid, bnds) | ModIdBind.Str bnds => doit (Env.lookupStrid, Env.extendStrid, bnds) end | Basdec.Basis basbinds => let val basbinds = Vector.map (basbinds, fn {name, def} => let val B = elabBasexp def in {B = B, name = name} end) in Vector.foreach (basbinds, fn {name, B, ...} => Option.app (B, fn B => Env.extendBasid (E, name, B))) end | Basdec.Local (basdec1, basdec2) => Env.localAll (E, fn () => elabBasdec basdec1, fn () => elabBasdec basdec2) | Basdec.Seq basdecs => List.foreach(basdecs, elabBasdec) | Basdec.Open basids => Vector.foreach (Vector.map (basids, fn basid => Env.lookupBasid (E, basid)), fn bo => Option.app (bo, fn b => Env.openBasis (E, b))) | Basdec.Prog (_, prog) => let val prog = Promise.force prog in Buffer.add (decs, (Decs.toList (elabProg prog), deadCode ())) end | Basdec.MLB ({fileAbs, ...}, basdec) => let val (_, B) = HashSet.lookupOrInsert (psi, String.hash fileAbs, fn (fileAbs', _) => String.equals (fileAbs, fileAbs'), fn () => let val basdec = Promise.force basdec val B = Promise.delay (fn () => emptySnapshot (fn () => (#2 o Env.makeBasis) (E, fn () => elabBasdec basdec))) in (fileAbs, B) end) val B = Promise.force B handle Promise.Force => (* Basis forms a cycle; * force the AST to generate error message. *) (ignore (Promise.force basdec) ; #2 (Env.makeBasis (E, fn () => ()))) in Env.openBasis (E, B) end | Basdec.Prim => (check (ElabControl.allowPrim, "_prim", Basdec.region basdec) ; Env.openBasis (E, primBasis)) | Basdec.Ann (ann, reg, basdec) => let open ElabControl fun warn () = if !Control.warnAnn then let open Layout in Control.warning (reg, seq [str "unrecognized annotation: ", str ann], empty) end else () in case parseIdAndArgs ann of Control.Elaborate.Bad => (warn () ; elabBasdec basdec) | Control.Elaborate.Deprecated alts => let val (ids, args) = List.unzip alts val () = if !Control.warnDeprecated then let open Layout in Control.warning (reg, seq [str "deprecated annotation: ", str ann, str ", use ", List.layout (str o Control.Elaborate.Id.name) ids], empty) end else () val restores = List.map (args, Args.processAnn) in Exn.finally (fn () => elabBasdec basdec, fn () => List.foreach (List.rev restores, fn restore => restore ())) end | Control.Elaborate.Good (id, args) => let val restore = Args.processAnn args in Exn.finally (fn () => if equalsId (forceUsed, id) andalso enabled forceUsed then Env.forceUsedLocal (E, fn () => elabBasdec basdec) else if equalsId (ffiStr, id) then let val ffi = valOf (current ffiStr) val ffi = Longstrid.fromSymbols (List.map (String.split (ffi, #"."), Longstrid.Symbol.fromString), reg) in elabBasdec basdec before Option.app (Env.lookupLongstrid (E, ffi), fn S => (Env.Structure.ffi := SOME S ; Env.Structure.forceUsed S)) end else elabBasdec basdec, restore) end | Other => elabBasdec basdec end) basdec val _ = withDef (fn () => elabBasdec mlb) in (E, Buffer.toVector decs) end end mlton-20100608/mlton/elaborate/elaborate-mlbs.sig0000644000076600000240000000142311404435623020245 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_MLBS_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure Decs: DECS structure Env: ELABORATE_ENV sharing Ast = Env.Ast sharing Ast.Tyvar = CoreML.Tyvar sharing CoreML = Decs.CoreML = Env.CoreML sharing Decs = Env.Decs end signature ELABORATE_MLBS = sig include ELABORATE_MLBS_STRUCTS val elaborateMLB: Ast.Basdec.t * {addPrim: Env.t -> CoreML.Dec.t list} -> Env.t * (CoreML.Dec.t list * bool) vector end mlton-20100608/mlton/elaborate/elaborate-modules.fun0000644000076600000240000002645211404435623020777 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ElaborateModules (S: ELABORATE_MODULES_STRUCTS): ELABORATE_MODULES = struct open S local open Ast in structure FctArg = FctArg structure Fctid = Fctid structure Longstrid = Longstrid structure SigConst = SigConst structure Sigexp = Sigexp structure Strdec = Strdec structure Strexp = Strexp structure Strid = Strid structure Symbol = Symbol structure Topdec = Topdec end local open Env in structure Decs = Decs structure FunctorClosure = FunctorClosure structure Structure = Structure end structure ElaborateSigexp = ElaborateSigexp (structure Ast = Ast structure Env = Env) structure ElaborateCore = ElaborateCore (structure Ast = Ast structure CoreML = CoreML structure Decs = Decs structure Env = Env) val elabStrdecInfo = Trace.info "ElaborateModules.elabStrdec" val elabStrexpInfo = Trace.info "ElaborateModules.elabStrexp" val elabTopdecInfo = Trace.info "ElaborateModules.elabTopdec" fun elaborateTopdec (topdec, {env = E: Env.t}) = let fun elabSigexp s = ElaborateSigexp.elaborateSigexp (s, {env = E}) fun elabSigexpConstraint (cons: SigConst.t, S: Structure.t option, nest: string list) : Decs.t * Structure.t option = let fun s (sigexp, opaque) = let val prefix = case nest of [] => "" | _ => concat (List.fold (nest, [], fn (s, ac) => s :: "." :: ac)) in case S of NONE => (Decs.empty, NONE) | SOME S => let val (S, decs) = case elabSigexp sigexp of NONE => (S, Decs.empty) | SOME I => Env.cut (E, S, I, {isFunctor = false, opaque = opaque, prefix = prefix}, Sigexp.region sigexp) in (decs, SOME S) end end in case cons of SigConst.None => (Decs.empty, S) | SigConst.Opaque sigexp => s (sigexp, true) | SigConst.Transparent sigexp => s (sigexp, false) end fun elabStrdec (arg: Strdec.t * string list): Decs.t = Trace.traceInfo' (elabStrdecInfo, Layout.tuple2 (Strdec.layout, List.layout String.layout), Decs.layout) (fn (d: Strdec.t, nest: string list) => let val d = Strdec.coalesce d val elabStrdec = fn d => elabStrdec (d, nest) in case Strdec.node d of Strdec.Core d => (* rule 56 *) ElaborateCore.elaborateDec (d, {env = E, nest = nest}) | Strdec.Local (d, d') => (* rule 58 *) Env.localModule (E, fn () => elabStrdec d, fn d => Decs.append (d, elabStrdec d')) | Strdec.Seq ds => (* rule 60 *) List.fold (ds, Decs.empty, fn (d, decs) => Decs.append (decs, elabStrdec d)) | Strdec.Structure strbinds => (* rules 57, 61 *) let val strbinds = Vector.map (strbinds, fn {name, def, constraint} => let val nest = Strid.toString name :: nest val (decs', S) = elabStrexp (def, nest) val (decs'', S) = elabSigexpConstraint (constraint, S, nest) in {decs = Decs.append (decs', decs''), name = name, S = S} end) val () = Vector.foreach (strbinds, fn {name, S, ...} => Option.app (S, fn S => Env.extendStrid (E, name, S))) in Decs.appendsV (Vector.map (strbinds, #decs)) end end) arg and elabStrexp (arg: Strexp.t * string list): Decs.t * Structure.t option = Trace.traceInfo' (elabStrexpInfo, Layout.tuple2 (Strexp.layout, List.layout String.layout), Layout.tuple2 (Decs.layout, Option.layout Structure.layout)) (fn (e: Strexp.t, nest: string list) => let val elabStrexp = fn e => elabStrexp (e, nest) in case Strexp.node e of Strexp.App (fctid, strexp) => (* rules 54, 154 *) let val (decs, S) = elabStrexp strexp in case S of NONE => (decs, NONE) | SOME S => case Env.lookupFctid (E, fctid) of NONE => (decs, NONE) | SOME fct => let val (S, decs') = Env.cut (E, S, FunctorClosure.argInterface fct, {isFunctor = true, opaque = false, prefix = ""}, Strexp.region strexp) val (decs'', S) = FunctorClosure.apply (fct, S, [Fctid.toString fctid]) in (Decs.appends [decs, decs', decs''], S) end end | Strexp.Constrained (e, c) => (* rules 52, 53 *) let val (decs, S) = elabStrexp e val (decs', S) = elabSigexpConstraint (c, S, nest) in (Decs.append (decs, decs'), S) end | Strexp.Let (d, e) => (* rule 55 *) Env.scope (E, fn () => let val decs = elabStrdec (d, nest) val (decs', S) = elabStrexp e in (Decs.append (decs, decs'), S) end) | Strexp.Struct d => (* rule 50 *) let val (decs, S) = Env.makeStructure (E, fn () => elabStrdec (d, nest)) in (decs, SOME S) end | Strexp.Var p => (* rule 51 *) (Decs.empty, Env.lookupLongstrid (E, p)) end) arg fun elabFunctor {arg, body, name, result}: FunctorClosure.t option = let val body = Strexp.constrained (body, result) val (arg, argSig, body, prefix) = case FctArg.node arg of FctArg.Structure (arg, argSig) => (arg, argSig, body, concat [Strid.toString arg, "."]) | FctArg.Spec spec => let val strid = Strid.fromSymbol (Symbol.fromString "ZZZNewStridZZZ", Region.bogus) in (strid, Sigexp.spec spec, Strexp.lett (Strdec.openn (Vector.new1 (Longstrid.short strid)), body), "") end in Option.map (elabSigexp argSig, fn argInt => Env.functorClosure (E, arg, [Fctid.toString name], prefix, argInt, fn (formal, nest) => Env.scope (E, fn () => (Env.extendStrid (E, arg, formal) ; elabStrexp (body, nest))))) end fun elabTopdec arg: Decs.t = Trace.traceInfo' (elabTopdecInfo, Topdec.layout, Decs.layout) (fn (d: Topdec.t) => case Topdec.node d of Topdec.Signature sigbinds => let val sigbinds = Vector.map (sigbinds, fn (sigid, sigexp) => (sigid, elabSigexp sigexp)) val () = Vector.foreach (sigbinds, fn (sigid, I) => Option.app (I, fn I => Env.extendSigid (E, sigid, I))) in Decs.empty end | Topdec.Strdec d => elabStrdec (d, []) | Topdec.Functor funbinds => (* Rules 85, 86. Appendix A, p.58 *) let val funbinds = Vector.map (funbinds, fn {arg, body, name, result} => {closure = elabFunctor {arg = arg, body = body, name = name, result = result}, name = name}) val () = Vector.foreach (funbinds, fn {closure, name} => Option.app (closure, fn closure => Env.extendFctid (E, name, closure))) (* Check for errors here so that we don't report duplicate * errors when re-elaborating the functor body. *) val () = Control.checkForErrors "elaborate" in Decs.empty end ) arg val elabTopdec = fn d => let val res = elabTopdec d val _ = ElaborateCore.reportUndeterminedTypes () val _ = ElaborateCore.reportSequenceNonUnit () in res end in elabTopdec topdec end end mlton-20100608/mlton/elaborate/elaborate-modules.sig0000644000076600000240000000132011404435623020754 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_MODULES_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure Decs: DECS structure Env: ELABORATE_ENV sharing Ast = Env.Ast sharing Ast.Tyvar = CoreML.Tyvar sharing CoreML = Decs.CoreML = Env.CoreML sharing Decs = Env.Decs end signature ELABORATE_MODULES = sig include ELABORATE_MODULES_STRUCTS val elaborateTopdec: Ast.Topdec.t * {env: Env.t} -> Decs.t end mlton-20100608/mlton/elaborate/elaborate-programs.fun0000644000076600000240000000175511404435623021160 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ElaboratePrograms (S: ELABORATE_PROGRAMS_STRUCTS): ELABORATE_PROGRAMS = struct open S structure ElaborateModules = ElaborateModules (structure Ast = Ast structure CoreML = CoreML structure Decs = Decs structure Env = Env) fun elaborateProgram (program, {env = E: Env.t}) = let val Ast.Program.T decs = Ast.Program.coalesce program fun elabTopdec d = ElaborateModules.elaborateTopdec (d, {env = E}) in List.fold (decs, Decs.empty, fn (ds, decs) => List.fold (ds, decs, fn (d, decs) => Decs.append (decs, elabTopdec d))) end end mlton-20100608/mlton/elaborate/elaborate-programs.sig0000644000076600000240000000132511404435623021143 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_PROGRAMS_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure Decs: DECS structure Env: ELABORATE_ENV sharing Ast = Env.Ast sharing Ast.Tyvar = CoreML.Tyvar sharing CoreML = Decs.CoreML = Env.CoreML sharing Decs = Env.Decs end signature ELABORATE_PROGRAMS = sig include ELABORATE_PROGRAMS_STRUCTS val elaborateProgram: Ast.Program.t * {env: Env.t} -> Decs.t end mlton-20100608/mlton/elaborate/elaborate-sigexp.fun0000644000076600000240000004550011404435623020621 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ElaborateSigexp (S: ELABORATE_SIGEXP_STRUCTS): ELABORATE_SIGEXP = struct open S local open Ast in structure Atype = Type structure DatBind = DatBind structure DatatypeRhs = DatatypeRhs structure Equation = Equation structure Longtycon = Longtycon structure Sigexp = Sigexp structure Sigid = Sigid structure SortedRecord = SortedRecord structure Spec = Spec structure TypBind = TypBind structure Tyvar = Tyvar end local open Env in structure Interface = Interface end structure StructureEnv = Env structure Env = Env.InterfaceEnv local open Interface in structure AdmitsEquality = AdmitsEquality structure Cons = Cons structure Kind = Kind structure Scheme = Scheme structure Status = Status structure Tycon = Tycon structure Type = Type structure TypeStr = TypeStr end fun elaborateType (ty: Atype.t, E: Env.t): Tyvar.t vector * Type.t = let val tyvars = ref [] fun loop (ty: Atype.t): Type.t = case Atype.node ty of Atype.Var a => (* rule 44 *) Type.var (case List.peek (!tyvars, fn a' => Tyvar.sameName (a, a')) of NONE => (List.push (tyvars, a); a) | SOME a => a) | Atype.Con (c, ts) => (* rules 46, 47 *) let val ts = Vector.map (ts, loop) fun normal () = case Env.lookupLongtycon (E, c) of NONE => Type.bogus | SOME s => let val kind = TypeStr.kind s val numArgs = Vector.length ts in if (case kind of Kind.Arity n => n = numArgs | Kind.Nary => true) then TypeStr.apply (s, ts) else let open Layout val () = Control.error (Atype.region ty, seq [str "type constructor ", Ast.Longtycon.layout c, str " given ", Int.layout numArgs, str (if numArgs = 1 then " argument" else " arguments"), str " but wants ", Kind.layout kind], empty) in Type.bogus end end in case (Ast.Longtycon.split c, Vector.length ts) of (([], c), 2) => if Ast.Tycon.equals (c, Ast.Tycon.arrow) then Type.arrow (Vector.sub (ts, 0), Vector.sub (ts, 1)) else normal () | _ => normal () end | Atype.Record r => (* rules 45, 49 *) Type.record (SortedRecord.map (r, loop)) val ty = loop ty in (Vector.fromList (!tyvars), ty) end val elaborateType = Trace.trace ("ElaborateSigexp.elaborateType", Atype.layout o #1, Type.layout o #2) elaborateType fun elaborateScheme (tyvars: Tyvar.t vector, ty: Atype.t, E): Scheme.t = let val (tyvars', ty) = elaborateType (ty, E) val unbound = Vector.keepAll (tyvars', fn a => not (Vector.exists (tyvars, fn a' => Tyvar.sameName (a, a')))) val ty = if 0 = Vector.length unbound then ty else let open Layout val () = Control.error (Tyvar.region (Vector.sub (tyvars', 0)), seq [str (concat ["undefined type variable", if Vector.length unbound > 1 then "s" else "", ": "]), seq (separate (Vector.toListMap (unbound, Tyvar.layout), ", "))], empty) fun var a = if Vector.exists (unbound, fn a' => Tyvar.equals (a, a')) then Type.bogus else Type.var a in Type.hom (ty, {con = Type.con, record = Type.record, var = var}) end (* Need to get the representatives that were chosen when elaborating the * type. *) val tyvars = Vector.map (tyvars, fn a => case Vector.peek (tyvars', fn a' => Tyvar.sameName (a, a')) of NONE => a | SOME a' => a') in Scheme.make (tyvars, ty) end fun elaborateTypedescs (typedescs: {tycon: Ast.Tycon.t, tyvars: Tyvar.t vector} vector, {equality: bool}, E): unit = Vector.foreach (typedescs, fn {tycon = name, tyvars} => let val kind = Kind.Arity (Vector.length tyvars) val tycon = Tycon.make {hasCons = false, kind = kind} val _ = Tycon.admitsEquality tycon := (if equality then AdmitsEquality.Sometimes else AdmitsEquality.Never) in Env.extendTycon (E, name, TypeStr.tycon (tycon, kind)) end) fun elaborateDatBind (datBind: DatBind.t, E): unit = let val DatBind.T {datatypes, ...} = DatBind.node datBind (* Build enough of an interface so that that the constructor argument * types can be elaborated. *) val datatypes = Vector.map (datatypes, fn {cons, tycon = name, tyvars} => let val kind = Kind.Arity (Vector.length tyvars) val tycon = Tycon.make {hasCons = true, kind = kind} val _ = Env.extendTycon (E, name, TypeStr.tycon (tycon, kind)) in {cons = cons, kind = kind, name = name, tycon = tycon, tyvars = tyvars} end) val datatypes = Vector.map (datatypes, fn {cons, kind, name, tycon, tyvars, ...} => let val resultType: Atype.t = Atype.con (name, Vector.map (tyvars, Atype.var)) val (consSchemes, consArgs) = Vector.unzip (Vector.map (cons, fn (name, arg) => let val (makeArg, ty) = case arg of NONE => (fn _ => NONE, resultType) | SOME t => (fn s => SOME (#1 (Type.deArrow (Scheme.ty s))), Atype.arrow (t, resultType)) val scheme = elaborateScheme (tyvars, ty, E) in ({name = name, scheme = scheme}, {con = name, arg = makeArg scheme}) end)) in {consArgs = consArgs, consSchemes = consSchemes, kind = kind, name = name, tycon = tycon, tyvars = tyvars} end) val _ = Env.allowDuplicates := true val _ = Vector.foreach (datatypes, fn {consSchemes, kind, name, tycon, ...} => let val _ = Vector.foreach (consSchemes, fn {name, scheme} => Env.extendCon (E, name, scheme)) val _ = Env.extendTycon (E, name, TypeStr.data (tycon, kind, Cons.T consSchemes)) in () end) val _ = Env.allowDuplicates := false (* Maximize equality *) val change = ref false fun loop () = let val _ = Vector.foreach (datatypes, fn {consArgs, tycon, tyvars, ...} => let val r = Tycon.admitsEquality tycon datatype z = datatype AdmitsEquality.t in case !r of Always => Error.bug "ElaborateSigexp.elaborateDatBind: Always" | Never => () | Sometimes => if Vector.forall (consArgs, fn {arg, ...} => case arg of NONE => true | SOME ty => Scheme.admitsEquality (Scheme.make (tyvars, ty))) then () else (r := Never; change := true) end) in if !change then (change := false; loop ()) else () end val _ = loop () in () end val traceElaborateSigexp = Trace.trace2 ("ElaborateSigexp.elaborateSigexp", Sigexp.layout, fn {isTop} => Layout.record [("isTop", Bool.layout isTop)], Option.layout Interface.layout) val info' = Trace.info "ElaborateSigexp.elaborateSpec" (* rule 65 *) fun elaborateSigexp (sigexp: Sigexp.t, {env = E: StructureEnv.t}): Interface.t option = let val _ = Interface.renameTycons := (fn () => StructureEnv.setTyconNames E) val E = StructureEnv.makeInterfaceEnv E fun elaborateSigexp arg : Interface.t option = traceElaborateSigexp (fn (sigexp: Sigexp.t, {isTop}) => case Sigexp.node sigexp of Sigexp.Spec spec => (* rule 62 *) SOME (#1 (Env.makeInterface (E, {isTop = isTop}, fn () => elaborateSpec spec))) | Sigexp.Var x => (* rule 63 *) Option.map (Env.lookupSigid (E, x), Interface.copy) | Sigexp.Where (sigexp, wheres) => (* rule 64 *) let val time = Interface.Time.tick () in Option.map (elaborateSigexp (sigexp, {isTop = false}), fn I => let val _ = Vector.foreach (wheres, fn {longtycon, ty, tyvars} => Option.app (Interface.lookupLongtycon (I, longtycon, Longtycon.region longtycon, {prefix = []}), fn s => TypeStr.wheree (s, Longtycon.region longtycon, fn () => Longtycon.layout longtycon, time, TypeStr.def (elaborateScheme (tyvars, ty, E), Kind.Arity (Vector.length tyvars))))) in I end) end) arg and elaborateSpec arg : unit = Trace.traceInfo' (info', Spec.layout, Layout.ignore) (fn spec: Spec.t => case Spec.node spec of Spec.Datatype rhs => (* rules 71, 72 *) (case DatatypeRhs.node rhs of DatatypeRhs.DatBind b => elaborateDatBind (b, E) | DatatypeRhs.Repl {lhs, rhs} => Option.app (Env.lookupLongtycon (E, rhs), fn s => let val _ = Env.extendTycon (E, lhs, s) val Cons.T v = TypeStr.cons s val _ = Vector.foreach (v, fn {name, scheme} => Env.extendCon (E, name, scheme)) in () end)) | Spec.Empty => (* rule 76 *) () | Spec.Eqtype typedescs => (* rule 70 *) elaborateTypedescs (typedescs, {equality = true}, E) | Spec.Exception cons => (* rule 73 *) Vector.foreach (cons, fn (name: Ast.Con.t, arg: Ast.Type.t option) => let val ty = case arg of NONE => Type.exn | SOME t => let val t = Scheme.ty (elaborateScheme (Vector.new0 (), t, E)) in Type.arrow (t, Type.exn) end val scheme = Scheme.make (Vector.new0 (), ty) val _ = Env.extendExn (E, name, scheme) in () end) | Spec.IncludeSigexp sigexp => (* rule 75 *) Option.app (elaborateSigexp (sigexp, {isTop = false}), fn I => Env.openInterface (E, I, Sigexp.region sigexp)) | Spec.IncludeSigids sigids => (* Appendix A, p.59 *) Vector.foreach (sigids, fn x => Option.app (Env.lookupSigid (E, x), fn I => Env.openInterface (E, Interface.copy I, Sigid.region x))) | Spec.Seq (s, s') => (* rule 77 *) (elaborateSpec s; elaborateSpec s') | Spec.Sharing {equations, spec} => (* rule 78 and section G.3.3 *) let val time = Interface.Time.tick () val () = elaborateSpec spec val () = Vector.foreach (equations, fn eqn => case Equation.node eqn of Equation.Structure ss => let (* The following implements the "all pairs" * sharing as specified in G.3.3. *) fun loop Is = case Is of [] => () | (s, I) :: Is => List.foreach (Is, fn (s', I') => Interface.share (I, s, I', s', time)) in loop (List.fold (ss, [], fn (s, ac) => case Env.lookupLongstrid (E, s) of NONE => ac | SOME I => (s, I) :: ac)) end | Equation.Type cs => ignore (List.fold (cs, NONE, fn (c', so) => case (so, Env.lookupLongtycon (E, c')) of (NONE, NONE) => NONE | (SOME _, NONE) => so | (NONE, SOME s') => SOME (c', s') | (SOME (c, s), SOME s') => let fun doit (c, s) = (s, Longtycon.region c, fn () => Longtycon.layout c) val _ = TypeStr.share (doit (c, s), doit (c', s'), time) in SOME (c', s') end))) in () end | Spec.Structure ss => (* rules 74, 84 *) Vector.foreach (ss, fn (strid, sigexp) => Env.extendStrid (E, strid, case elaborateSigexp (sigexp, {isTop = false}) of NONE => Interface.empty | SOME I => I)) | Spec.Type typedescs => (* rule 69 *) elaborateTypedescs (typedescs, {equality = false}, E) | Spec.TypeDefs typBind => (* Abbreviation on page 59 combined with rules 77 and 80. *) let val TypBind.T ds = TypBind.node typBind in Vector.foreach (ds, fn {def, tycon, tyvars} => Env.extendTycon (E, tycon, TypeStr.def (elaborateScheme (tyvars, def, E), Kind.Arity (Vector.length tyvars)))) end | Spec.Val xts => (* rules 68, 79 *) Vector.foreach (xts, fn (x, t) => Env.extendVid (E, Ast.Vid.fromVar x, Status.Var, Scheme.make (elaborateType (t, E)))) ) arg in elaborateSigexp (sigexp, {isTop = true}) end val elaborateSigexp = fn (sigexp, {env = E}) => case Sigexp.node sigexp of Sigexp.Var x => StructureEnv.lookupSigid (E, x) | _ => elaborateSigexp (sigexp, {env = E}) val elaborateSigexp = Trace.trace2 ("ElaborateSigexp.elaborateSigexp", Sigexp.layout, Layout.ignore, Layout.ignore) elaborateSigexp structure Env = StructureEnv end mlton-20100608/mlton/elaborate/elaborate-sigexp.sig0000644000076600000240000000110111404435623020600 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_SIGEXP_STRUCTS = sig structure Ast: AST structure Env: ELABORATE_ENV sharing Ast = Env.Ast end signature ELABORATE_SIGEXP = sig include ELABORATE_SIGEXP_STRUCTS val elaborateSigexp: Ast.Sigexp.t * {env: Env.t} -> Env.Interface.t option end mlton-20100608/mlton/elaborate/elaborate.fun0000644000076600000240000000146011404435623017321 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Elaborate (S: ELABORATE_STRUCTS): ELABORATE = struct open S structure Env = ElaborateEnv (structure Ast = Ast structure CoreML = CoreML structure TypeEnv = TypeEnv) local open Env in structure Decs = Decs end structure ElaborateMLBs = ElaborateMLBs (structure Ast = Ast structure CoreML = CoreML structure Decs = Decs structure Env = Env) open ElaborateMLBs end mlton-20100608/mlton/elaborate/elaborate.sig0000644000076600000240000000152211404435623017312 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ELABORATE_STRUCTS = sig structure Ast: AST structure CoreML: CORE_ML structure TypeEnv: TYPE_ENV sharing Ast.Record = CoreML.Record sharing Ast.SortedRecord = CoreML.SortedRecord sharing Ast.Tyvar = CoreML.Tyvar sharing CoreML.Atoms = TypeEnv.Atoms sharing CoreML.Type = TypeEnv.Type end signature ELABORATE = sig include ELABORATE_STRUCTS structure Env: ELABORATE_ENV val elaborateMLB: Ast.Basdec.t * {addPrim: Env.t -> CoreML.Dec.t list} -> Env.t * (CoreML.Dec.t list * bool) vector end mlton-20100608/mlton/elaborate/interface.fun0000644000076600000240000012057211404435623017331 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Interface (S: INTERFACE_STRUCTS): INTERFACE = struct open S local open Ast in structure Longstrid = Longstrid structure Longtycon = Longtycon structure Record = SortedRecord structure Strid = Strid structure Tyvar = Tyvar structure Vid = Vid end structure Field = Record.Field structure EtypeStr = EnvTypeStr local open EtypeStr in structure AdmitsEquality = AdmitsEquality structure Kind = Kind structure Etycon = Tycon end structure Set = DisjointSet structure Status: sig datatype t = Con | Exn | Var val layout: t -> Layout.t val toString: t -> string end = struct datatype t = Con | Exn | Var val toString = fn Con => "Con" | Exn => "Exn" | Var => "Var" val layout = Layout.str o toString end (* only needed for debugging *) structure TyconId = IntUniqueId () structure Defn = struct type t = exn end structure Time:> sig type t val < : t * t -> bool val current: unit -> t val layout: t -> Layout.t val min: t * t -> t val tick: unit -> t end = struct type t = int val op < = Int.< val layout = Int.layout val min = Int.min val currentTime: int ref = ref 0 fun current () = !currentTime fun tick () = let val n = 1 + !currentTime val _ = currentTime := n in n end end structure FlexibleTycon = struct (* hasCons is true if this tycon occurs in any type structure where the * cons are nonempty. This allows us to do a quick check of the side * condition on rule 64 that requires all type structures to be well-formed * when implementing "where type". *) datatype t = T of {admitsEquality: AdmitsEquality.t ref, copy: copy, creationTime: Time.t, defn: exn ref, hasCons: bool, id: TyconId.t, kind: Kind.t, plist: PropertyList.t} Set.t withtype copy = t option ref fun fields (T s) = Set.! s local fun make f = f o fields in val admitsEquality = make #admitsEquality val defn = ! o make #defn val plist = make #plist end fun dest (T s) = let val {admitsEquality, hasCons, kind, ...} = Set.! s in {admitsEquality = !admitsEquality, hasCons = hasCons, kind = kind} end val equals = fn (T s, T s') => Set.equals (s, s') fun layout (T s) = let open Layout val {admitsEquality, creationTime, hasCons, id, ...} = Set.! s in record [("admitsEquality", AdmitsEquality.layout (!admitsEquality)), ("creationTime", Time.layout creationTime), ("hasCons", Bool.layout hasCons), ("id", TyconId.layout id)] end fun layoutApp (t, _) = (layout t, ({isChar = false}, Etycon.BindingStrength.unit)) val copies: copy list ref = ref [] fun new {defn: Defn.t, hasCons: bool, kind: Kind.t}: t = T (Set.singleton {admitsEquality = ref AdmitsEquality.Sometimes, copy = ref NONE, creationTime = Time.current (), defn = ref defn, hasCons = hasCons, id = TyconId.new (), kind = kind, plist = PropertyList.new ()}) end structure Tycon = struct datatype t = Flexible of FlexibleTycon.t | Rigid of Etycon.t * Kind.t val fromEnv: Etycon.t * Kind.t -> t = Rigid fun admitsEquality c = case c of Flexible f => FlexibleTycon.admitsEquality f | Rigid (e, _) => Etycon.admitsEquality e val arrow = fromEnv (Etycon.arrow, Kind.Arity 2) val equals = fn (Flexible f, Flexible f') => FlexibleTycon.equals (f, f') | (Rigid (c, _), Rigid (c', _)) => Etycon.equals (c, c') | _ => false val exn = Rigid (Etycon.exn, Kind.Arity 0) val layout = fn Flexible c => FlexibleTycon.layout c | Rigid (c, _) => Etycon.layout c fun layoutApp (t: t, v) = case t of Flexible f => FlexibleTycon.layoutApp (f, v) | Rigid (c, _) => Etycon.layoutApp (c, v) val tuple = Rigid (Etycon.tuple, Kind.Nary) end structure Type = struct datatype t = Con of Tycon.t * t vector | Record of t Record.t | Var of Tyvar.t fun arrow (t1, t2) = Con (Tycon.arrow, Vector.new2 (t1, t2)) val bogus = Con (Tycon.exn, Vector.new0 ()) val con = Con fun deArrowOpt (t: t): (t * t) option = case t of Con (c, ts) => if Tycon.equals (c, Tycon.arrow) then SOME (Vector.sub (ts, 0), Vector.sub (ts, 1)) else NONE | _ => NONE fun deArrow t = case deArrowOpt t of NONE => Error.bug "Interface.Type.deArrow" | SOME z => z fun deEta (t: t, tyvars: Tyvar.t vector): Tycon.t option = case t of Con (c, ts) => if Vector.length ts = Vector.length tyvars andalso Vector.foralli (ts, fn (i, t) => case t of Var a => Tyvar.equals (a, Vector.sub (tyvars, i)) | _ => false) then SOME c else NONE | _ => NONE val exn = Con (Tycon.exn, Vector.new0 ()) fun hom (t, {con, record, var}) = let val rec loop = fn Con (c, ts) => con (c, Vector.map (ts, loop)) | Record r => record (Record.map (r, loop)) | Var a => var a in loop t end local open Layout fun simple l = (l, ({isChar = false}, Etycon.BindingStrength.unit)) fun loop t = case t of Con (c, ts) => Tycon.layoutApp (c, Vector.map (ts, loop)) | Record r => (case Record.detupleOpt r of NONE => simple (seq [str "{", mayAlign (separateRight (Vector.toListMap (QuickSort.sortVector (Record.toVector r, fn ((f, _), (f', _)) => Field.<= (f, f')), fn (f, t) => seq [Field.layout f, str ": ", #1 (loop t)]), ",")), str "}"]) | SOME ts => Tycon.layoutApp (Tycon.tuple, Vector.map (ts, loop))) | Var a => simple (Tyvar.layout a) in val layout = #1 o loop end val record = Record fun substitute (t: t, sub: (Tyvar.t * t) vector): t = let fun var a = case Vector.peek (sub, fn (a', _) => Tyvar.equals (a, a')) of NONE => Error.bug "Interface.Type.substitute" | SOME (_, t) => t in hom (t, {con = Con, record = Record, var = var}) end val var = Var end structure Scheme = GenericScheme (structure Type = Type structure Tyvar = Tyvar) structure Scheme = struct open Scheme fun dest (T {ty, tyvars}) = (tyvars, ty) fun make (tyvars, ty) = T {ty = ty, tyvars = tyvars} end structure Cons = struct datatype t = T of {name: Ast.Con.t, scheme: Scheme.t} vector val empty = T (Vector.new0 ()) fun layout (T v) = Vector.layout (fn {name, scheme} => let open Layout in seq [Ast.Con.layout name, str ": ", Scheme.layout scheme] end) v end structure TypeStr = struct datatype node = Datatype of {cons: Cons.t, tycon: Tycon.t} | Scheme of Scheme.t | Tycon of Tycon.t datatype t = T of {kind: Kind.t, node: node} local fun make f (T r) = f r in val kind = make #kind val node = make #node end fun layout t = let open Layout in case node t of Datatype {tycon, cons} => seq [str "Datatype ", record [("tycon", Tycon.layout tycon), ("cons", Cons.layout cons)]] | Scheme s => Scheme.layout s | Tycon t => seq [str "Tycon ", Tycon.layout t] end fun apply (t: t, tys: Type.t vector): Type.t = case node t of Datatype {tycon, ...} => Type.con (tycon, tys) | Scheme s => Scheme.apply (s, tys) | Tycon t => Type.con (t, tys) fun cons t = case node t of Datatype {cons, ...} => cons | _ => Cons.empty fun data (tycon, kind, cons) = T {kind = kind, node = Datatype {tycon = tycon, cons = cons}} fun def (s: Scheme.t, k: Kind.t) = let val (tyvars, ty) = Scheme.dest s in T {kind = k, node = (case Type.deEta (ty, tyvars) of NONE => Scheme s | SOME c => Tycon c)} end fun toTyconOpt s = case node s of Datatype {tycon, ...} => SOME tycon | Scheme _ => NONE | Tycon c => SOME c fun tycon (c, kind) = T {kind = kind, node = Tycon c} end structure Defn = struct open Defn datatype dest = Realized of EtypeStr.t option | TypeStr of TypeStr.t | Undefined exception U of dest val realized = U o Realized val typeStr = U o TypeStr val undefined = U Undefined fun dest (d: t): dest = case d of U u => u | _ => Error.bug "Interface.Defn.dest" end (* expandTy expands all type definitions in ty *) local fun con (c, ts) = case c of Tycon.Flexible f => (case Defn.dest (FlexibleTycon.defn f) of Defn.Realized _ => Error.bug "Interface.expandTy: Realized" | Defn.TypeStr s => expandTy (TypeStr.apply (s, ts)) | Defn.Undefined => Type.Con (c, ts)) | Tycon.Rigid _ => Type.Con (c, ts) and expandTy (ty: Type.t): Type.t = Type.hom (ty, {con = con, record = Type.Record, var = Type.Var}) in val expandTy = expandTy end fun copyCons (Cons.T v): Cons.t = Cons.T (Vector.map (v, fn {name, scheme} => {name = name, scheme = copyScheme scheme})) and copyDefn (d: Defn.t): Defn.t = let open Defn in case dest d of Realized _ => (* This will never happen in a type-correct program, but it may * in a type-incorrect one. So, we return d to avoid terminating * MLton. *) d | TypeStr s => Defn.typeStr (copyTypeStr s) | Undefined => Defn.undefined end and copyFlexibleTycon (FlexibleTycon.T s): FlexibleTycon.t = let open FlexibleTycon val {admitsEquality = a, copy, defn, hasCons, kind, ...} = Set.! s in case !copy of NONE => let val c = new {defn = copyDefn (!defn), hasCons = hasCons, kind = kind} val _ = admitsEquality c := !a val _ = List.push (copies, copy) val _ = copy := SOME c in c end | SOME c => c end and copyTycon (t: Tycon.t): Tycon.t = let open Tycon in case t of Flexible c => Flexible (copyFlexibleTycon c) | Rigid _ => t end and copyType (t: Type.t): Type.t = let open Type in hom (t, {con = fn (c, ts) => Con (copyTycon c, ts), record = Record, var = Var}) end and copyScheme (Scheme.T {tyvars, ty}): Scheme.t = Scheme.T {ty = copyType ty, tyvars = tyvars} and copyTypeStr (s: TypeStr.t): TypeStr.t = let open TypeStr val kind = kind s in case node s of Datatype {cons, tycon} => data (copyTycon tycon, kind, copyCons cons) | Scheme s => def (copyScheme s, kind) | Tycon c => tycon (copyTycon c, kind) end structure AdmitsEquality = struct open AdmitsEquality fun fromBool b = if b then Sometimes else Never end fun flexibleTyconAdmitsEquality (FlexibleTycon.T s): AdmitsEquality.t = let val {admitsEquality, defn, ...} = Set.! s datatype z = datatype Defn.dest in case Defn.dest (!defn) of Realized _ => Error.bug "Interface.flexibleTyconAdmitsEquality: Realized" | TypeStr s => typeStrAdmitsEquality s | Undefined => !admitsEquality end and schemeAdmitsEquality (s: Scheme.t): bool = let fun con (c, bs) = let datatype z = datatype AdmitsEquality.t in case ! (Tycon.admitsEquality c) of Always => true | Never => false | Sometimes => Vector.forall (bs, fn b => b) end in Type.hom (expandTy (Scheme.ty s), {con = con, record = fn r => Record.forall (r, fn b => b), var = fn _ => true}) end and tyconAdmitsEquality (t: Tycon.t): AdmitsEquality.t = let datatype z = datatype Tycon.t in case t of Flexible c => flexibleTyconAdmitsEquality c | Rigid (e, _) => ! (Etycon.admitsEquality e) end and typeStrAdmitsEquality (s: TypeStr.t): AdmitsEquality.t = let datatype z = datatype TypeStr.node in case TypeStr.node s of Datatype {tycon = c, ...} => tyconAdmitsEquality c | Scheme s => AdmitsEquality.fromBool (schemeAdmitsEquality s) | Tycon c => tyconAdmitsEquality c end structure FlexibleTycon = struct open FlexibleTycon fun realize (T s, typeStr) = let val {defn, ...} = Set.! s in case Defn.dest (!defn) of Defn.Undefined => defn := Defn.realized typeStr | _ => Error.bug "Interface.FlexibleTycon.realize" end fun share (T s, T s') = let val {admitsEquality = a, creationTime = t, hasCons = h, id, kind, plist, ...} = Set.! s val {admitsEquality = a', creationTime = t', hasCons = h', ...} = Set.! s' val _ = Set.union (s, s') val _ = Set.:= (s, {admitsEquality = ref (AdmitsEquality.or (!a, !a')), copy = ref NONE, creationTime = Time.min (t, t'), defn = ref Defn.undefined, hasCons = h orelse h', id = id, kind = kind, plist = plist}) in () end type typeStr = TypeStr.t datatype realization = ETypeStr of EnvTypeStr.t option | TypeStr of typeStr fun realization (f: t): realization = case Defn.dest (defn f) of Defn.Realized s => ETypeStr s | Defn.TypeStr s => TypeStr s | _ => Error.bug "Interface.FlexibleTycon.realization" end structure Tycon = struct open Tycon fun make {hasCons, kind} = Flexible (FlexibleTycon.new {defn = Defn.undefined, hasCons = hasCons, kind = kind}) end structure Scheme = struct open Scheme val admitsEquality = schemeAdmitsEquality val copy = copyScheme end val renameTycons = ref (fn () => ()) structure TypeStr = struct open TypeStr val admitsEquality = typeStrAdmitsEquality val copy = copyTypeStr fun getFlex (s: t, time, oper, reg, lay): FlexibleTycon.t option = let fun error what = let open Layout val _ = Control.error (reg, seq [str "type ", lay (), str (concat [" is ", what, " and cannot be ", oper])], empty) in NONE end fun loop (s: t): FlexibleTycon.t option = case node s of Datatype {tycon, ...} => loopTycon tycon | Scheme (Scheme.T {ty, tyvars}) => (case Type.deEta (expandTy ty, tyvars) of NONE => error "a definition" | SOME c => loopTycon c) | Tycon c => loopTycon c and loopTycon (c: Tycon.t): FlexibleTycon.t option = case c of Tycon.Flexible c => let val {creationTime, defn, ...} = FlexibleTycon.fields c in case Defn.dest (!defn) of Defn.Realized _ => Error.bug "Interface.TypeStr.loopTycon: Realized" | Defn.TypeStr s => loop s | Defn.Undefined => if Time.< (creationTime, time) then error "not local" else SOME c end | Tycon.Rigid (c, _) => (! renameTycons () ; error (concat ["already defined as ", Layout.toString (Etycon.layout c)])) in loop s end fun share ((s: t, reg, lay), (s': t, reg', lay'), time: Time.t): unit = let val oper = "shared" val k = kind s val k' = kind s' in if not (Kind.equals (k, k')) then let open Layout in Control.error (reg, seq [str "type ", lay (), str " has arity ", Kind.layout k, str " and type ", lay' (), str " has arity ", Kind.layout k', str " and cannot be shared"], empty) end else case (getFlex (s, time, oper, reg, lay), getFlex (s', time, oper, reg', lay')) of (SOME f, SOME f') => FlexibleTycon.share (f, f') | _ => () end val share = Trace.trace ("Interface.TypeStr.share", fn ((s, _, _), (s', _, _), t) => Layout.tuple [layout s, layout s', Time.layout t], Unit.layout) share fun wheree (s': t, r: Region.t, lay, time: Time.t, s: t): unit = case getFlex (s', time, "redefined", r, lay) of NONE => () | SOME flex => let val k = kind s val k' = kind s' in if not (Kind.equals (k, k')) then let open Layout in Control.error (r, seq [str "type ", lay (), str " has arity ", Kind.layout k', str " and cannot be defined to have arity ", Kind.layout k], empty) end else if (admitsEquality s' = AdmitsEquality.Sometimes andalso admitsEquality s = AdmitsEquality.Never) then let open Layout in Control.error (r, seq [str "eqtype ", lay (), str " cannot be defined as a non-equality type"], empty) end else let val {defn, hasCons, ...} = FlexibleTycon.fields flex in if hasCons andalso (case node s of Scheme (Scheme.T {ty, tyvars}) => Option.isNone (Type.deEta (expandTy ty, tyvars)) | _ => false) then let open Layout in Control.error (r, seq [str "type ", lay (), str " is a datatype and cannot be redefined as a complex type"], empty) end else defn := Defn.typeStr s end end val wheree = Trace.trace ("Interface.TypeStr.wheree", fn (s, _, _, t, s') => Layout.tuple [layout s, Time.layout t, layout s'], Unit.layout) wheree end structure UniqueId = IntUniqueId () structure TyconMap = struct datatype 'a t = T of {strs: (Strid.t * 'a t) array, types: (Ast.Tycon.t * 'a) array} fun layout layoutA = let open Layout fun loop (T {strs, types}) = record [("strs", Array.layout (Layout.tuple2 (Strid.layout, loop)) strs), ("types", Array.layout (Layout.tuple2 (Ast.Tycon.layout, layoutA)) types)] in loop end fun empty (): 'a t = T {strs = Array.new0 (), types = Array.new0 ()} fun isEmpty (T {strs, types}) = 0 = Array.length strs andalso 0 = Array.length types end (*---------------------------------------------------*) (* Main Datatype *) (*---------------------------------------------------*) datatype t = T of {copy: copy, flexible: FlexibleTycon.t TyconMap.t option ref, isClosed: bool, original: t option, plist: PropertyList.t, strs: (Strid.t * t) array, types: (Ast.Tycon.t * TypeStr.t) array, uniqueId: UniqueId.t, vals: (Ast.Vid.t * (Status.t * Scheme.t)) array} Set.t withtype copy = t option ref fun dest (T s) = Set.! s local fun make f = f o dest in val plist = make #plist end fun original I = case #original (dest I) of NONE => I | SOME I => I fun new {isClosed, strs, types, vals} = T (Set.singleton {copy = ref NONE, flexible = ref NONE, isClosed = isClosed, original = NONE, plist = PropertyList.new (), strs = strs, types = types, uniqueId = UniqueId.new (), vals = vals}) val empty = new {isClosed = true, strs = Array.new0 (), types = Array.new0 (), vals = Array.new0 ()} local open Layout in fun layout (T s) = let val {strs, types, uniqueId = u, vals, ...} = Set.! s in record [("uniqueId", UniqueId.layout u), ("strs", Array.layout (Layout.tuple2 (Strid.layout, layout)) strs), ("types", Array.layout (Layout.tuple2 (Ast.Tycon.layout, TypeStr.layout)) types), ("vals", Array.layout (Layout.tuple2 (Vid.layout, Layout.tuple2 (Status.layout, Scheme.layout))) vals)] end end fun equals (T s, T s') = Set.equals (s, s') val equals = Trace.trace2 ("Interface.equals", layout, layout, Bool.layout) equals fun sameShape (I, I') = case (#original (dest I), #original (dest I')) of (SOME I, SOME I') => equals (I, I') | _ => false fun peekStrid (T s, strid: Strid.t): t option = let val {strs, ...} = Set.! s in Array.peekMap (strs, fn (strid', I) => if Strid.equals (strid, strid') then SOME I else NONE) end datatype 'a peekResult = Found of 'a | UndefinedStructure of Strid.t list fun peekStrids (I: t, strids: Strid.t list): t peekResult = let fun loop (I, strids, ac) = case strids of [] => Found I | strid :: strids => case peekStrid (I, strid) of NONE => UndefinedStructure (rev (strid :: ac)) | SOME I => loop (I, strids, strid :: ac) in loop (I, strids, []) end fun peekTycon (T s, tycon: Ast.Tycon.t): TypeStr.t option = let val {types, ...} = Set.! s in Array.peekMap (types, fn (name, typeStr) => if Ast.Tycon.equals (tycon, name) then SOME typeStr else NONE) end fun unbound (r: Region.t, className, x: Layout.t): unit = Control.error (r, let open Layout in seq [str "undefined ", str className, str " ", x] end, Layout.empty) fun layoutStrids (ss: Strid.t list): Layout.t = Layout.str (concat (List.separate (List.map (ss, Strid.toString), "."))) fun lookupLongtycon (I: t, long: Longtycon.t, r: Region.t, {prefix: Strid.t list}) = let val (ss, c) = Longtycon.split long in case peekStrids (I, ss) of Found I => (case peekTycon (I, c) of NONE => (unbound (r, "type", Longtycon.layout (Longtycon.long (prefix @ ss, c))) ; NONE) | SOME s => SOME s) | UndefinedStructure ss => (unbound (r, "structure", layoutStrids (prefix @ ss)) ; NONE) end fun share (I: t, ls: Longstrid.t, I': t, ls': Longstrid.t, time): unit = let fun lay (s, ls, strids, name) = (s, Longstrid.region ls, fn () => let val (ss, s) = Longstrid.split ls in Ast.Longtycon.layout (Ast.Longtycon.long (List.concat [ss, [s], rev strids], name)) end) fun ensureFlexible (I: t, strids): unit = let val {get: t -> bool ref, destroy, ...} = Property.destGet (plist, Property.initFun (fn _ => ref false)) fun loop (I: t, strids): unit = let val r = get I in if !r then () else let val _ = r := true val T s = I val {strs, types, ...} = Set.! s val _ = Array.foreach (strs, fn (strid, I) => ensureFlexible (I, strid :: strids)) val _ = Array.foreach (types, fn (name, s) => let val (_, r, lay) = lay (s, ls, strids, name) val _ = TypeStr.getFlex (s, time, "shared", r, lay) in () end) in () end end val () = loop (I, strids) val _ = destroy () in () end fun share (I, I', strids): unit = if equals (I, I') then ensureFlexible (I, strids) else if sameShape (I, I') then let fun loop (T s, T s', strids): unit = let val {isClosed, strs, types, ...} = Set.! s val {strs = strs', types = types', ...} = Set.! s' val _ = (* Can't always union here. I and I' may have * exactly the same shape, but may have free * flxible tycons defined in other signatures that * are different. * However, if the interface is closed, that is, if * all of the flexible tycons that appear in it are * also defined in it, then sharing the structures * implies that the structures are identical. This * also relies on the fact that the structures have * the same shape, which means that they are copies * of the same interface. That is sufficient to * guarantee that all rigid tycons are identical. *) if isClosed then Set.union (s, s') else () val _ = Array.foreach2 (types, types', fn ((name, s), (_, s')) => TypeStr.share (lay (s, ls, strids, name), lay (s', ls', strids, name), time)) val _ = Array.foreach2 (strs, strs', fn ((name, I), (_, I')) => loop (I, I', name :: strids)) in () end in loop (I, I', strids) end else (* different shapes -- need to share pointwise *) let val T s = I val T s' = I' val {strs, types, ...} = Set.! s val {strs = strs', types = types', ...} = Set.! s' fun walk2 (a, a', compareNames, f: 'a * 'a * 'b -> unit) = let val n = Array.length a val n' = Array.length a' fun both (i, i') = if i < n andalso i' < n' then compare (i, Array.sub (a, i), i', Array.sub (a', i')) else () and compare (i, (name, z), i', (name', z')) = case compareNames (name, name') of GREATER => let val i' = i' + 1 in if i' < n' then compare (i, (name, z), i', Array.sub (a', i')) else () end | EQUAL => (f (z, z', name) ; both (i + 1, i' + 1)) | LESS => let val i = i + 1 in if i < n then compare (i, Array.sub (a, i), i', (name', z')) else () end in both (0, 0) end val _ = walk2 (strs, strs', Strid.compare, fn (I, I', name) => share (I, I', name :: strids)) val _ = walk2 (types, types', Ast.Tycon.compare, fn (s, s', name) => TypeStr.share (lay (s, ls, strids, name), lay (s', ls', strids, name), time)) in () end in share (I, I', []) end val share = Trace.trace ("Interface.share", fn (I, _, I', _, t) => Layout.tuple [layout I, layout I', Time.layout t], Unit.layout) share fun copy (I: t): t = let (* Keep track of all nodes that have forward pointers to copies, so * that we can gc them when done. *) val copies: copy list ref = ref [] fun loop (I as T s): t = let val r as {copy, ...} = Set.! s in case !copy of NONE => let val {isClosed, original, strs, types, vals, ...} = r val types = Array.map (types, fn (name, typeStr) => (name, TypeStr.copy typeStr)) val vals = Array.map (vals, fn (name, (status, scheme)) => (name, (status, Scheme.copy scheme))) val strs = Array.map (strs, fn (name, I) => (name, loop I)) val original = SOME (case original of NONE => I | SOME I => I) val I = T (Set.singleton {copy = ref NONE, flexible = ref NONE, isClosed = isClosed, original = original, plist = PropertyList.new (), strs = strs, types = types, uniqueId = UniqueId.new (), vals = vals}) val _ = List.push (copies, copy) val _ = copy := SOME I in I end | SOME I => I end val I = loop I fun clear copies = List.foreach (!copies, fn copy => copy := NONE) val _ = clear copies val _ = clear FlexibleTycon.copies val _ = FlexibleTycon.copies := [] in I end val copy = Trace.trace ("Interface.copy", layout, layout) copy fun flexibleTycons (I: t): FlexibleTycon.t TyconMap.t = let val {destroy = destroy1, get = tyconShortest: (FlexibleTycon.t -> {flex: FlexibleTycon.t option ref, length: int option} ref), ...} = Property.destGet (FlexibleTycon.plist, Property.initFun (fn _ => ref {flex = ref NONE, length = NONE})) val {destroy = destroy2, get = interfaceShortest: t -> int option ref, ...} = Property.destGet (plist, Property.initFun (fn _ => ref NONE)) fun loop (I: t, length: int): FlexibleTycon.t option ref TyconMap.t = let val r = interfaceShortest I in if isSome (!r) andalso length >= valOf (!r) then TyconMap.empty () else let val _ = r := SOME length val {strs, types, ...} = dest I val types = Array.map (types, fn (tycon, typeStr) => (tycon, case TypeStr.toTyconOpt typeStr of SOME (Tycon.Flexible (c as FlexibleTycon.T s)) => let val {defn, ...} = Set.! s in case Defn.dest (!defn) of Defn.Undefined => let val r = tyconShortest c in if isSome (#length (!r)) andalso length >= valOf (#length (!r)) then ref NONE else let val _ = #flex (!r) := NONE val flex = ref (SOME c) val _ = r := {flex = flex, length = SOME length} in flex end end | _ => ref NONE end | _ => ref NONE)) val strs = Array.map (strs, fn (s, I) => (s, loop (I, 1 + length))) in TyconMap.T {strs = strs, types = types} end end val tm = loop (I, 0) val _ = (destroy1 (); destroy2 ()) fun collapse (tm: FlexibleTycon.t option ref TyconMap.t) : FlexibleTycon.t TyconMap.t = let val TyconMap.T {strs, types} = tm val types = Array.keepAllMap (types, fn (c, r) => Option.map (!r, fn f => (c, f))) val strs = Array.keepAllMap (strs, fn (s, m) => let val m = collapse m in if TyconMap.isEmpty m then NONE else SOME (s, m) end) in TyconMap.T {strs = strs, types = types} end in collapse tm end val flexibleTycons = fn I as T s => let val {flexible, ...} = Set.! s in case !flexible of NONE => let val f = flexibleTycons I val _ = flexible := SOME f in f end | SOME f => f end val flexibleTycons = Trace.trace ("Interface.flexibleTycons", layout, TyconMap.layout FlexibleTycon.layout) flexibleTycons fun dest (T s) = let val {strs, types, vals, ...} = Set.! s in {strs = strs, types = types, vals = vals} end end mlton-20100608/mlton/elaborate/interface.sig0000644000076600000240000001367511404435623017330 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INTERFACE_STRUCTS = sig structure Ast: AST structure EnvTypeStr: sig structure AdmitsEquality: ADMITS_EQUALITY structure Kind: TYCON_KIND structure Tycon: sig structure BindingStrength: BINDING_STRENGTH type t val admitsEquality: t -> AdmitsEquality.t ref val arrow: t val equals: t * t -> bool val exn: t val layout: t -> Layout.t val layoutApp: t * (Layout.t * ({isChar: bool} * BindingStrength.t)) vector -> Layout.t * ({isChar: bool} * BindingStrength.t) val tuple: t end type t end end signature INTERFACE = sig include INTERFACE_STRUCTS structure AdmitsEquality: ADMITS_EQUALITY sharing AdmitsEquality = EnvTypeStr.AdmitsEquality structure Kind: TYCON_KIND sharing Kind = EnvTypeStr.Kind structure FlexibleTycon: sig type typeStr type t val dest: t -> {admitsEquality: AdmitsEquality.t, hasCons: bool, kind: Kind.t} val layout: t -> Layout.t val realize: t * EnvTypeStr.t option -> unit datatype realization = ETypeStr of EnvTypeStr.t option | TypeStr of typeStr val realization: t -> realization end structure Tycon: sig datatype t = Flexible of FlexibleTycon.t | Rigid of EnvTypeStr.Tycon.t * Kind.t val admitsEquality: t -> AdmitsEquality.t ref val make: {hasCons: bool, kind: Kind.t} -> t end structure Tyvar: sig type t end sharing Tyvar = Ast.Tyvar structure Record: RECORD sharing Record = Ast.SortedRecord structure Type: sig type t val arrow: t * t -> t val bogus: t val con: Tycon.t * t vector -> t val deArrow: t -> t * t val deEta: t * Tyvar.t vector -> Tycon.t option val exn: t val hom: t * {con: Tycon.t * 'a vector -> 'a, record: 'a Record.t -> 'a, var: Tyvar.t -> 'a} -> 'a val layout: t -> Layout.t val record: t Record.t -> t val var: Tyvar.t -> t end structure Status: sig datatype t = Con | Exn | Var val layout: t -> Layout.t val toString: t -> string end structure Time: sig type t val tick: unit -> t end structure Scheme: sig datatype t = T of {ty: Type.t, tyvars: Tyvar.t vector} val admitsEquality: t -> bool val make: Tyvar.t vector * Type.t -> t val ty: t -> Type.t end structure Cons: sig datatype t = T of {name: Ast.Con.t, scheme: Scheme.t} vector val empty: t val layout: t -> Layout.t end structure TypeStr: sig type t datatype node = Datatype of {cons: Cons.t, tycon: Tycon.t} | Scheme of Scheme.t | Tycon of Tycon.t val admitsEquality: t -> AdmitsEquality.t val apply: t * Type.t vector -> Type.t val cons: t -> Cons.t val data: Tycon.t * Kind.t * Cons.t -> t val def: Scheme.t * Kind.t -> t val kind: t -> Kind.t val layout: t -> Layout.t val node: t -> node val toTyconOpt: t -> Tycon.t option (* NONE on Scheme *) val tycon: Tycon.t * Kind.t -> t val share: (t * Region.t * (unit -> Layout.t)) * (t * Region.t * (unit -> Layout.t)) * Time.t -> unit val wheree: t * Region.t * (unit -> Layout.t) * Time.t * t -> unit end sharing type FlexibleTycon.typeStr = TypeStr.t structure TyconMap: sig datatype 'a t = T of {strs: (Ast.Strid.t * 'a t) array, types: (Ast.Tycon.t * 'a) array} val layout: ('a -> Layout.t) -> 'a t -> Layout.t end type t val copy: t -> t (* copy renames all flexible tycons. *) val equals: t * t -> bool val dest: t -> {strs: (Ast.Strid.t * t) array, types: (Ast.Tycon.t * TypeStr.t) array, vals: (Ast.Vid.t * (Status.t * Scheme.t)) array} val empty: t val flexibleTycons: t -> FlexibleTycon.t TyconMap.t val layout: t -> Layout.t val lookupLongtycon: t * Ast.Longtycon.t * Region.t * {prefix: Ast.Strid.t list} -> TypeStr.t option val new: {isClosed: bool, strs: (Ast.Strid.t * t) array, types: (Ast.Tycon.t * TypeStr.t) array, vals: (Ast.Vid.t * (Status.t * Scheme.t)) array} -> t val original: t -> t val peekStrid: t * Ast.Strid.t -> t option datatype 'a peekResult = Found of 'a | UndefinedStructure of Ast.Strid.t list val peekStrids: t * Ast.Strid.t list -> t peekResult val peekTycon: t * Ast.Tycon.t -> TypeStr.t option val plist: t -> PropertyList.t val renameTycons: (unit -> unit) ref val share: t * Ast.Longstrid.t * t * Ast.Longstrid.t * Time.t -> unit end mlton-20100608/mlton/elaborate/precedence-parse.fun0000644000076600000240000001753311404435623020600 0ustar mtfstaff(* Heavily modified from the SML/NJ sources by sweeks@research.nj.nec.com. *) (* Copyright 1996 by AT&T Bell Laboratories *) (* precedence.sml *) functor PrecedenceParse (S: PRECEDENCE_PARSE_STRUCTS): PRECEDENCE_PARSE = struct open S local open Ast in structure Exp = Exp structure Fixity = Fixity structure Fixop = Fixop structure Longvid = Longvid structure Pat = Pat structure Vid = Vid end structure Fixval = struct datatype t = Nonfix | Infix of int * int fun eval (f: Fixity.t): t = case f of Fixity.Infix NONE => Infix (0, 1) | Fixity.Infix (SOME n) => Infix (n+n, n+n+1) | Fixity.Infixr NONE => Infix (1, 0) | Fixity.Infixr (SOME n) => Infix (n+n+1, n+n) | Fixity.Nonfix => Nonfix fun make ({name: Longvid.t, fixop: Fixop.t}, E: Env.t): t = case (fixop, Longvid.split name) of (Fixop.None, ([], vid)) => (case Env.peekFix (E, vid) of NONE => Nonfix | SOME f => eval f) | _ => Nonfix fun makePat (p: Pat.t, E: Env.t): t = case Pat.node p of Pat.Var r => make (r, E) | _ => Nonfix fun makeExp (e: Exp.t, E: Env.t): t = case Exp.node e of Exp.Var r => make (r, E) | _ => Nonfix end (*---------------------------------------------------*) (* from elaborate/precedence.sml *) (*---------------------------------------------------*) datatype 'a precStack = INf of int * 'a * 'a precStack | NONf of 'a * 'a precStack | NILf fun 'a parse {apply: 'a * 'a -> 'a, fixval: 'a -> Fixval.t, items: 'a vector, lay: unit -> Layout.t, name: string, region: 'a -> Region.t, toString: 'a -> string, tuple: 'a vector -> 'a}: 'a = let fun error (r: Region.t, msg: string) = Control.error (r, Layout.str msg, lay ()) fun ensureNONf ((e, f), p) = let val _ = case f of Fixval.Nonfix => () | _ => Control.error (region e, Layout.str (concat ["identifier must be used infix: ", toString e]), lay ()) in NONf (e, p) end fun start token = ensureNONf (token, NILf) (* parse an expression *) fun parse (stack: 'a precStack, (item: 'a, fixval: Fixval.t)) = case (stack, (item, fixval)) of (NONf (e, r), (e', Fixval.Nonfix)) => NONf (apply (e, e'), r) | (p as INf _, token) => ensureNONf (token, p) | (p as NONf (e1, INf (bp, e2, NONf (e3, r))), (e4, f as Fixval.Infix (lbp, rbp))) => if lbp > bp then INf (rbp, e4, p) else (if lbp = bp then error (region e1, "operators of same precedence with mixed associativity") else (); parse (NONf (apply (e2, tuple (Vector.new2 (e3, e1))), r), (e4, f))) | (p as NONf _, (e', Fixval.Infix (_, rbp))) => INf (rbp, e', p) | _ => Error.bug "PrecedenceParse.parse.parse" (* clean up the stack *) fun finish stack = case stack of NONf (e1, INf (_, e2, NONf (e3, r))) => finish (NONf (apply (e2, tuple (Vector.new2 (e3, e1))), r)) | NONf (e1, NILf) => e1 | INf (_, e1, NONf (e2, p)) => (error (region e1, concat [name, " ends with infix identifier"]) ; finish (NONf (apply (e2, e1), p))) | NILf => Error.bug "PrecedenceParse.parse.finish: NILf" | _ => Error.bug "PrecedenceParse.parse.finish" fun getfix x = (x, fixval x) in if Vector.isEmpty items then Error.bug "PrecedenceParse.parse" else let val item = Vector.sub (items, 0) in finish (Vector.foldFrom (items, 1, start (getfix item), fn (item, state) => parse (state, getfix item))) end end fun parsePat (ps, E, lay) = let fun apply (p1, p2) = case Pat.node p1 of Pat.Var {name, ...} => Pat.makeRegion (Pat.App (Longvid.toLongcon name, p2), Region.append (Pat.region p1, Pat.region p2)) | _ => let open Layout val () = Control.error (Pat.region p1, str "non-constructor applied to argument in pattern", seq [str "in: ", Pat.layout p1, str " ", Pat.layout p2]) in Pat.wild end in parse {apply = apply, fixval = fn p => Fixval.makePat (p, E), items = ps, lay = lay, name = "pattern", region = Pat.region, toString = Layout.toString o Pat.layout, tuple = Pat.tuple} end val parsePat = Trace.trace ("PrecedenceParse.parsePat", fn (ps, _, _) => Vector.layout Pat.layout ps, Ast.Pat.layout) parsePat fun parseExp (es, E, lay) = parse {apply = Exp.app, fixval = fn e => Fixval.makeExp (e, E), items = es, lay = lay, name = "expression", region = Exp.region, toString = Layout.toString o Exp.layout, tuple = Exp.tuple} val parseExp = Trace.trace ("PrecedenceParse.parseExp", fn (es, _, _) => Vector.layout Exp.layout es, Ast.Exp.layout) parseExp (*---------------------------------------------------*) (* parseClause *) (*---------------------------------------------------*) fun parseClause (pats: Pat.t vector, E: Env.t, region, lay) = let val pats = Vector.toList pats fun error msg = (Control.error (region, msg, lay ()) ; {func = Ast.Var.bogus, args = Vector.new0 ()}) fun done (func: Pat.t, args: Pat.t list) = let fun illegal () = error (Layout.seq [Layout.str "illegal function symbol: ", Pat.layout func]) in case Pat.node func of Pat.Var {name, ...} => (case Longvid.split name of ([], x) => {func = Vid.toVar x, args = Vector.fromList args} | _ => illegal ()) | _ => illegal () end val tuple = Pat.tuple o Vector.new2 fun parse (ps : Pat.t list) = case ps of p :: rest => let fun continue () = case rest of [] => error (Layout.str "function with no arguments") | _ => done (p, rest) in case Pat.node p of Pat.FlatApp ps => if 3 = Vector.length ps then let fun p i = Vector.sub (ps, i) in done (p 1, tuple (p 0, p 2) :: rest) end else continue () | _ => continue () end | _ => Error.bug "PrecedenceParse.parseClause: empty" in case pats of [a, b, c] => (case Fixval.makePat (b, E) of Fixval.Nonfix => parse pats | _ => done (b, [tuple (a, c)])) | _ => parse pats end end mlton-20100608/mlton/elaborate/precedence-parse.sig0000644000076600000240000000147111404435623020564 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PRECEDENCE_PARSE_STRUCTS = sig structure Ast: AST structure Env: ELABORATE_ENV sharing Ast = Env.Ast end signature PRECEDENCE_PARSE = sig include PRECEDENCE_PARSE_STRUCTS val parseClause: Ast.Pat.t vector * Env.t * Region.t * (unit -> Layout.t) -> {args: Ast.Pat.t vector, func: Ast.Var.t} val parseExp: Ast.Exp.t vector * Env.t * (unit -> Layout.t) -> Ast.Exp.t val parsePat: Ast.Pat.t vector * Env.t * (unit -> Layout.t) -> Ast.Pat.t end mlton-20100608/mlton/elaborate/scope.fun0000644000076600000240000005776311404435623016515 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Scope (S: SCOPE_STRUCTS): SCOPE = struct open S open Ast structure Tyvars = UnorderedSet (UseName (Tyvar)) structure Env = struct structure Env = MonoEnv (structure Domain = UseName (Tyvar) structure Range = Tyvar) open Env (* rename (env, tyvars) extends env by mapping each tyvar to * a new tyvar (with the same equality property). It returns * the extended environment and the list of new tyvars. *) fun rename (env: t, tyvars: Tyvar.t vector): t * Tyvar.t vector = let val (tyvars, env) = Vector.mapAndFold (tyvars, env, fn (a, env) => let val a' = Tyvar.newLike a in (a', extend (env, a, a')) end) in (env, tyvars) end end fun ('down, 'up) processDec (d: Dec.t, {(* bindType is used at datatype and type declarations. *) bindType: ('down * Tyvar.t vector -> 'down * Tyvar.t vector * ('up -> 'up)), (* bindFunVal is used at fun, overload, and val declarations. *) bindFunVal: ('down * Tyvar.t vector -> ('down * ('up -> Tyvar.t vector * 'up))), combineUp: 'up * 'up -> 'up, initDown: 'down, initUp: 'up, tyvar: Tyvar.t * 'down -> Tyvar.t * 'up }): Dec.t * 'up = let fun loops (xs: 'a vector, loopX: 'a -> 'a * 'up): 'a vector * 'up = Vector.mapAndFold (xs, initUp, fn (x, u) => let val (x, u') = loopX x in (x, combineUp (u, u')) end) fun loopTy (t: Type.t, d: 'down): Type.t * 'up = let fun loop (t: Type.t): Type.t * 'up = let datatype z = datatype Type.node val (n, u) = case Type.node t of Con (c, ts) => let val (ts, u) = loops (ts, loop) in (Con (c, ts), u) end | Record r => let val (r, u) = SortedRecord.change (r, fn ts => loops (ts, loop)) in (Record r, u) end | Var a => let val (a, u) = tyvar (a, d) in (Var a, u) end in (Type.makeRegion (n, Type.region t), u) end in loop t end fun loopTyOpt (to: Type.t option, d: 'down): Type.t option * 'up = case to of NONE => (NONE, initUp) | SOME t => let val (t, u) = loopTy (t, d) in (SOME t, u) end fun loopTypBind (tb: TypBind.t, d: 'down): TypBind.t * 'up = let val TypBind.T tbs = TypBind.node tb val (tbs, u) = loops (tbs, fn {def, tycon, tyvars} => let val (d, tyvars, finish) = bindType (d, tyvars) val (def, u) = loopTy (def, d) in ({def = def, tycon = tycon, tyvars = tyvars}, finish u) end) in (TypBind.makeRegion (TypBind.T tbs, TypBind.region tb), u) end fun loopDatBind (db: DatBind.t, d: 'down): DatBind.t * 'up = let val DatBind.T {datatypes, withtypes} = DatBind.node db val (datatypes, u) = loops (datatypes, fn {cons, tycon, tyvars} => let val (d, tyvars, up) = bindType (d, tyvars) val (cons, u) = loops (cons, fn (con, arg) => let val (arg, u) = loopTyOpt (arg, d) in ((con, arg), u) end) in ({cons = cons, tycon = tycon, tyvars = tyvars}, up u) end) val (withtypes, u') = loopTypBind (withtypes, d) in (DatBind.makeRegion (DatBind.T {datatypes = datatypes, withtypes = withtypes}, DatBind.region db), combineUp (u, u')) end fun loopPat (p: Pat.t, d: 'down): Pat.t * 'up = let fun loop (p: Pat.t): Pat.t * 'up = let fun doit n = Pat.makeRegion (n, Pat.region p) fun do1 ((a, u), f) = (doit (f a), u) fun do2 ((a1, u1), (a2, u2), f) = (doit (f (a1, a2)), combineUp (u1, u2)) datatype z = datatype Pat.node in case Pat.node p of App (c, p) => do1 (loop p, fn p => App (c, p)) | Const _ => (p, initUp) | Constraint (p, t) => do2 (loop p, loopTy (t, d), Constraint) | FlatApp ps => do1 (loops (ps, loop), FlatApp) | Layered {constraint, fixop, pat, var} => do2 (loopTyOpt (constraint, d), loop pat, fn (constraint, pat) => Layered {constraint = constraint, fixop = fixop, pat = pat, var = var}) | List ps => do1 (loops (ps, loop), List) | Record {flexible, items} => let val (items, u) = Vector.mapAndFold (items, initUp, fn ((f, i), u) => let datatype z = datatype Pat.Item.t val (i, u') = case i of Field p => let val (p, u) = loop p in (Field p, u) end | Vid (v, to, po) => let val (to, u) = loopTyOpt (to, d) val (po, u') = loopOpt po in (Vid (v, to, po), combineUp (u, u')) end in ((f, i), combineUp (u, u')) end) in (doit (Record {flexible = flexible, items = items}), u) end | Tuple ps => do1 (loops (ps, loop), Tuple) | Var _ => (p, initUp) | Wild => (p, initUp) end and loopOpt opt = case opt of NONE => (NONE, initUp) | SOME p => let val (p, u) = loop p in (SOME p, u) end in loop p end fun loopPrimKind (kind: PrimKind.t, d: 'down): PrimKind.t * 'up = let datatype z = datatype PrimKind.t fun do1 ((a, u), f) = (f a, u) in case kind of Address {attributes, name, ty} => do1 (loopTy (ty, d), fn ty => Address {attributes = attributes, name = name, ty = ty}) | BuildConst {name, ty} => do1 (loopTy (ty, d), fn ty => BuildConst {name = name, ty = ty}) | CommandLineConst {name, ty, value} => do1 (loopTy (ty, d), fn ty => CommandLineConst {name = name, ty = ty, value = value}) | Const {name, ty} => do1 (loopTy (ty, d), fn ty => Const {name = name, ty = ty}) | Export {attributes, name, ty} => do1 (loopTy (ty, d), fn ty => Export {attributes = attributes, name = name, ty = ty}) | IImport {attributes, ty} => do1 (loopTy (ty, d), fn ty => IImport {attributes = attributes, ty = ty}) | Import {attributes, name, ty} => do1 (loopTy (ty, d), fn ty => Import {attributes = attributes, name = name, ty = ty}) | ISymbol {ty} => do1 (loopTy (ty, d), fn ty => ISymbol {ty = ty}) | Prim {name, ty} => do1 (loopTy (ty, d), fn ty => Prim {name = name, ty = ty}) | Symbol {attributes, name, ty} => do1 (loopTy (ty, d), fn ty => Symbol {attributes = attributes, name = name, ty = ty}) end fun loopDec (d: Dec.t, down: 'down): Dec.t * 'up = let fun doit n = Dec.makeRegion (n, Dec.region d) fun do1 ((a, u), f) = (doit (f a), u) fun do2 ((a1, u1), (a2, u2), f) = (doit (f (a1, a2)), combineUp (u1, u2)) fun doVec (ds: Dec.t vector, f: Dec.t vector -> Dec.node) : Dec.t * 'up = let val (ds, u) = loops (ds, fn d => loopDec (d, down)) in (doit (f ds), u) end fun empty () = (d, initUp) datatype z = datatype Dec.node in case Dec.node d of Abstype {body, datBind} => let val (body, u) = loopDec (body, down) val (db, u') = loopDatBind (datBind, down) in (doit (Abstype {body = body, datBind = db}), combineUp (u, u')) end | Datatype rhs => let datatype z = datatype DatatypeRhs.node val (rhs, u) = case DatatypeRhs.node rhs of DatBind db => let val (db, u) = loopDatBind (db, down) in (DatatypeRhs.makeRegion (DatBind db, DatatypeRhs.region rhs), u) end | Repl _ => (rhs, initUp) in (doit (Datatype rhs), u) end | Exception ebs => let val (ebs, u) = loops (ebs, fn (c, rhs) => let datatype z = datatype EbRhs.node val (rhs, u) = case EbRhs.node rhs of Def _ => (rhs, initUp) | Gen to => let val (to, u) = loopTyOpt (to, down) in (EbRhs.makeRegion (Gen to, EbRhs.region rhs), u) end in ((c, rhs), u) end) in (doit (Exception ebs), u) end | Fix _ => (d, initUp) | Fun (tyvars, decs) => let val (down, finish) = bindFunVal (down, tyvars) val (decs, u) = loops (decs, fn clauses => let val (clauses, u) = loops (clauses, fn {body, pats, resultType} => let val (body, u) = loopExp (body, down) val (pats, u') = loops (pats, fn p => loopPat (p, down)) val (resultType, u'') = loopTyOpt (resultType, down) in ({body = body, pats = pats, resultType = resultType}, combineUp (u, combineUp (u', u''))) end) in (clauses, u) end) val (tyvars, u) = finish u in (doit (Fun (tyvars, decs)), u) end | Local (d, d') => do2 (loopDec (d, down), loopDec (d', down), Local) | Open _ => empty () | Overload (i, x, tyvars, ty, ys) => let val (down, finish) = bindFunVal (down, tyvars) val (ty, up) = loopTy (ty, down) val (tyvars, up) = finish up in (doit (Overload (i, x, tyvars, ty, ys)), up) end | SeqDec ds => doVec (ds, SeqDec) | Type tb => do1 (loopTypBind (tb, down), Type) | Val {rvbs, tyvars, vbs} => let val (down, finish) = bindFunVal (down, tyvars) val (rvbs, u) = loops (rvbs, fn {match, pat} => let val (match, u) = loopMatch (match, down) val (pat, u') = loopPat (pat, down) in ({match = match, pat = pat}, combineUp (u, u')) end) val (vbs, u') = loops (vbs, fn {exp, pat} => let val (exp, u) = loopExp (exp, down) val (pat, u') = loopPat (pat, down) in ({exp = exp, pat = pat}, combineUp (u, u')) end) val (tyvars, u) = finish (combineUp (u, u')) in (doit (Val {rvbs = rvbs, tyvars = tyvars, vbs = vbs}), u) end end and loopExp (e: Exp.t, d: 'down): Exp.t * 'up = let val loopMatch = fn m => loopMatch (m, d) fun loop (e: Exp.t): Exp.t * 'up = let fun empty () = (e, initUp) val region = Exp.region e fun doit n = Exp.makeRegion (n, region) datatype z = datatype Exp.node fun do1 ((a, u), f) = (doit (f a), u) fun do2 ((a1, u1), (a2, u2), f) = (doit (f (a1, a2)), combineUp (u1, u2)) fun do3 ((a1, u1), (a2, u2), (a3, u3), f) = (doit (f (a1, a2, a3)), combineUp (u1, combineUp (u2, u3))) fun doVec (es: Exp.t vector, f: Exp.t vector -> Exp.node) : Exp.t * 'up = let val (es, u) = loops (es, loop) in (doit (f es), u) end in case Exp.node e of Andalso (e1, e2) => do2 (loop e1, loop e2, Andalso) | App (e1, e2) => do2 (loop e1, loop e2, App) | Case (e, m) => do2 (loop e, loopMatch m, Case) | Const _ => empty () | Constraint (e, t) => do2 (loop e, loopTy (t, d), Constraint) | FlatApp es => doVec (es, FlatApp) | Fn m => do1 (loopMatch m, Fn) | Handle (e, m) => do2 (loop e, loopMatch m, Handle) | If (e1, e2, e3) => do3 (loop e1, loop e2, loop e3, If) | Let (dec, e) => do2 (loopDec (dec, d), loop e, Let) | List ts => doVec (ts, List) | Orelse (e1, e2) => do2 (loop e1, loop e2, Orelse) | Prim kind => do1 (loopPrimKind (kind, d), Prim) | Raise exn => do1 (loop exn, Raise) | Record r => let val (r, u) = Record.change (r, fn es => loops (es, loop)) in (doit (Record r), u) end | Selector _ => empty () | Seq es => doVec (es, Seq) | Var _ => empty () | While {expr, test} => do2 (loop expr, loop test, fn (expr, test) => While {expr = expr, test = test}) end in loop e end and loopMatch (m, d) = let val (Match.T rules, region) = Match.dest m val (rules, u) = loops (rules, fn (p, e) => let val (p, u) = loopPat (p, d) val (e, u') = loopExp (e, d) in ((p, e), combineUp (u, u')) end) in (Match.makeRegion (Match.T rules, region), u) end in loopDec (d, initDown) end fun scope (dec: Dec.t): Dec.t = let fun bindFunVal (env, tyvars) = let val (env, tyvars) = Env.rename (env, tyvars) fun finish {free, mayNotBind} = let val bound = Vector.fromList (Tyvars.toList (Tyvars.+ (free, Tyvars.fromList (Vector.toList tyvars)))) val mayNotBind = List.keepAll (mayNotBind, fn a => not (Vector.exists (bound, fn a' => Tyvar.sameName (a, a'))) orelse let open Layout val _ = Control.error (Tyvar.region a, seq [str "type variable ", Tyvar.layout a, str " scoped at an outer declaration"], empty) in false end) in (bound, {free = Tyvars.empty, mayNotBind = List.append (Vector.toList tyvars, mayNotBind)}) end in (env, finish) end fun bindType (env, tyvars) = let val (env, tyvars) = Env.rename (env, tyvars) fun finish {free, mayNotBind = _} = {free = Tyvars.- (free, Tyvars.fromList (Vector.toList tyvars)), mayNotBind = []} in (env, tyvars, finish) end fun tyvar (a, env) = let val a = case Env.peek (env, a) of NONE => a | SOME a => a in (a, {free = Tyvars.singleton a, mayNotBind = []}) end fun combineUp ({free = f, mayNotBind = m}, {free = f', mayNotBind = m'}) = {free = Tyvars.+ (f, f'), mayNotBind = List.append (m, m')} val (dec, {free = unguarded, ...}) = processDec (dec, {bindFunVal = bindFunVal, bindType = bindType, combineUp = combineUp, initDown = Env.empty, initUp = {free = Tyvars.empty, mayNotBind = []}, tyvar = tyvar}) in if Tyvars.isEmpty unguarded then let (* Walk down and bind a tyvar as soon as you sees it, removing * all lower binding occurrences of the tyvar. Also, rename all * lower free occurrences of the tyvar to be the same as the * binding occurrence (so that they can share info). *) fun bindFunVal (env, tyvars: Tyvar.t vector) = let val domain = Env.domain env val (env, tyvars) = Env.rename (env, Vector.keepAll (tyvars, fn a => not (List.exists (domain, fn a' => Tyvar.sameName (a, a'))))) in (env, fn () => (tyvars, ())) end fun bindType (env, tyvars) = let val (env, tyvars) = Env.rename (env, tyvars) in (env, tyvars, fn () => ()) end fun tyvar (a, env) = (Env.lookup (env, a), ()) val (dec, ()) = processDec (dec, {bindFunVal = bindFunVal, bindType = bindType, combineUp = fn ((), ()) => (), initDown = Env.empty, initUp = (), tyvar = tyvar}) in dec end else let val _ = List.foreach (Tyvars.toList unguarded, fn a => let open Layout in Control.error (Tyvar.region a, seq [str "undefined type variable: ", Tyvar.layout a], empty) end) in dec end end val scope = Trace.trace ("Scope.scope", Dec.layout, Dec.layout) scope end mlton-20100608/mlton/elaborate/scope.sig0000644000076600000240000000102611404435623016464 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SCOPE_STRUCTS = sig structure Ast: AST end signature SCOPE = sig include SCOPE_STRUCTS (* Add free type variables to the val or fun declaration where they are * implicitly scoped. *) val scope: Ast.Dec.t -> Ast.Dec.t end mlton-20100608/mlton/elaborate/sources.cm0000644000076600000240000000150111404435623016651 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature ELABORATE functor Elaborate functor TypeEnv is ../ast/sources.cm ../atoms/sources.cm ../control/sources.cm ../core-ml/sources.cm ../../lib/mlton/sources.cm decs.sig decs.fun type-env.sig type-env.fun interface.sig interface.fun elaborate-env.sig elaborate-env.fun precedence-parse.sig precedence-parse.fun scope.sig scope.fun elaborate-core.sig elaborate-core.fun elaborate-sigexp.sig elaborate-sigexp.fun elaborate-modules.sig elaborate-modules.fun elaborate-programs.sig elaborate-programs.fun elaborate-mlbs.sig elaborate-mlbs.fun elaborate.sig elaborate.fun mlton-20100608/mlton/elaborate/sources.mlb0000644000076600000240000000165011404435623017031 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../ast/sources.mlb ../atoms/sources.mlb ../control/sources.mlb ../core-ml/sources.mlb decs.sig decs.fun type-env.sig type-env.fun interface.sig interface.fun elaborate-env.sig elaborate-env.fun precedence-parse.sig precedence-parse.fun scope.sig scope.fun elaborate-core.sig elaborate-core.fun elaborate-sigexp.sig elaborate-sigexp.fun elaborate-modules.sig elaborate-modules.fun elaborate-programs.sig elaborate-programs.fun elaborate-mlbs.sig elaborate-mlbs.fun elaborate.sig elaborate.fun in signature CONST_TYPE functor Elaborate functor TypeEnv end mlton-20100608/mlton/elaborate/type-env.fun0000644000076600000240000022325511404435623017142 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TypeEnv (S: TYPE_ENV_STRUCTS): TYPE_ENV = struct open S structure AdmitsEquality = Tycon.AdmitsEquality structure Field = Record.Field structure Srecord = SortedRecord structure Set = DisjointSet (* * Keep a clock that the elaborator ticks for each declaration. Associate each * type with a time that indicates the earliest declaration at which the type * occurs. The time is used for several things. * * 1. When we need to generalize a type, we can tell which unknowns appear * only in the declaration under consideration, and can hence be generalized. * * 2. Similarly, for type variables, we can tell if they appear in an earlier * declaration than the one in which they are to be bound, and hence can * not be generalized. * * 3. For "FlexRecord" types, we can tell when it appears only in the declaration * under consideration, and can hence be converted to a "GenFlexRecord" type * which allows for generalization of fields not yet known to be in the * flexRecord. * * 4. For type constructors, we can tell if they are used outside of the scope * of their definition. This handles the side conditions on rules 4, 17, and * 19. *) structure Time:> sig type t val <= : t * t -> bool val useBeforeDef: t * Tycon.t -> unit val layout: t -> Layout.t val now: unit -> t val tick: {useBeforeDef: Tycon.t -> unit} -> unit end = struct datatype t = T of {clock: int, useBeforeDef: Tycon.t -> unit} local fun make f (T r) = f r in val clock = make #clock end fun useBeforeDef (T {useBeforeDef = f, ...}, c) = f c val layout = Int.layout o clock fun t <= t' = Int.<= (clock t, clock t') local val current: t ref = ref (T {clock = 0, useBeforeDef = fn _ => Error.bug "TypeEnv.Time: useBeforeDef clock 0"}) in fun now () = !current fun tick {useBeforeDef} = current := T {clock = 1 + clock (!current), useBeforeDef = useBeforeDef} end val tick = Trace.trace ("TypeEnv.Time.tick", Layout.ignore, Unit.layout) tick end val tick = Time.tick structure Lay = struct type t = Layout.t * ({isChar: bool} * Tycon.BindingStrength.t) fun simple (l: Layout.t): t = (l, ({isChar = false}, Tycon.BindingStrength.unit)) end structure UnifyResult = struct datatype t = NotUnifiable of Lay.t * Lay.t | Unified val layout = let open Layout in fn NotUnifiable _ => str "NotUnifiable" | Unified => str "Unified" end end val {get = tyconInfo: Tycon.t -> {admitsEquality: AdmitsEquality.t ref, region: Region.t option ref, time: Time.t ref}, set = setTyconInfo, ...} = Property.getSet (Tycon.plist, Property.initRaise ("info", Tycon.layout)) local fun make f = f o tyconInfo in val tyconAdmitsEquality = make #admitsEquality val tyconRegion = make #region val tyconTime = make #time end fun initAdmitsEquality (c, a) = setTyconInfo (c, {admitsEquality = ref a, region = ref NONE, time = ref (Time.now ())}) val _ = List.foreach (Tycon.prims, fn {tycon = c, admitsEquality = a, ...} => initAdmitsEquality (c, a)) structure Equality:> sig type t val and2: t * t -> t val andd: t vector -> t val applyTycon: Tycon.t * t vector -> t val falsee: t val fromBool: bool -> t val toBoolOpt: t -> bool option val truee: t val unify: t * t -> UnifyResult.t val unknown: unit -> t end = struct datatype maybe = Known of bool | Unknown of {whenKnown: (bool -> bool) list ref} datatype t = False | Lazy of unit -> t | Maybe of maybe ref | True fun unknown () = Maybe (ref (Unknown {whenKnown = ref []})) fun set (e: t, b: bool): bool = case e of False => b = false | Lazy th => set (th (), b) | Maybe r => (case !r of Known b' => b = b' | Unknown {whenKnown} => (r := Known b; List.forall (!whenKnown, fn f => f b))) | True => b = true fun when (e: t, f: bool -> bool): bool = case e of False => f false | Lazy th => when (th (), f) | Maybe r => (case !r of Known b => f b | Unknown {whenKnown} => (List.push (whenKnown, f); true)) | True => f true fun unify (e: t, e': t): bool = when (e, fn b => set (e', b)) andalso when (e', fn b => set (e, b)) fun and2 (e, e') = case (e, e') of (False, _) => False | (_, False) => False | (True, _) => e' | (_, True) => e | (Lazy th, e') => Lazy (fn () => and2 (th (), e')) | (e, Lazy th') => Lazy (fn () => and2 (e, th' ())) | (Maybe r, Maybe r') => (case (!r, !r') of (Known false, _) => False | (_, Known false) => False | (Known true, _) => e' | (_, Known true) => e | (Unknown _, Unknown _) => let val e'' = unknown () val _ = when (e'', fn b => if b then set (e, true) andalso set (e', true) else let fun dep (e, e') = when (e, fn b => not b orelse set (e', false)) in dep (e, e') andalso dep (e', e) end) fun dep (e, e') = when (e, fn b => if b then unify (e', e'') else set (e'', false)) val _ = dep (e, e') val _ = dep (e', e) in e'' end) val falsee = False val truee = True val fromBool = fn false => False | true => True fun toBoolOpt (e: t): bool option = case e of False => SOME false | Lazy th => toBoolOpt (th ()) | Maybe r => (case !r of Known b => SOME b | Unknown _ => NONE) | True => SOME true fun andd (es: t vector): t = Vector.fold (es, truee, and2) val applyTycon: Tycon.t * t vector -> t = fn (c, es) => let datatype z = datatype AdmitsEquality.t in case !(tyconAdmitsEquality c) of Always => truee | Sometimes => let val e = andd es in case e of False => falsee | _ => Lazy (fn () => case !(tyconAdmitsEquality c) of Always => Error.bug "TypeEnv.Equality.applyTycon: Always" | Sometimes => e | Never => falsee) end | Never => falsee end val unify: t * t -> UnifyResult.t = fn (e, e') => if unify (e, e') then UnifyResult.Unified else let fun lay e = Lay.simple (Layout.str (case toBoolOpt e of NONE => Error.bug "TypeEnv.Equality.unify" | SOME b => if b then "[]" else "[]")) in UnifyResult.NotUnifiable (lay e, lay e') end end structure Unknown = struct datatype t = T of {canGeneralize: bool, id: int} local fun make f (T r) = f r in val id = make #id end fun layout (T {canGeneralize, id, ...}) = let open Layout in seq [str "Unknown ", record [("canGeneralize", Bool.layout canGeneralize), ("id", Int.layout id)]] end fun equals (u, u') = id u = id u' local val r: int ref = ref 0 in fun newId () = (Int.inc r; !r) end fun new {canGeneralize} = T {canGeneralize = canGeneralize, id = newId ()} fun join (T r, T r'): t = T {canGeneralize = #canGeneralize r andalso #canGeneralize r', id = newId ()} end (* Flexible record spine, i.e. a possibly extensible list of fields. *) structure Spine: sig type t val canAddFields: t -> bool val equals: t * t -> bool val fields: t -> Field.t list (* ensureField checks if field is there. If it is not, then ensureField * will add it unless no more fields are allowed in the spine. * It returns true iff it succeeds. *) val ensureField: t * Field.t -> bool val foldOverNew: t * (Field.t * 'a) list * 'b * (Field.t * 'b -> 'b) -> 'b val layout: t -> Layout.t val new: Field.t list -> t val noMoreFields: t -> unit val unify: t * t -> unit end = struct datatype t = T of {id: int, body: {fields: Field.t list ref, more: bool ref} Set.t} local val r: int ref = ref 0 in fun newId () = (Int.inc r; !r) end fun new fields = T {id = newId (), body = Set.singleton {fields = ref fields, more = ref true}} fun equals (T {id = id1,...}, T {id = id2,...}) = id1 = id2 fun layout (T {body = s,...}) = let val {fields, more} = Set.! s in Layout.record [("fields", List.layout Field.layout (!fields)), ("more", Bool.layout (!more))] end fun canAddFields (T {body = s,...}) = ! (#more (Set.! s)) fun fields (T {body = s,...}) = ! (#fields (Set.! s)) fun ensureFieldValue ({fields, more}, f) = List.contains (!fields, f, Field.equals) orelse (!more andalso (List.push (fields, f); true)) fun ensureField (T {body = s,...}, f) = ensureFieldValue (Set.! s, f) fun noMoreFields (T {body = s,...}) = #more (Set.! s) := false fun unify (T {body = s1,...}, T {body = s2,...}) = let val {fields = fs1, more = m1} = Set.! s1 val {fields = fs2, more = m2} = Set.! s2 val _ = Set.union (s1, s2) val fs = List.union (!fs1, !fs2, Field.equals) val m = !m1 andalso !m2 val _ = Set.:= (s1, {fields = ref fs, more = ref m}) in () end fun foldOverNew (spine: t, fs, ac, g) = List.fold (fields spine, ac, fn (f, ac) => if List.exists (fs, fn (f', _) => Field.equals (f, f')) then ac else g (f, ac)) end val {get = tyvarTime: Tyvar.t -> Time.t ref, ...} = Property.get (Tyvar.plist, Property.initFun (fn _ => ref (Time.now ()))) val tyvarTime = Trace.trace ("TypeEnv.tyvarTime", Tyvar.layout, Ref.layout Time.layout) tyvarTime local type z = Layout.t * ({isChar: bool} * Tycon.BindingStrength.t) open Layout in fun simple (l: Layout.t): z = (l, ({isChar = false}, Tycon.BindingStrength.unit)) val dontCare: z = simple (str "_") fun bracket l = seq [str "[", l, str "]"] fun layoutRecord (ds: (Field.t * bool * z) list, flexible: bool) = simple (case ds of [] => if flexible then str "{...}" else str "{}" | _ => seq [str "{", mayAlign (separateRight (List.map (QuickSort.sortList (ds, fn ((f, _, _), (f', _, _)) => Field.<= (f, f')), fn (f, b, (l, _)) => let val f = Field.layout f val f = if b then bracket f else f in seq [f, str ": ", l] end), ",")), str (if flexible then ", ...}" else "}")]) fun layoutTuple (zs: z vector): z = Tycon.layoutApp (Tycon.tuple, zs) end structure Type = struct structure Overload = struct datatype t = Char | Int | Real | Word val equals: t * t -> bool = op = val toString = fn Char => "Char" | Int => "Int" | Real => "Real" | Word => "Word" val layout = Layout.str o toString val matchesTycon: t * Tycon.t -> bool = fn (ov, c) => case ov of Char => Tycon.isCharX c | Int => Tycon.isIntX c | Real => Tycon.isRealX c | Word => Tycon.isWordX c val defaultTycon: t -> Tycon.t = fn Char => Tycon.defaultChar () | Int => Tycon.defaultInt () | Real => Tycon.defaultReal () | Word => Tycon.defaultWord () end (* Tuples of length <> 1 are always represented as records. * There will never be tuples of length one. *) datatype t = T of {equality: Equality.t, plist: PropertyList.t, time: Time.t ref, ty: ty} Set.t and ty = Con of Tycon.t * t vector | FlexRecord of {fields: fields, spine: Spine.t} (* GenFlexRecord only appears in type schemes. * It will never be unified. * The fields that are filled in after generalization are stored in * extra. *) | GenFlexRecord of genFlexRecord | Overload of Overload.t | Record of t Srecord.t | Unknown of Unknown.t | Var of Tyvar.t withtype fields = (Field.t * t) list and genFlexRecord = {extra: unit -> {field: Field.t, tyvar: Tyvar.t} list, fields: (Field.t * t) list, spine: Spine.t} val newCloses: t list ref = ref [] local fun make f (T s) = f (Set.! s) in val equality = make #equality val plist: t -> PropertyList.t = make #plist val toType: t -> ty = make #ty end local open Layout in fun layoutFields fs = List.layout (Layout.tuple2 (Field.layout, layout)) fs and layout (T s) = let val {time, ty, ...} = Set.! s in record [("time", Time.layout (!time)), ("ty", case ty of Con (c, ts) => paren (align [seq [str "Con ", Tycon.layout c], Vector.layout layout ts]) | FlexRecord {fields, spine} => seq [str "Flex ", record [("fields", layoutFields fields), ("spine", Spine.layout spine)]] | GenFlexRecord {extra, fields, spine} => seq [str "GenFlex ", record [("extra", List.layout (fn {field, tyvar} => record [("field", Field.layout field), ("tyvar", Tyvar.layout tyvar)]) (extra ())), ("fields", layoutFields fields), ("spine", Spine.layout spine)]] | Overload ov => Overload.layout ov | Record r => Srecord.layout {record = r, separator = ": ", extra = "", layoutTuple = Vector.layout layout, layoutElt = layout} | Unknown u => Unknown.layout u | Var a => paren (seq [str "Var ", Tyvar.layout a]))] end end fun admitsEquality t = case Equality.toBoolOpt (equality t) of NONE => (* Could report an error here, but sometimes in a type-incorrect * program, there will be unknown equalities. So it is better * to conservatively return equality true, which will cause fewer * spurious errors. *) true | SOME b => b val admitsEquality = Trace.trace ("TypeEnv.Type.admitsEquality", layout, Bool.layout) admitsEquality val {get = opaqueTyconExpansion: Tycon.t -> (t vector -> t) option, set = setOpaqueTyconExpansion, ...} = Property.getSet (Tycon.plist, Property.initConst NONE) val opaqueTyconExpansion = Trace.trace ("TypeEnv.Type.opaqueTyconExpansion", Tycon.layout, Layout.ignore) opaqueTyconExpansion fun makeHom {con, expandOpaque, flexRecord, genFlexRecord, overload, record, recursive, unknown, var} = let datatype status = Processing | Seen | Unseen val {destroy = destroyStatus, get = status, ...} = Property.destGet (plist, Property.initFun (fn _ => ref Unseen)) val {get, destroy = destroyProp} = Property.destGet (plist, Property.initRec (fn (t, get) => let val r = status t in case !r of Seen => Error.bug "TypeEnv.Type.makeHom: impossible" | Processing => recursive t | Unseen => let val _ = r := Processing fun loopFields fields = List.revMap (fields, fn (f, t) => (f, get t)) val res = case toType t of Con (c, ts) => let fun no () = con (t, c, Vector.map (ts, get)) fun yes () = (case opaqueTyconExpansion c of NONE => no () | SOME f => get (f ts)) in if expandOpaque then yes () else no () end | FlexRecord {fields, spine} => flexRecord (t, {fields = loopFields fields, spine = spine}) | GenFlexRecord {extra, fields, spine} => genFlexRecord (t, {extra = extra, fields = loopFields fields, spine = spine}) | Overload ov => overload (t, ov) | Record r => record (t, Srecord.map (r, get)) | Unknown u => unknown (t, u) | Var a => var (t, a) val _ = r := Seen in res end end)) fun destroy () = (destroyStatus () ; destroyProp ()) in {hom = get, destroy = destroy} end fun hom (ty, z) = let val {hom, destroy} = makeHom z in Exn.finally (fn () => hom ty, destroy) end fun makeLayoutPretty {expandOpaque, localTyvarNames} : {destroy: unit -> unit, lay: t -> Layout.t * ({isChar: bool} * Tycon.BindingStrength.t)} = let val str = Layout.str fun con (_, c, ts) = Tycon.layoutApp (c, ts) fun con0 c = Tycon.layoutApp (c, Vector.new0 ()) fun flexRecord (_, {fields, spine}) = layoutRecord (List.fold (fields, Spine.foldOverNew (spine, fields, [], fn (f, ac) => (f, false, simple (str "#???")) :: ac), fn ((f, t), ac) => (f, false, t) :: ac), Spine.canAddFields spine) fun genFlexRecord (_, {extra, fields, spine}) = layoutRecord (List.fold (fields, List.revMap (extra (), fn {field, tyvar} => (field, false, simple (Tyvar.layout tyvar))), fn ((f, t), ac) => (f, false, t) :: ac), Spine.canAddFields spine) fun overload (_, ov) = con0 (Overload.defaultTycon ov) fun record (_, r) = case Srecord.detupleOpt r of NONE => layoutRecord (Vector.toListMap (Srecord.toVector r, fn (f, t) => (f, false, t)), false) | SOME ts => Tycon.layoutApp (Tycon.tuple, ts) fun recursive _ = simple (str "") fun unknown _ = simple (str "???") val (destroy, prettyTyvar) = if localTyvarNames then let val {destroy, get = prettyTyvar, ...} = Property.destGet (Tyvar.plist, Property.initFun (let val r = ref (Char.toInt #"a") in fn _ => let val n = !r val l = simple (str (concat ["'", if n > Char.toInt #"z" then concat ["a", Int.toString (n - Char.toInt #"z")] else Char.toString (Char.fromInt n )])) val _ = r := 1 + n in l end end)) in (destroy, prettyTyvar) end else (fn () => (), simple o Tyvar.layout) fun var (_, a) = prettyTyvar a fun lay t = hom (t, {con = con, expandOpaque = expandOpaque, flexRecord = flexRecord, genFlexRecord = genFlexRecord, overload = overload, record = record, recursive = recursive, unknown = unknown, var = var}) in {destroy = destroy, lay = lay} end fun layoutPrettyAux (t, {expandOpaque, localTyvarNames}) = let val {destroy, lay} = makeLayoutPretty {expandOpaque = expandOpaque, localTyvarNames = localTyvarNames} val res = #1 (lay t) val _ = destroy () in res end fun layoutPretty t = layoutPrettyAux (t, {expandOpaque = false, localTyvarNames = true}) fun deConOpt t = case toType t of Con x => SOME x | _ => NONE fun deEta (t: t, tyvars: Tyvar.t vector): Tycon.t option = case deConOpt t of SOME (c, ts) => if Vector.length ts = Vector.length tyvars andalso Vector.foralli (ts, fn (i, t) => case toType t of Var a => Tyvar.equals (a, Vector.sub (tyvars, i)) | _ => false) then SOME c else NONE | _ => NONE fun newTy (ty: ty, eq: Equality.t): t = T (Set.singleton {equality = eq, plist = PropertyList.new (), time = ref (Time.now ()), ty = ty}) fun unknown {canGeneralize, equality} = let val t = newTy (Unknown (Unknown.new {canGeneralize = canGeneralize}), equality) val _ = List.push (newCloses, t) in t end fun new () = unknown {canGeneralize = true, equality = Equality.unknown ()} val new = Trace.trace ("TypeEnv.Type.new", Unit.layout, layout) new fun newFlex {fields, spine} = newTy (FlexRecord {fields = fields, spine = spine}, Equality.and2 (Equality.andd (Vector.fromListMap (fields, equality o #2)), Equality.unknown ())) fun flexRecord record = let val v = Srecord.toVector record val spine = Spine.new (Vector.toListMap (v, #1)) fun isResolved (): bool = not (Spine.canAddFields spine) val t = newFlex {fields = Vector.toList v, spine = spine} val _ = List.push (newCloses, t) in (t, isResolved) end fun record r = newTy (Record r, Equality.andd (Vector.map (Srecord.range r, equality))) fun tuple ts = if 1 = Vector.length ts then Vector.sub (ts, 0) else newTy (Record (Srecord.tuple ts), Equality.andd (Vector.map (ts, equality))) fun con (tycon, ts) = if Tycon.equals (tycon, Tycon.tuple) then tuple ts else newTy (Con (tycon, ts), Equality.applyTycon (tycon, Vector.map (ts, equality))) fun var a = newTy (Var a, Equality.fromBool (Tyvar.isEquality a)) end fun setOpaqueTyconExpansion (c, f) = Type.setOpaqueTyconExpansion (c, SOME f) structure Ops = TypeOps (structure Tycon = Tycon open Type) structure Type = struct (* Order is important, since want specialized definitions in Type to * override general definitions in Ops. *) open Ops Type val unit = tuple (Vector.new0 ()) fun isArrow t = case toType t of Con (c, _) => Tycon.equals (c, Tycon.arrow) | _ => false fun isBool t = case toType t of Con (c, _) => Tycon.isBool c | _ => false fun isCharX t = case toType t of Con (c, _) => Tycon.isCharX c | Overload Overload.Char => true | _ => false fun isCPointer t = case toType t of Con (c, _) => Tycon.isCPointer c | _ => false fun isInt t = case toType t of Con (c, _) => Tycon.isIntX c | Overload Overload.Int => true | _ => false fun isUnit t = case toType t of Record r => (case Srecord.detupleOpt r of NONE => false | SOME v => 0 = Vector.length v) | _ => false local fun make (ov, eq) () = newTy (Overload ov, eq) datatype z = datatype Overload.t in val unresolvedChar = make (Char, Equality.truee) val unresolvedInt = make (Int, Equality.truee) val unresolvedReal = make (Real, Equality.falsee) val unresolvedWord = make (Word, Equality.truee) end fun unresolvedString () = vector (unresolvedChar ()) val traceCanUnify = Trace.trace2 ("TypeEnv.Type.canUnify", layout, layout, Bool.layout) fun canUnify arg = traceCanUnify (fn (t, t') => case (toType t, toType t') of (Unknown _, _) => true | (_, Unknown _) => true | (Con (c, ts), t') => conAnd (c, ts, t') | (t', Con (c, ts)) => conAnd (c, ts, t') | (Overload o1, Overload o2) => Overload.equals (o1, o2) | (Record r, Record r') => let val fs = Srecord.toVector r val fs' = Srecord.toVector r' in Vector.length fs = Vector.length fs' andalso Vector.forall2 (fs, fs', fn ((f, t), (f', t')) => Field.equals (f, f') andalso canUnify (t, t')) end | (Var a, Var a') => Tyvar.equals (a, a') | _ => false) arg and conAnd (c, ts, t') = case t' of Con (c', ts') => Tycon.equals (c, c') andalso Vector.forall2 (ts, ts', canUnify) | Overload ov => 0 = Vector.length ts andalso Overload.matchesTycon (ov, c) | _ => false (* minTime (t, bound) ensures that all components of t have times no larger * than bound. It calls the appropriate error function when it encounters * a tycon that is used before it defined. *) fun minTime (t, bound: Time.t): unit = let fun loop (T s): unit = let val {time, ty, ...} = Set.! s in if Time.<= (!time, bound) then () else let val _ = time := bound in case ty of Con (c, ts) => let val r = tyconTime c val _ = if Time.<= (!r, bound) then () else let val _ = r := bound val _ = Time.useBeforeDef (bound, c) in () end val _ = Vector.foreach (ts, loop) in () end | FlexRecord {fields, ...} => loopFields fields | GenFlexRecord {fields, ...} => loopFields fields | Overload _ => () | Record r => Srecord.foreach (r, loop) | Unknown _ => () | Var a => let val r = tyvarTime a in if Time.<= (!r, bound) then () else r := bound end end end and loopFields (fs: (Field.t * t) list) = List.foreach (fs, loop o #2) val _ = loop t in () end val minTime = Trace.trace2 ("TypeEnv.Type.minTime", layout, Time.layout, Unit.layout) minTime datatype z = datatype UnifyResult.t val traceUnify = Trace.trace2 ("TypeEnv.Type.unify", layout, layout, UnifyResult.layout) fun unify (t, t', {preError: unit -> unit}): UnifyResult.t = let val {destroy, lay = layoutPretty} = makeLayoutPretty {expandOpaque = false, localTyvarNames = true} val dontCare' = fn _ => dontCare val layoutRecord = fn z => layoutRecord (z, true) fun unify arg = traceUnify (fn (outer as T s, outer' as T s') => if Set.equals (s, s') then Unified else let fun notUnifiable (l: Lay.t, l': Lay.t) = (NotUnifiable (l, l'), Unknown (Unknown.new {canGeneralize = true})) val bracket = fn (l, ({isChar}, _)) => (bracket l, ({isChar = isChar}, Tycon.BindingStrength.unit)) fun notUnifiableBracket (l, l') = notUnifiable (bracket l, bracket l') fun flexToRecord (fields, spine) = (Vector.fromList fields, Vector.fromList (List.fold (Spine.fields spine, [], fn (f, ac) => if List.exists (fields, fn (f', _) => Field.equals (f, f')) then ac else f :: ac)), fn f => Spine.ensureField (spine, f)) fun rigidToRecord r = (Srecord.toVector r, Vector.new0 (), fn f => isSome (Srecord.peek (r, f))) fun oneFlex ({fields, spine}, time, r, outer, swap) = unifyRecords (flexToRecord (fields, spine), rigidToRecord r, fn () => (minTime (outer, time) ; Spine.noMoreFields spine ; (Unified, Record r)), fn (l, l') => notUnifiable (if swap then (l', l) else (l, l'))) fun genFlexError () = Error.bug "TypeEnv.Type.unify: GenFlexRecord" val {equality = e, time, ty = t, plist} = Set.! s val {equality = e', time = time', ty = t', ...} = Set.! s' fun not () = (preError () ; notUnifiableBracket (layoutPretty outer, layoutPretty outer')) fun unifys (ts, ts', yes, no) = let val us = Vector.map2 (ts, ts', unify) in if Vector.forall (us, fn Unified => true | _ => false) then yes () else let val (ls, ls') = Vector.unzip (Vector.mapi (us, fn (i, u) => case u of Unified => let val z = dontCare' (Vector.sub (ts, i)) in (z, z) end | NotUnifiable (l, l') => (l, l'))) in no (ls, ls') end end fun conAnd (c, ts, t, t', swap) = let fun maybe (z, z') = if swap then (z', z) else (z, z') in case t of Con (c', ts') => if Tycon.equals (c, c') then if Vector.length ts <> Vector.length ts' then let fun lay ts = simple (Layout.seq [Layout.str (concat ["<", Int.toString (Vector.length ts), " args> "]), Tycon.layout c]) val _ = preError () in notUnifiableBracket (maybe (lay ts, lay ts')) end else unifys (ts, ts', fn () => (Unified, t), fn (ls, ls') => let fun lay ls = Tycon.layoutApp (c, ls) in notUnifiable (maybe (lay ls, lay ls')) end) else not () | Overload ov => if Vector.isEmpty ts andalso Overload.matchesTycon (ov, c) then (Unified, t') else not () | _ => not () end fun oneUnknown (u: Unknown.t, time, t: Type.ty, outer: Type.t, _: bool) = let (* This should fail if the unknown occurs in t. *) fun con (_, _, ts) = Vector.exists (ts, fn b => b) fun doFields fields = List.exists (fields, fn (_, b) => b) fun flexRecord (_, {fields, spine = _}) = doFields fields fun genFlexRecord (_, {extra = _, fields, spine = _}) = doFields fields fun record (_, r) = Srecord.exists (r, fn b => b) fun unknown (_, u') = Unknown.equals (u, u') fun no _ = false val isCircular = hom (outer, {con = con, expandOpaque = false, flexRecord = flexRecord, genFlexRecord = genFlexRecord, overload = no, record = record, recursive = fn _ => Error.bug "TypeEnv.Type.unify.oneUnknown: recursive", unknown = unknown, var = no}) in if isCircular then not () else let val () = minTime (outer, time) in (Unified, t) end end val (res, t) = case (t, t') of (Unknown r, Unknown r') => (Unified, Unknown (Unknown.join (r, r'))) | (Unknown u, _) => oneUnknown (u, !time, t', outer', false) | (_, Unknown u') => oneUnknown (u', !time', t, outer, true) | (Con (c, ts), _) => conAnd (c, ts, t', t, false) | (_, Con (c, ts)) => conAnd (c, ts, t, t', true) | (FlexRecord f, Record r') => oneFlex (f, !time, r', outer', false) | (Record r, FlexRecord f') => oneFlex (f', !time', r, outer, true) | (FlexRecord {fields = fields, spine = s}, FlexRecord {fields = fields', spine = s'}) => let fun yes () = let val () = Spine.unify (s, s') val () = minTime (outer, !time') val () = minTime (outer', !time) val fields = List.fold (fields, fields', fn ((f, t), ac) => if List.exists (fields', fn (f', _) => Field.equals (f, f')) then ac else (f, t) :: ac) in (Unified, FlexRecord {fields = fields, spine = s}) end in unifyRecords (flexToRecord (fields, s), flexToRecord (fields', s'), yes, notUnifiable) end | (GenFlexRecord _, _) => genFlexError () | (_, GenFlexRecord _) => genFlexError () | (Overload o1, Overload o2) => if Overload.equals (o1, o2) then (Unified, t) else not () | (Record r, Record r') => (case (Srecord.detupleOpt r, Srecord.detupleOpt r') of (NONE, NONE) => unifyRecords (rigidToRecord r, rigidToRecord r', fn () => (Unified, Record r), notUnifiable) | (SOME ts, SOME ts') => if Vector.length ts = Vector.length ts' then unifys (ts, ts', fn () => (Unified, Record r), fn (ls, ls') => notUnifiable (layoutTuple ls, layoutTuple ls')) else not () | _ => not ()) | (Var a, Var a') => if Tyvar.equals (a, a') then (Unified, t) else not () | _ => not () val res = case res of NotUnifiable _ => res | Unified => let val res = Equality.unify (e, e') val () = case res of NotUnifiable _ => () | Unified => let val () = Set.union (s, s') val () = if Time.<= (!time, !time') then () else time := !time' val () = Set.:= (s, {equality = e, plist = plist, time = time, ty = t}) in () end in res end in res end) arg and unifyRecords ((fields: (Field.t * t) vector, extra: Field.t vector, ensureField: Field.t -> bool), (fields': (Field.t * t) vector, extra': Field.t vector, ensureField': Field.t -> bool), yes, no) = let fun extras (extra, ensureField') = Vector.fold (extra, [], fn (f, ac) => if ensureField' f then ac else (preError (); (f, true, dontCare) :: ac)) val ac = extras (extra, ensureField') val ac' = extras (extra', ensureField) fun subset (fields, fields', ensureField', ac, ac', both, skipBoth) = Vector.fold (fields, (ac, ac', both), fn ((f, t), (ac, ac', both)) => case Vector.peek (fields', fn (f', _) => Field.equals (f, f')) of NONE => if ensureField' f then (ac, ac', both) else (preError () ; ((f, true, dontCare' t) :: ac, ac', both)) | SOME (_, t') => if skipBoth then (ac, ac', both) else case unify (t, t') of NotUnifiable (l, l') => ((f, false, l) :: ac, (f, false, l') :: ac', both) | Unified => (ac, ac', [])) val (ac, ac', both) = subset (fields, fields', ensureField', ac, ac', [], false) val (ac', ac, both) = subset (fields', fields, ensureField, ac', ac, both, true) in case (ac, ac') of ([], []) => yes () | _ => let val _ = preError () fun doit ac = layoutRecord (List.fold (both, ac, fn ((f, t), ac) => (f, false, layoutPretty t) :: ac)) in no (doit ac, doit ac') end end val _ = destroy () in unify (t, t') end structure UnifyResult' = struct datatype t = NotUnifiable of Layout.t * Layout.t | Unified end datatype unifyResult = datatype UnifyResult'.t val unify = fn (t, t', z) => case unify (t, t', z) of UnifyResult.NotUnifiable ((l, _), (l', _)) => NotUnifiable (l, l') | UnifyResult.Unified => Unified local val {get: Tycon.t -> (t * Tycon.t) option, set, ...} = Property.getSetOnce (Tycon.plist, Property.initConst NONE) in fun setSynonym (c, c') = set (c, SOME (con (c, Vector.new0 ()), c')) val synonym = get end val () = List.foreach (CharSize.all, fn s => setSynonym (Tycon.char s, Tycon.word (WordSize.fromBits (CharSize.bits s)))) val () = List.foreach (IntSize.all, fn s => setSynonym (Tycon.int s, Tycon.word (WordSize.fromBits (IntSize.bits s)))) structure Overload = struct open Overload val defaultType = fn Char => con (Tycon.defaultChar (), Vector.new0 ()) | Int => con (Tycon.defaultInt (), Vector.new0 ()) | Real => con (Tycon.defaultReal (), Vector.new0 ()) | Word => con (Tycon.defaultWord (), Vector.new0 ()) end fun 'a simpleHom {con: t * Tycon.t * 'a vector -> 'a, expandOpaque: bool, record: t * (Field.t * 'a) vector -> 'a, replaceSynonyms: bool, var: t * Tyvar.t -> 'a} = let val unit = con (unit, Tycon.tuple, Vector.new0 ()) val unknown = unit fun sortFields (fields: (Field.t * 'a) list) = let val a = Array.fromList fields val () = QuickSort.sortArray (a, fn ((f, _), (f', _)) => Field.<= (f, f')) in Array.toVector a end fun unsorted (t, fields: (Field.t * 'a) list) = let val v = sortFields fields in record (t, v) end fun genFlexRecord (t, {extra, fields, spine = _}) = unsorted (t, List.fold (extra (), fields, fn ({field, tyvar}, ac) => (field, var (Type.var tyvar, tyvar)) :: ac)) fun flexRecord (t, {fields, spine}) = if Spine.canAddFields spine then Error.bug "TypeEnv.Type.simpleHom: flexRecord" else unsorted (t, Spine.foldOverNew (spine, fields, fields, fn (f, ac) => (f, unit) :: ac)) fun recursive _ = Error.bug "TypeEnv.Type.simpleHom.recursive" val con = if not replaceSynonyms then con else fn (t, c, ts) => let val (t, c) = case synonym c of NONE => (t, c) | SOME (t, c) => (t, c) in con (t, c, ts) end fun overload (t', ov) = let val t = Overload.defaultType ov val _ = unify (t, t', {preError = fn _ => Error.bug "TypeEnv.Type.simpleHom.overload"}) in con (t, Overload.defaultTycon ov, Vector.new0 ()) end in makeHom {con = con, expandOpaque = expandOpaque, flexRecord = flexRecord, genFlexRecord = genFlexRecord, overload = overload, record = fn (t, r) => record (t, Srecord.toVector r), recursive = recursive, unknown = fn _ => unknown, var = var} end end structure Scheme = struct datatype t = General of {bound: unit -> Tyvar.t vector, canGeneralize: bool, flexes: Type.genFlexRecord list, tyvars: Tyvar.t vector, ty: Type.t} | Type of Type.t fun layout s = case s of Type t => Type.layout t | General {canGeneralize, tyvars, ty, ...} => Layout.record [("canGeneralize", Bool.layout canGeneralize), ("tyvars", Vector.layout Tyvar.layout tyvars), ("ty", Type.layout ty)] fun layoutPrettyAux (s, {expandOpaque, localTyvarNames}) = case s of Type ty => Type.layoutPrettyAux (ty, {expandOpaque = expandOpaque, localTyvarNames = localTyvarNames}) | General {ty, ...} => Type.layoutPrettyAux (ty, {expandOpaque = expandOpaque, localTyvarNames = localTyvarNames}) fun layoutPretty s = layoutPrettyAux (s, {expandOpaque = false, localTyvarNames = true}) val bound = fn General {bound, ...} => bound () | Type _ => Vector.new0 () val bound = Trace.trace ("TypeEnv.Scheme.bound", layout, Vector.layout Tyvar.layout) bound val ty = fn General {ty, ...} => ty | Type ty => ty fun dest s = (bound s, ty s) fun make {canGeneralize, tyvars, ty} = if 0 = Vector.length tyvars then Type ty else General {bound = fn () => tyvars, canGeneralize = canGeneralize, flexes = [], tyvars = tyvars, ty = ty} val fromType = Type fun instantiate' (t: t, subst) = case t of Type ty => {args = fn () => Vector.new0 (), instance = ty} | General {canGeneralize, flexes, tyvars, ty, ...} => let open Type val {destroy = destroyTyvarInst, get = tyvarInst: Tyvar.t -> Type.t option, set = setTyvarInst} = Property.destGetSetOnce (Tyvar.plist, Property.initConst NONE) val types = Vector.mapi (tyvars, fn (i, a) => let val t = subst {canGeneralize = canGeneralize, equality = Tyvar.isEquality a, index = i} val _ = setTyvarInst (a, SOME t) in t end) type z = {isNew: bool, ty: Type.t} fun isNew {isNew = b, ty = _} = b fun keep ty = {isNew = false, ty = ty} fun con (ty, c, zs) = if Vector.exists (zs, isNew) then {isNew = true, ty = Type.con (c, Vector.map (zs, #ty))} else keep ty val flexInsts = ref [] fun genFlexRecord (_, {extra = _, fields, spine}) = let val fields = List.revMap (fields, fn (f, t: z) => (f, #ty t)) val flex = newFlex {fields = fields, spine = spine} val _ = List.push (flexInsts, {flex = flex, spine = spine}) in {isNew = true, ty = flex} end fun record (t, r) = if Srecord.exists (r, isNew) then {isNew = true, ty = Type.record (Srecord.map (r, #ty))} else keep t fun recursive _ = (* If we get here, there has already been a type error * in the user's program, so we return a new type to avoid * compounding the error. *) {isNew = true, ty = Type.new ()} fun var (ty, a) = case tyvarInst a of NONE => {isNew = false, ty = ty} | SOME ty => {isNew = true, ty = ty} val {ty: Type.t, ...} = Type.hom (ty, {con = con, expandOpaque = false, flexRecord = keep o #1, genFlexRecord = genFlexRecord, overload = keep o #1, record = record, recursive = recursive, unknown = keep o #1, var = var}) val _ = destroyTyvarInst () val flexInsts = !flexInsts fun args (): Type.t vector = Vector.fromList (List.fold (flexes, Vector.toList types, fn ({fields, spine, ...}, ac) => let fun done peek = Spine.foldOverNew (spine, fields, ac, fn (f, ac) => (case peek f of NONE => Type.unit | SOME t => t) :: ac) in case List.peek (flexInsts, fn {spine = spine', ...} => Spine.equals (spine, spine')) of NONE => done (fn _ => NONE) | SOME {flex, ...} => let fun peekFields (fields, f) = Option.map (List.peek (fields, fn (f', _) => Field.equals (f, f')), #2) in done (case Type.toType flex of FlexRecord {fields, ...} => (fn f => peekFields (fields, f)) | GenFlexRecord {extra, fields, ...} => (fn f => case peekFields (fields, f) of NONE => Option.map (List.peek (extra (), fn {field, ...} => Field.equals (f, field)), Type.var o #tyvar) | SOME t => SOME t) | Record r => (fn f => Srecord.peek (r, f)) | _ => Error.bug "TypeEnv.instantiate': General:strange flexInst") end end)) in {args = args, instance = ty} end fun apply (s, ts) = #instance (instantiate' (s, fn {index, ...} => Vector.sub (ts, index))) fun instantiate s = instantiate' (s, fn {canGeneralize, equality, ...} => Type.unknown {canGeneralize = canGeneralize, equality = if equality then Equality.truee else Equality.unknown ()}) val instantiate = Trace.trace ("TypeEnv.Scheme.instantiate", layout, Type.layout o #instance) instantiate fun admitsEquality s = Type.admitsEquality (#instance (instantiate' (s, fn {canGeneralize, ...} => Type.unknown {canGeneralize = canGeneralize, equality = Equality.truee}))) val admitsEquality = Trace.trace ("TypeEnv.Scheme.admitsEquality", layout, Bool.layout) admitsEquality fun haveFrees (v: t vector): bool vector = let fun con (_, _, bs) = Vector.exists (bs, fn b => b) fun no _ = false val {destroy, hom} = Type.makeHom {con = con, expandOpaque = false, flexRecord = fn (_, {fields, ...}) => List.exists (fields, #2), genFlexRecord = (fn (_, {fields, ...}) => List.exists (fields, #2)), overload = no, record = fn (_, r) => Srecord.exists (r, fn b => b), recursive = no, unknown = fn _ => true, var = no} val res = Vector.map (v, fn s => case s of General {ty, ...} => hom ty | Type ty => hom ty) val _ = destroy () in res end end fun generalize (tyvars: Tyvar.t vector) = let val genTime = Time.now () val () = Vector.foreach (tyvars, fn a => tyvarTime a := genTime) in fn () => {unable = (Vector.keepAll (tyvars, fn a => not (Time.<= (genTime, !(tyvarTime a)))))} end fun close (ensure: Tyvar.t vector, ubd) = let val beforeGen = Time.now () val () = Time.tick ubd val genTime = Time.now () val () = Vector.foreach (ensure, fn a => ignore (tyvarTime a)) val savedCloses = !Type.newCloses val () = Type.newCloses := [] in Trace.trace ("TypeEnv.close", let open Layout in Vector.layout (fn {isExpansive, ty} => Layout.record [("isExpansive", Bool.layout isExpansive), ("ty", Type.layout ty)]) end, Layout.ignore) (fn varTypes => let val () = Vector.foreach (varTypes, fn {isExpansive, ty} => if isExpansive then Type.minTime (ty, beforeGen) else ()) val unable = Vector.keepAll (ensure, fn a => not (Time.<= (genTime, !(tyvarTime a)))) val flexes = ref [] val tyvars = ref (Vector.toList ensure) (* Convert all the unknown types bound at this level into tyvars. * Convert all the FlexRecords bound at this level into * GenFlexRecords. *) val newCloses = List.fold (!Type.newCloses, savedCloses, fn (t as Type.T s, ac) => let val {equality, plist, time, ty, ...} = Set.! s val _ = if true then () else let open Layout in outputl (seq [str "considering ", Type.layout t, str " with time ", Time.layout (!time), str " where getTime is ", Time.layout genTime], Out.error) end in if not (Time.<= (genTime, !time)) then t :: ac else case ty of Type.FlexRecord {fields, spine, ...} => let fun newField f = {field = f, tyvar = Tyvar.newNoname {equality = false}} val extra = let val all = ref [] val fields = List.map (fields, fn (f, _) => (f, ())) in fn () => let val old = !all val fields = List.fold (old, fields, fn ({field, ...}, ac) => (field, ()) :: ac) val new = Spine.foldOverNew (spine, fields, old, fn (f, ac) => (newField f) :: ac) val () = all := new in new end end val gfr = {extra = extra, fields = fields, spine = spine} val _ = List.push (flexes, gfr) val _ = Set.:= (s, {equality = equality, plist = plist, time = time, ty = Type.GenFlexRecord gfr}) in ac end | Type.Unknown (Unknown.T {canGeneralize, ...}) => if not canGeneralize then t :: ac else let val b = case Equality.toBoolOpt equality of NONE => let val _ = Equality.unify (equality, Equality.falsee) in false end | SOME b => b val a = Tyvar.newNoname {equality = b} val _ = List.push (tyvars, a) val _ = Set.:= (s, {equality = equality, plist = PropertyList.new (), time = time, ty = Type.Var a}) in ac end | _ => ac end) val _ = Type.newCloses := newCloses val flexes = !flexes val tyvars = !tyvars (* For all fields that were added to the generalized flex records, * add a type variable. *) fun bound () = Vector.fromList (List.fold (flexes, tyvars, fn ({extra, fields, spine}, ac) => let val extra = extra () in Spine.foldOverNew (spine, fields, ac, fn (f, ac) => case List.peek (extra, fn {field, ...} => Field.equals (f, field)) of NONE => Error.bug "TypeEnv.close.bound: GenFlex missing field" | SOME {tyvar, ...} => tyvar :: ac) end)) val schemes = Vector.map (varTypes, fn {isExpansive, ty} => if isExpansive then Scheme.Type ty else Scheme.General {bound = bound, canGeneralize = true, flexes = flexes, tyvars = Vector.fromList tyvars, ty = ty}) in {bound = bound, schemes = schemes, unable = unable} end ) end structure Type = struct open Type fun homConVar {con, expandOpaque, var} = let fun tuple (t, ts) = if 1 = Vector.length ts then Vector.sub (ts, 0) else con (t, Tycon.tuple, ts) in simpleHom {con = con, expandOpaque = expandOpaque, record = fn (t, fs) => tuple (t, Vector.map (fs, #2)), replaceSynonyms = true, var = var} end fun makeHom {con, expandOpaque, var} = homConVar {con = fn (_, c, ts) => con (c, ts), expandOpaque = expandOpaque, var = fn (_, a) => var a} fun deRecord t = let val {hom, destroy} = simpleHom {con = fn (t, _, _) => (t, NONE), expandOpaque = false, record = fn (t, fs) => (t, SOME (Vector.map (fs, fn (f, (t, _)) => (f, t)))), replaceSynonyms = true, var = fn (t, _) => (t, NONE)} val res = case #2 (hom t) of NONE => Error.bug "TypeEnv.Type.deRecord" | SOME fs => fs val _ = destroy () in res end fun deTupleOpt t = let val {destroy, hom} = homConVar {con = fn (t, c, ts) => (t, if Tycon.equals (c, Tycon.tuple) then SOME (Vector.map (ts, #1)) else NONE), expandOpaque = false, var = fn (t, _) => (t, NONE)} val res = #2 (hom t) val _ = destroy () in res end val deTupleOpt = Trace.trace ("TypeEnv.Type.deTupleOpt", layout, Option.layout (Vector.layout layout)) deTupleOpt fun hom (t, {con, expandOpaque = e, record, replaceSynonyms = r, var}) = let val {hom, destroy} = simpleHom {con = fn (_, c, v) => con (c, v), expandOpaque = e, record = fn (_, fs) => record (Srecord.fromVector fs), replaceSynonyms = r, var = fn (_, a) => var a} val res = hom t val _ = destroy () in res end val unify = fn (t1: t, t2: t, {error: Layout.t * Layout.t -> unit, preError: unit -> unit}) => case unify (t1, t2, {preError = preError}) of NotUnifiable z => error z | Unified => () end end mlton-20100608/mlton/elaborate/type-env.sig0000644000076600000240000001073611404435623017132 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYPE_ENV_STRUCTS = sig include ATOMS end signature TYPE_ENV = sig include TYPE_ENV_STRUCTS structure Time: sig type t val now: unit -> t end structure Type: sig include TYPE_OPS val admitsEquality: t -> bool (* can two types be unified? not side-effecting. *) val canUnify: t * t -> bool val deEta: t * Tyvar.t vector -> Tycon.t option val deRecord: t -> (Record.Field.t * t) vector val flexRecord: t SortedRecord.t -> t * (unit -> bool) val hom: t * {con: Tycon.t * 'a vector -> 'a, expandOpaque: bool, record: 'a SortedRecord.t -> 'a, replaceSynonyms: bool, var: Tyvar.t -> 'a} -> 'a val isArrow: t -> bool val isBool: t -> bool val isCharX: t -> bool val isCPointer: t -> bool val isInt: t -> bool val isUnit: t -> bool val layout: t -> Layout.t val layoutPrettyAux: t * {expandOpaque: bool, localTyvarNames: bool} -> Layout.t val layoutPretty: t -> Layout.t val makeHom: {con: Tycon.t * 'a vector -> 'a, expandOpaque: bool, var: Tyvar.t -> 'a} -> {destroy: unit -> unit, hom: t -> 'a} val makeLayoutPretty: {expandOpaque:bool, localTyvarNames: bool} -> {destroy: unit -> unit, lay: t -> Layout.t * ({isChar: bool} * Tycon.BindingStrength.t)} (* minTime (t, time) makes every component of t occur no later than * time. This will display a type error message if time is before * the definition time of some component of t. *) val minTime: t * Time.t -> unit val new: unit -> t val record: t SortedRecord.t -> t (* make two types identical (recursively). side-effecting. *) val unify: t * t * {error: Layout.t * Layout.t -> unit, preError: unit -> unit} -> unit val unresolvedChar: unit -> t val unresolvedInt: unit -> t val unresolvedReal: unit -> t val unresolvedString: unit -> t val unresolvedWord: unit -> t val var: Tyvar.t -> t end (* sharing type Type.intSize = IntSize.t *) sharing type Type.realSize = RealSize.t sharing type Type.wordSize = WordSize.t sharing type Type.tycon = Tycon.t structure Scheme: sig type t val admitsEquality: t -> bool val apply: t * Type.t vector -> Type.t val bound: t -> Tyvar.t vector val dest: t -> Tyvar.t vector * Type.t val fromType: Type.t -> t val haveFrees: t vector -> bool vector val instantiate: t -> {args: unit -> Type.t vector, instance: Type.t} val layout: t -> Layout.t val layoutPrettyAux: t * {expandOpaque: bool, localTyvarNames: bool} -> Layout.t val layoutPretty: t -> Layout.t val make: {canGeneralize: bool, ty: Type.t, tyvars: Tyvar.t vector} -> t val ty: t -> Type.t end val close: Tyvar.t vector * {useBeforeDef: Tycon.t -> unit} -> {isExpansive: bool, ty: Type.t} vector -> {bound: unit -> Tyvar.t vector, schemes: Scheme.t vector, unable: Tyvar.t vector} val generalize: Tyvar.t vector -> unit -> {unable: Tyvar.t vector} val initAdmitsEquality: Tycon.t * Tycon.AdmitsEquality.t -> unit val setOpaqueTyconExpansion: Tycon.t * (Type.t vector -> Type.t) -> unit val tick: {useBeforeDef: Tycon.t -> unit} -> unit val tyconAdmitsEquality: Tycon.t -> Tycon.AdmitsEquality.t ref val tyconRegion: Tycon.t -> Region.t option ref end mlton-20100608/mlton/front-end/0000755000076600000240000000000011404470407014605 5ustar mtfstaffmlton-20100608/mlton/front-end/.ignore0000644000076600000240000000013611404435623016072 0ustar mtfstaffml.grm.desc ml.grm.sig ml.grm.sml ml.lex.sml mlb.grm.desc mlb.grm.sig mlb.grm.sml mlb.lex.sml mlton-20100608/mlton/front-end/front-end.fun0000644000076600000240000000337211404435623017221 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor FrontEnd (S: FRONT_END_STRUCTS): FRONT_END = struct open S structure LrVals = MLLrValsFun (structure Token = LrParser.Token structure Ast = Ast) structure Lex = MLLexFun (structure Tokens = LrVals.Tokens) structure Parse = JoinWithArg (structure ParserData = LrVals.ParserData structure Lex = Lex structure LrParser = LrParser) fun lexAndParse (source: Source.t, ins: In.t): Ast.Program.t = let val stream = Parse.makeLexer (fn n => In.inputN (ins, n)) {source = source} val lookahead = 30 val result = (#1 (Parse.parse (lookahead, stream, fn (s, left, right) => Control.errorStr (Region.make {left = left, right = right}, s), ()))) handle _ => let val i = Source.lineStart source val _ = Control.errorStr (Region.make {left = i, right = i}, "parse error") in Ast.Program.T [] end val () = Ast.Program.checkSyntax result in result end fun lexAndParseFile (f: File.t) = File.withIn (f, fn ins => lexAndParse (Source.new f, ins)) val lexAndParseFile = Trace.trace ("FrontEnd.lexAndParseFile", File.layout, Ast.Program.layout) lexAndParseFile end mlton-20100608/mlton/front-end/front-end.sig0000644000076600000240000000067311404435623017214 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FRONT_END_STRUCTS = sig structure Ast: AST end signature FRONT_END = sig include FRONT_END_STRUCTS val lexAndParseFile: File.t -> Ast.Program.t end mlton-20100608/mlton/front-end/Makefile0000644000076600000240000000221011404435623016241 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## SRC := $(shell cd ../.. && pwd) BUILD := $(SRC)/build BIN := $(BUILD)/bin PATH := $(BIN):$(shell echo $$PATH) ifeq (mllex, $(shell if mllex >/dev/null 2>&1 || [ $$? != 127 ] ; then echo mllex; fi)) MLLEX := mllex else ifeq (ml-lex, $(shell if ml-lex >/dev/null 2>&1 || [ $$? != 127 ] ; then echo ml-lex; fi)) MLLEX := ml-lex else MLLEX := no-mllex endif endif ifeq (mlyacc, $(shell if mlyacc >/dev/null 2>&1 || [ $$? != 127 ] ; then echo mlyacc; fi)) MLYACC := mlyacc else ifeq (ml-yacc, $(shell if ml-lex >/dev/null 2>&1 || [ $$? != 127 ] ; then echo ml-yacc; fi)) MLYACC := ml-yacc else MLYACC := no-mlyacc endif endif .PHONY: all all: ml.lex.sml ml.grm.sig ml.grm.sml mlb.lex.sml mlb.grm.sig mlb.grm.sml .PHONY: clean clean: ../../bin/clean %.lex.sml: %.lex rm -f $@ $(MLLEX) $< chmod -w $@ %.grm.sig %.grm.sml: %.grm rm -f $<.* $(MLYACC) $< chmod -w $<.* mlton-20100608/mlton/front-end/ml-yacc-lib-proxy.cm0000644000076600000240000000042311404435623020376 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Library library(../../lib/mlyacc-lib/ml-yacc-lib.cm) - ( signature STREAM structure Stream ) is ../../lib/mlyacc-lib/ml-yacc-lib.cm mlton-20100608/mlton/front-end/ml.grm0000644000076600000240000013063611404435623015736 0ustar mtfstaff(* Heavily modified from SML/NJ sources by sweeks@sweeks.com *) (* ml.grm * * Copyright 1989,1992 by AT&T Bell Laboratories *) fun reg (left, right) = Region.make {left = left, right = right} fun error (reg, msg) = Control.error (reg, Layout.str msg, Layout.empty) open Ast structure Field = Record.Field structure Srecord = SortedRecord structure Type = struct open Type val tuple = Record o Srecord.tuple val unit = tuple (Vector.new0 ()) fun arrow (t1, t2) = Con (Longtycon.arrow, Vector.new2 (t1, t2)) end structure DatBind = struct open DatBind fun make (dbs, withtypes, left, right) = makeRegion' (T {datatypes = dbs, withtypes = withtypes}, left, right) end structure Pat = struct open Pat fun tuple ps = if 1 = Vector.length ps then node (Vector.sub (ps, 0)) else Tuple ps val unit = tuple (Vector.new0 ()) val bogus = unit fun makeAs (p1: t, p2: t): node = let fun err () = error (Pat.region p1, "must have variable to left in as pattern") fun fixopVar (p : t) = case node p of FlatApp ps => if 1 = Vector.length ps then (case node (Vector.sub (ps, 0)) of Var {fixop,name} => (case Longvid.split name of ([], vid) => SOME (fixop, Vid.toVar vid) | _ => let val () = err () in SOME (Fixop.None, Var.bogus) end) | _ => NONE) else NONE | _ => NONE in case fixopVar p1 of SOME (fixop, var) => Layered {fixop = fixop, var = var, constraint = NONE, pat = p2} | NONE => case node p1 of Pat.Constraint (p, t) => (case fixopVar p of SOME (fixop, var) => Layered {fixop = fixop, var = var, constraint = SOME t, pat = p2} | _ => (err (); bogus)) | _ => (err (); bogus) end end structure Exp = struct open Exp fun tuple es = if 1 = Vector.length es then node (Vector.sub (es, 0)) else Record (Record.tuple es) val unit = tuple (Vector.new0 ()) end structure Dec = struct open Dec fun sequence (d1: t, d2: t): t = makeRegion (case (node d1, node d2) of (SeqDec d1, SeqDec d2) => SeqDec (Vector.concat [d1, d2]) | (SeqDec d1, _) => SeqDec (Vector.concat [d1, Vector.new1 d2]) | (_, SeqDec d2) => SeqDec (Vector.concat [Vector.new1 d1, d2]) | _ => SeqDec (Vector.new2 (d1, d2)), Region.append (region d1, region d2)) end structure Spec = struct open Spec (* Some of this mess is so that a sharing equation captures as * many specs as possible in its scope. *) fun seq (s: t, s': t): t = let fun reg s'' = makeRegion (s'', Region.append (region s, region s')) in case (node s, node s') of (Empty, _) => s' | (_, Empty) => s | (_, Seq (s1, s2)) => reg (Seq (seq (s, s1), s2)) | (_, Sharing {spec, equations}) => reg (Sharing {spec = seq (s, spec), equations = equations}) | _ => reg (Seq (s, s')) end (* val seq = Trace.trace2 ("Spec.seq", layout, layout, layout) seq *) end fun consTopdec (d, dss) = case dss of [] => [[d]] | ds :: dss => (d :: ds) :: dss type rule = Pat.t * Exp.t type clause = {pats : Pat.t vector, resultType : Type.t option, body : Exp.t} type clauses = clause vector type eb = Con.t * EbRhs.t type db = {tyvars: Tyvar.t vector, tycon: Tycon.t, cons: (Con.t * Type.t option) vector} type strdesc = Strid.t * Sigexp.t type wherespec = {tyvars: Tyvar.t vector, longtycon: Longtycon.t, ty: Type.t} type typdesc = {tyvars: Tyvar.t vector, tycon: Tycon.t} type valdesc = Var.t * Type.t type exndesc = Con.t * Type.t option type strbind = {name: Strid.t, def: Strexp.t, constraint: SigConst.t} type sigbind = Sigid.t * Sigexp.t type funbind = {name : Fctid.t, arg : FctArg.t, result : SigConst.t, body : Strexp.t} type vb = {pat: Pat.t, exp: Exp.t} type rvb = {pat: Pat.t, match: Match.t} fun ensureNonqualified (ss: Symbol.t list, r: Region.t): Symbol.t * Region.t = case ss of [s] => (s, r) | _ => (error (r, "expected nonqualified id") ; (Symbol.bogus, r)) fun cons1 (x, (l, r, y)) = (x :: l, r, y) fun augment (id, sigexp, (wherespecs, right, binds)) = (id, Sigexp.wheree (sigexp, Vector.fromList wherespecs, Region.extendRight (Sigexp.region sigexp, right))) :: binds fun 'a augment1 ((strexp: Strexp.t, makesigconst: Sigexp.t -> SigConst.t, sigexp: Sigexp.t), (wherespecs: wherespec list, right: SourcePos.t, z: 'a)): Strexp.t * 'a = (Strexp.makeRegion (Strexp.Constrained (strexp, makesigconst (Sigexp.wheree (sigexp, Vector.fromList wherespecs, Region.extendRight (Sigexp.region sigexp, right)))), Region.extendRight (Strexp.region strexp, right)), z) type 'a whereAnd = wherespec list * SourcePos.t * 'a list %% %term CHAR of IntInf.t | INT of {digits: string, negate: bool, radix: StringCvt.radix} | LONGID of string | REAL of string | STRING of IntInf.t vector | TYVAR of string | WORD of {digits: string, radix: StringCvt.radix} | ABSTYPE | AND | ANDALSO | ARROW | AS | ASTERISK | BAR | CASE | COLON | COLONGT | COMMA | DATATYPE | DOTDOTDOT | ELSE | END | EOF | EQUALOP | EQTYPE | EXCEPTION | DO | DARROW | FN | FUN | FUNCTOR | HANDLE | HASH | IF | IN | INCLUDE | INFIX | INFIXR | LBRACE | LBRACKET | LET | LOCAL | LPAREN | NONFIX | ORELSE | OF | OP | OPEN | OVERLOAD | RAISE | RBRACE | RBRACKET | REC | RPAREN | SEMICOLON | SHARING | SIG | SIGNATURE | STRUCT | STRUCTURE | THEN | TYPE | VAL | WHERE | WHILE | WILD | WITH | WITHTYPE (* Extensions *) | BUILD_CONST | COMMAND_LINE_CONST | CONST | ADDRESS | EXPORT | IMPORT | SYMBOL | PRIM %nonterm aexp of Exp.node | andspecs of wherespec list | apat of Pat.t | apat' of Pat.t | apatnode of Pat.node | apats of Pat.t list | app_exp of Exp.t list | app_exp1 of Exp.t list | arg_fct of Strexp.t | ieattributes of PrimKind.ImportExportAttribute.t list | clause of clause | clauses of clause list | clausesTop of clauses | commapats of Pat.t list | con of Con.t | const of Const.t | const' of Const.node | constr of Con.t * Type.t option | constraint of Type.t option | constrs of (Con.t * Type.t option) list | constOrBool of Const.t | datBind of DatBind.t | datBindNoWithtype of DatBind.t | datatypeRhs of DatatypeRhs.t | datatypeRhsNoWithtype of DatatypeRhs.t | datatypeRhsnode of DatatypeRhs.node | datatypeRhsnodeNoWithtype of DatatypeRhs.node | db of db | dbs of db vector | dbs' of db list | dec of Dec.t | decnode of Dec.node | decnolocal of Dec.node | decs of Dec.t | decsnode of Dec.node | digit of int | eb of eb | ebrhs of EbRhs.t | ebrhsnode of EbRhs.node | ebs of eb list | elabel of (Field.t * Exp.t) | elabels of (Field.t * Exp.t) list | exndesc of exndesc | exndescs of exndesc list | exp of Exp.t | exp_2c of Exp.t list | exp_list of Exp.t list | exp_ps of Exp.t list | expnode of Exp.node | expsAndTopdecs of Topdec.t list list | fctarg of FctArg.node | fctid of Fctid.t | field of Field.t | fixity of Fixity.t | funbinds of funbind list | funbinds' of Strexp.t * funbind list | funbinds'1 of funbind whereAnd | funbinds'1' of funbind whereAnd | funbinds'2 of funbind list | funs of clauses list | id of Symbol.t * Region.t | idEqual of Symbol.t * Region.t | idNoAsterisk of Symbol.t * Region.t | int of IntInf.t | longcon of Longcon.t | longid of Symbol.t list * Region.t | longidEqual of Symbol.t list * Region.t | longidNoAsterisk of Symbol.t list * Region.t | longstrid of Longstrid.t | longstrideqns of Longstrid.t list | longstrids of Longstrid.t list | longtycon of Longtycon.t | longtyconeqns of Longtycon.t list | longvidands of Longvid.t list | longvid of Longvid.t | longvidNoEqual of Longvid.t | match of Match.t | opaspat of Pat.t option | opcon of Con.t | ot_list of Exp.t list | pat of Pat.t | pat_2c of Pat.t list | patitem of (Field.t * Pat.Item.t) | patitems of ((Field.t * Pat.Item.t) list * bool) | patnode of Pat.node | pats of Pat.t list | priority of Priority.t | program of Program.t | repl of DatatypeRhs.node | rule of rule | rules of rule list | rvalbind of rvb list | rvalbindRest of rvb list | sdec of Dec.t | sdecs of Dec.t | sdecsPlus of Dec.t | sharespec of Equation.node | sigbinds of sigbind list | sigbinds' of sigbind whereAnd | sigbinds'' of sigbind whereAnd | sigconst of SigConst.t | sigexp of Sigexp.t | sigexp' of Sigexp.t | sigexp'node of Sigexp.node | sigexpnode of Sigexp.node | sigid of Sigid.t | sigids of Sigid.t list | spec of Spec.t | specnode of Spec.node | specs of Spec.t | strbinds of strbind list | strbinds' of Strexp.t * strbind list | strbinds'1 of strbind whereAnd | strbinds'1' of strbind whereAnd | strbinds'2 of strbind list | strdec of Strdec.t | strdecnode of Strdec.node | strdecs of Strdec.t | strdecsnode of Strdec.node | strdescs of strdesc list | strdescs' of strdesc whereAnd | strdescs'' of strdesc whereAnd | strexp of Strexp.t | strexp1 of Strexp.t * (Sigexp.t -> SigConst.t) * Sigexp.t | strexp2 of Strexp.t | strexp2node of Strexp.node | strexpnode of Strexp.node | strid of Strid.t | string of string | symattributes of PrimKind.SymbolAttribute.t list | tlabel of (Field.t * Type.t) | tlabels of (Field.t * Type.t) list | topdec of Topdec.t | topdecnode of Topdec.node | topdecs of Topdec.t list list | tuple_ty of Type.t list | ty of Type.t | ty' of Type.t | ty'node of Type.node | ty0_pc of Type.t list | ty1 of Type.t | tyOpt of Type.t option | tycon of Tycon.t | tynode of Type.node | typBind of TypBind.t | typBind' of {def: Type.t, tycon: Tycon.t, tyvars: Tyvar.t vector} list | typBind'' of {def: Type.t, tycon: Tycon.t, tyvars: Tyvar.t vector} list | typdesc of typdesc | typdescs of typdesc list | tyvar of Tyvar.t | tyvar_pc of Tyvar.t list | tyvars of Tyvar.t vector | tyvarseq of Tyvar.t vector | valbind of vb list * rvb list | valbindRest of vb list * rvb list | valbindTop of vb vector * rvb vector | valdesc of valdesc | valdescs of valdesc list | var of Var.t | vid of Vid.t | vidNoEqual of Vid.t | vids of Vid.t list | wherespec of wherespec | wherespecs of wherespec vector | wherespecs' of wherespec list | withtypes of TypBind.t | word of IntInf.t %verbose %pos SourcePos.t %eop EOF %noshift EOF %header (functor MLLrValsFun (structure Token: TOKEN structure Ast: AST)) %nonassoc WITHTYPE %right AND %right ARROW %right DARROW %left DO %left ELSE %left RAISE %right HANDLE %left ORELSE %left ANDALSO %right AS %left COLON %name ML %keyword ABSTYPE AND AS CASE DATATYPE DOTDOTDOT ELSE END EQTYPE EXCEPTION DO DARROW FN FUN FUNCTOR HANDLE IF IN INCLUDE INFIX INFIXR LET LOCAL NONFIX OF OP OPEN OVERLOAD RAISE REC SHARING SIG SIGNATURE STRUCT STRUCTURE THEN TYPE VAL WHILE WHERE WITH WITHTYPE ORELSE ANDALSO %change -> VAL | -> THEN | -> ELSE | -> LPAREN | -> SEMICOLON | DARROW -> EQUALOP | EQUALOP -> DARROW | AND -> ANDALSO | COLON -> OF | SEMICOLON -> COMMA | COMMA -> SEMICOLON | -> IN LONGID END | -> ELSE LONGID %value CHAR (IntInf.fromInt (Char.ord #"a")) %value INT ({digits = "0", negate = false, radix = StringCvt.DEC}) %value LONGID ("bogus") %value REAL ("13.0") %value STRING (Vector.fromList []) %value TYVAR ("'a") %value WORD ({digits = "0", radix = StringCvt.DEC}) %% program: expsAndTopdecs (Program.T expsAndTopdecs) expsAndTopdecs: exp SEMICOLON expsAndTopdecs ([Topdec.fromExp exp] :: expsAndTopdecs) | topdecs (topdecs) topdecs: ([]) | topdec topdecs (consTopdec (topdec, topdecs)) | SEMICOLON expsAndTopdecs ([] :: expsAndTopdecs) topdec : topdecnode (Topdec.makeRegion' (topdecnode, topdecnodeleft, topdecnoderight)) topdecnode : strdec (Topdec.Strdec strdec) | SIGNATURE sigbinds (let val sigbinds = Vector.fromList sigbinds val d = Topdec.Signature sigbinds in d end) | FUNCTOR funbinds (Topdec.Functor (Vector.fromList funbinds)) (*---------------------------------------------------*) (* Structures *) (*---------------------------------------------------*) strdecs : strdecsnode (Strdec.makeRegion' (strdecsnode, strdecsnodeleft, strdecsnoderight)) strdecsnode : (Strdec.Seq []) | SEMICOLON strdecs (Strdec.Seq [strdecs]) | strdec strdecs (Strdec.Seq [strdec, strdecs]) strdec : strdecnode (Strdec.makeRegion' (strdecnode, strdecnodeleft, strdecnoderight)) strdecnode : STRUCTURE strbinds (let val strbinds = Vector.fromList strbinds val d = Strdec.Structure strbinds in d end) | LOCAL strdecs IN strdecs END (Strdec.Local (strdecs1, strdecs2)) | decnolocal (Strdec.Core (Dec.makeRegion' (decnolocal, decnolocalleft, decnolocalright))) strbinds : strid sigconst EQUALOP strbinds' (let val (def,strbinds) = strbinds' in {name = strid, def = def, constraint = sigconst} :: strbinds end) strbinds' : strexp1 strbinds'1 (augment1 (strexp1, strbinds'1)) | strexp2 strbinds'2 ((strexp2,strbinds'2)) strbinds'1 : strbinds'2 (([], strbinds'2left, strbinds'2)) | WHERE wherespec strbinds'1' (cons1 (wherespec,strbinds'1')) strbinds'1' : strbinds'1 (strbinds'1) | AND wherespec strbinds'1' (cons1 (wherespec,strbinds'1')) strbinds'2 : ([]) | AND strbinds (strbinds) strexp : strexpnode (Strexp.makeRegion' (strexpnode, strexpnodeleft, strexpnoderight)) strexpnode : strexp1 (let val (strexp, sigconst, sigexp) = strexp1 in Strexp.Constrained (strexp, sigconst sigexp) end) | strexp1 wherespecs (let val (strexp,sigconst,sigexp) = strexp1 in Strexp.Constrained (strexp, sigconst (Sigexp.wheree (sigexp, wherespecs, Region.extendRight (Sigexp.region sigexp, wherespecsright)))) end) | strexp2node (strexp2node) strexp1 : strexp COLON sigexp' ((strexp,SigConst.Transparent,sigexp')) | strexp COLONGT sigexp' ((strexp,SigConst.Opaque,sigexp')) strexp2 : strexp2node (Strexp.makeRegion' (strexp2node, strexp2nodeleft, strexp2noderight)) strexp2node : longid (Strexp.Var (Longstrid.fromSymbols longid)) | STRUCT strdecs END (Strexp.Struct strdecs) | longid arg_fct (Strexp.App (Fctid.fromSymbol (ensureNonqualified longid), arg_fct)) | LET strdecs IN strexp END (Strexp.Let (strdecs,strexp)) arg_fct : LPAREN strexp RPAREN (strexp) | LPAREN strdecs RPAREN (Strexp.makeRegion' (Strexp.Struct strdecs, strdecsleft, strdecsright)) (*---------------------------------------------------*) (* Signatures *) (*---------------------------------------------------*) sigexp : sigexp' (sigexp') | sigexp' wherespecs (Sigexp.wheree (sigexp', wherespecs, reg (sigexp'left, wherespecsright))) wherespecs : wherespecs' (Vector.fromList wherespecs') wherespecs' : WHERE wherespec ([wherespec]) | WHERE wherespec wherespecs' (wherespec :: wherespecs') | WHERE wherespec andspecs (wherespec :: andspecs) andspecs : AND wherespec ([wherespec]) | AND wherespec andspecs (wherespec :: andspecs) | AND wherespec wherespecs' (wherespec :: wherespecs') sigbinds: sigid EQUALOP sigexp' sigbinds' (augment (sigid, sigexp', sigbinds')) sigexp' : sigexp'node (Sigexp.makeRegion' (sigexp'node, sigexp'nodeleft, sigexp'noderight)) sigexp'node : sigid (Sigexp.Var sigid) | SIG specs END (Sigexp.Spec specs) sigbinds': (([], defaultPos, [])) | AND sigbinds (([], defaultPos, sigbinds)) | WHERE wherespec sigbinds'' (cons1 (wherespec,sigbinds'')) sigbinds'' : sigbinds' (sigbinds') | AND wherespec sigbinds'' (cons1 (wherespec,sigbinds'')) wherespec : TYPE tyvars longtycon EQUALOP ty ({tyvars = tyvars, longtycon = longtycon, ty = ty}) sigconst : (SigConst.None) | COLON sigexp (SigConst.Transparent sigexp) | COLONGT sigexp (SigConst.Opaque sigexp) specs : (Spec.makeRegion (Spec.Empty, Region.bogus)) | SEMICOLON specs (specs) | spec specs (Spec.seq (spec, specs)) spec : specnode (Spec.makeRegion' (specnode, specnodeleft, specnoderight)) specnode : VAL valdescs (Spec.Val (Vector.fromList valdescs)) | TYPE typdescs (Spec.Type (Vector.fromList typdescs)) | TYPE typBind (Spec.TypeDefs typBind) | EQTYPE typdescs (Spec.Eqtype (Vector.fromList typdescs)) | DATATYPE datatypeRhsNoWithtype (Spec.Datatype datatypeRhsNoWithtype) | EXCEPTION exndescs (Spec.Exception (Vector.fromList exndescs)) | STRUCTURE strdescs (Spec.Structure (Vector.fromList strdescs)) | INCLUDE sigexp (Spec.IncludeSigexp sigexp) | INCLUDE sigid sigids (* p. 59 *) (Spec.IncludeSigids (Vector.fromList (sigid :: sigids)) ) | sharespec (Spec.Sharing {spec = Spec.makeRegion' (Spec.Empty, sharespecleft, sharespecright), equations = (Vector.new1 (Equation.makeRegion' (sharespec, sharespecleft, sharespecright)))}) sharespec : SHARING TYPE longtyconeqns (Equation.Type longtyconeqns) | SHARING longstrideqns (Equation.Structure longstrideqns) longstrideqns : longstrid EQUALOP longstrid ([longstrid1,longstrid2]) | longstrid EQUALOP longstrideqns (longstrid :: longstrideqns) longtyconeqns : longtycon EQUALOP longtycon ([longtycon1,longtycon2]) | longtycon EQUALOP longtyconeqns (longtycon :: longtyconeqns) strdescs : strid COLON sigexp' strdescs' (augment (strid, sigexp', strdescs')) strdescs' : (([], defaultPos, [])) | AND strdescs (([], defaultPos, strdescs)) | WHERE wherespec strdescs'' (cons1 (wherespec, strdescs'')) strdescs'' : strdescs' (strdescs') | AND wherespec strdescs'' (cons1 (wherespec, strdescs'')) typdescs : typdesc ([typdesc]) | typdesc AND typdescs (typdesc :: typdescs) typdesc : tyvars tycon ({tyvars = tyvars, tycon = tycon}) valdescs : valdesc ([valdesc]) | valdesc AND valdescs (valdesc :: valdescs) valdesc : var COLON ty (Con.ensureSpecify (Vid.toCon (Vid.fromVar var)) ; (var, ty)) exndescs : exndesc ([exndesc]) | exndesc AND exndescs (exndesc :: exndescs) exndesc : con tyOpt (Con.ensureSpecify con; (con, tyOpt)) tyOpt : (NONE) | OF ty (SOME ty) (*---------------------------------------------------*) (* Functors *) (*---------------------------------------------------*) funbinds : fctid LPAREN fctarg RPAREN sigconst EQUALOP funbinds' (let val (strexp,funbinds) = funbinds' in {name = fctid, arg = FctArg.makeRegion' (fctarg, fctargleft, fctargright), result = sigconst, body = strexp} :: funbinds end) funbinds' : strexp1 funbinds'1 (augment1 (strexp1, funbinds'1)) | strexp2 funbinds'2 ((strexp2, funbinds'2)) funbinds'1 : funbinds'2 ([], funbinds'2left, funbinds'2) | WHERE wherespec funbinds'1' (cons1 (wherespec,funbinds'1')) funbinds'2 : ([]) | AND funbinds (funbinds) funbinds'1' : funbinds'1 (funbinds'1) | AND wherespec funbinds'1' (cons1 (wherespec,funbinds'1')) fctarg : strid COLON sigexp (FctArg.Structure (strid, sigexp)) | specs (FctArg.Spec specs) (*---------------------------------------------------*) (* Declarations *) (*---------------------------------------------------*) decs : (Dec.makeRegion' (Dec.SeqDec (Vector.new0 ()), defaultPos, defaultPos)) | dec decs (Dec.sequence (dec,decs)) | SEMICOLON decs (decs) dec : decnode (Dec.makeRegion' (decnode, decnodeleft, decnoderight)) decnode : decnolocal (decnolocal) | LOCAL decs IN decs END (Dec.Local (decs1,decs2)) decnolocal : VAL valbindTop (Dec.Val {tyvars = Vector.new0 (), vbs = #1 valbindTop, rvbs = #2 valbindTop}) | VAL tyvarseq valbindTop (Dec.Val {tyvars = tyvarseq, vbs = #1 valbindTop, rvbs = #2 valbindTop}) | FUN funs (Dec.Fun (Vector.new0 (), Vector.fromList funs)) | FUN tyvarseq funs (Dec.Fun (tyvarseq, Vector.fromList funs)) | TYPE typBind (Dec.Type typBind) | DATATYPE datatypeRhs (Dec.Datatype datatypeRhs) | ABSTYPE datBind WITH decs END (Dec.Abstype {datBind = datBind, body = decs}) | EXCEPTION ebs (Dec.Exception (Vector.fromList ebs)) | OPEN longstrids (Dec.Open (Vector.fromList longstrids)) | fixity vids (Dec.Fix {fixity = fixity, ops = Vector.fromList vids}) | OVERLOAD priority var COLON ty AS longvidands (Dec.Overload (priority, var, Vector.new0 (), ty, Vector.fromList longvidands)) valbindTop : valbind (let val (vbs, rvbs) = valbind in (Vector.fromList vbs, Vector.fromList rvbs) end) valbind : pat EQUALOP exp valbindRest (let val (vbs, rvbs) = valbindRest in ({pat = pat, exp = exp} :: vbs, rvbs) end) | REC rvalbind (([], rvalbind)) valbindRest : (([], [])) | AND valbind (valbind) rvalbind : REC rvalbind (rvalbind) | pat EQUALOP FN match rvalbindRest ({pat = pat, match = match} :: rvalbindRest) rvalbindRest : ([]) | AND rvalbind (rvalbind) constraint : (NONE) | COLON ty (SOME ty) funs : clausesTop ([clausesTop]) | clausesTop AND funs (clausesTop :: funs) clausesTop: clauses (Vector.fromList clauses) clauses : clause ([clause]) | clause BAR clauses (clause :: clauses) clause : apats constraint EQUALOP exp ({pats = Vector.fromList apats, resultType = constraint, body = exp}) typBind : typBind' (let val typBind = Vector.fromList typBind' val b = TypBind.makeRegion' (TypBind.T typBind, typBind'left, typBind'right) in b end) typBind' : tyvars tycon EQUALOP ty typBind'' ({def = ty, tycon = tycon, tyvars = tyvars} :: typBind'') typBind'' : ([]) | AND typBind' (typBind') tyvars : tyvarseq (tyvarseq) | (Vector.new0 ()) tyvarseq: tyvar (Vector.new1 tyvar) | LPAREN tyvar_pc RPAREN (let val v = Vector.fromList tyvar_pc val () = reportDuplicates (v, {equals = Tyvar.sameName, layout = Tyvar.layout, name = "type variable", region = Tyvar.region, term = fn () => Layout.tuple (Vector.toListMap (v, Tyvar.layout))}) in v end) tyvar_pc: tyvar ([tyvar]) | tyvar COMMA tyvar_pc (tyvar :: tyvar_pc) constrs : constr ([constr]) | constr BAR constrs (constr :: constrs) constr : opcon (opcon, NONE) | opcon OF ty (opcon, SOME ty) opcon : con (con) | OP con (con) ebs : eb ([eb]) | eb AND ebs (eb::ebs) eb : opcon ebrhs (Con.ensureRedefine opcon; (opcon, ebrhs)) ebrhs : ebrhsnode (EbRhs.makeRegion' (ebrhsnode, ebrhsnodeleft, ebrhsnoderight)) ebrhsnode : (EbRhs.Gen NONE) | OF ty (EbRhs.Gen (SOME ty)) | EQUALOP longcon (EbRhs.Def longcon) | EQUALOP OP longcon (EbRhs.Def longcon) fixity : INFIX (Fixity.Infix NONE) | INFIX digit (Fixity.Infix (SOME digit)) | INFIXR (Fixity.Infixr NONE) | INFIXR digit (Fixity.Infixr (SOME digit)) | NONFIX (Fixity.Nonfix) priority : (Priority.T NONE) | digit (Priority.T (SOME digit)) int : INT (let val {digits, negate, radix} = INT in case StringCvt.scanString (fn r => IntInf.scan (radix, r)) digits of NONE => Error.bug "parser saw invalid int" | SOME i => if negate then ~ i else i end) word : WORD (let val {digits, radix} = WORD in case StringCvt.scanString (fn r => IntInf.scan (radix, r)) digits of NONE => Error.bug "parser saw invalid word" | SOME i => i end) digit : INT (let val {digits, negate, radix} = INT in if 1 = String.size digits andalso not negate andalso radix = StringCvt.DEC then valOf (Int.fromString digits) else let open Layout val _ = Control.error (reg (INTleft, INTright), str "invalid digit in infix declaration", empty) in 0 end end) datatypeRhs : datatypeRhsnode (DatatypeRhs.makeRegion' (datatypeRhsnode, datatypeRhsnodeleft, datatypeRhsnoderight)) datatypeRhsNoWithtype : datatypeRhsnodeNoWithtype (DatatypeRhs.makeRegion' (datatypeRhsnodeNoWithtype, datatypeRhsnodeNoWithtypeleft, datatypeRhsnodeNoWithtyperight)) datatypeRhsnode : repl (repl) | datBind (DatatypeRhs.DatBind datBind) datatypeRhsnodeNoWithtype : repl (repl) | datBindNoWithtype (DatatypeRhs.DatBind datBindNoWithtype) repl : tyvars tycon EQUALOP DATATYPE longtycon (if Vector.isEmpty tyvars then () else error (reg (tyvarsleft, tyvarsright), "nonempty tyvars in datatype repl") ; DatatypeRhs.Repl {lhs = tycon, rhs = longtycon}) datBind : dbs withtypes (DatBind.make (dbs, withtypes, dbsleft, withtypesright)) datBindNoWithtype : dbs (DatBind.make (dbs, TypBind.empty, dbsleft, dbsright)) dbs : dbs' (Vector.fromList dbs') dbs' : db ([db]) | db AND dbs' (db :: dbs') db : tyvars tycon EQUALOP constrs ({cons = Vector.fromList constrs, tycon = tycon, tyvars = tyvars}) withtypes : (TypBind.empty) | WITHTYPE typBind (typBind) longvidands : longvid ([longvid]) | longvid AND longvidands (longvid :: longvidands) match : rules (Match.makeRegion' (Match.T (Vector.fromList rules), rulesleft, rulesright)) rules : rule ([rule]) | rule BAR rules (rule :: rules) rule : pat DARROW exp ((pat,exp)) elabel : field EQUALOP exp (field,exp) elabels : elabel COMMA elabels (elabel :: elabels) | elabel ([elabel]) exp_ps : exp SEMICOLON exp ([exp1, exp2]) | exp SEMICOLON exp_ps (exp :: exp_ps) exp : expnode (Exp.makeRegion' (expnode, expnodeleft, expnoderight)) expnode : exp HANDLE match (Exp.Handle (exp, match)) | exp ORELSE exp (Exp.Orelse (exp1, exp2)) | exp ANDALSO exp (Exp.Andalso (exp1, exp2)) | exp COLON ty (Exp.Constraint (exp, ty)) | app_exp (Exp.FlatApp (Vector.fromList app_exp)) | FN match (Exp.Fn match) | CASE exp OF match (Exp.Case (exp, match)) | WHILE exp DO exp (Exp.While {test = exp1, expr = exp2}) | IF exp THEN exp ELSE exp (Exp.If (exp1, exp2, exp3)) | RAISE exp (Exp.Raise exp) app_exp : aexp app_exp1 (Exp.makeRegion' (aexp, aexpleft, aexpright) :: app_exp1) | longvid app_exp1 (Exp.makeRegion' (Exp.Var {name = longvid, fixop = Fixop.None}, longvidleft, longvidright) :: app_exp1) app_exp1 : ([]) | app_exp (app_exp) aexp : OP longvid (Exp.Var {name = longvid, fixop = Fixop.Op}) | const (Exp.Const const) | HASH field (Exp.Selector field) | LBRACE elabels RBRACE (Exp.Record (Record.fromVector (Vector.fromList elabels))) | LBRACE RBRACE (Exp.unit) | LPAREN RPAREN (Exp.unit) | LPAREN expnode RPAREN (expnode) | LPAREN exp_ps RPAREN (Exp.Seq (Vector.fromList exp_ps)) | LPAREN exp_2c RPAREN (Exp.tuple (Vector.fromList exp_2c)) | LBRACKET exp_list RBRACKET (Exp.List (Vector.fromList exp_list)) | LBRACKET RBRACKET (Exp.List (Vector.new0 ())) | LET decs IN exp END (Exp.Let (decs, exp)) | LET decs IN exp_ps END (Exp.Let (decs, Exp.makeRegion' (Exp.Seq (Vector.fromList exp_ps), exp_psleft, exp_psright))) | ADDRESS string symattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.Address {attributes = symattributes, name = string, ty = ty})) | BUILD_CONST string COLON ty SEMICOLON (Exp.Prim (PrimKind.BuildConst {name = string, ty = ty})) | COMMAND_LINE_CONST string COLON ty EQUALOP constOrBool SEMICOLON (Exp.Prim (PrimKind.CommandLineConst {name = string, ty = ty, value = constOrBool})) | CONST string COLON ty SEMICOLON (Exp.Prim (PrimKind.Const {name = string, ty = ty})) | EXPORT string ieattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.Export {attributes = ieattributes, name = string, ty = ty})) | IMPORT string ieattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.Import {attributes = ieattributes, name = string, ty = ty})) | IMPORT ASTERISK ieattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.IImport {attributes = ieattributes, ty = ty})) | PRIM string COLON ty SEMICOLON (Exp.Prim (PrimKind.Prim {name = string, ty = ty})) | SYMBOL string symattributes COLON ty SEMICOLON (Exp.Prim (PrimKind.Symbol {attributes = symattributes, name = string, ty = ty})) | SYMBOL ASTERISK COLON ty SEMICOLON (Exp.Prim (PrimKind.ISymbol {ty = ty})) ieattributes : ([]) | id ieattributes (let val id = Symbol.toString (#1 id) in case id of "cdecl" => PrimKind.ImportExportAttribute.Cdecl :: ieattributes | "external" => PrimKind.ImportExportAttribute.External :: ieattributes | "private" => PrimKind.ImportExportAttribute.Private :: ieattributes | "public" => PrimKind.ImportExportAttribute.Public :: ieattributes | "stdcall" => PrimKind.ImportExportAttribute.Stdcall :: ieattributes | _ => (error (reg (idleft, idright), concat ["invalid attribute: ", id]) ; ieattributes) end) symattributes : ([]) | id symattributes (let val id = Symbol.toString (#1 id) in case id of "alloc" => PrimKind.SymbolAttribute.Alloc :: symattributes | "external" => PrimKind.SymbolAttribute.External :: symattributes | "private" => PrimKind.SymbolAttribute.Private :: symattributes | "public" => PrimKind.SymbolAttribute.Public :: symattributes | _ => (error (reg (idleft, idright), concat ["invalid attribute: ", id]) ; symattributes) end) exp_2c : exp COMMA exp_2c (exp :: exp_2c) | exp COMMA exp ([exp1, exp2]) exp_list : exp ([exp]) | exp COMMA exp_list (exp :: exp_list) (*---------------------------------------------------*) (* Patterns *) (*---------------------------------------------------*) pat : patnode (Pat.makeRegion' (patnode, patnodeleft, patnoderight)) patnode : pat AS pat (Pat.makeAs (pat1, pat2)) | pat COLON ty (Pat.Constraint (pat, ty)) | apats (Pat.FlatApp (Vector.fromList apats)) apats : apat ([apat]) | apat apats (apat :: apats) apat : apatnode (Pat.makeRegion' (apatnode, apatnodeleft, apatnoderight)) apatnode : longvidNoEqual (Pat.Var {name = longvidNoEqual, fixop = Fixop.None}) | OP longvid (Pat.Var {name = longvid, fixop = Fixop.Op}) | const (let val _ = case Const.node const of Const.Real r => let open Layout in Control.error (Const.region const, seq [str "real constants are not allowed in patterns: ", Const.layout const], empty) end | _ => () in Pat.Const const end) | WILD (Pat.Wild) | LPAREN pats RPAREN (Pat.tuple (Vector.fromList pats)) | LBRACKET pats RBRACKET (Pat.List (Vector.fromList pats)) | LBRACE RBRACE (Pat.unit) | LBRACE patitems RBRACE (let val (items, flexible) = patitems in Pat.Record {flexible = flexible, items = Vector.fromList items} end) pats: ([]) | pat commapats (pat :: commapats) commapats : ([]) | COMMA pat commapats (pat :: commapats) patitems : patitem COMMA patitems (let val (items, f) = patitems in (patitem :: items, f) end) | patitem ([patitem], false) | DOTDOTDOT ([], true) patitem : field EQUALOP pat ((field, Pat.Item.Field pat)) | vidNoEqual constraint opaspat (Field.Symbol (Vid.toSymbol vidNoEqual), Pat.Item.Vid (vidNoEqual, constraint, opaspat)) opaspat : (NONE) | AS pat (SOME pat) (*---------------------------------------------------*) (* Types *) (*---------------------------------------------------*) ty : tynode (Type.makeRegion' (tynode, tynodeleft, tynoderight)) tynode : tuple_ty (Type.tuple (Vector.fromList tuple_ty)) | ty ARROW ty (Type.arrow (ty1, ty2)) | ty'node (ty'node) ty' : ty'node (Type.makeRegion' (ty'node, ty'nodeleft, ty'noderight)) ty'node : tyvar (Type.Var tyvar) | LBRACE tlabels RBRACE (Type.Record (Srecord.fromVector (Vector.fromList tlabels))) | LBRACE RBRACE (Type.unit) | LPAREN ty0_pc RPAREN longtycon (Type.Con (longtycon, Vector.fromList ty0_pc)) | LPAREN ty RPAREN (Type.node ty) | ty' longtycon (Type.Con (longtycon, Vector.new1 ty')) | longtycon (Type.Con (longtycon, Vector.new0 ())) tlabel : field COLON ty (field, ty) tlabels : tlabel COMMA tlabels (tlabel :: tlabels) | tlabel ([tlabel]) tuple_ty : ty' ASTERISK tuple_ty (ty' :: tuple_ty) | ty' ASTERISK ty' ([ty'1, ty'2]) ty0_pc : ty COMMA ty ([ty1, ty2]) | ty COMMA ty0_pc (ty :: ty0_pc) (*---------------------------------------------------*) (* Atoms *) (*---------------------------------------------------*) constOrBool : const (const) | id (let fun ok b = Const.makeRegion (Const.Bool b, reg (idleft, idright)) in case Symbol.toString (#1 id) of "false" => ok false | "true" => ok true | s => (error (#2 id, concat ["unknown boolean constant: ", s]) ; ok false) end) const : const' (Const.makeRegion (const', reg (const'left, const'right))) const' : int (Const.Int int) | word (Const.Word word) | REAL (Const.Real REAL) | STRING (Const.String STRING) | CHAR (Const.Char CHAR) string : STRING (CharVector.tabulate (Vector.length STRING, fn i => Char.fromInt (Int.fromIntInf (Vector.sub (STRING, i))))) idNoAsterisk : longidNoAsterisk (ensureNonqualified longidNoAsterisk) id : idNoAsterisk (idNoAsterisk) | ASTERISK ((Symbol.asterisk, reg (ASTERISKleft, ASTERISKright))) idEqual : id (id) | EQUALOP ((Symbol.equal, reg (EQUALOPleft, EQUALOPright))) longid : longidNoAsterisk (longidNoAsterisk) | ASTERISK (([Symbol.asterisk], reg (ASTERISKleft, ASTERISKright))) longidNoAsterisk : LONGID (let val syms = List.map (String.split (LONGID, #"."), Symbol.fromString) in (syms, reg (LONGIDleft, LONGIDright)) end) longidEqual : longid (longid) | EQUALOP (([Symbol.equal], reg (EQUALOPleft, EQUALOPright))) vid : idEqual (Vid.fromSymbol idEqual) vidNoEqual : id (Vid.fromSymbol id) vids : vid ([vid]) | vid vids (vid::vids) var : idEqual (Var.fromSymbol idEqual) con : id (Con.fromSymbol id) tycon : idNoAsterisk (Tycon.fromSymbol idNoAsterisk) tyvar : TYVAR (Tyvar.newString (TYVAR, {left = TYVARleft, right = TYVARright})) field : id (Field.Symbol (#1 id)) | int (let val int = IntInf.toInt int handle Exn.Overflow => (error (reg (intleft, intright), "field too huge") ; 0) in Field.Int (if int <= 0 then (error (reg (intleft, intright), "nonpositive field") ; ~1) else int - 1) end) (* int - 1 because fields are 0-based *) strid : id (Strid.fromSymbol id) sigid : id (Sigid.fromSymbol id) sigids : sigid ([sigid]) | sigid sigids (sigid :: sigids) fctid : id (Fctid.fromSymbol id) longtycon : longidNoAsterisk (Longtycon.fromSymbols longidNoAsterisk) longvid : longidEqual (Longvid.fromSymbols longidEqual) longvidNoEqual : longid (Longvid.fromSymbols longid) longcon : longid (Longcon.fromSymbols longid) longstrid : longid (Longstrid.fromSymbols longid) longstrids : longstrid ([longstrid]) | longstrid longstrids (longstrid :: longstrids) mlton-20100608/mlton/front-end/ml.lex0000644000076600000240000003552511404435623015742 0ustar mtfstaff(* Heavily modified from the SML/NJ sources by sweeks@sweeks.com. *) (* ml.lex * * Copyright 1989 by AT&T Bell Laboratories * * $Log: ml.lex,v $ * Revision 1.3 1997/05/22 20:17:22 jhr * Changed lexer to accept "1e1" style floating-point literals. * * Revision 1.2 1997/01/28 23:20:40 jhr * Integer and word literals are now represented by IntInf.int (instead of * as strings). * *) type svalue = Tokens.svalue type pos = SourcePos.t type lexresult = (svalue, pos) Tokens.token type lexarg = {source: Source.t} type arg = lexarg type ('a,'b) token = ('a,'b) Tokens.token val charlist: IntInf.t list ref = ref [] val colNum: int ref = ref 0 val commentLevel: int ref = ref 0 val commentStart = ref SourcePos.bogus val lineFile: File.t ref = ref "" val lineNum: int ref = ref 0 val stringStart = ref SourcePos.bogus val stringtype = ref false fun lineDirective (source, file, yypos) = Source.lineDirective (source, file, {lineNum = !lineNum, lineStart = yypos - !colNum}) fun addString (s: string) = charlist := String.fold (s, !charlist, fn (c, ac) => Int.toIntInf (Char.ord c) :: ac) fun addChar (c: char) = addString (String.fromChar c) fun inc (ri as ref (i: int)) = ri := i + 1 fun dec (ri as ref (i: int)) = ri := i - 1 fun error (source, left, right, msg) = Control.errorStr (Region.make {left = Source.getPos (source, left), right = Source.getPos (source, right)}, msg) fun stringError (source, right, msg) = Control.errorStr (Region.make {left = !stringStart, right = Source.getPos (source, right)}, msg) fun addOrd (i: IntInf.t): unit = List.push (charlist, i) fun addHexEscape (s: string, source, yypos): unit = case StringCvt.scanString (Pervasive.IntInf.scan StringCvt.HEX) s of NONE => stringError (source, yypos, "illegal unicode escape") | SOME i => addOrd i val eof: lexarg -> lexresult = fn {source, ...} => let val pos = Source.lineStart source val _ = if !commentLevel > 0 then Control.errorStr (Region.make {left = !commentStart, right = pos}, "unclosed comment") else () in Tokens.EOF (pos, pos) end val size = String.size fun tok (t, s, l, r) = let val l = Source.getPos (s, l) val r = Source.getPos (s, r) val _ = if true then () else print (concat ["tok (", SourcePos.toString l, ", " , SourcePos.toString r, ")\n"]) in t (l, r) end fun tok' (t, x, s, l) = tok (fn (l, r) => t (x, l, r), s, l, l + size x) fun int (yytext, drop, source, yypos, {negate: bool}, radix) = Tokens.INT ({digits = String.dropPrefix (yytext, drop), negate = negate, radix = radix}, Source.getPos (source, yypos), Source.getPos (source, yypos + size yytext)) fun word (yytext, drop, source, yypos, radix) = Tokens.WORD ({digits = String.dropPrefix (yytext, drop), radix = radix}, Source.getPos (source, yypos), Source.getPos (source, yypos + size yytext)) %% %reject %s A S F L LL LLC LLCQ; %header (functor MLLexFun (structure Tokens : ML_TOKENS)); %arg ({source}); alphanum=[A-Za-z'_0-9]*; alphanumId=[A-Za-z]{alphanum}; sym=[-!%&$+/:<=>?@~`^|#*]|"\\"; symId={sym}+; id={alphanumId}|{symId}; longid={id}("."{id})*; ws=("\012"|[\t\ ])*; nrws=("\012"|[\t\ ])+; cr="\013"; nl="\010"; eol=({cr}{nl}|{nl}|{cr}); num=[0-9]+; frac="."{num}; exp=[eE](~?){num}; real=(~?)(({num}{frac}?{exp})|({num}{frac}{exp}?)); hexDigit=[0-9a-fA-F]; hexnum={hexDigit}+; %% {ws} => (continue ()); {eol} => (Source.newline (source, yypos); continue ()); "_address" => (tok (Tokens.ADDRESS, source, yypos, yypos + size yytext)); "_build_const" => (tok (Tokens.BUILD_CONST, source, yypos, yypos + size yytext)); "_command_line_const" => (tok (Tokens.COMMAND_LINE_CONST, source, yypos, yypos + size yytext)); "_const" => (tok (Tokens.CONST, source, yypos, yypos + size yytext)); "_export" => (tok (Tokens.EXPORT, source, yypos, yypos + size yytext)); "_import" => (tok (Tokens.IMPORT, source, yypos, yypos + size yytext)); "_overload" => (tok (Tokens.OVERLOAD, source, yypos, yypos + size yytext)); "_symbol" => (tok (Tokens.SYMBOL, source, yypos, yypos + size yytext)); "_prim" => (tok (Tokens.PRIM, source, yypos, yypos + size yytext)); "_" => (tok (Tokens.WILD, source, yypos, yypos + 1)); "," => (tok (Tokens.COMMA, source, yypos, yypos + 1)); "{" => (tok (Tokens.LBRACE, source, yypos, yypos + 1)); "}" => (tok (Tokens.RBRACE, source, yypos, yypos + 1)); "[" => (tok (Tokens.LBRACKET, source, yypos, yypos + 1)); "]" => (tok (Tokens.RBRACKET, source, yypos, yypos + 1)); ";" => (tok (Tokens.SEMICOLON, source, yypos, yypos + 1)); "(" => (tok (Tokens.LPAREN, source, yypos, yypos + 1)); ")" => (tok (Tokens.RPAREN, source, yypos, yypos + 1)); "..." => (tok (Tokens.DOTDOTDOT, source, yypos, yypos + 3)); "|" => (tok (Tokens.BAR, source, yypos, yypos + 1)); ":" => (tok (Tokens.COLON, source, yypos, yypos + 1)); ":>" => (tok (Tokens.COLONGT, source, yypos, yypos + 1)); "=" => (tok (Tokens.EQUALOP, source, yypos, yypos + 1)); "#" => (tok (Tokens.HASH, source, yypos, yypos + 1)); "->" => (tok (Tokens.ARROW, source, yypos, yypos + 2)); "=>" => (tok (Tokens.DARROW, source, yypos, yypos + 2)); "and" => (tok (Tokens.AND, source, yypos, yypos + 3)); "abstype" => (tok (Tokens.ABSTYPE, source, yypos, yypos + 7)); "as" => (tok (Tokens.AS, source, yypos, yypos + 2)); "case" => (tok (Tokens.CASE, source, yypos, yypos + 4)); "datatype" => (tok (Tokens.DATATYPE, source, yypos, yypos + 8)); "else" => (tok (Tokens.ELSE, source, yypos, yypos + 4)); "end" => (tok (Tokens.END, source, yypos, yypos + 3)); "eqtype" => (tok (Tokens.EQTYPE, source, yypos, yypos + 6)); "exception" => (tok (Tokens.EXCEPTION, source, yypos, yypos + 9)); "do" => (tok (Tokens.DO, source, yypos, yypos + 2)); "fn" => (tok (Tokens.FN, source, yypos, yypos + 2)); "fun" => (tok (Tokens.FUN, source, yypos, yypos + 3)); "functor" => (tok (Tokens.FUNCTOR, source, yypos, yypos + 7)); "handle" => (tok (Tokens.HANDLE, source, yypos, yypos + 6)); "if" => (tok (Tokens.IF, source, yypos, yypos + 2)); "in" => (tok (Tokens.IN, source, yypos, yypos + 2)); "include" => (tok (Tokens.INCLUDE, source, yypos, yypos + 7)); "infix" => (tok (Tokens.INFIX, source, yypos, yypos + 5)); "infixr" => (tok (Tokens.INFIXR, source, yypos, yypos + 6)); "let" => (tok (Tokens.LET, source, yypos, yypos + 3)); "local" => (tok (Tokens.LOCAL, source, yypos, yypos + 5)); "nonfix" => (tok (Tokens.NONFIX, source, yypos, yypos + 6)); "of" => (tok (Tokens.OF, source, yypos, yypos + 2)); "op" => (tok (Tokens.OP, source, yypos, yypos + 2)); "open" => (tok (Tokens.OPEN, source, yypos, yypos + 4)); "raise" => (tok (Tokens.RAISE, source, yypos, yypos + 5)); "rec" => (tok (Tokens.REC, source, yypos, yypos + 3)); "sharing" => (tok (Tokens.SHARING, source, yypos, yypos + 7)); "sig" => (tok (Tokens.SIG, source, yypos, yypos + 3)); "signature" => (tok (Tokens.SIGNATURE, source, yypos, yypos + 9)); "struct" => (tok (Tokens.STRUCT, source, yypos, yypos + 6)); "structure" => (tok (Tokens.STRUCTURE, source, yypos, yypos + 9)); "then" => (tok (Tokens.THEN, source, yypos, yypos + 4)); "type" => (tok (Tokens.TYPE, source, yypos, yypos + 4)); "val" => (tok (Tokens.VAL, source, yypos, yypos + 3)); "where" => (tok (Tokens.WHERE, source, yypos, yypos + 5)); "while" => (tok (Tokens.WHILE, source, yypos, yypos + 5)); "with" => (tok (Tokens.WITH, source, yypos, yypos + 4)); "withtype" => (tok (Tokens.WITHTYPE, source, yypos, yypos + 8)); "orelse" => (tok (Tokens.ORELSE, source, yypos, yypos + 6)); "andalso" => (tok (Tokens.ANDALSO, source, yypos, yypos + 7)); "'"{alphanum}? => (tok' (Tokens.TYVAR, yytext, source, yypos)); {longid} => (case yytext of "*" => tok (Tokens.ASTERISK, source, yypos, yypos + 1) | _ => tok' (Tokens.LONGID, yytext, source, yypos)); {real} => (tok' (Tokens.REAL, yytext, source, yypos)); {num} => (int (yytext, 0, source, yypos, {negate = false}, StringCvt.DEC)); "~"{num} => (int (yytext, 1, source, yypos, {negate = true}, StringCvt.DEC)); "0x"{hexnum} => (int (yytext, 2, source, yypos, {negate = false}, StringCvt.HEX)); "~0x"{hexnum} => (int (yytext, 3, source, yypos, {negate = true}, StringCvt.HEX)); "0w"{num} => (word (yytext, 2, source, yypos, StringCvt.DEC)); "0wx"{hexnum} => (word (yytext, 3, source, yypos, StringCvt.HEX)); \" => (charlist := [] ; stringStart := Source.getPos (source, yypos) ; stringtype := true ; YYBEGIN S ; continue ()); \#\" => (charlist := [] ; stringStart := Source.getPos (source, yypos) ; stringtype := false ; YYBEGIN S ; continue ()); "(*#line"{nrws} => (YYBEGIN L ; commentStart := Source.getPos (source, yypos) ; commentLevel := 1 ; continue ()); "(*" => (YYBEGIN A ; commentLevel := 1 ; commentStart := Source.getPos (source, yypos) ; continue ()); . => (error (source, yypos, yypos + 1, "illegal token") ; continue ()); [0-9]+ => (YYBEGIN LL ; (lineNum := valOf (Int.fromString yytext) ; colNum := 1) handle Overflow => YYBEGIN A ; continue ()); \. => ((* cheat: take n > 0 dots *) continue ()); [0-9]+ => (YYBEGIN LLC ; (colNum := valOf (Int.fromString yytext)) handle Overflow => YYBEGIN A ; continue ()); . => (YYBEGIN LLC; continue () (* note hack, since ml-lex chokes on the empty string for 0* *)); "*)" => (YYBEGIN INITIAL ; lineDirective (source, NONE, yypos + 2) ; commentLevel := 0; charlist := []; continue ()); {ws}\" => (YYBEGIN LLCQ; continue ()); [^\"]* => (lineFile := yytext; continue ()); \""*)" => (YYBEGIN INITIAL ; lineDirective (source, SOME (!lineFile), yypos + 3) ; commentLevel := 0; charlist := []; continue ()); "*)" => (YYBEGIN INITIAL; commentLevel := 0; charlist := []; continue ()); . => (YYBEGIN A; continue ()); "(*" => (inc commentLevel; continue ()); \n => (Source.newline (source, yypos) ; continue ()); "*)" => (dec commentLevel ; if 0 = !commentLevel then YYBEGIN INITIAL else () ; continue ()); . => (continue ()); \" => (let val s = Vector.fromListRev (!charlist) val _ = charlist := nil fun make (t, v) = t (v, !stringStart, Source.getPos (source, yypos + 1)) val () = YYBEGIN INITIAL in if !stringtype then make (Tokens.STRING, s) else make (Tokens.CHAR, if 1 <> Vector.length s then (error (source, yypos, yypos + 1, "character constant not length 1") ; 0) else Vector.sub (s, 0)) end); \\a => (addChar #"\a"; continue ()); \\b => (addChar #"\b"; continue ()); \\f => (addChar #"\f"; continue ()); \\n => (addChar #"\n"; continue ()); \\r => (addChar #"\r"; continue ()); \\t => (addChar #"\t"; continue ()); \\v => (addChar #"\v"; continue ()); \\\^[@-_] => (addChar (Char.chr(Char.ord(String.sub(yytext, 2)) -Char.ord #"@")); continue ()); \\\^. => (error (source, yypos, yypos + 2, "illegal control escape; must be one of @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"); continue ()); \\[0-9]{3} => (let fun c (i, scale) = scale * (Char.ord (String.sub (yytext, i)) - Char.ord #"0") val () = addOrd (IntInf.fromInt (c (1, 100) + c (2, 10) + c (3, 1))) in continue () end); \\u{hexDigit}{4} => (addHexEscape (String.substring (yytext, 2, 4), source, yypos) ; continue ()); \\U{hexDigit}{8} => (addHexEscape (String.substring (yytext, 2, 8), source, yypos) ; continue ()); \\\" => (addString "\""; continue ()); \\\\ => (addString "\\"; continue ()); \\{nrws} => (YYBEGIN F; continue ()); \\{eol} => (Source.newline (source, yypos + 1) ; YYBEGIN F ; continue ()); \\ => (stringError (source, yypos, "illegal string escape") ; continue ()); {eol} => (Source.newline (source, yypos) ; stringError (source, yypos, "unclosed string") ; continue ()); " "|[\033-\126] => (addString yytext; continue ()); . => (stringError (source, yypos + 1, "illegal character in string") ; continue ()); {eol} => (Source.newline (source, yypos) ; continue ()); {ws} => (continue ()); \\ => (YYBEGIN S ; stringStart := Source.getPos (source, yypos) ; continue ()); . => (stringError (source, yypos, "unclosed string") ; continue ()); mlton-20100608/mlton/front-end/mlb-front-end.fun0000644000076600000240000002730611404435623017774 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MLBFrontEnd (S: MLB_FRONT_END_STRUCTS): MLB_FRONT_END = struct open S (* The lexer recursively invokes the lexer/parser when it encounters a file * reference. So, we need a stub here to feed to the lexer. The stub is * overridden after the lexer is defined. *) val lexAndParseProgOrMLBRef: (File.t * Region.t -> Ast.Basdec.node) ref = ref (fn _ => Error.bug "MLBFrontEnd.lexAndParseProgOrMLB") val lexAndParseProgOrMLB = fn f => !lexAndParseProgOrMLBRef f structure LrVals = MLBLrValsFun (structure Token = LrParser.Token structure Ast = Ast val lexAndParseProgOrMLB = lexAndParseProgOrMLB) structure Lex = MLBLexFun (structure Tokens = LrVals.Tokens) structure Parse = JoinWithArg (structure ParserData = LrVals.ParserData structure Lex = Lex structure LrParser = LrParser) fun lexAndParse (source: Source.t, ins: In.t) = let val stream = Parse.makeLexer (fn n => In.inputN (ins, n)) {source = source} val lookahead = 30 val result = (#1 (Parse.parse (lookahead, stream, fn (s, left, right) => Control.errorStr (Region.make {left = left, right = right}, s), ()))) handle _ => let val i = Source.lineStart source val _ = Control.errorStr (Region.make {left = i, right = i}, "parse error") in Ast.Basdec.empty end val () = Ast.Basdec.checkSyntax result in result end fun lexAndParseFile (f: File.t) = File.withIn (f, fn ins => lexAndParse (Source.new f, ins)) val lexAndParseFile = Trace.trace ("MLBFrontEnd.lexAndParseFile", File.layout, Ast.Basdec.layout) lexAndParseFile fun lexAndParseString (s: String.t) = let val source = Source.new "" val ins = In.openString s in lexAndParse (source, ins) end val lexAndParseString = Trace.trace ("MLBFrontEnd.lexAndParseString", String.layout, Ast.Basdec.layout) lexAndParseString val lexAndParseString = fn (s: string) => let val cwd = Dir.current () val relativize = SOME cwd val state = {cwd = cwd, relativize = relativize, seen = []} val psi : (File.t * Ast.Basdec.t Promise.t) HashSet.t = HashSet.new {hash = String.hash o #1} local val pathMap = Control.mlbPathMap () fun peekPathMap var' = case List.peek (pathMap, fn {var,...} => var = var') of NONE => NONE | SOME {path, ...} => SOME path in val peekPathMap = Trace.trace ("MLBFrontEnd.peekPathMap", String.layout, Option.layout Dir.layout) peekPathMap end fun expandPathVars (path, seen, region) = let fun loop (s, acc, accs) = case s of [] => String.concat (List.rev (String.fromListRev acc :: accs)) | #"$" :: #"(" :: s => let val accs = String.fromListRev acc :: accs fun loopVar (s, acc) = case s of [] => Error.bug "MLBFrontEnd.lexAndParseString.expandPathVars" | #")" :: s => (s, String.fromListRev acc) | c :: s => loopVar (s, c :: acc) val (s, var) = loopVar (s, []) in if List.exists (seen, fn x => x = var) then let open Layout in Control.error (region, str "Cyclic MLB path variables", List.layout Layout.str (var :: seen)) ; loop (s, [], accs) end else case peekPathMap var of NONE => let open Layout in Control.error (region, seq [str "Undefined MLB path variable: ", str var], empty) ; loop (s, [], accs) end | SOME path => loop (s, [], expandPathVars (path, var :: seen, region) :: accs) end | c :: s => loop (s, c :: acc, accs) in loop (String.explode path, [], []) end fun regularize {fileOrig, cwd, region, relativize} = let val fileExp = expandPathVars (fileOrig, [], region) val fileAbs = OS.Path.mkAbsolute {path = fileExp, relativeTo = cwd} val fileAbs = OS.Path.mkCanonical fileAbs val relativize = if !Control.preferAbsPaths orelse OS.Path.isAbsolute fileExp then NONE else relativize val fileUse = case relativize of NONE => fileAbs | SOME d => OS.Path.mkRelative {path = fileAbs, relativeTo = d} in {fileAbs = fileAbs, fileUse = fileUse, relativize = relativize} end val regularize = Trace.trace ("MLBFrontEnd.lexAndParseString.regularize", fn {fileOrig, cwd, relativize, ...} => Layout.record [("fileOrig", File.layout fileOrig), ("cwd", Dir.layout cwd), ("relativize", Option.layout Dir.layout relativize)], fn {fileAbs, fileUse, relativize} => Layout.record [("fileAbs", File.layout fileAbs), ("fileUse", File.layout fileUse), ("relativize", Option.layout Dir.layout relativize)]) regularize fun lexAndParseProg {fileAbs: File.t, fileOrig: File.t, fileUse: File.t, fail: String.t -> Ast.Program.t} = Ast.Basdec.Prog ({fileAbs = fileAbs, fileUse = fileUse}, Promise.delay (fn () => Control.checkFile (fileUse, {fail = fail, name = fileOrig, ok = fn () => FrontEnd.lexAndParseFile fileUse}))) and lexAndParseMLB {relativize: Dir.t option, seen: (File.t * File.t * Region.t) list, fileAbs: File.t, fileOrig: File.t, fileUse: File.t, fail: String.t -> Ast.Basdec.t, reg: Region.t} = Ast.Basdec.MLB ({fileAbs = fileAbs, fileUse = fileUse}, Promise.delay (fn () => Control.checkFile (fileUse, {fail = fail, name = fileOrig, ok = fn () => let val seen' = (fileAbs, fileUse, reg) :: seen in if List.exists (seen, fn (fileAbs', _, _) => String.equals (fileAbs, fileAbs')) then (let open Layout in Control.error (reg, seq [str "Basis forms a cycle with ", File.layout fileUse], align (List.map (seen', fn (_, f, r) => seq [Region.layout r, str ": ", File.layout f]))) ; Ast.Basdec.empty end) else let val (_, basdec) = HashSet.lookupOrInsert (psi, String.hash fileAbs, fn (fileAbs', _) => String.equals (fileAbs, fileAbs'), fn () => let val cwd = OS.Path.dir fileAbs val basdec = Promise.delay (fn () => wrapLexAndParse ({cwd = cwd, relativize = relativize, seen = seen'}, lexAndParseFile, fileUse)) in (fileAbs, basdec) end) in Promise.force basdec end end}))) and lexAndParseProgOrMLB {cwd, relativize, seen} (fileOrig: File.t, reg: Region.t) = Exn.withEscape (fn escape => let fun fail default msg = let val () = Control.error (reg, Layout.str msg, Layout.empty) in default end fun err msg = fail (Ast.Basdec.Seq []) (concat ["File ", fileOrig, msg]) val {fileAbs, fileUse, relativize, ...} = regularize {cwd = cwd, fileOrig = fileOrig, region = reg, relativize = relativize} handle _ => escape (err " could not be regularized") val mlbExts = ["mlb"] val progExts = ["ML","fun","sig","sml"] fun errUnknownExt () = err " has an unknown extension" in case File.extension fileUse of NONE => errUnknownExt () | SOME s => if List.contains (mlbExts, s, String.equals) then lexAndParseMLB {relativize = relativize, seen = seen, fileAbs = fileAbs, fileOrig = fileOrig, fileUse = fileUse, fail = fail Ast.Basdec.empty, reg = reg} else if List.contains (progExts, s, String.equals) then lexAndParseProg {fileAbs = fileAbs, fileOrig = fileOrig, fileUse = fileUse, fail = fail Ast.Program.empty} else errUnknownExt () end) and wrapLexAndParse (state, lexAndParse, arg) = Ref.fluidLet (lexAndParseProgOrMLBRef, lexAndParseProgOrMLB state, fn () => lexAndParse arg) val dec = wrapLexAndParse (state, lexAndParseString, s) in dec end end mlton-20100608/mlton/front-end/mlb-front-end.sig0000644000076600000240000000102011404435623017747 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MLB_FRONT_END_STRUCTS = sig structure Ast: AST structure FrontEnd: FRONT_END sharing Ast = FrontEnd.Ast end signature MLB_FRONT_END = sig include MLB_FRONT_END_STRUCTS val lexAndParseString: String.t -> Ast.Basdec.t end mlton-20100608/mlton/front-end/mlb.grm0000644000076600000240000001451311404435623016073 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) fun reg (left, right) = Region.make {left = left, right = right} fun error (reg, msg) = Control.error (reg, Layout.str msg, Layout.empty) open Ast type fctbinds = {lhs: Fctid.t, rhs: Fctid.t} list type sigbinds = {lhs: Sigid.t, rhs: Sigid.t} list type strbinds = {lhs: Strid.t, rhs: Strid.t} list type basbinds = {name: Basid.t, def: Basexp.t} list %% %term ID of string | COMMA | SEMICOLON | EOF | AND | BAS | BASIS | END | EQUALOP | FUNCTOR | IN | LET | LOCAL | OPEN | SIGNATURE | STRUCTURE | ANN | PRIM | FILE of string | STRING of string %nonterm ann of string * Region.t | annPlus of (string * Region.t) list | annStar of (string * Region.t) list | basbinds of basbinds | basbinds' of Basexp.t * basbinds | basbinds'' of basbinds | basdec of Basdec.t | basdecnode of Basdec.node | basdecs of Basdec.t | basdecsnode of Basdec.node | basexp of Basexp.t | basexpnode of Basexp.node | basid of Basid.t | basids of Basid.t list | fctbinds of fctbinds | fctbinds' of Fctid.t * fctbinds | fctbinds'' of fctbinds | fctid of Fctid.t | id of Symbol.t * Region.t | mlb of Basdec.t | sigbinds of sigbinds | sigbinds' of Sigid.t * sigbinds | sigbinds'' of sigbinds | sigid of Sigid.t | strbinds of strbinds | strbinds' of Strid.t * strbinds | strbinds'' of strbinds | strid of Strid.t %verbose %pos SourcePos.t %eop EOF %noshift EOF %header (functor MLBLrValsFun (structure Token: TOKEN structure Ast: AST val lexAndParseProgOrMLB: File.t * Region.t -> Ast.Basdec.node)) %right AND %name MLB %keyword AND BAS BASIS END FUNCTOR IN LET LOCAL OPEN SIGNATURE STRUCTURE ANN PRIM %change -> SEMICOLON | -> IN ID END %value ID ("bogus") %% mlb : basdecs (basdecs) basdecs : basdecsnode (Basdec.makeRegion' (basdecsnode, basdecsnodeleft, basdecsnoderight)) basdecsnode : (Basdec.Seq []) | SEMICOLON basdecs (Basdec.Seq [basdecs]) | basdec basdecs (Basdec.Seq [basdec, basdecs]) basdec : basdecnode (Basdec.makeRegion' (basdecnode, basdecnodeleft, basdecnoderight)) basdecnode : FUNCTOR fctbinds (let val fctbinds = Vector.fromList fctbinds in Basdec.Defs (ModIdBind.makeRegion' (ModIdBind.Fct fctbinds, FUNCTORleft, fctbindsright)) end) | SIGNATURE sigbinds (let val sigbinds = Vector.fromList sigbinds in Basdec.Defs (ModIdBind.makeRegion' (ModIdBind.Sig sigbinds, SIGNATUREleft, sigbindsright)) end) | STRUCTURE strbinds (let val strbinds = Vector.fromList strbinds in Basdec.Defs (ModIdBind.makeRegion' (ModIdBind.Str strbinds, STRUCTUREleft, strbindsright)) end) | BASIS basbinds (let val basbinds = Vector.fromList basbinds in Basdec.Basis basbinds end) | LOCAL basdecs IN basdecs END (Basdec.Local (basdecs1, basdecs2)) | OPEN basids (Basdec.Open (Vector.fromList basids)) | FILE (let val reg = reg (FILEleft, FILEright) in lexAndParseProgOrMLB (FILE, reg) end) | STRING (let val reg = reg (STRINGleft, STRINGright) in lexAndParseProgOrMLB (STRING, reg) end) | PRIM (Basdec.Prim) | ANN annPlus IN basdecs END (let val extendRight = let val right = valOf (Region.right (Basdec.region basdecs)) in fn reg => Region.extendRight (reg, right) end fun mkAnn' ((ann,reg), basdecs) = Basdec.Ann (ann, reg, basdecs) fun mkAnn ((ann,reg), basdecsnode) : Basdec.node = mkAnn' ((ann,reg), Basdec.makeRegion (basdecsnode, extendRight reg)) val (anns,ann) = List.splitLast annPlus in List.fold(anns, mkAnn'(ann, basdecs), mkAnn) end) fctbinds : fctid EQUALOP fctbinds' (let val (def, fctbinds) = fctbinds' in {lhs = fctid, rhs = def} :: fctbinds end) | fctid fctbinds'' ({lhs = fctid, rhs = fctid} :: fctbinds'') fctbinds' : fctid fctbinds'' (fctid, fctbinds'') fctbinds'' : ([]) | AND fctbinds (fctbinds) sigbinds : sigid EQUALOP sigbinds' (let val (def, sigbinds) = sigbinds' in {lhs = sigid, rhs = def} :: sigbinds end) | sigid sigbinds'' ({lhs = sigid, rhs = sigid} :: sigbinds'') sigbinds' : sigid sigbinds'' (sigid, sigbinds'') sigbinds'' : ([]) | AND sigbinds (sigbinds) strbinds : strid EQUALOP strbinds' (let val (def, strbinds) = strbinds' in {lhs = strid, rhs = def} :: strbinds end) | strid strbinds'' ({lhs = strid, rhs = strid} :: strbinds'') strbinds' : strid strbinds'' (strid, strbinds'') strbinds'' : ([]) | AND strbinds (strbinds) basbinds : basid EQUALOP basbinds' (let val (def, basbinds) = basbinds' in {name = basid, def = def} :: basbinds end) basbinds' : basexp basbinds'' (basexp, basbinds'') basbinds'' : ([]) | AND basbinds (basbinds) basexp : basexpnode (Basexp.makeRegion' (basexpnode, basexpnodeleft, basexpnoderight)) basexpnode : BAS basdecs END (Basexp.Bas basdecs) | basid (Basexp.Var basid) | LET basdecs IN basexp END (Basexp.Let (basdecs, basexp)) basid : id (Basid.fromSymbol id) basids : basid ([basid]) | basid basids (basid :: basids) fctid : id (Fctid.fromSymbol id) sigid : id (Sigid.fromSymbol id) strid : id (Strid.fromSymbol id) id : ID (Symbol.fromString ID, reg (IDleft, IDright)) ann : STRING (STRING, reg (STRINGleft, STRINGright)) annPlus : ann annStar (ann::annStar) annStar : ([]) | annPlus (annPlus) mlton-20100608/mlton/front-end/mlb.lex0000644000076600000240000002310111404435623016067 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) type svalue = Tokens.svalue type pos = SourcePos.t type lexresult = (svalue, pos) Tokens.token type lexarg = {source: Source.t} type arg = lexarg type ('a,'b) token = ('a,'b) Tokens.token val charlist: string list ref = ref [] val colNum: int ref = ref 0 val commentLevel: int ref = ref 0 val commentStart = ref SourcePos.bogus val lineFile: File.t ref = ref "" val lineNum: int ref = ref 0 val stringStart = ref SourcePos.bogus fun lineDirective (source, file, yypos) = Source.lineDirective (source, file, {lineNum = !lineNum, lineStart = yypos - !colNum}) fun addString (s: string) = charlist := s :: (!charlist) fun addChar (c: char) = addString (String.fromChar c) fun inc (ri as ref (i: int)) = (ri := i + 1) fun dec (ri as ref (i: int)) = (ri := i-1) fun error (source, left, right, msg) = Control.errorStr (Region.make {left = Source.getPos (source, left), right = Source.getPos (source, right)}, msg) fun stringError (source, right, msg) = Control.errorStr (Region.make {left = !stringStart, right = Source.getPos (source, right)}, msg) val eof: lexarg -> lexresult = fn {source, ...} => let val pos = Source.lineStart source val _ = if !commentLevel > 0 then Control.errorStr (Region.make {left = !commentStart, right = pos}, "unclosed comment") else () in Tokens.EOF (pos, pos) end val size = String.size fun tok (t, s, l, r) = let val l = Source.getPos (s, l) val r = Source.getPos (s, r) val _ = if true then () else print (concat ["tok (", SourcePos.toString l, ", " , SourcePos.toString r, ")\n"]) in t (l, r) end fun tok' (t, x, s, l) = tok (fn (l, r) => t (x, l, r), s, l, l + size x) %% %reject %s A S F L LL LLC LLCQ; %header (functor MLBLexFun (structure Tokens : MLB_TOKENS)); %arg ({source}); alphanum=[A-Za-z'_0-9]*; alphanumId=[A-Za-z]{alphanum}; id={alphanumId}; pathvar="$("([A-Z_][A-Z0-9_]*)")"; filename=({pathvar}|[A-Za-z0-9_.])({pathvar}|[-A-Za-z0-9_.])*; arc=({pathvar}|{filename}|"."|".."); relpath=({arc}"/")*; abspath="/"{relpath}; path={relpath}|{abspath}; file={path}{filename}; ws=("\012"|[\t\ ])*; nrws=("\012"|[\t\ ])+; cr="\013"; nl="\010"; eol=({cr}{nl}|{nl}|{cr}); hexDigit=[0-9a-fA-F]; %% {ws} => (continue ()); {eol} => (Source.newline (source, yypos); continue ()); "_prim" => (tok (Tokens.PRIM, source, yypos, yypos + 4)); "," => (tok (Tokens.COMMA, source, yypos, yypos + 1)); ";" => (tok (Tokens.SEMICOLON, source, yypos, yypos + 1)); "=" => (tok (Tokens.EQUALOP, source, yypos, yypos + 1)); "ann" => (tok (Tokens.ANN, source, yypos, yypos + 3)); "and" => (tok (Tokens.AND, source, yypos, yypos + 3)); "bas" => (tok (Tokens.BAS, source, yypos, yypos + 3)); "basis" => (tok (Tokens.BASIS, source, yypos, yypos + 5)); "end" => (tok (Tokens.END, source, yypos, yypos + 3)); "functor" => (tok (Tokens.FUNCTOR, source, yypos, yypos + 7)); "in" => (tok (Tokens.IN, source, yypos, yypos + 2)); "let" => (tok (Tokens.LET, source, yypos, yypos + 3)); "local" => (tok (Tokens.LOCAL, source, yypos, yypos + 5)); "open" => (tok (Tokens.OPEN, source, yypos, yypos + 4)); "signature" => (tok (Tokens.SIGNATURE, source, yypos, yypos + 9)); "structure" => (tok (Tokens.STRUCTURE, source, yypos, yypos + 9)); {id} => (tok' (Tokens.ID, yytext, source, yypos)); {file} => (tok' (Tokens.FILE, yytext, source, yypos)); \" => (charlist := [""] ; stringStart := Source.getPos (source, yypos) ; YYBEGIN S ; continue ()); "(*#line"{nrws} => (YYBEGIN L ; commentStart := Source.getPos (source, yypos) ; commentLevel := 1 ; continue ()); "(*" => (YYBEGIN A ; commentLevel := 1 ; commentStart := Source.getPos (source, yypos) ; continue ()); . => (error (source, yypos, yypos + 1, "illegal token") ; continue ()); [0-9]+ => (YYBEGIN LL ; (lineNum := valOf (Int.fromString yytext) ; colNum := 1) handle Overflow => YYBEGIN A ; continue ()); \. => ((* cheat: take n > 0 dots *) continue ()); [0-9]+ => (YYBEGIN LLC ; (colNum := valOf (Int.fromString yytext)) handle Overflow => YYBEGIN A ; continue ()); . => (YYBEGIN LLC; continue () (* note hack, since ml-lex chokes on the empty string for 0* *)); "*)" => (YYBEGIN INITIAL ; lineDirective (source, NONE, yypos + 2) ; commentLevel := 0; charlist := []; continue ()); {ws}\" => (YYBEGIN LLCQ; continue ()); [^\"]* => (lineFile := yytext; continue ()); \""*)" => (YYBEGIN INITIAL ; lineDirective (source, SOME (!lineFile), yypos + 3) ; commentLevel := 0; charlist := []; continue ()); "*)" => (YYBEGIN INITIAL; commentLevel := 0; charlist := []; continue ()); . => (YYBEGIN A; continue ()); "(*" => (inc commentLevel; continue ()); \n => (Source.newline (source, yypos) ; continue ()); "*)" => (dec commentLevel ; if 0 = !commentLevel then YYBEGIN INITIAL else () ; continue ()); . => (continue ()); \" => (let val s = concat (rev (!charlist)) val _ = charlist := nil fun make (t, v) = t (v, !stringStart, Source.getPos (source, yypos + 1)) in YYBEGIN INITIAL ; make (Tokens.STRING, s) end); \\a => (addChar #"\a"; continue ()); \\b => (addChar #"\b"; continue ()); \\f => (addChar #"\f"; continue ()); \\n => (addChar #"\n"; continue ()); \\r => (addChar #"\r"; continue ()); \\t => (addChar #"\t"; continue ()); \\v => (addChar #"\v"; continue ()); \\\^[@-_] => (addChar (Char.chr(Char.ord(String.sub(yytext, 2)) -Char.ord #"@")) ; continue ()); \\\^. => (error (source, yypos, yypos + 2, "illegal control escape; must be one of @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_") ; continue ()); \\[0-9]{3} => (let val x = Char.ord(String.sub(yytext, 1)) * 100 + Char.ord(String.sub(yytext, 2)) * 10 + Char.ord(String.sub(yytext, 3)) - (Char.ord #"0") * 111 in (if x > 255 then stringError (source, yypos, "illegal ascii escape") else addChar(Char.chr x); continue ()) end); \\u{hexDigit}{4} => (let val x = StringCvt.scanString (Pervasive.Int.scan StringCvt.HEX) (String.substring (yytext, 2, 4)) fun err () = stringError (source, yypos, "illegal unicode escape") in (case x of SOME x => if x > 255 then err() else addChar(Char.chr x) | _ => err()) ; continue () end); \\\" => (addString "\""; continue ()); \\\\ => (addString "\\"; continue ()); \\{nrws} => (YYBEGIN F; continue ()); \\{eol} => (Source.newline (source, yypos) ; YYBEGIN F ; continue ()); \\ => (stringError (source, yypos, "illegal string escape") ; continue ()); {eol} => (Source.newline (source, yypos) ; stringError (source, yypos, "unclosed string") ; continue ()); " "|[\033-\126] => (addString yytext; continue ()); . => (stringError (source, yypos + 1, "illegal character in string") ; continue ()); {eol} => (Source.newline (source, yypos) ; continue ()); {ws} => (continue ()); \\ => (YYBEGIN S ; stringStart := Source.getPos (source, yypos) ; continue ()); . => (stringError (source, yypos, "unclosed string") ; continue ()); mlton-20100608/mlton/front-end/sources.cm0000644000076600000240000000117711404435623016620 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group functor FrontEnd functor MLBFrontEnd is ../../lib/mlton/sources.cm #if (defined (SMLNJ_VERSION)) ml-yacc-lib-proxy.cm #else ../../lib/mlyacc-lib/ml-yacc-lib.cm #endif ../ast/sources.cm ../control/sources.cm ml.grm.sig ml.grm.sml ml.lex.sml front-end.sig front-end.fun mlb.grm.sig mlb.grm.sml mlb.lex.sml mlb-front-end.sig mlb-front-end.fun mlton-20100608/mlton/front-end/sources.mlb0000644000076600000240000000222011404435623016761 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../../lib/mlyacc-lib/mlyacc-lib.mlb ../ast/sources.mlb ../control/sources.mlb ann "warnUnused false" in ml.grm.sig ml.grm.sml local (* import Unsafe in case {ml,mlb}.lex.sml is generated by an old * version of mllex that creates references to Unsafe. *) $(SML_LIB)/basis/unsafe.mlb in ml.lex.sml end end front-end.sig front-end.fun ann "warnUnused false" in mlb.grm.sig mlb.grm.sml local (* import Unsafe in case {ml,mlb}.lex.sml is generated by an old * version of mllex that creates references to Unsafe. *) $(SML_LIB)/basis/unsafe.mlb in mlb.lex.sml end end mlb-front-end.sig mlb-front-end.fun in functor FrontEnd functor MLBFrontEnd end mlton-20100608/mlton/main/0000755000076600000240000000000011404470407013635 5ustar mtfstaffmlton-20100608/mlton/main/compile.fun0000644000076600000240000007135111404435623016007 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Compile (S: COMPILE_STRUCTS): COMPILE = struct open S (*---------------------------------------------------*) (* Intermediate Languages *) (*---------------------------------------------------*) structure Symbol = Symbol () structure Field = Field (structure Symbol = Symbol) structure Record = Record (val isSorted = false structure Field = Field) structure SortedRecord = Record (val isSorted = true structure Field = Field) structure Tyvar = Tyvar () structure Ast = Ast (structure Record = Record structure SortedRecord = SortedRecord structure Symbol = Symbol structure Tyvar = Tyvar) local open Ast.Tycon in structure CharSize = CharSize structure IntSize = IntSize structure RealSize = RealSize structure WordSize = WordSize end structure Atoms = Atoms (structure CharSize = CharSize structure Field = Field structure IntSize = IntSize structure RealSize = RealSize structure Record = Record structure SortedRecord = SortedRecord structure Tyvar = Tyvar structure WordSize = WordSize) local open Atoms in structure Const = Const structure ConstType = Const.ConstType structure Ffi = Ffi structure WordX = WordX end structure TypeEnv = TypeEnv (Atoms) structure CoreML = CoreML (open Atoms structure Type = struct open TypeEnv.Type val makeHom = fn {con, var} => makeHom {con = con, expandOpaque = true, var = var} fun layout t = layoutPrettyAux (t, {expandOpaque = true, localTyvarNames = false}) end) structure Xml = Xml (open Atoms) structure Sxml = Sxml (open Xml) structure Ssa = Ssa (open Atoms) structure Ssa2 = Ssa2 (open Atoms) structure Machine = Machine (open Atoms structure Label = Ssa.Label) local open Machine in structure Runtime = Runtime end (*---------------------------------------------------*) (* Compiler Passes *) (*---------------------------------------------------*) structure FrontEnd = FrontEnd (structure Ast = Ast) structure MLBFrontEnd = MLBFrontEnd (structure Ast = Ast structure FrontEnd = FrontEnd) structure DeadCode = DeadCode (structure CoreML = CoreML) structure Defunctorize = Defunctorize (structure CoreML = CoreML structure Xml = Xml) structure Elaborate = Elaborate (structure Ast = Ast structure CoreML = CoreML structure TypeEnv = TypeEnv) local open Elaborate in structure Env = Env end structure LookupConstant = LookupConstant (structure Const = Const structure ConstType = ConstType structure Ffi = Ffi) structure Monomorphise = Monomorphise (structure Xml = Xml structure Sxml = Sxml) structure ClosureConvert = ClosureConvert (structure Ssa = Ssa structure Sxml = Sxml) structure SsaToSsa2 = SsaToSsa2 (structure Ssa = Ssa structure Ssa2 = Ssa2) structure Backend = Backend (structure Ssa = Ssa2 structure Machine = Machine fun funcToLabel f = f) structure CCodegen = CCodegen (structure Ffi = Ffi structure Machine = Machine) structure Bytecode = Bytecode (structure CCodegen = CCodegen structure Machine = Machine) structure x86Codegen = x86Codegen (structure CCodegen = CCodegen structure Machine = Machine) structure amd64Codegen = amd64Codegen (structure CCodegen = CCodegen structure Machine = Machine) (* ------------------------------------------------- *) (* Lookup Constant *) (* ------------------------------------------------- *) val commandLineConstants: {name: string, value: string} list ref = ref [] fun setCommandLineConstant (c as {name, value}) = let fun make (fromString, control) = let fun set () = case fromString value of NONE => Error.bug (concat ["bad value for ", name]) | SOME v => control := v in set end val () = case List.peek ([("Exn.keepHistory", make (Bool.fromString, Control.exnHistory))], fn (s, _) => s = name) of NONE => () | SOME (_,set) => set () in List.push (commandLineConstants, c) end val allConstants: (string * ConstType.t) list ref = ref [] val amBuildingConstants: bool ref = ref false val lookupConstant = let val zero = Const.word (WordX.fromIntInf (0, WordSize.word32)) val f = Promise.lazy (fn () => if !amBuildingConstants then (fn ({name, default, ...}, t) => let (* Don't keep constants that already have a default value. * These are defined by _command_line_const and set by * -const, and shouldn't be looked up. *) val () = if isSome default then () else List.push (allConstants, (name, t)) in zero end) else File.withIn (concat [!Control.libTargetDir, "/constants"], fn ins => LookupConstant.load (ins, !commandLineConstants))) in fn z => f () z end (* ------------------------------------------------- *) (* Primitive Env *) (* ------------------------------------------------- *) local structure Con = TypeEnv.Con structure Tycon = TypeEnv.Tycon structure Type = TypeEnv.Type structure Tyvar = TypeEnv.Tyvar val primitiveDatatypes = Vector.new3 ({tycon = Tycon.bool, tyvars = Vector.new0 (), cons = Vector.new2 ({con = Con.falsee, arg = NONE}, {con = Con.truee, arg = NONE})}, let val a = Tyvar.newNoname {equality = false} in {tycon = Tycon.list, tyvars = Vector.new1 a, cons = Vector.new2 ({con = Con.nill, arg = NONE}, {con = Con.cons, arg = SOME (Type.tuple (Vector.new2 (Type.var a, Type.list (Type.var a))))})} end, let val a = Tyvar.newNoname {equality = false} in {tycon = Tycon.reff, tyvars = Vector.new1 a, cons = Vector.new1 {con = Con.reff, arg = SOME (Type.var a)}} end) val primitiveExcons = let open CoreML.Con in [bind, match, overflow] end structure Con = struct open Con fun toAst c = Ast.Con.fromSymbol (Symbol.fromString (Con.toString c), Region.bogus) end structure Env = struct open Env structure Tycon = struct open Tycon fun toAst c = Ast.Tycon.fromSymbol (Symbol.fromString (Tycon.toString c), Region.bogus) end structure Type = TypeEnv.Type structure Scheme = TypeEnv.Scheme fun addPrim (E: t): unit = let val _ = List.foreach (Tycon.prims, fn {kind, name, tycon, ...} => extendTycon (E, Ast.Tycon.fromSymbol (Symbol.fromString name, Region.bogus), TypeStr.tycon (tycon, kind), {forceUsed = false, isRebind = false})) val _ = Vector.foreach (primitiveDatatypes, fn {tyvars, tycon, cons} => let val cons = Env.newCons (E, Vector.map (cons, fn {con, ...} => {con = con, name = Con.toAst con})) (Vector.map (cons, fn {arg, ...} => let val resultType = Type.con (tycon, Vector.map (tyvars, Type.var)) in Scheme.make {canGeneralize = true, ty = (case arg of NONE => resultType | SOME t => Type.arrow (t, resultType)), tyvars = tyvars} end)) in extendTycon (E, Tycon.toAst tycon, TypeStr.data (tycon, TypeStr.Kind.Arity (Vector.length tyvars), cons), {forceUsed = false, isRebind = false}) end) val _ = extendTycon (E, Ast.Tycon.fromSymbol (Symbol.unit, Region.bogus), TypeStr.def (Scheme.fromType Type.unit, TypeStr.Kind.Arity 0), {forceUsed = false, isRebind = false}) val scheme = Scheme.fromType Type.exn val _ = List.foreach (primitiveExcons, fn c => extendExn (E, Con.toAst c, c, SOME scheme)) in () end end val primitiveDecs: CoreML.Dec.t list = let open CoreML.Dec in List.concat [[Datatype primitiveDatatypes], List.map (primitiveExcons, fn c => Exception {con = c, arg = NONE})] end in fun addPrim E = (Env.addPrim E ; primitiveDecs) end (* ------------------------------------------------- *) (* parseAndElaborateMLB *) (* ------------------------------------------------- *) fun quoteFile s = concat ["\"", String.escapeSML s, "\""] structure MLBString:> sig type t val fromFile: File.t -> t val fromString: string -> t val lexAndParseMLB: t -> Ast.Basdec.t end = struct type t = string val fromFile = quoteFile val fromString = fn s => s val lexAndParseMLB = MLBFrontEnd.lexAndParseString end val lexAndParseMLB = MLBString.lexAndParseMLB val lexAndParseMLB: MLBString.t -> Ast.Basdec.t = fn input => let val ast = lexAndParseMLB input val _ = Control.checkForErrors "parse" in ast end fun sourceFilesMLB {input} = Ast.Basdec.sourceFiles (lexAndParseMLB (MLBString.fromFile input)) val elaborateMLB = Elaborate.elaborateMLB val displayEnvDecs = Control.Layouts (fn ((_, decs),output) => (output (Layout.str "\n\n") ; Vector.foreach (decs, fn (dec, dc) => (output o Layout.record) [("deadCode", Bool.layout dc), ("decs", List.layout CoreML.Dec.layout dec)]))) fun parseAndElaborateMLB (input: MLBString.t) : Env.t * (CoreML.Dec.t list * bool) vector = Control.pass {display = displayEnvDecs, name = "parseAndElaborate", stats = fn _ => Layout.empty, style = Control.ML, suffix = "core-ml", thunk = (fn () => (Const.lookup := lookupConstant ; elaborateMLB (lexAndParseMLB input, {addPrim = addPrim})))} (* ------------------------------------------------- *) (* Basis Library *) (* ------------------------------------------------- *) fun outputBasisConstants (out: Out.t): unit = let val _ = amBuildingConstants := true val (_, decs) = parseAndElaborateMLB (MLBString.fromFile "$(SML_LIB)/basis/primitive/primitive.mlb") val decs = Vector.concatV (Vector.map (decs, Vector.fromList o #1)) (* Need to defunctorize so the constants are forced. *) val _ = Defunctorize.defunctorize (CoreML.Program.T {decs = decs}) val _ = LookupConstant.build (!allConstants, out) in () end (* ------------------------------------------------- *) (* compile *) (* ------------------------------------------------- *) exception Done fun elaborate {input: MLBString.t}: Xml.Program.t = let val (E, decs) = parseAndElaborateMLB input val _ = case !Control.showBasis of NONE => () | SOME f => File.withOut (f, fn out => Layout.outputl (Env.layoutCurrentScope E, out)) val _ = Env.processDefUse E val _ = case !Control.exportHeader of NONE => () | SOME f => File.withOut (f, fn out => let fun print s = Out.output (out, s) val libname = !Control.libname val libcap = CharVector.map Char.toUpper libname val _ = print ("#ifndef __" ^ libcap ^ "_ML_H__\n") val _ = print ("#define __" ^ libcap ^ "_ML_H__\n") val _ = print "\n" val _ = File.outputContents (concat [!Control.libDir, "/include/ml-types.h"], out) val _ = print "\n" val _ = File.outputContents (concat [!Control.libDir, "/include/export.h"], out) val _ = print "\n" (* How do programs link against this library by default *) val defaultLinkage = case !Control.format of Control.Archive => "STATIC_LINK" | Control.Executable => "PART_OF" | Control.LibArchive => "NO_DEFAULT_LINK" | Control.Library => "DYNAMIC_LINK" val _ = print ("#if !defined(PART_OF_" ^ libcap ^ ") && \\\n\ \ !defined(STATIC_LINK_" ^ libcap ^ ") && \\\n\ \ !defined(DYNAMIC_LINK_" ^ libcap ^ ")\n") val _ = print ("#define " ^ defaultLinkage ^ "_" ^ libcap ^ "\n") val _ = print "#endif\n" val _ = print "\n" val _ = print ("#if defined(PART_OF_" ^ libcap ^ ")\n") val _ = print "#define MLLIB_PRIVATE(x) PRIVATE x\n" val _ = print "#define MLLIB_PUBLIC(x) PUBLIC x\n" val _ = print ("#elif defined(STATIC_LINK_" ^ libcap ^ ")\n") val _ = print "#define MLLIB_PRIVATE(x)\n" val _ = print "#define MLLIB_PUBLIC(x) PUBLIC x\n" val _ = print ("#elif defined(DYNAMIC_LINK_" ^ libcap ^ ")\n") val _ = print "#define MLLIB_PRIVATE(x)\n" val _ = print "#define MLLIB_PUBLIC(x) EXTERNAL x\n" val _ = print "#else\n" val _ = print ("#error Must specify linkage for " ^ libname ^ "\n") val _ = print "#define MLLIB_PRIVATE(x)\n" val _ = print "#define MLLIB_PUBLIC(x)\n" val _ = print "#endif\n" val _ = print "\n" val _ = print "#ifdef __cplusplus\n" val _ = print "extern \"C\" {\n" val _ = print "#endif\n" val _ = print "\n" val _ = if !Control.format = Control.Executable then () else (print ("MLLIB_PUBLIC(void " ^ libname ^ "_open(int argc, const char** argv);)\n") ;print ("MLLIB_PUBLIC(void " ^ libname ^ "_close();)\n")) val _ = Ffi.declareHeaders {print = print} val _ = print "\n" val _ = print "#undef MLLIB_PRIVATE\n" val _ = print "#undef MLLIB_PUBLIC\n" val _ = print "\n" val _ = print "#ifdef __cplusplus\n" val _ = print "}\n" val _ = print "#endif\n" val _ = print "\n" val _ = print ("#endif /* __" ^ libcap ^ "_ML_H__ */\n") in () end) val _ = if !Control.elaborateOnly then raise Done else () val decs = Control.pass {display = Control.Layouts (fn (decss,output) => (output (Layout.str "\n\n") ; Vector.foreach (decss, fn decs => List.foreach (decs, fn dec => output (CoreML.Dec.layout dec))))), name = "deadCode", suffix = "core-ml", style = Control.ML, stats = fn _ => Layout.empty, thunk = fn () => let val {prog = decs} = DeadCode.deadCode {prog = decs} in decs end} val decs = Vector.concatV (Vector.map (decs, Vector.fromList)) val coreML = CoreML.Program.T {decs = decs} val _ = let open Control in if !keepCoreML then saveToFile ({suffix = "core-ml"}, No, coreML, Layouts CoreML.Program.layouts) else () end (* Set GC_state offsets and sizes. *) val _ = let fun get (name: string): Bytes.t = case lookupConstant ({default = NONE, name = name}, ConstType.Word WordSize.word32) of Const.Word w => Bytes.fromInt (WordX.toInt w) | _ => Error.bug "Compile.elaborate: GC_state offset must be an int" in Runtime.GCField.setOffsets { atomicState = get "atomicState_Offset", cardMapAbsolute = get "generationalMaps.cardMapAbsolute_Offset", currentThread = get "currentThread_Offset", curSourceSeqsIndex = get "sourceMaps.curSourceSeqsIndex_Offset", exnStack = get "exnStack_Offset", frontier = get "frontier_Offset", limit = get "limit_Offset", limitPlusSlop = get "limitPlusSlop_Offset", maxFrameSize = get "maxFrameSize_Offset", signalIsPending = get "signalsInfo.signalIsPending_Offset", stackBottom = get "stackBottom_Offset", stackLimit = get "stackLimit_Offset", stackTop = get "stackTop_Offset" }; Runtime.GCField.setSizes { atomicState = get "atomicState_Size", cardMapAbsolute = get "generationalMaps.cardMapAbsolute_Size", currentThread = get "currentThread_Size", curSourceSeqsIndex = get "sourceMaps.curSourceSeqsIndex_Size", exnStack = get "exnStack_Size", frontier = get "frontier_Size", limit = get "limit_Size", limitPlusSlop = get "limitPlusSlop_Size", maxFrameSize = get "maxFrameSize_Size", signalIsPending = get "signalsInfo.signalIsPending_Size", stackBottom = get "stackBottom_Size", stackLimit = get "stackLimit_Size", stackTop = get "stackTop_Size" } end (* Setup endianness *) val _ = let fun get (name:string): bool = case lookupConstant ({default = NONE, name = name}, ConstType.Bool) of Const.Word w => 1 = WordX.toInt w | _ => Error.bug "Compile.elaborate: endian unknown" in Control.Target.setBigEndian (get "MLton_Platform_Arch_bigendian") end val xml = Control.passTypeCheck {display = Control.Layouts Xml.Program.layouts, name = "defunctorize", stats = Xml.Program.layoutStats, style = Control.ML, suffix = "xml", thunk = fn () => Defunctorize.defunctorize coreML, typeCheck = Xml.typeCheck} in xml end fun preCodegen {input: MLBString.t}: Machine.Program.t = let val xml = elaborate {input = input} val xml = Control.passTypeCheck {display = Control.Layouts Xml.Program.layouts, name = "xmlSimplify", stats = Xml.Program.layoutStats, style = Control.ML, suffix = "xml", thunk = fn () => Xml.simplify xml, typeCheck = Xml.typeCheck} val _ = let open Control in if !keepXML then saveToFile ({suffix = "xml"}, No, xml, Layouts Xml.Program.layouts) else () end val sxml = Control.passTypeCheck {display = Control.Layouts Sxml.Program.layouts, name = "monomorphise", stats = Sxml.Program.layoutStats, style = Control.ML, suffix = "sxml", thunk = fn () => Monomorphise.monomorphise xml, typeCheck = Sxml.typeCheck} val sxml = Control.passTypeCheck {display = Control.Layouts Sxml.Program.layouts, name = "sxmlSimplify", stats = Sxml.Program.layoutStats, style = Control.ML, suffix = "sxml", thunk = fn () => Sxml.simplify sxml, typeCheck = Sxml.typeCheck} val _ = let open Control in if !keepSXML then saveToFile ({suffix = "sxml"}, No, sxml, Layouts Sxml.Program.layouts) else () end val ssa = Control.passTypeCheck {display = Control.Layouts Ssa.Program.layouts, name = "closureConvert", stats = Ssa.Program.layoutStats, style = Control.No, suffix = "ssa", thunk = fn () => ClosureConvert.closureConvert sxml, typeCheck = Ssa.typeCheck} val ssa = Control.passTypeCheck {display = Control.Layouts Ssa.Program.layouts, name = "ssaSimplify", stats = Ssa.Program.layoutStats, style = Control.No, suffix = "ssa", thunk = fn () => Ssa.simplify ssa, typeCheck = Ssa.typeCheck} val _ = let open Control in if !keepSSA then saveToFile ({suffix = "ssa"}, No, ssa, Layouts Ssa.Program.layouts) else () end val ssa2 = Control.passTypeCheck {display = Control.Layouts Ssa2.Program.layouts, name = "toSsa2", stats = Ssa2.Program.layoutStats, style = Control.No, suffix = "ssa2", thunk = fn () => SsaToSsa2.convert ssa, typeCheck = Ssa2.typeCheck} val ssa2 = Control.passTypeCheck {display = Control.Layouts Ssa2.Program.layouts, name = "ssa2Simplify", stats = Ssa2.Program.layoutStats, style = Control.No, suffix = "ssa2", thunk = fn () => Ssa2.simplify ssa2, typeCheck = Ssa2.typeCheck} val _ = let open Control in if !keepSSA2 then saveToFile ({suffix = "ssa2"}, No, ssa2, Layouts Ssa2.Program.layouts) else () end val codegenImplementsPrim = case !Control.codegen of Control.Bytecode => Bytecode.implementsPrim | Control.CCodegen => CCodegen.implementsPrim | Control.x86Codegen => x86Codegen.implementsPrim | Control.amd64Codegen => amd64Codegen.implementsPrim val machine = Control.passTypeCheck {display = Control.Layouts Machine.Program.layouts, name = "backend", stats = fn _ => Layout.empty, style = Control.No, suffix = "machine", thunk = fn () => (Backend.toMachine (ssa2, {codegenImplementsPrim = codegenImplementsPrim})), typeCheck = fn machine => (* For now, machine type check is too slow to run. *) (if !Control.typeCheck then Machine.Program.typeCheck machine else ())} val _ = let open Control in if !keepMachine then saveToFile ({suffix = "machine"}, No, machine, Layouts Machine.Program.layouts) else () end in machine end fun compile {input: MLBString.t, outputC, outputS}: unit = let val machine = Control.trace (Control.Top, "pre codegen") preCodegen {input = input} fun clearNames () = (Machine.Program.clearLabelNames machine ; Machine.Label.printNameAlphaNumeric := true) val () = case !Control.codegen of Control.Bytecode => Control.trace (Control.Top, "bytecode gen") Bytecode.output {program = machine, outputC = outputC} | Control.CCodegen => (clearNames () ; (Control.trace (Control.Top, "C code gen") CCodegen.output {program = machine, outputC = outputC})) | Control.x86Codegen => (clearNames () ; (Control.trace (Control.Top, "x86 code gen") x86Codegen.output {program = machine, outputC = outputC, outputS = outputS})) | Control.amd64Codegen => (clearNames () ; (Control.trace (Control.Top, "amd64 code gen") amd64Codegen.output {program = machine, outputC = outputC, outputS = outputS})) val _ = Control.message (Control.Detail, PropertyList.stats) val _ = Control.message (Control.Detail, HashSet.stats) in () end handle Done => () fun compileMLB {input: File.t, outputC, outputS}: unit = compile {input = MLBString.fromFile input, outputC = outputC, outputS = outputS} val elaborateMLB = fn {input: File.t} => (ignore (elaborate {input = MLBString.fromFile input})) handle Done => () local fun genMLB {input: File.t list}: MLBString.t = let val basis = "$(SML_LIB)/basis/default.mlb" in MLBString.fromString (case input of [] => basis | _ => let val input = List.map (input, quoteFile) in String.concat ["local\n", basis, "\n", "in\n", String.concat (List.separate (input, "\n")), "\n", "end\n"] end) end in fun compileSML {input: File.t list, outputC, outputS}: unit = compile {input = genMLB {input = input}, outputC = outputC, outputS = outputS} val elaborateSML = fn {input: File.t list} => (ignore (elaborate {input = genMLB {input = input}})) handle Done => () end end mlton-20100608/mlton/main/compile.sig0000644000076600000240000000276011404435623015777 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature COMPILE_STRUCTS = sig end signature COMPILE = sig include COMPILE_STRUCTS val compileMLB: {input: File.t, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} -> unit val compileSML: {input: File.t list, outputC: unit -> {file: File.t, print: string -> unit, done: unit -> unit}, outputS: unit -> {file: File.t, print: string -> unit, done: unit -> unit}} -> unit val elaborateMLB: {input: File.t} -> unit val elaborateSML: {input: File.t list} -> unit val setCommandLineConstant: {name: string, value: string} -> unit val sourceFilesMLB: {input: File.t} -> File.t vector (* output a C file to print out the basis constants. *) val outputBasisConstants: Out.t -> unit end mlton-20100608/mlton/main/lookup-constant.fun0000644000076600000240000001601411404435623017512 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor LookupConstant (S: LOOKUP_CONSTANT_STRUCTS): LOOKUP_CONSTANT = struct open S local open Const in structure RealX = RealX structure WordX = WordX end structure WordSize = WordX.WordSize val buildConstants: (string * (unit -> string)) list = let val bool = Bool.toString val int = Int.toString open Control in [("MLton_Align_align", fn () => int (case !align of Align4 => 4 | Align8 => 8)), ("MLton_Codegen_codegen", fn () => int (case !codegen of Bytecode => 0 | CCodegen => 1 | x86Codegen => 2 | amd64Codegen => 3)), ("MLton_FFI_numExports", fn () => int (Ffi.numExports ())), ("MLton_Platform_Format", fn () => case !format of Archive => "archive" | Executable => "executable" | LibArchive => "libarchive" | Library => "library"), ("MLton_Profile_isOn", fn () => bool (case !profile of ProfileNone => false | ProfileCallStack => false | ProfileDrop => false | ProfileLabel => false | _ => true))] end datatype z = datatype ConstType.t val gcFields = [ "atomicState", "currentThread", "sourceMaps.curSourceSeqsIndex", "exnStack", "frontier", "generationalMaps.cardMapAbsolute", "limit", "limitPlusSlop", "maxFrameSize", "signalsInfo.signalIsPending", "stackBottom", "stackLimit", "stackTop" ] val gcFieldsOffsets = List.map (gcFields, fn s => {name = s ^ "_Offset", value = concat ["(", Ffi.CType.toString Ffi.CType.Word32 ,")", "(offsetof (struct GC_state, ", s, "))"], ty = ConstType.Word WordSize.word32}) val gcFieldsSizes = List.map (gcFields, fn s => {name = s ^ "_Size", value = concat ["(", Ffi.CType.toString Ffi.CType.Word32 ,")", "(sizeof (gcState.", s, "))"], ty = ConstType.Word WordSize.word32}) fun build (constants, out) = let val constants = List.fold (constants, gcFieldsSizes @ gcFieldsOffsets, fn ((name, ty), ac) => if List.exists (buildConstants, fn (name', _) => name = name') then ac else {name = name, value = name, ty = ty} :: ac) in List.foreach (List.concat [["#define MLTON_GC_INTERNAL_TYPES", "#include \"platform.h\"", "struct GC_state gcState;", "", "int main (int argc, char **argv) {"], List.revMap (constants, fn {name, value, ty} => let val (format, value) = case ty of Bool => ("%s", concat [value, "? \"true\" : \"false\""]) | Real _ => ("%.20f", value) | String => ("%s", value) | Word ws => (case WordSize.prim (WordSize.roundUpToPrim ws) of WordSize.W8 => "%\"PRIu8\"" | WordSize.W16 => "%\"PRIu16\"" | WordSize.W32 => "%\"PRIu32\"" | WordSize.W64 => "%\"PRIu64\"", value) in concat ["fprintf (stdout, \"", name, " = ", format, "\\n\", ", value, ");"] end), ["return 0;}"]], fn l => (Out.output (out, l); Out.newline out)) end fun load (ins: In.t, commandLineConstants) : {default: string option, name: string} * ConstType.t -> Const.t = let val table: {hash: word, name: string, value: string} HashSet.t = HashSet.new {hash = #hash} fun add {name, value} = let val hash = String.hash name val _ = HashSet.lookupOrInsert (table, hash, fn {name = name', ...} => name = name', fn () => {hash = hash, name = name, value = value}) in () end val () = List.foreach (buildConstants, fn (name, f) => add {name = name, value = f ()}) val () = List.foreach (commandLineConstants, fn {name, value} => let in add {name = name, value = value} end) val _ = In.foreachLine (ins, fn l => case String.tokens (l, Char.isSpace) of [name, "=", value] => add {name = name, value = value} | _ => Error.bug (concat ["LookupConstants.load: strange constants line: ", l])) fun lookupConstant ({default, name}, ty: ConstType.t): Const.t = let val {value, ...} = let val hash = String.hash name in HashSet.lookupOrInsert (table, hash, fn {name = name', ...} => name = name', fn () => case default of NONE => Error.bug (concat ["LookupConstants.load.lookupConstant: ", "constant not found: ", name]) | SOME value => {hash = hash, name = name, value = value}) end fun error (t: string) = Error.bug (concat ["LookupConstants.load.lookupConstant: ", "constant ", name, " expects a ", t, " but got ", value, "."]) in case ty of Bool => (case Bool.fromString value of NONE => error "bool" | SOME b => Const.Word (WordX.fromIntInf (if b then 1 else 0, WordSize.bool))) | Real rs => (case RealX.make (value, rs) of NONE => error "real" | SOME r => Const.Real r) | String => Const.string value | Word ws => (case IntInf.fromString value of NONE => error "word" | SOME i => Const.Word (WordX.fromIntInf (i, ws))) end in lookupConstant end end mlton-20100608/mlton/main/lookup-constant.sig0000644000076600000240000000137011404435623017503 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LOOKUP_CONSTANT_STRUCTS = sig structure Const: CONST structure ConstType: CONST_TYPE structure Ffi: FFI sharing ConstType = Const.ConstType end signature LOOKUP_CONSTANT = sig include LOOKUP_CONSTANT_STRUCTS val build: (string * ConstType.t) list * Out.t -> unit val load: In.t * {name: string, value: string} list -> {default: string option, name: string} * ConstType.t -> Const.t end mlton-20100608/mlton/main/main.fun0000644000076600000240000020337611404435623015307 0ustar mtfstaff(* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Main (S: MAIN_STRUCTS): MAIN = struct open S structure Compile = Compile () structure Place = struct datatype t = CM | Files | Generated | MLB | O | OUT | SML | TypeCheck val toInt: t -> int = fn CM => 1 | MLB => 1 | SML => 1 | Files => 2 | TypeCheck => 4 | Generated => 5 | O => 6 | OUT => 7 val toString = fn CM => "cm" | Files => "files" | SML => "sml" | MLB => "mlb" | Generated => "g" | O => "o" | OUT => "out" | TypeCheck => "tc" fun compare (p, p') = Int.compare (toInt p, toInt p') end structure OptPred = struct datatype t = Target of string | Yes end structure Show = struct datatype t = Anns | PathMap end val gcc: string ref = ref "" val arScript: string ref = ref "" val asOpts: {opt: string, pred: OptPred.t} list ref = ref [] val ccOpts: {opt: string, pred: OptPred.t} list ref = ref [] val linkOpts: {opt: string, pred: OptPred.t} list ref = ref [] val buildConstants: bool ref = ref false val debugRuntime: bool ref = ref false datatype debugFormat = Dwarf | DwarfPlus | Dwarf2 | Stabs | StabsPlus val debugFormat: debugFormat option ref = ref NONE val expert: bool ref = ref false val explicitAlign: Control.align option ref = ref NONE val explicitChunk: Control.chunk option ref = ref NONE datatype explicitCodegen = Native | Explicit of Control.codegen val explicitCodegen: explicitCodegen option ref = ref NONE val keepGenerated = ref false val keepO = ref false val output: string option ref = ref NONE val profileSet: bool ref = ref false val profileTimeSet: bool ref = ref false val runtimeArgs: string list ref = ref ["@MLton"] val show: Show.t option ref = ref NONE val stop = ref Place.OUT fun parseMlbPathVar (line: String.t) = case String.tokens (line, Char.isSpace) of [var, path] => SOME {var = var, path = path} | _ => NONE fun readMlbPathMap (file: File.t) = if not (File.canRead file) then Error.bug (concat ["can't read MLB path map file: ", file]) else List.keepAllMap (File.lines file, fn line => if String.forall (line, Char.isSpace) then NONE else case parseMlbPathVar line of NONE => Error.bug (concat ["strange mlb path mapping: ", file, ":: ", line]) | SOME v => SOME v) val targetMap: unit -> {arch: MLton.Platform.Arch.t, os: MLton.Platform.OS.t, target: string} list = Promise.lazy (fn () => let val targetsDir = OS.Path.mkAbsolute { path = "targets", relativeTo = !Control.libDir } val potentialTargets = Dir.lsDirs targetsDir fun targetMap target = let val targetDir = OS.Path.mkAbsolute { path = target, relativeTo = targetsDir } val osFile = OS.Path.joinDirFile { dir = targetDir, file = "os" } val archFile = OS.Path.joinDirFile { dir = targetDir, file = "arch" } val os = File.contents osFile val arch = File.contents archFile val os = List.first (String.tokens (os, Char.isSpace)) val arch = List.first (String.tokens (arch, Char.isSpace)) val os = case MLton.Platform.OS.fromString os of NONE => Error.bug (concat ["strange os: ", os]) | SOME os => os val arch = case MLton.Platform.Arch.fromString arch of NONE => Error.bug (concat ["strange arch: ", arch]) | SOME a => a in SOME { arch = arch, os = os, target = target } end handle _ => NONE in List.keepAllMap (potentialTargets, targetMap) end) fun setTargetType (target: string, usage): unit = case List.peek (targetMap (), fn {target = t, ...} => target = t) of NONE => usage (concat ["invalid target: ", target]) | SOME {arch, os, ...} => let open Control in Target.arch := arch ; Target.os := os end fun hasCodegen (cg) = let datatype z = datatype Control.Target.arch datatype z = datatype Control.Target.os datatype z = datatype Control.Format.t datatype z = datatype Control.codegen in case !Control.Target.arch of AMD64 => (case cg of x86Codegen => false | _ => true) | X86 => (case cg of amd64Codegen => false | x86Codegen => (* Darwin PIC doesn't work *) !Control.Target.os <> Darwin orelse !Control.format = Executable orelse !Control.format = Archive | _ => true) | _ => (case cg of amd64Codegen => false | x86Codegen => false | _ => true) end fun hasNativeCodegen () = let datatype z = datatype Control.codegen in hasCodegen amd64Codegen orelse hasCodegen x86Codegen end fun defaultAlignIs8 () = let datatype z = datatype Control.Target.arch in case !Control.Target.arch of Alpha => true | AMD64 => true | HPPA => true | IA64 => true | Sparc => true | S390 => true | _ => false end fun makeOptions {usage} = let val usage = fn s => (ignore (usage s); raise Fail "unreachable") fun reportAnnotation (s, flag, e) = case e of Control.Elaborate.Bad => usage (concat ["invalid -", flag, " flag: ", s]) | Control.Elaborate.Deprecated ids => if !Control.warnDeprecated then Out.output (Out.error, concat ["Warning: ", "deprecated annotation: ", s, ", use ", List.toString Control.Elaborate.Id.name ids, ".\n"]) else () | Control.Elaborate.Good () => () | Control.Elaborate.Other => usage (concat ["invalid -", flag, " flag: ", s]) open Control Popt datatype z = datatype MLton.Platform.Arch.t datatype z = datatype MLton.Platform.OS.t fun tokenizeOpt f opts = List.foreach (String.tokens (opts, Char.isSpace), fn opt => f opt) fun tokenizeTargetOpt f (target, opts) = List.foreach (String.tokens (opts, Char.isSpace), fn opt => f (target, opt)) in List.map ( [ (Normal, "align", if defaultAlignIs8 () then " {8|4}" else " {4|8}", "object alignment", (SpaceString (fn s => explicitAlign := SOME (case s of "4" => Align4 | "8" => Align8 | _ => usage (concat ["invalid -align flag: ", s]))))), (Expert, "ar-script", " ", "path to a script producing archives", SpaceString (fn s => arScript := s)), (Normal, "as-opt", " ", "pass option to assembler", (SpaceString o tokenizeOpt) (fn s => List.push (asOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "as-opt-quote", " ", "pass (quoted) option to assembler", SpaceString (fn s => List.push (asOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "build-constants", " {false|true}", "output C file that prints basis constants", boolRef buildConstants), (Expert, "cc", " ", "path to gcc executable", SpaceString (fn s => gcc := s)), (Normal, "cc-opt", " ", "pass option to C compiler", (SpaceString o tokenizeOpt) (fn s => List.push (ccOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "cc-opt-quote", " ", "pass (quoted) option to C compiler", SpaceString (fn s => List.push (ccOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "chunkify", " {coalesce|func|one}", "set chunkify method", SpaceString (fn s => explicitChunk := SOME (case s of "func" => ChunkPerFunc | "one" => OneChunk | _ => let val usage = fn () => usage (concat ["invalid -chunkify flag: ", s]) in if String.hasPrefix (s, {prefix = "coalesce"}) then let val s = String.dropPrefix (s, 8) in if String.forall (s, Char.isDigit) then (case Int.fromString s of NONE => usage () | SOME n => Coalesce {limit = n}) else usage () end else usage () end))), (Expert, "closure-convert-globalize", " {true|false}", "whether to globalize during closure conversion", Bool (fn b => (closureConvertGlobalize := b))), (Expert, "closure-convert-shrink", " {true|false}", "whether to shrink during closure conversion", Bool (fn b => (closureConvertShrink := b))), (Normal, "codegen", concat [" {", String.concatWith (List.keepAllMap (Native :: (List.map (Control.Codegen.all, Explicit)), fn cg => case cg of Native => if hasNativeCodegen () then SOME "native" else NONE | Explicit cg => if hasCodegen cg andalso cg <> Bytecode then SOME (Control.Codegen.toString cg) else NONE), "|"), "}"], "which code generator to use", SpaceString (fn s => explicitCodegen := SOME (if s = "native" then Native else (case List.peek (Control.Codegen.all, fn cg => s = Control.Codegen.toString cg) of SOME cg => Explicit cg | NONE => usage (concat ["invalid -codegen flag: ", s]))))), (Normal, "const", " ' '", "set compile-time constant", SpaceString (fn s => case String.tokens (s, Char.isSpace) of [name, value] => Compile.setCommandLineConstant {name = name, value = value} | _ => usage (concat ["invalid -const flag: ", s]))), (Expert, "contify-into-main", " {false|true}", "contify functions into main", boolRef contifyIntoMain), (Expert, "debug", " {false|true}", "produce executable with debug info", Bool (fn b => (debug := b ; debugRuntime := b))), (Expert, "debug-runtime", " {false|true}", "produce executable with debug info", boolRef debugRuntime), (Expert, "debug-format", " {default|dwarf|dwarf+|drwaf2|stabs|stabs+}", "choose debug symbol format", SpaceString (fn s => debugFormat := (case s of "default" => NONE | "dwarf" => SOME Dwarf | "dwarf+" => SOME DwarfPlus | "dwarf2" => SOME Dwarf2 | "stabs" => SOME Stabs | "stabs+" => SOME StabsPlus | _ => usage (concat ["invalid -debug-format flag: ", s])))), let val flag = "default-ann" in (Normal, flag, " ", "set annotation default for mlb files", SpaceString (fn s => reportAnnotation (s, flag, Control.Elaborate.processDefault s))) end, (Normal, "default-type", " ''", "set default type", SpaceString (fn s => (case s of "char8" => Control.defaultChar := s | "int8" => Control.defaultInt := s | "int16" => Control.defaultInt := s | "int32" => Control.defaultInt := s | "int64" => Control.defaultInt := s | "intinf" => Control.defaultInt := s | "real32" => Control.defaultReal := s | "real64" => Control.defaultReal := s | "widechar16" => Control.defaultWideChar := s | "widechar32" => Control.defaultWideChar := s | "word8" => Control.defaultWord := s | "word16" => Control.defaultWord := s | "word32" => Control.defaultWord := s | "word64" => Control.defaultWord := s | _ => usage (concat ["invalid -default-type flag: ", s])))), (Expert, "diag-pass", " ", "keep diagnostic info for pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (diagPasses, re) end | NONE => usage (concat ["invalid -diag-pass flag: ", s])))), let val flag = "disable-ann" in (Normal, flag, " ", "disable annotation in mlb files", SpaceString (fn s => reportAnnotation (s, flag, Control.Elaborate.processEnabled (s, false)))) end, (Expert, "drop-pass", " ", "omit optimization pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (dropPasses, re) end | NONE => usage (concat ["invalid -drop-pass flag: ", s])))), let val flag = "enable-ann" in (Expert, flag, " ", "globally enable annotation", SpaceString (fn s => reportAnnotation (s, flag, Control.Elaborate.processEnabled (s, true)))) end, (Expert, "error-threshhold", " ", "error threshhold (20)", intRef errorThreshhold), (Expert, "emit-main", " {true|false}", "emit main() startup function", boolRef emitMain), (Expert, "expert", " {false|true}", "enable expert status", boolRef expert), (Normal, "export-header", " ", "write C header file for _export's", SpaceString (fn s => exportHeader := SOME s)), (Expert, "format", concat [" {", String.concatWith (List.keepAllMap (Control.Format.all, fn cg => SOME (Control.Format.toString cg)), "|"), "}"], "generated output format", SpaceString (fn s => Control.format := (case List.peek (Control.Format.all, fn cg => s = Control.Format.toString cg) of SOME cg => cg | NONE => usage (concat ["invalid -format flag: ", s])))), (Expert, "gc-check", " {limit|first|every}", "force GCs", SpaceString (fn s => gcCheck := (case s of "limit" => Limit | "first" => First | "every" => Every | _ => usage (concat ["invalid -gc-check flag: ", s])))), (Normal, "ieee-fp", " {false|true}", "use strict IEEE floating-point", boolRef Native.IEEEFP), (Expert, "indentation", " ", "indentation level in ILs", intRef indentation), (Normal, "inline", " ", "set inlining threshold", Int (fn i => inlineNonRec := {small = i, product = #product (!inlineNonRec)})), (Expert, "inline-into-main", " {true|false}", "inline functions into main", boolRef inlineIntoMain), (Expert, "inline-leafa-loops", " {true|false}", "leaf inline loops", Bool (fn loops => case !inlineLeafA of {repeat, size, ...} => inlineLeafA := {loops = loops, repeat = repeat, size = size})), (Expert, "inline-leafa-repeat", " {true|false}", "leaf inline repeat", Bool (fn repeat => case !inlineLeafA of {loops, size, ...} => inlineLeafA := {loops = loops, repeat = repeat, size = size})), (Expert, "inline-leafa-size", " ", "set leaf inlining threshold (20)", SpaceString (fn s => case !inlineLeafA of {loops, repeat, ...} => inlineLeafA := {loops = loops, repeat = repeat, size = (if s = "inf" then NONE else if String.forall (s, Char.isDigit) then Int.fromString s else (usage o concat) ["invalid -inline-leaf-size flag: ", s])})), (Expert, "inline-leafb-loops", " {true|false}", "leaf inline loops", Bool (fn loops => case !inlineLeafB of {repeat, size, ...} => inlineLeafB := {loops = loops, repeat = repeat, size = size})), (Expert, "inline-leafb-repeat", " {true|false}", "leaf inline repeat", Bool (fn repeat => case !inlineLeafB of {loops, size, ...} => inlineLeafB := {loops = loops, repeat = repeat, size = size})), (Expert, "inline-leafb-size", " ", "set leaf inlining threshold (40)", SpaceString (fn s => case !inlineLeafB of {loops, repeat, ...} => inlineLeafB := {loops = loops, repeat = repeat, size = (if s = "inf" then NONE else if String.forall (s, Char.isDigit) then Int.fromString s else (usage o concat) ["invalid -inline-leaf-size flag: ", s])})), (Expert, "inline-nonrec-product", " ", "set inlining threshold (320)", Int (fn product => case !inlineNonRec of {small, ...} => inlineNonRec := {small = small, product = product})), (Expert, "inline-nonrec-small", " ", "set inlining threshold (60)", Int (fn small => case !inlineNonRec of {product, ...} => inlineNonRec := {small = small, product = product})), (Normal, "keep", " {g|o|sml}", "save intermediate files", SpaceString (fn s => case s of "core-ml" => keepCoreML := true | "dot" => keepDot := true | "g" => keepGenerated := true | "machine" => keepMachine := true | "o" => keepO := true | "rssa" => keepRSSA := true | "ssa" => keepSSA := true | "ssa2" => keepSSA2 := true | "sxml" => keepSXML := true | "xml" => keepXML := true | _ => usage (concat ["invalid -keep flag: ", s]))), (Expert, "keep-pass", " ", "keep the results of pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (keepPasses, re) end | NONE => usage (concat ["invalid -keep-pass flag: ", s])))), (Expert, "libname", " ", "the name of the generated library", SpaceString (fn s => libname := s)), (Normal, "link-opt", " ", "pass option to linker", (SpaceString o tokenizeOpt) (fn s => List.push (linkOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "link-opt-quote", " ", "pass (quoted) option to linker", SpaceString (fn s => List.push (linkOpts, {opt = s, pred = OptPred.Yes}))), (Expert, "loop-passes", " ", "loop optimization passes (1)", Int (fn i => if i >= 1 then loopPasses := i else usage (concat ["invalid -loop-passes arg: ", Int.toString i]))), (Expert, "mark-cards", " {true|false}", "mutator marks cards", boolRef markCards), (Expert, "max-function-size", " ", "max function size (blocks)", intRef maxFunctionSize), (Normal, "mlb-path-map", " ", "additional MLB path map", SpaceString (fn s => mlbPathVars := !mlbPathVars @ readMlbPathMap s)), (Normal, "mlb-path-var", " ' '", "additional MLB path var", SpaceString (fn s => mlbPathVars := !mlbPathVars @ [case parseMlbPathVar s of NONE => Error.bug ("strange mlb path var: " ^ s) | SOME v => v])), (Expert, "native-commented", " ", "level of comments (0)", intRef Native.commented), (Expert, "native-copy-prop", " {true|false}", "use copy propagation", boolRef Native.copyProp), (Expert, "native-cutoff", " ", "live transfer cutoff distance", intRef Native.cutoff), (Expert, "native-live-transfer", " {0,...,8}", "use live transfer", intRef Native.liveTransfer), (Expert, "native-live-stack", " {false|true}", "track liveness of stack slots", boolRef Native.liveStack), (Expert, "native-move-hoist", " {true|false}", "use move hoisting", boolRef Native.moveHoist), (Expert, "native-optimize", " ", "level of optimizations", intRef Native.optimize), (Expert, "native-split", " ", "split assembly files at ~n lines", Int (fn i => Native.split := SOME i)), (Expert, "native-shuffle", " {true|false}", "shuffle registers at C-calls", Bool (fn b => Native.shuffle := b)), (Expert, "opt-passes", " {default|minimal}", "level of optimizations", SpaceString (fn s => let fun err s = usage (concat ["invalid -opt-passes flag: ", s]) in List.foreach (!optimizationPasses, fn {il,set,...} => case set s of Result.Yes () => () | Result.No s' => err (concat [s', "(for ", il, ")"])) end)), (Normal, "output", " ", "name of output file", SpaceString (fn s => output := SOME s)), (Expert, "polyvariance", " {true|false}", "use polyvariance", Bool (fn b => if b then () else polyvariance := NONE)), (Expert, "polyvariance-hofo", " {true|false}", "duplicate higher-order fns only", Bool (fn hofo => case !polyvariance of SOME {product, rounds, small, ...} => polyvariance := SOME {hofo = hofo, product = product, rounds = rounds, small = small} | _ => ())), (Expert, "polyvariance-product", " ", "set polyvariance threshold (300)", Int (fn product => case !polyvariance of SOME {hofo, rounds, small, ...} => polyvariance := SOME {hofo = hofo, product = product, rounds = rounds, small = small} | _ => ())), (Expert, "polyvariance-rounds", " ", "set polyvariance rounds (2)", Int (fn rounds => case !polyvariance of SOME {hofo, product, small, ...} => polyvariance := SOME {hofo = hofo, product = product, rounds = rounds, small = small} | _ => ())), (Expert, "polyvariance-small", " ", "set polyvariance threshold (30)", Int (fn small => case !polyvariance of SOME {hofo, product, rounds, ...} => polyvariance := SOME {hofo = hofo, product = product, rounds = rounds, small = small} | _ => ())), (Expert, "prefer-abs-paths", " {false|true}", "prefer absolute paths when referring to files", boolRef preferAbsPaths), (Expert, "prof-pass", " ", "keep profile info for pass", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let val re = Regexp.compileDFA re in List.push (profPasses, re) end | NONE => usage (concat ["invalid -diag-pass flag: ", s])))), (Normal, "profile", " {no|alloc|count|time}", "produce executable suitable for profiling", SpaceString (fn s => if !profileSet then usage "can't have multiple -profile switches" else (profileSet := true ; profile := (case s of "no" => ProfileNone | "alloc" => ProfileAlloc | "call" => ProfileCallStack | "count" => ProfileCount | "drop" => ProfileDrop | "label" => ProfileLabel | "time" => (profileTimeSet := true ; ProfileTimeLabel) | "time-field" => ProfileTimeField | "time-label" => ProfileTimeLabel | _ => usage (concat ["invalid -profile arg: ", s]))))), (Normal, "profile-branch", " {false|true}", "profile branches in addition to functions", boolRef profileBranch), (Expert, "profile-c", " ", "include C-calls in files matching in profile", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let open Regexp val re = seq [anys, re, anys] val re = compileDFA re in List.push (profileC, re) end | NONE => usage (concat ["invalid -profile-c flag: ", s])))), (Expert, "profile-exclude", " ", "exclude files matching from profile", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let open Regexp val re = seq [anys, re, anys] val re = compileDFA re in List.push (profileInclExcl, (re, false)) end | NONE => usage (concat ["invalid -profile-exclude flag: ", s])))), (Expert, "profile-il", " {source}", "where to insert profile exps", SpaceString (fn s => case s of "source" => profileIL := ProfileSource | "ssa" => profileIL := ProfileSSA | "ssa2" => profileIL := ProfileSSA2 | _ => usage (concat ["invalid -profile-il arg: ", s]))), (Expert, "profile-include", " ", "include files matching from profile", SpaceString (fn s => (case Regexp.fromString s of SOME (re,_) => let open Regexp val re = seq [anys, re, anys] val re = compileDFA re in List.push (profileInclExcl, (re, true)) end | NONE => usage (concat ["invalid -profile-include flag: ", s])))), (Expert, "profile-raise", " {false|true}", "profile raises in addition to functions", boolRef profileRaise), (Normal, "profile-stack", " {false|true}", "profile the stack", boolRef profileStack), (Normal, "profile-val", " {false|true}", "profile val bindings in addition to functions", boolRef profileVal), (Normal, "runtime", " ", "pass arg to runtime via @MLton", SpaceString (fn s => List.push (runtimeArgs, s))), (Expert, "show", " {anns|path-map}", "print specified data and stop", SpaceString (fn s => show := SOME (case s of "anns" => Show.Anns | "path-map" => Show.PathMap | _ => usage (concat ["invalid -show arg: ", s])))), (Normal, "show-basis", " ", "write out the final basis environment", SpaceString (fn s => showBasis := SOME s)), (Normal, "show-def-use", " ", "write def-use information", SpaceString (fn s => showDefUse := SOME s)), (Expert, "show-types", " {true|false}", "show types in ILs", boolRef showTypes), (Expert, "ssa-passes", " ", "ssa optimization passes", SpaceString (fn s => case List.peek (!Control.optimizationPasses, fn {il, ...} => String.equals ("ssa", il)) of SOME {set, ...} => (case set s of Result.Yes () => () | Result.No s' => usage (concat ["invalid -ssa-passes arg: ", s'])) | NONE => Error.bug "ssa optimization passes missing")), (Expert, "ssa2-passes", " ", "ssa2 optimization passes", SpaceString (fn s => case List.peek (!Control.optimizationPasses, fn {il, ...} => String.equals ("ssa2", il)) of SOME {set, ...} => (case set s of Result.Yes () => () | Result.No s' => usage (concat ["invalid -ssa2-passes arg: ", s'])) | NONE => Error.bug "ssa2 optimization passes missing")), (Normal, "stop", " {f|g|o|sml|tc}", "when to stop", SpaceString (fn s => stop := (case s of "f" => Place.Files | "g" => Place.Generated | "o" => Place.O | "tc" => Place.TypeCheck | _ => usage (concat ["invalid -stop arg: ", s])))), (Expert, "sxml-passes", " ", "sxml optimization passes", SpaceString (fn s => case List.peek (!Control.optimizationPasses, fn {il, ...} => String.equals ("sxml", il)) of SOME {set, ...} => (case set s of Result.Yes () => () | Result.No s' => usage (concat ["invalid -sxml-passes arg: ", s'])) | NONE => Error.bug "sxml optimization passes missing")), (Normal, "target", concat [" {", (case targetMap () of [] => "" | [x] => #target x | x :: _ => concat [#target x, "|..."]), "}"], "platform that executable will run on", SpaceString (fn t => (target := (if t = "self" then Self else Cross t); setTargetType (t, usage)))), (Normal, "target-as-opt", " ", "target-dependent assembler option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (asOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-as-opt-quote", " ", "target-dependent assembler option (quoted)", (SpaceString2 (fn (target, opt) => List.push (asOpts, {opt = opt, pred = OptPred.Target target})))), (Normal, "target-cc-opt", " ", "target-dependent C compiler option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (ccOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-cc-opt-quote", " ", "target-dependent C compiler option (quoted)", (SpaceString2 (fn (target, opt) => List.push (ccOpts, {opt = opt, pred = OptPred.Target target})))), (Normal, "target-link-opt", " ", "target-dependent linker option", (SpaceString2 o tokenizeTargetOpt) (fn (target, opt) => List.push (linkOpts, {opt = opt, pred = OptPred.Target target}))), (Expert, "target-link-opt-quote", " ", "target-dependent linker option (quoted)", (SpaceString2 (fn (target, opt) => List.push (linkOpts, {opt = opt, pred = OptPred.Target target})))), (Expert, #1 trace, " name1,...", "trace compiler internals", #2 trace), (Expert, "type-check", " {false|true}", "type check ILs", boolRef typeCheck), (Normal, "verbose", " {0|1|2|3}", "how verbose to be", SpaceString (fn s => verbosity := (case s of "0" => Silent | "1" => Top | "2" => Pass | "3" => Detail | _ => usage (concat ["invalid -verbose arg: ", s])))), (Expert, "warn-ann", " {true|false}", "unrecognized annotation warnings", boolRef warnAnn), (Expert, "warn-deprecated", " {true|false}", "deprecated feature warnings", boolRef warnDeprecated), (Expert, "xml-passes", " ", "xml optimization passes", SpaceString (fn s => case List.peek (!Control.optimizationPasses, fn {il, ...} => String.equals ("xml", il)) of SOME {set, ...} => (case set s of Result.Yes () => () | Result.No s' => usage (concat ["invalid -xml-passes arg: ", s'])) | NONE => Error.bug "xml optimization passes missing")), (Expert, "zone-cut-depth", " ", "zone cut depth", intRef zoneCutDepth) ], fn (style, name, arg, desc, opt) => {arg = arg, desc = desc, name = name, opt = opt, style = style}) end val mainUsage = "mlton [option ...] file.{c|cm|mlb|o|sml} [file.{c|o|s|S} ...]" val {parse, usage} = Popt.makeUsage {mainUsage = mainUsage, makeOptions = makeOptions, showExpert = fn () => !expert} val usage = fn s => (usage s; raise Fail "unreachable") fun commandLine (args: string list): unit = let open Control datatype z = datatype MLton.Platform.Arch.t datatype z = datatype MLton.Platform.OS.t val args = case args of lib :: args => (libDir := OS.Path.mkCanonical lib ; args) | _ => Error.bug "incorrect args from shell script" val () = setTargetType ("self", usage) val result = parse args val target = !target val targetStr = case target of Cross s => s | Self => "self" val targetsDir = OS.Path.mkAbsolute { path = "targets", relativeTo = !libDir } val targetDir = OS.Path.mkAbsolute { path = targetStr, relativeTo = targetsDir } val () = libTargetDir := targetDir val targetArch = !Target.arch val archStr = String.toLower (MLton.Platform.Arch.toString targetArch) val targetOS = !Target.os val OSStr = String.toLower (MLton.Platform.OS.toString targetOS) (* Determine whether code should be PIC (position independent) or not. * This decision depends on the platform and output format. *) val positionIndependent = case (targetOS, targetArch, !format) of (* Windows is never position independent *) (MinGW, _, _) => false | (Cygwin, _, _) => false (* Technically, Darwin should always be PIC. * However, PIC on i386/darwin is unimplemented so we avoid it. * PowerPC PIC is bad too, but the C codegen will use PIC behind * our back unless forced, so let's just admit that it's PIC. *) | (Darwin, X86, Executable) => false | (Darwin, X86, Archive) => false | (Darwin, _, _) => true (* On ELF systems, we only need PIC for LibArchive/Library *) | (_, _, Library) => true | (_, _, LibArchive) => true | _ => false val () = Control.positionIndependent := positionIndependent val stop = !stop val () = align := (case !explicitAlign of NONE => if defaultAlignIs8 () then Align8 else Align4 | SOME a => a) val () = codegen := (case !explicitCodegen of NONE => if hasCodegen (x86Codegen) then x86Codegen else if hasCodegen (amd64Codegen) then amd64Codegen else CCodegen | SOME Native => if hasCodegen (x86Codegen) then x86Codegen else if hasCodegen (amd64Codegen) then amd64Codegen else usage (concat ["can't use native codegen on ", MLton.Platform.Arch.toString targetArch, " target"]) | SOME (Explicit cg) => cg) val () = MLton.Rusage.measureGC (!verbosity <> Silent) val () = if !profileTimeSet then (case !codegen of x86Codegen => profile := ProfileTimeLabel | amd64Codegen => profile := ProfileTimeLabel | _ => profile := ProfileTimeField) else () val () = if !exnHistory then (case !profile of ProfileNone => profile := ProfileCallStack | ProfileCallStack => () | _ => usage "can't use -profile with Exn.keepHistory" ; profileRaise := true) else () val () = Compile.setCommandLineConstant {name = "CallStack.keep", value = Bool.toString (!Control.profile = Control.ProfileCallStack)} val () = let val sizeMap = List.map (File.lines (OS.Path.joinDirFile {dir = !Control.libTargetDir, file = "sizes"}), fn line => case String.tokens (line, Char.isSpace) of [ty, "=", size] => (case Int.fromString size of NONE => Error.bug (concat ["strange size: ", size]) | SOME size => (ty, Bytes.toBits (Bytes.fromInt size))) | _ => Error.bug (concat ["strange size mapping: ", line])) fun lookup ty' = case List.peek (sizeMap, fn (ty, _) => String.equals (ty, ty')) of NONE => Error.bug (concat ["missing size mapping: ", ty']) | SOME (_, size) => size in Control.Target.setSizes {cint = lookup "cint", cpointer = lookup "cpointer", cptrdiff = lookup "cptrdiff", csize = lookup "csize", header = lookup "header", mplimb = lookup "mplimb", objptr = lookup "objptr", seqIndex = lookup "seqIndex"} end fun tokenize l = String.tokens (concat (List.separate (l, " ")), Char.isSpace) (* When cross-compiling, use the named cross compiler. * Older gcc versions used -b for multiple targets. * If this is still needed, a shell script wrapper can hide this. *) val gcc = case target of Cross s => let val {dir = gccDir, file = gccFile} = OS.Path.splitDirFile (!gcc) in OS.Path.joinDirFile {dir = gccDir, file = s ^ "-" ^ gccFile} end | Self => !gcc val arScript = !arScript fun addTargetOpts opts = List.fold (!opts, [], fn ({opt, pred}, ac) => if (case pred of OptPred.Target s => let val s = String.toLower s in s = archStr orelse s = OSStr end | OptPred.Yes => true) then opt :: ac else ac) val asOpts = addTargetOpts asOpts val ccOpts = addTargetOpts ccOpts val ccOpts = concat ["-I", OS.Path.mkAbsolute { path = "include", relativeTo = !libTargetDir }] :: ccOpts val linkOpts = List.concat [[concat ["-L", !libTargetDir]], if positionIndependent then ["-lmlton-pic", "-lgdtoa-pic"] else if !debugRuntime then ["-lmlton-gdb", "-lgdtoa-gdb"] else ["-lmlton", "-lgdtoa"], addTargetOpts linkOpts] val linkArchives = if positionIndependent then [OS.Path.joinDirFile { dir = !libTargetDir, file = "libmlton-pic.a" }, OS.Path.joinDirFile { dir = !libTargetDir, file = "libgdtoa-pic.a" }] else if !debugRuntime then [OS.Path.joinDirFile { dir = !libTargetDir, file = "libmlton-gdb.a" }, OS.Path.joinDirFile { dir = !libTargetDir, file = "libgdtoa-gdb.a" }] else [OS.Path.joinDirFile { dir = !libTargetDir, file = "libmlton.a" }, OS.Path.joinDirFile { dir = !libTargetDir, file = "libgdtoa.a" }] val _ = if not (hasCodegen (!codegen)) then usage (concat ["can't use ", Control.Codegen.toString (!codegen), " codegen on ", MLton.Platform.Arch.toString targetArch, " target"]) else () val _ = if !codegen = Bytecode andalso !Control.warnDeprecated then Out.output (Out.error, "Warning: bytecode codegen is deprecated. Use native or C codegen.\n") else () val () = Control.labelsHaveExtra_ := (case targetOS of Cygwin => true | Darwin => true | MinGW => true | _ => false) val _ = chunk := (case !explicitChunk of NONE => (case !codegen of amd64Codegen => ChunkPerFunc | Bytecode => OneChunk | CCodegen => Coalesce {limit = 4096} | x86Codegen => ChunkPerFunc ) | SOME c => c) val _ = if not (!Control.codegen = x86Codegen) andalso !Native.IEEEFP then usage "must use x86 codegen with -ieee-fp true" else () val _ = if !keepDot andalso List.isEmpty (!keepPasses) then keepSSA := true else () val () = keepDefUse := (isSome (!showDefUse) orelse (Control.Elaborate.enabled Control.Elaborate.warnUnused) orelse (Control.Elaborate.default Control.Elaborate.warnUnused)) val warnMatch = (Control.Elaborate.enabled Control.Elaborate.nonexhaustiveMatch) orelse (Control.Elaborate.enabled Control.Elaborate.redundantMatch) orelse (Control.Elaborate.default Control.Elaborate.nonexhaustiveMatch <> Control.Elaborate.DiagEIW.Ignore) orelse (Control.Elaborate.default Control.Elaborate.redundantMatch <> Control.Elaborate.DiagEIW.Ignore) val _ = elaborateOnly := (stop = Place.TypeCheck andalso not (warnMatch) andalso not (!keepDefUse)) val _ = if !codegen = Bytecode andalso !profile = ProfileTimeLabel then usage (concat ["bytecode codegen doesn't support -profile time-label\n"]) else () val _ = case targetOS of Darwin => () | FreeBSD => () | HPUX => () | Linux => () | MinGW => () | NetBSD => () | OpenBSD => () | Solaris => () | _ => if !profile = ProfileTimeField orelse !profile = ProfileTimeLabel then usage (concat ["can't use -profile time on ", MLton.Platform.OS.toString targetOS]) else () fun printVersion (out: Out.t): unit = Out.output (out, concat [Version.banner, "\n"]) val () = case !show of NONE => () | SOME info => (case info of Show.Anns => Layout.outputl (Control.Elaborate.document {expert = !expert}, Out.standard) | Show.PathMap => let open Layout in outputl (align (List.map (Control.mlbPathMap (), fn {var, path, ...} => str (concat [var, " ", path]))), Out.standard) end ; let open OS.Process in exit success end) in case result of Result.No msg => usage msg | Result.Yes [] => (inputFile := "" ; if isSome (!showBasis) then (trace (Top, "Type Check SML") Compile.elaborateSML {input = []}) else if !buildConstants then Compile.outputBasisConstants Out.standard else if !verbosity = Silent orelse !verbosity = Top then printVersion Out.standard else outputHeader' (No, Out.standard)) | Result.Yes (input :: rest) => let val _ = inputFile := File.base (File.fileOf input) val (start, base) = let val rec loop = fn [] => usage (concat ["invalid file suffix on ", input]) | (suf, start, hasNum) :: sufs => if String.hasSuffix (input, {suffix = suf}) then (start, let val f = File.base input in if hasNum then File.base f else f end) else loop sufs datatype z = datatype Place.t in loop [(".mlb", MLB, false), (".cm", CM, false), (".sml", SML, false), (".c", Generated, true), (".o", O, true)] end val _ = List.foreach (rest, fn f => if List.exists ([".c", ".o", ".s", ".S"], fn suffix => String.hasSuffix (f, {suffix = suffix})) then File.withIn (f, fn _ => ()) else usage (concat ["invalid file suffix: ", f])) val csoFiles = rest in case Place.compare (start, stop) of GREATER => usage (concat ["cannot go from ", Place.toString start, " to ", Place.toString stop]) | EQUAL => usage "nothing to do" | LESS => let val _ = if !verbosity = Top then printVersion Out.error else () val tempFiles: File.t list ref = ref [] val tmpDir = let val (tmpVar, default) = case MLton.Platform.OS.host of MinGW => ("TEMP", "C:/WINDOWS/TEMP") | _ => ("TMPDIR", "/tmp") in case Process.getEnv tmpVar of NONE => default | SOME d => d end fun temp (suf: string): File.t = let val (f, out) = File.temp {prefix = OS.Path.concat (tmpDir, "file"), suffix = suf} val _ = Out.close out val _ = List.push (tempFiles, f) in f end fun suffix s = concat [base, s] fun maybeOut suf = case !output of NONE => suffix suf | SOME f => f fun maybeOutBase suf = case !output of NONE => suffix suf | SOME f => concat [File.base f, suf] val { base = outputBase, ext=_ } = OS.Path.splitBaseExt (maybeOut ".ext") val { file = defLibname, dir=_ } = OS.Path.splitDirFile outputBase val defLibname = if String.hasPrefix (defLibname, {prefix = "lib"}) then String.extract (defLibname, 3, NONE) else defLibname fun toAlNum c = if Char.isAlphaNum c then c else #"_" val () = if !libname <> "" then () else libname := CharVector.map toAlNum defLibname (* Library output includes a header by default *) val () = case (!format, !exportHeader) of (Executable, _) => () | (_, NONE) => exportHeader := SOME (!libname ^ ".h") | _ => () val _ = atMLtons := Vector.fromList (maybeOut "" :: tokenize (rev ("--" :: (!runtimeArgs)))) (* The -Wa,--gstabs says to pass the --gstabs option to the * assembler. This tells the assembler to generate stabs * debugging information for each assembler line. *) val (gccDebug, asDebug) = case !debugFormat of NONE => (["-g"], "-Wa,-g") | SOME Dwarf => (["-gdwarf", "-g2"], "-Wa,--gdwarf2") | SOME DwarfPlus => (["-gdwarf+", "-g2"], "-Wa,--gdwarf2") | SOME Dwarf2 => (["-gdwarf-2", "-g2"], "-Wa,--gdwarf2") | SOME Stabs => (["-gstabs", "-g2"], "-Wa,--gstabs") | SOME StabsPlus => (["-gstabs+", "-g2"], "-Wa,--gstabs") fun compileO (inputs: File.t list): unit = let val output = case (!format, targetOS) of (Archive, _) => maybeOut ".a" | (Executable, _) => maybeOut "" | (LibArchive, _) => maybeOut ".a" | (Library, Darwin) => maybeOut ".dylib" | (Library, Cygwin) => !libname ^ ".dll" | (Library, MinGW) => !libname ^ ".dll" | (Library, _) => maybeOut ".so" val libOpts = case targetOS of Darwin => [ "-dynamiclib" ] | Cygwin => [ "-shared", "-Wl,--out-implib," ^ maybeOut ".a", "-Wl,--output-def," ^ !libname ^ ".def"] | MinGW => [ "-shared", "-Wl,--out-implib," ^ maybeOut ".a", "-Wl,--output-def," ^ !libname ^ ".def"] | _ => [ "-shared" ] val _ = trace (Top, "Link") (fn () => if !format = Archive orelse !format = LibArchive then System.system (arScript, List.concat [[targetStr, OSStr, output], inputs, linkArchives]) else System.system (gcc, List.concat [["-o", output], if !format = Library then libOpts else [], if !debug then gccDebug else [], inputs, linkOpts])) () (* gcc on Cygwin appends .exe, which I don't want, so * move the output file to it's rightful place. * Notice that we do not use targetOS here, since we * care about the platform we're running on, not the * platform we're generating for. * * We want to keep the .exe as is for MinGW/Win32. *) val _ = if MLton.Platform.OS.host = Cygwin then if String.contains (output, #".") then () else File.move {from = concat [output, ".exe"], to = output} else () in () end fun mkOutputO (c: Counter.t, input: File.t): File.t = if stop = Place.O orelse !keepO then if File.dirOf input = File.dirOf (maybeOutBase ".o") then concat [File.base input, ".o"] else maybeOutBase (concat [".", Int.toString (Counter.next c), ".o"]) else temp ".o" fun compileC (c: Counter.t, input: File.t): File.t = let val debugSwitches = gccDebug @ ["-DASSERT=1"] val output = mkOutputO (c, input) val _ = System.system (gcc, List.concat [[ "-std=gnu99", "-c" ], if !format = Executable then [] else [ "-DLIBNAME=" ^ !libname ], if positionIndependent then [ "-fPIC", "-DPIC" ] else [], if !debug then debugSwitches else [], ccOpts, ["-o", output], [input]]) in output end fun compileS (c: Counter.t, input: File.t): File.t = let val output = mkOutputO (c, input) val _ = System.system (gcc, List.concat [["-c"], if !debug then [asDebug] else [], asOpts, ["-o", output], [input]]) in output end fun compileCSO (inputs: File.t list): unit = if List.forall (inputs, fn f => SOME "o" = File.extension f) then compileO inputs else let val c = Counter.new 0 val oFiles = trace (Top, "Compile and Assemble") (fn () => List.fold (inputs, [], fn (input, ac) => let val extension = File.extension input in if SOME "o" = extension then input :: ac else if SOME "c" = extension then (compileC (c, input)) :: ac else if SOME "s" = extension orelse SOME "S" = extension then (compileS (c, input)) :: ac else Error.bug (concat ["invalid extension: ", Option.toString (fn s => s) extension]) end)) () in case stop of Place.O => () | _ => compileO (rev oFiles) end fun mkCompileSrc {listFiles, elaborate, compile} input = let val outputs: File.t list ref = ref [] val r = ref 0 fun make (style: style, suf: string) () = let val suf = concat [".", Int.toString (!r), suf] val _ = Int.inc r val file = (if !keepGenerated orelse stop = Place.Generated then maybeOutBase else temp) suf val _ = List.push (outputs, file) val out = Out.openOut file fun print s = Out.output (out, s) val _ = outputHeader' (style, out) fun done () = Out.close out in {file = file, print = print, done = done} end val _ = case !verbosity of Silent => () | Top => () | _ => outputHeader (Control.No, fn l => let val out = Out.error in Layout.output (l, out) ; Out.newline out end) val _ = case stop of Place.Files => Vector.foreach (listFiles {input = input}, fn f => (print (String.translate (f, fn #"\\" => "/" | c => str c)) ; print "\n")) | Place.TypeCheck => trace (Top, "Type Check SML") elaborate {input = input} | _ => trace (Top, "Compile SML") compile {input = input, outputC = make (Control.C, ".c"), outputS = make (Control.Assembly, ".s")} in case stop of Place.Files => () | Place.TypeCheck => () | Place.Generated => () | _ => (* Shrink the heap before calling gcc. *) (MLton.GC.pack () ; compileCSO (List.concat [!outputs, csoFiles])) end val compileSML = mkCompileSrc {listFiles = fn {input} => Vector.fromList input, elaborate = Compile.elaborateSML, compile = Compile.compileSML} val compileMLB = mkCompileSrc {listFiles = Compile.sourceFilesMLB, elaborate = Compile.elaborateMLB, compile = Compile.compileMLB} fun compileCM (file: File.t) = let val _ = if !Control.warnDeprecated then Out.output (Out.error, "Warning: .cm input files are deprecated. Use .mlb input files.\n") else () val files = CM.cm {cmfile = file} in compileSML files end fun compile () = case start of Place.CM => compileCM input | Place.SML => compileSML [input] | Place.MLB => compileMLB input | Place.Generated => compileCSO (input :: csoFiles) | Place.O => compileCSO (input :: csoFiles) | _ => Error.bug "invalid start" val doit = trace (Top, "MLton") (fn () => Exn.finally (compile, fn () => List.foreach (!tempFiles, File.remove))) in doit () end end end val commandLine = Process.makeCommandLine commandLine val main = fn (_, args) => commandLine args val mainWrapped = fn () => OS.Process.exit (commandLine (CommandLine.arguments ())) end mlton-20100608/mlton/main/main.sig0000644000076600000240000000073711404435623015275 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MAIN_STRUCTS = sig end signature MAIN = sig include MAIN_STRUCTS val main: string * string list -> OS.Process.status val mainWrapped: unit -> 'a end mlton-20100608/mlton/main/main.sml0000644000076600000240000000047111404435623015301 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Main = Main () mlton-20100608/mlton/main/sources.cm0000644000076600000240000000131611404435623015643 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group structure Main is ../../lib/mlton/sources.cm ../ast/sources.cm ../atoms/sources.cm ../backend/sources.cm ../closure-convert/sources.cm ../cm/sources.cm ../codegen/sources.cm ../control/sources.cm ../core-ml/sources.cm ../defunctorize/sources.cm ../elaborate/sources.cm ../front-end/sources.cm ../ssa/sources.cm ../xml/sources.cm lookup-constant.sig lookup-constant.fun compile.sig compile.fun main.sig main.fun main.sml mlton-20100608/mlton/main/sources.mlb0000644000076600000240000000143711404435623016022 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../ast/sources.mlb ../atoms/sources.mlb ../backend/sources.mlb ../closure-convert/sources.mlb ../cm/sources.mlb ../codegen/sources.mlb ../control/sources.mlb ../core-ml/sources.mlb ../defunctorize/sources.mlb ../elaborate/sources.mlb ../front-end/sources.mlb ../ssa/sources.mlb ../xml/sources.mlb lookup-constant.sig lookup-constant.fun compile.sig compile.fun main.sig main.fun main.sml in structure Main end mlton-20100608/mlton/Makefile0000644000076600000240000001365711404435625014370 0ustar mtfstaff## Copyright (C) 2010 Matthew Fluet. # Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## SRC := $(shell cd .. && pwd) BUILD := $(SRC)/build BIN := $(BUILD)/bin HOST_ARCH := $(shell "$(SRC)/bin/host-arch") HOST_OS := $(shell "$(SRC)/bin/host-os") LIB := $(BUILD)/lib TARGET := self AOUT := mlton-compile PATH := $(BIN):$(shell echo $$PATH) FLAGS := @MLton ram-slop 0.7 gc-summary $(RUNTIME_ARGS) -- ifeq (self, $(shell if [ -x "$(BIN)/mlton" ]; then echo self; fi)) # We're compiling MLton with itself, so don't use any stubs. FILE := mlton.mlb FLAGS += -default-ann 'sequenceNonUnit warn' FLAGS += -default-ann 'warnUnused true' # FLAGS += -type-check true else # We're compiling MLton with an older version of itself. # Use "-align 8" for amd64 to avoid GMP/mul_2exp segfault with a # mis-aligned limb when compiling with <= 20070826. ifeq (amd64,$(findstring $(HOST_ARCH), amd64)) FLAGS += -align 8 endif ifneq (,$(findstring $(HOST_OS), cygwin mingw)) # The stubs don't work on Cygwin or MinGW, since they define spawn # in terms of fork, and fork doesn't work on Cygwin or MinGW. So, # make without the stubs. FILE := mlton.mlb else # We're compiling MLton with an older version of itself, so use the stubs for # the MLton structure. FILE := mlton-stubs.mlb endif endif FLAGS += -target $(TARGET) FLAGS += -verbose 2 -output "$(AOUT)" FLAGS += $(COMPILE_ARGS) FRONT_END_SOURCES := \ front-end/ml.lex.sml \ front-end/ml.grm.sig \ front-end/ml.grm.sml \ front-end/mlb.lex.sml \ front-end/mlb.grm.sig \ front-end/mlb.grm.sml SOURCES := \ $(FILE) \ upgrade-basis.sml \ $(FRONT_END_SOURCES) \ $(filter-out control/version.sml,$(shell if [ -r $(FILE) ]; then mlton -stop f $(FILE) | grep -v " "; fi)) .PHONY: all all: $(AOUT) control/version.sml: control/version_sml.src cat control/version_sml.src | \ sed "s/MLTONVERSION/$${VERSION:-r`svnversion||echo unknown`}/" |\ sed "s/\(.*\)MLTONBUILDDATE\(.*\)/\1`LANG=C date`\2/" | \ sed "s/\(.*\)MLTONBUILDNODE\(.*\)/\1`uname -n`\2/" > \ control/version.sml front-end/%.lex.sml: front-end/%.lex $(MAKE) -C front-end $(@F) front-end/%.grm.sig front-end/%.grm.sml: front-end/%.grm $(MAKE) -C front-end $(upgrade-basis.sml mlton-stubs.mlb: $(shell mlton -stop f ../lib/stubs/mlton-stubs/sources.mlb) $(shell mlton -stop f mlton.mlb) ( \ echo '$$(SML_LIB)/basis/unsafe.mlb'; \ echo '$$(SML_LIB)/basis/sml-nj.mlb'; \ echo '$$(SML_LIB)/basis/mlton.mlb'; \ echo '$$(SML_LIB)/basis/basis.mlb'; \ echo 'upgrade-basis.sml'; \ mlton -stop f mlton.mlb | grep -v 'mlb$$' | grep 'mlyacc'; \ mlton -stop f ../lib/stubs/mlton-stubs/sources.mlb | \ grep -v 'mlb$$' | \ grep 'mlton-stubs'; \ mlton -stop f mlton.mlb | \ grep -v 'mlb$$' | \ grep -v 'sml/basis' | \ grep -v 'targets' | \ grep -v 'mlyacc'; \ ) > mlton-stubs.mlb $(AOUT): $(SOURCES) rm -f upgrade-basis.sml $(MAKE) upgrade-basis.sml rm -f control/version.sml $(MAKE) control/version.sml @echo 'Compiling mlton (takes a while)' mlton $(FLAGS) $(FILE) .PHONY: def-use def-use: mlton.def-use mlton.def-use: $(SOURCES) mlton $(FLAGS) -stop tc -prefer-abs-paths true -show-def-use mlton.def-use $(FILE) .PHONY: clean clean: ../bin/clean # # The following rebuilds the heap file for the SML/NJ compiled version # of MLton. # SMLNJ := sml SMLNJ_CM_SERVERS_NUM := 0 .PHONY: smlnj-mlton smlnj-mlton: $(FRONT_END_SOURCES) rm -f control/version.sml $(MAKE) control/version.sml ( \ echo 'SMLofNJ.Internals.GC.messages false;'; \ echo '#set CM.Control.verbose false;'; \ echo '#set CM.Control.warn_obsolete false;'; \ echo 'Control.polyEqWarn := false;'; \ echo 'local'; \ echo 'fun loop 0 = () | loop n = (CM.Server.start {cmd = (CommandLine.name (), ["@CMslave"]), name = "server" ^ (Int.toString n), pathtrans = NONE, pref = 0}; loop (n - 1));'; \ echo 'in'; \ echo 'val _ = loop $(SMLNJ_CM_SERVERS_NUM);'; \ echo 'end;'; \ echo 'if (CM.make "mlton-smlnj.cm") handle _ => false'; \ echo ' then ()'; \ echo ' else OS.Process.exit OS.Process.failure;'; \ echo 'SMLofNJ.exportFn("mlton-smlnj",Main.main);' \ ) | "$(SMLNJ)" # # The following rebuilds the executable file for the Poly/ML compiled # version of MLton. # POLYML := poly .PHONY: polyml-mlton polyml-mlton: mlton-polyml.use $(FRONT_END_SOURCES) rm -f control/version.sml $(MAKE) control/version.sml ( \ echo 'use "mlton-polyml.use";'; \ echo 'PolyML.export("mlton-polyml", Main.mainWrapped);'; \ ) | "$(POLYML)" $(CC) -o mlton-polyml mlton-polyml.o -lpolymain -lpolyml rm -f mlton-polyml.o mlton-polyml.use: ../lib/stubs/basis-stubs-for-polyml/sources.use ../lib/stubs/mlton-stubs-for-polyml/sources.use $(shell mlton -stop f ../lib/stubs/mlton-stubs/sources.mlb) $(filter-out control/version.sml,$(shell mlton -stop f mlton.mlb)) ( \ cat ../lib/stubs/basis-stubs-for-polyml/sources.use | \ sed 's|use "\(.*\)";|../lib/stubs/basis-stubs-for-polyml/\1|'; \ mlton -stop f mlton.mlb | grep -v 'mlb$$' | grep 'mlyacc'; \ cat ../lib/stubs/mlton-stubs-for-polyml/sources.use | \ sed 's|use "\(.*\)";|../lib/stubs/mlton-stubs-for-polyml/\1|'; \ mlton -stop f ../lib/stubs/mlton-stubs/sources.mlb | \ grep -v 'mlb$$' | \ grep 'mlton-stubs'; \ mlton -stop f mlton.mlb | \ grep -v 'mlb$$' | \ grep -v 'sml/basis' | \ grep -v 'targets' | \ grep -v 'mlton-stubs' | \ grep -v 'mlyacc' | \ grep -v 'call-main.sml'; \ ) | sed 's|\(.*\)|use "\1";|' > mlton-polyml.use mlton-20100608/mlton/match-compile/0000755000076600000240000000000011404470407015433 5ustar mtfstaffmlton-20100608/mlton/match-compile/match-compile.fun0000644000076600000240000007255711404435622020707 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor MatchCompile (S: MATCH_COMPILE_STRUCTS): MATCH_COMPILE = struct open S local open Layout in val wild = str "_" fun conApp (c, p) = let val c = Con.layout c in case p of NONE => c | SOME p => paren (seq [c, str " ", p]) end end structure Env = MonoEnv (structure Domain = Var structure Range = Var) structure Fact = struct datatype t = Con of {arg: Var.t option, con: Con.t} | Tuple of Var.t vector fun layout (f: t): Layout.t = let open Layout in case f of Con {arg, con} => seq [Con.layout con, case arg of NONE => empty | SOME x => seq [str " ", Var.layout x]] | Tuple xs => tuple (Vector.toListMap (xs, Var.layout)) end end structure Examples = struct datatype t = T of {es: (Var.t * Layout.t) list, isOnlyExns: bool} fun layout (T {es, ...}) = List.layout (Layout.tuple2 (Var.layout, fn l => l)) es val empty = T {es = [], isOnlyExns = true} fun add (T {es, isOnlyExns = is}, x, l, {isOnlyExns: bool}) = T {es = (x, l) :: es, isOnlyExns = is andalso isOnlyExns} end structure Facts = struct datatype t = T of {fact: Fact.t, var: Var.t} list fun layout (T fs) = let open Layout in List.layout (fn {fact, var} => seq [Var.layout var, str " = ", Fact.layout fact]) fs end val empty: t = T [] fun add (T fs, x, f) = T ({fact = f, var = x} :: fs) fun bind (T facts, x: Var.t, p: NestedPat.t): Env.t = let val {destroy, get = fact: Var.t -> Fact.t, set = setFact, ...} = Property.destGetSetOnce (Var.plist, Property.initRaise ("fact", Var.layout)) val () = List.foreach (facts, fn {fact, var} => setFact (var, fact)) fun loop (p: NestedPat.t, x: Var.t, env: Env.t): Env.t = let datatype z = datatype NestedPat.node in case NestedPat.node p of Con {arg, ...} => (case arg of NONE => env | SOME p => (case fact x of Fact.Con {arg = SOME x, ...} => loop (p, x, env) | _ => Error.bug "MatchCompile.Facts.bind: Con:wrong fact")) | Const _ => env | Layered (y, p) => loop (p, x, Env.extend (env, y, x)) | Tuple ps => if 0 = Vector.length ps then env else (case fact x of Fact.Tuple xs => Vector.fold2 (ps, xs, env, loop) | _ => Error.bug "MatchCompile.Facts.bind: Tuple:wrong fact") | Var y => Env.extend (env, y, x) | Wild => env end val env = loop (p, x, Env.empty) val () = destroy () in env end val bind = Trace.trace3 ("MatchCompile.Facts.bind", layout, Var.layout, NestedPat.layout, Env.layout) bind fun example (T facts, Examples.T {es, ...}, x: Var.t): Layout.t = let val {destroy, get = fact: Var.t -> Fact.t option, set = setFact, ...} = Property.destGetSetOnce (Var.plist, Property.initConst NONE) val () = List.foreach (facts, fn {fact, var} => setFact (var, SOME fact)) fun loop (x: Var.t): Layout.t = case fact x of NONE => (case List.peek (es, fn (x', _) => Var.equals (x, x')) of NONE => wild | SOME (_, l) => l) | SOME f => case f of Fact.Con {arg, con} => conApp (con, Option.map (arg, loop)) | Fact.Tuple xs => Layout.tuple (Vector.toListMap (xs, loop)) val res = loop x val () = destroy () in res end val example = Trace.trace3 ("MatchCompile.Facts.example", layout, Examples.layout, Var.layout, fn l => l) example end structure Pat = struct datatype t = Const of {const: Const.t, isChar: bool, isInt: bool} | Con of {arg: (t * Type.t) option, con: Con.t, targs: Type.t vector} | Tuple of t vector | Wild fun layout (p: t): Layout.t = let open Layout in case p of Const {const, ...} => Const.layout const | Con {arg, con, ...} => seq [Con.layout con, case arg of NONE => empty | SOME (p, _) => seq [str " ", layout p]] | Tuple ps => tuple (Vector.toListMap (ps, layout)) | Wild => str "_" end val isWild: t -> bool = fn Wild => true | _ => false val fromNestedPat: NestedPat.t -> t = let fun loop (p: NestedPat.t): t = case NestedPat.node p of NestedPat.Con {arg, con, targs} => let val arg = Option.map (arg, fn p => (loop p, NestedPat.ty p)) in Con {arg = arg, con = con, targs = targs} end | NestedPat.Const r => Const r | NestedPat.Layered (_, p) => loop p | NestedPat.Tuple ps => Tuple (Vector.map (ps, loop)) | NestedPat.Var _ => Wild | NestedPat.Wild => Wild in loop end end structure Vector = struct open Vector fun dropNth (v: 'a t, n: int): 'a t = keepAllMapi (v, fn (i, a) => if i = n then NONE else SOME a) end structure Rule = struct datatype t = T of {pats: Pat.t vector, rest: {examples: (Layout.t * {isOnlyExns: bool}) list ref, finish: (Var.t -> Var.t) -> Exp.t, nestedPat: NestedPat.t}} fun layout (T {pats, ...}) = Layout.tuple (Vector.toListMap (pats, Pat.layout)) fun allWild (T {pats, ...}) = Vector.forall (pats, Pat.isWild) fun dropNth (T {pats, rest}, n) = T {pats = Vector.dropNth (pats, n), rest = rest} end structure Rules = struct type t = Rule.t vector fun layout (rs: t) = Layout.align (Vector.toListMap (rs, Rule.layout)) fun dropNth (rs: t, n: int): t = Vector.map (rs, fn r => Rule.dropNth (r, n)) end structure Vars = struct type t = (Var.t * Type.t) vector val layout = Vector.layout (Layout.tuple2 (Var.layout, Type.layout)) end val directCases = List.keepAllMap (WordSize.all, fn s => if WordSize.equals (s, WordSize.fromBits (Bits.fromInt 64)) then NONE else SOME {size = s, ty = Type.word s}) (* unhandledConst cs returns a constant (of the appropriate type) not in cs. *) fun unhandledConst (cs: Const.t vector): Const.t = let fun search {<= : 'a * 'a -> bool, equals: 'a * 'a -> bool, extract: Const.t -> 'a, isMin: 'a -> bool, make: 'a -> Const.t, next: 'a -> 'a, prev: 'a -> 'a} = let val cs = QuickSort.sortVector (Vector.map (cs, extract), op <=) val c = Vector.sub (cs, 0) in if not (isMin c) then make (prev c) else let val n = Vector.length cs fun loop (i, c) = if i = n orelse not (equals (c, Vector.sub (cs, i))) then make c else loop (i + 1, next c) in loop (0, c) end end val c = Vector.sub (cs, 0) datatype z = datatype Const.t in case c of IntInf _ => let fun extract c = case c of IntInf i => i | _ => Error.bug "MatchCompile.unhandledConst: expected IntInf" in search {<= = op <=, equals = op =, extract = extract, isMin = fn _ => false, make = Const.IntInf, next = fn i => i + 1, prev = fn i => i - 1} end | Null => Error.bug "MatchCompile.unhandledConst: match on null is not allowed" | Real _ => Error.bug "MatchCompile.unhandledConst: match on real is not allowed" | Word w => let val s = WordX.size w fun extract c = case c of Word w => WordX.toIntInf w | _ => Error.bug "MatchCompile.unhandledConst: expected Word" in search {<= = op <=, equals = op =, extract = extract, isMin = fn w => w = 0, make = fn w => Const.word (WordX.fromIntInf (w, s)), next = fn w => w + 1, prev = fn w => w - 1} end | WordVector v => let val max = Vector.fold (cs, ~1, fn (c, max) => case c of WordVector v => Int.max (max, WordXVector.length v) | _ => Error.bug "MatchCompile.unhandledConst: expected Word8Vector") val elementSize = WordXVector.elementSize v val w = WordX.fromIntInf (IntInf.fromInt (Char.ord #"a"), elementSize) in Const.WordVector (WordXVector.tabulate ({elementSize = elementSize}, max + 1, fn _ => w)) end end structure Exp = struct open Exp fun layout (_: t) = Layout.str "" end val traceMatch = Trace.trace4 ("MatchCompile.match", Vars.layout, Rules.layout, Facts.layout, Examples.layout, Exp.layout) val traceConst = Trace.trace ("MatchCompile.const", fn (vars, rules, facts, es, _: Int.t, _: Exp.t) => Layout.tuple [Vars.layout vars, Rules.layout rules, Facts.layout facts, Examples.layout es], Exp.layout) val traceSum = Trace.trace ("MatchCompile.sum", fn (vars, rules, facts, es, _: Int.t, _: Exp.t, _: Tycon.t) => Layout.tuple [Vars.layout vars, Rules.layout rules, Facts.layout facts, Examples.layout es], Exp.layout) val traceTuple = Trace.trace ("MatchCompile.tuple", fn (vars, rules, facts, es, _: Int.t, _: Exp.t) => Layout.tuple [Vars.layout vars, Rules.layout rules, Facts.layout facts, Examples.layout es], Exp.layout) (*---------------------------------------------------*) (* matchCompile *) (*---------------------------------------------------*) fun matchCompile {caseType: Type.t, cases: (NestedPat.t * ((Var.t -> Var.t) -> Exp.t)) vector, conTycon: Con.t -> Tycon.t, region: Region.t, test: Var.t, testType: Type.t, tyconCons: Tycon.t -> {con: Con.t, hasArg: bool} vector} = let fun chooseColumn _ = 0 fun match arg : Exp.t = traceMatch (fn (vars: Vars.t, rules: Rules.t, facts: Facts.t, es) => if 0 = Vector.length rules then Error.bug "MatchCompile.match: no rules" else if Rule.allWild (Vector.sub (rules, 0)) then (* The first rule matches. *) let val Rule.T {rest = {examples, finish, nestedPat, ...}, ...} = Vector.sub (rules, 0) val env = Facts.bind (facts, test, nestedPat) val Examples.T {isOnlyExns, ...} = es val () = List.push (examples, (Facts.example (facts, es, test), {isOnlyExns = isOnlyExns})) in finish (fn x => Env.lookup (env, x)) end else let val i = chooseColumn rules in case Vector.peek (rules, fn Rule.T {pats, ...} => not (Pat.isWild (Vector.sub (pats, i)))) of NONE => match (Vector.dropNth (vars, i), Rules.dropNth (rules, i), facts, es) | SOME (Rule.T {pats, ...}) => let datatype z = datatype Pat.t val test = Exp.var (Vector.sub (vars, i)) in case Vector.sub (pats, i) of Const _ => const (vars, rules, facts, es, i, test) | Con {con, ...} => sum (vars, rules, facts, es, i, test, conTycon con) | Tuple _ => tuple (vars, rules, facts, es, i, test) | Wild => Error.bug "MatchCompile.match: Wild" end end) arg and const arg = traceConst (fn (vars, rules, facts, es, i, test) => let val (var, ty) = Vector.sub (vars, i) val {isChar, isInt} = case Vector.peekMap (rules, fn Rule.T {pats, ...} => case Vector.sub (pats, i) of Pat.Const {isChar, isInt, ...} => SOME {isChar = isChar, isInt = isInt} | _ => NONE) of NONE => {isChar = false, isInt = false} | SOME z => z fun layoutConst c = if isChar then case c of Const.Word w => let open Layout in seq [str "#\"", Char.layout (WordX.toChar w), str String.dquote] end | _ => Error.bug (concat ["MatchCompile.const.layoutConst: ", "strange char: ", Layout.toString (Const.layout c)]) else if isInt then case c of Const.IntInf i => IntInf.layout i | Const.Word w => IntInf.layout (WordX.toIntInfX w) | _ => Error.bug (concat ["MatchCompile.const.layoutConst: ", "strange int: ", Layout.toString (Const.layout c)]) else Const.layout c val (cases, defaults) = Vector.foldr (rules, ([], []), fn (rule as Rule.T {pats, ...}, (cases, defaults)) => let val rule = Rule.dropNth (rule, i) in case Vector.sub (pats, i) of Pat.Const {const = c, ...} => let fun insert (cases, ac) = case cases of [] => {const = c, rules = rule :: defaults} :: ac | (casee as {const, rules}) :: cases => if Const.equals (c, const) then {const = c, rules = rule :: rules} :: List.appendRev (ac, cases) else insert (cases, casee :: ac) in (insert (cases, []), defaults) end | Pat.Wild => (List.map (cases, fn {const, rules} => {const = const, rules = rule :: rules}), rule :: defaults) | _ => Error.bug "MatchCompile.const: expected Const pat" end) val cases = Vector.fromListMap (cases, fn {const, rules} => {const = const, rules = Vector.fromList rules}) val defaults = Vector.fromList defaults val vars = Vector.dropNth (vars, i) fun finish (rules: Rule.t vector, e, isOnlyExns): Exp.t = match (vars, rules, facts, Examples.add (es, var, e, {isOnlyExns = isOnlyExns})) fun default (): Exp.t = let val (e, ioe) = if 0 = Vector.length cases then (wild, true) else (layoutConst (unhandledConst (Vector.map (cases, #const))), false) in finish (defaults, e, ioe) end in case List.peek (directCases, fn {ty = ty', ...} => Type.equals (ty, ty')) of NONE => Vector.fold (cases, default (), fn ({const, rules}, rest) => Exp.iff {test = Exp.equal (test, Exp.const const), thenn = finish (rules, Const.layout const, true), elsee = rest, ty = caseType}) | SOME {size, ...} => let val default = if WordSize.cardinality size = IntInf.fromInt (Vector.length cases) then NONE else SOME (default (), region) val cases = Vector.map (cases, fn {const, rules} => let val w = case const of Const.Word w => w | _ => Error.bug "MatchCompile.const: caseWord type error" in (w, finish (rules, layoutConst const, true)) end) in Exp.casee {cases = Cases.word (size, cases), default = default, test = test, ty = caseType} end end) arg and sum arg = traceSum (fn (vars: Vars.t, rules: Rules.t, facts: Facts.t, es, i, test, tycon) => let val (var, _) = Vector.sub (vars, i) val (cases, defaults) = Vector.foldr (rules, ([], []), fn (rule as Rule.T {pats, ...}, (cases, defaults)) => case Vector.sub (pats, i) of Pat.Con {arg, con, targs} => let fun oneCase () = let val (arg, vars) = case arg of NONE => (NONE, Vector.keepAllMapi (vars, fn (i', x) => if i = i' then NONE else SOME x)) | SOME (_, ty) => let val arg = Var.newNoname () in (SOME (arg, ty), Vector.mapi (vars, fn (i', x) => if i = i' then (arg, ty) else x)) end in {rest = {arg = arg, con = con, targs = targs, vars = vars}, rules = rule :: defaults} end fun insert (cases, ac) = case cases of [] => oneCase () :: ac | ((casee as {rest as {con = con', ...}, rules}) :: cases) => if Con.equals (con, con') then {rest = rest, rules = rule :: rules} :: List.appendRev (ac, cases) else insert (cases, casee :: ac) in (insert (cases, []), defaults) end | Pat.Wild => (List.map (cases, fn {rest, rules} => {rest = rest, rules = rule :: rules}), rule :: defaults) | _ => Error.bug "MatchCompile.sum: expected Con pat") val cases = Vector.fromListMap (cases, fn {rest = {arg, con, targs, vars}, rules} => let val rules = Vector.fromListMap (rules, fn Rule.T {pats, rest} => let val pats = Vector.keepAllMapi (pats, fn (i', p') => if i <> i' then SOME p' else case p' of Pat.Con {arg, ...} => Option.map (arg, #1) | Pat.Wild => Option.map (arg, fn _ => Pat.Wild) | _ => Error.bug "MatchCompile.sum: decon got strange pattern") in Rule.T {pats = pats, rest = rest} end) val facts = Facts.add (facts, var, Fact.Con {arg = Option.map (arg, #1), con = con}) in {arg = arg, con = con, rhs = match (vars, rules, facts, es), targs = targs} end) fun done (e, isOnlyExns) = SOME (match (Vector.dropNth (vars, i), Rules.dropNth (Vector.fromList defaults, i), facts, Examples.add (es, var, e, {isOnlyExns = isOnlyExns}))) val default = if Vector.isEmpty cases then done (wild, true) else if Tycon.equals (tycon, Tycon.exn) then done (Layout.str "e", true) else let val cons = tyconCons tycon in if Vector.length cases = Vector.length cons then NONE else let val unhandled = Vector.keepAllMap (cons, fn {con, hasArg, ...} => if Vector.exists (cases, fn {con = con', ...} => Con.equals (con, con')) then NONE else SOME (conApp (con, if hasArg then SOME wild else NONE))) open Layout in done (seq (separate (Vector.toList unhandled, " | ")), false) end end fun normal () = Exp.casee {cases = Cases.con cases, default = Option.map (default, fn e => (e, region)), test = test, ty = caseType} in if 1 <> Vector.length cases then normal () else let val {arg, con, rhs, ...} = Vector.sub (cases, 0) in if not (Con.equals (con, Con.reff)) then normal () else case arg of NONE => Error.bug "MatchCompile.sum: ref missing arg" | SOME (var, _) => Exp.lett {body = rhs, exp = Exp.deref test, var = var} end end) arg and tuple arg = traceTuple (fn (vars: Vars.t, rules: Rules.t, facts: Facts.t, es, i, test) => let val (var, _) = Vector.sub (vars, i) fun body vars' = let val n = Vector.length vars' val vars = Vector.concatV (Vector.mapi (vars, fn (i', x) => if i = i' then vars' else Vector.new1 x)) val rules = Vector.map (rules, fn Rule.T {pats, rest} => let val pats = Vector.concatV (Vector.mapi (pats, fn (i', p) => if i <> i' then Vector.new1 p else (case p of Pat.Tuple ps => ps | Pat.Wild => Vector.tabulate (n, fn _ => Pat.Wild) | _ => Error.bug "MatchCompile.tuple: detuple"))) in Rule.T {pats = pats, rest = rest} end) in match (vars, rules, Facts.add (facts, var, Fact.Tuple (Vector.map (vars', #1))), es) end in Exp.detuple {body = body, tuple = test} end) arg val examples = Vector.tabulate (Vector.length cases, fn _ => ref []) val res = match (Vector.new1 (test, testType), Vector.map2 (cases, examples, fn ((p, f), r) => Rule.T {pats = Vector.new1 (Pat.fromNestedPat p), rest = {examples = r, finish = f, nestedPat = p}}), Facts.empty, Examples.empty) in (res, fn () => Vector.map (examples, fn r => Vector.fromList (!r))) end val matchCompile = Trace.trace ("MatchCompile.matchCompile", fn {caseType, cases, test, testType, ...} => Layout.record [("caseType", Type.layout caseType), ("cases", Vector.layout (NestedPat.layout o #1) cases), ("test", Var.layout test), ("testType", Type.layout testType)], Exp.layout o #1) matchCompile structure Vars = S.Vars end mlton-20100608/mlton/match-compile/match-compile.sig0000644000076600000240000000425411404435622020666 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MATCH_COMPILE_STRUCTS = sig include ATOMS structure Type: sig type t val deTuple: t -> t vector val equals: t * t -> bool val layout: t -> Layout.t val unit: t val word: WordSize.t -> t end structure Cases: sig type exp type t val con: {arg: (Var.t * Type.t) option, con: Con.t, rhs: exp, targs: Type.t vector} vector -> t val word: WordSize.t * (WordX.t * exp) vector -> t end structure Exp: sig type t val casee: {cases: Cases.t, default: (t * Region.t) option, test: t, ty: Type.t} (* type of entire case expression *) -> t val const: Const.t -> t val deref: t -> t val detuple: {tuple: t, body: (Var.t * Type.t) vector -> t} -> t val equal: t * t -> t val iff: {test: t, thenn: t, elsee: t, ty: Type.t} -> t val lett: {var: Var.t, exp: t, body: t} -> t val var: Var.t * Type.t -> t end sharing type Cases.exp = Exp.t structure NestedPat: NESTED_PAT sharing Atoms = NestedPat.Atoms sharing Type = NestedPat.Type end signature MATCH_COMPILE = sig include MATCH_COMPILE_STRUCTS val matchCompile: {caseType: Type.t, (* type of entire expression *) cases: (NestedPat.t * ((Var.t -> Var.t) -> Exp.t)) vector, conTycon: Con.t -> Tycon.t, region: Region.t, test: Var.t, testType: Type.t, tyconCons: Tycon.t -> {con: Con.t, hasArg: bool} vector} -> Exp.t * (unit -> ((Layout.t * {isOnlyExns: bool}) vector) vector) end mlton-20100608/mlton/match-compile/nested-pat.fun0000644000076600000240000001040211404435622020206 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor NestedPat (S: NESTED_PAT_STRUCTS): NESTED_PAT = struct open S datatype t = T of {pat: node, ty: Type.t} and node = Con of {arg: t option, con: Con.t, targs: Type.t vector} | Const of {const: Const.t, isChar: bool, isInt: bool} | Layered of Var.t * t | Tuple of t vector | Var of Var.t | Wild local fun make f (T r) = f r in val node = make #pat val ty = make #ty end fun tuple ps = if 1 = Vector.length ps then Vector.sub (ps, 0) else T {pat = Tuple ps, ty = Type.tuple (Vector.map (ps, ty))} fun layout p = let open Layout in case node p of Con {arg, con, targs} => let val z = Pretty.conApp {arg = Option.map (arg, layout), con = Con.layout con, targs = Vector.map (targs, Type.layout)} in if isSome arg then paren z else z end | Const {const = c, ...} => Const.layout c | Layered (x, p) => paren (seq [Var.layout x, str " as ", layout p]) | Tuple ps => tuple (Vector.toListMap (ps, layout)) | Var x => Var.layout x | Wild => str "_" end fun make (p, t) = case p of Tuple ps => if 1 = Vector.length ps then Vector.sub (ps, 0) else T {pat = p, ty = t} | _ => T {pat = p, ty = t} fun isRefutable p = case node p of Wild => false | Var _ => false | Const _ => true | Con _ => true | Tuple ps => Vector.exists (ps, isRefutable) | Layered (_, p) => isRefutable p fun isVar p = case node p of Var _ => true | _ => false fun removeOthersReplace (p, {new, old}) = let fun loop (T {pat, ty}) = let val pat = case pat of Con {arg, con, targs} => Con {arg = Option.map (arg, loop), con = con, targs = targs} | Const _ => pat | Layered (x, p) => let val p = loop p in if Var.equals (x, old) then Layered (new, p) else node p end | Tuple ps => Tuple (Vector.map (ps, loop)) | Var x => if Var.equals (x, old) then Var new else Wild | Wild => Wild in T {pat = pat, ty = ty} end in loop p end val removeOthersReplace = Trace.trace ("NestedPat.removeOthersReplace", fn (p, _) => layout p, layout) removeOthersReplace local val bogus = Var.newNoname () in fun removeVars (p: t): t = removeOthersReplace (p, {new = bogus, old = bogus}) end fun replaceTypes (p: t, f: Type.t -> Type.t): t = let fun loop (T {pat, ty}) = let val pat = case pat of Con {arg, con, targs} => Con {arg = Option.map (arg, loop), con = con, targs = Vector.map (targs, f)} | Const _ => pat | Layered (x, p) => Layered (x, loop p) | Tuple ps => Tuple (Vector.map (ps, loop)) | Var _ => pat | Wild => pat in T {pat = pat, ty = f ty} end in loop p end fun varsAndTypes (p: t): (Var.t * Type.t) list = let fun loop (p: t, accum: (Var.t * Type.t) list) = case node p of Wild => accum | Const _ => accum | Var x => (x, ty p) :: accum | Tuple ps => Vector.fold (ps, accum, loop) | Con {arg, ...} => (case arg of NONE => accum | SOME p => loop (p, accum)) | Layered (x, p) => loop (p, (x, ty p) :: accum) in loop (p, []) end end mlton-20100608/mlton/match-compile/nested-pat.sig0000644000076600000240000000316311404435622020206 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature NESTED_PAT_STRUCTS = sig include ATOMS structure Type: sig type t val layout: t -> Layout.t val tuple: t vector -> t end end signature NESTED_PAT = sig include NESTED_PAT_STRUCTS datatype t = T of {pat: node, ty: Type.t} and node = Con of {arg: t option, con: Con.t, targs: Type.t vector} | Const of {const: Const.t, isChar: bool, isInt: bool} | Layered of Var.t * t | Tuple of t vector | Var of Var.t | Wild (* isRefutable p iff p contains a constant, constructor or variable. *) val isRefutable: t -> bool val isVar: t -> bool val layout: t -> Layout.t val make: node * Type.t -> t val node: t -> node val removeOthersReplace: t * {new: Var.t, old: Var.t} -> t val removeVars: t -> t val replaceTypes: t * (Type.t -> Type.t) -> t val tuple: t vector -> t val ty: t -> Type.t (* varsAndTypes returns a list of the variables in the pattern, along with * their types. It is used for match compilation in order to build a * function that abstracts over the expression of a case rule p => e. * See infer.fun. *) val varsAndTypes: t -> (Var.t * Type.t) list end mlton-20100608/mlton/match-compile/sources.cm0000644000076600000240000000066611404435622017447 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group functor MatchCompile functor NestedPat is ../atoms/sources.cm ../control/sources.cm ../../lib/mlton/sources.cm nested-pat.sig nested-pat.fun match-compile.sig match-compile.fun mlton-20100608/mlton/match-compile/sources.mlb0000644000076600000240000000072511404435622017616 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb nested-pat.sig nested-pat.fun match-compile.sig match-compile.fun in functor MatchCompile functor NestedPat end mlton-20100608/mlton/mlton-smlnj.cm0000644000076600000240000000023511404435625015507 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group is sources.cm mlton-20100608/mlton/mlton-stubs.cm0000644000076600000240000000046611404435625015532 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group is upgrade-basis.sml ../lib/stubs/mlton-stubs/sources.cm mlton.cm mlton-20100608/mlton/mlton.cm0000644000076600000240000000057611404435625014376 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group is (* Need to elaborate ML-Yacc library in Basis Library, not MLton library. *) ../lib/mlyacc-lib/ml-yacc-lib.cm sources.cm call-main.sml mlton-20100608/mlton/mlton.mlb0000644000076600000240000000036511404435625014545 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local sources.mlb in call-main.sml end mlton-20100608/mlton/sources.cm0000644000076600000240000000042611404435625014722 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group is main/sources.cm mlton-20100608/mlton/sources.mlb0000644000076600000240000000043511404435625015075 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local in main/sources.mlb end mlton-20100608/mlton/ssa/0000755000076600000240000000000011404470407013477 5ustar mtfstaffmlton-20100608/mlton/ssa/analyze.fun0000644000076600000240000002575511404435623015673 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Analyze (S: ANALYZE_STRUCTS): ANALYZE = struct open S datatype z = datatype Exp.t datatype z = datatype Transfer.t fun 'a analyze {coerce, conApp, const, filter, filterWord, fromType, layout, primApp, program = Program.T {main, globals, functions, ...}, select, tuple, useFromTypeOnBinds} = let val unit = fromType Type.unit fun coerces (msg, from, to) = if Vector.length from = Vector.length to then Vector.foreach2 (from, to, fn (from, to) => coerce {from = from, to = to}) else Error.bug (concat ["Analyze.coerces length mismatch: ", msg]) val {get = value: Var.t -> 'a, set = setValue, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("analyze var value", Var.layout)) val value = Trace.trace ("Analyze.value", Var.layout, layout) value fun values xs = Vector.map (xs, value) val {get = func, set = setFunc, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("analyze func name", Func.layout)) val {get = labelInfo, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("analyze label", Label.layout)) val labelArgs = #args o labelInfo val labelValues = #values o labelInfo fun loopArgs args = Vector.map (args, fn (x, t) => let val v = fromType t in setValue (x, v) ; v end) val _ = List.foreach (functions, fn f => let val {args, name, raises, returns, ...} = Function.dest f in setFunc (name, {args = loopArgs args, raises = Option.map (raises, fn ts => Vector.map (ts, fromType)), returns = Option.map (returns, fn ts => Vector.map (ts, fromType))}) end) fun loopTransfer (t: Transfer.t, shouldReturns: 'a vector option, shouldRaises: 'a vector option): unit = (case t of Arith {prim, args, overflow, success, ty} => (coerces ("arith", Vector.new0 (), labelValues overflow) ; coerce {from = primApp {prim = prim, targs = Vector.new0 (), args = values args, resultType = ty, resultVar = NONE}, to = Vector.sub (labelValues success, 0)}) | Bug => () | Call {func = f, args, return, ...} => let val {args = formals, raises, returns} = func f val _ = coerces ("formals", values args, formals) fun noHandler () = case (raises, shouldRaises) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Analyze.loopTransfer: raise mismatch" | (SOME vs, SOME vs') => coerces ("noHandler", vs, vs') datatype z = datatype Return.t in case return of Dead => if isSome returns orelse isSome raises then Error.bug "Analyze.loopTransfer: return mismatch at Dead" else () | NonTail {cont, handler} => (Option.app (returns, fn vs => coerces ("returns", vs, labelValues cont)) ; (case handler of Handler.Caller => noHandler () | Handler.Dead => if isSome raises then Error.bug "Analyze.loopTransfer: raise mismatch at NonTail" else () | Handler.Handle h => let val _ = case raises of NONE => () | SOME vs => coerces ("handle", vs, labelValues h) in () end)) | Tail => let val _ = noHandler () val _ = case (returns, shouldReturns) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Analyze.loopTransfer: return mismatch at Tail" | (SOME vs, SOME vs') => coerces ("tail", vs, vs') in () end end | Case {test, cases, default, ...} => let val test = value test fun ensureNullary j = if 0 = Vector.length (labelValues j) then () else Error.bug (concat ["Analyze.loopTransfer: Case:", Label.toString j, " must be nullary"]) fun doit (s, cs, filter: 'a * 'b -> unit) = (filter (test, s) ; Vector.foreach (cs, fn (_, j) => ensureNullary j)) datatype z = datatype Cases.t val _ = case cases of Con cases => Vector.foreach (cases, fn (c, j) => filter (test, c, labelValues j)) | Word (s, cs) => doit (s, cs, filterWord) val _ = Option.app (default, ensureNullary) in () end | Goto {dst, args} => coerces ("goto", values args, labelValues dst) | Raise xs => (case shouldRaises of NONE => Error.bug "Analyze.loopTransfer: raise mismatch at Raise" | SOME vs => coerces ("raise", values xs, vs)) | Return xs => (case shouldReturns of NONE => Error.bug "Analyze.loopTransfer: return mismatch at Return" | SOME vs => coerces ("return", values xs, vs)) | Runtime {prim, args, return} => let val xts = labelArgs return val (resultVar, resultType) = if 0 = Vector.length xts then (NONE, Type.unit) else let val (x, t) = Vector.sub (xts, 0) in (SOME x, t) end val _ = primApp {prim = prim, targs = Vector.new0 (), args = values args, resultType = resultType, resultVar = resultVar} in () end) val loopTransfer = Trace.trace3 ("Analyze.loopTransfer", Transfer.layout, Option.layout (Vector.layout layout), Option.layout (Vector.layout layout), Layout.ignore) loopTransfer fun loopStatement (Statement.T {var, exp, ty}): unit = let val v = case exp of ConApp {con, args} => conApp {con = con, args = values args} | Const c => const c | PrimApp {prim, targs, args, ...} => primApp {prim = prim, targs = targs, args = values args, resultType = ty, resultVar = var} | Profile _ => unit | Select {tuple, offset} => select {tuple = value tuple, offset = offset, resultType = ty} | Tuple xs => if 1 = Vector.length xs then Error.bug "Analyze.loopStatement: unary tuple" else tuple (values xs) | Var x => value x in Option.app (var, fn var => if useFromTypeOnBinds then let val v' = fromType ty val _ = coerce {from = v, to = v'} val _ = setValue (var, v') in () end else setValue (var, v)) end val loopStatement = Trace.trace ("Analyze.loopStatement", Statement.layout, Unit.layout) loopStatement val _ = coerces ("main", Vector.new0 (), #args (func main)) val _ = Vector.foreach (globals, loopStatement) val _ = List.foreach (functions, fn f => let val {blocks, name, start, ...} = Function.dest f val _ = Vector.foreach (blocks, fn b as Block.T {label, args, ...} => setLabelInfo (label, {args = args, block = b, values = loopArgs args, visited = ref false})) val {returns, raises, ...} = func name fun visit (l: Label.t) = let val {block, visited, ...} = labelInfo l in if !visited then () else let val _ = visited := true val Block.T {statements, transfer, ...} = block in Vector.foreach (statements, loopStatement) ; loopTransfer (transfer, returns, raises) ; Transfer.foreachLabel (transfer, visit) end end val _ = visit start in () end) in {func = func, label = labelValues, value = value} end end mlton-20100608/mlton/ssa/analyze.sig0000644000076600000240000000267711404435623015663 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ANALYZE_STRUCTS = sig include DIRECT_EXP end signature ANALYZE = sig include ANALYZE_STRUCTS val analyze: {coerce: {from: 'a, to: 'a} -> unit, conApp: {args: 'a vector, con: Con.t} -> 'a, const: Const.t -> 'a, filter: 'a * Con.t * 'a vector -> unit, filterWord: 'a * WordSize.t -> unit, fromType: Type.t -> 'a, layout: 'a -> Layout.t, primApp: {args: 'a vector, prim: Type.t Prim.t, resultType: Type.t, resultVar: Var.t option, targs: Type.t vector} -> 'a, program: Program.t, select: {offset: int, resultType: Type.t, tuple: 'a} -> 'a, tuple: 'a vector -> 'a, useFromTypeOnBinds: bool } -> { value: Var.t -> 'a, func: Func.t -> {args: 'a vector, raises: 'a vector option, returns: 'a vector option}, label: Label.t -> 'a vector } end mlton-20100608/mlton/ssa/analyze2.fun0000644000076600000240000003047011404435623015743 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Analyze2 (S: ANALYZE2_STRUCTS): ANALYZE2 = struct open S datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t fun 'a analyze {base, coerce, const, filter, filterWord, fromType, inject, layout, object, primApp, program = Program.T {functions, globals, main, ...}, select, update, useFromTypeOnBinds} = let fun coerces (msg, from, to) = if Vector.length from = Vector.length to then Vector.foreach2 (from, to, fn (from, to) => coerce {from = from, to = to}) else Error.bug (concat ["Analyze2.coerces: length mismatch: ", msg]) val {get = value: Var.t -> 'a, set = setValue, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("analyze var value", Var.layout)) val value = Trace.trace ("Analyze2.value", Var.layout, layout) value fun values xs = Vector.map (xs, value) val {get = func, set = setFunc, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("analyze func name", Func.layout)) val {get = labelInfo, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("analyze label", Label.layout)) val labelArgs = #args o labelInfo val labelValues = #values o labelInfo fun loopArgs args = Vector.map (args, fn (x, t) => let val v = fromType t in setValue (x, v) ; v end) val _ = List.foreach (functions, fn f => let val {args, name, raises, returns, ...} = Function.dest f in setFunc (name, {args = loopArgs args, raises = Option.map (raises, fn ts => Vector.map (ts, fromType)), returns = Option.map (returns, fn ts => Vector.map (ts, fromType))}) end) fun loopTransfer (t: Transfer.t, shouldReturns: 'a vector option, shouldRaises: 'a vector option): unit = (case t of Arith {prim, args, overflow, success, ty} => (coerces ("arith", Vector.new0 (), labelValues overflow) ; coerce {from = primApp {prim = prim, args = values args, resultType = ty, resultVar = NONE}, to = Vector.sub (labelValues success, 0)}) | Bug => () | Call {func = f, args, return, ...} => let val {args = formals, raises, returns} = func f val _ = coerces ("formals", values args, formals) fun noHandler () = case (raises, shouldRaises) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Analyze2.loopTransfer: raise mismatch" | (SOME vs, SOME vs') => coerces ("noHandler", vs, vs') datatype z = datatype Return.t in case return of Dead => if isSome returns orelse isSome raises then Error.bug "Analyze2.loopTransfer: return mismatch at Dead" else () | NonTail {cont, handler} => (Option.app (returns, fn vs => coerces ("returns", vs, labelValues cont)) ; (case handler of Handler.Caller => noHandler () | Handler.Dead => if isSome raises then Error.bug "Analyze2.loopTransfer: raise mismatch at NonTail" else () | Handler.Handle h => let val _ = case raises of NONE => () | SOME vs => coerces ("handle", vs, labelValues h) in () end)) | Tail => let val _ = noHandler () val _ = case (returns, shouldReturns) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Analyze2.loopTransfer: return mismatch at Tail" | (SOME vs, SOME vs') => coerces ("tail", vs, vs') in () end end | Case {test, cases, default, ...} => let val test = value test fun ensureNullary j = if 0 = Vector.length (labelValues j) then () else Error.bug (concat ["Analyze2.loopTransfer: Case:", Label.toString j, " must be nullary"]) fun doit (s, cs, filter: 'a * 'b -> unit) = (filter (test, s) ; Vector.foreach (cs, fn (_, j) => ensureNullary j)) datatype z = datatype Cases.t val _ = case cases of Con cases => Vector.foreach (cases, fn (c, j) => let val v = labelValues j val variant = case Vector.length v of 0 => NONE | 1 => SOME (Vector.sub (v, 0)) | _ => Error.bug "Analyze2.loopTransfer: Case:conApp with >1 arg" in filter {con = c, test = test, variant = variant} end) | Word (s, cs) => doit (s, cs, filterWord) val _ = Option.app (default, ensureNullary) in () end | Goto {dst, args} => coerces ("goto", values args, labelValues dst) | Raise xs => (case shouldRaises of NONE => Error.bug "Analyze2.loopTransfer: raise mismatch at Raise" | SOME vs => coerces ("raise", values xs, vs)) | Return xs => (case shouldReturns of NONE => Error.bug "Analyze2.loopTransfer: return mismatch at Return" | SOME vs => coerces ("return", values xs, vs)) | Runtime {prim, args, return} => let val xts = labelArgs return val (resultVar, resultType) = if 0 = Vector.length xts then (NONE, Type.unit) else let val (x, t) = Vector.sub (xts, 0) in (SOME x, t) end val _ = primApp {prim = prim, args = values args, resultType = resultType, resultVar = resultVar} in () end) val loopTransfer = Trace.trace3 ("Analyze2.loopTransfer", Transfer.layout, Option.layout (Vector.layout layout), Option.layout (Vector.layout layout), Layout.ignore) loopTransfer fun baseValue b = base (Base.map (b, value)) fun loopBind {exp, ty, var}: 'a = case exp of Const c => const c | Inject {sum, variant} => inject {sum = sum, variant = value variant} | Object {args, con} => let val args = case Type.dest ty of Type.Object {args = ts, ...} => Prod.make (Vector.map2 (args, Prod.dest ts, fn (x, {isMutable, ...}) => {elt = value x, isMutable = isMutable})) | _ => Error.bug "Analyze2.loopBind: strange object" in object {args = args, con = con, resultType = ty} end | PrimApp {prim, args, ...} => primApp {prim = prim, args = values args, resultType = ty, resultVar = var} | Select {base, offset} => select {base = baseValue base, offset = offset, resultType = ty} | Var x => value x fun loopStatement (s: Statement.t): unit = (case s of Bind (b as {ty, var, ...}) => let val v = loopBind b in Option.app (var, fn var => if useFromTypeOnBinds then let val v' = fromType ty val _ = coerce {from = v, to = v'} val _ = setValue (var, v') in () end else setValue (var, v)) end | Profile _ => () | Update {base, offset, value = v} => update {base = baseValue base, offset = offset, value = value v}) val loopStatement = Trace.trace ("Analyze2.loopStatement", Statement.layout, Unit.layout) loopStatement val _ = coerces ("main", Vector.new0 (), #args (func main)) val _ = Vector.foreach (globals, loopStatement) val _ = List.foreach (functions, fn f => let val {blocks, name, start, ...} = Function.dest f val _ = Vector.foreach (blocks, fn b as Block.T {label, args, ...} => setLabelInfo (label, {args = args, block = b, values = loopArgs args, visited = ref false})) val {returns, raises, ...} = func name fun visit (l: Label.t) = let val {block, visited, ...} = labelInfo l in if !visited then () else let val _ = visited := true val Block.T {statements, transfer, ...} = block in Vector.foreach (statements, loopStatement) ; loopTransfer (transfer, returns, raises) ; Transfer.foreachLabel (transfer, visit) end end val _ = visit start in () end) in {func = func, label = labelValues, value = value} end end mlton-20100608/mlton/ssa/analyze2.sig0000644000076600000240000000341511404435623015734 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ANALYZE2_STRUCTS = sig include SSA_TREE2 end signature ANALYZE2 = sig include ANALYZE2_STRUCTS val analyze: {base: 'a Base.t -> 'a, coerce: {from: 'a, to: 'a} -> unit, const: Const.t -> 'a, (* In filter, the variant is an 'a option because the targets of Case * branches may ignore the test (by taking 0 args). *) filter: {con: Con.t, test: 'a, variant: 'a option} -> unit, filterWord: 'a * WordSize.t -> unit, fromType: Type.t -> 'a, inject: {sum: Tycon.t, variant: 'a} -> 'a, layout: 'a -> Layout.t, object: {args: 'a Prod.t, con: Con.t option, resultType: Type.t} -> 'a, primApp: {args: 'a vector, prim: Type.t Prim.t, resultType: Type.t, resultVar: Var.t option} -> 'a, program: Program.t, select: {base: 'a, offset: int, resultType: Type.t} -> 'a, update: {base: 'a, offset: int, value: 'a} -> unit, useFromTypeOnBinds: bool} -> {func: Func.t -> {args: 'a vector, raises: 'a vector option, returns: 'a vector option}, label: Label.t -> 'a vector, value: Var.t -> 'a} end mlton-20100608/mlton/ssa/combine-conversions.fun0000644000076600000240000001235011404435623020175 0ustar mtfstaff(* Copyright (C) 2009 Wesley W. Tersptra. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CombineConversions (S: COMBINE_CONVERSIONS_STRUCTS): COMBINE_CONVERSIONS = struct open S (* * This pass looks for and simplifies nested calls to (signed) * extension/truncation. * * It processes each block in dfs order (visiting defs before uses): * If the statement is not a PrimApp Word_extdToWords, skip it. * After processing a conversion, it tags the Var for subsequent * use. * When inspecting a conversion, check if the Var operand is also * the result of a conversion. If it is, try to combine the two * operations. Repeatedly simplify until hitting either a * non-conversion Var or a case where the conversion cannot be * simplified. * * The optimization rules are very simple: * x1 : word = ... * x2 : word = Word_extdToWord (W1, W2, {signed=s1}) x1 * x3 : word = Word_extdToWord (W2, W3, {signed=s2}) x2 * * If W1 = W2, then there is no conversions before x_1. * This is guaranteed because W2 = W3 will always trigger optimization. * * Case W1 <= W3 <= W2: * x3 = Word_extdToWord (W1, W3, {signed=s1}) x1 * Case W1 < W2 < W3 AND (NOT s1 OR s2): * x3 = Word_extdToWord (W1, W3, {signed=s1}) x1 * Case W1 = W2 < W3: * unoptimized * because there are no conversions past W1 and x2 = x1 * * Case W3 <= W2 <= W1: * Case W3 <= W1 <= W2: * x_3 = Word_extdToWord (W1, W3, {signed=_}) x1 * because W3 <= W1 && W3 <= W2, just clip x1 * * Case W2 < W1 <= W3: * Case W2 < W3 <= W1: * unoptimized * because W2 < W1 && W2 < W3, has truncation effect * * Case W1 < W2 < W3 AND s1 AND (NOT s2): * unoptimized * because each conversion affects the result separately *) val { get : Var.t -> ((WordSize.t * WordSize.t * {signed:bool}) * Var.t) option, set, ... } = Property.getSetOnce (Var.plist, Property.initConst NONE) fun rules x3 (conversion as ((W2, W3, {signed=s2}), x2)) = let val { <, <=, ... } = Relation.compare WordSize.compare fun stop () = set (x3, SOME conversion) fun loop ((W1, _, {signed=s1}), x1) = rules x3 ((W1, W3, {signed=s1}), x1) in case get x2 of NONE => stop () | SOME (prev as ((W1, _, {signed=s1}), _)) => if W1 <= W3 andalso W3 <= W2 then loop prev else if W1 < W2 andalso W2 < W3 andalso (not s1 orelse s2) then loop prev else if W3 <= W1 andalso W3 <= W2 then loop prev else (* If W2=W3, we never reach here *) stop () end fun markStatement stmt = case stmt of Statement.T { exp = Exp.PrimApp { args, prim, targs=_ }, ty = _, var = SOME v } => (case Prim.name prim of Prim.Name.Word_extdToWord a => rules v (a, Vector.sub (args, 0)) | _ => ()) | _ => () fun mapStatement stmt = let val Statement.T { exp, ty, var } = stmt val exp = case Option.map (var, get) of SOME (SOME (prim as (W2, W3, _), x2)) => if WordSize.equals (W2, W3) then Exp.Var x2 else Exp.PrimApp { args = Vector.new1 x2, prim = Prim.wordExtdToWord prim, targs = Vector.new0 () } | _ => exp in Statement.T { exp = exp, ty = ty, var = var } end fun combine program = let val Program.T { datatypes, functions, globals, main } = program val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, fn f => let (* Traverse blocks in dfs order, marking their statements *) fun markBlock (Block.T {statements, ... }) = (Vector.foreach (statements, markStatement); fn () => ()) val () = Function.dfs (f, markBlock) (* Map the statements using the marks *) val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f fun mapBlock block = let val Block.T {args, label, statements, transfer} = block in Block.T {args = args, label = label, statements = Vector.map (statements, mapStatement), transfer = transfer} end val f = Function.new {args = args, blocks = Vector.map (blocks, mapBlock), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val f = shrink f in f end) val () = Vector.foreach (globals, Statement.clear) in Program.T { datatypes = datatypes, functions = functions, globals = globals, main = main } end end mlton-20100608/mlton/ssa/combine-conversions.sig0000644000076600000240000000053711404435623020173 0ustar mtfstaff(* Copyright (C) 2009 Wesley W. Tersptra. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature COMBINE_CONVERSIONS_STRUCTS = sig include SHRINK end signature COMBINE_CONVERSIONS = sig include COMBINE_CONVERSIONS_STRUCTS val combine: Program.t -> Program.t end mlton-20100608/mlton/ssa/common-arg.fun0000644000076600000240000002144511404435623016257 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CommonArg (S: COMMON_ARG_STRUCTS): COMMON_ARG = struct open S open Exp Transfer structure Graph = DirectedGraph structure Node = Graph.Node structure VarInfo = struct datatype t = T of {node: unit DirectedGraph.Node.t} fun layout lNode (T {node, ...}) = let open Layout in record [("node", lNode node)] end local fun make f (T r) = f r in val node = make #node end fun new node = T {node = node} end structure NodeInfo = struct datatype t = T of {var: Var.t} local fun make f (T r) = f r in val var = make #var end fun new var = T {var = var} end fun eliminate (Program.T {datatypes, globals, functions, main}) = let val {get = nodeInfo: unit Node.t -> NodeInfo.t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("CommonArg.nodeInfo", Node.layout)) val nodeInfo = Trace.trace ("CommonArg.nodeInfo", Layout.ignore, Layout.ignore) nodeInfo val {get = labelArgs: Label.t -> (Var.t * Type.t) vector, set = setLabelArgs, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("CommonArg.labelArgs", Label.layout)) val labelArgs = Trace.trace ("CommonArg.labelArgs", Layout.ignore, Layout.ignore) labelArgs (* Argument flow graph. *) val G = Graph.new () val root = Graph.newNode G fun newNode (v: Var.t): unit Node.t = let val node = Graph.newNode G val () = setNodeInfo (node, NodeInfo.new v) in node end fun newRootedNode v = let val node = newNode v val _ = Graph.addEdge (G, {from = root, to = node}) in node end val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (VarInfo.new o newRootedNode)) val varInfo = Trace.trace ("CommonArg.varInfo", Layout.ignore, Layout.ignore) varInfo val varNode = VarInfo.node o varInfo (* Analyze *) val () = List.foreach (functions, fn f => let val {blocks, ...} = Function.dest f val () = Vector.foreach (blocks, fn Block.T {label, args, ...} => (setLabelArgs (label, args) ; Vector.foreach (args, fn (v, _) => setVarInfo (v, VarInfo.new (newNode v))))) (* Flow Transfer.Goto arguments. *) fun flowVarVar (v, v'): unit = ignore (Graph.addEdge (G, {from = varNode v, to = varNode v'})) fun flowVarVarTy (v, (v', _)) = flowVarVar (v, v') fun flowVarsVarTys (vs, vts') = Vector.foreach2 (vs, vts', flowVarVarTy) fun flowVarsLabelArgs (vs, l) = flowVarsVarTys (vs, labelArgs l) (* Visit in unknown contexts. *) fun visitVar v = ignore (Graph.addEdge (G, {from = root, to = varNode v})) fun visitVarTy (v, _) = visitVar v fun visitArgs args = Vector.foreach (args, visitVarTy) fun visitLabelArgs l = visitArgs (labelArgs l) in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Arith {overflow, success, ...} => (visitLabelArgs overflow; visitLabelArgs success) | Bug => () | Call {return, ...} => (case return of Return.NonTail {cont, handler} => (visitLabelArgs cont ; (case handler of Handler.Handle hand => visitLabelArgs hand | _ => ())) | _ => ()) | Case {cases, default, ...} => (Cases.foreach (cases, visitLabelArgs) ; Option.app (default, visitLabelArgs)) | Goto {dst, args} => flowVarsLabelArgs (args, dst) | Raise _ => () | Return _ => () | Runtime {return, ...} => visitLabelArgs return) end) val () = Graph.removeDuplicateEdges G val {idom} = Graph.dominators (G, {root = root}) fun getVar (v: Var.t): Var.t = case idom (varNode v) of Graph.Idom parent => if Node.equals (parent, root) then v else NodeInfo.var (nodeInfo parent) | Graph.Unreachable => v | Graph.Root => v fun keepVar v = Var.equals (v, getVar v) (* Diagnostics *) val () = Control.diagnostics (fn display => List.foreach (functions, fn f => let val {blocks, name, ...} = Function.dest f open Layout fun lNode n = record [("idom", case idom n of Graph.Idom parent => if Node.equals (parent, root) then str "root" else Var.layout (NodeInfo.var (nodeInfo parent)) | _ => str "???")] in display (seq [str "\n", Func.layout name]) ; (Vector.foreach (blocks, fn Block.T {args, label, ...} => if Vector.exists (args, not o keepVar o #1) then display (seq [Label.layout label, str " ", Vector.layout (fn (v, _) => seq [Var.layout v, str ": ", VarInfo.layout lNode (varInfo v)]) args]) else ())) end)) (* Transform *) val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, start, raises, returns} = Function.dest f val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let val {yes = args, no = rems} = Vector.partition (args, keepVar o #1) val statements = if Vector.isEmpty rems then statements else Vector.concat [Vector.map (rems, fn (v, ty) => Statement.T {var = SOME v, ty = ty, exp = Var (getVar v)}), statements] val transfer = case transfer of Goto {args, dst} => let val args = Vector.keepAllMap2 (args, labelArgs dst, fn (arg, (v, _)) => if keepVar v then SOME arg else NONE) in Goto {args = args, dst = dst} end | _ => transfer in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, start = start, raises = raises, returns = returns}) end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val () = Program.clearTop program in program end end mlton-20100608/mlton/ssa/common-arg.sig0000644000076600000240000000066311404435623016250 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature COMMON_ARG_STRUCTS = sig include SHRINK end signature COMMON_ARG = sig include COMMON_ARG_STRUCTS val eliminate: Program.t -> Program.t end mlton-20100608/mlton/ssa/common-block.fun0000644000076600000240000001545411404435623016603 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CommonBlock (S: COMMON_BLOCK_STRUCTS): COMMON_BLOCK = struct open S open Exp Transfer fun eliminate (Program.T {globals, datatypes, functions, main}) = let val shrink = shrinkFunction {globals = globals} local fun make transfer = let val l = Label.newNoname () in Block.T {label = l, args = Vector.new0 (), statements = Vector.new0 (), transfer = transfer} end in fun makeRaise var = make (Raise (Vector.new1 var)) fun makeReturn var = make (Return (Vector.new1 var)) fun makeGoto (dst, var) = make (Goto {dst = dst, args = Vector.new1 var}) end fun makeNullaryGoto dst = Goto {dst = dst, args = Vector.new0 ()} val {get = varInfo: Var.t -> {returner: (Func.t * Label.t) option ref, raiser: (Func.t * Label.t) option ref, gotoers: (Func.t * (Label.t * Label.t) list ref) option ref} option, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) val _ = Vector.foreach (globals, fn Statement.T {var, ...} => setVarInfo(valOf var, SOME {returner = ref NONE, raiser = ref NONE, gotoers = ref NONE})) fun eliminateFunction f = let val {args, blocks, mayInline, name, returns, raises, start} = Function.dest f val newBlocks = ref [] local fun common (sel, make) var = case varInfo var of NONE => NONE | SOME varInfo => let val c = sel varInfo fun install () = let val b = make var val l = Block.label b in List.push(newBlocks, b) ; c := SOME (name, l) ; SOME l end in case !c of NONE => install () | SOME (name', l') => if Func.equals(name, name') then SOME l' else install () end in val commonReturner = common (#returner, makeReturn) val commonRaiser = common (#raiser, makeRaise) end fun commonGotoers (k, var) = case varInfo var of NONE => NONE | SOME {gotoers, ...} => let fun install info = let val b = makeGoto (k, var) val l = Block.label b in List.push(newBlocks, b) ; List.push(info, (k, l)) ; SOME l end fun install' () = let val info = ref [] in gotoers := SOME (name, info); install info end in case !gotoers of NONE => install' () | SOME (name', info') => if Func.equals(name, name') then case List.peek (!info', fn (k', _) => Label.equals(k', k)) of NONE => install info' | SOME (_, l') => SOME l' else install' () end val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => let val doit = fn SOME l => makeNullaryGoto l | NONE => transfer val transfer = if Vector.length statements = 0 then case transfer of Goto {dst, args = xs} => if Vector.length xs = 1 then doit (commonGotoers (dst, Vector.sub(xs, 0))) else transfer | Return xs => if Vector.length xs = 1 then doit (commonReturner (Vector.sub(xs, 0))) else transfer | Raise xs => if Vector.length xs = 1 then doit (commonRaiser (Vector.sub (xs, 0))) else transfer | _ => transfer else transfer in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) val blocks = Vector.concat [Vector.fromList (!newBlocks), blocks] in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end val program = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, eliminateFunction), main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/common-block.sig0000644000076600000240000000067111404435623016570 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature COMMON_BLOCK_STRUCTS = sig include SHRINK end signature COMMON_BLOCK = sig include COMMON_BLOCK_STRUCTS val eliminate: Program.t -> Program.t end mlton-20100608/mlton/ssa/common-subexp.fun0000644000076600000240000004032411404435623017011 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CommonSubexp (S: COMMON_SUBEXP_STRUCTS): COMMON_SUBEXP = struct open S open Exp Transfer fun eliminate (Program.T {globals, datatypes, functions, main}) = let (* Keep track of control-flow specific cse's, * arguments, and in-degree of blocks. *) val {get = labelInfo: Label.t -> {add: (Var.t * Exp.t) list ref, args: (Var.t * Type.t) vector, inDeg: int ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) (* Keep track of variables used as overflow variables. *) val {get = overflowVar: Var.t -> bool, set = setOverflowVar, ...} = Property.getSetOnce (Var.plist, Property.initConst false) (* Keep track of the replacements of variables. *) val {get = replace: Var.t -> Var.t option, set = setReplace, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) (* Keep track of the variable that holds the length of arrays (and * vectors and strings). *) val {get = getLength: Var.t -> Var.t option, set = setLength, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) fun canonVar x = case replace x of NONE => x | SOME y => y fun canonVars xs = Vector.map (xs, canonVar) (* Canonicalize an Exp. * Replace vars with their replacements. * Put commutative arguments in canonical order. *) fun canon (e: Exp.t): Exp.t = case e of ConApp {con, args} => ConApp {con = con, args = canonVars args} | Const _ => e | PrimApp {prim, targs, args} => let fun doit args = PrimApp {prim = prim, targs = targs, args = args} val args = canonVars args fun arg i = Vector.sub (args, i) fun canon2 () = let val a0 = arg 0 val a1 = arg 1 in (* What we really want is a total orderning on * variables. Since we don't have one, we just use * the total ordering on hashes, which means that * we may miss a few cse's but we won't be wrong. *) if Var.hash a0 <= Var.hash a1 then (a0, a1) else (a1, a0) end datatype z = datatype Prim.Name.t in if Prim.isCommutative prim then doit (Vector.new2 (canon2 ())) else if (case Prim.name prim of IntInf_add => true | IntInf_andb => true | IntInf_gcd => true | IntInf_mul => true | IntInf_orb => true | IntInf_xorb => true | _ => false) then let val (a0, a1) = canon2 () in doit (Vector.new3 (a0, a1, arg 2)) end else doit args end | Select {tuple, offset} => Select {tuple = canonVar tuple, offset = offset} | Tuple xs => Tuple (canonVars xs) | Var x => Var (canonVar x) | _ => e (* Keep a hash table of canonicalized Exps that are in scope. *) val table: {hash: word, exp: Exp.t, var: Var.t} HashSet.t = HashSet.new {hash = #hash} fun lookup (var, exp, hash) = HashSet.lookupOrInsert (table, hash, fn {exp = exp', ...} => Exp.equals (exp, exp'), fn () => {exp = exp, hash = hash, var = var}) (* All of the globals are in scope, and never go out of scope. *) (* The hash-cons'ing of globals in ConstantPropagation ensures * that each global is unique. *) val _ = Vector.foreach (globals, fn Statement.T {var, exp, ...} => let val exp = canon exp val _ = lookup (valOf var, exp, Exp.hash exp) in () end) fun doitTree tree = let val blocks = ref [] fun loop (Tree.T (Block.T {args, label, statements, transfer}, children)): unit = let fun diag s = Control.diagnostics (fn display => let open Layout in display (seq [Label.layout label, str ": ", str s]) end) val _ = diag "started" val removes = ref [] val {add, ...} = labelInfo label val _ = List.foreach (!add, fn (var, exp) => let val hash = Exp.hash exp val elem as {var = var', ...} = lookup (var, exp, hash) val _ = if Var.equals(var, var') then List.push (removes, elem) else () in () end) val _ = diag "added" val statements = Vector.keepAllMap (statements, fn Statement.T {var, ty, exp} => let val exp = canon exp fun keep () = SOME (Statement.T {var = var, ty = ty, exp = exp}) in case var of NONE => keep () | SOME var => let fun replace var' = (setReplace (var, SOME var'); NONE) fun doit () = let val hash = Exp.hash exp val elem as {var = var', ...} = lookup (var, exp, hash) in if Var.equals(var, var') then (List.push (removes, elem) ; keep ()) else replace var' end in case exp of PrimApp ({args, prim, ...}) => let fun arg () = Vector.sub (args, 0) fun knownLength var' = let val _ = setLength (var, SOME var') in keep () end fun conv () = case getLength (arg ()) of NONE => keep () | SOME var' => knownLength var' fun length () = case getLength (arg ()) of NONE => doit () | SOME var' => replace var' datatype z = datatype Prim.Name.t in case Prim.name prim of Array_array => knownLength (arg ()) | Array_length => length () | Array_toVector => conv () | Vector_length => length () | _ => if Prim.isFunctional prim then doit () else keep () end | _ => doit () end end) val _ = diag "statements" val transfer = Transfer.replaceVar (transfer, canonVar) val transfer = case transfer of Arith {prim, args, overflow, success, ...} => let val {args = succArgs, inDeg = succInDeg, add = succAdd, ...} = labelInfo success val {inDeg = overInDeg, add = overAdd, ...} = labelInfo overflow val exp = canon (PrimApp {prim = prim, targs = Vector.new0 (), args = args}) val hash = Exp.hash exp in case HashSet.peek (table, hash, fn {exp = exp', ...} => Exp.equals (exp, exp')) of SOME {var, ...} => if overflowVar var then Goto {dst = overflow, args = Vector.new0 ()} else (if !succInDeg = 1 then let val (var', _) = Vector.sub (succArgs, 0) in setReplace (var', SOME var) end else () ; Goto {dst = success, args = Vector.new1 var}) | NONE => (if !succInDeg = 1 then let val (var, _) = Vector.sub (succArgs, 0) in List.push (succAdd, (var, exp)) end else () ; if !overInDeg = 1 then let val var = Var.newNoname () val _ = setOverflowVar (var, true) in List.push (overAdd, (var, exp)) end else () ; transfer) end | Goto {dst, args} => let val {args = args', inDeg, ...} = labelInfo dst in if !inDeg = 1 then (Vector.foreach2 (args, args', fn (var, (var', _)) => setReplace (var', SOME var)) ; transfer) else transfer end | _ => transfer val _ = diag "transfer" val block = Block.T {args = args, label = label, statements = statements, transfer = transfer} in List.push (blocks, block) ; Vector.foreach (children, loop) ; diag "children"; Control.diagnostics (fn display => let open Layout in display (seq [str "removes: ", List.layout (fn {var,exp,...} => seq [Var.layout var, str ": ", Exp.layout exp]) (!removes)]) end); List.foreach (!removes, fn {var, exp, hash} => HashSet.remove (table, hash, fn {var = var', exp = exp', ...} => Var.equals (var, var') andalso Exp.equals (exp, exp'))); diag "removed" end val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "starting loop"]) end) val _ = loop tree val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "finished loop"]) end) in Vector.fromList (!blocks) end val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Vector.foreach (blocks, fn Block.T {label, args, ...} => (setLabelInfo (label, {add = ref [], args = args, inDeg = ref 0}))) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, fn label' => Int.inc (#inDeg (labelInfo label')))) val blocks = doitTree (Function.dominatorTree f) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/common-subexp.sig0000644000076600000240000000067411404435623017007 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature COMMON_SUBEXP_STRUCTS = sig include SHRINK end signature COMMON_SUBEXP = sig include COMMON_SUBEXP_STRUCTS val eliminate: Program.t -> Program.t end mlton-20100608/mlton/ssa/constant-propagation.fun0000644000076600000240000011415211404435623020370 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * Invariant: Created globals only refer to other globals. * Hence, the newly created globals may appear at the * beginning of the program. * * Circular abstract values can arise as a result of programs like: * datatype t = T of t * fun f () = T (f ()) * val _ = f () * There is special code in printing abstract values and in determining whether * they are global in order to avoid infinite loops. *) functor ConstantPropagation (S: CONSTANT_PROPAGATION_STRUCTS) : CONSTANT_PROPAGATION = struct open S structure Multi = Multi (S) structure Global = Global (S) structure Type = struct open Type fun isSmall t = case dest t of Array _ => false | Datatype _ => false | Ref t => isSmall t | Tuple ts => Vector.forall (ts, isSmall) | Vector _ => false | _ => true end structure Sconst = Const open Exp Transfer structure Value = struct datatype global = NotComputed | No | Yes of Var.t structure Const = struct datatype t = T of {const: const ref, coercedTo: t list ref} and const = Const of Const.t | Undefined (* no possible value *) | Unknown (* many possible values *) fun layout (T {const, ...}) = layoutConst (!const) and layoutConst c = let open Layout in case c of Const c => Const.layout c | Undefined => str "undefined constant" | Unknown => str "unknown constant" end fun new c = T {const = ref c, coercedTo = ref []} fun equals (T {const = r, ...}, T {const = r', ...}) = r = r' val equals = Trace.trace2 ("ConstantPropagation.Value.Const.equals", layout, layout, Bool.layout) equals val const = new o Const fun undefined () = new Undefined fun unknown () = new Unknown fun makeUnknown (T {const, coercedTo}): unit = case !const of Unknown => () | _ => (const := Unknown ; List.foreach (!coercedTo, makeUnknown) ; coercedTo := []) val makeUnknown = Trace.trace ("ConstantPropagation.Value.Const.makeUnknown", layout, Unit.layout) makeUnknown fun send (c: t, c': const): unit = let fun loop (c as T {const, coercedTo}) = case (c', !const) of (_, Unknown) => () | (_, Undefined) => (const := c' ; List.foreach (!coercedTo, loop)) | (Const c', Const c'') => if Const.equals (c', c'') then () else makeUnknown c | _ => makeUnknown c in loop c end val send = Trace.trace2 ("ConstantPropagation.Value.Const.send", layout, layoutConst, Unit.layout) send fun coerce {from = from as T {const, coercedTo}, to: t}: unit = if equals (from, to) then () else let fun push () = List.push (coercedTo, to) in case !const of c as Const _ => (push (); send (to, c)) | Undefined => push () | Unknown => makeUnknown to end val coerce = Trace.trace ("ConstantPropagation.Value.Const.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) coerce fun unify (c, c') = (coerce {from = c, to = c'} ; coerce {from = c', to = c}) val unify = Trace.trace2 ("ConstantPropagation.Value.Const.unify", layout, layout, Unit.layout) unify end structure One = struct datatype 'a t = T of {extra: 'a, global: Var.t option ref} local fun make f (T r) = f r in val global = fn z => make #global z end fun layout (one: 'a t): Layout.t = Layout.record [("global", Option.layout Var.layout (! (global one)))] fun new (a: 'a): 'a t = T {extra = a, global = ref NONE} val equals: 'a t * 'a t -> bool = fn (n, n') => global n = global n' end structure Place = struct datatype 'a t = One of 'a One.t | Undefined | Unknown val toString = fn One _ => "One" | Undefined => "Undefined" | Unknown => "Unknown" fun layout b = Layout.str (toString b) end structure Birth = struct datatype 'a t = T of {coercedTo: 'a t list ref, place: 'a Place.t ref} fun layout (T {place, ...}) = Place.layout (!place) fun equals (T {place = r, ...}, T {place = r', ...}) = r = r' fun new p = T {place = ref p, coercedTo = ref []} fun undefined (): 'a t = new Place.Undefined fun unknown (): 'a t = new Place.Unknown fun here (a: 'a): 'a t = new (Place.One (One.new a)) val traceMakeUnknown = Trace.info "ConstantPropagation.Value.Birth.makeUnknown" fun makeUnknown arg = Trace.traceInfo' (traceMakeUnknown, layout, Unit.layout) (fn T {place, coercedTo, ...} => case !place of Place.Unknown => () | _ => (place := Place.Unknown ; List.foreach (!coercedTo, makeUnknown) ; coercedTo := [])) arg val traceSend = Trace.info "ConstantPropagation.Value.Birth.send" fun send arg = Trace.traceInfo' (traceSend, Layout.tuple2 (layout, One.layout), Unit.layout) (fn (b, one) => let fun loop (b as T {place, coercedTo, ...}) = case !place of Place.Undefined => (place := Place.One one ; List.foreach (!coercedTo, loop)) | Place.One one' => if One.equals (one, one') then () else makeUnknown b | Place.Unknown => () in loop b end) arg val traceCoerce = Trace.info "ConstantPropagation.Value.Birth.coerce" fun coerce arg = Trace.traceInfo' (traceCoerce, fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) (fn {from = from as T {place, coercedTo, ...}, to} => if equals (from, to) then () else let fun push () = List.push (coercedTo, to) in case !place of Place.Unknown => makeUnknown to | Place.One one => (push (); send (to, one)) | Place.Undefined => push () end) arg val traceUnify = Trace.info "ConstantPropagation.Value.Birth.unify" fun unify arg = Trace.traceInfo' (traceUnify, Layout.tuple2 (layout, layout), Unit.layout) (fn (c, c') => (coerce {from = c, to = c'} ; coerce {from = c', to = c})) arg end structure Set = DisjointSet structure Unique = UniqueId () datatype t = T of {global: global ref, ty: Type.t, value: value} Set.t and value = Array of {birth: unit Birth.t, elt: t, length: t} | Const of Const.t | Datatype of data | Ref of {arg: t, birth: {init: t} Birth.t} | Tuple of t vector | Vector of {elt: t, length: t} | Weak of t and data = Data of {coercedTo: data list ref, filters: {args: t vector, con: Con.t} list ref, value: dataVal ref} and dataVal = ConApp of {args: t vector, con: Con.t, uniq: Unique.t} | Undefined | Unknown local fun make sel (T s) = sel (Set.! s) in val value = make #value val ty = make #ty end local open Layout in fun layout v = case value v of Array {birth, elt, length, ...} => seq [str "array", tuple [Birth.layout birth, layout length, layout elt]] | Const c => Const.layout c | Datatype d => layoutData d | Ref {arg, birth, ...} => seq [str "ref ", tuple [layout arg, Birth.layout birth]] | Tuple vs => Vector.layout layout vs | Vector {elt, length, ...} => seq [str "vector ", tuple [layout elt, layout length]] | Weak v => seq [str "weak ", layout v] and layoutData (Data {value, ...}) = case !value of Undefined => str "undefined datatype" | ConApp {con, uniq, ...} => record [("con", Con.layout con), ("uniq", Unique.layout uniq)] (* Can't layout the args because there may be a circularity *) | Unknown => str "unknown datatype" end fun equals (T s, T s') = Set.equals (s, s') val equals = Trace.trace2 ("ConstantPropagation.Value.equals", layout, layout, Bool.layout) equals val globalsInfo = Trace.info "ConstantPropagation.Value.globals" val globalInfo = Trace.info "ConstantPropagation.Value.global" fun globals arg: (Var.t * Type.t) vector option = Trace.traceInfo (globalsInfo, (Vector.layout layout) o #1, Option.layout (Vector.layout (Layout.tuple2 (Var.layout, Type.layout))), Trace.assertTrue) (fn (vs: t vector, newGlobal) => Exn.withEscape (fn escape => SOME (Vector.map (vs, fn v => case global (v, newGlobal) of NONE => escape NONE | SOME g => g)))) arg and global arg: (Var.t * Type.t) option = Trace.traceInfo (globalInfo, layout o #1, Option.layout (Var.layout o #1), Trace.assertTrue) (fn (v as T s, newGlobal) => let val {global = r, ty, value} = Set.! s in case !r of No => NONE | Yes g => SOME (g, ty) | NotComputed => let (* avoid globalizing circular abstract values *) val _ = r := No fun yes e = Yes (newGlobal (ty, e)) fun unary (Birth.T {place, ...}, makeInit: 'a -> t, primApp: {targs: Type.t vector, args: Var.t vector} -> Exp.t, targ: Type.t) = case !place of Place.One (One.T {global = glob, extra, ...}) => let val init = makeInit extra in case global (init, newGlobal) of SOME (x, _) => Yes (case !glob of NONE => let val exp = primApp {targs = Vector.new1 targ, args = Vector.new1 x} val g = newGlobal (ty, exp) in glob := SOME g; g end | SOME g => g) | _ => No end | _ => No val g = case value of Array {birth, length, ...} => unary (birth, fn _ => length, fn {args, targs} => Exp.PrimApp {args = args, prim = Prim.array, targs = targs}, Type.deArray ty) | Const (Const.T {const, ...}) => (case !const of Const.Const c => yes (Exp.Const c) | _ => No) | Datatype (Data {value, ...}) => (case !value of ConApp {args, con, ...} => (case globals (args, newGlobal) of NONE => No | SOME args => yes (Exp.ConApp {con = con, args = Vector.map (args, #1)})) | _ => No) | Ref {birth, ...} => unary (birth, fn {init} => init, fn {args, targs} => Exp.PrimApp {args = args, prim = Prim.reff, targs = targs}, Type.deRef ty) | Tuple vs => (case globals (vs, newGlobal) of NONE => No | SOME xts => yes (Exp.Tuple (Vector.map (xts, #1)))) | Vector _ => No | Weak _ => No val _ = r := g in global (v, newGlobal) end end) arg fun new (v: value, ty: Type.t): t = T (Set.singleton {value = v, ty = ty, global = ref NotComputed}) fun tuple vs = new (Tuple vs, Type.tuple (Vector.map (vs, ty))) fun const' (c, ty) = new (Const c, ty) fun const c = let val c' = Const.const c in new (Const c', Type.ofConst c) end val zero = WordSize.memoize (fn s => const (S.Const.word (WordX.zero s))) fun constToEltLength (c, err) = let val v = case c of Sconst.WordVector v => v | _ => Error.bug err val length = WordXVector.length v val eltTy = Type.word (WordXVector.elementSize v) val elt = if 0 = length then const' (Const.unknown (), eltTy) else let val w = WordXVector.sub (v, 0) in if WordXVector.forall (v, fn w' => WordX.equals (w, w')) then const (Sconst.word w) else const' (Const.unknown (), eltTy) end val length = const (Sconst.Word (WordX.fromIntInf (IntInf.fromInt length, WordSize.seqIndex ()))) in {elt = elt, length = length} end local fun make (err, sel) v = case value v of Vector fs => sel fs | Const (Const.T {const = ref (Const.Const c), ...}) => sel (constToEltLength (c, err)) | _ => Error.bug err in val devector = make ("ConstantPropagation.Value.devector", #elt) val vectorLength = make ("ConstantPropagation.Value.vectorLength", #length) end local fun make (err, sel) v = case value v of Array fs => sel fs | _ => Error.bug err in val dearray = make ("ConstantPropagation.Value.dearray", #elt) val arrayLength = make ("ConstantPropagation.Value.arrayLength", #length) val arrayBirth = make ("ConstantPropagation.Value.arrayBirth", #birth) end fun vectorFromArray (T s: t): t = let val {value, ty, ...} = Set.! s in case value of Array {elt, length, ...} => new (Vector {elt = elt, length = length}, ty) | _ => Error.bug "ConstantPropagation.Value.vectorFromArray" end local fun make (err, sel) v = case value v of Ref fs => sel fs | _ => Error.bug err in val deref = make ("ConstantPropagation.Value.deref", #arg) val refBirth = make ("ConstantPropagation.Value.refBirth", #birth) end fun deweak v = case value v of Weak v => v | _ => Error.bug "ConstantPropagation.Value.deweak" structure Data = struct datatype t = datatype data val layout = layoutData local fun make v () = Data {value = ref v, coercedTo = ref [], filters = ref []} in val undefined = make Undefined val unknown = make Unknown end end local (* The extra birth is because of let-style polymorphism. * arrayBirth is really the same as refBirth. *) fun make (const, data, refBirth, arrayBirth) = let fun loop (t: Type.t): t = new (case Type.dest t of Type.Array t => Array {birth = arrayBirth (), elt = loop t, length = loop (Type.word (WordSize.seqIndex ()))} | Type.Datatype _ => Datatype (data ()) | Type.Ref t => Ref {arg = loop t, birth = refBirth ()} | Type.Tuple ts => Tuple (Vector.map (ts, loop)) | Type.Vector t => Vector {elt = loop t, length = loop (Type.word (WordSize.seqIndex ()))} | Type.Weak t => Weak (loop t) | _ => Const (const ()), t) in loop end in val fromType = make (Const.undefined, Data.undefined, Birth.undefined, Birth.undefined) val unknown = make (Const.unknown, Data.unknown, Birth.unknown, Birth.unknown) end fun select {tuple, offset, resultType = _} = case value tuple of Tuple vs => Vector.sub (vs, offset) | _ => Error.bug "ConstantPropagation.Value.select: non-tuple" fun unit () = tuple (Vector.new0 ()) end val traceSendConApp = Trace.trace2 ("ConstantPropagation.sendConApp", Value.Data.layout, fn {con, args, uniq} => Layout.record [("con", Con.layout con), ("args", Vector.layout Value.layout args), ("uniq", Value.Unique.layout uniq)], Unit.layout) val traceSendConAppLoop = Trace.trace ("ConstantPropagation.sendConAppLoop", Value.Data.layout, Unit.layout) val traceMakeDataUnknown = Trace.trace ("ConstantPropagation.makeDataUnknown", Value.Data.layout, Unit.layout) (* ------------------------------------------------- *) (* simplify *) (* ------------------------------------------------- *) fun simplify (program: Program.t): Program.t = let val program as Program.T {datatypes, globals, functions, main} = eliminateDeadBlocks program val {varIsMultiDefed, ...} = Multi.multi program val once = not o varIsMultiDefed val {get = conInfo: Con.t -> {result: Type.t, types: Type.t vector, values: Value.t vector}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("conInfo", Con.layout)) val conValues = #values o conInfo val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val result = Type.datatypee tycon in Vector.foreach (cons, fn {con, args} => setConInfo (con, {result = result, types = args, values = Vector.map (args, Value.fromType)})) end) local open Value in val traceCoerce = Trace.trace ("ConstantPropagation.Value.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) fun makeDataUnknown arg: unit = traceMakeDataUnknown (fn Data {value, coercedTo, filters, ...} => let fun doit () = (value := Unknown ; List.foreach (!coercedTo, makeDataUnknown) ; coercedTo := [] ; (List.foreach (!filters, fn {con, args} => coerces {froms = conValues con, tos = args}))) in case !value of ConApp _ => doit () | Undefined => doit () | Unknown => () end) arg and sendConApp arg: unit = traceSendConApp (fn (d: data, ca as {con, args, uniq}) => let val v = ConApp ca fun loop arg: unit = traceSendConAppLoop (fn Data {value, coercedTo, filters, ...} => case !value of Unknown => () | Undefined => (value := v ; List.foreach (!coercedTo, loop) ; (List.foreach (!filters, fn {con = con', args = args'} => if Con.equals (con, con') then coerces {froms = args, tos = args'} else ()))) | ConApp {con = con', uniq = uniq', ...} => if Unique.equals (uniq, uniq') orelse (Con.equals (con, con') andalso 0 = Vector.length args) then () else makeDataUnknown d) arg in loop d end) arg and coerces {froms: Value.t vector, tos: Value.t vector} = Vector.foreach2 (froms, tos, fn (from, to) => coerce {from = from, to = to}) and coerce arg = traceCoerce (fn {from, to} => if equals (from, to) then () else let fun error () = Error.bug (concat ["ConstantPropagation.Value.coerce: strange: from: ", Layout.toString (Value.layout from), " to: ", Layout.toString (Value.layout to)]) in case (value from, value to) of (Const from, Const to) => Const.coerce {from = from, to = to} | (Datatype from, Datatype to) => coerceData {from = from, to = to} | (Ref {birth, arg}, Ref {birth = b', arg = a'}) => (Birth.coerce {from = birth, to = b'} ; unify (arg, a')) | (Array {birth = b, length = n, elt = x}, Array {birth = b', length = n', elt = x'}) => (Birth.coerce {from = b, to = b'} ; coerce {from = n, to = n'} ; unify (x, x')) | (Vector {length = n, elt = x}, Vector {length = n', elt = x'}) => (coerce {from = n, to = n'} ; coerce {from = x, to = x'}) | (Tuple vs, Tuple vs') => coerces {froms = vs, tos = vs'} | (Weak v, Weak v') => unify (v, v') | (Const (Const.T {const = ref (Const.Const c), ...}), Vector {elt, length}) => let val {elt = elt', length = length'} = Value.constToEltLength (c, "coerce") in coerce {from = elt', to = elt} ; coerce {from = length', to = length} end | (_, _) => error () end) arg and unify (T s: t, T s': t): unit = if Set.equals (s, s') then () else let val {value, ...} = Set.! s val {value = value', ...} = Set.! s' in Set.union (s, s') ; case (value, value') of (Const c, Const c') => Const.unify (c, c') | (Datatype d, Datatype d') => unifyData (d, d') | (Ref {birth, arg}, Ref {birth = b', arg = a'}) => (Birth.unify (birth, b') ; unify (arg, a')) | (Array {birth = b, length = n, elt = x}, Array {birth = b', length = n', elt = x'}) => (Birth.unify (b, b') ; unify (n, n') ; unify (x, x')) | (Vector {length = n, elt = x}, Vector {length = n', elt = x'}) => (unify (n, n') ; unify (x, x')) | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', unify) | (Weak v, Weak v') => unify (v, v') | _ => Error.bug "ConstantPropagation.Value.unify: strange" end and unifyData (d, d') = (coerceData {from = d, to = d'} ; coerceData {from = d', to = d}) and coerceData {from = Data {value, coercedTo, ...}, to} = case !value of ConApp ca => (List.push (coercedTo, to) ; sendConApp (to, ca)) | Undefined => List.push (coercedTo, to) | Unknown => makeDataUnknown to fun conApp {con: Con.t, args: t vector}: t = let val {values = tos, result, ...} = conInfo con in coerces {froms = args, tos = tos} ; new (Datatype (Data {value = ref (ConApp {con = con, args = args, uniq = Unique.new ()}), coercedTo = ref [], filters = ref []}), result) end fun makeUnknown (v: t): unit = case value v of Array {length, elt, ...} => (makeUnknown length ; makeUnknown elt) | Const c => Const.makeUnknown c | Datatype d => makeDataUnknown d | Ref {arg, ...} => makeUnknown arg | Tuple vs => Vector.foreach (vs, makeUnknown) | Vector {length, elt} => (makeUnknown length ; makeUnknown elt) | Weak v => makeUnknown v fun sideEffect (v: t): unit = case value v of Array {elt, ...} => makeUnknown elt | Const _ => () | Datatype _ => () | Ref {arg, ...} => makeUnknown arg | Vector {elt, ...} => makeUnknown elt | Tuple vs => Vector.foreach (vs, sideEffect) | Weak v => makeUnknown v fun primApp {prim, targs = _, args: Value.t vector, resultVar, resultType}: t = let fun bear z = case resultVar of SOME resultVar => if once resultVar andalso Type.isSmall resultType then Birth.here z else Birth.unknown () | _ => Error.bug "ConstantPropagation.Value.primApp.bear" fun update (a, v) = (coerce {from = v, to = dearray a} ; unit ()) fun arg i = Vector.sub (args, i) datatype z = datatype Prim.Name.t fun array (length, birth) = let val a = fromType resultType val _ = coerce {from = length, to = arrayLength a} val _ = Birth.coerce {from = birth, to = arrayBirth a} in a end in case Prim.name prim of Array_array => array (arg 0, bear ()) | Array_array0Const => array (zero (WordSize.seqIndex ()), Birth.here ()) | Array_length => arrayLength (arg 0) | Array_sub => dearray (arg 0) | Array_toVector => vectorFromArray (arg 0) | Array_update => update (arg 0, arg 2) | Ref_assign => (coerce {from = arg 1, to = deref (arg 0)}; unit ()) | Ref_deref => deref (arg 0) | Ref_ref => let val v = arg 0 val r = fromType resultType val _ = coerce {from = v, to = deref r} val _ = Birth.coerce {from = bear {init = v}, to = refBirth r} in r end | Vector_length => vectorLength (arg 0) | Vector_sub => devector (arg 0) | Weak_get => deweak (arg 0) | Weak_new => let val w = fromType resultType val _ = coerce {from = arg 0, to = deweak w} in w end | _ => (if Prim.maySideEffect prim then Vector.foreach (args, sideEffect) else () ; unknown resultType) end fun filter (variant, con, args) = case value variant of Datatype (Data {value, filters, ...}) => let fun save () = List.push (filters, {con = con, args = args}) in case !value of Undefined => save () | Unknown => coerces {froms = conValues con, tos = args} | ConApp {con = con', args = args', ...} => ((* The save () has to happen before the coerces because * they may loop back and change the variant, which * would need to then change this value. *) save () ; if Con.equals (con, con') then coerces {froms = args', tos = args} else ()) end | _ => Error.bug "ConstantPropagation.Value.filter: non-datatype" end fun filterIgnore _ = () val {value, ...} = Control.trace (Control.Detail, "fixed point") analyze { coerce = coerce, conApp = conApp, const = Value.const, filter = filter, filterWord = filterIgnore, fromType = Value.fromType, layout = Value.layout, primApp = primApp, program = program, select = Value.select, tuple = Value.tuple, useFromTypeOnBinds = false } val _ = Control.diagnostics (fn display => let open Layout in display (str "\n\nConstructors:") ; (Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (display (seq [Tycon.layout tycon, str ": "]) ; Vector.foreach (cons, fn {con, ...} => display (seq [Con.layout con, str ": ", Vector.layout Value.layout (conValues con)]))))) ; display (str "\n\nConstants:") ; (Program.foreachVar (program, fn (x, _) => display (seq [Var.layout x, str " ", Value.layout (value x)]))) end) (* Walk through the program * - removing declarations whose rhs is constant * - replacing variables whose value is constant with globals * - building up the global decs *) val {new = newGlobal, all = allGlobals} = Global.make () fun replaceVar x = case Value.global (value x, newGlobal) of NONE => x | SOME (g, _) => g fun doitStatement (Statement.T {var, ty, exp}) = let fun keep () = SOME (Statement.T {var = var, ty = ty, exp = Exp.replaceVar (exp, replaceVar)}) in case var of NONE => keep () | SOME var => (case (Value.global (value var, newGlobal), exp) of (NONE, _) => keep () | (SOME _, PrimApp {prim, ...}) => if Prim.maySideEffect prim then keep () else NONE | _ => NONE) end fun doitTransfer transfer = Transfer.replaceVar (transfer, replaceVar) fun doitBlock (Block.T {label, args, statements, transfer}) = Block.T {label = label, args = args, statements = Vector.keepAllMap (statements, doitStatement), transfer = doitTransfer transfer} fun doitFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f in Function.new {args = args, blocks = Vector.map (blocks, doitBlock), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val functions = List.revMap (functions, doitFunction) val globals = Vector.keepAllMap (globals, doitStatement) val globals = Vector.concat [allGlobals (), globals] val shrink = shrinkFunction {globals = globals} val program = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, shrink), main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/constant-propagation.sig0000644000076600000240000000072011404435623020355 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONSTANT_PROPAGATION_STRUCTS = sig include SHRINK end signature CONSTANT_PROPAGATION = sig include CONSTANT_PROPAGATION_STRUCTS val simplify: Program.t -> Program.t end mlton-20100608/mlton/ssa/contify.fun0000644000076600000240000007562111404435623015700 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * This pass is based on * Contification Using Dominators, by Fluet and Weeks. ICFP 2001. *) functor Contify (S: CONTIFY_STRUCTS): CONTIFY = struct open S open Transfer structure Cont = struct type t = {cont: Label.t, handler: Handler.t} fun layout {cont, handler} = let open Layout in tuple2 (Label.layout, Handler.layout) (cont, handler) end end (* Return = {Uncalled, Unknown} U Cont U Func *) structure Areturn = struct datatype t = Uncalled | Unknown | Cont of Cont.t | Func of Func.t fun layout r = let open Layout in case r of Uncalled => str "Uncalled" | Unknown => str "Unknown" | Cont c => Cont.layout c | Func f => Func.layout f end end structure ContData = struct datatype t = T of {node: unit DirectedGraph.Node.t option ref, rootEdge: bool ref, prefixes: Func.t list ref} fun new () = T {node = ref NONE, rootEdge = ref false, prefixes = ref []} local fun make s = let fun S' (T r) = s r val S = ! o S' in (S', S) end in val (node', _) = make #node val (rootEdge', _) = make #rootEdge val (prefixes', prefixes) = make #prefixes end fun nodeReset (T {node, ...}) = node := NONE end structure FuncData = struct datatype t = T of {node: unit DirectedGraph.Node.t option ref, reach: bool ref, callers: {nontail: (Func.t * Cont.t) list ref, tail: Func.t list ref}, callees: {nontail: (Func.t * Cont.t) list ref, tail: Func.t list ref}, A: Areturn.t ref, prefixes: Func.t list ref, finished: bool ref, replace: {label: Label.t, blocks: Block.t list} option ref, contified: Block.t list list ref} fun new () = T {node = ref NONE, reach = ref false, callers = {nontail = ref [], tail = ref []}, callees = {nontail = ref [], tail = ref []}, A = ref Areturn.Uncalled, prefixes = ref [], finished = ref false, replace = ref NONE, contified = ref []} local fun make s = let fun S' (T r) = s r val S = ! o S' in (S', S) end fun make' s = let fun S' (T r) = s r in S' end in val (node', _) = make #node val (reach', reach) = make #reach val callers' = make' #callers val callees' = make' #callees val (_, A) = make #A val (prefixes', prefixes) = make #prefixes val (finished', _) = make #finished val (_, replace) = make #replace val (contified', contified) = make #contified end fun nodeReset (T {node, ...}) = node := NONE end structure ContFuncGraph = struct structure Graph = DirectedGraph structure Node = Graph.Node datatype t = ContNode of Cont.t | FuncNode of Func.t fun newContFuncGraph {getContData: Cont.t -> ContData.t, getFuncData: Func.t -> FuncData.t} = let val G = Graph.new () fun addEdge edge = ignore (Graph.addEdge (G, edge)) val {get = getNodeInfo : unit Node.t -> t, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeInfo", Node.layout)) fun getFuncNode f = let val node = FuncData.node' (getFuncData f) in case !node of SOME n => n | NONE => let val n = Graph.newNode G in setNodeInfo (n, FuncNode f); node := SOME n; n end end fun getContNode c = let val node = ContData.node' (getContData c) in case !node of SOME n => n | NONE => let val n = Graph.newNode G in setNodeInfo (n, ContNode c); node := SOME n; n end end fun reset p = Graph.foreachNode (G, fn n => if p n then case getNodeInfo n of ContNode c => ContData.nodeReset (getContData c) | FuncNode f => FuncData.nodeReset (getFuncData f) else ()) in {G = G, addEdge = addEdge, getNodeInfo = getNodeInfo, getContNode = getContNode, getFuncNode = getFuncNode, reset = reset} end fun newFuncGraph {getFuncData: Func.t -> FuncData.t} = let val {G, addEdge, getNodeInfo, getFuncNode, reset, ...} = newContFuncGraph {getContData = fn _ => Error.bug "Contify.ContFuncGraph.newFuncGraph", getFuncData = getFuncData} in {G = G, addEdge = addEdge, getNodeInfo = fn n => case getNodeInfo n of FuncNode f => f | ContNode _ => Error.bug "Contify.ContFuncGraph.newFuncGraph", getFuncNode = getFuncNode, reset = reset} end end structure InitReachCallersCallees = struct structure Graph = DirectedGraph structure DfsParam = Graph.DfsParam (* Define Reach: Func -> Bool as follows: * Reach (f) iff there is a path of calls from fm to f. * * Define NontailCallers: Func -> P (Func x Cont) as follows: * NontailCallers (f) = {(g, c) | (g, f, c) in N} * Define TailCallers: Func -> P (Func) as follows: * Callers (f) = {g | (g, f) in T} * Define NontailCallees: Func -> P (Func x Cont) as follows: * NontailCallers (f) = {(g, c) | (f, g, c) in N} * Define TailCallees: Func -> P (Func) as follows: * Callers (f) = {g | (f, g) in T} * * Precondition: forall f in Func. (FuncData.node o getFuncData) f = NONE * forall f in Func. (FuncData.callers o getFuncData) f * = {nontail = [], tail = []} * forall f in Func. (FuncData.callees o getFuncData) f * = {nontail = [], tail = []} * Postcondition: FuncData.reach o getFuncData = Reach * #nontail (FuncData.callers o getFuncData) * = NontailCallers * #tail (FuncData.callers o getFuncData) * = TailCallers * #nontail (FuncData.callees o getFuncData) * = NontailCallees * #tail (FuncData.callees o getFuncData) * = TailCallees *) fun initReachCallersCallees {program = Program.T {functions, main = fm, ...}, getFuncData: Func.t -> FuncData.t} : unit = let val {G, addEdge, getNodeInfo, getFuncNode, reset, ...} = ContFuncGraph.newFuncGraph {getFuncData = getFuncData} val _ = List.foreach (functions, fn func => let val {name = f, blocks, ...} = Function.dest func val callees = FuncData.callees' (getFuncData f) val f_node = getFuncNode f in Vector.foreach (blocks, fn Block.T {transfer = Call {func = g, return, ...}, ...} => let val callers = FuncData.callers' (getFuncData g) val g_node = getFuncNode g val _ = case return of Return.NonTail c => (List.push (#nontail callees, (g, c)); List.push (#nontail callers, (f, c))) | _ => (List.push (#tail callees, g); List.push (#tail callers, f)) in addEdge {from = f_node, to = g_node} end | _ => ()) end) val dfs_param = DfsParam.finishNode (fn n => FuncData.reach' (getFuncData (getNodeInfo n)) := true) val fm_node = getFuncNode fm in Graph.dfsNodes (G, [fm_node], dfs_param); reset (fn _ => true) end val initReachCallersCallees = Control.trace (Control.Detail, "initReachCallerCallees") initReachCallersCallees end structure AnalyzeDom = struct structure Graph = DirectedGraph structure Node = Graph.Node (* Now define a directed graph G = (Node, Edge) where * Node = Cont U Fun U {Root} * Edge = {(Root, fm)} * U {(Root, c) | c in Cont} * U {(Root, f) | not (Reach (f))} * U {(f, g) | (f, g) in T and Reach (f)} * U {(c, g) | (f, g, c) in N and Reach (f)} * * Let D be the dominator tree of G rooted at Root. * For f in Fun, let idom (f) be the parent of f in D. * * Define an analysis, A_Dom, based on D as follows: * A_Dom (f) = * if idom (f) = Root * then if Reach (f) then Unknown else Uncalled * else the ancestor g of f in D such that idom (g) = Root * * Precondition: forall c in Cont. (ContData.node o getContData) c = NONE * forall c in Cont. (ContData.rootEdge o getContData) c = false * forall f in Func. (FuncData.node o getFuncData) f = NONE * forall f in Func. (FuncData.reach o getFuncData) f = Reach * Postcondition: FuncData.ADom o getFuncData = A_Dom * forall c in Cont. (ContData.node o getContData) c = NONE * forall f in Func. (FuncData.node o getFuncData) f = NONE *) fun analyzeDom {program as Program.T {functions, main = fm, ...}, getContData: Cont.t -> ContData.t, getFuncData: Func.t -> FuncData.t} : unit = let datatype z = datatype Areturn.t val {G, addEdge, getNodeInfo, getContNode, getFuncNode, reset, ...} = ContFuncGraph.newContFuncGraph {getContData = getContData, getFuncData = getFuncData} val Root = DirectedGraph.newNode G fun buildGraph () = let val fm_node = getFuncNode fm (* {(Root, fm)} *) val _ = addEdge {from = Root, to = fm_node} (* { (Root, f) | fm calls f } *) val () = if !Control.contifyIntoMain then () else let val {blocks, ...} = Function.dest (Program.mainFunction program) in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, ...} => addEdge {from = Root, to = getFuncNode func} | _ => ()) end val _ = List.foreach (functions, fn func => let val {name = f, blocks, ...} = Function.dest func val f_reach = FuncData.reach (getFuncData f) val f_node = getFuncNode f in if f_reach then Vector.foreach (blocks, fn Block.T {transfer = Call {func = g, return, ...}, ...} => if FuncData.reach (getFuncData g) then let val g_node = getFuncNode g in case return of Return.Dead => (* When compiling with profiling, * Dead returns are allowed to * have nonempty source stacks * (see type-check.fun). So, we * can't contify functions that * are called with a Dead cont. *) addEdge {from = Root, to = g_node} | Return.NonTail c => let val c_node = getContNode c val rootEdge = ContData.rootEdge' (getContData c) in if !rootEdge then () else ((* {(Root, c) | c in Cont} *) addEdge {from = Root, to = c_node}; rootEdge := true); (* {(c, g) | (f, g, c) in N * and Reach (f)} *) addEdge {from = c_node, to = g_node} end | _ => (* {(f, g) | (f, g) in T * and Reach (f)} *) addEdge {from = f_node, to = g_node} end else () | _ => ()) else (* {(Root, f) | not (Reach (f))} *) addEdge {from = Root, to = f_node} end) in () end val buildGraph = Control.trace (Control.Detail, "buildGraph") buildGraph val _ = buildGraph () fun computeDominators () = let val {idom} = Graph.dominators (G, {root = Root}) in idom end val computeDominators = Control.trace (Control.Detail, "computeDominators") computeDominators val idom = computeDominators () fun computeADom () = let fun ancestor node = case idom node of Graph.Idom parent => if Node.equals (parent, Root) then node else ancestor parent | Graph.Root => node | Graph.Unreachable => Error.bug "Contify.AnalyzeDom.ancestor: unreachable" val _ = List.foreach (functions, fn func => let val {name = f, ...} = Function.dest func val FuncData.T {A, reach, node, ...} = getFuncData f val f_ADom = A val f_reach = !reach val f_node = valOf (!node) datatype z = datatype ContFuncGraph.t in if (case idom f_node of Graph.Idom n => Node.equals (n, Root) | Graph.Root => true | Graph.Unreachable => Error.bug "Contify.AnalyzeDom.idom: unreachable") then if f_reach then f_ADom := Unknown else f_ADom := Uncalled else let (* Use this for the ancestor version *) val l_node = ancestor f_node (* Use this for the parent version *) (* val l_node = idom f_node *) in case getNodeInfo l_node of FuncNode g => f_ADom := Func g | ContNode c => f_ADom := Cont c end end) in () end val computeADom = Control.trace (Control.Detail, "compute ADom") computeADom val _ = computeADom () val _ = reset (fn n => not (Node.equals (n, Root))) in () end val analyzeDom = Control.trace (Control.Detail, "analyzeDom") analyzeDom end structure Transform = struct (* * Precondition: forall c in Cont. (ContData.node o getContData) c = NONE * forall c in Cont. (ContData.prefixes o getContData) c = [] * forall f in Func. (FuncData.node o getFuncData) f = NONE * FuncData.A o getFuncData = A * where A is a safe analysis * FuncData.callers o getFuncData * = {nontail = NontailCallers, tail = TailCallers} * FuncData.callees o getFuncData * = {nontail = NontailCallees, tail = TailCallees} * forall f in Func. (FuncData.prefixes o getFuncData) f = [] * forall f in Func. (FuncData.finished o getFuncData) f = false * forall f in Func. (FuncData.replace o getFuncData) f = NONE * Postcondition: forall c in Cont. (ContData.node o getContData) c = NONE * forall f in Func. (FuncData.node o getFuncData) f = NONE *) fun transform {program = Program.T {datatypes, globals, functions, main}, getFuncData: Func.t -> FuncData.t, getContData: Cont.t -> ContData.t} : Program.t = let datatype z = datatype Areturn.t (* For functions turned into continuations, * record their args, blocks, and new name. *) val _ = List.foreach (functions, fn func => let val {name = f, args = f_args, blocks = f_blocks, start = f_start, ...} = Function.dest func val FuncData.T {A, replace, ...} = getFuncData f val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "A(", Func.layout f, str ") = ", Areturn.layout (!A)]) end) fun contify prefixes = let val f_label = Label.newString (Func.originalName f) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout f, str " -> ", Label.layout f_label]) end) val f_blocks = (Block.T {label = f_label, args = f_args, statements = Vector.new0 (), transfer = Goto {dst = f_start, args = Vector.new0 ()}}):: (Vector.toList f_blocks) in replace := SOME {label = f_label, blocks = f_blocks} ; List.push(prefixes, f) end in case !A of Uncalled => () | Unknown => () | Cont c => contify (ContData.prefixes' (getContData c)) | Func g => contify (FuncData.prefixes' (getFuncData g)) end) val traceAddFuncs = Trace.trace3 ("Contify.Transform.addFuncs", Func.layout, List.layout Func.layout, Return.layout, Unit.layout) val traceTransBlock = Trace.trace3 ("Contify.Transform.transBlock", Func.layout, Label.layout o Block.label, Return.layout, Layout.ignore) (* Walk over all functions, removing those that aren't top level, * and descening those that are, inserting local functions * where necessary. * - turn tail calls into nontail calls * - turn returns into gotos * - turn raises into gotos *) fun addFuncPrefixes (f: Func.t, g: Func.t, c: Return.t) : unit = let val prefixes = FuncData.prefixes (getFuncData g) val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "addFuncPrefixes: ", Func.layout f, str " ", Func.layout g, str " ", List.layout Func.layout prefixes]) end) in addFuncs (f, prefixes, c) end and addContPrefixes (f: Func.t, r: Cont.t, c: Return.t): unit = let val prefixes = ContData.prefixes (getContData r) val _ = Control.diagnostics (fn display => let open Layout in display (seq [str "addContPrefixes: ", Func.layout f, str " ", Cont.layout r, str " ", List.layout Func.layout prefixes]) end) in addFuncs (f, prefixes, Return.compose (c, Return.NonTail r)) end and addFuncs arg : unit = traceAddFuncs (fn (f: Func.t, gs: Func.t list, c: Return.t) => List.foreach (gs, fn g => let val finished = FuncData.finished' (getFuncData g) in if !finished then () else (addFuncPrefixes(f, g, c); addBlocks (f, #blocks (valOf (FuncData.replace (getFuncData g))), c); finished := true) end) ) arg and addBlocks (f: Func.t, blocks: Block.t list, c: Return.t) : unit = let val contified' = List.map(blocks, fn block => transBlock (f, block, c)) val contified = FuncData.contified' (getFuncData f) in List.push(contified, contified') end and transBlock arg: Block.t = traceTransBlock (fn (f: Func.t, Block.T {label, args, statements, transfer}, c: Return.t) => let val transfer = case transfer of Call {func, args, return} => ((case return of Return.NonTail r => addContPrefixes (f, r, c) | _ => ()); case FuncData.replace (getFuncData func) of NONE => Call {func = func, args = args, return = Return.compose (c, return)} | SOME {label, ...} => Goto {dst = label, args = args}) | Return xs => (case c of Return.NonTail {cont, ...} => Goto {dst = cont, args = xs} | _ => transfer) | Raise xs => (case c of Return.NonTail {handler = Handler.Handle handler, ...} => Goto {dst = handler, args = xs} | _ => transfer) | _ => transfer in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) arg val shrink = shrinkFunction {globals = globals} val functions = List.fold (functions, [], fn (func, ac) => let val {args = f_args, blocks = f_blocks, mayInline = f_mayInline, name = f, raises = f_raises, returns = f_returns, start = f_start} = Function.dest func in case FuncData.A (getFuncData f) of Unknown => let val _ = addFuncPrefixes (f, f, Return.Tail) val f_blocks = Vector.toListMap (f_blocks, fn block => transBlock (f, block, Return.Tail)) val f_blocks = f_blocks:: (FuncData.contified (getFuncData f)) val f_blocks = Vector.fromList (List.concat f_blocks) in shrink (Function.new {args = f_args, blocks = f_blocks, mayInline = f_mayInline, name = f, raises = f_raises, returns = f_returns, start = f_start}) :: ac end | _ => ac end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} in program end val transform = Control.trace (Control.Detail, "transform") transform end fun contify (program as Program.T _) = let val {get = getLabelInfo : Label.t -> (Handler.t * ContData.t) list ref, ...} = Property.get (Label.plist, Property.initFun (fn _ => ref [])) val getContData : Cont.t -> ContData.t = fn {cont, handler} => let val l = getLabelInfo cont in case List.peek (!l, fn (handler', _) => Handler.equals (handler, handler')) of SOME (_, cd) => cd | NONE => let val cd = ContData.new () val _ = List.push(l, (handler, cd)) in cd end end val {get = getFuncData : Func.t -> FuncData.t, ...} = Property.get (Func.plist, Property.initFun (fn _ => FuncData.new ())) val _ = InitReachCallersCallees.initReachCallersCallees {program = program, getFuncData = getFuncData} val _ = AnalyzeDom.analyzeDom {program = program, getContData = getContData, getFuncData = getFuncData} val program = Transform.transform {program = program, getContData = getContData, getFuncData = getFuncData} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/contify.sig0000644000076600000240000000065011404435623015660 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CONTIFY_STRUCTS = sig include SHRINK end signature CONTIFY = sig include CONTIFY_STRUCTS val contify: Program.t -> Program.t end mlton-20100608/mlton/ssa/deep-flatten.fun0000644000076600000240000012113511404435623016565 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor DeepFlatten (S: DEEP_FLATTEN_STRUCTS): DEEP_FLATTEN = struct open S datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure Tree = Tree (structure Seq = Prod) structure TypeTree = struct datatype t = datatype Tree.t datatype info = Flat | NotFlat of {ty: Type.t, var: Var.t option} type t = info Tree.t fun layout (t: t): Layout.t = Tree.layout (t, let open Layout in fn Flat => str "Flat" | NotFlat {ty, var} => seq [str "NotFlat ", record [("ty", Type.layout ty), ("var", Option.layout Var.layout var)]] end) val isFlat: t -> bool = fn T (i, _) => case i of Flat => true | NotFlat _ => false end structure VarTree = struct open TypeTree val labelRoot: t * Var.t -> t = fn (t as T (info, ts), x) => case info of Flat => t | NotFlat {ty, ...} => T (NotFlat {ty = ty, var = SOME x}, ts) val fromTypeTree: TypeTree.t -> t = fn t => t val foldRoots: t * 'a * (Var.t * 'a -> 'a) -> 'a = fn (t, a, f) => let fun loop (T (info, children), a: 'a): 'a = case info of Flat => Prod.fold (children, a, loop) | NotFlat {var, ...} => case var of NONE => Error.bug "DeepFlatten.VarTree.foldRoots" | SOME x => f (x, a) in loop (t, a) end fun foreachRoot (t, f) = foldRoots (t, (), f o #1) val rootsOnto: t * Var.t list -> Var.t list = fn (t, ac) => List.appendRev (foldRoots (t, [], op ::), ac) val rec dropVars: t -> t = fn T (info, ts) => let val info = case info of Flat => Flat | NotFlat {ty, ...} => NotFlat {ty = ty, var = NONE} in T (info, Prod.map (ts, dropVars)) end fun fillInRoots (t: t, {base: Var.t Base.t, offset: int}) : t * Statement.t list = let fun loop (t as T (info, ts), offset, ac) = case info of Flat => let val (ts, (offset, ac)) = Vector.mapAndFold (Prod.dest ts, (offset, ac), fn ({elt = t, isMutable}, (offset, ac)) => let val (t, offset, ac) = loop (t, offset, ac) in ({elt = t, isMutable = isMutable}, (offset, ac)) end) in (T (Flat, Prod.make ts), offset, ac) end | NotFlat {ty, var} => let val (t, ac) = case var of NONE => let val var = Var.newNoname () in (T (NotFlat {ty = ty, var = SOME var}, ts), Bind {exp = Select {base = base, offset = offset}, ty = ty, var = SOME var} :: ac) end | SOME _ => (t, ac) in (t, offset + 1, ac) end val (t, _, ac) = loop (t, offset, []) in (t, ac) end val fillInRoots = Trace.trace2 ("DeepFlatten.VarTree.fillInRoots", layout, fn {base, offset} => Layout.record [("base", Base.layout (base, Var.layout)), ("offset", Int.layout offset)], Layout.tuple2 (layout, List.layout Statement.layout)) fillInRoots end fun flatten {base: Var.t Base.t option, from: VarTree.t, offset: int, to: TypeTree.t}: {offset: int} * VarTree.t * Statement.t list = let val Tree.T (from, fs) = from in case from of VarTree.Flat => if TypeTree.isFlat to then flattensAt {base = base, froms = fs, offset = offset, tos = Tree.children to} else Error.bug "DeepFlatten.flatten: cannot flatten from Flat to NotFlat" | VarTree.NotFlat {ty, var} => let val (var, ss) = case var of NONE => let val base = case base of NONE => Error.bug "DeepFlatten.flatten: flatten missing base" | SOME base => base val result = Var.newNoname () in (result, [Bind {exp = Select {base = base, offset = offset}, ty = ty, var = SOME result}]) end | SOME var => (var, []) val (r, ss) = if TypeTree.isFlat to then let val (_, r, ss') = flattensAt {base = SOME (Base.Object var), froms = fs, offset = 0, tos = Tree.children to} in (r, ss @ ss') end else (Tree.T (VarTree.NotFlat {ty = ty, var = SOME var}, fs), ss) in ({offset = 1 + offset}, r, ss) end end and flattensAt {base: Var.t Base.t option, froms: VarTree.t Prod.t, offset: int, tos: TypeTree.t Prod.t} = let val (ts, (off, ss)) = Vector.map2AndFold (Prod.dest froms, Prod.dest tos, ({offset = offset}, []), fn ({elt = f, isMutable}, {elt = t, ...}, ({offset}, ss)) => let val () = if isMutable then Error.bug "DeepFlatten.flattensAt: mutable" else () val ({offset}, t, ss') = flatten {base = base, from = f, offset = offset, to = t} in ({elt = t, isMutable = false}, ({offset = offset}, ss' @ ss)) end) in (off, Tree.T (VarTree.Flat, Prod.make ts), ss) end fun coerceTree {from: VarTree.t, to: TypeTree.t}: VarTree.t * Statement.t list = let val (_, r, ss) = flatten {base = NONE, from = from, offset = 0, to = to} in (r, ss) end val coerceTree = let open Layout in Trace.trace ("DeepFlatten.coerceTree", fn {from, to} => record [("from", VarTree.layout from), ("to", TypeTree.layout to)], fn (vt, ss) => tuple [VarTree.layout vt, List.layout Statement.layout ss]) coerceTree end structure Flat = struct datatype t = Flat | NotFlat val toString: t -> string = fn Flat => "Flat" | NotFlat => "NotFlat" val layout = Layout.str o toString end datatype z = datatype Flat.t structure Value = struct datatype t = Ground of Type.t | Object of object Equatable.t | Weak of {arg: t} withtype object = {args: t Prod.t, coercedFrom: t AppendList.t ref, con: ObjectCon.t, finalOffsets: int vector option ref, finalTree: TypeTree.t option ref, finalType: Type.t option ref, finalTypes: Type.t Prod.t option ref, flat: Flat.t ref} fun layout (v: t): Layout.t = let open Layout in case v of Ground t => Type.layout t | Object e => Equatable.layout (e, fn {args, con, flat, ...} => seq [str "Object ", record [("args", Prod.layout (args, layout)), ("con", ObjectCon.layout con), ("flat", Flat.layout (! flat))]]) | Weak {arg, ...} => seq [str "Weak ", layout arg] end val ground = Ground val traceCoerce = Trace.trace ("DeepFlatten.Value.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) val traceUnify = Trace.trace2 ("DeepFlatten.Value.unify", layout, layout, Unit.layout) val rec unify: t * t -> unit = fn arg => traceUnify (fn (v, v') => case (v, v') of (Ground _, Ground _) => () | (Object e, Object e') => let val callDont = ref false val () = Equatable.equate (e, e', fn (z as {args = a, coercedFrom = c, flat = f, ...}, z' as {args = a', coercedFrom = c', flat = f', ...}) => let val () = unifyProd (a, a') in case (!f, !f') of (Flat, Flat) => (c := AppendList.append (!c', !c); z) | (Flat, NotFlat) => (callDont := true; z) | (NotFlat, Flat) => (callDont := true; z') | (NotFlat, NotFlat) => z end) in if !callDont then dontFlatten v else () end | (Weak {arg = a, ...}, Weak {arg = a', ...}) => unify (a, a') | _ => Error.bug "DeepFlatten.unify: strange") arg and unifyProd = fn (p, p') => Vector.foreach2 (Prod.dest p, Prod.dest p', fn ({elt = e, ...}, {elt = e', ...}) => unify (e, e')) and dontFlatten: t -> unit = fn v => case v of Object e => let val {coercedFrom, flat, ...} = Equatable.value e in case ! flat of Flat => let val () = flat := NotFlat val from = !coercedFrom val () = coercedFrom := AppendList.empty in AppendList.foreach (from, fn v' => unify (v, v')) end | NotFlat => () end | _ => () val rec coerce = fn arg as {from, to} => traceCoerce (fn _ => case (from, to) of (Ground _, Ground _) => () | (Object e, Object e') => if Equatable.equals (e, e') then () else Equatable.whenComputed (e', fn {args = a', coercedFrom = c', flat = f', ...} => let val {args = a, con, ...} = Equatable.value e in if Prod.isMutable a orelse ObjectCon.isVector con then unify (from, to) else case !f' of Flat => (AppendList.push (c', from) ; coerceProd {from = a, to = a'}) | NotFlat => unify (from, to) end) | (Weak _, Weak _) => unify (from, to) | _ => Error.bug "DeepFlatten.coerce: strange") arg and coerceProd = fn {from = p, to = p'} => Vector.foreach2 (Prod.dest p, Prod.dest p', fn ({elt = e, ...}, {elt = e', ...}) => coerce {from = e, to = e'}) fun mayFlatten {args, con}: bool = (* Don't flatten constructors, since they are part of a sum type. * Don't flatten unit. * Don't flatten vectors (of course their components can be * flattened). * Don't flatten objects with mutable fields, since sharing must be * preserved. *) not (Prod.isEmpty args) andalso not (Prod.isMutable args) andalso (case con of ObjectCon.Con _ => false | ObjectCon.Tuple => true | ObjectCon.Vector => false) fun objectFields {args, con} = let (* Don't flatten object components that are immutable fields. Those * have already had a chance to be flattened by other passes. *) val _ = if (case con of ObjectCon.Con _ => true | ObjectCon.Tuple => true | ObjectCon.Vector => false) then Vector.foreach (Prod.dest args, fn {elt, isMutable} => if isMutable then () else dontFlatten elt) else () val flat = if mayFlatten {args = args, con = con} then Flat.Flat else Flat.NotFlat in {args = args, coercedFrom = ref AppendList.empty, con = con, finalOffsets = ref NONE, finalTree = ref NONE, finalType = ref NONE, finalTypes = ref NONE, flat = ref flat} end fun object f = Object (Equatable.delay (fn () => objectFields (f ()))) val tuple: t Prod.t -> t = fn vs => Object (Equatable.new (objectFields {args = vs, con = ObjectCon.Tuple})) val tuple = Trace.trace ("DeepFlatten.Value.tuple", fn p => Prod.layout (p, layout), layout) tuple fun weak (arg: t) = Weak {arg = arg} val deObject: t -> object option = fn v => case v of Object e => SOME (Equatable.value e) | _ => NONE val traceFinalType = Trace.trace ("DeepFlatten.Value.finalType", layout, Type.layout) val traceFinalTypes = Trace.trace ("DeepFlatten.Value.finalTypes", layout, fn p => Prod.layout (p, Type.layout)) fun finalTree (v: t): TypeTree.t = let fun notFlat (): TypeTree.info = TypeTree.NotFlat {ty = finalType v, var = NONE} in case deObject v of NONE => Tree.T (notFlat (), Prod.empty ()) | SOME {args, finalTree = r, flat, ...} => Ref.memoize (r, fn () => let val info = case !flat of Flat => TypeTree.Flat | NotFlat => notFlat () in Tree.T (info, Prod.map (args, finalTree)) end) end and finalType arg: Type.t = traceFinalType (fn v => case v of Ground t => t | Object e => let val {finalType = r, ...} = Equatable.value e in Ref.memoize (r, fn () => Prod.elt (finalTypes v, 0)) end | Weak {arg, ...} => Type.weak (finalType arg)) arg and finalTypes arg: Type.t Prod.t = traceFinalTypes (fn v => case deObject v of NONE => Prod.make (Vector.new1 {elt = finalType v, isMutable = false}) | SOME {args, con, finalTypes, flat, ...} => Ref.memoize (finalTypes, fn () => let val args = prodFinalTypes args in case !flat of Flat => args | NotFlat => Prod.make (Vector.new1 {elt = Type.object {args = args, con = con}, isMutable = false}) end)) arg and prodFinalTypes (p: t Prod.t): Type.t Prod.t = Prod.make (Vector.fromList (Vector.foldr (Prod.dest p, [], fn ({elt, isMutable = i}, ac) => Vector.foldr (Prod.dest (finalTypes elt), ac, fn ({elt, isMutable = i'}, ac) => {elt = elt, isMutable = i orelse i'} :: ac)))) end structure Object = struct type t = Value.object fun select ({args, ...}: t, offset): Value.t = Prod.elt (args, offset) fun finalOffsets ({args, finalOffsets = r, ...}: t): int vector = Ref.memoize (r, fn () => Vector.fromListRev (#2 (Prod.fold (args, (0, []), fn (elt, (offset, offsets)) => (offset + Prod.length (Value.finalTypes elt), offset :: offsets))))) fun finalOffset (object, offset) = Vector.sub (finalOffsets object, offset) end fun flatten (program as Program.T {datatypes, functions, globals, main}) = let val {get = conValue: Con.t -> Value.t option ref, ...} = Property.get (Con.plist, Property.initFun (fn _ => ref NONE)) val conValue = Trace.trace ("DeepFlatten.conValue", Con.layout, Ref.layout (Option.layout Value.layout)) conValue datatype 'a make = Const of 'a | Make of unit -> 'a val traceMakeTypeValue = Trace.trace ("DeepFlatten.makeTypeValue", Type.layout o #1, Layout.ignore) fun makeValue m = case m of Const v => v | Make f => f () fun needToMakeProd p = Vector.exists (Prod.dest p, fn {elt, ...} => case elt of Const _ => false | Make _ => true) fun makeProd p = Prod.map (p, makeValue) val {get = makeTypeValue: Type.t -> Value.t make, ...} = Property.get (Type.plist, Property.initRec (traceMakeTypeValue (fn (t, makeTypeValue) => let fun const () = Const (Value.ground t) datatype z = datatype Type.dest in case Type.dest t of Object {args, con} => let val args = Prod.map (args, makeTypeValue) fun doit () = if needToMakeProd args orelse Value.mayFlatten {args = args, con = con} then Make (fn () => Value.object (fn () => {args = makeProd args, con = con})) else const () datatype z = datatype ObjectCon.t in case con of Con c => Const (Ref.memoize (conValue c, fn () => makeValue (doit ()))) | Tuple => doit () | Vector => doit () end | Weak t => (case makeTypeValue t of Const _ => const () | Make f => Make (fn () => Value.weak (f ()))) | _ => const () end))) fun typeValue (t: Type.t): Value.t = makeValue (makeTypeValue t) val typeValue = Trace.trace ("DeepFlatten.typeValue", Type.layout, Value.layout) typeValue val (coerce, coerceProd) = (Value.coerce, Value.coerceProd) fun inject {sum, variant = _} = typeValue (Type.datatypee sum) fun object {args, con, resultType} = let val m = makeTypeValue resultType in case con of NONE => (case m of Const v => v | Make _ => Value.tuple args) | SOME _ => (case m of Const v => let val () = case Value.deObject v of NONE => () | SOME {args = args', ...} => coerceProd {from = args, to = args'} in v end | _ => Error.bug "DeepFlatten.object: strange con value") end val object = Trace.trace ("DeepFlatten.object", fn {args, con, ...} => Layout.record [("args", Prod.layout (args, Value.layout)), ("con", Option.layout Con.layout con)], Value.layout) object val deWeak : Value.t -> Value.t = fn v => case v of Value.Ground t => typeValue (case Type.dest t of Type.Weak t => t | _ => Error.bug "DeepFlatten.primApp: deWeak") | Value.Weak {arg, ...} => arg | _ => Error.bug "DeepFlatten.primApp: Value.deWeak" fun primApp {args, prim, resultVar = _, resultType} = let fun weak v = case makeTypeValue resultType of Const v => v | Make _ => Value.weak v fun arg i = Vector.sub (args, i) fun result () = typeValue resultType datatype z = datatype Prim.Name.t fun dontFlatten () = (Vector.foreach (args, Value.dontFlatten) ; result ()) fun equal () = (Value.unify (arg 0, arg 1) ; Value.dontFlatten (arg 0) ; result ()) in case Prim.name prim of Array_toVector => let val res = result () val () = case (Value.deObject (arg 0), Value.deObject res) of (NONE, NONE) => () | (SOME {args = a, ...}, SOME {args = a', ...}) => Vector.foreach2 (Prod.dest a, Prod.dest a', fn ({elt = v, ...}, {elt = v', ...}) => Value.unify (v, v')) | _ => Error.bug "DeepFlatten.primApp: Array_toVector" in res end | FFI _ => (* Some imports, like Real64.modf, take ref cells that can not * be flattened. *) dontFlatten () | MLton_eq => equal () | MLton_equal => equal () | MLton_size => dontFlatten () | MLton_share => dontFlatten () | Weak_get => deWeak (arg 0) | Weak_new => let val a = arg 0 in (Value.dontFlatten a; weak a) end | _ => result () end fun base b = case b of Base.Object obj => obj | Base.VectorSub {vector, ...} => vector fun select {base, offset} = let datatype z = datatype Value.t in case base of Ground t => (case Type.dest t of Type.Object {args, ...} => typeValue (Prod.elt (args, offset)) | _ => Error.bug "DeepFlatten.select: Ground") | Object e => Object.select (Equatable.value e, offset) | _ => Error.bug "DeepFlatten.select:" end fun update {base, offset, value} = coerce {from = value, to = select {base = base, offset = offset}} fun const c = typeValue (Type.ofConst c) val {func, value = varValue, ...} = analyze {base = base, coerce = coerce, const = const, filter = fn _ => (), filterWord = fn _ => (), fromType = typeValue, inject = inject, layout = Value.layout, object = object, primApp = primApp, program = program, select = fn {base, offset, ...} => select {base = base, offset = offset}, update = update, useFromTypeOnBinds = false} (* Don't flatten outermost part of formal parameters. *) fun dontFlattenFormals (xts: (Var.t * Type.t) vector): unit = Vector.foreach (xts, fn (x, _) => Value.dontFlatten (varValue x)) val () = List.foreach (functions, fn f => let val {args, blocks, ...} = Function.dest f val () = dontFlattenFormals args val () = Vector.foreach (blocks, fn Block.T {args, ...} => dontFlattenFormals args) in () end) val () = Control.diagnostics (fn display => let open Layout val () = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {con, ...} => display (Option.layout Value.layout (! (conValue con))))) val () = Program.foreachVar (program, fn (x, _) => display (seq [Var.layout x, str " ", Value.layout (varValue x)])) in () end) (* Transform the program. *) val datatypes = Vector.map (datatypes, fn Datatype.T {cons, tycon} => let val cons = Vector.map (cons, fn {con, args} => let val args = case ! (conValue con) of NONE => args | SOME v => case Type.dest (Value.finalType v) of Type.Object {args, ...} => args | _ => Error.bug "DeepFlatten.datatypes: strange con" in {args = args, con = con} end) in Datatype.T {cons = cons, tycon = tycon} end) val valueType = Value.finalType fun valuesTypes vs = Vector.map (vs, Value.finalType) val {get = varTree: Var.t -> VarTree.t, set = setVarTree, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("tree", Var.layout)) val setVarTree = Trace.trace2 ("DeepFlatten.setVarTree", Var.layout, VarTree.layout, Unit.layout) setVarTree fun simpleVarTree (x: Var.t): unit = setVarTree (x, VarTree.labelRoot (VarTree.fromTypeTree (Value.finalTree (varValue x)), x)) fun transformFormals xts = Vector.map (xts, fn (x, _) => let val () = simpleVarTree x in (x, Value.finalType (varValue x)) end) fun replaceVar (x: Var.t): Var.t = let fun bug () = Error.bug (concat ["DeepFlatten.replaceVar ", Var.toString x]) val Tree.T (info, _) = varTree x in case info of VarTree.Flat => bug () | VarTree.NotFlat {var, ...} => case var of NONE => bug () | SOME y => y end fun transformBind {exp, ty, var}: Statement.t list = let fun simpleTree () = Option.app (var, simpleVarTree) fun doit (e: Exp.t) = let val ty = case var of NONE => ty | SOME var => valueType (varValue var) in [Bind {exp = e, ty = ty, var = var}] end fun simple () = (simpleTree () ; doit (Exp.replaceVar (exp, replaceVar))) fun none () = [] in case exp of Exp.Const _ => simple () | Inject _ => simple () | Object {args, con} => (case var of NONE => none () | SOME var => let val v = varValue var in case Value.deObject v of NONE => simple () | SOME {args = expects, flat, ...} => let val z = Vector.map2 (args, Prod.dest expects, fn (arg, {elt, isMutable}) => let val (vt, ss) = coerceTree {from = varTree arg, to = Value.finalTree elt} in ({elt = vt, isMutable = isMutable}, ss) end) val vts = Vector.map (z, #1) fun set info = setVarTree (var, Tree.T (info, Prod.make vts)) in case !flat of Flat => (set VarTree.Flat; none ()) | NotFlat => let val ty = Value.finalType v val () = set (VarTree.NotFlat {ty = ty, var = SOME var}) val args = Vector.fromList (Vector.foldr (vts, [], fn ({elt = vt, ...}, ac) => VarTree.rootsOnto (vt, ac))) val obj = Bind {exp = Object {args = args, con = con}, ty = ty, var = SOME var} in Vector.foldr (z, [obj], fn ((_, ss), ac) => ss @ ac) end end end) | PrimApp _ => simple () | Select {base, offset} => (case var of NONE => none () | SOME var => let val baseVar = Base.object base in case Value.deObject (varValue baseVar) of NONE => simple () | SOME obj => let val Tree.T (info, children) = varTree baseVar val {elt = child, isMutable} = Prod.sub (children, offset) val (child, ss) = case info of VarTree.Flat => (child, []) | VarTree.NotFlat _ => let val child = (* Don't simplify a select out * of a mutable field. * Something may have mutated * it. *) if isMutable then VarTree.dropVars child else child in VarTree.fillInRoots (child, {base = Base.map (base, replaceVar), offset = (Object.finalOffset (obj, offset))}) end val () = setVarTree (var, child) in ss end end) | Var x => (Option.app (var, fn y => setVarTree (y, varTree x)) ; none ()) end fun transformStatement (s: Statement.t): Statement.t list = let fun simple () = [Statement.replaceUses (s, replaceVar)] in case s of Bind b => transformBind b | Profile _ => simple () | Update {base, offset, value} => let val baseVar = case base of Base.Object x => x | Base.VectorSub {vector = x, ...} => x in case Value.deObject (varValue baseVar) of NONE => simple () | SOME object => let val ss = ref [] val child = Value.finalTree (Object.select (object, offset)) val offset = Object.finalOffset (object, offset) val base = Base.map (base, replaceVar) val us = if not (TypeTree.isFlat child) then [Update {base = base, offset = offset, value = replaceVar value}] else let val (vt, ss') = coerceTree {from = varTree value, to = child} val () = ss := ss' @ (!ss) val r = ref offset val us = ref [] val () = VarTree.foreachRoot (vt, fn var => let val offset = !r val () = r := 1 + !r in List.push (us, Update {base = base, offset = offset, value = var}) end) in !us end in !ss @ us end end end val transformStatement = Trace.trace ("DeepFlatten.transformStatement", Statement.layout, List.layout Statement.layout) transformStatement fun transformStatements ss = Vector.concatV (Vector.map (ss, Vector.fromList o transformStatement)) fun transformTransfer t = Transfer.replaceVar (t, replaceVar) val transformTransfer = Trace.trace ("DeepFlatten.transformTransfer", Transfer.layout, Transfer.layout) transformTransfer fun transformBlock (Block.T {args, label, statements, transfer}) = Block.T {args = transformFormals args, label = label, statements = transformStatements statements, transfer = transformTransfer transfer} fun transformFunction (f: Function.t): Function.t = let val {args, mayInline, name, start, ...} = Function.dest f val {raises, returns, ...} = func name val args = transformFormals args val raises = Option.map (raises, valuesTypes) val returns = Option.map (returns, valuesTypes) val blocks = ref [] val () = Function.dfs (f, fn b => (List.push (blocks, transformBlock b) ; fn () => ())) in Function.new {args = args, blocks = Vector.fromList (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val globals = transformStatements globals val functions = List.revMap (functions, transformFunction) val program = Program.T {datatypes = datatypes, functions = functions, globals = globals, main = main} val () = Program.clear program in shrink program end end mlton-20100608/mlton/ssa/deep-flatten.sig0000644000076600000240000000060511404435623016555 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DEEP_FLATTEN_STRUCTS = sig include SHRINK2 end signature DEEP_FLATTEN = sig include DEEP_FLATTEN_STRUCTS val flatten: Program.t -> Program.t end mlton-20100608/mlton/ssa/direct-exp.fun0000644000076600000240000005316211404435623016265 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor DirectExp (S: DIRECT_EXP_STRUCTS): DIRECT_EXP = struct open S structure DirectExp = struct datatype t = Arith of {prim: Type.t Prim.t, args: t vector, overflow: t, ty: Type.t} | Call of {func: Func.t, args: t vector, ty: Type.t} | Case of {cases: cases, default: t option, test: t, ty: Type.t} | ConApp of {con: Con.t, args: t vector, ty: Type.t} | Const of Const.t | Detuple of {body: Var.t vector -> t, length: int, tuple: t} | DetupleBind of {body: t, components: Var.t vector, tuple: Var.t, tupleTy: Type.t} | Handle of {try: t, catch: Var.t * Type.t, handler: t, ty: Type.t} | Let of {decs: {var: Var.t, exp: t} list, body: t} | Name of t * (Var.t -> t) | PrimApp of {prim: Type.t Prim.t, targs: Type.t vector, args: t vector, ty: Type.t} | Profile of ProfileExp.t | Raise of t | Runtime of {args: t vector, prim: Type.t Prim.t, ty: Type.t} | Select of {tuple: t, offset: int, ty: Type.t} | Seq of t * t | Tuple of {exps: t vector, ty: Type.t} | Var of Var.t * Type.t and cases = Con of {con: Con.t, args: (Var.t * Type.t) vector, body: t} vector | Word of WordSize.t * (WordX.t * t) vector val arith = Arith val call = Call val casee = Case val conApp = ConApp val const = Const val detuple = Detuple val detupleBind = DetupleBind val handlee = Handle val lett = Let val name = Name val profile = Profile val raisee = Raise val select = Select val word = Const o Const.word fun tuple (r as {exps, ...}) = if 1 = Vector.length exps then Vector.sub (exps, 0) else Tuple r val var = Var fun primApp {args, prim, targs, ty} = let fun runtime () = Runtime {args = args, prim = prim, ty = ty} in case Prim.name prim of Prim.Name.MLton_halt => runtime () | Prim.Name.Thread_copyCurrent => runtime () | _ => PrimApp {args = args, prim = prim, targs = targs, ty = ty} end local fun make c = conApp {con = c, args = Vector.new0 (), ty = Type.bool} in val truee = make Con.truee val falsee = make Con.falsee end fun eq (e1, e2, ty) = primApp {prim = Prim.eq, targs = Vector.new1 ty, args = Vector.new2 (e1, e2), ty = Type.bool} local open Layout fun lett (decs, body) = align [seq [str "let ", decs], seq [str "in ", body], str "end"] in fun layout e : Layout.t = case e of Arith {prim, args, overflow, ...} => align [Prim.layoutApp (prim, args, layout), seq [str "Overflow => ", layout overflow]] | Call {func, args, ty} => seq [Func.layout func, str " ", layouts args, str ": ", Type.layout ty] | Case {cases, default, test, ...} => align [seq [str "case ", layout test, str " of"], indent (align [let fun doit (v, f) = Vector.layout (fn z => let val (x, e) = f z in seq [str "| ", x, str " => ", layout e] end) v fun simple (v, f) = doit (v, (fn (x, e) => (f x, e))) in case cases of Con v => doit (v, fn {con, args, body} => (seq [Con.layout con, Vector.layout (Var.layout o #1) args], body)) | Word (_, v) => simple (v, WordX.layout) end, case default of NONE => empty | SOME e => seq [str " _ => ", layout e]], 2)] | ConApp {con, args, ty} => seq [Con.layout con, layouts args, str ": ", Type.layout ty] | Const c => Const.layout c | Detuple {tuple, ...} => seq [str "detuple ", layout tuple] | DetupleBind {body, components, tuple, ...} => lett (seq [Vector.layout Var.layout components, str " = ", Var.layout tuple], layout body) | Handle {try, catch, handler, ...} => align [layout try, seq [str "handle ", Var.layout (#1 catch), str " => ", layout handler]] | Let {decs, body} => lett (align (List.map (decs, fn {var, exp} => seq [Var.layout var, str " = ", layout exp])), layout body) | Name _ => str "Name" | PrimApp {args, prim, ...} => Prim.layoutApp (prim, args, layout) | Profile e => ProfileExp.layout e | Raise e => seq [str "raise ", layout e] | Runtime {args, prim, ...} => Prim.layoutApp (prim, args, layout) | Select {tuple, offset, ...} => seq [str "#", str (Int.toString (1 + offset)), str " ", layout tuple] | Seq (e1, e2) => seq [layout e1, str "; ", layout e2] | Tuple {exps, ...} => layouts exps | Var (x, t) => seq [Var.layout x, str ": ", Type.layout t] and layouts es = Vector.layout layout es end structure Res = struct type t = {statements: Statement.t list, transfer: Transfer.t} fun layout {statements, transfer} = let open Layout in align [align (List.map (statements, Statement.layout)), Transfer.layout transfer] end fun prefix ({statements, transfer}: t, s: Statement.t): t = {statements = s :: statements, transfer = transfer} end structure Cont: sig type t val bind: Var.t * Res.t -> t val goto: Label.t -> t val layout: t -> Layout.t val receiveExp: (Exp.t * Type.t -> Res.t) -> t val receiveVar: (Var.t * Type.t -> Res.t) -> t val return: t val sendExp: t * Type.t * Exp.t -> Res.t val sendVar: t * Type.t * Var.t -> Res.t val toBlock: t * Type.t -> Block.t end = struct type bind = {arg: Var.t, statements: Statement.t list, transfer: Transfer.t} datatype t = Bind of bind | Goto of Label.t | Prefix of t * Statement.t | ReceiveExp of Exp.t * Type.t -> Res.t | ReceiveVar of Var.t * Type.t -> Res.t | Return fun layout (k: t): Layout.t = let open Layout in case k of Bind {arg, statements, transfer} => seq [str "Bind ", record [("arg", Var.layout arg), ("statements", List.layout Statement.layout statements), ("transfer", Transfer.layout transfer)]] | Goto l => seq [str "Goto ", Label.layout l] | Prefix (k, s) => seq [str "Prefix ", tuple [layout k, Statement.layout s]] | ReceiveExp _ => str "ReceiveExp" | ReceiveVar _ => str "ReceiveVar" | Return => str "Return" end fun bind (arg, {statements, transfer}) = Bind {arg = arg, statements = statements, transfer = transfer} val goto = Goto val receiveExp = ReceiveExp val receiveVar = ReceiveVar val return = Return fun toBind (k: t, ty: Type.t): bind = case k of Bind b => b | _ => let val arg = Var.newNoname () val {statements, transfer} = sendVar (k, ty, arg) in {arg = arg, statements = statements, transfer = transfer} end and sendVar (k: t, ty: Type.t, x: Var.t): Res.t = case k of Bind b => sendBindExp (b, ty, Exp.Var x) | Goto dst => {statements = [], transfer = Transfer.Goto {dst = dst, args = Vector.new1 x}} | ReceiveExp f => f (Exp.Var x, ty) | ReceiveVar f => f (x, ty) | Prefix (k, s) => Res.prefix (sendVar (k, ty, x), s) | Return => {statements = [], transfer = Transfer.Return (Vector.new1 x)} and sendBindExp ({arg, statements, transfer}, ty, e: Exp.t) = {statements = Statement.T {var = SOME arg, ty = ty, exp = e} :: statements, transfer = transfer} val sendVar = Trace.trace3 ("DirectExp.Cont.sendVar", layout, Type.layout, Var.layout, Res.layout) sendVar val sendExp: t * Type.t * Exp.t -> Res.t = fn (k, ty, e) => case k of ReceiveExp f => f (e, ty) | _ => sendBindExp (toBind (k, ty), ty, e) val sendExp = Trace.trace3 ("DirectExp.Cont.sendExp", layout, Type.layout, Exp.layout, Res.layout) sendExp fun toBlock (k: t, ty: Type.t): Block.t = let val {arg, statements, transfer} = toBind (k, ty) val label = Label.newNoname () in Block.T {label = label, args = Vector.new1 (arg, ty), statements = Vector.fromList statements, transfer = transfer} end val toBlock = Trace.trace2 ("DirectExp.Cont.toBlock", layout, Type.layout, Block.layout) toBlock end fun selects (tuple: Var.t, ty: Type.t, components: Var.t vector) : Statement.t list = let val ts = Type.deTuple ty in Vector.foldi (ts, [], fn (i, t, ss) => Statement.T {var = SOME (Vector.sub (components, i)), ty = t, exp = Exp.Select {tuple = tuple, offset = i}} :: ss) end fun linearize' (e: t, h: Handler.t, k: Cont.t): Label.t * Block.t list = let val traceLinearizeLoop = Trace.trace3 ("DirectExp.linearize'.loop", layout, Handler.layout, Cont.layout, Res.layout) val blocks: Block.t list ref = ref [] fun newBlock (args: (Var.t * Type.t) vector, {statements: Statement.t list, transfer: Transfer.t}): Label.t = let val label = Label.newNoname () val _ = List.push (blocks, Block.T {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}) in label end fun reify (k: Cont.t, ty: Type.t): Label.t = let val b = Cont.toBlock (k, ty) val _ = List.push (blocks, b) in Block.label b end fun newLabel (args: (Var.t * Type.t) vector, e: t, h: Handler.t, k: Cont.t): Label.t = newBlock (args, loop (e, h, k)) and newLabel0 (e, h, k) = newLabel (Vector.new0 (), e, h, k) and loopf (e: t, h: Handler.t, f: Var.t * Type.t -> Res.t) = loop (e, h, Cont.receiveVar f) and loop arg : Res.t = traceLinearizeLoop (fn (e: t, h: Handler.t, k: Cont.t) => case e of Arith {prim, args, overflow, ty} => loops (args, h, fn xs => let val l = reify (k, ty) val k = Cont.goto l in {statements = [], transfer = Transfer.Arith {prim = prim, args = xs, overflow = newLabel0 (overflow, h, k), success = l, ty = ty}} end) | Call {func, args, ty} => loops (args, h, fn xs => {statements = [], transfer = (Transfer.Call {func = func, args = xs, return = Return.NonTail {cont = reify (k, ty), handler = h}})}) | Case {cases, default, test, ty} => let val k = Cont.goto (reify (k, ty)) in loopf (test, h, fn (x, _) => {statements = [], transfer = Transfer.Case {test = x, default = Option.map (default, fn e => newLabel0 (e, h, k)), cases = let fun doit v = Vector.map (v, fn (c, e) => (c, newLabel0 (e, h, k))) in case cases of Con v => Cases.Con (Vector.map (v, fn {con, args, body} => (con, newLabel (args, body, h, k)))) | Word (s, v) => Cases.Word (s, doit v) end}}) end | ConApp {con, args, ty} => loops (args, h, fn xs => Cont.sendExp (k, ty, Exp.ConApp {con = con, args = xs})) | Const c => Cont.sendExp (k, Type.ofConst c, Exp.Const c) | Detuple {tuple, length, body} => loop (tuple, h, Cont.receiveExp (fn (e, ty) => let fun doit (tuple: Var.t): Res.t = let val (ss, xs) = case length of 0 => ([], Vector.new0 ()) | 1 => ([], Vector.new1 tuple) | _ => let val xs = Vector.tabulate (length, fn _ => Var.newNoname ()) in (selects (tuple, ty, xs), xs) end val {statements, transfer} = loop (body xs, h, k) in {statements = List.appendRev (ss, statements), transfer = transfer} end in case e of Exp.Tuple xs => loop (body xs, h, k) | Exp.Var x => doit x | _ => let val tuple = Var.newNoname () in Res.prefix (doit tuple, Statement.T {var = SOME tuple, ty = ty, exp = e}) end end)) | DetupleBind {body, components, tuple, tupleTy} => let val {statements, transfer} = loop (body, h, k) val ss = case Vector.length components of 0 => [] | 1 => [Statement.T {var = SOME (Vector.sub (components, 0)), ty = tupleTy, exp = Exp.Var tuple}] | _ => selects (tuple, tupleTy, components) in {statements = List.appendRev (ss, statements), transfer = transfer} end | Handle {try, catch, handler, ty} => let val k = Cont.goto (reify (k, ty)) val hl = Label.newNoname () val {statements, transfer} = loop (handler, h, k) val _ = List.push (blocks, Block.T {label = hl, args = Vector.new1 catch, statements = Vector.fromList statements, transfer = transfer}) in loop (try, Handler.Handle hl, k) end | Let {decs, body} => let fun each decs = case decs of [] => loop (body, h, k) | {var, exp} :: decs => loop (exp, h, Cont.bind (var, each decs)) in each decs end | Name (e, f) => loopf (e, h, fn (x, _) => loop (f x, h, k)) | PrimApp {prim, targs, args, ty} => loops (args, h, fn xs => Cont.sendExp (k, ty, Exp.PrimApp {prim = prim, targs = targs, args = xs})) | Profile e => Cont.sendExp (k, Type.unit, Exp.Profile e) | Raise e => loopf (e, h, fn (x, _) => {statements = [], transfer = (case h of Handler.Caller => Transfer.Raise (Vector.new1 x) | Handler.Dead => Error.bug "DirectExp.linearize'.loop: Raise:to dead handler" | Handler.Handle l => Transfer.Goto {args = Vector.new1 x, dst = l})}) | Runtime {args, prim, ty} => loops (args, h, fn xs => let val l = reify (k, ty) val k = Cont.goto l val (args, exps) = case Type.deTupleOpt ty of NONE => let val res = Var.newNoname () in (Vector.new1 (res, ty), Vector.new1 (Var (res, ty))) end | SOME ts => if 0 = Vector.length ts then (Vector.new0 (), Vector.new0 ()) else Error.bug (concat ["DirectExp.linearize'.loop: Runtime:with multiple return values: ", Prim.toString prim]) in {statements = [], transfer = Transfer.Runtime {prim = prim, args = xs, return = newLabel (args, tuple {exps = exps, ty = ty}, h, k)}} end) | Select {tuple, offset, ty} => loopf (tuple, h, fn (tuple, _) => Cont.sendExp (k, ty, Exp.Select {tuple = tuple, offset = offset})) | Seq (e1, e2) => loopf (e1, h, fn _ => loop (e2, h, k)) | Tuple {exps, ty} => loops (exps, h, fn xs => Cont.sendExp (k, ty, Exp.Tuple xs)) | Var (x, ty) => Cont.sendVar (k, ty, x)) arg and loops (es: t vector, h: Handler.t, k: Var.t vector -> Res.t): Res.t = let val n = Vector.length es fun each (i, ac) = if i = n then k (Vector.fromListRev ac) else loopf (Vector.sub (es, i), h, fn (x, _) => each (i + 1, x :: ac)) in each (0, []) end val l = newLabel0 (e, h, k) in (l, !blocks) end fun linearize (e: t, h) = linearize' (e, h, Cont.return) val linearize = Trace.trace2 ("DirectExp.linearize", layout, Handler.layout, Layout.tuple2 (Label.layout, List.layout (Label.layout o Block.label))) linearize fun linearizeGoto (e: t, h, l) = linearize' (e, h, Cont.goto l) end end mlton-20100608/mlton/ssa/direct-exp.sig0000644000076600000240000000536011404435623016254 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DIRECT_EXP_STRUCTS = sig include SSA_TREE end signature DIRECT_EXP = sig include DIRECT_EXP_STRUCTS structure DirectExp: sig type t datatype cases = Con of {con: Con.t, args: (Var.t * Type.t) vector, body: t} vector | Word of WordSize.t * (WordX.t * t) vector val arith: {prim: Type.t Prim.t, args: t vector, overflow: t, ty: Type.t} -> t (* For now, call always uses Handler.None. This means it should only * be used for functions that cannot raise. *) val call: {func: Func.t, args: t vector, ty: Type.t} -> t val casee: {test: t, cases: cases, default: t option, ty: Type.t} -> t val conApp: {con: Con.t, args: t vector, ty: Type.t} -> t val const: Const.t -> t val detuple: {body: Var.t vector -> t, length: int, tuple: t} -> t val detupleBind: {body: t, components: Var.t vector, tuple: Var.t, tupleTy: Type.t} -> t val eq: t * t * Type.t -> t val falsee: t val handlee: {try: t, ty: Type.t, catch: Var.t * Type.t, handler: t} -> t val layout: t -> Layout.t val lett: {decs: {var: Var.t, exp: t} list, body: t} -> t val linearize: t * Return.Handler.t -> Label.t * Block.t list val linearizeGoto: t * Return.Handler.t * Label.t -> Label.t * Block.t list val name: t * (Var.t -> t) -> t val primApp: {args: t vector, prim: Type.t Prim.t, targs: Type.t vector, ty: Type.t} -> t val profile: ProfileExp.t -> t val raisee: t -> t val select: {tuple: t, offset: int, ty: Type.t} -> t val truee: t val tuple: {exps: t vector, ty: Type.t} -> t val var: Var.t * Type.t -> t val word: WordX.t -> t end end mlton-20100608/mlton/ssa/direct-exp2.fun0000644000076600000240000005321311404435623016344 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor DirectExp2 (S: DIRECT_EXP2_STRUCTS): DIRECT_EXP2 = struct open S structure DirectExp = struct datatype t = Arith of {prim: Type.t Prim.t, args: t vector, overflow: t, ty: Type.t} | Call of {func: Func.t, args: t vector, ty: Type.t} | Case of {cases: cases, default: t option, test: t, ty: Type.t} | ConApp of {con: Con.t, args: t vector, ty: Type.t} | Const of Const.t | Detuple of {body: Var.t vector -> t, length: int, tuple: t} | DetupleBind of {body: t, components: Var.t vector, tuple: Var.t, tupleTy: Type.t} | Handle of {try: t, catch: Var.t * Type.t, handler: t, ty: Type.t} | Let of {decs: {var: Var.t, exp: t} list, body: t} | Name of t * (Var.t -> t) | PrimApp of {prim: Type.t Prim.t, targs: Type.t vector, args: t vector, ty: Type.t} | Profile of ProfileExp.t | Raise of t | Runtime of {args: t vector, prim: Type.t Prim.t, ty: Type.t} | Select of {tuple: t, offset: int, ty: Type.t} | Seq of t * t | Tuple of {exps: t vector, ty: Type.t} | Var of Var.t * Type.t and cases = Con of {con: Con.t, args: (Var.t * Type.t) vector, body: t} vector | Word of WordSize.t * (WordX.t * t) vector val arith = Arith val call = Call val casee = Case val conApp = ConApp val const = Const val detuple = Detuple val detupleBind = DetupleBind val handlee = Handle val lett = Let val name = Name val profile = Profile val raisee = Raise val select = Select val seq = Seq val word = Const o Const.word fun tuple (r as {exps, ...}) = if 1 = Vector.length exps then Vector.sub (exps, 0) else Tuple r val var = Var fun primApp {args, prim, targs, ty} = let fun runtime () = Runtime {args = args, prim = prim, ty = ty} in case Prim.name prim of Prim.Name.MLton_halt => runtime () | Prim.Name.Thread_copyCurrent => runtime () | _ => PrimApp {args = args, prim = prim, targs = targs, ty = ty} end local fun make c = conApp {con = c, args = Vector.new0 (), ty = Type.bool} in val truee = make Con.truee val falsee = make Con.falsee end fun eq (e1, e2, ty) = primApp {prim = Prim.eq, targs = Vector.new1 ty, args = Vector.new2 (e1, e2), ty = Type.bool} local open Layout fun lett (decs, body) = align [seq [str "let ", decs], seq [str "in ", body], str "end"] in fun layout e : Layout.t = case e of Arith {prim, args, overflow, ...} => align [Prim.layoutApp (prim, args, layout), seq [str "Overflow => ", layout overflow]] | Call {func, args, ty} => seq [Func.layout func, str " ", layouts args, str ": ", Type.layout ty] | Case {cases, default, test, ...} => align [seq [str "case ", layout test, str " of"], indent (align [let fun doit (v, f) = Vector.layout (fn z => let val (x, e) = f z in seq [str "| ", x, str " => ", layout e] end) v fun simple (v, f) = doit (v, (fn (x, e) => (f x, e))) in case cases of Con v => doit (v, fn {con, args, body} => (seq [Con.layout con, Vector.layout (Var.layout o #1) args], body)) | Word (_, v) => simple (v, WordX.layout) end, case default of NONE => empty | SOME e => seq [str " _ => ", layout e]], 2)] | ConApp {con, args, ty} => seq [Con.layout con, layouts args, str ": ", Type.layout ty] | Const c => Const.layout c | Detuple {tuple, ...} => seq [str "detuple ", layout tuple] | DetupleBind {body, components, tuple, ...} => lett (seq [Vector.layout Var.layout components, str " = ", Var.layout tuple], layout body) | Handle {try, catch, handler, ...} => align [layout try, seq [str "handle ", Var.layout (#1 catch), str " => ", layout handler]] | Let {decs, body} => lett (align (List.map (decs, fn {var, exp} => seq [Var.layout var, str " = ", layout exp])), layout body) | Name _ => str "Name" | PrimApp {args, prim, ...} => Prim.layoutApp (prim, args, layout) | Profile e => ProfileExp.layout e | Raise e => seq [str "raise ", layout e] | Runtime {args, prim, ...} => Prim.layoutApp (prim, args, layout) | Select {tuple, offset, ...} => seq [str "#", str (Int.toString (1 + offset)), str " ", layout tuple] | Seq (e1, e2) => seq [layout e1, str "; ", layout e2] | Tuple {exps, ...} => layouts exps | Var (x, t) => seq [Var.layout x, str ": ", Type.layout t] and layouts es = Vector.layout layout es end structure Res = struct type t = {statements: Statement.t list, transfer: Transfer.t} fun layout {statements, transfer} = let open Layout in align [align (List.map (statements, Statement.layout)), Transfer.layout transfer] end fun prefix ({statements, transfer}: t, s: Statement.t): t = {statements = s :: statements, transfer = transfer} end structure Cont: sig type t val bind: Var.t * Res.t -> t val goto: Label.t -> t val layout: t -> Layout.t val receiveExp: (Exp.t * Type.t -> Res.t) -> t val receiveVar: (Var.t * Type.t -> Res.t) -> t val return: t val sendExp: t * Type.t * Exp.t -> Res.t val sendVar: t * Type.t * Var.t -> Res.t val toBlock: t * Type.t -> Block.t end = struct type bind = {arg: Var.t, statements: Statement.t list, transfer: Transfer.t} datatype t = Bind of bind | Goto of Label.t | Prefix of t * Statement.t | ReceiveExp of Exp.t * Type.t -> Res.t | ReceiveVar of Var.t * Type.t -> Res.t | Return fun layout (k: t): Layout.t = let open Layout in case k of Bind {arg, statements, transfer} => seq [str "Bind ", record [("arg", Var.layout arg), ("statements", List.layout Statement.layout statements), ("transfer", Transfer.layout transfer)]] | Goto l => seq [str "Goto ", Label.layout l] | Prefix (k, s) => seq [str "Prefix ", tuple [layout k, Statement.layout s]] | ReceiveExp _ => str "ReceiveExp" | ReceiveVar _ => str "ReceiveVar" | Return => str "Return" end fun bind (arg, {statements, transfer}) = Bind {arg = arg, statements = statements, transfer = transfer} val goto = Goto val receiveExp = ReceiveExp val receiveVar = ReceiveVar val return = Return fun toBind (k: t, ty: Type.t): bind = case k of Bind b => b | _ => let val arg = Var.newNoname () val {statements, transfer} = sendVar (k, ty, arg) in {arg = arg, statements = statements, transfer = transfer} end and sendVar (k: t, ty: Type.t, x: Var.t): Res.t = case k of Bind b => sendBindExp (b, ty, Exp.Var x) | Goto dst => {statements = [], transfer = Transfer.Goto {dst = dst, args = Vector.new1 x}} | ReceiveExp f => f (Exp.Var x, ty) | ReceiveVar f => f (x, ty) | Prefix (k, s) => Res.prefix (sendVar (k, ty, x), s) | Return => {statements = [], transfer = Transfer.Return (Vector.new1 x)} and sendBindExp ({arg, statements, transfer}, ty, e: Exp.t) = {statements = Statement.T {var = SOME arg, ty = ty, exp = e} :: statements, transfer = transfer} val sendVar = Trace.trace3 ("DirectExp2.Cont.sendVar", layout, Type.layout, Var.layout, Res.layout) sendVar val sendExp: t * Type.t * Exp.t -> Res.t = fn (k, ty, e) => case k of ReceiveExp f => f (e, ty) | _ => sendBindExp (toBind (k, ty), ty, e) val sendExp = Trace.trace3 ("DirectExp2.Cont.sendExp", layout, Type.layout, Exp.layout, Res.layout) sendExp fun toBlock (k: t, ty: Type.t): Block.t = let val {arg, statements, transfer} = toBind (k, ty) val label = Label.newNoname () in Block.T {label = label, args = Vector.new1 (arg, ty), statements = Vector.fromList statements, transfer = transfer} end val toBlock = Trace.trace2 ("DirectExp2.Cont.toBlock", layout, Type.layout, Block.layout) toBlock end fun selects (tuple: Var.t, ty: Type.t, components: Var.t vector) : Statement.t list = let val ts = Type.deTuple ty in Vector.foldi (ts, [], fn (i, t, ss) => Statement.T {var = SOME (Vector.sub (components, i)), ty = t, exp = Exp.Select {tuple = tuple, offset = i}} :: ss) end fun linearize' (e: t, h: Handler.t, k: Cont.t): Label.t * Block.t list = let val traceLinearizeLoop = Trace.trace3 ("DirectExp.linearize'.loop", layout, Handler.layout, Cont.layout, Res.layout) val blocks: Block.t list ref = ref [] fun newBlock (args: (Var.t * Type.t) vector, {statements: Statement.t list, transfer: Transfer.t}): Label.t = let val label = Label.newNoname () val _ = List.push (blocks, Block.T {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}) in label end fun reify (k: Cont.t, ty: Type.t): Label.t = let val b = Cont.toBlock (k, ty) val _ = List.push (blocks, b) in Block.label b end fun newLabel (args: (Var.t * Type.t) vector, e: t, h: Handler.t, k: Cont.t): Label.t = newBlock (args, loop (e, h, k)) and newLabel0 (e, h, k) = newLabel (Vector.new0 (), e, h, k) and loopf (e: t, h: Handler.t, f: Var.t * Type.t -> Res.t) = loop (e, h, Cont.receiveVar f) and loop arg : Res.t = traceLinearizeLoop (fn (e: t, h: Handler.t, k: Cont.t) => case e of Arith {prim, args, overflow, ty} => loops (args, h, fn xs => let val l = reify (k, ty) val k = Cont.goto l in {statements = [], transfer = Transfer.Arith {prim = prim, args = xs, overflow = newLabel0 (overflow, h, k), success = l, ty = ty}} end) | Call {func, args, ty} => loops (args, h, fn xs => {statements = [], transfer = (Transfer.Call {func = func, args = xs, return = Return.NonTail {cont = reify (k, ty), handler = h}})}) | Case {cases, default, test, ty} => let val k = Cont.goto (reify (k, ty)) in loopf (test, h, fn (x, _) => {statements = [], transfer = Transfer.Case {test = x, default = Option.map (default, fn e => newLabel0 (e, h, k)), cases = let fun doit v = Vector.map (v, fn (c, e) => (c, newLabel0 (e, h, k))) in case cases of Con v => Cases.Con (Vector.map (v, fn {con, args, body} => (con, newLabel (args, body, h, k)))) | Word (s, v) => Cases.Word (s, doit v) end}}) end | ConApp {con, args, ty} => loops (args, h, fn xs => Cont.sendExp (k, ty, Exp.ConApp {con = con, args = xs})) | Const c => Cont.sendExp (k, Type.ofConst c, Exp.Const c) | Detuple {tuple, length, body} => loop (tuple, h, Cont.receiveExp (fn (e, ty) => let fun doit (tuple: Var.t): Res.t = let val (ss, xs) = case length of 0 => ([], Vector.new0 ()) | 1 => ([], Vector.new1 tuple) | _ => let val xs = Vector.tabulate (length, fn _ => Var.newNoname ()) in (selects (tuple, ty, xs), xs) end val {statements, transfer} = loop (body xs, h, k) in {statements = List.appendRev (ss, statements), transfer = transfer} end in case e of Exp.Tuple xs => loop (body xs, h, k) | Exp.Var x => doit x | _ => let val tuple = Var.newNoname () in Res.prefix (doit tuple, Statement.T {var = SOME tuple, ty = ty, exp = e}) end end)) | DetupleBind {body, components, tuple, tupleTy} => let val {statements, transfer} = loop (body, h, k) val ss = case Vector.length components of 0 => [] | 1 => [Statement.T {var = SOME (Vector.sub (components, 0)), ty = tupleTy, exp = Exp.Var tuple}] | _ => selects (tuple, tupleTy, components) in {statements = List.appendRev (ss, statements), transfer = transfer} end | Handle {try, catch, handler, ty} => let val k = Cont.goto (reify (k, ty)) val hl = Label.newNoname () val {statements, transfer} = loop (handler, h, k) val _ = List.push (blocks, Block.T {label = hl, args = Vector.new1 catch, statements = Vector.fromList statements, transfer = transfer}) in loop (try, Handler.Handle hl, k) end | Let {decs, body} => let fun each decs = case decs of [] => loop (body, h, k) | {var, exp} :: decs => loop (exp, h, Cont.bind (var, each decs)) in each decs end | Name (e, f) => loopf (e, h, fn (x, _) => loop (f x, h, k)) | PrimApp {prim, targs, args, ty} => loops (args, h, fn xs => Cont.sendExp (k, ty, Exp.PrimApp {prim = prim, targs = targs, args = xs})) | Profile e => Cont.sendExp (k, Type.unit, Exp.Profile e) | Raise e => loopf (e, h, fn (x, _) => {statements = [], transfer = (case h of Handler.Caller => Transfer.Raise (Vector.new1 x) | Handler.Dead => Error.bug "DirectExp2.linearize'.loop: Raise:to dead handler" | Handler.Handle l => Transfer.Goto {args = Vector.new1 x, dst = l})}) | Runtime {args, prim, ty} => loops (args, h, fn xs => let val l = reify (k, ty) val k = Cont.goto l val (args, exps) = case Type.deTupleOpt ty of NONE => let val res = Var.newNoname () in (Vector.new1 (res, ty), Vector.new1 (Var (res, ty))) end | SOME ts => if 0 = Vector.length ts then (Vector.new0 (), Vector.new0 ()) else Error.bug (concat ["DirectExp2.linearlize'.loop: Runtime:with multiple return values: ", Prim.toString prim]) in {statements = [], transfer = Transfer.Runtime {prim = prim, args = xs, return = newLabel (args, tuple {exps = exps, ty = ty}, h, k)}} end) | Select {tuple, offset, ty} => loopf (tuple, h, fn (tuple, _) => Cont.sendExp (k, ty, Exp.Select {tuple = tuple, offset = offset})) | Seq (e1, e2) => loopf (e1, h, fn _ => loop (e2, h, k)) | Tuple {exps, ty} => loops (exps, h, fn xs => Cont.sendExp (k, ty, Exp.Tuple xs)) | Var (x, ty) => Cont.sendVar (k, ty, x)) arg and loops (es: t vector, h: Handler.t, k: Var.t vector -> Res.t): Res.t = let val n = Vector.length es fun each (i, ac) = if i = n then k (Vector.fromListRev ac) else loopf (Vector.sub (es, i), h, fn (x, _) => each (i + 1, x :: ac)) in each (0, []) end val l = newLabel0 (e, h, k) in (l, !blocks) end fun linearize (e: t, h) = linearize' (e, h, Cont.return) val linearize = Trace.trace2 ("DirectExp2.linearize", layout, Handler.layout, Layout.tuple2 (Label.layout, List.layout (Label.layout o Block.label))) linearize fun linearizeGoto (e: t, h, l) = linearize' (e, h, Cont.goto l) end end mlton-20100608/mlton/ssa/direct-exp2.sig0000644000076600000240000000542311404435623016336 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature DIRECT_EXP2_STRUCTS = sig include SSA_TREE2 end signature DIRECT_EXP2 = sig include DIRECT_EXP2_STRUCTS structure DirectExp: sig type t datatype cases = Con of {con: Con.t, args: (Var.t * Type.t) vector, body: t} vector | Word of WordSize.t * (WordX.t * t) vector val arith: {prim: Type.t Prim.t, args: t vector, overflow: t, ty: Type.t} -> t (* For now, call always uses Handler.None. This means it should only * be used for functions that cannot raise. *) val call: {func: Func.t, args: t vector, ty: Type.t} -> t val casee: {test: t, cases: cases, default: t option, ty: Type.t} -> t val conApp: {con: Con.t, args: t vector, ty: Type.t} -> t val const: Const.t -> t val detuple: {body: Var.t vector -> t, length: int, tuple: t} -> t val detupleBind: {body: t, components: Var.t vector, tuple: Var.t, tupleTy: Type.t} -> t val eq: t * t * Type.t -> t val falsee: t val handlee: {try: t, ty: Type.t, catch: Var.t * Type.t, handler: t} -> t val layout: t -> Layout.t val lett: {decs: {var: Var.t, exp: t} list, body: t} -> t val linearize: t * Return.Handler.t -> Label.t * Block.t list val linearizeGoto: t * Return.Handler.t * Label.t -> Label.t * Block.t list val name: t * (Var.t -> t) -> t val primApp: {args: t vector, prim: Type.t Prim.t, targs: Type.t vector, ty: Type.t} -> t val profile: ProfileExp.t -> t val raisee: t -> t val select: {tuple: t, offset: int, ty: Type.t} -> t val seq: t * t -> t val truee: t val tuple: {exps: t vector, ty: Type.t} -> t val var: Var.t * Type.t -> t val word: WordX.t -> t end end mlton-20100608/mlton/ssa/equatable.sig0000644000076600000240000000205411404435623016150 0ustar mtfstaff(* Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * Equatable values can be equated, after which they are equals. Equating * two value requires the client to specify how to compute the new value from * the old. * * Equatable values can be either created by "new" or "delay". In the case of * delay, the value is only computed if "value" is called. * * Equating a value created by delay with a value created by new will completely * drop the delayed value. Hence, if a value is delayed, then nothing should * be assumed about any of its subcomponents. *) signature EQUATABLE = sig type 'a t val equals: 'a t * 'a t -> bool val delay: (unit -> 'a) -> 'a t val equate: 'a t * 'a t * ('a * 'a -> 'a) -> unit val layout: 'a t * ('a -> Layout.t) -> Layout.t val new: 'a -> 'a t val value: 'a t -> 'a val whenComputed: 'a t * ('a -> unit) -> unit end mlton-20100608/mlton/ssa/equatable.sml0000644000076600000240000000435611404435623016170 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Equatable: EQUATABLE = struct structure Set = DisjointSet datatype 'a delay = Computed of 'a | Uncomputed of {compute: unit -> 'a, whenComputed: ('a -> unit) AppendList.t ref} datatype 'a t = T of 'a delay Set.t fun layout (T s, f) = case Set.! s of Computed a => f a | Uncomputed _ => Layout.str "" fun delay f = T (Set.singleton (Uncomputed {compute = f, whenComputed = ref AppendList.empty})) fun new a = T (Set.singleton (Computed a)) fun equals (T s, T s') = Set.equals (s, s') fun value (T s) = case Set.! s of Computed a => a | Uncomputed {compute, whenComputed} => let val a = compute () val () = Set.:= (s, Computed a) val () = AppendList.foreach (!whenComputed, fn f => f a) in a end fun equate (T s, T s', combine) = if Set.equals (s, s') then () else let val d = Set.! s val d' = Set.! s' val () = Set.union (s, s') fun one (a, {compute = _, whenComputed}) = (* Must set the value before calling the whenComputed, because * those may look at the value (which would cause it to be set, * which would then be overwritten). *) (Set.:= (s, Computed a) ; AppendList.foreach (!whenComputed, fn f => f a)) in case (d, d') of (Computed a, Computed a') => Set.:= (s, Computed (combine (a, a'))) | (Computed a, Uncomputed u) => one (a, u) | (Uncomputed u, Computed a) => one (a, u) | (Uncomputed {compute, whenComputed = w}, Uncomputed {whenComputed = w', ...}) => Set.:= (s, Uncomputed {compute = compute, whenComputed = ref (AppendList.append (!w, !w'))}) end fun whenComputed (T s, f): unit = case Set.! s of Computed a => f a | Uncomputed {whenComputed = w, ...} => AppendList.push (w, f) end mlton-20100608/mlton/ssa/flat-lattice.fun0000644000076600000240000000634511404435623016573 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor FlatLattice (S: FLAT_LATTICE_STRUCTS): FLAT_LATTICE = struct open S structure Elt = struct datatype t = Bottom | Point of Point.t | Top local open Layout in val layout = fn Bottom => str "Bottom" | Point p => Point.layout p | Top => str "Top" end end datatype z = datatype Elt.t datatype t = T of {lessThan: t list ref, upperBound: Point.t option ref, value: Elt.t ref} fun layout (T {value, ...}) = Elt.layout (!value) fun new () = T {lessThan = ref [], upperBound = ref NONE, value = ref Bottom} val isBottom = fn (T {value = ref Bottom, ...}) => true | _ => false val isPoint = fn (T {value = ref (Point _), ...}) => true | _ => false val isPointEq = fn (T {value = ref (Point p), ...}, p') => Point.equals (p, p') | _ => false val getPoint = fn (T {value = ref (Point p), ...}) => SOME p | _ => NONE val isTop = fn (T {value = ref Top, ...}) => true | _ => false fun forceTop (T {upperBound, value, ...}): bool = if isSome (!upperBound) then false else (value := Top; true) fun up (T {lessThan, upperBound, value, ...}, e: Elt.t): bool = let fun continue e = List.forall (!lessThan, fn z => up (z, e)) fun setTop () = not (isSome (!upperBound)) andalso (value := Top ; continue Top) in case (!value, e) of (_, Bottom) => true | (Top, _) => true | (_, Top) => setTop () | (Bottom, Point p) => (value := Point p ; (case !upperBound of NONE => continue (Point p) | SOME p' => Point.equals (p, p') andalso continue (Point p))) | (Point p, Point p') => Point.equals (p, p') orelse setTop () end val op <= : t * t -> bool = fn (T {lessThan, value, ...}, e) => (List.push (lessThan, e) ; up (e, !value)) val op <= = Trace.trace2 ("FlatLattice.<=", layout, layout, Bool.layout) (op <=) fun lowerBound (e, p): bool = up (e, Point p) val lowerBound = Trace.trace2 ("FlatLattice.lowerBound", layout, Point.layout, Bool.layout) lowerBound fun upperBound (T {upperBound = r, value, ...}, p): bool = case !r of NONE => (r := SOME p ; (case !value of Bottom => true | Point p' => Point.equals (p, p') | Top => false)) | SOME p' => Point.equals (p, p') val upperBound = Trace.trace2 ("FlatLattice.upperBound", layout, Point.layout, Bool.layout) upperBound fun forcePoint (e, p) = lowerBound (e, p) andalso upperBound (e, p) val forcePoint = Trace.trace2 ("FlatLattice.forcePoint", layout, Point.layout, Bool.layout) forcePoint fun point p = let val e = new () val _ = forcePoint (e, p) in e end val point = Trace.trace ("FlatLattice.point", Point.layout, layout) point end mlton-20100608/mlton/ssa/flat-lattice.sig0000644000076600000240000000171411404435623016560 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FLAT_LATTICE_STRUCTS = sig structure Point: sig type t val equals: t * t -> bool val layout: t -> Layout.t end end signature FLAT_LATTICE = sig include FLAT_LATTICE_STRUCTS type t val <= : t * t -> bool val forcePoint: t * Point.t -> bool val forceTop: t -> bool val getPoint: t -> Point.t option val isBottom: t -> bool val isPoint: t -> bool val isPointEq: t * Point.t -> bool val isTop: t -> bool val layout: t -> Layout.t val lowerBound: t * Point.t -> bool val new: unit -> t val point: Point.t -> t val upperBound: t * Point.t -> bool end mlton-20100608/mlton/ssa/flatten.fun0000644000076600000240000004733611404435623015664 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * Flatten arguments to jumps, constructors, and functions. * If a tuple is explicitly available at all uses of a jump (resp. function) * then * - The formals and call sites are changed so that the components of the * tuple are passed. * - The tuple is reconstructed at the beginning of the body of the jump. * * Similarly, if a tuple is explicitly available at all uses of a constructor, * - The constructor argument type is changed to flatten the tuple type. * - The tuple is passed flat at each ConApp. * - The tuple is reconstructed at each Case target. *) functor Flatten (S: FLATTEN_STRUCTS): FLATTEN = struct open S open Exp Transfer structure Rep = struct structure L = TwoPointLattice (val bottom = "flatten" val top = "don't flatten") open L val isFlat = not o isTop fun fromType t = case Type.deTupleOpt t of NONE => let val r = new () in makeTop r; r end | SOME _ => new () fun fromTypes (ts: Type.t vector): t vector = Vector.map (ts, fromType) val tuplize: t -> unit = makeTop val coerce = op <= fun coerces (rs, rs') = Vector.foreach2 (rs, rs', coerce) val unify = op == fun unifys (rs, rs') = Vector.foreach2 (rs, rs', unify) end fun flatten (Program.T {datatypes, globals, functions, main}) = let val {get = conInfo: Con.t -> {argsTypes: Type.t vector, args: Rep.t vector}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("Flatten.conInfo", Con.layout)) val conArgs = #args o conInfo val {get = funcInfo: Func.t -> {args: Rep.t vector, returns: Rep.t vector option, raises: Rep.t vector option}, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Flatten.funcInfo", Func.layout)) val funcArgs = #args o funcInfo val {get = labelInfo: Label.t -> {args: Rep.t vector}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("Flatten.labelInfo", Label.layout)) val labelArgs = #args o labelInfo val {get = varInfo: Var.t -> {rep: Rep.t, tuple: Var.t vector option ref}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => {rep = let val r = Rep.new () in Rep.tuplize r; r end, tuple = ref NONE})) val fromFormal = fn (x, ty) => let val r = Rep.fromType ty in setVarInfo (x, {rep = r, tuple = ref NONE}) ; r end val fromFormals = fn xtys => Vector.map (xtys, fromFormal) val varRep = #rep o varInfo val varTuple = #tuple o varInfo fun coerce (x: Var.t, r: Rep.t) = Rep.coerce (varRep x, r) fun coerces (xs: Var.t vector, rs: Rep.t vector) = Vector.foreach2 (xs, rs, coerce) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {con, args} => setConInfo (con, {argsTypes = args, args = Vector.map (args, Rep.fromType)}))) val _ = List.foreach (functions, fn f => let val {args, name, raises, returns, ...} = Function.dest f in setFuncInfo (name, {args = fromFormals args, returns = Option.map (returns, Rep.fromTypes), raises = Option.map (raises, Rep.fromTypes)}) end) fun doitStatement (Statement.T {exp, var, ...}) = case exp of Tuple xs => Option.app (var, fn var => setVarInfo (var, {rep = Rep.new (), tuple = ref (SOME xs)})) | ConApp {con, args} => coerces (args, conArgs con) | Var x => setVarInfo (valOf var, varInfo x) | _ => () val _ = Vector.foreach (globals, doitStatement) val _ = List.foreach (functions, fn f => let val {blocks, name, ...} = Function.dest f val {raises, returns, ...} = funcInfo name in Vector.foreach (blocks, fn Block.T {label, args, statements, ...} => (setLabelInfo (label, {args = fromFormals args}) ; Vector.foreach (statements, doitStatement))) ; Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Return xs => (case returns of NONE => Error.bug "Flatten.flatten: return mismatch" | SOME rs => coerces (xs, rs)) | Raise xs => (case raises of NONE => Error.bug "Flatten.flatten: raise mismatch" | SOME rs => coerces (xs, rs)) | Call {func, args, return} => let val {args = funcArgs, returns = funcReturns, raises = funcRaises} = funcInfo func val _ = coerces (args, funcArgs) fun unifyReturns () = case (funcReturns, returns) of (SOME rs, SOME rs') => Rep.unifys (rs, rs') | _ => () fun unifyRaises () = case (funcRaises, raises) of (SOME rs, SOME rs') => Rep.unifys (rs, rs') | _ => () in case return of Return.Dead => () | Return.NonTail {cont, handler} => (Option.app (funcReturns, fn rs => Rep.unifys (rs, labelArgs cont)) ; case handler of Handler.Caller => unifyRaises () | Handler.Dead => () | Handler.Handle handler => Option.app (funcRaises, fn rs => Rep.unifys (rs, labelArgs handler))) | Return.Tail => (unifyReturns (); unifyRaises ()) end | Goto {dst, args} => coerces (args, labelArgs dst) | Case {cases = Cases.Con cases, ...} => Vector.foreach (cases, fn (con, label) => Rep.coerces (conArgs con, labelArgs label)) | _ => ()) end) val _ = Control.diagnostics (fn display => List.foreach (functions, fn f => let val name = Function.name f val {args, raises, returns} = funcInfo name open Layout in display (seq [Func.layout name, str " ", record [("args", Vector.layout Rep.layout args), ("returns", Option.layout (Vector.layout Rep.layout) returns), ("raises", Option.layout (Vector.layout Rep.layout) raises)]]) end)) fun flattenTypes (ts: Type.t vector, rs: Rep.t vector): Type.t vector = Vector.fromList (Vector.fold2 (ts, rs, [], fn (t, r, ts) => if Rep.isFlat r then Vector.fold (Type.deTuple t, ts, op ::) else t :: ts)) val datatypes = Vector.map (datatypes, fn Datatype.T {tycon, cons} => Datatype.T {tycon = tycon, cons = (Vector.map (cons, fn {con, args} => {con = con, args = flattenTypes (args, conArgs con)}))}) fun flattens (xs as xsX: Var.t vector, rs: Rep.t vector) = Vector.fromList (Vector.fold2 (xs, rs, [], fn (x, r, xs) => if Rep.isFlat r then (case !(varTuple x) of SOME ys => Vector.fold (ys, xs, op ::) | _ => (Error.bug (concat ["Flatten.flattens: tuple unavailable: ", (Var.toString x), " ", (Layout.toString (Vector.layout Var.layout xsX))]))) else x :: xs)) fun doitStatement (stmt as Statement.T {var, ty, exp}) = case exp of ConApp {con, args} => Statement.T {var = var, ty = ty, exp = ConApp {con = con, args = flattens (args, conArgs con)}} | _ => stmt val globals = Vector.map (globals, doitStatement) fun doitFunction f = let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f val {args = argsReps, returns = returnsReps, raises = raisesReps} = funcInfo name val newBlocks = ref [] fun doitArgs (args, reps) = let val (args, stmts) = Vector.fold2 (args, reps, ([], []), fn ((x, ty), r, (args, stmts)) => if Rep.isFlat r then let val tys = Type.deTuple ty val xs = Vector.map (tys, fn _ => Var.newNoname ()) val _ = varTuple x := SOME xs val args = Vector.fold2 (xs, tys, args, fn (x, ty, args) => (x, ty) :: args) in (args, Statement.T {var = SOME x, ty = ty, exp = Tuple xs} :: stmts) end else ((x, ty) :: args, stmts)) in (Vector.fromList args, Vector.fromList stmts) end fun doitCaseCon {test, cases, default} = let val cases = Vector.map (cases, fn (c, l) => let val {args, argsTypes} = conInfo c val actualReps = labelArgs l in if Vector.forall2 (args, actualReps, fn (r, r') => Rep.isFlat r = Rep.isFlat r') then (c, l) else (* Coerce from the constructor representation to the * formals the jump expects. *) let val l' = Label.newNoname () (* The formals need to match the type of the con. * The actuals need to match the type of l. *) val (stmts, formals, actuals) = Vector.fold3 (args, actualReps, argsTypes, ([], [], []), fn (r, r', ty, (stmts, formals, actuals)) => if Rep.isFlat r then (* The con is flat *) let val xts = Vector.map (Type.deTuple ty, fn ty => (Var.newNoname (), ty)) val xs = Vector.map (xts, #1) val formals = Vector.fold (xts, formals, op ::) val (stmts, actuals) = if Rep.isFlat r' then (stmts, Vector.fold (xs, actuals, op ::)) else let val x = Var.newNoname () in (Statement.T {var = SOME x, ty = ty, exp = Tuple xs} :: stmts, x :: actuals) end in (stmts, formals, actuals) end else (* The con is tupled *) let val tuple = Var.newNoname () val formals = (tuple, ty) :: formals val (stmts, actuals) = if Rep.isFlat r' then let val xts = Vector.map (Type.deTuple ty, fn ty => (Var.newNoname (), ty)) val xs = Vector.map (xts, #1) val actuals = Vector.fold (xs, actuals, op ::) val stmts = Vector.foldi (xts, stmts, fn (i, (x, ty), stmts) => Statement.T {var = SOME x, ty = ty, exp = Select {tuple = tuple, offset = i}} :: stmts) in (stmts, actuals) end else (stmts, tuple :: actuals) in (stmts, formals, actuals) end) val _ = List.push (newBlocks, Block.T {label = l', args = Vector.fromList formals, statements = Vector.fromList stmts, transfer = Goto {dst = l, args = Vector.fromList actuals}}) in (c, l') end end) in Case {test = test, cases = Cases.Con cases, default = default} end fun doitTransfer transfer = case transfer of Call {func, args, return} => Call {func = func, args = flattens (args, funcArgs func), return = return} | Case {test, cases = Cases.Con cases, default} => doitCaseCon {test = test, cases = cases, default = default} | Goto {dst, args} => Goto {dst = dst, args = flattens (args, labelArgs dst)} | Raise xs => Raise (flattens (xs, valOf raisesReps)) | Return xs => Return (flattens (xs, valOf returnsReps)) | _ => transfer fun doitBlock (Block.T {label, args, statements, transfer}) = let val (args, stmts) = doitArgs (args, labelArgs label) val statements = Vector.map (statements, doitStatement) val statements = Vector.concat [stmts, statements] val transfer = doitTransfer transfer in Block.T {label = label, args = args, statements = statements, transfer = transfer} end val (args, stmts) = doitArgs (args, argsReps) val start' = Label.newNoname () val _ = List.push (newBlocks, Block.T {label = start', args = Vector.new0 (), statements = stmts, transfer = Goto {dst = start, args = Vector.new0 ()}}) val start = start' val _ = Function.dfs (f, fn b => let val _ = List.push (newBlocks, doitBlock b) in fn () => () end) val blocks = Vector.fromList (!newBlocks) val returns = Option.map (returns, fn ts => flattenTypes (ts, valOf returnsReps)) val raises = Option.map (raises, fn ts => flattenTypes (ts, valOf raisesReps)) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, shrink o doitFunction) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/flatten.sig0000644000076600000240000000065011404435623015642 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature FLATTEN_STRUCTS = sig include SHRINK end signature FLATTEN = sig include FLATTEN_STRUCTS val flatten: Program.t -> Program.t end mlton-20100608/mlton/ssa/global.fun0000644000076600000240000000374711404435623015465 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Global (S: GLOBAL_STRUCTS): GLOBAL = struct open S open Exp fun equalss (xs, xs') = Vector.equals (xs, xs', Var.equals) val expEquals = fn (ConApp {con = c, args}, ConApp {con = c', args = args'}) => Con.equals (c, c') andalso equalss (args, args') | (Const c, Const c') => Const.equals (c, c') | (PrimApp {prim = p, targs = t, ...}, PrimApp {prim = p', targs = t', ...}) => let datatype z = datatype Prim.Name.t val n = Prim.name p val n' = Prim.name p' in case (n, n') of (Array_array0Const, Array_array0Const) => Vector.equals (t, t', Type.equals) | _ => false end | (Tuple xs, Tuple xs') => equalss (xs, xs') | _ => false fun make () = let type bind = {var: Var.t, ty: Type.t, exp: Exp.t} val binds: bind list ref = ref [] fun all () = Vector.fromList (List.revMap (!binds, fn {var, ty, exp} => Statement.T {var = SOME var, ty = ty, exp = exp})) before binds := [] val set: (word * bind) HashSet.t = HashSet.new {hash = #1} fun new (ty: Type.t, exp: Exp.t): Var.t = let val hash = hash exp in #var (#2 (HashSet.lookupOrInsert (set, hash, fn (_, {exp = exp', ...}) => expEquals (exp, exp'), fn () => let val x = Var.newString "global" val bind = {var = x, ty = ty, exp = exp} in List.push (binds, bind) ; (hash, bind) end))) end in {new = new, all = all} end end mlton-20100608/mlton/ssa/global.sig0000644000076600000240000000107211404435623015444 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature GLOBAL_STRUCTS = sig include SSA_TREE end signature GLOBAL = sig include GLOBAL_STRUCTS val make: unit -> { new: Type.t * Exp.t -> Var.t, all: unit -> Statement.t vector } end mlton-20100608/mlton/ssa/inline.fun0000644000076600000240000005256211404435623015502 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Inline (S: INLINE_STRUCTS): INLINE = struct open S open Exp Transfer structure Function = struct open Function fun containsCall (f: Function.t): bool = Exn.withEscape (fn escape => (Vector.foreach (Function.blocks f, fn Block.T {transfer, ...} => case transfer of Call _ => escape true | _ => ()) ; false)) fun containsLoop (f: Function.t): bool = let val {get, set, destroy} = Property.destGetSet (Label.plist, Property.initConst false) in Exn.withEscape (fn escape => let val _ = Function.dfs (f, fn (Block.T {label, transfer, ...}) => (set (label, true) ; (case transfer of Goto {dst, ...} => if get dst then escape true else () | _ => ()) ; fn () => set (label, false))) in false end) before (destroy ()) end end structure Size = struct val check : (int * int option) -> bool = fn (_, NONE) => false | (size, SOME size') => size > size' val defaultExpSize : Exp.t -> int = fn ConApp {args, ...} => 1 + Vector.length args | Const _ => 0 | PrimApp {args, ...} => 1 + Vector.length args | Profile _ => 0 | Select _ => 1 + 1 | Tuple xs => 1 + Vector.length xs | Var _ => 0 fun expSize (size, max) (doExp, _) exp = let val size' = doExp exp val size = size + size' in (size, check (size, max)) end fun statementSize (size, max) (doExp, doTransfer) = fn Statement.T {exp, ...} => expSize (size, max) (doExp, doTransfer) exp fun statementsSize (size, max) (doExp, doTransfer) statements = Exn.withEscape (fn escape => Vector.fold (statements, (size, false), fn (statement, (size, check)) => if check then escape (size, check) else statementSize (size, max) (doExp, doTransfer) statement)) val defaultTransferSize = fn Arith {args, ...} => 1 + Vector.length args | Bug => 1 | Call {args, ...} => 1 + Vector.length args | Case {cases, ...} => 1 + Cases.length cases | Goto {args, ...} => 1 + Vector.length args | Raise xs => 1 + Vector.length xs | Return xs => 1 + Vector.length xs | Runtime {args, ...} => 1 + Vector.length args fun transferSize (size, max) (_, doTransfer) transfer = let val size' = doTransfer transfer val size = size + size' in (size, check (size, max)) end fun blockSize (size, max) (doExp, doTransfer) = fn Block.T {statements, transfer, ...} => case statementsSize (size, max) (doExp, doTransfer) statements of (size, true) => (size, true) | (size, false) => transferSize (size, max) (doExp, doTransfer) transfer fun blocksSize (size, max) (doExp, doTransfer) blocks = Exn.withEscape (fn escape => Vector.fold (blocks, (size, false), fn (block, (size, check)) => if check then escape (size, check) else blockSize (size, max) (doExp, doTransfer) block)) fun functionSize (size, max) (doExp, doTransfer) f = blocksSize (size, max) (doExp, doTransfer) (#blocks (Function.dest f)) val default = (defaultExpSize, defaultTransferSize) fun functionGT max = #2 o (functionSize (0, max) default) end local fun 'a make (dontInlineFunc: Function.t * 'a -> bool) (Program.T {functions, ...}, a: 'a): Func.t -> bool = let val {get = shouldInline: Func.t -> bool, set = setShouldInline, ...} = Property.getSetOnce (Func.plist, Property.initConst false) in List.foreach (functions, fn f => if not (Function.mayInline f) orelse dontInlineFunc (f, a) then () else setShouldInline (Function.name f, true)) ; Control.diagnostics (fn display => let open Layout in List.foreach (functions, fn f => let val name = Function.name f val shouldInline = shouldInline name in display (seq [Func.layout name, str ": ", record [("shouldInline", Bool.layout shouldInline)]]) end) end) ; shouldInline end in val leafOnce = make (fn (f, {size}) => Size.functionGT size f orelse Function.containsCall f) val leafOnceNoLoop = make (fn (f, {size}) => Size.functionGT size f orelse Function.containsCall f orelse Function.containsLoop f) end structure Graph = DirectedGraph structure Node = Graph.Node local fun make (dontInline: Function.t -> bool) (Program.T {functions, ...}, {size: int option}) = let val max = size type info = {function: Function.t, node: unit Node.t, shouldInline: bool ref, size: int ref} val {get = funcInfo: Func.t -> info, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("funcInfo", Func.layout)) val {get = nodeFunc: unit Node.t -> Func.t, set = setNodeFunc, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeFunc", Node.layout)) val graph = Graph.new () (* initialize the info for each func *) val _ = List.foreach (functions, fn f => let val name = Function.name f val n = Graph.newNode graph in setNodeFunc (n, name) ; setFuncInfo (name, {function = f, node = n, shouldInline = ref false, size = ref 0}) end) (* Build the call graph. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val {node, ...} = funcInfo name in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, ...} => (ignore o Graph.addEdge) (graph, {from = node, to = #node (funcInfo func)}) | _ => ()) end) (* Compute strongly-connected components. * Then start at the leaves of the call graph and work up. *) val _ = List.foreach (rev (Graph.stronglyConnectedComponents graph), fn scc => case scc of [n] => let val {function, shouldInline, size, ...} = funcInfo (nodeFunc n) in if Function.mayInline function andalso not (dontInline function) then Exn.withEscape (fn escape => let val (n, check) = Size.functionSize (0, max) (Size.defaultExpSize, fn t => case t of Call {func, ...} => let val {shouldInline, size, ...} = funcInfo func in if !shouldInline then !size else escape () end | _ => Size.defaultTransferSize t) function in if check then () else (shouldInline := true ; size := n) end) else () end | _ => ()) val _ = Control.diagnostics (fn display => let open Layout in List.foreach (functions, fn f => let val name = Function.name f val {shouldInline, size, ...} = funcInfo name val shouldInline = !shouldInline val size = !size in display (seq [Func.layout name, str ": ", record [("shouldInline", Bool.layout shouldInline), ("size", Int.layout size)]]) end) end) in ! o #shouldInline o funcInfo end in val leafRepeat = make (fn _ => false) val leafRepeatNoLoop = make (fn f => Function.containsLoop f) end fun nonRecursive (Program.T {functions, ...}, {small: int, product: int}) = let type info = {doesCallSelf: bool ref, function: Function.t, node: unit Node.t, numCalls: int ref, shouldInline: bool ref, size: int ref} val {get = funcInfo: Func.t -> info, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("funcInfo", Func.layout)) val {get = nodeFunc: unit Node.t -> Func.t, set = setNodeFunc, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeFunc", Node.layout)) val graph = Graph.new () (* initialize the info for each func *) val _ = List.foreach (functions, fn f => let val name = Function.name f val n = Graph.newNode graph in setNodeFunc (n, name) ; setFuncInfo (name, {doesCallSelf = ref false, function = f, node = n, numCalls = ref 0, shouldInline = ref false, size = ref 0}) end) (* Update call counts. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val {doesCallSelf, ...} = funcInfo name in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, ...} => let val {numCalls, ...} = funcInfo func in if Func.equals (name, func) then doesCallSelf := true else Int.inc numCalls end | _ => ()) end) fun mayInline (setSize: bool, {function, doesCallSelf, numCalls, size, ...}: info): bool = Function.mayInline function andalso not (!doesCallSelf) andalso let val (n, _) = Size.functionSize (0, NONE) (Size.defaultExpSize, fn t as Call {func, ...} => let val {shouldInline, size, ...} = funcInfo func in if !shouldInline then !size else Size.defaultTransferSize t end | t => Size.defaultTransferSize t) function in if setSize then size := n else () ; (!numCalls - 1) * (n - small) <= product end (* Build the call graph. Do not include functions that we already know * will not be inlined. *) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val info as {node, ...} = funcInfo name in if mayInline (false, info) then Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, ...} => if Func.equals (name, func) then () else (ignore o Graph.addEdge) (graph, {from = node, to = #node (funcInfo func)}) | _ => ()) else () end) (* Compute strongly-connected components. * Then start at the leaves of the call graph and work up. *) val _ = List.foreach (rev (Graph.stronglyConnectedComponents graph), fn [n] => let val info as {shouldInline, ...} = funcInfo (nodeFunc n) in shouldInline := mayInline (true, info) end | _ => ()) val _ = Control.diagnostics (fn display => let open Layout in List.foreach (functions, fn f => let val name = Function.name f val {numCalls, shouldInline, size, ...} = funcInfo name val numCalls = !numCalls val shouldInline = !shouldInline val size = !size in display (seq [Func.layout name, str ": ", record [("numCalls", Int.layout numCalls), ("shouldInline", Bool.layout shouldInline), ("size", Int.layout size)]]) end) end) in ! o #shouldInline o funcInfo end fun transform {program as Program.T {datatypes, globals, functions, main}, shouldInline: Func.t -> bool, inlineIntoMain: bool} = let val {get = funcInfo: Func.t -> {function: Function.t, isCalledByMain: bool ref}, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Inline.funcInfo", Func.layout)) val isCalledByMain: Func.t -> bool = ! o #isCalledByMain o funcInfo val () = List.foreach (functions, fn f => setFuncInfo (Function.name f, {function = f, isCalledByMain = ref false})) val () = Vector.foreach (#blocks (Function.dest (Program.mainFunction program)), fn Block.T {transfer, ...} => case transfer of Transfer.Call {func, ...} => #isCalledByMain (funcInfo func) := true | _ => ()) fun doit (blocks: Block.t vector, return: Return.t) : Block.t vector = let val newBlocks = ref [] val blocks = Vector.map (blocks, fn block as Block.T {label, args, statements, transfer} => let fun new transfer = Block.T {label = label, args = args, statements = statements, transfer = transfer} in case transfer of Call {func, args, return = return'} => let val return = Return.compose (return, return') in if shouldInline func then let local val {name, args, start, blocks, ...} = (Function.dest o Function.alphaRename) (#function (funcInfo func)) val blocks = doit (blocks, return) val _ = List.push (newBlocks, blocks) val name = Label.newString (Func.originalName name) val _ = List.push (newBlocks, Vector.new1 (Block.T {label = name, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}})) in val name = name end in new (Goto {dst = name, args = args}) end else new (Call {func = func, args = args, return = return}) end | Raise xs => (case return of Return.NonTail {handler = Handler.Handle handler, ...} => new (Goto {dst = handler, args = xs}) | _ => block) | Return xs => (case return of Return.NonTail {cont, ...} => new (Goto {dst = cont, args = xs}) | _ => block) | _ => block end) in Vector.concat (blocks::(!newBlocks)) end val shrink = shrinkFunction {globals = globals} val functions = List.fold (functions, [], fn (f, ac) => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f fun keep () = let val blocks = doit (blocks, Return.Tail) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) :: ac end in if Func.equals (name, main) then if inlineIntoMain then keep () else f :: ac else if shouldInline name then if inlineIntoMain orelse not (isCalledByMain name) then ac else keep () else keep () end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end fun inlineLeaf (p, {loops, repeat, size}) = if size = SOME 0 then p else transform {program = p, shouldInline = case (loops, repeat) of (false, false) => leafOnce (p, {size = size}) | (false, true) => leafRepeat (p, {size = size}) | (true, false) => leafOnceNoLoop (p, {size = size}) | (true, true) => leafRepeatNoLoop (p, {size = size}), inlineIntoMain = true} fun inlineNonRecursive (p, arg) = transform {program = p, shouldInline = nonRecursive (p, arg), inlineIntoMain = !Control.inlineIntoMain} end mlton-20100608/mlton/ssa/inline.sig0000644000076600000240000000114011404435623015456 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INLINE_STRUCTS = sig include SHRINK end signature INLINE = sig include INLINE_STRUCTS val inlineLeaf: Program.t * {loops: bool, repeat: bool, size: int option} -> Program.t val inlineNonRecursive: Program.t * {small:int,product:int} -> Program.t end mlton-20100608/mlton/ssa/introduce-loops.fun0000644000076600000240000001106311404435623017341 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Change any toplevel function that only calls itself in tail position * into one with a local loop and no self calls. *) functor IntroduceLoops (S: INTRODUCE_LOOPS_STRUCTS): INTRODUCE_LOOPS = struct open S datatype z = datatype Exp.t datatype z = datatype Transfer.t structure Return = struct open Return fun isTail (z: t): bool = case z of Dead => false | NonTail _ => false | Tail => true end fun introduceLoops (Program.T {datatypes, globals, functions, main}) = let val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val tailCallsItself = ref false val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, return, ...} => if Func.equals (name, func) andalso Return.isTail return then tailCallsItself := true else () | _ => ()) val (args, start, blocks) = if !tailCallsItself then let val _ = Control.diagnostics (fn display => let open Layout in display (Func.layout name) end) val newArgs = Vector.map (args, fn (x, t) => (Var.new x, t)) val loopName = Label.newString "loop" val loopSName = Label.newString "loopS" val blocks = Vector.toListMap (blocks, fn Block.T {label, args, statements, transfer} => let val transfer = case transfer of Call {func, args, return} => if Func.equals (name, func) andalso Return.isTail return then Goto {dst = loopName, args = args} else transfer | _ => transfer in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) val blocks = Vector.fromList (Block.T {label = loopSName, args = Vector.new0 (), statements = Vector.new0 (), transfer = Goto {dst = loopName, args = Vector.map (newArgs, #1)}} :: Block.T {label = loopName, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}} :: blocks) in (newArgs, loopSName, blocks) end else (args, start, blocks) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end) in Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} end end mlton-20100608/mlton/ssa/introduce-loops.sig0000644000076600000240000000070711404435623017336 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature INTRODUCE_LOOPS_STRUCTS = sig include SHRINK end signature INTRODUCE_LOOPS = sig include INTRODUCE_LOOPS_STRUCTS val introduceLoops: Program.t -> Program.t end mlton-20100608/mlton/ssa/known-case.fun0000644000076600000240000012061311404435623016262 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor KnownCase (S: KNOWN_CASE_STRUCTS): KNOWN_CASE = struct open S open Exp Transfer fun mkPost () = let val post = ref [] in {addPost = fn th => List.push (post, th), post = fn () => List.foreach(!post, fn th => th ())} end structure TyconInfo = struct datatype t = T of {cons: Con.t vector} local fun make f (T r) = f r in val cons = make #cons end fun layout (T {cons, ...}) = Layout.record [("cons", Vector.layout Con.layout cons)] end structure ConInfo = struct datatype t = T of {args: Type.t vector, index: int, tycon: Tycon.t} local fun make f (T r) = f r in val args = make #args val index = make #index end fun layout (T {index, ...}) = Layout.record [("index", Int.layout index)] end structure ConValue = struct type w = Var.t ref vector type v = w option type u = v option type t = Con.t * u val equalsW : w * w -> bool = fn (x, y) => Vector.equals (x, y, fn (x, y) => Var.equals (!x, !y)) val layoutW = Vector.layout (Var.layout o !) val layoutV = Option.layout layoutW val layoutU = Option.layout layoutV val layout : t -> Layout.t = Layout.tuple2 (Con.layout, layoutU) val joinV : v * v -> v = fn (SOME x, SOME y) => if equalsW (x, y) then SOME x else NONE | (NONE, _) => NONE | (_, NONE) => NONE val joinU : u * u -> u = fn (SOME x, SOME y) => SOME (joinV (x, y)) | (NONE, y) => y | (x, NONE) => x val join : t * t -> t = fn ((conx, x), (cony, y)) => if Con.equals (conx, cony) then (conx, joinU (x, y)) else Error.bug "KnownCase.ConValue.join" fun newKnown (con, args) : t = (con, SOME (SOME args)) fun newUnknown con : t = (con, SOME NONE) fun new con : t = (con, NONE) fun isTop ((_, x) : t) = isSome x val con : t -> Con.t = fn (conx, _) => conx end structure TyconValue = struct type t = ConValue.t vector val layout : t -> Layout.t = Vector.layout ConValue.layout val join : t * t -> t = fn (x, y) => Vector.map2 (x, y, ConValue.join) fun newKnown (cons, con, args) = Vector.map (cons, fn con' => if Con.equals (con, con') then ConValue.newKnown (con, args) else ConValue.new con') fun newUnknown cons = Vector.map (cons, ConValue.newUnknown) val cons : t -> Con.t vector = fn x => Vector.map (x, ConValue.con) end structure VarInfo = struct datatype t = T of {active: bool ref, tyconValues: TyconValue.t list ref, var: Var.t} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (_, active') = make' #active end fun layout (T {active, tyconValues, var, ...}) = Layout.record [("active", Bool.layout (!active)), ("tyconValues", List.layout TyconValue.layout (!tyconValues)), ("var", Var.layout var)] fun new var = T {active = ref false, tyconValues = ref [], var = var} fun deactivate (T {active, ...}) = active := false fun activate (T {active, ...}) = active := true fun activate' (vi, addPost: (unit -> unit) -> unit) = (addPost (fn () => deactivate vi); activate vi) val active = active' fun tyconValue (T {tyconValues, ...}) = case !tyconValues of h::_ => SOME h | _ => NONE fun popTyconValue (T {tyconValues, ...}) = ignore (List.pop tyconValues) fun pushTyconValue (T {tyconValues, ...}, tcv) = List.push (tyconValues, tcv) fun pushTyconValue' (vi, tcv, addPost) = let val _ = pushTyconValue (vi, tcv) val _ = addPost (fn () => popTyconValue vi) in () end fun joinActiveTyconValue (vi, tcv, addPost, addPost') = if active vi then let val tcv' = valOf (tyconValue vi) in popTyconValue vi; pushTyconValue (vi, TyconValue.join (tcv, tcv')) end else (activate' (vi, addPost'); pushTyconValue' (vi, tcv, addPost)) end structure ReplaceInfo = struct datatype t = T of {replaces: Var.t ref list ref} fun new var = T {replaces = ref [ref var]} fun replace (T {replaces, ...}) = case !replaces of h::_ => h | _ => Error.bug "KnownCase.ReplaceInfo.replace" fun popReplace (T {replaces, ...}) = ignore (List.pop replaces) fun pushReplace (T {replaces, ...}, rep) = List.push (replaces, ref rep) fun pushReplace' (vi, rep, addPost) = let val _ = pushReplace (vi, rep) val _ = addPost (fn () => popReplace vi) in () end fun flipReplace (vi, rep) = let val r = replace vi in !r before (r := rep) end fun flipReplace' (vi, rep, addPost) = let val rep = flipReplace (vi, rep) val _ = addPost (fn () => ignore (flipReplace (vi, rep))) in rep end fun nextReplace' (vi, rep, addPost) = let val rep = flipReplace' (vi, rep, addPost) val _ = pushReplace' (vi, rep, addPost) in () end end structure LabelInfo = struct datatype t = T of {activations: (VarInfo.t * TyconValue.t) list ref, block: Block.t, depth: int ref, pred: Label.t option option ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val block = make #block val (_, depth') = make' #depth end fun layout (T {pred, ...}) = Layout.record [("pred", Option.layout (Option.layout Label.layout) (!pred))] fun new block = T {activations = ref [], block = block, depth = ref 0, pred = ref NONE} fun popDepth (T {depth, ...}) = Int.dec depth fun pushDepth (T {depth, ...}) = Int.inc depth fun pushDepth' (li, addPost) = let val _ = pushDepth li val _ = addPost (fn () => popDepth li) in () end fun addPred (T {pred, ...}, l) = case !pred of NONE => pred := SOME (SOME l) | SOME NONE => () | SOME (SOME l') => if Label.equals (l, l') then () else pred := SOME NONE fun onePred (T {pred, ...}) = case !pred of SOME (SOME _) => true | _ => false fun addActivation (T {activations, ...}, activation) = List.push (activations, activation) fun activate (T {activations, ...}, addPost) = let val {addPost = addPost', post = post'} = mkPost () in List.foreach (!activations, fn (vi, tcv) => VarInfo.joinActiveTyconValue (vi, tcv, addPost, addPost')); post' () end val activate : t * ((unit -> unit) -> unit) -> unit = Trace.trace ("KnownCase.LabelInfo.activate", fn (T {activations, block = Block.T {label, ...}, ...}, _) => let open Layout in seq [Label.layout label, str " ", (List.layout (tuple2 (VarInfo.layout, TyconValue.layout)) (!activations))] end, Layout.ignore) activate end fun simplify (Program.T {globals, datatypes, functions, main}) = let (* restore and shrink *) val restore = restoreFunction {globals = globals} val shrink = shrinkFunction {globals = globals} (* tyconInfo and conInfo *) val {get = tyconInfo: Tycon.t -> TyconInfo.t, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("knownCase.tyconInfo", Tycon.layout)) val {get = conInfo: Con.t -> ConInfo.t, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("knownCase.conInfo", Con.layout)) val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (setTyconInfo (tycon, TyconInfo.T {cons = Vector.map (cons, #con)}); Vector.foreachi (cons, fn (i, {con, args}) => setConInfo (con, ConInfo.T {args = args, index = i, tycon = tycon})))) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val tci = tyconInfo tycon in display (seq [Tycon.layout tycon, str " ", TyconInfo.layout tci, Vector.layout (fn {con, ...} => let val ci = conInfo con in seq [Con.layout con, str " ", ConInfo.layout ci] end) cons]) end) end) fun optimizeTycon _ = true fun optimizeType ty = case Type.dest ty of Type.Datatype tycon => optimizeTycon tycon | _ => false (* varInfo *) val {get = varInfo: Var.t -> VarInfo.t, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn x => VarInfo.new x)) (* replaceInfo *) val {get = replaceInfo: Var.t -> ReplaceInfo.t, ...} = Property.get (Var.plist, Property.initFun (fn x => ReplaceInfo.new x)) fun bindVar' (x, ty, exp, addPost) = case Type.dest ty of Type.Datatype tycon => if optimizeTycon tycon then let val cons = TyconInfo.cons (tyconInfo tycon) val tyconValue = case exp of SOME (ConApp {con, args}) => TyconValue.newKnown (cons, con, Vector.map (args, ReplaceInfo.replace o replaceInfo)) | _ => TyconValue.newUnknown cons in VarInfo.pushTyconValue' (varInfo x, tyconValue, addPost) end else () | _ => () fun bindVarArgs' (args, addPost) = Vector.foreach (args, fn (x, ty) => bindVar' (x, ty, NONE, addPost)) fun bindVarArgs args = bindVarArgs' (args, ignore) fun bindVarStatement' (Statement.T {var, ty, exp}, addPost) = Option.app (var, fn x => bindVar' (x, ty, SOME exp, addPost)) fun bindVarStatements' (statements, addPost) = Vector.foreach (statements, fn statement => bindVarStatement' (statement, addPost)) fun bindVarStatements statements = bindVarStatements' (statements, ignore) val _ = bindVarStatements globals (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (globals, fn Statement.T {var, ...} => Option.app (var, fn x => let val vi = varInfo x in display (seq [Var.layout x, str " ", VarInfo.layout vi]) end)) end) (* labelInfo *) val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("knownCase.labelInfo", Label.layout)) val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelInfo (label, LabelInfo.new block)) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => Transfer.foreachLabel (transfer, fn l => let val li = labelInfo l in LabelInfo.addPred (li, label) end)) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (blocks, fn Block.T {label, ...} => let val li = labelInfo label in display (seq [Label.layout label, str " ", LabelInfo.layout li]) end) end) val newBlocks = ref [] fun addBlock block = List.push (newBlocks, block) fun addNewBlock (block as Block.T {label, ...}) = (setLabelInfo (label, LabelInfo.new block); addBlock block) local val table: {hash: word, transfer: Transfer.t, label: Label.t} HashSet.t = HashSet.new {hash = #hash} in fun newBlock transfer = let val label = Label.newNoname () val block = Block.T {label = label, args = Vector.new0 (), statements = Vector.new0 (), transfer = transfer} val _ = addNewBlock block in label end (* newBlock' isn't used, because it shares blocks that causes * violation of the requirements for profiling information -- * namely that each block correspond to a unique sequence of * source infos at it' start. * * I left the code in case we want to enable it when compiling * without profiling. *) fun newBlock' transfer = let val hash = Transfer.hash transfer val {label, ...} = HashSet.lookupOrInsert (table, hash, fn {transfer = transfer', ...} => Transfer.equals (transfer, transfer'), fn () => {hash = hash, label = newBlock transfer, transfer = transfer}) in label end val _ = newBlock' (* quell unused variable warning *) fun bugBlock () = newBlock Bug end val traceRewriteGoto = Trace.trace ("KnownCase.rewriteGoto", fn {dst, args} => Layout.record [("dst", Label.layout dst), ("args", Vector.layout Var.layout args)], Option.layout (Layout.tuple2 (Vector.layout Statement.layout, Transfer.layout))) val traceRewriteCase = Trace.trace ("KnownCase.rewriteCase", fn {test, cases, default} => Layout.record [("test", Var.layout test), ("cases", Vector.layout (Layout.tuple2 (Con.layout, Label.layout)) cases), ("default", Option.layout Label.layout default)], Option.layout (Layout.tuple2 (Vector.layout Statement.layout, Transfer.layout))) val traceRewriteTransfer = Trace.trace ("KnownCase.rewriteTransfer", Transfer.layout, Option.layout (Layout.tuple2 (Vector.layout Statement.layout, Transfer.layout))) fun rewriteGoto' {dst, args} : (Statement.t vector * Transfer.t) option = let val li = labelInfo dst val Block.T {args = argsDst, statements = statementsDst, transfer = transferDst, ...} = LabelInfo.block li val depthDst = LabelInfo.depth' li in if depthDst <= 2 andalso Vector.fold (statementsDst, 0, fn (Statement.T {exp = Profile _, ...}, i) => i | (_, i) => i + 1) <= 0 then let val {addPost, post} = mkPost () val _ = LabelInfo.pushDepth' (li, addPost) val vars = Vector.map2 (args, argsDst, fn (x, (z, ty)) => (x, Var.newNoname (), z, Var.newNoname (), ty)) val moves1 = if depthDst > 0 then Vector.map (vars, fn (_, _, z, t, ty) => (if optimizeType ty then let val zvi = varInfo z val tvi = varInfo t in VarInfo.pushTyconValue' (tvi, valOf (VarInfo.tyconValue zvi), addPost) end else (); ReplaceInfo.nextReplace' (replaceInfo z, t, addPost); Statement.T {var = SOME t, ty = ty, exp = Var z})) else Vector.new0 () val moves2 = Vector.map (vars, fn (x, t, _, _, ty) => (if optimizeType ty then let val xvi = varInfo x val tvi = varInfo t in VarInfo.pushTyconValue' (tvi, valOf (VarInfo.tyconValue xvi), addPost) end else (); Statement.T {var = SOME t, ty = ty, exp = Var x})) val moves3 = Vector.map (vars, fn (_, t, z, _, ty) => (if optimizeType ty then let val tvi = varInfo t val zvi = varInfo z in VarInfo.pushTyconValue' (zvi, valOf (VarInfo.tyconValue tvi), addPost) end else (); Statement.T {var = SOME z, ty = ty, exp = Var t})) val _ = bindVarStatements' (statementsDst, addPost) in (case rewriteTransfer transferDst of NONE => NONE | SOME (newStatements, newTransfer) => SOME (Vector.concat [moves1, moves2, moves3, statementsDst, newStatements], newTransfer)) before (post ()) end else NONE end and rewriteGoto goto = traceRewriteGoto rewriteGoto' goto and rewriteCase' {test, cases, default} : (Statement.t vector * Transfer.t) option = let val {addPost, post} = mkPost () val testvi = varInfo test val tyconValue as conValues = case VarInfo.tyconValue testvi of SOME tyconValue => tyconValue | _ => Error.bug "KnownCase.rewriteCase: tyconValue" val cons = TyconValue.cons tyconValue val numCons = Vector.length cons datatype z = None | One of (Con.t * ConValue.v) | Many fun doOneSome (con, args) = let val goto = case Vector.peek (cases, fn (con', _) => Con.equals (con, con')) of SOME (_, dst) => {dst = dst, args = Vector.map (args, !)} | NONE => {dst = valOf default, args = Vector.new0 ()} in case rewriteGoto goto of NONE => SOME (Vector.new0 (), Transfer.Goto goto) | sst => sst end val doOneSome = Trace.trace ("KnownCase.doOneSome", Layout.ignore, Layout.ignore) doOneSome fun rewriteDefault conValues' = let val _ = VarInfo.pushTyconValue' (testvi, conValues', addPost) in rewriteGoto {dst = valOf default, args = Vector.new0 ()} end val rewriteDefault = Trace.trace ("KnownCase.rewriteCase.rewriteDefault", Layout.ignore, Layout.ignore) rewriteDefault fun doOneNone con = let fun doit dst = SOME (Vector.new0 (), Case {test = test, cases = Cases.Con (Vector.new1 (con, dst)), default = if numCons = 1 then NONE else SOME (bugBlock ())}) in case Vector.peek (cases, fn (con', _) => Con.equals (con, con')) of SOME (_, dst) => doit dst | NONE => let val args = Vector.map (ConInfo.args (conInfo con), fn ty => let val x = Var.newNoname () val xvi = varInfo x val _ = case Type.dest ty of Type.Datatype tycon => if optimizeTycon tycon then VarInfo.pushTyconValue' (xvi, TyconValue.newUnknown (TyconInfo.cons (tyconInfo tycon)), addPost) else () | _ => () in (x, ty) end) val (xs, _) = Vector.unzip args val conValues' = TyconValue.newKnown (cons, con, Vector.map (xs, ReplaceInfo.replace o replaceInfo)) val label = Label.newNoname () val (statements, transfer) = case rewriteDefault conValues' of SOME sst => sst | NONE => (Vector.new0 (), Goto {dst = valOf default, args = Vector.new0 ()}) val block = Block.T {label = label, args = args, statements = statements, transfer = transfer} val _ = addNewBlock block in doit label end end val doOneNone = Trace.trace ("KnownCase.rewriteCase.doOneNone", Layout.ignore, Layout.ignore) doOneNone fun doMany () = let val usedCons = Array.new (numCons, false) val cases = Vector.keepAllMap (cases, fn (con, dst) => let val conIndex = ConInfo.index (conInfo con) val _ = Array.update (usedCons, conIndex, true) in if ConValue.isTop (Vector.sub (conValues, conIndex)) then SOME (con, dst) else NONE end) val (cases, default) = case default of NONE => (cases, NONE) | SOME dst => let val conValues' = Vector.mapi (cons, fn (i, con) => if Array.sub (usedCons, i) then ConValue.new con else Vector.sub (conValues, i)) fun route (statements, (cases, default)) = if Vector.length statements = 0 then (cases, default) else let fun route' dst = let val Block.T {args, ...} = LabelInfo.block (labelInfo dst) val label = Label.newNoname () val args = Vector.map (args, fn (_, ty) => (Var.newNoname (), ty)) val xs = Vector.map (args, #1) val block = Block.T {label = label, args = args, statements = statements, transfer = Goto {dst = dst, args = xs}} val _ = addNewBlock block in label end in (Vector.map (cases, fn (con, dst) => (con, route' dst)), Option.map (default, route')) end in case rewriteDefault conValues' of SOME (statements, Case {test = test', cases = Cases.Con cases', default = default'}) => if Option.equals (SOME test, Vector.foldr (statements, SOME test', fn (Statement.T _, NONE) => NONE | (Statement.T {var, exp, ...}, SOME test') => if Option.equals (var, SOME test', Var.equals) then case exp of Var test' => SOME test' | _ => NONE else SOME test'), Var.equals) then let val (cases', default') = route (statements, (cases', default')) in (Vector.concat [cases, cases'], default') end else (cases, SOME dst) | SOME (statements, transfer) => let val label = if Vector.length statements = 0 then newBlock transfer else let val label = Label.newNoname () val block = Block.T {label = label, args = Vector.new0 (), statements = statements, transfer = transfer} val _ = addNewBlock block in label end in (cases, SOME label) end | NONE => (cases, SOME dst) end val numCases = Vector.length cases fun doit (cases, default) = SOME (Vector.new0 (), Case {test = test, cases = Cases.Con cases, default = default}) in if numCases = numCons then doit (cases, NONE) else doit (cases, case default of SOME _ => default | NONE => SOME (bugBlock ())) end val doMany = Trace.trace ("KnownCase.rewriteCase.doMany", Layout.ignore, Layout.ignore) doMany in (* (if Vector.forall (conValues, ConValue.isTop) *) (if false then NONE else case Vector.foldi (conValues, None, fn (_, _, Many) => Many | (_, conValue, One ccv) => (case conValue of (_, NONE) => One ccv | (_, SOME _) => Many) | (_, conValue, None) => (case conValue of (_, NONE) => None | (con, SOME cv) => One (con, cv))) of None => SOME (Vector.new0 (), Bug) | One (con, SOME args) => doOneSome (con, args) | One (con, NONE) => doOneNone con | Many => doMany ()) before (post ()) end and rewriteCase casee = traceRewriteCase rewriteCase' casee and rewriteTransfer' (transfer: Transfer.t) : (Statement.t vector * Transfer.t) option = case transfer of Goto {dst, args} => rewriteGoto {dst = dst, args = args} | Case {test, cases = Cases.Con cases, default} => rewriteCase {test = test, cases = cases, default = default} | _ => NONE and rewriteTransfer transfer = traceRewriteTransfer rewriteTransfer' transfer fun activateGoto {dst, args} = let val liDst = labelInfo dst val Block.T {args = argsDst, ...} = LabelInfo.block liDst in if LabelInfo.onePred liDst then Vector.foreach2 (args, argsDst, fn (x, (y, ty)) => if optimizeType ty then let val xvi = varInfo x val yvi = varInfo y val conValues' = valOf (VarInfo.tyconValue xvi) in LabelInfo.addActivation (liDst, (yvi, conValues')) end else ()) else () end fun activateCase {test, cases, default} = let val testvi = varInfo test val tyconValue as conValues = case VarInfo.tyconValue testvi of NONE => Error.bug "KnownCase.activateCase: tyconValue" | SOME tyconValue => tyconValue val cons = TyconValue.cons tyconValue val numCons = Vector.length cons val usedCons = Array.new (numCons, false) in Vector.foreach (cases, fn (con, dst) => let val conIndex = ConInfo.index (conInfo con) val _ = Array.update (usedCons, conIndex, true) val liDst = labelInfo dst val Block.T {args = argsDst, ...} = LabelInfo.block liDst val conValues' = TyconValue.newKnown (cons, con, Vector.map (argsDst, ReplaceInfo.replace o replaceInfo o #1)) in if LabelInfo.onePred liDst then LabelInfo.addActivation (liDst, (testvi, conValues')) else () end); Option.app (default, fn dst => let val liDst = labelInfo dst val conValues' = Vector.mapi (cons, fn (i, con) => if Array.sub (usedCons, i) then ConValue.new con else Vector.sub (conValues, i)) in if LabelInfo.onePred liDst then LabelInfo.addActivation (liDst, (testvi, conValues')) else () end) end fun activateTransfer transfer = case transfer of Goto {dst, args} => activateGoto {dst = dst, args = args} | Case {test, cases = Cases.Con cases, default} => activateCase {test = test, cases = cases, default = default} | _ => () fun rewriteBlock (Block.T {label, args, statements, transfer}, addPost) = let val li = labelInfo label val _ = LabelInfo.pushDepth' (li, addPost) val _ = bindVarArgs' (args, addPost) val _ = LabelInfo.activate (li, addPost) val _ = bindVarStatements' (statements, addPost) val _ = activateTransfer transfer val (statements, transfer) = case rewriteTransfer transfer of NONE => (statements, transfer) | SOME (newStatements, newTransfer) => (Vector.concat [statements,newStatements], newTransfer) in Block.T {label = label, args = args, statements = statements, transfer = transfer} end val rewriteBlock = Trace.trace ("KnownCase.rewriteBlock", Layout.tuple2 (Block.layout, Layout.ignore), Block.layout) rewriteBlock fun doitTree tree = let fun loop (Tree.T (block, children)) = let val {addPost, post} = mkPost () val block = rewriteBlock (block, addPost) in addBlock block ; Vector.foreach (children, loop) ; post () end val _ = loop tree in Vector.fromListRev (!newBlocks) end val _ = bindVarArgs args val blocks = doitTree (Function.dominatorTree f) val f = Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val _ = Control.diagnostics (fn display => display (Function.layout f)) val f = eliminateDeadBlocksFunction f val _ = Control.diagnostics (fn display => display (Function.layout f)) val f = restore f val _ = Control.diagnostics (fn display => display (Function.layout f)) val f = shrink f val _ = Control.diagnostics (fn display => display (Function.layout f)) val _ = Function.clear f in f end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/known-case.sig0000644000076600000240000000065011404435623016252 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature KNOWN_CASE_STRUCTS = sig include RESTORE end signature KNOWN_CASE = sig include KNOWN_CASE_STRUCTS val simplify: Program.t -> Program.t end mlton-20100608/mlton/ssa/local-flatten.fun0000644000076600000240000003004611404435623016742 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor LocalFlatten (S: LOCAL_FLATTEN_STRUCTS): LOCAL_FLATTEN = struct open S open Exp Transfer (* Flatten a jump arg as long as it is only flows to selects and there is * some tuple constructed in this function that flows to it. *) structure ArgInfo = struct datatype t = T of {fromTuple: bool ref, fromForce: t list ref, toSelect: bool ref, toForce: t list ref} fun isFlat (T {fromTuple, toSelect, ...}) = !fromTuple andalso !toSelect val isTupled = not o isFlat fun layout (i: t): Layout.t = Layout.str (if isFlat i then "flat" else "tupled") fun new () = T {fromTuple = ref false, fromForce = ref [], toSelect = ref true, toForce = ref []} fun tuple (T {fromTuple = f, fromForce, ...}) = if !f then () else (f := true; List.foreach (!fromForce, tuple)) fun nonSelect (T {toSelect = t, toForce, ...}) = if !t then (t := false; List.foreach (!toForce, nonSelect)) else () val op <= = fn (lhs as T {fromTuple = f, fromForce, ...}, rhs as T {toSelect = t, toForce, ...}) => let val _ = if !f then tuple rhs else List.push (fromForce, rhs) val _ = if !t then List.push (toForce, lhs) else nonSelect lhs in () end end structure VarInfo = struct datatype t = None | Arg of ArgInfo.t | Tuple end fun flatten (Program.T {globals, datatypes, functions, main}) = let val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst VarInfo.None) type argsInfo = (ArgInfo.t * Type.t) option vector val {get = labelArgs: Label.t -> argsInfo, set = setLabelArgs, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("args", Label.layout)) val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Vector.foreach (blocks, fn Block.T {label, args, ...} => setLabelArgs (label, Vector.map (args, fn (x, t) => if Type.isTuple t then let val i = ArgInfo.new () val _ = setVarInfo (x, VarInfo.Arg i) in SOME (i, t) end else NONE))) fun force (x: Var.t): unit = case varInfo x of VarInfo.Arg i => ArgInfo.nonSelect i | _ => () fun forces (xs: Var.t vector): unit = Vector.foreach (xs, force) fun forceArgs (l: Label.t): unit = Vector.foreach (labelArgs l, fn NONE => () | SOME (i, _) => ArgInfo.nonSelect i) fun visit (Block.T {statements, transfer, ...}): unit -> unit = let val _ = Vector.foreach (statements, fn Statement.T {var, exp, ...} => case exp of ConApp {args, ...} => forces args | PrimApp {args, ...} => forces args | Tuple args => (setVarInfo (valOf var, VarInfo.Tuple) ; forces args) | Var x => force x | _ => ()) val _ = case transfer of Arith {args, overflow, success, ...} => (forces args ; forceArgs overflow ; forceArgs success) | Bug => () | Call {args, return, ...} => (forces args ; Return.foreachLabel (return, forceArgs)) | Case {cases, default, ...} => (Cases.foreach (cases, forceArgs) ; Option.app (default, forceArgs)) | Goto {dst, args} => Vector.foreach2 (args, labelArgs dst, fn (_, NONE) => () | (x, SOME (i, _)) => (case varInfo x of VarInfo.Arg i' => ArgInfo.<= (i', i) | VarInfo.None => () | VarInfo.Tuple => ArgInfo.tuple i)) | Raise xs => forces xs | Return xs => forces xs | Runtime {args, return, ...} => (forces args ; forceArgs return) in fn () => () end val _ = Function.dfs (f, visit) val _ = Control.diagnostics (fn display => let fun doit x = case varInfo x of VarInfo.Arg i => display (let open Layout in seq [Var.layout x, str " ", ArgInfo.layout i] end) | _ => () in Vector.foreach (blocks, fn Block.T {args, statements, ...} => (Vector.foreach(args, doit o #1); Vector.foreach(statements, fn Statement.T {var, ...} => Option.app(var, doit)))) end) fun makeTuple (formals: (Var.t * Type.t) vector, reps: argsInfo) : (Var.t * Type.t) vector * Statement.t list = let val (argss, stmts) = Vector.map2AndFold (formals, reps, [], fn ((x, ty), rep, stmts) => case rep of NONE => (Vector.new1 (x, ty), stmts) | SOME (i, _) => if ArgInfo.isTupled i then (Vector.new1 (x, ty), stmts) else let val vars = Vector.map (Type.deTuple ty, fn ty => (Var.newNoname (), ty)) in (vars, Statement.T {var = SOME x, ty = ty, exp = Tuple (Vector.map (vars, #1))} :: stmts) end) in (Vector.concatV argss, stmts) end fun makeSelects (args: Var.t vector, formals: argsInfo) : Var.t vector * Statement.t list = let val (argss, stmts) = Vector.map2AndFold (args, formals, [], fn (x, formal, stmts) => case formal of NONE => (Vector.new1 x, stmts) | SOME (i, t) => if ArgInfo.isTupled i then (Vector.new1 x, stmts) else let val (vars, stmts) = Vector.foldi (Type.deTuple t, ([], stmts), fn (i, ty, (vars, stmts)) => let val var = Var.newNoname () in (var :: vars, Statement.T {var = SOME var, ty = ty, exp = Select {tuple = x, offset = i}} :: stmts) end) in (Vector.fromListRev vars, stmts) end) in (Vector.concatV argss, stmts) end fun anyFlat (v: argsInfo): bool = Vector.exists (v, fn NONE => false | SOME (i, _) => ArgInfo.isFlat i) val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => let val (args, pre) = let val formals = labelArgs label in if anyFlat formals then makeTuple (args, formals) else (args, []) end val (post, transfer) = case transfer of Goto {dst, args} => let val formals = labelArgs dst in if anyFlat formals then let val (args, stmts) = makeSelects (args, formals) in (stmts, Goto {dst = dst, args = args}) end else ([], transfer) end | _ => ([], transfer) val statements = Vector.concatV (Vector.new3 (Vector.fromList pre, statements, Vector.fromList post)) in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/local-flatten.sig0000644000076600000240000000074211404435623016734 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LOCAL_FLATTEN_STRUCTS = sig include SHRINK end signature LOCAL_FLATTEN = sig include LOCAL_FLATTEN_STRUCTS (* Intraprocedural flattening. *) val flatten: Program.t -> Program.t end mlton-20100608/mlton/ssa/local-ref.fun0000644000076600000240000005175411404435623016072 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor LocalRef (S: LOCAL_REF_STRUCTS): LOCAL_REF = struct open S open Exp Transfer structure Prim = struct open Prim val isReff: 'a t -> bool = fn p => case name p of Name.Ref_ref => true | _ => false end structure FuncLattice = FlatLattice (structure Point = Func) structure GlobalInfo = struct datatype t = T of {isGlobalRef: bool, funcUses: FuncLattice.t} fun layout (T {isGlobalRef, funcUses, ...}) = let open Layout in record [("isGlobalRef", Bool.layout isGlobalRef), ("funcUses", FuncLattice.layout funcUses)] end local fun make f (T r) = f r in val isGlobalRef = make #isGlobalRef val funcUses = make #funcUses end fun new isGlobalRef = T {isGlobalRef = isGlobalRef, funcUses = FuncLattice.new ()} end structure Local = struct structure L = TwoPointLattice (val bottom = "local" val top = "non local") open L val isLocal = isBottom val nonLocal = makeTop end structure VarInfo = struct datatype t = T of {reff: (Label.t * Type.t) option, assigns: Label.t list ref, derefs: Label.t list ref, locall: Local.t, threadCopyCurrent: {assign: bool ref, deref: bool ref}} fun layout (T {reff, assigns, derefs, locall, threadCopyCurrent = {assign, deref, ...}, ...}) = let open Layout in record [("reff", Option.layout (tuple2 (Label.layout, Type.layout)) reff), ("assigns", List.layout Label.layout (!assigns)), ("derefs", List.layout Label.layout (!derefs)), ("locall", Local.layout locall), ("threadCopyCurrent", record [("assign", Bool.layout (!assign)), ("deref", Bool.layout (!deref))])] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val reff = make #reff val (assigns, _) = make' #assigns val (derefs, _) = make' #derefs val locall = make #locall val threadCopyCurrent = make #threadCopyCurrent end val isLocal = Local.isLocal o locall val nonLocal = Local.nonLocal o locall local fun make f = f o threadCopyCurrent fun make' f = (make f, ! o (make f)) in val (threadCopyCurrentAssign,threadCopyCurrentAssign') = make' #assign val (threadCopyCurrentDeref,threadCopyCurrentDeref') = make' #deref end fun new reff: t = T {reff = reff, assigns = ref [], derefs = ref [], locall = let val locall = Local.new () val _ = if isSome reff then () else Local.nonLocal locall in locall end, threadCopyCurrent = {assign = ref false, deref = ref false}} end structure LabelInfo = struct datatype t = T of {reffs: Var.t list ref, assigns: Var.t list ref, derefs: Var.t list ref, preds: Label.t list ref, visited: bool ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (reffs, reffs') = make' #reffs val (assigns, assigns') = make' #assigns val (derefs, derefs') = make' #derefs val (preds, preds') = make' #preds val (visited, visited') = make' #visited end fun new (): t = T {reffs = ref [], assigns = ref [], derefs = ref [], preds = ref [], visited = ref false} end structure Multi = Multi (S) fun eliminate (program: Program.t): Program.t = let val program as Program.T {datatypes, globals, functions, main} = eliminateDeadBlocks program (* Compute multi *) val multi = Control.trace (Control.Detail, "multi") Multi.multi val {usesThreadsOrConts: bool, funcIsMultiUsed: Func.t -> bool, labelDoesThreadCopyCurrent: Label.t -> bool, ...} = multi program (* Initialize globalInfo *) val {get = globalInfo: Var.t -> GlobalInfo.t, set = setGlobalInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => GlobalInfo.new false)) val varFuncUses = GlobalInfo.funcUses o globalInfo val _ = Vector.foreach (globals, fn Statement.T {var, exp, ...} => Option.app (var, fn var => case exp of PrimApp {prim, ...} => if Prim.isReff prim then setGlobalInfo (var, GlobalInfo.new true) else () | _ => ())) (* Compute funcUses *) fun addFunc f x = let val gi = globalInfo x in if GlobalInfo.isGlobalRef gi then ignore (FuncLattice.lowerBound (GlobalInfo.funcUses gi, f)) else () end val dummy = Func.newNoname () val _ = Vector.foreach (globals, fn Statement.T {var, exp, ...} => let fun default () = Exp.foreachVar (exp, addFunc dummy) in case exp of PrimApp {prim, args, ...} => if Prim.isReff prim then ignore (FuncLattice.<= (varFuncUses (valOf var), varFuncUses (Vector.sub (args, 0)))) else default () | _ => default () end) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {statements, transfer, ...} => (Vector.foreach (statements, fn Statement.T {exp, ...} => Exp.foreachVar (exp, addFunc name)) ; Transfer.foreachVar (transfer, addFunc name))) end) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (str "\n\nGlobals:") ; (Vector.foreach (globals, fn Statement.T {var, ...} => Option.app (var, fn x => if GlobalInfo.isGlobalRef (globalInfo x) then display (seq [Var.layout x, str ": ", GlobalInfo.layout (globalInfo x)]) else ()))) end) (* Localize global refs *) val {get = funcInfo: Func.t -> {locals: Statement.t list ref}, ...} = Property.get (Func.plist, Property.initFun (fn _ => {locals = ref []})) val globals = Vector.keepAllMap (globals, fn (s as Statement.T {var, ...}) => case var of NONE => SOME s | SOME x => let val GlobalInfo.T {isGlobalRef, funcUses} = globalInfo x in if not isGlobalRef then SOME s else (case FuncLattice.getPoint funcUses of NONE => SOME s | SOME f => if funcIsMultiUsed f orelse Func.equals (f, dummy) then SOME s else (List.push (#locals (funcInfo f), s) ; NONE)) end) (* restore and shrink *) val restore = restoreFunction {globals = globals} val shrink = shrinkFunction {globals = globals} (* varInfo *) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => VarInfo.new NONE)) fun nonLocal x = VarInfo.nonLocal (varInfo x) fun isLocal x = VarInfo.isLocal (varInfo x) (* labelInfo *) val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("localRef.labelInfo", Label.layout)) fun rewrite (f: Function.t, refs): Function.t = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " LocalRefs: ", List.layout (fn x => seq [Var.layout x, str ": ", VarInfo.layout (varInfo x)]) refs]) end) (* Rewrite. *) fun rewriteStatement (s: Statement.t as Statement.T {exp, var, ...}) = let datatype z = datatype Prim.Name.t in case exp of PrimApp {prim, args, ...} => let fun arg n = Vector.sub (args, n) fun rewriteReffAssign rvar var = let val vi = varInfo rvar in if VarInfo.isLocal vi then Statement.T {var = SOME rvar, ty = #2 (valOf (VarInfo.reff vi)), exp = Var var} else s end fun rewriteReff () = case var of NONE => s | SOME var => rewriteReffAssign var (arg 0) fun rewriteAssign () = rewriteReffAssign (arg 0) (arg 1) fun rewriteDeref rvar = let val vi = varInfo rvar in if VarInfo.isLocal vi then let in Statement.T {var = var, ty = #2 (valOf (VarInfo.reff vi)), exp = Var rvar} end else s end val rewriteDeref = fn () => rewriteDeref (arg 0) in case Prim.name prim of Ref_ref => rewriteReff () | Ref_assign => rewriteAssign () | Ref_deref => rewriteDeref () | _ => s end | _ => s end fun rewriteBlock (Block.T {label, args, statements, transfer}) = let val li = labelInfo label (* Don't need to rewrite the statements * if this block doesn't mention localizable refs. *) val statements = if List.exists (LabelInfo.reffs' li, isLocal) orelse List.exists (LabelInfo.assigns' li, isLocal) orelse List.exists (LabelInfo.derefs' li, isLocal) then Vector.map (statements, rewriteStatement) else statements in Block.T {label = label, args = args, statements = statements, transfer = transfer} end val blocks = Vector.map (blocks, rewriteBlock) val f = Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val f = restore f val f = shrink f in f end val functions = List.revMap (functions, fn f => let val {name, ...} = Function.dest f val {locals, ...} = funcInfo name val locals = !locals val f = if List.isEmpty locals then f else let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val locals = Vector.fromListRev locals val localsLabel = Label.newNoname () val localsBlock = Block.T {label = localsLabel, args = Vector.new0 (), statements = locals, transfer = Goto {dst = start, args = Vector.new0 ()}} val blocks = Vector.concat [Vector.new1 localsBlock, blocks] in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = localsLabel} end (* Find all localizable refs. *) val refs = ref [] fun visitStatement label (Statement.T {var, ty, exp}) = let val li = labelInfo label fun setReff () = Option.app (var, fn var => let val vi = VarInfo.new (SOME (label, Type.deRef ty)) val _ = setVarInfo (var, vi) in List.push (refs, var) ; List.push (LabelInfo.reffs li, var) end) fun setAssign var = (List.push (VarInfo.assigns (varInfo var), label) ; List.push (LabelInfo.assigns li, var)) fun setDeref var = (List.push (VarInfo.derefs (varInfo var), label) ; List.push (LabelInfo.derefs li, var)) fun default () = Exp.foreachVar (exp, nonLocal) datatype z = datatype Prim.Name.t in case exp of PrimApp {prim, args, ...} => let fun arg n = Vector.sub (args, n) in case Prim.name prim of Ref_ref => (setReff (); default ()) | Ref_assign => (setAssign (arg 0); nonLocal (arg 1)) | Ref_deref => setDeref (arg 0) | _ => default () end | _ => default () end fun visitBlock (Block.T {label, statements, transfer, ...}) = let val li = LabelInfo.new () val _ = setLabelInfo (label, li) val _ = Vector.foreach (statements, visitStatement label) val _ = Transfer.foreachVar (transfer, nonLocal) in if usesThreadsOrConts then fn () => Transfer.foreachLabel (transfer, fn l => List.push (LabelInfo.preds (labelInfo l), label)) else fn () => () end val _ = Function.dfs (f, visitBlock) val refs = List.keepAll (!refs, isLocal) (* Thread criteria *) val refs = if usesThreadsOrConts then (List.foreach (refs, fn x => let val vi = varInfo x val def = #1 (valOf (VarInfo.reff vi)) fun doit (threadCopyCurrent, uses) = let val visited = ref [] fun doit' l = let val li = labelInfo l in if LabelInfo.visited' li then () else (List.push (visited, l); LabelInfo.visited li := true; if labelDoesThreadCopyCurrent l then threadCopyCurrent := true else (); if Label.equals (def, l) then () else List.foreach (LabelInfo.preds' li, doit')) end in List.foreach (uses, fn l => List.foreach (LabelInfo.preds' (labelInfo l), doit')) ; List.foreach (!visited, fn l => LabelInfo.visited (labelInfo l) := false) end val _ = doit (VarInfo.threadCopyCurrentAssign vi, !(VarInfo.assigns vi)) val _ = doit (VarInfo.threadCopyCurrentDeref vi, !(VarInfo.derefs vi)) in if VarInfo.threadCopyCurrentAssign' vi andalso VarInfo.threadCopyCurrentDeref' vi then VarInfo.nonLocal vi else () end); List.keepAll (refs, isLocal)) else refs in if 0 < List.length refs then rewrite (f, refs) else (Function.clear f ; (Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " NoLocalRefs"]) end)) ; f) end) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/local-ref.sig0000644000076600000240000000072211404435623016051 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LOCAL_REF_STRUCTS = sig include RESTORE end signature LOCAL_REF = sig include LOCAL_REF_STRUCTS (* Local ref elimination. *) val eliminate: Program.t -> Program.t end mlton-20100608/mlton/ssa/loop-invariant.fun0000644000076600000240000001615711404435623017166 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * Remove loop invariant args to local loops. * fun loop (x, y) = ... loop (x, z) ... * * becomes * * fun loop (x, y') = * let fun loop' (y) = ... loop' (z) ... * in loop' (y') * end *) functor LoopInvariant (S: LOOP_INVARIANT_STRUCTS): LOOP_INVARIANT = struct open S open Exp Transfer fun loopInvariant (Program.T {globals, datatypes, functions, main}) = let val shrink = shrinkFunction {globals = globals} fun simplifyFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val {get = labelInfo: Label.t -> {callsSelf: bool ref, visited: bool ref, invariant: (Var.t * bool ref) vector, newLabel: Label.t option ref}, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("LoopInvariant.labelInfo", Label.layout)) val _ = Vector.foreach (blocks, fn Block.T {label, args, ...} => setLabelInfo (label, {callsSelf = ref false, visited = ref false, invariant = Vector.map (args, fn (x, _) => (x, ref true)), newLabel = ref NONE})) fun visit (Block.T {label, transfer, ...}): unit -> unit = let val {visited, ...} = labelInfo label val _ = visited := true val _ = case transfer of Goto {dst, args} => let val {callsSelf, visited, invariant, ...} = labelInfo dst in if !visited then (callsSelf := true ; Vector.foreach2 (args, invariant, fn (x, (y, b)) => if !b andalso not (Var.equals (x, y)) then b := false else ())) else () end | _ => () in fn () => visited := false end val _ = Function.dfs (f, visit) fun remove (xs: 'a vector, invariant: ('b * bool ref) vector) : 'a vector = Vector.keepAllMap2 (xs, invariant, fn (x, (_, b)) => if !b then NONE else SOME x) val newBlocks = ref [] fun visit (Block.T {label, args, statements, transfer}) : unit -> unit = let val {callsSelf, invariant, newLabel, ...} = labelInfo label val _ = if !callsSelf andalso Vector.exists (invariant, ! o #2) then newLabel := SOME (Label.new label) else () val transfer = case transfer of Goto {dst, args} => let val {invariant, newLabel, ...} = labelInfo dst in case !newLabel of NONE => transfer | SOME dst' => Goto {dst = dst', args = remove (args, invariant)} end | _ => transfer val (args, statements, transfer) = case !newLabel of NONE => (args, statements, transfer) | SOME label' => let val _ = Control.diagnostic (fn () => let open Layout in seq [Label.layout label, str " -> ", Label.layout label'] end) val (outerFormals, innerFormals, innerActuals) = Vector.foldr2 (args, invariant, ([], [], []), fn ((x, t), (_, b), (ofs, ifs, ias)) => if !b then ((x, t) :: ofs, ifs, ias) else let val x' = Var.new x in ((x', t) :: ofs, (x, t) :: ifs, x' :: ias) end) in List.push (newBlocks, Block.T {label = label', args = Vector.fromList innerFormals, statements = statements, transfer = transfer}) ; (Vector.fromList outerFormals, Vector.new0 (), Goto {dst = label', args = Vector.fromList innerActuals}) end val _ = List.push (newBlocks, Block.T {label = label, args = args, statements = statements, transfer = transfer}) in fn () => newLabel := NONE end val _ = Function.dfs (f, visit) val blocks = Vector.fromList (!newBlocks) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end val program = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, simplifyFunction), main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/loop-invariant.sig0000644000076600000240000000070311404435623017146 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature LOOP_INVARIANT_STRUCTS = sig include SHRINK end signature LOOP_INVARIANT = sig include LOOP_INVARIANT_STRUCTS val loopInvariant: Program.t -> Program.t end mlton-20100608/mlton/ssa/multi.fun0000644000076600000240000004012111404435623015342 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Defn: A label is exactly-multi-threaded if it may be executed by two different threads during some run of the program. The initial call to main counts as one thread. Defn: A label is actually-multi-used if it may be executed more than once during the execution of the program. *) functor Multi (S: MULTI_STRUCTS): MULTI = struct open S open Exp Transfer structure Graph = DirectedGraph local open Graph in structure Node = Node end structure Calls = struct datatype t = T of value ref and value = Zero | One | Many fun new (): t = T (ref Zero) fun inc (T r) = case !r of Zero => r := One | _ => r := Many val isMany = fn (T (ref Many)) => true | _ => false end structure ThreadCopyCurrent = struct structure L = TwoPointLattice (val bottom = "false" val top = "true") open L val force = makeTop val does = isTop val when = addHandler end structure MultiThreaded = struct structure L = TwoPointLattice (val bottom = "false" val top = "true") open L val force = makeTop val is = isTop val when = addHandler end structure MultiUsed = struct structure L = TwoPointLattice (val bottom = "false" val top = "true") open L val force = makeTop val is = isTop val when = addHandler end structure FuncInfo = struct datatype t = T of {calls: Calls.t, threadCopyCurrent: ThreadCopyCurrent.t, multiThreaded: MultiThreaded.t, multiUsed: MultiUsed.t} local fun make f (T r) = f r in val calls = make #calls val threadCopyCurrent = make #threadCopyCurrent val multiThreaded = make #multiThreaded val multiUsed = make #multiUsed end fun new (): t = T {calls = Calls.new (), threadCopyCurrent = ThreadCopyCurrent.new (), multiUsed = MultiUsed.new (), multiThreaded = MultiThreaded.new ()} end structure LabelInfo = struct datatype t = T of {threadCopyCurrent: ThreadCopyCurrent.t, multiThreaded: MultiThreaded.t, multiUsed: MultiUsed.t} local fun make f (T r) = f r in val threadCopyCurrent = make #threadCopyCurrent val multiThreaded = make #multiThreaded val multiUsed = make #multiUsed end fun new (): t = T {threadCopyCurrent = ThreadCopyCurrent.new (), multiThreaded = MultiThreaded.new (), multiUsed = MultiUsed.new ()} end structure VarInfo = struct datatype t = T of {multiThreaded: MultiThreaded.t, multiUsed: MultiUsed.t} local fun make f (T r) = f r in val multiThreaded = make #multiThreaded val multiUsed = make #multiUsed end fun new (): t = T {multiThreaded = MultiThreaded.new (), multiUsed = MultiUsed.new ()} end fun multi (p as Program.T {functions, main, ...}) = let val usesThreadsOrConts = Program.hasPrim (p, fn p => case Prim.name p of Prim.Name.Thread_switchTo => true | _ => false) (* funcNode *) val {get = funcNode: Func.t -> unit Node.t, set = setFuncNode, rem = remFuncNode, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Multi.funcNode", Func.layout)) (* nodeFunction *) val {get = nodeFunction: unit Node.t -> Function.t, set = setNodeFunction, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("Multi.nodeFunc", Node.layout)) (* funcInfo *) val {get = funcInfo: Func.t -> FuncInfo.t, ...} = Property.get (Func.plist, Property.initFun (fn _ => FuncInfo.new ())) (* labelInfo *) val {get = labelInfo: Label.t -> LabelInfo.t, ...} = Property.get (Label.plist, Property.initFun (fn _ => LabelInfo.new ())) (* varInfo *) val {get = varInfo: Var.t -> VarInfo.t, ...} = Property.get (Var.plist, Property.initFun (fn _ => VarInfo.new ())) (* construct call graph * compute calls * compute threadCopyCurrent *) val G = Graph.new () fun newNode () = Graph.newNode G fun addEdge edge = ignore (Graph.addEdge (G, edge)) val _ = List.foreach (functions, fn f => let val n = newNode () in setFuncNode (Function.name f, n) ; setNodeFunction (n, f) end) val _ = Calls.inc (FuncInfo.calls (funcInfo main)) val _ = List.foreach (functions, fn f => let val {name = f, blocks, ...} = Function.dest f val fi = funcInfo f in Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val li = labelInfo label in case transfer of Call {func = g, ...} => let val gi = funcInfo g in Calls.inc (FuncInfo.calls gi) ; addEdge {from = funcNode f, to = funcNode g} ; if usesThreadsOrConts then ThreadCopyCurrent.when (FuncInfo.threadCopyCurrent gi, fn () => (ThreadCopyCurrent.force (LabelInfo.threadCopyCurrent li) ; ThreadCopyCurrent.force (FuncInfo.threadCopyCurrent fi))) else () end | Runtime {prim, ...} => if usesThreadsOrConts andalso (case Prim.name prim of Prim.Name.Thread_copyCurrent => true | _ => false) then (ThreadCopyCurrent.force (LabelInfo.threadCopyCurrent li) ; ThreadCopyCurrent.force (FuncInfo.threadCopyCurrent fi)) else () | _ => () end) end) val () = Graph.removeDuplicateEdges G val rec forceMultiThreadedVar = fn x => let val vi = varInfo x in MultiThreaded.force (VarInfo.multiThreaded vi) ; MultiUsed.force (VarInfo.multiUsed vi) end val rec forceMultiUsedVar = fn x => let val vi = varInfo x in MultiUsed.force (VarInfo.multiUsed vi) end val rec forceMultiThreadedFunc = fn f => let val fi = funcInfo f in MultiThreaded.force (FuncInfo.multiThreaded fi) ; MultiUsed.force (FuncInfo.multiUsed fi) end val rec forceMultiUsedFunc = fn f => let val fi = funcInfo f in MultiUsed.force (FuncInfo.multiUsed fi) end val rec forceMultiThreadedBlock = fn Block.T {label, args, statements, transfer} => let val li = labelInfo label in if MultiThreaded.is (LabelInfo.multiThreaded li) then () else (MultiThreaded.force (LabelInfo.multiThreaded li) ; MultiUsed.force (LabelInfo.multiUsed li) ; Vector.foreach (args, forceMultiThreadedVar o #1) ; Vector.foreach (statements, fn Statement.T {var, ...} => Option.app (var, forceMultiThreadedVar)) ; Transfer.foreachFunc (transfer, forceMultiThreadedFunc)) end val rec forceMultiThreadedBlockDFS = fn controlFlow as {graph = _, labelNode, nodeBlock} => fn block as Block.T {label, transfer, ...} => let val li = labelInfo label in if MultiThreaded.is (LabelInfo.multiThreaded li) then () else (forceMultiThreadedBlock block ; Transfer.foreachLabel (transfer, fn l => forceMultiThreadedBlockDFS controlFlow (nodeBlock (labelNode l)))) end val rec forceMultiUsedBlock = fn Block.T {label, args, statements, transfer} => let val li = labelInfo label in if MultiUsed.is (LabelInfo.multiUsed li) then () else (MultiUsed.force (LabelInfo.multiUsed li) ; Vector.foreach (args, forceMultiUsedVar o #1) ; Vector.foreach (statements, fn Statement.T {var, ...} => Option.app (var, forceMultiUsedVar)) ; Transfer.foreachFunc (transfer, forceMultiUsedFunc)) end val rec visitBlock = fn controlFlow as {graph = _, labelNode, nodeBlock} => fn Block.T {label, transfer, ...} => if ThreadCopyCurrent.does (LabelInfo.threadCopyCurrent (labelInfo label)) then Transfer.foreachLabel (transfer, fn l => forceMultiThreadedBlockDFS controlFlow (nodeBlock (labelNode l))) else () val rec visitForceMultiUsedBlock = fn controlFlow => fn block => (forceMultiUsedBlock block ; visitBlock controlFlow block) val rec forceMultiThreadedFunc = fn f => let val {args, blocks, ...} = Function.dest f in Vector.foreach (args, forceMultiThreadedVar o #1) ; Vector.foreach (blocks, forceMultiThreadedBlock) end val rec forceMultiUsedFunc = fn f => let val {args, blocks, ...} = Function.dest f in Vector.foreach (args, forceMultiUsedVar o #1) ; Vector.foreach (blocks, forceMultiUsedBlock) end fun visitFunc multiUsed f = let val _ = remFuncNode (Function.name f) val fi = funcInfo (Function.name f) val _ = if multiUsed orelse Calls.isMany (FuncInfo.calls fi) then MultiUsed.force (FuncInfo.multiUsed fi) else () in if MultiThreaded.is (FuncInfo.multiThreaded fi) then forceMultiThreadedFunc f else if MultiUsed.is (FuncInfo.multiUsed fi) then (forceMultiUsedFunc f ; if usesThreadsOrConts then let val _ = MultiThreaded.when (FuncInfo.multiThreaded fi, fn () => forceMultiThreadedFunc f) val controlFlow = Function.controlFlow f in Vector.foreach (Function.blocks f, visitBlock controlFlow) end else ()) else if usesThreadsOrConts then let val _ = MultiThreaded.when (FuncInfo.multiThreaded fi, fn () => forceMultiThreadedFunc f) val _ = MultiUsed.when (FuncInfo.multiUsed fi, fn () => forceMultiUsedFunc f) val controlFlow as {graph, nodeBlock, ...} = Function.controlFlow f in List.foreach (Graph.stronglyConnectedComponents graph, fn [] => () | [n] => if Node.hasEdge {from = n, to = n} then visitForceMultiUsedBlock controlFlow (nodeBlock n) else visitBlock controlFlow (nodeBlock n) | ns => List.foreach (ns, fn n => visitForceMultiUsedBlock controlFlow (nodeBlock n))) end else let val _ = MultiUsed.when (FuncInfo.multiUsed fi, fn () => forceMultiUsedFunc f) val {graph, nodeBlock, ...} = Function.controlFlow f in List.foreach (Graph.stronglyConnectedComponents graph, fn [] => () | [n] => if Node.hasEdge {from = n, to = n} then forceMultiUsedBlock (nodeBlock n) else () | ns => List.foreach (ns, fn n => forceMultiUsedBlock (nodeBlock n))) end end val _ = List.foreach (Graph.stronglyConnectedComponents G, fn [] => () | [n] => visitFunc (Node.hasEdge {from = n, to = n}) (nodeFunction n) | ns => List.foreach (ns, fn n => visitFunc true (nodeFunction n))) (* val _ = Control.diagnostics (fn display => let open Layout in display (Layout.str "\n\nMulti:") ; display (seq [Layout.str "usesThreadsOrConts: ", Bool.layout usesThreadsOrConts]) ; List.foreach (functions, fn f => let val {name = f, blocks, ...} = Function.dest f in display (seq [Func.layout f, str ": ", FuncInfo.layout (funcInfo f)]) ; Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str ": ", LabelInfo.layout (labelInfo label)])) end) end) *) in { usesThreadsOrConts = usesThreadsOrConts, funcDoesThreadCopyCurrent = ThreadCopyCurrent.does o FuncInfo.threadCopyCurrent o funcInfo, funcIsMultiThreaded = MultiThreaded.is o FuncInfo.multiThreaded o funcInfo, funcIsMultiUsed = MultiUsed.is o FuncInfo.multiUsed o funcInfo, labelDoesThreadCopyCurrent = ThreadCopyCurrent.does o LabelInfo.threadCopyCurrent o labelInfo, labelIsMultiThreaded = MultiThreaded.is o LabelInfo.multiThreaded o labelInfo, labelIsMultiUsed = MultiUsed.is o LabelInfo.multiUsed o labelInfo, varIsMultiDefed = MultiUsed.is o VarInfo.multiUsed o varInfo } end end mlton-20100608/mlton/ssa/multi.sig0000644000076600000240000000456611404435623015351 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MULTI_STRUCTS = sig include SSA_TREE end signature MULTI = sig include MULTI_STRUCTS val multi: Program.t -> {(* Program has an occurence of Thread_switchTo. *) usesThreadsOrConts: bool, (* usesThreadsOrConts == true * and the func directly or indirectly invokes * Thread_copyCurrent. *) funcDoesThreadCopyCurrent: Func.t -> bool, (* usesThreadsOrConts == true * and the func may be called by two * different threads during some run of the * program. *) funcIsMultiThreaded: Func.t -> bool, (* The func may be called more than once * during some run of the program. *) funcIsMultiUsed: Func.t -> bool, (* usesThreadsOrConts == true * and the label's block's transfer is * either Runtime {prim, ...} * with prim = Thread_copyCurrent * or Call {func, ...} * with funcDoesThreadCopyCurrent(func) == true. *) labelDoesThreadCopyCurrent: Label.t -> bool, (* usesTheadsOrConts == true * and the label may be executed by two * different threads during some run of the * program. *) labelIsMultiThreaded: Label.t -> bool, (* The label may be executed more than once * during some run of the program. *) labelIsMultiUsed: Label.t -> bool, (* The var may be defined more than once * during some run of the program; * i.e., varIsMultiDefed(x) = * labelIsMultiUsed(label of x's def) * when x is defined in a block; *) varIsMultiDefed: Var.t -> bool} end mlton-20100608/mlton/ssa/n-point-lattice.fun0000644000076600000240000000633111404435623017224 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor NPointLattice (S: N_POINT_LATTICE_STRUCTS): N_POINT_LATTICE = struct open S val N = List.length names - 1 structure Set = DisjointSet type value = int * (unit -> unit) AppendList.t ref List.t datatype t = T of value Set.t fun value (T s) = Set.! s fun toString e = case value e of (n, _) => List.nth (names, n) val layout = Layout.str o toString fun new (): t = T (Set.singleton (0, List.duplicate (N, fn () => ref AppendList.empty))) fun equals (T s, T s') = Set.equals (s, s') fun whenN (s, n', h') = case value s of (n, hss) => if n' < 0 orelse n' > N then Error.bug "NPointLattice.whenN" else if n >= n' then h' () else let val hs = List.nth (hss, n' - n - 1) in hs := AppendList.cons (h', !hs) end fun isN (s, n') = case value s of (n, _) => if n' < 0 orelse n' > N then Error.bug "NPointLattice.isN" else n = n' fun up (T s) = case Set.! s of (n, hss) => if n = N then () else (Set.:= (s, (n + 1, tl hss)) ; AppendList.foreach (!(hd hss), fn h => h ())) fun makeN (s, n') = case value s of (n, _) => if n' < 0 orelse n' > N then Error.bug "NPointLattice.makeN" else if n >= n' then () else (up s ; makeN (s, n')) fun from <= to = if equals (from, to) then () else case (value from, value to) of ((n,hss), (n',_)) => (makeN (to, n) ; List.foreachi (hss, fn (i,hs) => if n + i + 1 > n' then hs := AppendList.cons (fn () => makeN (to, n + i + 1), !hs) else ())) fun == (T s, T s') = if Set.equals (s, s') then () else let val e = Set.! s val e' = Set.! s' val _ = Set.union (s, s') in case (e, e') of ((n,hss), (n',hss')) => let val n'' = Int.max (n, n') fun doit (n, hss) = let val rec drop = fn (hss, 0: Int.t) => hss | (hs::hss, n) => (AppendList.foreach (!hs, fn h => h ()) ; drop (hss, n - 1)) | ([], _) => Error.bug "NPointLattice.==" in drop (hss, n'' - n) end val hss = doit (n, hss) val hss' = doit (n', hss') val hss'' = List.map2 (hss, hss', fn (hs, hs') => ref (AppendList.append (!hs, !hs'))) in Set.:= (s, (n'', hss'')) end end end mlton-20100608/mlton/ssa/n-point-lattice.sig0000644000076600000240000000160511404435623017215 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature N_POINT_LATTICE_STRUCTS = sig (* pretty print names *) val names: string list end signature N_POINT_LATTICE = sig include N_POINT_LATTICE_STRUCTS type t val <= : t * t -> unit (* force rhs to be up-ed if lhs is *) val == : t * t -> unit (* force lhs and rhs to be the same *) val isN: t * int -> bool val layout: t -> Layout.t val makeN: t * int -> unit val new: unit -> t (* a new 0 *) val up: t -> unit (* handler will be run once iff value becomes gte N *) val whenN: t * int * (unit -> unit) -> unit end mlton-20100608/mlton/ssa/poly-equal.fun0000644000076600000240000006417511404435623016317 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PolyEqual (S: POLY_EQUAL_STRUCTS): POLY_EQUAL = struct open S (* * This pass implements polymorphic equality. * * For each datatype tycon and vector type, it builds an equality function and * translates calls to MLton_equal into calls to that function. * * Also generates calls to primitives intInfEqual and wordEqual. * * For tuples, it does the equality test inline. I.E. it does not create * a separate equality function for each tuple type. * * All equality functions are only created if necessary, i.e. if equality * is actually used at a type. * * Optimizations: * - For datatype tycons that are enumerations, do not build a case dispatch, * just use eq, since you know the backend will represent these as ints. * - Deep equality always does an eq test first. * - If one argument to = is a constant and the type will get translated to * an IntOrPointer, then just use eq instead of the full equality. This is * important for implementing code like the following efficiently: * if x = 0 ... (where x is an IntInf.int) * * Also convert pointer equality on scalar types to type specific primitives. *) open Exp Transfer structure Dexp = struct open DirectExp fun add (e1: t, e2: t, s): t = primApp {prim = Prim.wordAdd s, targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.word s} fun conjoin (e1: t, e2: t): t = casee {test = e1, cases = Con (Vector.new2 ({con = Con.truee, args = Vector.new0 (), body = e2}, {con = Con.falsee, args = Vector.new0 (), body = falsee})), default = NONE, ty = Type.bool} fun disjoin (e1: t, e2:t): t = casee {test = e1, cases = Con (Vector.new2 ({con = Con.truee, args = Vector.new0 (), body = truee}, {con = Con.falsee, args = Vector.new0 (), body = e2})), default = NONE, ty = Type.bool} fun wordEqual (e1: t, e2: t, s): t = primApp {prim = Prim.wordEqual s, targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.bool} end fun polyEqual (Program.T {datatypes, globals, functions, main}) = let val {get = funcInfo: Func.t -> {hasEqual: bool}, set = setFuncInfo, ...} = Property.getSet (Func.plist, Property.initConst {hasEqual = false}) val {get = labelInfo: Label.t -> {hasEqual: bool}, set = setLabelInfo, ...} = Property.getSet (Label.plist, Property.initConst {hasEqual = false}) val {get = varInfo: Var.t -> {isConst: bool}, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst {isConst = false}) val {get = tyconInfo: Tycon.t -> {isEnum: bool, cons: {con: Con.t, args: Type.t vector} vector}, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("PolyEqual.tyconInfo", Tycon.layout)) val isEnum = #isEnum o tyconInfo val tyconCons = #cons o tyconInfo val {get = getTyconEqualFunc: Tycon.t -> Func.t option, set = setTyconEqualFunc, ...} = Property.getSet (Tycon.plist, Property.initConst NONE) val {get = getVectorEqualFunc: Type.t -> Func.t option, set = setVectorEqualFunc, destroy = destroyVectorEqualFunc} = Property.destGetSet (Type.plist, Property.initConst NONE) val returns = SOME (Vector.new1 Type.bool) val seqIndexWordSize = WordSize.seqIndex () val seqIndexTy = Type.word seqIndexWordSize val newFunctions: Function.t list ref = ref [] fun newFunction z = List.push (newFunctions, Function.profile (Function.new z, SourceInfo.polyEqual)) fun equalTyconFunc (tycon: Tycon.t): Func.t = case getTyconEqualFunc tycon of SOME f => f | NONE => let val name = Func.newString (concat ["equal_", Tycon.originalName tycon]) val _ = setTyconEqualFunc (tycon, SOME name) val ty = Type.datatypee tycon val arg1 = (Var.newNoname (), ty) val arg2 = (Var.newNoname (), ty) val args = Vector.new2 (arg1, arg2) val darg1 = Dexp.var arg1 val darg2 = Dexp.var arg2 val cons = tyconCons tycon val body = Dexp.disjoin (Dexp.eq (Dexp.var arg1, Dexp.var arg2, ty), Dexp.casee {test = darg1, ty = Type.bool, default = (if Vector.exists (cons, fn {args, ...} => 0 = Vector.length args) then SOME Dexp.falsee else NONE), cases = Dexp.Con (Vector.keepAllMap (cons, fn {con, args} => if 0 = Vector.length args then NONE else let fun makeArgs () = Vector.map (args, fn ty => (Var.newNoname (), ty)) val xs = makeArgs () val ys = makeArgs () in SOME {con = con, args = xs, body = Dexp.casee {test = darg2, ty = Type.bool, default = if 1 = Vector.length cons then NONE else SOME Dexp.falsee, cases = Dexp.Con (Vector.new1 {con = con, args = ys, body = Vector.fold2 (xs, ys, Dexp.truee, fn ((x, ty), (y, _), de) => Dexp.conjoin (de, equal (x, y, ty)))})}} end))}) val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} in name end and vectorEqualFunc (ty: Type.t): Func.t = case getVectorEqualFunc ty of SOME f => f | NONE => let (* Build two functions, one that checks the lengths and the * other that loops. *) val name = Func.newString "vectorEqual" val _ = setVectorEqualFunc (ty, SOME name) val loop = Func.newString "vectorEqualLoop" val vty = Type.vector ty local val vec1 = (Var.newNoname (), vty) val vec2 = (Var.newNoname (), vty) val args = Vector.new2 (vec1, vec2) val dvec1 = Dexp.var vec1 val dvec2 = Dexp.var vec2 val len1 = (Var.newNoname (), seqIndexTy) val dlen1 = Dexp.var len1 val len2 = (Var.newNoname (), seqIndexTy) val dlen2 = Dexp.var len2 val body = let fun length dvec = Dexp.primApp {prim = Prim.vectorLength, targs = Vector.new1 ty, args = Vector.new1 dvec, ty = Type.word seqIndexWordSize} in Dexp.disjoin (Dexp.eq (dvec1, dvec2, vty), Dexp.lett {decs = [{var = #1 len1, exp = length dvec1}, {var = #1 len2, exp = length dvec2}], body = Dexp.conjoin (Dexp.wordEqual (dlen1, dlen2, seqIndexWordSize), Dexp.call {func = loop, args = (Vector.new4 (dvec1, dvec2, dlen1, Dexp.word (WordX.zero seqIndexWordSize))), ty = Type.bool})}) end val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} end local val vec1 = (Var.newNoname (), vty) val vec2 = (Var.newNoname (), vty) val len = (Var.newNoname (), seqIndexTy) val i = (Var.newNoname (), seqIndexTy) val args = Vector.new4 (vec1, vec2, len, i) val dvec1 = Dexp.var vec1 val dvec2 = Dexp.var vec2 val dlen = Dexp.var len val di = Dexp.var i val body = let fun sub (dvec, di) = Dexp.primApp {prim = Prim.vectorSub, targs = Vector.new1 ty, args = Vector.new2 (dvec, di), ty = ty} val args = Vector.new4 (dvec1, dvec2, dlen, Dexp.add (di, Dexp.word (WordX.one seqIndexWordSize), seqIndexWordSize)) in Dexp.disjoin (Dexp.wordEqual (di, dlen, seqIndexWordSize), Dexp.conjoin (equalExp (sub (dvec1, di), sub (dvec2, di), ty), Dexp.call {args = args, func = loop, ty = Type.bool})) end val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = loop, raises = NONE, returns = returns, start = start} end in name end and equalExp (e1: Dexp.t, e2: Dexp.t, ty: Type.t): Dexp.t = Dexp.name (e1, fn x1 => Dexp.name (e2, fn x2 => equal (x1, x2, ty))) and equal (x1: Var.t, x2: Var.t, ty: Type.t): Dexp.t = let val dx1 = Dexp.var (x1, ty) val dx2 = Dexp.var (x2, ty) fun prim (p, targs) = Dexp.primApp {prim = p, targs = targs, args = Vector.new2 (dx1, dx2), ty = Type.bool} fun eq () = prim (Prim.eq, Vector.new1 ty) fun hasConstArg () = #isConst (varInfo x1) orelse #isConst (varInfo x2) in case Type.dest ty of Type.Array _ => eq () | Type.CPointer => prim (Prim.cpointerEqual, Vector.new0 ()) | Type.Datatype tycon => if isEnum tycon orelse hasConstArg () then eq () else Dexp.call {func = equalTyconFunc tycon, args = Vector.new2 (dx1, dx2), ty = Type.bool} | Type.IntInf => if hasConstArg () then eq () else prim (Prim.intInfEqual, Vector.new0 ()) | Type.Real rs => let val ws = WordSize.fromBits (RealSize.bits rs) fun toWord dx = Dexp.primApp {prim = Prim.realCastToWord (rs, ws), targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word ws} in Dexp.wordEqual (toWord dx1, toWord dx2, ws) end | Type.Ref _ => eq () | Type.Thread => eq () | Type.Tuple tys => let val max = Vector.length tys - 1 (* test components i, i+1, ... *) fun loop (i: int): Dexp.t = if i > max then Dexp.truee else let val ty = Vector.sub (tys, i) fun select dx = Dexp.select {tuple = dx, offset = i, ty = ty} in Dexp.conjoin (equalExp (select dx1, select dx2, ty), loop (i + 1)) end in loop 0 end | Type.Vector ty => Dexp.call {func = vectorEqualFunc ty, args = Vector.new2 (dx1, dx2), ty = Type.bool} | Type.Weak _ => eq () | Type.Word ws => prim (Prim.wordEqual ws, Vector.new0 ()) end val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => setTyconInfo (tycon, {isEnum = Vector.forall (cons, fn {args, ...} => Vector.isEmpty args), cons = cons})) fun setBind (Statement.T {exp, var, ...}) = let fun const () = case var of NONE => () | SOME x => setVarInfo (x, {isConst = true}) in case exp of Const c => (case c of Const.IntInf i => if Const.SmallIntInf.isSmall i then const () else () | Const.Word _ => const () | _ => ()) | ConApp {args, ...} => if Vector.isEmpty args then const () else () | _ => () end val _ = Vector.foreach (globals, setBind) val () = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {label, statements, ...} => let fun setHasEqual () = (setFuncInfo (name, {hasEqual = true}) ; setLabelInfo (label, {hasEqual = true})) in Vector.foreach (statements, fn stmt as Statement.T {exp, ...} => (setBind stmt; case exp of PrimApp {prim, ...} => (case Prim.name prim of Prim.Name.MLton_eq => setHasEqual () | Prim.Name.MLton_equal => setHasEqual () | _ => ()) | _ => ())) end) end) fun doit blocks = let val blocks = Vector.fold (blocks, [], fn (block as Block.T {label, args, statements, transfer}, blocks) => if not (#hasEqual (labelInfo label)) then block::blocks else let fun finish ({label, args, statements}, transfer) = Block.T {label = label, args = args, statements = Vector.fromListRev statements, transfer = transfer} val (blocks, las) = Vector.fold (statements, (blocks, {label = label, args = args, statements = []}), fn (stmt as Statement.T {exp, var, ...}, (blocks, las as {label, args, statements})) => let fun normal () = (blocks, {label = label, args = args, statements = stmt::statements}) fun adds ss = (blocks, {label = label, args = args, statements = ss @ statements}) in case exp of PrimApp {prim, targs, args, ...} => (case (Prim.name prim, Vector.length targs) of (Prim.Name.MLton_eq, 1) => (case Type.dest (Vector.sub (targs, 0)) of Type.CPointer => let val cp0 = Vector.sub (args, 0) val cp1 = Vector.sub (args, 1) val cpointerEqStmt = Statement.T {var = var, ty = Type.bool, exp = Exp.PrimApp {prim = Prim.cpointerEqual, targs = Vector.new0 (), args = Vector.new2 (cp0,cp1)}} in adds [cpointerEqStmt] end | Type.Real rs => let val ws = WordSize.fromBits (RealSize.bits rs) val wt = Type.word ws val r0 = Vector.sub (args, 0) val r1 = Vector.sub (args, 1) val w0 = Var.newNoname () val w1 = Var.newNoname () fun realCastToWordStmt (r, w) = Statement.T {var = SOME w, ty = wt, exp = Exp.PrimApp {prim = Prim.realCastToWord (rs, ws), targs = Vector.new0 (), args = Vector.new1 r}} val wordEqStmt = Statement.T {var = var, ty = Type.bool, exp = Exp.PrimApp {prim = Prim.wordEqual ws, targs = Vector.new0 (), args = Vector.new2 (w0,w1)}} in adds [wordEqStmt, realCastToWordStmt (r1, w1), realCastToWordStmt (r0, w0)] end | Type.Word ws => let val w0 = Vector.sub (args, 0) val w1 = Vector.sub (args, 1) val wordEqStmt = Statement.T {var = var, ty = Type.bool, exp = Exp.PrimApp {prim = Prim.wordEqual ws, targs = Vector.new0 (), args = Vector.new2 (w0,w1)}} in adds [wordEqStmt] end | _ => normal ()) | (Prim.Name.MLton_equal, 1) => let val ty = Vector.sub (targs, 0) fun arg i = Vector.sub (args, i) val l = Label.newNoname () val (start',bs') = Dexp.linearizeGoto (equal (arg 0, arg 1, ty), Handler.Dead, l) in (finish (las, Goto {dst = start', args = Vector.new0 ()}) :: (bs' @ blocks), {label = l, args = Vector.new1 (valOf var, Type.bool), statements = []}) end | _ => normal ()) | _ => normal () end) in finish (las, transfer) :: blocks end) in Vector.fromList blocks end val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val f = if #hasEqual (funcInfo name) then Function.new {args = args, blocks = doit blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} else f val () = Function.clear f in f end) val program = Program.T {datatypes = datatypes, globals = globals, functions = (!newFunctions) @ functions, main = main} val _ = destroyVectorEqualFunc () val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/poly-equal.sig0000644000076600000240000000066411404435623016302 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature POLY_EQUAL_STRUCTS = sig include SHRINK end signature POLY_EQUAL = sig include POLY_EQUAL_STRUCTS val polyEqual: Program.t -> Program.t end mlton-20100608/mlton/ssa/poly-hash.fun0000644000076600000240000007751611404435623016136 0ustar mtfstaff(* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PolyHash (S: POLY_HASH_STRUCTS): POLY_HASH = struct open S (* * This pass implements polymorphic, structural hashing. * * For each datatype tycon and vector type, it builds a hashing function and * translates calls to MLton_hash into calls to that function. * * For tuples, it does the hashing inline. I.E. it does not create * a separate hashing function for each tuple type. * * All hashing functions are only created if necessary, i.e. if hashing * is actually used at a type. * * Optimizations: *) open Exp Transfer structure Dexp = struct open DirectExp fun wordFromWord (w: word, ws: WordSize.t): t = word (WordX.fromIntInf (Word.toIntInf w, ws)) fun shiftInt i = word (WordX.fromIntInf (i, WordSize.shiftArg)) fun shiftBits b = shiftInt (Bits.toIntInf b) local fun mk prim = fn (e1: t, e2: t, s) => primApp {prim = prim s, targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.word s} in val add = mk Prim.wordAdd val andb = mk Prim.wordAndb val rshift = mk (fn s => Prim.wordRshift (s, {signed = false})) val xorb = mk Prim.wordXorb end local fun mk prim = fn (e1: t, e2: t, s, sg) => primApp {prim = prim (s, sg), targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.word s} in val mul = mk Prim.wordMul end fun wordEqual (e1: t, e2: t, s): t = primApp {prim = Prim.wordEqual s, targs = Vector.new0 (), args = Vector.new2 (e1, e2), ty = Type.bool} end structure Hash = struct val resWordSize = WordSize.word32 val resTy = Type.word resWordSize fun mkWordBytes {stateTy: Type.t, workWordSize: WordSize.t, combByte: Dexp.t * Dexp.t -> Dexp.t, mix: Dexp.t -> Dexp.t} = let val workBits = WordSize.bits workWordSize val workTy = Type.word workWordSize fun wordBytes (st,w,ws) = let fun extdW w = if WordSize.equals (ws, workWordSize) then w else Dexp.primApp {prim = Prim.wordExtdToWord (ws, workWordSize, {signed = false}), targs = Vector.new0 (), args = Vector.new1 w, ty = workTy} val mask = (Dexp.word o WordX.resize) (WordX.allOnes WordSize.word8, workWordSize) fun loop (st, w, b) = if Bits.<= (b, Bits.zero) then st else let val dst0 = st val w0 = Var.newNoname () val dw0 = Dexp.var (w0, workTy) val bw = Var.newNoname () val dbw = Dexp.var (bw, workTy) val st1 = Var.newNoname () val dst1 = Dexp.var (st1, stateTy) val st2 = Var.newNoname () val dst2 = Dexp.var (st2, stateTy) in Dexp.lett {decs = [{var = w0, exp = w}, {var = bw, exp = Dexp.andb (dw0, mask, workWordSize)}, {var = st1, exp = combByte (dst0, dbw)}, {var = st2, exp = mix dst1}], body = loop (dst2, Dexp.rshift (dw0, Dexp.shiftBits Bits.inWord8, workWordSize), Bits.- (b, Bits.inWord8))} end fun lp (st, w, b) = if Bits.<= (b, Bits.zero) then st else let val dst0 = st val w0 = Var.newNoname () val dw0 = Dexp.var (w0, Type.word ws) val ew = Var.newNoname () val dew = Dexp.var (ew, workTy) val loopBits = Bits.min (b, workBits) val st1 = Var.newNoname () val dst1 = Dexp.var (st1, stateTy) in Dexp.lett {decs = [{var = w0, exp = w}, {var = ew, exp = extdW dw0}, {var = st1, exp = loop (dst0, dew, loopBits)}], body = lp (dst1, Dexp.rshift (dw0, Dexp.shiftBits workBits, ws), Bits.- (b, workBits))} end val st0 = Var.newNoname () val dst0 = Dexp.var (st0, stateTy) in Dexp.lett {decs = [{var = st0, exp = st}], body = lp (dst0, w, WordSize.bits ws)} end in wordBytes end (* (* Jenkins hash function * http://en.wikipedia.org/wiki/Jenkins_hash_function (20100315) *) val {stateTy: Type.t, init: unit -> Dexp.t, wordBytes: Dexp.t * Dexp.t * WordSize.t -> Dexp.t, fini: Dexp.t -> Dexp.t} = let val stateWordSize = resWordSize val stateTy = Type.word stateWordSize val workWordSize = resWordSize val workTy = Type.word workWordSize local fun mk prim = fn (w1, w2) => prim (w1, w2, stateWordSize) in val add = mk Dexp.add val lshift = mk Dexp.lshift val rshift = mk Dexp.rshift val xorb = mk Dexp.xorb end fun init () = Dexp.word (WordX.zero stateWordSize) fun combByte (hexp, wexp) = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val w0 = Var.newNoname () val dw0 = Dexp.var (w0, workTy) val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = w0, exp = wexp}, {var = h1, exp = add (dh0, dw0)}], body = dh1} end fun mix hexp = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) val h2 = Var.newNoname () val dh2 = Dexp.var (h2, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = h1, exp = add (dh0, lshift (dh0, Dexp.shiftInt 10))}, {var = h2, exp = xorb (dh1, rshift (dh1, Dexp.shiftInt 6))}], body = dh2} end val wordBytes = mkWordBytes {stateTy = stateTy, workWordSize = workWordSize, combByte = combByte, mix = mix} fun fini hexp = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) val h2 = Var.newNoname () val dh2 = Dexp.var (h2, stateTy) val h3 = Var.newNoname () val dh3 = Dexp.var (h3, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = h1, exp = add (dh0, lshift (dh0, Dexp.shiftInt 3))}, {var = h2, exp = xorb (dh1, rshift (dh1, Dexp.shiftInt 11))}, {var = h3, exp = add (dh2, lshift (dh2, Dexp.shiftInt 15))}], body = dh3} end in {stateTy = stateTy, init = init, wordBytes = wordBytes, fini = fini} end *) (* FNV-1a hash function * http://en.wikipedia.org/wiki/Fowler-Noll-Vo_hash_function (20100315) *) val {stateTy: Type.t, init: unit -> Dexp.t, wordBytes: Dexp.t * Dexp.t * WordSize.t -> Dexp.t, fini: Dexp.t -> Dexp.t} = let val stateWordSize = resWordSize val stateTy = Type.word stateWordSize val workWordSize = resWordSize val workTy = Type.word workWordSize local fun mk prim = fn (w1, w2) => prim (w1, w2, stateWordSize) in val mul = mk (fn (w1,w2,s) => Dexp.mul (w1,w2,s,{signed = false})) val xorb = mk Dexp.xorb end val fnv_prime = WordX.fromIntInf (16777619, stateWordSize) val fnv_offset_bias = WordX.fromIntInf (2166136261, stateWordSize) fun init () = Dexp.word fnv_offset_bias fun combByte (hexp, wexp) = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val w0 = Var.newNoname () val dw0 = Dexp.var (w0, workTy) val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = w0, exp = wexp}, {var = h1, exp = xorb (dh0, dw0)}], body = dh1} end fun mix hexp = let val h0 = Var.newNoname () val dh0 = Dexp.var (h0, stateTy) val p = Dexp.word fnv_prime val h1 = Var.newNoname () val dh1 = Dexp.var (h1, stateTy) in Dexp.lett {decs = [{var = h0, exp = hexp}, {var = h1, exp = mul (dh0, p)}], body = dh1} end val wordBytes = mkWordBytes {stateTy = stateTy, workWordSize = workWordSize, combByte = combByte, mix = mix} fun fini hexp = hexp in {stateTy = stateTy, init = init, wordBytes = wordBytes, fini = fini} end fun wordBytesFromWord (st: Dexp.t, w:word, ws: WordSize.t) = wordBytes (st, Dexp.wordFromWord (w, ws), ws) end fun polyHash (Program.T {datatypes, globals, functions, main}) = let val {get = funcInfo: Func.t -> {hasHash: bool}, set = setFuncInfo, ...} = Property.getSet (Func.plist, Property.initConst {hasHash = false}) val {get = labelInfo: Label.t -> {hasHash: bool}, set = setLabelInfo, ...} = Property.getSet (Label.plist, Property.initConst {hasHash = false}) val {get = tyconInfo: Tycon.t -> {cons: {con: Con.t, args: Type.t vector} vector}, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("PolyHash.info", Tycon.layout)) val tyconCons = #cons o tyconInfo val {get = getHashFunc: Type.t -> Func.t option, set = setHashFunc, destroy = destroyHashFunc} = Property.destGetSet (Type.plist, Property.initConst NONE) val {get = getTyconHashFunc: Tycon.t -> Func.t option, set = setTyconHashFunc, ...} = Property.getSet (Tycon.plist, Property.initConst NONE) val {get = getVectorHashFunc: Type.t -> Func.t option, set = setVectorHashFunc, destroy = destroyVectorHashFunc} = Property.destGetSet (Type.plist, Property.initConst NONE) val returns = SOME (Vector.new1 Hash.stateTy) val seqIndexWordSize = WordSize.seqIndex () val seqIndexTy = Type.word seqIndexWordSize val newFunctions: Function.t list ref = ref [] fun newFunction z = List.push (newFunctions, Function.profile (Function.new z, SourceInfo.polyHash)) fun hashTyconFunc (tycon: Tycon.t): Func.t = case getTyconHashFunc tycon of SOME f => f | NONE => let val name = Func.newString (concat ["hash_", Tycon.originalName tycon]) val _ = setTyconHashFunc (tycon, SOME name) val ty = Type.datatypee tycon val st = (Var.newNoname (), Hash.stateTy) val x = (Var.newNoname (), ty) val args = Vector.new2 (st, x) val dst = Dexp.var st val dx = Dexp.var x val cons = tyconCons tycon val body = Dexp.casee {test = dx, ty = Hash.stateTy, default = NONE, cases = (Dexp.Con o Vector.map) (cons, fn {con, args} => let val xs = Vector.map (args, fn ty => (Var.newNoname (), ty)) in {con = con, args = xs, body = Vector.fold (xs, Hash.wordBytesFromWord (dst, Con.hash con, WordSize.word32), fn ((x,ty), dstate) => hashExp (dstate, Dexp.var (x, ty), ty))} end)} val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} in name end and vectorHashFunc (ty: Type.t): Func.t = case getVectorHashFunc ty of SOME f => f | NONE => let (* Build two functions, one that hashes the length and the * other that loops. *) val name = Func.newString "vectorHash" val _ = setVectorHashFunc (ty, SOME name) val loop = Func.newString "vectorHashLoop" val vty = Type.vector ty local val st = (Var.newNoname (), Hash.stateTy) val vec = (Var.newNoname (), vty) val args = Vector.new2 (st, vec) val dst = Dexp.var st val dvec = Dexp.var vec val len = (Var.newNoname (), seqIndexTy) val dlen = Dexp.var len val body = Dexp.lett {decs = [{var = #1 len, exp = Dexp.primApp {prim = Prim.vectorLength, targs = Vector.new1 ty, args = Vector.new1 dvec, ty = seqIndexTy}}], body = Dexp.call {func = loop, args = (Vector.new4 (Hash.wordBytes (dst, dlen, seqIndexWordSize), dvec, dlen, Dexp.word (WordX.zero seqIndexWordSize))), ty = Hash.stateTy}} val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} end local val st = (Var.newNoname (), Hash.stateTy) val vec = (Var.newNoname (), vty) val len = (Var.newNoname (), seqIndexTy) val i = (Var.newNoname (), seqIndexTy) val args = Vector.new4 (st, vec, len, i) val dst = Dexp.var st val dvec = Dexp.var vec val dlen = Dexp.var len val di = Dexp.var i val body = let val args = Vector.new4 (hashExp (dst, Dexp.primApp {prim = Prim.vectorSub, targs = Vector.new1 ty, args = Vector.new2 (dvec, di), ty = ty}, ty), dvec, dlen, Dexp.add (di, Dexp.word (WordX.one seqIndexWordSize), seqIndexWordSize)) in Dexp.casee {test = Dexp.wordEqual (di, dlen, seqIndexWordSize), ty = Hash.stateTy, default = NONE, cases = (Dexp.Con o Vector.new2) ({con = Con.truee, args = Vector.new0 (), body = dst}, {con = Con.falsee, args = Vector.new0 (), body = Dexp.call {args = args, func = loop, ty = Hash.stateTy}})} end val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks in val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = loop, raises = NONE, returns = returns, start = start} end in name end and hashExp (st: Dexp.t, x: Dexp.t, ty: Type.t): Dexp.t = Dexp.name (st, fn st => Dexp.name (x, fn x => hash (st, x, ty))) and hash (st: Var.t, x: Var.t, ty: Type.t): Dexp.t = let val dst = Dexp.var (st, Hash.stateTy) val dx = Dexp.var (x, ty) fun stateful () = Hash.wordBytesFromWord (dst, Type.hash ty, WordSize.word32) val body = case Type.dest ty of Type.Array _ => stateful () | Type.CPointer => let val ws = WordSize.cpointer () val toWord = Dexp.primApp {prim = Prim.cpointerToWord, targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word ws} in Hash.wordBytes (dst, toWord, ws) end | Type.Datatype tycon => Dexp.call {func = hashTyconFunc tycon, args = Vector.new2 (dst, dx), ty = Hash.stateTy} | Type.IntInf => let val sws = WordSize.smallIntInfWord () val bws = WordSize.bigIntInfWord () val toWord = Dexp.primApp {prim = Prim.intInfToWord, targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word sws} val toVector = Dexp.primApp {prim = Prim.intInfToVector, targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.vector (Type.word bws)} val w = Var.newNoname () val dw = Dexp.var (w, Type.word sws) val one = Dexp.word (WordX.one sws) in Dexp.lett {decs = [{var = w, exp = toWord}], body = Dexp.casee {test = Dexp.wordEqual (Dexp.andb (dw, one, sws), one, sws), ty = Hash.stateTy, default = NONE, cases = (Dexp.Con o Vector.new2) ({con = Con.truee, args = Vector.new0 (), body = Hash.wordBytes (dst, dw, sws)}, {con = Con.falsee, args = Vector.new0 (), body = Dexp.call {func = vectorHashFunc (Type.word bws), args = Vector.new2 (dst, toVector), ty = Hash.stateTy}})}} end | Type.Real rs => let val ws = WordSize.fromBits (RealSize.bits rs) val toWord = Dexp.primApp {prim = Prim.realCastToWord (rs, ws), targs = Vector.new0 (), args = Vector.new1 dx, ty = Type.word ws} in Hash.wordBytes (dst, toWord, ws) end | Type.Ref _ => stateful () | Type.Thread => stateful () | Type.Tuple tys => let val max = Vector.length tys - 1 (* hash components i, i+1, ... *) fun loop (i: int, dst): Dexp.t = if i > max then dst else let val ty = Vector.sub (tys, i) val select = Dexp.select {tuple = dx, offset = i, ty = ty} in loop (i + 1, hashExp (dst, select, ty)) end in loop (0, dst) end | Type.Vector ty => Dexp.call {func = vectorHashFunc ty, args = Vector.new2 (dst, dx), ty = Hash.stateTy} | Type.Weak _ => stateful () | Type.Word ws => Hash.wordBytes (dst, dx, ws) in body end fun hashFunc (ty: Type.t): Func.t = case getHashFunc ty of SOME f => f | NONE => let val name = Func.newString "hash" val _ = setHashFunc (ty, SOME name) val x = (Var.newNoname (), ty) val args = Vector.new1 x val sti = Var.newNoname () val dsti = Dexp.var (sti, Hash.stateTy) val dx = Dexp.var x val stf = Var.newNoname () val dstf = Dexp.var (stf, Hash.stateTy) val w = Var.newNoname () val dw = Dexp.var (w, Hash.resTy) val body = Dexp.lett {decs = [{var = sti, exp = Hash.init ()}, {var = stf, exp = hashExp (dsti, dx, ty)}, {var = w, exp = Hash.fini dstf}], body = dw} val (start, blocks) = Dexp.linearize (body, Handler.Caller) val blocks = Vector.fromList blocks val _ = newFunction {args = args, blocks = blocks, mayInline = true, name = name, raises = NONE, returns = returns, start = start} in name end val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => setTyconInfo (tycon, {cons = cons})) val () = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {label, statements, ...} => let fun setHasHash () = (setFuncInfo (name, {hasHash = true}) ; setLabelInfo (label, {hasHash = true})) in Vector.foreach (statements, fn Statement.T {exp, ...} => (case exp of PrimApp {prim, ...} => (case Prim.name prim of Prim.Name.MLton_hash => setHasHash () | _ => ()) | _ => ())) end) end) fun doit blocks = let val blocks = Vector.fold (blocks, [], fn (block as Block.T {label, args, statements, transfer}, blocks) => if not (#hasHash (labelInfo label)) then block::blocks else let fun finish ({label, args, statements}, transfer) = Block.T {label = label, args = args, statements = Vector.fromListRev statements, transfer = transfer} val (blocks, las) = Vector.fold (statements, (blocks, {label = label, args = args, statements = []}), fn (stmt as Statement.T {exp, var, ...}, (blocks, las as {label, args, statements})) => let fun normal () = (blocks, {label = label, args = args, statements = stmt::statements}) in case exp of PrimApp {prim, targs, args, ...} => (case (Prim.name prim, Vector.length targs) of (Prim.Name.MLton_hash, 1) => let val ty = Vector.sub (targs, 0) val x = Vector.sub (args, 0) val l = Label.newNoname () in (finish (las, Call {args = Vector.new1 x, func = hashFunc ty, return = Return.NonTail {cont = l, handler = Handler.Caller}}) :: blocks, {label = l, args = Vector.new1 (valOf var, Hash.resTy), statements = []}) end | _ => normal ()) | _ => normal () end) in finish (las, transfer) :: blocks end) in Vector.fromList blocks end val functions = List.revMap (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val f = if #hasHash (funcInfo name) then Function.new {args = args, blocks = doit blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} else f val () = Function.clear f in f end) val program = Program.T {datatypes = datatypes, globals = globals, functions = (!newFunctions) @ functions, main = main} val _ = destroyHashFunc () val _ = destroyVectorHashFunc () val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/poly-hash.sig0000644000076600000240000000066011404435623016112 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature POLY_HASH_STRUCTS = sig include SHRINK end signature POLY_HASH = sig include POLY_HASH_STRUCTS val polyHash: Program.t -> Program.t end mlton-20100608/mlton/ssa/prepasses.fun0000644000076600000240000002015111404435623016216 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PrePasses (S: PREPASSES_STRUCTS): PREPASSES = struct open S open Exp Transfer (* A critical edge is one that connects a block with two or more * succesors to one with two or more predecessors. * This prepass breaks all critical edges by inserting an eta-block. * For some analyses and transformations, simply ensuring the unique * successor or predecessor property is sufficient. (For example, see * the comments at the end of "Conditional Constant Propagation" in * Section 19.3 of Appel's "Modern Compiler Implementation in ML".) * However, passes that require critical edges to be broken in order * to accomodate code motion (for example, PRE), should also break an * edge that connects a block with non-functional control transfer to * one with two or more predecessors. *) structure CriticalEdges = struct structure LabelInfo = struct datatype t = T of {args: (Var.t * Type.t) vector, inDeg: int ref, mustBreak: bool, outDeg: int ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val (inDeg', inDeg) = make' #inDeg val mustBreak = make #mustBreak val (outDeg', outDeg) = make' #outDeg end fun new (args, mustBreak): t = T {args = args, inDeg = ref 0, mustBreak = mustBreak, outDeg = ref 0} end fun breakFunction (f, {codeMotion: bool}) = let val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("CriticalEdges.labelInfo", Label.layout)) val argsLabel = LabelInfo.args o labelInfo val inDeg = LabelInfo.inDeg o labelInfo val inDeg' = LabelInfo.inDeg' o labelInfo val mustBreak = LabelInfo.mustBreak o labelInfo val outDeg = LabelInfo.outDeg o labelInfo val outDeg' = LabelInfo.outDeg' o labelInfo val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Vector.foreach (blocks, fn Block.T {args, label, transfer, ...} => let val mustBreak = case transfer of Arith _ => true | Call _ => true | Runtime _ => true | _ => false in setLabelInfo (label, LabelInfo.new (args, mustBreak)) end) val _ = Vector.foreach (blocks, fn Block.T {label, transfer, ...} => let val outDeg' = outDeg' label fun doit l = (Int.inc outDeg' ; Int.inc (inDeg' l)) in Transfer.foreachLabel (transfer, doit) end) val newBlocks = ref [] fun newBlock l = let val l' = Label.newString "L_crit" val args = Vector.map (argsLabel l, fn (x, ty) => (Var.new x, ty)) val _ = List.push (newBlocks, Block.T {args = args, label = l', statements = Vector.new0 (), transfer = Goto {dst = l, args = Vector.map(args, #1)}}) in l' end val blocks = Vector.map (blocks, fn b as Block.T {args, label, statements, transfer} => if (codeMotion andalso mustBreak label) orelse outDeg label >= 2 then let fun doit t = Transfer.replaceLabel (t, fn l => if inDeg l > 1 then newBlock l else l) in Block.T {args = args, label = label, statements = statements, transfer = doit transfer} end else b) in Function.new {args = args, blocks = Vector.concat [blocks, Vector.fromList (!newBlocks)], mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun break (Program.T {datatypes, globals, functions, main}, codeMotion) = let val functions = List.revMap (functions, fn f => breakFunction (f, codeMotion)) in Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} end end val breakCriticalEdgesFunction = CriticalEdges.breakFunction (* quell unused warning *) val _ = breakCriticalEdgesFunction val breakCriticalEdges = CriticalEdges.break structure DeadBlocks = struct fun eliminateFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val {get = isLive, set = setLive, rem} = Property.getSetOnce (Label.plist, Property.initConst false) val _ = Function.dfs (f, fn Block.T {label, ...} => (setLive (label, true) ; fn () => ())) val f = if Vector.forall (blocks, isLive o Block.label) then f else let val blocks = Vector.keepAll (blocks, isLive o Block.label) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val _ = Vector.foreach (blocks, rem o Block.label) in f end fun eliminate (Program.T {datatypes, globals, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, eliminateFunction), main = main} end val eliminateDeadBlocksFunction = DeadBlocks.eliminateFunction val eliminateDeadBlocks = DeadBlocks.eliminate structure Order = struct fun orderFunctions (p as Program.T {globals, datatypes, main, ...}) = let val functions = ref [] val () = Program.dfs (p, fn f => let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f val blocks = ref [] val () = Function.dfs (f, fn b => (List.push (blocks, b) ; fn () => ())) val f = Function.new {args = args, blocks = Vector.fromListRev (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} in List.push (functions, f) ; fn () => () end) in Program.T {datatypes = datatypes, globals = globals, functions = List.rev (!functions), main = main} end end val orderFunctions = Order.orderFunctions structure Reverse = struct fun reverseFunctions (Program.T {globals, datatypes, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.rev functions, main = main} end val reverseFunctions = Reverse.reverseFunctions end mlton-20100608/mlton/ssa/prepasses.sig0000644000076600000240000000276211404435623016220 0ustar mtfstaff(* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PREPASSES_STRUCTS = sig include TYPE_CHECK end signature PREPASSES = sig include PREPASSES_STRUCTS (* A critical edge is one that connects a block with two or more * succesors to one with two or more predecessors. * This prepass breaks all critical edges by inserting an eta-block. * For some analyses and transformations, simply ensuring the unique * successor or predecessor property is sufficient. (For example, see * the comments at the end of "Conditional Constant Propagation" in * Section 19.3 of Appel's "Modern Compiler Implementation in ML".) * However, passes that require critical edges to be broken in order * to accomodate code motion (for example, PRE), should also break an * edge that connects a block with non-functional control transfer to * one with two or more predecessors. *) val breakCriticalEdgesFunction: Function.t * {codeMotion: bool} -> Function.t val breakCriticalEdges: Program.t * {codeMotion: bool} -> Program.t val eliminateDeadBlocksFunction: Function.t -> Function.t val eliminateDeadBlocks: Program.t -> Program.t val orderFunctions: Program.t -> Program.t val reverseFunctions: Program.t -> Program.t end mlton-20100608/mlton/ssa/prepasses2.fun0000644000076600000240000000630511404435623016305 0ustar mtfstaff(* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor PrePasses2 (S: PREPASSES2_STRUCTS): PREPASSES2 = struct open S structure DeadBlocks = struct fun eliminateFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val {get = isLive, set = setLive, rem} = Property.getSetOnce (Label.plist, Property.initConst false) val _ = Function.dfs (f, fn Block.T {label, ...} => (setLive (label, true) ; fn () => ())) val f = if Vector.forall (blocks, isLive o Block.label) then f else let val blocks = Vector.keepAll (blocks, isLive o Block.label) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val _ = Vector.foreach (blocks, rem o Block.label) in f end fun eliminate (Program.T {datatypes, globals, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, eliminateFunction), main = main} end val eliminateDeadBlocksFunction = DeadBlocks.eliminateFunction (* quell unused warning *) val _ = eliminateDeadBlocksFunction val eliminateDeadBlocks = DeadBlocks.eliminate structure Order = struct fun orderFunctions (p as Program.T {globals, datatypes, main, ...}) = let val functions = ref [] val () = Program.dfs (p, fn f => let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f val blocks = ref [] val () = Function.dfs (f, fn b => (List.push (blocks, b) ; fn () => ())) val f = Function.new {args = args, blocks = Vector.fromListRev (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} in List.push (functions, f) ; fn () => () end) in Program.T {datatypes = datatypes, globals = globals, functions = List.rev (!functions), main = main} end end val orderFunctions = Order.orderFunctions structure Reverse = struct fun reverseFunctions (Program.T {globals, datatypes, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.rev functions, main = main} end val reverseFunctions = Reverse.reverseFunctions end mlton-20100608/mlton/ssa/prepasses2.sig0000644000076600000240000000106311404435623016273 0ustar mtfstaff(* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PREPASSES2_STRUCTS = sig include TYPE_CHECK2 end signature PREPASSES2 = sig include PREPASSES2_STRUCTS val eliminateDeadBlocksFunction: Function.t -> Function.t val eliminateDeadBlocks: Program.t -> Program.t val orderFunctions: Program.t -> Program.t val reverseFunctions: Program.t -> Program.t end mlton-20100608/mlton/ssa/profile.fun0000644000076600000240000001434611404435623015662 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Profile (S: PROFILE_STRUCTS): PROFILE = struct open S fun addProfileFunction (f: Function.t) = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val extraBlocks = ref [] val siF = SourceInfo.function {name = [Func.toString name], region = Region.bogus} val enterF = ProfileExp.Enter siF val enterF = fn () => Statement.profile enterF val leaveF = ProfileExp.Leave siF val leaveF = fn () => Statement.profile leaveF val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let val (enterFL, enterL, leaveL, leaveLF) = if Vector.length statements = 0 then (fn () => Vector.new1 (enterF ()), fn () => Vector.new0 (), fn () => Vector.new0 (), fn () => Vector.new1 (leaveF ())) else let val siL = SourceInfo.function {name = [Label.toString label], region = Region.bogus} val enterL = ProfileExp.Enter siL val enterL = fn () => Statement.profile enterL val leaveL = ProfileExp.Leave siL val leaveL = fn () => Statement.profile leaveL in (fn () => Vector.new2 (enterF (), enterL ()), fn () => Vector.new1 (enterL ()), fn () => Vector.new1 (leaveL ()), fn () => Vector.new2 (leaveL (), leaveF ())) end val enterStmts = if Label.equals (label, start) then enterFL () else enterL () fun doitLF () = (leaveLF (), transfer) fun doitL () = (leaveL (), transfer) fun doit () = (Vector.new0 (), transfer) fun genHandler () = case raises of NONE => Handler.Caller | SOME ts => let val xs = Vector.map (ts, fn _ => Var.newNoname ()) val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = Vector.zip (xs, ts), label = l, statements = Vector.new1 (leaveF ()), transfer = Transfer.Raise xs}) in Handler.Handle l end val (leaveStmts, transfer) = case transfer of Transfer.Call {args, func, return} => (case return of Return.Dead => doit () | Return.NonTail {cont, handler} => (case handler of Handler.Dead => doitL () | Handler.Caller => let val handler = genHandler () val return = Return.NonTail {cont = cont, handler = handler} in (leaveL (), Transfer.Call {args = args, func = func, return = return}) end | Handler.Handle _ => doitL ()) | Return.Tail => doitLF ()) | Transfer.Raise _ => doitLF () | Transfer.Return _ => doitLF () | _ => doitL () val statements = Vector.concat [enterStmts, statements, leaveStmts] in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun addProfile (Program.T {datatypes, functions, globals, main}) = Program.T {datatypes = datatypes, functions = List.revMap (functions, addProfileFunction), globals = globals, main = main} fun dropProfileFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => Block.T {args = args, label = label, statements = Vector.keepAll (statements, fn Statement.T {exp = Exp.Profile _, ...} => false | _ => true), transfer = transfer}) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun dropProfile (Program.T {datatypes, globals, functions, main}) = (Control.profile := Control.ProfileNone ; Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, dropProfileFunction), main = main}) end mlton-20100608/mlton/ssa/profile.sig0000644000076600000240000000064711404435623015653 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PROFILE_STRUCTS = sig include SHRINK end signature PROFILE = sig include PROFILE_STRUCTS val addProfile: Program.t -> Program.t val dropProfile: Program.t -> Program.t end mlton-20100608/mlton/ssa/profile2.fun0000644000076600000240000001432711404435623015743 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Profile2 (S: PROFILE2_STRUCTS): PROFILE2 = struct open S fun addProfileFunction (f: Function.t) = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val extraBlocks = ref [] val siF = SourceInfo.function {name = [Func.toString name], region = Region.bogus} val enterF = ProfileExp.Enter siF val enterF = fn () => Statement.profile enterF val leaveF = ProfileExp.Leave siF val leaveF = fn () => Statement.profile leaveF val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let val (enterFL, enterL, leaveL, leaveLF) = if Vector.length statements = 0 then (fn () => Vector.new1 (enterF ()), fn () => Vector.new0 (), fn () => Vector.new0 (), fn () => Vector.new1 (leaveF ())) else let val siL = SourceInfo.function {name = [Label.toString label], region = Region.bogus} val enterL = ProfileExp.Enter siL val enterL = fn () => Statement.profile enterL val leaveL = ProfileExp.Leave siL val leaveL = fn () => Statement.profile leaveL in (fn () => Vector.new2 (enterF (), enterL ()), fn () => Vector.new1 (enterL ()), fn () => Vector.new1 (leaveL ()), fn () => Vector.new2 (leaveL (), leaveF ())) end val enterStmts = if Label.equals (label, start) then enterFL () else enterL () fun doitLF () = (leaveLF (), transfer) fun doitL () = (leaveL (), transfer) fun doit () = (Vector.new0 (), transfer) fun genHandler () = case raises of NONE => Handler.Caller | SOME ts => let val xs = Vector.map (ts, fn _ => Var.newNoname ()) val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = Vector.zip (xs, ts), label = l, statements = Vector.new1 (leaveF ()), transfer = Transfer.Raise xs}) in Handler.Handle l end val (leaveStmts, transfer) = case transfer of Transfer.Call {args, func, return} => (case return of Return.Dead => doit () | Return.NonTail {cont, handler} => (case handler of Handler.Dead => doitL () | Handler.Caller => let val handler = genHandler () val return = Return.NonTail {cont = cont, handler = handler} in (leaveL (), Transfer.Call {args = args, func = func, return = return}) end | Handler.Handle _ => doitL ()) | Return.Tail => doitLF ()) | Transfer.Raise _ => doitLF () | Transfer.Return _ => doitLF () | _ => doitL () val statements = Vector.concat [enterStmts, statements, leaveStmts] in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun addProfile (Program.T {datatypes, functions, globals, main}) = Program.T {datatypes = datatypes, functions = List.revMap (functions, addProfileFunction), globals = globals, main = main} fun dropProfileFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => Block.T {args = args, label = label, statements = Vector.keepAll (statements, fn Statement.Profile _ => false | _ => true), transfer = transfer}) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun dropProfile (Program.T {datatypes, globals, functions, main}) = (Control.profile := Control.ProfileNone ; Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, dropProfileFunction), main = main}) end mlton-20100608/mlton/ssa/profile2.sig0000644000076600000240000000065311404435623015732 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature PROFILE2_STRUCTS = sig include SHRINK2 end signature PROFILE2 = sig include PROFILE2_STRUCTS val addProfile: Program.t -> Program.t val dropProfile: Program.t -> Program.t end mlton-20100608/mlton/ssa/redundant-tests.fun0000644000076600000240000005267711404435623017357 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RedundantTests (S: REDUNDANT_TESTS_STRUCTS): REDUNDANT_TESTS = struct open S structure Rel = struct datatype t = EQ | LT of {signed: bool} | LE of {signed: bool} | NE val equals: t * t -> bool = op = val toString = fn EQ => "=" | LT _ => "<" | LE _ => "<=" | NE => "<>" val layout = Layout.str o toString end structure Oper = struct datatype t = Const of Const.t | Var of Var.t val layout = fn Const c => Const.layout c | Var x => Var.layout x val equals = fn (Const c, Const c') => Const.equals (c, c') | (Var x, Var x') => Var.equals (x, x') | _ => false end structure Fact = struct datatype t = T of {rel: Rel.t, lhs: Oper.t, rhs: Oper.t} fun layout (T {rel, lhs, rhs}) = let open Layout in seq [Oper.layout lhs, str " ", Rel.layout rel, str " ", Oper.layout rhs] end fun equals (T {rel, lhs = l, rhs = r}, T {rel = rel', lhs = l', rhs = r'}) = Rel.equals (rel, rel') andalso Oper.equals (l, l') andalso Oper.equals (r, r') fun negate (T {rel, lhs, rhs}): t = let datatype z = datatype Rel.t val rel = case rel of EQ => NE | LT s => LE s | LE s => LT s | NE => EQ in T {rel = rel, lhs = rhs, rhs = lhs} end datatype result = False | True | Unknown fun determine (facts: t list, f: t): result = if List.contains (facts, f, equals) then True else if List.contains (facts, negate f, equals) then False else Unknown end open Exp Transfer fun simplify (Program.T {globals, datatypes, functions, main}) = let datatype varInfo = Const of Const.t | Fact of Fact.t | None | Or of Fact.t * Fact.t val {get = varInfo: Var.t -> varInfo, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst None) val setVarInfo = Trace.trace ("RedundantTests.setVarInfo", Var.layout o #1, Unit.layout) setVarInfo datatype z = datatype Fact.result datatype z = datatype Rel.t fun makeVarInfo {args, prim, targs = _}: varInfo = let fun arg i = let val x = Vector.sub (args, i) in case varInfo x of Const c => Oper.Const c | _ => Oper.Var x end fun z (r, a, b) = Fact (Fact.T {rel = r, lhs = arg a, rhs = arg b}) fun doit rel = z (rel, 0, 1) datatype z = datatype Prim.Name.t in case Prim.name prim of MLton_eq => doit EQ | Word_equal _ => doit EQ | Word_lt (_, sg) => doit (LT sg) | _ => None end fun setConst (x, c) = setVarInfo (x, Const c) val _ = Vector.foreach (globals, fn Statement.T {var, exp, ...} => case exp of Exp.Const c => Option.app (var, fn x => setConst (x, c)) | _ => ()) local fun make c = let val x = Var.newNoname () in (x, Statement.T {var = SOME x, ty = Type.bool, exp = ConApp {con = c, args = Vector.new0 ()}}) end in val (trueVar, t) = make Con.truee val (falseVar, f) = make Con.falsee end local val statements = ref [] in val one = WordSize.memoize (fn s => let val one = Var.newNoname () val () = List.push (statements, Statement.T {exp = Exp.Const (Const.word (WordX.one s)), ty = Type.word s, var = SOME one}) in one end) val ones = Vector.fromList (!statements) end val globals = Vector.concat [Vector.new2 (t, f), ones, globals] val shrink = shrinkFunction {globals = globals} val numSimplified = ref 0 fun simplifyFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val _ = Control.diagnostic (fn () => let open Layout in seq [str "processing ", Func.layout name] end) val {get = labelInfo: Label.t -> {ancestor: Label.t option ref, facts: Fact.t list ref, inDeg: int ref}, ...} = Property.get (Label.plist, Property.initFun (fn _ => {ancestor = ref NONE, facts = ref [], inDeg = ref 0})) (* Set up inDeg. *) fun inc l = Int.inc (#inDeg (labelInfo l)) val () = inc start val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, inc)) (* Perform analysis, set up facts, and set up ancestor. *) fun loop (Tree.T (Block.T {label, statements, transfer, ...}, children), ancestor') = let val _ = Vector.foreach (statements, fn Statement.T {var, exp, ...} => case exp of Exp.Const c => Option.app (var, fn x => setConst (x, c)) | Exp.PrimApp pa => Option.app (var, fn x => setVarInfo (x, makeVarInfo pa)) | _ => ()) val _ = case transfer of Case {test, cases, default, ...} => let fun add (l, f) = let val {facts, inDeg, ...} = labelInfo l in if !inDeg = 1 then List.push (facts, f) else () end fun falseTrue () = case cases of Cases.Con v => let fun ca i = Vector.sub (v, i) in case (Vector.length v, default) of (1, SOME l') => let val (c, l) = ca 0 in if Con.equals (c, Con.truee) then (l', l) else (l, l') end | (2, _) => let val (c, l) = ca 0 val (_, l') = ca 1 in if Con.equals (c, Con.truee) then (l', l) else (l, l') end | _ => Error.bug "RedundantTests.simplifyFunction: expected two branches" end | _ => Error.bug "RedundantTests.simplifyFunction: expected con" in case varInfo test of Fact f => let val (l, l') = falseTrue () in add (l, Fact.negate f) ; add (l', f) end | Or (f, f') => let val (l, _) = falseTrue () in add (l, Fact.negate f) ; add (l, Fact.negate f') end | _ => () end | _ => () val {ancestor, facts, ...} = labelInfo label val _ = ancestor := ancestor' val ancestor' = if List.isEmpty (!facts) then ancestor' else SOME label in Vector.foreach (children, fn tree => loop (tree, ancestor')) end val _ = loop (Function.dominatorTree f, NONE) (* Diagnostic. *) val _ = Control.diagnostics (fn display => Vector.foreach (blocks, fn Block.T {label, ...} => let open Layout in display (seq [Label.layout label, str " ", List.layout Fact.layout (! (#facts (labelInfo label)))]) end)) (* Transformation. *) fun isFact (l: Label.t, p: Fact.t -> bool): bool = let fun loop (l: Label.t) = let val {ancestor, facts, ...} = labelInfo l in List.exists (!facts, p) orelse (case !ancestor of NONE => false | SOME l => loop l) end in loop l end fun determine (l: Label.t, f: Fact.t) = let fun loop {ancestor, facts, ...} = case Fact.determine (!facts, f) of Unknown => (case !ancestor of NONE => Unknown | SOME l => loop (labelInfo l)) | r => r in loop (labelInfo l) end val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => let val statements = Vector.map (statements, fn statement as Statement.T {ty, var, ...} => let fun doit x = (Int.inc numSimplified ; Control.diagnostic (fn () => let open Layout in seq [Option.layout Var.layout var, str " -> ", Var.layout x] end) ; Statement.T {var = var, ty = ty, exp = Var x}) fun falsee () = doit falseVar fun truee () = doit trueVar in case var of NONE => statement | SOME var => (case varInfo var of Or (f, f') => (case determine (label, f) of False => (case determine (label, f') of False => falsee () | True => truee () | Unknown => statement) | True => truee () | Unknown => statement) | Fact f => (case determine (label, f) of False => falsee () | True => truee () | Unknown => statement) | _ => statement) end) val noChange = (statements, transfer) fun arith (args: Var.t vector, prim: Type.t Prim.t, success: Label.t) : Statement.t vector * Transfer.t = let fun simplify (prim: Type.t Prim.t, x: Var.t, s: WordSize.t) = let val res = Var.newNoname () in (Vector.concat [statements, Vector.new1 (Statement.T {exp = PrimApp {args = Vector.new2 (x, one s), prim = prim, targs = Vector.new0 ()}, ty = Type.word s, var = SOME res})], Goto {args = Vector.new1 res, dst = success}) end fun add1 (x: Var.t, s: WordSize.t, sg) = if isFact (label, fn Fact.T {lhs, rel, rhs} => case (lhs, rel, rhs) of (Oper.Var x', Rel.LT sg', _) => Var.equals (x, x') andalso sg = sg' | (Oper.Var x', Rel.LE sg', Oper.Const c) => Var.equals (x, x') andalso sg = sg' andalso (case c of Const.Word w => WordX.lt (w, WordX.max (s, sg), sg) | _ => Error.bug "RedundantTests.add1: strange fact") | _ => false) then simplify (Prim.wordAdd s, x, s) else noChange fun sub1 (x: Var.t, s: WordSize.t, sg) = if isFact (label, fn Fact.T {lhs, rel, rhs} => case (lhs, rel, rhs) of (_, Rel.LT sg', Oper.Var x') => Var.equals (x, x') andalso sg = sg' | (Oper.Const c, Rel.LE sg', Oper.Var x') => Var.equals (x, x') andalso sg = sg' andalso (case c of Const.Word w => WordX.gt (w, WordX.min (s, sg), sg) | _ => Error.bug "RedundantTests.sub1: strange fact") | _ => false) then simplify (Prim.wordSub s, x, s) else noChange fun add (c: Const.t, x: Var.t, (s, sg as {signed})) = case c of Const.Word i => if WordX.isOne i then add1 (x, s, sg) else if signed andalso WordX.isNegOne i then sub1 (x, s, sg) else noChange | _ => Error.bug "RedundantTests.add: strange const" datatype z = datatype Prim.Name.t in case Prim.name prim of Word_addCheck s => let val x1 = Vector.sub (args, 0) val x2 = Vector.sub (args, 1) in case varInfo x1 of Const c => add (c, x2, s) | _ => (case varInfo x2 of Const c => add (c, x1, s) | _ => noChange) end | Word_subCheck (s, sg as {signed}) => let val x1 = Vector.sub (args, 0) val x2 = Vector.sub (args, 1) in case varInfo x2 of Const c => (case c of Const.Word w => if WordX.isOne w then sub1 (x1, s, sg) else if (signed andalso WordX.isNegOne w) then add1 (x1, s, sg) else noChange | _ => Error.bug "RedundantTests.sub: strage const") | _ => noChange end | _ => noChange end val (statements, transfer) = case transfer of Arith {args, prim, success, ...} => arith (args, prim, success) | _ => noChange in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) in shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start}) end val _ = Control.diagnostic (fn () => let open Layout in seq [str "numSimplified = ", Int.layout (!numSimplified)] end) val functions = List.revMap (functions, simplifyFunction) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/redundant-tests.sig0000644000076600000240000000070111404435623017326 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REDUNDANT_TESTS_STRUCTS = sig include SHRINK end signature REDUNDANT_TESTS = sig include REDUNDANT_TESTS_STRUCTS val simplify: Program.t -> Program.t end mlton-20100608/mlton/ssa/redundant.fun0000644000076600000240000005061111404435623016201 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Redundant (S: REDUNDANT_STRUCTS): REDUNDANT = struct open S datatype z = datatype Exp.t datatype z = datatype Transfer.t structure Element: sig structure Class: sig type t val plist: t -> PropertyList.t end type t val class: t -> Class.t val fixedPoint: unit -> unit val forceDistinct: t vector -> unit val new: 'a vector * ('a -> PropertyList.t) -> t vector val new1: unit -> t val refine: {coarse: t, fine: t} vector -> unit end = struct datatype t = T of {class: class ref} and class = Class of {coarserThan: refinement list ref, elements: t vector, plist: PropertyList.t} withtype refinement = {coarse: t, fine: t} vector structure Element = struct datatype t = datatype t end structure Class = struct datatype t = datatype class local fun make f (Class r) = f r in val coarserThan = make #coarserThan val plist = make #plist end fun new elements = Class {coarserThan = ref [], elements = elements, plist = PropertyList.new ()} val bogus = new (Vector.new0 ()) end local fun make f (T r) = f r in val class = ! o make #class end fun setClass (T {class, ...}, c) = class := c fun 'a new (elements: 'a vector, plist: 'a -> PropertyList.t): t vector = let val classes: t list ref list ref = ref [] val {destroy, get = class: 'a -> t list ref, ...} = Property.destGet (plist, Property.initFun (fn _ => let val class = ref [] val () = List.push (classes, class) in class end)) val elements = Vector.map (elements, fn a => let val elt = T {class = ref Class.bogus} val () = List.push (class a, elt) in elt end) val () = destroy () val () = List.foreach (!classes, fn r => let val elements = Vector.fromList (!r) val class = Class.new elements val () = Vector.foreach (elements, fn e => setClass (e, class)) in () end) in elements end fun new1 () = let val e = T {class = ref Class.bogus} val c = Class.new (Vector.new1 e) val () = setClass (e, c) in e end fun forceDistinct (es: t vector): unit = Vector.foreach (es, fn e => let val c = Class.new (Vector.new1 e) val () = setClass (e, c) in () end) structure Refinement = struct type t = refinement fun group (v: t, sel): t list = let val classes = ref [] val {destroy, get: Class.t -> {coarse: Element.t, fine: Element.t} list ref, ...} = Property.destGet (Class.plist, Property.initFun (fn _ => let val r = ref [] val () = List.push (classes, r) in r end)) val () = Vector.foreach (v, fn cf => List.push (get (class (sel cf)), cf)) val () = destroy () in List.fold (!classes, [], fn (r, ac) => Vector.fromList (!r) :: ac) end fun store (v: t): unit = List.push (Class.coarserThan (class (#coarse (Vector.sub (v, 0)))), v) end val todo: Refinement.t list ref = ref [] fun refine (v: Refinement.t): unit = List.foreach (Refinement.group (v, #fine), fn v => let val oldClass = class (#fine (Vector.sub (v, 0))) val classes = Refinement.group (v, #coarse) in case classes of [_] => Refinement.store v | _ => let val () = todo := (List.fold (! (Class.coarserThan oldClass), !todo, op ::)) in List.foreach (classes, fn v => let val () = Refinement.store v val elements = Vector.map (v, #fine) val c = Class.new elements val () = Vector.foreach (elements, fn e => setClass (e, c)) in () end) end end) fun fixedPoint () = let fun loop () = case !todo of [] => () | r :: rs => (todo := rs ; refine r ; loop ()) in loop () end end structure Class = Element.Class structure Eqrel:> sig type t val classes: t -> int list list val element: t * int -> Element.t val elements: t -> Element.t vector val forceDistinct: t -> unit val fromTypes: Type.t vector -> t val layout: t -> Layout.t val make: Element.t vector -> t val refine: {coarse: t, fine: t} -> unit val unify: t * t -> unit end = struct datatype t = T of Element.t vector val make = T fun elements (T v) = v fun element (r, i) = Vector.sub (elements r, i) fun forceDistinct (T v) = Element.forceDistinct v fun fromTypes ts = T (Element.new (ts, Type.plist)) fun refine {coarse = T cv, fine = T fv} = Element.refine (Vector.map2 (cv, fv, fn (c, f) => {coarse = c, fine = f})) fun unify (r, r') = (refine {coarse = r, fine = r'} ; refine {coarse = r', fine = r}) fun classes (T v) = let val classes = ref [] val {get = classIndices: Class.t -> int list ref, destroy, ...} = Property.destGet (Class.plist, Property.initFun (fn _ => let val r = ref [] val () = List.push (classes, r) in r end)) val () = Vector.foreachi (v, fn (i, e) => List.push (classIndices (Element.class e), i)) val () = destroy () in List.fold (!classes, [], fn (r, ac) => !r :: ac) end val layout = (List.layout (List.layout Int.layout)) o classes end fun redundant (Program.T {datatypes, globals, functions, main}) = let val {get = funcInfo: Func.t -> {arg: Eqrel.t, return: Eqrel.t option}, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("Redundant.info", Func.layout)) val {get = labelInfo: Label.t -> Eqrel.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("Redundant.info", Label.layout)) val {get = varInfo : Var.t -> Element.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => Element.new1 ())) fun varEquiv xs = Eqrel.make (Vector.map (xs, varInfo)) (* compute the fixed point *) val () = let fun makeFormalsRel (xs: (Var.t * Type.t) vector): Eqrel.t = let val eqrel = Eqrel.fromTypes (Vector.map (xs, #2)) val () = Vector.foreachi (xs, fn (i, (x, _)) => setVarInfo (x, Eqrel.element (eqrel, i))) in eqrel end (* initialize all varInfo and funcInfo *) val () = List.foreach (functions, fn f => let val {name, args, returns, ...} = Function.dest f in setFuncInfo (name, {arg = makeFormalsRel args, return = Option.map (returns, Eqrel.fromTypes)}) end) (* Add the calls to all the funcInfos *) val () = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val {return, ...} = funcInfo name val _ = Vector.foreach (blocks, fn Block.T {label, args, ...} => setLabelInfo (label, makeFormalsRel args)) in Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, args, return = ret, ...} => let val {arg = arg', return = return'} = funcInfo func val _ = Eqrel.refine {coarse = varEquiv args, fine = arg'} in case ret of Return.Dead => () | Return.NonTail {cont, ...} => Option.app (return', fn e => Eqrel.unify (e, labelInfo cont)) | Return.Tail => (case (return, return') of (SOME e, SOME e') => Eqrel.unify (e, e') | _ => ()) end | Case {cases = Cases.Con cases, ...} => (* For now, assume that constructor arguments * are never redundant. Thus all case branches * need to have trivial equivalence relations. *) Vector.foreach (cases, fn (_, l) => Eqrel.forceDistinct (labelInfo l)) | Goto {dst, args, ...} => Eqrel.refine {coarse = varEquiv args, fine = labelInfo dst} | Return xs => Eqrel.refine {coarse = varEquiv xs, fine = valOf return} | _ => ()) end) val _ = Element.fixedPoint () in () end val _ = Control.diagnostics (fn display => List.foreach (functions, fn f => let open Layout val {name, blocks, ...} = Function.dest f val {arg, return} = funcInfo name val () = display (seq [Func.layout name, str " ", Eqrel.layout arg, Option.layout Eqrel.layout return]) val () = Vector.foreach (blocks, fn Block.T {label, ...} => let val arg = labelInfo label in display (seq [str "\t", Label.layout label, str " ", Eqrel.layout arg]) end) in () end)) val {get = replacement : Var.t -> Var.t option, set = setReplacement, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) datatype red = Useful | Redundant of int (* the index it is the same as *) (* Turn an equivalence relation on 0 ... n - 1 into a red vector by * choosing a representative of each class. *) fun makeReds (r: Eqrel.t): red vector = let val {get = rep: Class.t -> int option ref, destroy, ...} = Property.destGet (Class.plist, Property.initFun (fn _ => ref NONE)) val reds = Vector.mapi (Eqrel.elements r, fn (i, e) => let val r = rep (Element.class e) in case !r of NONE => (r := SOME i; Useful) | SOME i => Redundant i end) val () = destroy () in reds end fun redundantFormals (xs: (Var.t * Type.t) vector, r: Eqrel.t) : red vector * (Var.t * Type.t) vector = let val reds = makeReds r val xs = Vector.keepAllMap2 (xs, reds, fn (x, red) => case red of Useful => SOME x | Redundant i => (setReplacement (#1 x, SOME (#1 (Vector.sub (xs, i)))) ; NONE)) in (reds, xs) end fun keepUseful (reds: red vector, xs: 'a vector): 'a vector = Vector.keepAllMap2 (reds, xs, fn (r, x) => case r of Useful => SOME x | _ => NONE) val {get = funcReds : Func.t -> {argsRed: red vector, args: (Var.t * Type.t) vector, returnsRed: red vector option, returns: Type.t vector option}, set = setFuncReds, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("funcReds", Func.layout)) val {get = labelReds: Label.t -> {argsRed: red vector, args: (Var.t * Type.t) vector}, set = setLabelReds, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("labelReds", Label.layout)) val _ = List.foreach (functions, fn f => let val {name, args, blocks, returns, ...} = Function.dest f val {arg, return} = funcInfo name val (returnsRed, returns) = (case (returns, return) of (SOME r, SOME r') => let val returnsRed = makeReds r' val returns = keepUseful (returnsRed, r) in (SOME returnsRed, SOME returns) end | _ => (NONE, NONE)) val (argsRed, args) = redundantFormals (args, arg) in setFuncReds (name, {args = args, argsRed = argsRed, returns = returns, returnsRed = returnsRed}) ; Vector.foreach (blocks, fn Block.T {label, args, ...} => let val (argsRed, args) = redundantFormals (args, labelInfo label) in setLabelReds (label, {args = args, argsRed = argsRed}) end) end) fun loopVar x = case replacement x of NONE => x | SOME y => y fun loopVars xs = Vector.map (xs, loopVar) val functions = List.revMap (functions, fn f => let val {blocks, mayInline, name, raises, start, ...} = Function.dest f val {args, returns, returnsRed, ...} = funcReds name val blocks = Vector.map (blocks, fn Block.T {label, statements, transfer, ...} => let val {args, ...} = labelReds label val statements = Vector.map (statements, fn Statement.T {var, ty, exp} => Statement.T {var = var, ty = ty, exp = Exp.replaceVar (exp, loopVar)}) val transfer = case transfer of Arith {prim, args, overflow, success, ty} => Arith {prim = prim, args = loopVars args, overflow = overflow, success = success, ty = ty} | Bug => Bug | Call {func, args, return} => Call {func = func, args = loopVars (keepUseful (#argsRed (funcReds func), args)), return = return} | Case {test, cases, default} => Case {test = loopVar test, cases = cases, default = default} | Goto {dst, args} => Goto {dst = dst, args = loopVars (keepUseful (#argsRed (labelReds dst), args))} | Raise xs => Raise (loopVars xs) | Return xs => Return (loopVars (keepUseful (valOf returnsRed, xs))) | Runtime {prim, args, return} => Runtime {prim = prim, args = loopVars args, return = return} in Block.T {label = label, args = args, statements = statements, transfer = transfer} end) val f = Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val _ = Function.clear f in f end) val p = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = Program.clearTop p in p end end mlton-20100608/mlton/ssa/redundant.sig0000644000076600000240000000066011404435623016172 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REDUNDANT_STRUCTS = sig include SHRINK end signature REDUNDANT = sig include REDUNDANT_STRUCTS val redundant: Program.t -> Program.t end mlton-20100608/mlton/ssa/ref-flatten.fun0000644000076600000240000013037011404435623016425 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RefFlatten (S: REF_FLATTEN_STRUCTS): REF_FLATTEN = struct open S structure Graph = DirectedGraph structure Node = Graph.Node datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure Finish = struct datatype t = T of {flat: Type.t Prod.t option, ty: Type.t} val _: t -> Layout.t = fn T {flat, ty} => let open Layout in record [("flat", Option.layout (fn p => Prod.layout (p, Type.layout)) flat), ("ty", Type.layout ty)] end end structure Value = struct datatype t = GroundV of Type.t | Complex of computed Equatable.t and computed = ObjectC of object | WeakC of {arg: t, finalType: Type.t option ref, originalType: Type.t} and object = Obj of {args: t Prod.t, con: ObjectCon.t, finalComponents: Type.t Prod.t option ref, finalOffsets: int vector option ref, finalType: Type.t option ref, flat: flat ref, originalType: Type.t} and flat = NotFlat | Offset of {object: object, offset: int} | Unknown fun delay (f: unit -> computed): t = Complex (Equatable.delay f) datatype value = Ground of Type.t | Object of object | Weak of {arg: t, finalType: Type.t option ref, originalType: Type.t} val value: t -> value = fn GroundV t => Ground t | Complex e => case Equatable.value e of ObjectC obj => Object obj | WeakC w => Weak w local open Layout in fun layout v: Layout.t = case v of GroundV t => Type.layout t | Complex e => Equatable.layout (e, fn ObjectC ob => layoutObject ob | WeakC {arg, ...} => seq [str "Weak ", layout arg]) and layoutFlat (f: flat): Layout.t = case f of NotFlat => str "NotFlat" | Offset {offset, ...} => seq [str "Offset ", record [("offset", Int.layout offset)]] | Unknown => str "Unknown" and layoutObject (Obj {args, con, flat, ...}) = seq [str "Object ", record [("args", Prod.layout (args, layout)), ("con", ObjectCon.layout con), ("flat", layoutFlat (! flat))]] end fun originalType (v: t) = case value v of Ground t => t | Object (Obj {originalType = t, ...}) => t | Weak {originalType = t, ...} => t end structure Flat = struct datatype t = datatype Value.flat end structure Object = struct datatype t = datatype Value.object val layout = Value.layoutObject fun equals (Obj {flat = f, ...}, Obj {flat = f', ...}) = f = f' val select: t * int -> Value.t = fn (Obj {args, ...}, offset) => Prod.elt (args, offset) end datatype z = datatype Object.t structure Value = struct open Value val ground = GroundV val deObject: t -> Object.t option = fn v => case value v of Object ob => SOME ob | _ => NONE fun deFlat {inner: t, outer: Object.t}: Object.t option = case value inner of Object (z as Obj {flat, ...}) => (case ! flat of Flat.Offset {object, ...} => if Object.equals (object, outer) then SOME z else NONE | _ => NONE) | _ => NONE fun dontFlatten (v: t): unit = case value v of Object (Obj {flat, ...}) => flat := NotFlat | _ => () fun isUnit v = case v of GroundV t => Type.isUnit t | _ => false fun objectC {args: t Prod.t, con: ObjectCon.t, originalType} : computed = let (* Only may flatten objects with mutable fields, and where the field * isn't unit. Flattening a unit field could lead to a problem * because the containing object might be otherwise immutable, and * hence the unit ref would lose its identity. We can fix this * once objects have a notion of identity independent of mutability. *) val flat = ref (if Vector.exists (Prod.dest args, fn {elt, isMutable} => isMutable andalso not (isUnit elt)) andalso not (ObjectCon.isVector con) then Unknown else NotFlat) in ObjectC (Obj {args = args, con = con, finalComponents = ref NONE, finalOffsets = ref NONE, finalType = ref NONE, flat = flat, originalType = originalType}) end val computed: computed -> t = fn c => Complex (Equatable.new c) fun weakC (a: t): computed = WeakC {arg = a, finalType = ref NONE, originalType = Type.weak (originalType a)} val weak = computed o weakC fun tuple (args: t Prod.t, originalType: Type.t): t = computed (objectC {args = args, con = ObjectCon.Tuple, originalType = originalType}) val tuple = Trace.trace ("RefFlatten.Value.tuple", fn (p, _) => Prod.layout (p, layout), layout) tuple val rec unify: t * t -> unit = fn z => case z of (GroundV t, GroundV t') => if Type.equals (t, t') then () else Error.bug "RefFlatten.Value.unify: unequal Grounds" | (Complex e, Complex e') => Equatable.equate (e, e', fn (c, c') => case (c, c') of (ObjectC (Obj {args = a, flat = f, ...}), ObjectC (Obj {args = a', flat = f', ...})) => let val () = unifyProd (a, a') val () = case (!f, !f') of (_, NotFlat) => f := NotFlat | (NotFlat, _) => f' := NotFlat | (Offset _, _) => Error.bug "RefFlatten.Value.unify: Offset" | (_, Offset _) => Error.bug "RefFlatten.Value.unify: Offset" | _ => () in c end | (WeakC {arg = a, ...}, WeakC {arg = a', ...}) => (unify (a, a'); c) | _ => Error.bug "RefFlatten.Value.unify: strange Complex") | _ => Error.bug "RefFlatten.Value.unify: Complex with Ground" and unifyProd = fn (p, p') => Vector.foreach2 (Prod.dest p, Prod.dest p', fn ({elt = e, ...}, {elt = e', ...}) => unify (e, e')) fun coerce {from, to} = unify (from, to) val coerce = Trace.trace ("RefFlatten.Value.coerce", fn {from, to} => Layout.record [("from", layout from), ("to", layout to)], Unit.layout) coerce end structure Size = TwoPointLattice (val bottom = "small" val top = "large") structure VarInfo = struct datatype useStatus = InTuple of {object: Object.t, objectVar: Var.t, offset: int} | Unused datatype t = Flattenable of {components: Var.t vector, defBlock: Label.t, useStatus: useStatus ref} | Unflattenable fun layout (i: t): Layout.t = let open Layout in case i of Flattenable {components, defBlock, useStatus} => seq [str "Flattenable ", record [("components", Vector.layout Var.layout components), ("defBlock", Label.layout defBlock), ("useStatus", (case !useStatus of InTuple {object, objectVar, offset} => seq [str "InTuple ", record [("object", Object.layout object), ("objectVar", Var.layout objectVar), ("offset", Int.layout offset)]] | Unused => str "Unused"))]] | Unflattenable => str "Unflattenable" end end fun flatten (program as Program.T {datatypes, functions, globals, main}) = let val {get = conValue: Con.t -> Value.t option ref, ...} = Property.get (Con.plist, Property.initFun (fn _ => ref NONE)) val conValue = Trace.trace ("RefFlatten.conValue", Con.layout, Ref.layout (Option.layout Value.layout)) conValue datatype 'a make = Const of 'a | Make of unit -> 'a fun needToMakeProd p = Vector.exists (Prod.dest p, fn {elt, ...} => case elt of Const _ => false | Make _ => true) fun makeProd p = Prod.map (p, fn m => case m of Const v => v | Make f => f ()) val {get = makeTypeValue: Type.t -> Value.t make, ...} = Property.get (Type.plist, Property.initRec (fn (t, makeTypeValue) => let fun const () = Const (Value.ground t) datatype z = datatype Type.dest in case Type.dest t of Object {args, con} => let fun doit () = let val args = Prod.map (args, makeTypeValue) val mayFlatten = Vector.exists (Prod.dest args, #isMutable) andalso not (ObjectCon.isVector con) in if mayFlatten orelse needToMakeProd args then Make (fn () => Value.delay (fn () => Value.objectC {args = makeProd args, con = con, originalType = t})) else const () end datatype z = datatype ObjectCon.t in case con of Con c => Const (Ref.memoize (conValue c, fn () => case doit () of Const v => v | Make f => let val v = f () (* Constructors can never be * flattened into other objects. *) val () = Value.dontFlatten v in v end)) | Tuple => doit () | Vector => doit () end | Weak t => (case makeTypeValue t of Const _ => const () | Make f => Make (fn () => Value.delay (fn () => Value.weakC (f ())))) | _ => const () end)) fun typeValue (t: Type.t): Value.t = case makeTypeValue t of Const v => v | Make f => f () val typeValue = Trace.trace ("RefFlatten.typeValue", Type.layout, Value.layout) typeValue val coerce = Value.coerce fun inject {sum, variant = _} = typeValue (Type.datatypee sum) fun object {args, con, resultType} = let val m = makeTypeValue resultType in case con of NONE => (case m of Const v => v | Make _ => Value.tuple (args, resultType)) | SOME _ => (case m of Const v => let val () = case Value.deObject v of NONE => () | SOME (Obj {args = args', ...}) => Vector.foreach2 (Prod.dest args, Prod.dest args', fn ({elt = a, ...}, {elt = a', ...}) => coerce {from = a, to = a'}) in v end | _ => Error.bug "RefFlatten.object: strange con value") end val object = Trace.trace ("RefFlatten.object", fn {args, con, ...} => Layout.record [("args", Prod.layout (args, Value.layout)), ("con", Option.layout Con.layout con)], Value.layout) object val deWeak: Value.t -> Value.t = fn v => case Value.value v of Value.Ground t => typeValue (case Type.dest t of Type.Weak t => t | _ => Error.bug "RefFlatten.deWeak") | Value.Weak {arg, ...} => arg | _ => Error.bug "RefFlatten.deWeak" fun primApp {args, prim, resultVar = _, resultType} = let fun weak v = case makeTypeValue resultType of Const v => v | Make _ => Value.weak v fun arg i = Vector.sub (args, i) fun result () = typeValue resultType datatype z = datatype Prim.Name.t fun dontFlatten () = (Vector.foreach (args, Value.dontFlatten) ; result ()) fun equal () = (Value.unify (arg 0, arg 1) ; result ()) in case Prim.name prim of Array_toVector => let val res = result () datatype z = datatype Value.value val () = case (Value.value (arg 0), Value.value res) of (Ground _, Ground _) => () | (Object (Obj {args = a, ...}), Object (Obj {args = a', ...})) => Vector.foreach2 (Prod.dest a, Prod.dest a', fn ({elt = v, ...}, {elt = v', ...}) => Value.unify (v, v')) | _ => Error.bug "RefFlatten.primApp: Array_toVector" in res end | FFI _ => (* Some imports, like Real64.modf, take ref cells that can not * be flattened. *) dontFlatten () | MLton_eq => equal () | MLton_equal => equal () | MLton_size => dontFlatten () | MLton_share => dontFlatten () | Weak_get => deWeak (arg 0) | Weak_new => let val a = arg 0 in (Value.dontFlatten a; weak a) end | _ => result () end fun base b = case b of Base.Object obj => obj | Base.VectorSub {vector, ...} => vector fun select {base, offset} = let datatype z = datatype Value.value in case Value.value base of Ground t => (case Type.dest t of Type.Object {args, ...} => typeValue (Prod.elt (args, offset)) | _ => Error.bug "RefFlatten.select: Ground") | Object ob => Object.select (ob, offset) | _ => Error.bug "RefFlatten.select" end fun update {base, offset, value} = (coerce {from = value, to = select {base = base, offset = offset}} (* Don't flatten the component of the update, * else sharing will be broken. *) ; Value.dontFlatten value) fun const c = typeValue (Type.ofConst c) val {func, value = varValue, ...} = analyze {base = base, coerce = coerce, const = const, filter = fn _ => (), filterWord = fn _ => (), fromType = typeValue, inject = inject, layout = Value.layout, object = object, primApp = primApp, program = program, select = fn {base, offset, ...} => select {base = base, offset = offset}, update = update, useFromTypeOnBinds = false} val varObject = Value.deObject o varValue (* Mark a variable as Flattenable if all its uses are contained in a single * basic block, there is a single use in an object construction, and * all other uses follow the object construction. * * ... * r: (t ref) = (t) * ... ... * x: (... * (t ref) * ...) = (..., r, ...) * ... ... * *) datatype z = datatype VarInfo.t datatype z = datatype VarInfo.useStatus val {get = varInfo: Var.t -> VarInfo.t ref, ...} = Property.get (Var.plist, Property.initFun (fn _ => ref VarInfo.Unflattenable)) val varInfo = Trace.trace ("RefFlatten.varInfo", Var.layout, Ref.layout VarInfo.layout) varInfo fun use x = varInfo x := Unflattenable val use = Trace.trace ("RefFlatten.use", Var.layout, Unit.layout) use fun uses xs = Vector.foreach (xs, use) fun loopStatement (s: Statement.t, current: Label.t): unit = case s of Bind {exp = Exp.Object {args, ...}, var, ...} => (case var of NONE => uses args | SOME var => case Value.deObject (varValue var) of NONE => uses args | SOME object => let val () = varInfo var := Flattenable {components = args, defBlock = current, useStatus = ref Unused} in Vector.foreachi (args, fn (offset, x) => let val r = varInfo x in case !r of Flattenable {defBlock, useStatus, ...} => (if Label.equals (current, defBlock) andalso (case !useStatus of InTuple _ => false | Unused => true) then (useStatus := (InTuple {object = object, objectVar = var, offset = offset})) else r := Unflattenable) | Unflattenable => () end) end) | Statement.Update {base, value, ...} => (use value ; (case base of Base.Object r => let val i = varInfo r in case ! i of Flattenable {defBlock, useStatus, ...} => if Label.equals (current, defBlock) andalso (case !useStatus of InTuple _ => true | Unused => false) then () else i := Unflattenable | Unflattenable => () end | Base.VectorSub _ => ())) | _ => Statement.foreachUse (s, use) val loopStatement = Trace.trace2 ("RefFlatten.loopStatement", Statement.layout, Label.layout, Unit.layout) loopStatement fun loopStatements (ss, label) = Vector.foreach (ss, fn s => loopStatement (s, label)) fun loopTransfer t = Transfer.foreachVar (t, use) val globalLabel = Label.newNoname () val () = loopStatements (globals, globalLabel) val () = List.foreach (functions, fn f => Function.dfs (f, fn Block.T {label, statements, transfer, ...} => (loopStatements (statements, label) ; loopTransfer transfer ; fn () => ()))) fun foreachObject (f): unit = let fun loopStatement s = case s of Bind {exp = Exp.Object {args, ...}, var, ...} => Option.app (var, fn var => case Value.value (varValue var) of Value.Ground _ => () | Value.Object obj => f (var, args, obj) | _ => Error.bug "RefFlatten.foreachObject: Object with strange value") | _ => () val () = Vector.foreach (globals, loopStatement) val () = List.foreach (functions, fn f => let val {blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {statements, ...} => Vector.foreach (statements, loopStatement)) end) in () end (* Try to flatten each ref. *) val () = foreachObject (fn (var, _, Obj {flat, ...}) => let datatype z = datatype Flat.t fun notFlat () = flat := NotFlat val () = case ! (varInfo var) of Flattenable {useStatus, ...} => (case !useStatus of InTuple {object = obj', offset = i', ...} => (case ! flat of NotFlat => () | Offset {object = obj'', offset = i''} => if i' = i'' andalso Object.equals (obj', obj'') then () else notFlat () | Unknown => flat := Offset {object = obj', offset = i'}) | Unused => notFlat ()) | Unflattenable => notFlat () in () end) val () = foreachObject (fn (_, args, obj) => let datatype z = datatype Flat.t (* Check that all arguments that are represented by flattening them * into the object are available as an explicit allocation. *) val () = Vector.foreach (args, fn a => case Value.deFlat {inner = varValue a, outer = obj} of NONE => () | SOME (Obj {flat, ...}) => case ! (varInfo a) of Flattenable _ => () | Unflattenable => flat := NotFlat) in () end) (* * The following code disables flattening of some refs to ensure * space safety. Flattening a ref into an object that has * another component that contains a value of unbounded size (a * large object) could keep the large object alive beyond where * it should be. So, we first use a simple fixed point to * figure out which types have values of unbounded size. Then, * for each reference to a mutable object, if we are trying to * flatten it into an object that has another component with a * large value and the container is not live in this block (we * approximate liveness), then don't allow the flattening to * happen. * * Vectors may be objects of unbounded size. * Weak pointers may not be objects of unbounded size; weak * pointers do not keep pointed-to object live. * Instances of recursive datatypes may be objects of unbounded * size. *) val {get = tyconSize: Tycon.t -> Size.t, ...} = Property.get (Tycon.plist, Property.initFun (fn _ => Size.new ())) (* Force (mutually) recursive datatypes to top. *) val {get = nodeTycon: unit Node.t -> Tycon.t, set = setNodeTycon, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("nodeTycon", Node.layout)) val {get = tyconNode: Tycon.t -> unit Node.t, set = setTyconNode, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("tyconNode", Tycon.layout)) val graph = Graph.new () val () = Vector.foreach (datatypes, fn Datatype.T {tycon, ...} => let val node = Graph.newNode graph val () = setTyconNode (tycon, node) val () = setNodeTycon (node, tycon) in () end) val () = Vector.foreach (datatypes, fn Datatype.T {cons, tycon} => let val n = tyconNode tycon datatype z = datatype Type.dest val {get = dependsOn, destroy = destroyDependsOn} = Property.destGet (Type.plist, Property.initRec (fn (t, dependsOn) => case Type.dest t of Datatype tc => (ignore o Graph.addEdge) (graph, {from = n, to = tyconNode tc}) | Object {args, ...} => Prod.foreach (args, dependsOn) | _ => ())) val () = Vector.foreach (cons, fn {args, ...} => Prod.foreach (args, dependsOn)) val () = destroyDependsOn () in () end) val () = List.foreach (Graph.stronglyConnectedComponents graph, fn ns => let fun doit () = List.foreach (ns, fn n => Size.makeTop (tyconSize (nodeTycon n))) in case ns of [n] => if Node.hasEdge {from = n, to = n} then doit () else () | _ => doit () end) val {get = typeSize: Type.t -> Size.t, ...} = Property.get (Type.plist, Property.initRec (fn (t, typeSize) => let val s = Size.new () fun dependsOn (t: Type.t): unit = Size.<= (typeSize t, s) datatype z = datatype Type.dest val () = case Type.dest t of CPointer => () | Datatype tc => Size.<= (tyconSize tc, s) | IntInf => Size.makeTop s | Object {args, con, ...} => if ObjectCon.isVector con then Size.makeTop s else Prod.foreach (args, dependsOn) | Real _ => () | Thread => Size.makeTop s | Weak _ => () | Word _ => () in s end)) val () = Vector.foreach (datatypes, fn Datatype.T {cons, tycon} => let val s = tyconSize tycon fun dependsOn (t: Type.t): unit = Size.<= (typeSize t, s) val () = Vector.foreach (cons, fn {args, ...} => Prod.foreach (args, dependsOn)) in () end) fun typeIsLarge (t: Type.t): bool = Size.isTop (typeSize t) fun objectHasAnotherLarge (Object.Obj {args, ...}, {offset: int}) = Vector.existsi (Prod.dest args, fn (i, {elt, ...}) => i <> offset andalso typeIsLarge (Value.originalType elt)) val () = List.foreach (functions, fn f => let val {blocks, ...} = Function.dest f in Vector.foreach (blocks, fn Block.T {statements, transfer, ...} => let fun containerIsLive (x: Var.t) = Vector.exists (statements, fn s => case s of Bind {exp, var = SOME x', ...} => Var.equals (x, x') andalso (case exp of Exp.Select _ => true | _ => false) | _ => false) fun use (x: Var.t) = case Value.value (varValue x) of Value.Object (Obj {flat, ...}) => (case !flat of Flat.Offset {object, offset} => if objectHasAnotherLarge (object, {offset = offset}) andalso not (containerIsLive x) then flat := Flat.NotFlat else () | _ => ()) | _ => () val () = Vector.foreach (statements, fn s => Statement.foreachUse (s, use)) val () = Transfer.foreachVar (transfer, use) in () end) end) (* Mark varInfo as Unflattenable if varValue is. This done after all the * other parts of the analysis so that varInfo is consistent with the * varValue. *) val () = Program.foreachVar (program, fn (x, _) => let val r = varInfo x in case !r of Flattenable _ => (case Value.deObject (varValue x) of NONE => () | SOME (Obj {flat, ...}) => (case !flat of Flat.NotFlat => r := Unflattenable | _ => ())) | Unflattenable => () end) val () = Control.diagnostics (fn display => let open Layout val () = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {con, ...} => display (Option.layout Value.layout (! (conValue con))))) val () = Program.foreachVar (program, fn (x, _) => display (seq [Var.layout x, str " ", record [("value", Value.layout (varValue x)), ("varInfo", VarInfo.layout (! (varInfo x)))]])) in () end) (* Conversion from values to types. *) datatype z = datatype Finish.t val traceValueType = Trace.trace ("RefFlatten.valueType", Value.layout, Type.layout) fun valueType arg: Type.t = traceValueType (fn (v: Value.t) => let datatype z = datatype Value.value in case Value.value v of Ground t => t | Object z => objectType z | Weak {arg, finalType, ...} => Ref.memoize (finalType, fn () => Type.weak (valueType arg)) end) arg and objectFinalComponents (obj as Obj {args, finalComponents, ...}) = Ref.memoize (finalComponents, fn () => Prod.make (Vector.fromList (Vector.foldr (Prod.dest args, [], fn ({elt, isMutable = i}, ac) => case Value.deFlat {inner = elt, outer = obj} of NONE => {elt = valueType elt, isMutable = i} :: ac | SOME z => Vector.foldr (Prod.dest (objectFinalComponents z), ac, fn ({elt, isMutable = i'}, ac) => {elt = elt, isMutable = i orelse i'} :: ac))))) and objectFinalOffsets (z as Obj {args, finalOffsets, flat, ...}) = Ref.memoize (finalOffsets, fn () => let val initial = case ! flat of Flat.Offset {object, offset} => objectOffset (object, offset) | _ => 0 val (_, offsets) = Vector.fold (Prod.dest args, (initial, []), fn ({elt, ...}, (offset, ac)) => let val width = case Value.deFlat {inner = elt, outer = z} of NONE => 1 | SOME z => Prod.length (objectFinalComponents z) in (offset + width, offset :: ac) end) in Vector.fromListRev offsets end) and objectOffset (z: Object.t, offset: int): int = Vector.sub (objectFinalOffsets z, offset) and objectType (z as Obj {con, finalType, flat, ...}): Type.t = Ref.memoize (finalType, fn () => case ! flat of Flat.Offset {object, ...} => objectType object | _ => Type.object {args = objectFinalComponents z, con = con}) (* Transform the program. *) fun transformFormals (xts: (Var.t * Type.t) vector) : (Var.t * Type.t) vector = Vector.map (xts, fn (x, _) => (x, valueType (varValue x))) val extraSelects: Statement.t list ref = ref [] fun flattenValues (object: Var.t, obj as Obj {args, ...}, ac: Var.t list): Var.t list = Vector.foldri (Prod.dest args, ac, fn (i, {elt, ...}, ac) => case Value.deFlat {inner = elt, outer = obj} of NONE => let val var = Var.newNoname () val () = List.push (extraSelects, Bind {exp = Select {base = Base.Object object, offset = objectOffset (obj, i)}, ty = valueType elt, var = SOME var}) in var :: ac end | SOME obj => flattenValues (object, obj, ac)) fun flattenArgs (xs: Var.t vector, outer: Object.t, ac): Var.t list = Vector.foldr (xs, ac, fn (x, ac) => let val v = varValue x in case Value.deFlat {inner = v, outer = outer} of NONE => x :: ac | SOME obj => (case ! (varInfo x) of Flattenable {components, ...} => flattenArgs (components, obj, ac) | Unflattenable => flattenValues (x, obj, ac)) end) val flattenArgs = Trace.trace3 ("RefFlatten.flattenArgs", Vector.layout Var.layout, Object.layout, List.layout Var.layout, List.layout Var.layout) flattenArgs fun transformBind {exp, ty, var}: Statement.t vector = let fun make e = Vector.new1 (Bind {exp = e, ty = (case var of NONE => ty | SOME var => valueType (varValue var)), var = var}) fun none () = Vector.new0 () in case exp of Exp.Object {args, con} => (case var of NONE => none () | SOME var => (case varObject var of NONE => make exp | SOME (z as Obj {flat, ...}) => case ! flat of Flat.Offset _ => none () | _ => let val args = Vector.fromList (flattenArgs (args, z, [])) val extra = !extraSelects val () = extraSelects := [] in Vector.concat [Vector.fromList extra, make (Exp.Object {args = args, con = con})] end)) | PrimApp {args, prim} => make (PrimApp {args = args, prim = prim}) | Select {base, offset} => (case var of NONE => none () | SOME var => (case base of Base.Object object => (case varObject object of NONE => make exp | SOME obj => make (if isSome (Value.deFlat {inner = varValue var, outer = obj}) then Var object else (Select {base = base, offset = (objectOffset (obj, offset))}))) | Base.VectorSub _ => make exp)) | _ => make exp end fun transformStatement (s: Statement.t): Statement.t vector = case s of Bind b => transformBind b | Profile _ => Vector.new1 s | Update {base, offset, value} => Vector.new1 (case base of Base.Object object => (case varObject object of NONE => s | SOME obj => let val base = case ! (varInfo object) of Flattenable {useStatus, ...} => (case ! useStatus of InTuple {objectVar, ...} => Base.Object objectVar | _ => base) | Unflattenable => base in Update {base = base, offset = objectOffset (obj, offset), value = value} end) | Base.VectorSub _ => s) val transformStatement = Trace.trace ("RefFlatten.transformStatement", Statement.layout, Vector.layout Statement.layout) transformStatement fun transformStatements ss = Vector.concatV (Vector.map (ss, transformStatement)) fun transformBlock (Block.T {args, label, statements, transfer}) = Block.T {args = transformFormals args, label = label, statements = transformStatements statements, transfer = transfer} fun valuesTypes vs = Vector.map (vs, valueType) val datatypes = Vector.map (datatypes, fn Datatype.T {cons, tycon} => let val cons = Vector.map (cons, fn {con, args} => let val args = case ! (conValue con) of NONE => args | SOME v => case Type.dest (valueType v) of Type.Object {args, ...} => args | _ => Error.bug "RefFlatten.datatypes: strange con" in {args = args, con = con} end) in Datatype.T {cons = cons, tycon = tycon} end) fun transformFunction (f: Function.t): Function.t = let val {args, blocks, mayInline, name, start, ...} = Function.dest f val {raises, returns, ...} = func name val raises = Option.map (raises, valuesTypes) val returns = Option.map (returns, valuesTypes) in Function.new {args = transformFormals args, blocks = Vector.map (blocks, transformBlock), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val program = Program.T {datatypes = datatypes, functions = List.revMap (functions, transformFunction), globals = transformStatements globals, main = main} val () = Program.clear program in shrink program end end mlton-20100608/mlton/ssa/ref-flatten.sig0000644000076600000240000000060211404435623016411 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REF_FLATTEN_STRUCTS = sig include SHRINK2 end signature REF_FLATTEN = sig include REF_FLATTEN_STRUCTS val flatten: Program.t -> Program.t end mlton-20100608/mlton/ssa/remove-unused.fun0000644000076600000240000014636711404435623017031 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RemoveUnused (S: REMOVE_UNUSED_STRUCTS): REMOVE_UNUSED = struct open S open Exp Transfer structure Used = struct structure L = TwoPointLattice (val bottom = "unused" val top = "used") open L val use = makeTop val isUsed = isTop val whenUsed = addHandler end structure Coned = struct structure L = TwoPointLattice (val bottom = "not coned" val top = "coned") open L val con = makeTop val isConed = isTop val whenConed = addHandler end structure Deconed = struct structure L = TwoPointLattice (val bottom = "not deconed" val top = "deconed") open L val decon = makeTop val isDeconed = isTop end structure MayReturn = struct structure L = TwoPointLattice (val bottom = "does not return" val top = "may return") open L val return = makeTop val mayReturn = isTop val whenReturns = addHandler end structure MayRaise = struct structure L = TwoPointLattice (val bottom = "does not raise" val top = "may raise") open L val raisee = makeTop val mayRaise = isTop val whenRaises = addHandler end structure VarInfo = struct datatype t = T of {ty: Type.t, used: Used.t} fun layout (T {used, ...}) = Used.layout used local fun make f (T r) = f r in val ty = make #ty val used = make #used end fun new (ty : Type.t): t = T {ty = ty, used = Used.new ()} val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (vi, th) = Used.whenUsed (used vi, th) end structure ConInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, coned: Coned.t, deconed: Deconed.t, dummy: {con: Con.t, args: Type.t vector, exp: Exp.t}} fun layout (T {args, coned, deconed, ...}) = Layout.record [("args", Vector.layout (VarInfo.layout o #1) args), ("coned", Coned.layout coned), ("deconed", Deconed.layout deconed)] local fun make f (T r) = f r in val args = make #args val coned = make #coned val deconed = make #deconed val dummy = make #dummy end val con = Coned.con o coned val isConed = Coned.isConed o coned fun whenConed (ci, th) = Coned.whenConed (coned ci, th) val decon = Deconed.decon o deconed val isDeconed = Deconed.isDeconed o deconed fun new {args: Type.t vector, dummy: {con: Con.t, args: Type.t vector , exp: Exp.t}}: t = T {args = Vector.map (args, fn ty => (VarInfo.new ty, ty)), coned = Coned.new (), deconed = Deconed.new (), dummy = dummy} end structure TyconInfo = struct datatype t = T of {cons: Con.t vector, dummy: {con: Con.t, args: Type.t vector}, numCons: int ref, used: Used.t} fun layout (T {used, ...}) = Layout.record [("used", Used.layout used)] local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val cons = make #cons val dummy = make #dummy val (numCons', numCons) = make' #numCons val used = make #used end fun new {cons: Con.t vector, dummy: {con: Con.t, args: Type.t vector}}: t = T {cons = cons, dummy = dummy, numCons = ref ~1, used = Used.new ()} end structure TypeInfo = struct datatype t = T of {deconed: bool ref, simplify: Type.t option ref, used: bool ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (deconed', _) = make' #deconed val (simplify', _) = make' #simplify val (used', _) = make' #used end fun new (): t = T {deconed = ref false, simplify = ref NONE, used = ref false} end structure FuncInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, bugLabel: Label.t option ref, mayRaise: MayRaise.t, mayReturn: MayReturn.t, raiseLabel: Label.t option ref, raises: (VarInfo.t * Type.t) vector option, returnLabel: Label.t option ref, returns: (VarInfo.t * Type.t) vector option, used: Used.t, wrappers: Block.t list ref} fun layout (T {args, mayRaise, mayReturn, raises, returns, used, ...}) = Layout.record [("args", Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout)) args), ("mayRaise", MayRaise.layout mayRaise), ("mayReturn", MayReturn.layout mayReturn), ("raises", Option.layout (Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout))) raises), ("returns", Option.layout (Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout))) returns), ("used", Used.layout used)] local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val mayRaise' = make #mayRaise val mayReturn' = make #mayReturn val raiseLabel = make #raiseLabel val raises = make #raises val returnLabel = make #returnLabel val returns = make #returns val used = make #used val (wrappers', wrappers) = make' #wrappers end val raisee = MayRaise.raisee o mayRaise' val mayRaise = MayRaise.mayRaise o mayRaise' fun whenRaises (fi, th) = MayRaise.whenRaises (mayRaise' fi, th) fun flowRaises (fi, fi') = MayRaise.<= (mayRaise' fi, mayRaise' fi') val return = MayReturn.return o mayReturn' fun whenReturns (fi, th) = MayReturn.whenReturns (mayReturn' fi, th) val mayReturn = MayReturn.mayReturn o mayReturn' fun flowReturns (fi, fi') = MayReturn.<= (mayReturn' fi, mayReturn' fi') val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (fi, th) = Used.whenUsed (used fi, th) fun new {args: (VarInfo.t * Type.t) vector, raises: (VarInfo.t * Type.t) vector option, returns: (VarInfo.t * Type.t) vector option}: t = T {args = args, bugLabel = ref NONE, mayRaise = MayRaise.new (), mayReturn = MayReturn.new (), raiseLabel = ref NONE, raises = raises, returnLabel = ref NONE, returns = returns, used = Used.new (), wrappers = ref []} end structure LabelInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, func: FuncInfo.t, used: Used.t, wrappers: (Type.t vector * Label.t) list ref} fun layout (T {args, used, ...}) = Layout.record [("args", Vector.layout (VarInfo.layout o #1) args), ("used", Used.layout used)] fun new {args: (VarInfo.t * Type.t) vector, func: FuncInfo.t}: t = T {args = args, func = func, used = Used.new (), wrappers = ref []} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val func = make #func val used = make #used val (wrappers', wrappers) = make' #wrappers end val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (li, th) = Used.whenUsed (used li, th) end fun remove (Program.T {datatypes, globals, functions, main}) = let val {get = conInfo: Con.t -> ConInfo.t, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("RemoveUnused.conInfo", Con.layout)) fun newConInfo (con, args, dummy) = setConInfo (con, ConInfo.new {args = args, dummy = dummy}) val {get = tyconInfo: Tycon.t -> TyconInfo.t, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("RemoveUnused.tyconInfo", Tycon.layout)) fun newTyconInfo (tycon, cons, dummy) = setTyconInfo (tycon, TyconInfo.new {cons = cons, dummy = dummy}) val {get = typeInfo: Type.t -> TypeInfo.t, destroy, ...} = Property.destGet (Type.plist, Property.initFun (fn _ => TypeInfo.new ())) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("RemoveUnused.varInfo", Var.layout)) fun newVarInfo (var, ty) = setVarInfo (var, VarInfo.new ty) val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("RemoveUnused.labelInfo", Label.layout)) val {get = funcInfo: Func.t -> FuncInfo.t, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("RemoveUnused.funcInfo", Func.layout)) val usedTycon = TyconInfo.used o tyconInfo val useTycon = Used.use o usedTycon fun visitTycon (tycon: Tycon.t) = useTycon tycon val isUsedTycon = Used.isUsed o usedTycon fun visitType (ty: Type.t) = let val ti = typeInfo ty val used = TypeInfo.used' ti in if !used then () else let val () = used := true datatype z = datatype Type.dest val () = case Type.dest ty of Array ty => visitType ty | Datatype tycon => visitTycon tycon | Ref ty => visitType ty | Tuple tys => Vector.foreach (tys, visitType) | Vector ty => visitType ty | Weak ty => visitType ty | _ => () in () end end val visitTypeTh = fn ty => fn () => visitType ty val tyVar = VarInfo.ty o varInfo val usedVar = VarInfo.used o varInfo val useVar = Used.use o usedVar val isUsedVar = Used.isUsed o usedVar val whenUsedVar = fn (var, th) => VarInfo.whenUsed (varInfo var, th) fun flowVarInfoTyVarInfoTy ((vi, _), (vi', _)) = Used.<= (VarInfo.used vi, VarInfo.used vi') fun flowVarInfoTysVarInfoTys (xs, ys) = Vector.foreach2 (xs, ys, flowVarInfoTyVarInfoTy) fun flowVarInfoTyVar ((vi, _), x) = Used.<= (VarInfo.used vi, usedVar x) fun flowVarInfoTysVars (xs, ys) = Vector.foreach2 (xs, ys, flowVarInfoTyVar) val newVarInfo = fn (var, ty) => (newVarInfo (var, ty) ; whenUsedVar (var, visitTypeTh ty)) val visitLabelInfo = LabelInfo.use val visitLabelInfoTh = fn li => fn () => visitLabelInfo li val visitLabel = visitLabelInfo o labelInfo val visitLabelTh = fn l => fn () => visitLabel l val visitFuncInfo = FuncInfo.use val visitFunc = visitFuncInfo o funcInfo fun visitVar (x: Var.t) = useVar x fun visitVars (xs: Var.t Vector.t) = Vector.foreach (xs, visitVar) fun visitExp (e: Exp.t) = case e of ConApp {con, args} => let val ci = conInfo con val () = ConInfo.con ci val () = flowVarInfoTysVars (ConInfo.args ci, args) in () end | Const _ => () | PrimApp {prim, args, ...} => let val () = visitVars args datatype z = datatype Type.dest fun deconType (ty: Type.t) = let val ti = typeInfo ty val deconed = TypeInfo.deconed' ti in if !deconed then () else let val () = deconed := true val () = case Type.dest ty of Datatype t => Vector.foreach (TyconInfo.cons (tyconInfo t), fn con => deconCon con) | Tuple ts => Vector.foreach (ts, deconType) | Vector t => deconType t | _ => () in () end end and deconCon con = let val ci = conInfo con val () = ConInfo.decon ci val () = Vector.foreach (ConInfo.args ci, fn (x, t) => (VarInfo.use x ; deconType t)) in () end val () = case Prim.name prim of Prim.Name.MLton_eq => (* MLton_eq may be used on datatypes used as enums. *) deconType (tyVar (Vector.sub (args, 0))) | Prim.Name.MLton_equal => (* MLton_equal will be expanded by poly-equal into uses * of constructors as patterns. *) deconType (tyVar (Vector.sub (args, 0))) | Prim.Name.MLton_hash => (* MLton_hash will be expanded by poly-hash into uses * of constructors as patterns. *) deconType (tyVar (Vector.sub (args, 0))) (* | Prim.Name.MLton_size => deconType (tyVar (Vector.sub (args, 0))) *) | _ => () in () end | Profile _ => () | Select {tuple, ...} => visitVar tuple | Tuple xs => visitVars xs | Var x => visitVar x val visitExpTh = fn e => fn () => visitExp e fun maybeVisitVarExp (var, exp) = Option.app (var, fn var => VarInfo.whenUsed (varInfo var, visitExpTh exp)) fun visitStatement (Statement.T {exp, var, ty, ...}) = (Option.app (var, fn var => newVarInfo (var, ty)) ; if Exp.maySideEffect exp then (visitType ty ; visitExp exp) else maybeVisitVarExp (var, exp)) fun visitTransfer (t: Transfer.t, fi: FuncInfo.t) = case t of Arith {args, overflow, success, ty, ...} => (visitVars args ; visitLabel overflow ; visitLabel success ; visitType ty) | Bug => () | Call {args, func, return} => let datatype u = None | Caller | Some of Label.t val (cont, handler) = case return of Return.Dead => (None, None) | Return.NonTail {cont, handler} => (Some cont, case handler of Handler.Caller => Caller | Handler.Dead => None | Handler.Handle h => Some h) | Return.Tail => (Caller, Caller) val fi' = funcInfo func val () = flowVarInfoTysVars (FuncInfo.args fi', args) val () = case cont of None => () | Caller => let val () = case (FuncInfo.returns fi, FuncInfo.returns fi') of (SOME xts, SOME xts') => flowVarInfoTysVarInfoTys (xts, xts') | _ => () val () = FuncInfo.flowReturns (fi', fi) in () end | Some l => let val li = labelInfo l val () = Option.app (FuncInfo.returns fi', fn xts => flowVarInfoTysVarInfoTys (LabelInfo.args li, xts)) val () = FuncInfo.whenReturns (fi', visitLabelInfoTh li) in () end val () = case handler of None => () | Caller => let val () = case (FuncInfo.raises fi, FuncInfo.raises fi') of (SOME xts, SOME xts') => flowVarInfoTysVarInfoTys (xts, xts') | _ => () val () = FuncInfo.flowRaises (fi', fi) in () end | Some l => let val li = labelInfo l val () = Option.app (FuncInfo.raises fi', fn xts => flowVarInfoTysVarInfoTys (LabelInfo.args li, xts)) val () = FuncInfo.whenRaises (fi', visitLabelInfoTh li) in () end val () = visitFuncInfo fi' in () end | Case {test, cases, default} => let val () = visitVar test in case cases of Cases.Word (_, cs) => (Vector.foreach (cs, visitLabel o #2) ; Option.app (default, visitLabel)) | Cases.Con cases => if Vector.length cases = 0 then Option.app (default, visitLabel) else let val () = Vector.foreach (cases, fn (con, l) => let val ci = conInfo con val () = ConInfo.decon ci val li = labelInfo l val () = flowVarInfoTysVarInfoTys (LabelInfo.args li, ConInfo.args ci) val () = ConInfo.whenConed (ci, visitLabelTh l) in () end) val tycon = case Type.dest (tyVar test) of Type.Datatype tycon => tycon | _ => Error.bug "RemoveUnused.visitTransfer: Case:non-Datatype" val cons = TyconInfo.cons (tyconInfo tycon) in case default of NONE => () | SOME l => Vector.foreach (cons, fn con => if Vector.exists (cases, fn (c, _) => Con.equals(c, con)) then () else ConInfo.whenConed (conInfo con, visitLabelTh l)) end end | Goto {dst, args} => let val li = labelInfo dst val () = flowVarInfoTysVars (LabelInfo.args li, args) val () = visitLabelInfo li in () end | Raise xs => (FuncInfo.raisee fi ; flowVarInfoTysVars (valOf (FuncInfo.raises fi), xs)) | Return xs => (FuncInfo.return fi ; flowVarInfoTysVars (valOf (FuncInfo.returns fi), xs)) | Runtime {args, return, ...} => (visitVars args ; visitLabel return) fun visitBlock (Block.T {statements, transfer, ...}, fi: FuncInfo.t) = (Vector.foreach (statements, visitStatement) ; visitTransfer (transfer, fi)) val visitBlockTh = fn (b, fi) => fn () => visitBlock (b, fi) (* Visit all reachable expressions. *) val () = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val dummyCon = Con.newString "dummy" val dummyArgs = Vector.new0 () val dummy = {con = dummyCon, args = dummyArgs} val () = newTyconInfo (tycon, Vector.map (cons, fn {con, ...} => con), dummy) val dummyExp = ConApp {args = Vector.new0 (), con = dummyCon} val dummy = {con = dummyCon, args = dummyArgs, exp = dummyExp} val () = Vector.foreach (cons, fn {con, args} => newConInfo (con, args, dummy)) in () end) val () = let fun doitCon c = let val ci = conInfo c in ConInfo.con ci ; ConInfo.decon ci end in useTycon Tycon.bool ; doitCon Con.truee ; doitCon Con.falsee end val () = Vector.foreach (globals, visitStatement) val () = List.foreach (functions, fn function => let val {name, args, raises, returns, start, blocks, ...} = Function.dest function val () = Vector.foreach (args, newVarInfo) local fun doitVarTys vts = Vector.map (vts, fn (x, t) => (varInfo x, t)) fun doitTys ts = Vector.map (ts, fn t => (VarInfo.new t, t)) fun doitTys' ts = Option.map (ts, doitTys) in val fi = FuncInfo.new {args = doitVarTys args, raises = doitTys' raises, returns = doitTys' returns} end val () = setFuncInfo (name, fi) val () = FuncInfo.whenUsed (fi, visitLabelTh start) val () = Vector.foreach (blocks, fn block as Block.T {label, args, ...} => let val () = Vector.foreach (args, newVarInfo) local fun doitVarTys vts = Vector.map (vts, fn (x, t) => (varInfo x, t)) in val li = LabelInfo.new {args = doitVarTys args, func = fi} end val () = setLabelInfo (label, li) val () = LabelInfo.whenUsed (li, visitBlockTh (block, fi)) in () end) in () end) val () = visitFunc main (* Diagnostics *) val () = Control.diagnostics (fn display => let open Layout in Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => display (seq [Tycon.layout tycon, str ": ", TyconInfo.layout (tyconInfo tycon), str ": ", Vector.layout (fn {con, ...} => seq [Con.layout con, str " ", ConInfo.layout (conInfo con)]) cons])); display (str "\n"); List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in display (seq [Func.layout name, str ": ", FuncInfo.layout (funcInfo name)]); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str ": ", LabelInfo.layout (labelInfo label)])); display (str "\n") end) end) (* Analysis is done, Now build the resulting program. *) fun getWrapperLabel (l: Label.t, args: (VarInfo.t * Type.t) vector) = let val li = labelInfo l in if Vector.forall2 (args, LabelInfo.args li, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) then l else let val tys = Vector.keepAllMap (args, fn (x, ty) => if VarInfo.isUsed x then SOME ty else NONE) in case List.peek (LabelInfo.wrappers li, fn (args', _) => Vector.length args' = Vector.length tys andalso Vector.forall2 (args', tys, fn (ty', ty) => Type.equals (ty', ty))) of NONE => let val liArgs = LabelInfo.args li val l' = Label.newNoname () val (args', args'') = Vector.unzip (Vector.map2 (args, liArgs, fn ((x, ty), (y, _)) => let val z = Var.newNoname () in (if VarInfo.isUsed x then SOME (z, ty) else NONE, if VarInfo.isUsed y then SOME z else NONE) end)) val args' = Vector.keepAllMap (args', fn x => x) val (_, tys') = Vector.unzip args' val args'' = Vector.keepAllMap (args'', fn x => x) val block = Block.T {label = l', args = args', statements = Vector.new0 (), transfer = Goto {dst = l, args = args''}} val () = List.push (LabelInfo.wrappers' li, (tys', l')) val () = List.push (FuncInfo.wrappers' (LabelInfo.func li), block) in l' end | SOME (_, l') => l' end end val getConWrapperLabel = getWrapperLabel val getContWrapperLabel = getWrapperLabel val getHandlerWrapperLabel = getWrapperLabel fun getOriginalWrapperLabel l = getWrapperLabel (l, Vector.map (LabelInfo.args (labelInfo l), fn (_, t) => let val x = VarInfo.new t val () = VarInfo.use x in (x, t) end)) val getArithOverflowWrapperLabel = getOriginalWrapperLabel val getArithSuccessWrapperLabel = getOriginalWrapperLabel val getRuntimeWrapperLabel = getOriginalWrapperLabel fun getBugFunc (fi: FuncInfo.t): Label.t = (* Can't share the Bug block across different places because the * profile sourceInfo stack might be different. *) let val l = Label.newNoname () val block = Block.T {label = l, args = Vector.new0 (), statements = Vector.new0 (), transfer = Bug} val () = List.push (FuncInfo.wrappers' fi, block) in l end fun getReturnFunc (fi: FuncInfo.t): Label.t = let val r = FuncInfo.returnLabel fi in case !r of NONE => let val l = Label.newNoname () val returns = valOf (FuncInfo.returns fi) val args = Vector.keepAllMap (returns, fn (vi, ty) => if VarInfo.isUsed vi then SOME (Var.newNoname (), ty) else NONE) val xs = Vector.map (args, #1) val block = Block.T {label = l, args = args, statements = Vector.new0 (), transfer = Return xs} val () = r := SOME l val () = List.push (FuncInfo.wrappers' fi, block) val () = setLabelInfo (l, LabelInfo.new {func = fi, args = returns}) in l end | SOME l => l end fun getReturnContFunc (fi, args) = getWrapperLabel (getReturnFunc fi, args) fun getRaiseFunc (fi: FuncInfo.t): Label.t = let val r = FuncInfo.raiseLabel fi in case !r of NONE => let val l = Label.newNoname () val raises = valOf (FuncInfo.raises fi) val args = Vector.keepAllMap (raises, fn (vi, ty) => if VarInfo.isUsed vi then SOME (Var.newNoname (), ty) else NONE) val xs = Vector.map (args, #1) val block = Block.T {label = l, args = args, statements = Vector.new0 (), transfer = Raise xs} val () = r := SOME l val () = List.push (FuncInfo.wrappers' fi, block) val () = setLabelInfo (l, LabelInfo.new {func = fi, args = raises}) in l end | SOME l => l end fun getRaiseHandlerFunc (fi, args) = getWrapperLabel (getRaiseFunc fi, args) fun simplifyType (ty: Type.t): Type.t = let val ti = typeInfo ty val simplify = TypeInfo.simplify' ti in case !simplify of NONE => let datatype z = datatype Type.dest val ty = case Type.dest ty of Array ty => Type.array (simplifyType ty) | Ref ty => Type.reff (simplifyType ty) | Tuple tys => Type.tuple (Vector.map (tys, simplifyType)) | Vector ty => Type.vector (simplifyType ty) | Weak ty => Type.weak (simplifyType ty) | _ => ty in simplify := SOME ty ; ty end | SOME ty => ty end val datatypes = Vector.keepAllMap (datatypes, fn Datatype.T {tycon, cons} => if isUsedTycon tycon then let val needsDummy : bool ref = ref false val cons = Vector.keepAllMap (cons, fn {con, ...} => let val ci = conInfo con fun addDummy () = if !needsDummy then NONE else let val () = needsDummy := true in SOME (TyconInfo.dummy (tyconInfo tycon)) end in case (ConInfo.isConed ci, ConInfo.isDeconed ci) of (false, _) => NONE | (true, true) => SOME {args = Vector.keepAllMap (ConInfo.args ci, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE), con = con} | (true, false) => addDummy () end) val num = Vector.length cons val () = TyconInfo.numCons' (tyconInfo tycon) := num in SOME (Datatype.T {tycon = tycon, cons = cons}) end else NONE) fun simplifyExp (e: Exp.t): Exp.t = case e of ConApp {con, args} => let val ci = conInfo con in if ConInfo.isDeconed ci then let val ciArgs = ConInfo.args ci in ConApp {args = (Vector.keepAllMap2 (args, ciArgs, fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)), con = con} end else #exp (ConInfo.dummy ci) end | PrimApp {prim, targs, args} => PrimApp {prim = prim, targs = Vector.map (targs, simplifyType), args = args} | _ => e fun simplifyStatement (s as Statement.T {var, ty, exp}) : Statement.t option = case exp of Profile _ => SOME s | _ => let fun doit' var = SOME (Statement.T {var = var, ty = simplifyType ty, exp = simplifyExp exp}) fun doit var' = if Exp.maySideEffect exp then doit' var else if isSome var' then doit' var' else NONE in case var of SOME var => if isUsedVar var then doit (SOME var) else doit NONE | NONE => doit NONE end fun simplifyStatements (ss: Statement.t Vector.t) : Statement.t Vector.t = Vector.keepAllMap (ss, simplifyStatement) fun simplifyTransfer (t: Transfer.t, fi: FuncInfo.t): Transfer.t = case t of Arith {prim, args, overflow, success, ty} => Arith {prim = prim, args = args, overflow = getArithOverflowWrapperLabel overflow, success = getArithSuccessWrapperLabel success, ty = simplifyType ty} | Bug => Bug | Call {func, args, return} => let val fi' = funcInfo func datatype u = None | Caller | Some of Label.t val (cont, handler) = case return of Return.Dead => (None, None) | Return.NonTail {cont, handler} => (Some cont, case handler of Handler.Caller => Caller | Handler.Dead => None | Handler.Handle h => Some h) | Return.Tail => (Caller, Caller) val cont = if FuncInfo.mayReturn fi' then case cont of None => Error.bug "RemoveUnused.simplifyTransfer: cont:None" | Caller => (if (case (FuncInfo.returns fi, FuncInfo.returns fi') of (SOME xts, SOME yts) => Vector.forall2 (xts, yts, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) | _ => Error.bug "RemoveUnused.simplifyTransfer: cont:Caller") then Caller else Some (getReturnContFunc (fi, valOf (FuncInfo.returns fi')))) | Some l => Some (getContWrapperLabel (l, valOf (FuncInfo.returns fi'))) else None val handler = if FuncInfo.mayRaise fi' then (case handler of None => Error.bug "RemoveUnused.simplifyTransfer: handler:None" | Caller => (if (case (FuncInfo.raises fi, FuncInfo.raises fi') of (SOME xts, SOME yts) => Vector.forall2 (xts, yts, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) | _ => Error.bug "RemoveUnused.simplifyTransfer: handler:Caller") then Caller else Some (getRaiseHandlerFunc (fi, valOf (FuncInfo.raises fi')))) | Some l => Some (getHandlerWrapperLabel (l, valOf (FuncInfo.raises fi')))) else None val return = case (cont, handler) of (None, None) => Return.Dead | (None, Caller) => Return.Tail | (None, Some h) => Return.NonTail {cont = getBugFunc fi, handler = Handler.Handle h} | (Caller, None) => Return.Tail | (Caller, Caller) => Return.Tail | (Caller, Some h) => Return.NonTail {cont = getReturnContFunc (fi, valOf (FuncInfo.returns fi')), handler = Handler.Handle h} | (Some c, None) => Return.NonTail {cont = c, handler = Handler.Dead} | (Some c, Caller) => Return.NonTail {cont = c, handler = Handler.Caller} | (Some c, Some h) => Return.NonTail {cont = c, handler = Handler.Handle h} val args = Vector.keepAllMap2 (args, FuncInfo.args fi', fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE) in Call {func = func, args = args, return = return} end | Case {test, cases = Cases.Con cases, default} => let val cases = Vector.keepAllMap (cases, fn (con, l) => let val ci = conInfo con in if ConInfo.isConed ci then SOME (con, getConWrapperLabel (l, ConInfo.args ci)) else NONE end) fun keep default = Case {test = test, cases = Cases.Con cases, default = default} fun none () = keep NONE in case default of NONE => none () | SOME l => if Vector.length cases = 0 then if LabelInfo.isUsed (labelInfo l) then Goto {dst = l, args = Vector.new0 ()} else Bug else let val tycon = case Type.dest (tyVar test) of Type.Datatype tycon => tycon | _ => Error.bug "RemoveUnused.simplifyTransfer: Case:non-Datatype" val numCons = TyconInfo.numCons (tyconInfo tycon) in if Vector.length cases = numCons then none () else keep (SOME l) end end | Case {test, cases, default} => Case {test = test, cases = cases, default = default} | Goto {dst, args} => Goto {dst = dst, args = (Vector.keepAllMap2 (args, LabelInfo.args (labelInfo dst), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE))} | Raise xs => Raise (Vector.keepAllMap2 (xs, valOf (FuncInfo.raises fi), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)) | Return xs => Return (Vector.keepAllMap2 (xs, valOf (FuncInfo.returns fi), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)) | Runtime {prim, args, return} => Runtime {prim = prim, args = args, return = getRuntimeWrapperLabel return} val simplifyTransfer = Trace.trace ("RemoveUnused.simplifyTransfer", Layout.tuple2 (Transfer.layout, FuncInfo.layout), Transfer.layout) simplifyTransfer fun simplifyBlock (Block.T {label, args, statements, transfer}): Block.t option = let val li = labelInfo label in if LabelInfo.isUsed li then let val args = Vector.keepAllMap2 (LabelInfo.args li, args, fn ((vi, _), (x, ty)) => if VarInfo.isUsed vi then SOME (x, simplifyType ty) else NONE) val statements = simplifyStatements statements val transfer = simplifyTransfer (transfer, LabelInfo.func li) in SOME (Block.T {label = label, args = args, statements = statements, transfer = transfer}) end else NONE end fun simplifyBlocks (bs: Block.t Vector.t): Block.t Vector.t = Vector.keepAllMap (bs, simplifyBlock) val globals = simplifyStatements globals val shrink = shrinkFunction {globals = globals} fun simplifyFunction (f: Function.t): Function.t option = let val {args, blocks, mayInline, name, start, ...} = Function.dest f val fi = funcInfo name in if FuncInfo.isUsed fi then let val args = Vector.keepAllMap2 (FuncInfo.args fi, args, fn ((vi, _), (x, ty)) => if VarInfo.isUsed vi then SOME (x, simplifyType ty) else NONE) val blocks = simplifyBlocks blocks val wrappers = Vector.fromList (FuncInfo.wrappers fi) val blocks = Vector.concat [wrappers, blocks] val returns = case FuncInfo.returns fi of NONE => NONE | SOME xts => if FuncInfo.mayReturn fi then SOME (Vector.keepAllMap (xts, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)) else NONE val raises = case FuncInfo.raises fi of NONE => NONE | SOME xts => if FuncInfo.mayRaise fi then SOME (Vector.keepAllMap (xts, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)) else NONE in SOME (shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start})) end else NONE end fun simplifyFunctions (fs: Function.t List.t): Function.t List.t = List.keepAllMap (fs, simplifyFunction) val functions = simplifyFunctions functions val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val () = destroy () val () = Program.clearTop program in program end end mlton-20100608/mlton/ssa/remove-unused.sig0000644000076600000240000000067711404435623017014 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REMOVE_UNUSED_STRUCTS = sig include SHRINK end signature REMOVE_UNUSED = sig include REMOVE_UNUSED_STRUCTS val remove: Program.t -> Program.t end mlton-20100608/mlton/ssa/remove-unused2.fun0000644000076600000240000017464611404435623017114 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor RemoveUnused2 (S: REMOVE_UNUSED2_STRUCTS): REMOVE_UNUSED2 = struct open S open Exp Statement Transfer structure Used = struct structure L = TwoPointLattice (val bottom = "unused" val top = "used") open L val use = makeTop val isUsed = isTop val whenUsed = addHandler end structure Coned = struct structure L = TwoPointLattice (val bottom = "not coned" val top = "coned") open L val con = makeTop val isConed = isTop val whenConed = addHandler end structure Deconed = struct structure L = TwoPointLattice (val bottom = "not deconed" val top = "deconed") open L val decon = makeTop val isDeconed = isTop end structure MayReturn = struct structure L = TwoPointLattice (val bottom = "does not return" val top = "may return") open L val return = makeTop val mayReturn = isTop val whenReturns = addHandler end structure MayRaise = struct structure L = TwoPointLattice (val bottom = "does not raise" val top = "may raise") open L val raisee = makeTop val mayRaise = isTop val whenRaises = addHandler end structure VarInfo = struct datatype t = T of {ty: Type.t, used: Used.t} fun layout (T {used, ...}) = Used.layout used local fun make f (T r) = f r in val ty = make #ty val used = make #used end fun new (ty : Type.t): t = T {ty = ty, used = Used.new ()} val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (vi, th) = Used.whenUsed (used vi, th) end structure ConInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) Prod.t, coned: Coned.t, deconed: Deconed.t, dummy: {con: Con.t, args: Type.t Prod.t, ty: Type.t, exp: Exp.t}, used: Used.t} fun layout (T {args, coned, deconed, used, ...}) = Layout.record [("args", Prod.layout (args, VarInfo.layout o #1)), ("coned", Coned.layout coned), ("deconed", Deconed.layout deconed), ("used", Used.layout used)] local fun make f (T r) = f r in val args = make #args val coned = make #coned val deconed = make #deconed val dummy = make #dummy val used = make #used end val con = Coned.con o coned val isConed = Coned.isConed o coned fun whenConed (ci, th) = Coned.whenConed (coned ci, th) val decon = Deconed.decon o deconed val isDeconed = Deconed.isDeconed o deconed val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (vi, th) = Used.whenUsed (used vi, th) fun new {args: Type.t Prod.t, dummy: {con: Con.t, args: Type.t Prod.t, ty: Type.t, exp: Exp.t}}: t = T {args = Prod.map (args, fn ty => (VarInfo.new ty, ty)), coned = Coned.new (), deconed = Deconed.new (), dummy = dummy, used = Used.new ()} end structure TyconInfo = struct datatype t = T of {cons: Con.t vector, dummy: {con: Con.t, args: Type.t Prod.t}, numCons: int ref, used: Used.t} fun layout (T {used, ...}) = Layout.record [("used", Used.layout used)] local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val cons = make #cons val dummy = make #dummy val (numCons', numCons) = make' #numCons val used = make #used end fun new {cons: Con.t vector, dummy: {con: Con.t, args: Type.t Prod.t}}: t = T {cons = cons, dummy = dummy, numCons = ref ~1, used = Used.new ()} end structure TypeInfo = struct datatype t = T of {deconed: bool ref, simplify: Type.t option ref, used: bool ref} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (deconed', _) = make' #deconed val (simplify', _) = make' #simplify val (used', _) = make' #used end fun new (): t = T {deconed = ref false, simplify = ref NONE, used = ref false} end structure FuncInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, bugLabel: Label.t option ref, mayRaise: MayRaise.t, mayReturn: MayReturn.t, raiseLabel: Label.t option ref, raises: (VarInfo.t * Type.t) vector option, returnLabel: Label.t option ref, returns: (VarInfo.t * Type.t) vector option, used: Used.t, wrappers: Block.t list ref} fun layout (T {args, mayRaise, mayReturn, raises, returns, used, ...}) = Layout.record [("args", Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout)) args), ("mayRaise", MayRaise.layout mayRaise), ("mayReturn", MayReturn.layout mayReturn), ("raises", Option.layout (Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout))) raises), ("returns", Option.layout (Vector.layout (Layout.tuple2 (VarInfo.layout, Type.layout))) returns), ("used", Used.layout used)] local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val mayRaise' = make #mayRaise val mayReturn' = make #mayReturn val raiseLabel = make #raiseLabel val raises = make #raises val returnLabel = make #returnLabel val returns = make #returns val used = make #used val (wrappers', wrappers) = make' #wrappers end val raisee = MayRaise.raisee o mayRaise' val mayRaise = MayRaise.mayRaise o mayRaise' fun whenRaises (fi, th) = MayRaise.whenRaises (mayRaise' fi, th) fun flowRaises (fi, fi') = MayRaise.<= (mayRaise' fi, mayRaise' fi') val return = MayReturn.return o mayReturn' fun whenReturns (fi, th) = MayReturn.whenReturns (mayReturn' fi, th) val mayReturn = MayReturn.mayReturn o mayReturn' fun flowReturns (fi, fi') = MayReturn.<= (mayReturn' fi, mayReturn' fi') val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (fi, th) = Used.whenUsed (used fi, th) fun new {args: (VarInfo.t * Type.t) vector, raises: (VarInfo.t * Type.t) vector option, returns: (VarInfo.t * Type.t) vector option}: t = T {args = args, bugLabel = ref NONE, mayRaise = MayRaise.new (), mayReturn = MayReturn.new (), raiseLabel = ref NONE, raises = raises, returnLabel = ref NONE, returns = returns, used = Used.new (), wrappers = ref []} end structure LabelInfo = struct datatype t = T of {args: (VarInfo.t * Type.t) vector, func: FuncInfo.t, used: Used.t, wrappers: (Type.t vector * Label.t) list ref} fun layout (T {args, used, ...}) = Layout.record [("args", Vector.layout (VarInfo.layout o #1) args), ("used", Used.layout used)] fun new {args: (VarInfo.t * Type.t) vector, func: FuncInfo.t}: t = T {args = args, func = func, used = Used.new (), wrappers = ref []} local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val args = make #args val func = make #func val used = make #used val (wrappers', wrappers) = make' #wrappers end val use = Used.use o used val isUsed = Used.isUsed o used fun whenUsed (li, th) = Used.whenUsed (used li, th) end fun remove (Program.T {datatypes, globals, functions, main}) = let val {get = conInfo: Con.t -> ConInfo.t, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("RemoveUnused2.conInfo", Con.layout)) fun newConInfo (con, args, dummy) = setConInfo (con, ConInfo.new {args = args, dummy = dummy}) val {get = tyconInfo: Tycon.t -> TyconInfo.t, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("RemoveUnused2.tyconInfo", Tycon.layout)) fun newTyconInfo (tycon, cons, dummy) = setTyconInfo (tycon, TyconInfo.new {cons = cons, dummy = dummy}) val {get = typeInfo: Type.t -> TypeInfo.t, destroy, ...} = Property.destGet (Type.plist, Property.initFun (fn _ => TypeInfo.new ())) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("RemoveUnused2.varInfo", Var.layout)) fun newVarInfo (var, ty) = setVarInfo (var, VarInfo.new ty) val {get = labelInfo: Label.t -> LabelInfo.t, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("RemoveUnused2.labelInfo", Label.layout)) val {get = funcInfo: Func.t -> FuncInfo.t, set = setFuncInfo, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("RemoveUnused2.funcInfo", Func.layout)) val usedCon = ConInfo.used o conInfo val useCon = Used.use o usedCon fun visitCon (con: Con.t) = useCon con val whenUsedCon = fn (con, th) => ConInfo.whenUsed (conInfo con, th) val usedTycon = TyconInfo.used o tyconInfo val useTycon = Used.use o usedTycon fun visitTycon (tycon: Tycon.t) = useTycon tycon val isUsedTycon = Used.isUsed o usedTycon fun visitType (ty: Type.t) = let val ti = typeInfo ty val used = TypeInfo.used' ti in if !used then () else let val () = used := true datatype z = datatype Type.dest datatype z = datatype ObjectCon.t val () = case Type.dest ty of Datatype tycon => visitTycon tycon | Object {args, con} => let val () = Prod.foreach (args, visitType) val () = case con of Con con => visitCon con | Tuple => () | Vector => () in () end | Weak ty => visitType ty | _ => () in () end end val visitTypeTh = fn ty => fn () => visitType ty val tyVar = VarInfo.ty o varInfo val usedVar = VarInfo.used o varInfo val useVar = Used.use o usedVar val isUsedVar = Used.isUsed o usedVar val whenUsedVar = fn (var, th) => VarInfo.whenUsed (varInfo var, th) fun flowVarInfoTyVarInfoTy ((vi, _), (vi', _)) = Used.<= (VarInfo.used vi, VarInfo.used vi') fun flowVarInfoTysVarInfoTys (xs, ys) = Vector.foreach2 (xs, ys, flowVarInfoTyVarInfoTy) fun flowVarInfoTyVar ((vi, _), x) = Used.<= (VarInfo.used vi, usedVar x) fun flowVarInfoTysVars (xs, ys) = Vector.foreach2 (xs, ys, flowVarInfoTyVar) val newVarInfo = fn (var, ty) => (newVarInfo (var, ty) ; whenUsedVar (var, visitTypeTh ty)) val visitLabelInfo = LabelInfo.use val visitLabelInfoTh = fn li => fn () => visitLabelInfo li val visitLabel = visitLabelInfo o labelInfo val visitLabelTh = fn l => fn () => visitLabel l val visitFuncInfo = FuncInfo.use val visitFunc = visitFuncInfo o funcInfo fun visitVar (x: Var.t) = useVar x fun visitVars (xs: Var.t Vector.t) = Vector.foreach (xs, visitVar) fun visitExp (e: Exp.t) = case e of Const _ => () | Inject {sum, variant} => (visitTycon sum ; visitVar variant) | Object {args, con} => let val () = case con of NONE => visitVars args | SOME con => let val ci = conInfo con val () = ConInfo.con ci val ciArgs = Vector.map (Prod.dest (ConInfo.args ci), #elt) val () = flowVarInfoTysVars (ciArgs, args) in () end in () end | PrimApp {prim, args, ...} => let val () = visitVars args datatype z = datatype Type.dest datatype z = datatype ObjectCon.t fun deconType (ty: Type.t) = let val ti = typeInfo ty val deconed = TypeInfo.deconed' ti in if !deconed then () else let val () = deconed := true val () = case Type.dest ty of Datatype t => Vector.foreach (TyconInfo.cons (tyconInfo t), fn con => deconCon con) | Object {args, con} => let fun default () = Vector.foreach (Prod.dest args, fn {elt, isMutable} => if isMutable then () else deconType elt) val () = case con of Con con => deconCon con | Tuple => default () | Vector => default () in () end | _ => () in () end end and deconCon con = let val ci = conInfo con val () = ConInfo.decon ci val () = Vector.foreach (Prod.dest (ConInfo.args ci), fn {elt = (x, t), isMutable} => (VarInfo.use x ; if isMutable then () else deconType t)) in () end val () = case Prim.name prim of Prim.Name.MLton_eq => (* MLton_eq may be used on datatypes used as enums. *) deconType (tyVar (Vector.sub (args, 0))) | Prim.Name.MLton_equal => (* MLton_equal will be expanded by poly-equal into uses * of constructors as patterns. *) deconType (tyVar (Vector.sub (args, 0))) | Prim.Name.MLton_hash => (* MLton_hash will be expanded by poly-hash into uses * of constructors as patterns. *) deconType (tyVar (Vector.sub (args, 0))) (* | Prim.Name.MLton_size => deconType (tyVar (Vector.sub (args, 0))) *) | _ => () in () end | Select {base, offset} => let datatype z = datatype Base.t datatype z = datatype ObjectCon.t in case base of Object base => let val () = visitVar base val () = case Type.dest (tyVar base) of Type.Object {con, ...} => (case con of Con con => let val ci = conInfo con val ciArgs = ConInfo.args ci val {elt = (vi, _), ...} = Prod.sub (ciArgs, offset) val () = ConInfo.decon ci val () = VarInfo.use vi in () end | Tuple => () | Vector => Error.bug "RemoveUnused2.visitExp: Select:non-Con|Tuple") | _ => Error.bug "RemovUnused2.visitExp: Select:non-Object" in () end | VectorSub {index, vector} => (visitVar index ; visitVar vector) end | Var x => visitVar x val visitExpTh = fn e => fn () => visitExp e fun maybeVisitVarExp (var, exp) = Option.app (var, fn var => VarInfo.whenUsed (varInfo var, visitExpTh exp)) fun visitStatement s = case s of Bind {exp, ty, var} => (Option.app (var, fn var => newVarInfo (var, ty)) ; if Exp.maySideEffect exp then (visitType ty ; visitExp exp) else maybeVisitVarExp (var, exp)) | Profile _ => () | Update {base, offset, value} => let datatype z = datatype Base.t datatype z = datatype ObjectCon.t in case base of Object base => (case Type.dest (tyVar base) of Type.Object {con, ...} => (case con of Con con => let val ci = conInfo con val ciArgs = ConInfo.args ci val {elt = (vi, _), ...} = Prod.sub (ciArgs, offset) in VarInfo.whenUsed (vi, fn () => (ConInfo.decon ci ; visitVar base ; visitVar value)) end | Tuple => (visitVar base ; visitVar value) | Vector => Error.bug "RemoveUnused2.visitStatement: Update:non-Con|Tuple") | _ => Error.bug "RemoveUnused2.visitStatement: Update:non-Object") | VectorSub {index, vector} => (visitVar index ; visitVar vector ; visitVar value) end fun visitTransfer (t: Transfer.t, fi: FuncInfo.t) = case t of Arith {args, overflow, success, ty, ...} => (visitVars args ; visitLabel overflow ; visitLabel success ; visitType ty) | Bug => () | Call {args, func, return} => let datatype u = None | Caller | Some of Label.t val (cont, handler) = case return of Return.Dead => (None, None) | Return.NonTail {cont, handler} => (Some cont, case handler of Handler.Caller => Caller | Handler.Dead => None | Handler.Handle h => Some h) | Return.Tail => (Caller, Caller) val fi' = funcInfo func val () = flowVarInfoTysVars (FuncInfo.args fi', args) val () = case cont of None => () | Caller => let val () = case (FuncInfo.returns fi, FuncInfo.returns fi') of (SOME xts, SOME xts') => flowVarInfoTysVarInfoTys (xts, xts') | _ => () val () = FuncInfo.flowReturns (fi', fi) in () end | Some l => let val li = labelInfo l val () = Option.app (FuncInfo.returns fi', fn xts => flowVarInfoTysVarInfoTys (LabelInfo.args li, xts)) val () = FuncInfo.whenReturns (fi', visitLabelInfoTh li) in () end val () = case handler of None => () | Caller => let val () = case (FuncInfo.raises fi, FuncInfo.raises fi') of (SOME xts, SOME xts') => flowVarInfoTysVarInfoTys (xts, xts') | _ => () val () = FuncInfo.flowRaises (fi', fi) in () end | Some l => let val li = labelInfo l val () = Option.app (FuncInfo.raises fi', fn xts => flowVarInfoTysVarInfoTys (LabelInfo.args li, xts)) val () = FuncInfo.whenRaises (fi', visitLabelInfoTh li) in () end val () = visitFuncInfo fi' in () end | Case {test, cases, default} => let val () = visitVar test in case cases of Cases.Word (_, cs) => (Vector.foreach (cs, visitLabel o #2) ; Option.app (default, visitLabel)) | Cases.Con cases => if Vector.length cases = 0 then Option.app (default, visitLabel) else let val () = Vector.foreach (cases, fn (con, l) => let val ci = conInfo con val () = ConInfo.decon ci val () = ConInfo.whenConed (ci, visitLabelTh l) in () end) val tycon = case Type.dest (tyVar test) of Type.Datatype tycon => tycon | _ => Error.bug "RemoveUnused2.visitTransfer: Case:non-Datatype" val cons = TyconInfo.cons (tyconInfo tycon) in case default of NONE => () | SOME l => Vector.foreach (cons, fn con => if Vector.exists (cases, fn (c, _) => Con.equals(c, con)) then () else ConInfo.whenConed (conInfo con, visitLabelTh l)) end end | Goto {dst, args} => let val li = labelInfo dst val () = flowVarInfoTysVars (LabelInfo.args li, args) val () = visitLabelInfo li in () end | Raise xs => (FuncInfo.raisee fi ; flowVarInfoTysVars (valOf (FuncInfo.raises fi), xs)) | Return xs => (FuncInfo.return fi ; flowVarInfoTysVars (valOf (FuncInfo.returns fi), xs)) | Runtime {args, return, ...} => (visitVars args ; visitLabel return) fun visitBlock (Block.T {statements, transfer, ...}, fi: FuncInfo.t) = (Vector.foreach (statements, visitStatement) ; visitTransfer (transfer, fi)) val visitBlockTh = fn (b, fi) => fn () => visitBlock (b, fi) (* Visit all reachable expressions. *) val () = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val dummyCon = Con.newString "dummy" val dummyArgs = Prod.empty () val dummy = {con = dummyCon, args = dummyArgs} val () = newTyconInfo (tycon, Vector.map (cons, fn {con, ...} => con), dummy) val dummyTy = Type.conApp (dummyCon, dummyArgs) val dummyExp = Object {args = Vector.new0 (), con = SOME dummyCon} val dummy = {con = dummyCon, args = dummyArgs, ty = dummyTy, exp = dummyExp} val () = Vector.foreach (cons, fn {con, args} => (newConInfo (con, args, dummy) ; whenUsedCon (con, fn () => useTycon tycon))) in () end) val () = let fun doitCon c = let val ci = conInfo c in ConInfo.use ci ; ConInfo.con ci ; ConInfo.decon ci end in useTycon Tycon.bool ; doitCon Con.truee ; doitCon Con.falsee end val () = Vector.foreach (globals, visitStatement) val () = List.foreach (functions, fn function => let val {name, args, raises, returns, start, blocks, ...} = Function.dest function val () = Vector.foreach (args, newVarInfo) local fun doitVarTys vts = Vector.map (vts, fn (x, t) => (varInfo x, t)) fun doitTys ts = Vector.map (ts, fn t => (VarInfo.new t, t)) fun doitTys' ts = Option.map (ts, doitTys) in val fi = FuncInfo.new {args = doitVarTys args, raises = doitTys' raises, returns = doitTys' returns} end val () = setFuncInfo (name, fi) val () = FuncInfo.whenUsed (fi, visitLabelTh start) val () = Vector.foreach (blocks, fn block as Block.T {label, args, ...} => let val () = Vector.foreach (args, newVarInfo) local fun doitVarTys vts = Vector.map (vts, fn (x, t) => (varInfo x, t)) in val li = LabelInfo.new {args = doitVarTys args, func = fi} end val () = setLabelInfo (label, li) val () = LabelInfo.whenUsed (li, visitBlockTh (block, fi)) in () end) in () end) val () = visitFunc main (* Diagnostics *) val () = Control.diagnostics (fn display => let open Layout in Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => display (seq [Tycon.layout tycon, str ": ", TyconInfo.layout (tyconInfo tycon), str ": ", Vector.layout (fn {con, ...} => seq [Con.layout con, str " ", ConInfo.layout (conInfo con)]) cons])); display (str "\n"); List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f in display (seq [Func.layout name, str ": ", FuncInfo.layout (funcInfo name)]); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str ": ", LabelInfo.layout (labelInfo label)])); display (str "\n") end) end) (* Analysis is done, Now build the resulting program. *) fun getWrapperLabel (l: Label.t, args: (VarInfo.t * Type.t) vector) = let val li = labelInfo l in if Vector.forall2 (args, LabelInfo.args li, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) then l else let val tys = Vector.keepAllMap (args, fn (x, ty) => if VarInfo.isUsed x then SOME ty else NONE) in case List.peek (LabelInfo.wrappers li, fn (args', _) => Vector.length args' = Vector.length tys andalso Vector.forall2 (args', tys, fn (ty', ty) => Type.equals (ty', ty))) of NONE => let val liArgs = LabelInfo.args li val l' = Label.newNoname () val (args', args'') = Vector.unzip (Vector.map2 (args, liArgs, fn ((x, ty), (y, _)) => let val z = Var.newNoname () in (if VarInfo.isUsed x then SOME (z, ty) else NONE, if VarInfo.isUsed y then SOME z else NONE) end)) val args' = Vector.keepAllMap (args', fn x => x) val (_, tys') = Vector.unzip args' val args'' = Vector.keepAllMap (args'', fn x => x) val block = Block.T {label = l', args = args', statements = Vector.new0 (), transfer = Goto {dst = l, args = args''}} val () = List.push (LabelInfo.wrappers' li, (tys', l')) val () = List.push (FuncInfo.wrappers' (LabelInfo.func li), block) in l' end | SOME (_, l') => l' end end val getContWrapperLabel = getWrapperLabel val getHandlerWrapperLabel = getWrapperLabel fun getOriginalWrapperLabel l = getWrapperLabel (l, Vector.map (LabelInfo.args (labelInfo l), fn (_, t) => let val x = VarInfo.new t val () = VarInfo.use x in (x, t) end)) val getArithOverflowWrapperLabel = getOriginalWrapperLabel val getArithSuccessWrapperLabel = getOriginalWrapperLabel val getRuntimeWrapperLabel = getOriginalWrapperLabel fun getBugFunc (fi: FuncInfo.t): Label.t = (* Can't share the Bug block across different places because the * profile sourceInfo stack might be different. *) let val l = Label.newNoname () val block = Block.T {label = l, args = Vector.new0 (), statements = Vector.new0 (), transfer = Bug} val () = List.push (FuncInfo.wrappers' fi, block) in l end fun getReturnFunc (fi: FuncInfo.t): Label.t = let val r = FuncInfo.returnLabel fi in case !r of NONE => let val l = Label.newNoname () val returns = valOf (FuncInfo.returns fi) val args = Vector.keepAllMap (returns, fn (vi, ty) => if VarInfo.isUsed vi then SOME (Var.newNoname (), ty) else NONE) val xs = Vector.map (args, #1) val block = Block.T {label = l, args = args, statements = Vector.new0 (), transfer = Return xs} val () = r := SOME l val () = List.push (FuncInfo.wrappers' fi, block) val () = setLabelInfo (l, LabelInfo.new {func = fi, args = returns}) in l end | SOME l => l end fun getReturnContFunc (fi, args) = getWrapperLabel (getReturnFunc fi, args) fun getRaiseFunc (fi: FuncInfo.t): Label.t = let val r = FuncInfo.raiseLabel fi in case !r of NONE => let val l = Label.newNoname () val raises = valOf (FuncInfo.raises fi) val args = Vector.keepAllMap (raises, fn (vi, ty) => if VarInfo.isUsed vi then SOME (Var.newNoname (), ty) else NONE) val xs = Vector.map (args, #1) val block = Block.T {label = l, args = args, statements = Vector.new0 (), transfer = Raise xs} val () = r := SOME l val () = List.push (FuncInfo.wrappers' fi, block) val () = setLabelInfo (l, LabelInfo.new {func = fi, args = raises}) in l end | SOME l => l end fun getRaiseHandlerFunc (fi, args) = getWrapperLabel (getRaiseFunc fi, args) fun simplifyType (ty: Type.t): Type.t = let val ti = typeInfo ty val simplify = TypeInfo.simplify' ti in case !simplify of NONE => let datatype z = datatype Type.dest datatype z = datatype ObjectCon.t val ty = case Type.dest ty of Object {args, con} => (case con of Con con => let val ci = conInfo con in case (ConInfo.isConed ci, ConInfo.isDeconed ci) of (false, _) => #ty (ConInfo.dummy ci) | (true, true) => Type.object {args = Prod.keepAllMap (ConInfo.args ci, fn (x,t) => if VarInfo.isUsed x then SOME (simplifyType t) else NONE), con = Con con} | (true, false) => #ty (ConInfo.dummy ci) end | _ => Type.object {args = Prod.map (args, simplifyType), con = con}) | Weak ty => Type.weak (simplifyType ty) | _ => ty in simplify := SOME ty ; ty end | SOME ty => ty end val datatypes = Vector.keepAllMap (datatypes, fn Datatype.T {tycon, cons} => if isUsedTycon tycon then let val needsDummy : bool ref = ref false val cons = Vector.keepAllMap (cons, fn {con, ...} => let val ci = conInfo con fun addDummy () = if !needsDummy then NONE else let val () = needsDummy := true in SOME (TyconInfo.dummy (tyconInfo tycon)) end in case (ConInfo.isConed ci, ConInfo.isDeconed ci) of (false, _) => if ConInfo.isUsed ci then addDummy () else NONE | (true, true) => SOME {con = con, args = Prod.keepAllMap (ConInfo.args ci, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)} | (true, false) => addDummy () end) val num = Vector.length cons val () = TyconInfo.numCons' (tyconInfo tycon) := num in SOME (Datatype.T {tycon = tycon, cons = cons}) end else NONE) fun simplifyExp (e: Exp.t): Exp.t = case e of Object {con, args} => (case con of NONE => e | SOME con => let val ci = conInfo con in if ConInfo.isDeconed ci then let val ciArgs = Vector.map (Prod.dest (ConInfo.args ci), #elt) in Object {con = SOME con, args = (Vector.keepAllMap2 (args, ciArgs, fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE))} end else #exp (ConInfo.dummy ci) end) | Select {base, offset} => let datatype z = datatype Base.t in case base of Object base => let datatype z = datatype ObjectCon.t datatype z = datatype Type.dest in case Type.dest (tyVar base) of Object {con, ...} => (case con of Con con => let val ci = conInfo con val ciArgs = ConInfo.args ci val offset = Int.fold (0, offset, 0, fn (i, offset) => if (VarInfo.isUsed o #1 o #elt) (Prod.sub (ciArgs, i)) then offset + 1 else offset) in Select {base = Base.Object base, offset = offset} end | Tuple => e | Vector => Error.bug "RemoveUnused2.simplifyExp: Update:non-Con|Tuple") | _ => Error.bug "RemoveUnused2.simplifyExp:Select:non-Object" end | _ => e end | _ => e fun simplifyStatement (s : Statement.t) : Statement.t option = case s of Bind {exp, ty, var} => let fun doit' var = SOME (Statement.Bind {var = var, ty = simplifyType ty, exp = simplifyExp exp}) fun doit var' = if Exp.maySideEffect exp then doit' var else if isSome var' then doit' var' else NONE in case var of SOME var => if isUsedVar var then doit (SOME var) else doit NONE | NONE => doit NONE end | Profile _ => SOME s | Update {base, offset, value} => let datatype z = datatype Base.t in case base of Object base => let datatype z = datatype ObjectCon.t datatype z = datatype Type.dest in case Type.dest (tyVar base) of Object {con, ...} => (case con of Con con => let val ci = conInfo con val ciArgs = ConInfo.args ci fun argIsUsed i = VarInfo.isUsed (#1 (#elt (Prod.sub (ciArgs, i)))) in if argIsUsed offset then let val offset = Int.fold (0, offset, 0, fn (i, offset) => if argIsUsed i then offset + 1 else offset) in SOME (Update {base = Base.Object base, offset = offset, value = value}) end else NONE end | Tuple => SOME s | Vector => Error.bug "RemoveUnused2.simplifyStatement: Update:non-Con|Tuple") | _ => Error.bug "RemoveUnused2.simplifyStatement: Select:non-Object" end | _ => SOME s end fun simplifyStatements (ss: Statement.t Vector.t) : Statement.t Vector.t = Vector.keepAllMap (ss, simplifyStatement) fun simplifyTransfer (t: Transfer.t, fi: FuncInfo.t): Transfer.t = case t of Arith {prim, args, overflow, success, ty} => Arith {prim = prim, args = args, overflow = getArithOverflowWrapperLabel overflow, success = getArithSuccessWrapperLabel success, ty = simplifyType ty} | Bug => Bug | Call {func, args, return} => let val fi' = funcInfo func datatype u = None | Caller | Some of Label.t val (cont, handler) = case return of Return.Dead => (None, None) | Return.NonTail {cont, handler} => (Some cont, case handler of Handler.Caller => Caller | Handler.Dead => None | Handler.Handle h => Some h) | Return.Tail => (Caller, Caller) val cont = if FuncInfo.mayReturn fi' then case cont of None => Error.bug "RemoveUnused2.simplifyTransfer: cont:None" | Caller => (if (case (FuncInfo.returns fi, FuncInfo.returns fi') of (SOME xts, SOME yts) => Vector.forall2 (xts, yts, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) | _ => Error.bug "RemoveUnused2.simplifyTransfer: cont:Caller") then Caller else Some (getReturnContFunc (fi, valOf (FuncInfo.returns fi')))) | Some l => Some (getContWrapperLabel (l, valOf (FuncInfo.returns fi'))) else None val handler = if FuncInfo.mayRaise fi' then (case handler of None => Error.bug "RemoveUnused2.simplifyTransfer: handler:None" | Caller => (if (case (FuncInfo.raises fi, FuncInfo.raises fi') of (SOME xts, SOME yts) => Vector.forall2 (xts, yts, fn ((x, _), (y, _)) => VarInfo.isUsed x = VarInfo.isUsed y) | _ => Error.bug "RemoveUnused2.simplifyTransfer: handler:Caller") then Caller else Some (getRaiseHandlerFunc (fi, valOf (FuncInfo.raises fi')))) | Some l => Some (getHandlerWrapperLabel (l, valOf (FuncInfo.raises fi')))) else None val return = case (cont, handler) of (None, None) => Return.Dead | (None, Caller) => Return.Tail | (None, Some h) => Return.NonTail {cont = getBugFunc fi, handler = Handler.Handle h} | (Caller, None) => Return.Tail | (Caller, Caller) => Return.Tail | (Caller, Some h) => Return.NonTail {cont = getReturnContFunc (fi, valOf (FuncInfo.returns fi')), handler = Handler.Handle h} | (Some c, None) => Return.NonTail {cont = c, handler = Handler.Dead} | (Some c, Caller) => Return.NonTail {cont = c, handler = Handler.Caller} | (Some c, Some h) => Return.NonTail {cont = c, handler = Handler.Handle h} val args = Vector.keepAllMap2 (args, FuncInfo.args fi', fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE) in Call {func = func, args = args, return = return} end | Case {test, cases = Cases.Con cases, default} => let val cases = Vector.keepAllMap (cases, fn (con, l) => let val ci = conInfo con in if ConInfo.isConed ci then SOME (con, l) else NONE end) fun keep default = Case {test = test, cases = Cases.Con cases, default = default} fun none () = keep NONE in case default of NONE => none () | SOME l => if Vector.length cases = 0 then if LabelInfo.isUsed (labelInfo l) then Goto {dst = l, args = Vector.new0 ()} else Bug else let val tycon = case Type.dest (tyVar test) of Type.Datatype tycon => tycon | _ => Error.bug "RemoveUnused2.simplifyTransfer: Case:non-Datatype" val numCons = TyconInfo.numCons (tyconInfo tycon) in if Vector.length cases = numCons then none () else keep (SOME l) end end | Case {test, cases, default} => Case {test = test, cases = cases, default = default} | Goto {dst, args} => Goto {dst = dst, args = (Vector.keepAllMap2 (args, LabelInfo.args (labelInfo dst), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE))} | Raise xs => Raise (Vector.keepAllMap2 (xs, valOf (FuncInfo.raises fi), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)) | Return xs => Return (Vector.keepAllMap2 (xs, valOf (FuncInfo.returns fi), fn (x, (y, _)) => if VarInfo.isUsed y then SOME x else NONE)) | Runtime {prim, args, return} => Runtime {prim = prim, args = args, return = getRuntimeWrapperLabel return} val simplifyTransfer = Trace.trace ("RemoveUnused2.simplifyTransfer", Layout.tuple2 (Transfer.layout, FuncInfo.layout), Transfer.layout) simplifyTransfer fun simplifyBlock (Block.T {label, args, statements, transfer}): Block.t option = let val li = labelInfo label in if LabelInfo.isUsed li then let val args = Vector.keepAllMap2 (LabelInfo.args li, args, fn ((vi, _), (x, ty)) => if VarInfo.isUsed vi then SOME (x, simplifyType ty) else NONE) val statements = simplifyStatements statements val transfer = simplifyTransfer (transfer, LabelInfo.func li) in SOME (Block.T {label = label, args = args, statements = statements, transfer = transfer}) end else NONE end fun simplifyBlocks (bs: Block.t Vector.t): Block.t Vector.t = Vector.keepAllMap (bs, simplifyBlock) val globals = simplifyStatements globals val shrink = shrinkFunction {globals = globals} fun simplifyFunction (f: Function.t): Function.t option = let val {args, blocks, mayInline, name, start, ...} = Function.dest f val fi = funcInfo name in if FuncInfo.isUsed fi then let val args = Vector.keepAllMap2 (FuncInfo.args fi, args, fn ((vi, _), (x, ty)) => if VarInfo.isUsed vi then SOME (x, simplifyType ty) else NONE) val blocks = simplifyBlocks blocks val wrappers = Vector.fromList (FuncInfo.wrappers fi) val blocks = Vector.concat [wrappers, blocks] val returns = case FuncInfo.returns fi of NONE => NONE | SOME xts => if FuncInfo.mayReturn fi then SOME (Vector.keepAllMap (xts, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)) else NONE val raises = case FuncInfo.raises fi of NONE => NONE | SOME xts => if FuncInfo.mayRaise fi then SOME (Vector.keepAllMap (xts, fn (x, ty) => if VarInfo.isUsed x then SOME (simplifyType ty) else NONE)) else NONE in SOME (shrink (Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start})) end else NONE end fun simplifyFunctions (fs: Function.t List.t): Function.t List.t = List.keepAllMap (fs, simplifyFunction) val functions = simplifyFunctions functions val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val () = destroy () val () = Program.clearTop program in program end end mlton-20100608/mlton/ssa/remove-unused2.sig0000644000076600000240000000070311404435623017064 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature REMOVE_UNUSED2_STRUCTS = sig include SHRINK2 end signature REMOVE_UNUSED2 = sig include REMOVE_UNUSED2_STRUCTS val remove: Program.t -> Program.t end mlton-20100608/mlton/ssa/restore.fun0000644000076600000240000006213511404435623015704 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Restore SSA * * Based primarily on Section 19.1 of Appel's "Modern Compiler Implementation in ML", * (but see the caveats in the comments below). * The main deviation is the calculation of liveness of the violating variables, * which is used to predicate the insertion of phi arguments. This is due to * the algorithm's bias towards imperative languages, for which it makes the * assumption that all variables are defined in the start block and all variables * are "used" at exit. * This is "optimized" for restoration of functions with small numbers of violating * variables -- use bool vectors to represent sets of violating variables. * Also, we use a Promise.t to suspend part of the dominance frontier computation. * * Requirements: no violation in globals; this is checked. *) functor Restore (S: RESTORE_STRUCTS): RESTORE = struct open S open Exp Transfer structure LabelInfo = struct datatype t = T of {args: (Var.t * Type.t) vector ref, preds: Label.t list ref, defs: bool vector ref, uses: bool vector ref, live: bool array ref, dtindex: int ref, df: Label.t vector Promise.t ref, phi: Var.t list ref, phiArgs: Var.t vector ref, queued: bool ref} fun layout (T {preds, defs, uses, live, dtindex, df, phiArgs, ...}) = let open Layout in record [("preds", List.layout Label.layout (!preds)), ("defs", Vector.layout Bool.layout (!defs)), ("uses", Vector.layout Bool.layout (!uses)), ("live", Array.layout Bool.layout (!live)), ("dtindex", Int.layout (!dtindex)), ("df", Promise.layout (Vector.layout Label.layout) (!df)), ("phiArgs", Vector.layout Var.layout (!phiArgs))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (args, args') = make' #args val (preds, preds') = make' #preds val (defs, defs') = make' #defs val (uses, uses') = make' #uses val (live, live') = make' #live val (dtindex, dtindex') = make' #dtindex val (df, df') = make' #df val (phi, _) = make' #phi val (phiArgs, phiArgs') = make' #phiArgs val (queued, _) = make' #queued end fun new (): t = T {args = ref (Vector.new0 ()), preds = ref [], defs = ref (Vector.new0 ()), uses = ref (Vector.new0 ()), live = ref (Array.new0 ()), dtindex = ref ~1, df = ref (Promise.delay (fn () => Vector.new0 ())), phi = ref [], phiArgs = ref (Vector.new0 ()), queued = ref false} end structure Cardinality = struct structure L = ThreePointLattice(val bottom = "zero" val mid = "one" val top = "many") open L val isZero = isBottom val isOne = isMid val makeOne = makeMid val isMany = isTop val makeMany = makeTop val whenMany = whenTop val inc: t -> unit = fn c => if isZero c then makeOne c else if isOne c then makeMany c else () end structure VarInfo = struct datatype t = T of {defs: Cardinality.t, ty: Type.t ref, index: int ref, defSites: Label.t list ref, useSites: Label.t list ref, vars: Var.t list ref} fun layout (T {defs, index, defSites, useSites, vars, ...}) = let open Layout in record [("defs", Cardinality.layout defs), ("index", Int.layout (!index)), ("defSites", List.layout Label.layout (!defSites)), ("useSites", List.layout Label.layout (!useSites)), ("vars", List.layout Var.layout (!vars))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val defs = make #defs val (index,index') = make' #index val (_,defSites') = make' #defSites val (_,useSites') = make' #useSites val (ty,ty') = make' #ty end fun addDef (T {defs, ...}) = Cardinality.inc defs fun addDefSite (T {defSites, ...}, l) = List.push(defSites, l) fun addUseSite (T {useSites, ...}, l) = List.push(useSites, l) val violates = Cardinality.isMany o defs fun whenViolates (T {defs, ...}, th) = Cardinality.whenMany (defs, th) fun new (): t = T {defs = Cardinality.new (), index = ref ~1, defSites = ref [], useSites = ref [], ty = ref Type.unit, vars = ref []} fun pushVar (T {vars, ...}, var) = List.push (vars, var) fun popVar (T {vars, ...}) = ignore (List.pop vars) fun peekVar (T {vars, ...}) = case !vars of [] => NONE | h::_ => SOME h end fun restoreFunction {globals: Statement.t vector} = let exception NoViolations val {get = varInfo: Var.t -> VarInfo.t, ...} = Property.get (Var.plist, Property.initFun (fn _ => VarInfo.new ())) val {get = labelInfo: Label.t -> LabelInfo.t, ...} = Property.get (Label.plist, Property.initFun (fn _ => LabelInfo.new ())) fun mkQueue () = let val todo = ref [] in {enque = fn (l, li) => let val queued = LabelInfo.queued li in if !queued then () else (queued := true ; List.push (todo, (l,li))) end, deque = fn () => case !todo of [] => NONE | (l,li)::todo' => (todo := todo'; LabelInfo.queued li := false; SOME (l,li))} end fun mkPost () = let val post = ref [] in {addPost = fn th => List.push (post, th), post = fn () => List.foreach(!post, fn th => th ())} end (* check for violations in globals *) fun addDef (x, ty) = let val vi = varInfo x in VarInfo.ty vi := ty ; VarInfo.addDef vi ; VarInfo.whenViolates (vi, fn () => Error.bug "Restore.restore: violation in globals") end val _ = Vector.foreach (globals, fn Statement.T {var, ty, ...} => Option.app (var, fn x => addDef (x, ty))) in fn (f: Function.t) => let val {args, blocks, mayInline, name, returns, raises, start} = Function.dest f (* check for violations *) val violations = ref [] fun addDef (x, ty) = let val vi = varInfo x in if VarInfo.violates vi then () else (VarInfo.ty vi := ty ; VarInfo.addDef vi ; if VarInfo.violates vi then List.push (violations, x) else ()) end val _ = Function.foreachVar (f, addDef) (* escape early *) val _ = if List.isEmpty (!violations) then (Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " NoViolations"]) end); raise NoViolations) else () (* init violations *) val index = ref 0 val violations = Vector.fromListMap (!violations, fn x => let val vi = varInfo x val _ = VarInfo.index vi := (!index) val _ = Int.inc index in x end) val numViolations = !index (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " Violations: ", Vector.layout Var.layout violations]) end) (* init entryBlock *) val entry = Label.newNoname () val entryBlock = Block.T {label = entry, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}} (* compute dominator tree *) val dt = Function.dominatorTree f val dt' = Tree.T (entryBlock, Vector.new1 dt) (* compute df (dominance frontier) *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" *) (* also computes defSites and useSites of violating variables *) (* also computes preds, defs, and uses *) val dtindex = ref 0 fun doitTree (Tree.T (Block.T {label, args, statements, transfer}, children)) = let val li = labelInfo label val _ = LabelInfo.args li := args val _ = Transfer.foreachLabel (transfer, fn l => List.push (LabelInfo.preds (labelInfo l), label)) val defs = Array.new (numViolations, false) val uses = Array.new (numViolations, false) fun addDef x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addDefSite (varInfo x, label); Array.update (defs, index, true); Array.update (uses, index, false) end else () end fun addUse x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addUseSite (varInfo x, label); Array.update (uses, index, true) end else () end val _ = Transfer.foreachVar (transfer, addUse) val _ = Vector.foreachr (statements, fn Statement.T {var, exp, ...} => (Option.app (var, addDef); Exp.foreachVar (exp, addUse))) val _ = Vector.foreach (args, addDef o #1) val _ = LabelInfo.defs li := Array.toVector defs val _ = LabelInfo.uses li := Array.toVector uses val _ = LabelInfo.live li := Array.new (numViolations, false) val _ = Int.inc dtindex val dtindexMin = !dtindex val _ = LabelInfo.dtindex li := dtindexMin val _ = Vector.foreach(children, doitTree) val dtindexMax = !dtindex fun dominates l = let val dtindex = LabelInfo.dtindex' (labelInfo l) in dtindexMin < dtindex andalso dtindex <= dtindexMax end fun promise () = let val df = ref [] fun addDF l = if List.contains(!df, l, Label.equals) then () else List.push(df,l) val _ = Transfer.foreachLabel (transfer, fn l => if Vector.exists (children, fn Tree.T (b, _) => Label.equals (Block.label b, l)) then () else addDF l) val _ = Vector.foreach (children, fn Tree.T (Block.T {label, ...}, _) => let val li = labelInfo label in Vector.foreach (Promise.force (LabelInfo.df' li), fn l => if dominates l then () else addDF l) end) in Vector.fromList (!df) end val _ = LabelInfo.df li := Promise.delay promise in () end val _ = doitTree dt' (* compute liveness *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val enque = fn l => enque (l, labelInfo l) val vi = varInfo x val index = VarInfo.index' vi val useSites = VarInfo.useSites' vi val _ = List.foreach (useSites, enque) fun doit (_,li) = let val uses = LabelInfo.uses' li val defs = LabelInfo.defs' li val live = LabelInfo.live' li in if Array.sub (live, index) orelse (Vector.sub(defs, index) andalso not (Vector.sub (uses, index))) then () else (Array.update(live, index, true) ; List.foreach (LabelInfo.preds' li, enque)) end fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* insert phi-functions *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" * (beware: Alg. 19.6 (both in the book and as corrected by the * errata) has numerous typos; and this implementation computes sets of * variables that must have phi-functions at a node, which is close to * the algorithm in the book, but the reverse of the algorithm as * corrected by the errata, which computes sets of nodes that must have * a phi-functions for a variable.) *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val vi = varInfo x val index = VarInfo.index' vi val defSites = VarInfo.defSites' vi val _ = List.foreach (defSites, fn l => enque (l, labelInfo l)) fun doit (_,li) = Vector.foreach (Promise.force (LabelInfo.df' li), fn l => let val li = labelInfo l val live = LabelInfo.live' li val phi = LabelInfo.phi li in if Array.sub(live, index) andalso not (List.contains(!phi, x, Var.equals)) then (List.push(phi, x); enque (l, li)) else () end) fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* finalize phi args *) fun visitBlock (Block.T {label, ...}) = let val li = labelInfo label val phi = LabelInfo.phi li val phiArgs = LabelInfo.phiArgs li in phiArgs := Vector.fromList (!phi) ; phi := [] end val _ = visitBlock entryBlock val _ = Vector.foreach (blocks, visitBlock) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (violations, fn x => display (seq [Var.layout x, str " ", VarInfo.layout (varInfo x)])); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str " ", LabelInfo.layout (labelInfo label)])) end) (* rewrite *) val blocks = ref [] fun rewriteVar (x: Var.t) = case VarInfo.peekVar (varInfo x) of NONE => x | SOME x' => x' fun rewriteStatement (addPost: (unit -> unit) -> unit) (Statement.T {var, ty, exp}) = let val exp = Exp.replaceVar (exp, rewriteVar) val var = case var of NONE => NONE | SOME x => let val vi = varInfo x in if VarInfo.violates vi then let val x' = Var.new x in addPost (fn _ => VarInfo.popVar vi) ; VarInfo.pushVar (vi, x'); SOME x' end else SOME x end in Statement.T {var = var, ty = ty, exp = exp} end local type t = {dst: Label.t, phiArgs: Var.t vector, route: Label.t, hash: Word.t} val routeTable : t HashSet.t = HashSet.new {hash = #hash} in fun route dst = let val li = labelInfo dst val phiArgs = LabelInfo.phiArgs' li in if Vector.length phiArgs = 0 then dst else let val phiArgs = Vector.map (phiArgs, valOf o VarInfo.peekVar o varInfo) val hash = Vector.fold (phiArgs, Label.hash dst, fn (x, h) => Word.xorb(Var.hash x, h)) val {route, ...} = HashSet.lookupOrInsert (routeTable, hash, fn {dst = dst', phiArgs = phiArgs', ... } => Label.equals (dst, dst') andalso Vector.equals (phiArgs, phiArgs', Var.equals), fn () => let val route = Label.new dst val args = Vector.map (LabelInfo.args' li, fn (x,ty) => (Var.new x, ty)) val args' = Vector.concat [Vector.map(args, #1), phiArgs] val block = Block.T {label = route, args = args, statements = Vector.new0 (), transfer = Goto {dst = dst, args = args'}} val _ = List.push (blocks, block) in {dst = dst, phiArgs = phiArgs, route = route, hash = hash} end) in route end end end fun rewriteTransfer (t: Transfer.t) = Transfer.replaceLabelVar (t, route, rewriteVar) fun visitBlock' (Block.T {label, args, statements, transfer}) = let val {addPost, post} = mkPost () val li = labelInfo label fun doit x = let val vi = varInfo x val ty = VarInfo.ty' vi in if VarInfo.violates vi then let val x' = Var.new x in addPost (fn _ => VarInfo.popVar vi) ; VarInfo.pushVar (vi, x') ; (x', ty) end else (x, ty) end val args = Vector.map (args, fn (x, _) => doit x) val phiArgs = Vector.map (LabelInfo.phiArgs' li, fn x => doit x) val args = Vector.concat [args, phiArgs] val statements = if Vector.exists(LabelInfo.defs' li, fn b => b) orelse Vector.exists(LabelInfo.uses' li, fn b => b) then Vector.map (statements, rewriteStatement addPost) else statements val transfer = rewriteTransfer transfer val block = Block.T {label = label, args = args, statements = statements, transfer = transfer} in (block, post) end fun visitBlock block = let val (block, post) = visitBlock' block in List.push (blocks, block) ; post end fun rewrite () = let local val (Block.T {label, args, statements, transfer}, post) = visitBlock' entryBlock val entryBlock = Block.T {label = label, args = Vector.new0 (), statements = statements, transfer = transfer} val _ = List.push (blocks, entryBlock) in val args = args val post = post end val _ = Tree.traverse (Function.dominatorTree f, visitBlock) val _ = post () in Function.new {args = args, blocks = Vector.fromList (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = entry} end val f = rewrite () in f end handle NoViolations => f end val traceRestoreFunction = Trace.trace ("Restore.restoreFunction", Func.layout o Function.name, Func.layout o Function.name) val restoreFunction = fn g => let val r = restoreFunction g in fn f => traceRestoreFunction r f end fun restore (Program.T {datatypes, globals, functions, main}) = let val r = restoreFunction {globals = globals} in Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, r), main = main} end (* quell unused warning *) val _ = restore end mlton-20100608/mlton/ssa/restore.sig0000644000076600000240000000100711404435623015665 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RESTORE_STRUCTS = sig include SHRINK end signature RESTORE = sig include RESTORE_STRUCTS val restoreFunction: {globals: Statement.t vector} -> Function.t -> Function.t val restore: Program.t -> Program.t end mlton-20100608/mlton/ssa/restore2.fun0000644000076600000240000006171011404435623015764 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Restore SSA * * Based primarily on Section 19.1 of Appel's "Modern Compiler Implementation in ML", * (but see the caveats in the comments below). * The main deviation is the calculation of liveness of the violating variables, * which is used to predicate the insertion of phi arguments. This is due to * the algorithm's bias towards imperative languages, for which it makes the * assumption that all variables are defined in the start block and all variables * are "used" at exit. * This is "optimized" for restoration of functions with small numbers of violating * variables -- use bool vectors to represent sets of violating variables. * Also, we use a Promise.t to suspend part of the dominance frontier computation. * * Requirements: no violation in globals; this is checked. *) functor Restore2 (S: RESTORE2_STRUCTS): RESTORE2 = struct open S open Exp Transfer structure LabelInfo = struct datatype t = T of {args: (Var.t * Type.t) vector ref, preds: Label.t list ref, defs: bool vector ref, uses: bool vector ref, live: bool array ref, dtindex: int ref, df: Label.t vector Promise.t ref, phi: Var.t list ref, phiArgs: Var.t vector ref, queued: bool ref} fun layout (T {preds, defs, uses, live, dtindex, df, phiArgs, ...}) = let open Layout in record [("preds", List.layout Label.layout (!preds)), ("defs", Vector.layout Bool.layout (!defs)), ("uses", Vector.layout Bool.layout (!uses)), ("live", Array.layout Bool.layout (!live)), ("dtindex", Int.layout (!dtindex)), ("df", Promise.layout (Vector.layout Label.layout) (!df)), ("phiArgs", Vector.layout Var.layout (!phiArgs))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val (args, args') = make' #args val (preds, preds') = make' #preds val (defs, defs') = make' #defs val (uses, uses') = make' #uses val (live, live') = make' #live val (dtindex, dtindex') = make' #dtindex val (df, df') = make' #df val (phi, _) = make' #phi val (phiArgs, phiArgs') = make' #phiArgs val (queued, _) = make' #queued end fun new (): t = T {args = ref (Vector.new0 ()), preds = ref [], defs = ref (Vector.new0 ()), uses = ref (Vector.new0 ()), live = ref (Array.new0 ()), dtindex = ref ~1, df = ref (Promise.delay (fn () => Vector.new0 ())), phi = ref [], phiArgs = ref (Vector.new0 ()), queued = ref false} end structure Cardinality = struct structure L = ThreePointLattice(val bottom = "zero" val mid = "one" val top = "many") open L val isZero = isBottom val isOne = isMid val makeOne = makeMid val isMany = isTop val makeMany = makeTop val whenMany = whenTop val inc: t -> unit = fn c => if isZero c then makeOne c else if isOne c then makeMany c else () end structure VarInfo = struct datatype t = T of {defs: Cardinality.t, ty: Type.t ref, index: int ref, defSites: Label.t list ref, useSites: Label.t list ref, vars: Var.t list ref} fun layout (T {defs, index, defSites, useSites, vars, ...}) = let open Layout in record [("defs", Cardinality.layout defs), ("index", Int.layout (!index)), ("defSites", List.layout Label.layout (!defSites)), ("useSites", List.layout Label.layout (!useSites)), ("vars", List.layout Var.layout (!vars))] end local fun make f (T r) = f r fun make' f = (make f, ! o (make f)) in val defs = make #defs val (index,index') = make' #index val (_,defSites') = make' #defSites val (_,useSites') = make' #useSites val (ty,ty') = make' #ty end fun addDef (T {defs, ...}) = Cardinality.inc defs fun addDefSite (T {defSites, ...}, l) = List.push(defSites, l) fun addUseSite (T {useSites, ...}, l) = List.push(useSites, l) val violates = Cardinality.isMany o defs fun whenViolates (T {defs, ...}, th) = Cardinality.whenMany (defs, th) fun new (): t = T {defs = Cardinality.new (), index = ref ~1, defSites = ref [], useSites = ref [], ty = ref Type.unit, vars = ref []} fun pushVar (T {vars, ...}, var) = List.push (vars, var) fun popVar (T {vars, ...}) = ignore (List.pop vars) fun peekVar (T {vars, ...}) = case !vars of [] => NONE | h::_ => SOME h end fun restoreFunction {globals: Statement.t vector} = let exception NoViolations val {get = varInfo: Var.t -> VarInfo.t, ...} = Property.get (Var.plist, Property.initFun (fn _ => VarInfo.new ())) val {get = labelInfo: Label.t -> LabelInfo.t, ...} = Property.get (Label.plist, Property.initFun (fn _ => LabelInfo.new ())) fun mkQueue () = let val todo = ref [] in {enque = fn (l, li) => let val queued = LabelInfo.queued li in if !queued then () else (queued := true ; List.push (todo, (l,li))) end, deque = fn () => case !todo of [] => NONE | (l,li)::todo' => (todo := todo'; LabelInfo.queued li := false; SOME (l,li))} end fun mkPost () = let val post = ref [] in {addPost = fn th => List.push (post, th), post = fn () => List.foreach(!post, fn th => th ())} end (* check for violations in globals *) fun addDef (x, ty) = let val vi = varInfo x in VarInfo.ty vi := ty ; VarInfo.addDef vi ; VarInfo.whenViolates (vi, fn () => Error.bug "Restore2.restore: violation in globals") end val _ = Vector.foreach (globals, fn Statement.T {var, ty, ...} => Option.app (var, fn x => addDef (x, ty))) in fn (f: Function.t) => let val {args, blocks, name, returns, raises, start} = Function.dest f (* check for violations *) val violations = ref [] fun addDef (x, ty) = let val vi = varInfo x in if VarInfo.violates vi then () else (VarInfo.ty vi := ty ; VarInfo.addDef vi ; if VarInfo.violates vi then List.push (violations, x) else ()) end val _ = Function.foreachVar (f, addDef) (* escape early *) val _ = if List.isEmpty (!violations) then (Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " NoViolations"]) end); raise NoViolations) else () (* init violations *) val index = ref 0 val violations = Vector.fromListMap (!violations, fn x => let val vi = varInfo x val _ = VarInfo.index vi := (!index) val _ = Int.inc index in x end) val numViolations = !index (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in display (seq [Func.layout name, str " Violations: ", Vector.layout Var.layout violations]) end) (* init entryBlock *) val entry = Label.newNoname () val entryBlock = Block.T {label = entry, args = args, statements = Vector.new0 (), transfer = Goto {dst = start, args = Vector.new0 ()}} (* compute dominator tree *) val dt = Function.dominatorTree f val dt' = Tree.T (entryBlock, Vector.new1 dt) (* compute df (dominance frontier) *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" *) (* also computes defSites and useSites of violating variables *) (* also computes preds, defs, and uses *) val dtindex = ref 0 fun doitTree (Tree.T (Block.T {label, args, statements, transfer}, children)) = let val li = labelInfo label val _ = LabelInfo.args li := args val _ = Transfer.foreachLabel (transfer, fn l => List.push (LabelInfo.preds (labelInfo l), label)) val defs = Array.new (numViolations, false) val uses = Array.new (numViolations, false) fun addDef x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addDefSite (varInfo x, label); Array.update (defs, index, true); Array.update (uses, index, false) end else () end fun addUse x = let val vi = varInfo x in if VarInfo.violates vi then let val index = VarInfo.index' vi in VarInfo.addUseSite (varInfo x, label); Array.update (uses, index, true) end else () end val _ = Transfer.foreachVar (transfer, addUse) val _ = Vector.foreachr (statements, fn Statement.T {var, exp, ...} => (Option.app (var, addDef); Exp.foreachVar (exp, addUse))) val _ = Vector.foreach (args, addDef o #1) val _ = LabelInfo.defs li := Array.toVector defs val _ = LabelInfo.uses li := Array.toVector uses val _ = LabelInfo.live li := Array.new (numViolations, false) val _ = Int.inc dtindex val dtindexMin = !dtindex val _ = LabelInfo.dtindex li := dtindexMin val _ = Vector.foreach(children, doitTree) val dtindexMax = !dtindex fun dominates l = let val dtindex = LabelInfo.dtindex' (labelInfo l) in dtindexMin < dtindex andalso dtindex <= dtindexMax end fun promise () = let val df = ref [] fun addDF l = if List.contains(!df, l, Label.equals) then () else List.push(df,l) val _ = Transfer.foreachLabel (transfer, fn l => if Vector.exists (children, fn Tree.T (b, _) => Label.equals (Block.label b, l)) then () else addDF l) val _ = Vector.foreach (children, fn Tree.T (Block.T {label, ...}, _) => let val li = labelInfo label in Vector.foreach (Promise.force (LabelInfo.df' li), fn l => if dominates l then () else addDF l) end) in Vector.fromList (!df) end val _ = LabelInfo.df li := Promise.delay promise in () end val _ = doitTree dt' (* compute liveness *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val enque = fn l => enque (l, labelInfo l) val vi = varInfo x val index = VarInfo.index' vi val useSites = VarInfo.useSites' vi val _ = List.foreach (useSites, enque) fun doit (_,li) = let val uses = LabelInfo.uses' li val defs = LabelInfo.defs' li val live = LabelInfo.live' li in if Array.sub (live, index) orelse (Vector.sub(defs, index) andalso not (Vector.sub (uses, index))) then () else (Array.update(live, index, true) ; List.foreach (LabelInfo.preds' li, enque)) end fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* insert phi-functions *) (* based on section 19.1 of Appel's "Modern Compiler Implementation in ML" * (beware: Alg. 19.6 (both in the book and as corrected by the * errata) has numerous typos; and this implementation computes sets of * variables that must have phi-functions at a node, which is close to * the algorithm in the book, but the reverse of the algorithm as * corrected by the errata, which computes sets of nodes that must have * a phi-functions for a variable.) *) val _ = Vector.foreach (violations, fn x => let val {enque, deque} = mkQueue () val vi = varInfo x val index = VarInfo.index' vi val defSites = VarInfo.defSites' vi val _ = List.foreach (defSites, fn l => enque (l, labelInfo l)) fun doit (_,li) = Vector.foreach (Promise.force (LabelInfo.df' li), fn l => let val li = labelInfo l val live = LabelInfo.live' li val phi = LabelInfo.phi li in if Array.sub(live, index) andalso not (List.contains(!phi, x, Var.equals)) then (List.push(phi, x); enque (l, li)) else () end) fun loop () = case deque () of NONE => () | SOME (l,li) => (doit (l, li); loop ()) in loop () end) (* finalize phi args *) fun visitBlock (Block.T {label, ...}) = let val li = labelInfo label val phi = LabelInfo.phi li val phiArgs = LabelInfo.phiArgs li in phiArgs := Vector.fromList (!phi) ; phi := [] end val _ = visitBlock entryBlock val _ = Vector.foreach (blocks, visitBlock) (* Diagnostics *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (violations, fn x => display (seq [Var.layout x, str " ", VarInfo.layout (varInfo x)])); Vector.foreach (blocks, fn Block.T {label, ...} => display (seq [Label.layout label, str " ", LabelInfo.layout (labelInfo label)])) end) (* rewrite *) val blocks = ref [] fun rewriteVar (x: Var.t) = case VarInfo.peekVar (varInfo x) of NONE => x | SOME x' => x' fun rewriteStatement addPost (Statement.T {var, ty, exp}) = let val exp = Exp.replaceVar (exp, rewriteVar) val var = case var of NONE => NONE | SOME x => let val vi = varInfo x in if VarInfo.violates vi then let val x' = Var.new x in addPost (fn _ => VarInfo.popVar vi) ; VarInfo.pushVar (vi, x'); SOME x' end else SOME x end in Statement.T {var = var, ty = ty, exp = exp} end local type t = {dst: Label.t, phiArgs: Var.t vector, route: Label.t, hash: Word.t} val routeTable : t HashSet.t = HashSet.new {hash = #hash} in fun route dst = let val li = labelInfo dst val phiArgs = LabelInfo.phiArgs' li in if Vector.length phiArgs = 0 then dst else let val phiArgs = Vector.map (phiArgs, valOf o VarInfo.peekVar o varInfo) val hash = Vector.fold (phiArgs, Label.hash dst, fn (x, h) => Word.xorb(Var.hash x, h)) val {route, ...} = HashSet.lookupOrInsert (routeTable, hash, fn {dst = dst', phiArgs = phiArgs', ... } => Label.equals (dst, dst') andalso Vector.equals (phiArgs, phiArgs', Var.equals), fn () => let val route = Label.new dst val args = Vector.map (LabelInfo.args' li, fn (x,ty) => (Var.new x, ty)) val args' = Vector.concat [Vector.map(args, #1), phiArgs] val block = Block.T {label = route, args = args, statements = Vector.new0 (), transfer = Goto {dst = dst, args = args'}} val _ = List.push (blocks, block) in {dst = dst, phiArgs = phiArgs, route = route, hash = hash} end) in route end end end fun rewriteTransfer (t: Transfer.t) = Transfer.replaceLabelVar (t, route, rewriteVar) fun visitBlock' (Block.T {label, args, statements, transfer}) = let val {addPost, post} = mkPost () val li = labelInfo label fun doit x = let val vi = varInfo x val ty = VarInfo.ty' vi in if VarInfo.violates vi then let val x' = Var.new x in addPost (fn _ => VarInfo.popVar vi) ; VarInfo.pushVar (vi, x') ; (x', ty) end else (x, ty) end val args = Vector.map (args, fn (x, _) => doit x) val phiArgs = Vector.map (LabelInfo.phiArgs' li, fn x => doit x) val args = Vector.concat [args, phiArgs] val statements = if Vector.exists(LabelInfo.defs' li, fn b => b) orelse Vector.exists(LabelInfo.uses' li, fn b => b) then Vector.map (statements, rewriteStatement addPost) else statements val transfer = rewriteTransfer transfer val block = Block.T {label = label, args = args, statements = statements, transfer = transfer} in (block, post) end fun visitBlock block = let val (block, post) = visitBlock' block in List.push (blocks, block) ; post end fun rewrite () = let local val (Block.T {label, args, statements, transfer}, post) = visitBlock' entryBlock val entryBlock = Block.T {label = label, args = Vector.new0 (), statements = statements, transfer = transfer} val _ = List.push (blocks, entryBlock) in val args = args val post = post end val _ = Tree.traverse (Function.dominatorTree f, visitBlock) val _ = post () in Function.new {args = args, blocks = Vector.fromList (!blocks), name = name, raises = raises, returns = returns, start = entry} end val f = rewrite () in f end handle NoViolations => f end val traceRestoreFunction = Trace.trace ("Restore2.restoreFunction", Func.layout o Function.name, Func.layout o Function.name) val restoreFunction = fn g => let val r = restoreFunction g in fn f => traceRestoreFunction r f end fun restore (Program.T {datatypes, globals, functions, main}) = let val r = restoreFunction globals in Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, r), main = main} end end mlton-20100608/mlton/ssa/restore2.sig0000644000076600000240000000101311404435623015744 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature RESTORE2_STRUCTS = sig include SHRINK2 end signature RESTORE2 = sig include RESTORE2_STRUCTS val restoreFunction: {globals: Statement.t vector} -> Function.t -> Function.t val restore: Program.t -> Program.t end mlton-20100608/mlton/ssa/shrink.fun0000644000076600000240000016302711404435623015521 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Shrink (S: SHRINK_STRUCTS): SHRINK = struct open S structure Exp = struct open Exp val isProfile = fn Profile _ => true | _ => false end structure Statement = struct open Statement fun isProfile (T {exp, ...}) = Exp.isProfile exp end structure Array = struct open Array fun inc (a: int t, i: int): unit = update (a, i, 1 + sub (a, i)) fun dec (a: int t, i: int): unit = update (a, i, sub (a, i) - 1) end datatype z = datatype Exp.t datatype z = datatype Transfer.t structure VarInfo = struct datatype t = T of {isUsed: bool ref, numOccurrences: int ref, ty: Type.t option, value: value option ref, var: Var.t} and value = Con of {con: Con.t, args: t vector} | Const of Const.t | Select of {tuple: t, offset: int} | Tuple of t vector fun equals (T {var = x, ...}, T {var = y, ...}) = Var.equals (x, y) fun layout (T {isUsed, numOccurrences, ty, value, var}) = let open Layout in record [("isUsed", Bool.layout (!isUsed)), ("numOccurrences", Int.layout (!numOccurrences)), ("ty", Option.layout Type.layout ty), ("value", Option.layout layoutValue (!value)), ("var", Var.layout var)] end and layoutValue v = let open Layout in case v of Con {con, args} => seq [Con.layout con, Vector.layout layout args] | Const c => Const.layout c | Select {tuple, offset} => seq [str "#", Int.layout (offset + 1), str " ", layout tuple] | Tuple vis => Vector.layout layout vis end fun new (x: Var.t, ty: Type.t option) = T {isUsed = ref false, numOccurrences = ref 0, ty = ty, value = ref NONE, var = x} fun setValue (T {value, ...}, v) = (Assert.assert ("Ssa.Shrink.VarInfo.setValue", fn () => Option.isNone (!value)) ; value := SOME v) fun numOccurrences (T {numOccurrences = r, ...}) = r fun ty (T {ty, ...}): Type.t option = ty fun value (T {value, ...}): value option = !value fun var (T {var, ...}): Var.t = var end structure Value = struct datatype t = datatype VarInfo.value end structure Position = struct datatype t = Formal of int | Free of Var.t fun layout (p: t) = case p of Formal i => Int.layout i | Free x => Var.layout x val equals = fn (Formal i, Formal i') => i = i' | (Free x, Free x') => Var.equals (x, x') | _ => false end structure Positions = MonoVector (Position) structure LabelMeaning = struct datatype t = T of {aux: aux, blockIndex: int, (* The index of the block *) label: Label.t} (* redundant, the label of the block *) and aux = Block | Bug | Case of {canMove: Statement.t list, cases: Cases.t, default: Label.t option} | Goto of {canMove: Statement.t list, dst: t, args: Positions.t} | Raise of {args: Positions.t, canMove: Statement.t list} | Return of {args: Positions.t, canMove: Statement.t list} local fun make f (T r) = f r in val aux = make #aux val blockIndex = make #blockIndex end fun layout (T {aux, label, ...}) = let open Layout in seq [Label.layout label, str " ", case aux of Block => str "Block " | Bug => str "Bug" | Case _ => str "Case" | Goto {dst, args, ...} => seq [str "Goto ", tuple [layout dst, Positions.layout args]] | Raise {args, ...} => seq [str "Raise ", Positions.layout args] | Return {args, ...} => seq [str "Return ", Positions.layout args]] end end structure State = struct datatype state = Unvisited | Visited of LabelMeaning.t | Visiting val layout = let open Layout in fn Unvisited => str "Unvisited" | Visited m => LabelMeaning.layout m | Visiting => str "Visiting" end end val traceApplyInfo = Trace.info "Ssa.Shrink.Prim.apply" fun shrinkFunction {globals: Statement.t vector} = let fun use (VarInfo.T {isUsed, var, ...}): Var.t = (isUsed := true ; var) fun uses (vis: VarInfo.t vector): Var.t vector = Vector.map (vis, use) (* varInfo can't be getSetOnce because of setReplacement. *) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSet (Var.plist, Property.initFun (fn x => VarInfo.new (x, NONE))) (* Property.getSet (Var.plist, Property.initFun VarInfo.new) *) val setVarInfo = Trace.trace2 ("Ssa.Shrink.setVarInfo", Var.layout, VarInfo.layout, Unit.layout) setVarInfo fun varInfos xs = Vector.map (xs, varInfo) fun simplifyVar (x: Var.t) = use (varInfo x) val simplifyVar = Trace.trace ("Ssa.Shrink.simplifyVar", Var.layout, Var.layout) simplifyVar fun simplifyVars xs = Vector.map (xs, simplifyVar) fun incVarInfo (x: VarInfo.t): unit = Int.inc (VarInfo.numOccurrences x) fun incVar (x: Var.t): unit = incVarInfo (varInfo x) fun incVars xs = Vector.foreach (xs, incVar) fun numVarOccurrences (x: Var.t): int = ! (VarInfo.numOccurrences (varInfo x)) val _ = Vector.foreach (globals, fn Statement.T {var, exp, ty} => let val _ = Option.app (var, fn x => setVarInfo (x, VarInfo.new (x, SOME ty))) fun construct v = Option.app (var, fn x => VarInfo.setValue (varInfo x, v)) in case exp of ConApp {con, args} => construct (Value.Con {con = con, args = Vector.map (args, varInfo)}) | Const c => construct (Value.Const c) | Select {tuple, offset} => construct (Value.Select {tuple = varInfo tuple, offset = offset}) | Tuple xs => construct (Value.Tuple (Vector.map (xs, varInfo))) | Var y => Option.app (var, fn x => setVarInfo (x, varInfo y)) | _ => () end) in fn f: Function.t => let val _ = Function.clear f val {args, blocks, mayInline, name, raises, returns, start, ...} = Function.dest f val _ = Vector.foreach (args, fn (x, ty) => setVarInfo (x, VarInfo.new (x, SOME ty))) (* Index the labels by their defining block in blocks. *) val {get = labelIndex, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val numBlocks = Vector.length blocks (* Do a DFS to compute occurrence counts and set label meanings *) val states = Array.array (numBlocks, State.Unvisited) val inDegree = Array.array (numBlocks, 0) fun addLabelIndex i = Array.inc (inDegree, i) val isHeader = Array.array (numBlocks, false) val numHandlerUses = Array.array (numBlocks, 0) fun layoutLabel (l: Label.t): Layout.t = let val i = labelIndex l in Layout.record [("label", Label.layout l), ("inDegree", Int.layout (Array.sub (inDegree, i)))] end fun incAux aux = case aux of LabelMeaning.Goto {dst, ...} => addLabelIndex (LabelMeaning.blockIndex dst) | _ => () fun incLabel (l: Label.t): unit = incLabelMeaning (labelMeaning l) and incLabelMeaning (LabelMeaning.T {aux, blockIndex, ...}): unit = let val i = blockIndex val n = Array.sub (inDegree, i) val _ = Array.update (inDegree, i, 1 + n) in if n = 0 then incAux aux else () end and labelMeaning (l: Label.t): LabelMeaning.t = let val i = labelIndex l in case Array.sub (states, i) of State.Visited m => m | State.Visiting => (Array.update (isHeader, i, true) ; (LabelMeaning.T {aux = LabelMeaning.Block, blockIndex = i, label = Block.label (Vector.sub (blocks, i))})) | State.Unvisited => let val _ = Array.update (states, i, State.Visiting) val m = computeMeaning i val _ = Array.update (states, i, State.Visited m) in m end end and computeMeaning (i: int): LabelMeaning.t = let val Block.T {args, statements, transfer, ...} = Vector.sub (blocks, i) val _ = Vector.foreach (args, fn (x, ty) => setVarInfo (x, VarInfo.new (x, SOME ty))) val _ = Vector.foreach (statements, fn s => Exp.foreachVar (Statement.exp s, incVar)) fun extract (actuals: Var.t vector): Positions.t = let val {get: Var.t -> Position.t, set, destroy} = Property.destGetSetOnce (Var.plist, Property.initFun Position.Free) val _ = Vector.foreachi (args, fn (i, (x, _)) => set (x, Position.Formal i)) val ps = Vector.map (actuals, get) val _ = destroy () in ps end fun doit aux = LabelMeaning.T {aux = aux, blockIndex = i, label = Block.label (Vector.sub (blocks, i))} fun normal () = doit LabelMeaning.Block fun canMove () = Vector.toListMap (statements, fn Statement.T {exp, ty, ...} => Statement.T {exp = exp, ty = ty, var = NONE}) fun rr (xs: Var.t vector, make) = let val _ = incVars xs (* val n = Vector.length statements fun loop (i, ac) = if i = n then if 0 = Vector.length xs orelse 0 < Vector.length args then doit (make {args = extract xs, canMove = rev ac}) else normal () else let val Statement.T {exp, ty, ...} = Vector.sub (statements, i) in if Exp.isProfile exp then loop (i + 1, Statement.T {exp = exp, ty = ty, var = NONE} :: ac) else normal () end in loop (0, []) end *) in if Vector.forall (statements, Statement.isProfile) andalso (0 = Vector.length xs orelse 0 < Vector.length args) then doit (make {args = extract xs, canMove = canMove ()}) else normal () end in case transfer of Arith {args, overflow, success, ...} => (incVars args ; incLabel overflow ; incLabel success ; normal ()) | Bug => if Vector.forall (statements, Statement.isProfile) andalso (case returns of NONE => true | SOME ts => Vector.equals (ts, args, fn (t, (_, t')) => Type.equals (t, t'))) then doit LabelMeaning.Bug else normal () | Call {args, return, ...} => let val _ = incVars args val _ = Return.foreachHandler (return, fn l => Array.inc (numHandlerUses, labelIndex l)) val _ = Return.foreachLabel (return, incLabel) in normal () end | Case {test, cases, default} => let val _ = incVar test val _ = Cases.foreach (cases, incLabel) val _ = Option.app (default, incLabel) in if Vector.forall (statements, Statement.isProfile) andalso not (Array.sub (isHeader, i)) andalso 1 = Vector.length args andalso 1 = numVarOccurrences test andalso Var.equals (test, #1 (Vector.sub (args, 0))) then doit (LabelMeaning.Case {canMove = canMove (), cases = cases, default = default}) else normal () end | Goto {dst, args = actuals} => let val _ = incVars actuals val m = labelMeaning dst in if Vector.exists (statements, not o Statement.isProfile) orelse Array.sub (isHeader, i) then (incLabelMeaning m ; normal ()) else if 0 = Vector.length statements andalso Vector.equals (args, actuals, fn ((x, _), x') => Var.equals (x, x') andalso 1 = numVarOccurrences x) then m (* It's an eta. *) else let val ps = extract actuals val n = Vector.fold (args, 0, fn ((x, _), n) => n + numVarOccurrences x) val n' = Vector.fold (ps, 0, fn (p, n) => case p of Position.Formal _ => n + 1 | _ => n) datatype z = datatype LabelMeaning.aux in if n <> n' then (incLabelMeaning m ; normal ()) else let fun extract (ps': Positions.t) : Positions.t = Vector.map (ps', fn p => let datatype z = datatype Position.t in case p of Free x => Free x | Formal i => Vector.sub (ps, i) end) val canMove' = canMove () val a = case LabelMeaning.aux m of Block => Goto {canMove = canMove', dst = m, args = ps} | Bug => Bug | Case _ => Goto {canMove = canMove', dst = m, args = ps} | Goto {canMove, dst, args} => Goto {canMove = canMove' @ canMove, dst = dst, args = extract args} | Raise {args, canMove} => Raise {args = extract args, canMove = canMove' @ canMove} | Return {args, canMove} => Return {args = extract args, canMove = canMove' @ canMove} in doit a end end end | Raise xs => rr (xs, LabelMeaning.Raise) | Return xs => rr (xs, LabelMeaning.Return) | Runtime {args, return, ...} => (incVars args ; incLabel return ; normal ()) end val _ = incLabel start fun indexMeaning i = case Array.sub (states, i) of State.Visited m => m | _ => Error.bug "Ssa.Shrink.indexMeaning: not computed" val indexMeaning = Trace.trace ("Ssa.Shrink.indexMeaning", Int.layout, LabelMeaning.layout) indexMeaning val labelMeaning = indexMeaning o labelIndex val labelMeaning = Trace.trace ("Ssa.Shrink.labelMeaning", Label.layout, LabelMeaning.layout) labelMeaning fun meaningLabel m = Block.label (Vector.sub (blocks, LabelMeaning.blockIndex m)) fun labelArgs l = Block.args (Vector.sub (blocks, labelIndex l)) fun meaningArgs m = Block.args (Vector.sub (blocks, LabelMeaning.blockIndex m)) fun save (f, s) = let val {destroy, graph, ...} = Function.layoutDot (f, fn _ => NONE) in File.withOut (concat ["/tmp/", Func.toString (Function.name f), ".", s, ".dot"], fn out => Layout.outputl (graph, out)) ; destroy () end val _ = if true then () else save (f, "pre") (* *) val _ = if true then () else Layout.outputl (Vector.layout (fn i => (Layout.record [("label", Label.layout (Block.label (Vector.sub (blocks, i)))), ("inDegree", Int.layout (Array.sub (inDegree, i))), ("state", State.layout (Array.sub (states, i)))])) (Vector.tabulate (numBlocks, fn i => i)), Out.error) val _ = Assert.assert ("Ssa.Shrink.labelMeanings", fn () => let val inDegree' = Array.array (numBlocks, 0) fun bumpIndex i = Array.inc (inDegree', i) fun bumpMeaning m = bumpIndex (LabelMeaning.blockIndex m) val bumpLabel = bumpMeaning o labelMeaning fun doit (LabelMeaning.T {aux, blockIndex, ...}) = let datatype z = datatype LabelMeaning.aux in case aux of Block => Transfer.foreachLabel (Block.transfer (Vector.sub (blocks, blockIndex)), bumpLabel) | Bug => () | Case {cases, default, ...} => (Cases.foreach (cases, bumpLabel) ; Option.app (default, bumpLabel)) | Goto {dst, ...} => bumpMeaning dst | Raise _ => () | Return _ => () end val _ = Array.foreachi (states, fn (i, s) => if Array.sub (inDegree, i) > 0 then (case s of State.Visited m => doit m | _ => ()) else ()) val _ = bumpMeaning (labelMeaning start) in Array.equals (inDegree, inDegree', Int.equals) orelse let val _ = Layout.outputl (Vector.layout (fn i => (Layout.record [("label", Label.layout (Block.label (Vector.sub (blocks, i)))), ("inDegree", Int.layout (Array.sub (inDegree, i))), ("inDegree'", Int.layout (Array.sub (inDegree', i))), ("state", State.layout (Array.sub (states, i)))])) (Vector.tabulate (numBlocks, fn i => i)), Out.error) in false end end) val isBlock = Array.array (numBlocks, false) (* Functions for maintaining inDegree. *) val addLabelIndex = fn i => (Assert.assert ("Ssa.Shrink.addLabelIndex", fn () => Array.sub (inDegree, i) > 0) ; addLabelIndex i) val addLabelMeaning = addLabelIndex o LabelMeaning.blockIndex fun layoutLabelMeaning m = Layout.record [("inDegree", Int.layout (Array.sub (inDegree, LabelMeaning.blockIndex m))), ("meaning", LabelMeaning.layout m)] val traceDeleteLabelMeaning = Trace.trace ("SSa.Shrink.deleteLabelMeaning", layoutLabelMeaning, Unit.layout) fun deleteLabel l = deleteLabelMeaning (labelMeaning l) and deleteLabelMeaning arg: unit = traceDeleteLabelMeaning (fn (m: LabelMeaning.t) => let val i = LabelMeaning.blockIndex m val n = Array.sub (inDegree, i) - 1 val _ = Array.update (inDegree, i, n) val _ = Assert.assert ("Ssa.Shrink.deleteLabelMeaning", fn () => n >= 0) in if n = 0 (* andalso not (Array.sub (isBlock, i)) *) then let datatype z = datatype LabelMeaning.aux in case LabelMeaning.aux m of Block => let val t = Block.transfer (Vector.sub (blocks, i)) val _ = Transfer.foreachLabel (t, deleteLabel) val _ = case t of Transfer.Call {return, ...} => Return.foreachHandler (return, fn l => Array.dec (numHandlerUses, (LabelMeaning.blockIndex (labelMeaning l)))) | _ => () in () end | Bug => () | Case {cases, default, ...} => (Cases.foreach (cases, deleteLabel) ; Option.app (default, deleteLabel)) | Goto {dst, ...} => deleteLabelMeaning dst | Raise _ => () | Return _ => () end else () end) arg fun primApp (prim: Type.t Prim.t, args: VarInfo.t vector) : (Type.t, VarInfo.t) Prim.ApplyResult.t = let val args' = Vector.map (args, fn vi => case vi of VarInfo.T {value = ref (SOME v), ...} => (case v of Value.Con {con, args} => if Vector.isEmpty args then Prim.ApplyArg.Con {con = con, hasArg = false} else Prim.ApplyArg.Var vi | Value.Const c => Prim.ApplyArg.Const c | _ => Prim.ApplyArg.Var vi) | _ => Prim.ApplyArg.Var vi) in Trace.traceInfo' (traceApplyInfo, fn (p, args, _) => let open Layout in seq [Prim.layout p, str " ", List.layout (Prim.ApplyArg.layout (Var.layout o VarInfo.var)) args] end, Prim.ApplyResult.layout (Var.layout o VarInfo.var)) Prim.apply (prim, Vector.toList args', VarInfo.equals) end (* Another DFS, this time accumulating the new blocks. *) val traceForceMeaningBlock = Trace.trace ("Ssa.Shrink.forceMeaningBlock", layoutLabelMeaning, Unit.layout) val traceSimplifyBlock = Trace.trace2 ("Ssa.Shrink.simplifyBlock", List.layout Statement.layout, layoutLabel o Block.label, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceGotoMeaning = Trace.trace3 ("Ssa.Shrink.gotoMeaning", List.layout Statement.layout, layoutLabelMeaning, Vector.layout VarInfo.layout, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceEvalStatement = Trace.trace ("Ssa.Shrink.evalStatement", Statement.layout, Layout.ignore: (Statement.t list -> Statement.t list) -> Layout.t) val traceSimplifyTransfer = Trace.trace ("Ssa.Shrink.simplifyTransfer", Transfer.layout, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceSimplifyCase = Trace.trace ("Ssa2.Shrink2.simplifyCase", fn {canMove, cases, default, test, ...} => Layout.record [("canMove", List.layout Statement.layout canMove), ("cantSimplify", Layout.str "fn () => ..."), ("gone", Layout.str "fn () => ..."), ("test", VarInfo.layout test), ("cases/default", (Transfer.layout o Transfer.Case) {cases = cases, default = default, test = VarInfo.var test})], Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val newBlocks = ref [] fun simplifyLabel l = let val m = labelMeaning l val _ = forceMeaningBlock m in meaningLabel m end and forceMeaningBlock arg = traceForceMeaningBlock (fn (LabelMeaning.T {aux, blockIndex = i, ...}) => if Array.sub (isBlock, i) then () else let val _ = Array.update (isBlock, i, true) val block as Block.T {label, args, ...} = Vector.sub (blocks, i) fun extract (p: Position.t): VarInfo.t = varInfo (case p of Position.Formal n => #1 (Vector.sub (args, n)) | Position.Free x => x) val (statements, transfer) = let fun rr ({args, canMove}, make) = (canMove, make (Vector.map (args, use o extract))) datatype z = datatype LabelMeaning.aux in case aux of Block => simplifyBlock ([], block) | Bug => ([], Transfer.Bug) | Case _ => simplifyBlock ([], block) | Goto {canMove, dst, args} => gotoMeaning (canMove, dst, Vector.map (args, extract)) | Raise z => rr (z, Transfer.Raise) | Return z => rr (z, Transfer.Return) end val _ = List.push (newBlocks, Block.T {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}) in () end) arg and simplifyBlock arg : Statement.t list * Transfer.t = traceSimplifyBlock (fn (canMoveIn, Block.T {statements, transfer, ...}) => let val f = evalStatements statements val (ss, transfer) = simplifyTransfer transfer in (canMoveIn @ (f ss), transfer) end) arg and evalStatements (ss: Statement.t vector) : Statement.t list -> Statement.t list = let val fs = Vector.map (ss, evalStatement) in fn ss => Vector.foldr (fs, ss, fn (f, ss) => f ss) end and simplifyTransfer arg : Statement.t list * Transfer.t = traceSimplifyTransfer (fn (t: Transfer.t) => case t of Arith {prim, args, overflow, success, ty} => let val args = varInfos args in case primApp (prim, args) of Prim.ApplyResult.Const c => let val _ = deleteLabel overflow val x = Var.newNoname () val isUsed = ref false val vi = VarInfo.T {isUsed = isUsed, numOccurrences = ref 0, ty = SOME ty, value = ref (SOME (Value.Const c)), var = x} val (ss, t) = goto (success, Vector.new1 vi) val ss = if !isUsed then Statement.T {var = SOME x, ty = Type.ofConst c, exp = Exp.Const c} :: ss else ss in (ss, t) end | Prim.ApplyResult.Var x => let val _ = deleteLabel overflow in goto (success, Vector.new1 x) end | Prim.ApplyResult.Overflow => let val _ = deleteLabel success in goto (overflow, Vector.new0 ()) end | Prim.ApplyResult.Apply (prim, args) => let val args = Vector.fromList args in ([], Arith {prim = prim, args = uses args, overflow = simplifyLabel overflow, success = simplifyLabel success, ty = ty}) end | _ => ([], Arith {prim = prim, args = uses args, overflow = simplifyLabel overflow, success = simplifyLabel success, ty = ty}) end | Bug => ([], Bug) | Call {func, args, return} => let val (statements, return) = case return of Return.NonTail {cont, handler} => let fun isEta (m: LabelMeaning.t, ps: Position.t vector): bool = Vector.length ps = Vector.length (meaningArgs m) andalso Vector.foralli (ps, fn (i, Position.Formal i') => i = i' | _ => false) val m = labelMeaning cont fun nonTail () = let val _ = forceMeaningBlock m val handler = Handler.map (handler, fn l => let val m = labelMeaning l val _ = forceMeaningBlock m in meaningLabel m end) in ([], Return.NonTail {cont = meaningLabel m, handler = handler}) end fun tail statements = (deleteLabelMeaning m ; (statements, Return.Tail)) fun cont handlerEta = case LabelMeaning.aux m of LabelMeaning.Bug => (case handlerEta of NONE => nonTail () | SOME canMove => tail canMove) | LabelMeaning.Return {args, canMove} => if isEta (m, args) then tail canMove else nonTail () | _ => nonTail () in case handler of Handler.Caller => cont NONE | Handler.Dead => cont NONE | Handler.Handle l => let val m = labelMeaning l in case LabelMeaning.aux m of LabelMeaning.Bug => cont NONE | LabelMeaning.Raise {args, canMove} => if isEta (m, args) then cont (SOME canMove) else nonTail () | _ => nonTail () end end | _ => ([], return) in (statements, Call {func = func, args = simplifyVars args, return = return}) end | Case {test, cases, default} => let val test = varInfo test fun cantSimplify () = ([], Case {test = use test, cases = Cases.map (cases, simplifyLabel), default = Option.map (default, simplifyLabel)}) in simplifyCase {canMove = [], cantSimplify = cantSimplify, cases = cases, default = default, gone = fn () => (Cases.foreach (cases, deleteLabel) ; Option.app (default, deleteLabel)), test = test} end | Goto {dst, args} => goto (dst, varInfos args) | Raise xs => ([], Raise (simplifyVars xs)) | Return xs => ([], Return (simplifyVars xs)) | Runtime {prim, args, return} => ([], Runtime {prim = prim, args = simplifyVars args, return = simplifyLabel return}) ) arg and simplifyCase arg : Statement.t list * Transfer.t = traceSimplifyCase (fn {canMove, cantSimplify, cases, default, gone, test: VarInfo.t} => let (* tryToEliminate makes sure that the destination meaning * hasn't already been simplified. If it has, then we can't * simplify the case. *) fun tryToEliminate m = let val i = LabelMeaning.blockIndex m in if Array.sub (inDegree, i) = 0 then cantSimplify () else let val _ = addLabelIndex i val _ = gone () in gotoMeaning (canMove, m, Vector.new0 ()) end end in if Cases.isEmpty cases then (case default of NONE => (canMove, Bug) | SOME l => tryToEliminate (labelMeaning l)) else let val l = Cases.hd cases fun isOk (l': Label.t): bool = Label.equals (l, l') in if 0 = Vector.length (labelArgs l) andalso Cases.forall (cases, isOk) andalso (case default of NONE => true | SOME l => isOk l) then (* All cases the same -- eliminate the case. *) tryToEliminate (labelMeaning l) else let fun findCase (cases, isCon, args) = let val n = Vector.length cases fun doit (l, args) = let val m = labelMeaning l val _ = addLabelMeaning m val _ = gone () in gotoMeaning (canMove, m, args) end fun loop k = if k = n then (case default of NONE => (gone (); ([], Bug)) | SOME l => doit (l, Vector.new0 ())) else let val (con, l) = Vector.sub (cases, k) in if isCon con then doit (l, args) else loop (k + 1) end in loop 0 end in case (VarInfo.value test, cases) of (SOME (Value.Const c), _) => (case (cases, c) of (Cases.Word (_, cs), Const.Word w) => findCase (cs, fn w' => WordX.equals (w, w'), Vector.new0 ()) | _ => Error.bug "Ssa.Shrink.simplifyCases: strange constant") | (SOME (Value.Con {con, args}), Cases.Con cases) => findCase (cases, fn c => Con.equals (con, c), args) | _ => cantSimplify () end end end) arg and goto (dst: Label.t, args: VarInfo.t vector) : Statement.t list * Transfer.t = gotoMeaning ([], labelMeaning dst, args) and gotoMeaning arg : Statement.t list * Transfer.t = traceGotoMeaning (fn (canMoveIn, m as LabelMeaning.T {aux, blockIndex = i, ...}, args: VarInfo.t vector) => let val n = Array.sub (inDegree, i) val _ = Assert.assert ("Ssa.Shrink.gotoMeaning", fn () => n >= 1) fun normal () = if n = 1 then let val _ = Array.update (inDegree, i, 0) val b = Vector.sub (blocks, i) val _ = Vector.foreach2 (Block.args b, args, fn ((x, _), vi) => setVarInfo (x, vi)) in simplifyBlock (canMoveIn, b) end else let val _ = forceMeaningBlock m in (canMoveIn, Goto {dst = Block.label (Vector.sub (blocks, i)), args = uses args}) end fun extract p = case p of Position.Formal n => Vector.sub (args, n) | Position.Free x => varInfo x fun rr ({args, canMove}, make) = (canMoveIn @ canMove, make (Vector.map (args, use o extract))) datatype z = datatype LabelMeaning.aux in case aux of Block => normal () | Bug => ((*canMoveIn*)[], Transfer.Bug) | Case {canMove, cases, default} => simplifyCase {canMove = canMoveIn @ canMove, cantSimplify = normal, cases = cases, default = default, gone = fn () => deleteLabelMeaning m, test = Vector.sub (args, 0)} | Goto {canMove, dst, args} => if Array.sub (isHeader, i) orelse Array.sub (isBlock, i) then normal () else let val n' = n - 1 val _ = Array.update (inDegree, i, n') val _ = if n' > 0 then addLabelMeaning dst else () in gotoMeaning (canMoveIn @ canMove, dst, Vector.map (args, extract)) end | Raise z => rr (z, Transfer.Raise) | Return z => rr (z, Transfer.Return) end) arg and evalStatement arg : Statement.t list -> Statement.t list = traceEvalStatement (fn (Statement.T {var, ty, exp}) => let val _ = Option.app (var, fn x => setVarInfo (x, VarInfo.new (x, SOME ty))) fun delete ss = ss fun doit {makeExp: unit -> Exp.t, sideEffect: bool, value: Value.t option} = let fun make var = Statement.T {var = var, ty = ty, exp = makeExp ()} in case var of NONE => if sideEffect then (fn ss => make NONE :: ss) else delete | SOME x => let val VarInfo.T {isUsed, value = r, ...} = varInfo x val _ = r := value in fn ss => if !isUsed then make (SOME x) :: ss else if sideEffect then make NONE :: ss else ss end end fun setVar vi = (Option.app (var, fn x => setVarInfo (x, vi)) ; delete) fun construct (v: Value.t, makeExp) = doit {makeExp = makeExp, sideEffect = false, value = SOME v} in case exp of ConApp {con, args} => let val args = varInfos args in construct (Value.Con {con = con, args = args}, fn () => ConApp {con = con, args = uses args}) end | Const c => construct (Value.Const c, fn () => exp) | PrimApp {prim, targs, args} => let val args = varInfos args fun apply {prim, targs, args} = doit {sideEffect = Prim.maySideEffect prim, makeExp = fn () => PrimApp {prim = prim, targs = targs, args = uses args}, value = NONE} datatype z = datatype Prim.ApplyResult.t in case primApp (prim, args) of Apply (prim, args) => apply {prim = prim, targs = Vector.new0 (), args = Vector.fromList args} | Bool b => let val con = Con.fromBool b in construct (Value.Con {con = con, args = Vector.new0 ()}, fn () => ConApp {con = con, args = Vector.new0 ()}) end | Const c => construct (Value.Const c, fn () => Exp.Const c) | Var vi => setVar vi | _ => apply {prim = prim, targs = targs, args = args} end | Select {tuple, offset} => let val tuple as VarInfo.T {value, ...} = varInfo tuple in case !value of SOME (Value.Tuple vs) => setVar (Vector.sub (vs, offset)) | _ => construct (Value.Select {tuple = tuple, offset = offset}, fn () => Select {tuple = use tuple, offset = offset}) end | Tuple xs => let val xs = varInfos xs in case Exn.withEscape (fn escape => Vector.foldri (xs, NONE, fn (i, VarInfo.T {value, ...}, tuple') => case !value of SOME (Value.Select {offset, tuple}) => if offset = i then case tuple' of NONE => (case VarInfo.ty tuple of SOME ty => (case Type.deTupleOpt ty of SOME ts => if Vector.length xs = Vector.length ts then SOME tuple else escape NONE | NONE => escape NONE) | NONE => escape NONE) | SOME tuple'' => if VarInfo.equals (tuple'', tuple) then tuple' else escape NONE else escape NONE | _ => escape NONE)) of SOME tuple => setVar tuple | NONE => construct (Value.Tuple xs, fn () => Tuple (uses xs)) end | Var x => setVar (varInfo x) | _ => doit {makeExp = fn () => exp, sideEffect = true, value = NONE} end) arg val start = labelMeaning start val _ = forceMeaningBlock start val f = Function.new {args = args, blocks = Vector.fromList (!newBlocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = meaningLabel start} val _ = if true then () else save (f, "post") val _ = Function.clear f in f end end fun eliminateUselessProfile (f: Function.t): Function.t = if !Control.profile = Control.ProfileNone then f else let fun eliminateInBlock (b as Block.T {args, label, statements, transfer}) : Block.t = if not (Vector.exists (statements, Statement.isProfile)) then b else let datatype z = datatype Exp.t datatype z = datatype ProfileExp.t val stack = Vector.fold (statements, [], fn (s as Statement.T {exp, ...}, stack) => case exp of Profile (Leave si) => (case stack of Statement.T {exp = Profile (Enter si'), ...} :: rest => if SourceInfo.equals (si, si') then rest else Error.bug "Ssa.Shrink.eliminateUselessProfile: mismatched Leave" | _ => s :: stack) | _ => s :: stack) val statements = Vector.fromListRev stack in Block.T {args = args, label = label, statements = statements, transfer = transfer} end val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val blocks = Vector.map (blocks, eliminateInBlock) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val traceShrinkFunction = Trace.trace ("Ssa.Shrink.shrinkFunction", Function.layout, Function.layout) val shrinkFunction = fn g => let val s = shrinkFunction g in fn f => traceShrinkFunction s (eliminateUselessProfile f) end fun shrink (Program.T {datatypes, globals, functions, main}) = let val s = shrinkFunction {globals = globals} in Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, s), main = main} end end mlton-20100608/mlton/ssa/shrink.sig0000644000076600000240000000100511404435623015476 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SHRINK_STRUCTS = sig include PREPASSES end signature SHRINK = sig include SHRINK_STRUCTS val shrinkFunction: {globals: Statement.t vector} -> Function.t -> Function.t val shrink: Program.t -> Program.t end mlton-20100608/mlton/ssa/shrink2.fun0000644000076600000240000017500111404435623015576 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Shrink2 (S: SHRINK2_STRUCTS): SHRINK2 = struct open S structure Statement = struct open Statement fun isProfile (s: t): bool = case s of Profile _ => true | _ => false end structure Array = struct open Array fun inc (a: int t, i: int): unit = update (a, i, 1 + sub (a, i)) fun dec (a: int t, i: int): unit = update (a, i, sub (a, i) - 1) end datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t structure VarInfo = struct datatype t = T of {isUsed: bool ref, numOccurrences: int ref, ty: Type.t option, value: value option ref, var: Var.t} and value = Const of Const.t | Inject of {sum: Tycon.t, variant: t} | Object of {args: t vector, con: Con.t option} | Select of {object: t, offset: int} fun equals (T {var = x, ...}, T {var = y, ...}) = Var.equals (x, y) fun layout (T {isUsed, numOccurrences, ty, value, var}) = let open Layout in record [("isUsed", Bool.layout (!isUsed)), ("numOccurrences", Int.layout (!numOccurrences)), ("ty", Option.layout Type.layout ty), ("value", Option.layout layoutValue (!value)), ("var", Var.layout var)] end and layoutValue v = let open Layout in case v of Const c => Const.layout c | Inject {sum, variant} => seq [layout variant, str ": ", Tycon.layout sum] | Object {args, con} => let val args = Vector.layout layout args in case con of NONE => args | SOME con => seq [Con.layout con, args] end | Select {object, offset} => seq [str "#", Int.layout (offset + 1), str " ", layout object] end fun new (x: Var.t, ty: Type.t option) = T {isUsed = ref false, numOccurrences = ref 0, ty = ty, value = ref NONE, var = x} fun setValue (T {value, ...}, v) = (Assert.assert ("Ssa2.Shrink2.VarInfo.setValue", fn () => Option.isNone (!value)) ; value := SOME v) fun numOccurrences (T {numOccurrences = r, ...}) = r fun ty (T {ty, ...}): Type.t option = ty fun value (T {value, ...}): value option = !value fun var (T {var, ...}): Var.t = var end structure Value = struct datatype t = datatype VarInfo.value end structure Position = struct datatype t = Formal of int | Free of Var.t fun layout (p: t) = case p of Formal i => Int.layout i | Free x => Var.layout x val equals = fn (Formal i, Formal i') => i = i' | (Free x, Free x') => Var.equals (x, x') | _ => false end structure Positions = MonoVector (Position) structure LabelMeaning = struct datatype t = T of {aux: aux, blockIndex: int, (* The index of the block *) label: Label.t} (* redundant, the label of the block *) and aux = Block | Bug | Case of {canMove: Statement.t list, cases: Cases.t, default: Label.t option} | Goto of {canMove: Statement.t list, dst: t, args: Positions.t} | Raise of {args: Positions.t, canMove: Statement.t list} | Return of {args: Positions.t, canMove: Statement.t list} local fun make f (T r) = f r in val aux = make #aux val blockIndex = make #blockIndex end fun layout (T {aux, label, ...}) = let open Layout in seq [Label.layout label, str " ", case aux of Block => str "Block " | Bug => str "Bug" | Case _ => str "Case" | Goto {dst, args, ...} => seq [str "Goto ", tuple [layout dst, Positions.layout args]] | Raise {args, ...} => seq [str "Raise ", Positions.layout args] | Return {args, ...} => seq [str "Return ", Positions.layout args]] end end structure State = struct datatype state = Unvisited | Visited of LabelMeaning.t | Visiting val layout = let open Layout in fn Unvisited => str "Unvisited" | Visited m => LabelMeaning.layout m | Visiting => str "Visiting" end end val traceApplyInfo = Trace.info "Ssa2.Shrink2.Prim.apply" fun shrinkFunction {globals: Statement.t vector} = let fun use (VarInfo.T {isUsed, var, ...}): Var.t = (isUsed := true ; var) fun uses (vis: VarInfo.t vector): Var.t vector = Vector.map (vis, use) (* varInfo can't be getSetOnce because of setReplacement. *) val {get = varInfo: Var.t -> VarInfo.t, set = setVarInfo, ...} = Property.getSet (Var.plist, Property.initFun (fn x => VarInfo.new (x, NONE))) val setVarInfo = Trace.trace2 ("Ssa2.Shrink2.setVarInfo", Var.layout, VarInfo.layout, Unit.layout) setVarInfo fun varInfos xs = Vector.map (xs, varInfo) fun simplifyVar (x: Var.t) = use (varInfo x) val simplifyVar = Trace.trace ("Ssa2.Shrink2.simplifyVar", Var.layout, Var.layout) simplifyVar fun simplifyVars xs = Vector.map (xs, simplifyVar) fun incVarInfo (x: VarInfo.t): unit = Int.inc (VarInfo.numOccurrences x) fun incVar (x: Var.t): unit = incVarInfo (varInfo x) fun incVars xs = Vector.foreach (xs, incVar) fun numVarOccurrences (x: Var.t): int = ! (VarInfo.numOccurrences (varInfo x)) val () = Vector.foreach (globals, fn s => case s of Bind {exp, ty, var} => let val () = Option.app (var, fn x => setVarInfo (x, VarInfo.new (x, SOME ty))) fun construct v = Option.app (var, fn x => VarInfo.setValue (varInfo x, v)) in case exp of Const c => construct (Value.Const c) | Object {args, con} => construct (Value.Object {args = Vector.map (args, varInfo), con = con}) | Select {base, offset} => (case base of Base.Object x => construct (Value.Select {object = varInfo x, offset = offset}) | _ => ()) | Var y => Option.app (var, fn x => setVarInfo (x, varInfo y)) | _ => () end | _ => ()) in fn f: Function.t => let val () = Function.clear f val {args, blocks, mayInline, name, raises, returns, start, ...} = Function.dest f val () = Vector.foreach (args, fn (x, ty) => setVarInfo (x, VarInfo.new (x, SOME ty))) (* Index the labels by their defining block in blocks. *) val {get = labelIndex, set = setLabelIndex, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val () = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val numBlocks = Vector.length blocks (* Do a DFS to compute occurrence counts and set label meanings *) val states = Array.array (numBlocks, State.Unvisited) val inDegree = Array.array (numBlocks, 0) fun addLabelIndex i = Array.inc (inDegree, i) val isHeader = Array.array (numBlocks, false) val numHandlerUses = Array.array (numBlocks, 0) fun layoutLabel (l: Label.t): Layout.t = let val i = labelIndex l in Layout.record [("label", Label.layout l), ("inDegree", Int.layout (Array.sub (inDegree, i)))] end fun incAux aux = case aux of LabelMeaning.Goto {dst, ...} => addLabelIndex (LabelMeaning.blockIndex dst) | _ => () fun incLabel (l: Label.t): unit = incLabelMeaning (labelMeaning l) and incLabelMeaning (LabelMeaning.T {aux, blockIndex, ...}): unit = let val i = blockIndex val n = Array.sub (inDegree, i) val () = Array.update (inDegree, i, 1 + n) in if n = 0 then incAux aux else () end and labelMeaning (l: Label.t): LabelMeaning.t = let val i = labelIndex l in case Array.sub (states, i) of State.Visited m => m | State.Visiting => (Array.update (isHeader, i, true) ; (LabelMeaning.T {aux = LabelMeaning.Block, blockIndex = i, label = Block.label (Vector.sub (blocks, i))})) | State.Unvisited => let val () = Array.update (states, i, State.Visiting) val m = computeMeaning i val () = Array.update (states, i, State.Visited m) in m end end and computeMeaning (i: int): LabelMeaning.t = let val Block.T {args, statements, transfer, ...} = Vector.sub (blocks, i) val () = Vector.foreach (args, fn (x, ty) => setVarInfo (x, VarInfo.new (x, SOME ty))) val () = Vector.foreach (statements, fn s => Statement.foreachUse (s, incVar)) fun extract (actuals: Var.t vector): Positions.t = let val {get: Var.t -> Position.t, set, destroy} = Property.destGetSetOnce (Var.plist, Property.initFun Position.Free) val () = Vector.foreachi (args, fn (i, (x, _)) => set (x, Position.Formal i)) val ps = Vector.map (actuals, get) val () = destroy () in ps end fun doit aux = LabelMeaning.T {aux = aux, blockIndex = i, label = Block.label (Vector.sub (blocks, i))} fun normal () = doit LabelMeaning.Block fun canMove () = Vector.toList statements fun rr (xs: Var.t vector, make) = let val () = incVars xs (* val n = Vector.length statements fun loop (i, ac) = if i = n then if 0 = Vector.length xs orelse 0 < Vector.length args then doit (make {args = extract xs, canMove = rev ac}) else normal () else let val s = Vector.sub (statements, i) in if Statement.isProfile s then loop (i + 1, s :: ac) else normal () end in loop (0, []) end *) in if Vector.forall (statements, Statement.isProfile) andalso (0 = Vector.length xs orelse 0 < Vector.length args) then doit (make {args = extract xs, canMove = canMove ()}) else normal () end in case transfer of Arith {args, overflow, success, ...} => (incVars args ; incLabel overflow ; incLabel success ; normal ()) | Bug => if 0 = Vector.length statements andalso (case returns of NONE => true | SOME ts => Vector.equals (ts, args, fn (t, (_, t')) => Type.equals (t, t'))) then doit LabelMeaning.Bug else normal () | Call {args, return, ...} => let val () = incVars args val () = Return.foreachHandler (return, fn l => Array.inc (numHandlerUses, labelIndex l)) val () = Return.foreachLabel (return, incLabel) in normal () end | Case {test, cases, default} => let val () = incVar test val () = Cases.foreach (cases, incLabel) val () = Option.app (default, incLabel) in if Vector.forall(statements, Statement.isProfile) andalso not (Array.sub (isHeader, i)) andalso 1 = Vector.length args andalso 1 = numVarOccurrences test andalso Var.equals (test, #1 (Vector.sub (args, 0))) then doit (LabelMeaning.Case {canMove = canMove (), cases = cases, default = default}) else normal () end | Goto {dst, args = actuals} => let val () = incVars actuals val m = labelMeaning dst in if Vector.exists (statements, not o Statement.isProfile) orelse Array.sub (isHeader, i) then (incLabelMeaning m ; normal ()) else if 0 = Vector.length statements andalso Vector.equals (args, actuals, fn ((x, _), x') => Var.equals (x, x') andalso 1 = numVarOccurrences x) then m (* It's an eta. *) else let val ps = extract actuals val n = Vector.fold (args, 0, fn ((x, _), n) => n + numVarOccurrences x) val n' = Vector.fold (ps, 0, fn (p, n) => case p of Position.Formal _ => n + 1 | _ => n) datatype z = datatype LabelMeaning.aux in if n <> n' then (incLabelMeaning m ; normal ()) else let fun extract (ps': Positions.t) : Positions.t = Vector.map (ps', fn p => let datatype z = datatype Position.t in case p of Free x => Free x | Formal i => Vector.sub (ps, i) end) val canMove' = canMove () val a = case LabelMeaning.aux m of Block => Goto {canMove = canMove', dst = m, args = ps} | Bug => Bug | Case _ => Goto {canMove = canMove', dst = m, args = ps} | Goto {canMove, dst, args} => Goto {canMove = canMove' @ canMove, dst = dst, args = extract args} | Raise {args, canMove} => Raise {args = extract args, canMove = canMove' @ canMove} | Return {args, canMove} => Return {args = extract args, canMove = canMove' @ canMove} in doit a end end end | Raise xs => rr (xs, LabelMeaning.Raise) | Return xs => rr (xs, LabelMeaning.Return) | Runtime {args, return, ...} => (incVars args ; incLabel return ; normal ()) end val () = incLabel start fun indexMeaning i = case Array.sub (states, i) of State.Visited m => m | _ => Error.bug "Ssa2.Shrink2.indexMeaning: not computed" val indexMeaning = Trace.trace ("Ssa2.Shrink2.indexMeaning", Int.layout, LabelMeaning.layout) indexMeaning val labelMeaning = indexMeaning o labelIndex val labelMeaning = Trace.trace ("Ssa2.Shrink2.labelMeaning", Label.layout, LabelMeaning.layout) labelMeaning fun meaningLabel m = Block.label (Vector.sub (blocks, LabelMeaning.blockIndex m)) fun labelArgs l = Block.args (Vector.sub (blocks, labelIndex l)) fun meaningArgs m = Block.args (Vector.sub (blocks, LabelMeaning.blockIndex m)) fun save (f, s) = let val {destroy, graph, ...} = Function.layoutDot (f, fn _ => NONE) in File.withOut (concat ["/tmp/", Func.toString (Function.name f), ".", s, ".dot"], fn out => Layout.outputl (graph, out)) ; destroy () end val () = if true then () else save (f, "pre") (* *) val () = if true then () else Layout.outputl (Vector.layout (fn i => (Layout.record [("label", Label.layout (Block.label (Vector.sub (blocks, i)))), ("inDegree", Int.layout (Array.sub (inDegree, i))), ("state", State.layout (Array.sub (states, i)))])) (Vector.tabulate (numBlocks, fn i => i)), Out.error) val () = Assert.assert ("Ssa2.Shrink2.labelMeanings", fn () => let val inDegree' = Array.array (numBlocks, 0) fun bumpIndex i = Array.inc (inDegree', i) fun bumpMeaning m = bumpIndex (LabelMeaning.blockIndex m) val bumpLabel = bumpMeaning o labelMeaning fun doit (LabelMeaning.T {aux, blockIndex, ...}) = let datatype z = datatype LabelMeaning.aux in case aux of Block => Transfer.foreachLabel (Block.transfer (Vector.sub (blocks, blockIndex)), bumpLabel) | Bug => () | Case {cases, default, ...} => (Cases.foreach (cases, bumpLabel) ; Option.app (default, bumpLabel)) | Goto {dst, ...} => bumpMeaning dst | Raise _ => () | Return _ => () end val () = Array.foreachi (states, fn (i, s) => if Array.sub (inDegree, i) > 0 then (case s of State.Visited m => doit m | _ => ()) else ()) val () = bumpMeaning (labelMeaning start) in Array.equals (inDegree, inDegree', Int.equals) orelse let val () = Layout.outputl (Vector.layout (fn i => (Layout.record [("label", Label.layout (Block.label (Vector.sub (blocks, i)))), ("inDegree", Int.layout (Array.sub (inDegree, i))), ("inDegree'", Int.layout (Array.sub (inDegree', i))), ("state", State.layout (Array.sub (states, i)))])) (Vector.tabulate (numBlocks, fn i => i)), Out.error) in false end end) val isBlock = Array.array (numBlocks, false) (* Functions for maintaining inDegree. *) val addLabelIndex = fn i => (Assert.assert ("Ssa2.Shrink2.addLabelIndex", fn () => Array.sub (inDegree, i) > 0) ; addLabelIndex i) val addLabelMeaning = addLabelIndex o LabelMeaning.blockIndex fun layoutLabelMeaning m = Layout.record [("inDegree", Int.layout (Array.sub (inDegree, LabelMeaning.blockIndex m))), ("meaning", LabelMeaning.layout m)] val traceDeleteLabelMeaning = Trace.trace ("Ssa2.Shrink2.deleteLabelMeaning", layoutLabelMeaning, Unit.layout) fun deleteLabel l = deleteLabelMeaning (labelMeaning l) and deleteLabelMeaning arg: unit = traceDeleteLabelMeaning (fn (m: LabelMeaning.t) => let val i = LabelMeaning.blockIndex m val n = Array.sub (inDegree, i) - 1 val () = Array.update (inDegree, i, n) val () = Assert.assert ("Ssa2.Shrink2.deleteLabelMeaning", fn () => n >= 0) in if n = 0 (* andalso not (Array.sub (isBlock, i)) *) then let datatype z = datatype LabelMeaning.aux in case LabelMeaning.aux m of Block => let val t = Block.transfer (Vector.sub (blocks, i)) val () = Transfer.foreachLabel (t, deleteLabel) val () = case t of Transfer.Call {return, ...} => Return.foreachHandler (return, fn l => Array.dec (numHandlerUses, (LabelMeaning.blockIndex (labelMeaning l)))) | _ => () in () end | Bug => () | Case {cases, default, ...} => (Cases.foreach (cases, deleteLabel) ; Option.app (default, deleteLabel)) | Goto {dst, ...} => deleteLabelMeaning dst | Raise _ => () | Return _ => () end else () end) arg fun primApp (prim: Type.t Prim.t, args: VarInfo.t vector) : (Type.t, VarInfo.t) Prim.ApplyResult.t = let val args' = Vector.map (args, fn vi => case vi of VarInfo.T {value = ref (SOME v), ...} => (case v of Value.Const c => Prim.ApplyArg.Const c | Value.Object {args, con} => (case (con, Vector.length args) of (SOME con, 0) => Prim.ApplyArg.Con {con = con, hasArg = false} | _ => Prim.ApplyArg.Var vi) | _ => Prim.ApplyArg.Var vi) | _ => Prim.ApplyArg.Var vi) in Trace.traceInfo' (traceApplyInfo, fn (p, args, _) => let open Layout in seq [Prim.layout p, str " ", List.layout (Prim.ApplyArg.layout (Var.layout o VarInfo.var)) args] end, Prim.ApplyResult.layout (Var.layout o VarInfo.var)) Prim.apply (prim, Vector.toList args', VarInfo.equals) end (* Another DFS, this time accumulating the new blocks. *) val traceForceMeaningBlock = Trace.trace ("Ssa2.Shrink2.forceMeaningBlock", layoutLabelMeaning, Unit.layout) val traceSimplifyBlock = Trace.trace2 ("Ssa2.Shrink2.simplifyBlock", List.layout Statement.layout, layoutLabel o Block.label, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceGotoMeaning = Trace.trace3 ("Ssa2.Shrink2.gotoMeaning", List.layout Statement.layout, layoutLabelMeaning, Vector.layout VarInfo.layout, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceEvalStatement = Trace.trace ("Ssa2.Shrink2.evalStatement", Statement.layout, Layout.ignore: (Statement.t list -> Statement.t list) -> Layout.t) val traceSimplifyTransfer = Trace.trace ("Ssa2.Shrink2.simplifyTransfer", Transfer.layout, Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val traceSimplifyCase = Trace.trace ("Ssa2.Shrink2.simplifyCase", fn {canMove, cases, default, test, ...} => Layout.record [("canMove", List.layout Statement.layout canMove), ("cantSimplify", Layout.str "fn () => ..."), ("gone", Layout.str "fn () => ..."), ("test", VarInfo.layout test), ("cases/default", (Transfer.layout o Transfer.Case) {cases = cases, default = default, test = VarInfo.var test})], Layout.tuple2 (List.layout Statement.layout, Transfer.layout)) val newBlocks = ref [] fun simplifyLabel l = let val m = labelMeaning l val () = forceMeaningBlock m in meaningLabel m end and forceMeaningBlock arg = traceForceMeaningBlock (fn (LabelMeaning.T {aux, blockIndex = i, ...}) => if Array.sub (isBlock, i) then () else let val () = Array.update (isBlock, i, true) val block as Block.T {label, args, ...} = Vector.sub (blocks, i) fun extract (p: Position.t): VarInfo.t = varInfo (case p of Position.Formal n => #1 (Vector.sub (args, n)) | Position.Free x => x) val (statements, transfer) = let fun rr ({args, canMove}, make) = (canMove, make (Vector.map (args, use o extract))) datatype z = datatype LabelMeaning.aux in case aux of Block => simplifyBlock ([], block) | Bug => ([], Transfer.Bug) | Case _ => simplifyBlock ([], block) | Goto {canMove, dst, args} => gotoMeaning (canMove, dst, Vector.map (args, extract)) | Raise z => rr (z, Transfer.Raise) | Return z => rr (z, Transfer.Return) end val () = List.push (newBlocks, Block.T {label = label, args = args, statements = Vector.fromList statements, transfer = transfer}) in () end) arg and simplifyBlock arg : Statement.t list * Transfer.t = traceSimplifyBlock (fn (canMoveIn, Block.T {statements, transfer, ...}) => let val f = evalStatements statements val (ss, transfer) = simplifyTransfer transfer in (canMoveIn @ (f ss), transfer) end) arg and evalStatements (ss: Statement.t vector) : Statement.t list -> Statement.t list = let val fs = Vector.map (ss, evalStatement) in fn ss => Vector.foldr (fs, ss, fn (f, ss) => f ss) end and simplifyTransfer arg : Statement.t list * Transfer.t = traceSimplifyTransfer (fn (t: Transfer.t) => case t of Arith {prim, args, overflow, success, ty} => let val args = varInfos args in case primApp (prim, args) of Prim.ApplyResult.Const c => let val () = deleteLabel overflow val x = Var.newNoname () val isUsed = ref false val vi = VarInfo.T {isUsed = isUsed, numOccurrences = ref 0, ty = SOME ty, value = ref (SOME (Value.Const c)), var = x} val (ss, t) = goto (success, Vector.new1 vi) val ss = if !isUsed then Bind {var = SOME x, ty = Type.ofConst c, exp = Exp.Const c} :: ss else ss in (ss, t) end | Prim.ApplyResult.Var x => let val () = deleteLabel overflow in goto (success, Vector.new1 x) end | Prim.ApplyResult.Overflow => let val () = deleteLabel success in goto (overflow, Vector.new0 ()) end | Prim.ApplyResult.Apply (prim, args) => let val args = Vector.fromList args in ([], Arith {prim = prim, args = uses args, overflow = simplifyLabel overflow, success = simplifyLabel success, ty = ty}) end | _ => ([], Arith {prim = prim, args = uses args, overflow = simplifyLabel overflow, success = simplifyLabel success, ty = ty}) end | Bug => ([], Bug) | Call {func, args, return} => let val (statements, return) = case return of Return.NonTail {cont, handler} => let fun isEta (m: LabelMeaning.t, ps: Position.t vector): bool = Vector.length ps = Vector.length (meaningArgs m) andalso Vector.foralli (ps, fn (i, Position.Formal i') => i = i' | _ => false) val m = labelMeaning cont fun nonTail () = let val () = forceMeaningBlock m val handler = Handler.map (handler, fn l => let val m = labelMeaning l val () = forceMeaningBlock m in meaningLabel m end) in ([], Return.NonTail {cont = meaningLabel m, handler = handler}) end fun tail statements = (deleteLabelMeaning m ; (statements, Return.Tail)) fun cont handlerEta = case LabelMeaning.aux m of LabelMeaning.Bug => (case handlerEta of NONE => nonTail () | SOME canMove => tail canMove) | LabelMeaning.Return {args, canMove} => if isEta (m, args) then tail canMove else nonTail () | _ => nonTail () in case handler of Handler.Caller => cont NONE | Handler.Dead => cont NONE | Handler.Handle l => let val m = labelMeaning l in case LabelMeaning.aux m of LabelMeaning.Bug => cont NONE | LabelMeaning.Raise {args, canMove} => if isEta (m, args) then cont (SOME canMove) else nonTail () | _ => nonTail () end end | _ => ([], return) in (statements, Call {func = func, args = simplifyVars args, return = return}) end | Case {test, cases, default} => let val test = varInfo test fun cantSimplify () = ([], Case {test = use test, cases = Cases.map (cases, simplifyLabel), default = Option.map (default, simplifyLabel)}) in simplifyCase {canMove = [], cantSimplify = cantSimplify, cases = cases, default = default, gone = fn () => (Cases.foreach (cases, deleteLabel) ; Option.app (default, deleteLabel)), test = test} end | Goto {dst, args} => goto (dst, varInfos args) | Raise xs => ([], Raise (simplifyVars xs)) | Return xs => ([], Return (simplifyVars xs)) | Runtime {prim, args, return} => ([], Runtime {prim = prim, args = simplifyVars args, return = simplifyLabel return}) ) arg and simplifyCase arg : Statement.t list * Transfer.t = traceSimplifyCase (fn {canMove, cantSimplify, cases, default, gone, test: VarInfo.t} => let (* tryToEliminate makes sure that the destination meaning * hasn't already been simplified. If it has, then we can't * simplify the case. *) fun tryToEliminate m = let val i = LabelMeaning.blockIndex m in if Array.sub (inDegree, i) = 0 then cantSimplify () else let val () = addLabelIndex i val () = gone () in gotoMeaning (canMove, m, Vector.new0 ()) end end in if Cases.isEmpty cases then (case default of NONE => ([], Bug) | SOME l => tryToEliminate (labelMeaning l)) else let val l = Cases.hd cases fun isOk (l': Label.t): bool = Label.equals (l, l') in if 0 = Vector.length (labelArgs l) andalso Cases.forall (cases, isOk) andalso (case default of NONE => true | SOME l => isOk l) then (* All cases the same -- eliminate the case. *) tryToEliminate (labelMeaning l) else let fun findCase (cases, isCon, args) = let val n = Vector.length cases fun doit (l, args) = let val args = if 0 = Vector.length (labelArgs l) then Vector.new0 () else args val m = labelMeaning l val () = addLabelMeaning m val () = gone () in gotoMeaning (canMove, m, args) end fun loop k = if k = n then (case default of NONE => (gone (); ([], Bug)) | SOME l => doit (l, Vector.new0 ())) else let val (con, l) = Vector.sub (cases, k) in if isCon con then doit (l, args) else loop (k + 1) end in loop 0 end in case (VarInfo.value test, cases) of (SOME (Value.Const c), _) => (case (cases, c) of (Cases.Word (_, cs), Const.Word w) => findCase (cs, fn w' => WordX.equals (w, w'), Vector.new0 ()) | _ => Error.bug "Ssa2.Shrink2.simplifyCase: strange constant") | (SOME (Value.Inject {variant, ...}), Cases.Con cases) => let val VarInfo.T {value, ...} = variant in case !value of SOME (Value.Object {con = SOME con, ...}) => findCase (cases, fn c => Con.equals (con, c), Vector.new1 variant) | _ => cantSimplify () end | _ => cantSimplify () end end end) arg and goto (dst: Label.t, args: VarInfo.t vector) : Statement.t list * Transfer.t = gotoMeaning ([], labelMeaning dst, args) and gotoMeaning arg : Statement.t list * Transfer.t = traceGotoMeaning (fn (canMoveIn, m as LabelMeaning.T {aux, blockIndex = i, ...}, args: VarInfo.t vector) => let val n = Array.sub (inDegree, i) val () = Assert.assert ("Ssa2.Shrink2.gotoMeaning", fn () => n >= 1) fun normal () = if n = 1 then let val () = Array.update (inDegree, i, 0) val b = Vector.sub (blocks, i) val () = Vector.foreach2 (Block.args b, args, fn ((x, _), vi) => setVarInfo (x, vi)) in simplifyBlock (canMoveIn, b) end else let val () = forceMeaningBlock m in (canMoveIn, Goto {dst = Block.label (Vector.sub (blocks, i)), args = uses args}) end fun extract p = case p of Position.Formal n => Vector.sub (args, n) | Position.Free x => varInfo x fun rr ({args, canMove}, make) = (canMoveIn @ canMove, make (Vector.map (args, use o extract))) datatype z = datatype LabelMeaning.aux in case aux of Block => normal () | Bug => ((*canMoveIn*)[], Transfer.Bug) | Case {canMove, cases, default} => simplifyCase {canMove = canMoveIn @ canMove, cantSimplify = normal, cases = cases, default = default, gone = fn () => deleteLabelMeaning m, test = Vector.sub (args, 0)} | Goto {canMove, dst, args} => if Array.sub (isHeader, i) orelse Array.sub (isBlock, i) then normal () else let val n' = n - 1 val () = Array.update (inDegree, i, n') val () = if n' > 0 then addLabelMeaning dst else () in gotoMeaning (canMoveIn @ canMove, dst, Vector.map (args, extract)) end | Raise z => rr (z, Transfer.Raise) | Return z => rr (z, Transfer.Return) end) arg and evalBind {exp, ty, var} = let val () = Option.app (var, fn x => setVarInfo (x, VarInfo.new (x, SOME ty))) fun delete ss = ss fun doit {makeExp: unit -> Exp.t, sideEffect: bool, value: Value.t option} = let fun make var = Bind {exp = makeExp (), ty = ty, var = var} in case var of NONE => if sideEffect then (fn ss => make NONE :: ss) else delete | SOME x => let val VarInfo.T {isUsed, value = r, ...} = varInfo x val () = r := value in fn ss => if !isUsed then make (SOME x) :: ss else if sideEffect then make NONE :: ss else ss end end fun simple {sideEffect} = let fun makeExp () = Exp.replaceVar (exp, use o varInfo) in doit {makeExp = makeExp, sideEffect = sideEffect, value = NONE} end fun setVar vi = (Option.app (var, fn x => setVarInfo (x, vi)) ; delete) fun construct (v: Value.t, makeExp) = doit {makeExp = makeExp, sideEffect = false, value = SOME v} fun tuple (xs: VarInfo.t vector) = case (Exn.withEscape (fn escape => let fun no () = escape NONE in Vector.foldri (xs, NONE, fn (i, VarInfo.T {value, ...}, tuple') => case !value of SOME (Value.Select {object, offset}) => (if i = offset then case tuple' of NONE => (case VarInfo.ty object of NONE => no () | SOME ty => (case Type.dest ty of Type.Object {args, con = ObjectCon.Tuple} => if Prod.length args = Vector.length xs andalso not (Prod.isMutable args) then SOME object else no () | _ => no ())) | SOME tuple'' => if VarInfo.equals (tuple'', object) then tuple' else no () else no ()) | _ => no ()) end)) of NONE => construct (Value.Object {args = xs, con = NONE}, fn () => Object {args = uses xs, con = NONE}) | SOME object => setVar object in case exp of Const c => construct (Value.Const c, fn () => exp) | Inject {sum, variant} => let val variant = varInfo variant in construct (Value.Inject {sum = sum, variant = variant}, fn () => Inject {sum = sum, variant = use variant}) end | Object {args, con} => let val args = varInfos args val isMutable = case Type.dest ty of Type.Object {args, ...} => Prod.isMutable args | _ => Error.bug "strange Object type" in (* It would be nice to improve this code to do * reconstruction when isSome con, not just for * tuples. *) if isMutable orelse isSome con then construct (Value.Object {args = args, con = con}, fn () => Object {args = uses args, con = con}) else tuple args end | PrimApp {args, prim} => let val args = varInfos args fun apply {prim, args} = doit {makeExp = fn () => PrimApp {args = uses args, prim = prim}, sideEffect = Prim.maySideEffect prim, value = NONE} datatype z = datatype Prim.ApplyResult.t in case primApp (prim, args) of Apply (prim, args) => apply {prim = prim, args = Vector.fromList args} | Bool b => let val variant = Var.newNoname () val con = Con.fromBool b in evalStatements (Vector.new2 (Bind {exp = Object {args = Vector.new0 (), con = SOME con}, ty = Type.object {args = Prod.empty (), con = ObjectCon.Con con}, var = SOME variant}, Bind {exp = Inject {sum = Tycon.bool, variant = variant}, ty = Type.bool, var = var})) end | Const c => construct (Value.Const c, fn () => Exp.Const c) | Var vi => setVar vi | _ => apply {args = args, prim = prim} end | Select {base, offset} => (case base of Base.Object object => let val object as VarInfo.T {ty, value, ...} = varInfo object fun dontChange () = construct (Value.Select {object = object, offset = offset}, fn () => Select {base = Base.Object (use object), offset = offset}) in case (ty, !value) of (SOME ty, SOME (Value.Object {args, ...})) => (case Type.dest ty of Type.Object {args = targs, ...} => (* Can't simplify the select if the * field is mutable. *) if (#isMutable (Vector.sub (Prod.dest targs, offset))) then dontChange () else setVar (Vector.sub (args, offset)) | _ => Error.bug "Ssa2.Shrink2.evalBind: Select:non object") | _ => dontChange () end | Base.VectorSub _ => simple {sideEffect = false}) | Var x => setVar (varInfo x) end and evalStatement arg : Statement.t list -> Statement.t list = traceEvalStatement (fn s => let fun simple () = fn ss => Statement.replaceUses (s, use o varInfo) :: ss in case s of Bind b => evalBind b | Profile _ => simple () | Update _ => simple () end) arg val start = labelMeaning start val () = forceMeaningBlock start val f = Function.new {args = args, blocks = Vector.fromList (!newBlocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = meaningLabel start} val () = if true then () else save (f, "post") val () = Function.clear f in f end end fun eliminateUselessProfile (f: Function.t): Function.t = if !Control.profile = Control.ProfileNone then f else let fun eliminateInBlock (b as Block.T {args, label, statements, transfer}) : Block.t = if not (Vector.exists (statements, Statement.isProfile)) then b else let datatype z = datatype Exp.t datatype z = datatype ProfileExp.t val stack = Vector.fold (statements, [], fn (s, stack) => case s of Profile (Leave si) => (case stack of Profile (Enter si') :: rest => if SourceInfo.equals (si, si') then rest else Error.bug "Ssa2.Shrink2.eliminateUselessProfile: mismatched Leave" | _ => s :: stack) | _ => s :: stack) val statements = Vector.fromListRev stack in Block.T {args = args, label = label, statements = statements, transfer = transfer} end val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val blocks = Vector.map (blocks, eliminateInBlock) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val traceShrinkFunction = Trace.trace ("Ssa2.Shrink2.shrinkFunction", Function.layout, Function.layout) val shrinkFunction = fn g => let val s = shrinkFunction g in fn f => traceShrinkFunction s (eliminateUselessProfile f) end fun shrink (Program.T {datatypes, globals, functions, main}) = let val s = shrinkFunction {globals = globals} val program = Program.T {datatypes = datatypes, globals = globals, functions = List.revMap (functions, s), main = main} val () = Program.clear program in program end fun eliminateDeadBlocksFunction f = let val {args, blocks, mayInline, name, raises, returns, start} = Function.dest f val {get = isLive, set = setLive, rem} = Property.getSetOnce (Label.plist, Property.initConst false) val () = Function.dfs (f, fn Block.T {label, ...} => (setLive (label, true) ; fn () => ())) val f = if Vector.forall (blocks, isLive o Block.label) then f else let val blocks = Vector.keepAll (blocks, isLive o Block.label) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val () = Vector.foreach (blocks, rem o Block.label) in f end fun eliminateDeadBlocks (Program.T {datatypes, globals, functions, main}) = let val functions = List.revMap (functions, eliminateDeadBlocksFunction) in Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} end end mlton-20100608/mlton/ssa/shrink2.sig0000644000076600000240000000101011404435623015554 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SHRINK2_STRUCTS = sig include PREPASSES2 end signature SHRINK2 = sig include SHRINK2_STRUCTS val shrinkFunction: {globals: Statement.t vector} -> Function.t -> Function.t val shrink: Program.t -> Program.t end mlton-20100608/mlton/ssa/simplify-types.fun0000644000076600000240000007407311404435623017223 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* This pass must happen before polymorphic equality is implemented because * 1. it will make polymorphic equality faster because some types are simpler * 2. it removes uses of polymorphic equality that must return true * * This pass computes a "cardinality" of each datatype, which is an * abstraction of the number of values of the datatype. * Zero means the datatype has no values (except for bottom). * One means the datatype has one values (except for bottom). * Many means the datatype has many values. * * This pass removes all datatypes whose cardinality is Zero or One * and removes * components of tuples * function args * constructor args * which are such datatypes. * * This pass marks constructors as one of * Useless: it never appears in a ConApp. * Transparent: it is the only variant in its datatype * and its argument type does not contain any uses of * Tycon.array or Tycon.vector. * Useful: otherwise * This pass also removes Useless and Transparent constructors. * * We must keep track of Transparent constructors whose argument type * uses Tycon.array because of datatypes like the following: * datatype t = T of t array * Such a datatype has Cardinality.Many, but we cannot eliminate * the datatype and replace the lhs by the rhs, i.e. we must keep the * circularity around. * Must do similar things for vectors. * * Also, to eliminate as many Transparent constructors as possible, for * something like the following, * datatype t = T of u array * and u = U of t vector * we (arbitrarily) expand one of the datatypes first. * The result will be something like * datatype u = U of u array array * where all uses of t are replaced by u array. *) functor SimplifyTypes (S: SIMPLIFY_TYPES_STRUCTS): SIMPLIFY_TYPES = struct open S open Exp Transfer structure Cardinality = struct datatype t = Zero | One | Many fun layout c = Layout.str (case c of Zero => "zero" | One => "one" | Many => "many") val equals: t * t -> bool = op = end structure ConRep = struct datatype t = Useless | Transparent | Useful val isUseful = fn Useful => true | _ => false val isUseless = fn Useless => true | _ => false val toString = fn Useless => "useless" | Transparent => "transparent" | Useful => "useful" val layout = Layout.str o toString end structure Result = struct datatype 'a t = Bugg | Delete | Keep of 'a fun layout layoutX = let open Layout in fn Bugg => str "Bug" | Delete => str "Delete" | Keep x => seq [str "Keep ", layoutX x] end end fun simplify (Program.T {datatypes, globals, functions, main}) = let val {get = conInfo: Con.t -> {rep: ConRep.t ref, args: Type.t vector}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("SimplifyTypes.conInfo", Con.layout)) val conInfo = Trace.trace ("SimplifyTypes.conInfo", Con.layout, fn {rep, args} => Layout.record [("rep", ConRep.layout (!rep)), ("args", Vector.layout Type.layout args)]) conInfo val conRep = ! o #rep o conInfo val conArgs = #args o conInfo fun setConRep (con, r) = #rep (conInfo con) := r val setConRep = Trace.trace2 ("SimplifyTypes.setConRep", Con.layout, ConRep.layout, Unit.layout) setConRep val conIsUseful = ConRep.isUseful o conRep val conIsUseful = Trace.trace ("SimplifyTypes.conIsUseful", Con.layout, Bool.layout) conIsUseful (* Initialize conInfo *) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {con, args} => setConInfo (con, {rep = ref ConRep.Useless, args = args}))) val {get = tyconReplacement: Tycon.t -> Type.t option, set = setTyconReplacement, ...} = Property.getSet (Tycon.plist, Property.initConst NONE) val setTyconReplacement = fn (c, t) => setTyconReplacement (c, SOME t) val {get = tyconInfo: Tycon.t -> { cardinality: Cardinality.t ref, cons: { con: Con.t, args: Type.t vector } vector ref, numCons: int ref, (* tycons whose cardinality depends on mine *) dependents: Tycon.t list ref, isOnWorklist: bool ref }, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("SimplifyTypes.tyconInfo", Tycon.layout)) local fun make sel = (! o sel o tyconInfo, fn (t, x) => sel (tyconInfo t) := x) in val (tyconNumCons, setTyconNumCons) = make #numCons val (tyconCardinality, _) = make #cardinality end val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => setTyconInfo (tycon, { cardinality = ref Cardinality.Zero, numCons = ref 0, cons = ref cons, dependents = ref [], isOnWorklist = ref false })) (* Tentatively mark all constructors appearing in a ConApp as Useful * (some may later be marked as Transparent). *) val _ = let fun handleStatement (Statement.T {exp, ...}) = case exp of ConApp {con, ...} => setConRep (con, ConRep.Useful) | _ => () (* Booleans are special because they are generated by primitives. *) val _ = List.foreach ([Con.truee, Con.falsee], fn c => setConRep (c, ConRep.Useful)) val _ = Vector.foreach (globals, handleStatement) val _ = List.foreach (functions, fn f => Vector.foreach (Function.blocks f, fn Block.T {statements, ...} => Vector.foreach (statements, handleStatement))) in () end (* Remove useless constructors from datatypes. * Remove datatypes which have no cons. *) val datatypes = Vector.keepAllMap (datatypes, fn Datatype.T {tycon, cons} => let val cons = Vector.keepAll (cons, conIsUseful o #con) in if 0 = Vector.length cons then (setTyconReplacement (tycon, Type.unit) ; NONE) else (#cons (tyconInfo tycon) := cons ; SOME (Datatype.T {tycon = tycon, cons = cons})) end) (* Build the dependents for each tycon. *) val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let datatype z = datatype Type.dest val {get = setTypeDependents, destroy = destroyTypeDependents} = Property.destGet (Type.plist, Property.initRec (fn (t, setTypeDependents) => case Type.dest t of Array t => setTypeDependents t | CPointer => () | Datatype tycon' => List.push (#dependents (tyconInfo tycon'), tycon) | IntInf => () | Real _ => () | Ref t => setTypeDependents t | Thread => () | Tuple ts => Vector.foreach (ts, setTypeDependents) | Vector t => setTypeDependents t | Weak t => setTypeDependents t | Word _ => ())) val _ = Vector.foreach (cons, fn {args, ...} => Vector.foreach (args, setTypeDependents)) val _ = destroyTypeDependents () in () end) (* diagnostic *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (datatypes, fn Datatype.T {tycon, ...} => display (seq [str "dependents of ", Tycon.layout tycon, str " = ", List.layout Tycon.layout (!(#dependents (tyconInfo tycon)))])) end) local open Type Cardinality in fun typeCardinality t = case dest t of Datatype tycon => tyconCardinality tycon | Ref t => pointerCardinality t | Tuple ts => tupleCardinality ts | Weak t => pointerCardinality t | _ => Many and pointerCardinality (t: Type.t) = case typeCardinality t of Zero => Zero | _ => Many and tupleCardinality (ts: Type.t vector) = Exn.withEscape (fn escape => (Vector.foreach (ts, fn t => let val c = typeCardinality t in case c of Many => escape Many | One => () | Zero => escape Zero end) ; One)) end fun conCardinality {args, con = _} = tupleCardinality args (* Compute the tycon cardinalities with a fixed point, * initially assuming every datatype tycon cardinality is Zero. *) val _ = let (* list of datatype tycons whose cardinality has not yet stabilized *) val worklist = ref (Vector.fold (datatypes, [], fn (Datatype.T {tycon, ...}, ac) => tycon :: ac)) fun loop () = case !worklist of [] => () | tycon :: tycons => (worklist := tycons ; let val {cons, cardinality, dependents, isOnWorklist, ...} = tyconInfo tycon val c = Exn.withEscape (fn escape => let datatype z = datatype Cardinality.t in Vector.fold (!cons, Zero, fn (c, ac) => case conCardinality c of Many => escape Many | One => (case ac of Many => Error.bug "SimplifyTypes.simplify: Many" | One => escape Many | Zero => One) | Zero => ac) end) in isOnWorklist := false ; if Cardinality.equals (c, !cardinality) then () else (cardinality := c ; (List.foreach (!dependents, fn tycon => let val {isOnWorklist, ...} = tyconInfo tycon in if !isOnWorklist then () else (isOnWorklist := true ; List.push (worklist, tycon)) end))) end ; loop ()) in loop () end (* diagnostic *) val _ = Control.diagnostics (fn display => let open Layout in Vector.foreach (datatypes, fn Datatype.T {tycon, ...} => display (seq [str "cardinality of ", Tycon.layout tycon, str " = ", Cardinality.layout (tyconCardinality tycon)])) end) fun transparent (tycon, con, args) = (setTyconReplacement (tycon, Type.tuple args) ; setConRep (con, ConRep.Transparent) ; setTyconNumCons (tycon, 1)) (* "unary" is datatypes with one constructor whose rhs contains an * array (or vector) type. * For datatypes with one variant not containing an array type, eliminate * the datatype. *) fun containsArrayOrVector (ty: Type.t): bool = let datatype z = datatype Type.dest fun loop t = case Type.dest t of Array _ => true | Ref t => loop t | Tuple ts => Vector.exists (ts, loop) | Vector _ => true | Weak t => loop t | _ => false in loop ty end val (datatypes, unary) = Vector.fold (datatypes, ([], []), fn (Datatype.T {tycon, cons}, (datatypes, unary)) => let (* remove all cons with zero cardinality and mark them as useless *) val cons = Vector.keepAllMap (cons, fn c as {con, ...} => case conCardinality c of Cardinality.Zero => (setConRep (con, ConRep.Useless) ; NONE) | _ => SOME c) in case Vector.length cons of 0 => (setTyconNumCons (tycon, 0) ; setTyconReplacement (tycon, Type.unit) ; (datatypes, unary)) | 1 => let val {con, args} = Vector.sub (cons, 0) in if Vector.exists (args, containsArrayOrVector) then (datatypes, {tycon = tycon, con = con, args = args} :: unary) else (transparent (tycon, con, args) ; (datatypes, unary)) end | _ => (Datatype.T {tycon = tycon, cons = cons} :: datatypes, unary) end) fun containsTycon (ty: Type.t, tyc: Tycon.t): bool = let datatype z = datatype Type.dest val {get = containsTycon, destroy = destroyContainsTycon} = Property.destGet (Type.plist, Property.initRec (fn (t, containsTycon) => case Type.dest t of Array t => containsTycon t | Datatype tyc' => (case tyconReplacement tyc' of NONE => Tycon.equals (tyc, tyc') | SOME t => containsTycon t) | Tuple ts => Vector.exists (ts, containsTycon) | Ref t => containsTycon t | Vector t => containsTycon t | Weak t => containsTycon t | _ => false)) val res = containsTycon ty val () = destroyContainsTycon () in res end (* Keep the circular transparent tycons, ditch the rest. *) val datatypes = List.fold (unary, datatypes, fn ({tycon, con, args}, accum) => if Vector.exists (args, fn arg => containsTycon (arg, tycon)) then Datatype.T {tycon = tycon, cons = Vector.new1 {con = con, args = args}} :: accum else (transparent (tycon, con, args) ; accum)) fun makeKeepSimplifyTypes simplifyType ts = Vector.keepAllMap (ts, fn t => let val t = simplifyType t in if Type.isUnit t then NONE else SOME t end) val {get = simplifyType, destroy = destroySimplifyType} = Property.destGet (Type.plist, Property.initRec (fn (t, simplifyType) => let val keepSimplifyTypes = makeKeepSimplifyTypes simplifyType open Type in case dest t of Array t => array (simplifyType t) | Datatype tycon => (case tyconReplacement tycon of SOME t => let val t = simplifyType t val _ = setTyconReplacement (tycon, t) in t end | NONE => t) | Ref t => reff (simplifyType t) | Tuple ts => Type.tuple (keepSimplifyTypes ts) | Vector t => vector (simplifyType t) | Weak t => weak (simplifyType t) | _ => t end)) val simplifyType = Trace.trace ("SimplifyTypes.simplifyType", Type.layout, Type.layout) simplifyType fun simplifyTypes ts = Vector.map (ts, simplifyType) val keepSimplifyTypes = makeKeepSimplifyTypes simplifyType (* Simplify constructor argument types. *) val datatypes = Vector.fromListMap (datatypes, fn Datatype.T {tycon, cons} => (setTyconNumCons (tycon, Vector.length cons) ; Datatype.T {tycon = tycon, cons = Vector.map (cons, fn {con, args} => {con = con, args = keepSimplifyTypes args})})) val unitVar = Var.newNoname () val {get = varInfo: Var.t -> Type.t, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("varInfo", Var.layout)) fun simplifyVarType (x: Var.t, t: Type.t): Type.t = (setVarInfo (x, t) ; simplifyType t) fun simplifyMaybeVarType (x: Var.t option, t: Type.t): Type.t = case x of SOME x => simplifyVarType (x, t) | NONE => simplifyType t val oldVarType = varInfo val newVarType = simplifyType o oldVarType fun simplifyVar (x: Var.t): Var.t = if Type.isUnit (newVarType x) then unitVar else x val varIsUseless = Type.isUnit o newVarType fun removeUselessVars xs = Vector.keepAll (xs, not o varIsUseless) fun tuple xs = let val xs = removeUselessVars xs in if 1 = Vector.length xs then Var (Vector.sub (xs, 0)) else Tuple xs end fun simplifyFormals xts = Vector.keepAllMap (xts, fn (x, t) => let val t = simplifyVarType (x, t) in if Type.isUnit t then NONE else SOME (x, t) end) val typeIsUseful = not o Type.isUnit o simplifyType datatype result = datatype Result.t fun simplifyExp (e: Exp.t): Exp.t result = case e of ConApp {con, args} => (case conRep con of ConRep.Transparent => Keep (tuple args) | ConRep.Useful => Keep (ConApp {con = con, args = removeUselessVars args}) | ConRep.Useless => Bugg) | PrimApp {prim, targs, args} => Keep (let fun normal () = PrimApp {prim = prim, targs = simplifyTypes targs, args = Vector.map (args, simplifyVar)} fun equal () = if 2 = Vector.length args then if varIsUseless (Vector.sub (args, 0)) then ConApp {con = Con.truee, args = Vector.new0 ()} else normal () else Error.bug "SimplifyTypes.simplifyExp: strange eq/equal PrimApp" open Prim.Name in case Prim.name prim of MLton_eq => equal () | MLton_equal => equal () | _ => normal () end) | Select {tuple, offset} => let val ts = Type.deTuple (oldVarType tuple) in Vector.fold' (ts, 0, (offset, 0), fn (pos, t, (n, offset)) => if n = 0 then (Vector.Done (Keep (if offset = 0 andalso not (Vector.existsR (ts, pos + 1, Vector.length ts, typeIsUseful)) then Var tuple else Select {tuple = tuple, offset = offset}))) else Vector.Continue (n - 1, if typeIsUseful t then offset + 1 else offset), fn _ => Error.bug "SimplifyTypes.simplifyExp: Select:newOffset") end | Tuple xs => Keep (tuple xs) | _ => Keep e val simplifyExp = Trace.trace ("SimplifyTypes.simplifyExp", Exp.layout, Result.layout Exp.layout) simplifyExp fun simplifyTransfer (t : Transfer.t): Statement.t vector * Transfer.t = case t of Arith {prim, args, overflow, success, ty} => (Vector.new0 (), Arith {prim = prim, args = Vector.map (args, simplifyVar), overflow = overflow, success = success, ty = ty}) | Bug => (Vector.new0 (), t) | Call {func, args, return} => (Vector.new0 (), Call {func = func, return = return, args = removeUselessVars args}) | Case {test, cases = Cases.Con cases, default} => let val cases = Vector.keepAll (cases, fn (con, _) => not (ConRep.isUseless (conRep con))) val default = case (Vector.length cases, default) of (_, NONE) => NONE | (0, SOME l) => SOME l | (n, SOME l) => if n = tyconNumCons (Type.deDatatype (oldVarType test)) then NONE else SOME l fun normal () = (Vector.new0 (), Case {test = test, cases = Cases.Con cases, default = default}) in case (Vector.length cases, default) of (0, NONE) => (Vector.new0 (), Bug) | (0, SOME l) => (Vector.new0 (), Goto {dst = l, args = Vector.new0 ()}) | (1, NONE) => let val (con, l) = Vector.sub (cases, 0) in if ConRep.isUseful (conRep con) then (* This case can occur because an array or vector * tycon was kept around. *) normal () else (* The type has become a tuple. Do the selects. *) let val ts = keepSimplifyTypes (conArgs con) val (args, stmts) = if 1 = Vector.length ts then (Vector.new1 test, Vector.new0 ()) else Vector.unzip (Vector.mapi (ts, fn (i, ty) => let val x = Var.newNoname () in (x, Statement.T {var = SOME x, ty = ty, exp = Select {tuple = test, offset = i}}) end)) in (stmts, Goto {dst = l, args = args}) end end | _ => normal () end | Case _ => (Vector.new0 (), t) | Goto {dst, args} => (Vector.new0 (), Goto {dst = dst, args = removeUselessVars args}) | Raise xs => (Vector.new0 (), Raise (removeUselessVars xs)) | Return xs => (Vector.new0 (), Return (removeUselessVars xs)) | Runtime {prim, args, return} => (Vector.new0 (), Runtime {prim = prim, args = Vector.map (args, simplifyVar), return = return}) val simplifyTransfer = Trace.trace ("SimplifyTypes.simplifyTransfer", Transfer.layout, Layout.tuple2 (Vector.layout Statement.layout, Transfer.layout)) simplifyTransfer fun simplifyStatement (Statement.T {var, ty, exp}) = let val ty = simplifyMaybeVarType (var, ty) in (* It is wrong to omit calling simplifyExp when var = NONE because * targs in a PrimApp may still need to be simplified. *) if not (Type.isUnit ty) orelse Exp.maySideEffect exp orelse (case exp of Profile _ => true | _ => false) then (case simplifyExp exp of Bugg => Bugg | Delete => Delete | Keep exp => Keep (Statement.T {var = var, ty = ty, exp = exp})) else Delete end fun simplifyBlock (Block.T {label, args, statements, transfer}) = let val args = simplifyFormals args val statements = Vector.fold' (statements, 0, [], fn (_, statement, statements) => case simplifyStatement statement of Bugg => Vector.Done NONE | Delete => Vector.Continue statements | Keep s => Vector.Continue (s :: statements), SOME o Vector.fromListRev) in case statements of NONE => Block.T {label = label, args = args, statements = Vector.new0 (), transfer = Bug} | SOME statements => let val (stmts, transfer) = simplifyTransfer transfer val statements = Vector.concat [statements, stmts] in Block.T {label = label, args = args, statements = statements, transfer = transfer} end end fun simplifyFunction f = let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f val args = simplifyFormals args val blocks = ref [] val _ = Function.dfs (f, fn block => (List.push (blocks, simplifyBlock block) ; fn () => ())) val returns = Option.map (returns, keepSimplifyTypes) val raises = Option.map (raises, keepSimplifyTypes) in Function.new {args = args, blocks = Vector.fromList (!blocks), mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val globals = Vector.concat [Vector.new1 (Statement.T {var = SOME unitVar, ty = Type.unit, exp = Exp.unit}), Vector.keepAllMap (globals, fn s => case simplifyStatement s of Bugg => Error.bug "SimplifyTypes.globals: bind can't fail" | Delete => NONE | Keep b => SOME b)] val shrink = shrinkFunction {globals = globals} val functions = List.revMap (functions, shrink o simplifyFunction) val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = destroySimplifyType () val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/simplify-types.sig0000644000076600000240000000067611404435623017213 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SIMPLIFY_TYPES_STRUCTS = sig include SHRINK end signature SIMPLIFY_TYPES = sig include SIMPLIFY_TYPES_STRUCTS val simplify: Program.t -> Program.t end mlton-20100608/mlton/ssa/simplify.fun0000644000076600000240000003117311404435623016053 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Simplify (S: SIMPLIFY_STRUCTS): SIMPLIFY = struct open S structure CommonArg = CommonArg (S) structure CommonBlock = CommonBlock (S) structure CommonSubexp = CommonSubexp (S) structure CombineConversions = CombineConversions (S) structure ConstantPropagation = ConstantPropagation (S) structure Contify = Contify (S) structure Flatten = Flatten (S) structure Inline = Inline (S) structure IntroduceLoops = IntroduceLoops (S) structure KnownCase = KnownCase (S) structure LocalFlatten = LocalFlatten (S) structure LocalRef = LocalRef (S) structure LoopInvariant = LoopInvariant (S) structure PolyEqual = PolyEqual (S) structure PolyHash = PolyHash (S) structure Profile = Profile (S) structure Redundant = Redundant (S) structure RedundantTests = RedundantTests (S) structure RemoveUnused = RemoveUnused (S) structure SimplifyTypes = SimplifyTypes (S) structure Useless = Useless (S) type pass = {name: string, doit: Program.t -> Program.t} val ssaPassesDefault = {name = "removeUnused1", doit = RemoveUnused.remove} :: {name = "introduceLoops1", doit = IntroduceLoops.introduceLoops} :: {name = "loopInvariant1", doit = LoopInvariant.loopInvariant} :: {name = "inlineLeaf1", doit = fn p => Inline.inlineLeaf (p, !Control.inlineLeafA)} :: {name = "inlineLeaf2", doit = fn p => Inline.inlineLeaf (p, !Control.inlineLeafB)} :: {name = "contify1", doit = Contify.contify} :: {name = "localFlatten1", doit = LocalFlatten.flatten} :: {name = "constantPropagation", doit = ConstantPropagation.simplify} :: (* useless should run * - after constant propagation because constant propagation makes * slots of tuples that are constant useless *) {name = "useless", doit = Useless.useless} :: {name = "removeUnused2", doit = RemoveUnused.remove} :: {name = "simplifyTypes", doit = SimplifyTypes.simplify} :: (* polyEqual should run * - after types are simplified so that many equals are turned into eqs * - before inlining so that equality functions can be inlined *) {name = "polyEqual", doit = PolyEqual.polyEqual} :: (* polyHash should run * - after types are simplified * - before inlining so that hash functions can be inlined *) {name = "polyHash", doit = PolyHash.polyHash} :: {name = "introduceLoops2", doit = IntroduceLoops.introduceLoops} :: {name = "loopInvariant2", doit = LoopInvariant.loopInvariant} :: {name = "contify2", doit = Contify.contify} :: {name = "inlineNonRecursive", doit = fn p => Inline.inlineNonRecursive (p, !Control.inlineNonRec)} :: {name = "localFlatten2", doit = LocalFlatten.flatten} :: {name = "removeUnused3", doit = RemoveUnused.remove} :: {name = "contify3", doit = Contify.contify} :: {name = "introduceLoops3", doit = IntroduceLoops.introduceLoops} :: {name = "loopInvariant3", doit = LoopInvariant.loopInvariant} :: {name = "localRef", doit = LocalRef.eliminate} :: {name = "flatten", doit = Flatten.flatten} :: {name = "localFlatten3", doit = LocalFlatten.flatten} :: {name = "combineConversions", doit = CombineConversions.combine} :: {name = "commonArg", doit = CommonArg.eliminate} :: {name = "commonSubexp", doit = CommonSubexp.eliminate} :: {name = "commonBlock", doit = CommonBlock.eliminate} :: {name = "redundantTests", doit = RedundantTests.simplify} :: {name = "redundant", doit = Redundant.redundant} :: {name = "knownCase", doit = KnownCase.simplify} :: {name = "removeUnused4", doit = RemoveUnused.remove} :: nil val ssaPassesMinimal = (* polyEqual cannot be omitted. It implements MLton_equal. *) {name = "polyEqual", doit = PolyEqual.polyEqual} :: (* polyHash cannot be omitted. It implements MLton_hash. *) {name = "polyHash", doit = PolyHash.polyHash} :: nil val ssaPasses : pass list ref = ref ssaPassesDefault local type passGen = string -> pass option fun mkSimplePassGen (name, doit): passGen = let val count = Counter.new 1 in fn s => if s = name then SOME {name = concat [name, "#", Int.toString (Counter.next count)], doit = doit} else NONE end val inlinePassGen = let datatype t = Bool of bool | IntOpt of int option val count = Counter.new 1 fun nums s = Exn.withEscape (fn escape => if s = "" then SOME [] else let val l = String.length s in if String.sub (s, 0) = #"(" andalso String.sub (s, l - 1)= #")" then let val s = String.substring2 (s, {start = 1, finish = l - 1}) fun doit s = if s = "true" then Bool true else if s = "false" then Bool false else if s = "inf" then IntOpt NONE else if String.forall (s, Char.isDigit) then IntOpt (Int.fromString s) else escape NONE in case List.map (String.split (s, #","), doit) of l as _::_ => SOME l | _ => NONE end else NONE end) in fn s => if String.hasPrefix (s, {prefix = "inlineNonRecursive"}) then let fun mk (product, small) = SOME {name = concat ["inlineNonRecursive(", Int.toString product, ",", Int.toString small, ")#", Int.toString (Counter.next count)], doit = (fn p => Inline.inlineNonRecursive (p, {small = small, product = product}))} val s = String.dropPrefix (s, String.size "inlineNonRecursive") in case nums s of SOME [IntOpt (SOME product), IntOpt (SOME small)] => mk (product, small) | _ => NONE end else if String.hasPrefix (s, {prefix = "inlineLeaf"}) then let fun mk (loops, repeat, size) = SOME {name = concat ["inlineLeafRepeat(", Bool.toString loops, ",", Bool.toString repeat, ",", Option.toString Int.toString size, ")#", Int.toString (Counter.next count)], doit = (fn p => Inline.inlineLeaf (p, {loops = loops, repeat = repeat, size = size}))} val s = String.dropPrefix (s, String.size "inlineLeaf") in case nums s of SOME [Bool loops, Bool repeat, IntOpt size] => mk (loops, repeat, size) | _ => NONE end else NONE end val passGens = inlinePassGen :: (List.map([("addProfile", Profile.addProfile), ("combineConversions", CombineConversions.combine), ("commonArg", CommonArg.eliminate), ("commonBlock", CommonBlock.eliminate), ("commonSubexp", CommonSubexp.eliminate), ("constantPropagation", ConstantPropagation.simplify), ("contify", Contify.contify), ("dropProfile", Profile.dropProfile), ("flatten", Flatten.flatten), ("introduceLoops", IntroduceLoops.introduceLoops), ("knownCase", KnownCase.simplify), ("localFlatten", LocalFlatten.flatten), ("localRef", LocalRef.eliminate), ("loopInvariant", LoopInvariant.loopInvariant), ("polyEqual", PolyEqual.polyEqual), ("polyHash", PolyHash.polyHash), ("redundant", Redundant.redundant), ("redundantTests", RedundantTests.simplify), ("removeUnused", RemoveUnused.remove), ("simplifyTypes", SimplifyTypes.simplify), ("useless", Useless.useless), ("breakCriticalEdges",fn p => S.breakCriticalEdges (p, {codeMotion = true})), ("eliminateDeadBlocks",S.eliminateDeadBlocks), ("orderFunctions",S.orderFunctions), ("reverseFunctions",S.reverseFunctions), ("shrink", S.shrink)], mkSimplePassGen)) in fun ssaPassesSetCustom s = Exn.withEscape (fn esc => (let val ss = String.split (s, #":") in ssaPasses := List.map(ss, fn s => case (List.peekMap (passGens, fn gen => gen s)) of NONE => esc (Result.No s) | SOME pass => pass) ; Result.Yes () end)) end val ssaPassesString = ref "default" val ssaPassesGet = fn () => !ssaPassesString val ssaPassesSet = fn s => let val _ = ssaPassesString := s in case s of "default" => (ssaPasses := ssaPassesDefault ; Result.Yes ()) | "minimal" => (ssaPasses := ssaPassesMinimal ; Result.Yes ()) | _ => ssaPassesSetCustom s end val _ = List.push (Control.optimizationPasses, {il = "ssa", get = ssaPassesGet, set = ssaPassesSet}) fun pass ({name, doit, midfix}, p) = let val _ = let open Control in maybeSaveToFile ({name = name, suffix = midfix ^ "pre.ssa"}, Control.No, p, Control.Layouts Program.layouts) end val p = Control.passTypeCheck {display = Control.Layouts Program.layouts, name = name, stats = Program.layoutStats, style = Control.No, suffix = midfix ^ "post.ssa", thunk = fn () => doit p, typeCheck = typeCheck} in p end fun maybePass ({name, doit, midfix}, p) = if List.exists (!Control.dropPasses, fn re => Regexp.Compiled.matchesAll (re, name)) then p else pass ({name = name, doit = doit, midfix = midfix}, p) fun simplify p = let fun simplify' n p = let val midfix = if n = 0 then "" else concat [Int.toString n,"."] in if n = !Control.loopPasses then p else simplify' (n + 1) (List.fold (!ssaPasses, p, fn ({name, doit}, p) => maybePass ({name = name, doit = doit, midfix = midfix}, p))) end val p = simplify' 0 p in p end val simplify = fn p => let (* Always want to type check the initial and final SSA * programs, even if type checking is turned off, just * to catch bugs. *) val _ = typeCheck p val p = simplify p val p = if !Control.profile <> Control.ProfileNone andalso !Control.profileIL = Control.ProfileSSA then pass ({name = "addProfile1", doit = Profile.addProfile, midfix = ""}, p) else p val p = maybePass ({name = "orderFunctions1", doit = S.orderFunctions, midfix = ""}, p) val _ = typeCheck p in p end end mlton-20100608/mlton/ssa/simplify.sig0000644000076600000240000000065511404435623016046 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SIMPLIFY_STRUCTS = sig include RESTORE end signature SIMPLIFY = sig include SIMPLIFY_STRUCTS val simplify: Program.t -> Program.t end mlton-20100608/mlton/ssa/simplify2.fun0000644000076600000240000001356611404435623016143 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Simplify2 (S: SIMPLIFY2_STRUCTS): SIMPLIFY2 = struct open S (* structure CommonArg = CommonArg (S) *) (* structure CommonBlock = CommonBlock (S) *) (* structure CommonSubexp = CommonSubexp (S) *) (* structure ConstantPropagation = ConstantPropagation (S) *) (* structure Contify = Contify (S) *) structure DeepFlatten = DeepFlatten (S) (* structure Flatten = Flatten (S) *) (* structure Inline = Inline (S) *) (* structure IntroduceLoops = IntroduceLoops (S) *) (* structure KnownCase = KnownCase (S) *) (* structure LocalFlatten = LocalFlatten (S) *) (* structure LocalRef = LocalRef (S) *) (* structure LoopInvariant = LoopInvariant (S) *) (* structure PolyEqual = PolyEqual (S) *) structure Profile2 = Profile2 (S) (* structure Redundant = Redundant (S) *) (* structure RedundantTests = RedundantTests (S) *) structure RefFlatten = RefFlatten (S) structure RemoveUnused2 = RemoveUnused2 (S) (* structure SimplifyTypes = SimplifyTypes (S) *) (* structure Useless = Useless (S) *) structure Zone = Zone (S) type pass = {name: string, doit: Program.t -> Program.t} val ssa2PassesDefault = {name = "deepFlatten", doit = DeepFlatten.flatten} :: {name = "refFlatten", doit = RefFlatten.flatten} :: {name = "removeUnused5", doit = RemoveUnused2.remove} :: {name = "zone", doit = Zone.zone} :: nil val ssa2PassesMinimal = nil val ssa2Passes : pass list ref = ref ssa2PassesDefault local type passGen = string -> pass option fun mkSimplePassGen (name, doit): passGen = let val count = Counter.new 1 in fn s => if s = name then SOME {name = concat [name, "#", Int.toString (Counter.next count)], doit = doit} else NONE end val passGens = List.map([("addProfile", Profile2.addProfile), ("deepFlatten", DeepFlatten.flatten), ("dropProfile", Profile2.dropProfile), ("refFlatten", RefFlatten.flatten), ("removeUnused", RemoveUnused2.remove), ("zone", Zone.zone), ("eliminateDeadBlocks",S.eliminateDeadBlocks), ("orderFunctions",S.orderFunctions), ("reverseFunctions",S.reverseFunctions), ("shrink", S.shrink)], mkSimplePassGen) in fun ssa2PassesSetCustom s = Exn.withEscape (fn esc => (let val ss = String.split (s, #":") in ssa2Passes := List.map(ss, fn s => case (List.peekMap (passGens, fn gen => gen s)) of NONE => esc (Result.No s) | SOME pass => pass) ; Result.Yes () end)) end val ssa2PassesString = ref "default" val ssa2PassesGet = fn () => !ssa2PassesString val ssa2PassesSet = fn s => let val _ = ssa2PassesString := s in case s of "default" => (ssa2Passes := ssa2PassesDefault ; Result.Yes ()) | "minimal" => (ssa2Passes := ssa2PassesMinimal ; Result.Yes ()) | _ => ssa2PassesSetCustom s end val _ = List.push (Control.optimizationPasses, {il = "ssa2", get = ssa2PassesGet, set = ssa2PassesSet}) fun pass ({name, doit, midfix}, p) = let val _ = let open Control in maybeSaveToFile ({name = name, suffix = midfix ^ "pre.ssa2"}, Control.No, p, Control.Layouts Program.layouts) end val p = Control.passTypeCheck {display = Control.Layouts Program.layouts, name = name, stats = Program.layoutStats, style = Control.No, suffix = midfix ^ "post.ssa2", thunk = fn () => doit p, typeCheck = typeCheck} in p end fun maybePass ({name, doit, midfix}, p) = if List.exists (!Control.dropPasses, fn re => Regexp.Compiled.matchesAll (re, name)) then p else pass ({name = name, doit = doit, midfix = midfix}, p) fun simplify p = let fun simplify' n p = let val midfix = if n = 0 then "" else concat [Int.toString n,"."] in if n = !Control.loopPasses then p else simplify' (n + 1) (List.fold (!ssa2Passes, p, fn ({name, doit}, p) => maybePass ({name = name, doit = doit, midfix = midfix}, p))) end val p = simplify' 0 p in p end val simplify = fn p => let (* Always want to type check the initial and final SSA * programs, even if type checking is turned off, just * to catch bugs. *) val _ = typeCheck p val p = simplify p val p = if !Control.profile <> Control.ProfileNone andalso !Control.profileIL = Control.ProfileSSA2 then pass ({name = "addProfile2", doit = Profile2.addProfile, midfix = ""}, p) else p val p = maybePass ({name = "orderFunctions2", doit = S.orderFunctions, midfix = ""}, p) val _ = typeCheck p in p end end mlton-20100608/mlton/ssa/simplify2.sig0000644000076600000240000000066011404435623016124 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SIMPLIFY2_STRUCTS = sig include SHRINK2 end signature SIMPLIFY2 = sig include SIMPLIFY2_STRUCTS val simplify: Program.t -> Program.t end mlton-20100608/mlton/ssa/sources.cm0000644000076600000240000000367211404435623015514 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature HANDLER signature RETURN signature SSA signature SSA2 functor FlatLattice functor Ssa functor Ssa2 functor SsaToSsa2 is ../atoms/sources.cm ../control/sources.cm ../../lib/mlton/sources.cm equatable.sig equatable.sml ssa-tree.sig ssa-tree2.sig ssa-tree.fun ssa-tree2.fun direct-exp.sig direct-exp.fun analyze.sig analyze2.sig analyze.fun analyze2.fun type-check.sig type-check2.sig type-check.fun type-check2.fun prepasses.sig prepasses2.sig prepasses.fun prepasses2.fun shrink.sig shrink2.sig shrink.fun shrink2.fun flat-lattice.sig flat-lattice.fun n-point-lattice.sig n-point-lattice.fun two-point-lattice.sig two-point-lattice.fun three-point-lattice.sig three-point-lattice.fun common-arg.sig common-arg.fun common-block.sig common-block.fun common-subexp.sig common-subexp.fun global.sig global.fun multi.sig multi.fun combine-conversions.sig combine-conversions.fun constant-propagation.sig constant-propagation.fun contify.sig contify.fun deep-flatten.sig deep-flatten.fun flatten.sig flatten.fun inline.sig inline.fun introduce-loops.sig introduce-loops.fun restore.sig restore.fun known-case.sig known-case.fun local-flatten.sig local-flatten.fun local-ref.sig local-ref.fun loop-invariant.sig loop-invariant.fun poly-equal.sig poly-equal.fun poly-hash.sig poly-hash.fun profile.sig profile.fun profile2.sig profile2.fun redundant-tests.sig redundant-tests.fun redundant.sig redundant.fun ref-flatten.sig ref-flatten.fun remove-unused.sig remove-unused2.sig remove-unused.fun remove-unused2.fun simplify-types.sig simplify-types.fun useless.sig useless.fun zone.sig zone.fun simplify.sig simplify2.sig simplify.fun simplify2.fun ssa.sig ssa2.sig ssa.fun ssa2.fun ssa-to-ssa2.sig ssa-to-ssa2.fun mlton-20100608/mlton/ssa/sources.mlb0000644000076600000240000000452011404435623015660 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb equatable.sig equatable.sml ssa-tree.sig ssa-tree2.sig ssa-tree.fun ssa-tree2.fun direct-exp.sig direct-exp.fun analyze.sig analyze2.sig analyze.fun analyze2.fun type-check.sig type-check2.sig type-check.fun type-check2.fun prepasses.sig prepasses2.sig prepasses.fun prepasses2.fun shrink.sig shrink2.sig shrink.fun shrink2.fun flat-lattice.sig ann "forceUsed" in flat-lattice.fun end n-point-lattice.sig ann "forceUsed" in n-point-lattice.fun end two-point-lattice.sig two-point-lattice.fun three-point-lattice.sig ann "forceUsed" in three-point-lattice.fun end common-arg.sig common-arg.fun common-block.sig common-block.fun common-subexp.sig common-subexp.fun global.sig global.fun multi.sig multi.fun combine-conversions.sig combine-conversions.fun constant-propagation.sig constant-propagation.fun contify.sig contify.fun deep-flatten.sig deep-flatten.fun flatten.sig flatten.fun inline.sig inline.fun introduce-loops.sig introduce-loops.fun restore.sig restore.fun known-case.sig known-case.fun local-flatten.sig local-flatten.fun local-ref.sig local-ref.fun loop-invariant.sig loop-invariant.fun poly-equal.sig poly-equal.fun poly-hash.sig poly-hash.fun profile.sig profile.fun profile2.sig profile2.fun redundant-tests.sig redundant-tests.fun redundant.sig redundant.fun ref-flatten.sig ref-flatten.fun remove-unused.sig remove-unused2.sig remove-unused.fun remove-unused2.fun simplify-types.sig simplify-types.fun useless.sig useless.fun zone.sig zone.fun simplify.sig simplify2.sig simplify.fun simplify2.fun ssa.sig ssa2.sig ssa.fun ssa2.fun ssa-to-ssa2.sig ssa-to-ssa2.fun in signature HANDLER signature RETURN signature SSA signature SSA2 functor FlatLattice functor Ssa functor Ssa2 functor SsaToSsa2 end mlton-20100608/mlton/ssa/ssa-to-ssa2.fun0000644000076600000240000003303711404435623016274 0ustar mtfstaff(* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SsaToSsa2 (S: SSA_TO_SSA2_STRUCTS): SSA_TO_SSA2 = struct open S structure S = Ssa structure S2 = Ssa2 local open S in structure Con = Con structure Label = Label structure Prim = Prim structure Var = Var end local open S2 in structure Base = Base structure Prod = Prod end fun convert (S.Program.T {datatypes, functions, globals, main}) = let val {get = convertType: S.Type.t -> S2.Type.t, ...} = Property.get (S.Type.plist, Property.initRec (fn (t, convertType) => case S.Type.dest t of S.Type.Array t => S2.Type.array1 (convertType t) | S.Type.CPointer => S2.Type.cpointer | S.Type.Datatype tycon => S2.Type.datatypee tycon | S.Type.IntInf => S2.Type.intInf | S.Type.Real s => S2.Type.real s | S.Type.Ref t => S2.Type.reff1 (convertType t) | S.Type.Thread => S2.Type.thread | S.Type.Tuple ts => S2.Type.tuple (Prod.make (Vector.map (ts, fn t => {elt = convertType t, isMutable = false}))) | S.Type.Vector t => S2.Type.vector1 (convertType t) | S.Type.Weak t => S2.Type.weak (convertType t) | S.Type.Word s => S2.Type.word s)) fun convertTypes ts = Vector.map (ts, convertType) val {get = conType: Con.t -> S2.Type.t, set = setConType, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("type", Con.layout)) val datatypes = Vector.map (datatypes, fn S.Datatype.T {cons, tycon} => S2.Datatype.T {cons = Vector.map (cons, fn {args, con} => let val args = Prod.make (Vector.map (args, fn t => {elt = convertType t, isMutable = false})) val () = setConType (con, S2.Type.conApp (con, args)) in {args = args, con = con} end), tycon = tycon}) fun convertPrim p = S.Prim.map (p, convertType) fun convertStatement (S.Statement.T {exp, ty, var}) : S2.Statement.t vector = let val ty = convertType ty fun simple (exp: S2.Exp.t): S2.Statement.t vector = Vector.new1 (S2.Statement.Bind {exp = exp, ty = ty, var = var}) fun maybeBindUnit (stmt: S2.Statement.t): S2.Statement.t vector = case var of NONE => Vector.new1 stmt | SOME _ => Vector.new2 (S2.Statement.Bind {var = var, ty = ty, exp = S2.Exp.unit}, stmt) in case exp of S.Exp.ConApp {args, con} => let val sum = case S2.Type.dest ty of S2.Type.Datatype tycon => tycon | _ => Error.bug "SsaToSsa2.convertStatement: strange ConApp" val variant = Var.newNoname () in Vector.new2 (S2.Statement.Bind {exp = S2.Exp.Object {args = args, con = SOME con}, ty = conType con, var = SOME variant}, S2.Statement.Bind {exp = S2.Exp.Inject {variant = variant, sum = sum}, ty = ty, var = var}) end | S.Exp.Const c => simple (S2.Exp.Const c) | S.Exp.PrimApp {args, prim, ...} => let fun arg i = Vector.sub (args, i) fun sub () = simple (S2.Exp.Select {base = Base.VectorSub {index = arg 1, vector = arg 0}, offset = 0}) datatype z = datatype Prim.Name.t in case Prim.name prim of Array_array0Const => let val zeroVar = Var.newNoname () val zeroTy = S2.Type.word (S2.WordSize.seqIndex ()) val zeroExp = (S2.Exp.Const o S2.Const.word) (S2.WordX.zero (S2.WordSize.seqIndex ())) in Vector.new2 (S2.Statement.Bind {exp = zeroExp, ty = zeroTy, var = SOME zeroVar}, S2.Statement.Bind {exp = S2.Exp.PrimApp {args = Vector.new1 zeroVar, prim = Prim.array}, ty = ty, var = var}) end | Array_sub => sub () | Array_update => maybeBindUnit (S2.Statement.Update {base = Base.VectorSub {index = arg 1, vector = arg 0}, offset = 0, value = arg 2}) | Ref_assign => maybeBindUnit (S2.Statement.Update {base = Base.Object (arg 0), offset = 0, value = arg 1}) | Ref_deref => simple (S2.Exp.Select {base = Base.Object (arg 0), offset = 0}) | Ref_ref => simple (S2.Exp.Object {args = Vector.new1 (arg 0), con = NONE}) | Vector_length => simple (S2.Exp.PrimApp {args = args, prim = Prim.arrayLength}) | Vector_sub => sub () | _ => simple (S2.Exp.PrimApp {args = args, prim = convertPrim prim}) end | S.Exp.Profile e => maybeBindUnit (S2.Statement.Profile e) | S.Exp.Select {offset, tuple} => simple (S2.Exp.Select {base = Base.Object tuple, offset = offset}) | S.Exp.Tuple v => simple (S2.Exp.Object {args = v, con = NONE}) | S.Exp.Var x => simple (S2.Exp.Var x) end val convertStatement = Trace.trace ("SsaToSsa2.convertStatement", S.Statement.layout, Vector.layout S2.Statement.layout) convertStatement fun convertHandler (h: S.Handler.t): S2.Handler.t = case h of S.Handler.Caller => S2.Handler.Caller | S.Handler.Dead => S2.Handler.Dead | S.Handler.Handle l => S2.Handler.Handle l fun convertReturn (r: S.Return.t): S2.Return.t = case r of S.Return.Dead => S2.Return.Dead | S.Return.NonTail {cont, handler} => S2.Return.NonTail {cont = cont, handler = convertHandler handler} | S.Return.Tail => S2.Return.Tail val extraBlocks: S2.Block.t list ref = ref [] fun convertCases (cs: S.Cases.t): S2.Cases.t = case cs of S.Cases.Con v => S2.Cases.Con (Vector.map (v, fn (c, l) => let val objectTy = conType c in case S2.Type.dest objectTy of S2.Type.Object {args, ...} => if Prod.isEmpty args then (c, l) else let val l' = Label.newNoname () val object = Var.newNoname () val (xs, statements) = Vector.unzip (Vector.mapi (Prod.dest args, fn (i, {elt = ty, ...}) => let val x = Var.newNoname () val exp = S2.Exp.Select {base = Base.Object object, offset = i} in (x, S2.Statement.Bind {exp = exp, ty = ty, var = SOME x}) end)) val transfer = S2.Transfer.Goto {args = xs, dst = l} val args = Vector.new1 (object, objectTy) val () = List.push (extraBlocks, S2.Block.T {args = args, label = l', statements = statements, transfer = transfer}) in (c, l') end | _ => Error.bug "SsaToSsa2.convertCases: strange object type" end)) | S.Cases.Word v => S2.Cases.Word v fun convertTransfer (t: S.Transfer.t): S2.Transfer.t = case t of S.Transfer.Arith {args, overflow, prim, success, ty} => S2.Transfer.Arith {args = args, overflow = overflow, prim = convertPrim prim, success = success, ty = convertType ty} | S.Transfer.Bug => S2.Transfer.Bug | S.Transfer.Call {args, func, return} => S2.Transfer.Call {args = args, func = func, return = convertReturn return} | S.Transfer.Case {cases, default, test} => S2.Transfer.Case {cases = convertCases cases, default = default, test = test} | S.Transfer.Goto r => S2.Transfer.Goto r | S.Transfer.Raise v => S2.Transfer.Raise v | S.Transfer.Return v => S2.Transfer.Return v | S.Transfer.Runtime {args, prim, return} => S2.Transfer.Runtime {args = args, prim = convertPrim prim, return = return} fun convertStatements ss = Vector.concatV (Vector.map (ss, convertStatement)) fun convertFormals xts = Vector.map (xts, fn (x, t) => (x, convertType t)) fun convertBlock (S.Block.T {args, label, statements, transfer}) = S2.Block.T {args = convertFormals args, label = label, statements = convertStatements statements, transfer = convertTransfer transfer} val functions = List.map (functions, fn f => let val {args, blocks, mayInline, name, raises, returns, start} = S.Function.dest f fun rr tvo = Option.map (tvo, convertTypes) val blocks = Vector.map (blocks, convertBlock) val blocks = Vector.concat [blocks, Vector.fromList (!extraBlocks)] val () = extraBlocks := [] in S2.Function.new {args = convertFormals args, blocks = blocks, mayInline = mayInline, name = name, raises = rr raises, returns = rr returns, start = start} end) val globals = convertStatements globals val program = S2.Program.T {datatypes = datatypes, functions = functions, globals = globals, main = main} in S2.shrink program end end mlton-20100608/mlton/ssa/ssa-to-ssa2.sig0000644000076600000240000000071611404435623016264 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SSA_TO_SSA2_STRUCTS = sig structure Ssa: SSA structure Ssa2: SSA2 sharing Ssa.Atoms = Ssa2.Atoms end signature SSA_TO_SSA2 = sig include SSA_TO_SSA2_STRUCTS val convert: Ssa.Program.t -> Ssa2.Program.t end mlton-20100608/mlton/ssa/ssa-tree.fun0000644000076600000240000021553511404435623015750 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SsaTree (S: SSA_TREE_STRUCTS): SSA_TREE = struct open S structure Type = struct datatype t = T of {hash: Word.t, plist: PropertyList.t, tree: tree} and tree = Array of t | CPointer | Datatype of Tycon.t | IntInf | Real of RealSize.t | Ref of t | Thread | Tuple of t vector | Vector of t | Weak of t | Word of WordSize.t local fun make f (T r) = f r in val hash = make #hash val plist = make #plist val tree = make #tree end datatype dest = datatype tree val dest = tree fun equals (t, t') = PropertyList.equals (plist t, plist t') local fun make (sel : dest -> 'a option) = let val deOpt: t -> 'a option = fn t => sel (dest t) val de: t -> 'a = valOf o deOpt val is: t -> bool = isSome o deOpt in (deOpt, de, is) end in val (_,deArray,_) = make (fn Array t => SOME t | _ => NONE) val (_,deDatatype,_) = make (fn Datatype tyc => SOME tyc | _ => NONE) val (_,deRef,_) = make (fn Ref t => SOME t | _ => NONE) val (deTupleOpt,deTuple,isTuple) = make (fn Tuple ts => SOME ts | _ => NONE) val (_,deVector,_) = make (fn Vector t => SOME t | _ => NONE) val (_,deWeak,_) = make (fn Weak t => SOME t | _ => NONE) end local val same: tree * tree -> bool = fn (Array t1, Array t2) => equals (t1, t2) | (CPointer, CPointer) => true | (Datatype t1, Datatype t2) => Tycon.equals (t1, t2) | (IntInf, IntInf) => true | (Real s1, Real s2) => RealSize.equals (s1, s2) | (Ref t1, Ref t2) => equals (t1, t2) | (Thread, Thread) => true | (Tuple ts1, Tuple ts2) => Vector.equals (ts1, ts2, equals) | (Vector t1, Vector t2) => equals (t1, t2) | (Weak t1, Weak t2) => equals (t1, t2) | (Word s1, Word s2) => WordSize.equals (s1, s2) | _ => false val table: t HashSet.t = HashSet.new {hash = hash} in fun lookup (hash, tr) = HashSet.lookupOrInsert (table, hash, fn t => same (tr, tree t), fn () => T {hash = hash, plist = PropertyList.new (), tree = tr}) fun stats () = let open Layout in align [seq [str "num types in hash table = ", Int.layout (HashSet.size table)], Control.sizeMessage ("types hash table", lookup)] end end val newHash = Random.word local fun make f : t -> t = let val w = newHash () in fn t => lookup (Word.xorb (w, hash t), f t) end in val array = make Array val reff = make Ref val vector = make Vector val weak = make Weak end val datatypee: Tycon.t -> t = fn t => lookup (Tycon.hash t, Datatype t) val bool = datatypee Tycon.bool local fun make (tycon, tree) = lookup (Tycon.hash tycon, tree) in val cpointer = make (Tycon.cpointer, CPointer) val intInf = make (Tycon.intInf, IntInf) val thread = make (Tycon.thread, Thread) end val real: RealSize.t -> t = fn s => lookup (Tycon.hash (Tycon.real s), Real s) val word: WordSize.t -> t = fn s => lookup (Tycon.hash (Tycon.word s), Word s) local val generator: Word.t = 0wx5555 val w = newHash () in fun tuple ts = if 1 = Vector.length ts then Vector.sub (ts, 0) else lookup (Vector.fold (ts, w, fn (t, w) => Word.xorb (w * generator, hash t)), Tuple ts) end fun ofConst c = let datatype z = datatype Const.t in case c of IntInf _ => intInf | Null => cpointer | Real r => real (RealX.size r) | Word w => word (WordX.size w) | WordVector v => vector (word (WordXVector.elementSize v)) end val unit: t = tuple (Vector.new0 ()) val isUnit: t -> bool = fn t => case deTupleOpt t of SOME ts => Vector.isEmpty ts | _ => false local open Layout in val {get = layout, ...} = Property.get (plist, Property.initRec (fn (t, layout) => case dest t of Array t => seq [layout t, str " array"] | CPointer => str "pointer" | Datatype t => Tycon.layout t | IntInf => str "intInf" | Real s => str (concat ["real", RealSize.toString s]) | Ref t => seq [layout t, str " ref"] | Thread => str "thread" | Tuple ts => if Vector.isEmpty ts then str "unit" else paren (seq (separate (Vector.toListMap (ts, layout), " * "))) | Vector t => seq [layout t, str " vector"] | Weak t => seq [layout t, str " weak"] | Word s => str (concat ["word", WordSize.toString s]))) end fun checkPrimApp {args, prim, result, targs}: bool = let exception BadPrimApp fun default () = Prim.checkApp (prim, {args = args, result = result, targs = targs, typeOps = {array = array, arrow = fn _ => raise BadPrimApp, bool = bool, cpointer = cpointer, equals = equals, exn = unit, intInf = intInf, real = real, reff = reff, thread = thread, unit = unit, vector = vector, weak = weak, word = word}}) val default = fn () => (default ()) handle BadPrimApp => false datatype z = datatype Prim.Name.t in case Prim.name prim of _ => default () end end structure Cases = struct datatype t = Con of (Con.t * Label.t) vector | Word of WordSize.t * (WordX.t * Label.t) vector fun equals (c1: t, c2: t): bool = let fun doit (l1, l2, eq') = Vector.equals (l1, l2, fn ((x1, a1), (x2, a2)) => eq' (x1, x2) andalso Label.equals (a1, a2)) in case (c1, c2) of (Con l1, Con l2) => doit (l1, l2, Con.equals) | (Word (_, l1), Word (_, l2)) => doit (l1, l2, WordX.equals) | _ => false end fun hd (c: t): Label.t = let fun doit v = if Vector.length v >= 1 then let val (_, a) = Vector.sub (v, 0) in a end else Error.bug "SsaTree.Cases.hd" in case c of Con cs => doit cs | Word (_, cs) => doit cs end fun isEmpty (c: t): bool = let fun doit v = 0 = Vector.length v in case c of Con cs => doit cs | Word (_, cs) => doit cs end fun fold (c: t, b, f) = let fun doit l = Vector.fold (l, b, fn ((_, a), b) => f (a, b)) in case c of Con l => doit l | Word (_, l) => doit l end fun map (c: t, f): t = let fun doit l = Vector.map (l, fn (i, x) => (i, f x)) in case c of Con l => Con (doit l) | Word (s, l) => Word (s, doit l) end fun forall (c: t, f: Label.t -> bool): bool = let fun doit l = Vector.forall (l, fn (_, x) => f x) in case c of Con l => doit l | Word (_, l) => doit l end fun length (c: t): int = fold (c, 0, fn (_, i) => i + 1) fun foreach (c, f) = fold (c, (), fn (x, ()) => f x) end local open Layout in fun layoutTuple xs = Vector.layout Var.layout xs end structure Var = struct open Var fun pretty (x, global) = case global x of NONE => toString x | SOME s => s fun prettys (xs: Var.t vector, global: Var.t -> string option) = Layout.toString (Vector.layout (fn x => case global x of NONE => layout x | SOME s => Layout.str s) xs) end structure Exp = struct datatype t = ConApp of {con: Con.t, args: Var.t vector} | Const of Const.t | PrimApp of {prim: Type.t Prim.t, targs: Type.t vector, args: Var.t vector} | Profile of ProfileExp.t | Select of {tuple: Var.t, offset: int} | Tuple of Var.t vector | Var of Var.t val unit = Tuple (Vector.new0 ()) fun foreachVar (e, v) = let fun vs xs = Vector.foreach (xs, v) in case e of ConApp {args, ...} => vs args | Const _ => () | PrimApp {args, ...} => vs args | Profile _ => () | Select {tuple, ...} => v tuple | Tuple xs => vs xs | Var x => v x end fun replaceVar (e, fx) = let fun fxs xs = Vector.map (xs, fx) in case e of ConApp {con, args} => ConApp {con = con, args = fxs args} | Const _ => e | PrimApp {prim, targs, args} => PrimApp {prim = prim, targs = targs, args = fxs args} | Profile _ => e | Select {tuple, offset} => Select {tuple = fx tuple, offset = offset} | Tuple xs => Tuple (fxs xs) | Var x => Var (fx x) end fun layout e = let open Layout in case e of ConApp {con, args} => seq [Con.layout con, str " ", layoutTuple args] | Const c => Const.layout c | PrimApp {prim, targs, args} => seq [Prim.layout prim, if !Control.showTypes then if 0 = Vector.length targs then empty else Vector.layout Type.layout targs else empty, seq [str " ", layoutTuple args]] | Profile p => ProfileExp.layout p | Select {tuple, offset} => seq [str "#", Int.layout offset, str " ", Var.layout tuple] | Tuple xs => layoutTuple xs | Var x => Var.layout x end fun maySideEffect (e: t): bool = case e of ConApp _ => false | Const _ => false | PrimApp {prim,...} => Prim.maySideEffect prim | Profile _ => false | Select _ => false | Tuple _ => false | Var _ => false fun varsEquals (xs, xs') = Vector.equals (xs, xs', Var.equals) fun equals (e: t, e': t): bool = case (e, e') of (ConApp {con, args}, ConApp {con = con', args = args'}) => Con.equals (con, con') andalso varsEquals (args, args') | (Const c, Const c') => Const.equals (c, c') | (PrimApp {prim, args, ...}, PrimApp {prim = prim', args = args', ...}) => Prim.equals (prim, prim') andalso varsEquals (args, args') | (Profile p, Profile p') => ProfileExp.equals (p, p') | (Select {tuple = t, offset = i}, Select {tuple = t', offset = i'}) => Var.equals (t, t') andalso i = i' | (Tuple xs, Tuple xs') => varsEquals (xs, xs') | (Var x, Var x') => Var.equals (x, x') | _ => false local val newHash = Random.word val primApp = newHash () val profile = newHash () val select = newHash () val tuple = newHash () fun hashVars (xs: Var.t vector, w: Word.t): Word.t = Vector.fold (xs, w, fn (x, w) => Word.xorb (w, Var.hash x)) in val hash: t -> Word.t = fn ConApp {con, args, ...} => hashVars (args, Con.hash con) | Const c => Const.hash c | PrimApp {args, ...} => hashVars (args, primApp) | Profile p => Word.xorb (profile, ProfileExp.hash p) | Select {tuple, offset} => Word.xorb (select, Var.hash tuple + Word.fromInt offset) | Tuple xs => hashVars (xs, tuple) | Var x => Var.hash x end val hash = Trace.trace ("SsaTree.Exp.hash", layout, Word.layout) hash fun toPretty (e: t, global: Var.t -> string option): string = case e of ConApp {con, args} => concat [Con.toString con, " ", Var.prettys (args, global)] | Const c => Const.toString c | PrimApp {prim, args, ...} => Layout.toString (Prim.layoutApp (prim, args, fn x => case global x of NONE => Var.layout x | SOME s => Layout.str s)) | Profile p => ProfileExp.toString p | Select {tuple, offset} => concat ["#", Int.toString offset, " ", Var.toString tuple] | Tuple xs => Var.prettys (xs, global) | Var x => Var.toString x end datatype z = datatype Exp.t structure Statement = struct datatype t = T of {var: Var.t option, ty: Type.t, exp: Exp.t} local fun make f (T r) = f r in val var = make #var val exp = make #exp end fun layout (T {var, ty, exp}) = let open Layout in seq [seq [case var of NONE => empty | SOME var => seq [Var.layout var, if !Control.showTypes then seq [str ": ", Type.layout ty] else empty, str " = "]], Exp.layout exp] end local fun make f x = T {var = NONE, ty = Type.unit, exp = f x} in val profile = make Exp.Profile end fun clear s = Option.app (var s, Var.clear) fun prettifyGlobals (v: t vector): Var.t -> string option = let val {get = global: Var.t -> string option, set = setGlobal, ...} = Property.getSet (Var.plist, Property.initConst NONE) val _ = Vector.foreach (v, fn T {var, exp, ...} => Option.app (var, fn var => let fun set s = let val maxSize = 10 val s = if String.size s > maxSize then concat [String.prefix (s, maxSize), "..."] else s in setGlobal (var, SOME s) end in case exp of Const c => set (Layout.toString (Const.layout c)) | ConApp {con, args, ...} => if Vector.isEmpty args then set (Con.toString con) else set (concat [Con.toString con, "(...)"]) | _ => () end)) in global end end structure Handler = struct structure Label = Label datatype t = Caller | Dead | Handle of Label.t fun layout (h: t): Layout.t = let open Layout in case h of Caller => str "Caller" | Dead => str "Dead" | Handle l => seq [str "Handle ", Label.layout l] end val equals = fn (Caller, Caller) => true | (Dead, Dead) => true | (Handle l, Handle l') => Label.equals (l, l') | _ => false fun foldLabel (h: t, a: 'a, f: Label.t * 'a -> 'a): 'a = case h of Caller => a | Dead => a | Handle l => f (l, a) fun foreachLabel (h, f) = foldLabel (h, (), f o #1) fun map (h, f) = case h of Caller => Caller | Dead => Dead | Handle l => Handle (f l) local val newHash = Random.word val caller = newHash () val dead = newHash () val handlee = newHash () in fun hash (h: t): word = case h of Caller => caller | Dead => dead | Handle l => Word.xorb (handlee, Label.hash l) end end structure Return = struct structure Label = Label structure Handler = Handler datatype t = Dead | NonTail of {cont: Label.t, handler: Handler.t} | Tail fun layout r = let open Layout in case r of Dead => str "Dead" | NonTail {cont, handler} => seq [str "NonTail ", Layout.record [("cont", Label.layout cont), ("handler", Handler.layout handler)]] | Tail => str "Tail" end fun equals (r, r'): bool = case (r, r') of (Dead, Dead) => true | (NonTail {cont = c, handler = h}, NonTail {cont = c', handler = h'}) => Label.equals (c, c') andalso Handler.equals (h, h') | (Tail, Tail) => true | _ => false fun foldLabel (r: t, a, f) = case r of Dead => a | NonTail {cont, handler} => Handler.foldLabel (handler, f (cont, a), f) | Tail => a fun foreachLabel (r, f) = foldLabel (r, (), f o #1) fun foreachHandler (r, f) = case r of Dead => () | NonTail {handler, ...} => Handler.foreachLabel (handler, f) | Tail => () fun map (r, f) = case r of Dead => Dead | NonTail {cont, handler} => NonTail {cont = f cont, handler = Handler.map (handler, f)} | Tail => Tail fun compose (r, r') = case r' of Dead => Dead | NonTail {cont, handler} => NonTail {cont = cont, handler = (case handler of Handler.Caller => (case r of Dead => Handler.Caller | NonTail {handler, ...} => handler | Tail => Handler.Caller) | Handler.Dead => handler | Handler.Handle _ => handler)} | Tail => r local val newHash = Random.word val dead = newHash () val nonTail = newHash () val tail = newHash () in fun hash r = case r of Dead => dead | NonTail {cont, handler} => Word.xorb (Word.xorb (nonTail, Label.hash cont), Handler.hash handler) | Tail => tail end end structure Transfer = struct datatype t = Arith of {prim: Type.t Prim.t, args: Var.t vector, overflow: Label.t, (* Must be nullary. *) success: Label.t, (* Must be unary. *) ty: Type.t} | Bug (* MLton thought control couldn't reach here. *) | Call of {args: Var.t vector, func: Func.t, return: Return.t} | Case of {test: Var.t, cases: Cases.t, default: Label.t option} (* Must be nullary. *) | Goto of {dst: Label.t, args: Var.t vector} | Raise of Var.t vector | Return of Var.t vector | Runtime of {prim: Type.t Prim.t, args: Var.t vector, return: Label.t} (* Must be nullary. *) fun foreachFuncLabelVar (t, func: Func.t -> unit, label: Label.t -> unit, var) = let fun vars xs = Vector.foreach (xs, var) in case t of Arith {args, overflow, success, ...} => (vars args ; label overflow ; label success) | Bug => () | Call {func = f, args, return, ...} => (func f ; Return.foreachLabel (return, label) ; vars args) | Case {test, cases, default, ...} => (var test ; Cases.foreach (cases, label) ; Option.app (default, label)) | Goto {dst, args, ...} => (vars args; label dst) | Raise xs => vars xs | Return xs => vars xs | Runtime {args, return, ...} => (vars args ; label return) end fun foreachFunc (t, func) = foreachFuncLabelVar (t, func, fn _ => (), fn _ => ()) fun foreachLabelVar (t, label, var) = foreachFuncLabelVar (t, fn _ => (), label, var) fun foreachLabel (t, j) = foreachLabelVar (t, j, fn _ => ()) fun foreachVar (t, v) = foreachLabelVar (t, fn _ => (), v) fun replaceLabelVar (t, fl, fx) = let fun fxs xs = Vector.map (xs, fx) in case t of Arith {prim, args, overflow, success, ty} => Arith {prim = prim, args = fxs args, overflow = fl overflow, success = fl success, ty = ty} | Bug => Bug | Call {func, args, return} => Call {func = func, args = fxs args, return = Return.map (return, fl)} | Case {test, cases, default} => Case {test = fx test, cases = Cases.map(cases, fl), default = Option.map(default, fl)} | Goto {dst, args} => Goto {dst = fl dst, args = fxs args} | Raise xs => Raise (fxs xs) | Return xs => Return (fxs xs) | Runtime {prim, args, return} => Runtime {prim = prim, args = fxs args, return = fl return} end fun replaceLabel (t, f) = replaceLabelVar (t, f, fn x => x) fun replaceVar (t, f) = replaceLabelVar (t, fn l => l, f) local open Layout in fun layoutCase {test, cases, default} = let fun doit (l, layout) = Vector.toListMap (l, fn (i, l) => seq [layout i, str " => ", Label.layout l]) datatype z = datatype Cases.t val cases = case cases of Con l => doit (l, Con.layout) | Word (_, l) => doit (l, WordX.layout) val cases = case default of NONE => cases | SOME j => cases @ [seq [str "_ => ", Label.layout j]] in align [seq [str "case ", Var.layout test, str " of"], indent (alignPrefix (cases, "| "), 2)] end val layout = fn Arith {prim, args, overflow, success, ...} => seq [Label.layout success, str " ", tuple [Prim.layoutApp (prim, args, Var.layout)], str " Overflow => ", Label.layout overflow, str " ()"] | Bug => str "Bug" | Call {func, args, return} => seq [Func.layout func, str " ", layoutTuple args, str " ", Return.layout return] | Case arg => layoutCase arg | Goto {dst, args} => seq [Label.layout dst, str " ", layoutTuple args] | Raise xs => seq [str "raise ", layoutTuple xs] | Return xs => seq [str "return ", if 1 = Vector.length xs then Var.layout (Vector.sub (xs, 0)) else layoutTuple xs] | Runtime {prim, args, return} => seq [Label.layout return, str " ", tuple [Prim.layoutApp (prim, args, Var.layout)]] end fun varsEquals (xs, xs') = Vector.equals (xs, xs', Var.equals) fun equals (e: t, e': t): bool = case (e, e') of (Arith {prim, args, overflow, success, ...}, Arith {prim = prim', args = args', overflow = overflow', success = success', ...}) => Prim.equals (prim, prim') andalso varsEquals (args, args') andalso Label.equals (overflow, overflow') andalso Label.equals (success, success') | (Bug, Bug) => true | (Call {func, args, return}, Call {func = func', args = args', return = return'}) => Func.equals (func, func') andalso varsEquals (args, args') andalso Return.equals (return, return') | (Case {test, cases, default}, Case {test = test', cases = cases', default = default'}) => Var.equals (test, test') andalso Cases.equals (cases, cases') andalso Option.equals (default, default', Label.equals) | (Goto {dst, args}, Goto {dst = dst', args = args'}) => Label.equals (dst, dst') andalso varsEquals (args, args') | (Raise xs, Raise xs') => varsEquals (xs, xs') | (Return xs, Return xs') => varsEquals (xs, xs') | (Runtime {prim, args, return}, Runtime {prim = prim', args = args', return = return'}) => Prim.equals (prim, prim') andalso varsEquals (args, args') andalso Label.equals (return, return') | _ => false local val newHash = Random.word val bug = newHash () val raisee = newHash () val return = newHash () fun hashVars (xs: Var.t vector, w: Word.t): Word.t = Vector.fold (xs, w, fn (x, w) => Word.xorb (w, Var.hash x)) fun hash2 (w1: Word.t, w2: Word.t) = Word.xorb (w1, w2) in val hash: t -> Word.t = fn Arith {args, overflow, success, ...} => hashVars (args, hash2 (Label.hash overflow, Label.hash success)) | Bug => bug | Call {func, args, return} => hashVars (args, hash2 (Func.hash func, Return.hash return)) | Case {test, cases, default} => hash2 (Var.hash test, Cases.fold (cases, Option.fold (default, 0wx55555555, fn (l, w) => hash2 (Label.hash l, w)), fn (l, w) => hash2 (Label.hash l, w))) | Goto {dst, args} => hashVars (args, Label.hash dst) | Raise xs => hashVars (xs, raisee) | Return xs => hashVars (xs, return) | Runtime {args, return, ...} => hashVars (args, Label.hash return) end val hash = Trace.trace ("SsaTree.Transfer.hash", layout, Word.layout) hash end datatype z = datatype Transfer.t local open Layout in fun layoutFormals (xts: (Var.t * Type.t) vector) = Vector.layout (fn (x, t) => seq [Var.layout x, if !Control.showTypes then seq [str ": ", Type.layout t] else empty]) xts end structure Block = struct datatype t = T of {args: (Var.t * Type.t) vector, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} local fun make f (T r) = f r in val args = make #args val label = make #label val statements = make #statements val transfer = make #transfer end fun layout (T {label, args, statements, transfer}) = let open Layout in align [seq [Label.layout label, str " ", Vector.layout (fn (x, t) => if !Control.showTypes then seq [Var.layout x, str ": ", Type.layout t] else Var.layout x) args], indent (align [align (Vector.toListMap (statements, Statement.layout)), Transfer.layout transfer], 2)] end fun clear (T {label, args, statements, ...}) = (Label.clear label ; Vector.foreach (args, Var.clear o #1) ; Vector.foreach (statements, Statement.clear)) end structure Datatype = struct datatype t = T of { tycon: Tycon.t, cons: {con: Con.t, args: Type.t vector} vector } fun layout (T {tycon, cons}) = let open Layout in seq [Tycon.layout tycon, str " = ", alignPrefix (Vector.toListMap (cons, fn {con, args} => seq [Con.layout con, if Vector.isEmpty args then empty else seq [str " of ", Vector.layout Type.layout args]]), "| ")] end fun clear (T {tycon, cons}) = (Tycon.clear tycon ; Vector.foreach (cons, Con.clear o #con)) end structure Function = struct structure CPromise = ClearablePromise type dest = {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* There is a messy interaction between the laziness used in controlFlow * and the property lists on labels because the former stores * stuff on the property lists. So, if you force the laziness, then * clear the property lists, then try to use the lazy stuff, you will * get screwed with undefined properties. The right thing to do is reset * the laziness when the properties are cleared. *) datatype t = T of {controlFlow: {dfsTree: unit -> Block.t Tree.t, dominatorTree: unit -> Block.t Tree.t, graph: unit DirectedGraph.t, labelNode: Label.t -> unit DirectedGraph.Node.t, nodeBlock: unit DirectedGraph.Node.t -> Block.t} CPromise.t, dest: dest} local fun make f (T {dest, ...}) = f dest in val blocks = make #blocks val dest = make (fn d => d) val mayInline = make #mayInline val name = make #name end fun foreachVar (f: t, fx: Var.t * Type.t -> unit): unit = let val {args, blocks, ...} = dest f val _ = Vector.foreach (args, fx) val _ = Vector.foreach (blocks, fn Block.T {args, statements, ...} => (Vector.foreach (args, fx) ; Vector.foreach (statements, fn Statement.T {var, ty, ...} => Option.app (var, fn x => fx (x, ty))))) in () end fun controlFlow (T {controlFlow, ...}) = let val {graph, labelNode, nodeBlock, ...} = CPromise.force controlFlow in {graph = graph, labelNode = labelNode, nodeBlock = nodeBlock} end local fun make sel = fn T {controlFlow, ...} => sel (CPromise.force controlFlow) () in val dominatorTree = make #dominatorTree end fun dfs (f, v) = let val {blocks, start, ...} = dest f val numBlocks = Vector.length blocks val {get = labelIndex, set = setLabelIndex, rem, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val visited = Array.array (numBlocks, false) fun visit (l: Label.t): unit = let val i = labelIndex l in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val b as Block.T {transfer, ...} = Vector.sub (blocks, i) val v' = v b val _ = Transfer.foreachLabel (transfer, visit) val _ = v' () in () end end val _ = visit start val _ = Vector.foreach (blocks, rem o Block.label) in () end local structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge in fun determineControlFlow ({blocks, start, ...}: dest) = let open Dot val g = Graph.new () fun newNode () = Graph.newNode g val {get = labelNode, ...} = Property.get (Label.plist, Property.initFun (fn _ => newNode ())) val {get = nodeInfo: unit Node.t -> {block: Block.t}, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("info", Node.layout)) val _ = Vector.foreach (blocks, fn b as Block.T {label, transfer, ...} => let val from = labelNode label val _ = setNodeInfo (from, {block = b}) val _ = Transfer.foreachLabel (transfer, fn to => (ignore o Graph.addEdge) (g, {from = from, to = labelNode to})) in () end) val root = labelNode start val dfsTree = Promise.lazy (fn () => Graph.dfsTree (g, {root = root, nodeValue = #block o nodeInfo})) val dominatorTree = Promise.lazy (fn () => Graph.dominatorTree (g, {root = root, nodeValue = #block o nodeInfo})) in {dfsTree = dfsTree, dominatorTree = dominatorTree, graph = g, labelNode = labelNode, nodeBlock = #block o nodeInfo} end fun layoutDot (f, global: Var.t -> string option) = let val {name, start, blocks, ...} = dest f fun makeName (name: string, formals: (Var.t * Type.t) vector): string = concat [name, " ", let open Layout in toString (vector (Vector.map (formals, fn (var, ty) => if !Control.showTypes then seq [Var.layout var, str ": ", Type.layout ty] else Var.layout var))) end] open Dot val graph = Graph.new () val {get = nodeOptions, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref [])) fun setNodeText (n: unit Node.t, l): unit = List.push (nodeOptions n, NodeOption.Label l) fun newNode () = Graph.newNode graph val {destroy, get = labelNode} = Property.destGet (Label.plist, Property.initFun (fn _ => newNode ())) val {get = edgeOptions, set = setEdgeOptions, ...} = Property.getSetOnce (Edge.plist, Property.initConst []) val _ = Vector.foreach (blocks, fn Block.T {label, args, statements, transfer} => let val from = labelNode label fun edge (to: Label.t, label: string, style: style): unit = let val e = Graph.addEdge (graph, {from = from, to = labelNode to}) val _ = setEdgeOptions (e, [EdgeOption.label label, EdgeOption.Style style]) in () end val rest = case transfer of Arith {prim, args, overflow, success, ...} => (edge (success, "", Solid) ; edge (overflow, "Overflow", Dashed) ; [Layout.toString (Prim.layoutApp (prim, args, fn x => Layout.str (Var.pretty (x, global))))]) | Bug => ["bug"] | Call {func, args, return} => let val f = Func.toString func val args = Var.prettys (args, global) val _ = case return of Return.Dead => () | Return.NonTail {cont, handler} => (edge (cont, "", Dotted) ; (Handler.foreachLabel (handler, fn l => edge (l, "", Dashed)))) | Return.Tail => () in [f, " ", args] end | Case {test, cases, default, ...} => let fun doit (v, toString) = Vector.foreach (v, fn (x, j) => edge (j, toString x, Solid)) val _ = case cases of Cases.Con v => doit (v, Con.toString) | Cases.Word (_, v) => doit (v, WordX.toString) val _ = case default of NONE => () | SOME j => edge (j, "default", Solid) in ["case ", Var.toString test] end | Goto {dst, args} => (edge (dst, "", Solid) ; [Label.toString dst, " ", Var.prettys (args, global)]) | Raise xs => ["raise ", Var.prettys (xs, global)] | Return xs => ["return ", Var.prettys (xs, global)] | Runtime {prim, args, return} => (edge (return, "", Solid) ; [Layout.toString (Prim.layoutApp (prim, args, fn x => Layout.str (Var.pretty (x, global))))]) val lab = Vector.foldr (statements, [(concat rest, Left)], fn (Statement.T {var, ty, exp, ...}, ac) => let val exp = Exp.toPretty (exp, global) val s = if Type.isUnit ty then exp else case var of NONE => exp | SOME var => concat [Var.toString var, if !Control.showTypes then concat [": ", Layout.toString (Type.layout ty)] else "", " = ", exp] in (s, Left) :: ac end) val name = makeName (Label.toString label, args) val _ = setNodeText (from, (name, Left) :: lab) in () end) val root = labelNode start val graphLayout = Graph.layoutDot (graph, fn {nodeName} => {title = concat [Func.toString name, " control-flow graph"], options = [GraphOption.Rank (Min, [{nodeName = nodeName root}])], edgeOptions = edgeOptions, nodeOptions = fn n => let val l = ! (nodeOptions n) open NodeOption in FontColor Black :: Shape Box :: l end}) fun treeLayout () = let val {get = nodeOptions, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initConst []) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setNodeOptions (labelNode label, [NodeOption.label (Label.toString label)])) val treeLayout = Tree.layoutDot (Graph.dominatorTree (graph, {root = root, nodeValue = fn n => n}), {title = concat [Func.toString name, " dominator tree"], options = [], nodeOptions = nodeOptions}) in treeLayout end (* fun loopForestLayout () = let val {get = nodeName, set = setNodeName, ...} = Property.getSetOnce (Node.plist, Property.initConst "") val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setNodeName (labelNode label, Label.toString label)) val loopForestLayout = Graph.LoopForest.layoutDot (Graph.loopForestSteensgaard (graph, {root = root}), {title = concat [Func.toString name, " loop forest"], options = [], nodeName = nodeName}) in loopForestLayout end *) in {destroy = destroy, graph = graphLayout, tree = treeLayout} end end fun new (dest: dest) = let val controlFlow = CPromise.delay (fn () => determineControlFlow dest) in T {controlFlow = controlFlow, dest = dest} end fun clear (T {controlFlow, dest, ...}) = let val {args, blocks, ...} = dest val _ = (Vector.foreach (args, Var.clear o #1) ; Vector.foreach (blocks, Block.clear)) val _ = CPromise.clear controlFlow in () end fun layoutHeader (f: t): Layout.t = let val {args, name, raises, returns, start, ...} = dest f open Layout in seq [str "fun ", Func.layout name, str " ", layoutFormals args, if !Control.showTypes then seq [str ": ", record [("raises", Option.layout (Vector.layout Type.layout) raises), ("returns", Option.layout (Vector.layout Type.layout) returns)]] else empty, str " = ", Label.layout start, str " ()"] end fun layout (f: t) = let val {blocks, ...} = dest f open Layout in align [layoutHeader f, indent (align (Vector.toListMap (blocks, Block.layout)), 2)] end fun layouts (f: t, global, output: Layout.t -> unit): unit = let val {blocks, name, ...} = dest f val _ = output (layoutHeader f) val _ = Vector.foreach (blocks, fn b => output (Layout.indent (Block.layout b, 2))) val _ = if not (!Control.keepDot) then () else let val {destroy, graph, tree} = layoutDot (f, global) val name = Func.toString name fun doit (s, g) = let open Control in saveToFile ({suffix = concat [name, ".", s, ".dot"]}, Dot, (), Layout (fn () => g)) end val _ = doit ("cfg", graph) handle _ => Error.warning "SsaTree.layouts: couldn't layout cfg" val _ = doit ("dom", tree ()) handle _ => Error.warning "SsaTree.layouts: couldn't layout dom" (* val _ = doit ("lf", loopForest ()) handle _ => Error.warning "SsaTree.layouts: couldn't layout lf" *) val () = destroy () in () end in () end fun alphaRename f = let local fun make (new, plist) = let val {get, set, destroy, ...} = Property.destGetSetOnce (plist, Property.initConst NONE) fun bind x = let val x' = new x val _ = set (x, SOME x') in x' end fun lookup x = case get x of NONE => x | SOME y => y in (bind, lookup, destroy) end in val (bindVar, lookupVar, destroyVar) = make (Var.new, Var.plist) val (bindLabel, lookupLabel, destroyLabel) = make (Label.new, Label.plist) end val {args, blocks, mayInline, name, raises, returns, start, ...} = dest f val args = Vector.map (args, fn (x, ty) => (bindVar x, ty)) val bindLabel = ignore o bindLabel val bindVar = ignore o bindVar val _ = Vector.foreach (blocks, fn Block.T {label, args, statements, ...} => (bindLabel label ; Vector.foreach (args, fn (x, _) => bindVar x) ; Vector.foreach (statements, fn Statement.T {var, ...} => Option.app (var, bindVar)))) val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => Block.T {label = lookupLabel label, args = Vector.map (args, fn (x, ty) => (lookupVar x, ty)), statements = Vector.map (statements, fn Statement.T {var, ty, exp} => Statement.T {var = Option.map (var, lookupVar), ty = ty, exp = Exp.replaceVar (exp, lookupVar)}), transfer = Transfer.replaceLabelVar (transfer, lookupLabel, lookupVar)}) val start = lookupLabel start val _ = destroyVar () val _ = destroyLabel () in new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun profile (f: t, sourceInfo): t = if !Control.profile = Control.ProfileNone orelse !Control.profileIL <> Control.ProfileSource then f else let val _ = Control.diagnostic (fn () => layout f) val {args, blocks, mayInline, name, raises, returns, start} = dest f val extraBlocks = ref [] val {get = labelBlock, set = setLabelBlock, rem} = Property.getSetOnce (Label.plist, Property.initRaise ("block", Label.layout)) val _ = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelBlock (label, block)) val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let fun make (exp: Exp.t): Statement.t = Statement.T {exp = exp, ty = Type.unit, var = NONE} val statements = if Label.equals (label, start) then (Vector.concat [Vector.new1 (make (Exp.Profile (ProfileExp.Enter sourceInfo))), statements]) else statements fun leave () = make (Exp.Profile (ProfileExp.Leave sourceInfo)) fun prefix (l: Label.t, statements: Statement.t vector): Label.t = let val Block.T {args, ...} = labelBlock l val c = Label.newNoname () val xs = Vector.map (args, fn (x, _) => Var.new x) val _ = List.push (extraBlocks, Block.T {args = Vector.map2 (xs, args, fn (x, (_, t)) => (x, t)), label = c, statements = statements, transfer = Goto {args = xs, dst = l}}) in c end fun genHandler (cont: Label.t) : Statement.t vector * Label.t * Handler.t = case raises of NONE => (statements, cont, Handler.Caller) | SOME ts => let val xs = Vector.map (ts, fn _ => Var.newNoname ()) val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = Vector.zip (xs, ts), label = l, statements = Vector.new1 (leave ()), transfer = Transfer.Raise xs}) in (statements, prefix (cont, Vector.new0 ()), Handler.Handle l) end fun addLeave () = (Vector.concat [statements, Vector.new1 (leave ())], transfer) val (statements, transfer) = case transfer of Call {args, func, return} => let datatype z = datatype Return.t in case return of Dead => (statements, transfer) | NonTail {cont, handler} => (case handler of Handler.Dead => (statements, transfer) | Handler.Caller => let val (statements, cont, handler) = genHandler cont val return = Return.NonTail {cont = cont, handler = handler} in (statements, Call {args = args, func = func, return = return}) end | Handler.Handle _ => (statements, transfer)) | Tail => addLeave () end | Raise _ => addLeave () | Return _ => addLeave () | _ => (statements, transfer) in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) val _ = Vector.foreach (blocks, rem o Block.label) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] val f = new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val _ = Control.diagnostic (fn () => layout f) in f end val profile = Trace.trace2 ("SsaTree.Function.profile", layout, SourceInfo.layout, layout) profile end structure Program = struct datatype t = T of { datatypes: Datatype.t vector, globals: Statement.t vector, functions: Function.t list, main: Func.t } end structure Program = struct open Program local structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge in fun layoutCallGraph (T {functions, main, ...}, title: string): Layout.t = let open Dot val graph = Graph.new () val {get = nodeOptions, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("options", Node.layout)) val {get = funcNode, destroy} = Property.destGet (Func.plist, Property.initFun (fn f => let val n = Graph.newNode graph val _ = setNodeOptions (n, let open NodeOption in [FontColor Black, label (Func.toString f)] end) in n end)) val {get = edgeOptions, set = setEdgeOptions, ...} = Property.getSetOnce (Edge.plist, Property.initConst []) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val from = funcNode name val {get, destroy} = Property.destGet (Node.plist, Property.initFun (fn _ => {nontail = ref false, tail = ref false})) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, return, ...} => let val to = funcNode func val {tail, nontail} = get to datatype z = datatype Return.t val is = case return of Dead => false | NonTail _ => true | Tail => false val r = if is then nontail else tail in if !r then () else (r := true ; (setEdgeOptions (Graph.addEdge (graph, {from = from, to = to}), if is then [] else [EdgeOption.Style Dotted]))) end | _ => ()) val _ = destroy () in () end) val root = funcNode main val l = Graph.layoutDot (graph, fn {nodeName} => {title = title, options = [GraphOption.Rank (Min, [{nodeName = nodeName root}])], edgeOptions = edgeOptions, nodeOptions = nodeOptions}) val _ = destroy () in l end end fun layouts (p as T {datatypes, globals, functions, main}, output': Layout.t -> unit) = let val global = Statement.prettifyGlobals globals open Layout (* Layout includes an output function, so we need to rebind output * to the one above. *) val output = output' in output (str "\n\nDatatypes:") ; Vector.foreach (datatypes, output o Datatype.layout) ; output (str "\n\nGlobals:") ; Vector.foreach (globals, output o Statement.layout) ; output (seq [str "\n\nMain: ", Func.layout main]) ; output (str "\n\nFunctions:") ; List.foreach (functions, fn f => Function.layouts (f, global, output)) ; if not (!Control.keepDot) then () else let open Control in saveToFile ({suffix = "call-graph.dot"}, Dot, (), Layout (fn () => layoutCallGraph (p, !Control.inputFile))) end end fun layoutStats (T {datatypes, globals, functions, main, ...}) = let val (mainNumVars, mainNumBlocks) = case List.peek (functions, fn f => Func.equals (main, Function.name f)) of NONE => Error.bug "SsaTree.Program.layoutStats: no main" | SOME f => let val numVars = ref 0 val _ = Function.foreachVar (f, fn _ => Int.inc numVars) val {blocks, ...} = Function.dest f val numBlocks = Vector.length blocks in (!numVars, numBlocks) end val numTypes = ref 0 val {get = countType, destroy} = Property.destGet (Type.plist, Property.initRec (fn (t, countType) => let datatype z = datatype Type.dest val _ = case Type.dest t of Array t => countType t | CPointer => () | Datatype _ => () | IntInf => () | Real _ => () | Ref t => countType t | Thread => () | Tuple ts => Vector.foreach (ts, countType) | Vector t => countType t | Weak t => countType t | Word _ => () val _ = Int.inc numTypes in () end)) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {args, ...} => Vector.foreach (args, countType))) val numStatements = ref (Vector.length globals) val numBlocks = ref 0 val _ = List.foreach (functions, fn f => let val {args, blocks, ...} = Function.dest f val _ = Vector.foreach (args, countType o #2) val _ = Vector.foreach (blocks, fn Block.T {args, statements, ...} => let val _ = Int.inc numBlocks val _ = Vector.foreach (args, countType o #2) val _ = Vector.foreach (statements, fn Statement.T {ty, ...} => let val _ = Int.inc numStatements val _ = countType ty in () end) in () end) in () end) val numFunctions = List.length functions val _ = destroy () open Layout in align [seq [str "num vars in main = ", Int.layout mainNumVars], seq [str "num blocks in main = ", Int.layout mainNumBlocks], seq [str "num functions in program = ", Int.layout numFunctions], seq [str "num blocks in program = ", Int.layout (!numBlocks)], seq [str "num statements in program = ", Int.layout (!numStatements)], seq [str "num types in program = ", Int.layout (!numTypes)], Type.stats ()] end (* clear all property lists reachable from program *) fun clear (T {datatypes, globals, functions, ...}) = ((* Can't do Type.clear because it clears out the info needed for * Type.dest. *) Vector.foreach (datatypes, Datatype.clear) ; Vector.foreach (globals, Statement.clear) ; List.foreach (functions, Function.clear)) fun clearGlobals (T {globals, ...}) = Vector.foreach (globals, Statement.clear) fun clearTop (p as T {datatypes, functions, ...}) = (Vector.foreach (datatypes, Datatype.clear) ; List.foreach (functions, Func.clear o Function.name) ; clearGlobals p) fun foreachVar (T {globals, functions, ...}, f) = (Vector.foreach (globals, fn Statement.T {var, ty, ...} => f (valOf var, ty)) ; List.foreach (functions, fn g => Function.foreachVar (g, f))) fun foreachPrim (T {globals, functions, ...}, f) = let fun loopStatement (Statement.T {exp, ...}) = case exp of PrimApp {prim, ...} => f prim | _ => () fun loopTransfer t = case t of Arith {prim, ...} => f prim | Runtime {prim, ...} => f prim | _ => () val _ = Vector.foreach (globals, loopStatement) val _ = List.foreach (functions, fn f => Vector.foreach (Function.blocks f, fn Block.T {statements, transfer, ...} => (Vector.foreach (statements, loopStatement); loopTransfer transfer))) in () end fun hasPrim (p, f) = Exn.withEscape (fn escape => (foreachPrim (p, fn prim => if f prim then escape true else ()) ; false)) fun mainFunction (T {functions, main, ...}) = case List.peek (functions, fn f => Func.equals (main, Function.name f)) of NONE => Error.bug "SsaTree.Program.mainFunction: no main function" | SOME f => f fun dfs (p, v) = let val T {functions, main, ...} = p val functions = Vector.fromList functions val numFunctions = Vector.length functions val {get = funcIndex, set = setFuncIndex, rem, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("index", Func.layout)) val _ = Vector.foreachi (functions, fn (i, f) => setFuncIndex (#name (Function.dest f), i)) val visited = Array.array (numFunctions, false) fun visit (f: Func.t): unit = let val i = funcIndex f in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val f = Vector.sub (functions, i) val v' = v f val _ = Function.dfs (f, fn Block.T {transfer, ...} => (Transfer.foreachFunc (transfer, visit) ; fn () => ())) val _ = v' () in () end end val _ = visit main val _ = Vector.foreach (functions, rem o Function.name) in () end end end mlton-20100608/mlton/ssa/ssa-tree.sig0000644000076600000240000002366711404435623015745 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SSA_TREE_STRUCTS = sig include ATOMS end signature HANDLER = sig structure Label: LABEL datatype t = Caller | Dead | Handle of Label.t val equals: t * t -> bool val foldLabel: t * 'a * (Label.t * 'a -> 'a) -> 'a val foreachLabel: t * (Label.t -> unit) -> unit val layout: t -> Layout.t val map: t * (Label.t -> Label.t) -> t end signature RETURN = sig structure Label: LABEL structure Handler: HANDLER sharing Label = Handler.Label datatype t = Dead | NonTail of {cont: Label.t, handler: Handler.t} | Tail val compose: t * t -> t val foldLabel: t * 'a * (Label.t * 'a -> 'a) -> 'a val foreachHandler: t * (Label.t -> unit) -> unit val foreachLabel: t * (Label.t -> unit) -> unit val layout: t -> Layout.t val map: t * (Label.t -> Label.t) -> t end signature SSA_TREE = sig include SSA_TREE_STRUCTS structure Type: sig type t datatype dest = Array of t | CPointer | Datatype of Tycon.t | IntInf | Real of RealSize.t | Ref of t | Thread | Tuple of t vector | Vector of t | Weak of t | Word of WordSize.t val array: t -> t val bool: t val checkPrimApp: {targs: t vector, args: t vector, prim: t Prim.t, result: t} -> bool val cpointer: t val datatypee: Tycon.t -> t val dest: t -> dest val deArray: t -> t val deDatatype: t -> Tycon.t val deRef: t -> t val deTuple: t -> t vector val deTupleOpt: t -> t vector option val deVector: t -> t val deWeak: t -> t val equals: t * t -> bool val hash: t -> word val intInf: t val isTuple: t -> bool val isUnit: t -> bool val layout: t -> Layout.t val ofConst: Const.t -> t val plist: t -> PropertyList.t val real: RealSize.t -> t val reff: t -> t val thread: t val tuple: t vector -> t val vector: t -> t val weak: t -> t val word: WordSize.t -> t val unit: t end structure Exp: sig datatype t = ConApp of {args: Var.t vector, con: Con.t} | Const of Const.t | PrimApp of {args: Var.t vector, prim: Type.t Prim.t, targs: Type.t vector} | Profile of ProfileExp.t | Select of {offset: int, tuple: Var.t} | Tuple of Var.t vector | Var of Var.t val equals: t * t -> bool val foreachVar: t * (Var.t -> unit) -> unit val hash: t -> Word.t val layout: t -> Layout.t val maySideEffect: t -> bool val replaceVar: t * (Var.t -> Var.t) -> t val unit: t end structure Statement: sig datatype t = T of {exp: Exp.t, ty: Type.t, var: Var.t option} val clear: t -> unit (* clear the var *) val exp: t -> Exp.t val layout: t -> Layout.t val prettifyGlobals: t vector -> (Var.t -> string option) val profile: ProfileExp.t -> t val var: t -> Var.t option end structure Cases: sig datatype t = Con of (Con.t * Label.t) vector | Word of WordSize.t * (WordX.t * Label.t) vector val forall: t * (Label.t -> bool) -> bool val foreach: t * (Label.t -> unit) -> unit val hd: t -> Label.t val isEmpty: t -> bool val length: t -> int val map: t * (Label.t -> Label.t) -> t end structure Handler: HANDLER sharing Handler.Label = Label structure Return: RETURN sharing Return.Handler = Handler structure Transfer: sig datatype t = Arith of {args: Var.t vector, overflow: Label.t, (* Must be nullary. *) prim: Type.t Prim.t, success: Label.t, (* Must be unary. *) ty: Type.t} (* int or word *) | Bug (* MLton thought control couldn't reach here. *) | Call of {args: Var.t vector, func: Func.t, return: Return.t} | Case of {cases: Cases.t, default: Label.t option, (* Must be nullary. *) test: Var.t} | Goto of {args: Var.t vector, dst: Label.t} (* Raise implicitly raises to the caller. * I.E. the local handler stack must be empty. *) | Raise of Var.t vector | Return of Var.t vector | Runtime of {args: Var.t vector, prim: Type.t Prim.t, return: Label.t} (* Must be nullary. *) val equals: t * t -> bool val foreachFunc : t * (Func.t -> unit) -> unit val foreachLabel: t * (Label.t -> unit) -> unit val foreachLabelVar: t * (Label.t -> unit) * (Var.t -> unit) -> unit val foreachVar: t * (Var.t -> unit) -> unit val hash: t -> Word.t val layout: t -> Layout.t val replaceLabelVar: t * (Label.t -> Label.t) * (Var.t -> Var.t) -> t val replaceLabel: t * (Label.t -> Label.t) -> t val replaceVar: t * (Var.t -> Var.t) -> t end structure Block: sig datatype t = T of {args: (Var.t * Type.t) vector, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} val args: t -> (Var.t * Type.t) vector val clear: t -> unit val label: t -> Label.t val layout: t -> Layout.t val statements: t -> Statement.t vector val transfer: t -> Transfer.t end structure Datatype: sig datatype t = T of {cons: {args: Type.t vector, con: Con.t} vector, tycon: Tycon.t} val layout: t -> Layout.t end structure Function: sig type t val alphaRename: t -> t val blocks: t -> Block.t vector (* clear the plists for all bound variables and labels that appear * in the function, but not the function name's plist. *) val clear: t -> unit val controlFlow: t -> {graph: unit DirectedGraph.t, labelNode: Label.t -> unit DirectedGraph.Node.t, nodeBlock: unit DirectedGraph.Node.t -> Block.t} val dest: t -> {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* dfs (f, v) visits the blocks in depth-first order, applying v b * for block b to yield v', then visiting b's descendents, * then applying v' (). *) val dfs: t * (Block.t -> unit -> unit) -> unit val dominatorTree: t -> Block.t Tree.t val foreachVar: t * (Var.t * Type.t -> unit) -> unit val layout: t -> Layout.t val layoutDot: t * (Var.t -> string option) -> {destroy: unit -> unit, graph: Layout.t, tree: unit -> Layout.t} val mayInline: t -> bool val name: t -> Func.t val new: {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} -> t val profile: t * SourceInfo.t -> t end structure Program: sig datatype t = T of {datatypes: Datatype.t vector, functions: Function.t list, globals: Statement.t vector, main: Func.t (* Must be nullary. *)} val clear: t -> unit val clearTop: t -> unit (* dfs (p, v) visits the functions in depth-first order, applying v f * for function f to yield v', then visiting f's descendents, * then applying v' (). *) val dfs: t * (Function.t -> unit -> unit) -> unit val foreachPrim: t * (Type.t Prim.t -> unit) -> unit val foreachVar: t * (Var.t * Type.t -> unit) -> unit val hasPrim: t * (Type.t Prim.t -> bool) -> bool val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t val mainFunction: t -> Function.t end end mlton-20100608/mlton/ssa/ssa-tree2.fun0000644000076600000240000023521111404435623016023 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SsaTree2 (S: SSA_TREE2_STRUCTS): SSA_TREE2 = struct open S structure Prod = struct datatype 'a t = T of {elt: 'a, isMutable: bool} vector fun dest (T p) = p val make = T fun empty () = T (Vector.new0 ()) fun fold (p, b, f) = Vector.fold (dest p, b, fn ({elt, ...}, b) => f (elt, b)) fun foreach (p, f) = Vector.foreach (dest p, f o #elt) fun isEmpty p = Vector.isEmpty (dest p) fun isMutable (T v) = Vector.exists (v, #isMutable) fun sub (T p, i) = Vector.sub (p, i) fun elt (p, i) = #elt (sub (p, i)) fun length p = Vector.length (dest p) val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool = fn (p1, p2, equals) => Vector.equals (dest p1, dest p2, fn ({elt = e1, isMutable = m1}, {elt = e2, isMutable = m2}) => m1 = m2 andalso equals (e1, e2)) local open Layout in fun layout (p, layout) = paren (#1 (Tycon.layoutApp (Tycon.tuple, Vector.map (dest p, fn {elt, isMutable} => let val lay = if isMutable then seq [layout elt, str " ref"] else layout elt in (lay, ({isChar = false}, Tycon.BindingStrength.unit)) end)))) end val map: 'a t * ('a -> 'b) -> 'b t = fn (p, f) => make (Vector.map (dest p, fn {elt, isMutable} => {elt = f elt, isMutable = isMutable})) val keepAllMap: 'a t * ('a -> 'b option) -> 'b t = fn (p, f) => make (Vector.keepAllMap (dest p, fn {elt, isMutable} => Option.map (f elt, fn elt => {elt = elt, isMutable = isMutable}))) end structure ObjectCon = struct datatype t = Con of Con.t | Tuple | Vector val equals: t * t -> bool = fn (Con c, Con c') => Con.equals (c, c') | (Tuple, Tuple) => true | (Vector, Vector) => true | _ => false val isVector: t -> bool = fn Vector => true | _ => false val layout: t -> Layout.t = fn oc => let open Layout in case oc of Con c => Con.layout c | Tuple => str "Tuple" | Vector => str "Vector" end end datatype z = datatype ObjectCon.t structure Type = struct datatype t = T of {hash: Word.t, plist: PropertyList.t, tree: tree} and tree = CPointer | Datatype of Tycon.t | IntInf | Object of {args: t Prod.t, con: ObjectCon.t} | Real of RealSize.t | Thread | Weak of t | Word of WordSize.t local fun make f (T r) = f r in val hash = make #hash val plist = make #plist val tree = make #tree end datatype dest = datatype tree val dest = tree fun equals (t, t') = PropertyList.equals (plist t, plist t') val deVectorOpt: t -> t Prod.t option = fn t => case dest t of Object {args, con = Vector} => SOME args | _ => NONE val isVector: t -> bool = isSome o deVectorOpt val deWeakOpt: t -> t option = fn t => case dest t of Weak t => SOME t | _ => NONE val deWeak: t -> t = valOf o deWeakOpt local val same: tree * tree -> bool = fn (CPointer, CPointer) => true | (Datatype t1, Datatype t2) => Tycon.equals (t1, t2) | (IntInf, IntInf) => true | (Object {args = a1, con = c1}, Object {args = a2, con = c2}) => ObjectCon.equals (c1, c2) andalso Prod.equals (a1, a2, equals) | (Real s1, Real s2) => RealSize.equals (s1, s2) | (Thread, Thread) => true | (Weak t1, Weak t2) => equals (t1, t2) | (Word s1, Word s2) => WordSize.equals (s1, s2) | _ => false val table: t HashSet.t = HashSet.new {hash = hash} in fun lookup (hash, tr) = HashSet.lookupOrInsert (table, hash, fn t => same (tr, tree t), fn () => T {hash = hash, plist = PropertyList.new (), tree = tr}) fun stats () = let open Layout in align [seq [str "num types in hash table = ", Int.layout (HashSet.size table)], Control.sizeMessage ("types hash table", lookup)] end end val newHash = Random.word local fun make f : t -> t = let val w = newHash () in fn t => lookup (Word.xorb (w, hash t), f t) end in val weak = make Weak end val datatypee: Tycon.t -> t = fn t => lookup (Tycon.hash t, Datatype t) val bool = datatypee Tycon.bool local fun make (tycon, tree) = lookup (Tycon.hash tycon, tree) in val cpointer = make (Tycon.cpointer, CPointer) val intInf = make (Tycon.intInf, IntInf) val thread = make (Tycon.thread, Thread) end val real: RealSize.t -> t = fn s => lookup (Tycon.hash (Tycon.real s), Real s) val word: WordSize.t -> t = fn s => lookup (Tycon.hash (Tycon.word s), Word s) local val generator: Word.t = 0wx5555 val tuple = newHash () val vector = newHash () fun hashProd (p, base) = Vector.fold (Prod.dest p, base, fn ({elt, ...}, w) => Word.xorb (w * generator, hash elt)) in fun object {args, con}: t = let val base = case con of Con c => Con.hash c | Tuple => tuple | Vector => vector val hash = hashProd (args, base) in lookup (hash, Object {args = args, con = con}) end end fun vector p = object {args = p, con = Vector} local fun make isMutable t = vector (Prod.make (Vector.new1 {elt = t, isMutable = isMutable})) in val array1 = make true val vector1 = make false end fun ofConst c = let datatype z = datatype Const.t in case c of IntInf _ => intInf | Null => cpointer | Real r => real (RealX.size r) | Word w => word (WordX.size w) | WordVector v => vector1 (word (WordXVector.elementSize v)) end fun conApp (con, args) = object {args = args, con = Con con} fun tuple ts = object {args = ts, con = Tuple} fun reff1 t = object {args = Prod.make (Vector.new1 {elt = t, isMutable = true}), con = Tuple} val unit: t = tuple (Prod.empty ()) val isUnit: t -> bool = fn t => case dest t of Object {args, con = Tuple} => Prod.isEmpty args | _ => false local open Layout in val {get = layout, ...} = Property.get (plist, Property.initRec (fn (t, layout) => case dest t of CPointer => str "cpointer" | Datatype t => Tycon.layout t | IntInf => str "intInf" | Object {args, con} => if isUnit t then str "unit" else let val args = Prod.layout (args, layout) in case con of Con c => seq [Con.layout c, str " of ", args] | Tuple => args | Vector => seq [args, str " vector"] end | Real s => str (concat ["real", RealSize.toString s]) | Thread => str "thread" | Weak t => seq [layout t, str " weak"] | Word s => str (concat ["word", WordSize.toString s]))) end fun checkPrimApp {args, prim, result}: bool = let exception BadPrimApp fun default () = let val targs = Prim.extractTargs (prim, {args = args, result = result, typeOps = {deArray = fn _ => raise BadPrimApp, deArrow = fn _ => raise BadPrimApp, deRef = fn _ => raise BadPrimApp, deVector = fn _ => raise BadPrimApp, deWeak = deWeak}}) in Prim.checkApp (prim, {args = args, result = result, targs = targs, typeOps = {array = array1, arrow = fn _ => raise BadPrimApp, bool = bool, cpointer = cpointer, equals = equals, exn = unit, intInf = intInf, real = real, reff = fn _ => raise BadPrimApp, thread = thread, unit = unit, vector = vector1, weak = weak, word = word}}) end val default = fn () => (default ()) handle BadPrimApp => false datatype z = datatype Prim.Name.t fun arg i = Vector.sub (args, i) fun oneArg f = 1 = Vector.length args andalso f (arg 0) val seqIndex = word (WordSize.seqIndex ()) in case Prim.name prim of Array_array => oneArg (fn n => equals (n, seqIndex) andalso isVector result) | Array_length => oneArg (fn a => isVector a andalso equals (result, seqIndex)) | Array_toVector => oneArg (fn a => case (deVectorOpt a, deVectorOpt result) of (SOME ap, SOME vp) => Vector.equals (Prod.dest ap, Prod.dest vp, fn ({elt = ae, isMutable = ai}, {elt = ve, isMutable = vi}) => (not vi orelse ai) andalso equals (ae, ve)) | _ => false) | _ => default () end end structure Cases = struct datatype t = Con of (Con.t * Label.t) vector | Word of WordSize.t * (WordX.t * Label.t) vector fun equals (c1: t, c2: t): bool = let fun doit (l1, l2, eq') = Vector.equals (l1, l2, fn ((x1, a1), (x2, a2)) => eq' (x1, x2) andalso Label.equals (a1, a2)) in case (c1, c2) of (Con l1, Con l2) => doit (l1, l2, Con.equals) | (Word (_, l1), Word (_, l2)) => doit (l1, l2, WordX.equals) | _ => false end fun hd (c: t): Label.t = let fun doit v = if Vector.length v >= 1 then let val (_, a) = Vector.sub (v, 0) in a end else Error.bug "SsaTree2.Cases.hd" in case c of Con cs => doit cs | Word (_, cs) => doit cs end fun isEmpty (c: t): bool = let fun doit v = 0 = Vector.length v in case c of Con cs => doit cs | Word (_, cs) => doit cs end fun fold (c: t, b, f) = let fun doit l = Vector.fold (l, b, fn ((_, a), b) => f (a, b)) in case c of Con l => doit l | Word (_, l) => doit l end fun map (c: t, f): t = let fun doit l = Vector.map (l, fn (i, x) => (i, f x)) in case c of Con l => Con (doit l) | Word (s, l) => Word (s, doit l) end fun forall (c: t, f: Label.t -> bool): bool = let fun doit l = Vector.forall (l, fn (_, x) => f x) in case c of Con l => doit l | Word (_, l) => doit l end fun foreach (c, f) = fold (c, (), fn (x, ()) => f x) end local open Layout in fun layoutTuple xs = Vector.layout Var.layout xs end structure Var = struct open Var fun pretty (x, global) = case global x of NONE => toString x | SOME s => s fun prettys (xs: Var.t vector, global: Var.t -> string option) = Layout.toString (Vector.layout (fn x => case global x of NONE => layout x | SOME s => Layout.str s) xs) end structure Base = struct datatype 'a t = Object of 'a | VectorSub of {index: 'a, vector: 'a} fun layout (b: 'a t, layoutX: 'a -> Layout.t): Layout.t = let open Layout in case b of Object x => layoutX x | VectorSub {index, vector} => seq [layoutX vector, str "[", layoutX index, str "]"] end val equals: 'a t * 'a t * ('a * 'a -> bool) -> bool = fn (b1, b2, equalsX) => case (b1, b2) of (Object x1, Object x2) => equalsX (x1, x2) | (VectorSub {index = i1, vector = v1}, VectorSub {index = i2, vector = v2}) => equalsX (i1, i2) andalso equalsX (v1, v2) | _ => false fun object (b: 'a t): 'a = case b of Object x => x | VectorSub {vector = x, ...} => x local val newHash = Random.word val object = newHash () val vectorSub = newHash () in val hash: 'a t * ('a -> word) -> word = fn (b, hashX) => case b of Object x => Word.xorb (object, hashX x) | VectorSub {index, vector} => Word.xorb (Word.xorb (hashX index, hashX vector), vectorSub) end fun foreach (b: 'a t, f: 'a -> unit): unit = case b of Object x => f x | VectorSub {index, vector} => (f index; f vector) fun map (b: 'a t, f: 'a -> 'b): 'b t = case b of Object x => Object (f x) | VectorSub {index, vector} => VectorSub {index = f index, vector = f vector} end structure Exp = struct datatype t = Const of Const.t | Inject of {sum: Tycon.t, variant: Var.t} | Object of {con: Con.t option, args: Var.t vector} | PrimApp of {prim: Type.t Prim.t, args: Var.t vector} | Select of {base: Var.t Base.t, offset: int} | Var of Var.t val unit = Object {con = NONE, args = Vector.new0 ()} fun foreachVar (e, v) = let fun vs xs = Vector.foreach (xs, v) in case e of Const _ => () | Inject {variant, ...} => v variant | Object {args, ...} => vs args | PrimApp {args, ...} => vs args | Select {base, ...} => Base.foreach (base, v) | Var x => v x end fun replaceVar (e, fx) = let fun fxs xs = Vector.map (xs, fx) in case e of Const _ => e | Inject {sum, variant} => Inject {sum = sum, variant = fx variant} | Object {con, args} => Object {con = con, args = fxs args} | PrimApp {prim, args} => PrimApp {args = fxs args, prim = prim} | Select {base, offset} => Select {base = Base.map (base, fx), offset = offset} | Var x => Var (fx x) end fun layout' (e, layoutVar) = let open Layout in case e of Const c => Const.layout c | Inject {sum, variant} => seq [layoutVar variant, str ": ", Tycon.layout sum] | Object {con, args} => seq [(case con of NONE => empty | SOME c => seq [Con.layout c, str " "]), layoutTuple args] | PrimApp {args, prim} => seq [Prim.layout prim, seq [str " ", layoutTuple args]] | Select {base, offset} => seq [str "#", Int.layout offset, str " ", Base.layout (base, layoutVar)] | Var x => layoutVar x end fun layout e = layout' (e, Var.layout) fun toPretty (e, global: Var.t -> string option): string = Layout.toString (layout' (e, fn x => case global x of NONE => Var.layout x | SOME s => Layout.str s)) fun maySideEffect (e: t): bool = case e of Const _ => false | Inject _ => false | Object _ => false | PrimApp {prim,...} => Prim.maySideEffect prim | Select _ => false | Var _ => false fun varsEquals (xs, xs') = Vector.equals (xs, xs', Var.equals) fun equals (e: t, e': t): bool = case (e, e') of (Const c, Const c') => Const.equals (c, c') | (Object {con, args}, Object {con = con', args = args'}) => Option.equals (con, con', Con.equals) andalso varsEquals (args, args') | (PrimApp {prim, args, ...}, PrimApp {prim = prim', args = args', ...}) => Prim.equals (prim, prim') andalso varsEquals (args, args') | (Select {base = b1, offset = i1}, Select {base = b2, offset = i2}) => Base.equals (b1, b2, Var.equals) andalso i1 = i2 | (Var x, Var x') => Var.equals (x, x') | _ => false (* quell unused warning *) val _ = equals local val newHash = Random.word val inject = newHash () val primApp = newHash () val select = newHash () val tuple = newHash () fun hashVars (xs: Var.t vector, w: Word.t): Word.t = Vector.fold (xs, w, fn (x, w) => Word.xorb (w, Var.hash x)) in val hash: t -> Word.t = fn Const c => Const.hash c | Inject {sum, variant} => Word.xorb (inject, Word.xorb (Tycon.hash sum, Var.hash variant)) | Object {con, args, ...} => hashVars (args, case con of NONE => tuple | SOME c => Con.hash c) | PrimApp {args, ...} => hashVars (args, primApp) | Select {base, offset} => Word.xorb (select, Base.hash (base, Var.hash) + Word.fromInt offset) | Var x => Var.hash x end (* quell unused warning *) val _ = hash end datatype z = datatype Exp.t structure Statement = struct datatype t = Bind of {var: Var.t option, ty: Type.t, exp: Exp.t} | Profile of ProfileExp.t | Update of {base: Var.t Base.t, offset: int, value: Var.t} fun layout' (s: t, layoutVar): Layout.t = let open Layout in case s of Bind {var, ty, exp} => seq [seq [case var of NONE => empty | SOME var => seq [Var.layout var, if !Control.showTypes then seq [str ": ", Type.layout ty] else empty, str " = "]], Exp.layout' (exp, layoutVar)] | Profile p => ProfileExp.layout p | Update {base, offset, value} => seq [(if 0 = offset then empty else seq [str "#", Int.layout offset, str " "]), Base.layout (base, layoutVar), str " := ", layoutVar value] end fun layout s = layout' (s, Var.layout) fun toPretty (s: t, global: Var.t -> string option): string = Layout.toString (layout' (s, fn x => case global x of NONE => Var.layout x | SOME s => Layout.str s)) val profile = Profile fun foreachDef (s: t, f: Var.t * Type.t -> unit): unit = case s of Bind {ty, var, ...} => Option.app (var, fn x => f (x, ty)) | _ => () fun clear s = foreachDef (s, Var.clear o #1) fun prettifyGlobals (v: t vector): Var.t -> string option = let val {get = global: Var.t -> string option, set = setGlobal, ...} = Property.getSet (Var.plist, Property.initConst NONE) val _ = Vector.foreach (v, fn s => case s of Bind {var, exp, ...} => Option.app (var, fn var => let fun set s = let val maxSize = 10 val s = if String.size s > maxSize then concat [String.prefix (s, maxSize), "..."] else s in setGlobal (var, SOME s) end in case exp of Const c => set (Layout.toString (Const.layout c)) | Object {con, args, ...} => (case con of NONE => () | SOME c => set (if Vector.isEmpty args then Con.toString c else concat [Con.toString c, "(...)"])) | _ => () end) | _ => ()) in global end fun foreachUse (s: t, f: Var.t -> unit): unit = case s of Bind {exp, ...} => Exp.foreachVar (exp, f) | Profile _ => () | Update {base, value, ...} => (Base.foreach (base, f); f value) fun replaceDefsUses (s: t, {def: Var.t -> Var.t, use: Var.t -> Var.t}): t = case s of Bind {exp, ty, var} => Bind {exp = Exp.replaceVar (exp, use), ty = ty, var = Option.map (var, def)} | Profile _ => s | Update {base, offset, value} => Update {base = Base.map (base, use), offset = offset, value = use value} fun replaceUses (s, f) = replaceDefsUses (s, {def = fn x => x, use = f}) end datatype z = datatype Statement.t structure Handler = struct structure Label = Label datatype t = Caller | Dead | Handle of Label.t fun layout (h: t): Layout.t = let open Layout in case h of Caller => str "Caller" | Dead => str "Dead" | Handle l => seq [str "Handle ", Label.layout l] end val equals = fn (Caller, Caller) => true | (Dead, Dead) => true | (Handle l, Handle l') => Label.equals (l, l') | _ => false fun foldLabel (h: t, a: 'a, f: Label.t * 'a -> 'a): 'a = case h of Caller => a | Dead => a | Handle l => f (l, a) fun foreachLabel (h, f) = foldLabel (h, (), f o #1) fun map (h, f) = case h of Caller => Caller | Dead => Dead | Handle l => Handle (f l) local val newHash = Random.word val caller = newHash () val dead = newHash () val handlee = newHash () in fun hash (h: t): word = case h of Caller => caller | Dead => dead | Handle l => Word.xorb (handlee, Label.hash l) end end structure Return = struct structure Label = Label structure Handler = Handler datatype t = Dead | NonTail of {cont: Label.t, handler: Handler.t} | Tail fun layout r = let open Layout in case r of Dead => str "Dead" | NonTail {cont, handler} => seq [str "NonTail ", Layout.record [("cont", Label.layout cont), ("handler", Handler.layout handler)]] | Tail => str "Tail" end fun equals (r, r'): bool = case (r, r') of (Dead, Dead) => true | (NonTail {cont = c, handler = h}, NonTail {cont = c', handler = h'}) => Label.equals (c, c') andalso Handler.equals (h, h') | (Tail, Tail) => true | _ => false fun foldLabel (r: t, a, f) = case r of Dead => a | NonTail {cont, handler} => Handler.foldLabel (handler, f (cont, a), f) | Tail => a fun foreachLabel (r, f) = foldLabel (r, (), f o #1) fun foreachHandler (r, f) = case r of Dead => () | NonTail {handler, ...} => Handler.foreachLabel (handler, f) | Tail => () fun map (r, f) = case r of Dead => Dead | NonTail {cont, handler} => NonTail {cont = f cont, handler = Handler.map (handler, f)} | Tail => Tail fun compose (r, r') = case r' of Dead => Dead | NonTail {cont, handler} => NonTail {cont = cont, handler = (case handler of Handler.Caller => (case r of Dead => Handler.Caller | NonTail {handler, ...} => handler | Tail => Handler.Caller) | Handler.Dead => handler | Handler.Handle _ => handler)} | Tail => r (* quell unused warning *) val _ = compose local val newHash = Random.word val dead = newHash () val nonTail = newHash () val tail = newHash () in fun hash r = case r of Dead => dead | NonTail {cont, handler} => Word.xorb (Word.xorb (nonTail, Label.hash cont), Handler.hash handler) | Tail => tail end end structure Transfer = struct datatype t = Arith of {prim: Type.t Prim.t, args: Var.t vector, overflow: Label.t, (* Must be nullary. *) success: Label.t, (* Must be unary. *) ty: Type.t} | Bug (* MLton thought control couldn't reach here. *) | Call of {args: Var.t vector, func: Func.t, return: Return.t} | Case of {test: Var.t, cases: Cases.t, default: Label.t option} (* Must be nullary. *) | Goto of {dst: Label.t, args: Var.t vector} | Raise of Var.t vector | Return of Var.t vector | Runtime of {prim: Type.t Prim.t, args: Var.t vector, return: Label.t} (* Must be nullary. *) fun foreachFuncLabelVar (t, func: Func.t -> unit, label: Label.t -> unit, var) = let fun vars xs = Vector.foreach (xs, var) in case t of Arith {args, overflow, success, ...} => (vars args ; label overflow ; label success) | Bug => () | Call {func = f, args, return, ...} => (func f ; Return.foreachLabel (return, label) ; vars args) | Case {test, cases, default, ...} => (var test ; Cases.foreach (cases, label) ; Option.app (default, label)) | Goto {dst, args, ...} => (vars args; label dst) | Raise xs => vars xs | Return xs => vars xs | Runtime {args, return, ...} => (vars args ; label return) end fun foreachFunc (t, func) = foreachFuncLabelVar (t, func, fn _ => (), fn _ => ()) (* quell unused warning *) val _ = foreachFunc fun foreachLabelVar (t, label, var) = foreachFuncLabelVar (t, fn _ => (), label, var) fun foreachLabel (t, j) = foreachLabelVar (t, j, fn _ => ()) fun foreachVar (t, v) = foreachLabelVar (t, fn _ => (), v) fun replaceLabelVar (t, fl, fx) = let fun fxs xs = Vector.map (xs, fx) in case t of Arith {prim, args, overflow, success, ty} => Arith {prim = prim, args = fxs args, overflow = fl overflow, success = fl success, ty = ty} | Bug => Bug | Call {func, args, return} => Call {func = func, args = fxs args, return = Return.map (return, fl)} | Case {test, cases, default} => Case {test = fx test, cases = Cases.map(cases, fl), default = Option.map(default, fl)} | Goto {dst, args} => Goto {dst = fl dst, args = fxs args} | Raise xs => Raise (fxs xs) | Return xs => Return (fxs xs) | Runtime {prim, args, return} => Runtime {prim = prim, args = fxs args, return = fl return} end fun replaceLabel (t, f) = replaceLabelVar (t, f, fn x => x) (* quell unused warning *) val _ = replaceLabel fun replaceVar (t, f) = replaceLabelVar (t, fn l => l, f) local open Layout in fun layoutCase {test, cases, default} = let fun doit (l, layout) = Vector.toListMap (l, fn (i, l) => seq [layout i, str " => ", Label.layout l]) datatype z = datatype Cases.t val cases = case cases of Con l => doit (l, Con.layout) | Word (_, l) => doit (l, WordX.layout) val cases = case default of NONE => cases | SOME j => cases @ [seq [str "_ => ", Label.layout j]] in align [seq [str "case ", Var.layout test, str " of"], indent (alignPrefix (cases, "| "), 2)] end val layout = fn Arith {prim, args, overflow, success, ...} => seq [Label.layout success, str " ", tuple [Prim.layoutApp (prim, args, Var.layout)], str " Overflow => ", Label.layout overflow, str " ()"] | Bug => str "Bug" | Call {func, args, return} => seq [Func.layout func, str " ", layoutTuple args, str " ", Return.layout return] | Case arg => layoutCase arg | Goto {dst, args} => seq [Label.layout dst, str " ", layoutTuple args] | Raise xs => seq [str "raise ", layoutTuple xs] | Return xs => seq [str "return ", if 1 = Vector.length xs then Var.layout (Vector.sub (xs, 0)) else layoutTuple xs] | Runtime {prim, args, return} => seq [Label.layout return, str " ", tuple [Prim.layoutApp (prim, args, Var.layout)]] end fun varsEquals (xs, xs') = Vector.equals (xs, xs', Var.equals) fun equals (e: t, e': t): bool = case (e, e') of (Arith {prim, args, overflow, success, ...}, Arith {prim = prim', args = args', overflow = overflow', success = success', ...}) => Prim.equals (prim, prim') andalso varsEquals (args, args') andalso Label.equals (overflow, overflow') andalso Label.equals (success, success') | (Bug, Bug) => true | (Call {func, args, return}, Call {func = func', args = args', return = return'}) => Func.equals (func, func') andalso varsEquals (args, args') andalso Return.equals (return, return') | (Case {test, cases, default}, Case {test = test', cases = cases', default = default'}) => Var.equals (test, test') andalso Cases.equals (cases, cases') andalso Option.equals (default, default', Label.equals) | (Goto {dst, args}, Goto {dst = dst', args = args'}) => Label.equals (dst, dst') andalso varsEquals (args, args') | (Raise xs, Raise xs') => varsEquals (xs, xs') | (Return xs, Return xs') => varsEquals (xs, xs') | (Runtime {prim, args, return}, Runtime {prim = prim', args = args', return = return'}) => Prim.equals (prim, prim') andalso varsEquals (args, args') andalso Label.equals (return, return') | _ => false (* quell unused warning *) val _ = equals local val newHash = Random.word val bug = newHash () val raisee = newHash () val return = newHash () fun hashVars (xs: Var.t vector, w: Word.t): Word.t = Vector.fold (xs, w, fn (x, w) => Word.xorb (w, Var.hash x)) fun hash2 (w1: Word.t, w2: Word.t) = Word.xorb (w1, w2) in val hash: t -> Word.t = fn Arith {args, overflow, success, ...} => hashVars (args, hash2 (Label.hash overflow, Label.hash success)) | Bug => bug | Call {func, args, return} => hashVars (args, hash2 (Func.hash func, Return.hash return)) | Case {test, cases, default} => hash2 (Var.hash test, Cases.fold (cases, Option.fold (default, 0wx55555555, fn (l, w) => hash2 (Label.hash l, w)), fn (l, w) => hash2 (Label.hash l, w))) | Goto {dst, args} => hashVars (args, Label.hash dst) | Raise xs => hashVars (xs, raisee) | Return xs => hashVars (xs, return) | Runtime {args, return, ...} => hashVars (args, Label.hash return) end (* quell unused warning *) val _ = hash end datatype z = datatype Transfer.t local open Layout in fun layoutFormals (xts: (Var.t * Type.t) vector) = Vector.layout (fn (x, t) => seq [Var.layout x, if !Control.showTypes then seq [str ": ", Type.layout t] else empty]) xts end structure Block = struct datatype t = T of {args: (Var.t * Type.t) vector, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} local fun make f (T r) = f r in val args = make #args val label = make #label val transfer = make #transfer end fun layout (T {label, args, statements, transfer}) = let open Layout in align [seq [Label.layout label, str " ", Vector.layout (fn (x, t) => if !Control.showTypes then seq [Var.layout x, str ": ", Type.layout t] else Var.layout x) args], indent (align [align (Vector.toListMap (statements, Statement.layout)), Transfer.layout transfer], 2)] end fun clear (T {label, args, statements, ...}) = (Label.clear label ; Vector.foreach (args, Var.clear o #1) ; Vector.foreach (statements, Statement.clear)) end structure Datatype = struct datatype t = T of {cons: {args: Type.t Prod.t, con: Con.t} vector, tycon: Tycon.t} fun layout (T {cons, tycon}) = let open Layout in seq [Tycon.layout tycon, str " = ", alignPrefix (Vector.toListMap (cons, fn {con, args} => seq [Con.layout con, str " of ", Prod.layout (args, Type.layout)]), "| ")] end fun clear (T {cons, tycon}) = (Tycon.clear tycon ; Vector.foreach (cons, Con.clear o #con)) end structure Function = struct structure CPromise = ClearablePromise type dest = {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* There is a messy interaction between the laziness used in controlFlow * and the property lists on labels because the former stores * stuff on the property lists. So, if you force the laziness, then * clear the property lists, then try to use the lazy stuff, you will * get screwed with undefined properties. The right thing to do is reset * the laziness when the properties are cleared. *) datatype t = T of {controlFlow: {dfsTree: unit -> Block.t Tree.t, dominatorTree: unit -> Block.t Tree.t, graph: unit DirectedGraph.t, labelNode: Label.t -> unit DirectedGraph.Node.t, nodeBlock: unit DirectedGraph.Node.t -> Block.t} CPromise.t, dest: dest} local fun make f (T {dest, ...}) = f dest in val blocks = make #blocks val dest = make (fn d => d) val name = make #name end fun foreachVar (f: t, fx: Var.t * Type.t -> unit): unit = let val {args, blocks, ...} = dest f val _ = Vector.foreach (args, fx) val _ = Vector.foreach (blocks, fn Block.T {args, statements, ...} => (Vector.foreach (args, fx) ; Vector.foreach (statements, fn s => Statement.foreachDef (s, fx)))) in () end fun controlFlow (T {controlFlow, ...}) = let val {graph, labelNode, nodeBlock, ...} = CPromise.force controlFlow in {graph = graph, labelNode = labelNode, nodeBlock = nodeBlock} end local fun make sel = fn T {controlFlow, ...} => sel (CPromise.force controlFlow) () in val dominatorTree = make #dominatorTree end fun dfs (f, v) = let val {blocks, start, ...} = dest f val numBlocks = Vector.length blocks val {get = labelIndex, set = setLabelIndex, rem, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("index", Label.layout)) val _ = Vector.foreachi (blocks, fn (i, Block.T {label, ...}) => setLabelIndex (label, i)) val visited = Array.array (numBlocks, false) fun visit (l: Label.t): unit = let val i = labelIndex l in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val b as Block.T {transfer, ...} = Vector.sub (blocks, i) val v' = v b val _ = Transfer.foreachLabel (transfer, visit) val _ = v' () in () end end val _ = visit start val _ = Vector.foreach (blocks, rem o Block.label) in () end local structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge in fun determineControlFlow ({blocks, start, ...}: dest) = let open Dot val g = Graph.new () fun newNode () = Graph.newNode g val {get = labelNode, ...} = Property.get (Label.plist, Property.initFun (fn _ => newNode ())) val {get = nodeInfo: unit Node.t -> {block: Block.t}, set = setNodeInfo, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("info", Node.layout)) val _ = Vector.foreach (blocks, fn b as Block.T {label, transfer, ...} => let val from = labelNode label val _ = setNodeInfo (from, {block = b}) val _ = Transfer.foreachLabel (transfer, fn to => (ignore o Graph.addEdge) (g, {from = from, to = labelNode to})) in () end) val root = labelNode start val dfsTree = Promise.lazy (fn () => Graph.dfsTree (g, {root = root, nodeValue = #block o nodeInfo})) val dominatorTree = Promise.lazy (fn () => Graph.dominatorTree (g, {root = root, nodeValue = #block o nodeInfo})) in {dfsTree = dfsTree, dominatorTree = dominatorTree, graph = g, labelNode = labelNode, nodeBlock = #block o nodeInfo} end fun layoutDot (f, global: Var.t -> string option) = let val {name, start, blocks, ...} = dest f fun makeName (name: string, formals: (Var.t * Type.t) vector): string = concat [name, " ", let open Layout in toString (vector (Vector.map (formals, fn (var, ty) => if !Control.showTypes then seq [Var.layout var, str ": ", Type.layout ty] else Var.layout var))) end] open Dot val graph = Graph.new () val {get = nodeOptions, ...} = Property.get (Node.plist, Property.initFun (fn _ => ref [])) fun setNodeText (n: unit Node.t, l): unit = List.push (nodeOptions n, NodeOption.Label l) fun newNode () = Graph.newNode graph val {destroy, get = labelNode} = Property.destGet (Label.plist, Property.initFun (fn _ => newNode ())) val {get = edgeOptions, set = setEdgeOptions, ...} = Property.getSetOnce (Edge.plist, Property.initConst []) val _ = Vector.foreach (blocks, fn Block.T {label, args, statements, transfer} => let val from = labelNode label fun edge (to: Label.t, label: string, style: style): unit = let val e = Graph.addEdge (graph, {from = from, to = labelNode to}) val _ = setEdgeOptions (e, [EdgeOption.label label, EdgeOption.Style style]) in () end val rest = case transfer of Arith {prim, args, overflow, success, ...} => (edge (success, "", Solid) ; edge (overflow, "Overflow", Dashed) ; [Layout.toString (Prim.layoutApp (prim, args, fn x => Layout.str (Var.pretty (x, global))))]) | Bug => ["bug"] | Call {func, args, return} => let val f = Func.toString func val args = Var.prettys (args, global) val _ = case return of Return.Dead => () | Return.NonTail {cont, handler} => (edge (cont, "", Dotted) ; (Handler.foreachLabel (handler, fn l => edge (l, "", Dashed)))) | Return.Tail => () in [f, " ", args] end | Case {test, cases, default, ...} => let fun doit (v, toString) = Vector.foreach (v, fn (x, j) => edge (j, toString x, Solid)) val _ = case cases of Cases.Con v => doit (v, Con.toString) | Cases.Word (_, v) => doit (v, WordX.toString) val _ = case default of NONE => () | SOME j => edge (j, "default", Solid) in ["case ", Var.toString test] end | Goto {dst, args} => (edge (dst, "", Solid) ; [Label.toString dst, " ", Var.prettys (args, global)]) | Raise xs => ["raise ", Var.prettys (xs, global)] | Return xs => ["return ", Var.prettys (xs, global)] | Runtime {prim, args, return} => (edge (return, "", Solid) ; [Layout.toString (Prim.layoutApp (prim, args, fn x => Layout.str (Var.pretty (x, global))))]) val lab = Vector.foldr (statements, [(concat rest, Left)], fn (s, ac) => let val s = case s of Bind {exp, ty, var} => let val exp = Exp.toPretty (exp, global) in if Type.isUnit ty then exp else case var of NONE => exp | SOME var => concat [Var.toString var, if !Control.showTypes then concat [": ", Layout.toString (Type.layout ty)] else "", " = ", exp] end | _ => Statement.toPretty (s, global) in (s, Left) :: ac end) val name = makeName (Label.toString label, args) val _ = setNodeText (from, (name, Left) :: lab) in () end) val root = labelNode start val graphLayout = Graph.layoutDot (graph, fn {nodeName} => {title = concat [Func.toString name, " control-flow graph"], options = [GraphOption.Rank (Min, [{nodeName = nodeName root}])], edgeOptions = edgeOptions, nodeOptions = fn n => let val l = ! (nodeOptions n) open NodeOption in FontColor Black :: Shape Box :: l end}) fun treeLayout () = let val {get = nodeOptions, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initConst []) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setNodeOptions (labelNode label, [NodeOption.label (Label.toString label)])) val treeLayout = Tree.layoutDot (Graph.dominatorTree (graph, {root = root, nodeValue = fn n => n}), {title = concat [Func.toString name, " dominator tree"], options = [], nodeOptions = nodeOptions}) in treeLayout end (* fun loopForestLayout () = let val {get = nodeName, set = setNodeName, ...} = Property.getSetOnce (Node.plist, Property.initConst "") val _ = Vector.foreach (blocks, fn Block.T {label, ...} => setNodeName (labelNode label, Label.toString label)) val loopForestLayout = Graph.LoopForest.layoutDot (Graph.loopForestSteensgaard (graph, {root = root}), {title = concat [Func.toString name, " loop forest"], options = [], nodeName = nodeName}) in loopForestLayout end *) in {destroy = destroy, graph = graphLayout, tree = treeLayout} end end fun new (dest: dest) = let val controlFlow = CPromise.delay (fn () => determineControlFlow dest) in T {controlFlow = controlFlow, dest = dest} end fun clear (T {controlFlow, dest, ...}) = let val {args, blocks, ...} = dest val _ = (Vector.foreach (args, Var.clear o #1) ; Vector.foreach (blocks, Block.clear)) val _ = CPromise.clear controlFlow in () end fun layoutHeader (f: t): Layout.t = let val {args, name, raises, returns, start, ...} = dest f open Layout in seq [str "fun ", Func.layout name, str " ", layoutFormals args, if !Control.showTypes then seq [str ": ", record [("raises", Option.layout (Vector.layout Type.layout) raises), ("returns", Option.layout (Vector.layout Type.layout) returns)]] else empty, str " = ", Label.layout start, str " ()"] end fun layout (f: t) = let val {blocks, ...} = dest f open Layout in align [layoutHeader f, indent (align (Vector.toListMap (blocks, Block.layout)), 2)] end fun layouts (f: t, global, output: Layout.t -> unit): unit = let val {blocks, name, ...} = dest f val _ = output (layoutHeader f) val _ = Vector.foreach (blocks, fn b => output (Layout.indent (Block.layout b, 2))) val _ = if not (!Control.keepDot) then () else let val {destroy, graph, tree} = layoutDot (f, global) val name = Func.toString name fun doit (s, g) = let open Control in saveToFile ({suffix = concat [name, ".", s, ".dot"]}, Dot, (), Layout (fn () => g)) end val _ = doit ("cfg", graph) handle _ => Error.warning "SsaTree2.layouts: couldn't layout cfg" val _ = doit ("dom", tree ()) handle _ => Error.warning "SsaTree2.layouts: couldn't layout dom" (* val _ = doit ("lf", loopForest ()) handle _ => Error.warning "SsaTree2.layouts: couldn't layout lf" *) val () = destroy () in () end in () end fun alphaRename f = let local fun make (new, plist) = let val {get, set, destroy, ...} = Property.destGetSetOnce (plist, Property.initConst NONE) fun bind x = let val x' = new x val _ = set (x, SOME x') in x' end fun lookup x = case get x of NONE => x | SOME y => y in (bind, lookup, destroy) end in val (bindVar, lookupVar, destroyVar) = make (Var.new, Var.plist) val (bindLabel, lookupLabel, destroyLabel) = make (Label.new, Label.plist) end val {args, blocks, mayInline, name, raises, returns, start, ...} = dest f val args = Vector.map (args, fn (x, ty) => (bindVar x, ty)) val bindLabel = ignore o bindLabel val bindVar = ignore o bindVar val _ = Vector.foreach (blocks, fn Block.T {label, args, statements, ...} => (bindLabel label ; Vector.foreach (args, fn (x, _) => bindVar x) ; Vector.foreach (statements, fn s => Statement.foreachDef (s, bindVar o #1)))) val blocks = Vector.map (blocks, fn Block.T {label, args, statements, transfer} => Block.T {label = lookupLabel label, args = Vector.map (args, fn (x, ty) => (lookupVar x, ty)), statements = (Vector.map (statements, fn s => Statement.replaceDefsUses (s, {def = lookupVar, use = lookupVar}))), transfer = Transfer.replaceLabelVar (transfer, lookupLabel, lookupVar)}) val start = lookupLabel start val _ = destroyVar () val _ = destroyLabel () in new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end (* quell unused warning *) val _ = alphaRename fun profile (f: t, sourceInfo): t = if !Control.profile = Control.ProfileNone orelse !Control.profileIL <> Control.ProfileSource then f else let val _ = Control.diagnostic (fn () => layout f) val {args, blocks, mayInline, name, raises, returns, start} = dest f val extraBlocks = ref [] val {get = labelBlock, set = setLabelBlock, rem} = Property.getSetOnce (Label.plist, Property.initRaise ("block", Label.layout)) val _ = Vector.foreach (blocks, fn block as Block.T {label, ...} => setLabelBlock (label, block)) val blocks = Vector.map (blocks, fn Block.T {args, label, statements, transfer} => let val statements = if Label.equals (label, start) then (Vector.concat [Vector.new1 (Profile (ProfileExp.Enter sourceInfo)), statements]) else statements fun leave () = Profile (ProfileExp.Leave sourceInfo) fun prefix (l: Label.t, statements: Statement.t vector): Label.t = let val Block.T {args, ...} = labelBlock l val c = Label.newNoname () val xs = Vector.map (args, fn (x, _) => Var.new x) val _ = List.push (extraBlocks, Block.T {args = Vector.map2 (xs, args, fn (x, (_, t)) => (x, t)), label = c, statements = statements, transfer = Goto {args = xs, dst = l}}) in c end fun genHandler (cont: Label.t) : Statement.t vector * Label.t * Handler.t = case raises of NONE => (statements, cont, Handler.Caller) | SOME ts => let val xs = Vector.map (ts, fn _ => Var.newNoname ()) val l = Label.newNoname () val _ = List.push (extraBlocks, Block.T {args = Vector.zip (xs, ts), label = l, statements = Vector.new1 (leave ()), transfer = Transfer.Raise xs}) in (statements, prefix (cont, Vector.new0 ()), Handler.Handle l) end fun addLeave () = (Vector.concat [statements, Vector.new1 (leave ())], transfer) val (statements, transfer) = case transfer of Call {args, func, return} => let datatype z = datatype Return.t in case return of Dead => (statements, transfer) | NonTail {cont, handler} => (case handler of Handler.Dead => (statements, transfer) | Handler.Caller => let val (statements, cont, handler) = genHandler cont val return = Return.NonTail {cont = cont, handler = handler} in (statements, Call {args = args, func = func, return = return}) end | Handler.Handle _ => (statements, transfer)) | Tail => addLeave () end | Raise _ => addLeave () | Return _ => addLeave () | _ => (statements, transfer) in Block.T {args = args, label = label, statements = statements, transfer = transfer} end) val _ = Vector.foreach (blocks, rem o Block.label) val blocks = Vector.concat [Vector.fromList (!extraBlocks), blocks] val f = new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} val _ = Control.diagnostic (fn () => layout f) in f end val profile = Trace.trace2 ("SsaTree2.Function.profile", layout, SourceInfo.layout, layout) profile end structure Program = struct datatype t = T of { datatypes: Datatype.t vector, globals: Statement.t vector, functions: Function.t list, main: Func.t } end structure Program = struct open Program local structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge in fun layoutCallGraph (T {functions, main, ...}, title: string): Layout.t = let open Dot val graph = Graph.new () val {get = nodeOptions, set = setNodeOptions, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("options", Node.layout)) val {get = funcNode, destroy} = Property.destGet (Func.plist, Property.initFun (fn f => let val n = Graph.newNode graph val _ = setNodeOptions (n, let open NodeOption in [FontColor Black, label (Func.toString f)] end) in n end)) val {get = edgeOptions, set = setEdgeOptions, ...} = Property.getSetOnce (Edge.plist, Property.initConst []) val _ = List.foreach (functions, fn f => let val {name, blocks, ...} = Function.dest f val from = funcNode name val {get, destroy} = Property.destGet (Node.plist, Property.initFun (fn _ => {nontail = ref false, tail = ref false})) val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => case transfer of Call {func, return, ...} => let val to = funcNode func val {tail, nontail} = get to datatype z = datatype Return.t val is = case return of Dead => false | NonTail _ => true | Tail => false val r = if is then nontail else tail in if !r then () else (r := true ; (setEdgeOptions (Graph.addEdge (graph, {from = from, to = to}), if is then [] else [EdgeOption.Style Dotted]))) end | _ => ()) val _ = destroy () in () end) val root = funcNode main val l = Graph.layoutDot (graph, fn {nodeName} => {title = title, options = [GraphOption.Rank (Min, [{nodeName = nodeName root}])], edgeOptions = edgeOptions, nodeOptions = nodeOptions}) val _ = destroy () in l end end fun layouts (p as T {datatypes, globals, functions, main}, output': Layout.t -> unit) = let val global = Statement.prettifyGlobals globals open Layout (* Layout includes an output function, so we need to rebind output * to the one above. *) val output = output' in output (str "\n\nDatatypes:") ; Vector.foreach (datatypes, output o Datatype.layout) ; output (str "\n\nGlobals:") ; Vector.foreach (globals, output o Statement.layout) ; output (seq [str "\n\nMain: ", Func.layout main]) ; output (str "\n\nFunctions:") ; List.foreach (functions, fn f => Function.layouts (f, global, output)) ; if not (!Control.keepDot) then () else let open Control in saveToFile ({suffix = "call-graph.dot"}, Dot, (), Layout (fn () => layoutCallGraph (p, !Control.inputFile))) end end fun layoutStats (T {datatypes, globals, functions, main, ...}) = let val (mainNumVars, mainNumBlocks) = case List.peek (functions, fn f => Func.equals (main, Function.name f)) of NONE => Error.bug "SsaTree2.Program.layoutStats: no main" | SOME f => let val numVars = ref 0 val _ = Function.foreachVar (f, fn _ => Int.inc numVars) val {blocks, ...} = Function.dest f val numBlocks = Vector.length blocks in (!numVars, numBlocks) end val numTypes = ref 0 val {get = countType, destroy} = Property.destGet (Type.plist, Property.initRec (fn (t, countType) => let datatype z = datatype Type.dest val _ = case Type.dest t of CPointer => () | Datatype _ => () | IntInf => () | Object {args, ...} => Prod.foreach (args, countType) | Real _ => () | Thread => () | Weak t => countType t | Word _ => () val _ = Int.inc numTypes in () end)) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {args, ...} => Prod.foreach (args, countType))) val numStatements = ref (Vector.length globals) val numBlocks = ref 0 val _ = List.foreach (functions, fn f => let val {args, blocks, ...} = Function.dest f val _ = Vector.foreach (args, countType o #2) val _ = Vector.foreach (blocks, fn Block.T {args, statements, ...} => let val _ = Int.inc numBlocks val _ = Vector.foreach (args, countType o #2) val _ = Vector.foreach (statements, fn stmt => let val _ = Int.inc numStatements datatype z = datatype Statement.t val _ = case stmt of Bind {ty, ...} => countType ty | _ => () in () end) in () end) in () end) val numFunctions = List.length functions val _ = destroy () open Layout in align [seq [str "num vars in main = ", Int.layout mainNumVars], seq [str "num blocks in main = ", Int.layout mainNumBlocks], seq [str "num functions in program = ", Int.layout numFunctions], seq [str "num blocks in program = ", Int.layout (!numBlocks)], seq [str "num statements in program = ", Int.layout (!numStatements)], seq [str "num types in program = ", Int.layout (!numTypes)], Type.stats ()] end (* clear all property lists reachable from program *) fun clear (T {datatypes, globals, functions, ...}) = ((* Can't do Type.clear because it clears out the info needed for * Type.dest. *) Vector.foreach (datatypes, Datatype.clear) ; Vector.foreach (globals, Statement.clear) ; List.foreach (functions, Function.clear)) fun clearGlobals (T {globals, ...}) = Vector.foreach (globals, Statement.clear) fun clearTop (p as T {datatypes, functions, ...}) = (Vector.foreach (datatypes, Datatype.clear) ; List.foreach (functions, Func.clear o Function.name) ; clearGlobals p) fun foreachVar (T {globals, functions, ...}, f) = (Vector.foreach (globals, fn s => Statement.foreachDef (s, f)) ; List.foreach (functions, fn g => Function.foreachVar (g, f))) fun foreachPrimApp (T {globals, functions, ...}, f) = let fun loopStatement (s: Statement.t) = case s of Bind {exp = PrimApp {args, prim}, ...} => f {args = args, prim = prim} | _ => () fun loopTransfer t = case t of Arith {args, prim, ...} => f {args = args, prim = prim} | Runtime {args, prim, ...} => f {args = args, prim = prim} | _ => () val _ = Vector.foreach (globals, loopStatement) val _ = List.foreach (functions, fn f => Vector.foreach (Function.blocks f, fn Block.T {statements, transfer, ...} => (Vector.foreach (statements, loopStatement); loopTransfer transfer))) in () end fun hasPrim (p, f) = Exn.withEscape (fn escape => (foreachPrimApp (p, fn {prim, ...} => if f prim then escape true else ()) ; false)) fun dfs (p, v) = let val T {functions, main, ...} = p val functions = Vector.fromList functions val numFunctions = Vector.length functions val {get = funcIndex, set = setFuncIndex, rem, ...} = Property.getSetOnce (Func.plist, Property.initRaise ("index", Func.layout)) val _ = Vector.foreachi (functions, fn (i, f) => setFuncIndex (#name (Function.dest f), i)) val visited = Array.array (numFunctions, false) fun visit (f: Func.t): unit = let val i = funcIndex f in if Array.sub (visited, i) then () else let val _ = Array.update (visited, i, true) val f = Vector.sub (functions, i) val v' = v f val _ = Function.dfs (f, fn Block.T {transfer, ...} => (Transfer.foreachFunc (transfer, visit) ; fn () => ())) val _ = v' () in () end end val _ = visit main val _ = Vector.foreach (functions, rem o Function.name) in () end end end mlton-20100608/mlton/ssa/ssa-tree2.sig0000644000076600000240000002443311404435623016017 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SSA_TREE2_STRUCTS = sig include ATOMS end signature SSA_TREE2 = sig include SSA_TREE2_STRUCTS structure Prod: sig type 'a t val dest: 'a t -> {elt: 'a, isMutable: bool} vector val elt: 'a t * int -> 'a val empty: unit -> 'a t val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foreach: 'a t * ('a -> unit) -> unit val isEmpty: 'a t -> bool val isMutable: 'a t -> bool val keepAllMap: 'a t * ('a -> 'b option) -> 'b t val layout: 'a t * ('a -> Layout.t) -> Layout.t val length: 'a t -> int val make: {elt: 'a, isMutable: bool} vector -> 'a t val map: 'a t * ('a -> 'b) -> 'b t val sub: 'a t * int -> {elt: 'a, isMutable: bool} end structure ObjectCon: sig datatype t = Con of Con.t | Tuple | Vector val isVector: t -> bool val layout: t -> Layout.t end structure Type: sig type t datatype dest = CPointer | Datatype of Tycon.t | IntInf | Object of {args: t Prod.t, con: ObjectCon.t} | Real of RealSize.t | Thread | Weak of t | Word of WordSize.t val array1: t -> t val bool: t val conApp: Con.t * t Prod.t -> t val checkPrimApp: {args: t vector, prim: t Prim.t, result: t} -> bool val cpointer: t val datatypee: Tycon.t -> t val dest: t -> dest val equals: t * t -> bool val intInf: t val isVector: t -> bool val isUnit: t -> bool val layout: t -> Layout.t val object: {args: t Prod.t, con: ObjectCon.t} -> t val ofConst: Const.t -> t val plist: t -> PropertyList.t val real: RealSize.t -> t val reff1: t -> t val thread: t val tuple: t Prod.t -> t val vector: t Prod.t -> t val vector1: t -> t val weak: t -> t val word: WordSize.t -> t val unit: t end structure Base: sig datatype 'a t = Object of 'a | VectorSub of {index: 'a, vector: 'a} val foreach: 'a t * ('a -> unit) -> unit val layout: 'a t * ('a -> Layout.t) -> Layout.t val map: 'a t * ('a -> 'b) -> 'b t val object: 'a t -> 'a end structure Exp: sig datatype t = Const of Const.t | Inject of {sum: Tycon.t, variant: Var.t} | Object of {args: Var.t vector, con: Con.t option} | PrimApp of {args: Var.t vector, prim: Type.t Prim.t} | Select of {base: Var.t Base.t, offset: int} | Var of Var.t val equals: t * t -> bool val foreachVar: t * (Var.t -> unit) -> unit val hash: t -> Word.t val layout: t -> Layout.t val maySideEffect: t -> bool val replaceVar: t * (Var.t -> Var.t) -> t val unit: t end structure Statement: sig datatype t = Bind of {exp: Exp.t, ty: Type.t, var: Var.t option} | Profile of ProfileExp.t | Update of {base: Var.t Base.t, offset: int, value: Var.t} val clear: t -> unit (* clear the var *) val foreachDef: t * (Var.t * Type.t -> unit) -> unit val foreachUse: t * (Var.t -> unit) -> unit val layout: t -> Layout.t val prettifyGlobals: t vector -> (Var.t -> string option) val profile: ProfileExp.t -> t val replaceUses: t * (Var.t -> Var.t) -> t end structure Cases: sig datatype t = Con of (Con.t * Label.t) vector | Word of WordSize.t * (WordX.t * Label.t) vector val forall: t * (Label.t -> bool) -> bool val foreach: t * (Label.t -> unit) -> unit val hd: t -> Label.t val isEmpty: t -> bool val map: t * (Label.t -> Label.t) -> t end structure Handler: HANDLER sharing Handler.Label = Label structure Return: RETURN sharing Return.Handler = Handler structure Transfer: sig datatype t = Arith of {args: Var.t vector, overflow: Label.t, (* Must be nullary. *) prim: Type.t Prim.t, success: Label.t, (* Must be unary. *) ty: Type.t} (* int or word *) | Bug (* MLton thought control couldn't reach here. *) | Call of {args: Var.t vector, func: Func.t, return: Return.t} | Case of {cases: Cases.t, default: Label.t option, (* Must be nullary. *) test: Var.t} | Goto of {args: Var.t vector, dst: Label.t} (* Raise implicitly raises to the caller. * I.E. the local handler stack must be empty. *) | Raise of Var.t vector | Return of Var.t vector | Runtime of {args: Var.t vector, prim: Type.t Prim.t, return: Label.t} (* Must be nullary. *) val equals: t * t -> bool val foreachFunc : t * (Func.t -> unit) -> unit val foreachLabel: t * (Label.t -> unit) -> unit val foreachLabelVar: t * (Label.t -> unit) * (Var.t -> unit) -> unit val foreachVar: t * (Var.t -> unit) -> unit val hash: t -> Word.t val layout: t -> Layout.t val replaceLabelVar: t * (Label.t -> Label.t) * (Var.t -> Var.t) -> t val replaceLabel: t * (Label.t -> Label.t) -> t val replaceVar: t * (Var.t -> Var.t) -> t end structure Block: sig datatype t = T of {args: (Var.t * Type.t) vector, label: Label.t, statements: Statement.t vector, transfer: Transfer.t} val args: t -> (Var.t * Type.t) vector val clear: t -> unit val label: t -> Label.t val layout: t -> Layout.t val transfer: t -> Transfer.t end structure Datatype: sig datatype t = T of {cons: {args: Type.t Prod.t, con: Con.t} vector, tycon: Tycon.t} val layout: t -> Layout.t end structure Function: sig type t val alphaRename: t -> t val blocks: t -> Block.t vector (* clear the plists for all bound variables and labels that appear * in the function, but not the function name's plist. *) val clear: t -> unit val controlFlow: t -> {graph: unit DirectedGraph.t, labelNode: Label.t -> unit DirectedGraph.Node.t, nodeBlock: unit DirectedGraph.Node.t -> Block.t} val dest: t -> {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} (* dfs (f, v) visits the blocks in depth-first order, applying v b * for block b to yield v', then visiting b's descendents, * then applying v' (). *) val dfs: t * (Block.t -> unit -> unit) -> unit val dominatorTree: t -> Block.t Tree.t val foreachVar: t * (Var.t * Type.t -> unit) -> unit val layout: t -> Layout.t val layoutDot: t * (Var.t -> string option) -> {destroy: unit -> unit, graph: Layout.t, tree: unit -> Layout.t} val name: t -> Func.t val new: {args: (Var.t * Type.t) vector, blocks: Block.t vector, mayInline: bool, name: Func.t, raises: Type.t vector option, returns: Type.t vector option, start: Label.t} -> t val profile: t * SourceInfo.t -> t end structure Program: sig datatype t = T of {datatypes: Datatype.t vector, functions: Function.t list, globals: Statement.t vector, main: Func.t (* Must be nullary. *)} val clear: t -> unit val clearTop: t -> unit (* dfs (p, v) visits the functions in depth-first order, applying v f * for function f to yield v', then visiting f's descendents, * then applying v' (). *) val dfs: t * (Function.t -> unit -> unit) -> unit val foreachPrimApp: t * ({args: Var.t vector, prim: Type.t Prim.t} -> unit) -> unit val foreachVar: t * (Var.t * Type.t -> unit) -> unit val hasPrim: t * (Type.t Prim.t -> bool) -> bool val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t end end mlton-20100608/mlton/ssa/ssa.fun0000644000076600000240000000057711404435623015011 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Ssa (S: SSA_STRUCTS): SSA = Simplify (Restore (Shrink (PrePasses ( TypeCheck (Analyze (DirectExp (SsaTree (S)))))))) mlton-20100608/mlton/ssa/ssa.sig0000644000076600000240000000057011404435623014774 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SSA_STRUCTS = sig include SSA_TREE_STRUCTS end signature SSA = sig include SIMPLIFY end mlton-20100608/mlton/ssa/ssa2.fun0000644000076600000240000000056211404435623015065 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Ssa2 (S: SSA2_STRUCTS): SSA2 = Simplify2 (Shrink2 (PrePasses2 ( TypeCheck2 (Analyze2 (SsaTree2 (S)))))) mlton-20100608/mlton/ssa/ssa2.sig0000644000076600000240000000057411404435623015062 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SSA2_STRUCTS = sig include SSA_TREE2_STRUCTS end signature SSA2 = sig include SIMPLIFY2 end mlton-20100608/mlton/ssa/three-point-lattice.fun0000644000076600000240000000124111404435623020071 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ThreePointLattice(S: THREE_POINT_LATTICE_STRUCTS): THREE_POINT_LATTICE = struct open S structure L = NPointLattice(val names = [bottom, mid, top]) open L val isBottom = fn x => isN (x, 0) val isMid = fn x => isN (x, 1) val isTop = fn x => isN (x, 2) val makeMid = fn x => makeN (x, 1) val makeTop = fn x => makeN (x, 2) val whenMid = fn (x, h) => whenN (x, 1, h) val whenTop = fn (x, h) => whenN (x, 2, h) end mlton-20100608/mlton/ssa/three-point-lattice.sig0000644000076600000240000000210411404435623020062 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature THREE_POINT_LATTICE_STRUCTS = sig (* pretty print names *) val bottom: string val mid: string val top: string end signature THREE_POINT_LATTICE = sig include THREE_POINT_LATTICE_STRUCTS type t val <= : t * t -> unit (* force rhs to be mid/top if lhs is *) val == : t * t -> unit (* force lhs and rhs to be the same *) val isBottom: t -> bool val isMid: t -> bool val isTop: t -> bool val layout: t -> Layout.t val makeTop: t -> unit val makeMid: t -> unit val new: unit -> t (* a new bottom *) val up: t -> unit (* handler will be run once iff value gte mid *) val whenMid: t * (unit -> unit) -> unit (* handler will be run once iff value gte top *) val whenTop: t * (unit -> unit) -> unit end mlton-20100608/mlton/ssa/two-point-lattice.fun0000644000076600000240000000354211404435623017601 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TwoPointLattice (S: TWO_POINT_LATTICE_STRUCTS): TWO_POINT_LATTICE = struct open S structure Set = DisjointSet structure List = AppendList datatype t = T of value Set.t and value = Bottom of (unit -> unit) List.t ref (* If I become Top, then run these. *) | Top fun value (T s) = Set.! s fun toString e = case value e of Bottom _ => bottom | Top => top val layout = Layout.str o toString fun new (): t = T (Set.singleton (Bottom (ref List.empty))) fun equals (T s, T s') = Set.equals (s, s') fun addHandler (e, h) = case value e of Bottom hs => hs := List.cons (h, !hs) | Top => h () fun isTop s = case value s of Top => true | _ => false fun isBottom s = case value s of Bottom _ => true | _ => false fun runHandlers hs = List.foreach (!hs, fn h => h ()) fun makeTop (T s) = case Set.! s of Top => () | Bottom hs => (Set.:= (s, Top); runHandlers hs) fun from <= to = if equals (from, to) then () else case (value from, value to) of (_, Top) => () | (Top, _) => makeTop to | (Bottom hs, _) => hs := List.cons (fn () => makeTop to, !hs) fun == (T s, T s') = if Set.equals (s, s') then () else let val e = Set.! s val e' = Set.! s' val _ = Set.union (s, s') in case (e, e') of (Top, Top) => () | (Bottom hs, Top) => (Set.:= (s, e'); runHandlers hs) | (Top, Bottom hs) => (Set.:= (s, e); runHandlers hs) | (Bottom hs, Bottom hs') => Set.:= (s, Bottom (ref (List.append (!hs, !hs')))) end end mlton-20100608/mlton/ssa/two-point-lattice.sig0000644000076600000240000000156611404435623017577 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TWO_POINT_LATTICE_STRUCTS = sig (* pretty print names *) val bottom: string val top: string end signature TWO_POINT_LATTICE = sig include TWO_POINT_LATTICE_STRUCTS type t val <= : t * t -> unit (* force rhs to be top if lhs is *) val == : t * t -> unit (* force lhs and rhs to be the same *) (* handler will be run once iff value becomes top *) val addHandler: t * (unit -> unit) -> unit val isBottom: t -> bool val isTop: t -> bool val layout: t -> Layout.t val makeTop: t -> unit val new: unit -> t (* a new bottom *) end mlton-20100608/mlton/ssa/type-check.fun0000644000076600000240000004606611404435623016262 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TypeCheck (S: TYPE_CHECK_STRUCTS): TYPE_CHECK = struct open S datatype z = datatype Exp.t datatype z = datatype Transfer.t fun checkScopes (program as Program.T {datatypes, globals, functions, main}): unit = let datatype 'a status = Undefined | InScope of 'a | Defined fun make' (layout, plist) = let val {get, set, ...} = Property.getSet (plist, Property.initConst Undefined) fun bind (x, v) = case get x of Undefined => set (x, InScope v) | _ => Error.bug ("Ssa.TypeCheck.checkScopes: duplicate definition of " ^ (Layout.toString (layout x))) fun reference x = case get x of InScope v => v | _ => Error.bug (concat ["Ssa.TypeCheck.checkScopes: reference to ", Layout.toString (layout x), " not in scope"]) fun unbind x = set (x, Defined) in (bind, ignore o reference, reference, unbind) end fun make (layout, plist) = let val (bind, reference, _, unbind) = make' (layout, plist) in (fn x => bind (x, ()), reference, unbind) end val (bindTycon, getTycon, getTycon', _) = make' (Tycon.layout, Tycon.plist) val (bindCon, getCon, getCon', _) = make' (Con.layout, Con.plist) val (bindVar, getVar, getVar', unbindVar) = make' (Var.layout, Var.plist) fun getVars xs = Vector.foreach (xs, getVar) val (bindLabel, getLabel, unbindLabel) = make (Label.layout, Label.plist) val (bindFunc, getFunc, _) = make (Func.layout, Func.plist) val {destroy = destroyLoopType, get = loopType, ...} = Property.destGet (Type.plist, Property.initRec (fn (ty, loopType) => let datatype z = datatype Type.dest val _ = case Type.dest ty of Array ty => loopType ty | CPointer => () | Datatype tycon => getTycon tycon | IntInf => () | Real _ => () | Ref ty => loopType ty | Thread => () | Tuple tys => Vector.foreach (tys, loopType) | Vector ty => loopType ty | Weak ty => loopType ty | Word _ => () in () end)) fun loopTypes tys = Vector.foreach (tys, loopType) (* Redefine bindVar to check well-formedness of types. *) val bindVar = fn (x, ty) => (loopType ty; bindVar (x, ty)) fun loopExp exp = let val _ = case exp of ConApp {con, args, ...} => (getCon con ; getVars args) | Const _ => () | PrimApp {args, targs, ...} => (loopTypes targs; getVars args) | Profile _ => () | Select {tuple, ...} => getVar tuple | Tuple xs => getVars xs | Var x => getVar x in () end fun loopStatement (Statement.T {var, ty, exp, ...}) = let val _ = loopExp exp val _ = loopType ty val _ = Option.app (var, fn x => bindVar (x, ty)) in () end val loopTransfer = fn Arith {args, ty, ...} => (getVars args; loopType ty) | Bug => () | Call {func, args, ...} => (getFunc func; getVars args) | Case {test, cases, default, ...} => let fun doit (cases: ('a * 'b) vector, equals: 'a * 'a -> bool, toWord: 'a -> word): unit = let val table = HashSet.new {hash = toWord} val _ = Vector.foreach (cases, fn (x, _) => let val _ = HashSet.insertIfNew (table, toWord x, fn y => equals (x, y), fn () => x, fn _ => Error.bug "Ssa.TypeCheck.loopTransfer: redundant branch in case") in () end) in if isSome default then () else Error.bug "Ssa.TypeCheck.loopTransfer: case has no default" end fun doitCon cases = let val numCons = case Type.dest (getVar' test) of Type.Datatype t => getTycon' t | _ => Error.bug "Ssa.TypeCheck.loopTransfer: case test is not a datatype" val cons = Array.array (numCons, false) val _ = Vector.foreach (cases, fn (con, _) => let val i = getCon' con in if Array.sub (cons, i) then Error.bug "Ssa.TypeCheck.loopTransfer: redundant branch in case" else Array.update (cons, i, true) end) in case (Array.forall (cons, fn b => b), isSome default) of (true, true) => Error.bug "Ssa.TypeCheck.loopTransfer: exhaustive case has default" | (false, false) => Error.bug "Ssa.TypeCheck.loopTransfer: non-exhaustive case has no default" | _ => () end val _ = getVar test val _ = case cases of Cases.Con cs => doitCon cs | Cases.Word (_, cs) => doit (cs, WordX.equals, Word.fromIntInf o WordX.toIntInf) in () end | Goto {args, ...} => getVars args | Raise xs => getVars xs | Return xs => getVars xs | Runtime {args, ...} => getVars args fun loopFunc (f: Function.t) = let val {args, blocks, raises, returns, start, ...} = Function.dest f (* Descend the dominator tree, verifying that variable definitions * dominate variable uses. *) fun loop (Tree.T (block, children)): unit = let val Block.T {args, statements, transfer, ...} = block val _ = Vector.foreach (args, bindVar) val _ = Vector.foreach (statements, loopStatement) val _ = loopTransfer transfer val _ = Vector.foreach (children, loop) val _ = Vector.foreach (statements, fn s => Option.app (Statement.var s, unbindVar)) val _ = Vector.foreach (args, unbindVar o #1) in () end val _ = Vector.foreach (args, bindVar) val _ = Vector.foreach (blocks, bindLabel o Block.label) (* Check that 'start' and all transfer labels are in scope. * In the case that something is not in scope, * "getLabel" gives a more informative error message * than the CFG/dominatorTree construction failure. *) val _ = getLabel start val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, getLabel)) val _ = loop (Function.dominatorTree f) val _ = Vector.foreach (blocks, unbindLabel o Block.label) val _ = Vector.foreach (args, unbindVar o #1) val _ = Option.app (returns, loopTypes) val _ = Option.app (raises, loopTypes) val _ = Function.clear f in () end val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (bindTycon (tycon, Vector.length cons) ; Vector.foreachi (cons, fn (i, {con, ...}) => bindCon (con, i)))) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {args, ...} => Vector.foreach (args, loopType))) val _ = Vector.foreach (globals, loopStatement) val _ = List.foreach (functions, bindFunc o Function.name) val _ = getFunc main val _ = List.foreach (functions, loopFunc) val _ = Program.clearTop program val _ = destroyLoopType () in () end val checkScopes = Control.trace (Control.Detail, "checkScopes") checkScopes structure Function = struct open Function fun checkProf (f: t): unit = let val debug = false val {blocks, start, ...} = dest f val {get = labelInfo, rem, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val _ = Vector.foreach (blocks, fn b as Block.T {label, ...} => setLabelInfo (label, {block = b, sources = ref NONE})) fun goto (l: Label.t, sources: SourceInfo.t list) = let fun bug (msg: string): 'a = let val _ = Vector.foreach (blocks, fn Block.T {label, ...} => let val {sources, ...} = labelInfo label open Layout in outputl (seq [Label.layout label, str " ", Option.layout (List.layout SourceInfo.layout) (!sources)], Out.error) end) in Error.bug (concat ["Ssa.TypeCheck.checkProf: bug found in ", Label.toString l, ": ", msg]) end val _ = if not debug then () else let open Layout in outputl (seq [str "goto (", Label.layout l, str ", ", List.layout SourceInfo.layout sources, str ")"], Out.error) end val {block, sources = r} = labelInfo l in case !r of NONE => let val _ = r := SOME sources val Block.T {statements, transfer, ...} = block datatype z = datatype Statement.t datatype z = datatype ProfileExp.t val sources = Vector.fold (statements, sources, fn (Statement.T {exp, ...}, sources) => case exp of Profile pe => (case pe of Enter s => s :: sources | Leave s => (case sources of [] => bug "unmatched Leave" | s' :: sources => if SourceInfo.equals (s, s') then sources else bug "mismatched Leave")) | _ => sources) val _ = if not debug then () else let open Layout in outputl (List.layout SourceInfo.layout sources, Out.error) end val _ = if (case transfer of Call {return, ...} => let datatype z = datatype Return.t in case return of Dead => false | NonTail _ => false | Tail => true end | Raise _ => true | Return _ => true | _ => false) then (case sources of [] => () | _ => bug "nonempty sources when leaving function") else () in Transfer.foreachLabel (transfer, fn l => goto (l, sources)) end | SOME sources' => if List.equals (sources, sources', SourceInfo.equals) then () else bug "mismatched block" end val _ = goto (start, []) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => rem label) in () end end fun checkProf (Program.T {functions, ...}): unit = List.foreach (functions, fn f => Function.checkProf f) val checkProf = Control.trace (Control.Detail, "checkProf") checkProf fun typeCheck (program as Program.T {datatypes, ...}): unit = let val _ = checkScopes program val _ = if !Control.profile <> Control.ProfileNone then checkProf program else () val out = Out.error val print = Out.outputc out exception TypeError fun error (msg, lay) = (print (concat ["Type error: ", msg, "\n"]) ; Layout.output (lay, out) ; print "\n" ; raise TypeError) fun coerce {from: Type.t, to: Type.t}: unit = if Type.equals (from, to) then () else error ("Ssa.TypeCheck.coerce", Layout.record [("from", Type.layout from), ("to", Type.layout to)]) fun coerces (from, to) = Vector.foreach2 (from, to, fn (from, to) => coerce {from = from, to = to}) val coerce = Trace.trace ("Ssa.TypeCheck.coerce", fn {from, to} => let open Layout in record [("from", Type.layout from), ("to", Type.layout to)] end, Unit.layout) coerce fun select {tuple: Type.t, offset: int, resultType = _}: Type.t = case Type.deTupleOpt tuple of NONE => error ("select of non tuple", Layout.empty) | SOME ts => Vector.sub (ts, offset) val {get = conInfo: Con.t -> {args: Type.t vector, result: Type.t}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("TypeCheck.info", Con.layout)) val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val result = Type.datatypee tycon in Vector.foreach (cons, fn {con, args} => setConInfo (con, {args = args, result = result})) end) fun conApp {con, args} = let val {args = args', result, ...} = conInfo con val _ = coerces (args', args) in result end fun filter (test, con, args) = let val {result, args = args'} = conInfo con val _ = coerce {from = test, to = result} val _ = coerces (args', args) in () end fun primApp {args, prim, resultType, resultVar = _, targs} = let datatype z = datatype Prim.Name.t val () = if Type.checkPrimApp {args = args, prim = prim, result = resultType, targs = targs} then () else error ("bad primapp", let open Layout in seq [Prim.layout prim, tuple (Vector.toListMap (args, Type.layout))] end) in resultType end val _ = analyze { coerce = coerce, conApp = conApp, const = Type.ofConst, filter = filter, filterWord = fn (from, s) => coerce {from = from, to = Type.word s}, fromType = fn x => x, layout = Type.layout, primApp = primApp, program = program, select = select, tuple = Type.tuple, useFromTypeOnBinds = true } handle e => error (concat ["analyze raised exception ", Layout.toString (Exn.layout e)], Layout.empty) val _ = Program.clear program in () end val typeCheck = Control.trace (Control.Pass, "typeCheck") typeCheck end mlton-20100608/mlton/ssa/type-check.sig0000644000076600000240000000065711404435623016250 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYPE_CHECK_STRUCTS = sig include ANALYZE end signature TYPE_CHECK = sig include TYPE_CHECK_STRUCTS val typeCheck: Program.t -> unit end mlton-20100608/mlton/ssa/type-check2.fun0000644000076600000240000005471111404435623016340 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TypeCheck2 (S: TYPE_CHECK2_STRUCTS): TYPE_CHECK2 = struct open S datatype z = datatype Exp.t datatype z = datatype Statement.t datatype z = datatype Transfer.t fun checkScopes (program as Program.T {datatypes, globals, functions, main}): unit = let datatype 'a status = Undefined | InScope of 'a | Defined fun make' (layout, plist) = let val {get, set, ...} = Property.getSet (plist, Property.initConst Undefined) fun bind (x, v) = case get x of Undefined => set (x, InScope v) | _ => Error.bug (concat ["Ssa2.TypeCheck2.checkScopes: duplicate definition of ", Layout.toString (layout x)]) fun reference x = case get x of InScope v => v | _ => Error.bug (concat ["Ssa2.TypeCheck2.checkScopes: reference to ", Layout.toString (layout x), " not in scope"]) fun unbind x = set (x, Defined) in (bind, ignore o reference, reference, unbind) end fun make (layout, plist) = let val (bind, reference, _, unbind) = make' (layout, plist) in (fn x => bind (x, ()), reference, unbind) end val (bindTycon, getTycon, getTycon', _) = make' (Tycon.layout, Tycon.plist) val (bindCon, getCon, getCon', _) = make' (Con.layout, Con.plist) val (bindVar, getVar, getVar', unbindVar) = make' (Var.layout, Var.plist) fun getVars xs = Vector.foreach (xs, getVar) val (bindFunc, getFunc, _) = make (Func.layout, Func.plist) val (bindLabel, getLabel, unbindLabel) = make (Label.layout, Label.plist) fun loopObjectCon oc = let datatype z = datatype ObjectCon.t val _ = case oc of Con con => getCon con | Tuple => () | Vector => () in () end val {destroy = destroyLoopType, get = loopType, ...} = Property.destGet (Type.plist, Property.initRec (fn (ty, loopType) => let datatype z = datatype Type.dest val _ = case Type.dest ty of CPointer => () | Datatype tycon => getTycon tycon | IntInf => () | Object {args, con, ...} => let val _ = loopObjectCon con val _ = Prod.foreach (args, loopType) in () end | Real _ => () | Thread => () | Weak ty => loopType ty | Word _ => () in () end)) fun loopTypes tys = Vector.foreach (tys, loopType) (* Redefine bindVar to check well-formedness of types. *) val bindVar = fn (x, ty) => (loopType ty; bindVar (x, ty)) fun loopExp exp = let val _ = case exp of Const _ => () | Inject {sum, variant, ...} => (getTycon sum; getVar variant) | Object {args, con, ...} => (Option.app (con, getCon); getVars args) | PrimApp {args, ...} => getVars args | Select {base, ...} => Base.foreach (base, getVar) | Var x => getVar x in () end fun loopStatement (s: Statement.t): unit = let val _ = case s of Bind {exp, ty, var, ...} => let val _ = loopExp exp val _ = loopType ty val _ = Option.app (var, fn x => bindVar (x, ty)) in () end | Profile _ => () | Update {base, value, ...} => (Base.foreach (base, getVar); getVar value) in () end val loopTransfer = fn Arith {args, ty, ...} => (getVars args; loopType ty) | Bug => () | Call {func, args, ...} => (getFunc func; getVars args) | Case {test, cases, default, ...} => let fun doit (cases: ('a * 'b) vector, equals: 'a * 'a -> bool, toWord: 'a -> word): unit = let val table = HashSet.new {hash = toWord} val _ = Vector.foreach (cases, fn (x, _) => let val _ = HashSet.insertIfNew (table, toWord x, fn y => equals (x, y), fn () => x, fn _ => Error.bug "Ssa2.TypeCheck2.loopTransfer: redundant branch in case") in () end) in if isSome default then () else Error.bug "Ssa2.TypeCheck2.loopTransfer: case has no default" end fun doitCon cases = let val numCons = case Type.dest (getVar' test) of Type.Datatype t => getTycon' t | _ => Error.bug (concat ["Ssa2.TypeCheck2.loopTransfer: case test ", Var.toString test, " is not a datatype"]) val cons = Array.array (numCons, false) val _ = Vector.foreach (cases, fn (con, _) => let val i = getCon' con in if Array.sub (cons, i) then Error.bug "Ssa2.TypeCheck2.loopTransfer: redundant branch in case" else Array.update (cons, i, true) end) in case (Array.forall (cons, fn b => b), isSome default) of (true, true) => Error.bug "Ssa2.TypeCheck2.loopTransfer: exhaustive case has default" | (false, false) => Error.bug "Ssa2.TypeCheck2.loopTransfer: non-exhaustive case has no default" | _ => () end val _ = getVar test val _ = case cases of Cases.Con cs => doitCon cs | Cases.Word (_, cs) => doit (cs, WordX.equals, Word.fromIntInf o WordX.toIntInf) in () end | Goto {args, ...} => getVars args | Raise xs => getVars xs | Return xs => getVars xs | Runtime {args, ...} => getVars args fun loopFunc (f: Function.t) = let val {args, blocks, raises, returns, start, ...} = Function.dest f (* Descend the dominator tree, verifying that variable definitions * dominate variable uses. *) fun loop (Tree.T (block, children)): unit = let val Block.T {args, statements, transfer, ...} = block val _ = Vector.foreach (args, bindVar) val _ = Vector.foreach (statements, loopStatement) val _ = loopTransfer transfer val _ = Vector.foreach (children, loop) val _ = Vector.foreach (statements, fn s => Statement.foreachDef (s, unbindVar o #1)) val _ = Vector.foreach (args, unbindVar o #1) in () end val _ = Vector.foreach (args, bindVar) val _ = Vector.foreach (blocks, bindLabel o Block.label) (* Check that 'start' and all transfer labels are in scope. * In the case that something is not in scope, * "getLabel" gives a more informative error message * than the CFG/dominatorTree construction failure. *) val _ = getLabel start val _ = Vector.foreach (blocks, fn Block.T {transfer, ...} => Transfer.foreachLabel (transfer, getLabel)) val _ = loop (Function.dominatorTree f) val _ = Vector.foreach (blocks, unbindLabel o Block.label) val _ = Vector.foreach (args, unbindVar o #1) val _ = Option.app (returns, loopTypes) val _ = Option.app (raises, loopTypes) val _ = Function.clear f in () end val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => (bindTycon (tycon, Vector.length cons) ; Vector.foreachi (cons, fn (i, {con, ...}) => bindCon (con, i)))) val _ = Vector.foreach (datatypes, fn Datatype.T {cons, ...} => Vector.foreach (cons, fn {args, ...} => Prod.foreach (args, loopType))) val _ = Vector.foreach (globals, loopStatement) val _ = List.foreach (functions, bindFunc o Function.name) val _ = List.foreach (functions, loopFunc) val _ = getFunc main val _ = Program.clearTop program val _ = destroyLoopType () in () end val checkScopes = Control.trace (Control.Detail, "checkScopes") checkScopes structure Function = struct open Function fun checkProf (f: t): unit = let val debug = false val {blocks, start, ...} = dest f val {get = labelInfo, rem, set = setLabelInfo, ...} = Property.getSetOnce (Label.plist, Property.initRaise ("info", Label.layout)) val _ = Vector.foreach (blocks, fn b as Block.T {label, ...} => setLabelInfo (label, {block = b, sources = ref NONE})) fun goto (l: Label.t, sources: SourceInfo.t list) = let fun bug (msg: string): 'a = let val _ = Vector.foreach (blocks, fn Block.T {label, ...} => let val {sources, ...} = labelInfo label open Layout in outputl (seq [Label.layout label, str " ", Option.layout (List.layout SourceInfo.layout) (!sources)], Out.error) end) in Error.bug (concat ["Ssa2.TypeCheck2.checkProf: bug found in ", Label.toString l, ": ", msg]) end val _ = if not debug then () else let open Layout in outputl (seq [str "goto (", Label.layout l, str ", ", List.layout SourceInfo.layout sources, str ")"], Out.error) end val {block, sources = r} = labelInfo l in case !r of NONE => let val _ = r := SOME sources val Block.T {statements, transfer, ...} = block datatype z = datatype Statement.t datatype z = datatype ProfileExp.t val sources = Vector.fold (statements, sources, fn (s, sources) => case s of Profile pe => (case pe of Enter s => s :: sources | Leave s => (case sources of [] => bug "unmatched Leave" | s' :: sources => if SourceInfo.equals (s, s') then sources else bug "mismatched Leave")) | _ => sources) val _ = if not debug then () else let open Layout in outputl (List.layout SourceInfo.layout sources, Out.error) end val _ = if (case transfer of Call {return, ...} => let datatype z = datatype Return.t in case return of Dead => false | NonTail _ => false | Tail => true end | Raise _ => true | Return _ => true | _ => false) then (case sources of [] => () | _ => bug "nonempty sources when leaving function") else () in Transfer.foreachLabel (transfer, fn l => goto (l, sources)) end | SOME sources' => if List.equals (sources, sources', SourceInfo.equals) then () else bug "mismatched block" end val _ = goto (start, []) val _ = Vector.foreach (blocks, fn Block.T {label, ...} => rem label) in () end end fun checkProf (Program.T {functions, ...}): unit = List.foreach (functions, fn f => Function.checkProf f) val checkProf = Control.trace (Control.Detail, "checkProf") checkProf fun typeCheck (program as Program.T {datatypes, ...}): unit = let val _ = checkScopes program val _ = if !Control.profile <> Control.ProfileNone then checkProf program else () val out = Out.error val print = Out.outputc out exception TypeError fun error (msg, lay) = (print (concat ["Type error: ", msg, "\n"]) ; Layout.output (lay, out) ; print "\n" ; raise TypeError) val {get = conInfo: Con.t -> {result: Type.t, ty: Type.t, tycon: Tycon.t}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("TypeCheck.info", Con.layout)) val conTycon = #tycon o conInfo val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val result = Type.datatypee tycon in Vector.foreach (cons, fn {con, args} => setConInfo (con, {result = result, ty = Type.conApp (con, args), tycon = tycon})) end) fun inject {sum: Tycon.t, variant: Type.t}: Type.t = let val error = fn msg => error (concat ["inject: ", msg], Layout.record [("sum", Tycon.layout sum), ("variant", Type.layout variant)]) in case Type.dest variant of Type.Object {con, ...} => (case con of ObjectCon.Con c => if Tycon.equals (conTycon c, sum) then Type.datatypee sum else error "inject into wrong sum" | _ => error "inject") | _ => error "inject of no object" end fun coerce {from: Type.t, to: Type.t}: unit = if Type.equals (from, to) then () else error ("SSa2.TypeCheck2.coerce", Layout.record [("from", Type.layout from), ("to", Type.layout to)]) val coerce = Trace.trace ("Ssa2.TypeCheck2.coerce", fn {from, to} => let open Layout in record [("from", Type.layout from), ("to", Type.layout to)] end, Unit.layout) coerce fun object {args, con, resultType} = let fun err () = error ("bad object", Layout.empty) in case Type.dest resultType of Type.Object {args = args', con = con'} => (if (case (con, con') of (NONE, ObjectCon.Tuple) => true | (SOME c, ObjectCon.Con c') => Con.equals (c, c') | _ => false) andalso (Vector.foreach2 (Prod.dest args, Prod.dest args', fn ({elt = t, isMutable = _}, {elt = t', ...}) => coerce {from = t, to = t'}) ; true) then resultType else err ()) | _ => err () end fun base b = case b of Base.Object ty => ty | Base.VectorSub {index, vector} => if Type.isVector vector then let val _ = if Type.equals (index, Type.word (WordSize.seqIndex ())) then () else error ("vector-sub of non seqIndex", Layout.empty) in vector end else error ("vector-sub of non vector", Layout.empty) fun select {base: Type.t, offset: int, resultType = _}: Type.t = case Type.dest base of Type.Object {args, ...} => Prod.elt (args, offset) | _ => error ("select of non object", Layout.empty) fun update {base, offset, value} = case Type.dest base of Type.Object {args, ...} => let val {elt, isMutable} = Prod.sub (args, offset) val () = coerce {from = value, to = elt} val () = if isMutable then () else error ("update of non-mutable field", Layout.empty) in () end | _ => error ("update of non object", Layout.empty) fun filter {con, test, variant} = let val {result, ty, ...} = conInfo con val () = coerce {from = test, to = result} val () = Option.app (variant, fn to => coerce {from = ty, to = to}) in () end fun filterWord (from, s) = coerce {from = from, to = Type.word s} fun primApp {args, prim, resultType, resultVar = _} = let datatype z = datatype Prim.Name.t val () = if Type.checkPrimApp {args = args, prim = prim, result = resultType} then () else error ("bad primapp", let open Layout in seq [Prim.layout prim, str " ", tuple (Vector.toListMap (args, Type.layout))] end) in resultType end val _ = analyze {base = base, coerce = coerce, const = Type.ofConst, filter = filter, filterWord = filterWord, fromType = fn x => x, inject = inject, layout = Type.layout, object = object, primApp = primApp, program = program, select = select, update = update, useFromTypeOnBinds = true} handle e => error (concat ["analyze raised exception ", Layout.toString (Exn.layout e)], Layout.empty) val _ = Program.clear program in () end val typeCheck = Control.trace (Control.Pass, "typeCheck") typeCheck end mlton-20100608/mlton/ssa/type-check2.sig0000644000076600000240000000066311404435623016327 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYPE_CHECK2_STRUCTS = sig include ANALYZE2 end signature TYPE_CHECK2 = sig include TYPE_CHECK2_STRUCTS val typeCheck: Program.t -> unit end mlton-20100608/mlton/ssa/useless.fun0000644000076600000240000012577611404435623015717 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Useless (S: USELESS_STRUCTS): USELESS = struct open S (* useless thing elimination * remove components of tuples that are constants (use unification) * remove function arguments that are constants * build some kind of dependence graph where * - a value of ground type is useful if it is an arg to a primitive * - a tuple is useful if it contains a useful component * - a conapp is useful if it contains a useful component * or is used in a case * * If a useful tuple is coerced to another useful tuple, * then all of their components must agree (exactly). * It is trivial to convert a useful value to a useless one. * * It is also trivial to convert a useful tuple to one of its * useful components -- but this seems hard *) (* Suppose that you have a ref/array/vector that is useful, but the * components aren't -- then the components are converted to type unit, and * any primapp args must be as well. *) (* Weirdness with raise/handle. * There must be a uniform "calling convention" for raise and handle. * Hence, just because some of a handlers args are useless, that doesn't mean * that it can drop them, since they may be useful to another handler, and * hence every raise will pass them along. The problem is that it is not * possible to tell solely from looking at a function declaration whether it is * a handler or not, and in fact, there is nothing preventing a jump being used * in both ways. So, maybe the right thing is for the handler wrapper to * do * Another solution would be to unify all handler args. *) structure Value = struct structure Set = DisjointSet structure Exists = struct structure L = TwoPointLattice (val bottom = "not exists" val top = "exists") open L val mustExist = makeTop val doesExist = isTop end structure Useful = struct structure L = TwoPointLattice (val bottom = "useless" val top = "useful") open L val makeUseful = makeTop val isUseful = isTop end datatype t = T of {new: (Type.t * bool) option ref, ty: Type.t, value: value} Set.t and value = Array of {elt: slot, length: t, useful: Useful.t} | Ground of Useful.t | Ref of {arg: slot, useful: Useful.t} | Tuple of slot vector | Vector of {elt: slot, length: t} | Weak of {arg: slot, useful: Useful.t} withtype slot = t * Exists.t local fun make sel (T s) = sel (Set.! s) in val value = make #value val ty = make #ty end local open Layout in fun layout (T s) = let val {value, ...} = Set.! s in case value of Array {elt, length, ...} => seq [str "array", tuple [layout length, layoutSlot elt]] | Ground g => seq [str "ground ", Useful.layout g] | Ref {arg, useful, ...} => seq [str "ref ", record [("useful", Useful.layout useful), ("slot", layoutSlot arg)]] | Tuple vs => Vector.layout layoutSlot vs | Vector {elt, length} => seq [str "vector", tuple [layout length, layoutSlot elt]] | Weak {arg, useful} => seq [str "weak ", record [("useful", Useful.layout useful), ("slot", layoutSlot arg)]] end and layoutSlot (v, e) = tuple [Exists.layout e, layout v] end fun unify (T s, T s') = if Set.equals (s, s') then () else let val {value = v, ...} = Set.! s val {value = v', ...} = Set.! s' val _ = Set.union (s, s') in case (v, v') of (Array {length = n, elt = e, ...}, Array {length = n', elt = e', ...}) => (unify (n, n'); unifySlot (e, e')) | (Ground g, Ground g') => Useful.== (g, g') | (Ref {useful = u, arg = a}, Ref {useful = u', arg = a'}) => (Useful.== (u, u'); unifySlot (a, a')) | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', unifySlot) | (Vector {length = n, elt = e}, Vector {length = n', elt = e'}) => (unify (n, n'); unifySlot (e, e')) | (Weak {useful = u, arg = a}, Weak {useful = u', arg = a'}) => (Useful.== (u, u'); unifySlot (a, a')) | _ => Error.bug "Useless.Value.unify: strange" end and unifySlot ((v, e), (v', e')) = (unify (v, v'); Exists.== (e, e')) fun coerce {from = from as T sfrom, to = to as T sto}: unit = if Set.equals (sfrom, sto) then () else let fun coerceSlot ((v, e), (v', e')) = (coerce {from = v, to = v'} ; Exists.== (e, e')) in case (value from, value to) of (Array _, Array _) => unify (from, to) | (Ground from, Ground to) => Useful.<= (to, from) | (Ref _, Ref _) => unify (from, to) | (Tuple vs, Tuple vs') => Vector.foreach2 (vs, vs', coerceSlot) | (Vector {length = n, elt = e}, Vector {length = n', elt = e'}) => (coerce {from = n, to = n'} ; coerceSlot (e, e')) | (Weak _, Weak _) => unify (from, to) | _ => Error.bug "Useless.Value.coerce: strange" end val coerce = Trace.trace ("Useless.Value.coerce", fn {from, to} => let open Layout in record [("from", layout from), ("to", layout to)] end, Unit.layout) coerce fun coerces {from, to} = Vector.foreach2 (from, to, fn (from, to) => coerce {from = from, to = to}) fun foreach (v: t, f: Useful.t -> unit): unit = let fun loop (v: t): unit = case value v of Array {length, elt, useful} => (f useful; loop length; slot elt) | Ground u => f u | Tuple vs => Vector.foreach (vs, slot) | Ref {arg, useful} => (f useful; slot arg) | Vector {length, elt} => (loop length; slot elt) | Weak {arg, useful} => (f useful; slot arg) and slot (v, _) = loop v in loop v end (* Coerce every ground value in v to u. *) fun deepCoerce (v: t, u: Useful.t): unit = foreach (v, fn u' => Useful.<= (u', u)) val deepCoerce = Trace.trace2 ("Useless.deepCoerce", layout, Useful.layout, Unit.layout) deepCoerce fun deground (v: t): Useful.t = case value v of Ground g => g | _ => Error.bug "Useless.deground" fun someUseful (v: t): Useful.t option = case value v of Array {useful = u, ...} => SOME u | Ground u => SOME u | Ref {useful = u, ...} => SOME u | Tuple slots => Vector.peekMap (slots, someUseful o #1) | Vector {length, ...} => SOME (deground length) | Weak {useful = u, ...} => SOME u fun allOrNothing (v: t): Useful.t option = case someUseful v of NONE => NONE | SOME u => (foreach (v, fn u' => Useful.== (u, u')) ; SOME u) fun fromType (t: Type.t): t = let fun loop (t: Type.t, es: Exists.t list): t = let fun useful () = let val u = Useful.new () in Useful.addHandler (u, fn () => List.foreach (es, Exists.mustExist)) ; u end fun slot t = let val e = Exists.new () in (loop (t, e :: es), e) end val loop = fn t => loop (t, es) val value = case Type.dest t of Type.Array t => let val elt as (_, e) = slot t val length = loop (Type.word (WordSize.seqIndex ())) in Exists.addHandler (e, fn () => Useful.makeUseful (deground length)) ; Array {useful = useful (), length = length, elt = elt} end | Type.Ref t => Ref {arg = slot t, useful = useful ()} | Type.Tuple ts => Tuple (Vector.map (ts, slot)) | Type.Vector t => Vector {length = loop (Type.word (WordSize.seqIndex ())), elt = slot t} | Type.Weak t => Weak {arg = slot t, useful = useful ()} | _ => Ground (useful ()) in T (Set.singleton {ty = t, new = ref NONE, value = value}) end in loop (t, []) end fun const (c: Const.t): t = let val v = fromType (Type.ofConst c) (* allOrNothing v because constants are not transformed and their * type cannot change. So they must either be completely eliminated * or completely kept. *) val _ = allOrNothing v in v end fun detupleSlots (v: t): slot vector = case value v of Tuple ss => ss | _ => Error.bug "Useless.detupleSlots" fun detuple v = Vector.map (detupleSlots v, #1) fun tuple (vs: t vector): t = let val t = Type.tuple (Vector.map (vs, ty)) val v = fromType t val _ = Vector.foreach2 (vs, detuple v, fn (v, v') => coerce {from = v, to = v'}) in v end fun select {tuple, offset, resultType} = let val v = fromType resultType val _ = coerce {from = Vector.sub (detuple tuple, offset), to = v} in v end local fun make (err, sel) v = case value v of Vector fs => sel fs | _ => Error.bug err in val devector = make ("Useless.devector", #1 o #elt) val vectorLength = make ("Useless.vectorLength", #length) end local fun make (err, sel) v = case value v of Array fs => sel fs | _ => Error.bug err in val dearray: t -> t = make ("Useless.dearray", #1 o #elt) val arrayLength = make ("Useless.arrayLength", #length) end fun deref (r: t): t = case value r of Ref {arg, ...} => #1 arg | _ => Error.bug "Useless.deref" fun deweak (v: t): t = case value v of Weak {arg, ...} => #1 arg | _ => Error.bug "Useless.deweak" fun newType (v: t): Type.t = #1 (getNew v) and isUseful (v: t): bool = #2 (getNew v) and getNew (T s): Type.t * bool = let val {value, ty, new, ...} = Set.! s in Ref.memoize (new, fn () => let fun slot (arg: t, e: Exists.t) = let val (t, b) = getNew arg in (if Exists.doesExist e then t else Type.unit, b) end fun wrap ((t, b), f) = (f t, b) fun or ((t, b), b') = (t, b orelse b') fun maybe (u: Useful.t, s: slot, make: Type.t -> Type.t) = wrap (or (slot s, Useful.isUseful u), make) in case value of Array {useful, elt, length, ...} => or (wrap (slot elt, Type.array), Useful.isUseful useful orelse isUseful length) | Ground u => (ty, Useful.isUseful u) | Ref {arg, useful, ...} => maybe (useful, arg, Type.reff) | Tuple vs => let val (v, b) = Vector.mapAndFold (vs, false, fn ((v, e), useful) => let val (t, u) = getNew v val t = if Exists.doesExist e then SOME t else NONE in (t, u orelse useful) end) val v = Vector.keepAllMap (v, fn t => t) in (Type.tuple v, b) end | Vector {elt, length, ...} => or (wrap (slot elt, Type.vector), isUseful length) | Weak {arg, useful} => maybe (useful, arg, Type.weak) end) end val getNew = Trace.trace ("Useless.getNew", layout, Layout.tuple2 (Type.layout, Bool.layout)) getNew val isUseful = Trace.trace ("Useless.isUseful", layout, Bool.layout) isUseful val newType = Trace.trace ("Useless.newType", layout, Type.layout) newType fun newTypes (vs: t vector): Type.t vector = Vector.keepAllMap (vs, fn v => let val (t, b) = getNew v in if b then SOME t else NONE end) end structure Exists = Value.Exists fun useless (program: Program.t): Program.t = let val program as Program.T {datatypes, globals, functions, main} = eliminateDeadBlocks program val {get = conInfo: Con.t -> {args: Value.t vector, argTypes: Type.t vector, value: unit -> Value.t}, set = setConInfo, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("conInfo", Con.layout)) val {get = tyconInfo: Tycon.t -> {useful: bool ref, cons: Con.t vector}, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initRaise ("tyconInfo", Tycon.layout)) local open Value in val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => let val _ = setTyconInfo (tycon, {useful = ref false, cons = Vector.map (cons, #con)}) fun value () = fromType (Type.datatypee tycon) in Vector.foreach (cons, fn {con, args} => setConInfo (con, {value = value, argTypes = args, args = Vector.map (args, fromType)})) end) val conArgs = #args o conInfo fun conApp {con: Con.t, args: Value.t vector} = let val {args = args', value, ...} = conInfo con in coerces {from = args, to = args'} ; value () end fun filter (v: Value.t, con: Con.t, to: Value.t vector): unit = case value v of Ground g => (Useful.makeUseful g ; coerces {from = conArgs con, to = to}) | _ => Error.bug "Useless.filter: non ground" fun filterGround (v: Value.t): unit = case value v of Ground g => Useful.makeUseful g | _ => Error.bug "Useless.filterGround: non ground" val filter = Trace.trace3 ("Useless.filter", Value.layout, Con.layout, Vector.layout Value.layout, Unit.layout) filter (* This is used for primitive args, since we have no idea what * components of its args that a primitive will look at. *) fun deepMakeUseful v = let val slot = deepMakeUseful o #1 in case value v of Array {useful, length, elt} => (Useful.makeUseful useful ; deepMakeUseful length ; slot elt) | Ground u => (Useful.makeUseful u (* Make all constructor args of this tycon useful *) ; (case Type.dest (ty v) of Type.Datatype tycon => let val {useful, cons} = tyconInfo tycon in if !useful then () else (useful := true ; Vector.foreach (cons, fn con => Vector.foreach (#args (conInfo con), deepMakeUseful))) end | _ => ())) | Ref {arg, useful} => (Useful.makeUseful useful; slot arg) | Tuple vs => Vector.foreach (vs, slot) | Vector {length, elt} => (deepMakeUseful length; slot elt) | Weak {arg, useful} => (Useful.makeUseful useful; slot arg) end fun primApp {args: t vector, prim, resultVar = _, resultType, targs = _} = let val result = fromType resultType fun return v = coerce {from = v, to = result} infix dependsOn fun v1 dependsOn v2 = deepCoerce (v2, deground v1) fun arg i = Vector.sub (args, i) fun sub () = (arg 1 dependsOn result ; return (dearray (arg 0))) fun update () = let val a = dearray (arg 0) in arg 1 dependsOn a ; coerce {from = arg 2, to = a} end datatype z = datatype Prim.Name.t val _ = case Prim.name prim of Array_array => coerce {from = arg 0, to = arrayLength result} | Array_array0Const => () | Array_length => return (arrayLength (arg 0)) | Array_sub => sub () | Array_toVector => (case (value (arg 0), value result) of (Array {length = l, elt = e, ...}, Vector {length = l', elt = e', ...}) => (unify (l, l'); unifySlot (e, e')) | _ => Error.bug "Useless.primApp: Array_toVector") | Array_update => update () | FFI _ => (Vector.foreach (args, deepMakeUseful); deepMakeUseful result) | MLton_equal => Vector.foreach (args, deepMakeUseful) | MLton_hash => Vector.foreach (args, deepMakeUseful) | Ref_assign => coerce {from = arg 1, to = deref (arg 0)} | Ref_deref => return (deref (arg 0)) | Ref_ref => coerce {from = arg 0, to = deref result} | Vector_length => return (vectorLength (arg 0)) | Vector_sub => (arg 1 dependsOn result ; return (devector (arg 0))) | Weak_get => return (deweak (arg 0)) | Weak_new => coerce {from = arg 0, to = deweak result} | Word8Array_subWord _ => sub () | Word8Array_updateWord _ => update () | _ => let (* allOrNothing so the type doesn't change *) val res = allOrNothing result in if Prim.maySideEffect prim then Vector.foreach (args, deepMakeUseful) else Vector.foreach (args, fn a => case (allOrNothing a, res) of (NONE, _) => () | (SOME u, SOME u') => Useful.<= (u', u) | _ => ()) end in result end val primApp = Trace.trace ("Useless.primApp", fn {prim, args, ...} => Layout.seq [Prim.layout prim, Vector.layout layout args], layout) primApp end val {value, func, label, ...} = analyze { coerce = Value.coerce, conApp = conApp, const = Value.const, filter = filter, filterWord = filterGround o #1, fromType = Value.fromType, layout = Value.layout, primApp = primApp, program = program, select = Value.select, tuple = Value.tuple, useFromTypeOnBinds = true } open Exp Transfer (* Unify all handler args so that raise/handle has a consistent calling * convention. *) val _ = List.foreach (functions, fn f => let val {raises = fraisevs, ...} = func (Function.name f) fun coerce (x, y) = Value.coerce {from = x, to = y} in Vector.foreach (Function.blocks f, fn Block.T {transfer, ...} => case transfer of Call {func = g, return, ...} => let val {raises = graisevs, ...} = func g fun coerceRaise () = case (graisevs, fraisevs) of (NONE, NONE) => () | (NONE, SOME _) => () | (SOME _, NONE) => Error.bug "Useless.useless: raise mismatch at Caller" | (SOME vs, SOME vs') => Vector.foreach2 (vs', vs, coerce) in case return of Return.Dead => () | Return.NonTail {handler, ...} => (case handler of Handler.Caller => coerceRaise () | Handler.Dead => () | Handler.Handle h => Option.app (graisevs, fn graisevs => Vector.foreach2 (label h, graisevs, coerce))) | Return.Tail => coerceRaise () end | _ => ()) end) val _ = Control.diagnostics (fn display => let open Layout val _ = Vector.foreach (datatypes, fn Datatype.T {tycon, cons} => display (align [Tycon.layout tycon, indent (Vector.layout (fn {con, ...} => seq [Con.layout con, str " ", Vector.layout Value.layout (conArgs con)]) cons, 2)])) val _ = List.foreach (functions, fn f => let val {name, ...} = Function.dest f val _ = display (seq [str "Useless info for ", Func.layout name]) val {args, returns, raises} = func name val _ = display (record [("args", Vector.layout Value.layout args), ("returns", Option.layout (Vector.layout Value.layout) returns), ("raises", Option.layout (Vector.layout Value.layout) raises)]) val _ = Function.foreachVar (f, fn (x, _) => display (seq [Var.layout x, str " ", Value.layout (value x)])) in () end) in () end) val varExists = Value.isUseful o value val unitVar = Var.newString "unit" val bogusGlobals: Statement.t list ref = ref [] val {get = bogus, destroy, ...} = Property.destGet (Type.plist, Property.initFun (fn ty => let val var = Var.newString "bogus" in List.push (bogusGlobals, Statement.T {var = SOME var, ty = ty, exp = PrimApp {prim = Prim.bogus, targs = Vector.new1 ty, args = Vector.new0 ()}}) ; var end)) fun keepUseful (xs: Var.t vector, vs: Value.t vector): Var.t vector = Vector.keepAllMap2 (xs, vs, fn (x, v) => let val (t, b) = Value.getNew v in if b then SOME (if varExists x then x else bogus t) else NONE end) fun keepUsefulArgs (xts: (Var.t * Type.t) vector) = Vector.keepAllMap (xts, fn (x, _) => let val (t, b) = Value.getNew (value x) in if b then SOME (x, t) else NONE end) val keepUsefulArgs = Trace.trace ("Useless.keepUsefulArgs", Vector.layout (Layout.tuple2 (Var.layout, Type.layout)), Vector.layout (Layout.tuple2 (Var.layout, Type.layout))) keepUsefulArgs fun dropUseless (vs: Value.t vector, vs': Value.t vector, makeTrans: Var.t vector -> Transfer.t): Label.t * Block.t = let val l = Label.newNoname () val (formals, actuals) = Vector.unzip (Vector.map2 (vs, vs', fn (v, v') => if Value.isUseful v then let val x = Var.newNoname () in (SOME (x, Value.newType v), if Value.isUseful v' then SOME x else NONE) end else (NONE, NONE))) in (l, Block.T {label = l, args = Vector.keepAllSome formals, statements = Vector.new0 (), transfer = makeTrans (Vector.keepAllSome actuals)}) end (* Returns true if the component is the only component of the tuple * that exists. *) fun newOffset (bs: bool vector, n: int): int * bool = let val len = Vector.length bs fun loop (pos, n, i) = let val b = Vector.sub (bs, pos) in if n = 0 then (i, (i = 0 andalso not (Int.exists (pos + 1, len, fn i => Vector.sub (bs, i))))) else loop (pos + 1, n - 1, if b then i + 1 else i) end in loop (0, n, 0) end fun doitExp (e: Exp.t, resultType: Type.t, resultValue: Value.t option) = case e of ConApp {con, args} => ConApp {con = con, args = keepUseful (args, conArgs con)} | Const _ => e | PrimApp {prim, args, ...} => let val (args, argTypes) = Vector.unzip (Vector.map (args, fn x => let val (t, b) = Value.getNew (value x) in if b then (x, t) else (unitVar, Type.unit) end)) in PrimApp {prim = prim, args = args, targs = (Prim.extractTargs (prim, {args = argTypes, result = resultType, typeOps = {deArray = Type.deArray, deArrow = fn _ => Error.bug "Useless.doitExp: deArrow", deRef = Type.deRef, deVector = Type.deVector, deWeak = Type.deWeak}}))} end | Select {tuple, offset} => let val (offset, isOne) = newOffset (Vector.map (Value.detupleSlots (value tuple), Exists.doesExist o #2), offset) in if isOne then Var tuple else Select {tuple = tuple, offset = offset} end | Tuple xs => let val slots = Value.detupleSlots (valOf resultValue) val xs = Vector.keepAllMap2 (xs, slots, fn (x, (v, e)) => if Exists.doesExist e then SOME (if varExists x then x else bogus (Value.newType v)) else NONE) in if 1 = Vector.length xs then Var (Vector.sub (xs, 0)) else Tuple xs end | Var _ => e | _ => e val doitExp = Trace.trace3 ("Useless.doitExp", Exp.layout, Layout.ignore, Layout.ignore, Exp.layout) doitExp fun doitStatement (Statement.T {var, exp, ty}) = let val v = Option.map (var, value) val (ty, b) = case v of NONE => (ty, false) | SOME v => Value.getNew v fun yes ty = SOME (Statement.T {var = var, ty = ty, exp = doitExp (exp, ty, v)}) in if b then yes ty else case exp of PrimApp {prim, args, ...} => if Prim.maySideEffect prim andalso let fun arg i = Vector.sub (args, i) fun array () = Value.isUseful (Value.dearray (value (arg 0))) datatype z = datatype Prim.Name.t in case Prim.name prim of Array_update => array () | Ref_assign => Value.isUseful (Value.deref (value (arg 0))) | Word8Array_updateWord _ => array () | _ => true end then yes ty else NONE | Profile _ => yes ty | _ => NONE end val doitStatement = Trace.trace ("Useless.doitStatement", Statement.layout, Option.layout Statement.layout) doitStatement fun agree (v: Value.t, v': Value.t): bool = Value.isUseful v = Value.isUseful v' fun agrees (vs, vs') = Vector.forall2 (vs, vs', agree) val agrees = Trace.trace2 ("Useless.agrees", Vector.layout Value.layout, Vector.layout Value.layout, Bool.layout) agrees fun doitTransfer (t: Transfer.t, returns: Value.t vector option, raises: Value.t vector option) : Block.t list * Transfer.t = case t of Arith {prim, args, overflow, success, ty} => let val v = Value.fromType ty val _ = Value.Useful.makeUseful (Value.deground v) val res = Vector.new1 v val sargs = label success in if agree (v, Vector.sub (sargs, 0)) then ([], t) else let val (l, b) = dropUseless (res, sargs, fn args => Goto {dst = success, args = args}) in ([b], Arith {prim = prim, args = args, overflow = overflow, success = l, ty = ty}) end end | Bug => ([], Bug) | Call {func = f, args, return} => let val {args = fargs, returns = freturns, ...} = func f val (blocks, return) = case return of Return.Dead => ([], return) | Return.Tail => (case (returns, freturns) of (NONE, NONE) => ([], Return.Tail) | (NONE, SOME _) => Error.bug "Useless.doitTransfer: return mismatch" | (SOME _, NONE) => ([], Return.Tail) | (SOME returns, SOME freturns) => if agrees (freturns, returns) then ([], Return.Tail) else let val (l, b) = dropUseless (freturns, returns, Return) in ([b], Return.NonTail {cont = l, handler = Handler.Caller}) end) | Return.NonTail {cont, handler} => (case freturns of NONE => ([], return) | SOME freturns => let val returns = label cont in if agrees (freturns, returns) then ([], return) else let val (l, b) = dropUseless (freturns, returns, fn args => Goto {dst = cont, args = args}) in ([b], Return.NonTail {cont = l, handler = handler}) end end) in (blocks, Call {func = f, args = keepUseful (args, fargs), return = return}) end | Case {test, cases, default} => let datatype z = datatype Cases.t in case cases of Con cases => (case (Vector.length cases, default) of (0, NONE) => ([], Bug) | _ => let val (cases, blocks) = Vector.mapAndFold (cases, [], fn ((c, l), blocks) => let val args = label l in if Vector.forall (args, Value.isUseful) then ((c, l), blocks) else let val (l', b) = dropUseless (conArgs c, args, fn args => Goto {dst = l, args = args}) in ((c, l'), b :: blocks) end end) in (blocks, Case {test = test, cases = Cases.Con cases, default = default}) end) | Word (_, cs) => (* The test may be useless if there are no cases or * default, thus we must eliminate the case. *) case (Vector.length cs, default) of (0, NONE) => ([], Bug) | _ => ([], t) end | Goto {dst, args} => ([], Goto {dst = dst, args = keepUseful (args, label dst)}) | Raise xs => ([], Raise (keepUseful (xs, valOf raises))) | Return xs => ([], Return (keepUseful (xs, valOf returns))) | Runtime {prim, args, return} => ([], Runtime {prim = prim, args = args, return = return}) val doitTransfer = Trace.trace3 ("Useless.doitTransfer", Transfer.layout, Option.layout (Vector.layout Value.layout), Option.layout (Vector.layout Value.layout), Layout.tuple2 (List.layout (Label.layout o Block.label), Transfer.layout)) doitTransfer fun doitBlock (Block.T {label, args, statements, transfer}, returns: Value.t vector option, raises: Value.t vector option) : Block.t list * Block.t = let val args = keepUsefulArgs args val statements = Vector.keepAllMap (statements, doitStatement) val (blocks, transfer) = doitTransfer (transfer, returns, raises) in (blocks, Block.T {label = label, args = args, statements = statements, transfer = transfer}) end val doitBlock = Trace.trace3 ("Useless.doitBlock", Label.layout o Block.label, Option.layout (Vector.layout Value.layout), Option.layout (Vector.layout Value.layout), Layout.tuple2 (List.layout (Label.layout o Block.label), (Label.layout o Block.label))) doitBlock fun doitFunction f = let val {args, blocks, mayInline, name, start, ...} = Function.dest f val {returns = returnvs, raises = raisevs, ...} = func name val args = keepUsefulArgs args val (blocks, blocks') = Vector.mapAndFold (blocks, [], fn (block, blocks') => let val (blocks'', block) = doitBlock (block, returnvs, raisevs) in (block, blocks''::blocks') end) val blocks = Vector.concat (blocks :: List.map (blocks', Vector.fromList)) val returns = Option.map (returnvs, Value.newTypes) val raises = Option.map (raisevs, Value.newTypes) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end val datatypes = Vector.map (datatypes, fn Datatype.T {tycon, cons} => Datatype.T {tycon = tycon, cons = Vector.map (cons, fn {con, ...} => {con = con, args = Value.newTypes (conArgs con)})}) val globals = Vector.concat [Vector.new1 (Statement.T {var = SOME unitVar, ty = Type.unit, exp = Exp.unit}), Vector.keepAllMap (globals, doitStatement)] val shrink = shrinkFunction {globals = globals} val functions = List.map (functions, shrink o doitFunction) val globals = Vector.concat [Vector.fromList (!bogusGlobals), globals] val program = Program.T {datatypes = datatypes, globals = globals, functions = functions, main = main} val _ = destroy () val _ = Program.clearTop program in program end end mlton-20100608/mlton/ssa/useless.sig0000644000076600000240000000065011404435623015670 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature USELESS_STRUCTS = sig include SHRINK end signature USELESS = sig include USELESS_STRUCTS val useless: Program.t -> Program.t end mlton-20100608/mlton/ssa/zone.fun0000644000076600000240000002420011404435623015163 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Zone (S: ZONE_STRUCTS): ZONE = struct open S structure Graph = DirectedGraph local open Graph in structure Node = Node end structure Scope = UniqueId () fun zoneFunction f = let val {args, mayInline, name, raises, returns, start, ...} = Function.dest f datatype z = datatype Exp.t datatype z = datatype Statement.t val {get = labelInfo: Label.t -> {isInLoop: bool ref, isCut: bool ref}, ...} = Property.get (Label.plist, Property.initFun (fn _ => {isCut = ref false, isInLoop = ref false})) (* Mark nodes that are in loops so that we can avoid inserting tuple * constructions there. *) val {graph, nodeBlock, ...} = Function.controlFlow f val () = List.foreach (Graph.stronglyConnectedComponents graph, fn ns => let fun doit () = List.foreach (ns, fn n => #isInLoop (labelInfo (Block.label (nodeBlock n))) := true) in case ns of [n] => if Node.hasEdge {from = n, to = n} then doit () else () | _ => doit () end) val dominatorTree = Function.dominatorTree f (* Decide which labels to cut at. *) val cutDepth = !Control.zoneCutDepth fun addCuts (Tree.T (b, ts), depth: int) = let val depth = if depth = 0 then let val Block.T {label, ...} = b val {isCut, isInLoop, ...} = labelInfo label val () = if !isInLoop then Control.diagnostic (fn () => let open Layout in seq [str "skipping cut at ", Label.layout label] end) else isCut := true in cutDepth end else depth - 1 in Vector.foreach (ts, fn t => addCuts (t, depth)) end val () = addCuts (dominatorTree, cutDepth) (* Build a tuple of lives at each cut node. *) type info = {componentsRev: Var.t list ref, numComponents: int ref, scope: Scope.t, tuple: Var.t} fun newInfo () = {componentsRev = ref [], numComponents = ref 0, scope = Scope.new (), tuple = Var.newNoname ()} datatype varInfo = Global | Local of {blockCache: Var.t option ref, defScope: Scope.t, ty: Type.t, uses: {exp: Exp.t, scope: Scope.t} list ref} val {get = varInfo: Var.t -> varInfo, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initFun (fn _ => Global)) val blockSelects: {blockCache: Var.t option ref, statement: Statement.t} list ref = ref [] fun addBlockSelects (ss: Statement.t vector): Statement.t vector = let val blockSelectsV = Vector.fromList (!blockSelects) val () = Vector.foreach (blockSelectsV, fn {blockCache, ...} => blockCache := NONE) val () = blockSelects := [] in Vector.concat [Vector.map (blockSelectsV, #statement), ss] end fun define (x: Var.t, ty: Type.t, info: info): unit = setVarInfo (x, Local {blockCache = ref NONE, defScope = #scope info, ty = ty, uses = ref []}) fun replaceVar (x: Var.t, {componentsRev, numComponents, scope, tuple}: info) : Var.t = case varInfo x of Global => x | Local {blockCache, defScope, ty, uses, ...} => case !blockCache of SOME y => y | _ => if Scope.equals (defScope, scope) then x else let fun new () = let val offset = !numComponents val () = List.push (componentsRev, x) val () = numComponents := 1 + offset val exp = Select {base = Base.Object tuple, offset = offset} val () = List.push (uses, {exp = exp, scope = scope}) in exp end val exp = case !uses of [] => new () | {exp, scope = scope'} :: _ => if Scope.equals (scope, scope') then exp else new () val y = Var.new x val () = blockCache := SOME y val () = List.push (blockSelects, {blockCache = blockCache, statement = Bind {exp = exp, ty = ty, var = SOME y}}) in y end val blocks = ref [] fun loop (Tree.T (b, ts), info: info) = let val Block.T {args, label, statements, transfer} = b val {isCut = ref isCut, ...} = labelInfo label val info' = if isCut then newInfo () else info val define = fn (x, t) => define (x, t, info') val () = Vector.foreach (args, define) val statements = Vector.map (statements, fn s => let val s = Statement.replaceUses (s, fn x => replaceVar (x, info')) val () = Statement.foreachDef (s, define) in s end) val transfer = Transfer.replaceVar (transfer, fn x => replaceVar (x, info')) val statements = addBlockSelects statements val () = Vector.foreach (ts, fn t => loop (t, info')) val statements = if not isCut then statements else let val {componentsRev, tuple, ...} = info' val components = Vector.fromListRev (!componentsRev) in if 0 = Vector.length components then statements else let val componentTys = Vector.map (components, fn x => case varInfo x of Global => Error.bug "Zone.zoneFunction: global component" | Local {ty, uses, ...} => (ignore (List.pop uses) ; {elt = ty, isMutable = false})) val components = Vector.map (components, fn x => replaceVar (x, info)) val s = Bind {exp = Object {args = components, con = NONE}, ty = Type.tuple (Prod.make componentTys), var = SOME tuple} in addBlockSelects (Vector.concat [Vector.new1 s, statements]) end end val () = List.push (blocks, Block.T {args = args, label = label, statements = statements, transfer = transfer}) in () end val () = loop (dominatorTree, newInfo ()) val blocks = Vector.fromList (!blocks) in Function.new {args = args, blocks = blocks, mayInline = mayInline, name = name, raises = raises, returns = returns, start = start} end fun maybeZoneFunction (f, ac) = let val {blocks, name, ...} = Function.dest f val () = Control.diagnostic (fn () => let open Layout in seq [Func.layout name, str " has ", str " blocks."] end) in if Vector.length blocks <= !Control.maxFunctionSize then f :: ac else zoneFunction f :: ac end fun zone (Program.T {datatypes, globals, functions, main}) = Program.T {datatypes = datatypes, globals = globals, functions = List.fold (functions, [], maybeZoneFunction), main = main} end mlton-20100608/mlton/ssa/zone.sig0000644000076600000240000000055611404435623015165 0ustar mtfstaff(* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature ZONE_STRUCTS = sig include TYPE_CHECK2 end signature ZONE = sig include ZONE_STRUCTS val zone: Program.t -> Program.t end mlton-20100608/mlton/xml/0000755000076600000240000000000011404470407013511 5ustar mtfstaffmlton-20100608/mlton/xml/call-count.fun0000644000076600000240000001230311404435624016265 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CallCount(S: CALL_COUNT_STRUCTS): CALL_COUNT = struct open S open Dec PrimExp fun instrument(program as Program.T{datatypes, body}, passName: string) = if !Control.instrument then let datatype kind = None | Lam of int (* for curried lambdas, how many arrows remain *) | Prim val {get = kind: Var.t -> kind, set} = Property.new(Var.plist, Property.initConst None) fun makeLam(l: Lambda.t): kind = let fun loop(l, n) = let val {decs, result} = Exp.dest(Lambda.body l) in case decs of [MonoVal{var, exp = Lambda l, ...}] => if Var.equals(var, VarExp.var result) then loop(l, n + 1) else n | _ => n end in Lam(loop(l, 0)) end fun inc(name: string) : unit -> Dec.t = let val exp = PrimApp {prim = Prim.newNullary(concat["MLTON_inc", passName, name]), targs = [], args = []} in fn () => MonoVal{var = Var.newNoname(), ty = Type.unit, exp = exp} end val incCount = inc "Unknown" val incObvious = inc "Known" val program = Program.T{datatypes = datatypes, body = body} fun loopExp(e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e in Exp.new{decs = loopDecs decs, result = result} end and loopDecs(ds: Dec.t list): Dec.t list = case ds of [] => [] | d :: ds => case d of MonoVal{var, ty, exp} => let fun keep exp = MonoVal{var = var, ty = ty, exp = exp} :: loopDecs ds in case exp of App{func, ...} => let fun rest() = d :: loopDecs ds in case kind(VarExp.var func) of None => incCount() :: rest() | Prim => rest() | Lam n => (if n >= 0 then set(var, Lam(n - 1)) else () ; incObvious() :: rest()) end | Lambda l => (set(var, case Exp.decs(Lambda.body l) of [MonoVal{exp = PrimApp _, ...}] => Prim | _ => makeLam l) ; keep(Lambda(loopLambda l))) | Case{test, cases, default} => keep (Case{test = test, cases = List.map(cases, fn (p, e) => (p, loopExp e)), default = Option.map loopExp default}) | Handle{try, catch, handler} => keep(Handle{try = loopExp try, catch = catch, handler = loopExp handler}) | _ => d :: loopDecs ds end | PolyVal{var, tyvars, ty, exp} => PolyVal{var = var, tyvars = tyvars, ty = ty, exp = loopExp exp} :: loopDecs ds | Fun{tyvars, decs} => (List.foreach(decs, fn {var, lambda, ...} => set(var, makeLam lambda)) ; Fun{tyvars = tyvars, decs = List.map(decs, fn {var, ty, lambda} => {var = var, ty = ty, lambda = loopLambda lambda})} :: loopDecs ds) | Exception _ => d :: loopDecs ds and loopLambda(l: Lambda.t): Lambda.t = let val {arg, argType, body} = Lambda.dest l in Lambda.new{arg = arg, argType = argType, body = loopExp body} end val program = Program.T{datatypes = datatypes, body = loopExp body} in Program.clear program ; program end else program end mlton-20100608/mlton/xml/call-count.sig0000644000076600000240000000115311404435624016260 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CALL_COUNT_STRUCTS = sig include XML end signature CALL_COUNT = sig include CALL_COUNT_STRUCTS (* Instrument the program so that the C primitive of the given name * is applied at each call. * For now, the string should either be Xml or Sxml. *) val instrument: Program.t * string -> Program.t end mlton-20100608/mlton/xml/cps-transform.fun0000644000076600000240000006064711404435624017040 0ustar mtfstaff(* Copyright (C) 2007-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor CPSTransform (S: CPS_TRANSFORM_STRUCTS): CPS_TRANSFORM = struct open S datatype z = datatype Dec.t datatype z = datatype PrimExp.t fun doit (prog: Program.t): Program.t = let val Program.T {datatypes, body, overflow} = prog (* Answer type is always unit in an XML IL program. *) val ansTy = Type.unit (* Exception type is always exn in an XML IL program. *) val exnTy = Type.exn (* Style of function-type translation. *) datatype style = Curried | Mixed | Uncurried val style = Uncurried val {hom = transType, destroy = destroyTransType} = Type.makeMonoHom {con = fn (_, c, tys) => if Tycon.equals (c, Tycon.arrow) then let val argTy = Vector.sub (tys, 0) val resTy = Vector.sub (tys, 1) in case style of Curried => Type.arrow (Type.arrow (resTy, ansTy), Type.arrow (Type.arrow (exnTy, ansTy), Type.arrow (argTy, ansTy))) | Mixed => Type.arrow ((Type.tuple o Vector.new2) (Type.arrow (resTy, ansTy), Type.arrow (exnTy, ansTy)), Type.arrow (argTy, ansTy)) | Uncurried => Type.arrow ((Type.tuple o Vector.new3) (Type.arrow (resTy, ansTy), Type.arrow (exnTy, ansTy), argTy), ansTy) end else Type.con (c, tys)} (* A property to record (original) type of each bound variable. *) val {get = getVarOrigType: Var.t -> Type.t, set = setVarOrigType, ...} = Property.getSetOnce (Var.plist, Property.initRaise ("getVarOrigType", Var.layout)) val getVarExpOrigType = getVarOrigType o VarExp.var (* A mayOverflow primitive needs a special translation with a wrapper * datatype. See transPrimExp:PrimApp. *) val wrapDatatypes = ref [] val {get = getWrap, destroy = destroyWrap, ...} = Property.destGet (Type.plist, Property.initFun (fn ty => let val successCon = Con.newString "Success" val failureCon = Con.newString "Failure" val wrapTycon = Tycon.newString "Wrap" val wrapTy = Type.con (wrapTycon, Vector.new0 ()) val wrapDatatype = {cons = Vector.new2 ({arg = SOME ty, con = successCon}, {arg = SOME exnTy, con = failureCon}), tycon = wrapTycon, tyvars = Vector.new0 ()} val () = List.push (wrapDatatypes, wrapDatatype) in {successCon = successCon, failureCon = failureCon, wrapTy = wrapTy} end)) fun transVarExpWithType (x: VarExp.t) : DirectExp.t * Type.t = let val xTy = transType (getVarExpOrigType x) in (DirectExp.varExp (x, xTy), xTy) end val transVarExp = #1 o transVarExpWithType fun transLambda (l: Lambda.t): Lambda.t = let val {arg = argVar, argType = argTy, body, mayInline} = Lambda.dest l val resTy = getVarExpOrigType (Exp.result body) val argTy = transType argTy val resTy = transType resTy val kVar = Var.newString "k" val kTy = Type.arrow (resTy, ansTy) val hVar = Var.newString "h" val hTy = Type.arrow (exnTy, ansTy) val bodyKHA = transExp (body, kVar, kTy, hVar, hTy) in case style of Curried => let val bodyKH = DirectExp.lambda {arg = argVar, argType = argTy, body = bodyKHA, bodyType = ansTy, mayInline = mayInline} val bodyK = DirectExp.lambda {arg = hVar, argType = hTy, body = bodyKH, bodyType = Type.arrow (argTy, ansTy), mayInline = true} in Lambda.make {arg = kVar, argType = kTy, body = DirectExp.toExp bodyK, mayInline = true} end | Mixed => let val xVar = Var.newNoname () val xTy = Type.tuple (Vector.new2 (kTy, hTy)) val x = DirectExp.monoVar (xVar, xTy) val bodyKH = DirectExp.lambda {arg = argVar, argType = argTy, body = bodyKHA, bodyType = ansTy, mayInline = mayInline} val bodyXK = DirectExp.let1 {var = hVar, exp = (DirectExp.select {tuple = x, offset = 1, ty = hTy}), body = bodyKH} val bodyX = DirectExp.let1 {var = kVar, exp = (DirectExp.select {tuple = x, offset = 0, ty = kTy}), body = bodyXK} in Lambda.make {arg = xVar, argType = xTy, body = DirectExp.toExp bodyX, mayInline = true} end | Uncurried => let val xVar = Var.newNoname () val xTy = Type.tuple (Vector.new3 (kTy, hTy, argTy)) val x = DirectExp.monoVar (xVar, xTy) val bodyXKH = DirectExp.let1 {var = argVar, exp = (DirectExp.select {tuple = x, offset = 2, ty = argTy}), body = bodyKHA} val bodyXK = DirectExp.let1 {var = hVar, exp = (DirectExp.select {tuple = x, offset = 1, ty = hTy}), body = bodyXKH} val bodyX = DirectExp.let1 {var = kVar, exp = (DirectExp.select {tuple = x, offset = 0, ty = kTy}), body = bodyXK} in Lambda.make {arg = xVar, argType = xTy, body = DirectExp.toExp bodyX, mayInline = mayInline} end end and transPrimExp (e: PrimExp.t, eTy: Type.t, kVar: Var.t, kTy: Type.t, hVar: Var.t, hTy: Type.t): DirectExp.t = let val eTy = transType eTy val k = DirectExp.monoVar (kVar, kTy) val h = DirectExp.monoVar (hVar, hTy) fun return x = DirectExp.app {func = k, arg = x, ty = ansTy} in case e of App {arg, func} => let val (arg, argTy) = transVarExpWithType arg val func = transVarExp func in case style of Curried => let val app1 = DirectExp.app {func = func, arg = k, ty = Type.arrow (hTy, Type.arrow (argTy, ansTy))} val app2 = DirectExp.app {func = app1, arg = h, ty = Type.arrow (argTy, ansTy)} val app3 = DirectExp.app {func = app2, arg = arg, ty = ansTy} in app3 end | Mixed => let val arg2 = DirectExp.tuple {exps = Vector.new2 (k, h), ty = (Type.tuple o Vector.new2) (kTy, hTy)} val app2 = DirectExp.app {func = func, arg = arg2, ty = Type.arrow (argTy, ansTy)} val app3 = DirectExp.app {func = app2, arg = arg, ty = ansTy} in app3 end | Uncurried => let val arg3 = DirectExp.tuple {exps = Vector.new3 (k, h, arg), ty = (Type.tuple o Vector.new3) (kTy, hTy, argTy)} val app3 = DirectExp.app {func = func, arg = arg3, ty = ansTy} in app3 end end | Case {cases, default, test} => let val cases = case cases of Cases.Con cases => let val cases = Vector.map (cases, fn (Pat.T {arg, con, targs}, e) => let val arg = Option.map (arg, fn (arg, argTy) => (arg, transType argTy)) val targs = Vector.map (targs, transType) in (Pat.T {arg = arg, con = con, targs = targs}, transExp (e, kVar, kTy, hVar, hTy)) end) in Cases.Con cases end | Cases.Word (ws, cases) => let val cases = Vector.map (cases, fn (w, e) => (w, transExp (e, kVar, kTy, hVar, hTy))) in Cases.Word (ws, cases) end val default = Option.map (default, fn (e, r) => (transExp (e, kVar, kTy, hVar, hTy), r)) in DirectExp.casee {cases = cases, default = default, test = transVarExp test, ty = ansTy} end | ConApp {arg, con, targs} => (return o DirectExp.conApp) {arg = Option.map (arg, transVarExp), con = con, targs = Vector.map (targs, transType), ty = eTy} | Const c => return (DirectExp.const c) | Handle {catch = (cVar, _), handler, try} => let val h'Var = Var.newString "h" val h'Ty = Type.arrow (exnTy, ansTy) val h'Body = DirectExp.lambda {arg = cVar, argType = exnTy, body = transExp (handler, kVar, kTy, hVar, hTy), bodyType = ansTy, mayInline = true} in DirectExp.let1 {var = h'Var, exp = h'Body, body = transExp (try, kVar, kTy, h'Var, h'Ty)} end | Lambda l => let val l = transLambda l in return (DirectExp.fromLambda (l, eTy)) end | PrimApp {args, prim, targs} => let val primAppExp = DirectExp.primApp {args = Vector.map (args, transVarExp), prim = prim, targs = Vector.map (targs, transType), ty = eTy} in if Prim.mayOverflow prim then let (* A mayOverflow primitive has an * implicit raise, which is introduced * explicitly by closure-convert * (transformation from SXML to SSA). * * We leave an explicit Handle around * the primitive to catch the * exception. The non-exceptional * result goes to the (normal) * continuation, while the exception * goes to the exception continuation. * * Naively, we would do: * (k (primApp)) handle x => h x * But, this evaluates the (normal) * continuation in the context of the * handler. * * Rather, we do: * case ((Success (primApp)) * handle x => Failure x) of * Success x => k x * Failure x => h x * This evaluates the (normal) * continuation outside the context of * the handler. * * See /lib/mlton/basic/exn0.sml * and "Exceptional Syntax" by Benton * and Kennedy. * *) val {successCon, failureCon, wrapTy} = getWrap eTy val testExp = let val xVar = Var.newNoname () val x = DirectExp.monoVar (xVar, exnTy) in DirectExp.handlee {try = DirectExp.conApp {arg = SOME primAppExp, con = successCon, targs = Vector.new0 (), ty = wrapTy}, catch = (xVar, exnTy), handler = DirectExp.conApp {arg = SOME x, con = failureCon, targs = Vector.new0 (), ty = wrapTy}, ty = wrapTy} end val successCase = let val xVar = Var.newNoname () in (Pat.T {arg = SOME (xVar, eTy), con = successCon, targs = Vector.new0 ()}, DirectExp.app {func = k, arg = DirectExp.monoVar (xVar, eTy), ty = ansTy}) end val failureCase = let val xVar = Var.newNoname () in (Pat.T {arg = SOME (xVar, exnTy), con = failureCon, targs = Vector.new0 ()}, DirectExp.app {func = h, arg = DirectExp.monoVar (xVar, exnTy), ty = ansTy}) end val cases = Cases.Con (Vector.new2 (successCase, failureCase)) in DirectExp.casee {test = testExp, cases = cases, default = NONE, ty = ansTy} end else return primAppExp end | Profile _ => let (* Profile statements won't properly nest after * CPS conversion. *) in Error.bug "CPSTransform.transPrimExp: Profile" end | Raise {exn, ...} => DirectExp.app {func = h, arg = transVarExp exn, ty = ansTy} | Select {offset, tuple} => (return o DirectExp.select) {tuple = transVarExp tuple, offset = offset, ty = eTy} | Tuple xs => (return o DirectExp.tuple) {exps = Vector.map (xs, transVarExp), ty = eTy} | Var x => return (transVarExp x) end and transDec (d: Dec.t, kBody: DirectExp.t, hVar: Var.t, hTy: Type.t): DirectExp.t = let in case d of Exception _ => Error.bug "CPSTransform.transDec: Exception" | Fun {decs, tyvars} => let val decs = Vector.map (decs, fn {var, ty, lambda} => {var = var, ty = transType ty, lambda = transLambda lambda}) val d = Fun {decs = decs, tyvars = tyvars} in DirectExp.lett {decs = [d], body = kBody} end | MonoVal {var, ty, exp} => let val expTy = ty val argVar = var val argTy = transType ty val k'Var = Var.newString "k" val k'Ty = Type.arrow (argTy, ansTy) val k'Body = DirectExp.lambda {arg = argVar, argType = argTy, body = kBody, bodyType = ansTy, mayInline = true} in DirectExp.let1 {var = k'Var, exp = k'Body, body = transPrimExp (exp, expTy, k'Var, k'Ty, hVar, hTy)} end | PolyVal _ => Error.bug "CPSTransform.transDec: PolyVal" end and transExp (e: Exp.t, kVar: Var.t, kTy: Type.t, hVar: Var.t, hTy: Type.t): DirectExp.t = let val {decs, result} = Exp.dest e val k = DirectExp.monoVar (kVar, kTy) val k'Body = DirectExp.app {func = k, arg = transVarExp result, ty = ansTy} in List.foldr (decs, k'Body, fn (dec, kBody) => transDec (dec, kBody, hVar, hTy)) end (* Set (original) type of each bound variable. *) val () = Exp.foreachBoundVar (body, fn (v, _, ty) => setVarOrigType (v, ty)) (* Translate datatypes. *) val datatypes = Vector.map (datatypes, fn {cons, tycon, tyvars} => {cons = Vector.map (cons, fn {arg, con} => {arg = Option.map (arg, transType), con = con}), tycon = tycon, tyvars = tyvars}) (* Initial continuation. *) val k0 = Var.newString "k0" val k0Body = DirectExp.lambda {arg = Var.newNoname (), argType = ansTy, body = DirectExp.unit (), bodyType = ansTy, mayInline = true} val k0Ty = Type.arrow (ansTy, Type.unit) (* Initial exception continuation. *) val h0 = Var.newString "h0" val h0Body = DirectExp.lambda {arg = Var.newNoname (), argType = exnTy, body = DirectExp.unit (), bodyType = ansTy, mayInline = true} val h0Ty = Type.arrow (exnTy, Type.unit) (* Translate body, in context of initial continuations. *) val body = DirectExp.let1 {var = k0, exp = k0Body, body = DirectExp.let1 {var = h0, exp = h0Body, body = transExp (body, k0, k0Ty, h0, h0Ty)}} (* Closure-convert (transformation from SXML to SSA) introduces * every (non-main) SSA function with "raises = [exn]"; * we need a top-level handler to avoid a "raise mismatch" type * error in the SSA IL. *) val body = DirectExp.handlee {try = body, catch = (Var.newNoname (), exnTy), handler = DirectExp.unit (), ty = ansTy} val body = DirectExp.toExp body (* Fetch accumulated wrap datatypes. *) val wrapDatatypes = Vector.fromList (!wrapDatatypes) val datatypes = Vector.concat [datatypes, wrapDatatypes] val prog = Program.T {datatypes = datatypes, body = body, overflow = overflow} (* Clear and destroy properties. *) val () = Exp.clear body val () = destroyTransType () val () = destroyWrap () in prog end end mlton-20100608/mlton/xml/cps-transform.sig0000644000076600000240000000060711404435624017020 0ustar mtfstaff(* Copyright (C) 2007-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature CPS_TRANSFORM_STRUCTS = sig include SXML_TREE end signature CPS_TRANSFORM = sig include CPS_TRANSFORM_STRUCTS val doit: Program.t -> Program.t end mlton-20100608/mlton/xml/implement-exceptions.fun0000644000076600000240000005652611404435624020414 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ImplementExceptions (S: IMPLEMENT_EXCEPTIONS_STRUCTS): IMPLEMENT_EXCEPTIONS = struct open S datatype z = datatype Dec.t datatype z = datatype PrimExp.t structure Dexp = DirectExp fun doit (Program.T {datatypes, body, ...}): Program.t = let (* topLevelHandler holds the ref cell containing the function of * type exn -> unit that should be called on unhandled exceptions. *) val topLevelHandlerType = Type.arrow (Type.exn, Type.unit) val topLevelHandlerVar = Var.newNoname () val extraType = Exn.withEscape (fn escape => let val _ = Exp.foreachPrimExp (body, fn (_, _, e) => case e of PrimApp {prim, targs, ...} => (case Prim.name prim of Prim.Name.Exn_extra => escape (Vector.sub (targs, 0)) | Prim.Name.Exn_setExtendExtra => escape (Vector.sub (targs, 0)) | _ => ()) | _ => ()) in Type.unit end) val dfltExtraVar = Var.newNoname () val dfltExtraExp = if Type.isUnit extraType then Dexp.unit () else let val extraTycon = Type.tycon extraType val extraCon = Exn.withEscape (fn escape => let val _ = Vector.foreach (datatypes, fn {cons, tycon, ...} => if Tycon.equals (tycon, extraTycon) then Vector.foreach (cons, fn {arg, con, ...} => case arg of NONE => escape con | _ => ()) else ()) in Error.bug "ImplementExceptions: can't find extraCon" end) in Dexp.conApp {arg = NONE, con = extraCon, targs = Vector.new0 (), ty = extraType} end val extendExtraType = Type.arrow (extraType, extraType) val extendExtraVar = Var.newNoname () val exnNameVar = Var.newString "exnName" (* sumType is the type of the datatype with all of the exn constructors. *) val {extraDatatypes, injectSum, projectExtra, projectSum, raisee, sumTycon, sumType } = if not (!Control.exnHistory) then {extraDatatypes = Vector.new0 (), injectSum = fn e => e, projectExtra = fn _ => Dexp.monoVar (dfltExtraVar, extraType), projectSum = fn x => Dexp.monoVar (x, Type.exn), raisee = (fn {exn, extend, ty, var} => [MonoVal {var = var, ty = ty, exp = Raise {exn = exn, extend = extend}}]), sumTycon = Tycon.exn, sumType = Type.exn} else let val sumTycon = Tycon.newNoname () val sumType = Type.con (sumTycon, Vector.new0 ()) local open Type in val exnCon = Con.newNoname () val exnConArgType = tuple (Vector.new2 (extraType, sumType)) end fun makeExn {exn, extra} = let open Dexp in conApp {con = exnCon, targs = Vector.new0 (), ty = Type.exn, arg = SOME (tuple {exps = Vector.new2 (extra, exn), ty = exnConArgType})} end fun injectSum (exn: Dexp.t): Dexp.t = makeExn {exn = exn, extra = Dexp.monoVar (dfltExtraVar, extraType)} fun extractExtra x = Dexp.select {tuple = x, offset = 0, ty = extraType} fun extractSum x = Dexp.select {tuple = x, offset = 1, ty = sumType} fun extract (exn: Var.t, ty, f: Dexp.t -> Dexp.t): Dexp.t = let open Dexp val tuple = Var.newNoname () in casee {test = monoVar (exn, Type.exn), default = NONE, ty = ty, cases = Cases.Con (Vector.new1 (Pat.T {con = exnCon, targs = Vector.new0 (), arg = SOME (tuple, exnConArgType)}, f (monoVar (tuple, exnConArgType))))} end fun projectExtra (x: Var.t) = extract (x, extraType, extractExtra) fun projectSum (x: Var.t) = extract (x, sumType, extractSum) fun raisee {exn: VarExp.t, extend: bool, ty: Type.t, var = x : Var.t}: Dec.t list = let open Dexp val exp = if not extend then raisee {exn = varExp (exn, Type.exn), extend = false, ty = ty} else extract (VarExp.var exn, ty, fn tup => raisee {exn = makeExn {exn = extractSum tup, extra = app {func = deref (monoVar (extendExtraVar, Type.reff extendExtraType)), arg = extractExtra tup, ty = extraType}}, extend = false, ty = ty}) in vall {exp = exp, var = x} end val extraDatatypes = Vector.new1 {tycon = Tycon.exn, tyvars = Vector.new0 (), cons = Vector.new1 {con = exnCon, arg = SOME exnConArgType}} in {extraDatatypes = extraDatatypes, injectSum = injectSum, projectExtra = projectExtra, projectSum = projectSum, raisee = raisee, sumTycon = sumTycon, sumType = sumType} end val {get = exconInfo: Con.t -> {refVar: Var.t, make: VarExp.t option -> Dexp.t} option, set = setExconInfo, destroy} = Property.destGetSetOnce (Con.plist, Property.initConst NONE) val setExconInfo = Trace.trace2 ("ImplementExceptions.setExconInfo", Con.layout, Layout.ignore, Unit.layout) setExconInfo val exconInfo = Trace.trace ("ImplementExceptions.exconInfo", Con.layout, Layout.ignore) exconInfo fun isExcon c = case exconInfo c of NONE => false | SOME _ => true val exnValCons: {con: Con.t, arg: Type.t} list ref = ref [] val overflow = ref NONE val traceLoopDec = Trace.trace ("ImplementExceptions.loopDec", Dec.layout, List.layout Dec.layout) fun loop (e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e val decs = List.concatRev (List.fold (decs, [], fn (d, ds) => loopDec d :: ds)) in Exp.make {decs = decs, result = result} end and loopDec arg: Dec.t list = traceLoopDec (fn (dec: Dec.t) => case dec of MonoVal b => loopMonoVal b | Fun {decs, ...} => [Fun {tyvars = Vector.new0 (), decs = Vector.map (decs, fn {var, ty, lambda} => {var = var, ty = ty, lambda = loopLambda lambda})}] | Exception {con, arg} => let open Dexp val r = Var.newString "exnRef" val uniq = monoVar (r, Type.unitRef) fun conApp arg = injectSum (Dexp.conApp {con = con, targs = Vector.new0 (), ty = sumType, arg = SOME arg}) val (arg, decs, make) = case arg of NONE => (* If the exception is not value carrying, then go * ahead and make it now. *) let val exn = Var.newNoname () val _ = if Con.equals (con, Con.overflow) then overflow := SOME exn else () in (Type.unitRef, Dexp.vall {var = exn, exp = conApp uniq}, fn NONE => monoVar (exn, Type.exn) | _ => Error.bug "ImplementExceptions: nullary excon applied to arg") end | SOME t => let val tupleType = Type.tuple (Vector.new2 (Type.unitRef, t)) in (tupleType, [], fn SOME x => (conApp o tuple) {exps = Vector.new2 (uniq, varExp (x, t)), ty = tupleType} | _ => Error.bug "ImplmentExceptions: unary excon not applied to arg") end in setExconInfo (con, SOME {refVar = r, make = make}) ; List.push (exnValCons, {con = con, arg = arg}) ; vall {var = r, exp = reff (unit ())} @ decs end | _ => Error.bug "ImplementExceptions: saw unexpected dec") arg and loopMonoVal {var, ty, exp} : Dec.t list = let fun primExp e = [MonoVal {var = var, ty = ty, exp = e}] fun keep () = primExp exp fun makeExp e = Dexp.vall {var = var, exp = e} in case exp of Case {test, cases, default} => let fun normal () = primExp (Case {cases = Cases.map (cases, loop), default = (Option.map (default, fn (e, r) => (loop e, r))), test = test}) in case cases of Cases.Con cases => if Vector.isEmpty cases then normal () else let val (Pat.T {con, ...}, _) = Vector.sub (cases, 0) in if not (isExcon con) then normal () else (* convert to an exception match *) let open Dexp val defaultVar = Var.newString "default" fun callDefault () = app {func = (monoVar (defaultVar, Type.arrow (Type.unit, ty))), arg = unit (), ty = ty} val unit = Var.newString "unit" val (body, region) = case default of NONE => Error.bug "ImplementExceptions: no default for exception case" | SOME (e, r) => (fromExp (loop e, ty), r) val decs = vall {var = defaultVar, exp = lambda {arg = unit, argType = Type.unit, body = body, bodyType = ty, mayInline = true}} in makeExp (lett {decs = decs, body = casee {test = projectSum (VarExp.var test), ty = ty, default = SOME (callDefault (), region), cases = Cases.Con (Vector.map (cases, fn (Pat.T {con, arg, ...}, e) => let val refVar = Var.newNoname () val body = iff {test = equal (monoVar (refVar, Type.unitRef), monoVar (#refVar (valOf (exconInfo con)), Type.unitRef)), ty = ty, thenn = (fromExp (loop e, ty)), elsee = callDefault ()} fun make (arg, body) = (Pat.T {con = con, targs = Vector.new0 (), arg = SOME arg}, body) in case arg of NONE => make ((refVar, Type.unitRef), body) | SOME (x, t) => let val tuple = (Var.newNoname (), Type.tuple (Vector.new2 (Type.unitRef, t))) in make (tuple, detupleBind {tuple = monoVar tuple, components = Vector.new2 (refVar, x), body = body}) end end))}}) end end | _ => normal () end | ConApp {con, arg, ...} => (case exconInfo con of NONE => keep () | SOME {make, ...} => makeExp (make arg)) | Handle {try, catch = (catch, ty), handler} => primExp (Handle {try = loop try, catch = (catch, ty), handler = loop handler}) | Lambda l => primExp (Lambda (loopLambda l)) | PrimApp {args, prim, ...} => let datatype z = datatype Prim.Name.t fun deref (var, ty) = primExp (PrimApp {prim = Prim.deref, targs = Vector.new1 ty, args = Vector.new1 (VarExp.mono var)}) fun assign (var, ty) = primExp (PrimApp {prim = Prim.assign, targs = Vector.new1 ty, args = Vector.new2 (VarExp.mono var, Vector.sub (args, 0))}) in case Prim.name prim of Exn_extra => (makeExp o projectExtra) (VarExp.var (Vector.sub (args, 0))) | Exn_name => (primExp o App) {func = VarExp.mono exnNameVar, arg = Vector.sub (args, 0)} | Exn_setExtendExtra => assign (extendExtraVar, extendExtraType) | TopLevel_getHandler => deref (topLevelHandlerVar, topLevelHandlerType) | TopLevel_setHandler => assign (topLevelHandlerVar, topLevelHandlerType) | _ => primExp exp end | Raise {exn, extend} => raisee {exn = exn, extend = extend, ty = ty, var = var} | _ => keep () end and loopLambda l = let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = arg, argType = argType, body = loop body, mayInline = mayInline} end val body = Dexp.fromExp (loop body, Type.unit) val exnValCons = Vector.fromList (!exnValCons) val datatypes = Vector.concat [Vector.new1 {tycon = sumTycon, tyvars = Vector.new0 (), cons = Vector.map (exnValCons, fn {con, arg} => {con = con, arg = SOME arg})}, extraDatatypes, datatypes] val body = Dexp.let1 {body = body, exp = let val exn = Var.newNoname () in Dexp.lambda {arg = exn, argType = Type.exn, body = (Dexp.casee {test = projectSum exn, cases = Cases.Con (Vector.map (exnValCons, fn {con, arg} => (Pat.T {con = con, targs = Vector.new0 (), arg = SOME (Var.newNoname (), arg)}, Dexp.const (Const.string (Con.originalName con))))), default = NONE, ty = Type.string}), bodyType = Type.string, mayInline = true} end, var = exnNameVar} val body = Dexp.let1 {body = body, exp = (Dexp.reff (Dexp.lambda {arg = Var.newNoname (), argType = extraType, body = (Dexp.sequence o Vector.new2) (Dexp.bug "extendExtra unimplemented", Dexp.monoVar (dfltExtraVar, extraType)), bodyType = extraType, mayInline = true})), var = extendExtraVar} val body = Dexp.let1 {body = body, exp = dfltExtraExp, var = dfltExtraVar} val body = let val x = (Var.newNoname (), Type.exn) in Dexp.handlee {try = body, ty = Type.unit, catch = x, handler = Dexp.app {func = (Dexp.deref (Dexp.monoVar (topLevelHandlerVar, Type.reff topLevelHandlerType))), arg = Dexp.monoVar x, ty = Type.unit}} end val body = Dexp.let1 {var = topLevelHandlerVar, exp = Dexp.reff (Dexp.lambda {arg = Var.newNoname (), argType = Type.exn, body = Dexp.bug "toplevel handler not installed", bodyType = Type.unit, mayInline = true}), body = body} val body = Dexp.handlee {try = body, ty = Type.unit, catch = (Var.newNoname (), Type.exn), handler = Dexp.bug "toplevel handler not installed"} val body = Dexp.toExp body val program = Program.T {datatypes = datatypes, body = body, overflow = !overflow} val _ = destroy () in program end end mlton-20100608/mlton/xml/implement-exceptions.sig0000644000076600000240000000071711404435624020375 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature IMPLEMENT_EXCEPTIONS_STRUCTS = sig include SXML_TREE end signature IMPLEMENT_EXCEPTIONS = sig include IMPLEMENT_EXCEPTIONS_STRUCTS val doit: Program.t -> Program.t end mlton-20100608/mlton/xml/implement-suffix.fun0000644000076600000240000001146611404435624017531 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor ImplementSuffix (S: IMPLEMENT_SUFFIX_STRUCTS): IMPLEMENT_SUFFIX = struct open S datatype z = datatype Dec.t datatype z = datatype PrimExp.t structure Dexp = DirectExp fun doit (Program.T {datatypes, body, overflow, ...}): Program.t = let (* topLevelSuffix holds the ref cell containing the function of * type unit -> unit that should be called on program exit. *) val topLevelSuffixType = Type.arrow (Type.unit, Type.unit) val topLevelSuffixVar = Var.newNoname () fun loop (e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e val decs = List.rev (List.fold (decs, [], fn (d, ds) => loopDec d :: ds)) in Exp.make {decs = decs, result = result} end and loopDec (dec: Dec.t): Dec.t = case dec of MonoVal b => loopMonoVal b | Fun {decs, ...} => Fun {tyvars = Vector.new0 (), decs = Vector.map (decs, fn {var, ty, lambda} => {var = var, ty = ty, lambda = loopLambda lambda})} | Exception {...} => dec | _ => Error.bug "ImplementSuffix: saw unexpected dec" and loopMonoVal {var, ty, exp} : Dec.t = let fun primExp e = MonoVal {var = var, ty = ty, exp = e} fun keep () = primExp exp in case exp of Case {test, cases, default} => primExp (Case {cases = Cases.map (cases, loop), default = (Option.map (default, fn (e, r) => (loop e, r))), test = test}) | ConApp {...} => keep () | Handle {try, catch = (catch, ty), handler} => primExp (Handle {try = loop try, catch = (catch, ty), handler = loop handler}) | Lambda l => primExp (Lambda (loopLambda l)) | PrimApp {args, prim, ...} => let datatype z = datatype Prim.Name.t fun deref (var, ty) = primExp (PrimApp {prim = Prim.deref, targs = Vector.new1 ty, args = Vector.new1 (VarExp.mono var)}) fun assign (var, ty) = primExp (PrimApp {prim = Prim.assign, targs = Vector.new1 ty, args = Vector.new2 (VarExp.mono var, Vector.sub (args, 0))}) in case Prim.name prim of TopLevel_getSuffix => deref (topLevelSuffixVar, topLevelSuffixType) | TopLevel_setSuffix => assign (topLevelSuffixVar, topLevelSuffixType) | _ => keep () end | _ => keep () end and loopLambda l = let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = arg, argType = argType, body = loop body, mayInline = mayInline} end val body = Dexp.fromExp (loop body, Type.unit) val body = (Dexp.sequence o Vector.new2) (body, Dexp.app {func = (Dexp.deref (Dexp.monoVar (topLevelSuffixVar, Type.reff topLevelSuffixType))), arg = Dexp.unit (), ty = Type.unit}) val body = Dexp.let1 {var = topLevelSuffixVar, exp = Dexp.reff (Dexp.lambda {arg = Var.newNoname (), argType = Type.unit, body = Dexp.bug "toplevel suffix not installed", bodyType = Type.unit, mayInline = true}), body = body} val body = Dexp.toExp body in Program.T {datatypes = datatypes, body = body, overflow = overflow} end end mlton-20100608/mlton/xml/implement-suffix.sig0000644000076600000240000000070311404435624017513 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature IMPLEMENT_SUFFIX_STRUCTS = sig include SXML_TREE end signature IMPLEMENT_SUFFIX = sig include IMPLEMENT_SUFFIX_STRUCTS val doit: Program.t -> Program.t end mlton-20100608/mlton/xml/monomorphise.fun0000644000076600000240000004222511404435624016751 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Monomorphise (S: MONOMORPHISE_STRUCTS): MONOMORPHISE = struct open S open Xml.Atoms local open Xml in structure Xcases = Cases structure Xpat = Pat structure Xdec = Dec structure Xexp = Exp structure Xlambda = Lambda structure XprimExp = PrimExp structure Xprogram = Program structure Xtype = Type structure XvarExp = VarExp end local open Sxml in structure Scases = Cases structure Spat = Pat structure Sdec = Dec structure Sexp = Exp structure Slambda = Lambda structure SprimExp = PrimExp structure Sprogram = Program structure Stype = Type structure SvarExp = VarExp end structure Cache: sig type 'a t val new: unit -> 'a t val getOrAdd: 'a t * Stype.t vector * (unit -> 'a) -> 'a val toList: 'a t -> (Stype.t vector * 'a) list end = struct type 'a t = (Stype.t vector * Word.t * 'a) HashSet.t local val generator: Word.t = 0wx5555 val base = Random.word () in fun hash ts = Vector.fold (ts, base, fn (t, w) => Word.xorb (w * generator, Stype.hash t)) fun equal (ts, ts') = Vector.equals (ts, ts', Stype.equals) end fun new () : 'a t = HashSet.new {hash = #2} fun getOrAdd (c, ts, th) = let val hash = hash ts in (#3 o HashSet.lookupOrInsert) (c, hash, fn (ts', _, _) => equal (ts, ts'), fn () => (ts, hash, th ())) end fun toList c = HashSet.fold (c, [], fn ((ts, _, v), l) => (ts, v) :: l) end fun monomorphise (Xprogram.T {datatypes, body, ...}): Sprogram.t = let val {get = getVar: Var.t -> (Stype.t vector -> SvarExp.t), set = setVar, ...} = Property.getSet (Var.plist, Property.initRaise ("var", Var.layout)) val setVar = Trace.trace2 ("Monomorphise.setVar", Var.layout, Layout.ignore, Unit.layout) setVar val getVar = Trace.trace ("Monomorphise.getVar", Var.layout, Layout.ignore) getVar val {get = getCon: Con.t -> (Stype.t vector -> Con.t), set = setCon, destroy = destroyCon} = Property.destGetSet (Con.plist, Property.initRaise ("mono", Con.layout)) val {get = getTycon: Tycon.t -> Stype.t vector -> Stype.t, set = setTycon, destroy = destroyTycon} = Property.destGetSet (Tycon.plist, Property.initRaise ("mono", Tycon.layout)) val _ = List.foreach (Tycon.prims, fn {tycon = t, ...} => setTycon (t, fn ts => Stype.con (t, ts))) val {set = setTyvar, get = getTyvar: Tyvar.t -> Stype.t, ...} = Property.getSet (Tyvar.plist, Property.initRaise ("tyvar", Tyvar.layout)) val getTyvar = Trace.trace ("Monomorphise.getTyvar", Tyvar.layout, Stype.layout) getTyvar val setTyvar = Trace.trace2 ("Monomorphise.setTyvar", Tyvar.layout, Stype.layout, Unit.layout) setTyvar fun setTyvars (tyvs, tys) = Vector.foreach2 (tyvs, tys, setTyvar) val setTyvars = Trace.trace2 ("Monomorphise.setTyvars", Vector.layout Tyvar.layout, Vector.layout Stype.layout, Unit.layout) setTyvars fun monoType (t: Xtype.t): Stype.t = Xtype.hom {ty = t, var = getTyvar, con = fn (c, ts) => getTycon c ts} val monoType = Trace.trace ("Monomorphise.monoType", Xtype.layout, Stype.layout) monoType fun monoTypeOpt (to: Xtype.t option): Stype.t option = case to of NONE => NONE | SOME t => SOME (monoType t) fun monoTypes ts = Vector.map (ts, monoType) fun monoVar (x: Var.t, ts: Xtype.t vector): SvarExp.t = getVar x (monoTypes ts) val monoVar = Trace.trace2 ("Monomorphise.monoVar", Var.layout, Vector.layout Xtype.layout, SvarExp.layout) monoVar fun monoCon (c: Con.t, ts: Xtype.t vector): Con.t = getCon c (monoTypes ts) val monoCon = Trace.trace2 ("Monomorphise.monoCon", Con.layout, Vector.layout Xtype.layout, Con.layout) monoCon (* It is necessary to create new variables for monomorphic variables * because they still may have type variables in their type. *) fun renameMono (x, t) = let val x' = Var.new x val ve = SvarExp.mono x' fun inst ts = if 0 = Vector.length ts then ve else Error.bug "Monomorphise.renameMono: expected monomorphic instance" val _ = setVar (x, inst) in (x', monoType t) end val renameMono = Trace.trace2 ("Monomorphise.renameMono", Var.layout, Xtype.layout, Layout.tuple2 (Var.layout, Stype.layout)) renameMono fun monoPat (Xpat.T {con, targs, arg}): Spat.t = let val con = monoCon (con, targs) in Spat.T {con = con, targs = Vector.new0 (), arg = (case arg of NONE => NONE | SOME x => SOME (renameMono x))} end val monoPat = Trace.trace ("Monomorphise.monoPat", Xpat.layout, Spat.layout) monoPat val traceMonoExp = Trace.trace ("Monomorphise.monoExp", Xexp.layout, Sexp.layout) val traceMonoDec = Trace.trace ("Monomorphise.monoDec", Xdec.layout, fn (_: unit -> Sdec.t list) => Layout.empty) (*------------------------------------*) (* datatypes *) (*------------------------------------*) val newDbs: {tyvars: Tyvar.t vector, types: Stype.t vector, tycon: Tycon.t, ty: Stype.t, cons: {con: Con.t, typ: Xtype.t option, used: bool} ref vector} list ref = ref [] val _ = Vector.foreach (datatypes, fn {tyvars, tycon, cons} => let val cache = Cache.new () fun instantiate ts = Cache.getOrAdd (cache, ts, fn () => let val (tycon, cons) = if Tycon.equals (tycon, Tycon.bool) then (tycon, Vector.map (cons, fn {con, ...} => ref {con = con, typ = NONE, used = true})) else (Tycon.new tycon, Vector.map (cons, fn {con, arg} => ref {con = con, typ = arg, used = false})) val db = {tyvars = tyvars, types = ts, tycon = tycon, ty = Stype.con (tycon, Vector.new0 ()), cons = cons} val _ = List.push (newDbs, db) in db end) val _ = setTycon (tycon, #ty o instantiate) val _ = Vector.foreachi (cons, fn (n, {con, ...}) => setCon (con, fn ts => let val r as ref {con, typ, used} = Vector.sub (#cons (instantiate ts), n) in if used then con else let val con = Con.new con in r := {con = con, typ = typ, used = true} ; con end end)) in () end) val _ = monoCon (Con.truee, Vector.new0 ()) val _ = monoCon (Con.falsee, Vector.new0 ()) fun finishDbs ac = let val dbs = !newDbs val _ = newDbs := [] in case dbs of [] => ac | _ => finishDbs (List.fold (dbs, ac, fn ({tyvars, types, tycon, cons, ...}, ac) => let val cons = Vector.keepAllMap (cons, fn ref {con, typ, used} => if used then (setTyvars (tyvars, types) ; SOME {con = con, arg = monoTypeOpt typ}) else NONE) val cons = if Vector.isEmpty cons then Vector.new1 {con = Con.newNoname (), arg = NONE} else cons in {tycon = tycon, tyvars = Vector.new0 (), cons = cons} :: ac end)) end (*------------------------------------*) (* monoExp *) (*------------------------------------*) fun monoVarExp (XvarExp.T {var, targs}) = monoVar (var, targs) val monoVarExp = Trace.trace ("Monomorphise.monoVarExp", XvarExp.layout, SvarExp.layout) monoVarExp fun monoVarExps xs = Vector.map (xs, monoVarExp) fun monoExp (arg: Xexp.t): Sexp.t = traceMonoExp (fn (e: Xexp.t) => let val {decs, result} = Xexp.dest e val thunks = List.fold (decs, [], fn (dec, thunks) => monoDec dec :: thunks) val result = monoVarExp result val decs = List.fold (thunks, [], fn (thunk, decs) => thunk () @ decs) in Sexp.make {decs = decs, result = result} end) arg and monoPrimExp (e: XprimExp.t): SprimExp.t = case e of XprimExp.App {func, arg} => SprimExp.App {func = monoVarExp func, arg = monoVarExp arg} | XprimExp.Case {test, cases, default} => let val cases = case cases of Xcases.Con cases => Scases.Con (Vector.map (cases, fn (pat, exp) => (monoPat pat, monoExp exp))) | Xcases.Word (s, v) => Scases.Word (s, Vector.map (v, fn (c, e) => (c, monoExp e))) in SprimExp.Case {test = monoVarExp test, cases = cases, default = Option.map (default, fn (e, r) => (monoExp e, r))} end | XprimExp.ConApp {con, targs, arg} => let val con = monoCon (con, targs) in SprimExp.ConApp {con = con, targs = Vector.new0 (), arg = Option.map (arg, monoVarExp)} end | XprimExp.Const c => SprimExp.Const c | XprimExp.Handle {try, catch, handler} => SprimExp.Handle {try = monoExp try, catch = renameMono catch, handler = monoExp handler} | XprimExp.Lambda l => SprimExp.Lambda (monoLambda l) | XprimExp.PrimApp {prim, targs, args} => SprimExp.PrimApp {args = monoVarExps args, prim = Prim.map (prim, monoType), targs = monoTypes targs} | XprimExp.Profile e => SprimExp.Profile e | XprimExp.Raise {exn, extend} => SprimExp.Raise {exn = monoVarExp exn, extend = extend} | XprimExp.Select {tuple, offset} => SprimExp.Select {tuple = monoVarExp tuple, offset = offset} | XprimExp.Tuple xs => SprimExp.Tuple (monoVarExps xs) | XprimExp.Var x => SprimExp.Var (monoVarExp x) and monoLambda l: Slambda.t = let val {arg, argType, body, mayInline} = Xlambda.dest l val (arg, argType) = renameMono (arg, argType) in Slambda.make {arg = arg, argType = argType, body = monoExp body, mayInline = mayInline} end (*------------------------------------*) (* monoDec *) (*------------------------------------*) and monoDec arg: unit -> Sdec.t list = traceMonoDec (fn (d: Xdec.t) => case d of Xdec.MonoVal {var, ty, exp} => let val (var, ty) = renameMono (var, ty) in fn () => [Sdec.MonoVal {var = var, ty = ty, exp = monoPrimExp exp}] end | Xdec.PolyVal {var, tyvars, ty, exp} => let val cache = Cache.new () val _ = setVar (var, fn ts => (setTyvars (tyvars, ts) ; Cache.getOrAdd (cache, ts, fn () => SvarExp.mono (Var.new var)))) in fn () => List.fold (Cache.toList cache, [], fn ((ts, ve), decs) => (setVar (var, fn _ => ve) ; let val _ = setTyvars (tyvars, ts) val ty = monoType ty val {decs = decs', result} = Sexp.dest (monoExp exp) in decs' @ (Sdec.MonoVal {var = SvarExp.var ve, ty = ty, exp = SprimExp.Var result} :: decs) end)) end | Xdec.Fun {tyvars, decs} => let val cache = Cache.new () val _ = Vector.foreachi (decs, fn (n, {var, ...}) => setVar (var, fn ts => (setTyvars (tyvars, ts) ; Vector.sub (Cache.getOrAdd (cache, ts, fn () => Vector.map (decs, SvarExp.mono o Var.new o #var)), n)))) in fn () => List.revMap (Cache.toList cache, fn (ts, xs) => (Vector.foreach2 (decs, xs, fn ({var, ...}, ve) => setVar (var, fn _ => ve)) ; (Sdec.Fun {tyvars = Vector.new0 (), decs = (Vector.map2 (decs, xs, fn ({ty, lambda, ...}, ve) => let val _ = setTyvars (tyvars, ts) val ty = monoType ty val lambda = monoLambda lambda in {var = SvarExp.var ve, ty = ty, lambda = lambda} end))}))) end | Xdec.Exception {con, arg} => let val con' = if Con.equals (con, Con.overflow) then (* We avoid renaming Overflow because the closure * converter needs to recognize it. This is not * safe in general, but is OK in this case because * we know there is only one Overflow excon. *) con else Con.new con val _ = setCon (con, fn _ => con') in fn () => [Sdec.Exception {con = con', arg = monoTypeOpt arg}] end) arg (*------------------------------------*) (* main code for monomorphise *) (*------------------------------------*) val body = monoExp body val datatypes = finishDbs [] val program = Sprogram.T {datatypes = Vector.fromList datatypes, body = body, overflow = NONE} val _ = Sprogram.clear program val _ = destroyCon () val _ = destroyTycon () in program end end mlton-20100608/mlton/xml/monomorphise.sig0000644000076600000240000000101611404435624016734 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature MONOMORPHISE_STRUCTS = sig structure Xml: XML structure Sxml: SXML_EXNS sharing Xml.Atoms = Sxml.Atoms end signature MONOMORPHISE = sig include MONOMORPHISE_STRUCTS val monomorphise: Xml.Program.t -> Sxml.Program.t end mlton-20100608/mlton/xml/polyvariance.fun0000644000076600000240000005075611404435624016736 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* * Duplicate a let bound function at each variable reference * if cost is smaller than threshold. * *) functor Polyvariance (S: POLYVARIANCE_STRUCTS): POLYVARIANCE = struct open S datatype z = datatype Dec.t datatype z = datatype PrimExp.t structure Type = struct open Type fun containsArrow t = containsTycon (t, Tycon.arrow) fun isHigherOrder t = case deArrowOpt t of NONE => false | SOME (t1, t2) => containsArrow t1 orelse isHigherOrder t2 (* val isHigherOrder = Trace.trace ("Polyvariance.isHigherOrder", layout, Bool.layout) isHigherOrder *) end fun lambdaSize (Program.T {body, ...}): Lambda.t -> int = let val {get = size: Lambda.t -> int, set, ...} = Property.getSetOnce (Lambda.plist, Property.initRaise ("size", Lambda.layout)) fun loopExp (e: Exp.t, n: int): int = List.fold (Exp.decs e, n, fn (d, n) => case d of MonoVal {exp, ...} => loopPrimExp (exp, n + 1) | PolyVal {exp, ...} => loopExp (exp, n + 1) | Fun {decs, ...} => Vector.fold (decs, n, fn ({lambda, ...}, n) => loopLambda (lambda, n)) | Exception _ => n + 1) and loopLambda (l: Lambda.t, n): int = let val m = loopExp (Lambda.body l, 0) in set (l, m); m + n end and loopPrimExp (e: PrimExp.t, n: int): int = case e of Case {cases, default, ...} => let val n = n + 1 in Cases.fold (cases, (case default of NONE => n | SOME (e, _) => loopExp (e, n)), fn (e, n) => loopExp (e, n)) end | Handle {try, handler, ...} => loopExp (try, loopExp (handler, n + 1)) | Lambda l => loopLambda (l, n + 1) | Profile _ => n | _ => n + 1 val _ = loopExp (body, 0) in size end fun shouldDuplicate (program as Program.T {body, ...}, hofo, small, product) : Var.t -> bool = let val costs: (Var.t * int * int * int) list ref = ref [] val lambdaSize = lambdaSize program fun isOK (var: Var.t, size: int, numOccurrences: int): bool = let val cost = (numOccurrences - 1) * (size - small) in List.push (costs, (var, size, numOccurrences, cost)) ; cost <= product end type info = {numOccurrences: int ref, shouldDuplicate: bool ref} val {get = varInfo: Var.t -> info option, set = setVarInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) fun new {lambda = _, ty, var}: unit = if not hofo orelse Type.isHigherOrder ty then setVarInfo (var, SOME {numOccurrences = ref 0, shouldDuplicate = ref false}) else () fun loopExp (e: Exp.t, numDuplicates: int): unit = let fun loopVar (x: VarExp.t): unit = case varInfo (VarExp.var x) of NONE => () | SOME {numOccurrences, ...} => numOccurrences := !numOccurrences + numDuplicates fun loopVars xs = Vector.foreach (xs, loopVar) val {decs, result} = Exp.dest e val rec loopDecs = fn [] => loopVar result | dec :: decs => case dec of MonoVal {var, ty, exp} => (case exp of Lambda l => (new {var = var, ty = ty, lambda = l} ; loopDecs decs ; let val body = Lambda.body l val numDuplicates = case varInfo var of NONE => numDuplicates | SOME {numOccurrences, shouldDuplicate} => if isOK (var, lambdaSize l, !numOccurrences) then (shouldDuplicate := true ; !numOccurrences) else numDuplicates in loopExp (body, numDuplicates) end) | _ => let val loopExp = fn e => loopExp (e, numDuplicates) val _ = case exp of App {func, arg} => (loopVar func; loopVar arg) | Case {test, cases, default} => (loopVar test ; Cases.foreach (cases, loopExp) ; (Option.app (default, loopExp o #1))) | ConApp {arg, ...} => Option.app (arg, loopVar) | Const _ => () | Handle {try, handler, ...} => (loopExp try; loopExp handler) | Lambda _ => Error.bug "Polyvariance.loopExp.loopDecs: unexpected Lambda" | PrimApp {args, ...} => loopVars args | Profile _ => () | Raise {exn, ...} => loopVar exn | Select {tuple, ...} => loopVar tuple | Tuple xs => loopVars xs | Var x => loopVar x in loopDecs decs end) | Fun {decs = lambdas, ...} => let val _ = (Vector.foreach (lambdas, new) ; loopDecs decs) val dups = Vector.fold (lambdas, [], fn ({var, lambda, ...}, dups) => let val body = Lambda.body lambda in case varInfo var of NONE => (loopExp (body, numDuplicates); dups) | SOME info => {body = body, size = lambdaSize lambda, info = info} :: dups end) in case dups of [] => () | _ => let val size = List.fold (dups, 0, fn ({size, ...}, n) => n + size) val numOccurrences = List.fold (dups, 0, fn ({info = {numOccurrences, ...}, ...}, n) => n + !numOccurrences) in if isOK (if Vector.isEmpty lambdas then Error.bug "Polyvariance.loopExp.loopDecs: empty lambdas" else #var (Vector.sub (lambdas, 0)), size, numOccurrences) then (List.foreach (dups, fn {body, info = {shouldDuplicate, ...}, ...} => (shouldDuplicate := true ; loopExp (body, numOccurrences)))) else List.foreach (dups, fn {body, ...} => loopExp (body, numDuplicates)) end end | _ => Error.bug "Polyvariance.loopExp.loopDecs: strange dec" in loopDecs decs end val _ = loopExp (body, 1) fun sort l = List.insertionSort (l, fn ((_, _, _, c), (_, _, _, c')) => c < c') val _ = Control.diagnostics (fn layout => List.foreach (sort (!costs), fn (x, size, numOcc, c) => layout (let open Layout in seq [Var.layout x, str " ", Int.layout size, str " ", Int.layout numOcc, str " ", Int.layout c] end))) in fn x => case varInfo x of NONE => false | SOME {shouldDuplicate, ...} => !shouldDuplicate end fun duplicate (program as Program.T {datatypes, body, overflow}, hofo: bool, small: int, product: int) = let val shouldDuplicate = shouldDuplicate (program, hofo, small, product) datatype info = Replace of Var.t | Dup of { duplicates: Var.t list ref } val {get = varInfo: Var.t -> info, set = setVarInfo, ...} = Property.getSet (Var.plist, Property.initRaise ("Polyvariance.info", Var.layout)) fun loopVar (x: VarExp.t): VarExp.t = VarExp.mono (let val x = VarExp.var x in case varInfo x of Replace y => y | Dup {duplicates, ...} => let val x' = Var.new x in List.push (duplicates, x') ; x' end end) fun loopVars xs = Vector.map (xs, loopVar) fun bind (x: Var.t): Var.t = let val x' = Var.new x in setVarInfo (x, Replace x') ; x' end fun bindVarType (x, t) = (bind x, t) fun bindPat (Pat.T {con, targs, arg}) = Pat.T {con = con, targs = targs, arg = Option.map (arg, bindVarType)} fun new {lambda = _, ty = _, var}: unit = if shouldDuplicate var then setVarInfo (var, Dup {duplicates = ref []}) else ignore (bind var) fun loopExp (e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e in Exp.make (loopDecs (decs, result)) end and loopLambda (l: Lambda.t): Lambda.t = let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = bind arg, argType = argType, body = loopExp body, mayInline = mayInline} end and loopDecs (ds: Dec.t list, result): {decs: Dec.t list, result: VarExp.t} = case ds of [] => {decs = [], result = loopVar result} | d :: ds => case d of MonoVal {var, ty, exp} => (case exp of Lambda l => let val _ = new {var = var, ty = ty, lambda = l} val {decs, result} = loopDecs (ds, result) val decs = case varInfo var of Replace var => MonoVal {var = var, ty = ty, exp = Lambda (loopLambda l)} :: decs | Dup {duplicates, ...} => List.fold (!duplicates, decs, fn (var, decs) => MonoVal {var = var, ty = ty, exp = Lambda (loopLambda l)} :: decs) in {decs = decs, result = result} end | _ => let val exp = case exp of App {func, arg} => App {func = loopVar func, arg = loopVar arg} | Case {test, cases, default} => let datatype z = datatype Cases.t val cases = case cases of Con cases => Con (Vector.map (cases, fn (p, e) => (bindPat p, loopExp e))) | Word (s, v) => Word (s, (Vector.map (v, fn (z, e) => (z, loopExp e)))) in Case {test = loopVar test, cases = cases, default = Option.map (default, fn (e, r) => (loopExp e, r))} end | ConApp {con, targs, arg} => ConApp {con = con, targs = targs, arg = Option.map (arg, loopVar)} | Const _ => exp | Handle {try, catch, handler} => Handle {try = loopExp try, catch = bindVarType catch, handler = loopExp handler} | Lambda _ => Error.bug "Polyvariance.loopDecs: unexpected Lambda" | PrimApp {prim, targs, args} => PrimApp {prim = prim, targs = targs, args = loopVars args} | Profile _ => exp | Raise {exn, extend} => Raise {exn = loopVar exn, extend = extend} | Select {tuple, offset} => Select {tuple = loopVar tuple, offset = offset} | Tuple xs => Tuple (loopVars xs) | Var x => Var (loopVar x) val var = bind var val {decs, result} = loopDecs (ds, result) in {decs = (MonoVal {var = var, ty = ty, exp = exp} :: decs), result = result} end) | Fun {decs, ...} => let val _ = Vector.foreach (decs, new) val {decs = ds, result} = loopDecs (ds, result) val ac = ref [Vector.keepAllMap (decs, fn {var, ty, lambda} => case varInfo var of Replace var => SOME {var = var, ty = ty, lambda = loopLambda lambda} | Dup _ => NONE)] val dups = Vector.keepAllMap (decs, fn dec as {var, ...} => case varInfo var of Replace _ => NONE | Dup {duplicates, ...} => SOME (dec, !duplicates)) val _ = Vector.foreach (dups, fn ({var, ...}, duplicates) => List.foreach (duplicates, fn var' => let val vars = Vector.map (dups, fn ({var = var'', ...}, _) => if Var.equals (var, var'') then (setVarInfo (var, Replace var') ; var') else bind var'') in List.push (ac, Vector.map2 (dups, vars, fn (({ty, lambda, ...}, _), var) => {var = var, ty = ty, lambda = loopLambda lambda})) end)) val decs = Vector.concat (!ac) in {decs = Fun {tyvars = Vector.new0 (), decs = decs} :: ds, result = result} end | _ => Error.bug "Polyvariance.loopDecs: saw bogus dec" val body = loopExp body val overflow = Option.map (overflow, fn x => case varInfo x of Replace y => y | _ => Error.bug "Polyvariance.duplicate: duplicating Overflow?") val program = Program.T {datatypes = datatypes, body = body, overflow = overflow} val _ = Program.clear program in program end val duplicate = fn p => case !Control.polyvariance of NONE => p | SOME {hofo, rounds, small, product} => let fun loop (p, n) = if n = rounds then p else let val p = Control.pass {display = Control.Layouts Program.layouts, name = "duplicate" ^ (Int.toString (n + 1)), stats = Program.layoutStats, style = Control.No, suffix = "post.xml", thunk = fn () => shrink (duplicate (p, hofo, small, product))} in loop (p, n + 1) end in loop (p, 0) end end mlton-20100608/mlton/xml/polyvariance.sig0000644000076600000240000000073611404435624016721 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature POLYVARIANCE_STRUCTS = sig include SHRINK end signature POLYVARIANCE = sig include POLYVARIANCE_STRUCTS val duplicate: Program.t -> Program.t end mlton-20100608/mlton/xml/scc-funs.fun0000644000076600000240000001312711404435624015752 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SccFuns (S: SCC_FUNS_STRUCTS): SCC_FUNS = struct open S open Dec PrimExp structure Graph = DirectedGraph structure Node = Graph.Node fun sccFuns (Program.T {datatypes, body, overflow}) = let (* For each function appearing in a fun dec record its node, which will * have edges to the nodes of other functions declared in the same dec * if they appear in its body. *) val {get = funInfo: Var.t -> { node: unit Node.t, visit: (unit -> unit) ref } option, set = setFunInfo, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) val {get = nodeLambda, set = setNodeLambda, ...} = Property.getSetOnce (Node.plist, Property.initRaise ("lambda", Node.layout)) fun loopVar x = case funInfo x of NONE => () | SOME {visit, ...} => !visit () val loopVarExp = loopVar o VarExp.var fun loopVarExps xs = Vector.foreach (xs, loopVarExp) fun loopLambda (l: Lambda.t): Lambda.t = let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = arg, argType = argType, body = loopExp body, mayInline = mayInline} end and loopPrimExp (e: PrimExp.t): PrimExp.t = case e of App {func, arg} => (loopVarExp func; loopVarExp arg; e) | Case {test, cases, default} => (loopVarExp test ; Case {cases = Cases.map (cases, loopExp), default = Option.map (default, fn (e, r) => (loopExp e, r)), test = test}) | ConApp {arg, ...} => (Option.app (arg, loopVarExp); e) | Const _ => e | Handle {try, catch, handler} => Handle {try = loopExp try, catch = catch, handler = loopExp handler} | Lambda l => Lambda (loopLambda l) | PrimApp {args, ...} => (loopVarExps args; e) | Profile _ => e | Raise {exn, ...} => (loopVarExp exn; e) | Select {tuple, ...} => (loopVarExp tuple; e) | Tuple xs => (loopVarExps xs; e) | Var x => (loopVarExp x; e) and loopExp (e: Exp.t): Exp.t = let val {decs, result} = Exp.dest e val decs = List.rev (List.fold (decs, [], fn (dec, decs) => case dec of MonoVal {var, ty, exp} => MonoVal {var = var, ty = ty, exp = loopPrimExp exp} :: decs | PolyVal {var, tyvars, ty, exp} => PolyVal {var = var, tyvars = tyvars, ty = ty, exp = loopExp exp} :: decs | Exception _ => dec :: decs | Fun {tyvars, decs = lambdas} => let val g = Graph.new () val _ = Vector.foreach (lambdas, fn {var, ...} => setFunInfo (var, SOME {node = Graph.newNode g, visit = ref ignore})) val _ = Vector.foreach (lambdas, fn {var, ty, lambda} => let val {node = from, ...} = valOf (funInfo var) in Vector.foreach (lambdas, fn {var = x, ...} => let val {visit, node = to} = valOf (funInfo x) in visit := (fn () => let val _ = Graph.addEdge (g, {from = from, to = to}) in visit := ignore end) end) ; (setNodeLambda (from, {var = var, ty = ty, lambda = loopLambda lambda})) ; (Vector.foreach (lambdas, fn {var, ...} => let val {visit, ...} = valOf (funInfo var) in visit := ignore end)) end) in List.map (Graph.stronglyConnectedComponents g, fn nodes => Fun {tyvars = tyvars, decs = Vector.fromListMap (nodes, nodeLambda)}) @ decs end)) val _ = loopVarExp result in Exp.make {decs = decs, result = result} end in Program.T {datatypes = datatypes, body = loopExp body, overflow = overflow} end end mlton-20100608/mlton/xml/scc-funs.sig0000644000076600000240000000101711404435624015737 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* Compute strongly connected components on fun decs to make them * as small as possible. *) signature SCC_FUNS_STRUCTS = sig include TYPE_CHECK end signature SCC_FUNS = sig include SCC_FUNS_STRUCTS val sccFuns: Program.t -> Program.t end mlton-20100608/mlton/xml/shrink.fun0000644000076600000240000006415611404435624015537 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* This simplifier is based on the following article. * Shrinking Lambda Expressions in Linear Time. * Journal of Functional Programming. Vol 7, no 5, 1997. *) functor Shrink (S: SHRINK_STRUCTS): SHRINK = struct open S open Dec PrimExp val tracePrimApplyInfo = Trace.info "Xml.Shrink.Prim.apply" val traceShrinkExp = Trace.trace ("Xml.Shrink.shrinkExp", Exp.layout, Exp.layout) val traceShrinkLambda = Trace.trace ("Xml.Shrink.shrinkLambda", Lambda.layout, Lambda.layout) fun inc (r: int ref, n) = let val n = !r + n in Assert.assert ("Xml.Shrink.inc", fn () => n >= 0) ; r := n end structure VarInfo = struct datatype t = Mono of monoVarInfo | Poly of VarExp.t and value = ConApp of {con: Con.t, targs: Type.t vector, arg: t option} | Const of Const.t | Lambda of {isInlined: bool ref, lam: Lambda.t} | Tuple of t vector withtype monoVarInfo = {numOccurrences: int ref, value: value option ref, varExp: VarExp.t} local open Layout in val rec layout = fn Mono {numOccurrences, value, varExp} => record [("numOccurrences", Int.layout (!numOccurrences)), ("value", Option.layout layoutValue (!value)), ("varExp", VarExp.layout varExp)] | Poly x => seq [str "Poly ", VarExp.layout x] and layoutValue = fn ConApp {con, arg, ...} => seq [Con.layout con, case arg of NONE => empty | SOME i => paren (layout i)] | Const c => Const.layout c | Lambda {isInlined, ...} => seq [str "Lambda ", Bool.layout (!isInlined)] | Tuple is => Vector.layout layout is end val inc = fn (i, n) => case i of Mono {numOccurrences = r, ...} => inc (r, n) | Poly _ => () val inc = Trace.trace2 ("Xml.Shrink.VarInfo.inc", layout, Int.layout, Unit.layout) inc fun inc1 i = inc (i, 1) val inc1 = Trace.trace ("Xml.Shrink.VarInfo.inc1", layout, Unit.layout) inc1 fun delete i = inc (i, ~1) val delete = Trace.trace ("Xml.Shrink.VarInfo.delete", layout, Unit.layout) delete fun deletes is = Vector.foreach (is, delete) val varExp = fn Mono {varExp, ...} => varExp | Poly x => x fun equals (vi1, vi2) = VarExp.equals (varExp vi1, varExp vi2) end structure InternalVarInfo = struct datatype t = VarInfo of VarInfo.t | Self val layout = fn VarInfo i => VarInfo.layout i | Self => Layout.str "self" end structure MonoVarInfo = struct type t = VarInfo.monoVarInfo end structure Value = struct datatype t = datatype VarInfo.value fun toPrimExp v = case v of ConApp {con, targs, arg} => PrimExp.ConApp {con = con, targs = targs, arg = Option.map (arg, VarInfo.varExp)} | Const c => PrimExp.Const c | Lambda {lam, ...} => PrimExp.Lambda lam | Tuple vs => PrimExp.Tuple (Vector.map (vs, VarInfo.varExp)) end fun shrinkOnce (Program.T {datatypes, body, overflow}) = let (* Keep track of the number of constuctors in each datatype so that * we can eliminate redundant defaults. *) val {get = conNumCons: Con.t -> int , set = setConNumCons, ...} = Property.getSetOnce (Con.plist, Property.initConst ~1) val _ = Vector.foreach (datatypes, fn {cons, ...} => let val n = Vector.length cons in Vector.foreach (cons, fn {con, ...} => setConNumCons (con, n)) end) fun isExhaustive (cases: exp Cases.t): bool = case cases of Cases.Con v => (0 < Vector.length v andalso (Vector.length v = conNumCons (Pat.con (#1 (Vector.sub (v, 0)))))) | _ => false val {get = varInfo: Var.t -> InternalVarInfo.t, set = setVarInfo, ...} = Property.getSet (Var.plist, Property.initRaise ("shrink varInfo", Var.layout)) val setVarInfo = Trace.trace2 ("Xml.Shrink.setVarInfo", Var.layout, InternalVarInfo.layout, Unit.layout) setVarInfo val varInfo = Trace.trace ("Xml.Shrink.varInfo", Var.layout, InternalVarInfo.layout) varInfo fun monoVarInfo x = case varInfo x of InternalVarInfo.VarInfo (VarInfo.Mono i) => i | _ => Error.bug "Xml.Shrink.monoVarInfo" fun varExpInfo (x as VarExp.T {var, ...}): VarInfo.t = case varInfo var of InternalVarInfo.Self => VarInfo.Poly x | InternalVarInfo.VarInfo i => i val varExpInfo = Trace.trace ("Xml.Shrink.varExpInfo", VarExp.layout, VarInfo.layout) varExpInfo fun varExpInfos xs = Vector.map (xs, varExpInfo) fun replaceInfo (x: Var.t, {numOccurrences = r, ...}: MonoVarInfo.t, i: VarInfo.t): unit = (VarInfo.inc (i, !r) ; setVarInfo (x, InternalVarInfo.VarInfo i)) val replaceInfo = Trace.trace ("Xml.Shrink.replaceInfo", fn (x, _, i) => Layout.tuple [Var.layout x, VarInfo.layout i], Unit.layout) replaceInfo fun replace (x, i) = replaceInfo (x, monoVarInfo x, i) val shrinkVarExp = VarInfo.varExp o varExpInfo local fun handleBoundVar (x, ts, _) = setVarInfo (x, if Vector.isEmpty ts then (InternalVarInfo.VarInfo (VarInfo.Mono {numOccurrences = ref 0, value = ref NONE, varExp = VarExp.mono x})) else InternalVarInfo.Self) fun handleVarExp x = VarInfo.inc1 (varExpInfo x) in fun countExp (e: Exp.t): unit = Exp.foreach {exp = e, handleBoundVar = handleBoundVar, handleExp = fn _ => (), handlePrimExp = fn _ => (), handleVarExp = handleVarExp} end fun deleteVarExp (x: VarExp.t): unit = VarInfo.delete (varExpInfo x) fun deleteExp (e: Exp.t): unit = Exp.foreachVarExp (e, deleteVarExp) val deleteExp = Trace.trace ("Xml.Shrink.deleteExp", Exp.layout, Unit.layout) deleteExp fun deleteLambda l = deleteExp (Lambda.body l) fun primApp (prim: Type.t Prim.t, args: VarInfo.t vector) : (Type.t, VarInfo.t) Prim.ApplyResult.t = let val args' = Vector.map (args, fn vi => case vi of VarInfo.Poly _ => Prim.ApplyArg.Var vi | VarInfo.Mono {value, ...} => (case !value of SOME (Value.ConApp {con, arg, ...}) => if isSome arg then Prim.ApplyArg.Var vi else Prim.ApplyArg.Con {con = con, hasArg = false} | SOME (Value.Const c) => Prim.ApplyArg.Const c | _ => Prim.ApplyArg.Var vi)) in Trace.traceInfo' (tracePrimApplyInfo, fn (p, args, _) => let open Layout in seq [Prim.layout p, str " ", List.layout (Prim.ApplyArg.layout (VarExp.layout o VarInfo.varExp)) args] end, Prim.ApplyResult.layout (VarExp.layout o VarInfo.varExp)) Prim.apply (prim, Vector.toList args', VarInfo.equals) end (*---------------------------------------------------*) (* shrinkExp *) (*---------------------------------------------------*) fun shrinkExp arg: Exp.t = traceShrinkExp (fn (e: Exp.t) => let val {decs, result} = Exp.dest e in Exp.make {decs = shrinkDecs decs, result = shrinkVarExp result} end) arg and shrinkDecs (decs: Dec.t list): Dec.t list = case decs of [] => [] | dec :: decs => case dec of Exception _ => dec :: shrinkDecs decs | PolyVal {var, tyvars, ty, exp} => Dec.PolyVal {var = var, tyvars = tyvars, ty = ty, exp = shrinkExp exp} :: shrinkDecs decs | Fun {tyvars, decs = decs'} => if Vector.isEmpty tyvars then let val decs' = Vector.keepAll (decs', fn {lambda, var, ...} => let val {numOccurrences, value, ...} = monoVarInfo var in if 0 = !numOccurrences then (deleteLambda lambda; false) else (value := (SOME (Value.Lambda {isInlined = ref false, lam = lambda})) ; true) end) val decs = shrinkDecs decs (* Need to walk over all the decs and remove * their value before shrinking any of them * because they are mutually recursive. *) val decs' = Vector.keepAll (decs', fn {var, lambda, ...} => let val {numOccurrences, value, ...} = monoVarInfo var in case !value of SOME (Value.Lambda {isInlined, ...}) => not (!isInlined) andalso if 0 = !numOccurrences then (deleteLambda lambda ; false) else (value := NONE; true) | _ => Error.bug "Xml.Shrink.shrinkDecs: should be a lambda" end) in if Vector.isEmpty decs' then decs else Dec.Fun {tyvars = tyvars, decs = Vector.map (decs', fn {var, ty, lambda} => {var = var, ty = ty, lambda = shrinkLambda lambda})} :: decs end else Dec.Fun {tyvars = tyvars, decs = Vector.map (decs', fn {var, ty, lambda} => {var = var, ty = ty, lambda = shrinkLambda lambda})} :: shrinkDecs decs | MonoVal b => shrinkMonoVal (b, fn () => shrinkDecs decs) and shrinkMonoVal ({var, ty, exp}, rest: unit -> Dec.t list) = let val info as {numOccurrences, value, ...} = monoVarInfo var fun finish (exp, decs) = MonoVal {var = var, ty = ty, exp = exp} :: decs fun nonExpansive (delete: unit -> unit, set: unit -> (unit -> PrimExp.t) option) = if 0 = !numOccurrences then (delete (); rest ()) else let val s = set () val decs = rest () in if 0 = !numOccurrences then (delete (); decs) else (case s of NONE => decs | SOME mk => finish (mk (), decs)) end fun expansive (e: PrimExp.t) = finish (e, rest ()) fun nonExpansiveValue (delete, v: Value.t) = nonExpansive (delete, fn () => (value := SOME v ; SOME (fn () => Value.toPrimExp v))) fun expression (e: Exp.t): Dec.t list = let val {decs = decs', result} = Exp.dest (shrinkExp e) val _ = replaceInfo (var, info, varExpInfo result) val decs = rest () in decs' @ decs end in case exp of App {func, arg} => let val arg = varExpInfo arg fun normal func = expansive (App {func = func, arg = VarInfo.varExp arg}) in case varExpInfo func of VarInfo.Poly x => normal x | VarInfo.Mono {numOccurrences, value, varExp, ...} => case (!numOccurrences, !value) of (1, SOME (Value.Lambda {isInlined, lam = l})) => if not (Lambda.mayInline l) then normal varExp else let val {arg = form, body, ...} = Lambda.dest l in VarInfo.delete arg ; replace (form, arg) ; isInlined := true ; numOccurrences := 0 ; expression body end | _ => normal varExp end | Case {test, cases, default} => let fun match (cases, f): Dec.t list = let val _ = deleteVarExp test fun step (i, (c, e), ()) = if f c then (Vector.foreachR (cases, i + 1, Vector.length cases, deleteExp o #2) ; Option.app (default, deleteExp o #1) ; Vector.Done (expression e)) else (deleteExp e; Vector.Continue ()) fun done () = case default of SOME (e, _) => expression e | NONE => Error.bug "Xml.Shrink.shrinkMonoVal: Case, match" in Vector.fold' (cases, 0, (), step, done) end fun normal test = let (* Eliminate redundant default case. *) val default = if isExhaustive cases then (Option.app (default, deleteExp o #1) ; NONE) else Option.map (default, fn (e, r) => (shrinkExp e, r)) in expansive (Case {test = test, cases = Cases.map (cases, shrinkExp), default = default}) end in case varExpInfo test of VarInfo.Poly test => normal test | VarInfo.Mono {value, varExp, ...} => case (cases, !value) of (Cases.Con cases, SOME (Value.ConApp {con = c, arg, ...})) => let val match = fn f => match (cases, fn Pat.T {con = c', arg, ...} => Con.equals (c, c') andalso f arg) in case arg of NONE => match Option.isNone | SOME v => match (fn SOME (x, _) => (replace (x, v); true) | _ => false) end | (_, SOME (Value.Const c)) => (case (cases, c) of (Cases.Word (_, l), Const.Word w) => match (l, fn w' => WordX.equals (w, w')) | _ => Error.bug "Xml.Shrink.shrinkMonoVal: Case, strange case") | (_, NONE) => normal varExp | _ => Error.bug "Xml.Shrink.shrinkMonoVal: Case, default" end | ConApp {con, targs, arg} => if Con.equals (con, Con.overflow) then expansive (ConApp {con = con, targs = targs, arg = Option.map (arg, shrinkVarExp)}) else let val arg = Option.map (arg, varExpInfo) in nonExpansiveValue (fn () => Option.app (arg, VarInfo.delete), Value.ConApp {con = con, targs = targs, arg = arg}) end | Const c => nonExpansiveValue (fn () => (), Value.Const c) | Handle {try, catch, handler} => expansive (Handle {try = shrinkExp try, catch = catch, handler = shrinkExp handler}) | Lambda l => let val isInlined = ref false in nonExpansive (fn () => if !isInlined then () else deleteLambda l, fn () => (value := SOME (Value.Lambda {isInlined = isInlined, lam = l}) ; SOME (fn () => Lambda (shrinkLambda l)))) end | PrimApp {prim, args, targs} => let val args = varExpInfos args fun doit {prim, targs, args} = let fun make () = PrimApp {prim = prim, targs = targs, args = Vector.map (args, VarInfo.varExp)} in if Prim.maySideEffect prim then expansive (make ()) else nonExpansive (fn () => VarInfo.deletes args, fn () => SOME make) end fun default () = doit {prim = prim, targs = targs, args = args} datatype z = datatype Prim.ApplyResult.t in case primApp (prim, args) of Apply (prim, args') => let val args' = Vector.fromList args' val {no = unused, ...} = Vector.partition (args, fn arg => Vector.exists (args', fn arg' => VarInfo.equals (arg, arg'))) val _ = VarInfo.deletes unused in doit {prim = prim, targs = targs, args = args'} end | Bool b => let val _ = VarInfo.deletes args in nonExpansiveValue (fn () => (), Value.ConApp {con = Con.fromBool b, targs = Vector.new0 (), arg = NONE}) end | Const c => let val _ = VarInfo.deletes args in nonExpansiveValue (fn () => (), Value.Const c) end | Var x => let val _ = Vector.foreach (args, fn arg => if VarInfo.equals (arg, x) then () else VarInfo.delete arg) in replaceInfo (var, info, x) ; VarInfo.delete x ; rest () end | _ => default () end | Profile _ => expansive exp | Raise {exn, extend} => expansive (Raise {exn = shrinkVarExp exn, extend = extend}) | Select {tuple, offset} => let fun normal x = Select {tuple = x, offset = offset} in case varExpInfo tuple of VarInfo.Poly x => finish (normal x, rest ()) | VarInfo.Mono {numOccurrences, value, varExp, ...} => nonExpansive (fn () => inc (numOccurrences, ~1), fn () => case !value of NONE => SOME (fn () => normal varExp) | SOME (Value.Tuple vs) => (inc (numOccurrences, ~1) ; replaceInfo (var, info, Vector.sub (vs, offset)) ; NONE) | _ => Error.bug "Xml.Shrink.shrinkMonoVal: Select") end | Tuple xs => let val xs = varExpInfos xs in nonExpansiveValue (fn () => VarInfo.deletes xs, Value.Tuple xs) end | Var x => let val x = varExpInfo x in replaceInfo (var, info, x) ; VarInfo.delete x ; rest () end end and shrinkLambda l: Lambda.t = traceShrinkLambda (fn l => let val {arg, argType, body, mayInline} = Lambda.dest l in Lambda.make {arg = arg, argType = argType, body = shrinkExp body, mayInline = mayInline} end) l val _ = countExp body val _ = Option.app (overflow, fn x => case varInfo x of InternalVarInfo.VarInfo i => VarInfo.inc1 i | _ => Error.bug "Xml.Shrink.shrinkOnce: strange overflow var") val body = shrinkExp body (* Must lookup the overflow variable again because it may have been set * during shrinking. *) val overflow = Option.map (overflow, fn x => case varInfo x of InternalVarInfo.VarInfo i => VarExp.var (VarInfo.varExp i) | _ => Error.bug "Xml.Shrink.shrinkOnce: strange overflow var") val _ = Exp.clear body val _ = Vector.foreach (datatypes, fn {cons, ...} => Vector.foreach (cons, Con.clear o #con)) in Program.T {datatypes = datatypes, body = body, overflow = overflow} end val shrinkOnce = Trace.trace ("Xml.Shrink.shrinkOnce", Program.layout, Program.layout) shrinkOnce val shrink = shrinkOnce o shrinkOnce structure SccFuns = SccFuns (S) val shrink = shrink o SccFuns.sccFuns val shrink = Trace.trace ("Xml.Shrink.shrink", Program.layout, Program.layout) shrink end mlton-20100608/mlton/xml/shrink.sig0000644000076600000240000000064711404435624015524 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SHRINK_STRUCTS = sig include TYPE_CHECK end signature SHRINK = sig include SHRINK_STRUCTS val shrink: Program.t -> Program.t end mlton-20100608/mlton/xml/simplify-types.fun0000644000076600000240000002735711404435624017241 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SimplifyTypes (S: SIMPLIFY_TYPES_STRUCTS): SIMPLIFY_TYPES = struct open S structure I = Input structure O = Output open I.Atoms structure PowerSetLat = struct datatype t = T of {isIn: bool ref, whenIn: (unit -> unit) list ref} vector fun isIn (T v, i) = ! (#isIn (Vector.sub (v, i))) fun new (size: int) = T (Vector.tabulate (size, fn _ => {isIn = ref false, whenIn = ref []})) fun add (T v, i) = let val {isIn, whenIn, ...} = Vector.sub (v, i) in if !isIn then () else (isIn := true ; List.foreach (!whenIn, fn f => f ())) end fun whenIn (T v, i, f) = let val {isIn, whenIn, ...} = Vector.sub (v, i) in if !isIn then f () else List.push (whenIn, f) end end fun simplifyTypes (I.Program.T {body, datatypes, overflow}) = let val {get = tyconInfo: Tycon.t -> {used: PowerSetLat.t} option, set = setTyconInfo, ...} = Property.getSetOnce (Tycon.plist, Property.initConst NONE) val _ = Vector.foreach (datatypes, fn {tycon, tyvars, ...} => setTyconInfo (tycon, SOME {used = PowerSetLat.new (Vector.length tyvars)})) val _ = Vector.foreach (datatypes, fn {cons, tycon, tyvars} => let val {get = tyvarIndex, set = setTyvarIndex, rem, ...} = Property.getSet (Tyvar.plist, Property.initRaise ("index", Tyvar.layout)) val _ = Vector.foreachi (tyvars, fn (i, a) => setTyvarIndex (a, i)) val {used, ...} = valOf (tyconInfo tycon) val {destroy, hom} = I.Type.makeHom {con = (fn (_, tc, ts) => fn () => case tyconInfo tc of NONE => Vector.foreach (ts, fn t => t ()) | SOME {used, ...} => Vector.foreachi (ts, fn (i, t) => PowerSetLat.whenIn (used, i, t))), var = (fn (_, a) => let val i = tyvarIndex a in fn () => PowerSetLat.add (used, i) end)} val _ = Vector.foreach (cons, fn {arg, ...} => case arg of NONE => () | SOME t => hom t ()) val _ = Vector.foreach (tyvars, rem) val _ = destroy () in () end) val {get = tyconKeep: Tycon.t -> bool vector option, set = setTyconKeep, ...} = Property.getSetOnce (Tycon.plist, Property.initConst NONE) val {get = conKeep: Con.t -> bool vector option, set = setConKeep, ...} = Property.getSetOnce (Con.plist, Property.initConst NONE) val _ = Vector.foreach (datatypes, fn {cons, tycon, tyvars} => let val {used, ...} = valOf (tyconInfo tycon) val v = Vector.tabulate (Vector.length tyvars, fn i => PowerSetLat.isIn (used, i)) val _ = Vector.foreach (cons, fn {con, ...} => setConKeep (con, SOME v)) val u = if Vector.forall (v, fn b => b) then NONE else SOME v val _ = setTyconKeep (tycon, u) in () end) fun keep (v: 'a vector, bv: bool vector): 'a vector = Vector.keepAllMapi (v, fn (i, a) => if Vector.sub (bv, i) then SOME a else NONE) val {get = tyvarIsUsed: Tyvar.t -> bool ref, ...} = Property.get (Tyvar.plist, Property.initFun (fn _ => ref false)) (* There is some mesiness with promises here for two reasons: * 1. The thunk is to make sure that even though we are using a type * homomorphism, a type variable is only marked as used if it appears * in the output. * 2. The promise is do avoid computing the same output multiple times. * This is necessary because the type homomorphism only memoizes the * mapping from type to thunk, *not* the thunk's output. *) val {hom = fixType: I.Type.t -> unit -> O.Type.t, ...} = I.Type.makeHom {con = (fn (_, tc, ts) => Promise.lazy (fn () => let val ts = case tyconKeep tc of NONE => ts | SOME bv => keep (ts, bv) val ts = Vector.map (ts, fn t => t ()) in O.Type.con (tc, ts) end)), var = (fn (_, a) => Promise.lazy (fn () => (tyvarIsUsed a := true; O.Type.var a)))} val fixType = fn t => fixType t () val fixType = Trace.trace ("SimplifyTypes.fixType", I.Type.layout, O.Type.layout) fixType val tyvarIsUsed = ! o tyvarIsUsed val datatypes = Vector.map (datatypes, fn {cons, tycon, tyvars} => {cons = Vector.map (cons, fn {arg, con} => {arg = Option.map (arg, fixType), con = con}), tycon = tycon, tyvars = (case tyconKeep tycon of NONE => tyvars | SOME bv => keep (tyvars, bv))}) val {get = varKeep: Var.t -> bool vector option, set = setVarKeep, ...} = Property.getSetOnce (Var.plist, Property.initConst NONE) fun fixVarExp (I.VarExp.T {targs, var}): O.VarExp.t = let val targs = case varKeep var of NONE => targs | SOME bv => keep (targs, bv) in O.VarExp.T {targs = Vector.map (targs, fixType), var = var} end val fixVarExp = Trace.trace ("SimplifyTypes.fixVarExp", I.VarExp.layout, O.VarExp.layout) fixVarExp fun fixConTargs (con: Con.t, targs: I.Type.t vector): O.Type.t vector = let val targs = case conKeep con of NONE => targs | SOME bv => keep (targs, bv) in Vector.map (targs, fixType) end fun fixPat (I.Pat.T {arg, con, targs}): O.Pat.t = O.Pat.T {arg = Option.map (arg, fn (x, t) => (x, fixType t)), con = con, targs = fixConTargs (con, targs)} fun fixDec (d: I.Dec.t): O.Dec.t = case d of I.Dec.Exception {arg, con} => O.Dec.Exception {arg = Option.map (arg, fixType), con = con} | I.Dec.Fun {decs, tyvars} => let val decs = Vector.map (decs, fn {lambda, ty, var} => {lambda = fixLambda lambda, ty = fixType ty, var = var}) val bv = Vector.map (tyvars, tyvarIsUsed) val tyvars = keep (tyvars, bv) val _ = Vector.foreach (decs, fn {var, ...} => setVarKeep (var, SOME bv)) in O.Dec.Fun {decs = decs, tyvars = tyvars} end | I.Dec.MonoVal {exp, ty, var} => O.Dec.MonoVal {exp = fixPrimExp exp, ty = fixType ty, var = var} | I.Dec.PolyVal {exp, ty, tyvars, var} => let val exp = fixExp exp val ty = fixType ty val bv = Vector.map (tyvars, tyvarIsUsed) val _ = setVarKeep (var, SOME bv) in O.Dec.PolyVal {exp = exp, ty = ty, tyvars = keep (tyvars, bv), var = var} end and fixExp (e: I.Exp.t): O.Exp.t = let val {decs, result} = I.Exp.dest e in O.Exp.make {decs = List.map (decs, fixDec), result = fixVarExp result} end and fixLambda (l: I.Lambda.t): O.Lambda.t = let val {arg, argType, body, mayInline} = I.Lambda.dest l in O.Lambda.make {arg = arg, argType = fixType argType, body = fixExp body, mayInline = mayInline} end and fixPrimExp (e: I.PrimExp.t): O.PrimExp.t = case e of I.PrimExp.App {arg, func} => O.PrimExp.App {arg = fixVarExp arg, func = fixVarExp func} | I.PrimExp.Case {cases, default, test} => let val cases = case cases of I.Cases.Con v => O.Cases.Con (Vector.map (v, fn (p, e) => (fixPat p, fixExp e))) | I.Cases.Word (s, v) => O.Cases.Word (s, Vector.map (v, fn (c, e) => (c, fixExp e))) in O.PrimExp.Case {cases = cases, default = Option.map (default, fn (e, r) => (fixExp e, r)), test = fixVarExp test} end | I.PrimExp.ConApp {arg, con, targs} => O.PrimExp.ConApp {arg = Option.map (arg, fixVarExp), con = con, targs = fixConTargs (con, targs)} | I.PrimExp.Const c => O.PrimExp.Const c | I.PrimExp.Handle {catch = (x, t), handler, try} => O.PrimExp.Handle {catch = (x, fixType t), handler = fixExp handler, try = fixExp try} | I.PrimExp.Lambda l => O.PrimExp.Lambda (fixLambda l) | I.PrimExp.PrimApp {args, prim, targs} => O.PrimExp.PrimApp {args = Vector.map (args, fixVarExp), prim = Prim.map (prim, fixType), targs = Vector.map (targs, fixType)} | I.PrimExp.Profile e => O.PrimExp.Profile e | I.PrimExp.Raise {exn, extend} => O.PrimExp.Raise {exn = fixVarExp exn, extend = extend} | I.PrimExp.Select {offset, tuple} => O.PrimExp.Select {offset = offset, tuple = fixVarExp tuple} | I.PrimExp.Tuple xs => O.PrimExp.Tuple (Vector.map (xs, fixVarExp)) | I.PrimExp.Var x => O.PrimExp.Var (fixVarExp x) val body = fixExp body in O.Program.T {datatypes = datatypes, body = body, overflow = overflow} end end mlton-20100608/mlton/xml/simplify-types.sig0000644000076600000240000000111211404435624017210 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SIMPLIFY_TYPES_STRUCTS = sig structure Input: XML_TREE structure Output: XML_TREE sharing Input.Atoms = Output.Atoms end signature SIMPLIFY_TYPES = sig include SIMPLIFY_TYPES_STRUCTS val simplifyTypes: Input.Program.t -> Output.Program.t end mlton-20100608/mlton/xml/sources.cm0000644000076600000240000000161711404435624015524 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) Group signature SXML signature XML signature XML_TYPE functor Monomorphise functor Xml functor Sxml is ../atoms/sources.cm ../control/sources.cm ../../lib/mlton/sources.cm xml-type.sig xml-tree.sig xml-tree.fun type-check.sig type-check.fun scc-funs.sig scc-funs.fun simplify-types.sig simplify-types.fun shrink.sig shrink.fun xml-simplify.sig xml-simplify.fun xml.sig xml.fun sxml-exns.sig monomorphise.sig monomorphise.fun sxml-tree.sig implement-exceptions.sig implement-exceptions.fun implement-suffix.sig implement-suffix.fun polyvariance.sig polyvariance.fun cps-transform.sig cps-transform.fun sxml-simplify.sig sxml-simplify.fun sxml.sig sxml.fun mlton-20100608/mlton/xml/sources.mlb0000644000076600000240000000176511404435624015703 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local ../../lib/mlton/sources.mlb ../atoms/sources.mlb ../control/sources.mlb xml-type.sig xml-tree.sig xml-tree.fun type-check.sig type-check.fun scc-funs.sig scc-funs.fun simplify-types.sig simplify-types.fun shrink.sig shrink.fun xml-simplify.sig xml-simplify.fun xml.sig xml.fun sxml-exns.sig monomorphise.sig monomorphise.fun sxml-tree.sig implement-exceptions.sig implement-exceptions.fun implement-suffix.sig implement-suffix.fun polyvariance.sig polyvariance.fun cps-transform.sig cps-transform.fun sxml-simplify.sig sxml-simplify.fun sxml.sig sxml.fun in signature SXML signature XML functor Monomorphise functor Xml functor Sxml end mlton-20100608/mlton/xml/sxml-exns.sig0000644000076600000240000000076411404435624016164 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SXML_EXNS = XML (* invariants: * no PolyVal decs * hasExns = true * tyvar lists in datatype, val, and fun decs are always empty * type lists are empty for variable args and for non-built-in-constructor args * no tyvars in types *) mlton-20100608/mlton/xml/sxml-simplify.fun0000644000076600000240000001546011404435624017050 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor SxmlSimplify (S: SXML_SIMPLIFY_STRUCTS): SXML_SIMPLIFY = struct open S structure ImplementExceptions = ImplementExceptions (open S) structure ImplementSuffix = ImplementSuffix (open S) structure Polyvariance = Polyvariance (open S) (* structure Uncurry = Uncurry (open S) *) structure CPSTransform = CPSTransform (open S) fun polyvariance (hofo, rounds, small, product) p = Ref.fluidLet (Control.polyvariance, SOME {hofo = hofo, rounds = rounds, small = small, product = product}, fn () => Polyvariance.duplicate p) type pass = {name: string, doit: Program.t -> Program.t} val sxmlPassesDefault = {name = "sxmlShrink1", doit = S.shrink} :: {name = "implementSuffix", doit = ImplementSuffix.doit} :: {name = "sxmlShrink2", doit = S.shrink} :: {name = "implementExceptions", doit = ImplementExceptions.doit} :: {name = "sxmlShrink3", doit = S.shrink} :: (* {name = "uncurry", doit = Uncurry.uncurry} :: *) (* {name = "sxmlShrink4", doit = S.shrink} :: *) {name = "polyvariance", doit = Polyvariance.duplicate} :: {name = "sxmlShrink4", doit = S.shrink} :: nil val sxmlPassesCpsTransform = sxmlPassesDefault @ {name = "cpsTransform", doit = CPSTransform.doit} :: {name = "cpsSxmlShrink5", doit = S.shrink} :: {name = "cpsPolyvariance", doit = Polyvariance.duplicate} :: {name = "cpsSxmlShrink6", doit = S.shrink} :: nil val sxmlPassesMinimal = {name = "implementSuffix", doit = ImplementSuffix.doit} :: {name = "implementExceptions", doit = ImplementExceptions.doit} :: nil val sxmlPasses : pass list ref = ref sxmlPassesDefault local type passGen = string -> pass option fun mkSimplePassGen (name, doit): passGen = let val count = Counter.new 1 in fn s => if s = name then SOME {name = name ^ "#" ^ (Int.toString (Counter.next count)), doit = doit} else NONE end val polyvariancePassGen = let val count = Counter.new 1 fun nums s = if s = "" then SOME [] else if String.sub (s, 0) = #"(" andalso String.sub (s, String.size s - 1)= #")" then let val s = String.dropFirst (String.dropLast s) in case List.fold (String.split (s, #","), SOME [], fn (s,SOME nums) => (case Int.fromString s of SOME i => SOME (i::nums) | NONE => NONE) | (_, NONE) => NONE) of SOME (l as _::_) => SOME (List.rev l) | _ => NONE end else NONE in fn s => if String.hasPrefix (s, {prefix = "polyvariance"}) then let fun mk (hofo, rounds, small, product) = SOME {name = concat ["polyvariance(", Bool.toString hofo, ",", Int.toString rounds, ",", Int.toString small, ",", Int.toString product, ")#", Int.toString (Counter.next count)], doit = polyvariance (hofo, rounds, small, product)} val s = String.dropPrefix (s, String.size "polyvariance") in case nums s of SOME [] => mk (true, 2, 30, 300) | SOME [hofo, rounds, small, product] => mk (hofo <> 0, rounds, small, product) | _ => NONE end else NONE end val passGens = polyvariancePassGen :: (List.map([("sxmlShrink", S.shrink), ("implementExceptions", ImplementExceptions.doit), ("implementSuffix", ImplementSuffix.doit)], mkSimplePassGen)) in fun sxmlPassesSetCustom s = Exn.withEscape (fn esc => (let val ss = String.split (s, #":") in sxmlPasses := List.map(ss, fn s => case (List.peekMap (passGens, fn gen => gen s)) of NONE => esc (Result.No s) | SOME pass => pass) ; Result.Yes () end)) end val sxmlPassesString = ref "default" val sxmlPassesGet = fn () => !sxmlPassesString val sxmlPassesSet = fn s => let val _ = sxmlPassesString := s in case s of "default" => (sxmlPasses := sxmlPassesDefault ; Result.Yes ()) | "cpsTransform" => (sxmlPasses := sxmlPassesCpsTransform ; Result.Yes ()) | "minimal" => (sxmlPasses := sxmlPassesMinimal ; Result.Yes ()) | _ => sxmlPassesSetCustom s end val _ = List.push (Control.optimizationPasses, {il = "sxml", get = sxmlPassesGet, set = sxmlPassesSet}) fun pass ({name, doit}, p) = let val _ = let open Control in maybeSaveToFile ({name = name, suffix = "pre.sxml"}, Control.No, p, Control.Layouts Program.layouts) end val p = Control.passTypeCheck {display = Control.Layouts Program.layouts, name = name, stats = Program.layoutStats, style = Control.No, suffix = "post.sxml", thunk = fn () => doit p, typeCheck = typeCheck} in p end fun maybePass ({name, doit}, p) = if List.exists (!Control.dropPasses, fn re => Regexp.Compiled.matchesAll (re, name)) then p else pass ({name = name, doit = doit}, p) fun simplify p = let fun simplify' p = List.fold (!sxmlPasses, p, fn ({name, doit}, p) => maybePass ({name = name, doit = doit}, p)) val p = simplify' p in p end val simplify = fn p => let (* Always want to type check the initial and final XML * programs, even if type checking is turned off, just * to catch bugs. *) val _ = typeCheck p val p' = simplify p val _ = typeCheck p' in p' end end mlton-20100608/mlton/xml/sxml-simplify.sig0000644000076600000240000000101611404435624017032 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SXML_SIMPLIFY_STRUCTS = sig include SXML_TREE val shrink: Program.t -> Program.t val typeCheck: Program.t -> unit end signature SXML_SIMPLIFY = sig include SXML_SIMPLIFY_STRUCTS val simplify: Program.t -> Program.t end mlton-20100608/mlton/xml/sxml-tree.sig0000644000076600000240000000103111404435624016132 0ustar mtfstaff(* Copyright (C) 1999-2005, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SXML_TREE = XML_TREE (* invariants: * no Exception decs * no PolyVal decs * hasPrimExns = false * tyvar lists in datatype, val, and fun decs are always empty * type lists are empty for variable args and for non-built-in-constructor args * no tyvars in types *) mlton-20100608/mlton/xml/sxml.fun0000644000076600000240000000046511404435624015215 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Sxml (S: SXML_STRUCTS): SXML = SxmlSimplify (S) mlton-20100608/mlton/xml/sxml.sig0000644000076600000240000000107711404435624015207 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature SXML_STRUCTS = sig include XML end signature SXML = XML (* invariants: * no Exception decs * no PolyVal decs * hasPrimExns = false * tyvar lists in datatype, val, and fun decs are always empty * type lists are empty for variable args and for non-built-in-constructor args * no tyvars in types *) mlton-20100608/mlton/xml/type-check.fun0000644000076600000240000003402311404435624016263 0ustar mtfstaff(* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor TypeCheck (S: TYPE_CHECK_STRUCTS): TYPE_CHECK = struct open S open Dec PrimExp fun typeCheck (program as Program.T {datatypes, body, overflow}): unit = let (* tyvarInScope is used to ensure that tyvars never shadow themselves. *) val {get = tyvarInScope: Tyvar.t -> bool ref, ...} = Property.get (Tyvar.plist, Property.initFun (fn _ => ref false)) fun bindTyvars (vs: Tyvar.t vector): unit = Vector.foreach (vs, fn v => let val r = tyvarInScope v in if !r then Type.error ("tyvar already in scope", Tyvar.layout v) else r := true end) fun unbindTyvars (vs: Tyvar.t vector): unit = Vector.foreach (vs, fn v => tyvarInScope v := false) (* checkType makes sure all tyvars are bound. *) fun checkType (ty: Type.t): unit = Type.hom {ty = ty, con = fn _ => (), var = fn a => if !(tyvarInScope a) then () else Type.error ("tyvar not in scope", Tyvar.layout a)} fun checkTypes v = Vector.foreach (v, checkType) val {get = getCon: Con.t -> {tyvars: Tyvar.t vector, ty: Type.t}, set, ...} = Property.getSetOnce (Con.plist, Property.initRaise ("scheme", Con.layout)) fun setCon ({con, arg}, tyvars, result: Type.t): unit = (checkType result ; set (con, {tyvars = tyvars, ty = (case arg of NONE => result | SOME ty => (checkType ty ; Type.arrow (ty, result)))})) fun checkConExp (c: Con.t, ts: Type.t vector): Type.t = let val _ = checkTypes ts val {tyvars, ty} = getCon c in Type.substitute (ty, Vector.zip (tyvars, ts)) end val {get = getVar: Var.t -> {tyvars: Tyvar.t vector, ty: Type.t}, set = setVar, ...} = Property.getSet (Var.plist, Property.initRaise ("var scheme", Var.layout)) val getVar = Trace.trace ("Xml.TypeCheck.getVar", Var.layout, fn {tyvars, ty} => Layout.record [("tyvars", Vector.layout Tyvar.layout tyvars), ("ty", Type.layout ty)]) getVar val setVar = Trace.trace2 ("Xml.TypeCheck.setVar", Var.layout, fn {tyvars, ty} => Layout.record [("tyvars", Vector.layout Tyvar.layout tyvars), ("ty", Type.layout ty)], Layout.ignore) setVar fun checkVarExp (VarExp.T {var, targs}): Type.t = let val _ = checkTypes targs val {tyvars, ty} = getVar var in if Vector.length targs = Vector.length tyvars then Type.substitute (ty, Vector.zip (tyvars, targs)) else Type.error ("variable applied to wrong number of type args", let open Layout in align [Var.layout var, seq [str "tyvars: ", Vector.layout Tyvar.layout tyvars], seq [str "targs: ", Vector.layout Type.layout targs]] end) end fun checkVarExps xs = Vector.map (xs, checkVarExp) fun checkPat (p as Pat.T {con, targs, arg}): Type.t = let val t = checkConExp (con, targs) in case (arg, Type.deArrowOpt t) of (NONE, NONE) => t | (SOME (x, ty), SOME (t1, t2)) => (checkType ty ; if Type.equals (t1, ty) then (setVar (x, {tyvars = Vector.new0 (), ty = t1}) ; t2) else (Type.error ("argument constraint of wrong type", let open Layout in align [seq [str "constructor expects : ", Type.layout t1], seq [str "but got: ", Type.layout ty], seq [str "p: ", Pat.layout p]] end))) | _ => Type.error ("constructor pattern mismatch", Pat.layout p) end val traceCheckExp = Trace.trace ("Xml.TypeCheck.checkExp", Exp.layout, Type.layout) val traceCheckPrimExp = Trace.trace2 ("Xml.TypeCheck.checkPrimExp", PrimExp.layout, Type.layout, Type.layout) val traceCheckLambda = Trace.trace ("Xml.TypeCheck.checkLambda", Lambda.layout, Type.layout) val traceCheckDec = Trace.trace ("Xml.TypeCheck.checkDec", Dec.layout, Unit.layout) local val exnType = ref NONE in fun isExnType t = case !exnType of NONE => (exnType := SOME t; true) | SOME t' => Type.equals (t, t') end fun check (t: Type.t, t': Type.t, layout: unit -> Layout.t): unit = if Type.equals (t, t') then () else Type.error ("type mismatch", Layout.align [Type.layout t, Type.layout t', layout ()]) fun checkExp arg: Type.t = traceCheckExp (fn (exp: Exp.t) => let val {decs, result} = Exp.dest exp in List.foreach (decs, checkDec) ; checkVarExp result end) arg and checkPrimExp arg: Type.t = traceCheckPrimExp (fn (e: PrimExp.t, ty: Type.t) => let fun error msg = Type.error (msg, let open Layout in seq [str "exp: ", PrimExp.layout e] end) fun checkApp (t1, x) = let val t2 = checkVarExp x in case Type.deArrowOpt t1 of NONE => error "function not of arrow type" | SOME (t2', t3) => if Type.equals (t2, t2') then t3 else Type.error ("actual and formal not of same type", let open Layout in align [seq [str "actual: ", Type.layout t2], seq [str "formal: ", Type.layout t2'], seq [str "expression: ", PrimExp.layout e]] end) end in case e of App {arg, func} => checkApp (checkVarExp func, arg) | Case {cases, default, test} => let val default = Option.map (default, checkExp o #1) fun equalss v = if Vector.isEmpty v then Error.bug "Xml.TypeCheck.equalss" else let val t = Vector.sub (v, 0) in if Vector.forall (v, fn t' => Type.equals (t, t')) then SOME t else NONE end fun finish (ptys: Type.t vector, etys: Type.t vector): Type.t = case (equalss ptys, equalss etys) of (NONE, _) => error "patterns not of same type" | (_, NONE) => error "branches not of same type" | (SOME pty, SOME ety) => if Type.equals (checkVarExp test, pty) then case default of NONE => ety | SOME t => if Type.equals (ety, t) then ety else error "default of wrong type" else error "test and patterns of different types" datatype z = datatype Cases.t in case cases of Con cases => finish (Vector.unzip (Vector.map (cases, fn (p, e) => (checkPat p, checkExp e)))) | Word (s, cs) => finish (Vector.new1 (Type.word s), Vector.map (cs, fn (_, e) => checkExp e)) end | ConApp {con, targs, arg} => let val t = checkConExp (con, targs) in case arg of NONE => t | SOME e => checkApp (t, e) end | Const c => Type.ofConst c | Handle {try, catch = (catch, catchType), handler, ...} => let val _ = if isExnType catchType then () else error "handle with non-exn type for catch" val ty = checkExp try val _ = setVar (catch, {tyvars = Vector.new0 (), ty = catchType}) val ty' = checkExp handler in if Type.equals (ty, ty') then ty else error "bad handle" end | Lambda l => checkLambda l | PrimApp {args, prim, targs} => let val _ = checkTypes targs val () = if Type.checkPrimApp {args = checkVarExps args, prim = prim, result = ty, targs = targs} then () else error "bad primapp" in ty end | Profile _ => Type.unit | Raise {exn, ...} => if isExnType (checkVarExp exn) then ty else error "bad raise" | Select {tuple, offset} => (case Type.deTupleOpt (checkVarExp tuple) of NONE => error "selection from nontuple" | SOME ts => Vector.sub (ts, offset)) | Tuple xs => if 1 = Vector.length xs then error "unary tuple" else Type.tuple (checkVarExps xs) | Var x => checkVarExp x end) arg and checkLambda arg: Type.t = traceCheckLambda (fn (l: Lambda.t) => let val {arg, argType, body, ...} = Lambda.dest l val _ = checkType argType val _ = setVar (arg, {tyvars = Vector.new0 (), ty = argType}) in Type.arrow (argType, checkExp body) end) arg and checkDec arg: unit = traceCheckDec (fn (d: Dec.t) => let val check = fn (t, t') => check (t, t', fn () => Dec.layout d) in case d of Exception c => setCon (c, Vector.new0 (), Type.exn) | Fun {tyvars, decs} => (bindTyvars tyvars ; (Vector.foreach (decs, fn {ty, var, ...} => (checkType ty ; setVar (var, {tyvars = tyvars, ty = ty})))) ; Vector.foreach (decs, fn {ty, lambda, ...} => check (ty, checkLambda lambda)) ; unbindTyvars tyvars) | MonoVal {var, ty, exp} => (checkType ty ; check (ty, checkPrimExp (exp, ty)) ; setVar (var, {tyvars = Vector.new0 (), ty = ty})) | PolyVal {tyvars, var, ty, exp} => (bindTyvars tyvars ; checkType ty ; check (ty, checkExp exp) ; unbindTyvars tyvars ; setVar (var, {tyvars = tyvars, ty = ty})) end) arg val _ = Vector.foreach (datatypes, fn {tycon, tyvars, cons} => let val _ = bindTyvars tyvars val ty = Type.con (tycon, Vector.map (tyvars, Type.var)) val _ = Vector.foreach (cons, fn c => setCon (c, tyvars, ty)) val _ = unbindTyvars tyvars in () end) val _ = if Type.equals (checkExp body, Type.unit) then () else Error.bug "Xml.TypeCheck.typeCheck: program must be of type unit" val _ = case overflow of NONE => true | SOME x => let val {tyvars, ty} = getVar x in 0 = Vector.length tyvars andalso Type.equals (ty, Type.exn) end val _ = Program.clear program in () end val typeCheck = Trace.trace ("Xml.TypeCheck.typeCheck", Program.layout, Unit.layout) typeCheck val typeCheck = Control.trace (Control.Pass, "typeCheck") typeCheck end mlton-20100608/mlton/xml/type-check.sig0000644000076600000240000000066611404435624016263 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature TYPE_CHECK_STRUCTS = sig include XML_TREE end signature TYPE_CHECK = sig include TYPE_CHECK_STRUCTS val typeCheck: Program.t -> unit end mlton-20100608/mlton/xml/uncurry.fun0000644000076600000240000006050611404435624015743 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Uncurry(S: UNCURRY_STRUCTS): UNCURRY = struct open S open Dec PrimExp fun uncurry(program as Program.T{datatypes, body, overflow}) = let datatype D = T of {var: Var.t, lambda : Lambda.t} val {get = getArity: Var.t -> int, set = setArity, ...} = Property.getSet(Var.plist, Property.initConst 0) val {get = curriedRep: Var.t -> {unCurriedFun: D, curriedFun: D} option, set = setCurriedRep, ...} = Property.getSet(Var.plist, Property.initConst NONE) val {get = getType: Var.t -> {args: Type.t vector, result: Type.t}, set = setType, ...} = Property.getSet(Var.plist, Property.initConst {args = Vector.new1 Type.unit, result = Type.unit}) fun getResultType(exp) = let val {decs,result} = Exp.dest(exp) in List.fold (decs, Type.unit, fn (d, i) => case d of MonoVal {var, ty, exp} => if Var.equals(var,VarExp.var(result)) then ty else i | Fun {tyvars, decs} => Vector.fold (decs, Type.unit, fn ({var,ty,lambda}, i) => if Var.equals(var,VarExp.var(result)) then ty else i) | _ => i) end fun buildLambda(f,args,types,resultType) = let val newArg' = Var.newString("c") val newArg'' = Var.newString("c") in Lambda.new {arg = Vector.last(args), argType = Vector.last(types), body = Vector.fold2 (Vector.tabulate(Vector.length args - 2, fn i => Vector.sub(args, i + 1)), Vector.tabulate(Vector.length types - 2, fn i => Vector.sub(types, i + 1)), let val newVar = Var.newString("c") val arg = Vector.sub(args,0) val argType = Vector.sub(types,0) val decs = [MonoVal {var = newVar, ty = Type.arrow(argType,resultType), exp = Lambda (Lambda.new {arg = arg, argType = argType, body = Exp.new {decs = [MonoVal {var = newArg', ty = Type.tuple(Vector.rev(types)), exp = Tuple(Vector.map (Vector.rev(args), fn a => VarExp.mono(a)))}, MonoVal {var = newArg'', ty = resultType, exp = App {func = f, arg = VarExp.mono(newArg')}}], result = VarExp.mono(newArg'')}})}] val result = VarExp.mono(newVar) in Exp.new {decs = decs, result = result} end, fn (a, atype, i) => let val newVar = Var.newString("c") in Exp.new {decs = [MonoVal {var = newVar, ty = Type.arrow(atype, getResultType(i)), exp = Lambda(Lambda.new {arg = a, argType = atype, body = i})}], result = VarExp.mono(newVar)} end)} end fun uncurryFun(dec) = let fun lamExp(decs,result,args,types,newDecs,e) = case decs of [] => (args,types,e) | d::rest => case d of Dec.MonoVal{var, ty, exp = Const c} => lamExp(rest, result, args,types,d::newDecs,e) | Dec.MonoVal{var, ty, exp = Var v} => lamExp(rest, result, args,types,d::newDecs,e) | Dec.MonoVal{var, ty, exp = Select tuple} => lamExp(rest, result, args,types,d::newDecs,e) | Dec.MonoVal{var, ty, exp = Lambda l} => let val body = Lambda.body(l) val r = result val {decs,result} = Exp.dest(body) val newDecs = List.append(newDecs,decs) val new = Exp.new{decs = newDecs,result = result} in if Var.equals(var, VarExp.var(r)) andalso List.isEmpty(rest) then lamExp(newDecs, result, Lambda.arg(l)::args, Lambda.argType(l)::types, [], new) else (args,types,e) end | _ => (args,types,e) val lamExp = fn x => let val (args,types,e) = lamExp x in (Vector.fromList args, Vector.fromList types, e) end val T{var,lambda} = dec val (f, r) = let val arg = Lambda.arg(lambda) val argType = Lambda.argType(lambda) val body = Lambda.body(lambda) val {decs,result} = Exp.dest(body) in (var, lamExp(decs, result, [arg], [argType], [],body)) end fun buildCurried (f,args,types,e) = let val newVar = Var.newString("c") val newArg = Var.newString("c") val (newDecs,n) = Vector.fold2 (Vector.rev(args), Vector.rev(types), ([],0), fn (a, mtype, (l, i)) => (MonoVal {var = a, ty = mtype, exp = PrimExp.Select {tuple = VarExp.mono(newArg), offset = i}}::l, i+1)) val newExp = Exp.new {decs = List.append(newDecs, Exp.decs(e)), result = Exp.result(e)} val resultType = getResultType(newExp) val unCurriedFun = T{var = newVar, lambda = Lambda.new {arg = newArg, argType = Type.tuple(Vector.rev(types)), body = newExp}} val newArgs = Vector.map(args, fn z => Var.newString("c")) val newFun = buildLambda(VarExp.mono(newVar),newArgs,types,resultType) val newFunBinding = T{var = f, lambda = newFun} in setCurriedRep(f, SOME {unCurriedFun = unCurriedFun, curriedFun = newFunBinding}) end in case r of (args,types,e) => (setArity(f, Vector.length(args)); setType(f, {args = types, result = getResultType(e)}); if getArity(f) > 1 then buildCurried(f,args,types,e) else ()) end fun replaceVar(decs,old,new) = let fun compare(v) = if Var.equals(VarExp.var(v),old) then new else v fun replaceExp(e) = let val {decs,result} = Exp.dest(e) val newDecs = replaceVar(decs,old,new) val newResult = compare(result) in Exp.new {decs = newDecs, result = newResult} end in List.map (decs, fn d => (case d of MonoVal {var, ty, exp} => MonoVal {var=var, ty = ty, exp = (case exp of Var v => PrimExp.Var(compare(v)) | Tuple vs => Tuple(Vector.map(vs, fn v => compare(v))) | Select {tuple,offset} => Select {tuple = compare(tuple), offset = offset} | Lambda l => let val {arg,argType,body} = Lambda.dest(l) val {decs,result} = Exp.dest(body) val newDecs = replaceVar(decs,old,new) in Lambda (Lambda.new {arg=arg, argType=argType, body=Exp.new {decs = newDecs, result = result}}) end | ConApp {con,targs,arg} => (case arg of NONE => exp | SOME v => ConApp {con = con, targs = targs, arg = SOME (compare(v))}) | PrimApp {prim,targs,args} => PrimApp {prim = prim, targs = targs, args = Vector.map(args, fn a => compare(a))} | App {func,arg} => App {func = compare(func), arg = compare(arg)} | Raise {exn,filePos} => Raise {exn = compare(exn), filePos = filePos} | Case {test,cases,default} => Case {test=compare(test), cases = Cases.map (cases,fn e => replaceExp(e)), default = Option.map (default, fn (e,r) => (replaceExp e,r))} | Handle {try,catch,handler} => Handle {try = replaceExp(try), catch = catch, handler = replaceExp(handler)} | _ => exp)} | Fun {tyvars,decs} => Fun {tyvars=tyvars, decs = Vector.map (decs, fn {var,ty,lambda} => {var = var, ty = ty, lambda = let val {arg,argType,body} = Lambda.dest(lambda) in Lambda.new ({arg = arg, argType = argType, body = replaceExp(body)}) end})} | _ => d)) end fun uncurryApp(decs,expResult) = let fun makeUncurryApp(f,arguments,lastCall) = let val newArg = Var.newString("c") val newArg' = Var.newString("c") val varF = VarExp.var(f) val {args,result} = getType(varF) val var = (case curriedRep(varF) of NONE => Error.bug "Uncurry: uncurryApp" | SOME {unCurriedFun,curriedFun} => let val T{var,lambda} = unCurriedFun in var end) val argDec = MonoVal{var = newArg, ty = Type.tuple(Vector.rev(args)), exp = Tuple(Vector.rev(arguments))} val appDec = MonoVal{var = newArg', ty = result, exp = App {func = VarExp.mono(var), arg = VarExp.mono(newArg)}} val newR = if Var.equals(lastCall, VarExp.var(expResult)) then (SOME newArg') else NONE in (appDec::[argDec],newR,newArg') end in case decs of [] => Error.bug "Uncurry: uncurryApp" | d::r => (case d of MonoVal {var, ty, exp = App {func,arg}} => (case curriedRep(VarExp.var(func)) of NONE => Error.bug "Uncurry: uncurryApp" | SOME _ => let val arity = getArity(VarExp.var(func)) fun loop(args,arity,d,f) = if arity = 0 then SOME (Vector.fromList args,d,f) else case d of [] => NONE | h::r => (case h of MonoVal {var,ty, exp = App {func,arg}} => if Var.equals(VarExp.var(func),f) then loop(arg::args, arity-1, r, var) else NONE | _ => NONE) in case loop([arg],arity-1,r,var) of NONE => ([d],r,NONE) | SOME (args,r,lastCall) => let val (newDecs,newR,newArg) = makeUncurryApp(func,args,lastCall) val r = (replaceVar(r,lastCall, VarExp.mono(newArg))) in (newDecs,r,newR) end end) | _ => Error.bug "Uncurry: uncurryApp") end fun singleUse(var,decs) = let fun compare(e) = (case e of App {func,arg} => Var.equals(VarExp.var(func),var) | _ => false) in List.fold (decs, false, fn (d,r) => case d of MonoVal {var,ty,exp} => compare(exp) | _ => false) end fun transform(body) = let val {decs,result} = Exp.dest(body) val newR = ref NONE in Exp.new {decs = List.rev (let fun loop(decs,newDecs) = case decs of [] => newDecs | d::rest => (case d of MonoVal {var,ty, exp = Lambda l} => (case curriedRep(var) of NONE => let val lamBody = Lambda.body(l) val arg = Lambda.arg(l) val argType = Lambda.argType(l) val newLam = Lambda.new{arg=arg, argType = argType, body = transform(lamBody)} val newDec = MonoVal{var=var, ty=ty, exp = Lambda newLam} in loop(rest,newDec::newDecs) end | SOME {unCurriedFun,curriedFun} => let val T{var,lambda} = unCurriedFun val body = Lambda.body(lambda) val newBody = transform(body) val resultType = getResultType(newBody) val argType = Lambda.argType(lambda) val l = Lambda(Lambda.new {arg = Lambda.arg(lambda), argType = argType, body = newBody}) val b1 = MonoVal{var=var, ty = Type.arrow(argType,resultType), exp = l} val T{var,lambda} = curriedFun val argType = Lambda.argType(lambda) val resultType = getResultType(Lambda.body(lambda)) val b2 = MonoVal{var=var, ty = Type.arrow(argType, resultType), exp = Lambda lambda} in loop(rest,b2::(b1::newDecs)) end) | MonoVal {var,ty,exp = App {func,arg}} => (case curriedRep(VarExp.var(func)) of NONE => loop(rest,d::newDecs) | SOME _ => if singleUse(var,rest) then let val (appDecs,r,newResult) = uncurryApp(decs,result) in (newR := newResult; loop(r,List.append(appDecs,newDecs))) end else loop(rest,d::newDecs)) | MonoVal {var,ty,exp = Case {test,cases,default}} => let val newCases = Cases.map(cases, fn e => transform(e)) val default = Option.map (default, fn (e,r) => (transform(e),r)) in loop(rest, (MonoVal{var=var, ty=ty, exp = Case {test = test, cases = newCases, default = default}}:: newDecs)) end | MonoVal {var,ty, exp = Handle {try,catch,handler}} => loop(rest, (MonoVal{var=var, ty=ty, exp = Handle {try = transform(try), catch = catch, handler = transform(handler)}}:: newDecs)) | Fun {tyvars,decs} => loop(rest, Fun {tyvars = Vector.new0 (), decs = Vector.fromList( Vector.fold (decs, []:{var:Var.t, ty:Type.t, lambda:Lambda.t} list, fn (d as {var, ty, lambda:Lambda.t}, acc) => (case curriedRep(var) of NONE => let val body = Lambda.body(lambda) val arg = Lambda.arg(lambda) val argType = Lambda.argType(lambda) val newBody = transform(body) val newLam = Lambda.new{arg = arg, argType = argType, body = newBody} in {var=var, ty=ty, lambda=newLam}::acc end | SOME {unCurriedFun,curriedFun} => let val T{var,lambda} = unCurriedFun val body = Lambda.body(lambda) val newBody = transform(body) val argType = Lambda.argType(lambda) val resultType = getResultType(newBody) val b1 = {var=var, ty = Type.arrow(argType,resultType), lambda = Lambda.new{arg = Lambda.arg(lambda), argType = argType, body = newBody}} val T{var,lambda} = curriedFun val argType = Lambda.argType(lambda) val newBody = transform(Lambda.body(lambda)) val resultType = getResultType(newBody) val b2 = {var=var, ty = Type.arrow(argType,resultType), lambda = lambda} in b1::(b2::acc) end)))}::newDecs) | _ => loop(rest,d::newDecs)) in loop(decs,[]) end), result = (case !newR of NONE => result | SOME r => VarExp.mono(r))} end in Exp.foreachExp (body, fn e => let val {decs,result} = Exp.dest(e) in List.foreach (decs, fn d => case d of MonoVal {var,ty,exp = Lambda l} => uncurryFun(T{var=var,lambda=l}) | Fun {tyvars,decs} => Vector.foreach (decs, fn {var,ty,lambda} => uncurryFun(T{var=var,lambda=lambda})) | _ => ()) end); let val newBody = transform(body) in Program.T{datatypes = datatypes, body = newBody, overflow = overflow} end end end mlton-20100608/mlton/xml/uncurry.sig0000644000076600000240000000071511404435624015731 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature UNCURRY_STRUCTS = sig include SHRINK end signature UNCURRY = sig include UNCURRY_STRUCTS val uncurry: Program.t -> Program.t end mlton-20100608/mlton/xml/xml-simplify.fun0000644000076600000240000000712311404435624016662 0ustar mtfstaff(* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor XmlSimplify (S: XML_SIMPLIFY_STRUCTS): XML_SIMPLIFY = struct open S structure SimplifyTypes = SimplifyTypes (structure Input = S structure Output = S) type pass = {name: string, doit: Program.t -> Program.t} val xmlPassesDefault = {name = "xmlShrink", doit = S.shrink} :: {name = "xmlSimplifyTypes", doit = SimplifyTypes.simplifyTypes} :: nil val xmlPassesMinimal = nil val xmlPasses : pass list ref = ref xmlPassesDefault local type passGen = string -> pass option fun mkSimplePassGen (name, doit): passGen = let val count = Counter.new 1 in fn s => if s = name then SOME {name = concat [name, "#", Int.toString (Counter.next count)], doit = doit} else NONE end val passGens = (List.map([("xmlShrink", S.shrink), ("xmlSimplifyTypes", SimplifyTypes.simplifyTypes)], mkSimplePassGen)) in fun xmlPassesSetCustom s = Exn.withEscape (fn esc => (let val ss = String.split (s, #":") in xmlPasses := List.map(ss, fn s => case (List.peekMap (passGens, fn gen => gen s)) of NONE => esc (Result.No s) | SOME pass => pass) ; Result.Yes () end)) end val xmlPassesString = ref "default" val xmlPassesGet = fn () => !xmlPassesString val xmlPassesSet = fn s => let val _ = xmlPassesString := s in case s of "default" => (xmlPasses := xmlPassesDefault ; Result.Yes ()) | "minimal" => (xmlPasses := xmlPassesMinimal ; Result.Yes ()) | _ => xmlPassesSetCustom s end val _ = List.push (Control.optimizationPasses, {il = "xml", get = xmlPassesGet, set = xmlPassesSet}) fun pass ({name, doit}, p) = let val _ = let open Control in maybeSaveToFile ({name = name, suffix = "pre.xml"}, Control.No, p, Control.Layouts Program.layouts) end val p = Control.passTypeCheck {display = Control.Layouts Program.layouts, name = name, stats = Program.layoutStats, style = Control.No, suffix = "post.xml", thunk = fn () => doit p, typeCheck = typeCheck} in p end fun maybePass ({name, doit}, p) = if List.exists (!Control.dropPasses, fn re => Regexp.Compiled.matchesAll (re, name)) then p else pass ({name = name, doit = doit}, p) fun simplify p = let fun simplify' p = List.fold (!xmlPasses, p, fn ({name, doit}, p) => maybePass ({name = name, doit = doit}, p)) val p = simplify' p in p end val simplify = fn p => let (* Always want to type check the initial and final XML * programs, even if type checking is turned off, just * to catch bugs. *) val _ = typeCheck p val p' = simplify p val _ = typeCheck p' in p' end end mlton-20100608/mlton/xml/xml-simplify.sig0000644000076600000240000000101211404435624016643 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature XML_SIMPLIFY_STRUCTS = sig include XML_TREE val shrink: Program.t -> Program.t val typeCheck: Program.t -> unit end signature XML_SIMPLIFY = sig include XML_SIMPLIFY_STRUCTS val simplify: Program.t -> Program.t end mlton-20100608/mlton/xml/xml-tree.fun0000644000076600000240000007563211404435624015777 0ustar mtfstaff(* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor XmlTree (S: XML_TREE_STRUCTS): XML_TREE = struct open S structure Type = struct structure T = HashType (S) open T datatype dest = Var of Tyvar.t | Con of Tycon.t * t vector fun dest t = case Dest.dest t of Dest.Var a => Var a | Dest.Con x => Con x end fun maybeConstrain (x, t) = let open Layout in if !Control.showTypes then seq [x, str ": ", Type.layout t] else x end local open Layout in fun layoutTargs (ts: Type.t vector) = if !Control.showTypes andalso 0 < Vector.length ts then list (Vector.toListMap (ts, Type.layout)) else empty end structure Pat = struct datatype t = T of {arg: (Var.t * Type.t) option, con: Con.t, targs: Type.t vector} local open Layout in fun layout (T {arg, con, targs}) = seq [Con.layout con, layoutTargs targs, case arg of NONE => empty | SOME (x, t) => maybeConstrain (seq [str " ", Var.layout x], t)] end fun con (T {con, ...}) = con local fun make c = T {con = c, targs = Vector.new0 (), arg = NONE} in val falsee = make Con.falsee val truee = make Con.truee end end structure Cases = struct datatype 'a t = Con of (Pat.t * 'a) vector | Word of WordSize.t * (WordX.t * 'a) vector fun layout (cs, layout) = let open Layout fun doit (v, f) = align (Vector.toListMap (v, fn (x, e) => align [seq [f x, str " => "], indent (layout e, 3)])) in case cs of Con v => doit (v, Pat.layout) | Word (_, v) => doit (v, WordX.layout) end fun fold (c: 'a t, b: 'b, f: 'a * 'b -> 'b): 'b = let fun doit l = Vector.fold (l, b, fn ((_, a), b) => f (a, b)) in case c of Con l => doit l | Word (_, l) => doit l end fun map (c: 'a t, f: 'a -> 'b): 'b t = let fun doit l = Vector.map (l, fn (i, x) => (i, f x)) in case c of Con l => Con (doit l) | Word (s, l) => Word (s, doit l) end fun foreach (c, f) = fold (c, (), fn (x, ()) => f x) fun foreach' (c: 'a t, f: 'a -> unit, fc: Pat.t -> unit): unit = let fun doit l = Vector.foreach (l, fn (_, a) => f a) in case c of Con l => Vector.foreach (l, fn (c, a) => (fc c; f a)) | Word (_, l) => doit l end end structure VarExp = struct datatype t = T of {targs: Type.t vector, var: Var.t} fun equals (T {targs = targs1, var = var1}, T {targs = targs2, var = var2}) = Var.equals (var1, var2) andalso Vector.equals (targs1, targs2, Type.equals) fun mono var = T {var = var, targs = Vector.new0 ()} local fun make f (T r) = f r in val var = make #var end fun layout (T {var, targs, ...}) = if !Control.showTypes then let open Layout in if Vector.isEmpty targs then Var.layout var else seq [Var.layout var, str " ", Vector.layout Type.layout targs] end else Var.layout var end (*---------------------------------------------------*) (* Expressions and Declarations *) (*---------------------------------------------------*) datatype exp = Exp of {decs: dec list, result: VarExp.t} and primExp = App of {func: VarExp.t, arg: VarExp.t} | Case of {test: VarExp.t, cases: exp Cases.t, default: (exp * Region.t) option} | ConApp of {con: Con.t, targs: Type.t vector, arg: VarExp.t option} | Const of Const.t | Handle of {try: exp, catch: Var.t * Type.t, handler: exp} | Lambda of lambda | PrimApp of {args: VarExp.t vector, prim: Type.t Prim.t, targs: Type.t vector} | Profile of ProfileExp.t | Raise of {exn: VarExp.t, extend: bool} | Select of {tuple: VarExp.t, offset: int} | Tuple of VarExp.t vector | Var of VarExp.t and dec = Exception of {arg: Type.t option, con: Con.t} | Fun of {decs: {lambda: lambda, ty: Type.t, var: Var.t} vector, tyvars: Tyvar.t vector} | MonoVal of {exp: primExp, ty: Type.t, var: Var.t} | PolyVal of {exp: exp, ty: Type.t, tyvars: Tyvar.t vector, var: Var.t} and lambda = Lam of {arg: Var.t, argType: Type.t, body: exp, mayInline: bool, plist: PropertyList.t} local open Layout in fun layoutConArg {arg, con} = seq [Con.layout con, case arg of NONE => empty | SOME t => seq [str " of ", Type.layout t]] fun layoutTyvars ts = case Vector.length ts of 0 => empty | 1 => seq [Tyvar.layout (Vector.sub (ts, 0)), str " "] | _ => seq [tuple (Vector.toListMap (ts, Tyvar.layout)), str " "] fun layoutDec d = case d of Exception ca => seq [str "exception ", layoutConArg ca] | Fun {decs, tyvars} => align [seq [str "val rec ", layoutTyvars tyvars], indent (align (Vector.toListMap (decs, fn {lambda, ty, var} => align [seq [maybeConstrain (Var.layout var, ty), str " = "], indent (layoutLambda lambda, 3)])), 3)] | MonoVal {exp, ty, var} => align [seq [str "val ", maybeConstrain (Var.layout var, ty), str " = "], indent (layoutPrimExp exp, 3)] | PolyVal {exp, ty, tyvars, var} => align [seq [str "val ", if !Control.showTypes then layoutTyvars tyvars else empty, maybeConstrain (Var.layout var, ty), str " = "], indent (layoutExp exp, 3)] and layoutExp (Exp {decs, result}) = align [str "let", indent (align (List.map (decs, layoutDec)), 3), str "in", indent (VarExp.layout result, 3), str "end"] and layoutPrimExp e = case e of App {arg, func} => seq [VarExp.layout func, str " ", VarExp.layout arg] | Case {test, cases, default} => align [seq [str "case ", VarExp.layout test, str " of"], Cases.layout (cases, layoutExp), indent (align [case default of NONE => empty | SOME (e, _) => seq [str "_ => ", layoutExp e]], 2)] | ConApp {arg, con, targs, ...} => seq [Con.layout con, layoutTargs targs, case arg of NONE => empty | SOME x => seq [str " ", VarExp.layout x]] | Const c => Const.layout c | Handle {catch, handler, try} => align [layoutExp try, seq [str "handle ", Var.layout (#1 catch), str " => ", layoutExp handler]] | Lambda l => layoutLambda l | PrimApp {args, prim, targs} => seq [Prim.layout prim, layoutTargs targs, str " ", tuple (Vector.toListMap (args, VarExp.layout))] | Profile e => ProfileExp.layout e | Raise {exn, ...} => seq [str "raise ", VarExp.layout exn] | Select {offset, tuple} => seq [str "#", Int.layout offset, str " ", VarExp.layout tuple] | Tuple xs => tuple (Vector.toListMap (xs, VarExp.layout)) | Var x => VarExp.layout x and layoutLambda (Lam {arg, argType, body, ...}) = align [seq [str "fn ", maybeConstrain (Var.layout arg, argType), str " => "], layoutExp body] end structure Dec = struct type exp = exp datatype t = datatype dec val layout = layoutDec end structure PrimExp = struct type exp = exp datatype t = datatype primExp val layout = layoutPrimExp end structure Exp = struct datatype t = datatype exp val layout = layoutExp val make = Exp fun dest (Exp r) = r val decs = #decs o dest val result = #result o dest fun fromPrimExp (exp: PrimExp.t, ty: Type.t): t = let val var = Var.newNoname () in Exp {decs = [Dec.MonoVal {var = var, ty = ty, exp = exp}], result = VarExp.mono var} end local fun make f (Exp {decs, result}, d) = Exp {decs = f (d, decs), result = result} in val prefix = make (op ::) val prefixs = make (op @) end fun enterLeave (e: t, ty: Type.t, si: SourceInfo.t): t = let datatype z = datatype Dec.t datatype z = datatype PrimExp.t fun prof f = MonoVal {exp = Profile (f si), ty = Type.unit, var = Var.newNoname ()} val exn = Var.newNoname () val res = Var.newNoname () val handler = make {decs = [prof ProfileExp.Leave, MonoVal {exp = Raise {exn = VarExp.mono exn, extend = false}, ty = ty, var = res}], result = VarExp.mono res} val touch = if !Control.profile = Control.ProfileCount then let val unit = Var.newNoname () in [MonoVal {exp = Tuple (Vector.new0 ()), ty = Type.unit, var = unit}, MonoVal {exp = PrimApp {args = Vector.new1 (VarExp.mono unit), prim = Prim.touch, targs = Vector.new1 Type.unit}, ty = Type.unit, var = Var.newNoname ()}] end else [] val {decs, result} = dest e val decs = List.concat [[prof ProfileExp.Enter], touch, decs, [prof ProfileExp.Leave]] val try = make {decs = decs, result = result} in fromPrimExp (Handle {catch = (exn, Type.exn), handler = handler, try = try}, ty) end (*------------------------------------*) (* foreach *) (*------------------------------------*) fun foreach {exp: t, handleExp: t -> unit, handlePrimExp: Var.t * Type.t * PrimExp.t -> unit, handleBoundVar: Var.t * Tyvar.t vector * Type.t -> unit, handleVarExp: VarExp.t -> unit}: unit = let fun monoVar (x, t) = handleBoundVar (x, Vector.new0 (), t) fun handleVarExps xs = Vector.foreach (xs, handleVarExp) fun loopExp e = let val {decs, result} = dest e in List.foreach (decs, loopDec) ; handleVarExp result ; handleExp e end and loopPrimExp (x: Var.t, ty: Type.t, e: PrimExp.t): unit = (handlePrimExp (x, ty, e) ; (case e of Const _ => () | Var x => handleVarExp x | Tuple xs => handleVarExps xs | Select {tuple, ...} => handleVarExp tuple | Lambda lambda => loopLambda lambda | PrimApp {args, ...} => handleVarExps args | Profile _ => () | ConApp {arg, ...} => (case arg of NONE => () | SOME x => handleVarExp x) | App {func, arg} => (handleVarExp func ; handleVarExp arg) | Raise {exn, ...} => handleVarExp exn | Handle {try, catch, handler, ...} => (loopExp try ; monoVar catch ; loopExp handler) | Case {test, cases, default} => (handleVarExp test ; Cases.foreach' (cases, loopExp, fn Pat.T {arg, ...} => case arg of NONE => () | SOME x => monoVar x) ; Option.app (default, loopExp o #1)))) and loopDec d = case d of MonoVal {var, ty, exp} => (monoVar (var, ty); loopPrimExp (var, ty, exp)) | PolyVal {var, tyvars, ty, exp} => (handleBoundVar (var, tyvars, ty) ; loopExp exp) | Exception _ => () | Fun {tyvars, decs, ...} => (Vector.foreach (decs, fn {ty, var, ...} => handleBoundVar (var, tyvars, ty)) ; Vector.foreach (decs, fn {lambda, ...} => loopLambda lambda)) and loopLambda (Lam {arg, argType, body, ...}): unit = (monoVar (arg, argType); loopExp body) in loopExp exp end fun ignore _ = () fun foreachPrimExp (e, f) = foreach {exp = e, handlePrimExp = f, handleExp = ignore, handleBoundVar = ignore, handleVarExp = ignore} fun foreachVarExp (e, f) = foreach {exp = e, handlePrimExp = ignore, handleExp = ignore, handleBoundVar = ignore, handleVarExp = f} fun foreachBoundVar (e, f) = foreach {exp = e, handlePrimExp = ignore, handleExp = ignore, handleBoundVar = f, handleVarExp = ignore} fun foreachExp (e, f) = foreach {exp = e, handlePrimExp = ignore, handleExp = f, handleBoundVar = ignore, handleVarExp = ignore} (* quell unused warning *) val _ = foreachExp fun hasPrim (e, f) = Exn.withEscape (fn escape => (foreachPrimExp (e, fn (_, _, e) => case e of PrimApp {prim, ...} => if f prim then escape true else () | _ => ()) ; false)) fun size e = let val n: int ref = ref 0 fun inc () = n := 1 + !n in foreachPrimExp (e, fn _ => inc ()); !n end val size = Trace.trace ("XmlTree.Exp.size", Layout.ignore, Int.layout) size (* quell unused warning *) val _ = size fun clear (e: t): unit = let open PrimExp fun clearTyvars ts = Vector.foreach (ts, Tyvar.clear) fun clearPat (Pat.T {arg, ...}) = case arg of NONE => () | SOME (x, _) => Var.clear x fun clearExp e = clearDecs (decs e) and clearDecs ds = List.foreach (ds, clearDec) and clearDec d = case d of MonoVal {var, exp, ...} => (Var.clear var; clearPrimExp exp) | PolyVal {var, tyvars, exp, ...} => (Var.clear var ; clearTyvars tyvars ; clearExp exp) | Fun {tyvars, decs} => (clearTyvars tyvars ; Vector.foreach (decs, fn {var, lambda, ...} => (Var.clear var ; clearLambda lambda))) | Exception {con, ...} => Con.clear con and clearPrimExp e = case e of Lambda l => clearLambda l | Case {cases, default, ...} => (Cases.foreach' (cases, clearExp, clearPat) ; Option.app (default, clearExp o #1)) | Handle {try, catch, handler, ...} => (clearExp try ; Var.clear (#1 catch) ; clearExp handler) | _ => () and clearLambda (Lam {arg, body, ...}) = (Var.clear arg; clearExp body) in clearExp e end end (*---------------------------------------------------*) (* Lambda *) (*---------------------------------------------------*) structure Lambda = struct type exp = exp datatype t = datatype lambda local fun make f (Lam r) = f r in val arg = make #arg val body = make #body val mayInline = make #mayInline end fun make {arg, argType, body, mayInline} = Lam {arg = arg, argType = argType, body = body, mayInline = mayInline, plist = PropertyList.new ()} fun dest (Lam {arg, argType, body, mayInline, ...}) = {arg = arg, argType = argType, body = body, mayInline = mayInline} fun plist (Lam {plist, ...}) = plist val layout = layoutLambda fun equals (f:t, f':t) = PropertyList.equals (plist f, plist f') end (* ------------------------------------------------- *) (* DirectExp *) (* ------------------------------------------------- *) structure DirectExp = struct open Dec PrimExp structure Cont = struct type t = PrimExp.t * Type.t -> Exp.t fun nameGen (k: VarExp.t * Type.t -> Exp.t): t = fn (e, t) => case e of Var x => k (x, t) | _ => let val x = Var.newNoname () in Exp.prefix (k (VarExp.mono x, t), MonoVal {var = x, ty = t, exp = e}) end fun name (k: VarExp.t * Type.t -> Exp.t): t = nameGen k val id: t = name (fn (x, _) => Exp {decs = [], result = x}) fun return (k: t, xt) = k xt end type t = Cont.t -> Exp.t fun send (e: t, k: Cont.t): Exp.t = e k fun toExp e = send (e, Cont.id) fun fromExp (Exp {decs, result}, ty): t = fn k => Exp.prefixs (k (Var result, ty), decs) fun sendName (e, k) = send (e, Cont.name k) fun simple (e: PrimExp.t * Type.t) k = Cont.return (k, e) fun const c = simple (Const c, Type.ofConst c) val string = const o Const.string fun varExp (x, t) = simple (Var x, t) fun var {var, targs, ty} = varExp (VarExp.T {var = var, targs = targs}, ty) fun monoVar (x, t) = var {var = x, targs = Vector.new0 (), ty = t} fun convertsGen (es: t vector, k: (VarExp.t * Type.t) vector -> Exp.t): Exp.t = let val n = Vector.length es fun loop (i, xs) = if i = n then k (Vector.fromListRev xs) else sendName (Vector.sub (es, i), fn x => loop (i + 1, x :: xs)) in loop (0, []) end fun converts (es: t vector, make: (VarExp.t * Type.t) vector -> PrimExp.t * Type.t): t = fn k => convertsGen (es, k o make) fun convert (e: t, make: VarExp.t * Type.t -> PrimExp.t * Type.t): t = fn k => send (e, Cont.name (k o make)) fun convertOpt (e, make) = case e of NONE => simple (make NONE) | SOME e => convert (e, make o SOME o #1) fun tuple {exps: t vector, ty: Type.t}: t = if 1 = Vector.length exps then Vector.sub (exps, 0) else converts (exps, fn xs => (PrimExp.Tuple (Vector.map (xs, #1)), ty)) fun select {tuple, offset, ty} = convert (tuple, fn (tuple, _) => (Select {tuple = tuple, offset = offset}, ty)) fun conApp {con, targs, arg, ty} = convertOpt (arg, fn arg => (ConApp {con = con, targs = targs, arg = arg}, ty)) local fun make c () = conApp {con = c, targs = Vector.new0 (), arg = NONE, ty = Type.bool} in val truee = make Con.truee val falsee = make Con.falsee end fun primApp {prim, targs, args, ty} = converts (args, fn args => (PrimApp {prim = prim, targs = targs, args = Vector.map (args, #1)}, ty)) fun convert2 (e1, e2, make) = converts (Vector.new2 (e1, e2), fn xs => make (Vector.sub (xs, 0), Vector.sub (xs, 1))) fun app {func, arg, ty} = convert2 (func, arg, fn ((func, _), (arg, _)) => (App {func = func, arg = arg}, ty)) fun casee {test, cases, default, ty} = convert (test, fn (test, _) => (Case {test = test, cases = Cases.map (cases, toExp), default = (Option.map (default, fn (e, r) => (toExp e, r)))}, ty)) fun raisee {exn: t, extend: bool, ty: Type.t}: t = convert (exn, fn (x, _) => (Raise {exn = x, extend = extend}, ty)) fun handlee {try, catch, handler, ty} = simple (Handle {try = toExp try, catch = catch, handler = toExp handler}, ty) fun unit () = tuple {exps = Vector.new0 (), ty = Type.unit} fun reff (e: t): t = convert (e, fn (x, t) => (PrimApp {prim = Prim.reff, targs = Vector.new1 t, args = Vector.new1 x}, Type.reff t)) fun deref (e: t): t = convert (e, fn (x, t) => let val t = Type.deRef t in (PrimApp {prim = Prim.deref, targs = Vector.new1 t, args = Vector.new1 x}, t) end) fun equal (e1, e2) = convert2 (e1, e2, fn ((x1, t), (x2, _)) => (PrimApp {prim = Prim.equal, targs = Vector.new1 t, args = Vector.new2 (x1, x2)}, Type.bool)) fun iff {test, thenn, elsee, ty} = casee {test = test, cases = Cases.Con (Vector.new2 ((Pat.truee, thenn), (Pat.falsee, elsee))), default = NONE, ty = ty} fun vall {var, exp}: Dec.t list = let val t = ref Type.unit val Exp {decs, result} = sendName (exp, fn (x, t') => (t := t'; Exp {decs = [], result = x})) in decs @ [MonoVal {var = var, ty = !t, exp = Var result}] end fun sequence es = converts (es, fn xs => let val (x, t) = Vector.last xs in (Var x, t) end) val bug: string -> t = fn s => primApp {prim = Prim.bug, targs = Vector.new0 (), args = Vector.new1 (string s), ty = Type.unit} fun seq (es, make) = fn k => convertsGen (es, fn xts => send (make (Vector.map (xts, varExp)), k)) fun lett {decs, body} = fn k => Exp.prefixs (send (body, k), decs) fun let1 {var, exp, body} = fn k => send (exp, fn (exp, ty) => Exp.prefix (send (body, k), Dec.MonoVal {var = var, ty = ty, exp = exp})) fun lambda {arg, argType, body, bodyType, mayInline} = simple (Lambda (Lambda.make {arg = arg, argType = argType, body = toExp body, mayInline = mayInline}), Type.arrow (argType, bodyType)) fun fromLambda (l, ty) = simple (Lambda l, ty) fun detupleGen (e: PrimExp.t, t: Type.t, components: Var.t vector, body: Exp.t): Exp.t = Exp.prefixs (body, case Vector.length components of 0 => [] | 1 => [MonoVal {var = Vector.sub (components, 0), ty = t, exp = e}] | _ => let val ts = Type.deTuple t val tupleVar = Var.newNoname () in MonoVal {var = tupleVar, ty = t, exp = e} :: #2 (Vector.fold2 (components, ts, (0, []), fn (x, t, (i, ac)) => (i + 1, MonoVal {var = x, ty = t, exp = Select {tuple = VarExp.mono tupleVar, offset = i}} :: ac))) end) fun detupleBind {tuple, components, body} = fn k => send (tuple, fn (e, t) => detupleGen (e, t, components, body k)) fun detuple {tuple: t, body}: t = fn k => tuple (fn (e, t) => let val ts = Type.deTuple t in case e of Tuple xs => send (body (Vector.zip (xs, ts)), k) | _ => let val components = Vector.map (ts, fn _ => Var.newNoname ()) in detupleGen (e, t, components, send (body (Vector.map2 (components, ts, fn (x, t) => (VarExp.mono x, t))), k)) end end) end (*---------------------------------------------------*) (* Datatype *) (*---------------------------------------------------*) structure Datatype = struct type t = {cons: {arg: Type.t option, con: Con.t} vector, tycon: Tycon.t, tyvars: Tyvar.t vector} fun layout ({cons, tycon, tyvars}: t): Layout.t = let open Layout in seq [layoutTyvars tyvars, Tycon.layout tycon, str " = ", align (separateLeft (Vector.toListMap (cons, layoutConArg), "| "))] end end (*---------------------------------------------------*) (* Program *) (*---------------------------------------------------*) structure Program = struct datatype t = T of {body: Exp.t, datatypes: Datatype.t vector, overflow: Var.t option} fun layout (T {body, datatypes, overflow, ...}) = let open Layout in align [str "\n\nDatatypes:", align (Vector.toListMap (datatypes, Datatype.layout)), seq [str "\n\nOverflow: ", Option.layout Var.layout overflow], str "\n\nBody:", Exp.layout body] end fun layouts (T {body, datatypes, overflow, ...}, output') = let open Layout (* Layout includes an output function, so we need to rebind output * to the one above. *) val output = output' in output (str "\n\nDatatypes:") ; Vector.foreach (datatypes, output o Datatype.layout) ; output (seq [str "\n\nOverflow: ", Option.layout Var.layout overflow]) ; output (str "\n\nBody:") ; output (Exp.layout body) end fun clear (T {datatypes, body, ...}) = (Vector.foreach (datatypes, fn {tycon, tyvars, cons} => (Tycon.clear tycon ; Vector.foreach (tyvars, Tyvar.clear) ; Vector.foreach (cons, Con.clear o #con))) ; Exp.clear body) fun layoutStats (T {datatypes, body, ...}) = let val numTypes = ref 0 fun inc _ = numTypes := 1 + !numTypes val {hom, destroy} = Type.makeHom {var = inc, con = inc} val numPrimExps = ref 0 open Layout in Vector.foreach (datatypes, fn {cons, ...} => Vector.foreach (cons, fn {arg, ...} => case arg of NONE => () | SOME t => hom t)) ; (Exp.foreach {exp = body, handlePrimExp = fn _ => numPrimExps := 1 + !numPrimExps, handleVarExp = fn _ => (), handleBoundVar = hom o #3, handleExp = fn _ => ()}) ; destroy () ; align [seq [str "num primexps in program = ", Int.layout (!numPrimExps)], seq [str "num types in program = ", Int.layout (!numTypes)], Type.stats ()] end end end mlton-20100608/mlton/xml/xml-tree.sig0000644000076600000240000002152611404435624015762 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) (* binding occurences: * 1. lambda arg * 2. pattern arg * 3. MonoVal dec * 4. PolyVal dec * 5. Fun dec * 6. Handle catch *) signature XML_TREE_STRUCTS = sig include ATOMS end signature XML_TREE = sig include XML_TREE_STRUCTS structure Type: XML_TYPE sharing Atoms = Type.Atoms structure Pat: sig datatype t = T of {arg: (Var.t * Type.t) option, con: Con.t, targs: Type.t vector} val falsee: t val truee: t val con: t -> Con.t val layout: t -> Layout.t end structure Cases: sig datatype 'a t = Con of (Pat.t * 'a) vector | Word of WordSize.t * (WordX.t * 'a) vector val fold: 'a t * 'b * ('a * 'b -> 'b) -> 'b val foreach: 'a t * ('a -> unit) -> unit val foreach': 'a t * ('a -> unit) * (Pat.t -> unit) -> unit val map: 'a t * ('a -> 'b) -> 'b t end structure Lambda: sig type exp type t val arg: t -> Var.t val body: t -> exp val dest: t -> {arg: Var.t, argType: Type.t, body: exp, mayInline: bool} val equals: t * t -> bool val layout: t -> Layout.t val make: {arg: Var.t, argType: Type.t, body: exp, mayInline: bool} -> t val mayInline: t -> bool val plist: t -> PropertyList.t end (* VarExp is a type application, variable applied to type args. *) structure VarExp: sig datatype t = T of {var: Var.t, targs: Type.t vector} val equals: t * t -> bool val layout: t -> Layout.t val mono: Var.t -> t val var: t -> Var.t end structure PrimExp: sig type exp = Lambda.exp datatype t = App of {arg: VarExp.t, func: VarExp.t} | Case of {cases: exp Cases.t, default: (exp * Region.t) option, test: VarExp.t} | ConApp of {arg: VarExp.t option, con: Con.t, targs: Type.t vector} | Const of Const.t | Handle of {(* catch binds the exception in the handler. *) catch: Var.t * Type.t, handler: exp, try: exp} | Lambda of Lambda.t | PrimApp of {args: VarExp.t vector, prim: Type.t Prim.t, targs: Type.t vector} | Profile of ProfileExp.t | Raise of {exn: VarExp.t, extend: bool} | Select of {offset: int, tuple: VarExp.t} | Tuple of VarExp.t vector | Var of VarExp.t val layout: t -> Layout.t end structure Dec: sig type exp = Lambda.exp datatype t = Exception of {arg: Type.t option, con: Con.t} | Fun of {decs: {lambda: Lambda.t, ty: Type.t, var: Var.t} vector, tyvars: Tyvar.t vector} | MonoVal of {exp: PrimExp.t, ty: Type.t, var: Var.t} | PolyVal of {exp: exp, ty: Type.t, tyvars: Tyvar.t vector, var: Var.t} val layout: t -> Layout.t end structure Exp: sig type t = Lambda.exp val clear: t -> unit val decs: t -> Dec.t list val dest: t -> {decs: Dec.t list, result: VarExp.t} val enterLeave: t * Type.t * SourceInfo.t -> t (* foreach {exp, handleExp, handleBoundVar, handleVarExp} * applies handleExp to each subexpresison of e (including e) * applies handleBoundVar to each variable bound in e * applies handleVarExp to each variable expression in e * handleBoundVar will be called on a variable binding before * handleVarExp is called on any occurrences * handleExp is called on an expression after it is called on * all of its subexpressions *) val foreach: {exp: t, handleExp: t -> unit, handlePrimExp: Var.t * Type.t * PrimExp.t -> unit, handleBoundVar: Var.t * Tyvar.t vector * Type.t -> unit, handleVarExp: VarExp.t -> unit} -> unit val foreachBoundVar: t * (Var.t * Tyvar.t vector * Type.t -> unit) -> unit val foreachExp: t * (t -> unit) -> unit val foreachPrimExp: t * (Var.t * Type.t * PrimExp.t -> unit) -> unit val foreachVarExp: t * (VarExp.t -> unit) -> unit val fromPrimExp: PrimExp.t * Type.t -> t val hasPrim: t * (Type.t Prim.t -> bool) -> bool val layout: t -> Layout.t val make: {decs: Dec.t list, result: VarExp.t} -> t val prefix: t * Dec.t -> t val result: t -> VarExp.t val size: t -> int end structure DirectExp: sig type t val app: {func: t, arg: t, ty: Type.t} -> t val bug: string -> t val casee: {cases: t Cases.t, default: (t * Region.t) option, test: t, ty: Type.t} (* type of entire case expression *) -> t val conApp: {arg: t option, con: Con.t, targs: Type.t vector, ty: Type.t} -> t val const: Const.t -> t val deref: t -> t val detuple: {tuple: t, body: (VarExp.t * Type.t) vector -> t} -> t val detupleBind: {tuple: t, components: Var.t vector, body: t} -> t val equal: t * t -> t val falsee: unit -> t val fromExp: Exp.t * Type.t -> t val fromLambda: Lambda.t * Type.t -> t val handlee: {catch: Var.t * Type.t, handler: t, try: t, ty: Type.t} -> t val iff: {test: t, thenn: t, elsee: t, ty: Type.t} -> t val lambda: {arg: Var.t, argType: Type.t, body: t, bodyType: Type.t, mayInline: bool} -> t val let1: {var: Var.t, exp: t, body: t} -> t val lett: {decs: Dec.t list, body: t} -> t val monoVar: Var.t * Type.t -> t val primApp: {args: t vector, prim: Type.t Prim.t, targs: Type.t vector, ty: Type.t} -> t val raisee: {exn: t, extend: bool, ty: Type.t} -> t val reff: t -> t val select: {tuple: t, offset: int, ty: Type.t} -> t val seq: t vector * (t vector -> t) -> t val sequence: t vector -> t val string: string -> t val toExp: t -> Exp.t val truee: unit -> t val tuple: {exps: t vector, ty: Type.t} -> t val unit: unit -> t val vall: {var: Var.t, exp: t} -> Dec.t list val var: {targs: Type.t vector, ty: Type.t, var: Var.t} -> t val varExp: VarExp.t * Type.t -> t end structure Program: sig datatype t = T of {body: Exp.t, datatypes: {cons: {arg: Type.t option, con: Con.t} vector, tycon: Tycon.t, tyvars: Tyvar.t vector} vector, (* overflow is SOME only after exceptions have been * implemented. *) overflow: Var.t option} val clear: t -> unit (* clear all property lists *) val layout: t -> Layout.t val layouts: t * (Layout.t -> unit) -> unit val layoutStats: t -> Layout.t end end mlton-20100608/mlton/xml/xml-type.sig0000644000076600000240000000064311404435624016001 0ustar mtfstaff(* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature XML_TYPE = sig include HASH_TYPE datatype dest = Var of Tyvar.t | Con of Tycon.t * t vector val dest: t -> dest end mlton-20100608/mlton/xml/xml.fun0000644000076600000240000000052111404435624015023 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) functor Xml (S: XML_STRUCTS): XML = XmlSimplify (Shrink (TypeCheck (XmlTree (S)))) mlton-20100608/mlton/xml/xml.sig0000644000076600000240000000076211404435624015024 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) signature XML_STRUCTS = sig include XML_TREE_STRUCTS end signature XML = sig include XML_TREE val shrink: Program.t -> Program.t val simplify: Program.t -> Program.t val typeCheck: Program.t -> unit end mlton-20100608/mlyacc/0000755000076600000240000000000011404470407013030 5ustar mtfstaffmlton-20100608/mlyacc/.ignore0000644000076600000240000000011111404435642014307 0ustar mtfstaff*.call-graph.dot *.ssa mlyacc.exe mlyacc.pdf mlyacc.ps mlyacc.sml mlyacc mlton-20100608/mlyacc/call-main.sml0000644000076600000240000000041711404435642015406 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) val _ = Main.main() mlton-20100608/mlyacc/COPYRIGHT0000644000076600000240000000214711404435642014331 0ustar mtfstaffML-YACC COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. Copyright 1989, 1990 by David R. Tarditi Jr. and Andrew W. Appel Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the names of David R. Tarditi Jr. and Andrew W. Appel not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. David R. Tarditi Jr. and Andrew W. Appel disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall David R. Tarditi Jr. and Andrew W. Appel be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. mlton-20100608/mlyacc/doc/0000755000076600000240000000000011404470407013575 5ustar mtfstaffmlton-20100608/mlyacc/doc/.ignore0000644000076600000240000000010611404435641015057 0ustar mtfstaffhtml mlyacc.aux mlyacc.dvi mlyacc.log mlyacc.pdf mlyacc.ps mlyacc.toc mlton-20100608/mlyacc/doc/macros.hva0000644000076600000240000000003411404435641015557 0ustar mtfstaff\newcommand{\parbox}[2]{#2} mlton-20100608/mlyacc/doc/Makefile0000644000076600000240000000121311404435641015233 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: mlyacc.pdf html/index.html: $(TEX_FILES) mkdir -p html hevea -fix -o html/mlyacc.html -exec xxdate.exe macros.hva mlyacc.tex cd html && hacha mlyacc.html && rm -f mlyacc.html mlyacc.dvi: mlyacc.tex latex mlyacc.tex latex mlyacc.tex mlyacc.pdf: mlyacc.tex latex mlyacc.tex pdflatex mlyacc.tex mlyacc.ps: mlyacc.dvi dvips -o mlyacc.ps mlyacc.dvi .PHONY: clean clean: ../../bin/clean mlton-20100608/mlyacc/doc/mlyacc.tex0000644000076600000240000016377611404435641015614 0ustar mtfstaff\documentstyle{article} \title{ ML-Yacc User's Manual \\ Version 2.4 } \author{ David R. Tarditi$^1$\\ Andrew W. Appel$^2$\\ \\ $^1$Microsoft Research \\ \\ $^2$Department of Computer Science \\ Princeton University \\ Princeton, NJ 08544 } \date{April 24, 2000} \begin{document} \maketitle \begin{center} (c) 1989, 1990, 1991,1994 Andrew W. Appel, David R. Tarditi \end{center} {\bf This software comes with ABSOLUTELY NO WARRANTY. It is subject only to the terms of the ML-Yacc NOTICE, LICENSE, and DISCLAIMER (in the file COPYRIGHT distributed with this software). } New in this version: Improved error correction directive \verb|%change| that allows multi-token insertions, deletions, substitutions. Explanation of how to build a parser (Section 5) and the Calc example (Section 7) revised for SML/NJ Version 110 and the use of CM. \newpage \tableofcontents \newpage \section{Introduction} \subsection{General} ML-Yacc is a parser generator for Standard ML modeled after the Yacc parser generator. It generates parsers for LALR languages, like Yacc, and has a similar syntax. The generated parsers use a different algorithm for recovering from syntax errors than parsers generated by Yacc. The algorithm is a partial implementation of an algorithm described in \cite{bf}. A parser tries to recover from a syntax error by making a single token insertion, deletion, or substitution near the point in the input stream at which the error was detected. The parsers delay the evaluation of semantic actions until parses are completed successfully. This makes it possible for parsers to recover from syntax errors that occur before the point of error detection, but it does prevent the parsers from affecting lexers in any significant way. The parsers can insert tokens with values and substitute tokens with values for other tokens. All symbols carry left and right position values which are available to semantic actions and are used in syntactic error messages. ML-Yacc uses context-free grammars to specify the syntax of languages to be parsed. See \cite{ahu} for definitions and information on context-free grammars and LR parsing. We briefly review some terminology here. A context-free grammar is defined by a set of terminals $T$, a set of nonterminals $NT$, a set of productions $P$, and a start nonterminal $S$. Terminals are interchangeably referred to as tokens. The terminal and nonterminal sets are assumed to be disjoint. The set of symbols is the union of the nonterminal and terminal sets. We use lower case Greek letters to denote a string of symbols. We use upper case Roman letters near the beginning of the alphabet to denote nonterminals. Each production gives a derivation of a string of symbols from a nonterminal, which we will write as $A \rightarrow \alpha$. We define a relation between strings of symbols $\alpha$ and $\beta$, written $\alpha \vdash \beta$ and read as $\alpha$ derives $\beta$, if and only if $\alpha = \delta A \gamma$, $\beta = \delta \phi \gamma$ and there exists some production $A \rightarrow \phi$. We write the transitive closure of this relation as $\vdash_*$. We say that a string of terminals $\alpha$ is a valid sentence of the language, {\em i.e.} it is derivable, if the start symbol $S \vdash_* \alpha$. The sequence of derivations is often visualized as a parse tree. ML-Yacc uses an attribute grammar scheme with synthesized attributes. Each symbol in the grammar may have a value (i.e. attribute) associated with it. Each production has a semantic action associated with it. A production with a semantic action is called a rule. Parsers perform bottom-up, left-to-right evaluations of parse trees using semantic actions to compute values as they do so. Given a production $P = A \rightarrow \alpha$, the corresponding semantic action is used to compute a value for $A$ from the values of the symbols in $\alpha$. If $A$ has no value, the semantic action is still evaluated but the value is ignored. Each parse returns the value associated with the start symbol $S$ of the grammar. A parse returns a nullary value if the start symbol does not carry a value. The synthesized attribute scheme can be adapted easily to inherited attributes. An inherited attribute is a value which propagates from a nonterminal to the symbols produced by the nonterminal according to some rule. Since functions are values in ML, the semantic actions for the derived symbols can return functions which takes the inherited value as an argument. \subsection{Modules} ML-Yacc uses the ML modules facility to specify the interface between a parser that it generates and a lexical analyzer that must be supplied by you. It also uses the ML modules facility to factor out a set of modules that are common to every generated parser. These common modules include a parsing structure, which contains an error-correcting LR parser\footnote{A plain LR parser is also available.}, an LR table structure, and a structure which defines the representation of terminals. ML-Yacc produces a functor for a particular parser parameterized by the LR table structure and the representation of terminals. This functor contains values specific to the parser, such as the LR table for the parser\footnote{The LR table is a value. The LR table structure defines an abstract LR table type.}, the semantic actions for the parser, and a structure containing the terminals for the parser. ML-Yacc produces a signature for the structure produced by applying this functor and another signature for the structure containing the terminals for the parser. You must supply a functor for the lexing module parameterized this structure. Figure 1 is a dependency diagram of the modules that summarizes this information. A module at the head of an arrow is dependent on the module at the tail. \begin{figure} \begin{tabular}{|rcl|} \hline parsing structure & $\longrightarrow$ & values for a particular parser\\ values for a particular parser & $\longrightarrow$ & lexical analyzer\\ parsing structure, & $\longrightarrow$ & particular parser\\ values for a particular parser, & & \\ lexical analyzer & & \\ \hline \end{tabular} \caption{Module Dependencies} \end{figure} \subsection{Error Recovery} The error recovery algorithm is able to accurately recover from many single token syntax errors. It tries to make a single token correction at the token in the input stream at which the syntax error was detected and any of the 15 tokens\footnote{An arbitrary number chosen because numbers above this do not seem to improve error correction much.} before that token. The algorithm checks corrections before the point of error detection because a syntax error is often not detected until several tokens beyond the token which caused the error.\footnote{An LR parser detects a syntax error as soon as possible, but this does not necessarily mean that the token at which the error was detected caused the error.} The algorithm works by trying corrections at each of the 16 tokens up to and including the token at which the error was detected. At each token in the input stream, it will try deleting the token, substituting other tokens for the token, or inserting some other token before the token. The algorithm uses a parse check to evaluate corrections. A parse check is a check of how far a correction allows a parser to parse without encountering a syntax error. You pass an upper bound on how many tokens beyond the error point a parser may read while doing a parse check as an argument to the parser. This allows you to control the amount of lookahead that a parser reads for different kinds of systems. For an interactive system, you should set the lookahead to zero. Otherwise, a parser may hang waiting for input in the case of a syntax error. If the lookahead is zero, no syntax errors will be corrected. For a batch system, you should set the lookahead to 15. The algorithm selects the set of corrections which allows the parse to proceed the farthest and parse through at least the error token. It then removes those corrections involving keywords which do not meet a longer minimum parse check. If there is more than one correction possible after this, it uses a simple heuristic priority scheme to order the corrections, and then arbitrarily chooses one of the corrections with the highest priority. You have some control over the priority scheme by being able to name a set of preferred insertions and a set of preferred substitutions. The priorities for corrections, ordered from highest to lowest priority, are preferred insertions, preferred substitutions, insertions, deletions, and substitutions. The error recovery algorithm is guaranteed to terminate since it always selects fixes which parse through the error token. The error-correcting LR parser implements the algorithm by keeping a queue of its state stacks before shifting tokens and using a lazy stream for the lexer. This makes it possible to restart the parse from before an error point and try various corrections. The error-correcting LR parser does not defer semantic actions. Instead, ML-Yacc creates semantic actions which are free of side-effects and always terminate. ML-Yacc uses higher-order functions to defer the evaluation of all user semantic actions until the parse is successfully completed without constructing an explicit parse tree. You may declare whether your semantic actions are free of side-effects and always terminate, in which case ML-Yacc does not need to defer the evaluation of your semantic actions. \subsection{Precedence} ML-Yacc uses the same precedence scheme as Yacc for resolving shift/reduce conflicts. Each terminal may be assigned a precedence and associativity. Each rule is then assigned the precedence of its rightmost terminal. If a shift/reduce conflict occurs, the conflict is resolved silently if the terminal and the rule in the conflict have precedences. If the terminal has the higher precedence, the shift is chosen. If the rule has the higher precedence, the reduction is chosen. If both the terminal and the rule have the same precedence, then the associativity of the terminal is used to resolve the conflict. If the terminal is left associative, the reduction is chosen. If the terminal is right associative, the shift is chosen. Terminals may be declared to be nonassociative, also, in which case an error message is produced if the associativity is need to resolve the parsing conflict. If a terminal or a rule in a shift/reduce conflict does not have a precedence, then an error message is produced and the shift is chosen. In reduce/reduce conflicts, an error message is always produced and the first rule listed in the specification is chosen for reduction. \subsection{Notation} Text surrounded by brackets denotes meta-notation. If you see something like \{parser name\}, you should substitute the actual name of your parser for the meta-notation. Text in a bold-face typewriter font ({\tt like this}) denotes text in a specification or ML code. \section{ML-Yacc specifications} An ML-Yacc specification consists of three parts, each of which is separated from the others by a {\tt \%\%} delimiter. The general format is: \begin{quote} \tt \{user declarations\} \\ \%\% \\ \{ML-Yacc declarations\} \\ \%\% \\ \{rules\} \end{quote} You can define values available in the semantic actions of the rules in the user declarations section. It is recommended that you keep the size of this section as small as possible and place large blocks of code in other modules. The ML-Yacc declarations section is used to make a set of required declarations and a set of optional declarations. You must declare the nonterminals and terminals and the types of the values associated with them there. You must also name the parser and declare the type of position values. You should specify the set of terminals which can follow the start symbol and the set of non-shiftable terminals. You may optionally declare precedences for terminals, make declarations that will improve error-recovery, and suppress the generation of default reductions in the parser. You may declare whether the parser generator should create a verbose description of the parser in a ``.desc'' file. This is useful for finding the causes of shift/reduce errors and other parsing conflicts. You may also declare whether the semantic actions are free of significant side-effects and always terminate. Normally, ML-Yacc delays the evaluation of semantic actions until the completion of a successful parse. This ensures that there will be no semantic actions to ``undo'' if a syntactic error-correction invalidates some semantic actions. If, however, the semantic actions are free of significant side-effects and always terminate, the results of semantic actions that are invalidated by a syntactic error-correction can always be safely ignored. Parsers run faster and need less memory when it is not necessary to delay the evaluation of semantic actions. You are encouraged to write semantic actions that are free of side-effects and always terminate and to declare this information to ML-Yacc. A semantic action is free of significant side-effects if it can be reexecuted a reasonably small number of times without affecting the result of a parse. (The reexecution occurs when the error-correcting parser is testing possible corrections to fix a syntax error, and the number of times reexecution occurs is roughly bounded, for each syntax error, by the number of terminals times the amount of lookahead permitted for the error-correcting parser). The rules section contains the context-free grammar productions and their associated semantic actions. \subsection{Lexical Definitions} Comments have the same lexical definition as they do in Standard ML and can be placed anywhere in a specification. All characters up to the first occurrence of a delimiting {\tt \%\%} outside of a comment are placed in the user declarations section. After that, the following words and symbols are reserved: \begin{quote} \verb'of for = { } , * -> : | ( )' \end{quote} The following classes of ML symbols are used: \begin{quote} \begin{description} \item[identifiers:] nonsymbolic ML identifiers, which consist of an alphabetic character followed by one or more alphabetic characters, numeric characters, primes ``{\tt '}'', or underscores ``{\tt \_}''. \item[type variables:] nonsymbolic ML identifier starting with a prime ``{\tt '}'' \item[integers:] one or more decimal digits. \item[qualified identifiers:] an identifer followed by a period. \end{description} \end{quote} The following classes of non-ML symbols are used: \begin{quote} \begin{description} \item[\% identifiers:] a percent sign followed by one or more lowercase alphabet letters. The valid \% identifiers are: \begin{quote} \raggedright \tt \%arg \%eop \%header \%keyword \%left \%name \%nodefault \%nonassoc \%nonterm \%noshift \%pos \%prec \%prefer \%pure \%right \%start \%subst \%term \%value \%verbose \end{quote} \item[code:] This class is meant to hold ML code. The ML code is not parsed for syntax errors. It consists of a left parenthesis followed by all characters up to a balancing right parenthesis. Parentheses in ML comments and ML strings are excluded from the count of balancing parentheses. \end{description} \end{quote} \subsection{Grammar} This is the grammar for specifications: \begin{eqnarray*} \mbox{spec} & ::= & \mbox{user-declarations {\tt \%\%} cmd-list {\tt \%\%} rule-list} \\ \mbox{ML-type} & ::= & \mbox{nonpolymorphic ML types (see the Standard ML manual)} \\ \mbox{symbol} & ::= & \mbox{identifier} \\ \mbox{symbol-list} & ::= & \mbox{symbol-list symbol} \\ & | & \epsilon \\ \mbox{symbol-type-list} & ::= & \mbox{symbol-type-list {\tt |} symbol {\tt of} ML-type} \\ & | & \mbox{symbol-type list {\tt |} symbol} \\ & | & \mbox{symbol {\tt of} ML-type} \\ & | & \mbox{symbol} \\ \mbox{subst-list} & ::= & \mbox{subst-list {\tt |} symbol {\tt for} symbol} \\ & | & \epsilon \\ \mbox{cmd} & ::= & \mbox{{\tt \%arg} (Any-ML-pattern) {\tt :} ML-type} \\ & | & \mbox{{\tt \%eop} symbol-list} \\ & | & \mbox{{\tt \%header} code} \\ & | & \mbox{{\tt \%keyword} symbol-list} \\ & | & \mbox{{\tt \%left} symbol-list} \\ & | & \mbox{{\tt \%name} identifier} \\ & | & \mbox{{\tt \%nodefault}} \\ & | & \mbox{{\tt \%nonassoc} symbol-list} \\ & | & \mbox{{\tt \%nonterm} symbol-type list} \\ & | & \mbox{{\tt \%noshift} symbol-list } \\ & | & \mbox{{\tt \%pos} ML-type} \\ & | & \mbox{{\tt \%prefer} symbol-list} \\ & | & \mbox{\tt \%pure} \\ & | & \mbox{{\tt \%right} symbol-list} \\ & | & \mbox{{\tt \%start} symbol} \\ & | & \mbox{{\tt \%subst} subst-list} \\ & | & \mbox{{\tt \%term} symbol-type-list} \\ & | & \mbox{{\tt \%value} symbol code} \\ & | & \mbox{{\tt \%verbose}} \\ \mbox{cmd-list} & ::= &\mbox{ cmd-list cmd} \\ & | & \mbox{cmd} \\ \mbox{rule-prec} & ::= & \mbox{{\tt \%prec} symbol} \\ & | & \epsilon \\ \mbox{clause-list} & ::= & \mbox{symbol-list rule-prec code} \\ & | & \mbox{clause-list {\tt |} symbol-list rule-prec code} \\ \mbox{rule} & ::= & \mbox{symbol {\tt :} clause-list} \\ \mbox{rule-list} & ::= & \mbox{rule-list rule} \\ & | & \mbox{rule} \end{eqnarray*} \subsection{Required ML-Yacc Declarations} \begin{description} \item[{\tt \%name}] You must specify the name of the parser with {\tt \%name} \{name\}. \item[{\tt \%nonterm} and {\tt \%term}] You must define the terminal and nonterminal sets using the {\tt \%term} and {\tt \%nonterm} declarations, respectively. These declarations are like an ML datatype definition. The type of the value that a symbol may carry is defined at the same time that the symbol is defined. Each declarations consists of the keyword ({\tt \%term} or {\tt \%nonterm}) followed by a list of symbol entries separated by a bar (``{\tt |}''). Each symbol entry is a symbol name followed by an optional ``of \/ $<$ML-type$>$''. The types cannot be polymorphic. Those symbol entries without a type carry no value. Nonterminal and terminal names must be disjoint and no name may be declared more than once in either declaration. The symbol names and types are used to construct a datatype union for the values on the semantic stack in the LR parser and to name the values associated with subcomponents of a rule. The names and types of terminals are also used to construct a signature for a structure that may be passed to the lexer functor. Because the types and names are used in these manners, do not use ML keywords as symbol names. The programs produced by ML-Yacc will not compile if ML keywords are used as symbol names. Make sure that the types specified in the {\tt \%term} declaration are fully qualified types or are available in the background environment when the signatures produced by ML-Yacc are loaded. Do not use any locally defined types from the user declarations section of the specification. These requirements on the types in the {\tt \%term} declaration are not a burden. They force the types to be defined in another module, which is a good idea since these types will be used in the lexer module. \item[{\tt \%pos}] You must declare the type of position values using the {\tt \%pos} declaration. The syntax is {\tt \%pos} $<$ML-type$>$. This type MUST be the same type as that which is actually found in the lexer. It cannot be polymorphic. \end{description} \subsection{Optional ML-Yacc Declarations} \label{optional-def} \begin{description} \item[{\tt \%arg}] You may want each invocation of the entire parser to be parameterized by a particular argument, such as the file-name of the input being parsed in an invocation of the parser. The {\tt \%arg} declaration allows you to specify such an argument. (This is often cleaner than using ``global'' reference variables.) The declaration \begin{quote} {\tt \%arg} (Any-ML-pattern) {\tt :} $<$ML-type$>$ \end{quote} specifies the argument to the parser, as well as its type. For example: \begin{quote} {\tt \%arg (filename) : string} \end{quote} If {\tt \%arg} is not specified, it defaults to {\tt () : unit}. \item[{\tt \%eop} and {\tt \%noshift}] You should specify the set of terminals that may follow the start symbol, also called end-of-parse symbols, using the {\tt \%eop} declaration. The {\tt \%eop} keyword should be followed by the list of terminals. This is useful, for example, in an interactive system where you want to force the evaluation of a statement before an end-of-file (remember, a parser delays the execution of semantic actions until a parse is successful). ML-Yacc has no concept of an end-of-file. You must define an end-of-file terminal (EOF, perhaps) in the {\tt \%term} declaration. You must declare terminals which cannot be shifted, such as end-of-file, in the {\tt \%noshift} declaration. The {\tt \%noshift} keyword should be followed by the list of non-shiftable terminals. An error message will be printed if a non-shiftable terminal is found on the right hand side of any rule, but ML-Yacc will not prevent you from using such grammars. It is important to emphasize that \begin{em} non-shiftable terminals must be declared. \end{em} The error-correcting parser may attempt to read past such terminals while evaluating a correction to a syntax error otherwise. This may confuse the lexer. \item[{\tt \%header}] You may define code to head the functor \{parser name\}LrValsFun here. This may be useful for adding additonal parameter structures to the functor. The functor must be parameterized by the Token structure, so the declaration should always have the form: \begin{quote} \begin{verbatim} %header (functor {parser name}LrValsFun( structure Token : TOKEN ...) ) \end{verbatim} \end{quote} \item[{\tt \%left},{\tt \%right},{\tt \%nonassoc}] You should list the precedence declarations in order of increasing (tighter-binding) precedence. Each precedence declaration consists of \% keyword specifying associativity followed by a list of terminals. The keywords are {\tt \%left}, {\tt \%right}, and {\tt \%nonassoc}, standing for their respective associativities. \item[{\tt \%nodefault}] The {\tt \%nodefault} declaration suppresses the generation of default reductions. If only one production can be reduced in a given state in an LR table, it may be made the default action for the state. An incorrect reduction will be caught later when the parser attempts to shift the lookahead terminal which caused the reduction. ML-Yacc usually produces programs and verbose files with default reductions. This saves a great deal of space in representing the LR tables,but sometimes it is useful for debugging and advanced uses of the parser to suppress the generation of default reductions. \item[{\tt \%pure}] Include the {\tt \%pure} declaration if the semantic actions are free of significant side-effects and always terminate. \item[{\tt \%start}] You may define the start symbol using the {\tt \%start} declaration. Otherwise the nonterminal for the first rule will be used as the start nonterminal. The keyword {\tt \%start} should be followed by the name of the starting nonterminal. This nonterminal should not be used on the right hand side of any rules, to avoid conflicts between reducing to the start symbol and shifting a terminal. ML-Yacc will not prevent you from using such grammars, but it will print a warning message. \item[{\tt \%verbose}] Include the {\tt \%verbose} declaration to produce a verbose description of the LALR parser. The name of this file is the name of the specification file with a ``.desc'' appended to it. This file has the following format: \begin{enumerate} \item A summary of errors found while generating the LALR tables. \item A detailed description of all errors. \item A description of the states of the parser. Each state is preceded by a list of conflicts in the state. \end{enumerate} \end{description} \subsection{Declarations for improving error-recovery} These optional declarations improve error-recovery: \begin{description} \item[{\tt \%keyword}] Specify all keywords in a grammar here. The {\tt \%keyword} should be followed by a list of terminal names. Fixes involving keywords are generally dangerous; they are prone to substantially altering the syntactic meaning of the program. They are subject to a more rigorous parse check than other fixes. \item[{\tt \%prefer}] List terminals to prefer for insertion after the {\tt \%prefer}. Corrections which insert a terminal on this list will be chosen over other corrections, all other things being equal. \item[{\tt \%subst}] This declaration should be followed by a list of clauses of the form \{terminal\} {\tt for} \{terminal\}, where items on the list are separated using a {\tt |}. Substitution corrections on this list will be chosen over all other corrections except preferred insertion corrections (listed above), all other things being equal. \item[{\tt \%change}] This is a generalization of {\tt \%prefer} and {\tt \%subst}. It takes a the following syntax: \begin{quote} ${\it tokens}_{1a}$ \verb|->| ${\it tokens}_{1b}$ \verb+|+ ${\it tokens}_{2a}$ \verb|->| ${\it tokens}_{2b}$ {\it etc.} \end{quote} where each {\it tokens} is a (possibly empty) seqence of tokens. The idea is that any instance of ${\it tokens}_{1a}$ can be ``corrected'' to ${\it tokens}_{1b}$, and so on. For example, to suggest that a good error correction to try is \verb|IN ID END| (which is useful for the ML parser), write, \begin{verbatim} %change -> IN ID END \end{verbatim} \item[{\tt \%value}] The error-correction algorithm may also insert terminals with values. You must supply a value for such a terminal. The keyword should be followed by a terminal and a piece of code (enclosed in parentheses) that when evaluated supplies the value. There must be a separate {\tt \%value} declaration for each terminal with a value that you wish may be inserted or substituted in an error correction. The code for the value is not evaluated until the parse is successful. Do not specify a {\tt \%value} for terminals without values. This will result in a type error in the program produced by ML-Yacc. \end{description} \subsection{Rules} All rules are declared in the final section, after the last {\tt \%\%} delimiter. A rule consists of a left hand side nonterminal, followed by a colon, followed by a list of right hand side clauses. The right hand side clauses should be separated by bars (``{\tt |}''). Each clause consists of a list of nonterminal and terminal symbols, followed by an optional {\tt \%prec} declaration, and then followed by the code to be evaluated when the rule is reduced. The optional {\tt \%prec} consists of the keyword {\tt \%prec} followed by a terminal whose precedence should be used as the precedence of the rule. The values of those symbols on the right hand side which have values are available inside the code. Positions for all the symbols are also available. Each value has the general form \{symbol name\}\{n+1\}, where \{n\} is the number of occurrences of the symbol to the left of the symbol. If the symbol occurs only once in the rule, \{symbol name\} may also be used. The positions are given by \{symbol~name\}\{n+1\}left and \{symbol~name\}\{n+1\}right. where \{n\} is defined as before. The position for a null rhs of a production is assumed to be the leftmost position of the lookahead terminal which is causing the reduction. This position value is available in {\tt defaultPos}. The value to which the code evaluates is used as the value of the nonterminal. The type of the value and the nonterminal must match. The value is ignored if the nonterminal has no value, but is still evaluated for side-effects. \section{Producing files with ML-Yacc} ML-Yacc may be used from the interactive system or built as a stand-alone program which may be run from the Unix command line. See the file {\bf README} in the mlyacc directory for directions on installing ML-Yacc. We recommend thaat ML-Yacc be installed as a stand-alone program. If you are using the stand-alone version of ML-Yacc, invoke the program ``sml-yacc'' with the name of the specifcation file. If you are using ML-Yacc in the interactive system, load the file ``smlyacc.sml''. The end result is a structure ParseGen, with one value parseGen in it. Apply parseGen to a string containing the name of the specification file. Two files will be created, one named by attaching ``.sig'' to the name of the specification, the other named by attaching ``.sml'' to the name of the specification. \section{The lexical analyzer} Let the name for the parser given in the {\tt \%name} declaration be denoted by \{n\} and the specification file name be denoted by \{spec name\} The parser generator creates a functor named \{n\}LrValsFun for the values needed for a particular parser. This functor is placed in \{spec name\}.sml. This functor contains a structure Tokens which allows you to construct terminals from the appropriate values. The structure has a function for each terminal that takes a tuple consisting of the value for the terminal (if there is any), a leftmost position for the terminal, and a rightmost position for the terminal and constructs the terminal from these values. A signature for the structure Tokens is created and placed in the ``.sig'' file created by ML-Yacc. This signature is \{n\}\_TOKENS, where \{n\} is the name given in the parser specification. A signature \{n\}\_LRVALS is created for the structure produced by applying \{n\}LrValsFun. Use the signature \{n\}\_TOKENS to create a functor for the lexical analyzer which takes the structure Tokens as an argument. The signature \{n\}\_TOKENS will not change unless the {\tt \%term} declaration in a specification is altered by adding terminals or changing the types of terminals. You do not need to recompile the lexical analyzer functor each time the specification for the parser is changed if the signature \{n\}\_TOKENS does not change. If you are using ML-Lex to create the lexical analyzer, you can turn the lexer structure into a functor using the {\tt \%header} declaration. {\tt \%header} allows the user to define the header for a structure body. If the name of the parser in the specification were Calc, you would add this declaration to the specification for the lexical analyzer: \begin{quote} \tt \begin{verbatim} %header (functor CalcLexFun(structure Tokens : Calc_TOKENS)) \end{verbatim} \end{quote} You must define the following in the user definitions section: \begin{quote} \tt \begin{verbatim} type pos \end{verbatim} \end{quote} This is the type of position values for terminals. This type must be the same as the one declared in the specification for the grammar. Note, however, that this type is not available in the Tokens structure that parameterizes the lexer functor. You must include the following code in the user definitions section of the ML-Lex specification: \begin{quote} \tt \begin{verbatim} type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult = (svalue,pos) token \end{verbatim} \end{quote} These types are used to give lexers signatures. You may use a lexer constructed using ML-Lex with the {\tt \%arg} declaration, but you must follow special instructions for tying the parser and lexer together. \section{Creating the parser} \label{create-parser} Let the name of the grammar specification file be denoted by \{grammar\} and the name of the lexer specification file be denoted by \{lexer\} (e.g. in our calculator example these would stand for calc.grm and calc.lex, respectively). Let the parser name in the specification be represented by \{n\} (e.g. Calc in our calculator example). To construct a parser, do the following: \begin{enumerate} \item In the appropriate CM description file (e.g. for your main program or one of its subgroups or libraries), include the lines: \begin{quote} \begin{verbatim} ml-yacc-lib.cm {lexer} {grammar} \end{verbatim} \end{quote} This will cause ML-Yacc to be run on \{grammar\}, producing source files \{grammar\}.sig and \{grammar\}.sml, and ML-Lex to be run on \{lexer\}, producing a source file \{lexer\}.sml. Then these files will be compiled after loading the necessary signatures and modules from the ML-Yacc library as specified by {\tt ml-yacc-lib.cm}. \item Apply functors to create the parser: \begin{quote} \begin{verbatim} structure {n}LrVals = {n}LrValsFun(structure Token = LrParser.Token) structure {n}Lex = {n}LexFun(structure Tokens = {n}LrVals.Tokens) structure {n}Parser= Join(structure ParserData = {n}LrVals.ParserData structure Lex={n}Lex structure LrParser=LrParser) \end{verbatim} \end{quote} If the lexer was created using the {\tt \%arg} declaration in ML-Lex, the definition of \{n\}Parser must be changed to use another functor called JoinWithArg: \begin{quote} \begin{verbatim} structure {n}Parser= JoinWithArg (structure ParserData={n}LrVals.ParserData structure Lex={n}Lex structure LrParser=LrParser) \end{verbatim} \end{quote} \end{enumerate} The following outline summarizes this process: \begin{quote} \begin{verbatim} (* available at top level *) TOKEN LR_TABLE STREAM LR_PARSER PARSER_DATA structure LrParser : LR_PARSER (* printed out in .sig file created by parser generator: *) signature {n}_TOKENS = sig structure Token : TOKEN type svalue val PLUS : 'pos * 'pos -> (svalue,'pos) Token.token val INTLIT : int * 'pos * 'pos -> (svalue,'pos) Token.token ... end signature {n}_LRVALS = sig structure Tokens : {n}_TOKENS structure ParserData : PARSER_DATA sharing ParserData.Token = Tokens.Token sharing type ParserData.svalue = Tokens.svalue end (* printed out by lexer generator: *) functor {n}LexFun(structure Tokens : {n}_TOKENS)= struct ... end (* printed out in .sml file created by parser generator: *) functor {n}LrValsFun(structure Token : TOKENS) = struct structure ParserData = struct structure Token = Token (* code in header section of specification *) structure Header = ... type svalue = ... type result = ... type pos = ... structure Actions = ... structure EC = ... val table = ... end structure Tokens : {n}_TOKENS = struct structure Token = ParserData.Token type svalue = ... fun PLUS(p1,p2) = ... fun INTLIT(i,p1,p2) = ... end end (* to be done by the user: *) structure {n}LrVals = {n}LrValsFun(structure Token = LrParser.Token) structure {n}Lex = {n}LexFun(structure Tokens = {n}LrVals.Tokens) structure {n}Parser = Join(structure Lex = {n}Lex structure ParserData = {n}ParserData structure LrParser = LrParser) \end{verbatim} \end{quote} \section{Using the parser} \subsection{Parser Structure Signatures} The final structure created will have the signature PARSER: \begin{quote} \begin{verbatim} signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type pos (* pos is the type of line numbers *) type result (* value returned by the parser *) type arg (* type of the user-supplied argument *) type svalue (* the types of semantic values *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end \end{verbatim} \end{quote} or the signature ARG\_PARSER if you used {\tt \%arg} to create the lexer. This signature differs from ARG\_PARSER in that it which has an additional type {\tt lexarg} and a different type for {\tt makeLexer}: \begin{quote} \begin{verbatim} type lexarg val makeLexer : (int -> string) -> lexarg -> (svalue,pos) token stream \end{verbatim} \end{quote} The signature STREAM (providing lazy streams) is: \begin{quote} \begin{verbatim} signature STREAM = sig type 'a stream val streamify : (unit -> 'a) -> 'a stream val cons : 'a * 'a stream -> 'a stream val get : 'a stream -> 'a * 'a stream end \end{verbatim} \end{quote} \subsection{Using the parser structure} The parser structure converts the lexing function produced by ML-Lex into a function which creates a lazy stream of tokens. The function {\tt makeLexer} takes the same values as the corresponding {\tt makeLexer} created by ML-Lex, but returns a stream of tokens instead of a function which yields tokens. The function parse takes the token stream and some other arguments that are described below and parses the token stream. It returns a pair composed of the value associated with the start symbol and the rest of the token stream. The rest of the token stream includes the end-of-parse symbol which caused the reduction of some rule to the start symbol. The function parse raises the exception ParseError if a syntax error occurs which it cannot fix. The lazy stream is implemented by the {\tt Stream} structure. The function {\tt streamify} converts a conventional implementation of a stream into a lazy stream. In a conventional implementation of a stream, a stream consists of a position in a list of values. Fetching a value from a stream returns the value associated with the position and updates the position to the next element in the list of values. The fetch is a side-effecting operation. In a lazy stream, a fetch returns a value and a new stream, without a side-effect which updates the position value. This means that a stream can be repeatedly re-evaluated without affecting the values that it returns. If $f$ is the function that is passed to {\tt streamify}, $f$ is called only as many times as necessary to construct the portion of the list of values that is actually used. Parse also takes an integer giving the maximum amount of lookahead permitted for the error-correcting parse, a function to print error messages, and a value of type arg. The maximum amount of lookahead for interactive systems should be zero. In this case, no attempt is made to correct any syntax errors. For non-interactive systems, try 15. The function to print error messages takes a tuple of values consisting of the left and right positions of the terminal which caused the error and an error message. If the {\tt \%arg} declaration is not used, the value of type arg should be a value of type unit. The function sameToken can be used to see if two tokens denote the same terminal, irregardless of any values that the tokens carry. It is useful if you have multiple end-of-parse symbols and must check which end-of-parse symbol has been left on the front of the token stream. The types have the following meanings. The type {\tt arg} is the type of the additional argument to the parser, which is specified by the {\tt \%arg} declaration in the ML-Yacc specification. The type {\tt lexarg} is the optional argument to lexers, and is specified by the {\tt \%arg} declaration in an ML-Lex specifcation. The type {\tt pos} is the type of line numbers, and is specified by the {\tt \%pos} declaration in an ML-Yacc specification and defined in the user declarations section of the ML-Lex specification. The type {\tt result} is the type associated with the start symbol in the ML-Yacc specification. \section{Examples} See the directory examples for examples of parsers constructed using ML-Yacc. Here is a small sample parser and lexer for an interactive calculator, from the directory examples/calc, along with code for creating a parsing function. The calculator reads one or more expressions from the standard input, evaluates the expressions, and prints their values. Expressions should be separated by semicolons, and may also be ended by using an end-of-file. This shows how to construct an interactive parser which reads a top-level declaration and processes the declaration before reading the next top-level declaration. \subsection{Sample Grammar} \begin{tt} \begin{verbatim} (* Sample interactive calculator for ML-Yacc *) fun lookup "bogus" = 10000 | lookup s = 0 %% %eop EOF SEMI (* %pos declares the type of positions for terminals. Each symbol has an associated left and right position. *) %pos int %left SUB PLUS %left TIMES DIV %right CARAT %term ID of string | NUM of int | PLUS | TIMES | PRINT | SEMI | EOF | CARAT | DIV | SUB %nonterm EXP of int | START of int option %name Calc %subst PRINT for ID %prefer PLUS TIMES DIV SUB %keyword PRINT SEMI %noshift EOF %value ID ("bogus") %nodefault %verbose %% (* the parser returns the value associated with the expression *) START : PRINT EXP (print EXP; print "\n"; flush_out std_out; SOME EXP) | EXP (SOME EXP) | (NONE) EXP : NUM (NUM) | ID (lookup ID) | EXP PLUS EXP (EXP1+EXP2) | EXP TIMES EXP (EXP1*EXP2) | EXP DIV EXP (EXP1 div EXP2) | EXP SUB EXP (EXP1-EXP2) | EXP CARAT EXP (let fun e (m,0) = 1 | e (m,l) = m*e(m,l-1) in e (EXP1,EXP2) end) \end{verbatim} \end{tt} \subsection{Sample Lexer} \begin{tt} \begin{verbatim} structure Tokens = Tokens type pos = int type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult= (svalue,pos) token val pos = ref 0 val eof = fn () => Tokens.EOF(!pos,!pos) val error = fn (e,l : int,_) => output(std_out,"line " ^ (makestring l) ^ ": " ^ e ^ "\n") %% %header (functor CalcLexFun(structure Tokens: Calc_TOKENS)); alpha=[A-Za-z]; digit=[0-9]; ws = [\ \t]; %% \n => (pos := (!pos) + 1; lex()); {ws}+ => (lex()); {digit}+ => (Tokens.NUM (revfold (fn (a,r) => ord(a)-ord("0")+10*r) (explode yytext) 0, !pos,!pos)); "+" => (Tokens.PLUS(!pos,!pos)); "*" => (Tokens.TIMES(!pos,!pos)); ";" => (Tokens.SEMI(!pos,!pos)); {alpha}+ => (if yytext="print" then Tokens.PRINT(!pos,!pos) else Tokens.ID(yytext,!pos,!pos) ); "-" => (Tokens.SUB(!pos,!pos)); "^" => (Tokens.CARAT(!pos,!pos)); "/" => (Tokens.DIV(!pos,!pos)); "." => (error ("ignoring bad character "^yytext,!pos,!pos); lex()); \end{verbatim} \end{tt} \subsection{Top-level code} You must follow the instructions in Section~\ref{create-parser} to create the parser and lexer functors and load them. After you have done this, you must then apply the functors to produce the {\tt CalcParser} structure. The code for doing this is shown below. \begin{quote} \begin{verbatim} structure CalcLrVals = CalcLrValsFun(structure Token = LrParser.Token) structure CalcLex = CalcLexFun(structure Tokens = CalcLrVals.Tokens); structure CalcParser = Join(structure LrParser = LrParser structure ParserData = CalcLrVals.ParserData structure Lex = CalcLex) \end{verbatim} \end{quote} Now we need a function which given a lexer invokes the parser. The function {\tt invoke} does this. \begin{quote} \begin{verbatim} fun invoke lexstream = let fun print_error (s,i:int,_) = TextIO.output(TextIO.stdOut, "Error, line " ^ (Int.toString i) ^ ", " ^ s ^ "\n") in CalcParser.parse(0,lexstream,print_error,()) end \end{verbatim} \end{quote} Finally, we need a function which can read one or more expressions from the standard input. The function {\tt parse}, shown below, does this. It runs the calculator on the standard input and terminates when an end-of-file is encountered. \begin{quote} \begin{verbatim} fun parse () = let val lexer = CalcParser.makeLexer (fn _ => TextIO.inputLine TextIO.stdIn) val dummyEOF = CalcLrVals.Tokens.EOF(0,0) val dummySEMI = CalcLrVals.Tokens.SEMI(0,0) fun loop lexer = let val (result,lexer) = invoke lexer val (nextToken,lexer) = CalcParser.Stream.get lexer in case result of SOME r => TextIO.output(TextIO.stdOut, "result = " ^ (Int.toString r) ^ "\n") | NONE => (); if CalcParser.sameToken(nextToken,dummyEOF) then () else loop lexer end in loop lexer end \end{verbatim} \end{quote} \section{Signatures} This section contains signatures used by ML-Yacc for structures in the file base.sml, functors and structures that it generates, and for the signatures of lexer structures supplied by you. \subsection{Parsing structure signatures} \begin{quote} \begin{verbatim} (* STREAM: signature for a lazy stream.*) signature STREAM = sig type 'a stream val streamify : (unit -> 'a) -> 'a stream val cons : 'a * 'a stream -> 'a stream val get : 'a stream -> 'a * 'a stream end (* LR_TABLE: signature for an LR Table.*) signature LR_TABLE = sig datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist datatype state = STATE of int datatype term = T of int datatype nonterm = NT of int datatype action = SHIFT of state | REDUCE of int | ACCEPT | ERROR type table val numStates : table -> int val numRules : table -> int val describeActions : table -> state -> (term,action) pairlist * action val describeGoto : table -> state -> (nonterm,state) pairlist val action : table -> state * term -> action val goto : table -> state * nonterm -> state val initialState : table -> state exception Goto of state * nonterm val mkLrTable : {actions : ((term,action) pairlist * action) array, gotos : (nonterm,state) pairlist array, numStates : int, numRules : int, initialState : state} -> table end (* TOKEN: signature for the internal structure of a token.*) signature TOKEN = sig structure LrTable : LR_TABLE datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b) val sameToken : ('a,'b) token * ('a,'b) token -> bool end (* LR_PARSER: signature for a polymorphic LR parser *) signature LR_PARSER = sig structure Stream: STREAM structure LrTable : LR_TABLE structure Token : TOKEN sharing LrTable = Token.LrTable exception ParseError val parse: {table : LrTable.table, lexer : ('b,'c) Token.token Stream.stream, arg: 'arg, saction : int * 'c * (LrTable.state * ('b * 'c * 'c)) list * 'arg -> LrTable.nonterm * ('b * 'c * 'c) * ((LrTable.state *('b * 'c * 'c)) list), void : 'b, ec: {is_keyword : LrTable.term -> bool, noShift : LrTable.term -> bool, preferred_subst:LrTable.term -> LrTable.term list, preferred_insert : LrTable.term -> bool, errtermvalue : LrTable.term -> 'b, showTerminal : LrTable.term -> string, terms: LrTable.term list, error : string * 'c * 'c -> unit }, lookahead : int (* max amount of lookahead used in * error correction *) } -> 'b * (('b,'c) Token.token Stream.stream) end \end{verbatim} \end{quote} \subsection{Lexers} Lexers for use with ML-Yacc's output must match one of these signatures. \begin{quote} \begin{verbatim} signature LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue end val makeLexer : (int -> string) -> unit -> (UserDeclarations.svalue, UserDeclarations.pos) UserDeclarations.token end (* ARG_LEXER: the %arg option of ML-Lex allows users to produce lexers which also take an argument before yielding a function from unit to a token. *) signature ARG_LEXER = sig structure UserDeclarations : sig type ('a,'b) token type pos type svalue type arg end val makeLexer : (int -> string) -> UserDeclarations.arg -> unit -> (UserDeclarations.svalue, UserDeclarations.pos) UserDeclarations.token end \end{verbatim} \end{quote} \subsection{Signatures for the functor produced by ML-Yacc} The following signature is used in signatures generated by ML-Yacc: \begin{quote} \begin{verbatim} (* PARSER_DATA: the signature of ParserData structures in {n}LrValsFun functor produced by ML-Yacc. All such structures match this signature. *) signature PARSER_DATA = sig type pos (* the type of line numbers *) type svalue (* the type of semantic values *) type arg (* the type of the user-supplied *) (* argument to the parser *) type result structure LrTable : LR_TABLE structure Token : TOKEN sharing Token.LrTable = LrTable structure Actions : sig val actions : int * pos * (LrTable.state * (svalue * pos * pos)) list * arg -> LrTable.nonterm * (svalue * pos * pos) * ((LrTable.state *(svalue * pos * pos)) list) val void : svalue val extract : svalue -> result end (* structure EC contains information used to improve error recovery in an error-correcting parser *) structure EC : sig val is_keyword : LrTable.term -> bool val noShift : LrTable.term -> bool val preferred_subst: LrTable.term -> LrTable.term list val preferred_insert : LrTable.term -> bool val errtermvalue : LrTable.term -> svalue val showTerminal : LrTable.term -> string val terms: LrTable.term list end (* table is the LR table for the parser *) val table : LrTable.table end \end{verbatim} \end{quote} ML-Yacc generates these two signatures: \begin{quote} \begin{verbatim} (* printed out in .sig file created by parser generator: *) signature {n}_TOKENS = sig type ('a,'b) token type svalue ... end signature {n}_LRVALS = sig structure Tokens : {n}_TOKENS structure ParserData : PARSER_DATA sharing type ParserData.Token.token = Tokens.token sharing type ParserData.svalue = Tokens.svalue end \end{verbatim} \end{quote} \subsection{User parser signatures} Parsers created by applying the Join functor will match this signature: \begin{quote} \begin{verbatim} signature PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type pos (* pos is the type of line numbers *) type result (* value returned by the parser *) type arg (* type of the user-supplied argument *) type svalue (* the types of semantic values *) val makeLexer : (int -> string) -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end \end{verbatim} \end{quote} Parsers created by applying the JoinWithArg functor will match this signature: \begin{quote} \begin{verbatim} signature ARG_PARSER = sig structure Token : TOKEN structure Stream : STREAM exception ParseError type arg type lexarg type pos type result type svalue val makeLexer : (int -> string) -> lexarg -> (svalue,pos) Token.token Stream.stream val parse : int * ((svalue,pos) Token.token Stream.stream) * (string * pos * pos -> unit) * arg -> result * (svalue,pos) Token.token Stream.stream val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token -> bool end \end{verbatim} \end{quote} \section{Sharing constraints} Let the name of the parser be denoted by \{n\}. If you have not created a lexer which takes an argument, and you have followed the directions given earlier for creating the parser, you will have the following structures with the following signatures: \begin{quote} \begin{verbatim} (* always present *) signature TOKEN signature LR_TABLE signature STREAM signature LR_PARSER signature PARSER_DATA structure LrParser : LR_PARSER (* signatures generated by ML-Yacc *) signature {n}_TOKENS signature {n}_LRVALS (* structures created by you *) structure {n}LrVals : {n}_LRVALS structure Lex : LEXER structure {n}Parser : PARSER \end{verbatim} \end{quote} The following sharing constraints will exist: \begin{quote} \begin{verbatim} sharing {n}Parser.Token = LrParser.Token = {n}LrVals.ParserData.Token sharing {n}Parser.Stream = LrParser.Stream sharing type {n}Parser.arg = {n}LrVals.ParserData.arg sharing type {n}Parser.result = {n}LrVals.ParserData.result sharing type {n}Parser.pos = {n}LrVals.ParserData.pos = Lex.UserDeclarations.pos sharing type {n}Parser.svalue = {n}LrVals.ParserData.svalue = {n}LrVals.Tokens.svalue = Lex.UserDeclarations.svalue sharing type {n}Parser.Token.token = {n}LrVals.ParserData.Token.token = LrParser.Token.token = Lex.UserDeclarations.token sharing {n}LrVals.LrTable = LrParser.LrTable \end{verbatim} \end{quote} If you used a lexer which takes an argument, then you will have: \begin{quote} \begin{verbatim} structure ARG_LEXER structure {n}Parser : PARSER (* additional sharing constraint *) sharing type {n}Parser.lexarg = Lex.UserDeclarations.arg \end{verbatim} \end{quote} \section{Hints} \subsection{Multiple start symbols} To have multiple start symbols, define a dummy token for each start symbol. Then define a start symbol which derives the multiple start symbols with dummy tokens placed in front of them. When you start the parser you must place a dummy token on the front of the lexer stream to select a start symbol from which to begin parsing. Assuming that you have followed the naming conventions used before, create the lexer using the makeLexer function in the \{n\}Parser structure. Then, place the dummy token on the front of the lexer: \begin{quote} \begin{verbatim} val dummyLexer = {n}Parser.Stream.cons ({n}LrVals.Tokens.{dummy token name} ({dummy lineno},{dummy lineno}), lexer) \end{verbatim} \end{quote} You have to pass a Tokens structure to the lexer. This Tokens structure contains functions which construct tokens from values and line numbers. So to create your dummy token just apply the appropriate token constructor function from this Tokens structure to a value (if there is one) and the line numbers. This is exactly what you do in the lexer to construct tokens. Then you must place the dummy token on the front of your lex stream. The structure \{n\}Parser contains a structure Stream which implements lazy streams. So you just cons the dummy token on to stream returned by makeLexer. \subsection{Functorizing things further} You may wish to functorize things even further. Two possibilities are turning the lexer and parser structures into closed functors, that is, functors which do not refer to types or values defined outside their body or outside their parameter structures (except for pervasive types and values), and creating a functor which encapsulates the code necessary to invoke the parser. Use the {\tt \%header} declarations in ML-Lex and ML-Yacc to create closed functors. See section~\ref{optional-def} of this manual and section 4 of the manual for ML-Lex for complete descriptions of these declarations. If you do this, you should also parameterize these structures by the types of line numbers. The type will be an abstract type, so you will also need to define all the valid operations on the type. The signature INTERFACE, defined below, shows one possible signature for a structure defining the line number type and associated operations. If you wish to encapsulate the code necessary to invoke the parser, your functor generally will have form: \begin{quote} \begin{verbatim} functor Encapsulate( structure Parser : PARSER structure Interface : INTERFACE sharing type Parser.arg = Interface.arg sharing type Parser.pos = Interface.pos sharing type Parser.result = ... structure Tokens : {parser name}_TOKENS sharing type Tokens.token = Parser.Token.token sharing type Tokens.svalue = Parser.svalue) = struct ... end \end{verbatim} \end{quote} The signature INTERFACE, defined below, is a possible signature for a structure defining the types of line numbers and arguments (types pos and arg, respectively) along with operations for them. You need this structure because these types will be abstract types inside the body of your functor. \begin{quote} \begin{verbatim} signature INTERFACE = sig type pos val line : pos ref val reset : unit -> unit val next : unit -> unit val error : string * pos * pos -> unit type arg val nothing : arg end \end{verbatim} \end{quote} The directory example/fol contains a sample parser in which the code for tying together the lexer and parser has been encapsulated in a functor. \section{Acknowledgements} Nick Rothwell wrote an SLR table generator in 1988 which inspired the initial work on an ML parser generator. Bruce Duba and David MacQueen made useful suggestions about the design of the error-correcting parser. Thanks go to all the users at Carnegie Mellon who beta-tested this version. Their comments and questions led to the creation of this manual and helped improve it. \section{Bugs} There is a slight difference in syntax between ML-Lex and ML-Yacc. In ML-Lex, semantic actions must be followed by a semicolon but in ML-Yacc semantic actions cannot be followed by a semicolon. The syntax should be the same. ML-Lex also produces structures with two different signatures, but it should produce structures with just one signature. This would simplify some things. \begin{thebibliography}{9} \bibitem{bf} ``A Practical Method for LR and LL Syntactic Error Diagnosis and Recovery'', M. Burke and G. Fisher, ACM Transactions on Programming Languages and Systems, Vol. 9, No. 2, April 1987, pp. 164-167. \bibitem{ahu} A. Aho, R. Sethi, J. Ullman, {\em Compilers: Principles, Techniques, and Tools}, Addison-Wesley, Reading, MA, 1986. \end{thebibliography} \end{document} mlton-20100608/mlyacc/doc/tech.doc0000644000076600000240000002534011404435641015214 0ustar mtfstaffA Hacker's guide ML-Yacc itself The program for computing the LALR(1) table can be divided into 3 separate parts. The first part computes the LR(0) graph. The second part attaches lookahead to the LR(0) graph to get the LALR(1) graph. The third part computes the parse tables from the LALR(1) graph. Look at the file sigs.sml to see how the modules are layed out. The file graph.sml contains the Graph functor, which produces a structure containing a function mkGraph. mkGraph takes a grammar and returns a some useful values and functions, including the LR(0) graph. It renumbers the rules to an internal form to make the LR(0) graph generation more efficient. The LR(0) graph includes only core items in its set of items. The file look.sml takes some of theses values and produces functions which tell whether a nonterm is nullable and the first set of a symbol list. The functor mkLalr creates a structure with a function that takes an LR(0) graph and some other values (notably the first and nullable) functions produced by Look and creates a stripped down version of an LR(0) graph with lookaheads attached. Nullable items (which usually aren't core items) are added and all other items without dots at the end (i.e. non-reduction items) are removed. The functor MkTable produces a function with takes the LR(0) graph produced by the function in mkGraph and the LR(0) graph with lookaheads produced by Lalr and creates an LALR(1) table from these graphs. ----------------------------------------------------------------------- An overview of the algorithms used in LR(0) graph generation and LALR(1) lookahead creation. LR(0) graph ----------- The LR(0) graph consists of sets of items. Each set of items will be called a core set. The basic algorithm is: let fun add_gotos(graph,f,nil,r) = (graph,r) | add_gotos(graph,f,(a,symbol)::b,r) let newgraph = graph + edge from f to a labelled with symbol in if a exists in graph then add_gotos(newgraph,f,b,r) else add_gotos(newgraph,f,b,a::r) end fun f(graph,nil) = graph | f(graph,a::b) = f(add_gotos(graph,a,gotos of closure a,b)) in f(empty-graph,[initial core set]) end For each core, we compute the new cores which result from doing a shift or goto, and then add these new cores with the symbol used in the shift or goto to the graph. We continue doing this until there are no more cores to adds to the graph. We have to take the closure of a core to include those items which are derived from nonterminals with a dot before them. If item A -> 'a .B 'c is in a core, the all productions derived by B must also be in the core. We want to be able to do the following operations efficently: (1) check if a core is in the graph already (2) compute the closure of a core (3) compute the cores resulting from goto/shift operations. (1) This can be done efficiently if a complete order exists for the cores. This can be done by imposing an ordering on items, giving each item a unique integer and using the place in an item. This can be used to order a set of items. (2) Much of the computation for the closure can be done ahead of time. The set of nonterminals to add for a given a nonterminal can be pre-computed using a transitive closure algorithm (the transitive closure is sparse in practice). One can then compute the closure for a core in the following manner. First, compute the set of nonterminals with . in front of them. This can be done in (m ln m) time. Next, use the results from the transitive closure to compute the complete set of nonterminals that should be used. Finally, for each nonterminal, merge its set of productions (sort all rules by the nonterminals from which they are derived before numbering them, then all we have to do is just prepend the rules while scanning the list in reverse order). (3) To do this, just scan the core closure, sorting rules by their symbols into lists. Then reverse all the lists, and we have the new core sets. Lookahead representation ------------------------ The previous part throws away the result of the closure operations. It is used only to compute new cores for use in the goto operation. These intermediate results should be saved because they will be useful here. Lookaheads are attached to an item when (1) an item is the result of a shift/goto. The item must have the same lookahead as the item from which it is derived. (2) an item is added as the result of a closure. Note that in fact all productions derived from a given nonterminal are added here. This can be used (perhaps) to our advantage, as we can represent a closure using just the nonterminal. This can be divided into two cases: (a) A -> 'a .B 'c , where 'c derives epsilon, (b) A -> 'a .B 'c , where 'c does not derive epsilon In (a), lookahead(items derived from B) includes first('c) and lookahead(A -> 'a .B 'c) In (b), lookahead(items derived from B) includes only first('c). This is an example of back propagation. Note that an item is either the result of a closure or the result of a shift/goto. It is never the result of both (that would be a contradiction). The following representation will be used: goto/shift items: an ordered list of item * lookahead ref * lookahead ref for the resulting shift/goto item in another core. closure items: for each nonterminal: (1) lookahead ref (2) a list of item * lookahead ref for the resulting shift/goto item in another core. Lookahead algorithms -------------------- After computing the LR(0) graph, lookaheads must be attached to the items in the graph. An item i may receive lookaheads in two ways. If item i was the result of a shift or goto from some item j, then lookahead(i) includes lookahead(j). If item i is a production of some nonterminal B, and there exists some item j of the form A -> x .B y, then item i will be added through closure(j). This implies that lookahead(i) includes first(y). If y => epsilon, then lookahead(i) includes lookahead(j). Lookahead must be recorded for completion items, which are items of the form A -> x., non-closure items of the form A -> y . B z, where z is not nullable, and closure items of the form A -> epsilon. (comment: items of the form A -> .x can appear in the start state as non-closure items. A must be the start symbol, which should not appear in the right hand side of any rule. This implies that lookaheads will never be propagated to such items) We chose to omit closure items that do not have the form A -> epsilon. It is possible to add lookaheads to closure items, but we have not done so because it would greatly slow down the addition of lookaheads. Instead we precompute the nonterminals whose productions are added through the closure operation, the lookaheads for these nonterminals, and whether the lookahead for these nonterminals should include first(y) and lookahead(j) for some item j of the form A -> x .B y. This information depends only on the particular nonterminal whose closure is being taken. Some notation is necessary to describe what is happening here. Let =c=> denote items added in one closure step that are derived from some nonterminal B in a production A -> x .B y. Let =c+=> denote items added in one or more =c=> steps. Consider the following productions B -> S ; S -> E E -> F * E F -> num in a kernal with the item B -> .S The following derivations are possible: B -> .S =c=> S -> .E =c+=> S -> .E, E -> .F * E, F -> .num The nonterminals that are added through the closure operation are the nonterminals for some item j = A -> .B x such that j =c+=> .C y. Lookahead(C) includes first(y). If y =*=> epsilon then lookahead (C) includes first (x). If x=*=> epsilon and y =*=> epsilon then lookahead(C) includes first(j). The following algorithm computes the information for each nonterminal: (1) nonterminals such that c =c+=> .C y and y =*=> epsilon Let s = the set of nonterminals added through closure = B repeat for all B which are elements of s, if B -> .C z and z =*=> epsilon then add B to s. until s does not change. (2) nonterminals added through closure and their lookaheads Let s = the set of nonterminals added through closure = B where A -> x . B y repeat for all B which are elements of s, if B -> .C z then add C to s, and add first(z) to lookahead(C) until nothing changes. Now, for each nonterminal A in s, find the set of nonterminals such that A =c+=> .B z, and z =*=> epsilon (i.e. use the results from 1). Add the lookahead for nonterminal A to the lookahead for each nonterminal in this set. These algorithms can be restated as either breadth-first or depth-first search algorithms. The loop invariant of the algorithms is that whenever a nonterminal is added to the set being calculated, all the productions for the nonterminal are checked. This algorithm computes the lookahead for each item: for each state, for each item of the form A -> u .B v in the state, where u may be nullable, let first_v = first(v) l-ref = ref for A -> u .B v s = the set of nonterminals added through the closure of B. for each element X of s, let r = the rules produced by an element X of s l = the lookahead ref cells for each rule, i.e. all items of A -> x. or A -> x .B y, where y =*=> epsilon, and x is not epsilon add the lookahead we have computed for X to the elements of l if B =c+=> X z, where z is nullable, add first(y) to the l. If y =*=> epsilon, save l with the ref for A -> x .B y in a list. Now take the list of (lookahead ref, list of lookahead refs) and propagate each lookahead ref cell's contents to the elements of the list of lookahead ref cells associated with it. Iterate until no lookahead set changes. mlton-20100608/mlyacc/examples/0000755000076600000240000000000011404470407014646 5ustar mtfstaffmlton-20100608/mlyacc/examples/calc/0000755000076600000240000000000011404470407015550 5ustar mtfstaffmlton-20100608/mlyacc/examples/calc/calc.grm0000644000076600000240000000220111404435642017156 0ustar mtfstaff(* Sample interactive calculator for ML-Yacc *) fun lookup "bogus" = 10000 | lookup s = 0 %% %eop EOF SEMI (* %pos declares the type of positions for terminals. Each symbol has an associated left and right position. *) %pos int %left SUB PLUS %left TIMES DIV %right CARAT %term ID of string | NUM of int | PLUS | TIMES | PRINT | SEMI | EOF | CARAT | DIV | SUB %nonterm EXP of int | START of int option %name Calc %subst PRINT for ID %prefer PLUS TIMES DIV SUB %keyword PRINT SEMI %noshift EOF %value ID ("bogus") %verbose %% (* the parser returns the value associated with the expression *) START : PRINT EXP (print (Int.toString EXP); print "\n"; SOME EXP) | EXP (SOME EXP) | (NONE) EXP : NUM (NUM) | ID (lookup ID) | EXP PLUS EXP (EXP1+EXP2) | EXP TIMES EXP (EXP1*EXP2) | EXP DIV EXP (EXP1 div EXP2) | EXP SUB EXP (EXP1-EXP2) | EXP CARAT EXP (let fun e (m,0) = 1 | e (m,l) = m*e(m,l-1) in e (EXP1,EXP2) end) mlton-20100608/mlyacc/examples/calc/calc.lex0000644000076600000240000000200211404435642017160 0ustar mtfstaffstructure Tokens = Tokens type pos = int type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult= (svalue,pos) token val pos = ref 0 fun eof () = Tokens.EOF(!pos,!pos) fun error (e,l : int,_) = TextIO.output (TextIO.stdOut, String.concat[ "line ", (Int.toString l), ": ", e, "\n" ]) %% %header (functor CalcLexFun(structure Tokens: Calc_TOKENS)); alpha=[A-Za-z]; digit=[0-9]; ws = [\ \t]; %% \n => (pos := (!pos) + 1; lex()); {ws}+ => (lex()); {digit}+ => (Tokens.NUM (valOf (Int.fromString yytext), !pos, !pos)); "+" => (Tokens.PLUS(!pos,!pos)); "*" => (Tokens.TIMES(!pos,!pos)); ";" => (Tokens.SEMI(!pos,!pos)); {alpha}+ => (if yytext="print" then Tokens.PRINT(!pos,!pos) else Tokens.ID(yytext,!pos,!pos) ); "-" => (Tokens.SUB(!pos,!pos)); "^" => (Tokens.CARAT(!pos,!pos)); "/" => (Tokens.DIV(!pos,!pos)); "." => (error ("ignoring bad character "^yytext,!pos,!pos); lex()); mlton-20100608/mlyacc/examples/calc/calc.sml0000644000076600000240000000402311404435642017170 0ustar mtfstaff(* calc.sml *) (* This file provides glue code for building the calculator using the * parser and lexer specified in calc.lex and calc.grm. *) structure Calc : sig val parse : unit -> unit end = struct (* * We apply the functors generated from calc.lex and calc.grm to produce * the CalcParser structure. *) structure CalcLrVals = CalcLrValsFun(structure Token = LrParser.Token) structure CalcLex = CalcLexFun(structure Tokens = CalcLrVals.Tokens) structure CalcParser = Join(structure LrParser = LrParser structure ParserData = CalcLrVals.ParserData structure Lex = CalcLex) (* * We need a function which given a lexer invokes the parser. The * function invoke does this. *) fun invoke lexstream = let fun print_error (s,i:int,_) = TextIO.output(TextIO.stdOut, "Error, line " ^ (Int.toString i) ^ ", " ^ s ^ "\n") in CalcParser.parse(0,lexstream,print_error,()) end (* * Finally, we need a driver function that reads one or more expressions * from the standard input. The function parse, shown below, does * this. It runs the calculator on the standard input and terminates when * an end-of-file is encountered. *) fun parse () = let val lexer = CalcParser.makeLexer (fn _ => TextIO.inputLine TextIO.stdIn) val dummyEOF = CalcLrVals.Tokens.EOF(0,0) val dummySEMI = CalcLrVals.Tokens.SEMI(0,0) fun loop lexer = let val (result,lexer) = invoke lexer val (nextToken,lexer) = CalcParser.Stream.get lexer val _ = case result of SOME r => TextIO.output(TextIO.stdOut, "result = " ^ (Int.toString r) ^ "\n") | NONE => () in if CalcParser.sameToken(nextToken,dummyEOF) then () else loop lexer end in loop lexer end end (* structure Calc *) mlton-20100608/mlyacc/examples/calc/README0000644000076600000240000000311711404435642016434 0ustar mtfstaffThis is a sample interactive calculator built using ML-Yacc and ML-Lex. The calculator is defined by the files calc.lex (* defines lexer *) calc.grm (* defines grammar *) calc.sml (* defines driver function, Calc.parse *) sources.cm (* cm description file *) To compile this example, type - CM.make "sources.cm"; in this directory. CM will invoke ml-lex and ml-yacc to process the lexer specification calc.lex and the grammar specification calc.grm respectively. Then it will compile the resulting SML source files calc.lex.sml calc.grm.sig calc.grm.sml and the calc.sml file containing the driver code. The end result of loading these files is a structure Calc containing a top-level driver function named parse. Calc.parse : unit -> unit The calculator can be invoked by applying Calc.parse to the unit value. - Calc.parse(); 1+3; result = 4 The calculator reads a sequence of expressions from the standard input and prints the value of each expression after reading the expression. Expressions must be separated by semicolons. An expression is not evaluated until the semicolon is encountered. The calculator terminates when an end-of-file is encountered. There is no attempt to fix input errors: a lexical error will cause exception LexError to be raised, while a syntax error will cause ParseError to be raised. NOTE: The CM description file sources.cm mentions the ml-yacc library (ml-yacc-lib.cm). CM's search path should be configured so that this library will be found. This should normally be the case if SML/NJ is properly installed. mlton-20100608/mlyacc/examples/calc/sources.cm0000644000076600000240000000020011404435642017546 0ustar mtfstaffGroup is #if defined (NEW_CM) $/basis.cm $/ml-yacc-lib.cm #else ml-yacc-lib.cm #endif calc.grm calc.lex calc.sml mlton-20100608/mlyacc/examples/fol/0000755000076600000240000000000011404470407015426 5ustar mtfstaffmlton-20100608/mlyacc/examples/fol/absyn.sml0000644000076600000240000000024211404435642017257 0ustar mtfstaffsignature ABSYN = sig type absyn val null : absyn end structure Absyn :> ABSYN = struct datatype absyn = NULL val null = NULL endmlton-20100608/mlyacc/examples/fol/fol.grm0000644000076600000240000000375711404435642016733 0ustar mtfstaff%% %header (functor FolLrValsFun (structure Token : TOKEN structure Absyn : ABSYN ) : Fol_LRVALS) %term EOF | DOT | COMMA | SEMICOLON | LPAREN | RPAREN | BACKARROW | DOUBLEARROW | ARROW | BAR | TRUE | FORALL | EXISTS | PARSEPROG | PARSEQUERY | LCID of string | UCID of string | INT of string (* gform: goal formula dform: definite clause *) %nonterm start of Absyn.absyn | clause | query | gform | dform | atom | termlist | term | varbd | id %start start %eop EOF DOT %pos int %verbose %pure %right FORALL EXISTS %left BACKARROW %right SEMICOLON %right COMMA %right DOUBLEARROW %right ARROW %left BAR %name Fol %prefer DOT %% start : PARSEPROG clause (Absyn.null) | PARSEQUERY query (Absyn.null) clause : dform () | () query : gform () | () gform : TRUE () | gform COMMA gform () (* and *) | gform SEMICOLON gform () (* disjunction *) | gform BACKARROW dform () (* implication: dform implies gform *) | gform ARROW gform BAR gform () (* if-then-else *) | FORALL varbd gform () (* universal quantification *) | EXISTS varbd gform () (* existential quantification *) | atom () (* atomic formula *) | LPAREN gform RPAREN () dform : TRUE () | dform COMMA dform () (* and *) | dform BACKARROW gform () (* gform implies dform *) | FORALL varbd dform () | atom () | LPAREN dform RPAREN () atom : LCID () | LCID LPAREN termlist RPAREN () termlist : term () | term COMMA termlist () term : id () | INT () | LCID LPAREN termlist RPAREN () varbd : LCID DOT () | UCID DOT () id : LCID () | UCID () mlton-20100608/mlyacc/examples/fol/fol.lex0000644000076600000240000000275611404435642016734 0ustar mtfstaffstructure Tokens = Tokens structure Interface = Interface open Interface type pos = Interface.pos type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult= (svalue,pos) token val eof = fn () => Tokens.EOF(!line,!line) fun makeInt (s : string) = s %% %header (functor FolLexFun(structure Tokens: Fol_TOKENS structure Interface: INTERFACE) : LEXER); lcstart=[a-z!&$+/<=>?@~|#*`]|\-; ucstart=[A-Z_]; idchars={lcstart}|{ucstart}|[0-9]; lcid={lcstart}{idchars}*; ucid={ucstart}{idchars}*; ws=[\t\ ]*; num=[0-9]+; %% {ws} => (lex()); \n => (next_line(); lex()); ":-" => (Tokens.BACKARROW(!line,!line)); "," => (Tokens.COMMA(!line,!line)); ";" => (Tokens.SEMICOLON(!line,!line)); "." => (Tokens.DOT(!line,!line)); "(" => (Tokens.LPAREN(!line,!line)); ")" => (Tokens.RPAREN(!line,!line)); "->" => (Tokens.ARROW(!line,!line)); "=>" => (Tokens.DOUBLEARROW(!line,!line)); "|" => (Tokens.BAR(!line,!line)); "true" => (Tokens.TRUE(!line,!line)); "forall" => (Tokens.FORALL(!line,!line)); "exists" => (Tokens.EXISTS(!line,!line)); {lcid} => (Tokens.LCID (yytext,!line,!line)); {ucid} => (Tokens.UCID (yytext,!line,!line)); {num} => (Tokens.INT (makeInt yytext,!line,!line)); . => (error ("ignoring illegal character" ^ yytext, !line,!line); lex()); mlton-20100608/mlyacc/examples/fol/interface.sml0000644000076600000240000000112511404435642020104 0ustar mtfstaff(* Externally visible aspects of the lexer and parser *) signature INTERFACE = sig type pos val line : pos ref val init_line : unit -> unit val next_line : unit -> unit val error : string * pos * pos -> unit type arg val nothing : arg end (* signature INTERFACE *) functor Interface () : INTERFACE = struct type pos = int val line = ref 0 fun init_line () = (line := 1) fun next_line () = (line := !line + 1) fun error (errmsg,line:pos,_) = TextIO.output(TextIO.stdOut,"Line " ^ (Int.toString line) ^ ": " ^ errmsg ^ "\n") type arg = unit val nothing = () end (* functor INTERFACE *) mlton-20100608/mlyacc/examples/fol/link.sml0000644000076600000240000000120311404435642017076 0ustar mtfstaffstructure FolLrVals : Fol_LRVALS = FolLrValsFun(structure Token = LrParser.Token structure Absyn = Absyn); structure Interface : INTERFACE = Interface(); structure FolLex : LEXER = FolLexFun(structure Tokens = FolLrVals.Tokens structure Interface = Interface); structure FolParser : PARSER = Join(structure ParserData = FolLrVals.ParserData structure Lex = FolLex structure LrParser = LrParser); structure Parse : PARSE = Parse (structure Absyn = Absyn structure Interface = Interface structure Parser = FolParser structure Tokens = FolLrVals.Tokens ); mlton-20100608/mlyacc/examples/fol/list.fol0000644000076600000240000000010111404435642017075 0ustar mtfstaffappend(nil,K,K). append(cons(X,L),K,cons(X,M)) :- append(L,K,M). mlton-20100608/mlyacc/examples/fol/parse.sml0000644000076600000240000000431611404435642017263 0ustar mtfstaff(* Uses the generated lexer and parser to export parsing functions *) signature PARSE = sig structure Absyn : ABSYN (* parse a program from a string *) val prog_parse : string -> Absyn.absyn (* parse a query from a string *) val query_parse : string -> Absyn.absyn (* parse a program in a file *) val file_parse : string -> Absyn.absyn (* parse a query from the standard input *) val top_parse : unit -> Absyn.absyn end (* signature PARSE *) functor Parse (structure Absyn : ABSYN structure Interface : INTERFACE structure Parser : PARSER sharing type Parser.arg = Interface.arg sharing type Parser.pos = Interface.pos sharing type Parser.result = Absyn.absyn structure Tokens : Fol_TOKENS sharing type Tokens.token = Parser.Token.token sharing type Tokens.svalue = Parser.svalue ) : PARSE = struct structure Absyn = Absyn fun parse (dummyToken,lookahead,reader : int -> string) = let val _ = Interface.init_line() val empty = !Interface.line val dummyEOF = Tokens.EOF(empty,empty) val dummyTOKEN = dummyToken(empty,empty) fun invoke lexer = let val newLexer = Parser.Stream.cons(dummyTOKEN,lexer) in Parser.parse(lookahead,newLexer,Interface.error, Interface.nothing) end fun loop lexer = let val (result,lexer) = invoke lexer val (nextToken,lexer) = Parser.Stream.get lexer in if Parser.sameToken(nextToken,dummyEOF) then result else loop lexer end in loop (Parser.makeLexer reader) end fun string_reader s = let val next = ref s in fn _ => !next before next := "" end fun prog_parse s = parse (Tokens.PARSEPROG,15,string_reader s) fun query_parse s = parse (Tokens.PARSEQUERY,15,string_reader s) fun file_parse name = let val dev = TextIO.openIn name in (parse (Tokens.PARSEPROG,15,fn i => TextIO.inputN(dev,i))) before TextIO.closeIn dev end fun top_parse () = parse (Tokens.PARSEQUERY,0,(fn i => TextIO.inputLine TextIO.stdIn)) end (* functor Parse *) mlton-20100608/mlyacc/examples/fol/README0000644000076600000240000000311011404435642016303 0ustar mtfstafffol/README This is a sample parser for first-order logic. The grammar was contributed by Frank Pfenning. The parser is defined by the files fol.lex (* defines lexer *) fol.grm (* defines grammar *) link.sml (* constructs basic parser structures *) absyn.sml (* a trivial abstract syntax *) interface.sml (* interface to lexer and parser properties *) parse.sml (* driver functions *) sources.cm (* cm description file *) To compile this example, type - CM.make "sources.cm"; in this directory. CM will invoke ml-lex and ml-yacc to process the lexer specification calc.lex and the grammar specification calc.grm respectively. Then it will compile the resulting SML source files fol.lex.sml fol.grm.sig fol.grm.sml and the other sml source files. The end result of loading these files is a structure Parse containing the following top-level driver functions: val prog_parse : string -> Absyn.absyn (* parse a program from a string *) val query_parse : string -> Absyn.absyn (* parse a query from a string *) val file_parse : string -> Absyn.absyn (* parse a program in a file *) val top_parse : unit -> Absyn.absyn (* parse a query from the standard input *) The file list.fol is a sample input file that can be parsed using the file_parse function: - Parse.file_parse "list.fol"; NOTE: The CM description file sources.cm mentions the ml-yacc library (ml-yacc-lib.cm). CM's search path should be configured so that this library will be found. This should normally be the case if SML/NJ is properly installed. mlton-20100608/mlyacc/examples/fol/sources.cm0000644000076600000240000000025211404435642017433 0ustar mtfstaffGroup is #if defined (NEW_CM) $/basis.cm $/ml-yacc-lib.cm #else ml-yacc-lib.cm #endif fol.lex fol.grm absyn.sml interface.sml parse.sml link.sml mlton-20100608/mlyacc/examples/pascal/0000755000076600000240000000000011404470407016111 5ustar mtfstaffmlton-20100608/mlyacc/examples/pascal/parser.sml0000644000076600000240000000231611404435642020126 0ustar mtfstaff(* parser.sml *) (* driver for Pascal parser *) structure Parser = struct structure PascalLrVals = PascalLrValsFun(structure Token = LrParser.Token) structure PascalLex = PascalLexFun(structure Tokens = PascalLrVals.Tokens) structure PascalParser = Join(structure Lex= PascalLex structure LrParser = LrParser structure ParserData = PascalLrVals.ParserData) fun parse s = let val dev = TextIO.openIn s val stream = PascalParser.makeLexer(fn i => TextIO.inputN(dev,i)) fun error (e,i:int,_) = TextIO.output(TextIO.stdOut, s ^ "," ^ " line " ^ (Int.toString i) ^ ", Error: " ^ e ^ "\n") in PascalLex.UserDeclarations.lineNum := 1; PascalParser.parse(30,stream,error,()) before TextIO.closeIn dev end fun keybd () = let val stream = PascalParser.makeLexer (fn i => TextIO.inputLine TextIO.stdIn) fun error (e,i:int,_) = TextIO.output(TextIO.stdOut, "std_in," ^ " line " ^ (Int.toString i) ^ ", Error: " ^ e ^ "\n") in PascalLex.UserDeclarations.lineNum := 1; PascalParser.parse(0,stream,error,()) end end (* structure Parser *) mlton-20100608/mlyacc/examples/pascal/pascal.grm0000644000076600000240000002002711404435642020066 0ustar mtfstaff%% %name Pascal %term YAND | YARRAY | YBEGIN | YCASE | YCONST | YDIV | YDO | YDOTDOT | YTO | YELSE | YEND | YFILE | YFOR | YFORWARD | YPROCEDURE | YGOTO | YID | YIF | YIN | YINT | YLABEL | YMOD | YNOT | YNUMB | YOF | YOR | YPACKED | YNIL | YFUNCTION | YPROG | YRECORD | YREPEAT | YSET | YSTRING | YTHEN | YDOWNTO | YTYPE | YUNTIL | YVAR | YWHILE | YWITH | YBINT | YOCT | YHEX | YCASELAB | YILLCH | YEXTERN | YDOT | YLPAR | YRPAR | YSEMI | YCOMMA | YCOLON | YCARET | YLBRA | YRBRA | YTILDE | YLESS | YEQUAL | YGREATER | YPLUS | YMINUS | YBAR | UNARYSIGN | YSTAR | YSLASH | YAMP | EOF %eop EOF %pos int %pure %noshift EOF %nonassoc YLESS YEQUAL YGREATER YIN %left YPLUS YMINUS YOR YBAR %left UNARYSIGN %left YSTAR YSLASH YDIV YMOD YAND YAMP %left YNOT %nonterm goal | prog_hedr | block | decls | decl | labels | label_decl | const_decl | type_decl | var_decl | proc_decl | pheadres | phead | porf | params | param | ftype | param_list | const | number | const_list | type' | simple_type | struct_type | simple_type_list | field_list | fixed_part | field | variant_part | variant_list | variant | stat_list | stat_lsth | cstat_list | cstat | stat | assign | expr | element_list | element | variable | qual_var | wexpr | octhex | expr_list | wexpr_list | relop | addop | divop | negop | var_list | id_list | const_id | type_id | var_id | array_id | ptr_id | record_id | field_id | func_id | begin %keyword YAND YARRAY YBEGIN YCASE YCONST YDIV YDO YTO YELSE YEND YFILE YFOR YFORWARD YPROCEDURE YGOTO YIF YIN YLABEL YMOD YNOT YOF YOR YPACKED YNIL YFUNCTION YPROG YRECORD YREPEAT YSET YSTRING YTHEN YDOWNTO YTYPE YUNTIL YVAR YWHILE YWITH YOCT YHEX YEXTERN YAMP %prefer YID YSEMI YCOMMA YLBRA %subst YCOMMA for YSEMI | YSEMI for YCOMMA %% begin: goal () goal: prog_hedr decls block YDOT () | decls () prog_hedr: YPROG YID YLPAR id_list YRPAR YSEMI () | YPROG YID YSEMI () block: YBEGIN stat_list YEND () decls: decls decl () | () decl: labels () | const_decl () | type_decl () | var_decl () | proc_decl () labels: YLABEL label_decl YSEMI () label_decl: YINT () | label_decl YCOMMA YINT () const_decl: YCONST YID YEQUAL const YSEMI () | const_decl YID YEQUAL const YSEMI () | YCONST YID YEQUAL YID YSEMI () | const_decl YID YEQUAL YID YSEMI () type_decl: YTYPE YID YEQUAL type' YSEMI () | type_decl YID YEQUAL type' YSEMI () var_decl: YVAR id_list YCOLON type' YSEMI () | var_decl id_list YCOLON type' YSEMI () proc_decl: phead YFORWARD YSEMI () | phead YEXTERN YSEMI () | pheadres decls block YSEMI () pheadres: phead () phead: porf YID params ftype YSEMI () porf: YPROCEDURE () | YFUNCTION () params: YLPAR param_list YRPAR () | () param: id_list YCOLON type' () | YVAR id_list YCOLON type' () | YFUNCTION id_list params ftype () | YPROCEDURE id_list params ftype () ftype: YCOLON type' () | () param_list: param () | param_list YSEMI param () const: YSTRING () | number () | YPLUS number () | YMINUS number () | YPLUS YID () | YMINUS YID () number: YINT () | YBINT () | YNUMB () const_list: const () | const_list YCOMMA const () | YID () | const_list YCOMMA YID () type': simple_type () | YCARET YID () | struct_type () | YPACKED struct_type () simple_type: type_id () | YLPAR id_list YRPAR () | const YDOTDOT const () | YID YDOTDOT const () | const YDOTDOT YID () | YID YDOTDOT YID () struct_type: YARRAY YLBRA simple_type_list YRBRA YOF type' () | YFILE YOF type' () | YSET YOF simple_type () | YRECORD field_list YEND () simple_type_list: simple_type () | simple_type_list YCOMMA simple_type () field_list: fixed_part variant_part () fixed_part: field () | fixed_part YSEMI field () field: () | id_list YCOLON type' () variant_part: () | YCASE type_id YOF variant_list () | YCASE YID YCOLON type_id YOF variant_list () variant_list: variant () | variant_list YSEMI variant () variant: () | const_list YCOLON YLPAR field_list YRPAR () stat_list: stat () | stat_lsth stat () stat_lsth: stat_list YSEMI () cstat_list: cstat () | cstat_list YSEMI cstat () cstat: const_list YCOLON stat () | YCASELAB stat () | () stat: () | YINT YCOLON stat () | YID () | YID YLPAR wexpr_list YRPAR () | assign () | YBEGIN stat_list YEND () | YCASE expr YOF cstat_list YEND () | YWITH var_list YDO stat () | YWHILE expr YDO stat () | YREPEAT stat_list YUNTIL expr () | YFOR assign YTO expr YDO stat () | YFOR assign YDOWNTO expr YDO stat () | YGOTO YINT () | YIF expr YTHEN stat () | YIF expr YTHEN stat YELSE stat () assign: variable YCOLON YEQUAL expr () | YID YCOLON YEQUAL expr () expr: expr relop expr %prec YLESS () | YPLUS expr %prec UNARYSIGN () | YMINUS expr %prec UNARYSIGN () | expr addop expr %prec YPLUS () | expr divop expr %prec YSTAR () | YNIL () | YSTRING () | YINT () | YBINT () | YNUMB () | variable () | YID () | YID YLPAR wexpr_list YRPAR () | YLPAR expr YRPAR () | negop expr %prec YNOT () | YLBRA element_list YRBRA () | YLBRA YRBRA () element_list: element () | element_list YCOMMA element () element: expr () | expr YDOTDOT expr () variable: qual_var () qual_var: YID YLBRA expr_list YRBRA () | qual_var YLBRA expr_list YRBRA () | YID YDOT field_id () | qual_var YDOT field_id () | YID YCARET () | qual_var YCARET () wexpr: expr () | expr YCOLON expr () | expr YCOLON expr YCOLON expr () | expr octhex () | expr YCOLON expr octhex () octhex: YOCT () | YHEX () expr_list: expr () | expr_list YCOMMA expr () wexpr_list: wexpr () | wexpr_list YCOMMA wexpr () relop: YEQUAL () | YLESS () | YGREATER () | YLESS YGREATER () | YLESS YEQUAL () | YGREATER YEQUAL () | YIN () addop: YPLUS () | YMINUS () | YOR () | YBAR () divop: YSTAR () | YSLASH () | YDIV () | YMOD () | YAND () | YAMP () negop: YNOT () | YTILDE () var_list: variable () | var_list YCOMMA variable () | YID () | var_list YCOMMA YID () id_list: YID () | id_list YCOMMA YID () const_id: YID () type_id: YID () var_id: YID () array_id: YID () ptr_id: YID () record_id: YID () field_id: YID () func_id: YID () mlton-20100608/mlyacc/examples/pascal/pascal.lex0000644000076600000240000001035711404435642020076 0ustar mtfstaffstructure Tokens = Tokens type pos = int type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult = (svalue,pos) token open Tokens val lineNum = ref 0 val eof = fn () => EOF(!lineNum,!lineNum) structure KeyWord : sig val find : string -> (int * int -> (svalue,int) token) option end = struct val TableSize = 211 val HashFactor = 5 val hash = fn s => foldl (fn (c,v)=>(v*HashFactor+(ord c)) mod TableSize) 0 (explode s) val HashTable = Array.array(TableSize,nil) : (string * (int * int -> (svalue,int) token)) list Array.array val add = fn (s,v) => let val i = hash s in Array.update(HashTable,i,(s,v) :: (Array.sub(HashTable, i))) end val find = fn s => let val i = hash s fun f ((key,v)::r) = if s=key then SOME v else f r | f nil = NONE in f (Array.sub(HashTable, i)) end val _ = (List.app add [("and",YAND), ("array",YARRAY), ("begin",YBEGIN), ("case",YCASE), ("const",YCONST), ("div",YDIV), ("do",YDO), ("downto",YDOWNTO), ("else",YELSE), ("end",YEND), ("extern",YEXTERN), ("file",YFILE), ("for",YFOR), ("forward",YFORWARD), ("function",YFUNCTION), ("goto",YGOTO), ("hex",YHEX), ("if",YIF), ("in",YIN), ("label",YLABEL), ("mod",YMOD), ("nil",YNIL), ("not",YNOT), ("oct",YOCT), ("of",YOF), ("or",YOR), ("packed",YPACKED), ("procedure",YPROCEDURE), ("program",YPROG), ("record",YRECORD), ("repeat",YREPEAT), ("set",YSET), ("then",YTHEN), ("to",YTO), ("type",YTYPE), ("until",YUNTIL), ("var",YVAR), ("while",YWHILE), ("with",YWITH) ]) end open KeyWord %% %header (functor PascalLexFun(structure Tokens : Pascal_TOKENS)); %s C B; alpha=[A-Za-z]; digit=[0-9]; optsign=("+"|"-")?; integer={digit}+; frac="."{digit}+; exp=(e|E){optsign}{digit}+; octdigit=[0-7]; ws = [\ \t]; %% {ws}+ => (lex()); \n+ => (lineNum := (!lineNum) + (String.size yytext); lex()); {alpha}+ => (case find yytext of SOME v => v(!lineNum,!lineNum) | _ => YID(!lineNum,!lineNum)); {alpha}({alpha}|{digit})* => (YID(!lineNum,!lineNum)); {optsign}{integer}({frac}{exp}?|{frac}?{exp}) => (YNUMB(!lineNum,!lineNum)); {optsign}{integer} => (YINT(!lineNum,!lineNum)); {octdigit}+(b|B) => (YBINT(!lineNum,!lineNum)); "'"([^']|"''")*"'" => (YSTRING(!lineNum,!lineNum)); "(*" => (YYBEGIN C; lex()); ".." => (YDOTDOT(!lineNum,!lineNum)); "." => (YDOT(!lineNum,!lineNum)); "(" => (YLPAR(!lineNum,!lineNum)); ")" => (YRPAR(!lineNum,!lineNum)); ";" => (YSEMI(!lineNum,!lineNum)); "," => (YCOMMA(!lineNum,!lineNum)); ":" => (YCOLON(!lineNum,!lineNum)); "^" => (YCARET(!lineNum,!lineNum)); "[" => (YLBRA(!lineNum,!lineNum)); "]" => (YRBRA(!lineNum,!lineNum)); "~" => (YTILDE(!lineNum,!lineNum)); "<" => (YLESS(!lineNum,!lineNum)); "=" => (YEQUAL(!lineNum,!lineNum)); ">" => (YGREATER(!lineNum,!lineNum)); "+" => (YPLUS(!lineNum,!lineNum)); "-" => (YMINUS(!lineNum,!lineNum)); "|" => (YBAR(!lineNum,!lineNum)); "*" => (YSTAR(!lineNum,!lineNum)); "/" => (YSLASH(!lineNum,!lineNum)); "{" => (YYBEGIN B; lex()); . => (YILLCH(!lineNum,!lineNum)); \n+ => (lineNum := (!lineNum) + (String.size yytext); lex()); [^()*\n]+ => (lex()); "(*" => (lex()); "*)" => (YYBEGIN INITIAL; lex()); [*()] => (lex()); \n+ => (lineNum := (!lineNum) + (String.size yytext); lex()); [^{}\n]+ => (lex()); "{" => (lex()); "}" => (YYBEGIN INITIAL; lex()); mlton-20100608/mlyacc/examples/pascal/README0000644000076600000240000000173711404435642017003 0ustar mtfstaffThis is a grammar for Berkeley Pascal, hacked to be SLR, though that is not necessary because ML-Yacc supports LALR(1). To construct the parser, make this your current directory and run CM.make "sources.cm"; This will apply ML-Yacc to the file "pascal.grm" to create the files "pascal.grm.sig" and "pascal.grm.sml", then ML_Lex will be applied to pascal.lex to produce pascal.lex.sml. Then these generated files will be compiled together with necessary components from the ML-Yacc library supplied by the ml-yacc-lib.cm file. The end result is a structure Parser with two functions. The function parse: string -> PascalParser.result * (Parser.PascalParser.svalue,PascalParser.pos) LrParser.Token.token LrParser.stream parses input from a file, while keybd: unit -> Parser.PascalParser.result * (Parser.PascalParser.svalue,Parser.PascalParser.pos) LrParser.Token.token LrParser.stream parses from the standard input. mlton-20100608/mlyacc/examples/pascal/sources.cm0000644000076600000240000000020711404435642020116 0ustar mtfstaffGroup is #if defined (NEW_CM) $/basis.cm $/ml-yacc-lib.cm #else ml-yacc-lib.cm #endif pascal.grm pascal.lex parser.sml mlton-20100608/mlyacc/examples/pascal/test/0000755000076600000240000000000011404470407017070 5ustar mtfstaffmlton-20100608/mlyacc/examples/pascal/test/c1.p0000644000076600000240000002160111404435642017556 0ustar mtfstaffprogram simplex(input, output); { two-phase simplex algorithm: version Feb. 24, 1988 } { copyright K. Steiglitz } { Computer Science Dept. } { Princeton University 08544 } { ken@princeton.edu } const maxpivots = 1000; { maximum no. of pivots } large = 1.0e+31; { large number used in search for minimum cost column } lowlim = -1.0e+31; { large negative number to test for unboundedness } mmax = 32; { max. no. of rows } ncolmax = 50; { max. no. of columns allowed in tableau } eps = 1.0e-8; { for testing for zero } var done, unbounded, optimal: boolean; { flags for simplex } result: (toomanycols, unbound, infeas, toomanypivots, opt); m: 1..mmax; { no. of rows - 1, the rows are numbered 0..m } numpivots: integer; { pivot count } pivotcol, pivotrow: integer; { pivot column and row } pivotel: real; { pivot element } cbar: real; { price when searching for entering column } carry: array[-1..mmax, -1..mmax] of real; { inverse-basis matrix of the revised simplex method } phase: 1..2; { phase } price: array[0..mmax] of real; { shadow prices = row -1 of carry = -dual variables } basis: array[0..mmax] of integer; { basis columns, negative integers artificial } ncol: 1..ncolmax; { number of columns } tab: array[0..mmax, 1..ncolmax] of real; { tableau } lhs: array[0..mmax] of real; { left-hand-side } d: array[1..ncolmax] of real; { current cost vector } c: array[1..ncolmax] of real; { cost vector in original problem } curcol: array[-1..mmax] of real; { current column } curcost: real; { current cost } i, col, row: integer; { miscellaneous variables } procedure columnsearch; { looks for favorable column to enter basis. returns lowest cost and its column number, or turns on the flag optimal } var i , col : integer; tempcost: real; { minimum cost, temporary cost of column } begin { columnsearch } for i:= 0 to m do price[i]:= -carry[-1, i]; { set up price vector } optimal:= false; cbar:= large; pivotcol:= 0; for col:= 1 to ncol do begin tempcost:= d[col]; for i:= 0 to m do tempcost:= tempcost - price[i]*tab[i, col]; if( cbar > tempcost ) then begin cbar:= tempcost; pivotcol:= col end end; { for col } if ( cbar > -eps ) then optimal:= true end; { columnsearch } procedure rowsearch; { looks for pivot row. returns pivot row number, or turns on the flag unbounded } var i, j: integer; ratio, minratio: real; { ratio and minimum ratio for ratio test } begin { rowsearch } for i:= 0 to m do { generate column } begin curcol[i]:= 0.0; { current column = B inverse * original col. } for j:= 0 to m do curcol[i]:= curcol[i] + carry[i, j]*tab[j, pivotcol] end; curcol[-1]:= cbar; { first element in current column } pivotrow:= -1; minratio:= large; for i:= 0 to m do { ratio test } begin if( curcol[i] > eps ) then begin ratio:= carry[i, -1]/curcol[i]; if( minratio > ratio ) then { favorable row } begin minratio:= ratio; pivotrow:= i; pivotel:= curcol[i] end else { break tie with max pivot } if ( (minratio = ratio) and (pivotel < curcol[i]) ) then begin pivotrow:= i; pivotel:= curcol[i] end end { curcol > eps } end; { for i } if ( pivotrow = -1 ) then unbounded:= true { nothing found } else unbounded:= false end; { rowsearch } procedure pivot; { pivots } var i, j: integer; begin { pivot } basis[pivotrow]:= pivotcol; for j:= -1 to m do carry[pivotrow, j]:= carry[pivotrow, j]/pivotel; for i:= -1 to m do if( i<> pivotrow ) then for j:= -1 to m do carry[i, j]:= carry[i, j] - carry[pivotrow, j]*curcol[i]; curcost:= -carry[-1, -1] end; { pivot } procedure changephase; { changes phase from 1 to 2, by switching to original cost vector } var i, j, b: integer; begin { changephase } phase:= 2; for i:= 0 to m do if( basis[i] <= 0 ) then writeln( '...artificial basis element ', basis[i]:5, ' remains in basis after phase 1'); for j:= 1 to ncol do d[j]:= c[j]; { switch to original cost vector } for j:= -1 to m do begin carry[-1, j]:= 0.0; for i:= 0 to m do begin b:= basis[i]; { ignore artificial basis elements that are } if( b >= 1 ) then { still in basis } carry[-1, j]:= carry[-1, j] - c[b]*carry[i,j] end { for i } end; { for j } curcost:= -carry[-1, -1] end; { changephase } procedure setup; { sets up test problem, lhs = tab*x, x >= 0, min c*x } { nrow = number of rows; ncol = number of cols } { tab = tableau; lhs = constants } var i, j, nrow: integer; begin { setup } readln(nrow); { read number of rows } readln(ncol); { read number of columns } m:= nrow - 1; { rows are numbered 0..m } for j:= 1 to ncol do read(c[j]); { cost vector } for i:= 0 to m do begin read(lhs[i]); { left-hand-side } for j:= 1 to ncol do read(tab[i, j]) { tableau } end; done:= false; { initialize carry matrix, etc. } phase:= 1; for i:= -1 to m do for j:= -1 to mmax do carry[i, j]:= 0.0; for i:= 0 to m do carry[i, i]:= 1.0; { artificial basis } for i:= 0 to m do begin carry[i, -1]:= lhs[i]; { -1 col of carry = left-hand-side } carry[-1, -1]:= carry[-1, -1] - lhs[i] { - initial cost } end; curcost:= -carry[-1, -1]; for i:= 0 to m do basis[i]:= -i; { initial, artificial basis } if( ncol <= ncolmax ) then { check number of columns } for col:= 1 to ncol do { initialize cost vector for phase 1 } begin d[col]:= 0.0; for row:= 0 to m do d[col]:= d[col] - tab[row, col] end else begin writeln('...termination: too many columns for storage'); done:= true; result:= toomanycols end; numpivots:= 0; end; { setup } begin { simplex } setup; while( (numpivots < maxpivots) and (not done) and ( (curcost > lowlim) or (phase = 1) ) ) do begin columnsearch; if( not optimal ) then begin { not optimal } rowsearch; if( unbounded ) then begin done:= true; result:= unbound; writeln('problem is unbounded') end else begin pivot; numpivots:= numpivots + 1; if ( (numpivots = 1 ) or ( numpivots mod 10 = 0 ) ) then writeln('pivot ', numpivots:4, ' cost= ', curcost:12) end end { not optimal } else { optimal } if( phase = 1 ) then begin if( curcost > eps ) then begin done:= true; result:= infeas; writeln('problem is infeasible') end else begin if ( (numpivots <> 1 ) and ( numpivots mod 10 <> 0 ) ) then writeln('pivot ', numpivots:4, ' cost= ', curcost:12); writeln('phase 1 successfully completed'); changephase end end { if phase = 1 } else begin if ( (numpivots <> 1 ) and ( numpivots mod 10 <> 0 ) ) then writeln('pivot ', numpivots:4, ' cost= ', curcost:12); writeln('phase 2 successfully completed'); done:= true; result:= opt end end; { while } if( (curcost <= lowlim) and (phase = 2) ) then begin if ( (numpivots <> 1 ) and ( numpivots mod 10 <> 0 ) ) then writeln('pivot ', numpivots:4, ' cost= ', curcost:12); result:= unbound; writeln('problem is unbounded') end; if ( numpivots >= maxpivots ) then begin writeln('...termination: maximum number of pivots exceeded'); result:= toomanypivots end; if result = opt then begin writeln('optimal solution reached'); writeln('cost =', -carry[-1,-1]:10:6); for i:= 0 to m do writeln('x(', basis[i]:4, ')= ', carry[i,-1]:10:6) end end. mlton-20100608/mlyacc/examples/pascal/test/c2.p0000644000076600000240000000007111404435642017555 0ustar mtfstaffprogram p(input,output); begin if x=0 then x := 1 end. mlton-20100608/mlyacc/examples/pascal/test/README0000644000076600000240000000020411404435642017746 0ustar mtfstaffTest files for the error-correcting parser. Files beginning with c are correct. Those beginning with t have simple syntax errors. mlton-20100608/mlyacc/examples/pascal/test/t1.p0000644000076600000240000002157111404435642017605 0ustar mtfstaffjunk simplex(input, output); { two-phase simplex algorithm: version Feb. 24, 1988 } { copyright K. Steiglitz } { Computer Science Dept. } { Princeton University 08544 } { ken@princeton.edu } var maxpivots = 1000; { maximum no. of pivots } large = 1.0e+31; { large number used in search for minimum cost column } lowlim = -1.0e+31; { large negative number to test for unboundedness } mmax = 32; { max. no. of rows } ncolmax = 50; { max. no. of columns allowed in tableau } eps = 1.0e-8; { for testing for zero } const done, unbounded, optimal: boolean; { flags for simplex } result: (toomanycols, unbound, infeas, toomanypivots, opt); m: 1..mmax; { no. of rows - 1, the rows are numbered 0..m } numpivots: integer; { pivot count } pivotcol, pivotrow: integer; { pivot column and row } pivotel: real; { pivot element } cbar: real; { price when searching for entering column } carry: array[-1..mmax, -1..mmax] of real; { inverse-basis matrix of the revised simplex method } phase: 1..2; { phase } price: array[0..mmax] of real; { shadow prices = row -1 of carry = -dual variables } basis: array[0..mmax] of integer; { basis columns, negative integers artificial } ncol: 1..ncolmax; { number of columns } tab: array[0..mmax, 1..ncolmax] of real; { tableau } lhs: array[0..mmax] of real; { left-hand-side } d: array[1..ncolmax] of real; { current cost vector } c: array[1..ncolmax] of real; { cost vector in original problem } curcol: array[-1..mmax] of real; { current column } curcost: real; { current cost } i, col, row: integer; { miscellaneous variables } procedure columnsearch; { looks for favorable column to enter basis. returns lowest cost and its column number, or turns on the flag optimal } var i , col : integer; tempcost: real; { minimum cost, temporary cost of column } begin { columnsearch } for i:= 0 to m do price[i]:= -carry[-1, i]; { set up price vector } optimal:= false; cbar:= large; pivotcol:= 0; for col:= 1 to ncol do begin tempcost:= d[col]; for i:= 0 to m do tempcost:= tempcost - price[i]*tab[i, col]; if( cbar > tempcost ) then begin cbar:= tempcost; pivotcol:= col end end; { for col } if ( cbar > -eps ) then optimal:= true end; { columnsearch } procedure rowsearch; { looks for pivot row. returns pivot row number, or turns on the flag unbounded } var i, j: integer; ratio, minratio: real; { ratio and minimum ratio for ratio test } begin { rowsearch } for i:= 0 to m do { generate column } begin curcol[i]:= 0.0; { current column = B inverse * original col. } for j:= 0 to m do curcol[i]:= curcol[i] + carry[i, j]*tab[j, pivotcol] end; curcol[-1]:= cbar; { first element in current column } pivotrow:= -1; minratio:= large; for i:= 0 to m do { ratio test } begin if( curcol[i] > eps ) then begin ratio:= carry[i, -1]/curcol[i]; if( minratio > ratio ) then { favorable row } begin minratio:= ratio; pivotrow:= i; pivotel:= curcol[i] end else { break tie with max pivot } if ( (minratio = ratio) and (pivotel < curcol[i]) ) then begin pivotrow:= i; pivotel:= curcol[i] end end { curcol > eps } end; { for i } if ( pivotrow = -1 ) then unbounded:= true { nothing found } else unbounded:= false end; { rowsearch } procedure pivot; { pivots } var i, j: integer; begin { pivot } basis[pivotrow]:= pivotcol; for j:= -1 to m do carry[pivotrow, j]:= carry[pivotrow, j]/pivotel; for i:= -1 to m do if( i<> pivotrow ) then for j:= -1 to m do carry[i, j]:= carry[i, j] - carry[pivotrow, j]*curcol[i]; curcost:= -carry[-1, -1] end; { pivot } procedure changephase; { changes phase from 1 to 2, by switching to original cost vector } var i, j, b: integer; begin { changephase } phase:= 2; for i:= 0 to m do if( basis[i] <= 0 ) then writeln( '...artificial basis element ', basis[i]:5, ' remains in basis after phase 1'); for j:= 1 to ncol do d[j]:= c[j]; { switch to original cost vector } for j:= -1 to m do begin carry[-1, j]:= 0.0; for i:= 0 to m do begin b:= basis[i]; { ignore artificial basis elements that are } if( b >= 1 ) then { still in basis } carry[-1, j]:= carry[-1, j] - c[b]*carry[i,j]; end { for i } end; { for j } curcost:= -carry[-1, -1] end; { changephase } procedure setup; { sets up test problem, lhs = tab*x, x >= 0, min c*x } { nrow = number of rows; ncol = number of cols } { tab = tableau; lhs = constants } var i, j, nrow: integer; begin { setup } readln(nrow); { read number of rows } readln(ncol); { read number of columns } m:= nrow - 1; { rows are numbered 0..m } for j:= 1 to ncol do read(c[j]); { cost vector } for i:= 0 to m do begin read(lhs[i]); { left-hand-side } for j:= 1 to ncol do read(tab[i, j]); { tableau } end; done:= false; { initialize carry matrix, etc. } phase:= 1; for i:= -1 to m do for j:= -1 to mmax do carry[i, j]:= 0.0; for i:= 0 to m do carry[i, i]:= 1.0; { artificial basis } for i:= 0 to m do begin carry[i, -1]:= lhs[i]; { -1 col of carry = left-hand-side } carry[-1, -1]:= carry[-1, -1] - lhs[i] { - initial cost } end; curcost:= -carry[-1, -1]; for i:= 0 to m do basis[i]:= -i; { initial, artificial basis } if( ncol <= ncolmax ) then { check number of columns } for col:= 1 to ncol do { initialize cost vector for phase 1 } begin d[col]:= 0.0; for row:= 0 to m do d[col]:= d[col] - tab[row, col] end else begin writeln('...termination: too many columns for storage'); done:= true; result:= toomanycols end; numpivots:= 0; end; { setup } begin { simplex } setup; while( (numpivots < maxpivots) and (not done) and ( (curcost > lowlim) or (phase = 1) ) ) do begin columnsearch; if( not optimal ) then begin { not optimal } rowsearch; if( unbounded ) then begin done:= true; result:= unbound; writeln('problem is unbounded') end else begin pivot; numpivots:= numpivots + 1; if ( (numpivots = 1 ) or ( numpivots mod 10 = 0 ) ) then writeln('pivot ', numpivots:4, ' cost= ', curcost:12) end end { not optimal } else { optimal } if( phase = 1 ) then begin if( curcost > eps ) then begin done:= true; result:= infeas; writeln('problem is infeasible') end else begin if ( (numpivots <> 1 ) and ( numpivots mod 10 <> 0 ) ) then writeln('pivot ', numpivots:4, ' cost= ', curcost:12); writeln('phase 1 successfully completed'); changephase end end { if phase = 1 } else begin if ( (numpivots <> 1 ) and ( numpivots mod 10 <> 0 ) ) then writeln('pivot ', numpivots:4, ' cost= ', curcost:12); writeln('phase 2 successfully completed'); done:= true; result:= opt end end; { while } if(((curcost <= lowlim) and (phase = 2) ) then begin if ( (numpivots <> 1 ) and ( numpivots mod 10 <> 0 ) ) then writeln('pivot ', numpivots:4, ' cost= ', curcost:12); result:= unbound; writeln('problem is unbounded') end; if ( numpivots >= maxpivots ) then begin writeln('...termination: maximum number of pivots exceeded'); result:= toomanypivots, end; if result = opt then begin writeln('optimal solution reached'); writeln('cost =', -carry[-1,-1]:10:6); for i:= 0 to m do writeln('x(', basis[i]:4, ')= ', carry[i,-1]:10:6) end. mlton-20100608/mlyacc/examples/pascal/test/t2.p0000644000076600000240000000007411404435642017601 0ustar mtfstaffprogram p(input,output); begin if x := 0 then x := 1 end. mlton-20100608/mlyacc/examples/pascal/test/t3.p0000644000076600000240000000017111404435642017600 0ustar mtfstaffprogram p(input,output); function topsort(var x: order, var y : sorted, x : integer); begin end; begin x:= 1 end. mlton-20100608/mlyacc/examples/pascal/test/t4.p0000644000076600000240000000013311404435642017577 0ustar mtfstaffprogram p(input,output); var l,n: real; var x, nonprime,prime: ; begin var end. mlton-20100608/mlyacc/examples/pascal/test/t5.p0000644000076600000240000000014311404435642017601 0ustar mtfstaffprogram p(input,output) begin writeln(' '; 9, 'x'; 10, 'm'; 9, '[x]'; 9,'approx x]'; 19, end. mlton-20100608/mlyacc/examples/pascal/test/t6.p0000644000076600000240000000066411404435642017612 0ustar mtfstaffprogram this (output) procedure addcor; var bins,start,i,last : integer; level : real; begin bins := trunc((r1+r2)*maxcor); if bins < 1 then bins := 1; start := round(d*maxcor) - bins div 2; level := mm/bins; last := start+bins; if last>maxcor then last := maxcor; corfarray[start] := corfarray[start]-level; corfarray[last] := corfarray[last]+level; end; mlton-20100608/mlyacc/examples/pascal/test/t7.p0000644000076600000240000000012011404435642017576 0ustar mtfstaffprogram p(input,otput); begin for i := 1 to maxelements do y[i] := 0; end. mlton-20100608/mlyacc/main.sml0000644000076600000240000000125011404435642014471 0ustar mtfstaff(* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure Main = struct fun usage s = Process.usage {usage = "file.grm", msg = s} fun main args = let val rest = let open Popt in parse {switches = args, opts = []} end in case rest of Result.No msg => usage msg | Result.Yes [file] => ParseGen.parseGen file | _ => usage "too many files" end val main = Process.makeMain main end mlton-20100608/mlyacc/Makefile0000644000076600000240000000341211404435642014472 0ustar mtfstaff## Copyright (C) 2009 Matthew Fluet. # Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## SRC := $(shell cd .. && pwd) BUILD := $(SRC)/build BIN := $(BUILD)/bin LIB := $(BUILD)/lib MLTON := mlton TARGET := self FLAGS := -target $(TARGET) NAME := mlyacc PATH := $(BIN):$(shell echo $$PATH) ifeq (mllex, $(shell if mllex >/dev/null 2>&1 || [ $$? != 127 ] ; then echo mllex; fi)) MLLEX := mllex else ifeq (ml-lex, $(shell if ml-lex >/dev/null 2>&1 || [ $$? != 127 ] ; then echo ml-lex; fi)) MLLEX := ml-lex else MLLEX := no-mllex endif endif ifeq (mlyacc, $(shell if mlyacc >/dev/null 2>&1 || [ $$? != 127 ] ; then echo mlyacc; fi)) MLYACC := mlyacc else ifeq (ml-yacc, $(shell if ml-lex >/dev/null 2>&1 || [ $$? != 127 ] ; then echo ml-yacc; fi)) MLYACC := ml-yacc else MLYACC := no-mlyacc endif endif all: $(NAME) $(NAME): $(NAME).mlb $(shell PATH="$(BIN):$$PATH" && "$(MLTON)" -stop f $(NAME).mlb) @echo 'Compiling $(NAME)' "$(MLTON)" $(FLAGS) $(NAME).mlb src/yacc.lex.sml: src/yacc.lex rm -f src/yacc.lex.sml && \ $(MLLEX) src/yacc.lex && \ chmod -w src/yacc.lex.sml src/%.grm.sig src/%.grm.sml: src/%.grm rm -f $<.* $(MLYACC) $< chmod -w $<.* doc/mlyacc.ps: $(MAKE) -C doc mlyacc.ps doc/mlyacc.pdf: $(MAKE) -C doc mlyacc.pdf mlyacc.ps: doc/mlyacc.ps cp doc/mlyacc.ps . mlyacc.pdf: doc/mlyacc.pdf cp doc/mlyacc.pdf . .PHONY: clean clean: ../bin/clean .PHONY: docs docs: mlyacc.pdf .PHONY: test test: $(NAME) cp -p ../mlton/front-end/ml.grm . && \ $(NAME) ml.grm && \ diff ml.grm.sig ../mlton/front-end/ml.grm.sig && \ diff ml.grm.sml ../mlton/front-end/ml.grm.sml mlton-20100608/mlyacc/mlyacc.mlb0000644000076600000240000000245311404435642015002 0ustar mtfstaff(* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) local local local $(SML_LIB)/basis/basis.mlb $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb src/utils.sig src/utils.sml src/sigs.sml src/hdr.sml src/yacc.grm.sig src/yacc.grm.sml local (* import Unsafe in case yacc.lex.sml is generated by an old version of * mllex that creates references to Unsafe. *) $(SML_LIB)/basis/unsafe.mlb in src/yacc.lex.sml end src/parse.sml src/grammar.sml src/core.sml src/coreutils.sml src/graph.sml src/look.sml src/lalr.sml src/mklrtable.sml src/mkprstruct.sml src/shrink.sml src/verbose.sml src/absyn.sig src/absyn.sml src/yacc.sml src/link.sml in structure ParseGen end local ../lib/mlton/sources.mlb main.sml in structure Main end in structure Main end in call-main.sml end mlton-20100608/mlyacc/README0000644000076600000240000000235111404435642013713 0ustar mtfstaffCopyright (c) 1989, 1990, 1991 Andrew W. Appel and David R. Tarditi Jr. This directory contains ML-Yacc, an LALR parser generator for Standard ML. ML-Yacc is distributed subject to the terms of the accompanying ML-Yacc copyright notice, license, and disclaimer in the file COPYRIGHT. Files of interest (those marked with a * must be built by the person installing ML-Yacc): README - this file INSTALL - installation instructions. COPYRIGHT - this software is distributed subject to the terms of this file. lib - implementation of the ML-Yacc library (aka $/ml-yacc-lib.cm); this library is used by both by applications and by ML-Yacc itself (because ML-Yacc IS an ML-Yacc application) src - source code for the parser-generator part of ML-Yacc. doc - documentation for ML-Yacc. Please read this before using ML-Yacc examples - sample parsers built with ML-Yacc build - script that invokes ../../bin/ml-build to construct the stand-alone version of ML-Yacc mlton-20100608/mlyacc/README.MLton0000644000076600000240000000257311404435642014751 0ustar mtfstaffThis is a modified version of the ml-lex directory that comes with SML/NJ. Files from SML/NJ: COPYRIGHT INSTALL -- deleted build -- deleted build.bat -- deleted doc/ examples/ lib/base.sig -- moved to /lib/mlyacc-lib lib/join.sml -- moved to /lib/mlyacc-lib lib/lrtable.sml -- moved to /lib/mlyacc-lib lib/ml-yacc-lib.cm lib/parser1.sml -- moved to /lib/mlyacc-lib lib/parser2.sml -- moved to /lib/mlyacc-lib lib/sources.cm -- deleted lib/stream.sml -- moved to /lib/mlyacc-lib src/FILES src/README src/absyn.sig -- modifed src/absyn.sml -- modifed src/core.sml src/coreutils.sml src/export-yacc.sml -- deleted src/grammar.sml src/graph.sml src/hdr.sml -- modifed src/lalr.sml src/link.sml src/look.sml src/mklrtable.sml src/mkprstruct.sml src/ml-yacc.cm -- deleted src/parse.sml -- modifed src/shrink.sml src/sigs.sml -- modifed src/utils.sig src/utils.sml src/verbose.sml src/yacc.grm -- modifed src/yacc.grm.sig -- deleted (generated by Makefile) src/yacc.grm.sml -- deleted (generated by Makefile) src/yacc.lex -- modifed src/yacc.lex.sml -- deleted (generated by Makefile) src/yacc.sml -- modifed tool/* -- deleted Files added: Makefile README.MLton call-main.sml doc/Makefile doc/macros.hva lib/mlyacc-lib.mlb -- moved to /lib/mlyacc-lib main.sml mlyacc.mlb mlton-20100608/mlyacc/src/0000755000076600000240000000000011404470407013617 5ustar mtfstaffmlton-20100608/mlyacc/src/.ignore0000644000076600000240000000004711404435642015106 0ustar mtfstaffyacc.grm.sig yacc.grm.sml yacc.lex.sml mlton-20100608/mlyacc/src/absyn.sig0000644000076600000240000000205511404435642015443 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) signature ABSYN = sig datatype exp = EVAR of string | EAPP of exp * exp | ETUPLE of exp list | EINT of int | FN of pat * exp | LET of decl list * exp | UNIT | SEQ of exp * exp | CODE of {text : string, pos : Header.pos} and pat = PVAR of string | PAPP of string * pat | PTUPLE of pat list | PLIST of pat list * pat option | PINT of int | WILD | AS of string * pat and decl = VB of pat * exp and rule = RULE of pat * exp val printRule : ((string -> unit) * (string -> unit) * (Header.pos option -> string)) -> rule -> unit end mlton-20100608/mlyacc/src/absyn.sml0000644000076600000240000001467311404435642015465 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1991 Andrew W. Appel, David R. Tarditi *) structure Absyn : ABSYN = struct datatype exp = CODE of {text : string, pos : Header.pos} | EAPP of exp * exp | EINT of int | ETUPLE of exp list | EVAR of string | FN of pat * exp | LET of decl list * exp | SEQ of exp * exp | UNIT and pat = PVAR of string | PAPP of string * pat | PINT of int | PLIST of pat list * pat option | PTUPLE of pat list | WILD | AS of string * pat and decl = VB of pat * exp and rule = RULE of pat * exp fun idchar #"'" = true | idchar #"_" = true | idchar c = Char.isAlpha c orelse Char.isDigit c fun code_to_ids s = let fun g(nil,r) = r | g(a as (h::t),r) = if Char.isAlpha h then f(t,[h],r) else g(t,r) and f(nil,accum,r)= implode(rev accum)::r | f(a as (h::t),accum,r) = if idchar h then f(t,h::accum,r) else g(a,implode (rev accum) :: r) in g(explode s,nil) end val simplifyRule : rule -> rule = fn (RULE(p,e)) => let val used : (string -> bool) = let fun f(CODE s) = code_to_ids (#text s) | f(EAPP(a,b)) = f a @ f b | f(ETUPLE l) = List.concat (map f l) | f(EVAR s) = [s] | f(FN(_,e)) = f e | f(LET(dl,e)) = (List.concat (map (fn VB(_,e) => f e) dl)) @ f e | f(SEQ(a,b)) = f a @ f b | f _ = nil val identifiers = f e in fn s => List.exists (fn a=>a=s) identifiers end val simplifyPat : pat -> pat = let fun f a = case a of (PVAR s) => if used s then a else WILD | (PAPP(s,pat)) => (case f pat of WILD => WILD | pat' => PAPP(s,pat')) | (PLIST (l, topt)) => let val l' = map f l val topt' = Option.map f topt fun notWild WILD = false | notWild _ = true in case topt' of SOME WILD => if List.exists notWild l' then PLIST (l', topt') else WILD | _ => PLIST (l', topt') end | (PTUPLE l) => let val l' = map f l in if List.exists(fn WILD=>false | _ => true) l' then PTUPLE l' else WILD end | (AS(a,b)) => if used a then case f b of WILD => PVAR a | b' => AS(a,b') else f b | _ => a in f end val simplifyExp : exp -> exp = let fun f(EAPP(a,b)) = EAPP(f a,f b) | f(ETUPLE l) = ETUPLE(map f l) | f(FN(p,e)) = FN(simplifyPat p,f e) | f(LET(dl,e)) = LET(map (fn VB(p,e) => VB(simplifyPat p,f e)) dl, f e) | f(SEQ(a,b)) = SEQ(f a,f b) | f a = a in f end in RULE(simplifyPat p,simplifyExp e) end fun printRule (say : string -> unit, sayln:string -> unit, fmtPos) r = let fun flat (a, []) = rev a | flat (a, SEQ (e1, e2) :: el) = flat (a, e1 :: e2 :: el) | flat (a, e :: el) = flat (e :: a, el) fun pl (lb, rb, c, f, [], a) = " " :: lb :: rb :: a | pl (lb, rb, c, f, h :: t, a) = " " :: lb :: f (h, foldr (fn (x, a) => c :: f (x, a)) (rb :: a) t) fun pe (CODE {text, pos}, a) = " (" :: fmtPos (SOME pos) :: text :: fmtPos NONE :: ")" :: a | pe (EAPP (x, y as (EAPP _)), a) = pe (x, " (" :: pe (y, ")" :: a)) | pe (EAPP (x, y), a) = pe (x, pe (y, a)) | pe (EINT i, a) = " " :: Int.toString i :: a | pe (ETUPLE l, a) = pl ("(", ")", ",", pe, l, a) | pe (EVAR v, a) = " " :: v :: a | pe (FN (p, b), a) = " (fn" :: pp (p, " =>" :: pe (b, ")" :: a)) | pe (LET ([], b), a) = pe (b, a) | pe (LET (dl, b), a) = let fun pr (VB (p, e), a) = " val " :: pp (p, " =" :: pe (e, "\n" :: a)) in " let" :: foldr pr (" in" :: pe (b, "\nend" :: a)) dl end | pe (SEQ (e1, e2), a) = pl ("(", ")", ";", pe, flat ([], [e1, e2]), a) | pe (UNIT, a) = " ()" :: a and pp (PVAR v, a) = " " :: v :: a | pp (PAPP (x, y as PAPP _), a) = " " :: x :: " (" :: pp (y, ")" :: a) | pp (PAPP (x, y), a) = " " :: x :: pp (y, a) | pp (PINT i, a) = " " :: Int.toString i :: a | pp (PLIST (l, NONE), a) = pl ("[", "]", ",", pp, l, a) | pp (PLIST (l, SOME t), a) = " (" :: foldr (fn (x, a) => pp (x, " ::" :: a)) (pp (t, ")" :: a)) l | pp (PTUPLE l, a) = pl ("(", ")", ",", pp, l, a) | pp (WILD, a) = " _" :: a | pp (AS (v, PVAR v'), a) = " (" :: v :: " as " :: v' :: ")" :: a | pp (AS (v, p), a) = " (" :: v :: " as (" :: pp (p, "))" :: a) fun out "\n" = sayln "" | out s = say s in case simplifyRule r of RULE (p, e) => app out (pp (p, " =>" :: pe (e, ["\n"]))) end end; mlton-20100608/mlyacc/src/core.sml0000644000076600000240000000633711404435642015277 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkCore(structure IntGrammar : INTGRAMMAR) : CORE = struct open IntGrammar open Grammar structure IntGrammar = IntGrammar structure Grammar = Grammar datatype item = ITEM of { rule : rule, dot : int, rhsAfter : symbol list } val eqItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, ITEM{rule=RULE{num=m,...},dot=e,...}) => n=m andalso d=e val gtItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, ITEM{rule=RULE{num=m,...},dot=e,...}) => n>m orelse (n=m andalso d>e) structure ItemList = ListOrdSet (struct type elem = item val eq = eqItem val gt = gtItem end) open ItemList datatype core = CORE of item list * int val gtCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_gt(a,b) val eqCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_eq(a,b) (* functions for printing and debugging *) val prItem = fn (symbolToString,nontermToString,print) => let val printInt = print o (Int.toString : int -> string) val prSymbol = print o symbolToString val prNonterm = print o nontermToString fun showRest nil = () | showRest (h::t) = (prSymbol h; print " "; showRest t) fun showRhs (l,0) = (print ". "; showRest l) | showRhs (nil,_) = () | showRhs (h::t,n) = (prSymbol h; print " "; showRhs(t,n-1)) in fn (ITEM {rule=RULE {lhs,rhs,rulenum,num,...}, dot,rhsAfter,...}) => (prNonterm lhs; print " : "; showRhs(rhs,dot); case rhsAfter of nil => (print " (reduce by rule "; printInt rulenum; print ")") | _ => (); if DEBUG then (print " (num "; printInt num; print ")") else ()) end val prCore = fn a as (_,_,print) => let val prItem = prItem a in fn (CORE (items,state)) => (print "state "; print (Int.toString state); print ":\n\n"; app (fn i => (print "\t"; prItem i; print "\n")) items; print "\n") end end; mlton-20100608/mlyacc/src/coreutils.sml0000644000076600000240000002402711404435642016354 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkCoreUtils(structure Core : CORE) : CORE_UTILS = struct open Array List infix 9 sub val DEBUG = true structure Core = Core structure IntGrammar = Core.IntGrammar structure Grammar = IntGrammar.Grammar open Grammar IntGrammar Core structure Assoc = SymbolAssoc structure NtList = ListOrdSet (struct type elem = nonterm val eq = eqNonterm val gt = gtNonterm end) val mkFuncs = fn (GRAMMAR {rules,terms,nonterms,...}) => let val derives=array(nonterms,nil : rule list) (* sort rules by their lhs nonterminal by placing them in an array indexed in their lhs nonterminal *) val _ = let val f = fn {lhs=lhs as (NT n), rhs, precedence,rulenum} => let val rule=RULE{lhs=lhs,rhs=rhs,precedence=precedence, rulenum=rulenum,num=0} in update(derives,n,rule::(derives sub n)) end in app f rules end (* renumber rules so that rule numbers increase monotonically with the number of their lhs nonterminal, and so that rules are numbered sequentially. **Functions below assume that this number is true**, i.e. productions for nonterm i are numbered from j to k, productions for nonterm i+1 are numbered from k+1 to m, and productions for nonterm 0 start at 0 *) val _ = let val f = fn (RULE{lhs,rhs,precedence,rulenum,num}, (l,i)) => (RULE{lhs=lhs,rhs=rhs, precedence=precedence, rulenum=rulenum, num=i}::l,i+1) fun g(i,num) = if i if DEBUG andalso (n<0 orelse n>=nonterms) then let exception Produces of int in raise (Produces n) end else derives sub n val memoize = fn f => let fun loop i = if i = nonterms then nil else f (NT i) :: (loop (i+1)) val data = Array.fromList(loop 0) in fn (NT i) => data sub i end (* compute nonterminals which must be added to a closure when a given nonterminal is added, i.e all nonterminals C for each nonterminal A such that A =*=> Cx *) val nontermClosure = let val collectNonterms = fn n => List.foldr (fn (r,l) => case r of RULE {rhs=NONTERM n :: _,...} => NtList.insert(n,l) | _ => l) NtList.empty (produces n) val closureNonterm = fn n => NtList.closure(NtList.singleton n, collectNonterms) in memoize closureNonterm end (* ntShifts: Take the items produced by a nonterminal, and sort them by their first symbol. For each first symbol, make sure the item list associated with the symbol is sorted also. ** This function assumes that the item list returned by produces is sorted ** Create a table of item lists keyed by symbols. Scan the list of items produced by a nonterminal, and insert those with a first symbol on to the beginning of the item list for that symbol, creating a list if necessary. Since produces returns an item list that is already in order, the list for each symbol will also end up in order. *) fun sortItems nt = let fun add_item (a as RULE{rhs=symbol::rest,...},r) = let val item = ITEM{rule=a,dot=1,rhsAfter=rest} in Assoc.insert((symbol,case Assoc.find (symbol,r) of SOME l => item::l | NONE => [item]),r) end | add_item (_,r) = r in List.foldr add_item Assoc.empty (produces nt) end val ntShifts = memoize sortItems (* getNonterms: get the nonterminals with a . before them in a core. Returns a list of nonterminals in ascending order *) fun getNonterms l = List.foldr (fn (ITEM {rhsAfter=NONTERM sym ::_, ...},r) => NtList.insert(sym,r) | (_,r) => r) [] l (* closureNonterms: compute the nonterminals that would have a . before them in the closure of the core. Returns a list of nonterminals in ascending order *) fun closureNonterms a = let val nonterms = getNonterms a in List.foldr (fn (nt,r) => NtList.union(nontermClosure nt,r)) nonterms nonterms end (* shifts: compute the core sets that result from shift/gotoing on the closure of a kernal set. The items in core sets are sorted, of course. (1) compute the core sets that result just from items added through the closure operation. (2) then add the shift/gotos on kernal items. We can do (1) the following way. Keep a table which for each shift/goto symbol gives the list of items that result from shifting or gotoing on the symbol. Compute the nonterminals that would have dots before them in the closure of the kernal set. For each of these nonterminals, we already have an item list in sorted order for each possible shift symbol. Scan the nonterminal list from back to front. For each nonterminal, prepend the shift/goto list for each shift symbol to the list already in the table. We end up with the list of items in correct order for each shift/goto symbol. We have kept the item lists in order, scanned the nonterminals from back to front (=> that the items end up in ascending order), and never had any duplicate items (each item is derived from only one nonterminal). *) fun shifts (CORE (itemList,_)) = let (* mergeShiftItems: add an item list for a shift/goto symbol to the table *) fun mergeShiftItems (args as ((k,l),r)) = case Assoc.find(k,r) of NONE => Assoc.insert args | SOME old => Assoc.insert ((k,l@old),r) (* mergeItems: add all items derived from a nonterminal to the table. We've kept these items sorted by their shift/goto symbol (the first symbol on their rhs) *) fun mergeItems (n,r) = Assoc.fold mergeShiftItems (ntShifts n) r (* nonterms: a list of nonterminals that are in a core after the closure operation *) val nonterms = closureNonterms itemList (* now create a table which for each shift/goto symbol gives the sorted list of closure items which would result from first taking all the closure items and then sorting them by the shift/goto symbols *) val newsets = List.foldr mergeItems Assoc.empty nonterms (* finally prepare to insert the kernal items of a core *) fun insertItem ((k,i),r) = case (Assoc.find(k,r)) of NONE => Assoc.insert((k,[i]),r) | SOME l => Assoc.insert((k,Core.insert(i,l)),r) fun shiftCores(ITEM{rule,dot,rhsAfter=symbol::rest},r) = insertItem((symbol, ITEM{rule=rule,dot=dot+1,rhsAfter=rest}),r) | shiftCores(_,r) = r (* insert the kernal items of a core *) val newsets = List.foldr shiftCores newsets itemList in Assoc.make_list newsets end (* nontermEpsProds: returns a list of epsilon productions produced by a nonterminal sorted by rule number. ** Depends on produces returning an ordered list **. It does not alter the order in which the rules were returned by produces; it only removes non-epsilon productions *) val nontermEpsProds = let val f = fn nt => List.foldr (fn (rule as RULE {rhs=nil,...},results) => rule :: results | (_,results) => results) [] (produces nt) in memoize f end (* epsProds: take a core and compute a list of epsilon productions for it sorted by rule number. ** Depends on closureNonterms returning a list of nonterminals sorted by nonterminal #, rule numbers increasing monotonically with their lhs production #, and nontermEpsProds returning an ordered item list for each production *) fun epsProds (CORE (itemList,state)) = let val prods = map nontermEpsProds (closureNonterms itemList) in List.concat prods end in {produces=produces,shifts=shifts,rules=rules,epsProds=epsProds} end end; mlton-20100608/mlyacc/src/FILES0000644000076600000240000000200311404435642014401 0ustar mtfstaffBase files; used by all parsers generated by ML-Yacc, included ML-Yacc's own parser. ../lib/base.sig ../lib/stream.sml ../lib/lrtable.sml ../lib/join.sml ../lib/parser2.sml Signatures and parser for ML-Yacc. utils.sig sigs.sml hdr.sml yacc.grm.sig yacc.grm.sml yacc.lex.sml parse.sml LR table generator: base definitions: grammar.sml LR(0) graph generation: intgrammar.sml core.sml coreutils.sml graph.sml LALR(1) table generation: look.sml lalr.sml mklrtable.sml modules to print out table structure: mkprstruct.sml shrink.sml and verbose file: verbose.sml Rest of ML-Yacc: Signature and module to handle abstract syntax for actions and remove unused variable bindings from the abstract syntax: absyn.sig absyn.sml module to check specification for errors, create grammar from specification, have appropriate files printed out, and print out semantic actions for the parser: yacc.sml module to hook everything together: link.sml mlton-20100608/mlyacc/src/grammar.sml0000644000076600000240000001102611404435642015764 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) structure Grammar : GRAMMAR = struct (* define types term and nonterm using those in LrTable datatype term = T of int datatype nonterm = NT of int *) open LrTable datatype symbol = TERM of term | NONTERM of nonterm datatype grammar = GRAMMAR of {rules: {lhs: nonterm, rhs: symbol list, precedence: int option, rulenum: int} list, noshift : term list, eop : term list, terms: int, nonterms: int, start : nonterm, precedence : term -> int option, termToString : term -> string, nontermToString : nonterm -> string} end; structure IntGrammar : INTGRAMMAR = struct structure Grammar = Grammar open Grammar datatype rule = RULE of {lhs: nonterm, rhs: symbol list, num: int,(* internal # assigned by coreutils *) rulenum: int, precedence: int option} val eqTerm : term * term -> bool = (op =) val gtTerm : term * term -> bool = fn (T i,T j) => i>j val eqNonterm : nonterm * nonterm -> bool = (op =) val gtNonterm : nonterm * nonterm -> bool = fn (NT i,NT j) => i>j val eqSymbol : symbol * symbol -> bool = (op =) val gtSymbol = fn (TERM (T i),TERM (T j)) => i>j | (NONTERM (NT i),NONTERM (NT j)) => i>j | (TERM _,NONTERM _) => false | (NONTERM _,TERM _) => true structure SymbolAssoc = Table(type key = symbol val gt = gtSymbol) structure NontermAssoc = Table(type key = nonterm val gt = gtNonterm) val DEBUG = false val prRule = fn (a as symbolToString,nontermToString,print) => let val printSymbol = print o symbolToString fun printRhs (h::t) = (printSymbol h; print " "; printRhs t) | printRhs nil = () in fn (RULE {lhs,rhs,num,rulenum,precedence,...}) => ((print o nontermToString) lhs; print " : "; printRhs rhs; if DEBUG then (print " num = "; print (Int.toString num); print " rulenum = "; print (Int.toString rulenum); print " precedence = "; case precedence of NONE => print " none" | (SOME i) => print (Int.toString i); ()) else ()) end val prGrammar = fn (a as (symbolToString,nontermToString,print)) => fn (GRAMMAR {rules,terms,nonterms,start,...}) => let val printRule = let val prRule = prRule a in fn {lhs,rhs,precedence,rulenum} => (prRule (RULE {lhs=lhs,rhs=rhs,num=0, rulenum=rulenum, precedence=precedence}); print "\n") end in print "grammar = \n"; List.app printRule rules; print "\n"; print (" terms = " ^ (Int.toString terms) ^ " nonterms = " ^ (Int.toString nonterms) ^ " start = "); (print o nontermToString) start; () end end; mlton-20100608/mlyacc/src/graph.sml0000644000076600000240000001153611404435642015445 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkGraph(structure IntGrammar : INTGRAMMAR structure Core : CORE structure CoreUtils : CORE_UTILS sharing IntGrammar = Core.IntGrammar = CoreUtils.IntGrammar sharing CoreUtils.Core = Core ) : LRGRAPH = struct open Array List infix 9 sub structure Core = Core structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar open Core Core.Grammar CoreUtils IntGrammar structure NodeSet = RbOrdSet (struct type elem = core val eq = eqCore val gt = gtCore end) open NodeSet exception Shift of int * symbol type graph = {edges: {edge:symbol,to:core} list array, nodes: core list,nodeArray : core array} val edges = fn (CORE (_,i),{edges,...}:graph) => edges sub i val nodes = fn ({nodes,...} : graph) => nodes val shift = fn ({edges,nodes,...} : graph) => fn a as (i,sym) => let fun find nil = raise (Shift a) | find ({edge,to=CORE (_,state)} :: r) = if gtSymbol(sym,edge) then find r else if eqSymbol(edge,sym) then state else raise (Shift a) in find (edges sub i) end val core = fn ({nodeArray,...} : graph) => fn i => nodeArray sub i val mkGraph = fn (g as (GRAMMAR {start,...})) => let val {shifts,produces,rules,epsProds} = CoreUtils.mkFuncs g fun add_goto ((symbol,a),(nodes,edges,future,num)) = case find(CORE (a,0),nodes) of NONE => let val core =CORE (a,num) val edge = {edge=symbol,to=core} in (insert(core,nodes),edge::edges, core::future,num+1) end | (SOME c) => let val edge={edge=symbol,to=c} in (nodes,edge::edges,future,num) end fun f (nodes,node_list,edge_list,nil,nil,num) = let val nodes=rev node_list in {nodes=nodes, edges=Array.fromList (rev edge_list), nodeArray = Array.fromList nodes } end | f (nodes,node_list,edge_list,nil,y,num) = f (nodes,node_list,edge_list,rev y,nil,num) | f (nodes,node_list,edge_list,h::t,y,num) = let val (nodes,edges,future,num) = List.foldr add_goto (nodes,[],y,num) (shifts h) in f (nodes,h::node_list, edges::edge_list,t,future,num) end in {graph= let val makeItem = fn (r as (RULE {rhs,...})) => ITEM{rule=r,dot=0,rhsAfter=rhs} val initialItemList = map makeItem (produces start) val orderedItemList = List.foldr Core.insert [] initialItemList val initial = CORE (orderedItemList,0) in f(empty,nil,nil,[initial],nil,1) end, produces=produces, rules=rules, epsProds=epsProds} end val prGraph = fn a as (nontermToString,termToString,print) => fn g => let val printCore = prCore a val printSymbol = print o nontermToString val nodes = nodes g val printEdges = fn n => List.app (fn {edge,to=CORE (_,state)} => (print "\tshift on "; printSymbol edge; print " to "; print (Int.toString state); print "\n")) (edges (n,g)) in List.app (fn c => (printCore c; print "\n"; printEdges c)) nodes end end; mlton-20100608/mlyacc/src/hdr.sml0000644000076600000240000001131511404435642015114 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor HeaderFun () : HEADER = struct val DEBUG = true type pos = {line : int, col : int} val pos = {line = ref 1, start = ref 0} val text = ref (nil: string list) type inputSource = {name : string, errStream : TextIO.outstream, inStream : TextIO.instream, errorOccurred : bool ref} val newSource = fn (s : string,i : TextIO.instream ,errs : TextIO.outstream) => {name=s,errStream=errs,inStream=i, errorOccurred = ref false} val errorOccurred = fn (s : inputSource) =>fn () => !(#errorOccurred s) val pr = fn out : TextIO.outstream => fn s : string => TextIO.output(out,s) val error = fn {name,errStream, errorOccurred,...} : inputSource => let val pr = pr errStream in fn l : pos => fn msg : string => (pr name; pr ", line "; pr (Int.toString (#line l)); pr ": Error: "; pr msg; pr "\n"; errorOccurred := true) end val warn = fn {name,errStream, errorOccurred,...} : inputSource => let val pr = pr errStream in fn l : pos => fn msg : string => (pr name; pr ", line "; pr (Int.toString (#line l)); pr ": Warning: "; pr msg; pr "\n") end datatype prec = LEFT | RIGHT | NONASSOC datatype symbol = SYMBOL of string * pos val symbolName = fn SYMBOL(s,_) => s val symbolPos = fn SYMBOL(_,p) => p val symbolMake = fn sp => SYMBOL sp type ty = string val tyName = fn i => i val tyMake = fn i => i datatype control = NODEFAULT | VERBOSE | PARSER_NAME of symbol | FUNCTOR of string | START_SYM of symbol | NSHIFT of symbol list | POS of string | PURE | PARSE_ARG of string * string | TOKEN_SIG_INFO of string datatype declData = DECL of {eop : symbol list, keyword : symbol list, nonterm : (symbol*ty option) list option, prec : (prec * (symbol list)) list, change: (symbol list * symbol list) list, term : (symbol* ty option) list option, control : control list, value : (symbol * string) list} type rhsData = {rhs:symbol list,code:string, prec:symbol option} list datatype rule = RULE of {lhs : symbol, rhs : symbol list, code : {text : string, pos : pos}, prec : symbol option} type parseResult = string * declData * rule list val getResult = fn p => p fun join_decls (DECL {eop=e,control=c,keyword=k,nonterm=n,prec, change=su,term=t,value=v}:declData, DECL {eop=e',control=c',keyword=k',nonterm=n',prec=prec', change=su',term=t',value=v'} : declData, inputSource,pos) = let val ignore = fn s => (warn inputSource pos ("ignoring duplicate " ^ s ^ " declaration")) val join = fn (e,NONE,NONE) => NONE | (e,NONE,a) => a | (e,a,NONE) => a | (e,a,b) => (ignore e; a) fun mergeControl (nil,a) = [a] | mergeControl (l as h::t,a) = case (h,a) of (PARSER_NAME _,PARSER_NAME n1) => (ignore "%name"; l) | (FUNCTOR _,FUNCTOR _) => (ignore "%header"; l) | (PARSE_ARG _,PARSE_ARG _) => (ignore "%arg"; l) | (START_SYM _,START_SYM s) => (ignore "%start"; l) | (POS _,POS _) => (ignore "%pos"; l) | (TOKEN_SIG_INFO _, TOKEN_SIG_INFO _) => (ignore "%token_sig_info"; l) | (NSHIFT a,NSHIFT b) => (NSHIFT (a@b)::t) | _ => h :: mergeControl(t,a) fun loop (nil,r) = r | loop (h::t,r) = loop(t,mergeControl(r,h)) in DECL {eop=e@e',control=loop(c',c),keyword=k'@k, nonterm=join("%nonterm",n,n'), prec=prec@prec', change=su@su', term=join("%term",t,t'),value=v@v'} : declData end end; structure Header = HeaderFun(); mlton-20100608/mlyacc/src/lalr.sml0000644000076600000240000005053711404435642015302 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkLalr ( structure IntGrammar : INTGRAMMAR structure Core : CORE structure Graph : LRGRAPH structure Look: LOOK sharing Graph.Core = Core sharing Graph.IntGrammar = Core.IntGrammar = Look.IntGrammar = IntGrammar) : LALR_GRAPH = struct open Array List infix 9 sub open IntGrammar.Grammar IntGrammar Core Graph Look structure Graph = Graph structure Core = Core structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar datatype tmpcore = TMPCORE of (item * term list ref) list * int datatype lcore = LCORE of (item * term list) list * int val prLcore = fn a as (SymbolToString,nontermToString,termToString,print) => let val printItem = prItem (SymbolToString,nontermToString,print) val printLookahead = prLook(termToString,print) in fn (LCORE (items,state)) => (print "\n"; print "state "; print (Int.toString state); print " :\n\n"; List.app (fn (item,lookahead) => (print "{"; printItem item; print ","; printLookahead lookahead; print "}\n")) items) end exception Lalr of int structure ItemList = ListOrdSet (struct type elem = item * term list ref val eq = fn ((a,_),(b,_)) => eqItem(a,b) val gt = fn ((a,_),(b,_)) => gtItem(a,b) end) structure NontermSet = ListOrdSet (struct type elem = nonterm val gt = gtNonterm val eq = eqNonterm end) (* NTL: nonterms with lookahead *) structure NTL = RbOrdSet (struct type elem = nonterm * term list val gt = fn ((i,_),(j,_)) => gtNonterm(i,j) val eq = fn ((i,_),(j,_)) => eqNonterm(i,j) end) val DEBUG = false val addLookahead = fn {graph,nullable,first,eop, rules,produces,nonterms,epsProds, print,termToString,nontermToString} => let val eop = Look.make_set eop val symbolToString = fn (TERM t) => termToString t | (NONTERM t) => nontermToString t val print = if DEBUG then print else fn _ => () val prLook = if DEBUG then prLook (termToString,print) else fn _ => () val prNonterm = print o nontermToString val prRule = if DEBUG then prRule(symbolToString,nontermToString,print) else fn _ => () val printInt = print o (Int.toString : int -> string) val printItem = prItem(symbolToString,nontermToString,print) (* look_pos: position in the rhs of a rule at which we should start placing lookahead ref cells, i.e. the minimum place at which A -> x .B y, where B is a nonterminal and y =*=> epsilon, or A -> x. is true. Positions are given by the number of symbols before the place. The place before the first symbol is 0, etc. *) val look_pos = let val positions = array(length rules,0) (* rule_pos: calculate place in the rhs of a rule at which we should start placing lookahead ref cells *) fun rule_pos (RULE {rhs,...}) = case (rev rhs) of nil => 0 | (TERM t) :: r => length rhs | (NONTERM n :: r) => let (* f assumes that everything after n in the * rule has proven to be nullable so far. * Remember that the rhs has been reversed, * implying that this is true initially *) (* A -> .z t B y, where y is nullable *) fun f (b, (r as (TERM _ :: _))) = length r (* A -> .z B C y *) | f (c, (NONTERM b :: r)) = if nullable c then f (b, r) else length r + 1 (* A -> .B y, where y is nullable *) | f (_, []) = 0 in f (n, r) end val check_rule = fn (rule as RULE {num,...}) => let val pos = rule_pos rule in (print "look_pos: "; prRule rule; print " = "; printInt pos; print "\n"; update(positions,num,rule_pos rule)) end in app check_rule rules; fn RULE{num,...} => (positions sub num) end (* rest_is_null: true for items of the form A -> x .B y, where y is nullable *) val rest_is_null = fn (ITEM{rule,dot, rhsAfter=NONTERM _ :: _}) => dot >= (look_pos rule) | _ => false (* map core to a new core including only items of the form A -> x. or A -> x. B y, where y =*=> epsilon. It also adds epsilon productions to the core. Each item is given a ref cell to hold the lookahead nonterminals for it.*) val map_core = let val f = fn (item as ITEM {rhsAfter=nil,...},r) => (item,ref nil) :: r | (item,r) => if (rest_is_null item) then (item,ref nil)::r else r in fn (c as CORE (items,state)) => let val epsItems = map (fn rule=>(ITEM{rule=rule,dot=0,rhsAfter=nil}, ref (nil : term list)) ) (epsProds c) in TMPCORE(ItemList.union(List.foldr f [] items,epsItems),state) end end val new_nodes = map map_core (nodes graph) exception Find (* findRef: state * item -> lookahead ref cell for item *) val findRef = let val states = Array.fromList new_nodes val dummy = ref nil in fn (state,item) => let val TMPCORE (l,_) = states sub state in case ItemList.find((item,dummy),l) of SOME (_,look_ref) => look_ref | NONE => (print "find failed: state "; printInt state; print "\nitem =\n"; printItem item; print "\nactual items =\n"; app (fn (i,_) => (printItem i; print "\n")) l; raise Find) end end (* findRuleRefs: state -> rule -> lookahead refs for rule. *) val findRuleRefs = let val shift = shift graph in fn state => (* handle epsilon productions *) fn (rule as RULE {rhs=nil,...}) => [findRef(state,ITEM{rule=rule,dot=0,rhsAfter=nil})] | (rule as RULE {rhs=sym::rest,...}) => let val pos = Int.max(look_pos rule,1) fun scan'(state,nil,pos,result) = findRef(state,ITEM{rule=rule, dot=pos, rhsAfter=nil}) :: result | scan'(state,rhs as sym::rest,pos,result) = scan'(shift(state,sym), rest, pos+1, findRef(state,ITEM{rule=rule, dot=pos, rhsAfter=rhs})::result) (* find first item of the form A -> x .B y, where y =*=> epsilon and x is not epsilon, or A -> x. use scan' to pick up all refs after this point *) fun scan(state,nil,_) = [findRef(state,ITEM{rule=rule,dot=pos,rhsAfter=nil})] | scan(state,rhs,0) = scan'(state,rhs,pos,nil) | scan(state,sym::rest,place) = scan(shift(state,sym),rest,place-1) in scan(shift(state,sym),rest,pos-1) end end (* function to compute for some nonterminal n the set of nonterminals A added through the closure of nonterminal n such that n =c*=> .A x, where x is nullable *) val nonterms_w_null = fn nt => let val collect_nonterms = fn n => List.foldr (fn (rule as RULE {rhs=rhs as NONTERM n :: _,...},r) => (case (rest_is_null(ITEM {dot=0,rhsAfter=rhs,rule=rule})) of true => n :: r | false => r) | (_,r) => r) [] (produces n) fun dfs(a as (n,r)) = if (NontermSet.exists a) then r else List.foldr dfs (NontermSet.insert(n,r)) (collect_nonterms n) in dfs(nt,NontermSet.empty) end val nonterms_w_null = let val data = array(nonterms,NontermSet.empty) fun f n = if n=nonterms then () else (update(data,n,nonterms_w_null (NT n)); f (n+1)) in (f 0; fn (NT nt) => data sub nt) end (* look_info: for some nonterminal n the set of nonterms A added through the closure of the nonterminal such that n =c+=> .Ax and the lookahead accumlated for each nonterm A *) val look_info = fn nt => let val collect_nonterms = fn n => List.foldr (fn (RULE {rhs=NONTERM n :: t,...},r) => (case NTL.find ((n,nil),r) of SOME (key,data) => NTL.insert((n,Look.union(data,first t)),r) | NONE => NTL.insert ((n,first t),r)) | (_,r) => r) NTL.empty (produces n) fun dfs(a as ((key1,data1),r)) = case (NTL.find a) of SOME (_,data2) => NTL.insert((key1,Look.union(data1,data2)),r) | NONE => NTL.fold dfs (collect_nonterms key1) (NTL.insert a) in dfs((nt,nil),NTL.empty) end val look_info = if not DEBUG then look_info else fn nt => (print "look_info of "; prNonterm nt; print "=\n"; let val info = look_info nt in (NTL.app (fn (nt,lookahead) => (prNonterm nt; print ": "; prLook lookahead; print "\n\n")) info; info) end) (* prop_look: propagate lookaheads for nonterms added in the closure of a nonterm. Lookaheads must be propagated from each nonterminal m to all nonterminals { n | m =c+=> nx, where x=*=>epsilon} *) val prop_look = fn ntl => let val upd_lookhd = fn new_look => fn (nt,r) => case NTL.find ((nt,new_look),r) of SOME (_,old_look) => NTL.insert((nt, Look.union(new_look,old_look)),r) | NONE => raise (Lalr 241) val upd_nonterm = fn ((nt,look),r) => NontermSet.fold (upd_lookhd look) (nonterms_w_null nt) r in NTL.fold upd_nonterm ntl ntl end val prop_look = if not DEBUG then prop_look else fn ntl => (print "prop_look =\n"; let val info = prop_look ntl in (NTL.app (fn (nt,lookahead) => (prNonterm nt; print ": "; prLook lookahead; print "\n\n")) info; info) end) (* now put the information from these functions together. Create a function which takes a nonterminal n and returns a list of triplets of (a nonterm added through closure, the lookahead for the nonterm, whether the nonterm should include the lookahead for the nonterminal whose closure is being taken (i.e. first(y) for an item j of the form A -> x .n y and lookahead(j) if y =*=> epsilon) *) val closure_nonterms = let val data = array(nonterms,nil: (nonterm * term list * bool) list) val do_nonterm = fn i => let val nonterms_followed_by_null = nonterms_w_null i val nonterms_added_through_closure = NTL.make_list (prop_look (look_info i)) val result = map (fn (nt,l) => (nt,l,NontermSet.exists (nt,nonterms_followed_by_null)) ) nonterms_added_through_closure in if DEBUG then (print "closure_nonterms = "; prNonterm i; print "\n"; app (fn (nt,look,nullable) => (prNonterm nt; print ":"; prLook look; case nullable of false => print "(false)\n" | true => print "(true)\n")) result; print "\n") else (); result end fun f i = if i=nonterms then () else (update(data,i,do_nonterm (NT i)); f (i+1)) val _ = f 0 in fn (NT i) => data sub i end (* add_nonterm_lookahead: Add lookahead to all completion items for rules added when the closure of a given nonterm in some state is taken. It returns a list of lookahead refs to which the given nonterm's lookahead should be propagated. For each rule, it must trace the shift/gotos in the LR(0) graph to find all items of the form A-> x .B y where y =*=> epsilon or A -> x. *) val add_nonterm_lookahead = fn (nt,state) => let val f = fn ((nt,lookahead,nullable),r) => let val refs = map (findRuleRefs state) (produces nt) val refs = List.concat refs val _ = app (fn r => r := (Look.union (!r,lookahead))) refs in if nullable then refs @ r else r end in List.foldr f [] (closure_nonterms nt) end (* scan_core: Scan a core for all items of the form A -> x .B y. Applies add_nonterm_lookahead to each such B, and then merges first(y) into the list of refs returned by add_nonterm_lookahead. It returns a list of ref * ref list for all the items where y =*=> epsilon *) val scan_core = fn (CORE (l,state)) => let fun f ((item as ITEM{rhsAfter= NONTERM b :: y, dot,rule})::t,r) = (case (add_nonterm_lookahead(b,state)) of nil => r | l => let val first_y = first y val newr = if dot >= (look_pos rule) then (findRef(state,item),l)::r else r in (app (fn r => r := Look.union(!r,first_y)) l; f (t,newr)) end) | f (_ :: t,r) = f (t,r) | f (nil,r) = r in f (l,nil) end (* add end-of-parse symbols to set of items consisting of all items immediately derived from the start symbol *) val add_eop = fn (c as CORE (l,state),eop) => let fun f (item as ITEM {rule,dot,...}) = let val refs = findRuleRefs state rule in (* first take care of kernal items. Add the end-of-parse symbols to the lookahead sets for these items. Epsilon productions of the start symbol do not need to be handled specially because they will be in the kernal also *) app (fn r => r := Look.union(!r,eop)) refs; (* now take care of closure items. These are all nonterminals C which have a derivation S =+=> .C x, where x is nullable *) if dot >= (look_pos rule) then case item of ITEM{rhsAfter=NONTERM b :: _,...} => (case add_nonterm_lookahead(b,state) of nil => () | l => app (fn r => r := Look.union(!r,eop)) l) | _ => () else () end in app f l end val iterate = fn l => let fun f lookahead (nil,done) = done | f lookahead (h::t,done) = let val old = !h in h := Look.union (old,lookahead); if (length (!h)) <> (length old) then f lookahead (t,false) else f lookahead(t,done) end fun g ((from,to)::rest,done) = let val new_done = f (!from) (to,done) in g (rest,new_done) end | g (nil,done) = done fun loop true = () | loop false = loop (g (l,true)) in loop false end val lookahead = List.concat (map scan_core (nodes graph)) (* used to scan the item list of a TMPCORE and remove the items not being reduced *) val create_lcore_list = fn ((item as ITEM {rhsAfter=nil,...},ref l),r) => (item,l) :: r | (_,r) => r in add_eop(Graph.core graph 0,eop); iterate lookahead; map (fn (TMPCORE (l,state)) => LCORE (List.foldr create_lcore_list [] l, state)) new_nodes end end; mlton-20100608/mlyacc/src/link.sml0000644000076600000240000000344511404435642015301 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) local (* create parser *) structure LrVals = MlyaccLrValsFun(structure Token = LrParser.Token structure Hdr = Header) structure Lex = LexMLYACC(structure Tokens = LrVals.Tokens structure Hdr = Header) structure Parser = JoinWithArg(structure Lex=Lex structure ParserData = LrVals.ParserData structure LrParser= LrParser) structure ParseGenParser = ParseGenParserFun(structure Parser = Parser structure Header = Header) (* create structure for computing LALR table from a grammar *) structure MakeLrTable = mkMakeLrTable(structure IntGrammar =IntGrammar structure LrTable = LrTable) (* create structures for printing LALR tables: Verbose prints a verbose description of an lalr table PrintStruct prints an ML structure representing that is an lalr table *) structure Verbose = mkVerbose(structure Errs = MakeLrTable.Errs) structure PrintStruct = mkPrintStruct(structure LrTable = MakeLrTable.LrTable structure ShrinkLrTable = ShrinkLrTableFun(structure LrTable=LrTable)) in (* returns function which takes a file name, invokes the parser on the file, does semantic checks, creates table, and prints it *) structure ParseGen = ParseGenFun(structure ParseGenParser = ParseGenParser structure MakeTable = MakeLrTable structure Verbose = Verbose structure PrintStruct = PrintStruct structure Absyn = Absyn) end mlton-20100608/mlyacc/src/look.sml0000644000076600000240000001405511404435642015307 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkLook (structure IntGrammar : INTGRAMMAR) : LOOK = struct open Array List infix 9 sub structure Grammar = IntGrammar.Grammar structure IntGrammar = IntGrammar open Grammar IntGrammar structure TermSet = ListOrdSet (struct type elem = term val eq = eqTerm val gt = gtTerm end) val union = TermSet.union val make_set = TermSet.make_set val prLook = fn (termToString,print) => let val printTerm = print o termToString fun f nil = print " " | f (a :: b) = (printTerm a; print " "; f b) in f end structure NontermSet = ListOrdSet (struct type elem = nonterm val eq = eqNonterm val gt = gtNonterm end) val mkFuncs = fn {rules : rule list, nonterms : int, produces : nonterm -> rule list} => let (* nullable: create a function which tells if a nonterminal is nullable or not. Method: Keep an array of booleans. The nth entry is true if NT i is nullable. If is false if we don't know whether NT i is nullable. Keep a list of rules whose remaining rhs we must prove to be null. First, scan the list of rules and remove those rules whose rhs contains a terminal. These rules are not nullable. Now iterate through the rules that were left: (1) if there is no remaining rhs we have proved that the rule is nullable, mark the nonterminal for the rule as nullable (2) if the first element of the remaining rhs is nullable, place the rule back on the list with the rest of the rhs (3) if we don't know whether the nonterminal is nullable, place it back on the list (4) repeat until the list does not change. We have found all the possible nullable rules. *) val nullable = let fun add_rule (RULE { lhs, rhs, ... }, r) = let fun addNT (TERM _, _) = NONE | addNT (_, NONE) = NONE | addNT (NONTERM (NT i), SOME ntlist) = SOME (i :: ntlist) in case foldr addNT (SOME []) rhs of NONE => r | SOME ntlist => (lhs, ntlist) :: r end val items = List.foldr add_rule [] rules val nullable = array(nonterms,false) fun f ((NT i,nil),(l,_)) = (update(nullable,i,true); (l,true)) | f (a as (lhs,(h::t)),(l,change)) = (case (nullable sub h) of false => (a::l,change) | true => ((lhs,t)::l,true)) fun prove(l,true) = prove(List.foldr f (nil,false) l) | prove(_,false) = () in (prove(items,true); fn (NT i) => nullable sub i) end (* scanRhs : look at a list of symbols, scanning past nullable nonterminals, applying addSymbol to the symbols scanned *) fun scanRhs addSymbol = let fun f (nil,result) = result | f ((sym as NONTERM nt) :: rest,result) = if nullable nt then f (rest,addSymbol(sym,result)) else addSymbol(sym,result) | f ((sym as TERM _) :: _,result) = addSymbol(sym,result) in f end (* accumulate: look at the start of the right-hand-sides of rules, looking past nullable nonterminals, applying addObj to the visible symbols. *) fun accumulate(rules, empty, addObj) = List.foldr (fn (RULE {rhs,...},r) =>(scanRhs addObj) (rhs,r)) empty rules val nontermMemo = fn f => let val lookup = array(nonterms,nil) fun g i = if i=nonterms then () else (update(lookup,i,f (NT i)); g (i+1)) in (g 0; fn (NT j) => lookup sub j) end (* first1: the FIRST set of a nonterminal in the grammar. Only looks at other terminals, but it is clever enough to move past nullable nonterminals at the start of a production. *) fun first1 nt = accumulate(produces nt, TermSet.empty, fn (TERM t, set) => TermSet.insert (t,set) | (_, set) => set) val first1 = nontermMemo(first1) (* starters1: given a nonterminal "nt", return the set of nonterminals which can start its productions. Looks past nullables, but doesn't recurse *) fun starters1 nt = accumulate(produces nt, nil, fn (NONTERM nt, set) => NontermSet.insert(nt,set) | (_, set) => set) val starters1 = nontermMemo(starters1) (* first: maps a nonterminal to its first-set. Get all the starters of the nonterminal, get the first1 terminal set of each of these, union the whole lot together *) fun first nt = List.foldr (fn (a,r) => TermSet.union(r,first1 a)) [] (NontermSet.closure (NontermSet.singleton nt, starters1)) val first = nontermMemo(first) (* prefix: all possible terminals starting a symbol list *) fun prefix symbols = scanRhs (fn (TERM t,r) => TermSet.insert(t,r) | (NONTERM nt,r) => TermSet.union(first nt,r)) (symbols,nil) fun nullable_string ((TERM t) :: r) = false | nullable_string ((NONTERM nt) :: r) = (case (nullable nt) of true => nullable_string r | f => f) | nullable_string nil = true in {nullable = nullable, first = prefix} end end; mlton-20100608/mlyacc/src/mklrtable.sml0000644000076600000240000004336611404435642016327 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkMakeLrTable (structure IntGrammar : INTGRAMMAR structure LrTable : LR_TABLE sharing type LrTable.term = IntGrammar.Grammar.term sharing type LrTable.nonterm = IntGrammar.Grammar.nonterm ) : MAKE_LR_TABLE = struct open Array List infix 9 sub structure Core = mkCore(structure IntGrammar = IntGrammar) structure CoreUtils = mkCoreUtils(structure IntGrammar = IntGrammar structure Core = Core) structure Graph = mkGraph(structure IntGrammar = IntGrammar structure Core = Core structure CoreUtils = CoreUtils) structure Look = mkLook(structure IntGrammar = IntGrammar) structure Lalr = mkLalr(structure IntGrammar = IntGrammar structure Core = Core structure Graph = Graph structure Look = Look) structure LrTable = LrTable structure IntGrammar = IntGrammar structure Grammar = IntGrammar.Grammar structure GotoList = ListOrdSet (struct type elem = Grammar.nonterm * LrTable.state val eq = fn ((Grammar.NT a,_),(Grammar.NT b,_)) => a=b val gt = fn ((Grammar.NT a,_),(Grammar.NT b,_)) => a>b end) structure Errs : LR_ERRS = struct structure LrTable = LrTable datatype err = RR of LrTable.term * LrTable.state * int * int | SR of LrTable.term * LrTable.state * int | NOT_REDUCED of int | NS of LrTable.term * int | START of int val summary = fn l => let val numRR = ref 0 val numSR = ref 0 val numSTART = ref 0 val numNOT_REDUCED = ref 0 val numNS = ref 0 fun loop (h::t) = (case h of RR _ => numRR := !numRR+1 | SR _ => numSR := !numSR+1 | START _ => numSTART := !numSTART+1 | NOT_REDUCED _ => numNOT_REDUCED := !numNOT_REDUCED+1 | NS _ => numNS := !numNS+1; loop t) | loop nil = {rr = !numRR, sr = !numSR, start = !numSTART, not_reduced = !numNOT_REDUCED, nonshift = !numNS} in loop l end val printSummary = fn say => fn l => let val {rr,sr,start, not_reduced,nonshift} = summary l val say_plural = fn (i,s) => (say (Int.toString i); say " "; case i of 1 => (say s) | _ => (say s; say "s")) val say_error = fn (args as (i,s)) => case i of 0 => () | i => (say_plural args; say "\n") in say_error(rr,"reduce/reduce conflict"); say_error(sr,"shift/reduce conflict"); if nonshift<>0 then (say "non-shiftable terminal used on the rhs of "; say_plural(start,"rule"); say "\n") else (); if start<>0 then (say "start symbol used on the rhs of "; say_plural(start,"rule"); say "\n") else (); if not_reduced<>0 then (say_plural(not_reduced,"rule"); say " not reduced\n") else () end end open IntGrammar Grammar Errs LrTable Core (* rules for resolving conflicts: shift/reduce: If either the terminal or the rule has no precedence, a shift/reduce conflict is reported. A shift is chosen for the table. If both have precedences, the action with the higher precedence is chosen. If the precedences are equal, neither the shift nor the reduce is chosen. reduce/reduce: A reduce/reduce conflict is reported. The lowest numbered rule is chosen for reduction. *) (* method for filling tables - first compute the reductions called for in a state, then add the shifts for the state to this information. How to compute the reductions: A reduction initially is given as an item and a lookahead set calling for reduction by that item. The first reduction is mapped to a list of terminal * rule pairs. Each additional reduction is then merged into this list and reduce/reduce conflicts are resolved according to the rule given. Missed Errors: This method misses some reduce/reduce conflicts that exist because some reductions are removed from the list before conflicting reductions can be compared against them. All reduce/reduce conflicts, however, can be generated given a list of the reduce/reduce conflicts generated by this method. This can be done by taking the transitive closure of the relation given by the list. If reduce/reduce (a,b) and reduce/reduce (b,c) are true, then reduce/reduce (a,c) is true. The relation is symmetric and transitive. Adding shifts: Finally scan the list merging in shifts and resolving conflicts according to the rule given. Missed Shift/Reduce Errors: Some errors may be missed by this method because some reductions were removed as the result of reduce/reduce conflicts. For a shift/reduce conflict of term a, reduction by rule n, shift/reduce conficts exist for all rules y such that reduce/reduce (x,y) or reduce/reduce (y,x) is true. *) fun unREDUCE (REDUCE num) = num | unREDUCE _ = raise Fail "bug: unexpected action (expected REDUCE)" val mergeReduces = let val merge = fn state => let fun f (j as (pair1 as (T t1,action1)) :: r1, k as (pair2 as (T t2,action2)) :: r2,result,errs) = if t1 < t2 then f(r1,k,pair1::result,errs) else if t1 > t2 then f(j,r2,pair2::result,errs) else let val num1 = unREDUCE action1 val num2 = unREDUCE action2 val errs = RR(T t1,state,num1,num2) :: errs val action = if num1 < num2 then pair1 else pair2 in f(r1,r2,action::result,errs) end | f (nil,nil,result,errs) = (rev result,errs) | f (pair1::r,nil,result,errs) = f(r,nil,pair1::result,errs) | f (nil,pair2 :: r,result,errs) = f(nil,r,pair2::result,errs) in f end in fn state => fn ((ITEM {rule=RULE {rulenum,...},...}, lookahead), (reduces,errs)) => let val action = REDUCE rulenum val actions = map (fn a=>(a,action)) lookahead in case reduces of nil => (actions,errs) | _ => merge state (reduces,actions,nil,errs) end end val computeActions = fn (rules,precedence,graph,defaultReductions) => let val rulePrec = let val precData = array(length rules,NONE : int option) in app (fn RULE {rulenum=r,precedence=p,...} => update(precData,r,p)) rules; fn i => precData sub i end fun mergeShifts(state,shifts,nil) = (shifts,nil) | mergeShifts(state,nil,reduces) = (reduces,nil) | mergeShifts(state,shifts,reduces) = let fun f(shifts as (pair1 as (T t1,_)) :: r1, reduces as (pair2 as (T t2,action)) :: r2, result,errs) = if t1 < t2 then f(r1,reduces,pair1 :: result,errs) else if t1 > t2 then f(shifts,r2,pair2 :: result,errs) else let val rulenum = unREDUCE action val (term1,_) = pair1 in case (precedence term1,rulePrec rulenum) of (SOME i,SOME j) => if i>j then f(r1,r2,pair1 :: result,errs) else if j>i then f(r1,r2,pair2 :: result,errs) else f(r1,r2,(T t1, ERROR)::result,errs) | (_,_) => f(r1,r2,pair1 :: result, SR (term1,state,rulenum)::errs) end | f (nil,nil,result,errs) = (rev result,errs) | f (nil,h::t,result,errs) = f (nil,t,h::result,errs) | f (h::t,nil,result,errs) = f (t,nil,h::result,errs) in f(shifts,reduces,nil,nil) end fun mapCore ({edge=symbol,to=CORE (_,state)}::r,shifts,gotos) = (case symbol of (TERM t) => mapCore (r,(t,SHIFT(STATE state))::shifts,gotos) | (NONTERM nt) => mapCore(r,shifts,(nt,STATE state)::gotos) ) | mapCore (nil,shifts,gotos) = (rev shifts,rev gotos) fun pruneError ((_,ERROR)::rest) = pruneError rest | pruneError (a::rest) = a :: pruneError rest | pruneError nil = nil in fn (Lalr.LCORE (reduceItems,state),c as CORE (shiftItems,state')) => if DEBUG andalso (state <> state') then let exception MkTable in raise MkTable end else let val (shifts,gotos) = mapCore (Graph.edges(c,graph),nil,nil) val tableState = STATE state in case reduceItems of nil => ((shifts,ERROR),gotos,nil) | h :: nil => let val (ITEM {rule=RULE {rulenum,...},...}, l) = h val (reduces,_) = mergeReduces tableState (h,(nil,nil)) val (actions,errs) = mergeShifts(tableState, shifts,reduces) val actions' = pruneError actions val (actions,default) = let fun hasReduce (nil,actions) = (rev actions,REDUCE rulenum) | hasReduce ((a as (_,SHIFT _)) :: r,actions) = hasReduce(r,a::actions) | hasReduce (_ :: r,actions) = hasReduce(r,actions) fun loop (nil,actions) = (rev actions,ERROR) | loop ((a as (_,SHIFT _)) :: r,actions) = loop(r,a::actions) | loop ((a as (_,REDUCE _)) :: r,actions) = hasReduce(r,actions) | loop (_ :: r,actions) = loop(r,actions) in if defaultReductions andalso length actions = length actions' then loop(actions,nil) else (actions',ERROR) end in ((actions,default), gotos,errs) end | l => let val (reduces,errs1) = List.foldr (mergeReduces tableState) (nil,nil) l val (actions,errs2) = mergeShifts(tableState,shifts,reduces) in ((pruneError actions,ERROR),gotos,errs1@errs2) end end end val mkTable = fn (grammar as GRAMMAR{rules,terms,nonterms,start, precedence,termToString,noshift, nontermToString,eop},defaultReductions) => let val symbolToString = fn (TERM t) => termToString t | (NONTERM nt) => nontermToString nt val {rules,graph,produces,epsProds,...} = Graph.mkGraph grammar val {nullable,first} = Look.mkFuncs{rules=rules,produces=produces,nonterms=nonterms} val lcores = Lalr.addLookahead {graph=graph, nullable=nullable, produces=produces, eop=eop, nonterms=nonterms, first=first, rules=rules, epsProds=epsProds, print=(fn s=>TextIO.output(TextIO.stdOut,s)), termToString = termToString, nontermToString = nontermToString} fun zip (h::t,h'::t') = (h,h') :: zip(t,t') | zip (nil,nil) = nil | zip _ = let exception MkTable in raise MkTable end fun unzip l = let fun f ((a,b,c)::r,j,k,l) = f(r,a::j,b::k,c::l) | f (nil,j,k,l) = (rev j,rev k,rev l) in f(l,nil,nil,nil) end val (actions,gotos,errs) = let val doState = computeActions(rules,precedence,graph, defaultReductions) in unzip (map doState (zip(lcores,Graph.nodes graph))) end (* add goto from state 0 to a new state. The new state has accept actions for all of the end-of-parse symbols *) val (actions,gotos,errs) = case gotos of nil => (actions,gotos,errs) | h :: t => let val newStateActions = (map (fn t => (t,ACCEPT)) (Look.make_set eop),ERROR) val state0Goto = GotoList.insert((start,STATE (length actions)),h) in (actions @ [newStateActions], state0Goto :: (t @ [nil]), errs @ [nil]) end val startErrs = List.foldr (fn (RULE {rhs,rulenum,...},r) => if (exists (fn NONTERM a => a=start | _ => false) rhs) then START rulenum :: r else r) [] rules val nonshiftErrs = List.foldr (fn (RULE {rhs,rulenum,...},r) => (List.foldr (fn (nonshift,r) => if (exists (fn TERM a => a=nonshift | _ => false) rhs) then NS(nonshift,rulenum) :: r else r) r noshift) ) [] rules val notReduced = let val ruleReduced = array(length rules,false) val test = fn REDUCE i => update(ruleReduced,i,true) | _ => () val _ = app (fn (actions,default) => (app (fn (_,r) => test r) actions; test default) ) actions; fun scan (i,r) = if i >= 0 then scan(i-1, if ruleReduced sub i then r else NOT_REDUCED i :: r) else r in scan(Array.length ruleReduced-1,nil) end handle Subscript => (if DEBUG then print "rules not numbered correctly!" else (); nil) val numstates = length actions val allErrs = startErrs @ notReduced @ nonshiftErrs @ (List.concat errs) fun convert_to_pairlist(nil : ('a * 'b) list): ('a,'b) pairlist = EMPTY | convert_to_pairlist ((a,b) :: r) = PAIR(a,b,convert_to_pairlist r) in (mkLrTable {actions=Array.fromList(map (fn (a,b) => (convert_to_pairlist a,b)) actions), gotos=Array.fromList (map convert_to_pairlist gotos), numRules=length rules,numStates=length actions, initialState=STATE 0}, let val errArray = Array.fromList errs in fn (STATE state) => errArray sub state end, fn print => let val printCore = prCore(symbolToString,nontermToString,print) val core = Graph.core graph in fn STATE state => printCore (if state=(numstates-1) then Core.CORE (nil,state) else (core state)) end, allErrs) end end; mlton-20100608/mlyacc/src/mkprstruct.sml0000644000076600000240000001654311404435642016565 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkPrintStruct(structure LrTable : LR_TABLE structure ShrinkLrTable : SHRINK_LR_TABLE sharing LrTable = ShrinkLrTable.LrTable):PRINT_STRUCT = struct open Array List infix 9 sub structure LrTable = LrTable open ShrinkLrTable LrTable (* lineLength = approximately the largest number of characters to allow on a line when printing out an encode string *) val lineLength = 72 (* maxLength = length of a table entry. All table entries are encoded using two 16-bit integers, one for the terminal number and the other for the entry. Each integer is printed as two characters (low byte, high byte), using the ML ascii escape sequence. We need 4 characters for each escape sequence and 16 characters for each entry *) val maxLength = 16 (* number of entries we can fit on a row *) val numEntries = lineLength div maxLength (* convert integer between 0 and 255 to the three character ascii decimal escape sequence for it *) val chr = let val lookup = Array.array(256,"\000") val intToString = fn i => if i>=100 then "\\" ^ (Int.toString i) else if i>=10 then "\\0" ^ (Int.toString i) else "\\00" ^ (Int.toString i) fun loop n = if n=256 then () else (Array.update(lookup,n,intToString n); loop (n+1)) in loop 0; fn i => lookup sub i end val makeStruct = fn {table,name,print,verbose} => let val states = numStates table val rules = numRules table fun printPairList (prEntry : 'a * 'b -> unit) l = let fun f (EMPTY,_) = () | f (PAIR(a,b,r),count) = if count >= numEntries then (print "\\\n\\"; prEntry(a,b); f(r,1)) else (prEntry(a,b); f(r,(count+1))) in f(l,0) end val printList : ('a -> unit) -> 'a list -> unit = fn prEntry => fn l => let fun f (nil,_) = () | f (a :: r,count) = if count >= numEntries then (print "\\\n\\"; prEntry a; f(r,1)) else (prEntry a; f(r,count+1)) in f(l,0) end val prEnd = fn _ => print "\\000\\000\\\n\\" fun printPairRow prEntry = let val printEntries = printPairList prEntry in fn l => (printEntries l; prEnd()) end fun printPairRowWithDefault (prEntry,prDefault) = let val f = printPairRow prEntry in fn (l,default) => (prDefault default; f l) end fun printTable (printRow,count) = (print "\"\\\n\\"; let fun f i = if i=count then () else (printRow i; f (i+1)) in f 0 end; print"\"\n") val printChar = print o chr (* print an integer between 0 and 2^16-1 as a 2-byte character, with the low byte first *) val printInt = fn i => (printChar (i mod 256); printChar (i div 256)) (* encode actions as integers: ACCEPT => 0 ERROR => 1 SHIFT i => 2 + i REDUCE rulenum => numstates+2+rulenum *) val printAction = fn (REDUCE rulenum) => printInt (rulenum+states+2) | (SHIFT (STATE i)) => printInt (i+2) | ACCEPT => printInt 0 | ERROR => printInt 1 val printTermAction = fn (T t,action) => (printInt (t+1); printAction action) val printGoto = fn (NT n,STATE s) => (printInt (n+1); printInt s) val ((rowCount,rowNumbers,actionRows),entries)= shrinkActionList(table,verbose) val getActionRow = let val a = Array.fromList actionRows in fn i => a sub i end val printGotoRow : int -> unit = let val f = printPairRow printGoto val g = describeGoto table in fn i => f (g (STATE i)) end val printActionRow = let val f = printPairRowWithDefault(printTermAction,printAction) in fn i => f (getActionRow i) end in print "val "; print name; print "="; print "let val actionRows =\n"; printTable(printActionRow,rowCount); print "val actionRowNumbers =\n\""; printList (fn i => printInt i) rowNumbers; print "\"\n"; print "val gotoT =\n"; printTable(printGotoRow,states); print "val numstates = "; print (Int.toString states); print "\nval numrules = "; print (Int.toString rules); print "\n\ \val s = ref \"\" and index = ref 0\n\ \val string_to_int = fn () => \n\ \let val i = !index\n\ \in index := i+2; Char.ord(String.sub(!s,i)) + Char.ord(String.sub(!s,i+1)) * 256\n\ \end\n\ \val string_to_list = fn s' =>\n\ \ let val len = String.size s'\n\ \ fun f () =\n\ \ if !index < len then string_to_int() :: f()\n\ \ else nil\n\ \ in index := 0; s := s'; f ()\n\ \ end\n\ \val string_to_pairlist = fn (conv_key,conv_entry) =>\n\ \ let fun f () =\n\ \ case string_to_int()\n\ \ of 0 => EMPTY\n\ \ | n => PAIR(conv_key (n-1),conv_entry (string_to_int()),f())\n\ \ in f\n\ \ end\n\ \val string_to_pairlist_default = fn (conv_key,conv_entry) =>\n\ \ let val conv_row = string_to_pairlist(conv_key,conv_entry)\n\ \ in fn () =>\n\ \ let val default = conv_entry(string_to_int())\n\ \ val row = conv_row()\n\ \ in (row,default)\n\ \ end\n\ \ end\n\ \val string_to_table = fn (convert_row,s') =>\n\ \ let val len = String.size s'\n\ \ fun f ()=\n\ \ if !index < len then convert_row() :: f()\n\ \ else nil\n\ \ in (s := s'; index := 0; f ())\n\ \ end\n\ \local\n\ \ val memo = Array.array(numstates+numrules,ERROR)\n\ \ val _ =let fun g i=(Array.update(memo,i,REDUCE(i-numstates)); g(i+1))\n\ \ fun f i =\n\ \ if i=numstates then g i\n\ \ else (Array.update(memo,i,SHIFT (STATE i)); f (i+1))\n\ \ in f 0 handle Subscript => ()\n\ \ end\n\ \in\n\ \val entry_to_action = fn 0 => ACCEPT | 1 => ERROR | j => Array.sub(memo,(j-2))\n\ \end\n\ \val gotoT=Array.fromList(string_to_table(string_to_pairlist(NT,STATE),gotoT))\n\ \val actionRows=string_to_table(string_to_pairlist_default(T,entry_to_action),actionRows)\n\ \val actionRowNumbers = string_to_list actionRowNumbers\n\ \val actionT = let val actionRowLookUp=\n\ \let val a=Array.fromList(actionRows) in fn i=>Array.sub(a,i) end\n\ \in Array.fromList(map actionRowLookUp actionRowNumbers)\n\ \end\n\ \in LrTable.mkLrTable {actions=actionT,gotos=gotoT,numRules=numrules,\n\ \numStates=numstates,initialState=STATE "; print (Int.toString ((fn (STATE i) => i) (initialState table))); print "}\nend\n"; entries end end; mlton-20100608/mlyacc/src/parse.sml0000644000076600000240000000240411404435642015450 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor ParseGenParserFun(structure Header : HEADER structure Parser : ARG_PARSER where type pos = Header.pos sharing type Parser.result = Header.parseResult sharing type Parser.arg = Header.inputSource = Parser.lexarg ) : PARSE_GEN_PARSER = struct structure Header = Header val parse = fn file => let val in_str = TextIO.openIn file val source = Header.newSource(file,in_str,TextIO.stdOut) val error = fn (s : string,p:Header.pos,_) => Header.error source p s val stream = Parser.makeLexer (fn i => (TextIO.inputN(in_str,i))) source val (result,_) = (#line Header.pos := 1; #start Header.pos := 0; Header.text := nil; Parser.parse(15,stream,error,source)) in (TextIO.closeIn in_str; (result,source)) end end; mlton-20100608/mlyacc/src/README0000644000076600000240000000016111404435642014477 0ustar mtfstaffThese are the sources for the parser-generator part of ML-Yacc. The file FILES explains what each file contains. mlton-20100608/mlyacc/src/shrink.sml0000644000076600000240000002002411404435642015632 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1991 Andrew W. Appel, David R. Tarditi *) signature SORT_ARG = sig type entry val gt : entry * entry -> bool end signature SORT = sig type entry val sort : entry list -> entry list end signature EQUIV_ARG = sig type entry val gt : entry * entry -> bool val eq : entry * entry -> bool end signature EQUIV = sig type entry (* equivalences: take a list of entries and divides them into equivalence classes numbered 0 to n-1. It returns a triple consisting of: * the number of equivalence classes * a list which maps each original entry to an equivalence class. The nth entry in this list gives the equivalence class for the nth entry in the original entry list. * a list which maps equivalence classes to some representative element. The nth entry in this list is an element from the nth equivalence class *) val equivalences : entry list -> (int * int list * entry list) end (* An O(n lg n) merge sort routine *) functor MergeSortFun(A : SORT_ARG) : SORT = struct type entry = A.entry (* sort: an O(n lg n) merge sort routine. We create a list of lists and then merge these lists in passes until only one list is left.*) fun sort nil = nil | sort l = let (* merge: merge two lists *) fun merge (l as a::at,r as b::bt) = if A.gt(a,b) then b :: merge(l,bt) else a :: merge(at,r) | merge (l,nil) = l | merge (nil,r) = r (* scan: merge pairs of lists on a list of lists. Reduces the number of lists by about 1/2 *) fun scan (a :: b :: rest) = merge(a,b) :: scan rest | scan l = l (* loop: calls scan on a list of lists until only one list is left. It terminates only if the list of lists is nonempty. (The pattern match for sort ensures this.) *) fun loop (a :: nil) = a | loop l = loop (scan l) in loop (map (fn a => [a]) l) end end (* an O(n lg n) routine for placing items in equivalence classes *) functor EquivFun(A : EQUIV_ARG) : EQUIV = struct open Array List infix 9 sub (* Our algorithm for finding equivalence class is simple. The basic idea is to sort the entries and place duplicates entries in the same equivalence class. Let the original entry list be E. We map E to a list of a pairs consisting of the entry and its position in E, where the positions are numbered 0 to n-1. Call this list of pairs EP. We then sort EP on the original entries. The second elements in the pairs now specify a permutation that will return us to EP. We then scan the sorted list to create a list R of representative entries, a list P of integers which permutes the sorted list back to the original list and a list SE of integers which gives the equivalence class for the nth entry in the sorted list . We then return the length of R, R, and the list that results from permuting SE by P. *) type entry = A.entry val gt = fn ((a,_),(b,_)) => A.gt(a,b) structure Sort = MergeSortFun(type entry = A.entry * int val gt = gt) val assignIndex = fn l => let fun loop (index,nil) = nil | loop (index,h :: t) = (h,index) :: loop(index+1,t) in loop (0,l) end local fun loop ((e,_) :: t, prev, class, R , SE) = if A.eq(e,prev) then loop(t,e,class,R, class :: SE) else loop(t,e,class+1,e :: R, (class + 1) :: SE) | loop (nil,_,_,R,SE) = (rev R, rev SE) in val createEquivalences = fn nil => (nil,nil) | (e,_) :: t => loop(t, e, 0, [e],[0]) end val inversePermute = fn permutation => fn nil => nil | l as h :: _ => let val result = array(length l,h) fun loop (elem :: r, dest :: s) = (update(result,dest,elem); loop(r,s)) | loop _ = () fun listofarray i = if i < Array.length result then (result sub i) :: listofarray (i+1) else nil in loop (l,permutation); listofarray 0 end fun makePermutation x = map (fn (_,b) => b) x val equivalences = fn l => let val EP = assignIndex l val sorted = Sort.sort EP val P = makePermutation sorted val (R, SE) = createEquivalences sorted in (length R, inversePermute P SE, R) end end functor ShrinkLrTableFun(structure LrTable : LR_TABLE) : SHRINK_LR_TABLE = struct structure LrTable = LrTable open LrTable val gtAction = fn (a,b) => case a of SHIFT (STATE s) => (case b of SHIFT (STATE s') => s>s' | _ => true) | REDUCE i => (case b of SHIFT _ => false | REDUCE i' => i>i' | _ => true) | ACCEPT => (case b of ERROR => true | _ => false) | ERROR => false structure ActionEntryList = struct type entry = (term, action) pairlist * action local fun eqlist (EMPTY, EMPTY) = true | eqlist (PAIR (T t,d,r),PAIR(T t',d',r')) = t=t' andalso d=d' andalso eqlist(r,r') | eqlist _ = false fun gtlist (PAIR _,EMPTY) = true | gtlist (PAIR(T t,d,r),PAIR(T t',d',r')) = t>t' orelse (t=t' andalso (gtAction(d,d') orelse (d=d' andalso gtlist(r,r')))) | gtlist _ = false in fun eq ((l,a): entry, (l',a'): entry) = a = a' andalso eqlist (l,l') fun gt ((l,a): entry, (l',a'): entry) = gtAction(a,a') orelse (a=a' andalso gtlist(l,l')) end end (* structure GotoEntryList = struct type entry = (nonterm,state) pairlist val rec eq = fn (EMPTY,EMPTY) => true | (PAIR (t,d,r),PAIR(t',d',r')) => t=t' andalso d=d' andalso eq(r,r') | _ => false val rec gt = fn (PAIR _,EMPTY) => true | (PAIR(NT t,STATE d,r),PAIR(NT t',STATE d',r')) => t>t' orelse (t=t' andalso (d>d' orelse (d=d' andalso gt(r,r')))) | _ => false end *) structure EquivActionList = EquivFun(ActionEntryList) val states = fn max => let fun f i=if i int = fn l => let fun g(EMPTY,len) = len | g(PAIR(_,_,r),len) = g(r,len+1) in g(l,0) end val size : (('a,'b) pairlist * 'c) list -> int = fn l => let val c = ref 0 in (app (fn (row,_) => c := !c + length row) l; !c) end val shrinkActionList = fn (table,verbose) => case EquivActionList.equivalences (map (describeActions table) (states (numStates table))) of result as (_,_,l) => (result,if verbose then size l else 0) end; mlton-20100608/mlyacc/src/sigs.sml0000644000076600000240000003274011404435642015311 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989, 1991 Andrew W. Appel, David R. Tarditi *) signature HEADER = sig type pos = {line : int, col : int} val pos : {line : int ref, start : int ref} val text : string list ref type inputSource val newSource : string * TextIO.instream * TextIO.outstream -> inputSource val error : inputSource -> pos -> string -> unit val warn : inputSource -> pos -> string -> unit val errorOccurred : inputSource -> unit -> bool datatype symbol = SYMBOL of string * pos val symbolName : symbol -> string val symbolPos : symbol -> pos val symbolMake : string * pos -> symbol type ty val tyName : ty -> string val tyMake : string -> ty (* associativities: each kind of associativity is assigned a unique integer *) datatype prec = LEFT | RIGHT | NONASSOC datatype control = NODEFAULT | VERBOSE | PARSER_NAME of symbol | FUNCTOR of string | START_SYM of symbol | NSHIFT of symbol list | POS of string | PURE | PARSE_ARG of string * string | TOKEN_SIG_INFO of string datatype rule = RULE of {lhs : symbol, rhs : symbol list, code : {text : string, pos : pos}, prec : symbol option} datatype declData = DECL of {eop : symbol list, keyword : symbol list, nonterm : (symbol * ty option) list option, prec : (prec * (symbol list)) list, change: (symbol list * symbol list) list, term : (symbol * ty option) list option, control : control list, value : (symbol * string) list} val join_decls : declData * declData * inputSource * pos -> declData type parseResult val getResult : parseResult -> string * declData * rule list end; signature PARSE_GEN_PARSER = sig structure Header : HEADER val parse : string -> Header.parseResult * Header.inputSource end; signature PARSE_GEN = sig val parseGen : string -> unit end; signature GRAMMAR = sig datatype term = T of int datatype nonterm = NT of int datatype symbol = TERM of term | NONTERM of nonterm (* grammar: terminals should be numbered from 0 to terms-1, nonterminals should be numbered from 0 to nonterms-1, rules should be numbered between 0 and (length rules) - 1, higher precedence binds tighter, start nonterminal should not occur on the rhs of any rule *) datatype grammar = GRAMMAR of {rules: {lhs : nonterm, rhs : symbol list, precedence : int option, rulenum : int } list, terms: int, nonterms: int, start : nonterm, eop : term list, noshift : term list, precedence : term -> int option, termToString : term -> string, nontermToString : nonterm -> string} end (* signature for internal version of grammar *) signature INTGRAMMAR = sig structure Grammar : GRAMMAR structure SymbolAssoc : TABLE structure NontermAssoc : TABLE sharing type SymbolAssoc.key = Grammar.symbol sharing type NontermAssoc.key = Grammar.nonterm datatype rule = RULE of {lhs : Grammar.nonterm, rhs : Grammar.symbol list, (* internal number of rule - convenient for producing LR graph *) num : int, rulenum : int, precedence : int option} val gtTerm : Grammar.term * Grammar.term -> bool val eqTerm : Grammar.term * Grammar.term -> bool val gtNonterm : Grammar.nonterm * Grammar.nonterm -> bool val eqNonterm : Grammar.nonterm * Grammar.nonterm -> bool val gtSymbol : Grammar.symbol * Grammar.symbol -> bool val eqSymbol : Grammar.symbol * Grammar.symbol -> bool (* Debugging information will be generated only if DEBUG is true. *) val DEBUG : bool val prRule : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> 'b) -> rule -> unit val prGrammar : (Grammar.symbol -> string)*(Grammar.nonterm -> string) * (string -> unit) -> Grammar.grammar -> unit end signature CORE = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR sharing Grammar = IntGrammar.Grammar datatype item = ITEM of { rule : IntGrammar.rule, dot : int, (* rhsAfter: The portion of the rhs of a rule that lies after the dot *) rhsAfter: Grammar.symbol list } (* eqItem and gtItem compare items *) val eqItem : item * item -> bool val gtItem : item * item -> bool (* functions for maintaining ordered item lists *) val insert : item * item list -> item list val union : item list * item list -> item list (* core: a set of items. It is represented by an ordered list of items. The list is in ascending order The rule numbers and the positions of the dots are used to order the items. *) datatype core = CORE of item list * int (* state # *) (* gtCore and eqCore compare the lists of items *) val gtCore : core * core -> bool val eqCore : core * core -> bool (* functions for debugging *) val prItem : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> unit) -> item -> unit val prCore : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (string -> unit) -> core -> unit end signature CORE_UTILS = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE sharing Grammar = IntGrammar.Grammar = Core.Grammar sharing IntGrammar = Core.IntGrammar (* mkFuncs: create functions for the set of productions derived from a nonterminal, the cores that result from shift/gotos from a core, and return a list of rules *) val mkFuncs : Grammar.grammar -> { produces : Grammar.nonterm -> IntGrammar.rule list, (* shifts: take a core and compute all the cores that result from shifts/gotos on symbols *) shifts : Core.core -> (Grammar.symbol*Core.item list) list, rules: IntGrammar.rule list, (* epsProds: take a core compute epsilon productions for it *) epsProds : Core.core -> IntGrammar.rule list} end signature LRGRAPH = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE sharing Grammar = IntGrammar.Grammar = Core.Grammar sharing IntGrammar = Core.IntGrammar type graph val edges : Core.core * graph -> {edge:Grammar.symbol,to:Core.core} list val nodes : graph -> Core.core list val shift : graph -> int * Grammar.symbol -> int (* int = state # *) val core : graph -> int -> Core.core (* get core for a state *) (* mkGraph: compute the LR(0) sets of items *) val mkGraph : Grammar.grammar -> {graph : graph, produces : Grammar.nonterm -> IntGrammar.rule list, rules : IntGrammar.rule list, epsProds: Core.core -> IntGrammar.rule list} val prGraph: (Grammar.symbol -> string)*(Grammar.nonterm -> string) * (string -> unit) -> graph -> unit end signature LOOK = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR sharing Grammar = IntGrammar.Grammar val union : Grammar.term list * Grammar.term list -> Grammar.term list val make_set : Grammar.term list -> Grammar.term list val mkFuncs : {rules : IntGrammar.rule list, nonterms : int, produces : Grammar.nonterm -> IntGrammar.rule list} -> {nullable: Grammar.nonterm -> bool, first : Grammar.symbol list -> Grammar.term list} val prLook : (Grammar.term -> string) * (string -> unit) -> Grammar.term list -> unit end signature LALR_GRAPH = sig structure Grammar : GRAMMAR structure IntGrammar : INTGRAMMAR structure Core : CORE structure Graph : LRGRAPH sharing Grammar = IntGrammar.Grammar = Core.Grammar = Graph.Grammar sharing IntGrammar = Core.IntGrammar = Graph.IntGrammar sharing Core = Graph.Core datatype lcore = LCORE of (Core.item * Grammar.term list) list * int val addLookahead : {graph : Graph.graph, first : Grammar.symbol list -> Grammar.term list, eop : Grammar.term list, nonterms : int, nullable: Grammar.nonterm -> bool, produces : Grammar.nonterm -> IntGrammar.rule list, rules : IntGrammar.rule list, epsProds : Core.core -> IntGrammar.rule list, print : string -> unit, (* for debugging *) termToString : Grammar.term -> string, nontermToString : Grammar.nonterm -> string} -> lcore list val prLcore : (Grammar.symbol -> string) * (Grammar.nonterm -> string) * (Grammar.term -> string) * (string -> unit) -> lcore -> unit end (* LR_ERRS: errors found while constructing an LR table *) signature LR_ERRS = sig structure LrTable : LR_TABLE (* RR = reduce/reduce, SR = shift/reduce NS: non-shiftable terminal found on the rhs of a rule NOT_REDUCED n: rule number n was not reduced START n : start symbol found on the rhs of rule n *) datatype err = RR of LrTable.term * LrTable.state * int * int | SR of LrTable.term * LrTable.state * int | NS of LrTable.term * int | NOT_REDUCED of int | START of int val summary : err list -> {rr : int, sr: int, not_reduced : int, start : int,nonshift : int} val printSummary : (string -> unit) -> err list -> unit end (* PRINT_STRUCT: prints a structure which includes a value 'table' and a structure Table whose signature matches LR_TABLE. The table in the printed structure will contain the same information as the one passed to printStruct, although the representation may be different. It returns the number of entries left in the table after compaction.*) signature PRINT_STRUCT = sig structure LrTable : LR_TABLE val makeStruct : {table : LrTable.table, name : string, print: string -> unit, verbose : bool } -> int end (* VERBOSE: signature for a structure which takes a table and creates a verbose description of it *) signature VERBOSE = sig structure Errs : LR_ERRS val printVerbose : {table : Errs.LrTable.table, entries : int, termToString : Errs.LrTable.term -> string, nontermToString : Errs.LrTable.nonterm -> string, stateErrs : Errs.LrTable.state -> Errs.err list, errs : Errs.err list, print: string -> unit, printCores : (string -> unit) -> Errs.LrTable.state -> unit, printRule : (string -> unit) -> int -> unit} -> unit end (* MAKE_LR_TABLE: signature for a structure which includes a structure matching the signature LR_TABLE and a function which maps grammars to tables *) signature MAKE_LR_TABLE = sig structure Grammar : GRAMMAR structure Errs : LR_ERRS structure LrTable : LR_TABLE sharing Errs.LrTable = LrTable sharing type LrTable.term = Grammar.term sharing type LrTable.nonterm = Grammar.nonterm (* boolean value determines whether default reductions will be used. If it is true, reductions will be used. *) val mkTable : Grammar.grammar * bool -> LrTable.table * (LrTable.state -> Errs.err list) * (* errors in a state *) ((string -> unit) -> LrTable.state -> unit) * Errs.err list (* list of all errors *) end; (* SHRINK_LR_TABLE: finds unique action entry rows in the action table for the LR parser *) signature SHRINK_LR_TABLE = sig (* Takes an action table represented as a list of action rows. It returns the number of unique rows left in the action table, a list of integers which maps each original row to a unique row, and a list of unique rows *) structure LrTable : LR_TABLE val shrinkActionList : LrTable.table * bool -> (int * int list * ((LrTable.term,LrTable.action) LrTable.pairlist * LrTable.action) list) * int end mlton-20100608/mlyacc/src/utils.sig0000644000076600000240000000343411404435642015471 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) signature ORDSET = sig type set type elem exception Select_arb val app : (elem -> unit) -> set -> unit and card: set -> int and closure: set * (elem -> set) -> set and difference: set * set -> set and elem_eq: (elem * elem -> bool) and elem_gt : (elem * elem -> bool) and empty: set and exists: (elem * set) -> bool and find : (elem * set) -> elem option and fold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b and insert: (elem * set) -> set and is_empty: set -> bool and make_list: set -> elem list and make_set: (elem list -> set) and partition: (elem -> bool) -> (set -> set * set) and remove: (elem * set) -> set and revfold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b and select_arb: set -> elem and set_eq: (set * set) -> bool and set_gt: (set * set) -> bool and singleton: (elem -> set) and union: set * set -> set end signature TABLE = sig type 'a table type key val size : 'a table -> int val empty: 'a table val exists: (key * 'a table) -> bool val find : (key * 'a table) -> 'a option val insert: ((key * 'a) * 'a table) -> 'a table val make_table : (key * 'a ) list -> 'a table val make_list : 'a table -> (key * 'a) list val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b end signature HASH = sig type table type elem val size : table -> int val add : elem * table -> table val find : elem * table -> int option val exists : elem * table -> bool val empty : table end; mlton-20100608/mlyacc/src/utils.sml0000644000076600000240000004077611404435642015514 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* Implementation of ordered sets using ordered lists and red-black trees. The code for red-black trees was originally written by Norris Boyd, which was modified for use here. *) (* ordered sets implemented using ordered lists. Upper bound running times for functions implemented here: app = O(n) card = O(n) closure = O(n^2) difference = O(n+m), where n,m = the size of the two sets used here. empty = O(1) exists = O(n) find = O(n) fold = O(n) insert = O(n) is_empty = O(1) make_list = O(1) make_set = O(n^2) partition = O(n) remove = O(n) revfold = O(n) select_arb = O(1) set_eq = O(n), where n = the cardinality of the smaller set set_gt = O(n), ditto singleton = O(1) union = O(n+m) *) functor ListOrdSet(B : sig type elem val gt : elem * elem -> bool val eq : elem * elem -> bool end ) : ORDSET = struct type elem = B.elem val elem_gt = B.gt val elem_eq = B.eq type set = elem list exception Select_arb val empty = nil val insert = fn (key,s) => let fun f (l as (h::t)) = if elem_gt(key,h) then h::(f t) else if elem_eq(key,h) then key::t else key::l | f nil = [key] in f s end val select_arb = fn nil => raise Select_arb | a::b => a val exists = fn (key,s) => let fun f (h::t) = if elem_gt(key,h) then f t else elem_eq(h,key) | f nil = false in f s end val find = fn (key,s) => let fun f (h::t) = if elem_gt(key,h) then f t else if elem_eq(h,key) then SOME h else NONE | f nil = NONE in f s end fun revfold f lst init = List.foldl f init lst fun fold f lst init = List.foldr f init lst val app = List.app fun set_eq(h::t,h'::t') = (case elem_eq(h,h') of true => set_eq(t,t') | a => a) | set_eq(nil,nil) = true | set_eq _ = false fun set_gt(h::t,h'::t') = (case elem_gt(h,h') of false => (case (elem_eq(h,h')) of true => set_gt(t,t') | a => a) | a => a) | set_gt(_::_,nil) = true | set_gt _ = false fun union(a as (h::t),b as (h'::t')) = if elem_gt(h',h) then h::union(t,b) else if elem_eq(h,h') then h::union(t,t') else h'::union(a,t') | union(nil,s) = s | union(s,nil) = s val make_list = fn s => s val is_empty = fn nil => true | _ => false val make_set = fn l => List.foldr insert [] l val partition = fn f => fn s => fold (fn (e,(yes,no)) => if (f e) then (e::yes,no) else (e::no,yes)) s (nil,nil) val remove = fn (e,s) => let fun f (l as (h::t)) = if elem_gt(h,e) then l else if elem_eq(h,e) then t else h::(f t) | f nil = nil in f s end (* difference: X-Y *) fun difference (nil,_) = nil | difference (r,nil) = r | difference (a as (h::t),b as (h'::t')) = if elem_gt (h',h) then h::difference(t,b) else if elem_eq(h',h) then difference(t,t') else difference(a,t') fun singleton X = [X] fun card(S) = fold (fn (a,count) => count+1) S 0 local fun closure'(from, f, result) = if is_empty from then result else let val (more,result) = fold (fn (a,(more',result')) => let val more = f a val new = difference(more,result) in (union(more',new),union(result',new)) end) from (empty,result) in closure'(more,f,result) end in fun closure(start, f) = closure'(start, f, start) end end (* ordered set implemented using red-black trees: Upper bound running time of the functions below: app: O(n) card: O(n) closure: O(n^2 ln n) difference: O(n ln n) empty: O(1) exists: O(ln n) find: O(ln n) fold: O(n) insert: O(ln n) is_empty: O(1) make_list: O(n) make_set: O(n ln n) partition: O(n ln n) remove: O(n ln n) revfold: O(n) select_arb: O(1) set_eq: O(n) set_gt: O(n) singleton: O(1) union: O(n ln n) *) functor RbOrdSet (B : sig type elem val eq : (elem*elem) -> bool val gt : (elem*elem) -> bool end ) : ORDSET = struct type elem = B.elem val elem_gt = B.gt val elem_eq = B.eq datatype Color = RED | BLACK abstype set = EMPTY | TREE of (B.elem * Color * set * set) with exception Select_arb val empty = EMPTY fun insert(key,t) = let fun f EMPTY = TREE(key,RED,EMPTY,EMPTY) | f (TREE(k,BLACK,l,r)) = if elem_gt (key,k) then case f r of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll), TREE(rk,RED,rlr,rr))) | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr)) | r => TREE(k,BLACK,l,r) else if elem_gt(k,key) then case f l of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl), TREE(k,RED,lrr,r))) | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r))) | l => TREE(k,BLACK,l,r) else TREE(key,BLACK,l,r) | f (TREE(k,RED,l,r)) = if elem_gt(key,k) then TREE(k,RED,l, f r) else if elem_gt(k,key) then TREE(k,RED, f l, r) else TREE(key,RED,l,r) in case f t of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r) | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r) | t => t end fun select_arb (TREE(k,_,l,r)) = k | select_arb EMPTY = raise Select_arb fun exists(key,t) = let fun look EMPTY = false | look (TREE(k,_,l,r)) = if elem_gt(k,key) then look l else if elem_gt(key,k) then look r else true in look t end fun find(key,t) = let fun look EMPTY = NONE | look (TREE(k,_,l,r)) = if elem_gt(k,key) then look l else if elem_gt(key,k) then look r else SOME k in look t end fun revfold f t start = let fun scan (EMPTY,value) = value | scan (TREE(k,_,l,r),value) = scan(r,f(k,scan(l,value))) in scan(t,start) end fun fold f t start = let fun scan(EMPTY,value) = value | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value))) in scan(t,start) end fun app f t = let fun scan EMPTY = () | scan(TREE(k,_,l,r)) = (scan l; f k; scan r) in scan t end (* equal_tree : test if two trees are equal. Two trees are equal if the set of leaves are equal *) fun set_eq (tree1 as (TREE _),tree2 as (TREE _)) = let datatype pos = L | R | M exception Done fun getvalue(stack as ((a,position)::b)) = (case a of (TREE(k,_,l,r)) => (case position of L => getvalue ((l,L)::(a,M)::b) | M => (k,case r of EMPTY => b | _ => (a,R)::b) | R => getvalue ((r,L)::b) ) | EMPTY => getvalue b ) | getvalue(nil) = raise Done fun f (nil,nil) = true | f (s1 as (_ :: _),s2 as (_ :: _ )) = let val (v1,news1) = getvalue s1 and (v2,news2) = getvalue s2 in (elem_eq(v1,v2)) andalso f(news1,news2) end | f _ = false in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false end | set_eq (EMPTY,EMPTY) = true | set_eq _ = false (* gt_tree : Test if tree1 is greater than tree 2 *) fun set_gt (tree1,tree2) = let datatype pos = L | R | M exception Done fun getvalue(stack as ((a,position)::b)) = (case a of (TREE(k,_,l,r)) => (case position of L => getvalue ((l,L)::(a,M)::b) | M => (k,case r of EMPTY => b | _ => (a,R)::b) | R => getvalue ((r,L)::b) ) | EMPTY => getvalue b ) | getvalue(nil) = raise Done fun f (nil,nil) = false | f (s1 as (_ :: _),s2 as (_ :: _ )) = let val (v1,news1) = getvalue s1 and (v2,news2) = getvalue s2 in (elem_gt(v1,v2)) orelse (elem_eq(v1,v2) andalso f(news1,news2)) end | f (_,nil) = true | f (nil,_) = false in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false end fun is_empty S = (let val _ = select_arb S in false end handle Select_arb => true) fun make_list S = fold (op ::) S nil fun make_set l = List.foldr insert empty l fun partition F S = fold (fn (a,(Yes,No)) => if F(a) then (insert(a,Yes),No) else (Yes,insert(a,No))) S (empty,empty) fun remove(X, XSet) = let val (YSet, _) = partition (fn a => not (elem_eq (X, a))) XSet in YSet end fun difference(Xs, Ys) = fold (fn (p as (a,Xs')) => if exists(a,Ys) then Xs' else insert p) Xs empty fun singleton X = insert(X,empty) fun card(S) = fold (fn (_,count) => count+1) S 0 fun union(Xs,Ys)= fold insert Ys Xs local fun closure'(from, f, result) = if is_empty from then result else let val (more,result) = fold (fn (a,(more',result')) => let val more = f a val new = difference(more,result) in (union(more',new),union(result',new)) end) from (empty,result) in closure'(more,f,result) end in fun closure(start, f) = closure'(start, f, start) end end end (* In utils.sig signature TABLE = sig type 'a table type key val size : 'a table -> int val empty: 'a table val exists: (key * 'a table) -> bool val find : (key * 'a table) -> 'a option val insert: ((key * 'a) * 'a table) -> 'a table val make_table : (key * 'a ) list -> 'a table val make_list : 'a table -> (key * 'a) list val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b end *) functor Table (B : sig type key val gt : (key * key) -> bool end ) : TABLE = struct datatype Color = RED | BLACK type key = B.key abstype 'a table = EMPTY | TREE of ((B.key * 'a ) * Color * 'a table * 'a table) with val empty = EMPTY fun insert(elem as (key,data),t) = let val key_gt = fn (a,_) => B.gt(key,a) val key_lt = fn (a,_) => B.gt(a,key) fun f EMPTY = TREE(elem,RED,EMPTY,EMPTY) | f (TREE(k,BLACK,l,r)) = if key_gt k then case f r of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll), TREE(rk,RED,rlr,rr))) | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) => (case l of TREE(lk,RED,ll,lr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr)) | r => TREE(k,BLACK,l,r) else if key_lt k then case f l of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl), TREE(k,RED,lrr,r))) | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) => (case r of TREE(rk,RED,rl,rr) => TREE(k,RED,TREE(lk,BLACK,ll,lr), TREE(rk,BLACK,rl,rr)) | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r))) | l => TREE(k,BLACK,l,r) else TREE(elem,BLACK,l,r) | f (TREE(k,RED,l,r)) = if key_gt k then TREE(k,RED,l, f r) else if key_lt k then TREE(k,RED, f l, r) else TREE(elem,RED,l,r) in case f t of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r) | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r) | t => t end fun exists(key,t) = let fun look EMPTY = false | look (TREE((k,_),_,l,r)) = if B.gt(k,key) then look l else if B.gt(key,k) then look r else true in look t end fun find(key,t) = let fun look EMPTY = NONE | look (TREE((k,data),_,l,r)) = if B.gt(k,key) then look l else if B.gt(key,k) then look r else SOME data in look t end fun fold f t start = let fun scan(EMPTY,value) = value | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value))) in scan(t,start) end fun make_table l = List.foldr insert empty l fun size S = fold (fn (_,count) => count+1) S 0 fun make_list table = fold (op ::) table nil end end; (* assumes that a functor Table with signature TABLE from table.sml is in the environment *) (* In utils.sig signature HASH = sig type table type elem val size : table -> int val add : elem * table -> table val find : elem * table -> int option val exists : elem * table -> bool val empty : table end *) (* hash: creates a hash table of size n which assigns each distinct member a unique integer between 0 and n-1 *) functor Hash(B : sig type elem val gt : elem * elem -> bool end) : HASH = struct type elem=B.elem structure HashTable = Table(type key=B.elem val gt = B.gt) type table = {count : int, table : int HashTable.table} val empty = {count=0,table=HashTable.empty} val size = fn {count,table} => count val add = fn (e,{count,table}) => {count=count+1,table=HashTable.insert((e,count),table)} val find = fn (e,{table,count}) => HashTable.find(e,table) val exists = fn (e,{table,count}) => HashTable.exists(e,table) end; mlton-20100608/mlyacc/src/verbose.sml0000644000076600000240000001374711404435642016017 0ustar mtfstaff(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) functor mkVerbose(structure Errs : LR_ERRS) : VERBOSE = struct structure Errs = Errs open Errs Errs.LrTable val mkPrintAction = fn print => let val printInt = print o (Int.toString : int -> string) in fn (SHIFT (STATE i)) => (print "\tshift "; printInt i; print "\n") | (REDUCE rulenum) => (print "\treduce by rule "; printInt rulenum; print "\n") | ACCEPT => print "\taccept\n" | ERROR => print "\terror\n" end val mkPrintGoto = fn (printNonterm,print) => let val printInt = print o (Int.toString : int -> string) in fn (nonterm,STATE i) => (print "\t"; printNonterm nonterm; print "\tgoto "; printInt i; print "\n") end val mkPrintTermAction = fn (printTerm,print) => let val printAction = mkPrintAction print in fn (term,action) => (print "\t"; printTerm term; printAction action) end val mkPrintGoto = fn (printNonterm,print) => fn (nonterm,STATE i) => let val printInt = print o (Int.toString : int -> string) in (print "\t"; printNonterm nonterm; print "\tgoto "; printInt i; print "\n") end val mkPrintError = fn (printTerm,printRule,print) => let val printInt = print o (Int.toString : int -> string) val printState = fn STATE s => (print " state "; printInt s) in fn (RR (term,state,r1,r2)) => (print "error: "; printState state; print ": reduce/reduce conflict between rule "; printInt r1; print " and rule "; printInt r2; print " on "; printTerm term; print "\n") | (SR (term,state,r1)) => (print "error: "; printState state; print ": shift/reduce conflict "; print "(shift "; printTerm term; print ", reduce by rule "; printInt r1; print ")\n") | NOT_REDUCED i => (print "warning: rule <"; printRule i; print "> will never be reduced\n") | START i => (print "warning: start symbol appears on the rhs of "; print "<"; printRule i; print ">\n") | NS (term,i) => (print "warning: non-shiftable terminal "; printTerm term; print "appears on the rhs of "; print "<"; printRule i; print ">\n") end structure PairList : sig val app : ('a * 'b -> unit) -> ('a,'b) pairlist -> unit val length : ('a,'b) pairlist -> int end = struct val app = fn f => let fun g EMPTY = () | g (PAIR(a,b,r)) = (f(a,b); g r) in g end val length = fn l => let fun g(EMPTY,len) = len | g(PAIR(_,_,r),len) = g(r,len+1) in g(l,0) end end val printVerbose = fn {termToString,nontermToString,table,stateErrs,entries:int, print,printRule,errs,printCores} => let val printTerm = print o termToString val printNonterm = print o nontermToString val printCore = printCores print val printTermAction = mkPrintTermAction(printTerm,print) val printAction = mkPrintAction print val printGoto = mkPrintGoto(printNonterm,print) val printError = mkPrintError(printTerm,printRule print,print) val gotos = LrTable.describeGoto table val actions = LrTable.describeActions table val states = numStates table val gotoTableSize = ref 0 val actionTableSize = ref 0 val _ = if length errs > 0 then (printSummary print errs; print "\n"; app printError errs) else () fun loop i = if i=states then () else let val s = STATE i in (app printError (stateErrs s); print "\n"; printCore s; let val (actionList,default) = actions s val gotoList = gotos s in (PairList.app printTermAction actionList; print "\n"; PairList.app printGoto gotoList; print "\n"; print "\t."; printAction default; print "\n"; gotoTableSize:=(!gotoTableSize)+ PairList.length gotoList; actionTableSize := (!actionTableSize) + PairList.length actionList + 1 ) end; loop (i+1)) end in loop 0; print (Int.toString entries ^ " of " ^ Int.toString (!actionTableSize)^ " action table entries left after compaction\n"); print (Int.toString (!gotoTableSize)^ " goto table entries\n") end end; mlton-20100608/mlyacc/src/yacc.grm0000644000076600000240000001726111404435642015256 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) (* parser for the ML parser generator *) open Hdr %% %name Mlyacc %eop EOF %noshift EOF %right ARROW %left ASTERISK %pos pos %term ARROW | ASTERISK | BLOCK | BAR | CHANGE | COLON | COMMA | DELIMITER | EOF | FOR | HEADER of string | ID of string*Header.pos | IDDOT of string | PERCENT_HEADER | INT of string | KEYWORD | LBRACE | LPAREN | NAME | NODEFAULT | NONTERM | NOSHIFT | OF | PERCENT_EOP | PERCENT_PURE | PERCENT_POS | PERCENT_ARG | PERCENT_TOKEN_SIG_INFO | PREC of Header.prec | PREC_TAG | PREFER | PROG of string | RBRACE | RPAREN | SUBST | START | TERM | TYVAR of string | VERBOSE | VALUE | UNKNOWN of string | BOGUS_VALUE %nonterm BEGIN of string * Hdr.declData * (Hdr.rule list) | CONSTR_LIST of (Hdr.symbol * Hdr.ty option) list | ID_LIST of Hdr.symbol list | LABEL of string | MPC_DECL of Hdr.declData | MPC_DECLS of Hdr.declData | QUAL_ID of string | RECORD_LIST of string | RHS_LIST of {rhs:Hdr.symbol list,code:{text:string, pos:Header.pos}, prec:Hdr.symbol option} list | G_RULE of Hdr.rule list | G_RULE_LIST of Hdr.rule list | G_RULE_PREC of Hdr.symbol option | SUBST_DECL of (Hdr.symbol list * Hdr.symbol list) list | SUBST_DEC of (Hdr.symbol list * Hdr.symbol list) | CHANGE_DECL of (Hdr.symbol list * Hdr.symbol list) list | CHANGE_DEC of (Hdr.symbol list * Hdr.symbol list) | TY of string %header ( functor MlyaccLrValsFun(structure Hdr : HEADER where type prec = Header.prec structure Token : TOKEN) ) %arg (inputSource) : Hdr.inputSource %% BEGIN : HEADER MPC_DECLS DELIMITER G_RULE_LIST (HEADER,MPC_DECLS,rev G_RULE_LIST) MPC_DECLS : MPC_DECLS MPC_DECL (join_decls(MPC_DECLS,MPC_DECL,inputSource,MPC_DECLleft)) MPC_DECLS: (DECL {prec=nil,nonterm=NONE,term=NONE,eop=nil,control=nil, keyword=nil,change=nil, value=nil}) MPC_DECL: TERM CONSTR_LIST (DECL { prec=nil,nonterm=NONE, term = SOME CONSTR_LIST, eop =nil,control=nil, change=nil,keyword=nil, value=nil}) | NONTERM CONSTR_LIST (DECL { prec=nil,control=nil,nonterm= SOME CONSTR_LIST, term = NONE, eop=nil,change=nil,keyword=nil, value=nil}) | PREC ID_LIST (DECL {prec= [(PREC,ID_LIST)],control=nil, nonterm=NONE,term=NONE,eop=nil,change=nil, keyword=nil,value=nil}) | START ID (DECL {prec=nil,control=[START_SYM (symbolMake ID)],nonterm=NONE, term = NONE, eop = nil,change=nil,keyword=nil, value=nil}) | PERCENT_EOP ID_LIST (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE, eop=ID_LIST, change=nil,keyword=nil, value=nil}) | KEYWORD ID_LIST (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=ID_LIST, value=nil}) | PREFER ID_LIST (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=map (fn i=>([],[i])) ID_LIST,keyword=nil, value=nil}) | CHANGE CHANGE_DECL (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=CHANGE_DECL,keyword=nil, value=nil}) | SUBST SUBST_DECL (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil, change=SUBST_DECL,keyword=nil, value=nil}) | NOSHIFT ID_LIST (DECL {prec=nil,control=[NSHIFT ID_LIST],nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil}) | PERCENT_HEADER PROG (DECL {prec=nil,control=[FUNCTOR PROG],nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil}) | PERCENT_TOKEN_SIG_INFO PROG (DECL {prec=nil,control=[TOKEN_SIG_INFO PROG], nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil}) | NAME ID (DECL {prec=nil,control=[PARSER_NAME (symbolMake ID)], nonterm=NONE,term=NONE, eop=nil,change=nil,keyword=nil, value=nil}) | PERCENT_ARG PROG COLON TY (DECL {prec=nil,control=[PARSE_ARG(PROG,TY)],nonterm=NONE, term=NONE,eop=nil,change=nil,keyword=nil, value=nil}) | VERBOSE (DECL {prec=nil,control=[Hdr.VERBOSE], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil}) | NODEFAULT (DECL {prec=nil,control=[Hdr.NODEFAULT], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil}) | PERCENT_PURE (DECL {prec=nil,control=[Hdr.PURE], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil}) | PERCENT_POS TY (DECL {prec=nil,control=[Hdr.POS TY], nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=nil}) | VALUE ID PROG (DECL {prec=nil,control=nil, nonterm=NONE,term=NONE,eop=nil, change=nil,keyword=nil, value=[(symbolMake ID,PROG)]}) CHANGE_DECL : CHANGE_DEC BAR CHANGE_DECL (CHANGE_DEC :: CHANGE_DECL) | CHANGE_DEC ([CHANGE_DEC]) CHANGE_DEC : ID_LIST ARROW ID_LIST (ID_LIST1, ID_LIST2) SUBST_DECL : SUBST_DEC BAR SUBST_DECL (SUBST_DEC :: SUBST_DECL) | SUBST_DEC ([SUBST_DEC]) SUBST_DEC: ID FOR ID ([symbolMake ID2],[symbolMake ID1]) CONSTR_LIST : CONSTR_LIST BAR ID OF TY ((symbolMake ID,SOME (tyMake TY))::CONSTR_LIST) | CONSTR_LIST BAR ID ((symbolMake ID,NONE)::CONSTR_LIST) | ID OF TY ([(symbolMake ID,SOME (tyMake TY))]) | ID ([(symbolMake ID,NONE)]) G_RULE : ID COLON RHS_LIST (map (fn {rhs,code,prec} => Hdr.RULE {lhs=symbolMake ID,rhs=rhs, code=code,prec=prec}) RHS_LIST) G_RULE_LIST: G_RULE_LIST G_RULE (G_RULE@G_RULE_LIST) | G_RULE (G_RULE) ID_LIST : ID ID_LIST (symbolMake ID :: ID_LIST) | (nil) RHS_LIST : ID_LIST G_RULE_PREC PROG ([{rhs=ID_LIST,code={text=PROG,pos=PROGleft},prec=G_RULE_PREC}]) | RHS_LIST BAR ID_LIST G_RULE_PREC PROG ({rhs=ID_LIST,code={text=PROG,pos=PROGleft},prec=G_RULE_PREC}::RHS_LIST) TY : TYVAR (TYVAR) | LBRACE RECORD_LIST RBRACE ("{ "^RECORD_LIST^" } ") | LBRACE RBRACE ("{}") | PROG (" ( "^PROG^" ) ") | TY QUAL_ID (TY^" "^QUAL_ID) | QUAL_ID (QUAL_ID) | TY ASTERISK TY (TY1^"*"^TY2) | TY ARROW TY (TY1 ^ " -> " ^ TY2) RECORD_LIST : RECORD_LIST COMMA LABEL COLON TY (RECORD_LIST^","^LABEL^":"^TY) | LABEL COLON TY (LABEL^":"^TY) QUAL_ID : ID ((fn (a,_) => a) ID) | IDDOT QUAL_ID (IDDOT^QUAL_ID) LABEL : ID ((fn (a,_) => a) ID) | INT (INT) G_RULE_PREC : PREC_TAG ID (SOME (symbolMake ID)) G_RULE_PREC : (NONE) mlton-20100608/mlyacc/src/yacc.lex0000644000076600000240000001331211404435642015252 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi yacc.lex: Lexer specification *) structure Tokens = Tokens type svalue = Tokens.svalue type pos = Header.pos type ('a,'b) token = ('a,'b) Tokens.token type lexresult = (svalue,pos) token type lexarg = Hdr.inputSource type arg = lexarg open Tokens val error = Hdr.error val text = Hdr.text val pcount = ref 0 val commentLevel = ref 0 val actionstart = ref {line = 1, col = 0} fun linePos () = {line = !(#line Hdr.pos), col = 0} fun pos pos = {line = !(#line Hdr.pos), col = pos - !(#start Hdr.pos)} val eof = fn i => (if (!pcount)>0 then error i (!actionstart) " eof encountered in action beginning here !" else (); EOF(linePos (), linePos ())) val Add = fn s => (text := s::(!text)) local val dict = [("%prec",PREC_TAG),("%term",TERM), ("%nonterm",NONTERM), ("%eop",PERCENT_EOP),("%start",START), ("%prefer",PREFER),("%subst",SUBST),("%change",CHANGE), ("%keyword",KEYWORD),("%name",NAME), ("%verbose",VERBOSE), ("%nodefault",NODEFAULT), ("%value",VALUE), ("%noshift",NOSHIFT), ("%header",PERCENT_HEADER),("%pure",PERCENT_PURE), ("%token_sig_info",PERCENT_TOKEN_SIG_INFO), ("%arg",PERCENT_ARG), ("%pos",PERCENT_POS)] in fun lookup (s,left,right) = let fun f ((a,d)::b) = if a=s then d(left,right) else f b | f nil = UNKNOWN(s,left,right) in f dict end end fun inc (ri as ref i) = (ri := i+1) fun dec (ri as ref i) = (ri := i-1) fun incLineNum pos = (inc (#line Hdr.pos) ; #start Hdr.pos := pos) %% %header ( functor LexMLYACC(structure Tokens : Mlyacc_TOKENS structure Hdr : HEADER (* = Header *) where type prec = Header.prec and type inputSource = Header.inputSource) : ARG_LEXER ); %arg (inputSource); %s A CODE F COMMENT STRING EMPTYCOMMENT; ws = [\t\ ]+; eol=("\n"|"\013\n"|"\013"); idchars = [A-Za-z_'0-9]; id=[A-Za-z]{idchars}*; tyvar="'"{idchars}*; qualid ={id}"."; %% "(*" => (Add yytext; YYBEGIN COMMENT; commentLevel := 1; continue() before YYBEGIN INITIAL); "(*" => (YYBEGIN EMPTYCOMMENT; commentLevel := 1; continue()); "(*" => (Add yytext; YYBEGIN COMMENT; commentLevel := 1; continue() before YYBEGIN CODE); [^%\013\n]+ => (Add yytext; continue()); "%%" => (YYBEGIN A; HEADER (concat (rev (!text)),pos yypos,pos yypos)); {eol} => (Add yytext; incLineNum yypos; continue()); . => (Add yytext; continue()); {eol} => (incLineNum yypos; continue ()); {ws}+ => (continue()); of => (OF(pos yypos,pos yypos)); for => (FOR(pos yypos,pos yypos)); "{" => (LBRACE(pos yypos,pos yypos)); "}" => (RBRACE(pos yypos,pos yypos)); "," => (COMMA(pos yypos,pos yypos)); "*" => (ASTERISK(pos yypos,pos yypos)); "->" => (ARROW(pos yypos,pos yypos)); "%left" => (PREC(Hdr.LEFT,pos yypos,pos yypos)); "%right" => (PREC(Hdr.RIGHT,pos yypos,pos yypos)); "%nonassoc" => (PREC(Hdr.NONASSOC,pos yypos,pos yypos)); "%"[a-z_]+ => (lookup(yytext,pos yypos,pos yypos)); {tyvar} => (TYVAR(yytext,pos yypos,pos yypos)); {qualid} => (IDDOT(yytext,pos yypos,pos yypos)); [0-9]+ => (INT (yytext,pos yypos,pos yypos)); "%%" => (DELIMITER(pos yypos,pos yypos)); ":" => (COLON(pos yypos,pos yypos)); "|" => (BAR(pos yypos,pos yypos)); {id} => (ID ((yytext,pos yypos),pos yypos,pos yypos)); "(" => (pcount := 1; actionstart := pos yypos; text := nil; YYBEGIN CODE; continue() before YYBEGIN A); . => (UNKNOWN(yytext,pos yypos,pos yypos)); "(" => (inc pcount; Add yytext; continue()); ")" => (dec pcount; if !pcount = 0 then PROG (concat (rev (!text)),!actionstart,pos yypos) else (Add yytext; continue())); "\"" => (Add yytext; YYBEGIN STRING; continue()); [^()"\n\013]+ => (Add yytext; continue()); [(*)] => (Add yytext; continue()); "*)" => (Add yytext; dec commentLevel; if !commentLevel=0 then BOGUS_VALUE(pos yypos,pos yypos) else continue() ); "(*" => (Add yytext; inc commentLevel; continue()); [^*()\n\013]+ => (Add yytext; continue()); [(*)] => (continue()); "*)" => (dec commentLevel; if !commentLevel=0 then YYBEGIN A else (); continue ()); "(*" => (inc commentLevel; continue()); [^*()\n\013]+ => (continue()); "\"" => (Add yytext; YYBEGIN CODE; continue()); \\ => (Add yytext; continue()); {eol} => (Add yytext; error inputSource (pos yypos) "unclosed string"; incLineNum yypos; YYBEGIN CODE; continue()); [^"\\\n\013]+ => (Add yytext; continue()); \\\" => (Add yytext; continue()); \\{eol} => (Add yytext; incLineNum yypos; YYBEGIN F; continue()); \\[\ \t] => (Add yytext; YYBEGIN F; continue()); {ws} => (Add yytext; continue()); \\ => (Add yytext; YYBEGIN STRING; continue()); . => (Add yytext; error inputSource (pos yypos) "unclosed string"; YYBEGIN CODE; continue()); mlton-20100608/mlyacc/src/yacc.sml0000644000076600000240000010654011404435642015263 0ustar mtfstaff(* Modified by Vesa Karvonen on 2007-12-18. * Create line directives in output. *) (* ML-Yacc Parser Generator (c) 1989, 1990 Andrew W. Appel, David R. Tarditi *) functor ParseGenFun(structure ParseGenParser : PARSE_GEN_PARSER structure MakeTable : MAKE_LR_TABLE structure Verbose : VERBOSE structure PrintStruct : PRINT_STRUCT sharing MakeTable.LrTable = PrintStruct.LrTable sharing MakeTable.Errs = Verbose.Errs structure Absyn : ABSYN ) : PARSE_GEN = struct open Array List infix 9 sub structure Grammar = MakeTable.Grammar structure Header = ParseGenParser.Header open Header Grammar (* approx. maximum length of a line *) val lineLength = 70 (* record type describing names of structures in the program being generated *) datatype names = NAMES of {miscStruct : string, (* Misc{n} struct name *) tableStruct : string, (* LR table structure *) tokenStruct : string, (* Tokens{n} struct name *) actionsStruct : string, (* Actions structure *) valueStruct: string, (* semantic value structure *) ecStruct : string, (* error correction structure *) arg: string, (* user argument for parser *) tokenSig : string, (* TOKENS{n} signature *) miscSig :string, (* Signature for Misc structure *) dataStruct:string, (* name of structure in Misc *) (* which holds parser data *) dataSig:string (* signature for this structure *) } val DEBUG = true exception Semantic (* common functions and values used in printing out program *) datatype values = VALS of {say : string -> unit, saydot : string -> unit, sayln : string -> unit, fmtPos : {line : int, col : int} option -> string, pureActions: bool, pos_type : string, arg_type : string, ntvoid : string, termvoid : string, start : Grammar.nonterm, hasType : Grammar.symbol -> bool, (* actual (user) name of terminal *) termToString : Grammar.term -> string, symbolToString : Grammar.symbol -> string, (* type symbol comes from the HDR structure, and is now abstract *) term : (Header.symbol * ty option) list, nonterm : (Header.symbol * ty option) list, terms : Grammar.term list, (* tokenInfo is the user inserted spec in the *_TOKEN sig*) tokenInfo : string option} structure SymbolHash = Hash(type elem = string val gt = (op >) : string*string -> bool) structure TermTable = Table(type key = Grammar.term val gt = fn (T i,T j) => i > j) structure SymbolTable = Table( type key = Grammar.symbol val gt = fn (TERM(T i),TERM(T j)) => i>j | (NONTERM(NT i),NONTERM(NT j)) => i>j | (NONTERM _,TERM _) => true | (TERM _,NONTERM _) => false) (* printTypes: function to print the following types in the LrValues structure and a structure containing the datatype svalue: type svalue -- it holds semantic values on the parse stack type pos -- the type of line numbers type result -- the type of the value that results from the parse The type svalue is set equal to the datatype svalue declared in the structure named by valueStruct. The datatype svalue is declared inside the structure named by valueStruct to deal with the scope of constructors. *) val printTypes = fn (VALS {say,sayln,term,nonterm,symbolToString,pos_type, arg_type, termvoid,ntvoid,saydot,hasType,start, pureActions,...}, NAMES {valueStruct,...},symbolType) => let val prConstr = fn (symbol,SOME s) => say (" | " ^ (symbolName symbol) ^ " of " ^ (if pureActions then "" else "unit -> ") ^ " (" ^ tyName s ^ ")" ) | _ => () in sayln "local open Header in"; sayln ("type pos = " ^ pos_type); sayln ("type arg = " ^ arg_type); sayln ("structure " ^ valueStruct ^ " = "); sayln "struct"; say ("datatype svalue = " ^ termvoid ^ " | " ^ ntvoid ^ " of" ^ (if pureActions then "" else " unit -> ") ^ " unit"); app prConstr term; app prConstr nonterm; sayln "\nend"; sayln ("type svalue = " ^ valueStruct ^ ".svalue"); say "type result = "; case symbolType (NONTERM start) of NONE => sayln "unit" | SOME t => (say (tyName t); sayln ""); sayln "end" end (* function to print Tokens{n} structure *) val printTokenStruct = fn (VALS {say, sayln, termToString, hasType,termvoid,terms, pureActions,tokenInfo,...}, NAMES {miscStruct,tableStruct,valueStruct, tokenStruct,tokenSig,dataStruct,...}) => (sayln ("structure " ^ tokenStruct ^ " : " ^ tokenSig ^ " ="); sayln "struct"; (case tokenInfo of NONE => () | _ => sayln ("open "^dataStruct^".Header")); sayln ("type svalue = " ^ dataStruct ^ ".svalue"); sayln "type ('a,'b) token = ('a,'b) Token.token"; let val f = fn term as T i => (say "fun "; say (termToString term); say " ("; if (hasType (TERM term)) then say "i," else (); say "p1,p2) = Token.TOKEN ("; say (dataStruct ^ "." ^ tableStruct ^ ".T "); say (Int.toString i); say ",("; say (dataStruct ^ "." ^ valueStruct ^ "."); if (hasType (TERM term)) then (say (termToString term); if pureActions then say " i" else say " (fn () => i)") else say termvoid; say ","; sayln "p1,p2))") in app f terms end; sayln "end") (* function to print signatures out - takes print function which does not need to insert line breaks *) val printSigs = fn (VALS {term,tokenInfo,...}, NAMES {tokenSig,tokenStruct,miscSig, dataStruct, dataSig, ...}, say) => say ("signature " ^ tokenSig ^ " =\nsig\n"^ (case tokenInfo of NONE => "" | SOME s => (s^"\n"))^ "type ('a,'b) token\ntype svalue\n" ^ (List.foldr (fn ((s,ty),r) => String.concat [ "val ", symbolName s, (case ty of NONE => ": " | SOME l => ": (" ^ (tyName l) ^ ") * "), " 'a * 'a -> (svalue,'a) token\n", r]) "" term) ^ "end\nsignature " ^ miscSig ^ "=\nsig\nstructure Tokens : " ^ tokenSig ^ "\nstructure " ^ dataStruct ^ ":" ^ dataSig ^ "\nsharing type " ^ dataStruct ^ ".Token.token = Tokens.token\nsharing type " ^ dataStruct ^ ".svalue = Tokens.svalue\nend\n") (* function to print structure for error correction *) val printEC = fn (keyword : term list, preferred_change : (term list * term list) list, noshift : term list, value : (term * string) list, VALS {termToString, say,sayln,terms,saydot,hasType, termvoid,pureActions,...}, NAMES {ecStruct,tableStruct,valueStruct,...}) => let val sayterm = fn (T i) => (say "(T "; say (Int.toString i); say ")") val printBoolCase = fn ( l : term list) => (say "fn "; app (fn t => (sayterm t; say " => true"; say " | ")) l; sayln "_ => false") val printTermList = fn (l : term list) => (sayln "nil"; app (fn t => (say " $$ "; sayterm t)) (rev l)) fun printChange () = (sayln "val preferred_change : (term list * term list) list = "; app (fn (d,i) => (say"("; printTermList d; say ","; printTermList i; sayln ")::" ) ) preferred_change; sayln "nil") val printErrValues = fn (l : (term * string) list) => (sayln "local open Header in"; sayln "val errtermvalue="; say "fn "; app (fn (t,s) => (sayterm t; say " => "; saydot valueStruct; say (termToString t); say "("; if pureActions then () else say "fn () => "; say "("; say s; say "))"; sayln " | " ) ) l; say "_ => "; say (valueStruct ^ "."); sayln termvoid; sayln "end") val printNames = fn () => let val f = fn term => ( sayterm term; say " => "; sayln (String.concat["\"", termToString term, "\""]); say " | ") in (sayln "val showTerminal ="; say "fn "; app f terms; sayln "_ => \"bogus-term\"") end val ecTerms = List.foldr (fn (t,r) => if hasType (TERM t) orelse exists (fn (a,_)=>a=t) value then r else t::r) [] terms in say "structure "; say ecStruct; sayln "="; sayln "struct"; say "open "; sayln tableStruct; sayln "infix 5 $$"; sayln "fun x $$ y = y::x"; sayln "val is_keyword ="; printBoolCase keyword; printChange(); sayln "val noShift = "; printBoolCase noshift; printNames (); printErrValues value; say "val terms : term list = "; printTermList ecTerms; sayln "end" end val printAction = fn (rules, VALS {hasType,say,sayln,fmtPos,termvoid,ntvoid, symbolToString,saydot,start,pureActions,...}, NAMES {actionsStruct,valueStruct,tableStruct,arg,...}) => let val printAbsynRule = Absyn.printRule(say,sayln,fmtPos) val is_nonterm = fn (NONTERM i) => true | _ => false val numberRhs = fn r => List.foldl (fn (e,(r,table)) => let val num = case SymbolTable.find(e,table) of SOME i => i | NONE => 1 in ((e,num,hasType e orelse is_nonterm e)::r, SymbolTable.insert((e,num+1),table)) end) (nil,SymbolTable.empty) r val saySym = symbolToString val printCase = fn (i:int, r as {lhs=lhs as (NT lhsNum),prec, rhs,code,rulenum}) => (* mkToken: Build an argument *) let open Absyn val mkToken = fn (sym,num : int,typed) => let val symString = symbolToString sym val symNum = symString ^ (Int.toString num) in PTUPLE[WILD, PTUPLE[if not (hasType sym) then (if is_nonterm sym then PAPP(valueStruct^"."^ntvoid, PVAR symNum) else WILD) else PAPP(valueStruct^"."^symString, if num=1 andalso pureActions then AS(symNum,PVAR symString) else PVAR symNum), if num=1 then AS(symString^"left", PVAR(symNum^"left")) else PVAR(symNum^"left"), if num=1 then AS(symString^"right", PVAR(symNum^"right")) else PVAR(symNum^"right")]] end val numberedRhs = #1 (numberRhs rhs) (* construct case pattern *) val pat = PTUPLE[PINT i,PLIST(map mkToken numberedRhs, SOME (PVAR "rest671"))] (* remove terminals in argument list w/o types *) val argsWithTypes = List.foldr (fn ((_,_,false),r) => r | (s as (_,_,true),r) => s::r) nil numberedRhs (* construct case body *) val defaultPos = EVAR "defaultPos" val resultexp = EVAR "result" val resultpat = PVAR "result" val code = CODE code val rest = EVAR "rest671" val body = LET([VB(resultpat, EAPP(EVAR(valueStruct^"."^ (if hasType (NONTERM lhs) then saySym(NONTERM lhs) else ntvoid)), if pureActions then code else if argsWithTypes=nil then FN(WILD,code) else FN(WILD, let val body = LET(map (fn (sym,num:int,_) => let val symString = symbolToString sym val symNum = symString ^ Int.toString num in VB(if num=1 then AS(symString,PVAR symNum) else PVAR symNum, EAPP(EVAR symNum,UNIT)) end) (rev argsWithTypes), code) in if hasType (NONTERM lhs) then body else SEQ(body,UNIT) end)))], ETUPLE[EAPP(EVAR(tableStruct^".NT"),EINT(lhsNum)), case rhs of nil => ETUPLE[resultexp,defaultPos,defaultPos] | r =>let val (rsym,rnum,_) = hd(numberedRhs) val (lsym,lnum,_) = hd(rev numberedRhs) in ETUPLE[resultexp, EVAR (symbolToString lsym ^ Int.toString lnum ^ "left"), EVAR (symbolToString rsym ^ Int.toString rnum ^ "right")] end, rest]) in printAbsynRule (RULE(pat,body)) end val prRules = fn () => (sayln "fn (i392,defaultPos,stack,"; say " ("; say arg; sayln "):arg) =>"; sayln "case (i392,stack)"; say "of "; app (fn (rule as {rulenum,...}) => (printCase(rulenum,rule); say "| ")) rules; sayln "_ => raise (mlyAction i392)") in say "structure "; say actionsStruct; sayln " ="; sayln "struct "; sayln "exception mlyAction of int"; sayln "local open Header in"; sayln "val actions = "; prRules(); sayln "end"; say "val void = "; saydot valueStruct; sayln termvoid; say "val extract = "; say "fn a => (fn "; saydot valueStruct; if hasType (NONTERM start) then say (symbolToString (NONTERM start)) else say "ntVOID"; sayln " x => x"; sayln "| _ => let exception ParseInternal"; say "\tin raise ParseInternal end) a "; sayln (if pureActions then "" else "()"); sayln "end" end val make_parser = fn ((header, DECL {eop,change,keyword,nonterm,prec, term, control,value} : declData, rules : rule list),spec,error : pos -> string -> unit, wasError : unit -> bool) => let val verbose = List.exists (fn VERBOSE=>true | _ => false) control val defaultReductions = not (List.exists (fn NODEFAULT=>true | _ => false) control) val pos_type = let fun f nil = NONE | f ((POS s)::r) = SOME s | f (_::r) = f r in f control end val start = let fun f nil = NONE | f ((START_SYM s)::r) = SOME s | f (_::r) = f r in f control end val name = let fun f nil = NONE | f ((PARSER_NAME s)::r) = SOME s | f (_::r) = f r in f control end val header_decl = let fun f nil = NONE | f ((FUNCTOR s)::r) = SOME s | f (_::r) = f r in f control end val token_sig_info_decl = let fun f nil = NONE | f ((TOKEN_SIG_INFO s)::_) = SOME s | f (_::r) = f r in f control end val arg_decl = let fun f nil = ("()","unit") | f ((PARSE_ARG s)::r) = s | f (_::r) = f r in f control end val noshift = let fun f nil = nil | f ((NSHIFT s)::r) = s | f (_::r) = f r in f control end val pureActions = let fun f nil = false | f ((PURE)::r) = true | f (_::r) = f r in f control end val term = case term of NONE => (error {line = 1, col = 0} "missing %term definition"; nil) | SOME l => l val nonterm = case nonterm of NONE => (error {line = 1, col = 0} "missing %nonterm definition"; nil) | SOME l => l val pos_type = case pos_type of NONE => (error {line = 1, col = 0} "missing %pos definition"; "") | SOME l => l val termHash = List.foldr (fn ((symbol,_),table) => let val name = symbolName symbol in if SymbolHash.exists(name,table) then (error (symbolPos symbol) ("duplicate definition of " ^ name ^ " in %term"); table) else SymbolHash.add(name,table) end) SymbolHash.empty term val isTerm = fn name => SymbolHash.exists(name,termHash) val symbolHash = List.foldr (fn ((symbol,_),table) => let val name = symbolName symbol in if SymbolHash.exists(name,table) then (error (symbolPos symbol) (if isTerm name then name ^ " is defined as a terminal and a nonterminal" else "duplicate definition of " ^ name ^ " in %nonterm"); table) else SymbolHash.add(name,table) end) termHash nonterm fun makeUniqueId s = if SymbolHash.exists(s,symbolHash) then makeUniqueId (s ^ "'") else s val _ = if wasError() then raise Semantic else () val numTerms = SymbolHash.size termHash val numNonterms = SymbolHash.size symbolHash - numTerms val symError = fn sym => fn err => fn symbol => error (symbolPos symbol) (symbolName symbol^" in "^err^" is not defined as a " ^ sym) val termNum : string -> Header.symbol -> term = let val termError = symError "terminal" in fn stmt => let val stmtError = termError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; T ~1) | SOME i => T (if i Header.symbol -> nonterm = let val nontermError = symError "nonterminal" in fn stmt => let val stmtError = nontermError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; NT ~1) | SOME i => if i>=numTerms then NT (i-numTerms) else (stmtError symbol;NT ~1) end end val symbolNum : string -> Header.symbol -> Grammar.symbol = let val symbolError = symError "symbol" in fn stmt => let val stmtError = symbolError stmt in fn symbol => case SymbolHash.find(symbolName symbol,symbolHash) of NONE => (stmtError symbol; NONTERM (NT ~1)) | SOME i => if i>=numTerms then NONTERM(NT (i-numTerms)) else TERM(T i) end end (* map all symbols in the following values to terminals and check that the symbols are defined as terminals: eop : symbol list keyword: symbol list prec: (lexvalue * (symbol list)) list change: (symbol list * symbol list) list *) val eop = map (termNum "%eop") eop val keyword = map (termNum "%keyword") keyword val prec = map (fn (a,l) => (a,case a of LEFT => map (termNum "%left") l | RIGHT => map (termNum "%right") l | NONASSOC => map (termNum "%nonassoc") l )) prec val change = let val mapTerm = termNum "%prefer, %subst, or %change" in map (fn (a,b) => (map mapTerm a, map mapTerm b)) change end val noshift = map (termNum "%noshift") noshift val value = let val mapTerm = termNum "%value" in map (fn (a,b) => (mapTerm a,b)) value end val (rules,_) = let val symbolNum = symbolNum "rule" val nontermNum = nontermNum "rule" val termNum = termNum "%prec tag" in List.foldr (fn (RULE {lhs,rhs,code,prec},(l,n)) => ( {lhs=nontermNum lhs,rhs=map symbolNum rhs, code=code,prec=case prec of NONE => NONE | SOME t => SOME (termNum t), rulenum=n}::l,n-1)) (nil,length rules-1) rules end val _ = if wasError() then raise Semantic else () (* termToString: map terminals back to strings *) val termToString = let val data = array(numTerms,"") val unmap = fn (symbol,_) => let val name = symbolName symbol in update(data, case SymbolHash.find(name,symbolHash) of SOME i => i | NONE => raise Fail "termToString", name) end val _ = app unmap term in fn T i => if DEBUG andalso (i<0 orelse i>=numTerms) then "bogus-num" ^ (Int.toString i) else data sub i end val nontermToString = let val data = array(numNonterms,"") val unmap = fn (symbol,_) => let val name = symbolName symbol in update(data, case SymbolHash.find(name,symbolHash) of SOME i => i-numTerms | NONE => raise Fail "nontermToString", name) end val _ = app unmap nonterm in fn NT i => if DEBUG andalso (i<0 orelse i>=numNonterms) then "bogus-num" ^ (Int.toString i) else data sub i end (* create functions mapping terminals to precedence numbers and rules to precedence numbers. Precedence statements are listed in order of ascending (tighter binding) precedence in the specification. We receive a list composed of pairs containing the kind of precedence (left,right, or assoc) and a list of terminals associated with that precedence. The list has the same order as the corresponding declarations did in the specification. Internally, a tighter binding has a higher precedence number. We give precedences using multiples of 3: p+2 = right associative (force shift of symbol) p+1 = precedence for rule p = left associative (force reduction of rule) Nonassociative terminals are given also given a precedence of p+1. The table generator detects when the associativity of a nonassociative terminal is being used to resolve a shift/reduce conflict by checking if the precedences of the rule and the terminal are equal. A rule is given the precedence of its rightmost terminal *) val termPrec = let val precData = array(numTerms, NONE : int option) val addPrec = fn termPrec => fn term as (T i) => case precData sub i of SOME _ => error {line = 1, col = 0} ("multiple precedences specified for terminal " ^ (termToString term)) | NONE => update(precData,i,termPrec) val termPrec = fn ((LEFT,_) ,i) => i | ((RIGHT,_),i) => i+2 | ((NONASSOC,l),i) => i+1 val _ = List.foldl (fn (args as ((_,l),i)) => (app (addPrec (SOME (termPrec args))) l; i+3)) 0 prec in fn (T i) => if DEBUG andalso (i < 0 orelse i >= numTerms) then NONE else precData sub i end val elimAssoc = fn i => (i - (i mod 3) + 1) val rulePrec = let fun findRightTerm (nil,r) = r | findRightTerm (TERM t :: tail,r) = findRightTerm(tail,SOME t) | findRightTerm (_ :: tail,r) = findRightTerm(tail,r) in fn rhs => case findRightTerm(rhs,NONE) of NONE => NONE | SOME term => case termPrec term of SOME i => SOME (elimAssoc i) | a => a end val grammarRules = let val conv = fn {lhs,rhs,code,prec,rulenum} => {lhs=lhs,rhs =rhs,precedence= case prec of SOME t => (case termPrec t of SOME i => SOME(elimAssoc i) | a => a) | _ => rulePrec rhs, rulenum=rulenum} in map conv rules end (* get start symbol *) val start = case start of NONE => #lhs (hd grammarRules) | SOME name => nontermNum "%start" name val symbolType = let val data = array(numTerms+numNonterms,NONE : ty option) fun unmap (symbol,ty) = update(data, case SymbolHash.find(symbolName symbol,symbolHash) of SOME i => i | NONE => raise Fail "symbolType", ty) val _ = (app unmap term; app unmap nonterm) in fn NONTERM(NT i) => if DEBUG andalso (i<0 orelse i>=numNonterms) then NONE else data sub (i+numTerms) | TERM (T i) => if DEBUG andalso (i<0 orelse i>=numTerms) then NONE else data sub i end val symbolToString = fn NONTERM i => nontermToString i | TERM i => termToString i val grammar = GRAMMAR {rules=grammarRules, terms=numTerms,nonterms=numNonterms, eop = eop, start=start,noshift=noshift, termToString = termToString, nontermToString = nontermToString, precedence = termPrec} val name' = case name of NONE => "" | SOME s => symbolName s val names = NAMES {miscStruct=name' ^ "LrValsFun", valueStruct="MlyValue", tableStruct="LrTable", tokenStruct="Tokens", actionsStruct="Actions", ecStruct="EC", arg= #1 arg_decl, tokenSig = name' ^ "_TOKENS", miscSig = name' ^ "_LRVALS", dataStruct = "ParserData", dataSig = "PARSER_DATA"} val (table,stateErrs,corePrint,errs) = MakeTable.mkTable(grammar,defaultReductions) val entries = ref 0 (* save number of action table entries here *) in let val result = TextIO.openOut (spec ^ ".sml") val sigs = TextIO.openOut (spec ^ ".sig") val specPath = OS.FileSys.fullPath spec val resultPath = OS.FileSys.fullPath (spec ^ ".sml") val line = ref 1 val col = ref 0 val pr = fn s => TextIO.output(result,s) val say = fn s => (CharVector.app (fn #"\n" => (line := !line + 1 ; col := 0) | _ => col := !col + 1) s ; pr s) val saydot = fn s => (say (s ^ ".")) val sayln = fn t => (say t; say "\n") fun fmtLineDir {line, col} path = String.concat ["(*#line ", Int.toString line, ".", Int.toString (col+1), " \"", path, "\"*)"] val fmtPos = fn NONE => (fmtLineDir {line = !line, col = 0} resultPath) ^ "\n" | SOME pos => fmtLineDir pos specPath val termvoid = makeUniqueId "VOID" val ntvoid = makeUniqueId "ntVOID" val hasType = fn s => case symbolType s of NONE => false | _ => true val terms = let fun f n = if n=numTerms then nil else (T n) :: f(n+1) in f 0 end val values = VALS {say=say,sayln=sayln,saydot=saydot,fmtPos=fmtPos, termvoid=termvoid, ntvoid = ntvoid, hasType=hasType, pos_type = pos_type, arg_type = #2 arg_decl, start=start,pureActions=pureActions, termToString=termToString, symbolToString=symbolToString,term=term, nonterm=nonterm,terms=terms, tokenInfo=token_sig_info_decl} val (NAMES {miscStruct,tableStruct,dataStruct,tokenSig,tokenStruct,dataSig,...}) = names in case header_decl of NONE => (say "functor "; say miscStruct; sayln "(structure Token : TOKEN)"; say " : sig structure "; say dataStruct; say " : "; sayln dataSig; say " structure "; say tokenStruct; say " : "; sayln tokenSig; sayln " end") | SOME s => say s; sayln " = "; sayln "struct"; sayln ("structure " ^ dataStruct ^ "="); sayln "struct"; sayln "structure Header = "; sayln "struct"; say (fmtPos (SOME {line = 1, col = 1})); sayln header; say (fmtPos NONE); sayln "end"; sayln "structure LrTable = Token.LrTable"; sayln "structure Token = Token"; sayln "local open LrTable in "; entries := PrintStruct.makeStruct{table=table,print=say, name = "table", verbose=verbose}; sayln "end"; printTypes(values,names,symbolType); printEC (keyword,change,noshift,value,values,names); printAction(rules,values,names); sayln "end"; printTokenStruct(values,names); sayln "end"; printSigs(values,names,fn s => TextIO.output(sigs,s)); TextIO.closeOut sigs; TextIO.closeOut result; MakeTable.Errs.printSummary (fn s => TextIO.output(TextIO.stdOut,s)) errs end; if verbose then let val f = TextIO.openOut (spec ^ ".desc") val say = fn s=> TextIO.output(f,s) val printRule = let val rules = Array.fromList grammarRules in fn say => let val prRule = fn {lhs,rhs,precedence,rulenum} => ((say o nontermToString) lhs; say " : "; app (fn s => (say (symbolToString s); say " ")) rhs) in fn i => prRule (rules sub i) end end in Verbose.printVerbose {termToString=termToString,nontermToString=nontermToString, table=table, stateErrs=stateErrs,errs = errs,entries = !entries, print=say, printCores=corePrint,printRule=printRule}; TextIO.closeOut f end else () end val parseGen = fn spec => let val (result,inputSource) = ParseGenParser.parse spec in make_parser(getResult result,spec,Header.error inputSource, errorOccurred inputSource) end end; mlton-20100608/regression/0000755000076600000240000000000011404470407013740 5ustar mtfstaffmlton-20100608/regression/.ignore0000644000076600000240000000030611404435617015227 0ustar mtfstaff*.dat *.dot *.mlb *.ssa *.ui *.uo PM RepeatParserCombinator.txt hardlinkA hardlinkA hardlinkB hardlinkB log outFuhMishra* testBinIO.txt testTextIO.txt testbadl testcycl testlink test.txt textio.tmp mlton-20100608/regression/1.ok0000644000076600000240000000006311404435617014436 0ustar mtfstaffunhandled exception: Overflow Nonzero exit status. mlton-20100608/regression/1.sml0000644000076600000240000000003511404435617014617 0ustar mtfstaffval _ = raise raise Overflow mlton-20100608/regression/10.sml0000644000076600000240000000004611404435617014701 0ustar mtfstaffval {...} = {hello = true, no = "no"} mlton-20100608/regression/11.sml0000644000076600000240000000010511404435617014676 0ustar mtfstaffval _ = let val x = SOME [] in (valOf x = [1], valOf x = [true]) end mlton-20100608/regression/12.sml0000644000076600000240000000010311404435617014675 0ustar mtfstafffun f x = x val _ = f (0w1: Word8.word) val _ = f (0w1: Word.word) mlton-20100608/regression/13.sml0000644000076600000240000000017411404435617014706 0ustar mtfstafffun plus (a, b) = a functor F () = struct val _ = plus (plus (1, 2), 3) end infix plus structure S = F () mlton-20100608/regression/14.sml0000644000076600000240000000013311404435617014702 0ustar mtfstaffdatatype t = A | B datatype u = C of t val _ = if C A = C B then raise Fail "bug" else () mlton-20100608/regression/15.ok0000644000076600000240000000000011404435620014504 0ustar mtfstaffmlton-20100608/regression/15.sml0000644000076600000240000000000011404435620014666 0ustar mtfstaffmlton-20100608/regression/16.ok0000644000076600000240000000001611404435621014515 0ustar mtfstaffHello, World! mlton-20100608/regression/16.sml0000644000076600000240000000003111404435620014673 0ustar mtfstaffprint "Hello, World!\n"; mlton-20100608/regression/17.ok0000644000076600000240000000001611404435621014516 0ustar mtfstaffHello, World! mlton-20100608/regression/17.sml0000644000076600000240000000004311404435621014700 0ustar mtfstaffprint "Hello,"; print " World!\n"; mlton-20100608/regression/18.ok0000644000076600000240000000001611404435617014524 0ustar mtfstaffHello, World! mlton-20100608/regression/18.sml0000644000076600000240000000006511404435617014712 0ustar mtfstaffprint "Hello,"; val _ = print " "; print "World!\n"; mlton-20100608/regression/19.ok0000644000076600000240000000001611404435617014525 0ustar mtfstaffHello, World! mlton-20100608/regression/19.sml0000644000076600000240000000010611404435617014707 0ustar mtfstaffprint "Hello,"; val _ = print " "; print "World!"; val _ = print "\n" mlton-20100608/regression/2.ok0000644000076600000240000000006311404435617014437 0ustar mtfstaffunhandled exception: Overflow Nonzero exit status. mlton-20100608/regression/2.sml0000644000076600000240000000014711404435617014624 0ustar mtfstaffdatatype t = A | B val f = fn A => 1 | B => 2 val _ = f(raise Overflow) val _ = f(raise Bind) mlton-20100608/regression/20.ok0000644000076600000240000000001611404435617014515 0ustar mtfstaffHello, World! mlton-20100608/regression/20.sml0000644000076600000240000000006411404435617014702 0ustar mtfstaffstructure S = struct end; print "Hello, World!\n"; mlton-20100608/regression/21.ok0000644000076600000240000000000011404435617014507 0ustar mtfstaffmlton-20100608/regression/21.sml0000644000076600000240000000003111404435617014675 0ustar mtfstaffval 'a rec f = fn x => x mlton-20100608/regression/22.ok0000644000076600000240000000000011404435617014510 0ustar mtfstaffmlton-20100608/regression/22.sml0000644000076600000240000000001311404435617014676 0ustar mtfstaffval _ = () mlton-20100608/regression/23.nonterm0000644000076600000240000000000011404435617015562 0ustar mtfstaffmlton-20100608/regression/23.sml0000644000076600000240000000011611404435617014703 0ustar mtfstafffun f l = case l of [] => f l | _ :: l => f l val _ = f [13] mlton-20100608/regression/3.sml0000644000076600000240000000016411404435620014616 0ustar mtfstaff(* Lexing tyvars *) type ('_a, '1a, ''a, '_, '', ''', ''1) t = int type u = (int, int, int, int, int, int, int) t mlton-20100608/regression/4.sml0000644000076600000240000000033311404435620014615 0ustar mtfstaff(* This code has a handler which is provably unreachable. *) fun f(n: int): int list = if n = 0 then [] else let val x = f(n - 1) in [13] handle e => (hd x + 1; raise e) end val _ = f 13 mlton-20100608/regression/5.sml0000644000076600000240000000050711404435621014622 0ustar mtfstaff(* Verifies that signature constraints change status *) structure S: sig val E: exn end = struct exception E end local open S in val E = E end val e = E structure S: sig type t val A: t end = struct datatype t = A end local open S in val A = A end val a = A mlton-20100608/regression/6.sml0000644000076600000240000000013211404435617014622 0ustar mtfstafffun f x = x val r: (int -> int) ref = ref f val _ = r := (fn y => y) val _ = !r 13 + 1 mlton-20100608/regression/7.sml0000644000076600000240000000021611404435617014626 0ustar mtfstafffun h f = f 13 fun f x = let fun z x = z(x + 1) in h z end val r : (int -> int) ref = ref f val _ = h(fn x => x) mlton-20100608/regression/8.sml0000644000076600000240000000004211404435617014624 0ustar mtfstaffval _ = {hello = true, 1 = "yes"} mlton-20100608/regression/9.sml0000644000076600000240000000006011404435617014625 0ustar mtfstafffun 'a f (x: 'a): 'a = x val y: int -> int = f mlton-20100608/regression/abcde.nonterm0000644000076600000240000000000011404435617016374 0ustar mtfstaffmlton-20100608/regression/abcde.sml0000644000076600000240000000014711404435617015521 0ustar mtfstafffun a x = (b x; c x) and b x = (a x; c x; d x) and c x = d x and d x = e x and e x = d x val _ = a 13 mlton-20100608/regression/abstype.ok0000644000076600000240000000000011404435617015734 0ustar mtfstaffmlton-20100608/regression/abstype.sml0000644000076600000240000000163011404435620016122 0ustar mtfstaffabstype t = T with val eq = op = end val _ = eq (3, 3) abstype t = T with val t = T val eq = op = end val _ = eq (t, t) abstype t = T with val t = T val eq = op = val _ = eq (t, t) end val _ = eq (2, 3) abstype t = T with val t = T val eq = op = val _ = eq (t, t) end val _ = eq (t, t) abstype t = T with val t = T val eq = op = val _ = eq (t, t) andalso eq (2, 3) end val _ = eq (2, 3) (* with abstype *) structure S = struct abstype s = S with val a = S end end signature F = sig val b : S.s end functor F() : F = struct type s = S.s val b = S.a end functor K() = struct structure F = F() end structure K = K() (* abstype.sml *) (* Checks equality inferred for abstype environments. *) abstype t = T with datatype u = U of t val eq = op= end fun eq1(t1, t2) = U t1 = U t2; fun eq2(t1, t2 : t) = eq(t1, t2); mlton-20100608/regression/all-overloads.sml0000644000076600000240000005757111404435617017244 0ustar mtfstaff(* This file is automatically generated. Do not edit. *) fun f (x: Int.int) = ~ x fun f (x: IntInf.int) = ~ x fun f (x: LargeInt.int) = ~ x fun f (x: FixedInt.int) = ~ x fun f (x: Position.int) = ~ x fun f (x: Int2.int) = ~ x fun f (x: Int3.int) = ~ x fun f (x: Int4.int) = ~ x fun f (x: Int5.int) = ~ x fun f (x: Int6.int) = ~ x fun f (x: Int7.int) = ~ x fun f (x: Int8.int) = ~ x fun f (x: Int9.int) = ~ x fun f (x: Int10.int) = ~ x fun f (x: Int11.int) = ~ x fun f (x: Int12.int) = ~ x fun f (x: Int13.int) = ~ x fun f (x: Int14.int) = ~ x fun f (x: Int15.int) = ~ x fun f (x: Int16.int) = ~ x fun f (x: Int17.int) = ~ x fun f (x: Int18.int) = ~ x fun f (x: Int19.int) = ~ x fun f (x: Int20.int) = ~ x fun f (x: Int21.int) = ~ x fun f (x: Int22.int) = ~ x fun f (x: Int23.int) = ~ x fun f (x: Int24.int) = ~ x fun f (x: Int25.int) = ~ x fun f (x: Int26.int) = ~ x fun f (x: Int27.int) = ~ x fun f (x: Int28.int) = ~ x fun f (x: Int29.int) = ~ x fun f (x: Int30.int) = ~ x fun f (x: Int31.int) = ~ x fun f (x: Int32.int) = ~ x fun f (x: Int64.int) = ~ x fun f (x: Word.word) = ~ x fun f (x: LargeWord.word) = ~ x fun f (x: SysWord.word) = ~ x fun f (x: Word2.word) = ~ x fun f (x: Word3.word) = ~ x fun f (x: Word4.word) = ~ x fun f (x: Word5.word) = ~ x fun f (x: Word6.word) = ~ x fun f (x: Word7.word) = ~ x fun f (x: Word8.word) = ~ x fun f (x: Word9.word) = ~ x fun f (x: Word10.word) = ~ x fun f (x: Word11.word) = ~ x fun f (x: Word12.word) = ~ x fun f (x: Word13.word) = ~ x fun f (x: Word14.word) = ~ x fun f (x: Word15.word) = ~ x fun f (x: Word16.word) = ~ x fun f (x: Word17.word) = ~ x fun f (x: Word18.word) = ~ x fun f (x: Word19.word) = ~ x fun f (x: Word20.word) = ~ x fun f (x: Word21.word) = ~ x fun f (x: Word22.word) = ~ x fun f (x: Word23.word) = ~ x fun f (x: Word24.word) = ~ x fun f (x: Word25.word) = ~ x fun f (x: Word26.word) = ~ x fun f (x: Word27.word) = ~ x fun f (x: Word28.word) = ~ x fun f (x: Word29.word) = ~ x fun f (x: Word30.word) = ~ x fun f (x: Word31.word) = ~ x fun f (x: Word32.word) = ~ x fun f (x: Word64.word) = ~ x fun f (x: Real.real) = ~ x fun f (x: Real32.real) = ~ x fun f (x: Real64.real) = ~ x fun f (x: LargeReal.real) = ~ x fun f (x: Int.int) = x + x fun f (x: IntInf.int) = x + x fun f (x: LargeInt.int) = x + x fun f (x: FixedInt.int) = x + x fun f (x: Position.int) = x + x fun f (x: Int2.int) = x + x fun f (x: Int3.int) = x + x fun f (x: Int4.int) = x + x fun f (x: Int5.int) = x + x fun f (x: Int6.int) = x + x fun f (x: Int7.int) = x + x fun f (x: Int8.int) = x + x fun f (x: Int9.int) = x + x fun f (x: Int10.int) = x + x fun f (x: Int11.int) = x + x fun f (x: Int12.int) = x + x fun f (x: Int13.int) = x + x fun f (x: Int14.int) = x + x fun f (x: Int15.int) = x + x fun f (x: Int16.int) = x + x fun f (x: Int17.int) = x + x fun f (x: Int18.int) = x + x fun f (x: Int19.int) = x + x fun f (x: Int20.int) = x + x fun f (x: Int21.int) = x + x fun f (x: Int22.int) = x + x fun f (x: Int23.int) = x + x fun f (x: Int24.int) = x + x fun f (x: Int25.int) = x + x fun f (x: Int26.int) = x + x fun f (x: Int27.int) = x + x fun f (x: Int28.int) = x + x fun f (x: Int29.int) = x + x fun f (x: Int30.int) = x + x fun f (x: Int31.int) = x + x fun f (x: Int32.int) = x + x fun f (x: Int64.int) = x + x fun f (x: Word.word) = x + x fun f (x: LargeWord.word) = x + x fun f (x: SysWord.word) = x + x fun f (x: Word2.word) = x + x fun f (x: Word3.word) = x + x fun f (x: Word4.word) = x + x fun f (x: Word5.word) = x + x fun f (x: Word6.word) = x + x fun f (x: Word7.word) = x + x fun f (x: Word8.word) = x + x fun f (x: Word9.word) = x + x fun f (x: Word10.word) = x + x fun f (x: Word11.word) = x + x fun f (x: Word12.word) = x + x fun f (x: Word13.word) = x + x fun f (x: Word14.word) = x + x fun f (x: Word15.word) = x + x fun f (x: Word16.word) = x + x fun f (x: Word17.word) = x + x fun f (x: Word18.word) = x + x fun f (x: Word19.word) = x + x fun f (x: Word20.word) = x + x fun f (x: Word21.word) = x + x fun f (x: Word22.word) = x + x fun f (x: Word23.word) = x + x fun f (x: Word24.word) = x + x fun f (x: Word25.word) = x + x fun f (x: Word26.word) = x + x fun f (x: Word27.word) = x + x fun f (x: Word28.word) = x + x fun f (x: Word29.word) = x + x fun f (x: Word30.word) = x + x fun f (x: Word31.word) = x + x fun f (x: Word32.word) = x + x fun f (x: Word64.word) = x + x fun f (x: Real.real) = x + x fun f (x: Real32.real) = x + x fun f (x: Real64.real) = x + x fun f (x: LargeReal.real) = x + x fun f (x: Int.int) = x - x fun f (x: IntInf.int) = x - x fun f (x: LargeInt.int) = x - x fun f (x: FixedInt.int) = x - x fun f (x: Position.int) = x - x fun f (x: Int2.int) = x - x fun f (x: Int3.int) = x - x fun f (x: Int4.int) = x - x fun f (x: Int5.int) = x - x fun f (x: Int6.int) = x - x fun f (x: Int7.int) = x - x fun f (x: Int8.int) = x - x fun f (x: Int9.int) = x - x fun f (x: Int10.int) = x - x fun f (x: Int11.int) = x - x fun f (x: Int12.int) = x - x fun f (x: Int13.int) = x - x fun f (x: Int14.int) = x - x fun f (x: Int15.int) = x - x fun f (x: Int16.int) = x - x fun f (x: Int17.int) = x - x fun f (x: Int18.int) = x - x fun f (x: Int19.int) = x - x fun f (x: Int20.int) = x - x fun f (x: Int21.int) = x - x fun f (x: Int22.int) = x - x fun f (x: Int23.int) = x - x fun f (x: Int24.int) = x - x fun f (x: Int25.int) = x - x fun f (x: Int26.int) = x - x fun f (x: Int27.int) = x - x fun f (x: Int28.int) = x - x fun f (x: Int29.int) = x - x fun f (x: Int30.int) = x - x fun f (x: Int31.int) = x - x fun f (x: Int32.int) = x - x fun f (x: Int64.int) = x - x fun f (x: Word.word) = x - x fun f (x: LargeWord.word) = x - x fun f (x: SysWord.word) = x - x fun f (x: Word2.word) = x - x fun f (x: Word3.word) = x - x fun f (x: Word4.word) = x - x fun f (x: Word5.word) = x - x fun f (x: Word6.word) = x - x fun f (x: Word7.word) = x - x fun f (x: Word8.word) = x - x fun f (x: Word9.word) = x - x fun f (x: Word10.word) = x - x fun f (x: Word11.word) = x - x fun f (x: Word12.word) = x - x fun f (x: Word13.word) = x - x fun f (x: Word14.word) = x - x fun f (x: Word15.word) = x - x fun f (x: Word16.word) = x - x fun f (x: Word17.word) = x - x fun f (x: Word18.word) = x - x fun f (x: Word19.word) = x - x fun f (x: Word20.word) = x - x fun f (x: Word21.word) = x - x fun f (x: Word22.word) = x - x fun f (x: Word23.word) = x - x fun f (x: Word24.word) = x - x fun f (x: Word25.word) = x - x fun f (x: Word26.word) = x - x fun f (x: Word27.word) = x - x fun f (x: Word28.word) = x - x fun f (x: Word29.word) = x - x fun f (x: Word30.word) = x - x fun f (x: Word31.word) = x - x fun f (x: Word32.word) = x - x fun f (x: Word64.word) = x - x fun f (x: Real.real) = x - x fun f (x: Real32.real) = x - x fun f (x: Real64.real) = x - x fun f (x: LargeReal.real) = x - x fun f (x: Int.int) = x * x fun f (x: IntInf.int) = x * x fun f (x: LargeInt.int) = x * x fun f (x: FixedInt.int) = x * x fun f (x: Position.int) = x * x fun f (x: Int2.int) = x * x fun f (x: Int3.int) = x * x fun f (x: Int4.int) = x * x fun f (x: Int5.int) = x * x fun f (x: Int6.int) = x * x fun f (x: Int7.int) = x * x fun f (x: Int8.int) = x * x fun f (x: Int9.int) = x * x fun f (x: Int10.int) = x * x fun f (x: Int11.int) = x * x fun f (x: Int12.int) = x * x fun f (x: Int13.int) = x * x fun f (x: Int14.int) = x * x fun f (x: Int15.int) = x * x fun f (x: Int16.int) = x * x fun f (x: Int17.int) = x * x fun f (x: Int18.int) = x * x fun f (x: Int19.int) = x * x fun f (x: Int20.int) = x * x fun f (x: Int21.int) = x * x fun f (x: Int22.int) = x * x fun f (x: Int23.int) = x * x fun f (x: Int24.int) = x * x fun f (x: Int25.int) = x * x fun f (x: Int26.int) = x * x fun f (x: Int27.int) = x * x fun f (x: Int28.int) = x * x fun f (x: Int29.int) = x * x fun f (x: Int30.int) = x * x fun f (x: Int31.int) = x * x fun f (x: Int32.int) = x * x fun f (x: Int64.int) = x * x fun f (x: Word.word) = x * x fun f (x: LargeWord.word) = x * x fun f (x: SysWord.word) = x * x fun f (x: Word2.word) = x * x fun f (x: Word3.word) = x * x fun f (x: Word4.word) = x * x fun f (x: Word5.word) = x * x fun f (x: Word6.word) = x * x fun f (x: Word7.word) = x * x fun f (x: Word8.word) = x * x fun f (x: Word9.word) = x * x fun f (x: Word10.word) = x * x fun f (x: Word11.word) = x * x fun f (x: Word12.word) = x * x fun f (x: Word13.word) = x * x fun f (x: Word14.word) = x * x fun f (x: Word15.word) = x * x fun f (x: Word16.word) = x * x fun f (x: Word17.word) = x * x fun f (x: Word18.word) = x * x fun f (x: Word19.word) = x * x fun f (x: Word20.word) = x * x fun f (x: Word21.word) = x * x fun f (x: Word22.word) = x * x fun f (x: Word23.word) = x * x fun f (x: Word24.word) = x * x fun f (x: Word25.word) = x * x fun f (x: Word26.word) = x * x fun f (x: Word27.word) = x * x fun f (x: Word28.word) = x * x fun f (x: Word29.word) = x * x fun f (x: Word30.word) = x * x fun f (x: Word31.word) = x * x fun f (x: Word32.word) = x * x fun f (x: Word64.word) = x * x fun f (x: Real.real) = x * x fun f (x: Real32.real) = x * x fun f (x: Real64.real) = x * x fun f (x: LargeReal.real) = x * x fun f (x: Real.real) = x / x fun f (x: Real32.real) = x / x fun f (x: Real64.real) = x / x fun f (x: LargeReal.real) = x / x fun f (x: Int.int) = x div x fun f (x: IntInf.int) = x div x fun f (x: LargeInt.int) = x div x fun f (x: FixedInt.int) = x div x fun f (x: Position.int) = x div x fun f (x: Int2.int) = x div x fun f (x: Int3.int) = x div x fun f (x: Int4.int) = x div x fun f (x: Int5.int) = x div x fun f (x: Int6.int) = x div x fun f (x: Int7.int) = x div x fun f (x: Int8.int) = x div x fun f (x: Int9.int) = x div x fun f (x: Int10.int) = x div x fun f (x: Int11.int) = x div x fun f (x: Int12.int) = x div x fun f (x: Int13.int) = x div x fun f (x: Int14.int) = x div x fun f (x: Int15.int) = x div x fun f (x: Int16.int) = x div x fun f (x: Int17.int) = x div x fun f (x: Int18.int) = x div x fun f (x: Int19.int) = x div x fun f (x: Int20.int) = x div x fun f (x: Int21.int) = x div x fun f (x: Int22.int) = x div x fun f (x: Int23.int) = x div x fun f (x: Int24.int) = x div x fun f (x: Int25.int) = x div x fun f (x: Int26.int) = x div x fun f (x: Int27.int) = x div x fun f (x: Int28.int) = x div x fun f (x: Int29.int) = x div x fun f (x: Int30.int) = x div x fun f (x: Int31.int) = x div x fun f (x: Int32.int) = x div x fun f (x: Int64.int) = x div x fun f (x: Word.word) = x div x fun f (x: LargeWord.word) = x div x fun f (x: SysWord.word) = x div x fun f (x: Word2.word) = x div x fun f (x: Word3.word) = x div x fun f (x: Word4.word) = x div x fun f (x: Word5.word) = x div x fun f (x: Word6.word) = x div x fun f (x: Word7.word) = x div x fun f (x: Word8.word) = x div x fun f (x: Word9.word) = x div x fun f (x: Word10.word) = x div x fun f (x: Word11.word) = x div x fun f (x: Word12.word) = x div x fun f (x: Word13.word) = x div x fun f (x: Word14.word) = x div x fun f (x: Word15.word) = x div x fun f (x: Word16.word) = x div x fun f (x: Word17.word) = x div x fun f (x: Word18.word) = x div x fun f (x: Word19.word) = x div x fun f (x: Word20.word) = x div x fun f (x: Word21.word) = x div x fun f (x: Word22.word) = x div x fun f (x: Word23.word) = x div x fun f (x: Word24.word) = x div x fun f (x: Word25.word) = x div x fun f (x: Word26.word) = x div x fun f (x: Word27.word) = x div x fun f (x: Word28.word) = x div x fun f (x: Word29.word) = x div x fun f (x: Word30.word) = x div x fun f (x: Word31.word) = x div x fun f (x: Word32.word) = x div x fun f (x: Word64.word) = x div x fun f (x: Int.int) = x mod x fun f (x: IntInf.int) = x mod x fun f (x: LargeInt.int) = x mod x fun f (x: FixedInt.int) = x mod x fun f (x: Position.int) = x mod x fun f (x: Int2.int) = x mod x fun f (x: Int3.int) = x mod x fun f (x: Int4.int) = x mod x fun f (x: Int5.int) = x mod x fun f (x: Int6.int) = x mod x fun f (x: Int7.int) = x mod x fun f (x: Int8.int) = x mod x fun f (x: Int9.int) = x mod x fun f (x: Int10.int) = x mod x fun f (x: Int11.int) = x mod x fun f (x: Int12.int) = x mod x fun f (x: Int13.int) = x mod x fun f (x: Int14.int) = x mod x fun f (x: Int15.int) = x mod x fun f (x: Int16.int) = x mod x fun f (x: Int17.int) = x mod x fun f (x: Int18.int) = x mod x fun f (x: Int19.int) = x mod x fun f (x: Int20.int) = x mod x fun f (x: Int21.int) = x mod x fun f (x: Int22.int) = x mod x fun f (x: Int23.int) = x mod x fun f (x: Int24.int) = x mod x fun f (x: Int25.int) = x mod x fun f (x: Int26.int) = x mod x fun f (x: Int27.int) = x mod x fun f (x: Int28.int) = x mod x fun f (x: Int29.int) = x mod x fun f (x: Int30.int) = x mod x fun f (x: Int31.int) = x mod x fun f (x: Int32.int) = x mod x fun f (x: Int64.int) = x mod x fun f (x: Word.word) = x mod x fun f (x: LargeWord.word) = x mod x fun f (x: SysWord.word) = x mod x fun f (x: Word2.word) = x mod x fun f (x: Word3.word) = x mod x fun f (x: Word4.word) = x mod x fun f (x: Word5.word) = x mod x fun f (x: Word6.word) = x mod x fun f (x: Word7.word) = x mod x fun f (x: Word8.word) = x mod x fun f (x: Word9.word) = x mod x fun f (x: Word10.word) = x mod x fun f (x: Word11.word) = x mod x fun f (x: Word12.word) = x mod x fun f (x: Word13.word) = x mod x fun f (x: Word14.word) = x mod x fun f (x: Word15.word) = x mod x fun f (x: Word16.word) = x mod x fun f (x: Word17.word) = x mod x fun f (x: Word18.word) = x mod x fun f (x: Word19.word) = x mod x fun f (x: Word20.word) = x mod x fun f (x: Word21.word) = x mod x fun f (x: Word22.word) = x mod x fun f (x: Word23.word) = x mod x fun f (x: Word24.word) = x mod x fun f (x: Word25.word) = x mod x fun f (x: Word26.word) = x mod x fun f (x: Word27.word) = x mod x fun f (x: Word28.word) = x mod x fun f (x: Word29.word) = x mod x fun f (x: Word30.word) = x mod x fun f (x: Word31.word) = x mod x fun f (x: Word32.word) = x mod x fun f (x: Word64.word) = x mod x fun f (x: Int.int) = abs x fun f (x: IntInf.int) = abs x fun f (x: LargeInt.int) = abs x fun f (x: FixedInt.int) = abs x fun f (x: Position.int) = abs x fun f (x: Int2.int) = abs x fun f (x: Int3.int) = abs x fun f (x: Int4.int) = abs x fun f (x: Int5.int) = abs x fun f (x: Int6.int) = abs x fun f (x: Int7.int) = abs x fun f (x: Int8.int) = abs x fun f (x: Int9.int) = abs x fun f (x: Int10.int) = abs x fun f (x: Int11.int) = abs x fun f (x: Int12.int) = abs x fun f (x: Int13.int) = abs x fun f (x: Int14.int) = abs x fun f (x: Int15.int) = abs x fun f (x: Int16.int) = abs x fun f (x: Int17.int) = abs x fun f (x: Int18.int) = abs x fun f (x: Int19.int) = abs x fun f (x: Int20.int) = abs x fun f (x: Int21.int) = abs x fun f (x: Int22.int) = abs x fun f (x: Int23.int) = abs x fun f (x: Int24.int) = abs x fun f (x: Int25.int) = abs x fun f (x: Int26.int) = abs x fun f (x: Int27.int) = abs x fun f (x: Int28.int) = abs x fun f (x: Int29.int) = abs x fun f (x: Int30.int) = abs x fun f (x: Int31.int) = abs x fun f (x: Int32.int) = abs x fun f (x: Int64.int) = abs x fun f (x: Real.real) = abs x fun f (x: Real32.real) = abs x fun f (x: Real64.real) = abs x fun f (x: LargeReal.real) = abs x fun f (x: Int.int) = x < x fun f (x: IntInf.int) = x < x fun f (x: LargeInt.int) = x < x fun f (x: FixedInt.int) = x < x fun f (x: Position.int) = x < x fun f (x: Int2.int) = x < x fun f (x: Int3.int) = x < x fun f (x: Int4.int) = x < x fun f (x: Int5.int) = x < x fun f (x: Int6.int) = x < x fun f (x: Int7.int) = x < x fun f (x: Int8.int) = x < x fun f (x: Int9.int) = x < x fun f (x: Int10.int) = x < x fun f (x: Int11.int) = x < x fun f (x: Int12.int) = x < x fun f (x: Int13.int) = x < x fun f (x: Int14.int) = x < x fun f (x: Int15.int) = x < x fun f (x: Int16.int) = x < x fun f (x: Int17.int) = x < x fun f (x: Int18.int) = x < x fun f (x: Int19.int) = x < x fun f (x: Int20.int) = x < x fun f (x: Int21.int) = x < x fun f (x: Int22.int) = x < x fun f (x: Int23.int) = x < x fun f (x: Int24.int) = x < x fun f (x: Int25.int) = x < x fun f (x: Int26.int) = x < x fun f (x: Int27.int) = x < x fun f (x: Int28.int) = x < x fun f (x: Int29.int) = x < x fun f (x: Int30.int) = x < x fun f (x: Int31.int) = x < x fun f (x: Int32.int) = x < x fun f (x: Int64.int) = x < x fun f (x: Word.word) = x < x fun f (x: LargeWord.word) = x < x fun f (x: SysWord.word) = x < x fun f (x: Word2.word) = x < x fun f (x: Word3.word) = x < x fun f (x: Word4.word) = x < x fun f (x: Word5.word) = x < x fun f (x: Word6.word) = x < x fun f (x: Word7.word) = x < x fun f (x: Word8.word) = x < x fun f (x: Word9.word) = x < x fun f (x: Word10.word) = x < x fun f (x: Word11.word) = x < x fun f (x: Word12.word) = x < x fun f (x: Word13.word) = x < x fun f (x: Word14.word) = x < x fun f (x: Word15.word) = x < x fun f (x: Word16.word) = x < x fun f (x: Word17.word) = x < x fun f (x: Word18.word) = x < x fun f (x: Word19.word) = x < x fun f (x: Word20.word) = x < x fun f (x: Word21.word) = x < x fun f (x: Word22.word) = x < x fun f (x: Word23.word) = x < x fun f (x: Word24.word) = x < x fun f (x: Word25.word) = x < x fun f (x: Word26.word) = x < x fun f (x: Word27.word) = x < x fun f (x: Word28.word) = x < x fun f (x: Word29.word) = x < x fun f (x: Word30.word) = x < x fun f (x: Word31.word) = x < x fun f (x: Word32.word) = x < x fun f (x: Word64.word) = x < x fun f (x: Real.real) = x < x fun f (x: Real32.real) = x < x fun f (x: Real64.real) = x < x fun f (x: LargeReal.real) = x < x fun f (x: Char.char) = x < x fun f (x: String.string) = x < x fun f (x: Int.int) = x <= x fun f (x: IntInf.int) = x <= x fun f (x: LargeInt.int) = x <= x fun f (x: FixedInt.int) = x <= x fun f (x: Position.int) = x <= x fun f (x: Int2.int) = x <= x fun f (x: Int3.int) = x <= x fun f (x: Int4.int) = x <= x fun f (x: Int5.int) = x <= x fun f (x: Int6.int) = x <= x fun f (x: Int7.int) = x <= x fun f (x: Int8.int) = x <= x fun f (x: Int9.int) = x <= x fun f (x: Int10.int) = x <= x fun f (x: Int11.int) = x <= x fun f (x: Int12.int) = x <= x fun f (x: Int13.int) = x <= x fun f (x: Int14.int) = x <= x fun f (x: Int15.int) = x <= x fun f (x: Int16.int) = x <= x fun f (x: Int17.int) = x <= x fun f (x: Int18.int) = x <= x fun f (x: Int19.int) = x <= x fun f (x: Int20.int) = x <= x fun f (x: Int21.int) = x <= x fun f (x: Int22.int) = x <= x fun f (x: Int23.int) = x <= x fun f (x: Int24.int) = x <= x fun f (x: Int25.int) = x <= x fun f (x: Int26.int) = x <= x fun f (x: Int27.int) = x <= x fun f (x: Int28.int) = x <= x fun f (x: Int29.int) = x <= x fun f (x: Int30.int) = x <= x fun f (x: Int31.int) = x <= x fun f (x: Int32.int) = x <= x fun f (x: Int64.int) = x <= x fun f (x: Word.word) = x <= x fun f (x: LargeWord.word) = x <= x fun f (x: SysWord.word) = x <= x fun f (x: Word2.word) = x <= x fun f (x: Word3.word) = x <= x fun f (x: Word4.word) = x <= x fun f (x: Word5.word) = x <= x fun f (x: Word6.word) = x <= x fun f (x: Word7.word) = x <= x fun f (x: Word8.word) = x <= x fun f (x: Word9.word) = x <= x fun f (x: Word10.word) = x <= x fun f (x: Word11.word) = x <= x fun f (x: Word12.word) = x <= x fun f (x: Word13.word) = x <= x fun f (x: Word14.word) = x <= x fun f (x: Word15.word) = x <= x fun f (x: Word16.word) = x <= x fun f (x: Word17.word) = x <= x fun f (x: Word18.word) = x <= x fun f (x: Word19.word) = x <= x fun f (x: Word20.word) = x <= x fun f (x: Word21.word) = x <= x fun f (x: Word22.word) = x <= x fun f (x: Word23.word) = x <= x fun f (x: Word24.word) = x <= x fun f (x: Word25.word) = x <= x fun f (x: Word26.word) = x <= x fun f (x: Word27.word) = x <= x fun f (x: Word28.word) = x <= x fun f (x: Word29.word) = x <= x fun f (x: Word30.word) = x <= x fun f (x: Word31.word) = x <= x fun f (x: Word32.word) = x <= x fun f (x: Word64.word) = x <= x fun f (x: Real.real) = x <= x fun f (x: Real32.real) = x <= x fun f (x: Real64.real) = x <= x fun f (x: LargeReal.real) = x <= x fun f (x: Char.char) = x <= x fun f (x: String.string) = x <= x fun f (x: Int.int) = x > x fun f (x: IntInf.int) = x > x fun f (x: LargeInt.int) = x > x fun f (x: FixedInt.int) = x > x fun f (x: Position.int) = x > x fun f (x: Int2.int) = x > x fun f (x: Int3.int) = x > x fun f (x: Int4.int) = x > x fun f (x: Int5.int) = x > x fun f (x: Int6.int) = x > x fun f (x: Int7.int) = x > x fun f (x: Int8.int) = x > x fun f (x: Int9.int) = x > x fun f (x: Int10.int) = x > x fun f (x: Int11.int) = x > x fun f (x: Int12.int) = x > x fun f (x: Int13.int) = x > x fun f (x: Int14.int) = x > x fun f (x: Int15.int) = x > x fun f (x: Int16.int) = x > x fun f (x: Int17.int) = x > x fun f (x: Int18.int) = x > x fun f (x: Int19.int) = x > x fun f (x: Int20.int) = x > x fun f (x: Int21.int) = x > x fun f (x: Int22.int) = x > x fun f (x: Int23.int) = x > x fun f (x: Int24.int) = x > x fun f (x: Int25.int) = x > x fun f (x: Int26.int) = x > x fun f (x: Int27.int) = x > x fun f (x: Int28.int) = x > x fun f (x: Int29.int) = x > x fun f (x: Int30.int) = x > x fun f (x: Int31.int) = x > x fun f (x: Int32.int) = x > x fun f (x: Int64.int) = x > x fun f (x: Word.word) = x > x fun f (x: LargeWord.word) = x > x fun f (x: SysWord.word) = x > x fun f (x: Word2.word) = x > x fun f (x: Word3.word) = x > x fun f (x: Word4.word) = x > x fun f (x: Word5.word) = x > x fun f (x: Word6.word) = x > x fun f (x: Word7.word) = x > x fun f (x: Word8.word) = x > x fun f (x: Word9.word) = x > x fun f (x: Word10.word) = x > x fun f (x: Word11.word) = x > x fun f (x: Word12.word) = x > x fun f (x: Word13.word) = x > x fun f (x: Word14.word) = x > x fun f (x: Word15.word) = x > x fun f (x: Word16.word) = x > x fun f (x: Word17.word) = x > x fun f (x: Word18.word) = x > x fun f (x: Word19.word) = x > x fun f (x: Word20.word) = x > x fun f (x: Word21.word) = x > x fun f (x: Word22.word) = x > x fun f (x: Word23.word) = x > x fun f (x: Word24.word) = x > x fun f (x: Word25.word) = x > x fun f (x: Word26.word) = x > x fun f (x: Word27.word) = x > x fun f (x: Word28.word) = x > x fun f (x: Word29.word) = x > x fun f (x: Word30.word) = x > x fun f (x: Word31.word) = x > x fun f (x: Word32.word) = x > x fun f (x: Word64.word) = x > x fun f (x: Real.real) = x > x fun f (x: Real32.real) = x > x fun f (x: Real64.real) = x > x fun f (x: LargeReal.real) = x > x fun f (x: Char.char) = x > x fun f (x: String.string) = x > x fun f (x: Int.int) = x >= x fun f (x: IntInf.int) = x >= x fun f (x: LargeInt.int) = x >= x fun f (x: FixedInt.int) = x >= x fun f (x: Position.int) = x >= x fun f (x: Int2.int) = x >= x fun f (x: Int3.int) = x >= x fun f (x: Int4.int) = x >= x fun f (x: Int5.int) = x >= x fun f (x: Int6.int) = x >= x fun f (x: Int7.int) = x >= x fun f (x: Int8.int) = x >= x fun f (x: Int9.int) = x >= x fun f (x: Int10.int) = x >= x fun f (x: Int11.int) = x >= x fun f (x: Int12.int) = x >= x fun f (x: Int13.int) = x >= x fun f (x: Int14.int) = x >= x fun f (x: Int15.int) = x >= x fun f (x: Int16.int) = x >= x fun f (x: Int17.int) = x >= x fun f (x: Int18.int) = x >= x fun f (x: Int19.int) = x >= x fun f (x: Int20.int) = x >= x fun f (x: Int21.int) = x >= x fun f (x: Int22.int) = x >= x fun f (x: Int23.int) = x >= x fun f (x: Int24.int) = x >= x fun f (x: Int25.int) = x >= x fun f (x: Int26.int) = x >= x fun f (x: Int27.int) = x >= x fun f (x: Int28.int) = x >= x fun f (x: Int29.int) = x >= x fun f (x: Int30.int) = x >= x fun f (x: Int31.int) = x >= x fun f (x: Int32.int) = x >= x fun f (x: Int64.int) = x >= x fun f (x: Word.word) = x >= x fun f (x: LargeWord.word) = x >= x fun f (x: SysWord.word) = x >= x fun f (x: Word2.word) = x >= x fun f (x: Word3.word) = x >= x fun f (x: Word4.word) = x >= x fun f (x: Word5.word) = x >= x fun f (x: Word6.word) = x >= x fun f (x: Word7.word) = x >= x fun f (x: Word8.word) = x >= x fun f (x: Word9.word) = x >= x fun f (x: Word10.word) = x >= x fun f (x: Word11.word) = x >= x fun f (x: Word12.word) = x >= x fun f (x: Word13.word) = x >= x fun f (x: Word14.word) = x >= x fun f (x: Word15.word) = x >= x fun f (x: Word16.word) = x >= x fun f (x: Word17.word) = x >= x fun f (x: Word18.word) = x >= x fun f (x: Word19.word) = x >= x fun f (x: Word20.word) = x >= x fun f (x: Word21.word) = x >= x fun f (x: Word22.word) = x >= x fun f (x: Word23.word) = x >= x fun f (x: Word24.word) = x >= x fun f (x: Word25.word) = x >= x fun f (x: Word26.word) = x >= x fun f (x: Word27.word) = x >= x fun f (x: Word28.word) = x >= x fun f (x: Word29.word) = x >= x fun f (x: Word30.word) = x >= x fun f (x: Word31.word) = x >= x fun f (x: Word32.word) = x >= x fun f (x: Word64.word) = x >= x fun f (x: Real.real) = x >= x fun f (x: Real32.real) = x >= x fun f (x: Real64.real) = x >= x fun f (x: LargeReal.real) = x >= x fun f (x: Char.char) = x >= x fun f (x: String.string) = x >= x mlton-20100608/regression/args-create.ok0000644000076600000240000000000411404435617016466 0ustar mtfstaffOK! mlton-20100608/regression/args-create.sml0000644000076600000240000000163711404435620016657 0ustar mtfstaffval tests = [ "\"hello\\\"", "c:\\foo.bah", "", "hi\\", "hi\"", "evil\narg", "evil\targ", "evil arg", "evil\rarg", "evil\farg", "\"bar\\", "\\bah", "bah \\bar", "bah\\bar", "bah\\\\", "ba h\\\\", "holy\"smoke", "holy \"smoke" ] val cmd = CommandLine.name () val args = CommandLine.arguments () fun loop ([], []) = print "OK!\n" | loop (x::r, y::s) = (if x <> y then print ("FAIL: "^x^":"^y^"\n") else (); loop (r, s)) | loop (_, _) = print "Wrong argument count\n" open MLton.Process val () = if List.length args = 0 then let val pid = create {args = (*cmd::*)tests, env = NONE, path = cmd, stderr = Param.self, stdin = Param.self, stdout = Param.self} val status = reap pid in () end else loop (tests, args) mlton-20100608/regression/args-spawn.ok0000644000076600000240000000000411404435617016353 0ustar mtfstaffOK! mlton-20100608/regression/args-spawn.sml0000644000076600000240000000137611404435617016552 0ustar mtfstaffval tests = [ "\"hello\\\"", "c:\\foo.bah", "", "hi\\", "hi\"", "evil\narg", "evil\targ", "evil arg", "evil\rarg", "evil\farg", "\"bar\\", "\\bah", "bah \\bar", "bah\\bar", "bah\\\\", "ba h\\\\", "holy\"smoke", "holy \"smoke" ] val cmd = CommandLine.name () val args = CommandLine.arguments () fun loop ([], []) = print "OK!\n" | loop (x::r, y::s) = (if x <> y then print ("FAIL: "^x^":"^y^"\n") else (); loop (r, s)) | loop (_, _) = print "Wrong argument count\n" open Posix.Process open MLton.Process val () = if List.length args = 0 then let val pid = spawn {path = cmd, args = cmd::tests} val status = waitpid (W_CHILD pid, []) in () end else loop (tests, args) mlton-20100608/regression/array.ok0000644000076600000240000000213611404435617015417 0ustar mtfstaffTesting Array... test1 OK test2 OK test3 OK test4a OK test4b OK test4c OK test5a OK test5b OK test6a OK test6b OK test6c OK test7 OK test8a OK test8b OK test9 OK test9a OK test9b OK test9i OK test9j OK test10a OK test10b OK test10c OK test10d OK test10e OK test10f OK test10g OK test10h OK test10i OK test11a OK test11b OK test11c OK test11d OK test11e OK test11f OK test11g OK test11h OK test11i OK test11j OK test11k OK test12a OK test12b OK test12c OK test12d OK test12e OK test13a OK test13b OK test13c OK test13d OK test13e OK test13f OK test13g OK test13h OK test13i OK test13j OK test13k OK test13l OK test13m OK test13n OK test14a OK test14b OK test15a OK test15b OK test15c OK test15d OK test15e OK test15f OK test15g OK test15h OK test16a OK test16b OK test16c OK test16d OK test16e OK test16f OK test16g OK mlton-20100608/regression/array.sml0000644000076600000240000004217211404435620015577 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/array.sml -- some test cases for Array PS 1994-12-10, 1995-06-14, 1995-11-07 *) val _ = print "Testing Array...\n" local open Array infix 9 sub val array0 : int array = fromList [] fun extract (arr, s, l) = ArraySlice.vector (ArraySlice.slice (arr, s, l)) val copy = fn {src, si, len, dst, di} => ArraySlice.copy {src = ArraySlice.slice (src, si, len), dst = dst, di = di} fun foldli f b (arr, s, l) = ArraySlice.foldli (fn (i,x,y) => f (i+s,x,y)) b (ArraySlice.slice (arr, s, l)) fun foldri f b (arr, s, l) = ArraySlice.foldri (fn (i,x,y) => f (i+s,x,y)) b (ArraySlice.slice (arr, s, l)) fun appi f (arr, s, l) = ArraySlice.appi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l)) fun modifyi f (arr, s, l) = ArraySlice.modifyi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l)) fun findi f (arr, s, l) = ArraySlice.findi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l)) in val a = fromList [1,11,21,31,41,51,61]; val b = fromList [441,551,661]; val c = fromList [1,11,21,31,41,51,61]; val test1 = tst' "test1" (fn () => a<>c); val test2 = tst' "test2" (fn () => array(0, 11) <> array0 andalso array(0,()) <> tabulate(0, fn _ => ()) andalso tabulate(0, fn _ => ()) <> fromList [] andalso fromList [] <> fromList [] andalso array(0, ()) <> array(0, ()) andalso tabulate(0, fn _ => ()) <> tabulate(0, fn _ => ())); val d = tabulate(100, fn i => i mod 7 * 10 + 1); val test3 = tst' "test3" (fn () => d sub 27 = 61); val test4a = tst0 "test4a" ((tabulate(maxLen+1, fn i => i) seq "WRONG") handle Overflow => "OK" | Size => "OK" | _ => "WRONG"); val test4b = tst0 "test4b" ((tabulate(~1, fn i => i) seq "WRONG") handle Size => "OK" | _ => "WRONG"); val test4c = tst' "test4c" (fn () => length (tabulate(0, fn i => i div 0)) = 0); val test5a = tst' "test5a" (fn () => length (fromList []) = 0 andalso length a = 7); val test5b = tst' "test5b" (fn () => length array0 = 0); val test6a = tst0 "test6a" ((c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test6b = tst0 "test6b" ((c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test6c = tst' "test6c" (fn () => c sub 0 = 1); val e = array(203, 0); val _ = (copy{src=d, si=0, dst=e, di=0, len=NONE}; copy{src=b, si=0, dst=e, di=length d, len=NONE}; copy{src=d, si=0, dst=e, di=length d + length b, len=NONE}); fun a2v a = extract(a, 0, NONE); val ev = Vector.concat [a2v d, a2v b, a2v d]; (* length e = 203 *) val test7 = tst' "test7" (fn () => length e = 203); val test8a = tst0 "test8a" ((update(e, ~1, 99) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test8b = tst0 "test8b" ((update(e, length e, 99) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val f = extract (e, 100, SOME 3); val test9 = tst' "test9" (fn () => f = a2v b); val test9a = tst' "test9a" (fn () => ev = extract(e, 0, SOME (length e)) andalso ev = extract(e, 0, NONE)); val test9b = tst' "test9b" (fn () => Vector.fromList [] = extract(e, 100, SOME 0)); val test9c = (extract(e, ~1, SOME (length e)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9d = (extract(e, length e+1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9e = (extract(e, 0, SOME (length e+1)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9f = (extract(e, 20, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9g = (extract(e, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9h = (extract(e, length e+1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val test9i = tst' "test9i" (fn () => a2v (fromList []) = extract(e, length e, SOME 0) andalso a2v (fromList []) = extract(e, length e, NONE)); val test9j = tst' "test9j" (fn () => extract(e, 3, SOME(length e - 3)) = extract(e, 3, NONE)); val _ = copy{src=e, si=0, dst=e, di=0, len=NONE}; val g = array(203, 9999999); val _ = copy{src=e, si=0, dst=g, di=0, len=NONE}; val test10a = tst' "test10a" (fn () => ev = extract(e, 0, SOME (length e)) andalso ev = extract(e, 0, NONE)); val test10b = tst' "test10b" (fn () => ev = extract(g, 0, SOME (length g)) andalso ev = extract(g, 0, NONE)); val _ = copy{src=g, si=203, dst=g, di=0, len=SOME 0}; val test10c = tst' "test10c" (fn () => ev = extract(g, 0, SOME (length g))); val _ = copy{src=g, si=0, dst=g, di=203, len=SOME 0}; val test10d = tst' "test10d" (fn () => ev = extract(g, 0, SOME (length g))); val _ = copy{src=g, si=0, dst=g, di=1, len=SOME (length g-1)}; val test10e = tst' "test10e" (fn () => a2v b = extract(g, 101, SOME 3)); val _ = copy{src=g, si=1, dst=g, di=0, len=SOME (length g-1)}; val test10f = tst' "test10f" (fn () => a2v b = extract(g, 100, SOME 3)); val _ = copy{src=g, si=202, dst=g, di=202, len=SOME 1}; val test10g = tst' "test10g" (fn () => g sub 202 = 10 * (202-1-103) mod 7 + 1); val test10h = tst' "test10h" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=SOME 0}; array0 <> array(0, 999999))); val test10i = tst' "test10i" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=NONE}; array0 <> array(0, 999999))); val test11a = tst0 "test11a" ((copy{src=g, si= ~1, dst=g, di=0, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11b = tst0 "test11b" ((copy{src=g, si=0, dst=g, di= ~1, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11c = tst0 "test11c" ((copy{src=g, si=1, dst=g, di=0, len=NONE}; "OK") handle _ => "WRONG") val test11d = tst0 "test11d" ((copy{src=g, si=0, dst=g, di=1, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11e = tst0 "test11e" ((copy{src=g, si=203, dst=g, di=0, len=NONE}; "OK") handle _ => "WRONG") val test11f = tst0 "test11f" ((copy{src=g, si= ~1, dst=g, di=0, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11g = tst0 "test11g" ((copy{src=g, si=0, dst=g, di= ~1, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11h = tst0 "test11h" ((copy{src=g, si=1, dst=g, di=0, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11i = tst0 "test11i" ((copy{src=g, si=0, dst=g, di=1, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11j = tst0 "test11j" ((copy{src=g, si=0, dst=g, di=0, len=SOME (length g+1)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11k = tst0 "test11k" ((copy{src=g, si=203, dst=g, di=0, len=SOME 1}; "WRONG") handle Subscript => "OK" | _ => "WRONG") local val v = ref 0 fun setv c = v := c; fun addv c = v := c + !v; fun setvi (i, c) = v := c + i; fun addvi (i, c) = v := c + i + !v; fun cons (x,r) = x :: r fun consi (i,x,r) = (i,x) :: r val inplist = [7,9,13]; val inp = fromList inplist val pni = fromList (rev inplist) fun copyinp a = copy{src=inp, si=0, dst=a, di=0, len=NONE} in val array0 = fromList [] : int array; val test12a = tst' "test12a" (fn _ => foldl cons [1,2] array0 = [1,2] andalso foldl cons [1,2] inp = [13,9,7,1,2] andalso (foldl (fn (x, _) => setv x) () inp; !v = 13)); val test12b = tst' "test12b" (fn _ => foldr cons [1,2] array0 = [1,2] andalso foldr cons [1,2] inp = [7,9,13,1,2] andalso (foldr (fn (x, _) => setv x) () inp; !v = 7)); val test12c = tst' "test12c" (fn _ => find (fn _ => true) array0 = NONE andalso find (fn _ => false) inp = NONE andalso find (fn x => x=7) inp = SOME 7 andalso find (fn x => x=9) inp = SOME 9 andalso (setv 0; find (fn x => (addv x; x=9)) inp; !v = 7+9)); val test12d = tst' "test12d" (fn _ => (setv 117; app setv array0; !v = 117) andalso (setv 0; app addv inp; !v = 7+9+13) andalso (app setv inp; !v = 13)); val test12e = let val a = array(length inp, inp sub 0) in tst' "test12e" (fn _ => (modify (~ : int -> int) array0; true) andalso (copyinp a; modify ~ a; foldr (op::) [] a = map ~ inplist) andalso (setv 117; modify (fn x => (setv x; 37)) a; !v = ~13)) end val test13a = tst' "test13a" (fn _ => foldli consi [] (array0, 0, NONE) = [] andalso foldri consi [] (array0, 0, NONE) = [] andalso foldli consi [] (inp, 0, NONE) = [(2,13),(1,9),(0,7)] andalso foldri consi [] (inp, 0, NONE) = [(0,7),(1,9),(2,13)]) val test13b = tst' "test13b" (fn _ => foldli consi [] (array0, 0, SOME 0) = [] andalso foldri consi [] (array0, 0, SOME 0) = [] andalso foldli consi [] (inp, 0, SOME 0) = [] andalso foldri consi [] (inp, 0, SOME 0) = [] andalso foldli consi [] (inp, 3, SOME 0) = [] andalso foldri consi [] (inp, 3, SOME 0) = [] andalso foldli consi [] (inp, 0, SOME 3) = [(2,13),(1,9),(0,7)] andalso foldri consi [] (inp, 0, SOME 3) = [(0,7),(1,9),(2,13)] andalso foldli consi [] (inp, 0, SOME 2) = [(1,9),(0,7)] andalso foldri consi [] (inp, 0, SOME 2) = [(0,7),(1,9)] andalso foldli consi [] (inp, 1, SOME 2) = [(2,13),(1,9)] andalso foldri consi [] (inp, 1, SOME 2) = [(1,9),(2,13)] andalso foldli consi [] (inp, 2, SOME 1) = [(2,13)] andalso foldri consi [] (inp, 2, SOME 1) = [(2,13)]); val test13c = tst0 "test13c" ((foldli consi [] (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13d = tst0 "test13d" ((foldli consi [] (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13e = tst0 "test13e" ((foldli consi [] (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13f = tst0 "test13f" ((foldli consi [] (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13g = tst0 "test13g" ((foldli consi [] (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13h = tst0 "test13h" ((foldli consi [] (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13i = tst0 "test13i" ((foldri consi [] (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13j = tst0 "test13j" ((foldri consi [] (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13k = tst0 "test13k" ((foldri consi [] (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13l = tst0 "test13l" ((foldri consi [] (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13m = tst0 "test13m" ((foldri consi [] (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test13n = tst0 "test13n" ((foldri consi [] (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test14a = tst' "test14a" (fn _ => findi (fn _ => true) (array0, 0, NONE) = NONE andalso findi (fn _ => false) (inp, 0, NONE) = NONE andalso findi (fn (i, x) => x=9 orelse 117 div (2-i) = 0) (inp, 0, NONE) = SOME (1,9)); val test14b = tst' "test14b" (fn _ => findi (fn _ => true) (array0, 0, SOME 0) = NONE andalso findi (fn _ => false) (inp, 0, NONE) = NONE andalso findi (fn (i, x) => x=9 orelse 117 div (2-i) = 0) (inp, 0, NONE) = SOME (1,9)); val test14c = (findi (fn _ => true) (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14d = (findi (fn _ => true) (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14e = (findi (fn _ => true) (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14f = (findi (fn _ => true) (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14g = (findi (fn _ => true) (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test14h = (findi (fn _ => true) (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val test15a = tst' "test15a" (fn _ => (setvi (0,117); appi setvi (array0, 0, NONE); !v = 117) andalso (setvi (0,0); appi addvi (inp, 0, NONE); !v = 0+7+1+9+2+13) andalso (appi setvi (inp, 0, NONE); !v = 2+13)); val test15b = tst' "test15b" (fn _ => (setvi (0,117); appi setvi (array0, 0, SOME 0); !v = 117) andalso (setvi (0,0); appi addvi (inp, 0, SOME 0); !v = 0) andalso (setvi (0,0); appi addvi (inp, 3, SOME 0); !v = 0) andalso (setvi (0,0); appi addvi (inp, 0, SOME 2); !v = 0+7+1+9) andalso (setvi (0,0); appi addvi (inp, 1, SOME 2); !v = 1+9+2+13) andalso (setvi (0,0); appi addvi (inp, 0, SOME 3); !v = 0+7+1+9+2+13) andalso (appi setvi (inp, 1, SOME 2); !v = 2+13) andalso (appi setvi (inp, 0, SOME 2); !v = 1+9) andalso (appi setvi (inp, 0, SOME 1); !v = 0+7) andalso (appi setvi (inp, 0, SOME 3); !v = 2+13)); val test15c = tst0 "test15c" ((appi setvi (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15d = tst0 "test15d" ((appi setvi (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15e = tst0 "test15e" ((appi setvi (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15f = tst0 "test15f" ((appi setvi (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15g = tst0 "test15g" ((appi setvi (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test15h = tst0 "test15h" ((appi setvi (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16a = let val a = array(length inp, inp sub 0) in tst' "test16a" (fn _ => (modifyi (op +) (array0, 0, NONE); true) andalso (modifyi (op +) (array0, 0, SOME 0); true) andalso (copyinp a; modifyi (op -) (a, 0, SOME 0); foldr (op::) [] a = [7,9,13]) andalso (copyinp a; modifyi (op -) (a, 3, SOME 0); foldr (op::) [] a = [7,9,13]) andalso (copyinp a; modifyi (op -) (a, 0, NONE); foldr (op::) [] a = [~7,~8,~11]) andalso (copyinp a; modifyi (op -) (a, 0, SOME 3); foldr (op::) [] a = [~7,~8,~11]) andalso (copyinp a; modifyi (op -) (a, 0, SOME 2); foldr (op::) [] a = [~7,~8,13]) andalso (copyinp a; modifyi (op -) (a, 1, SOME 2); foldr (op::) [] a = [7,~8,~11]) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 0, NONE); !v = 2+13) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 0, SOME 3); !v = 2+13) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 1, SOME 2); !v = 2+13) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 0, SOME 2); !v = 1+9) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 0, SOME 0); !v = 117) andalso (copyinp a; setv 117; modifyi (fn x => (setvi x; 37)) (a, 3, SOME 0); !v = 117)) end val test16b = tst0 "test16b" ((modifyi (op+) (inp, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16c = tst0 "test16c" ((modifyi (op+) (inp, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16d = tst0 "test16d" ((modifyi (op+) (inp, ~1, SOME 2) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16e = tst0 "test16e" ((modifyi (op+) (inp, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16f = tst0 "test16f" ((modifyi (op+) (inp, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test16g = tst0 "test16g" ((modifyi (op+) (inp, 2, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); end end mlton-20100608/regression/array2.ok0000644000076600000240000000040411404435620015467 0ustar mtfstaff(0, 0, 1) (0, 1, 2) (0, 2, 3) (0, 3, 4) (1, 0, 5) (1, 1, 6) (1, 2, 7) (1, 3, 8) (2, 0, 9) (2, 1, 10) (2, 2, 11) (2, 3, 12) (0, 0, 13) (1, 0, 14) (2, 0, 15) (0, 1, 16) (1, 1, 17) (2, 1, 18) (0, 2, 19) (1, 2, 20) (2, 2, 21) (0, 3, 22) (1, 3, 23) (2, 3, 24) OKOK mlton-20100608/regression/array2.sml0000644000076600000240000000116611404435621015660 0ustar mtfstaffopen Array2 val x = ref 0 val i2s = Int.toString fun test trv = let val a = tabulate trv (3, 4, fn (r, c) => (x := !x + 1 ; concat["(", i2s r, ", ", i2s c, ", ", i2s(!x), ")"])) val _ = app trv (fn s => (print s; print "\n")) a in () end val _ = (test RowMajor; test ColMajor) (* Check that Size is correctly raised when constructing large arrays. *) val m = valOf Int.maxInt val _ = (array (m, 2, 13) ; print "FAIL") handle Size => print "OK" val _ = (tabulate RowMajor (m, 2, fn _ => 13) ; print "FAIL") handle Size => print "OK\n" mlton-20100608/regression/array3.ok0000644000076600000240000000000011404435620015460 0ustar mtfstaffmlton-20100608/regression/array3.sml0000644000076600000240000000033211404435617015660 0ustar mtfstaffopen Array val a = array (1000, 0) fun g i = (update (a, i, i); g (i + 1)) fun f i = if i = 100 then g i else (update (a, i, 0); f (i + 1)) val _ = f 0 handle Subscript => () val _ = sub (a, 0) + 1 mlton-20100608/regression/array4.ok0000644000076600000240000000000011404435621015462 0ustar mtfstaffmlton-20100608/regression/array4.sml0000644000076600000240000000024011404435617015657 0ustar mtfstafffun f n = if 0 = Array.sub (Array.tabulate (n, fn i => i), 0) then () else f 13 val _ = (f 0; raise Fail "bug") handle Subscript => () val _ = f 1 mlton-20100608/regression/array5.ok0000644000076600000240000000024511404435621015476 0ustar mtfstaff13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 0 1 2 3 4 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 1 4 7 2 5 8 3 6 9 mlton-20100608/regression/array5.sml0000644000076600000240000000213411404435617015664 0ustar mtfstaffopen Array2 fun printa a = let val (rows, cols) = dimensions a fun loopRows r = if r = rows then () else (let fun loopCols c = if c = cols then () else (print(Int.toString(sub(a, r, c))) ; print " " ; loopCols(c + 1)) in loopCols 0 end; print "\n"; loopRows(r + 1)) in loopRows 0 end val a1 = array(4, 5, 13) val _ = (printa a1; modifyi RowMajor (fn (x, y, _) => x + y) {base = a1, row = 0, col = 0, nrows = NONE, ncols = NONE}; printa a1) val a2 = fromList[[1, 2], [3, 4], [5, 6]] val _ = printa a2 fun bogus l = (fromList l; false) handle Size => true val _ = (bogus[[1], [2, 3]]; bogus[[], [1]]) val a3 = let val r = ref 0 in tabulate RowMajor (3, 3, fn _ => (r := !r + 1 ; !r)) end val _ = printa a3 val a4 = let val r = ref 0 in tabulate ColMajor (3, 3, fn _ => (r := !r + 1 ; !r)) end val _ = printa a4 mlton-20100608/regression/array6.ok0000644000076600000240000000000011404435617015471 0ustar mtfstaffmlton-20100608/regression/array6.sml0000644000076600000240000000611511404435617015670 0ustar mtfstaff(* Test various basis library functions. Quite incomplete. This program should terminate without raising an exception and without printing anything if no bugs are discovered. If a bug is discovered, "assertion failed:" will be printed, followed by a string uniquely identifying the bug. *) fun assert (msg,b) = ((*print (concat ["trying " ^ msg ^ "\n"]);*) if b then () else print ("assertion failed: " ^ msg ^ "\n")) (*------------------------------------------------------------------*) (* Array *) (*------------------------------------------------------------------*) local open Array fun extract (arr, s, l) = ArraySlice.vector (ArraySlice.slice (arr, s, l)) val copy = fn {src, si, len, dst, di} => ArraySlice.copy {src = ArraySlice.slice (src, si, len), dst = dst, di = di} fun appi f (arr, s, l) = ArraySlice.appi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l)) val a0 = array (0,()) val a1 = array (100,1) val a2 = fromList [0,1,2] val a3 = tabulate (13, fn x => x) val _ = update (a3,11,9) val v1 = extract (a3, 0, NONE) val v2 = extract (a3, 1, SOME 3) val a4 = array (10,47) val _ = copy {src = a3, si = 10, len = SOME 3, dst = a4, di = 1} val a5 = array (100, 0) val _ = appi (fn (i,_) => update (a5,i,i)) (a5, 0, NONE) val _ = List.app assert [("Array.length 0", length a0 = 0), ("Array.length 1", length a1 = 100), ("Array.length 2", length a2 = 3), ("Array.length 3", length a3 = 13), ("Array.sub 1", sub (a1, 50) = 1), ("Array.sub 2", sub (a2, 2) = 2), ("Array.sub 3a", sub (a3, 10) = 10), ("Array.sub 3b", sub (a3, 11) = 9), ("Vector.length 1", Vector.length v1 = 13), ("Vector.length 2", Vector.length v2 = 3), ("Vector.sub 1", sub (a4, 1) = sub (a3, 10)), ("Vector.sub 2", sub (a4, 2) = sub (a3, 11)), ("Vector.sub 3", sub (a4, 3) = sub (a3, 12)), ("Vector.sub 4", sub (a5, 50) = 50)] fun swap (a,i,j) = let val t = sub (a,i) in update (a, i, sub (a,j)) ; update (a, j, t) end fun bubbleSort (a, op <) = let val n = length a fun loop i = if i = n then () else (let fun loop j = if j = 0 then () else if sub (a,j) < sub (a,j-1) then (swap (a,j,j-1) ; loop (j-1)) else () in loop i end ; loop (i+1)) in loop 0 end fun isSorted (a, op <=) = let val max = length a - 1 fun loop i = i = max orelse (sub (a, i) <= sub (a, i + 1) andalso loop (i + 1)) in loop 0 end val size = 2000 val a = tabulate (size, fn i => size - i) val _ = bubbleSort (a, op <) val _ = assert ("bubbleSort", isSorted (a, op <=)) in end mlton-20100608/regression/array7.ok0000644000076600000240000000000011404435617015472 0ustar mtfstaffmlton-20100608/regression/array7.sml0000644000076600000240000000047411404435617015673 0ustar mtfstaff(* This program tests the implementation of arrays whose length is important but * whose elements aren't. *) open Array val a = array (2, #"a") val _ = update (a, 0, #"b") val n = if sub (a, 0) = #"b" then 2 else 1 val _ = if 2 = length (array (n, 13)) then () else raise Fail "bug" mlton-20100608/regression/asterisk.ok0000644000076600000240000000000011404435617016112 0ustar mtfstaffmlton-20100608/regression/asterisk.sml0000644000076600000240000000013011404435617016300 0ustar mtfstaff(* asterisk.sml *) (* Checks parsing of "* )". *) val op* : int * int -> int = (op*); mlton-20100608/regression/basis-sharing.sml0000644000076600000240000003451311404435620017213 0ustar mtfstaffval id = fn x => x val _ = fn () => (() ; id: 'a Array.array -> 'a array ; id: 'a Array.vector -> 'a vector ; id: BinIO.StreamIO.elem -> Word8.word ; id: BinIO.StreamIO.pos -> BinPrimIO.pos ; id: BinIO.StreamIO.reader -> BinPrimIO.reader ; id: BinIO.StreamIO.vector -> Word8Vector.vector ; id: BinIO.StreamIO.writer -> BinPrimIO.writer ; id: BinPrimIO.array -> Word8Array.array ; id: BinPrimIO.elem -> Word8.word ; id: BinPrimIO.pos -> Position.int ; id: BinPrimIO.vector -> Word8Vector.vector ; id: Bool.bool -> bool ; id: BoolArray.elem -> Bool.bool ; id: BoolArray.vector -> BoolVector.vector ; id: BoolArray2.elem -> Bool.bool ; id: BoolArray2.vector -> BoolVector.vector ; id: BoolArraySlice.array -> BoolArray.array ; id: BoolArraySlice.elem -> Bool.bool ; id: BoolArraySlice.vector -> BoolVector.vector ; id: BoolArraySlice.vector_slice -> BoolVectorSlice.slice ; id: BoolVector.elem -> Bool.bool ; id: BoolVectorSlice.elem -> BoolVector.elem ; id: BoolVectorSlice.vector -> BoolVector.vector ; id: Char.char -> char ; id: Char.string -> String.string ; id: CharArray.elem -> Char.char ; id: CharArray.vector -> CharVector.vector ; id: CharArray2.elem -> Char.char ; id: CharArray2.vector -> CharVector.vector ; id: CharArraySlice.array -> CharArray.array ; id: CharArraySlice.elem -> Char.char ; id: CharArraySlice.vector -> CharVector.vector ; id: CharArraySlice.vector_slice -> CharVectorSlice.slice ; id: CharVector.elem -> Char.char ; id: CharVector.vector -> String.string ; id: CharVectorSlice.elem -> char ; id: CharVectorSlice.slice -> Substring.substring ; id: CharVectorSlice.vector -> String.string ; id: General.exn -> exn ; id: INetSock.dgram_sock -> Socket.dgram INetSock.sock ; id: INetSock.sock_addr -> INetSock.inet Socket.sock_addr ; id: 'sock_type INetSock.sock -> (INetSock.inet, 'sock_type) Socket.sock ; id: 'mode INetSock.stream_sock -> 'mode Socket.stream INetSock.sock ; id: Int16Array.elem -> Int16.int ; id: Int16Array.vector -> Int16Vector.vector ; id: Int16Array2.elem -> Int16.int ; id: Int16Array2.vector -> Int16Vector.vector ; id: Int16ArraySlice.array -> Int16Array.array ; id: Int16ArraySlice.elem -> Int16.int ; id: Int16ArraySlice.vector -> Int16Vector.vector ; id: Int16ArraySlice.vector_slice -> Int16VectorSlice.slice ; id: Int16Vector.elem -> Int16.int ; id: Int16VectorSlice.elem -> Int16Vector.elem ; id: Int16VectorSlice.vector -> Int16Vector.vector ; id: Int32Array.elem -> Int32.int ; id: Int32Array.vector -> Int32Vector.vector ; id: Int32Array2.elem -> Int32.int ; id: Int32Array2.vector -> Int32Vector.vector ; id: Int32ArraySlice.array -> Int32Array.array ; id: Int32ArraySlice.elem -> Int32.int ; id: Int32ArraySlice.vector -> Int32Vector.vector ; id: Int32ArraySlice.vector_slice -> Int32VectorSlice.slice ; id: Int32Vector.elem -> Int32.int ; id: Int32VectorSlice.elem -> Int32Vector.elem ; id: Int32VectorSlice.vector -> Int32Vector.vector ; id: Int64Array.elem -> Int64.int ; id: Int64Array.vector -> Int64Vector.vector ; id: Int64Array2.elem -> Int64.int ; id: Int64Array2.vector -> Int64Vector.vector ; id: Int64ArraySlice.array -> Int64Array.array ; id: Int64ArraySlice.elem -> Int64.int ; id: Int64ArraySlice.vector -> Int64Vector.vector ; id: Int64ArraySlice.vector_slice -> Int64VectorSlice.slice ; id: Int64Vector.elem -> Int64.int ; id: Int64VectorSlice.elem -> Int64Vector.elem ; id: Int64VectorSlice.vector -> Int64Vector.vector ; id: Int8Array.elem -> Int8.int ; id: Int8Array.vector -> Int8Vector.vector ; id: Int8Array2.elem -> Int8.int ; id: Int8Array2.vector -> Int8Vector.vector ; id: Int8ArraySlice.array -> Int8Array.array ; id: Int8ArraySlice.elem -> Int8.int ; id: Int8ArraySlice.vector -> Int8Vector.vector ; id: Int8ArraySlice.vector_slice -> Int8VectorSlice.slice ; id: Int8Vector.elem -> Int8.int ; id: Int8VectorSlice.elem -> Int8Vector.elem ; id: Int8VectorSlice.vector -> Int8Vector.vector ; id: IntArray.elem -> Int.int ; id: IntArray.vector -> IntVector.vector ; id: IntArray2.elem -> Int.int ; id: IntArray2.vector -> IntVector.vector ; id: IntArraySlice.array -> IntArray.array ; id: IntArraySlice.elem -> Int.int ; id: IntArraySlice.vector -> IntVector.vector ; id: IntArraySlice.vector_slice -> IntVectorSlice.slice ; id: IntVector.elem -> Int.int ; id: IntVectorSlice.elem -> IntVector.elem ; id: IntVectorSlice.vector -> IntVector.vector ; id: LargeIntArray.elem -> LargeInt.int ; id: LargeIntArray.vector -> LargeIntVector.vector ; id: LargeIntArray2.elem -> LargeInt.int ; id: LargeIntArray2.vector -> LargeIntVector.vector ; id: LargeIntArraySlice.array -> LargeIntArray.array ; id: LargeIntArraySlice.elem -> LargeInt.int ; id: LargeIntArraySlice.vector -> LargeIntVector.vector ; id: LargeIntArraySlice.vector_slice -> LargeIntVectorSlice.slice ; id: LargeIntVector.elem -> LargeInt.int ; id: LargeIntVectorSlice.elem -> LargeIntVector.elem ; id: LargeIntVectorSlice.vector -> LargeIntVector.vector ; id: LargeRealArray.elem -> LargeReal.real ; id: LargeRealArray.vector -> LargeRealVector.vector ; id: LargeRealArray2.elem -> LargeReal.real ; id: LargeRealArray2.vector -> LargeRealVector.vector ; id: LargeRealArraySlice.array -> LargeRealArray.array ; id: LargeRealArraySlice.elem -> LargeReal.real ; id: LargeRealArraySlice.vector -> LargeRealVector.vector ; id: LargeRealArraySlice.vector_slice -> LargeRealVectorSlice.slice ; id: LargeRealVector.elem -> LargeReal.real ; id: LargeRealVectorSlice.elem -> LargeRealVector.elem ; id: LargeRealVectorSlice.vector -> LargeRealVector.vector ; id: LargeWordArray.elem -> LargeWord.word ; id: LargeWordArray.vector -> LargeWordVector.vector ; id: LargeWordArray2.elem -> LargeWord.word ; id: LargeWordArray2.vector -> LargeWordVector.vector ; id: LargeWordArraySlice.array -> LargeWordArray.array ; id: LargeWordArraySlice.elem -> LargeWord.word ; id: LargeWordArraySlice.vector -> LargeWordVector.vector ; id: LargeWordArraySlice.vector_slice -> LargeWordVectorSlice.slice ; id: LargeWordVector.elem -> LargeWord.word ; id: LargeWordVectorSlice.elem -> LargeWordVector.elem ; id: LargeWordVectorSlice.vector -> LargeWordVector.vector ; id: 'a List.list -> 'a list ; id: Math.real -> Real.real ; id: 'a Option.option -> 'a option ; id: PackReal32Big.real -> Real32.real ; id: PackReal32Little.real -> Real32.real ; id: PackReal64Big.real -> Real64.real ; id: PackReal64Little.real -> Real64.real ; id: PackRealBig.real -> Real.real ; id: PackRealLittle.real -> Real.real ; id: Posix.Error.syserror -> OS.syserror ; id: Posix.FileSys.file_desc -> Posix.ProcEnv.file_desc ; id: Posix.FileSys.gid -> Posix.ProcEnv.gid ; id: Posix.FileSys.uid -> Posix.ProcEnv.uid ; id: Posix.IO.file_desc -> Posix.ProcEnv.file_desc ; id: Posix.IO.open_mode -> Posix.FileSys.open_mode ; id: Posix.IO.pid -> Posix.Process.pid ; id: Posix.ProcEnv.pid -> Posix.Process.pid ; id: Posix.Process.signal -> Posix.Signal.signal ; id: Posix.SysDB.gid -> Posix.ProcEnv.gid ; id: Posix.SysDB.uid -> Posix.ProcEnv.uid ; id: Posix.TTY.file_desc -> Posix.ProcEnv.file_desc ; id: Posix.TTY.pid -> Posix.Process.pid ; id: Real.real -> real ; id: Real32Array.elem -> Real32.real ; id: Real32Array.vector -> Real32Vector.vector ; id: Real32Array2.elem -> Real32.real ; id: Real32Array2.vector -> Real32Vector.vector ; id: Real32ArraySlice.array -> Real32Array.array ; id: Real32ArraySlice.elem -> Real32.real ; id: Real32ArraySlice.vector -> Real32Vector.vector ; id: Real32ArraySlice.vector_slice -> Real32VectorSlice.slice ; id: Real32Vector.elem -> Real32.real ; id: Real32VectorSlice.elem -> Real32Vector.elem ; id: Real32VectorSlice.vector -> Real32Vector.vector ; id: Real64Array.elem -> Real64.real ; id: Real64Array.vector -> Real64Vector.vector ; id: Real64Array2.elem -> Real64.real ; id: Real64Array2.vector -> Real64Vector.vector ; id: Real64ArraySlice.array -> Real64Array.array ; id: Real64ArraySlice.elem -> Real64.real ; id: Real64ArraySlice.vector -> Real64Vector.vector ; id: Real64ArraySlice.vector_slice -> Real64VectorSlice.slice ; id: Real64Vector.elem -> Real64.real ; id: Real64VectorSlice.elem -> Real64Vector.elem ; id: Real64VectorSlice.vector -> Real64Vector.vector ; id: RealArray.elem -> Real.real ; id: RealArray.vector -> RealVector.vector ; id: RealArray2.elem -> Real.real ; id: RealArray2.vector -> RealVector.vector ; id: RealArraySlice.array -> RealArray.array ; id: RealArraySlice.elem -> Real.real ; id: RealArraySlice.vector -> RealVector.vector ; id: RealArraySlice.vector_slice -> RealVectorSlice.slice ; id: RealVector.elem -> Real.real ; id: RealVectorSlice.elem -> RealVector.elem ; id: RealVectorSlice.vector -> RealVector.vector ; id: String.char -> Char.char ; id: String.string -> CharVector.vector ; id: String.string -> string ; id: Substring.char -> Char.char ; id: Substring.string -> String.string ; id: Substring.substring -> CharVectorSlice.slice ; id: Text.Char.char -> Char.char ; id: Text.Char.char -> Text.CharArray.elem ; id: Text.Char.char -> Text.CharArraySlice.elem ; id: Text.Char.char -> Text.CharVector.elem ; id: Text.Char.char -> Text.CharVectorSlice.elem ; id: Text.Char.char -> Text.String.char ; id: Text.Char.char -> Text.Substring.char ; id: Text.Char.string -> Text.CharArray.vector ; id: Text.Char.string -> Text.CharArraySlice.vector ; id: Text.Char.string -> Text.CharVector.vector ; id: Text.Char.string -> Text.CharVectorSlice.vector ; id: Text.Char.string -> Text.String.string ; id: Text.Char.string -> Text.Substring.string ; id: Text.CharArray.array -> CharArray.array ; id: Text.CharArray.array -> Text.CharArraySlice.array ; id: Text.CharArraySlice.array -> Text.CharArray.array ; id: Text.CharArraySlice.slice -> CharArraySlice.slice ; id: Text.CharArraySlice.vector_slice -> Text.CharVectorSlice.slice ; id: Text.CharVector.vector -> CharVector.vector ; id: Text.CharVectorSlice.slice -> CharVectorSlice.slice ; id: Text.CharVectorSlice.slice -> Text.CharArraySlice.vector_slice ; id: Text.String.string -> String.string ; id: Text.Substring.substring -> Substring.substring ; id: TextIO.StreamIO.pos -> TextPrimIO.pos ; id: TextIO.StreamIO.reader -> TextPrimIO.reader ; id: TextIO.StreamIO.writer -> TextPrimIO.writer ; id: TextPrimIO.array -> CharArray.array ; id: TextPrimIO.elem -> Char.char ; id: TextPrimIO.vector -> CharVector.vector ; id: UnixSock.dgram_sock -> Socket.dgram UnixSock.sock ; id: UnixSock.sock_addr -> UnixSock.unix Socket.sock_addr ; id: 'sock_type UnixSock.sock -> (UnixSock.unix, 'sock_type) Socket.sock ; id: 'mode UnixSock.stream_sock -> 'mode Socket.stream UnixSock.sock ; id: 'a Vector.vector -> 'a vector ; id: Word.word -> word ; id: Word16Array.elem -> Word16.word ; id: Word16Array.vector -> Word16Vector.vector ; id: Word16Array2.elem -> Word16.word ; id: Word16Array2.vector -> Word16Vector.vector ; id: Word16ArraySlice.array -> Word16Array.array ; id: Word16ArraySlice.elem -> Word16.word ; id: Word16ArraySlice.vector -> Word16Vector.vector ; id: Word16ArraySlice.vector_slice -> Word16VectorSlice.slice ; id: Word16Vector.elem -> Word16.word ; id: Word16VectorSlice.elem -> Word16Vector.elem ; id: Word16VectorSlice.vector -> Word16Vector.vector ; id: Word32Array.elem -> Word32.word ; id: Word32Array.vector -> Word32Vector.vector ; id: Word32Array2.elem -> Word32.word ; id: Word32Array2.vector -> Word32Vector.vector ; id: Word32ArraySlice.array -> Word32Array.array ; id: Word32ArraySlice.elem -> Word32.word ; id: Word32ArraySlice.vector -> Word32Vector.vector ; id: Word32ArraySlice.vector_slice -> Word32VectorSlice.slice ; id: Word32Vector.elem -> Word32.word ; id: Word32VectorSlice.elem -> Word32Vector.elem ; id: Word32VectorSlice.vector -> Word32Vector.vector ; id: Word64Array.elem -> Word64.word ; id: Word64Array.vector -> Word64Vector.vector ; id: Word64Array2.elem -> Word64.word ; id: Word64Array2.vector -> Word64Vector.vector ; id: Word64ArraySlice.array -> Word64Array.array ; id: Word64ArraySlice.elem -> Word64.word ; id: Word64ArraySlice.vector -> Word64Vector.vector ; id: Word64ArraySlice.vector_slice -> Word64VectorSlice.slice ; id: Word64Vector.elem -> Word64.word ; id: Word64VectorSlice.elem -> Word64Vector.elem ; id: Word64VectorSlice.vector -> Word64Vector.vector ; id: Word8Array.elem -> Word8.word ; id: Word8Array.vector -> Word8Vector.vector ; id: Word8Array2.elem -> Word8.word ; id: Word8Array2.vector -> Word8Vector.vector ; id: Word8ArraySlice.array -> Word8Array.array ; id: Word8ArraySlice.elem -> Word8.word ; id: Word8ArraySlice.vector -> Word8Vector.vector ; id: Word8ArraySlice.vector_slice -> Word8VectorSlice.slice ; id: Word8Vector.elem -> Word8.word ; id: Word8VectorSlice.elem -> Word8Vector.elem ; id: Word8VectorSlice.vector -> Word8Vector.vector ; id: WordArray.elem -> Word.word ; id: WordArray.vector -> WordVector.vector ; id: WordArray2.elem -> Word.word ; id: WordArray2.vector -> WordVector.vector ; id: WordArraySlice.array -> WordArray.array ; id: WordArraySlice.elem -> Word.word ; id: WordArraySlice.vector -> WordVector.vector ; id: WordArraySlice.vector_slice -> WordVectorSlice.slice ; id: WordVector.elem -> Word.word ; id: WordVectorSlice.elem -> WordVector.elem ; id: WordVectorSlice.vector -> WordVector.vector (* ; id: WideChar.string -> WideString.string * ; id: WideCharArray.elem -> WideChar.char * ; id: WideCharArray.vector -> WideCharVector.vector * ; id: WideCharArray2.elem -> WideChar.char * ; id: WideCharArray2.vector -> WideCharVector.vector * ; id: WideCharArraySlice.array -> WideCharArray.array * ; id: WideCharArraySlice.elem -> WideChar.char * ; id: WideCharArraySlice.vector -> WideCharVector.vector * ; id: WideCharArraySlice.vector_slice -> WideCharVectorSlice.slice * ; id: WideCharVector.elem -> WideChar.char * ; id: WideCharVector.vector -> WideString.string * ; id: WideCharVectorSlice.elem -> WideCharVector.elem * ; id: WideCharVectorSlice.vector -> WideCharVector.vector * ; id: WideString.string -> WideCharVector.vector * ; id: WideString.type char -> WideChar.char * ; id: WideSubstring.char -> WideChar.char * ; id: WideSubstring.string -> WideString.string * ; id: WideSubstring.substring -> WideCharVectorSlice.slice * ; id: WideText.Char.char -> WideChar.char * ; id: WideText.CharArray.array -> WideCharArray.array * ; id: WideText.CharArraySlice.slice -> WideCharArraySlice.slice * ; id: WideText.CharVector.vector -> WideCharVector.vector * ; id: WideText.CharVectorSlice.slice -> WideCharVectorSlice.slice * ; id: WideText.String.string -> WideString.string * ; id: WideText.Substring.substring -> WideSubstring.substring * ; id: WideTextPrimIO.array -> WideCharArray.array * ; id: WideTextPrimIO.elem -> WideChar.char * ; id: WideTextPrimIO.vector -> WideCharVector.vector *) ) mlton-20100608/regression/big-array.ok0000644000076600000240000000000311404435617016145 0ustar mtfstaffOK mlton-20100608/regression/big-array.sml0000644000076600000240000000015511404435620016331 0ustar mtfstaffopen Array val a'' = tabulate (1000000, fn i => i) val _ = sub (a'', 0) + sub (a'', 1) val _ = print "OK\n" mlton-20100608/regression/binio.ok0000644000076600000240000000023711404435621015374 0ustar mtfstaffbasic test of writing and reading back all characters done test of writing files of all possible characters in strings of lengths 0-256 finished test finished mlton-20100608/regression/binio.sml0000644000076600000240000000261011404435617015560 0ustar mtfstaffval filename = OS.FileSys.tmpName () fun testRange (start, length) = let val allChars = Word8Vector.tabulate(length, fn i => Word8.fromInt ((i + start) mod 256)) val outStr = BinIO.openOut filename val _ = BinIO.output (outStr, allChars) val _ = BinIO.closeOut outStr val inStr = BinIO.openIn filename val readChars = BinIO.inputAll inStr val _ = BinIO.closeIn inStr val _ = OS.FileSys.remove filename fun testCharF (c, cnt) = let val readC = Word8Vector.sub(readChars, cnt) val _ = if c = readC then () else print ("Error at index: " ^ (Int.toString cnt) ^ ": " ^ (Word8.toString c) ^ " <> " ^ (Word8.toString readC) ^ "\n") in cnt + 1 end val _ = Word8Vector.foldl testCharF 0 allChars in () end val _ = testRange (0, 256) val _ = print "basic test of writing and reading back all characters done\n" val _ = List.tabulate(256, fn i => List.tabulate(257, fn i2 => testRange (i, i2))) val _ = print "test of writing files of all possible characters in strings of lengths 0-256 finished\n" val _ = List.tabulate(6, fn i => List.tabulate(5000, fn i2 => testRange (i, i2))) val _ = print "test finished\n" mlton-20100608/regression/bool-triple.ok0000644000076600000240000000000611404435620016515 0ustar mtfstafffalse mlton-20100608/regression/bool-triple.sml0000644000076600000240000000035611404435620016707 0ustar mtfstaffval a = Array.array (100, (true, false, true)) val _ = Array.update (a, 0, (false, true, false)) val b = Array.sub (a, 0) = Array.sub (a, 1) andalso Array.sub (a, 2) = Array.sub (a, 3) val _ = print (concat [Bool.toString b, "\n"]) mlton-20100608/regression/bytechar.ok0000644000076600000240000000157111404435620016076 0ustar mtfstaff File bytechar.sml: Testing structures Byte and Char... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK test9 OK test10a OK test10b OK test10c OK test10d OK test10e OK test10f OK test10g OK test10h OK test10i OK test10j OK test11a OK test11b OK test11c OK test11d OK test11e OK test11f OK test11g OK test11h OK test11i OK test11j OK test18 OK test19 OK test20 OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK test31 OK test32 OK test33 OK test34a OK test34b OK test35a OK test35b OK test36 OK test37 OK test38 OK test39 OK test40 OK test41 OK test42 OK test43 OK mlton-20100608/regression/bytechar.sml0000644000076600000240000003336311404435617016272 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") (* handle _ => "EXN" *); fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/bytechar.sml -- test cases for Byte and Char, suitable for ASCII PS 1994-12-10, 1995-05-11, 1995-11-10, 1996-09-30 *) (*KILL 05/11/1997 10:55. tho.: use "auxil.sml"; *) val _ = print "\nFile bytechar.sml: Testing structures Byte and Char...\n" local in val test1 = tstrange "test1" (0,255) (fn i => (Word8.toInt o Byte.charToByte o Byte.byteToChar o Word8.fromInt) i = i); val test2 = tstrange "test2" (0,Char.maxOrd) (fn i => (Word8.toInt o Byte.charToByte o Char.chr) i = i); val test3 = tstrange "test3" (0,255) (fn i => (Char.ord o Byte.byteToChar o Word8.fromInt) i = i); val test4 = tstrange "test4" (0, Char.maxOrd) (fn i => (Char.ord o Char.chr) i = i); val test5 = tst0 "test5" ((Char.chr ~1 seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test6 = tst0 "test6" ((Char.chr (Char.maxOrd+1) seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test7 = tst "test7" ("" = Byte.bytesToString (Word8Vector.fromList [])); val test8 = tst "test8" ("ABDC" = (Byte.bytesToString o Word8Vector.fromList o map Word8.fromInt) [65, 66, 68, 67]); val unpackString = Byte.unpackString o Word8ArraySlice.slice val test9 = tst "test9" ("" = unpackString (Word8Array.fromList [], 0, SOME 0)) local val arr = Word8Array.tabulate(10, fn i => Word8.fromInt(i+65)) in val test10a = tst "test10a" ("" = unpackString(arr, 0, SOME 0)); val test10b = tst "test10b" ("" = unpackString(arr, 10, SOME 0) andalso "" = unpackString(arr, 10, NONE)); val test10c = tst "test10c" ("BCDE" = unpackString(arr, 1, SOME 4)); val test10d = tst0 "test10d" ((unpackString(arr, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10e = tst0 "test10e" ((unpackString(arr, 11, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10f = tst0 "test10f" ((unpackString(arr, 0, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10g = tst0 "test10g" ((unpackString(arr, 0, SOME 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10h = tst0 "test10h" ((unpackString(arr, 10, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10i = tst0 "test10i" ((unpackString(arr, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test10j = tst0 "test10j" ((unpackString(arr, 11, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") end val unpackStringVec = Byte.unpackStringVec o Word8VectorSlice.slice local val vec = Word8Vector.tabulate(10, fn i => Word8.fromInt(i+65)) in val test11a = tst "test11a" ("" = unpackStringVec(vec, 0, SOME 0)); val test11b = tst "test11b" ("" = unpackStringVec(vec, 10, SOME 0) andalso "" = unpackStringVec(vec, 10, NONE)); val test11c = tst "test11c" ("BCDE" = unpackStringVec(vec, 1, SOME 4)); val test11d = tst0 "test11d" ((unpackStringVec(vec, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11e = tst0 "test11e" ((unpackStringVec(vec, 11, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11f = tst0 "test11f" ((unpackStringVec(vec, 0, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11g = tst0 "test11g" ((unpackStringVec(vec, 0, SOME 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11h = tst0 "test11h" ((unpackStringVec(vec, 10, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11i = tst0 "test11i" ((unpackStringVec(vec, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11j = tst0 "test11j" ((unpackStringVec(vec, 11, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") end val test18 = tst "test18" (not (Char.contains "" (Char.chr 65)) andalso not (Char.contains "aBCDE" (Char.chr 65)) andalso (Char.contains "ABCD" (Char.chr 67)) andalso not (Char.contains "" #"\000") andalso not (Char.contains "" #"\255") andalso not (Char.contains "azAZ09" #"\000") andalso not (Char.contains "azAZ09" #"\255")); val test19 = tst "test19" (Char.notContains "" (Char.chr 65) andalso Char.notContains "aBCDE" (Char.chr 65) andalso not (Char.notContains "ABCD" (Char.chr 67)) andalso Char.notContains "" #"\000" andalso Char.notContains "" #"\255" andalso Char.notContains "azAZ09" #"\000" andalso Char.notContains "azAZ09" #"\255"); val test20 = tst "test20" (Char.ord Char.maxChar = Char.maxOrd); local fun mycontains s c = let val stop = String.size s fun h i = i < stop andalso (c = String.sub(s, i) orelse h(i+1)) in h 0 end; (* Check that p(c) = (mycontains s c) for all characters: *) fun equivalent p s = let fun h n = n > 255 orelse (p (chr n) = mycontains s (chr n)) andalso h(n+1) in h 0 end fun checkset p s = tst' "checkset" (fn _ => equivalent p s); val graphchars = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\ \[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; val ascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127" val lowerascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127" val upperascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\127" val allchars = let fun h 0 res = chr 0 :: res | h n res = h (n-1) (chr n :: res) in h 255 [] end open Char in val test21 = checkset isLower "abcdefghijklmnopqrstuvwxyz"; val test22 = checkset isUpper "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test23 = checkset isDigit "0123456789"; val test24 = checkset isAlpha "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test25 = checkset isHexDigit "0123456789abcdefABCDEF"; val test26 = checkset isAlphaNum "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test27 = checkset isPrint (" " ^ graphchars) val test28 = checkset isSpace " \009\010\011\012\013"; val test29 = checkset isGraph graphchars val test30 = checkset isAscii ascii val test31 = tst' "test31" (fn _ => map toLower (explode ascii) = explode lowerascii) val test32 = tst' "test32" (fn _ => map toUpper (explode ascii) = explode upperascii) val test33 = tst' "test33" (fn _ => map toUpper (explode graphchars) seq map toLower (explode graphchars) seq true) val test34a = tst' "test34a" (fn _ => map pred (List.drop(allchars, 1)) = List.take(allchars, 255)); val test34b = tst0 "test34b" ((pred minChar seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test35a = tst' "test35a" (fn _ => map succ (List.take(allchars, 255)) = List.drop(allchars, 1)); val test35b = tst0 "test35b" ((succ maxChar seq "WRONG") handle Chr => "OK" | _ => "WRONG") end (* Test cases for SML character escape functions. *) val test36 = let fun chk (arg, res) = Char.toString arg = res in tst' "test36" (fn _ => List.all chk [(#"\000", "\\^@"), (#"\001", "\\^A"), (#"\006", "\\^F"), (#"\007", "\\a"), (#"\008", "\\b"), (#"\009", "\\t"), (#"\010", "\\n"), (#"\011", "\\v"), (#"\012", "\\f"), (#"\013", "\\r"), (#"\014", "\\^N"), (#"\031", "\\^_"), (#"\032", " "), (#"\126", "~"), (#"\\", "\\\\"), (#"\"", "\\\""), (#"A", "A"), (#"\127", "\\127"), (#"\128", "\\128"), (#"\255", "\\255")]) end; val test37 = let val chars = List.tabulate(256, chr) fun chk c = Char.fromString(Char.toString c) = SOME c in tst' "test37" (fn _ => List.all chk chars) end val test38 = let fun chkFromString (arg, res) = Char.fromString arg = SOME res val argResList = [("A", #"A"), ("z", #"z"), ("@", #"@"), ("~", #"~"), ("\\a", #"\007"), ("\\b", #"\008"), ("\\t", #"\009"), ("\\n", #"\010"), ("\\v", #"\011"), ("\\f", #"\012"), ("\\r", #"\013"), ("\\\\", #"\\"), ("\\\"", #"\""), ("\\^@", #"\000"), ("\\^A", #"\001"), ("\\^Z", #"\026"), ("\\^_", #"\031"), ("\\000", #"\000"), ("\\097", #"a"), ("\\255", #"\255"), ("\\ \t\n\n \\A", #"A"), ("\\ \t\n\n \\z", #"z"), ("\\ \t\n\n \\@", #"@"), ("\\ \t\n\n \\~", #"~"), ("\\ \t\n\n \\\\n", #"\n"), ("\\ \t\n\n \\\\t", #"\t"), ("\\ \t\n\n \\\\\\", #"\\"), ("\\ \t\n\n \\\\\"", #"\""), ("\\ \t\n\n \\\\^@", #"\000"), ("\\ \t\n\n \\\\^A", #"\001"), ("\\ \t\n\n \\\\^Z", #"\026"), ("\\ \t\n\n \\\\^_", #"\031"), ("\\ \t\n\n \\\\000", #"\000"), ("\\ \t\n\n \\\\097", #"a"), ("\\ \t\n\n \\\\255", #"\255")] in tst' "test38" (fn _ => List.all chkFromString argResList) end; val test39 = tst' "test39" (fn _ => List.all (fn arg => Char.fromString arg = NONE) ["\\", "\\c", "\\F", "\\e", "\\g", "\\N", "\\T", "\\1", "\\11", "\\256", "\\-65", "\\~65", "\\?", "\\^`", "\\^a", "\\^z", "\\ a", "\\ a\\B", "\\ \\"]); (* Test cases for C string escape functions *) val test40 = let val chars = List.tabulate(256, chr) in tst' "test40" (fn _ => List.map SOME chars = List.map Char.fromCString (List.map Char.toCString chars)) end; val test41 = let val argResList = [(#"\010", "\\n"), (#"\009", "\\t"), (#"\011", "\\v"), (#"\008", "\\b"), (#"\013", "\\r"), (#"\012", "\\f"), (#"\007", "\\a"), (#"\\", "\\\\"), (#"?", "\\?"), (#"'", "\\'"), (#"\"", "\\\"")] in tst' "test41" (fn _ => List.all (fn (arg, res) => Char.toCString arg = res) argResList) end; val test42 = let fun checkFromCStringSucc (arg, res) = str (valOf (Char.fromCString arg)) = res val argResList = [("\\n", "\010"), ("\\t", "\009"), ("\\v", "\011"), ("\\b", "\008"), ("\\r", "\013"), ("\\f", "\012"), ("\\a", "\007"), ("\\\\", "\\"), ("\\?", "?"), ("\\'", "'"), ("\\\"", "\""), ("\\1", "\001"), ("\\11", "\009"), ("\\111", "\073"), ("\\1007", "\064"), ("\\100A", "\064"), ("\\0", "\000"), ("\\377", "\255"), ("\\18", "\001"), ("\\178", "\015"), ("\\1C", "\001"), ("\\17C", "\015"), ("\\x0", "\000"), ("\\xff", "\255"), ("\\xFF", "\255"), ("\\x1", "\001"), ("\\x11", "\017"), ("\\xag", "\010"), ("\\xAAg", "\170"), ("\\x0000000a", "\010"), ("\\x0000000a2", "\162"), ("\\x0000000ag", "\010"), ("\\x0000000A", "\010"), ("\\x0000000A2", "\162"), ("\\x0000000Ag", "\010"), ("\\x00000000000000000000000000000000000000000000000000000000000000011+", "\017") ] in tst' "test42" (fn _ => List.all checkFromCStringSucc argResList) end; val test43 = let fun checkFromCStringFail arg = Char.fromCString arg = NONE in tst' "test43" (fn _ => List.all checkFromCStringFail ["\\", "\\X", "\\=", "\\400", "\\777", "\\8", "\\9", "\\c", "\\d", "\\x", "\\x100", "\\xG"]) end; end mlton-20100608/regression/callcc.ok0000644000076600000240000000000211404435621015503 0ustar mtfstaff3 mlton-20100608/regression/callcc.sml0000644000076600000240000000014411404435620015673 0ustar mtfstaffopen MLton.Cont val _ = print(Int.toString(1 + callcc(fn k => throw(k, 2)))) val _ = print "\n" mlton-20100608/regression/callcc2.ok0000644000076600000240000000002111404435620015565 0ustar mtfstaffFun Fun Code Fun mlton-20100608/regression/callcc2.sml0000644000076600000240000002016511404435617015770 0ustar mtfstafftype ident = string type con = string datatype pattern = PVar of ident | PAlias of ident * pattern | PConstruct of con * pattern list | PAliasD of ident * pattern | PConstructD of con * pattern list datatype exp = Var of ident | Lam of ident * exp | App of exp * exp | Construct of con * exp list | Case of exp * (pattern * exp) list | Let of ident * exp * exp | LamD of ident * exp | AppD of exp * exp | ConstructD of con * exp list | CaseD of exp * (pattern * exp) list | LetD of ident * exp * exp | Lift of exp datatype value = Fun of (value -> value) | Con of con * value list | Code of exp | Wrong val valueToString = fn Fun _ => "Fun" | Con _ => "Con" | Code _ => "Code" | Wrong => "Wrong" (* control operators *) (*********************) (* toplevel resetMarker *) val metaCont = ref (fn (x : value) => x) fun abort thunk = let val v = thunk () in !metaCont v end fun reset thunk = let val mc = !metaCont in SMLofNJ.Cont.callcc (fn k => let (* new marker which restores old one *) val _ = metaCont := (fn v => let val _ = metaCont := mc in SMLofNJ.Cont.throw k v end) in abort thunk end) end fun shift f = SMLofNJ.Cont.callcc (fn k => abort (fn () => f (fn v => reset (fn () => SMLofNJ.Cont.throw k v)))) (*********************) (* environment *) exception UnboundVar of ident fun update r var value = (var, value) :: r fun lookup [] var = raise (UnboundVar var) | lookup ((var, value) :: r) var' = if var = var' then value else lookup r var' (* pattern matcher - binds variables patterns are linear and pairwise disjoint *) fun patterneq (p, value) r = case p of PVar x => (update r x value, true) | PAlias (x, p) => let val (r', eq) = patterneq (p, value) r in (update r' x value, eq) end | PConstruct (c, ps) => let val Con(c', vs) = value val eq = (c = c') val eq = eq andalso (List.length vs = List.length ps) in List.foldl (fn ((p, v), (r', eq')) => let val (r'', eq'') = patterneq (p, v) r' in (r'', eq'' andalso eq') end) (r, eq) (ListPair.zip (ps, vs)) end val gensym = let val count = ref 0 in (fn x => (count := !count + 1; (x^(Int.toString (!count))))) end (* copies pattern with fresh variables bound in new environment *) fun generatePattern (r, p) = case p of PVar x => let val xx = gensym x in (update r x (Code (Var xx)), PVar xx) end | PAliasD (x, p) => let val (r', p') = generatePattern (r, p) val xx = gensym x in (update r x (Code (Var xx)), PAlias (xx, p')) end | PConstructD (c, ps) => let val (r, ps) = List.foldr (fn (p, (r, ps)) => let val (r', p') = generatePattern (r, p) in (r', p' :: ps) end) (r, []) ps in (r, PConstruct (c, ps)) end (* the specializer *) fun spec e r = case e of Var x => lookup r x (* Specialization of Static Stuff - standard semantics *) | Lam (x, e) => Fun (fn y => spec e (update r x y)) | App (f, a) => let val Fun ff = spec f r in ff (spec a r) end | Construct (c, es) => let val vs = List.map (fn e => spec e r) es in Con (c, vs) end | Case (test, cls) => let val testv = spec test r (* exhaustive by restriction on patterns *) fun loop cls = (case cls of ((p, e) :: cls) => let val (r', eq) = patterneq (p, testv) r in if eq then spec e r' else loop cls end | [] => Wrong) in loop cls end | Let (x, e1, e2) => let val v1 = spec e1 r in spec e2 (update r x v1) end (* Specialization of Dynamic stuff *) | LamD (x, e) => let val xx = gensym x val Code body = reset (fn () => spec e (update r x (Code (Var xx)))) in Code (Lam (xx, body)) end | AppD (f, a) => let val Code ff = spec f r val Code aa = spec a r in Code (App (ff, aa)) end | ConstructD (c, es) => let val es' = List.map (fn e => let val Code v = spec e r in v end) es in Code (Construct (c, es')) end | LetD (x, e1, e2) => let val xx = gensym x in shift (fn k => let val Code e1' = spec e1 r val Code e2' = reset (fn () => k (spec e2 (update r x (Code (Var xx))))) in Code (Let (xx, e1', e2')) end) end | CaseD (test, cls) => shift (fn k => let val Code testd = spec test r val newCls = List.map (fn (p, e) => let val (r', p') = generatePattern(r, p) val Code branch = reset (fn () => k (spec e r')) in (p', branch) end) cls in Code (Case(testd, newCls)) end) (* first-order lifting *) | Lift e => let val Con(c, []) = spec e r in Code(Construct (c, [])) end fun specialize p = spec p [] (* standard evaluation *) val sampleProg1 = Lam("q", App(Let("id", App(Var "q", Var "q"), Lam("z", Var "z")), Var "q")) val sampleProg2 = Lam("f", App(Lam("x", Case(Var "x", [(PConstruct("True",[]), Lam("x",Lam("y",Var "x"))), (PConstruct("False",[]), Lam("x",Lam("y",Var "y")))])), Var "f")) (* partial evaluation *) val sampleProg1D = LamD("q", App(LetD("id", AppD(Var "q", Var "q"), Lam("z", Var "z")), Var "q")) val sampleProg2D = LamD("f", LamD("x", App(CaseD(Var "x", [(PConstructD("True",[]), Lam("z",LamD("y", Var "z"))), (PConstructD("False",[]), Lam("z",LamD("y", Var "y")))]), Var "f"))) val specialize = fn p => let val v = specialize p in print(valueToString v) ; print "\n" end val v1 = specialize sampleProg1 val v2 = specialize sampleProg2 val v3 = specialize sampleProg1D val v4 = specialize sampleProg2 mlton-20100608/regression/callcc3.ok0000644000076600000240000000000011404435620015563 0ustar mtfstaffmlton-20100608/regression/callcc3.sml0000644000076600000240000000053711404435617015772 0ustar mtfstaffopen MLton open Cont val kr: unit Cont.t option ref = ref NONE val rr: unit ref option ref = ref NONE val r: unit ref = ref (callcc (fn k => kr := SOME k)) val _ = case !rr of NONE => (rr := SOME r ; throw (valOf (!kr), ())) | SOME r' => if r = r' then raise Fail "bug" else () mlton-20100608/regression/cases.ok0000644000076600000240000000000011404435617015363 0ustar mtfstaffmlton-20100608/regression/cases.sml0000644000076600000240000000103611404435617015557 0ustar mtfstafffun test (f, a, r) = if f a = r then () else raise Fail "bug" val rec f = fn 0 => 0 | 1 => 1 | 2 => 2 | i => f (i - 1) val _ = test (f, 100, 2) val rec f: word -> int = fn 0w0 => 0 | 0w1 => 1 | 0w2 => 2 | w => f (w - 0w1) val _ = test (f, 0w100, 2) val rec f: Word8.word -> int = fn 0w0 => 0 | 0w1 => 1 | 0w2 => 2 | w => f (w - 0w1) val _ = test (f, 0w100, 2) val rec f: char -> int = fn #"a" => 0 | #"b" => 1 | #"c" => 2 | _ => f #"c" val _ = test (f, #"d", 2) mlton-20100608/regression/char.scan.ok0000644000076600000240000000007311404435617016137 0ustar mtfstafffalse a at 4 of 4 a at 4 of 4 a at 7 of 7 a at 7 of 7 NONE mlton-20100608/regression/char.scan.sml0000644000076600000240000000113411404435617016320 0ustar mtfstaffval dquote = "\"" val _ = print (concat [Bool.toString (isSome (Char.fromString dquote)), "\n"]) val scan: string -> unit = fn s => let val n = String.size s fun reader i = if i = n then NONE else SOME (String.sub (s, i), i + 1) in case Char.scan reader 0 of NONE => print "NONE\n" | SOME (c, i) => print (concat [str c, " at ", Int.toString i, " of ", Int.toString n, "\n"]) end val _ = List.app scan ["a\\ \\", "\\ \\a", "\\ \\a\\ \\", "\\ \\\\ \\a", "\\ \\"] mlton-20100608/regression/char0.sml0000644000076600000240000000015411404435617015456 0ustar mtfstafffun f c = case c of #"a" => () | _ => raise Fail "bug" val _ = f #"a" val _ = f #"a" mlton-20100608/regression/check_arrays.ok0000644000076600000240000000254311404435617016741 0ustar mtfstaff Testing structure Word8Array Now I will try with a 119-array. ok Now I will try with a 13-array. ok Now I will try with a 130-array. ok Now I will try with a 10000-array. ok Now I will try with a 0-array. ok Now I will try with a 1-array. ok Now I will try with a 158-array. ok Now I will try with a 316-array. ok Now I will try with a 159-array. ok Now I will try with a 3161-array. ok Now I will try with a 15161-array. ok Testing structure Array Now I will try with a 119-array. ok Now I will try with a 13-array. ok Now I will try with a 130-array. ok Now I will try with a 10000-array. ok Now I will try with a 0-array. ok Now I will try with a 1-array. ok Now I will try with a 158-array. ok Now I will try with a 316-array. ok Now I will try with a 159-array. ok Now I will try with a 3161-array. ok Now I will try with a 15161-array. ok Testing structure CharArray Now I will try with a 119-array. ok Now I will try with a 13-array. ok Now I will try with a 130-array. ok Now I will try with a 10000-array. ok Now I will try with a 0-array. ok Now I will try with a 1-array. ok Now I will try with a 758-array. ok Now I will try with a 1516-array. ok Now I will try with a 759-array. ok Now I will try with a 15161-array. ok check done mlton-20100608/regression/check_arrays.sml0000644000076600000240000001367511404435617017133 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (*check_arrays.sml 13/10/1997 22:13. tho.*) fun impossible s = (print "ERROR : "; print s; print "\n") val Char_prim_array_maxLen = 200*4-42; val Poly_prim_array_maxLen = 200-42; (*test Word8Array structure*) val _ = (print "\nTesting structure Word8Array\n"; let fun dot () = {}(*pr "."*) fun phase s = {}(*pr s*) fun try_with n = (print ("\nNow I will try with a " ^ Int.toString n ^ "-array."); let val a = Word8Array.array (n, 0w42); val i = ref 0 in phase "\ncheck 1:"; i := 0; while (!i < n) do (dot (); if Word8Array.sub (a, !i) <> 0w42 then impossible ("check 1 failed: it is " ^ Int.toString (Word8.toInt (Word8Array.sub (a, !i)))) else (); i := !i + 1); phase "\ncheck length:"; if Word8Array.length a <> n then impossible ("length was " ^ Int.toString (Word8Array.length a) ^ " and not " ^ Int.toString n) else (); phase "\ncheck foldr:"; if (Word8Array.foldr (fn (e,a) => Word8.toInt e + a) 0 a) <> Word8Array.length a * 42 then impossible ("foldr check failed: it was " ^ Int.toString (Word8Array.foldr (fn (e,a) => Word8.toInt e + a) 0 a) ^ " and not " ^ Int.toString (Word8Array.length a * 42)) else (); phase "\ninit:"; i := 0; while (!i < n) do (dot (); Word8Array.update (a, !i, 0w2 * (Word8.fromInt (!i) mod 0w20)); i := !i + 1); phase "\ncheck 2:"; i := n-1; while (!i >= 0) do (dot (); if Word8Array.sub (a, !i) <> (0w2 * (Word8.fromInt (!i) mod 0w20)) then impossible (concat["check 2 failed: found ", (Int.toString o Word8.toInt)(Word8Array.sub (a, !i)), " and not ", (Int.toString o Word8.toInt)(0w2 * (Word8.fromInt (!i) mod 0w20))]) else (); i := !i - 1); print " \tok" end); in (try_with 119; try_with 13; try_with 130; try_with 10000; try_with 0; try_with 1; try_with Poly_prim_array_maxLen; try_with (2 * Poly_prim_array_maxLen); try_with (Poly_prim_array_maxLen + 1); try_with (20 * Poly_prim_array_maxLen + 1); try_with (20 * Char_prim_array_maxLen + 1); print "\n") end ) val _ = ( (*test Array structure*) print "\nTesting structure Array\n"; let fun dot () = () (*pr ".";*) fun phase s = () (*pr s;*) fun try_with n = (print ("\nNow I will try with a " ^ Int.toString n ^ "-array."); let val a = Array.array (n, 42) val i = ref 0 in phase "\ncheck 1:"; i := 0; while (!i < n) do (dot (); if Array.sub (a, !i) <> 42 then impossible "check 1 failed" else (); i := !i + 1); phase "\ncheck length:"; if Array.length a <> n then impossible ("length was " ^ Int.toString (Array.length a) ^ " and not " ^ Int.toString n) else (); phase "\ncheck foldr:"; if Array.foldr (op +) 0 a <> Array.length a * 42 then impossible ("foldr check failed: it was " ^ Int.toString (Array.foldr (op +) 0 a) ^ " and not " ^ Int.toString (Array.length a * 42)) else (); phase "\ninit:"; i := 0; while (!i < n) do (dot (); Array.update (a, !i, !i * !i); i := !i + 1); phase "\ncheck 2:"; i := n-1; while (!i >= 0) do (dot (); if Array.sub (a, !i) <> !i * !i then impossible "check 2 failed" else (); i := !i - 1); print " \tok" end); in (try_with 119; try_with 13; try_with 130; try_with 10000; try_with 0; try_with 1; try_with Poly_prim_array_maxLen; try_with (2 * Poly_prim_array_maxLen); try_with (Poly_prim_array_maxLen + 1); try_with (20 * Poly_prim_array_maxLen + 1); try_with (20 * Char_prim_array_maxLen + 1); print "\n") end ) val _ = ( (*test CharArray structure*) print "\nTesting structure CharArray\n"; let fun dot () = () (*pr ".";*) fun phase s = () (*pr s*) val x = #"*" fun f (* : (elem * 'b) -> 'b *) (x', b) = x = x' andalso b val b_init = true fun repeat x 0 = [] | repeat x n = x :: repeat x (n-1) fun try_with n = (print ("\nNow I will try with a " ^ Int.toString n ^ "-array."); let val a = CharArray.array (n, x) val x_summasumarum = true val i = ref 0 in phase "\ncheck 1:"; i := 0; while (!i < n) do (dot (); if CharArray.sub (a, !i) <> x then impossible "check 1 failed" else (); i := !i + 1); phase "\ncheck length:"; if CharArray.length a <> n then impossible ("length was " ^ Int.toString (CharArray.length a) ^ " and not " ^ Int.toString n) else (); phase "\ncheck foldr:"; if CharArray.foldr f b_init a <> x_summasumarum then impossible "foldr check failed" else (); phase "\ninit:"; i := 0; while (!i < n) do (dot (); CharArray.update (a, !i, chr ((!i mod (127-34)) + 34) ); i := !i + 1); phase "\ncheck 2:"; i := n-1; while (!i >= 0) do (dot (); if CharArray.sub (a, !i) <> chr ((!i mod (127-34)) + 34) then impossible "check 2 failed" else (); i := !i - 1); print " \tok" end); in (try_with 119; try_with 13; try_with 130; try_with 10000; try_with 0; try_with 1; try_with Char_prim_array_maxLen; try_with (2 * Char_prim_array_maxLen); try_with (Char_prim_array_maxLen + 1); try_with (20 * Char_prim_array_maxLen + 1); print "\n") end ; print "\ncheck done\n" ) mlton-20100608/regression/circular.ok0000644000076600000240000000000011404435620016063 0ustar mtfstaffmlton-20100608/regression/circular.sml0000644000076600000240000000036511404435617016271 0ustar mtfstaffopen Vector datatype t = T of t vector fun makeT () = T (tabulate (0, fn _ => makeT ())) fun destT (T v) = if length v > 0 then 1 + destT (sub (v, 0)) else 0 val _ = if 0 = destT (makeT ()) then () else raise Fail "bug" mlton-20100608/regression/cmdline.ok0000644000076600000240000000006711404435617015715 0ustar mtfstaffThis program is invoked as `./cmdline' with arguments: mlton-20100608/regression/cmdline.sml0000644000076600000240000000136711404435620016075 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/cmdline.sml, PS 1997-03-07 *) val _ = (app print ["This program is invoked as `", CommandLine.name(), "'\n", "with arguments:\n"]; app (fn a => (print a; print "\n")) (CommandLine.arguments ())) mlton-20100608/regression/cobol.sml0000644000076600000240000072313211404435617015567 0ustar mtfstaff val condition_names:(string list ref) = ref [] (*hojfeld defunctorised*) structure Cobol = struct type pos = unit (*hojfeld*) (* BASIC STUFF *) type ts2k = string datatype figurative_constant = ZERO | ZEROS | ZEROES | SPACE | SPACES | HIGHVALUE | HIGHVALUES | LOWVALUE | LOWVALUES | QUOTE | QUOTES | ALL_ZERO | ALL_ZEROS | ALL_ZEROES | ALL_SPACE | ALL_SPACES | ALL_HIGHVALUE | ALL_HIGHVALUES | ALL_LOWVALUE | ALL_LOWVALUES | ALL_QUOTE | ALL_QUOTES | ALL_NONNUMERICLITERAL of string datatype literal = LITERAL_IS_NONNUMERICLITERAL of string * pos * pos | LITERAL_IS_INTEGER of string * pos * pos | LITERAL_IS_DECIMALNUMBER of string * pos * pos | LITERAL_IS_BOOLEANLITERAL of bool * pos * pos | LITERAL_IS_FIGURATIVECONSTANT of figurative_constant * pos * pos datatype data_name_or_literal = DATA_NAME_OR_LITERAL_IS_DATA_NAME of string | DATA_NAME_OR_LITERAL_IS_LITERAL of literal datatype data_names = DATA_NAMES of data_names * string | ONE_DATA_NAME of string datatype data_name_or_integer = DATA_NAME_OR_INTEGER_IS_DATA_NAME of string | DATA_NAME_OR_INTEGER_IS_INTEGER of string type qualification = string datatype qualifications = SEVERAL_QUALIFICATIONS of qualifications * qualification | NO_QUALIFICATIONS type subscript_phrase = unit (* TODO *) datatype special_register = LINAGECOUNTER | DEBUGITEM datatype identifier = QUALIFIED_IDENTIFIER of string * qualifications * subscript_phrase * pos * pos | SPECIAL_REGISTER of special_register * pos * pos datatype identifiers = SEVERAL_IDENTIFIERS of identifiers * identifier | ONE_IDENTIFIER of identifier datatype identifier_or_literal = IDENTIFIER_OR_LITERAL_IS_IDENTIFIER of identifier | IDENTIFIER_OR_LITERAL_IS_LITERAL of literal datatype identifier_or_literals = SEVERAL_IDENTIFIER_OR_LITERALS of identifier_or_literals * identifier_or_literal | ONE_IDENTIFIER_OR_LITERAL of identifier_or_literal datatype rounded = ROUNDED | NOT_ROUNDED datatype identifier_rounded = IDENTIFIER_ROUNDED of identifier * rounded datatype identifier_roundeds = SEVERAL_IDENTIFIER_ROUNDEDS of identifier_roundeds * identifier_rounded | ONE_IDENTIFIER_ROUNDED of identifier_rounded datatype is_not = IS_NOT_IS | IS_NOT_NOT datatype data_class = DATA_CLASS_IS_NUMERIC | DATA_CLASS_IS_ALPHABETIC datatype relational_operator = GREATER | LESS | EQUAL | GREATER_OR_EQUAL | LESS_OR_EQUAL datatype sign_specification = SIGN_SPECIFICATION_IS_POSITIVE | SIGN_SPECIFICATION_IS_NEGATIVE | SIGN_SPECIFICATION_IS_ZERO (* END OF BASIC STUFF *) (* ENVIRONMENT DIVISION *) type source_computer_paragraph = unit type object_computer_paragraph = unit datatype currency_sign_clause = CURRENCY of string datatype decimal_clause = DECIMALPOINT_IS_COMMA datatype special_names_clause = ENVIRONMENT_CLAUSE | ALPHABET_CLAUSE | CURRENCY_SIGN_CLAUSE of currency_sign_clause | DECIMAL_CLAUSE of decimal_clause datatype special_names_clauses = SEVERAL_SPECIAL_NAMES_CLAUSES of special_names_clauses * special_names_clause | NO_SPECIAL_NAMES_CLAUSES datatype special_names_paragraph = SPECIAL_NAMES_PARAGRAPH of special_names_clauses | NO_SPECIAL_NAMES_PARAGRAPH datatype configuration_section = CONFIGURATION_SECTION of source_computer_paragraph * object_computer_paragraph * special_names_paragraph type input_output_section = unit (* END OF ENVIRONMENT DIVISION *) (* WORKINGSTORAGE and LINKAGE SECTION *) datatype left_right = LEFT | RIGHT datatype through_data_name = THROUGH_DATA_NAME of string | NOT_THROUGH_DATA_NAME datatype separate_character = SEPARATE | NO_SEPARATE datatype leading_trailing = LEADING_TRAILING_IS_LEADING | LEADING_TRAILING_IS_TRAILING datatype table_length_description = FIXED_LENGTH_TABLE of string (* integer-2 *) | VARIABLE_LENGTH_TABLE of string (* integer-1 *) * string (* integer-2 *) * string (* data-name-1 *) datatype ascending_descending = ASCENDING | DESCENDING datatype ascending_descending_key_phrase = ASCENDING_DESCENDING_KEY_PHRASE of ascending_descending * data_names datatype ascending_descending_key_phrases = ASCENDING_DESCENDING_KEY_PHRASES of ascending_descending_key_phrases * ascending_descending_key_phrase | NO_ASCENDING_DESCENDING_KEY_PHRASES datatype index_names = SEVERAL_INDEX_NAMES of index_names * string | ONE_INDEX_NAME of string datatype indexed_by_phrase = INDEXED_BY_PHRASE of index_names | NO_INDEXED_BY_PHRASE datatype usage_specifier = USAGE_IS_DISPLAY | USAGE_IS_INDEX | USAGE_IS_COMP3 | USAGE_IS_COMP4 | USAGE_IS_COMP datatype through_literal = THROUGH_LITERAL of literal | NO_THROUGH_LITERAL datatype literal_range = LITERAL_RANGE of literal * through_literal datatype literal_ranges = SEVERAL_LITERAL_RANGES of literal_ranges * literal_range | ONE_LITERAL_RANGE of literal_range datatype data_description_clause = DATA_DESCRIPTION_CLAUSE_IS_USAGE_CLAUSE of usage_specifier * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_SIGN_CLAUSE of leading_trailing * separate_character * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_OCCURS_CLAUSE of table_length_description * ascending_descending_key_phrases * indexed_by_phrase * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_SYNCHRONIZED_CLAUSE of left_right * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_JUSTIFIED_CLAUSE of pos * pos | DATA_DESCRIPTION_CLAUSE_IS_BLANK_WHEN_ZERO_CLAUSE of pos * pos | DATA_DESCRIPTION_CLAUSE_IS_VALUE_CLAUSE of literal_ranges * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_PICTURE_CLAUSE of string * pos * pos | DATA_DESCRIPTION_CLAUSE_IS_INDICATOR_CLAUSE of string * pos * pos datatype data_description_clauses = DATA_DESCRIPTION_CLAUSES of data_description_clauses * data_description_clause | NO_DATA_DESCRIPTION_CLAUSES datatype redefines_clause = REDEFINES_CLAUSE of string | NO_REDEFINES_CLAUSE datatype filler = FILLER | NO_FILLER datatype data_name_or_filler = DATA_NAME_OR_FILLER_IS_DATA_NAME of string | DATA_NAME_OR_FILLER_IS_FILLER of filler datatype record_description_entry = DATA_DESCRIPTION_ENTRY_134 of string (* levelnumber *) * data_name_or_filler * redefines_clause * data_description_clauses * pos * pos | RENAMES_CLAUSE of string (* levelnumber *) * string (* data-name *) * string (* data-name *) * through_data_name * pos * pos | TS2K_NOARROW of ts2k * pos * pos | TS2K_ARROW of ts2k * ts2k * pos * pos | TS2K_ALL of ts2k * ts2k * pos * pos | TS2K_END of pos * pos | TS2K_ASSUME_SEPARATE of pos * pos (* CHANGED-MHS: the 4 TS2K constructors were: | TS2K of ts2k * pos * pos | TS2K_EXPANDS of identifier * pos * pos | TS2K_FIRST_OR_FINAL END-CHANGED-MHS *) datatype record_description_entries = RECORD_DESCRIPTION_ENTRIES of record_description_entries * record_description_entry | NO_RECORD_DESCRIPTION_ENTRIES datatype record_description_entries_opt = RECORD_DESCRIPTION_ENTRIES_OPT of record_description_entries | NO_RECORD_DESCRIPTION_ENTRIES_OPT datatype working_storage_section = WORKINGSTORAGE_SECTION of record_description_entries_opt * pos * pos | NO_WORKINGSTORAGE_SECTION datatype linkage_section = LINKAGE_SECTION of record_description_entries_opt * pos * pos | NO_LINKAGE_SECTION (* END OF WORKINGSTORAGE and LINKAGE SECTION *) (* FILE SECTION *) datatype integer_range = SIMPLE_RANGE of string | INTEGER_TO_INTEGER of string * string datatype record_contains_clause = RECORD_CONTAINS of integer_range datatype data_records_clause = DATA_RECORD_IS of data_names datatype sort_description_clause = SORT_DESCRIPTION_CLAUSE_IS_RECORD of record_contains_clause * pos * pos | SORT_DESCRIPTION_CLAUSE_IS_DATA of data_records_clause * pos * pos datatype sort_description_clauses = SORT_DESCRIPTION_CLAUSES of sort_description_clauses * sort_description_clause | NO_SORT_DESCRIPTION_CLAUSE datatype sort_description_entry = SD of string * sort_description_clauses datatype footing_specification = FOOTING of data_name_or_integer | NOFOOTING datatype top_bottom_specification = TOP | BOTTOM datatype top_bottom_specifications = TOP_BOTTOM_SPECIFICATIONS of top_bottom_specifications * top_bottom_specification | NO_TOP_BOTTOM_SPECIFICATION datatype value_of_phrase = VALUE_OF of string * data_name_or_literal datatype value_of_phrases = VALUE_OF_PHRASES of value_of_phrases * value_of_phrase | VALUE_OF_PHRASE of value_of_phrase datatype characters_or_records = CHARACTERS | RECORDS datatype file_description_clause = BLOCK of integer_range * characters_or_records * pos * pos | FILE_DESCRIPTION_CLAUSE_IS_RECORD of record_contains_clause * pos * pos | LABEL_STANDARD | LABEL_OMITTED | VALUE_OF_CLAUSE of value_of_phrases * pos * pos | FILE_DESCRIPTION_CLAUSE_IS_DATA of data_records_clause * pos * pos | LINAGE_CLAUSE of data_name_or_integer * footing_specification * top_bottom_specifications * pos * pos | CODE_SET_CLAUSE of string * pos * pos datatype file_description_clauses = FILE_DESCRIPTION_CLAUSES of file_description_clauses * file_description_clause | NO_FILE_DESCRIPTION_CLAUSES datatype file_description_entry = FD of string * file_description_clauses * pos * pos datatype file_and_sort_description_entry = FILE_DESCRIPTION_ENTRY of file_description_entry | SORT_DESCRIPTION_ENTRY of sort_description_entry datatype file_description_paragraph = FILE_DESCRIPTION_PARAGRAPH of file_and_sort_description_entry * record_description_entries datatype file_description_paragraphs = FILE_DESCRIPTION_PARAGRAPHS of file_description_paragraphs * file_description_paragraph | NO_FILE_DESCRIPTION_PARAGRAPHS datatype file_section = FILE_SECTION of file_description_paragraphs * pos * pos | NO_FILE_SECTION (* END OF FILESECTION *) (* STATEMENTS *) datatype arithmetic_expression = ARITHMETIC_EXPRESSION_IS_INTEGER of string * pos * pos | ARITHMETIC_EXPRESSION_IS_DECIMALNUMBER of string * pos * pos | ARITHMETIC_EXPRESSION_IS_NONNUMERICLITERAL of string * pos * pos | ARITHMETIC_EXPRESSION_IS_BOOLEANLITERAL of bool * pos * pos | ARITHMETIC_EXPRESSION_IS_FIGURATIVE_CONSTANT of figurative_constant * pos * pos | ARITHMETIC_EXPRESSION_IS_IDENTIFIER of identifier | ARITHMETIC_EXPRESSION_IS_PLUS_SIGN of arithmetic_expression | ARITHMETIC_EXPRESSION_IS_MINUS_SIGN of arithmetic_expression | ARITHMETIC_EXPRESSION_IS_EXPONENTIATION of arithmetic_expression * arithmetic_expression | ARITHMETIC_EXPRESSION_IS_MULTIPLY of arithmetic_expression * arithmetic_expression | ARITHMETIC_EXPRESSION_IS_DIVIDE of arithmetic_expression * arithmetic_expression | ARITHMETIC_EXPRESSION_IS_ADD of arithmetic_expression * arithmetic_expression | ARITHMETIC_EXPRESSION_IS_SUBTRACT of arithmetic_expression * arithmetic_expression datatype simple_condition = CLASS_CONDITION of identifier * is_not * data_class | CONDITION_NAME of identifier | RELATION_CONDITION of arithmetic_expression * is_not * relational_operator * arithmetic_expression * pos * pos (* Unclear if TRUE and FALSE are allowed in conditions *) (* at all (TRUE is reserved word but not FALSE) *) | SIMPLE_CONDITION_IS_TRUE of pos * pos | SIMPLE_CONDITION_IS_FALSE of pos * pos | SIGN_CONDITION of arithmetic_expression * is_not * sign_specification (* SWITCH_STATUS_CONDITION is SYSTEM-SHUT-DOWN or UPSI-i *) (* Don't think we need to know *) | SWITCH_STATUS_CONDITION of pos * pos datatype conditional_expression = SIMPLE_CONDITION of simple_condition | NEGATED_CONDITION of conditional_expression (* the manual says NOT simple_expression, but example in fig 11-12 *) (* tells a different story!! *) | AND_CONDITION of conditional_expression * conditional_expression | OR_CONDITION of conditional_expression * conditional_expression datatype add_or_subtract = ADD | SUBTRACT datatype date_day_time = DATE of pos * pos | DAY of pos * pos | TIME of pos * pos datatype identifier_or_literal_or_ddt = IDENTIFIER_OR_LITERAL_OR_DDT_IS_IDENTIFIER_OR_LITERAL of identifier_or_literal | IDENTIFIER_OR_LITERAL_OR_DDT_IS_DDT of date_day_time datatype annotation_statement = TS2K_ASSUME of identifier_or_literal_or_ddt * ts2k * pos * pos | TS2K_COERCE of identifier_or_literal_or_ddt * ts2k * pos * pos * identifier datatype move_statement = MOVE of identifier_or_literal * identifiers * pos * pos | MOVECORRESPONDING of identifier * identifier * pos * pos datatype from_environment = NO_FROM | FROM of string * pos * pos datatype accept_statement = ACCEPT_ENVIRONMENT of identifier * from_environment * pos * pos | ACCEPT_DATE_DAY_TIME of identifier * date_day_time * pos * pos datatype statements = SEVERAL_STATEMENTS of statements * statement | ONE_STATEMENT of statement and statement = MOVE_STATEMENT of move_statement | COMPUTE_STATEMENT of compute_statement | ADD_OR_SUBTRACT_STATEMENT of add_or_subtract_statement | MULTIPLY_STATEMENT of multiply_statement | DIVIDE_STATEMENT of divide_statement | IF_STATEMENT of if_statement | ANNOTATION_STATEMENT of annotation_statement | ACCEPT_STATEMENT of accept_statement | OTHER_STATEMENT (* TODO *) and add_or_subtract_statement = ADD_OR_SUBTRACT of add_or_subtract * identifier_or_literals * identifier_roundeds * size_error_clause * pos * pos | ADD_OR_SUBTRACT_GIVING of add_or_subtract * identifier_or_literals * identifier_or_literal * identifier_roundeds * size_error_clause * pos * pos | ADD_OR_SUBTRACT_CORRESPONDING of add_or_subtract * identifier * identifier * rounded * size_error_clause * pos * pos and compute_statement = COMPUTE of identifier_roundeds * arithmetic_expression * size_error_clause * pos * pos and multiply_statement = MULTIPLY of identifier_or_literal * identifier_roundeds * size_error_clause * pos * pos | MULTIPLY_GIVING of identifier_or_literal * identifier_or_literal * identifier_roundeds * size_error_clause * pos * pos (* NOTE: the following is not checked against the manual *) (* neither is it tested *) and divide_statement = (* DIVIDE a INTO b [[ON] SIZE ERROR c] *) DIVIDE_INTO of identifier_or_literal (* a *) * identifier_roundeds (* b *) * size_error_clause (* c *) * pos * pos (* DIVIDE a INTO b GIVING c [[ON] SIZE ERROR d] *) | DIVIDE_INTO_GIVING of identifier_or_literal (* a *) * identifier_or_literal (* b *) * identifier_roundeds (* c *) * size_error_clause (* d *) * pos * pos (* DIVIDE a INTO b GIVING c REMAINDER d [[ON] SIZE ERROR e] *) | DIVIDE_INTO_GIVING_REMAINDER of identifier_or_literal (* a *) * identifier_or_literal (* b *) * identifier_roundeds (* c *) * identifier (* d *) * size_error_clause (* e *) * pos * pos (* DIVIDE a BY b GIVING c [[ON] SIZE ERROR d] *) | DIVIDE_BY_GIVING of identifier_or_literal (* a *) * identifier_or_literal (* b *) * identifier_roundeds (* c *) * size_error_clause (* d *) * pos * pos (* DIVIDE a BY b GIVING c REMAINDER d [[ON] SIZE ERROR e] *) | DIVIDE_BY_GIVING_REMAINDER of identifier_or_literal (* a *) * identifier_or_literal (* b *) * identifier_roundeds (* c *) * identifier (* d *) * size_error_clause (* e *) * pos * pos and size_error_clause = SIZE_ERROR of statements | NO_SIZE_ERROR and if_statement = IF of conditional_expression * then_statements * else_statements * pos * pos and then_statements = THEN_STATEMENTS of statements | NEXT_SENTENCE and else_statements = ELSE of statements | ELSE_NEXT_SENTENCE | NO_ELSE (* ENDSTATEMENTS *) (* PROCEDURE DIVISION *) type section_name = string type paragraph_name = string datatype sentence = SENTENCE of statements datatype sentences = SENTENCES of sentences * sentence | NO_SENTENCES datatype paragraph = PARAGRAPH of paragraph_name * sentences datatype paragraphs = SEVERAL_PARAGRAPHS of paragraphs * paragraph | ONE_PARAGRAPH of paragraph datatype segment_number_opt = SEGMENT_NUMBER of string | NOSEGMENT_NUMBER datatype sections = NO_BODY_SECTION of section_name * segment_number_opt | NO_BODY_SECTION_FOLLOWED_BY_SECTION of section_name * segment_number_opt * sections | SECTION of section_name * segment_number_opt * paragraphs_and_sections and paragraphs_and_sections = SEVERAL_PARAGRAPHS_AND_SECTIONS of paragraph * paragraphs_and_sections | SINGLE_PARAGRAPH_AND_SECTIONS of paragraph * sections | SINGLE_PARAGRAPH of paragraph type using_clause = unit (* TODO *) type declaratives_section = unit (* TODO *) datatype procedure_division = PROCEDURE_DIVISION_FORMAT_1_DECLARATIVES of using_clause * declaratives_section * sections * pos * pos | PROCEDURE_DIVISION_FORMAT_1_NO_DECLARATIVES of using_clause * sections * pos * pos | PROCEDURE_DIVISION_FORMAT_2 of using_clause * paragraphs * pos * pos | EMPTY_PROCEDURE_DIVISION (* no procedure division allowed by our parser though mandatory in S/36 *) (* END OF PROCEDURE DIVISION *) (* PROGRAM STRUCTURE *) datatype data_division = DATA_DIVISION of file_section * working_storage_section * linkage_section | NO_DATA_DIVISION datatype environment_division = ENVIRONMENT_DIVISION of configuration_section * input_output_section | NO_ENVIRONMENT_DIVISION type identification_division = unit datatype cobol_program = PROGRAM of identification_division * environment_division * data_division * procedure_division datatype test_cobol_programs = TEST_COBOL_PROGRAMS of test_cobol_programs * cobol_program | TEST_COBOL_PROGRAM of cobol_program datatype test_cobol = TEST of test_cobol_programs | COBOL_PROGRAM of cobol_program end; datatype cexpression = CE_AE of Cobol.arithmetic_expression * Cobol.pos * Cobol.pos | CE_SINGLE_REL of Cobol.relational_operator * Cobol.arithmetic_expression * Cobol.pos * Cobol.pos | CE_REL of Cobol.arithmetic_expression * Cobol.is_not * Cobol.relational_operator * Cobol.arithmetic_expression * Cobol.pos * Cobol.pos | CE_DC of Cobol.arithmetic_expression * Cobol.is_not * Cobol.data_class | CE_SIGN of Cobol.arithmetic_expression * Cobol.is_not * Cobol.sign_specification | CE_SWITCH of Cobol.pos * Cobol.pos | CE_TRUE of Cobol.pos * Cobol.pos | CE_FALSE of Cobol.pos * Cobol.pos | CE_NOT of cexpression | CE_AND of cexpression * cexpression | CE_OR of cexpression * cexpression structure MlyValue = struct datatype svalue = VOID | ntVOID of unit | PSEUDOTEXT of (string) | USERDEFINEDWORD of (string) | PICTURESTRING of (string) | BOOLEANLITERAL of (bool) | INTEGER of (string) | DECIMALNUMBER of (string) | NONNUMERICLITERAL of (string) | identifier_or_literal_or_ddt of (Cobol.identifier_or_literal_or_ddt) | ts2k of (Cobol.ts2k) | annotation_statement of (Cobol.annotation_statement) | data_description_annotation of (Cobol.record_description_entry) | working_storage_section of (Cobol.working_storage_section) | variable_length_tables_clause of (Cobol.table_length_description*Cobol.ascending_descending_key_phrases*Cobol.indexed_by_phrase) | value_of_phrases of (Cobol.value_of_phrases) | value_of_phrase of (Cobol.value_of_phrase) | value_of_clause of (Cobol.file_description_clause) | value_clause of (Cobol.literal_ranges) | using_clause of (Cobol.using_clause) | usage_specifier of (Cobol.usage_specifier) | usage_clause of (Cobol.usage_specifier) | top_bottom_specifications of (Cobol.top_bottom_specifications) | top_bottom_specification of (Cobol.top_bottom_specification) | top_bottom of (Cobol.top_bottom_specification) | filler of (Cobol.filler) | through_literal of (Cobol.through_literal) | through_data_name of (Cobol.through_data_name) | then_statements of (Cobol.then_statements) | text_name of (string) | system_name of (string) | conditional_expression of (Cobol.conditional_expression) | arithmetic_expression of (Cobol.arithmetic_expression) | synchronized_clause of (Cobol.left_right) | subtract_statement of (Cobol.add_or_subtract_statement) | subscript_phrase of (Cobol.subscript_phrase) | statements of (Cobol.statements) | statement of (Cobol.statement) | standard_or_omitted of (Cobol.file_description_clause) | special_names_paragraph of (Cobol.special_names_paragraph) | source_computer_paragraph of (Cobol.source_computer_paragraph) | sort_description_entry of (Cobol.sort_description_entry) | sort_description_clauses of (Cobol.sort_description_clauses) | sort_description_clause of (Cobol.sort_description_clause) | size_error_clauses of (Cobol.size_error_clause) | size_error_clause of (Cobol.size_error_clause) | sign_clause of (Cobol.leading_trailing*Cobol.separate_character) | separate_character of (Cobol.separate_character) | sentences of (Cobol.sentences) | sentence of (Cobol.sentence) | segment_number_opt of (Cobol.segment_number_opt) | sections of (Cobol.sections) | section_name of (string) | rounded of (Cobol.rounded) | renames_clause of (Cobol.record_description_entry) | redefines_clause of (Cobol.redefines_clause) | record_description_entry of (Cobol.record_description_entry) | record_description_entries of (Cobol.record_description_entries) | record_description_entries_opt of (Cobol.record_description_entries_opt) | record_contains_clause of (Cobol.record_contains_clause) | qualifications of (Cobol.qualifications) | qualification of (Cobol.qualification) | procedure_division of (Cobol.procedure_division) | data_name_or_filler of (Cobol.data_name_or_filler) | picture_clause of (string) | paragraphs_and_sections of (Cobol.paragraphs_and_sections) | paragraphs of (Cobol.paragraphs) | paragraph_name of (string) | paragraph of (Cobol.paragraph) | occurs_clause of (Cobol.table_length_description*Cobol.ascending_descending_key_phrases*Cobol.indexed_by_phrase) | object_computer_paragraph of (Cobol.object_computer_paragraph) | multiply_statement of (Cobol.multiply_statement) | move_statement of (Cobol.move_statement) | mnemonic_name of (string) | literal_ranges of (Cobol.literal_ranges) | literal_range of (Cobol.literal_range) | literal of (Cobol.literal) | linkage_section of (Cobol.linkage_section) | linage_clause of (Cobol.file_description_clause) | level_number of (string) | left_right of (Cobol.left_right) | figurative_constant of (Cobol.figurative_constant) | leading_trailing of (Cobol.leading_trailing) | label_records_clause of (Cobol.file_description_clause) | is_not of (Cobol.is_not) | integer_range of (Cobol.integer_range) | input_output_section of (Cobol.input_output_section) | indicator_clause of (string) | indexed_by_phrase of (Cobol.indexed_by_phrase) | index_names of (Cobol.index_names) | index_name of (string) | imperative_statement of (Cobol.statements) | if_statement of (Cobol.if_statement) | identifiers of (Cobol.identifiers) | identifier_roundeds of (Cobol.identifier_roundeds) | identifier_rounded of (Cobol.identifier_rounded) | identifier_or_literals of (Cobol.identifier_or_literals) | identifier_or_literal of (Cobol.identifier_or_literal) | identifier of (Cobol.identifier) | identification_division of (Cobol.identification_division) | from_environment of (Cobol.from_environment) | footing_specification of (Cobol.footing_specification) | fixed_length_tables_clause of (Cobol.table_length_description*Cobol.ascending_descending_key_phrases*Cobol.indexed_by_phrase) | file_section of (Cobol.file_section) | file_name of (string) | file_description_paragraphs of (Cobol.file_description_paragraphs) | file_description_paragraph of (Cobol.file_description_paragraph) | file_description_entry of (Cobol.file_description_entry) | file_description_clauses of (Cobol.file_description_clauses) | file_description_clause of (Cobol.file_description_clause) | file_and_sort_description_entry of (Cobol.file_and_sort_description_entry) | special_register of (Cobol.special_register) | environment_division of (Cobol.environment_division) | else_statements of (Cobol.else_statements) | divide_statement of (Cobol.divide_statement) | sign_specification of (Cobol.sign_specification) | data_class of (Cobol.data_class) | relational_operator of (Cobol.relational_operator) | declaratives_section of (Cobol.declaratives_section) | decimal_clause of (Cobol.decimal_clause) | date_day_time of (Cobol.date_day_time) | data_records_clause of (Cobol.data_records_clause) | data_name_or_literal of (Cobol.data_name_or_literal) | special_names_clause of (Cobol.special_names_clause) | special_names_clauses of (Cobol.special_names_clauses) | data_name_or_integer of (Cobol.data_name_or_integer) | data_names of (Cobol.data_names) | data_name of (string) | data_division of (Cobol.data_division) | data_description_entry_134 of (Cobol.record_description_entry) | data_description_entry of (Cobol.record_description_entry) | data_description_clauses of (Cobol.data_description_clauses) | data_description_clause of (Cobol.data_description_clause) | currency_sign_clause of (Cobol.currency_sign_clause) | configuration_section of (Cobol.configuration_section) | compute_statement of (Cobol.compute_statement) | code_set_clause of (Cobol.file_description_clause) | characters_or_records of (Cobol.characters_or_records) | character_string of (string) | block_contains_clause of (Cobol.file_description_clause) | ascending_descending_key_phrases of (Cobol.ascending_descending_key_phrases) | ascending_descending_key_phrase of (Cobol.ascending_descending_key_phrase) | ascending_descending of (Cobol.ascending_descending) | expression of (cexpression) | alphabet_name of (string) | add_statement of (Cobol.add_or_subtract_statement) | accept_statement of (Cobol.accept_statement) | test_cobol of (Cobol.test_cobol) | test_cobol_program of (Cobol.cobol_program) | test_cobol_programs of (Cobol.test_cobol_programs) | cobol_program of (Cobol.cobol_program) end type svalue = MlyValue.svalue (*TODO 13/01/1998 14:54. hojfeld.: mine erklringer:*) type pos = unit type arg = unit datatype nonterm = hojfelds_NT of int exception Hojfeld of string (*og s: LrTable.NT |-> hojfelds_NT*) (*TODO 13/01/1998 14:54. hojfeld.: mine erklringer slut*) fun actions(i392:int, defaultPos:pos, stack:(unit (*LrTable.state*) * (svalue * pos * pos)) list, ():arg ) = case (i392, stack) of (0, _) => raise Hojfeld "0" (*act0(stack)*) | (1, _) => raise Hojfeld "1" (*act1(stack)*) | (2, _) => raise Hojfeld "2" (*act2(stack)*) | (3, _) => raise Hojfeld "3" (*act3(stack)*) | (4, _) => raise Hojfeld "4" (*act4(stack)*) | (5, _) => raise Hojfeld "5" (*act5(stack)*) | (6, _) => raise Hojfeld "6" (*act6(stack)*) | (7, _) => raise Hojfeld "7" (*act7(stack)*) | (8, _) => raise Hojfeld "8" (*act8(stack,defaultPos)*) | (9, _) => raise Hojfeld "9" (*act9(stack)*) | (10,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 76,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (11,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.data_name((USERDEFINEDWORD)) in (hojfelds_NT 96,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (12,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 98,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (13,(_,(_,_,qdata_name1right))::_::(_,(_,USERDEFINEDWORD1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 98,(result,USERDEFINEDWORD1left,qdata_name1right), rest671) end | (14,(_,(_,_,qdata_name1right))::_::(_,(_,USERDEFINEDWORD1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 98,(result,USERDEFINEDWORD1left,qdata_name1right), rest671) end | (15,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 389,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (16,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.file_name((USERDEFINEDWORD)) in (hojfelds_NT 200,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (17,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.index_name((USERDEFINEDWORD)) in (hojfelds_NT 244,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (18,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.mnemonic_name((USERDEFINEDWORD)) in (hojfelds_NT 309,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (19,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 415,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (20,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 291,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (21,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 374,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (22,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.text_name((USERDEFINEDWORD)) in (hojfelds_NT 486,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (23,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.paragraph_name((USERDEFINEDWORD)) in (hojfelds_NT 357,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (24,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.paragraph_name((INTEGER)) in (hojfelds_NT 357,(result,INTEGER1left,INTEGER1right),rest671) end | (25,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.section_name((USERDEFINEDWORD)) in (hojfelds_NT 422,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (26,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.section_name((INTEGER)) in (hojfelds_NT 422,(result,INTEGER1left,INTEGER1right),rest671) end | (27,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.level_number((INTEGER)) in (hojfelds_NT 290,(result,INTEGER1left,INTEGER1right),rest671) end | (28,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD, USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.system_name((USERDEFINEDWORD)) in (hojfelds_NT 478,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (29,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 74,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (30,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 286,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (31,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.ZERO)) in (hojfelds_NT 288,(result,ZERO1left,ZERO1right),rest671) end | (32,(_,(_,ZEROS1left,ZEROS1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.ZERO)) in (hojfelds_NT 288,(result,ZEROS1left,ZEROS1right),rest671) end | (33,(_,(_,ZEROES1left,ZEROES1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.ZERO)) in (hojfelds_NT 288,(result,ZEROES1left,ZEROES1right),rest671) end | (34,(_,(_,SPACE1left,SPACE1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.SPACE)) in (hojfelds_NT 288,(result,SPACE1left,SPACE1right),rest671) end | (35,(_,(_,SPACES1left,SPACES1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.SPACE)) in (hojfelds_NT 288,(result,SPACES1left,SPACES1right),rest671) end | (36,(_,(_,HIGHVALUE1left,HIGHVALUE1right))::rest671) => let val result=MlyValue.figurative_constant((Cobol.HIGHVALUE)) in (hojfelds_NT 288,(result,HIGHVALUE1left,HIGHVALUE1right),rest671) end | (37,(_,(_,HIGHVALUES1left,HIGHVALUES1right))::rest671) => let val result=MlyValue.figurative_constant((Cobol.HIGHVALUE)) in (hojfelds_NT 288,(result,HIGHVALUES1left,HIGHVALUES1right),rest671) end | (38,(_,(_,LOWVALUE1left,LOWVALUE1right))::rest671) => let val result =MlyValue.figurative_constant((Cobol.LOWVALUE)) in (hojfelds_NT 288,(result,LOWVALUE1left,LOWVALUE1right),rest671) end | (39,(_,(_,LOWVALUES1left,LOWVALUES1right))::rest671) => let val result=MlyValue.figurative_constant((Cobol.LOWVALUE)) in (hojfelds_NT 288,(result,LOWVALUES1left,LOWVALUES1right),rest671) end | (40,(_,(_,QUOTE1left,QUOTE1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.QUOTE)) in (hojfelds_NT 288,(result,QUOTE1left,QUOTE1right),rest671) end | (41,(_,(_,QUOTES1left,QUOTES1right))::rest671) => let val result= MlyValue.figurative_constant((Cobol.QUOTE)) in (hojfelds_NT 288,(result,QUOTES1left,QUOTES1right),rest671) end | (42,(_,(_,_,ZERO1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_ZERO)) in (hojfelds_NT 288,(result,ALL1left,ZERO1right),rest671) end | (43,(_,(_,_,ZEROS1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_ZERO)) in (hojfelds_NT 288,(result,ALL1left,ZEROS1right),rest671) end | (44,(_,(_,_,ZEROES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_ZERO)) in (hojfelds_NT 288,(result,ALL1left,ZEROES1right),rest671) end | (45,(_,(_,_,SPACE1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_SPACE)) in (hojfelds_NT 288,(result,ALL1left,SPACE1right),rest671) end | (46,(_,(_,_,SPACES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_SPACE)) in (hojfelds_NT 288,(result,ALL1left,SPACES1right),rest671) end | (47,(_,(_,_,HIGHVALUE1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_HIGHVALUE)) in (hojfelds_NT 288,(result,ALL1left,HIGHVALUE1right),rest671) end | (48,(_,(_,_,HIGHVALUES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_HIGHVALUE)) in (hojfelds_NT 288,(result,ALL1left,HIGHVALUES1right),rest671) end | (49,(_,(_,_,LOWVALUE1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_LOWVALUE)) in (hojfelds_NT 288,(result,ALL1left,LOWVALUE1right),rest671) end | (50,(_,(_,_,LOWVALUES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_LOWVALUE)) in (hojfelds_NT 288,(result,ALL1left,LOWVALUES1right),rest671) end | (51,(_,(_,_,QUOTE1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_QUOTE)) in (hojfelds_NT 288,(result,ALL1left,QUOTE1right),rest671) end | (52,(_,(_,_,QUOTES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant((Cobol.ALL_QUOTE)) in (hojfelds_NT 288,(result,ALL1left,QUOTES1right),rest671) end | (53,(_,(MlyValue.NONNUMERICLITERAL NONNUMERICLITERAL,_, NONNUMERICLITERAL1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.figurative_constant(( Cobol.ALL_NONNUMERICLITERAL(NONNUMERICLITERAL))) in (hojfelds_NT 288,(result,ALL1left,NONNUMERICLITERAL1right),rest671) end | (54,(_,(_,LINAGECOUNTER1left,LINAGECOUNTER1right))::rest671) => let val result=MlyValue.special_register((Cobol.LINAGECOUNTER)) in (hojfelds_NT 181,(result,LINAGECOUNTER1left,LINAGECOUNTER1right), rest671) end | (55,(_,(_,DEBUGITEM1left,DEBUGITEM1right))::rest671) => let val result=MlyValue.special_register((Cobol.DEBUGITEM)) in (hojfelds_NT 181,(result,DEBUGITEM1left,DEBUGITEM1right),rest671) end | (56,(_,(_,PERIOD1left,PERIOD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 361,(result,PERIOD1left,PERIOD1right),rest671) end | (57,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 361,(result,defaultPos,defaultPos),rest671) end | (58,(_,(_,data_name1left,data_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 100,(result,data_name1left,data_name1right),rest671) end | (59,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 100,(result,defaultPos,defaultPos),rest671) end | (60,(_,(_,procedure_name1left,procedure_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 369,(result,procedure_name1left,procedure_name1right), rest671) end | (61,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 369,(result,defaultPos,defaultPos),rest671) end | (62,(_,(_,routine_name1left,routine_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 183,(result,routine_name1left,routine_name1right), rest671) end | (63,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 183,(result,defaultPos,defaultPos),rest671) end | (64,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.segment_number_opt(( Cobol.SEGMENT_NUMBER(INTEGER))) in (hojfelds_NT 428,(result,INTEGER1left,INTEGER1right),rest671) end | (65,rest671) => let val result=MlyValue.segment_number_opt(( Cobol.NOSEGMENT_NUMBER)) in (hojfelds_NT 428,(result,defaultPos,defaultPos),rest671) end | (66,(_,(MlyValue.data_name data_name,_,data_name1right))::(_,( MlyValue.data_names data_names,data_names1left,_))::rest671) => let val result=MlyValue.data_names(( Cobol.DATA_NAMES(data_names,data_name ))) in (hojfelds_NT 97,(result,data_names1left,data_name1right),rest671) end | (67,(_,(MlyValue.data_name data_name,data_name1left,data_name1right) )::rest671) => let val result=MlyValue.data_names(( Cobol.ONE_DATA_NAME(data_name))) in (hojfelds_NT 97,(result,data_name1left,data_name1right),rest671) end | (68,(_,(_,_,qdata_name1right))::(_,(_,qdata_names1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 99,(result,qdata_names1left,qdata_name1right),rest671) end | (69,(_,(_,qdata_name1left,qdata_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 99,(result,qdata_name1left,qdata_name1right),rest671) end | (70,(_,(_,_,file_name1right))::(_,(_,file_names1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 203,(result,file_names1left,file_name1right),rest671) end | (71,(_,(_,file_name1left,file_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 203,(result,file_name1left,file_name1right),rest671) end | (72,(_,(MlyValue.index_name index_name,_,index_name1right))::(_,( MlyValue.index_names index_names,index_names1left,_))::rest671) => let val result=MlyValue.index_names(( Cobol.SEVERAL_INDEX_NAMES(index_names,index_name))) in (hojfelds_NT 245,(result,index_names1left,index_name1right),rest671 ) end | (73,(_,(MlyValue.index_name index_name,index_name1left, index_name1right))::rest671) => let val result=MlyValue.index_names(( Cobol.ONE_INDEX_NAME(index_name))) in (hojfelds_NT 245,(result,index_name1left,index_name1right),rest671) end | (74,(_,(_,_,procedure_name1right))::(_,(_,procedure_names1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 370,(result,procedure_names1left,procedure_name1right) ,rest671) end | (75,(_,(_,procedure_name1left,procedure_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 370,(result,procedure_name1left,procedure_name1right), rest671) end | (76,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 106,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (77,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 368,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right ),rest671) end | (78,(_,(_,INTEGER1left,INTEGER1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 368,(result,INTEGER1left,INTEGER1right),rest671) end | (79,(_,(_,SYSTEMCONSOLE1left,SYSTEMCONSOLE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,SYSTEMCONSOLE1left,SYSTEMCONSOLE1right), rest671) end | (80,(_,(_,REQUESTOR1left,REQUESTOR1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,REQUESTOR1left,REQUESTOR1right),rest671) end | (81,(_,(_,LOCALDATA1left,LOCALDATA1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,LOCALDATA1left,LOCALDATA1right),rest671) end | (82,(_,(_,ATTRIBUTEDATA1left,ATTRIBUTEDATA1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,ATTRIBUTEDATA1left,ATTRIBUTEDATA1right), rest671) end | (83,(_,(_,C011left,C011right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,C011left,C011right),rest671) end | (84,(_,(_,CSP1left,CSP1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 154,(result,CSP1left,CSP1right),rest671) end | (85,(_,(_,SYSTEMSHUTDOWN1left,SYSTEMSHUTDOWN1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,SYSTEMSHUTDOWN1left,SYSTEMSHUTDOWN1right), rest671) end | (86,(_,(_,UPSI01left,UPSI01right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI01left,UPSI01right),rest671) end | (87,(_,(_,UPSI11left,UPSI11right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI11left,UPSI11right),rest671) end | (88,(_,(_,UPSI21left,UPSI21right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI21left,UPSI21right),rest671) end | (89,(_,(_,UPSI31left,UPSI31right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI31left,UPSI31right),rest671) end | (90,(_,(_,UPSI41left,UPSI41right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI41left,UPSI41right),rest671) end | (91,(_,(_,UPSI51left,UPSI51right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI51left,UPSI51right),rest671) end | (92,(_,(_,UPSI61left,UPSI61right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI61left,UPSI61right),rest671) end | (93,(_,(_,UPSI71left,UPSI71right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 155,(result,UPSI71left,UPSI71right),rest671) end | (94,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 47,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right) ,rest671) end | (95,(_,(_,ADVANCING1left,ADVANCING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 11,(result,ADVANCING1left,ADVANCING1right),rest671) end | (96,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 11,(result,defaultPos,defaultPos),rest671) end | (97,(_,(_,ALL1left,ALL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 15,(result,ALL1left,ALL1right),rest671) end | (98,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 15,(result,defaultPos,defaultPos),rest671) end | (99,(_,(_,ARE1left,ARE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 38,(result,ARE1left,ARE1right),rest671) end | (100,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 38,(result,defaultPos,defaultPos),rest671) end | (101,(_,(_,AREA1left,AREA1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 39,(result,AREA1left,AREA1right),rest671) end | (102,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 39,(result,defaultPos,defaultPos),rest671) end | (103,(_,(_,AREAS1left,AREAS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 41,(result,AREAS1left,AREAS1right),rest671) end | (104,(_,(_,AREA1left,AREA1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 41,(result,AREA1left,AREA1right),rest671) end | (105,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 41,(result,defaultPos,defaultPos),rest671) end | (106,(_,(_,_,for_opt1right))::(_,(_,area1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 40,(result,area1left,for_opt1right),rest671) end | (107,(_,(_,AT1left,AT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 48,(result,AT1left,AT1right),rest671) end | (108,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 48,(result,defaultPos,defaultPos),rest671) end | (109,(_,(_,BY1left,BY1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 54,(result,BY1left,BY1right),rest671) end | (110,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 54,(result,defaultPos,defaultPos),rest671) end | (111,(_,(_,CHARACTER1left,CHARACTER1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 59,(result,CHARACTER1left,CHARACTER1right),rest671) end | (112,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 59,(result,defaultPos,defaultPos),rest671) end | (113,(_,(_,CHARACTERS1left,CHARACTERS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 61,(result,CHARACTERS1left,CHARACTERS1right),rest671) end | (114,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 61,(result,defaultPos,defaultPos),rest671) end | (115,(_,(_,COLLATING1left,COLLATING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 66,(result,COLLATING1left,COLLATING1right),rest671) end | (116,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 66,(result,defaultPos,defaultPos),rest671) end | (117,(_,(_,CONTAINS1left,CONTAINS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 78,(result,CONTAINS1left,CONTAINS1right),rest671) end | (118,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 78,(result,defaultPos,defaultPos),rest671) end | (119,(_,(_,EVERY1left,EVERY1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 159,(result,EVERY1left,EVERY1right),rest671) end | (120,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 159,(result,defaultPos,defaultPos),rest671) end | (121,(_,(_,FILE1left,FILE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 166,(result,FILE1left,FILE1right),rest671) end | (122,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 166,(result,defaultPos,defaultPos),rest671) end | (123,(_,(_,FILLER1left,FILLER1right))::rest671) => let val result= MlyValue.filler((Cobol.FILLER)) in (hojfelds_NT 496,(result,FILLER1left,FILLER1right),rest671) end | (124,rest671) => let val result=MlyValue.filler((Cobol.NO_FILLER)) in (hojfelds_NT 496,(result,defaultPos,defaultPos),rest671) end | (125,(_,(_,FOR1left,FOR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 213,(result,FOR1left,FOR1right),rest671) end | (126,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 213,(result,defaultPos,defaultPos),rest671) end | (127,(_,(_,_,REMOVAL1right))::(_,(_,for_opt1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 214,(result,for_opt1left,REMOVAL1right),rest671) end | (128,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 214,(result,defaultPos,defaultPos),rest671) end | (129,(_,(_,INITIAL1left,INITIAL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 253,(result,INITIAL1left,INITIAL1right),rest671) end | (130,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 253,(result,defaultPos,defaultPos),rest671) end | (131,(_,(_,IN1left,IN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 242,(result,IN1left,IN1right),rest671) end | (132,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 242,(result,defaultPos,defaultPos),rest671) end | (133,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 278,(result,IS1left,IS1right),rest671) end | (134,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 278,(result,defaultPos,defaultPos),rest671) end | (135,(_,(_,_,NOT1right))::(_,(_,IS1left,_))::rest671) => let val result=MlyValue.is_not((Cobol.IS_NOT_NOT)) in (hojfelds_NT 279,(result,IS1left,NOT1right),rest671) end | (136,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.is_not((Cobol.IS_NOT_IS)) in (hojfelds_NT 279,(result,IS1left,IS1right),rest671) end | (137,(_,(_,NOT1left,NOT1right))::rest671) => let val result= MlyValue.is_not((Cobol.IS_NOT_NOT)) in (hojfelds_NT 279,(result,NOT1left,NOT1right),rest671) end | (138,rest671) => let val result=MlyValue.is_not((Cobol.IS_NOT_IS)) in (hojfelds_NT 279,(result,defaultPos,defaultPos),rest671) end | (139,(_,(_,KEY1left,KEY1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 282,(result,KEY1left,KEY1right),rest671) end | (140,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 282,(result,defaultPos,defaultPos),rest671) end | (141,(_,(_,LINE1left,LINE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 294,(result,LINE1left,LINE1right),rest671) end | (142,(_,(_,lines1left,lines1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 294,(result,lines1left,lines1right),rest671) end | (143,(_,(_,LINES1left,LINES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 295,(result,LINES1left,LINES1right),rest671) end | (144,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 295,(result,defaultPos,defaultPos),rest671) end | (145,(_,(_,_,is1right))::(_,(_,MODE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 313,(result,MODE1left,is1right),rest671) end | (146,(_,(_,is1left,is1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 313,(result,is1left,is1right),rest671) end | (147,(_,(_,NEXT1left,NEXT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,NEXT1left,NEXT1right),rest671) end | (148,(_,(_,FIRST1left,FIRST1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,FIRST1left,FIRST1right),rest671) end | (149,(_,(_,LAST1left,LAST1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,LAST1left,LAST1right),rest671) end | (150,(_,(_,PRIOR1left,PRIOR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,PRIOR1left,PRIOR1right),rest671) end | (151,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 148,(result,defaultPos,defaultPos),rest671) end | (152,(_,(_,OF1left,OF1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 331,(result,OF1left,OF1right),rest671) end | (153,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 331,(result,defaultPos,defaultPos),rest671) end | (154,(_,(_,ON1left,ON1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 335,(result,ON1left,ON1right),rest671) end | (155,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 335,(result,defaultPos,defaultPos),rest671) end | (156,(_,(_,OPTIONAL1left,OPTIONAL1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 348,(result,OPTIONAL1left,OPTIONAL1right),rest671) end | (157,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 348,(result,defaultPos,defaultPos),rest671) end | (158,(_,(_,_,is1right))::(_,(_,ORGANIZATION1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 352,(result,ORGANIZATION1left,is1right),rest671) end | (159,(_,(_,_,TO1right))::(_,(_,PROCEED1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 371,(result,PROCEED1left,TO1right),rest671) end | (160,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 371,(result,defaultPos,defaultPos),rest671) end | (161,(_,(_,_,COLLATING1right))::(_,(_,PROGRAM1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 373,(result,PROGRAM1left,COLLATING1right),rest671) end | (162,(_,(_,PROGRAM1left,PROGRAM1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 373,(result,PROGRAM1left,PROGRAM1right),rest671) end | (163,(_,(_,COLLATING1left,COLLATING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 373,(result,COLLATING1left,COLLATING1right),rest671) end | (164,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 373,(result,defaultPos,defaultPos),rest671) end | (165,(_,(_,RECORD1left,RECORD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 378,(result,RECORD1left,RECORD1right),rest671) end | (166,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 378,(result,defaultPos,defaultPos),rest671) end | (167,(_,(_,RIGHT1left,RIGHT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 413,(result,RIGHT1left,RIGHT1right),rest671) end | (168,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 413,(result,defaultPos,defaultPos),rest671) end | (169,(_,(_,ROUNDED1left,ROUNDED1right))::rest671) => let val result= MlyValue.rounded((Cobol.ROUNDED)) in (hojfelds_NT 414,(result,ROUNDED1left,ROUNDED1right),rest671) end | (170,rest671) => let val result=MlyValue.rounded((Cobol.NOT_ROUNDED) ) in (hojfelds_NT 414,(result,defaultPos,defaultPos),rest671) end | (171,(_,(_,_,character1right))::(_,(_,SEPARATE1left,_))::rest671) => let val result=MlyValue.separate_character((Cobol.SEPARATE)) in (hojfelds_NT 431,(result,SEPARATE1left,character1right),rest671) end | (172,rest671) => let val result=MlyValue.separate_character(( Cobol.NO_SEPARATE)) in (hojfelds_NT 431,(result,defaultPos,defaultPos),rest671) end | (173,(_,(_,_,IS1right))::(_,(_,SIGN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 437,(result,SIGN1left,IS1right),rest671) end | (174,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 437,(result,IS1left,IS1right),rest671) end | (175,(_,(_,_,is1right))::(_,(_,SIGN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 438,(result,SIGN1left,is1right),rest671) end | (176,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 438,(result,defaultPos,defaultPos),rest671) end | (177,(_,(_,SIZE1left,SIZE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 440,(result,SIZE1left,SIZE1right),rest671) end | (178,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 440,(result,defaultPos,defaultPos),rest671) end | (179,(_,(_,STANDARD1left,STANDARD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 455,(result,STANDARD1left,STANDARD1right),rest671) end | (180,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 455,(result,defaultPos,defaultPos),rest671) end | (181,(_,(_,_,IS1right))::(_,(_,STATUS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 464,(result,STATUS1left,IS1right),rest671) end | (182,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 464,(result,IS1left,IS1right),rest671) end | (183,(_,(_,_,CONTAINS1right))::(_,(_,TAPE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 483,(result,TAPE1left,CONTAINS1right),rest671) end | (184,(_,(_,TAPE1left,TAPE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 483,(result,TAPE1left,TAPE1right),rest671) end | (185,(_,(_,CONTAINS1left,CONTAINS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 483,(result,CONTAINS1left,CONTAINS1right),rest671) end | (186,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 483,(result,defaultPos,defaultPos),rest671) end | (187,(_,(_,THAN1left,THAN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 487,(result,THAN1left,THAN1right),rest671) end | (188,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 487,(result,defaultPos,defaultPos),rest671) end | (189,(_,(_,THEN1left,THEN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 488,(result,THEN1left,THEN1right),rest671) end | (190,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 488,(result,defaultPos,defaultPos),rest671) end | (191,(_,(_,TIMES1left,TIMES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 497,(result,TIMES1left,TIMES1right),rest671) end | (192,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 497,(result,defaultPos,defaultPos),rest671) end | (193,(_,(_,TO1left,TO1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 499,(result,TO1left,TO1right),rest671) end | (194,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 499,(result,defaultPos,defaultPos),rest671) end | (195,(_,(_,_,is1right))::(_,(_,USAGE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 508,(result,USAGE1left,is1right),rest671) end | (196,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 508,(result,defaultPos,defaultPos),rest671) end | (197,(_,(_,WHEN1left,WHEN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 524,(result,WHEN1left,WHEN1right),rest671) end | (198,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 524,(result,defaultPos,defaultPos),rest671) end | (199,(_,(_,WITH1left,WITH1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 528,(result,WITH1left,WITH1right),rest671) end | (200,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 528,(result,defaultPos,defaultPos),rest671) end | (201,(_,(_,CORRESPONDING1left,CORRESPONDING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 82,(result,CORRESPONDING1left,CORRESPONDING1right), rest671) end | (202,(_,(_,CORR1left,CORR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 82,(result,CORR1left,CORR1right),rest671) end | (203,(_,(_,JUSTIFIED1left,JUSTIFIED1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 280,(result,JUSTIFIED1left,JUSTIFIED1right),rest671) end | (204,(_,(_,JUST1left,JUST1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 280,(result,JUST1left,JUST1right),rest671) end | (205,(_,(_,PICTURE1left,PICTURE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 362,(result,PICTURE1left,PICTURE1right),rest671) end | (206,(_,(_,PIC1left,PIC1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 362,(result,PIC1left,PIC1right),rest671) end | (207,(_,(_,SYNCHRONIZED1left,SYNCHRONIZED1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 474,(result,SYNCHRONIZED1left,SYNCHRONIZED1right), rest671) end | (208,(_,(_,SYNC1left,SYNC1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 474,(result,SYNC1left,SYNC1right),rest671) end | (209,(_,(_,THROUGH1left,THROUGH1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 491,(result,THROUGH1left,THROUGH1right),rest671) end | (210,(_,(_,THRU1left,THRU1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 491,(result,THRU1left,THRU1right),rest671) end | (211,(_,(_,ENDADD1left,ENDADD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 131,(result,ENDADD1left,ENDADD1right),rest671) end | (212,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 131,(result,defaultPos,defaultPos),rest671) end | (213,(_,(_,ENDCALL1left,ENDCALL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 132,(result,ENDCALL1left,ENDCALL1right),rest671) end | (214,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 132,(result,defaultPos,defaultPos),rest671) end | (215,(_,(_,ENDCOMPUTE1left,ENDCOMPUTE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 133,(result,ENDCOMPUTE1left,ENDCOMPUTE1right),rest671) end | (216,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 133,(result,defaultPos,defaultPos),rest671) end | (217,(_,(_,ENDDELETE1left,ENDDELETE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 134,(result,ENDDELETE1left,ENDDELETE1right),rest671) end | (218,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 134,(result,defaultPos,defaultPos),rest671) end | (219,(_,(_,ENDDIVIDE1left,ENDDIVIDE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 135,(result,ENDDIVIDE1left,ENDDIVIDE1right),rest671) end | (220,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 135,(result,defaultPos,defaultPos),rest671) end | (221,(_,(_,ENDIF1left,ENDIF1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 138,(result,ENDIF1left,ENDIF1right),rest671) end | (222,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 138,(result,defaultPos,defaultPos),rest671) end | (223,(_,(_,ENDMULTIPLY1left,ENDMULTIPLY1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 139,(result,ENDMULTIPLY1left,ENDMULTIPLY1right), rest671) end | (224,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 139,(result,defaultPos,defaultPos),rest671) end | (225,(_,(_,ENDREAD1left,ENDREAD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 142,(result,ENDREAD1left,ENDREAD1right),rest671) end | (226,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 142,(result,defaultPos,defaultPos),rest671) end | (227,(_,(_,ENDRETURN1left,ENDRETURN1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 143,(result,ENDRETURN1left,ENDRETURN1right),rest671) end | (228,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 143,(result,defaultPos,defaultPos),rest671) end | (229,(_,(_,ENDREWRITE1left,ENDREWRITE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 144,(result,ENDREWRITE1left,ENDREWRITE1right),rest671) end | (230,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 144,(result,defaultPos,defaultPos),rest671) end | (231,(_,(_,ENDSEARCH1left,ENDSEARCH1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 145,(result,ENDSEARCH1left,ENDSEARCH1right),rest671) end | (232,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 145,(result,defaultPos,defaultPos),rest671) end | (233,(_,(_,ENDSTART1left,ENDSTART1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 182,(result,ENDSTART1left,ENDSTART1right),rest671) end | (234,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 182,(result,defaultPos,defaultPos),rest671) end | (235,(_,(_,ENDSTRING1left,ENDSTRING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 146,(result,ENDSTRING1left,ENDSTRING1right),rest671) end | (236,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 146,(result,defaultPos,defaultPos),rest671) end | (237,(_,(_,ENDSUBTRACT1left,ENDSUBTRACT1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 147,(result,ENDSUBTRACT1left,ENDSUBTRACT1right), rest671) end | (238,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 147,(result,defaultPos,defaultPos),rest671) end | (239,(_,(_,ENDUNSTRING1left,ENDUNSTRING1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 149,(result,ENDUNSTRING1left,ENDUNSTRING1right), rest671) end | (240,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 149,(result,defaultPos,defaultPos),rest671) end | (241,(_,(_,ENDWRITE1left,ENDWRITE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 150,(result,ENDWRITE1left,ENDWRITE1right),rest671) end | (242,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 150,(result,defaultPos,defaultPos),rest671) end | (243,(_,(MlyValue.identifier identifier,_,identifier1right))::(_,( MlyValue.identifiers identifiers,identifiers1left,_))::rest671) => let val result=MlyValue.identifiers(( Cobol.SEVERAL_IDENTIFIERS(identifiers,identifier))) in (hojfelds_NT 239,(result,identifiers1left,identifier1right),rest671 ) end | (244,(_,(MlyValue.identifier identifier,identifier1left, identifier1right))::rest671) => let val result=MlyValue.identifiers(( Cobol.ONE_IDENTIFIER(identifier))) in (hojfelds_NT 239,(result,identifier1left,identifier1right),rest671) end | (245,(_,(MlyValue.subscript_phrase subscript_phrase,_, subscript_phraseright as subscript_phrase1right))::(_,( MlyValue.qualifications qualifications,_,_))::(_,( MlyValue.USERDEFINEDWORD USERDEFINEDWORD,USERDEFINEDWORDleft as USERDEFINEDWORD1left,_))::rest671) => let val result= MlyValue.identifier(( Cobol.QUALIFIED_IDENTIFIER(USERDEFINEDWORD, qualifications, subscript_phrase, USERDEFINEDWORDleft, subscript_phraseright) )) in (hojfelds_NT 228,(result,USERDEFINEDWORD1left, subscript_phrase1right),rest671) end | (246,(_,(MlyValue.special_register special_register, special_registerleft as special_register1left,special_registerright as special_register1right))::rest671) => let val result= MlyValue.identifier(( Cobol.SPECIAL_REGISTER(special_register,special_registerleft,special_registerright) )) in (hojfelds_NT 228,(result,special_register1left, special_register1right),rest671) end | (247,(_,(MlyValue.qualification qualification,_,qualification1right) )::(_,(MlyValue.qualifications qualifications,qualifications1left,_)) ::rest671) => let val result=MlyValue.qualifications(( Cobol.SEVERAL_QUALIFICATIONS(qualifications,qualification))) in (hojfelds_NT 376,(result,qualifications1left,qualification1right), rest671) end | (248,rest671) => let val result=MlyValue.qualifications(( Cobol.NO_QUALIFICATIONS)) in (hojfelds_NT 376,(result,defaultPos,defaultPos),rest671) end | (249,(_,(MlyValue.USERDEFINEDWORD USERDEFINEDWORD,_, USERDEFINEDWORD1right))::(_,(_,of_in1left,_))::rest671) => let val result=MlyValue.qualification((USERDEFINEDWORD)) in (hojfelds_NT 375,(result,of_in1left,USERDEFINEDWORD1right),rest671) end | (250,(_,(_,OF1left,OF1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 330,(result,OF1left,OF1right),rest671) end | (251,(_,(_,IN1left,IN1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 330,(result,IN1left,IN1right),rest671) end | (252,(_,(_,_,RPAR1right))::_::(_,(_,LPAR1left,_))::rest671) => let val result=MlyValue.subscript_phrase(()) in (hojfelds_NT 471,(result,LPAR1left,RPAR1right),rest671) end | (253,rest671) => let val result=MlyValue.subscript_phrase(()) in (hojfelds_NT 471,(result,defaultPos,defaultPos),rest671) end | (254,(_,(_,_,subscript1right))::(_,(_,subscripts1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 472,(result,subscripts1left,subscript1right),rest671) end | (255,(_,(_,subscript1left,subscript1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 472,(result,subscript1left,subscript1right),rest671) end | (256,(_,(_,INTEGER1left,INTEGER1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 470,(result,INTEGER1left,INTEGER1right),rest671) end | (257,(_,(_,_,offset1right))::(_,(_,data_or_index_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 470,(result,data_or_index_name1left,offset1right), rest671) end | (258,(_,(_,_,INTEGER1right))::(_,(_,PLUSSYMBOL1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 334,(result,PLUSSYMBOL1left,INTEGER1right),rest671) end | (259,(_,(_,_,INTEGER1right))::(_,(_,MINUSSYMBOL1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 334,(result,MINUSSYMBOL1left,INTEGER1right),rest671) end | (260,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 334,(result,defaultPos,defaultPos),rest671) end | (261,(_,(MlyValue.data_name data_name,data_name1left,data_name1right ))::rest671) => let val result=MlyValue.data_name_or_literal(( Cobol.DATA_NAME_OR_LITERAL_IS_DATA_NAME(data_name))) in (hojfelds_NT 105,(result,data_name1left,data_name1right),rest671) end | (262,(_,(MlyValue.literal literal,literal1left,literal1right)):: rest671) => let val result=MlyValue.data_name_or_literal(( Cobol.DATA_NAME_OR_LITERAL_IS_LITERAL(literal))) in (hojfelds_NT 105,(result,literal1left,literal1right),rest671) end | (263,(_,(MlyValue.data_name data_name,data_name1left,data_name1right ))::rest671) => let val result=MlyValue.data_name_or_integer(( Cobol.DATA_NAME_OR_INTEGER_IS_DATA_NAME(data_name))) in (hojfelds_NT 101,(result,data_name1left,data_name1right),rest671) end | (264,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.data_name_or_integer(( Cobol.DATA_NAME_OR_INTEGER_IS_INTEGER(INTEGER))) in (hojfelds_NT 101,(result,INTEGER1left,INTEGER1right),rest671) end | (265,(_,(MlyValue.data_name data_name,data_name1left,data_name1right ))::rest671) => let val result=MlyValue.data_name_or_filler(( Cobol.DATA_NAME_OR_FILLER_IS_DATA_NAME(data_name))) in (hojfelds_NT 366,(result,data_name1left,data_name1right),rest671) end | (266,(_,(MlyValue.filler filler,filler1left,filler1right))::rest671) => let val result=MlyValue.data_name_or_filler(( Cobol.DATA_NAME_OR_FILLER_IS_FILLER(filler))) in (hojfelds_NT 366,(result,filler1left,filler1right),rest671) end | (267,(_,(MlyValue.identifier_or_literal identifier_or_literal,_, identifier_or_literal1right))::(_,(MlyValue.identifier_or_literals identifier_or_literals,identifier_or_literals1left,_))::rest671) => let val result=MlyValue.identifier_or_literals(( Cobol.SEVERAL_IDENTIFIER_OR_LITERALS(identifier_or_literals, identifier_or_literal) )) in (hojfelds_NT 234,(result,identifier_or_literals1left, identifier_or_literal1right),rest671) end | (268,(_,(MlyValue.identifier_or_literal identifier_or_literal, identifier_or_literal1left,identifier_or_literal1right))::rest671) => let val result=MlyValue.identifier_or_literals(( Cobol.ONE_IDENTIFIER_OR_LITERAL(identifier_or_literal))) in (hojfelds_NT 234,(result,identifier_or_literal1left, identifier_or_literal1right),rest671) end | (269,(_,(MlyValue.identifier identifier,identifier1left, identifier1right))::rest671) => let val result= MlyValue.identifier_or_literal(( Cobol.IDENTIFIER_OR_LITERAL_IS_IDENTIFIER(identifier))) in (hojfelds_NT 233,(result,identifier1left,identifier1right),rest671) end | (270,(_,(MlyValue.literal literal,literal1left,literal1right)):: rest671) => let val result=MlyValue.identifier_or_literal(( Cobol.IDENTIFIER_OR_LITERAL_IS_LITERAL(literal))) in (hojfelds_NT 233,(result,literal1left,literal1right),rest671) end | (271,(_,(_,_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) )::(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constants1left, _))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 94,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constants1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) ,rest671) end | (272,(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 94,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) ,rest671) end | (273,(_,(_,identifier1left,identifier1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,identifier1left,identifier1right),rest671) end | (274,(_,(_,nonnumeric_literal1left,nonnumeric_literal1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,nonnumeric_literal1left, nonnumeric_literal1right),rest671) end | (275,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,ZERO1left,ZERO1right),rest671) end | (276,(_,(_,ZEROS1left,ZEROS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,ZEROS1left,ZEROS1right),rest671) end | (277,(_,(_,ZEROES1left,ZEROES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,ZEROES1left,ZEROES1right),rest671) end | (278,(_,(_,SPACE1left,SPACE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,SPACE1left,SPACE1right),rest671) end | (279,(_,(_,SPACES1left,SPACES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,SPACES1left,SPACES1right),rest671) end | (280,(_,(_,HIGHVALUE1left,HIGHVALUE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,HIGHVALUE1left,HIGHVALUE1right),rest671) end | (281,(_,(_,HIGHVALUES1left,HIGHVALUES1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,HIGHVALUES1left,HIGHVALUES1right),rest671) end | (282,(_,(_,LOWVALUE1left,LOWVALUE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,LOWVALUE1left,LOWVALUE1right),rest671) end | (283,(_,(_,LOWVALUES1left,LOWVALUES1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,LOWVALUES1left,LOWVALUES1right),rest671) end | (284,(_,(_,QUOTE1left,QUOTE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,QUOTE1left,QUOTE1right),rest671) end | (285,(_,(_,QUOTES1left,QUOTES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 93,(result,QUOTES1left,QUOTES1right),rest671) end | (286,(_,(_,identifier1left,identifier1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 232,(result,identifier1left,identifier1right),rest671) end | (287,(_,(_,INTEGER1left,INTEGER1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 232,(result,INTEGER1left,INTEGER1right),rest671) end | (288,(_,(MlyValue.test_cobol_programs test_cobol_programs, test_cobol_programs1left,test_cobol_programs1right))::rest671) => let val result=MlyValue.test_cobol(( Cobol.TEST(test_cobol_programs) )) in (hojfelds_NT 3,(result,test_cobol_programs1left, test_cobol_programs1right),rest671) end | (289,(_,(MlyValue.cobol_program cobol_program,cobol_program1left, cobol_program1right))::rest671) => let val result=MlyValue.test_cobol( ( Cobol.COBOL_PROGRAM(cobol_program))) in (hojfelds_NT 3,(result,cobol_program1left,cobol_program1right), rest671) end | (290,(_,(MlyValue.test_cobol_program test_cobol_program,_, test_cobol_program1right))::(_,(MlyValue.test_cobol_programs test_cobol_programs,test_cobol_programs1left,_))::rest671) => let val result=MlyValue.test_cobol_programs(( Cobol.TEST_COBOL_PROGRAMS(test_cobol_programs, test_cobol_program))) in (hojfelds_NT 1,(result,test_cobol_programs1left, test_cobol_program1right),rest671) end | (291,(_,(MlyValue.test_cobol_program test_cobol_program, test_cobol_program1left,test_cobol_program1right))::rest671) => let val result=MlyValue.test_cobol_programs(( Cobol.TEST_COBOL_PROGRAM(test_cobol_program))) in (hojfelds_NT 1,(result,test_cobol_program1left, test_cobol_program1right),rest671) end | (292,(_,(_,_,PROGEND1right))::(_,(MlyValue.cobol_program cobol_program,_,_))::(_,(_,PROGBEGIN1left,_))::rest671) => let val result=MlyValue.test_cobol_program((cobol_program)) in (hojfelds_NT 2,(result,PROGBEGIN1left,PROGEND1right),rest671) end | (293,(_,(MlyValue.procedure_division procedure_division,_, procedure_division1right))::(_,(MlyValue.data_division data_division,_ ,_))::(_,(MlyValue.environment_division environment_division,_,_))::(_ ,(MlyValue.identification_division identification_division,_,_))::(_,( _,process_statement1left,_))::rest671) => let val result= MlyValue.cobol_program(( condition_names := []; Cobol.PROGRAM(identification_division, environment_division, data_division, procedure_division) )) in (hojfelds_NT 0,(result,process_statement1left, procedure_division1right),rest671) end | (294,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 4,(result,defaultPos,defaultPos),rest671) end | (295,(_,(_,_,process_options1right))::(_,(_,PROCESS1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 4,(result,PROCESS1left,process_options1right),rest671) end | (296,(_,(_,_,process_option1right))::(_,(_,process_options1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 5,(result,process_options1left,process_option1right), rest671) end | (297,(_,(_,process_option1left,process_option1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 5,(result,process_option1left,process_option1right), rest671) end | (298,(_,(_,SLASHSYMBOL1left,SLASHSYMBOL1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,SLASHSYMBOL1left,SLASHSYMBOL1right),rest671) end | (299,(_,(_,SORT1left,SORT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,SORT1left,SORT1right),rest671) end | (300,(_,(_,SOURCE1left,SOURCE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,SOURCE1left,SOURCE1right),rest671) end | (301,(_,(_,QUOTE1left,QUOTE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,QUOTE1left,QUOTE1right),rest671) end | (302,(_,(_,PERIOD1left,PERIOD1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,PERIOD1left,PERIOD1right),rest671) end | (303,(_,(_,USERDEFINEDWORD1left,USERDEFINEDWORD1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,USERDEFINEDWORD1left,USERDEFINEDWORD1right), rest671) end | (304,(_,(_,COMP1left,COMP1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,COMP1left,COMP1right),rest671) end | (305,(_,(_,LPAR1left,LPAR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,LPAR1left,LPAR1right),rest671) end | (306,(_,(_,RPAR1left,RPAR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 6,(result,RPAR1left,RPAR1right),rest671) end | (307,(_,(_,_,identification_paragraphs1right))::_::_::_::(_,(_, IDENTIFICATION1left,_))::rest671) => let val result= MlyValue.identification_division(()) in (hojfelds_NT 225,(result,IDENTIFICATION1left, identification_paragraphs1right),rest671) end | (308,(_,(_,_,PERIOD2right))::_::_::(_,(_,PROGRAMID1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 104,(result,PROGRAMID1left,PERIOD2right),rest671) end | (309,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 104,(result,defaultPos,defaultPos),rest671) end | (310,(_,(_,_,identification_paragraph1right))::(_,(_, identification_paragraphs1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 227,(result,identification_paragraphs1left, identification_paragraph1right),rest671) end | (311,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 227,(result,defaultPos,defaultPos),rest671) end | (312,(_,(_,author_paragraph1left,author_paragraph1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,author_paragraph1left, author_paragraph1right),rest671) end | (313,(_,(_,installation_paragraph1left,installation_paragraph1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,installation_paragraph1left, installation_paragraph1right),rest671) end | (314,(_,(_,date_written_paragraph1left,date_written_paragraph1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,date_written_paragraph1left, date_written_paragraph1right),rest671) end | (315,(_,(_,date_compiled_paragraph1left, date_compiled_paragraph1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,date_compiled_paragraph1left, date_compiled_paragraph1right),rest671) end | (316,(_,(_,security_paragraph1left,security_paragraph1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 226,(result,security_paragraph1left, security_paragraph1right),rest671) end | (317,(_,(_,_,comment_entry1right))::(_,(_,AUTHOR1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 50,(result,AUTHOR1left,comment_entry1right),rest671) end | (318,(_,(_,_,comment_entry1right))::(_,(_,INSTALLATION1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 264,(result,INSTALLATION1left,comment_entry1right), rest671) end | (319,(_,(_,_,comment_entry1right))::(_,(_,DATEWRITTEN1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 114,(result,DATEWRITTEN1left,comment_entry1right), rest671) end | (320,(_,(_,_,comment_entry1right))::(_,(_,DATECOMPILED1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 111,(result,DATECOMPILED1left,comment_entry1right), rest671) end | (321,(_,(_,_,comment_entry1right))::(_,(_,SECURITY1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 426,(result,SECURITY1left,comment_entry1right),rest671 ) end | (322,(_,(MlyValue.input_output_section input_output_section,_, input_output_section1right))::(_,(MlyValue.configuration_section configuration_section,_,_))::_::_::(_,(_,ENVIRONMENT1left,_))::rest671 ) => let val result=MlyValue.environment_division(( Cobol.ENVIRONMENT_DIVISION (configuration_section,input_output_section) )) in (hojfelds_NT 153,(result,ENVIRONMENT1left, input_output_section1right),rest671) end | (323,rest671) => let val result=MlyValue.environment_division(( Cobol.NO_ENVIRONMENT_DIVISION)) in (hojfelds_NT 153,(result,defaultPos,defaultPos),rest671) end | (324,(_,(MlyValue.special_names_paragraph special_names_paragraph,_, special_names_paragraph1right))::(_,( MlyValue.object_computer_paragraph object_computer_paragraph,_,_))::(_ ,(MlyValue.source_computer_paragraph source_computer_paragraph,_,_)):: _::_::(_,(_,CONFIGURATION1left,_))::rest671) => let val result= MlyValue.configuration_section(( Cobol.CONFIGURATION_SECTION (source_computer_paragraph,object_computer_paragraph ,special_names_paragraph) )) in (hojfelds_NT 77,(result,CONFIGURATION1left, special_names_paragraph1right),rest671) end | (325,(_,(_,_,source_computer_entry1right))::_::(_,(_, SOURCECOMPUTER1left,_))::rest671) => let val result= MlyValue.source_computer_paragraph(()) in (hojfelds_NT 451,(result,SOURCECOMPUTER1left, source_computer_entry1right),rest671) end | (326,rest671) => let val result=MlyValue.source_computer_paragraph(( )) in (hojfelds_NT 451,(result,defaultPos,defaultPos),rest671) end | (327,(_,(_,_,PERIOD1right))::_::(_,(_,computer_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 450,(result,computer_name1left,PERIOD1right),rest671) end | (328,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 450,(result,defaultPos,defaultPos),rest671) end | (329,(_,(_,_,MODE1right))::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 115,(result,with1left,MODE1right),rest671) end | (330,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 115,(result,defaultPos,defaultPos),rest671) end | (331,(_,(_,_,object_computer_entry1right))::_::(_,(_, OBJECTCOMPUTER1left,_))::rest671) => let val result= MlyValue.object_computer_paragraph(()) in (hojfelds_NT 328,(result,OBJECTCOMPUTER1left, object_computer_entry1right),rest671) end | (332,rest671) => let val result=MlyValue.object_computer_paragraph(( )) in (hojfelds_NT 328,(result,defaultPos,defaultPos),rest671) end | (333,(_,(_,_,PERIOD1right))::_::_::_::(_,(_,computer_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 327,(result,computer_name1left,PERIOD1right),rest671) end | (334,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 327,(result,defaultPos,defaultPos),rest671) end | (335,(_,(_,_,size_unit1right))::_::_::(_,(_,MEMORY1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 307,(result,MEMORY1left,size_unit1right),rest671) end | (336,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 307,(result,defaultPos,defaultPos),rest671) end | (337,(_,(_,WORDS1left,WORDS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 443,(result,WORDS1left,WORDS1right),rest671) end | (338,(_,(_,CHARACTERS1left,CHARACTERS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 443,(result,CHARACTERS1left,CHARACTERS1right),rest671) end | (339,(_,(_,MODULES1left,MODULES1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 443,(result,MODULES1left,MODULES1right),rest671) end | (340,(_,(_,_,alphabet_name1right))::_::_::(_,(_, program_collating1left,_))::rest671) => let val result=MlyValue.ntVOID (()) in (hojfelds_NT 67,(result,program_collating1left,alphabet_name1right) ,rest671) end | (341,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 67,(result,defaultPos,defaultPos),rest671) end | (342,(_,(_,_,INTEGER1right))::_::(_,(_,SEGMENTLIMIT1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 427,(result,SEGMENTLIMIT1left,INTEGER1right),rest671) end | (343,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 427,(result,defaultPos,defaultPos),rest671) end | (344,(_,(_,_,period1right))::(_,(MlyValue.special_names_clauses special_names_clauses,_,_))::_::(_,(_,SPECIALNAMES1left,_))::rest671) => let val result=MlyValue.special_names_paragraph(( Cobol.SPECIAL_NAMES_PARAGRAPH(special_names_clauses))) in (hojfelds_NT 453,(result,SPECIALNAMES1left,period1right),rest671) end | (345,rest671) => let val result=MlyValue.special_names_paragraph(( Cobol.NO_SPECIAL_NAMES_PARAGRAPH)) in (hojfelds_NT 453,(result,defaultPos,defaultPos),rest671) end | (346,(_,(MlyValue.special_names_clause special_names_clause,_, special_names_clause1right))::(_,(MlyValue.special_names_clauses special_names_clauses,special_names_clauses1left,_))::rest671) => let val result=MlyValue.special_names_clauses(( Cobol.SEVERAL_SPECIAL_NAMES_CLAUSES(special_names_clauses, special_names_clause) )) in (hojfelds_NT 102,(result,special_names_clauses1left, special_names_clause1right),rest671) end | (347,rest671) => let val result=MlyValue.special_names_clauses(( Cobol.NO_SPECIAL_NAMES_CLAUSES)) in (hojfelds_NT 102,(result,defaultPos,defaultPos),rest671) end | (348,(_,(_,environment_clause1left,environment_clause1right)):: rest671) => let val result=MlyValue.special_names_clause(( Cobol.ENVIRONMENT_CLAUSE)) in (hojfelds_NT 103,(result,environment_clause1left, environment_clause1right),rest671) end | (349,(_,(_,alphabet_clause1left,alphabet_clause1right))::rest671) => let val result=MlyValue.special_names_clause(( Cobol.ALPHABET_CLAUSE)) in (hojfelds_NT 103,(result,alphabet_clause1left,alphabet_clause1right ),rest671) end | (350,(_,(MlyValue.currency_sign_clause currency_sign_clause, currency_sign_clause1left,currency_sign_clause1right))::rest671) => let val result=MlyValue.special_names_clause(( Cobol.CURRENCY_SIGN_CLAUSE(currency_sign_clause))) in (hojfelds_NT 103,(result,currency_sign_clause1left, currency_sign_clause1right),rest671) end | (351,(_,(MlyValue.decimal_clause decimal_clause,decimal_clause1left, decimal_clause1right))::rest671) => let val result= MlyValue.special_names_clause((Cobol.DECIMAL_CLAUSE(decimal_clause))) in (hojfelds_NT 103,(result,decimal_clause1left,decimal_clause1right), rest671) end | (352,(_,(_,_,mnemonic_name1right))::_::(_,(_,environment_name_11left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 152,(result,environment_name_11left, mnemonic_name1right),rest671) end | (353,(_,(_,_,status_cond_phrase_opt1right))::_::_::(_,(_, environment_name_21left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 152,(result,environment_name_21left, status_cond_phrase_opt1right),rest671) end | (354,(_,(_,_,status_cond_phrase_opt1right))::(_,(_, environment_name_21left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 152,(result,environment_name_21left, status_cond_phrase_opt1right),rest671) end | (355,(_,(_,status_cond_phrase1left,status_cond_phrase1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 463,(result,status_cond_phrase1left, status_cond_phrase1right),rest671) end | (356,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 463,(result,defaultPos,defaultPos),rest671) end | (357,(_,(_,_,off_status_opt1right))::(_,(_,on_status1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 462,(result,on_status1left,off_status_opt1right), rest671) end | (358,(_,(_,_,on_status_opt1right))::(_,(_,off_status1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 462,(result,off_status1left,on_status_opt1right), rest671) end | (359,(_,(_,on_status1left,on_status1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 340,(result,on_status1left,on_status1right),rest671) end | (360,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 340,(result,defaultPos,defaultPos),rest671) end | (361,(_,(_,off_status1left,off_status1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 333,(result,off_status1left,off_status1right),rest671) end | (362,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 333,(result,defaultPos,defaultPos),rest671) end | (363,(_,(_,_,condition_name1right))::_::(_,(_,ON1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 339,(result,ON1left,condition_name1right),rest671) end | (364,(_,(_,_,condition_name1right))::_::(_,(_,OFF1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 332,(result,OFF1left,condition_name1right),rest671) end | (365,(_,(_,_,alphabet_specifier1right))::_::(_,(_,alphabet_name1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 23,(result,alphabet_name1left,alphabet_specifier1right ),rest671) end | (366,(_,(_,STANDARD11left,STANDARD11right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 25,(result,STANDARD11left,STANDARD11right),rest671) end | (367,(_,(_,NATIVE1left,NATIVE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 25,(result,NATIVE1left,NATIVE1right),rest671) end | (368,(_,(_,literal_also_ranges1left,literal_also_ranges1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 25,(result,literal_also_ranges1left, literal_also_ranges1right),rest671) end | (369,(_,(_,_,literal_also_range1right))::(_,(_, literal_also_ranges1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 300,(result,literal_also_ranges1left, literal_also_range1right),rest671) end | (370,(_,(_,literal_also_range1left,literal_also_range1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 300,(result,literal_also_range1left, literal_also_range1right),rest671) end | (371,(_,(_,_,literal_boundary1right))::(_,(_,literal1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 299,(result,literal1left,literal_boundary1right), rest671) end | (372,(_,(_,_,literal1right))::(_,(_,through1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 301,(result,through1left,literal1right),rest671) end | (373,(_,(_,also_literals1left,also_literals1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 301,(result,also_literals1left,also_literals1right), rest671) end | (374,(_,(_,_,also_literal1right))::(_,(_,also_literals1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 27,(result,also_literals1left,also_literal1right), rest671) end | (375,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 27,(result,defaultPos,defaultPos),rest671) end | (376,(_,(_,_,literal1right))::(_,(_,ALSO1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 26,(result,ALSO1left,literal1right),rest671) end | (377,(_,(MlyValue.literal_range literal_range,_,literal_range1right) )::(_,(MlyValue.literal_ranges literal_ranges,literal_ranges1left,_)) ::rest671) => let val result=MlyValue.literal_ranges(( Cobol.SEVERAL_LITERAL_RANGES(literal_ranges,literal_range))) in (hojfelds_NT 303,(result,literal_ranges1left,literal_range1right), rest671) end | (378,(_,(MlyValue.literal_range literal_range,literal_range1left, literal_range1right))::rest671) => let val result= MlyValue.literal_ranges((Cobol.ONE_LITERAL_RANGE(literal_range))) in (hojfelds_NT 303,(result,literal_range1left,literal_range1right), rest671) end | (379,(_,(MlyValue.through_literal through_literal,_, through_literal1right))::(_,(MlyValue.literal literal,literal1left,_)) ::rest671) => let val result=MlyValue.literal_range(( Cobol.LITERAL_RANGE(literal,through_literal))) in (hojfelds_NT 302,(result,literal1left,through_literal1right), rest671) end | (380,(_,(MlyValue.literal literal,_,literal1right))::(_,(_, through1left,_))::rest671) => let val result=MlyValue.through_literal( (Cobol.THROUGH_LITERAL(literal))) in (hojfelds_NT 493,(result,through1left,literal1right),rest671) end | (381,rest671) => let val result=MlyValue.through_literal(( Cobol.NO_THROUGH_LITERAL)) in (hojfelds_NT 493,(result,defaultPos,defaultPos),rest671) end | (382,(_,(MlyValue.NONNUMERICLITERAL NONNUMERICLITERAL,_, NONNUMERICLITERAL1right))::_::(_,(_,CURRENCY1left,_))::rest671) => let val result=MlyValue.currency_sign_clause(( Cobol.CURRENCY(NONNUMERICLITERAL))) in (hojfelds_NT 85,(result,CURRENCY1left,NONNUMERICLITERAL1right), rest671) end | (383,(_,(_,_,COMMA1right))::_::(_,(_,DECIMALPOINT1left,_))::rest671) => let val result=MlyValue.decimal_clause(( Cobol.DECIMALPOINT_IS_COMMA)) in (hojfelds_NT 116,(result,DECIMALPOINT1left,COMMA1right),rest671) end | (384,(_,(_,_,i_o_control_paragraph1right))::_::_::_::(_,(_, INPUTOUTPUT1left,_))::rest671) => let val result= MlyValue.input_output_section(()) in (hojfelds_NT 260,(result,INPUTOUTPUT1left, i_o_control_paragraph1right),rest671) end | (385,rest671) => let val result=MlyValue.input_output_section(()) in (hojfelds_NT 260,(result,defaultPos,defaultPos),rest671) end | (386,(_,(_,_,file_control_entries1right))::_::(_,(_,FILECONTROL1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 189,(result,FILECONTROL1left, file_control_entries1right),rest671) end | (387,(_,(_,_,file_control_entry1right))::(_,(_, file_control_entries1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 187,(result,file_control_entries1left, file_control_entry1right),rest671) end | (388,(_,(_,file_control_entry1left,file_control_entry1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 187,(result,file_control_entry1left, file_control_entry1right),rest671) end | (389,(_,(_,_,PERIOD1right))::_::_::_::(_,(_,SELECT1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 188,(result,SELECT1left,PERIOD1right),rest671) end | (390,(_,(_,_,file_control_clause1right))::(_,(_, file_control_clauses1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 186,(result,file_control_clauses1left, file_control_clause1right),rest671) end | (391,(_,(_,file_control_clause1left,file_control_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 186,(result,file_control_clause1left, file_control_clause1right),rest671) end | (392,(_,(_,assign_clause1left,assign_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,assign_clause1left,assign_clause1right), rest671) end | (393,(_,(_,reserve_clause1left,reserve_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,reserve_clause1left,reserve_clause1right), rest671) end | (394,(_,(_,organization_clause1left,organization_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,organization_clause1left, organization_clause1right),rest671) end | (395,(_,(_,record_key_clause1left,record_key_clause1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,record_key_clause1left, record_key_clause1right),rest671) end | (396,(_,(_,access_mode_clause1left,access_mode_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,access_mode_clause1left, access_mode_clause1right),rest671) end | (397,(_,(_,file_status_clause1left,file_status_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,file_status_clause1left, file_status_clause1right),rest671) end | (398,(_,(_,control_clause1left,control_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 185,(result,control_clause1left,control_clause1right), rest671) end | (399,(_,(_,_,external_data_sets1right))::_::(_,(_,ASSIGN1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 46,(result,ASSIGN1left,external_data_sets1right), rest671) end | (400,(_,(_,_,external_data_set1right))::(_,(_, external_data_sets1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 165,(result,external_data_sets1left, external_data_set1right),rest671) end | (401,(_,(_,external_data_set1left,external_data_set1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 165,(result,external_data_set1left, external_data_set1right),rest671) end | (402,(_,(_,assignment_name1left,assignment_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 164,(result,assignment_name1left,assignment_name1right ),rest671) end | (403,(_,(_,NONNUMERICLITERAL1left,NONNUMERICLITERAL1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 164,(result,NONNUMERICLITERAL1left, NONNUMERICLITERAL1right),rest671) end | (404,(_,(_,_,areas1right))::_::(_,(_,RESERVE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 410,(result,RESERVE1left,areas1right),rest671) end | (405,(_,(_,_,data_organization1right))::(_,(_,organization_is1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 351,(result,organization_is1left, data_organization1right),rest671) end | (406,(_,(_,SEQUENTIAL1left,SEQUENTIAL1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 107,(result,SEQUENTIAL1left,SEQUENTIAL1right),rest671) end | (407,(_,(_,INDEXED1left,INDEXED1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 107,(result,INDEXED1left,INDEXED1right),rest671) end | (408,(_,(_,RELATIVE1left,RELATIVE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 107,(result,RELATIVE1left,RELATIVE1right),rest671) end | (409,(_,(_,TRANSACTION1left,TRANSACTION1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 107,(result,TRANSACTION1left,TRANSACTION1right), rest671) end | (410,(_,(_,_,relative_key_clause1right))::_::_::(_,(_,ACCESS1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 8,(result,ACCESS1left,relative_key_clause1right), rest671) end | (411,(_,(_,SEQUENTIAL1left,SEQUENTIAL1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 9,(result,SEQUENTIAL1left,SEQUENTIAL1right),rest671) end | (412,(_,(_,RANDOM1left,RANDOM1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 9,(result,RANDOM1left,RANDOM1right),rest671) end | (413,(_,(_,DYNAMIC1left,DYNAMIC1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 9,(result,DYNAMIC1left,DYNAMIC1right),rest671) end | (414,(_,(_,_,data_name1right))::_::_::(_,(_,RELATIVE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 396,(result,RELATIVE1left,data_name1right),rest671) end | (415,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 396,(result,defaultPos,defaultPos),rest671) end | (416,(_,(_,_,duplicates_phrase1right))::_::_::_::(_,(_,RECORD1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 388,(result,RECORD1left,duplicates_phrase1right), rest671) end | (417,(_,(_,_,DUPLICATES1right))::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 128,(result,with1left,DUPLICATES1right),rest671) end | (418,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 128,(result,defaultPos,defaultPos),rest671) end | (419,(_,(_,_,data_name_opt1right))::_::_::_::(_,(_,file1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 210,(result,file1left,data_name_opt1right),rest671) end | (420,(_,(_,_,data_name1right))::_::(_,(_,CONTROLAREA1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 79,(result,CONTROLAREA1left,data_name1right),rest671) end | (421,(_,(_,_,i_o_control_entries1right))::_::(_,(_,IOCONTROL1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 223,(result,IOCONTROL1left,i_o_control_entries1right), rest671) end | (422,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 223,(result,defaultPos,defaultPos),rest671) end | (423,(_,(_,_,PERIOD1right))::(_,(_,i_o_control_clauses1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 222,(result,i_o_control_clauses1left,PERIOD1right), rest671) end | (424,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 222,(result,defaultPos,defaultPos),rest671) end | (425,(_,(_,_,i_o_control_clause1right))::(_,(_, i_o_control_clauses1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 221,(result,i_o_control_clauses1left, i_o_control_clause1right),rest671) end | (426,(_,(_,i_o_control_clause1left,i_o_control_clause1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 221,(result,i_o_control_clause1left, i_o_control_clause1right),rest671) end | (427,(_,(_,rerun_clause1left,rerun_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,rerun_clause1left,rerun_clause1right), rest671) end | (428,(_,(_,same_area_clause1left,same_area_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,same_area_clause1left, same_area_clause1right),rest671) end | (429,(_,(_,same_record_area_clause1left, same_record_area_clause1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,same_record_area_clause1left, same_record_area_clause1right),rest671) end | (430,(_,(_,same_sort_area_clause1left,same_sort_area_clause1right)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,same_sort_area_clause1left, same_sort_area_clause1right),rest671) end | (431,(_,(_,same_sort_merge_area_clause1left, same_sort_merge_area_clause1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,same_sort_merge_area_clause1left, same_sort_merge_area_clause1right),rest671) end | (432,(_,(_,apply_core_index_clause1left, apply_core_index_clause1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,apply_core_index_clause1left, apply_core_index_clause1right),rest671) end | (433,(_,(_,multiple_file_tape_clause1left, multiple_file_tape_clause1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 220,(result,multiple_file_tape_clause1left, multiple_file_tape_clause1right),rest671) end | (434,(_,(_,_,file_name2right))::_::_::_::_::_::_::(_,(_,RERUN1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 409,(result,RERUN1left,file_name2right),rest671) end | (435,(_,(_,_,file_names1right))::_::_::(_,(_,SAME1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 416,(result,SAME1left,file_names1right),rest671) end | (436,(_,(_,_,file_names1right))::_::_::_::(_,(_,SAME1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 417,(result,SAME1left,file_names1right),rest671) end | (437,(_,(_,_,file_names1right))::_::_::_::(_,(_,SAME1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 419,(result,SAME1left,file_names1right),rest671) end | (438,(_,(_,_,file_names1right))::_::_::_::(_,(_,SAME1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 420,(result,SAME1left,file_names1right),rest671) end | (439,(_,(_,_,file_names1right))::_::_::_::_::(_,(_,APPLY1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 37,(result,APPLY1left,file_names1right),rest671) end | (440,(_,(_,_,file_positions1right))::_::_::(_,(_,MULTIPLE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 316,(result,MULTIPLE1left,file_positions1right), rest671) end | (441,(_,(_,_,file_position1right))::(_,(_,file_positions1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 208,(result,file_positions1left,file_position1right), rest671) end | (442,(_,(_,file_position1left,file_position1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 208,(result,file_position1left,file_position1right), rest671) end | (443,(_,(_,_,position_integer1right))::(_,(_,file_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 207,(result,file_name1left,position_integer1right), rest671) end | (444,(_,(_,_,INTEGER1right))::(_,(_,POSITION1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 365,(result,POSITION1left,INTEGER1right),rest671) end | (445,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 365,(result,defaultPos,defaultPos),rest671) end | (446,(_,(MlyValue.linkage_section linkage_section,_, linkage_section1right))::(_,(MlyValue.working_storage_section working_storage_section,_,_))::(_,(MlyValue.file_section file_section, _,_))::_::_::(_,(_,DATA1left,_))::rest671) => let val result= MlyValue.data_division(( Cobol.DATA_DIVISION(file_section, working_storage_section, linkage_section) )) in (hojfelds_NT 91,(result,DATA1left,linkage_section1right),rest671) end | (447,rest671) => let val result=MlyValue.data_division(( Cobol.NO_DATA_DIVISION)) in (hojfelds_NT 91,(result,defaultPos,defaultPos),rest671) end | (448,(_,(MlyValue.file_description_paragraphs file_description_paragraphs,_,file_description_paragraphsright as file_description_paragraphs1right))::_::_::(_,(_,FILEleft as FILE1left ,_))::rest671) => let val result=MlyValue.file_section(( Cobol.FILE_SECTION(file_description_paragraphs,FILEleft,file_description_paragraphsright) )) in (hojfelds_NT 209,(result,FILE1left, file_description_paragraphs1right),rest671) end | (449,rest671) => let val result=MlyValue.file_section(( Cobol.NO_FILE_SECTION)) in (hojfelds_NT 209,(result,defaultPos,defaultPos),rest671) end | (450,(_,(MlyValue.file_description_paragraph file_description_paragraph,_,file_description_paragraph1right))::(_,( MlyValue.file_description_paragraphs file_description_paragraphs, file_description_paragraphs1left,_))::rest671) => let val result= MlyValue.file_description_paragraphs(( Cobol.FILE_DESCRIPTION_PARAGRAPHS(file_description_paragraphs, file_description_paragraph) )) in (hojfelds_NT 195,(result,file_description_paragraphs1left, file_description_paragraph1right),rest671) end | (451,rest671) => let val result=MlyValue.file_description_paragraphs ((Cobol.NO_FILE_DESCRIPTION_PARAGRAPHS)) in (hojfelds_NT 195,(result,defaultPos,defaultPos),rest671) end | (452,(_,(MlyValue.record_description_entries record_description_entries,_,record_description_entries1right))::(_,( MlyValue.file_and_sort_description_entry file_and_sort_description_entry,file_and_sort_description_entry1left,_ ))::rest671) => let val result=MlyValue.file_description_paragraph(( Cobol.FILE_DESCRIPTION_PARAGRAPH(file_and_sort_description_entry, record_description_entries) )) in (hojfelds_NT 194,(result,file_and_sort_description_entry1left, record_description_entries1right),rest671) end | (453,(_,(MlyValue.file_description_entry file_description_entry, file_description_entry1left,file_description_entry1right))::rest671) => let val result=MlyValue.file_and_sort_description_entry(( Cobol.FILE_DESCRIPTION_ENTRY(file_description_entry))) in (hojfelds_NT 184,(result,file_description_entry1left, file_description_entry1right),rest671) end | (454,(_,(MlyValue.sort_description_entry sort_description_entry, sort_description_entry1left,sort_description_entry1right))::rest671) => let val result=MlyValue.file_and_sort_description_entry(( Cobol.SORT_DESCRIPTION_ENTRY(sort_description_entry))) in (hojfelds_NT 184,(result,sort_description_entry1left, sort_description_entry1right),rest671) end | (455,(_,(_,_,PERIODright as PERIOD1right))::(_,( MlyValue.file_description_clauses file_description_clauses,_,_))::(_,( MlyValue.file_name file_name,_,_))::(_,(_,FDleft as FD1left,_)):: rest671) => let val result=MlyValue.file_description_entry(( Cobol.FD(file_name,file_description_clauses,FDleft,PERIODright))) in (hojfelds_NT 193,(result,FD1left,PERIOD1right),rest671) end | (456,(_,(MlyValue.file_description_clause file_description_clause,_, file_description_clause1right))::(_,(MlyValue.file_description_clauses file_description_clauses,file_description_clauses1left,_))::rest671) => let val result=MlyValue.file_description_clauses(( Cobol.FILE_DESCRIPTION_CLAUSES(file_description_clauses, file_description_clause) )) in (hojfelds_NT 192,(result,file_description_clauses1left, file_description_clause1right),rest671) end | (457,rest671) => let val result=MlyValue.file_description_clauses(( Cobol.NO_FILE_DESCRIPTION_CLAUSES)) in (hojfelds_NT 192,(result,defaultPos,defaultPos),rest671) end | (458,(_,(MlyValue.block_contains_clause block_contains_clause, block_contains_clause1left,block_contains_clause1right))::rest671) => let val result=MlyValue.file_description_clause((block_contains_clause )) in (hojfelds_NT 191,(result,block_contains_clause1left, block_contains_clause1right),rest671) end | (459,(_,(MlyValue.record_contains_clause record_contains_clause, record_contains_clauseleft as record_contains_clause1left, record_contains_clauseright as record_contains_clause1right))::rest671 ) => let val result=MlyValue.file_description_clause(( Cobol.FILE_DESCRIPTION_CLAUSE_IS_RECORD(record_contains_clause, record_contains_clauseleft, record_contains_clauseright) )) in (hojfelds_NT 191,(result,record_contains_clause1left, record_contains_clause1right),rest671) end | (460,(_,(MlyValue.label_records_clause label_records_clause, label_records_clause1left,label_records_clause1right))::rest671) => let val result=MlyValue.file_description_clause((label_records_clause) ) in (hojfelds_NT 191,(result,label_records_clause1left, label_records_clause1right),rest671) end | (461,(_,(MlyValue.value_of_clause value_of_clause, value_of_clause1left,value_of_clause1right))::rest671) => let val result=MlyValue.file_description_clause((value_of_clause)) in (hojfelds_NT 191,(result,value_of_clause1left,value_of_clause1right ),rest671) end | (462,(_,(MlyValue.data_records_clause data_records_clause, data_records_clauseleft as data_records_clause1left, data_records_clauseright as data_records_clause1right))::rest671) => let val result=MlyValue.file_description_clause(( Cobol.FILE_DESCRIPTION_CLAUSE_IS_DATA(data_records_clause, data_records_clauseleft, data_records_clauseright) )) in (hojfelds_NT 191,(result,data_records_clause1left, data_records_clause1right),rest671) end | (463,(_,(MlyValue.linage_clause linage_clause,linage_clause1left, linage_clause1right))::rest671) => let val result= MlyValue.file_description_clause((linage_clause)) in (hojfelds_NT 191,(result,linage_clause1left,linage_clause1right), rest671) end | (464,(_,(MlyValue.code_set_clause code_set_clause, code_set_clause1left,code_set_clause1right))::rest671) => let val result=MlyValue.file_description_clause((code_set_clause)) in (hojfelds_NT 191,(result,code_set_clause1left,code_set_clause1right ),rest671) end | (465,(_,(MlyValue.characters_or_records characters_or_records,_, characters_or_recordsright as characters_or_records1right))::(_,( MlyValue.integer_range integer_range,_,_))::_::(_,(_,BLOCKleft as BLOCK1left,_))::rest671) => let val result= MlyValue.block_contains_clause(( Cobol.BLOCK(integer_range, characters_or_records, BLOCKleft, characters_or_recordsright) )) in (hojfelds_NT 53,(result,BLOCK1left,characters_or_records1right), rest671) end | (466,(_,(MlyValue.INTEGER INTEGER,INTEGER1left,INTEGER1right)):: rest671) => let val result=MlyValue.integer_range(( Cobol.SIMPLE_RANGE(INTEGER))) in (hojfelds_NT 265,(result,INTEGER1left,INTEGER1right),rest671) end | (467,(_,(MlyValue.INTEGER INTEGER2,_,INTEGER2right))::_::(_,( MlyValue.INTEGER INTEGER1,INTEGER1left,_))::rest671) => let val result =MlyValue.integer_range((Cobol.INTEGER_TO_INTEGER(INTEGER1,INTEGER2))) in (hojfelds_NT 265,(result,INTEGER1left,INTEGER2right),rest671) end | (468,(_,(_,characters1left,characters1right))::rest671) => let val result=MlyValue.characters_or_records((Cobol.CHARACTERS)) in (hojfelds_NT 62,(result,characters1left,characters1right),rest671) end | (469,(_,(_,RECORDS1left,RECORDS1right))::rest671) => let val result= MlyValue.characters_or_records((Cobol.RECORDS)) in (hojfelds_NT 62,(result,RECORDS1left,RECORDS1right),rest671) end | (470,(_,(_,_,characters1right))::(_,(MlyValue.integer_range integer_range,_,_))::_::(_,(_,RECORD1left,_))::rest671) => let val result=MlyValue.record_contains_clause(( Cobol.RECORD_CONTAINS(integer_range))) in (hojfelds_NT 381,(result,RECORD1left,characters1right),rest671) end | (471,(_,(MlyValue.standard_or_omitted standard_or_omitted,_, standard_or_omitted1right))::_::(_,(_,LABEL1left,_))::rest671) => let val result=MlyValue.label_records_clause((standard_or_omitted)) in (hojfelds_NT 285,(result,LABEL1left,standard_or_omitted1right), rest671) end | (472,(_,(_,_,is1right))::(_,(_,RECORD1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 387,(result,RECORD1left,is1right),rest671) end | (473,(_,(_,_,are1right))::(_,(_,RECORDS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 387,(result,RECORDS1left,are1right),rest671) end | (474,(_,(_,STANDARD1left,STANDARD1right))::rest671) => let val result=MlyValue.standard_or_omitted((Cobol.LABEL_STANDARD)) in (hojfelds_NT 456,(result,STANDARD1left,STANDARD1right),rest671) end | (475,(_,(_,OMITTED1left,OMITTED1right))::rest671) => let val result= MlyValue.standard_or_omitted((Cobol.LABEL_OMITTED)) in (hojfelds_NT 456,(result,OMITTED1left,OMITTED1right),rest671) end | (476,(_,(MlyValue.value_of_phrases value_of_phrases,_, value_of_phrasesright as value_of_phrases1right))::_::(_,(_,VALUEleft as VALUE1left,_))::rest671) => let val result= MlyValue.value_of_clause(( Cobol.VALUE_OF_CLAUSE(value_of_phrases, VALUEleft, value_of_phrasesright) )) in (hojfelds_NT 518,(result,VALUE1left,value_of_phrases1right),rest671 ) end | (477,(_,(MlyValue.value_of_phrase value_of_phrase,_, value_of_phrase1right))::(_,(MlyValue.value_of_phrases value_of_phrases,value_of_phrases1left,_))::rest671) => let val result =MlyValue.value_of_phrases(( Cobol.VALUE_OF_PHRASES(value_of_phrases, value_of_phrase))) in (hojfelds_NT 521,(result,value_of_phrases1left, value_of_phrase1right),rest671) end | (478,(_,(MlyValue.value_of_phrase value_of_phrase, value_of_phrase1left,value_of_phrase1right))::rest671) => let val result=MlyValue.value_of_phrases(( Cobol.VALUE_OF_PHRASE(value_of_phrase))) in (hojfelds_NT 521,(result,value_of_phrase1left,value_of_phrase1right ),rest671) end | (479,(_,(MlyValue.data_name_or_literal data_name_or_literal,_, data_name_or_literal1right))::_::(_,(MlyValue.system_name system_name, system_name1left,_))::rest671) => let val result= MlyValue.value_of_phrase(( Cobol.VALUE_OF(system_name, data_name_or_literal))) in (hojfelds_NT 520,(result,system_name1left, data_name_or_literal1right),rest671) end | (480,(_,(MlyValue.data_names data_names,_,data_names1right))::_::(_, (_,DATA1left,_))::rest671) => let val result= MlyValue.data_records_clause((Cobol.DATA_RECORD_IS(data_names))) in (hojfelds_NT 108,(result,DATA1left,data_names1right),rest671) end | (481,(_,(MlyValue.top_bottom_specifications top_bottom_specifications,_,top_bottom_specificationsright as top_bottom_specifications1right))::(_,(MlyValue.footing_specification footing_specification,_,_))::_::(_,(MlyValue.data_name_or_integer data_name_or_integer,_,_))::_::(_,(_,LINAGEleft as LINAGE1left,_)):: rest671) => let val result=MlyValue.linage_clause(( Cobol.LINAGE_CLAUSE(data_name_or_integer, footing_specification, top_bottom_specifications, LINAGEleft, top_bottom_specificationsright) )) in (hojfelds_NT 293,(result,LINAGE1left, top_bottom_specifications1right),rest671) end | (482,(_,(MlyValue.data_name_or_integer data_name_or_integer,_, data_name_or_integer1right))::_::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.footing_specification(( Cobol.FOOTING(data_name_or_integer))) in (hojfelds_NT 212,(result,with1left,data_name_or_integer1right), rest671) end | (483,rest671) => let val result=MlyValue.footing_specification(( Cobol.NOFOOTING)) in (hojfelds_NT 212,(result,defaultPos,defaultPos),rest671) end | (484,(_,(MlyValue.top_bottom_specification top_bottom_specification, _,top_bottom_specification1right))::(_,( MlyValue.top_bottom_specifications top_bottom_specifications, top_bottom_specifications1left,_))::rest671) => let val result= MlyValue.top_bottom_specifications(( Cobol.TOP_BOTTOM_SPECIFICATIONS(top_bottom_specifications, top_bottom_specification) )) in (hojfelds_NT 502,(result,top_bottom_specifications1left, top_bottom_specification1right),rest671) end | (485,rest671) => let val result=MlyValue.top_bottom_specifications(( Cobol.NO_TOP_BOTTOM_SPECIFICATION)) in (hojfelds_NT 502,(result,defaultPos,defaultPos),rest671) end | (486,(_,(_,_,data_name_or_integer1right))::(_,(MlyValue.top_bottom top_bottom,_,_))::_::(_,(_,lines1left,_))::rest671) => let val result= MlyValue.top_bottom_specification((top_bottom)) in (hojfelds_NT 501,(result,lines1left,data_name_or_integer1right), rest671) end | (487,(_,(_,TOP1left,TOP1right))::rest671) => let val result= MlyValue.top_bottom((Cobol.TOP)) in (hojfelds_NT 500,(result,TOP1left,TOP1right),rest671) end | (488,(_,(_,BOTTOM1left,BOTTOM1right))::rest671) => let val result= MlyValue.top_bottom((Cobol.BOTTOM)) in (hojfelds_NT 500,(result,BOTTOM1left,BOTTOM1right),rest671) end | (489,(_,(MlyValue.alphabet_name alphabet_name,_,alphabet_nameright as alphabet_name1right))::_::(_,(_,CODESETleft as CODESET1left,_)):: rest671) => let val result=MlyValue.code_set_clause(( Cobol.CODE_SET_CLAUSE(alphabet_name, CODESETleft, alphabet_nameright) )) in (hojfelds_NT 65,(result,CODESET1left,alphabet_name1right),rest671) end | (490,(_,(_,_,PERIOD1right))::(_,(MlyValue.sort_description_clauses sort_description_clauses,_,_))::(_,(MlyValue.file_name file_name,_,_)) ::(_,(_,SD1left,_))::rest671) => let val result= MlyValue.sort_description_entry(( Cobol.SD(file_name,sort_description_clauses))) in (hojfelds_NT 447,(result,SD1left,PERIOD1right),rest671) end | (491,(_,(MlyValue.sort_description_clause sort_description_clause,_, sort_description_clause1right))::(_,(MlyValue.sort_description_clauses sort_description_clauses,sort_description_clauses1left,_))::rest671) => let val result=MlyValue.sort_description_clauses(( Cobol.SORT_DESCRIPTION_CLAUSES(sort_description_clauses, sort_description_clause) )) in (hojfelds_NT 446,(result,sort_description_clauses1left, sort_description_clause1right),rest671) end | (492,rest671) => let val result=MlyValue.sort_description_clauses(( Cobol.NO_SORT_DESCRIPTION_CLAUSE)) in (hojfelds_NT 446,(result,defaultPos,defaultPos),rest671) end | (493,(_,(MlyValue.record_contains_clause record_contains_clause, record_contains_clauseleft as record_contains_clause1left, record_contains_clauseright as record_contains_clause1right))::rest671 ) => let val result=MlyValue.sort_description_clause(( Cobol.SORT_DESCRIPTION_CLAUSE_IS_RECORD (record_contains_clause, record_contains_clauseleft, record_contains_clauseright) )) in (hojfelds_NT 445,(result,record_contains_clause1left, record_contains_clause1right),rest671) end | (494,(_,(MlyValue.data_records_clause data_records_clause, data_records_clauseleft as data_records_clause1left, data_records_clauseright as data_records_clause1right))::rest671) => let val result=MlyValue.sort_description_clause(( Cobol.SORT_DESCRIPTION_CLAUSE_IS_DATA(data_records_clause, data_records_clauseleft, data_records_clauseright) )) in (hojfelds_NT 445,(result,data_records_clause1left, data_records_clause1right),rest671) end | (495,(_,(MlyValue.record_description_entry record_description_entry, _,record_description_entry1right))::(_,( MlyValue.record_description_entries record_description_entries, record_description_entries1left,_))::rest671) => let val result= MlyValue.record_description_entries(( Cobol.RECORD_DESCRIPTION_ENTRIES(record_description_entries, record_description_entry) )) in (hojfelds_NT 385,(result,record_description_entries1left, record_description_entry1right),rest671) end | (496,(_,(MlyValue.record_description_entry record_description_entry, record_description_entry1left,record_description_entry1right)):: rest671) => let val result=MlyValue.record_description_entries(( Cobol.RECORD_DESCRIPTION_ENTRIES(Cobol.NO_RECORD_DESCRIPTION_ENTRIES, record_description_entry) )) in (hojfelds_NT 385,(result,record_description_entry1left, record_description_entry1right),rest671) end | (497,(_,(MlyValue.record_description_entries record_description_entries,record_description_entries1left, record_description_entries1right))::rest671) => let val result= MlyValue.record_description_entries_opt(( Cobol.RECORD_DESCRIPTION_ENTRIES_OPT(record_description_entries))) in (hojfelds_NT 384,(result,record_description_entries1left, record_description_entries1right),rest671) end | (498,rest671) => let val result= MlyValue.record_description_entries_opt(( Cobol.NO_RECORD_DESCRIPTION_ENTRIES_OPT)) in (hojfelds_NT 384,(result,defaultPos,defaultPos),rest671) end | (499,(_,(MlyValue.data_description_entry data_description_entry, data_description_entry1left,data_description_entry1right))::rest671) => let val result=MlyValue.record_description_entry(( data_description_entry)) in (hojfelds_NT 386,(result,data_description_entry1left, data_description_entry1right),rest671) end | (500,(_,(MlyValue.data_description_entry_134 data_description_entry_134,data_description_entry_1341left, data_description_entry_1341right))::rest671) => let val result= MlyValue.data_description_entry((data_description_entry_134)) in (hojfelds_NT 89,(result,data_description_entry_1341left, data_description_entry_1341right),rest671) end | (501,(_,(MlyValue.renames_clause renames_clause,renames_clause1left, renames_clause1right))::rest671) => let val result= MlyValue.data_description_entry((renames_clause)) in (hojfelds_NT 89,(result,renames_clause1left,renames_clause1right), rest671) end | (502,(_,(MlyValue.data_description_annotation data_description_annotation,data_description_annotation1left, data_description_annotation1right))::rest671) => let val result= MlyValue.data_description_entry((data_description_annotation)) in (hojfelds_NT 89,(result,data_description_annotation1left, data_description_annotation1right),rest671) end | (503,(_,(MlyValue.ts2k ts2k,_,ts2kright as ts2k1right))::(_,(_, TS2Kleft as TS2K1left,_))::rest671) => let val result= MlyValue.data_description_annotation(( Cobol.TS2K_NOARROW(ts2k,TS2Kleft,ts2kright))) in (hojfelds_NT 541,(result,TS2K1left,ts2k1right),rest671) end | (504,(_,(MlyValue.ts2k ts2k2,_,ts2k2right))::_::(_,(MlyValue.ts2k ts2k1,_,_))::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result=MlyValue.data_description_annotation(( Cobol.TS2K_ARROW(ts2k1,ts2k2,TS2Kleft,ts2k2right))) in (hojfelds_NT 541,(result,TS2K1left,ts2k2right),rest671) end | (505,(_,(MlyValue.ts2k ts2k2,_,ts2k2right))::_::(_,(MlyValue.ts2k ts2k1,_,_))::_::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result=MlyValue.data_description_annotation(( Cobol.TS2K_ALL(ts2k1,ts2k2,TS2Kleft,ts2k2right))) in (hojfelds_NT 541,(result,TS2K1left,ts2k2right),rest671) end | (506,(_,(_,_,ENDright as END1right))::(_,(_,TS2Kleft as TS2K1left,_) )::rest671) => let val result=MlyValue.data_description_annotation(( Cobol.TS2K_END(TS2Kleft,ENDright))) in (hojfelds_NT 541,(result,TS2K1left,END1right),rest671) end | (507,(_,(_,_,SEPARATEright as SEPARATE1right))::_::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result= MlyValue.data_description_annotation(( Cobol.TS2K_ASSUME_SEPARATE(TS2Kleft,SEPARATEright))) in (hojfelds_NT 541,(result,TS2K1left,SEPARATE1right),rest671) end | (508,(_,(_,_,PERIODright as PERIOD1right))::(_,( MlyValue.data_description_clauses data_description_clauses,_,_))::(_,( MlyValue.redefines_clause redefines_clause,_,_))::(_,( MlyValue.data_name_or_filler data_name_or_filler,_,_))::(_,( MlyValue.level_number level_number,level_numberleft as level_number1left,_))::rest671) => let val result= MlyValue.data_description_entry_134(( (if (level_number = "88") then (case data_name_or_filler of Cobol.DATA_NAME_OR_FILLER_IS_DATA_NAME(data_name) => condition_names := data_name :: (!condition_names) | _ => ()) else ()); Cobol.DATA_DESCRIPTION_ENTRY_134(level_number, data_name_or_filler, redefines_clause, data_description_clauses, level_numberleft, PERIODright) )) in (hojfelds_NT 90,(result,level_number1left,PERIOD1right),rest671) end | (509,(_,(MlyValue.data_name data_name,_,data_name1right))::(_,(_, REDEFINES1left,_))::rest671) => let val result= MlyValue.redefines_clause((Cobol.REDEFINES_CLAUSE(data_name))) in (hojfelds_NT 391,(result,REDEFINES1left,data_name1right),rest671) end | (510,rest671) => let val result=MlyValue.redefines_clause(( Cobol.NO_REDEFINES_CLAUSE)) in (hojfelds_NT 391,(result,defaultPos,defaultPos),rest671) end | (511,(_,(MlyValue.data_description_clause data_description_clause,_, data_description_clause1right))::(_,(MlyValue.data_description_clauses data_description_clauses,data_description_clauses1left,_))::rest671) => let val result=MlyValue.data_description_clauses(( Cobol.DATA_DESCRIPTION_CLAUSES(data_description_clauses, data_description_clause) )) in (hojfelds_NT 88,(result,data_description_clauses1left, data_description_clause1right),rest671) end | (512,rest671) => let val result=MlyValue.data_description_clauses(( Cobol.NO_DATA_DESCRIPTION_CLAUSES)) in (hojfelds_NT 88,(result,defaultPos,defaultPos),rest671) end | (513,(_,(MlyValue.usage_clause usage_clause,usage_clauseleft as usage_clause1left,usage_clauseright as usage_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_USAGE_CLAUSE(usage_clause, usage_clauseleft, usage_clauseright) )) in (hojfelds_NT 87,(result,usage_clause1left,usage_clause1right), rest671) end | (514,(_,(MlyValue.sign_clause sign_clause,sign_clauseleft as sign_clause1left,sign_clauseright as sign_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( let val (lt,sc) = sign_clause in Cobol.DATA_DESCRIPTION_CLAUSE_IS_SIGN_CLAUSE (lt,sc,sign_clauseleft,sign_clauseright) end )) in (hojfelds_NT 87,(result,sign_clause1left,sign_clause1right),rest671 ) end | (515,(_,(MlyValue.occurs_clause occurs_clause,occurs_clauseleft as occurs_clause1left,occurs_clauseright as occurs_clause1right)):: rest671) => let val result=MlyValue.data_description_clause(( let val (tld, adkp, ibp) = occurs_clause in Cobol.DATA_DESCRIPTION_CLAUSE_IS_OCCURS_CLAUSE (tld, adkp, ibp, occurs_clauseleft, occurs_clauseright) end )) in (hojfelds_NT 87,(result,occurs_clause1left,occurs_clause1right), rest671) end | (516,(_,(MlyValue.synchronized_clause synchronized_clause, synchronized_clauseleft as synchronized_clause1left, synchronized_clauseright as synchronized_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_SYNCHRONIZED_CLAUSE (synchronized_clause, synchronized_clauseleft, synchronized_clauseright) )) in (hojfelds_NT 87,(result,synchronized_clause1left, synchronized_clause1right),rest671) end | (517,(_,(_,justified_clauseleft as justified_clause1left, justified_clauseright as justified_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_JUSTIFIED_CLAUSE (justified_clauseleft, justified_clauseright) )) in (hojfelds_NT 87,(result,justified_clause1left, justified_clause1right),rest671) end | (518,(_,(_,blank_when_zero_clauseleft as blank_when_zero_clause1left ,blank_when_zero_clauseright as blank_when_zero_clause1right)):: rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_BLANK_WHEN_ZERO_CLAUSE (blank_when_zero_clauseleft, blank_when_zero_clauseright) )) in (hojfelds_NT 87,(result,blank_when_zero_clause1left, blank_when_zero_clause1right),rest671) end | (519,(_,(MlyValue.value_clause value_clause,value_clauseleft as value_clause1left,value_clauseright as value_clause1right))::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_VALUE_CLAUSE(value_clause, value_clauseleft, value_clauseright) )) in (hojfelds_NT 87,(result,value_clause1left,value_clause1right), rest671) end | (520,(_,(MlyValue.picture_clause picture_clause,picture_clauseleft as picture_clause1left,picture_clauseright as picture_clause1right)) ::rest671) => let val result=MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_PICTURE_CLAUSE(picture_clause, picture_clauseleft, picture_clauseright) )) in (hojfelds_NT 87,(result,picture_clause1left,picture_clause1right), rest671) end | (521,(_,(MlyValue.indicator_clause indicator_clause, indicator_clauseleft as indicator_clause1left,indicator_clauseright as indicator_clause1right))::rest671) => let val result= MlyValue.data_description_clause(( Cobol.DATA_DESCRIPTION_CLAUSE_IS_INDICATOR_CLAUSE (indicator_clause, indicator_clauseleft, indicator_clauseright) )) in (hojfelds_NT 87,(result,indicator_clause1left, indicator_clause1right),rest671) end | (522,(_,(MlyValue.INTEGER INTEGER,_,INTEGER1right))::(_,(_, indicator1left,_))::rest671) => let val result= MlyValue.indicator_clause((INTEGER)) in (hojfelds_NT 251,(result,indicator1left,INTEGER1right),rest671) end | (523,(_,(_,INDICATOR1left,INDICATOR1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 252,(result,INDICATOR1left,INDICATOR1right),rest671) end | (524,(_,(_,INDICATORS1left,INDICATORS1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 252,(result,INDICATORS1left,INDICATORS1right),rest671) end | (525,(_,(_,INDIC1left,INDIC1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 252,(result,INDIC1left,INDIC1right),rest671) end | (526,(_,(_,_,ZERO1right))::_::(_,(_,BLANK1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 52,(result,BLANK1left,ZERO1right),rest671) end | (527,(_,(_,_,right1right))::(_,(_,justified1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 281,(result,justified1left,right1right),rest671) end | (528,(_,(MlyValue.fixed_length_tables_clause fixed_length_tables_clause,fixed_length_tables_clause1left, fixed_length_tables_clause1right))::rest671) => let val result= MlyValue.occurs_clause((fixed_length_tables_clause)) in (hojfelds_NT 329,(result,fixed_length_tables_clause1left, fixed_length_tables_clause1right),rest671) end | (529,(_,(MlyValue.variable_length_tables_clause variable_length_tables_clause,variable_length_tables_clause1left, variable_length_tables_clause1right))::rest671) => let val result= MlyValue.occurs_clause((variable_length_tables_clause)) in (hojfelds_NT 329,(result,variable_length_tables_clause1left, variable_length_tables_clause1right),rest671) end | (530,(_,(MlyValue.indexed_by_phrase indexed_by_phrase,_, indexed_by_phrase1right))::(_,( MlyValue.ascending_descending_key_phrases ascending_descending_key_phrases,_,_))::_::(_,(MlyValue.INTEGER INTEGER,_,_))::(_,(_,OCCURS1left,_))::rest671) => let val result= MlyValue.fixed_length_tables_clause(( (Cobol.FIXED_LENGTH_TABLE(INTEGER), ascending_descending_key_phrases, indexed_by_phrase) )) in (hojfelds_NT 211,(result,OCCURS1left,indexed_by_phrase1right), rest671) end | (531,(_,(MlyValue.ascending_descending_key_phrase ascending_descending_key_phrase,_, ascending_descending_key_phrase1right))::(_,( MlyValue.ascending_descending_key_phrases ascending_descending_key_phrases,ascending_descending_key_phrases1left ,_))::rest671) => let val result= MlyValue.ascending_descending_key_phrases(( Cobol.ASCENDING_DESCENDING_KEY_PHRASES (ascending_descending_key_phrases, ascending_descending_key_phrase) )) in (hojfelds_NT 45,(result,ascending_descending_key_phrases1left, ascending_descending_key_phrase1right),rest671) end | (532,rest671) => let val result= MlyValue.ascending_descending_key_phrases(( Cobol.NO_ASCENDING_DESCENDING_KEY_PHRASES)) in (hojfelds_NT 45,(result,defaultPos,defaultPos),rest671) end | (533,(_,(MlyValue.data_names data_names,_,data_names1right))::_::_:: (_,(MlyValue.ascending_descending ascending_descending, ascending_descending1left,_))::rest671) => let val result= MlyValue.ascending_descending_key_phrase(( Cobol.ASCENDING_DESCENDING_KEY_PHRASE(ascending_descending, data_names) )) in (hojfelds_NT 44,(result,ascending_descending1left,data_names1right) ,rest671) end | (534,(_,(_,ASCENDING1left,ASCENDING1right))::rest671) => let val result=MlyValue.ascending_descending((Cobol.ASCENDING)) in (hojfelds_NT 43,(result,ASCENDING1left,ASCENDING1right),rest671) end | (535,(_,(_,DESCENDING1left,DESCENDING1right))::rest671) => let val result=MlyValue.ascending_descending((Cobol.DESCENDING)) in (hojfelds_NT 43,(result,DESCENDING1left,DESCENDING1right),rest671) end | (536,(_,(MlyValue.index_names index_names,_,index_names1right))::_:: (_,(_,INDEXED1left,_))::rest671) => let val result= MlyValue.indexed_by_phrase((Cobol.INDEXED_BY_PHRASE(index_names))) in (hojfelds_NT 248,(result,INDEXED1left,index_names1right),rest671) end | (537,rest671) => let val result=MlyValue.indexed_by_phrase(( Cobol.NO_INDEXED_BY_PHRASE)) in (hojfelds_NT 248,(result,defaultPos,defaultPos),rest671) end | (538,(_,(MlyValue.indexed_by_phrase indexed_by_phrase,_, indexed_by_phrase1right))::(_,( MlyValue.ascending_descending_key_phrases ascending_descending_key_phrases,_,_))::(_,(MlyValue.data_name data_name,_,_))::_::_::_::(_,(MlyValue.INTEGER INTEGER2,_,_))::_::(_,( MlyValue.INTEGER INTEGER1,_,_))::(_,(_,OCCURS1left,_))::rest671) => let val result=MlyValue.variable_length_tables_clause(( (Cobol.VARIABLE_LENGTH_TABLE(INTEGER1,INTEGER2,data_name), ascending_descending_key_phrases, indexed_by_phrase) )) in (hojfelds_NT 522,(result,OCCURS1left,indexed_by_phrase1right), rest671) end | (539,(_,(MlyValue.character_string character_string,_, character_string1right))::_::(_,(_,picture1left,_))::rest671) => let val result=MlyValue.picture_clause((character_string)) in (hojfelds_NT 363,(result,picture1left,character_string1right), rest671) end | (540,(_,(MlyValue.separate_character separate_character,_, separate_character1right))::(_,(MlyValue.leading_trailing leading_trailing,_,_))::(_,(_,sign_is_opt1left,_))::rest671) => let val result=MlyValue.sign_clause(( (leading_trailing, separate_character))) in (hojfelds_NT 436,(result,sign_is_opt1left,separate_character1right) ,rest671) end | (541,(_,(_,LEADING1left,LEADING1right))::rest671) => let val result= MlyValue.leading_trailing((Cobol.LEADING_TRAILING_IS_LEADING)) in (hojfelds_NT 287,(result,LEADING1left,LEADING1right),rest671) end | (542,(_,(_,TRAILING1left,TRAILING1right))::rest671) => let val result=MlyValue.leading_trailing((Cobol.LEADING_TRAILING_IS_TRAILING)) in (hojfelds_NT 287,(result,TRAILING1left,TRAILING1right),rest671) end | (543,(_,(MlyValue.left_right left_right,_,left_right1right))::(_,(_, synchronized1left,_))::rest671) => let val result= MlyValue.synchronized_clause((left_right)) in (hojfelds_NT 475,(result,synchronized1left,left_right1right), rest671) end | (544,(_,(_,LEFT1left,LEFT1right))::rest671) => let val result= MlyValue.left_right((Cobol.LEFT)) in (hojfelds_NT 289,(result,LEFT1left,LEFT1right),rest671) end | (545,(_,(_,RIGHT1left,RIGHT1right))::rest671) => let val result= MlyValue.left_right((Cobol.RIGHT)) in (hojfelds_NT 289,(result,RIGHT1left,RIGHT1right),rest671) end | (546,(_,(MlyValue.usage_specifier usage_specifier,_, usage_specifier1right))::(_,(_,usage_is1left,_))::rest671) => let val result=MlyValue.usage_clause((usage_specifier)) in (hojfelds_NT 507,(result,usage_is1left,usage_specifier1right), rest671) end | (547,(_,(_,DISPLAY1left,DISPLAY1right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_DISPLAY)) in (hojfelds_NT 509,(result,DISPLAY1left,DISPLAY1right),rest671) end | (548,(_,(_,INDEX1left,INDEX1right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_INDEX)) in (hojfelds_NT 509,(result,INDEX1left,INDEX1right),rest671) end | (549,(_,(_,COMPUTATIONAL31left,COMPUTATIONAL31right))::rest671) => let val result=MlyValue.usage_specifier((Cobol.USAGE_IS_COMP3)) in (hojfelds_NT 509,(result,COMPUTATIONAL31left,COMPUTATIONAL31right), rest671) end | (550,(_,(_,COMP31left,COMP31right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_COMP3)) in (hojfelds_NT 509,(result,COMP31left,COMP31right),rest671) end | (551,(_,(_,COMPUTATIONAL41left,COMPUTATIONAL41right))::rest671) => let val result=MlyValue.usage_specifier((Cobol.USAGE_IS_COMP4)) in (hojfelds_NT 509,(result,COMPUTATIONAL41left,COMPUTATIONAL41right), rest671) end | (552,(_,(_,COMP41left,COMP41right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_COMP4)) in (hojfelds_NT 509,(result,COMP41left,COMP41right),rest671) end | (553,(_,(_,COMPUTATIONAL1left,COMPUTATIONAL1right))::rest671) => let val result=MlyValue.usage_specifier((Cobol.USAGE_IS_COMP)) in (hojfelds_NT 509,(result,COMPUTATIONAL1left,COMPUTATIONAL1right), rest671) end | (554,(_,(_,COMP1left,COMP1right))::rest671) => let val result= MlyValue.usage_specifier((Cobol.USAGE_IS_COMP)) in (hojfelds_NT 509,(result,COMP1left,COMP1right),rest671) end | (555,(_,(MlyValue.literal_ranges literal_ranges,_, literal_ranges1right))::(_,(_,value_is1left,_))::rest671) => let val result=MlyValue.value_clause((literal_ranges)) in (hojfelds_NT 516,(result,value_is1left,literal_ranges1right), rest671) end | (556,(_,(_,_,is1right))::(_,(_,VALUE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 517,(result,VALUE1left,is1right),rest671) end | (557,(_,(_,_,are1right))::(_,(_,VALUES1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 517,(result,VALUES1left,are1right),rest671) end | (558,(_,(_,_,PERIODright as PERIOD1right))::(_,( MlyValue.through_data_name through_data_name,_,_))::(_,( MlyValue.data_name data_name2,_,_))::_::(_,(MlyValue.data_name data_name1,_,_))::(_,(MlyValue.level_number level_number, level_numberleft as level_number1left,_))::rest671) => let val result= MlyValue.renames_clause(( Cobol.RENAMES_CLAUSE(level_number, data_name1, data_name2, through_data_name, level_numberleft, PERIODright) )) in (hojfelds_NT 401,(result,level_number1left,PERIOD1right),rest671) end | (559,(_,(MlyValue.data_name data_name,_,data_name1right))::(_,(_, through1left,_))::rest671) => let val result= MlyValue.through_data_name((Cobol.THROUGH_DATA_NAME(data_name))) in (hojfelds_NT 492,(result,through1left,data_name1right),rest671) end | (560,rest671) => let val result=MlyValue.through_data_name(( Cobol.NOT_THROUGH_DATA_NAME)) in (hojfelds_NT 492,(result,defaultPos,defaultPos),rest671) end | (561,(_,(MlyValue.record_description_entries_opt record_description_entries_opt,_,record_description_entries_optright as record_description_entries_opt1right))::_::_::(_,(_, WORKINGSTORAGEleft as WORKINGSTORAGE1left,_))::rest671) => let val result=MlyValue.working_storage_section(( Cobol.WORKINGSTORAGE_SECTION(record_description_entries_opt, WORKINGSTORAGEleft,record_description_entries_optright) )) in (hojfelds_NT 529,(result,WORKINGSTORAGE1left, record_description_entries_opt1right),rest671) end | (562,rest671) => let val result=MlyValue.working_storage_section(( Cobol.NO_WORKINGSTORAGE_SECTION)) in (hojfelds_NT 529,(result,defaultPos,defaultPos),rest671) end | (563,(_,(MlyValue.record_description_entries_opt record_description_entries_opt,_,record_description_entries_optright as record_description_entries_opt1right))::_::_::(_,(_,LINKAGEleft as LINKAGE1left,_))::rest671) => let val result= MlyValue.linkage_section(( Cobol.LINKAGE_SECTION(record_description_entries_opt, LINKAGEleft,record_description_entries_optright) )) in (hojfelds_NT 297,(result,LINKAGE1left, record_description_entries_opt1right),rest671) end | (564,rest671) => let val result=MlyValue.linkage_section(( Cobol.NO_LINKAGE_SECTION)) in (hojfelds_NT 297,(result,defaultPos,defaultPos),rest671) end | (565,(_,(MlyValue.sections sections,_,sectionsright as sections1right))::(_,(MlyValue.declaratives_section declaratives_section,_,_))::_::(_,(MlyValue.using_clause using_clause, _,_))::_::(_,(_,PROCEDUREleft as PROCEDURE1left,_))::rest671) => let val result=MlyValue.procedure_division(( Cobol.PROCEDURE_DIVISION_FORMAT_1_DECLARATIVES(using_clause, declaratives_section, sections, PROCEDUREleft, sectionsright) )) in (hojfelds_NT 367,(result,PROCEDURE1left,sections1right),rest671) end | (566,(_,(MlyValue.sections sections,_,sectionsright as sections1right))::_::(_,(MlyValue.using_clause using_clause,_,_))::_:: (_,(_,PROCEDUREleft as PROCEDURE1left,_))::rest671) => let val result= MlyValue.procedure_division(( Cobol.PROCEDURE_DIVISION_FORMAT_1_NO_DECLARATIVES(using_clause, sections, PROCEDUREleft, sectionsright) )) in (hojfelds_NT 367,(result,PROCEDURE1left,sections1right),rest671) end | (567,(_,(MlyValue.paragraphs paragraphs,_,paragraphsright as paragraphs1right))::_::(_,(MlyValue.using_clause using_clause,_,_))::_ ::(_,(_,PROCEDUREleft as PROCEDURE1left,_))::rest671) => let val result=MlyValue.procedure_division(( Cobol.PROCEDURE_DIVISION_FORMAT_2(using_clause, paragraphs, PROCEDUREleft, paragraphsright) )) in (hojfelds_NT 367,(result,PROCEDURE1left,paragraphs1right),rest671) end | (568,rest671) => let val result=MlyValue.procedure_division(( Cobol.EMPTY_PROCEDURE_DIVISION)) in (hojfelds_NT 367,(result,defaultPos,defaultPos),rest671) end | (569,(_,(_,_,data_names1right))::(_,(_,USING1left,_))::rest671) => let val result=MlyValue.using_clause(()) in (hojfelds_NT 512,(result,USING1left,data_names1right),rest671) end | (570,rest671) => let val result=MlyValue.using_clause(()) in (hojfelds_NT 512,(result,defaultPos,defaultPos),rest671) end | (571,(_,(_,_,PERIOD2right))::_::_::_::_::(_,(_,DECLARATIVES1left,_)) ::rest671) => let val result=MlyValue.declaratives_section(()) in (hojfelds_NT 118,(result,DECLARATIVES1left,PERIOD2right),rest671) end | (572,(_,(_,_,PERIOD2right))::_::_::_::_::(_,(_,section_name1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 119,(result,section_name1left,PERIOD2right),rest671) end | (573,(_,(_,_,declaratives_sections1right))::_::_::_::_::_::(_,(_, section_name1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 119,(result,section_name1left, declaratives_sections1right),rest671) end | (574,(_,(_,_,declaratives_paragraphs1right))::_::_::_::_::_::(_,(_, section_name1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 119,(result,section_name1left, declaratives_paragraphs1right),rest671) end | (575,(_,(_,_,declaratives_paragraphs1right))::_::_::(_,(_, paragraph_name1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 117,(result,paragraph_name1left, declaratives_paragraphs1right),rest671) end | (576,(_,(_,_,declaratives_sections1right))::_::_::(_,(_, paragraph_name1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 117,(result,paragraph_name1left, declaratives_sections1right),rest671) end | (577,(_,(_,_,sentences1right))::_::(_,(_,paragraph_name1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 117,(result,paragraph_name1left,sentences1right), rest671) end | (578,(_,(_,_,PERIOD1right))::(_,(MlyValue.segment_number_opt segment_number_opt,_,_))::_::(_,(MlyValue.section_name section_name, section_name1left,_))::rest671) => let val result=MlyValue.sections(( Cobol.NO_BODY_SECTION(section_name,segment_number_opt))) in (hojfelds_NT 424,(result,section_name1left,PERIOD1right),rest671) end | (579,(_,(MlyValue.sections sections,_,sections1right))::_::(_,( MlyValue.segment_number_opt segment_number_opt,_,_))::_::(_,( MlyValue.section_name section_name,section_name1left,_))::rest671) => let val result=MlyValue.sections(( Cobol.NO_BODY_SECTION_FOLLOWED_BY_SECTION(section_name, segment_number_opt, sections) )) in (hojfelds_NT 424,(result,section_name1left,sections1right),rest671) end | (580,(_,(MlyValue.paragraphs_and_sections paragraphs_and_sections,_, paragraphs_and_sections1right))::_::(_,(MlyValue.segment_number_opt segment_number_opt,_,_))::_::(_,(MlyValue.section_name section_name, section_name1left,_))::rest671) => let val result=MlyValue.sections(( Cobol.SECTION(section_name, segment_number_opt, paragraphs_and_sections) )) in (hojfelds_NT 424,(result,section_name1left, paragraphs_and_sections1right),rest671) end | (581,(_,(MlyValue.paragraphs_and_sections paragraphs_and_sections,_, paragraphs_and_sections1right))::(_,(MlyValue.paragraph paragraph, paragraph1left,_))::rest671) => let val result= MlyValue.paragraphs_and_sections(( Cobol.SEVERAL_PARAGRAPHS_AND_SECTIONS(paragraph, paragraphs_and_sections) )) in (hojfelds_NT 359,(result,paragraph1left, paragraphs_and_sections1right),rest671) end | (582,(_,(MlyValue.sections sections,_,sections1right))::(_,( MlyValue.paragraph paragraph,paragraph1left,_))::rest671) => let val result=MlyValue.paragraphs_and_sections(( Cobol.SINGLE_PARAGRAPH_AND_SECTIONS(paragraph,sections))) in (hojfelds_NT 359,(result,paragraph1left,sections1right),rest671) end | (583,(_,(MlyValue.paragraph paragraph,paragraph1left,paragraph1right ))::rest671) => let val result=MlyValue.paragraphs_and_sections(( Cobol.SINGLE_PARAGRAPH(paragraph))) in (hojfelds_NT 359,(result,paragraph1left,paragraph1right),rest671) end | (584,(_,(MlyValue.paragraph paragraph,_,paragraph1right))::(_,( MlyValue.paragraphs paragraphs,paragraphs1left,_))::rest671) => let val result=MlyValue.paragraphs(( Cobol.SEVERAL_PARAGRAPHS(paragraphs,paragraph))) in (hojfelds_NT 358,(result,paragraphs1left,paragraph1right),rest671) end | (585,(_,(MlyValue.paragraph paragraph,paragraph1left,paragraph1right ))::rest671) => let val result=MlyValue.paragraphs(( Cobol.ONE_PARAGRAPH(paragraph))) in (hojfelds_NT 358,(result,paragraph1left,paragraph1right),rest671) end | (586,(_,(MlyValue.sentences sentences,_,sentences1right))::_::(_,( MlyValue.paragraph_name paragraph_name,paragraph_name1left,_)):: rest671) => let val result=MlyValue.paragraph(( Cobol.PARAGRAPH(paragraph_name,sentences))) in (hojfelds_NT 356,(result,paragraph_name1left,sentences1right), rest671) end | (587,(_,(MlyValue.sentence sentence,_,sentence1right))::(_,( MlyValue.sentences sentences,sentences1left,_))::rest671) => let val result=MlyValue.sentences((Cobol.SENTENCES(sentences,sentence))) in (hojfelds_NT 430,(result,sentences1left,sentence1right),rest671) end | (588,rest671) => let val result=MlyValue.sentences(( Cobol.NO_SENTENCES)) in (hojfelds_NT 430,(result,defaultPos,defaultPos),rest671) end | (589,(_,(_,_,PERIOD1right))::(_,(MlyValue.statements statements, statements1left,_))::rest671) => let val result=MlyValue.sentence(( Cobol.SENTENCE(statements))) in (hojfelds_NT 429,(result,statements1left,PERIOD1right),rest671) end | (590,(_,(MlyValue.statement statement,_,statement1right))::(_,( MlyValue.statements statements,statements1left,_))::rest671) => let val result=MlyValue.statements(( Cobol.SEVERAL_STATEMENTS(statements,statement))) in (hojfelds_NT 459,(result,statements1left,statement1right),rest671) end | (591,(_,(MlyValue.statement statement,statement1left,statement1right ))::rest671) => let val result=MlyValue.statements(( Cobol.ONE_STATEMENT(statement))) in (hojfelds_NT 459,(result,statement1left,statement1right),rest671) end | (592,(_,(MlyValue.statements statements,statements1left, statements1right))::rest671) => let val result= MlyValue.imperative_statement((statements)) in (hojfelds_NT 241,(result,statements1left,statements1right),rest671) end | (593,(_,(MlyValue.INTEGER INTEGER,INTEGERleft as INTEGER1left, INTEGERright as INTEGER1right))::rest671) => let val result= MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_INTEGER(INTEGER,INTEGERleft,INTEGERright) )) in (hojfelds_NT 476,(result,INTEGER1left,INTEGER1right),rest671) end | (594,(_,(MlyValue.DECIMALNUMBER DECIMALNUMBER,DECIMALNUMBERleft as DECIMALNUMBER1left,DECIMALNUMBERright as DECIMALNUMBER1right)):: rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_DECIMALNUMBER (DECIMALNUMBER,DECIMALNUMBERleft,DECIMALNUMBERright) )) in (hojfelds_NT 476,(result,DECIMALNUMBER1left,DECIMALNUMBER1right), rest671) end | (595,(_,(MlyValue.NONNUMERICLITERAL NONNUMERICLITERAL, NONNUMERICLITERALleft as NONNUMERICLITERAL1left,NONNUMERICLITERALright as NONNUMERICLITERAL1right))::rest671) => let val result= MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_NONNUMERICLITERAL(NONNUMERICLITERAL, NONNUMERICLITERALleft, NONNUMERICLITERALright) )) in (hojfelds_NT 476,(result,NONNUMERICLITERAL1left, NONNUMERICLITERAL1right),rest671) end | (596,(_,(MlyValue.BOOLEANLITERAL BOOLEANLITERAL,BOOLEANLITERALleft as BOOLEANLITERAL1left,BOOLEANLITERALright as BOOLEANLITERAL1right)) ::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_BOOLEANLITERAL (BOOLEANLITERAL,BOOLEANLITERALleft,BOOLEANLITERALright) )) in (hojfelds_NT 476,(result,BOOLEANLITERAL1left,BOOLEANLITERAL1right), rest671) end | (597,(_,(MlyValue.figurative_constant figurative_constant, figurative_constantleft as figurative_constant1left, figurative_constantright as figurative_constant1right))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_FIGURATIVE_CONSTANT (figurative_constant,figurative_constantleft,figurative_constantright) )) in (hojfelds_NT 476,(result,figurative_constant1left, figurative_constant1right),rest671) end | (598,(_,(MlyValue.identifier identifier,identifier1left, identifier1right))::rest671) => let val result= MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_IDENTIFIER(identifier))) in (hojfelds_NT 476,(result,identifier1left,identifier1right),rest671) end | (599,(_,(MlyValue.arithmetic_expression arithmetic_expression,_, arithmetic_expression1right))::(_,(_,PLUSSYMBOL1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_PLUS_SIGN(arithmetic_expression))) in (hojfelds_NT 476,(result,PLUSSYMBOL1left, arithmetic_expression1right),rest671) end | (600,(_,(MlyValue.arithmetic_expression arithmetic_expression,_, arithmetic_expression1right))::(_,(_,MINUSSYMBOL1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_MINUS_SIGN(arithmetic_expression))) in (hojfelds_NT 476,(result,MINUSSYMBOL1left, arithmetic_expression1right),rest671) end | (601,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_EXPONENTIATION (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (602,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_MULTIPLY (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (603,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_DIVIDE (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (604,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_ADD (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (605,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::_::(_,(MlyValue.arithmetic_expression arithmetic_expression1,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.arithmetic_expression(( Cobol.ARITHMETIC_EXPRESSION_IS_SUBTRACT (arithmetic_expression1,arithmetic_expression2) )) in (hojfelds_NT 476,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (606,(_,(_,_,RPAR1right))::(_,(MlyValue.arithmetic_expression arithmetic_expression,_,_))::(_,(_,LPAR1left,_))::rest671) => let val result=MlyValue.arithmetic_expression((arithmetic_expression)) in (hojfelds_NT 476,(result,LPAR1left,RPAR1right),rest671) end | (607,(_,(MlyValue.expression expression,expression1left, expression1right))::rest671) => raise Hojfeld "607" (* let val result= MlyValue.conditional_expression((convertCE(expression))) in (hojfelds_NT 477,(result,expression1left,expression1right),rest671) end *) | (608,(_,(MlyValue.arithmetic_expression arithmetic_expression, arithmetic_expressionleft as arithmetic_expression1left, arithmetic_expressionright as arithmetic_expression1right))::rest671) => let val result=MlyValue.expression(( CE_AE(arithmetic_expression, arithmetic_expressionleft, arithmetic_expressionright) )) in (hojfelds_NT 42,(result,arithmetic_expression1left, arithmetic_expression1right),rest671) end | (609,(_,(MlyValue.arithmetic_expression arithmetic_expression,_, arithmetic_expressionright as arithmetic_expression1right))::(_,( MlyValue.relational_operator relational_operator, relational_operatorleft as relational_operator1left,_))::rest671) => let val result=MlyValue.expression(( CE_SINGLE_REL(relational_operator, arithmetic_expression, relational_operatorleft, arithmetic_expressionright) )) in (hojfelds_NT 42,(result,relational_operator1left, arithmetic_expression1right),rest671) end | (610,(_,(MlyValue.arithmetic_expression arithmetic_expression2,_, arithmetic_expression2right))::(_,(MlyValue.relational_operator relational_operator,_,_))::(_,(MlyValue.is_not is_not,_,_))::(_,( MlyValue.arithmetic_expression arithmetic_expression1, arithmetic_expression1left,_))::rest671) => let val result= MlyValue.expression(( CE_REL(arithmetic_expression1, is_not, relational_operator, arithmetic_expression2, arithmetic_expression1left, arithmetic_expression2right) )) in (hojfelds_NT 42,(result,arithmetic_expression1left, arithmetic_expression2right),rest671) end | (611,(_,(MlyValue.data_class data_class,_,data_class1right))::(_,( MlyValue.is_not is_not,_,_))::(_,(MlyValue.arithmetic_expression arithmetic_expression,arithmetic_expression1left,_))::rest671) => let val result=MlyValue.expression(( CE_DC(arithmetic_expression,is_not,data_class))) in (hojfelds_NT 42,(result,arithmetic_expression1left,data_class1right ),rest671) end | (612,(_,(MlyValue.sign_specification sign_specification,_, sign_specification1right))::(_,(MlyValue.is_not is_not,_,_))::(_,( MlyValue.arithmetic_expression arithmetic_expression, arithmetic_expression1left,_))::rest671) => let val result= MlyValue.expression(( CE_SIGN(arithmetic_expression,is_not,sign_specification))) in (hojfelds_NT 42,(result,arithmetic_expression1left, sign_specification1right),rest671) end | (613,(_,(_,TRUEleft as TRUE1left,TRUEright as TRUE1right))::rest671) => let val result=MlyValue.expression((CE_TRUE(TRUEleft,TRUEright))) in (hojfelds_NT 42,(result,TRUE1left,TRUE1right),rest671) end | (614,(_,(_,FALSEleft as FALSE1left,FALSEright as FALSE1right)):: rest671) => let val result=MlyValue.expression(( CE_FALSE(FALSEleft,FALSEright))) in (hojfelds_NT 42,(result,FALSE1left,FALSE1right),rest671) end | (615,(_,(_,environment_name_2left as environment_name_21left, environment_name_2right as environment_name_21right))::rest671) => let val result=MlyValue.expression(( CE_SWITCH(environment_name_2left,environment_name_2right))) in (hojfelds_NT 42,(result,environment_name_21left, environment_name_21right),rest671) end | (616,(_,(MlyValue.expression expression,_,expression1right))::(_,(_, NOT1left,_))::rest671) => let val result=MlyValue.expression(( CE_NOT(expression))) in (hojfelds_NT 42,(result,NOT1left,expression1right),rest671) end | (617,(_,(MlyValue.expression expression2,_,expression2right))::_::(_ ,(MlyValue.expression expression1,expression1left,_))::rest671) => let val result=MlyValue.expression((CE_AND(expression1,expression2))) in (hojfelds_NT 42,(result,expression1left,expression2right),rest671) end | (618,(_,(MlyValue.expression expression2,_,expression2right))::_::(_ ,(MlyValue.expression expression1,expression1left,_))::rest671) => let val result=MlyValue.expression((CE_OR(expression1,expression2))) in (hojfelds_NT 42,(result,expression1left,expression2right),rest671) end | (619,(_,(_,_,RPAR1right))::(_,(MlyValue.expression expression,_,_)) ::(_,(_,LPAR1left,_))::rest671) => let val result=MlyValue.expression( (expression)) in (hojfelds_NT 42,(result,LPAR1left,RPAR1right),rest671) end | (620,(_,(_,NUMERIC1left,NUMERIC1right))::rest671) => let val result= MlyValue.data_class((Cobol.DATA_CLASS_IS_NUMERIC)) in (hojfelds_NT 122,(result,NUMERIC1left,NUMERIC1right),rest671) end | (621,(_,(_,ALPHABETIC1left,ALPHABETIC1right))::rest671) => let val result=MlyValue.data_class((Cobol.DATA_CLASS_IS_ALPHABETIC)) in (hojfelds_NT 122,(result,ALPHABETIC1left,ALPHABETIC1right),rest671) end | (622,(_,(_,_,than1right))::(_,(_,GREATER1left,_))::rest671) => let val result=MlyValue.relational_operator((Cobol.GREATER)) in (hojfelds_NT 121,(result,GREATER1left,than1right),rest671) end | (623,(_,(_,GREATERSYMBOL1left,GREATERSYMBOL1right))::rest671) => let val result=MlyValue.relational_operator((Cobol.GREATER)) in (hojfelds_NT 121,(result,GREATERSYMBOL1left,GREATERSYMBOL1right), rest671) end | (624,(_,(_,_,than1right))::(_,(_,LESS1left,_))::rest671) => let val result=MlyValue.relational_operator((Cobol.LESS)) in (hojfelds_NT 121,(result,LESS1left,than1right),rest671) end | (625,(_,(_,LESSSYMBOL1left,LESSSYMBOL1right))::rest671) => let val result=MlyValue.relational_operator((Cobol.LESS)) in (hojfelds_NT 121,(result,LESSSYMBOL1left,LESSSYMBOL1right),rest671) end | (626,(_,(_,_,to1right))::(_,(_,EQUAL1left,_))::rest671) => let val result=MlyValue.relational_operator((Cobol.EQUAL)) in (hojfelds_NT 121,(result,EQUAL1left,to1right),rest671) end | (627,(_,(_,EQSYMBOL1left,EQSYMBOL1right))::rest671) => let val result=MlyValue.relational_operator((Cobol.EQUAL)) in (hojfelds_NT 121,(result,EQSYMBOL1left,EQSYMBOL1right),rest671) end | (628,(_,(_,POSITIVE1left,POSITIVE1right))::rest671) => let val result=MlyValue.sign_specification(( Cobol.SIGN_SPECIFICATION_IS_POSITIVE)) in (hojfelds_NT 123,(result,POSITIVE1left,POSITIVE1right),rest671) end | (629,(_,(_,NEGATIVE1left,NEGATIVE1right))::rest671) => let val result=MlyValue.sign_specification(( Cobol.SIGN_SPECIFICATION_IS_NEGATIVE)) in (hojfelds_NT 123,(result,NEGATIVE1left,NEGATIVE1right),rest671) end | (630,(_,(_,ZERO1left,ZERO1right))::rest671) => let val result= MlyValue.sign_specification((Cobol.SIGN_SPECIFICATION_IS_ZERO)) in (hojfelds_NT 123,(result,ZERO1left,ZERO1right),rest671) end | (631,(_,(MlyValue.accept_statement accept_statement, accept_statement1left,accept_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.ACCEPT_STATEMENT(accept_statement))) in (hojfelds_NT 458,(result,accept_statement1left, accept_statement1right),rest671) end | (632,(_,(MlyValue.add_statement add_statement,add_statement1left, add_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.ADD_OR_SUBTRACT_STATEMENT(add_statement))) in (hojfelds_NT 458,(result,add_statement1left,add_statement1right), rest671) end | (633,(_,(_,alter_statement1left,alter_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,alter_statement1left,alter_statement1right ),rest671) end | (634,(_,(_,call_statement1left,call_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,call_statement1left,call_statement1right), rest671) end | (635,(_,(_,cancel_statement1left,cancel_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,cancel_statement1left, cancel_statement1right),rest671) end | (636,(_,(_,close_statement1left,close_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,close_statement1left,close_statement1right ),rest671) end | (637,(_,(MlyValue.compute_statement compute_statement, compute_statement1left,compute_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.COMPUTE_STATEMENT(compute_statement)) ) in (hojfelds_NT 458,(result,compute_statement1left, compute_statement1right),rest671) end | (638,(_,(_,delete_statement1left,delete_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,delete_statement1left, delete_statement1right),rest671) end | (639,(_,(_,display_statement1left,display_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,display_statement1left, display_statement1right),rest671) end | (640,(_,(MlyValue.divide_statement divide_statement, divide_statement1left,divide_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.DIVIDE_STATEMENT(divide_statement))) in (hojfelds_NT 458,(result,divide_statement1left, divide_statement1right),rest671) end | (641,(_,(_,enter_statement1left,enter_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,enter_statement1left,enter_statement1right ),rest671) end | (642,(_,(_,exit_statement1left,exit_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,exit_statement1left,exit_statement1right), rest671) end | (643,(_,(_,exit_program_statement1left,exit_program_statement1right) )::rest671) => let val result=MlyValue.statement(( Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,exit_program_statement1left, exit_program_statement1right),rest671) end | (644,(_,(_,goback_statement1left,goback_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,goback_statement1left, goback_statement1right),rest671) end | (645,(_,(_,go_to_statement1left,go_to_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,go_to_statement1left,go_to_statement1right ),rest671) end | (646,(_,(MlyValue.if_statement if_statement,if_statement1left, if_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.IF_STATEMENT(if_statement))) in (hojfelds_NT 458,(result,if_statement1left,if_statement1right), rest671) end | (647,(_,(_,initialize_statement1left,initialize_statement1right)):: rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,initialize_statement1left, initialize_statement1right),rest671) end | (648,(_,(_,inspect_statement1left,inspect_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,inspect_statement1left, inspect_statement1right),rest671) end | (649,(_,(_,merge_statement1left,merge_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,merge_statement1left,merge_statement1right ),rest671) end | (650,(_,(MlyValue.move_statement move_statement,move_statement1left, move_statement1right))::rest671) => let val result=MlyValue.statement( (Cobol.MOVE_STATEMENT(move_statement))) in (hojfelds_NT 458,(result,move_statement1left,move_statement1right), rest671) end | (651,(_,(MlyValue.multiply_statement multiply_statement, multiply_statement1left,multiply_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.MULTIPLY_STATEMENT(multiply_statement))) in (hojfelds_NT 458,(result,multiply_statement1left, multiply_statement1right),rest671) end | (652,(_,(_,open_statement1left,open_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,open_statement1left,open_statement1right), rest671) end | (653,(_,(_,perform_statement1left,perform_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,perform_statement1left, perform_statement1right),rest671) end | (654,(_,(_,read_statement1left,read_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,read_statement1left,read_statement1right), rest671) end | (655,(_,(_,release_statement1left,release_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,release_statement1left, release_statement1right),rest671) end | (656,(_,(_,return_statement1left,return_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,return_statement1left, return_statement1right),rest671) end | (657,(_,(_,rewrite_statement1left,rewrite_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,rewrite_statement1left, rewrite_statement1right),rest671) end | (658,(_,(_,search_statement1left,search_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,search_statement1left, search_statement1right),rest671) end | (659,(_,(_,set_statement1left,set_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,set_statement1left,set_statement1right), rest671) end | (660,(_,(_,sort_statement1left,sort_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,sort_statement1left,sort_statement1right), rest671) end | (661,(_,(_,start_statement1left,start_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,start_statement1left,start_statement1right ),rest671) end | (662,(_,(_,stop_statement1left,stop_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,stop_statement1left,stop_statement1right), rest671) end | (663,(_,(_,string_statement1left,string_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,string_statement1left, string_statement1right),rest671) end | (664,(_,(MlyValue.subtract_statement subtract_statement, subtract_statement1left,subtract_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.ADD_OR_SUBTRACT_STATEMENT(subtract_statement))) in (hojfelds_NT 458,(result,subtract_statement1left, subtract_statement1right),rest671) end | (665,(_,(_,unstring_statement1left,unstring_statement1right)):: rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,unstring_statement1left, unstring_statement1right),rest671) end | (666,(_,(_,use_statement1left,use_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,use_statement1left,use_statement1right), rest671) end | (667,(_,(_,write_statement1left,write_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,write_statement1left,write_statement1right ),rest671) end | (668,(_,(_,copy_statement1left,copy_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,copy_statement1left,copy_statement1right), rest671) end | (669,(_,(_,eject_statement1left,eject_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,eject_statement1left,eject_statement1right ),rest671) end | (670,(_,(_,exhibit_statement1left,exhibit_statement1right))::rest671 ) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,exhibit_statement1left, exhibit_statement1right),rest671) end | (671,(_,(_,trace_statement1left,trace_statement1right))::rest671) => let val result=MlyValue.statement((Cobol.OTHER_STATEMENT)) in (hojfelds_NT 458,(result,trace_statement1left,trace_statement1right ),rest671) end | (672,(_,(MlyValue.annotation_statement annotation_statement, annotation_statement1left,annotation_statement1right))::rest671) => let val result=MlyValue.statement(( Cobol.ANNOTATION_STATEMENT(annotation_statement))) in (hojfelds_NT 458,(result,annotation_statement1left, annotation_statement1right),rest671) end | (673,(_,(MlyValue.identifier_or_literal identifier_or_literal, identifier_or_literal1left,identifier_or_literal1right))::rest671) => let val result=MlyValue.identifier_or_literal_or_ddt(( Cobol.IDENTIFIER_OR_LITERAL_OR_DDT_IS_IDENTIFIER_OR_LITERAL(identifier_or_literal) )) in (hojfelds_NT 544,(result,identifier_or_literal1left, identifier_or_literal1right),rest671) end | (674,(_,(MlyValue.date_day_time date_day_time,date_day_time1left, date_day_time1right))::rest671) => let val result= MlyValue.identifier_or_literal_or_ddt(( Cobol.IDENTIFIER_OR_LITERAL_OR_DDT_IS_DDT(date_day_time))) in (hojfelds_NT 544,(result,date_day_time1left,date_day_time1right), rest671) end | (675,(_,(MlyValue.identifier identifier,_,identifierright as identifier1right))::_::(_,(MlyValue.ts2k ts2k,_,_))::_::(_,( MlyValue.identifier_or_literal_or_ddt identifier_or_literal_or_ddt,_,_ ))::_::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result= MlyValue.annotation_statement(( Cobol.TS2K_COERCE(identifier_or_literal_or_ddt, ts2k, TS2Kleft,identifierright,identifier) )) in (hojfelds_NT 542,(result,TS2K1left,identifier1right),rest671) end | (676,(_,(MlyValue.ts2k ts2k,_,ts2kright as ts2k1right))::_::(_,( MlyValue.identifier_or_literal_or_ddt identifier_or_literal_or_ddt,_,_ ))::_::(_,(_,TS2Kleft as TS2K1left,_))::rest671) => let val result= MlyValue.annotation_statement(( Cobol.TS2K_ASSUME(identifier_or_literal_or_ddt,ts2k,TS2Kleft,ts2kright) )) in (hojfelds_NT 542,(result,TS2K1left,ts2k1right),rest671) end | (677,(_,(MlyValue.from_environment from_environment,_, from_environmentright as from_environment1right))::(_,( MlyValue.identifier identifier,_,_))::(_,(_,ACCEPTleft as ACCEPT1left, _))::rest671) => let val result=MlyValue.accept_statement(( Cobol.ACCEPT_ENVIRONMENT(identifier, from_environment,ACCEPTleft,from_environmentright) )) in (hojfelds_NT 7,(result,ACCEPT1left,from_environment1right),rest671) end | (678,(_,(MlyValue.date_day_time date_day_time,_,date_day_timeright as date_day_time1right))::_::(_,(MlyValue.identifier identifier,_,_)) ::(_,(_,ACCEPTleft as ACCEPT1left,_))::rest671) => let val result= MlyValue.accept_statement(( Cobol.ACCEPT_DATE_DAY_TIME(identifier, date_day_time,ACCEPTleft,date_day_timeright) )) in (hojfelds_NT 7,(result,ACCEPT1left,date_day_time1right),rest671) end | (679,(_,(MlyValue.mnemonic_name mnemonic_name,_,mnemonic_nameright as mnemonic_name1right))::(_,(_,FROMleft as FROM1left,_))::rest671) => let val result=MlyValue.from_environment(( Cobol.FROM(mnemonic_name,FROMleft,mnemonic_nameright))) in (hojfelds_NT 215,(result,FROM1left,mnemonic_name1right),rest671) end | (680,rest671) => let val result=MlyValue.from_environment(( Cobol.NO_FROM)) in (hojfelds_NT 215,(result,defaultPos,defaultPos),rest671) end | (681,(_,(_,DATEleft as DATE1left,DATEright as DATE1right))::rest671) => let val result=MlyValue.date_day_time(( Cobol.DATE(DATEleft,DATEright))) in (hojfelds_NT 112,(result,DATE1left,DATE1right),rest671) end | (682,(_,(_,DAYleft as DAY1left,DAYright as DAY1right))::rest671) => let val result=MlyValue.date_day_time((Cobol.DAY(DAYleft,DAYright))) in (hojfelds_NT 112,(result,DAY1left,DAY1right),rest671) end | (683,(_,(_,TIMEleft as TIME1left,TIMEright as TIME1right))::rest671) => let val result=MlyValue.date_day_time(( Cobol.TIME(TIMEleft,TIMEright))) in (hojfelds_NT 112,(result,TIME1left,TIME1right),rest671) end | (684,(_,(_,_,end_addright as end_add1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literals identifier_or_literals,_,_))::(_,(_, ADDleft as ADD1left,_))::rest671) => let val result= MlyValue.add_statement(( Cobol.ADD_OR_SUBTRACT (Cobol.ADD,identifier_or_literals,identifier_roundeds, size_error_clauses, ADDleft,end_addright) )) in (hojfelds_NT 10,(result,ADD1left,end_add1right),rest671) end | (685,(_,(_,_,end_addright as end_add1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal,_,_))::(_,( MlyValue.identifier_or_literals identifier_or_literals,_,_))::(_,(_, ADDleft as ADD1left,_))::rest671) => let val result= MlyValue.add_statement(( Cobol.ADD_OR_SUBTRACT_GIVING (Cobol.ADD,identifier_or_literals,identifier_or_literal, identifier_roundeds, size_error_clauses,ADDleft,end_addright) )) in (hojfelds_NT 10,(result,ADD1left,end_add1right),rest671) end | (686,(_,(_,_,end_addright as end_add1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.rounded rounded,_,_))::(_,(MlyValue.identifier identifier2,_, _))::_::(_,(MlyValue.identifier identifier1,_,_))::_::(_,(_,ADDleft as ADD1left,_))::rest671) => let val result=MlyValue.add_statement(( Cobol.ADD_OR_SUBTRACT_CORRESPONDING (Cobol.ADD,identifier1,identifier2,rounded, size_error_clauses,ADDleft,end_addright) )) in (hojfelds_NT 10,(result,ADD1left,end_add1right),rest671) end | (687,(_,(MlyValue.identifier_rounded identifier_rounded,_, identifier_rounded1right))::(_,(MlyValue.identifier_roundeds identifier_roundeds,identifier_roundeds1left,_))::rest671) => let val result=MlyValue.identifier_roundeds(( Cobol.SEVERAL_IDENTIFIER_ROUNDEDS(identifier_roundeds, identifier_rounded) )) in (hojfelds_NT 236,(result,identifier_roundeds1left, identifier_rounded1right),rest671) end | (688,(_,(MlyValue.identifier_rounded identifier_rounded, identifier_rounded1left,identifier_rounded1right))::rest671) => let val result=MlyValue.identifier_roundeds(( Cobol.ONE_IDENTIFIER_ROUNDED(identifier_rounded))) in (hojfelds_NT 236,(result,identifier_rounded1left, identifier_rounded1right),rest671) end | (689,(_,(MlyValue.rounded rounded,_,rounded1right))::(_,( MlyValue.identifier identifier,identifier1left,_))::rest671) => let val result=MlyValue.identifier_rounded(( Cobol.IDENTIFIER_ROUNDED(identifier,rounded))) in (hojfelds_NT 235,(result,identifier1left,rounded1right),rest671) end | (690,(_,(MlyValue.size_error_clause size_error_clause, size_error_clause1left,size_error_clause1right))::rest671) => let val result=MlyValue.size_error_clauses((size_error_clause)) in (hojfelds_NT 442,(result,size_error_clause1left, size_error_clause1right),rest671) end | (691,(_,(MlyValue.imperative_statement imperative_statement,_, imperative_statement1right))::_::_::(_,(_,on1left,_))::rest671) => let val result=MlyValue.size_error_clause(( Cobol.SIZE_ERROR(imperative_statement))) in (hojfelds_NT 441,(result,on1left,imperative_statement1right), rest671) end | (692,rest671) => let val result=MlyValue.size_error_clause(( Cobol.NO_SIZE_ERROR)) in (hojfelds_NT 441,(result,defaultPos,defaultPos),rest671) end | (693,(_,(_,_,alterations1right))::(_,(_,ALTER1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 32,(result,ALTER1left,alterations1right),rest671) end | (694,(_,(_,_,alteration1right))::(_,(_,alterations1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 34,(result,alterations1left,alteration1right),rest671) end | (695,(_,(_,alteration1left,alteration1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 34,(result,alteration1left,alteration1right),rest671) end | (696,(_,(_,_,procedure_name2right))::_::_::(_,(_,procedure_name1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 33,(result,procedure_name1left,procedure_name2right), rest671) end | (697,(_,(_,_,end_call1right))::_::_::_::(_,(_,CALL1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 55,(result,CALL1left,end_call1right),rest671) end | (698,(_,(_,_,identifiers1right))::(_,(_,USING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 513,(result,USING1left,identifiers1right),rest671) end | (699,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 513,(result,defaultPos,defaultPos),rest671) end | (700,(_,(_,_,identifier_or_literals1right))::(_,(_,CANCEL1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 56,(result,CANCEL1left,identifier_or_literals1right), rest671) end | (701,(_,(_,_,file_name_specifications1right))::(_,(_,CLOSE1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 63,(result,CLOSE1left,file_name_specifications1right), rest671) end | (702,(_,(_,_,file_name_specification1right))::(_,(_, file_name_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 202,(result,file_name_specifications1left, file_name_specification1right),rest671) end | (703,(_,(_,file_name_specification1left, file_name_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 202,(result,file_name_specification1left, file_name_specification1right),rest671) end | (704,(_,(_,_,closing_specification1right))::(_,(_,file_name1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 201,(result,file_name1left,closing_specification1right ),rest671) end | (705,(_,(_,_,for_removal1right))::(_,(_,reel_or_unit1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 64,(result,reel_or_unit1left,for_removal1right), rest671) end | (706,(_,(_,_,no_rewind_or_lock1right))::(_,(_,with1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 64,(result,with1left,no_rewind_or_lock1right),rest671) end | (707,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 64,(result,defaultPos,defaultPos),rest671) end | (708,(_,(_,REEL1left,REEL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 392,(result,REEL1left,REEL1right),rest671) end | (709,(_,(_,UNIT1left,UNIT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 392,(result,UNIT1left,UNIT1right),rest671) end | (710,(_,(_,_,REWIND1right))::(_,(_,NO1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 320,(result,NO1left,REWIND1right),rest671) end | (711,(_,(_,LOCK1left,LOCK1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 320,(result,LOCK1left,LOCK1right),rest671) end | (712,(_,(_,_,end_computeright as end_compute1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.arithmetic_expression arithmetic_expression,_,_))::_::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::(_,(_, COMPUTEleft as COMPUTE1left,_))::rest671) => let val result= MlyValue.compute_statement(( Cobol.COMPUTE(identifier_roundeds, arithmetic_expression, size_error_clauses, COMPUTEleft,end_computeright) )) in (hojfelds_NT 72,(result,COMPUTE1left,end_compute1right),rest671) end | (713,(_,(_,_,end_delete1right))::_::_::_::(_,(_,DELETE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 120,(result,DELETE1left,end_delete1right),rest671) end | (714,(_,(_,_,not_invalid_key_error_clause1right))::(_,(_, invalid_key_error_clause1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 272,(result,invalid_key_error_clause1left, not_invalid_key_error_clause1right),rest671) end | (715,(_,(_,_,imperative_statement1right))::_::(_,(_,INVALID1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 270,(result,INVALID1left,imperative_statement1right), rest671) end | (716,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 270,(result,defaultPos,defaultPos),rest671) end | (717,(_,(_,_,imperative_statement1right))::_::_::(_,(_,NOT1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 324,(result,NOT1left,imperative_statement1right), rest671) end | (718,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 324,(result,defaultPos,defaultPos),rest671) end | (719,(_,(_,_,upon_mnemonic_name1right))::_::(_,(_,DISPLAY1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 126,(result,DISPLAY1left,upon_mnemonic_name1right), rest671) end | (720,(_,(_,_,mnemonic_name1right))::(_,(_,UPON1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 506,(result,UPON1left,mnemonic_name1right),rest671) end | (721,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 506,(result,defaultPos,defaultPos),rest671) end | (722,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_INTO(identifier_or_literal,identifier_roundeds, size_error_clauses,DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (723,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_INTO_GIVING (identifier_or_literal1,identifier_or_literal2, identifier_roundeds, size_error_clauses, DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (724,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_BY_GIVING (identifier_or_literal1,identifier_or_literal2, identifier_roundeds,size_error_clauses, DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (725,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier identifier,_,_))::_::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_INTO_GIVING_REMAINDER (identifier_or_literal1,identifier_or_literal2, identifier_roundeds,identifier,size_error_clauses, DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (726,(_,(_,_,end_divideright as end_divide1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier identifier,_,_))::_::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, DIVIDEleft as DIVIDE1left,_))::rest671) => let val result= MlyValue.divide_statement(( Cobol.DIVIDE_BY_GIVING_REMAINDER (identifier_or_literal1,identifier_or_literal2, identifier_roundeds,identifier,size_error_clauses, DIVIDEleft,end_divideright) )) in (hojfelds_NT 127,(result,DIVIDE1left,end_divide1right),rest671) end | (727,(_,(_,_,routine_name_opt1right))::_::(_,(_,ENTER1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 151,(result,ENTER1left,routine_name_opt1right),rest671 ) end | (728,(_,(_,_,identifiers1right))::_::(_,(_,EXHIBIT1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 161,(result,EXHIBIT1left,identifiers1right),rest671) end | (729,(_,(_,NAMED1left,NAMED1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 58,(result,NAMED1left,NAMED1right),rest671) end | (730,(_,(_,_,NAMED1right))::(_,(_,CHANGED1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 58,(result,CHANGED1left,NAMED1right),rest671) end | (731,(_,(_,EXIT1left,EXIT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 163,(result,EXIT1left,EXIT1right),rest671) end | (732,(_,(_,_,PROGRAM1right))::(_,(_,EXIT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 162,(result,EXIT1left,PROGRAM1right),rest671) end | (733,(_,(_,_,procedure_name_opt1right))::_::(_,(_,GO1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 218,(result,GO1left,procedure_name_opt1right),rest671) end | (734,(_,(_,_,identifier1right))::_::_::_::_::(_,(_,GO1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 218,(result,GO1left,identifier1right),rest671) end | (735,(_,(MlyValue.else_statements else_statements,_, else_statements1right))::(_,(MlyValue.then_statements then_statements, _,_))::(_,(_,_,thenright))::(_,(MlyValue.conditional_expression conditional_expression,_,_))::(_,(_,IFleft as IF1left,_))::rest671) => let val result=MlyValue.if_statement(( Cobol.IF(conditional_expression,then_statements,else_statements, IFleft,thenright) )) in (hojfelds_NT 240,(result,IF1left,else_statements1right),rest671) end | (736,(_,(MlyValue.imperative_statement imperative_statement, imperative_statement1left,imperative_statement1right))::rest671) => let val result=MlyValue.then_statements(( Cobol.THEN_STATEMENTS(imperative_statement))) in (hojfelds_NT 490,(result,imperative_statement1left, imperative_statement1right),rest671) end | (737,(_,(_,_,SENTENCE1right))::(_,(_,NEXT1left,_))::rest671) => let val result=MlyValue.then_statements((Cobol.NEXT_SENTENCE)) in (hojfelds_NT 490,(result,NEXT1left,SENTENCE1right),rest671) end | (738,(_,(_,_,end_if1right))::(_,(MlyValue.statements statements,_,_) )::(_,(_,ELSE1left,_))::rest671) => let val result= MlyValue.else_statements((Cobol.ELSE(statements))) in (hojfelds_NT 130,(result,ELSE1left,end_if1right),rest671) end | (739,(_,(_,_,SENTENCE1right))::_::(_,(_,ELSE1left,_))::rest671) => let val result=MlyValue.else_statements((Cobol.ELSE_NEXT_SENTENCE)) in (hojfelds_NT 130,(result,ELSE1left,SENTENCE1right),rest671) end | (740,(_,(_,end_if1left,end_if1right))::rest671) => let val result= MlyValue.else_statements((Cobol.NO_ELSE)) in (hojfelds_NT 130,(result,end_if1left,end_if1right),rest671) end | (741,(_,(_,_,identifier_tallying_specifications1right))::_::_::(_,(_ ,INSPECT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 262,(result,INSPECT1left, identifier_tallying_specifications1right),rest671) end | (742,(_,(_,_,inspect_replacing_specifications1right))::_::_::(_,(_, INSPECT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 262,(result,INSPECT1left, inspect_replacing_specifications1right),rest671) end | (743,(_,(_,_,inspect_replacing_specifications1right))::_::_::_::_::( _,(_,INSPECT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 262,(result,INSPECT1left, inspect_replacing_specifications1right),rest671) end | (744,(_,(_,_,tallying_specifications1right))::_::(_,(_, identifier1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 238,(result,identifier1left, tallying_specifications1right),rest671) end | (745,(_,(_,_,before_after_phrase1right))::(_,(_,CHARACTERS1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 482,(result,CHARACTERS1left,before_after_phrase1right) ,rest671) end | (746,(_,(_,_,all_or_leading_specifications1right))::(_,(_, all_or_leading1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 482,(result,all_or_leading1left, all_or_leading_specifications1right),rest671) end | (747,(_,(_,_,tallying_specifications1right))::_::(_,(_, CHARACTERS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 482,(result,CHARACTERS1left, tallying_specifications1right),rest671) end | (748,(_,(_,_,tallying_specifications1right))::_::(_,(_, all_or_leading1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 482,(result,all_or_leading1left, tallying_specifications1right),rest671) end | (749,(_,(_,_,identifier_tallying_specifications1right))::_::(_,(_, CHARACTERS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 482,(result,CHARACTERS1left, identifier_tallying_specifications1right),rest671) end | (750,(_,(_,_,identifier_tallying_specifications1right))::_::(_,(_, all_or_leading1left,_))::rest671) => let val result=MlyValue.ntVOID(() ) in (hojfelds_NT 482,(result,all_or_leading1left, identifier_tallying_specifications1right),rest671) end | (751,(_,(_,_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) )::_::(_,(_,before_after1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 168,(result,before_after1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) ,rest671) end | (752,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 168,(result,defaultPos,defaultPos),rest671) end | (753,(_,(_,BEFORE1left,BEFORE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 51,(result,BEFORE1left,BEFORE1right),rest671) end | (754,(_,(_,AFTER1left,AFTER1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 51,(result,AFTER1left,AFTER1right),rest671) end | (755,(_,(_,ALL1left,ALL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 19,(result,ALL1left,ALL1right),rest671) end | (756,(_,(_,LEADING1left,LEADING1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 19,(result,LEADING1left,LEADING1right),rest671) end | (757,(_,(_,_,all_or_leading_specification1right))::(_,(_, all_or_leading_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 22,(result,all_or_leading_specifications1left, all_or_leading_specification1right),rest671) end | (758,(_,(_,all_or_leading_specification1left, all_or_leading_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 22,(result,all_or_leading_specification1left, all_or_leading_specification1right),rest671) end | (759,(_,(_,_,before_after_phrase1right))::(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 21,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, before_after_phrase1right),rest671) end | (760,(_,(_,_,inspect_replacing_specification1right))::(_,(_, inspect_replacing_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 167,(result,inspect_replacing_specifications1left, inspect_replacing_specification1right),rest671) end | (761,(_,(_,inspect_replacing_specification1left, inspect_replacing_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 167,(result,inspect_replacing_specification1left, inspect_replacing_specification1right),rest671) end | (762,(_,(_,_,before_after_phrase1right))::_::_::(_,(_, CHARACTERS1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 169,(result,CHARACTERS1left,before_after_phrase1right) ,rest671) end | (763,(_,(_,_,all_leading_first_specifications1right))::(_,(_, all_or_leading_or_first1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 169,(result,all_or_leading_or_first1left, all_leading_first_specifications1right),rest671) end | (764,(_,(_,ALL1left,ALL1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 20,(result,ALL1left,ALL1right),rest671) end | (765,(_,(_,LEADING1left,LEADING1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 20,(result,LEADING1left,LEADING1right),rest671) end | (766,(_,(_,FIRST1left,FIRST1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 20,(result,FIRST1left,FIRST1right),rest671) end | (767,(_,(_,_,all_leading_first_specification1right))::(_,(_, all_leading_first_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 17,(result,all_leading_first_specifications1left, all_leading_first_specification1right),rest671) end | (768,(_,(_,all_leading_first_specification1left, all_leading_first_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 17,(result,all_leading_first_specification1left, all_leading_first_specification1right),rest671) end | (769,(_,(_,_,before_after_phrase1right))::_::_::(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 16,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, before_after_phrase1right),rest671) end | (770,(_,(_,_,output_procedure_or_giving_phrase1right))::_::_::_::_:: (_,(_,MERGE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 308,(result,MERGE1left, output_procedure_or_giving_phrase1right),rest671) end | (771,(_,(_,_,on_ascending_descending_key_phrase1right))::(_,(_, on_ascending_descending_key_phrases1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 337,(result,on_ascending_descending_key_phrases1left, on_ascending_descending_key_phrase1right),rest671) end | (772,(_,(_,on_ascending_descending_key_phrase1left, on_ascending_descending_key_phrase1right))::rest671) => let val result =MlyValue.ntVOID(()) in (hojfelds_NT 337,(result,on_ascending_descending_key_phrase1left, on_ascending_descending_key_phrase1right),rest671) end | (773,(_,(_,_,data_names1right))::_::_::(_,(_,on1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 336,(result,on1left,data_names1right),rest671) end | (774,(_,(_,_,alphabet_name1right))::_::_::(_,(_,collating1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 68,(result,collating1left,alphabet_name1right),rest671 ) end | (775,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 68,(result,defaultPos,defaultPos),rest671) end | (776,(_,(_,_,file_names1right))::_::(_,(_,USING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 515,(result,USING1left,file_names1right),rest671) end | (777,(_,(_,output_procedure_phrase1left, output_procedure_phrase1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 353,(result,output_procedure_phrase1left, output_procedure_phrase1right),rest671) end | (778,(_,(_,giving_phrase1left,giving_phrase1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 353,(result,giving_phrase1left,giving_phrase1right), rest671) end | (779,(_,(_,_,procedure_range1right))::_::_::(_,(_,OUTPUT1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 354,(result,OUTPUT1left,procedure_range1right),rest671 ) end | (780,(_,(_,procedure_name1left,procedure_name1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 170,(result,procedure_name1left,procedure_name1right), rest671) end | (781,(_,(_,_,procedure_name2right))::_::(_,(_,procedure_name1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 170,(result,procedure_name1left,procedure_name2right), rest671) end | (782,(_,(_,_,file_names1right))::(_,(_,GIVING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 217,(result,GIVING1left,file_names1right),rest671) end | (783,(_,(MlyValue.identifiers identifiers,_,identifiersright as identifiers1right))::_::(_,(MlyValue.identifier_or_literal identifier_or_literal,_,_))::(_,(_,MOVEleft as MOVE1left,_))::rest671) => let val result=MlyValue.move_statement(( Cobol.MOVE(identifier_or_literal,identifiers, MOVEleft,identifiersright) )) in (hojfelds_NT 314,(result,MOVE1left,identifiers1right),rest671) end | (784,(_,(MlyValue.identifier identifier2,_,identifier2right))::_::(_ ,(MlyValue.identifier identifier1,_,identifierright))::_::(_,(_, MOVEleft as MOVE1left,_))::rest671) => let val result= MlyValue.move_statement(( Cobol.MOVECORRESPONDING(identifier1,identifier2, MOVEleft,identifierright) )) in (hojfelds_NT 314,(result,MOVE1left,identifier2right),rest671) end | (785,(_,(_,_,end_multiplyright as end_multiply1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal,_,_))::(_,(_, MULTIPLYleft as MULTIPLY1left,_))::rest671) => let val result= MlyValue.multiply_statement(( Cobol.MULTIPLY(identifier_or_literal,identifier_roundeds ,size_error_clauses,MULTIPLYleft,end_multiplyright) )) in (hojfelds_NT 317,(result,MULTIPLY1left,end_multiply1right),rest671) end | (786,(_,(_,_,end_multiplyright as end_multiply1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal2,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal1,_,_))::(_,(_, MULTIPLYleft as MULTIPLY1left,_))::rest671) => let val result= MlyValue.multiply_statement(( Cobol.MULTIPLY_GIVING(identifier_or_literal1,identifier_or_literal2 ,identifier_roundeds,size_error_clauses ,MULTIPLYleft,end_multiplyright) )) in (hojfelds_NT 317,(result,MULTIPLY1left,end_multiply1right),rest671) end | (787,(_,(_,_,io_phrases1right))::(_,(_,OPEN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 341,(result,OPEN1left,io_phrases1right),rest671) end | (788,(_,(_,_,io_phrase1right))::(_,(_,io_phrases1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 274,(result,io_phrases1left,io_phrase1right),rest671) end | (789,(_,(_,io_phrase1left,io_phrase1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 274,(result,io_phrase1left,io_phrase1right),rest671) end | (790,(_,(_,_,file_input_specifications1right))::(_,(_,INPUT1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 273,(result,INPUT1left,file_input_specifications1right ),rest671) end | (791,(_,(_,_,file_output_specifications1right))::(_,(_,OUTPUT1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 273,(result,OUTPUT1left, file_output_specifications1right),rest671) end | (792,(_,(_,_,file_names1right))::(_,(_,IO1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 273,(result,IO1left,file_names1right),rest671) end | (793,(_,(_,_,file_names1right))::(_,(_,EXTEND1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 273,(result,EXTEND1left,file_names1right),rest671) end | (794,(_,(_,_,file_input_specification1right))::(_,(_, file_input_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 199,(result,file_input_specifications1left, file_input_specification1right),rest671) end | (795,(_,(_,file_input_specification1left, file_input_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 199,(result,file_input_specification1left, file_input_specification1right),rest671) end | (796,(_,(_,_,file_input_specification_attribute1right))::(_,(_, file_name1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 197,(result,file_name1left, file_input_specification_attribute1right),rest671) end | (797,(_,(_,REVERSED1left,REVERSED1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 198,(result,REVERSED1left,REVERSED1right),rest671) end | (798,(_,(_,_,REWIND1right))::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 198,(result,with1left,REWIND1right),rest671) end | (799,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 198,(result,defaultPos,defaultPos),rest671) end | (800,(_,(_,_,file_output_specification1right))::(_,(_, file_output_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 206,(result,file_output_specifications1left, file_output_specification1right),rest671) end | (801,(_,(_,file_output_specification1left, file_output_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 206,(result,file_output_specification1left, file_output_specification1right),rest671) end | (802,(_,(_,_,file_output_specification_attribute1right))::(_,(_, file_name1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 204,(result,file_name1left, file_output_specification_attribute1right),rest671) end | (803,(_,(_,_,REWIND1right))::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 205,(result,with1left,REWIND1right),rest671) end | (804,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 205,(result,defaultPos,defaultPos),rest671) end | (805,(_,(_,_,procedure_range1right))::(_,(_,PERFORM1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 360,(result,PERFORM1left,procedure_range1right), rest671) end | (806,(_,(_,_,times_phrase1right))::_::(_,(_,PERFORM1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 360,(result,PERFORM1left,times_phrase1right),rest671) end | (807,(_,(_,_,until_phrase1right))::_::(_,(_,PERFORM1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 360,(result,PERFORM1left,until_phrase1right),rest671) end | (808,(_,(_,_,test_varying_phrase1right))::_::(_,(_,PERFORM1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 360,(result,PERFORM1left,test_varying_phrase1right), rest671) end | (809,(_,(_,_,TIMES1right))::(_,(_,identifier_or_integer1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 498,(result,identifier_or_integer1left,TIMES1right), rest671) end | (810,(_,(_,_,conditional_expression1right))::(_,(_,UNTIL1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 484,(result,UNTIL1left,conditional_expression1right), rest671) end | (811,(_,(_,_,after_phrases1right))::_::_::_::_::_::_::_::(_,(_, VARYING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 485,(result,VARYING1left,after_phrases1right),rest671) end | (812,(_,(_,_,after_phrase1right))::(_,(_,after_phrases1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 14,(result,after_phrases1left,after_phrase1right), rest671) end | (813,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 14,(result,defaultPos,defaultPos),rest671) end | (814,(_,(_,_,conditional_expression1right))::_::_::_::_::_::_::(_,(_ ,AFTER1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 13,(result,AFTER1left,conditional_expression1right), rest671) end | (815,(_,(_,_,end_read1right))::_::_::_::_::_::_::(_,(_,READ1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 377,(result,READ1left,end_read1right),rest671) end | (816,(_,(_,_,identifier1right))::(_,(_,INTO1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 266,(result,INTO1left,identifier1right),rest671) end | (817,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 266,(result,defaultPos,defaultPos),rest671) end | (818,(_,(_,_,data_name1right))::_::(_,(_,KEY1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 283,(result,KEY1left,data_name1right),rest671) end | (819,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 283,(result,defaultPos,defaultPos),rest671) end | (820,(_,(_,end_error_clauses1left,end_error_clauses1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 141,(result,end_error_clauses1left, end_error_clauses1right),rest671) end | (821,(_,(_,invalid_key_error_clauses1left, invalid_key_error_clauses1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 141,(result,invalid_key_error_clauses1left, invalid_key_error_clauses1right),rest671) end | (822,(_,(_,_,not_end_error_clause1right))::(_,(_, end_error_clause1left,_))::rest671) => let val result=MlyValue.ntVOID( ()) in (hojfelds_NT 137,(result,end_error_clause1left, not_end_error_clause1right),rest671) end | (823,(_,(_,_,imperative_statement1right))::_::(_,(_,at1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 136,(result,at1left,imperative_statement1right), rest671) end | (824,(_,(_,_,imperative_statement1right))::_::_::(_,(_,NOT1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 321,(result,NOT1left,imperative_statement1right), rest671) end | (825,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 321,(result,defaultPos,defaultPos),rest671) end | (826,(_,(_,_,from_identifier1right))::_::(_,(_,RELEASE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 400,(result,RELEASE1left,from_identifier1right), rest671) end | (827,(_,(_,_,identifier1right))::(_,(_,FROM1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 216,(result,FROM1left,identifier1right),rest671) end | (828,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 216,(result,defaultPos,defaultPos),rest671) end | (829,(_,(_,_,end_return1right))::_::_::_::_::(_,(_,RETURN1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 411,(result,RETURN1left,end_return1right),rest671) end | (830,(_,(_,_,end_rewrite1right))::_::_::_::(_,(_,REWRITE1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 412,(result,REWRITE1left,end_rewrite1right),rest671) end | (831,(_,(_,_,end_search1right))::_::_::_::_::(_,(_,SEARCH1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 421,(result,SEARCH1left,end_search1right),rest671) end | (832,(_,(_,_,end_search1right))::_::_::_::_::_::_::(_,(_,SEARCH1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 421,(result,SEARCH1left,end_search1right),rest671) end | (833,(_,(_,_,identifier1right))::(_,(_,VARYING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 523,(result,VARYING1left,identifier1right),rest671) end | (834,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 523,(result,defaultPos,defaultPos),rest671) end | (835,(_,(_,end_error_clause1left,end_error_clause1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 173,(result,end_error_clause1left, end_error_clause1right),rest671) end | (836,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 173,(result,defaultPos,defaultPos),rest671) end | (837,(_,(_,_,search_when_phrase1right))::(_,(_, search_when_phrases1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 172,(result,search_when_phrases1left, search_when_phrase1right),rest671) end | (838,(_,(_,search_when_phrase1left,search_when_phrase1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 172,(result,search_when_phrase1left, search_when_phrase1right),rest671) end | (839,(_,(_,_,then_statement1right))::_::(_,(_,WHEN1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 174,(result,WHEN1left,then_statement1right),rest671) end | (840,(_,(_,_,identifier_or_integer1right))::_::_::(_,(_,SET1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 435,(result,SET1left,identifier_or_integer1right), rest671) end | (841,(_,(_,_,identifier_or_integer1right))::_::_::(_,(_,SET1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 435,(result,SET1left,identifier_or_integer1right), rest671) end | (842,(_,(_,_,mnemonic_switches1right))::(_,(_,SET1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 435,(result,SET1left,mnemonic_switches1right),rest671) end | (843,(_,(_,_,TRUE1right))::_::_::(_,(_,SET1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 435,(result,SET1left,TRUE1right),rest671) end | (844,(_,(_,_,BY1right))::(_,(_,UP1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 505,(result,UP1left,BY1right),rest671) end | (845,(_,(_,_,BY1right))::(_,(_,DOWN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 505,(result,DOWN1left,BY1right),rest671) end | (846,(_,(_,_,mnemonic_switch1right))::(_,(_,mnemonic_switches1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 312,(result,mnemonic_switches1left, mnemonic_switch1right),rest671) end | (847,(_,(_,mnemonic_switch1left,mnemonic_switch1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 312,(result,mnemonic_switch1left,mnemonic_switch1right ),rest671) end | (848,(_,(_,_,on_off1right))::_::(_,(_,identifiers1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 311,(result,identifiers1left,on_off1right),rest671) end | (849,(_,(_,ON1left,ON1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 338,(result,ON1left,ON1right),rest671) end | (850,(_,(_,OFF1left,OFF1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 338,(result,OFF1left,OFF1right),rest671) end | (851,(_,(_,_,output_procedure_or_giving_phrase1right))::_::_::_::_:: (_,(_,SORT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 448,(result,SORT1left, output_procedure_or_giving_phrase1right),rest671) end | (852,(_,(_,input_procedure_phrase1left,input_procedure_phrase1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 176,(result,input_procedure_phrase1left, input_procedure_phrase1right),rest671) end | (853,(_,(_,sort_using_phrase1left,sort_using_phrase1right))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 176,(result,sort_using_phrase1left, sort_using_phrase1right),rest671) end | (854,(_,(_,_,procedure_range1right))::_::_::(_,(_,INPUT1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 261,(result,INPUT1left,procedure_range1right),rest671) end | (855,(_,(_,_,file_names1right))::(_,(_,USING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 175,(result,USING1left,file_names1right),rest671) end | (856,(_,(_,_,end_start1right))::_::_::_::(_,(_,START1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 457,(result,START1left,end_start1right),rest671) end | (857,(_,(_,_,qdata_names1right))::_::_::(_,(_,KEY1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 284,(result,KEY1left,qdata_names1right),rest671) end | (858,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 284,(result,defaultPos,defaultPos),rest671) end | (859,(_,(_,_,RUN1right))::(_,(_,STOP1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 466,(result,STOP1left,RUN1right),rest671) end | (860,(_,(_,_,literal1right))::(_,(_,STOP1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 466,(result,STOP1left,literal1right),rest671) end | (861,(_,(_,_,end_string1right))::_::_::_::_::_::(_,(_,STRING1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 469,(result,STRING1left,end_string1right),rest671) end | (862,(_,(_,_,string_specification1right))::(_,(_, string_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 468,(result,string_specifications1left, string_specification1right),rest671) end | (863,(_,(_,string_specification1left,string_specification1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 468,(result,string_specification1left, string_specification1right),rest671) end | (864,(_,(_,_,identifier_literal_size1right))::_::_::(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constants1left, _))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 467,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constants1left, identifier_literal_size1right),rest671) end | (865,(_,(_, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 231,(result, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1left, identifier_or_nonnumeric_literal_or_not_all_figurative_constant1right) ,rest671) end | (866,(_,(_,SIZE1left,SIZE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 231,(result,SIZE1left,SIZE1right),rest671) end | (867,(_,(_,_,identifier1right))::_::(_,(_,with1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 364,(result,with1left,identifier1right),rest671) end | (868,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 364,(result,defaultPos,defaultPos),rest671) end | (869,(_,(_,_,imperative_statement1right))::_::(_,(_,on1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 355,(result,on1left,imperative_statement1right), rest671) end | (870,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 355,(result,defaultPos,defaultPos),rest671) end | (871,(_,(_,_,end_subtractright as end_subtract1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literals identifier_or_literals,_,_))::(_,(_, SUBTRACTleft as SUBTRACT1left,_))::rest671) => let val result= MlyValue.subtract_statement(( Cobol.ADD_OR_SUBTRACT (Cobol.SUBTRACT,identifier_or_literals,identifier_roundeds, size_error_clauses, SUBTRACTleft,end_subtractright) )) in (hojfelds_NT 473,(result,SUBTRACT1left,end_subtract1right),rest671) end | (872,(_,(_,_,end_subtractright as end_subtract1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.identifier_roundeds identifier_roundeds,_,_))::_::(_,( MlyValue.identifier_or_literal identifier_or_literal,_,_))::_::(_,( MlyValue.identifier_or_literals identifier_or_literals,_,_))::(_,(_, SUBTRACTleft as SUBTRACT1left,_))::rest671) => let val result= MlyValue.subtract_statement(( Cobol.ADD_OR_SUBTRACT_GIVING (Cobol.SUBTRACT,identifier_or_literals,identifier_or_literal, identifier_roundeds, size_error_clauses,SUBTRACTleft,end_subtractright) )) in (hojfelds_NT 473,(result,SUBTRACT1left,end_subtract1right),rest671) end | (873,(_,(_,_,end_subtractright as end_subtract1right))::(_,( MlyValue.size_error_clauses size_error_clauses,_,_))::(_,( MlyValue.rounded rounded,_,_))::(_,(MlyValue.identifier identifier2,_, _))::_::(_,(MlyValue.identifier identifier1,_,_))::_::(_,(_, SUBTRACTleft as SUBTRACT1left,_))::rest671) => let val result= MlyValue.subtract_statement(( Cobol.ADD_OR_SUBTRACT_CORRESPONDING (Cobol.SUBTRACT,identifier1,identifier2,rounded, size_error_clauses,SUBTRACTleft,end_subtractright) )) in (hojfelds_NT 473,(result,SUBTRACT1left,end_subtract1right),rest671) end | (874,(_,(_,_,TRACE1right))::(_,(_,READY1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 503,(result,READY1left,TRACE1right),rest671) end | (875,(_,(_,_,TRACE1right))::(_,(_,RESET1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 503,(result,RESET1left,TRACE1right),rest671) end | (876,(_,(_,_,end_unstring1right))::_::_::_::_::_::_::(_,(_, UNSTRING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 504,(result,UNSTRING1left,end_unstring1right),rest671) end | (877,(_,(_,_,delimited_by_specifications1right))::_::(_,(_, DELIMITED1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 124,(result,DELIMITED1left, delimited_by_specifications1right),rest671) end | (878,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 124,(result,defaultPos,defaultPos),rest671) end | (879,(_,(_,_,delimited_by_specifications2right))::_::(_,(_, delimited_by_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 177,(result,delimited_by_specifications1left, delimited_by_specifications2right),rest671) end | (880,(_,(_,_,identifier_or_literal1right))::(_,(_,all1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 177,(result,all1left,identifier_or_literal1right), rest671) end | (881,(_,(_,_,into_specifications1right))::(_,(_,INTO1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 267,(result,INTO1left,into_specifications1right), rest671) end | (882,(_,(_,_,into_specification1right))::(_,(_, into_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 269,(result,into_specifications1left, into_specification1right),rest671) end | (883,(_,(_,into_specification1left,into_specification1right)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 269,(result,into_specification1left, into_specification1right),rest671) end | (884,(_,(_,_,count_specification1right))::_::(_,(_,identifier1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 268,(result,identifier1left,count_specification1right) ,rest671) end | (885,(_,(_,_,identifier1right))::_::(_,(_,DELIMITER1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 125,(result,DELIMITER1left,identifier1right),rest671) end | (886,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 125,(result,defaultPos,defaultPos),rest671) end | (887,(_,(_,_,identifier1right))::_::(_,(_,COUNT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 83,(result,COUNT1left,identifier1right),rest671) end | (888,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 83,(result,defaultPos,defaultPos),rest671) end | (889,(_,(_,_,identifier1right))::_::(_,(_,TALLYING1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 479,(result,TALLYING1left,identifier1right),rest671) end | (890,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 479,(result,defaultPos,defaultPos),rest671) end | (891,(_,(_,_,io_specification1right))::_::_::_::_::_::(_,(_,USE1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 511,(result,USE1left,io_specification1right),rest671) end | (892,(_,(_,_,procedure_specification1right))::_::_::_::(_,(_, USE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 511,(result,USE1left,procedure_specification1right), rest671) end | (893,(_,(_,_,PROCEDURES1right))::(_,(_,ALL1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 171,(result,ALL1left,PROCEDURES1right),rest671) end | (894,(_,(_,_,procedure_names1right))::_::(_,(_,ALL1left,_))::rest671 ) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 171,(result,ALL1left,procedure_names1right),rest671) end | (895,(_,(_,procedure_names1left,procedure_names1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 171,(result,procedure_names1left,procedure_names1right ),rest671) end | (896,(_,(_,EXCEPTION1left,EXCEPTION1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 160,(result,EXCEPTION1left,EXCEPTION1right),rest671) end | (897,(_,(_,ERROR1left,ERROR1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 160,(result,ERROR1left,ERROR1right),rest671) end | (898,(_,(_,file_names1left,file_names1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,file_names1left,file_names1right),rest671) end | (899,(_,(_,INPUT1left,INPUT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,INPUT1left,INPUT1right),rest671) end | (900,(_,(_,OUTPUT1left,OUTPUT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,OUTPUT1left,OUTPUT1right),rest671) end | (901,(_,(_,IO1left,IO1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,IO1left,IO1right),rest671) end | (902,(_,(_,EXTEND1left,EXTEND1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 275,(result,EXTEND1left,EXTEND1right),rest671) end | (903,(_,(_,_,end_write1right))::_::_::_::_::_::_::_::_::(_,(_, WRITE1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 530,(result,WRITE1left,end_write1right),rest671) end | (904,(_,(_,_,end_write1right))::_::_::_::_::_::(_,(_,WRITE1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 530,(result,WRITE1left,end_write1right),rest671) end | (905,(_,(_,_,identifier_or_literal1right))::_::(_,(_,FORMAT1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 531,(result,FORMAT1left,identifier_or_literal1right), rest671) end | (906,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 531,(result,defaultPos,defaultPos),rest671) end | (907,(_,(_,_,identifier_or_literal1right))::_::(_,(_,TERMINAL1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 532,(result,TERMINAL1left,identifier_or_literal1right) ,rest671) end | (908,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 532,(result,defaultPos,defaultPos),rest671) end | (909,(_,(_,_,identifier_or_literal1right))::_::(_,(_,STARTING1left,_ ))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 533,(result,STARTING1left,identifier_or_literal1right) ,rest671) end | (910,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 533,(result,defaultPos,defaultPos),rest671) end | (911,(_,(_,AT1left,AT1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 536,(result,AT1left,AT1right),rest671) end | (912,(_,(_,LINE1left,LINE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 536,(result,LINE1left,LINE1right),rest671) end | (913,(_,(_,_,LINE1right))::(_,(_,AT1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 536,(result,AT1left,LINE1right),rest671) end | (914,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 536,(result,defaultPos,defaultPos),rest671) end | (915,(_,(_,_,lines_pages_specification1right))::(_,(_,advancing1left ,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 12,(result,advancing1left, lines_pages_specification1right),rest671) end | (916,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 12,(result,defaultPos,defaultPos),rest671) end | (917,(_,(_,_,line_or_lines2right))::_::_::_::_::_::_::(_,(_, ROLLING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 534,(result,ROLLING1left,line_or_lines2right),rest671) end | (918,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 534,(result,defaultPos,defaultPos),rest671) end | (919,(_,(_,_,rolling_phrase1right))::_::(_,(_,before_after1left,_)) ::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 540,(result,before_after1left,rolling_phrase1right), rest671) end | (920,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 540,(result,defaultPos,defaultPos),rest671) end | (921,(_,(_,_,identifier1right))::_::(_,(_,indicator1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 535,(result,indicator1left,identifier1right),rest671) end | (922,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 535,(result,defaultPos,defaultPos),rest671) end | (923,(_,(_,IS1left,IS1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 538,(result,IS1left,IS1right),rest671) end | (924,(_,(_,ARE1left,ARE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 538,(result,ARE1left,ARE1right),rest671) end | (925,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 538,(result,defaultPos,defaultPos),rest671) end | (926,(_,(_,through1left,through1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 537,(result,through1left,through1right),rest671) end | (927,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 537,(result,defaultPos,defaultPos),rest671) end | (928,(_,(_,_,line_or_lines1right))::(_,(_,identifier1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 296,(result,identifier1left,line_or_lines1right), rest671) end | (929,(_,(_,_,line_or_lines1right))::(_,(_,INTEGER1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 296,(result,INTEGER1left,line_or_lines1right),rest671) end | (930,(_,(_,PAGE1left,PAGE1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 296,(result,PAGE1left,PAGE1right),rest671) end | (931,(_,(_,_,imperative_statement1right))::_::(_,(_,AT1left,_)):: rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 156,(result,AT1left,imperative_statement1right), rest671) end | (932,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 156,(result,defaultPos,defaultPos),rest671) end | (933,(_,(_,ENDOFPAGE1left,ENDOFPAGE1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 140,(result,ENDOFPAGE1left,ENDOFPAGE1right),rest671) end | (934,(_,(_,EOP1left,EOP1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 140,(result,EOP1left,EOP1right),rest671) end | (935,(_,(_,_,copy_replacing_phrase1right))::_::_::(_,(_,COPY1left,_) )::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 81,(result,COPY1left,copy_replacing_phrase1right), rest671) end | (936,(_,(_,_,library_name1right))::(_,(_,OF1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 292,(result,OF1left,library_name1right),rest671) end | (937,(_,(_,_,library_name1right))::(_,(_,IN1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 292,(result,IN1left,library_name1right),rest671) end | (938,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 292,(result,defaultPos,defaultPos),rest671) end | (939,(_,(_,_,copy_replacing_specifications1right))::(_,(_, REPLACING1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 178,(result,REPLACING1left, copy_replacing_specifications1right),rest671) end | (940,rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 178,(result,defaultPos,defaultPos),rest671) end | (941,(_,(_,_,copy_replacing_specification1right))::(_,(_, copy_replacing_specifications1left,_))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 179,(result,copy_replacing_specifications1left, copy_replacing_specification1right),rest671) end | (942,(_,(_,copy_replacing_specification1left, copy_replacing_specification1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 179,(result,copy_replacing_specification1left, copy_replacing_specification1right),rest671) end | (943,(_,(_,_,operand2right))::_::(_,(_,operand1left,_))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 180,(result,operand1left,operand2right),rest671) end | (944,(_,(_,identifier1left,identifier1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 342,(result,identifier1left,identifier1right),rest671) end | (945,(_,(_,literal1left,literal1right))::rest671) => let val result= MlyValue.ntVOID(()) in (hojfelds_NT 342,(result,literal1left,literal1right),rest671) end | (946,(_,(_,PSEUDOTEXT1left,PSEUDOTEXT1right))::rest671) => let val result=MlyValue.ntVOID(()) in (hojfelds_NT 342,(result,PSEUDOTEXT1left,PSEUDOTEXT1right),rest671) end | _ => raise Hojfeld "_" (*(mlyAction i392)*) val void = MlyValue.VOID val extract = fn a => (fn MlyValue.test_cobol x => x | _ => let exception ParseInternal in raise ParseInternal end) a mlton-20100608/regression/command-line.ok0000644000076600000240000000001711404435617016640 0ustar mtfstaff./command-line mlton-20100608/regression/command-line.sml0000644000076600000240000000033011404435620017012 0ustar mtfstaff(* print out the command name and all of the command line arguments on separate lines *) val _ = (print(CommandLine.name()) ; print "\n" ; app (fn s => (print s ; print "\n")) (CommandLine.arguments())) mlton-20100608/regression/comment-end.sml0000644000076600000240000000005511404435617016667 0ustar mtfstaffval ** = 13 val x = ( **) val _ = 1 + ** + x mlton-20100608/regression/constraint.ok0000644000076600000240000000001311404435620016447 0ustar mtfstaffA(hello,5) mlton-20100608/regression/constraint.sml0000644000076600000240000000066011404435620016641 0ustar mtfstaffsignature S = sig type ('a, 'b) t val A : 'a * int -> ('a, int) t val pr : ('a -> string) -> ('b -> string) -> ('a, 'b) t -> string end structure S = struct datatype ('a, 'b) t = A of 'a * 'b fun pr pr_a pr_b (A(a,b)) = "A(" ^ pr_a a ^ "," ^ pr_b b ^ ")" end structure S' = S : S val s = S'.pr (fn s => s) (Int.toString) (S'.A("hello",5)) val _ = print (s ^ "\n") mlton-20100608/regression/conv.ok0000644000076600000240000000000711404435620015233 0ustar mtfstaffAll ok mlton-20100608/regression/conv.sml0000644000076600000240000000246611404435617015436 0ustar mtfstaffval big: IntInf.int = 0x80000000 fun try (barg: IntInf.int): unit = let val small = SOME (IntInf.toInt barg) handle Overflow => NONE val bstr = IntInf.toString barg fun fail msg = print ("Fail " ^ msg ^ ": " ^ bstr ^ "\n") val isSmall = ~ big <= barg andalso barg < big in case small of NONE => if isSmall then fail "1" else () | SOME sarg => if isSmall then let val sstr = Int.toString sarg in if bstr = sstr andalso barg = IntInf.fromInt sarg then () else fail "2" end else fail "3" end fun spin (low: IntInf.int, limit: IntInf.int): unit = let fun loop (arg: IntInf.int): unit = if arg = limit then () else ( try arg; try (~ arg); loop (arg + 1) ) in loop low end val _ = spin (0, 1000) val _ = spin (big - 1000, big + 1000) val _ = print "All ok\n" mlton-20100608/regression/conv2.ok0000644000076600000240000000000711404435617015323 0ustar mtfstaffAll ok mlton-20100608/regression/conv2.sml0000644000076600000240000014274011404435617015520 0ustar mtfstaffval arg: { v: IntInf.int, b: string, oc: string, d: string, x: string} list = [ {v = 0, b = "0", oc = "0", d = "0", x = "0"}, {v = ~0, b = "~0", oc = "~0", d = "~0", x = "~0"}, {v = 1, b = "1", oc = "1", d = "1", x = "1"}, {v = ~1, b = "~1", oc = "~1", d = "~1", x = "~1"}, {v = 2, b = "10", oc = "2", d = "2", x = "2"}, {v = ~2, b = "~10", oc = "~2", d = "~2", x = "~2"}, {v = 3, b = "11", oc = "3", d = "3", x = "3"}, {v = ~3, b = "~11", oc = "~3", d = "~3", x = "~3"}, {v = 4, b = "100", oc = "4", d = "4", x = "4"}, {v = ~4, b = "~100", oc = "~4", d = "~4", x = "~4"}, {v = 5, b = "101", oc = "5", d = "5", x = "5"}, {v = ~5, b = "~101", oc = "~5", d = "~5", x = "~5"}, {v = 6, b = "110", oc = "6", d = "6", x = "6"}, {v = ~6, b = "~110", oc = "~6", d = "~6", x = "~6"}, {v = 7, b = "111", oc = "7", d = "7", x = "7"}, {v = ~7, b = "~111", oc = "~7", d = "~7", x = "~7"}, {v = 8, b = "1000", oc = "10", d = "8", x = "8"}, {v = ~8, b = "~1000", oc = "~10", d = "~8", x = "~8"}, {v = 9, b = "1001", oc = "11", d = "9", x = "9"}, {v = ~9, b = "~1001", oc = "~11", d = "~9", x = "~9"}, {v = 10, b = "1010", oc = "12", d = "10", x = "A"}, {v = ~10, b = "~1010", oc = "~12", d = "~10", x = "~A"}, {v = 11, b = "1011", oc = "13", d = "11", x = "B"}, {v = ~11, b = "~1011", oc = "~13", d = "~11", x = "~B"}, {v = 12, b = "1100", oc = "14", d = "12", x = "C"}, {v = ~12, b = "~1100", oc = "~14", d = "~12", x = "~C"}, {v = 13, b = "1101", oc = "15", d = "13", x = "D"}, {v = ~13, b = "~1101", oc = "~15", d = "~13", x = "~D"}, {v = 14, b = "1110", oc = "16", d = "14", x = "E"}, {v = ~14, b = "~1110", oc = "~16", d = "~14", x = "~E"}, {v = 15, b = "1111", oc = "17", d = "15", x = "F"}, {v = ~15, b = "~1111", oc = "~17", d = "~15", x = "~F"}, {v = 16, b = "10000", oc = "20", d = "16", x = "10"}, {v = ~16, b = "~10000", oc = "~20", d = "~16", x = "~10"}, {v = 17, b = "10001", oc = "21", d = "17", x = "11"}, {v = ~17, b = "~10001", oc = "~21", d = "~17", x = "~11"}, {v = 18, b = "10010", oc = "22", d = "18", x = "12"}, {v = ~18, b = "~10010", oc = "~22", d = "~18", x = "~12"}, {v = 19, b = "10011", oc = "23", d = "19", x = "13"}, {v = ~19, b = "~10011", oc = "~23", d = "~19", x = "~13"}, {v = 20, b = "10100", oc = "24", d = "20", x = "14"}, {v = ~20, b = "~10100", oc = "~24", d = "~20", x = "~14"}, {v = 21, b = "10101", oc = "25", d = "21", x = "15"}, {v = ~21, b = "~10101", oc = "~25", d = "~21", x = "~15"}, {v = 22, b = "10110", oc = "26", d = "22", x = "16"}, {v = ~22, b = "~10110", oc = "~26", d = "~22", x = "~16"}, {v = 23, b = "10111", oc = "27", d = "23", x = "17"}, {v = ~23, b = "~10111", oc = "~27", d = "~23", x = "~17"}, {v = 24, b = "11000", oc = "30", d = "24", x = "18"}, {v = ~24, b = "~11000", oc = "~30", d = "~24", x = "~18"}, {v = 25, b = "11001", oc = "31", d = "25", x = "19"}, {v = ~25, b = "~11001", oc = "~31", d = "~25", x = "~19"}, {v = 26, b = "11010", oc = "32", d = "26", x = "1A"}, {v = ~26, b = "~11010", oc = "~32", d = "~26", x = "~1A"}, {v = 27, b = "11011", oc = "33", d = "27", x = "1B"}, {v = ~27, b = "~11011", oc = "~33", d = "~27", x = "~1B"}, {v = 28, b = "11100", oc = "34", d = "28", x = "1C"}, {v = ~28, b = "~11100", oc = "~34", d = "~28", x = "~1C"}, {v = 29, b = "11101", oc = "35", d = "29", x = "1D"}, {v = ~29, b = "~11101", oc = "~35", d = "~29", x = "~1D"}, {v = 30, b = "11110", oc = "36", d = "30", x = "1E"}, {v = ~30, b = "~11110", oc = "~36", d = "~30", x = "~1E"}, {v = 31, b = "11111", oc = "37", d = "31", x = "1F"}, {v = ~31, b = "~11111", oc = "~37", d = "~31", x = "~1F"}, {v = 32, b = "100000", oc = "40", d = "32", x = "20"}, {v = ~32, b = "~100000", oc = "~40", d = "~32", x = "~20"}, {v = 33, b = "100001", oc = "41", d = "33", x = "21"}, {v = ~33, b = "~100001", oc = "~41", d = "~33", x = "~21"}, {v = 34, b = "100010", oc = "42", d = "34", x = "22"}, {v = ~34, b = "~100010", oc = "~42", d = "~34", x = "~22"}, {v = 35, b = "100011", oc = "43", d = "35", x = "23"}, {v = ~35, b = "~100011", oc = "~43", d = "~35", x = "~23"}, {v = 36, b = "100100", oc = "44", d = "36", x = "24"}, {v = ~36, b = "~100100", oc = "~44", d = "~36", x = "~24"}, {v = 37, b = "100101", oc = "45", d = "37", x = "25"}, {v = ~37, b = "~100101", oc = "~45", d = "~37", x = "~25"}, {v = 38, b = "100110", oc = "46", d = "38", x = "26"}, {v = ~38, b = "~100110", oc = "~46", d = "~38", x = "~26"}, {v = 39, b = "100111", oc = "47", d = "39", x = "27"}, {v = ~39, b = "~100111", oc = "~47", d = "~39", x = "~27"}, {v = 40, b = "101000", oc = "50", d = "40", x = "28"}, {v = ~40, b = "~101000", oc = "~50", d = "~40", x = "~28"}, {v = 41, b = "101001", oc = "51", d = "41", x = "29"}, {v = ~41, b = "~101001", oc = "~51", d = "~41", x = "~29"}, {v = 42, b = "101010", oc = "52", d = "42", x = "2A"}, {v = ~42, b = "~101010", oc = "~52", d = "~42", x = "~2A"}, {v = 43, b = "101011", oc = "53", d = "43", x = "2B"}, {v = ~43, b = "~101011", oc = "~53", d = "~43", x = "~2B"}, {v = 44, b = "101100", oc = "54", d = "44", x = "2C"}, {v = ~44, b = "~101100", oc = "~54", d = "~44", x = "~2C"}, {v = 45, b = "101101", oc = "55", d = "45", x = "2D"}, {v = ~45, b = "~101101", oc = "~55", d = "~45", x = "~2D"}, {v = 46, b = "101110", oc = "56", d = "46", x = "2E"}, {v = ~46, b = "~101110", oc = "~56", d = "~46", x = "~2E"}, {v = 47, b = "101111", oc = "57", d = "47", x = "2F"}, {v = ~47, b = "~101111", oc = "~57", d = "~47", x = "~2F"}, {v = 48, b = "110000", oc = "60", d = "48", x = "30"}, {v = ~48, b = "~110000", oc = "~60", d = "~48", x = "~30"}, {v = 49, b = "110001", oc = "61", d = "49", x = "31"}, {v = ~49, b = "~110001", oc = "~61", d = "~49", x = "~31"}, {v = 50, b = "110010", oc = "62", d = "50", x = "32"}, {v = ~50, b = "~110010", oc = "~62", d = "~50", x = "~32"}, {v = 51, b = "110011", oc = "63", d = "51", x = "33"}, {v = ~51, b = "~110011", oc = "~63", d = "~51", x = "~33"}, {v = 52, b = "110100", oc = "64", d = "52", x = "34"}, {v = ~52, b = "~110100", oc = "~64", d = "~52", x = "~34"}, {v = 53, b = "110101", oc = "65", d = "53", x = "35"}, {v = ~53, b = "~110101", oc = "~65", d = "~53", x = "~35"}, {v = 54, b = "110110", oc = "66", d = "54", x = "36"}, {v = ~54, b = "~110110", oc = "~66", d = "~54", x = "~36"}, {v = 55, b = "110111", oc = "67", d = "55", x = "37"}, {v = ~55, b = "~110111", oc = "~67", d = "~55", x = "~37"}, {v = 56, b = "111000", oc = "70", d = "56", x = "38"}, {v = ~56, b = "~111000", oc = "~70", d = "~56", x = "~38"}, {v = 57, b = "111001", oc = "71", d = "57", x = "39"}, {v = ~57, b = "~111001", oc = "~71", d = "~57", x = "~39"}, {v = 58, b = "111010", oc = "72", d = "58", x = "3A"}, {v = ~58, b = "~111010", oc = "~72", d = "~58", x = "~3A"}, {v = 59, b = "111011", oc = "73", d = "59", x = "3B"}, {v = ~59, b = "~111011", oc = "~73", d = "~59", x = "~3B"}, {v = 60, b = "111100", oc = "74", d = "60", x = "3C"}, {v = ~60, b = "~111100", oc = "~74", d = "~60", x = "~3C"}, {v = 61, b = "111101", oc = "75", d = "61", x = "3D"}, {v = ~61, b = "~111101", oc = "~75", d = "~61", x = "~3D"}, {v = 62, b = "111110", oc = "76", d = "62", x = "3E"}, {v = ~62, b = "~111110", oc = "~76", d = "~62", x = "~3E"}, {v = 63, b = "111111", oc = "77", d = "63", x = "3F"}, {v = ~63, b = "~111111", oc = "~77", d = "~63", x = "~3F"}, {v = 64, b = "1000000", oc = "100", d = "64", x = "40"}, {v = ~64, b = "~1000000", oc = "~100", d = "~64", x = "~40"}, {v = 65, b = "1000001", oc = "101", d = "65", x = "41"}, {v = ~65, b = "~1000001", oc = "~101", d = "~65", x = "~41"}, {v = 66, b = "1000010", oc = "102", d = "66", x = "42"}, {v = ~66, b = "~1000010", oc = "~102", d = "~66", x = "~42"}, {v = 67, b = "1000011", oc = "103", d = "67", x = "43"}, {v = ~67, b = "~1000011", oc = "~103", d = "~67", x = "~43"}, {v = 68, b = "1000100", oc = "104", d = "68", x = "44"}, {v = ~68, b = "~1000100", oc = "~104", d = "~68", x = "~44"}, {v = 69, b = "1000101", oc = "105", d = "69", x = "45"}, {v = ~69, b = "~1000101", oc = "~105", d = "~69", x = "~45"}, {v = 70, b = "1000110", oc = "106", d = "70", x = "46"}, {v = ~70, b = "~1000110", oc = "~106", d = "~70", x = "~46"}, {v = 71, b = "1000111", oc = "107", d = "71", x = "47"}, {v = ~71, b = "~1000111", oc = "~107", d = "~71", x = "~47"}, {v = 72, b = "1001000", oc = "110", d = "72", x = "48"}, {v = ~72, b = "~1001000", oc = "~110", d = "~72", x = "~48"}, {v = 73, b = "1001001", oc = "111", d = "73", x = "49"}, {v = ~73, b = "~1001001", oc = "~111", d = "~73", x = "~49"}, {v = 74, b = "1001010", oc = "112", d = "74", x = "4A"}, {v = ~74, b = "~1001010", oc = "~112", d = "~74", x = "~4A"}, {v = 75, b = "1001011", oc = "113", d = "75", x = "4B"}, {v = ~75, b = "~1001011", oc = "~113", d = "~75", x = "~4B"}, {v = 76, b = "1001100", oc = "114", d = "76", x = "4C"}, {v = ~76, b = "~1001100", oc = "~114", d = "~76", x = "~4C"}, {v = 77, b = "1001101", oc = "115", d = "77", x = "4D"}, {v = ~77, b = "~1001101", oc = "~115", d = "~77", x = "~4D"}, {v = 78, b = "1001110", oc = "116", d = "78", x = "4E"}, {v = ~78, b = "~1001110", oc = "~116", d = "~78", x = "~4E"}, {v = 79, b = "1001111", oc = "117", d = "79", x = "4F"}, {v = ~79, b = "~1001111", oc = "~117", d = "~79", x = "~4F"}, {v = 80, b = "1010000", oc = "120", d = "80", x = "50"}, {v = ~80, b = "~1010000", oc = "~120", d = "~80", x = "~50"}, {v = 81, b = "1010001", oc = "121", d = "81", x = "51"}, {v = ~81, b = "~1010001", oc = "~121", d = "~81", x = "~51"}, {v = 82, b = "1010010", oc = "122", d = "82", x = "52"}, {v = ~82, b = "~1010010", oc = "~122", d = "~82", x = "~52"}, {v = 83, b = "1010011", oc = "123", d = "83", x = "53"}, {v = ~83, b = "~1010011", oc = "~123", d = "~83", x = "~53"}, {v = 84, b = "1010100", oc = "124", d = "84", x = "54"}, {v = ~84, b = "~1010100", oc = "~124", d = "~84", x = "~54"}, {v = 85, b = "1010101", oc = "125", d = "85", x = "55"}, {v = ~85, b = "~1010101", oc = "~125", d = "~85", x = "~55"}, {v = 86, b = "1010110", oc = "126", d = "86", x = "56"}, {v = ~86, b = "~1010110", oc = "~126", d = "~86", x = "~56"}, {v = 87, b = "1010111", oc = "127", d = "87", x = "57"}, {v = ~87, b = "~1010111", oc = "~127", d = "~87", x = "~57"}, {v = 88, b = "1011000", oc = "130", d = "88", x = "58"}, {v = ~88, b = "~1011000", oc = "~130", d = "~88", x = "~58"}, {v = 89, b = "1011001", oc = "131", d = "89", x = "59"}, {v = ~89, b = "~1011001", oc = "~131", d = "~89", x = "~59"}, {v = 90, b = "1011010", oc = "132", d = "90", x = "5A"}, {v = ~90, b = "~1011010", oc = "~132", d = "~90", x = "~5A"}, {v = 91, b = "1011011", oc = "133", d = "91", x = "5B"}, {v = ~91, b = "~1011011", oc = "~133", d = "~91", x = "~5B"}, {v = 92, b = "1011100", oc = "134", d = "92", x = "5C"}, {v = ~92, b = "~1011100", oc = "~134", d = "~92", x = "~5C"}, {v = 93, b = "1011101", oc = "135", d = "93", x = "5D"}, {v = ~93, b = "~1011101", oc = "~135", d = "~93", x = "~5D"}, {v = 94, b = "1011110", oc = "136", d = "94", x = "5E"}, {v = ~94, b = "~1011110", oc = "~136", d = "~94", x = "~5E"}, {v = 95, b = "1011111", oc = "137", d = "95", x = "5F"}, {v = ~95, b = "~1011111", oc = "~137", d = "~95", x = "~5F"}, {v = 96, b = "1100000", oc = "140", d = "96", x = "60"}, {v = ~96, b = "~1100000", oc = "~140", d = "~96", x = "~60"}, {v = 97, b = "1100001", oc = "141", d = "97", x = "61"}, {v = ~97, b = "~1100001", oc = "~141", d = "~97", x = "~61"}, {v = 98, b = "1100010", oc = "142", d = "98", x = "62"}, {v = ~98, b = "~1100010", oc = "~142", d = "~98", x = "~62"}, {v = 99, b = "1100011", oc = "143", d = "99", x = "63"}, {v = ~99, b = "~1100011", oc = "~143", d = "~99", x = "~63"}, {v = 128, b = "10000000", oc = "200", d = "128", x = "80"}, {v = ~128, b = "~10000000", oc = "~200", d = "~128", x = "~80"}, {v = 256, b = "100000000", oc = "400", d = "256", x = "100"}, {v = ~256, b = "~100000000", oc = "~400", d = "~256", x = "~100"}, {v = 512, b = "1000000000", oc = "1000", d = "512", x = "200"}, {v = ~512, b = "~1000000000", oc = "~1000", d = "~512", x = "~200"}, {v = 1024, b = "10000000000", oc = "2000", d = "1024", x = "400"}, {v = ~1024, b = "~10000000000", oc = "~2000", d = "~1024", x = "~400"}, {v = 2048, b = "100000000000", oc = "4000", d = "2048", x = "800"}, {v = ~2048, b = "~100000000000", oc = "~4000", d = "~2048", x = "~800"}, {v = 4096, b = "1000000000000", oc = "10000", d = "4096", x = "1000"}, {v = ~4096, b = "~1000000000000", oc = "~10000", d = "~4096", x = "~1000"}, {v = 8192, b = "10000000000000", oc = "20000", d = "8192", x = "2000"}, {v = ~8192, b = "~10000000000000", oc = "~20000", d = "~8192", x = "~2000"}, {v = 16384, b = "100000000000000", oc = "40000", d = "16384", x = "4000"}, {v = ~16384, b = "~100000000000000", oc = "~40000", d = "~16384", x = "~4000"}, {v = 32768, b = "1000000000000000", oc = "100000", d = "32768", x = "8000"}, {v = ~32768, b = "~1000000000000000", oc = "~100000", d = "~32768", x = "~8000"}, {v = 65536, b = "10000000000000000", oc = "200000", d = "65536", x = "10000"}, {v = ~65536, b = "~10000000000000000", oc = "~200000", d = "~65536", x = "~10000"}, {v = 131072, b = "100000000000000000", oc = "400000", d = "131072", x = "20000"}, {v = ~131072, b = "~100000000000000000", oc = "~400000", d = "~131072", x = "~20000"}, {v = 262144, b = "1000000000000000000", oc = "1000000", d = "262144", x = "40000"}, {v = ~262144, b = "~1000000000000000000", oc = "~1000000", d = "~262144", x = "~40000"}, {v = 524288, b = "10000000000000000000", oc = "2000000", d = "524288", x = "80000"}, {v = ~524288, b = "~10000000000000000000", oc = "~2000000", d = "~524288", x = "~80000"}, {v = 1048576, b = "100000000000000000000", oc = "4000000", d = "1048576", x = "100000"}, {v = ~1048576, b = "~100000000000000000000", oc = "~4000000", d = "~1048576", x = "~100000"}, {v = 2097152, b = "1000000000000000000000", oc = "10000000", d = "2097152", x = "200000"}, {v = ~2097152, b = "~1000000000000000000000", oc = "~10000000", d = "~2097152", x = "~200000"}, {v = 4194304, b = "10000000000000000000000", oc = "20000000", d = "4194304", x = "400000"}, {v = ~4194304, b = "~10000000000000000000000", oc = "~20000000", d = "~4194304", x = "~400000"}, {v = 8388608, b = "100000000000000000000000", oc = "40000000", d = "8388608", x = "800000"}, {v = ~8388608, b = "~100000000000000000000000", oc = "~40000000", d = "~8388608", x = "~800000"}, {v = 16777216, b = "1000000000000000000000000", oc = "100000000", d = "16777216", x = "1000000"}, {v = ~16777216, b = "~1000000000000000000000000", oc = "~100000000", d = "~16777216", x = "~1000000"}, {v = 33554432, b = "10000000000000000000000000", oc = "200000000", d = "33554432", x = "2000000"}, {v = ~33554432, b = "~10000000000000000000000000", oc = "~200000000", d = "~33554432", x = "~2000000"}, {v = 67108864, b = "100000000000000000000000000", oc = "400000000", d = "67108864", x = "4000000"}, {v = ~67108864, b = "~100000000000000000000000000", oc = "~400000000", d = "~67108864", x = "~4000000"}, {v = 100000000, b = "101111101011110000100000000", oc = "575360400", d = "100000000", x = "5F5E100"}, {v = ~100000000, b = "~101111101011110000100000000", oc = "~575360400", d = "~100000000", x = "~5F5E100"}, {v = 134217728, b = "1000000000000000000000000000", oc = "1000000000", d = "134217728", x = "8000000"}, {v = ~134217728, b = "~1000000000000000000000000000", oc = "~1000000000", d = "~134217728", x = "~8000000"}, {v = 268435456, b = "10000000000000000000000000000", oc = "2000000000", d = "268435456", x = "10000000"}, {v = ~268435456, b = "~10000000000000000000000000000", oc = "~2000000000", d = "~268435456", x = "~10000000"}, {v = 536870912, b = "100000000000000000000000000000", oc = "4000000000", d = "536870912", x = "20000000"}, {v = ~536870912, b = "~100000000000000000000000000000", oc = "~4000000000", d = "~536870912", x = "~20000000"}, {v = 1073741822, b = "111111111111111111111111111110", oc = "7777777776", d = "1073741822", x = "3FFFFFFE"}, {v = ~1073741822, b = "~111111111111111111111111111110", oc = "~7777777776", d = "~1073741822", x = "~3FFFFFFE"}, {v = 1073741823, b = "111111111111111111111111111111", oc = "7777777777", d = "1073741823", x = "3FFFFFFF"}, {v = ~1073741823, b = "~111111111111111111111111111111", oc = "~7777777777", d = "~1073741823", x = "~3FFFFFFF"}, {v = 1073741824, b = "1000000000000000000000000000000", oc = "10000000000", d = "1073741824", x = "40000000"}, {v = ~1073741824, b = "~1000000000000000000000000000000", oc = "~10000000000", d = "~1073741824", x = "~40000000"}, {v = 1073741825, b = "1000000000000000000000000000001", oc = "10000000001", d = "1073741825", x = "40000001"}, {v = ~1073741825, b = "~1000000000000000000000000000001", oc = "~10000000001", d = "~1073741825", x = "~40000001"}, {v = 1073741826, b = "1000000000000000000000000000010", oc = "10000000002", d = "1073741826", x = "40000002"}, {v = ~1073741826, b = "~1000000000000000000000000000010", oc = "~10000000002", d = "~1073741826", x = "~40000002"}, {v = 2147483648, b = "10000000000000000000000000000000", oc = "20000000000", d = "2147483648", x = "80000000"}, {v = ~2147483648, b = "~10000000000000000000000000000000", oc = "~20000000000", d = "~2147483648", x = "~80000000"}, {v = 4294967296, b = "100000000000000000000000000000000", oc = "40000000000", d = "4294967296", x = "100000000"}, {v = ~4294967296, b = "~100000000000000000000000000000000", oc = "~40000000000", d = "~4294967296", x = "~100000000"}, {v = 4304967296, b = "100000000100110001001011010000000", oc = "40046113200", d = "4304967296", x = "100989680"}, {v = ~4304967296, b = "~100000000100110001001011010000000", oc = "~40046113200", d = "~4304967296", x = "~100989680"}, {v = 8589934592, b = "1000000000000000000000000000000000", oc = "100000000000", d = "8589934592", x = "200000000"}, {v = ~8589934592, b = "~1000000000000000000000000000000000", oc = "~100000000000", d = "~8589934592", x = "~200000000"}, {v = 17179869184, b = "10000000000000000000000000000000000", oc = "200000000000", d = "17179869184", x = "400000000"}, {v = ~17179869184, b = "~10000000000000000000000000000000000", oc = "~200000000000", d = "~17179869184", x = "~400000000"}, {v = 34359738368, b = "100000000000000000000000000000000000", oc = "400000000000", d = "34359738368", x = "800000000"}, {v = ~34359738368, b = "~100000000000000000000000000000000000", oc = "~400000000000", d = "~34359738368", x = "~800000000"}, {v = 68719476736, b = "1000000000000000000000000000000000000", oc = "1000000000000", d = "68719476736", x = "1000000000"}, {v = ~68719476736, b = "~1000000000000000000000000000000000000", oc = "~1000000000000", d = "~68719476736", x = "~1000000000"}, {v = 137438953472, b = "10000000000000000000000000000000000000", oc = "2000000000000", d = "137438953472", x = "2000000000"}, {v = ~137438953472, b = "~10000000000000000000000000000000000000", oc = "~2000000000000", d = "~137438953472", x = "~2000000000"}, {v = 274877906944, b = "100000000000000000000000000000000000000", oc = "4000000000000", d = "274877906944", x = "4000000000"}, {v = ~274877906944, b = "~100000000000000000000000000000000000000", oc = "~4000000000000", d = "~274877906944", x = "~4000000000"}, {v = 549755813888, b = "1000000000000000000000000000000000000000", oc = "10000000000000", d = "549755813888", x = "8000000000"}, {v = ~549755813888, b = "~1000000000000000000000000000000000000000", oc = "~10000000000000", d = "~549755813888", x = "~8000000000"}, {v = 1099511627776, b = "10000000000000000000000000000000000000000", oc = "20000000000000", d = "1099511627776", x = "10000000000"}, {v = ~1099511627776, b = "~10000000000000000000000000000000000000000", oc = "~20000000000000", d = "~1099511627776", x = "~10000000000"}, {v = 2199023255552, b = "100000000000000000000000000000000000000000", oc = "40000000000000", d = "2199023255552", x = "20000000000"}, {v = ~2199023255552, b = "~100000000000000000000000000000000000000000", oc = "~40000000000000", d = "~2199023255552", x = "~20000000000"}, {v = 4398046511104, b = "1000000000000000000000000000000000000000000", oc = "100000000000000", d = "4398046511104", x = "40000000000"}, {v = ~4398046511104, b = "~1000000000000000000000000000000000000000000", oc = "~100000000000000", d = "~4398046511104", x = "~40000000000"}, {v = 8796093022208, b = "10000000000000000000000000000000000000000000", oc = "200000000000000", d = "8796093022208", x = "80000000000"}, {v = ~8796093022208, b = "~10000000000000000000000000000000000000000000", oc = "~200000000000000", d = "~8796093022208", x = "~80000000000"}, {v = 17592186044416, b = "100000000000000000000000000000000000000000000", oc = "400000000000000", d = "17592186044416", x = "100000000000"}, {v = ~17592186044416, b = "~100000000000000000000000000000000000000000000", oc = "~400000000000000", d = "~17592186044416", x = "~100000000000"}, {v = 35184372088832, b = "1000000000000000000000000000000000000000000000", oc = "1000000000000000", d = "35184372088832", x = "200000000000"}, {v = ~35184372088832, b = "~1000000000000000000000000000000000000000000000", oc = "~1000000000000000", d = "~35184372088832", x = "~200000000000"}, {v = 70368744177664, b = "10000000000000000000000000000000000000000000000", oc = "2000000000000000", d = "70368744177664", x = "400000000000"}, {v = ~70368744177664, b = "~10000000000000000000000000000000000000000000000", oc = "~2000000000000000", d = "~70368744177664", x = "~400000000000"}, {v = 140737488355328, b = "100000000000000000000000000000000000000000000000", oc = "4000000000000000", d = "140737488355328", x = "800000000000"}, {v = ~140737488355328, b = "~100000000000000000000000000000000000000000000000", oc = "~4000000000000000", d = "~140737488355328", x = "~800000000000"}, {v = 281474976710656, b = "1000000000000000000000000000000000000000000000000", oc = "10000000000000000", d = "281474976710656", x = "1000000000000"}, {v = ~281474976710656, b = "~1000000000000000000000000000000000000000000000000", oc = "~10000000000000000", d = "~281474976710656", x = "~1000000000000"}, {v = 562949953421312, b = "10000000000000000000000000000000000000000000000000", oc = "20000000000000000", d = "562949953421312", x = "2000000000000"}, {v = ~562949953421312, b = "~10000000000000000000000000000000000000000000000000", oc = "~20000000000000000", d = "~562949953421312", x = "~2000000000000"}, {v = 1125899906842624, b = "100000000000000000000000000000000000000000000000000", oc = "40000000000000000", d = "1125899906842624", x = "4000000000000"}, {v = ~1125899906842624, b = "~100000000000000000000000000000000000000000000000000", oc = "~40000000000000000", d = "~1125899906842624", x = "~4000000000000"}, {v = 2251799813685248, b = "1000000000000000000000000000000000000000000000000000", oc = "100000000000000000", d = "2251799813685248", x = "8000000000000"}, {v = ~2251799813685248, b = "~1000000000000000000000000000000000000000000000000000", oc = "~100000000000000000", d = "~2251799813685248", x = "~8000000000000"}, {v = 4503599627370496, b = "10000000000000000000000000000000000000000000000000000", oc = "200000000000000000", d = "4503599627370496", x = "10000000000000"}, {v = ~4503599627370496, b = "~10000000000000000000000000000000000000000000000000000", oc = "~200000000000000000", d = "~4503599627370496", x = "~10000000000000"}, {v = 9007199254740992, b = "100000000000000000000000000000000000000000000000000000", oc = "400000000000000000", d = "9007199254740992", x = "20000000000000"}, {v = ~9007199254740992, b = "~100000000000000000000000000000000000000000000000000000", oc = "~400000000000000000", d = "~9007199254740992", x = "~20000000000000"}, {v = 18014398509481984, b = "1000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000", d = "18014398509481984", x = "40000000000000"}, {v = ~18014398509481984, b = "~1000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000", d = "~18014398509481984", x = "~40000000000000"}, {v = 36028797018963968, b = "10000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000", d = "36028797018963968", x = "80000000000000"}, {v = ~36028797018963968, b = "~10000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000", d = "~36028797018963968", x = "~80000000000000"}, {v = 72057594037927936, b = "100000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000", d = "72057594037927936", x = "100000000000000"}, {v = ~72057594037927936, b = "~100000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000", d = "~72057594037927936", x = "~100000000000000"}, {v = 144115188075855872, b = "1000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000", d = "144115188075855872", x = "200000000000000"}, {v = ~144115188075855872, b = "~1000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000", d = "~144115188075855872", x = "~200000000000000"}, {v = 288230376151711744, b = "10000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000", d = "288230376151711744", x = "400000000000000"}, {v = ~288230376151711744, b = "~10000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000", d = "~288230376151711744", x = "~400000000000000"}, {v = 576460752303423488, b = "100000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000", d = "576460752303423488", x = "800000000000000"}, {v = ~576460752303423488, b = "~100000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000", d = "~576460752303423488", x = "~800000000000000"}, {v = 1152921504606846976, b = "1000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000", d = "1152921504606846976", x = "1000000000000000"}, {v = ~1152921504606846976, b = "~1000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000", d = "~1152921504606846976", x = "~1000000000000000"}, {v = 2305843009213693952, b = "10000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000", d = "2305843009213693952", x = "2000000000000000"}, {v = ~2305843009213693952, b = "~10000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000", d = "~2305843009213693952", x = "~2000000000000000"}, {v = 4611686018427387904, b = "100000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000", d = "4611686018427387904", x = "4000000000000000"}, {v = ~4611686018427387904, b = "~100000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000", d = "~4611686018427387904", x = "~4000000000000000"}, {v = 9223372036854775808, b = "1000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000", d = "9223372036854775808", x = "8000000000000000"}, {v = ~9223372036854775808, b = "~1000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000", d = "~9223372036854775808", x = "~8000000000000000"}, {v = 18446744073709551616, b = "10000000000000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000000", d = "18446744073709551616", x = "10000000000000000"}, {v = ~18446744073709551616, b = "~10000000000000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000000", d = "~18446744073709551616", x = "~10000000000000000"}, {v = 36893488147419103232, b = "100000000000000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000000", d = "36893488147419103232", x = "20000000000000000"}, {v = ~36893488147419103232, b = "~100000000000000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000000", d = "~36893488147419103232", x = "~20000000000000000"}, {v = 73786976294838206464, b = "1000000000000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000000", d = "73786976294838206464", x = "40000000000000000"}, {v = ~73786976294838206464, b = "~1000000000000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000000", d = "~73786976294838206464", x = "~40000000000000000"}, {v = 147573952589676412928, b = "10000000000000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000000", d = "147573952589676412928", x = "80000000000000000"}, {v = ~147573952589676412928, b = "~10000000000000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000000", d = "~147573952589676412928", x = "~80000000000000000"}, {v = 295147905179352825856, b = "100000000000000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000000", d = "295147905179352825856", x = "100000000000000000"}, {v = ~295147905179352825856, b = "~100000000000000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000000", d = "~295147905179352825856", x = "~100000000000000000"}, {v = 590295810358705651712, b = "1000000000000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000000", d = "590295810358705651712", x = "200000000000000000"}, {v = ~590295810358705651712, b = "~1000000000000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000000", d = "~590295810358705651712", x = "~200000000000000000"}, {v = 1180591620717411303424, b = "10000000000000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000000", d = "1180591620717411303424", x = "400000000000000000"}, {v = ~1180591620717411303424, b = "~10000000000000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000000", d = "~1180591620717411303424", x = "~400000000000000000"}, {v = 2361183241434822606848, b = "100000000000000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000000", d = "2361183241434822606848", x = "800000000000000000"}, {v = ~2361183241434822606848, b = "~100000000000000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000000", d = "~2361183241434822606848", x = "~800000000000000000"}, {v = 4722366482869645213696, b = "1000000000000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000000", d = "4722366482869645213696", x = "1000000000000000000"}, {v = ~4722366482869645213696, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000000", d = "~4722366482869645213696", x = "~1000000000000000000"}, {v = 9444732965739290427392, b = "10000000000000000000000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000000000", d = "9444732965739290427392", x = "2000000000000000000"}, {v = ~9444732965739290427392, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000000000", d = "~9444732965739290427392", x = "~2000000000000000000"}, {v = 18889465931478580854784, b = "100000000000000000000000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000000000", d = "18889465931478580854784", x = "4000000000000000000"}, {v = ~18889465931478580854784, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000000000", d = "~18889465931478580854784", x = "~4000000000000000000"}, {v = 37778931862957161709568, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000000000", d = "37778931862957161709568", x = "8000000000000000000"}, {v = ~37778931862957161709568, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000000000", d = "~37778931862957161709568", x = "~8000000000000000000"}, {v = 75557863725914323419136, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000000000", d = "75557863725914323419136", x = "10000000000000000000"}, {v = ~75557863725914323419136, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000000000", d = "~75557863725914323419136", x = "~10000000000000000000"}, {v = 151115727451828646838272, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000000000", d = "151115727451828646838272", x = "20000000000000000000"}, {v = ~151115727451828646838272, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000000000", d = "~151115727451828646838272", x = "~20000000000000000000"}, {v = 302231454903657293676544, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000000000", d = "302231454903657293676544", x = "40000000000000000000"}, {v = ~302231454903657293676544, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000000000", d = "~302231454903657293676544", x = "~40000000000000000000"}, {v = 604462909807314587353088, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000000000", d = "604462909807314587353088", x = "80000000000000000000"}, {v = ~604462909807314587353088, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000000000", d = "~604462909807314587353088", x = "~80000000000000000000"}, {v = 1208925819614629174706176, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000000000", d = "1208925819614629174706176", x = "100000000000000000000"}, {v = ~1208925819614629174706176, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000000000", d = "~1208925819614629174706176", x = "~100000000000000000000"}, {v = 2417851639229258349412352, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000000000", d = "2417851639229258349412352", x = "200000000000000000000"}, {v = ~2417851639229258349412352, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000000000", d = "~2417851639229258349412352", x = "~200000000000000000000"}, {v = 4835703278458516698824704, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000000000000", d = "4835703278458516698824704", x = "400000000000000000000"}, {v = ~4835703278458516698824704, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000000000000", d = "~4835703278458516698824704", x = "~400000000000000000000"}, {v = 9671406556917033397649408, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000000000000", d = "9671406556917033397649408", x = "800000000000000000000"}, {v = ~9671406556917033397649408, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000000000000", d = "~9671406556917033397649408", x = "~800000000000000000000"}, {v = 19342813113834066795298816, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000000000000", d = "19342813113834066795298816", x = "1000000000000000000000"}, {v = ~19342813113834066795298816, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000000000000", d = "~19342813113834066795298816", x = "~1000000000000000000000"}, {v = 38685626227668133590597632, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000000000000", d = "38685626227668133590597632", x = "2000000000000000000000"}, {v = ~38685626227668133590597632, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000000000000", d = "~38685626227668133590597632", x = "~2000000000000000000000"}, {v = 77371252455336267181195264, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000000000000", d = "77371252455336267181195264", x = "4000000000000000000000"}, {v = ~77371252455336267181195264, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000000000000", d = "~77371252455336267181195264", x = "~4000000000000000000000"}, {v = 154742504910672534362390528, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000000000000", d = "154742504910672534362390528", x = "8000000000000000000000"}, {v = ~154742504910672534362390528, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000000000000", d = "~154742504910672534362390528", x = "~8000000000000000000000"}, {v = 309485009821345068724781056, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000000000000", d = "309485009821345068724781056", x = "10000000000000000000000"}, {v = ~309485009821345068724781056, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000000000000", d = "~309485009821345068724781056", x = "~10000000000000000000000"}, {v = 618970019642690137449562112, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000000000000", d = "618970019642690137449562112", x = "20000000000000000000000"}, {v = ~618970019642690137449562112, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000000000000", d = "~618970019642690137449562112", x = "~20000000000000000000000"}, {v = 1237940039285380274899124224, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000000000000", d = "1237940039285380274899124224", x = "40000000000000000000000"}, {v = ~1237940039285380274899124224, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000000000000", d = "~1237940039285380274899124224", x = "~40000000000000000000000"}, {v = 2475880078570760549798248448, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "2000000000000000000000000000000", d = "2475880078570760549798248448", x = "80000000000000000000000"}, {v = ~2475880078570760549798248448, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~2000000000000000000000000000000", d = "~2475880078570760549798248448", x = "~80000000000000000000000"}, {v = 4951760157141521099596496896, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "4000000000000000000000000000000", d = "4951760157141521099596496896", x = "100000000000000000000000"}, {v = ~4951760157141521099596496896, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~4000000000000000000000000000000", d = "~4951760157141521099596496896", x = "~100000000000000000000000"}, {v = 9903520314283042199192993792, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "10000000000000000000000000000000", d = "9903520314283042199192993792", x = "200000000000000000000000"}, {v = ~9903520314283042199192993792, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~10000000000000000000000000000000", d = "~9903520314283042199192993792", x = "~200000000000000000000000"}, {v = 19807040628566084398385987584, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "20000000000000000000000000000000", d = "19807040628566084398385987584", x = "400000000000000000000000"}, {v = ~19807040628566084398385987584, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~20000000000000000000000000000000", d = "~19807040628566084398385987584", x = "~400000000000000000000000"}, {v = 39614081257132168796771975168, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "40000000000000000000000000000000", d = "39614081257132168796771975168", x = "800000000000000000000000"}, {v = ~39614081257132168796771975168, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~40000000000000000000000000000000", d = "~39614081257132168796771975168", x = "~800000000000000000000000"}, {v = 79228162514264337593543950336, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "100000000000000000000000000000000", d = "79228162514264337593543950336", x = "1000000000000000000000000"}, {v = ~79228162514264337593543950336, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~100000000000000000000000000000000", d = "~79228162514264337593543950336", x = "~1000000000000000000000000"}, {v = 158456325028528675187087900672, b = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "200000000000000000000000000000000", d = "158456325028528675187087900672", x = "2000000000000000000000000"}, {v = ~158456325028528675187087900672, b = "~10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~200000000000000000000000000000000", d = "~158456325028528675187087900672", x = "~2000000000000000000000000"}, {v = 316912650057057350374175801344, b = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "400000000000000000000000000000000", d = "316912650057057350374175801344", x = "4000000000000000000000000"}, {v = ~316912650057057350374175801344, b = "~100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~400000000000000000000000000000000", d = "~316912650057057350374175801344", x = "~4000000000000000000000000"}, {v = 633825300114114700748351602688, b = "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "1000000000000000000000000000000000", d = "633825300114114700748351602688", x = "8000000000000000000000000"}, {v = ~633825300114114700748351602688, b = "~1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", oc = "~1000000000000000000000000000000000", d = "~633825300114114700748351602688", x = "~8000000000000000000000000"} ] fun makeReader str = let val len = String.size str fun reader pos = if pos = String.size str then NONE else SOME (String.sub (str, pos), pos + 1) in reader end exception FailRead of StringCvt.radix * string exception FailWrite of StringCvt.radix * IntInf.int fun read2 str = case IntInf.scan StringCvt.BIN (makeReader str) 0 of NONE => raise (FailRead (StringCvt.BIN, str)) | SOME (v, p) => if p = String.size str then v else raise (FailRead (StringCvt.BIN, str)) fun read8 str = case IntInf.scan StringCvt.OCT (makeReader str) 0 of NONE => raise (FailRead (StringCvt.OCT, str)) | SOME (v, p) => if p = String.size str then v else raise (FailRead (StringCvt.OCT, str)) fun read10 str = case IntInf.scan StringCvt.DEC (makeReader str) 0 of NONE => raise (FailRead (StringCvt.DEC, str)) | SOME (v, p) => if p = String.size str then v else raise (FailRead (StringCvt.DEC, str)) fun read16 str = case IntInf.scan StringCvt.HEX (makeReader str) 0 of NONE => raise (FailRead (StringCvt.HEX, str)) | SOME (v, p) => if p = String.size str then v else raise (FailRead (StringCvt.HEX, str)) fun read str = case IntInf.fromString str of NONE => raise (FailRead (StringCvt.DEC, str)) | SOME v => v fun toStr2 v = IntInf.fmt StringCvt.BIN v fun toStr8 v = IntInf.fmt StringCvt.OCT v fun toStr10 v = IntInf.fmt StringCvt.DEC v fun toStr16 v = IntInf.fmt StringCvt.HEX v fun toStr v = IntInf.toString v fun baseToStr (base: StringCvt.radix): string = case base of StringCvt.BIN => "BIN" | StringCvt.OCT => "OCT" | StringCvt.DEC => "DEC" | StringCvt.HEX => "HEX" fun f ({ v: IntInf.int, b: string, oc: string, d: string, x: string}): unit = let val bv = read2 b val ov = read8 oc val dv = read10 d val xv = read16 x val vv = read d in if bv <> v then raise (FailRead (StringCvt.BIN, b)) else if ov <> v then raise (FailRead (StringCvt.OCT, oc)) else if dv <> v then raise (FailRead (StringCvt.DEC, d)) else if xv <> v then raise (FailRead (StringCvt.HEX, x)) else if vv <> v then raise (FailRead (StringCvt.DEC, d)) else let val vb = toStr2 v val vo = toStr8 v val vd = toStr10 v val vx = toStr16 v val vv = toStr v val (b, oc, d, x) = if v = 0 andalso String.sub (d, 0) = #"~" then ("0", "0", "0", "0") else (b, oc, d, x) in if vb <> b then raise (FailWrite (StringCvt.BIN, v)) else if vo <> oc then raise (FailWrite (StringCvt.OCT, v)) else if vd <> d then raise (FailWrite (StringCvt.DEC, v)) else if vx <> x then raise (FailWrite (StringCvt.HEX, v)) else if vv <> d then raise (FailWrite (StringCvt.DEC, v)) else () end end handle FailRead (base, str) => print ("FailRead, base = " ^ (baseToStr base) ^ ", str = |" ^ str ^ "|\n") | FailWrite (base, v) => print ("FailWrite, base = " ^ (baseToStr base) ^ ", d = |" ^ d ^ "|\n") val _ = List.app f arg val _ = print "All ok\n" mlton-20100608/regression/conversion.ok0000644000076600000240000000667611404435620016475 0ustar mtfstaff01237F7EFEFF 01237F7EFEFF 01237F7EFEFF 01237F7EFEFF 01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF 01237F7EFEFF 01237F7EFFFEFFFF 01237F7EFEFF 01237F7EFEFF 01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF FFFEFF01237F7EFEFF FFFEFF01237F7EFEFF FFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFF01237F7EFFFEFFFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFFFFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFFFFFEFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFF01237F7EFFFEFFFF FFFFFFFEFFFFFFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFEFFFFFFFFFFFEFFFF7FFFFFFEFFFF01237F7EFEFF 01237F7EFEFF 01237F7EFFFEFFFF 01237F7EFEFF 01237F7EFFFFFFFEFFFFFFFF FFFFFFFFFFFFFFFEFFFFFFFF01237F7EFFFFFFFEFFFFFFFF FFFEFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFEFFFFFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFEFFFFFEFF01237F7EFEFF FFFFFFFFFFFFFFFEFFFFFFFF7FFFFFFFFFFEFFFFFFFF01237F7EFEFF FFFFFFFFFFFFFFFEFFFFFFFF7FFFFFFFFFFEFFFFFFFF01237F7EFEFF 01237F7EFEFF 01237F7EFFFEFFFF 01237F7EFEFF 01237F7EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF 01237F7EFEFF 01237F7EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFEFFFFFFFF01237F7EFEFF 7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFEFF FFFEFF01237F7EFEFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFFFFFFFFFEFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFFFFFFFFFEFFFFFFFF7FFFFFFFFFFFFFFEFFFFFFFF7FFFFFFEFFFF01237F7EFEFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFEFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF01237F7EFEFF mlton-20100608/regression/conversion.sml0000644000076600000240000002272311404435620016646 0ustar mtfstaffval w8t16 = Word16.fromLarge o Word8.toLarge val w16t32 = Word32.fromLarge o Word16.toLarge val w32t64 = Word64.fromLarge o Word32.toLarge (* All of these should become no-ops *) val id8_1 = Word8.fromLarge o Word8.toLarge val id8_2 = Word8.fromLarge o Word8.toLargeX val id8_3 = Word8.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLarge val id8_4 = Word8.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLargeX val id8_5 = Word8.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLargeX val id16_1 = Word16.fromLarge o Word16.toLarge val id16_2 = Word16.fromLarge o Word16.toLargeX val id16_3 = Word16.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLarge val id16_4 = Word16.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLargeX val id16_5 = Word16.fromLarge o Word32.toLargeX o Word32.fromLarge o Word16.toLarge val id16_6 = Word16.fromLarge o Word32.toLargeX o Word32.fromLarge o Word16.toLargeX val xx16_1 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLarge val xx16_2 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLargeX val xx16_3 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLarge val xx16_4 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLargeX val id32_1 = Word32.fromLarge o Word32.toLarge val id32_2 = Word32.fromLarge o Word32.toLargeX val id32_3 = Word32.fromLarge o Word64.toLarge o Word64.fromLarge o Word32.toLarge val id32_4 = Word32.fromLarge o Word64.toLarge o Word64.fromLarge o Word32.toLargeX val id32_5 = Word32.fromLarge o Word64.toLargeX o Word64.fromLarge o Word32.toLarge val id32_6 = Word32.fromLarge o Word64.toLargeX o Word64.fromLarge o Word32.toLargeX val xx32_1 = Word32.fromLarge o Word8.toLarge o Word8.fromLarge o Word32.toLarge val xx32_2 = Word32.fromLarge o Word8.toLarge o Word8.fromLarge o Word32.toLargeX val xx32_3 = Word32.fromLarge o Word16.toLargeX o Word16.fromLarge o Word32.toLarge val xx32_4 = Word32.fromLarge o Word16.toLargeX o Word16.fromLarge o Word32.toLargeX val id64_1 = Word64.fromLarge o Word64.toLarge val id64_2 = Word64.fromLarge o Word64.toLargeX val id64_3 = Word64.fromLarge o Word64.toLarge o Word64.fromLarge o Word64.toLarge val id64_4 = Word64.fromLarge o Word64.toLarge o Word64.fromLarge o Word64.toLargeX val id64_5 = Word64.fromLarge o Word64.toLargeX o Word64.fromLarge o Word64.toLarge val id64_6 = Word64.fromLarge o Word64.toLargeX o Word64.fromLarge o Word64.toLargeX val xx64_1 = Word64.fromLarge o Word32.toLarge o Word32.fromLarge o Word64.toLarge val xx64_2 = Word64.fromLarge o Word32.toLarge o Word32.fromLarge o Word64.toLargeX val xx64_3 = Word64.fromLarge o Word16.toLargeX o Word16.fromLarge o Word64.toLarge val xx64_4 = Word64.fromLarge o Word16.toLargeX o Word16.fromLarge o Word64.toLargeX val c8t16_1 = Word16.fromLarge o Word8.toLarge val c8t16_2 = Word16.fromLarge o Word8.toLargeX val c8t16_3 = Word16.fromLarge o Word8.toLarge o id8_3 val c8t16_4 = Word16.fromLarge o Word8.toLarge o id8_4 val c8t16_5 = Word16.fromLarge o Word8.toLarge o id8_5 val c8t32_1 = Word32.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLarge val c8t32_2 = Word32.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLargeX val c8t32_3 = Word32.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLarge val c8t32_4 = Word32.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLargeX val c8t64_1 = Word64.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLarge val c8t64_2 = Word64.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLargeX val c8t64_3 = Word64.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLarge val c8t64_4 = Word64.fromLarge o Word16.toLargeX o Word16.fromLarge o Word8.toLargeX val c8t64_5 = Word64.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLarge val c8t64_6 = Word64.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLarge o Word16.fromLarge o Word8.toLargeX val c16t8_1 = Word8.fromLarge o Word16.toLarge val c16t8_2 = Word8.fromLarge o Word16.toLargeX val c16t8_3 = Word8.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLargeX val c16t8_4 = id8_3 o Word8.fromLarge o Word16.toLargeX val c16t8_5 = id8_4 o Word8.fromLarge o Word16.toLarge val c16t8_6 = id8_5 o Word8.fromLarge o Word16.toLargeX (* These tests rely on Int = Int32 to be useful *) val w16t8z = Word8.fromInt o Word16.toInt val w16t8s = Word8.fromInt o Word16.toIntX val c16t32_1 = Word32.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLarge val c16t32_2 = Word32.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLargeX val c16t32_3 = Word32.fromLarge o Word16.toLarge val c16t32_4 = Word32.fromLarge o Word16.toLargeX val c16t64_1 = Word64.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLarge val c16t64_2 = Word64.fromLarge o Word32.toLarge o Word32.fromLarge o Word16.toLargeX val c16t64_3 = Word64.fromLarge o Word32.toLargeX o Word32.fromLarge o Word16.toLarge val c16t64_4 = Word64.fromLarge o Word32.toLargeX o Word32.fromLarge o Word16.toLargeX val c16t64_5 = Word64.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLarge val c16t64_6 = Word64.fromLarge o Word8.toLarge o Word8.fromLarge o Word16.toLargeX val c16t64_7 = Word64.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLarge val c16t64_8 = Word64.fromLarge o Word8.toLargeX o Word8.fromLarge o Word16.toLargeX val c32t8_1 = id8_4 o Word8.fromLarge o Word32.toLarge o id32_1 val c32t8_2 = id8_3 o Word8.fromLarge o Word32.toLargeX o id32_2 val c32t8_3 = id8_2 o Word8.fromLarge o Word32.toLarge o id32_3 val c32t8_4 = id8_1 o Word8.fromLarge o Word32.toLargeX o id32_4 val c32t16_1 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word32.toLarge val c32t16_2 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word32.toLargeX val c32t16_3 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word32.toLarge val c32t16_4 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word32.toLargeX val c32t16_5 = Word16.fromLarge o Word64.toLarge o Word64.fromLarge o Word32.toLarge val c32t16_6 = Word16.fromLarge o Word64.toLargeX o Word64.fromLarge o Word32.toLarge val c32t16_7 = Word16.fromLarge o Word64.toLarge o Word64.fromLarge o Word32.toLargeX val c32t16_8 = Word16.fromLarge o Word64.toLargeX o Word64.fromLarge o Word32.toLargeX val c64t8_1 = id8_4 o Word8.fromLarge o Word64.toLarge o id64_1 val c64t8_2 = id8_3 o Word8.fromLarge o Word64.toLargeX o id64_2 val c64t8_3 = id8_2 o Word8.fromLarge o Word64.toLarge o id64_3 val c64t8_4 = id8_1 o Word8.fromLarge o Word64.toLargeX o id64_4 val c64t16_1 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word64.toLarge val c64t16_2 = Word16.fromLarge o Word8.toLarge o Word8.fromLarge o Word64.toLargeX val c64t16_3 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word64.toLarge val c64t16_4 = Word16.fromLarge o Word8.toLargeX o Word8.fromLarge o Word64.toLargeX val c64t16_5 = Word16.fromLarge o Word32.toLarge o Word32.fromLarge o Word64.toLarge val c64t16_6 = Word16.fromLarge o Word32.toLargeX o Word32.fromLarge o Word64.toLarge val c64t16_7 = Word16.fromLarge o Word32.toLarge o Word32.fromLarge o Word64.toLargeX val c64t16_8 = Word16.fromLarge o Word32.toLargeX o Word32.fromLarge o Word64.toLargeX val f8t8 = [ id8_1, id8_2, id8_3, id8_4, id8_5 ] val f8t16 = [ c8t16_1, c8t16_2, c8t16_3, c8t16_4, c8t16_5 ] val f8t32 = [ c8t32_1, c8t32_2, c8t32_3, c8t32_4 ] val f8t64 = [ c8t64_1, c8t64_2, c8t64_3, c8t64_4, c8t64_5, c8t64_6 ] val f16t8 = [ c16t8_1, c16t8_2, c16t8_3, c16t8_5, c16t8_6, w16t8z, w16t8s ] val f16t16 = [ id16_1, id16_2, id16_3, id16_4, id16_5, id16_6, xx16_1, xx16_2, xx16_3, xx16_4 ] val f16t32 = [ c16t32_1, c16t32_2, c16t32_3, c16t32_4 ] val f16t64 = [ c16t64_1, c16t64_2, c16t64_3, c16t64_4, c16t64_6, c16t64_7, c16t64_8 ] val f32t8 = [ c32t8_1, c32t8_2, c32t8_3, c32t8_4 ] val f32t16 = [ c32t16_1, c32t16_2, c32t16_3, c32t16_4, c32t16_5, c32t16_6, c32t16_7, c32t16_8 ] val f32t32 = [ id32_1, id32_2, id32_3, id32_4, id32_5, id32_6, xx32_1, xx32_2, xx32_3, xx32_4 ] val f32t64 = [ ] val f64t8 = [ c64t8_1, c64t8_2, c64t8_3, c64t8_4 ] val f64t16 = [ c64t16_1, c64t16_2, c64t16_3, c64t16_4, c64t16_5, c64t16_6, c64t16_7, c64t16_8 ] val f64t32 = [ ] val f64t64 = [ id64_1, id64_2, id64_3, id64_4, id64_5, id64_6, xx64_1, xx64_2, xx64_3, xx64_4 ] val x8 = [ 0w0, 0w1, 0w2, 0w3, 0wx7f, 0wx7e, 0wxfe, 0wxff ] val x16 = [ 0wx7fff, 0wxfffe, 0wxffff ] @ List.map w8t16 x8 val x32 = [ 0wx7fffffff, 0wxfffffffe, 0wxffffffff ] @ List.map w16t32 x16 val x64 = [ 0wx7fffffffffffffff, 0wxfffffffffffffffe, 0wxffffffffffffffff ] @ List.map w32t64 x32 fun doit (out, xl) f = let val () = List.app (print o out o f) xl in print "\n" end val () = List.app (doit (Word8.toString, x8)) f8t8 val () = List.app (doit (Word8.toString, x16)) f16t8 val () = List.app (doit (Word8.toString, x32)) f32t8 val () = List.app (doit (Word8.toString, x64)) f64t8 val () = List.app (doit (Word16.toString, x8)) f8t16 val () = List.app (doit (Word16.toString, x16)) f16t16 val () = List.app (doit (Word16.toString, x32)) f32t16 val () = List.app (doit (Word16.toString, x64)) f64t16 val () = List.app (doit (Word32.toString, x8)) f8t32 val () = List.app (doit (Word32.toString, x16)) f16t32 val () = List.app (doit (Word32.toString, x32)) f32t32 val () = List.app (doit (Word32.toString, x64)) f64t32 val () = List.app (doit (Word64.toString, x8)) f8t64 val () = List.app (doit (Word64.toString, x16)) f16t64 val () = List.app (doit (Word64.toString, x32)) f32t64 val () = List.app (doit (Word64.toString, x64)) f64t64 mlton-20100608/regression/cycle.nonterm0000644000076600000240000000000011404435617016435 0ustar mtfstaffmlton-20100608/regression/cycle.sml0000644000076600000240000000014311404435617015556 0ustar mtfstaffdatatype t = T of u | V and u = U of t * t fun f V = T (U (f V,f V)) | f (T _) = V val _ = f V mlton-20100608/regression/datatype-with-free-tyvars.ok0000644000076600000240000000002211404435617021322 0ustar mtfstafftrue 13 false foo mlton-20100608/regression/datatype-with-free-tyvars.sml0000644000076600000240000000071411404435617021514 0ustar mtfstafffun 'a f (x1: 'a, x2: 'a, aToString: 'a -> string): unit = let datatype 'b t = T of 'a * 'b and u = U of int t val y1: int t = T (x1, 13) val _: u = U y1 val y2 = T (x2, "foo") fun 'b g (T (a, b), bToString: 'b -> string): unit = print (concat [aToString a, " ", bToString b, "\n"]) val _ = g (y1, Int.toString) val _ = g (y2, fn s => s) in () end val _ = f (true, false, Bool.toString) mlton-20100608/regression/date.ok0000644000076600000240000000050011404435621015202 0ustar mtfstaff File date.sml: Testing structure Date... This is the epoch (UTC): Thu Jan 01 00:00:00 1970 The UTC millenium (UTC time): Sat Jan 01 00:00:00 2000 The UTC millenium minus 5 sec: Fri Dec 31 23:59:55 1999 test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK mlton-20100608/regression/date.sml0000644000076600000240000001771511404435617015411 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/date.sml PS 1995-03-20, 1995-05-12, 1996-07-05, 1998-04-07 *) (* MosML test file ported to the ML Kit; ME 1998-07-17 *) val _ = print "\nFile date.sml: Testing structure Date...\n" local open Time Date fun later h = toString(fromTimeLocal(now() + fromReal (3600.0 * real h))) ^ "\n"; fun nowdate () = Date.fromTimeLocal(now()); fun mkdate(y,mo,d,h,mi,s) = date {year=y, month=mo, day=d, hour=h, minute=mi, second=s, offset = NONE} fun cmp(dt1, dt2) = compare(mkdate dt1, mkdate dt2) fun fromto dt = toString (valOf (fromString (toString dt))) = toString dt fun tofrom s = toString (valOf (fromString s)) = s val y2k = date {year=2000, month=Jan, day=1, hour=0, minute=0, second=0, offset = SOME Time.zeroTime} val y2kE1 = date {year=2000, month=Jan, day=1, hour=0, minute=0, second=0, offset = SOME (Time.fromSeconds 82800) } val y2kW1 = date {year=2000, month=Jan, day=1, hour=0, minute=0, second=0, offset = SOME (Time.fromSeconds 3600) } val _ = ((*print "This is (local time) now: "; print (later 0); print "This is UTC now: "; print (toString (fromTimeUniv(now()))); print "\n"; print "This is an hour from now: "; print (later 1); print "This is a day from now: "; print (later 24); print "This is a week from now: "; print (later 168); print "This is 120 days from now: "; print (later (24 * 120)); print "This is 160 days from now: "; print (later (24 * 160)); print "This is 200 days from now: "; print (later (24 * 200)); print "This is 240 days from now: "; print (later (24 * 240)); *) print "This is the epoch (UTC): "; print (toString(fromTimeUniv zeroTime) ^ "\n"); print "The UTC millenium (UTC time): "; print (toString y2k ^ "\n"); print "The UTC millenium minus 5 sec: "; print (toString (date {year=2000, month=Jan, day=1, hour=0, minute=0, second= ~5, offset = SOME Time.zeroTime}) ^ "\n") (* print "The UTC millenium (local time): "; print (toString (fromTimeLocal (toTime y2k)) ^ "\n"); print "The local millenium (UTC time): "; print (toString (fromTimeUniv (toTime (mkdate(2000, Jan, 1, 0, 0, 0)))) ^ "\n"); print "The UTC+01 millenium (UTC): "; print (toString (fromTimeUniv (toTime y2kE1)) ^ "\n"); print "The UTC-01 millenium (UTC): "; print (toString (fromTimeUniv (toTime y2kW1)) ^ "\n"); print "This is today's number: "; print (fmt "%j" (nowdate()) ^ " (internally: "); print (Int.toString (yearDay (nowdate())) ^ ")\n"); print "This is today's weekday: "; print (fmt "%A" (nowdate()) ^ "\n"); print "This is the name of this month: "; print (fmt "%B" (nowdate()) ^ "\n"); print "Today's ISO date: "; print (fmt "%Y-%m-%d" (nowdate ()) ^ "\n")*)) val test1 = tst' "test1" (fn _ => cmp((1993,Jul,25,16,12,18), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1995,May,25,16,12,18), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,May,26,16,12,18), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jul,24,16,12,18), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,24,17,12,18), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jun,26,15,12,18), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,25,15,13,18), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jun,25,17,11,18), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,25,16,11,19), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jun,25,16,13,17), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,25,16,12,17), (1994,Jun,25,16,12,18)) = LESS andalso cmp((1994,Jun,25,16,12,19), (1994,Jun,25,16,12,18)) = GREATER andalso cmp((1994,Jun,25,16,12,18), (1994,Jun,25,16,12,18)) = EQUAL); val test2 = tst' "test2" (fn _ => fmt "%A" (mkdate(1995,May,22,4,0,1)) = "Monday"); val test3 = tst' "test3" (fn _ => List.all fromto [mkdate(1995,Aug,22,4,0,1), mkdate(1996,Apr, 5, 0, 7, 21), mkdate(1996,Mar, 5, 6, 13, 58)]); val test4 = tst' "test4" (fn _ => List.all tofrom ["Fri Jul 05 14:25:16 1996", "Mon Feb 05 04:25:16 1996", "Sat Jan 06 04:25:16 1996"]) val test5 = tst' "test5" (fn _ => weekDay(mkdate(1962, Jun, 25, 1, 2, 3)) = Mon andalso weekDay(mkdate(1998, Mar, 6, 1, 2, 3)) = Fri andalso weekDay(mkdate(1998, Apr, 6, 1, 2, 3)) = Mon andalso weekDay(mkdate(1900, Feb, 28, 1, 2, 3)) = Wed andalso weekDay(mkdate(1900, Mar, 1, 1, 2, 3)) = Thu andalso weekDay(mkdate(1850, Feb, 28, 1, 2, 3)) = Thu andalso weekDay(mkdate(1850, Mar, 1, 1, 2, 3)) = Fri andalso weekDay(mkdate(1860, Feb, 28, 1, 2, 3)) = Tue andalso weekDay(mkdate(1860, Feb, 29, 1, 2, 3)) = Wed andalso weekDay(mkdate(1860, Mar, 1, 1, 2, 3)) = Thu andalso weekDay(mkdate(2000, Feb, 28, 1, 2, 3)) = Mon andalso weekDay(mkdate(2000, Feb, 29, 1, 2, 3)) = Tue andalso weekDay(mkdate(2000, Mar, 1, 1, 2, 3)) = Wed) val test6 = tst' "test6" (fn _ => yearDay(mkdate(1962, Jan, 1, 1, 2, 3)) = 0 andalso yearDay(mkdate(1998, Mar, 6, 1, 2, 3)) = 64 andalso yearDay(mkdate(1900, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1900, Mar, 1, 1, 2, 3)) = 59 andalso yearDay(mkdate(1900, Dec, 31, 1, 2, 3)) = 364 andalso yearDay(mkdate(1850, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1850, Mar, 1, 1, 2, 3)) = 59 andalso yearDay(mkdate(1850, Dec, 31, 1, 2, 3)) = 364 andalso yearDay(mkdate(1860, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1860, Feb, 29, 1, 2, 3)) = 59 andalso yearDay(mkdate(1860, Mar, 1, 1, 2, 3)) = 60 andalso yearDay(mkdate(1860, Dec, 31, 1, 2, 3)) = 365 andalso yearDay(mkdate(2000, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(2000, Feb, 29, 1, 2, 3)) = 59 andalso yearDay(mkdate(2000, Mar, 1, 1, 2, 3)) = 60 andalso yearDay(mkdate(2000, Dec, 31, 1, 2, 3)) = 365 andalso yearDay(mkdate(1959, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1959, Mar, 1, 1, 2, 3)) = 59 andalso yearDay(mkdate(1959, Dec, 31, 1, 2, 3)) = 364 andalso yearDay(mkdate(1960, Feb, 28, 1, 2, 3)) = 58 andalso yearDay(mkdate(1960, Feb, 29, 1, 2, 3)) = 59 andalso yearDay(mkdate(1960, Mar, 1, 1, 2, 3)) = 60 andalso yearDay(mkdate(1960, Dec, 31, 1, 2, 3)) = 365) fun addh h = let val dt = mkdate(1998, Apr, 6, h, 0, 0) in (month dt, day dt, hour dt) end val test7 = tst' "test7" (fn _ => addh 0 = (Apr, 6, 0) andalso addh 23 = (Apr, 6, 23) andalso addh 24 = (Apr, 7, 0) andalso addh 36 = (Apr, 7, 12) andalso addh 600 = (May, 1, 0) andalso addh 610 = (May, 1, 10) andalso addh 625 = (May, 2, 1)) val test8 = tst' "test8" (fn _ => hour (mkdate(1998, Mar, 28, 12, 0, 0)) = 12 andalso hour (mkdate(1998, Mar, 28, 36, 0, 0)) = 12) in end mlton-20100608/regression/dead.nonterm0000644000076600000240000000000011404435621016226 0ustar mtfstaffmlton-20100608/regression/dead.sml0000644000076600000240000000011611404435617015354 0ustar mtfstaffdatatype t = A of t fun f (A y) = f y fun g () = A (g ()) val _ = f (g ()) mlton-20100608/regression/deep-flatten.ok0000644000076600000240000000000411404435620016633 0ustar mtfstaff5 6 mlton-20100608/regression/deep-flatten.sml0000644000076600000240000000036211404435617017032 0ustar mtfstafffun f r = case #1 (!r) of 3 => r := (5, 6) | _ => f (ref (7, 8)) val r = ref (1, 2) val _ = r := (3, 4) val _ = f r val _ = print (concat [Int.toString (#1 (!r)), " ", Int.toString (#2 (!r)), "\n"]) mlton-20100608/regression/default-overloads.sml0000644000076600000240000000073111404435620020074 0ustar mtfstafffun f x = ~ x; fun g (x: int) = f x; fun f x = abs x; fun g (x: int) = f x; fun f x = x + x; fun g (x: int) = f x; fun f x = x - x; fun g (x: int) = f x; fun f x = x * x; fun g (x: int) = f x; fun f x = x div x; fun g (x: int) = f x; fun f x = x mod x; fun g (x: int) = f x; fun f x = x < x; fun g (x: int) = f x; fun f x = x <= x; fun g (x: int) = f x; fun f x = x > x; fun g (x: int) = f x; fun f x = x >= x; fun g (x: int) = f x; fun f x = x / x; fun g (x: real) = f x; mlton-20100608/regression/down.ok0000644000076600000240000000000011404435617015234 0ustar mtfstaffmlton-20100608/regression/down.sml0000644000076600000240000000023611404435620015423 0ustar mtfstaffval rec down = fn 0 => 0 | n => 1 + down' (n - 1) + down (n - 1) and down' = fn 0 => 0 | n => 1 + down (n - 1) + down' (n - 1) val _ = down 13 mlton-20100608/regression/echo.ok0000644000076600000240000000003411404435620015204 0ustar mtfstaffserver processed 1900 bytes mlton-20100608/regression/echo.sml0000644000076600000240000000307311404435617015402 0ustar mtfstaff(* -*- mode: sml -*- * $Id: echo.sml,v 1.11 2003/09/24 17:45:27 sweeks Exp $ * http://www.bagley.org/~doug/shootout/ * from Tom 7 *) exception Error of string val data = "Hello there sailor\n" val num = 100 val (port, listener) = MLton.Socket.listen () handle _ => raise Error ("Can't listen...\n") fun server () = let val (_, _, ins, outs) = MLton.Socket.accept listener fun s b = case TextIO.inputLine ins of NONE => let in Posix.Process.wait (); print (concat ["server processed ", Int.toString b, " bytes\n"]) end | SOME i => let in TextIO.output(outs, i); TextIO.flushOut outs; s (b + 19) end in s 0 end fun client () = let val (ins, outs) = MLton.Socket.connect ("127.0.0.1", port) fun c 0 = let in TextIO.closeOut outs; TextIO.closeIn ins end | c n = let in TextIO.output(outs, data); TextIO.flushOut outs; TextIO.inputLine ins = SOME data orelse raise Error "Didn't receive the same data"; c (n - 1) end in c num end val _ = case Posix.Process.fork () of SOME pid => server () | NONE => client () mlton-20100608/regression/eq.ok0000644000076600000240000000000311404435617014675 0ustar mtfstaffno mlton-20100608/regression/eq.sml0000644000076600000240000000015611404435617015070 0ustar mtfstafffun f x = x + 1 fun g x = x + 2 val _ = if MLton.eq (f, g) then print "yes\n" else print "no\n" mlton-20100608/regression/eqtype.sml0000644000076600000240000000341611404435620015766 0ustar mtfstaffsignature T = sig eqtype s structure V: sig datatype v = V end where type v = s end signature S = sig eqtype v structure T: sig eqtype t end where type t = v end signature S = sig eqtype v structure S: sig type 'a t end where type 'a t = v structure T: sig eqtype t end where type t = int S.t end signature S = sig eqtype v structure S: sig type 'a t end where type 'a t = v structure T: sig eqtype t end where type t = real S.t end signature S = sig eqtype v structure S: sig type 'a t type u = real t end where type 'a t = v structure T: sig eqtype t end where type t = S.u end functor F (eqtype v structure S: sig type 'a t type u = real t end where type 'a t = v) = struct fun f (x: 'a S.t) = x = x fun f (x: S.u) = x = x end signature T = sig eqtype s structure U: sig type 'a t type u = (int * real) t end where type 'a t = s structure V: sig datatype v = V end where type v = U.u end structure T: T = struct datatype s = V structure U = struct type 'a t = s type u = (int * real) t end structure V = struct datatype v = datatype s end end mlton-20100608/regression/ex.nonterm0000644000076600000240000000000011404435621015745 0ustar mtfstaffmlton-20100608/regression/ex.sml0000644000076600000240000000043511404435617015077 0ustar mtfstaffexception Foo of unit ref fun f (x, r): int = if x then raise (Foo r) else (f (true, r); 1 + 2) fun loop (r: unit ref): int = let val r' = ref () in if r = r' then 13 else f (false, r') handle Foo r => loop r end val _ = loop (ref ()) mlton-20100608/regression/exhaustive.ok0000644000076600000240000000000011404435617016452 0ustar mtfstaffmlton-20100608/regression/exhaustive.sml0000644000076600000240000001302311404435617016645 0ustar mtfstaff(* exhaustive.sml *) (* Checks for correct treatment of exhaustiveness for basic types * (compiler should NOT warn here). *) fun ord #"\000" = 0 | ord #"\001" = 1 | ord #"\002" = 2 | ord #"\003" = 3 | ord #"\004" = 4 | ord #"\005" = 5 | ord #"\006" = 6 | ord #"\007" = 7 | ord #"\008" = 8 | ord #"\009" = 9 | ord #"\010" = 10 | ord #"\011" = 11 | ord #"\012" = 12 | ord #"\013" = 13 | ord #"\014" = 14 | ord #"\015" = 15 | ord #"\016" = 16 | ord #"\017" = 17 | ord #"\018" = 18 | ord #"\019" = 19 | ord #"\020" = 20 | ord #"\021" = 21 | ord #"\022" = 22 | ord #"\023" = 23 | ord #"\024" = 24 | ord #"\025" = 25 | ord #"\026" = 26 | ord #"\027" = 27 | ord #"\028" = 28 | ord #"\029" = 29 | ord #"\030" = 30 | ord #"\031" = 31 | ord #"\032" = 32 | ord #"\033" = 33 | ord #"\034" = 34 | ord #"\035" = 35 | ord #"\036" = 36 | ord #"\037" = 37 | ord #"\038" = 38 | ord #"\039" = 39 | ord #"\040" = 40 | ord #"\041" = 41 | ord #"\042" = 42 | ord #"\043" = 43 | ord #"\044" = 44 | ord #"\045" = 45 | ord #"\046" = 46 | ord #"\047" = 47 | ord #"\048" = 48 | ord #"\049" = 49 | ord #"\050" = 50 | ord #"\051" = 51 | ord #"\052" = 52 | ord #"\053" = 53 | ord #"\054" = 54 | ord #"\055" = 55 | ord #"\056" = 56 | ord #"\057" = 57 | ord #"\058" = 58 | ord #"\059" = 59 | ord #"\060" = 60 | ord #"\061" = 61 | ord #"\062" = 62 | ord #"\063" = 63 | ord #"\064" = 64 | ord #"\065" = 65 | ord #"\066" = 66 | ord #"\067" = 67 | ord #"\068" = 68 | ord #"\069" = 69 | ord #"\070" = 70 | ord #"\071" = 71 | ord #"\072" = 72 | ord #"\073" = 73 | ord #"\074" = 74 | ord #"\075" = 75 | ord #"\076" = 76 | ord #"\077" = 77 | ord #"\078" = 78 | ord #"\079" = 79 | ord #"\080" = 80 | ord #"\081" = 81 | ord #"\082" = 82 | ord #"\083" = 83 | ord #"\084" = 84 | ord #"\085" = 85 | ord #"\086" = 86 | ord #"\087" = 87 | ord #"\088" = 88 | ord #"\089" = 89 | ord #"\090" = 90 | ord #"\091" = 91 | ord #"\092" = 92 | ord #"\093" = 93 | ord #"\094" = 94 | ord #"\095" = 95 | ord #"\096" = 96 | ord #"\097" = 97 | ord #"\098" = 98 | ord #"\099" = 99 | ord #"\100" = 100 | ord #"\101" = 101 | ord #"\102" = 102 | ord #"\103" = 103 | ord #"\104" = 104 | ord #"\105" = 105 | ord #"\106" = 106 | ord #"\107" = 107 | ord #"\108" = 108 | ord #"\109" = 109 | ord #"\110" = 110 | ord #"\111" = 111 | ord #"\112" = 112 | ord #"\113" = 113 | ord #"\114" = 114 | ord #"\115" = 115 | ord #"\116" = 116 | ord #"\117" = 117 | ord #"\118" = 118 | ord #"\119" = 119 | ord #"\120" = 120 | ord #"\121" = 121 | ord #"\122" = 122 | ord #"\123" = 123 | ord #"\124" = 124 | ord #"\125" = 125 | ord #"\126" = 126 | ord #"\127" = 127 | ord #"\128" = 128 | ord #"\129" = 129 | ord #"\130" = 130 | ord #"\131" = 131 | ord #"\132" = 132 | ord #"\133" = 133 | ord #"\134" = 134 | ord #"\135" = 135 | ord #"\136" = 136 | ord #"\137" = 137 | ord #"\138" = 138 | ord #"\139" = 139 | ord #"\140" = 140 | ord #"\141" = 141 | ord #"\142" = 142 | ord #"\143" = 143 | ord #"\144" = 144 | ord #"\145" = 145 | ord #"\146" = 146 | ord #"\147" = 147 | ord #"\148" = 148 | ord #"\149" = 149 | ord #"\150" = 150 | ord #"\151" = 151 | ord #"\152" = 152 | ord #"\153" = 153 | ord #"\154" = 154 | ord #"\155" = 155 | ord #"\156" = 156 | ord #"\157" = 157 | ord #"\158" = 158 | ord #"\159" = 159 | ord #"\160" = 160 | ord #"\161" = 161 | ord #"\162" = 162 | ord #"\163" = 163 | ord #"\164" = 164 | ord #"\165" = 165 | ord #"\166" = 166 | ord #"\167" = 167 | ord #"\168" = 168 | ord #"\169" = 169 | ord #"\170" = 170 | ord #"\171" = 171 | ord #"\172" = 172 | ord #"\173" = 173 | ord #"\174" = 174 | ord #"\175" = 175 | ord #"\176" = 176 | ord #"\177" = 177 | ord #"\178" = 178 | ord #"\179" = 179 | ord #"\180" = 180 | ord #"\181" = 181 | ord #"\182" = 182 | ord #"\183" = 183 | ord #"\184" = 184 | ord #"\185" = 185 | ord #"\186" = 186 | ord #"\187" = 187 | ord #"\188" = 188 | ord #"\189" = 189 | ord #"\190" = 190 | ord #"\191" = 191 | ord #"\192" = 192 | ord #"\193" = 193 | ord #"\194" = 194 | ord #"\195" = 195 | ord #"\196" = 196 | ord #"\197" = 197 | ord #"\198" = 198 | ord #"\199" = 199 | ord #"\200" = 200 | ord #"\201" = 201 | ord #"\202" = 202 | ord #"\203" = 203 | ord #"\204" = 204 | ord #"\205" = 205 | ord #"\206" = 206 | ord #"\207" = 207 | ord #"\208" = 208 | ord #"\209" = 209 | ord #"\210" = 210 | ord #"\211" = 211 | ord #"\212" = 212 | ord #"\213" = 213 | ord #"\214" = 214 | ord #"\215" = 215 | ord #"\216" = 216 | ord #"\217" = 217 | ord #"\218" = 218 | ord #"\219" = 219 | ord #"\220" = 220 | ord #"\221" = 221 | ord #"\222" = 222 | ord #"\223" = 223 | ord #"\224" = 224 | ord #"\225" = 225 | ord #"\226" = 226 | ord #"\227" = 227 | ord #"\228" = 228 | ord #"\229" = 229 | ord #"\230" = 230 | ord #"\231" = 231 | ord #"\232" = 232 | ord #"\233" = 233 | ord #"\234" = 234 | ord #"\235" = 235 | ord #"\236" = 236 | ord #"\237" = 237 | ord #"\238" = 238 | ord #"\239" = 239 | ord #"\240" = 240 | ord #"\241" = 241 | ord #"\242" = 242 | ord #"\243" = 243 | ord #"\244" = 244 | ord #"\245" = 245 | ord #"\246" = 246 | ord #"\247" = 247 | ord #"\248" = 248 | ord #"\249" = 249 | ord #"\250" = 250 | ord #"\251" = 251 | ord #"\252" = 252 | ord #"\253" = 253 | ord #"\254" = 254 | ord #"\255" = 255; mlton-20100608/regression/exn-history.ok0000644000076600000240000000043011404435621016560 0ustar mtfstafff. exn-history.sml 3.18 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5 f exn-history.sml 1.5

mlton-20100608/regression/exn-history.sml0000644000076600000240000000033611404435621016747 0ustar mtfstafffun f x = if x = 0 then raise Fail "ok" else f (x - 1) handle Overflow => 13 val _ = (f 10; ()) handle e => (List.app (fn s => print (concat [s, "\n"])) (SMLofNJ.exnHistory e)) mlton-20100608/regression/exn-history3.ok0000644000076600000240000000111411404435617016650 0ustar mtfstafff. exn-history3.sml 5.18 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5
ZZZ f. exn-history3.sml 5.18 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5 f exn-history3.sml 3.5
mlton-20100608/regression/exn-history3.sml0000644000076600000240000000060111404435620017024 0ustar mtfstaffexception FOO fun f x = if x = 0 then raise FOO else f (x - 1) handle Overflow => 13 val _ = (f 10; ()) handle e => (List.app (fn s => print (concat [s, "\n"])) (SMLofNJ.exnHistory e)) val _ = print "ZZZ\n" val _ = (f 10; ()) handle e => (List.app (fn s => print (concat [s, "\n"])) (SMLofNJ.exnHistory e)) mlton-20100608/regression/exn.ok0000644000076600000240000000001611404435617015066 0ustar mtfstaffzzzzzzzzzzzzz mlton-20100608/regression/exn.sml0000644000076600000240000000023011404435617015246 0ustar mtfstaffexception E fun loop n = if n = 0 then raise E else (loop(n - 1) handle e => (print "z"; raise e)) val _ = loop 13 handle _ => print "\n" mlton-20100608/regression/exn2.sml0000644000076600000240000000026511404435620015332 0ustar mtfstafffun die(): 'a = let exception Die in raise Die end val _ = let val _: string = die() val _: real = die() val _: bool = die() in () end handle _ => () mlton-20100608/regression/expansive-valbind.sml0000644000076600000240000000073111404435621020074 0ustar mtfstaffval f = fn x => x and r = ref 13 val _ = (f 1; f true) val () = r := !r + 1 val () = print (concat [Int.toString (!r), "\n"]) val () = r := !r + 1 val () = print (concat [Int.toString (!r), "\n"]) val x = let exception E of 'a in () end val 'a x = let exception E of 'a in () end val 'a id = fn x: 'a => x and x = let exception E of 'a in () end val 'a _ = let exception E of 'a in E end val 'a (f: int -> int, _) = (fn x => x, let exception E of 'a in E end); mlton-20100608/regression/exponential.ok0000644000076600000240000000000011404435620016605 0ustar mtfstaffmlton-20100608/regression/exponential.sml0000644000076600000240000000022711404435617017010 0ustar mtfstafffun f x = x fun toy () = let fun g y = f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f y in g 3; g 4 end val _ = toy () mlton-20100608/regression/fact.ok0000644000076600000240000000001011404435617015203 0ustar mtfstaff3628800 mlton-20100608/regression/fact.sml0000644000076600000240000000015311404435617015375 0ustar mtfstaffval rec fact = fn 0 => 1 | n => n * fact(n - 1) val _ = print(concat[Int.toString(fact 10), "\n"]) mlton-20100608/regression/fail/0000755000076600000240000000000011404470407014653 5ustar mtfstaffmlton-20100608/regression/fail/.ignore0000644000076600000240000000000711404435614016135 0ustar mtfstaffPM run mlton-20100608/regression/fail/1.sml0000644000076600000240000000012011404435614015522 0ustar mtfstafffunctor F () = struct val x = y end val y = 13 structure S = F () mlton-20100608/regression/fail/2.sml0000644000076600000240000000010311404435614015524 0ustar mtfstaffval _ = let val x = ref [] in (!x = [1], !x = [true]) end mlton-20100608/regression/fail/3.sml0000644000076600000240000000002111404435614015524 0ustar mtfstafftype t = 'a * 'b mlton-20100608/regression/fail/4.sml0000644000076600000240000000003111404435614015526 0ustar mtfstaffdatatype foo = Foo of 'a mlton-20100608/regression/fail/5.sml0000644000076600000240000000002311404435614015530 0ustar mtfstaffdatatype t = A | = mlton-20100608/regression/fail/constant-too-big.sml0000644000076600000240000000047611404435614020567 0ustar mtfstaffval _ = 1234: Int8.int val _ = 12345678: Int16.int val _ = 12345678901234567890: Int32.int val _ = 1234567890123456789012345678901234567890: Int64.int val _ = 0w1234: Word8.word val _ = 0w12345678: Word16.word val _ = 0w12345678901234567890: Word32.word val _ = 0w1234567890123456789012345678901234567890: Word64.word mlton-20100608/regression/fail/datatype-where-complex.sml0000644000076600000240000000011211404435614021753 0ustar mtfstaffsignature S = sig datatype t = T end where type t = int * int mlton-20100608/regression/fail/datatype.1.sml0000644000076600000240000000005411404435614017342 0ustar mtfstaffdatatype t = T of int * t withtype t = real mlton-20100608/regression/fail/datatype.2.sml0000644000076600000240000000002311404435614017337 0ustar mtfstaffdatatype t = A | A mlton-20100608/regression/fail/datatype.3.sml0000644000076600000240000000003111404435614017337 0ustar mtfstaffdatatype t = A and u = A mlton-20100608/regression/fail/datatype.4.sml0000644000076600000240000000002111404435614017337 0ustar mtfstaffdatatype t = nil mlton-20100608/regression/fail/dec.sml0000644000076600000240000000050211404435614016121 0ustar mtfstafffun F.f () = () fun f = () fun f _ = () | f _ _ = () fun f _ = () | g _ = () | h _ = () fun f (): bool = 13 fun f (_: bool) = () | f (_: int) = () fun f (): int = 13 | f (): bool = true fun f (x: int) = f true val 'a x: 'a -> 'a = (fn y => y) (fn z => z) val rec (x: int) = fn z => z val x: int = true mlton-20100608/regression/fail/duplicate-tyvar.sml0000644000076600000240000000002711404435614020505 0ustar mtfstafftype ('a, 'a) t = unit mlton-20100608/regression/fail/eqtype.1.sml0000644000076600000240000000040311404435614017034 0ustar mtfstaff(* This should fail because v is an eqtype and s does not admit equality. * Hence, the side condition on rule 64 fails. *) signature T = sig type s structure V: sig datatype v = V end where type v = s end mlton-20100608/regression/fail/equal.sml0000644000076600000240000000005311404435614016476 0ustar mtfstaffval op = = () val rec (op =) = fn _ => 13 mlton-20100608/regression/fail/equality-types.sml0000644000076600000240000000113511404435614020370 0ustar mtfstaffval _ = 1 = 2 val _ = 1.0 = 2.0 (* error *) val f: ''a -> unit = fn _ => raise Fail "f" val _ = f 1 val _ = f 1.0 (* error *) datatype 'a t = T of 'a val _ = T 1 = T 2 val _ = T 1.0 = T 2.0 (* 15 error *) datatype 'a t = T val _ = (T: int t) = T val _ = (T: real t) = T (* 21 error *) datatype t = T of u withtype u = real val _ = T 13.0 = T 14.0 (* 26 error *) datatype t = T of u and u = U of t fun f (x: t) = x = x datatype 'a t = T of 'a u and 'a u = U of 'a fun f (x: int t) = x = x fun f (x: real t) = x = x (* 38 error *) val f: 'a -> unit = fn x => (x = x; ()) (* 40 error *) mlton-20100608/regression/fail/escaping-datatype.sml0000644000076600000240000000010611404435614020770 0ustar mtfstaffval _ = let datatype t = T in (T, fn T => 1) end mlton-20100608/regression/fail/exception.1.sml0000644000076600000240000000002211404435614017520 0ustar mtfstaffexception E and E mlton-20100608/regression/fail/exp.1.sml0000644000076600000240000000003111404435614016316 0ustar mtfstaffval _ = {x = 13, x = 14} mlton-20100608/regression/fail/exp.2.sml0000644000076600000240000000002711404435614016324 0ustar mtfstaffval x = 13 and x = (); mlton-20100608/regression/fail/exp.3.sml0000644000076600000240000000001711404435614016324 0ustar mtfstafffun f x x = 13 mlton-20100608/regression/fail/exp.4.sml0000644000076600000240000000005411404435614016326 0ustar mtfstaffval rec x = fn () => () and x = fn () => () mlton-20100608/regression/fail/exp.5.sml0000644000076600000240000000003411404435614016325 0ustar mtfstafffun f () = () and f () = () mlton-20100608/regression/fail/exp.6.sml0000644000076600000240000000003211404435614016324 0ustar mtfstaffval rec nil = fn () => () mlton-20100608/regression/fail/exp.7.sml0000644000076600000240000000002011404435614016322 0ustar mtfstafffun nil () = () mlton-20100608/regression/fail/exp.8.sml0000644000076600000240000000001611404435614016330 0ustar mtfstaffexception nil mlton-20100608/regression/fail/exp.sml0000644000076600000240000000101611404435614016163 0ustar mtfstaffval _ = 1 andalso true val _ = true andalso 1 val _ = 13 14 val _ = (op +) (1, true) val _ = case "foo" of 13 => 14 val _ = 13: bool val _ = + 1 2 val _ = 1 handle _ => "foo" val _ = () handle _: int => () val _ = if "foo" then () else () val _ = if true then 1 else "foo" val _ = [1, 2, "foo"] val _ = 1 orelse true val _ = true orelse 1 val _ = raise 13 val _ = "foo" + "bar" val _ = while "foo" do () val _ = fn _: int => () | _: bool => () val _ = fn 1 => "foo" | 2 => true mlton-20100608/regression/fail/free-type-variable.sml0000644000076600000240000000002511404435614021051 0ustar mtfstaffdatatype t = T of 'a mlton-20100608/regression/fail/functor-and.sml0000644000076600000240000000005311404435614017607 0ustar mtfstafffunctor F () = struct end and F' () = F () mlton-20100608/regression/fail/functor-generative-equality.sml0000644000076600000240000000023311404435614023031 0ustar mtfstafffunctor F () = struct datatype t = T of int -> int end functor G () = struct structure S = F () fun f (x: S.t) = x = x end mlton-20100608/regression/fail/functor.1.sml0000644000076600000240000000067511404435614017220 0ustar mtfstaffval b = ref false val r = ref NONE functor F (type t val x: t val f: t -> string) = struct val _ = if !b then print (concat [f (valOf (! r)), "\n"]) else (b := true; r := SOME x) end structure S = F (type t = int val x = 13 val f = Int.toString) structure S = F (type t = real val x = 13.0 val f = Real.toString) mlton-20100608/regression/fail/it.1.sml0000644000076600000240000000002011404435614016134 0ustar mtfstaffdatatype t = it mlton-20100608/regression/fail/it.2.sml0000644000076600000240000000001511404435614016141 0ustar mtfstaffexception it mlton-20100608/regression/fail/modules.1.sml0000644000076600000240000000013311404435614017175 0ustar mtfstaffstructure S: sig datatype t = T end = struct datatype 'a t = T end mlton-20100608/regression/fail/modules.10.sml0000644000076600000240000000011511404435614017255 0ustar mtfstafftype 'a u = int signature S = sig type 'a t end where type t = u mlton-20100608/regression/fail/modules.11.sml0000644000076600000240000000012611404435614017260 0ustar mtfstaffstructure S: sig datatype t = T end = struct type t = int end mlton-20100608/regression/fail/modules.12.sml0000644000076600000240000000007711404435614017266 0ustar mtfstaffsignature S = sig type 'a t end where type t = int mlton-20100608/regression/fail/modules.13.sml0000644000076600000240000000011611404435614017261 0ustar mtfstafftype 'a u = unit signature S = sig type 'a t end where type t = u mlton-20100608/regression/fail/modules.14.sml0000644000076600000240000000012111404435614017256 0ustar mtfstafftype 'a u = unit signature S = sig type 'a t end where type t = 'b u mlton-20100608/regression/fail/modules.15.sml0000644000076600000240000000031411404435614017263 0ustar mtfstaff(* u admits equality, but t does not, hence cannot substitute t for u. *) signature S = sig type t structure Z: sig datatype u = U end where type u = t end mlton-20100608/regression/fail/modules.16.sml0000644000076600000240000000054111404435614017266 0ustar mtfstaffstructure S: sig eqtype t structure Z: sig datatype u = U end end = struct structure Z = struct datatype u = U end datatype t = datatype Z.u structure Z = struct type u = Z.u datatype z = datatype Z.u end end mlton-20100608/regression/fail/modules.17.sml0000644000076600000240000000056211404435614017272 0ustar mtfstaffstructure S: sig eqtype t structure Z: sig datatype u = U end where type u = t end = struct structure Z = struct datatype u = U end datatype t = datatype Z.u structure Z = struct type u = Z.u datatype z = datatype Z.u end end mlton-20100608/regression/fail/modules.18.sml0000644000076600000240000000026311404435614017271 0ustar mtfstaffstructure T = struct structure X = struct type t = int end end signature S = sig structure T: sig end val x: T.X.t end mlton-20100608/regression/fail/modules.19.sml0000644000076600000240000000013111404435614017264 0ustar mtfstafffunctor F (type t type u) = struct val id: t -> u = fn x => x end mlton-20100608/regression/fail/modules.2.sml0000644000076600000240000000015311404435614017200 0ustar mtfstaffstructure S: sig datatype 'a t = T of int end = struct datatype 'a t = T of 'a end mlton-20100608/regression/fail/modules.20.sml0000644000076600000240000000006511404435614017262 0ustar mtfstafffunctor F (type t) = struct fun f (x: t) = x = x end mlton-20100608/regression/fail/modules.21.sml0000644000076600000240000000010511404435614017256 0ustar mtfstaffstructure S: sig val x: bool end = struct val x = 13 end mlton-20100608/regression/fail/modules.22.sml0000644000076600000240000000013711404435614017264 0ustar mtfstaffstructure S: sig val x: 'a list end = struct val x: unit list = [] end mlton-20100608/regression/fail/modules.23.sml0000644000076600000240000000022111404435614017257 0ustar mtfstaffstructure S: sig val f: 'a -> 'a list end = struct fun f x = if x = x then [] else [x] end mlton-20100608/regression/fail/modules.24.sml0000644000076600000240000000014011404435614017260 0ustar mtfstaffstructure S: sig datatype t = A | B end = struct datatype t = B | C end mlton-20100608/regression/fail/modules.25.sml0000644000076600000240000000031211404435614017262 0ustar mtfstaffstructure S: sig structure T: sig datatype t = A | B end end = struct structure T = struct datatype t = B | C end end mlton-20100608/regression/fail/modules.26.sml0000644000076600000240000000015311404435614017266 0ustar mtfstaffstructure S: sig datatype 'a t = T of int end = struct datatype 'a t = T of 'a end mlton-20100608/regression/fail/modules.27.sml0000644000076600000240000000016511404435614017272 0ustar mtfstaffstructure S: sig datatype t = A | B end = struct datatype t = A | B datatype u = B end mlton-20100608/regression/fail/modules.28.sml0000644000076600000240000000021511404435614017267 0ustar mtfstaffstructure S: sig datatype t = A | B of unit end = struct datatype t = A | B of int val rec B = fn () => A end mlton-20100608/regression/fail/modules.29.sml0000644000076600000240000000022111404435614017265 0ustar mtfstaff(* Generativity of functors. *) functor F () = struct datatype t = T end structure S1 = F () structure S2 = F () val _ = S1.T = S2.T mlton-20100608/regression/fail/modules.3.sml0000644000076600000240000000022211404435614017176 0ustar mtfstafffunctor F (type t datatype u = U of t eqtype v sharing type t = v) = struct fun f (u: u) = u = u end mlton-20100608/regression/fail/modules.30.sml0000644000076600000240000000011011404435614017252 0ustar mtfstaffstructure S:> sig type t end = struct type t = unit end val _ = (): S.t mlton-20100608/regression/fail/modules.31.sml0000644000076600000240000000020211404435614017255 0ustar mtfstaffstructure S:> sig type t val x: t end = struct type t = unit val x = () end val _ = S.x = S.x mlton-20100608/regression/fail/modules.32.sml0000644000076600000240000000020411404435614017260 0ustar mtfstaffstructure S:> sig type t val x: t end = struct type t = real val x = 13.0 end val _ = S.x = S.x mlton-20100608/regression/fail/modules.33.sml0000644000076600000240000000022611404435614017265 0ustar mtfstaffsignature S = sig type t = int end signature S = sig structure S1: S structure S2: S sharing type S1.t = S2.t end mlton-20100608/regression/fail/modules.34.sml0000644000076600000240000000010611404435614017263 0ustar mtfstaffsignature S = sig type 'a t end where type 'a t = 'b list mlton-20100608/regression/fail/modules.35.sml0000644000076600000240000000007011404435614017264 0ustar mtfstafffunctor F (ZZZ: sig end) = struct end structure Z = ZZZ mlton-20100608/regression/fail/modules.36.sml0000644000076600000240000000014211404435614017265 0ustar mtfstaffsignature SIG = sig include sig type t end where type t = int end where type t = bool mlton-20100608/regression/fail/modules.37.sml0000644000076600000240000000015111404435614017266 0ustar mtfstaffsignature SIG = sig structure S: sig type t end where type t = int end where type S.t = bool mlton-20100608/regression/fail/modules.38.sml0000644000076600000240000000015211404435614017270 0ustar mtfstaffstructure S: sig type t end where type t = int * int = struct type t = int end mlton-20100608/regression/fail/modules.39.sml0000644000076600000240000000023311404435614017271 0ustar mtfstaffsignature SIG = sig type u type v = u end where type v = int structure S: SIG = struct type u = real type v = real end mlton-20100608/regression/fail/modules.4.sml0000644000076600000240000000014411404435614017202 0ustar mtfstaffsignature S = sig type t type u type v = t * t sharing type u = v end mlton-20100608/regression/fail/modules.40.sml0000644000076600000240000000024111404435614017260 0ustar mtfstaffsignature SIG = sig type t structure S: sig type u = t type v sharing type u = v end end mlton-20100608/regression/fail/modules.41.sml0000644000076600000240000000014611404435614017265 0ustar mtfstaffsignature SIG = sig type t structure S: sig type u = t end where type u = t * t end mlton-20100608/regression/fail/modules.42.sml0000644000076600000240000000020411404435614017261 0ustar mtfstaffstructure S = struct end and S = struct end functor F () = struct end and F () = struct end signature S = sig end and S = sig end mlton-20100608/regression/fail/modules.43.sml0000644000076600000240000000006311404435614017265 0ustar mtfstaffsignature S = sig type ('a , 'a) t end mlton-20100608/regression/fail/modules.44.sml0000644000076600000240000000006711404435614017272 0ustar mtfstaffsignature S = sig datatype t = T of 'a end mlton-20100608/regression/fail/modules.45.sml0000644000076600000240000000010711404435614017266 0ustar mtfstaffsignature S = sig type 'a t end where type 'a t = int * 'b mlton-20100608/regression/fail/modules.46.sml0000644000076600000240000000005711404435614017273 0ustar mtfstaffsignature S = sig exception it end mlton-20100608/regression/fail/modules.47.sml0000644000076600000240000000006111404435614017267 0ustar mtfstaffsignature S = sig val true: bool end mlton-20100608/regression/fail/modules.48.sml0000644000076600000240000000022411404435614017271 0ustar mtfstaffsignature S = sig datatype t = T end structure S1: S = struct datatype t = T end structure S2: S where type t = int = S1 mlton-20100608/regression/fail/modules.49.sml0000644000076600000240000000046611404435614017302 0ustar mtfstaffsignature SIG = sig type t end functor F (structure S1: SIG structure S2: SIG sharing S1 = S2) = struct end structure S1: SIG = struct type t = int end structure S2: SIG = struct type t = real end structure Z = F (structure S1 = S1 structure S2 = S2) mlton-20100608/regression/fail/modules.5.sml0000644000076600000240000000011411404435614017200 0ustar mtfstaffsignature S = sig datatype t = T end where type t = int * int ; mlton-20100608/regression/fail/modules.50.sml0000644000076600000240000000033111404435614017261 0ustar mtfstaffsignature SIG = sig type t end structure S: sig structure S1: SIG end where type S1.t = int = struct structure S1: SIG = struct type t = real end end mlton-20100608/regression/fail/modules.51.sml0000644000076600000240000000067311404435614017273 0ustar mtfstaff(* * This example tests that a variable type containing unknown types is not * mistakenly generalized when matching a signature. *) structure S: sig val f: 'a option -> 'a option end = struct val f = let val r = ref NONE in fn z => (!r before (r := z)) end end val _ = S.f (SOME 13) val _ = case S.f (SOME (fn z => z)) of NONE => 15 | SOME f => f 17 mlton-20100608/regression/fail/modules.6.sml0000644000076600000240000000020411404435614017201 0ustar mtfstaffsignature S = sig type ('a, 'b) t type ('a, 'b) u type ('a, 'b) v = ('b, 'a) t sharing type u = v end mlton-20100608/regression/fail/modules.7.sml0000644000076600000240000000012211404435614017201 0ustar mtfstaffsignature S = sig type 'a t type u sharing type t = u end mlton-20100608/regression/fail/modules.8.sml0000644000076600000240000000012511404435614017205 0ustar mtfstaffsignature S = sig type t = int type u sharing type t = u end mlton-20100608/regression/fail/modules.9.sml0000644000076600000240000000013311404435614017205 0ustar mtfstaffsignature S = sig type t = int type u = int sharing type t = u end mlton-20100608/regression/fail/overloading-context.1.sml0000644000076600000240000000043311404435614021523 0ustar mtfstaff(* This must fail, because the overloading context can be no larger than the * smallest enclosing strdec. So, the declaration of double must be resolved * (with type int -> int) before continuing. *) structure S = struct fun double x = x + x end val _ = S.double 2.0 mlton-20100608/regression/fail/overloading-context.2.sml0000644000076600000240000000055611404435614021532 0ustar mtfstaff(* This program must fail because the semicolon means that the declarations * must be treated as two topdecs, not a single topdec leading to two strdec's. * This follows from the restriction on page 14 of the Definition that states * "No topdec may contain as an initial segment, a strdec followed by a * semicolon" *) fun double x = x + x; val y = double 2.0 mlton-20100608/regression/fail/overloading-context.3.sml0000644000076600000240000000007011404435614021522 0ustar mtfstaffval x = 0w0 signature S = sig end val _ = x: Word8.word mlton-20100608/regression/fail/overloading-context.4.sml0000644000076600000240000000004511404435614021525 0ustar mtfstaffval x = 0.0 ; val _ = x: Real32.real mlton-20100608/regression/fail/overloading-context.5.sml0000644000076600000240000000015611404435614021531 0ustar mtfstafffunctor F () = struct val x = 0w0 structure S = struct end val _ = x: Word8.word end mlton-20100608/regression/fail/overloading-context.6.sml0000644000076600000240000000015411404435614021530 0ustar mtfstaffstructure S = struct val x = 0w0 structure S = struct end val _ = x: Word8.word end mlton-20100608/regression/fail/pat.1.sml0000644000076600000240000000005311404435614016312 0ustar mtfstaffval _ = case 13.0 of 14.0 => () ; mlton-20100608/regression/fail/pat.2.sml0000644000076600000240000000002611404435614016313 0ustar mtfstaffval {x, x} = {x = 13} mlton-20100608/regression/fail/pat.3.sml0000644000076600000240000000003711404435614016316 0ustar mtfstaffval {x = y, x = z} = {x = 13}; mlton-20100608/regression/fail/pat.sml0000644000076600000240000000046511404435614016162 0ustar mtfstaffval NONE _ = () val _ :: 13 = [] val 13 : bool = 14 (* Precedence parsing *) val x _ _ = 13 val + _ = 13 val _ + = 13 val _ + _ = 13 local infixr 5 foo infix 5 bar in val x foo y bar z = 13 end val x _ = 13 val x : int as NONE = NONE val [13, "foo"] = [] val {foo, ...} = raise Fail "" mlton-20100608/regression/fail/rank.sml0000644000076600000240000000047711404435614016334 0ustar mtfstafflocal val f = let val f = (fn x => x) (fn x => x) in f end datatype t = A val g = fn x => let val d = #1 x val k = #2 x val s = f (d,k) val _ = if true then (d,k) else x in s end in val a : t * t = g (A,A) endmlton-20100608/regression/fail/sharing.2.sml0000644000076600000240000000033011404435614017160 0ustar mtfstafffunctor F (structure A: sig type t end structure B: sig end structure C: sig type t end sharing A = B sharing B = C) = struct val _: A.t -> C.t = fn x => x end mlton-20100608/regression/fail/sharing.sml0000644000076600000240000000013011404435614017016 0ustar mtfstaffsignature S = sig structure T: sig type t = int end sharing T = T end mlton-20100608/regression/fail/sig.1.sml0000644000076600000240000000010111404435614016302 0ustar mtfstaffsignature S = sig datatype t = A and u = A end mlton-20100608/regression/fail/sig.2.sml0000644000076600000240000000026611404435614016317 0ustar mtfstaffsignature S = sig type t end signature S1 = S where type t = int signature S2 = S where type t = real structure S1: S1 = struct type t = int end structure S2: S2 = S1 mlton-20100608/regression/fail/signature-and.sml0000644000076600000240000000004711404435614020133 0ustar mtfstaffsignature SIG = sig end and SIG' = SIG mlton-20100608/regression/fail/structure-and.sml0000644000076600000240000000004411404435614020167 0ustar mtfstaffstructure S = struct end and S' = S mlton-20100608/regression/fail/type-use-before-def.sml0000644000076600000240000000006411404435614021140 0ustar mtfstaffval r = ref NONE datatype t = T val _ = r := SOME T mlton-20100608/regression/fail/type.1.sml0000644000076600000240000000003311404435614016505 0ustar mtfstafftype t = {x: int, x: real} mlton-20100608/regression/fail/type.2.sml0000644000076600000240000000003211404435614016505 0ustar mtfstafftype t = int and t = real mlton-20100608/regression/fail/type.sml0000644000076600000240000000010611404435614016347 0ustar mtfstafftype t = u type 'a t = unit type u = t datatype 'a t = T type u = t mlton-20100608/regression/fail/tyvar-scope.1.sml0000644000076600000240000000011311404435614017777 0ustar mtfstafffun 'a f (x: 'a) = let fun 'a g (y: 'a) = y in () end mlton-20100608/regression/fail/tyvar-scope.2.sml0000644000076600000240000000011011404435614017775 0ustar mtfstafffun f (x: 'a) = let fun 'a g (y: 'a) = y in () end mlton-20100608/regression/fail/tyvar-scope.3.sml0000644000076600000240000000014411404435614020005 0ustar mtfstaffval _ = fn () => let exception E of 'a val 'a f = fn z => z in () end mlton-20100608/regression/fail/val-rec-constructor.2.sml0000644000076600000240000000005011404435614021440 0ustar mtfstaffval rec SOME = fn _ => raise Fail "foo" mlton-20100608/regression/fail/val-rec-constructor.sml0000644000076600000240000000003311404435614021301 0ustar mtfstaffval rec NONE = fn () => () mlton-20100608/regression/fast.ok0000644000076600000240000000000711404435617015231 0ustar mtfstaffAll ok mlton-20100608/regression/fast.sml0000644000076600000240000000031011404435620015402 0ustar mtfstafffun loop (left: Int.int): unit = case Int.compare (left, 0) of LESS => () | EQUAL => () | GREATER => loop (left + ~1) val _ = loop 100000000 val _ = print "All ok\n" mlton-20100608/regression/fast2.ok0000644000076600000240000000000711404435620015305 0ustar mtfstaffAll ok mlton-20100608/regression/fast2.sml0000644000076600000240000000023311404435617015476 0ustar mtfstafffun loop (left: Int.int): unit = if left = 0 then () else loop (left + ~1) val _ = loop 100000000 val _ = print "All ok\n" mlton-20100608/regression/ffi-opaque.sml0000644000076600000240000000106511404435617016517 0ustar mtfstaffstructure S:> sig type t val x: t val g: t -> unit end = struct type t = int val x = 13 fun g x = () end val f = _import "f": S.t -> unit; val _ = fn () => f S.x val e = _export "g1": (S.t -> unit) -> unit; val _ = fn () => e S.g structure S:> sig type t val f: t -> unit val x: t end = struct type t = int -> unit fun f g = g 13 fun x _ = () end val p = _import "f": S.t; val _ = fn () => S.f p val e = _export "g2": S.t -> unit; val _ = fn () => e S.x mlton-20100608/regression/ffi.ok0000644000076600000240000000000311404435617015034 0ustar mtfstaffok mlton-20100608/regression/ffi.sml0000644000076600000240000000002511404435620015214 0ustar mtfstaffval _ = print "ok\n" mlton-20100608/regression/fft.ok0000644000076600000240000000007411404435617015057 0ustar mtfstaff fft by Torben Mogensen (torbenm@diku.dk) fft'ing... done mlton-20100608/regression/fft.sml0000644000076600000240000000336711404435617015251 0ustar mtfstaff(*fft.sml*) (*by Torben Mogensen (torbenm@diku.dk)*) val pi = 3.14159265358979 fun pr (s : string) : unit = print(s) exception Impossible fun impossible s = impossible0 (s ^ "\n") and impossible0 s = (pr ("\nimpossible: " ^ s); raise Impossible) fun zipWith f ([],[]) = [] | zipWith f ((a::b),(c::d)) = f (a,c) :: zipWith f (b,d) | zipWith f _ = impossible "zipWith" fun zip ([],[]) = [] | zip ((a::b),(c::d)) = (a,c) :: zip (b,d) | zip _ = impossible "zip" fun ~+ ((x:real,y:real),(v,w)) = (x+v,y+w) fun ~- ((x:real,y:real),(v,w)) = (x-v,y-w) fun ~* ((x:real,y:real),(v,w)) = (x*v-y*w,x*w+y*v) fun evens [] = [] | evens (x::y::l) = x :: evens l | evens _ = impossible "evens" fun odds [] = [] | odds (x::y::l) = y :: odds l | odds _ = impossible "odds" fun fmul (c,pin,[]) = [] | fmul (c,pin,(a::b)) = ~*((Math.cos(c),Math.sin(c)), a) :: fmul (c+pin,pin,b) fun cp [] = [] | cp (a::b) = a :: cp b fun fft ([(a,b)], 1) = [(a+0.0,b+0.0)] | fft (x, n2) = let val n = n2 div 2 val a = fft (evens x, n) val cb = fmul (0.0,pi/(real n),fft (odds x, n)) in let val l1 = zipWith ~+ (a,cb) val l2 = zipWith ~- (a,cb) in (*resetRegions a; resetRegions cb;*) l1 @ l2 end end local val a = 16807.0 and m = 2147483678.0 in fun nextrand seed = let val t = a*seed in t - m * real(floor (t/m)) end end fun mkList(tr as (seed,0,acc)) = tr | mkList(seed,n,acc) = mkList(nextrand seed, n-1, seed::acc) val n = 256 * 256 fun run () = (pr "\nfft by Torben Mogensen (torbenm@diku.dk)\n\nfft'ing... "; let val r = fft (zip (#3(mkList(7.0,n,[])), #3(mkList(8.0,n,[]))), n) in pr " done\n" end); val _ = run () mlton-20100608/regression/filesys.ok0000644000076600000240000000163711404435620015756 0ustar mtfstaff File filesys.sml: Testing structure FileSys... test1a OK test1b OK test2 OK test3a OK test4a OK test4b OK test4c OK test4d OK test5 OK test6a OK test6b OK test6c OK test6d OK test6e OK test6f OK test6g OK test6h OK test6i OK test6j OK test6k OK test6l OK test7a OK test7b OK test7c OK test7d OK test7e OK test8a OK test8b OK test8c OK test8d OK test8e OK test8f OK test8g OK test8h OK test9a OK test9b OK test10a OK test10b OK test10c OK test11a OK test11b OK test11c OK test12a OK test12b OK test12c OK test13a OK test13b OK test13c OK test13d OK test13e OK test14 OK test15a OK test15b OK test15b1 OK test15b2 OK test15b3 OK test15c OK test15d OK test15e OK test15f OK test15g OK mlton-20100608/regression/filesys.sml0000644000076600000240000002104611404435617016142 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/filesys.sml PS 1995-03-23, 1996-05-01, 1998-04-06 *) (* DOS: Plain WRONG: test6a, test9a (and test9b); Excusable: test8b, test11b, test12a, test13a, test13b, test13c *) (* The test requires three symbolic links to be present in the current directory: testlink -> README testcycl -> testcycl testbadl -> exists.not Moreover, the file README must exist and the file exists.not not. Also, the test requires one hard link between file hardlinkA and file hardlinkB. *) val _ = print "\nFile filesys.sml: Testing structure FileSys...\n" local open OS.FileSys (* Clean up: *) val _ = (rmDir "testdir") handle OS.SysErr _ => (); val _ = (rmDir "testdir2") handle OS.SysErr _ => (); val test1a = tst0 "test1a" ((mkDir "testdir" seq "OK") handle _ => "WRONG") val test1b = tst0 "test1b" ((mkDir "testdir" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test2 = tst' "test2" (fn _ => isDir "testdir"); val test3a = tst' "test3a" (fn _ => access("testdir", [A_READ, A_EXEC, A_WRITE])); local val cdir = getDir(); in val test4a = tst0 "test4a" ((chDir cdir seq "OK") handle _ => "WRONG") val test4b = tst' "test4b" (fn _ => cdir = getDir()); val _ = chDir "testdir"; val test4c = tst' "test4c" (fn _ => cdir <> getDir()); val _ = chDir ".."; val test4d = tst' "test4d" (fn _ => cdir = getDir()); end; val _ = rename{old = "testdir", new = "exists.not"}; val test5 = tst0 "test5" ((rmDir "exists.not" seq "OK") handle _ => "WRONG") val test6a = tst0 "test6a" ((openDir "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6b = tst0 "test6b" ((isDir "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6c = tst0 "test6c" ((rmDir "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6d = tst0 "test6d" ((chDir "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6e = tst0 "test6e" ((fullPath "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6f = tst0 "test6f" ((realPath "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6g = tst0 "test6g" ((modTime "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6h = tst0 "test6h" ((setTime("exists.not", NONE) seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6i = tst0 "test6i" ((remove "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6j = tst0 "test6j" ((rename{old="exists.not", new="testdir2"} seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6k = tst0 "test6k" ((fileSize "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test6l = tst' "test6l" (fn _ => not (access("exists.not", []))); val _ = mkDir "testdir"; local val dstr = openDir "testdir"; in val test7a = tst' "test7a" (fn _ => NONE = readDir dstr); val _ = rewindDir dstr; val test7b = tst' "test7b" (fn _ => NONE = readDir dstr); val _ = closeDir dstr; val test7c = tst0 "test7c" ((readDir dstr seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test7d = tst0 "test7d" ((rewindDir dstr seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test7e = tst0 "test7e" ((closeDir dstr seq "OK") handle _ => "WRONG") end val _ = List.app (fn (new, old) => if isLink new handle OS.SysErr _ => false then () else Posix.FileSys.symlink {new = new, old = old}) [("testlink", "README"), ("testcycl", "testcycl"), ("testbadl", "exists.not")] val test8a = tst' "test8a" (fn _ => fullPath "." = getDir ()); val test8b = tst' "test8b" (fn _ => fullPath "testlink" = getDir() ^ "/README"); val test8c = tst0 "test8c" ((fullPath "testcycl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test8d = tst0 "test8d" ((fullPath "testbadl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test8e = tst' "test8e" (fn _ => realPath "." = "."); val test8f = tst' "test8f" (fn _ => realPath "testlink" = "README"); val test8g = tst0 "test8g" ((realPath "testcycl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test8h = tst0 "test8h" ((realPath "testbadl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test9a = tst' "test9a" (fn _ => setTime ("README", SOME (Time.fromReal 1E6)) = ()); val test9b = tst' "test9b" (fn _ => modTime "README" = Time.fromReal 1E6); val test10a = tst0 "test10a" ((remove "testdir" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test10b = tst' "test10b" (fn _ => rename{old = "testdir", new = "testdir2"} = ()); val test10c = tst' "test10c" (fn _ => isDir "testdir2"); val test11a = tst' "test11a" (fn _ => not (access ("testdir", []))); val test11b = tst' "test11b" (fn _ => access("testlink", [])); val test11c = tst' "test11c" (fn _ => not (access("testbadl", []))); val test12a = tst' "test12a" (fn _ => isLink "testcycl" andalso isLink "testlink" andalso isLink "testbadl"); val test12b = tst' "test12b" (fn _ => not (isLink "testdir2" orelse isLink "README")); val test12c = tst0 "test12c" ((isLink "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test13a = tst' "test13a" (fn _ => readLink "testcycl" = "testcycl"); val test13b = tst' "test13b" (fn _ => readLink "testlink" = "README"); val test13c = tst' "test13c" (fn _ => readLink "testbadl" = "exists.not"); val test13d = tst0 "test13d" ((readLink "testdir2" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test13e = tst0 "test13e" ((readLink "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test14 = tst0 "test14" ((tmpName () seq "OK")) val test15a = tst' "test15a" (fn _ => fileId "." = fileId "." andalso fileId "testlink" = fileId "README" andalso fileId "." <> fileId "README"); val test15b = tst' "test15b" (fn _ => compare(fileId ".", fileId ".") = EQUAL) val test15b1 = tst' "test15b1" (fn _ => compare(fileId ".", fileId "README") <> EQUAL) val test15b2 = tst' "test15b2" (fn _ => compare(fileId "testlink", fileId "README") = EQUAL) val test15b3 = tst' "test15b3" (fn _ => (compare(fileId ".", fileId "README") = LESS andalso compare(fileId "README", fileId ".") = GREATER orelse compare(fileId ".", fileId "README") = GREATER andalso compare(fileId "README", fileId ".") = LESS)); val test15c = tst0 "test15c" ((fileId "exists.not" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test15d = tst0 "test15d" ((fileId "testbadl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") val test15e = tst0 "test15e" ((fileId "testcycl" seq "WRONG") handle OS.SysErr _ => "OK" | _ => "WRONG") (* Unix only: *) val _ = (if access ("hardlinkA", []) then () else TextIO.closeOut (TextIO.openOut "hardlinkA") ; if access ("hardlinkB", []) then () else Posix.FileSys.link {old = "hardlinkA", new = "hardlinkB"}) val test15f = tst' "test15f" (fn _ => fileId "hardlinkA" = fileId "hardlinkB") val test15g = tst' "test15g" (fn _ => compare(fileId "hardlinkA", fileId "hardlinkB") = EQUAL) val _ = rmDir "testdir2"; in end mlton-20100608/regression/finalize.2.ok0000644000076600000240000000002611404435617016236 0ustar mtfstaff2 3 4 5 6 7 8 9 10 13 mlton-20100608/regression/finalize.2.sml0000644000076600000240000000062511404435620016417 0ustar mtfstaffstructure F = MLton.Finalizable fun loop (n, f) = if n = 0 then () else let val f' = F.new n val _ = F.addFinalizer (f', fn _ => F.withValue (f, fn n => print (concat [Int.toString n, "\n"]))) in loop (n - 1, f') end val r = loop (10, F.new 13) mlton-20100608/regression/finalize.3.ok0000644000076600000240000000014111404435620016227 0ustar mtfstaffbefore test 4 before GC 4a after GC 4a invoking touch before GC 4b test 4: finalizer after GC 4b mlton-20100608/regression/finalize.3.sml0000644000076600000240000000100411404435621016411 0ustar mtfstafffun test2 (str : string) = let open MLton.Finalizable val x = new str in addFinalizer (x, fn s => print (s ^ ": finalizer\n")); (fn () => (print "invoking touch\n"; touch x)) end val _ = (print "before test 4\n"; let val t = test2 "test 4" in print "before GC 4a\n"; MLton.GC.collect (); print "after GC 4a\n"; t (); print "before GC 4b\n"; MLton.GC.collect (); print "after GC 4b\n" end) mlton-20100608/regression/finalize.4.ok0000644000076600000240000000022111404435620016227 0ustar mtfstaffbefore test 5 before GC 5 after GC 5 before GC 5a after GC 5a invoking touch before GC 5b test 5: finalizer after GC 5b before GC 5c after GC 5c mlton-20100608/regression/finalize.4.sml0000644000076600000240000000143711404435617016431 0ustar mtfstafffun test (str : string) = let open MLton.Finalizable val x = new str in addFinalizer (x, fn s => print (s ^ ": finalizer\n")); withValue (x, fn s => (print "before GC 5\n"; MLton.GC.collect (); print "after GC 5\n"; (fn () => (print "invoking touch\n"; touch x)))) end val _ = (print "before test 5\n"; let val t = test "test 5" in print "before GC 5a\n"; MLton.GC.collect (); print "after GC 5a\n"; t (); print "before GC 5b\n"; MLton.GC.collect (); print "after GC 5b\n" end; print "before GC 5c\n"; MLton.GC.collect (); print "after GC 5c\n") mlton-20100608/regression/finalize.5.ok0000644000076600000240000000012011404435620016226 0ustar mtfstaffbefore test 6 before GC 6 after GC 6 before GC 6a test 6: finalizer after GC 6a mlton-20100608/regression/finalize.5.sml0000644000076600000240000000106111404435617016423 0ustar mtfstafffun test (str : string) = let open MLton.Finalizable val x = new str exception Exit in addFinalizer (x, fn s => print (s ^ ": finalizer\n")); withValue (x, fn s => (print "before GC 6\n"; MLton.GC.collect (); print "after GC 6\n"; raise Exit)) handle Exit => () end val _ = (print "before test 6\n"; test "test 6"; print "before GC 6a\n"; MLton.GC.collect (); print "after GC 6a\n") mlton-20100608/regression/finalize.6.ok0000644000076600000240000000746411404435621016252 0ustar mtfstaff5000000 4990000 4980000 4970000 4960000 4950000 4940000 4930000 4920000 4910000 4900000 4890000 4880000 4870000 4860000 4850000 4840000 4830000 4820000 4810000 4800000 4790000 4780000 4770000 4760000 4750000 4740000 4730000 4720000 4710000 4700000 4690000 4680000 4670000 4660000 4650000 4640000 4630000 4620000 4610000 4600000 4590000 4580000 4570000 4560000 4550000 4540000 4530000 4520000 4510000 4500000 4490000 4480000 4470000 4460000 4450000 4440000 4430000 4420000 4410000 4400000 4390000 4380000 4370000 4360000 4350000 4340000 4330000 4320000 4310000 4300000 4290000 4280000 4270000 4260000 4250000 4240000 4230000 4220000 4210000 4200000 4190000 4180000 4170000 4160000 4150000 4140000 4130000 4120000 4110000 4100000 4090000 4080000 4070000 4060000 4050000 4040000 4030000 4020000 4010000 4000000 3990000 3980000 3970000 3960000 3950000 3940000 3930000 3920000 3910000 3900000 3890000 3880000 3870000 3860000 3850000 3840000 3830000 3820000 3810000 3800000 3790000 3780000 3770000 3760000 3750000 3740000 3730000 3720000 3710000 3700000 3690000 3680000 3670000 3660000 3650000 3640000 3630000 3620000 3610000 3600000 3590000 3580000 3570000 3560000 3550000 3540000 3530000 3520000 3510000 3500000 3490000 3480000 3470000 3460000 3450000 3440000 3430000 3420000 3410000 3400000 3390000 3380000 3370000 3360000 3350000 3340000 3330000 3320000 3310000 3300000 3290000 3280000 3270000 3260000 3250000 3240000 3230000 3220000 3210000 3200000 3190000 3180000 3170000 3160000 3150000 3140000 3130000 3120000 3110000 3100000 3090000 3080000 3070000 3060000 3050000 3040000 3030000 3020000 3010000 3000000 2990000 2980000 2970000 2960000 2950000 2940000 2930000 2920000 2910000 2900000 2890000 2880000 2870000 2860000 2850000 2840000 2830000 2820000 2810000 2800000 2790000 2780000 2770000 2760000 2750000 2740000 2730000 2720000 2710000 2700000 2690000 2680000 2670000 2660000 2650000 2640000 2630000 2620000 2610000 2600000 2590000 2580000 2570000 2560000 2550000 2540000 2530000 2520000 2510000 2500000 2490000 2480000 2470000 2460000 2450000 2440000 2430000 2420000 2410000 2400000 2390000 2380000 2370000 2360000 2350000 2340000 2330000 2320000 2310000 2300000 2290000 2280000 2270000 2260000 2250000 2240000 2230000 2220000 2210000 2200000 2190000 2180000 2170000 2160000 2150000 2140000 2130000 2120000 2110000 2100000 2090000 2080000 2070000 2060000 2050000 2040000 2030000 2020000 2010000 2000000 1990000 1980000 1970000 1960000 1950000 1940000 1930000 1920000 1910000 1900000 1890000 1880000 1870000 1860000 1850000 1840000 1830000 1820000 1810000 1800000 1790000 1780000 1770000 1760000 1750000 1740000 1730000 1720000 1710000 1700000 1690000 1680000 1670000 1660000 1650000 1640000 1630000 1620000 1610000 1600000 1590000 1580000 1570000 1560000 1550000 1540000 1530000 1520000 1510000 1500000 1490000 1480000 1470000 1460000 1450000 1440000 1430000 1420000 1410000 1400000 1390000 1380000 1370000 1360000 1350000 1340000 1330000 1320000 1310000 1300000 1290000 1280000 1270000 1260000 1250000 1240000 1230000 1220000 1210000 1200000 1190000 1180000 1170000 1160000 1150000 1140000 1130000 1120000 1110000 1100000 1090000 1080000 1070000 1060000 1050000 1040000 1030000 1020000 1010000 1000000 990000 980000 970000 960000 950000 940000 930000 920000 910000 900000 890000 880000 870000 860000 850000 840000 830000 820000 810000 800000 790000 780000 770000 760000 750000 740000 730000 720000 710000 700000 690000 680000 670000 660000 650000 640000 630000 620000 610000 600000 590000 580000 570000 560000 550000 540000 530000 520000 510000 500000 490000 480000 470000 460000 450000 440000 430000 420000 410000 400000 390000 380000 370000 360000 350000 340000 330000 320000 310000 300000 290000 280000 270000 260000 250000 240000 230000 220000 210000 200000 190000 180000 170000 160000 150000 140000 130000 120000 110000 100000 90000 80000 70000 60000 50000 40000 30000 20000 10000 mlton-20100608/regression/finalize.6.sml0000644000076600000240000000213111404435617016423 0ustar mtfstaffstructure Bug = struct structure F = MLton.Finalizable fun new_t () = let val p = 0 val t = F.new p fun finalize x = () in F.addFinalizer(t,finalize); t end fun from_string (_:string) = let val x = new_t () in F.withValue(x,fn p => ()); x end val zero = from_string "0.0" (* NOTE: I removed the F.withValue lines in an attempt to make the code simpler, but the bug didn't manifest itself. So I think these lines are critical. *) fun plus (x,y) = let val z = new_t () in F.withValue(x,fn xp => F.withValue(y,fn yp => F.withValue(z,fn zp => let in z end))) end end structure B = Bug fun bigsum (n,store) = if n = 0 then store else let val _ = if Int.mod(n,10000) = 0 then print (Int.toString n ^ "\n") else () in bigsum(Int.-(n,1),B.plus(store,B.from_string(Int.toString n ^ ".0"))) end val bigsum = (fn n => bigsum(n,B.zero)) val x = bigsum 5000000 mlton-20100608/regression/finalize.ok0000644000076600000240000000004411404435621016071 0ustar mtfstaff3 gone. 2 gone. 1 1 gone. 0 0 gone. mlton-20100608/regression/finalize.sml0000644000076600000240000000143411404435617016264 0ustar mtfstaffstructure F = MLton.Finalizable val n = 4 val fs = Array.tabulate (n, fn i => let val f = F.new i val _ = F.addFinalizer (f, fn i => print (concat [Int.toString i, " gone.\n"])) in f end) fun sub i = F.withValue (Array.sub (fs, i), fn i => i) val f = F.new 13 fun clear i = Array.update (fs, i, f) val _ = clear 3 val _ = clear 2 val _ = MLton.GC.collect () fun pi x = print (concat [Int.toString x, "\n"]) val _ = pi (sub 0 + sub 1) val _ = clear 1 val _ = MLton.GC.collect () val _ = pi (sub 0) val _ = clear 0 val _ = MLton.GC.collect () mlton-20100608/regression/fixed-integer.ok0000644000076600000240000000031411404435617017027 0ustar mtfstaffTesting Int2 Testing Int3 Testing Int4 Testing Int7 Testing Int8 Testing Int9 Testing Int13 Testing Int16 Testing Int17 Testing Int20 Testing Int25 Testing Int30 Testing Int31 Testing Int32 Testing Int64 mlton-20100608/regression/fixed-integer.sml0000644000076600000240000001551411404435617017221 0ustar mtfstafffunctor Test (I: INTEGER) = struct fun foreach (l, f) = List.app f l val m = concat ["Int", Int.toString (valOf I.precision)] val _ = print (concat ["Testing ", m, "\n"]) val nums = [valOf I.maxInt, I.- (valOf I.maxInt, I.fromInt 1)] @ (List.foldl (fn (i, ac) => case SOME (I.fromInt i) handle Overflow => NONE of NONE => ac | SOME i => i :: ac) [] [100, 10, 5, 2, 1, 0, ~1, ~2, ~5, ~10, ~100]) @ [I.+ (I.fromInt 1, valOf I.minInt), valOf I.minInt] fun err msg = print (concat [m, ": ", concat msg, "\n"]) datatype z = datatype StringCvt.radix val _ = foreach (nums, fn i => foreach ([("toString", I.toString, LargeInt.toString), ("fmt BIN", I.fmt BIN, LargeInt.fmt BIN), ("fmt OCT", I.fmt OCT, LargeInt.fmt OCT), ("fmt DEC", I.fmt DEC, LargeInt.fmt DEC), ("fmt HEX", I.fmt HEX, LargeInt.fmt HEX)], fn (name, f, f') => let val s = f i val s' = f' (I.toLarge i) handle Overflow => "Overflow" in if s = s' then () else err [name, " ", s, " <> ", name, " ", s'] end)) structure Answer = struct datatype t = Div | Int of I.int | Overflow val toString = fn Div => "Div" | Int i => I.toString i | Overflow => "Overflow" fun run (f: unit -> I.int): t = Int (f ()) handle General.Div => Div | General.Overflow => Overflow val equals: t * t -> bool = op = end val _ = foreach (nums, fn i => let val a1 = Answer.Int i val a2 = Answer.run (fn () => I.fromLarge (I.toLarge i)) in if Answer.equals (a1, a2) then () else err ["fromLarge (toLarge ", I.toString i, ") = ", Answer.toString a2] end) val _ = foreach ([("abs", I.abs, LargeInt.abs), ("~", I.~, LargeInt.~), ("fromString o toString", valOf o I.fromString o I.toString, valOf o LargeInt.fromString o LargeInt.toString)], fn (name, f, f') => foreach (nums, fn i => let val a = Answer.run (fn () => f i) val a' = Answer.run (fn () => I.fromLarge (f' (I.toLarge i))) in if Answer.equals (a, a') then () else err [name, " ", I.toString i, " = ", Answer.toString a, " <> ", Answer.toString a'] end)) val _ = foreach (nums, fn i => foreach ([("BIN", BIN), ("OCT", OCT), ("DEC", DEC), ("HEX", HEX)], fn (rName, r) => let val i' = valOf (StringCvt.scanString (I.scan r) (I.fmt r i)) in if i = i' then () else err ["scan ", rName, " ", I.toString i, " = ", I.toString i'] end)) val _ = foreach ([("sign", I.sign, LargeInt.sign), ("toInt", I.toInt, LargeInt.toInt)], fn (name, f, f') => foreach (nums, fn i => let val a = Answer.run (fn () => I.fromInt (f i)) val a' = Answer.run (fn () => I.fromInt (f' (I.toLarge i))) in if Answer.equals (a, a') then () else err [name, " ", I.toString i, " = ", Answer.toString a, " <> ", Answer.toString a'] end)) val _ = foreach ([("+", I.+, LargeInt.+), ("-", I.-, LargeInt.-), ("*", I.*, LargeInt.* ), ("div", I.div, LargeInt.div), ("max", I.max, LargeInt.max), ("min", I.min, LargeInt.min), ("mod", I.mod, LargeInt.mod), ("quot", I.quot, LargeInt.quot), ("rem", I.rem, LargeInt.rem)], fn (name, f: I.int * I.int -> I.int, f': LargeInt.int * LargeInt.int -> LargeInt.int) => foreach (nums, fn i: I.int => foreach (nums, fn j: I.int => let val a = Answer.run (fn () => f (i, j)) val a' = Answer.run (fn () => I.fromLarge (f' (I.toLarge i, I.toLarge j))) in if Answer.equals (a, a') then () else err [I.toString i, " ", name, " ", I.toString j, " = ", Answer.toString a, " <> ", Answer.toString a'] end))) val _ = foreach ([(">", I.>, LargeInt.>), (">=", I.>=, LargeInt.>=), ("<", I.<, LargeInt.<), ("<=", I.<=, LargeInt.<=), ("sameSign", I.sameSign, LargeInt.sameSign)], fn (name, f, f') => foreach (nums, fn i: I.int => foreach (nums, fn j: I.int => let val b = f (i, j) val b' = f' (I.toLarge i, I.toLarge j) in if b = b' then () else err [I.toString i, " ", name, " ", I.toString j, " = ", Bool.toString b, " <> ", Bool.toString b'] end))) structure Order = struct datatype t = datatype order val equals: t * t -> bool = op = val toString = fn EQUAL => "EQUAL" | GREATER => "GREATER" | LESS => "LESS" end val _ = foreach (nums, fn i => foreach (nums, fn j => let val ord = I.compare (i, j) val ord' = LargeInt.compare (I.toLarge i, I.toLarge j) in if Order.equals (ord, ord') then () else err ["compare (", I.toString i, ", ", I.toString j, ") = ", Order.toString ord, " <> ", Order.toString ord'] end)) end structure S = Test (Int2) structure S = Test (Int3) structure S = Test (Int4) structure S = Test (Int7) structure S = Test (Int8) structure S = Test (Int9) structure S = Test (Int13) structure S = Test (Int16) structure S = Test (Int17) structure S = Test (Int20) structure S = Test (Int25) structure S = Test (Int30) structure S = Test (Int31) structure S = Test (Int32) structure S = Test (Int64) mlton-20100608/regression/flat-array.2.ok0000644000076600000240000000000611404435620016467 0ustar mtfstaff12 14 mlton-20100608/regression/flat-array.2.sml0000644000076600000240000000050711404435617016665 0ustar mtfstaffval n = 20 val a = Array.tabulate (n, fn i => (i, Array.array (1, 1))) val (i, a') = Array.sub (a, 13) val _ = Array.update (a', 0, i + Array.sub (a', 0)) val _ = print (concat [Int.toString (#1 (Array.sub (a, 12))), " ", Int.toString (Array.sub (#2 (Array.sub (a, 13)), 0)), "\n"]) mlton-20100608/regression/flat-array.3.ok0000644000076600000240000000000611404435620016470 0ustar mtfstaff2 101 mlton-20100608/regression/flat-array.3.sml0000644000076600000240000000042311404435617016663 0ustar mtfstaffval a = Array.tabulate (100, fn i => (i, real i)) val _ = Array.update (a, 0, (1, 100.0)) val i = #1 (Array.sub (a, 0)) + #1 (Array.sub (a, 1)) val x = #2 (Array.sub (a, 0)) + #2 (Array.sub (a, 1)) val () = print (concat [Int.toString i, " ", Real.toString x, "\n"]) mlton-20100608/regression/flat-array.ok0000644000076600000240000000000411404435617016333 0ustar mtfstaff0 3 mlton-20100608/regression/flat-array.sml0000644000076600000240000000063011404435617016522 0ustar mtfstaffval n = 20 val a = Array.tabulate (n, fn _ => (Array.array (1, 0), Array.array (1, 1))) val (a1, a2) = Array.sub (a, 13) val _ = Array.update (a1, 0, 2) val _ = Array.update (a2, 0, 3) val _ = print (concat [Int.toString (Array.sub (#1 (Array.sub (a, 12)), 0)), " ", Int.toString (Array.sub (#2 (Array.sub (a, 13)), 0)), "\n"]) mlton-20100608/regression/flat-vector.ok0000644000076600000240000000002011404435620016507 0ustar mtfstaffshould be 08 08 mlton-20100608/regression/flat-vector.sml0000644000076600000240000000040311404435617016704 0ustar mtfstaffval v = Vector.tabulate (10, (fn x => let fun toChar x = Char.chr (Char.ord #"0" + x) in (toChar 0, toChar x) end)) val x = Vector.sub (v, 8) val _ = print "should be 08\n" val _ = print (str (#1 x) ^ str (#2 x) ^ "\n") mlton-20100608/regression/flexrecord.2.ok0000644000076600000240000000000011404435620016554 0ustar mtfstaffmlton-20100608/regression/flexrecord.2.sml0000644000076600000240000000122711404435621016753 0ustar mtfstaffdatatype b = TRUE | FALSE datatype nat = Z | S of nat fun lt (Z, S _) = TRUE | lt (S n1, S n2) = lt (n1, n2) | lt _ = FALSE fun ZZZ_f (a, b) = lt (#value a, #value b) fun ZZZ_copyTo (array, record as {value, offset}) = fn S Z => {value = value, offset = S (S (S Z))} | n => array n fun ZZZ_fixTooBig (array, record) = let val left = array (S Z) val right = array (S (S Z)) val small = case ZZZ_f (left, right) of TRUE => left | FALSE => right in case ZZZ_f (record, small) of TRUE => ZZZ_copyTo (array, record) | FALSE => ZZZ_copyTo (array, small) end mlton-20100608/regression/flexrecord.ok0000644000076600000240000000000011404435617016422 0ustar mtfstaffmlton-20100608/regression/flexrecord.sml0000644000076600000240000000272611404435617016625 0ustar mtfstaff(* flexrecord.sml *) (* Checks type inference for flexible records. *) (* flexrecord1 *) fun f(r as {...}) = let fun g() = r in [r, {a=1}] end; (* flexrecord1 *) (* flexrecord2 *) val _ = let val g = #foo val _ = g {foo = 13} val _ = g {foo = "yes"} in () end (* flexrecord2 *) (* flexrecord3 *) val _ = let val g = #foo val _ = g {foo = 13, goo = 1.0} val _ = g {foo = "yes", goo = 1.0} in () end (* flexrecord3 *) (* flexrecord4 *) val _ = let val g = #foo val _ = g {foo = 13, goo = 1.0} val _ = g {foo = "yes", goo = false} in () end (* flexrecord4 *) (* flexrecord5 *) val _ = let val f = #foo val g = fn h => fn y => h (f y) val h = fn x => f x val _ = f {foo=0, bar=1} in () end (* flexrecord5 *) (* flexrecord6 *) val _ = fn x => let val _: string = #1 x fun id z = z fun g () = let val (_, a) = x in a end in g () end (* flexrecord6 *) (* flexrecord7 *) val _ = let fun f r = { a = #a r, b = #b r } val _ = f { a = 0.0, b = 0.0 } in () end (* flexrecord7 *) (* flexrecord8 *) val _ = fn _ => let val f = #foo val g = (fn x => x) f val _ = f {foo=0, bar=1} in () end (* flexrecord8 *) (* flexrecord9 *) val g = fn {...} => () and h = fn () => () val () = (h (); g {a = 13}) (* flexrecord9 *) mlton-20100608/regression/format.sml0000644000076600000240000000347711404435617015764 0ustar mtfstaff(* * This is based on * Functional Unparsing * BRICS Technical Report RS 98-12 * Olivier Danvy, May 1998 *) signature FORMAT = sig type ('a, 'b) t val eol: ('a, 'a) t val format: (string, 'a) t -> 'a val int: ('a, int -> 'a) t val list: ('a, 'b -> 'a) t -> ('a, 'b list -> 'a) t val lit: string -> ('a, 'a) t val new: ('b -> string) -> ('a, 'b -> 'a) t val o: ('a, 'b) t * ('c, 'a) t -> ('c, 'b) t val string: ('a, string -> 'a) t end structure Format:> FORMAT = struct type ('a, 'b) t = (string list -> 'a) * string list -> 'b val new: ('b -> string) -> ('a, 'b -> 'a) t = fn toString => fn (k, ss) => fn b => k (toString b :: ss) val lit: string -> ('a, 'a) t = fn s => fn (k, ss) => k (s :: ss) val eol: ('a, 'a) t = fn z => lit "\n" z val format: (string, 'a) t -> 'a = fn f => f (concat o rev, []) val int: ('a, int -> 'a) t = fn z => new Int.toString z val list: ('a, 'b -> 'a) t -> ('a, 'b list -> 'a) t = fn f => fn (k, ss) => fn [] => k ("[]" :: ss) | x :: xs => let fun loop xs ss = case xs of [] => k ("]" :: ss) | x :: xs => f (loop xs, ", " :: ss) x in f (loop xs, "[" :: ss) x end val op o: ('a, 'b) t * ('c, 'a) t -> ('c, 'b) t = fn (f, g) => fn (k, ss) => f (fn ss => g (k, ss), ss) val string: ('a, string -> 'a) t = fn z => new (fn s => s) z end open Format val _ = if "abc" = format (lit "abc") andalso "abc" = format string "abc" andalso "abc" = format (lit "a" o lit "b" o lit "c") andalso "abc" = format (string o string o string) "a" "b" "c" andalso "[a, b, c]" = format (list string) ["a", "b", "c"] andalso "[1, 2, 3]" = format (list int) [1, 2, 3] then () else raise Fail "bug" mlton-20100608/regression/ftruncate.ok0000644000076600000240000000000611404435621016261 0ustar mtfstaffhello mlton-20100608/regression/ftruncate.sml0000644000076600000240000000110411404435621016443 0ustar mtfstaffval tmp = "tmp" val () = let open TextIO val out = openOut tmp val () = output (out, "hello, there\n") val () = closeOut out in () end val () = let open Posix open FileSys val fd = openf (tmp, O_WRONLY, O.flags []) val () = ftruncate (fd, 5) val () = IO.close fd in () end val () = let open TextIO val ins = openIn tmp val () = print (TextIO.inputAll ins) val () = print "\n" val () = closeIn ins in () end val () = OS.FileSys.remove tmp mlton-20100608/regression/FuhMishra.ok0000644000076600000240000000054311404435620016161 0ustar mtfstaff processing outFuhMishra0...running TYPE...running MATCH... processing outFuhMishra1...running TYPE...running MATCH... processing outFuhMishra2...running TYPE...running MATCH... processing outFuhMishra3...running TYPE...running MATCH... processing outFuhMishra4...running TYPE...running MATCH... processing outFuhMishra5...running TYPE...running MATCH... mlton-20100608/regression/FuhMishra.sml0000644000076600000240000004014711404435617016355 0ustar mtfstaffval toString = Int.toString (* Ported to kit 23/4/97 by Mads. Commented out module phrases and changed a couple of sml/nj things (like makestring) No rewriting to please region inference. Still it uses less that 100Kb when it runs (see region.ps) *) (* This is a quickly written type checker for subtyping, using the MATCH and TYPE algorithms from the Fuh and Mishra paper. The code is ugly at places, and no consideration has been given to effeciency -- please accept my apologies -- Mads*) (* structure List = (* list utilities *) struct *) type 'a set = 'a list; (* sets are represented by lists without repeated elements *) val emptyset = [] fun isin(x,[])=false | isin(x,(y::rest)) = x=y orelse isin(x,rest) fun union([],l) = l | union((x::rest),l) = if isin(x,l) then union(rest,l) else x:: union(rest,l); fun intersect([],l) = [] | intersect((x::rest),l) = if isin(x,l) then x:: intersect(rest,l) else intersect(rest,l); fun setminus([],l) = [] | setminus(x::l,l') = if isin(x,l') then setminus(l,l') else x:: setminus(l,l'); fun foldr f b [] = b | foldr f b (x::rest) = f(x,foldr f b rest); fun foldl f base [] = base | foldl f base (x::xs) = foldl f (f(x, base)) xs (* function for finding transitive closure. Culled from other application. DO NOT READ (CRUDE AND INEFFICIENT) *) fun transClos (eq: 'a * 'a -> bool) (insert_when_eq: bool) (newsets: 'a set list, oldsets: 'a set list): bool * 'a set list = (* The lists in oldsets are pairwise disjoint, but nothing is known about the lists in newsets. The resulting sets are pairwise disjoint, and moreover, the resulting boolean is true if and only if every member (i.e. list) of newsets, is contained in some member (i.e., list) of oldsets *) let val any: bool = true (* could be false, for that matter *) fun isin(x,[]) = false | isin(x,x'::rest) = eq(x,x') orelse isin(x,rest) (* In the following function, L is a list of pairwise disjoint sets. S' is the set currently under construction; it is also disjoint from the sets in L. x will be added to S' if x is not in any set in L. *) fun add(x:'a, (found_fixpt: bool, found_class: bool, L as [], S')): bool * bool * 'a list list * 'a list = if isin(x,S') then if insert_when_eq then (found_fixpt andalso found_class, found_class,[],x::S') else (found_fixpt andalso found_class, found_class,[],S') else (false, any, [], x::S') | add(x,(found_fixpt,found_class,(S::L), S')) = if isin(x,S) then if insert_when_eq then (found_fixpt andalso not found_class,true, L, x::(S @ S')) else (found_fixpt andalso not found_class,true, L, S @ S') else let val (found_fixpt1, found_class1, L1, S1)= add(x,(found_fixpt,found_class,L,S')) in (found_fixpt andalso found_fixpt1, found_class orelse found_class1, S::L1, S1 ) end fun add_S (S,(found_fixpt, oldsets)) : bool * 'a set list = let val (found_fixpt1, _, L1, S1) = foldl add (found_fixpt, false, oldsets, emptyset) S in case S1 of [] => (found_fixpt andalso found_fixpt1, L1) | _ => (found_fixpt andalso found_fixpt1, S1::L1) end in foldl add_S (true, oldsets) newsets end (* end; *) (* structure Variables = (* program variables *) struct *) type var = string (* end; *) (*structure Type = (* Types, substitutions and matching *) struct local (* open List Variables*) in *) datatype ty = INT | REAL | ARROW of ty * ty | PROD of ty * ty | TYVAR of int type subst = ty -> ty fun mk_subst_ty(i: int,ty:ty):subst = let fun S(INT) = INT | S(REAL) = REAL | S(ARROW(ty1,ty2)) = ARROW(S ty1, S ty2) | S(PROD(ty1,ty2)) = PROD(S ty1, S ty2) | S(tv as TYVAR j) = if i=j then ty else tv in S end; val Id = fn x => x; val r = ref 0; (* counter for fresh type variables *) fun fresh() = (r:= !r + 1; ! r); fun fresh_ty() = TYVAR(fresh()); (* free variables *) fun fv_ty (INT,acc) = acc | fv_ty (REAL,acc) = acc | fv_ty(ARROW(t1,t2), acc) = fv_ty(t1,fv_ty(t2,acc)) | fv_ty(PROD(t1,t2), acc) = fv_ty(t1,fv_ty(t2,acc)) | fv_ty((TYVAR i),acc) = if isin(i,acc) then acc else i :: acc; fun tyvars(t:ty) = fv_ty(t,[]) fun fv_tyenv TE = foldr (fn((i,tau),acc)=> fv_ty(tau,acc)) [] TE (* ALLNEW, page 168: create a fresh copy of a type, using type variables at the leaves of the type *) fun allnew(INT) = fresh_ty() | allnew(REAL) = fresh_ty() | allnew(ARROW(t1,t2)) = ARROW(allnew(t1),allnew(t2)) | allnew(PROD(t1,t2)) = PROD(allnew(t1),allnew(t2)) | allnew(TYVAR _) = fresh_ty(); (* PAIR, page 168: create list of atomic types that occur in the same places of t1 and t2 *) fun pair(ARROW(t1,t2),ARROW(t1',t2')) = pair(t1,t1') @ pair (t2,t2') | pair(PROD(t1,t2),PROD(t1',t2')) = pair(t1,t1') @ pair (t2,t2') | pair(t1,t2) = [[t1,t2]] (* dealing with equivalence classes of atomic types -- for algorithm MATCH *) (* M_v, page 168: removing that equivalence class containing v from M *) fun remove([], v) = [] | remove((class::rest), v) = if isin(v,class) then rest else class:: remove(rest,v); (* [a]_M, page 168: the equivalence class containing a *) exception ClassOff fun class_of([],a) = raise ClassOff | class_of((class::rest), a) = if isin(a,class) then class else class_of(rest,a); (* [t]^M, page 168: the set of type variables eqivalent to some type variable occurring in non-atomic type t *) fun equiv_tyvars(t,M): ty list = foldr union [] ((map (fn a=> class_of(M,TYVAR a)) (tyvars(t))): ty list list) ; fun transitive_closure(oldsets,newsets) = #2(transClos(op = : ty*ty-> bool)(false)(newsets,oldsets)) (* Coercion sets *) type coercion = ty * ty type coercion_set = coercion list fun on_C(S,C) = map (fn(t1,t2) => (S t1, S t2)) C fun atomic t = case t of INT => true | REAL => true | TYVAR _ => true | _ => false; (* diagonal is used in match to create initial equivalence relation*) fun diagonal(C: coercion_set) = let fun diag(t,acc) = case t of INT => union([INT],acc) | REAL => union([REAL],acc) | PROD(t1,t2) => diag(t1,diag(t2,acc)) | ARROW(t1,t2) => diag(t1,diag(t2,acc)) | TYVAR _ => union([t],acc) fun diag2((t1,t2),acc) = diag(t1,diag(t2,acc)) val atomics = foldr diag2 [] C in map (fn atomic => [atomic,atomic]) atomics end fun ground_atomic t = case t of INT => true | REAL => true | _ => false; fun contains_no_type_constant [] = true | contains_no_type_constant (t::rest) = not (ground_atomic t) andalso contains_no_type_constant rest; exception MATCH local fun match1([]:coercion_set,S:subst,M) = S | match1((t1,t2)::C, S, M) = if atomic t1 andalso atomic t2 then atomicElimination(t1,t2,C,S,M) else if atomic t1 then expansion(t1,t2,C,S,M) else if atomic t2 then expansion(t2,t1,C,S,M) else decomposition(t1,t2,C,S,M) and atomicElimination(t1,t2,C,S,M) = match1(C,S,transitive_closure(M,[[t1,t2]])) and decomposition(ARROW(t1,t2),ARROW(t1',t2'),C,S,M)= match1((t1',t1)::(t2,t2')::C, S, M) | decomposition(PROD(t1,t2),PROD(t1',t2'),C,S,M)= match1((t1,t1')::(t2,t2')::C, S, M) | decomposition(_) = raise MATCH and expansion(t1:ty,t2:ty,C,S,M) = case intersect(class_of(M,t1), equiv_tyvars(t2,M)) (* occurs check *) of []=> if contains_no_type_constant(class_of(M,t1)) then (* not matching of int or real with arrow or prod *) let fun loop([],C,S,M) = match1(C,S,M) | loop((TYVAR alpha)::tyvars, C, S, M) = let val t' = allnew t2 val delta = mk_subst_ty(alpha,t') in loop(tyvars, on_C(delta,C), delta o S, transitive_closure(M,pair(t2,t'))) end | loop((_::tyvars), C, S, M) = (* skip atomic types, that are not variables *) loop(tyvars, C, S, M) in loop(class_of(M,t1),C,S,M) end else (* matching of int or real with arrow or prod *) raise MATCH | _ => (* occurs check failed *) raise MATCH in fun match(C) = match1(C,Id,diagonal C); end (* Type Environments *) type tyenv = (var * ty)list (* no polymorphism! *) (* looking up variables in the type environement *) exception Lookup; fun lookup(i,[]) = raise Lookup | lookup(i,((j,sigma)::rest)) = if i=j then sigma else lookup(i,rest); fun on_tyenv(S:subst,TE:tyenv) = map (fn(i,tau) => (i, S tau)) TE (* pretty printing -- actually not very pretty, but it will do *) (* precedences: -> : 1 * : 2 *) fun pp_ty' (context:int,INT) = "INT" | pp_ty'(_,REAL) = "REAL" | pp_ty'(context,ARROW(ty1, ty2)) = let val s = pp_ty'(2,ty1) ^ "->" ^ pp_ty'(1, ty2) in if context > 1 then "(" ^ s ^ ")" else s end | pp_ty'(context,PROD(ty1, ty2)) = let val s = pp_ty'(3,ty1) ^ "*" ^ pp_ty'(3,ty2) in if context > 2 then "(" ^ s ^ ")" else s end | pp_ty'(context,(TYVAR i)) = "'a" ^ toString i; fun pp_ty ty = pp_ty'(0,ty) local fun filter [] = [] | filter ((x,sigma)::rest) = if isin(x,["fst","snd","floor"]) (* hack to avoid printing of built-in variables fst, snd and floor *) then filter rest else (x,sigma)::filter rest fun pp_tyenv [] = "" | pp_tyenv ([(x,sigma)]) = x ^ ":" ^ pp_ty sigma ^ " " | pp_tyenv ((x,sigma)::rest) = x ^ ":" ^ pp_ty sigma ^ "," ^ pp_tyenv rest; in val pp_tyenv = pp_tyenv o filter end fun pp_coercion(tau1,tau2) = "\n " ^ pp_ty tau1 ^ " |> " ^ pp_ty tau2 fun pp_coercion_set [] = "" | pp_coercion_set[coercion] = pp_coercion coercion | pp_coercion_set(coercion::rest) = pp_coercion coercion ^ ", " ^ pp_coercion_set rest (* end (* local *) end; *) (*structure Expressions = struct local open List Variables in *) datatype exp = VAR of var | INTCON of int | REALCON of real | LAM of var * exp | APP of exp * exp | LET of var * exp * exp | PLUS of exp | MINUS of exp | PAIR of exp * exp; (* pretty printing *) fun pp_exp(VAR x) = x | pp_exp(LAM(x,e')) = "(fn " ^ x ^ " =>" ^ pp_exp e' ^ ")" | pp_exp(APP(e1,e2)) = "(" ^ pp_exp e1 ^ " @ " ^ pp_exp e2 ^ ")" | pp_exp(LET(x,e1,e2)) = "let " ^ x ^ "=" ^ pp_exp e1 ^ " in " ^ pp_exp e2 ^ "end" | pp_exp(INTCON i) = toString i | pp_exp(REALCON r) = toString(floor r) ^ ".?" | pp_exp(PLUS(e1)) = "(+" ^ pp_exp e1 ^ ")" | pp_exp(MINUS(e1)) = "(-" ^ pp_exp e1 ^ ")" | pp_exp(PAIR(e1,e2)) = "(" ^ pp_exp e1 ^ "," ^ pp_exp e2 ^ ")" (* end (* local *) end; *) (*structure TypeChecker= struct local open List Variables Type Expressions in *) type job = tyenv * exp * ty fun TYPE(TE:tyenv,e:exp) : ty * coercion_set = let val alpha0 = fresh_ty() val C = TY([(TE,e,alpha0)],[]) in (alpha0, C) end and TY([]: job list, C: coercion_set)= C | TY((job as (TE,e,tau)) :: rest, C: coercion_set)= case e of VAR x => TY(rest, (lookup(x,TE),tau)::C) | LAM(x,e') => let val (new_ty1,new_ty2) = (fresh_ty(),fresh_ty()); val TE' = (x,(new_ty1))::TE in TY((TE',e',new_ty2)::rest, (ARROW(new_ty1,new_ty2), tau):: C) end | APP(e1,e2) => let val (new_ty1,new_ty2) = (fresh_ty(),fresh_ty()); in TY((TE,e1,ARROW(new_ty1,new_ty2))::(TE,e2,new_ty1)::rest, (new_ty2,tau)::C) end | LET(x,e1,e2) => let val (new_ty1,new_ty2) = (fresh_ty(),fresh_ty()); in TY((TE,e1,new_ty1)::((x,new_ty1)::TE,e2,new_ty2)::rest, (new_ty2,tau)::C) end | INTCON i => TY(rest, (INT, tau):: C) | REALCON i => TY(rest, (REAL, tau):: C) | PLUS e1 => TY((TE,e1, PROD(INT,INT))::rest, (PROD(INT,INT),tau):: C) | MINUS e1 => TY((TE,e1, PROD(INT,INT))::rest, (PROD(INT,INT),tau):: C) | PAIR(e1,e2) => let val (new_ty1,new_ty2) = (fresh_ty(),fresh_ty()); in TY((TE,e1,new_ty1)::(TE,e2,new_ty2)::rest, (PROD(new_ty1,new_ty2),tau)::C) end type judgement = coercion_set * tyenv * exp * ty fun pp_judgement(C,TE,e,tau) = "\nCoersion set: " ^ pp_coercion_set C ^ "\nType environment: " ^ pp_tyenv TE ^ "\nExpression: " ^ pp_exp e ^ "\nType: " ^ pp_ty tau; (* end (* local *) end; *) (*structure Run = struct local open List Variables Type Expressions TypeChecker in *) val e0 = (* let val Id = fn x => x in (Id 3, Id 4.0) end *) let val Id = LAM("x",VAR "x") val pair = PAIR(APP(VAR "Id", INTCON 3), APP(VAR "Id", REALCON 4.0)) in LET("Id",Id, pair) end; val e1 = (* let val makepair = fn x => (x,x) in makepair 3.14 *) let val makepair = LAM("x",PAIR(VAR "x", VAR "x")) in LET("makepair", makepair, APP(VAR "makepair", REALCON 3.14)) end val e2 = (* let fun mappair = fn f => fn x => (f (fst x), f (snd x)) in mappair floor (3.14,2.18) end *) let val mappair = LAM("f",LAM("x", PAIR(APP(VAR "f",APP(VAR "fst", VAR "x")), APP(VAR "f",APP(VAR "snd", VAR "x"))))) in LET("mappair",mappair, APP(APP(VAR "mappair", VAR "floor"), PAIR(REALCON 3.14, REALCON 2.18))) end; val e3 = (* fn x => x *) LAM("x",VAR "x") val e4 = (* fn f => fn x => f x *) LAM("f",LAM("x",APP(VAR "f", VAR "x"))); val e5 = (* fn f => fn x => f(f x) *) LAM("f",LAM("x",APP(VAR "f", APP(VAR "f", VAR "x")))); fun run(e: exp, outfilename: string) = let val _ = r:= 5; (* reset counter for type variables *) val _ = print("\nprocessing " ^ outfilename ^ "...") val TE0 = [("fst", (ARROW(PROD(TYVAR 0,TYVAR 1),TYVAR 0))), (* the type of fst *) ("snd", (ARROW(PROD(TYVAR 0,TYVAR 1),TYVAR 1))), (* the type of snd *) ("floor", (ARROW(REAL,INT)))] (* the type of floor *) val _ = print("running TYPE...") val (ty,C) = TYPE(TE0,e) ; val os = TextIO.openOut outfilename; val _ = TextIO.output(os, "\nResult of TYPE:\n\n\n " ^ pp_judgement(C,TE0,e,ty)); val _ = print("running MATCH...") val S = match C val judgem' as (C',TE',e',ty') = (on_C(S,C),on_tyenv(S,TE0),e,S ty) val _ = TextIO.output(os, "\n\n\nResult of MATCH:\n\n\n " ^ pp_judgement judgem'); in TextIO.closeOut os end; val _ = run(e0,"outFuhMishra0"); val _ = run(e1,"outFuhMishra1"); val _ = run(e2,"outFuhMishra2"); val _ = run(e3,"outFuhMishra3"); val _ = run(e4,"outFuhMishra4"); val _ = run(e5,"outFuhMishra5"); (* end (* local *) end (*struct*); *) val _ = print "\n" mlton-20100608/regression/functor.ok0000644000076600000240000000003411404435617015754 0ustar mtfstaffvalue is A(K) value is A(J) mlton-20100608/regression/functor.sml0000644000076600000240000000160011404435617016136 0ustar mtfstaffsignature A = sig type t val a : t end functor F(A : sig type t val pr : t -> string end) = struct datatype k = A of A.t fun pr (A t) = "A(" ^ A.pr t ^ ")" end functor G(A : A) = struct type t = A.t val b = A.a end functor H(A : sig type t type s val a : s sharing type t = s val pr : t -> string end) = struct structure A1 : sig type t val pr : t -> string end = A structure A2 = F(A1) structure A3 = G(A) val a = A2.A A.a val _ = print ("value is " ^ A2.pr a ^ "\n") end structure B1 = struct datatype t = J | K type s = t val a = K fun pr K = "K" | pr J = "J" end structure B2 = struct open B1 val a = J end structure H1 = H(B1) structure H2 = H(B2) signature S = sig end functor F (): S = struct end signature S = sig val y: int end structure C = F () mlton-20100608/regression/gc-collect.ok0000644000076600000240000000001611404435620016302 0ustar mtfstaffHello, world! mlton-20100608/regression/gc-collect.sml0000644000076600000240000000011511404435617016472 0ustar mtfstaffval _ = print "Hello, " val _ = MLton.GC.collect () val _ = print "world!\n" mlton-20100608/regression/general.ok0000644000076600000240000000062711404435617015721 0ustar mtfstaff File general.sml: Testing structure General... Should be `E1 or E2': E1 E1 Should be `Bind': Bind Bind Should be `Match': Match Match Should be `Subscript': Subscript Subscript Should be `Overflow': Overflow Overflow Should be `Div': Div Div Should be `Chr': Chr Chr Should be `Fail': Fail Fail: demo Should be `Option': Option Option Should be `Empty': Empty Empty mlton-20100608/regression/general.sml0000644000076600000240000000332011404435617016074 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* General -- incomplete 1996-04-19, 1996-09-30, 1997-03-12 *) val _ = print "\nFile general.sml: Testing structure General...\n" exception NoExceptionRaised fun getExn (f : unit -> 'a) = (f (); NoExceptionRaised) handle e => e fun prExn(exnStr, exn) = (print "Should be `"; print exnStr; print "':\n "; print (exnName exn); print "\n "; print (exnMessage exn); print "\n"); exception E1; exception E2 = E1; val _ = List.map prExn [("E1 or E2", E2), ("Bind", getExn(fn _ => let val true = false in () end)), ("Match", getExn(fn _ => (fn true => ()) false)), ("Subscript", getExn(fn _ => Vector.sub(vector [], ~1))), ("Overflow", getExn(fn _ => Array.array(Array.maxLen+1, ()))), (* ("Overflow", getExn(fn _ => Math.exp 1E99)), ("Domain", getExn(fn _ => Math.ln ~1.0)), *) ("Div", getExn(fn _ => 1 div 0)), ("Chr", getExn(fn _ => Char.chr 9999999)), ("Fail", Fail "demo"), ("Option", getExn(fn _ => valOf NONE)), ("Empty", getExn(fn _ => List.hd [])) (* ("SysErr", getExn (fn _ => FileSys.modTime "exists.not")), *) (* ("Io", getExn (fn _ => TextIO.openOut "."))*) ]; mlton-20100608/regression/generate/0000755000076600000240000000000011404470407015532 5ustar mtfstaffmlton-20100608/regression/generate/all-overloads.sml0000644000076600000240000000340211404435615021014 0ustar mtfstaffstructure List = struct fun foreach (l, f) = List.app f l fun map (l, f) = List.map f l val tabulate = List.tabulate end val int = List.map (["Int", "IntInf", "LargeInt", "FixedInt", "Position"] @ List.map (List.tabulate (31, fn i => i + 2) @ [64], fn i => concat ["Int", Int.toString i]), fn s => concat [s, ".int"]) val real = List.map (["Real", "Real32", "Real64", "LargeReal"], fn s => concat [s, ".real"]) val word = List.map (["Word", "LargeWord", "SysWord"] @ List.map (List.tabulate (31, fn i => i + 2) @ [64], fn i => concat ["Word", Int.toString i]), fn s => concat [s, ".word"]) val text = ["Char.char", "String.string"] val num = int @ word @ real val numtext = num @ text val realint = int @ real val wordint = int @ word datatype ty = Binary | Compare | Unary val binary = Binary val compare = Compare val unary = Unary val () = print "(* This file is automatically generated. Do not edit. *)\n" val () = List.foreach ([(2, "~", unary, num), (2, "+", binary, num), (2, "-", binary, num), (2, "*", binary, num), (4, "/", binary, real), (3, "div", binary, wordint), (3, "mod", binary, wordint), (3, "abs", unary, realint), (1, "<", compare, numtext), (1, "<=", compare, numtext), (1, ">", compare, numtext), (1, ">=", compare, numtext)], fn (prec, f, ty, class) => List.foreach (class, fn c => print (concat ["fun f (x: ", c, ") = ", case ty of Binary => concat ["x ", f, " x"] | Compare => concat ["x ", f, " x"] | Unary => concat [f, " x"], "\n"]))) mlton-20100608/regression/grow-raise.ok0000644000076600000240000000000011404435617016344 0ustar mtfstaffmlton-20100608/regression/grow-raise.sml0000644000076600000240000000015611404435620016534 0ustar mtfstaffexception E val rec loop = fn 0 => raise E | n => 1 + loop(n - 1) val _ = loop 1000000 handle E => 13 mlton-20100608/regression/harmonic.ok0000644000076600000240000003136211404435621016077 0ustar mtfstaff39222599121514781829119145513300973154044783988843956564660528928647823822608921042788817019114802088385672583048912695313594371037134558154744319463805489746415471890746596127416081605214240676674858343652913261130281433767413287088533826935203371968721478920701976683745061847033184971202377168495020854188750363630954662914748730648848871340190462154888874627915547530728859386328528813812940040570970005864331483892703129353153651160493975729217508194079533326550472014411441453399340207754785065013356841018229768574638839784880210268316462988528062015316070150729798472795687534752565356989470641349805250953287627616834886443103650057443671446128357418135202321895212132582965040694338352866914842850616630642262599696627065660370988230468763796672923353398272308014903959759005135336446576409776973274055754489990960794948343985003420240959958543980416506164712152852866583097224160508714329786910280915375999348095707104429999864980362109766425956280765174139493056270293052648104812629078765690514788666656204708174722719946702897276030697597556147806178684577843577662489631353581100484914066170877397449752143159656068236738896260601040737077871272896974451534170597853253646533539106833468744242897035278758405622631721851935530310010328132977711642650354131992856640623078642638554372351743/4569578892362787664957444564459031125304046583164843221047579554945561028126633621164033719734733059547478872764378796415405297659320587544009272961517554759297956605045388903388209303690187403434357085886228397414739326302662662412326772539086997640513624806257314212466761615834754841534064594319013754023106626918173226552383693292127509626955250296241893697505366116598871212618916494583889537226056297118823049020956629904542236545848364941268876364307378900917456608180165495057377390070564233017048712830812268777992807510740665844294834207402467562214500792794249382088381786425833718896071046857860477525231235294758469785412358841835611233817993602269819522793270735015879200753701267786090663741509962140711233366150365618138860003805211482019314608468756221533641296285789297504897962527403713948371740605317726993184615832121535494687155883158540673264189444152906152190163570346297467322217423738606472412080926110697484769438174814088852871161968016977238122910885288982973028048718218464063866818318220434195067144865738332336332844153484491549915978710992214617666108915686922143117073510269034979041814046355037408684614858290089148388091151304646695173449912561204965201215617731145621011524416055468891736454258517986283205345760492728091869952062577506684644716279940891989171456000 39222599121514781829119145513300973154044783988843956564660528928647823822608921042788817019114802088385672583048912695313594371037134558154744319463805489746415471890746596127416081605214240676674858343652913261130281433767413287088533826935203371968721478920701976683745061847033184971202377168495020854188750363630954662914748730648848871340190462154888874627915547530728859386328528813812940040570970005864331483892703129353153651160493975729217508194079533326550472014411441453399340207754785065013356841018229768574638839784880210268316462988528062015316070150729798472795687534752565356989470641349805250953287627616834886443103650057443671446128357418135202321895212132582965040694338352866914842850616630642262599696627065660370988230468763796672923353398272308014903959759005135336446576409776973274055754489990960794948343985003420240959958543980416506164712152852866583097224160508714329786910280915375999348095707104429999864980362109766425956280765174139493056270293052648104812629078765690514788666656204708174722719946702897276030697597556147806178684577843577662489631353581100484914066170877397449752143159656068236738896260601040737077871272896974451534170597853253646533539106833468744242897035278758405622631721851935530310010328132977711642650354131992856640623078642638554372351743/4569578892362787664957444564459031125304046583164843221047579554945561028126633621164033719734733059547478872764378796415405297659320587544009272961517554759297956605045388903388209303690187403434357085886228397414739326302662662412326772539086997640513624806257314212466761615834754841534064594319013754023106626918173226552383693292127509626955250296241893697505366116598871212618916494583889537226056297118823049020956629904542236545848364941268876364307378900917456608180165495057377390070564233017048712830812268777992807510740665844294834207402467562214500792794249382088381786425833718896071046857860477525231235294758469785412358841835611233817993602269819522793270735015879200753701267786090663741509962140711233366150365618138860003805211482019314608468756221533641296285789297504897962527403713948371740605317726993184615832121535494687155883158540673264189444152906152190163570346297467322217423738606472412080926110697484769438174814088852871161968016977238122910885288982973028048718218464063866818318220434195067144865738332336332844153484491549915978710992214617666108915686922143117073510269034979041814046355037408684614858290089148388091151304646695173449912561204965201215617731145621011524416055468891736454258517986283205345760492728091869952062577506684644716279940891989171456000 39222599121514781829119145513300973154044783988843956564660528928647823822608921042788817019114802088385672583048912695313594371037134558154744319463805489746415471890746596127416081605214240676674858343652913261130281433767413287088533826935203371968721478920701976683745061847033184971202377168495020854188750363630954662914748730648848871340190462154888874627915547530728859386328528813812940040570970005864331483892703129353153651160493975729217508194079533326550472014411441453399340207754785065013356841018229768574638839784880210268316462988528062015316070150729798472795687534752565356989470641349805250953287627616834886443103650057443671446128357418135202321895212132582965040694338352866914842850616630642262599696627065660370988230468763796672923353398272308014903959759005135336446576409776973274055754489990960794948343985003420240959958543980416506164712152852866583097224160508714329786910280915375999348095707104429999864980362109766425956280765174139493056270293052648104812629078765690514788666656204708174722719946702897276030697597556147806178684577843577662489631353581100484914066170877397449752143159656068236738896260601040737077871272896974451534170597853253646533539106833468744242897035278758405622631721851935530310010328132977711642650354131992856640623078642638554372351744/4569578892362787664957444564459031125304046583164843221047579554945561028126633621164033719734733059547478872764378796415405297659320587544009272961517554759297956605045388903388209303690187403434357085886228397414739326302662662412326772539086997640513624806257314212466761615834754841534064594319013754023106626918173226552383693292127509626955250296241893697505366116598871212618916494583889537226056297118823049020956629904542236545848364941268876364307378900917456608180165495057377390070564233017048712830812268777992807510740665844294834207402467562214500792794249382088381786425833718896071046857860477525231235294758469785412358841835611233817993602269819522793270735015879200753701267786090663741509962140711233366150365618138860003805211482019314608468756221533641296285789297504897962527403713948371740605317726993184615832121535494687155883158540673264189444152906152190163570346297467322217423738606472412080926110697484769438174814088852871161968016977238122910885288982973028048718218464063866818318220434195067144865738332336332844153484491549915978710992214617666108915686922143117073510269034979041814046355037408684614858290089148388091151304646695173449912561204965201215617731145621011524416055468891736454258517986283205345760492728091869952062577506684644716279940891989171456001 358461522098562330522368524929524622532525584701059206153553750705434052377283596613617481244424655693938930381311997638293627537451602773903820968552130972887303413589546894027520754651486856563137183246192178699678402674540166374627043664906073906297274816459668667036172130641349518050143421076760383286883364703596950890826015165833823694165609326072001125925947941173292524929320852017146822552580638365083483573117047367907722692354093191112509683582480630626180028955372947526880363943215041437553968453959363728935349050391593152514726743292861966553534860639703655812111123703492148921565094560252518073467308791001926448291515790185269315396666769441921156757709919400568459053368117262392436797838420825408664173807857671257927851086211239359173148006022651766185985672015333229146155414185880238456850333030849296390403416675648924190821935978318989697994624107101305396695983830632125072845164812608610833360642906546522190574915516848572373515590594917314505410655067616876247233191199817079398386955544892254430829041736578397432786470885476870096007407522453020569324839377946875102819464791750940674570207041763842316441109697127357863841849145838811505860143547300714245154314578247330134740357056527510649351445398291224426935672440003549443264153139231810411557938591935804436421724688022578381481699067514507018795258379898018399970464639526159219836206011899406009490169254066867274286342171170719392359389802691145117784143916274403098064821963496884388846081261575676105167332019732620818187134376880408113297535044274080416137366664494303712982922098088481681093999247876230652664042310297148215907700256629842200353215007673060147934906189095051105500850952119747212056924070502979140048214801694542153464541916357678242046135777239281222581603879070245671419345161950788321812100718635294239261469314197276562803799064652964897014029613177142413026355718471140534348348916512813301600229638316055104001586939995060778557881845061653288224182636421889298105106468406213805686490082433529022670697855737490359289535619298910652702271815338404242660070659472302812176970967983677659407644879715291108839385336661792302741320341464267733962261575530356168292989514277191194677808581144814150652561935573324235668284280889410326969292735491803095464745049786166321512680100995313043414674410401107844809249447925921508469269537158965153499211799791828276270030959415043680955031377932590520288088551118270213895992371250638890623059917310752449735873914754336938879520234347126678667131091377876120324203904603402431390534249783544011207559910049608289464118144065780698236078439423743/20881051253527521376266628409869519108736635442546416785552763792625959236782369335331122938859228653454653830414612406110100659460692055710637320771439442740023116591792113518214225847223460813939376434174077717092474236675124110134538937502306128830400556386689067533143838085992709008360691371931761554299464698716134460357341438509873836572575129511710229238690268798423730447986901673734875163195074232041608826497393923429838146507099826012591048597537170575345634170780854654867803566634587723300344673046819127672492279838245759278057065677246645861360873977026582276690505990086770498970856903812369800192948369393569991792196174211064018085096327649136716884533268494424920809187135912218199481817861413234925743678185356051182634431087183608027419999566922617194511846511053638472677233818212710120673151792340351358429025210111198176650463187702039643623863929346139413620466425701541316867367759692854200856647313268505845502164988832260143258418726180902155818243740203225442133534507563310733806742900928848033545045850483706342734716830656237203579768765082045678817101699253409958167704269292264638180841420055115815117759518307480103520371072795365791410262205317173836104236746251742930032764071294066395496496859903255277091959141417406492853412401985848227410568340137026519598541209708211542093795071057456229356282015253909367631254379970978096739167471084878345177085009589413576223502624147226165657176819032738515764606556537733047549323845366088599944872791579225919600025760566308781390209620720309216401632591493511274663830028025982488236430055652087712595531127150404248836944878030337945884808357552585634524317577768773922416999325074273405313728339632788329508579480304232808517777116171250332089351193074144436830834115981381263037947750947397202410144915121964319701276673210148182982111528528737004451640818764508669425015173887689559553644971188242567819492876843814351073907861592146589712227491870025173195229134158327277560002290852338792723345564970959855741208293512637069750897013244062420619894414706016980289858301158602967474185960922013609169766365917722983233483157210895113717249132840388834959192954008423234840715058829935612371904513112679664232958753504408293439851675195309613057738876050559566271873961750656956871044217803226408727433665326738402841796877688374578576771404698063663600578161484674304442373965967383950076333797700813576865390400492976331175087227695126769646433936057192548695882076685652873146573892287086381304698709288766089082422458380330759589017296536424270948994870182360146319308312461592885651230596183554702257149107456000 mlton-20100608/regression/harmonic.sml0000644000076600000240000000525511404435617016270 0ustar mtfstafffun die str = ( print (str ^ "\n"); raise Overflow ) local fun loop (big: IntInf.int, small: IntInf.int): IntInf.int = if small = 0 then big else loop (small, IntInf.rem (big, small)) in fun gcd (x: IntInf.int, y: IntInf.int): IntInf.int = let val x = IntInf.abs x val y = IntInf.abs y val (x, y) = if x >= y then (x, y) else (y, x) in loop (x, y) end end fun reduce (num: IntInf.int, den: IntInf.int) : IntInf.int * IntInf.int = let val g = gcd (num, den) val gs = if den >= 0 then g else ~ g in if gs = 1 then (num, den) else let val rnum = IntInf.quot (num, gs) val badn = IntInf.rem (num, gs) val rden = IntInf.quot (den, gs) val badd = IntInf.rem (den, gs) in if badn <> 0 orelse num <> rnum * gs orelse badd <> 0 orelse den <> rden * gs then die ("Bad: num " ^ (IntInf.toString num) ^ ", den " ^ (IntInf.toString den) ^ ", gcds " ^ (IntInf.toString gs) ^ ", rnum " ^ (IntInf.toString rnum) ^ ", rden " ^ (IntInf.toString rden) ^ ", badn " ^ (IntInf.toString badn) ^ ", badd " ^ (IntInf.toString badd)) else (); (rnum, rden) end end fun addrecip (xxx: int, (num: IntInf.int, den: IntInf.int)) : IntInf.int * IntInf.int = let val xxx = IntInf.fromInt xxx val xnum = xxx * num + den val xden = xxx * den in reduce (xnum, xden) end fun printRat (num: IntInf.int, den: IntInf.int): unit = print (IntInf.toString num ^ "/" ^ IntInf.toString den ^ "\n") fun spin (limit: int): IntInf.int * IntInf.int = let fun loop (n: int, res: IntInf.int * IntInf.int) : IntInf.int * IntInf.int = if n = limit then res else loop (n + 1, addrecip (n, res)) in if limit <= 0 then die "Bad limit" else loop (1, (0, 1)) end val (n, d) = spin 3000 val _ = printRat (n, d) val _ = printRat (reduce (n * d * n, d * d * n)) val _ = printRat (reduce (n + 1, d + 1)) val _ = printRat (reduce (n * (d + 1) + d * (n + 1), d * (d + 1))) mlton-20100608/regression/hello-world.ok0000644000076600000240000000001611404435620016516 0ustar mtfstaffHello, world! mlton-20100608/regression/hello-world.sml0000644000076600000240000000004011404435620016675 0ustar mtfstaffval _ = print "Hello, world!\n" mlton-20100608/regression/id.ok0000644000076600000240000000000011404435617014661 0ustar mtfstaffmlton-20100608/regression/id.sml0000644000076600000240000000037411404435617015061 0ustar mtfstaff(* id.sml *) (* Checks parsing of identifiers. *) val ? = {* = op*, + = op+} val op* = # * ? val op+ = # + ?; type '& = ' list type t = int& type ''`` = '' type ('0,'_) == = '_`` &; fun !x=x=x fun ''`x:''=(x=x;x); infix v fun 3v? = 0 | _v? = 1; mlton-20100608/regression/ieee-real.ok0000644000076600000240000000010411404435617016122 0ustar mtfstaff3FB9999999999999 3FB999999999999A 3FB999999999999A 3FB9999999999999 mlton-20100608/regression/ieee-real.sml0000644000076600000240000000224311404435621016305 0ustar mtfstaffstructure R = Real structure I = IEEEReal structure V = Word8Vector structure P = PackRealBig fun setRM mode = (I.setRoundingMode mode; if I.getRoundingMode () <> mode then raise Fail "setRM" else ()) fun up() = setRM I.TO_POSINF fun down() = setRM I.TO_NEGINF fun near() = setRM I.TO_NEAREST fun zero() = setRM I.TO_ZERO (* 61 digits of 1 / 10 in Mathematica In[7]:= RealDigits[1 / 10,2,61] Out[7]= {{1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1},-3} *) val mtenth_lo = (down();1.0 / 10.0) val mtenth_hi = (up();1.0 / 10.0) val mtenth_near = (near();1.0 / 10.0) val mtenth_zero = (zero();1.0 / 10.0) fun word8vectorToString v = V.foldr (fn(w,s) => Word8.toString w ^ s) "" v val _ = print(word8vectorToString (P.toBytes mtenth_lo) ^ "\n") val _ = print(word8vectorToString (P.toBytes mtenth_hi) ^ "\n") val _ = print(word8vectorToString (P.toBytes mtenth_near) ^ "\n") val _ = print(word8vectorToString (P.toBytes mtenth_zero) ^ "\n") mlton-20100608/regression/int-inf.0.ok0000644000076600000240000000001311404435617015773 0ustar mtfstaff2147483648 mlton-20100608/regression/int-inf.0.sml0000644000076600000240000000007211404435620016154 0ustar mtfstaffval _ = print (concat [IntInf.toString 0x80000000, "\n"]) mlton-20100608/regression/int-inf.1.ok0000644000076600000240000000003011404435617015773 0ustar mtfstafftrying 0 ok trying 1 ok mlton-20100608/regression/int-inf.1.sml0000644000076600000240000000056711404435621016167 0ustar mtfstaffval big: IntInf.int = 0x80000000 fun try (barg: IntInf.int): unit = let val bstr = IntInf.toString barg val _ = print (concat ["trying ", bstr, "\n"]) in print (if ~ big <= barg then if barg < big then "ok\n" else "positive\n" else "negative\n") end val _ = try 0 val _ = try 1 mlton-20100608/regression/int-inf.2.ok0000644000076600000240000051544211404435620016010 0ustar mtfstafftrying 0 trying 0 trying 1 trying ~1 trying 2 trying ~2 trying 3 trying ~3 trying 4 trying ~4 trying 5 trying ~5 trying 6 trying ~6 trying 7 trying ~7 trying 8 trying ~8 trying 9 trying ~9 trying 10 trying ~10 trying 11 trying ~11 trying 12 trying ~12 trying 13 trying ~13 trying 14 trying ~14 trying 15 trying ~15 trying 16 trying ~16 trying 17 trying ~17 trying 18 trying ~18 trying 19 trying ~19 trying 20 trying ~20 trying 21 trying ~21 trying 22 trying ~22 trying 23 trying ~23 trying 24 trying ~24 trying 25 trying ~25 trying 26 trying ~26 trying 27 trying ~27 trying 28 trying ~28 trying 29 trying ~29 trying 30 trying ~30 trying 31 trying ~31 trying 32 trying ~32 trying 33 trying ~33 trying 34 trying ~34 trying 35 trying ~35 trying 36 trying ~36 trying 37 trying ~37 trying 38 trying ~38 trying 39 trying ~39 trying 40 trying ~40 trying 41 trying ~41 trying 42 trying ~42 trying 43 trying ~43 trying 44 trying ~44 trying 45 trying ~45 trying 46 trying ~46 trying 47 trying ~47 trying 48 trying ~48 trying 49 trying ~49 trying 50 trying ~50 trying 51 trying ~51 trying 52 trying ~52 trying 53 trying ~53 trying 54 trying ~54 trying 55 trying ~55 trying 56 trying ~56 trying 57 trying ~57 trying 58 trying ~58 trying 59 trying ~59 trying 60 trying ~60 trying 61 trying ~61 trying 62 trying ~62 trying 63 trying ~63 trying 64 trying ~64 trying 65 trying ~65 trying 66 trying ~66 trying 67 trying ~67 trying 68 trying ~68 trying 69 trying ~69 trying 70 trying ~70 trying 71 trying ~71 trying 72 trying ~72 trying 73 trying ~73 trying 74 trying ~74 trying 75 trying ~75 trying 76 trying ~76 trying 77 trying ~77 trying 78 trying ~78 trying 79 trying ~79 trying 80 trying ~80 trying 81 trying ~81 trying 82 trying ~82 trying 83 trying ~83 trying 84 trying ~84 trying 85 trying ~85 trying 86 trying ~86 trying 87 trying ~87 trying 88 trying ~88 trying 89 trying ~89 trying 90 trying ~90 trying 91 trying ~91 trying 92 trying ~92 trying 93 trying ~93 trying 94 trying ~94 trying 95 trying ~95 trying 96 trying ~96 trying 97 trying ~97 trying 98 trying ~98 trying 99 trying ~99 trying 100 trying ~100 trying 101 trying ~101 trying 102 trying ~102 trying 103 trying ~103 trying 104 trying ~104 trying 105 trying ~105 trying 106 trying ~106 trying 107 trying ~107 trying 108 trying ~108 trying 109 trying ~109 trying 110 trying ~110 trying 111 trying ~111 trying 112 trying ~112 trying 113 trying ~113 trying 114 trying ~114 trying 115 trying ~115 trying 116 trying ~116 trying 117 trying ~117 trying 118 trying ~118 trying 119 trying ~119 trying 120 trying ~120 trying 121 trying ~121 trying 122 trying ~122 trying 123 trying ~123 trying 124 trying ~124 trying 125 trying ~125 trying 126 trying ~126 trying 127 trying ~127 trying 128 trying ~128 trying 129 trying ~129 trying 130 trying ~130 trying 131 trying ~131 trying 132 trying ~132 trying 133 trying ~133 trying 134 trying ~134 trying 135 trying ~135 trying 136 trying ~136 trying 137 trying ~137 trying 138 trying ~138 trying 139 trying ~139 trying 140 trying ~140 trying 141 trying ~141 trying 142 trying ~142 trying 143 trying ~143 trying 144 trying ~144 trying 145 trying ~145 trying 146 trying ~146 trying 147 trying ~147 trying 148 trying ~148 trying 149 trying ~149 trying 150 trying ~150 trying 151 trying ~151 trying 152 trying ~152 trying 153 trying ~153 trying 154 trying ~154 trying 155 trying ~155 trying 156 trying ~156 trying 157 trying ~157 trying 158 trying ~158 trying 159 trying ~159 trying 160 trying ~160 trying 161 trying ~161 trying 162 trying ~162 trying 163 trying ~163 trying 164 trying ~164 trying 165 trying ~165 trying 166 trying ~166 trying 167 trying ~167 trying 168 trying ~168 trying 169 trying ~169 trying 170 trying ~170 trying 171 trying ~171 trying 172 trying ~172 trying 173 trying ~173 trying 174 trying ~174 trying 175 trying ~175 trying 176 trying ~176 trying 177 trying ~177 trying 178 trying ~178 trying 179 trying ~179 trying 180 trying ~180 trying 181 trying ~181 trying 182 trying ~182 trying 183 trying ~183 trying 184 trying ~184 trying 185 trying ~185 trying 186 trying ~186 trying 187 trying ~187 trying 188 trying ~188 trying 189 trying ~189 trying 190 trying ~190 trying 191 trying ~191 trying 192 trying ~192 trying 193 trying ~193 trying 194 trying ~194 trying 195 trying ~195 trying 196 trying ~196 trying 197 trying ~197 trying 198 trying ~198 trying 199 trying ~199 trying 200 trying ~200 trying 201 trying ~201 trying 202 trying ~202 trying 203 trying ~203 trying 204 trying ~204 trying 205 trying ~205 trying 206 trying ~206 trying 207 trying ~207 trying 208 trying ~208 trying 209 trying ~209 trying 210 trying ~210 trying 211 trying ~211 trying 212 trying ~212 trying 213 trying ~213 trying 214 trying ~214 trying 215 trying ~215 trying 216 trying ~216 trying 217 trying ~217 trying 218 trying ~218 trying 219 trying ~219 trying 220 trying ~220 trying 221 trying ~221 trying 222 trying ~222 trying 223 trying ~223 trying 224 trying ~224 trying 225 trying ~225 trying 226 trying ~226 trying 227 trying ~227 trying 228 trying ~228 trying 229 trying ~229 trying 230 trying ~230 trying 231 trying ~231 trying 232 trying ~232 trying 233 trying ~233 trying 234 trying ~234 trying 235 trying ~235 trying 236 trying ~236 trying 237 trying ~237 trying 238 trying ~238 trying 239 trying ~239 trying 240 trying ~240 trying 241 trying ~241 trying 242 trying ~242 trying 243 trying ~243 trying 244 trying ~244 trying 245 trying ~245 trying 246 trying ~246 trying 247 trying ~247 trying 248 trying ~248 trying 249 trying ~249 trying 250 trying ~250 trying 251 trying ~251 trying 252 trying ~252 trying 253 trying ~253 trying 254 trying ~254 trying 255 trying ~255 trying 256 trying ~256 trying 257 trying ~257 trying 258 trying ~258 trying 259 trying ~259 trying 260 trying ~260 trying 261 trying ~261 trying 262 trying ~262 trying 263 trying ~263 trying 264 trying ~264 trying 265 trying ~265 trying 266 trying ~266 trying 267 trying ~267 trying 268 trying ~268 trying 269 trying ~269 trying 270 trying ~270 trying 271 trying ~271 trying 272 trying ~272 trying 273 trying ~273 trying 274 trying ~274 trying 275 trying ~275 trying 276 trying ~276 trying 277 trying ~277 trying 278 trying ~278 trying 279 trying ~279 trying 280 trying ~280 trying 281 trying ~281 trying 282 trying ~282 trying 283 trying ~283 trying 284 trying ~284 trying 285 trying ~285 trying 286 trying ~286 trying 287 trying ~287 trying 288 trying ~288 trying 289 trying ~289 trying 290 trying ~290 trying 291 trying ~291 trying 292 trying ~292 trying 293 trying ~293 trying 294 trying ~294 trying 295 trying ~295 trying 296 trying ~296 trying 297 trying ~297 trying 298 trying ~298 trying 299 trying ~299 trying 300 trying ~300 trying 301 trying ~301 trying 302 trying ~302 trying 303 trying ~303 trying 304 trying ~304 trying 305 trying ~305 trying 306 trying ~306 trying 307 trying ~307 trying 308 trying ~308 trying 309 trying ~309 trying 310 trying ~310 trying 311 trying ~311 trying 312 trying ~312 trying 313 trying ~313 trying 314 trying ~314 trying 315 trying ~315 trying 316 trying ~316 trying 317 trying ~317 trying 318 trying ~318 trying 319 trying ~319 trying 320 trying ~320 trying 321 trying ~321 trying 322 trying ~322 trying 323 trying ~323 trying 324 trying ~324 trying 325 trying ~325 trying 326 trying ~326 trying 327 trying ~327 trying 328 trying ~328 trying 329 trying ~329 trying 330 trying ~330 trying 331 trying ~331 trying 332 trying ~332 trying 333 trying ~333 trying 334 trying ~334 trying 335 trying ~335 trying 336 trying ~336 trying 337 trying ~337 trying 338 trying ~338 trying 339 trying ~339 trying 340 trying ~340 trying 341 trying ~341 trying 342 trying ~342 trying 343 trying ~343 trying 344 trying ~344 trying 345 trying ~345 trying 346 trying ~346 trying 347 trying ~347 trying 348 trying ~348 trying 349 trying ~349 trying 350 trying ~350 trying 351 trying ~351 trying 352 trying ~352 trying 353 trying ~353 trying 354 trying ~354 trying 355 trying ~355 trying 356 trying ~356 trying 357 trying ~357 trying 358 trying ~358 trying 359 trying ~359 trying 360 trying ~360 trying 361 trying ~361 trying 362 trying ~362 trying 363 trying ~363 trying 364 trying ~364 trying 365 trying ~365 trying 366 trying ~366 trying 367 trying ~367 trying 368 trying ~368 trying 369 trying ~369 trying 370 trying ~370 trying 371 trying ~371 trying 372 trying ~372 trying 373 trying ~373 trying 374 trying ~374 trying 375 trying ~375 trying 376 trying ~376 trying 377 trying ~377 trying 378 trying ~378 trying 379 trying ~379 trying 380 trying ~380 trying 381 trying ~381 trying 382 trying ~382 trying 383 trying ~383 trying 384 trying ~384 trying 385 trying ~385 trying 386 trying ~386 trying 387 trying ~387 trying 388 trying ~388 trying 389 trying ~389 trying 390 trying ~390 trying 391 trying ~391 trying 392 trying ~392 trying 393 trying ~393 trying 394 trying ~394 trying 395 trying ~395 trying 396 trying ~396 trying 397 trying ~397 trying 398 trying ~398 trying 399 trying ~399 trying 400 trying ~400 trying 401 trying ~401 trying 402 trying ~402 trying 403 trying ~403 trying 404 trying ~404 trying 405 trying ~405 trying 406 trying ~406 trying 407 trying ~407 trying 408 trying ~408 trying 409 trying ~409 trying 410 trying ~410 trying 411 trying ~411 trying 412 trying ~412 trying 413 trying ~413 trying 414 trying ~414 trying 415 trying ~415 trying 416 trying ~416 trying 417 trying ~417 trying 418 trying ~418 trying 419 trying ~419 trying 420 trying ~420 trying 421 trying ~421 trying 422 trying ~422 trying 423 trying ~423 trying 424 trying ~424 trying 425 trying ~425 trying 426 trying ~426 trying 427 trying ~427 trying 428 trying ~428 trying 429 trying ~429 trying 430 trying ~430 trying 431 trying ~431 trying 432 trying ~432 trying 433 trying ~433 trying 434 trying ~434 trying 435 trying ~435 trying 436 trying ~436 trying 437 trying ~437 trying 438 trying ~438 trying 439 trying ~439 trying 440 trying ~440 trying 441 trying ~441 trying 442 trying ~442 trying 443 trying ~443 trying 444 trying ~444 trying 445 trying ~445 trying 446 trying ~446 trying 447 trying ~447 trying 448 trying ~448 trying 449 trying ~449 trying 450 trying ~450 trying 451 trying ~451 trying 452 trying ~452 trying 453 trying ~453 trying 454 trying ~454 trying 455 trying ~455 trying 456 trying ~456 trying 457 trying ~457 trying 458 trying ~458 trying 459 trying ~459 trying 460 trying ~460 trying 461 trying ~461 trying 462 trying ~462 trying 463 trying ~463 trying 464 trying ~464 trying 465 trying ~465 trying 466 trying ~466 trying 467 trying ~467 trying 468 trying ~468 trying 469 trying ~469 trying 470 trying ~470 trying 471 trying ~471 trying 472 trying ~472 trying 473 trying ~473 trying 474 trying ~474 trying 475 trying ~475 trying 476 trying ~476 trying 477 trying ~477 trying 478 trying ~478 trying 479 trying ~479 trying 480 trying ~480 trying 481 trying ~481 trying 482 trying ~482 trying 483 trying ~483 trying 484 trying ~484 trying 485 trying ~485 trying 486 trying ~486 trying 487 trying ~487 trying 488 trying ~488 trying 489 trying ~489 trying 490 trying ~490 trying 491 trying ~491 trying 492 trying ~492 trying 493 trying ~493 trying 494 trying ~494 trying 495 trying ~495 trying 496 trying ~496 trying 497 trying ~497 trying 498 trying ~498 trying 499 trying ~499 trying 500 trying ~500 trying 501 trying ~501 trying 502 trying ~502 trying 503 trying ~503 trying 504 trying ~504 trying 505 trying ~505 trying 506 trying ~506 trying 507 trying ~507 trying 508 trying ~508 trying 509 trying ~509 trying 510 trying ~510 trying 511 trying ~511 trying 512 trying ~512 trying 513 trying ~513 trying 514 trying ~514 trying 515 trying ~515 trying 516 trying ~516 trying 517 trying ~517 trying 518 trying ~518 trying 519 trying ~519 trying 520 trying ~520 trying 521 trying ~521 trying 522 trying ~522 trying 523 trying ~523 trying 524 trying ~524 trying 525 trying ~525 trying 526 trying ~526 trying 527 trying ~527 trying 528 trying ~528 trying 529 trying ~529 trying 530 trying ~530 trying 531 trying ~531 trying 532 trying ~532 trying 533 trying ~533 trying 534 trying ~534 trying 535 trying ~535 trying 536 trying ~536 trying 537 trying ~537 trying 538 trying ~538 trying 539 trying ~539 trying 540 trying ~540 trying 541 trying ~541 trying 542 trying ~542 trying 543 trying ~543 trying 544 trying ~544 trying 545 trying ~545 trying 546 trying ~546 trying 547 trying ~547 trying 548 trying ~548 trying 549 trying ~549 trying 550 trying ~550 trying 551 trying ~551 trying 552 trying ~552 trying 553 trying ~553 trying 554 trying ~554 trying 555 trying ~555 trying 556 trying ~556 trying 557 trying ~557 trying 558 trying ~558 trying 559 trying ~559 trying 560 trying ~560 trying 561 trying ~561 trying 562 trying ~562 trying 563 trying ~563 trying 564 trying ~564 trying 565 trying ~565 trying 566 trying ~566 trying 567 trying ~567 trying 568 trying ~568 trying 569 trying ~569 trying 570 trying ~570 trying 571 trying ~571 trying 572 trying ~572 trying 573 trying ~573 trying 574 trying ~574 trying 575 trying ~575 trying 576 trying ~576 trying 577 trying ~577 trying 578 trying ~578 trying 579 trying ~579 trying 580 trying ~580 trying 581 trying ~581 trying 582 trying ~582 trying 583 trying ~583 trying 584 trying ~584 trying 585 trying ~585 trying 586 trying ~586 trying 587 trying ~587 trying 588 trying ~588 trying 589 trying ~589 trying 590 trying ~590 trying 591 trying ~591 trying 592 trying ~592 trying 593 trying ~593 trying 594 trying ~594 trying 595 trying ~595 trying 596 trying ~596 trying 597 trying ~597 trying 598 trying ~598 trying 599 trying ~599 trying 600 trying ~600 trying 601 trying ~601 trying 602 trying ~602 trying 603 trying ~603 trying 604 trying ~604 trying 605 trying ~605 trying 606 trying ~606 trying 607 trying ~607 trying 608 trying ~608 trying 609 trying ~609 trying 610 trying ~610 trying 611 trying ~611 trying 612 trying ~612 trying 613 trying ~613 trying 614 trying ~614 trying 615 trying ~615 trying 616 trying ~616 trying 617 trying ~617 trying 618 trying ~618 trying 619 trying ~619 trying 620 trying ~620 trying 621 trying ~621 trying 622 trying ~622 trying 623 trying ~623 trying 624 trying ~624 trying 625 trying ~625 trying 626 trying ~626 trying 627 trying ~627 trying 628 trying ~628 trying 629 trying ~629 trying 630 trying ~630 trying 631 trying ~631 trying 632 trying ~632 trying 633 trying ~633 trying 634 trying ~634 trying 635 trying ~635 trying 636 trying ~636 trying 637 trying ~637 trying 638 trying ~638 trying 639 trying ~639 trying 640 trying ~640 trying 641 trying ~641 trying 642 trying ~642 trying 643 trying ~643 trying 644 trying ~644 trying 645 trying ~645 trying 646 trying ~646 trying 647 trying ~647 trying 648 trying ~648 trying 649 trying ~649 trying 650 trying ~650 trying 651 trying ~651 trying 652 trying ~652 trying 653 trying ~653 trying 654 trying ~654 trying 655 trying ~655 trying 656 trying ~656 trying 657 trying ~657 trying 658 trying ~658 trying 659 trying ~659 trying 660 trying ~660 trying 661 trying ~661 trying 662 trying ~662 trying 663 trying ~663 trying 664 trying ~664 trying 665 trying ~665 trying 666 trying ~666 trying 667 trying ~667 trying 668 trying ~668 trying 669 trying ~669 trying 670 trying ~670 trying 671 trying ~671 trying 672 trying ~672 trying 673 trying ~673 trying 674 trying ~674 trying 675 trying ~675 trying 676 trying ~676 trying 677 trying ~677 trying 678 trying ~678 trying 679 trying ~679 trying 680 trying ~680 trying 681 trying ~681 trying 682 trying ~682 trying 683 trying ~683 trying 684 trying ~684 trying 685 trying ~685 trying 686 trying ~686 trying 687 trying ~687 trying 688 trying ~688 trying 689 trying ~689 trying 690 trying ~690 trying 691 trying ~691 trying 692 trying ~692 trying 693 trying ~693 trying 694 trying ~694 trying 695 trying ~695 trying 696 trying ~696 trying 697 trying ~697 trying 698 trying ~698 trying 699 trying ~699 trying 700 trying ~700 trying 701 trying ~701 trying 702 trying ~702 trying 703 trying ~703 trying 704 trying ~704 trying 705 trying ~705 trying 706 trying ~706 trying 707 trying ~707 trying 708 trying ~708 trying 709 trying ~709 trying 710 trying ~710 trying 711 trying ~711 trying 712 trying ~712 trying 713 trying ~713 trying 714 trying ~714 trying 715 trying ~715 trying 716 trying ~716 trying 717 trying ~717 trying 718 trying ~718 trying 719 trying ~719 trying 720 trying ~720 trying 721 trying ~721 trying 722 trying ~722 trying 723 trying ~723 trying 724 trying ~724 trying 725 trying ~725 trying 726 trying ~726 trying 727 trying ~727 trying 728 trying ~728 trying 729 trying ~729 trying 730 trying ~730 trying 731 trying ~731 trying 732 trying ~732 trying 733 trying ~733 trying 734 trying ~734 trying 735 trying ~735 trying 736 trying ~736 trying 737 trying ~737 trying 738 trying ~738 trying 739 trying ~739 trying 740 trying ~740 trying 741 trying ~741 trying 742 trying ~742 trying 743 trying ~743 trying 744 trying ~744 trying 745 trying ~745 trying 746 trying ~746 trying 747 trying ~747 trying 748 trying ~748 trying 749 trying ~749 trying 750 trying ~750 trying 751 trying ~751 trying 752 trying ~752 trying 753 trying ~753 trying 754 trying ~754 trying 755 trying ~755 trying 756 trying ~756 trying 757 trying ~757 trying 758 trying ~758 trying 759 trying ~759 trying 760 trying ~760 trying 761 trying ~761 trying 762 trying ~762 trying 763 trying ~763 trying 764 trying ~764 trying 765 trying ~765 trying 766 trying ~766 trying 767 trying ~767 trying 768 trying ~768 trying 769 trying ~769 trying 770 trying ~770 trying 771 trying ~771 trying 772 trying ~772 trying 773 trying ~773 trying 774 trying ~774 trying 775 trying ~775 trying 776 trying ~776 trying 777 trying ~777 trying 778 trying ~778 trying 779 trying ~779 trying 780 trying ~780 trying 781 trying ~781 trying 782 trying ~782 trying 783 trying ~783 trying 784 trying ~784 trying 785 trying ~785 trying 786 trying ~786 trying 787 trying ~787 trying 788 trying ~788 trying 789 trying ~789 trying 790 trying ~790 trying 791 trying ~791 trying 792 trying ~792 trying 793 trying ~793 trying 794 trying ~794 trying 795 trying ~795 trying 796 trying ~796 trying 797 trying ~797 trying 798 trying ~798 trying 799 trying ~799 trying 800 trying ~800 trying 801 trying ~801 trying 802 trying ~802 trying 803 trying ~803 trying 804 trying ~804 trying 805 trying ~805 trying 806 trying ~806 trying 807 trying ~807 trying 808 trying ~808 trying 809 trying ~809 trying 810 trying ~810 trying 811 trying ~811 trying 812 trying ~812 trying 813 trying ~813 trying 814 trying ~814 trying 815 trying ~815 trying 816 trying ~816 trying 817 trying ~817 trying 818 trying ~818 trying 819 trying ~819 trying 820 trying ~820 trying 821 trying ~821 trying 822 trying ~822 trying 823 trying ~823 trying 824 trying ~824 trying 825 trying ~825 trying 826 trying ~826 trying 827 trying ~827 trying 828 trying ~828 trying 829 trying ~829 trying 830 trying ~830 trying 831 trying ~831 trying 832 trying ~832 trying 833 trying ~833 trying 834 trying ~834 trying 835 trying ~835 trying 836 trying ~836 trying 837 trying ~837 trying 838 trying ~838 trying 839 trying ~839 trying 840 trying ~840 trying 841 trying ~841 trying 842 trying ~842 trying 843 trying ~843 trying 844 trying ~844 trying 845 trying ~845 trying 846 trying ~846 trying 847 trying ~847 trying 848 trying ~848 trying 849 trying ~849 trying 850 trying ~850 trying 851 trying ~851 trying 852 trying ~852 trying 853 trying ~853 trying 854 trying ~854 trying 855 trying ~855 trying 856 trying ~856 trying 857 trying ~857 trying 858 trying ~858 trying 859 trying ~859 trying 860 trying ~860 trying 861 trying ~861 trying 862 trying ~862 trying 863 trying ~863 trying 864 trying ~864 trying 865 trying ~865 trying 866 trying ~866 trying 867 trying ~867 trying 868 trying ~868 trying 869 trying ~869 trying 870 trying ~870 trying 871 trying ~871 trying 872 trying ~872 trying 873 trying ~873 trying 874 trying ~874 trying 875 trying ~875 trying 876 trying ~876 trying 877 trying ~877 trying 878 trying ~878 trying 879 trying ~879 trying 880 trying ~880 trying 881 trying ~881 trying 882 trying ~882 trying 883 trying ~883 trying 884 trying ~884 trying 885 trying ~885 trying 886 trying ~886 trying 887 trying ~887 trying 888 trying ~888 trying 889 trying ~889 trying 890 trying ~890 trying 891 trying ~891 trying 892 trying ~892 trying 893 trying ~893 trying 894 trying ~894 trying 895 trying ~895 trying 896 trying ~896 trying 897 trying ~897 trying 898 trying ~898 trying 899 trying ~899 trying 900 trying ~900 trying 901 trying ~901 trying 902 trying ~902 trying 903 trying ~903 trying 904 trying ~904 trying 905 trying ~905 trying 906 trying ~906 trying 907 trying ~907 trying 908 trying ~908 trying 909 trying ~909 trying 910 trying ~910 trying 911 trying ~911 trying 912 trying ~912 trying 913 trying ~913 trying 914 trying ~914 trying 915 trying ~915 trying 916 trying ~916 trying 917 trying ~917 trying 918 trying ~918 trying 919 trying ~919 trying 920 trying ~920 trying 921 trying ~921 trying 922 trying ~922 trying 923 trying ~923 trying 924 trying ~924 trying 925 trying ~925 trying 926 trying ~926 trying 927 trying ~927 trying 928 trying ~928 trying 929 trying ~929 trying 930 trying ~930 trying 931 trying ~931 trying 932 trying ~932 trying 933 trying ~933 trying 934 trying ~934 trying 935 trying ~935 trying 936 trying ~936 trying 937 trying ~937 trying 938 trying ~938 trying 939 trying ~939 trying 940 trying ~940 trying 941 trying ~941 trying 942 trying ~942 trying 943 trying ~943 trying 944 trying ~944 trying 945 trying ~945 trying 946 trying ~946 trying 947 trying ~947 trying 948 trying ~948 trying 949 trying ~949 trying 950 trying ~950 trying 951 trying ~951 trying 952 trying ~952 trying 953 trying ~953 trying 954 trying ~954 trying 955 trying ~955 trying 956 trying ~956 trying 957 trying ~957 trying 958 trying ~958 trying 959 trying ~959 trying 960 trying ~960 trying 961 trying ~961 trying 962 trying ~962 trying 963 trying ~963 trying 964 trying ~964 trying 965 trying ~965 trying 966 trying ~966 trying 967 trying ~967 trying 968 trying ~968 trying 969 trying ~969 trying 970 trying ~970 trying 971 trying ~971 trying 972 trying ~972 trying 973 trying ~973 trying 974 trying ~974 trying 975 trying ~975 trying 976 trying ~976 trying 977 trying ~977 trying 978 trying ~978 trying 979 trying ~979 trying 980 trying ~980 trying 981 trying ~981 trying 982 trying ~982 trying 983 trying ~983 trying 984 trying ~984 trying 985 trying ~985 trying 986 trying ~986 trying 987 trying ~987 trying 988 trying ~988 trying 989 trying ~989 trying 990 trying ~990 trying 991 trying ~991 trying 992 trying ~992 trying 993 trying ~993 trying 994 trying ~994 trying 995 trying ~995 trying 996 trying ~996 trying 997 trying ~997 trying 998 trying ~998 trying 999 trying ~999 trying 1073740824 trying ~1073740824 trying 1073740825 trying ~1073740825 trying 1073740826 trying ~1073740826 trying 1073740827 trying ~1073740827 trying 1073740828 trying ~1073740828 trying 1073740829 trying ~1073740829 trying 1073740830 trying ~1073740830 trying 1073740831 trying ~1073740831 trying 1073740832 trying ~1073740832 trying 1073740833 trying ~1073740833 trying 1073740834 trying ~1073740834 trying 1073740835 trying ~1073740835 trying 1073740836 trying ~1073740836 trying 1073740837 trying ~1073740837 trying 1073740838 trying ~1073740838 trying 1073740839 trying ~1073740839 trying 1073740840 trying ~1073740840 trying 1073740841 trying ~1073740841 trying 1073740842 trying ~1073740842 trying 1073740843 trying ~1073740843 trying 1073740844 trying ~1073740844 trying 1073740845 trying ~1073740845 trying 1073740846 trying ~1073740846 trying 1073740847 trying ~1073740847 trying 1073740848 trying ~1073740848 trying 1073740849 trying ~1073740849 trying 1073740850 trying ~1073740850 trying 1073740851 trying ~1073740851 trying 1073740852 trying ~1073740852 trying 1073740853 trying ~1073740853 trying 1073740854 trying ~1073740854 trying 1073740855 trying ~1073740855 trying 1073740856 trying ~1073740856 trying 1073740857 trying ~1073740857 trying 1073740858 trying ~1073740858 trying 1073740859 trying ~1073740859 trying 1073740860 trying ~1073740860 trying 1073740861 trying ~1073740861 trying 1073740862 trying ~1073740862 trying 1073740863 trying ~1073740863 trying 1073740864 trying ~1073740864 trying 1073740865 trying ~1073740865 trying 1073740866 trying ~1073740866 trying 1073740867 trying ~1073740867 trying 1073740868 trying ~1073740868 trying 1073740869 trying ~1073740869 trying 1073740870 trying ~1073740870 trying 1073740871 trying ~1073740871 trying 1073740872 trying ~1073740872 trying 1073740873 trying ~1073740873 trying 1073740874 trying ~1073740874 trying 1073740875 trying ~1073740875 trying 1073740876 trying ~1073740876 trying 1073740877 trying ~1073740877 trying 1073740878 trying ~1073740878 trying 1073740879 trying ~1073740879 trying 1073740880 trying ~1073740880 trying 1073740881 trying ~1073740881 trying 1073740882 trying ~1073740882 trying 1073740883 trying ~1073740883 trying 1073740884 trying ~1073740884 trying 1073740885 trying ~1073740885 trying 1073740886 trying ~1073740886 trying 1073740887 trying ~1073740887 trying 1073740888 trying ~1073740888 trying 1073740889 trying ~1073740889 trying 1073740890 trying ~1073740890 trying 1073740891 trying ~1073740891 trying 1073740892 trying ~1073740892 trying 1073740893 trying ~1073740893 trying 1073740894 trying ~1073740894 trying 1073740895 trying ~1073740895 trying 1073740896 trying ~1073740896 trying 1073740897 trying ~1073740897 trying 1073740898 trying ~1073740898 trying 1073740899 trying ~1073740899 trying 1073740900 trying ~1073740900 trying 1073740901 trying ~1073740901 trying 1073740902 trying ~1073740902 trying 1073740903 trying ~1073740903 trying 1073740904 trying ~1073740904 trying 1073740905 trying ~1073740905 trying 1073740906 trying ~1073740906 trying 1073740907 trying ~1073740907 trying 1073740908 trying ~1073740908 trying 1073740909 trying ~1073740909 trying 1073740910 trying ~1073740910 trying 1073740911 trying ~1073740911 trying 1073740912 trying ~1073740912 trying 1073740913 trying ~1073740913 trying 1073740914 trying ~1073740914 trying 1073740915 trying ~1073740915 trying 1073740916 trying ~1073740916 trying 1073740917 trying ~1073740917 trying 1073740918 trying ~1073740918 trying 1073740919 trying ~1073740919 trying 1073740920 trying ~1073740920 trying 1073740921 trying ~1073740921 trying 1073740922 trying ~1073740922 trying 1073740923 trying ~1073740923 trying 1073740924 trying ~1073740924 trying 1073740925 trying ~1073740925 trying 1073740926 trying ~1073740926 trying 1073740927 trying ~1073740927 trying 1073740928 trying ~1073740928 trying 1073740929 trying ~1073740929 trying 1073740930 trying ~1073740930 trying 1073740931 trying ~1073740931 trying 1073740932 trying ~1073740932 trying 1073740933 trying ~1073740933 trying 1073740934 trying ~1073740934 trying 1073740935 trying ~1073740935 trying 1073740936 trying ~1073740936 trying 1073740937 trying ~1073740937 trying 1073740938 trying ~1073740938 trying 1073740939 trying ~1073740939 trying 1073740940 trying ~1073740940 trying 1073740941 trying ~1073740941 trying 1073740942 trying ~1073740942 trying 1073740943 trying ~1073740943 trying 1073740944 trying ~1073740944 trying 1073740945 trying ~1073740945 trying 1073740946 trying ~1073740946 trying 1073740947 trying ~1073740947 trying 1073740948 trying ~1073740948 trying 1073740949 trying ~1073740949 trying 1073740950 trying ~1073740950 trying 1073740951 trying ~1073740951 trying 1073740952 trying ~1073740952 trying 1073740953 trying ~1073740953 trying 1073740954 trying ~1073740954 trying 1073740955 trying ~1073740955 trying 1073740956 trying ~1073740956 trying 1073740957 trying ~1073740957 trying 1073740958 trying ~1073740958 trying 1073740959 trying ~1073740959 trying 1073740960 trying ~1073740960 trying 1073740961 trying ~1073740961 trying 1073740962 trying ~1073740962 trying 1073740963 trying ~1073740963 trying 1073740964 trying ~1073740964 trying 1073740965 trying ~1073740965 trying 1073740966 trying ~1073740966 trying 1073740967 trying ~1073740967 trying 1073740968 trying ~1073740968 trying 1073740969 trying ~1073740969 trying 1073740970 trying ~1073740970 trying 1073740971 trying ~1073740971 trying 1073740972 trying ~1073740972 trying 1073740973 trying ~1073740973 trying 1073740974 trying ~1073740974 trying 1073740975 trying ~1073740975 trying 1073740976 trying ~1073740976 trying 1073740977 trying ~1073740977 trying 1073740978 trying ~1073740978 trying 1073740979 trying ~1073740979 trying 1073740980 trying ~1073740980 trying 1073740981 trying ~1073740981 trying 1073740982 trying ~1073740982 trying 1073740983 trying ~1073740983 trying 1073740984 trying ~1073740984 trying 1073740985 trying ~1073740985 trying 1073740986 trying ~1073740986 trying 1073740987 trying ~1073740987 trying 1073740988 trying ~1073740988 trying 1073740989 trying ~1073740989 trying 1073740990 trying ~1073740990 trying 1073740991 trying ~1073740991 trying 1073740992 trying ~1073740992 trying 1073740993 trying ~1073740993 trying 1073740994 trying ~1073740994 trying 1073740995 trying ~1073740995 trying 1073740996 trying ~1073740996 trying 1073740997 trying ~1073740997 trying 1073740998 trying ~1073740998 trying 1073740999 trying ~1073740999 trying 1073741000 trying ~1073741000 trying 1073741001 trying ~1073741001 trying 1073741002 trying ~1073741002 trying 1073741003 trying ~1073741003 trying 1073741004 trying ~1073741004 trying 1073741005 trying ~1073741005 trying 1073741006 trying ~1073741006 trying 1073741007 trying ~1073741007 trying 1073741008 trying ~1073741008 trying 1073741009 trying ~1073741009 trying 1073741010 trying ~1073741010 trying 1073741011 trying ~1073741011 trying 1073741012 trying ~1073741012 trying 1073741013 trying ~1073741013 trying 1073741014 trying ~1073741014 trying 1073741015 trying ~1073741015 trying 1073741016 trying ~1073741016 trying 1073741017 trying ~1073741017 trying 1073741018 trying ~1073741018 trying 1073741019 trying ~1073741019 trying 1073741020 trying ~1073741020 trying 1073741021 trying ~1073741021 trying 1073741022 trying ~1073741022 trying 1073741023 trying ~1073741023 trying 1073741024 trying ~1073741024 trying 1073741025 trying ~1073741025 trying 1073741026 trying ~1073741026 trying 1073741027 trying ~1073741027 trying 1073741028 trying ~1073741028 trying 1073741029 trying ~1073741029 trying 1073741030 trying ~1073741030 trying 1073741031 trying ~1073741031 trying 1073741032 trying ~1073741032 trying 1073741033 trying ~1073741033 trying 1073741034 trying ~1073741034 trying 1073741035 trying ~1073741035 trying 1073741036 trying ~1073741036 trying 1073741037 trying ~1073741037 trying 1073741038 trying ~1073741038 trying 1073741039 trying ~1073741039 trying 1073741040 trying ~1073741040 trying 1073741041 trying ~1073741041 trying 1073741042 trying ~1073741042 trying 1073741043 trying ~1073741043 trying 1073741044 trying ~1073741044 trying 1073741045 trying ~1073741045 trying 1073741046 trying ~1073741046 trying 1073741047 trying ~1073741047 trying 1073741048 trying ~1073741048 trying 1073741049 trying ~1073741049 trying 1073741050 trying ~1073741050 trying 1073741051 trying ~1073741051 trying 1073741052 trying ~1073741052 trying 1073741053 trying ~1073741053 trying 1073741054 trying ~1073741054 trying 1073741055 trying ~1073741055 trying 1073741056 trying ~1073741056 trying 1073741057 trying ~1073741057 trying 1073741058 trying ~1073741058 trying 1073741059 trying ~1073741059 trying 1073741060 trying ~1073741060 trying 1073741061 trying ~1073741061 trying 1073741062 trying ~1073741062 trying 1073741063 trying ~1073741063 trying 1073741064 trying ~1073741064 trying 1073741065 trying ~1073741065 trying 1073741066 trying ~1073741066 trying 1073741067 trying ~1073741067 trying 1073741068 trying ~1073741068 trying 1073741069 trying ~1073741069 trying 1073741070 trying ~1073741070 trying 1073741071 trying ~1073741071 trying 1073741072 trying ~1073741072 trying 1073741073 trying ~1073741073 trying 1073741074 trying ~1073741074 trying 1073741075 trying ~1073741075 trying 1073741076 trying ~1073741076 trying 1073741077 trying ~1073741077 trying 1073741078 trying ~1073741078 trying 1073741079 trying ~1073741079 trying 1073741080 trying ~1073741080 trying 1073741081 trying ~1073741081 trying 1073741082 trying ~1073741082 trying 1073741083 trying ~1073741083 trying 1073741084 trying ~1073741084 trying 1073741085 trying ~1073741085 trying 1073741086 trying ~1073741086 trying 1073741087 trying ~1073741087 trying 1073741088 trying ~1073741088 trying 1073741089 trying ~1073741089 trying 1073741090 trying ~1073741090 trying 1073741091 trying ~1073741091 trying 1073741092 trying ~1073741092 trying 1073741093 trying ~1073741093 trying 1073741094 trying ~1073741094 trying 1073741095 trying ~1073741095 trying 1073741096 trying ~1073741096 trying 1073741097 trying ~1073741097 trying 1073741098 trying ~1073741098 trying 1073741099 trying ~1073741099 trying 1073741100 trying ~1073741100 trying 1073741101 trying ~1073741101 trying 1073741102 trying ~1073741102 trying 1073741103 trying ~1073741103 trying 1073741104 trying ~1073741104 trying 1073741105 trying ~1073741105 trying 1073741106 trying ~1073741106 trying 1073741107 trying ~1073741107 trying 1073741108 trying ~1073741108 trying 1073741109 trying ~1073741109 trying 1073741110 trying ~1073741110 trying 1073741111 trying ~1073741111 trying 1073741112 trying ~1073741112 trying 1073741113 trying ~1073741113 trying 1073741114 trying ~1073741114 trying 1073741115 trying ~1073741115 trying 1073741116 trying ~1073741116 trying 1073741117 trying ~1073741117 trying 1073741118 trying ~1073741118 trying 1073741119 trying ~1073741119 trying 1073741120 trying ~1073741120 trying 1073741121 trying ~1073741121 trying 1073741122 trying ~1073741122 trying 1073741123 trying ~1073741123 trying 1073741124 trying ~1073741124 trying 1073741125 trying ~1073741125 trying 1073741126 trying ~1073741126 trying 1073741127 trying ~1073741127 trying 1073741128 trying ~1073741128 trying 1073741129 trying ~1073741129 trying 1073741130 trying ~1073741130 trying 1073741131 trying ~1073741131 trying 1073741132 trying ~1073741132 trying 1073741133 trying ~1073741133 trying 1073741134 trying ~1073741134 trying 1073741135 trying ~1073741135 trying 1073741136 trying ~1073741136 trying 1073741137 trying ~1073741137 trying 1073741138 trying ~1073741138 trying 1073741139 trying ~1073741139 trying 1073741140 trying ~1073741140 trying 1073741141 trying ~1073741141 trying 1073741142 trying ~1073741142 trying 1073741143 trying ~1073741143 trying 1073741144 trying ~1073741144 trying 1073741145 trying ~1073741145 trying 1073741146 trying ~1073741146 trying 1073741147 trying ~1073741147 trying 1073741148 trying ~1073741148 trying 1073741149 trying ~1073741149 trying 1073741150 trying ~1073741150 trying 1073741151 trying ~1073741151 trying 1073741152 trying ~1073741152 trying 1073741153 trying ~1073741153 trying 1073741154 trying ~1073741154 trying 1073741155 trying ~1073741155 trying 1073741156 trying ~1073741156 trying 1073741157 trying ~1073741157 trying 1073741158 trying ~1073741158 trying 1073741159 trying ~1073741159 trying 1073741160 trying ~1073741160 trying 1073741161 trying ~1073741161 trying 1073741162 trying ~1073741162 trying 1073741163 trying ~1073741163 trying 1073741164 trying ~1073741164 trying 1073741165 trying ~1073741165 trying 1073741166 trying ~1073741166 trying 1073741167 trying ~1073741167 trying 1073741168 trying ~1073741168 trying 1073741169 trying ~1073741169 trying 1073741170 trying ~1073741170 trying 1073741171 trying ~1073741171 trying 1073741172 trying ~1073741172 trying 1073741173 trying ~1073741173 trying 1073741174 trying ~1073741174 trying 1073741175 trying ~1073741175 trying 1073741176 trying ~1073741176 trying 1073741177 trying ~1073741177 trying 1073741178 trying ~1073741178 trying 1073741179 trying ~1073741179 trying 1073741180 trying ~1073741180 trying 1073741181 trying ~1073741181 trying 1073741182 trying ~1073741182 trying 1073741183 trying ~1073741183 trying 1073741184 trying ~1073741184 trying 1073741185 trying ~1073741185 trying 1073741186 trying ~1073741186 trying 1073741187 trying ~1073741187 trying 1073741188 trying ~1073741188 trying 1073741189 trying ~1073741189 trying 1073741190 trying ~1073741190 trying 1073741191 trying ~1073741191 trying 1073741192 trying ~1073741192 trying 1073741193 trying ~1073741193 trying 1073741194 trying ~1073741194 trying 1073741195 trying ~1073741195 trying 1073741196 trying ~1073741196 trying 1073741197 trying ~1073741197 trying 1073741198 trying ~1073741198 trying 1073741199 trying ~1073741199 trying 1073741200 trying ~1073741200 trying 1073741201 trying ~1073741201 trying 1073741202 trying ~1073741202 trying 1073741203 trying ~1073741203 trying 1073741204 trying ~1073741204 trying 1073741205 trying ~1073741205 trying 1073741206 trying ~1073741206 trying 1073741207 trying ~1073741207 trying 1073741208 trying ~1073741208 trying 1073741209 trying ~1073741209 trying 1073741210 trying ~1073741210 trying 1073741211 trying ~1073741211 trying 1073741212 trying ~1073741212 trying 1073741213 trying ~1073741213 trying 1073741214 trying ~1073741214 trying 1073741215 trying ~1073741215 trying 1073741216 trying ~1073741216 trying 1073741217 trying ~1073741217 trying 1073741218 trying ~1073741218 trying 1073741219 trying ~1073741219 trying 1073741220 trying ~1073741220 trying 1073741221 trying ~1073741221 trying 1073741222 trying ~1073741222 trying 1073741223 trying ~1073741223 trying 1073741224 trying ~1073741224 trying 1073741225 trying ~1073741225 trying 1073741226 trying ~1073741226 trying 1073741227 trying ~1073741227 trying 1073741228 trying ~1073741228 trying 1073741229 trying ~1073741229 trying 1073741230 trying ~1073741230 trying 1073741231 trying ~1073741231 trying 1073741232 trying ~1073741232 trying 1073741233 trying ~1073741233 trying 1073741234 trying ~1073741234 trying 1073741235 trying ~1073741235 trying 1073741236 trying ~1073741236 trying 1073741237 trying ~1073741237 trying 1073741238 trying ~1073741238 trying 1073741239 trying ~1073741239 trying 1073741240 trying ~1073741240 trying 1073741241 trying ~1073741241 trying 1073741242 trying ~1073741242 trying 1073741243 trying ~1073741243 trying 1073741244 trying ~1073741244 trying 1073741245 trying ~1073741245 trying 1073741246 trying ~1073741246 trying 1073741247 trying ~1073741247 trying 1073741248 trying ~1073741248 trying 1073741249 trying ~1073741249 trying 1073741250 trying ~1073741250 trying 1073741251 trying ~1073741251 trying 1073741252 trying ~1073741252 trying 1073741253 trying ~1073741253 trying 1073741254 trying ~1073741254 trying 1073741255 trying ~1073741255 trying 1073741256 trying ~1073741256 trying 1073741257 trying ~1073741257 trying 1073741258 trying ~1073741258 trying 1073741259 trying ~1073741259 trying 1073741260 trying ~1073741260 trying 1073741261 trying ~1073741261 trying 1073741262 trying ~1073741262 trying 1073741263 trying ~1073741263 trying 1073741264 trying ~1073741264 trying 1073741265 trying ~1073741265 trying 1073741266 trying ~1073741266 trying 1073741267 trying ~1073741267 trying 1073741268 trying ~1073741268 trying 1073741269 trying ~1073741269 trying 1073741270 trying ~1073741270 trying 1073741271 trying ~1073741271 trying 1073741272 trying ~1073741272 trying 1073741273 trying ~1073741273 trying 1073741274 trying ~1073741274 trying 1073741275 trying ~1073741275 trying 1073741276 trying ~1073741276 trying 1073741277 trying ~1073741277 trying 1073741278 trying ~1073741278 trying 1073741279 trying ~1073741279 trying 1073741280 trying ~1073741280 trying 1073741281 trying ~1073741281 trying 1073741282 trying ~1073741282 trying 1073741283 trying ~1073741283 trying 1073741284 trying ~1073741284 trying 1073741285 trying ~1073741285 trying 1073741286 trying ~1073741286 trying 1073741287 trying ~1073741287 trying 1073741288 trying ~1073741288 trying 1073741289 trying ~1073741289 trying 1073741290 trying ~1073741290 trying 1073741291 trying ~1073741291 trying 1073741292 trying ~1073741292 trying 1073741293 trying ~1073741293 trying 1073741294 trying ~1073741294 trying 1073741295 trying ~1073741295 trying 1073741296 trying ~1073741296 trying 1073741297 trying ~1073741297 trying 1073741298 trying ~1073741298 trying 1073741299 trying ~1073741299 trying 1073741300 trying ~1073741300 trying 1073741301 trying ~1073741301 trying 1073741302 trying ~1073741302 trying 1073741303 trying ~1073741303 trying 1073741304 trying ~1073741304 trying 1073741305 trying ~1073741305 trying 1073741306 trying ~1073741306 trying 1073741307 trying ~1073741307 trying 1073741308 trying ~1073741308 trying 1073741309 trying ~1073741309 trying 1073741310 trying ~1073741310 trying 1073741311 trying ~1073741311 trying 1073741312 trying ~1073741312 trying 1073741313 trying ~1073741313 trying 1073741314 trying ~1073741314 trying 1073741315 trying ~1073741315 trying 1073741316 trying ~1073741316 trying 1073741317 trying ~1073741317 trying 1073741318 trying ~1073741318 trying 1073741319 trying ~1073741319 trying 1073741320 trying ~1073741320 trying 1073741321 trying ~1073741321 trying 1073741322 trying ~1073741322 trying 1073741323 trying ~1073741323 trying 1073741324 trying ~1073741324 trying 1073741325 trying ~1073741325 trying 1073741326 trying ~1073741326 trying 1073741327 trying ~1073741327 trying 1073741328 trying ~1073741328 trying 1073741329 trying ~1073741329 trying 1073741330 trying ~1073741330 trying 1073741331 trying ~1073741331 trying 1073741332 trying ~1073741332 trying 1073741333 trying ~1073741333 trying 1073741334 trying ~1073741334 trying 1073741335 trying ~1073741335 trying 1073741336 trying ~1073741336 trying 1073741337 trying ~1073741337 trying 1073741338 trying ~1073741338 trying 1073741339 trying ~1073741339 trying 1073741340 trying ~1073741340 trying 1073741341 trying ~1073741341 trying 1073741342 trying ~1073741342 trying 1073741343 trying ~1073741343 trying 1073741344 trying ~1073741344 trying 1073741345 trying ~1073741345 trying 1073741346 trying ~1073741346 trying 1073741347 trying ~1073741347 trying 1073741348 trying ~1073741348 trying 1073741349 trying ~1073741349 trying 1073741350 trying ~1073741350 trying 1073741351 trying ~1073741351 trying 1073741352 trying ~1073741352 trying 1073741353 trying ~1073741353 trying 1073741354 trying ~1073741354 trying 1073741355 trying ~1073741355 trying 1073741356 trying ~1073741356 trying 1073741357 trying ~1073741357 trying 1073741358 trying ~1073741358 trying 1073741359 trying ~1073741359 trying 1073741360 trying ~1073741360 trying 1073741361 trying ~1073741361 trying 1073741362 trying ~1073741362 trying 1073741363 trying ~1073741363 trying 1073741364 trying ~1073741364 trying 1073741365 trying ~1073741365 trying 1073741366 trying ~1073741366 trying 1073741367 trying ~1073741367 trying 1073741368 trying ~1073741368 trying 1073741369 trying ~1073741369 trying 1073741370 trying ~1073741370 trying 1073741371 trying ~1073741371 trying 1073741372 trying ~1073741372 trying 1073741373 trying ~1073741373 trying 1073741374 trying ~1073741374 trying 1073741375 trying ~1073741375 trying 1073741376 trying ~1073741376 trying 1073741377 trying ~1073741377 trying 1073741378 trying ~1073741378 trying 1073741379 trying ~1073741379 trying 1073741380 trying ~1073741380 trying 1073741381 trying ~1073741381 trying 1073741382 trying ~1073741382 trying 1073741383 trying ~1073741383 trying 1073741384 trying ~1073741384 trying 1073741385 trying ~1073741385 trying 1073741386 trying ~1073741386 trying 1073741387 trying ~1073741387 trying 1073741388 trying ~1073741388 trying 1073741389 trying ~1073741389 trying 1073741390 trying ~1073741390 trying 1073741391 trying ~1073741391 trying 1073741392 trying ~1073741392 trying 1073741393 trying ~1073741393 trying 1073741394 trying ~1073741394 trying 1073741395 trying ~1073741395 trying 1073741396 trying ~1073741396 trying 1073741397 trying ~1073741397 trying 1073741398 trying ~1073741398 trying 1073741399 trying ~1073741399 trying 1073741400 trying ~1073741400 trying 1073741401 trying ~1073741401 trying 1073741402 trying ~1073741402 trying 1073741403 trying ~1073741403 trying 1073741404 trying ~1073741404 trying 1073741405 trying ~1073741405 trying 1073741406 trying ~1073741406 trying 1073741407 trying ~1073741407 trying 1073741408 trying ~1073741408 trying 1073741409 trying ~1073741409 trying 1073741410 trying ~1073741410 trying 1073741411 trying ~1073741411 trying 1073741412 trying ~1073741412 trying 1073741413 trying ~1073741413 trying 1073741414 trying ~1073741414 trying 1073741415 trying ~1073741415 trying 1073741416 trying ~1073741416 trying 1073741417 trying ~1073741417 trying 1073741418 trying ~1073741418 trying 1073741419 trying ~1073741419 trying 1073741420 trying ~1073741420 trying 1073741421 trying ~1073741421 trying 1073741422 trying ~1073741422 trying 1073741423 trying ~1073741423 trying 1073741424 trying ~1073741424 trying 1073741425 trying ~1073741425 trying 1073741426 trying ~1073741426 trying 1073741427 trying ~1073741427 trying 1073741428 trying ~1073741428 trying 1073741429 trying ~1073741429 trying 1073741430 trying ~1073741430 trying 1073741431 trying ~1073741431 trying 1073741432 trying ~1073741432 trying 1073741433 trying ~1073741433 trying 1073741434 trying ~1073741434 trying 1073741435 trying ~1073741435 trying 1073741436 trying ~1073741436 trying 1073741437 trying ~1073741437 trying 1073741438 trying ~1073741438 trying 1073741439 trying ~1073741439 trying 1073741440 trying ~1073741440 trying 1073741441 trying ~1073741441 trying 1073741442 trying ~1073741442 trying 1073741443 trying ~1073741443 trying 1073741444 trying ~1073741444 trying 1073741445 trying ~1073741445 trying 1073741446 trying ~1073741446 trying 1073741447 trying ~1073741447 trying 1073741448 trying ~1073741448 trying 1073741449 trying ~1073741449 trying 1073741450 trying ~1073741450 trying 1073741451 trying ~1073741451 trying 1073741452 trying ~1073741452 trying 1073741453 trying ~1073741453 trying 1073741454 trying ~1073741454 trying 1073741455 trying ~1073741455 trying 1073741456 trying ~1073741456 trying 1073741457 trying ~1073741457 trying 1073741458 trying ~1073741458 trying 1073741459 trying ~1073741459 trying 1073741460 trying ~1073741460 trying 1073741461 trying ~1073741461 trying 1073741462 trying ~1073741462 trying 1073741463 trying ~1073741463 trying 1073741464 trying ~1073741464 trying 1073741465 trying ~1073741465 trying 1073741466 trying ~1073741466 trying 1073741467 trying ~1073741467 trying 1073741468 trying ~1073741468 trying 1073741469 trying ~1073741469 trying 1073741470 trying ~1073741470 trying 1073741471 trying ~1073741471 trying 1073741472 trying ~1073741472 trying 1073741473 trying ~1073741473 trying 1073741474 trying ~1073741474 trying 1073741475 trying ~1073741475 trying 1073741476 trying ~1073741476 trying 1073741477 trying ~1073741477 trying 1073741478 trying ~1073741478 trying 1073741479 trying ~1073741479 trying 1073741480 trying ~1073741480 trying 1073741481 trying ~1073741481 trying 1073741482 trying ~1073741482 trying 1073741483 trying ~1073741483 trying 1073741484 trying ~1073741484 trying 1073741485 trying ~1073741485 trying 1073741486 trying ~1073741486 trying 1073741487 trying ~1073741487 trying 1073741488 trying ~1073741488 trying 1073741489 trying ~1073741489 trying 1073741490 trying ~1073741490 trying 1073741491 trying ~1073741491 trying 1073741492 trying ~1073741492 trying 1073741493 trying ~1073741493 trying 1073741494 trying ~1073741494 trying 1073741495 trying ~1073741495 trying 1073741496 trying ~1073741496 trying 1073741497 trying ~1073741497 trying 1073741498 trying ~1073741498 trying 1073741499 trying ~1073741499 trying 1073741500 trying ~1073741500 trying 1073741501 trying ~1073741501 trying 1073741502 trying ~1073741502 trying 1073741503 trying ~1073741503 trying 1073741504 trying ~1073741504 trying 1073741505 trying ~1073741505 trying 1073741506 trying ~1073741506 trying 1073741507 trying ~1073741507 trying 1073741508 trying ~1073741508 trying 1073741509 trying ~1073741509 trying 1073741510 trying ~1073741510 trying 1073741511 trying ~1073741511 trying 1073741512 trying ~1073741512 trying 1073741513 trying ~1073741513 trying 1073741514 trying ~1073741514 trying 1073741515 trying ~1073741515 trying 1073741516 trying ~1073741516 trying 1073741517 trying ~1073741517 trying 1073741518 trying ~1073741518 trying 1073741519 trying ~1073741519 trying 1073741520 trying ~1073741520 trying 1073741521 trying ~1073741521 trying 1073741522 trying ~1073741522 trying 1073741523 trying ~1073741523 trying 1073741524 trying ~1073741524 trying 1073741525 trying ~1073741525 trying 1073741526 trying ~1073741526 trying 1073741527 trying ~1073741527 trying 1073741528 trying ~1073741528 trying 1073741529 trying ~1073741529 trying 1073741530 trying ~1073741530 trying 1073741531 trying ~1073741531 trying 1073741532 trying ~1073741532 trying 1073741533 trying ~1073741533 trying 1073741534 trying ~1073741534 trying 1073741535 trying ~1073741535 trying 1073741536 trying ~1073741536 trying 1073741537 trying ~1073741537 trying 1073741538 trying ~1073741538 trying 1073741539 trying ~1073741539 trying 1073741540 trying ~1073741540 trying 1073741541 trying ~1073741541 trying 1073741542 trying ~1073741542 trying 1073741543 trying ~1073741543 trying 1073741544 trying ~1073741544 trying 1073741545 trying ~1073741545 trying 1073741546 trying ~1073741546 trying 1073741547 trying ~1073741547 trying 1073741548 trying ~1073741548 trying 1073741549 trying ~1073741549 trying 1073741550 trying ~1073741550 trying 1073741551 trying ~1073741551 trying 1073741552 trying ~1073741552 trying 1073741553 trying ~1073741553 trying 1073741554 trying ~1073741554 trying 1073741555 trying ~1073741555 trying 1073741556 trying ~1073741556 trying 1073741557 trying ~1073741557 trying 1073741558 trying ~1073741558 trying 1073741559 trying ~1073741559 trying 1073741560 trying ~1073741560 trying 1073741561 trying ~1073741561 trying 1073741562 trying ~1073741562 trying 1073741563 trying ~1073741563 trying 1073741564 trying ~1073741564 trying 1073741565 trying ~1073741565 trying 1073741566 trying ~1073741566 trying 1073741567 trying ~1073741567 trying 1073741568 trying ~1073741568 trying 1073741569 trying ~1073741569 trying 1073741570 trying ~1073741570 trying 1073741571 trying ~1073741571 trying 1073741572 trying ~1073741572 trying 1073741573 trying ~1073741573 trying 1073741574 trying ~1073741574 trying 1073741575 trying ~1073741575 trying 1073741576 trying ~1073741576 trying 1073741577 trying ~1073741577 trying 1073741578 trying ~1073741578 trying 1073741579 trying ~1073741579 trying 1073741580 trying ~1073741580 trying 1073741581 trying ~1073741581 trying 1073741582 trying ~1073741582 trying 1073741583 trying ~1073741583 trying 1073741584 trying ~1073741584 trying 1073741585 trying ~1073741585 trying 1073741586 trying ~1073741586 trying 1073741587 trying ~1073741587 trying 1073741588 trying ~1073741588 trying 1073741589 trying ~1073741589 trying 1073741590 trying ~1073741590 trying 1073741591 trying ~1073741591 trying 1073741592 trying ~1073741592 trying 1073741593 trying ~1073741593 trying 1073741594 trying ~1073741594 trying 1073741595 trying ~1073741595 trying 1073741596 trying ~1073741596 trying 1073741597 trying ~1073741597 trying 1073741598 trying ~1073741598 trying 1073741599 trying ~1073741599 trying 1073741600 trying ~1073741600 trying 1073741601 trying ~1073741601 trying 1073741602 trying ~1073741602 trying 1073741603 trying ~1073741603 trying 1073741604 trying ~1073741604 trying 1073741605 trying ~1073741605 trying 1073741606 trying ~1073741606 trying 1073741607 trying ~1073741607 trying 1073741608 trying ~1073741608 trying 1073741609 trying ~1073741609 trying 1073741610 trying ~1073741610 trying 1073741611 trying ~1073741611 trying 1073741612 trying ~1073741612 trying 1073741613 trying ~1073741613 trying 1073741614 trying ~1073741614 trying 1073741615 trying ~1073741615 trying 1073741616 trying ~1073741616 trying 1073741617 trying ~1073741617 trying 1073741618 trying ~1073741618 trying 1073741619 trying ~1073741619 trying 1073741620 trying ~1073741620 trying 1073741621 trying ~1073741621 trying 1073741622 trying ~1073741622 trying 1073741623 trying ~1073741623 trying 1073741624 trying ~1073741624 trying 1073741625 trying ~1073741625 trying 1073741626 trying ~1073741626 trying 1073741627 trying ~1073741627 trying 1073741628 trying ~1073741628 trying 1073741629 trying ~1073741629 trying 1073741630 trying ~1073741630 trying 1073741631 trying ~1073741631 trying 1073741632 trying ~1073741632 trying 1073741633 trying ~1073741633 trying 1073741634 trying ~1073741634 trying 1073741635 trying ~1073741635 trying 1073741636 trying ~1073741636 trying 1073741637 trying ~1073741637 trying 1073741638 trying ~1073741638 trying 1073741639 trying ~1073741639 trying 1073741640 trying ~1073741640 trying 1073741641 trying ~1073741641 trying 1073741642 trying ~1073741642 trying 1073741643 trying ~1073741643 trying 1073741644 trying ~1073741644 trying 1073741645 trying ~1073741645 trying 1073741646 trying ~1073741646 trying 1073741647 trying ~1073741647 trying 1073741648 trying ~1073741648 trying 1073741649 trying ~1073741649 trying 1073741650 trying ~1073741650 trying 1073741651 trying ~1073741651 trying 1073741652 trying ~1073741652 trying 1073741653 trying ~1073741653 trying 1073741654 trying ~1073741654 trying 1073741655 trying ~1073741655 trying 1073741656 trying ~1073741656 trying 1073741657 trying ~1073741657 trying 1073741658 trying ~1073741658 trying 1073741659 trying ~1073741659 trying 1073741660 trying ~1073741660 trying 1073741661 trying ~1073741661 trying 1073741662 trying ~1073741662 trying 1073741663 trying ~1073741663 trying 1073741664 trying ~1073741664 trying 1073741665 trying ~1073741665 trying 1073741666 trying ~1073741666 trying 1073741667 trying ~1073741667 trying 1073741668 trying ~1073741668 trying 1073741669 trying ~1073741669 trying 1073741670 trying ~1073741670 trying 1073741671 trying ~1073741671 trying 1073741672 trying ~1073741672 trying 1073741673 trying ~1073741673 trying 1073741674 trying ~1073741674 trying 1073741675 trying ~1073741675 trying 1073741676 trying ~1073741676 trying 1073741677 trying ~1073741677 trying 1073741678 trying ~1073741678 trying 1073741679 trying ~1073741679 trying 1073741680 trying ~1073741680 trying 1073741681 trying ~1073741681 trying 1073741682 trying ~1073741682 trying 1073741683 trying ~1073741683 trying 1073741684 trying ~1073741684 trying 1073741685 trying ~1073741685 trying 1073741686 trying ~1073741686 trying 1073741687 trying ~1073741687 trying 1073741688 trying ~1073741688 trying 1073741689 trying ~1073741689 trying 1073741690 trying ~1073741690 trying 1073741691 trying ~1073741691 trying 1073741692 trying ~1073741692 trying 1073741693 trying ~1073741693 trying 1073741694 trying ~1073741694 trying 1073741695 trying ~1073741695 trying 1073741696 trying ~1073741696 trying 1073741697 trying ~1073741697 trying 1073741698 trying ~1073741698 trying 1073741699 trying ~1073741699 trying 1073741700 trying ~1073741700 trying 1073741701 trying ~1073741701 trying 1073741702 trying ~1073741702 trying 1073741703 trying ~1073741703 trying 1073741704 trying ~1073741704 trying 1073741705 trying ~1073741705 trying 1073741706 trying ~1073741706 trying 1073741707 trying ~1073741707 trying 1073741708 trying ~1073741708 trying 1073741709 trying ~1073741709 trying 1073741710 trying ~1073741710 trying 1073741711 trying ~1073741711 trying 1073741712 trying ~1073741712 trying 1073741713 trying ~1073741713 trying 1073741714 trying ~1073741714 trying 1073741715 trying ~1073741715 trying 1073741716 trying ~1073741716 trying 1073741717 trying ~1073741717 trying 1073741718 trying ~1073741718 trying 1073741719 trying ~1073741719 trying 1073741720 trying ~1073741720 trying 1073741721 trying ~1073741721 trying 1073741722 trying ~1073741722 trying 1073741723 trying ~1073741723 trying 1073741724 trying ~1073741724 trying 1073741725 trying ~1073741725 trying 1073741726 trying ~1073741726 trying 1073741727 trying ~1073741727 trying 1073741728 trying ~1073741728 trying 1073741729 trying ~1073741729 trying 1073741730 trying ~1073741730 trying 1073741731 trying ~1073741731 trying 1073741732 trying ~1073741732 trying 1073741733 trying ~1073741733 trying 1073741734 trying ~1073741734 trying 1073741735 trying ~1073741735 trying 1073741736 trying ~1073741736 trying 1073741737 trying ~1073741737 trying 1073741738 trying ~1073741738 trying 1073741739 trying ~1073741739 trying 1073741740 trying ~1073741740 trying 1073741741 trying ~1073741741 trying 1073741742 trying ~1073741742 trying 1073741743 trying ~1073741743 trying 1073741744 trying ~1073741744 trying 1073741745 trying ~1073741745 trying 1073741746 trying ~1073741746 trying 1073741747 trying ~1073741747 trying 1073741748 trying ~1073741748 trying 1073741749 trying ~1073741749 trying 1073741750 trying ~1073741750 trying 1073741751 trying ~1073741751 trying 1073741752 trying ~1073741752 trying 1073741753 trying ~1073741753 trying 1073741754 trying ~1073741754 trying 1073741755 trying ~1073741755 trying 1073741756 trying ~1073741756 trying 1073741757 trying ~1073741757 trying 1073741758 trying ~1073741758 trying 1073741759 trying ~1073741759 trying 1073741760 trying ~1073741760 trying 1073741761 trying ~1073741761 trying 1073741762 trying ~1073741762 trying 1073741763 trying ~1073741763 trying 1073741764 trying ~1073741764 trying 1073741765 trying ~1073741765 trying 1073741766 trying ~1073741766 trying 1073741767 trying ~1073741767 trying 1073741768 trying ~1073741768 trying 1073741769 trying ~1073741769 trying 1073741770 trying ~1073741770 trying 1073741771 trying ~1073741771 trying 1073741772 trying ~1073741772 trying 1073741773 trying ~1073741773 trying 1073741774 trying ~1073741774 trying 1073741775 trying ~1073741775 trying 1073741776 trying ~1073741776 trying 1073741777 trying ~1073741777 trying 1073741778 trying ~1073741778 trying 1073741779 trying ~1073741779 trying 1073741780 trying ~1073741780 trying 1073741781 trying ~1073741781 trying 1073741782 trying ~1073741782 trying 1073741783 trying ~1073741783 trying 1073741784 trying ~1073741784 trying 1073741785 trying ~1073741785 trying 1073741786 trying ~1073741786 trying 1073741787 trying ~1073741787 trying 1073741788 trying ~1073741788 trying 1073741789 trying ~1073741789 trying 1073741790 trying ~1073741790 trying 1073741791 trying ~1073741791 trying 1073741792 trying ~1073741792 trying 1073741793 trying ~1073741793 trying 1073741794 trying ~1073741794 trying 1073741795 trying ~1073741795 trying 1073741796 trying ~1073741796 trying 1073741797 trying ~1073741797 trying 1073741798 trying ~1073741798 trying 1073741799 trying ~1073741799 trying 1073741800 trying ~1073741800 trying 1073741801 trying ~1073741801 trying 1073741802 trying ~1073741802 trying 1073741803 trying ~1073741803 trying 1073741804 trying ~1073741804 trying 1073741805 trying ~1073741805 trying 1073741806 trying ~1073741806 trying 1073741807 trying ~1073741807 trying 1073741808 trying ~1073741808 trying 1073741809 trying ~1073741809 trying 1073741810 trying ~1073741810 trying 1073741811 trying ~1073741811 trying 1073741812 trying ~1073741812 trying 1073741813 trying ~1073741813 trying 1073741814 trying ~1073741814 trying 1073741815 trying ~1073741815 trying 1073741816 trying ~1073741816 trying 1073741817 trying ~1073741817 trying 1073741818 trying ~1073741818 trying 1073741819 trying ~1073741819 trying 1073741820 trying ~1073741820 trying 1073741821 trying ~1073741821 trying 1073741822 trying ~1073741822 trying 1073741823 trying ~1073741823 trying 1073741824 trying ~1073741824 trying 1073741825 trying ~1073741825 trying 1073741826 trying ~1073741826 trying 1073741827 trying ~1073741827 trying 1073741828 trying ~1073741828 trying 1073741829 trying ~1073741829 trying 1073741830 trying ~1073741830 trying 1073741831 trying ~1073741831 trying 1073741832 trying ~1073741832 trying 1073741833 trying ~1073741833 trying 1073741834 trying ~1073741834 trying 1073741835 trying ~1073741835 trying 1073741836 trying ~1073741836 trying 1073741837 trying ~1073741837 trying 1073741838 trying ~1073741838 trying 1073741839 trying ~1073741839 trying 1073741840 trying ~1073741840 trying 1073741841 trying ~1073741841 trying 1073741842 trying ~1073741842 trying 1073741843 trying ~1073741843 trying 1073741844 trying ~1073741844 trying 1073741845 trying ~1073741845 trying 1073741846 trying ~1073741846 trying 1073741847 trying ~1073741847 trying 1073741848 trying ~1073741848 trying 1073741849 trying ~1073741849 trying 1073741850 trying ~1073741850 trying 1073741851 trying ~1073741851 trying 1073741852 trying ~1073741852 trying 1073741853 trying ~1073741853 trying 1073741854 trying ~1073741854 trying 1073741855 trying ~1073741855 trying 1073741856 trying ~1073741856 trying 1073741857 trying ~1073741857 trying 1073741858 trying ~1073741858 trying 1073741859 trying ~1073741859 trying 1073741860 trying ~1073741860 trying 1073741861 trying ~1073741861 trying 1073741862 trying ~1073741862 trying 1073741863 trying ~1073741863 trying 1073741864 trying ~1073741864 trying 1073741865 trying ~1073741865 trying 1073741866 trying ~1073741866 trying 1073741867 trying ~1073741867 trying 1073741868 trying ~1073741868 trying 1073741869 trying ~1073741869 trying 1073741870 trying ~1073741870 trying 1073741871 trying ~1073741871 trying 1073741872 trying ~1073741872 trying 1073741873 trying ~1073741873 trying 1073741874 trying ~1073741874 trying 1073741875 trying ~1073741875 trying 1073741876 trying ~1073741876 trying 1073741877 trying ~1073741877 trying 1073741878 trying ~1073741878 trying 1073741879 trying ~1073741879 trying 1073741880 trying ~1073741880 trying 1073741881 trying ~1073741881 trying 1073741882 trying ~1073741882 trying 1073741883 trying ~1073741883 trying 1073741884 trying ~1073741884 trying 1073741885 trying ~1073741885 trying 1073741886 trying ~1073741886 trying 1073741887 trying ~1073741887 trying 1073741888 trying ~1073741888 trying 1073741889 trying ~1073741889 trying 1073741890 trying ~1073741890 trying 1073741891 trying ~1073741891 trying 1073741892 trying ~1073741892 trying 1073741893 trying ~1073741893 trying 1073741894 trying ~1073741894 trying 1073741895 trying ~1073741895 trying 1073741896 trying ~1073741896 trying 1073741897 trying ~1073741897 trying 1073741898 trying ~1073741898 trying 1073741899 trying ~1073741899 trying 1073741900 trying ~1073741900 trying 1073741901 trying ~1073741901 trying 1073741902 trying ~1073741902 trying 1073741903 trying ~1073741903 trying 1073741904 trying ~1073741904 trying 1073741905 trying ~1073741905 trying 1073741906 trying ~1073741906 trying 1073741907 trying ~1073741907 trying 1073741908 trying ~1073741908 trying 1073741909 trying ~1073741909 trying 1073741910 trying ~1073741910 trying 1073741911 trying ~1073741911 trying 1073741912 trying ~1073741912 trying 1073741913 trying ~1073741913 trying 1073741914 trying ~1073741914 trying 1073741915 trying ~1073741915 trying 1073741916 trying ~1073741916 trying 1073741917 trying ~1073741917 trying 1073741918 trying ~1073741918 trying 1073741919 trying ~1073741919 trying 1073741920 trying ~1073741920 trying 1073741921 trying ~1073741921 trying 1073741922 trying ~1073741922 trying 1073741923 trying ~1073741923 trying 1073741924 trying ~1073741924 trying 1073741925 trying ~1073741925 trying 1073741926 trying ~1073741926 trying 1073741927 trying ~1073741927 trying 1073741928 trying ~1073741928 trying 1073741929 trying ~1073741929 trying 1073741930 trying ~1073741930 trying 1073741931 trying ~1073741931 trying 1073741932 trying ~1073741932 trying 1073741933 trying ~1073741933 trying 1073741934 trying ~1073741934 trying 1073741935 trying ~1073741935 trying 1073741936 trying ~1073741936 trying 1073741937 trying ~1073741937 trying 1073741938 trying ~1073741938 trying 1073741939 trying ~1073741939 trying 1073741940 trying ~1073741940 trying 1073741941 trying ~1073741941 trying 1073741942 trying ~1073741942 trying 1073741943 trying ~1073741943 trying 1073741944 trying ~1073741944 trying 1073741945 trying ~1073741945 trying 1073741946 trying ~1073741946 trying 1073741947 trying ~1073741947 trying 1073741948 trying ~1073741948 trying 1073741949 trying ~1073741949 trying 1073741950 trying ~1073741950 trying 1073741951 trying ~1073741951 trying 1073741952 trying ~1073741952 trying 1073741953 trying ~1073741953 trying 1073741954 trying ~1073741954 trying 1073741955 trying ~1073741955 trying 1073741956 trying ~1073741956 trying 1073741957 trying ~1073741957 trying 1073741958 trying ~1073741958 trying 1073741959 trying ~1073741959 trying 1073741960 trying ~1073741960 trying 1073741961 trying ~1073741961 trying 1073741962 trying ~1073741962 trying 1073741963 trying ~1073741963 trying 1073741964 trying ~1073741964 trying 1073741965 trying ~1073741965 trying 1073741966 trying ~1073741966 trying 1073741967 trying ~1073741967 trying 1073741968 trying ~1073741968 trying 1073741969 trying ~1073741969 trying 1073741970 trying ~1073741970 trying 1073741971 trying ~1073741971 trying 1073741972 trying ~1073741972 trying 1073741973 trying ~1073741973 trying 1073741974 trying ~1073741974 trying 1073741975 trying ~1073741975 trying 1073741976 trying ~1073741976 trying 1073741977 trying ~1073741977 trying 1073741978 trying ~1073741978 trying 1073741979 trying ~1073741979 trying 1073741980 trying ~1073741980 trying 1073741981 trying ~1073741981 trying 1073741982 trying ~1073741982 trying 1073741983 trying ~1073741983 trying 1073741984 trying ~1073741984 trying 1073741985 trying ~1073741985 trying 1073741986 trying ~1073741986 trying 1073741987 trying ~1073741987 trying 1073741988 trying ~1073741988 trying 1073741989 trying ~1073741989 trying 1073741990 trying ~1073741990 trying 1073741991 trying ~1073741991 trying 1073741992 trying ~1073741992 trying 1073741993 trying ~1073741993 trying 1073741994 trying ~1073741994 trying 1073741995 trying ~1073741995 trying 1073741996 trying ~1073741996 trying 1073741997 trying ~1073741997 trying 1073741998 trying ~1073741998 trying 1073741999 trying ~1073741999 trying 1073742000 trying ~1073742000 trying 1073742001 trying ~1073742001 trying 1073742002 trying ~1073742002 trying 1073742003 trying ~1073742003 trying 1073742004 trying ~1073742004 trying 1073742005 trying ~1073742005 trying 1073742006 trying ~1073742006 trying 1073742007 trying ~1073742007 trying 1073742008 trying ~1073742008 trying 1073742009 trying ~1073742009 trying 1073742010 trying ~1073742010 trying 1073742011 trying ~1073742011 trying 1073742012 trying ~1073742012 trying 1073742013 trying ~1073742013 trying 1073742014 trying ~1073742014 trying 1073742015 trying ~1073742015 trying 1073742016 trying ~1073742016 trying 1073742017 trying ~1073742017 trying 1073742018 trying ~1073742018 trying 1073742019 trying ~1073742019 trying 1073742020 trying ~1073742020 trying 1073742021 trying ~1073742021 trying 1073742022 trying ~1073742022 trying 1073742023 trying ~1073742023 trying 1073742024 trying ~1073742024 trying 1073742025 trying ~1073742025 trying 1073742026 trying ~1073742026 trying 1073742027 trying ~1073742027 trying 1073742028 trying ~1073742028 trying 1073742029 trying ~1073742029 trying 1073742030 trying ~1073742030 trying 1073742031 trying ~1073742031 trying 1073742032 trying ~1073742032 trying 1073742033 trying ~1073742033 trying 1073742034 trying ~1073742034 trying 1073742035 trying ~1073742035 trying 1073742036 trying ~1073742036 trying 1073742037 trying ~1073742037 trying 1073742038 trying ~1073742038 trying 1073742039 trying ~1073742039 trying 1073742040 trying ~1073742040 trying 1073742041 trying ~1073742041 trying 1073742042 trying ~1073742042 trying 1073742043 trying ~1073742043 trying 1073742044 trying ~1073742044 trying 1073742045 trying ~1073742045 trying 1073742046 trying ~1073742046 trying 1073742047 trying ~1073742047 trying 1073742048 trying ~1073742048 trying 1073742049 trying ~1073742049 trying 1073742050 trying ~1073742050 trying 1073742051 trying ~1073742051 trying 1073742052 trying ~1073742052 trying 1073742053 trying ~1073742053 trying 1073742054 trying ~1073742054 trying 1073742055 trying ~1073742055 trying 1073742056 trying ~1073742056 trying 1073742057 trying ~1073742057 trying 1073742058 trying ~1073742058 trying 1073742059 trying ~1073742059 trying 1073742060 trying ~1073742060 trying 1073742061 trying ~1073742061 trying 1073742062 trying ~1073742062 trying 1073742063 trying ~1073742063 trying 1073742064 trying ~1073742064 trying 1073742065 trying ~1073742065 trying 1073742066 trying ~1073742066 trying 1073742067 trying ~1073742067 trying 1073742068 trying ~1073742068 trying 1073742069 trying ~1073742069 trying 1073742070 trying ~1073742070 trying 1073742071 trying ~1073742071 trying 1073742072 trying ~1073742072 trying 1073742073 trying ~1073742073 trying 1073742074 trying ~1073742074 trying 1073742075 trying ~1073742075 trying 1073742076 trying ~1073742076 trying 1073742077 trying ~1073742077 trying 1073742078 trying ~1073742078 trying 1073742079 trying ~1073742079 trying 1073742080 trying ~1073742080 trying 1073742081 trying ~1073742081 trying 1073742082 trying ~1073742082 trying 1073742083 trying ~1073742083 trying 1073742084 trying ~1073742084 trying 1073742085 trying ~1073742085 trying 1073742086 trying ~1073742086 trying 1073742087 trying ~1073742087 trying 1073742088 trying ~1073742088 trying 1073742089 trying ~1073742089 trying 1073742090 trying ~1073742090 trying 1073742091 trying ~1073742091 trying 1073742092 trying ~1073742092 trying 1073742093 trying ~1073742093 trying 1073742094 trying ~1073742094 trying 1073742095 trying ~1073742095 trying 1073742096 trying ~1073742096 trying 1073742097 trying ~1073742097 trying 1073742098 trying ~1073742098 trying 1073742099 trying ~1073742099 trying 1073742100 trying ~1073742100 trying 1073742101 trying ~1073742101 trying 1073742102 trying ~1073742102 trying 1073742103 trying ~1073742103 trying 1073742104 trying ~1073742104 trying 1073742105 trying ~1073742105 trying 1073742106 trying ~1073742106 trying 1073742107 trying ~1073742107 trying 1073742108 trying ~1073742108 trying 1073742109 trying ~1073742109 trying 1073742110 trying ~1073742110 trying 1073742111 trying ~1073742111 trying 1073742112 trying ~1073742112 trying 1073742113 trying ~1073742113 trying 1073742114 trying ~1073742114 trying 1073742115 trying ~1073742115 trying 1073742116 trying ~1073742116 trying 1073742117 trying ~1073742117 trying 1073742118 trying ~1073742118 trying 1073742119 trying ~1073742119 trying 1073742120 trying ~1073742120 trying 1073742121 trying ~1073742121 trying 1073742122 trying ~1073742122 trying 1073742123 trying ~1073742123 trying 1073742124 trying ~1073742124 trying 1073742125 trying ~1073742125 trying 1073742126 trying ~1073742126 trying 1073742127 trying ~1073742127 trying 1073742128 trying ~1073742128 trying 1073742129 trying ~1073742129 trying 1073742130 trying ~1073742130 trying 1073742131 trying ~1073742131 trying 1073742132 trying ~1073742132 trying 1073742133 trying ~1073742133 trying 1073742134 trying ~1073742134 trying 1073742135 trying ~1073742135 trying 1073742136 trying ~1073742136 trying 1073742137 trying ~1073742137 trying 1073742138 trying ~1073742138 trying 1073742139 trying ~1073742139 trying 1073742140 trying ~1073742140 trying 1073742141 trying ~1073742141 trying 1073742142 trying ~1073742142 trying 1073742143 trying ~1073742143 trying 1073742144 trying ~1073742144 trying 1073742145 trying ~1073742145 trying 1073742146 trying ~1073742146 trying 1073742147 trying ~1073742147 trying 1073742148 trying ~1073742148 trying 1073742149 trying ~1073742149 trying 1073742150 trying ~1073742150 trying 1073742151 trying ~1073742151 trying 1073742152 trying ~1073742152 trying 1073742153 trying ~1073742153 trying 1073742154 trying ~1073742154 trying 1073742155 trying ~1073742155 trying 1073742156 trying ~1073742156 trying 1073742157 trying ~1073742157 trying 1073742158 trying ~1073742158 trying 1073742159 trying ~1073742159 trying 1073742160 trying ~1073742160 trying 1073742161 trying ~1073742161 trying 1073742162 trying ~1073742162 trying 1073742163 trying ~1073742163 trying 1073742164 trying ~1073742164 trying 1073742165 trying ~1073742165 trying 1073742166 trying ~1073742166 trying 1073742167 trying ~1073742167 trying 1073742168 trying ~1073742168 trying 1073742169 trying ~1073742169 trying 1073742170 trying ~1073742170 trying 1073742171 trying ~1073742171 trying 1073742172 trying ~1073742172 trying 1073742173 trying ~1073742173 trying 1073742174 trying ~1073742174 trying 1073742175 trying ~1073742175 trying 1073742176 trying ~1073742176 trying 1073742177 trying ~1073742177 trying 1073742178 trying ~1073742178 trying 1073742179 trying ~1073742179 trying 1073742180 trying ~1073742180 trying 1073742181 trying ~1073742181 trying 1073742182 trying ~1073742182 trying 1073742183 trying ~1073742183 trying 1073742184 trying ~1073742184 trying 1073742185 trying ~1073742185 trying 1073742186 trying ~1073742186 trying 1073742187 trying ~1073742187 trying 1073742188 trying ~1073742188 trying 1073742189 trying ~1073742189 trying 1073742190 trying ~1073742190 trying 1073742191 trying ~1073742191 trying 1073742192 trying ~1073742192 trying 1073742193 trying ~1073742193 trying 1073742194 trying ~1073742194 trying 1073742195 trying ~1073742195 trying 1073742196 trying ~1073742196 trying 1073742197 trying ~1073742197 trying 1073742198 trying ~1073742198 trying 1073742199 trying ~1073742199 trying 1073742200 trying ~1073742200 trying 1073742201 trying ~1073742201 trying 1073742202 trying ~1073742202 trying 1073742203 trying ~1073742203 trying 1073742204 trying ~1073742204 trying 1073742205 trying ~1073742205 trying 1073742206 trying ~1073742206 trying 1073742207 trying ~1073742207 trying 1073742208 trying ~1073742208 trying 1073742209 trying ~1073742209 trying 1073742210 trying ~1073742210 trying 1073742211 trying ~1073742211 trying 1073742212 trying ~1073742212 trying 1073742213 trying ~1073742213 trying 1073742214 trying ~1073742214 trying 1073742215 trying ~1073742215 trying 1073742216 trying ~1073742216 trying 1073742217 trying ~1073742217 trying 1073742218 trying ~1073742218 trying 1073742219 trying ~1073742219 trying 1073742220 trying ~1073742220 trying 1073742221 trying ~1073742221 trying 1073742222 trying ~1073742222 trying 1073742223 trying ~1073742223 trying 1073742224 trying ~1073742224 trying 1073742225 trying ~1073742225 trying 1073742226 trying ~1073742226 trying 1073742227 trying ~1073742227 trying 1073742228 trying ~1073742228 trying 1073742229 trying ~1073742229 trying 1073742230 trying ~1073742230 trying 1073742231 trying ~1073742231 trying 1073742232 trying ~1073742232 trying 1073742233 trying ~1073742233 trying 1073742234 trying ~1073742234 trying 1073742235 trying ~1073742235 trying 1073742236 trying ~1073742236 trying 1073742237 trying ~1073742237 trying 1073742238 trying ~1073742238 trying 1073742239 trying ~1073742239 trying 1073742240 trying ~1073742240 trying 1073742241 trying ~1073742241 trying 1073742242 trying ~1073742242 trying 1073742243 trying ~1073742243 trying 1073742244 trying ~1073742244 trying 1073742245 trying ~1073742245 trying 1073742246 trying ~1073742246 trying 1073742247 trying ~1073742247 trying 1073742248 trying ~1073742248 trying 1073742249 trying ~1073742249 trying 1073742250 trying ~1073742250 trying 1073742251 trying ~1073742251 trying 1073742252 trying ~1073742252 trying 1073742253 trying ~1073742253 trying 1073742254 trying ~1073742254 trying 1073742255 trying ~1073742255 trying 1073742256 trying ~1073742256 trying 1073742257 trying ~1073742257 trying 1073742258 trying ~1073742258 trying 1073742259 trying ~1073742259 trying 1073742260 trying ~1073742260 trying 1073742261 trying ~1073742261 trying 1073742262 trying ~1073742262 trying 1073742263 trying ~1073742263 trying 1073742264 trying ~1073742264 trying 1073742265 trying ~1073742265 trying 1073742266 trying ~1073742266 trying 1073742267 trying ~1073742267 trying 1073742268 trying ~1073742268 trying 1073742269 trying ~1073742269 trying 1073742270 trying ~1073742270 trying 1073742271 trying ~1073742271 trying 1073742272 trying ~1073742272 trying 1073742273 trying ~1073742273 trying 1073742274 trying ~1073742274 trying 1073742275 trying ~1073742275 trying 1073742276 trying ~1073742276 trying 1073742277 trying ~1073742277 trying 1073742278 trying ~1073742278 trying 1073742279 trying ~1073742279 trying 1073742280 trying ~1073742280 trying 1073742281 trying ~1073742281 trying 1073742282 trying ~1073742282 trying 1073742283 trying ~1073742283 trying 1073742284 trying ~1073742284 trying 1073742285 trying ~1073742285 trying 1073742286 trying ~1073742286 trying 1073742287 trying ~1073742287 trying 1073742288 trying ~1073742288 trying 1073742289 trying ~1073742289 trying 1073742290 trying ~1073742290 trying 1073742291 trying ~1073742291 trying 1073742292 trying ~1073742292 trying 1073742293 trying ~1073742293 trying 1073742294 trying ~1073742294 trying 1073742295 trying ~1073742295 trying 1073742296 trying ~1073742296 trying 1073742297 trying ~1073742297 trying 1073742298 trying ~1073742298 trying 1073742299 trying ~1073742299 trying 1073742300 trying ~1073742300 trying 1073742301 trying ~1073742301 trying 1073742302 trying ~1073742302 trying 1073742303 trying ~1073742303 trying 1073742304 trying ~1073742304 trying 1073742305 trying ~1073742305 trying 1073742306 trying ~1073742306 trying 1073742307 trying ~1073742307 trying 1073742308 trying ~1073742308 trying 1073742309 trying ~1073742309 trying 1073742310 trying ~1073742310 trying 1073742311 trying ~1073742311 trying 1073742312 trying ~1073742312 trying 1073742313 trying ~1073742313 trying 1073742314 trying ~1073742314 trying 1073742315 trying ~1073742315 trying 1073742316 trying ~1073742316 trying 1073742317 trying ~1073742317 trying 1073742318 trying ~1073742318 trying 1073742319 trying ~1073742319 trying 1073742320 trying ~1073742320 trying 1073742321 trying ~1073742321 trying 1073742322 trying ~1073742322 trying 1073742323 trying ~1073742323 trying 1073742324 trying ~1073742324 trying 1073742325 trying ~1073742325 trying 1073742326 trying ~1073742326 trying 1073742327 trying ~1073742327 trying 1073742328 trying ~1073742328 trying 1073742329 trying ~1073742329 trying 1073742330 trying ~1073742330 trying 1073742331 trying ~1073742331 trying 1073742332 trying ~1073742332 trying 1073742333 trying ~1073742333 trying 1073742334 trying ~1073742334 trying 1073742335 trying ~1073742335 trying 1073742336 trying ~1073742336 trying 1073742337 trying ~1073742337 trying 1073742338 trying ~1073742338 trying 1073742339 trying ~1073742339 trying 1073742340 trying ~1073742340 trying 1073742341 trying ~1073742341 trying 1073742342 trying ~1073742342 trying 1073742343 trying ~1073742343 trying 1073742344 trying ~1073742344 trying 1073742345 trying ~1073742345 trying 1073742346 trying ~1073742346 trying 1073742347 trying ~1073742347 trying 1073742348 trying ~1073742348 trying 1073742349 trying ~1073742349 trying 1073742350 trying ~1073742350 trying 1073742351 trying ~1073742351 trying 1073742352 trying ~1073742352 trying 1073742353 trying ~1073742353 trying 1073742354 trying ~1073742354 trying 1073742355 trying ~1073742355 trying 1073742356 trying ~1073742356 trying 1073742357 trying ~1073742357 trying 1073742358 trying ~1073742358 trying 1073742359 trying ~1073742359 trying 1073742360 trying ~1073742360 trying 1073742361 trying ~1073742361 trying 1073742362 trying ~1073742362 trying 1073742363 trying ~1073742363 trying 1073742364 trying ~1073742364 trying 1073742365 trying ~1073742365 trying 1073742366 trying ~1073742366 trying 1073742367 trying ~1073742367 trying 1073742368 trying ~1073742368 trying 1073742369 trying ~1073742369 trying 1073742370 trying ~1073742370 trying 1073742371 trying ~1073742371 trying 1073742372 trying ~1073742372 trying 1073742373 trying ~1073742373 trying 1073742374 trying ~1073742374 trying 1073742375 trying ~1073742375 trying 1073742376 trying ~1073742376 trying 1073742377 trying ~1073742377 trying 1073742378 trying ~1073742378 trying 1073742379 trying ~1073742379 trying 1073742380 trying ~1073742380 trying 1073742381 trying ~1073742381 trying 1073742382 trying ~1073742382 trying 1073742383 trying ~1073742383 trying 1073742384 trying ~1073742384 trying 1073742385 trying ~1073742385 trying 1073742386 trying ~1073742386 trying 1073742387 trying ~1073742387 trying 1073742388 trying ~1073742388 trying 1073742389 trying ~1073742389 trying 1073742390 trying ~1073742390 trying 1073742391 trying ~1073742391 trying 1073742392 trying ~1073742392 trying 1073742393 trying ~1073742393 trying 1073742394 trying ~1073742394 trying 1073742395 trying ~1073742395 trying 1073742396 trying ~1073742396 trying 1073742397 trying ~1073742397 trying 1073742398 trying ~1073742398 trying 1073742399 trying ~1073742399 trying 1073742400 trying ~1073742400 trying 1073742401 trying ~1073742401 trying 1073742402 trying ~1073742402 trying 1073742403 trying ~1073742403 trying 1073742404 trying ~1073742404 trying 1073742405 trying ~1073742405 trying 1073742406 trying ~1073742406 trying 1073742407 trying ~1073742407 trying 1073742408 trying ~1073742408 trying 1073742409 trying ~1073742409 trying 1073742410 trying ~1073742410 trying 1073742411 trying ~1073742411 trying 1073742412 trying ~1073742412 trying 1073742413 trying ~1073742413 trying 1073742414 trying ~1073742414 trying 1073742415 trying ~1073742415 trying 1073742416 trying ~1073742416 trying 1073742417 trying ~1073742417 trying 1073742418 trying ~1073742418 trying 1073742419 trying ~1073742419 trying 1073742420 trying ~1073742420 trying 1073742421 trying ~1073742421 trying 1073742422 trying ~1073742422 trying 1073742423 trying ~1073742423 trying 1073742424 trying ~1073742424 trying 1073742425 trying ~1073742425 trying 1073742426 trying ~1073742426 trying 1073742427 trying ~1073742427 trying 1073742428 trying ~1073742428 trying 1073742429 trying ~1073742429 trying 1073742430 trying ~1073742430 trying 1073742431 trying ~1073742431 trying 1073742432 trying ~1073742432 trying 1073742433 trying ~1073742433 trying 1073742434 trying ~1073742434 trying 1073742435 trying ~1073742435 trying 1073742436 trying ~1073742436 trying 1073742437 trying ~1073742437 trying 1073742438 trying ~1073742438 trying 1073742439 trying ~1073742439 trying 1073742440 trying ~1073742440 trying 1073742441 trying ~1073742441 trying 1073742442 trying ~1073742442 trying 1073742443 trying ~1073742443 trying 1073742444 trying ~1073742444 trying 1073742445 trying ~1073742445 trying 1073742446 trying ~1073742446 trying 1073742447 trying ~1073742447 trying 1073742448 trying ~1073742448 trying 1073742449 trying ~1073742449 trying 1073742450 trying ~1073742450 trying 1073742451 trying ~1073742451 trying 1073742452 trying ~1073742452 trying 1073742453 trying ~1073742453 trying 1073742454 trying ~1073742454 trying 1073742455 trying ~1073742455 trying 1073742456 trying ~1073742456 trying 1073742457 trying ~1073742457 trying 1073742458 trying ~1073742458 trying 1073742459 trying ~1073742459 trying 1073742460 trying ~1073742460 trying 1073742461 trying ~1073742461 trying 1073742462 trying ~1073742462 trying 1073742463 trying ~1073742463 trying 1073742464 trying ~1073742464 trying 1073742465 trying ~1073742465 trying 1073742466 trying ~1073742466 trying 1073742467 trying ~1073742467 trying 1073742468 trying ~1073742468 trying 1073742469 trying ~1073742469 trying 1073742470 trying ~1073742470 trying 1073742471 trying ~1073742471 trying 1073742472 trying ~1073742472 trying 1073742473 trying ~1073742473 trying 1073742474 trying ~1073742474 trying 1073742475 trying ~1073742475 trying 1073742476 trying ~1073742476 trying 1073742477 trying ~1073742477 trying 1073742478 trying ~1073742478 trying 1073742479 trying ~1073742479 trying 1073742480 trying ~1073742480 trying 1073742481 trying ~1073742481 trying 1073742482 trying ~1073742482 trying 1073742483 trying ~1073742483 trying 1073742484 trying ~1073742484 trying 1073742485 trying ~1073742485 trying 1073742486 trying ~1073742486 trying 1073742487 trying ~1073742487 trying 1073742488 trying ~1073742488 trying 1073742489 trying ~1073742489 trying 1073742490 trying ~1073742490 trying 1073742491 trying ~1073742491 trying 1073742492 trying ~1073742492 trying 1073742493 trying ~1073742493 trying 1073742494 trying ~1073742494 trying 1073742495 trying ~1073742495 trying 1073742496 trying ~1073742496 trying 1073742497 trying ~1073742497 trying 1073742498 trying ~1073742498 trying 1073742499 trying ~1073742499 trying 1073742500 trying ~1073742500 trying 1073742501 trying ~1073742501 trying 1073742502 trying ~1073742502 trying 1073742503 trying ~1073742503 trying 1073742504 trying ~1073742504 trying 1073742505 trying ~1073742505 trying 1073742506 trying ~1073742506 trying 1073742507 trying ~1073742507 trying 1073742508 trying ~1073742508 trying 1073742509 trying ~1073742509 trying 1073742510 trying ~1073742510 trying 1073742511 trying ~1073742511 trying 1073742512 trying ~1073742512 trying 1073742513 trying ~1073742513 trying 1073742514 trying ~1073742514 trying 1073742515 trying ~1073742515 trying 1073742516 trying ~1073742516 trying 1073742517 trying ~1073742517 trying 1073742518 trying ~1073742518 trying 1073742519 trying ~1073742519 trying 1073742520 trying ~1073742520 trying 1073742521 trying ~1073742521 trying 1073742522 trying ~1073742522 trying 1073742523 trying ~1073742523 trying 1073742524 trying ~1073742524 trying 1073742525 trying ~1073742525 trying 1073742526 trying ~1073742526 trying 1073742527 trying ~1073742527 trying 1073742528 trying ~1073742528 trying 1073742529 trying ~1073742529 trying 1073742530 trying ~1073742530 trying 1073742531 trying ~1073742531 trying 1073742532 trying ~1073742532 trying 1073742533 trying ~1073742533 trying 1073742534 trying ~1073742534 trying 1073742535 trying ~1073742535 trying 1073742536 trying ~1073742536 trying 1073742537 trying ~1073742537 trying 1073742538 trying ~1073742538 trying 1073742539 trying ~1073742539 trying 1073742540 trying ~1073742540 trying 1073742541 trying ~1073742541 trying 1073742542 trying ~1073742542 trying 1073742543 trying ~1073742543 trying 1073742544 trying ~1073742544 trying 1073742545 trying ~1073742545 trying 1073742546 trying ~1073742546 trying 1073742547 trying ~1073742547 trying 1073742548 trying ~1073742548 trying 1073742549 trying ~1073742549 trying 1073742550 trying ~1073742550 trying 1073742551 trying ~1073742551 trying 1073742552 trying ~1073742552 trying 1073742553 trying ~1073742553 trying 1073742554 trying ~1073742554 trying 1073742555 trying ~1073742555 trying 1073742556 trying ~1073742556 trying 1073742557 trying ~1073742557 trying 1073742558 trying ~1073742558 trying 1073742559 trying ~1073742559 trying 1073742560 trying ~1073742560 trying 1073742561 trying ~1073742561 trying 1073742562 trying ~1073742562 trying 1073742563 trying ~1073742563 trying 1073742564 trying ~1073742564 trying 1073742565 trying ~1073742565 trying 1073742566 trying ~1073742566 trying 1073742567 trying ~1073742567 trying 1073742568 trying ~1073742568 trying 1073742569 trying ~1073742569 trying 1073742570 trying ~1073742570 trying 1073742571 trying ~1073742571 trying 1073742572 trying ~1073742572 trying 1073742573 trying ~1073742573 trying 1073742574 trying ~1073742574 trying 1073742575 trying ~1073742575 trying 1073742576 trying ~1073742576 trying 1073742577 trying ~1073742577 trying 1073742578 trying ~1073742578 trying 1073742579 trying ~1073742579 trying 1073742580 trying ~1073742580 trying 1073742581 trying ~1073742581 trying 1073742582 trying ~1073742582 trying 1073742583 trying ~1073742583 trying 1073742584 trying ~1073742584 trying 1073742585 trying ~1073742585 trying 1073742586 trying ~1073742586 trying 1073742587 trying ~1073742587 trying 1073742588 trying ~1073742588 trying 1073742589 trying ~1073742589 trying 1073742590 trying ~1073742590 trying 1073742591 trying ~1073742591 trying 1073742592 trying ~1073742592 trying 1073742593 trying ~1073742593 trying 1073742594 trying ~1073742594 trying 1073742595 trying ~1073742595 trying 1073742596 trying ~1073742596 trying 1073742597 trying ~1073742597 trying 1073742598 trying ~1073742598 trying 1073742599 trying ~1073742599 trying 1073742600 trying ~1073742600 trying 1073742601 trying ~1073742601 trying 1073742602 trying ~1073742602 trying 1073742603 trying ~1073742603 trying 1073742604 trying ~1073742604 trying 1073742605 trying ~1073742605 trying 1073742606 trying ~1073742606 trying 1073742607 trying ~1073742607 trying 1073742608 trying ~1073742608 trying 1073742609 trying ~1073742609 trying 1073742610 trying ~1073742610 trying 1073742611 trying ~1073742611 trying 1073742612 trying ~1073742612 trying 1073742613 trying ~1073742613 trying 1073742614 trying ~1073742614 trying 1073742615 trying ~1073742615 trying 1073742616 trying ~1073742616 trying 1073742617 trying ~1073742617 trying 1073742618 trying ~1073742618 trying 1073742619 trying ~1073742619 trying 1073742620 trying ~1073742620 trying 1073742621 trying ~1073742621 trying 1073742622 trying ~1073742622 trying 1073742623 trying ~1073742623 trying 1073742624 trying ~1073742624 trying 1073742625 trying ~1073742625 trying 1073742626 trying ~1073742626 trying 1073742627 trying ~1073742627 trying 1073742628 trying ~1073742628 trying 1073742629 trying ~1073742629 trying 1073742630 trying ~1073742630 trying 1073742631 trying ~1073742631 trying 1073742632 trying ~1073742632 trying 1073742633 trying ~1073742633 trying 1073742634 trying ~1073742634 trying 1073742635 trying ~1073742635 trying 1073742636 trying ~1073742636 trying 1073742637 trying ~1073742637 trying 1073742638 trying ~1073742638 trying 1073742639 trying ~1073742639 trying 1073742640 trying ~1073742640 trying 1073742641 trying ~1073742641 trying 1073742642 trying ~1073742642 trying 1073742643 trying ~1073742643 trying 1073742644 trying ~1073742644 trying 1073742645 trying ~1073742645 trying 1073742646 trying ~1073742646 trying 1073742647 trying ~1073742647 trying 1073742648 trying ~1073742648 trying 1073742649 trying ~1073742649 trying 1073742650 trying ~1073742650 trying 1073742651 trying ~1073742651 trying 1073742652 trying ~1073742652 trying 1073742653 trying ~1073742653 trying 1073742654 trying ~1073742654 trying 1073742655 trying ~1073742655 trying 1073742656 trying ~1073742656 trying 1073742657 trying ~1073742657 trying 1073742658 trying ~1073742658 trying 1073742659 trying ~1073742659 trying 1073742660 trying ~1073742660 trying 1073742661 trying ~1073742661 trying 1073742662 trying ~1073742662 trying 1073742663 trying ~1073742663 trying 1073742664 trying ~1073742664 trying 1073742665 trying ~1073742665 trying 1073742666 trying ~1073742666 trying 1073742667 trying ~1073742667 trying 1073742668 trying ~1073742668 trying 1073742669 trying ~1073742669 trying 1073742670 trying ~1073742670 trying 1073742671 trying ~1073742671 trying 1073742672 trying ~1073742672 trying 1073742673 trying ~1073742673 trying 1073742674 trying ~1073742674 trying 1073742675 trying ~1073742675 trying 1073742676 trying ~1073742676 trying 1073742677 trying ~1073742677 trying 1073742678 trying ~1073742678 trying 1073742679 trying ~1073742679 trying 1073742680 trying ~1073742680 trying 1073742681 trying ~1073742681 trying 1073742682 trying ~1073742682 trying 1073742683 trying ~1073742683 trying 1073742684 trying ~1073742684 trying 1073742685 trying ~1073742685 trying 1073742686 trying ~1073742686 trying 1073742687 trying ~1073742687 trying 1073742688 trying ~1073742688 trying 1073742689 trying ~1073742689 trying 1073742690 trying ~1073742690 trying 1073742691 trying ~1073742691 trying 1073742692 trying ~1073742692 trying 1073742693 trying ~1073742693 trying 1073742694 trying ~1073742694 trying 1073742695 trying ~1073742695 trying 1073742696 trying ~1073742696 trying 1073742697 trying ~1073742697 trying 1073742698 trying ~1073742698 trying 1073742699 trying ~1073742699 trying 1073742700 trying ~1073742700 trying 1073742701 trying ~1073742701 trying 1073742702 trying ~1073742702 trying 1073742703 trying ~1073742703 trying 1073742704 trying ~1073742704 trying 1073742705 trying ~1073742705 trying 1073742706 trying ~1073742706 trying 1073742707 trying ~1073742707 trying 1073742708 trying ~1073742708 trying 1073742709 trying ~1073742709 trying 1073742710 trying ~1073742710 trying 1073742711 trying ~1073742711 trying 1073742712 trying ~1073742712 trying 1073742713 trying ~1073742713 trying 1073742714 trying ~1073742714 trying 1073742715 trying ~1073742715 trying 1073742716 trying ~1073742716 trying 1073742717 trying ~1073742717 trying 1073742718 trying ~1073742718 trying 1073742719 trying ~1073742719 trying 1073742720 trying ~1073742720 trying 1073742721 trying ~1073742721 trying 1073742722 trying ~1073742722 trying 1073742723 trying ~1073742723 trying 1073742724 trying ~1073742724 trying 1073742725 trying ~1073742725 trying 1073742726 trying ~1073742726 trying 1073742727 trying ~1073742727 trying 1073742728 trying ~1073742728 trying 1073742729 trying ~1073742729 trying 1073742730 trying ~1073742730 trying 1073742731 trying ~1073742731 trying 1073742732 trying ~1073742732 trying 1073742733 trying ~1073742733 trying 1073742734 trying ~1073742734 trying 1073742735 trying ~1073742735 trying 1073742736 trying ~1073742736 trying 1073742737 trying ~1073742737 trying 1073742738 trying ~1073742738 trying 1073742739 trying ~1073742739 trying 1073742740 trying ~1073742740 trying 1073742741 trying ~1073742741 trying 1073742742 trying ~1073742742 trying 1073742743 trying ~1073742743 trying 1073742744 trying ~1073742744 trying 1073742745 trying ~1073742745 trying 1073742746 trying ~1073742746 trying 1073742747 trying ~1073742747 trying 1073742748 trying ~1073742748 trying 1073742749 trying ~1073742749 trying 1073742750 trying ~1073742750 trying 1073742751 trying ~1073742751 trying 1073742752 trying ~1073742752 trying 1073742753 trying ~1073742753 trying 1073742754 trying ~1073742754 trying 1073742755 trying ~1073742755 trying 1073742756 trying ~1073742756 trying 1073742757 trying ~1073742757 trying 1073742758 trying ~1073742758 trying 1073742759 trying ~1073742759 trying 1073742760 trying ~1073742760 trying 1073742761 trying ~1073742761 trying 1073742762 trying ~1073742762 trying 1073742763 trying ~1073742763 trying 1073742764 trying ~1073742764 trying 1073742765 trying ~1073742765 trying 1073742766 trying ~1073742766 trying 1073742767 trying ~1073742767 trying 1073742768 trying ~1073742768 trying 1073742769 trying ~1073742769 trying 1073742770 trying ~1073742770 trying 1073742771 trying ~1073742771 trying 1073742772 trying ~1073742772 trying 1073742773 trying ~1073742773 trying 1073742774 trying ~1073742774 trying 1073742775 trying ~1073742775 trying 1073742776 trying ~1073742776 trying 1073742777 trying ~1073742777 trying 1073742778 trying ~1073742778 trying 1073742779 trying ~1073742779 trying 1073742780 trying ~1073742780 trying 1073742781 trying ~1073742781 trying 1073742782 trying ~1073742782 trying 1073742783 trying ~1073742783 trying 1073742784 trying ~1073742784 trying 1073742785 trying ~1073742785 trying 1073742786 trying ~1073742786 trying 1073742787 trying ~1073742787 trying 1073742788 trying ~1073742788 trying 1073742789 trying ~1073742789 trying 1073742790 trying ~1073742790 trying 1073742791 trying ~1073742791 trying 1073742792 trying ~1073742792 trying 1073742793 trying ~1073742793 trying 1073742794 trying ~1073742794 trying 1073742795 trying ~1073742795 trying 1073742796 trying ~1073742796 trying 1073742797 trying ~1073742797 trying 1073742798 trying ~1073742798 trying 1073742799 trying ~1073742799 trying 1073742800 trying ~1073742800 trying 1073742801 trying ~1073742801 trying 1073742802 trying ~1073742802 trying 1073742803 trying ~1073742803 trying 1073742804 trying ~1073742804 trying 1073742805 trying ~1073742805 trying 1073742806 trying ~1073742806 trying 1073742807 trying ~1073742807 trying 1073742808 trying ~1073742808 trying 1073742809 trying ~1073742809 trying 1073742810 trying ~1073742810 trying 1073742811 trying ~1073742811 trying 1073742812 trying ~1073742812 trying 1073742813 trying ~1073742813 trying 1073742814 trying ~1073742814 trying 1073742815 trying ~1073742815 trying 1073742816 trying ~1073742816 trying 1073742817 trying ~1073742817 trying 1073742818 trying ~1073742818 trying 1073742819 trying ~1073742819 trying 1073742820 trying ~1073742820 trying 1073742821 trying ~1073742821 trying 1073742822 trying ~1073742822 trying 1073742823 trying ~1073742823 trying 2147482648 trying ~2147482648 trying 2147482649 trying ~2147482649 trying 2147482650 trying ~2147482650 trying 2147482651 trying ~2147482651 trying 2147482652 trying ~2147482652 trying 2147482653 trying ~2147482653 trying 2147482654 trying ~2147482654 trying 2147482655 trying ~2147482655 trying 2147482656 trying ~2147482656 trying 2147482657 trying ~2147482657 trying 2147482658 trying ~2147482658 trying 2147482659 trying ~2147482659 trying 2147482660 trying ~2147482660 trying 2147482661 trying ~2147482661 trying 2147482662 trying ~2147482662 trying 2147482663 trying ~2147482663 trying 2147482664 trying ~2147482664 trying 2147482665 trying ~2147482665 trying 2147482666 trying ~2147482666 trying 2147482667 trying ~2147482667 trying 2147482668 trying ~2147482668 trying 2147482669 trying ~2147482669 trying 2147482670 trying ~2147482670 trying 2147482671 trying ~2147482671 trying 2147482672 trying ~2147482672 trying 2147482673 trying ~2147482673 trying 2147482674 trying ~2147482674 trying 2147482675 trying ~2147482675 trying 2147482676 trying ~2147482676 trying 2147482677 trying ~2147482677 trying 2147482678 trying ~2147482678 trying 2147482679 trying ~2147482679 trying 2147482680 trying ~2147482680 trying 2147482681 trying ~2147482681 trying 2147482682 trying ~2147482682 trying 2147482683 trying ~2147482683 trying 2147482684 trying ~2147482684 trying 2147482685 trying ~2147482685 trying 2147482686 trying ~2147482686 trying 2147482687 trying ~2147482687 trying 2147482688 trying ~2147482688 trying 2147482689 trying ~2147482689 trying 2147482690 trying ~2147482690 trying 2147482691 trying ~2147482691 trying 2147482692 trying ~2147482692 trying 2147482693 trying ~2147482693 trying 2147482694 trying ~2147482694 trying 2147482695 trying ~2147482695 trying 2147482696 trying ~2147482696 trying 2147482697 trying ~2147482697 trying 2147482698 trying ~2147482698 trying 2147482699 trying ~2147482699 trying 2147482700 trying ~2147482700 trying 2147482701 trying ~2147482701 trying 2147482702 trying ~2147482702 trying 2147482703 trying ~2147482703 trying 2147482704 trying ~2147482704 trying 2147482705 trying ~2147482705 trying 2147482706 trying ~2147482706 trying 2147482707 trying ~2147482707 trying 2147482708 trying ~2147482708 trying 2147482709 trying ~2147482709 trying 2147482710 trying ~2147482710 trying 2147482711 trying ~2147482711 trying 2147482712 trying ~2147482712 trying 2147482713 trying ~2147482713 trying 2147482714 trying ~2147482714 trying 2147482715 trying ~2147482715 trying 2147482716 trying ~2147482716 trying 2147482717 trying ~2147482717 trying 2147482718 trying ~2147482718 trying 2147482719 trying ~2147482719 trying 2147482720 trying ~2147482720 trying 2147482721 trying ~2147482721 trying 2147482722 trying ~2147482722 trying 2147482723 trying ~2147482723 trying 2147482724 trying ~2147482724 trying 2147482725 trying ~2147482725 trying 2147482726 trying ~2147482726 trying 2147482727 trying ~2147482727 trying 2147482728 trying ~2147482728 trying 2147482729 trying ~2147482729 trying 2147482730 trying ~2147482730 trying 2147482731 trying ~2147482731 trying 2147482732 trying ~2147482732 trying 2147482733 trying ~2147482733 trying 2147482734 trying ~2147482734 trying 2147482735 trying ~2147482735 trying 2147482736 trying ~2147482736 trying 2147482737 trying ~2147482737 trying 2147482738 trying ~2147482738 trying 2147482739 trying ~2147482739 trying 2147482740 trying ~2147482740 trying 2147482741 trying ~2147482741 trying 2147482742 trying ~2147482742 trying 2147482743 trying ~2147482743 trying 2147482744 trying ~2147482744 trying 2147482745 trying ~2147482745 trying 2147482746 trying ~2147482746 trying 2147482747 trying ~2147482747 trying 2147482748 trying ~2147482748 trying 2147482749 trying ~2147482749 trying 2147482750 trying ~2147482750 trying 2147482751 trying ~2147482751 trying 2147482752 trying ~2147482752 trying 2147482753 trying ~2147482753 trying 2147482754 trying ~2147482754 trying 2147482755 trying ~2147482755 trying 2147482756 trying ~2147482756 trying 2147482757 trying ~2147482757 trying 2147482758 trying ~2147482758 trying 2147482759 trying ~2147482759 trying 2147482760 trying ~2147482760 trying 2147482761 trying ~2147482761 trying 2147482762 trying ~2147482762 trying 2147482763 trying ~2147482763 trying 2147482764 trying ~2147482764 trying 2147482765 trying ~2147482765 trying 2147482766 trying ~2147482766 trying 2147482767 trying ~2147482767 trying 2147482768 trying ~2147482768 trying 2147482769 trying ~2147482769 trying 2147482770 trying ~2147482770 trying 2147482771 trying ~2147482771 trying 2147482772 trying ~2147482772 trying 2147482773 trying ~2147482773 trying 2147482774 trying ~2147482774 trying 2147482775 trying ~2147482775 trying 2147482776 trying ~2147482776 trying 2147482777 trying ~2147482777 trying 2147482778 trying ~2147482778 trying 2147482779 trying ~2147482779 trying 2147482780 trying ~2147482780 trying 2147482781 trying ~2147482781 trying 2147482782 trying ~2147482782 trying 2147482783 trying ~2147482783 trying 2147482784 trying ~2147482784 trying 2147482785 trying ~2147482785 trying 2147482786 trying ~2147482786 trying 2147482787 trying ~2147482787 trying 2147482788 trying ~2147482788 trying 2147482789 trying ~2147482789 trying 2147482790 trying ~2147482790 trying 2147482791 trying ~2147482791 trying 2147482792 trying ~2147482792 trying 2147482793 trying ~2147482793 trying 2147482794 trying ~2147482794 trying 2147482795 trying ~2147482795 trying 2147482796 trying ~2147482796 trying 2147482797 trying ~2147482797 trying 2147482798 trying ~2147482798 trying 2147482799 trying ~2147482799 trying 2147482800 trying ~2147482800 trying 2147482801 trying ~2147482801 trying 2147482802 trying ~2147482802 trying 2147482803 trying ~2147482803 trying 2147482804 trying ~2147482804 trying 2147482805 trying ~2147482805 trying 2147482806 trying ~2147482806 trying 2147482807 trying ~2147482807 trying 2147482808 trying ~2147482808 trying 2147482809 trying ~2147482809 trying 2147482810 trying ~2147482810 trying 2147482811 trying ~2147482811 trying 2147482812 trying ~2147482812 trying 2147482813 trying ~2147482813 trying 2147482814 trying ~2147482814 trying 2147482815 trying ~2147482815 trying 2147482816 trying ~2147482816 trying 2147482817 trying ~2147482817 trying 2147482818 trying ~2147482818 trying 2147482819 trying ~2147482819 trying 2147482820 trying ~2147482820 trying 2147482821 trying ~2147482821 trying 2147482822 trying ~2147482822 trying 2147482823 trying ~2147482823 trying 2147482824 trying ~2147482824 trying 2147482825 trying ~2147482825 trying 2147482826 trying ~2147482826 trying 2147482827 trying ~2147482827 trying 2147482828 trying ~2147482828 trying 2147482829 trying ~2147482829 trying 2147482830 trying ~2147482830 trying 2147482831 trying ~2147482831 trying 2147482832 trying ~2147482832 trying 2147482833 trying ~2147482833 trying 2147482834 trying ~2147482834 trying 2147482835 trying ~2147482835 trying 2147482836 trying ~2147482836 trying 2147482837 trying ~2147482837 trying 2147482838 trying ~2147482838 trying 2147482839 trying ~2147482839 trying 2147482840 trying ~2147482840 trying 2147482841 trying ~2147482841 trying 2147482842 trying ~2147482842 trying 2147482843 trying ~2147482843 trying 2147482844 trying ~2147482844 trying 2147482845 trying ~2147482845 trying 2147482846 trying ~2147482846 trying 2147482847 trying ~2147482847 trying 2147482848 trying ~2147482848 trying 2147482849 trying ~2147482849 trying 2147482850 trying ~2147482850 trying 2147482851 trying ~2147482851 trying 2147482852 trying ~2147482852 trying 2147482853 trying ~2147482853 trying 2147482854 trying ~2147482854 trying 2147482855 trying ~2147482855 trying 2147482856 trying ~2147482856 trying 2147482857 trying ~2147482857 trying 2147482858 trying ~2147482858 trying 2147482859 trying ~2147482859 trying 2147482860 trying ~2147482860 trying 2147482861 trying ~2147482861 trying 2147482862 trying ~2147482862 trying 2147482863 trying ~2147482863 trying 2147482864 trying ~2147482864 trying 2147482865 trying ~2147482865 trying 2147482866 trying ~2147482866 trying 2147482867 trying ~2147482867 trying 2147482868 trying ~2147482868 trying 2147482869 trying ~2147482869 trying 2147482870 trying ~2147482870 trying 2147482871 trying ~2147482871 trying 2147482872 trying ~2147482872 trying 2147482873 trying ~2147482873 trying 2147482874 trying ~2147482874 trying 2147482875 trying ~2147482875 trying 2147482876 trying ~2147482876 trying 2147482877 trying ~2147482877 trying 2147482878 trying ~2147482878 trying 2147482879 trying ~2147482879 trying 2147482880 trying ~2147482880 trying 2147482881 trying ~2147482881 trying 2147482882 trying ~2147482882 trying 2147482883 trying ~2147482883 trying 2147482884 trying ~2147482884 trying 2147482885 trying ~2147482885 trying 2147482886 trying ~2147482886 trying 2147482887 trying ~2147482887 trying 2147482888 trying ~2147482888 trying 2147482889 trying ~2147482889 trying 2147482890 trying ~2147482890 trying 2147482891 trying ~2147482891 trying 2147482892 trying ~2147482892 trying 2147482893 trying ~2147482893 trying 2147482894 trying ~2147482894 trying 2147482895 trying ~2147482895 trying 2147482896 trying ~2147482896 trying 2147482897 trying ~2147482897 trying 2147482898 trying ~2147482898 trying 2147482899 trying ~2147482899 trying 2147482900 trying ~2147482900 trying 2147482901 trying ~2147482901 trying 2147482902 trying ~2147482902 trying 2147482903 trying ~2147482903 trying 2147482904 trying ~2147482904 trying 2147482905 trying ~2147482905 trying 2147482906 trying ~2147482906 trying 2147482907 trying ~2147482907 trying 2147482908 trying ~2147482908 trying 2147482909 trying ~2147482909 trying 2147482910 trying ~2147482910 trying 2147482911 trying ~2147482911 trying 2147482912 trying ~2147482912 trying 2147482913 trying ~2147482913 trying 2147482914 trying ~2147482914 trying 2147482915 trying ~2147482915 trying 2147482916 trying ~2147482916 trying 2147482917 trying ~2147482917 trying 2147482918 trying ~2147482918 trying 2147482919 trying ~2147482919 trying 2147482920 trying ~2147482920 trying 2147482921 trying ~2147482921 trying 2147482922 trying ~2147482922 trying 2147482923 trying ~2147482923 trying 2147482924 trying ~2147482924 trying 2147482925 trying ~2147482925 trying 2147482926 trying ~2147482926 trying 2147482927 trying ~2147482927 trying 2147482928 trying ~2147482928 trying 2147482929 trying ~2147482929 trying 2147482930 trying ~2147482930 trying 2147482931 trying ~2147482931 trying 2147482932 trying ~2147482932 trying 2147482933 trying ~2147482933 trying 2147482934 trying ~2147482934 trying 2147482935 trying ~2147482935 trying 2147482936 trying ~2147482936 trying 2147482937 trying ~2147482937 trying 2147482938 trying ~2147482938 trying 2147482939 trying ~2147482939 trying 2147482940 trying ~2147482940 trying 2147482941 trying ~2147482941 trying 2147482942 trying ~2147482942 trying 2147482943 trying ~2147482943 trying 2147482944 trying ~2147482944 trying 2147482945 trying ~2147482945 trying 2147482946 trying ~2147482946 trying 2147482947 trying ~2147482947 trying 2147482948 trying ~2147482948 trying 2147482949 trying ~2147482949 trying 2147482950 trying ~2147482950 trying 2147482951 trying ~2147482951 trying 2147482952 trying ~2147482952 trying 2147482953 trying ~2147482953 trying 2147482954 trying ~2147482954 trying 2147482955 trying ~2147482955 trying 2147482956 trying ~2147482956 trying 2147482957 trying ~2147482957 trying 2147482958 trying ~2147482958 trying 2147482959 trying ~2147482959 trying 2147482960 trying ~2147482960 trying 2147482961 trying ~2147482961 trying 2147482962 trying ~2147482962 trying 2147482963 trying ~2147482963 trying 2147482964 trying ~2147482964 trying 2147482965 trying ~2147482965 trying 2147482966 trying ~2147482966 trying 2147482967 trying ~2147482967 trying 2147482968 trying ~2147482968 trying 2147482969 trying ~2147482969 trying 2147482970 trying ~2147482970 trying 2147482971 trying ~2147482971 trying 2147482972 trying ~2147482972 trying 2147482973 trying ~2147482973 trying 2147482974 trying ~2147482974 trying 2147482975 trying ~2147482975 trying 2147482976 trying ~2147482976 trying 2147482977 trying ~2147482977 trying 2147482978 trying ~2147482978 trying 2147482979 trying ~2147482979 trying 2147482980 trying ~2147482980 trying 2147482981 trying ~2147482981 trying 2147482982 trying ~2147482982 trying 2147482983 trying ~2147482983 trying 2147482984 trying ~2147482984 trying 2147482985 trying ~2147482985 trying 2147482986 trying ~2147482986 trying 2147482987 trying ~2147482987 trying 2147482988 trying ~2147482988 trying 2147482989 trying ~2147482989 trying 2147482990 trying ~2147482990 trying 2147482991 trying ~2147482991 trying 2147482992 trying ~2147482992 trying 2147482993 trying ~2147482993 trying 2147482994 trying ~2147482994 trying 2147482995 trying ~2147482995 trying 2147482996 trying ~2147482996 trying 2147482997 trying ~2147482997 trying 2147482998 trying ~2147482998 trying 2147482999 trying ~2147482999 trying 2147483000 trying ~2147483000 trying 2147483001 trying ~2147483001 trying 2147483002 trying ~2147483002 trying 2147483003 trying ~2147483003 trying 2147483004 trying ~2147483004 trying 2147483005 trying ~2147483005 trying 2147483006 trying ~2147483006 trying 2147483007 trying ~2147483007 trying 2147483008 trying ~2147483008 trying 2147483009 trying ~2147483009 trying 2147483010 trying ~2147483010 trying 2147483011 trying ~2147483011 trying 2147483012 trying ~2147483012 trying 2147483013 trying ~2147483013 trying 2147483014 trying ~2147483014 trying 2147483015 trying ~2147483015 trying 2147483016 trying ~2147483016 trying 2147483017 trying ~2147483017 trying 2147483018 trying ~2147483018 trying 2147483019 trying ~2147483019 trying 2147483020 trying ~2147483020 trying 2147483021 trying ~2147483021 trying 2147483022 trying ~2147483022 trying 2147483023 trying ~2147483023 trying 2147483024 trying ~2147483024 trying 2147483025 trying ~2147483025 trying 2147483026 trying ~2147483026 trying 2147483027 trying ~2147483027 trying 2147483028 trying ~2147483028 trying 2147483029 trying ~2147483029 trying 2147483030 trying ~2147483030 trying 2147483031 trying ~2147483031 trying 2147483032 trying ~2147483032 trying 2147483033 trying ~2147483033 trying 2147483034 trying ~2147483034 trying 2147483035 trying ~2147483035 trying 2147483036 trying ~2147483036 trying 2147483037 trying ~2147483037 trying 2147483038 trying ~2147483038 trying 2147483039 trying ~2147483039 trying 2147483040 trying ~2147483040 trying 2147483041 trying ~2147483041 trying 2147483042 trying ~2147483042 trying 2147483043 trying ~2147483043 trying 2147483044 trying ~2147483044 trying 2147483045 trying ~2147483045 trying 2147483046 trying ~2147483046 trying 2147483047 trying ~2147483047 trying 2147483048 trying ~2147483048 trying 2147483049 trying ~2147483049 trying 2147483050 trying ~2147483050 trying 2147483051 trying ~2147483051 trying 2147483052 trying ~2147483052 trying 2147483053 trying ~2147483053 trying 2147483054 trying ~2147483054 trying 2147483055 trying ~2147483055 trying 2147483056 trying ~2147483056 trying 2147483057 trying ~2147483057 trying 2147483058 trying ~2147483058 trying 2147483059 trying ~2147483059 trying 2147483060 trying ~2147483060 trying 2147483061 trying ~2147483061 trying 2147483062 trying ~2147483062 trying 2147483063 trying ~2147483063 trying 2147483064 trying ~2147483064 trying 2147483065 trying ~2147483065 trying 2147483066 trying ~2147483066 trying 2147483067 trying ~2147483067 trying 2147483068 trying ~2147483068 trying 2147483069 trying ~2147483069 trying 2147483070 trying ~2147483070 trying 2147483071 trying ~2147483071 trying 2147483072 trying ~2147483072 trying 2147483073 trying ~2147483073 trying 2147483074 trying ~2147483074 trying 2147483075 trying ~2147483075 trying 2147483076 trying ~2147483076 trying 2147483077 trying ~2147483077 trying 2147483078 trying ~2147483078 trying 2147483079 trying ~2147483079 trying 2147483080 trying ~2147483080 trying 2147483081 trying ~2147483081 trying 2147483082 trying ~2147483082 trying 2147483083 trying ~2147483083 trying 2147483084 trying ~2147483084 trying 2147483085 trying ~2147483085 trying 2147483086 trying ~2147483086 trying 2147483087 trying ~2147483087 trying 2147483088 trying ~2147483088 trying 2147483089 trying ~2147483089 trying 2147483090 trying ~2147483090 trying 2147483091 trying ~2147483091 trying 2147483092 trying ~2147483092 trying 2147483093 trying ~2147483093 trying 2147483094 trying ~2147483094 trying 2147483095 trying ~2147483095 trying 2147483096 trying ~2147483096 trying 2147483097 trying ~2147483097 trying 2147483098 trying ~2147483098 trying 2147483099 trying ~2147483099 trying 2147483100 trying ~2147483100 trying 2147483101 trying ~2147483101 trying 2147483102 trying ~2147483102 trying 2147483103 trying ~2147483103 trying 2147483104 trying ~2147483104 trying 2147483105 trying ~2147483105 trying 2147483106 trying ~2147483106 trying 2147483107 trying ~2147483107 trying 2147483108 trying ~2147483108 trying 2147483109 trying ~2147483109 trying 2147483110 trying ~2147483110 trying 2147483111 trying ~2147483111 trying 2147483112 trying ~2147483112 trying 2147483113 trying ~2147483113 trying 2147483114 trying ~2147483114 trying 2147483115 trying ~2147483115 trying 2147483116 trying ~2147483116 trying 2147483117 trying ~2147483117 trying 2147483118 trying ~2147483118 trying 2147483119 trying ~2147483119 trying 2147483120 trying ~2147483120 trying 2147483121 trying ~2147483121 trying 2147483122 trying ~2147483122 trying 2147483123 trying ~2147483123 trying 2147483124 trying ~2147483124 trying 2147483125 trying ~2147483125 trying 2147483126 trying ~2147483126 trying 2147483127 trying ~2147483127 trying 2147483128 trying ~2147483128 trying 2147483129 trying ~2147483129 trying 2147483130 trying ~2147483130 trying 2147483131 trying ~2147483131 trying 2147483132 trying ~2147483132 trying 2147483133 trying ~2147483133 trying 2147483134 trying ~2147483134 trying 2147483135 trying ~2147483135 trying 2147483136 trying ~2147483136 trying 2147483137 trying ~2147483137 trying 2147483138 trying ~2147483138 trying 2147483139 trying ~2147483139 trying 2147483140 trying ~2147483140 trying 2147483141 trying ~2147483141 trying 2147483142 trying ~2147483142 trying 2147483143 trying ~2147483143 trying 2147483144 trying ~2147483144 trying 2147483145 trying ~2147483145 trying 2147483146 trying ~2147483146 trying 2147483147 trying ~2147483147 trying 2147483148 trying ~2147483148 trying 2147483149 trying ~2147483149 trying 2147483150 trying ~2147483150 trying 2147483151 trying ~2147483151 trying 2147483152 trying ~2147483152 trying 2147483153 trying ~2147483153 trying 2147483154 trying ~2147483154 trying 2147483155 trying ~2147483155 trying 2147483156 trying ~2147483156 trying 2147483157 trying ~2147483157 trying 2147483158 trying ~2147483158 trying 2147483159 trying ~2147483159 trying 2147483160 trying ~2147483160 trying 2147483161 trying ~2147483161 trying 2147483162 trying ~2147483162 trying 2147483163 trying ~2147483163 trying 2147483164 trying ~2147483164 trying 2147483165 trying ~2147483165 trying 2147483166 trying ~2147483166 trying 2147483167 trying ~2147483167 trying 2147483168 trying ~2147483168 trying 2147483169 trying ~2147483169 trying 2147483170 trying ~2147483170 trying 2147483171 trying ~2147483171 trying 2147483172 trying ~2147483172 trying 2147483173 trying ~2147483173 trying 2147483174 trying ~2147483174 trying 2147483175 trying ~2147483175 trying 2147483176 trying ~2147483176 trying 2147483177 trying ~2147483177 trying 2147483178 trying ~2147483178 trying 2147483179 trying ~2147483179 trying 2147483180 trying ~2147483180 trying 2147483181 trying ~2147483181 trying 2147483182 trying ~2147483182 trying 2147483183 trying ~2147483183 trying 2147483184 trying ~2147483184 trying 2147483185 trying ~2147483185 trying 2147483186 trying ~2147483186 trying 2147483187 trying ~2147483187 trying 2147483188 trying ~2147483188 trying 2147483189 trying ~2147483189 trying 2147483190 trying ~2147483190 trying 2147483191 trying ~2147483191 trying 2147483192 trying ~2147483192 trying 2147483193 trying ~2147483193 trying 2147483194 trying ~2147483194 trying 2147483195 trying ~2147483195 trying 2147483196 trying ~2147483196 trying 2147483197 trying ~2147483197 trying 2147483198 trying ~2147483198 trying 2147483199 trying ~2147483199 trying 2147483200 trying ~2147483200 trying 2147483201 trying ~2147483201 trying 2147483202 trying ~2147483202 trying 2147483203 trying ~2147483203 trying 2147483204 trying ~2147483204 trying 2147483205 trying ~2147483205 trying 2147483206 trying ~2147483206 trying 2147483207 trying ~2147483207 trying 2147483208 trying ~2147483208 trying 2147483209 trying ~2147483209 trying 2147483210 trying ~2147483210 trying 2147483211 trying ~2147483211 trying 2147483212 trying ~2147483212 trying 2147483213 trying ~2147483213 trying 2147483214 trying ~2147483214 trying 2147483215 trying ~2147483215 trying 2147483216 trying ~2147483216 trying 2147483217 trying ~2147483217 trying 2147483218 trying ~2147483218 trying 2147483219 trying ~2147483219 trying 2147483220 trying ~2147483220 trying 2147483221 trying ~2147483221 trying 2147483222 trying ~2147483222 trying 2147483223 trying ~2147483223 trying 2147483224 trying ~2147483224 trying 2147483225 trying ~2147483225 trying 2147483226 trying ~2147483226 trying 2147483227 trying ~2147483227 trying 2147483228 trying ~2147483228 trying 2147483229 trying ~2147483229 trying 2147483230 trying ~2147483230 trying 2147483231 trying ~2147483231 trying 2147483232 trying ~2147483232 trying 2147483233 trying ~2147483233 trying 2147483234 trying ~2147483234 trying 2147483235 trying ~2147483235 trying 2147483236 trying ~2147483236 trying 2147483237 trying ~2147483237 trying 2147483238 trying ~2147483238 trying 2147483239 trying ~2147483239 trying 2147483240 trying ~2147483240 trying 2147483241 trying ~2147483241 trying 2147483242 trying ~2147483242 trying 2147483243 trying ~2147483243 trying 2147483244 trying ~2147483244 trying 2147483245 trying ~2147483245 trying 2147483246 trying ~2147483246 trying 2147483247 trying ~2147483247 trying 2147483248 trying ~2147483248 trying 2147483249 trying ~2147483249 trying 2147483250 trying ~2147483250 trying 2147483251 trying ~2147483251 trying 2147483252 trying ~2147483252 trying 2147483253 trying ~2147483253 trying 2147483254 trying ~2147483254 trying 2147483255 trying ~2147483255 trying 2147483256 trying ~2147483256 trying 2147483257 trying ~2147483257 trying 2147483258 trying ~2147483258 trying 2147483259 trying ~2147483259 trying 2147483260 trying ~2147483260 trying 2147483261 trying ~2147483261 trying 2147483262 trying ~2147483262 trying 2147483263 trying ~2147483263 trying 2147483264 trying ~2147483264 trying 2147483265 trying ~2147483265 trying 2147483266 trying ~2147483266 trying 2147483267 trying ~2147483267 trying 2147483268 trying ~2147483268 trying 2147483269 trying ~2147483269 trying 2147483270 trying ~2147483270 trying 2147483271 trying ~2147483271 trying 2147483272 trying ~2147483272 trying 2147483273 trying ~2147483273 trying 2147483274 trying ~2147483274 trying 2147483275 trying ~2147483275 trying 2147483276 trying ~2147483276 trying 2147483277 trying ~2147483277 trying 2147483278 trying ~2147483278 trying 2147483279 trying ~2147483279 trying 2147483280 trying ~2147483280 trying 2147483281 trying ~2147483281 trying 2147483282 trying ~2147483282 trying 2147483283 trying ~2147483283 trying 2147483284 trying ~2147483284 trying 2147483285 trying ~2147483285 trying 2147483286 trying ~2147483286 trying 2147483287 trying ~2147483287 trying 2147483288 trying ~2147483288 trying 2147483289 trying ~2147483289 trying 2147483290 trying ~2147483290 trying 2147483291 trying ~2147483291 trying 2147483292 trying ~2147483292 trying 2147483293 trying ~2147483293 trying 2147483294 trying ~2147483294 trying 2147483295 trying ~2147483295 trying 2147483296 trying ~2147483296 trying 2147483297 trying ~2147483297 trying 2147483298 trying ~2147483298 trying 2147483299 trying ~2147483299 trying 2147483300 trying ~2147483300 trying 2147483301 trying ~2147483301 trying 2147483302 trying ~2147483302 trying 2147483303 trying ~2147483303 trying 2147483304 trying ~2147483304 trying 2147483305 trying ~2147483305 trying 2147483306 trying ~2147483306 trying 2147483307 trying ~2147483307 trying 2147483308 trying ~2147483308 trying 2147483309 trying ~2147483309 trying 2147483310 trying ~2147483310 trying 2147483311 trying ~2147483311 trying 2147483312 trying ~2147483312 trying 2147483313 trying ~2147483313 trying 2147483314 trying ~2147483314 trying 2147483315 trying ~2147483315 trying 2147483316 trying ~2147483316 trying 2147483317 trying ~2147483317 trying 2147483318 trying ~2147483318 trying 2147483319 trying ~2147483319 trying 2147483320 trying ~2147483320 trying 2147483321 trying ~2147483321 trying 2147483322 trying ~2147483322 trying 2147483323 trying ~2147483323 trying 2147483324 trying ~2147483324 trying 2147483325 trying ~2147483325 trying 2147483326 trying ~2147483326 trying 2147483327 trying ~2147483327 trying 2147483328 trying ~2147483328 trying 2147483329 trying ~2147483329 trying 2147483330 trying ~2147483330 trying 2147483331 trying ~2147483331 trying 2147483332 trying ~2147483332 trying 2147483333 trying ~2147483333 trying 2147483334 trying ~2147483334 trying 2147483335 trying ~2147483335 trying 2147483336 trying ~2147483336 trying 2147483337 trying ~2147483337 trying 2147483338 trying ~2147483338 trying 2147483339 trying ~2147483339 trying 2147483340 trying ~2147483340 trying 2147483341 trying ~2147483341 trying 2147483342 trying ~2147483342 trying 2147483343 trying ~2147483343 trying 2147483344 trying ~2147483344 trying 2147483345 trying ~2147483345 trying 2147483346 trying ~2147483346 trying 2147483347 trying ~2147483347 trying 2147483348 trying ~2147483348 trying 2147483349 trying ~2147483349 trying 2147483350 trying ~2147483350 trying 2147483351 trying ~2147483351 trying 2147483352 trying ~2147483352 trying 2147483353 trying ~2147483353 trying 2147483354 trying ~2147483354 trying 2147483355 trying ~2147483355 trying 2147483356 trying ~2147483356 trying 2147483357 trying ~2147483357 trying 2147483358 trying ~2147483358 trying 2147483359 trying ~2147483359 trying 2147483360 trying ~2147483360 trying 2147483361 trying ~2147483361 trying 2147483362 trying ~2147483362 trying 2147483363 trying ~2147483363 trying 2147483364 trying ~2147483364 trying 2147483365 trying ~2147483365 trying 2147483366 trying ~2147483366 trying 2147483367 trying ~2147483367 trying 2147483368 trying ~2147483368 trying 2147483369 trying ~2147483369 trying 2147483370 trying ~2147483370 trying 2147483371 trying ~2147483371 trying 2147483372 trying ~2147483372 trying 2147483373 trying ~2147483373 trying 2147483374 trying ~2147483374 trying 2147483375 trying ~2147483375 trying 2147483376 trying ~2147483376 trying 2147483377 trying ~2147483377 trying 2147483378 trying ~2147483378 trying 2147483379 trying ~2147483379 trying 2147483380 trying ~2147483380 trying 2147483381 trying ~2147483381 trying 2147483382 trying ~2147483382 trying 2147483383 trying ~2147483383 trying 2147483384 trying ~2147483384 trying 2147483385 trying ~2147483385 trying 2147483386 trying ~2147483386 trying 2147483387 trying ~2147483387 trying 2147483388 trying ~2147483388 trying 2147483389 trying ~2147483389 trying 2147483390 trying ~2147483390 trying 2147483391 trying ~2147483391 trying 2147483392 trying ~2147483392 trying 2147483393 trying ~2147483393 trying 2147483394 trying ~2147483394 trying 2147483395 trying ~2147483395 trying 2147483396 trying ~2147483396 trying 2147483397 trying ~2147483397 trying 2147483398 trying ~2147483398 trying 2147483399 trying ~2147483399 trying 2147483400 trying ~2147483400 trying 2147483401 trying ~2147483401 trying 2147483402 trying ~2147483402 trying 2147483403 trying ~2147483403 trying 2147483404 trying ~2147483404 trying 2147483405 trying ~2147483405 trying 2147483406 trying ~2147483406 trying 2147483407 trying ~2147483407 trying 2147483408 trying ~2147483408 trying 2147483409 trying ~2147483409 trying 2147483410 trying ~2147483410 trying 2147483411 trying ~2147483411 trying 2147483412 trying ~2147483412 trying 2147483413 trying ~2147483413 trying 2147483414 trying ~2147483414 trying 2147483415 trying ~2147483415 trying 2147483416 trying ~2147483416 trying 2147483417 trying ~2147483417 trying 2147483418 trying ~2147483418 trying 2147483419 trying ~2147483419 trying 2147483420 trying ~2147483420 trying 2147483421 trying ~2147483421 trying 2147483422 trying ~2147483422 trying 2147483423 trying ~2147483423 trying 2147483424 trying ~2147483424 trying 2147483425 trying ~2147483425 trying 2147483426 trying ~2147483426 trying 2147483427 trying ~2147483427 trying 2147483428 trying ~2147483428 trying 2147483429 trying ~2147483429 trying 2147483430 trying ~2147483430 trying 2147483431 trying ~2147483431 trying 2147483432 trying ~2147483432 trying 2147483433 trying ~2147483433 trying 2147483434 trying ~2147483434 trying 2147483435 trying ~2147483435 trying 2147483436 trying ~2147483436 trying 2147483437 trying ~2147483437 trying 2147483438 trying ~2147483438 trying 2147483439 trying ~2147483439 trying 2147483440 trying ~2147483440 trying 2147483441 trying ~2147483441 trying 2147483442 trying ~2147483442 trying 2147483443 trying ~2147483443 trying 2147483444 trying ~2147483444 trying 2147483445 trying ~2147483445 trying 2147483446 trying ~2147483446 trying 2147483447 trying ~2147483447 trying 2147483448 trying ~2147483448 trying 2147483449 trying ~2147483449 trying 2147483450 trying ~2147483450 trying 2147483451 trying ~2147483451 trying 2147483452 trying ~2147483452 trying 2147483453 trying ~2147483453 trying 2147483454 trying ~2147483454 trying 2147483455 trying ~2147483455 trying 2147483456 trying ~2147483456 trying 2147483457 trying ~2147483457 trying 2147483458 trying ~2147483458 trying 2147483459 trying ~2147483459 trying 2147483460 trying ~2147483460 trying 2147483461 trying ~2147483461 trying 2147483462 trying ~2147483462 trying 2147483463 trying ~2147483463 trying 2147483464 trying ~2147483464 trying 2147483465 trying ~2147483465 trying 2147483466 trying ~2147483466 trying 2147483467 trying ~2147483467 trying 2147483468 trying ~2147483468 trying 2147483469 trying ~2147483469 trying 2147483470 trying ~2147483470 trying 2147483471 trying ~2147483471 trying 2147483472 trying ~2147483472 trying 2147483473 trying ~2147483473 trying 2147483474 trying ~2147483474 trying 2147483475 trying ~2147483475 trying 2147483476 trying ~2147483476 trying 2147483477 trying ~2147483477 trying 2147483478 trying ~2147483478 trying 2147483479 trying ~2147483479 trying 2147483480 trying ~2147483480 trying 2147483481 trying ~2147483481 trying 2147483482 trying ~2147483482 trying 2147483483 trying ~2147483483 trying 2147483484 trying ~2147483484 trying 2147483485 trying ~2147483485 trying 2147483486 trying ~2147483486 trying 2147483487 trying ~2147483487 trying 2147483488 trying ~2147483488 trying 2147483489 trying ~2147483489 trying 2147483490 trying ~2147483490 trying 2147483491 trying ~2147483491 trying 2147483492 trying ~2147483492 trying 2147483493 trying ~2147483493 trying 2147483494 trying ~2147483494 trying 2147483495 trying ~2147483495 trying 2147483496 trying ~2147483496 trying 2147483497 trying ~2147483497 trying 2147483498 trying ~2147483498 trying 2147483499 trying ~2147483499 trying 2147483500 trying ~2147483500 trying 2147483501 trying ~2147483501 trying 2147483502 trying ~2147483502 trying 2147483503 trying ~2147483503 trying 2147483504 trying ~2147483504 trying 2147483505 trying ~2147483505 trying 2147483506 trying ~2147483506 trying 2147483507 trying ~2147483507 trying 2147483508 trying ~2147483508 trying 2147483509 trying ~2147483509 trying 2147483510 trying ~2147483510 trying 2147483511 trying ~2147483511 trying 2147483512 trying ~2147483512 trying 2147483513 trying ~2147483513 trying 2147483514 trying ~2147483514 trying 2147483515 trying ~2147483515 trying 2147483516 trying ~2147483516 trying 2147483517 trying ~2147483517 trying 2147483518 trying ~2147483518 trying 2147483519 trying ~2147483519 trying 2147483520 trying ~2147483520 trying 2147483521 trying ~2147483521 trying 2147483522 trying ~2147483522 trying 2147483523 trying ~2147483523 trying 2147483524 trying ~2147483524 trying 2147483525 trying ~2147483525 trying 2147483526 trying ~2147483526 trying 2147483527 trying ~2147483527 trying 2147483528 trying ~2147483528 trying 2147483529 trying ~2147483529 trying 2147483530 trying ~2147483530 trying 2147483531 trying ~2147483531 trying 2147483532 trying ~2147483532 trying 2147483533 trying ~2147483533 trying 2147483534 trying ~2147483534 trying 2147483535 trying ~2147483535 trying 2147483536 trying ~2147483536 trying 2147483537 trying ~2147483537 trying 2147483538 trying ~2147483538 trying 2147483539 trying ~2147483539 trying 2147483540 trying ~2147483540 trying 2147483541 trying ~2147483541 trying 2147483542 trying ~2147483542 trying 2147483543 trying ~2147483543 trying 2147483544 trying ~2147483544 trying 2147483545 trying ~2147483545 trying 2147483546 trying ~2147483546 trying 2147483547 trying ~2147483547 trying 2147483548 trying ~2147483548 trying 2147483549 trying ~2147483549 trying 2147483550 trying ~2147483550 trying 2147483551 trying ~2147483551 trying 2147483552 trying ~2147483552 trying 2147483553 trying ~2147483553 trying 2147483554 trying ~2147483554 trying 2147483555 trying ~2147483555 trying 2147483556 trying ~2147483556 trying 2147483557 trying ~2147483557 trying 2147483558 trying ~2147483558 trying 2147483559 trying ~2147483559 trying 2147483560 trying ~2147483560 trying 2147483561 trying ~2147483561 trying 2147483562 trying ~2147483562 trying 2147483563 trying ~2147483563 trying 2147483564 trying ~2147483564 trying 2147483565 trying ~2147483565 trying 2147483566 trying ~2147483566 trying 2147483567 trying ~2147483567 trying 2147483568 trying ~2147483568 trying 2147483569 trying ~2147483569 trying 2147483570 trying ~2147483570 trying 2147483571 trying ~2147483571 trying 2147483572 trying ~2147483572 trying 2147483573 trying ~2147483573 trying 2147483574 trying ~2147483574 trying 2147483575 trying ~2147483575 trying 2147483576 trying ~2147483576 trying 2147483577 trying ~2147483577 trying 2147483578 trying ~2147483578 trying 2147483579 trying ~2147483579 trying 2147483580 trying ~2147483580 trying 2147483581 trying ~2147483581 trying 2147483582 trying ~2147483582 trying 2147483583 trying ~2147483583 trying 2147483584 trying ~2147483584 trying 2147483585 trying ~2147483585 trying 2147483586 trying ~2147483586 trying 2147483587 trying ~2147483587 trying 2147483588 trying ~2147483588 trying 2147483589 trying ~2147483589 trying 2147483590 trying ~2147483590 trying 2147483591 trying ~2147483591 trying 2147483592 trying ~2147483592 trying 2147483593 trying ~2147483593 trying 2147483594 trying ~2147483594 trying 2147483595 trying ~2147483595 trying 2147483596 trying ~2147483596 trying 2147483597 trying ~2147483597 trying 2147483598 trying ~2147483598 trying 2147483599 trying ~2147483599 trying 2147483600 trying ~2147483600 trying 2147483601 trying ~2147483601 trying 2147483602 trying ~2147483602 trying 2147483603 trying ~2147483603 trying 2147483604 trying ~2147483604 trying 2147483605 trying ~2147483605 trying 2147483606 trying ~2147483606 trying 2147483607 trying ~2147483607 trying 2147483608 trying ~2147483608 trying 2147483609 trying ~2147483609 trying 2147483610 trying ~2147483610 trying 2147483611 trying ~2147483611 trying 2147483612 trying ~2147483612 trying 2147483613 trying ~2147483613 trying 2147483614 trying ~2147483614 trying 2147483615 trying ~2147483615 trying 2147483616 trying ~2147483616 trying 2147483617 trying ~2147483617 trying 2147483618 trying ~2147483618 trying 2147483619 trying ~2147483619 trying 2147483620 trying ~2147483620 trying 2147483621 trying ~2147483621 trying 2147483622 trying ~2147483622 trying 2147483623 trying ~2147483623 trying 2147483624 trying ~2147483624 trying 2147483625 trying ~2147483625 trying 2147483626 trying ~2147483626 trying 2147483627 trying ~2147483627 trying 2147483628 trying ~2147483628 trying 2147483629 trying ~2147483629 trying 2147483630 trying ~2147483630 trying 2147483631 trying ~2147483631 trying 2147483632 trying ~2147483632 trying 2147483633 trying ~2147483633 trying 2147483634 trying ~2147483634 trying 2147483635 trying ~2147483635 trying 2147483636 trying ~2147483636 trying 2147483637 trying ~2147483637 trying 2147483638 trying ~2147483638 trying 2147483639 trying ~2147483639 trying 2147483640 trying ~2147483640 trying 2147483641 trying ~2147483641 trying 2147483642 trying ~2147483642 trying 2147483643 trying ~2147483643 trying 2147483644 trying ~2147483644 trying 2147483645 trying ~2147483645 trying 2147483646 trying ~2147483646 trying 2147483647 trying ~2147483647 trying 2147483648 trying ~2147483648 trying 2147483649 trying ~2147483649 trying 2147483650 trying ~2147483650 trying 2147483651 trying ~2147483651 trying 2147483652 trying ~2147483652 trying 2147483653 trying ~2147483653 trying 2147483654 trying ~2147483654 trying 2147483655 trying ~2147483655 trying 2147483656 trying ~2147483656 trying 2147483657 trying ~2147483657 trying 2147483658 trying ~2147483658 trying 2147483659 trying ~2147483659 trying 2147483660 trying ~2147483660 trying 2147483661 trying ~2147483661 trying 2147483662 trying ~2147483662 trying 2147483663 trying ~2147483663 trying 2147483664 trying ~2147483664 trying 2147483665 trying ~2147483665 trying 2147483666 trying ~2147483666 trying 2147483667 trying ~2147483667 trying 2147483668 trying ~2147483668 trying 2147483669 trying ~2147483669 trying 2147483670 trying ~2147483670 trying 2147483671 trying ~2147483671 trying 2147483672 trying ~2147483672 trying 2147483673 trying ~2147483673 trying 2147483674 trying ~2147483674 trying 2147483675 trying ~2147483675 trying 2147483676 trying ~2147483676 trying 2147483677 trying ~2147483677 trying 2147483678 trying ~2147483678 trying 2147483679 trying ~2147483679 trying 2147483680 trying ~2147483680 trying 2147483681 trying ~2147483681 trying 2147483682 trying ~2147483682 trying 2147483683 trying ~2147483683 trying 2147483684 trying ~2147483684 trying 2147483685 trying ~2147483685 trying 2147483686 trying ~2147483686 trying 2147483687 trying ~2147483687 trying 2147483688 trying ~2147483688 trying 2147483689 trying ~2147483689 trying 2147483690 trying ~2147483690 trying 2147483691 trying ~2147483691 trying 2147483692 trying ~2147483692 trying 2147483693 trying ~2147483693 trying 2147483694 trying ~2147483694 trying 2147483695 trying ~2147483695 trying 2147483696 trying ~2147483696 trying 2147483697 trying ~2147483697 trying 2147483698 trying ~2147483698 trying 2147483699 trying ~2147483699 trying 2147483700 trying ~2147483700 trying 2147483701 trying ~2147483701 trying 2147483702 trying ~2147483702 trying 2147483703 trying ~2147483703 trying 2147483704 trying ~2147483704 trying 2147483705 trying ~2147483705 trying 2147483706 trying ~2147483706 trying 2147483707 trying ~2147483707 trying 2147483708 trying ~2147483708 trying 2147483709 trying ~2147483709 trying 2147483710 trying ~2147483710 trying 2147483711 trying ~2147483711 trying 2147483712 trying ~2147483712 trying 2147483713 trying ~2147483713 trying 2147483714 trying ~2147483714 trying 2147483715 trying ~2147483715 trying 2147483716 trying ~2147483716 trying 2147483717 trying ~2147483717 trying 2147483718 trying ~2147483718 trying 2147483719 trying ~2147483719 trying 2147483720 trying ~2147483720 trying 2147483721 trying ~2147483721 trying 2147483722 trying ~2147483722 trying 2147483723 trying ~2147483723 trying 2147483724 trying ~2147483724 trying 2147483725 trying ~2147483725 trying 2147483726 trying ~2147483726 trying 2147483727 trying ~2147483727 trying 2147483728 trying ~2147483728 trying 2147483729 trying ~2147483729 trying 2147483730 trying ~2147483730 trying 2147483731 trying ~2147483731 trying 2147483732 trying ~2147483732 trying 2147483733 trying ~2147483733 trying 2147483734 trying ~2147483734 trying 2147483735 trying ~2147483735 trying 2147483736 trying ~2147483736 trying 2147483737 trying ~2147483737 trying 2147483738 trying ~2147483738 trying 2147483739 trying ~2147483739 trying 2147483740 trying ~2147483740 trying 2147483741 trying ~2147483741 trying 2147483742 trying ~2147483742 trying 2147483743 trying ~2147483743 trying 2147483744 trying ~2147483744 trying 2147483745 trying ~2147483745 trying 2147483746 trying ~2147483746 trying 2147483747 trying ~2147483747 trying 2147483748 trying ~2147483748 trying 2147483749 trying ~2147483749 trying 2147483750 trying ~2147483750 trying 2147483751 trying ~2147483751 trying 2147483752 trying ~2147483752 trying 2147483753 trying ~2147483753 trying 2147483754 trying ~2147483754 trying 2147483755 trying ~2147483755 trying 2147483756 trying ~2147483756 trying 2147483757 trying ~2147483757 trying 2147483758 trying ~2147483758 trying 2147483759 trying ~2147483759 trying 2147483760 trying ~2147483760 trying 2147483761 trying ~2147483761 trying 2147483762 trying ~2147483762 trying 2147483763 trying ~2147483763 trying 2147483764 trying ~2147483764 trying 2147483765 trying ~2147483765 trying 2147483766 trying ~2147483766 trying 2147483767 trying ~2147483767 trying 2147483768 trying ~2147483768 trying 2147483769 trying ~2147483769 trying 2147483770 trying ~2147483770 trying 2147483771 trying ~2147483771 trying 2147483772 trying ~2147483772 trying 2147483773 trying ~2147483773 trying 2147483774 trying ~2147483774 trying 2147483775 trying ~2147483775 trying 2147483776 trying ~2147483776 trying 2147483777 trying ~2147483777 trying 2147483778 trying ~2147483778 trying 2147483779 trying ~2147483779 trying 2147483780 trying ~2147483780 trying 2147483781 trying ~2147483781 trying 2147483782 trying ~2147483782 trying 2147483783 trying ~2147483783 trying 2147483784 trying ~2147483784 trying 2147483785 trying ~2147483785 trying 2147483786 trying ~2147483786 trying 2147483787 trying ~2147483787 trying 2147483788 trying ~2147483788 trying 2147483789 trying ~2147483789 trying 2147483790 trying ~2147483790 trying 2147483791 trying ~2147483791 trying 2147483792 trying ~2147483792 trying 2147483793 trying ~2147483793 trying 2147483794 trying ~2147483794 trying 2147483795 trying ~2147483795 trying 2147483796 trying ~2147483796 trying 2147483797 trying ~2147483797 trying 2147483798 trying ~2147483798 trying 2147483799 trying ~2147483799 trying 2147483800 trying ~2147483800 trying 2147483801 trying ~2147483801 trying 2147483802 trying ~2147483802 trying 2147483803 trying ~2147483803 trying 2147483804 trying ~2147483804 trying 2147483805 trying ~2147483805 trying 2147483806 trying ~2147483806 trying 2147483807 trying ~2147483807 trying 2147483808 trying ~2147483808 trying 2147483809 trying ~2147483809 trying 2147483810 trying ~2147483810 trying 2147483811 trying ~2147483811 trying 2147483812 trying ~2147483812 trying 2147483813 trying ~2147483813 trying 2147483814 trying ~2147483814 trying 2147483815 trying ~2147483815 trying 2147483816 trying ~2147483816 trying 2147483817 trying ~2147483817 trying 2147483818 trying ~2147483818 trying 2147483819 trying ~2147483819 trying 2147483820 trying ~2147483820 trying 2147483821 trying ~2147483821 trying 2147483822 trying ~2147483822 trying 2147483823 trying ~2147483823 trying 2147483824 trying ~2147483824 trying 2147483825 trying ~2147483825 trying 2147483826 trying ~2147483826 trying 2147483827 trying ~2147483827 trying 2147483828 trying ~2147483828 trying 2147483829 trying ~2147483829 trying 2147483830 trying ~2147483830 trying 2147483831 trying ~2147483831 trying 2147483832 trying ~2147483832 trying 2147483833 trying ~2147483833 trying 2147483834 trying ~2147483834 trying 2147483835 trying ~2147483835 trying 2147483836 trying ~2147483836 trying 2147483837 trying ~2147483837 trying 2147483838 trying ~2147483838 trying 2147483839 trying ~2147483839 trying 2147483840 trying ~2147483840 trying 2147483841 trying ~2147483841 trying 2147483842 trying ~2147483842 trying 2147483843 trying ~2147483843 trying 2147483844 trying ~2147483844 trying 2147483845 trying ~2147483845 trying 2147483846 trying ~2147483846 trying 2147483847 trying ~2147483847 trying 2147483848 trying ~2147483848 trying 2147483849 trying ~2147483849 trying 2147483850 trying ~2147483850 trying 2147483851 trying ~2147483851 trying 2147483852 trying ~2147483852 trying 2147483853 trying ~2147483853 trying 2147483854 trying ~2147483854 trying 2147483855 trying ~2147483855 trying 2147483856 trying ~2147483856 trying 2147483857 trying ~2147483857 trying 2147483858 trying ~2147483858 trying 2147483859 trying ~2147483859 trying 2147483860 trying ~2147483860 trying 2147483861 trying ~2147483861 trying 2147483862 trying ~2147483862 trying 2147483863 trying ~2147483863 trying 2147483864 trying ~2147483864 trying 2147483865 trying ~2147483865 trying 2147483866 trying ~2147483866 trying 2147483867 trying ~2147483867 trying 2147483868 trying ~2147483868 trying 2147483869 trying ~2147483869 trying 2147483870 trying ~2147483870 trying 2147483871 trying ~2147483871 trying 2147483872 trying ~2147483872 trying 2147483873 trying ~2147483873 trying 2147483874 trying ~2147483874 trying 2147483875 trying ~2147483875 trying 2147483876 trying ~2147483876 trying 2147483877 trying ~2147483877 trying 2147483878 trying ~2147483878 trying 2147483879 trying ~2147483879 trying 2147483880 trying ~2147483880 trying 2147483881 trying ~2147483881 trying 2147483882 trying ~2147483882 trying 2147483883 trying ~2147483883 trying 2147483884 trying ~2147483884 trying 2147483885 trying ~2147483885 trying 2147483886 trying ~2147483886 trying 2147483887 trying ~2147483887 trying 2147483888 trying ~2147483888 trying 2147483889 trying ~2147483889 trying 2147483890 trying ~2147483890 trying 2147483891 trying ~2147483891 trying 2147483892 trying ~2147483892 trying 2147483893 trying ~2147483893 trying 2147483894 trying ~2147483894 trying 2147483895 trying ~2147483895 trying 2147483896 trying ~2147483896 trying 2147483897 trying ~2147483897 trying 2147483898 trying ~2147483898 trying 2147483899 trying ~2147483899 trying 2147483900 trying ~2147483900 trying 2147483901 trying ~2147483901 trying 2147483902 trying ~2147483902 trying 2147483903 trying ~2147483903 trying 2147483904 trying ~2147483904 trying 2147483905 trying ~2147483905 trying 2147483906 trying ~2147483906 trying 2147483907 trying ~2147483907 trying 2147483908 trying ~2147483908 trying 2147483909 trying ~2147483909 trying 2147483910 trying ~2147483910 trying 2147483911 trying ~2147483911 trying 2147483912 trying ~2147483912 trying 2147483913 trying ~2147483913 trying 2147483914 trying ~2147483914 trying 2147483915 trying ~2147483915 trying 2147483916 trying ~2147483916 trying 2147483917 trying ~2147483917 trying 2147483918 trying ~2147483918 trying 2147483919 trying ~2147483919 trying 2147483920 trying ~2147483920 trying 2147483921 trying ~2147483921 trying 2147483922 trying ~2147483922 trying 2147483923 trying ~2147483923 trying 2147483924 trying ~2147483924 trying 2147483925 trying ~2147483925 trying 2147483926 trying ~2147483926 trying 2147483927 trying ~2147483927 trying 2147483928 trying ~2147483928 trying 2147483929 trying ~2147483929 trying 2147483930 trying ~2147483930 trying 2147483931 trying ~2147483931 trying 2147483932 trying ~2147483932 trying 2147483933 trying ~2147483933 trying 2147483934 trying ~2147483934 trying 2147483935 trying ~2147483935 trying 2147483936 trying ~2147483936 trying 2147483937 trying ~2147483937 trying 2147483938 trying ~2147483938 trying 2147483939 trying ~2147483939 trying 2147483940 trying ~2147483940 trying 2147483941 trying ~2147483941 trying 2147483942 trying ~2147483942 trying 2147483943 trying ~2147483943 trying 2147483944 trying ~2147483944 trying 2147483945 trying ~2147483945 trying 2147483946 trying ~2147483946 trying 2147483947 trying ~2147483947 trying 2147483948 trying ~2147483948 trying 2147483949 trying ~2147483949 trying 2147483950 trying ~2147483950 trying 2147483951 trying ~2147483951 trying 2147483952 trying ~2147483952 trying 2147483953 trying ~2147483953 trying 2147483954 trying ~2147483954 trying 2147483955 trying ~2147483955 trying 2147483956 trying ~2147483956 trying 2147483957 trying ~2147483957 trying 2147483958 trying ~2147483958 trying 2147483959 trying ~2147483959 trying 2147483960 trying ~2147483960 trying 2147483961 trying ~2147483961 trying 2147483962 trying ~2147483962 trying 2147483963 trying ~2147483963 trying 2147483964 trying ~2147483964 trying 2147483965 trying ~2147483965 trying 2147483966 trying ~2147483966 trying 2147483967 trying ~2147483967 trying 2147483968 trying ~2147483968 trying 2147483969 trying ~2147483969 trying 2147483970 trying ~2147483970 trying 2147483971 trying ~2147483971 trying 2147483972 trying ~2147483972 trying 2147483973 trying ~2147483973 trying 2147483974 trying ~2147483974 trying 2147483975 trying ~2147483975 trying 2147483976 trying ~2147483976 trying 2147483977 trying ~2147483977 trying 2147483978 trying ~2147483978 trying 2147483979 trying ~2147483979 trying 2147483980 trying ~2147483980 trying 2147483981 trying ~2147483981 trying 2147483982 trying ~2147483982 trying 2147483983 trying ~2147483983 trying 2147483984 trying ~2147483984 trying 2147483985 trying ~2147483985 trying 2147483986 trying ~2147483986 trying 2147483987 trying ~2147483987 trying 2147483988 trying ~2147483988 trying 2147483989 trying ~2147483989 trying 2147483990 trying ~2147483990 trying 2147483991 trying ~2147483991 trying 2147483992 trying ~2147483992 trying 2147483993 trying ~2147483993 trying 2147483994 trying ~2147483994 trying 2147483995 trying ~2147483995 trying 2147483996 trying ~2147483996 trying 2147483997 trying ~2147483997 trying 2147483998 trying ~2147483998 trying 2147483999 trying ~2147483999 trying 2147484000 trying ~2147484000 trying 2147484001 trying ~2147484001 trying 2147484002 trying ~2147484002 trying 2147484003 trying ~2147484003 trying 2147484004 trying ~2147484004 trying 2147484005 trying ~2147484005 trying 2147484006 trying ~2147484006 trying 2147484007 trying ~2147484007 trying 2147484008 trying ~2147484008 trying 2147484009 trying ~2147484009 trying 2147484010 trying ~2147484010 trying 2147484011 trying ~2147484011 trying 2147484012 trying ~2147484012 trying 2147484013 trying ~2147484013 trying 2147484014 trying ~2147484014 trying 2147484015 trying ~2147484015 trying 2147484016 trying ~2147484016 trying 2147484017 trying ~2147484017 trying 2147484018 trying ~2147484018 trying 2147484019 trying ~2147484019 trying 2147484020 trying ~2147484020 trying 2147484021 trying ~2147484021 trying 2147484022 trying ~2147484022 trying 2147484023 trying ~2147484023 trying 2147484024 trying ~2147484024 trying 2147484025 trying ~2147484025 trying 2147484026 trying ~2147484026 trying 2147484027 trying ~2147484027 trying 2147484028 trying ~2147484028 trying 2147484029 trying ~2147484029 trying 2147484030 trying ~2147484030 trying 2147484031 trying ~2147484031 trying 2147484032 trying ~2147484032 trying 2147484033 trying ~2147484033 trying 2147484034 trying ~2147484034 trying 2147484035 trying ~2147484035 trying 2147484036 trying ~2147484036 trying 2147484037 trying ~2147484037 trying 2147484038 trying ~2147484038 trying 2147484039 trying ~2147484039 trying 2147484040 trying ~2147484040 trying 2147484041 trying ~2147484041 trying 2147484042 trying ~2147484042 trying 2147484043 trying ~2147484043 trying 2147484044 trying ~2147484044 trying 2147484045 trying ~2147484045 trying 2147484046 trying ~2147484046 trying 2147484047 trying ~2147484047 trying 2147484048 trying ~2147484048 trying 2147484049 trying ~2147484049 trying 2147484050 trying ~2147484050 trying 2147484051 trying ~2147484051 trying 2147484052 trying ~2147484052 trying 2147484053 trying ~2147484053 trying 2147484054 trying ~2147484054 trying 2147484055 trying ~2147484055 trying 2147484056 trying ~2147484056 trying 2147484057 trying ~2147484057 trying 2147484058 trying ~2147484058 trying 2147484059 trying ~2147484059 trying 2147484060 trying ~2147484060 trying 2147484061 trying ~2147484061 trying 2147484062 trying ~2147484062 trying 2147484063 trying ~2147484063 trying 2147484064 trying ~2147484064 trying 2147484065 trying ~2147484065 trying 2147484066 trying ~2147484066 trying 2147484067 trying ~2147484067 trying 2147484068 trying ~2147484068 trying 2147484069 trying ~2147484069 trying 2147484070 trying ~2147484070 trying 2147484071 trying ~2147484071 trying 2147484072 trying ~2147484072 trying 2147484073 trying ~2147484073 trying 2147484074 trying ~2147484074 trying 2147484075 trying ~2147484075 trying 2147484076 trying ~2147484076 trying 2147484077 trying ~2147484077 trying 2147484078 trying ~2147484078 trying 2147484079 trying ~2147484079 trying 2147484080 trying ~2147484080 trying 2147484081 trying ~2147484081 trying 2147484082 trying ~2147484082 trying 2147484083 trying ~2147484083 trying 2147484084 trying ~2147484084 trying 2147484085 trying ~2147484085 trying 2147484086 trying ~2147484086 trying 2147484087 trying ~2147484087 trying 2147484088 trying ~2147484088 trying 2147484089 trying ~2147484089 trying 2147484090 trying ~2147484090 trying 2147484091 trying ~2147484091 trying 2147484092 trying ~2147484092 trying 2147484093 trying ~2147484093 trying 2147484094 trying ~2147484094 trying 2147484095 trying ~2147484095 trying 2147484096 trying ~2147484096 trying 2147484097 trying ~2147484097 trying 2147484098 trying ~2147484098 trying 2147484099 trying ~2147484099 trying 2147484100 trying ~2147484100 trying 2147484101 trying ~2147484101 trying 2147484102 trying ~2147484102 trying 2147484103 trying ~2147484103 trying 2147484104 trying ~2147484104 trying 2147484105 trying ~2147484105 trying 2147484106 trying ~2147484106 trying 2147484107 trying ~2147484107 trying 2147484108 trying ~2147484108 trying 2147484109 trying ~2147484109 trying 2147484110 trying ~2147484110 trying 2147484111 trying ~2147484111 trying 2147484112 trying ~2147484112 trying 2147484113 trying ~2147484113 trying 2147484114 trying ~2147484114 trying 2147484115 trying ~2147484115 trying 2147484116 trying ~2147484116 trying 2147484117 trying ~2147484117 trying 2147484118 trying ~2147484118 trying 2147484119 trying ~2147484119 trying 2147484120 trying ~2147484120 trying 2147484121 trying ~2147484121 trying 2147484122 trying ~2147484122 trying 2147484123 trying ~2147484123 trying 2147484124 trying ~2147484124 trying 2147484125 trying ~2147484125 trying 2147484126 trying ~2147484126 trying 2147484127 trying ~2147484127 trying 2147484128 trying ~2147484128 trying 2147484129 trying ~2147484129 trying 2147484130 trying ~2147484130 trying 2147484131 trying ~2147484131 trying 2147484132 trying ~2147484132 trying 2147484133 trying ~2147484133 trying 2147484134 trying ~2147484134 trying 2147484135 trying ~2147484135 trying 2147484136 trying ~2147484136 trying 2147484137 trying ~2147484137 trying 2147484138 trying ~2147484138 trying 2147484139 trying ~2147484139 trying 2147484140 trying ~2147484140 trying 2147484141 trying ~2147484141 trying 2147484142 trying ~2147484142 trying 2147484143 trying ~2147484143 trying 2147484144 trying ~2147484144 trying 2147484145 trying ~2147484145 trying 2147484146 trying ~2147484146 trying 2147484147 trying ~2147484147 trying 2147484148 trying ~2147484148 trying 2147484149 trying ~2147484149 trying 2147484150 trying ~2147484150 trying 2147484151 trying ~2147484151 trying 2147484152 trying ~2147484152 trying 2147484153 trying ~2147484153 trying 2147484154 trying ~2147484154 trying 2147484155 trying ~2147484155 trying 2147484156 trying ~2147484156 trying 2147484157 trying ~2147484157 trying 2147484158 trying ~2147484158 trying 2147484159 trying ~2147484159 trying 2147484160 trying ~2147484160 trying 2147484161 trying ~2147484161 trying 2147484162 trying ~2147484162 trying 2147484163 trying ~2147484163 trying 2147484164 trying ~2147484164 trying 2147484165 trying ~2147484165 trying 2147484166 trying ~2147484166 trying 2147484167 trying ~2147484167 trying 2147484168 trying ~2147484168 trying 2147484169 trying ~2147484169 trying 2147484170 trying ~2147484170 trying 2147484171 trying ~2147484171 trying 2147484172 trying ~2147484172 trying 2147484173 trying ~2147484173 trying 2147484174 trying ~2147484174 trying 2147484175 trying ~2147484175 trying 2147484176 trying ~2147484176 trying 2147484177 trying ~2147484177 trying 2147484178 trying ~2147484178 trying 2147484179 trying ~2147484179 trying 2147484180 trying ~2147484180 trying 2147484181 trying ~2147484181 trying 2147484182 trying ~2147484182 trying 2147484183 trying ~2147484183 trying 2147484184 trying ~2147484184 trying 2147484185 trying ~2147484185 trying 2147484186 trying ~2147484186 trying 2147484187 trying ~2147484187 trying 2147484188 trying ~2147484188 trying 2147484189 trying ~2147484189 trying 2147484190 trying ~2147484190 trying 2147484191 trying ~2147484191 trying 2147484192 trying ~2147484192 trying 2147484193 trying ~2147484193 trying 2147484194 trying ~2147484194 trying 2147484195 trying ~2147484195 trying 2147484196 trying ~2147484196 trying 2147484197 trying ~2147484197 trying 2147484198 trying ~2147484198 trying 2147484199 trying ~2147484199 trying 2147484200 trying ~2147484200 trying 2147484201 trying ~2147484201 trying 2147484202 trying ~2147484202 trying 2147484203 trying ~2147484203 trying 2147484204 trying ~2147484204 trying 2147484205 trying ~2147484205 trying 2147484206 trying ~2147484206 trying 2147484207 trying ~2147484207 trying 2147484208 trying ~2147484208 trying 2147484209 trying ~2147484209 trying 2147484210 trying ~2147484210 trying 2147484211 trying ~2147484211 trying 2147484212 trying ~2147484212 trying 2147484213 trying ~2147484213 trying 2147484214 trying ~2147484214 trying 2147484215 trying ~2147484215 trying 2147484216 trying ~2147484216 trying 2147484217 trying ~2147484217 trying 2147484218 trying ~2147484218 trying 2147484219 trying ~2147484219 trying 2147484220 trying ~2147484220 trying 2147484221 trying ~2147484221 trying 2147484222 trying ~2147484222 trying 2147484223 trying ~2147484223 trying 2147484224 trying ~2147484224 trying 2147484225 trying ~2147484225 trying 2147484226 trying ~2147484226 trying 2147484227 trying ~2147484227 trying 2147484228 trying ~2147484228 trying 2147484229 trying ~2147484229 trying 2147484230 trying ~2147484230 trying 2147484231 trying ~2147484231 trying 2147484232 trying ~2147484232 trying 2147484233 trying ~2147484233 trying 2147484234 trying ~2147484234 trying 2147484235 trying ~2147484235 trying 2147484236 trying ~2147484236 trying 2147484237 trying ~2147484237 trying 2147484238 trying ~2147484238 trying 2147484239 trying ~2147484239 trying 2147484240 trying ~2147484240 trying 2147484241 trying ~2147484241 trying 2147484242 trying ~2147484242 trying 2147484243 trying ~2147484243 trying 2147484244 trying ~2147484244 trying 2147484245 trying ~2147484245 trying 2147484246 trying ~2147484246 trying 2147484247 trying ~2147484247 trying 2147484248 trying ~2147484248 trying 2147484249 trying ~2147484249 trying 2147484250 trying ~2147484250 trying 2147484251 trying ~2147484251 trying 2147484252 trying ~2147484252 trying 2147484253 trying ~2147484253 trying 2147484254 trying ~2147484254 trying 2147484255 trying ~2147484255 trying 2147484256 trying ~2147484256 trying 2147484257 trying ~2147484257 trying 2147484258 trying ~2147484258 trying 2147484259 trying ~2147484259 trying 2147484260 trying ~2147484260 trying 2147484261 trying ~2147484261 trying 2147484262 trying ~2147484262 trying 2147484263 trying ~2147484263 trying 2147484264 trying ~2147484264 trying 2147484265 trying ~2147484265 trying 2147484266 trying ~2147484266 trying 2147484267 trying ~2147484267 trying 2147484268 trying ~2147484268 trying 2147484269 trying ~2147484269 trying 2147484270 trying ~2147484270 trying 2147484271 trying ~2147484271 trying 2147484272 trying ~2147484272 trying 2147484273 trying ~2147484273 trying 2147484274 trying ~2147484274 trying 2147484275 trying ~2147484275 trying 2147484276 trying ~2147484276 trying 2147484277 trying ~2147484277 trying 2147484278 trying ~2147484278 trying 2147484279 trying ~2147484279 trying 2147484280 trying ~2147484280 trying 2147484281 trying ~2147484281 trying 2147484282 trying ~2147484282 trying 2147484283 trying ~2147484283 trying 2147484284 trying ~2147484284 trying 2147484285 trying ~2147484285 trying 2147484286 trying ~2147484286 trying 2147484287 trying ~2147484287 trying 2147484288 trying ~2147484288 trying 2147484289 trying ~2147484289 trying 2147484290 trying ~2147484290 trying 2147484291 trying ~2147484291 trying 2147484292 trying ~2147484292 trying 2147484293 trying ~2147484293 trying 2147484294 trying ~2147484294 trying 2147484295 trying ~2147484295 trying 2147484296 trying ~2147484296 trying 2147484297 trying ~2147484297 trying 2147484298 trying ~2147484298 trying 2147484299 trying ~2147484299 trying 2147484300 trying ~2147484300 trying 2147484301 trying ~2147484301 trying 2147484302 trying ~2147484302 trying 2147484303 trying ~2147484303 trying 2147484304 trying ~2147484304 trying 2147484305 trying ~2147484305 trying 2147484306 trying ~2147484306 trying 2147484307 trying ~2147484307 trying 2147484308 trying ~2147484308 trying 2147484309 trying ~2147484309 trying 2147484310 trying ~2147484310 trying 2147484311 trying ~2147484311 trying 2147484312 trying ~2147484312 trying 2147484313 trying ~2147484313 trying 2147484314 trying ~2147484314 trying 2147484315 trying ~2147484315 trying 2147484316 trying ~2147484316 trying 2147484317 trying ~2147484317 trying 2147484318 trying ~2147484318 trying 2147484319 trying ~2147484319 trying 2147484320 trying ~2147484320 trying 2147484321 trying ~2147484321 trying 2147484322 trying ~2147484322 trying 2147484323 trying ~2147484323 trying 2147484324 trying ~2147484324 trying 2147484325 trying ~2147484325 trying 2147484326 trying ~2147484326 trying 2147484327 trying ~2147484327 trying 2147484328 trying ~2147484328 trying 2147484329 trying ~2147484329 trying 2147484330 trying ~2147484330 trying 2147484331 trying ~2147484331 trying 2147484332 trying ~2147484332 trying 2147484333 trying ~2147484333 trying 2147484334 trying ~2147484334 trying 2147484335 trying ~2147484335 trying 2147484336 trying ~2147484336 trying 2147484337 trying ~2147484337 trying 2147484338 trying ~2147484338 trying 2147484339 trying ~2147484339 trying 2147484340 trying ~2147484340 trying 2147484341 trying ~2147484341 trying 2147484342 trying ~2147484342 trying 2147484343 trying ~2147484343 trying 2147484344 trying ~2147484344 trying 2147484345 trying ~2147484345 trying 2147484346 trying ~2147484346 trying 2147484347 trying ~2147484347 trying 2147484348 trying ~2147484348 trying 2147484349 trying ~2147484349 trying 2147484350 trying ~2147484350 trying 2147484351 trying ~2147484351 trying 2147484352 trying ~2147484352 trying 2147484353 trying ~2147484353 trying 2147484354 trying ~2147484354 trying 2147484355 trying ~2147484355 trying 2147484356 trying ~2147484356 trying 2147484357 trying ~2147484357 trying 2147484358 trying ~2147484358 trying 2147484359 trying ~2147484359 trying 2147484360 trying ~2147484360 trying 2147484361 trying ~2147484361 trying 2147484362 trying ~2147484362 trying 2147484363 trying ~2147484363 trying 2147484364 trying ~2147484364 trying 2147484365 trying ~2147484365 trying 2147484366 trying ~2147484366 trying 2147484367 trying ~2147484367 trying 2147484368 trying ~2147484368 trying 2147484369 trying ~2147484369 trying 2147484370 trying ~2147484370 trying 2147484371 trying ~2147484371 trying 2147484372 trying ~2147484372 trying 2147484373 trying ~2147484373 trying 2147484374 trying ~2147484374 trying 2147484375 trying ~2147484375 trying 2147484376 trying ~2147484376 trying 2147484377 trying ~2147484377 trying 2147484378 trying ~2147484378 trying 2147484379 trying ~2147484379 trying 2147484380 trying ~2147484380 trying 2147484381 trying ~2147484381 trying 2147484382 trying ~2147484382 trying 2147484383 trying ~2147484383 trying 2147484384 trying ~2147484384 trying 2147484385 trying ~2147484385 trying 2147484386 trying ~2147484386 trying 2147484387 trying ~2147484387 trying 2147484388 trying ~2147484388 trying 2147484389 trying ~2147484389 trying 2147484390 trying ~2147484390 trying 2147484391 trying ~2147484391 trying 2147484392 trying ~2147484392 trying 2147484393 trying ~2147484393 trying 2147484394 trying ~2147484394 trying 2147484395 trying ~2147484395 trying 2147484396 trying ~2147484396 trying 2147484397 trying ~2147484397 trying 2147484398 trying ~2147484398 trying 2147484399 trying ~2147484399 trying 2147484400 trying ~2147484400 trying 2147484401 trying ~2147484401 trying 2147484402 trying ~2147484402 trying 2147484403 trying ~2147484403 trying 2147484404 trying ~2147484404 trying 2147484405 trying ~2147484405 trying 2147484406 trying ~2147484406 trying 2147484407 trying ~2147484407 trying 2147484408 trying ~2147484408 trying 2147484409 trying ~2147484409 trying 2147484410 trying ~2147484410 trying 2147484411 trying ~2147484411 trying 2147484412 trying ~2147484412 trying 2147484413 trying ~2147484413 trying 2147484414 trying ~2147484414 trying 2147484415 trying ~2147484415 trying 2147484416 trying ~2147484416 trying 2147484417 trying ~2147484417 trying 2147484418 trying ~2147484418 trying 2147484419 trying ~2147484419 trying 2147484420 trying ~2147484420 trying 2147484421 trying ~2147484421 trying 2147484422 trying ~2147484422 trying 2147484423 trying ~2147484423 trying 2147484424 trying ~2147484424 trying 2147484425 trying ~2147484425 trying 2147484426 trying ~2147484426 trying 2147484427 trying ~2147484427 trying 2147484428 trying ~2147484428 trying 2147484429 trying ~2147484429 trying 2147484430 trying ~2147484430 trying 2147484431 trying ~2147484431 trying 2147484432 trying ~2147484432 trying 2147484433 trying ~2147484433 trying 2147484434 trying ~2147484434 trying 2147484435 trying ~2147484435 trying 2147484436 trying ~2147484436 trying 2147484437 trying ~2147484437 trying 2147484438 trying ~2147484438 trying 2147484439 trying ~2147484439 trying 2147484440 trying ~2147484440 trying 2147484441 trying ~2147484441 trying 2147484442 trying ~2147484442 trying 2147484443 trying ~2147484443 trying 2147484444 trying ~2147484444 trying 2147484445 trying ~2147484445 trying 2147484446 trying ~2147484446 trying 2147484447 trying ~2147484447 trying 2147484448 trying ~2147484448 trying 2147484449 trying ~2147484449 trying 2147484450 trying ~2147484450 trying 2147484451 trying ~2147484451 trying 2147484452 trying ~2147484452 trying 2147484453 trying ~2147484453 trying 2147484454 trying ~2147484454 trying 2147484455 trying ~2147484455 trying 2147484456 trying ~2147484456 trying 2147484457 trying ~2147484457 trying 2147484458 trying ~2147484458 trying 2147484459 trying ~2147484459 trying 2147484460 trying ~2147484460 trying 2147484461 trying ~2147484461 trying 2147484462 trying ~2147484462 trying 2147484463 trying ~2147484463 trying 2147484464 trying ~2147484464 trying 2147484465 trying ~2147484465 trying 2147484466 trying ~2147484466 trying 2147484467 trying ~2147484467 trying 2147484468 trying ~2147484468 trying 2147484469 trying ~2147484469 trying 2147484470 trying ~2147484470 trying 2147484471 trying ~2147484471 trying 2147484472 trying ~2147484472 trying 2147484473 trying ~2147484473 trying 2147484474 trying ~2147484474 trying 2147484475 trying ~2147484475 trying 2147484476 trying ~2147484476 trying 2147484477 trying ~2147484477 trying 2147484478 trying ~2147484478 trying 2147484479 trying ~2147484479 trying 2147484480 trying ~2147484480 trying 2147484481 trying ~2147484481 trying 2147484482 trying ~2147484482 trying 2147484483 trying ~2147484483 trying 2147484484 trying ~2147484484 trying 2147484485 trying ~2147484485 trying 2147484486 trying ~2147484486 trying 2147484487 trying ~2147484487 trying 2147484488 trying ~2147484488 trying 2147484489 trying ~2147484489 trying 2147484490 trying ~2147484490 trying 2147484491 trying ~2147484491 trying 2147484492 trying ~2147484492 trying 2147484493 trying ~2147484493 trying 2147484494 trying ~2147484494 trying 2147484495 trying ~2147484495 trying 2147484496 trying ~2147484496 trying 2147484497 trying ~2147484497 trying 2147484498 trying ~2147484498 trying 2147484499 trying ~2147484499 trying 2147484500 trying ~2147484500 trying 2147484501 trying ~2147484501 trying 2147484502 trying ~2147484502 trying 2147484503 trying ~2147484503 trying 2147484504 trying ~2147484504 trying 2147484505 trying ~2147484505 trying 2147484506 trying ~2147484506 trying 2147484507 trying ~2147484507 trying 2147484508 trying ~2147484508 trying 2147484509 trying ~2147484509 trying 2147484510 trying ~2147484510 trying 2147484511 trying ~2147484511 trying 2147484512 trying ~2147484512 trying 2147484513 trying ~2147484513 trying 2147484514 trying ~2147484514 trying 2147484515 trying ~2147484515 trying 2147484516 trying ~2147484516 trying 2147484517 trying ~2147484517 trying 2147484518 trying ~2147484518 trying 2147484519 trying ~2147484519 trying 2147484520 trying ~2147484520 trying 2147484521 trying ~2147484521 trying 2147484522 trying ~2147484522 trying 2147484523 trying ~2147484523 trying 2147484524 trying ~2147484524 trying 2147484525 trying ~2147484525 trying 2147484526 trying ~2147484526 trying 2147484527 trying ~2147484527 trying 2147484528 trying ~2147484528 trying 2147484529 trying ~2147484529 trying 2147484530 trying ~2147484530 trying 2147484531 trying ~2147484531 trying 2147484532 trying ~2147484532 trying 2147484533 trying ~2147484533 trying 2147484534 trying ~2147484534 trying 2147484535 trying ~2147484535 trying 2147484536 trying ~2147484536 trying 2147484537 trying ~2147484537 trying 2147484538 trying ~2147484538 trying 2147484539 trying ~2147484539 trying 2147484540 trying ~2147484540 trying 2147484541 trying ~2147484541 trying 2147484542 trying ~2147484542 trying 2147484543 trying ~2147484543 trying 2147484544 trying ~2147484544 trying 2147484545 trying ~2147484545 trying 2147484546 trying ~2147484546 trying 2147484547 trying ~2147484547 trying 2147484548 trying ~2147484548 trying 2147484549 trying ~2147484549 trying 2147484550 trying ~2147484550 trying 2147484551 trying ~2147484551 trying 2147484552 trying ~2147484552 trying 2147484553 trying ~2147484553 trying 2147484554 trying ~2147484554 trying 2147484555 trying ~2147484555 trying 2147484556 trying ~2147484556 trying 2147484557 trying ~2147484557 trying 2147484558 trying ~2147484558 trying 2147484559 trying ~2147484559 trying 2147484560 trying ~2147484560 trying 2147484561 trying ~2147484561 trying 2147484562 trying ~2147484562 trying 2147484563 trying ~2147484563 trying 2147484564 trying ~2147484564 trying 2147484565 trying ~2147484565 trying 2147484566 trying ~2147484566 trying 2147484567 trying ~2147484567 trying 2147484568 trying ~2147484568 trying 2147484569 trying ~2147484569 trying 2147484570 trying ~2147484570 trying 2147484571 trying ~2147484571 trying 2147484572 trying ~2147484572 trying 2147484573 trying ~2147484573 trying 2147484574 trying ~2147484574 trying 2147484575 trying ~2147484575 trying 2147484576 trying ~2147484576 trying 2147484577 trying ~2147484577 trying 2147484578 trying ~2147484578 trying 2147484579 trying ~2147484579 trying 2147484580 trying ~2147484580 trying 2147484581 trying ~2147484581 trying 2147484582 trying ~2147484582 trying 2147484583 trying ~2147484583 trying 2147484584 trying ~2147484584 trying 2147484585 trying ~2147484585 trying 2147484586 trying ~2147484586 trying 2147484587 trying ~2147484587 trying 2147484588 trying ~2147484588 trying 2147484589 trying ~2147484589 trying 2147484590 trying ~2147484590 trying 2147484591 trying ~2147484591 trying 2147484592 trying ~2147484592 trying 2147484593 trying ~2147484593 trying 2147484594 trying ~2147484594 trying 2147484595 trying ~2147484595 trying 2147484596 trying ~2147484596 trying 2147484597 trying ~2147484597 trying 2147484598 trying ~2147484598 trying 2147484599 trying ~2147484599 trying 2147484600 trying ~2147484600 trying 2147484601 trying ~2147484601 trying 2147484602 trying ~2147484602 trying 2147484603 trying ~2147484603 trying 2147484604 trying ~2147484604 trying 2147484605 trying ~2147484605 trying 2147484606 trying ~2147484606 trying 2147484607 trying ~2147484607 trying 2147484608 trying ~2147484608 trying 2147484609 trying ~2147484609 trying 2147484610 trying ~2147484610 trying 2147484611 trying ~2147484611 trying 2147484612 trying ~2147484612 trying 2147484613 trying ~2147484613 trying 2147484614 trying ~2147484614 trying 2147484615 trying ~2147484615 trying 2147484616 trying ~2147484616 trying 2147484617 trying ~2147484617 trying 2147484618 trying ~2147484618 trying 2147484619 trying ~2147484619 trying 2147484620 trying ~2147484620 trying 2147484621 trying ~2147484621 trying 2147484622 trying ~2147484622 trying 2147484623 trying ~2147484623 trying 2147484624 trying ~2147484624 trying 2147484625 trying ~2147484625 trying 2147484626 trying ~2147484626 trying 2147484627 trying ~2147484627 trying 2147484628 trying ~2147484628 trying 2147484629 trying ~2147484629 trying 2147484630 trying ~2147484630 trying 2147484631 trying ~2147484631 trying 2147484632 trying ~2147484632 trying 2147484633 trying ~2147484633 trying 2147484634 trying ~2147484634 trying 2147484635 trying ~2147484635 trying 2147484636 trying ~2147484636 trying 2147484637 trying ~2147484637 trying 2147484638 trying ~2147484638 trying 2147484639 trying ~2147484639 trying 2147484640 trying ~2147484640 trying 2147484641 trying ~2147484641 trying 2147484642 trying ~2147484642 trying 2147484643 trying ~2147484643 trying 2147484644 trying ~2147484644 trying 2147484645 trying ~2147484645 trying 2147484646 trying ~2147484646 trying 2147484647 trying ~2147484647 All ok mlton-20100608/regression/int-inf.2.sml0000644000076600000240000000265611404435617016176 0ustar mtfstaffval big: IntInf.int = 0x80000000 fun try (barg: IntInf.int): unit = let val small = SOME (IntInf.toInt barg) handle Overflow => NONE val bstr = IntInf.toString barg val _ = print (concat ["trying ", bstr, "\n"]) fun fail msg = print ("Fail " ^ msg ^ ": " ^ bstr ^ "\n") val isSmall = ~ big <= barg andalso barg < big in case small of NONE => if isSmall then fail "1" else () | SOME sarg => if isSmall then let val sstr = Int.toString sarg in if bstr = sstr andalso barg = IntInf.fromInt sarg then () else fail "2" end else fail "3" end fun spin (low: IntInf.int, limit: IntInf.int): unit = let fun loop (arg: IntInf.int): unit = if arg = limit then () else ( try arg; try (~ arg); loop (arg + 1) ) in loop low end val _ = spin (0, 1000) val _ = spin (0x40000000 - 1000, 0x40000000 + 1000) val _ = spin (big - 1000, big + 1000) val _ = print "All ok\n" mlton-20100608/regression/int-inf.3.ok0000644000076600000240000000001211404435620015767 0ustar mtfstafftrue12345 mlton-20100608/regression/int-inf.3.sml0000644000076600000240000000021211404435617016161 0ustar mtfstaffval _ = print (Bool.toString ((1: IntInf.int) < 2)) val _ = print (IntInf.toString (IntInf.quot (1234567890, 100000))) val _ = print "\n" mlton-20100608/regression/int-inf.4.ok0000644000076600000240000000002511404435620015774 0ustar mtfstaff09876543210987654321 mlton-20100608/regression/int-inf.4.sml0000644000076600000240000000044011404435617016165 0ustar mtfstafffun dump (x: IntInf.int): unit = let val rest = IntInf.quot (x, 10) in (print o Int.toString o IntInf.toInt o IntInf.rem) (x, 10); if rest = 0 then print "\n" else dump rest end val _ = dump 12345678901234567890 mlton-20100608/regression/int-inf.5.ok0000644000076600000240000000002011404435621015771 0ustar mtfstaff5 5 500000000 1 mlton-20100608/regression/int-inf.5.sml0000644000076600000240000000044511404435617016173 0ustar mtfstaffopen IntInf MLton.IntInf fun p (a, b) = (print (toString (gcd (a, b))) ; print "\n") val _ = List.app p [(1000, 205), (1000000000000, 205), (100000000000000000000, 500000000), (100000000000000000000, 500000001)] mlton-20100608/regression/int-inf.bitops.ok0000644000076600000240000046174611404435617017164 0ustar mtfstaff A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 1 A & B: 0 A: 0 B: 1 A | B: 1 A: 0 B: 1 A ^ B: 1 A: 0 B: 1 A & B: 0 A: 0 B: 1 A | B: 1 A: 0 B: 1 A ^ B: 1 A: 0 B: ~1 A & B: 0 A: 0 B: ~1 A | B: ~1 A: 0 B: ~1 A ^ B: ~1 A: 0 B: ~1 A & B: 0 A: 0 B: ~1 A | B: ~1 A: 0 B: ~1 A ^ B: ~1 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: B A & B: 0 A: 0 B: B A | B: B A: 0 B: B A ^ B: B A: 0 B: B A & B: 0 A: 0 B: B A | B: B A: 0 B: B A ^ B: B A: 0 B: ~B A & B: 0 A: 0 B: ~B A | B: ~B A: 0 B: ~B A ^ B: ~B A: 0 B: ~B A & B: 0 A: 0 B: ~B A | B: ~B A: 0 B: ~B A ^ B: ~B A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: B A & B: 0 A: 0 B: B A | B: B A: 0 B: B A ^ B: B A: 0 B: B A & B: 0 A: 0 B: B A | B: B A: 0 B: B A ^ B: B A: 0 B: ~B A & B: 0 A: 0 B: ~B A | B: ~B A: 0 B: ~B A ^ B: ~B A: 0 B: ~B A & B: 0 A: 0 B: ~B A | B: ~B A: 0 B: ~B A ^ B: ~B A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 79 A & B: 0 A: 0 B: 79 A | B: 79 A: 0 B: 79 A ^ B: 79 A: 0 B: 79 A & B: 0 A: 0 B: 79 A | B: 79 A: 0 B: 79 A ^ B: 79 A: 0 B: ~79 A & B: 0 A: 0 B: ~79 A | B: ~79 A: 0 B: ~79 A ^ B: ~79 A: 0 B: ~79 A & B: 0 A: 0 B: ~79 A | B: ~79 A: 0 B: ~79 A ^ B: ~79 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 79 A & B: 0 A: 0 B: 79 A | B: 79 A: 0 B: 79 A ^ B: 79 A: 0 B: 79 A & B: 0 A: 0 B: 79 A | B: 79 A: 0 B: 79 A ^ B: 79 A: 0 B: ~79 A & B: 0 A: 0 B: ~79 A | B: ~79 A: 0 B: ~79 A ^ B: ~79 A: 0 B: ~79 A & B: 0 A: 0 B: ~79 A | B: ~79 A: 0 B: ~79 A ^ B: ~79 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 533 A & B: 0 A: 0 B: 533 A | B: 533 A: 0 B: 533 A ^ B: 533 A: 0 B: 533 A & B: 0 A: 0 B: 533 A | B: 533 A: 0 B: 533 A ^ B: 533 A: 0 B: ~533 A & B: 0 A: 0 B: ~533 A | B: ~533 A: 0 B: ~533 A ^ B: ~533 A: 0 B: ~533 A & B: 0 A: 0 B: ~533 A | B: ~533 A: 0 B: ~533 A ^ B: ~533 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 533 A & B: 0 A: 0 B: 533 A | B: 533 A: 0 B: 533 A ^ B: 533 A: 0 B: 533 A & B: 0 A: 0 B: 533 A | B: 533 A: 0 B: 533 A ^ B: 533 A: 0 B: ~533 A & B: 0 A: 0 B: ~533 A | B: ~533 A: 0 B: ~533 A ^ B: ~533 A: 0 B: ~533 A & B: 0 A: 0 B: ~533 A | B: ~533 A: 0 B: ~533 A ^ B: ~533 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 3931 A & B: 0 A: 0 B: 3931 A | B: 3931 A: 0 B: 3931 A ^ B: 3931 A: 0 B: 3931 A & B: 0 A: 0 B: 3931 A | B: 3931 A: 0 B: 3931 A ^ B: 3931 A: 0 B: ~3931 A & B: 0 A: 0 B: ~3931 A | B: ~3931 A: 0 B: ~3931 A ^ B: ~3931 A: 0 B: ~3931 A & B: 0 A: 0 B: ~3931 A | B: ~3931 A: 0 B: ~3931 A ^ B: ~3931 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 1 B: 1 A & B: 1 A: 1 B: 1 A | B: 1 A: 1 B: 1 A ^ B: 0 A: ~1 B: 1 A & B: 1 A: ~1 B: 1 A | B: ~1 A: ~1 B: 1 A ^ B: ~2 A: 1 B: ~1 A & B: 1 A: 1 B: ~1 A | B: ~1 A: 1 B: ~1 A ^ B: ~2 A: ~1 B: ~1 A & B: ~1 A: ~1 B: ~1 A | B: ~1 A: ~1 B: ~1 A ^ B: 0 A: 1 B: 2 A & B: 0 A: 1 B: 2 A | B: 3 A: 1 B: 2 A ^ B: 3 A: ~1 B: 2 A & B: 2 A: ~1 B: 2 A | B: ~1 A: ~1 B: 2 A ^ B: ~3 A: 1 B: ~2 A & B: 0 A: 1 B: ~2 A | B: ~1 A: 1 B: ~2 A ^ B: ~1 A: ~1 B: ~2 A & B: ~2 A: ~1 B: ~2 A | B: ~1 A: ~1 B: ~2 A ^ B: 1 A: 1 B: B A & B: 1 A: 1 B: B A | B: B A: 1 B: B A ^ B: A A: ~1 B: B A & B: B A: ~1 B: B A | B: ~1 A: ~1 B: B A ^ B: ~C A: 1 B: ~B A & B: 1 A: 1 B: ~B A | B: ~B A: 1 B: ~B A ^ B: ~C A: ~1 B: ~B A & B: ~B A: ~1 B: ~B A | B: ~1 A: ~1 B: ~B A ^ B: A A: 1 B: 16 A & B: 0 A: 1 B: 16 A | B: 17 A: 1 B: 16 A ^ B: 17 A: ~1 B: 16 A & B: 16 A: ~1 B: 16 A | B: ~1 A: ~1 B: 16 A ^ B: ~17 A: 1 B: ~16 A & B: 0 A: 1 B: ~16 A | B: ~15 A: 1 B: ~16 A ^ B: ~15 A: ~1 B: ~16 A & B: ~16 A: ~1 B: ~16 A | B: ~1 A: ~1 B: ~16 A ^ B: 15 A: 1 ! A: ~2 A: ~1 ! A: 0 A: ~1 A ~>> 0: ~1 A: ~1 A ~>> 1: ~1 A: ~1 A ~>> 2: ~1 A: ~1 A ~>> F: ~1 A: ~1 A ~>> 10: ~1 A: ~1 A ~>> 11: ~1 A: ~1 A ~>> 12: ~1 A: ~1 A << 0: ~1 A: ~1 A << 1: ~2 A: ~1 A << 2: ~4 A: ~1 A << F: ~8000 A: ~1 A << 10: ~10000 A: ~1 A << 11: ~20000 A: ~1 A << 12: ~40000 A: B B: B A & B: B A: B B: B A | B: B A: B B: B A ^ B: 0 A: ~B B: B A & B: 1 A: ~B B: B A | B: ~1 A: ~B B: B A ^ B: ~2 A: B B: ~B A & B: 1 A: B B: ~B A | B: ~1 A: B B: ~B A ^ B: ~2 A: ~B B: ~B A & B: ~B A: ~B B: ~B A | B: ~B A: ~B B: ~B A ^ B: 0 A: B B: 16 A & B: 2 A: B B: 16 A | B: 1F A: B B: 16 A ^ B: 1D A: ~B B: 16 A & B: 14 A: ~B B: 16 A | B: ~9 A: ~B B: 16 A ^ B: ~1D A: B B: ~16 A & B: A A: B B: ~16 A | B: ~15 A: B B: ~16 A ^ B: ~1F A: ~B B: ~16 A & B: ~20 A: ~B B: ~16 A | B: ~1 A: ~B B: ~16 A ^ B: 1F A: B B: 79 A & B: 9 A: B B: 79 A | B: 7B A: B B: 79 A ^ B: 72 A: ~B B: 79 A & B: 71 A: ~B B: 79 A | B: ~3 A: ~B B: 79 A ^ B: ~74 A: B B: ~79 A & B: 3 A: B B: ~79 A | B: ~71 A: B B: ~79 A ^ B: ~74 A: ~B B: ~79 A & B: ~7B A: ~B B: ~79 A | B: ~9 A: ~B B: ~79 A ^ B: 72 A: B B: F2 A & B: 2 A: B B: F2 A | B: FB A: B B: F2 A ^ B: F9 A: ~B B: F2 A & B: F0 A: ~B B: F2 A | B: ~9 A: ~B B: F2 A ^ B: ~F9 A: B B: ~F2 A & B: A A: B B: ~F2 A | B: ~F1 A: B B: ~F2 A ^ B: ~FB A: ~B B: ~F2 A & B: ~FC A: ~B B: ~F2 A | B: ~1 A: ~B B: ~F2 A ^ B: FB A: B ! A: ~C A: ~B ! A: A A: ~B A ~>> 0: ~B A: ~B A ~>> 1: ~6 A: ~B A ~>> 2: ~3 A: ~B A ~>> F: ~1 A: ~B A ~>> 10: ~1 A: ~B A ~>> 11: ~1 A: ~B A ~>> 12: ~1 A: ~B A << 0: ~B A: ~B A << 1: ~16 A: ~B A << 2: ~2C A: ~B A << F: ~58000 A: ~B A << 10: ~B0000 A: ~B A << 11: ~160000 A: ~B A << 12: ~2C0000 A: 79 B: 79 A & B: 79 A: 79 B: 79 A | B: 79 A: 79 B: 79 A ^ B: 0 A: ~79 B: 79 A & B: 1 A: ~79 B: 79 A | B: ~1 A: ~79 B: 79 A ^ B: ~2 A: 79 B: ~79 A & B: 1 A: 79 B: ~79 A | B: ~1 A: 79 B: ~79 A ^ B: ~2 A: ~79 B: ~79 A & B: ~79 A: ~79 B: ~79 A | B: ~79 A: ~79 B: ~79 A ^ B: 0 A: 79 B: F2 A & B: 70 A: 79 B: F2 A | B: FB A: 79 B: F2 A ^ B: 8B A: ~79 B: F2 A & B: 82 A: ~79 B: F2 A | B: ~9 A: ~79 B: F2 A ^ B: ~8B A: 79 B: ~F2 A & B: 8 A: 79 B: ~F2 A | B: ~81 A: 79 B: ~F2 A ^ B: ~89 A: ~79 B: ~F2 A & B: ~FA A: ~79 B: ~F2 A | B: ~71 A: ~79 B: ~F2 A ^ B: 89 A: 79 B: 533 A & B: 31 A: 79 B: 533 A | B: 57B A: 79 B: 533 A ^ B: 54A A: ~79 B: 533 A & B: 503 A: ~79 B: 533 A | B: ~49 A: ~79 B: 533 A ^ B: ~54C A: 79 B: ~533 A & B: 49 A: 79 B: ~533 A | B: ~503 A: 79 B: ~533 A ^ B: ~54C A: ~79 B: ~533 A & B: ~57B A: ~79 B: ~533 A | B: ~31 A: ~79 B: ~533 A ^ B: 54A A: 79 B: A66 A & B: 60 A: 79 B: A66 A | B: A7F A: 79 B: A66 A ^ B: A1F A: ~79 B: A66 A & B: A06 A: ~79 B: A66 A | B: ~19 A: ~79 B: A66 A ^ B: ~A1F A: 79 B: ~A66 A & B: 18 A: 79 B: ~A66 A | B: ~A05 A: 79 B: ~A66 A ^ B: ~A1D A: ~79 B: ~A66 A & B: ~A7E A: ~79 B: ~A66 A | B: ~61 A: ~79 B: ~A66 A ^ B: A1D A: 79 ! A: ~7A A: ~79 ! A: 78 A: ~79 A ~>> 0: ~79 A: ~79 A ~>> 1: ~3D A: ~79 A ~>> 2: ~1F A: ~79 A ~>> F: ~1 A: ~79 A ~>> 10: ~1 A: ~79 A ~>> 11: ~1 A: ~79 A ~>> 12: ~1 A: ~79 A << 0: ~79 A: ~79 A << 1: ~F2 A: ~79 A << 2: ~1E4 A: ~79 A << F: ~3C8000 A: ~79 A << 10: ~790000 A: ~79 A << 11: ~F20000 A: ~79 A << 12: ~1E40000 A: 533 B: 533 A & B: 533 A: 533 B: 533 A | B: 533 A: 533 B: 533 A ^ B: 0 A: ~533 B: 533 A & B: 1 A: ~533 B: 533 A | B: ~1 A: ~533 B: 533 A ^ B: ~2 A: 533 B: ~533 A & B: 1 A: 533 B: ~533 A | B: ~1 A: 533 B: ~533 A ^ B: ~2 A: ~533 B: ~533 A & B: ~533 A: ~533 B: ~533 A | B: ~533 A: ~533 B: ~533 A ^ B: 0 A: 533 B: A66 A & B: 22 A: 533 B: A66 A | B: F77 A: 533 B: A66 A ^ B: F55 A: ~533 B: A66 A & B: A44 A: ~533 B: A66 A | B: ~511 A: ~533 B: A66 A ^ B: ~F55 A: 533 B: ~A66 A & B: 512 A: 533 B: ~A66 A | B: ~A45 A: 533 B: ~A66 A ^ B: ~F57 A: ~533 B: ~A66 A & B: ~F78 A: ~533 B: ~A66 A | B: ~21 A: ~533 B: ~A66 A ^ B: F57 A: 533 B: 3931 A & B: 131 A: 533 B: 3931 A | B: 3D33 A: 533 B: 3931 A ^ B: 3C02 A: ~533 B: 3931 A & B: 3801 A: ~533 B: 3931 A | B: ~403 A: ~533 B: 3931 A ^ B: ~3C04 A: 533 B: ~3931 A & B: 403 A: 533 B: ~3931 A | B: ~3801 A: 533 B: ~3931 A ^ B: ~3C04 A: ~533 B: ~3931 A & B: ~3D33 A: ~533 B: ~3931 A | B: ~131 A: ~533 B: ~3931 A ^ B: 3C02 A: 533 B: 7262 A & B: 22 A: 533 B: 7262 A | B: 7773 A: 533 B: 7262 A ^ B: 7751 A: ~533 B: 7262 A & B: 7240 A: ~533 B: 7262 A | B: ~511 A: ~533 B: 7262 A ^ B: ~7751 A: 533 B: ~7262 A & B: 512 A: 533 B: ~7262 A | B: ~7241 A: 533 B: ~7262 A ^ B: ~7753 A: ~533 B: ~7262 A & B: ~7774 A: ~533 B: ~7262 A | B: ~21 A: ~533 B: ~7262 A ^ B: 7753 A: 533 ! A: ~534 A: ~533 ! A: 532 A: ~533 A ~>> 0: ~533 A: ~533 A ~>> 1: ~29A A: ~533 A ~>> 2: ~14D A: ~533 A ~>> F: ~1 A: ~533 A ~>> 10: ~1 A: ~533 A ~>> 11: ~1 A: ~533 A ~>> 12: ~1 A: ~533 A << 0: ~533 A: ~533 A << 1: ~A66 A: ~533 A << 2: ~14CC A: ~533 A << F: ~2998000 A: ~533 A << 10: ~5330000 A: ~533 A << 11: ~A660000 A: ~533 A << 12: ~14CC0000 A: 2 B: 2 A & B: 2 A: 2 B: 2 A | B: 2 A: 2 B: 2 A ^ B: 0 A: ~2 B: 2 A & B: 2 A: ~2 B: 2 A | B: ~2 A: ~2 B: 2 A ^ B: ~4 A: 2 B: ~2 A & B: 2 A: 2 B: ~2 A | B: ~2 A: 2 B: ~2 A ^ B: ~4 A: ~2 B: ~2 A & B: ~2 A: ~2 B: ~2 A | B: ~2 A: ~2 B: ~2 A ^ B: 0 A: 2 B: 3 A & B: 2 A: 2 B: 3 A | B: 3 A: 2 B: 3 A ^ B: 1 A: ~2 B: 3 A & B: 2 A: ~2 B: 3 A | B: ~1 A: ~2 B: 3 A ^ B: ~3 A: 2 B: ~3 A & B: 0 A: 2 B: ~3 A | B: ~1 A: 2 B: ~3 A ^ B: ~1 A: ~2 B: ~3 A & B: ~4 A: ~2 B: ~3 A | B: ~1 A: ~2 B: ~3 A ^ B: 3 A: 2 B: 16 A & B: 2 A: 2 B: 16 A | B: 16 A: 2 B: 16 A ^ B: 14 A: ~2 B: 16 A & B: 16 A: ~2 B: 16 A | B: ~2 A: ~2 B: 16 A ^ B: ~18 A: 2 B: ~16 A & B: 2 A: 2 B: ~16 A | B: ~16 A: 2 B: ~16 A ^ B: ~18 A: ~2 B: ~16 A & B: ~16 A: ~2 B: ~16 A | B: ~2 A: ~2 B: ~16 A ^ B: 14 A: 2 B: 21 A & B: 0 A: 2 B: 21 A | B: 23 A: 2 B: 21 A ^ B: 23 A: ~2 B: 21 A & B: 20 A: ~2 B: 21 A | B: ~1 A: ~2 B: 21 A ^ B: ~21 A: 2 B: ~21 A & B: 2 A: 2 B: ~21 A | B: ~21 A: 2 B: ~21 A ^ B: ~23 A: ~2 B: ~21 A & B: ~22 A: ~2 B: ~21 A | B: ~1 A: ~2 B: ~21 A ^ B: 21 A: 2 ! A: ~3 A: ~2 ! A: 1 A: ~2 A ~>> 0: ~2 A: ~2 A ~>> 1: ~1 A: ~2 A ~>> 2: ~1 A: ~2 A ~>> F: ~1 A: ~2 A ~>> 10: ~1 A: ~2 A ~>> 11: ~1 A: ~2 A ~>> 12: ~1 A: ~2 A << 0: ~2 A: ~2 A << 1: ~4 A: ~2 A << 2: ~8 A: ~2 A << F: ~10000 A: ~2 A << 10: ~20000 A: ~2 A << 11: ~40000 A: ~2 A << 12: ~80000 A: 16 B: 16 A & B: 16 A: 16 B: 16 A | B: 16 A: 16 B: 16 A ^ B: 0 A: ~16 B: 16 A & B: 2 A: ~16 B: 16 A | B: ~2 A: ~16 B: 16 A ^ B: ~4 A: 16 B: ~16 A & B: 2 A: 16 B: ~16 A | B: ~2 A: 16 B: ~16 A ^ B: ~4 A: ~16 B: ~16 A & B: ~16 A: ~16 B: ~16 A | B: ~16 A: ~16 B: ~16 A ^ B: 0 A: 16 B: 21 A & B: 0 A: 16 B: 21 A | B: 37 A: 16 B: 21 A ^ B: 37 A: ~16 B: 21 A & B: 20 A: ~16 B: 21 A | B: ~15 A: ~16 B: 21 A ^ B: ~35 A: 16 B: ~21 A & B: 16 A: 16 B: ~21 A | B: ~21 A: 16 B: ~21 A ^ B: ~37 A: ~16 B: ~21 A & B: ~36 A: ~16 B: ~21 A | B: ~1 A: ~16 B: ~21 A ^ B: 35 A: 16 B: F2 A & B: 12 A: 16 B: F2 A | B: F6 A: 16 B: F2 A ^ B: E4 A: ~16 B: F2 A & B: E2 A: ~16 B: F2 A | B: ~6 A: ~16 B: F2 A ^ B: ~E8 A: 16 B: ~F2 A & B: 6 A: 16 B: ~F2 A | B: ~E2 A: 16 B: ~F2 A ^ B: ~E8 A: ~16 B: ~F2 A & B: ~F6 A: ~16 B: ~F2 A | B: ~12 A: ~16 B: ~F2 A ^ B: E4 A: 16 B: 16B A & B: 2 A: 16 B: 16B A | B: 17F A: 16 B: 16B A ^ B: 17D A: ~16 B: 16B A & B: 16A A: ~16 B: 16B A | B: ~15 A: ~16 B: 16B A ^ B: ~17F A: 16 B: ~16B A & B: 14 A: 16 B: ~16B A | B: ~169 A: 16 B: ~16B A ^ B: ~17D A: ~16 B: ~16B A & B: ~180 A: ~16 B: ~16B A | B: ~1 A: ~16 B: ~16B A ^ B: 17F A: 16 ! A: ~17 A: ~16 ! A: 15 A: ~16 A ~>> 0: ~16 A: ~16 A ~>> 1: ~B A: ~16 A ~>> 2: ~6 A: ~16 A ~>> F: ~1 A: ~16 A ~>> 10: ~1 A: ~16 A ~>> 11: ~1 A: ~16 A ~>> 12: ~1 A: ~16 A << 0: ~16 A: ~16 A << 1: ~2C A: ~16 A << 2: ~58 A: ~16 A << F: ~B0000 A: ~16 A << 10: ~160000 A: ~16 A << 11: ~2C0000 A: ~16 A << 12: ~580000 A: F2 B: F2 A & B: F2 A: F2 B: F2 A | B: F2 A: F2 B: F2 A ^ B: 0 A: ~F2 B: F2 A & B: 2 A: ~F2 B: F2 A | B: ~2 A: ~F2 B: F2 A ^ B: ~4 A: F2 B: ~F2 A & B: 2 A: F2 B: ~F2 A | B: ~2 A: F2 B: ~F2 A ^ B: ~4 A: ~F2 B: ~F2 A & B: ~F2 A: ~F2 B: ~F2 A | B: ~F2 A: ~F2 B: ~F2 A ^ B: 0 A: F2 B: 16B A & B: 62 A: F2 B: 16B A | B: 1FB A: F2 B: 16B A ^ B: 199 A: ~F2 B: 16B A & B: 10A A: ~F2 B: 16B A | B: ~91 A: ~F2 B: 16B A ^ B: ~19B A: F2 B: ~16B A & B: 90 A: F2 B: ~16B A | B: ~109 A: F2 B: ~16B A ^ B: ~199 A: ~F2 B: ~16B A & B: ~1FC A: ~F2 B: ~16B A | B: ~61 A: ~F2 B: ~16B A ^ B: 19B A: F2 B: A66 A & B: 62 A: F2 B: A66 A | B: AF6 A: F2 B: A66 A ^ B: A94 A: ~F2 B: A66 A & B: A06 A: ~F2 B: A66 A | B: ~92 A: ~F2 B: A66 A ^ B: ~A98 A: F2 B: ~A66 A & B: 92 A: F2 B: ~A66 A | B: ~A06 A: F2 B: ~A66 A ^ B: ~A98 A: ~F2 B: ~A66 A & B: ~AF6 A: ~F2 B: ~A66 A | B: ~62 A: ~F2 B: ~A66 A ^ B: A94 A: F2 B: F99 A & B: 90 A: F2 B: F99 A | B: FFB A: F2 B: F99 A ^ B: F6B A: ~F2 B: F99 A & B: F08 A: ~F2 B: F99 A | B: ~61 A: ~F2 B: F99 A ^ B: ~F69 A: F2 B: ~F99 A & B: 62 A: F2 B: ~F99 A | B: ~F09 A: F2 B: ~F99 A ^ B: ~F6B A: ~F2 B: ~F99 A & B: ~FFA A: ~F2 B: ~F99 A | B: ~91 A: ~F2 B: ~F99 A ^ B: F69 A: F2 ! A: ~F3 A: ~F2 ! A: F1 A: ~F2 A ~>> 0: ~F2 A: ~F2 A ~>> 1: ~79 A: ~F2 A ~>> 2: ~3D A: ~F2 A ~>> F: ~1 A: ~F2 A ~>> 10: ~1 A: ~F2 A ~>> 11: ~1 A: ~F2 A ~>> 12: ~1 A: ~F2 A << 0: ~F2 A: ~F2 A << 1: ~1E4 A: ~F2 A << 2: ~3C8 A: ~F2 A << F: ~790000 A: ~F2 A << 10: ~F20000 A: ~F2 A << 11: ~1E40000 A: ~F2 A << 12: ~3C80000 A: A66 B: A66 A & B: A66 A: A66 B: A66 A | B: A66 A: A66 B: A66 A ^ B: 0 A: ~A66 B: A66 A & B: 2 A: ~A66 B: A66 A | B: ~2 A: ~A66 B: A66 A ^ B: ~4 A: A66 B: ~A66 A & B: 2 A: A66 B: ~A66 A | B: ~2 A: A66 B: ~A66 A ^ B: ~4 A: ~A66 B: ~A66 A & B: ~A66 A: ~A66 B: ~A66 A | B: ~A66 A: ~A66 B: ~A66 A ^ B: 0 A: A66 B: F99 A & B: A00 A: A66 B: F99 A | B: FFF A: A66 B: F99 A ^ B: 5FF A: ~A66 B: F99 A & B: 598 A: ~A66 B: F99 A | B: ~65 A: ~A66 B: F99 A ^ B: ~5FD A: A66 B: ~F99 A & B: 66 A: A66 B: ~F99 A | B: ~599 A: A66 B: ~F99 A ^ B: ~5FF A: ~A66 B: ~F99 A & B: ~FFE A: ~A66 B: ~F99 A | B: ~A01 A: ~A66 B: ~F99 A ^ B: 5FD A: A66 B: 7262 A & B: 262 A: A66 B: 7262 A | B: 7A66 A: A66 B: 7262 A ^ B: 7804 A: ~A66 B: 7262 A & B: 7002 A: ~A66 B: 7262 A | B: ~806 A: ~A66 B: 7262 A ^ B: ~7808 A: A66 B: ~7262 A & B: 806 A: A66 B: ~7262 A | B: ~7002 A: A66 B: ~7262 A ^ B: ~7808 A: ~A66 B: ~7262 A & B: ~7A66 A: ~A66 B: ~7262 A | B: ~262 A: ~A66 B: ~7262 A ^ B: 7804 A: A66 B: AB93 A & B: A02 A: A66 B: AB93 A | B: ABF7 A: A66 B: AB93 A ^ B: A1F5 A: ~A66 B: AB93 A & B: A192 A: ~A66 B: AB93 A | B: ~65 A: ~A66 B: AB93 A ^ B: ~A1F7 A: A66 B: ~AB93 A & B: 64 A: A66 B: ~AB93 A | B: ~A191 A: A66 B: ~AB93 A ^ B: ~A1F5 A: ~A66 B: ~AB93 A & B: ~ABF8 A: ~A66 B: ~AB93 A | B: ~A01 A: ~A66 B: ~AB93 A ^ B: A1F7 A: A66 ! A: ~A67 A: ~A66 ! A: A65 A: ~A66 A ~>> 0: ~A66 A: ~A66 A ~>> 1: ~533 A: ~A66 A ~>> 2: ~29A A: ~A66 A ~>> F: ~1 A: ~A66 A ~>> 10: ~1 A: ~A66 A ~>> 11: ~1 A: ~A66 A ~>> 12: ~1 A: ~A66 A << 0: ~A66 A: ~A66 A << 1: ~14CC A: ~A66 A << 2: ~2998 A: ~A66 A << F: ~5330000 A: ~A66 A << 10: ~A660000 A: ~A66 A << 11: ~14CC0000 A: ~A66 A << 12: ~29980000 A: 3 B: 3 A & B: 3 A: 3 B: 3 A | B: 3 A: 3 B: 3 A ^ B: 0 A: ~3 B: 3 A & B: 1 A: ~3 B: 3 A | B: ~1 A: ~3 B: 3 A ^ B: ~2 A: 3 B: ~3 A & B: 1 A: 3 B: ~3 A | B: ~1 A: 3 B: ~3 A ^ B: ~2 A: ~3 B: ~3 A & B: ~3 A: ~3 B: ~3 A | B: ~3 A: ~3 B: ~3 A ^ B: 0 A: 3 B: 4 A & B: 0 A: 3 B: 4 A | B: 7 A: 3 B: 4 A ^ B: 7 A: ~3 B: 4 A & B: 4 A: ~3 B: 4 A | B: ~3 A: ~3 B: 4 A ^ B: ~7 A: 3 B: ~4 A & B: 0 A: 3 B: ~4 A | B: ~1 A: 3 B: ~4 A ^ B: ~1 A: ~3 B: ~4 A & B: ~4 A: ~3 B: ~4 A | B: ~3 A: ~3 B: ~4 A ^ B: 1 A: 3 B: 21 A & B: 1 A: 3 B: 21 A | B: 23 A: 3 B: 21 A ^ B: 22 A: ~3 B: 21 A & B: 21 A: ~3 B: 21 A | B: ~3 A: ~3 B: 21 A ^ B: ~24 A: 3 B: ~21 A & B: 3 A: 3 B: ~21 A | B: ~21 A: 3 B: ~21 A ^ B: ~24 A: ~3 B: ~21 A & B: ~23 A: ~3 B: ~21 A | B: ~1 A: ~3 B: ~21 A ^ B: 22 A: 3 B: 2C A & B: 0 A: 3 B: 2C A | B: 2F A: 3 B: 2C A ^ B: 2F A: ~3 B: 2C A & B: 2C A: ~3 B: 2C A | B: ~3 A: ~3 B: 2C A ^ B: ~2F A: 3 B: ~2C A & B: 0 A: 3 B: ~2C A | B: ~29 A: 3 B: ~2C A ^ B: ~29 A: ~3 B: ~2C A & B: ~2C A: ~3 B: ~2C A | B: ~3 A: ~3 B: ~2C A ^ B: 29 A: 3 ! A: ~4 A: ~3 ! A: 2 A: ~3 A ~>> 0: ~3 A: ~3 A ~>> 1: ~2 A: ~3 A ~>> 2: ~1 A: ~3 A ~>> F: ~1 A: ~3 A ~>> 10: ~1 A: ~3 A ~>> 11: ~1 A: ~3 A ~>> 12: ~1 A: ~3 A << 0: ~3 A: ~3 A << 1: ~6 A: ~3 A << 2: ~C A: ~3 A << F: ~18000 A: ~3 A << 10: ~30000 A: ~3 A << 11: ~60000 A: ~3 A << 12: ~C0000 A: 21 B: 21 A & B: 21 A: 21 B: 21 A | B: 21 A: 21 B: 21 A ^ B: 0 A: ~21 B: 21 A & B: 1 A: ~21 B: 21 A | B: ~1 A: ~21 B: 21 A ^ B: ~2 A: 21 B: ~21 A & B: 1 A: 21 B: ~21 A | B: ~1 A: 21 B: ~21 A ^ B: ~2 A: ~21 B: ~21 A & B: ~21 A: ~21 B: ~21 A | B: ~21 A: ~21 B: ~21 A ^ B: 0 A: 21 B: 2C A & B: 20 A: 21 B: 2C A | B: 2D A: 21 B: 2C A ^ B: D A: ~21 B: 2C A & B: C A: ~21 B: 2C A | B: ~1 A: ~21 B: 2C A ^ B: ~D A: 21 B: ~2C A & B: 0 A: 21 B: ~2C A | B: ~B A: 21 B: ~2C A ^ B: ~B A: ~21 B: ~2C A & B: ~2C A: ~21 B: ~2C A | B: ~21 A: ~21 B: ~2C A ^ B: B A: 21 B: 16B A & B: 21 A: 21 B: 16B A | B: 16B A: 21 B: 16B A ^ B: 14A A: ~21 B: 16B A & B: 14B A: ~21 B: 16B A | B: ~1 A: ~21 B: 16B A ^ B: ~14C A: 21 B: ~16B A & B: 1 A: 21 B: ~16B A | B: ~14B A: 21 B: ~16B A ^ B: ~14C A: ~21 B: ~16B A & B: ~16B A: ~21 B: ~16B A | B: ~21 A: ~21 B: ~16B A ^ B: 14A A: 21 B: 1E4 A & B: 20 A: 21 B: 1E4 A | B: 1E5 A: 21 B: 1E4 A ^ B: 1C5 A: ~21 B: 1E4 A & B: 1C4 A: ~21 B: 1E4 A | B: ~1 A: ~21 B: 1E4 A ^ B: ~1C5 A: 21 B: ~1E4 A & B: 0 A: 21 B: ~1E4 A | B: ~1C3 A: 21 B: ~1E4 A ^ B: ~1C3 A: ~21 B: ~1E4 A & B: ~1E4 A: ~21 B: ~1E4 A | B: ~21 A: ~21 B: ~1E4 A ^ B: 1C3 A: 21 ! A: ~22 A: ~21 ! A: 20 A: ~21 A ~>> 0: ~21 A: ~21 A ~>> 1: ~11 A: ~21 A ~>> 2: ~9 A: ~21 A ~>> F: ~1 A: ~21 A ~>> 10: ~1 A: ~21 A ~>> 11: ~1 A: ~21 A ~>> 12: ~1 A: ~21 A << 0: ~21 A: ~21 A << 1: ~42 A: ~21 A << 2: ~84 A: ~21 A << F: ~108000 A: ~21 A << 10: ~210000 A: ~21 A << 11: ~420000 A: ~21 A << 12: ~840000 A: 16B B: 16B A & B: 16B A: 16B B: 16B A | B: 16B A: 16B B: 16B A ^ B: 0 A: ~16B B: 16B A & B: 1 A: ~16B B: 16B A | B: ~1 A: ~16B B: 16B A ^ B: ~2 A: 16B B: ~16B A & B: 1 A: 16B B: ~16B A | B: ~1 A: 16B B: ~16B A ^ B: ~2 A: ~16B B: ~16B A & B: ~16B A: ~16B B: ~16B A | B: ~16B A: ~16B B: ~16B A ^ B: 0 A: 16B B: 1E4 A & B: 160 A: 16B B: 1E4 A | B: 1EF A: 16B B: 1E4 A ^ B: 8F A: ~16B B: 1E4 A & B: 84 A: ~16B B: 1E4 A | B: ~B A: ~16B B: 1E4 A ^ B: ~8F A: 16B B: ~1E4 A & B: 8 A: 16B B: ~1E4 A | B: ~81 A: 16B B: ~1E4 A ^ B: ~89 A: ~16B B: ~1E4 A & B: ~1EC A: ~16B B: ~1E4 A | B: ~163 A: ~16B B: ~1E4 A ^ B: 89 A: 16B B: F99 A & B: 109 A: 16B B: F99 A | B: FFB A: 16B B: F99 A ^ B: EF2 A: ~16B B: F99 A & B: E91 A: ~16B B: F99 A | B: ~63 A: ~16B B: F99 A ^ B: ~EF4 A: 16B B: ~F99 A & B: 63 A: 16B B: ~F99 A | B: ~E91 A: 16B B: ~F99 A ^ B: ~EF4 A: ~16B B: ~F99 A & B: ~FFB A: ~16B B: ~F99 A | B: ~109 A: ~16B B: ~F99 A ^ B: EF2 A: 16B B: 14CC A & B: 48 A: 16B B: 14CC A | B: 15EF A: 16B B: 14CC A ^ B: 15A7 A: ~16B B: 14CC A & B: 1484 A: ~16B B: 14CC A | B: ~123 A: ~16B B: 14CC A ^ B: ~15A7 A: 16B B: ~14CC A & B: 120 A: 16B B: ~14CC A | B: ~1481 A: 16B B: ~14CC A ^ B: ~15A1 A: ~16B B: ~14CC A & B: ~15EC A: ~16B B: ~14CC A | B: ~4B A: ~16B B: ~14CC A ^ B: 15A1 A: 16B ! A: ~16C A: ~16B ! A: 16A A: ~16B A ~>> 0: ~16B A: ~16B A ~>> 1: ~B6 A: ~16B A ~>> 2: ~5B A: ~16B A ~>> F: ~1 A: ~16B A ~>> 10: ~1 A: ~16B A ~>> 11: ~1 A: ~16B A ~>> 12: ~1 A: ~16B A << 0: ~16B A: ~16B A << 1: ~2D6 A: ~16B A << 2: ~5AC A: ~16B A << F: ~B58000 A: ~16B A << 10: ~16B0000 A: ~16B A << 11: ~2D60000 A: ~16B A << 12: ~5AC0000 A: F99 B: F99 A & B: F99 A: F99 B: F99 A | B: F99 A: F99 B: F99 A ^ B: 0 A: ~F99 B: F99 A & B: 1 A: ~F99 B: F99 A | B: ~1 A: ~F99 B: F99 A ^ B: ~2 A: F99 B: ~F99 A & B: 1 A: F99 B: ~F99 A | B: ~1 A: F99 B: ~F99 A ^ B: ~2 A: ~F99 B: ~F99 A & B: ~F99 A: ~F99 B: ~F99 A | B: ~F99 A: ~F99 B: ~F99 A ^ B: 0 A: F99 B: 14CC A & B: 488 A: F99 B: 14CC A | B: 1FDD A: F99 B: 14CC A ^ B: 1B55 A: ~F99 B: 14CC A & B: 1044 A: ~F99 B: 14CC A | B: ~B11 A: ~F99 B: 14CC A ^ B: ~1B55 A: F99 B: ~14CC A & B: B10 A: F99 B: ~14CC A | B: ~1043 A: F99 B: ~14CC A ^ B: ~1B53 A: ~F99 B: ~14CC A & B: ~1FDC A: ~F99 B: ~14CC A | B: ~489 A: ~F99 B: ~14CC A ^ B: 1B53 A: F99 B: AB93 A & B: B91 A: F99 B: AB93 A | B: AF9B A: F99 B: AB93 A ^ B: A40A A: ~F99 B: AB93 A & B: A003 A: ~F99 B: AB93 A | B: ~409 A: ~F99 B: AB93 A ^ B: ~A40C A: F99 B: ~AB93 A & B: 409 A: F99 B: ~AB93 A | B: ~A003 A: F99 B: ~AB93 A ^ B: ~A40C A: ~F99 B: ~AB93 A & B: ~AF9B A: ~F99 B: ~AB93 A | B: ~B91 A: ~F99 B: ~AB93 A ^ B: A40A A: F99 B: E4C4 A & B: 480 A: F99 B: E4C4 A | B: EFDD A: F99 B: E4C4 A ^ B: EB5D A: ~F99 B: E4C4 A & B: E044 A: ~F99 B: E4C4 A | B: ~B19 A: ~F99 B: E4C4 A ^ B: ~EB5D A: F99 B: ~E4C4 A & B: B18 A: F99 B: ~E4C4 A | B: ~E043 A: F99 B: ~E4C4 A ^ B: ~EB5B A: ~F99 B: ~E4C4 A & B: ~EFDC A: ~F99 B: ~E4C4 A | B: ~481 A: ~F99 B: ~E4C4 A ^ B: EB5B A: F99 ! A: ~F9A A: ~F99 ! A: F98 A: ~F99 A ~>> 0: ~F99 A: ~F99 A ~>> 1: ~7CD A: ~F99 A ~>> 2: ~3E7 A: ~F99 A ~>> F: ~1 A: ~F99 A ~>> 10: ~1 A: ~F99 A ~>> 11: ~1 A: ~F99 A ~>> 12: ~1 A: ~F99 A << 0: ~F99 A: ~F99 A << 1: ~1F32 A: ~F99 A << 2: ~3E64 A: ~F99 A << F: ~7CC8000 A: ~F99 A << 10: ~F990000 A: ~F99 A << 11: ~1F320000 A: ~F99 A << 12: ~3E640000 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: CC6DB61 A & B: 0 A: 0 B: CC6DB61 A | B: CC6DB61 A: 0 B: CC6DB61 A ^ B: CC6DB61 A: 0 B: CC6DB61 A & B: 0 A: 0 B: CC6DB61 A | B: CC6DB61 A: 0 B: CC6DB61 A ^ B: CC6DB61 A: 0 B: ~CC6DB61 A & B: 0 A: 0 B: ~CC6DB61 A | B: ~CC6DB61 A: 0 B: ~CC6DB61 A ^ B: ~CC6DB61 A: 0 B: ~CC6DB61 A & B: 0 A: 0 B: ~CC6DB61 A | B: ~CC6DB61 A: 0 B: ~CC6DB61 A ^ B: ~CC6DB61 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 8C8B6D2B A & B: 0 A: 0 B: 8C8B6D2B A | B: 8C8B6D2B A: 0 B: 8C8B6D2B A ^ B: 8C8B6D2B A: 0 B: 8C8B6D2B A & B: 0 A: 0 B: 8C8B6D2B A | B: 8C8B6D2B A: 0 B: 8C8B6D2B A ^ B: 8C8B6D2B A: 0 B: ~8C8B6D2B A & B: 0 A: 0 B: ~8C8B6D2B A | B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A ^ B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A & B: 0 A: 0 B: ~8C8B6D2B A | B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A ^ B: ~8C8B6D2B A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 8C8B6D2B A & B: 0 A: 0 B: 8C8B6D2B A | B: 8C8B6D2B A: 0 B: 8C8B6D2B A ^ B: 8C8B6D2B A: 0 B: 8C8B6D2B A & B: 0 A: 0 B: 8C8B6D2B A | B: 8C8B6D2B A: 0 B: 8C8B6D2B A ^ B: 8C8B6D2B A: 0 B: ~8C8B6D2B A & B: 0 A: 0 B: ~8C8B6D2B A | B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A ^ B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A & B: 0 A: 0 B: ~8C8B6D2B A | B: ~8C8B6D2B A: 0 B: ~8C8B6D2B A ^ B: ~8C8B6D2B A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 609FDB0D9 A & B: 0 A: 0 B: 609FDB0D9 A | B: 609FDB0D9 A: 0 B: 609FDB0D9 A ^ B: 609FDB0D9 A: 0 B: 609FDB0D9 A & B: 0 A: 0 B: 609FDB0D9 A | B: 609FDB0D9 A: 0 B: 609FDB0D9 A ^ B: 609FDB0D9 A: 0 B: ~609FDB0D9 A & B: 0 A: 0 B: ~609FDB0D9 A | B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A ^ B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A & B: 0 A: 0 B: ~609FDB0D9 A | B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A ^ B: ~609FDB0D9 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 609FDB0D9 A & B: 0 A: 0 B: 609FDB0D9 A | B: 609FDB0D9 A: 0 B: 609FDB0D9 A ^ B: 609FDB0D9 A: 0 B: 609FDB0D9 A & B: 0 A: 0 B: 609FDB0D9 A | B: 609FDB0D9 A: 0 B: 609FDB0D9 A ^ B: 609FDB0D9 A: 0 B: ~609FDB0D9 A & B: 0 A: 0 B: ~609FDB0D9 A | B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A ^ B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A & B: 0 A: 0 B: ~609FDB0D9 A | B: ~609FDB0D9 A: 0 B: ~609FDB0D9 A ^ B: ~609FDB0D9 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 426DE69953 A & B: 0 A: 0 B: 426DE69953 A | B: 426DE69953 A: 0 B: 426DE69953 A ^ B: 426DE69953 A: 0 B: 426DE69953 A & B: 0 A: 0 B: 426DE69953 A | B: 426DE69953 A: 0 B: 426DE69953 A ^ B: 426DE69953 A: 0 B: ~426DE69953 A & B: 0 A: 0 B: ~426DE69953 A | B: ~426DE69953 A: 0 B: ~426DE69953 A ^ B: ~426DE69953 A: 0 B: ~426DE69953 A & B: 0 A: 0 B: ~426DE69953 A | B: ~426DE69953 A: 0 B: ~426DE69953 A ^ B: ~426DE69953 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: CC6DB61 B: CC6DB61 A & B: CC6DB61 A: CC6DB61 B: CC6DB61 A | B: CC6DB61 A: CC6DB61 B: CC6DB61 A ^ B: 0 A: ~CC6DB61 B: CC6DB61 A & B: 1 A: ~CC6DB61 B: CC6DB61 A | B: ~1 A: ~CC6DB61 B: CC6DB61 A ^ B: ~2 A: CC6DB61 B: ~CC6DB61 A & B: 1 A: CC6DB61 B: ~CC6DB61 A | B: ~1 A: CC6DB61 B: ~CC6DB61 A ^ B: ~2 A: ~CC6DB61 B: ~CC6DB61 A & B: ~CC6DB61 A: ~CC6DB61 B: ~CC6DB61 A | B: ~CC6DB61 A: ~CC6DB61 B: ~CC6DB61 A ^ B: 0 A: CC6DB61 B: 198DB6C2 A & B: 8849240 A: CC6DB61 B: 198DB6C2 A | B: 1DCFFFE3 A: CC6DB61 B: 198DB6C2 A ^ B: 154B6DA3 A: ~CC6DB61 B: 198DB6C2 A & B: 11092482 A: ~CC6DB61 B: 198DB6C2 A | B: ~4424921 A: ~CC6DB61 B: 198DB6C2 A ^ B: ~154B6DA3 A: CC6DB61 B: ~198DB6C2 A & B: 4424920 A: CC6DB61 B: ~198DB6C2 A | B: ~11092481 A: CC6DB61 B: ~198DB6C2 A ^ B: ~154B6DA1 A: ~CC6DB61 B: ~198DB6C2 A & B: ~1DCFFFE2 A: ~CC6DB61 B: ~198DB6C2 A | B: ~8849241 A: ~CC6DB61 B: ~198DB6C2 A ^ B: 154B6DA1 A: CC6DB61 B: 8C8B6D2B A & B: C824921 A: CC6DB61 B: 8C8B6D2B A | B: 8CCFFF6B A: CC6DB61 B: 8C8B6D2B A ^ B: 804DB64A A: ~CC6DB61 B: 8C8B6D2B A & B: 8009240B A: ~CC6DB61 B: 8C8B6D2B A | B: ~449241 A: ~CC6DB61 B: 8C8B6D2B A ^ B: ~804DB64C A: CC6DB61 B: ~8C8B6D2B A & B: 449241 A: CC6DB61 B: ~8C8B6D2B A | B: ~8009240B A: CC6DB61 B: ~8C8B6D2B A ^ B: ~804DB64C A: ~CC6DB61 B: ~8C8B6D2B A & B: ~8CCFFF6B A: ~CC6DB61 B: ~8C8B6D2B A | B: ~C824921 A: ~CC6DB61 B: ~8C8B6D2B A ^ B: 804DB64A A: CC6DB61 B: 11916DA56 A & B: 806DA40 A: CC6DB61 B: 11916DA56 A | B: 11DD6DB77 A: CC6DB61 B: 11916DA56 A ^ B: 115D00137 A: ~CC6DB61 B: 11916DA56 A & B: 111100016 A: ~CC6DB61 B: 11916DA56 A | B: ~4C00121 A: ~CC6DB61 B: 11916DA56 A ^ B: ~115D00137 A: CC6DB61 B: ~11916DA56 A & B: 4C00120 A: CC6DB61 B: ~11916DA56 A | B: ~111100015 A: CC6DB61 B: ~11916DA56 A ^ B: ~115D00135 A: ~CC6DB61 B: ~11916DA56 A & B: ~11DD6DB76 A: ~CC6DB61 B: ~11916DA56 A | B: ~806DA41 A: ~CC6DB61 B: ~11916DA56 A ^ B: 115D00135 A: CC6DB61 ! A: ~CC6DB62 A: ~CC6DB61 ! A: CC6DB60 A: ~CC6DB61 A ~>> 0: ~CC6DB61 A: ~CC6DB61 A ~>> 1: ~6636DB1 A: ~CC6DB61 A ~>> 2: ~331B6D9 A: ~CC6DB61 A ~>> F: ~198E A: ~CC6DB61 A ~>> 10: ~CC7 A: ~CC6DB61 A ~>> 11: ~664 A: ~CC6DB61 A ~>> 12: ~332 A: ~CC6DB61 A << 0: ~CC6DB61 A: ~CC6DB61 A << 1: ~198DB6C2 A: ~CC6DB61 A << 2: ~331B6D84 A: ~CC6DB61 A << F: ~6636DB08000 A: ~CC6DB61 A << 10: ~CC6DB610000 A: ~CC6DB61 A << 11: ~198DB6C20000 A: ~CC6DB61 A << 12: ~331B6D840000 A: 8C8B6D2B B: 8C8B6D2B A & B: 8C8B6D2B A: 8C8B6D2B B: 8C8B6D2B A | B: 8C8B6D2B A: 8C8B6D2B B: 8C8B6D2B A ^ B: 0 A: ~8C8B6D2B B: 8C8B6D2B A & B: 1 A: ~8C8B6D2B B: 8C8B6D2B A | B: ~1 A: ~8C8B6D2B B: 8C8B6D2B A ^ B: ~2 A: 8C8B6D2B B: ~8C8B6D2B A & B: 1 A: 8C8B6D2B B: ~8C8B6D2B A | B: ~1 A: 8C8B6D2B B: ~8C8B6D2B A ^ B: ~2 A: ~8C8B6D2B B: ~8C8B6D2B A & B: ~8C8B6D2B A: ~8C8B6D2B B: ~8C8B6D2B A | B: ~8C8B6D2B A: ~8C8B6D2B B: ~8C8B6D2B A ^ B: 0 A: 8C8B6D2B B: 11916DA56 A & B: 8024802 A: 8C8B6D2B B: 11916DA56 A | B: 19D9FFF7F A: 8C8B6D2B B: 11916DA56 A ^ B: 1959DB77D A: ~8C8B6D2B B: 11916DA56 A & B: 111149254 A: ~8C8B6D2B B: 11916DA56 A | B: ~84892529 A: ~8C8B6D2B B: 11916DA56 A ^ B: ~1959DB77D A: 8C8B6D2B B: ~11916DA56 A & B: 8489252A A: 8C8B6D2B B: ~11916DA56 A | B: ~111149255 A: 8C8B6D2B B: ~11916DA56 A ^ B: ~1959DB77F A: ~8C8B6D2B B: ~11916DA56 A & B: ~19D9FFF80 A: ~8C8B6D2B B: ~11916DA56 A | B: ~8024801 A: ~8C8B6D2B B: ~11916DA56 A ^ B: 1959DB77F A: 8C8B6D2B B: 609FDB0D9 A & B: 8892009 A: 8C8B6D2B B: 609FDB0D9 A | B: 68DFFFDFB A: 8C8B6D2B B: 609FDB0D9 A ^ B: 68576DDF2 A: ~8C8B6D2B B: 609FDB0D9 A & B: 6017490D1 A: ~8C8B6D2B B: 609FDB0D9 A | B: ~84024D23 A: ~8C8B6D2B B: 609FDB0D9 A ^ B: ~68576DDF4 A: 8C8B6D2B B: ~609FDB0D9 A & B: 84024D23 A: 8C8B6D2B B: ~609FDB0D9 A | B: ~6017490D1 A: 8C8B6D2B B: ~609FDB0D9 A ^ B: ~68576DDF4 A: ~8C8B6D2B B: ~609FDB0D9 A & B: ~68DFFFDFB A: ~8C8B6D2B B: ~609FDB0D9 A | B: ~8892009 A: ~8C8B6D2B B: ~609FDB0D9 A ^ B: 68576DDF2 A: 8C8B6D2B B: C13FB61B2 A & B: 8B6122 A: 8C8B6D2B B: C13FB61B2 A | B: C9FFB6DBB A: 8C8B6D2B B: C13FB61B2 A ^ B: C9F700C99 A: ~8C8B6D2B B: C13FB61B2 A & B: C13700090 A: ~8C8B6D2B B: C13FB61B2 A | B: ~8C000C09 A: ~8C8B6D2B B: C13FB61B2 A ^ B: ~C9F700C99 A: 8C8B6D2B B: ~C13FB61B2 A & B: 8C000C0A A: 8C8B6D2B B: ~C13FB61B2 A | B: ~C13700091 A: 8C8B6D2B B: ~C13FB61B2 A ^ B: ~C9F700C9B A: ~8C8B6D2B B: ~C13FB61B2 A & B: ~C9FFB6DBC A: ~8C8B6D2B B: ~C13FB61B2 A | B: ~8B6121 A: ~8C8B6D2B B: ~C13FB61B2 A ^ B: C9F700C9B A: 8C8B6D2B ! A: ~8C8B6D2C A: ~8C8B6D2B ! A: 8C8B6D2A A: ~8C8B6D2B A ~>> 0: ~8C8B6D2B A: ~8C8B6D2B A ~>> 1: ~4645B696 A: ~8C8B6D2B A ~>> 2: ~2322DB4B A: ~8C8B6D2B A ~>> F: ~11917 A: ~8C8B6D2B A ~>> 10: ~8C8C A: ~8C8B6D2B A ~>> 11: ~4646 A: ~8C8B6D2B A ~>> 12: ~2323 A: ~8C8B6D2B A << 0: ~8C8B6D2B A: ~8C8B6D2B A << 1: ~11916DA56 A: ~8C8B6D2B A << 2: ~2322DB4AC A: ~8C8B6D2B A << F: ~4645B6958000 A: ~8C8B6D2B A << 10: ~8C8B6D2B0000 A: ~8C8B6D2B A << 11: ~11916DA560000 A: ~8C8B6D2B A << 12: ~2322DB4AC0000 A: 609FDB0D9 B: 609FDB0D9 A & B: 609FDB0D9 A: 609FDB0D9 B: 609FDB0D9 A | B: 609FDB0D9 A: 609FDB0D9 B: 609FDB0D9 A ^ B: 0 A: ~609FDB0D9 B: 609FDB0D9 A & B: 1 A: ~609FDB0D9 B: 609FDB0D9 A | B: ~1 A: ~609FDB0D9 B: 609FDB0D9 A ^ B: ~2 A: 609FDB0D9 B: ~609FDB0D9 A & B: 1 A: 609FDB0D9 B: ~609FDB0D9 A | B: ~1 A: 609FDB0D9 B: ~609FDB0D9 A ^ B: ~2 A: ~609FDB0D9 B: ~609FDB0D9 A & B: ~609FDB0D9 A: ~609FDB0D9 B: ~609FDB0D9 A | B: ~609FDB0D9 A: ~609FDB0D9 B: ~609FDB0D9 A ^ B: 0 A: 609FDB0D9 B: C13FB61B2 A & B: 401F92090 A: 609FDB0D9 B: C13FB61B2 A | B: E1BFFF1FB A: 609FDB0D9 B: C13FB61B2 A ^ B: A1A06D16B A: ~609FDB0D9 B: C13FB61B2 A & B: 812024122 A: ~609FDB0D9 B: C13FB61B2 A | B: ~208049049 A: ~609FDB0D9 B: C13FB61B2 A ^ B: ~A1A06D16B A: 609FDB0D9 B: ~C13FB61B2 A & B: 208049048 A: 609FDB0D9 B: ~C13FB61B2 A | B: ~812024121 A: 609FDB0D9 B: ~C13FB61B2 A ^ B: ~A1A06D169 A: ~609FDB0D9 B: ~C13FB61B2 A & B: ~E1BFFF1FA A: ~609FDB0D9 B: ~C13FB61B2 A | B: ~401F92091 A: ~609FDB0D9 B: ~C13FB61B2 A ^ B: A1A06D169 A: 609FDB0D9 B: 426DE69953 A & B: 209E49051 A: 609FDB0D9 B: 426DE69953 A | B: 466DFFB9DB A: 609FDB0D9 B: 426DE69953 A ^ B: 44641B298A A: ~609FDB0D9 B: 426DE69953 A & B: 4064020903 A: ~609FDB0D9 B: 426DE69953 A | B: ~400192089 A: ~609FDB0D9 B: 426DE69953 A ^ B: ~44641B298C A: 609FDB0D9 B: ~426DE69953 A & B: 400192089 A: 609FDB0D9 B: ~426DE69953 A | B: ~4064020903 A: 609FDB0D9 B: ~426DE69953 A ^ B: ~44641B298C A: ~609FDB0D9 B: ~426DE69953 A & B: ~466DFFB9DB A: ~609FDB0D9 B: ~426DE69953 A | B: ~209E49051 A: ~609FDB0D9 B: ~426DE69953 A ^ B: 44641B298A A: 609FDB0D9 B: 84DBCD32A6 A & B: 409CD3080 A: 609FDB0D9 B: 84DBCD32A6 A | B: 86DBFDB2FF A: 609FDB0D9 B: 84DBCD32A6 A ^ B: 82D230827F A: ~609FDB0D9 B: 84DBCD32A6 A & B: 80D2000226 A: ~609FDB0D9 B: 84DBCD32A6 A | B: ~200308059 A: ~609FDB0D9 B: 84DBCD32A6 A ^ B: ~82D230827F A: 609FDB0D9 B: ~84DBCD32A6 A & B: 200308058 A: 609FDB0D9 B: ~84DBCD32A6 A | B: ~80D2000225 A: 609FDB0D9 B: ~84DBCD32A6 A ^ B: ~82D230827D A: ~609FDB0D9 B: ~84DBCD32A6 A & B: ~86DBFDB2FE A: ~609FDB0D9 B: ~84DBCD32A6 A | B: ~409CD3081 A: ~609FDB0D9 B: ~84DBCD32A6 A ^ B: 82D230827D A: 609FDB0D9 ! A: ~609FDB0DA A: ~609FDB0D9 ! A: 609FDB0D8 A: ~609FDB0D9 A ~>> 0: ~609FDB0D9 A: ~609FDB0D9 A ~>> 1: ~304FED86D A: ~609FDB0D9 A ~>> 2: ~1827F6C37 A: ~609FDB0D9 A ~>> F: ~C13FC A: ~609FDB0D9 A ~>> 10: ~609FE A: ~609FDB0D9 A ~>> 11: ~304FF A: ~609FDB0D9 A ~>> 12: ~18280 A: ~609FDB0D9 A << 0: ~609FDB0D9 A: ~609FDB0D9 A << 1: ~C13FB61B2 A: ~609FDB0D9 A << 2: ~1827F6C364 A: ~609FDB0D9 A << F: ~304FED86C8000 A: ~609FDB0D9 A << 10: ~609FDB0D90000 A: ~609FDB0D9 A << 11: ~C13FB61B20000 A: ~609FDB0D9 A << 12: ~1827F6C3640000 A: 198DB6C2 B: 198DB6C2 A & B: 198DB6C2 A: 198DB6C2 B: 198DB6C2 A | B: 198DB6C2 A: 198DB6C2 B: 198DB6C2 A ^ B: 0 A: ~198DB6C2 B: 198DB6C2 A & B: 2 A: ~198DB6C2 B: 198DB6C2 A | B: ~2 A: ~198DB6C2 B: 198DB6C2 A ^ B: ~4 A: 198DB6C2 B: ~198DB6C2 A & B: 2 A: 198DB6C2 B: ~198DB6C2 A | B: ~2 A: 198DB6C2 B: ~198DB6C2 A ^ B: ~4 A: ~198DB6C2 B: ~198DB6C2 A & B: ~198DB6C2 A: ~198DB6C2 B: ~198DB6C2 A | B: ~198DB6C2 A: ~198DB6C2 B: ~198DB6C2 A ^ B: 0 A: 198DB6C2 B: 26549223 A & B: 49202 A: 198DB6C2 B: 26549223 A | B: 3FDDB6E3 A: 198DB6C2 B: 26549223 A ^ B: 3FD924E1 A: ~198DB6C2 B: 26549223 A & B: 26500022 A: ~198DB6C2 B: 26549223 A | B: ~198924C1 A: ~198DB6C2 B: 26549223 A ^ B: ~3FD924E3 A: 198DB6C2 B: ~26549223 A & B: 198924C0 A: 198DB6C2 B: ~26549223 A | B: ~26500021 A: 198DB6C2 B: ~26549223 A ^ B: ~3FD924E1 A: ~198DB6C2 B: ~26549223 A & B: ~3FDDB6E4 A: ~198DB6C2 B: ~26549223 A | B: ~49201 A: ~198DB6C2 B: ~26549223 A ^ B: 3FD924E3 A: 198DB6C2 B: 11916DA56 A & B: 19049242 A: 198DB6C2 B: 11916DA56 A | B: 1199FFED6 A: 198DB6C2 B: 11916DA56 A ^ B: 1009B6C94 A: ~198DB6C2 B: 11916DA56 A & B: 100124816 A: ~198DB6C2 B: 11916DA56 A | B: ~892482 A: ~198DB6C2 B: 11916DA56 A ^ B: ~1009B6C98 A: 198DB6C2 B: ~11916DA56 A & B: 892482 A: 198DB6C2 B: ~11916DA56 A | B: ~100124816 A: 198DB6C2 B: ~11916DA56 A ^ B: ~1009B6C98 A: ~198DB6C2 B: ~11916DA56 A & B: ~1199FFED6 A: ~198DB6C2 B: ~11916DA56 A | B: ~19049242 A: ~198DB6C2 B: ~11916DA56 A ^ B: 1009B6C94 A: 198DB6C2 B: 1A5A24781 A & B: 1800680 A: 198DB6C2 B: 1A5A24781 A | B: 1BDAFF7C3 A: 198DB6C2 B: 1A5A24781 A ^ B: 1BC2FF143 A: ~198DB6C2 B: 1A5A24781 A & B: 1A4224100 A: ~198DB6C2 B: 1A5A24781 A | B: ~180DB041 A: ~198DB6C2 B: 1A5A24781 A ^ B: ~1BC2FF141 A: 198DB6C2 B: ~1A5A24781 A & B: 180DB042 A: 198DB6C2 B: ~1A5A24781 A | B: ~1A4224101 A: 198DB6C2 B: ~1A5A24781 A ^ B: ~1BC2FF143 A: ~198DB6C2 B: ~1A5A24781 A & B: ~1BDAFF7C2 A: ~198DB6C2 B: ~1A5A24781 A | B: ~1800681 A: ~198DB6C2 B: ~1A5A24781 A ^ B: 1BC2FF141 A: 198DB6C2 ! A: ~198DB6C3 A: ~198DB6C2 ! A: 198DB6C1 A: ~198DB6C2 A ~>> 0: ~198DB6C2 A: ~198DB6C2 A ~>> 1: ~CC6DB61 A: ~198DB6C2 A ~>> 2: ~6636DB1 A: ~198DB6C2 A ~>> F: ~331C A: ~198DB6C2 A ~>> 10: ~198E A: ~198DB6C2 A ~>> 11: ~CC7 A: ~198DB6C2 A ~>> 12: ~664 A: ~198DB6C2 A << 0: ~198DB6C2 A: ~198DB6C2 A << 1: ~331B6D84 A: ~198DB6C2 A << 2: ~6636DB08 A: ~198DB6C2 A << F: ~CC6DB610000 A: ~198DB6C2 A << 10: ~198DB6C20000 A: ~198DB6C2 A << 11: ~331B6D840000 A: ~198DB6C2 A << 12: ~6636DB080000 A: 11916DA56 B: 11916DA56 A & B: 11916DA56 A: 11916DA56 B: 11916DA56 A | B: 11916DA56 A: 11916DA56 B: 11916DA56 A ^ B: 0 A: ~11916DA56 B: 11916DA56 A & B: 2 A: ~11916DA56 B: 11916DA56 A | B: ~2 A: ~11916DA56 B: 11916DA56 A ^ B: ~4 A: 11916DA56 B: ~11916DA56 A & B: 2 A: 11916DA56 B: ~11916DA56 A | B: ~2 A: 11916DA56 B: ~11916DA56 A ^ B: ~4 A: ~11916DA56 B: ~11916DA56 A & B: ~11916DA56 A: ~11916DA56 B: ~11916DA56 A | B: ~11916DA56 A: ~11916DA56 B: ~11916DA56 A ^ B: 0 A: 11916DA56 B: 1A5A24781 A & B: 101024200 A: 11916DA56 B: 1A5A24781 A | B: 1BDB6DFD7 A: 11916DA56 B: 1A5A24781 A ^ B: BCB49DD7 A: ~11916DA56 B: 1A5A24781 A & B: A4A00580 A: ~11916DA56 B: 1A5A24781 A | B: ~18149855 A: ~11916DA56 B: 1A5A24781 A ^ B: ~BCB49DD5 A: 11916DA56 B: ~1A5A24781 A & B: 18149856 A: 11916DA56 B: ~1A5A24781 A | B: ~A4A00581 A: 11916DA56 B: ~1A5A24781 A ^ B: ~BCB49DD7 A: ~11916DA56 B: ~1A5A24781 A & B: ~1BDB6DFD6 A: ~11916DA56 B: ~1A5A24781 A | B: ~101024201 A: ~11916DA56 B: ~1A5A24781 A ^ B: BCB49DD5 A: 11916DA56 B: C13FB61B2 A & B: 11124012 A: 11916DA56 B: C13FB61B2 A | B: D1BFFFBF6 A: 11916DA56 B: C13FB61B2 A ^ B: D0AEDBBE4 A: ~11916DA56 B: C13FB61B2 A & B: C02E921A2 A: ~11916DA56 B: C13FB61B2 A | B: ~108049A46 A: ~11916DA56 B: C13FB61B2 A ^ B: ~D0AEDBBE8 A: 11916DA56 B: ~C13FB61B2 A & B: 108049A46 A: 11916DA56 B: ~C13FB61B2 A | B: ~C02E921A2 A: 11916DA56 B: ~C13FB61B2 A ^ B: ~D0AEDBBE8 A: ~11916DA56 B: ~C13FB61B2 A & B: ~D1BFFFBF6 A: ~11916DA56 B: ~C13FB61B2 A | B: ~11124012 A: ~11916DA56 B: ~C13FB61B2 A ^ B: D0AEDBBE4 A: 11916DA56 B: 121DF9128B A & B: 19101202 A: 11916DA56 B: 121DF9128B A | B: 131DFFDADF A: 11916DA56 B: 121DF9128B A ^ B: 1304EFC8DD A: ~11916DA56 B: 121DF9128B A & B: 1204E9008A A: ~11916DA56 B: 121DF9128B A | B: ~10006C855 A: ~11916DA56 B: 121DF9128B A ^ B: ~1304EFC8DF A: 11916DA56 B: ~121DF9128B A & B: 10006C854 A: 11916DA56 B: ~121DF9128B A | B: ~1204E90089 A: 11916DA56 B: ~121DF9128B A ^ B: ~1304EFC8DD A: ~11916DA56 B: ~121DF9128B A & B: ~131DFFDAE0 A: ~11916DA56 B: ~121DF9128B A | B: ~19101201 A: ~11916DA56 B: ~121DF9128B A ^ B: 1304EFC8DF A: 11916DA56 ! A: ~11916DA57 A: ~11916DA56 ! A: 11916DA55 A: ~11916DA56 A ~>> 0: ~11916DA56 A: ~11916DA56 A ~>> 1: ~8C8B6D2B A: ~11916DA56 A ~>> 2: ~4645B696 A: ~11916DA56 A ~>> F: ~2322E A: ~11916DA56 A ~>> 10: ~11917 A: ~11916DA56 A ~>> 11: ~8C8C A: ~11916DA56 A ~>> 12: ~4646 A: ~11916DA56 A << 0: ~11916DA56 A: ~11916DA56 A << 1: ~2322DB4AC A: ~11916DA56 A << 2: ~4645B6958 A: ~11916DA56 A << F: ~8C8B6D2B0000 A: ~11916DA56 A << 10: ~11916DA560000 A: ~11916DA56 A << 11: ~2322DB4AC0000 A: ~11916DA56 A << 12: ~4645B69580000 A: C13FB61B2 B: C13FB61B2 A & B: C13FB61B2 A: C13FB61B2 B: C13FB61B2 A | B: C13FB61B2 A: C13FB61B2 B: C13FB61B2 A ^ B: 0 A: ~C13FB61B2 B: C13FB61B2 A & B: 2 A: ~C13FB61B2 B: C13FB61B2 A | B: ~2 A: ~C13FB61B2 B: C13FB61B2 A ^ B: ~4 A: C13FB61B2 B: ~C13FB61B2 A & B: 2 A: C13FB61B2 B: ~C13FB61B2 A | B: ~2 A: C13FB61B2 B: ~C13FB61B2 A ^ B: ~4 A: ~C13FB61B2 B: ~C13FB61B2 A & B: ~C13FB61B2 A: ~C13FB61B2 B: ~C13FB61B2 A | B: ~C13FB61B2 A: ~C13FB61B2 B: ~C13FB61B2 A ^ B: 0 A: C13FB61B2 B: 121DF9128B A & B: 11F90082 A: C13FB61B2 B: 121DF9128B A | B: 1E1FFB73BB A: C13FB61B2 B: 121DF9128B A ^ B: 1E0E027339 A: ~C13FB61B2 B: 121DF9128B A & B: 120C00120A A: ~C13FB61B2 B: 121DF9128B A | B: ~C02026131 A: ~C13FB61B2 B: 121DF9128B A ^ B: ~1E0E02733B A: C13FB61B2 B: ~121DF9128B A & B: C02026130 A: C13FB61B2 B: ~121DF9128B A | B: ~120C001209 A: C13FB61B2 B: ~121DF9128B A ^ B: ~1E0E027339 A: ~C13FB61B2 B: ~121DF9128B A & B: ~1E1FFB73BC A: ~C13FB61B2 B: ~121DF9128B A | B: ~11F90081 A: ~C13FB61B2 B: ~121DF9128B A ^ B: 1E0E02733B A: C13FB61B2 B: 84DBCD32A6 A & B: 413C920A2 A: C13FB61B2 B: 84DBCD32A6 A | B: 8CDBFF73B6 A: C13FB61B2 B: 84DBCD32A6 A ^ B: 88C8365314 A: ~C13FB61B2 B: 84DBCD32A6 A & B: 80C8041206 A: ~C13FB61B2 B: 84DBCD32A6 A | B: ~800324112 A: ~C13FB61B2 B: 84DBCD32A6 A ^ B: ~88C8365318 A: C13FB61B2 B: ~84DBCD32A6 A & B: 800324112 A: C13FB61B2 B: ~84DBCD32A6 A | B: ~80C8041206 A: C13FB61B2 B: ~84DBCD32A6 A ^ B: ~88C8365318 A: ~C13FB61B2 B: ~84DBCD32A6 A & B: ~8CDBFF73B6 A: ~C13FB61B2 B: ~84DBCD32A6 A | B: ~413C920A2 A: ~C13FB61B2 B: ~84DBCD32A6 A ^ B: 88C8365314 A: C13FB61B2 B: C749B3CBF9 A & B: 401B341B0 A: C13FB61B2 B: C749B3CBF9 A | B: CF5BFBEBFB A: C13FB61B2 B: C749B3CBF9 A ^ B: CB5A48AA4B A: ~C13FB61B2 B: C749B3CBF9 A & B: C348008A48 A: ~C13FB61B2 B: C749B3CBF9 A | B: ~812482001 A: ~C13FB61B2 B: C749B3CBF9 A ^ B: ~CB5A48AA49 A: C13FB61B2 B: ~C749B3CBF9 A & B: 812482002 A: C13FB61B2 B: ~C749B3CBF9 A | B: ~C348008A49 A: C13FB61B2 B: ~C749B3CBF9 A ^ B: ~CB5A48AA4B A: ~C13FB61B2 B: ~C749B3CBF9 A & B: ~CF5BFBEBFA A: ~C13FB61B2 B: ~C749B3CBF9 A | B: ~401B341B1 A: ~C13FB61B2 B: ~C749B3CBF9 A ^ B: CB5A48AA49 A: C13FB61B2 ! A: ~C13FB61B3 A: ~C13FB61B2 ! A: C13FB61B1 A: ~C13FB61B2 A ~>> 0: ~C13FB61B2 A: ~C13FB61B2 A ~>> 1: ~609FDB0D9 A: ~C13FB61B2 A ~>> 2: ~304FED86D A: ~C13FB61B2 A ~>> F: ~1827F7 A: ~C13FB61B2 A ~>> 10: ~C13FC A: ~C13FB61B2 A ~>> 11: ~609FE A: ~C13FB61B2 A ~>> 12: ~304FF A: ~C13FB61B2 A << 0: ~C13FB61B2 A: ~C13FB61B2 A << 1: ~1827F6C364 A: ~C13FB61B2 A << 2: ~304FED86C8 A: ~C13FB61B2 A << F: ~609FDB0D90000 A: ~C13FB61B2 A << 10: ~C13FB61B20000 A: ~C13FB61B2 A << 11: ~1827F6C3640000 A: ~C13FB61B2 A << 12: ~304FED86C80000 A: 26549223 B: 26549223 A & B: 26549223 A: 26549223 B: 26549223 A | B: 26549223 A: 26549223 B: 26549223 A ^ B: 0 A: ~26549223 B: 26549223 A & B: 1 A: ~26549223 B: 26549223 A | B: ~1 A: ~26549223 B: 26549223 A ^ B: ~2 A: 26549223 B: ~26549223 A & B: 1 A: 26549223 B: ~26549223 A | B: ~1 A: 26549223 B: ~26549223 A ^ B: ~2 A: ~26549223 B: ~26549223 A & B: ~26549223 A: ~26549223 B: ~26549223 A | B: ~26549223 A: ~26549223 B: ~26549223 A ^ B: 0 A: 26549223 B: 331B6D84 A & B: 22100000 A: 26549223 B: 331B6D84 A | B: 375FFFA7 A: 26549223 B: 331B6D84 A ^ B: 154FFFA7 A: ~26549223 B: 331B6D84 A & B: 110B6D84 A: ~26549223 B: 331B6D84 A | B: ~4449223 A: ~26549223 B: 331B6D84 A ^ B: ~154FFFA7 A: 26549223 B: ~331B6D84 A & B: 4449220 A: 26549223 B: ~331B6D84 A | B: ~110B6D81 A: 26549223 B: ~331B6D84 A ^ B: ~154FFFA1 A: ~26549223 B: ~331B6D84 A & B: ~375FFFA4 A: ~26549223 B: ~331B6D84 A | B: ~22100003 A: ~26549223 B: ~331B6D84 A ^ B: 154FFFA1 A: 26549223 B: 1A5A24781 A & B: 24000201 A: 26549223 B: 1A5A24781 A | B: 1A7F6D7A3 A: 26549223 B: 1A5A24781 A ^ B: 183F6D5A2 A: ~26549223 B: 1A5A24781 A & B: 181A24581 A: ~26549223 B: 1A5A24781 A | B: ~2549023 A: ~26549223 B: 1A5A24781 A ^ B: ~183F6D5A4 A: 26549223 B: ~1A5A24781 A & B: 2549023 A: 26549223 B: ~1A5A24781 A | B: ~181A24581 A: 26549223 B: ~1A5A24781 A ^ B: ~183F6D5A4 A: ~26549223 B: ~1A5A24781 A & B: ~1A7F6D7A3 A: ~26549223 B: ~1A5A24781 A | B: ~24000201 A: ~26549223 B: ~1A5A24781 A ^ B: 183F6D5A2 A: 26549223 B: 2322DB4AC A & B: 22049020 A: 26549223 B: 2322DB4AC A | B: 2367DB6AF A: 26549223 B: 2322DB4AC A ^ B: 21479268F A: ~26549223 B: 2322DB4AC A & B: 21029248C A: ~26549223 B: 2322DB4AC A | B: ~4500203 A: ~26549223 B: 2322DB4AC A ^ B: ~21479268F A: 26549223 B: ~2322DB4AC A & B: 4500200 A: 26549223 B: ~2322DB4AC A | B: ~210292489 A: 26549223 B: ~2322DB4AC A ^ B: ~214792689 A: ~26549223 B: ~2322DB4AC A & B: ~2367DB6AC A: ~26549223 B: ~2322DB4AC A | B: ~22049023 A: ~26549223 B: ~2322DB4AC A ^ B: 214792689 A: 26549223 ! A: ~26549224 A: ~26549223 ! A: 26549222 A: ~26549223 A ~>> 0: ~26549223 A: ~26549223 A ~>> 1: ~132A4912 A: ~26549223 A ~>> 2: ~9952489 A: ~26549223 A ~>> F: ~4CAA A: ~26549223 A ~>> 10: ~2655 A: ~26549223 A ~>> 11: ~132B A: ~26549223 A ~>> 12: ~996 A: ~26549223 A << 0: ~26549223 A: ~26549223 A << 1: ~4CA92446 A: ~26549223 A << 2: ~9952488C A: ~26549223 A << F: ~132A49118000 A: ~26549223 A << 10: ~265492230000 A: ~26549223 A << 11: ~4CA924460000 A: ~26549223 A << 12: ~9952488C0000 A: 1A5A24781 B: 1A5A24781 A & B: 1A5A24781 A: 1A5A24781 B: 1A5A24781 A | B: 1A5A24781 A: 1A5A24781 B: 1A5A24781 A ^ B: 0 A: ~1A5A24781 B: 1A5A24781 A & B: 1 A: ~1A5A24781 B: 1A5A24781 A | B: ~1 A: ~1A5A24781 B: 1A5A24781 A ^ B: ~2 A: 1A5A24781 B: ~1A5A24781 A & B: 1 A: 1A5A24781 B: ~1A5A24781 A | B: ~1 A: 1A5A24781 B: ~1A5A24781 A ^ B: ~2 A: ~1A5A24781 B: ~1A5A24781 A & B: ~1A5A24781 A: ~1A5A24781 B: ~1A5A24781 A | B: ~1A5A24781 A: ~1A5A24781 B: ~1A5A24781 A ^ B: 0 A: 1A5A24781 B: 2322DB4AC A & B: 20200480 A: 1A5A24781 B: 2322DB4AC A | B: 3B7AFF7AD A: 1A5A24781 B: 2322DB4AC A ^ B: 3978FF32D A: ~1A5A24781 B: 2322DB4AC A & B: 2120DB02C A: ~1A5A24781 B: 2322DB4AC A | B: ~185824301 A: ~1A5A24781 B: 2322DB4AC A ^ B: ~3978FF32D A: 1A5A24781 B: ~2322DB4AC A & B: 185824300 A: 1A5A24781 B: ~2322DB4AC A | B: ~2120DB02B A: 1A5A24781 B: ~2322DB4AC A ^ B: ~3978FF32B A: ~1A5A24781 B: ~2322DB4AC A & B: ~3B7AFF7AC A: ~1A5A24781 B: ~2322DB4AC A | B: ~20200481 A: ~1A5A24781 B: ~2322DB4AC A ^ B: 3978FF32B A: 1A5A24781 B: 121DF9128B A & B: 5A00281 A: 1A5A24781 B: 121DF9128B A | B: 13BDFB578B A: 1A5A24781 B: 121DF9128B A ^ B: 13B85B550A A: ~1A5A24781 B: 121DF9128B A & B: 121859100B A: ~1A5A24781 B: 121DF9128B A | B: ~1A0024501 A: ~1A5A24781 B: 121DF9128B A ^ B: ~13B85B550C A: 1A5A24781 B: ~121DF9128B A & B: 1A0024501 A: 1A5A24781 B: ~121DF9128B A | B: ~121859100B A: 1A5A24781 B: ~121DF9128B A ^ B: ~13B85B550C A: ~1A5A24781 B: ~121DF9128B A & B: ~13BDFB578B A: ~1A5A24781 B: ~121DF9128B A | B: ~5A00281 A: ~1A5A24781 B: ~121DF9128B A ^ B: 13B85B550A A: 1A5A24781 B: 1827F6C364 A & B: 25A24300 A: 1A5A24781 B: 1827F6C364 A | B: 19A7F6C7E5 A: 1A5A24781 B: 1827F6C364 A ^ B: 19825484E5 A: ~1A5A24781 B: 1827F6C364 A & B: 1802548064 A: ~1A5A24781 B: 1827F6C364 A | B: ~180000481 A: ~1A5A24781 B: 1827F6C364 A ^ B: ~19825484E5 A: 1A5A24781 B: ~1827F6C364 A & B: 180000480 A: 1A5A24781 B: ~1827F6C364 A | B: ~1802548063 A: 1A5A24781 B: ~1827F6C364 A ^ B: ~19825484E3 A: ~1A5A24781 B: ~1827F6C364 A & B: ~19A7F6C7E4 A: ~1A5A24781 B: ~1827F6C364 A | B: ~25A24301 A: ~1A5A24781 B: ~1827F6C364 A ^ B: 19825484E3 A: 1A5A24781 ! A: ~1A5A24782 A: ~1A5A24781 ! A: 1A5A24780 A: ~1A5A24781 A ~>> 0: ~1A5A24781 A: ~1A5A24781 A ~>> 1: ~D2D123C1 A: ~1A5A24781 A ~>> 2: ~696891E1 A: ~1A5A24781 A ~>> F: ~34B45 A: ~1A5A24781 A ~>> 10: ~1A5A3 A: ~1A5A24781 A ~>> 11: ~D2D2 A: ~1A5A24781 A ~>> 12: ~6969 A: ~1A5A24781 A << 0: ~1A5A24781 A: ~1A5A24781 A << 1: ~34B448F02 A: ~1A5A24781 A << 2: ~696891E04 A: ~1A5A24781 A << F: ~D2D123C08000 A: ~1A5A24781 A << 10: ~1A5A247810000 A: ~1A5A24781 A << 11: ~34B448F020000 A: ~1A5A24781 A << 12: ~696891E040000 A: 121DF9128B B: 121DF9128B A & B: 121DF9128B A: 121DF9128B B: 121DF9128B A | B: 121DF9128B A: 121DF9128B B: 121DF9128B A ^ B: 0 A: ~121DF9128B B: 121DF9128B A & B: 1 A: ~121DF9128B B: 121DF9128B A | B: ~1 A: ~121DF9128B B: 121DF9128B A ^ B: ~2 A: 121DF9128B B: ~121DF9128B A & B: 1 A: 121DF9128B B: ~121DF9128B A | B: ~1 A: 121DF9128B B: ~121DF9128B A ^ B: ~2 A: ~121DF9128B B: ~121DF9128B A & B: ~121DF9128B A: ~121DF9128B B: ~121DF9128B A | B: ~121DF9128B A: ~121DF9128B B: ~121DF9128B A ^ B: 0 A: 121DF9128B B: 1827F6C364 A & B: 1005F00200 A: 121DF9128B B: 1827F6C364 A | B: 1A3FFFD3EF A: 121DF9128B B: 1827F6C364 A ^ B: A3A0FD1EF A: ~121DF9128B B: 1827F6C364 A & B: 82206C164 A: ~121DF9128B B: 1827F6C364 A | B: ~21809108B A: ~121DF9128B B: 1827F6C364 A ^ B: ~A3A0FD1EF A: 121DF9128B B: ~1827F6C364 A & B: 218091088 A: 121DF9128B B: ~1827F6C364 A | B: ~82206C161 A: 121DF9128B B: ~1827F6C364 A ^ B: ~A3A0FD1E9 A: ~121DF9128B B: ~1827F6C364 A & B: ~1A3FFFD3EC A: ~121DF9128B B: ~1827F6C364 A | B: ~1005F00203 A: ~121DF9128B B: ~1827F6C364 A ^ B: A3A0FD1E9 A: 121DF9128B B: C749B3CBF9 A & B: 209B10289 A: 121DF9128B B: C749B3CBF9 A | B: D75DFBDBFB A: 121DF9128B B: C749B3CBF9 A ^ B: D5544AD972 A: ~121DF9128B B: C749B3CBF9 A & B: C54002C971 A: ~121DF9128B B: C749B3CBF9 A | B: ~1014481003 A: ~121DF9128B B: C749B3CBF9 A ^ B: ~D5544AD974 A: 121DF9128B B: ~C749B3CBF9 A & B: 1014481003 A: 121DF9128B B: ~C749B3CBF9 A | B: ~C54002C971 A: 121DF9128B B: ~C749B3CBF9 A ^ B: ~D5544AD974 A: ~121DF9128B B: ~C749B3CBF9 A & B: ~D75DFBDBFB A: ~121DF9128B B: ~C749B3CBF9 A | B: ~209B10289 A: ~121DF9128B B: ~C749B3CBF9 A ^ B: D5544AD972 A: 121DF9128B B: 109B79A654C A & B: 15980008 A: 121DF9128B B: 109B79A654C A | B: 11BBFFB77CF A: 121DF9128B B: 109B79A654C A ^ B: 11BAA6377C7 A: ~121DF9128B B: 109B79A654C A & B: 109A2026544 A: ~121DF9128B B: 109B79A654C A | B: ~1208611283 A: ~121DF9128B B: 109B79A654C A ^ B: ~11BAA6377C7 A: 121DF9128B B: ~109B79A654C A & B: 1208611280 A: 121DF9128B B: ~109B79A654C A | B: ~109A2026541 A: 121DF9128B B: ~109B79A654C A ^ B: ~11BAA6377C1 A: ~121DF9128B B: ~109B79A654C A & B: ~11BBFFB77CC A: ~121DF9128B B: ~109B79A654C A | B: ~1598000B A: ~121DF9128B B: ~109B79A654C A ^ B: 11BAA6377C1 A: 121DF9128B ! A: ~121DF9128C A: ~121DF9128B ! A: 121DF9128A A: ~121DF9128B A ~>> 0: ~121DF9128B A: ~121DF9128B A ~>> 1: ~90EFC8946 A: ~121DF9128B A ~>> 2: ~4877E44A3 A: ~121DF9128B A ~>> F: ~243BF3 A: ~121DF9128B A ~>> 10: ~121DFA A: ~121DF9128B A ~>> 11: ~90EFD A: ~121DF9128B A ~>> 12: ~4877F A: ~121DF9128B A << 0: ~121DF9128B A: ~121DF9128B A << 1: ~243BF22516 A: ~121DF9128B A << 2: ~4877E44A2C A: ~121DF9128B A << F: ~90EFC89458000 A: ~121DF9128B A << 10: ~121DF9128B0000 A: ~121DF9128B A << 11: ~243BF225160000 A: ~121DF9128B A << 12: ~4877E44A2C0000 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 2478481C02491517F1 A & B: 0 A: 0 B: 2478481C02491517F1 A | B: 2478481C02491517F1 A: 0 B: 2478481C02491517F1 A ^ B: 2478481C02491517F1 A: 0 B: 2478481C02491517F1 A & B: 0 A: 0 B: 2478481C02491517F1 A | B: 2478481C02491517F1 A: 0 B: 2478481C02491517F1 A ^ B: 2478481C02491517F1 A: 0 B: ~2478481C02491517F1 A & B: 0 A: 0 B: ~2478481C02491517F1 A | B: ~2478481C02491517F1 A: 0 B: ~2478481C02491517F1 A ^ B: ~2478481C02491517F1 A: 0 B: ~2478481C02491517F1 A & B: 0 A: 0 B: ~2478481C02491517F1 A | B: ~2478481C02491517F1 A: 0 B: ~2478481C02491517F1 A ^ B: ~2478481C02491517F1 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 1912B19341923E8075B A & B: 0 A: 0 B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A ^ B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A & B: 0 A: 0 B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A ^ B: 1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A & B: 0 A: 0 B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A ^ B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A & B: 0 A: 0 B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A ^ B: ~1912B19341923E8075B A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 1912B19341923E8075B A & B: 0 A: 0 B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A ^ B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A & B: 0 A: 0 B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 0 B: 1912B19341923E8075B A ^ B: 1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A & B: 0 A: 0 B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A ^ B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A & B: 0 A: 0 B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: 0 B: ~1912B19341923E8075B A ^ B: ~1912B19341923E8075B A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 113CDA153D148AF850E9 A & B: 0 A: 0 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A ^ B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A & B: 0 A: 0 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A ^ B: 113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A & B: 0 A: 0 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A ^ B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A & B: 0 A: 0 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A ^ B: ~113CDA153D148AF850E9 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 113CDA153D148AF850E9 A & B: 0 A: 0 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A ^ B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A & B: 0 A: 0 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 0 B: 113CDA153D148AF850E9 A ^ B: 113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A & B: 0 A: 0 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A ^ B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A & B: 0 A: 0 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: 0 B: ~113CDA153D148AF850E9 A ^ B: ~113CDA153D148AF850E9 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: BD9D5EE99FE1F8AB7A03 A & B: 0 A: 0 B: BD9D5EE99FE1F8AB7A03 A | B: BD9D5EE99FE1F8AB7A03 A: 0 B: BD9D5EE99FE1F8AB7A03 A ^ B: BD9D5EE99FE1F8AB7A03 A: 0 B: BD9D5EE99FE1F8AB7A03 A & B: 0 A: 0 B: BD9D5EE99FE1F8AB7A03 A | B: BD9D5EE99FE1F8AB7A03 A: 0 B: BD9D5EE99FE1F8AB7A03 A ^ B: BD9D5EE99FE1F8AB7A03 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A & B: 0 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A | B: ~BD9D5EE99FE1F8AB7A03 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A ^ B: ~BD9D5EE99FE1F8AB7A03 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A & B: 0 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A | B: ~BD9D5EE99FE1F8AB7A03 A: 0 B: ~BD9D5EE99FE1F8AB7A03 A ^ B: ~BD9D5EE99FE1F8AB7A03 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 2478481C02491517F1 B: 2478481C02491517F1 A & B: 2478481C02491517F1 A: 2478481C02491517F1 B: 2478481C02491517F1 A | B: 2478481C02491517F1 A: 2478481C02491517F1 B: 2478481C02491517F1 A ^ B: 0 A: ~2478481C02491517F1 B: 2478481C02491517F1 A & B: 1 A: ~2478481C02491517F1 B: 2478481C02491517F1 A | B: ~1 A: ~2478481C02491517F1 B: 2478481C02491517F1 A ^ B: ~2 A: 2478481C02491517F1 B: ~2478481C02491517F1 A & B: 1 A: 2478481C02491517F1 B: ~2478481C02491517F1 A | B: ~1 A: 2478481C02491517F1 B: ~2478481C02491517F1 A ^ B: ~2 A: ~2478481C02491517F1 B: ~2478481C02491517F1 A & B: ~2478481C02491517F1 A: ~2478481C02491517F1 B: ~2478481C02491517F1 A | B: ~2478481C02491517F1 A: ~2478481C02491517F1 B: ~2478481C02491517F1 A ^ B: 0 A: 2478481C02491517F1 B: 48F0903804922A2FE2 A & B: 70001800000007E0 A: 2478481C02491517F1 B: 48F0903804922A2FE2 A | B: 6CF8D83C06DB3F3FF3 A: 2478481C02491517F1 B: 48F0903804922A2FE2 A ^ B: 6C88D82406DB3F3813 A: ~2478481C02491517F1 B: 48F0903804922A2FE2 A & B: 4880902004922A2802 A: ~2478481C02491517F1 B: 48F0903804922A2FE2 A | B: ~240848040249151011 A: ~2478481C02491517F1 B: 48F0903804922A2FE2 A ^ B: ~6C88D82406DB3F3813 A: 2478481C02491517F1 B: ~48F0903804922A2FE2 A & B: 240848040249151010 A: 2478481C02491517F1 B: ~48F0903804922A2FE2 A | B: ~4880902004922A2801 A: 2478481C02491517F1 B: ~48F0903804922A2FE2 A ^ B: ~6C88D82406DB3F3811 A: ~2478481C02491517F1 B: ~48F0903804922A2FE2 A & B: ~6CF8D83C06DB3F3FF2 A: ~2478481C02491517F1 B: ~48F0903804922A2FE2 A | B: ~70001800000007E1 A: ~2478481C02491517F1 B: ~48F0903804922A2FE2 A ^ B: 6C88D82406DB3F3811 A: 2478481C02491517F1 B: 1912B19341923E8075B A & B: 2808140001000751 A: 2478481C02491517F1 B: 1912B19341923E8075B A | B: 1B57B593C1B6BFD17FB A: 2478481C02491517F1 B: 1912B19341923E8075B A ^ B: 1B55351281B6AFD10AA A: ~2478481C02491517F1 B: 1912B19341923E8075B A & B: 1910311201922E8000B A: ~2478481C02491517F1 B: 1912B19341923E8075B A | B: ~2450400802481510A1 A: ~2478481C02491517F1 B: 1912B19341923E8075B A ^ B: ~1B55351281B6AFD10AC A: 2478481C02491517F1 B: ~1912B19341923E8075B A & B: 2450400802481510A1 A: 2478481C02491517F1 B: ~1912B19341923E8075B A | B: ~1910311201922E8000B A: 2478481C02491517F1 B: ~1912B19341923E8075B A ^ B: ~1B55351281B6AFD10AC A: ~2478481C02491517F1 B: ~1912B19341923E8075B A & B: ~1B57B593C1B6BFD17FB A: ~2478481C02491517F1 B: ~1912B19341923E8075B A | B: ~2808140001000751 A: ~2478481C02491517F1 B: ~1912B19341923E8075B A ^ B: 1B55351281B6AFD10AA A: 2478481C02491517F1 B: 3225632683247D00EB6 A & B: 2050000802411006B0 A: 2478481C02491517F1 B: 3225632683247D00EB6 A | B: 3267E7A7C324FD51FF7 A: 2478481C02491517F1 B: 3225632683247D00EB6 A ^ B: 3062E7A74300EC51947 A: ~2478481C02491517F1 B: 3225632683247D00EB6 A & B: 3020632603006C00806 A: ~2478481C02491517F1 B: 3225632683247D00EB6 A | B: ~42848140008051141 A: ~2478481C02491517F1 B: 3225632683247D00EB6 A ^ B: ~3062E7A74300EC51947 A: 2478481C02491517F1 B: ~3225632683247D00EB6 A & B: 42848140008051140 A: 2478481C02491517F1 B: ~3225632683247D00EB6 A | B: ~3020632603006C00805 A: 2478481C02491517F1 B: ~3225632683247D00EB6 A ^ B: ~3062E7A74300EC51945 A: ~2478481C02491517F1 B: ~3225632683247D00EB6 A & B: ~3267E7A7C324FD51FF6 A: ~2478481C02491517F1 B: ~3225632683247D00EB6 A | B: ~2050000802411006B1 A: ~2478481C02491517F1 B: ~3225632683247D00EB6 A ^ B: 3062E7A74300EC51945 A: 2478481C02491517F1 ! A: ~2478481C02491517F2 A: ~2478481C02491517F1 ! A: 2478481C02491517F0 A: ~2478481C02491517F1 A ~>> 0: ~2478481C02491517F1 A: ~2478481C02491517F1 A ~>> 1: ~123C240E01248A8BF9 A: ~2478481C02491517F1 A ~>> 2: ~91E120700924545FD A: ~2478481C02491517F1 A ~>> F: ~48F0903804922B A: ~2478481C02491517F1 A ~>> 10: ~2478481C024916 A: ~2478481C02491517F1 A ~>> 11: ~123C240E01248B A: ~2478481C02491517F1 A ~>> 12: ~91E1207009246 A: ~2478481C02491517F1 A << 0: ~2478481C02491517F1 A: ~2478481C02491517F1 A << 1: ~48F0903804922A2FE2 A: ~2478481C02491517F1 A << 2: ~91E120700924545FC4 A: ~2478481C02491517F1 A << F: ~123C240E01248A8BF88000 A: ~2478481C02491517F1 A << 10: ~2478481C02491517F10000 A: ~2478481C02491517F1 A << 11: ~48F0903804922A2FE20000 A: ~2478481C02491517F1 A << 12: ~91E120700924545FC40000 A: 1912B19341923E8075B B: 1912B19341923E8075B A & B: 1912B19341923E8075B A: 1912B19341923E8075B B: 1912B19341923E8075B A | B: 1912B19341923E8075B A: 1912B19341923E8075B B: 1912B19341923E8075B A ^ B: 0 A: ~1912B19341923E8075B B: 1912B19341923E8075B A & B: 1 A: ~1912B19341923E8075B B: 1912B19341923E8075B A | B: ~1 A: ~1912B19341923E8075B B: 1912B19341923E8075B A ^ B: ~2 A: 1912B19341923E8075B B: ~1912B19341923E8075B A & B: 1 A: 1912B19341923E8075B B: ~1912B19341923E8075B A | B: ~1 A: 1912B19341923E8075B B: ~1912B19341923E8075B A ^ B: ~2 A: ~1912B19341923E8075B B: ~1912B19341923E8075B A & B: ~1912B19341923E8075B A: ~1912B19341923E8075B B: ~1912B19341923E8075B A | B: ~1912B19341923E8075B A: ~1912B19341923E8075B B: ~1912B19341923E8075B A ^ B: 0 A: 1912B19341923E8075B B: 3225632683247D00EB6 A & B: 1000210201003C00612 A: 1912B19341923E8075B B: 3225632683247D00EB6 A | B: 3B37F3B7C3B67F80FFF A: 1912B19341923E8075B B: 3225632683247D00EB6 A ^ B: 2B37D2B5C2B643809ED A: ~1912B19341923E8075B B: 3225632683247D00EB6 A & B: 22254224822441008A4 A: ~1912B19341923E8075B B: 3225632683247D00EB6 A | B: ~912909140920280149 A: ~1912B19341923E8075B B: 3225632683247D00EB6 A ^ B: ~2B37D2B5C2B643809ED A: 1912B19341923E8075B B: ~3225632683247D00EB6 A & B: 91290914092028014A A: 1912B19341923E8075B B: ~3225632683247D00EB6 A | B: ~22254224822441008A5 A: 1912B19341923E8075B B: ~3225632683247D00EB6 A ^ B: ~2B37D2B5C2B643809EF A: ~1912B19341923E8075B B: ~3225632683247D00EB6 A & B: ~3B37F3B7C3B67F81000 A: ~1912B19341923E8075B B: ~3225632683247D00EB6 A | B: ~1000210201003C00611 A: ~1912B19341923E8075B B: ~3225632683247D00EB6 A ^ B: 2B37D2B5C2B643809EF A: 1912B19341923E8075B B: 113CDA153D148AF850E9 A & B: 1100A11341002E80049 A: 1912B19341923E8075B B: 113CDA153D148AF850E9 A | B: 11BDFB1D3D1DABF857FB A: 1912B19341923E8075B B: 113CDA153D148AF850E9 A ^ B: 10ADF10C090DA91057B2 A: ~1912B19341923E8075B B: 113CDA153D148AF850E9 A & B: 102CD0040904881050A1 A: ~1912B19341923E8075B B: 113CDA153D148AF850E9 A | B: ~812108000921000713 A: ~1912B19341923E8075B B: 113CDA153D148AF850E9 A ^ B: ~10ADF10C090DA91057B4 A: 1912B19341923E8075B B: ~113CDA153D148AF850E9 A & B: 812108000921000713 A: 1912B19341923E8075B B: ~113CDA153D148AF850E9 A | B: ~102CD0040904881050A1 A: 1912B19341923E8075B B: ~113CDA153D148AF850E9 A ^ B: ~10ADF10C090DA91057B4 A: ~1912B19341923E8075B B: ~113CDA153D148AF850E9 A & B: ~11BDFB1D3D1DABF857FB A: ~1912B19341923E8075B B: ~113CDA153D148AF850E9 A | B: ~1100A11341002E80049 A: ~1912B19341923E8075B B: ~113CDA153D148AF850E9 A ^ B: 10ADF10C090DA91057B2 A: 1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A & B: 112008300901E00152 A: 1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A | B: 23F9BF3B7E3937F8A7DB A: 1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A ^ B: 23E89F334E303618A689 A: ~1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A & B: 226894224A201410A080 A: ~1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A | B: ~1800B11041022080609 A: ~1912B19341923E8075B B: 2279B42A7A2915F0A1D2 A ^ B: ~23E89F334E303618A689 A: 1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A & B: 1800B1104102208060A A: 1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A | B: ~226894224A201410A081 A: 1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A ^ B: ~23E89F334E303618A68B A: ~1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A & B: ~23F9BF3B7E3937F8A7DC A: ~1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A | B: ~112008300901E00151 A: ~1912B19341923E8075B B: ~2279B42A7A2915F0A1D2 A ^ B: 23E89F334E303618A68B A: 1912B19341923E8075B ! A: ~1912B19341923E8075C A: ~1912B19341923E8075B ! A: 1912B19341923E8075A A: ~1912B19341923E8075B A ~>> 0: ~1912B19341923E8075B A: ~1912B19341923E8075B A ~>> 1: ~C8958C9A0C91F403AE A: ~1912B19341923E8075B A ~>> 2: ~644AC64D0648FA01D7 A: ~1912B19341923E8075B A ~>> F: ~3225632683247D1 A: ~1912B19341923E8075B A ~>> 10: ~1912B19341923E9 A: ~1912B19341923E8075B A ~>> 11: ~C8958C9A0C91F5 A: ~1912B19341923E8075B A ~>> 12: ~644AC64D0648FB A: ~1912B19341923E8075B A << 0: ~1912B19341923E8075B A: ~1912B19341923E8075B A << 1: ~3225632683247D00EB6 A: ~1912B19341923E8075B A << 2: ~644AC64D0648FA01D6C A: ~1912B19341923E8075B A << F: ~C8958C9A0C91F403AD8000 A: ~1912B19341923E8075B A << 10: ~1912B19341923E8075B0000 A: ~1912B19341923E8075B A << 11: ~3225632683247D00EB60000 A: ~1912B19341923E8075B A << 12: ~644AC64D0648FA01D6C0000 A: 113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A & B: 113CDA153D148AF850E9 A: 113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A | B: 113CDA153D148AF850E9 A: 113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A ^ B: 0 A: ~113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A & B: 1 A: ~113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A | B: ~1 A: ~113CDA153D148AF850E9 B: 113CDA153D148AF850E9 A ^ B: ~2 A: 113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A & B: 1 A: 113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A | B: ~1 A: 113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A ^ B: ~2 A: ~113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A & B: ~113CDA153D148AF850E9 A: ~113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A | B: ~113CDA153D148AF850E9 A: ~113CDA153D148AF850E9 B: ~113CDA153D148AF850E9 A ^ B: 0 A: 113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A & B: 389000380000F000C0 A: 113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A | B: 337DFE3F7F3D9FF8F1FB A: 113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A ^ B: 33456E3F473D9F08F13B A: ~113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A & B: 2241242A42291500A112 A: ~113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A | B: ~11044A1505148A085029 A: ~113CDA153D148AF850E9 B: 2279B42A7A2915F0A1D2 A ^ B: ~33456E3F473D9F08F13B A: 113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A & B: 11044A1505148A085028 A: 113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A | B: ~2241242A42291500A111 A: 113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A ^ B: ~33456E3F473D9F08F139 A: ~113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A & B: ~337DFE3F7F3D9FF8F1FA A: ~113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A | B: ~389000380000F000C1 A: ~113CDA153D148AF850E9 B: ~2279B42A7A2915F0A1D2 A ^ B: 33456E3F473D9F08F139 A: 113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A & B: 111C5A011D0088A85001 A: 113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A | B: BDBDDEFDBFF5FAFB7AEB A: 113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A ^ B: ACA184FCA2F572532AEA A: ~113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A & B: AC8104E882E170032A03 A: ~113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A | B: ~2080142014025000E9 A: ~113CDA153D148AF850E9 B: BD9D5EE99FE1F8AB7A03 A ^ B: ~ACA184FCA2F572532AEC A: 113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A & B: 2080142014025000E9 A: 113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A | B: ~AC8104E882E170032A03 A: 113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A ^ B: ~ACA184FCA2F572532AEC A: ~113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A & B: ~BDBDDEFDBFF5FAFB7AEB A: ~113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A | B: ~111C5A011D0088A85001 A: ~113CDA153D148AF850E9 B: ~BD9D5EE99FE1F8AB7A03 A ^ B: ACA184FCA2F572532AEA A: 113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A & B: 113898113D0080505000 A: 113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A | B: 17B3EFFD73FD7FBFEF4EF A: 113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A ^ B: 16A0667C602D77BAEA4EF A: ~113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A & B: 16A0225C202C37106A406 A: ~113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A | B: ~4420400140AA800E9 A: ~113CDA153D148AF850E9 B: 17B3ABDD33FC3F156F406 A ^ B: ~16A0667C602D77BAEA4EF A: 113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A & B: 4420400140AA800E8 A: 113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A | B: ~16A0225C202C37106A405 A: 113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A ^ B: ~16A0667C602D77BAEA4ED A: ~113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A & B: ~17B3EFFD73FD7FBFEF4EE A: ~113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A | B: ~113898113D0080505001 A: ~113CDA153D148AF850E9 B: ~17B3ABDD33FC3F156F406 A ^ B: 16A0667C602D77BAEA4ED A: 113CDA153D148AF850E9 ! A: ~113CDA153D148AF850EA A: ~113CDA153D148AF850E9 ! A: 113CDA153D148AF850E8 A: ~113CDA153D148AF850E9 A ~>> 0: ~113CDA153D148AF850E9 A: ~113CDA153D148AF850E9 A ~>> 1: ~89E6D0A9E8A457C2875 A: ~113CDA153D148AF850E9 A ~>> 2: ~44F36854F4522BE143B A: ~113CDA153D148AF850E9 A ~>> F: ~2279B42A7A2915F1 A: ~113CDA153D148AF850E9 A ~>> 10: ~113CDA153D148AF9 A: ~113CDA153D148AF850E9 A ~>> 11: ~89E6D0A9E8A457D A: ~113CDA153D148AF850E9 A ~>> 12: ~44F36854F4522BF A: ~113CDA153D148AF850E9 A << 0: ~113CDA153D148AF850E9 A: ~113CDA153D148AF850E9 A << 1: ~2279B42A7A2915F0A1D2 A: ~113CDA153D148AF850E9 A << 2: ~44F36854F4522BE143A4 A: ~113CDA153D148AF850E9 A << F: ~89E6D0A9E8A457C28748000 A: ~113CDA153D148AF850E9 A << 10: ~113CDA153D148AF850E90000 A: ~113CDA153D148AF850E9 A << 11: ~2279B42A7A2915F0A1D20000 A: ~113CDA153D148AF850E9 A << 12: ~44F36854F4522BE143A40000 A: 48F0903804922A2FE2 B: 48F0903804922A2FE2 A & B: 48F0903804922A2FE2 A: 48F0903804922A2FE2 B: 48F0903804922A2FE2 A | B: 48F0903804922A2FE2 A: 48F0903804922A2FE2 B: 48F0903804922A2FE2 A ^ B: 0 A: ~48F0903804922A2FE2 B: 48F0903804922A2FE2 A & B: 2 A: ~48F0903804922A2FE2 B: 48F0903804922A2FE2 A | B: ~2 A: ~48F0903804922A2FE2 B: 48F0903804922A2FE2 A ^ B: ~4 A: 48F0903804922A2FE2 B: ~48F0903804922A2FE2 A & B: 2 A: 48F0903804922A2FE2 B: ~48F0903804922A2FE2 A | B: ~2 A: 48F0903804922A2FE2 B: ~48F0903804922A2FE2 A ^ B: ~4 A: ~48F0903804922A2FE2 B: ~48F0903804922A2FE2 A & B: ~48F0903804922A2FE2 A: ~48F0903804922A2FE2 B: ~48F0903804922A2FE2 A | B: ~48F0903804922A2FE2 A: ~48F0903804922A2FE2 B: ~48F0903804922A2FE2 A ^ B: 0 A: 48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A & B: 4860901004922A07C2 A: 48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A | B: 6DF8D87C06DB3F6FF3 A: 48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A ^ B: 2598486C0249156831 A: ~48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A & B: 250848440249154012 A: ~48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A | B: ~9000280000002821 A: ~48F0903804922A2FE2 B: 6D68D85406DB3F47D3 A ^ B: ~2598486C0249156833 A: 48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A & B: 9000280000002820 A: 48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A | B: ~250848440249154011 A: 48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A ^ B: ~2598486C0249156831 A: ~48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A & B: ~6DF8D87C06DB3F6FF4 A: ~48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A | B: ~4860901004922A07C1 A: ~48F0903804922A2FE2 B: ~6D68D85406DB3F47D3 A ^ B: 2598486C0249156833 A: 48F0903804922A2FE2 B: 3225632683247D00EB6 A & B: 5010280002000EA2 A: 48F0903804922A2FE2 B: 3225632683247D00EB6 A | B: 36AF6B27836D7FA2FF6 A: 48F0903804922A2FE2 B: 3225632683247D00EB6 A ^ B: 36AA6A25036D5FA2154 A: ~48F0903804922A2FE2 B: 3225632683247D00EB6 A & B: 3220622403245D00016 A: ~48F0903804922A2FE2 B: 3225632683247D00EB6 A | B: ~48A0801004902A2142 A: ~48F0903804922A2FE2 B: 3225632683247D00EB6 A ^ B: ~36AA6A25036D5FA2158 A: 48F0903804922A2FE2 B: ~3225632683247D00EB6 A & B: 48A0801004902A2142 A: 48F0903804922A2FE2 B: ~3225632683247D00EB6 A | B: ~3220622403245D00016 A: 48F0903804922A2FE2 B: ~3225632683247D00EB6 A ^ B: ~36AA6A25036D5FA2158 A: ~48F0903804922A2FE2 B: ~3225632683247D00EB6 A & B: ~36AF6B27836D7FA2FF6 A: ~48F0903804922A2FE2 B: ~3225632683247D00EB6 A | B: ~5010280002000EA2 A: ~48F0903804922A2FE2 B: ~3225632683247D00EB6 A ^ B: 36AA6A25036D5FA2154 A: 48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A & B: 8000180002280600 A: 48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A | B: 4FBF1DBBC4FFBBA3FF3 A: 48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A ^ B: 4FB71DBA44FF99239F3 A: ~48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A & B: 4B3014B844B69901010 A: ~48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A | B: ~4870902004900229E1 A: ~48F0903804922A2FE2 B: 4B3814B9C4B6BB81611 A ^ B: ~4FB71DBA44FF99239F1 A: 48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A & B: 4870902004900229E2 A: 48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A | B: ~4B3014B844B69901011 A: 48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A ^ B: ~4FB71DBA44FF99239F3 A: ~48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A & B: ~4FBF1DBBC4FFBBA3FF2 A: ~48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A | B: ~8000180002280601 A: ~48F0903804922A2FE2 B: ~4B3814B9C4B6BB81611 A ^ B: 4FB71DBA44FF99239F1 A: 48F0903804922A2FE2 ! A: ~48F0903804922A2FE3 A: ~48F0903804922A2FE2 ! A: 48F0903804922A2FE1 A: ~48F0903804922A2FE2 A ~>> 0: ~48F0903804922A2FE2 A: ~48F0903804922A2FE2 A ~>> 1: ~2478481C02491517F1 A: ~48F0903804922A2FE2 A ~>> 2: ~123C240E01248A8BF9 A: ~48F0903804922A2FE2 A ~>> F: ~91E12070092455 A: ~48F0903804922A2FE2 A ~>> 10: ~48F0903804922B A: ~48F0903804922A2FE2 A ~>> 11: ~2478481C024916 A: ~48F0903804922A2FE2 A ~>> 12: ~123C240E01248B A: ~48F0903804922A2FE2 A << 0: ~48F0903804922A2FE2 A: ~48F0903804922A2FE2 A << 1: ~91E120700924545FC4 A: ~48F0903804922A2FE2 A << 2: ~123C240E01248A8BF88 A: ~48F0903804922A2FE2 A << F: ~2478481C02491517F10000 A: ~48F0903804922A2FE2 A << 10: ~48F0903804922A2FE20000 A: ~48F0903804922A2FE2 A << 11: ~91E120700924545FC40000 A: ~48F0903804922A2FE2 A << 12: ~123C240E01248A8BF880000 A: 3225632683247D00EB6 B: 3225632683247D00EB6 A & B: 3225632683247D00EB6 A: 3225632683247D00EB6 B: 3225632683247D00EB6 A | B: 3225632683247D00EB6 A: 3225632683247D00EB6 B: 3225632683247D00EB6 A ^ B: 0 A: ~3225632683247D00EB6 B: 3225632683247D00EB6 A & B: 2 A: ~3225632683247D00EB6 B: 3225632683247D00EB6 A | B: ~2 A: ~3225632683247D00EB6 B: 3225632683247D00EB6 A ^ B: ~4 A: 3225632683247D00EB6 B: ~3225632683247D00EB6 A & B: 2 A: 3225632683247D00EB6 B: ~3225632683247D00EB6 A | B: ~2 A: 3225632683247D00EB6 B: ~3225632683247D00EB6 A ^ B: ~4 A: ~3225632683247D00EB6 B: ~3225632683247D00EB6 A & B: ~3225632683247D00EB6 A: ~3225632683247D00EB6 B: ~3225632683247D00EB6 A | B: ~3225632683247D00EB6 A: ~3225632683247D00EB6 B: ~3225632683247D00EB6 A ^ B: 0 A: 3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A & B: 220002080243900610 A: 3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A | B: 7B3D77BFC7B6FF81EB7 A: 3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A ^ B: 791D779F4792C6818A7 A: ~3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A & B: 4918149944928281000 A: ~3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A | B: ~30056306030044008A5 A: ~3225632683247D00EB6 B: 4B3814B9C4B6BB81611 A ^ B: ~791D779F4792C6818A5 A: 3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A & B: 30056306030044008A6 A: 3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A | B: ~4918149944928281001 A: 3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A ^ B: ~791D779F4792C6818A7 A: ~3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A & B: ~7B3D77BFC7B6FF81EB6 A: ~3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A | B: ~220002080243900611 A: ~3225632683247D00EB6 B: ~4B3814B9C4B6BB81611 A ^ B: 791D779F4792C6818A5 A: 3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A & B: 2201422682005D00092 A: 3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A | B: 237BF63A7A3B57F0AFF6 A: 3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A ^ B: 215BE218121B5220AF64 A: ~3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A & B: 2059A00812091020A142 A: ~3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A | B: ~1024210001242000E26 A: ~3225632683247D00EB6 B: 2279B42A7A2915F0A1D2 A ^ B: ~215BE218121B5220AF68 A: 3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A & B: 1024210001242000E26 A: 3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A | B: ~2059A00812091020A142 A: 3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A ^ B: ~215BE218121B5220AF68 A: ~3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A & B: ~237BF63A7A3B57F0AFF6 A: ~3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A | B: ~2201422682005D00092 A: ~3225632683247D00EB6 B: ~2279B42A7A2915F0A1D2 A ^ B: 215BE218121B5220AF64 A: 3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A & B: 3220632203000C002B2 A: 3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A | B: 33B6DE3FFF3FE7F8FEBF A: 3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A ^ B: 3094D80DDF0FE738FC0D A: ~3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A & B: 3094880D970DA028F00A A: ~3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A | B: ~5000480247100C05 A: ~3225632683247D00EB6 B: 33B68E3FB73DA0E8F2BB A ^ B: ~3094D80DDF0FE738FC0F A: 3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A & B: 5000480247100C04 A: 3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A | B: ~3094880D970DA028F009 A: 3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A ^ B: ~3094D80DDF0FE738FC0D A: ~3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A & B: ~33B6DE3FFF3FE7F8FEC0 A: ~3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A | B: ~3220632203000C002B1 A: ~3225632683247D00EB6 B: ~33B68E3FB73DA0E8F2BB A ^ B: 3094D80DDF0FE738FC0F A: 3225632683247D00EB6 ! A: ~3225632683247D00EB7 A: ~3225632683247D00EB6 ! A: 3225632683247D00EB5 A: ~3225632683247D00EB6 A ~>> 0: ~3225632683247D00EB6 A: ~3225632683247D00EB6 A ~>> 1: ~1912B19341923E8075B A: ~3225632683247D00EB6 A ~>> 2: ~C8958C9A0C91F403AE A: ~3225632683247D00EB6 A ~>> F: ~644AC64D0648FA1 A: ~3225632683247D00EB6 A ~>> 10: ~3225632683247D1 A: ~3225632683247D00EB6 A ~>> 11: ~1912B19341923E9 A: ~3225632683247D00EB6 A ~>> 12: ~C8958C9A0C91F5 A: ~3225632683247D00EB6 A << 0: ~3225632683247D00EB6 A: ~3225632683247D00EB6 A << 1: ~644AC64D0648FA01D6C A: ~3225632683247D00EB6 A << 2: ~C8958C9A0C91F403AD8 A: ~3225632683247D00EB6 A << F: ~1912B19341923E8075B0000 A: ~3225632683247D00EB6 A << 10: ~3225632683247D00EB60000 A: ~3225632683247D00EB6 A << 11: ~644AC64D0648FA01D6C0000 A: ~3225632683247D00EB6 A << 12: ~C8958C9A0C91F403AD80000 A: 2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A & B: 2279B42A7A2915F0A1D2 A: 2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A | B: 2279B42A7A2915F0A1D2 A: 2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A ^ B: 0 A: ~2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A & B: 2 A: ~2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A | B: ~2 A: ~2279B42A7A2915F0A1D2 B: 2279B42A7A2915F0A1D2 A ^ B: ~4 A: 2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A & B: 2 A: 2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A | B: ~2 A: 2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A ^ B: ~4 A: ~2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A & B: ~2279B42A7A2915F0A1D2 A: ~2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A | B: ~2279B42A7A2915F0A1D2 A: ~2279B42A7A2915F0A1D2 B: ~2279B42A7A2915F0A1D2 A ^ B: 0 A: 2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A & B: 2230842A322900E0A092 A: 2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A | B: 33FFBE3FFF3DB5F8F3FB A: 2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A ^ B: 11CF3A15CD14B5185369 A: ~2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A & B: 11860A158514A008522A A: ~2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A | B: ~493000480015100141 A: ~2279B42A7A2915F0A1D2 B: 33B68E3FB73DA0E8F2BB A ^ B: ~11CF3A15CD14B518536B A: 2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A & B: 493000480015100140 A: 2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A | B: ~11860A158514A0085229 A: 2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A ^ B: ~11CF3A15CD14B5185369 A: ~2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A & B: ~33FFBE3FFF3DB5F8F3FC A: ~2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A | B: ~2230842A322900E0A091 A: ~2279B42A7A2915F0A1D2 B: ~33B68E3FB73DA0E8F2BB A ^ B: 11CF3A15CD14B518536B A: 2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A & B: 2238B4023A011150A002 A: 2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A | B: 17B7BBDFB7FEBF5F6F5D6 A: 2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A ^ B: 1594309F945EAE4A655D4 A: ~2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A & B: 1590209D105C2E0065406 A: ~2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A | B: ~410028402804A001D2 A: ~2279B42A7A2915F0A1D2 B: 17B3ABDD33FC3F156F406 A ^ B: ~1594309F945EAE4A655D8 A: 2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A & B: 410028402804A001D2 A: 2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A | B: ~1590209D105C2E0065406 A: 2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A ^ B: ~1594309F945EAE4A655D8 A: ~2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A & B: ~17B7BBDFB7FEBF5F6F5D6 A: ~2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A | B: ~2238B4023A011150A002 A: ~2279B42A7A2915F0A1D2 B: ~17B3ABDD33FC3F156F406 A ^ B: 1594309F945EAE4A655D4 A: 2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A & B: 205814285A2100002000 A: 2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A | B: 23AF9BCBEFFADFFF2EFDB A: 2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A ^ B: 21AA1A896A58CFFF2CFDB A: ~2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A & B: 2188008948584EA024E08 A: ~2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A | B: ~221A002200815F081D1 A: ~2279B42A7A2915F0A1D2 B: 238D81CBCDFA5EA026E09 A ^ B: ~21AA1A896A58CFFF2CFD9 A: 2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A & B: 221A002200815F081D2 A: 2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A | B: ~2188008948584EA024E09 A: 2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A ^ B: ~21AA1A896A58CFFF2CFDB A: ~2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A & B: ~23AF9BCBEFFADFFF2EFDA A: ~2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A | B: ~205814285A2100002001 A: ~2279B42A7A2915F0A1D2 B: ~238D81CBCDFA5EA026E09 A ^ B: 21AA1A896A58CFFF2CFD9 A: 2279B42A7A2915F0A1D2 ! A: ~2279B42A7A2915F0A1D3 A: ~2279B42A7A2915F0A1D2 ! A: 2279B42A7A2915F0A1D1 A: ~2279B42A7A2915F0A1D2 A ~>> 0: ~2279B42A7A2915F0A1D2 A: ~2279B42A7A2915F0A1D2 A ~>> 1: ~113CDA153D148AF850E9 A: ~2279B42A7A2915F0A1D2 A ~>> 2: ~89E6D0A9E8A457C2875 A: ~2279B42A7A2915F0A1D2 A ~>> F: ~44F36854F4522BE2 A: ~2279B42A7A2915F0A1D2 A ~>> 10: ~2279B42A7A2915F1 A: ~2279B42A7A2915F0A1D2 A ~>> 11: ~113CDA153D148AF9 A: ~2279B42A7A2915F0A1D2 A ~>> 12: ~89E6D0A9E8A457D A: ~2279B42A7A2915F0A1D2 A << 0: ~2279B42A7A2915F0A1D2 A: ~2279B42A7A2915F0A1D2 A << 1: ~44F36854F4522BE143A4 A: ~2279B42A7A2915F0A1D2 A << 2: ~89E6D0A9E8A457C28748 A: ~2279B42A7A2915F0A1D2 A << F: ~113CDA153D148AF850E90000 A: ~2279B42A7A2915F0A1D2 A << 10: ~2279B42A7A2915F0A1D20000 A: ~2279B42A7A2915F0A1D2 A << 11: ~44F36854F4522BE143A40000 A: ~2279B42A7A2915F0A1D2 A << 12: ~89E6D0A9E8A457C287480000 A: 6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A & B: 6D68D85406DB3F47D3 A: 6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A | B: 6D68D85406DB3F47D3 A: 6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A ^ B: 0 A: ~6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A & B: 1 A: ~6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A | B: ~1 A: ~6D68D85406DB3F47D3 B: 6D68D85406DB3F47D3 A ^ B: ~2 A: 6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A & B: 1 A: 6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A | B: ~1 A: 6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A ^ B: ~2 A: ~6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A & B: ~6D68D85406DB3F47D3 A: ~6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A | B: ~6D68D85406DB3F47D3 A: ~6D68D85406DB3F47D3 B: ~6D68D85406DB3F47D3 A ^ B: 0 A: 6D68D85406DB3F47D3 B: 91E120700924545FC4 A & B: 160005000001447C0 A: 6D68D85406DB3F47D3 B: 91E120700924545FC4 A | B: FDE9F8740FFF7F5FD7 A: 6D68D85406DB3F47D3 B: 91E120700924545FC4 A ^ B: FC89F8240FFF6B1817 A: ~6D68D85406DB3F47D3 B: 91E120700924545FC4 A & B: 908120200924401804 A: ~6D68D85406DB3F47D3 B: 91E120700924545FC4 A | B: ~6C08D80406DB2B0013 A: ~6D68D85406DB3F47D3 B: 91E120700924545FC4 A ^ B: ~FC89F8240FFF6B1817 A: 6D68D85406DB3F47D3 B: ~91E120700924545FC4 A & B: 6C08D80406DB2B0010 A: 6D68D85406DB3F47D3 B: ~91E120700924545FC4 A | B: ~908120200924401801 A: 6D68D85406DB3F47D3 B: ~91E120700924545FC4 A ^ B: ~FC89F8240FFF6B1811 A: ~6D68D85406DB3F47D3 B: ~91E120700924545FC4 A & B: ~FDE9F8740FFF7F5FD4 A: ~6D68D85406DB3F47D3 B: ~91E120700924545FC4 A | B: ~160005000001447C3 A: ~6D68D85406DB3F47D3 B: ~91E120700924545FC4 A ^ B: FC89F8240FFF6B1811 A: 6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A & B: 21004814024B380611 A: 6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A | B: 4FFE9DBDC4FFBBF57D3 A: 6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A ^ B: 4DEE993C84DB08751C2 A: ~6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A & B: 4928103884920801001 A: ~6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A | B: ~4C68904004900741C3 A: ~6D68D85406DB3F47D3 B: 4B3814B9C4B6BB81611 A ^ B: ~4DEE993C84DB08751C4 A: 6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A & B: 4C68904004900741C3 A: 6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A | B: ~4928103884920801001 A: 6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A ^ B: ~4DEE993C84DB08751C4 A: ~6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A & B: ~4FFE9DBDC4FFBBF57D3 A: ~6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A | B: ~21004814024B380611 A: ~6D68D85406DB3F47D3 B: ~4B3814B9C4B6BB81611 A ^ B: 4DEE993C84DB08751C2 A: 6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A & B: 44284050048B200540 A: 6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A | B: 66DECFCD466DFBF5FFF A: 6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A ^ B: 629C4BC8462549F5ABF A: ~6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A & B: 600842480600480182C A: ~6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A | B: ~2940980402501F4293 A: ~6D68D85406DB3F47D3 B: 644AC64D0648FA01D6C A ^ B: ~629C4BC8462549F5ABF A: 6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A & B: 2940980402501F4290 A: 6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A | B: ~6008424806004801829 A: 6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A ^ B: ~629C4BC8462549F5AB9 A: ~6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A & B: ~66DECFCD466DFBF5FFC A: ~6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A | B: ~44284050048B200543 A: ~6D68D85406DB3F47D3 B: ~644AC64D0648FA01D6C A ^ B: 629C4BC8462549F5AB9 A: 6D68D85406DB3F47D3 ! A: ~6D68D85406DB3F47D4 A: ~6D68D85406DB3F47D3 ! A: 6D68D85406DB3F47D2 A: ~6D68D85406DB3F47D3 A ~>> 0: ~6D68D85406DB3F47D3 A: ~6D68D85406DB3F47D3 A ~>> 1: ~36B46C2A036D9FA3EA A: ~6D68D85406DB3F47D3 A ~>> 2: ~1B5A361501B6CFD1F5 A: ~6D68D85406DB3F47D3 A ~>> F: ~DAD1B0A80DB67F A: ~6D68D85406DB3F47D3 A ~>> 10: ~6D68D85406DB40 A: ~6D68D85406DB3F47D3 A ~>> 11: ~36B46C2A036DA0 A: ~6D68D85406DB3F47D3 A ~>> 12: ~1B5A361501B6D0 A: ~6D68D85406DB3F47D3 A << 0: ~6D68D85406DB3F47D3 A: ~6D68D85406DB3F47D3 A << 1: ~DAD1B0A80DB67E8FA6 A: ~6D68D85406DB3F47D3 A << 2: ~1B5A361501B6CFD1F4C A: ~6D68D85406DB3F47D3 A << F: ~36B46C2A036D9FA3E98000 A: ~6D68D85406DB3F47D3 A << 10: ~6D68D85406DB3F47D30000 A: ~6D68D85406DB3F47D3 A << 11: ~DAD1B0A80DB67E8FA60000 A: ~6D68D85406DB3F47D3 A << 12: ~1B5A361501B6CFD1F4C0000 A: 4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A & B: 4B3814B9C4B6BB81611 A: 4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A | B: 4B3814B9C4B6BB81611 A: 4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A ^ B: 0 A: ~4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A & B: 1 A: ~4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A | B: ~1 A: ~4B3814B9C4B6BB81611 B: 4B3814B9C4B6BB81611 A ^ B: ~2 A: 4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A & B: 1 A: 4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A | B: ~1 A: 4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A ^ B: ~2 A: ~4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A & B: ~4B3814B9C4B6BB81611 A: ~4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A | B: ~4B3814B9C4B6BB81611 A: ~4B3814B9C4B6BB81611 B: ~4B3814B9C4B6BB81611 A ^ B: 0 A: 4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A & B: 400804090400BA01400 A: 4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A | B: 6F7AD6FDC6FEFB81F7D A: 4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A ^ B: 2F72D2F4C2FE4180B7D A: ~4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A & B: 2442C2440248400096C A: ~4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A | B: ~B3010B0C0B60180211 A: ~4B3814B9C4B6BB81611 B: 644AC64D0648FA01D6C A ^ B: ~2F72D2F4C2FE4180B7D A: 4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A & B: B3010B0C0B60180210 A: 4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A | B: ~2442C2440248400096B A: 4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A ^ B: ~2F72D2F4C2FE4180B7B A: ~4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A & B: ~6F7AD6FDC6FEFB81F7C A: ~4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A | B: ~400804090400BA01401 A: ~4B3814B9C4B6BB81611 B: ~644AC64D0648FA01D6C A ^ B: 2F72D2F4C2FE4180B7B A: 4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A & B: B2800B940920A81211 A: 4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A | B: 37B78F7FBF7FEBF8F6BB A: 4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A ^ B: 37050F742B76CB50E4AA A: ~4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A & B: 33040E3423348040E0AB A: ~4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A | B: ~401014008424B100401 A: ~4B3814B9C4B6BB81611 B: 33B68E3FB73DA0E8F2BB A ^ B: ~37050F742B76CB50E4AC A: 4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A & B: 401014008424B100401 A: 4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A | B: ~33040E3423348040E0AB A: 4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A ^ B: ~37050F742B76CB50E4AC A: ~4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A & B: ~37B78F7FBF7FEBF8F6BB A: ~4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A | B: ~B2800B940920A81211 A: ~4B3814B9C4B6BB81611 B: ~33B68E3FB73DA0E8F2BB A ^ B: 37050F742B76CB50E4AA A: 4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A & B: 4B3004094422BA00200 A: 4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A | B: 44F3E95FFC5B6BF957B5 A: 4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A ^ B: 4040E91F6819405955B5 A: ~4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A & B: 404068146010004141A4 A: ~4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A | B: ~810B080940181411 A: ~4B3814B9C4B6BB81611 B: 44F36854F4522BE143A4 A ^ B: ~4040E91F6819405955B5 A: 4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A & B: 810B080940181410 A: 4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A | B: ~404068146010004141A3 A: 4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A ^ B: ~4040E91F6819405955B3 A: ~4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A & B: ~44F3E95FFC5B6BF957B4 A: ~4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A | B: ~4B3004094422BA00201 A: ~4B3814B9C4B6BB81611 B: ~44F36854F4522BE143A4 A ^ B: 4040E91F6819405955B3 A: 4B3814B9C4B6BB81611 ! A: ~4B3814B9C4B6BB81612 A: ~4B3814B9C4B6BB81611 ! A: 4B3814B9C4B6BB81610 A: ~4B3814B9C4B6BB81611 A ~>> 0: ~4B3814B9C4B6BB81611 A: ~4B3814B9C4B6BB81611 A ~>> 1: ~259C0A5CE25B5DC0B09 A: ~4B3814B9C4B6BB81611 A ~>> 2: ~12CE052E712DAEE0585 A: ~4B3814B9C4B6BB81611 A ~>> F: ~96702973896D771 A: ~4B3814B9C4B6BB81611 A ~>> 10: ~4B3814B9C4B6BB9 A: ~4B3814B9C4B6BB81611 A ~>> 11: ~259C0A5CE25B5DD A: ~4B3814B9C4B6BB81611 A ~>> 12: ~12CE052E712DAEF A: ~4B3814B9C4B6BB81611 A << 0: ~4B3814B9C4B6BB81611 A: ~4B3814B9C4B6BB81611 A << 1: ~96702973896D7702C22 A: ~4B3814B9C4B6BB81611 A << 2: ~12CE052E712DAEE05844 A: ~4B3814B9C4B6BB81611 A << F: ~259C0A5CE25B5DC0B088000 A: ~4B3814B9C4B6BB81611 A << 10: ~4B3814B9C4B6BB816110000 A: ~4B3814B9C4B6BB81611 A << 11: ~96702973896D7702C220000 A: ~4B3814B9C4B6BB81611 A << 12: ~12CE052E712DAEE058440000 A: 33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A & B: 33B68E3FB73DA0E8F2BB A: 33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A | B: 33B68E3FB73DA0E8F2BB A: 33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A ^ B: 0 A: ~33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A & B: 1 A: ~33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A | B: ~1 A: ~33B68E3FB73DA0E8F2BB B: 33B68E3FB73DA0E8F2BB A ^ B: ~2 A: 33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A & B: 1 A: 33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A | B: ~1 A: 33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A ^ B: ~2 A: ~33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A & B: ~33B68E3FB73DA0E8F2BB A: ~33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A | B: ~33B68E3FB73DA0E8F2BB A: ~33B68E3FB73DA0E8F2BB B: ~33B68E3FB73DA0E8F2BB A ^ B: 0 A: 33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A & B: B20814B41020E042A0 A: 33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A | B: 77F7EE7FF77FABE9F3BF A: 33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A ^ B: 7745E66B436F8B09B11F A: ~33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A & B: 4441604040420B010104 A: ~33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A | B: ~3304862B032D8008B01B A: ~33B68E3FB73DA0E8F2BB B: 44F36854F4522BE143A4 A ^ B: ~7745E66B436F8B09B11F A: 33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A & B: 3304862B032D8008B018 A: 33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A | B: ~4441604040420B010101 A: 33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A ^ B: ~7745E66B436F8B09B119 A: ~33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A & B: ~77F7EE7FF77FABE9F3BC A: ~33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A | B: ~B20814B41020E042A3 A: ~33B68E3FB73DA0E8F2BB B: ~44F36854F4522BE143A4 A ^ B: 7745E66B436F8B09B119 A: 33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A & B: 30900C3C9725A0006209 A: 33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A | B: 23BFE9EBFFFBDEAEAFEBB A: 33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A ^ B: 20B6E928368984AEA9CB2 A: ~33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A & B: 20848108048804A020C01 A: ~33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A | B: ~3268203201800E890B3 A: ~33B68E3FB73DA0E8F2BB B: 238D81CBCDFA5EA026E09 A ^ B: ~20B6E928368984AEA9CB4 A: 33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A & B: 3268203201800E890B3 A: 33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A | B: ~20848108048804A020C01 A: 33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A ^ B: ~20B6E928368984AEA9CB4 A: ~33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A & B: ~23BFE9EBFFFBDEAEAFEBB A: ~33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A | B: ~30900C3C9725A0006209 A: ~33B68E3FB73DA0E8F2BB B: ~238D81CBCDFA5EA026E09 A ^ B: 20B6E928368984AEA9CB2 A: 33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A & B: 32340A263705A0A8E008 A: 33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A | B: 2F7F7FFBFFFBFE2EDFABF A: 33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A ^ B: 2C5C3F599C8BA42451AB7 A: ~33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A & B: 2C4417180488242050804 A: ~33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A | B: ~18284198038004012B3 A: ~33B68E3FB73DA0E8F2BB B: 2F6757BA67F87E2ADE80C A ^ B: ~2C5C3F599C8BA42451AB7 A: 33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A & B: 18284198038004012B0 A: 33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A | B: ~2C4417180488242050801 A: 33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A ^ B: ~2C5C3F599C8BA42451AB1 A: ~33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A & B: ~2F7F7FFBFFFBFE2EDFABC A: ~33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A | B: ~32340A263705A0A8E00B A: ~33B68E3FB73DA0E8F2BB B: ~2F6757BA67F87E2ADE80C A ^ B: 2C5C3F599C8BA42451AB1 A: 33B68E3FB73DA0E8F2BB ! A: ~33B68E3FB73DA0E8F2BC A: ~33B68E3FB73DA0E8F2BB ! A: 33B68E3FB73DA0E8F2BA A: ~33B68E3FB73DA0E8F2BB A ~>> 0: ~33B68E3FB73DA0E8F2BB A: ~33B68E3FB73DA0E8F2BB A ~>> 1: ~19DB471FDB9ED074795E A: ~33B68E3FB73DA0E8F2BB A ~>> 2: ~CEDA38FEDCF683A3CAF A: ~33B68E3FB73DA0E8F2BB A ~>> F: ~676D1C7F6E7B41D2 A: ~33B68E3FB73DA0E8F2BB A ~>> 10: ~33B68E3FB73DA0E9 A: ~33B68E3FB73DA0E8F2BB A ~>> 11: ~19DB471FDB9ED075 A: ~33B68E3FB73DA0E8F2BB A ~>> 12: ~CEDA38FEDCF683B A: ~33B68E3FB73DA0E8F2BB A << 0: ~33B68E3FB73DA0E8F2BB A: ~33B68E3FB73DA0E8F2BB A << 1: ~676D1C7F6E7B41D1E576 A: ~33B68E3FB73DA0E8F2BB A << 2: ~CEDA38FEDCF683A3CAEC A: ~33B68E3FB73DA0E8F2BB A << F: ~19DB471FDB9ED074795D8000 A: ~33B68E3FB73DA0E8F2BB A << 10: ~33B68E3FB73DA0E8F2BB0000 A: ~33B68E3FB73DA0E8F2BB A << 11: ~676D1C7F6E7B41D1E5760000 A: ~33B68E3FB73DA0E8F2BB A << 12: ~CEDA38FEDCF683A3CAEC0000 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: DC3E0F41E901B3D7849583FB49 A & B: 0 A: 0 B: DC3E0F41E901B3D7849583FB49 A | B: DC3E0F41E901B3D7849583FB49 A: 0 B: DC3E0F41E901B3D7849583FB49 A ^ B: DC3E0F41E901B3D7849583FB49 A: 0 B: DC3E0F41E901B3D7849583FB49 A & B: 0 A: 0 B: DC3E0F41E901B3D7849583FB49 A | B: DC3E0F41E901B3D7849583FB49 A: 0 B: DC3E0F41E901B3D7849583FB49 A ^ B: DC3E0F41E901B3D7849583FB49 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A & B: 0 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A | B: ~DC3E0F41E901B3D7849583FB49 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A ^ B: ~DC3E0F41E901B3D7849583FB49 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A & B: 0 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A | B: ~DC3E0F41E901B3D7849583FB49 A: 0 B: ~DC3E0F41E901B3D7849583FB49 A ^ B: ~DC3E0F41E901B3D7849583FB49 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~976AAA7D50312BA42B26CABCC23 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 0 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A & B: 0 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~976AAA7D50312BA42B26CABCC23 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 0 A & B: 0 A: 0 B: 0 A | B: 0 A: 0 B: 0 A ^ B: 0 A: 0 B: 681955362721CE00DDAAAB61C581 A & B: 0 A: 0 B: 681955362721CE00DDAAAB61C581 A | B: 681955362721CE00DDAAAB61C581 A: 0 B: 681955362721CE00DDAAAB61C581 A ^ B: 681955362721CE00DDAAAB61C581 A: 0 B: 681955362721CE00DDAAAB61C581 A & B: 0 A: 0 B: 681955362721CE00DDAAAB61C581 A | B: 681955362721CE00DDAAAB61C581 A: 0 B: 681955362721CE00DDAAAB61C581 A ^ B: 681955362721CE00DDAAAB61C581 A: 0 B: ~681955362721CE00DDAAAB61C581 A & B: 0 A: 0 B: ~681955362721CE00DDAAAB61C581 A | B: ~681955362721CE00DDAAAB61C581 A: 0 B: ~681955362721CE00DDAAAB61C581 A ^ B: ~681955362721CE00DDAAAB61C581 A: 0 B: ~681955362721CE00DDAAAB61C581 A & B: 0 A: 0 B: ~681955362721CE00DDAAAB61C581 A | B: ~681955362721CE00DDAAAB61C581 A: 0 B: ~681955362721CE00DDAAAB61C581 A ^ B: ~681955362721CE00DDAAAB61C581 A: 0 ! A: ~1 A: 0 ! A: ~1 A: 0 A ~>> 0: 0 A: 0 A ~>> 1: 0 A: 0 A ~>> 2: 0 A: 0 A ~>> F: 0 A: 0 A ~>> 10: 0 A: 0 A ~>> 11: 0 A: 0 A ~>> 12: 0 A: 0 A << 0: 0 A: 0 A << 1: 0 A: 0 A << 2: 0 A: 0 A << F: 0 A: 0 A << 10: 0 A: 0 A << 11: 0 A: 0 A << 12: 0 A: DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A & B: DC3E0F41E901B3D7849583FB49 A: DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A | B: DC3E0F41E901B3D7849583FB49 A: DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A ^ B: 0 A: ~DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A & B: 1 A: ~DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A | B: ~1 A: ~DC3E0F41E901B3D7849583FB49 B: DC3E0F41E901B3D7849583FB49 A ^ B: ~2 A: DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A & B: 1 A: DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A | B: ~1 A: DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A ^ B: ~2 A: ~DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A & B: ~DC3E0F41E901B3D7849583FB49 A: ~DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A | B: ~DC3E0F41E901B3D7849583FB49 A: ~DC3E0F41E901B3D7849583FB49 B: ~DC3E0F41E901B3D7849583FB49 A ^ B: 0 A: DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A & B: 983C0E01C0012387000103F200 A: DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A | B: 1FC7E1FC3FB03F7FF8DBF87FFDB A: DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A ^ B: 1644211C23B02D4788DBE840DDB A: ~DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A & B: 12040108212024428092A040492 A: ~DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A | B: ~44020140290090508494800949 A: ~DC3E0F41E901B3D7849583FB49 B: 1B87C1E83D20367AF092B07F692 A ^ B: ~1644211C23B02D4788DBE840DDB A: DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A & B: 44020140290090508494800948 A: DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A | B: ~12040108212024428092A040491 A: DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A ^ B: ~1644211C23B02D4788DBE840DD9 A: ~DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A & B: ~1FC7E1FC3FB03F7FF8DBF87FFDA A: ~DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A | B: ~983C0E01C0012387000103F201 A: ~DC3E0F41E901B3D7849583FB49 B: ~1B87C1E83D20367AF092B07F692 A ^ B: 1644211C23B02D4788DBE840DD9 A: DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A & B: 542A07410100B242800483C801 A: DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A | B: 9FEBEAFD5EB13BBD7B6FDABFF6B A: DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 9AA94A894EA13099536F928376A A: ~DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A & B: 92280A094021208003268280423 A: ~DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A | B: ~88140800E80101950491003349 A: ~DC3E0F41E901B3D7849583FB49 B: 976AAA7D50312BA42B26CABCC23 A ^ B: ~9AA94A894EA13099536F928376C A: DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A & B: 88140800E80101950491003349 A: DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~92280A094021208003268280423 A: DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~9AA94A894EA13099536F928376C A: ~DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A & B: ~9FEBEAFD5EB13BBD7B6FDABFF6B A: ~DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~542A07410100B242800483C801 A: ~DC3E0F41E901B3D7849583FB49 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: 9AA94A894EA13099536F928376A A: DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A & B: CC140F00000130850491039840 A: DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A | B: 12FD7F4FEBEF25F7D7E4DDD7FB4F A: DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A ^ B: 12316B40EBEF24C752E04CD4630F A: ~DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A & B: 12214140AA062444006048540006 A: ~DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A | B: ~102A0041E90083528004806309 A: ~DC3E0F41E901B3D7849583FB49 B: 12ED554FAA0625748564D9579846 A ^ B: ~12316B40EBEF24C752E04CD4630F A: DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A & B: 102A0041E90083528004806308 A: DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A | B: ~12214140AA062444006048540005 A: DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A ^ B: ~12316B40EBEF24C752E04CD4630D A: ~DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A & B: ~12FD7F4FEBEF25F7D7E4DDD7FB4E A: ~DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A | B: ~CC140F00000130850491039841 A: ~DC3E0F41E901B3D7849583FB49 B: ~12ED554FAA0625748564D9579846 A ^ B: 12316B40EBEF24C752E04CD4630D A: DC3E0F41E901B3D7849583FB49 ! A: ~DC3E0F41E901B3D7849583FB4A A: ~DC3E0F41E901B3D7849583FB49 ! A: DC3E0F41E901B3D7849583FB48 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 0: ~DC3E0F41E901B3D7849583FB49 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 1: ~6E1F07A0F480D9EBC24AC1FDA5 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 2: ~370F83D07A406CF5E12560FED3 A: ~DC3E0F41E901B3D7849583FB49 A ~>> F: ~1B87C1E83D20367AF092B08 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 10: ~DC3E0F41E901B3D7849584 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 11: ~6E1F07A0F480D9EBC24AC2 A: ~DC3E0F41E901B3D7849583FB49 A ~>> 12: ~370F83D07A406CF5E12561 A: ~DC3E0F41E901B3D7849583FB49 A << 0: ~DC3E0F41E901B3D7849583FB49 A: ~DC3E0F41E901B3D7849583FB49 A << 1: ~1B87C1E83D20367AF092B07F692 A: ~DC3E0F41E901B3D7849583FB49 A << 2: ~370F83D07A406CF5E12560FED24 A: ~DC3E0F41E901B3D7849583FB49 A << F: ~6E1F07A0F480D9EBC24AC1FDA48000 A: ~DC3E0F41E901B3D7849583FB49 A << 10: ~DC3E0F41E901B3D7849583FB490000 A: ~DC3E0F41E901B3D7849583FB49 A << 11: ~1B87C1E83D20367AF092B07F6920000 A: ~DC3E0F41E901B3D7849583FB49 A << 12: ~370F83D07A406CF5E12560FED240000 A: 976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A & B: 976AAA7D50312BA42B26CABCC23 A: 976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A | B: 976AAA7D50312BA42B26CABCC23 A: 976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A ^ B: 0 A: ~976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A & B: 1 A: ~976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A | B: ~1 A: ~976AAA7D50312BA42B26CABCC23 B: 976AAA7D50312BA42B26CABCC23 A ^ B: ~2 A: 976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A & B: 1 A: 976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~1 A: 976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: ~2 A: ~976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A & B: ~976AAA7D50312BA42B26CABCC23 A: ~976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A | B: ~976AAA7D50312BA42B26CABCC23 A: ~976AAA7D50312BA42B26CABCC23 B: ~976AAA7D50312BA42B26CABCC23 A ^ B: 0 A: 976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A & B: 64000780020030002048038802 A: 976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A | B: 1BFFFFEFFF0737FEC7F6FDFFDC67 A: 976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A ^ B: 1B9BFFE87F0537CEC7D6B5FC5465 A: ~976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A & B: 128955482A042544854491541044 A: ~976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A | B: ~912AAA05501128A429224A84421 A: ~976AAA7D50312BA42B26CABCC23 B: 12ED554FAA0625748564D9579846 A ^ B: ~1B9BFFE87F0537CEC7D6B5FC5465 A: 976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A & B: 912AAA05501128A429224A84422 A: 976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A | B: ~128955482A042544854491541045 A: 976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A ^ B: ~1B9BFFE87F0537CEC7D6B5FC5467 A: ~976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A & B: ~1BFFFFEFFF0737FEC7F6FDFFDC68 A: ~976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A | B: ~64000780020030002048038801 A: ~976AAA7D50312BA42B26CABCC23 B: ~12ED554FAA0625748564D9579846 A ^ B: 1B9BFFE87F0537CEC7D6B5FC5467 A: 976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A & B: 81000260501020040A22821C401 A: 976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A | B: 697FFFB7F723DEBADFBAEFEBCDA3 A: 976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A ^ B: 616FFF91F222DCBA9F18C7CA09A2 A: ~976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A & B: 600955102220CC009D0883400181 A: ~976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A | B: ~166AA81D00210BA0210448A0823 A: ~976AAA7D50312BA42B26CABCC23 B: 681955362721CE00DDAAAB61C581 A ^ B: ~616FFF91F222DCBA9F18C7CA09A4 A: 976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A & B: 166AA81D00210BA0210448A0823 A: 976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A | B: ~600955102220CC009D0883400181 A: 976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A ^ B: ~616FFF91F222DCBA9F18C7CA09A4 A: ~976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A & B: ~697FFFB7F723DEBADFBAEFEBCDA3 A: ~976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A | B: ~81000260501020040A22821C401 A: ~976AAA7D50312BA42B26CABCC23 B: ~681955362721CE00DDAAAB61C581 A ^ B: 616FFF91F222DCBA9F18C7CA09A2 A: 976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A & B: 32AA2444031000021044838802 A: 976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A | B: D976AAEFDF439EBBFBF77EEBCF23 A: 976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A ^ B: D94400CB9B408EBBF9E73A684721 A: ~976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A & B: D00000480A408C01B94512400300 A: ~976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A | B: ~9440083910002BA40A228284421 A: ~976AAA7D50312BA42B26CABCC23 B: D032AA6C4E439C01BB5556C38B02 A ^ B: ~D94400CB9B408EBBF9E73A684721 A: 976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A & B: 9440083910002BA40A228284422 A: 976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A | B: ~D00000480A408C01B94512400301 A: 976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A ^ B: ~D94400CB9B408EBBF9E73A684723 A: ~976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A & B: ~D976AAEFDF439EBBFBF77EEBCF24 A: ~976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A | B: ~32AA2444031000021044838801 A: ~976AAA7D50312BA42B26CABCC23 B: ~D032AA6C4E439C01BB5556C38B02 A ^ B: D94400CB9B408EBBF9E73A684723 A: 976AAA7D50312BA42B26CABCC23 ! A: ~976AAA7D50312BA42B26CABCC24 A: ~976AAA7D50312BA42B26CABCC23 ! A: 976AAA7D50312BA42B26CABCC22 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 0: ~976AAA7D50312BA42B26CABCC23 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 1: ~4BB5553EA81895D21593655E612 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 2: ~25DAAA9F540C4AE90AC9B2AF309 A: ~976AAA7D50312BA42B26CABCC23 A ~>> F: ~12ED554FAA0625748564D958 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 10: ~976AAA7D50312BA42B26CAC A: ~976AAA7D50312BA42B26CABCC23 A ~>> 11: ~4BB5553EA81895D21593656 A: ~976AAA7D50312BA42B26CABCC23 A ~>> 12: ~25DAAA9F540C4AE90AC9B2B A: ~976AAA7D50312BA42B26CABCC23 A << 0: ~976AAA7D50312BA42B26CABCC23 A: ~976AAA7D50312BA42B26CABCC23 A << 1: ~12ED554FAA0625748564D9579846 A: ~976AAA7D50312BA42B26CABCC23 A << 2: ~25DAAA9F540C4AE90AC9B2AF308C A: ~976AAA7D50312BA42B26CABCC23 A << F: ~4BB5553EA81895D21593655E6118000 A: ~976AAA7D50312BA42B26CABCC23 A << 10: ~976AAA7D50312BA42B26CABCC230000 A: ~976AAA7D50312BA42B26CABCC23 A << 11: ~12ED554FAA0625748564D95798460000 A: ~976AAA7D50312BA42B26CABCC23 A << 12: ~25DAAA9F540C4AE90AC9B2AF308C0000 A: 1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A & B: 1B87C1E83D20367AF092B07F692 A: 1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A | B: 1B87C1E83D20367AF092B07F692 A: 1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A ^ B: 0 A: ~1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A & B: 2 A: ~1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A | B: ~2 A: ~1B87C1E83D20367AF092B07F692 B: 1B87C1E83D20367AF092B07F692 A ^ B: ~4 A: 1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A & B: 2 A: 1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A | B: ~2 A: 1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A ^ B: ~4 A: ~1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A & B: ~1B87C1E83D20367AF092B07F692 A: ~1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A | B: ~1B87C1E83D20367AF092B07F692 A: ~1B87C1E83D20367AF092B07F692 B: ~1B87C1E83D20367AF092B07F692 A ^ B: 0 A: 1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A & B: 90380C8192010386090003F092 A: 1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A | B: 3BCFE3FC7FB077FAF8DEB8FF7DB A: 1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A ^ B: 32CC6334669067C2984EB8C0749 A: ~1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A & B: 2048221442904180084C088014A A: ~1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A | B: ~12844120240026429002B040601 A: ~1B87C1E83D20367AF092B07F692 B: 294BA2DC5BB051B868DC08BF1DB A ^ B: ~32CC6334669067C2984EB8C074B A: 1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A & B: 12844120240026429002B040600 A: 1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A | B: ~2048221442904180084C0880149 A: 1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A ^ B: ~32CC6334669067C2984EB8C0749 A: ~1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A & B: ~3BCFE3FC7FB077FAF8DEB8FF7DC A: ~1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A | B: ~90380C8192010386090003F091 A: ~1B87C1E83D20367AF092B07F692 B: ~294BA2DC5BB051B868DC08BF1DB A ^ B: 32CC6334669067C2984EB8C074B A: 1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A & B: A8540E82020164850009079002 A: 1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A | B: 13FD7D5FABD62777AF6DFB57FED6 A: 1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A ^ B: 1355295129D426132A6DF2506ED4 A: ~1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A & B: 12450141280424100064D0500846 A: ~1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A | B: ~110281001D002032A0922006692 A: ~1B87C1E83D20367AF092B07F692 B: 12ED554FAA0625748564D9579846 A ^ B: ~1355295129D426132A6DF2506ED8 A: 1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A & B: 110281001D002032A0922006692 A: 1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A | B: ~12450141280424100064D0500846 A: 1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A ^ B: ~1355295129D426132A6DF2506ED8 A: ~1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A & B: ~13FD7D5FABD62777AF6DFB57FED6 A: ~1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A | B: ~A8540E82020164850009079002 A: ~1B87C1E83D20367AF092B07F692 B: ~12ED554FAA0625748564D9579846 A ^ B: 1355295129D426132A6DF2506ED4 A: 1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A & B: 207C1603000026880102036400 A: 1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A | B: 1DFBFFFFFFDB3B6FEF1F6F07F6FB A: 1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A ^ B: 1DDB83E9FCDB3B49671E6D0492FB A: ~1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A & B: 1C4383E17C093808401644000068 A: ~1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A | B: ~198000880D20341270829049291 A: ~1B87C1E83D20367AF092B07F692 B: 1C63FFF77F09382EC81746036469 A ^ B: ~1DDB83E9FCDB3B49671E6D0492F9 A: 1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A & B: 198000880D20341270829049292 A: 1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A | B: ~1C4383E17C093808401644000069 A: 1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A ^ B: ~1DDB83E9FCDB3B49671E6D0492FB A: ~1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A & B: ~1DFBFFFFFFDB3B6FEF1F6F07F6FA A: ~1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A | B: ~207C1603000026880102036401 A: ~1B87C1E83D20367AF092B07F692 B: ~1C63FFF77F09382EC81746036469 A ^ B: 1DDB83E9FCDB3B49671E6D0492F9 A: 1B87C1E83D20367AF092B07F692 ! A: ~1B87C1E83D20367AF092B07F693 A: ~1B87C1E83D20367AF092B07F692 ! A: 1B87C1E83D20367AF092B07F691 A: ~1B87C1E83D20367AF092B07F692 A ~>> 0: ~1B87C1E83D20367AF092B07F692 A: ~1B87C1E83D20367AF092B07F692 A ~>> 1: ~DC3E0F41E901B3D7849583FB49 A: ~1B87C1E83D20367AF092B07F692 A ~>> 2: ~6E1F07A0F480D9EBC24AC1FDA5 A: ~1B87C1E83D20367AF092B07F692 A ~>> F: ~370F83D07A406CF5E125610 A: ~1B87C1E83D20367AF092B07F692 A ~>> 10: ~1B87C1E83D20367AF092B08 A: ~1B87C1E83D20367AF092B07F692 A ~>> 11: ~DC3E0F41E901B3D7849584 A: ~1B87C1E83D20367AF092B07F692 A ~>> 12: ~6E1F07A0F480D9EBC24AC2 A: ~1B87C1E83D20367AF092B07F692 A << 0: ~1B87C1E83D20367AF092B07F692 A: ~1B87C1E83D20367AF092B07F692 A << 1: ~370F83D07A406CF5E12560FED24 A: ~1B87C1E83D20367AF092B07F692 A << 2: ~6E1F07A0F480D9EBC24AC1FDA48 A: ~1B87C1E83D20367AF092B07F692 A << F: ~DC3E0F41E901B3D7849583FB490000 A: ~1B87C1E83D20367AF092B07F692 A << 10: ~1B87C1E83D20367AF092B07F6920000 A: ~1B87C1E83D20367AF092B07F692 A << 11: ~370F83D07A406CF5E12560FED240000 A: ~1B87C1E83D20367AF092B07F692 A << 12: ~6E1F07A0F480D9EBC24AC1FDA480000 A: 12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A & B: 12ED554FAA0625748564D9579846 A: 12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A | B: 12ED554FAA0625748564D9579846 A: 12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A ^ B: 0 A: ~12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A & B: 2 A: ~12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A | B: ~2 A: ~12ED554FAA0625748564D9579846 B: 12ED554FAA0625748564D9579846 A ^ B: ~4 A: 12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A & B: 2 A: 12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A | B: ~2 A: 12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A ^ B: ~4 A: ~12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A & B: ~12ED554FAA0625748564D9579846 A: ~12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A | B: ~12ED554FAA0625748564D9579846 A: ~12ED554FAA0625748564D9579846 B: ~12ED554FAA0625748564D9579846 A ^ B: 0 A: 12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A & B: 106155472A002024800440030040 A: 12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A | B: 1EEFFFFFFF0F3D7ECD77DF57FC6F A: 12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A ^ B: E8EAAB8D50F1D5A4D739F54FC2F A: ~12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A & B: C02AAB05509180A481306006428 A: ~12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A | B: ~28C000880060550056099549805 A: ~12ED554FAA0625748564D9579846 B: 1C63FFF77F09382EC81746036469 A ^ B: ~E8EAAB8D50F1D5A4D739F54FC2D A: 12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A & B: 28C000880060550056099549806 A: 12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A | B: ~C02AAB05509180A481306006429 A: 12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A ^ B: ~E8EAAB8D50F1D5A4D739F54FC2F A: ~12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A & B: ~1EEFFFFFFF0F3D7ECD77DF57FC6E A: ~12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A | B: ~106155472A002024800440030041 A: ~12ED554FAA0625748564D9579846 B: ~1C63FFF77F09382EC81746036469 A ^ B: E8EAAB8D50F1D5A4D739F54FC2D A: 12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A & B: 1020004C0A020400814450438802 A: 12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A | B: D2FFFF6FEE47BD75BF75DFD79B46 A: 12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A ^ B: C2DFFF23E445B9753E318F941344 A: ~12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A & B: C012AA20444198013A1106800302 A: ~12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A | B: ~2CD5503A0042174042089141046 A: ~12ED554FAA0625748564D9579846 B: D032AA6C4E439C01BB5556C38B02 A ^ B: ~C2DFFF23E445B9753E318F941348 A: 12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A & B: 2CD5503A0042174042089141046 A: 12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A | B: ~C012AA20444198013A1106800302 A: 12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A ^ B: ~C2DFFF23E445B9753E318F941348 A: ~12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A & B: ~D2FFFF6FEE47BD75BF75DFD79B46 A: ~12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A | B: ~1020004C0A020400814450438802 A: ~12ED554FAA0625748564D9579846 B: ~D032AA6C4E439C01BB5556C38B02 A ^ B: C2DFFF23E445B9753E318F941344 A: 12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A & B: 1049550220042000810000051002 A: 12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A | B: 13AEFFFEFFF676F769D64DB77D8C7 A: 12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A ^ B: 12AA6AAEDDF634F761C64DB72C8C5 A: ~12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A & B: 12802AAA055614A02180002204082 A: ~12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A | B: ~2A4004D8A0205740464D9528845 A: ~12ED554FAA0625748564D9579846 B: 1384BFFA275656A02990002255083 A ^ B: ~12AA6AAEDDF634F761C64DB72C8C7 A: 12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A & B: 2A4004D8A0205740464D9528844 A: 12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A | B: ~12802AAA055614A02180002204081 A: 12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A ^ B: ~12AA6AAEDDF634F761C64DB72C8C5 A: ~12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A & B: ~13AEFFFEFFF676F769D64DB77D8C8 A: ~12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A | B: ~1049550220042000810000051001 A: ~12ED554FAA0625748564D9579846 B: ~1384BFFA275656A02990002255083 A ^ B: 12AA6AAEDDF634F761C64DB72C8C7 A: 12ED554FAA0625748564D9579846 ! A: ~12ED554FAA0625748564D9579847 A: ~12ED554FAA0625748564D9579846 ! A: 12ED554FAA0625748564D9579845 A: ~12ED554FAA0625748564D9579846 A ~>> 0: ~12ED554FAA0625748564D9579846 A: ~12ED554FAA0625748564D9579846 A ~>> 1: ~976AAA7D50312BA42B26CABCC23 A: ~12ED554FAA0625748564D9579846 A ~>> 2: ~4BB5553EA81895D21593655E612 A: ~12ED554FAA0625748564D9579846 A ~>> F: ~25DAAA9F540C4AE90AC9B2B0 A: ~12ED554FAA0625748564D9579846 A ~>> 10: ~12ED554FAA0625748564D958 A: ~12ED554FAA0625748564D9579846 A ~>> 11: ~976AAA7D50312BA42B26CAC A: ~12ED554FAA0625748564D9579846 A ~>> 12: ~4BB5553EA81895D21593656 A: ~12ED554FAA0625748564D9579846 A << 0: ~12ED554FAA0625748564D9579846 A: ~12ED554FAA0625748564D9579846 A << 1: ~25DAAA9F540C4AE90AC9B2AF308C A: ~12ED554FAA0625748564D9579846 A << 2: ~4BB5553EA81895D21593655E6118 A: ~12ED554FAA0625748564D9579846 A << F: ~976AAA7D50312BA42B26CABCC230000 A: ~12ED554FAA0625748564D9579846 A << 10: ~12ED554FAA0625748564D95798460000 A: ~12ED554FAA0625748564D9579846 A << 11: ~25DAAA9F540C4AE90AC9B2AF308C0000 A: ~12ED554FAA0625748564D9579846 A << 12: ~4BB5553EA81895D21593655E61180000 A: 294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A & B: 294BA2DC5BB051B868DC08BF1DB A: 294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A | B: 294BA2DC5BB051B868DC08BF1DB A: 294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A ^ B: 0 A: ~294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A & B: 1 A: ~294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A | B: ~1 A: ~294BA2DC5BB051B868DC08BF1DB B: 294BA2DC5BB051B868DC08BF1DB A ^ B: ~2 A: 294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A & B: 1 A: 294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A | B: ~1 A: 294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A ^ B: ~2 A: ~294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A & B: ~294BA2DC5BB051B868DC08BF1DB A: ~294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A | B: ~294BA2DC5BB051B868DC08BF1DB A: ~294BA2DC5BB051B868DC08BF1DB B: ~294BA2DC5BB051B868DC08BF1DB A ^ B: 0 A: 294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A & B: 210B82D05A0040B0600400BE100 A: 294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A | B: 3F4FA3DC7BF07DFDE9FD68FFDFF A: 294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A ^ B: 1E44210C21F03D4D89F96841CFF A: ~294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A & B: 1604010020402C4581216040C24 A: ~294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A | B: ~840200C01B0110808D808010DB A: ~294BA2DC5BB051B868DC08BF1DB B: 370F83D07A406CF5E12560FED24 A ^ B: ~1E44210C21F03D4D89F96841CFF A: 294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A & B: 840200C01B0110808D808010D8 A: 294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A | B: ~1604010020402C4581216040C21 A: 294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A ^ B: ~1E44210C21F03D4D89F96841CF9 A: ~294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A & B: ~3F4FA3DC7BF07DFDE9FD68FFDFC A: ~294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A | B: ~210B82D05A0040B0600400BE103 A: ~294BA2DC5BB051B868DC08BF1DB B: ~370F83D07A406CF5E12560FED24 A ^ B: 1E44210C21F03D4D89F96841CF9 A: 294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A & B: BA254509000A800540036049 A: 294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A | B: 1EF7FFFFFFBB3D3FCE9FC68BF5FB A: 294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A ^ B: 1EF745DABAB23D354E9A868895B2 A: ~294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A & B: 1C6345D23A003824481206000421 A: ~294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A | B: ~294000880B20511068880889193 A: ~294BA2DC5BB051B868DC08BF1DB B: 1C63FFF77F09382EC81746036469 A ^ B: ~1EF745DABAB23D354E9A868895B4 A: 294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A & B: 294000880B20511068880889193 A: 294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A | B: ~1C6345D23A003824481206000421 A: 294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A ^ B: ~1EF745DABAB23D354E9A868895B4 A: ~294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A & B: ~1EF7FFFFFFBB3D3FCE9FC68BF5FB A: ~294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A | B: ~BA254509000A800540036049 A: ~294BA2DC5BB051B868DC08BF1DB B: ~1C63FFF77F09382EC81746036469 A ^ B: 1EF745DABAB23D354E9A868895B2 A: 294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A & B: 90AA0D440800090289808B3088 A: 294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A | B: 27DEBABFD5BF4FFB8ECDF2AFF1DF A: 294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A ^ B: 274E10B291B74FF28C447224C157 A: ~294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A & B: 254A009210044AE0084032240004 A: ~294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A | B: ~204102081B3051284044000C153 A: ~294BA2DC5BB051B868DC08BF1DB B: 25DAAA9F540C4AE90AC9B2AF308C A ^ B: ~274E10B291B74FF28C447224C157 A: 294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A & B: 204102081B3051284044000C150 A: 294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A | B: ~254A009210044AE0084032240001 A: 294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A ^ B: ~274E10B291B74FF28C447224C151 A: ~294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A & B: ~27DEBABFD5BF4FFB8ECDF2AFF1DC A: ~294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A | B: ~90AA0D440800090289808B308B A: ~294BA2DC5BB051B868DC08BF1DB B: ~25DAAA9F540C4AE90AC9B2AF308C A ^ B: 274E10B291B74FF28C447224C151 A: 294BA2DC5BB051B868DC08BF1DB ! A: ~294BA2DC5BB051B868DC08BF1DC A: ~294BA2DC5BB051B868DC08BF1DB ! A: 294BA2DC5BB051B868DC08BF1DA A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 0: ~294BA2DC5BB051B868DC08BF1DB A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 1: ~14A5D16E2DD828DC346E045F8EE A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 2: ~A52E8B716EC146E1A37022FC77 A: ~294BA2DC5BB051B868DC08BF1DB A ~>> F: ~529745B8B760A370D1B8118 A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 10: ~294BA2DC5BB051B868DC08C A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 11: ~14A5D16E2DD828DC346E046 A: ~294BA2DC5BB051B868DC08BF1DB A ~>> 12: ~A52E8B716EC146E1A37023 A: ~294BA2DC5BB051B868DC08BF1DB A << 0: ~294BA2DC5BB051B868DC08BF1DB A: ~294BA2DC5BB051B868DC08BF1DB A << 1: ~529745B8B760A370D1B8117E3B6 A: ~294BA2DC5BB051B868DC08BF1DB A << 2: ~A52E8B716EC146E1A37022FC76C A: ~294BA2DC5BB051B868DC08BF1DB A << F: ~14A5D16E2DD828DC346E045F8ED8000 A: ~294BA2DC5BB051B868DC08BF1DB A << 10: ~294BA2DC5BB051B868DC08BF1DB0000 A: ~294BA2DC5BB051B868DC08BF1DB A << 11: ~529745B8B760A370D1B8117E3B60000 A: ~294BA2DC5BB051B868DC08BF1DB A << 12: ~A52E8B716EC146E1A37022FC76C0000 A: 1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A & B: 1C63FFF77F09382EC81746036469 A: 1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A | B: 1C63FFF77F09382EC81746036469 A: 1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A ^ B: 0 A: ~1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A & B: 1 A: ~1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A | B: ~1 A: ~1C63FFF77F09382EC81746036469 B: 1C63FFF77F09382EC81746036469 A ^ B: ~2 A: 1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A & B: 1 A: 1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A | B: ~1 A: 1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A ^ B: ~2 A: ~1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A & B: ~1C63FFF77F09382EC81746036469 A: ~1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A | B: ~1C63FFF77F09382EC81746036469 A: ~1C63FFF77F09382EC81746036469 B: ~1C63FFF77F09382EC81746036469 A ^ B: 0 A: 1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A & B: 442AA9754080828080102032008 A: 1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A | B: 3DFBFFFF7F0D7AEFCADFF6AF74ED A: 1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A ^ B: 39B955682B0572C7C2DEF4AC54E5 A: ~1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A & B: 21980008000442C102C8B0AC1084 A: ~1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A | B: ~182155602B013006C01644004461 A: ~1C63FFF77F09382EC81746036469 B: 25DAAA9F540C4AE90AC9B2AF308C A ^ B: ~39B955682B0572C7C2DEF4AC54E5 A: 1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A & B: 182155602B013006C01644004460 A: 1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A | B: ~21980008000442C102C8B0AC1083 A: 1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A ^ B: ~39B955682B0572C7C2DEF4AC54E3 A: ~1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A & B: ~3DFBFFFF7F0D7AEFCADFF6AF74EC A: ~1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A | B: ~442AA9754080828080102032009 A: ~1C63FFF77F09382EC81746036469 B: ~25DAAA9F540C4AE90AC9B2AF308C A ^ B: 39B955682B0572C7C2DEF4AC54E3 A: 1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A & B: 1843FFA275012802880002014001 A: 1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A | B: 13C6BFFF77F6D7A2ED917462774EB A: 1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A ^ B: 1242800550A6C522C5117442634EA A: ~1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A & B: 12008000000644200110000241083 A: ~1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A | B: ~42000550A08102C401744022469 A: ~1C63FFF77F09382EC81746036469 B: 1384BFFA275656A02990002255083 A ^ B: ~1242800550A6C522C5117442634EC A: 1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A & B: 42000550A08102C401744022469 A: 1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A | B: ~12008000000644200110000241083 A: 1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A ^ B: ~1242800550A6C522C5117442634EC A: ~1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A & B: ~13C6BFFF77F6D7A2ED917462774EB A: ~1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A | B: ~1843FFA275012802880002014001 A: ~1C63FFF77F09382EC81746036469 B: ~1384BFFA275656A02990002255083 A ^ B: 1242800550A6C522C5117442634EA A: 1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A & B: 6154D01C013802400204030400 A: 1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A | B: 1BC67FFFFFF8F382FFEBFEF87766D A: 1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A ^ B: 1BC06AB2FE38E002DBEBDEB84726D A: ~1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A & B: 1A00400088086000136A8A9841204 A: ~1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A | B: ~1C02AB276308002C881542006069 A: ~1C63FFF77F09382EC81746036469 B: 1A06554D89C87380376AAAD871604 A ^ B: ~1BC06AB2FE38E002DBEBDEB84726D A: 1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A & B: 1C02AB276308002C881542006068 A: 1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A | B: ~1A00400088086000136A8A9841203 A: 1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A ^ B: ~1BC06AB2FE38E002DBEBDEB84726B A: ~1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A & B: ~1BC67FFFFFF8F382FFEBFEF87766C A: ~1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A | B: ~6154D01C013802400204030401 A: ~1C63FFF77F09382EC81746036469 B: ~1A06554D89C87380376AAAD871604 A ^ B: 1BC06AB2FE38E002DBEBDEB84726B A: 1C63FFF77F09382EC81746036469 ! A: ~1C63FFF77F09382EC8174603646A A: ~1C63FFF77F09382EC81746036469 ! A: 1C63FFF77F09382EC81746036468 A: ~1C63FFF77F09382EC81746036469 A ~>> 0: ~1C63FFF77F09382EC81746036469 A: ~1C63FFF77F09382EC81746036469 A ~>> 1: ~E31FFFBBF849C17640BA301B235 A: ~1C63FFF77F09382EC81746036469 A ~>> 2: ~718FFFDDFC24E0BB205D180D91B A: ~1C63FFF77F09382EC81746036469 A ~>> F: ~38C7FFEEFE12705D902E8C07 A: ~1C63FFF77F09382EC81746036469 A ~>> 10: ~1C63FFF77F09382EC8174604 A: ~1C63FFF77F09382EC81746036469 A ~>> 11: ~E31FFFBBF849C17640BA302 A: ~1C63FFF77F09382EC81746036469 A ~>> 12: ~718FFFDDFC24E0BB205D181 A: ~1C63FFF77F09382EC81746036469 A << 0: ~1C63FFF77F09382EC81746036469 A: ~1C63FFF77F09382EC81746036469 A << 1: ~38C7FFEEFE12705D902E8C06C8D2 A: ~1C63FFF77F09382EC81746036469 A << 2: ~718FFFDDFC24E0BB205D180D91A4 A: ~1C63FFF77F09382EC81746036469 A << F: ~E31FFFBBF849C17640BA301B2348000 A: ~1C63FFF77F09382EC81746036469 A << 10: ~1C63FFF77F09382EC817460364690000 A: ~1C63FFF77F09382EC81746036469 A << 11: ~38C7FFEEFE12705D902E8C06C8D20000 A: ~1C63FFF77F09382EC81746036469 A << 12: ~718FFFDDFC24E0BB205D180D91A40000 mlton-20100608/regression/int-inf.bitops.sml0000644000076600000240000000446511404435620017327 0ustar mtfstafffun pr i = (print (IntInf.fmt StringCvt.HEX i); print "\n") fun prBin oper a b c = (print " A: "; pr a; print " B: "; pr b; print ("A " ^ oper ^ " B: "); pr c) fun prUn oper a c = (print " A: "; pr a; print (oper ^ " A: "); pr c) fun prSh oper w a c = let val s = Word.fmt StringCvt.HEX w val sp = CharVector.tabulate(String.size s, fn _ => #" ") in print (" " ^ sp ^ "A: "); pr a; print ("A " ^ oper ^ " " ^ s ^ ": "); pr c end fun mkInt i n = if n = 0 then i else mkInt (IntInf.+ (IntInf.* (i, IntInf.fromInt 10),i)) (n - 1) val mkInt = fn i => fn n => mkInt (IntInf.fromInt i) n fun tryBin' (a, b) = let val _ = prBin "&" a b (IntInf.andb (a, b)) val _ = prBin "|" a b (IntInf.orb (a, b)) val _ = prBin "^" a b (IntInf.xorb (a, b)) in () end fun tryBin (a, b) = let val _ = tryBin' (a, b) val _ = tryBin' (IntInf.~ a, b) val _ = tryBin' (a, IntInf.~ b) val _ = tryBin' (IntInf.~ a, IntInf.~ b) in () end fun tryUn' a = let val _ = prUn "!" a (IntInf.notb a) in () end fun tryUn a = let val _ = tryUn' a val _ = tryUn' (IntInf.~ a) in () end fun trySh' a = let val _ = List.app (fn w => prSh "~>>" w a (IntInf.~>> (a, w))) [0wx0, 0wx1, 0wx2, 0wxF, 0wx10, 0wx11, 0wx12] val _ = List.app (fn w => prSh " <<" w a (IntInf.<< (a, w))) [0wx0, 0wx1, 0wx2, 0wxF, 0wx10, 0wx11, 0wx12] in () end fun trySh a = let (* val _ = trySh' a *) val _ = trySh' (IntInf.~ a) in () end fun loop (n', m') (n, m) = let fun loop' i = let fun loop'' j = if j > m then loop' (i + 1) else (tryBin (mkInt i j, mkInt i j); tryBin (mkInt i j, mkInt (i + 1) j); tryBin (mkInt i j, mkInt i (j + 1)); tryBin (mkInt i j, mkInt (i + 1) (j + 1)); tryUn (mkInt i j); trySh (mkInt i j); loop'' (j + 1)) in if i > n then () else loop'' m' end in loop' n' end val _ = loop (0, 0) (3, 3) val _ = loop (0, 8) (3, 10) val _ = loop (0, 20) (3, 22) val _ = loop (0, 30) (3, 31)mlton-20100608/regression/int-inf.compare.ok0000644000076600000240000000141511404435617017271 0ustar mtfstaffequal greater greater greater greater greater greater greater greater greater greater less equal greater greater greater greater greater greater greater greater greater less less equal greater greater greater greater greater greater greater greater less less less equal greater greater greater greater greater greater greater less less less less equal greater greater greater greater greater greater less less less less less equal greater greater greater greater greater less less less less less less equal greater greater greater greater less less less less less less less equal greater greater greater less less less less less less less less equal greater greater less less less less less less less less less equal greater less less less less less less less less less less equal mlton-20100608/regression/int-inf.compare.sml0000644000076600000240000000075711404435617017463 0ustar mtfstaffval l = [12345678901234567890, 1234567890, 1234, 12, 1, 0, ~1, ~12, ~1234, ~1234567890, ~12345678901234567890] val _ = List.app (fn i => List.app (fn i' => let val s = case IntInf.compare (i, i') of EQUAL => "equal" | GREATER => "greater" | LESS => "less" in print (concat [s, "\n"]) end) l) l mlton-20100608/regression/int-inf.log2.ok0000644000076600000240000000004111404435620016472 0ustar mtfstaff0 1 1 28 29 30 31 32 32 33 33 OK mlton-20100608/regression/int-inf.log2.sml0000644000076600000240000000104211404435617016664 0ustar mtfstaffval _ = List.app (fn i => print (concat [Int.toString (IntInf.log2 i), "\n"])) [1, 2, 3, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x100000000, 0x1FFFFFFFF, 0x200000000, 0x200000001] val _ = List.app (fn i => if i = IntInf.log2 (IntInf.pow (2, i)) andalso i = IntInf.log2 (IntInf.pow (2, i) + 1) andalso i - 1 = IntInf.log2 (IntInf.pow (2, i) - 1) then () else raise Fail "bug") (List.tabulate (100, fn i => i + 1)) val _ = print "OK\n" mlton-20100608/regression/int-overflow.ok0000644000076600000240000000001411404435617016725 0ustar mtfstaffOK OK OK OK mlton-20100608/regression/int-overflow.sml0000644000076600000240000000060611404435617017116 0ustar mtfstaffval _ = (Int.fromString "12345678901234567890" ; print "ERROR\n") handle Overflow => print "OK\n" val min = valOf Int.minInt val _ = (~ min ; print "ERROR\n") handle Overflow => print "OK\n" val _ = (Int.fromString "2147483648" ; print "ERROR\n") handle Overflow => print "OK\n" val _ = (abs min ; print "ERROR\n") handle Overflow => print "OK\n" mlton-20100608/regression/int.ok0000644000076600000240000000407511404435621015072 0ustar mtfstaff File int.sml: Testing structure Int... test1a OK test1b OK test1c OK test1d OK test2a OK test2b OK test2c OK test2d OK test3 OK test4 OK test5 OK test6 OK test12 OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK test13b OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK test14b OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK test15b OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK test16b OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK chk OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test17b OK test18 OK test19 OK test20 OK test21 OK test22 OK mlton-20100608/regression/int.sml0000644000076600000240000001551611404435621015256 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/int.sml -- here we test only the `exotic' operations PS 1995-02-25, 1996-07-02 *) (*KILL 05/11/1997 10:59. tho.: use "auxil.sml"; *) val _ = print "\nFile int.sml: Testing structure Int...\n" local open Int infix 7 quot rem fun divmod s (i, d, q, r) = tst s (i div d = q andalso i mod d = r); fun quotrem s (i, d, q, r) = tst s (i quot d = q andalso i rem d = r); in val test1a = divmod "test1a" (10, 3, 3, 1); val test1b = divmod "test1b" (~10, 3, ~4, 2); val test1c = divmod "test1c" (~10, ~3, 3, ~1); val test1d = divmod "test1d" (10, ~3, ~4, ~2); val test2a = quotrem "test2a" (10, 3, 3, 1); val test2b = quotrem "test2b" (~10, 3, ~3, ~1); val test2c = quotrem "test2c" (~10, ~3, 3, ~1); val test2d = quotrem "test2d" (10, ~3, ~3, 1); val test3 = tst "test3" (max(~5, 2) = 2 andalso max(5, 2) = 5); val test4 = tst "test4" (min(~5, 3) = ~5 andalso min(5, 2) = 2); val test5 = tst "test5" (sign ~57 = ~1 andalso sign 99 = 1 andalso sign 0 = 0); val test6 = tst "test6" (sameSign(~255, ~256) andalso sameSign(255, 256) andalso sameSign(0, 0)); val test12 = tst0 "test12" (case (minInt, maxInt) of (SOME mi, SOME ma) => check(sign mi = ~1 andalso sign ma = 1 andalso sameSign(mi, ~1) andalso sameSign(ma, 1)) | (NONE, NONE) => "OK" | _ => "WRONG") fun chk f (s, r) = tst' "chk" (fn _ => case f s of SOME res => res = r | NONE => false) fun chkScan fmt = chk (StringCvt.scanString (scan fmt)) val test13a = List.map (chk fromString) [("10789", 10789), ("+10789", 10789), ("~10789", ~10789), ("-10789", ~10789), (" \n\t10789crap", 10789), (" \n\t+10789crap", 10789), (" \n\t~10789crap", ~10789), (" \n\t-10789crap", ~10789), ("0w123", 0), ("0W123", 0), ("0x123", 0), ("0X123", 0), ("0wx123", 0), ("0wX123", 0)]; val test13b = List.map (fn s => tst0 "test13b" (case fromString s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1", "ff"]; val test14a = List.map (chkScan StringCvt.DEC) [("10789", 10789), ("+10789", 10789), ("~10789", ~10789), ("-10789", ~10789), (" \n\t10789crap", 10789), (" \n\t+10789crap", 10789), (" \n\t~10789crap", ~10789), (" \n\t-10789crap", ~10789), ("0w123", 0), ("0W123", 0), ("0x123", 0), ("0X123", 0), ("0wx123", 0), ("0wX123", 0)]; val test14b = List.map (fn s => tst0 "test14b" (case StringCvt.scanString (scan StringCvt.DEC) s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1", "ff"]; val test15a = List.map (chkScan StringCvt.BIN) [("10010", 18), ("+10010", 18), ("~10010", ~18), ("-10010", ~18), (" \n\t10010crap", 18), (" \n\t+10010crap", 18), (" \n\t~10010crap", ~18), (" \n\t-10010crap", ~18), ("0w101", 0), ("0W101", 0), ("0x101", 0), ("0X101", 0), ("0wx101", 0), ("0wX101", 0)]; val test15b = List.map (fn s => tst0 "test15b" (case StringCvt.scanString (scan StringCvt.BIN) s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1", "2", "8", "ff"]; val test16a = List.map (chkScan StringCvt.OCT) [("2071", 1081), ("+2071", 1081), ("~2071", ~1081), ("-2071", ~1081), (" \n\t2071crap", 1081), (" \n\t+2071crap", 1081), (" \n\t~2071crap", ~1081), (" \n\t-2071crap", ~1081), ("0w123", 0), ("0W123", 0), ("0x123", 0), ("0X123", 0), ("0wx123", 0), ("0wX123", 0)]; val test16b = List.map (fn s => tst0 "test16b" (case StringCvt.scanString (scan StringCvt.OCT) s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1", "8", "ff"]; val test17a = List.map (chkScan StringCvt.HEX) [("20Af", 8367), ("+20Af", 8367), ("~20Af", ~8367), ("-20Af", ~8367), (" \n\t20AfGrap", 8367), (" \n\t+20AfGrap", 8367), (" \n\t~20AfGrap", ~8367), (" \n\t-20AfGrap", ~8367), ("0w123", 0), ("0W123", 0), ("0x", 0), ("0x ", 0), ("0xG", 0), ("0X", 0), ("0XG", 0), ("0x123", 291), ("0X123", 291), ("-0x123", ~291), ("-0X123", ~291), ("~0x123", ~291), ("~0X123", ~291), ("+0x123", 291), ("+0X123", 291), ("0wx123", 0), ("0wX123", 0)]; val test17b = List.map (fn s => tst0 "test17b" (case StringCvt.scanString (scan StringCvt.HEX) s of NONE => "OK" | _ => "WRONG")) ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+ 1", "~ 1", "- 1"]; local fun fromToString i = fromString (toString i) = SOME i; fun scanFmt radix i = StringCvt.scanString (scan radix) (fmt radix i) = SOME i; in val test18 = tst' "test18" (fn _ => range (~1200, 1200) fromToString); val test19 = tst' "test19" (fn _ => range (~1200, 1200) (scanFmt StringCvt.BIN)); val test20 = tst' "test20" (fn _ => range (~1200, 1200) (scanFmt StringCvt.OCT)); val test21 = tst' "test21" (fn _ => range (~1200, 1200) (scanFmt StringCvt.DEC)); val test22 = tst' "test22" (fn _ => range (~1200, 1200) (scanFmt StringCvt.HEX)); end end mlton-20100608/regression/jump.ok0000644000076600000240000000032211404435617015247 0ustar mtfstaffbig big zero big big big one big big big two big big big three big big big four big big big five big big big six big big big seven big big big eight big big big nine big big big ten big big big big big big big mlton-20100608/regression/jump.sml0000644000076600000240000000052411404435620015427 0ustar mtfstaff fun doit 2 = "zero" | doit 6 = "one" | doit 10 = "two" | doit 14 = "three" | doit 18 = "four" | doit 22 = "five" | doit 26 = "six" | doit 30 = "seven" | doit 34 = "eight" | doit 38 = "nine" | doit 42 = "ten" | doit _ = "big" val l = List.tabulate(50,fn i => i) val _ = List.app (fn i => print ((doit i) ^ "\n")) l mlton-20100608/regression/kitdangle.ok0000644000076600000240000000000011404435620016221 0ustar mtfstaffmlton-20100608/regression/kitdangle.sml0000644000076600000240000000062311404435621016417 0ustar mtfstaff(*kitdangle.sml*) infix - + :: = (*fun op = (x: ''a, y: ''a): bool = prim ("=", "=", (x, y)) *) exception Hd fun hd (x::l) = x | hd [] = raise Hd fun mklist 0 = [] | mklist n = n :: mklist(n-1) fun cycle(p as (m,f)) = if m=0 then p else cycle(m-1, let val x = [(m, mklist 2000)] in fn () => #1(hd x) + f() end) val r = cycle(1000, fn() => 0); mlton-20100608/regression/kitdangle3.ok0000644000076600000240000000000011404435617016312 0ustar mtfstaffmlton-20100608/regression/kitdangle3.sml0000644000076600000240000000073511404435621016506 0ustar mtfstaff(*kitdangle3.sml*) infix - + :: = (*fun op = (x: ''a, y: ''a): bool = prim("=", "=", (x, y)) *) exception Hd fun hd (x::l) = x | hd [] = raise Hd fun mklist 0 = [] | mklist n = n :: mklist(n-1) fun cycle(p as (m,f)) = if m=0 then p else cycle(m-1, let val x = [(m, mklist 2000)] in fn () => #1(hd x) + f() end) val r = ((cycle(1000, fn() => 0);()), (cycle(1000, fn() => 0);()), (cycle(1000, fn() => 0);())) mlton-20100608/regression/kitfib35.ok0000644000076600000240000000000011404435621015700 0ustar mtfstaffmlton-20100608/regression/kitfib35.sml0000644000076600000240000000017511404435620016076 0ustar mtfstaff(*kitfib35.sml*) val _ = let infix + - < fun fib n = if n < 1 then 1 else fib (n-1) + fib (n-2) in fib 35; () end mlton-20100608/regression/kitkbjul9.ok0000644000076600000240000004452011404435621016207 0ustar mtfstaff1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) mlton-20100608/regression/kitkbjul9.sml0000644000076600000240000005510511404435617016377 0ustar mtfstaff(*kitkbjul9.sml*) (* kitknuth-bendixnewcopy.sml This is a revised version of knuth-bendix.sml in which (a) val has been converted to fun for function values (b) exceptions that carry values have been avoided (c) functions have been moved around to pass fewer of them as parameters (d) long tail-recursions have been broken into batches of 1, with user-programmed copying between the batches *) (* fun eq_integer (x: int, y: int): bool = prim ("=", "=", (x, y)) *) val eq_integer: int * int -> bool = op = (* fun eq_string (x: string, y: string): bool = prim("=", "=", (x, y)) *) val eq_string: string * string -> bool = op = (* signature KB = sig datatype term = Var of int | Term of string * term list datatype ordering = Greater | Equal | NotGE val rpo: (string -> string -> ordering) -> ((term * term -> ordering) -> term * term -> ordering) -> term * term -> ordering val lex_ext: (term * term -> ordering) -> term * term -> ordering val kb_complete: (term * term -> bool) -> (int * (int * (term * term))) list -> ('a * ('b * (term * term))) list -> unit include BMARK end; *) (* structure Main : KB = struct *) fun length l = let fun j(k, nil) = k | j(k, a::x) = j(k+1,x) in j(0,l) end fun op @ (nil, l) = l | op @ (a::r, l) = a :: (r@l) fun rev l = let fun f (nil, h) = h | f (a::r, h) = f(r, a::h) in f(l,nil) end fun app f = let fun app_rec [] = () | app_rec (a::L) = (f a; app_rec L) in app_rec end (* fun map f = let fun map_rec [] = [] | map_rec (a::L) = f a :: map_rec L in map_rec end *) (******* Quelques definitions du prelude CAML **************) exception Failure of string exception FailItList2 exception FailTryFind exception FailFind exception FailChange exception FailReplace exception FailMatching exception FailUnify exception FailPretty exception Fail exception FailMrewrite1 exception FailRemEQ exception FailMultExt exception FailLexExt exception FailKbComplettion fun failwith s = raise(Failure s) fun fst (x,y) = x and snd (x,y) = y (* fun it_list f = let fun it_rec a [] = a | it_rec a (b::L) = it_rec (f a b) L in it_rec end *) fun it_list f a [] = a | it_list f a (b::L) = it_list f (f a b) L fun it_list2 f = let fun it_rec a [] [] = a | it_rec a (a1::L1) (a2::L2) = it_rec (f a (a1,a2)) L1 L2 | it_rec _ _ _ = raise FailItList2 in it_rec end fun exists p = let fun exists_rec [] = false | exists_rec (a::L) = (p a) orelse (exists_rec L) in exists_rec end fun for_all p = let fun for_all_rec [] = true | for_all_rec (a::L) = (p a) andalso (for_all_rec L) in for_all_rec end fun rev_append [] L = L | rev_append (x::L1) L2 = rev_append L1 (x::L2) fun try_find f = let fun try_find_rec [] = raise FailTryFind | try_find_rec (a::L) = (f a) handle _ => try_find_rec L in try_find_rec end fun partition p = let fun part_rec [] = ([],[]) | part_rec (a::L) = let val (pos,neg) = part_rec L in if p a then ((a::pos), neg) else (pos, (a::neg)) end in part_rec end (* 3- Les ensembles et les listes d'association *) (* fun mem eq a = let fun mem_rec [] = false | mem_rec (b::L) = (eq(a,b)) orelse mem_rec L in mem_rec end *) fun mem eq a []= false | mem eq a (b::L) = eq(a,b) orelse mem eq a L fun union eq L1 L2 = let fun union_rec [] = L2 | union_rec (a::L) = if mem eq a L2 then union_rec L else a :: union_rec L in union_rec L1 end (* fun mem_assoc eq a = let fun mem_rec [] = false | mem_rec ((b,_)::L) = (eq(a,b)) orelse mem_rec L in mem_rec end *) fun mem_assoc eq a [] = false | mem_assoc eq a ((b,_)::L) = eq(a,b) orelse mem_assoc eq a L fun assoc eq a = let fun assoc_rec [] = raise FailFind | assoc_rec ((b,d)::L) = if eq(a,b) then d else assoc_rec L in assoc_rec end (* 4- Les sorties *) (* val print_string = String.print; *) (* Lars *) fun print_string x = print x (* val print_num = Integer.print; *) (* Lars *) local fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun string(n) = implode(digits(n,[])) in fun print_num n = print_string(string n) end (* fun print_newline () = String.print "\n"; *) (* Lars *) fun print_newline () = print "\n" (* fun message s = (String.print s; String.print "\n"); *) (* Lars *) fun message s = (print s; print "\n") (* 5- Les ensembles *) fun union eq L1 = let fun union_rec [] = L1 | union_rec (a::L) = if mem eq a L1 then union_rec L else a :: union_rec L in union_rec end (****************** Term manipulations *****************) datatype term = Var of int | Term of string * term list (* Lars, from now on: seek on eq_X to see what I have modified *) fun map' f ([]:term list) : term list = [] | map' f (term::terms) = f term :: map' f terms fun copy_term (Var n) = Var (n+0) | copy_term (Term(s, l)) = Term(s, map' copy_term l) fun eq_term x = (fn (Var i1, Var i2) => eq_integer(i1,i2) | (Term(s1,ts1),Term(s2,ts2)) => eq_string(s1,s2) andalso (eq_term_list(ts1,ts2)) | _ => false) x and eq_term_list x = (fn ([],[]) => true | (t1::ts1,t2::ts2) => eq_term(t1,t2) andalso eq_term_list(ts1,ts2) | _ => false) x fun vars (Var n) = [n] | vars (Term(_,L)) = vars_of_list L and vars_of_list [] = [] | vars_of_list (t::r) = union eq_integer (vars t) (vars_of_list r) (* fun substitute subst = let fun subst_rec (Term(oper,sons)) = Term(oper, map subst_rec sons) | subst_rec (t as (Var n)) = (assoc eq_integer n subst) handle _ => t in subst_rec end *) fun substitute subst (t as Term(oper,[])) = t | substitute subst (Term(oper,sons)) = Term(oper, map (substitute subst) sons) | substitute subst (t as (Var n)) = (assoc eq_integer n subst) handle _ => t fun change f = let fun change_rec (h::t) n = if eq_integer(n,1) then f h :: t else h :: change_rec t (n-1) | change_rec _ _ = raise FailChange in change_rec end (* Term replacement replace M u N => M[u<-N] *) fun replace M u N = let fun reprec (_, []) = N | reprec (Term(oper,sons), (n::u)) = Term(oper, change (fn P => reprec(P,u)) sons n) | reprec _ = raise FailReplace in reprec(M,u) end (* matching = - : (term -> term -> subst) *) fun matching term1 term2 = let fun match_rec subst (Var v, M) = if mem_assoc eq_integer v subst then if eq_term(M,assoc eq_integer v subst) then subst else raise FailMatching else (v,M) :: subst | match_rec subst (Term(op1,sons1), Term(op2,sons2)) = if eq_string(op1,op2) then it_list2 match_rec subst sons1 sons2 else raise FailMatching | match_rec _ _ = raise FailMatching in match_rec [] (term1,term2) end (* A naive unification algorithm *) fun compsubst subst1 subst2 = (map (fn (v,t) => (v, substitute subst1 t)) subst2) @ subst1 fun occurs n = let fun occur_rec (Var m) = eq_integer(m,n) | occur_rec (Term(_,sons)) = exists occur_rec sons in occur_rec end fun unify ((term1 as (Var n1)), term2) = if eq_term(term1,term2) then [] else if occurs n1 term2 then raise FailUnify else [(n1,term2)] | unify (term1, Var n2) = if occurs n2 term1 then raise FailUnify else [(n2,term1)] | unify (Term(op1,sons1), Term(op2,sons2)) = if eq_string(op1,op2) then it_list2 (fn s => fn (t1,t2) => compsubst (unify(substitute s t1, substitute s t2)) s) [] sons1 sons2 else raise FailUnify (* We need to print terms with variables independently from input terms obtained by parsing. We give arbitrary names v1,v2,... to their variables. *) val INFIXES = ["+","*"] fun pretty_term (Var n) = (print_string "v"; print_num n) | pretty_term (Term (oper,sons)) = if mem eq_string oper INFIXES then case sons of [s1,s2] => (pretty_close s1; print_string oper; pretty_close s2) | _ => raise FailPretty (* "pretty_term : infix arity <> 2"*) else (print_string oper; case sons of [] => () | t::lt =>(print_string "("; pretty_term t; app (fn t => (print_string ","; pretty_term t)) lt; print_string ")")) and pretty_close (M as Term(oper, _)) = if mem eq_string oper INFIXES then (print_string "("; pretty_term M; print_string ")") else pretty_term M | pretty_close M = pretty_term M (****************** Equation manipulations *************) (* standardizes an equation so its variables are 1,2,... *) fun mk_rule M N = let val all_vars = union eq_integer (vars M) (vars N) val (k,subst) = it_list (fn (i,sigma) => fn v => (i+1,(v,Var(i))::sigma)) (1,[]) all_vars in (k-1, (substitute subst M, substitute subst N)) end (* checks that rules are numbered in sequence and returns their number *) fun check_rules x = it_list (fn n => fn (k,_) => if eq_integer(k,n+1) then k else raise Fail (*failwith "Rule numbers not in sequence"*) ) 0 x fun pretty_rule (k,(n,(M,N))) = (print_num k; print_string " : "; pretty_term M; print_string " = "; pretty_term N; print_newline()) fun pretty_rules l = app pretty_rule l fun copy_rules [] = [] | copy_rules ((k,(n,(M,N)))::rest) = (k+0,(n+0,(copy_term M, copy_term N))):: copy_rules rest (****************** Rewriting **************************) (* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. With sigma = matching L M, we define the image of M by eq as sigma(R) *) fun reduce L M = substitute (matching L M) (* A more efficient version of can (rewrite1 (L,R)) for R arbitrary *) fun reducible L = let fun redrec M = (matching L M; true) handle _ => case M of Term(_,sons) => exists redrec sons | _ => false in redrec end (* mreduce : rules -> term -> term *) fun mreduce rules M = let fun redex (_,(_,(L,R))) = reduce L M R in try_find redex rules end (* One step of rewriting in leftmost-outermost strategy, with multiple rules *) (* fails if no redex is found *) (* mrewrite1 : rules -> term -> term *) fun mrewrite1 rules = let fun rewrec M = (mreduce rules M) handle _ => let fun tryrec [] = raise FailMrewrite1 (*failwith "mrewrite1"*) | tryrec (son::rest) = (rewrec son :: rest) handle _ => son :: tryrec rest in case M of Term(f, sons) => Term(f, tryrec sons) | _ => raise FailMrewrite1 (*failwith "mrewrite1"*) end in rewrec end (* Iterating rewrite1. Returns a normal form. May loop forever *) (* mrewrite_all : rules -> term -> term *) fun mrewrite_all rules M = let fun rew_loop M = rew_loop(mrewrite1 rules M) handle _ => M in rew_loop M end (* pretty_term (mrewrite_all Group_rules M where M,_=<>);; ==> A*U *) (************************ Recursive Path Ordering ****************************) datatype ordering = Greater | Equal | NotGE fun eq_ordering (Greater,Greater) = true (*lars *) | eq_ordering (Equal,Equal) = true | eq_ordering (NotGE,NotGE) = true | eq_ordering _ = false fun ge_ord order pair = case order pair of NotGE => false | _ => true and gt_ord order pair = case order pair of Greater => true | _ => false and eq_ord order pair = case order pair of Equal => true | _ => false fun rem_eq equiv = let fun remrec x [] = raise FailRemEQ (*failwith "rem_eq"*) | remrec x (y::l) = if equiv (x,y) then l else y :: remrec x l in remrec end fun diff_eq equiv (x,y) = let fun diffrec (p as ([],_)) = p | diffrec ((h::t), y) = diffrec (t,rem_eq equiv h y) handle _ => let val (x',y') = diffrec (t,y) in (h::x',y') end in if length x > length y then diffrec(y,x) else diffrec(x,y) end (* multiset extension of order *) fun mult_ext order (Term(_,sons1), Term(_,sons2)) = (case diff_eq (eq_ord order) (sons1,sons2) of ([],[]) => Equal | (l1,l2) => if for_all (fn N => exists (fn M => eq_ordering(order (M,N),Greater)) l1) l2 then Greater else NotGE) | mult_ext order (_, _) = raise FailMultExt (*failwith "mult_ext"*) (* lexicographic extension of order *) fun lex_ext order ((M as Term(_,sons1)), (N as Term(_,sons2))) = let fun lexrec ([] , []) = Equal | lexrec ([] , _ ) = NotGE | lexrec ( _ , []) = Greater | lexrec (x1::l1, x2::l2) = case order (x1,x2) of Greater => if for_all (fn N' => gt_ord order (M,N')) l2 then Greater else NotGE | Equal => lexrec (l1,l2) | NotGE => if exists (fn M' => ge_ord order (M',N)) l1 then Greater else NotGE in lexrec (sons1, sons2) end | lex_ext order _ = raise FailLexExt (*failwith "lex_ext"*) (* recursive path ordering *) fun Group_rules() = [ (1, (1, (Term("*", [Term("U",[]), Var 1]), Var 1))), (2, (1, (Term("*", [Term("I",[Var 1]), Var 1]), Term("U",[])))), (3, (3, (Term("*", [Term("*", [Var 1, Var 2]), Var 3]), Term("*", [Var 1, Term("*", [Var 2, Var 3])]))))] fun Geom_rules() = [ (1,(1,(Term ("*",[(Term ("U",[])), (Var 1)]),(Var 1)))), (2,(1,(Term ("*",[(Term ("I",[(Var 1)])), (Var 1)]),(Term ("U",[]))))), (3,(3,(Term ("*",[(Term ("*",[(Var 1), (Var 2)])), (Var 3)]), (Term ("*",[(Var 1), (Term ("*",[(Var 2), (Var 3)]))]))))), (4,(0,(Term ("*",[(Term ("A",[])), (Term ("B",[]))]), (Term ("*",[(Term ("B",[])), (Term ("A",[]))]))))), (5,(0,(Term ("*",[(Term ("C",[])), (Term ("C",[]))]),(Term ("U",[]))))), (6,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("A",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("I",[(Term ("A",[]))]))))), (7,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("B",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("B",[]))))) ] fun Group_rank "U" = 0 | Group_rank "*" = 1 | Group_rank "I" = 2 | Group_rank "B" = 3 | Group_rank "C" = 4 | Group_rank "A" = 5 | Group_rank _ = 100 (*added, to avoid non-exhaustive patter (mads) *) fun Group_precedence op1 op2 = let val r1 = Group_rank op1 val r2 = Group_rank op2 in if eq_integer(r1,r2) then Equal else if r1 > r2 then Greater else NotGE end fun rpo () = let fun rporec (M,N) = if eq_term(M,N) then Equal else case M of Var m => NotGE | Term(op1,sons1) => case N of Var n => if occurs n M then Greater else NotGE | Term(op2,sons2) => case (Group_precedence op1 op2) of Greater => if for_all (fn N' => gt_ord rporec (M,N')) sons2 then Greater else NotGE | Equal => lex_ext rporec (M,N) | NotGE => if exists (fn M' => ge_ord rporec (M',N)) sons1 then Greater else NotGE in rporec end fun Group_order x = rpo () x fun greater pair = case Group_order pair of Greater => true | _ => false (****************** Critical pairs *********************) (* All (u,sig) such that N/u (&var) unifies with M, with principal unifier sig *) fun super M = let fun suprec (N as Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (suprec son), n+1) val insides : (int list * (int*term)list)list = (*type constraint added (mads)*) fst (it_list collate ([],1) sons) in ([], unify(M,N)) :: insides handle _ => insides end | suprec _ = [] in suprec end (******************** Ex : let (M,_) = <> and (N,_) = <> in super M N;; ==> [[1],[2,Term ("B",[])]; x <- B [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B *) (* All (u,sigma), u&[], such that N/u unifies with M *) (* super_strict : term -> term -> (num list & subst) list *) fun super_strict M (Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (super M son), n+1) in fst (it_list collate ([],1) sons) end | super_strict _ _ = [] (* Critical pairs of L1=R1 with L2=R2 *) (* critical_pairs : term_pair -> term_pair -> term_pair list *) fun critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super L1 L2) end (* Strict critical pairs of L1=R1 with L2=R2 *) (* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) fun strict_critical_pairs (* r1908 *) (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in (* these applications of substitute put terms attop *) map mk_pair (super_strict L1 L2) end (* All critical pairs of eq1 with eq2 *) fun mutual_critical_pairs eq1 eq2 = (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) (* Renaming of variables *) fun rename n (t1,t2) = let fun ren_rec (Var k) = Var(k+n) | ren_rec (Term(oper,sons)) = Term(oper, map ren_rec sons) in (ren_rec t1, ren_rec t2) end (************************ Completion ******************************) fun deletion_message (k,_) = (print_string "Rule ";print_num k; message " deleted") (* Generate failure message *) fun non_orientable (M,N) = (pretty_term M; print_string " = "; pretty_term N; print_newline()) fun copy_termpairlist [] = [] | copy_termpairlist ((M,N)::rest) = (copy_term M, copy_term N):: copy_termpairlist rest fun copy_int_pair(x,y) = (x+0, y+0) fun copy_int_pair_list l = map copy_int_pair l fun copy_int (x) = x+0 fun copy_arg(interm:bool, n, rules, failures, p, eps) = (interm, n, copy_rules rules, copy_termpairlist failures, copy_int_pair p, copy_termpairlist eps) (* Improved Knuth-Bendix completion procedure *) (* kb_completion : num -> rules -> term_pair list -> (num & num) -> term_pair list -> rules *) fun kb_completion (* [r2225] *)(arg as (done,n, rules, list, (k,l), eps)) = let fun kbrec (* [r2272] *) count n rules = let fun normal_form x = mrewrite_all rules x fun get_rule k = assoc eq_integer k rules fun process failures = let fun processf (k,l) = let fun processkl [] = if k (true, n, rules, [], (k,l), failures) (* successful completion *) | _ => (message "Non-orientable equations :"; app non_orientable failures; raise FailKbComplettion (*failwith "kb_completion"*) )) | processkl ((M,N)::eqs) = let val M' = normal_form M val N' = normal_form N fun enter_rule(left,right) = let val new_rule = (n+1, mk_rule left right) in (pretty_rule new_rule; let fun left_reducible (_,(_,(L,_))) = reducible left L val (redl,irredl) = partition left_reducible rules in (app deletion_message redl; let fun right_reduce (m,(_,(L,R))) = (m,mk_rule L (mrewrite_all (new_rule::rules) R)); val irreds = map right_reduce irredl val eqs' = map (fn (_,(_,pair)) => pair) redl in if count>0 then (kbrec (count-1) ((n+1)) ((new_rule::irreds)) [] ((k,l)) ((eqs @ eqs' @ failures)) ) else (false,n+1, new_rule::irreds, [], (k,l), (eqs @ eqs' @ failures)) end) end) end in if eq_term(M',N') then processkl eqs else if greater(M',N') then enter_rule( M', N') else if greater(N',M') then enter_rule( N', M') else (process ( ((M', N')::failures)) ( (k,l)) ( eqs)) end in processkl end and next_criticals (k,l) = (let val (v,el) = get_rule l in if eq_integer(k,l) then processf (k,l) (strict_critical_pairs el (rename v el)) else (let val (_,ek) = get_rule k in processf (k,l) (mutual_critical_pairs el (rename v ek)) end handle FailFind (*rule k deleted*) => next_criticals (k+1,l)) end handle FailFind (*rule l deleted*) => next_criticals (1,l+1)) in processf end in process end fun kb_outer (* [r2517] *)(arg as (_, n, rules, failures, (k,l), other_failures)) = case kbrec 1 n rules failures (k,l) other_failures of result as (true,_, result_rules,_,_,_) => if false then arg else result | arg0 as (false, n', rules', failures', (k',l'), eqs') => kb_outer(let val arg1 = copy_arg arg0 in (*resetRegions arg0; *) copy_arg(arg1) end ) in (fn (_,_,x,_,_,_) => x)(kb_outer(arg)) end fun kb_complete complete_rules (* the terms in the complete_rules are global *) rules = let val n = check_rules complete_rules val eqs = map (fn (_,(_,pair)) => pair) rules (* letregion r2656 *) val completed_rules = (* the copying in the line below is to avoid that kb_completion is called with attop modes *) kb_completion(false,n+0, copy_rules complete_rules, [], (n+0,n+0), copy_termpairlist eqs) in (message "Canonical set found :"; pretty_rules (rev completed_rules); (* end r2683 *) ()) end fun doit() = kb_complete [] (* terms in list global *) (Geom_rules()) fun testit _ = () (* end (* Main *) *) val _ = (doit(); doit(); doit()); mlton-20100608/regression/kitlife35u.ok0000644000076600000240000000132311404435617016262 0ustar mtfstaff. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . starting printing 00 00 00 00 00 0 0 0 mlton-20100608/regression/kitlife35u.sml0000644000076600000240000002030211404435617016442 0ustar mtfstaff(*kitlife35u.sml*) (*based on kitlifeopt.sml, but with copying to avoid many generations in the same region*) local fun eq_integer (x: int, y: int): bool = x = y fun eq_string (x: string, y: string): bool = x = y fun eq_integer_curry(x)(y:int) =eq_integer(x,y) fun eq_int_pair_curry (x,x')(y,y'): bool = eq_integer(x,y) andalso eq_integer(x',y') fun app f [] = () | app f (x::xs) = (f x; app f xs) fun map f [] = [] | map f (a::x) = f a :: map f x fun map_rec(f, []) = [] | map_rec(f, x::xs) = f x:: map_rec(f, xs) exception ex_undefined of string fun error str = raise ex_undefined str fun accumulate f a [] = a (* this now has no escaping regions, although still an escaping arrow effect*) | accumulate f a (b::x) = accumulate f (f a b) x fun accumulate' (f, a, []) = a | accumulate' (f, a, b::x) = accumulate'(f, f(a,b), x) fun filter p l= rev (accumulate (fn x => fn a => if p a then a::x else x) [] l) (*builds an intermediate list; the regions of this list are now made local (unlike in escape.sml) *) fun equal a b = a=b fun exists p [] = false | exists p (a::x) = if p a then true else exists p x fun exists' (p, []) = false | exists' (p, (a::x)) = p a orelse exists'(p,x) fun member eq x a = exists' (eq a, x) fun C f x y = f y x fun cons a x = a::x fun revonto x y = accumulate' ((fn (x,y) => y::x), x, y) fun copy_int n = n+0 fun length x = copy_int(let fun count (n, a) = n+1 in accumulate'(count, 0, x) end) (* eta expanded*) fun repeat f = let (* rptf moved into inner let *) fun check n = if n<0 then error "repeat<0" else n in fn x => fn y => let fun rptf n x = if n=0 then x else rptf(n-1)(f x) in rptf (check x) y end end fun copy n x = repeat (cons x) n [] fun spaces n = implode (copy n #" ") fun copy_list[] = [] | copy_list((x,y)::rest) = (x+0,y+0):: copy_list rest fun lexless(a2,b2)(a1:int,b1:int) = if a2 0 | x::xs => 1 + length xs fun copy [] = [] | copy (x::xs) = x :: copy xs fun take(i,l) = case l of [] => [] | x::xs=> if i>0 then x::take(i-1,xs) else nil fun drop(i,l) = case l of [] => [] | x::xs => if i>0 then drop(i-1,xs) else l fun merge(lp as (left, right)) = case left of [] => right | x::xs => (case right of [] => left | y::ys => if lexless x y then x::merge(xs, right) else if lexless y x then y:: merge(left,ys) else (*x=y*) merge(xs, right) ) fun tmergesort l = case l of [] => [] | x::xs => (case xs of []=> l | _ => let val k = length l div 2 in merge(copy (tmergesort(take(k,l))), copy (tmergesort(drop(k,l)))) end ) fun lexordset x = tmergesort x fun collect f list = let fun accumf sofar [] = sofar | accumf sofar (a::x) = accumf (revonto sofar (f a)) x in accumf [] list (* note: this worked without changes!*) end fun occurs3 x = (* finds coords which occur exactly 3 times in coordlist x *) let fun f (q) = case q of (_,_,_,_,[]) => q | ( xover, x3, x2, x1, (a::x)) => if member eq_int_pair_curry xover a then f( xover, x3, x2, x1, x) else if member eq_int_pair_curry x3 a then f ((a::xover), x3, x2, x1, x) else if member eq_int_pair_curry x2 a then f (xover, (a::x3), x2, x1, x) else if member eq_int_pair_curry x1 a then f (xover, x3, (a::x2), x1, x) else f (xover, x3, x2, (a::x1), x) fun diff x y = filter (fn x => not(member eq_int_pair_curry y x)) x (* unfolded o *) val (xover, x3, _, _, _) = f ([],[],[],[],x) in diff x3 xover end fun copy_string s= implode(explode s) fun copy_bool true = true | copy_bool false = false fun neighbours (i,j) = [(i-1,j-1),(i-1,j),(i-1,j+1), (i,j-1),(i,j+1), (i+1,j-1),(i+1,j),(i+1,j+1)] abstype generation = GEN of (int*int) list with fun copy (GEN l) = GEN( copy_list l) fun alive (GEN livecoords) = livecoords and mkgen coordlist = GEN (lexordset coordlist) and mk_nextgen_fn gen = if true then let val living = alive gen fun isalive x = copy_bool(member eq_int_pair_curry living x) (* eta *) fun liveneighbours x = length( filter isalive ( neighbours x)) (*eta*) fun twoorthree n = eq_integer(n,2) orelse eq_integer(n,3) val survivors = copy_list(filter (twoorthree o liveneighbours) living) val newnbrlist = copy_list(collect (fn z => filter (fn x => not( isalive x)) ( neighbours z)) living) (* unfolded o twice*) val newborn = copy_list(occurs3 newnbrlist) in mkgen (survivors @ newborn) end else gen end local val xstart = 0 and ystart = 0 fun markafter n string = string ^ spaces n ^ "0" fun plotfrom (x,y) (* current position *) str (* current line being prepared -- a string *) ((x1,y1)::more) (* coordinates to be plotted *) = if eq_integer(x,x1) then (* same line so extend str and continue from y1+1 *) plotfrom(x,y1+1)(markafter(y1-y)str)more else (* flush current line and start a new line *) str :: plotfrom(x+1,ystart)""((x1,y1)::more) | plotfrom (x,y) str [] = [str] fun good (x,y) = x>=xstart andalso y>=ystart in fun plot coordlist = map_rec(copy_string,(plotfrom(xstart,ystart) "" (copy_list(filter good coordlist)))) end infix 6 at fun coordlist at (x:int,y:int) = let fun move(a,b) = (a+x,b+y) in map move coordlist end fun rotate x = map (fn (x:int,y:int) => (y,~x)) x (* eta converted*) val glider = [(0,0),(0,2),(1,1),(1,2),(2,1)] val bail = [(0,0),(0,1),(1,0),(1,1)] fun barberpole n = let fun f i = if eq_integer(i,n) then (n+n-1,n+n)::(n+n,n+n)::nil else (i+i,i+i+1)::(i+i+2,i+i+1)::f(i+1) in (0,0)::(1,0):: f 0 end val genB = mkgen(glider at (2,2) @ bail at (2,12) @ rotate (barberpole 4) at (5,20)) fun copy_whole_arg (p, g) = (copy_int p, copy g) fun nthgen'(p as(0,g)) = p | nthgen'(p as(i,g)) = (print ".\n"; nthgen' (copy_whole_arg(let val arg = (i-1,mk_nextgen_fn g) val arg' = copy_whole_arg arg in (*resetRegions arg; *) arg' end))) fun gun() = mkgen (* turned into function *) [(2,20),(3,19),(3,21),(4,18),(4,22),(4,23),(4,32),(5,7),(5,8),(5,18), (5,22),(5,23),(5,29),(5,30),(5,31),(5,32),(5,36),(6,7),(6,8),(6,18), (6,22),(6,23),(6,28),(6,29),(6,30),(6,31),(6,36),(7,19),(7,21),(7,28), (7,31),(7,40),(7,41),(8,20),(8,28),(8,29),(8,30),(8,31),(8,40),(8,41), (9,29),(9,30),(9,31),(9,32)] fun iter n = #2(nthgen'(n+0,gun())) fun pr x = print x fun show(x) = (pr "starting printing\n"; app (fn s => (pr s; pr "\n"))(plot(alive x)); () ) (* had to uncurry show, as iter 50 gave attop also made it return a different unit *) fun testit _ = show(iter 250) (* inserted call of iter *) val _ = testit () in val done = "done"; end mlton-20100608/regression/kitloop2.ok0000644000076600000240000000002211404435620016026 0ustar mtfstaff looping... done mlton-20100608/regression/kitloop2.sml0000644000076600000240000000102011404435617016215 0ustar mtfstaff(*kitloop2.sml*) (* A tail-recursive loop which gives stack overflow, unless one uses storage mode analsysis *) val x = let val N = 500 val I = 1000 type int_pair = int * int val maxint = 2000 val zero = (0,0) fun is_zero(0,0) = true | is_zero _ = false fun sub (m,n) = if n=0 then (m-1, maxint) else (m, n-1) fun loop (x as (m,n)) = if is_zero x then x else loop(sub x) fun loop' p = (loop p; "\ndone\n") in print "\nlooping...\n"; print (loop'(maxint,maxint)) end mlton-20100608/regression/kitmandelbrot.ok0000644000076600000240000000007111404435620017126 0ustar mtfstaff4194304 iterations 4194304 iterations 4194304 iterations mlton-20100608/regression/kitmandelbrot.sml0000644000076600000240000000420011404435621017307 0ustar mtfstaff(*kitmandelbrot.sml*) fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = implode(digits(n,[])) (* mandelbrot.sml *) (* structure Main : BMARK = struct *) val x_base = ~2.0 val y_base = 1.25 val side = 2.5 val sz = 2048 val maxCount = 1024 val delta = side / (real sz) val sum_iterations = ref 0 fun loop1 i = if (i >= sz) then () else let val c_im : real = y_base - (delta * real i) fun loop2 j = if (j >= sz) then () else let val c_re = x_base * (delta + real j) fun loop3 (count, z_re : real, z_im : real) = if (count < maxCount) then let val z_re_sq = z_re * z_re val z_im_sq = z_im * z_im in if ((z_re_sq + z_im_sq) > 4.0) then count else let val z_re_im = (z_re * z_im) in loop3 (count+1, (z_re_sq - z_im_sq) + c_re, z_re_im + z_re_im + c_im) end end (* loop3 *) else count val count = loop3 (0, c_re, c_im) in sum_iterations := !sum_iterations + 1(*count*); loop2 (j+1) end in loop2 0; loop1 (i+1) end fun doit () = (sum_iterations := 0; loop1 0) fun testit () = ( sum_iterations := 0; loop1 0; print(int_to_string(!sum_iterations) ^ " iterations\n")) (* end (* Mandelbrot *) *) (*val _ = (doit (); doit(); doit());*) val _ = (testit (); testit (); testit ()); (* this should give ``1084512 iterations'' *) mlton-20100608/regression/kitqsort.ok0000644000076600000240000000000411404435617016151 0ustar mtfstaffOk! mlton-20100608/regression/kitqsort.sml0000644000076600000240000000651611404435621016344 0ustar mtfstaff(*kitknuth_bendix36c.sml*) (* quicksort-random.sml * * Input....: Random list (pseudo-random integers) * Optimised: 'arg as ...' in quickSort'() and partition(). * Copying left-parts after partitioning inside quickSort'(). * `Bertelsen transformation' of argument to tail-recursive * call to quickSort'(). * * Sestoft & Bertelsen, December 1995 *) val _ = let fun map f nil = nil | map f (x :: L) = f x :: map f L fun rev l = let fun rev_rec(p as ([], acc)) = p | rev_rec(x::xs, acc) = rev_rec(xs, x::acc) in #2 (rev_rec(l,nil)) end fun length [] = 0 | length (x::xs) = 1 + length xs fun app f [] = () | app f (x::xs) = (f x; app f xs) (* Quicksort -- Paulson p. 98 and answer to exercise 3.29 *) (* Optimised for the Kit with Regions *) (* NOTE: * This is the most space efficient version of quicksort with the current * storage mode analysis (implemented in 25q); copyList() will be called "sat" * inside partition() and the `innermost' recursive call to quickSort'() will * be "atbot" for the regions holding right'. Unfortunately, calling * copyList() after (the `innermost' recursive call to) quickSort'() means * that we keep the regions holding the `original list' live during the * call to quickSort'(). This should not be necessary, since a::bs will be * copied (i.e. partitioned) into to left and right parts, but rules 28 and 26 * in the region analysis are a bit too conservative in this case... *) fun say(s) = print s type elem = int fun copyList [] = [] | copyList (x::xr) = x::(copyList xr) fun quickSort' (arg as ([], sorted)) = arg | quickSort' ([a], sorted) = ([], a::sorted) | quickSort' (a::bs, sorted) = (* "a" is the pivot *) let fun partition (arg as (_, _, []: elem list)) = arg | partition (left, right, x::xr) = if x<=a then partition(x::left, right, xr) else partition(left, x::right, xr) val arg' = let val (left', right) = let val (left, right, _) = partition([], [], bs) in (*forceResetting bs; *) (copyList left, right) end val sorted' = #2 (quickSort'(right, sorted)) in (left', a::sorted') end in quickSort' arg' end fun quickSort l = #2 (quickSort'(l, [])) (* Generating random numbers. Paulson, page 96 *) val min = 1 val max = 100000 val a = 16807.0 val m = 2147483647.0 val w = real(max - min)/m fun seed0() = 117.0 fun nextRand seed = let val t = a*seed in t - m*real(floor(t/m)) end fun randomList' (arg as (0, _, res)) = arg | randomList' (i, seed, res) = let val res' = min+floor(seed*w) :: res (* NOTE: It is significant to use seed for * calculating res' before calling nextRand()... *) in randomList'(i-1, nextRand seed, res') end fun randomList n = #3 (randomList'(n, seed0(), [])) (* Building input list, sorting it and testing the result *) fun isSorted [] = true | isSorted [x: elem] = true | isSorted (x::(xr as (y::yr))) = (x <= y) andalso (isSorted xr) in if isSorted (quickSort(randomList 100000)) then say("Ok!\n") else say("Oops...\n") end mlton-20100608/regression/kitreynolds2.ok0000644000076600000240000000000611404435617016724 0ustar mtfstafffalse mlton-20100608/regression/kitreynolds2.sml0000644000076600000240000000174511404435617017121 0ustar mtfstaff(*kitreynolds2.sml*) fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = implode(digits(n,[])) fun rev l = (* linear-time reversal of lists! *) let fun loop([], acc) = acc | loop(x::xs, acc) = loop(xs, x::acc) in loop(l, []) end fun foldR f b [] = b | foldR f b (x::xs) = f x (foldR f b xs) fun curry f x y = f(x,y) datatype 'a Option = None | Some of 'a datatype 'a tree = Lf | Br of 'a * 'a tree * 'a tree fun max(i:int, j) = if i>j then i else j fun search p Lf = false | search p (Br(x,t1,t2)) = if p x then true else search (fn y => y=x orelse p y) t1 orelse search (fn y => y=x orelse p y) t2 fun mk_tree 0 = Lf | mk_tree n = let val t = mk_tree(n-1) in Br(n,t,t) end val it = if search (fn _ => false) (mk_tree 20) then print "true\n" else print "false\n" mlton-20100608/regression/kitreynolds3.ok0000644000076600000240000000000611404435617016725 0ustar mtfstafffalse mlton-20100608/regression/kitreynolds3.sml0000644000076600000240000000201211404435617017106 0ustar mtfstaff(*kitreynolds3.sml*) fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = implode(digits(n,[])) fun rev l = (* linear-time reversal of lists! *) let fun loop([], acc) = acc | loop(x::xs, acc) = loop(xs, x::acc) in loop(l, []) end fun foldR f b [] = b | foldR f b (x::xs) = f x (foldR f b xs) fun curry f x y = f(x,y) datatype 'a Option = None | Some of 'a datatype 'a tree = Lf | Br of 'a * 'a tree * 'a tree fun max(i:int, j) = if i>j then i else j fun member(x,[]) = false | member(x,x'::rest) = x=x' orelse member(x, rest) fun search p Lf = false | search p (Br(x,t1,t2)) = if member(x,p) then true else search (x::p) t1 orelse search (x::p) t2 fun mk_tree 0 = Lf | mk_tree n = let val t = mk_tree(n-1) in Br(n,t,t) end val it = if search [] (mk_tree 20) then print "true\n" else print "false\n"; mlton-20100608/regression/kitsimple.ok0000644000076600000240000000060411404435617016300 0ustar mtfstaff.done make_velocity done make_position done make_area_density_volume done make_viscosity done make_temperature make_sigma:deltat = done make_sigma done make_cc done make_gamma done make_ab done make_theta done make_gamma done make_ab done make_theta done compute_heat_conduction done make_pressure done make_energy done compute_energy_error done compute_time_step 3072 ~61403 mlton-20100608/regression/kitsimple.sml0000644000076600000240000011430311404435617016464 0ustar mtfstaff(*kitsimple.sml*) exception Overflow fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = if n<0 then implode(#"~"::digits(~n,[])) else implode(digits(n,[])) exception Hd fun hd [] = raise Hd | hd (x::xs) = x (* structure Array = (* Interface as in SML/NJ *) struct *) infix sub type 'a array = 'a ref list exception Size exception Subscript fun tabulate' (i,f) = let fun tab j = if j < i then f j :: tab (j+1) else nil in if i < 0 then raise Size else (tab 0) end fun array (n, x) = tabulate' (n, fn _ => ref x) fun arrayoflist l = map ref l fun tabulate (n, f) = tabulate' (n, fn x => ref(f x)) fun sub'(nil,i) = raise Subscript | sub' (a::r,i) = if i > 0 then sub' (r,i-1) else if i < 0 then raise Subscript else a fun op sub (a, i) = !(sub'(a,i)) fun update (a, i, v) = sub'(a, i) := v fun length [] = 0 | length (x::xs) = 1 + length xs (* end (* Array *) *) (* structure List = (* Interface as in SML/NJ *) struct *) exception Nth and NthTail fun null [] = true | null _ = false (* this lenght overrides the one in Array, but that was also the case in the original lexgen.sml (see the order in the open declaration below) *) fun length [] = 0 | length (x::xs) = 1 + length xs fun rev l = (* linear-time reversal of lists! *) let fun loop([], acc) = acc | loop(x::xs, acc) = loop(xs, x::acc) in loop(l, []) end fun fold f [] b = b | fold f (x::xs) b = f(x,fold f xs b) fun revfold f [] b = b | revfold f (x::xs) b = revfold f xs (f(x,b)) fun app f [] = () | app f (x::xs) = (f x; app f xs) fun revapp f [] = () | revapp f (x::xs) = (revapp f xs; f x; ()) fun nth ([],_) = raise Nth | nth (x::xs,0) = x | nth (x::xs,k) = nth(xs,k-1) fun nthtail ([],_) = raise NthTail | nthtail (l,0) = l | nthtail (l::ls,n) = nthtail(ls,n-1) fun exists p [] = false | exists p (x::xs) = p x orelse exists p xs (* end; (* List *) *) (* structure Control = struct *) val trace = ref true (* end; *) (* structure Array2 : sig type 'a array2 exception Subscript val array: (int*int) * '1a -> '1a array2 val sub : 'a array2 * (int*int) -> 'a val update : 'a array2 * (int*int) * 'a -> unit val length : 'a array2 -> (int*int) end = struct *) type 'a array2 = {size : (int*int), value : 'a array} exception Subscript = Subscript fun index22 ((i1:int,i2:int),(s1,s2)) = if i1>=0 andalso i1=0 andalso i20 andalso endd>=start then let fun f x = if x > endd then () else (body x; f(x+delta)) in f start end else if endd<=start then let fun f x = if x < endd then () else (body x; f(x+delta)) in f start end else () fun from(n,m) = if n>m then [] else n::from(n+1,m) fun flatten [] = [] | flatten (x::xs) = x @ flatten xs fun pow(x:real,y:int) = if y=0 then 1.0 else x * pow(x,y-1) fun array2(bounds as ((l1,u1),(l2,u2)),v) = (array22((u1-l1+1, u2-l2+1),v), bounds) fun sub2((A,((lb1:int,ub1:int),(lb2:int,ub2:int))),(k,l)) = sub22(A, (k-lb1, l-lb2)) fun update2((A,((lb1,_),(lb2,_))),(k,l), v) = update22(A,(k-lb1,l-lb2),v) fun bounds2(_,b) = b fun printarray2 (A as (M:real array2,((l1,u1),(l2,u2)))) = for {from=l1,step=1,to=u1} (fn i => (print "["; for {from=l2,step=1,to=u2-1} (fn j => print ( (* makestring(sub2(A,(i,j))) ^ *) ", ")); print ( (* makestring (sub2(A,(i,u2))) ^ *) "]\n"))) fun array1((l,u),v) = (array(u-l+1,v),(l,u)) fun sub1((A,(l:int,u:int)),i:int) = (op sub)(A,i-l) fun update1((A,(l,_)),i,v) = update(A,i-l,v) fun bounds1(_,b) = b (* * Specification of the state variable computation *) val grid_size = ((2,grid_max), (2,grid_max)) fun north (k,l) = (k-1,l) fun south (k,l) = (k+1,l) fun east (k,l) = (k,l+1) fun west (k,l) = (k,l-1) val northeast = north o east val southeast = south o east val northwest = north o west val southwest = south o west type dir = int * int -> int * int val farnorth : dir = north o north val farsouth : dir = south o south val fareast : dir = east o east val farwest : dir = west o west fun zone_A(k,l) = (k,l) fun zone_B(k,l) = (k+1,l) fun zone_C(k,l) = (k+1,l+1) fun zone_D(k,l) = (k,l+1) val zone_corner_northeast = north val zone_corner_northwest = northwest fun zone_corner_southeast zone = zone val zone_corner_southwest = west val ((kmin,kmax),(lmin,lmax)) = grid_size val dimension_all_nodes = ((kmin-1,kmax+1),(lmin-1,lmax+1)) fun for_all_nodes f = for {from=kmin-1, step=1, to=kmax+1} (fn k => for {from=lmin-1, step=1, to=lmax+1} (fn l => f k l)) val dimension_interior_nodes = ((kmin,kmax),(lmin,lmax)) fun for_interior_nodes f = for {from=kmin, step=1, to=kmax} (fn k => for {from=lmin, step=1, to=lmax} (fn l => f k l)) val dimension_all_zones = ((kmin,kmax+1),(lmin,lmax+1)) fun for_all_zones f = for {from=kmin, step=1, to=kmax+1} (fn k => for {from=lmin, step=1, to=lmax+1} (fn l => f (k,l))) val dimension_interior_zones = ((kmin+1,kmax),(lmin+1,lmax)) fun for_interior_zones f = for {from=kmin+1, step=1, to=kmax} (fn k => for {from=lmin+1, step=1, to=lmax} (fn l => f (k,l))) fun map_interior_nodes f = flatten(map (fn k => (map (fn l => f (k,l)) (from(lmin,lmax)))) (from(kmin,kmax))) fun map_interior_zones f = flatten(map (fn k => (map (fn l => f (k,l)) (from(lmin+1,lmax)))) (from(kmin+1,kmax))) fun for_north_ward_interior_zones f = for {from=kmax, step= ~1, to=kmin+1} (fn k => for {from=lmin+1, step=1, to=lmax} (fn l => f (k,l))) fun for_west_ward_interior_zones f = for {from=kmin+1, step=1, to=kmax} (fn k => for {from=lmax, step= ~1, to=lmin+1} (fn l => f (k,l))) fun for_north_zones f = for {from=lmin, step=1, to=lmax+1} (fn l => f (kmin,l)) fun for_south_zones f = for {from=lmin+1, step=1, to=lmax} (fn l => f (kmax+1,l)) fun for_east_zones f = for {from=kmin+1, step=1, to=kmax+1}(fn k => f (k,lmax+1)) fun for_west_zones f = for {from=kmin+1, step=1, to=kmax+1}(fn k => f (k,lmin)) type 'a reflect_dir = int * int -> {size: int * int, value: 'a ref list} * ((int * int) * (int * int)) -> 'a fun reflect dir node A = sub2(A, dir node) val reflect_north : real reflect_dir = reflect north val reflect_south : real reflect_dir = reflect south val reflect_east : real reflect_dir = reflect east val reflect_west : real reflect_dir = reflect west fun for_north_nodes f = for {from=lmin, step=1, to=lmax-1} (fn l => f (kmin-1,l)) fun for_south_nodes f = for {from=lmin, step=1, to=lmax-1} (fn l => f (kmax+1,l)) fun for_east_nodes f = for {from=kmin, step=1, to=kmax-1} (fn k => f (k,lmax+1)) fun for_west_nodes f = for {from=kmin, step=1, to=kmax-1} (fn k => f (k,lmin-1)) val north_east_corner = (kmin-1,lmax+1) val north_west_corner = (kmin-1,lmin-1) val south_east_corner = (kmax+1,lmax+1) val south_west_corner = (kmax+1,lmin-1) val west_of_north_east = (kmin-1, lmax) val west_of_south_east = (kmax+1, lmax) val north_of_south_east = (kmax, lmax+1) val north_of_south_west = (kmax, lmin-1) (* * Initialization of parameters *) val constant_heat_source = 0.0 val deltat_maximum = 0.01 val specific_heat = 0.1 val p_coeffs = let val M = array2(((0,2),(0,2)), 0.0) in update2(M, (1,1), 0.06698); M end val e_coeffs = let val M = array2(((0,2),(0,2)), 0.0) in update2(M, (0,1), 0.1); M end val p_poly = array2(((1,4),(1,5)),p_coeffs) val e_poly = array2(((1,4),(1,5)), e_coeffs) val rho_table = let val V = array1((1,3), 0.0) in update1(V,2,1.0); update1(V,3,100.0); V end val theta_table = let val V = array1((1,4), 0.0) in update1(V,2,3.0); update1(V,3,300.0); update1(V,4,3000.0); V end val extract_energy_tables_from_constants = (e_poly,2,rho_table,theta_table) val extract_pressure_tables_from_constants = (p_poly,2,rho_table,theta_table) val nbc = let val M = array2(dimension_all_zones, 1) in for {from=lmin+1,step=1,to=lmax} (fn j => update2(M,(kmax+1, j),2)); update2(M,(kmin,lmin),4); update2(M,(kmin,lmax+1),4); update2(M,(kmax+1,lmin),4); update2(M,(kmax+1,lmax+1),4); M end val pbb = let val A = array1((1,4), 0.0) in update1(A,2,6.0); A end val pb = let val A = array1((1,4), 1.0) in update1(A,2,0.0); update1(A,3,0.0); A end val qb = pb val all_zero_nodes = array2(dimension_all_nodes, 0.0) val all_zero_zones = array2(dimension_all_zones, 0.0) (* * Positional Coordinates. (page 9-10) *) fun make_position_matrix interior_function = let val r' = array2(dimension_all_nodes, 0.0) val z' = array2(dimension_all_nodes, 0.0) fun boundary_position (rx,zx,ry,zy,ra,za) = let val (rax, zax) = (ra - rx, za - zx) val (ryx, zyx) = (ry - rx, zy - zx) val omega = 2.0*(rax*ryx + zax*zyx)/(ryx*ryx + zyx*zyx) val rb = rx - rax + omega*ryx val zb = zx - zax + omega*zyx in (rb, zb) end fun reflect_node (x_dir, y_dir, a_dir, node) = let val rx = reflect x_dir node r' val zx = reflect x_dir node z' val ry = reflect y_dir node r' val zy = reflect y_dir node z' val ra = reflect a_dir node r' val za = reflect a_dir node z' in boundary_position (rx, zx, ry, zy, ra, za) end fun u2 (rv,zv) n = (update2(r',n,rv); update2(z',n,zv)) in for_interior_nodes (fn k => fn l => u2 (interior_function (k,l)) (k,l)); for_north_nodes(fn n => u2 (reflect_node(south,southeast,farsouth,n)) n); for_south_nodes (fn n => u2(reflect_node(north,northeast,farnorth,n)) n); for_east_nodes (fn n => u2(reflect_node(west, southwest, farwest, n)) n); for_west_nodes (fn n => u2(reflect_node(east, southeast, fareast, n)) n); u2 (reflect_node(south, southwest, farsouth, west_of_north_east)) west_of_north_east; u2 (reflect_node(north, northwest, farnorth, west_of_south_east)) west_of_south_east; u2 (reflect_node(west, northwest, farwest, north_of_south_east)) north_of_south_east; u2 (reflect_node(east, northeast, fareast, north_of_south_west)) north_of_south_west; u2 (reflect_node(southwest, west, farwest, north_east_corner)) north_east_corner; u2 (reflect_node(northwest, west, farwest, south_east_corner)) south_east_corner; u2 (reflect_node(southeast, south, farsouth, north_west_corner)) north_west_corner; u2 (reflect_node(northeast, east, fareast, south_west_corner)) south_west_corner; (r',z') end (* * Physical Properties of a Zone (page 10) *) fun zone_area_vol ((r,z), zone) = let val (r1,z1)=(sub2(r,zone_corner_southwest zone), sub2(z,zone_corner_southwest zone)) val (r2,z2)=(sub2(r,zone_corner_southeast zone), sub2(z,zone_corner_southeast zone)) val (r3,z3)=(sub2(r,zone_corner_northeast zone), sub2(z,zone_corner_northeast zone)) val (r4,z4)=(sub2(r,zone_corner_northwest zone), sub2(z,zone_corner_northwest zone)) val area1 = (r2-r1)*(z3-z1) - (r3-r2)*(z3-z2) val radius1 = 0.3333 *(r1+r2+r3) val volume1 = area1 * radius1 val area2 = (r3-r1)*(z4-z3) - (r4-r3)*(z3-z1) val radius2 = 0.3333 *(r1+r3+r4) val volume2 = area2 * radius2 in (area1+area2, volume1+volume2) end (* * Velocity (page 8) *) fun make_velocity((u,w),(r,z),p,q,alpha,rho,delta_t: real) = let fun line_integral (p,z,node) : real = sub2(p,zone_A node)*(sub2(z,west node) - sub2(z,north node)) + sub2(p,zone_B node)*(sub2(z,south node) - sub2(z,west node)) + sub2(p,zone_C node)*(sub2(z,east node) - sub2(z,south node)) + sub2(p,zone_D node)*(sub2(z,north node) - sub2(z,east node)) fun regional_mass node = 0.5 * (sub2(rho, zone_A node)*sub2(alpha,zone_A node) + sub2(rho, zone_B node)*sub2(alpha,zone_B node) + sub2(rho, zone_C node)*sub2(alpha,zone_C node) + sub2(rho, zone_D node)*sub2(alpha,zone_D node)) fun velocity node = let val d = regional_mass node val n1 = ~(line_integral(p,z,node)) - line_integral(q,z,node) val n2 = line_integral(p,r,node) + line_integral(q,r,node) val u_dot = n1/d val w_dot = n2/d in (sub2(u,node)+delta_t*u_dot, sub2(w,node)+delta_t*w_dot) end val U = array2(dimension_interior_nodes,0.0) val W = array2(dimension_interior_nodes,0.0) in for_interior_nodes (fn k => fn l => let val (uv,wv) = velocity (k,l) in update2(U,(k,l),uv); update2(W,(k,l),wv) end); (U,W) end fun make_position ((r,z),delta_t:real,(u',w')) = let fun interior_position node = (sub2(r,node) + delta_t*sub2(u',node), sub2(z,node) + delta_t*sub2(w',node)) in make_position_matrix interior_position end fun make_area_density_volume(rho, s, x') = let val alpha' = array2(dimension_all_zones, 0.0) val s' = array2(dimension_all_zones, 0.0) val rho' = array2(dimension_all_zones, 0.0) fun interior_area zone = let val (area, vol) = zone_area_vol (x', zone) val density = sub2(rho,zone)*sub2(s,zone) / vol in (area,vol,density) end fun reflect_area_vol_density reflect_function = (reflect_function alpha',reflect_function s',reflect_function rho') fun update_asr (zone,(a,s,r)) = (update2(alpha',zone,a); update2(s',zone,s); update2(rho',zone,r)) fun r_area_vol_den (reflect_dir,zone) = let val asr = reflect_area_vol_density (reflect_dir zone) in update_asr(zone, asr) end in for_interior_zones (fn zone => update_asr(zone, interior_area zone)); for_south_zones (fn zone => r_area_vol_den(reflect_north, zone)); for_east_zones (fn zone => r_area_vol_den(reflect_west, zone)); for_west_zones (fn zone => r_area_vol_den(reflect_east, zone)); for_north_zones (fn zone => r_area_vol_den(reflect_south, zone)); (alpha', rho', s') end (* * Artifical Viscosity (page 11) *) fun make_viscosity(p,(u',w'),(r',z'), alpha',rho') = let fun interior_viscosity zone = let fun upper_del f = 0.5 * ((sub2(f,zone_corner_southeast zone) - sub2(f,zone_corner_northeast zone)) + (sub2(f,zone_corner_southwest zone) - sub2(f,zone_corner_northwest zone))) fun lower_del f = 0.5 * ((sub2(f,zone_corner_southeast zone) - sub2(f,zone_corner_southwest zone)) + (sub2(f,zone_corner_northeast zone) - sub2(f,zone_corner_northwest zone))) val xi = pow(upper_del r',2) + pow(upper_del z',2) val eta = pow(lower_del r',2) + pow(lower_del z',2) val upper_disc = (upper_del r')*(lower_del w') - (upper_del z')*(lower_del u') val lower_disc = (upper_del u')*(lower_del z') - (upper_del w') * (lower_del r') val upper_ubar = if upper_disc<0.0 then upper_disc/xi else 0.0 val lower_ubar = if lower_disc<0.0 then lower_disc/eta else 0.0 val gamma = 1.6 val speed_of_sound = gamma*sub2(p,zone)/sub2(rho',zone) val ubar = pow(upper_ubar,2) + pow(lower_ubar,2) val viscosity = sub2(rho',zone)*(1.5*ubar + 0.5*speed_of_sound*(Math.sqrt ubar)) val length = Math.sqrt(pow(upper_del r',2) + pow(lower_del r',2)) val courant_delta = 0.5* sub2(alpha',zone)/(speed_of_sound*length) in (viscosity, courant_delta) end val q' = array2(dimension_all_zones, 0.0) val d = array2(dimension_all_zones, 0.0) fun reflect_viscosity_cdelta (direction, zone) = sub2(q',direction zone) * sub1(qb, sub2(nbc,zone)) fun do_zones (dir,zone) = update2(q',zone,reflect_viscosity_cdelta (dir,zone)) in for_interior_zones (fn zone => let val (qv,dv) = interior_viscosity zone in update2(q',zone,qv); update2(d,zone,dv) end); for_south_zones (fn zone => do_zones(north,zone)); for_east_zones (fn zone => do_zones(west,zone)); for_west_zones (fn zone => do_zones(east,zone)); for_north_zones (fn zone => do_zones(south,zone)); (q', d) end (* * Pressure and Energy Polynomial (page 12) *) fun polynomial(G,degree,rho_table,theta_table,rho_value,theta_value) = let fun table_search (table, value : real) = let val (low, high) = bounds1 table fun search_down i = if value > sub1(table,i-1) then i else search_down (i-1) in if value>sub1(table,high) then high+1 else if value <= sub1(table,low) then low else search_down high end val rho_index = table_search(rho_table, rho_value) val theta_index = table_search(theta_table, theta_value) val A = sub2(G, (rho_index, theta_index)) fun from(n,m) = if n>m then [] else n::from(n+1,m) fun f(i,j) = sub2(A,(i,j))*pow(rho_value,i)*pow(theta_value,j) in sum_list (map (fn i => sum_list(map (fn j => f (i,j)) (from(0,degree)))) (from (0,degree))) end fun zonal_pressure (rho_value:real, theta_value:real) = let val (G,degree,rho_table,theta_table) = extract_pressure_tables_from_constants in polynomial(G, degree, rho_table, theta_table, rho_value, theta_value) end fun zonal_energy (rho_value, theta_value) = let val (G, degree, rho_table, theta_table) = extract_energy_tables_from_constants in polynomial(G, degree, rho_table, theta_table, rho_value, theta_value) end val dx = 0.000001 val tiny = 0.000001 fun newton_raphson (f,x) = let fun iter (x,fx) = if fx > tiny then let val fxdx = f(x+dx) val denom = fxdx - fx in if denom < tiny then iter(x,tiny) else iter(x-fx*dx/denom, fxdx) end else x in iter(x, f x) end (* * Temperature (page 13-14) *) fun make_temperature(p,epsilon,rho,theta,rho_prime,q_prime) = let fun interior_temperature zone = let val qkl = sub2(q_prime,zone) val rho_kl = sub2(rho,zone) val rho_prime_kl = sub2(rho_prime,zone) val tau_kl = (1.0 /rho_prime_kl - 1.0/rho_kl) fun energy_equation epsilon_kl theta_kl = epsilon_kl - zonal_energy(rho_kl,theta_kl) val epsilon_0 = sub2(epsilon,zone) fun revised_energy pkl = epsilon_0 - (pkl + qkl) * tau_kl fun revised_temperature epsilon_kl theta_kl = newton_raphson ((energy_equation epsilon_kl), theta_kl) fun revised_pressure theta_kl = zonal_pressure(rho_kl, theta_kl) val p_0 = sub2(p,zone) val theta_0 = sub2(theta,zone) val epsilon_1 = revised_energy p_0 val theta_1 = revised_temperature epsilon_1 theta_0 val p_1 = revised_pressure theta_1 val epsilon_2 = revised_energy p_1 val theta_2 = revised_temperature epsilon_2 theta_1 in theta_2 end val M = array2(dimension_all_zones, constant_heat_source) in for_interior_zones (fn zone => update2(M, zone, interior_temperature zone)); M end (* * Heat conduction *) fun make_cc(alpha_prime, theta_hat) = let fun interior_cc zone = (0.0001 * pow(sub2(theta_hat,zone),2) * (Math.sqrt (abs(sub2(theta_hat,zone)))) / sub2(alpha_prime,zone)) handle Sqrt => (print ("" (*Real.makestring (sub2(theta_hat, zone))*)); print ("\nzone =(" (* ^ makestring (#1 zone) *) ^ "," ^ (* makestring (#2 zone) ^ *) ")\n"); printarray2 theta_hat; raise Sqrt) val cc = array2(dimension_all_zones, 0.0) in for_interior_zones(fn zone => update2(cc,zone, interior_cc zone)); for_south_zones(fn zone => update2(cc,zone, reflect_north zone cc)); for_west_zones(fn zone => update2(cc,zone,reflect_east zone cc)); for_east_zones(fn zone => update2(cc,zone,reflect_west zone cc)); for_north_zones(fn zone => update2(cc,zone, reflect_south zone cc)); cc end fun make_sigma(deltat, rho_prime, alpha_prime) = let fun interior_sigma zone = sub2(rho_prime,zone)*sub2(alpha_prime,zone)*specific_heat/ deltat val M = array2(dimension_interior_zones, 0.0) fun ohandle zone = (print ( (* makestring (sub2(rho_prime, zone)) ^ *)" "); print ( (* makestring (sub2(alpha_prime, zone)) ^ *)" "); print ( (* makestring specific_heat ^ *) " "); print ( (* makestring deltat ^ *) "\n"); raise Overflow) in if !trace then print ("\t\tmake_sigma:deltat = " (* ^ makestring deltat *) ^ "\n") else (); (*** for_interior_zones(fn zone => update2(M,zone, interior_sigma zone)) **) for_interior_zones(fn zone => (update2(M,zone, interior_sigma zone) handle _ => (*old: Overflow => *) ohandle zone)); M end fun make_gamma ((r_prime,z_prime), cc, succeeding, adjacent) = let fun interior_gamma zone = let val r1 = sub2(r_prime, zone_corner_southeast zone) val z1 = sub2(z_prime, zone_corner_southeast zone) val r2 = sub2(r_prime, zone_corner_southeast (adjacent zone)) val z2 = sub2(z_prime, zone_corner_southeast (adjacent zone)) val cross_section = 0.5*(r1+r2)*(pow(r1 - r2,2)+pow(z1 - z2,2)) val (c1,c2) = (sub2(cc, zone), sub2(cc, succeeding zone)) val specific_conductivity = 2.0 * c1 * c2 / (c1 + c2) in cross_section * specific_conductivity end val M = array2(dimension_all_zones, 0.0) in for_interior_zones(fn zone => update2(M,zone,interior_gamma zone)); M end fun make_ab(theta, sigma, Gamma, preceding) = let val a = array2(dimension_all_zones, 0.0) val b = array2(dimension_all_zones, 0.0) fun interior_ab zone = let val denom = sub2(sigma, zone) + sub2(Gamma, zone) + sub2(Gamma, preceding zone) * (1.0 - sub2(a, preceding zone)) val nume1 = sub2(Gamma,zone) val nume2 = sub2(Gamma,preceding zone)*sub2(b,preceding zone) + sub2(sigma,zone) * sub2(theta,zone) in (nume1/denom, nume2 / denom) end val f = fn zone => update2(b,zone,sub2(theta,zone)) in for_north_zones f; for_south_zones f; for_west_zones f; for_east_zones f; for_interior_zones(fn zone => let val ab = interior_ab zone in update2(a,zone,#1 ab); update2(b,zone,#2 ab) end); (a,b) end fun make_theta (a, b, succeeding, int_zones) = let val theta = array2(dimension_all_zones, constant_heat_source) fun interior_theta zone = sub2(a,zone) * sub2(theta,succeeding zone)+ sub2(b,zone) in int_zones (fn (k,l) => update2(theta, (k,l), interior_theta (k,l))); theta end fun compute_heat_conduction(theta_hat, deltat, x', alpha', rho') = let val sigma = make_sigma(deltat, rho', alpha') val _ = if !trace then print "\tdone make_sigma\n" else () val cc = make_cc(alpha', theta_hat) val _ = if !trace then print "\tdone make_cc\n" else () val Gamma_k = make_gamma( x', cc, north, east) val _ = if !trace then print "\tdone make_gamma\n" else () val (a_k,b_k) = make_ab(theta_hat, sigma, Gamma_k, north) val _ = if !trace then print "\tdone make_ab\n" else () val theta_k = make_theta(a_k,b_k,south,for_north_ward_interior_zones) val _ = if !trace then print "\tdone make_theta\n" else () val Gamma_l = make_gamma(x', cc, west, south) val _ = if !trace then print "\tdone make_gamma\n" else () val (a_l,b_l) = make_ab(theta_k, sigma, Gamma_l, west) val _ = if !trace then print "\tdone make_ab\n" else () val theta_l = make_theta(a_l,b_l,east,for_west_ward_interior_zones) val _ = if !trace then print "\tdone make_theta\n" else () in (theta_l, Gamma_k, Gamma_l) end (* * Final Pressure and Energy calculation *) fun make_pressure(rho', theta') = let val p = array2(dimension_all_zones, 0.0) fun boundary_p(direction, zone) = sub1(pbb, sub2(nbc, zone)) + sub1(pb,sub2(nbc,zone)) * sub2(p, direction zone) in for_interior_zones (fn zone => update2(p,zone,zonal_pressure(sub2(rho',zone), sub2(theta',zone)))); for_south_zones(fn zone => update2(p,zone,boundary_p(north,zone))); for_east_zones(fn zone => update2(p,zone,boundary_p(west,zone))); for_west_zones(fn zone => update2(p,zone,boundary_p(east,zone))); for_north_zones(fn zone => update2(p,zone,boundary_p(south,zone))); p end fun make_energy(rho', theta') = let val epsilon' = array2(dimension_all_zones, 0.0) in for_interior_zones (fn zone => update2(epsilon', zone, zonal_energy(sub2(rho',zone), sub2(theta',zone)))); for_south_zones (fn zone => update2(epsilon',zone, reflect_north zone epsilon')); for_west_zones (fn zone => update2(epsilon',zone, reflect_east zone epsilon')); for_east_zones (fn zone => update2(epsilon',zone, reflect_west zone epsilon')); for_north_zones (fn zone => update2(epsilon',zone, reflect_south zone epsilon')); epsilon' end (* * Energy Error Calculation (page 20) *) fun compute_energy_error ((u',w'),(r',z'),p',q',epsilon',theta',rho',alpha', Gamma_k,Gamma_l,deltat) = let fun mass zone = sub2(rho',zone) * sub2(alpha',zone):real val internal_energy = sum_list (map_interior_zones (fn z => sub2(epsilon',z)*(mass z))) fun kinetic node = let val average_mass = 0.25*((mass (zone_A node)) + (mass (zone_B node)) + (mass (zone_C node)) + (mass (zone_D node))) val v_square = pow(sub2(u',node),2) + pow(sub2(w',node),2) in 0.5 * average_mass * v_square end val kinetic_energy = sum_list (map_interior_nodes kinetic) fun work_done (node1, node2) = let val (r1, r2) = (sub2(r',node1), sub2(r',node2)) val (z1, z2) = (sub2(z',node1), sub2(z',node2)) val (u1, u2) = (sub2(p',node1), sub2(p',node2)) val (w1, w2) = (sub2(z',node1), sub2(z',node2)) val (p1, p2) = (sub2(p',node1), sub2(p',node2)) val (q1, q2) = (sub2(q',node1), sub2(q',node2)) val force = 0.5*(p1+p2+q1+q2) val radius = 0.5* (r1+r2) val area = 0.5* ((r1-r2)*(u1-u2) - (z1-z2)*(w1-w2)) in force * radius * area * deltat end fun from(n,m) = if n > m then [] else n::from(n+1,m) val north_line = map (fn l => (west(kmin,l),(kmin,l))) (from(lmin+1,lmax)) val south_line = map (fn l => (west(kmax,l),(kmax,l))) (from(lmin+1,lmax)) val east_line = map (fn k => (south(k,lmax),(k,lmax))) (from(kmin+1,kmax)) val west_line = map (fn k => (south(k,lmin+1),(k,lmin+1))) (from(kmin+1,kmax)) val w1 = sum_list (map work_done north_line) val w2 = sum_list (map work_done south_line) val w3 = sum_list (map work_done east_line) val w4 = sum_list (map work_done west_line) val boundary_work = w1 + w2 + w3 + w4 fun heat_flow Gamma (zone1,zone2) = deltat * sub2(Gamma, zone1) * (sub2(theta',zone1) - sub2(theta',zone2)) val north_flow = let val k = kmin+1 in map (fn l => (north(k,l),(k,l))) (from(lmin+1,lmax)) end val south_flow = let val k = kmax in map (fn l => (south(k,l),(k,l))) (from(lmin+2,lmax-1)) end val east_flow = let val l = lmax in map (fn k => (east(k,l),(k,l))) (from(kmin+2,kmax)) end val west_flow = let val l = lmin+1 in map (fn k => (west(k,l),(k,l))) (from(kmin+2,kmax)) end val h1 = sum_list (map (heat_flow Gamma_k) north_flow) val h2 = sum_list (map (heat_flow Gamma_k) south_flow) val h3 = sum_list (map (heat_flow Gamma_l) east_flow) val h4 = sum_list (map (heat_flow Gamma_l) west_flow) val boundary_heat = h1 + h2 + h3 + h4 in internal_energy + kinetic_energy - boundary_heat - boundary_work end fun compute_time_step(d, theta_hat, theta') = let val deltat_courant = min_list (map_interior_zones (fn zone => sub2(d,zone))) val deltat_conduct = max_list (map_interior_zones (fn z => (abs(sub2(theta_hat,z) - sub2(theta', z))/ sub2(theta_hat,z)))) val deltat_minimum = min (deltat_courant, deltat_conduct) in min (deltat_maximum, deltat_minimum) end fun compute_initial_state () = let val v = (all_zero_nodes, all_zero_nodes) val x = let fun interior_position (k,l) = let val pi = 3.1415926535898 val rp = real (lmax - lmin) val z1 = real(10 + k - kmin) val zz = (~0.5 + real(l - lmin) / rp) * pi in (z1 * Math.cos zz, z1 * Math.sin zz) end in make_position_matrix interior_position end val (alpha,s) = let val (alpha_prime,s_prime) = let val A = array2(dimension_all_zones, 0.0) val S = array2(dimension_all_zones, 0.0) fun reflect_area_vol f = (f A, f S) fun u2 (f,z) = let val (a,s) = reflect_area_vol(f z) in update2(A,z,a); update2(S,z,s) end in for_interior_zones (fn z => let val (a,s) = zone_area_vol(x, z) in update2(A,z,a); update2(S,z,s) end); for_south_zones (fn z => u2 (reflect_north, z)); for_east_zones (fn z => u2 (reflect_west, z)); for_west_zones (fn z => u2 (reflect_east, z)); for_north_zones (fn z => u2 (reflect_south, z)); (A,S) end in (alpha_prime,s_prime) end val rho = let val R = array2(dimension_all_zones, 0.0) in for_all_zones (fn z => update2(R,z,1.4)); R end val theta = let val T = array2(dimension_all_zones, constant_heat_source) in for_interior_zones(fn z => update2(T,z,0.0001)); T end val p = make_pressure(rho, theta) val q = all_zero_zones val epsilon = make_energy(rho, theta) val deltat = 0.01 val c = 0.0 in (v,x,alpha,s,rho,p,q,epsilon,theta,deltat,c) end fun compute_next_state state = let val (v,x,alpha,s,rho,p,q,epsilon,theta,deltat,c) = state val v' = make_velocity (v, x, p, q, alpha, rho, deltat) val _ = if !trace then print "done make_velocity\n" else () val x' = make_position(x,deltat,v') handle _ => ( (* old: handle Overflow => *) printarray2 (#1 v'); printarray2 (#2 v'); raise Overflow) val _ = if !trace then print "done make_position\n" else () val (alpha',rho',s') = make_area_density_volume (rho, s , x') val _ = if !trace then print "done make_area_density_volume\n" else () val (q',d) = make_viscosity (p, v', x', alpha', rho') val _ = if !trace then print "done make_viscosity\n" else () val theta_hat = make_temperature (p, epsilon, rho, theta, rho', q') val _ = if !trace then print "done make_temperature\n" else () val (theta',Gamma_k,Gamma_l) = compute_heat_conduction (theta_hat, deltat, x', alpha', rho') val _ = if !trace then print "done compute_heat_conduction\n" else () val p' = make_pressure(rho', theta') val _ = if !trace then print "done make_pressure\n" else () val epsilon' = make_energy (rho', theta') val _ = if !trace then print "done make_energy\n" else () val c' = compute_energy_error (v', x', p', q', epsilon', theta', rho', alpha', Gamma_k, Gamma_l, deltat) val _ = if !trace then print "done compute_energy_error\n" else () val deltat' = compute_time_step (d, theta_hat, theta') val _ = if !trace then print "done compute_time_step\n\n" else () in (v',x',alpha',s',rho',p',q', epsilon',theta',deltat',c') end fun runit () = let fun iter (i,state) = if i = 0 then state else (print "."; iter(i-1, compute_next_state state)) in iter(step_count, compute_initial_state()) end fun print_state ((v1,v2),(r,z),alpha,s,rho,p,q,epsilon,theta,deltat,c) = ( print "Velocity matrices = \n"; printarray2 v1; print "\n\n"; printarray2 v2; print "\n\nPosition matrices = \n"; printarray2 r; print "\n\n"; printarray2 z; print "\n\nalpha = \n"; printarray2 alpha; print "\n\ns = \n"; printarray2 s; print "\n\nrho = \n"; printarray2 rho; print "\n\nPressure = \n"; printarray2 p; print "\n\nq = \n"; printarray2 q; print "\n\nepsilon = \n"; printarray2 epsilon; print "\n\ntheta = \n"; printarray2 theta; print ("delatat = " (* ^ Real.makestring deltat *) ^ "\n"); print ("c = " (* ^ Real.makestring c *) ^ "\n")) fun testit outstrm = print_state (runit()) fun doit () = let val (_, _, _, _, _, _, _, _, _, delta', c') = runit() val delta : int = floor (* truncate *) delta' val c : int = floor (* truncate *) (c' * 10000.0) val _ = print(int_to_string(c)) val _ = print("\n") val _ = print(int_to_string(delta)) val _ = print("\n") in if (c = 3072 andalso delta = ~61403) (* for grid_max = 30 *) (* (c = 6787 andalso delta = ~33093) *) then () else print("*** ERROR ***\n") (*old : IO.output (IO.std_err, "*** ERROR ***\n") *) end (* end; (* functor Simple *) structure Main = Simple(val grid_max=100 val step_count=1); *) val _ = doit(); mlton-20100608/regression/kittmergesort.ok0000644000076600000240000000007411404435620017175 0ustar mtfstaff List generated Doing tmergesort... Sorted 50000 numbers mlton-20100608/regression/kittmergesort.sml0000644000076600000240000000405311404435621017361 0ustar mtfstaff(*kittmergesort.sml*) (* This is tmergesort taken from Paulson's book , page 99 *) (* The merge function has been modified slightly, to traverse and rebuild both arguments fully, even when the one argument is empty. This ensures that both recursive calls of tmergesort in itself can put their results in regions local to the body of tmergesort. One can show that the maximum number of live list elements is 3n, where n is the number of elements to be sorted. For n=50000 this should give an approximate memory usage of 3 * 50.000 list elements * 5 words/list element * 4 bytes/word= 3Mb. The actual memory usage (run24d) is 4.5Mb. The remaining 1.5Mb is probably largely due to the fact that merge puts stuff on the stack (as it is not tail recursive). *) exception Take and Drop fun take(0, _ ) = [] | take(n, x::xs) = x::take(n-1, xs) | take(n, []) = raise Take fun drop(0, l) = l | drop(n, x::xs) = drop(n-1, xs) | drop(n, []) = raise Drop fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = implode(digits(n,[#"\n"])) fun snd(x,y) = y val a = 167 val m = 2147 fun nextrand(seed) = let val t = a*seed in t - (m*(t div m)) end fun randlist(n,seed,tail)= if n=0 then (seed,tail) else randlist(n-1, nextrand seed, seed::tail) fun length [] = 0 | length (_::xs) = 1+length xs fun merge([], ys) = (ys:int list)@[] | merge(xs, []) = xs @[] | merge(l as x::xs, r as y:: ys) = if x<= y then x::merge(xs, r) else y:: merge(l, ys) fun tmergesort [] = [] | tmergesort [x] = [x] | tmergesort xs = let val k = length xs div 2 in merge(tmergesort(take(k, xs)), tmergesort(drop(k, xs))) end val result = let val n = 50000 val xs = snd(randlist(n,1,[])) val _ = print "\n List generated\n" fun report msg = print(msg^"\n") in report "Doing tmergesort..."; tmergesort xs; report("Sorted " ^ int_to_string n ^ " numbers\n") end mlton-20100608/regression/kkb36c.ok0000644000076600000240000004452011404435620015361 0ustar mtfstaff1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) mlton-20100608/regression/kkb36c.sml0000644000076600000240000005745711404435617015566 0ustar mtfstaff(*kitknuth_bendix36c.sml*) (* kitknuth-bendixnewcopy.sml This is a revised version of knuth-bendix.sml in which (a) val has been converted to fun for function values (b) exceptions that carry values have been avoided (c) functions have been moved around to pass fewer of them as parameters (d) long tail-recursions have been broken into batches of 1, with user-programmed copying between the batches *) local fun eq_integer (x: int, y: int): bool = x = y fun eq_string (x: string, y: string): bool = x = y (* signature KB = sig datatype term = Var of int | Term of string * term list datatype ordering = Greater | Equal | NotGE val rpo: (string -> string -> ordering) -> ((term * term -> ordering) -> term * term -> ordering) -> term * term -> ordering val lex_ext: (term * term -> ordering) -> term * term -> ordering val kb_complete: (term * term -> bool) -> (int * (int * (term * term))) list -> ('a * ('b * (term * term))) list -> unit include BMARK end; *) (* structure Main : KB = struct *) fun length l = let fun j(k, nil) = k | j(k, a::x) = j(k+1,x) in j(0,l) end fun op @ (nil, l) = l | op @ (a::r, l) = a :: (r@l) fun rev l = let fun f (nil, h) = h | f (a::r, h) = f(r, a::h) in f(l,nil) end fun app f = let fun app_rec [] = () | app_rec (a::L) = (f a; app_rec L) in app_rec end (* fun map f = let fun map_rec [] = [] | map_rec (a::L) = f a :: map_rec L in map_rec end *) (******* Quelques definitions du prelude CAML **************) exception Failure of string exception FailItList2 exception FailTryFind exception FailFind exception FailChange exception FailReplace exception FailMatching exception FailUnify exception FailPretty exception Fail exception FailMrewrite1 exception FailRemEQ exception FailMultExt exception FailLexExt exception FailKbComplettion fun failwith s = raise(Failure s) fun fst (x,y) = x and snd (x,y) = y (* fun it_list f = let fun it_rec a [] = a | it_rec a (b::L) = it_rec (f a b) L in it_rec end *) fun it_list f a [] = a | it_list f a (b::L) = it_list f (f a b) L fun it_list2 f = let fun it_rec a [] [] = a | it_rec a (a1::L1) (a2::L2) = it_rec (f a (a1,a2)) L1 L2 | it_rec _ _ _ = raise FailItList2 in it_rec end fun exists p = let fun exists_rec [] = false | exists_rec (a::L) = (p a) orelse (exists_rec L) in exists_rec end fun for_all p = let fun for_all_rec [] = true | for_all_rec (a::L) = (p a) andalso (for_all_rec L) in for_all_rec end fun rev_append [] L = L | rev_append (x::L1) L2 = rev_append L1 (x::L2) fun try_find f = let fun try_find_rec [] = raise FailTryFind | try_find_rec (a::L) = (f a) handle _ => try_find_rec L in try_find_rec end fun partition p = let fun part_rec [] = ([],[]) | part_rec (a::L) = let val (pos,neg) = part_rec L in if p a then ((a::pos), neg) else (pos, (a::neg)) end in part_rec end (* 3- Les ensembles et les listes d'association *) (* fun mem eq a = let fun mem_rec [] = false | mem_rec (b::L) = (eq(a,b)) orelse mem_rec L in mem_rec end *) fun mem eq a []= false | mem eq a (b::L) = eq(a,b) orelse mem eq a L fun union eq L1 L2 = let fun union_rec [] = L2 | union_rec (a::L) = if mem eq a L2 then union_rec L else a :: union_rec L in union_rec L1 end (* fun mem_assoc eq a = let fun mem_rec [] = false | mem_rec ((b,_)::L) = (eq(a,b)) orelse mem_rec L in mem_rec end *) fun mem_assoc eq a [] = false | mem_assoc eq a ((b,_)::L) = eq(a,b) orelse mem_assoc eq a L fun assoc eq a = let fun assoc_rec [] = raise FailFind | assoc_rec ((b,d)::L) = if eq(a,b) then d else assoc_rec L in assoc_rec end (* 4- Les sorties *) (* val print_string = String.print; *) (* Lars *) fun print_string x = print x (* val print_num = Integer.print; *) (* Lars *) local fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun string(n) = implode(digits(n,[])) in fun print_num n = print_string(string n) end (* fun print_newline () = String.print "\n"; *) (* Lars *) fun print_newline () = print "\n" (* fun message s = (String.print s; String.print "\n"); *) (* Lars *) fun message s = (print s; print "\n") (* 5- Les ensembles *) fun union eq L1 = let fun union_rec [] = L1 | union_rec (a::L) = if mem eq a L1 then union_rec L else a :: union_rec L in union_rec end (****************** Term manipulations *****************) datatype term = Var of int | Term of string * term list (* Lars, from now on: seek on eq_X to see what I have modified *) fun map' f ([]:term list) : term list = [] | map' f (term::terms) = f term :: map' f terms fun copy_term (Var n) = Var (n+0) | copy_term (Term(s, l)) = Term(s, map' copy_term l) fun eq_term x = (fn (Var i1, Var i2) => eq_integer(i1,i2) | (Term(s1,ts1),Term(s2,ts2)) => eq_string(s1,s2) andalso (eq_term_list(ts1,ts2)) | _ => false) x and eq_term_list x = (fn ([],[]) => true | (t1::ts1,t2::ts2) => eq_term(t1,t2) andalso eq_term_list(ts1,ts2) | _ => false) x fun vars (Var n) = [n] | vars (Term(_,L)) = vars_of_list L and vars_of_list [] = [] | vars_of_list (t::r) = union eq_integer (vars t) (vars_of_list r) (* fun substitute subst = let fun subst_rec (Term(oper,sons)) = Term(oper, map subst_rec sons) | subst_rec (t as (Var n)) = (assoc eq_integer n subst) handle _ => t in subst_rec end *) fun substitute subst (t as Term(oper,[])) = t | substitute subst (Term(oper,sons)) = Term(oper, map (substitute subst) sons) | substitute subst (t as (Var n)) = (assoc eq_integer n subst) handle _ => t fun change f = let fun change_rec (h::t) n = if eq_integer(n,1) then f h :: t else h :: change_rec t (n-1) | change_rec _ _ = raise FailChange in change_rec end (* Term replacement replace M u N => M[u<-N] *) fun replace M u N = let fun reprec (_, []) = N | reprec (Term(oper,sons), (n::u)) = Term(oper, change (fn P => reprec(P,u)) sons n) | reprec _ = raise FailReplace in reprec(M,u) end (* matching = - : (term -> term -> subst) *) fun matching term1 term2 = let fun match_rec subst (Var v, M) = if mem_assoc eq_integer v subst then if eq_term(M,assoc eq_integer v subst) then subst else raise FailMatching else (v,M) :: subst | match_rec subst (Term(op1,sons1), Term(op2,sons2)) = if eq_string(op1,op2) then it_list2 match_rec subst sons1 sons2 else raise FailMatching | match_rec _ _ = raise FailMatching in match_rec [] (term1,term2) end (* A naive unification algorithm *) fun compsubst subst1 subst2 = (map (fn (v,t) => (v, substitute subst1 t)) subst2) @ subst1 fun occurs n = let fun occur_rec (Var m) = eq_integer(m,n) | occur_rec (Term(_,sons)) = exists occur_rec sons in occur_rec end fun unify ((term1 as (Var n1)), term2) = if eq_term(term1,term2) then [] else if occurs n1 term2 then raise FailUnify else [(n1,term2)] | unify (term1, Var n2) = if occurs n2 term1 then raise FailUnify else [(n2,term1)] | unify (Term(op1,sons1), Term(op2,sons2)) = if eq_string(op1,op2) then it_list2 (fn s => fn (t1,t2) => compsubst (unify(substitute s t1, substitute s t2)) s) [] sons1 sons2 else raise FailUnify (* We need to print terms with variables independently from input terms obtained by parsing. We give arbitrary names v1,v2,... to their variables. *) val INFIXES = ["+","*"] fun pretty_term (Var n) = (print_string "v"; print_num n) | pretty_term (Term (oper,sons)) = if mem eq_string oper INFIXES then case sons of [s1,s2] => (pretty_close s1; print_string oper; pretty_close s2) | _ => raise FailPretty (* "pretty_term : infix arity <> 2"*) else (print_string oper; case sons of [] => () | t::lt =>(print_string "("; pretty_term t; app (fn t => (print_string ","; pretty_term t)) lt; print_string ")")) and pretty_close (M as Term(oper, _)) = if mem eq_string oper INFIXES then (print_string "("; pretty_term M; print_string ")") else pretty_term M | pretty_close M = pretty_term M (****************** Equation manipulations *************) (* standardizes an equation so its variables are 1,2,... *) fun mk_rule M N = let val all_vars = union eq_integer (vars M) (vars N) val (k,subst) = it_list (fn (i,sigma) => fn v => (i+1,(v,Var(i))::sigma)) (1,[]) all_vars in (k-1, (substitute subst M, substitute subst N)) end (* checks that rules are numbered in sequence and returns their number *) fun check_rules x = it_list (fn n => fn (k,_) => if eq_integer(k,n+1) then k else raise Fail (*failwith "Rule numbers not in sequence"*) ) 0 x fun pretty_rule (k,(n,(M,N))) = (print_num k; print_string " : "; pretty_term M; print_string " = "; pretty_term N; print_newline()) fun pretty_rules l = app pretty_rule l fun copy_rules [] = [] | copy_rules ((k,(n,(M,N)))::rest) = (k+0,(n+0,(copy_term M, copy_term N))):: copy_rules rest (****************** Rewriting **************************) (* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. With sigma = matching L M, we define the image of M by eq as sigma(R) *) fun reduce L M = substitute (matching L M) (* A more efficient version of can (rewrite1 (L,R)) for R arbitrary *) fun reducible L = let fun redrec M = (matching L M; true) handle _ => case M of Term(_,sons) => exists redrec sons | _ => false in redrec end (* mreduce : rules -> term -> term *) fun mreduce rules M = let fun redex (_,(_,(L,R))) = reduce L M R in try_find redex rules end (* One step of rewriting in leftmost-outermost strategy, with multiple rules *) (* fails if no redex is found *) (* mrewrite1 : rules -> term -> term *) fun mrewrite1 rules = let fun rewrec M = (mreduce rules M) handle _ => let fun tryrec [] = raise FailMrewrite1 (*failwith "mrewrite1"*) | tryrec (son::rest) = (rewrec son :: rest) handle _ => son :: tryrec rest in case M of Term(f, sons) => Term(f, tryrec sons) | _ => raise FailMrewrite1 (*failwith "mrewrite1"*) end in rewrec end (* Iterating rewrite1. Returns a normal form. May loop forever *) (* mrewrite_all : rules -> term -> term *) fun mrewrite_all rules M = let fun rew_loop M = rew_loop(mrewrite1 rules M) handle _ => M in rew_loop M end (* pretty_term (mrewrite_all Group_rules M where M,_=<>);; ==> A*U *) (************************ Recursive Path Ordering ****************************) datatype ordering = Greater | Equal | NotGE fun eq_ordering (Greater,Greater) = true (*lars *) | eq_ordering (Equal,Equal) = true | eq_ordering (NotGE,NotGE) = true | eq_ordering _ = false fun ge_ord order pair = case order pair of NotGE => false | _ => true and gt_ord order pair = case order pair of Greater => true | _ => false and eq_ord order pair = case order pair of Equal => true | _ => false fun rem_eq equiv = let fun remrec x [] = raise FailRemEQ (*failwith "rem_eq"*) | remrec x (y::l) = if equiv (x,y) then l else y :: remrec x l in remrec end fun diff_eq equiv (x,y) = let fun diffrec (p as ([],_)) = p | diffrec ((h::t), y) = diffrec (t,rem_eq equiv h y) handle _ => let val (x',y') = diffrec (t,y) in (h::x',y') end in if length x > length y then diffrec(y,x) else diffrec(x,y) end (* multiset extension of order *) fun mult_ext order (Term(_,sons1), Term(_,sons2)) = (case diff_eq (eq_ord order) (sons1,sons2) of ([],[]) => Equal | (l1,l2) => if for_all (fn N => exists (fn M => eq_ordering(order (M,N),Greater)) l1) l2 then Greater else NotGE) | mult_ext order (_, _) = raise FailMultExt (*failwith "mult_ext"*) (* lexicographic extension of order *) fun lex_ext order ((M as Term(_,sons1)), (N as Term(_,sons2))) = let fun lexrec ([] , []) = Equal | lexrec ([] , _ ) = NotGE | lexrec ( _ , []) = Greater | lexrec (x1::l1, x2::l2) = case order (x1,x2) of Greater => if for_all (fn N' => gt_ord order (M,N')) l2 then Greater else NotGE | Equal => lexrec (l1,l2) | NotGE => if exists (fn M' => ge_ord order (M',N)) l1 then Greater else NotGE in lexrec (sons1, sons2) end | lex_ext order _ = raise FailLexExt (*failwith "lex_ext"*) (* recursive path ordering *) fun Group_rules() = [ (1, (1, (Term("*", [Term("U",[]), Var 1]), Var 1))), (2, (1, (Term("*", [Term("I",[Var 1]), Var 1]), Term("U",[])))), (3, (3, (Term("*", [Term("*", [Var 1, Var 2]), Var 3]), Term("*", [Var 1, Term("*", [Var 2, Var 3])]))))] fun Geom_rules() = [ (1,(1,(Term ("*",[(Term ("U",[])), (Var 1)]),(Var 1)))), (2,(1,(Term ("*",[(Term ("I",[(Var 1)])), (Var 1)]),(Term ("U",[]))))), (3,(3,(Term ("*",[(Term ("*",[(Var 1), (Var 2)])), (Var 3)]), (Term ("*",[(Var 1), (Term ("*",[(Var 2), (Var 3)]))]))))), (4,(0,(Term ("*",[(Term ("A",[])), (Term ("B",[]))]), (Term ("*",[(Term ("B",[])), (Term ("A",[]))]))))), (5,(0,(Term ("*",[(Term ("C",[])), (Term ("C",[]))]),(Term ("U",[]))))), (6,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("A",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("I",[(Term ("A",[]))]))))), (7,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("B",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("B",[]))))) ] fun Group_rank "U" = 0 | Group_rank "*" = 1 | Group_rank "I" = 2 | Group_rank "B" = 3 | Group_rank "C" = 4 | Group_rank "A" = 5 | Group_rank _ = 100 (*added, to avoid non-exhaustive patter (mads) *) fun Group_precedence op1 op2 = let val r1 = Group_rank op1 val r2 = Group_rank op2 in if eq_integer(r1,r2) then Equal else if r1 > r2 then Greater else NotGE end fun rpo () = let fun rporec (M,N) = if eq_term(M,N) then Equal else case M of Var m => NotGE | Term(op1,sons1) => case N of Var n => if occurs n M then Greater else NotGE | Term(op2,sons2) => case (Group_precedence op1 op2) of Greater => if for_all (fn N' => gt_ord rporec (M,N')) sons2 then Greater else NotGE | Equal => lex_ext rporec (M,N) | NotGE => if exists (fn M' => ge_ord rporec (M',N)) sons1 then Greater else NotGE in rporec end fun Group_order x = rpo () x fun greater pair = case Group_order pair of Greater => true | _ => false (****************** Critical pairs *********************) (* All (u,sig) such that N/u (&var) unifies with M, with principal unifier sig *) fun super M = let fun suprec (N as Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (suprec son), n+1) val insides : (int list * (int*term)list)list = (*type constraint added (mads)*) fst (it_list collate ([],1) sons) in ([], unify(M,N)) :: insides handle _ => insides end | suprec _ = [] in suprec end (******************** Ex : let (M,_) = <> and (N,_) = <> in super M N;; ==> [[1],[2,Term ("B",[])]; x <- B [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B *) (* All (u,sigma), u&[], such that N/u unifies with M *) (* super_strict : term -> term -> (num list & subst) list *) fun super_strict M (Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (super M son), n+1) in fst (it_list collate ([],1) sons) end | super_strict _ _ = [] (* Critical pairs of L1=R1 with L2=R2 *) (* critical_pairs : term_pair -> term_pair -> term_pair list *) fun critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super L1 L2) end (* Strict critical pairs of L1=R1 with L2=R2 *) (* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) fun strict_critical_pairs (* r1908 *) (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in (* these applications of substitute put terms attop *) map mk_pair (super_strict L1 L2) end (* All critical pairs of eq1 with eq2 *) fun mutual_critical_pairs eq1 eq2 = (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) (* Renaming of variables *) fun rename n (t1,t2) = let fun ren_rec (Var k) = Var(k+n) | ren_rec (Term(oper,sons)) = Term(oper, map ren_rec sons) in (ren_rec t1, ren_rec t2) end (************************ Completion ******************************) fun deletion_message (k,_) = (print_string "Rule ";print_num k; message " deleted") (* Generate failure message *) fun non_orientable (M,N) = (pretty_term M; print_string " = "; pretty_term N; print_newline()) fun copy_termpairlist [] = [] | copy_termpairlist ((M,N)::rest) = (copy_term M, copy_term N):: copy_termpairlist rest fun copy_int_pair(x,y) = (x+0, y+0) fun copy_int_pair_list l = map copy_int_pair l fun copy_int (x) = x+0 fun copy_arg(interm:bool, n, rules, failures, p, eps) = (interm, n, copy_rules rules, copy_termpairlist failures, copy_int_pair p, copy_termpairlist eps) (* Improved Knuth-Bendix completion procedure *) (* kb_completion : num -> rules -> term_pair list -> (num & num) -> term_pair list -> rules *) fun kb_completion (* [r2225] *)(arg as (done,n, rules, list, (k,l), eps)) = let fun kbrec (* [r2272] *) count n rules = let fun normal_form x = mrewrite_all rules x fun get_rule k = assoc eq_integer k rules fun process failures = let fun processf (k,l) = let fun processkl [] = if k (true, n, rules, [], (k,l), failures) (* successful completion *) | _ => (message "Non-orientable equations :"; app non_orientable failures; raise FailKbComplettion (*failwith "kb_completion"*) )) | processkl ((M,N)::eqs) = let val M' = normal_form M val N' = normal_form N fun enter_rule(left,right) = let val new_rule = (n+1, mk_rule left right) in (pretty_rule new_rule; let fun left_reducible (_,(_,(L,_))) = reducible left L val (redl,irredl) = partition left_reducible rules in (app deletion_message redl; let fun right_reduce (m,(_,(L,R))) = (m,mk_rule L (mrewrite_all (new_rule::rules) R)); val irreds = map right_reduce irredl val eqs' = map (fn (_,(_,pair)) => pair) redl in if count>0 then (kbrec (count-1) ((n+1)) ((new_rule::irreds)) [] ((k,l)) ((eqs @ eqs' @ failures)) ) else (false,n+1, new_rule::irreds, [], (k,l), (eqs @ eqs' @ failures)) end) end) end in if eq_term(M',N') then processkl eqs else if greater(M',N') then enter_rule( M', N') else if greater(N',M') then enter_rule( N', M') else (process ( ((M', N')::failures)) ( (k,l)) ( eqs)) end in processkl end and next_criticals (k,l) = (let val (v,el) = get_rule l in if eq_integer(k,l) then processf (k,l) (strict_critical_pairs el (rename v el)) else (let val (_,ek) = get_rule k in processf (k,l) (mutual_critical_pairs el (rename v ek)) end handle FailFind (*rule k deleted*) => next_criticals (k+1,l)) end handle FailFind (*rule l deleted*) => next_criticals (1,l+1)) in processf end in process end fun kb_outer (* [r2517] *)(arg as (_, n, rules, failures, (k,l), other_failures)) = case kbrec 1 n rules failures (k,l) other_failures of result as (true,_, result_rules,_,_,_) => if false then arg else result | arg0 as (false, n', rules', failures', (k',l'), eqs') => kb_outer(let val arg1 = copy_arg arg0 in (*resetRegions arg0;*) copy_arg(arg1) end ) in (fn (_,_,x,_,_,_) => x)(kb_outer(arg)) end fun kb_complete complete_rules (* the terms in the complete_rules are global *) rules = let val n = check_rules complete_rules val eqs = map (fn (_,(_,pair)) => pair) rules (* letregion r2656 *) val completed_rules = (* the copying in the line below is to avoid that kb_completion is called with attop modes *) kb_completion(false,n+0, copy_rules complete_rules, [], (n+0,n+0), copy_termpairlist eqs) in (message "Canonical set found :"; pretty_rules (rev completed_rules); (* end r2683 *) ()) end fun doit() = kb_complete [] (* terms in list global *) (Geom_rules()) fun testit _ = () in (*local*) val _ = (doit(); doit(); doit()) end (*local*) mlton-20100608/regression/kkb_eq.ok0000644000076600000240000004452011404435620015532 0ustar mtfstaff1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*I(C)) 7 : C*(B*I(C)) = B 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 11 : C*(A*(I(C)*A)) = U 12 : C*(B*(I(C)*v1)) = B*v1 13 : I(U)*v1 = v1 14 : I(I(v1))*U = v1 15 : I(v3*v2)*(v3*(v2*v1)) = v1 16 : C*(A*(I(C)*(B*A))) = B 17 : I(C)*U = C 18 : C*(A*(I(C)*(A*v1))) = v1 19 : I(C)*B = B*I(C) 20 : I(I(v2))*v1 = v2*v1 Rule 14 deleted 21 : v1*U = v1 Rule 17 deleted 22 : I(C) = C Rule 19 deleted Rule 18 deleted Rule 16 deleted Rule 12 deleted Rule 11 deleted Rule 7 deleted 23 : C*B = B*C 24 : C*(A*(C*(A*v1))) = v1 25 : C*(A*(C*(B*A))) = B 26 : C*(B*(C*v1)) = B*v1 27 : C*(A*(C*A)) = U 28 : C*(B*C) = B 29 : C*(A*(C*(B*(A*v1)))) = B*v1 30 : I(I(v2*v1)*v2) = v1 31 : I(v2*I(v1))*v2 = v1 32 : I(v4*(v3*v2))*(v4*(v3*(v2*v1))) = v1 33 : I(v1*A)*(v1*(B*A)) = B 34 : I(v1*C)*v1 = C 35 : I(v3*I(v2))*(v3*v1) = v2*v1 36 : I(v2*A)*(v2*(B*(A*v1))) = B*v1 37 : I(v2*C)*(v2*v1) = C*v1 38 : v1*I(v1) = U 39 : I(C*(A*C))*v1 = A*v1 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U Rule 13 deleted 42 : I(I(v1)) = v1 Rule 20 deleted 43 : C*(B*v1) = B*(C*v1) Rule 29 deleted Rule 28 deleted Rule 26 deleted Rule 25 deleted 44 : A*(C*(A*v1)) = C*v1 Rule 24 deleted 45 : A*(C*A) = C Rule 27 deleted 46 : v2*(I(v1*v2)*v1) = U 47 : I(I(v3*(v2*v1))*(v3*v2)) = v1 48 : I(I(B*A)*A) = B 49 : v3*(I(v2*v3)*(v2*v1)) = v1 50 : I(I(v2)*I(v1)) = v1*v2 51 : I(I(B*(A*v1))*A) = B*v1 52 : I(I(v1)*C) = C*v1 53 : I(v2*I(v1*v2)) = v1 54 : I(v3*(v2*I(v1)))*(v3*v2) = v1 55 : I(v1*(C*(A*C)))*v1 = A 56 : v2*I(I(v1)*v2) = v1 57 : I(v3*(I(v2*v1)*v2))*v3 = v1 58 : I(v5*(v4*(v3*v2)))*(v5*(v4*(v3*(v2*v1)))) = v1 59 : I(v2*(v1*A))*(v2*(v1*(B*A))) = B 60 : I(v2*(v1*C))*(v2*v1) = C 61 : I(v4*(v3*I(v2)))*(v4*(v3*v1)) = v2*v1 62 : I(v3*(v2*A))*(v3*(v2*(B*(A*v1)))) = B*v1 63 : I(v3*(v2*C))*(v3*(v2*v1)) = C*v1 64 : I(v4*(I(v3*v2)*v3))*(v4*v1) = v2*v1 65 : v4*(I(v3*(v2*v4))*(v3*(v2*v1))) = v1 66 : I(I(B)*A)*A = B 67 : I(A*A)*(B*(A*A)) = B 68 : v1*(I(A*v1)*(B*A)) = B 69 : I(I(v1*A)*(v1*B))*B = A 70 : v1*I(C*v1) = C 71 : I(A*I(v1))*(B*A) = v1*B 72 : I(C*I(v1)) = v1*C 73 : I(v2*(C*(A*C)))*(v2*v1) = A*v1 74 : I(A*I(v2))*(B*(A*v1)) = v2*(B*v1) 75 : v3*(I(I(v2)*v3)*v1) = v2*v1 76 : I(I(B*I(v1))*A)*(v1*A) = B 77 : I(v1*A)*(v1*(B*(B*A))) = B*B 78 : I(I(B)*A)*(A*v1) = B*v1 79 : I(A*A)*(B*(A*(A*v1))) = B*v1 80 : I(v2*A)*(v2*(B*(B*(A*v1)))) = B*(B*v1) 81 : v2*(I(A*v2)*(B*(A*v1))) = B*v1 82 : I(I(v2*A)*(v2*B))*(B*v1) = A*v1 83 : I(I(B*I(v2))*A)*(v2*(A*v1)) = B*v1 84 : I(A*C)*(B*A) = B*C 85 : I(A*C)*(B*(A*v1)) = B*(C*v1) 86 : v2*(I(C*v2)*v1) = C*v1 87 : I(I(B*C)*A)*(C*A) = B 88 : I(I(B*C)*A)*(C*(A*v1)) = B*v1 89 : v2*(v1*I(v2*v1)) = U 90 : B*(A*I(B)) = A 91 : I(v2*v1)*v2 = I(v1) Rule 64 deleted Rule 57 deleted Rule 55 deleted Rule 46 deleted Rule 34 deleted Rule 31 deleted Rule 30 deleted 92 : I(C*(A*C)) = A Rule 39 deleted 93 : I(v3*(v2*v1))*(v3*v2) = I(v1) Rule 60 deleted Rule 54 deleted Rule 47 deleted 94 : I(v2*I(v1)) = v1*I(v2) Rule 83 deleted Rule 76 deleted Rule 74 deleted Rule 72 deleted Rule 71 deleted Rule 53 deleted Rule 50 deleted Rule 35 deleted 95 : I(v2*(I(B)*A))*(v2*(A*v1)) = B*v1 96 : I(v1*(I(B)*A))*(v1*A) = B 97 : I(v1*A)*(v1*B) = B*(C*(A*C)) Rule 82 deleted Rule 69 deleted 98 : I(v1*C) = C*I(v1) Rule 88 deleted Rule 87 deleted Rule 85 deleted Rule 84 deleted Rule 52 deleted Rule 37 deleted 99 : v3*(v2*(I(v3*v2)*v1)) = v1 100 : B*(A*(I(B)*v1)) = A*v1 101 : I(v3*v2)*(v3*v1) = I(v2)*v1 Rule 97 deleted Rule 96 deleted Rule 95 deleted Rule 93 deleted Rule 80 deleted Rule 77 deleted Rule 73 deleted Rule 65 deleted Rule 63 deleted Rule 62 deleted Rule 61 deleted Rule 59 deleted Rule 58 deleted Rule 49 deleted Rule 36 deleted Rule 33 deleted Rule 32 deleted Rule 15 deleted 102 : B*(C*I(B)) = C 103 : B*(C*(I(B)*v1)) = C*v1 104 : B*(I(B*A)*A) = U 105 : B*(I(B*A)*(A*v1)) = v1 106 : I(B*A)*A = I(B) Rule 104 deleted Rule 48 deleted 107 : B*(v1*(I(B*(A*v1))*A)) = U 108 : I(I(B*(B*A))*A) = B*B 109 : B*(v2*(I(B*(A*v2))*(A*v1))) = v1 110 : I(I(B*(B*(A*v1)))*A) = B*(B*v1) 111 : I(I(B)*A) = B*(C*(A*C)) Rule 78 deleted Rule 66 deleted 112 : I(I(B*v1)*A) = B*(C*(A*(C*v1))) Rule 110 deleted Rule 108 deleted Rule 51 deleted 113 : v3*(v2*I(I(v1)*(v3*v2))) = v1 114 : v1*I(C*(A*(C*v1))) = A 115 : I(I(v2)*v1) = I(v1)*v2 Rule 113 deleted Rule 112 deleted Rule 111 deleted Rule 75 deleted Rule 56 deleted 116 : v2*(v1*(I(A*(v2*v1))*(B*A))) = B 117 : I(A*v1)*(B*A) = I(v1)*B Rule 116 deleted Rule 68 deleted 118 : v2*(v1*I(C*(v2*v1))) = C 119 : I(C*v1) = I(v1)*C Rule 118 deleted Rule 114 deleted Rule 92 deleted Rule 86 deleted Rule 70 deleted 120 : v1*(I(A*(C*v1))*C) = A 121 : I(A*A)*(B*(B*(A*A))) = B*B 122 : I(A*A)*(B*(B*(A*(A*v1)))) = B*(B*v1) 123 : I(A*A)*(B*(A*v1)) = B*(C*(A*(C*v1))) Rule 79 deleted Rule 67 deleted 124 : v3*(v2*(I(A*(v3*v2))*(B*(A*v1)))) = B*v1 125 : v1*(I(A*v1)*(B*(B*A))) = B*B 126 : I(A*v2)*(B*(A*v1)) = I(v2)*(B*v1) Rule 124 deleted Rule 123 deleted Rule 81 deleted 127 : v3*(v2*(v1*I(v3*(v2*v1)))) = U 128 : v2*I(v1*v2) = I(v1) Rule 89 deleted 129 : A*I(B) = I(B)*A Rule 90 deleted 130 : I(v2*v1) = I(v1)*I(v2) Rule 128 deleted Rule 127 deleted Rule 126 deleted Rule 125 deleted Rule 122 deleted Rule 121 deleted Rule 120 deleted Rule 119 deleted Rule 117 deleted Rule 115 deleted Rule 109 deleted Rule 107 deleted Rule 106 deleted Rule 105 deleted Rule 101 deleted Rule 99 deleted Rule 98 deleted Rule 94 deleted Rule 91 deleted 131 : B*(C*(A*(C*(I(B)*(A*v1))))) = v1 132 : B*(C*(A*(C*(I(B)*A)))) = U 133 : C*(A*(C*(I(B)*A))) = I(B) Rule 132 deleted 134 : A*(I(B)*v1) = I(B)*(A*v1) Rule 100 deleted 135 : C*I(B) = I(B)*C Rule 102 deleted 136 : C*(I(B)*v1) = I(B)*(C*v1) Rule 133 deleted Rule 131 deleted Rule 103 deleted Canonical set found : 1 : U*v1 = v1 2 : I(v1)*v1 = U 3 : (v3*v2)*v1 = v3*(v2*v1) 4 : A*B = B*A 5 : C*C = U 6 : I(A) = C*(A*C) 8 : I(v2)*(v2*v1) = v1 9 : A*(B*v1) = B*(A*v1) 10 : C*(C*v1) = v1 21 : v1*U = v1 22 : I(C) = C 23 : C*B = B*C 38 : v1*I(v1) = U 40 : v2*(I(v2)*v1) = v1 41 : I(U) = U 42 : I(I(v1)) = v1 43 : C*(B*v1) = B*(C*v1) 44 : A*(C*(A*v1)) = C*v1 45 : A*(C*A) = C 129 : A*I(B) = I(B)*A 130 : I(v2*v1) = I(v1)*I(v2) 134 : A*(I(B)*v1) = I(B)*(A*v1) 135 : C*I(B) = I(B)*C 136 : C*(I(B)*v1) = I(B)*(C*v1) mlton-20100608/regression/kkb_eq.sml0000644000076600000240000005251411404435621015717 0ustar mtfstaff(*kkb_eq.sml*) (* kitknuth-bendixnewcopy.sml This is a revised version of knuth-bendix.sml in which (a) val has been converted to fun for function values (b) exceptions that carry values have been avoided (c) functions have been moved around to pass fewer of them as parameters (d) long tail-recursions have been broken into batches of 1, with user-programmed copying between the batches *) val _ = let (* signature KB = sig datatype term = Var of int | Term of string * term list datatype ordering = Greater | Equal | NotGE val rpo: (string -> string -> ordering) -> ((term * term -> ordering) -> term * term -> ordering) -> term * term -> ordering val lex_ext: (term * term -> ordering) -> term * term -> ordering val kb_complete: (term * term -> bool) -> (int * (int * (term * term))) list -> ('a * ('b * (term * term))) list -> unit include BMARK end; *) (* structure Main : KB = struct *) fun length l = let fun j(k, nil) = k | j(k, a::x) = j(k+1,x) in j(0,l) end fun op @ (nil, l) = l | op @ (a::r, l) = a :: (r@l) fun rev l = let fun f (nil, h) = h | f (a::r, h) = f(r, a::h) in f(l,nil) end fun app f = let fun app_rec [] = () | app_rec (a::L) = (f a; app_rec L) in app_rec end fun map f = let fun map_rec [] = [] | map_rec (a::L) = f a :: map_rec L in map_rec end (******* Quelques definitions du prelude CAML **************) exception Failure of string exception FailItList2 exception FailTryFind exception FailFind exception FailChange exception FailReplace exception FailMatching exception FailUnify exception FailPretty exception Fail exception FailMrewrite1 exception FailRemEQ exception FailMultExt exception FailLexExt exception FailKbComplettion fun failwith s = raise(Failure s) fun fst (x,y) = x and snd (x,y) = y fun it_list f = let fun it_rec a [] = a | it_rec a (b::L) = it_rec (f a b) L in it_rec end fun it_list2 f = let fun it_rec a [] [] = a | it_rec a (a1::L1) (a2::L2) = it_rec (f a (a1,a2)) L1 L2 | it_rec _ _ _ = raise FailItList2 in it_rec end fun exists p = let fun exists_rec [] = false | exists_rec (a::L) = (p a) orelse (exists_rec L) in exists_rec end fun for_all p = let fun for_all_rec [] = true | for_all_rec (a::L) = (p a) andalso (for_all_rec L) in for_all_rec end fun rev_append [] L = L | rev_append (x::L1) L2 = rev_append L1 (x::L2) fun try_find f = let fun try_find_rec [] = raise FailTryFind | try_find_rec (a::L) = (f a) handle _ => try_find_rec L in try_find_rec end fun partition p = let fun part_rec [] = ([],[]) | part_rec (a::L) = let val (pos,neg) = part_rec L in if p a then ((a::pos), neg) else (pos, (a::neg)) end in part_rec end (* 3- Les ensembles et les listes d'association *) fun mem a = let fun mem_rec [] = false | mem_rec (b::L) = a = b orelse mem_rec L in mem_rec end fun union L1 L2 = let fun union_rec [] = L2 | union_rec (a::L) = if mem a L2 then union_rec L else a :: union_rec L in union_rec L1 end fun mem_assoc a = let fun mem_rec [] = false | mem_rec ((b,_)::L) = a = b orelse mem_rec L in mem_rec end fun assoc a = let fun assoc_rec [] = raise FailFind | assoc_rec ((b,d)::L) = if a = b then d else assoc_rec L in assoc_rec end (* 4- Les sorties *) (* val print_string = String.print; *) (* Lars *) fun print_string x = print x (* val print_num = Integer.print; *) (* Lars *) local fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun string(n) = implode(digits(n,[])) in fun print_num n = print_string(string n) end (* fun print_newline () = String.print "\n"; *) (* Lars *) fun print_newline () = print "\n" (* fun message s = (String.print s; String.print "\n"); *) (* Lars *) fun message s = (print s; print "\n") (* 5- Les ensembles *) fun union L1 = let fun union_rec [] = L1 | union_rec (a::L) = if mem a L1 then union_rec L else a :: union_rec L in union_rec end (****************** Term manipulations *****************) datatype term = Var of int | Term of string * term list (* Lars, from now on: seek on eq_X to see what I have modified *) fun copy_term (Var n) = Var (n+0) | copy_term (Term(s, l)) = Term(s, map copy_term l) fun vars (Var n) = [n] | vars (Term(_,L)) = vars_of_list L and vars_of_list [] = [] | vars_of_list (t::r) = union (vars t) (vars_of_list r) fun substitute subst = let fun subst_rec (Term(oper,sons)) = Term(oper, map subst_rec sons) | subst_rec (t as (Var n)) = (assoc n subst) handle _ => t in subst_rec end fun change f = let fun change_rec (h::t) n = if n = 1 then f h :: t else h :: change_rec t (n-1) | change_rec _ _ = raise FailChange in change_rec end (* Term replacement replace M u N => M[u<-N] *) fun replace M u N = let fun reprec (_, []) = N | reprec (Term(oper,sons), (n::u)) = Term(oper, change (fn P => reprec(P,u)) sons n) | reprec _ = raise FailReplace in reprec(M,u) end (* matching = - : (term -> term -> subst) *) fun matching term1 term2 = let fun match_rec subst (Var v, M) = if mem_assoc v subst then if M = assoc v subst then subst else raise FailMatching else (v,M) :: subst | match_rec subst (Term(op1,sons1), Term(op2,sons2)) = if op1 = op2 then it_list2 match_rec subst sons1 sons2 else raise FailMatching | match_rec _ _ = raise FailMatching in match_rec [] (term1,term2) end (* A naive unification algorithm *) fun compsubst subst1 subst2 = (map (fn (v,t) => (v, substitute subst1 t)) subst2) @ subst1 fun occurs n = let fun occur_rec (Var m) = m = n | occur_rec (Term(_,sons)) = exists occur_rec sons in occur_rec end fun unify ((term1 as (Var n1)), term2) = if term1 = term2 then [] else if occurs n1 term2 then raise FailUnify else [(n1,term2)] | unify (term1, Var n2) = if occurs n2 term1 then raise FailUnify else [(n2,term1)] | unify (Term(op1,sons1), Term(op2,sons2)) = if op1 = op2 then it_list2 (fn s => fn (t1,t2) => compsubst (unify(substitute s t1, substitute s t2)) s) [] sons1 sons2 else raise FailUnify (* We need to print terms with variables independently from input terms obtained by parsing. We give arbitrary names v1,v2,... to their variables. *) val INFIXES = ["+","*"] fun pretty_term (Var n) = (print_string "v"; print_num n) | pretty_term (Term (oper,sons)) = if mem oper INFIXES then case sons of [s1,s2] => (pretty_close s1; print_string oper; pretty_close s2) | _ => raise FailPretty (* "pretty_term : infix arity <> 2"*) else (print_string oper; case sons of [] => () | t::lt =>(print_string "("; pretty_term t; app (fn t => (print_string ","; pretty_term t)) lt; print_string ")")) and pretty_close (M as Term(oper, _)) = if mem oper INFIXES then (print_string "("; pretty_term M; print_string ")") else pretty_term M | pretty_close M = pretty_term M (****************** Equation manipulations *************) (* standardizes an equation so its variables are 1,2,... *) fun mk_rule M N = let val all_vars = union (vars M) (vars N) val (k,subst) = it_list (fn (i,sigma) => fn v => (i+1,(v,Var(i))::sigma)) (1,[]) all_vars in (k-1, (substitute subst M, substitute subst N)) end (* checks that rules are numbered in sequence and returns their number *) fun check_rules x = it_list (fn n => fn (k,_) => if k = n+1 then k else raise Fail (*failwith "Rule numbers not in sequence"*) ) 0 x fun pretty_rule (k,(n,(M,N))) = (print_num k; print_string " : "; pretty_term M; print_string " = "; pretty_term N; print_newline()) fun pretty_rules l = app pretty_rule l fun copy_rules [] = [] | copy_rules ((k,(n,(M,N)))::rest) = (k+0,(n+0,(copy_term M, copy_term N))):: copy_rules rest (****************** Rewriting **************************) (* Top-level rewriting. Let eq:L=R be an equation, M be a term such that L<=M. With sigma = matching L M, we define the image of M by eq as sigma(R) *) (* inserted eta; 03/07/1996-Martin *) fun reduce L M t = substitute (matching L M) t (* A more efficient version of can (rewrite1 (L,R)) for R arbitrary *) fun reducible L = let fun redrec M = (matching L M; true) handle _ => case M of Term(_,sons) => exists redrec sons | _ => false in redrec end (* mreduce : rules -> term -> term *) fun mreduce rules M = let fun redex (_,(_,(L,R))) = reduce L M R in try_find redex rules end (* One step of rewriting in leftmost-outermost strategy, with multiple rules *) (* fails if no redex is found *) (* mrewrite1 : rules -> term -> term *) fun mrewrite1 rules = let fun rewrec M = (mreduce rules M) handle _ => let fun tryrec [] = raise FailMrewrite1 (*failwith "mrewrite1"*) | tryrec (son::rest) = (rewrec son :: rest) handle _ => son :: tryrec rest in case M of Term(f, sons) => Term(f, tryrec sons) | _ => raise FailMrewrite1 (*failwith "mrewrite1"*) end in rewrec end (* Iterating rewrite1. Returns a normal form. May loop forever *) (* mrewrite_all : rules -> term -> term *) fun mrewrite_all rules M = let fun rew_loop M = rew_loop(mrewrite1 rules M) handle _ => M in rew_loop M end (* pretty_term (mrewrite_all Group_rules M where M,_=<>);; ==> A*U *) (************************ Recursive Path Ordering ****************************) datatype ordering = Greater | Equal | NotGE fun ge_ord order pair = case order pair of NotGE => false | _ => true and gt_ord order pair = case order pair of Greater => true | _ => false and eq_ord order pair = case order pair of Equal => true | _ => false fun rem_eq equiv = let fun remrec x [] = raise FailRemEQ (*failwith "rem_eq"*) | remrec x (y::l) = if equiv (x,y) then l else y :: remrec x l in remrec end fun diff_eq equiv (x,y) = let fun diffrec (p as ([],_)) = p | diffrec ((h::t), y) = diffrec (t,rem_eq equiv h y) handle _ => let val (x',y') = diffrec (t,y) in (h::x',y') end in if length x > length y then diffrec(y,x) else diffrec(x,y) end (* multiset extension of order *) fun mult_ext order (Term(_,sons1), Term(_,sons2)) = (case diff_eq (eq_ord order) (sons1,sons2) of ([],[]) => Equal | (l1,l2) => if for_all (fn N => exists (fn M => order (M,N) = Greater) l1) l2 then Greater else NotGE) | mult_ext order (_, _) = raise FailMultExt (*failwith "mult_ext"*) (* lexicographic extension of order *) fun lex_ext order ((M as Term(_,sons1)), (N as Term(_,sons2))) = let fun lexrec ([] , []) = Equal | lexrec ([] , _ ) = NotGE | lexrec ( _ , []) = Greater | lexrec (x1::l1, x2::l2) = case order (x1,x2) of Greater => if for_all (fn N' => gt_ord order (M,N')) l2 then Greater else NotGE | Equal => lexrec (l1,l2) | NotGE => if exists (fn M' => ge_ord order (M',N)) l1 then Greater else NotGE in lexrec (sons1, sons2) end | lex_ext order _ = raise FailLexExt (*failwith "lex_ext"*) (* recursive path ordering *) fun Group_rules() = [ (1, (1, (Term("*", [Term("U",[]), Var 1]), Var 1))), (2, (1, (Term("*", [Term("I",[Var 1]), Var 1]), Term("U",[])))), (3, (3, (Term("*", [Term("*", [Var 1, Var 2]), Var 3]), Term("*", [Var 1, Term("*", [Var 2, Var 3])]))))] fun Geom_rules() = [ (1,(1,(Term ("*",[(Term ("U",[])), (Var 1)]),(Var 1)))), (2,(1,(Term ("*",[(Term ("I",[(Var 1)])), (Var 1)]),(Term ("U",[]))))), (3,(3,(Term ("*",[(Term ("*",[(Var 1), (Var 2)])), (Var 3)]), (Term ("*",[(Var 1), (Term ("*",[(Var 2), (Var 3)]))]))))), (4,(0,(Term ("*",[(Term ("A",[])), (Term ("B",[]))]), (Term ("*",[(Term ("B",[])), (Term ("A",[]))]))))), (5,(0,(Term ("*",[(Term ("C",[])), (Term ("C",[]))]),(Term ("U",[]))))), (6,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("A",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("I",[(Term ("A",[]))]))))), (7,(0, (Term ("*", [(Term ("C",[])), (Term ("*",[(Term ("B",[])), (Term ("I",[(Term ("C",[]))]))]))]), (Term ("B",[]))))) ] fun Group_rank "U" = 0 | Group_rank "*" = 1 | Group_rank "I" = 2 | Group_rank "B" = 3 | Group_rank "C" = 4 | Group_rank "A" = 5 | Group_rank _ = 100 (*added, to avoid non-exhaustive patter (mads) *) fun Group_precedence op1 op2 = let val r1 = Group_rank op1 val r2 = Group_rank op2 in if r1 = r2 then Equal else if r1 > r2 then Greater else NotGE end fun rpo () = let fun rporec (M,N) = if M = N then Equal else case M of Var m => NotGE | Term(op1,sons1) => case N of Var n => if occurs n M then Greater else NotGE | Term(op2,sons2) => case (Group_precedence op1 op2) of Greater => if for_all (fn N' => gt_ord rporec (M,N')) sons2 then Greater else NotGE | Equal => lex_ext rporec (M,N) | NotGE => if exists (fn M' => ge_ord rporec (M',N)) sons1 then Greater else NotGE in rporec end fun Group_order x = rpo () x fun greater pair = case Group_order pair of Greater => true | _ => false (****************** Critical pairs *********************) (* All (u,sig) such that N/u (&var) unifies with M, with principal unifier sig *) fun super M = let fun suprec (N as Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (suprec son), n+1) val insides : (int list * (int*term)list)list = (*type constraint added (mads)*) fst (it_list collate ([],1) sons) in ([], unify(M,N)) :: insides handle _ => insides end | suprec _ = [] in suprec end (******************** Ex : let (M,_) = <> and (N,_) = <> in super M N;; ==> [[1],[2,Term ("B",[])]; x <- B [2],[2,Term ("A",[]); 1,Term ("B",[])]] x <- A y <- B *) (* All (u,sigma), u&[], such that N/u unifies with M *) (* super_strict : term -> term -> (num list & subst) list *) fun super_strict M (Term(_,sons)) = let fun collate (pairs,n) son = (pairs @ map (fn (u,sigma) => (n::u,sigma)) (super M son), n+1) in fst (it_list collate ([],1) sons) end | super_strict _ _ = [] (* Critical pairs of L1=R1 with L2=R2 *) (* critical_pairs : term_pair -> term_pair -> term_pair list *) fun critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super L1 L2) end (* Strict critical pairs of L1=R1 with L2=R2 *) (* strict_critical_pairs : term_pair -> term_pair -> term_pair list *) fun strict_critical_pairs (L1,R1) (L2,R2) = let fun mk_pair (u,sigma) = (substitute sigma (replace L2 u R1), substitute sigma R2) in map mk_pair (super_strict L1 L2) end (* All critical pairs of eq1 with eq2 *) fun mutual_critical_pairs eq1 eq2 = (strict_critical_pairs eq1 eq2) @ (critical_pairs eq2 eq1) (* Renaming of variables *) fun rename n (t1,t2) = let fun ren_rec (Var k) = Var(k+n) | ren_rec (Term(oper,sons)) = Term(oper, map ren_rec sons) in (ren_rec t1, ren_rec t2) end (************************ Completion ******************************) fun deletion_message (k,_) = (print_string "Rule ";print_num k; message " deleted") (* Generate failure message *) fun non_orientable (M,N) = (pretty_term M; print_string " = "; pretty_term N; print_newline()) fun copy_termpairlist [] = [] | copy_termpairlist ((M,N)::rest) = (copy_term M, copy_term N):: copy_termpairlist rest fun copy_int_pair(x,y) = (x+0, y+0) fun copy_int_pair_list l = map copy_int_pair l fun copy_int (x) = x+0 fun copy_arg(n, rules, failures, p, eps) = (n+0, copy_rules rules, copy_termpairlist failures, copy_int_pair p, copy_termpairlist eps) datatype ('a,'b) intermediate = FOUND of 'a | NOTFOUND of 'b (* Improved Knuth-Bendix completion procedure *) (* kb_completion : num -> rules -> term_pair list -> (num & num) -> term_pair list -> rules *) fun kb_completion(arg as (n, rules, list, (k,l), eps)) = let fun kbrec count n rules = let fun normal_form x = mrewrite_all rules x fun get_rule k = assoc k rules fun process failures = let fun processf (k,l) = let fun processkl [] = if k FOUND rules (* successful completion *) | _ => (message "Non-orientable equations :"; app non_orientable failures; raise FailKbComplettion (*failwith "kb_completion"*) )) | processkl ((M,N)::eqs) = let val M' = normal_form M val N' = normal_form N fun enter_rule(left,right) = let val new_rule = (n+1, mk_rule left right) in (pretty_rule new_rule; let fun left_reducible (_,(_,(L,_))) = reducible left L val (redl,irredl) = partition left_reducible rules in (app deletion_message redl; let fun right_reduce (m,(_,(L,R))) = (m,mk_rule L (mrewrite_all (new_rule::rules) R)); val irreds = map right_reduce irredl val eqs' = map (fn (_,(_,pair)) => pair) redl in if count>0 then (kbrec (count-1) ((n+1)) ((new_rule::irreds)) [] ((k,l)) ((eqs @ eqs' @ failures)) ) else NOTFOUND(n+1, new_rule::irreds, [], (k,l), (eqs @ eqs' @ failures)) end) end) end in if M' = N' then processkl eqs else if greater(M',N') then enter_rule( M', N') else if greater(N',M') then enter_rule( N', M') else (process ( ((M', N')::failures)) ( (k,l)) ( eqs)) end in processkl end and next_criticals (k,l) = (let val (v,el) = get_rule l in if k = l then processf (k,l) (strict_critical_pairs el (rename v el)) else (let val (_,ek) = get_rule k in processf (k,l) (mutual_critical_pairs el (rename v ek)) end handle FailFind (*rule k deleted*) => next_criticals (k+1,l)) end handle FailFind (*rule l deleted*) => next_criticals (1,l+1)) in processf end in process end (* fun kb_outer n rules failures (k,l) other_failures = case kbrec 10 (copy_int n) (copy_rules rules) (copy_termpairlist failures) (copy_int_pair (k,l)) (copy_termpairlist other_failures) of FOUND rules => copy_rules rules | NOTFOUND (n', rules', failures', (k',l'), eqs') => kb_outer n' rules' failures' (k',l') eqs' *) fun kb_outer(arg as (n, rules, failures, (k,l), other_failures)) = case kbrec 1 n rules failures (k,l) other_failures of FOUND result_rules => if false then arg else (n, result_rules, failures, (k,l), other_failures) | NOTFOUND (n', rules', failures', (k',l'), eqs') => kb_outer(copy_arg(copy_arg((n', rules', failures', (k',l'), eqs')))) in #2(kb_outer(arg)) end fun kb_complete complete_rules (* the terms in the complete_rules are global *) rules = let val n = check_rules complete_rules val eqs = map (fn (_,(_,pair)) => pair) rules val completed_rules = (* the copying in the line below is to avoid that kb_completion is called with attop modes *) kb_completion(n+0, copy_rules complete_rules, [], (n+0,n+0), copy_termpairlist eqs) in (message "Canonical set found :"; pretty_rules (rev completed_rules); ()) end fun doit() = kb_complete [] (* terms in list global *) (Geom_rules()) fun testit _ = () (* end (* Main *) *) in doit(); doit(); doit() end mlton-20100608/regression/klife_eq.ok0000644000076600000240000000246411404435620016056 0ustar mtfstaff. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . starting printing 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 0 00 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . starting printing 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 0 00 0 0 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . starting printing 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 0 00 0 0 0 mlton-20100608/regression/klife_eq.sml0000644000076600000240000001516011404435617016243 0ustar mtfstaff(*klife_eq.sml*) (*based on kitlifeopt.sml, but with copying to avoid many generations in the same region*) val _ = let (* structure Main : BMARK = struct *) fun map f [] = [] | map f (a::x) = f a :: map f x fun map_rec(f, []) = [] | map_rec(f, x::xs) = f x:: map_rec(f, xs) exception ex_undefined of string fun error str = raise ex_undefined str fun accumulate f a [] = a (* this now has no escaping regions, although still an escaping arrow effect*) | accumulate f a (b::x) = accumulate f (f a b) x fun filter p l= rev (accumulate (fn x => fn a => if p a then a::x else x) [] l) (*builds an intermediate list; the regions of this list are now made local (unlike in escape.sml) *) fun member x [] = false | member x (y::ys) = x =y orelse member x ys fun C f x y = f y x fun cons a x = a::x fun revonto x y = accumulate (C cons) x y (* eta expanded*) fun length x = (let fun count n a = n+1 in accumulate count 0 end) x (* eta expanded*) fun repeat f = let (* rptf moved into inner let *) fun check n = if n<0 then error "repeat<0" else n in fn x => fn y => let fun rptf n x = if n=0 then x else rptf(n-1)(f x) in rptf (check x) y end end fun copy n x = repeat (cons x) n [] fun spaces n = implode (copy n #" ") (*mads local mads*) fun copy_list[] = [] | copy_list((x,y)::rest) = (x,y):: copy_list rest fun lexordset [] = [] | lexordset (a::x) = lexordset (filter (lexless a) x) @ [a] @ lexordset (filter (lexgreater a) x) and lexless(a1:int,b1:int)(a2,b2) = if a2 not(member x y)) x (* unfolded o *) fun f xover x3 x2 x1 [] = diff x3 xover | f xover x3 x2 x1 (a::x) = if member a xover then f xover x3 x2 x1 x else if member a x3 then f (a::xover) x3 x2 x1 x else if member a x2 then f xover (a::x3) x2 x1 x else if member a x1 then f xover x3 (a::x2) x1 x else f xover x3 x2 (a::x1) x in f [] [] [] [] x end (* in *) fun copy_string s= implode(explode s) fun copy_bool true = true | copy_bool false = false abstype generation = GEN of (int*int) list with fun copy (GEN l) = GEN( copy_list l) fun alive (GEN livecoords) = livecoords and mkgen coordlist = GEN (lexordset coordlist) and mk_nextgen_fn neighbours gen = if true then let val living = alive gen fun isalive x = copy_bool(member x living) (* eta *) fun liveneighbours x = length( filter isalive ( neighbours x)) (*eta*) fun twoorthree n = n = 2 orelse n = 3 val survivors = copy_list(filter (twoorthree o liveneighbours) living) val newnbrlist = copy_list(collect (fn z => filter (fn x => not( isalive x)) ( neighbours z)) living) (* unfolded o twice*) val newborn = copy_list(occurs3 newnbrlist) in mkgen (survivors @ newborn) end else gen end (* end*) fun neighbours (i,j) = [(i-1,j-1),(i-1,j),(i-1,j+1), (i,j-1),(i,j+1), (i+1,j-1),(i+1,j),(i+1,j+1)] local val xstart = 0 and ystart = 0 fun markafter n string = string ^ spaces n ^ "0" fun plotfrom (x,y) (* current position *) str (* current line being prepared -- a string *) ((x1,y1)::more) (* coordinates to be plotted *) = if x = x1 then (* same line so extend str and continue from y1+1 *) plotfrom(x,y1+1)(markafter(y1-y)str)more else (* flush current line and start a new line *) str :: plotfrom(x+1,ystart)""((x1,y1)::more) | plotfrom (x,y) str [] = [str] fun good (x,y) = x>=xstart andalso y>=ystart in fun plot coordlist = map_rec(copy_string,(plotfrom(xstart,ystart) "" (copy_list(filter good coordlist)))) end infix 6 at fun coordlist at (x:int,y:int) = let fun move(a,b) = (a+x,b+y) in map move coordlist end fun rotate x = map (fn (x:int,y:int) => (y,~x)) x (* eta converted*) val glider = [(0,0),(0,2),(1,1),(1,2),(2,1)] val bail = [(0,0),(0,1),(1,0),(1,1)] fun barberpole n = let fun f i = if i = n then (n+n-1,n+n)::(n+n,n+n)::nil else (i+i,i+i+1)::(i+i+2,i+i+1)::f(i+1) in (0,0)::(1,0):: f 0 end val genB = mkgen(glider at (2,2) @ bail at (2,12) @ rotate (barberpole 4) at (5,20)) fun copy_whole_arg (p, g) = (p, copy g) fun nthgen'(p as(0,g)) = p | nthgen'(p as(i,g)) = (print ".\n"; nthgen' (copy_whole_arg(copy_whole_arg(i-1,mk_nextgen_fn neighbours g)))) fun gun() = mkgen (* turned into function *) [(2,20),(3,19),(3,21),(4,18),(4,22),(4,23),(4,32),(5,7),(5,8),(5,18), (5,22),(5,23),(5,29),(5,30),(5,31),(5,32),(5,36),(6,7),(6,8),(6,18), (6,22),(6,23),(6,28),(6,29),(6,30),(6,31),(6,36),(7,19),(7,21),(7,28), (7,31),(7,40),(7,41),(8,20),(8,28),(8,29),(8,30),(8,31),(8,40),(8,41), (9,29),(9,30),(9,31),(9,32)] fun iter n = #2(nthgen'(n,gun())) fun pr x = print x fun show(x) = (pr "starting printing\n"; app (fn s => (pr s; pr "\n"))(plot(alive x)); () ) (* had to uncurry show, as iter 50 gave attop also made it return a different unit *) (* fun doit () = show((fn _ => ()), (iter 50)) (* inserted call of iter *)*) fun testit _ = show(iter 50) (* inserted call of iter *) (* end (* Life *) *) (* val _ = (doit (); doit(); doit()); *) in testit (); testit (); testit () end mlton-20100608/regression/known-case0.ok0000644000076600000240000000000211404435620016406 0ustar mtfstaff1 mlton-20100608/regression/known-case0.sml0000644000076600000240000000030711404435620016600 0ustar mtfstaff fun nlist 0 = 0::nil | nlist n = n::(nlist (n-1)) val rec last = fn nil => 0 | x::nil => x | _ :: l => last l val n = 1 + (last (nlist (10))) val _ = print ((Int.toString n) ^ "\n") mlton-20100608/regression/known-case1.ok0000644000076600000240000000000211404435621016410 0ustar mtfstaff2 mlton-20100608/regression/known-case1.sml0000644000076600000240000000033411404435620016601 0ustar mtfstaff fun nlist 0 = 0::nil | nlist n = n::(nlist (n-1)) val rec last = fn nil => 0 | x::nil => x | y::x::nil => y | _ :: l => last l val n = 1 + (last (nlist (10))) val _ = print ((Int.toString n) ^ "\n") mlton-20100608/regression/lambda-list-ref.ok0000644000076600000240000000000011404435617017230 0ustar mtfstaffmlton-20100608/regression/lambda-list-ref.sml0000644000076600000240000000030111404435617017416 0ustar mtfstaffval r : (int -> int) list ref = ref [] val _ = r := (fn x => x + 1) :: ! r val _ = r := (fn x => x + 2) :: ! r val _ = app (fn f => (f 13; ())) (!r) mlton-20100608/regression/layout.ok0000644000076600000240000000000011404435617015602 0ustar mtfstaffmlton-20100608/regression/layout.sml0000644000076600000240000000031411404435617015774 0ustar mtfstaff fun layout (cbs : (string * real) list list) : string = let val layoutcb = map (fn (con,_) => con) fun layoutdb cb = "{" ^ concat(layoutcb cb) ^ "}" in concat(map layoutdb cbs) end mlton-20100608/regression/lex.ok0000644000076600000240000000000011404435620015047 0ustar mtfstaffmlton-20100608/regression/lex.sml0000644000076600000240000000015211404435617015247 0ustar mtfstaff fun token0(tokFn) = tokFn and token1(tokFn, value) = tokFn(value) val a = token1(fn _ => "1", 2) mlton-20100608/regression/lib.sml0000644000076600000240000000341111404435617015226 0ustar mtfstaffdatatype 'a Option = None | Some of 'a fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun toString(n) = implode(digits(n,[])) fun writeln s = print(s^"\n") fun percent(i: int, j: int)(*:int*) = floor((real i * 100.0)/real j) (* seek: (char -> bool) -> instream -> string list: seek(pred)(is) returns the list of characters obtained by reading from up to and including the first character which satisfies "pred". (If no such character exists, the empty list is returned. *) exception Impossible fun seek (pred: char -> bool) (is: TextIO.instream): char list = let fun readLoop() = (case explode (TextIO.inputN(is, 1)) of [] => [] | [char] => char :: (if pred char then [] else readLoop()) | _ => (print "lib.seek: impossible"; raise Impossible)) in readLoop() end fun readLn(is) = seek(fn ch => ch = #"\n")is (* dropwhile: ('a -> bool) -> 'a list -> 'a list; endomorphic *) fun dropwhile pred l = let fun drop_loop (l as []) = l | drop_loop (l as x::xs) = if pred x then drop_loop xs else l in drop_loop l end (* takewhile: ('a -> bool) -> 'a list -> 'a list; exomorphic *) fun takewhile pred l = let fun take_loop [] = [] | take_loop (l as x::xs) = if pred x then x:: take_loop xs else [] in take_loop l end fun isSpace(ch:char) = ch = #" " orelse ch = #"\t" orelse ch = #"\n" (* orelse ch= "\f" orelse ch = "\r" orelse ch = "\v"*) fun readWord(is): string Option = case implode(takewhile(not o isSpace) (dropwhile isSpace (readLn is))) of "" => None | word => Some word mlton-20100608/regression/library/0000755000076600000240000000000011404470407015404 5ustar mtfstaffmlton-20100608/regression/library/.ignore0000644000076600000240000000012211404435616016666 0ustar mtfstaffm?.h m?.def m?.dll libm?.so libm?.a libm?.dylib check.h check check.exe mlmon.out mlton-20100608/regression/library/check.c0000644000076600000240000000311211404435616016625 0ustar mtfstaff#include #include "check.h" #include "m5.h" #include "m4.h" #define DYNAMIC_LINK_M3 #include "m3.h" extern EXTERNAL void* libm3cSymPublic; extern EXTERNAL void* libm3cFnPublic(void); extern EXTERNAL void* libm4cSymPublic; extern EXTERNAL void* libm4cFnPublic(void); extern PUBLIC void* libm5cSymPublic; extern PUBLIC void* libm5cFnPublic(void); PRIVATE void* checkcSymPrivate = 0; PUBLIC void* checkcSymPublic = 0; PRIVATE void* checkcFnPrivate(void) { return &checkcSymPrivate; } PUBLIC void* checkcFnPublic(void) { return &checkcSymPublic; } PRIVATE void checkconfirmC(void) { assert (&checksmlFnPrivate == checksmlSymPrivate); assert (&checksmlFnPublic == checksmlSymPublic); assert (&checkcFnPrivate == checkcSymPrivate); assert (&checkcFnPublic == checkcSymPublic); assert (checksmlFnPrivate() == &checksmlSymPrivate); assert (checksmlFnPublic() == &checksmlSymPublic); /* Check libm3 */ assert (&libm3smlFnPublic == libm3smlSymPublic); assert (&libm3cFnPublic == libm3cSymPublic); assert (libm3smlFnPublic() == &libm3smlSymPublic); assert (libm3cFnPublic() == &libm3cSymPublic); /* Check libm4 */ assert (&libm4smlFnPublic == libm4smlSymPublic); assert (&libm4cFnPublic == libm4cSymPublic); assert (libm4smlFnPublic() == &libm4smlSymPublic); assert (libm4cFnPublic() == &libm4cSymPublic); /* Check libm5 */ assert (&libm5smlFnPublic == libm5smlSymPublic); assert (&libm5cFnPublic == libm5cSymPublic); assert (libm5smlFnPublic() == &libm5smlSymPublic); assert (libm5cFnPublic() == &libm5cSymPublic); } mlton-20100608/regression/library/check.ok0000644000076600000240000000052311404435616017017 0ustar mtfstaffcheck starting up libm5 starting up libm4 starting up libm3 starting up libm2 starting up libm1 starting up m1 pointer test complete. m2 pointer test complete. m3 pointer test complete. m4 pointer test complete. m5 pointer test complete. check pointer test complete. libm1 exits libm2 exits libm3 exits libm4 exits libm5 exits check exits mlton-20100608/regression/library/check.sml0000644000076600000240000000752311404435616017210 0ustar mtfstaffval () = print "check starting up\n" val () = OS.Process.atExit (fn () => (_import "m5_close" public : unit -> unit; () ; print "check exits\n")) (* Prepare lib5 *) val () = _import "m5_open" public : int * string vector -> unit; (1, Vector.fromList ["libm5"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "checksmlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "checksmlSymPublic" alloc public : p s; val (_, setCI) = _symbol "checkcSymPrivate" private : p s; val (_, setCB) = _symbol "checkcSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "checksmlFnPrivate" private : e; (fn () => _address "checksmlSymPrivate" private : p;) val () = _export "checksmlFnPublic" public : e; (fn () => _address "checksmlSymPublic" public : p;) val getCI = _import "checkcFnPrivate" private : i; val getCB = _import "checkcFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "checksmlFnPrivate" private : p;) val () = setSB (_address "checksmlFnPublic" public : p;) val () = setCI (_address "checkcFnPrivate" private : p;) val () = setCB (_address "checkcFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "checkconfirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("checkcFnPrivate", getCI () = _address "checkcSymPrivate" private : p;) val () = check ("checkcFnPublic", getCB () = _address "checkcSymPublic" public : p;) (* Test symbols in libm3 *) val (SB, _) = _symbol "libm3smlSymPublic" external : p s; val (CB, _) = _symbol "libm3cSymPublic" external : p s; val getSB = _import "libm3smlFnPublic" external : i; val getCB = _import "libm3cFnPublic" external : i; (* Check function pointers *) val () = check ("libm3smlFnPublic", SB () = _address "libm3smlFnPublic" external : p;) val () = check ("libm3cFnPublic", CB () = _address "libm3cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm3smlSymPublic", getSB () = _address "libm3smlSymPublic" external : p;) val () = check ("libm3cSymPublic", getCB () = _address "libm3cSymPublic" external : p;) (* Test symbols in libm4 *) val (SB, _) = _symbol "libm4smlSymPublic" external : p s; val (CB, _) = _symbol "libm4cSymPublic" external : p s; val getSB = _import "libm4smlFnPublic" external : i; val getCB = _import "libm4cFnPublic" external : i; (* Check function pointers *) val () = check ("libm4smlFnPublic", SB () = _address "libm4smlFnPublic" external : p;) val () = check ("libm4cFnPublic", CB () = _address "libm4cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm4smlSymPublic", getSB () = _address "libm4smlSymPublic" external : p;) val () = check ("libm4cSymPublic", getCB () = _address "libm4cSymPublic" external : p;) (* Test symbols in libm5 *) val (SB, _) = _symbol "libm5smlSymPublic" public : p s; val (CB, _) = _symbol "libm5cSymPublic" public : p s; val getSB = _import "libm5smlFnPublic" public : i; val getCB = _import "libm5cFnPublic" public : i; (* Check function pointers *) val () = check ("libm5smlFnPublic", SB () = _address "libm5smlFnPublic" public : p;) val () = check ("libm5cFnPublic", CB () = _address "libm5cFnPublic" public : p;) (* Check symbol pointers *) val () = check ("libm5smlSymPublic", getSB () = _address "libm5smlSymPublic" public : p;) val () = check ("libm5cSymPublic", getCB () = _address "libm5cSymPublic" public : p;) val () = print "check pointer test complete.\n" mlton-20100608/regression/library/libm1.c0000644000076600000240000000115411404435616016560 0ustar mtfstaff#include #define PART_OF_M1 #include "m1.h" PRIVATE void* libm1cSymPrivate = 0; PUBLIC void* libm1cSymPublic = 0; PRIVATE void* libm1cFnPrivate(void) { return &libm1cSymPrivate; } PUBLIC void* libm1cFnPublic(void) { return &libm1cSymPublic; } PRIVATE void libm1confirmC(void) { assert (&libm1smlFnPrivate == libm1smlSymPrivate); assert (&libm1smlFnPublic == libm1smlSymPublic); assert (&libm1cFnPrivate == libm1cSymPrivate); assert (&libm1cFnPublic == libm1cSymPublic); assert (libm1smlFnPrivate() == &libm1smlSymPrivate); assert (libm1smlFnPublic() == &libm1smlSymPublic); } mlton-20100608/regression/library/libm1.sml0000644000076600000240000000330111404435616017125 0ustar mtfstaffval () = print "libm1 starting up\n" val () = OS.Process.atExit (fn () => print "libm1 exits\n") type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm1smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm1smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm1cSymPrivate" private : p s; val (_, setCB) = _symbol "libm1cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm1smlFnPrivate" private : e; (fn () => _address "libm1smlSymPrivate" private : p;) val () = _export "libm1smlFnPublic" public : e; (fn () => _address "libm1smlSymPublic" public : p;) val getCI = _import "libm1cFnPrivate" private : i; val getCB = _import "libm1cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm1smlFnPrivate" private : p;) val () = setSB (_address "libm1smlFnPublic" public : p;) val () = setCI (_address "libm1cFnPrivate" private : p;) val () = setCB (_address "libm1cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm1confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm1cFnPrivate", getCI () = _address "libm1cSymPrivate" private : p;) val () = check ("libm1cFnPublic", getCB () = _address "libm1cSymPublic" public : p;) val () = print "m1 pointer test complete.\n" mlton-20100608/regression/library/libm2.c0000644000076600000240000000171011404435616016557 0ustar mtfstaff#include #define PART_OF_M2 #include "m2.h" #define STATIC_LINK_M1 #include "m1.h" extern PUBLIC void* libm1cSymPublic; extern PUBLIC void* libm1cFnPublic(void); PRIVATE void* libm2cSymPrivate = 0; PUBLIC void* libm2cSymPublic = 0; PRIVATE void* libm2cFnPrivate(void) { return &libm2cSymPrivate; } PUBLIC void* libm2cFnPublic(void) { return &libm2cSymPublic; } PRIVATE void libm2confirmC(void) { assert (&libm2smlFnPrivate == libm2smlSymPrivate); assert (&libm2smlFnPublic == libm2smlSymPublic); assert (&libm2cFnPrivate == libm2cSymPrivate); assert (&libm2cFnPublic == libm2cSymPublic); assert (libm2smlFnPrivate() == &libm2smlSymPrivate); assert (libm2smlFnPublic() == &libm2smlSymPublic); /* Check libm1 */ assert (&libm1smlFnPublic == libm1smlSymPublic); assert (&libm1cFnPublic == libm1cSymPublic); assert (libm1smlFnPublic() == &libm1smlSymPublic); assert (libm1cFnPublic() == &libm1cSymPublic); } mlton-20100608/regression/library/libm2.sml0000644000076600000240000000503111404435616017130 0ustar mtfstaffval () = print "libm2 starting up\n" val () = OS.Process.atExit (fn () => (_import "m1_close" public : unit -> unit; () ; print "libm2 exits\n")) (* Prepare libm1 *) val () = _import "m1_open" public : int * string vector -> unit; (1, Vector.fromList ["libm1"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm2smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm2smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm2cSymPrivate" private : p s; val (_, setCB) = _symbol "libm2cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm2smlFnPrivate" private : e; (fn () => _address "libm2smlSymPrivate" private : p;) val () = _export "libm2smlFnPublic" public : e; (fn () => _address "libm2smlSymPublic" public : p;) val getCI = _import "libm2cFnPrivate" private : i; val getCB = _import "libm2cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm2smlFnPrivate" private : p;) val () = setSB (_address "libm2smlFnPublic" public : p;) val () = setCI (_address "libm2cFnPrivate" private : p;) val () = setCB (_address "libm2cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm2confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm2cFnPrivate", getCI () = _address "libm2cSymPrivate" private : p;) val () = check ("libm2cFnPublic", getCB () = _address "libm2cSymPublic" public : p;) (* Test symbols in libm1 *) val (SB, _) = _symbol "libm1smlSymPublic" public : p s; val (CB, _) = _symbol "libm1cSymPublic" public : p s; val getSB = _import "libm1smlFnPublic" public : i; val getCB = _import "libm1cFnPublic" public : i; (* Check function pointers *) val () = check ("libm1smlFnPublic", SB () = _address "libm1smlFnPublic" public : p;) val () = check ("libm1cFnPublic", CB () = _address "libm1cFnPublic" public : p;) (* Check symbol pointers *) val () = check ("libm1smlSymPublic", getSB () = _address "libm1smlSymPublic" public : p;) val () = check ("libm1cSymPublic", getCB () = _address "libm1cSymPublic" public : p;) val () = print "m2 pointer test complete.\n" mlton-20100608/regression/library/libm3.c0000644000076600000240000000242511404435616016564 0ustar mtfstaff#include #define PART_OF_M3 #include "m3.h" #include "m2.h" #define DYNAMIC_LINK_M1 #include "m1.h" extern EXTERNAL void* libm1cSymPublic; extern EXTERNAL void* libm1cFnPublic(void); extern EXTERNAL void* libm2cSymPublic; extern EXTERNAL void* libm2cFnPublic(void); PRIVATE void* libm3cSymPrivate = 0; PUBLIC void* libm3cSymPublic = 0; PRIVATE void* libm3cFnPrivate(void) { return &libm3cSymPrivate; } PUBLIC void* libm3cFnPublic(void) { return &libm3cSymPublic; } PRIVATE void libm3confirmC(void) { assert (&libm3smlFnPrivate == libm3smlSymPrivate); assert (&libm3smlFnPublic == libm3smlSymPublic); assert (&libm3cFnPrivate == libm3cSymPrivate); assert (&libm3cFnPublic == libm3cSymPublic); assert (libm3smlFnPrivate() == &libm3smlSymPrivate); assert (libm3smlFnPublic() == &libm3smlSymPublic); /* Check libm1 */ assert (&libm1smlFnPublic == libm1smlSymPublic); assert (&libm1cFnPublic == libm1cSymPublic); assert (libm1smlFnPublic() == &libm1smlSymPublic); assert (libm1cFnPublic() == &libm1cSymPublic); /* Check libm2 */ assert (&libm2smlFnPublic == libm2smlSymPublic); assert (&libm2cFnPublic == libm2cSymPublic); assert (libm2smlFnPublic() == &libm2smlSymPublic); assert (libm2cFnPublic() == &libm2cSymPublic); } mlton-20100608/regression/library/libm3.sml0000644000076600000240000000630711404435616017140 0ustar mtfstaffval () = print "libm3 starting up\n" val () = OS.Process.atExit (fn () => (_import "m2_close" public : unit -> unit; () ; print "libm3 exits\n")) (* Prepare libm2 *) val () = _import "m2_open" external : int * string vector -> unit; (1, Vector.fromList ["libm2"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm3smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm3smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm3cSymPrivate" private : p s; val (_, setCB) = _symbol "libm3cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm3smlFnPrivate" private : e; (fn () => _address "libm3smlSymPrivate" private : p;) val () = _export "libm3smlFnPublic" public : e; (fn () => _address "libm3smlSymPublic" public : p;) val getCI = _import "libm3cFnPrivate" private : i; val getCB = _import "libm3cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm3smlFnPrivate" private : p;) val () = setSB (_address "libm3smlFnPublic" public : p;) val () = setCI (_address "libm3cFnPrivate" private : p;) val () = setCB (_address "libm3cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm3confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm3cFnPrivate", getCI () = _address "libm3cSymPrivate" private : p;) val () = check ("libm3cFnPublic", getCB () = _address "libm3cSymPublic" public : p;) (* Test symbols in libm1 *) val (SB, _) = _symbol "libm1smlSymPublic" external : p s; val (CB, _) = _symbol "libm1cSymPublic" external : p s; val getSB = _import "libm1smlFnPublic" external : i; val getCB = _import "libm1cFnPublic" external : i; (* Check function pointers *) val () = check ("libm1smlFnPublic", SB () = _address "libm1smlFnPublic" external : p;) val () = check ("libm1cFnPublic", CB () = _address "libm1cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm1smlSymPublic", getSB () = _address "libm1smlSymPublic" external : p;) val () = check ("libm1cSymPublic", getCB () = _address "libm1cSymPublic" external : p;) (* Test symbols in libm2 *) val (SB, _) = _symbol "libm2smlSymPublic" external : p s; val (CB, _) = _symbol "libm2cSymPublic" external : p s; val getSB = _import "libm2smlFnPublic" external : i; val getCB = _import "libm2cFnPublic" external : i; (* Check function pointers *) val () = check ("libm2smlFnPublic", SB () = _address "libm2smlFnPublic" external : p;) val () = check ("libm2cFnPublic", CB () = _address "libm2cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm2smlSymPublic", getSB () = _address "libm2smlSymPublic" external : p;) val () = check ("libm2cSymPublic", getCB () = _address "libm2cSymPublic" external : p;) val () = print "m3 pointer test complete.\n" mlton-20100608/regression/library/libm4.c0000644000076600000240000000316111404435616016563 0ustar mtfstaff#include #define PART_OF_M4 #include "m4.h" #define STATIC_LINK_M3 #include "m3.h" #include "m2.h" #define DYNAMIC_LINK_M1 #include "m1.h" extern EXTERNAL void* libm1cSymPublic; extern EXTERNAL void* libm1cFnPublic(void); extern EXTERNAL void* libm2cSymPublic; extern EXTERNAL void* libm2cFnPublic(void); extern PUBLIC void* libm3cSymPublic; extern PUBLIC void* libm3cFnPublic(void); PRIVATE void* libm4cSymPrivate = 0; PUBLIC void* libm4cSymPublic = 0; PRIVATE void* libm4cFnPrivate(void) { return &libm4cSymPrivate; } PUBLIC void* libm4cFnPublic(void) { return &libm4cSymPublic; } PRIVATE void libm4confirmC(void) { assert (&libm4smlFnPrivate == libm4smlSymPrivate); assert (&libm4smlFnPublic == libm4smlSymPublic); assert (&libm4cFnPrivate == libm4cSymPrivate); assert (&libm4cFnPublic == libm4cSymPublic); assert (libm4smlFnPrivate() == &libm4smlSymPrivate); assert (libm4smlFnPublic() == &libm4smlSymPublic); /* Check libm1 */ assert (&libm1smlFnPublic == libm1smlSymPublic); assert (&libm1cFnPublic == libm1cSymPublic); assert (libm1smlFnPublic() == &libm1smlSymPublic); assert (libm1cFnPublic() == &libm1cSymPublic); /* Check libm2 */ assert (&libm2smlFnPublic == libm2smlSymPublic); assert (&libm2cFnPublic == libm2cSymPublic); assert (libm2smlFnPublic() == &libm2smlSymPublic); assert (libm2cFnPublic() == &libm2cSymPublic); /* Check libm3 */ assert (&libm3smlFnPublic == libm3smlSymPublic); assert (&libm3cFnPublic == libm3cSymPublic); assert (libm3smlFnPublic() == &libm3smlSymPublic); assert (libm3cFnPublic() == &libm3cSymPublic); } mlton-20100608/regression/library/libm4.sml0000644000076600000240000000752111404435616017140 0ustar mtfstaffval () = print "libm4 starting up\n" val () = OS.Process.atExit (fn () => (_import "m3_close" public : unit -> unit; () ; print "libm4 exits\n")) (* Prepare libm3 *) val () = _import "m3_open" public : int * string vector -> unit; (1, Vector.fromList ["libm3"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm4smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm4smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm4cSymPrivate" private : p s; val (_, setCB) = _symbol "libm4cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm4smlFnPrivate" private : e; (fn () => _address "libm4smlSymPrivate" private : p;) val () = _export "libm4smlFnPublic" public : e; (fn () => _address "libm4smlSymPublic" public : p;) val getCI = _import "libm4cFnPrivate" private : i; val getCB = _import "libm4cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm4smlFnPrivate" private : p;) val () = setSB (_address "libm4smlFnPublic" public : p;) val () = setCI (_address "libm4cFnPrivate" private : p;) val () = setCB (_address "libm4cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm4confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm4cFnPrivate", getCI () = _address "libm4cSymPrivate" private : p;) val () = check ("libm4cFnPublic", getCB () = _address "libm4cSymPublic" public : p;) (* Test symbols in libm1 *) val (SB, _) = _symbol "libm1smlSymPublic" external : p s; val (CB, _) = _symbol "libm1cSymPublic" external : p s; val getSB = _import "libm1smlFnPublic" external : i; val getCB = _import "libm1cFnPublic" external : i; (* Check function pointers *) val () = check ("libm1smlFnPublic", SB () = _address "libm1smlFnPublic" external : p;) val () = check ("libm1cFnPublic", CB () = _address "libm1cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm1smlSymPublic", getSB () = _address "libm1smlSymPublic" external : p;) val () = check ("libm1cSymPublic", getCB () = _address "libm1cSymPublic" external : p;) (* Test symbols in libm2 *) val (SB, _) = _symbol "libm2smlSymPublic" external : p s; val (CB, _) = _symbol "libm2cSymPublic" external : p s; val getSB = _import "libm2smlFnPublic" external : i; val getCB = _import "libm2cFnPublic" external : i; (* Check function pointers *) val () = check ("libm2smlFnPublic", SB () = _address "libm2smlFnPublic" external : p;) val () = check ("libm2cFnPublic", CB () = _address "libm2cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm2smlSymPublic", getSB () = _address "libm2smlSymPublic" external : p;) val () = check ("libm2cSymPublic", getCB () = _address "libm2cSymPublic" external : p;) (* Test symbols in libm3 *) val (SB, _) = _symbol "libm3smlSymPublic" public : p s; val (CB, _) = _symbol "libm3cSymPublic" public : p s; val getSB = _import "libm3smlFnPublic" public : i; val getCB = _import "libm3cFnPublic" public : i; (* Check function pointers *) val () = check ("libm3smlFnPublic", SB () = _address "libm3smlFnPublic" public : p;) val () = check ("libm3cFnPublic", CB () = _address "libm3cFnPublic" public : p;) (* Check symbol pointers *) val () = check ("libm3smlSymPublic", getSB () = _address "libm3smlSymPublic" public : p;) val () = check ("libm3cSymPublic", getCB () = _address "libm3cSymPublic" public : p;) val () = print "m4 pointer test complete.\n" mlton-20100608/regression/library/libm5.c0000644000076600000240000000242511404435616016566 0ustar mtfstaff#include #define PART_OF_M5 #include "m5.h" #include "m4.h" #define DYNAMIC_LINK_M3 #include "m3.h" extern EXTERNAL void* libm3cSymPublic; extern EXTERNAL void* libm3cFnPublic(void); extern EXTERNAL void* libm4cSymPublic; extern EXTERNAL void* libm4cFnPublic(void); PRIVATE void* libm5cSymPrivate = 0; PUBLIC void* libm5cSymPublic = 0; PRIVATE void* libm5cFnPrivate(void) { return &libm5cSymPrivate; } PUBLIC void* libm5cFnPublic(void) { return &libm5cSymPublic; } PRIVATE void libm5confirmC(void) { assert (&libm5smlFnPrivate == libm5smlSymPrivate); assert (&libm5smlFnPublic == libm5smlSymPublic); assert (&libm5cFnPrivate == libm5cSymPrivate); assert (&libm5cFnPublic == libm5cSymPublic); assert (libm5smlFnPrivate() == &libm5smlSymPrivate); assert (libm5smlFnPublic() == &libm5smlSymPublic); /* Check libm3 */ assert (&libm3smlFnPublic == libm3smlSymPublic); assert (&libm3cFnPublic == libm3cSymPublic); assert (libm3smlFnPublic() == &libm3smlSymPublic); assert (libm3cFnPublic() == &libm3cSymPublic); /* Check libm4 */ assert (&libm4smlFnPublic == libm4smlSymPublic); assert (&libm4cFnPublic == libm4cSymPublic); assert (libm4smlFnPublic() == &libm4smlSymPublic); assert (libm4cFnPublic() == &libm4cSymPublic); } mlton-20100608/regression/library/libm5.sml0000644000076600000240000000630711404435616017142 0ustar mtfstaffval () = print "libm5 starting up\n" val () = OS.Process.atExit (fn () => (_import "m4_close" public : unit -> unit; () ; print "libm5 exits\n")) (* Prepare libm4 *) val () = _import "m4_open" external : int * string vector -> unit; (1, Vector.fromList ["libm4"]) type p = MLton.Pointer.t type 'a s = (unit -> 'a) * ('a -> unit) val (_, setSI) = _symbol "libm5smlSymPrivate" alloc private : p s; val (_, setSB) = _symbol "libm5smlSymPublic" alloc public : p s; val (_, setCI) = _symbol "libm5cSymPrivate" private : p s; val (_, setCB) = _symbol "libm5cSymPublic" public : p s; type i = (unit -> p) type e = i -> unit val () = _export "libm5smlFnPrivate" private : e; (fn () => _address "libm5smlSymPrivate" private : p;) val () = _export "libm5smlFnPublic" public : e; (fn () => _address "libm5smlSymPublic" public : p;) val getCI = _import "libm5cFnPrivate" private : i; val getCB = _import "libm5cFnPublic" public : i; (* Store our idea of what the function pointers are in symbols *) val () = setSI (_address "libm5smlFnPrivate" private : p;) val () = setSB (_address "libm5smlFnPublic" public : p;) val () = setCI (_address "libm5cFnPrivate" private : p;) val () = setCB (_address "libm5cFnPublic" public : p;) (* Have C confirm that it sees the same function pointers we do. * C will check the values of the variables against it's own pointers. * C also checks SML functions return his idea of pointers to our exports. *) val () = _import "libm5confirmC" private : unit -> unit; () (* Confirm that C functions return pointers to address as we expect. *) fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n") val () = check ("libm5cFnPrivate", getCI () = _address "libm5cSymPrivate" private : p;) val () = check ("libm5cFnPublic", getCB () = _address "libm5cSymPublic" public : p;) (* Test symbols in libm3 *) val (SB, _) = _symbol "libm3smlSymPublic" external : p s; val (CB, _) = _symbol "libm3cSymPublic" external : p s; val getSB = _import "libm3smlFnPublic" external : i; val getCB = _import "libm3cFnPublic" external : i; (* Check function pointers *) val () = check ("libm3smlFnPublic", SB () = _address "libm3smlFnPublic" external : p;) val () = check ("libm3cFnPublic", CB () = _address "libm3cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm3smlSymPublic", getSB () = _address "libm3smlSymPublic" external : p;) val () = check ("libm3cSymPublic", getCB () = _address "libm3cSymPublic" external : p;) (* Test symbols in libm4 *) val (SB, _) = _symbol "libm4smlSymPublic" external : p s; val (CB, _) = _symbol "libm4cSymPublic" external : p s; val getSB = _import "libm4smlFnPublic" external : i; val getCB = _import "libm4cFnPublic" external : i; (* Check function pointers *) val () = check ("libm4smlFnPublic", SB () = _address "libm4smlFnPublic" external : p;) val () = check ("libm4cFnPublic", CB () = _address "libm4cFnPublic" external : p;) (* Check symbol pointers *) val () = check ("libm4smlSymPublic", getSB () = _address "libm4smlSymPublic" external : p;) val () = check ("libm4cSymPublic", getCB () = _address "libm4cSymPublic" external : p;) val () = print "m5 pointer test complete.\n" mlton-20100608/regression/library/library-all0000755000076600000240000000074211404435616017552 0ustar mtfstaff#! /usr/bin/env bash set -e ./library-test "$@" -debug true ./library-test "$@" -debug true -codegen bytecode ./library-test "$@" -debug true -codegen c ./library-test "$@" ./library-test "$@" -codegen bytecode ./library-test "$@" -codegen c # Time profiling messes around with labels. Make sure this works. ./library-test "$@" -profile time ./library-test "$@" -profile time -codegen bytecode ./library-test "$@" -profile time -codegen c echo '********** ALL PASS **********' mlton-20100608/regression/library/library-test0000755000076600000240000000156211404435616017762 0ustar mtfstaff#! /usr/bin/env bash ML=../../build/bin/mlton O[0]='-default-ann' O[1]='allowFFI true' O[2]='-link-opt' O[3]='-L.' LIB="-link-opt -l" # Enable finding libraries locally export LD_LIBRARY_PATH=. set -ex # Compile DSO #1 $ML "${O[@]}" "$@" -format libarchive libm1.sml libm1.c $ML "${O[@]}" "$@" ${LIB}m1 -format library libm2.sml libm2.c # Compile DSO #2 $ML "${O[@]}" "$@" -format libarchive libm3.sml libm3.c $ML "${O[@]}" "$@" ${LIB}m3 ${LIB}m2 -format library libm4.sml libm4.c # Compile executable $ML "${O[@]}" "$@" -format archive libm5.sml libm5.c $ML "${O[@]}" "$@" ${LIB}m5 ${LIB}m4 -format executable \ -default-ann 'allowFFI true' -export-header check.h check.sml check.c # Check that symbols resolved correctly ./check | sed '' > check.log # Confirm expected output set +x diff -u check.ok check.log echo '********** PASS:' "$@" '**********' rm -f check.log mlton-20100608/regression/library/Makefile0000644000076600000240000000036011404435616017046 0ustar mtfstaff## Copyright (C) 2008 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../../bin/clean mlton-20100608/regression/life.ok0000644000076600000240000016564611404435621015233 0ustar mtfstaff 0 0 0 0 00 0 00 0 00 0000 0 00 0 00 0000 0 0 0 0 0 00 0 0000 00 0000 0 0000 00 0 0 0 0 00 000 0 0 0 0 00 00 0 0 0 0000 0 0 00 0 0 00 0 0 00 00 0 0 0 0 0 00 0 0 00 0 0 00 0 0 00 0 0 00 00 00 00 00 0 0 0 0 00 00 00 0 00 000 00 0 0 00 00 00 0 0 00 0 0 00 0 0 0 00 0 0 0 00 0 0 0 00 0 00 0 0 0 0 0 0 00 0 000 0 00 0 0 00 00 00 00 0 00 00 0 0 0 00 0 0 000 00 0 00 000 0 00 0 0 00 000 000 0 0 0 0 00 0 0 00 00 00 0 00 0 0 0 00 0 0 0 000 0 00 0 0 00000 00 0 0 00 00 0 0 0 00 000 00 00 0000 00 00 0000 0 00 00 0 00 00000 00 00 000 0 00 0 00 00 00 0 00 0 0 00 00 0 00 0 00 00 000 00 0 0 00 0 0 0 00 0 0 0 0 00 00 0 00 0000 00 000 0 000 00 00 00 00 00 0 0 0 0 0 00 00 000 00 00 00 00 0 0 0 0 0 00 00 0 0 0 0 0 00 0 0 00 0 0 0 00 0 0 00 0 0000 0 00 0000 0 0 00 00 00 0 0 00 0 00 0 0 00 0000 00 000 0000 00 000 00 0 000 00 0 0 00 0 0 0 0 000 0 0 0 0 00 00 0 0 00 0 0 00 0 0 0 0 000 0 00 0 0 0 00 0 0 00 0 0 0 0 0000 00 00 0 00 00 00 00 00 00 00 0 00 0 0 0 000 00 0 0 00 00 00 00 0 00 0 0 0 0 0 0 0 0 00 00 0 0 0 00 000 00 0 0 00 0 0 0 000 0 0 00 0 00 0 00 000 00 0 00 0 0 0000 0 00 000 0 0 0 00 00 00 00 0 0 00 0 00 0 00 0 0 0 0 00 00 0 0 00 00 0 0 0 0 0 0 0 0 0 0 00 0 00 0 0 00 00 0 0 0 00 0000 00 00 0 0000 0 0 00 0 0 00 0 0000 00 0000 0 0 0000 00 00 0 0 00 0000 0 0 0 00 0 0 000 00 0 0 0 00 0 0 00 0 0 0000 0 0 00 0 0 00 0 0 0 0 00 0 0 0 000 0 0 0 0 00 00 0 0 0 0 0 00 0 0 00 0 0 00 00 00 00 00 0 0 0 0 0 00 00 00 00 0 0 0 00 00 000 0 0 00 00 00 0 0 00 0 0 00 0 0 0 00 0 0 0 00 00 0 0 0 0 00 0 0 0 00 0 0 0 0 0 0 00 00 0 00 0 0 0 00 00 00 00 00 0 00 0 0 0 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 00 0 00 00 0 0 0 00 000 0 0 0 00000 0 0 0 0 0 0 0000 0 00 0 00 0 0 0 0 0 000 0 0 00 00 00 0 0 00 0000 0 0 00 00 000 00 0 0 00000 00 00 0 0 0 000 0 0 00 0 00 0 0 00 0 0 00000 00 0 0 000 0 0 00 00 0 00 0 0 0 0 000 0 0 00 0 0 0 0 0 0 00 00 00 0 00 0 00 000 000 0 0 00 00 0 0 00 0 0 00 0 0 00 0 0 0 0 00 00 00 00 0 00 0 0 00 00 0 0 0 0 0 0 0 00 0 0 0 0 00 0 0 00 000 0 0 0 0000 0 0 0000 00 00 0 0 0 0 00 0000 000 0 0000 000 0 0 0 0 000 00 0 0 00 0 00 0 0 0 0 0 0 0 00 00 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 00 0 0 00 00 0 0 0 0 0 0 00 00 00 00 00 00 00 00 0 0 000 000 0 00 00 00 00 00 00 0 0 0 0 0 0 00 00 0 0 000 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 000 00 000 0 0 0 0 0 00 0 0 0 00 00 00 0 0 00 00 0 00 0 0 0 00 0 0 0 0 00 0 0 0 0 00 0 0 0 0 0 0 00 0 00 0 00 0000 00 0 00 0000 0 0 0 0 0 0 0 0000 0000 0 0 0 0 0 0000 00 0 0 0 0 00 000 0 0 0 0 00 00 0 0 0 0000 0 0 0 0 0 0 0 0 00 0 00 0 0 0 0 0 00 0 0 00 0 0 00 0 0 00 0 0 00 00 00 0 0 0 0 0 0 00 00 00 0 00 000 00 0 0 00 00 00 0 0 00 0 0 0 0 0 0 0 0 0 0 00 0 0 0 00 0 00 0 0 0 0 0 0 00 0 000 0 00 0 0 00 00 00 0 00 0 0 0 0 00 0 0 000 00 0 00 000 0 00 0 0 00 000 000 0 0 0 0 00 0 0 00 00 0 0 0 0 0 00 0 0 0 000 0 00 0 0 00000 00 0 0 00 00 0 0 0 00 000 00 0000 00 0000 0 0 00 00 0 00 00000 00 00 000 0 00 0 00 00 00 0 00 0 0 00 0 0 00 00 000 00 0 0 00 0 0 0 00 0 0 0 0 00 00 0 00 0000 00 000 0 000 00 00 00 0 0 0 0 0 00 00 000 00 00 00 00 0 0 0 0 0 00 00 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0000 0 00 0000 0 0 00 00 00 0 0 00 0 00 0 0 00 0000 00 000 0000 00 000 0 000 0 0 00 0 0 0 0 000 0 0 0 0 00 00 0 0 00 0 0 00 0 0 0 0 000 0 0 0 0 0 0 00 0 0 0 0 0000 00 00 0 00 00 00 00 00 00 00 0 00 0 0 0 000 0 0 00 00 00 0 00 0 0 0 0 0 0 0 0 00 00 0 0 0 00 000 00 0 0 00 0 0 0 000 0 0 0 00 0 000 00 0 00 0 0 0000 0 00 000 0 0 0 00 00 00 00 0 0 00 0 00 0 00 0 0 0 0 00 0 0 00 0 0 0 0 0 0 0 0 0 0 00 0 00 0 0 00 00 0 0 0 00 0000 00 00 0 0000 0 0 00 0 0 0 0000 0000 0 0 0000 00 00 0 0 00 0000 0 0 0 00 0 0 000 00 0 0 0 00 0 0 00 0 0 0000 0 0 0 0 0 0 0 0 00 0 0 0 000 0 0 0 0 00 00 0 0 0 0 0 00 0 0 00 0 0 00 00 00 0 0 0 0 0 00 00 00 00 0 0 0 00 00 000 0 0 00 00 00 0 0 00 0 0 0 0 0 0 0 0 00 00 0 0 0 0 00 0 0 0 00 0 0 0 0 0 0 00 00 0 00 0 0 0 00 00 00 00 0 0 0 0 00 00 0 0 00 00 000 0 0 0000 0 000 0 0 000 00 000 0 00 0 0 0 00 00 0 00 0 0 0 00 000 0 0 0 00000 0 0 0 0 0 0 0000 0 00 0 00 0 0 0 0 0 000 0 0 00 00 0 0 0000 0 0 00 00 000 00 0 0 00000 00 00 0 0 0 000 0 0 00 0 00 0 0 00 0 0 00 00 0 0 0 0 00 00 0 00 0 0 0 0 000 0 0 00 0 0 0 0 0 0 00 00 00 0 00 00 000 000 00 00 00 00 00 0 00 0 0 00 0 0 0 0 00 00 00 00 0 00 0 0 00 00 0 00 0 0 0 0 0 0 0 0 0 00 0 0 00 000 0 0 0 0000 0 0 0000 00 00 0 0 0 0 00 0000 000 00 0000 000 0 0 0 000 00 0 0 00 0 00 0 0 0 0 0 0 0 00 00 0 0 0 0 00 0 0 00 0 0 0 0 0 0 0 0 00 0 0 00 00 0 0 0 0 0 0 00 00 00 00 00 00 00 00 00 0 0 000 0 0 0 00 00 00 00 00 00 0 0 0 0 0 0 00 00 0 0 000 00 0 0 0 00 00 0 0 0 0 0 0 0 0 00 00 000 00 000 0 0 0 0 0 00 0 0 0 00 00 00 0 0 00 00 0 00 00 0 0 00 0 0 0 0 00 00 0 0 0 0 00 0 0 0 0 0 0 00 0 00 0 00 0000 00 0 00 0000 00 0 0 0 0 0 0 0 0000 00 0000 0 0 0 0 0 0000 00 0 0 0 0 00 000 0 0 0 0 00 00 0 0 0 00 0000 0 0 0 0 0 0 00 0 0 0 0 00 0 00 0 0 0 0 0 00 0 0 00 0 0 00 0 0 00 00 0 0 00 0 0 00 00 00 0 0 0 0 0 0 00 00 00 0 00 000 00 0 0 00 00 00 0 0 00 00 0 0 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 00 0 00 0 0 0 0 0 0 00 0 000 0 00 00 0 0 00 00 0 0 00 0 00 00 0 0 0 0 00 0 0 000 00 0 00 000 0 00 0 0 00 000 000 0 0 00 0 0 00 0 0 0 0 00 00 0 00 0 0 0 0 00 0 0 0 000 0 00 0 0 00000 00 0 0 00 00 00 0 0 0 00 000 0 0 00 0000 00 00 0000 0 0 00 00 0 00 00000 00 00 000 0 00 0 00 00 00 0 00 00 0 0 0 0 00 0 00 0 00 00 000 00 0 0 00 0 0 0 00 0 0 0 0 00 00 0 00 0000 00 00 000 0 000 0 0 00 00 00 00 0 0 0 0 0 00 00 000 00 00 00 00 0 0 0 0 0 00 00 0 0 0 00 0 0 00 0 0 0 0 0 0 0 00 0 0 00 0 0000 0 00 0000 0 0 00 00 00 0 0 00 0 00 0 0 00 0000 00 000 00 0000 00 000 0 0 0 000 00 0 0 00 0 0 0 0 000 0 0 0 0 00 00 0 0 00 0 0 00 0 0 00 0 0 000 0 0 0 0 0 0 00 0 0 00 0 0 0 0 0000 00 00 0 00 00 00 00 00 00 00 0 000 00 0 0 0 00 0 0 0 0 000 00 00 00 0 00 0 0 0 0 0 0 0 0 00 00 0 0 0 00 000 0 00 0 0 00 0000 0 0 000 0 0 0 00 0000 000 0 00 0 00 0 0 0000 0 00 000 0 0 0 00 00 00 00 0 0000 00 0 00 0 00000 0 0 0 0 0 0 0 00000 0 0000 0 0 0 0 0 0 0 0 00 0 00 0 0 00 00 00 0 0 0 00 0 00 0 00 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 00 0 0000 00 00 0 0 00 0000 0 0 00 00 0 0 000 00 0 000 0 00 0 0 00 0 00 00 0000 00 0 00 00 000 0 0 00 00 0 0 0 000 0 0 0 0 00 00 00 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 00 00 00 00 0 0 0 00 00 000 00 00 0 00 00 00 0 0 0 00 00 00 0 0 0 0 00 00 0 0 00 00 0 0 0 0 00 0 0 000 00 0 0 0 0 0 0 0 00 00 0 0000 0 00 0 0 00 00 00 0000 0 00 0 0 0 000 00 00 0 0 00 0 00 000 0 0 0 0000 0 000 0 00 000 00 000 0 00 0 0 0 0 0 0 00 0 00 0 0 0 00 0 0 0 00 000 0 0 0 0 00000 0 0 00 0 0 0 00 00 00 0 00 0 00 00 0 0 0 00 00 00 00 00 00 00 00 00 0 0 00 00 000 00 0 0 00 00000 00 0 0 0 0 000 00 0000000 00 0 00 00 0 00 0 00 00 0 00 0000000 0 00 00 0 00 0 0 0 0 000 00 0 0 00 0 00 000000 0 0 0 0 00 0 0000 00 00 0 0 00 0 000 000 00 0 00 0 00 0 0000 0 000000 0 00 0 0 0 0 0 00 0000 00 00 0 000 0 00 0 00 000 0 00 00 0 0 0 0 0 0 0 0 0 0 0 00 0 0 000 0 0000 0 00 0 0000 00 0 0 0 0000 00 0 00 00 0 0 000 0 0 00 0000 000 0000 000 0 00 00 0 0 0000 0 0 00 0 0 00 0 0 000 00000 0 0 0 0 00 0 0 0 00 00 0 0 0 0 0 0 0 0 0 0 000 0 00 0 0 0 0000 00 0 0 0 0 0 0 000 00 0 00 0 00 00 00 000 00 00 0 0 0 0 00 0 000 0 0000 0 00 00 0 0 0 000 00 0 0 0 0 00 0 0 0 0 00 0 0 00 000 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 00 0 0 0 00 0 0 0 0 00 00 00 0 0 00 00 00 0 000 0 0 0 0 000 0 00 00 0 0 0 00 0 00 0 0 00 00 0 0 0 00 00 0 0 00 0 00 0 00 00 00 0 00 00 0 00 0 0 0 0 0 0 0 000 0 0 00 00 0 0 00000 0000 0 0000 0 00 0 0 0 0 00 000 0 0 00 0 0 00 00 0 0 00 0 0 0000 000 000 0 0 0 0 0 00 000000 00 00 0 0 0 0 0 0 0 0 00 0 00 0 0 00 0 0 00 00 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 00 0000 0000000 0 0 0000 00 0 00 00 00 00 0 00 00 000 00 0 00 00 00 00 00 00000 0 00 000 0 000 0 0 00 0 00 0 0 0 00 00 0 0 0 000 0 0 0 00 0 0 00 0 0 0 0 0 00 0 00 0 0 0 0 0 0 0 00 0 000 0 0 0 00 0 00 00 0 0 0 0 00 00 000 00 0 00 000 0 0 00 000 00 00 0 0 0 0 000 00 0 0 000 00 0 0 000 0 0 0 00 0 00 00 00 0 0 0 00 0 00 00 0 0 0 0 0 0 00 000 0 0 000 0 00 0 0 0 0 00 00 0 0 00 00 00 00 000 0 0 00 00 00 00 00 0 0 000 00 000 0 000 0 0 0 00 0 00 0 0 000 0 0 00 00 000 00 0 0 0 0 00 0 00 00 00 0 000 0 0 0 00 0 0 0 000 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 0 0 0 000 0 0 00 00 0 0 0 00 0 00 0 0 00 00 0000 0 0 0000 00 000 00 0 0 0 0 00 00 0000 00 00 0 0000 0 0 0 0 00 00 0 00 00 0 0 0 0 0 0 00 00 0 0 0 0 00 0 0 00 0 0 0 0 0 0 00 0 00 00 0 0 00 0 000 0 0 0 0 0 0 000 0 0 0000 0 00 0 0 00 0 0 00 00 000 00 00 0 0 0 00 00 00 000 0 0 0 000 0 0 0 0 00 0 0 000 000 0 0 00 0 0 0 0 00 0 0 000 0 0 0 0 0 00 0 00 0 0 0 0 0 0 00 0 0 00 0 0 0 0 0 0 000 0 0 0 0 0 0 000 0 0 00 0 0 0 0 00 0 0 0 0 0 0 0 00 00 0 00 00 00 00 0 000 00 0 00 00 0 0 0 0 0 00 00 0 0 00 000 0 00 0000 00 0 0 0 000 0 0 0 0 00 0 0 0 0 00 0 00 00 00 00 0 0 0 0 00 00 0 0 0000 000 0 0 0 0 0 000 0 00 0 0 0 0 0 0 0 00 0000 0 0 0 0 0 0 0000 000 0 0 0 00 00 000 00 0 0 000 0 00 0 0 00 0 0 00 0 00000 0 0000 0 0 0 00 0 000 0 0 0 00 0 000 0 0000 0 0 00 000 0 0 0 00 0 0 0 0 0 0 00 00 0 0 00 0 0 00 00 0 0 00 0000 0 0 00 0 000 00 00 0 00 0 0 00 00 000 000 0 0 0 0 0 0 00 00 00 0 00 00 0 0 0 00 00 000 00 0 000 0 0 00 00 00 00 00 00 0 00 00 00 0 0 0 0 0 000 0 0 0 0 000 00 0 0 0 000 00 0000 0 00 0 0000 0 0 000 0 00 0 0 00 0 0 0 0 000000000 00 00 00 00 0 00 0 0 0 0 00 000 00 0 00 0 0 0 0 0 0 00 00 00 0 0 0 0 00 0 0 00 0 0 0 000 0 00 000 0 0000 0 000 000000 00 00 000 00 000 00000 0 000 0 0 0 0 0 0 0000 0 00 00000 00 0 0 0 000000 00 0 00 000 00 0 0 0 0 0 00 0 00 0 0 0 00 00000 0 0 0 00 0 0 0 0 00000 0000 0 00 0 0 0 0 0 0 0 0 0 000 00 0 00 00 0 0 0 0 0 00 0 00 00 0 0 0 00 0 0 000 00 000 0 00000 00000 0 00 0 0 0 00 00 0 000000 00 0 00 0 0 0 0 000 00 00 00 00 0 00 0 00 0 0 000 0 0000 0 0000 0 0 0 0 00 0 00 0 0 000 0 000 0 00 0 00 0 0 0 0 0 000 0 0 00 000000 000 0 00 000 0 00 0 00 00 0 0 0 0 00 0 00 0 00 0 0 0 0 0 0 0 00 0 0 0 00 0 0000 0 0 00 000 00 0 00 0 0000 0 0 0 00 0 0 00 00 0 0 0 0 0 0 000 0 0 0 0 0 00 000 00 00 0 00 00 0 00 0 0 0000 0 00 0 0 0 00 0 0 0 0 00 0 00 0 0 00 00 00 0 00000 00 0 0000 00 00 0 0 0 0 0 00 00 0 00 0 00 00 000 0 00 0 0 0 0 00 0 0 0 0 0 000 00 0 00 00 00 000 00 0 00 00 0 0 0 0 0 00 00 0 000 00 00 00 0 00 0 0 0 0 0 0 0 00 00 0 00 00 0 00 00 0 0 0 0 00 00 00 00 00 00 00 00 0 0 0 0 0 00 000 00 00 00 00 0 0 0 0 0 00 00 00 00 0 00 00 0 0 0 0 00 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 00 0 00 00 000 00 00 0 0 0 00 0 0 00 00 00 00 0 00 0 0 0 00 0 00 00 0 0 00 00 00 0 0 0 00 0 00 00 00 00 00 00 0 0 0 00 0 00 00 0 00 000 00 0 0 0 00 00 00 0 0 00 00 0 00 0 0 0 00 00 00 0 00 0 0 00 00 0 0 0 00 00 00 0 00 00 00 00 0 0 0 00 00 00 0 00 0 000 00 0 0 0 00 00 00 00 0 0 00 0 00 0 0 0 00 00 00 00 0 0 0 00 00 0 0 0 00 00 00 00 0 00 00 00 0 0 0 00 00 00 00 0 0 000 00 0 0 0 00 00 00 00 0 0 00 0 00 0 0 0 00 00 00 00 0 0 0 00 00 0 0 0 00 00 00 00 0 00 00 00 0 0 0 00 00 00 00 0 0 000 00 0 0 0 00 00 00 00 0 0 00 0 00 0 0 0 00 00 00 00 0 0 0 00 00 0 0 0 00 00 00 00 0 00 00 00 0 0 0 00 00 00 00 0 0 000 00 0 0 0 00 00 00 00 0 0 00 00 0 0 0 0 00 00 00 00 0 0 0 00 00 0 0 0 00 00 00 00 0 00 00 00 0 0 0 00 00 00 00 0 0 00 000 0 0 0 00 00 00 00 0 0 00 00 0 0 0 0 00 00 00 00 0 00 0 0 0 0 00 0 00 00 00 00 0 00 00 0 0 00 0 00 00 00 00 0 00 0 0 0 000 0 00 00 00 00 00 0 0 0 0 00 0 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 00 0 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 0 0 0 0 0 000 00 00 00 00 00 0 0 0 0 0 00 0 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 0 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 0 0 0 0 0 0 00 00 00 00 00 0 0 0 0 0 00 00 00 00 00 0 0 0 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 00 0 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 00 00 00 00 00 0 0 0 mlton-20100608/regression/life.sml0000644000076600000240000001520311404435617015401 0ustar mtfstaff(*life.sml*) (*based on kitlifeopt.sml, but with copying to avoid many generations in the same region*) local fun map f l = let fun loop [] = [] | loop (x::xs) = f x :: loop xs in loop l end fun rev l = let fun rev_rec(p as ([], acc)) = p | rev_rec(x::xs, acc) = rev_rec(xs, x::acc) in #2 (rev_rec(l,nil)) end fun length [] = 0 | length (x::xs) = 1 + length xs fun app f [] = () | app f (x::xs) = (f x; app f xs) fun eq_integer_curry(x)(y:int) = x= y fun eq_int_pair_curry (x:int,x':int)(y,y'): bool = x=y andalso x'=y' exception ex_undefined of string fun error str = raise ex_undefined str fun accumulate f a [] = a (* this now has no escaping regions, although still an escaping arrow effect*) | accumulate f a (b::x) = accumulate f (f a b) x fun accumulate' (f, a, []) = a | accumulate' (f, a, b::x) = accumulate'(f, f(a,b), x) fun filter pred l = let fun loop [] = [] | loop (x::xs) = if pred(x) then x:: loop xs else loop xs in loop l end fun exists pred l = let fun loop [] = false | loop (x::xs) = pred(x) orelse loop xs in loop l end fun member eq x a = exists (eq a) x fun cons a x = a::x fun revonto x y = accumulate' ((fn (x,y) => y::x), x, y) local fun check n = if n<0 then error "repeat<0" else n in fun repeat f x y = let fun loop(p as (0,x)) = p | loop(n,x) = loop(n-1, f x) in #2(loop(check x, y)) end end fun copy n x = repeat (cons x) n [] fun spaces n = implode (copy n #" ") fun cp_list[] = [] | cp_list((x,y)::rest) = let val l = cp_list rest in (x,y):: l end fun lexless(a2,b2)(a1:int,b1:int) = if a2 [] | x::xs=> if i>0 then x::take(i-1,xs) else nil fun drop(i,l) = case l of [] => [] | x::xs => if i>0 then drop(i-1,xs) else l fun merge(lp as (left, right)) = case left of [] => right | x::xs => (case right of [] => left | y::ys => if lexless x y then x::merge(xs, right) else if lexless y x then y:: merge(left,ys) else (*x=y*) merge(xs, right) ) in fun tmergesort l = case l of [] => [] | x::xs => (case xs of []=> l | _ => let val k = length l div 2 in merge(copy (tmergesort(take(k,l))), copy (tmergesort(drop(k,l)))) end ) fun lexordset x = tmergesort x end fun collect f list = let fun accumf sofar [] = sofar | accumf sofar (a::x) = accumf (revonto sofar (f a)) x in accumf [] list (* note: this worked without changes!*) end fun occurs3 x = (* finds coords which occur exactly 3 times in coordlist x *) let fun f (q) = case q of (_,_,_,_,[]) => q | ( xover, x3, x2, x1, (a::x)) => if member eq_int_pair_curry xover a then f( xover, x3, x2, x1, x) else if member eq_int_pair_curry x3 a then f ((a::xover), x3, x2, x1, x) else if member eq_int_pair_curry x2 a then f (xover, (a::x3), x2, x1, x) else if member eq_int_pair_curry x1 a then f (xover, x3, (a::x2), x1, x) else f (xover, x3, x2, (a::x1), x) fun diff x y = filter (fn x => not(member eq_int_pair_curry y x)) x (* unfolded o *) val (xover, x3, _, _, _) = f ([],[],[],[],x) in diff x3 xover end fun neighbours (i,j) = [(i-1,j-1),(i-1,j),(i-1,j+1), (i,j-1),(i,j+1), (i+1,j-1),(i+1,j),(i+1,j+1)] infix footnote fun x footnote y = x abstype generation = GEN of (int*int) list with fun copy (GEN l) = GEN(cp_list l) fun alive (GEN livecoords) = livecoords and mkgen coordlist = GEN (lexordset coordlist) and nextgen gen = let val living = alive gen fun isalive x = member eq_int_pair_curry living x fun liveneighbours x = length( filter isalive ( neighbours x)) fun twoorthree n = n=2 orelse n=3 val survivors = filter (twoorthree o liveneighbours) living val newnbrlist = collect (fn z => filter (fn x => not(isalive x)) (neighbours z) ) living val newborn = occurs3 newnbrlist in mkgen (cp_list(survivors @ newborn)) end end local val xstart = 0 and ystart = 0 fun markafter n string = string ^ spaces n ^ "0" fun plotfrom (x,y) (* current position *) str (* current line being prepared -- a string *) ((x1:int,y1)::more) (* coordinates to be plotted *) = if x=x1 then (* same line so extend str and continue from y1+1 *) plotfrom(x,y1+1)(markafter(y1-y)str)more else (* flush current line and start a new line *) str :: plotfrom(x+1,ystart)""((x1,y1)::more) | plotfrom (x,y) str [] = [str] fun good (x,y) = x>=xstart andalso y>=ystart in fun plot coordlist = plotfrom(xstart,ystart) "" (filter good coordlist) end (* the initial generation *) fun gun() = mkgen [(2,20),(3,19),(3,21),(4,18),(4,22),(4,23),(4,32),(5,7),(5,8),(5,18), (5,22),(5,23),(5,29),(5,30),(5,31),(5,32),(5,36),(6,7),(6,8),(6,18), (6,22),(6,23),(6,28),(6,29),(6,30),(6,31),(6,36),(7,19),(7,21),(7,28), (7,31),(7,40),(7,41),(8,20),(8,28),(8,29),(8,30),(8,31),(8,40),(8,41), (9,29),(9,30),(9,31),(9,32)] fun show(x) = app (fn s => (print s; print "\n"))(plot(alive x)); local fun nthgen'(p as(0,g)) = p | nthgen'(p as(i,g)) = nthgen' (i-1, let val g' = nextgen g in show g; (*resetRegions g;*) (* resetRegions g can actually be omitted here, since *) copy g' (* copy will reset the regions of g! *) end) in fun iter n = #2(nthgen'(n,gun())) end fun testit _ = show(iter 200) in val _ = testit () end mlton-20100608/regression/list.ok0000644000076600000240000000113111404435621015241 0ustar mtfstaff File list.sml: Testing structure List... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK test9 OK test10 OK test11 OK test12 OK test13 OK test15 OK test16 OK test17 OK test18 OK test19 OK test20 OK checkv OK test22 OK checkv OK test24 OK test25 OK checkv OK checkv OK test28 OK test29 OK test30 OK test31 OK checkv OK test33 OK test36b OK test35a OK test36b OK test35c OK test36a OK test36b OK test36c OK test37a OK mlton-20100608/regression/list.sml0000644000076600000240000001064411404435617015441 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/list.sml PS 1994-12-10; Martin-11/03/1998 *) val _ = print "\nFile list.sml: Testing structure List...\n"; local open List in val v123 = [1,2,3]; fun even i = i mod 2 = 0; val test1 = tst "test1" (null [] andalso not (null [[]])); val test2 = tst "test2" (1 = hd v123 andalso [2,3] = tl v123 andalso 3 = last v123) val test3 = tst0 "test3" ((hd [] seq "WRONG") handle Empty => "OK" | _ => "WRONG") val test4 = tst0 "test4" ((tl [] seq "WRONG") handle Empty => "OK" | _ => "WRONG") val test5 = tst0 "test5" ((last [] seq "WRONG") handle Empty => "OK" | _ => "WRONG") val test6 = tst "test6" (1 = nth(v123,0) andalso 3 = nth(v123,2)) val test7 = tst0 "test7" ((nth(v123,~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8 = tst0 "test8" ((nth(v123,3) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9 = tst "test9" (3 = length v123); val test10 = tst "test10" ([3,2,1] = rev [1,2,3]); val v16 = v123 @ [4,5,6]; val test11 = tst "test11" ([1,2,3,4,5,6] = v16); val test12 = tst "test12" (concat [] = [] andalso concat [v16] = v16 andalso concat [v123, [4,5,6]] = v16); val test13 = tst "test13"(rev v16 = revAppend([4,5,6], [3,2,1])); local val v = ref 0 fun h [] r = r | h (x::xr) r = h xr (r+r+x): int; val isum = h v16 0 in fun reset () = v := 0; fun incrv i = v := 2 * !v + i; fun checkv () = tst "checkv" (!v = isum); end; val test14 = (reset (); app incrv v16; checkv); val test15 = tst "test15" ([2,4,6,8,10,12] = map (fn i=>i*2) v16); val test16 = tst "test16" ([3,9,15] = mapPartial (fn i => if even i then NONE else SOME (3*i)) v16); val test17 = tst "test17" (NONE = find (fn i => i>7) v16); val test18 = tst "test18" (SOME 5 = find (fn i => i>4) v16); val test19 = tst "test19" (NONE = find (fn _ => true) []); val test20 = tst "test20" ([2,4,6] = filter even v16); val test21 = (reset (); filter (fn i => (incrv i; true)) v16 seq checkv()); val test22 = tst "test22" (([2,4,6], [1,3,5]) = partition even v16); val test23 = (reset (); partition (fn i => (incrv i; true)) v16 seq checkv()); val test24 = tst "test24" (v16 = foldr op:: [] v16); val test25 = tst "test25" (rev v16 = foldl op:: [] v16); val test26 = (reset(); foldr (fn (i,r) => incrv i) () (rev v16); checkv()); val test27 = (reset(); foldl (fn (i,r) => incrv i) () v16; checkv()); val test28 = tst "test28" (21 = foldr op+ 0 v16 andalso 21 = foldl op+ 0 v16); val test29 = tst "test29" (all (fn _ => false) [] andalso not (exists (fn _ => true) [])); val test30 = tst "test30" (exists even [1,1,1,1,1,1,2,1] andalso all even [6,6,6,6,6,6,6,6]); val test31 = tst "test31" (v16 = tabulate (6, fn i => i+1)); val test32 = (reset(); tabulate (6, fn i => (incrv (i+1); 127)) seq checkv()); val test33 = tst "test33" ([] = tabulate (0, fn i => 1 div i)); val test34 = tst0 "test36b" ((tabulate(~1, fn _ => raise Div) seq "WRONG") handle Size => "OK" | _ => "WRONG") val test35a = tst "test35a" (drop([], 0) = [] andalso drop(v123, 0) = v123 andalso drop(v123, 3) = []); val test35b = tst0 "test36b" ((drop(v123, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test35c = tst0 "test35c" ((drop(v123, 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test36a = tst "test36a" (take([], 0) = [] andalso take(v123, 3) = v123 andalso take(v123, 0) = []); val test36b = tst0 "test36b" ((take(v123, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test36c = tst0 "test36c" ((take(v123, 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test37a = tst' "test37a" (fn _ => getItem [] = NONE andalso getItem [#"A"] = SOME(#"A", []) andalso getItem [#"B", #"C"] = SOME(#"B", [#"C"])); end; mlton-20100608/regression/listpair.ok0000644000076600000240000000034511404435620016122 0ustar mtfstaff File listpair.sml: Testing structure ListPair... test1 OK test2a OK test2b OK test3a OK checkv OK checkv OK test5a OK test5b OK test5c OK checkv OK checkv OK test6 OK test7 OK mlton-20100608/regression/listpair.sml0000644000076600000240000000707111404435620016307 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/listpair.sml PS 1995-02-25, 1997-03-07 *) (*KILL 05/11/1997 11:00. tho.: use "auxil.sml"; *) val _ = print "\nFile listpair.sml: Testing structure ListPair...\n"; local open ListPair val a = [1, 2, 3, 4, 5, 6] val b = [10, 40, 50, 50] val ab = [(1, 10), (2, 40), (3, 50), (4, 50)] fun take 0 xs = [] | take n [] = [] | take n (x :: xr) = x :: take (n-1) xr in val test1 = tst "test1" (zip([], []) = [] andalso zip ([], a) = [] andalso zip(a, []) = [] andalso zip(a, b) = ab andalso zip(b, a) = List.map (fn (x,y) => (y,x)) ab); val test2a = tst "test2a" (([], []) = unzip [] andalso (a, a) = unzip(zip(a,a)) andalso (take (length b) a, b) = unzip(zip(a, b)) andalso (b, take (length b) a) = unzip(zip(b, a))); val test2b = tst "test2b" (ab = zip(unzip ab)); val test3a = tst "test3a" (map (fn (x, y) => x + y) (a, b) = List.map (fn (x,y) => x + y) (zip(a, b))); local val v = ref 0 fun h [] r = r | h (x::xr) r = h xr (r+r+x): int; val isum = h (take (length b) a) 0 in fun reset () = v := 0; fun incrv i = v := 2 * !v + i; fun checkv () = tst "checkv" (!v = isum); end; val test3b = (reset (); map (incrv o #1) (a, b) seq (); checkv()); val test4 = (reset (); app (incrv o #1) (a, b); checkv()); val test5a = tst "test5a" (all (fn _ => false) (a, []) andalso not (exists (fn _ => true) ([], b))); val test5b = tst "test5b" (exists (fn (x, y) => x = 3) (a, b) andalso all (fn (x, y) => y <= 50) (a, b)); val test5c = tst "test5c" (not (exists (fn (x, y) => x = 5) (a, b)) andalso not (exists (fn (x, y) => y = 5) (b, a)) andalso all (fn (x, y) => x <> 6) (a, b) andalso all (fn (x, y) => y <> 6) (b, a)); val test5d = (reset(); all (fn (x,y) => (incrv x; true)) (a, b) seq (); checkv()); val test5e = (reset(); exists (fn (x,y) => (incrv x; false)) (a, b) seq (); checkv()); local fun foldrchk f e xs ys = foldr f e (xs, ys) = List.foldr (fn ((x, y), r) => f(x, y, r)) e (zip(xs, ys)) fun foldlchk f e xs ys = foldl f e (xs, ys) = List.foldl (fn ((x, y), r) => f(x, y, r)) e (zip(xs, ys)) in val test6 = tst' "test6" (fn _ => foldrchk (fn (x, y, (r1, r2)) => (x-r1, y div r2)) (0, 10) a b andalso foldrchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) [] b andalso foldrchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) a [] andalso foldrchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) [] []); val test7 = tst' "test7" (fn _ => foldlchk (fn (x, y, (r1, r2)) => (x-r1, y div r2)) (0, 10) a b andalso foldlchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) [] b andalso foldlchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) a [] andalso foldlchk (fn (x, y, (r1, r2)) => (x div r1, y div r2)) (0, 0) [] []); end end; mlton-20100608/regression/listsort.ok0000644000076600000240000000011411404435621016151 0ustar mtfstaff File listsort.sml: Testing structure ListSort... test1 OK test2 OK mlton-20100608/regression/llv.ok0000644000076600000240000000000011404435617015062 0ustar mtfstaffmlton-20100608/regression/llv.sml0000644000076600000240000000257111404435617015263 0ustar mtfstaff structure LLV = struct datatype place = P of int datatype info = Info1 | Info2 | Info3 datatype 'a tr = TR of 'a exp * info | K of 'a -> int and 'a exp = SWITCH_I of ('a, int) switch | SWITCH_S of ('a, string) switch | STRING of string * 'a and ('a,'c) switch = SWITCH of 'a tr * ('c * 'a tr) list datatype 'a pgm = PGM of string * 'a tr type mulexp = place exp and multrip = place tr type mulexp_llv = (place*int) exp and trip_llv = (place*int) tr fun llv(tr: multrip as TR(e,Info1)) : trip_llv = let val e' = llvExp e in TR(e',Info2) end and llvExp(e: mulexp) : mulexp_llv = let fun llv_switch(SWITCH(e,branches)) = (* Note: e is trivial *) let val branches' = map (fn (c,e) => (c,llv e)) branches in SWITCH(llv e, branches') end in case e of SWITCH_I(switch) => let val switch' = llv_switch switch in SWITCH_I(switch') end | SWITCH_S(switch) => let val switch' = llv_switch switch in SWITCH_S(switch') end | STRING(s,place) => STRING(s, (place, 5)) end val llv = fn (PGM (label,expression)) => let val tr' = llv expression in PGM(label, tr') end end mlton-20100608/regression/local-ref.ok0000644000076600000240000000011611404435617016141 0ustar mtfstaff0th invocation of fib 5th invocation of fib 10th invocation of fib fib(5) = 8 mlton-20100608/regression/local-ref.sml0000644000076600000240000000073511404435620016324 0ustar mtfstaff local val c = ref 0 in fun fib n = let val _ = if !c mod 5 = 0 then print (concat [Int.toString (!c), "th invocation of fib\n"]) else () val _ = c := !c + 1 in case n of 0 => 1 | 1 => 1 | n => (fib (n-1)) + (fib (n-2)) end end val n = fib 5 val _ = print (concat ["fib(5) = ", Int.toString n, "\n"]) mlton-20100608/regression/Makefile0000644000076600000240000000072511404435620015402 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean clean: ../bin/clean rm -f *.[csS] for f in *; do \ if [ -x "$$f" -a ! -d "$$f" ]; then \ rm -f "$$f"; \ fi; \ done .PHONY: abnormal abnormal: ls -1 | egrep -v '\.ok$$|\.sml$$' mlton-20100608/regression/math.ok0000644000076600000240000000247611404435620015233 0ustar mtfstaff File math.sml: Testing structure Math... test0a OK test0b OK test1a OK test1b OK test1c OK test2a OK test2b OK test2c OK test2d OK test3a OK test3b OK test3c OK test3d OK test4a OK test4b OK test4c OK test4d OK test4e OK test4f OK test4g OK test5a OK test5b OK test5c OK test5d OK test5e OK test6a OK test6b OK test6c OK test6d OK test6e OK test7a OK test7b OK test7c OK test7d OK test7e OK test8a OK test8b OK test8c OK test8d OK test8e OK test8f OK test8g OK test8h OK test8i OK test8j OK test8k OK test8l OK test9a OK test9b OK test9c OK test10a OK test10b OK test10c OK test10d OK test10e OK test10f OK test10g OK test12a OK test12b OK test12c OK test12d OK test12e OK test12f OK test12g OK test12h OK test12i OK test12l OK test12m OK test13a OK test13b OK test13c OK test13d OK test13e OK test14a OK test14b OK test14c OK test14d OK test14e OK test15a OK test15b OK test15c OK test15d OK test15e OK test16a OK test16b OK test16c OK test16d OK test16e OK test16f OK test16g OK mlton-20100608/regression/math.sml0000644000076600000240000001540611404435620015412 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/math.sml PS 1995-02-25, 1996-04-01, 1997-03-07 *) val _ = print "\nFile math.sml: Testing structure Math...\n" local open Math val MAXDOUBLE = 8.98846567431157E307; val MINDOUBLE = 4.94065645841246544E~324 val PI = 3.14159265358979323846; val E = 2.7182818284590452354; val eps = 1E~8 infix 4 === fun x === y = abs (x - y) <= eps orelse abs(x-y) <= eps * (abs x + abs y) fun check1 (opr, a, r) = if opr a === r then "OK" else "WRONG" fun check2 (opr, a1, a2, r) = if opr(a1, a2) === r then "OK" else "WRONG" fun tst1 s (opr, a, r) = tst0 s (check1 (opr, a, r)) fun tst2 s (opr, a1, a2, r) = tst0 s (check2 (opr, a1, a2, r)) val test0a = tst "test0a" (PI === pi); val test0b = tst "test0b" (E === e); val test1a = tst1 "test1a" (sqrt, 64.0, 8.0); val test1b = tst1 "test1b" (sqrt, 0.0, 0.0); val test1c = tst0 "test1c" (if Real.isNan(sqrt ~1.0) then "OK" else "WRONG") val test2a = tst1 "test2a" (sin, 0.0, 0.0); val test2b = tst1 "test2b" (sin, pi/2.0, 1.0); val test2c = tst1 "test2c" (sin, pi, 0.0); val test2d = tst1 "test2d" (sin, 3.0*pi/2.0, ~1.0); val test3a = tst1 "test3a" (cos, 0.0, 1.0); val test3b = tst1 "test3b" (cos, pi/2.0, 0.0); val test3c = tst1 "test3c" (cos, pi, ~1.0); val test3d = tst1 "test3d" (cos, 3.0*pi/2.0, 0.0); val test4a = tst1 "test4a" (tan, 0.0, 0.0); val test4b = tst1 "test4b" (tan, pi/4.0, 1.0); val test4c = tst1 "test4c" (tan, pi, 0.0); val test4d = tst1 "test4d" (tan, 3.0*pi/4.0, ~1.0); val test4e = tst1 "test4e" (tan, ~pi/4.0, ~1.0); val test4f = tst "test4f" ((abs(tan (pi/2.0)) > 1E8) handle _ => true); val test4g = tst "test4g" ((abs(tan (~pi/2.0)) > 1E8) handle _ => true); val test5a = tst1 "test5a" (asin, 0.0, 0.0); val test5b = tst1 "test5b" (asin, 1.0, pi/2.0); val test5c = tst1 "test5c" (asin, ~1.0, ~pi/2.0); val test5d = tst0 "test5d" (if Real.isNan(asin 1.1) then "OK" else "WRONG") val test5e = tst0 "test5e" (if Real.isNan(asin ~1.1) then "OK" else "WRONG") val test6a = tst1 "test6a" (acos, 1.0, 0.0); val test6b = tst1 "test6b" (acos, 0.0, pi/2.0); val test6c = tst1 "test6c" (acos, ~1.0, pi); val test6d = tst0 "test6d" (if Real.isNan(acos 1.1) then "OK" else "WRONG") val test6e = tst0 "test6e" (if Real.isNan(acos ~1.1) then "OK" else "WRONG") val test7a = tst1 "test7a" (atan, 0.0, 0.0); val test7b = tst1 "test7b" (atan, 1.0, pi/4.0); val test7c = tst1 "test7c" (atan, ~1.0, ~pi/4.0); val test7d = tst1 "test7d" (atan, 1E8, pi/2.0); val test7e = tst1 "test7e" (atan, ~1E8, ~pi/2.0); (* atan2 -- here I am in doubt over the argument order, since the New Basis document is inconsistent with itself and with atan2 in the C libraries. *) val test8a = tst2 "test8a" (atan2, 0.0, 0.0, 0.0); val test8b = tst2 "test8b" (atan2, 1.0, 0.0, pi/2.0); val test8c = tst2 "test8c" (atan2, ~1.0, 0.0, ~pi/2.0); val test8d = tst2 "test8d" (atan2, 1.0, 1.0, pi/4.0); val test8e = tst2 "test8e" (atan2, ~1.0, 1.0, ~pi/4.0); val test8f = tst2 "test8f" (atan2, ~1.0, ~1.0, ~3.0*pi/4.0); val test8g = tst2 "test8g" (atan2, 1.0, ~1.0, 3.0*pi/4.0); val test8h = tst2 "test8h" (atan2, 1E8, 1.0, pi/2.0); val test8i = tst2 "test8i" (atan2, ~1E8, 1.0, ~pi/2.0); val test8j = tst2 "test8j" (atan2, 1.0, 1E8, 0.0); val test8k = tst2 "test8k" (atan2, 1.0, ~1E8, pi); val test8l = tst2 "test8l" (atan2, ~1.0, ~1E8, ~pi); val test9a = tst1 "test9a" (exp, 0.0, 1.0); val test9b = tst1 "test9b" (exp, 1.0, e); val test9c = tst1 "test9c" (exp, ~1.0, 1.0/e); val test10a = tst1 "test10a" (ln, 1.0, 0.0); val test10b = tst1 "test10b" (ln, e, 1.0); val test10c = tst1 "test10c" (ln, 1.0/e, ~1.0); val test10d = tst0 "test10d" (if Real.==(ln 0.0,Real.negInf) then "OK" else "WRONG") val test10e = tst0 "test10e" (if Real.isNan(ln ~1.0) then "OK" else "WRONG") val test10f = tst0 "test10f" (if Real.==(ln Real.posInf, Real.posInf) then "OK" else "WRONG") val test10g = tst0 "test10g" (if Real.==(Real.posInf, Real.posInf) then "OK" else "WRONG") val test12a = tst2 "test12a" (pow, 0.0, 0.0, 1.0); (* arbitrary, might be 0.0 *) val test12b = tst2 "test12b" (pow, 7.0, 0.0, 1.0); val test12c = tst2 "test12c" (pow, 0.0, 7.0, 0.0); val test12d = tst2 "test12d" (pow, 64.0, 0.5, 8.0); val test12e = tst2 "test12e" (pow, ~9.0, 2.0, 81.0); val test12f = tst2 "test12f" (pow, 10.0, ~2.0, 0.01); val test12g = tst2 "test12g" (pow, ~10.0, ~2.0, 0.01); val test12h = tst2 "test12h" (pow, 0.0, 0.5, 0.0); val test12i = tst2 "test12i" (pow, 0.4, ~2.0, 6.25); (*we do not follow the Basis Library specification exactly here, but rather follow math.h val test12j = tst0 "test12j" (if Real.==(pow(0.0, ~1.0),Real.posInf) then "OK" else "WRONG") val test12k = tst0 "test12k" (if Real.==(pow(0.0, ~0.5),Real.posInf) then "OK" else "WRONG") *) val test12l = tst0 "test12l" (if Real.isNan(pow(~1.0, 1.1)) then "OK" else "WRONG") val test12m = tst0 "test12m" (if Real.isNan(pow(~1.0, 0.5)) then "OK" else "WRONG") (* sweeks removed 12n because it fails on FreeBSD on x86, apparently due to a * 64 bit vs 80 bit issue. *) (* val test12n = tst0 "test12n" (if Real.==(pow(3.0, 1000000.0),Real.posInf) then "OK" else "WRONG") *) (* not in basis lib spec.*) val test13a = tst1 "test13a" (log10, 1.0, 0.0); val test13b = tst1 "test13b" (log10, 10.0, 1.0); val test13c = tst1 "test13c" (log10, 100.0, 2.0); val test13d = tst1 "test13d" (log10, 0.1, ~1.0); val test13e = tst1 "test13e" (log10, 0.01, ~2.0); val check14a = tst1 "test14a" (sinh, 0.0, 0.0); val check14b = tst1 "test14b" (sinh, 1.0, 1.17520119364); val check14c = tst1 "test14c" (sinh, ~1.0, ~1.17520119364); val check14d = tst1 "test14d" (sinh, 2.0, 3.62686040785); val check14e = tst1 "test14e" (sinh, ~2.0, ~3.62686040785); val check15a = tst1 "test15a" (cosh, 0.0, 1.0); val check15b = tst1 "test15b" (cosh, 1.0, 1.54308063482); val check15c = tst1 "test15c" (cosh, ~1.0, 1.54308063482); val check15d = tst1 "test15d" (cosh, 2.0, 3.76219569108); val check15e = tst1 "test15e" (cosh, ~2.0, 3.76219569108); val check16a = tst1 "test16a" (tanh, 0.0, 0.0); val check16b = tst1 "test16b" (tanh, 1.0, 0.761594155956); val check16c = tst1 "test16c" (tanh, ~1.0, ~0.761594155956); val check16d = tst1 "test16d" (tanh, 2.0, 0.964027580076); val check16e = tst1 "test16e" (tanh, ~2.0, ~0.964027580076); val check16f = tst1 "test16f" (tanh, 100.0, 1.0); val check16g = tst1 "test16g" (tanh, ~100.0, ~1.0); in end mlton-20100608/regression/mlton.overload.ok0000644000076600000240000000000011404435617017230 0ustar mtfstaffmlton-20100608/regression/mlton.overload.sml0000644000076600000240000000021111404435617017416 0ustar mtfstaff(* Checks overload declarations. *) fun f (x: int) = x fun g (x: word) = x _overload f: 'a -> 'a as f and g val _ = f 1 val _ = f 0w1 mlton-20100608/regression/mlton.share.alpha-linux.ok0000644000076600000240000002207111404435617020754 0ustar mtfstaffsize of a is 2408 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 920 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1640 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 872 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2520 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400008 (1, 1) size of a is 800120 (1, 1) size is 296 size is 136 abcdef abcdef size is 88 size is 56 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.amd64-darwin.ok0000644000076600000240000002207111404435617020727 0ustar mtfstaffsize of a is 2408 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 920 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1640 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 872 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2520 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400008 (1, 1) size of a is 800120 (1, 1) size is 296 size is 136 abcdef abcdef size is 88 size is 56 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.amd64-freebsd.ok0000644000076600000240000002207111404435617021055 0ustar mtfstaffsize of a is 2408 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 920 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1640 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 872 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2520 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400008 (1, 1) size of a is 800120 (1, 1) size is 296 size is 136 abcdef abcdef size is 88 size is 56 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.amd64-linux.ok0000644000076600000240000002207111404435617020602 0ustar mtfstaffsize of a is 2408 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 920 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1640 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 872 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2520 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400008 (1, 1) size of a is 800120 (1, 1) size is 296 size is 136 abcdef abcdef size is 88 size is 56 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.amd64-mingw.ok0000644000076600000240000002207111404435617020564 0ustar mtfstaffsize of a is 2408 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 920 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1640 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 872 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2520 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400008 (1, 1) size of a is 800120 (1, 1) size is 296 size is 136 abcdef abcdef size is 88 size is 56 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.hppa-hpux.ok0000644000076600000240000002207011404435620020435 0ustar mtfstaffsize of a is 2000 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 512 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1232 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 464 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1312 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2000000 (1, 1) size of a is 400112 (1, 1) size is 200 size is 80 abcdef abcdef size is 64 size is 40 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.hppa-linux.ok0000644000076600000240000002207011404435621020611 0ustar mtfstaffsize of a is 2000 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 512 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1232 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 464 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1312 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2000000 (1, 1) size of a is 400112 (1, 1) size is 200 size is 80 abcdef abcdef size is 64 size is 40 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.ia64-hpux.ok0000644000076600000240000002207011404435620020250 0ustar mtfstaffsize of a is 2000 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 512 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1232 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 464 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1312 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2000000 (1, 1) size of a is 400112 (1, 1) size is 200 size is 80 abcdef abcdef size is 64 size is 40 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.ia64-linux.ok0000644000076600000240000002207111404435617020432 0ustar mtfstaffsize of a is 2408 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 920 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1640 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 872 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2520 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 4008 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400008 (1, 1) size of a is 800120 (1, 1) size is 296 size is 136 abcdef abcdef size is 88 size is 56 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.ok0000644000076600000240000002207011404435617016532 0ustar mtfstaffsize of a is 1600 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 484 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1024 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 448 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2400 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1284 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2400 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1600000 (1, 1) size of a is 400084 (1, 1) size is 172 size is 72 abcdef abcdef size is 52 size is 32 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.s390-linux.ok0000644000076600000240000002207011404435621020357 0ustar mtfstaffsize of a is 2000 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 512 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1232 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 464 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1312 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2000000 (1, 1) size of a is 400112 (1, 1) size is 200 size is 80 abcdef abcdef size is 64 size is 40 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.sml0000644000076600000240000001051511404435617016715 0ustar mtfstaff(* sharing on a non-object *) val () = MLton.share 13 (* tuple option array *) val a = Array.tabulate (100, fn i => SOME (i mod 2, i mod 3)) val () = Array.update (a, 0, NONE) fun msg () = (print (concat ["size of a is ", Int.toString (MLton.size a), "\n"]) ; Array.appi (fn (i, z) => print (concat [Int.toString i, " => ", case z of NONE => "NONE" | SOME (a, b) => concat ["(", Int.toString a, ", ", Int.toString b, ")"], "\n"])) a) val () = msg () val () = MLton.share a val () = msg () (* tuple option array with pre-existing sharing *) val a = Array.tabulate (100, fn i => if i mod 2 = 0 then SOME (1, 1) else SOME (i mod 3, i mod 3)) val () = Array.update (a, 0, NONE) fun msg () = (print (concat ["size of a is ", Int.toString (MLton.size a), "\n"]) ; Array.appi (fn (i, z) => print (concat [Int.toString i, " => ", case z of NONE => "NONE" | SOME (a, b) => concat ["(", Int.toString a, ", ", Int.toString b, ")"], "\n"])) a) val () = msg () val () = MLton.share a val () = msg () (* tuple option ref array *) val a = Array.tabulate (100, fn i => ref (SOME (i mod 2, i mod 3))) val () = Array.sub (a, 0) := NONE fun msg () = (print (concat ["size of a is ", Int.toString (MLton.size a), "\n"]) ; Array.appi (fn (i, z) => print (concat [Int.toString i, " => ", case !z of NONE => "NONE" | SOME (a, b) => concat ["(", Int.toString a, ", ", Int.toString b, ")"], "\n"])) a) val () = msg () val () = MLton.share a val () = msg () val () = Array.appi (fn (i, r) => r := (if i = 0 then NONE else (SOME (i mod 2, i mod 3)))) a val () = msg () (* big tuple option array *) val a = Array.tabulate (100000, fn i => SOME (i mod 2, i mod 3)) val () = Array.update (a, 0, NONE) fun msg () = print (concat ["size of a is ", Int.toString (MLton.size a), "\n", case Array.sub (a, 1) of NONE => "NONE" | SOME (a, b) => concat ["(", Int.toString a, ", ", Int.toString b, ")"], "\n"]) val () = msg () val () = MLton.share a val () = msg () (* non-sharing of vectors *) datatype t = A | B val v1 = Vector.fromList [A, B, A, B, A, B, A, B, A, B, A, B] val v2 = Vector.fromList [A, B, A, B, A, B, A, B, A, B, A, A] val a = Array.tabulate (4, fn i => if i mod 2 = 0 then v1 else v2) val () = MLton.share a val () = if Array.sub (a, 2) = Array.sub (a, 3) then raise Fail "bug" else () (* sharing of vectors *) val a = Array.tabulate (10, fn i => if i mod 2 = 0 then "abcdef" else concat ["abc", "def"]) fun p () = print (concat ["size is ", Int.toString (MLton.size a), "\n"]) val () = p () val () = MLton.share a val () = p () val s0 = Array.sub (a, 0) val s1 = Array.sub (a, 1) val () = print (concat [s0, " ", s1, "\n"]) (* sharing of vectors in a tuple *) val t = ("abcdef", concat ["abc", "def"]) fun p () = print (concat ["size is ", Int.toString (MLton.size t), "\n"]) val () = p () val () = MLton.share t val () = p () val (s1, s2) = t val () = print (concat [s1, " ", s2, "\n"]) (* non-sharing of similar looking strings of different lengths. *) val a = Array.tabulate (10, fn i => if 0 = i mod 2 then "a" else concat ["a", "\000"]) val () = MLton.share a val s0 = Array.sub (a, 0) val s1 = Array.sub (a, 1) val () = print (concat [Int.toString (size s0), " ", Int.toString (size s1), "\n"]) mlton-20100608/regression/mlton.share.sparc-linux.ok0000644000076600000240000002207011404435617020776 0ustar mtfstaffsize of a is 2000 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 512 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1232 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 464 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1312 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2000000 (1, 1) size of a is 400112 (1, 1) size is 200 size is 80 abcdef abcdef size is 64 size is 40 abcdef abcdef 1 2 mlton-20100608/regression/mlton.share.sparc-solaris.ok0000644000076600000240000002207011404435621021306 0ustar mtfstaffsize of a is 2000 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 512 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1232 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 464 0 => NONE 1 => (1, 1) 2 => (1, 1) 3 => (0, 0) 4 => (1, 1) 5 => (2, 2) 6 => (1, 1) 7 => (1, 1) 8 => (1, 1) 9 => (0, 0) 10 => (1, 1) 11 => (2, 2) 12 => (1, 1) 13 => (1, 1) 14 => (1, 1) 15 => (0, 0) 16 => (1, 1) 17 => (2, 2) 18 => (1, 1) 19 => (1, 1) 20 => (1, 1) 21 => (0, 0) 22 => (1, 1) 23 => (2, 2) 24 => (1, 1) 25 => (1, 1) 26 => (1, 1) 27 => (0, 0) 28 => (1, 1) 29 => (2, 2) 30 => (1, 1) 31 => (1, 1) 32 => (1, 1) 33 => (0, 0) 34 => (1, 1) 35 => (2, 2) 36 => (1, 1) 37 => (1, 1) 38 => (1, 1) 39 => (0, 0) 40 => (1, 1) 41 => (2, 2) 42 => (1, 1) 43 => (1, 1) 44 => (1, 1) 45 => (0, 0) 46 => (1, 1) 47 => (2, 2) 48 => (1, 1) 49 => (1, 1) 50 => (1, 1) 51 => (0, 0) 52 => (1, 1) 53 => (2, 2) 54 => (1, 1) 55 => (1, 1) 56 => (1, 1) 57 => (0, 0) 58 => (1, 1) 59 => (2, 2) 60 => (1, 1) 61 => (1, 1) 62 => (1, 1) 63 => (0, 0) 64 => (1, 1) 65 => (2, 2) 66 => (1, 1) 67 => (1, 1) 68 => (1, 1) 69 => (0, 0) 70 => (1, 1) 71 => (2, 2) 72 => (1, 1) 73 => (1, 1) 74 => (1, 1) 75 => (0, 0) 76 => (1, 1) 77 => (2, 2) 78 => (1, 1) 79 => (1, 1) 80 => (1, 1) 81 => (0, 0) 82 => (1, 1) 83 => (2, 2) 84 => (1, 1) 85 => (1, 1) 86 => (1, 1) 87 => (0, 0) 88 => (1, 1) 89 => (2, 2) 90 => (1, 1) 91 => (1, 1) 92 => (1, 1) 93 => (0, 0) 94 => (1, 1) 95 => (2, 2) 96 => (1, 1) 97 => (1, 1) 98 => (1, 1) 99 => (0, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 1312 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2800 0 => NONE 1 => (1, 1) 2 => (0, 2) 3 => (1, 0) 4 => (0, 1) 5 => (1, 2) 6 => (0, 0) 7 => (1, 1) 8 => (0, 2) 9 => (1, 0) 10 => (0, 1) 11 => (1, 2) 12 => (0, 0) 13 => (1, 1) 14 => (0, 2) 15 => (1, 0) 16 => (0, 1) 17 => (1, 2) 18 => (0, 0) 19 => (1, 1) 20 => (0, 2) 21 => (1, 0) 22 => (0, 1) 23 => (1, 2) 24 => (0, 0) 25 => (1, 1) 26 => (0, 2) 27 => (1, 0) 28 => (0, 1) 29 => (1, 2) 30 => (0, 0) 31 => (1, 1) 32 => (0, 2) 33 => (1, 0) 34 => (0, 1) 35 => (1, 2) 36 => (0, 0) 37 => (1, 1) 38 => (0, 2) 39 => (1, 0) 40 => (0, 1) 41 => (1, 2) 42 => (0, 0) 43 => (1, 1) 44 => (0, 2) 45 => (1, 0) 46 => (0, 1) 47 => (1, 2) 48 => (0, 0) 49 => (1, 1) 50 => (0, 2) 51 => (1, 0) 52 => (0, 1) 53 => (1, 2) 54 => (0, 0) 55 => (1, 1) 56 => (0, 2) 57 => (1, 0) 58 => (0, 1) 59 => (1, 2) 60 => (0, 0) 61 => (1, 1) 62 => (0, 2) 63 => (1, 0) 64 => (0, 1) 65 => (1, 2) 66 => (0, 0) 67 => (1, 1) 68 => (0, 2) 69 => (1, 0) 70 => (0, 1) 71 => (1, 2) 72 => (0, 0) 73 => (1, 1) 74 => (0, 2) 75 => (1, 0) 76 => (0, 1) 77 => (1, 2) 78 => (0, 0) 79 => (1, 1) 80 => (0, 2) 81 => (1, 0) 82 => (0, 1) 83 => (1, 2) 84 => (0, 0) 85 => (1, 1) 86 => (0, 2) 87 => (1, 0) 88 => (0, 1) 89 => (1, 2) 90 => (0, 0) 91 => (1, 1) 92 => (0, 2) 93 => (1, 0) 94 => (0, 1) 95 => (1, 2) 96 => (0, 0) 97 => (1, 1) 98 => (0, 2) 99 => (1, 0) size of a is 2000000 (1, 1) size of a is 400112 (1, 1) size is 200 size is 80 abcdef abcdef size is 64 size is 40 abcdef abcdef 1 2 mlton-20100608/regression/mlton.word.ok0000644000076600000240000000504411404435621016400 0ustar mtfstaff0 FFFFFFFF FFFFFFF1 80808081 1 0 1 F 7F7F7F7F FFFFFFFF 0 1 F 7F7F7F7F FFFFFFFF 0 1 F 7F7F7F7F FFFFFFFF 0 1 F 7F7F7F7F FFFFFFFF 0 0 0 0 0 0 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 4 8 10 20 40 80 100 200 400 800 1000 2000 4000 8000 10000 20000 40000 80000 100000 200000 400000 800000 1000000 2000000 4000000 8000000 10000000 20000000 40000000 80000000 1 F 1E 3C 78 F0 1E0 3C0 780 F00 1E00 3C00 7800 F000 1E000 3C000 78000 F0000 1E0000 3C0000 780000 F00000 1E00000 3C00000 7800000 F000000 1E000000 3C000000 78000000 F0000000 E0000001 C0000003 80000007 F 7F7F7F7F FEFEFEFE FDFDFDFD FBFBFBFB F7F7F7F7 EFEFEFEF DFDFDFDF BFBFBFBF 7F7F7F7F FEFEFEFE FDFDFDFD FBFBFBFB F7F7F7F7 EFEFEFEF DFDFDFDF BFBFBFBF 7F7F7F7F FEFEFEFE FDFDFDFD FBFBFBFB F7F7F7F7 EFEFEFEF DFDFDFDF BFBFBFBF 7F7F7F7F FEFEFEFE FDFDFDFD FBFBFBFB F7F7F7F7 EFEFEFEF DFDFDFDF BFBFBFBF 7F7F7F7F FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 80000000 40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000 400000 200000 100000 80000 40000 20000 10000 8000 4000 2000 1000 800 400 200 100 80 40 20 10 8 4 2 1 F 80000007 C0000003 E0000001 F0000000 78000000 3C000000 1E000000 F000000 7800000 3C00000 1E00000 F00000 780000 3C0000 1E0000 F0000 78000 3C000 1E000 F000 7800 3C00 1E00 F00 780 3C0 1E0 F0 78 3C 1E F 7F7F7F7F BFBFBFBF DFDFDFDF EFEFEFEF F7F7F7F7 FBFBFBFB FDFDFDFD FEFEFEFE 7F7F7F7F BFBFBFBF DFDFDFDF EFEFEFEF F7F7F7F7 FBFBFBFB FDFDFDFD FEFEFEFE 7F7F7F7F BFBFBFBF DFDFDFDF EFEFEFEF F7F7F7F7 FBFBFBFB FDFDFDFD FEFEFEFE 7F7F7F7F BFBFBFBF DFDFDFDF EFEFEFEF F7F7F7F7 FBFBFBFB FDFDFDFD FEFEFEFE 7F7F7F7F FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0 FF F1 81 1 0 1 F 7F FF 0 1 F 7F FF 0 1 F 7F FF 0 1 F 7F FF 0 0 0 0 0 0 FF FF FF FF FF FF 0 0 0 0 0 0 0 0 0 1 2 4 8 10 20 40 80 1 F 1E 3C 78 F0 E1 C3 87 F 7F FE FD FB F7 EF DF BF 7F FF FF FF FF FF FF FF FF FF 0 0 0 0 0 0 0 0 0 1 80 40 20 10 8 4 2 1 F 87 C3 E1 F0 78 3C 1E F 7F BF DF EF F7 FB FD FE 7F FF FF FF FF FF FF FF FF FF mlton-20100608/regression/mlton.word.sml0000644000076600000240000000536511404435617016575 0ustar mtfstafffunctor F (S: sig type word val trials: word list val ~ : word -> word val fromInt: int -> word val max: word val rol: word * Word.word -> word val ror: word * Word.word -> word val toString: word -> string val wordSize: int val zero: word end) = struct open S val rots = List.tabulate (wordSize + 1, Word.fromInt) fun p w = print (concat [toString w, "\n"]) (* Test ~ *) val _ = List.app (p o ~) trials (* Test Algebraic simplifications. *) val _ = List.app (fn w => p (rol (w, 0w0))) trials val _ = List.app (fn w => p (ror (w, 0w0))) trials val _ = List.app (fn w => p (rol (w, Word.fromInt wordSize))) trials val _ = List.app (fn w => p (ror (w, Word.fromInt wordSize))) trials val _ = List.app (fn w => p (rol (zero, w))) [0w1, 0w2, 0w3] val _ = List.app (fn w => p (ror (zero, w))) [0w1, 0w2, 0w3] val _ = List.app (fn w => p (rol (max, w))) [0w1, 0w2, 0w3] val _ = List.app (fn w => p (ror (max, w))) [0w1, 0w2, 0w3] val _ = List.app (fn oper => List.app (fn w => List.app (fn w' => p (oper (w, w'))) rots) trials) [rol, ror] end structure Z = F (open Word MLton.Word val zero: word = 0w0 val max: word = 0wxFFFFFFFF val trials: word list = [0w0, 0w1, 0wxF, 0wx7F7F7F7F, 0wxFFFFFFFF]) structure Z = F (open Word8 MLton.Word8 val zero: word = 0w0 val max: word = 0wxFF val trials: word list = [0w0, 0w1, 0wxF, 0wx7F, 0wxFF]) (* Test unsigned addition and multiplication with overflow checking. *) (* val _ = * (MLton.Word.addCheck (0wxFFFFFFFF, 0wx1) * ; print "BUG\n") * handle Overflow => print "OK\n" * * fun doit (name, f, all) = * List.app * (fn (w, w') => * let * val _ = print (concat ["0x", Word.toString w, " ", name, " ", * "0x", Word.toString w']) * val res = f (w, w') * val _ = print (concat [" = ", Word.toString res, "\n"]) * in * () * end handle Overflow => print " --> Overflow\n") * all * * val _ = doit ("+", MLton.Word.addCheck, * [(0wx7FFFFFFF, 0wx1), * (0wxFFFFFFFE, 0wx1), * (0wxFFFFFFFD, 0wx2), * (0wxFFFFFFFF, 0wx1)]) * * val _ = doit ("*", MLton.Word.mulCheck, * [(0wxFFFFFFFF, 0wx1), * (0wx7FFFFFFF, 0wx2), * (0wx80000000, 0wx2), * (0wxFFFFFFFF, 0wx2)]) *) mlton-20100608/regression/modules.sml0000644000076600000240000001067411404435617016141 0ustar mtfstaffsignature S = sig type t structure S: sig type 'a t val x: 'a t end end structure S: sig datatype ('a, 'b) t = T of 'a end = struct datatype ('b, 'a) t = T of 'b end functor F (eqtype t datatype u = U of t eqtype v sharing type t = v) = struct fun f (u: u) = u = u end functor F (type t eqtype u sharing type t = u) = struct fun f (x: t) = x = x end signature S1 = sig datatype t = T end signature S2 = sig eqtype u structure S: S1 where type t = u end; signature S1 = sig datatype t = T end signature S2 = sig datatype u = U structure S: S1 where type t = u end; signature S = sig datatype t = T end where type t = int signature S = sig type t type u type v = t sharing type u = v end signature S = sig type 'a t type 'a u type 'a v = 'a t sharing type u = v end signature S = sig type t datatype u = U sharing type u = t end signature S = sig type t structure Z: sig datatype u = U end sharing type Z.u = t end signature S = sig eqtype t structure Z: sig datatype u = U end where type u = t end structure S: sig eqtype t structure Z: sig datatype u = U end where type u = t end = struct structure Z = struct datatype u = U end type t = Z.u end functor F () = struct end functor F (type t) = struct type u = t end functor F (val x: int) = struct val y = x end functor F (structure S: sig end) = struct open S end functor F (type t type u sharing type t = u) = struct val id: t -> u = fn x => x end functor F (eqtype t) = struct fun f (x: t) = x = x end functor F (structure S: sig type t end structure T: sig type t end sharing S = T) = struct val id: S.t -> T.t = fn x => x end functor F (datatype 'a t = T of 'a * 'a) = struct val _ = T (13, 14) end functor F (type ('a, 'b) t type 'a u = ('a, int) t val f: (bool, 'b) t -> real val u: bool u) = struct val _ = f u end functor F (datatype t = T datatype u = U of t) = struct fun f (x: u) = x = x end structure S: sig val x: unit list end = struct val x = [] end structure S: sig val x: 'a list end = struct val x = [] end structure S: sig val x: ''a list end = struct val x = [] end structure S: sig val f: ''a -> ''a list end = struct fun f x = [x] end structure S: sig type 'a t val T: int t end = struct datatype 'a t = T end structure S: sig val f: 'a list -> 'a list end = struct fun f _ = [] end val z = S.f [1, 2, 3] structure S = struct datatype t = T end functor F () = S structure S1 = F () structure S2 = F () val _ = S1.T = S2.T datatype t = T functor F () = struct datatype t = datatype t end structure S1 = F () structure S2 = F () val _ = S1.T = S2.T signature SIG = sig type t end functor F (S: sig type t end): SIG = S structure S:> sig structure T: sig type t end structure U: SIG sharing type T.t = U.t end = struct structure T = struct type t = unit end structure U = F (type t = unit) end val f = fn z: S.T.t => z: S.U.t structure S:> sig eqtype t val x: t end = struct type t = unit val x = () end val _ = S.x = S.x val _ = fn x: LargeInt.int => x: IntInf.int signature S = sig type t end structure S:> S = struct datatype t = T end signature T = sig type u include S where type t = S.t end structure T:> T = struct datatype u = U type t = S.t end val _: T.t -> S.t = fn x => x signature SIG = sig type u type v = u end where type v = int structure S: SIG = struct type u = int type v = int end functor F () = struct val A = 0 end structure S = struct datatype z = A structure F = F () end mlton-20100608/regression/msort.sml0000644000076600000240000000125011404435617015623 0ustar mtfstaff fun cp [] =[] | cp (x::xs)= x :: cp xs (* exormorphic merge *) fun merge(xs, []):int list = cp xs | merge([], ys) = cp ys | merge(l1 as x::xs, l2 as y::ys) = if x= stop then () else (f i; loop (i + 1)) in loop start end structure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit structure Mutex: sig type t val new: unit -> t val lock: t -> unit val unlock: t -> unit end end = struct open MLton open Itimer Signal Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new () in fun ready t = Queue.enque (threads, t) fun next () : Thread.Runnable.t = case Queue.deque threads of NONE => valOf (!topLevel) | SOME t => t end fun 'a exit (): 'a = switch (fn _ => (print "exiting\n" ; next ())) fun new (f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f () handle _ => exit ()) ; exit ())), ()) fun schedule t = (ready t; next ()) fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun run (): unit = (switch (fn t => (topLevel := SOME (Thread.prepare (t, ())) ; new (fn () => (setHandler (alrm, Handler.handler schedule) ; setItimer (Time.fromMilliseconds 10))))) ; setItimer Time.zeroTime ; setHandler (alrm, Handler.ignore) ; topLevel := NONE) structure Mutex = struct datatype t = T of {locked: bool ref, waiting: unit Thread.t Queue.t} fun new () = T {locked = ref false, waiting = Queue.new ()} fun lock (T {locked, waiting, ...}) = let fun loop () = (Thread.atomicBegin () ; if !locked then (Thread.atomicEnd () ; switch (fn t => (Queue.enque (waiting, t) ; next ())) ; loop ()) else (locked := true ; Thread.atomicEnd ())) in loop () end fun safeUnlock (T {locked, waiting, ...}) = (locked := false ; (case Queue.deque waiting of NONE => () | SOME t => ready (Thread.prepare (t,())))) fun unlock (m: t) = (Thread.atomicBegin () ; safeUnlock m ; Thread.atomicEnd ()) end end open Thread fun main (name, args) = let val m = Mutex.new () val gotIt = ref false val _ = for (0, 10, fn _ => Thread.spawn (fn () => let val _ = print "starting\n" fun loop i = if i = 0 then () else (Mutex.lock m ; if !gotIt then raise Fail "bug" else (gotIt := true ; for (0, 100000, fn _ => ()) ; gotIt := false ; Mutex.unlock m ; loop (i - 1))) in loop 10000 end)) in run () end val _ = main ( CommandLine.name (), CommandLine.arguments () ) mlton-20100608/regression/nested-loop.ok0000644000076600000240000000000011404435617016516 0ustar mtfstaffmlton-20100608/regression/nested-loop.sml0000644000076600000240000000035711404435617016717 0ustar mtfstafffun loop1 x = if x = 0 then () else (let fun loop2 y = if y = 0 then () else loop2 (y - 1) in loop2 x end; loop1 (x - 1)) val _ = loop1 13 mlton-20100608/regression/nextAfter.ok0000644000076600000240000000312711404435617016242 0ustar mtfstaffnextAfter (~0.0, ~0.0) = ~0.0 OK nextAfter (~0.0, 0.0) = 0.0 OK nextAfter (0.0, ~0.0) = ~0.0 OK nextAfter (0.0, 0.0) = 0.0 OK nextAfter (~0.0, inf) = 0.1E~44 OK nextAfter (~0.0, ~inf) = ~0.1E~44 OK nextAfter (0.0, inf) = 0.1E~44 OK nextAfter (0.0, ~inf) = ~0.1E~44 OK nextAfter (0.1E~44, 0.0) = 0.0 OK nextAfter (0.1E~44, ~0.0) = 0.0 OK nextAfter (0.1E~44, ~inf) = 0.0 OK nextAfter (~0.1E~44, 0.0) = ~0.0 OK nextAfter (~0.1E~44, ~0.0) = ~0.0 OK nextAfter (~0.1E~44, inf) = ~0.0 OK nextAfter (0.1E~44, 0.1E~44) = 0.1E~44 OK nextAfter (~0.1E~44, ~0.1E~44) = ~0.1E~44 OK nextAfter (0.1E~44, inf) = 0.3E~44 OK nextAfter (~0.1E~44, ~inf) = ~0.3E~44 OK nextAfter (0.34028235E39, inf) = inf OK nextAfter (~0.34028235E39, ~inf) = ~inf OK nextAfter (0.11754942E~37, inf) = 0.11754944E~37 OK nextAfter (~0.0, ~0.0) = ~0.0 OK nextAfter (~0.0, 0.0) = 0.0 OK nextAfter (0.0, ~0.0) = ~0.0 OK nextAfter (0.0, 0.0) = 0.0 OK nextAfter (~0.0, inf) = 0.5E~323 OK nextAfter (~0.0, ~inf) = ~0.5E~323 OK nextAfter (0.0, inf) = 0.5E~323 OK nextAfter (0.0, ~inf) = ~0.5E~323 OK nextAfter (0.5E~323, 0.0) = 0.0 OK nextAfter (0.5E~323, ~0.0) = 0.0 OK nextAfter (0.5E~323, ~inf) = 0.0 OK nextAfter (~0.5E~323, 0.0) = ~0.0 OK nextAfter (~0.5E~323, ~0.0) = ~0.0 OK nextAfter (~0.5E~323, inf) = ~0.0 OK nextAfter (0.5E~323, 0.5E~323) = 0.5E~323 OK nextAfter (~0.5E~323, ~0.5E~323) = ~0.5E~323 OK nextAfter (0.5E~323, inf) = 0.1E~322 OK nextAfter (~0.5E~323, ~inf) = ~0.1E~322 OK nextAfter (0.17976931348623157E309, inf) = inf OK nextAfter (~0.17976931348623157E309, ~inf) = ~inf OK nextAfter (0.2225073858507201E~307, inf) = 0.22250738585072014E~307 OK mlton-20100608/regression/nextAfter.sml0000644000076600000240000000231011404435617016415 0ustar mtfstafffunctor Test (R: REAL) = struct open R val posZero = minPos - minPos val negZero = ~posZero val rs = [(negZero, negZero, negZero), (negZero, posZero, posZero), (posZero, negZero, negZero), (posZero, posZero, posZero), (negZero, posInf, minPos), (negZero, negInf, ~minPos), (posZero, posInf, minPos), (posZero, negInf, ~minPos), (minPos, posZero, posZero), (minPos, negZero, posZero), (minPos, negInf, posZero), (~minPos, posZero, negZero), (~minPos, negZero, negZero), (~minPos, posInf, negZero), (minPos, minPos, minPos), (~minPos, ~minPos, ~minPos), (minPos, posInf, fromInt 2 * minPos), (~minPos, negInf, ~(fromInt 2 * minPos)), (maxFinite, posInf, posInf), (~maxFinite, negInf, negInf), (nextAfter (minNormalPos, negInf), posInf, minNormalPos)] val () = List.app (fn (x, y, z) => let val r2s = fmt StringCvt.EXACT val z' = nextAfter (x, y) in print (concat ["nextAfter (", r2s x, ", ", r2s y, ") = ", r2s z', " ", if == (z, z') then "OK" else concat ["<> ", r2s z], "\n"]) end) rs end structure Z = Test (Real32) structure Z = Test (Real64) mlton-20100608/regression/nonexhaustive.ok0000644000076600000240000000000011404435617017165 0ustar mtfstaffmlton-20100608/regression/nonexhaustive.sml0000644000076600000240000001406211404435620017356 0ustar mtfstaff(* nonexhaustive.sml *) val _ = case 2 of 2 => 3 | 3 => 4 val _ = case [] of [] => 1 val _ = case [] of [] => 0 | [_] => 1 | [_, _] => 2 fun first l = case l of SOME x :: _ => x fun f x = case x of (false, false) => () | (true, true) => () datatype z = A | B | C fun f x = case x of (A, B, C) => () val _ = case Fail "foo" of Fail _ => false val _ = case (1, []) of (1, []) => true val _ = case (1, []) of (1, _) => true fun f 1 2 = 3 fun f "" = () fun f #"a" = 13 fun f (0w0: Word8.word) = 13 (* Checks for non-exhaustive pattern matches (compiler should warn). *) fun ord #"\000" = 0 | ord #"\002" = 2 | ord #"\003" = 3 | ord #"\004" = 4 | ord #"\005" = 5 | ord #"\006" = 6 | ord #"\007" = 7 | ord #"\008" = 8 | ord #"\009" = 9 | ord #"\010" = 10 | ord #"\011" = 11 | ord #"\012" = 12 | ord #"\013" = 13 | ord #"\014" = 14 | ord #"\015" = 15 | ord #"\016" = 16 | ord #"\017" = 17 | ord #"\018" = 18 | ord #"\019" = 19 | ord #"\020" = 20 | ord #"\021" = 21 | ord #"\022" = 22 | ord #"\023" = 23 | ord #"\024" = 24 | ord #"\025" = 25 | ord #"\026" = 26 | ord #"\027" = 27 | ord #"\028" = 28 | ord #"\029" = 29 | ord #"\030" = 30 | ord #"\031" = 31 | ord #"\032" = 32 | ord #"\033" = 33 | ord #"\034" = 34 | ord #"\035" = 35 | ord #"\036" = 36 | ord #"\037" = 37 | ord #"\038" = 38 | ord #"\039" = 39 | ord #"\040" = 40 | ord #"\041" = 41 | ord #"\042" = 42 | ord #"\043" = 43 | ord #"\044" = 44 | ord #"\045" = 45 | ord #"\046" = 46 | ord #"\047" = 47 | ord #"\048" = 48 | ord #"\049" = 49 | ord #"\050" = 50 | ord #"\051" = 51 | ord #"\052" = 52 | ord #"\053" = 53 | ord #"\054" = 54 | ord #"\055" = 55 | ord #"\056" = 56 | ord #"\057" = 57 | ord #"\058" = 58 | ord #"\059" = 59 | ord #"\060" = 60 | ord #"\061" = 61 | ord #"\062" = 62 | ord #"\063" = 63 | ord #"\064" = 64 | ord #"\065" = 65 | ord #"\066" = 66 | ord #"\067" = 67 | ord #"\068" = 68 | ord #"\069" = 69 | ord #"\070" = 70 | ord #"\071" = 71 | ord #"\072" = 72 | ord #"\073" = 73 | ord #"\074" = 74 | ord #"\075" = 75 | ord #"\076" = 76 | ord #"\077" = 77 | ord #"\078" = 78 | ord #"\079" = 79 | ord #"\080" = 80 | ord #"\081" = 81 | ord #"\082" = 82 | ord #"\083" = 83 | ord #"\084" = 84 | ord #"\085" = 85 | ord #"\086" = 86 | ord #"\087" = 87 | ord #"\088" = 88 | ord #"\089" = 89 | ord #"\090" = 90 | ord #"\091" = 91 | ord #"\092" = 92 | ord #"\093" = 93 | ord #"\094" = 94 | ord #"\095" = 95 | ord #"\096" = 96 | ord #"\097" = 97 | ord #"\098" = 98 | ord #"\099" = 99 | ord #"\100" = 100 | ord #"\101" = 101 | ord #"\102" = 102 | ord #"\103" = 103 | ord #"\104" = 104 | ord #"\105" = 105 | ord #"\106" = 106 | ord #"\107" = 107 | ord #"\108" = 108 | ord #"\109" = 109 | ord #"\110" = 110 | ord #"\111" = 111 | ord #"\112" = 112 | ord #"\113" = 113 | ord #"\114" = 114 | ord #"\115" = 115 | ord #"\116" = 116 | ord #"\117" = 117 | ord #"\118" = 118 | ord #"\119" = 119 | ord #"\120" = 120 | ord #"\121" = 121 | ord #"\122" = 122 | ord #"\123" = 123 | ord #"\124" = 124 | ord #"\125" = 125 | ord #"\126" = 126 | ord #"\127" = 127 | ord #"\128" = 128 | ord #"\129" = 129 | ord #"\130" = 130 | ord #"\131" = 131 | ord #"\132" = 132 | ord #"\133" = 133 | ord #"\134" = 134 | ord #"\135" = 135 | ord #"\136" = 136 | ord #"\137" = 137 | ord #"\138" = 138 | ord #"\139" = 139 | ord #"\140" = 140 | ord #"\141" = 141 | ord #"\142" = 142 | ord #"\143" = 143 | ord #"\144" = 144 | ord #"\145" = 145 | ord #"\146" = 146 | ord #"\147" = 147 | ord #"\148" = 148 | ord #"\149" = 149 | ord #"\150" = 150 | ord #"\151" = 151 | ord #"\152" = 152 | ord #"\153" = 153 | ord #"\154" = 154 | ord #"\155" = 155 | ord #"\156" = 156 | ord #"\157" = 157 | ord #"\158" = 158 | ord #"\159" = 159 | ord #"\160" = 160 | ord #"\161" = 161 | ord #"\162" = 162 | ord #"\163" = 163 | ord #"\164" = 164 | ord #"\165" = 165 | ord #"\166" = 166 | ord #"\167" = 167 | ord #"\168" = 168 | ord #"\169" = 169 | ord #"\170" = 170 | ord #"\171" = 171 | ord #"\172" = 172 | ord #"\173" = 173 | ord #"\174" = 174 | ord #"\175" = 175 | ord #"\176" = 176 | ord #"\177" = 177 | ord #"\178" = 178 | ord #"\179" = 179 | ord #"\180" = 180 | ord #"\181" = 181 | ord #"\182" = 182 | ord #"\183" = 183 | ord #"\184" = 184 | ord #"\185" = 185 | ord #"\186" = 186 | ord #"\187" = 187 | ord #"\188" = 188 | ord #"\189" = 189 | ord #"\190" = 190 | ord #"\191" = 191 | ord #"\192" = 192 | ord #"\193" = 193 | ord #"\194" = 194 | ord #"\195" = 195 | ord #"\196" = 196 | ord #"\197" = 197 | ord #"\198" = 198 | ord #"\199" = 199 | ord #"\200" = 200 | ord #"\201" = 201 | ord #"\202" = 202 | ord #"\203" = 203 | ord #"\204" = 204 | ord #"\205" = 205 | ord #"\206" = 206 | ord #"\207" = 207 | ord #"\208" = 208 | ord #"\209" = 209 | ord #"\210" = 210 | ord #"\211" = 211 | ord #"\212" = 212 | ord #"\213" = 213 | ord #"\214" = 214 | ord #"\215" = 215 | ord #"\216" = 216 | ord #"\217" = 217 | ord #"\218" = 218 | ord #"\219" = 219 | ord #"\220" = 220 | ord #"\221" = 221 | ord #"\222" = 222 | ord #"\223" = 223 | ord #"\224" = 224 | ord #"\225" = 225 | ord #"\226" = 226 | ord #"\227" = 227 | ord #"\228" = 228 | ord #"\229" = 229 | ord #"\230" = 230 | ord #"\231" = 231 | ord #"\232" = 232 | ord #"\233" = 233 | ord #"\234" = 234 | ord #"\235" = 235 | ord #"\236" = 236 | ord #"\237" = 237 | ord #"\238" = 238 | ord #"\239" = 239 | ord #"\240" = 240 | ord #"\241" = 241 | ord #"\242" = 242 | ord #"\243" = 243 | ord #"\244" = 244 | ord #"\245" = 245 | ord #"\246" = 246 | ord #"\247" = 247 | ord #"\248" = 248 | ord #"\249" = 249 | ord #"\250" = 250 | ord #"\251" = 251 | ord #"\252" = 252 | ord #"\253" = 253 | ord #"\254" = 254 | ord #"\255" = 255; mlton-20100608/regression/nonterminate/0000755000076600000240000000000011404470407016443 5ustar mtfstaffmlton-20100608/regression/nonterminate/8.sml0000644000076600000240000000024011404435614017324 0ustar mtfstaffdatatype t = T of t datatype u = A of int | B of t * int fun f () = T (f ()) val _ = case if 0 = 0 then B (f (), 13) else A 13 of B (_, n) => n + 1 mlton-20100608/regression/once.ok0000644000076600000240000000027111404435620015215 0ustar mtfstaffa = 12 b = 12 a = 11 b = 12 a = 10 b = 12 a = 9 b = 12 a = 8 b = 12 a = 7 b = 12 a = 6 b = 12 a = 5 b = 12 a = 4 b = 12 a = 3 b = 12 a = 2 b = 12 a = 1 b = 12 a = 0 b = 12 mlton-20100608/regression/once.sml0000644000076600000240000000056111404435620015401 0ustar mtfstaffopen SMLofNJ.Cont val r: unit cont option ref = ref NONE val a = ref 13 val () = callcc(fn k => r := SOME k) val b = ref 13 val _ = a := !a - 1 val _ = b := !b - 1 val _ = print(concat["a = ", Int.toString(!a), " b = ", Int.toString(!b), "\n"]) val _ = if !a = 0 then () else throw (valOf(!r)) () mlton-20100608/regression/only-one-exception.nonterm0000644000076600000240000000000011404435617021072 0ustar mtfstaffmlton-20100608/regression/only-one-exception.sml0000644000076600000240000000015711404435621020213 0ustar mtfstafffun f n = if n = 0 then 0 else f (f (n - 1)) val _ = f 13 fun loop () = loop () val _ = loop () mlton-20100608/regression/opaque.ok0000644000076600000240000000006011404435617015565 0ustar mtfstafff.a = 232 g.A = A g.B = B h.b = 343 i.c = (A,C) mlton-20100608/regression/opaque.sml0000644000076600000240000000405511404435617015757 0ustar mtfstaff(* From Chapter 5 of Elsman's PhD thesis; these examples should * elaborate. *) (* Decrease in generativity *) functor f() = struct type a = int val a = 232 val pr = Int.toString end :> sig type a val a : a val pr : a -> string end structure f = f() val _ = print ("f.a = " ^ f.pr f.a ^ "\n") functor g() = struct datatype a = A | B fun pr_a A = "A" | pr_a B = "B" val pr_b = pr_a type b = a end :> sig type a type b val A : a val B : b val pr_a : a -> string val pr_b : b -> string end structure g = g() val _ = print ("g.A = " ^ g.pr_a g.A ^ "\n") val _ = print ("g.B = " ^ g.pr_b g.B ^ "\n") functor h(s : sig type a val pr : a -> string val a : a end) = struct val pr = s.pr val b = s.a type b = s.a end :> sig type b val pr : b -> string val b : b end structure h = h(struct type a = int val pr = Int.toString val a = 343 end) val _ = print ("h.b = " ^ h.pr h.b ^ "\n") (* Increase in generativity *) functor i() = struct datatype a = A and b = B | C type c = a * b val c = (A,C) fun pr (A,B) = "(A,B)" | pr (A,C) = "(A,C)" end :> sig type c val c : c val pr : c -> string end structure i = i() val _ = print ("i.c = " ^ i.pr i.c ^ "\n") (* Signature S below is well-formed, but after opacity elimination it * is not. No real structure (i.e., a structure existing outside of a * functor body) can match the signature S. The signature should * elaborate, however. *) structure S = struct type s = int * int end :> sig eqtype s end signature S = sig datatype u = A end where type u = S.s mlton-20100608/regression/opaque2.ok0000644000076600000240000000000011404435617015641 0ustar mtfstaffmlton-20100608/regression/opaque2.sml0000644000076600000240000000053411404435617016037 0ustar mtfstaffstructure S :> sig type ('a,'b) t val f : ('a,'b) t -> ('b,'a) t val mk : 'a * 'b -> ('a,'b) t end = struct type ('a,'b) t = 'b * 'a fun f (x,y) = (y,x) fun mk (a,b) = (b,a) end val a = S.mk (5, "hello") val b = S.f amlton-20100608/regression/open.ok0000644000076600000240000000000011404435617015226 0ustar mtfstaffmlton-20100608/regression/open.sml0000644000076600000240000000030211404435617015415 0ustar mtfstaff(* open.sml *) (* Checks scoping rules of open. *) structure A = struct structure B = struct val x = 1 end end structure B = struct val x = 0.1 end open A B val y = B.x + 1 val z = x + 1.0; mlton-20100608/regression/os-exit.ok0000644000076600000240000000000611404435620015655 0ustar mtfstaffhello mlton-20100608/regression/os-exit.sml0000644000076600000240000000014111404435620016037 0ustar mtfstaffval _ = (TextIO.output (TextIO.stdOut, "hello\n") ; OS.Process.exit OS.Process.success) mlton-20100608/regression/overloading.ok0000644000076600000240000000000011404435617016576 0ustar mtfstaffmlton-20100608/regression/overloading.sml0000644000076600000240000000055211404435620016766 0ustar mtfstaff(* overloading.sml *) (* Checks overloading resolution. *) val z = 1: Int16.int val y = z + 2 val x = (valOf Int16.minInt) + z fun f(x,y) = (x + y)/y fun g(x,y) = x + (y/y) signature S = sig end val x = f(1.2, 2.3) + g(1.0, 2.0); fun f x = x + let fun g() = x in g() * 2.0 end; (* Checks each overloaded operator at each type. *) mlton-20100608/regression/pack-real.2.ok0000644000076600000240000000010211404435620016261 0ustar mtfstaff576.105263158 576.105263158 9.93985099471E~242 9.93985099471E~242 mlton-20100608/regression/pack-real.2.sml0000644000076600000240000000074711404435620016462 0ustar mtfstaff val v = Word8Vector.fromList [0wx0D,0wxE5,0wx35,0wx94,0wxD7,0wx00,0wx82,0wx40, 0wx0D,0wxE5,0wx35,0wx94,0wxD7,0wx00,0wx82,0wx40] val r = PackReal64Little.subVec(v, 0) val () = print (concat [Real64.toString r, "\n"]) val r = PackReal64Little.subVec(v, 1) val () = print (concat [Real64.toString r, "\n"]) val r = PackReal64Big.subVec(v, 0) val () = print (concat [Real64.toString r, "\n"]) val r = PackReal64Big.subVec(v, 1) val () = print (concat [Real64.toString r, "\n"]) mlton-20100608/regression/pack-real.ok0000644000076600000240000000245211404435617016141 0ustar mtfstaffr = ~inf FF800000 r = ~0.1E3 C2C80000 r = ~0.11E1 BF8CCCCD r = ~0.12345 BDFCD35B r = ~0.0 80000000 r = 0.0 00000000 r = 0.1E~44 00000001 r = 0.11754944E~37 00800000 r = 0.1E1 3F800000 r = 0.2E1 40000000 r = 0.123E9 4CEA9A98 r = 0.34028235E39 7F7FFFFF r = inf 7F800000 r = ~inf 000080FF r = ~0.1E3 0000C8C2 r = ~0.11E1 CDCC8CBF r = ~0.12345 5BD3FCBD r = ~0.0 00000080 r = 0.0 00000000 r = 0.1E~44 01000000 r = 0.11754944E~37 00008000 r = 0.1E1 0000803F r = 0.2E1 00000040 r = 0.123E9 989AEA4C r = 0.34028235E39 FFFF7F7F r = inf 0000807F r = ~inf FFF0000000000000 r = ~0.1E3 C059000000000000 r = ~0.11E1 BFF199999999999A r = ~0.12345 BFBF9A6B50B0F27C r = ~0.0 8000000000000000 r = 0.0 0000000000000000 r = 0.5E~323 0000000000000001 r = 0.22250738585072014E~307 0010000000000000 r = 0.1E1 3FF0000000000000 r = 0.2E1 4000000000000000 r = 0.123E9 419D535300000000 r = 0.17976931348623157E309 7FEFFFFFFFFFFFFF r = inf 7FF0000000000000 r = ~inf 000000000000F0FF r = ~0.1E3 00000000000059C0 r = ~0.11E1 9A9999999999F1BF r = ~0.12345 7CF2B0506B9ABFBF r = ~0.0 0000000000000080 r = 0.0 0000000000000000 r = 0.5E~323 0100000000000000 r = 0.22250738585072014E~307 0000000000001000 r = 0.1E1 000000000000F03F r = 0.2E1 0000000000000040 r = 0.123E9 0000000053539D41 r = 0.17976931348623157E309 FFFFFFFFFFFFEF7F r = inf 000000000000F07F mlton-20100608/regression/pack-real.sml0000644000076600000240000000403411404435617016321 0ustar mtfstafffunctor Test (structure PackReal: PACK_REAL structure Real: REAL val tests: Real.real list sharing type PackReal.real = Real.real) = struct val _ = if List.all (fn r => let val v = PackReal.toBytes r val _ = print (concat ["r = ", Real.fmt StringCvt.EXACT r, "\t"]) val _ = Word8Vector.app (fn w => let val s = Word8.toString w in print (if String.size s = 1 then concat ["0", s] else s) end) v val _ = print "\n" in Real.== (r, PackReal.fromBytes v) end) tests then () else raise Fail "failure" end val real32Tests = let open Real32 in [negInf, ~100.0, ~1.1, ~0.12345, ~0.0, 0.0, minPos, minNormalPos, 1.0, 2.0, 123E6, maxFinite, posInf] end val real64Tests = let open Real64 in [negInf, ~100.0, ~1.1, ~0.12345, ~0.0, 0.0, minPos, minNormalPos, 1.0, 2.0, 123E6, maxFinite, posInf] end structure Z = Test (structure PackReal = PackReal32Big structure Real = Real32 val tests = real32Tests) structure Z = Test (structure PackReal = PackReal32Little structure Real = Real32 val tests = real32Tests) structure Z = Test (structure PackReal = PackReal64Big structure Real = Real64 val tests = real64Tests) structure Z = Test (structure PackReal = PackReal64Little structure Real = Real64 val tests = real64Tests) mlton-20100608/regression/pack-word.ok0000644000076600000240000000014411404435617016165 0ustar mtfstaff3020100 7060504 OK OK OK 10203 4050607 OK OK OK FFFEFDFC 7060504 OK OK OK FFFEFDFC 4050607 OK OK OK mlton-20100608/regression/pack-word.sml0000644000076600000240000000151111404435621016341 0ustar mtfstafffunctor F (P: PACK_WORD) = struct val v = Word8Vector.tabulate (11, Word8.fromInt) fun p i = print (concat [LargeWord.toString (P.subVec (v, i)), "\n"]) val _ = (p 0; p 1) val _ = List.app (fn i => p i handle Subscript => print "OK\n") [~1, 2, valOf Int.maxInt] end structure S = F (PackWord32Little) structure S = F (PackWord32Big) functor F (P: PACK_WORD) = struct val a = Word8Array.tabulate (11, Word8.fromInt) val _ = P.update (a, 0, 0wxFFFEFDFC) fun p i = print (concat [LargeWord.toString (P.subArr (a, i)), "\n"]) val _ = (p 0; p 1) val _ = List.app (fn i => p i handle Subscript => print "OK\n") [~1, 2, valOf Int.maxInt] end structure S = F (PackWord32Little) structure S = F (PackWord32Big) mlton-20100608/regression/pack.ok0000644000076600000240000000000311404435617015206 0ustar mtfstaffOK mlton-20100608/regression/pack.sml0000644000076600000240000000044211404435617015377 0ustar mtfstaffopen Array MLton.GC val a = tabulate (100000, fn i => i) val _ = pack () val a' = tabulate (100, fn i => i) val _ = unpack () val _ = sub (a, 0) + sub (a, 1) val _ = sub (a', 0) + sub (a', 1) val a'' = tabulate (1000000, fn i => i) val _ = sub (a'', 0) + sub (a'', 1) val _ = print "OK\n" mlton-20100608/regression/parse.ok0000644000076600000240000000004711404435617015412 0ustar mtfstaffThe name of the structure is: MyStruct mlton-20100608/regression/parse.sml0000644000076600000240000010410311404435621015565 0ustar mtfstaff(* MLton 20020329 (built Fri Mar 29 21:56:03 2002 on asv-058) *) (* created this file on Wed Apr 3 11:12:56 2002. *) (* Do not edit this file. *) (* Flag settings: *) (* chunk: chunk per function *) (* debug: false *) (* defines: [] *) (* detect overflow: true *) (* drop passes: [] *) (* exn history: false *) (* fixed heap: None *) (* gc check: Limit *) (* host: self *) (* host type: Linux *) (* indentation: 3 *) (* includes: [mlton.h] *) (* inline: NonRecursive {product = 320,small = 60} *) (* input file: sources *) (* instrument: false *) (* instrument Sxml: false *) (* keepSSA: false *) (* keep diagnostics: [] *) (* keep dot: false *) (* keep passes: [] *) (* lib dir: /usr/local/lib/mlton/self *) (* limit check: loop headers (fullCFG = false, loopExits = true) *) (* limit check counts: false *) (* loop passes: 1 *) (* native: true *) (* native commented: 0 *) (* native live stack: false *) (* native optimize: 1 *) (* native move hoist: true *) (* native copy prop: true *) (* native cutoff: 100 *) (* native live transfer: 8 *) (* native future: 64 *) (* native ieee fp: false *) (* native split: Some (20000) *) (* new return: false *) (* polyvariance: Some ({rounds = 2,small = 30,product = 300}) *) (* print at fun entry: false *) (* profile: false *) (* safe: true *) (* show basis used: false *) (* show types: false *) (* stack cont: false *) (* static: false *) (* TextIO buffer size: 4096 *) (* type check: false *) (* use basis library: true *) (* verbosity: Silent *) (* start of FunctionalIO/srcSML/FunctionalIO_sig.sml *) (* This file is part of the FunctionalIO project - which provides functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). E-mail: anoq@HardcoreProcessing.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) signature FUNCTIONAL_IO = sig include IO type vector type elem type instream type outstream val input : instream -> vector * instream val input1 : instream -> (elem * instream) option val inputN : (instream * int) -> vector * instream val closeIn : instream -> unit (* Closes file for further input. New end of file becomes the furthest position in the file that has been read internally. *) end signature FUNC_BIN_IO = sig include FUNCTIONAL_IO val openIn : string -> instream end (* For now we just keep things simple *) signature FUNC_TEXT_IO = FUNC_BIN_IO(* stop of FunctionalIO/srcSML/FunctionalIO_sig.sml *) (* start of FunctionalIO/srcSML/FunctionalIO.sml *) (* This file is part of the FunctionalIO project - which provides functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). E-mail: anoq@HardcoreProcessing.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Notice: This is not thread safe! *) functor FFunctionalIO(type vec type element type instream val impOpenIn : string -> instream val impCloseIn : instream -> unit val impInput : instream -> vec val vecConcat : vec list -> vec val vecExtract : (vec * int * int option) -> vec val vecSub : (vec * int) -> element val vecLength : vec -> int) = struct open IO type vector = vec type elem = element datatype impInChunk = ImpInChunkEnd | ImpInChunkVector of vector * (impInChunk ref) | ImpInChunkStream of instream (* The integer is a functional position in the first vector chunk - if there is a vector chunk at all. *) type instream = int * (impInChunk ref) type outstream = unit (* Internal function implementing inputN *) fun fInputN _ acc inStrRef ImpInChunkEnd n = (* (print "inputN, ChunkEnd\n"; *) (vecConcat (rev acc), (0, inStrRef)) | fInputN pos acc inStrRef (ImpInChunkVector (v, next)) n = let (* val _ = print "inputN, ChunkVector\n" *) val len = vecLength v - pos in if len = n then if pos = 0 then (vecConcat (rev (v::acc)), (0, next)) else let val data = vecExtract (v, pos, SOME(n)) in (vecConcat (rev (data::acc)), (0, next)) end else if len > n then let val data = vecExtract (v, pos, SOME(n)) in (vecConcat (rev (data::acc)), (pos + n, inStrRef)) end else (* i.e.: len < n *) let val data = vecExtract (v, pos, SOME(len)) in fInputN 0 (data::acc) next (!next) (n - len) end end | fInputN _ acc inStrRef (ImpInChunkStream inStr) n = let (* val _ = print "inputN, ChunkStream\n" *) val newVec = impInput inStr val _ = inStrRef := (case vecLength newVec of 0 => (impCloseIn inStr; ImpInChunkEnd) | _ => ImpInChunkVector (newVec, ref (ImpInChunkStream inStr))) in fInputN 0 acc inStrRef (!inStrRef) n end (* FIXME: Return 0-length vector for NONE? *) fun inputN ((pos, inStr), n) = if n < 0 then (* FIXME: No check for maxLen! *) raise Size else fInputN pos nil inStr (!inStr) n (* FIXME: Implement more efficiently... *) fun input1 inStr = let val (v, s) = inputN (inStr, 1) in if vecLength v >= 1 then SOME(vecSub (v, 0), s) else NONE end (* Internal function implementing input *) fun fInput pos inStrRef (ImpInChunkVector (v, next)) = (vecExtract (v, pos, NONE), (0, next)) | fInput pos inStrRef _ = (* FIXME: Implement more efficiently? *) fInputN 0 nil inStrRef (!inStrRef) 64 fun input (pos, inStr) = fInput pos inStr (!inStr) (* Internal function implementing closeIn Maybe we should make a more general parametrized traverse function... *) fun fCloseIn inStrRef (ImpInChunkStream inStr) = (impCloseIn inStr; inStrRef := ImpInChunkEnd) | fCloseIn _ ImpInChunkEnd = () | fCloseIn _ (ImpInChunkVector (_, next)) = fCloseIn next (!next) (* Closes file for further input. New end of file becomes the furthest position in the file that has been read internally. *) fun closeIn (_, inStr) = fCloseIn inStr (!inStr) fun openIn fileName = (0, ref (ImpInChunkStream (impOpenIn fileName))) end structure Word8Vector = struct open Word8Vector fun extract (arr, s, l) = Word8VectorSlice.vector (Word8VectorSlice.slice (arr, s, l)) end structure CharVector = struct open CharVector fun extract (arr, s, l) = CharVectorSlice.vector (CharVectorSlice.slice (arr, s, l)) end structure FuncBinIO = FFunctionalIO(type vec = Word8Vector.vector type element = Word8.word type instream = BinIO.instream val impOpenIn = BinIO.openIn val impCloseIn = BinIO.closeIn val impInput = BinIO.input val vecConcat = Word8Vector.concat val vecExtract = Word8Vector.extract val vecSub = Word8Vector.sub val vecLength = Word8Vector.length) :> FUNC_BIN_IO where type vector = Word8Vector.vector and type elem = Word8.word structure FuncTextIO = FFunctionalIO(type vec = CharVector.vector type element = Char.char type instream = TextIO.instream val impOpenIn = TextIO.openIn val impCloseIn = TextIO.closeIn val impInput = TextIO.input val vecConcat = CharVector.concat val vecExtract = CharVector.extract val vecSub = CharVector.sub val vecLength = CharVector.length) :> FUNC_TEXT_IO where type vector = CharVector.vector and type elem = Char.char(* stop of FunctionalIO/srcSML/FunctionalIO.sml *) (* start of ParsingToolkit/srcSML/ParserCombinators_sig.sml *) (* This file is part of the ParsingToolkit project - which provides combinator parsers for functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). Authors: Fritz Henglein ANOQ of the Sun (alias Johnny Andersen) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Built upon Fritz Henglein's implementation of parser combinators as found in Larry Paulson's "ML for the Working Programmer" *) signature PARSER_COMBINATORS = sig type instream (* This is FuncTextIO.instream in TextIOParserCombinators and FuncBinIO.instream in BinIOParserCombinators *) type vec (* This is string in TextIOParserCombinators and Word8Vector.vector in BinIOParserCombinators *) type elem (* This is char in TextIOParserCombinators and Word8.word in BinIOParserCombinators *) (* This is the type of a parser. A parser is a function taking a functional instream as argument. It returns a value that has been created by the parser during parsing, and a new functional instream with the stream position updated to where the parser stopped reading. *) type 'a parser = instream -> ('a * instream) (* SyntaxError is raised when a parser fails to parse. *) exception SyntaxError of string * instream (* Functions given to the >> combinator are expected to raise ValidityError on invalid arguments. *) exception ValidityError of string (* The combinators *) (* The purpose of this combinator is to try parsing with 2 parser functions and return the result of the first function that succeeds. *) val || : ('a parser) * ('a parser) -> ('a parser) (* This combinator will execute 2 parsers in sequence and return a pair of the results of the parsers. *) val -- : ('a parser) * ('b parser) -> (('a * 'b) parser) (* This combinator executes 2 parsers in sequence and ignores the result of the first parser. *) val $-- : ('a parser) * ('b parser) -> ('b parser) (* This combinator executes 2 parsers in sequence and ignores the result of the second parser. *) val --$ : ('a parser) * ('b parser) -> ('a parser) (* Execute a parser and run the result through a function. *) val >> : ('a parser) * ('a -> 'b) -> ('b parser) (* This combinator is for reading an verifying an expected keyword. *) val $$ : vec -> (vec parser) (* Some handy built-in parsers. *) (* Doesn't parse anything, just returns nil. *) val empty : ('a list) parser (* Given a predicate, returns a parser that will read an element from the stream if the predicate is true. *) val getIf : (elem -> bool) -> (elem parser) (* Given a parser, returns a parser that will read a list of values with the given parser. Parses as many values as possible. *) val repeat : ('a parser) -> (('a list) parser) (* Given a predicate, returns a parser that will read a list of elements, until the predicate is false. *) val repeatIf : (elem -> bool) -> ((elem list) parser) (* Given a number n and a parser, returns a parser that parses a list of n values with the given parser. *) val repeatN : int -> ('a parser) -> ('a list parser) (* Same as repeatIf, except that this will read at least one value - or fail. *) val repeatOneIf : (elem -> bool) -> ((elem list) parser) end (* stop of ParsingToolkit/srcSML/ParserCombinators_sig.sml *) (* start of ParsingToolkit/srcSML/ParserCombinators.sml *) (* This file is part of the ParsingToolkit project - which provides combinator parsers for functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). Authors: Fritz Henglein ANOQ of the Sun (alias Johnny Andersen) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Built upon Fritz Henglein's implementation of parser combinators as found in Larry Paulson's "ML for the Working Programmer" *) infix 6 $-- infix 6 --$ infix 5 -- infix 3 >> (* infix 1 // *) infix 0 || functor FParserCombinators(structure FIO : FUNCTIONAL_IO type vec type elem val elemToString : elem -> string val vecLength : vec -> int val vecEqual : (vec * vec) -> bool val vecToString : vec -> string sharing type elem = FIO.elem sharing type vec = FIO.vector) :> PARSER_COMBINATORS where type instream = FIO.instream and type vec = vec and type elem = elem = struct type instream = FIO.instream type vec = vec type elem = elem (* FIXME: Use FIO.StreamIO.PrimIO.compare instead... *) (* val csSize = Substring.size *) (* Exceptions for combinator errors *) exception SyntaxError of string * instream exception ValidityError of string type 'a parser = instream -> ('a * instream) fun (pf1 || pf2) stream = pf1 stream handle exn1 as (SyntaxError (_, stream1)) => (pf2 stream handle exn2 as (SyntaxError (_, stream2)) => raise exn1 (* FIXME: We could compare with FIO.StreamIO.PrimIO.compare if it was implemented *) (* if csSize stream1 < csSize stream2 then raise exn1 else raise exn2 *) ) fun (pf1 -- pf2) stream = let val (res1, stream1) = pf1 stream val (res2, stream2) = pf2 stream1 in ((res1, res2), stream2) end fun (pf1 $-- pf2) stream = let val (_, stream1) = pf1 stream in pf2 stream1 end fun (pf1 --$ pf2) stream = let val (res1, stream1) = pf1 stream val (_, stream2) = pf2 stream1 in (res1, stream2) end fun (pf >> f) stream = let val (res, stream') = pf stream in (f res, stream') handle ValidityError msg => raise SyntaxError (msg, stream') end fun $$ s stream = let val (v, stream2) = FIO.inputN (stream, vecLength s) in if vecEqual (v, s) then (s, stream2) else raise SyntaxError ((vecToString s) ^ " expected", stream) end fun empty stream = (nil, stream) (* Utility functions *) (* This implementation (and several others I've tried) runs out of memory on test.rib. I assume it is because of the stack of exceptions. *) (* fun repeat pf stream = (pf -- repeat pf >> op:: || empty) stream *) (* Working implementation of repeat - takes 1.45 sec for parsing test.rib when using SML/NJ 110.0.6 on Linux on a 166Mhz Pentium. It does not use huge amounts of memory when compared to the amount of data being read. *) fun repeat pf stream = let fun oneIter stream = let val (res, stream') = pf stream in (SOME(res), stream') end handle SyntaxError _ => (NONE, stream) fun rep acc (NONE, stream) = (rev acc, stream) | rep acc (SOME(res), stream) = rep (res :: acc) (oneIter stream) in rep nil (oneIter stream) end fun repeatN n pf stream = if n > 0 then let fun oneIter stream = let val (res, stream') = pf stream in (SOME(res), stream') end handle SyntaxError _ => (NONE, stream) fun rep n acc (NONE, stream) = raise SyntaxError ("Could not repeat parser the last " ^ (Int.toString n) ^ " times!", stream) | rep n acc (SOME(res), stream) = if n > 0 then rep (n - 1) (res :: acc) (oneIter stream) else (rev (res::acc), stream) in (* We subtract 1 from n because we call oneIter once already here *) rep (n - 1) nil (oneIter stream) end else (nil, stream) fun getIf pred stream = case FIO.input1 stream of SOME (res as (e, stream')) => if pred e then res else raise SyntaxError ((elemToString e) ^ " unexpected", stream) | NONE => raise SyntaxError ("Unexpected end of file", stream) fun repeatIf pred = repeat (getIf pred) fun repeatOneIf pred = getIf pred -- repeatIf pred >> op:: end structure TextIOParserCombinators = FParserCombinators(structure FIO = FuncTextIO type vec = string type elem = char val elemToString = Char.toString val vecLength = size val vecEqual = (fn (s1, s2) => s1 = s2) val vecToString = (fn s => s)) structure BinIOParserCombinators = FParserCombinators(structure FIO = FuncBinIO type vec = Word8Vector.vector type elem = Word8.word (* FIXME: These anonymous functions are ugly... implement them somewhere else *) val elemToString = (fn e => Char.toString (chr (Word8.toInt e))) val vecLength = Word8Vector.length val vecEqual = (fn (v1, v2) => #2 (Word8Vector.foldl (fn (e, (index, value)) => (index + 1, value andalso ((Word8.compare (e, Word8Vector.sub (v2, index))) = EQUAL))) (0, true) v1)) val vecToString = (fn v => String.concat (Word8Vector.foldr (fn (e, acc) => (elemToString e)::acc) nil v))) (* stop of ParsingToolkit/srcSML/ParserCombinators.sml *) (* start of ParsingToolkit/srcSML/TextIOParserCombExtra_sig.sml *) (* This file is part of the ParsingToolkit project - which provides combinator parsers for functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). Authors: Fritz Henglein ANOQ of the Sun (alias Johnny Andersen) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Built upon Fritz Henglein's implementation of parser combinators as found in Larry Paulson's "ML for the Working Programmer" *) signature TEXT_IO_PARSER_COMB_EXTRA = sig type instream = TextIOParserCombinators.instream type elem = TextIOParserCombinators.elem type 'a parser = 'a TextIOParserCombinators.parser val isWhitespaceChar : char -> bool val isLetterChar : char -> bool val isDigitChar : char -> bool val whitespaceForce : elem list parser val whitespace : elem list parser val getReal : instream -> real * instream val getRealWS : real parser end (* stop of ParsingToolkit/srcSML/TextIOParserCombExtra_sig.sml *) (* start of ParsingToolkit/srcSML/TextIOParserCombExtra.sml *) (* This file is part of the ParsingToolkit project - which provides combinator parsers for functional input streams. Copyright (C) 2000 ANOQ of the Sun (alias Johnny Andersen). Authors: Fritz Henglein ANOQ of the Sun (alias Johnny Andersen) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. As a special exception, if you do not do anything which is not in the spirit of the GNU Library General Public License, you are not required to physically compile this software into a separate library, since this is generally not possible with current Stanard ML compilers. However if you do something which is not in the spirit of the GNU Library General Public License you will have to follow the licence perpetually - thus disallowing you to use it for any commercial purposes at all. If you are interested in a warranty or commercial support for this software, contact Hardcore Processing for more information. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Built upon Fritz Henglein's implementation of parser combinators as found in Larry Paulson's "ML for the Working Programmer" *) functor FTextIOParserCombExtra() :> TEXT_IO_PARSER_COMB_EXTRA = struct open TextIOParserCombinators (* Character predicates *) fun isWhitespaceChar #" " = true | isWhitespaceChar #"\009" = true | isWhitespaceChar #"\r" = true | isWhitespaceChar #"\n" = true | isWhitespaceChar _ = false val isLetterChar = Char.isAlpha (* must be generalized! *) val isDigitChar = Char.isDigit (* Lexical scanner functions *) val whitespaceForce = repeatOneIf isWhitespaceChar val whitespace = repeatIf isWhitespaceChar fun getReal stream = let val (digits, stream1) = repeatOneIf (fn c => isDigitChar c orelse c = #"." orelse c = #"-") stream val realChars = map (fn c => if c = #"-" then #"~" else c) digits val realStr = implode realChars in case Real.fromString realStr of NONE => raise SyntaxError ("The string " ^ realStr ^ " is not a real number", stream1) | SOME r => (r, stream1) end val getRealWS = getReal --$ whitespace end structure TextIOParserCombExtra = FTextIOParserCombExtra()(* stop of ParsingToolkit/srcSML/TextIOParserCombExtra.sml *) (* start of RepeatParserCombinatorTest.sml *) (* Create a text file with a Standard ML Modules code snippet *) val outStr = TextIO.openOut "RepeatParserCombinator.txt" val _ = TextIO.output (outStr, "structure MyStruct = struct end") val _ = TextIO.closeOut outStr (* Now for the combinator parser test using the repeat and >> combinators *) structure FIO = FuncTextIO local open TextIOParserCombinators in (* White space *) fun isWhitespaceChar #" " = true | isWhitespaceChar #"\009" = true | isWhitespaceChar #"\r" = true | isWhitespaceChar #"\n" = true | isWhitespaceChar _ = false val whitespace = (repeatIf isWhitespaceChar) >> (fn _ => ()) (* End white *) val EQUALS = ($$ "=") -- whitespace fun isIdentChar c = Char.isAlphaNum c orelse c = #"'" orelse c = #"_" fun isIdentStartChar c = Char.isAlpha c orelse c = #"'" fun isSymbolChar (#"!") = true | isSymbolChar (#"%") = true | isSymbolChar (#"&") = true | isSymbolChar (#"$") = true | isSymbolChar (#"#") = true | isSymbolChar (#"+") = true | isSymbolChar (#"-") = true | isSymbolChar (#"/") = true | isSymbolChar (#":") = true | isSymbolChar (#"<") = true | isSymbolChar (#"=") = true | isSymbolChar (#">") = true | isSymbolChar (#"?") = true | isSymbolChar (#"@") = true | isSymbolChar (#"\\") = true | isSymbolChar (#"~") = true | isSymbolChar (#"`") = true | isSymbolChar (#"^") = true | isSymbolChar (#"|") = true | isSymbolChar (#"*") = true | isSymbolChar _ = false val alphaIdentNoWS = ((getIf isIdentStartChar) -- (repeatIf isIdentChar)) >> (fn (a, b) => implode (a::b)) val symbolIdentNoWS = (repeatOneIf isSymbolChar) >> implode val identNoWS = alphaIdentNoWS || symbolIdentNoWS val ident = identNoWS --$ whitespace fun validateReserved res str = if str = res then str else raise ValidityError ("Expected token " ^ res ^ " not found! Found " ^ str ^ " instead.") fun reserved parser res inStr = (parser >> (validateReserved res)) inStr (* And the next is really beautiful functional programming :) *) val STRUCTURE = reserved ident "structure" val STRUCT = reserved ident "struct" val END = reserved ident "end" fun parseStructure inStr = let val (result, inStr2) = ((((STRUCTURE $-- ident) --$ (EQUALS --$ STRUCT)) --$ END) >> (fn str => str)) inStr in result end handle (SyntaxError (msg, inStr)) => (print ("Syntax error while parsing:\n" ^ msg ^ "\n"); "") | _ => (print "Error during parsing!\n"; "") fun import fileName = let val inStr = FIO.openIn fileName val result = parseStructure inStr val _ = FIO.closeIn inStr in result end end (* end local *) val structureName = import "RepeatParserCombinator.txt" val _ = print ("The name of the structure is: " ^ structureName) val _ = print "\n" (* stop of RepeatParserCombinatorTest.sml *) mlton-20100608/regression/pat.ok0000644000076600000240000000001411404435617015056 0ustar mtfstaffhello world mlton-20100608/regression/pat.sml0000644000076600000240000000035211404435617015245 0ustar mtfstaffval c: int as d: int = 13 val c: unit -> unit as d: unit -> unit = fn () => () val c: 'a -> unit as d: 'a -> unit = fn _ => () val (f, hd::tail) = (fn x => x, [fn y => (y,y)]) val (s,_) = f (hd "hello world\n") val _ = print (s) mlton-20100608/regression/poly-equal.2.ok0000644000076600000240000000000011404435620016507 0ustar mtfstaffmlton-20100608/regression/poly-equal.2.sml0000644000076600000240000000136111404435620016704 0ustar mtfstafffun assert (msg,b) = if b then () else print ("assertion failed: " ^ msg ^ "\n") datatype 'a tree = Leaf of 'a | Node of 'a * 'a tree * 'a tree val _ = (assert ("string equal", "foobar" = "foobar") ; assert ("string not equal", "foobar" <> "foobaz") ; assert ("tuple equal", (1,2,3) = (1,2,3)) ; assert ("tuple not equal", (1,2,3) <> (1,2,4)) ; assert ("list equal", [1,2,3] = [1,2,3]) ; assert ("list not equal", [1,2,3] <> [1,2,3,4]) ; assert ("pair list equal", [(1,2), (3,4)] = [(1,2), (3,4)]) ; assert ("pair list not equal", [(1,2), (3,4)] <> [(1,2), (3,5)]) ; assert ("tree equal", let val t = Node (1, Leaf 2, Node (3, Leaf 4, Leaf 5)) in t = t end)) mlton-20100608/regression/poly-equal.ok0000644000076600000240000000000611404435617016363 0ustar mtfstafffalse mlton-20100608/regression/poly-equal.sml0000644000076600000240000000015611404435617016553 0ustar mtfstaffval _ = print(if ([1, 2, 3], [4, 5]) = ([1, 2, 3], [4]) then "true\n" else "false\n") mlton-20100608/regression/polymorphic-recursion.ok0000644000076600000240000000000011404435617020641 0ustar mtfstaffmlton-20100608/regression/polymorphic-recursion.sml0000644000076600000240000000324111404435617021035 0ustar mtfstaffdatatype 'a t = R of 'a | L of 'a t t val rec build: int -> int t = fn 0 => R 17 | n => L (R (build (n - 1))) val rec depth: int t -> int = fn R _ => 0 | L (R z) => 1 + depth z | _ => raise Match val n = depth (build 13) val _ = if n = 13 then () else raise Fail "bug" (* val _ = R 13 val _ = L (R (R 13)) val rec build: int -> int t = fn 0 => R 13 | n => L (R (build (n - 1))) val _ = f 13 *) (* val rec f = fn R _ => 0 | L (R z) => 1 + f z val v0: int t = R 13 val v2: int t t = R v0 val v1: int t = L (v2: int t t) val _ = L (L (R (R (R 13)))) val _ = L (R (L (R (R 13)))) val _ = L (L (R (R (R (R (R 13)))))) *) (* datatype 'a t = A of 'a | B of ('a t * 'a t) t val v1 = A 13 val v2 = A (v1, v1) val v3 = A (v2, v2) val v4 = B v3 val v5 = B v4 val x = A 1 : int t val y = B (A (x, x)) val z = B (A (y, y)) val a = B (A (z, z)) fun d ((A _) : 'a t) : int = 0 | d ((B (A (x, _))) : 'a t) : int = 1 + d x val n = d a *) (* Here's (the relevant part of) what the monomorphiser in smlc returns for your program. datatype t_0 = B_0 of t_1 | A_0 of int and t_1 = A_1 of (t_0 * t_0) It figures out exactly your observation that every use of B must be followed by A. [z0 = int t] datatype z0 = A of int | B of z1 [z1 = (z0 * z0) t] datatype z1 = A of z0 * z0 | B of z2 [z2 = (z1 * z1) t] datatype z2 = A of z1 * z1 | B of z3 [z3 = (z2 * z2) t] B z1 B (B z2) B (B (A (z1, z1))) B (B (A (A (z0,z0), A (z0,z0)))) B (B (A (A (v1, v1), A (v1, v1)))) B (B (A (A (v1, v1), A (v1, v1)))) datatype z = A of int | B of (z * z) t datatype w = A of z * z | B of (w * w) t *) mlton-20100608/regression/posix-exit.ok0000644000076600000240000000000011404435620016370 0ustar mtfstaffmlton-20100608/regression/posix-exit.sml0000644000076600000240000000012511404435617016570 0ustar mtfstaffval _ = (TextIO.output (TextIO.stdOut, "hello\n") ; Posix.Process.exit 0w0) mlton-20100608/regression/posix-procenv.sml0000644000076600000240000000075511404435617017304 0ustar mtfstaff fun downto n = if n = 0 then 0 else downto (n - 1) val truee = 1 = downto 0 open Posix.ProcEnv val egid = getegid () val env = getenv "HOME" val euid = geteuid () val gid = getgid () val groups = getgroups () val login = getlogin () handle _ => "" val pgrp = getpgrp () val pid = getpid () val ppid = getppid () val uid = getuid () val () = setgid gid val () = setpgid {pgid = SOME pid, pid = SOME pid} val () = ignore (setsid ()) handle _ => () val () = setuid uid mlton-20100608/regression/print-self.ok0000644000076600000240000000051611404435620016356 0ustar mtfstaffval K = "\nval _ = print (concat [\"val K = \\\"\", String.translate (fn #\"\\n\" => \"\\\\n\" | #\"\\\\\" => \"\\\\\\\\\" | #\"\\\"\" => \"\\\\\\\"\" | c => str c) K, \"\\\"\", K, \"\\n\"])" val _ = print (concat ["val K = \"", String.translate (fn #"\n" => "\\n" | #"\\" => "\\\\" | #"\"" => "\\\"" | c => str c) K, "\"", K, "\n"]) mlton-20100608/regression/print-self.sml0000644000076600000240000000051611404435617016546 0ustar mtfstaffval K = "\nval _ = print (concat [\"val K = \\\"\", String.translate (fn #\"\\n\" => \"\\\\n\" | #\"\\\\\" => \"\\\\\\\\\" | #\"\\\"\" => \"\\\\\\\"\" | c => str c) K, \"\\\"\", K, \"\\n\"])" val _ = print (concat ["val K = \"", String.translate (fn #"\n" => "\\n" | #"\\" => "\\\\" | #"\"" => "\\\"" | c => str c) K, "\"", K, "\n"]) mlton-20100608/regression/prodcons.ok0000644000076600000240000000001611404435617016123 0ustar mtfstaff100000 100000 mlton-20100608/regression/prodcons.sml0000644000076600000240000001566211404435617016322 0ustar mtfstaffopen Posix.Signal MLton.Signal (* Translated from prodcons.ocaml. *) fun for (start, stop, f) = let fun loop i = if i > stop then () else (f i; loop (i + 1)) in loop start end fun print s = () structure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit structure Mutex: sig type t val new: unit -> t val lock: t * string -> unit val unlock: t -> unit end structure Condition: sig type t val new: unit -> t val signal: t -> unit val wait: t * Mutex.t -> unit end end = struct open MLton open Itimer Signal Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new () in fun ready t: unit = Queue.enque (threads, t) fun next () : Thread.Runnable.t = case Queue.deque threads of NONE => (print "switching to toplevel\n" ; valOf (!topLevel)) | SOME t => t end fun 'a exit (): 'a = switch (fn _ => next ()) fun new (f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f () handle _ => exit ()) ; exit ())), ()) fun schedule t = (print "scheduling\n" ; ready t ; next ()) fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun run (): unit = (switch (fn t => (topLevel := SOME (Thread.prepare (t, ())) ; new (fn () => (setHandler (alrm, Handler.handler schedule) ; setItimer (Time.fromMilliseconds 20))))) ; setItimer Time.zeroTime ; ignore alrm ; topLevel := NONE) structure Mutex = struct datatype t = T of {locked: bool ref, waiting: unit Thread.t Queue.t} fun new () = T {locked = ref false, waiting = Queue.new ()} fun lock (T {locked, waiting, ...}, name) = let fun loop () = (print (concat [name, " lock looping\n"]) ; Thread.atomicBegin () ; if !locked then (print "mutex is locked\n" ; switch (fn t => (Thread.atomicEnd () ; Queue.enque (waiting, t) ; next ())) ; loop ()) else (print "mutex is not locked\n" ; locked := true ; Thread.atomicEnd ())) in loop () end fun safeUnlock (T {locked, waiting, ...}) = (locked := false ; (case Queue.deque waiting of NONE => () | SOME t => (print "unlock found waiting thread\n" ; ready (Thread.prepare (t, ()))))) fun unlock (m: t) = (print "unlock atomicBegin\n" ; Thread.atomicBegin () ; safeUnlock m ; Thread.atomicEnd ()) end structure Condition = struct datatype t = T of {waiting: unit Thread.t Queue.t} fun new () = T {waiting = Queue.new ()} fun wait (T {waiting, ...}, m) = (switch (fn t => (Mutex.safeUnlock m ; print "wait unlocked mutex\n" ; Queue.enque (waiting, t) ; next ())) ; Mutex.lock (m, "wait")) fun signal (T {waiting, ...}) = case Queue.deque waiting of NONE => () | SOME t => ready (Thread.prepare (t, ())) end end structure Mutex = Thread.Mutex structure Condition = Thread.Condition val count = ref 0 val data = ref 0 val produced = ref 0 val consumed = ref 0 val m = Mutex.new () val c = Condition.new () fun producer n = for (1, n, fn i => (print (concat ["producer acquiring lock ", Int.toString i, "\n"]) ; Mutex.lock (m, "producer") ; print "producer acquired lock\n" ; while !count = 1 do Condition.wait (c, m) ; print "producer passed condition\n" ; data := i ; count := 1 ; Condition.signal c ; print "producer releasing lock\n" ; Mutex.unlock m ; print "producer released lock\n" ; produced := !produced + 1)) fun consumer n = let val i = ref 0 in while !i <> n do (print (concat ["consumer acquiring lock ", Int.toString (!i), "\n"]) ; Mutex.lock (m, "consumer") ; print "consumer acquired lock\n" ; while !count = 0 do Condition.wait (c, m) ; i := !data ; count := 0 ; Condition.signal c ; print "consumer releasing lock\n" ; Mutex.unlock m ; print "consumer released lock\n" ; consumed := !consumed + 1) end fun atoi s = case Int.fromString s of SOME num => num | NONE => 0 fun printl [] = TextIO.print "\n" | printl (h::t) = ( TextIO.print h ; printl t ) fun main (name, args) = let val n = atoi (hd (args @ ["1"])) val p = Thread.spawn (fn () => producer n) val c = Thread.spawn (fn () => consumer n) val _ = Thread.run () val _ = Posix.Process.sleep (Time.fromSeconds 1) val _ = printl [Int.toString (!produced), " ", Int.toString (!consumed)] in () end val _ = main ( "prodcons", ["100000"] ) mlton-20100608/regression/pseudokit.sml0000644000076600000240000000133711404435617016474 0ustar mtfstaffstructure Set = struct datatype Set = S end signature FINMAPEQ = sig type map val dom : map -> Set.Set end functor FinMapEq() = struct datatype map = M fun dom m = Set.S end signature TOOLS = sig structure FinMapEq : FINMAPEQ end functor Tools (): TOOLS = struct structure FinMapEq = FinMapEq() end (* functor Basics(structure Tools : sig structure FinMapEq : sig type map val dom : map -> Set.Set end end) = *) functor Basics(structure Tools : TOOLS) = struct structure Tools = Tools end functor KitCompiler() = struct structure Tools = Tools() structure Basics = Basics(structure Tools = Tools) end structure K = KitCompiler() mlton-20100608/regression/README0000644000076600000240000000223311404435617014624 0ustar mtfstaffThe following regressions are known to fail when using a version of MLton built by SML/NJ. This happens because of bugs in SML/NJ. pack-real.sml fails because SML/NJ has the wrong sign for Real.fromString "~0.0". ---------------------------------------------------------------------- Many of these regression tests come from the ML Kit Version 3 distribution, which borrowed them from the Moscow ML distribution. The "regression" script runs all the tests in this directory and prints whether they succeeded or failed. If they fail, you should look at the "log" file to see what went wrong. There should be only two warnings in the log file. filesys.sml warning due to the use of tmpnam real.sml fails due to MLton's incorrect handling of real to string conversions. The following subdirectories contain tests that have not yet been integrated into the regression script. fail/ contains tests that should fail to compile. modules/ contains tests of the module system. nonterminate/ contains tests that should compile, but when run, should not terminate. mlton-20100608/regression/README.kit0000644000076600000240000000156411404435617015420 0ustar mtfstaffThis directory contains test programs for the ML Kit. Many of the test cases for the SML Basis Library have been borrowed from the Moscow ML distribution. The test is invoked with the `kittester' program located (after the Kit is installed) in the kit/bin directory. (The sources for `kittester' are available in the directory kit/src/Tools/Tester.) The directory must contain this file `README' and three symbolic links: testlink -> README testcycl -> testcycl testbadl -> exists.not Moreover, it must contain a file `hardlinkA' and a hard link `hardlinkB' to `hardlinkA' (or vice versa). The directory must not contain a file or directory named `exists.not'. To run all the tests, invoke `kittester' as follows (from this directory): > ../bin/kittester all.tst See the file `all.tst' to learn how to add programs to the test. - ME 1998-10-21mlton-20100608/regression/real-algsimp.ok0000644000076600000240000000012011404435617016645 0ustar mtfstafffalse false false false false true true false false false false false true true mlton-20100608/regression/real-algsimp.sml0000644000076600000240000000126711404435620017036 0ustar mtfstaffval one = valOf (Real.fromString "1.0") val zero = valOf (Real.fromString "0.0") val posInf = one / zero val negInf = ~one / zero val nan1 = posInf + negInf fun cmp f = print ((Bool.toString (f (nan1, nan1))) ^ "\n") local open Real in val _ = cmp (op <) val _ = cmp (op <=) val _ = cmp (op >) val _ = cmp (op >=) val _ = cmp (op ==) val _ = cmp (op !=) val _ = cmp (op ?=) end val nan2 = valOf (Real.fromString "nan") fun cmp f = print ((Bool.toString (f (nan1, nan2))) ^ "\n") local open Real in val _ = cmp (op <) val _ = cmp (op <=) val _ = cmp (op >) val _ = cmp (op >=) val _ = cmp (op ==) val _ = cmp (op !=) val _ = cmp (op ?=) end mlton-20100608/regression/real-basic.ok0000644000076600000240000000115311404435621016274 0ustar mtfstaffReal32 Reported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Actual precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Exported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Real64 Reported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Actual precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Exported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 mlton-20100608/regression/real-basic.sml0000644000076600000240000000524311404435617016467 0ustar mtfstafffunctor Basic(structure Real : REAL structure Pack : PACK_REAL where type real = Real.real) = struct open Real val () = print " Reported\n" val () = print (" precision: " ^ Int.toString precision ^ "\n") val {man=_, exp} = toManExp maxFinite val () = print (" max exponent: " ^ Int.toString exp ^ "\n") val {man=_, exp} = toManExp minNormalPos val () = print (" min exponent: " ^ Int.toString exp ^ "\n") val {man=_, exp} = toManExp minPos val () = print (" min denormal: " ^ Int.toString exp ^ "\n") (* Now let's compute the actual mantissa *) val zero = fromInt 0 val one = fromInt 1 val two = fromInt 2 fun precision eq x = if eq (x+one, x) then 0 else Int.+ (1, precision eq (x+x)) fun maxExp eq x = if eq (x, x+x) then 0 else Int.+ (1, maxExp eq (x+x)) fun lowBit (1, x) = x | lowBit (i, x) = lowBit (Int.- (i, 1), x / two) fun minExp eq x = if not (eq (x, (x / two) * two)) orelse eq (x, zero) then 1 else Int.- (minExp eq (x / two), 1) val eq = == val xprecision = precision eq one val lastBit = one + lowBit (xprecision, one) val xmaxExp = maxExp eq one val xminNormalExp = minExp eq lastBit val xminExp = minExp eq one val () = print " Actual\n" val () = print (" precision: " ^ Int.toString xprecision ^ "\n") val () = print (" max exponent: " ^ Int.toString xmaxExp ^ "\n") val () = print (" min exponent: " ^ Int.toString xminNormalExp ^ "\n") val () = print (" min denormal: " ^ Int.toString xminExp ^ "\n") val a = Word8Array.array (Pack.bytesPerElem, 0w0) fun id x = (Pack.update (a, 0, x); Pack.subArr (a, 0)) val eq = fn (x, y) => == (id x, id y) val xprecision = precision eq one val lastBit = one + lowBit (xprecision, one) val xmaxExp = maxExp eq one val xminNormalExp = minExp eq lastBit val xminExp = minExp eq one val () = print " Exported\n" val () = print (" precision: " ^ Int.toString xprecision ^ "\n") val () = print (" max exponent: " ^ Int.toString xmaxExp ^ "\n") val () = print (" min exponent: " ^ Int.toString xminNormalExp ^ "\n") val () = print (" min denormal: " ^ Int.toString xminExp ^ "\n") end val () = print "Real32\n" structure Z = Basic(structure Real = Real32 structure Pack = PackReal32Little) val () = print "Real64\n" structure Z = Basic(structure Real = Real64 structure Pack = PackReal64Big) mlton-20100608/regression/real-basic.x86-cygwin.ok0000644000076600000240000000115311404435617020223 0ustar mtfstaffReal32 Reported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Actual precision: 64 max exponent: 128 min exponent: ~149 min denormal: ~149 Exported precision: 24 max exponent: 128 min exponent: ~149 min denormal: ~149 Real64 Reported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Actual precision: 64 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 Exported precision: 53 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 mlton-20100608/regression/real-basic.x86-darwin.ok0000644000076600000240000000115311404435617020207 0ustar mtfstaffReal32 Reported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Actual precision: 64 max exponent: 128 min exponent: ~149 min denormal: ~149 Exported precision: 24 max exponent: 128 min exponent: ~149 min denormal: ~149 Real64 Reported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Actual precision: 64 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 Exported precision: 53 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 mlton-20100608/regression/real-basic.x86-freebsd.ok0000644000076600000240000000115311404435621020330 0ustar mtfstaffReal32 Reported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Actual precision: 64 max exponent: 128 min exponent: ~149 min denormal: ~149 Exported precision: 24 max exponent: 128 min exponent: ~149 min denormal: ~149 Real64 Reported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Actual precision: 64 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 Exported precision: 53 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 mlton-20100608/regression/real-basic.x86-hurd.ok0000644000076600000240000000115311404435620017657 0ustar mtfstaffReal32 Reported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Actual precision: 64 max exponent: 128 min exponent: ~149 min denormal: ~149 Exported precision: 24 max exponent: 128 min exponent: ~149 min denormal: ~149 Real64 Reported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Actual precision: 64 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 Exported precision: 53 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 mlton-20100608/regression/real-basic.x86-linux.ok0000644000076600000240000000115311404435617020062 0ustar mtfstaffReal32 Reported precision: 24 max exponent: 128 min exponent: ~125 min denormal: ~148 Actual precision: 64 max exponent: 128 min exponent: ~149 min denormal: ~149 Exported precision: 24 max exponent: 128 min exponent: ~149 min denormal: ~149 Real64 Reported precision: 53 max exponent: 1024 min exponent: ~1021 min denormal: ~1073 Actual precision: 64 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 Exported precision: 53 max exponent: 1024 min exponent: ~1074 min denormal: ~1074 mlton-20100608/regression/real-int.ok0000644000076600000240000644100211404435620016013 0ustar mtfstaff[~2147483648,~2147483648] --> [~0.2147483648E10,~0.2147483648E10] --> OK [~2147483647,~2147483647] --> [~0.2147483648E10,~0.2147483648E10] --> OK [~2147483646,~2147483646] --> [~0.2147483648E10,~0.2147483648E10] --> OK [~2147483645,~2147483645] --> [~0.2147483648E10,~0.2147483648E10] --> OK [~2113929217,~2113929217] --> [~0.2113929216E10,~0.2113929216E10] --> OK [~2080374785,~2080374785] --> [~0.2080374784E10,~0.2080374784E10] --> OK [~2013265921,~2013265921] --> [~0.201326592E10,~0.201326592E10] --> OK [~1879048193,~1879048193] --> [~0.1879048192E10,~0.1879048192E10] --> OK [~1610612737,~1610612737] --> [~0.1610612736E10,~0.1610612736E10] --> OK [~1073741825,~1073741825] --> [~0.1073741824E10,~0.1073741824E10] --> OK [~3,~3] --> [~0.3E1,~0.3E1] --> OK [~2,~2] --> [~0.2E1,~0.2E1] --> OK [~1,~1] --> [~0.1E1,~0.1E1] --> OK [0,0] --> [0.0,0.0] --> OK [1,1] --> [0.1E1,0.1E1] --> OK [2,2] --> [0.2E1,0.2E1] --> OK [3,3] --> [0.3E1,0.3E1] --> OK [1073741824,1073741824] --> [0.1073741824E10,0.1073741824E10] --> OK [1610612736,1610612736] --> [0.1610612736E10,0.1610612736E10] --> OK [1879048192,1879048192] --> [0.1879048192E10,0.1879048192E10] --> OK [2013265920,2013265920] --> [0.201326592E10,0.201326592E10] --> OK [2080374784,2080374784] --> [0.2080374784E10,0.2080374784E10] --> OK [2113929216,2113929216] --> [0.2113929216E10,0.2113929216E10] --> OK [2147483644,2147483644] --> [0.2147483648E10,0.2147483648E10] --> OK [2147483645,2147483645] --> [0.2147483648E10,0.2147483648E10] --> OK [2147483646,2147483646] --> [0.2147483648E10,0.2147483648E10] --> OK [2147483647,2147483647] --> [0.2147483648E10,0.2147483648E10] --> OK [~0.2147500032E10,TO_NEAREST] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_NEAREST] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_NEAREST] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_NEAREST] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_NEAREST] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_NEAREST] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_NEAREST] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_NEAREST] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_NEAREST] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_NEAREST] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_NEAREST] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_NEAREST] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_NEAREST] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_NEAREST] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_NEAREST] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_NEAREST] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_NEAREST] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_NEAREST] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_NEAREST] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_NEAREST] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_NEAREST] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_NEAREST] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEAREST] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_NEAREST] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_NEAREST] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_NEAREST] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_NEAREST] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_NEAREST] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_NEAREST] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_NEAREST] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_NEAREST] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_NEAREST] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_NEAREST] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_NEAREST] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_NEAREST] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_NEAREST] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_NEAREST] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_NEAREST] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_NEAREST] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_NEAREST] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_NEAREST] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_NEAREST] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_NEAREST] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_NEAREST] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_NEAREST] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_NEAREST] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_NEAREST] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEAREST] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_NEAREST] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_NEAREST] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_NEAREST] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_NEAREST] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_NEAREST] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_NEAREST] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_NEAREST] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_NEAREST] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_NEAREST] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_NEAREST] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_NEAREST] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_NEAREST] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_NEAREST] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_NEAREST] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_NEAREST] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_NEAREST] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_NEAREST] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_NEAREST] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_NEAREST] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_NEAREST] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_NEAREST] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_NEAREST] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_NEAREST] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_NEAREST] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_NEAREST] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_NEAREST] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_NEAREST] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_NEAREST] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_NEAREST] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_NEAREST] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_NEAREST] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_NEAREST] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_NEAREST] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_NEAREST] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_NEAREST] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_NEAREST] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_NEAREST] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_NEAREST] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_NEAREST] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEAREST] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_NEAREST] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_NEAREST] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_NEAREST] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_NEAREST] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_NEAREST] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_NEAREST] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_NEAREST] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_NEAREST] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_NEAREST] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_NEAREST] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_NEAREST] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_NEAREST] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_NEAREST] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_NEAREST] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_NEAREST] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_NEAREST] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_NEAREST] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_NEAREST] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_NEAREST] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_NEAREST] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_NEAREST] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_NEAREST] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_NEAREST] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_NEAREST] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEAREST] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_NEAREST] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_NEAREST] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_NEAREST] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_NEAREST] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_NEAREST] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_NEAREST] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_NEAREST] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_NEAREST] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_NEAREST] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_NEAREST] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_NEAREST] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_NEAREST] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_NEAREST] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_NEAREST] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_NEAREST] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_NEAREST] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_NEAREST] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_NEAREST] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_NEAREST] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_NEAREST] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_NEAREST] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_NEAREST] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_NEAREST] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_NEAREST] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_NEAREST] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_NEAREST] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_NEAREST] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_NEAREST] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_NEAREST] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_NEAREST] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_NEAREST] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_NEAREST] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_NEAREST] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_NEAREST] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_NEAREST] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_NEAREST] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_NEAREST] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEAREST] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_NEAREST] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_NEAREST] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_NEAREST] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_NEAREST] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_NEAREST] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_NEAREST] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_NEAREST] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_NEAREST] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_NEAREST] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_NEAREST] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_NEAREST] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_NEAREST] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_NEAREST] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_NEAREST] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_NEAREST] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_NEAREST] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_NEAREST] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_NEAREST] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_NEAREST] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_NEAREST] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_NEAREST] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_NEAREST] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_NEAREST] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_NEAREST] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEAREST] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_NEAREST] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_NEAREST] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_NEAREST] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_NEAREST] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_NEAREST] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_NEAREST] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_NEAREST] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_NEAREST] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_NEAREST] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_NEAREST] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_NEAREST] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_NEAREST] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_NEAREST] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_NEAREST] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_NEAREST] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_NEAREST] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_NEAREST] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_NEAREST] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_NEAREST] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_NEAREST] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_NEAREST] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_NEAREST] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_NEAREST] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_NEAREST] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_NEAREST] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_NEAREST] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_NEAREST] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_NEAREST] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_NEAREST] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_NEAREST] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_NEAREST] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_NEAREST] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_NEAREST] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_NEAREST] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_NEAREST] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_NEAREST] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_NEAREST] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_NEAREST] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_NEAREST] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEAREST] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_NEAREST] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_NEAREST] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_NEAREST] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_NEAREST] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_NEAREST] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_NEAREST] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_NEAREST] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_NEAREST] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_NEAREST] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_NEAREST] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_NEAREST] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_NEAREST] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_NEAREST] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_NEAREST] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_NEAREST] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_NEAREST] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_NEAREST] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_NEAREST] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_NEAREST] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_NEAREST] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_NEAREST] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_NEAREST] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_NEAREST] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_NEAREST] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEAREST] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_NEAREST] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_NEAREST] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_NEAREST] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_NEAREST] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_NEAREST] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_NEAREST] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_NEAREST] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_NEAREST] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_NEAREST] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_NEAREST] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_NEAREST] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_NEAREST] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_NEAREST] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_NEAREST] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_NEAREST] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_NEAREST] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_NEAREST] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_NEAREST] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_NEAREST] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_NEAREST] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_NEAREST] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_NEAREST] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_NEAREST] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_NEAREST] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_NEAREST] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_NEAREST] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_NEAREST] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_NEAREST] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_NEAREST] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_NEAREST] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_NEAREST] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_NEAREST] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_NEAREST] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_NEAREST] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_NEAREST] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_NEAREST] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_NEAREST] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEAREST] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_NEAREST] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_NEAREST] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_NEAREST] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_NEAREST] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_NEAREST] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_NEAREST] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_NEAREST] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_NEAREST] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_NEAREST] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_NEAREST] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_NEAREST] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_NEAREST] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_NEAREST] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_NEAREST] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_NEAREST] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_NEAREST] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_NEAREST] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_NEAREST] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_NEAREST] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_NEAREST] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_NEAREST] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_NEAREST] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_NEAREST] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_NEAREST] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEAREST] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_NEAREST] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_NEAREST] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_NEAREST] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_NEAREST] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_NEAREST] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_NEAREST] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_NEAREST] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_NEAREST] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_NEAREST] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_NEAREST] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_NEAREST] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_NEAREST] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_NEAREST] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_NEAREST] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_NEAREST] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_NEAREST] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_NEAREST] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_NEAREST] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_NEAREST] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_NEAREST] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_NEAREST] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_NEAREST] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_NEAREST] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_NEAREST] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_NEAREST] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_NEAREST] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_NEAREST] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_NEAREST] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_NEAREST] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_NEAREST] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_NEAREST] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_NEAREST] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_NEAREST] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_NEAREST] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_NEAREST] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_NEAREST] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_NEAREST] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_NEAREST] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_NEAREST] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEAREST] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_NEAREST] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_NEAREST] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_NEAREST] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_NEAREST] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_NEAREST] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_NEAREST] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_NEAREST] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_NEAREST] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_NEAREST] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_NEAREST] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_NEAREST] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_NEAREST] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_NEAREST] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_NEAREST] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_NEAREST] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_NEAREST] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_NEAREST] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_NEAREST] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_NEAREST] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_NEAREST] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_NEAREST] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_NEAREST] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_NEAREST] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_NEAREST] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEAREST] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_NEAREST] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_NEAREST] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_NEAREST] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_NEAREST] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_NEAREST] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_NEAREST] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_NEAREST] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_NEAREST] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_NEAREST] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_NEAREST] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_NEAREST] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_NEAREST] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_NEAREST] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_NEAREST] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_NEAREST] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_NEAREST] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_NEAREST] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_NEAREST] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_NEAREST] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_NEAREST] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_NEAREST] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_NEAREST] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_NEAREST] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_NEAREST] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_NEAREST] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_NEAREST] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_NEAREST] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_NEAREST] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_NEAREST] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_NEAREST] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_NEAREST] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_NEAREST] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_NEAREST] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_NEAREST] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_NEAREST] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_NEAREST] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_NEAREST] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEAREST] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_NEAREST] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_NEAREST] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_NEAREST] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_NEAREST] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_NEAREST] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_NEAREST] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_NEAREST] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_NEAREST] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_NEAREST] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_NEAREST] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_NEAREST] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_NEAREST] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_NEAREST] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_NEAREST] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_NEAREST] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_NEAREST] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_NEAREST] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_NEAREST] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_NEAREST] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_NEAREST] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_NEAREST] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_NEAREST] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_NEAREST] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_NEAREST] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEAREST] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_NEAREST] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_NEAREST] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_NEAREST] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_NEAREST] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_NEAREST] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_NEAREST] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_NEAREST] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_NEAREST] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_NEAREST] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_NEAREST] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_NEAREST] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_NEAREST] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_NEAREST] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_NEAREST] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_NEAREST] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_NEAREST] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_NEAREST] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_NEAREST] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_NEAREST] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_NEAREST] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_NEAREST] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_NEAREST] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_NEAREST] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_NEAREST] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_NEAREST] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_NEAREST] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_NEAREST] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_NEAREST] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_NEAREST] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_NEAREST] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_NEAREST] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_NEAREST] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_NEAREST] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_NEAREST] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_NEAREST] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_NEAREST] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_NEAREST] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_NEAREST] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_NEAREST] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEAREST] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_NEAREST] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_NEAREST] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_NEAREST] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_NEAREST] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_NEAREST] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_NEAREST] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_NEAREST] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_NEAREST] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_NEAREST] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_NEAREST] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_NEAREST] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_NEAREST] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_NEAREST] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_NEAREST] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_NEAREST] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_NEAREST] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_NEAREST] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_NEAREST] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_NEAREST] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_NEAREST] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_NEAREST] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_NEAREST] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_NEAREST] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_NEAREST] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEAREST] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_NEAREST] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_NEAREST] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_NEAREST] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_NEAREST] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_NEAREST] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_NEAREST] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_NEAREST] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_NEAREST] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_NEAREST] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_NEAREST] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_NEAREST] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_NEAREST] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_NEAREST] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_NEAREST] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_NEAREST] --> [~2147483520,~2147483520] --> OK [~0.2113937408E10,TO_NEAREST] --> [~2113937408,~2113937408] --> OK [~0.211393728E10,TO_NEAREST] --> [~2113937280,~2113937280] --> OK [~0.2113937152E10,TO_NEAREST] --> [~2113937152,~2113937152] --> OK [~0.2113937024E10,TO_NEAREST] --> [~2113937024,~2113937024] --> OK [~0.2113936896E10,TO_NEAREST] --> [~2113936896,~2113936896] --> OK [~0.2113936768E10,TO_NEAREST] --> [~2113936768,~2113936768] --> OK [~0.211393664E10,TO_NEAREST] --> [~2113936640,~2113936640] --> OK [~0.2113936512E10,TO_NEAREST] --> [~2113936512,~2113936512] --> OK [~0.2113936384E10,TO_NEAREST] --> [~2113936384,~2113936384] --> OK [~0.2113936256E10,TO_NEAREST] --> [~2113936256,~2113936256] --> OK [~0.2113936128E10,TO_NEAREST] --> [~2113936128,~2113936128] --> OK [~0.2113936E10,TO_NEAREST] --> [~2113936000,~2113936000] --> OK [~0.2113935872E10,TO_NEAREST] --> [~2113935872,~2113935872] --> OK [~0.2113935744E10,TO_NEAREST] --> [~2113935744,~2113935744] --> OK [~0.2113935616E10,TO_NEAREST] --> [~2113935616,~2113935616] --> OK [~0.2113935488E10,TO_NEAREST] --> [~2113935488,~2113935488] --> OK [~0.211393536E10,TO_NEAREST] --> [~2113935360,~2113935360] --> OK [~0.2113935232E10,TO_NEAREST] --> [~2113935232,~2113935232] --> OK [~0.2113935104E10,TO_NEAREST] --> [~2113935104,~2113935104] --> OK [~0.2113934976E10,TO_NEAREST] --> [~2113934976,~2113934976] --> OK [~0.2113934848E10,TO_NEAREST] --> [~2113934848,~2113934848] --> OK [~0.211393472E10,TO_NEAREST] --> [~2113934720,~2113934720] --> OK [~0.2113934592E10,TO_NEAREST] --> [~2113934592,~2113934592] --> OK [~0.2113934464E10,TO_NEAREST] --> [~2113934464,~2113934464] --> OK [~0.2113934336E10,TO_NEAREST] --> [~2113934336,~2113934336] --> OK [~0.2113934208E10,TO_NEAREST] --> [~2113934208,~2113934208] --> OK [~0.211393408E10,TO_NEAREST] --> [~2113934080,~2113934080] --> OK [~0.2113933952E10,TO_NEAREST] --> [~2113933952,~2113933952] --> OK [~0.2113933824E10,TO_NEAREST] --> [~2113933824,~2113933824] --> OK [~0.2113933696E10,TO_NEAREST] --> [~2113933696,~2113933696] --> OK [~0.2113933568E10,TO_NEAREST] --> [~2113933568,~2113933568] --> OK [~0.211393344E10,TO_NEAREST] --> [~2113933440,~2113933440] --> OK [~0.2113933312E10,TO_NEAREST] --> [~2113933312,~2113933312] --> OK [~0.2113933184E10,TO_NEAREST] --> [~2113933184,~2113933184] --> OK [~0.2113933056E10,TO_NEAREST] --> [~2113933056,~2113933056] --> OK [~0.2113932928E10,TO_NEAREST] --> [~2113932928,~2113932928] --> OK [~0.21139328E10,TO_NEAREST] --> [~2113932800,~2113932800] --> OK [~0.2113932672E10,TO_NEAREST] --> [~2113932672,~2113932672] --> OK [~0.2113932544E10,TO_NEAREST] --> [~2113932544,~2113932544] --> OK [~0.2113932416E10,TO_NEAREST] --> [~2113932416,~2113932416] --> OK [~0.2113932288E10,TO_NEAREST] --> [~2113932288,~2113932288] --> OK [~0.211393216E10,TO_NEAREST] --> [~2113932160,~2113932160] --> OK [~0.2113932032E10,TO_NEAREST] --> [~2113932032,~2113932032] --> OK [~0.2113931904E10,TO_NEAREST] --> [~2113931904,~2113931904] --> OK [~0.2113931776E10,TO_NEAREST] --> [~2113931776,~2113931776] --> OK [~0.2113931648E10,TO_NEAREST] --> [~2113931648,~2113931648] --> OK [~0.211393152E10,TO_NEAREST] --> [~2113931520,~2113931520] --> OK [~0.2113931392E10,TO_NEAREST] --> [~2113931392,~2113931392] --> OK [~0.2113931264E10,TO_NEAREST] --> [~2113931264,~2113931264] --> OK [~0.2113931136E10,TO_NEAREST] --> [~2113931136,~2113931136] --> OK [~0.2113931008E10,TO_NEAREST] --> [~2113931008,~2113931008] --> OK [~0.211393088E10,TO_NEAREST] --> [~2113930880,~2113930880] --> OK [~0.2113930752E10,TO_NEAREST] --> [~2113930752,~2113930752] --> OK [~0.2113930624E10,TO_NEAREST] --> [~2113930624,~2113930624] --> OK [~0.2113930496E10,TO_NEAREST] --> [~2113930496,~2113930496] --> OK [~0.2113930368E10,TO_NEAREST] --> [~2113930368,~2113930368] --> OK [~0.211393024E10,TO_NEAREST] --> [~2113930240,~2113930240] --> OK [~0.2113930112E10,TO_NEAREST] --> [~2113930112,~2113930112] --> OK [~0.2113929984E10,TO_NEAREST] --> [~2113929984,~2113929984] --> OK [~0.2113929856E10,TO_NEAREST] --> [~2113929856,~2113929856] --> OK [~0.2113929728E10,TO_NEAREST] --> [~2113929728,~2113929728] --> OK [~0.21139296E10,TO_NEAREST] --> [~2113929600,~2113929600] --> OK [~0.2113929472E10,TO_NEAREST] --> [~2113929472,~2113929472] --> OK [~0.2113929344E10,TO_NEAREST] --> [~2113929344,~2113929344] --> OK [~0.2113929216E10,TO_NEAREST] --> [~2113929216,~2113929216] --> OK [~0.2113921024E10,TO_NEAREST] --> [~2113921024,~2113921024] --> OK [~0.2113921152E10,TO_NEAREST] --> [~2113921152,~2113921152] --> OK [~0.211392128E10,TO_NEAREST] --> [~2113921280,~2113921280] --> OK [~0.2113921408E10,TO_NEAREST] --> [~2113921408,~2113921408] --> OK [~0.2113921536E10,TO_NEAREST] --> [~2113921536,~2113921536] --> OK [~0.2113921664E10,TO_NEAREST] --> [~2113921664,~2113921664] --> OK [~0.2113921792E10,TO_NEAREST] --> [~2113921792,~2113921792] --> OK [~0.211392192E10,TO_NEAREST] --> [~2113921920,~2113921920] --> OK [~0.2113922048E10,TO_NEAREST] --> [~2113922048,~2113922048] --> OK [~0.2113922176E10,TO_NEAREST] --> [~2113922176,~2113922176] --> OK [~0.2113922304E10,TO_NEAREST] --> [~2113922304,~2113922304] --> OK [~0.2113922432E10,TO_NEAREST] --> [~2113922432,~2113922432] --> OK [~0.211392256E10,TO_NEAREST] --> [~2113922560,~2113922560] --> OK [~0.2113922688E10,TO_NEAREST] --> [~2113922688,~2113922688] --> OK [~0.2113922816E10,TO_NEAREST] --> [~2113922816,~2113922816] --> OK [~0.2113922944E10,TO_NEAREST] --> [~2113922944,~2113922944] --> OK [~0.2113923072E10,TO_NEAREST] --> [~2113923072,~2113923072] --> OK [~0.21139232E10,TO_NEAREST] --> [~2113923200,~2113923200] --> OK [~0.2113923328E10,TO_NEAREST] --> [~2113923328,~2113923328] --> OK [~0.2113923456E10,TO_NEAREST] --> [~2113923456,~2113923456] --> OK [~0.2113923584E10,TO_NEAREST] --> [~2113923584,~2113923584] --> OK [~0.2113923712E10,TO_NEAREST] --> [~2113923712,~2113923712] --> OK [~0.211392384E10,TO_NEAREST] --> [~2113923840,~2113923840] --> OK [~0.2113923968E10,TO_NEAREST] --> [~2113923968,~2113923968] --> OK [~0.2113924096E10,TO_NEAREST] --> [~2113924096,~2113924096] --> OK [~0.2113924224E10,TO_NEAREST] --> [~2113924224,~2113924224] --> OK [~0.2113924352E10,TO_NEAREST] --> [~2113924352,~2113924352] --> OK [~0.211392448E10,TO_NEAREST] --> [~2113924480,~2113924480] --> OK [~0.2113924608E10,TO_NEAREST] --> [~2113924608,~2113924608] --> OK [~0.2113924736E10,TO_NEAREST] --> [~2113924736,~2113924736] --> OK [~0.2113924864E10,TO_NEAREST] --> [~2113924864,~2113924864] --> OK [~0.2113924992E10,TO_NEAREST] --> [~2113924992,~2113924992] --> OK [~0.211392512E10,TO_NEAREST] --> [~2113925120,~2113925120] --> OK [~0.2113925248E10,TO_NEAREST] --> [~2113925248,~2113925248] --> OK [~0.2113925376E10,TO_NEAREST] --> [~2113925376,~2113925376] --> OK [~0.2113925504E10,TO_NEAREST] --> [~2113925504,~2113925504] --> OK [~0.2113925632E10,TO_NEAREST] --> [~2113925632,~2113925632] --> OK [~0.211392576E10,TO_NEAREST] --> [~2113925760,~2113925760] --> OK [~0.2113925888E10,TO_NEAREST] --> [~2113925888,~2113925888] --> OK [~0.2113926016E10,TO_NEAREST] --> [~2113926016,~2113926016] --> OK [~0.2113926144E10,TO_NEAREST] --> [~2113926144,~2113926144] --> OK [~0.2113926272E10,TO_NEAREST] --> [~2113926272,~2113926272] --> OK [~0.21139264E10,TO_NEAREST] --> [~2113926400,~2113926400] --> OK [~0.2113926528E10,TO_NEAREST] --> [~2113926528,~2113926528] --> OK [~0.2113926656E10,TO_NEAREST] --> [~2113926656,~2113926656] --> OK [~0.2113926784E10,TO_NEAREST] --> [~2113926784,~2113926784] --> OK [~0.2113926912E10,TO_NEAREST] --> [~2113926912,~2113926912] --> OK [~0.211392704E10,TO_NEAREST] --> [~2113927040,~2113927040] --> OK [~0.2113927168E10,TO_NEAREST] --> [~2113927168,~2113927168] --> OK [~0.2113927296E10,TO_NEAREST] --> [~2113927296,~2113927296] --> OK [~0.2113927424E10,TO_NEAREST] --> [~2113927424,~2113927424] --> OK [~0.2113927552E10,TO_NEAREST] --> [~2113927552,~2113927552] --> OK [~0.211392768E10,TO_NEAREST] --> [~2113927680,~2113927680] --> OK [~0.2113927808E10,TO_NEAREST] --> [~2113927808,~2113927808] --> OK [~0.2113927936E10,TO_NEAREST] --> [~2113927936,~2113927936] --> OK [~0.2113928064E10,TO_NEAREST] --> [~2113928064,~2113928064] --> OK [~0.2113928192E10,TO_NEAREST] --> [~2113928192,~2113928192] --> OK [~0.211392832E10,TO_NEAREST] --> [~2113928320,~2113928320] --> OK [~0.2113928448E10,TO_NEAREST] --> [~2113928448,~2113928448] --> OK [~0.2113928576E10,TO_NEAREST] --> [~2113928576,~2113928576] --> OK [~0.2113928704E10,TO_NEAREST] --> [~2113928704,~2113928704] --> OK [~0.2113928832E10,TO_NEAREST] --> [~2113928832,~2113928832] --> OK [~0.211392896E10,TO_NEAREST] --> [~2113928960,~2113928960] --> OK [~0.2113929088E10,TO_NEAREST] --> [~2113929088,~2113929088] --> OK [~0.2080382976E10,TO_NEAREST] --> [~2080382976,~2080382976] --> OK [~0.2080382848E10,TO_NEAREST] --> [~2080382848,~2080382848] --> OK [~0.208038272E10,TO_NEAREST] --> [~2080382720,~2080382720] --> OK [~0.2080382592E10,TO_NEAREST] --> [~2080382592,~2080382592] --> OK [~0.2080382464E10,TO_NEAREST] --> [~2080382464,~2080382464] --> OK [~0.2080382336E10,TO_NEAREST] --> [~2080382336,~2080382336] --> OK [~0.2080382208E10,TO_NEAREST] --> [~2080382208,~2080382208] --> OK [~0.208038208E10,TO_NEAREST] --> [~2080382080,~2080382080] --> OK [~0.2080381952E10,TO_NEAREST] --> [~2080381952,~2080381952] --> OK [~0.2080381824E10,TO_NEAREST] --> [~2080381824,~2080381824] --> OK [~0.2080381696E10,TO_NEAREST] --> [~2080381696,~2080381696] --> OK [~0.2080381568E10,TO_NEAREST] --> [~2080381568,~2080381568] --> OK [~0.208038144E10,TO_NEAREST] --> [~2080381440,~2080381440] --> OK [~0.2080381312E10,TO_NEAREST] --> [~2080381312,~2080381312] --> OK [~0.2080381184E10,TO_NEAREST] --> [~2080381184,~2080381184] --> OK [~0.2080381056E10,TO_NEAREST] --> [~2080381056,~2080381056] --> OK [~0.2080380928E10,TO_NEAREST] --> [~2080380928,~2080380928] --> OK [~0.20803808E10,TO_NEAREST] --> [~2080380800,~2080380800] --> OK [~0.2080380672E10,TO_NEAREST] --> [~2080380672,~2080380672] --> OK [~0.2080380544E10,TO_NEAREST] --> [~2080380544,~2080380544] --> OK [~0.2080380416E10,TO_NEAREST] --> [~2080380416,~2080380416] --> OK [~0.2080380288E10,TO_NEAREST] --> [~2080380288,~2080380288] --> OK [~0.208038016E10,TO_NEAREST] --> [~2080380160,~2080380160] --> OK [~0.2080380032E10,TO_NEAREST] --> [~2080380032,~2080380032] --> OK [~0.2080379904E10,TO_NEAREST] --> [~2080379904,~2080379904] --> OK [~0.2080379776E10,TO_NEAREST] --> [~2080379776,~2080379776] --> OK [~0.2080379648E10,TO_NEAREST] --> [~2080379648,~2080379648] --> OK [~0.208037952E10,TO_NEAREST] --> [~2080379520,~2080379520] --> OK [~0.2080379392E10,TO_NEAREST] --> [~2080379392,~2080379392] --> OK [~0.2080379264E10,TO_NEAREST] --> [~2080379264,~2080379264] --> OK [~0.2080379136E10,TO_NEAREST] --> [~2080379136,~2080379136] --> OK [~0.2080379008E10,TO_NEAREST] --> [~2080379008,~2080379008] --> OK [~0.208037888E10,TO_NEAREST] --> [~2080378880,~2080378880] --> OK [~0.2080378752E10,TO_NEAREST] --> [~2080378752,~2080378752] --> OK [~0.2080378624E10,TO_NEAREST] --> [~2080378624,~2080378624] --> OK [~0.2080378496E10,TO_NEAREST] --> [~2080378496,~2080378496] --> OK [~0.2080378368E10,TO_NEAREST] --> [~2080378368,~2080378368] --> OK [~0.208037824E10,TO_NEAREST] --> [~2080378240,~2080378240] --> OK [~0.2080378112E10,TO_NEAREST] --> [~2080378112,~2080378112] --> OK [~0.2080377984E10,TO_NEAREST] --> [~2080377984,~2080377984] --> OK [~0.2080377856E10,TO_NEAREST] --> [~2080377856,~2080377856] --> OK [~0.2080377728E10,TO_NEAREST] --> [~2080377728,~2080377728] --> OK [~0.20803776E10,TO_NEAREST] --> [~2080377600,~2080377600] --> OK [~0.2080377472E10,TO_NEAREST] --> [~2080377472,~2080377472] --> OK [~0.2080377344E10,TO_NEAREST] --> [~2080377344,~2080377344] --> OK [~0.2080377216E10,TO_NEAREST] --> [~2080377216,~2080377216] --> OK [~0.2080377088E10,TO_NEAREST] --> [~2080377088,~2080377088] --> OK [~0.208037696E10,TO_NEAREST] --> [~2080376960,~2080376960] --> OK [~0.2080376832E10,TO_NEAREST] --> [~2080376832,~2080376832] --> OK [~0.2080376704E10,TO_NEAREST] --> [~2080376704,~2080376704] --> OK [~0.2080376576E10,TO_NEAREST] --> [~2080376576,~2080376576] --> OK [~0.2080376448E10,TO_NEAREST] --> [~2080376448,~2080376448] --> OK [~0.208037632E10,TO_NEAREST] --> [~2080376320,~2080376320] --> OK [~0.2080376192E10,TO_NEAREST] --> [~2080376192,~2080376192] --> OK [~0.2080376064E10,TO_NEAREST] --> [~2080376064,~2080376064] --> OK [~0.2080375936E10,TO_NEAREST] --> [~2080375936,~2080375936] --> OK [~0.2080375808E10,TO_NEAREST] --> [~2080375808,~2080375808] --> OK [~0.208037568E10,TO_NEAREST] --> [~2080375680,~2080375680] --> OK [~0.2080375552E10,TO_NEAREST] --> [~2080375552,~2080375552] --> OK [~0.2080375424E10,TO_NEAREST] --> [~2080375424,~2080375424] --> OK [~0.2080375296E10,TO_NEAREST] --> [~2080375296,~2080375296] --> OK [~0.2080375168E10,TO_NEAREST] --> [~2080375168,~2080375168] --> OK [~0.208037504E10,TO_NEAREST] --> [~2080375040,~2080375040] --> OK [~0.2080374912E10,TO_NEAREST] --> [~2080374912,~2080374912] --> OK [~0.2080374784E10,TO_NEAREST] --> [~2080374784,~2080374784] --> OK [~0.2080366592E10,TO_NEAREST] --> [~2080366592,~2080366592] --> OK [~0.208036672E10,TO_NEAREST] --> [~2080366720,~2080366720] --> OK [~0.2080366848E10,TO_NEAREST] --> [~2080366848,~2080366848] --> OK [~0.2080366976E10,TO_NEAREST] --> [~2080366976,~2080366976] --> OK [~0.2080367104E10,TO_NEAREST] --> [~2080367104,~2080367104] --> OK [~0.2080367232E10,TO_NEAREST] --> [~2080367232,~2080367232] --> OK [~0.208036736E10,TO_NEAREST] --> [~2080367360,~2080367360] --> OK [~0.2080367488E10,TO_NEAREST] --> [~2080367488,~2080367488] --> OK [~0.2080367616E10,TO_NEAREST] --> [~2080367616,~2080367616] --> OK [~0.2080367744E10,TO_NEAREST] --> [~2080367744,~2080367744] --> OK [~0.2080367872E10,TO_NEAREST] --> [~2080367872,~2080367872] --> OK [~0.2080368E10,TO_NEAREST] --> [~2080368000,~2080368000] --> OK [~0.2080368128E10,TO_NEAREST] --> [~2080368128,~2080368128] --> OK [~0.2080368256E10,TO_NEAREST] --> [~2080368256,~2080368256] --> OK [~0.2080368384E10,TO_NEAREST] --> [~2080368384,~2080368384] --> OK [~0.2080368512E10,TO_NEAREST] --> [~2080368512,~2080368512] --> OK [~0.208036864E10,TO_NEAREST] --> [~2080368640,~2080368640] --> OK [~0.2080368768E10,TO_NEAREST] --> [~2080368768,~2080368768] --> OK [~0.2080368896E10,TO_NEAREST] --> [~2080368896,~2080368896] --> OK [~0.2080369024E10,TO_NEAREST] --> [~2080369024,~2080369024] --> OK [~0.2080369152E10,TO_NEAREST] --> [~2080369152,~2080369152] --> OK [~0.208036928E10,TO_NEAREST] --> [~2080369280,~2080369280] --> OK [~0.2080369408E10,TO_NEAREST] --> [~2080369408,~2080369408] --> OK [~0.2080369536E10,TO_NEAREST] --> [~2080369536,~2080369536] --> OK [~0.2080369664E10,TO_NEAREST] --> [~2080369664,~2080369664] --> OK [~0.2080369792E10,TO_NEAREST] --> [~2080369792,~2080369792] --> OK [~0.208036992E10,TO_NEAREST] --> [~2080369920,~2080369920] --> OK [~0.2080370048E10,TO_NEAREST] --> [~2080370048,~2080370048] --> OK [~0.2080370176E10,TO_NEAREST] --> [~2080370176,~2080370176] --> OK [~0.2080370304E10,TO_NEAREST] --> [~2080370304,~2080370304] --> OK [~0.2080370432E10,TO_NEAREST] --> [~2080370432,~2080370432] --> OK [~0.208037056E10,TO_NEAREST] --> [~2080370560,~2080370560] --> OK [~0.2080370688E10,TO_NEAREST] --> [~2080370688,~2080370688] --> OK [~0.2080370816E10,TO_NEAREST] --> [~2080370816,~2080370816] --> OK [~0.2080370944E10,TO_NEAREST] --> [~2080370944,~2080370944] --> OK [~0.2080371072E10,TO_NEAREST] --> [~2080371072,~2080371072] --> OK [~0.20803712E10,TO_NEAREST] --> [~2080371200,~2080371200] --> OK [~0.2080371328E10,TO_NEAREST] --> [~2080371328,~2080371328] --> OK [~0.2080371456E10,TO_NEAREST] --> [~2080371456,~2080371456] --> OK [~0.2080371584E10,TO_NEAREST] --> [~2080371584,~2080371584] --> OK [~0.2080371712E10,TO_NEAREST] --> [~2080371712,~2080371712] --> OK [~0.208037184E10,TO_NEAREST] --> [~2080371840,~2080371840] --> OK [~0.2080371968E10,TO_NEAREST] --> [~2080371968,~2080371968] --> OK [~0.2080372096E10,TO_NEAREST] --> [~2080372096,~2080372096] --> OK [~0.2080372224E10,TO_NEAREST] --> [~2080372224,~2080372224] --> OK [~0.2080372352E10,TO_NEAREST] --> [~2080372352,~2080372352] --> OK [~0.208037248E10,TO_NEAREST] --> [~2080372480,~2080372480] --> OK [~0.2080372608E10,TO_NEAREST] --> [~2080372608,~2080372608] --> OK [~0.2080372736E10,TO_NEAREST] --> [~2080372736,~2080372736] --> OK [~0.2080372864E10,TO_NEAREST] --> [~2080372864,~2080372864] --> OK [~0.2080372992E10,TO_NEAREST] --> [~2080372992,~2080372992] --> OK [~0.208037312E10,TO_NEAREST] --> [~2080373120,~2080373120] --> OK [~0.2080373248E10,TO_NEAREST] --> [~2080373248,~2080373248] --> OK [~0.2080373376E10,TO_NEAREST] --> [~2080373376,~2080373376] --> OK [~0.2080373504E10,TO_NEAREST] --> [~2080373504,~2080373504] --> OK [~0.2080373632E10,TO_NEAREST] --> [~2080373632,~2080373632] --> OK [~0.208037376E10,TO_NEAREST] --> [~2080373760,~2080373760] --> OK [~0.2080373888E10,TO_NEAREST] --> [~2080373888,~2080373888] --> OK [~0.2080374016E10,TO_NEAREST] --> [~2080374016,~2080374016] --> OK [~0.2080374144E10,TO_NEAREST] --> [~2080374144,~2080374144] --> OK [~0.2080374272E10,TO_NEAREST] --> [~2080374272,~2080374272] --> OK [~0.20803744E10,TO_NEAREST] --> [~2080374400,~2080374400] --> OK [~0.2080374528E10,TO_NEAREST] --> [~2080374528,~2080374528] --> OK [~0.2080374656E10,TO_NEAREST] --> [~2080374656,~2080374656] --> OK [~0.2013274112E10,TO_NEAREST] --> [~2013274112,~2013274112] --> OK [~0.2013273984E10,TO_NEAREST] --> [~2013273984,~2013273984] --> OK [~0.2013273856E10,TO_NEAREST] --> [~2013273856,~2013273856] --> OK [~0.2013273728E10,TO_NEAREST] --> [~2013273728,~2013273728] --> OK [~0.20132736E10,TO_NEAREST] --> [~2013273600,~2013273600] --> OK [~0.2013273472E10,TO_NEAREST] --> [~2013273472,~2013273472] --> OK [~0.2013273344E10,TO_NEAREST] --> [~2013273344,~2013273344] --> OK [~0.2013273216E10,TO_NEAREST] --> [~2013273216,~2013273216] --> OK [~0.2013273088E10,TO_NEAREST] --> [~2013273088,~2013273088] --> OK [~0.201327296E10,TO_NEAREST] --> [~2013272960,~2013272960] --> OK [~0.2013272832E10,TO_NEAREST] --> [~2013272832,~2013272832] --> OK [~0.2013272704E10,TO_NEAREST] --> [~2013272704,~2013272704] --> OK [~0.2013272576E10,TO_NEAREST] --> [~2013272576,~2013272576] --> OK [~0.2013272448E10,TO_NEAREST] --> [~2013272448,~2013272448] --> OK [~0.201327232E10,TO_NEAREST] --> [~2013272320,~2013272320] --> OK [~0.2013272192E10,TO_NEAREST] --> [~2013272192,~2013272192] --> OK [~0.2013272064E10,TO_NEAREST] --> [~2013272064,~2013272064] --> OK [~0.2013271936E10,TO_NEAREST] --> [~2013271936,~2013271936] --> OK [~0.2013271808E10,TO_NEAREST] --> [~2013271808,~2013271808] --> OK [~0.201327168E10,TO_NEAREST] --> [~2013271680,~2013271680] --> OK [~0.2013271552E10,TO_NEAREST] --> [~2013271552,~2013271552] --> OK [~0.2013271424E10,TO_NEAREST] --> [~2013271424,~2013271424] --> OK [~0.2013271296E10,TO_NEAREST] --> [~2013271296,~2013271296] --> OK [~0.2013271168E10,TO_NEAREST] --> [~2013271168,~2013271168] --> OK [~0.201327104E10,TO_NEAREST] --> [~2013271040,~2013271040] --> OK [~0.2013270912E10,TO_NEAREST] --> [~2013270912,~2013270912] --> OK [~0.2013270784E10,TO_NEAREST] --> [~2013270784,~2013270784] --> OK [~0.2013270656E10,TO_NEAREST] --> [~2013270656,~2013270656] --> OK [~0.2013270528E10,TO_NEAREST] --> [~2013270528,~2013270528] --> OK [~0.20132704E10,TO_NEAREST] --> [~2013270400,~2013270400] --> OK [~0.2013270272E10,TO_NEAREST] --> [~2013270272,~2013270272] --> OK [~0.2013270144E10,TO_NEAREST] --> [~2013270144,~2013270144] --> OK [~0.2013270016E10,TO_NEAREST] --> [~2013270016,~2013270016] --> OK [~0.2013269888E10,TO_NEAREST] --> [~2013269888,~2013269888] --> OK [~0.201326976E10,TO_NEAREST] --> [~2013269760,~2013269760] --> OK [~0.2013269632E10,TO_NEAREST] --> [~2013269632,~2013269632] --> OK [~0.2013269504E10,TO_NEAREST] --> [~2013269504,~2013269504] --> OK [~0.2013269376E10,TO_NEAREST] --> [~2013269376,~2013269376] --> OK [~0.2013269248E10,TO_NEAREST] --> [~2013269248,~2013269248] --> OK [~0.201326912E10,TO_NEAREST] --> [~2013269120,~2013269120] --> OK [~0.2013268992E10,TO_NEAREST] --> [~2013268992,~2013268992] --> OK [~0.2013268864E10,TO_NEAREST] --> [~2013268864,~2013268864] --> OK [~0.2013268736E10,TO_NEAREST] --> [~2013268736,~2013268736] --> OK [~0.2013268608E10,TO_NEAREST] --> [~2013268608,~2013268608] --> OK [~0.201326848E10,TO_NEAREST] --> [~2013268480,~2013268480] --> OK [~0.2013268352E10,TO_NEAREST] --> [~2013268352,~2013268352] --> OK [~0.2013268224E10,TO_NEAREST] --> [~2013268224,~2013268224] --> OK [~0.2013268096E10,TO_NEAREST] --> [~2013268096,~2013268096] --> OK [~0.2013267968E10,TO_NEAREST] --> [~2013267968,~2013267968] --> OK [~0.201326784E10,TO_NEAREST] --> [~2013267840,~2013267840] --> OK [~0.2013267712E10,TO_NEAREST] --> [~2013267712,~2013267712] --> OK [~0.2013267584E10,TO_NEAREST] --> [~2013267584,~2013267584] --> OK [~0.2013267456E10,TO_NEAREST] --> [~2013267456,~2013267456] --> OK [~0.2013267328E10,TO_NEAREST] --> [~2013267328,~2013267328] --> OK [~0.20132672E10,TO_NEAREST] --> [~2013267200,~2013267200] --> OK [~0.2013267072E10,TO_NEAREST] --> [~2013267072,~2013267072] --> OK [~0.2013266944E10,TO_NEAREST] --> [~2013266944,~2013266944] --> OK [~0.2013266816E10,TO_NEAREST] --> [~2013266816,~2013266816] --> OK [~0.2013266688E10,TO_NEAREST] --> [~2013266688,~2013266688] --> OK [~0.201326656E10,TO_NEAREST] --> [~2013266560,~2013266560] --> OK [~0.2013266432E10,TO_NEAREST] --> [~2013266432,~2013266432] --> OK [~0.2013266304E10,TO_NEAREST] --> [~2013266304,~2013266304] --> OK [~0.2013266176E10,TO_NEAREST] --> [~2013266176,~2013266176] --> OK [~0.2013266048E10,TO_NEAREST] --> [~2013266048,~2013266048] --> OK [~0.201326592E10,TO_NEAREST] --> [~2013265920,~2013265920] --> OK [~0.2013257728E10,TO_NEAREST] --> [~2013257728,~2013257728] --> OK [~0.2013257856E10,TO_NEAREST] --> [~2013257856,~2013257856] --> OK [~0.2013257984E10,TO_NEAREST] --> [~2013257984,~2013257984] --> OK [~0.2013258112E10,TO_NEAREST] --> [~2013258112,~2013258112] --> OK [~0.201325824E10,TO_NEAREST] --> [~2013258240,~2013258240] --> OK [~0.2013258368E10,TO_NEAREST] --> [~2013258368,~2013258368] --> OK [~0.2013258496E10,TO_NEAREST] --> [~2013258496,~2013258496] --> OK [~0.2013258624E10,TO_NEAREST] --> [~2013258624,~2013258624] --> OK [~0.2013258752E10,TO_NEAREST] --> [~2013258752,~2013258752] --> OK [~0.201325888E10,TO_NEAREST] --> [~2013258880,~2013258880] --> OK [~0.2013259008E10,TO_NEAREST] --> [~2013259008,~2013259008] --> OK [~0.2013259136E10,TO_NEAREST] --> [~2013259136,~2013259136] --> OK [~0.2013259264E10,TO_NEAREST] --> [~2013259264,~2013259264] --> OK [~0.2013259392E10,TO_NEAREST] --> [~2013259392,~2013259392] --> OK [~0.201325952E10,TO_NEAREST] --> [~2013259520,~2013259520] --> OK [~0.2013259648E10,TO_NEAREST] --> [~2013259648,~2013259648] --> OK [~0.2013259776E10,TO_NEAREST] --> [~2013259776,~2013259776] --> OK [~0.2013259904E10,TO_NEAREST] --> [~2013259904,~2013259904] --> OK [~0.2013260032E10,TO_NEAREST] --> [~2013260032,~2013260032] --> OK [~0.201326016E10,TO_NEAREST] --> [~2013260160,~2013260160] --> OK [~0.2013260288E10,TO_NEAREST] --> [~2013260288,~2013260288] --> OK [~0.2013260416E10,TO_NEAREST] --> [~2013260416,~2013260416] --> OK [~0.2013260544E10,TO_NEAREST] --> [~2013260544,~2013260544] --> OK [~0.2013260672E10,TO_NEAREST] --> [~2013260672,~2013260672] --> OK [~0.20132608E10,TO_NEAREST] --> [~2013260800,~2013260800] --> OK [~0.2013260928E10,TO_NEAREST] --> [~2013260928,~2013260928] --> OK [~0.2013261056E10,TO_NEAREST] --> [~2013261056,~2013261056] --> OK [~0.2013261184E10,TO_NEAREST] --> [~2013261184,~2013261184] --> OK [~0.2013261312E10,TO_NEAREST] --> [~2013261312,~2013261312] --> OK [~0.201326144E10,TO_NEAREST] --> [~2013261440,~2013261440] --> OK [~0.2013261568E10,TO_NEAREST] --> [~2013261568,~2013261568] --> OK [~0.2013261696E10,TO_NEAREST] --> [~2013261696,~2013261696] --> OK [~0.2013261824E10,TO_NEAREST] --> [~2013261824,~2013261824] --> OK [~0.2013261952E10,TO_NEAREST] --> [~2013261952,~2013261952] --> OK [~0.201326208E10,TO_NEAREST] --> [~2013262080,~2013262080] --> OK [~0.2013262208E10,TO_NEAREST] --> [~2013262208,~2013262208] --> OK [~0.2013262336E10,TO_NEAREST] --> [~2013262336,~2013262336] --> OK [~0.2013262464E10,TO_NEAREST] --> [~2013262464,~2013262464] --> OK [~0.2013262592E10,TO_NEAREST] --> [~2013262592,~2013262592] --> OK [~0.201326272E10,TO_NEAREST] --> [~2013262720,~2013262720] --> OK [~0.2013262848E10,TO_NEAREST] --> [~2013262848,~2013262848] --> OK [~0.2013262976E10,TO_NEAREST] --> [~2013262976,~2013262976] --> OK [~0.2013263104E10,TO_NEAREST] --> [~2013263104,~2013263104] --> OK [~0.2013263232E10,TO_NEAREST] --> [~2013263232,~2013263232] --> OK [~0.201326336E10,TO_NEAREST] --> [~2013263360,~2013263360] --> OK [~0.2013263488E10,TO_NEAREST] --> [~2013263488,~2013263488] --> OK [~0.2013263616E10,TO_NEAREST] --> [~2013263616,~2013263616] --> OK [~0.2013263744E10,TO_NEAREST] --> [~2013263744,~2013263744] --> OK [~0.2013263872E10,TO_NEAREST] --> [~2013263872,~2013263872] --> OK [~0.2013264E10,TO_NEAREST] --> [~2013264000,~2013264000] --> OK [~0.2013264128E10,TO_NEAREST] --> [~2013264128,~2013264128] --> OK [~0.2013264256E10,TO_NEAREST] --> [~2013264256,~2013264256] --> OK [~0.2013264384E10,TO_NEAREST] --> [~2013264384,~2013264384] --> OK [~0.2013264512E10,TO_NEAREST] --> [~2013264512,~2013264512] --> OK [~0.201326464E10,TO_NEAREST] --> [~2013264640,~2013264640] --> OK [~0.2013264768E10,TO_NEAREST] --> [~2013264768,~2013264768] --> OK [~0.2013264896E10,TO_NEAREST] --> [~2013264896,~2013264896] --> OK [~0.2013265024E10,TO_NEAREST] --> [~2013265024,~2013265024] --> OK [~0.2013265152E10,TO_NEAREST] --> [~2013265152,~2013265152] --> OK [~0.201326528E10,TO_NEAREST] --> [~2013265280,~2013265280] --> OK [~0.2013265408E10,TO_NEAREST] --> [~2013265408,~2013265408] --> OK [~0.2013265536E10,TO_NEAREST] --> [~2013265536,~2013265536] --> OK [~0.2013265664E10,TO_NEAREST] --> [~2013265664,~2013265664] --> OK [~0.2013265792E10,TO_NEAREST] --> [~2013265792,~2013265792] --> OK [~0.1879056384E10,TO_NEAREST] --> [~1879056384,~1879056384] --> OK [~0.1879056256E10,TO_NEAREST] --> [~1879056256,~1879056256] --> OK [~0.1879056128E10,TO_NEAREST] --> [~1879056128,~1879056128] --> OK [~0.1879056E10,TO_NEAREST] --> [~1879056000,~1879056000] --> OK [~0.1879055872E10,TO_NEAREST] --> [~1879055872,~1879055872] --> OK [~0.1879055744E10,TO_NEAREST] --> [~1879055744,~1879055744] --> OK [~0.1879055616E10,TO_NEAREST] --> [~1879055616,~1879055616] --> OK [~0.1879055488E10,TO_NEAREST] --> [~1879055488,~1879055488] --> OK [~0.187905536E10,TO_NEAREST] --> [~1879055360,~1879055360] --> OK [~0.1879055232E10,TO_NEAREST] --> [~1879055232,~1879055232] --> OK [~0.1879055104E10,TO_NEAREST] --> [~1879055104,~1879055104] --> OK [~0.1879054976E10,TO_NEAREST] --> [~1879054976,~1879054976] --> OK [~0.1879054848E10,TO_NEAREST] --> [~1879054848,~1879054848] --> OK [~0.187905472E10,TO_NEAREST] --> [~1879054720,~1879054720] --> OK [~0.1879054592E10,TO_NEAREST] --> [~1879054592,~1879054592] --> OK [~0.1879054464E10,TO_NEAREST] --> [~1879054464,~1879054464] --> OK [~0.1879054336E10,TO_NEAREST] --> [~1879054336,~1879054336] --> OK [~0.1879054208E10,TO_NEAREST] --> [~1879054208,~1879054208] --> OK [~0.187905408E10,TO_NEAREST] --> [~1879054080,~1879054080] --> OK [~0.1879053952E10,TO_NEAREST] --> [~1879053952,~1879053952] --> OK [~0.1879053824E10,TO_NEAREST] --> [~1879053824,~1879053824] --> OK [~0.1879053696E10,TO_NEAREST] --> [~1879053696,~1879053696] --> OK [~0.1879053568E10,TO_NEAREST] --> [~1879053568,~1879053568] --> OK [~0.187905344E10,TO_NEAREST] --> [~1879053440,~1879053440] --> OK [~0.1879053312E10,TO_NEAREST] --> [~1879053312,~1879053312] --> OK [~0.1879053184E10,TO_NEAREST] --> [~1879053184,~1879053184] --> OK [~0.1879053056E10,TO_NEAREST] --> [~1879053056,~1879053056] --> OK [~0.1879052928E10,TO_NEAREST] --> [~1879052928,~1879052928] --> OK [~0.18790528E10,TO_NEAREST] --> [~1879052800,~1879052800] --> OK [~0.1879052672E10,TO_NEAREST] --> [~1879052672,~1879052672] --> OK [~0.1879052544E10,TO_NEAREST] --> [~1879052544,~1879052544] --> OK [~0.1879052416E10,TO_NEAREST] --> [~1879052416,~1879052416] --> OK [~0.1879052288E10,TO_NEAREST] --> [~1879052288,~1879052288] --> OK [~0.187905216E10,TO_NEAREST] --> [~1879052160,~1879052160] --> OK [~0.1879052032E10,TO_NEAREST] --> [~1879052032,~1879052032] --> OK [~0.1879051904E10,TO_NEAREST] --> [~1879051904,~1879051904] --> OK [~0.1879051776E10,TO_NEAREST] --> [~1879051776,~1879051776] --> OK [~0.1879051648E10,TO_NEAREST] --> [~1879051648,~1879051648] --> OK [~0.187905152E10,TO_NEAREST] --> [~1879051520,~1879051520] --> OK [~0.1879051392E10,TO_NEAREST] --> [~1879051392,~1879051392] --> OK [~0.1879051264E10,TO_NEAREST] --> [~1879051264,~1879051264] --> OK [~0.1879051136E10,TO_NEAREST] --> [~1879051136,~1879051136] --> OK [~0.1879051008E10,TO_NEAREST] --> [~1879051008,~1879051008] --> OK [~0.187905088E10,TO_NEAREST] --> [~1879050880,~1879050880] --> OK [~0.1879050752E10,TO_NEAREST] --> [~1879050752,~1879050752] --> OK [~0.1879050624E10,TO_NEAREST] --> [~1879050624,~1879050624] --> OK [~0.1879050496E10,TO_NEAREST] --> [~1879050496,~1879050496] --> OK [~0.1879050368E10,TO_NEAREST] --> [~1879050368,~1879050368] --> OK [~0.187905024E10,TO_NEAREST] --> [~1879050240,~1879050240] --> OK [~0.1879050112E10,TO_NEAREST] --> [~1879050112,~1879050112] --> OK [~0.1879049984E10,TO_NEAREST] --> [~1879049984,~1879049984] --> OK [~0.1879049856E10,TO_NEAREST] --> [~1879049856,~1879049856] --> OK [~0.1879049728E10,TO_NEAREST] --> [~1879049728,~1879049728] --> OK [~0.18790496E10,TO_NEAREST] --> [~1879049600,~1879049600] --> OK [~0.1879049472E10,TO_NEAREST] --> [~1879049472,~1879049472] --> OK [~0.1879049344E10,TO_NEAREST] --> [~1879049344,~1879049344] --> OK [~0.1879049216E10,TO_NEAREST] --> [~1879049216,~1879049216] --> OK [~0.1879049088E10,TO_NEAREST] --> [~1879049088,~1879049088] --> OK [~0.187904896E10,TO_NEAREST] --> [~1879048960,~1879048960] --> OK [~0.1879048832E10,TO_NEAREST] --> [~1879048832,~1879048832] --> OK [~0.1879048704E10,TO_NEAREST] --> [~1879048704,~1879048704] --> OK [~0.1879048576E10,TO_NEAREST] --> [~1879048576,~1879048576] --> OK [~0.1879048448E10,TO_NEAREST] --> [~1879048448,~1879048448] --> OK [~0.187904832E10,TO_NEAREST] --> [~1879048320,~1879048320] --> OK [~0.1879048192E10,TO_NEAREST] --> [~1879048192,~1879048192] --> OK [~0.187904E10,TO_NEAREST] --> [~1879040000,~1879040000] --> OK [~0.1879040128E10,TO_NEAREST] --> [~1879040128,~1879040128] --> OK [~0.1879040256E10,TO_NEAREST] --> [~1879040256,~1879040256] --> OK [~0.1879040384E10,TO_NEAREST] --> [~1879040384,~1879040384] --> OK [~0.1879040512E10,TO_NEAREST] --> [~1879040512,~1879040512] --> OK [~0.187904064E10,TO_NEAREST] --> [~1879040640,~1879040640] --> OK [~0.1879040768E10,TO_NEAREST] --> [~1879040768,~1879040768] --> OK [~0.1879040896E10,TO_NEAREST] --> [~1879040896,~1879040896] --> OK [~0.1879041024E10,TO_NEAREST] --> [~1879041024,~1879041024] --> OK [~0.1879041152E10,TO_NEAREST] --> [~1879041152,~1879041152] --> OK [~0.187904128E10,TO_NEAREST] --> [~1879041280,~1879041280] --> OK [~0.1879041408E10,TO_NEAREST] --> [~1879041408,~1879041408] --> OK [~0.1879041536E10,TO_NEAREST] --> [~1879041536,~1879041536] --> OK [~0.1879041664E10,TO_NEAREST] --> [~1879041664,~1879041664] --> OK [~0.1879041792E10,TO_NEAREST] --> [~1879041792,~1879041792] --> OK [~0.187904192E10,TO_NEAREST] --> [~1879041920,~1879041920] --> OK [~0.1879042048E10,TO_NEAREST] --> [~1879042048,~1879042048] --> OK [~0.1879042176E10,TO_NEAREST] --> [~1879042176,~1879042176] --> OK [~0.1879042304E10,TO_NEAREST] --> [~1879042304,~1879042304] --> OK [~0.1879042432E10,TO_NEAREST] --> [~1879042432,~1879042432] --> OK [~0.187904256E10,TO_NEAREST] --> [~1879042560,~1879042560] --> OK [~0.1879042688E10,TO_NEAREST] --> [~1879042688,~1879042688] --> OK [~0.1879042816E10,TO_NEAREST] --> [~1879042816,~1879042816] --> OK [~0.1879042944E10,TO_NEAREST] --> [~1879042944,~1879042944] --> OK [~0.1879043072E10,TO_NEAREST] --> [~1879043072,~1879043072] --> OK [~0.18790432E10,TO_NEAREST] --> [~1879043200,~1879043200] --> OK [~0.1879043328E10,TO_NEAREST] --> [~1879043328,~1879043328] --> OK [~0.1879043456E10,TO_NEAREST] --> [~1879043456,~1879043456] --> OK [~0.1879043584E10,TO_NEAREST] --> [~1879043584,~1879043584] --> OK [~0.1879043712E10,TO_NEAREST] --> [~1879043712,~1879043712] --> OK [~0.187904384E10,TO_NEAREST] --> [~1879043840,~1879043840] --> OK [~0.1879043968E10,TO_NEAREST] --> [~1879043968,~1879043968] --> OK [~0.1879044096E10,TO_NEAREST] --> [~1879044096,~1879044096] --> OK [~0.1879044224E10,TO_NEAREST] --> [~1879044224,~1879044224] --> OK [~0.1879044352E10,TO_NEAREST] --> [~1879044352,~1879044352] --> OK [~0.187904448E10,TO_NEAREST] --> [~1879044480,~1879044480] --> OK [~0.1879044608E10,TO_NEAREST] --> [~1879044608,~1879044608] --> OK [~0.1879044736E10,TO_NEAREST] --> [~1879044736,~1879044736] --> OK [~0.1879044864E10,TO_NEAREST] --> [~1879044864,~1879044864] --> OK [~0.1879044992E10,TO_NEAREST] --> [~1879044992,~1879044992] --> OK [~0.187904512E10,TO_NEAREST] --> [~1879045120,~1879045120] --> OK [~0.1879045248E10,TO_NEAREST] --> [~1879045248,~1879045248] --> OK [~0.1879045376E10,TO_NEAREST] --> [~1879045376,~1879045376] --> OK [~0.1879045504E10,TO_NEAREST] --> [~1879045504,~1879045504] --> OK [~0.1879045632E10,TO_NEAREST] --> [~1879045632,~1879045632] --> OK [~0.187904576E10,TO_NEAREST] --> [~1879045760,~1879045760] --> OK [~0.1879045888E10,TO_NEAREST] --> [~1879045888,~1879045888] --> OK [~0.1879046016E10,TO_NEAREST] --> [~1879046016,~1879046016] --> OK [~0.1879046144E10,TO_NEAREST] --> [~1879046144,~1879046144] --> OK [~0.1879046272E10,TO_NEAREST] --> [~1879046272,~1879046272] --> OK [~0.18790464E10,TO_NEAREST] --> [~1879046400,~1879046400] --> OK [~0.1879046528E10,TO_NEAREST] --> [~1879046528,~1879046528] --> OK [~0.1879046656E10,TO_NEAREST] --> [~1879046656,~1879046656] --> OK [~0.1879046784E10,TO_NEAREST] --> [~1879046784,~1879046784] --> OK [~0.1879046912E10,TO_NEAREST] --> [~1879046912,~1879046912] --> OK [~0.187904704E10,TO_NEAREST] --> [~1879047040,~1879047040] --> OK [~0.1879047168E10,TO_NEAREST] --> [~1879047168,~1879047168] --> OK [~0.1879047296E10,TO_NEAREST] --> [~1879047296,~1879047296] --> OK [~0.1879047424E10,TO_NEAREST] --> [~1879047424,~1879047424] --> OK [~0.1879047552E10,TO_NEAREST] --> [~1879047552,~1879047552] --> OK [~0.187904768E10,TO_NEAREST] --> [~1879047680,~1879047680] --> OK [~0.1879047808E10,TO_NEAREST] --> [~1879047808,~1879047808] --> OK [~0.1879047936E10,TO_NEAREST] --> [~1879047936,~1879047936] --> OK [~0.1879048064E10,TO_NEAREST] --> [~1879048064,~1879048064] --> OK [~0.1610620928E10,TO_NEAREST] --> [~1610620928,~1610620928] --> OK [~0.16106208E10,TO_NEAREST] --> [~1610620800,~1610620800] --> OK [~0.1610620672E10,TO_NEAREST] --> [~1610620672,~1610620672] --> OK [~0.1610620544E10,TO_NEAREST] --> [~1610620544,~1610620544] --> OK [~0.1610620416E10,TO_NEAREST] --> [~1610620416,~1610620416] --> OK [~0.1610620288E10,TO_NEAREST] --> [~1610620288,~1610620288] --> OK [~0.161062016E10,TO_NEAREST] --> [~1610620160,~1610620160] --> OK [~0.1610620032E10,TO_NEAREST] --> [~1610620032,~1610620032] --> OK [~0.1610619904E10,TO_NEAREST] --> [~1610619904,~1610619904] --> OK [~0.1610619776E10,TO_NEAREST] --> [~1610619776,~1610619776] --> OK [~0.1610619648E10,TO_NEAREST] --> [~1610619648,~1610619648] --> OK [~0.161061952E10,TO_NEAREST] --> [~1610619520,~1610619520] --> OK [~0.1610619392E10,TO_NEAREST] --> [~1610619392,~1610619392] --> OK [~0.1610619264E10,TO_NEAREST] --> [~1610619264,~1610619264] --> OK [~0.1610619136E10,TO_NEAREST] --> [~1610619136,~1610619136] --> OK [~0.1610619008E10,TO_NEAREST] --> [~1610619008,~1610619008] --> OK [~0.161061888E10,TO_NEAREST] --> [~1610618880,~1610618880] --> OK [~0.1610618752E10,TO_NEAREST] --> [~1610618752,~1610618752] --> OK [~0.1610618624E10,TO_NEAREST] --> [~1610618624,~1610618624] --> OK [~0.1610618496E10,TO_NEAREST] --> [~1610618496,~1610618496] --> OK [~0.1610618368E10,TO_NEAREST] --> [~1610618368,~1610618368] --> OK [~0.161061824E10,TO_NEAREST] --> [~1610618240,~1610618240] --> OK [~0.1610618112E10,TO_NEAREST] --> [~1610618112,~1610618112] --> OK [~0.1610617984E10,TO_NEAREST] --> [~1610617984,~1610617984] --> OK [~0.1610617856E10,TO_NEAREST] --> [~1610617856,~1610617856] --> OK [~0.1610617728E10,TO_NEAREST] --> [~1610617728,~1610617728] --> OK [~0.16106176E10,TO_NEAREST] --> [~1610617600,~1610617600] --> OK [~0.1610617472E10,TO_NEAREST] --> [~1610617472,~1610617472] --> OK [~0.1610617344E10,TO_NEAREST] --> [~1610617344,~1610617344] --> OK [~0.1610617216E10,TO_NEAREST] --> [~1610617216,~1610617216] --> OK [~0.1610617088E10,TO_NEAREST] --> [~1610617088,~1610617088] --> OK [~0.161061696E10,TO_NEAREST] --> [~1610616960,~1610616960] --> OK [~0.1610616832E10,TO_NEAREST] --> [~1610616832,~1610616832] --> OK [~0.1610616704E10,TO_NEAREST] --> [~1610616704,~1610616704] --> OK [~0.1610616576E10,TO_NEAREST] --> [~1610616576,~1610616576] --> OK [~0.1610616448E10,TO_NEAREST] --> [~1610616448,~1610616448] --> OK [~0.161061632E10,TO_NEAREST] --> [~1610616320,~1610616320] --> OK [~0.1610616192E10,TO_NEAREST] --> [~1610616192,~1610616192] --> OK [~0.1610616064E10,TO_NEAREST] --> [~1610616064,~1610616064] --> OK [~0.1610615936E10,TO_NEAREST] --> [~1610615936,~1610615936] --> OK [~0.1610615808E10,TO_NEAREST] --> [~1610615808,~1610615808] --> OK [~0.161061568E10,TO_NEAREST] --> [~1610615680,~1610615680] --> OK [~0.1610615552E10,TO_NEAREST] --> [~1610615552,~1610615552] --> OK [~0.1610615424E10,TO_NEAREST] --> [~1610615424,~1610615424] --> OK [~0.1610615296E10,TO_NEAREST] --> [~1610615296,~1610615296] --> OK [~0.1610615168E10,TO_NEAREST] --> [~1610615168,~1610615168] --> OK [~0.161061504E10,TO_NEAREST] --> [~1610615040,~1610615040] --> OK [~0.1610614912E10,TO_NEAREST] --> [~1610614912,~1610614912] --> OK [~0.1610614784E10,TO_NEAREST] --> [~1610614784,~1610614784] --> OK [~0.1610614656E10,TO_NEAREST] --> [~1610614656,~1610614656] --> OK [~0.1610614528E10,TO_NEAREST] --> [~1610614528,~1610614528] --> OK [~0.16106144E10,TO_NEAREST] --> [~1610614400,~1610614400] --> OK [~0.1610614272E10,TO_NEAREST] --> [~1610614272,~1610614272] --> OK [~0.1610614144E10,TO_NEAREST] --> [~1610614144,~1610614144] --> OK [~0.1610614016E10,TO_NEAREST] --> [~1610614016,~1610614016] --> OK [~0.1610613888E10,TO_NEAREST] --> [~1610613888,~1610613888] --> OK [~0.161061376E10,TO_NEAREST] --> [~1610613760,~1610613760] --> OK [~0.1610613632E10,TO_NEAREST] --> [~1610613632,~1610613632] --> OK [~0.1610613504E10,TO_NEAREST] --> [~1610613504,~1610613504] --> OK [~0.1610613376E10,TO_NEAREST] --> [~1610613376,~1610613376] --> OK [~0.1610613248E10,TO_NEAREST] --> [~1610613248,~1610613248] --> OK [~0.161061312E10,TO_NEAREST] --> [~1610613120,~1610613120] --> OK [~0.1610612992E10,TO_NEAREST] --> [~1610612992,~1610612992] --> OK [~0.1610612864E10,TO_NEAREST] --> [~1610612864,~1610612864] --> OK [~0.1610612736E10,TO_NEAREST] --> [~1610612736,~1610612736] --> OK [~0.1610604544E10,TO_NEAREST] --> [~1610604544,~1610604544] --> OK [~0.1610604672E10,TO_NEAREST] --> [~1610604672,~1610604672] --> OK [~0.16106048E10,TO_NEAREST] --> [~1610604800,~1610604800] --> OK [~0.1610604928E10,TO_NEAREST] --> [~1610604928,~1610604928] --> OK [~0.1610605056E10,TO_NEAREST] --> [~1610605056,~1610605056] --> OK [~0.1610605184E10,TO_NEAREST] --> [~1610605184,~1610605184] --> OK [~0.1610605312E10,TO_NEAREST] --> [~1610605312,~1610605312] --> OK [~0.161060544E10,TO_NEAREST] --> [~1610605440,~1610605440] --> OK [~0.1610605568E10,TO_NEAREST] --> [~1610605568,~1610605568] --> OK [~0.1610605696E10,TO_NEAREST] --> [~1610605696,~1610605696] --> OK [~0.1610605824E10,TO_NEAREST] --> [~1610605824,~1610605824] --> OK [~0.1610605952E10,TO_NEAREST] --> [~1610605952,~1610605952] --> OK [~0.161060608E10,TO_NEAREST] --> [~1610606080,~1610606080] --> OK [~0.1610606208E10,TO_NEAREST] --> [~1610606208,~1610606208] --> OK [~0.1610606336E10,TO_NEAREST] --> [~1610606336,~1610606336] --> OK [~0.1610606464E10,TO_NEAREST] --> [~1610606464,~1610606464] --> OK [~0.1610606592E10,TO_NEAREST] --> [~1610606592,~1610606592] --> OK [~0.161060672E10,TO_NEAREST] --> [~1610606720,~1610606720] --> OK [~0.1610606848E10,TO_NEAREST] --> [~1610606848,~1610606848] --> OK [~0.1610606976E10,TO_NEAREST] --> [~1610606976,~1610606976] --> OK [~0.1610607104E10,TO_NEAREST] --> [~1610607104,~1610607104] --> OK [~0.1610607232E10,TO_NEAREST] --> [~1610607232,~1610607232] --> OK [~0.161060736E10,TO_NEAREST] --> [~1610607360,~1610607360] --> OK [~0.1610607488E10,TO_NEAREST] --> [~1610607488,~1610607488] --> OK [~0.1610607616E10,TO_NEAREST] --> [~1610607616,~1610607616] --> OK [~0.1610607744E10,TO_NEAREST] --> [~1610607744,~1610607744] --> OK [~0.1610607872E10,TO_NEAREST] --> [~1610607872,~1610607872] --> OK [~0.1610608E10,TO_NEAREST] --> [~1610608000,~1610608000] --> OK [~0.1610608128E10,TO_NEAREST] --> [~1610608128,~1610608128] --> OK [~0.1610608256E10,TO_NEAREST] --> [~1610608256,~1610608256] --> OK [~0.1610608384E10,TO_NEAREST] --> [~1610608384,~1610608384] --> OK [~0.1610608512E10,TO_NEAREST] --> [~1610608512,~1610608512] --> OK [~0.161060864E10,TO_NEAREST] --> [~1610608640,~1610608640] --> OK [~0.1610608768E10,TO_NEAREST] --> [~1610608768,~1610608768] --> OK [~0.1610608896E10,TO_NEAREST] --> [~1610608896,~1610608896] --> OK [~0.1610609024E10,TO_NEAREST] --> [~1610609024,~1610609024] --> OK [~0.1610609152E10,TO_NEAREST] --> [~1610609152,~1610609152] --> OK [~0.161060928E10,TO_NEAREST] --> [~1610609280,~1610609280] --> OK [~0.1610609408E10,TO_NEAREST] --> [~1610609408,~1610609408] --> OK [~0.1610609536E10,TO_NEAREST] --> [~1610609536,~1610609536] --> OK [~0.1610609664E10,TO_NEAREST] --> [~1610609664,~1610609664] --> OK [~0.1610609792E10,TO_NEAREST] --> [~1610609792,~1610609792] --> OK [~0.161060992E10,TO_NEAREST] --> [~1610609920,~1610609920] --> OK [~0.1610610048E10,TO_NEAREST] --> [~1610610048,~1610610048] --> OK [~0.1610610176E10,TO_NEAREST] --> [~1610610176,~1610610176] --> OK [~0.1610610304E10,TO_NEAREST] --> [~1610610304,~1610610304] --> OK [~0.1610610432E10,TO_NEAREST] --> [~1610610432,~1610610432] --> OK [~0.161061056E10,TO_NEAREST] --> [~1610610560,~1610610560] --> OK [~0.1610610688E10,TO_NEAREST] --> [~1610610688,~1610610688] --> OK [~0.1610610816E10,TO_NEAREST] --> [~1610610816,~1610610816] --> OK [~0.1610610944E10,TO_NEAREST] --> [~1610610944,~1610610944] --> OK [~0.1610611072E10,TO_NEAREST] --> [~1610611072,~1610611072] --> OK [~0.16106112E10,TO_NEAREST] --> [~1610611200,~1610611200] --> OK [~0.1610611328E10,TO_NEAREST] --> [~1610611328,~1610611328] --> OK [~0.1610611456E10,TO_NEAREST] --> [~1610611456,~1610611456] --> OK [~0.1610611584E10,TO_NEAREST] --> [~1610611584,~1610611584] --> OK [~0.1610611712E10,TO_NEAREST] --> [~1610611712,~1610611712] --> OK [~0.161061184E10,TO_NEAREST] --> [~1610611840,~1610611840] --> OK [~0.1610611968E10,TO_NEAREST] --> [~1610611968,~1610611968] --> OK [~0.1610612096E10,TO_NEAREST] --> [~1610612096,~1610612096] --> OK [~0.1610612224E10,TO_NEAREST] --> [~1610612224,~1610612224] --> OK [~0.1610612352E10,TO_NEAREST] --> [~1610612352,~1610612352] --> OK [~0.161061248E10,TO_NEAREST] --> [~1610612480,~1610612480] --> OK [~0.1610612608E10,TO_NEAREST] --> [~1610612608,~1610612608] --> OK [~0.1073750016E10,TO_NEAREST] --> [~1073750016,~1073750016] --> OK [~0.1073749888E10,TO_NEAREST] --> [~1073749888,~1073749888] --> OK [~0.107374976E10,TO_NEAREST] --> [~1073749760,~1073749760] --> OK [~0.1073749632E10,TO_NEAREST] --> [~1073749632,~1073749632] --> OK [~0.1073749504E10,TO_NEAREST] --> [~1073749504,~1073749504] --> OK [~0.1073749376E10,TO_NEAREST] --> [~1073749376,~1073749376] --> OK [~0.1073749248E10,TO_NEAREST] --> [~1073749248,~1073749248] --> OK [~0.107374912E10,TO_NEAREST] --> [~1073749120,~1073749120] --> OK [~0.1073748992E10,TO_NEAREST] --> [~1073748992,~1073748992] --> OK [~0.1073748864E10,TO_NEAREST] --> [~1073748864,~1073748864] --> OK [~0.1073748736E10,TO_NEAREST] --> [~1073748736,~1073748736] --> OK [~0.1073748608E10,TO_NEAREST] --> [~1073748608,~1073748608] --> OK [~0.107374848E10,TO_NEAREST] --> [~1073748480,~1073748480] --> OK [~0.1073748352E10,TO_NEAREST] --> [~1073748352,~1073748352] --> OK [~0.1073748224E10,TO_NEAREST] --> [~1073748224,~1073748224] --> OK [~0.1073748096E10,TO_NEAREST] --> [~1073748096,~1073748096] --> OK [~0.1073747968E10,TO_NEAREST] --> [~1073747968,~1073747968] --> OK [~0.107374784E10,TO_NEAREST] --> [~1073747840,~1073747840] --> OK [~0.1073747712E10,TO_NEAREST] --> [~1073747712,~1073747712] --> OK [~0.1073747584E10,TO_NEAREST] --> [~1073747584,~1073747584] --> OK [~0.1073747456E10,TO_NEAREST] --> [~1073747456,~1073747456] --> OK [~0.1073747328E10,TO_NEAREST] --> [~1073747328,~1073747328] --> OK [~0.10737472E10,TO_NEAREST] --> [~1073747200,~1073747200] --> OK [~0.1073747072E10,TO_NEAREST] --> [~1073747072,~1073747072] --> OK [~0.1073746944E10,TO_NEAREST] --> [~1073746944,~1073746944] --> OK [~0.1073746816E10,TO_NEAREST] --> [~1073746816,~1073746816] --> OK [~0.1073746688E10,TO_NEAREST] --> [~1073746688,~1073746688] --> OK [~0.107374656E10,TO_NEAREST] --> [~1073746560,~1073746560] --> OK [~0.1073746432E10,TO_NEAREST] --> [~1073746432,~1073746432] --> OK [~0.1073746304E10,TO_NEAREST] --> [~1073746304,~1073746304] --> OK [~0.1073746176E10,TO_NEAREST] --> [~1073746176,~1073746176] --> OK [~0.1073746048E10,TO_NEAREST] --> [~1073746048,~1073746048] --> OK [~0.107374592E10,TO_NEAREST] --> [~1073745920,~1073745920] --> OK [~0.1073745792E10,TO_NEAREST] --> [~1073745792,~1073745792] --> OK [~0.1073745664E10,TO_NEAREST] --> [~1073745664,~1073745664] --> OK [~0.1073745536E10,TO_NEAREST] --> [~1073745536,~1073745536] --> OK [~0.1073745408E10,TO_NEAREST] --> [~1073745408,~1073745408] --> OK [~0.107374528E10,TO_NEAREST] --> [~1073745280,~1073745280] --> OK [~0.1073745152E10,TO_NEAREST] --> [~1073745152,~1073745152] --> OK [~0.1073745024E10,TO_NEAREST] --> [~1073745024,~1073745024] --> OK [~0.1073744896E10,TO_NEAREST] --> [~1073744896,~1073744896] --> OK [~0.1073744768E10,TO_NEAREST] --> [~1073744768,~1073744768] --> OK [~0.107374464E10,TO_NEAREST] --> [~1073744640,~1073744640] --> OK [~0.1073744512E10,TO_NEAREST] --> [~1073744512,~1073744512] --> OK [~0.1073744384E10,TO_NEAREST] --> [~1073744384,~1073744384] --> OK [~0.1073744256E10,TO_NEAREST] --> [~1073744256,~1073744256] --> OK [~0.1073744128E10,TO_NEAREST] --> [~1073744128,~1073744128] --> OK [~0.1073744E10,TO_NEAREST] --> [~1073744000,~1073744000] --> OK [~0.1073743872E10,TO_NEAREST] --> [~1073743872,~1073743872] --> OK [~0.1073743744E10,TO_NEAREST] --> [~1073743744,~1073743744] --> OK [~0.1073743616E10,TO_NEAREST] --> [~1073743616,~1073743616] --> OK [~0.1073743488E10,TO_NEAREST] --> [~1073743488,~1073743488] --> OK [~0.107374336E10,TO_NEAREST] --> [~1073743360,~1073743360] --> OK [~0.1073743232E10,TO_NEAREST] --> [~1073743232,~1073743232] --> OK [~0.1073743104E10,TO_NEAREST] --> [~1073743104,~1073743104] --> OK [~0.1073742976E10,TO_NEAREST] --> [~1073742976,~1073742976] --> OK [~0.1073742848E10,TO_NEAREST] --> [~1073742848,~1073742848] --> OK [~0.107374272E10,TO_NEAREST] --> [~1073742720,~1073742720] --> OK [~0.1073742592E10,TO_NEAREST] --> [~1073742592,~1073742592] --> OK [~0.1073742464E10,TO_NEAREST] --> [~1073742464,~1073742464] --> OK [~0.1073742336E10,TO_NEAREST] --> [~1073742336,~1073742336] --> OK [~0.1073742208E10,TO_NEAREST] --> [~1073742208,~1073742208] --> OK [~0.107374208E10,TO_NEAREST] --> [~1073742080,~1073742080] --> OK [~0.1073741952E10,TO_NEAREST] --> [~1073741952,~1073741952] --> OK [~0.1073741824E10,TO_NEAREST] --> [~1073741824,~1073741824] --> OK [~0.1073737728E10,TO_NEAREST] --> [~1073737728,~1073737728] --> OK [~0.1073737792E10,TO_NEAREST] --> [~1073737792,~1073737792] --> OK [~0.1073737856E10,TO_NEAREST] --> [~1073737856,~1073737856] --> OK [~0.107373792E10,TO_NEAREST] --> [~1073737920,~1073737920] --> OK [~0.1073737984E10,TO_NEAREST] --> [~1073737984,~1073737984] --> OK [~0.1073738048E10,TO_NEAREST] --> [~1073738048,~1073738048] --> OK [~0.1073738112E10,TO_NEAREST] --> [~1073738112,~1073738112] --> OK [~0.1073738176E10,TO_NEAREST] --> [~1073738176,~1073738176] --> OK [~0.107373824E10,TO_NEAREST] --> [~1073738240,~1073738240] --> OK [~0.1073738304E10,TO_NEAREST] --> [~1073738304,~1073738304] --> OK [~0.1073738368E10,TO_NEAREST] --> [~1073738368,~1073738368] --> OK [~0.1073738432E10,TO_NEAREST] --> [~1073738432,~1073738432] --> OK [~0.1073738496E10,TO_NEAREST] --> [~1073738496,~1073738496] --> OK [~0.107373856E10,TO_NEAREST] --> [~1073738560,~1073738560] --> OK [~0.1073738624E10,TO_NEAREST] --> [~1073738624,~1073738624] --> OK [~0.1073738688E10,TO_NEAREST] --> [~1073738688,~1073738688] --> OK [~0.1073738752E10,TO_NEAREST] --> [~1073738752,~1073738752] --> OK [~0.1073738816E10,TO_NEAREST] --> [~1073738816,~1073738816] --> OK [~0.107373888E10,TO_NEAREST] --> [~1073738880,~1073738880] --> OK [~0.1073738944E10,TO_NEAREST] --> [~1073738944,~1073738944] --> OK [~0.1073739008E10,TO_NEAREST] --> [~1073739008,~1073739008] --> OK [~0.1073739072E10,TO_NEAREST] --> [~1073739072,~1073739072] --> OK [~0.1073739136E10,TO_NEAREST] --> [~1073739136,~1073739136] --> OK [~0.10737392E10,TO_NEAREST] --> [~1073739200,~1073739200] --> OK [~0.1073739264E10,TO_NEAREST] --> [~1073739264,~1073739264] --> OK [~0.1073739328E10,TO_NEAREST] --> [~1073739328,~1073739328] --> OK [~0.1073739392E10,TO_NEAREST] --> [~1073739392,~1073739392] --> OK [~0.1073739456E10,TO_NEAREST] --> [~1073739456,~1073739456] --> OK [~0.107373952E10,TO_NEAREST] --> [~1073739520,~1073739520] --> OK [~0.1073739584E10,TO_NEAREST] --> [~1073739584,~1073739584] --> OK [~0.1073739648E10,TO_NEAREST] --> [~1073739648,~1073739648] --> OK [~0.1073739712E10,TO_NEAREST] --> [~1073739712,~1073739712] --> OK [~0.1073739776E10,TO_NEAREST] --> [~1073739776,~1073739776] --> OK [~0.107373984E10,TO_NEAREST] --> [~1073739840,~1073739840] --> OK [~0.1073739904E10,TO_NEAREST] --> [~1073739904,~1073739904] --> OK [~0.1073739968E10,TO_NEAREST] --> [~1073739968,~1073739968] --> OK [~0.1073740032E10,TO_NEAREST] --> [~1073740032,~1073740032] --> OK [~0.1073740096E10,TO_NEAREST] --> [~1073740096,~1073740096] --> OK [~0.107374016E10,TO_NEAREST] --> [~1073740160,~1073740160] --> OK [~0.1073740224E10,TO_NEAREST] --> [~1073740224,~1073740224] --> OK [~0.1073740288E10,TO_NEAREST] --> [~1073740288,~1073740288] --> OK [~0.1073740352E10,TO_NEAREST] --> [~1073740352,~1073740352] --> OK [~0.1073740416E10,TO_NEAREST] --> [~1073740416,~1073740416] --> OK [~0.107374048E10,TO_NEAREST] --> [~1073740480,~1073740480] --> OK [~0.1073740544E10,TO_NEAREST] --> [~1073740544,~1073740544] --> OK [~0.1073740608E10,TO_NEAREST] --> [~1073740608,~1073740608] --> OK [~0.1073740672E10,TO_NEAREST] --> [~1073740672,~1073740672] --> OK [~0.1073740736E10,TO_NEAREST] --> [~1073740736,~1073740736] --> OK [~0.10737408E10,TO_NEAREST] --> [~1073740800,~1073740800] --> OK [~0.1073740864E10,TO_NEAREST] --> [~1073740864,~1073740864] --> OK [~0.1073740928E10,TO_NEAREST] --> [~1073740928,~1073740928] --> OK [~0.1073740992E10,TO_NEAREST] --> [~1073740992,~1073740992] --> OK [~0.1073741056E10,TO_NEAREST] --> [~1073741056,~1073741056] --> OK [~0.107374112E10,TO_NEAREST] --> [~1073741120,~1073741120] --> OK [~0.1073741184E10,TO_NEAREST] --> [~1073741184,~1073741184] --> OK [~0.1073741248E10,TO_NEAREST] --> [~1073741248,~1073741248] --> OK [~0.1073741312E10,TO_NEAREST] --> [~1073741312,~1073741312] --> OK [~0.1073741376E10,TO_NEAREST] --> [~1073741376,~1073741376] --> OK [~0.107374144E10,TO_NEAREST] --> [~1073741440,~1073741440] --> OK [~0.1073741504E10,TO_NEAREST] --> [~1073741504,~1073741504] --> OK [~0.1073741568E10,TO_NEAREST] --> [~1073741568,~1073741568] --> OK [~0.1073741632E10,TO_NEAREST] --> [~1073741632,~1073741632] --> OK [~0.1073741696E10,TO_NEAREST] --> [~1073741696,~1073741696] --> OK [~0.107374176E10,TO_NEAREST] --> [~1073741760,~1073741760] --> OK [~0.30000153E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000015E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000148E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000145E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000143E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000014E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000138E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000136E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000134E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000013E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000129E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000126E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000124E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000122E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000012E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000117E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000114E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000112E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000011E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000107E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000105E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000103E1,TO_NEAREST] --> [~3,~3] --> OK [~0.300001E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000098E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000095E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000093E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000009E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000088E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000086E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000083E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000008E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000079E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000076E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000074E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000072E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000007E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000067E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000064E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000062E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000006E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000057E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000055E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000052E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000005E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000048E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000045E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000043E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000004E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000038E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000036E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000033E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000003E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000029E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000026E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000024E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000021E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000002E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000017E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000014E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000012E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000001E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000007E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000005E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000002E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999847E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999985E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999852E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999855E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999857E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999986E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999862E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999864E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999866E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999987E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999871E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999874E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999876E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999878E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999988E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999883E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999886E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999888E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999989E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999893E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999895E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999897E1,TO_NEAREST] --> [~3,~3] --> OK [~0.299999E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999902E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999905E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999907E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999991E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999912E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999914E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999917E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999992E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999921E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999924E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999926E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999928E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999993E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999933E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999936E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999938E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999994E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999943E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999945E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999948E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999995E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999952E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999955E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999957E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999996E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999962E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999964E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999967E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999997E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999971E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999974E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999976E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999979E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999998E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999983E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999986E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999988E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999993E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999995E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999998E1,TO_NEAREST] --> [~3,~3] --> OK [~0.20000153E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000015E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000148E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000145E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000143E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000014E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000138E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000136E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000134E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000013E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000129E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000126E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000124E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000122E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000012E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000117E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000114E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000112E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000011E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000107E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000105E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000103E1,TO_NEAREST] --> [~2,~2] --> OK [~0.200001E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000098E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000095E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000093E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000009E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000088E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000086E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000083E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000008E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000079E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000076E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000074E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000072E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000007E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000067E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000064E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000062E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000006E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000057E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000055E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000052E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000005E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000048E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000045E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000043E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000004E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000038E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000036E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000033E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000003E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000029E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000026E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000024E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000021E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000002E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000017E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000014E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000012E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000001E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000007E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000005E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000002E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999924E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999925E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999926E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999927E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999928E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999993E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999931E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999932E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999933E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999934E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999936E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999937E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999938E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999939E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999994E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999942E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999943E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999944E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999945E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999946E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999948E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999949E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999995E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999951E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999952E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999954E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999955E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999956E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999957E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999958E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999996E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999961E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999962E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999963E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999964E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999965E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999967E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999968E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999969E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999997E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999971E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999973E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999974E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999975E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999976E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999977E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999979E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999998E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999981E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999982E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999983E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999985E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999986E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999987E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999988E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999989E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999992E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999993E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999994E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999995E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999996E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999998E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999E1,TO_NEAREST] --> [~2,~2] --> OK [~0.10000076E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000075E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000074E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000073E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000072E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000007E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000069E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000068E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000067E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000066E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000064E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000063E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000062E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000061E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000006E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000058E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000057E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000056E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000055E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000054E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000052E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000051E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000005E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000049E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000048E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000046E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000045E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000044E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000043E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000042E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000004E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000039E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000038E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000037E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000036E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000035E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000033E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000032E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000031E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000003E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000029E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000027E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000026E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000025E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000024E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000023E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000021E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000002E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000019E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000018E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000017E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000015E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000014E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000013E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000012E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000011E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000001E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000008E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000007E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000006E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000005E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000004E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000002E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000001E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1E1,TO_NEAREST] --> [~1,~1] --> OK [~0.9999962,TO_NEAREST] --> [~1,~1] --> OK [~0.99999624,TO_NEAREST] --> [~1,~1] --> OK [~0.9999963,TO_NEAREST] --> [~1,~1] --> OK [~0.99999636,TO_NEAREST] --> [~1,~1] --> OK [~0.9999964,TO_NEAREST] --> [~1,~1] --> OK [~0.9999965,TO_NEAREST] --> [~1,~1] --> OK [~0.99999654,TO_NEAREST] --> [~1,~1] --> OK [~0.9999966,TO_NEAREST] --> [~1,~1] --> OK [~0.99999666,TO_NEAREST] --> [~1,~1] --> OK [~0.9999967,TO_NEAREST] --> [~1,~1] --> OK [~0.9999968,TO_NEAREST] --> [~1,~1] --> OK [~0.99999684,TO_NEAREST] --> [~1,~1] --> OK [~0.9999969,TO_NEAREST] --> [~1,~1] --> OK [~0.99999696,TO_NEAREST] --> [~1,~1] --> OK [~0.999997,TO_NEAREST] --> [~1,~1] --> OK [~0.9999971,TO_NEAREST] --> [~1,~1] --> OK [~0.99999714,TO_NEAREST] --> [~1,~1] --> OK [~0.9999972,TO_NEAREST] --> [~1,~1] --> OK [~0.99999726,TO_NEAREST] --> [~1,~1] --> OK [~0.9999973,TO_NEAREST] --> [~1,~1] --> OK [~0.9999974,TO_NEAREST] --> [~1,~1] --> OK [~0.99999744,TO_NEAREST] --> [~1,~1] --> OK [~0.9999975,TO_NEAREST] --> [~1,~1] --> OK [~0.99999756,TO_NEAREST] --> [~1,~1] --> OK [~0.9999976,TO_NEAREST] --> [~1,~1] --> OK [~0.9999977,TO_NEAREST] --> [~1,~1] --> OK [~0.99999774,TO_NEAREST] --> [~1,~1] --> OK [~0.9999978,TO_NEAREST] --> [~1,~1] --> OK [~0.99999785,TO_NEAREST] --> [~1,~1] --> OK [~0.9999979,TO_NEAREST] --> [~1,~1] --> OK [~0.999998,TO_NEAREST] --> [~1,~1] --> OK [~0.99999803,TO_NEAREST] --> [~1,~1] --> OK [~0.9999981,TO_NEAREST] --> [~1,~1] --> OK [~0.99999815,TO_NEAREST] --> [~1,~1] --> OK [~0.9999982,TO_NEAREST] --> [~1,~1] --> OK [~0.9999983,TO_NEAREST] --> [~1,~1] --> OK [~0.99999833,TO_NEAREST] --> [~1,~1] --> OK [~0.9999984,TO_NEAREST] --> [~1,~1] --> OK [~0.99999845,TO_NEAREST] --> [~1,~1] --> OK [~0.9999985,TO_NEAREST] --> [~1,~1] --> OK [~0.99999857,TO_NEAREST] --> [~1,~1] --> OK [~0.9999986,TO_NEAREST] --> [~1,~1] --> OK [~0.9999987,TO_NEAREST] --> [~1,~1] --> OK [~0.99999875,TO_NEAREST] --> [~1,~1] --> OK [~0.9999988,TO_NEAREST] --> [~1,~1] --> OK [~0.99999887,TO_NEAREST] --> [~1,~1] --> OK [~0.9999989,TO_NEAREST] --> [~1,~1] --> OK [~0.999999,TO_NEAREST] --> [~1,~1] --> OK [~0.99999905,TO_NEAREST] --> [~1,~1] --> OK [~0.9999991,TO_NEAREST] --> [~1,~1] --> OK [~0.99999917,TO_NEAREST] --> [~1,~1] --> OK [~0.9999992,TO_NEAREST] --> [~1,~1] --> OK [~0.9999993,TO_NEAREST] --> [~1,~1] --> OK [~0.99999934,TO_NEAREST] --> [~1,~1] --> OK [~0.9999994,TO_NEAREST] --> [~1,~1] --> OK [~0.99999946,TO_NEAREST] --> [~1,~1] --> OK [~0.9999995,TO_NEAREST] --> [~1,~1] --> OK [~0.9999996,TO_NEAREST] --> [~1,~1] --> OK [~0.99999964,TO_NEAREST] --> [~1,~1] --> OK [~0.9999997,TO_NEAREST] --> [~1,~1] --> OK [~0.99999976,TO_NEAREST] --> [~1,~1] --> OK [~0.9999998,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999,TO_NEAREST] --> [~1,~1] --> OK [~0.99999994,TO_NEAREST] --> [~1,~1] --> OK [~0.9E~43,TO_NEAREST] --> [0,0] --> OK [~0.88E~43,TO_NEAREST] --> [0,0] --> OK [~0.87E~43,TO_NEAREST] --> [0,0] --> OK [~0.85E~43,TO_NEAREST] --> [0,0] --> OK [~0.84E~43,TO_NEAREST] --> [0,0] --> OK [~0.83E~43,TO_NEAREST] --> [0,0] --> OK [~0.81E~43,TO_NEAREST] --> [0,0] --> OK [~0.8E~43,TO_NEAREST] --> [0,0] --> OK [~0.78E~43,TO_NEAREST] --> [0,0] --> OK [~0.77E~43,TO_NEAREST] --> [0,0] --> OK [~0.76E~43,TO_NEAREST] --> [0,0] --> OK [~0.74E~43,TO_NEAREST] --> [0,0] --> OK [~0.73E~43,TO_NEAREST] --> [0,0] --> OK [~0.71E~43,TO_NEAREST] --> [0,0] --> OK [~0.7E~43,TO_NEAREST] --> [0,0] --> OK [~0.69E~43,TO_NEAREST] --> [0,0] --> OK [~0.67E~43,TO_NEAREST] --> [0,0] --> OK [~0.66E~43,TO_NEAREST] --> [0,0] --> OK [~0.64E~43,TO_NEAREST] --> [0,0] --> OK [~0.63E~43,TO_NEAREST] --> [0,0] --> OK [~0.62E~43,TO_NEAREST] --> [0,0] --> OK [~0.6E~43,TO_NEAREST] --> [0,0] --> OK [~0.59E~43,TO_NEAREST] --> [0,0] --> OK [~0.57E~43,TO_NEAREST] --> [0,0] --> OK [~0.56E~43,TO_NEAREST] --> [0,0] --> OK [~0.55E~43,TO_NEAREST] --> [0,0] --> OK [~0.53E~43,TO_NEAREST] --> [0,0] --> OK [~0.52E~43,TO_NEAREST] --> [0,0] --> OK [~0.5E~43,TO_NEAREST] --> [0,0] --> OK [~0.49E~43,TO_NEAREST] --> [0,0] --> OK [~0.48E~43,TO_NEAREST] --> [0,0] --> OK [~0.46E~43,TO_NEAREST] --> [0,0] --> OK [~0.45E~43,TO_NEAREST] --> [0,0] --> OK [~0.43E~43,TO_NEAREST] --> [0,0] --> OK [~0.42E~43,TO_NEAREST] --> [0,0] --> OK [~0.4E~43,TO_NEAREST] --> [0,0] --> OK [~0.39E~43,TO_NEAREST] --> [0,0] --> OK [~0.38E~43,TO_NEAREST] --> [0,0] --> OK [~0.36E~43,TO_NEAREST] --> [0,0] --> OK [~0.35E~43,TO_NEAREST] --> [0,0] --> OK [~0.34E~43,TO_NEAREST] --> [0,0] --> OK [~0.32E~43,TO_NEAREST] --> [0,0] --> OK [~0.31E~43,TO_NEAREST] --> [0,0] --> OK [~0.3E~43,TO_NEAREST] --> [0,0] --> OK [~0.28E~43,TO_NEAREST] --> [0,0] --> OK [~0.27E~43,TO_NEAREST] --> [0,0] --> OK [~0.25E~43,TO_NEAREST] --> [0,0] --> OK [~0.24E~43,TO_NEAREST] --> [0,0] --> OK [~0.22E~43,TO_NEAREST] --> [0,0] --> OK [~0.21E~43,TO_NEAREST] --> [0,0] --> OK [~0.2E~43,TO_NEAREST] --> [0,0] --> OK [~0.18E~43,TO_NEAREST] --> [0,0] --> OK [~0.17E~43,TO_NEAREST] --> [0,0] --> OK [~0.15E~43,TO_NEAREST] --> [0,0] --> OK [~0.14E~43,TO_NEAREST] --> [0,0] --> OK [~0.13E~43,TO_NEAREST] --> [0,0] --> OK [~0.11E~43,TO_NEAREST] --> [0,0] --> OK [~0.1E~43,TO_NEAREST] --> [0,0] --> OK [~0.8E~44,TO_NEAREST] --> [0,0] --> OK [~0.7E~44,TO_NEAREST] --> [0,0] --> OK [~0.6E~44,TO_NEAREST] --> [0,0] --> OK [~0.4E~44,TO_NEAREST] --> [0,0] --> OK [~0.3E~44,TO_NEAREST] --> [0,0] --> OK [~0.1E~44,TO_NEAREST] --> [0,0] --> OK [0.0,TO_NEAREST] --> [0,0] --> OK [0.9E~43,TO_NEAREST] --> [0,0] --> OK [0.88E~43,TO_NEAREST] --> [0,0] --> OK [0.87E~43,TO_NEAREST] --> [0,0] --> OK [0.85E~43,TO_NEAREST] --> [0,0] --> OK [0.84E~43,TO_NEAREST] --> [0,0] --> OK [0.83E~43,TO_NEAREST] --> [0,0] --> OK [0.81E~43,TO_NEAREST] --> [0,0] --> OK [0.8E~43,TO_NEAREST] --> [0,0] --> OK [0.78E~43,TO_NEAREST] --> [0,0] --> OK [0.77E~43,TO_NEAREST] --> [0,0] --> OK [0.76E~43,TO_NEAREST] --> [0,0] --> OK [0.74E~43,TO_NEAREST] --> [0,0] --> OK [0.73E~43,TO_NEAREST] --> [0,0] --> OK [0.71E~43,TO_NEAREST] --> [0,0] --> OK [0.7E~43,TO_NEAREST] --> [0,0] --> OK [0.69E~43,TO_NEAREST] --> [0,0] --> OK [0.67E~43,TO_NEAREST] --> [0,0] --> OK [0.66E~43,TO_NEAREST] --> [0,0] --> OK [0.64E~43,TO_NEAREST] --> [0,0] --> OK [0.63E~43,TO_NEAREST] --> [0,0] --> OK [0.62E~43,TO_NEAREST] --> [0,0] --> OK [0.6E~43,TO_NEAREST] --> [0,0] --> OK [0.59E~43,TO_NEAREST] --> [0,0] --> OK [0.57E~43,TO_NEAREST] --> [0,0] --> OK [0.56E~43,TO_NEAREST] --> [0,0] --> OK [0.55E~43,TO_NEAREST] --> [0,0] --> OK [0.53E~43,TO_NEAREST] --> [0,0] --> OK [0.52E~43,TO_NEAREST] --> [0,0] --> OK [0.5E~43,TO_NEAREST] --> [0,0] --> OK [0.49E~43,TO_NEAREST] --> [0,0] --> OK [0.48E~43,TO_NEAREST] --> [0,0] --> OK [0.46E~43,TO_NEAREST] --> [0,0] --> OK [0.45E~43,TO_NEAREST] --> [0,0] --> OK [0.43E~43,TO_NEAREST] --> [0,0] --> OK [0.42E~43,TO_NEAREST] --> [0,0] --> OK [0.4E~43,TO_NEAREST] --> [0,0] --> OK [0.39E~43,TO_NEAREST] --> [0,0] --> OK [0.38E~43,TO_NEAREST] --> [0,0] --> OK [0.36E~43,TO_NEAREST] --> [0,0] --> OK [0.35E~43,TO_NEAREST] --> [0,0] --> OK [0.34E~43,TO_NEAREST] --> [0,0] --> OK [0.32E~43,TO_NEAREST] --> [0,0] --> OK [0.31E~43,TO_NEAREST] --> [0,0] --> OK [0.3E~43,TO_NEAREST] --> [0,0] --> OK [0.28E~43,TO_NEAREST] --> [0,0] --> OK [0.27E~43,TO_NEAREST] --> [0,0] --> OK [0.25E~43,TO_NEAREST] --> [0,0] --> OK [0.24E~43,TO_NEAREST] --> [0,0] --> OK [0.22E~43,TO_NEAREST] --> [0,0] --> OK [0.21E~43,TO_NEAREST] --> [0,0] --> OK [0.2E~43,TO_NEAREST] --> [0,0] --> OK [0.18E~43,TO_NEAREST] --> [0,0] --> OK [0.17E~43,TO_NEAREST] --> [0,0] --> OK [0.15E~43,TO_NEAREST] --> [0,0] --> OK [0.14E~43,TO_NEAREST] --> [0,0] --> OK [0.13E~43,TO_NEAREST] --> [0,0] --> OK [0.11E~43,TO_NEAREST] --> [0,0] --> OK [0.1E~43,TO_NEAREST] --> [0,0] --> OK [0.8E~44,TO_NEAREST] --> [0,0] --> OK [0.7E~44,TO_NEAREST] --> [0,0] --> OK [0.6E~44,TO_NEAREST] --> [0,0] --> OK [0.4E~44,TO_NEAREST] --> [0,0] --> OK [0.3E~44,TO_NEAREST] --> [0,0] --> OK [0.1E~44,TO_NEAREST] --> [0,0] --> OK [0.9999962,TO_NEAREST] --> [1,1] --> OK [0.99999624,TO_NEAREST] --> [1,1] --> OK [0.9999963,TO_NEAREST] --> [1,1] --> OK [0.99999636,TO_NEAREST] --> [1,1] --> OK [0.9999964,TO_NEAREST] --> [1,1] --> OK [0.9999965,TO_NEAREST] --> [1,1] --> OK [0.99999654,TO_NEAREST] --> [1,1] --> OK [0.9999966,TO_NEAREST] --> [1,1] --> OK [0.99999666,TO_NEAREST] --> [1,1] --> OK [0.9999967,TO_NEAREST] --> [1,1] --> OK [0.9999968,TO_NEAREST] --> [1,1] --> OK [0.99999684,TO_NEAREST] --> [1,1] --> OK [0.9999969,TO_NEAREST] --> [1,1] --> OK [0.99999696,TO_NEAREST] --> [1,1] --> OK [0.999997,TO_NEAREST] --> [1,1] --> OK [0.9999971,TO_NEAREST] --> [1,1] --> OK [0.99999714,TO_NEAREST] --> [1,1] --> OK [0.9999972,TO_NEAREST] --> [1,1] --> OK [0.99999726,TO_NEAREST] --> [1,1] --> OK [0.9999973,TO_NEAREST] --> [1,1] --> OK [0.9999974,TO_NEAREST] --> [1,1] --> OK [0.99999744,TO_NEAREST] --> [1,1] --> OK [0.9999975,TO_NEAREST] --> [1,1] --> OK [0.99999756,TO_NEAREST] --> [1,1] --> OK [0.9999976,TO_NEAREST] --> [1,1] --> OK [0.9999977,TO_NEAREST] --> [1,1] --> OK [0.99999774,TO_NEAREST] --> [1,1] --> OK [0.9999978,TO_NEAREST] --> [1,1] --> OK [0.99999785,TO_NEAREST] --> [1,1] --> OK [0.9999979,TO_NEAREST] --> [1,1] --> OK [0.999998,TO_NEAREST] --> [1,1] --> OK [0.99999803,TO_NEAREST] --> [1,1] --> OK [0.9999981,TO_NEAREST] --> [1,1] --> OK [0.99999815,TO_NEAREST] --> [1,1] --> OK [0.9999982,TO_NEAREST] --> [1,1] --> OK [0.9999983,TO_NEAREST] --> [1,1] --> OK [0.99999833,TO_NEAREST] --> [1,1] --> OK [0.9999984,TO_NEAREST] --> [1,1] --> OK [0.99999845,TO_NEAREST] --> [1,1] --> OK [0.9999985,TO_NEAREST] --> [1,1] --> OK [0.99999857,TO_NEAREST] --> [1,1] --> OK [0.9999986,TO_NEAREST] --> [1,1] --> OK [0.9999987,TO_NEAREST] --> [1,1] --> OK [0.99999875,TO_NEAREST] --> [1,1] --> OK [0.9999988,TO_NEAREST] --> [1,1] --> OK [0.99999887,TO_NEAREST] --> [1,1] --> OK [0.9999989,TO_NEAREST] --> [1,1] --> OK [0.999999,TO_NEAREST] --> [1,1] --> OK [0.99999905,TO_NEAREST] --> [1,1] --> OK [0.9999991,TO_NEAREST] --> [1,1] --> OK [0.99999917,TO_NEAREST] --> [1,1] --> OK [0.9999992,TO_NEAREST] --> [1,1] --> OK [0.9999993,TO_NEAREST] --> [1,1] --> OK [0.99999934,TO_NEAREST] --> [1,1] --> OK [0.9999994,TO_NEAREST] --> [1,1] --> OK [0.99999946,TO_NEAREST] --> [1,1] --> OK [0.9999995,TO_NEAREST] --> [1,1] --> OK [0.9999996,TO_NEAREST] --> [1,1] --> OK [0.99999964,TO_NEAREST] --> [1,1] --> OK [0.9999997,TO_NEAREST] --> [1,1] --> OK [0.99999976,TO_NEAREST] --> [1,1] --> OK [0.9999998,TO_NEAREST] --> [1,1] --> OK [0.9999999,TO_NEAREST] --> [1,1] --> OK [0.99999994,TO_NEAREST] --> [1,1] --> OK [0.1E1,TO_NEAREST] --> [1,1] --> OK [0.10000076E1,TO_NEAREST] --> [1,1] --> OK [0.10000075E1,TO_NEAREST] --> [1,1] --> OK [0.10000074E1,TO_NEAREST] --> [1,1] --> OK [0.10000073E1,TO_NEAREST] --> [1,1] --> OK [0.10000072E1,TO_NEAREST] --> [1,1] --> OK [0.1000007E1,TO_NEAREST] --> [1,1] --> OK [0.10000069E1,TO_NEAREST] --> [1,1] --> OK [0.10000068E1,TO_NEAREST] --> [1,1] --> OK [0.10000067E1,TO_NEAREST] --> [1,1] --> OK [0.10000066E1,TO_NEAREST] --> [1,1] --> OK [0.10000064E1,TO_NEAREST] --> [1,1] --> OK [0.10000063E1,TO_NEAREST] --> [1,1] --> OK [0.10000062E1,TO_NEAREST] --> [1,1] --> OK [0.10000061E1,TO_NEAREST] --> [1,1] --> OK [0.1000006E1,TO_NEAREST] --> [1,1] --> OK [0.10000058E1,TO_NEAREST] --> [1,1] --> OK [0.10000057E1,TO_NEAREST] --> [1,1] --> OK [0.10000056E1,TO_NEAREST] --> [1,1] --> OK [0.10000055E1,TO_NEAREST] --> [1,1] --> OK [0.10000054E1,TO_NEAREST] --> [1,1] --> OK [0.10000052E1,TO_NEAREST] --> [1,1] --> OK [0.10000051E1,TO_NEAREST] --> [1,1] --> OK [0.1000005E1,TO_NEAREST] --> [1,1] --> OK [0.10000049E1,TO_NEAREST] --> [1,1] --> OK [0.10000048E1,TO_NEAREST] --> [1,1] --> OK [0.10000046E1,TO_NEAREST] --> [1,1] --> OK [0.10000045E1,TO_NEAREST] --> [1,1] --> OK [0.10000044E1,TO_NEAREST] --> [1,1] --> OK [0.10000043E1,TO_NEAREST] --> [1,1] --> OK [0.10000042E1,TO_NEAREST] --> [1,1] --> OK [0.1000004E1,TO_NEAREST] --> [1,1] --> OK [0.10000039E1,TO_NEAREST] --> [1,1] --> OK [0.10000038E1,TO_NEAREST] --> [1,1] --> OK [0.10000037E1,TO_NEAREST] --> [1,1] --> OK [0.10000036E1,TO_NEAREST] --> [1,1] --> OK [0.10000035E1,TO_NEAREST] --> [1,1] --> OK [0.10000033E1,TO_NEAREST] --> [1,1] --> OK [0.10000032E1,TO_NEAREST] --> [1,1] --> OK [0.10000031E1,TO_NEAREST] --> [1,1] --> OK [0.1000003E1,TO_NEAREST] --> [1,1] --> OK [0.10000029E1,TO_NEAREST] --> [1,1] --> OK [0.10000027E1,TO_NEAREST] --> [1,1] --> OK [0.10000026E1,TO_NEAREST] --> [1,1] --> OK [0.10000025E1,TO_NEAREST] --> [1,1] --> OK [0.10000024E1,TO_NEAREST] --> [1,1] --> OK [0.10000023E1,TO_NEAREST] --> [1,1] --> OK [0.10000021E1,TO_NEAREST] --> [1,1] --> OK [0.1000002E1,TO_NEAREST] --> [1,1] --> OK [0.10000019E1,TO_NEAREST] --> [1,1] --> OK [0.10000018E1,TO_NEAREST] --> [1,1] --> OK [0.10000017E1,TO_NEAREST] --> [1,1] --> OK [0.10000015E1,TO_NEAREST] --> [1,1] --> OK [0.10000014E1,TO_NEAREST] --> [1,1] --> OK [0.10000013E1,TO_NEAREST] --> [1,1] --> OK [0.10000012E1,TO_NEAREST] --> [1,1] --> OK [0.10000011E1,TO_NEAREST] --> [1,1] --> OK [0.1000001E1,TO_NEAREST] --> [1,1] --> OK [0.10000008E1,TO_NEAREST] --> [1,1] --> OK [0.10000007E1,TO_NEAREST] --> [1,1] --> OK [0.10000006E1,TO_NEAREST] --> [1,1] --> OK [0.10000005E1,TO_NEAREST] --> [1,1] --> OK [0.10000004E1,TO_NEAREST] --> [1,1] --> OK [0.10000002E1,TO_NEAREST] --> [1,1] --> OK [0.10000001E1,TO_NEAREST] --> [1,1] --> OK [0.19999924E1,TO_NEAREST] --> [2,2] --> OK [0.19999925E1,TO_NEAREST] --> [2,2] --> OK [0.19999926E1,TO_NEAREST] --> [2,2] --> OK [0.19999927E1,TO_NEAREST] --> [2,2] --> OK [0.19999928E1,TO_NEAREST] --> [2,2] --> OK [0.1999993E1,TO_NEAREST] --> [2,2] --> OK [0.19999931E1,TO_NEAREST] --> [2,2] --> OK [0.19999932E1,TO_NEAREST] --> [2,2] --> OK [0.19999933E1,TO_NEAREST] --> [2,2] --> OK [0.19999934E1,TO_NEAREST] --> [2,2] --> OK [0.19999936E1,TO_NEAREST] --> [2,2] --> OK [0.19999937E1,TO_NEAREST] --> [2,2] --> OK [0.19999938E1,TO_NEAREST] --> [2,2] --> OK [0.19999939E1,TO_NEAREST] --> [2,2] --> OK [0.1999994E1,TO_NEAREST] --> [2,2] --> OK [0.19999942E1,TO_NEAREST] --> [2,2] --> OK [0.19999943E1,TO_NEAREST] --> [2,2] --> OK [0.19999944E1,TO_NEAREST] --> [2,2] --> OK [0.19999945E1,TO_NEAREST] --> [2,2] --> OK [0.19999946E1,TO_NEAREST] --> [2,2] --> OK [0.19999948E1,TO_NEAREST] --> [2,2] --> OK [0.19999949E1,TO_NEAREST] --> [2,2] --> OK [0.1999995E1,TO_NEAREST] --> [2,2] --> OK [0.19999951E1,TO_NEAREST] --> [2,2] --> OK [0.19999952E1,TO_NEAREST] --> [2,2] --> OK [0.19999954E1,TO_NEAREST] --> [2,2] --> OK [0.19999955E1,TO_NEAREST] --> [2,2] --> OK [0.19999956E1,TO_NEAREST] --> [2,2] --> OK [0.19999957E1,TO_NEAREST] --> [2,2] --> OK [0.19999958E1,TO_NEAREST] --> [2,2] --> OK [0.1999996E1,TO_NEAREST] --> [2,2] --> OK [0.19999961E1,TO_NEAREST] --> [2,2] --> OK [0.19999962E1,TO_NEAREST] --> [2,2] --> OK [0.19999963E1,TO_NEAREST] --> [2,2] --> OK [0.19999964E1,TO_NEAREST] --> [2,2] --> OK [0.19999965E1,TO_NEAREST] --> [2,2] --> OK [0.19999967E1,TO_NEAREST] --> [2,2] --> OK [0.19999968E1,TO_NEAREST] --> [2,2] --> OK [0.19999969E1,TO_NEAREST] --> [2,2] --> OK [0.1999997E1,TO_NEAREST] --> [2,2] --> OK [0.19999971E1,TO_NEAREST] --> [2,2] --> OK [0.19999973E1,TO_NEAREST] --> [2,2] --> OK [0.19999974E1,TO_NEAREST] --> [2,2] --> OK [0.19999975E1,TO_NEAREST] --> [2,2] --> OK [0.19999976E1,TO_NEAREST] --> [2,2] --> OK [0.19999977E1,TO_NEAREST] --> [2,2] --> OK [0.19999979E1,TO_NEAREST] --> [2,2] --> OK [0.1999998E1,TO_NEAREST] --> [2,2] --> OK [0.19999981E1,TO_NEAREST] --> [2,2] --> OK [0.19999982E1,TO_NEAREST] --> [2,2] --> OK [0.19999983E1,TO_NEAREST] --> [2,2] --> OK [0.19999985E1,TO_NEAREST] --> [2,2] --> OK [0.19999986E1,TO_NEAREST] --> [2,2] --> OK [0.19999987E1,TO_NEAREST] --> [2,2] --> OK [0.19999988E1,TO_NEAREST] --> [2,2] --> OK [0.19999989E1,TO_NEAREST] --> [2,2] --> OK [0.1999999E1,TO_NEAREST] --> [2,2] --> OK [0.19999992E1,TO_NEAREST] --> [2,2] --> OK [0.19999993E1,TO_NEAREST] --> [2,2] --> OK [0.19999994E1,TO_NEAREST] --> [2,2] --> OK [0.19999995E1,TO_NEAREST] --> [2,2] --> OK [0.19999996E1,TO_NEAREST] --> [2,2] --> OK [0.19999998E1,TO_NEAREST] --> [2,2] --> OK [0.19999999E1,TO_NEAREST] --> [2,2] --> OK [0.2E1,TO_NEAREST] --> [2,2] --> OK [0.20000153E1,TO_NEAREST] --> [2,2] --> OK [0.2000015E1,TO_NEAREST] --> [2,2] --> OK [0.20000148E1,TO_NEAREST] --> [2,2] --> OK [0.20000145E1,TO_NEAREST] --> [2,2] --> OK [0.20000143E1,TO_NEAREST] --> [2,2] --> OK [0.2000014E1,TO_NEAREST] --> [2,2] --> OK [0.20000138E1,TO_NEAREST] --> [2,2] --> OK [0.20000136E1,TO_NEAREST] --> [2,2] --> OK [0.20000134E1,TO_NEAREST] --> [2,2] --> OK [0.2000013E1,TO_NEAREST] --> [2,2] --> OK [0.20000129E1,TO_NEAREST] --> [2,2] --> OK [0.20000126E1,TO_NEAREST] --> [2,2] --> OK [0.20000124E1,TO_NEAREST] --> [2,2] --> OK [0.20000122E1,TO_NEAREST] --> [2,2] --> OK [0.2000012E1,TO_NEAREST] --> [2,2] --> OK [0.20000117E1,TO_NEAREST] --> [2,2] --> OK [0.20000114E1,TO_NEAREST] --> [2,2] --> OK [0.20000112E1,TO_NEAREST] --> [2,2] --> OK [0.2000011E1,TO_NEAREST] --> [2,2] --> OK [0.20000107E1,TO_NEAREST] --> [2,2] --> OK [0.20000105E1,TO_NEAREST] --> [2,2] --> OK [0.20000103E1,TO_NEAREST] --> [2,2] --> OK [0.200001E1,TO_NEAREST] --> [2,2] --> OK [0.20000098E1,TO_NEAREST] --> [2,2] --> OK [0.20000095E1,TO_NEAREST] --> [2,2] --> OK [0.20000093E1,TO_NEAREST] --> [2,2] --> OK [0.2000009E1,TO_NEAREST] --> [2,2] --> OK [0.20000088E1,TO_NEAREST] --> [2,2] --> OK [0.20000086E1,TO_NEAREST] --> [2,2] --> OK [0.20000083E1,TO_NEAREST] --> [2,2] --> OK [0.2000008E1,TO_NEAREST] --> [2,2] --> OK [0.20000079E1,TO_NEAREST] --> [2,2] --> OK [0.20000076E1,TO_NEAREST] --> [2,2] --> OK [0.20000074E1,TO_NEAREST] --> [2,2] --> OK [0.20000072E1,TO_NEAREST] --> [2,2] --> OK [0.2000007E1,TO_NEAREST] --> [2,2] --> OK [0.20000067E1,TO_NEAREST] --> [2,2] --> OK [0.20000064E1,TO_NEAREST] --> [2,2] --> OK [0.20000062E1,TO_NEAREST] --> [2,2] --> OK [0.2000006E1,TO_NEAREST] --> [2,2] --> OK [0.20000057E1,TO_NEAREST] --> [2,2] --> OK [0.20000055E1,TO_NEAREST] --> [2,2] --> OK [0.20000052E1,TO_NEAREST] --> [2,2] --> OK [0.2000005E1,TO_NEAREST] --> [2,2] --> OK [0.20000048E1,TO_NEAREST] --> [2,2] --> OK [0.20000045E1,TO_NEAREST] --> [2,2] --> OK [0.20000043E1,TO_NEAREST] --> [2,2] --> OK [0.2000004E1,TO_NEAREST] --> [2,2] --> OK [0.20000038E1,TO_NEAREST] --> [2,2] --> OK [0.20000036E1,TO_NEAREST] --> [2,2] --> OK [0.20000033E1,TO_NEAREST] --> [2,2] --> OK [0.2000003E1,TO_NEAREST] --> [2,2] --> OK [0.20000029E1,TO_NEAREST] --> [2,2] --> OK [0.20000026E1,TO_NEAREST] --> [2,2] --> OK [0.20000024E1,TO_NEAREST] --> [2,2] --> OK [0.20000021E1,TO_NEAREST] --> [2,2] --> OK [0.2000002E1,TO_NEAREST] --> [2,2] --> OK [0.20000017E1,TO_NEAREST] --> [2,2] --> OK [0.20000014E1,TO_NEAREST] --> [2,2] --> OK [0.20000012E1,TO_NEAREST] --> [2,2] --> OK [0.2000001E1,TO_NEAREST] --> [2,2] --> OK [0.20000007E1,TO_NEAREST] --> [2,2] --> OK [0.20000005E1,TO_NEAREST] --> [2,2] --> OK [0.20000002E1,TO_NEAREST] --> [2,2] --> OK [0.29999847E1,TO_NEAREST] --> [3,3] --> OK [0.2999985E1,TO_NEAREST] --> [3,3] --> OK [0.29999852E1,TO_NEAREST] --> [3,3] --> OK [0.29999855E1,TO_NEAREST] --> [3,3] --> OK [0.29999857E1,TO_NEAREST] --> [3,3] --> OK [0.2999986E1,TO_NEAREST] --> [3,3] --> OK [0.29999862E1,TO_NEAREST] --> [3,3] --> OK [0.29999864E1,TO_NEAREST] --> [3,3] --> OK [0.29999866E1,TO_NEAREST] --> [3,3] --> OK [0.2999987E1,TO_NEAREST] --> [3,3] --> OK [0.29999871E1,TO_NEAREST] --> [3,3] --> OK [0.29999874E1,TO_NEAREST] --> [3,3] --> OK [0.29999876E1,TO_NEAREST] --> [3,3] --> OK [0.29999878E1,TO_NEAREST] --> [3,3] --> OK [0.2999988E1,TO_NEAREST] --> [3,3] --> OK [0.29999883E1,TO_NEAREST] --> [3,3] --> OK [0.29999886E1,TO_NEAREST] --> [3,3] --> OK [0.29999888E1,TO_NEAREST] --> [3,3] --> OK [0.2999989E1,TO_NEAREST] --> [3,3] --> OK [0.29999893E1,TO_NEAREST] --> [3,3] --> OK [0.29999895E1,TO_NEAREST] --> [3,3] --> OK [0.29999897E1,TO_NEAREST] --> [3,3] --> OK [0.299999E1,TO_NEAREST] --> [3,3] --> OK [0.29999902E1,TO_NEAREST] --> [3,3] --> OK [0.29999905E1,TO_NEAREST] --> [3,3] --> OK [0.29999907E1,TO_NEAREST] --> [3,3] --> OK [0.2999991E1,TO_NEAREST] --> [3,3] --> OK [0.29999912E1,TO_NEAREST] --> [3,3] --> OK [0.29999914E1,TO_NEAREST] --> [3,3] --> OK [0.29999917E1,TO_NEAREST] --> [3,3] --> OK [0.2999992E1,TO_NEAREST] --> [3,3] --> OK [0.29999921E1,TO_NEAREST] --> [3,3] --> OK [0.29999924E1,TO_NEAREST] --> [3,3] --> OK [0.29999926E1,TO_NEAREST] --> [3,3] --> OK [0.29999928E1,TO_NEAREST] --> [3,3] --> OK [0.2999993E1,TO_NEAREST] --> [3,3] --> OK [0.29999933E1,TO_NEAREST] --> [3,3] --> OK [0.29999936E1,TO_NEAREST] --> [3,3] --> OK [0.29999938E1,TO_NEAREST] --> [3,3] --> OK [0.2999994E1,TO_NEAREST] --> [3,3] --> OK [0.29999943E1,TO_NEAREST] --> [3,3] --> OK [0.29999945E1,TO_NEAREST] --> [3,3] --> OK [0.29999948E1,TO_NEAREST] --> [3,3] --> OK [0.2999995E1,TO_NEAREST] --> [3,3] --> OK [0.29999952E1,TO_NEAREST] --> [3,3] --> OK [0.29999955E1,TO_NEAREST] --> [3,3] --> OK [0.29999957E1,TO_NEAREST] --> [3,3] --> OK [0.2999996E1,TO_NEAREST] --> [3,3] --> OK [0.29999962E1,TO_NEAREST] --> [3,3] --> OK [0.29999964E1,TO_NEAREST] --> [3,3] --> OK [0.29999967E1,TO_NEAREST] --> [3,3] --> OK [0.2999997E1,TO_NEAREST] --> [3,3] --> OK [0.29999971E1,TO_NEAREST] --> [3,3] --> OK [0.29999974E1,TO_NEAREST] --> [3,3] --> OK [0.29999976E1,TO_NEAREST] --> [3,3] --> OK [0.29999979E1,TO_NEAREST] --> [3,3] --> OK [0.2999998E1,TO_NEAREST] --> [3,3] --> OK [0.29999983E1,TO_NEAREST] --> [3,3] --> OK [0.29999986E1,TO_NEAREST] --> [3,3] --> OK [0.29999988E1,TO_NEAREST] --> [3,3] --> OK [0.2999999E1,TO_NEAREST] --> [3,3] --> OK [0.29999993E1,TO_NEAREST] --> [3,3] --> OK [0.29999995E1,TO_NEAREST] --> [3,3] --> OK [0.29999998E1,TO_NEAREST] --> [3,3] --> OK [0.3E1,TO_NEAREST] --> [3,3] --> OK [0.30000153E1,TO_NEAREST] --> [3,3] --> OK [0.3000015E1,TO_NEAREST] --> [3,3] --> OK [0.30000148E1,TO_NEAREST] --> [3,3] --> OK [0.30000145E1,TO_NEAREST] --> [3,3] --> OK [0.30000143E1,TO_NEAREST] --> [3,3] --> OK [0.3000014E1,TO_NEAREST] --> [3,3] --> OK [0.30000138E1,TO_NEAREST] --> [3,3] --> OK [0.30000136E1,TO_NEAREST] --> [3,3] --> OK [0.30000134E1,TO_NEAREST] --> [3,3] --> OK [0.3000013E1,TO_NEAREST] --> [3,3] --> OK [0.30000129E1,TO_NEAREST] --> [3,3] --> OK [0.30000126E1,TO_NEAREST] --> [3,3] --> OK [0.30000124E1,TO_NEAREST] --> [3,3] --> OK [0.30000122E1,TO_NEAREST] --> [3,3] --> OK [0.3000012E1,TO_NEAREST] --> [3,3] --> OK [0.30000117E1,TO_NEAREST] --> [3,3] --> OK [0.30000114E1,TO_NEAREST] --> [3,3] --> OK [0.30000112E1,TO_NEAREST] --> [3,3] --> OK [0.3000011E1,TO_NEAREST] --> [3,3] --> OK [0.30000107E1,TO_NEAREST] --> [3,3] --> OK [0.30000105E1,TO_NEAREST] --> [3,3] --> OK [0.30000103E1,TO_NEAREST] --> [3,3] --> OK [0.300001E1,TO_NEAREST] --> [3,3] --> OK [0.30000098E1,TO_NEAREST] --> [3,3] --> OK [0.30000095E1,TO_NEAREST] --> [3,3] --> OK [0.30000093E1,TO_NEAREST] --> [3,3] --> OK [0.3000009E1,TO_NEAREST] --> [3,3] --> OK [0.30000088E1,TO_NEAREST] --> [3,3] --> OK [0.30000086E1,TO_NEAREST] --> [3,3] --> OK [0.30000083E1,TO_NEAREST] --> [3,3] --> OK [0.3000008E1,TO_NEAREST] --> [3,3] --> OK [0.30000079E1,TO_NEAREST] --> [3,3] --> OK [0.30000076E1,TO_NEAREST] --> [3,3] --> OK [0.30000074E1,TO_NEAREST] --> [3,3] --> OK [0.30000072E1,TO_NEAREST] --> [3,3] --> OK [0.3000007E1,TO_NEAREST] --> [3,3] --> OK [0.30000067E1,TO_NEAREST] --> [3,3] --> OK [0.30000064E1,TO_NEAREST] --> [3,3] --> OK [0.30000062E1,TO_NEAREST] --> [3,3] --> OK [0.3000006E1,TO_NEAREST] --> [3,3] --> OK [0.30000057E1,TO_NEAREST] --> [3,3] --> OK [0.30000055E1,TO_NEAREST] --> [3,3] --> OK [0.30000052E1,TO_NEAREST] --> [3,3] --> OK [0.3000005E1,TO_NEAREST] --> [3,3] --> OK [0.30000048E1,TO_NEAREST] --> [3,3] --> OK [0.30000045E1,TO_NEAREST] --> [3,3] --> OK [0.30000043E1,TO_NEAREST] --> [3,3] --> OK [0.3000004E1,TO_NEAREST] --> [3,3] --> OK [0.30000038E1,TO_NEAREST] --> [3,3] --> OK [0.30000036E1,TO_NEAREST] --> [3,3] --> OK [0.30000033E1,TO_NEAREST] --> [3,3] --> OK [0.3000003E1,TO_NEAREST] --> [3,3] --> OK [0.30000029E1,TO_NEAREST] --> [3,3] --> OK [0.30000026E1,TO_NEAREST] --> [3,3] --> OK [0.30000024E1,TO_NEAREST] --> [3,3] --> OK [0.30000021E1,TO_NEAREST] --> [3,3] --> OK [0.3000002E1,TO_NEAREST] --> [3,3] --> OK [0.30000017E1,TO_NEAREST] --> [3,3] --> OK [0.30000014E1,TO_NEAREST] --> [3,3] --> OK [0.30000012E1,TO_NEAREST] --> [3,3] --> OK [0.3000001E1,TO_NEAREST] --> [3,3] --> OK [0.30000007E1,TO_NEAREST] --> [3,3] --> OK [0.30000005E1,TO_NEAREST] --> [3,3] --> OK [0.30000002E1,TO_NEAREST] --> [3,3] --> OK [0.1073737728E10,TO_NEAREST] --> [1073737728,1073737728] --> OK [0.1073737792E10,TO_NEAREST] --> [1073737792,1073737792] --> OK [0.1073737856E10,TO_NEAREST] --> [1073737856,1073737856] --> OK [0.107373792E10,TO_NEAREST] --> [1073737920,1073737920] --> OK [0.1073737984E10,TO_NEAREST] --> [1073737984,1073737984] --> OK [0.1073738048E10,TO_NEAREST] --> [1073738048,1073738048] --> OK [0.1073738112E10,TO_NEAREST] --> [1073738112,1073738112] --> OK [0.1073738176E10,TO_NEAREST] --> [1073738176,1073738176] --> OK [0.107373824E10,TO_NEAREST] --> [1073738240,1073738240] --> OK [0.1073738304E10,TO_NEAREST] --> [1073738304,1073738304] --> OK [0.1073738368E10,TO_NEAREST] --> [1073738368,1073738368] --> OK [0.1073738432E10,TO_NEAREST] --> [1073738432,1073738432] --> OK [0.1073738496E10,TO_NEAREST] --> [1073738496,1073738496] --> OK [0.107373856E10,TO_NEAREST] --> [1073738560,1073738560] --> OK [0.1073738624E10,TO_NEAREST] --> [1073738624,1073738624] --> OK [0.1073738688E10,TO_NEAREST] --> [1073738688,1073738688] --> OK [0.1073738752E10,TO_NEAREST] --> [1073738752,1073738752] --> OK [0.1073738816E10,TO_NEAREST] --> [1073738816,1073738816] --> OK [0.107373888E10,TO_NEAREST] --> [1073738880,1073738880] --> OK [0.1073738944E10,TO_NEAREST] --> [1073738944,1073738944] --> OK [0.1073739008E10,TO_NEAREST] --> [1073739008,1073739008] --> OK [0.1073739072E10,TO_NEAREST] --> [1073739072,1073739072] --> OK [0.1073739136E10,TO_NEAREST] --> [1073739136,1073739136] --> OK [0.10737392E10,TO_NEAREST] --> [1073739200,1073739200] --> OK [0.1073739264E10,TO_NEAREST] --> [1073739264,1073739264] --> OK [0.1073739328E10,TO_NEAREST] --> [1073739328,1073739328] --> OK [0.1073739392E10,TO_NEAREST] --> [1073739392,1073739392] --> OK [0.1073739456E10,TO_NEAREST] --> [1073739456,1073739456] --> OK [0.107373952E10,TO_NEAREST] --> [1073739520,1073739520] --> OK [0.1073739584E10,TO_NEAREST] --> [1073739584,1073739584] --> OK [0.1073739648E10,TO_NEAREST] --> [1073739648,1073739648] --> OK [0.1073739712E10,TO_NEAREST] --> [1073739712,1073739712] --> OK [0.1073739776E10,TO_NEAREST] --> [1073739776,1073739776] --> OK [0.107373984E10,TO_NEAREST] --> [1073739840,1073739840] --> OK [0.1073739904E10,TO_NEAREST] --> [1073739904,1073739904] --> OK [0.1073739968E10,TO_NEAREST] --> [1073739968,1073739968] --> OK [0.1073740032E10,TO_NEAREST] --> [1073740032,1073740032] --> OK [0.1073740096E10,TO_NEAREST] --> [1073740096,1073740096] --> OK [0.107374016E10,TO_NEAREST] --> [1073740160,1073740160] --> OK [0.1073740224E10,TO_NEAREST] --> [1073740224,1073740224] --> OK [0.1073740288E10,TO_NEAREST] --> [1073740288,1073740288] --> OK [0.1073740352E10,TO_NEAREST] --> [1073740352,1073740352] --> OK [0.1073740416E10,TO_NEAREST] --> [1073740416,1073740416] --> OK [0.107374048E10,TO_NEAREST] --> [1073740480,1073740480] --> OK [0.1073740544E10,TO_NEAREST] --> [1073740544,1073740544] --> OK [0.1073740608E10,TO_NEAREST] --> [1073740608,1073740608] --> OK [0.1073740672E10,TO_NEAREST] --> [1073740672,1073740672] --> OK [0.1073740736E10,TO_NEAREST] --> [1073740736,1073740736] --> OK [0.10737408E10,TO_NEAREST] --> [1073740800,1073740800] --> OK [0.1073740864E10,TO_NEAREST] --> [1073740864,1073740864] --> OK [0.1073740928E10,TO_NEAREST] --> [1073740928,1073740928] --> OK [0.1073740992E10,TO_NEAREST] --> [1073740992,1073740992] --> OK [0.1073741056E10,TO_NEAREST] --> [1073741056,1073741056] --> OK [0.107374112E10,TO_NEAREST] --> [1073741120,1073741120] --> OK [0.1073741184E10,TO_NEAREST] --> [1073741184,1073741184] --> OK [0.1073741248E10,TO_NEAREST] --> [1073741248,1073741248] --> OK [0.1073741312E10,TO_NEAREST] --> [1073741312,1073741312] --> OK [0.1073741376E10,TO_NEAREST] --> [1073741376,1073741376] --> OK [0.107374144E10,TO_NEAREST] --> [1073741440,1073741440] --> OK [0.1073741504E10,TO_NEAREST] --> [1073741504,1073741504] --> OK [0.1073741568E10,TO_NEAREST] --> [1073741568,1073741568] --> OK [0.1073741632E10,TO_NEAREST] --> [1073741632,1073741632] --> OK [0.1073741696E10,TO_NEAREST] --> [1073741696,1073741696] --> OK [0.107374176E10,TO_NEAREST] --> [1073741760,1073741760] --> OK [0.1073741824E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073750016E10,TO_NEAREST] --> [1073750016,1073750016] --> OK [0.1073749888E10,TO_NEAREST] --> [1073749888,1073749888] --> OK [0.107374976E10,TO_NEAREST] --> [1073749760,1073749760] --> OK [0.1073749632E10,TO_NEAREST] --> [1073749632,1073749632] --> OK [0.1073749504E10,TO_NEAREST] --> [1073749504,1073749504] --> OK [0.1073749376E10,TO_NEAREST] --> [1073749376,1073749376] --> OK [0.1073749248E10,TO_NEAREST] --> [1073749248,1073749248] --> OK [0.107374912E10,TO_NEAREST] --> [1073749120,1073749120] --> OK [0.1073748992E10,TO_NEAREST] --> [1073748992,1073748992] --> OK [0.1073748864E10,TO_NEAREST] --> [1073748864,1073748864] --> OK [0.1073748736E10,TO_NEAREST] --> [1073748736,1073748736] --> OK [0.1073748608E10,TO_NEAREST] --> [1073748608,1073748608] --> OK [0.107374848E10,TO_NEAREST] --> [1073748480,1073748480] --> OK [0.1073748352E10,TO_NEAREST] --> [1073748352,1073748352] --> OK [0.1073748224E10,TO_NEAREST] --> [1073748224,1073748224] --> OK [0.1073748096E10,TO_NEAREST] --> [1073748096,1073748096] --> OK [0.1073747968E10,TO_NEAREST] --> [1073747968,1073747968] --> OK [0.107374784E10,TO_NEAREST] --> [1073747840,1073747840] --> OK [0.1073747712E10,TO_NEAREST] --> [1073747712,1073747712] --> OK [0.1073747584E10,TO_NEAREST] --> [1073747584,1073747584] --> OK [0.1073747456E10,TO_NEAREST] --> [1073747456,1073747456] --> OK [0.1073747328E10,TO_NEAREST] --> [1073747328,1073747328] --> OK [0.10737472E10,TO_NEAREST] --> [1073747200,1073747200] --> OK [0.1073747072E10,TO_NEAREST] --> [1073747072,1073747072] --> OK [0.1073746944E10,TO_NEAREST] --> [1073746944,1073746944] --> OK [0.1073746816E10,TO_NEAREST] --> [1073746816,1073746816] --> OK [0.1073746688E10,TO_NEAREST] --> [1073746688,1073746688] --> OK [0.107374656E10,TO_NEAREST] --> [1073746560,1073746560] --> OK [0.1073746432E10,TO_NEAREST] --> [1073746432,1073746432] --> OK [0.1073746304E10,TO_NEAREST] --> [1073746304,1073746304] --> OK [0.1073746176E10,TO_NEAREST] --> [1073746176,1073746176] --> OK [0.1073746048E10,TO_NEAREST] --> [1073746048,1073746048] --> OK [0.107374592E10,TO_NEAREST] --> [1073745920,1073745920] --> OK [0.1073745792E10,TO_NEAREST] --> [1073745792,1073745792] --> OK [0.1073745664E10,TO_NEAREST] --> [1073745664,1073745664] --> OK [0.1073745536E10,TO_NEAREST] --> [1073745536,1073745536] --> OK [0.1073745408E10,TO_NEAREST] --> [1073745408,1073745408] --> OK [0.107374528E10,TO_NEAREST] --> [1073745280,1073745280] --> OK [0.1073745152E10,TO_NEAREST] --> [1073745152,1073745152] --> OK [0.1073745024E10,TO_NEAREST] --> [1073745024,1073745024] --> OK [0.1073744896E10,TO_NEAREST] --> [1073744896,1073744896] --> OK [0.1073744768E10,TO_NEAREST] --> [1073744768,1073744768] --> OK [0.107374464E10,TO_NEAREST] --> [1073744640,1073744640] --> OK [0.1073744512E10,TO_NEAREST] --> [1073744512,1073744512] --> OK [0.1073744384E10,TO_NEAREST] --> [1073744384,1073744384] --> OK [0.1073744256E10,TO_NEAREST] --> [1073744256,1073744256] --> OK [0.1073744128E10,TO_NEAREST] --> [1073744128,1073744128] --> OK [0.1073744E10,TO_NEAREST] --> [1073744000,1073744000] --> OK [0.1073743872E10,TO_NEAREST] --> [1073743872,1073743872] --> OK [0.1073743744E10,TO_NEAREST] --> [1073743744,1073743744] --> OK [0.1073743616E10,TO_NEAREST] --> [1073743616,1073743616] --> OK [0.1073743488E10,TO_NEAREST] --> [1073743488,1073743488] --> OK [0.107374336E10,TO_NEAREST] --> [1073743360,1073743360] --> OK [0.1073743232E10,TO_NEAREST] --> [1073743232,1073743232] --> OK [0.1073743104E10,TO_NEAREST] --> [1073743104,1073743104] --> OK [0.1073742976E10,TO_NEAREST] --> [1073742976,1073742976] --> OK [0.1073742848E10,TO_NEAREST] --> [1073742848,1073742848] --> OK [0.107374272E10,TO_NEAREST] --> [1073742720,1073742720] --> OK [0.1073742592E10,TO_NEAREST] --> [1073742592,1073742592] --> OK [0.1073742464E10,TO_NEAREST] --> [1073742464,1073742464] --> OK [0.1073742336E10,TO_NEAREST] --> [1073742336,1073742336] --> OK [0.1073742208E10,TO_NEAREST] --> [1073742208,1073742208] --> OK [0.107374208E10,TO_NEAREST] --> [1073742080,1073742080] --> OK [0.1073741952E10,TO_NEAREST] --> [1073741952,1073741952] --> OK [0.1610604544E10,TO_NEAREST] --> [1610604544,1610604544] --> OK [0.1610604672E10,TO_NEAREST] --> [1610604672,1610604672] --> OK [0.16106048E10,TO_NEAREST] --> [1610604800,1610604800] --> OK [0.1610604928E10,TO_NEAREST] --> [1610604928,1610604928] --> OK [0.1610605056E10,TO_NEAREST] --> [1610605056,1610605056] --> OK [0.1610605184E10,TO_NEAREST] --> [1610605184,1610605184] --> OK [0.1610605312E10,TO_NEAREST] --> [1610605312,1610605312] --> OK [0.161060544E10,TO_NEAREST] --> [1610605440,1610605440] --> OK [0.1610605568E10,TO_NEAREST] --> [1610605568,1610605568] --> OK [0.1610605696E10,TO_NEAREST] --> [1610605696,1610605696] --> OK [0.1610605824E10,TO_NEAREST] --> [1610605824,1610605824] --> OK [0.1610605952E10,TO_NEAREST] --> [1610605952,1610605952] --> OK [0.161060608E10,TO_NEAREST] --> [1610606080,1610606080] --> OK [0.1610606208E10,TO_NEAREST] --> [1610606208,1610606208] --> OK [0.1610606336E10,TO_NEAREST] --> [1610606336,1610606336] --> OK [0.1610606464E10,TO_NEAREST] --> [1610606464,1610606464] --> OK [0.1610606592E10,TO_NEAREST] --> [1610606592,1610606592] --> OK [0.161060672E10,TO_NEAREST] --> [1610606720,1610606720] --> OK [0.1610606848E10,TO_NEAREST] --> [1610606848,1610606848] --> OK [0.1610606976E10,TO_NEAREST] --> [1610606976,1610606976] --> OK [0.1610607104E10,TO_NEAREST] --> [1610607104,1610607104] --> OK [0.1610607232E10,TO_NEAREST] --> [1610607232,1610607232] --> OK [0.161060736E10,TO_NEAREST] --> [1610607360,1610607360] --> OK [0.1610607488E10,TO_NEAREST] --> [1610607488,1610607488] --> OK [0.1610607616E10,TO_NEAREST] --> [1610607616,1610607616] --> OK [0.1610607744E10,TO_NEAREST] --> [1610607744,1610607744] --> OK [0.1610607872E10,TO_NEAREST] --> [1610607872,1610607872] --> OK [0.1610608E10,TO_NEAREST] --> [1610608000,1610608000] --> OK [0.1610608128E10,TO_NEAREST] --> [1610608128,1610608128] --> OK [0.1610608256E10,TO_NEAREST] --> [1610608256,1610608256] --> OK [0.1610608384E10,TO_NEAREST] --> [1610608384,1610608384] --> OK [0.1610608512E10,TO_NEAREST] --> [1610608512,1610608512] --> OK [0.161060864E10,TO_NEAREST] --> [1610608640,1610608640] --> OK [0.1610608768E10,TO_NEAREST] --> [1610608768,1610608768] --> OK [0.1610608896E10,TO_NEAREST] --> [1610608896,1610608896] --> OK [0.1610609024E10,TO_NEAREST] --> [1610609024,1610609024] --> OK [0.1610609152E10,TO_NEAREST] --> [1610609152,1610609152] --> OK [0.161060928E10,TO_NEAREST] --> [1610609280,1610609280] --> OK [0.1610609408E10,TO_NEAREST] --> [1610609408,1610609408] --> OK [0.1610609536E10,TO_NEAREST] --> [1610609536,1610609536] --> OK [0.1610609664E10,TO_NEAREST] --> [1610609664,1610609664] --> OK [0.1610609792E10,TO_NEAREST] --> [1610609792,1610609792] --> OK [0.161060992E10,TO_NEAREST] --> [1610609920,1610609920] --> OK [0.1610610048E10,TO_NEAREST] --> [1610610048,1610610048] --> OK [0.1610610176E10,TO_NEAREST] --> [1610610176,1610610176] --> OK [0.1610610304E10,TO_NEAREST] --> [1610610304,1610610304] --> OK [0.1610610432E10,TO_NEAREST] --> [1610610432,1610610432] --> OK [0.161061056E10,TO_NEAREST] --> [1610610560,1610610560] --> OK [0.1610610688E10,TO_NEAREST] --> [1610610688,1610610688] --> OK [0.1610610816E10,TO_NEAREST] --> [1610610816,1610610816] --> OK [0.1610610944E10,TO_NEAREST] --> [1610610944,1610610944] --> OK [0.1610611072E10,TO_NEAREST] --> [1610611072,1610611072] --> OK [0.16106112E10,TO_NEAREST] --> [1610611200,1610611200] --> OK [0.1610611328E10,TO_NEAREST] --> [1610611328,1610611328] --> OK [0.1610611456E10,TO_NEAREST] --> [1610611456,1610611456] --> OK [0.1610611584E10,TO_NEAREST] --> [1610611584,1610611584] --> OK [0.1610611712E10,TO_NEAREST] --> [1610611712,1610611712] --> OK [0.161061184E10,TO_NEAREST] --> [1610611840,1610611840] --> OK [0.1610611968E10,TO_NEAREST] --> [1610611968,1610611968] --> OK [0.1610612096E10,TO_NEAREST] --> [1610612096,1610612096] --> OK [0.1610612224E10,TO_NEAREST] --> [1610612224,1610612224] --> OK [0.1610612352E10,TO_NEAREST] --> [1610612352,1610612352] --> OK [0.161061248E10,TO_NEAREST] --> [1610612480,1610612480] --> OK [0.1610612608E10,TO_NEAREST] --> [1610612608,1610612608] --> OK [0.1610612736E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610620928E10,TO_NEAREST] --> [1610620928,1610620928] --> OK [0.16106208E10,TO_NEAREST] --> [1610620800,1610620800] --> OK [0.1610620672E10,TO_NEAREST] --> [1610620672,1610620672] --> OK [0.1610620544E10,TO_NEAREST] --> [1610620544,1610620544] --> OK [0.1610620416E10,TO_NEAREST] --> [1610620416,1610620416] --> OK [0.1610620288E10,TO_NEAREST] --> [1610620288,1610620288] --> OK [0.161062016E10,TO_NEAREST] --> [1610620160,1610620160] --> OK [0.1610620032E10,TO_NEAREST] --> [1610620032,1610620032] --> OK [0.1610619904E10,TO_NEAREST] --> [1610619904,1610619904] --> OK [0.1610619776E10,TO_NEAREST] --> [1610619776,1610619776] --> OK [0.1610619648E10,TO_NEAREST] --> [1610619648,1610619648] --> OK [0.161061952E10,TO_NEAREST] --> [1610619520,1610619520] --> OK [0.1610619392E10,TO_NEAREST] --> [1610619392,1610619392] --> OK [0.1610619264E10,TO_NEAREST] --> [1610619264,1610619264] --> OK [0.1610619136E10,TO_NEAREST] --> [1610619136,1610619136] --> OK [0.1610619008E10,TO_NEAREST] --> [1610619008,1610619008] --> OK [0.161061888E10,TO_NEAREST] --> [1610618880,1610618880] --> OK [0.1610618752E10,TO_NEAREST] --> [1610618752,1610618752] --> OK [0.1610618624E10,TO_NEAREST] --> [1610618624,1610618624] --> OK [0.1610618496E10,TO_NEAREST] --> [1610618496,1610618496] --> OK [0.1610618368E10,TO_NEAREST] --> [1610618368,1610618368] --> OK [0.161061824E10,TO_NEAREST] --> [1610618240,1610618240] --> OK [0.1610618112E10,TO_NEAREST] --> [1610618112,1610618112] --> OK [0.1610617984E10,TO_NEAREST] --> [1610617984,1610617984] --> OK [0.1610617856E10,TO_NEAREST] --> [1610617856,1610617856] --> OK [0.1610617728E10,TO_NEAREST] --> [1610617728,1610617728] --> OK [0.16106176E10,TO_NEAREST] --> [1610617600,1610617600] --> OK [0.1610617472E10,TO_NEAREST] --> [1610617472,1610617472] --> OK [0.1610617344E10,TO_NEAREST] --> [1610617344,1610617344] --> OK [0.1610617216E10,TO_NEAREST] --> [1610617216,1610617216] --> OK [0.1610617088E10,TO_NEAREST] --> [1610617088,1610617088] --> OK [0.161061696E10,TO_NEAREST] --> [1610616960,1610616960] --> OK [0.1610616832E10,TO_NEAREST] --> [1610616832,1610616832] --> OK [0.1610616704E10,TO_NEAREST] --> [1610616704,1610616704] --> OK [0.1610616576E10,TO_NEAREST] --> [1610616576,1610616576] --> OK [0.1610616448E10,TO_NEAREST] --> [1610616448,1610616448] --> OK [0.161061632E10,TO_NEAREST] --> [1610616320,1610616320] --> OK [0.1610616192E10,TO_NEAREST] --> [1610616192,1610616192] --> OK [0.1610616064E10,TO_NEAREST] --> [1610616064,1610616064] --> OK [0.1610615936E10,TO_NEAREST] --> [1610615936,1610615936] --> OK [0.1610615808E10,TO_NEAREST] --> [1610615808,1610615808] --> OK [0.161061568E10,TO_NEAREST] --> [1610615680,1610615680] --> OK [0.1610615552E10,TO_NEAREST] --> [1610615552,1610615552] --> OK [0.1610615424E10,TO_NEAREST] --> [1610615424,1610615424] --> OK [0.1610615296E10,TO_NEAREST] --> [1610615296,1610615296] --> OK [0.1610615168E10,TO_NEAREST] --> [1610615168,1610615168] --> OK [0.161061504E10,TO_NEAREST] --> [1610615040,1610615040] --> OK [0.1610614912E10,TO_NEAREST] --> [1610614912,1610614912] --> OK [0.1610614784E10,TO_NEAREST] --> [1610614784,1610614784] --> OK [0.1610614656E10,TO_NEAREST] --> [1610614656,1610614656] --> OK [0.1610614528E10,TO_NEAREST] --> [1610614528,1610614528] --> OK [0.16106144E10,TO_NEAREST] --> [1610614400,1610614400] --> OK [0.1610614272E10,TO_NEAREST] --> [1610614272,1610614272] --> OK [0.1610614144E10,TO_NEAREST] --> [1610614144,1610614144] --> OK [0.1610614016E10,TO_NEAREST] --> [1610614016,1610614016] --> OK [0.1610613888E10,TO_NEAREST] --> [1610613888,1610613888] --> OK [0.161061376E10,TO_NEAREST] --> [1610613760,1610613760] --> OK [0.1610613632E10,TO_NEAREST] --> [1610613632,1610613632] --> OK [0.1610613504E10,TO_NEAREST] --> [1610613504,1610613504] --> OK [0.1610613376E10,TO_NEAREST] --> [1610613376,1610613376] --> OK [0.1610613248E10,TO_NEAREST] --> [1610613248,1610613248] --> OK [0.161061312E10,TO_NEAREST] --> [1610613120,1610613120] --> OK [0.1610612992E10,TO_NEAREST] --> [1610612992,1610612992] --> OK [0.1610612864E10,TO_NEAREST] --> [1610612864,1610612864] --> OK [0.187904E10,TO_NEAREST] --> [1879040000,1879040000] --> OK [0.1879040128E10,TO_NEAREST] --> [1879040128,1879040128] --> OK [0.1879040256E10,TO_NEAREST] --> [1879040256,1879040256] --> OK [0.1879040384E10,TO_NEAREST] --> [1879040384,1879040384] --> OK [0.1879040512E10,TO_NEAREST] --> [1879040512,1879040512] --> OK [0.187904064E10,TO_NEAREST] --> [1879040640,1879040640] --> OK [0.1879040768E10,TO_NEAREST] --> [1879040768,1879040768] --> OK [0.1879040896E10,TO_NEAREST] --> [1879040896,1879040896] --> OK [0.1879041024E10,TO_NEAREST] --> [1879041024,1879041024] --> OK [0.1879041152E10,TO_NEAREST] --> [1879041152,1879041152] --> OK [0.187904128E10,TO_NEAREST] --> [1879041280,1879041280] --> OK [0.1879041408E10,TO_NEAREST] --> [1879041408,1879041408] --> OK [0.1879041536E10,TO_NEAREST] --> [1879041536,1879041536] --> OK [0.1879041664E10,TO_NEAREST] --> [1879041664,1879041664] --> OK [0.1879041792E10,TO_NEAREST] --> [1879041792,1879041792] --> OK [0.187904192E10,TO_NEAREST] --> [1879041920,1879041920] --> OK [0.1879042048E10,TO_NEAREST] --> [1879042048,1879042048] --> OK [0.1879042176E10,TO_NEAREST] --> [1879042176,1879042176] --> OK [0.1879042304E10,TO_NEAREST] --> [1879042304,1879042304] --> OK [0.1879042432E10,TO_NEAREST] --> [1879042432,1879042432] --> OK [0.187904256E10,TO_NEAREST] --> [1879042560,1879042560] --> OK [0.1879042688E10,TO_NEAREST] --> [1879042688,1879042688] --> OK [0.1879042816E10,TO_NEAREST] --> [1879042816,1879042816] --> OK [0.1879042944E10,TO_NEAREST] --> [1879042944,1879042944] --> OK [0.1879043072E10,TO_NEAREST] --> [1879043072,1879043072] --> OK [0.18790432E10,TO_NEAREST] --> [1879043200,1879043200] --> OK [0.1879043328E10,TO_NEAREST] --> [1879043328,1879043328] --> OK [0.1879043456E10,TO_NEAREST] --> [1879043456,1879043456] --> OK [0.1879043584E10,TO_NEAREST] --> [1879043584,1879043584] --> OK [0.1879043712E10,TO_NEAREST] --> [1879043712,1879043712] --> OK [0.187904384E10,TO_NEAREST] --> [1879043840,1879043840] --> OK [0.1879043968E10,TO_NEAREST] --> [1879043968,1879043968] --> OK [0.1879044096E10,TO_NEAREST] --> [1879044096,1879044096] --> OK [0.1879044224E10,TO_NEAREST] --> [1879044224,1879044224] --> OK [0.1879044352E10,TO_NEAREST] --> [1879044352,1879044352] --> OK [0.187904448E10,TO_NEAREST] --> [1879044480,1879044480] --> OK [0.1879044608E10,TO_NEAREST] --> [1879044608,1879044608] --> OK [0.1879044736E10,TO_NEAREST] --> [1879044736,1879044736] --> OK [0.1879044864E10,TO_NEAREST] --> [1879044864,1879044864] --> OK [0.1879044992E10,TO_NEAREST] --> [1879044992,1879044992] --> OK [0.187904512E10,TO_NEAREST] --> [1879045120,1879045120] --> OK [0.1879045248E10,TO_NEAREST] --> [1879045248,1879045248] --> OK [0.1879045376E10,TO_NEAREST] --> [1879045376,1879045376] --> OK [0.1879045504E10,TO_NEAREST] --> [1879045504,1879045504] --> OK [0.1879045632E10,TO_NEAREST] --> [1879045632,1879045632] --> OK [0.187904576E10,TO_NEAREST] --> [1879045760,1879045760] --> OK [0.1879045888E10,TO_NEAREST] --> [1879045888,1879045888] --> OK [0.1879046016E10,TO_NEAREST] --> [1879046016,1879046016] --> OK [0.1879046144E10,TO_NEAREST] --> [1879046144,1879046144] --> OK [0.1879046272E10,TO_NEAREST] --> [1879046272,1879046272] --> OK [0.18790464E10,TO_NEAREST] --> [1879046400,1879046400] --> OK [0.1879046528E10,TO_NEAREST] --> [1879046528,1879046528] --> OK [0.1879046656E10,TO_NEAREST] --> [1879046656,1879046656] --> OK [0.1879046784E10,TO_NEAREST] --> [1879046784,1879046784] --> OK [0.1879046912E10,TO_NEAREST] --> [1879046912,1879046912] --> OK [0.187904704E10,TO_NEAREST] --> [1879047040,1879047040] --> OK [0.1879047168E10,TO_NEAREST] --> [1879047168,1879047168] --> OK [0.1879047296E10,TO_NEAREST] --> [1879047296,1879047296] --> OK [0.1879047424E10,TO_NEAREST] --> [1879047424,1879047424] --> OK [0.1879047552E10,TO_NEAREST] --> [1879047552,1879047552] --> OK [0.187904768E10,TO_NEAREST] --> [1879047680,1879047680] --> OK [0.1879047808E10,TO_NEAREST] --> [1879047808,1879047808] --> OK [0.1879047936E10,TO_NEAREST] --> [1879047936,1879047936] --> OK [0.1879048064E10,TO_NEAREST] --> [1879048064,1879048064] --> OK [0.1879048192E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879056384E10,TO_NEAREST] --> [1879056384,1879056384] --> OK [0.1879056256E10,TO_NEAREST] --> [1879056256,1879056256] --> OK [0.1879056128E10,TO_NEAREST] --> [1879056128,1879056128] --> OK [0.1879056E10,TO_NEAREST] --> [1879056000,1879056000] --> OK [0.1879055872E10,TO_NEAREST] --> [1879055872,1879055872] --> OK [0.1879055744E10,TO_NEAREST] --> [1879055744,1879055744] --> OK [0.1879055616E10,TO_NEAREST] --> [1879055616,1879055616] --> OK [0.1879055488E10,TO_NEAREST] --> [1879055488,1879055488] --> OK [0.187905536E10,TO_NEAREST] --> [1879055360,1879055360] --> OK [0.1879055232E10,TO_NEAREST] --> [1879055232,1879055232] --> OK [0.1879055104E10,TO_NEAREST] --> [1879055104,1879055104] --> OK [0.1879054976E10,TO_NEAREST] --> [1879054976,1879054976] --> OK [0.1879054848E10,TO_NEAREST] --> [1879054848,1879054848] --> OK [0.187905472E10,TO_NEAREST] --> [1879054720,1879054720] --> OK [0.1879054592E10,TO_NEAREST] --> [1879054592,1879054592] --> OK [0.1879054464E10,TO_NEAREST] --> [1879054464,1879054464] --> OK [0.1879054336E10,TO_NEAREST] --> [1879054336,1879054336] --> OK [0.1879054208E10,TO_NEAREST] --> [1879054208,1879054208] --> OK [0.187905408E10,TO_NEAREST] --> [1879054080,1879054080] --> OK [0.1879053952E10,TO_NEAREST] --> [1879053952,1879053952] --> OK [0.1879053824E10,TO_NEAREST] --> [1879053824,1879053824] --> OK [0.1879053696E10,TO_NEAREST] --> [1879053696,1879053696] --> OK [0.1879053568E10,TO_NEAREST] --> [1879053568,1879053568] --> OK [0.187905344E10,TO_NEAREST] --> [1879053440,1879053440] --> OK [0.1879053312E10,TO_NEAREST] --> [1879053312,1879053312] --> OK [0.1879053184E10,TO_NEAREST] --> [1879053184,1879053184] --> OK [0.1879053056E10,TO_NEAREST] --> [1879053056,1879053056] --> OK [0.1879052928E10,TO_NEAREST] --> [1879052928,1879052928] --> OK [0.18790528E10,TO_NEAREST] --> [1879052800,1879052800] --> OK [0.1879052672E10,TO_NEAREST] --> [1879052672,1879052672] --> OK [0.1879052544E10,TO_NEAREST] --> [1879052544,1879052544] --> OK [0.1879052416E10,TO_NEAREST] --> [1879052416,1879052416] --> OK [0.1879052288E10,TO_NEAREST] --> [1879052288,1879052288] --> OK [0.187905216E10,TO_NEAREST] --> [1879052160,1879052160] --> OK [0.1879052032E10,TO_NEAREST] --> [1879052032,1879052032] --> OK [0.1879051904E10,TO_NEAREST] --> [1879051904,1879051904] --> OK [0.1879051776E10,TO_NEAREST] --> [1879051776,1879051776] --> OK [0.1879051648E10,TO_NEAREST] --> [1879051648,1879051648] --> OK [0.187905152E10,TO_NEAREST] --> [1879051520,1879051520] --> OK [0.1879051392E10,TO_NEAREST] --> [1879051392,1879051392] --> OK [0.1879051264E10,TO_NEAREST] --> [1879051264,1879051264] --> OK [0.1879051136E10,TO_NEAREST] --> [1879051136,1879051136] --> OK [0.1879051008E10,TO_NEAREST] --> [1879051008,1879051008] --> OK [0.187905088E10,TO_NEAREST] --> [1879050880,1879050880] --> OK [0.1879050752E10,TO_NEAREST] --> [1879050752,1879050752] --> OK [0.1879050624E10,TO_NEAREST] --> [1879050624,1879050624] --> OK [0.1879050496E10,TO_NEAREST] --> [1879050496,1879050496] --> OK [0.1879050368E10,TO_NEAREST] --> [1879050368,1879050368] --> OK [0.187905024E10,TO_NEAREST] --> [1879050240,1879050240] --> OK [0.1879050112E10,TO_NEAREST] --> [1879050112,1879050112] --> OK [0.1879049984E10,TO_NEAREST] --> [1879049984,1879049984] --> OK [0.1879049856E10,TO_NEAREST] --> [1879049856,1879049856] --> OK [0.1879049728E10,TO_NEAREST] --> [1879049728,1879049728] --> OK [0.18790496E10,TO_NEAREST] --> [1879049600,1879049600] --> OK [0.1879049472E10,TO_NEAREST] --> [1879049472,1879049472] --> OK [0.1879049344E10,TO_NEAREST] --> [1879049344,1879049344] --> OK [0.1879049216E10,TO_NEAREST] --> [1879049216,1879049216] --> OK [0.1879049088E10,TO_NEAREST] --> [1879049088,1879049088] --> OK [0.187904896E10,TO_NEAREST] --> [1879048960,1879048960] --> OK [0.1879048832E10,TO_NEAREST] --> [1879048832,1879048832] --> OK [0.1879048704E10,TO_NEAREST] --> [1879048704,1879048704] --> OK [0.1879048576E10,TO_NEAREST] --> [1879048576,1879048576] --> OK [0.1879048448E10,TO_NEAREST] --> [1879048448,1879048448] --> OK [0.187904832E10,TO_NEAREST] --> [1879048320,1879048320] --> OK [0.2013257728E10,TO_NEAREST] --> [2013257728,2013257728] --> OK [0.2013257856E10,TO_NEAREST] --> [2013257856,2013257856] --> OK [0.2013257984E10,TO_NEAREST] --> [2013257984,2013257984] --> OK [0.2013258112E10,TO_NEAREST] --> [2013258112,2013258112] --> OK [0.201325824E10,TO_NEAREST] --> [2013258240,2013258240] --> OK [0.2013258368E10,TO_NEAREST] --> [2013258368,2013258368] --> OK [0.2013258496E10,TO_NEAREST] --> [2013258496,2013258496] --> OK [0.2013258624E10,TO_NEAREST] --> [2013258624,2013258624] --> OK [0.2013258752E10,TO_NEAREST] --> [2013258752,2013258752] --> OK [0.201325888E10,TO_NEAREST] --> [2013258880,2013258880] --> OK [0.2013259008E10,TO_NEAREST] --> [2013259008,2013259008] --> OK [0.2013259136E10,TO_NEAREST] --> [2013259136,2013259136] --> OK [0.2013259264E10,TO_NEAREST] --> [2013259264,2013259264] --> OK [0.2013259392E10,TO_NEAREST] --> [2013259392,2013259392] --> OK [0.201325952E10,TO_NEAREST] --> [2013259520,2013259520] --> OK [0.2013259648E10,TO_NEAREST] --> [2013259648,2013259648] --> OK [0.2013259776E10,TO_NEAREST] --> [2013259776,2013259776] --> OK [0.2013259904E10,TO_NEAREST] --> [2013259904,2013259904] --> OK [0.2013260032E10,TO_NEAREST] --> [2013260032,2013260032] --> OK [0.201326016E10,TO_NEAREST] --> [2013260160,2013260160] --> OK [0.2013260288E10,TO_NEAREST] --> [2013260288,2013260288] --> OK [0.2013260416E10,TO_NEAREST] --> [2013260416,2013260416] --> OK [0.2013260544E10,TO_NEAREST] --> [2013260544,2013260544] --> OK [0.2013260672E10,TO_NEAREST] --> [2013260672,2013260672] --> OK [0.20132608E10,TO_NEAREST] --> [2013260800,2013260800] --> OK [0.2013260928E10,TO_NEAREST] --> [2013260928,2013260928] --> OK [0.2013261056E10,TO_NEAREST] --> [2013261056,2013261056] --> OK [0.2013261184E10,TO_NEAREST] --> [2013261184,2013261184] --> OK [0.2013261312E10,TO_NEAREST] --> [2013261312,2013261312] --> OK [0.201326144E10,TO_NEAREST] --> [2013261440,2013261440] --> OK [0.2013261568E10,TO_NEAREST] --> [2013261568,2013261568] --> OK [0.2013261696E10,TO_NEAREST] --> [2013261696,2013261696] --> OK [0.2013261824E10,TO_NEAREST] --> [2013261824,2013261824] --> OK [0.2013261952E10,TO_NEAREST] --> [2013261952,2013261952] --> OK [0.201326208E10,TO_NEAREST] --> [2013262080,2013262080] --> OK [0.2013262208E10,TO_NEAREST] --> [2013262208,2013262208] --> OK [0.2013262336E10,TO_NEAREST] --> [2013262336,2013262336] --> OK [0.2013262464E10,TO_NEAREST] --> [2013262464,2013262464] --> OK [0.2013262592E10,TO_NEAREST] --> [2013262592,2013262592] --> OK [0.201326272E10,TO_NEAREST] --> [2013262720,2013262720] --> OK [0.2013262848E10,TO_NEAREST] --> [2013262848,2013262848] --> OK [0.2013262976E10,TO_NEAREST] --> [2013262976,2013262976] --> OK [0.2013263104E10,TO_NEAREST] --> [2013263104,2013263104] --> OK [0.2013263232E10,TO_NEAREST] --> [2013263232,2013263232] --> OK [0.201326336E10,TO_NEAREST] --> [2013263360,2013263360] --> OK [0.2013263488E10,TO_NEAREST] --> [2013263488,2013263488] --> OK [0.2013263616E10,TO_NEAREST] --> [2013263616,2013263616] --> OK [0.2013263744E10,TO_NEAREST] --> [2013263744,2013263744] --> OK [0.2013263872E10,TO_NEAREST] --> [2013263872,2013263872] --> OK [0.2013264E10,TO_NEAREST] --> [2013264000,2013264000] --> OK [0.2013264128E10,TO_NEAREST] --> [2013264128,2013264128] --> OK [0.2013264256E10,TO_NEAREST] --> [2013264256,2013264256] --> OK [0.2013264384E10,TO_NEAREST] --> [2013264384,2013264384] --> OK [0.2013264512E10,TO_NEAREST] --> [2013264512,2013264512] --> OK [0.201326464E10,TO_NEAREST] --> [2013264640,2013264640] --> OK [0.2013264768E10,TO_NEAREST] --> [2013264768,2013264768] --> OK [0.2013264896E10,TO_NEAREST] --> [2013264896,2013264896] --> OK [0.2013265024E10,TO_NEAREST] --> [2013265024,2013265024] --> OK [0.2013265152E10,TO_NEAREST] --> [2013265152,2013265152] --> OK [0.201326528E10,TO_NEAREST] --> [2013265280,2013265280] --> OK [0.2013265408E10,TO_NEAREST] --> [2013265408,2013265408] --> OK [0.2013265536E10,TO_NEAREST] --> [2013265536,2013265536] --> OK [0.2013265664E10,TO_NEAREST] --> [2013265664,2013265664] --> OK [0.2013265792E10,TO_NEAREST] --> [2013265792,2013265792] --> OK [0.201326592E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013274112E10,TO_NEAREST] --> [2013274112,2013274112] --> OK [0.2013273984E10,TO_NEAREST] --> [2013273984,2013273984] --> OK [0.2013273856E10,TO_NEAREST] --> [2013273856,2013273856] --> OK [0.2013273728E10,TO_NEAREST] --> [2013273728,2013273728] --> OK [0.20132736E10,TO_NEAREST] --> [2013273600,2013273600] --> OK [0.2013273472E10,TO_NEAREST] --> [2013273472,2013273472] --> OK [0.2013273344E10,TO_NEAREST] --> [2013273344,2013273344] --> OK [0.2013273216E10,TO_NEAREST] --> [2013273216,2013273216] --> OK [0.2013273088E10,TO_NEAREST] --> [2013273088,2013273088] --> OK [0.201327296E10,TO_NEAREST] --> [2013272960,2013272960] --> OK [0.2013272832E10,TO_NEAREST] --> [2013272832,2013272832] --> OK [0.2013272704E10,TO_NEAREST] --> [2013272704,2013272704] --> OK [0.2013272576E10,TO_NEAREST] --> [2013272576,2013272576] --> OK [0.2013272448E10,TO_NEAREST] --> [2013272448,2013272448] --> OK [0.201327232E10,TO_NEAREST] --> [2013272320,2013272320] --> OK [0.2013272192E10,TO_NEAREST] --> [2013272192,2013272192] --> OK [0.2013272064E10,TO_NEAREST] --> [2013272064,2013272064] --> OK [0.2013271936E10,TO_NEAREST] --> [2013271936,2013271936] --> OK [0.2013271808E10,TO_NEAREST] --> [2013271808,2013271808] --> OK [0.201327168E10,TO_NEAREST] --> [2013271680,2013271680] --> OK [0.2013271552E10,TO_NEAREST] --> [2013271552,2013271552] --> OK [0.2013271424E10,TO_NEAREST] --> [2013271424,2013271424] --> OK [0.2013271296E10,TO_NEAREST] --> [2013271296,2013271296] --> OK [0.2013271168E10,TO_NEAREST] --> [2013271168,2013271168] --> OK [0.201327104E10,TO_NEAREST] --> [2013271040,2013271040] --> OK [0.2013270912E10,TO_NEAREST] --> [2013270912,2013270912] --> OK [0.2013270784E10,TO_NEAREST] --> [2013270784,2013270784] --> OK [0.2013270656E10,TO_NEAREST] --> [2013270656,2013270656] --> OK [0.2013270528E10,TO_NEAREST] --> [2013270528,2013270528] --> OK [0.20132704E10,TO_NEAREST] --> [2013270400,2013270400] --> OK [0.2013270272E10,TO_NEAREST] --> [2013270272,2013270272] --> OK [0.2013270144E10,TO_NEAREST] --> [2013270144,2013270144] --> OK [0.2013270016E10,TO_NEAREST] --> [2013270016,2013270016] --> OK [0.2013269888E10,TO_NEAREST] --> [2013269888,2013269888] --> OK [0.201326976E10,TO_NEAREST] --> [2013269760,2013269760] --> OK [0.2013269632E10,TO_NEAREST] --> [2013269632,2013269632] --> OK [0.2013269504E10,TO_NEAREST] --> [2013269504,2013269504] --> OK [0.2013269376E10,TO_NEAREST] --> [2013269376,2013269376] --> OK [0.2013269248E10,TO_NEAREST] --> [2013269248,2013269248] --> OK [0.201326912E10,TO_NEAREST] --> [2013269120,2013269120] --> OK [0.2013268992E10,TO_NEAREST] --> [2013268992,2013268992] --> OK [0.2013268864E10,TO_NEAREST] --> [2013268864,2013268864] --> OK [0.2013268736E10,TO_NEAREST] --> [2013268736,2013268736] --> OK [0.2013268608E10,TO_NEAREST] --> [2013268608,2013268608] --> OK [0.201326848E10,TO_NEAREST] --> [2013268480,2013268480] --> OK [0.2013268352E10,TO_NEAREST] --> [2013268352,2013268352] --> OK [0.2013268224E10,TO_NEAREST] --> [2013268224,2013268224] --> OK [0.2013268096E10,TO_NEAREST] --> [2013268096,2013268096] --> OK [0.2013267968E10,TO_NEAREST] --> [2013267968,2013267968] --> OK [0.201326784E10,TO_NEAREST] --> [2013267840,2013267840] --> OK [0.2013267712E10,TO_NEAREST] --> [2013267712,2013267712] --> OK [0.2013267584E10,TO_NEAREST] --> [2013267584,2013267584] --> OK [0.2013267456E10,TO_NEAREST] --> [2013267456,2013267456] --> OK [0.2013267328E10,TO_NEAREST] --> [2013267328,2013267328] --> OK [0.20132672E10,TO_NEAREST] --> [2013267200,2013267200] --> OK [0.2013267072E10,TO_NEAREST] --> [2013267072,2013267072] --> OK [0.2013266944E10,TO_NEAREST] --> [2013266944,2013266944] --> OK [0.2013266816E10,TO_NEAREST] --> [2013266816,2013266816] --> OK [0.2013266688E10,TO_NEAREST] --> [2013266688,2013266688] --> OK [0.201326656E10,TO_NEAREST] --> [2013266560,2013266560] --> OK [0.2013266432E10,TO_NEAREST] --> [2013266432,2013266432] --> OK [0.2013266304E10,TO_NEAREST] --> [2013266304,2013266304] --> OK [0.2013266176E10,TO_NEAREST] --> [2013266176,2013266176] --> OK [0.2013266048E10,TO_NEAREST] --> [2013266048,2013266048] --> OK [0.2080366592E10,TO_NEAREST] --> [2080366592,2080366592] --> OK [0.208036672E10,TO_NEAREST] --> [2080366720,2080366720] --> OK [0.2080366848E10,TO_NEAREST] --> [2080366848,2080366848] --> OK [0.2080366976E10,TO_NEAREST] --> [2080366976,2080366976] --> OK [0.2080367104E10,TO_NEAREST] --> [2080367104,2080367104] --> OK [0.2080367232E10,TO_NEAREST] --> [2080367232,2080367232] --> OK [0.208036736E10,TO_NEAREST] --> [2080367360,2080367360] --> OK [0.2080367488E10,TO_NEAREST] --> [2080367488,2080367488] --> OK [0.2080367616E10,TO_NEAREST] --> [2080367616,2080367616] --> OK [0.2080367744E10,TO_NEAREST] --> [2080367744,2080367744] --> OK [0.2080367872E10,TO_NEAREST] --> [2080367872,2080367872] --> OK [0.2080368E10,TO_NEAREST] --> [2080368000,2080368000] --> OK [0.2080368128E10,TO_NEAREST] --> [2080368128,2080368128] --> OK [0.2080368256E10,TO_NEAREST] --> [2080368256,2080368256] --> OK [0.2080368384E10,TO_NEAREST] --> [2080368384,2080368384] --> OK [0.2080368512E10,TO_NEAREST] --> [2080368512,2080368512] --> OK [0.208036864E10,TO_NEAREST] --> [2080368640,2080368640] --> OK [0.2080368768E10,TO_NEAREST] --> [2080368768,2080368768] --> OK [0.2080368896E10,TO_NEAREST] --> [2080368896,2080368896] --> OK [0.2080369024E10,TO_NEAREST] --> [2080369024,2080369024] --> OK [0.2080369152E10,TO_NEAREST] --> [2080369152,2080369152] --> OK [0.208036928E10,TO_NEAREST] --> [2080369280,2080369280] --> OK [0.2080369408E10,TO_NEAREST] --> [2080369408,2080369408] --> OK [0.2080369536E10,TO_NEAREST] --> [2080369536,2080369536] --> OK [0.2080369664E10,TO_NEAREST] --> [2080369664,2080369664] --> OK [0.2080369792E10,TO_NEAREST] --> [2080369792,2080369792] --> OK [0.208036992E10,TO_NEAREST] --> [2080369920,2080369920] --> OK [0.2080370048E10,TO_NEAREST] --> [2080370048,2080370048] --> OK [0.2080370176E10,TO_NEAREST] --> [2080370176,2080370176] --> OK [0.2080370304E10,TO_NEAREST] --> [2080370304,2080370304] --> OK [0.2080370432E10,TO_NEAREST] --> [2080370432,2080370432] --> OK [0.208037056E10,TO_NEAREST] --> [2080370560,2080370560] --> OK [0.2080370688E10,TO_NEAREST] --> [2080370688,2080370688] --> OK [0.2080370816E10,TO_NEAREST] --> [2080370816,2080370816] --> OK [0.2080370944E10,TO_NEAREST] --> [2080370944,2080370944] --> OK [0.2080371072E10,TO_NEAREST] --> [2080371072,2080371072] --> OK [0.20803712E10,TO_NEAREST] --> [2080371200,2080371200] --> OK [0.2080371328E10,TO_NEAREST] --> [2080371328,2080371328] --> OK [0.2080371456E10,TO_NEAREST] --> [2080371456,2080371456] --> OK [0.2080371584E10,TO_NEAREST] --> [2080371584,2080371584] --> OK [0.2080371712E10,TO_NEAREST] --> [2080371712,2080371712] --> OK [0.208037184E10,TO_NEAREST] --> [2080371840,2080371840] --> OK [0.2080371968E10,TO_NEAREST] --> [2080371968,2080371968] --> OK [0.2080372096E10,TO_NEAREST] --> [2080372096,2080372096] --> OK [0.2080372224E10,TO_NEAREST] --> [2080372224,2080372224] --> OK [0.2080372352E10,TO_NEAREST] --> [2080372352,2080372352] --> OK [0.208037248E10,TO_NEAREST] --> [2080372480,2080372480] --> OK [0.2080372608E10,TO_NEAREST] --> [2080372608,2080372608] --> OK [0.2080372736E10,TO_NEAREST] --> [2080372736,2080372736] --> OK [0.2080372864E10,TO_NEAREST] --> [2080372864,2080372864] --> OK [0.2080372992E10,TO_NEAREST] --> [2080372992,2080372992] --> OK [0.208037312E10,TO_NEAREST] --> [2080373120,2080373120] --> OK [0.2080373248E10,TO_NEAREST] --> [2080373248,2080373248] --> OK [0.2080373376E10,TO_NEAREST] --> [2080373376,2080373376] --> OK [0.2080373504E10,TO_NEAREST] --> [2080373504,2080373504] --> OK [0.2080373632E10,TO_NEAREST] --> [2080373632,2080373632] --> OK [0.208037376E10,TO_NEAREST] --> [2080373760,2080373760] --> OK [0.2080373888E10,TO_NEAREST] --> [2080373888,2080373888] --> OK [0.2080374016E10,TO_NEAREST] --> [2080374016,2080374016] --> OK [0.2080374144E10,TO_NEAREST] --> [2080374144,2080374144] --> OK [0.2080374272E10,TO_NEAREST] --> [2080374272,2080374272] --> OK [0.20803744E10,TO_NEAREST] --> [2080374400,2080374400] --> OK [0.2080374528E10,TO_NEAREST] --> [2080374528,2080374528] --> OK [0.2080374656E10,TO_NEAREST] --> [2080374656,2080374656] --> OK [0.2080374784E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080382976E10,TO_NEAREST] --> [2080382976,2080382976] --> OK [0.2080382848E10,TO_NEAREST] --> [2080382848,2080382848] --> OK [0.208038272E10,TO_NEAREST] --> [2080382720,2080382720] --> OK [0.2080382592E10,TO_NEAREST] --> [2080382592,2080382592] --> OK [0.2080382464E10,TO_NEAREST] --> [2080382464,2080382464] --> OK [0.2080382336E10,TO_NEAREST] --> [2080382336,2080382336] --> OK [0.2080382208E10,TO_NEAREST] --> [2080382208,2080382208] --> OK [0.208038208E10,TO_NEAREST] --> [2080382080,2080382080] --> OK [0.2080381952E10,TO_NEAREST] --> [2080381952,2080381952] --> OK [0.2080381824E10,TO_NEAREST] --> [2080381824,2080381824] --> OK [0.2080381696E10,TO_NEAREST] --> [2080381696,2080381696] --> OK [0.2080381568E10,TO_NEAREST] --> [2080381568,2080381568] --> OK [0.208038144E10,TO_NEAREST] --> [2080381440,2080381440] --> OK [0.2080381312E10,TO_NEAREST] --> [2080381312,2080381312] --> OK [0.2080381184E10,TO_NEAREST] --> [2080381184,2080381184] --> OK [0.2080381056E10,TO_NEAREST] --> [2080381056,2080381056] --> OK [0.2080380928E10,TO_NEAREST] --> [2080380928,2080380928] --> OK [0.20803808E10,TO_NEAREST] --> [2080380800,2080380800] --> OK [0.2080380672E10,TO_NEAREST] --> [2080380672,2080380672] --> OK [0.2080380544E10,TO_NEAREST] --> [2080380544,2080380544] --> OK [0.2080380416E10,TO_NEAREST] --> [2080380416,2080380416] --> OK [0.2080380288E10,TO_NEAREST] --> [2080380288,2080380288] --> OK [0.208038016E10,TO_NEAREST] --> [2080380160,2080380160] --> OK [0.2080380032E10,TO_NEAREST] --> [2080380032,2080380032] --> OK [0.2080379904E10,TO_NEAREST] --> [2080379904,2080379904] --> OK [0.2080379776E10,TO_NEAREST] --> [2080379776,2080379776] --> OK [0.2080379648E10,TO_NEAREST] --> [2080379648,2080379648] --> OK [0.208037952E10,TO_NEAREST] --> [2080379520,2080379520] --> OK [0.2080379392E10,TO_NEAREST] --> [2080379392,2080379392] --> OK [0.2080379264E10,TO_NEAREST] --> [2080379264,2080379264] --> OK [0.2080379136E10,TO_NEAREST] --> [2080379136,2080379136] --> OK [0.2080379008E10,TO_NEAREST] --> [2080379008,2080379008] --> OK [0.208037888E10,TO_NEAREST] --> [2080378880,2080378880] --> OK [0.2080378752E10,TO_NEAREST] --> [2080378752,2080378752] --> OK [0.2080378624E10,TO_NEAREST] --> [2080378624,2080378624] --> OK [0.2080378496E10,TO_NEAREST] --> [2080378496,2080378496] --> OK [0.2080378368E10,TO_NEAREST] --> [2080378368,2080378368] --> OK [0.208037824E10,TO_NEAREST] --> [2080378240,2080378240] --> OK [0.2080378112E10,TO_NEAREST] --> [2080378112,2080378112] --> OK [0.2080377984E10,TO_NEAREST] --> [2080377984,2080377984] --> OK [0.2080377856E10,TO_NEAREST] --> [2080377856,2080377856] --> OK [0.2080377728E10,TO_NEAREST] --> [2080377728,2080377728] --> OK [0.20803776E10,TO_NEAREST] --> [2080377600,2080377600] --> OK [0.2080377472E10,TO_NEAREST] --> [2080377472,2080377472] --> OK [0.2080377344E10,TO_NEAREST] --> [2080377344,2080377344] --> OK [0.2080377216E10,TO_NEAREST] --> [2080377216,2080377216] --> OK [0.2080377088E10,TO_NEAREST] --> [2080377088,2080377088] --> OK [0.208037696E10,TO_NEAREST] --> [2080376960,2080376960] --> OK [0.2080376832E10,TO_NEAREST] --> [2080376832,2080376832] --> OK [0.2080376704E10,TO_NEAREST] --> [2080376704,2080376704] --> OK [0.2080376576E10,TO_NEAREST] --> [2080376576,2080376576] --> OK [0.2080376448E10,TO_NEAREST] --> [2080376448,2080376448] --> OK [0.208037632E10,TO_NEAREST] --> [2080376320,2080376320] --> OK [0.2080376192E10,TO_NEAREST] --> [2080376192,2080376192] --> OK [0.2080376064E10,TO_NEAREST] --> [2080376064,2080376064] --> OK [0.2080375936E10,TO_NEAREST] --> [2080375936,2080375936] --> OK [0.2080375808E10,TO_NEAREST] --> [2080375808,2080375808] --> OK [0.208037568E10,TO_NEAREST] --> [2080375680,2080375680] --> OK [0.2080375552E10,TO_NEAREST] --> [2080375552,2080375552] --> OK [0.2080375424E10,TO_NEAREST] --> [2080375424,2080375424] --> OK [0.2080375296E10,TO_NEAREST] --> [2080375296,2080375296] --> OK [0.2080375168E10,TO_NEAREST] --> [2080375168,2080375168] --> OK [0.208037504E10,TO_NEAREST] --> [2080375040,2080375040] --> OK [0.2080374912E10,TO_NEAREST] --> [2080374912,2080374912] --> OK [0.2113921024E10,TO_NEAREST] --> [2113921024,2113921024] --> OK [0.2113921152E10,TO_NEAREST] --> [2113921152,2113921152] --> OK [0.211392128E10,TO_NEAREST] --> [2113921280,2113921280] --> OK [0.2113921408E10,TO_NEAREST] --> [2113921408,2113921408] --> OK [0.2113921536E10,TO_NEAREST] --> [2113921536,2113921536] --> OK [0.2113921664E10,TO_NEAREST] --> [2113921664,2113921664] --> OK [0.2113921792E10,TO_NEAREST] --> [2113921792,2113921792] --> OK [0.211392192E10,TO_NEAREST] --> [2113921920,2113921920] --> OK [0.2113922048E10,TO_NEAREST] --> [2113922048,2113922048] --> OK [0.2113922176E10,TO_NEAREST] --> [2113922176,2113922176] --> OK [0.2113922304E10,TO_NEAREST] --> [2113922304,2113922304] --> OK [0.2113922432E10,TO_NEAREST] --> [2113922432,2113922432] --> OK [0.211392256E10,TO_NEAREST] --> [2113922560,2113922560] --> OK [0.2113922688E10,TO_NEAREST] --> [2113922688,2113922688] --> OK [0.2113922816E10,TO_NEAREST] --> [2113922816,2113922816] --> OK [0.2113922944E10,TO_NEAREST] --> [2113922944,2113922944] --> OK [0.2113923072E10,TO_NEAREST] --> [2113923072,2113923072] --> OK [0.21139232E10,TO_NEAREST] --> [2113923200,2113923200] --> OK [0.2113923328E10,TO_NEAREST] --> [2113923328,2113923328] --> OK [0.2113923456E10,TO_NEAREST] --> [2113923456,2113923456] --> OK [0.2113923584E10,TO_NEAREST] --> [2113923584,2113923584] --> OK [0.2113923712E10,TO_NEAREST] --> [2113923712,2113923712] --> OK [0.211392384E10,TO_NEAREST] --> [2113923840,2113923840] --> OK [0.2113923968E10,TO_NEAREST] --> [2113923968,2113923968] --> OK [0.2113924096E10,TO_NEAREST] --> [2113924096,2113924096] --> OK [0.2113924224E10,TO_NEAREST] --> [2113924224,2113924224] --> OK [0.2113924352E10,TO_NEAREST] --> [2113924352,2113924352] --> OK [0.211392448E10,TO_NEAREST] --> [2113924480,2113924480] --> OK [0.2113924608E10,TO_NEAREST] --> [2113924608,2113924608] --> OK [0.2113924736E10,TO_NEAREST] --> [2113924736,2113924736] --> OK [0.2113924864E10,TO_NEAREST] --> [2113924864,2113924864] --> OK [0.2113924992E10,TO_NEAREST] --> [2113924992,2113924992] --> OK [0.211392512E10,TO_NEAREST] --> [2113925120,2113925120] --> OK [0.2113925248E10,TO_NEAREST] --> [2113925248,2113925248] --> OK [0.2113925376E10,TO_NEAREST] --> [2113925376,2113925376] --> OK [0.2113925504E10,TO_NEAREST] --> [2113925504,2113925504] --> OK [0.2113925632E10,TO_NEAREST] --> [2113925632,2113925632] --> OK [0.211392576E10,TO_NEAREST] --> [2113925760,2113925760] --> OK [0.2113925888E10,TO_NEAREST] --> [2113925888,2113925888] --> OK [0.2113926016E10,TO_NEAREST] --> [2113926016,2113926016] --> OK [0.2113926144E10,TO_NEAREST] --> [2113926144,2113926144] --> OK [0.2113926272E10,TO_NEAREST] --> [2113926272,2113926272] --> OK [0.21139264E10,TO_NEAREST] --> [2113926400,2113926400] --> OK [0.2113926528E10,TO_NEAREST] --> [2113926528,2113926528] --> OK [0.2113926656E10,TO_NEAREST] --> [2113926656,2113926656] --> OK [0.2113926784E10,TO_NEAREST] --> [2113926784,2113926784] --> OK [0.2113926912E10,TO_NEAREST] --> [2113926912,2113926912] --> OK [0.211392704E10,TO_NEAREST] --> [2113927040,2113927040] --> OK [0.2113927168E10,TO_NEAREST] --> [2113927168,2113927168] --> OK [0.2113927296E10,TO_NEAREST] --> [2113927296,2113927296] --> OK [0.2113927424E10,TO_NEAREST] --> [2113927424,2113927424] --> OK [0.2113927552E10,TO_NEAREST] --> [2113927552,2113927552] --> OK [0.211392768E10,TO_NEAREST] --> [2113927680,2113927680] --> OK [0.2113927808E10,TO_NEAREST] --> [2113927808,2113927808] --> OK [0.2113927936E10,TO_NEAREST] --> [2113927936,2113927936] --> OK [0.2113928064E10,TO_NEAREST] --> [2113928064,2113928064] --> OK [0.2113928192E10,TO_NEAREST] --> [2113928192,2113928192] --> OK [0.211392832E10,TO_NEAREST] --> [2113928320,2113928320] --> OK [0.2113928448E10,TO_NEAREST] --> [2113928448,2113928448] --> OK [0.2113928576E10,TO_NEAREST] --> [2113928576,2113928576] --> OK [0.2113928704E10,TO_NEAREST] --> [2113928704,2113928704] --> OK [0.2113928832E10,TO_NEAREST] --> [2113928832,2113928832] --> OK [0.211392896E10,TO_NEAREST] --> [2113928960,2113928960] --> OK [0.2113929088E10,TO_NEAREST] --> [2113929088,2113929088] --> OK [0.2113929216E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113937408E10,TO_NEAREST] --> [2113937408,2113937408] --> OK [0.211393728E10,TO_NEAREST] --> [2113937280,2113937280] --> OK [0.2113937152E10,TO_NEAREST] --> [2113937152,2113937152] --> OK [0.2113937024E10,TO_NEAREST] --> [2113937024,2113937024] --> OK [0.2113936896E10,TO_NEAREST] --> [2113936896,2113936896] --> OK [0.2113936768E10,TO_NEAREST] --> [2113936768,2113936768] --> OK [0.211393664E10,TO_NEAREST] --> [2113936640,2113936640] --> OK [0.2113936512E10,TO_NEAREST] --> [2113936512,2113936512] --> OK [0.2113936384E10,TO_NEAREST] --> [2113936384,2113936384] --> OK [0.2113936256E10,TO_NEAREST] --> [2113936256,2113936256] --> OK [0.2113936128E10,TO_NEAREST] --> [2113936128,2113936128] --> OK [0.2113936E10,TO_NEAREST] --> [2113936000,2113936000] --> OK [0.2113935872E10,TO_NEAREST] --> [2113935872,2113935872] --> OK [0.2113935744E10,TO_NEAREST] --> [2113935744,2113935744] --> OK [0.2113935616E10,TO_NEAREST] --> [2113935616,2113935616] --> OK [0.2113935488E10,TO_NEAREST] --> [2113935488,2113935488] --> OK [0.211393536E10,TO_NEAREST] --> [2113935360,2113935360] --> OK [0.2113935232E10,TO_NEAREST] --> [2113935232,2113935232] --> OK [0.2113935104E10,TO_NEAREST] --> [2113935104,2113935104] --> OK [0.2113934976E10,TO_NEAREST] --> [2113934976,2113934976] --> OK [0.2113934848E10,TO_NEAREST] --> [2113934848,2113934848] --> OK [0.211393472E10,TO_NEAREST] --> [2113934720,2113934720] --> OK [0.2113934592E10,TO_NEAREST] --> [2113934592,2113934592] --> OK [0.2113934464E10,TO_NEAREST] --> [2113934464,2113934464] --> OK [0.2113934336E10,TO_NEAREST] --> [2113934336,2113934336] --> OK [0.2113934208E10,TO_NEAREST] --> [2113934208,2113934208] --> OK [0.211393408E10,TO_NEAREST] --> [2113934080,2113934080] --> OK [0.2113933952E10,TO_NEAREST] --> [2113933952,2113933952] --> OK [0.2113933824E10,TO_NEAREST] --> [2113933824,2113933824] --> OK [0.2113933696E10,TO_NEAREST] --> [2113933696,2113933696] --> OK [0.2113933568E10,TO_NEAREST] --> [2113933568,2113933568] --> OK [0.211393344E10,TO_NEAREST] --> [2113933440,2113933440] --> OK [0.2113933312E10,TO_NEAREST] --> [2113933312,2113933312] --> OK [0.2113933184E10,TO_NEAREST] --> [2113933184,2113933184] --> OK [0.2113933056E10,TO_NEAREST] --> [2113933056,2113933056] --> OK [0.2113932928E10,TO_NEAREST] --> [2113932928,2113932928] --> OK [0.21139328E10,TO_NEAREST] --> [2113932800,2113932800] --> OK [0.2113932672E10,TO_NEAREST] --> [2113932672,2113932672] --> OK [0.2113932544E10,TO_NEAREST] --> [2113932544,2113932544] --> OK [0.2113932416E10,TO_NEAREST] --> [2113932416,2113932416] --> OK [0.2113932288E10,TO_NEAREST] --> [2113932288,2113932288] --> OK [0.211393216E10,TO_NEAREST] --> [2113932160,2113932160] --> OK [0.2113932032E10,TO_NEAREST] --> [2113932032,2113932032] --> OK [0.2113931904E10,TO_NEAREST] --> [2113931904,2113931904] --> OK [0.2113931776E10,TO_NEAREST] --> [2113931776,2113931776] --> OK [0.2113931648E10,TO_NEAREST] --> [2113931648,2113931648] --> OK [0.211393152E10,TO_NEAREST] --> [2113931520,2113931520] --> OK [0.2113931392E10,TO_NEAREST] --> [2113931392,2113931392] --> OK [0.2113931264E10,TO_NEAREST] --> [2113931264,2113931264] --> OK [0.2113931136E10,TO_NEAREST] --> [2113931136,2113931136] --> OK [0.2113931008E10,TO_NEAREST] --> [2113931008,2113931008] --> OK [0.211393088E10,TO_NEAREST] --> [2113930880,2113930880] --> OK [0.2113930752E10,TO_NEAREST] --> [2113930752,2113930752] --> OK [0.2113930624E10,TO_NEAREST] --> [2113930624,2113930624] --> OK [0.2113930496E10,TO_NEAREST] --> [2113930496,2113930496] --> OK [0.2113930368E10,TO_NEAREST] --> [2113930368,2113930368] --> OK [0.211393024E10,TO_NEAREST] --> [2113930240,2113930240] --> OK [0.2113930112E10,TO_NEAREST] --> [2113930112,2113930112] --> OK [0.2113929984E10,TO_NEAREST] --> [2113929984,2113929984] --> OK [0.2113929856E10,TO_NEAREST] --> [2113929856,2113929856] --> OK [0.2113929728E10,TO_NEAREST] --> [2113929728,2113929728] --> OK [0.21139296E10,TO_NEAREST] --> [2113929600,2113929600] --> OK [0.2113929472E10,TO_NEAREST] --> [2113929472,2113929472] --> OK [0.2113929344E10,TO_NEAREST] --> [2113929344,2113929344] --> OK [0.2147475456E10,TO_NEAREST] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_NEAREST] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_NEAREST] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_NEAREST] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_NEAREST] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_NEAREST] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_NEAREST] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_NEAREST] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_NEAREST] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_NEAREST] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_NEAREST] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_NEAREST] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_NEAREST] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_NEAREST] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_NEAREST] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_NEAREST] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_NEAREST] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_NEAREST] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_NEAREST] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_NEAREST] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_NEAREST] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_NEAREST] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_NEAREST] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEAREST] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_NEAREST] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_NEAREST] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_NEAREST] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_NEAREST] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_NEAREST] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_NEAREST] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_NEAREST] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_NEAREST] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_NEAREST] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_NEAREST] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_NEAREST] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_NEAREST] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_NEAREST] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_NEAREST] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_NEAREST] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_NEAREST] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_NEAREST] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_NEAREST] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_NEAREST] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_NEAREST] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_NEAREST] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_NEAREST] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_NEAREST] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_NEAREST] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEAREST] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_NEAREST] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_NEAREST] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_NEAREST] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_NEAREST] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_NEAREST] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_NEAREST] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_NEAREST] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_NEAREST] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_NEAREST] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_NEAREST] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_NEAREST] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_NEAREST] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_NEAREST] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_NEAREST] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_NEAREST] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_NEAREST] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_NEAREST] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_NEAREST] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_NEAREST] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_NEAREST] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_NEAREST] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_NEAREST] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_NEAREST] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_NEAREST] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_NEAREST] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_NEAREST] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_NEAREST] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_NEAREST] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_NEAREST] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_NEAREST] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_NEAREST] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_NEAREST] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_NEAREST] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_NEAREST] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_NEAREST] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_NEAREST] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_NEAREST] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_NEAREST] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEAREST] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_NEAREST] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_NEAREST] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_NEAREST] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_NEAREST] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_NEAREST] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_NEAREST] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_NEAREST] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_NEAREST] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_NEAREST] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_NEAREST] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_NEAREST] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_NEAREST] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_NEAREST] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_NEAREST] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_NEAREST] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_NEAREST] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_NEAREST] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_NEAREST] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_NEAREST] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_NEAREST] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_NEAREST] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_NEAREST] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_NEAREST] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_NEAREST] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEAREST] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_NEAREST] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_NEAREST] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_NEAREST] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_NEAREST] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_NEAREST] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_NEAREST] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_NEAREST] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_NEAREST] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_NEAREST] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_NEAREST] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_NEAREST] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_NEAREST] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_NEAREST] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_NEAREST] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_NEAREST] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_NEAREST] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_NEAREST] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_NEAREST] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_NEAREST] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_NEAREST] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_NEAREST] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_NEAREST] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_NEAREST] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_NEAREST] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_NEAREST] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_NEAREST] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_NEAREST] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_NEAREST] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_NEAREST] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_NEAREST] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_NEAREST] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_NEAREST] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_NEAREST] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_NEAREST] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_NEAREST] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_NEAREST] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_NEAREST] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_NEAREST] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_NEAREST] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEAREST] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_NEAREST] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_NEAREST] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_NEAREST] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_NEAREST] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_NEAREST] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_NEAREST] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_NEAREST] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_NEAREST] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_NEAREST] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_NEAREST] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_NEAREST] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_NEAREST] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_NEAREST] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_NEAREST] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_NEAREST] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_NEAREST] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_NEAREST] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_NEAREST] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_NEAREST] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_NEAREST] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_NEAREST] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_NEAREST] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_NEAREST] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_NEAREST] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEAREST] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_NEAREST] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_NEAREST] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_NEAREST] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_NEAREST] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_NEAREST] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_NEAREST] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_NEAREST] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_NEAREST] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_NEAREST] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_NEAREST] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_NEAREST] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_NEAREST] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_NEAREST] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_NEAREST] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_NEAREST] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_NEAREST] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_NEAREST] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_NEAREST] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_NEAREST] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_NEAREST] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_NEAREST] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_NEAREST] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_NEAREST] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_NEAREST] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_NEAREST] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_NEAREST] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_NEAREST] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_NEAREST] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_NEAREST] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_NEAREST] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_NEAREST] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_NEAREST] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_NEAREST] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_NEAREST] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_NEAREST] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_NEAREST] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_NEAREST] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_NEAREST] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEAREST] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_NEAREST] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_NEAREST] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_NEAREST] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_NEAREST] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_NEAREST] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_NEAREST] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_NEAREST] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_NEAREST] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_NEAREST] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_NEAREST] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_NEAREST] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_NEAREST] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_NEAREST] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_NEAREST] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_NEAREST] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_NEAREST] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_NEAREST] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_NEAREST] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_NEAREST] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_NEAREST] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_NEAREST] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_NEAREST] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_NEAREST] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_NEAREST] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEAREST] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_NEAREST] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_NEAREST] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_NEAREST] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_NEAREST] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_NEAREST] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_NEAREST] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_NEAREST] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_NEAREST] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_NEAREST] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_NEAREST] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_NEAREST] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_NEAREST] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_NEAREST] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_NEAREST] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_NEAREST] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_NEAREST] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_NEAREST] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_NEAREST] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_NEAREST] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_NEAREST] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_NEAREST] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_NEAREST] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_NEAREST] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_NEAREST] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_NEAREST] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_NEAREST] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_NEAREST] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_NEAREST] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_NEAREST] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_NEAREST] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_NEAREST] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_NEAREST] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_NEAREST] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_NEAREST] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_NEAREST] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_NEAREST] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_NEAREST] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_NEAREST] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_NEAREST] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEAREST] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_NEAREST] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_NEAREST] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_NEAREST] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_NEAREST] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_NEAREST] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_NEAREST] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_NEAREST] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_NEAREST] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_NEAREST] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_NEAREST] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_NEAREST] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_NEAREST] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_NEAREST] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_NEAREST] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_NEAREST] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_NEAREST] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_NEAREST] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_NEAREST] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_NEAREST] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_NEAREST] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_NEAREST] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_NEAREST] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_NEAREST] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_NEAREST] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEAREST] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_NEAREST] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_NEAREST] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_NEAREST] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_NEAREST] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_NEAREST] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_NEAREST] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_NEAREST] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_NEAREST] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_NEAREST] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_NEAREST] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_NEAREST] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_NEAREST] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_NEAREST] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_NEAREST] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_NEAREST] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_NEAREST] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_NEAREST] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_NEAREST] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_NEAREST] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_NEAREST] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_NEAREST] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_NEAREST] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_NEAREST] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_NEAREST] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_NEAREST] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_NEAREST] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_NEAREST] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_NEAREST] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_NEAREST] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_NEAREST] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_NEAREST] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_NEAREST] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_NEAREST] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_NEAREST] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_NEAREST] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_NEAREST] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_NEAREST] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_NEAREST] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEAREST] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_NEAREST] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_NEAREST] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_NEAREST] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_NEAREST] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_NEAREST] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_NEAREST] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_NEAREST] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_NEAREST] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_NEAREST] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_NEAREST] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_NEAREST] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_NEAREST] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_NEAREST] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_NEAREST] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_NEAREST] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_NEAREST] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_NEAREST] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_NEAREST] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_NEAREST] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_NEAREST] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_NEAREST] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_NEAREST] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_NEAREST] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_NEAREST] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEAREST] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_NEAREST] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_NEAREST] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_NEAREST] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_NEAREST] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_NEAREST] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_NEAREST] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_NEAREST] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_NEAREST] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_NEAREST] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_NEAREST] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_NEAREST] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_NEAREST] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_NEAREST] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_NEAREST] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_NEAREST] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_NEAREST] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_NEAREST] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_NEAREST] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_NEAREST] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_NEAREST] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_NEAREST] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_NEAREST] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_NEAREST] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_NEAREST] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_NEAREST] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_NEAREST] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_NEAREST] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_NEAREST] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_NEAREST] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_NEAREST] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_NEAREST] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_NEAREST] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_NEAREST] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_NEAREST] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_NEAREST] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_NEAREST] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_NEAREST] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_NEAREST] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_NEAREST] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEAREST] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_NEAREST] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_NEAREST] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_NEAREST] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_NEAREST] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_NEAREST] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_NEAREST] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_NEAREST] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_NEAREST] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_NEAREST] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_NEAREST] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_NEAREST] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_NEAREST] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_NEAREST] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_NEAREST] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_NEAREST] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_NEAREST] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_NEAREST] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_NEAREST] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_NEAREST] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_NEAREST] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_NEAREST] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_NEAREST] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_NEAREST] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_NEAREST] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEAREST] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_NEAREST] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_NEAREST] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_NEAREST] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_NEAREST] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_NEAREST] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_NEAREST] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_NEAREST] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_NEAREST] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_NEAREST] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_NEAREST] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_NEAREST] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_NEAREST] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_NEAREST] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_NEAREST] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_NEAREST] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_NEAREST] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_NEAREST] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_NEAREST] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_NEAREST] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_NEAREST] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_NEAREST] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_NEAREST] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_NEAREST] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_NEAREST] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_NEAREST] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_NEAREST] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_NEAREST] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_NEAREST] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_NEAREST] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_NEAREST] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_NEAREST] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_NEAREST] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_NEAREST] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_NEAREST] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_NEAREST] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_NEAREST] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_NEAREST] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_NEAREST] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEAREST] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_NEAREST] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_NEAREST] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_NEAREST] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_NEAREST] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_NEAREST] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_NEAREST] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_NEAREST] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_NEAREST] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_NEAREST] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_NEAREST] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_NEAREST] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_NEAREST] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_NEAREST] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_NEAREST] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_NEAREST] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_NEAREST] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_NEAREST] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_NEAREST] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_NEAREST] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_NEAREST] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_NEAREST] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_NEAREST] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_NEAREST] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_NEAREST] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEAREST] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_NEAREST] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_NEAREST] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_NEAREST] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_NEAREST] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_NEAREST] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_NEAREST] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_NEAREST] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_NEAREST] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_NEAREST] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_NEAREST] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_NEAREST] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_NEAREST] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_NEAREST] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_NEAREST] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_NEAREST] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_NEAREST] --> [Overflow,2147483904] --> OK [~0.2147500032E10,TO_NEGINF] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_NEGINF] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_NEGINF] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_NEGINF] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_NEGINF] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_NEGINF] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_NEGINF] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_NEGINF] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_NEGINF] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_NEGINF] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_NEGINF] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_NEGINF] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_NEGINF] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_NEGINF] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_NEGINF] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_NEGINF] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_NEGINF] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_NEGINF] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_NEGINF] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_NEGINF] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_NEGINF] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_NEGINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEGINF] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_NEGINF] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_NEGINF] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_NEGINF] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_NEGINF] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_NEGINF] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_NEGINF] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_NEGINF] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_NEGINF] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_NEGINF] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_NEGINF] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_NEGINF] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_NEGINF] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_NEGINF] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_NEGINF] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_NEGINF] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_NEGINF] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_NEGINF] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_NEGINF] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_NEGINF] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_NEGINF] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_NEGINF] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_NEGINF] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_NEGINF] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_NEGINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEGINF] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_NEGINF] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_NEGINF] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_NEGINF] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_NEGINF] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_NEGINF] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_NEGINF] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_NEGINF] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_NEGINF] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_NEGINF] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_NEGINF] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_NEGINF] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_NEGINF] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_NEGINF] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_NEGINF] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_NEGINF] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_NEGINF] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_NEGINF] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_NEGINF] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_NEGINF] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_NEGINF] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_NEGINF] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_NEGINF] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_NEGINF] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_NEGINF] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_NEGINF] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_NEGINF] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_NEGINF] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_NEGINF] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_NEGINF] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_NEGINF] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_NEGINF] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_NEGINF] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_NEGINF] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_NEGINF] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_NEGINF] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_NEGINF] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_NEGINF] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_NEGINF] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_NEGINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEGINF] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_NEGINF] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_NEGINF] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_NEGINF] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_NEGINF] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_NEGINF] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_NEGINF] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_NEGINF] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_NEGINF] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_NEGINF] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_NEGINF] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_NEGINF] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_NEGINF] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_NEGINF] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_NEGINF] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_NEGINF] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_NEGINF] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_NEGINF] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_NEGINF] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_NEGINF] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_NEGINF] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_NEGINF] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_NEGINF] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_NEGINF] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_NEGINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEGINF] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_NEGINF] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_NEGINF] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_NEGINF] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_NEGINF] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_NEGINF] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_NEGINF] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_NEGINF] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_NEGINF] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_NEGINF] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_NEGINF] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_NEGINF] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_NEGINF] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_NEGINF] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_NEGINF] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_NEGINF] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_NEGINF] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_NEGINF] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_NEGINF] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_NEGINF] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_NEGINF] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_NEGINF] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_NEGINF] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_NEGINF] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_NEGINF] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_NEGINF] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_NEGINF] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_NEGINF] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_NEGINF] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_NEGINF] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_NEGINF] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_NEGINF] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_NEGINF] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_NEGINF] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_NEGINF] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_NEGINF] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_NEGINF] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_NEGINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEGINF] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_NEGINF] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_NEGINF] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_NEGINF] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_NEGINF] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_NEGINF] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_NEGINF] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_NEGINF] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_NEGINF] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_NEGINF] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_NEGINF] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_NEGINF] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_NEGINF] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_NEGINF] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_NEGINF] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_NEGINF] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_NEGINF] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_NEGINF] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_NEGINF] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_NEGINF] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_NEGINF] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_NEGINF] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_NEGINF] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_NEGINF] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_NEGINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEGINF] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_NEGINF] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_NEGINF] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_NEGINF] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_NEGINF] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_NEGINF] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_NEGINF] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_NEGINF] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_NEGINF] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_NEGINF] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_NEGINF] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_NEGINF] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_NEGINF] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_NEGINF] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_NEGINF] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_NEGINF] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_NEGINF] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_NEGINF] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_NEGINF] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_NEGINF] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_NEGINF] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_NEGINF] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_NEGINF] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_NEGINF] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_NEGINF] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_NEGINF] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_NEGINF] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_NEGINF] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_NEGINF] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_NEGINF] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_NEGINF] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_NEGINF] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_NEGINF] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_NEGINF] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_NEGINF] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_NEGINF] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_NEGINF] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_NEGINF] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_NEGINF] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_NEGINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEGINF] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_NEGINF] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_NEGINF] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_NEGINF] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_NEGINF] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_NEGINF] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_NEGINF] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_NEGINF] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_NEGINF] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_NEGINF] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_NEGINF] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_NEGINF] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_NEGINF] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_NEGINF] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_NEGINF] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_NEGINF] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_NEGINF] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_NEGINF] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_NEGINF] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_NEGINF] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_NEGINF] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_NEGINF] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_NEGINF] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_NEGINF] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_NEGINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEGINF] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_NEGINF] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_NEGINF] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_NEGINF] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_NEGINF] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_NEGINF] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_NEGINF] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_NEGINF] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_NEGINF] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_NEGINF] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_NEGINF] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_NEGINF] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_NEGINF] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_NEGINF] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_NEGINF] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_NEGINF] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_NEGINF] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_NEGINF] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_NEGINF] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_NEGINF] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_NEGINF] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_NEGINF] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_NEGINF] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_NEGINF] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_NEGINF] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_NEGINF] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_NEGINF] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_NEGINF] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_NEGINF] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_NEGINF] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_NEGINF] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_NEGINF] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_NEGINF] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_NEGINF] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_NEGINF] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_NEGINF] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_NEGINF] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_NEGINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEGINF] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_NEGINF] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_NEGINF] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_NEGINF] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_NEGINF] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_NEGINF] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_NEGINF] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_NEGINF] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_NEGINF] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_NEGINF] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_NEGINF] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_NEGINF] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_NEGINF] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_NEGINF] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_NEGINF] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_NEGINF] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_NEGINF] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_NEGINF] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_NEGINF] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_NEGINF] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_NEGINF] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_NEGINF] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_NEGINF] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_NEGINF] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_NEGINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEGINF] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_NEGINF] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_NEGINF] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_NEGINF] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_NEGINF] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_NEGINF] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_NEGINF] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_NEGINF] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_NEGINF] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_NEGINF] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_NEGINF] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_NEGINF] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_NEGINF] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_NEGINF] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_NEGINF] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_NEGINF] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_NEGINF] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_NEGINF] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_NEGINF] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_NEGINF] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_NEGINF] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_NEGINF] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_NEGINF] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_NEGINF] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_NEGINF] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_NEGINF] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_NEGINF] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_NEGINF] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_NEGINF] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_NEGINF] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_NEGINF] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_NEGINF] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_NEGINF] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_NEGINF] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_NEGINF] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_NEGINF] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_NEGINF] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_NEGINF] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_NEGINF] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_NEGINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEGINF] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_NEGINF] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_NEGINF] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_NEGINF] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_NEGINF] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_NEGINF] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_NEGINF] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_NEGINF] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_NEGINF] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_NEGINF] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_NEGINF] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_NEGINF] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_NEGINF] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_NEGINF] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_NEGINF] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_NEGINF] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_NEGINF] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_NEGINF] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_NEGINF] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_NEGINF] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_NEGINF] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_NEGINF] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_NEGINF] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_NEGINF] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_NEGINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEGINF] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_NEGINF] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_NEGINF] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_NEGINF] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_NEGINF] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_NEGINF] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_NEGINF] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_NEGINF] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_NEGINF] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_NEGINF] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_NEGINF] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_NEGINF] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_NEGINF] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_NEGINF] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_NEGINF] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_NEGINF] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_NEGINF] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_NEGINF] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_NEGINF] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_NEGINF] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_NEGINF] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_NEGINF] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_NEGINF] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_NEGINF] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_NEGINF] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_NEGINF] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_NEGINF] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_NEGINF] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_NEGINF] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_NEGINF] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_NEGINF] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_NEGINF] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_NEGINF] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_NEGINF] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_NEGINF] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_NEGINF] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_NEGINF] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_NEGINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_NEGINF] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_NEGINF] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_NEGINF] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_NEGINF] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_NEGINF] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_NEGINF] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_NEGINF] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_NEGINF] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_NEGINF] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_NEGINF] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_NEGINF] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_NEGINF] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_NEGINF] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_NEGINF] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_NEGINF] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_NEGINF] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_NEGINF] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_NEGINF] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_NEGINF] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_NEGINF] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_NEGINF] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_NEGINF] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_NEGINF] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_NEGINF] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_NEGINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_NEGINF] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_NEGINF] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_NEGINF] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_NEGINF] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_NEGINF] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_NEGINF] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_NEGINF] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_NEGINF] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_NEGINF] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_NEGINF] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_NEGINF] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_NEGINF] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_NEGINF] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_NEGINF] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_NEGINF] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_NEGINF] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_NEGINF] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_NEGINF] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_NEGINF] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_NEGINF] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_NEGINF] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_NEGINF] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_NEGINF] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_NEGINF] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_NEGINF] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_NEGINF] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_NEGINF] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_NEGINF] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_NEGINF] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_NEGINF] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_NEGINF] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_NEGINF] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_NEGINF] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_NEGINF] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_NEGINF] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_NEGINF] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_NEGINF] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_NEGINF] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_NEGINF] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_NEGINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_NEGINF] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_NEGINF] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_NEGINF] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_NEGINF] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_NEGINF] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_NEGINF] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_NEGINF] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_NEGINF] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_NEGINF] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_NEGINF] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_NEGINF] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_NEGINF] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_NEGINF] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_NEGINF] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_NEGINF] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_NEGINF] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_NEGINF] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_NEGINF] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_NEGINF] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_NEGINF] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_NEGINF] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_NEGINF] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_NEGINF] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_NEGINF] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_NEGINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_NEGINF] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_NEGINF] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_NEGINF] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_NEGINF] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_NEGINF] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_NEGINF] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_NEGINF] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_NEGINF] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_NEGINF] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_NEGINF] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_NEGINF] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_NEGINF] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_NEGINF] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_NEGINF] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_NEGINF] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_NEGINF] --> [~2147483520,~2147483520] --> OK [~0.2113937408E10,TO_NEGINF] --> [~2113937408,~2113937408] --> OK [~0.211393728E10,TO_NEGINF] --> [~2113937280,~2113937280] --> OK [~0.2113937152E10,TO_NEGINF] --> [~2113937152,~2113937152] --> OK [~0.2113937024E10,TO_NEGINF] --> [~2113937024,~2113937024] --> OK [~0.2113936896E10,TO_NEGINF] --> [~2113936896,~2113936896] --> OK [~0.2113936768E10,TO_NEGINF] --> [~2113936768,~2113936768] --> OK [~0.211393664E10,TO_NEGINF] --> [~2113936640,~2113936640] --> OK [~0.2113936512E10,TO_NEGINF] --> [~2113936512,~2113936512] --> OK [~0.2113936384E10,TO_NEGINF] --> [~2113936384,~2113936384] --> OK [~0.2113936256E10,TO_NEGINF] --> [~2113936256,~2113936256] --> OK [~0.2113936128E10,TO_NEGINF] --> [~2113936128,~2113936128] --> OK [~0.2113936E10,TO_NEGINF] --> [~2113936000,~2113936000] --> OK [~0.2113935872E10,TO_NEGINF] --> [~2113935872,~2113935872] --> OK [~0.2113935744E10,TO_NEGINF] --> [~2113935744,~2113935744] --> OK [~0.2113935616E10,TO_NEGINF] --> [~2113935616,~2113935616] --> OK [~0.2113935488E10,TO_NEGINF] --> [~2113935488,~2113935488] --> OK [~0.211393536E10,TO_NEGINF] --> [~2113935360,~2113935360] --> OK [~0.2113935232E10,TO_NEGINF] --> [~2113935232,~2113935232] --> OK [~0.2113935104E10,TO_NEGINF] --> [~2113935104,~2113935104] --> OK [~0.2113934976E10,TO_NEGINF] --> [~2113934976,~2113934976] --> OK [~0.2113934848E10,TO_NEGINF] --> [~2113934848,~2113934848] --> OK [~0.211393472E10,TO_NEGINF] --> [~2113934720,~2113934720] --> OK [~0.2113934592E10,TO_NEGINF] --> [~2113934592,~2113934592] --> OK [~0.2113934464E10,TO_NEGINF] --> [~2113934464,~2113934464] --> OK [~0.2113934336E10,TO_NEGINF] --> [~2113934336,~2113934336] --> OK [~0.2113934208E10,TO_NEGINF] --> [~2113934208,~2113934208] --> OK [~0.211393408E10,TO_NEGINF] --> [~2113934080,~2113934080] --> OK [~0.2113933952E10,TO_NEGINF] --> [~2113933952,~2113933952] --> OK [~0.2113933824E10,TO_NEGINF] --> [~2113933824,~2113933824] --> OK [~0.2113933696E10,TO_NEGINF] --> [~2113933696,~2113933696] --> OK [~0.2113933568E10,TO_NEGINF] --> [~2113933568,~2113933568] --> OK [~0.211393344E10,TO_NEGINF] --> [~2113933440,~2113933440] --> OK [~0.2113933312E10,TO_NEGINF] --> [~2113933312,~2113933312] --> OK [~0.2113933184E10,TO_NEGINF] --> [~2113933184,~2113933184] --> OK [~0.2113933056E10,TO_NEGINF] --> [~2113933056,~2113933056] --> OK [~0.2113932928E10,TO_NEGINF] --> [~2113932928,~2113932928] --> OK [~0.21139328E10,TO_NEGINF] --> [~2113932800,~2113932800] --> OK [~0.2113932672E10,TO_NEGINF] --> [~2113932672,~2113932672] --> OK [~0.2113932544E10,TO_NEGINF] --> [~2113932544,~2113932544] --> OK [~0.2113932416E10,TO_NEGINF] --> [~2113932416,~2113932416] --> OK [~0.2113932288E10,TO_NEGINF] --> [~2113932288,~2113932288] --> OK [~0.211393216E10,TO_NEGINF] --> [~2113932160,~2113932160] --> OK [~0.2113932032E10,TO_NEGINF] --> [~2113932032,~2113932032] --> OK [~0.2113931904E10,TO_NEGINF] --> [~2113931904,~2113931904] --> OK [~0.2113931776E10,TO_NEGINF] --> [~2113931776,~2113931776] --> OK [~0.2113931648E10,TO_NEGINF] --> [~2113931648,~2113931648] --> OK [~0.211393152E10,TO_NEGINF] --> [~2113931520,~2113931520] --> OK [~0.2113931392E10,TO_NEGINF] --> [~2113931392,~2113931392] --> OK [~0.2113931264E10,TO_NEGINF] --> [~2113931264,~2113931264] --> OK [~0.2113931136E10,TO_NEGINF] --> [~2113931136,~2113931136] --> OK [~0.2113931008E10,TO_NEGINF] --> [~2113931008,~2113931008] --> OK [~0.211393088E10,TO_NEGINF] --> [~2113930880,~2113930880] --> OK [~0.2113930752E10,TO_NEGINF] --> [~2113930752,~2113930752] --> OK [~0.2113930624E10,TO_NEGINF] --> [~2113930624,~2113930624] --> OK [~0.2113930496E10,TO_NEGINF] --> [~2113930496,~2113930496] --> OK [~0.2113930368E10,TO_NEGINF] --> [~2113930368,~2113930368] --> OK [~0.211393024E10,TO_NEGINF] --> [~2113930240,~2113930240] --> OK [~0.2113930112E10,TO_NEGINF] --> [~2113930112,~2113930112] --> OK [~0.2113929984E10,TO_NEGINF] --> [~2113929984,~2113929984] --> OK [~0.2113929856E10,TO_NEGINF] --> [~2113929856,~2113929856] --> OK [~0.2113929728E10,TO_NEGINF] --> [~2113929728,~2113929728] --> OK [~0.21139296E10,TO_NEGINF] --> [~2113929600,~2113929600] --> OK [~0.2113929472E10,TO_NEGINF] --> [~2113929472,~2113929472] --> OK [~0.2113929344E10,TO_NEGINF] --> [~2113929344,~2113929344] --> OK [~0.2113929216E10,TO_NEGINF] --> [~2113929216,~2113929216] --> OK [~0.2113921024E10,TO_NEGINF] --> [~2113921024,~2113921024] --> OK [~0.2113921152E10,TO_NEGINF] --> [~2113921152,~2113921152] --> OK [~0.211392128E10,TO_NEGINF] --> [~2113921280,~2113921280] --> OK [~0.2113921408E10,TO_NEGINF] --> [~2113921408,~2113921408] --> OK [~0.2113921536E10,TO_NEGINF] --> [~2113921536,~2113921536] --> OK [~0.2113921664E10,TO_NEGINF] --> [~2113921664,~2113921664] --> OK [~0.2113921792E10,TO_NEGINF] --> [~2113921792,~2113921792] --> OK [~0.211392192E10,TO_NEGINF] --> [~2113921920,~2113921920] --> OK [~0.2113922048E10,TO_NEGINF] --> [~2113922048,~2113922048] --> OK [~0.2113922176E10,TO_NEGINF] --> [~2113922176,~2113922176] --> OK [~0.2113922304E10,TO_NEGINF] --> [~2113922304,~2113922304] --> OK [~0.2113922432E10,TO_NEGINF] --> [~2113922432,~2113922432] --> OK [~0.211392256E10,TO_NEGINF] --> [~2113922560,~2113922560] --> OK [~0.2113922688E10,TO_NEGINF] --> [~2113922688,~2113922688] --> OK [~0.2113922816E10,TO_NEGINF] --> [~2113922816,~2113922816] --> OK [~0.2113922944E10,TO_NEGINF] --> [~2113922944,~2113922944] --> OK [~0.2113923072E10,TO_NEGINF] --> [~2113923072,~2113923072] --> OK [~0.21139232E10,TO_NEGINF] --> [~2113923200,~2113923200] --> OK [~0.2113923328E10,TO_NEGINF] --> [~2113923328,~2113923328] --> OK [~0.2113923456E10,TO_NEGINF] --> [~2113923456,~2113923456] --> OK [~0.2113923584E10,TO_NEGINF] --> [~2113923584,~2113923584] --> OK [~0.2113923712E10,TO_NEGINF] --> [~2113923712,~2113923712] --> OK [~0.211392384E10,TO_NEGINF] --> [~2113923840,~2113923840] --> OK [~0.2113923968E10,TO_NEGINF] --> [~2113923968,~2113923968] --> OK [~0.2113924096E10,TO_NEGINF] --> [~2113924096,~2113924096] --> OK [~0.2113924224E10,TO_NEGINF] --> [~2113924224,~2113924224] --> OK [~0.2113924352E10,TO_NEGINF] --> [~2113924352,~2113924352] --> OK [~0.211392448E10,TO_NEGINF] --> [~2113924480,~2113924480] --> OK [~0.2113924608E10,TO_NEGINF] --> [~2113924608,~2113924608] --> OK [~0.2113924736E10,TO_NEGINF] --> [~2113924736,~2113924736] --> OK [~0.2113924864E10,TO_NEGINF] --> [~2113924864,~2113924864] --> OK [~0.2113924992E10,TO_NEGINF] --> [~2113924992,~2113924992] --> OK [~0.211392512E10,TO_NEGINF] --> [~2113925120,~2113925120] --> OK [~0.2113925248E10,TO_NEGINF] --> [~2113925248,~2113925248] --> OK [~0.2113925376E10,TO_NEGINF] --> [~2113925376,~2113925376] --> OK [~0.2113925504E10,TO_NEGINF] --> [~2113925504,~2113925504] --> OK [~0.2113925632E10,TO_NEGINF] --> [~2113925632,~2113925632] --> OK [~0.211392576E10,TO_NEGINF] --> [~2113925760,~2113925760] --> OK [~0.2113925888E10,TO_NEGINF] --> [~2113925888,~2113925888] --> OK [~0.2113926016E10,TO_NEGINF] --> [~2113926016,~2113926016] --> OK [~0.2113926144E10,TO_NEGINF] --> [~2113926144,~2113926144] --> OK [~0.2113926272E10,TO_NEGINF] --> [~2113926272,~2113926272] --> OK [~0.21139264E10,TO_NEGINF] --> [~2113926400,~2113926400] --> OK [~0.2113926528E10,TO_NEGINF] --> [~2113926528,~2113926528] --> OK [~0.2113926656E10,TO_NEGINF] --> [~2113926656,~2113926656] --> OK [~0.2113926784E10,TO_NEGINF] --> [~2113926784,~2113926784] --> OK [~0.2113926912E10,TO_NEGINF] --> [~2113926912,~2113926912] --> OK [~0.211392704E10,TO_NEGINF] --> [~2113927040,~2113927040] --> OK [~0.2113927168E10,TO_NEGINF] --> [~2113927168,~2113927168] --> OK [~0.2113927296E10,TO_NEGINF] --> [~2113927296,~2113927296] --> OK [~0.2113927424E10,TO_NEGINF] --> [~2113927424,~2113927424] --> OK [~0.2113927552E10,TO_NEGINF] --> [~2113927552,~2113927552] --> OK [~0.211392768E10,TO_NEGINF] --> [~2113927680,~2113927680] --> OK [~0.2113927808E10,TO_NEGINF] --> [~2113927808,~2113927808] --> OK [~0.2113927936E10,TO_NEGINF] --> [~2113927936,~2113927936] --> OK [~0.2113928064E10,TO_NEGINF] --> [~2113928064,~2113928064] --> OK [~0.2113928192E10,TO_NEGINF] --> [~2113928192,~2113928192] --> OK [~0.211392832E10,TO_NEGINF] --> [~2113928320,~2113928320] --> OK [~0.2113928448E10,TO_NEGINF] --> [~2113928448,~2113928448] --> OK [~0.2113928576E10,TO_NEGINF] --> [~2113928576,~2113928576] --> OK [~0.2113928704E10,TO_NEGINF] --> [~2113928704,~2113928704] --> OK [~0.2113928832E10,TO_NEGINF] --> [~2113928832,~2113928832] --> OK [~0.211392896E10,TO_NEGINF] --> [~2113928960,~2113928960] --> OK [~0.2113929088E10,TO_NEGINF] --> [~2113929088,~2113929088] --> OK [~0.2080382976E10,TO_NEGINF] --> [~2080382976,~2080382976] --> OK [~0.2080382848E10,TO_NEGINF] --> [~2080382848,~2080382848] --> OK [~0.208038272E10,TO_NEGINF] --> [~2080382720,~2080382720] --> OK [~0.2080382592E10,TO_NEGINF] --> [~2080382592,~2080382592] --> OK [~0.2080382464E10,TO_NEGINF] --> [~2080382464,~2080382464] --> OK [~0.2080382336E10,TO_NEGINF] --> [~2080382336,~2080382336] --> OK [~0.2080382208E10,TO_NEGINF] --> [~2080382208,~2080382208] --> OK [~0.208038208E10,TO_NEGINF] --> [~2080382080,~2080382080] --> OK [~0.2080381952E10,TO_NEGINF] --> [~2080381952,~2080381952] --> OK [~0.2080381824E10,TO_NEGINF] --> [~2080381824,~2080381824] --> OK [~0.2080381696E10,TO_NEGINF] --> [~2080381696,~2080381696] --> OK [~0.2080381568E10,TO_NEGINF] --> [~2080381568,~2080381568] --> OK [~0.208038144E10,TO_NEGINF] --> [~2080381440,~2080381440] --> OK [~0.2080381312E10,TO_NEGINF] --> [~2080381312,~2080381312] --> OK [~0.2080381184E10,TO_NEGINF] --> [~2080381184,~2080381184] --> OK [~0.2080381056E10,TO_NEGINF] --> [~2080381056,~2080381056] --> OK [~0.2080380928E10,TO_NEGINF] --> [~2080380928,~2080380928] --> OK [~0.20803808E10,TO_NEGINF] --> [~2080380800,~2080380800] --> OK [~0.2080380672E10,TO_NEGINF] --> [~2080380672,~2080380672] --> OK [~0.2080380544E10,TO_NEGINF] --> [~2080380544,~2080380544] --> OK [~0.2080380416E10,TO_NEGINF] --> [~2080380416,~2080380416] --> OK [~0.2080380288E10,TO_NEGINF] --> [~2080380288,~2080380288] --> OK [~0.208038016E10,TO_NEGINF] --> [~2080380160,~2080380160] --> OK [~0.2080380032E10,TO_NEGINF] --> [~2080380032,~2080380032] --> OK [~0.2080379904E10,TO_NEGINF] --> [~2080379904,~2080379904] --> OK [~0.2080379776E10,TO_NEGINF] --> [~2080379776,~2080379776] --> OK [~0.2080379648E10,TO_NEGINF] --> [~2080379648,~2080379648] --> OK [~0.208037952E10,TO_NEGINF] --> [~2080379520,~2080379520] --> OK [~0.2080379392E10,TO_NEGINF] --> [~2080379392,~2080379392] --> OK [~0.2080379264E10,TO_NEGINF] --> [~2080379264,~2080379264] --> OK [~0.2080379136E10,TO_NEGINF] --> [~2080379136,~2080379136] --> OK [~0.2080379008E10,TO_NEGINF] --> [~2080379008,~2080379008] --> OK [~0.208037888E10,TO_NEGINF] --> [~2080378880,~2080378880] --> OK [~0.2080378752E10,TO_NEGINF] --> [~2080378752,~2080378752] --> OK [~0.2080378624E10,TO_NEGINF] --> [~2080378624,~2080378624] --> OK [~0.2080378496E10,TO_NEGINF] --> [~2080378496,~2080378496] --> OK [~0.2080378368E10,TO_NEGINF] --> [~2080378368,~2080378368] --> OK [~0.208037824E10,TO_NEGINF] --> [~2080378240,~2080378240] --> OK [~0.2080378112E10,TO_NEGINF] --> [~2080378112,~2080378112] --> OK [~0.2080377984E10,TO_NEGINF] --> [~2080377984,~2080377984] --> OK [~0.2080377856E10,TO_NEGINF] --> [~2080377856,~2080377856] --> OK [~0.2080377728E10,TO_NEGINF] --> [~2080377728,~2080377728] --> OK [~0.20803776E10,TO_NEGINF] --> [~2080377600,~2080377600] --> OK [~0.2080377472E10,TO_NEGINF] --> [~2080377472,~2080377472] --> OK [~0.2080377344E10,TO_NEGINF] --> [~2080377344,~2080377344] --> OK [~0.2080377216E10,TO_NEGINF] --> [~2080377216,~2080377216] --> OK [~0.2080377088E10,TO_NEGINF] --> [~2080377088,~2080377088] --> OK [~0.208037696E10,TO_NEGINF] --> [~2080376960,~2080376960] --> OK [~0.2080376832E10,TO_NEGINF] --> [~2080376832,~2080376832] --> OK [~0.2080376704E10,TO_NEGINF] --> [~2080376704,~2080376704] --> OK [~0.2080376576E10,TO_NEGINF] --> [~2080376576,~2080376576] --> OK [~0.2080376448E10,TO_NEGINF] --> [~2080376448,~2080376448] --> OK [~0.208037632E10,TO_NEGINF] --> [~2080376320,~2080376320] --> OK [~0.2080376192E10,TO_NEGINF] --> [~2080376192,~2080376192] --> OK [~0.2080376064E10,TO_NEGINF] --> [~2080376064,~2080376064] --> OK [~0.2080375936E10,TO_NEGINF] --> [~2080375936,~2080375936] --> OK [~0.2080375808E10,TO_NEGINF] --> [~2080375808,~2080375808] --> OK [~0.208037568E10,TO_NEGINF] --> [~2080375680,~2080375680] --> OK [~0.2080375552E10,TO_NEGINF] --> [~2080375552,~2080375552] --> OK [~0.2080375424E10,TO_NEGINF] --> [~2080375424,~2080375424] --> OK [~0.2080375296E10,TO_NEGINF] --> [~2080375296,~2080375296] --> OK [~0.2080375168E10,TO_NEGINF] --> [~2080375168,~2080375168] --> OK [~0.208037504E10,TO_NEGINF] --> [~2080375040,~2080375040] --> OK [~0.2080374912E10,TO_NEGINF] --> [~2080374912,~2080374912] --> OK [~0.2080374784E10,TO_NEGINF] --> [~2080374784,~2080374784] --> OK [~0.2080366592E10,TO_NEGINF] --> [~2080366592,~2080366592] --> OK [~0.208036672E10,TO_NEGINF] --> [~2080366720,~2080366720] --> OK [~0.2080366848E10,TO_NEGINF] --> [~2080366848,~2080366848] --> OK [~0.2080366976E10,TO_NEGINF] --> [~2080366976,~2080366976] --> OK [~0.2080367104E10,TO_NEGINF] --> [~2080367104,~2080367104] --> OK [~0.2080367232E10,TO_NEGINF] --> [~2080367232,~2080367232] --> OK [~0.208036736E10,TO_NEGINF] --> [~2080367360,~2080367360] --> OK [~0.2080367488E10,TO_NEGINF] --> [~2080367488,~2080367488] --> OK [~0.2080367616E10,TO_NEGINF] --> [~2080367616,~2080367616] --> OK [~0.2080367744E10,TO_NEGINF] --> [~2080367744,~2080367744] --> OK [~0.2080367872E10,TO_NEGINF] --> [~2080367872,~2080367872] --> OK [~0.2080368E10,TO_NEGINF] --> [~2080368000,~2080368000] --> OK [~0.2080368128E10,TO_NEGINF] --> [~2080368128,~2080368128] --> OK [~0.2080368256E10,TO_NEGINF] --> [~2080368256,~2080368256] --> OK [~0.2080368384E10,TO_NEGINF] --> [~2080368384,~2080368384] --> OK [~0.2080368512E10,TO_NEGINF] --> [~2080368512,~2080368512] --> OK [~0.208036864E10,TO_NEGINF] --> [~2080368640,~2080368640] --> OK [~0.2080368768E10,TO_NEGINF] --> [~2080368768,~2080368768] --> OK [~0.2080368896E10,TO_NEGINF] --> [~2080368896,~2080368896] --> OK [~0.2080369024E10,TO_NEGINF] --> [~2080369024,~2080369024] --> OK [~0.2080369152E10,TO_NEGINF] --> [~2080369152,~2080369152] --> OK [~0.208036928E10,TO_NEGINF] --> [~2080369280,~2080369280] --> OK [~0.2080369408E10,TO_NEGINF] --> [~2080369408,~2080369408] --> OK [~0.2080369536E10,TO_NEGINF] --> [~2080369536,~2080369536] --> OK [~0.2080369664E10,TO_NEGINF] --> [~2080369664,~2080369664] --> OK [~0.2080369792E10,TO_NEGINF] --> [~2080369792,~2080369792] --> OK [~0.208036992E10,TO_NEGINF] --> [~2080369920,~2080369920] --> OK [~0.2080370048E10,TO_NEGINF] --> [~2080370048,~2080370048] --> OK [~0.2080370176E10,TO_NEGINF] --> [~2080370176,~2080370176] --> OK [~0.2080370304E10,TO_NEGINF] --> [~2080370304,~2080370304] --> OK [~0.2080370432E10,TO_NEGINF] --> [~2080370432,~2080370432] --> OK [~0.208037056E10,TO_NEGINF] --> [~2080370560,~2080370560] --> OK [~0.2080370688E10,TO_NEGINF] --> [~2080370688,~2080370688] --> OK [~0.2080370816E10,TO_NEGINF] --> [~2080370816,~2080370816] --> OK [~0.2080370944E10,TO_NEGINF] --> [~2080370944,~2080370944] --> OK [~0.2080371072E10,TO_NEGINF] --> [~2080371072,~2080371072] --> OK [~0.20803712E10,TO_NEGINF] --> [~2080371200,~2080371200] --> OK [~0.2080371328E10,TO_NEGINF] --> [~2080371328,~2080371328] --> OK [~0.2080371456E10,TO_NEGINF] --> [~2080371456,~2080371456] --> OK [~0.2080371584E10,TO_NEGINF] --> [~2080371584,~2080371584] --> OK [~0.2080371712E10,TO_NEGINF] --> [~2080371712,~2080371712] --> OK [~0.208037184E10,TO_NEGINF] --> [~2080371840,~2080371840] --> OK [~0.2080371968E10,TO_NEGINF] --> [~2080371968,~2080371968] --> OK [~0.2080372096E10,TO_NEGINF] --> [~2080372096,~2080372096] --> OK [~0.2080372224E10,TO_NEGINF] --> [~2080372224,~2080372224] --> OK [~0.2080372352E10,TO_NEGINF] --> [~2080372352,~2080372352] --> OK [~0.208037248E10,TO_NEGINF] --> [~2080372480,~2080372480] --> OK [~0.2080372608E10,TO_NEGINF] --> [~2080372608,~2080372608] --> OK [~0.2080372736E10,TO_NEGINF] --> [~2080372736,~2080372736] --> OK [~0.2080372864E10,TO_NEGINF] --> [~2080372864,~2080372864] --> OK [~0.2080372992E10,TO_NEGINF] --> [~2080372992,~2080372992] --> OK [~0.208037312E10,TO_NEGINF] --> [~2080373120,~2080373120] --> OK [~0.2080373248E10,TO_NEGINF] --> [~2080373248,~2080373248] --> OK [~0.2080373376E10,TO_NEGINF] --> [~2080373376,~2080373376] --> OK [~0.2080373504E10,TO_NEGINF] --> [~2080373504,~2080373504] --> OK [~0.2080373632E10,TO_NEGINF] --> [~2080373632,~2080373632] --> OK [~0.208037376E10,TO_NEGINF] --> [~2080373760,~2080373760] --> OK [~0.2080373888E10,TO_NEGINF] --> [~2080373888,~2080373888] --> OK [~0.2080374016E10,TO_NEGINF] --> [~2080374016,~2080374016] --> OK [~0.2080374144E10,TO_NEGINF] --> [~2080374144,~2080374144] --> OK [~0.2080374272E10,TO_NEGINF] --> [~2080374272,~2080374272] --> OK [~0.20803744E10,TO_NEGINF] --> [~2080374400,~2080374400] --> OK [~0.2080374528E10,TO_NEGINF] --> [~2080374528,~2080374528] --> OK [~0.2080374656E10,TO_NEGINF] --> [~2080374656,~2080374656] --> OK [~0.2013274112E10,TO_NEGINF] --> [~2013274112,~2013274112] --> OK [~0.2013273984E10,TO_NEGINF] --> [~2013273984,~2013273984] --> OK [~0.2013273856E10,TO_NEGINF] --> [~2013273856,~2013273856] --> OK [~0.2013273728E10,TO_NEGINF] --> [~2013273728,~2013273728] --> OK [~0.20132736E10,TO_NEGINF] --> [~2013273600,~2013273600] --> OK [~0.2013273472E10,TO_NEGINF] --> [~2013273472,~2013273472] --> OK [~0.2013273344E10,TO_NEGINF] --> [~2013273344,~2013273344] --> OK [~0.2013273216E10,TO_NEGINF] --> [~2013273216,~2013273216] --> OK [~0.2013273088E10,TO_NEGINF] --> [~2013273088,~2013273088] --> OK [~0.201327296E10,TO_NEGINF] --> [~2013272960,~2013272960] --> OK [~0.2013272832E10,TO_NEGINF] --> [~2013272832,~2013272832] --> OK [~0.2013272704E10,TO_NEGINF] --> [~2013272704,~2013272704] --> OK [~0.2013272576E10,TO_NEGINF] --> [~2013272576,~2013272576] --> OK [~0.2013272448E10,TO_NEGINF] --> [~2013272448,~2013272448] --> OK [~0.201327232E10,TO_NEGINF] --> [~2013272320,~2013272320] --> OK [~0.2013272192E10,TO_NEGINF] --> [~2013272192,~2013272192] --> OK [~0.2013272064E10,TO_NEGINF] --> [~2013272064,~2013272064] --> OK [~0.2013271936E10,TO_NEGINF] --> [~2013271936,~2013271936] --> OK [~0.2013271808E10,TO_NEGINF] --> [~2013271808,~2013271808] --> OK [~0.201327168E10,TO_NEGINF] --> [~2013271680,~2013271680] --> OK [~0.2013271552E10,TO_NEGINF] --> [~2013271552,~2013271552] --> OK [~0.2013271424E10,TO_NEGINF] --> [~2013271424,~2013271424] --> OK [~0.2013271296E10,TO_NEGINF] --> [~2013271296,~2013271296] --> OK [~0.2013271168E10,TO_NEGINF] --> [~2013271168,~2013271168] --> OK [~0.201327104E10,TO_NEGINF] --> [~2013271040,~2013271040] --> OK [~0.2013270912E10,TO_NEGINF] --> [~2013270912,~2013270912] --> OK [~0.2013270784E10,TO_NEGINF] --> [~2013270784,~2013270784] --> OK [~0.2013270656E10,TO_NEGINF] --> [~2013270656,~2013270656] --> OK [~0.2013270528E10,TO_NEGINF] --> [~2013270528,~2013270528] --> OK [~0.20132704E10,TO_NEGINF] --> [~2013270400,~2013270400] --> OK [~0.2013270272E10,TO_NEGINF] --> [~2013270272,~2013270272] --> OK [~0.2013270144E10,TO_NEGINF] --> [~2013270144,~2013270144] --> OK [~0.2013270016E10,TO_NEGINF] --> [~2013270016,~2013270016] --> OK [~0.2013269888E10,TO_NEGINF] --> [~2013269888,~2013269888] --> OK [~0.201326976E10,TO_NEGINF] --> [~2013269760,~2013269760] --> OK [~0.2013269632E10,TO_NEGINF] --> [~2013269632,~2013269632] --> OK [~0.2013269504E10,TO_NEGINF] --> [~2013269504,~2013269504] --> OK [~0.2013269376E10,TO_NEGINF] --> [~2013269376,~2013269376] --> OK [~0.2013269248E10,TO_NEGINF] --> [~2013269248,~2013269248] --> OK [~0.201326912E10,TO_NEGINF] --> [~2013269120,~2013269120] --> OK [~0.2013268992E10,TO_NEGINF] --> [~2013268992,~2013268992] --> OK [~0.2013268864E10,TO_NEGINF] --> [~2013268864,~2013268864] --> OK [~0.2013268736E10,TO_NEGINF] --> [~2013268736,~2013268736] --> OK [~0.2013268608E10,TO_NEGINF] --> [~2013268608,~2013268608] --> OK [~0.201326848E10,TO_NEGINF] --> [~2013268480,~2013268480] --> OK [~0.2013268352E10,TO_NEGINF] --> [~2013268352,~2013268352] --> OK [~0.2013268224E10,TO_NEGINF] --> [~2013268224,~2013268224] --> OK [~0.2013268096E10,TO_NEGINF] --> [~2013268096,~2013268096] --> OK [~0.2013267968E10,TO_NEGINF] --> [~2013267968,~2013267968] --> OK [~0.201326784E10,TO_NEGINF] --> [~2013267840,~2013267840] --> OK [~0.2013267712E10,TO_NEGINF] --> [~2013267712,~2013267712] --> OK [~0.2013267584E10,TO_NEGINF] --> [~2013267584,~2013267584] --> OK [~0.2013267456E10,TO_NEGINF] --> [~2013267456,~2013267456] --> OK [~0.2013267328E10,TO_NEGINF] --> [~2013267328,~2013267328] --> OK [~0.20132672E10,TO_NEGINF] --> [~2013267200,~2013267200] --> OK [~0.2013267072E10,TO_NEGINF] --> [~2013267072,~2013267072] --> OK [~0.2013266944E10,TO_NEGINF] --> [~2013266944,~2013266944] --> OK [~0.2013266816E10,TO_NEGINF] --> [~2013266816,~2013266816] --> OK [~0.2013266688E10,TO_NEGINF] --> [~2013266688,~2013266688] --> OK [~0.201326656E10,TO_NEGINF] --> [~2013266560,~2013266560] --> OK [~0.2013266432E10,TO_NEGINF] --> [~2013266432,~2013266432] --> OK [~0.2013266304E10,TO_NEGINF] --> [~2013266304,~2013266304] --> OK [~0.2013266176E10,TO_NEGINF] --> [~2013266176,~2013266176] --> OK [~0.2013266048E10,TO_NEGINF] --> [~2013266048,~2013266048] --> OK [~0.201326592E10,TO_NEGINF] --> [~2013265920,~2013265920] --> OK [~0.2013257728E10,TO_NEGINF] --> [~2013257728,~2013257728] --> OK [~0.2013257856E10,TO_NEGINF] --> [~2013257856,~2013257856] --> OK [~0.2013257984E10,TO_NEGINF] --> [~2013257984,~2013257984] --> OK [~0.2013258112E10,TO_NEGINF] --> [~2013258112,~2013258112] --> OK [~0.201325824E10,TO_NEGINF] --> [~2013258240,~2013258240] --> OK [~0.2013258368E10,TO_NEGINF] --> [~2013258368,~2013258368] --> OK [~0.2013258496E10,TO_NEGINF] --> [~2013258496,~2013258496] --> OK [~0.2013258624E10,TO_NEGINF] --> [~2013258624,~2013258624] --> OK [~0.2013258752E10,TO_NEGINF] --> [~2013258752,~2013258752] --> OK [~0.201325888E10,TO_NEGINF] --> [~2013258880,~2013258880] --> OK [~0.2013259008E10,TO_NEGINF] --> [~2013259008,~2013259008] --> OK [~0.2013259136E10,TO_NEGINF] --> [~2013259136,~2013259136] --> OK [~0.2013259264E10,TO_NEGINF] --> [~2013259264,~2013259264] --> OK [~0.2013259392E10,TO_NEGINF] --> [~2013259392,~2013259392] --> OK [~0.201325952E10,TO_NEGINF] --> [~2013259520,~2013259520] --> OK [~0.2013259648E10,TO_NEGINF] --> [~2013259648,~2013259648] --> OK [~0.2013259776E10,TO_NEGINF] --> [~2013259776,~2013259776] --> OK [~0.2013259904E10,TO_NEGINF] --> [~2013259904,~2013259904] --> OK [~0.2013260032E10,TO_NEGINF] --> [~2013260032,~2013260032] --> OK [~0.201326016E10,TO_NEGINF] --> [~2013260160,~2013260160] --> OK [~0.2013260288E10,TO_NEGINF] --> [~2013260288,~2013260288] --> OK [~0.2013260416E10,TO_NEGINF] --> [~2013260416,~2013260416] --> OK [~0.2013260544E10,TO_NEGINF] --> [~2013260544,~2013260544] --> OK [~0.2013260672E10,TO_NEGINF] --> [~2013260672,~2013260672] --> OK [~0.20132608E10,TO_NEGINF] --> [~2013260800,~2013260800] --> OK [~0.2013260928E10,TO_NEGINF] --> [~2013260928,~2013260928] --> OK [~0.2013261056E10,TO_NEGINF] --> [~2013261056,~2013261056] --> OK [~0.2013261184E10,TO_NEGINF] --> [~2013261184,~2013261184] --> OK [~0.2013261312E10,TO_NEGINF] --> [~2013261312,~2013261312] --> OK [~0.201326144E10,TO_NEGINF] --> [~2013261440,~2013261440] --> OK [~0.2013261568E10,TO_NEGINF] --> [~2013261568,~2013261568] --> OK [~0.2013261696E10,TO_NEGINF] --> [~2013261696,~2013261696] --> OK [~0.2013261824E10,TO_NEGINF] --> [~2013261824,~2013261824] --> OK [~0.2013261952E10,TO_NEGINF] --> [~2013261952,~2013261952] --> OK [~0.201326208E10,TO_NEGINF] --> [~2013262080,~2013262080] --> OK [~0.2013262208E10,TO_NEGINF] --> [~2013262208,~2013262208] --> OK [~0.2013262336E10,TO_NEGINF] --> [~2013262336,~2013262336] --> OK [~0.2013262464E10,TO_NEGINF] --> [~2013262464,~2013262464] --> OK [~0.2013262592E10,TO_NEGINF] --> [~2013262592,~2013262592] --> OK [~0.201326272E10,TO_NEGINF] --> [~2013262720,~2013262720] --> OK [~0.2013262848E10,TO_NEGINF] --> [~2013262848,~2013262848] --> OK [~0.2013262976E10,TO_NEGINF] --> [~2013262976,~2013262976] --> OK [~0.2013263104E10,TO_NEGINF] --> [~2013263104,~2013263104] --> OK [~0.2013263232E10,TO_NEGINF] --> [~2013263232,~2013263232] --> OK [~0.201326336E10,TO_NEGINF] --> [~2013263360,~2013263360] --> OK [~0.2013263488E10,TO_NEGINF] --> [~2013263488,~2013263488] --> OK [~0.2013263616E10,TO_NEGINF] --> [~2013263616,~2013263616] --> OK [~0.2013263744E10,TO_NEGINF] --> [~2013263744,~2013263744] --> OK [~0.2013263872E10,TO_NEGINF] --> [~2013263872,~2013263872] --> OK [~0.2013264E10,TO_NEGINF] --> [~2013264000,~2013264000] --> OK [~0.2013264128E10,TO_NEGINF] --> [~2013264128,~2013264128] --> OK [~0.2013264256E10,TO_NEGINF] --> [~2013264256,~2013264256] --> OK [~0.2013264384E10,TO_NEGINF] --> [~2013264384,~2013264384] --> OK [~0.2013264512E10,TO_NEGINF] --> [~2013264512,~2013264512] --> OK [~0.201326464E10,TO_NEGINF] --> [~2013264640,~2013264640] --> OK [~0.2013264768E10,TO_NEGINF] --> [~2013264768,~2013264768] --> OK [~0.2013264896E10,TO_NEGINF] --> [~2013264896,~2013264896] --> OK [~0.2013265024E10,TO_NEGINF] --> [~2013265024,~2013265024] --> OK [~0.2013265152E10,TO_NEGINF] --> [~2013265152,~2013265152] --> OK [~0.201326528E10,TO_NEGINF] --> [~2013265280,~2013265280] --> OK [~0.2013265408E10,TO_NEGINF] --> [~2013265408,~2013265408] --> OK [~0.2013265536E10,TO_NEGINF] --> [~2013265536,~2013265536] --> OK [~0.2013265664E10,TO_NEGINF] --> [~2013265664,~2013265664] --> OK [~0.2013265792E10,TO_NEGINF] --> [~2013265792,~2013265792] --> OK [~0.1879056384E10,TO_NEGINF] --> [~1879056384,~1879056384] --> OK [~0.1879056256E10,TO_NEGINF] --> [~1879056256,~1879056256] --> OK [~0.1879056128E10,TO_NEGINF] --> [~1879056128,~1879056128] --> OK [~0.1879056E10,TO_NEGINF] --> [~1879056000,~1879056000] --> OK [~0.1879055872E10,TO_NEGINF] --> [~1879055872,~1879055872] --> OK [~0.1879055744E10,TO_NEGINF] --> [~1879055744,~1879055744] --> OK [~0.1879055616E10,TO_NEGINF] --> [~1879055616,~1879055616] --> OK [~0.1879055488E10,TO_NEGINF] --> [~1879055488,~1879055488] --> OK [~0.187905536E10,TO_NEGINF] --> [~1879055360,~1879055360] --> OK [~0.1879055232E10,TO_NEGINF] --> [~1879055232,~1879055232] --> OK [~0.1879055104E10,TO_NEGINF] --> [~1879055104,~1879055104] --> OK [~0.1879054976E10,TO_NEGINF] --> [~1879054976,~1879054976] --> OK [~0.1879054848E10,TO_NEGINF] --> [~1879054848,~1879054848] --> OK [~0.187905472E10,TO_NEGINF] --> [~1879054720,~1879054720] --> OK [~0.1879054592E10,TO_NEGINF] --> [~1879054592,~1879054592] --> OK [~0.1879054464E10,TO_NEGINF] --> [~1879054464,~1879054464] --> OK [~0.1879054336E10,TO_NEGINF] --> [~1879054336,~1879054336] --> OK [~0.1879054208E10,TO_NEGINF] --> [~1879054208,~1879054208] --> OK [~0.187905408E10,TO_NEGINF] --> [~1879054080,~1879054080] --> OK [~0.1879053952E10,TO_NEGINF] --> [~1879053952,~1879053952] --> OK [~0.1879053824E10,TO_NEGINF] --> [~1879053824,~1879053824] --> OK [~0.1879053696E10,TO_NEGINF] --> [~1879053696,~1879053696] --> OK [~0.1879053568E10,TO_NEGINF] --> [~1879053568,~1879053568] --> OK [~0.187905344E10,TO_NEGINF] --> [~1879053440,~1879053440] --> OK [~0.1879053312E10,TO_NEGINF] --> [~1879053312,~1879053312] --> OK [~0.1879053184E10,TO_NEGINF] --> [~1879053184,~1879053184] --> OK [~0.1879053056E10,TO_NEGINF] --> [~1879053056,~1879053056] --> OK [~0.1879052928E10,TO_NEGINF] --> [~1879052928,~1879052928] --> OK [~0.18790528E10,TO_NEGINF] --> [~1879052800,~1879052800] --> OK [~0.1879052672E10,TO_NEGINF] --> [~1879052672,~1879052672] --> OK [~0.1879052544E10,TO_NEGINF] --> [~1879052544,~1879052544] --> OK [~0.1879052416E10,TO_NEGINF] --> [~1879052416,~1879052416] --> OK [~0.1879052288E10,TO_NEGINF] --> [~1879052288,~1879052288] --> OK [~0.187905216E10,TO_NEGINF] --> [~1879052160,~1879052160] --> OK [~0.1879052032E10,TO_NEGINF] --> [~1879052032,~1879052032] --> OK [~0.1879051904E10,TO_NEGINF] --> [~1879051904,~1879051904] --> OK [~0.1879051776E10,TO_NEGINF] --> [~1879051776,~1879051776] --> OK [~0.1879051648E10,TO_NEGINF] --> [~1879051648,~1879051648] --> OK [~0.187905152E10,TO_NEGINF] --> [~1879051520,~1879051520] --> OK [~0.1879051392E10,TO_NEGINF] --> [~1879051392,~1879051392] --> OK [~0.1879051264E10,TO_NEGINF] --> [~1879051264,~1879051264] --> OK [~0.1879051136E10,TO_NEGINF] --> [~1879051136,~1879051136] --> OK [~0.1879051008E10,TO_NEGINF] --> [~1879051008,~1879051008] --> OK [~0.187905088E10,TO_NEGINF] --> [~1879050880,~1879050880] --> OK [~0.1879050752E10,TO_NEGINF] --> [~1879050752,~1879050752] --> OK [~0.1879050624E10,TO_NEGINF] --> [~1879050624,~1879050624] --> OK [~0.1879050496E10,TO_NEGINF] --> [~1879050496,~1879050496] --> OK [~0.1879050368E10,TO_NEGINF] --> [~1879050368,~1879050368] --> OK [~0.187905024E10,TO_NEGINF] --> [~1879050240,~1879050240] --> OK [~0.1879050112E10,TO_NEGINF] --> [~1879050112,~1879050112] --> OK [~0.1879049984E10,TO_NEGINF] --> [~1879049984,~1879049984] --> OK [~0.1879049856E10,TO_NEGINF] --> [~1879049856,~1879049856] --> OK [~0.1879049728E10,TO_NEGINF] --> [~1879049728,~1879049728] --> OK [~0.18790496E10,TO_NEGINF] --> [~1879049600,~1879049600] --> OK [~0.1879049472E10,TO_NEGINF] --> [~1879049472,~1879049472] --> OK [~0.1879049344E10,TO_NEGINF] --> [~1879049344,~1879049344] --> OK [~0.1879049216E10,TO_NEGINF] --> [~1879049216,~1879049216] --> OK [~0.1879049088E10,TO_NEGINF] --> [~1879049088,~1879049088] --> OK [~0.187904896E10,TO_NEGINF] --> [~1879048960,~1879048960] --> OK [~0.1879048832E10,TO_NEGINF] --> [~1879048832,~1879048832] --> OK [~0.1879048704E10,TO_NEGINF] --> [~1879048704,~1879048704] --> OK [~0.1879048576E10,TO_NEGINF] --> [~1879048576,~1879048576] --> OK [~0.1879048448E10,TO_NEGINF] --> [~1879048448,~1879048448] --> OK [~0.187904832E10,TO_NEGINF] --> [~1879048320,~1879048320] --> OK [~0.1879048192E10,TO_NEGINF] --> [~1879048192,~1879048192] --> OK [~0.187904E10,TO_NEGINF] --> [~1879040000,~1879040000] --> OK [~0.1879040128E10,TO_NEGINF] --> [~1879040128,~1879040128] --> OK [~0.1879040256E10,TO_NEGINF] --> [~1879040256,~1879040256] --> OK [~0.1879040384E10,TO_NEGINF] --> [~1879040384,~1879040384] --> OK [~0.1879040512E10,TO_NEGINF] --> [~1879040512,~1879040512] --> OK [~0.187904064E10,TO_NEGINF] --> [~1879040640,~1879040640] --> OK [~0.1879040768E10,TO_NEGINF] --> [~1879040768,~1879040768] --> OK [~0.1879040896E10,TO_NEGINF] --> [~1879040896,~1879040896] --> OK [~0.1879041024E10,TO_NEGINF] --> [~1879041024,~1879041024] --> OK [~0.1879041152E10,TO_NEGINF] --> [~1879041152,~1879041152] --> OK [~0.187904128E10,TO_NEGINF] --> [~1879041280,~1879041280] --> OK [~0.1879041408E10,TO_NEGINF] --> [~1879041408,~1879041408] --> OK [~0.1879041536E10,TO_NEGINF] --> [~1879041536,~1879041536] --> OK [~0.1879041664E10,TO_NEGINF] --> [~1879041664,~1879041664] --> OK [~0.1879041792E10,TO_NEGINF] --> [~1879041792,~1879041792] --> OK [~0.187904192E10,TO_NEGINF] --> [~1879041920,~1879041920] --> OK [~0.1879042048E10,TO_NEGINF] --> [~1879042048,~1879042048] --> OK [~0.1879042176E10,TO_NEGINF] --> [~1879042176,~1879042176] --> OK [~0.1879042304E10,TO_NEGINF] --> [~1879042304,~1879042304] --> OK [~0.1879042432E10,TO_NEGINF] --> [~1879042432,~1879042432] --> OK [~0.187904256E10,TO_NEGINF] --> [~1879042560,~1879042560] --> OK [~0.1879042688E10,TO_NEGINF] --> [~1879042688,~1879042688] --> OK [~0.1879042816E10,TO_NEGINF] --> [~1879042816,~1879042816] --> OK [~0.1879042944E10,TO_NEGINF] --> [~1879042944,~1879042944] --> OK [~0.1879043072E10,TO_NEGINF] --> [~1879043072,~1879043072] --> OK [~0.18790432E10,TO_NEGINF] --> [~1879043200,~1879043200] --> OK [~0.1879043328E10,TO_NEGINF] --> [~1879043328,~1879043328] --> OK [~0.1879043456E10,TO_NEGINF] --> [~1879043456,~1879043456] --> OK [~0.1879043584E10,TO_NEGINF] --> [~1879043584,~1879043584] --> OK [~0.1879043712E10,TO_NEGINF] --> [~1879043712,~1879043712] --> OK [~0.187904384E10,TO_NEGINF] --> [~1879043840,~1879043840] --> OK [~0.1879043968E10,TO_NEGINF] --> [~1879043968,~1879043968] --> OK [~0.1879044096E10,TO_NEGINF] --> [~1879044096,~1879044096] --> OK [~0.1879044224E10,TO_NEGINF] --> [~1879044224,~1879044224] --> OK [~0.1879044352E10,TO_NEGINF] --> [~1879044352,~1879044352] --> OK [~0.187904448E10,TO_NEGINF] --> [~1879044480,~1879044480] --> OK [~0.1879044608E10,TO_NEGINF] --> [~1879044608,~1879044608] --> OK [~0.1879044736E10,TO_NEGINF] --> [~1879044736,~1879044736] --> OK [~0.1879044864E10,TO_NEGINF] --> [~1879044864,~1879044864] --> OK [~0.1879044992E10,TO_NEGINF] --> [~1879044992,~1879044992] --> OK [~0.187904512E10,TO_NEGINF] --> [~1879045120,~1879045120] --> OK [~0.1879045248E10,TO_NEGINF] --> [~1879045248,~1879045248] --> OK [~0.1879045376E10,TO_NEGINF] --> [~1879045376,~1879045376] --> OK [~0.1879045504E10,TO_NEGINF] --> [~1879045504,~1879045504] --> OK [~0.1879045632E10,TO_NEGINF] --> [~1879045632,~1879045632] --> OK [~0.187904576E10,TO_NEGINF] --> [~1879045760,~1879045760] --> OK [~0.1879045888E10,TO_NEGINF] --> [~1879045888,~1879045888] --> OK [~0.1879046016E10,TO_NEGINF] --> [~1879046016,~1879046016] --> OK [~0.1879046144E10,TO_NEGINF] --> [~1879046144,~1879046144] --> OK [~0.1879046272E10,TO_NEGINF] --> [~1879046272,~1879046272] --> OK [~0.18790464E10,TO_NEGINF] --> [~1879046400,~1879046400] --> OK [~0.1879046528E10,TO_NEGINF] --> [~1879046528,~1879046528] --> OK [~0.1879046656E10,TO_NEGINF] --> [~1879046656,~1879046656] --> OK [~0.1879046784E10,TO_NEGINF] --> [~1879046784,~1879046784] --> OK [~0.1879046912E10,TO_NEGINF] --> [~1879046912,~1879046912] --> OK [~0.187904704E10,TO_NEGINF] --> [~1879047040,~1879047040] --> OK [~0.1879047168E10,TO_NEGINF] --> [~1879047168,~1879047168] --> OK [~0.1879047296E10,TO_NEGINF] --> [~1879047296,~1879047296] --> OK [~0.1879047424E10,TO_NEGINF] --> [~1879047424,~1879047424] --> OK [~0.1879047552E10,TO_NEGINF] --> [~1879047552,~1879047552] --> OK [~0.187904768E10,TO_NEGINF] --> [~1879047680,~1879047680] --> OK [~0.1879047808E10,TO_NEGINF] --> [~1879047808,~1879047808] --> OK [~0.1879047936E10,TO_NEGINF] --> [~1879047936,~1879047936] --> OK [~0.1879048064E10,TO_NEGINF] --> [~1879048064,~1879048064] --> OK [~0.1610620928E10,TO_NEGINF] --> [~1610620928,~1610620928] --> OK [~0.16106208E10,TO_NEGINF] --> [~1610620800,~1610620800] --> OK [~0.1610620672E10,TO_NEGINF] --> [~1610620672,~1610620672] --> OK [~0.1610620544E10,TO_NEGINF] --> [~1610620544,~1610620544] --> OK [~0.1610620416E10,TO_NEGINF] --> [~1610620416,~1610620416] --> OK [~0.1610620288E10,TO_NEGINF] --> [~1610620288,~1610620288] --> OK [~0.161062016E10,TO_NEGINF] --> [~1610620160,~1610620160] --> OK [~0.1610620032E10,TO_NEGINF] --> [~1610620032,~1610620032] --> OK [~0.1610619904E10,TO_NEGINF] --> [~1610619904,~1610619904] --> OK [~0.1610619776E10,TO_NEGINF] --> [~1610619776,~1610619776] --> OK [~0.1610619648E10,TO_NEGINF] --> [~1610619648,~1610619648] --> OK [~0.161061952E10,TO_NEGINF] --> [~1610619520,~1610619520] --> OK [~0.1610619392E10,TO_NEGINF] --> [~1610619392,~1610619392] --> OK [~0.1610619264E10,TO_NEGINF] --> [~1610619264,~1610619264] --> OK [~0.1610619136E10,TO_NEGINF] --> [~1610619136,~1610619136] --> OK [~0.1610619008E10,TO_NEGINF] --> [~1610619008,~1610619008] --> OK [~0.161061888E10,TO_NEGINF] --> [~1610618880,~1610618880] --> OK [~0.1610618752E10,TO_NEGINF] --> [~1610618752,~1610618752] --> OK [~0.1610618624E10,TO_NEGINF] --> [~1610618624,~1610618624] --> OK [~0.1610618496E10,TO_NEGINF] --> [~1610618496,~1610618496] --> OK [~0.1610618368E10,TO_NEGINF] --> [~1610618368,~1610618368] --> OK [~0.161061824E10,TO_NEGINF] --> [~1610618240,~1610618240] --> OK [~0.1610618112E10,TO_NEGINF] --> [~1610618112,~1610618112] --> OK [~0.1610617984E10,TO_NEGINF] --> [~1610617984,~1610617984] --> OK [~0.1610617856E10,TO_NEGINF] --> [~1610617856,~1610617856] --> OK [~0.1610617728E10,TO_NEGINF] --> [~1610617728,~1610617728] --> OK [~0.16106176E10,TO_NEGINF] --> [~1610617600,~1610617600] --> OK [~0.1610617472E10,TO_NEGINF] --> [~1610617472,~1610617472] --> OK [~0.1610617344E10,TO_NEGINF] --> [~1610617344,~1610617344] --> OK [~0.1610617216E10,TO_NEGINF] --> [~1610617216,~1610617216] --> OK [~0.1610617088E10,TO_NEGINF] --> [~1610617088,~1610617088] --> OK [~0.161061696E10,TO_NEGINF] --> [~1610616960,~1610616960] --> OK [~0.1610616832E10,TO_NEGINF] --> [~1610616832,~1610616832] --> OK [~0.1610616704E10,TO_NEGINF] --> [~1610616704,~1610616704] --> OK [~0.1610616576E10,TO_NEGINF] --> [~1610616576,~1610616576] --> OK [~0.1610616448E10,TO_NEGINF] --> [~1610616448,~1610616448] --> OK [~0.161061632E10,TO_NEGINF] --> [~1610616320,~1610616320] --> OK [~0.1610616192E10,TO_NEGINF] --> [~1610616192,~1610616192] --> OK [~0.1610616064E10,TO_NEGINF] --> [~1610616064,~1610616064] --> OK [~0.1610615936E10,TO_NEGINF] --> [~1610615936,~1610615936] --> OK [~0.1610615808E10,TO_NEGINF] --> [~1610615808,~1610615808] --> OK [~0.161061568E10,TO_NEGINF] --> [~1610615680,~1610615680] --> OK [~0.1610615552E10,TO_NEGINF] --> [~1610615552,~1610615552] --> OK [~0.1610615424E10,TO_NEGINF] --> [~1610615424,~1610615424] --> OK [~0.1610615296E10,TO_NEGINF] --> [~1610615296,~1610615296] --> OK [~0.1610615168E10,TO_NEGINF] --> [~1610615168,~1610615168] --> OK [~0.161061504E10,TO_NEGINF] --> [~1610615040,~1610615040] --> OK [~0.1610614912E10,TO_NEGINF] --> [~1610614912,~1610614912] --> OK [~0.1610614784E10,TO_NEGINF] --> [~1610614784,~1610614784] --> OK [~0.1610614656E10,TO_NEGINF] --> [~1610614656,~1610614656] --> OK [~0.1610614528E10,TO_NEGINF] --> [~1610614528,~1610614528] --> OK [~0.16106144E10,TO_NEGINF] --> [~1610614400,~1610614400] --> OK [~0.1610614272E10,TO_NEGINF] --> [~1610614272,~1610614272] --> OK [~0.1610614144E10,TO_NEGINF] --> [~1610614144,~1610614144] --> OK [~0.1610614016E10,TO_NEGINF] --> [~1610614016,~1610614016] --> OK [~0.1610613888E10,TO_NEGINF] --> [~1610613888,~1610613888] --> OK [~0.161061376E10,TO_NEGINF] --> [~1610613760,~1610613760] --> OK [~0.1610613632E10,TO_NEGINF] --> [~1610613632,~1610613632] --> OK [~0.1610613504E10,TO_NEGINF] --> [~1610613504,~1610613504] --> OK [~0.1610613376E10,TO_NEGINF] --> [~1610613376,~1610613376] --> OK [~0.1610613248E10,TO_NEGINF] --> [~1610613248,~1610613248] --> OK [~0.161061312E10,TO_NEGINF] --> [~1610613120,~1610613120] --> OK [~0.1610612992E10,TO_NEGINF] --> [~1610612992,~1610612992] --> OK [~0.1610612864E10,TO_NEGINF] --> [~1610612864,~1610612864] --> OK [~0.1610612736E10,TO_NEGINF] --> [~1610612736,~1610612736] --> OK [~0.1610604544E10,TO_NEGINF] --> [~1610604544,~1610604544] --> OK [~0.1610604672E10,TO_NEGINF] --> [~1610604672,~1610604672] --> OK [~0.16106048E10,TO_NEGINF] --> [~1610604800,~1610604800] --> OK [~0.1610604928E10,TO_NEGINF] --> [~1610604928,~1610604928] --> OK [~0.1610605056E10,TO_NEGINF] --> [~1610605056,~1610605056] --> OK [~0.1610605184E10,TO_NEGINF] --> [~1610605184,~1610605184] --> OK [~0.1610605312E10,TO_NEGINF] --> [~1610605312,~1610605312] --> OK [~0.161060544E10,TO_NEGINF] --> [~1610605440,~1610605440] --> OK [~0.1610605568E10,TO_NEGINF] --> [~1610605568,~1610605568] --> OK [~0.1610605696E10,TO_NEGINF] --> [~1610605696,~1610605696] --> OK [~0.1610605824E10,TO_NEGINF] --> [~1610605824,~1610605824] --> OK [~0.1610605952E10,TO_NEGINF] --> [~1610605952,~1610605952] --> OK [~0.161060608E10,TO_NEGINF] --> [~1610606080,~1610606080] --> OK [~0.1610606208E10,TO_NEGINF] --> [~1610606208,~1610606208] --> OK [~0.1610606336E10,TO_NEGINF] --> [~1610606336,~1610606336] --> OK [~0.1610606464E10,TO_NEGINF] --> [~1610606464,~1610606464] --> OK [~0.1610606592E10,TO_NEGINF] --> [~1610606592,~1610606592] --> OK [~0.161060672E10,TO_NEGINF] --> [~1610606720,~1610606720] --> OK [~0.1610606848E10,TO_NEGINF] --> [~1610606848,~1610606848] --> OK [~0.1610606976E10,TO_NEGINF] --> [~1610606976,~1610606976] --> OK [~0.1610607104E10,TO_NEGINF] --> [~1610607104,~1610607104] --> OK [~0.1610607232E10,TO_NEGINF] --> [~1610607232,~1610607232] --> OK [~0.161060736E10,TO_NEGINF] --> [~1610607360,~1610607360] --> OK [~0.1610607488E10,TO_NEGINF] --> [~1610607488,~1610607488] --> OK [~0.1610607616E10,TO_NEGINF] --> [~1610607616,~1610607616] --> OK [~0.1610607744E10,TO_NEGINF] --> [~1610607744,~1610607744] --> OK [~0.1610607872E10,TO_NEGINF] --> [~1610607872,~1610607872] --> OK [~0.1610608E10,TO_NEGINF] --> [~1610608000,~1610608000] --> OK [~0.1610608128E10,TO_NEGINF] --> [~1610608128,~1610608128] --> OK [~0.1610608256E10,TO_NEGINF] --> [~1610608256,~1610608256] --> OK [~0.1610608384E10,TO_NEGINF] --> [~1610608384,~1610608384] --> OK [~0.1610608512E10,TO_NEGINF] --> [~1610608512,~1610608512] --> OK [~0.161060864E10,TO_NEGINF] --> [~1610608640,~1610608640] --> OK [~0.1610608768E10,TO_NEGINF] --> [~1610608768,~1610608768] --> OK [~0.1610608896E10,TO_NEGINF] --> [~1610608896,~1610608896] --> OK [~0.1610609024E10,TO_NEGINF] --> [~1610609024,~1610609024] --> OK [~0.1610609152E10,TO_NEGINF] --> [~1610609152,~1610609152] --> OK [~0.161060928E10,TO_NEGINF] --> [~1610609280,~1610609280] --> OK [~0.1610609408E10,TO_NEGINF] --> [~1610609408,~1610609408] --> OK [~0.1610609536E10,TO_NEGINF] --> [~1610609536,~1610609536] --> OK [~0.1610609664E10,TO_NEGINF] --> [~1610609664,~1610609664] --> OK [~0.1610609792E10,TO_NEGINF] --> [~1610609792,~1610609792] --> OK [~0.161060992E10,TO_NEGINF] --> [~1610609920,~1610609920] --> OK [~0.1610610048E10,TO_NEGINF] --> [~1610610048,~1610610048] --> OK [~0.1610610176E10,TO_NEGINF] --> [~1610610176,~1610610176] --> OK [~0.1610610304E10,TO_NEGINF] --> [~1610610304,~1610610304] --> OK [~0.1610610432E10,TO_NEGINF] --> [~1610610432,~1610610432] --> OK [~0.161061056E10,TO_NEGINF] --> [~1610610560,~1610610560] --> OK [~0.1610610688E10,TO_NEGINF] --> [~1610610688,~1610610688] --> OK [~0.1610610816E10,TO_NEGINF] --> [~1610610816,~1610610816] --> OK [~0.1610610944E10,TO_NEGINF] --> [~1610610944,~1610610944] --> OK [~0.1610611072E10,TO_NEGINF] --> [~1610611072,~1610611072] --> OK [~0.16106112E10,TO_NEGINF] --> [~1610611200,~1610611200] --> OK [~0.1610611328E10,TO_NEGINF] --> [~1610611328,~1610611328] --> OK [~0.1610611456E10,TO_NEGINF] --> [~1610611456,~1610611456] --> OK [~0.1610611584E10,TO_NEGINF] --> [~1610611584,~1610611584] --> OK [~0.1610611712E10,TO_NEGINF] --> [~1610611712,~1610611712] --> OK [~0.161061184E10,TO_NEGINF] --> [~1610611840,~1610611840] --> OK [~0.1610611968E10,TO_NEGINF] --> [~1610611968,~1610611968] --> OK [~0.1610612096E10,TO_NEGINF] --> [~1610612096,~1610612096] --> OK [~0.1610612224E10,TO_NEGINF] --> [~1610612224,~1610612224] --> OK [~0.1610612352E10,TO_NEGINF] --> [~1610612352,~1610612352] --> OK [~0.161061248E10,TO_NEGINF] --> [~1610612480,~1610612480] --> OK [~0.1610612608E10,TO_NEGINF] --> [~1610612608,~1610612608] --> OK [~0.1073750016E10,TO_NEGINF] --> [~1073750016,~1073750016] --> OK [~0.1073749888E10,TO_NEGINF] --> [~1073749888,~1073749888] --> OK [~0.107374976E10,TO_NEGINF] --> [~1073749760,~1073749760] --> OK [~0.1073749632E10,TO_NEGINF] --> [~1073749632,~1073749632] --> OK [~0.1073749504E10,TO_NEGINF] --> [~1073749504,~1073749504] --> OK [~0.1073749376E10,TO_NEGINF] --> [~1073749376,~1073749376] --> OK [~0.1073749248E10,TO_NEGINF] --> [~1073749248,~1073749248] --> OK [~0.107374912E10,TO_NEGINF] --> [~1073749120,~1073749120] --> OK [~0.1073748992E10,TO_NEGINF] --> [~1073748992,~1073748992] --> OK [~0.1073748864E10,TO_NEGINF] --> [~1073748864,~1073748864] --> OK [~0.1073748736E10,TO_NEGINF] --> [~1073748736,~1073748736] --> OK [~0.1073748608E10,TO_NEGINF] --> [~1073748608,~1073748608] --> OK [~0.107374848E10,TO_NEGINF] --> [~1073748480,~1073748480] --> OK [~0.1073748352E10,TO_NEGINF] --> [~1073748352,~1073748352] --> OK [~0.1073748224E10,TO_NEGINF] --> [~1073748224,~1073748224] --> OK [~0.1073748096E10,TO_NEGINF] --> [~1073748096,~1073748096] --> OK [~0.1073747968E10,TO_NEGINF] --> [~1073747968,~1073747968] --> OK [~0.107374784E10,TO_NEGINF] --> [~1073747840,~1073747840] --> OK [~0.1073747712E10,TO_NEGINF] --> [~1073747712,~1073747712] --> OK [~0.1073747584E10,TO_NEGINF] --> [~1073747584,~1073747584] --> OK [~0.1073747456E10,TO_NEGINF] --> [~1073747456,~1073747456] --> OK [~0.1073747328E10,TO_NEGINF] --> [~1073747328,~1073747328] --> OK [~0.10737472E10,TO_NEGINF] --> [~1073747200,~1073747200] --> OK [~0.1073747072E10,TO_NEGINF] --> [~1073747072,~1073747072] --> OK [~0.1073746944E10,TO_NEGINF] --> [~1073746944,~1073746944] --> OK [~0.1073746816E10,TO_NEGINF] --> [~1073746816,~1073746816] --> OK [~0.1073746688E10,TO_NEGINF] --> [~1073746688,~1073746688] --> OK [~0.107374656E10,TO_NEGINF] --> [~1073746560,~1073746560] --> OK [~0.1073746432E10,TO_NEGINF] --> [~1073746432,~1073746432] --> OK [~0.1073746304E10,TO_NEGINF] --> [~1073746304,~1073746304] --> OK [~0.1073746176E10,TO_NEGINF] --> [~1073746176,~1073746176] --> OK [~0.1073746048E10,TO_NEGINF] --> [~1073746048,~1073746048] --> OK [~0.107374592E10,TO_NEGINF] --> [~1073745920,~1073745920] --> OK [~0.1073745792E10,TO_NEGINF] --> [~1073745792,~1073745792] --> OK [~0.1073745664E10,TO_NEGINF] --> [~1073745664,~1073745664] --> OK [~0.1073745536E10,TO_NEGINF] --> [~1073745536,~1073745536] --> OK [~0.1073745408E10,TO_NEGINF] --> [~1073745408,~1073745408] --> OK [~0.107374528E10,TO_NEGINF] --> [~1073745280,~1073745280] --> OK [~0.1073745152E10,TO_NEGINF] --> [~1073745152,~1073745152] --> OK [~0.1073745024E10,TO_NEGINF] --> [~1073745024,~1073745024] --> OK [~0.1073744896E10,TO_NEGINF] --> [~1073744896,~1073744896] --> OK [~0.1073744768E10,TO_NEGINF] --> [~1073744768,~1073744768] --> OK [~0.107374464E10,TO_NEGINF] --> [~1073744640,~1073744640] --> OK [~0.1073744512E10,TO_NEGINF] --> [~1073744512,~1073744512] --> OK [~0.1073744384E10,TO_NEGINF] --> [~1073744384,~1073744384] --> OK [~0.1073744256E10,TO_NEGINF] --> [~1073744256,~1073744256] --> OK [~0.1073744128E10,TO_NEGINF] --> [~1073744128,~1073744128] --> OK [~0.1073744E10,TO_NEGINF] --> [~1073744000,~1073744000] --> OK [~0.1073743872E10,TO_NEGINF] --> [~1073743872,~1073743872] --> OK [~0.1073743744E10,TO_NEGINF] --> [~1073743744,~1073743744] --> OK [~0.1073743616E10,TO_NEGINF] --> [~1073743616,~1073743616] --> OK [~0.1073743488E10,TO_NEGINF] --> [~1073743488,~1073743488] --> OK [~0.107374336E10,TO_NEGINF] --> [~1073743360,~1073743360] --> OK [~0.1073743232E10,TO_NEGINF] --> [~1073743232,~1073743232] --> OK [~0.1073743104E10,TO_NEGINF] --> [~1073743104,~1073743104] --> OK [~0.1073742976E10,TO_NEGINF] --> [~1073742976,~1073742976] --> OK [~0.1073742848E10,TO_NEGINF] --> [~1073742848,~1073742848] --> OK [~0.107374272E10,TO_NEGINF] --> [~1073742720,~1073742720] --> OK [~0.1073742592E10,TO_NEGINF] --> [~1073742592,~1073742592] --> OK [~0.1073742464E10,TO_NEGINF] --> [~1073742464,~1073742464] --> OK [~0.1073742336E10,TO_NEGINF] --> [~1073742336,~1073742336] --> OK [~0.1073742208E10,TO_NEGINF] --> [~1073742208,~1073742208] --> OK [~0.107374208E10,TO_NEGINF] --> [~1073742080,~1073742080] --> OK [~0.1073741952E10,TO_NEGINF] --> [~1073741952,~1073741952] --> OK [~0.1073741824E10,TO_NEGINF] --> [~1073741824,~1073741824] --> OK [~0.1073737728E10,TO_NEGINF] --> [~1073737728,~1073737728] --> OK [~0.1073737792E10,TO_NEGINF] --> [~1073737792,~1073737792] --> OK [~0.1073737856E10,TO_NEGINF] --> [~1073737856,~1073737856] --> OK [~0.107373792E10,TO_NEGINF] --> [~1073737920,~1073737920] --> OK [~0.1073737984E10,TO_NEGINF] --> [~1073737984,~1073737984] --> OK [~0.1073738048E10,TO_NEGINF] --> [~1073738048,~1073738048] --> OK [~0.1073738112E10,TO_NEGINF] --> [~1073738112,~1073738112] --> OK [~0.1073738176E10,TO_NEGINF] --> [~1073738176,~1073738176] --> OK [~0.107373824E10,TO_NEGINF] --> [~1073738240,~1073738240] --> OK [~0.1073738304E10,TO_NEGINF] --> [~1073738304,~1073738304] --> OK [~0.1073738368E10,TO_NEGINF] --> [~1073738368,~1073738368] --> OK [~0.1073738432E10,TO_NEGINF] --> [~1073738432,~1073738432] --> OK [~0.1073738496E10,TO_NEGINF] --> [~1073738496,~1073738496] --> OK [~0.107373856E10,TO_NEGINF] --> [~1073738560,~1073738560] --> OK [~0.1073738624E10,TO_NEGINF] --> [~1073738624,~1073738624] --> OK [~0.1073738688E10,TO_NEGINF] --> [~1073738688,~1073738688] --> OK [~0.1073738752E10,TO_NEGINF] --> [~1073738752,~1073738752] --> OK [~0.1073738816E10,TO_NEGINF] --> [~1073738816,~1073738816] --> OK [~0.107373888E10,TO_NEGINF] --> [~1073738880,~1073738880] --> OK [~0.1073738944E10,TO_NEGINF] --> [~1073738944,~1073738944] --> OK [~0.1073739008E10,TO_NEGINF] --> [~1073739008,~1073739008] --> OK [~0.1073739072E10,TO_NEGINF] --> [~1073739072,~1073739072] --> OK [~0.1073739136E10,TO_NEGINF] --> [~1073739136,~1073739136] --> OK [~0.10737392E10,TO_NEGINF] --> [~1073739200,~1073739200] --> OK [~0.1073739264E10,TO_NEGINF] --> [~1073739264,~1073739264] --> OK [~0.1073739328E10,TO_NEGINF] --> [~1073739328,~1073739328] --> OK [~0.1073739392E10,TO_NEGINF] --> [~1073739392,~1073739392] --> OK [~0.1073739456E10,TO_NEGINF] --> [~1073739456,~1073739456] --> OK [~0.107373952E10,TO_NEGINF] --> [~1073739520,~1073739520] --> OK [~0.1073739584E10,TO_NEGINF] --> [~1073739584,~1073739584] --> OK [~0.1073739648E10,TO_NEGINF] --> [~1073739648,~1073739648] --> OK [~0.1073739712E10,TO_NEGINF] --> [~1073739712,~1073739712] --> OK [~0.1073739776E10,TO_NEGINF] --> [~1073739776,~1073739776] --> OK [~0.107373984E10,TO_NEGINF] --> [~1073739840,~1073739840] --> OK [~0.1073739904E10,TO_NEGINF] --> [~1073739904,~1073739904] --> OK [~0.1073739968E10,TO_NEGINF] --> [~1073739968,~1073739968] --> OK [~0.1073740032E10,TO_NEGINF] --> [~1073740032,~1073740032] --> OK [~0.1073740096E10,TO_NEGINF] --> [~1073740096,~1073740096] --> OK [~0.107374016E10,TO_NEGINF] --> [~1073740160,~1073740160] --> OK [~0.1073740224E10,TO_NEGINF] --> [~1073740224,~1073740224] --> OK [~0.1073740288E10,TO_NEGINF] --> [~1073740288,~1073740288] --> OK [~0.1073740352E10,TO_NEGINF] --> [~1073740352,~1073740352] --> OK [~0.1073740416E10,TO_NEGINF] --> [~1073740416,~1073740416] --> OK [~0.107374048E10,TO_NEGINF] --> [~1073740480,~1073740480] --> OK [~0.1073740544E10,TO_NEGINF] --> [~1073740544,~1073740544] --> OK [~0.1073740608E10,TO_NEGINF] --> [~1073740608,~1073740608] --> OK [~0.1073740672E10,TO_NEGINF] --> [~1073740672,~1073740672] --> OK [~0.1073740736E10,TO_NEGINF] --> [~1073740736,~1073740736] --> OK [~0.10737408E10,TO_NEGINF] --> [~1073740800,~1073740800] --> OK [~0.1073740864E10,TO_NEGINF] --> [~1073740864,~1073740864] --> OK [~0.1073740928E10,TO_NEGINF] --> [~1073740928,~1073740928] --> OK [~0.1073740992E10,TO_NEGINF] --> [~1073740992,~1073740992] --> OK [~0.1073741056E10,TO_NEGINF] --> [~1073741056,~1073741056] --> OK [~0.107374112E10,TO_NEGINF] --> [~1073741120,~1073741120] --> OK [~0.1073741184E10,TO_NEGINF] --> [~1073741184,~1073741184] --> OK [~0.1073741248E10,TO_NEGINF] --> [~1073741248,~1073741248] --> OK [~0.1073741312E10,TO_NEGINF] --> [~1073741312,~1073741312] --> OK [~0.1073741376E10,TO_NEGINF] --> [~1073741376,~1073741376] --> OK [~0.107374144E10,TO_NEGINF] --> [~1073741440,~1073741440] --> OK [~0.1073741504E10,TO_NEGINF] --> [~1073741504,~1073741504] --> OK [~0.1073741568E10,TO_NEGINF] --> [~1073741568,~1073741568] --> OK [~0.1073741632E10,TO_NEGINF] --> [~1073741632,~1073741632] --> OK [~0.1073741696E10,TO_NEGINF] --> [~1073741696,~1073741696] --> OK [~0.107374176E10,TO_NEGINF] --> [~1073741760,~1073741760] --> OK [~0.30000153E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000015E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000148E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000145E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000143E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000014E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000138E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000136E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000134E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000013E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000129E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000126E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000124E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000122E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000012E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000117E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000114E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000112E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000011E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000107E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000105E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000103E1,TO_NEGINF] --> [~4,~4] --> OK [~0.300001E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000098E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000095E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000093E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000009E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000088E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000086E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000083E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000008E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000079E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000076E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000074E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000072E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000007E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000067E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000064E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000062E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000006E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000057E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000055E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000052E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000005E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000048E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000045E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000043E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000004E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000038E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000036E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000033E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000003E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000029E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000026E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000024E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000021E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000002E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000017E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000014E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000012E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000001E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000007E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000005E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000002E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999847E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999985E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999852E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999855E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999857E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999986E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999862E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999864E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999866E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999987E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999871E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999874E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999876E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999878E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999988E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999883E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999886E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999888E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999989E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999893E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999895E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999897E1,TO_NEGINF] --> [~3,~3] --> OK [~0.299999E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999902E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999905E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999907E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999991E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999912E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999914E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999917E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999992E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999921E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999924E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999926E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999928E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999993E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999933E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999936E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999938E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999994E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999943E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999945E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999948E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999995E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999952E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999955E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999957E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999996E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999962E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999964E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999967E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999997E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999971E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999974E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999976E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999979E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999998E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999983E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999986E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999988E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999993E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999995E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999998E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000153E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000015E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000148E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000145E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000143E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000014E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000138E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000136E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000134E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000013E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000129E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000126E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000124E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000122E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000012E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000117E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000114E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000112E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000011E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000107E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000105E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000103E1,TO_NEGINF] --> [~3,~3] --> OK [~0.200001E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000098E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000095E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000093E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000009E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000088E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000086E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000083E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000008E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000079E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000076E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000074E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000072E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000007E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000067E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000064E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000062E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000006E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000057E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000055E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000052E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000005E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000048E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000045E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000043E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000004E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000038E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000036E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000033E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000003E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000029E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000026E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000024E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000021E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000002E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000017E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000014E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000012E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000001E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000007E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000005E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000002E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999924E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999925E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999926E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999927E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999928E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999993E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999931E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999932E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999933E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999934E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999936E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999937E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999938E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999939E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999994E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999942E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999943E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999944E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999945E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999946E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999948E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999949E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999995E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999951E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999952E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999954E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999955E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999956E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999957E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999958E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999996E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999961E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999962E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999963E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999964E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999965E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999967E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999968E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999969E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999997E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999971E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999973E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999974E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999975E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999976E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999977E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999979E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999998E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999981E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999982E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999983E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999985E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999986E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999987E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999988E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999989E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999992E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999993E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999994E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999995E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999996E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999998E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000076E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000075E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000074E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000073E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000072E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000007E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000069E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000068E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000067E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000066E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000064E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000063E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000062E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000061E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000006E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000058E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000057E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000056E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000055E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000054E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000052E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000051E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000005E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000049E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000048E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000046E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000045E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000044E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000043E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000042E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000004E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000039E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000038E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000037E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000036E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000035E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000033E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000032E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000031E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000003E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000029E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000027E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000026E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000025E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000024E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000023E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000021E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000002E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000019E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000018E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000017E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000015E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000014E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000013E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000012E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000011E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000001E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000008E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000007E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000006E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000005E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000004E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000002E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000001E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1E1,TO_NEGINF] --> [~1,~1] --> OK [~0.9999962,TO_NEGINF] --> [~1,~1] --> OK [~0.99999624,TO_NEGINF] --> [~1,~1] --> OK [~0.9999963,TO_NEGINF] --> [~1,~1] --> OK [~0.99999636,TO_NEGINF] --> [~1,~1] --> OK [~0.9999964,TO_NEGINF] --> [~1,~1] --> OK [~0.9999965,TO_NEGINF] --> [~1,~1] --> OK [~0.99999654,TO_NEGINF] --> [~1,~1] --> OK [~0.9999966,TO_NEGINF] --> [~1,~1] --> OK [~0.99999666,TO_NEGINF] --> [~1,~1] --> OK [~0.9999967,TO_NEGINF] --> [~1,~1] --> OK [~0.9999968,TO_NEGINF] --> [~1,~1] --> OK [~0.99999684,TO_NEGINF] --> [~1,~1] --> OK [~0.9999969,TO_NEGINF] --> [~1,~1] --> OK [~0.99999696,TO_NEGINF] --> [~1,~1] --> OK [~0.999997,TO_NEGINF] --> [~1,~1] --> OK [~0.9999971,TO_NEGINF] --> [~1,~1] --> OK [~0.99999714,TO_NEGINF] --> [~1,~1] --> OK [~0.9999972,TO_NEGINF] --> [~1,~1] --> OK [~0.99999726,TO_NEGINF] --> [~1,~1] --> OK [~0.9999973,TO_NEGINF] --> [~1,~1] --> OK [~0.9999974,TO_NEGINF] --> [~1,~1] --> OK [~0.99999744,TO_NEGINF] --> [~1,~1] --> OK [~0.9999975,TO_NEGINF] --> [~1,~1] --> OK [~0.99999756,TO_NEGINF] --> [~1,~1] --> OK [~0.9999976,TO_NEGINF] --> [~1,~1] --> OK [~0.9999977,TO_NEGINF] --> [~1,~1] --> OK [~0.99999774,TO_NEGINF] --> [~1,~1] --> OK [~0.9999978,TO_NEGINF] --> [~1,~1] --> OK [~0.99999785,TO_NEGINF] --> [~1,~1] --> OK [~0.9999979,TO_NEGINF] --> [~1,~1] --> OK [~0.999998,TO_NEGINF] --> [~1,~1] --> OK [~0.99999803,TO_NEGINF] --> [~1,~1] --> OK [~0.9999981,TO_NEGINF] --> [~1,~1] --> OK [~0.99999815,TO_NEGINF] --> [~1,~1] --> OK [~0.9999982,TO_NEGINF] --> [~1,~1] --> OK [~0.9999983,TO_NEGINF] --> [~1,~1] --> OK [~0.99999833,TO_NEGINF] --> [~1,~1] --> OK [~0.9999984,TO_NEGINF] --> [~1,~1] --> OK [~0.99999845,TO_NEGINF] --> [~1,~1] --> OK [~0.9999985,TO_NEGINF] --> [~1,~1] --> OK [~0.99999857,TO_NEGINF] --> [~1,~1] --> OK [~0.9999986,TO_NEGINF] --> [~1,~1] --> OK [~0.9999987,TO_NEGINF] --> [~1,~1] --> OK [~0.99999875,TO_NEGINF] --> [~1,~1] --> OK [~0.9999988,TO_NEGINF] --> [~1,~1] --> OK [~0.99999887,TO_NEGINF] --> [~1,~1] --> OK [~0.9999989,TO_NEGINF] --> [~1,~1] --> OK [~0.999999,TO_NEGINF] --> [~1,~1] --> OK [~0.99999905,TO_NEGINF] --> [~1,~1] --> OK [~0.9999991,TO_NEGINF] --> [~1,~1] --> OK [~0.99999917,TO_NEGINF] --> [~1,~1] --> OK [~0.9999992,TO_NEGINF] --> [~1,~1] --> OK [~0.9999993,TO_NEGINF] --> [~1,~1] --> OK [~0.99999934,TO_NEGINF] --> [~1,~1] --> OK [~0.9999994,TO_NEGINF] --> [~1,~1] --> OK [~0.99999946,TO_NEGINF] --> [~1,~1] --> OK [~0.9999995,TO_NEGINF] --> [~1,~1] --> OK [~0.9999996,TO_NEGINF] --> [~1,~1] --> OK [~0.99999964,TO_NEGINF] --> [~1,~1] --> OK [~0.9999997,TO_NEGINF] --> [~1,~1] --> OK [~0.99999976,TO_NEGINF] --> [~1,~1] --> OK [~0.9999998,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999,TO_NEGINF] --> [~1,~1] --> OK [~0.99999994,TO_NEGINF] --> [~1,~1] --> OK [~0.9E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.88E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.87E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.85E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.84E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.83E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.81E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.8E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.78E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.77E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.76E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.74E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.73E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.71E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.7E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.69E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.67E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.66E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.64E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.63E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.62E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.6E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.59E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.57E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.56E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.55E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.53E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.52E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.5E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.49E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.48E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.46E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.45E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.43E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.42E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.4E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.39E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.38E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.36E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.35E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.34E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.32E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.31E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.3E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.28E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.27E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.25E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.24E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.22E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.21E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.2E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.18E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.17E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.15E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.14E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.13E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.11E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.1E~43,TO_NEGINF] --> [~1,~1] --> OK [~0.8E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.7E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.6E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.4E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.3E~44,TO_NEGINF] --> [~1,~1] --> OK [~0.1E~44,TO_NEGINF] --> [~1,~1] --> OK [0.0,TO_NEGINF] --> [0,0] --> OK [0.9E~43,TO_NEGINF] --> [0,0] --> OK [0.88E~43,TO_NEGINF] --> [0,0] --> OK [0.87E~43,TO_NEGINF] --> [0,0] --> OK [0.85E~43,TO_NEGINF] --> [0,0] --> OK [0.84E~43,TO_NEGINF] --> [0,0] --> OK [0.83E~43,TO_NEGINF] --> [0,0] --> OK [0.81E~43,TO_NEGINF] --> [0,0] --> OK [0.8E~43,TO_NEGINF] --> [0,0] --> OK [0.78E~43,TO_NEGINF] --> [0,0] --> OK [0.77E~43,TO_NEGINF] --> [0,0] --> OK [0.76E~43,TO_NEGINF] --> [0,0] --> OK [0.74E~43,TO_NEGINF] --> [0,0] --> OK [0.73E~43,TO_NEGINF] --> [0,0] --> OK [0.71E~43,TO_NEGINF] --> [0,0] --> OK [0.7E~43,TO_NEGINF] --> [0,0] --> OK [0.69E~43,TO_NEGINF] --> [0,0] --> OK [0.67E~43,TO_NEGINF] --> [0,0] --> OK [0.66E~43,TO_NEGINF] --> [0,0] --> OK [0.64E~43,TO_NEGINF] --> [0,0] --> OK [0.63E~43,TO_NEGINF] --> [0,0] --> OK [0.62E~43,TO_NEGINF] --> [0,0] --> OK [0.6E~43,TO_NEGINF] --> [0,0] --> OK [0.59E~43,TO_NEGINF] --> [0,0] --> OK [0.57E~43,TO_NEGINF] --> [0,0] --> OK [0.56E~43,TO_NEGINF] --> [0,0] --> OK [0.55E~43,TO_NEGINF] --> [0,0] --> OK [0.53E~43,TO_NEGINF] --> [0,0] --> OK [0.52E~43,TO_NEGINF] --> [0,0] --> OK [0.5E~43,TO_NEGINF] --> [0,0] --> OK [0.49E~43,TO_NEGINF] --> [0,0] --> OK [0.48E~43,TO_NEGINF] --> [0,0] --> OK [0.46E~43,TO_NEGINF] --> [0,0] --> OK [0.45E~43,TO_NEGINF] --> [0,0] --> OK [0.43E~43,TO_NEGINF] --> [0,0] --> OK [0.42E~43,TO_NEGINF] --> [0,0] --> OK [0.4E~43,TO_NEGINF] --> [0,0] --> OK [0.39E~43,TO_NEGINF] --> [0,0] --> OK [0.38E~43,TO_NEGINF] --> [0,0] --> OK [0.36E~43,TO_NEGINF] --> [0,0] --> OK [0.35E~43,TO_NEGINF] --> [0,0] --> OK [0.34E~43,TO_NEGINF] --> [0,0] --> OK [0.32E~43,TO_NEGINF] --> [0,0] --> OK [0.31E~43,TO_NEGINF] --> [0,0] --> OK [0.3E~43,TO_NEGINF] --> [0,0] --> OK [0.28E~43,TO_NEGINF] --> [0,0] --> OK [0.27E~43,TO_NEGINF] --> [0,0] --> OK [0.25E~43,TO_NEGINF] --> [0,0] --> OK [0.24E~43,TO_NEGINF] --> [0,0] --> OK [0.22E~43,TO_NEGINF] --> [0,0] --> OK [0.21E~43,TO_NEGINF] --> [0,0] --> OK [0.2E~43,TO_NEGINF] --> [0,0] --> OK [0.18E~43,TO_NEGINF] --> [0,0] --> OK [0.17E~43,TO_NEGINF] --> [0,0] --> OK [0.15E~43,TO_NEGINF] --> [0,0] --> OK [0.14E~43,TO_NEGINF] --> [0,0] --> OK [0.13E~43,TO_NEGINF] --> [0,0] --> OK [0.11E~43,TO_NEGINF] --> [0,0] --> OK [0.1E~43,TO_NEGINF] --> [0,0] --> OK [0.8E~44,TO_NEGINF] --> [0,0] --> OK [0.7E~44,TO_NEGINF] --> [0,0] --> OK [0.6E~44,TO_NEGINF] --> [0,0] --> OK [0.4E~44,TO_NEGINF] --> [0,0] --> OK [0.3E~44,TO_NEGINF] --> [0,0] --> OK [0.1E~44,TO_NEGINF] --> [0,0] --> OK [0.9999962,TO_NEGINF] --> [0,0] --> OK [0.99999624,TO_NEGINF] --> [0,0] --> OK [0.9999963,TO_NEGINF] --> [0,0] --> OK [0.99999636,TO_NEGINF] --> [0,0] --> OK [0.9999964,TO_NEGINF] --> [0,0] --> OK [0.9999965,TO_NEGINF] --> [0,0] --> OK [0.99999654,TO_NEGINF] --> [0,0] --> OK [0.9999966,TO_NEGINF] --> [0,0] --> OK [0.99999666,TO_NEGINF] --> [0,0] --> OK [0.9999967,TO_NEGINF] --> [0,0] --> OK [0.9999968,TO_NEGINF] --> [0,0] --> OK [0.99999684,TO_NEGINF] --> [0,0] --> OK [0.9999969,TO_NEGINF] --> [0,0] --> OK [0.99999696,TO_NEGINF] --> [0,0] --> OK [0.999997,TO_NEGINF] --> [0,0] --> OK [0.9999971,TO_NEGINF] --> [0,0] --> OK [0.99999714,TO_NEGINF] --> [0,0] --> OK [0.9999972,TO_NEGINF] --> [0,0] --> OK [0.99999726,TO_NEGINF] --> [0,0] --> OK [0.9999973,TO_NEGINF] --> [0,0] --> OK [0.9999974,TO_NEGINF] --> [0,0] --> OK [0.99999744,TO_NEGINF] --> [0,0] --> OK [0.9999975,TO_NEGINF] --> [0,0] --> OK [0.99999756,TO_NEGINF] --> [0,0] --> OK [0.9999976,TO_NEGINF] --> [0,0] --> OK [0.9999977,TO_NEGINF] --> [0,0] --> OK [0.99999774,TO_NEGINF] --> [0,0] --> OK [0.9999978,TO_NEGINF] --> [0,0] --> OK [0.99999785,TO_NEGINF] --> [0,0] --> OK [0.9999979,TO_NEGINF] --> [0,0] --> OK [0.999998,TO_NEGINF] --> [0,0] --> OK [0.99999803,TO_NEGINF] --> [0,0] --> OK [0.9999981,TO_NEGINF] --> [0,0] --> OK [0.99999815,TO_NEGINF] --> [0,0] --> OK [0.9999982,TO_NEGINF] --> [0,0] --> OK [0.9999983,TO_NEGINF] --> [0,0] --> OK [0.99999833,TO_NEGINF] --> [0,0] --> OK [0.9999984,TO_NEGINF] --> [0,0] --> OK [0.99999845,TO_NEGINF] --> [0,0] --> OK [0.9999985,TO_NEGINF] --> [0,0] --> OK [0.99999857,TO_NEGINF] --> [0,0] --> OK [0.9999986,TO_NEGINF] --> [0,0] --> OK [0.9999987,TO_NEGINF] --> [0,0] --> OK [0.99999875,TO_NEGINF] --> [0,0] --> OK [0.9999988,TO_NEGINF] --> [0,0] --> OK [0.99999887,TO_NEGINF] --> [0,0] --> OK [0.9999989,TO_NEGINF] --> [0,0] --> OK [0.999999,TO_NEGINF] --> [0,0] --> OK [0.99999905,TO_NEGINF] --> [0,0] --> OK [0.9999991,TO_NEGINF] --> [0,0] --> OK [0.99999917,TO_NEGINF] --> [0,0] --> OK [0.9999992,TO_NEGINF] --> [0,0] --> OK [0.9999993,TO_NEGINF] --> [0,0] --> OK [0.99999934,TO_NEGINF] --> [0,0] --> OK [0.9999994,TO_NEGINF] --> [0,0] --> OK [0.99999946,TO_NEGINF] --> [0,0] --> OK [0.9999995,TO_NEGINF] --> [0,0] --> OK [0.9999996,TO_NEGINF] --> [0,0] --> OK [0.99999964,TO_NEGINF] --> [0,0] --> OK [0.9999997,TO_NEGINF] --> [0,0] --> OK [0.99999976,TO_NEGINF] --> [0,0] --> OK [0.9999998,TO_NEGINF] --> [0,0] --> OK [0.9999999,TO_NEGINF] --> [0,0] --> OK [0.99999994,TO_NEGINF] --> [0,0] --> OK [0.1E1,TO_NEGINF] --> [1,1] --> OK [0.10000076E1,TO_NEGINF] --> [1,1] --> OK [0.10000075E1,TO_NEGINF] --> [1,1] --> OK [0.10000074E1,TO_NEGINF] --> [1,1] --> OK [0.10000073E1,TO_NEGINF] --> [1,1] --> OK [0.10000072E1,TO_NEGINF] --> [1,1] --> OK [0.1000007E1,TO_NEGINF] --> [1,1] --> OK [0.10000069E1,TO_NEGINF] --> [1,1] --> OK [0.10000068E1,TO_NEGINF] --> [1,1] --> OK [0.10000067E1,TO_NEGINF] --> [1,1] --> OK [0.10000066E1,TO_NEGINF] --> [1,1] --> OK [0.10000064E1,TO_NEGINF] --> [1,1] --> OK [0.10000063E1,TO_NEGINF] --> [1,1] --> OK [0.10000062E1,TO_NEGINF] --> [1,1] --> OK [0.10000061E1,TO_NEGINF] --> [1,1] --> OK [0.1000006E1,TO_NEGINF] --> [1,1] --> OK [0.10000058E1,TO_NEGINF] --> [1,1] --> OK [0.10000057E1,TO_NEGINF] --> [1,1] --> OK [0.10000056E1,TO_NEGINF] --> [1,1] --> OK [0.10000055E1,TO_NEGINF] --> [1,1] --> OK [0.10000054E1,TO_NEGINF] --> [1,1] --> OK [0.10000052E1,TO_NEGINF] --> [1,1] --> OK [0.10000051E1,TO_NEGINF] --> [1,1] --> OK [0.1000005E1,TO_NEGINF] --> [1,1] --> OK [0.10000049E1,TO_NEGINF] --> [1,1] --> OK [0.10000048E1,TO_NEGINF] --> [1,1] --> OK [0.10000046E1,TO_NEGINF] --> [1,1] --> OK [0.10000045E1,TO_NEGINF] --> [1,1] --> OK [0.10000044E1,TO_NEGINF] --> [1,1] --> OK [0.10000043E1,TO_NEGINF] --> [1,1] --> OK [0.10000042E1,TO_NEGINF] --> [1,1] --> OK [0.1000004E1,TO_NEGINF] --> [1,1] --> OK [0.10000039E1,TO_NEGINF] --> [1,1] --> OK [0.10000038E1,TO_NEGINF] --> [1,1] --> OK [0.10000037E1,TO_NEGINF] --> [1,1] --> OK [0.10000036E1,TO_NEGINF] --> [1,1] --> OK [0.10000035E1,TO_NEGINF] --> [1,1] --> OK [0.10000033E1,TO_NEGINF] --> [1,1] --> OK [0.10000032E1,TO_NEGINF] --> [1,1] --> OK [0.10000031E1,TO_NEGINF] --> [1,1] --> OK [0.1000003E1,TO_NEGINF] --> [1,1] --> OK [0.10000029E1,TO_NEGINF] --> [1,1] --> OK [0.10000027E1,TO_NEGINF] --> [1,1] --> OK [0.10000026E1,TO_NEGINF] --> [1,1] --> OK [0.10000025E1,TO_NEGINF] --> [1,1] --> OK [0.10000024E1,TO_NEGINF] --> [1,1] --> OK [0.10000023E1,TO_NEGINF] --> [1,1] --> OK [0.10000021E1,TO_NEGINF] --> [1,1] --> OK [0.1000002E1,TO_NEGINF] --> [1,1] --> OK [0.10000019E1,TO_NEGINF] --> [1,1] --> OK [0.10000018E1,TO_NEGINF] --> [1,1] --> OK [0.10000017E1,TO_NEGINF] --> [1,1] --> OK [0.10000015E1,TO_NEGINF] --> [1,1] --> OK [0.10000014E1,TO_NEGINF] --> [1,1] --> OK [0.10000013E1,TO_NEGINF] --> [1,1] --> OK [0.10000012E1,TO_NEGINF] --> [1,1] --> OK [0.10000011E1,TO_NEGINF] --> [1,1] --> OK [0.1000001E1,TO_NEGINF] --> [1,1] --> OK [0.10000008E1,TO_NEGINF] --> [1,1] --> OK [0.10000007E1,TO_NEGINF] --> [1,1] --> OK [0.10000006E1,TO_NEGINF] --> [1,1] --> OK [0.10000005E1,TO_NEGINF] --> [1,1] --> OK [0.10000004E1,TO_NEGINF] --> [1,1] --> OK [0.10000002E1,TO_NEGINF] --> [1,1] --> OK [0.10000001E1,TO_NEGINF] --> [1,1] --> OK [0.19999924E1,TO_NEGINF] --> [1,1] --> OK [0.19999925E1,TO_NEGINF] --> [1,1] --> OK [0.19999926E1,TO_NEGINF] --> [1,1] --> OK [0.19999927E1,TO_NEGINF] --> [1,1] --> OK [0.19999928E1,TO_NEGINF] --> [1,1] --> OK [0.1999993E1,TO_NEGINF] --> [1,1] --> OK [0.19999931E1,TO_NEGINF] --> [1,1] --> OK [0.19999932E1,TO_NEGINF] --> [1,1] --> OK [0.19999933E1,TO_NEGINF] --> [1,1] --> OK [0.19999934E1,TO_NEGINF] --> [1,1] --> OK [0.19999936E1,TO_NEGINF] --> [1,1] --> OK [0.19999937E1,TO_NEGINF] --> [1,1] --> OK [0.19999938E1,TO_NEGINF] --> [1,1] --> OK [0.19999939E1,TO_NEGINF] --> [1,1] --> OK [0.1999994E1,TO_NEGINF] --> [1,1] --> OK [0.19999942E1,TO_NEGINF] --> [1,1] --> OK [0.19999943E1,TO_NEGINF] --> [1,1] --> OK [0.19999944E1,TO_NEGINF] --> [1,1] --> OK [0.19999945E1,TO_NEGINF] --> [1,1] --> OK [0.19999946E1,TO_NEGINF] --> [1,1] --> OK [0.19999948E1,TO_NEGINF] --> [1,1] --> OK [0.19999949E1,TO_NEGINF] --> [1,1] --> OK [0.1999995E1,TO_NEGINF] --> [1,1] --> OK [0.19999951E1,TO_NEGINF] --> [1,1] --> OK [0.19999952E1,TO_NEGINF] --> [1,1] --> OK [0.19999954E1,TO_NEGINF] --> [1,1] --> OK [0.19999955E1,TO_NEGINF] --> [1,1] --> OK [0.19999956E1,TO_NEGINF] --> [1,1] --> OK [0.19999957E1,TO_NEGINF] --> [1,1] --> OK [0.19999958E1,TO_NEGINF] --> [1,1] --> OK [0.1999996E1,TO_NEGINF] --> [1,1] --> OK [0.19999961E1,TO_NEGINF] --> [1,1] --> OK [0.19999962E1,TO_NEGINF] --> [1,1] --> OK [0.19999963E1,TO_NEGINF] --> [1,1] --> OK [0.19999964E1,TO_NEGINF] --> [1,1] --> OK [0.19999965E1,TO_NEGINF] --> [1,1] --> OK [0.19999967E1,TO_NEGINF] --> [1,1] --> OK [0.19999968E1,TO_NEGINF] --> [1,1] --> OK [0.19999969E1,TO_NEGINF] --> [1,1] --> OK [0.1999997E1,TO_NEGINF] --> [1,1] --> OK [0.19999971E1,TO_NEGINF] --> [1,1] --> OK [0.19999973E1,TO_NEGINF] --> [1,1] --> OK [0.19999974E1,TO_NEGINF] --> [1,1] --> OK [0.19999975E1,TO_NEGINF] --> [1,1] --> OK [0.19999976E1,TO_NEGINF] --> [1,1] --> OK [0.19999977E1,TO_NEGINF] --> [1,1] --> OK [0.19999979E1,TO_NEGINF] --> [1,1] --> OK [0.1999998E1,TO_NEGINF] --> [1,1] --> OK [0.19999981E1,TO_NEGINF] --> [1,1] --> OK [0.19999982E1,TO_NEGINF] --> [1,1] --> OK [0.19999983E1,TO_NEGINF] --> [1,1] --> OK [0.19999985E1,TO_NEGINF] --> [1,1] --> OK [0.19999986E1,TO_NEGINF] --> [1,1] --> OK [0.19999987E1,TO_NEGINF] --> [1,1] --> OK [0.19999988E1,TO_NEGINF] --> [1,1] --> OK [0.19999989E1,TO_NEGINF] --> [1,1] --> OK [0.1999999E1,TO_NEGINF] --> [1,1] --> OK [0.19999992E1,TO_NEGINF] --> [1,1] --> OK [0.19999993E1,TO_NEGINF] --> [1,1] --> OK [0.19999994E1,TO_NEGINF] --> [1,1] --> OK [0.19999995E1,TO_NEGINF] --> [1,1] --> OK [0.19999996E1,TO_NEGINF] --> [1,1] --> OK [0.19999998E1,TO_NEGINF] --> [1,1] --> OK [0.19999999E1,TO_NEGINF] --> [1,1] --> OK [0.2E1,TO_NEGINF] --> [2,2] --> OK [0.20000153E1,TO_NEGINF] --> [2,2] --> OK [0.2000015E1,TO_NEGINF] --> [2,2] --> OK [0.20000148E1,TO_NEGINF] --> [2,2] --> OK [0.20000145E1,TO_NEGINF] --> [2,2] --> OK [0.20000143E1,TO_NEGINF] --> [2,2] --> OK [0.2000014E1,TO_NEGINF] --> [2,2] --> OK [0.20000138E1,TO_NEGINF] --> [2,2] --> OK [0.20000136E1,TO_NEGINF] --> [2,2] --> OK [0.20000134E1,TO_NEGINF] --> [2,2] --> OK [0.2000013E1,TO_NEGINF] --> [2,2] --> OK [0.20000129E1,TO_NEGINF] --> [2,2] --> OK [0.20000126E1,TO_NEGINF] --> [2,2] --> OK [0.20000124E1,TO_NEGINF] --> [2,2] --> OK [0.20000122E1,TO_NEGINF] --> [2,2] --> OK [0.2000012E1,TO_NEGINF] --> [2,2] --> OK [0.20000117E1,TO_NEGINF] --> [2,2] --> OK [0.20000114E1,TO_NEGINF] --> [2,2] --> OK [0.20000112E1,TO_NEGINF] --> [2,2] --> OK [0.2000011E1,TO_NEGINF] --> [2,2] --> OK [0.20000107E1,TO_NEGINF] --> [2,2] --> OK [0.20000105E1,TO_NEGINF] --> [2,2] --> OK [0.20000103E1,TO_NEGINF] --> [2,2] --> OK [0.200001E1,TO_NEGINF] --> [2,2] --> OK [0.20000098E1,TO_NEGINF] --> [2,2] --> OK [0.20000095E1,TO_NEGINF] --> [2,2] --> OK [0.20000093E1,TO_NEGINF] --> [2,2] --> OK [0.2000009E1,TO_NEGINF] --> [2,2] --> OK [0.20000088E1,TO_NEGINF] --> [2,2] --> OK [0.20000086E1,TO_NEGINF] --> [2,2] --> OK [0.20000083E1,TO_NEGINF] --> [2,2] --> OK [0.2000008E1,TO_NEGINF] --> [2,2] --> OK [0.20000079E1,TO_NEGINF] --> [2,2] --> OK [0.20000076E1,TO_NEGINF] --> [2,2] --> OK [0.20000074E1,TO_NEGINF] --> [2,2] --> OK [0.20000072E1,TO_NEGINF] --> [2,2] --> OK [0.2000007E1,TO_NEGINF] --> [2,2] --> OK [0.20000067E1,TO_NEGINF] --> [2,2] --> OK [0.20000064E1,TO_NEGINF] --> [2,2] --> OK [0.20000062E1,TO_NEGINF] --> [2,2] --> OK [0.2000006E1,TO_NEGINF] --> [2,2] --> OK [0.20000057E1,TO_NEGINF] --> [2,2] --> OK [0.20000055E1,TO_NEGINF] --> [2,2] --> OK [0.20000052E1,TO_NEGINF] --> [2,2] --> OK [0.2000005E1,TO_NEGINF] --> [2,2] --> OK [0.20000048E1,TO_NEGINF] --> [2,2] --> OK [0.20000045E1,TO_NEGINF] --> [2,2] --> OK [0.20000043E1,TO_NEGINF] --> [2,2] --> OK [0.2000004E1,TO_NEGINF] --> [2,2] --> OK [0.20000038E1,TO_NEGINF] --> [2,2] --> OK [0.20000036E1,TO_NEGINF] --> [2,2] --> OK [0.20000033E1,TO_NEGINF] --> [2,2] --> OK [0.2000003E1,TO_NEGINF] --> [2,2] --> OK [0.20000029E1,TO_NEGINF] --> [2,2] --> OK [0.20000026E1,TO_NEGINF] --> [2,2] --> OK [0.20000024E1,TO_NEGINF] --> [2,2] --> OK [0.20000021E1,TO_NEGINF] --> [2,2] --> OK [0.2000002E1,TO_NEGINF] --> [2,2] --> OK [0.20000017E1,TO_NEGINF] --> [2,2] --> OK [0.20000014E1,TO_NEGINF] --> [2,2] --> OK [0.20000012E1,TO_NEGINF] --> [2,2] --> OK [0.2000001E1,TO_NEGINF] --> [2,2] --> OK [0.20000007E1,TO_NEGINF] --> [2,2] --> OK [0.20000005E1,TO_NEGINF] --> [2,2] --> OK [0.20000002E1,TO_NEGINF] --> [2,2] --> OK [0.29999847E1,TO_NEGINF] --> [2,2] --> OK [0.2999985E1,TO_NEGINF] --> [2,2] --> OK [0.29999852E1,TO_NEGINF] --> [2,2] --> OK [0.29999855E1,TO_NEGINF] --> [2,2] --> OK [0.29999857E1,TO_NEGINF] --> [2,2] --> OK [0.2999986E1,TO_NEGINF] --> [2,2] --> OK [0.29999862E1,TO_NEGINF] --> [2,2] --> OK [0.29999864E1,TO_NEGINF] --> [2,2] --> OK [0.29999866E1,TO_NEGINF] --> [2,2] --> OK [0.2999987E1,TO_NEGINF] --> [2,2] --> OK [0.29999871E1,TO_NEGINF] --> [2,2] --> OK [0.29999874E1,TO_NEGINF] --> [2,2] --> OK [0.29999876E1,TO_NEGINF] --> [2,2] --> OK [0.29999878E1,TO_NEGINF] --> [2,2] --> OK [0.2999988E1,TO_NEGINF] --> [2,2] --> OK [0.29999883E1,TO_NEGINF] --> [2,2] --> OK [0.29999886E1,TO_NEGINF] --> [2,2] --> OK [0.29999888E1,TO_NEGINF] --> [2,2] --> OK [0.2999989E1,TO_NEGINF] --> [2,2] --> OK [0.29999893E1,TO_NEGINF] --> [2,2] --> OK [0.29999895E1,TO_NEGINF] --> [2,2] --> OK [0.29999897E1,TO_NEGINF] --> [2,2] --> OK [0.299999E1,TO_NEGINF] --> [2,2] --> OK [0.29999902E1,TO_NEGINF] --> [2,2] --> OK [0.29999905E1,TO_NEGINF] --> [2,2] --> OK [0.29999907E1,TO_NEGINF] --> [2,2] --> OK [0.2999991E1,TO_NEGINF] --> [2,2] --> OK [0.29999912E1,TO_NEGINF] --> [2,2] --> OK [0.29999914E1,TO_NEGINF] --> [2,2] --> OK [0.29999917E1,TO_NEGINF] --> [2,2] --> OK [0.2999992E1,TO_NEGINF] --> [2,2] --> OK [0.29999921E1,TO_NEGINF] --> [2,2] --> OK [0.29999924E1,TO_NEGINF] --> [2,2] --> OK [0.29999926E1,TO_NEGINF] --> [2,2] --> OK [0.29999928E1,TO_NEGINF] --> [2,2] --> OK [0.2999993E1,TO_NEGINF] --> [2,2] --> OK [0.29999933E1,TO_NEGINF] --> [2,2] --> OK [0.29999936E1,TO_NEGINF] --> [2,2] --> OK [0.29999938E1,TO_NEGINF] --> [2,2] --> OK [0.2999994E1,TO_NEGINF] --> [2,2] --> OK [0.29999943E1,TO_NEGINF] --> [2,2] --> OK [0.29999945E1,TO_NEGINF] --> [2,2] --> OK [0.29999948E1,TO_NEGINF] --> [2,2] --> OK [0.2999995E1,TO_NEGINF] --> [2,2] --> OK [0.29999952E1,TO_NEGINF] --> [2,2] --> OK [0.29999955E1,TO_NEGINF] --> [2,2] --> OK [0.29999957E1,TO_NEGINF] --> [2,2] --> OK [0.2999996E1,TO_NEGINF] --> [2,2] --> OK [0.29999962E1,TO_NEGINF] --> [2,2] --> OK [0.29999964E1,TO_NEGINF] --> [2,2] --> OK [0.29999967E1,TO_NEGINF] --> [2,2] --> OK [0.2999997E1,TO_NEGINF] --> [2,2] --> OK [0.29999971E1,TO_NEGINF] --> [2,2] --> OK [0.29999974E1,TO_NEGINF] --> [2,2] --> OK [0.29999976E1,TO_NEGINF] --> [2,2] --> OK [0.29999979E1,TO_NEGINF] --> [2,2] --> OK [0.2999998E1,TO_NEGINF] --> [2,2] --> OK [0.29999983E1,TO_NEGINF] --> [2,2] --> OK [0.29999986E1,TO_NEGINF] --> [2,2] --> OK [0.29999988E1,TO_NEGINF] --> [2,2] --> OK [0.2999999E1,TO_NEGINF] --> [2,2] --> OK [0.29999993E1,TO_NEGINF] --> [2,2] --> OK [0.29999995E1,TO_NEGINF] --> [2,2] --> OK [0.29999998E1,TO_NEGINF] --> [2,2] --> OK [0.3E1,TO_NEGINF] --> [3,3] --> OK [0.30000153E1,TO_NEGINF] --> [3,3] --> OK [0.3000015E1,TO_NEGINF] --> [3,3] --> OK [0.30000148E1,TO_NEGINF] --> [3,3] --> OK [0.30000145E1,TO_NEGINF] --> [3,3] --> OK [0.30000143E1,TO_NEGINF] --> [3,3] --> OK [0.3000014E1,TO_NEGINF] --> [3,3] --> OK [0.30000138E1,TO_NEGINF] --> [3,3] --> OK [0.30000136E1,TO_NEGINF] --> [3,3] --> OK [0.30000134E1,TO_NEGINF] --> [3,3] --> OK [0.3000013E1,TO_NEGINF] --> [3,3] --> OK [0.30000129E1,TO_NEGINF] --> [3,3] --> OK [0.30000126E1,TO_NEGINF] --> [3,3] --> OK [0.30000124E1,TO_NEGINF] --> [3,3] --> OK [0.30000122E1,TO_NEGINF] --> [3,3] --> OK [0.3000012E1,TO_NEGINF] --> [3,3] --> OK [0.30000117E1,TO_NEGINF] --> [3,3] --> OK [0.30000114E1,TO_NEGINF] --> [3,3] --> OK [0.30000112E1,TO_NEGINF] --> [3,3] --> OK [0.3000011E1,TO_NEGINF] --> [3,3] --> OK [0.30000107E1,TO_NEGINF] --> [3,3] --> OK [0.30000105E1,TO_NEGINF] --> [3,3] --> OK [0.30000103E1,TO_NEGINF] --> [3,3] --> OK [0.300001E1,TO_NEGINF] --> [3,3] --> OK [0.30000098E1,TO_NEGINF] --> [3,3] --> OK [0.30000095E1,TO_NEGINF] --> [3,3] --> OK [0.30000093E1,TO_NEGINF] --> [3,3] --> OK [0.3000009E1,TO_NEGINF] --> [3,3] --> OK [0.30000088E1,TO_NEGINF] --> [3,3] --> OK [0.30000086E1,TO_NEGINF] --> [3,3] --> OK [0.30000083E1,TO_NEGINF] --> [3,3] --> OK [0.3000008E1,TO_NEGINF] --> [3,3] --> OK [0.30000079E1,TO_NEGINF] --> [3,3] --> OK [0.30000076E1,TO_NEGINF] --> [3,3] --> OK [0.30000074E1,TO_NEGINF] --> [3,3] --> OK [0.30000072E1,TO_NEGINF] --> [3,3] --> OK [0.3000007E1,TO_NEGINF] --> [3,3] --> OK [0.30000067E1,TO_NEGINF] --> [3,3] --> OK [0.30000064E1,TO_NEGINF] --> [3,3] --> OK [0.30000062E1,TO_NEGINF] --> [3,3] --> OK [0.3000006E1,TO_NEGINF] --> [3,3] --> OK [0.30000057E1,TO_NEGINF] --> [3,3] --> OK [0.30000055E1,TO_NEGINF] --> [3,3] --> OK [0.30000052E1,TO_NEGINF] --> [3,3] --> OK [0.3000005E1,TO_NEGINF] --> [3,3] --> OK [0.30000048E1,TO_NEGINF] --> [3,3] --> OK [0.30000045E1,TO_NEGINF] --> [3,3] --> OK [0.30000043E1,TO_NEGINF] --> [3,3] --> OK [0.3000004E1,TO_NEGINF] --> [3,3] --> OK [0.30000038E1,TO_NEGINF] --> [3,3] --> OK [0.30000036E1,TO_NEGINF] --> [3,3] --> OK [0.30000033E1,TO_NEGINF] --> [3,3] --> OK [0.3000003E1,TO_NEGINF] --> [3,3] --> OK [0.30000029E1,TO_NEGINF] --> [3,3] --> OK [0.30000026E1,TO_NEGINF] --> [3,3] --> OK [0.30000024E1,TO_NEGINF] --> [3,3] --> OK [0.30000021E1,TO_NEGINF] --> [3,3] --> OK [0.3000002E1,TO_NEGINF] --> [3,3] --> OK [0.30000017E1,TO_NEGINF] --> [3,3] --> OK [0.30000014E1,TO_NEGINF] --> [3,3] --> OK [0.30000012E1,TO_NEGINF] --> [3,3] --> OK [0.3000001E1,TO_NEGINF] --> [3,3] --> OK [0.30000007E1,TO_NEGINF] --> [3,3] --> OK [0.30000005E1,TO_NEGINF] --> [3,3] --> OK [0.30000002E1,TO_NEGINF] --> [3,3] --> OK [0.1073737728E10,TO_NEGINF] --> [1073737728,1073737728] --> OK [0.1073737792E10,TO_NEGINF] --> [1073737792,1073737792] --> OK [0.1073737856E10,TO_NEGINF] --> [1073737856,1073737856] --> OK [0.107373792E10,TO_NEGINF] --> [1073737920,1073737920] --> OK [0.1073737984E10,TO_NEGINF] --> [1073737984,1073737984] --> OK [0.1073738048E10,TO_NEGINF] --> [1073738048,1073738048] --> OK [0.1073738112E10,TO_NEGINF] --> [1073738112,1073738112] --> OK [0.1073738176E10,TO_NEGINF] --> [1073738176,1073738176] --> OK [0.107373824E10,TO_NEGINF] --> [1073738240,1073738240] --> OK [0.1073738304E10,TO_NEGINF] --> [1073738304,1073738304] --> OK [0.1073738368E10,TO_NEGINF] --> [1073738368,1073738368] --> OK [0.1073738432E10,TO_NEGINF] --> [1073738432,1073738432] --> OK [0.1073738496E10,TO_NEGINF] --> [1073738496,1073738496] --> OK [0.107373856E10,TO_NEGINF] --> [1073738560,1073738560] --> OK [0.1073738624E10,TO_NEGINF] --> [1073738624,1073738624] --> OK [0.1073738688E10,TO_NEGINF] --> [1073738688,1073738688] --> OK [0.1073738752E10,TO_NEGINF] --> [1073738752,1073738752] --> OK [0.1073738816E10,TO_NEGINF] --> [1073738816,1073738816] --> OK [0.107373888E10,TO_NEGINF] --> [1073738880,1073738880] --> OK [0.1073738944E10,TO_NEGINF] --> [1073738944,1073738944] --> OK [0.1073739008E10,TO_NEGINF] --> [1073739008,1073739008] --> OK [0.1073739072E10,TO_NEGINF] --> [1073739072,1073739072] --> OK [0.1073739136E10,TO_NEGINF] --> [1073739136,1073739136] --> OK [0.10737392E10,TO_NEGINF] --> [1073739200,1073739200] --> OK [0.1073739264E10,TO_NEGINF] --> [1073739264,1073739264] --> OK [0.1073739328E10,TO_NEGINF] --> [1073739328,1073739328] --> OK [0.1073739392E10,TO_NEGINF] --> [1073739392,1073739392] --> OK [0.1073739456E10,TO_NEGINF] --> [1073739456,1073739456] --> OK [0.107373952E10,TO_NEGINF] --> [1073739520,1073739520] --> OK [0.1073739584E10,TO_NEGINF] --> [1073739584,1073739584] --> OK [0.1073739648E10,TO_NEGINF] --> [1073739648,1073739648] --> OK [0.1073739712E10,TO_NEGINF] --> [1073739712,1073739712] --> OK [0.1073739776E10,TO_NEGINF] --> [1073739776,1073739776] --> OK [0.107373984E10,TO_NEGINF] --> [1073739840,1073739840] --> OK [0.1073739904E10,TO_NEGINF] --> [1073739904,1073739904] --> OK [0.1073739968E10,TO_NEGINF] --> [1073739968,1073739968] --> OK [0.1073740032E10,TO_NEGINF] --> [1073740032,1073740032] --> OK [0.1073740096E10,TO_NEGINF] --> [1073740096,1073740096] --> OK [0.107374016E10,TO_NEGINF] --> [1073740160,1073740160] --> OK [0.1073740224E10,TO_NEGINF] --> [1073740224,1073740224] --> OK [0.1073740288E10,TO_NEGINF] --> [1073740288,1073740288] --> OK [0.1073740352E10,TO_NEGINF] --> [1073740352,1073740352] --> OK [0.1073740416E10,TO_NEGINF] --> [1073740416,1073740416] --> OK [0.107374048E10,TO_NEGINF] --> [1073740480,1073740480] --> OK [0.1073740544E10,TO_NEGINF] --> [1073740544,1073740544] --> OK [0.1073740608E10,TO_NEGINF] --> [1073740608,1073740608] --> OK [0.1073740672E10,TO_NEGINF] --> [1073740672,1073740672] --> OK [0.1073740736E10,TO_NEGINF] --> [1073740736,1073740736] --> OK [0.10737408E10,TO_NEGINF] --> [1073740800,1073740800] --> OK [0.1073740864E10,TO_NEGINF] --> [1073740864,1073740864] --> OK [0.1073740928E10,TO_NEGINF] --> [1073740928,1073740928] --> OK [0.1073740992E10,TO_NEGINF] --> [1073740992,1073740992] --> OK [0.1073741056E10,TO_NEGINF] --> [1073741056,1073741056] --> OK [0.107374112E10,TO_NEGINF] --> [1073741120,1073741120] --> OK [0.1073741184E10,TO_NEGINF] --> [1073741184,1073741184] --> OK [0.1073741248E10,TO_NEGINF] --> [1073741248,1073741248] --> OK [0.1073741312E10,TO_NEGINF] --> [1073741312,1073741312] --> OK [0.1073741376E10,TO_NEGINF] --> [1073741376,1073741376] --> OK [0.107374144E10,TO_NEGINF] --> [1073741440,1073741440] --> OK [0.1073741504E10,TO_NEGINF] --> [1073741504,1073741504] --> OK [0.1073741568E10,TO_NEGINF] --> [1073741568,1073741568] --> OK [0.1073741632E10,TO_NEGINF] --> [1073741632,1073741632] --> OK [0.1073741696E10,TO_NEGINF] --> [1073741696,1073741696] --> OK [0.107374176E10,TO_NEGINF] --> [1073741760,1073741760] --> OK [0.1073741824E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073750016E10,TO_NEGINF] --> [1073750016,1073750016] --> OK [0.1073749888E10,TO_NEGINF] --> [1073749888,1073749888] --> OK [0.107374976E10,TO_NEGINF] --> [1073749760,1073749760] --> OK [0.1073749632E10,TO_NEGINF] --> [1073749632,1073749632] --> OK [0.1073749504E10,TO_NEGINF] --> [1073749504,1073749504] --> OK [0.1073749376E10,TO_NEGINF] --> [1073749376,1073749376] --> OK [0.1073749248E10,TO_NEGINF] --> [1073749248,1073749248] --> OK [0.107374912E10,TO_NEGINF] --> [1073749120,1073749120] --> OK [0.1073748992E10,TO_NEGINF] --> [1073748992,1073748992] --> OK [0.1073748864E10,TO_NEGINF] --> [1073748864,1073748864] --> OK [0.1073748736E10,TO_NEGINF] --> [1073748736,1073748736] --> OK [0.1073748608E10,TO_NEGINF] --> [1073748608,1073748608] --> OK [0.107374848E10,TO_NEGINF] --> [1073748480,1073748480] --> OK [0.1073748352E10,TO_NEGINF] --> [1073748352,1073748352] --> OK [0.1073748224E10,TO_NEGINF] --> [1073748224,1073748224] --> OK [0.1073748096E10,TO_NEGINF] --> [1073748096,1073748096] --> OK [0.1073747968E10,TO_NEGINF] --> [1073747968,1073747968] --> OK [0.107374784E10,TO_NEGINF] --> [1073747840,1073747840] --> OK [0.1073747712E10,TO_NEGINF] --> [1073747712,1073747712] --> OK [0.1073747584E10,TO_NEGINF] --> [1073747584,1073747584] --> OK [0.1073747456E10,TO_NEGINF] --> [1073747456,1073747456] --> OK [0.1073747328E10,TO_NEGINF] --> [1073747328,1073747328] --> OK [0.10737472E10,TO_NEGINF] --> [1073747200,1073747200] --> OK [0.1073747072E10,TO_NEGINF] --> [1073747072,1073747072] --> OK [0.1073746944E10,TO_NEGINF] --> [1073746944,1073746944] --> OK [0.1073746816E10,TO_NEGINF] --> [1073746816,1073746816] --> OK [0.1073746688E10,TO_NEGINF] --> [1073746688,1073746688] --> OK [0.107374656E10,TO_NEGINF] --> [1073746560,1073746560] --> OK [0.1073746432E10,TO_NEGINF] --> [1073746432,1073746432] --> OK [0.1073746304E10,TO_NEGINF] --> [1073746304,1073746304] --> OK [0.1073746176E10,TO_NEGINF] --> [1073746176,1073746176] --> OK [0.1073746048E10,TO_NEGINF] --> [1073746048,1073746048] --> OK [0.107374592E10,TO_NEGINF] --> [1073745920,1073745920] --> OK [0.1073745792E10,TO_NEGINF] --> [1073745792,1073745792] --> OK [0.1073745664E10,TO_NEGINF] --> [1073745664,1073745664] --> OK [0.1073745536E10,TO_NEGINF] --> [1073745536,1073745536] --> OK [0.1073745408E10,TO_NEGINF] --> [1073745408,1073745408] --> OK [0.107374528E10,TO_NEGINF] --> [1073745280,1073745280] --> OK [0.1073745152E10,TO_NEGINF] --> [1073745152,1073745152] --> OK [0.1073745024E10,TO_NEGINF] --> [1073745024,1073745024] --> OK [0.1073744896E10,TO_NEGINF] --> [1073744896,1073744896] --> OK [0.1073744768E10,TO_NEGINF] --> [1073744768,1073744768] --> OK [0.107374464E10,TO_NEGINF] --> [1073744640,1073744640] --> OK [0.1073744512E10,TO_NEGINF] --> [1073744512,1073744512] --> OK [0.1073744384E10,TO_NEGINF] --> [1073744384,1073744384] --> OK [0.1073744256E10,TO_NEGINF] --> [1073744256,1073744256] --> OK [0.1073744128E10,TO_NEGINF] --> [1073744128,1073744128] --> OK [0.1073744E10,TO_NEGINF] --> [1073744000,1073744000] --> OK [0.1073743872E10,TO_NEGINF] --> [1073743872,1073743872] --> OK [0.1073743744E10,TO_NEGINF] --> [1073743744,1073743744] --> OK [0.1073743616E10,TO_NEGINF] --> [1073743616,1073743616] --> OK [0.1073743488E10,TO_NEGINF] --> [1073743488,1073743488] --> OK [0.107374336E10,TO_NEGINF] --> [1073743360,1073743360] --> OK [0.1073743232E10,TO_NEGINF] --> [1073743232,1073743232] --> OK [0.1073743104E10,TO_NEGINF] --> [1073743104,1073743104] --> OK [0.1073742976E10,TO_NEGINF] --> [1073742976,1073742976] --> OK [0.1073742848E10,TO_NEGINF] --> [1073742848,1073742848] --> OK [0.107374272E10,TO_NEGINF] --> [1073742720,1073742720] --> OK [0.1073742592E10,TO_NEGINF] --> [1073742592,1073742592] --> OK [0.1073742464E10,TO_NEGINF] --> [1073742464,1073742464] --> OK [0.1073742336E10,TO_NEGINF] --> [1073742336,1073742336] --> OK [0.1073742208E10,TO_NEGINF] --> [1073742208,1073742208] --> OK [0.107374208E10,TO_NEGINF] --> [1073742080,1073742080] --> OK [0.1073741952E10,TO_NEGINF] --> [1073741952,1073741952] --> OK [0.1610604544E10,TO_NEGINF] --> [1610604544,1610604544] --> OK [0.1610604672E10,TO_NEGINF] --> [1610604672,1610604672] --> OK [0.16106048E10,TO_NEGINF] --> [1610604800,1610604800] --> OK [0.1610604928E10,TO_NEGINF] --> [1610604928,1610604928] --> OK [0.1610605056E10,TO_NEGINF] --> [1610605056,1610605056] --> OK [0.1610605184E10,TO_NEGINF] --> [1610605184,1610605184] --> OK [0.1610605312E10,TO_NEGINF] --> [1610605312,1610605312] --> OK [0.161060544E10,TO_NEGINF] --> [1610605440,1610605440] --> OK [0.1610605568E10,TO_NEGINF] --> [1610605568,1610605568] --> OK [0.1610605696E10,TO_NEGINF] --> [1610605696,1610605696] --> OK [0.1610605824E10,TO_NEGINF] --> [1610605824,1610605824] --> OK [0.1610605952E10,TO_NEGINF] --> [1610605952,1610605952] --> OK [0.161060608E10,TO_NEGINF] --> [1610606080,1610606080] --> OK [0.1610606208E10,TO_NEGINF] --> [1610606208,1610606208] --> OK [0.1610606336E10,TO_NEGINF] --> [1610606336,1610606336] --> OK [0.1610606464E10,TO_NEGINF] --> [1610606464,1610606464] --> OK [0.1610606592E10,TO_NEGINF] --> [1610606592,1610606592] --> OK [0.161060672E10,TO_NEGINF] --> [1610606720,1610606720] --> OK [0.1610606848E10,TO_NEGINF] --> [1610606848,1610606848] --> OK [0.1610606976E10,TO_NEGINF] --> [1610606976,1610606976] --> OK [0.1610607104E10,TO_NEGINF] --> [1610607104,1610607104] --> OK [0.1610607232E10,TO_NEGINF] --> [1610607232,1610607232] --> OK [0.161060736E10,TO_NEGINF] --> [1610607360,1610607360] --> OK [0.1610607488E10,TO_NEGINF] --> [1610607488,1610607488] --> OK [0.1610607616E10,TO_NEGINF] --> [1610607616,1610607616] --> OK [0.1610607744E10,TO_NEGINF] --> [1610607744,1610607744] --> OK [0.1610607872E10,TO_NEGINF] --> [1610607872,1610607872] --> OK [0.1610608E10,TO_NEGINF] --> [1610608000,1610608000] --> OK [0.1610608128E10,TO_NEGINF] --> [1610608128,1610608128] --> OK [0.1610608256E10,TO_NEGINF] --> [1610608256,1610608256] --> OK [0.1610608384E10,TO_NEGINF] --> [1610608384,1610608384] --> OK [0.1610608512E10,TO_NEGINF] --> [1610608512,1610608512] --> OK [0.161060864E10,TO_NEGINF] --> [1610608640,1610608640] --> OK [0.1610608768E10,TO_NEGINF] --> [1610608768,1610608768] --> OK [0.1610608896E10,TO_NEGINF] --> [1610608896,1610608896] --> OK [0.1610609024E10,TO_NEGINF] --> [1610609024,1610609024] --> OK [0.1610609152E10,TO_NEGINF] --> [1610609152,1610609152] --> OK [0.161060928E10,TO_NEGINF] --> [1610609280,1610609280] --> OK [0.1610609408E10,TO_NEGINF] --> [1610609408,1610609408] --> OK [0.1610609536E10,TO_NEGINF] --> [1610609536,1610609536] --> OK [0.1610609664E10,TO_NEGINF] --> [1610609664,1610609664] --> OK [0.1610609792E10,TO_NEGINF] --> [1610609792,1610609792] --> OK [0.161060992E10,TO_NEGINF] --> [1610609920,1610609920] --> OK [0.1610610048E10,TO_NEGINF] --> [1610610048,1610610048] --> OK [0.1610610176E10,TO_NEGINF] --> [1610610176,1610610176] --> OK [0.1610610304E10,TO_NEGINF] --> [1610610304,1610610304] --> OK [0.1610610432E10,TO_NEGINF] --> [1610610432,1610610432] --> OK [0.161061056E10,TO_NEGINF] --> [1610610560,1610610560] --> OK [0.1610610688E10,TO_NEGINF] --> [1610610688,1610610688] --> OK [0.1610610816E10,TO_NEGINF] --> [1610610816,1610610816] --> OK [0.1610610944E10,TO_NEGINF] --> [1610610944,1610610944] --> OK [0.1610611072E10,TO_NEGINF] --> [1610611072,1610611072] --> OK [0.16106112E10,TO_NEGINF] --> [1610611200,1610611200] --> OK [0.1610611328E10,TO_NEGINF] --> [1610611328,1610611328] --> OK [0.1610611456E10,TO_NEGINF] --> [1610611456,1610611456] --> OK [0.1610611584E10,TO_NEGINF] --> [1610611584,1610611584] --> OK [0.1610611712E10,TO_NEGINF] --> [1610611712,1610611712] --> OK [0.161061184E10,TO_NEGINF] --> [1610611840,1610611840] --> OK [0.1610611968E10,TO_NEGINF] --> [1610611968,1610611968] --> OK [0.1610612096E10,TO_NEGINF] --> [1610612096,1610612096] --> OK [0.1610612224E10,TO_NEGINF] --> [1610612224,1610612224] --> OK [0.1610612352E10,TO_NEGINF] --> [1610612352,1610612352] --> OK [0.161061248E10,TO_NEGINF] --> [1610612480,1610612480] --> OK [0.1610612608E10,TO_NEGINF] --> [1610612608,1610612608] --> OK [0.1610612736E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610620928E10,TO_NEGINF] --> [1610620928,1610620928] --> OK [0.16106208E10,TO_NEGINF] --> [1610620800,1610620800] --> OK [0.1610620672E10,TO_NEGINF] --> [1610620672,1610620672] --> OK [0.1610620544E10,TO_NEGINF] --> [1610620544,1610620544] --> OK [0.1610620416E10,TO_NEGINF] --> [1610620416,1610620416] --> OK [0.1610620288E10,TO_NEGINF] --> [1610620288,1610620288] --> OK [0.161062016E10,TO_NEGINF] --> [1610620160,1610620160] --> OK [0.1610620032E10,TO_NEGINF] --> [1610620032,1610620032] --> OK [0.1610619904E10,TO_NEGINF] --> [1610619904,1610619904] --> OK [0.1610619776E10,TO_NEGINF] --> [1610619776,1610619776] --> OK [0.1610619648E10,TO_NEGINF] --> [1610619648,1610619648] --> OK [0.161061952E10,TO_NEGINF] --> [1610619520,1610619520] --> OK [0.1610619392E10,TO_NEGINF] --> [1610619392,1610619392] --> OK [0.1610619264E10,TO_NEGINF] --> [1610619264,1610619264] --> OK [0.1610619136E10,TO_NEGINF] --> [1610619136,1610619136] --> OK [0.1610619008E10,TO_NEGINF] --> [1610619008,1610619008] --> OK [0.161061888E10,TO_NEGINF] --> [1610618880,1610618880] --> OK [0.1610618752E10,TO_NEGINF] --> [1610618752,1610618752] --> OK [0.1610618624E10,TO_NEGINF] --> [1610618624,1610618624] --> OK [0.1610618496E10,TO_NEGINF] --> [1610618496,1610618496] --> OK [0.1610618368E10,TO_NEGINF] --> [1610618368,1610618368] --> OK [0.161061824E10,TO_NEGINF] --> [1610618240,1610618240] --> OK [0.1610618112E10,TO_NEGINF] --> [1610618112,1610618112] --> OK [0.1610617984E10,TO_NEGINF] --> [1610617984,1610617984] --> OK [0.1610617856E10,TO_NEGINF] --> [1610617856,1610617856] --> OK [0.1610617728E10,TO_NEGINF] --> [1610617728,1610617728] --> OK [0.16106176E10,TO_NEGINF] --> [1610617600,1610617600] --> OK [0.1610617472E10,TO_NEGINF] --> [1610617472,1610617472] --> OK [0.1610617344E10,TO_NEGINF] --> [1610617344,1610617344] --> OK [0.1610617216E10,TO_NEGINF] --> [1610617216,1610617216] --> OK [0.1610617088E10,TO_NEGINF] --> [1610617088,1610617088] --> OK [0.161061696E10,TO_NEGINF] --> [1610616960,1610616960] --> OK [0.1610616832E10,TO_NEGINF] --> [1610616832,1610616832] --> OK [0.1610616704E10,TO_NEGINF] --> [1610616704,1610616704] --> OK [0.1610616576E10,TO_NEGINF] --> [1610616576,1610616576] --> OK [0.1610616448E10,TO_NEGINF] --> [1610616448,1610616448] --> OK [0.161061632E10,TO_NEGINF] --> [1610616320,1610616320] --> OK [0.1610616192E10,TO_NEGINF] --> [1610616192,1610616192] --> OK [0.1610616064E10,TO_NEGINF] --> [1610616064,1610616064] --> OK [0.1610615936E10,TO_NEGINF] --> [1610615936,1610615936] --> OK [0.1610615808E10,TO_NEGINF] --> [1610615808,1610615808] --> OK [0.161061568E10,TO_NEGINF] --> [1610615680,1610615680] --> OK [0.1610615552E10,TO_NEGINF] --> [1610615552,1610615552] --> OK [0.1610615424E10,TO_NEGINF] --> [1610615424,1610615424] --> OK [0.1610615296E10,TO_NEGINF] --> [1610615296,1610615296] --> OK [0.1610615168E10,TO_NEGINF] --> [1610615168,1610615168] --> OK [0.161061504E10,TO_NEGINF] --> [1610615040,1610615040] --> OK [0.1610614912E10,TO_NEGINF] --> [1610614912,1610614912] --> OK [0.1610614784E10,TO_NEGINF] --> [1610614784,1610614784] --> OK [0.1610614656E10,TO_NEGINF] --> [1610614656,1610614656] --> OK [0.1610614528E10,TO_NEGINF] --> [1610614528,1610614528] --> OK [0.16106144E10,TO_NEGINF] --> [1610614400,1610614400] --> OK [0.1610614272E10,TO_NEGINF] --> [1610614272,1610614272] --> OK [0.1610614144E10,TO_NEGINF] --> [1610614144,1610614144] --> OK [0.1610614016E10,TO_NEGINF] --> [1610614016,1610614016] --> OK [0.1610613888E10,TO_NEGINF] --> [1610613888,1610613888] --> OK [0.161061376E10,TO_NEGINF] --> [1610613760,1610613760] --> OK [0.1610613632E10,TO_NEGINF] --> [1610613632,1610613632] --> OK [0.1610613504E10,TO_NEGINF] --> [1610613504,1610613504] --> OK [0.1610613376E10,TO_NEGINF] --> [1610613376,1610613376] --> OK [0.1610613248E10,TO_NEGINF] --> [1610613248,1610613248] --> OK [0.161061312E10,TO_NEGINF] --> [1610613120,1610613120] --> OK [0.1610612992E10,TO_NEGINF] --> [1610612992,1610612992] --> OK [0.1610612864E10,TO_NEGINF] --> [1610612864,1610612864] --> OK [0.187904E10,TO_NEGINF] --> [1879040000,1879040000] --> OK [0.1879040128E10,TO_NEGINF] --> [1879040128,1879040128] --> OK [0.1879040256E10,TO_NEGINF] --> [1879040256,1879040256] --> OK [0.1879040384E10,TO_NEGINF] --> [1879040384,1879040384] --> OK [0.1879040512E10,TO_NEGINF] --> [1879040512,1879040512] --> OK [0.187904064E10,TO_NEGINF] --> [1879040640,1879040640] --> OK [0.1879040768E10,TO_NEGINF] --> [1879040768,1879040768] --> OK [0.1879040896E10,TO_NEGINF] --> [1879040896,1879040896] --> OK [0.1879041024E10,TO_NEGINF] --> [1879041024,1879041024] --> OK [0.1879041152E10,TO_NEGINF] --> [1879041152,1879041152] --> OK [0.187904128E10,TO_NEGINF] --> [1879041280,1879041280] --> OK [0.1879041408E10,TO_NEGINF] --> [1879041408,1879041408] --> OK [0.1879041536E10,TO_NEGINF] --> [1879041536,1879041536] --> OK [0.1879041664E10,TO_NEGINF] --> [1879041664,1879041664] --> OK [0.1879041792E10,TO_NEGINF] --> [1879041792,1879041792] --> OK [0.187904192E10,TO_NEGINF] --> [1879041920,1879041920] --> OK [0.1879042048E10,TO_NEGINF] --> [1879042048,1879042048] --> OK [0.1879042176E10,TO_NEGINF] --> [1879042176,1879042176] --> OK [0.1879042304E10,TO_NEGINF] --> [1879042304,1879042304] --> OK [0.1879042432E10,TO_NEGINF] --> [1879042432,1879042432] --> OK [0.187904256E10,TO_NEGINF] --> [1879042560,1879042560] --> OK [0.1879042688E10,TO_NEGINF] --> [1879042688,1879042688] --> OK [0.1879042816E10,TO_NEGINF] --> [1879042816,1879042816] --> OK [0.1879042944E10,TO_NEGINF] --> [1879042944,1879042944] --> OK [0.1879043072E10,TO_NEGINF] --> [1879043072,1879043072] --> OK [0.18790432E10,TO_NEGINF] --> [1879043200,1879043200] --> OK [0.1879043328E10,TO_NEGINF] --> [1879043328,1879043328] --> OK [0.1879043456E10,TO_NEGINF] --> [1879043456,1879043456] --> OK [0.1879043584E10,TO_NEGINF] --> [1879043584,1879043584] --> OK [0.1879043712E10,TO_NEGINF] --> [1879043712,1879043712] --> OK [0.187904384E10,TO_NEGINF] --> [1879043840,1879043840] --> OK [0.1879043968E10,TO_NEGINF] --> [1879043968,1879043968] --> OK [0.1879044096E10,TO_NEGINF] --> [1879044096,1879044096] --> OK [0.1879044224E10,TO_NEGINF] --> [1879044224,1879044224] --> OK [0.1879044352E10,TO_NEGINF] --> [1879044352,1879044352] --> OK [0.187904448E10,TO_NEGINF] --> [1879044480,1879044480] --> OK [0.1879044608E10,TO_NEGINF] --> [1879044608,1879044608] --> OK [0.1879044736E10,TO_NEGINF] --> [1879044736,1879044736] --> OK [0.1879044864E10,TO_NEGINF] --> [1879044864,1879044864] --> OK [0.1879044992E10,TO_NEGINF] --> [1879044992,1879044992] --> OK [0.187904512E10,TO_NEGINF] --> [1879045120,1879045120] --> OK [0.1879045248E10,TO_NEGINF] --> [1879045248,1879045248] --> OK [0.1879045376E10,TO_NEGINF] --> [1879045376,1879045376] --> OK [0.1879045504E10,TO_NEGINF] --> [1879045504,1879045504] --> OK [0.1879045632E10,TO_NEGINF] --> [1879045632,1879045632] --> OK [0.187904576E10,TO_NEGINF] --> [1879045760,1879045760] --> OK [0.1879045888E10,TO_NEGINF] --> [1879045888,1879045888] --> OK [0.1879046016E10,TO_NEGINF] --> [1879046016,1879046016] --> OK [0.1879046144E10,TO_NEGINF] --> [1879046144,1879046144] --> OK [0.1879046272E10,TO_NEGINF] --> [1879046272,1879046272] --> OK [0.18790464E10,TO_NEGINF] --> [1879046400,1879046400] --> OK [0.1879046528E10,TO_NEGINF] --> [1879046528,1879046528] --> OK [0.1879046656E10,TO_NEGINF] --> [1879046656,1879046656] --> OK [0.1879046784E10,TO_NEGINF] --> [1879046784,1879046784] --> OK [0.1879046912E10,TO_NEGINF] --> [1879046912,1879046912] --> OK [0.187904704E10,TO_NEGINF] --> [1879047040,1879047040] --> OK [0.1879047168E10,TO_NEGINF] --> [1879047168,1879047168] --> OK [0.1879047296E10,TO_NEGINF] --> [1879047296,1879047296] --> OK [0.1879047424E10,TO_NEGINF] --> [1879047424,1879047424] --> OK [0.1879047552E10,TO_NEGINF] --> [1879047552,1879047552] --> OK [0.187904768E10,TO_NEGINF] --> [1879047680,1879047680] --> OK [0.1879047808E10,TO_NEGINF] --> [1879047808,1879047808] --> OK [0.1879047936E10,TO_NEGINF] --> [1879047936,1879047936] --> OK [0.1879048064E10,TO_NEGINF] --> [1879048064,1879048064] --> OK [0.1879048192E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879056384E10,TO_NEGINF] --> [1879056384,1879056384] --> OK [0.1879056256E10,TO_NEGINF] --> [1879056256,1879056256] --> OK [0.1879056128E10,TO_NEGINF] --> [1879056128,1879056128] --> OK [0.1879056E10,TO_NEGINF] --> [1879056000,1879056000] --> OK [0.1879055872E10,TO_NEGINF] --> [1879055872,1879055872] --> OK [0.1879055744E10,TO_NEGINF] --> [1879055744,1879055744] --> OK [0.1879055616E10,TO_NEGINF] --> [1879055616,1879055616] --> OK [0.1879055488E10,TO_NEGINF] --> [1879055488,1879055488] --> OK [0.187905536E10,TO_NEGINF] --> [1879055360,1879055360] --> OK [0.1879055232E10,TO_NEGINF] --> [1879055232,1879055232] --> OK [0.1879055104E10,TO_NEGINF] --> [1879055104,1879055104] --> OK [0.1879054976E10,TO_NEGINF] --> [1879054976,1879054976] --> OK [0.1879054848E10,TO_NEGINF] --> [1879054848,1879054848] --> OK [0.187905472E10,TO_NEGINF] --> [1879054720,1879054720] --> OK [0.1879054592E10,TO_NEGINF] --> [1879054592,1879054592] --> OK [0.1879054464E10,TO_NEGINF] --> [1879054464,1879054464] --> OK [0.1879054336E10,TO_NEGINF] --> [1879054336,1879054336] --> OK [0.1879054208E10,TO_NEGINF] --> [1879054208,1879054208] --> OK [0.187905408E10,TO_NEGINF] --> [1879054080,1879054080] --> OK [0.1879053952E10,TO_NEGINF] --> [1879053952,1879053952] --> OK [0.1879053824E10,TO_NEGINF] --> [1879053824,1879053824] --> OK [0.1879053696E10,TO_NEGINF] --> [1879053696,1879053696] --> OK [0.1879053568E10,TO_NEGINF] --> [1879053568,1879053568] --> OK [0.187905344E10,TO_NEGINF] --> [1879053440,1879053440] --> OK [0.1879053312E10,TO_NEGINF] --> [1879053312,1879053312] --> OK [0.1879053184E10,TO_NEGINF] --> [1879053184,1879053184] --> OK [0.1879053056E10,TO_NEGINF] --> [1879053056,1879053056] --> OK [0.1879052928E10,TO_NEGINF] --> [1879052928,1879052928] --> OK [0.18790528E10,TO_NEGINF] --> [1879052800,1879052800] --> OK [0.1879052672E10,TO_NEGINF] --> [1879052672,1879052672] --> OK [0.1879052544E10,TO_NEGINF] --> [1879052544,1879052544] --> OK [0.1879052416E10,TO_NEGINF] --> [1879052416,1879052416] --> OK [0.1879052288E10,TO_NEGINF] --> [1879052288,1879052288] --> OK [0.187905216E10,TO_NEGINF] --> [1879052160,1879052160] --> OK [0.1879052032E10,TO_NEGINF] --> [1879052032,1879052032] --> OK [0.1879051904E10,TO_NEGINF] --> [1879051904,1879051904] --> OK [0.1879051776E10,TO_NEGINF] --> [1879051776,1879051776] --> OK [0.1879051648E10,TO_NEGINF] --> [1879051648,1879051648] --> OK [0.187905152E10,TO_NEGINF] --> [1879051520,1879051520] --> OK [0.1879051392E10,TO_NEGINF] --> [1879051392,1879051392] --> OK [0.1879051264E10,TO_NEGINF] --> [1879051264,1879051264] --> OK [0.1879051136E10,TO_NEGINF] --> [1879051136,1879051136] --> OK [0.1879051008E10,TO_NEGINF] --> [1879051008,1879051008] --> OK [0.187905088E10,TO_NEGINF] --> [1879050880,1879050880] --> OK [0.1879050752E10,TO_NEGINF] --> [1879050752,1879050752] --> OK [0.1879050624E10,TO_NEGINF] --> [1879050624,1879050624] --> OK [0.1879050496E10,TO_NEGINF] --> [1879050496,1879050496] --> OK [0.1879050368E10,TO_NEGINF] --> [1879050368,1879050368] --> OK [0.187905024E10,TO_NEGINF] --> [1879050240,1879050240] --> OK [0.1879050112E10,TO_NEGINF] --> [1879050112,1879050112] --> OK [0.1879049984E10,TO_NEGINF] --> [1879049984,1879049984] --> OK [0.1879049856E10,TO_NEGINF] --> [1879049856,1879049856] --> OK [0.1879049728E10,TO_NEGINF] --> [1879049728,1879049728] --> OK [0.18790496E10,TO_NEGINF] --> [1879049600,1879049600] --> OK [0.1879049472E10,TO_NEGINF] --> [1879049472,1879049472] --> OK [0.1879049344E10,TO_NEGINF] --> [1879049344,1879049344] --> OK [0.1879049216E10,TO_NEGINF] --> [1879049216,1879049216] --> OK [0.1879049088E10,TO_NEGINF] --> [1879049088,1879049088] --> OK [0.187904896E10,TO_NEGINF] --> [1879048960,1879048960] --> OK [0.1879048832E10,TO_NEGINF] --> [1879048832,1879048832] --> OK [0.1879048704E10,TO_NEGINF] --> [1879048704,1879048704] --> OK [0.1879048576E10,TO_NEGINF] --> [1879048576,1879048576] --> OK [0.1879048448E10,TO_NEGINF] --> [1879048448,1879048448] --> OK [0.187904832E10,TO_NEGINF] --> [1879048320,1879048320] --> OK [0.2013257728E10,TO_NEGINF] --> [2013257728,2013257728] --> OK [0.2013257856E10,TO_NEGINF] --> [2013257856,2013257856] --> OK [0.2013257984E10,TO_NEGINF] --> [2013257984,2013257984] --> OK [0.2013258112E10,TO_NEGINF] --> [2013258112,2013258112] --> OK [0.201325824E10,TO_NEGINF] --> [2013258240,2013258240] --> OK [0.2013258368E10,TO_NEGINF] --> [2013258368,2013258368] --> OK [0.2013258496E10,TO_NEGINF] --> [2013258496,2013258496] --> OK [0.2013258624E10,TO_NEGINF] --> [2013258624,2013258624] --> OK [0.2013258752E10,TO_NEGINF] --> [2013258752,2013258752] --> OK [0.201325888E10,TO_NEGINF] --> [2013258880,2013258880] --> OK [0.2013259008E10,TO_NEGINF] --> [2013259008,2013259008] --> OK [0.2013259136E10,TO_NEGINF] --> [2013259136,2013259136] --> OK [0.2013259264E10,TO_NEGINF] --> [2013259264,2013259264] --> OK [0.2013259392E10,TO_NEGINF] --> [2013259392,2013259392] --> OK [0.201325952E10,TO_NEGINF] --> [2013259520,2013259520] --> OK [0.2013259648E10,TO_NEGINF] --> [2013259648,2013259648] --> OK [0.2013259776E10,TO_NEGINF] --> [2013259776,2013259776] --> OK [0.2013259904E10,TO_NEGINF] --> [2013259904,2013259904] --> OK [0.2013260032E10,TO_NEGINF] --> [2013260032,2013260032] --> OK [0.201326016E10,TO_NEGINF] --> [2013260160,2013260160] --> OK [0.2013260288E10,TO_NEGINF] --> [2013260288,2013260288] --> OK [0.2013260416E10,TO_NEGINF] --> [2013260416,2013260416] --> OK [0.2013260544E10,TO_NEGINF] --> [2013260544,2013260544] --> OK [0.2013260672E10,TO_NEGINF] --> [2013260672,2013260672] --> OK [0.20132608E10,TO_NEGINF] --> [2013260800,2013260800] --> OK [0.2013260928E10,TO_NEGINF] --> [2013260928,2013260928] --> OK [0.2013261056E10,TO_NEGINF] --> [2013261056,2013261056] --> OK [0.2013261184E10,TO_NEGINF] --> [2013261184,2013261184] --> OK [0.2013261312E10,TO_NEGINF] --> [2013261312,2013261312] --> OK [0.201326144E10,TO_NEGINF] --> [2013261440,2013261440] --> OK [0.2013261568E10,TO_NEGINF] --> [2013261568,2013261568] --> OK [0.2013261696E10,TO_NEGINF] --> [2013261696,2013261696] --> OK [0.2013261824E10,TO_NEGINF] --> [2013261824,2013261824] --> OK [0.2013261952E10,TO_NEGINF] --> [2013261952,2013261952] --> OK [0.201326208E10,TO_NEGINF] --> [2013262080,2013262080] --> OK [0.2013262208E10,TO_NEGINF] --> [2013262208,2013262208] --> OK [0.2013262336E10,TO_NEGINF] --> [2013262336,2013262336] --> OK [0.2013262464E10,TO_NEGINF] --> [2013262464,2013262464] --> OK [0.2013262592E10,TO_NEGINF] --> [2013262592,2013262592] --> OK [0.201326272E10,TO_NEGINF] --> [2013262720,2013262720] --> OK [0.2013262848E10,TO_NEGINF] --> [2013262848,2013262848] --> OK [0.2013262976E10,TO_NEGINF] --> [2013262976,2013262976] --> OK [0.2013263104E10,TO_NEGINF] --> [2013263104,2013263104] --> OK [0.2013263232E10,TO_NEGINF] --> [2013263232,2013263232] --> OK [0.201326336E10,TO_NEGINF] --> [2013263360,2013263360] --> OK [0.2013263488E10,TO_NEGINF] --> [2013263488,2013263488] --> OK [0.2013263616E10,TO_NEGINF] --> [2013263616,2013263616] --> OK [0.2013263744E10,TO_NEGINF] --> [2013263744,2013263744] --> OK [0.2013263872E10,TO_NEGINF] --> [2013263872,2013263872] --> OK [0.2013264E10,TO_NEGINF] --> [2013264000,2013264000] --> OK [0.2013264128E10,TO_NEGINF] --> [2013264128,2013264128] --> OK [0.2013264256E10,TO_NEGINF] --> [2013264256,2013264256] --> OK [0.2013264384E10,TO_NEGINF] --> [2013264384,2013264384] --> OK [0.2013264512E10,TO_NEGINF] --> [2013264512,2013264512] --> OK [0.201326464E10,TO_NEGINF] --> [2013264640,2013264640] --> OK [0.2013264768E10,TO_NEGINF] --> [2013264768,2013264768] --> OK [0.2013264896E10,TO_NEGINF] --> [2013264896,2013264896] --> OK [0.2013265024E10,TO_NEGINF] --> [2013265024,2013265024] --> OK [0.2013265152E10,TO_NEGINF] --> [2013265152,2013265152] --> OK [0.201326528E10,TO_NEGINF] --> [2013265280,2013265280] --> OK [0.2013265408E10,TO_NEGINF] --> [2013265408,2013265408] --> OK [0.2013265536E10,TO_NEGINF] --> [2013265536,2013265536] --> OK [0.2013265664E10,TO_NEGINF] --> [2013265664,2013265664] --> OK [0.2013265792E10,TO_NEGINF] --> [2013265792,2013265792] --> OK [0.201326592E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013274112E10,TO_NEGINF] --> [2013274112,2013274112] --> OK [0.2013273984E10,TO_NEGINF] --> [2013273984,2013273984] --> OK [0.2013273856E10,TO_NEGINF] --> [2013273856,2013273856] --> OK [0.2013273728E10,TO_NEGINF] --> [2013273728,2013273728] --> OK [0.20132736E10,TO_NEGINF] --> [2013273600,2013273600] --> OK [0.2013273472E10,TO_NEGINF] --> [2013273472,2013273472] --> OK [0.2013273344E10,TO_NEGINF] --> [2013273344,2013273344] --> OK [0.2013273216E10,TO_NEGINF] --> [2013273216,2013273216] --> OK [0.2013273088E10,TO_NEGINF] --> [2013273088,2013273088] --> OK [0.201327296E10,TO_NEGINF] --> [2013272960,2013272960] --> OK [0.2013272832E10,TO_NEGINF] --> [2013272832,2013272832] --> OK [0.2013272704E10,TO_NEGINF] --> [2013272704,2013272704] --> OK [0.2013272576E10,TO_NEGINF] --> [2013272576,2013272576] --> OK [0.2013272448E10,TO_NEGINF] --> [2013272448,2013272448] --> OK [0.201327232E10,TO_NEGINF] --> [2013272320,2013272320] --> OK [0.2013272192E10,TO_NEGINF] --> [2013272192,2013272192] --> OK [0.2013272064E10,TO_NEGINF] --> [2013272064,2013272064] --> OK [0.2013271936E10,TO_NEGINF] --> [2013271936,2013271936] --> OK [0.2013271808E10,TO_NEGINF] --> [2013271808,2013271808] --> OK [0.201327168E10,TO_NEGINF] --> [2013271680,2013271680] --> OK [0.2013271552E10,TO_NEGINF] --> [2013271552,2013271552] --> OK [0.2013271424E10,TO_NEGINF] --> [2013271424,2013271424] --> OK [0.2013271296E10,TO_NEGINF] --> [2013271296,2013271296] --> OK [0.2013271168E10,TO_NEGINF] --> [2013271168,2013271168] --> OK [0.201327104E10,TO_NEGINF] --> [2013271040,2013271040] --> OK [0.2013270912E10,TO_NEGINF] --> [2013270912,2013270912] --> OK [0.2013270784E10,TO_NEGINF] --> [2013270784,2013270784] --> OK [0.2013270656E10,TO_NEGINF] --> [2013270656,2013270656] --> OK [0.2013270528E10,TO_NEGINF] --> [2013270528,2013270528] --> OK [0.20132704E10,TO_NEGINF] --> [2013270400,2013270400] --> OK [0.2013270272E10,TO_NEGINF] --> [2013270272,2013270272] --> OK [0.2013270144E10,TO_NEGINF] --> [2013270144,2013270144] --> OK [0.2013270016E10,TO_NEGINF] --> [2013270016,2013270016] --> OK [0.2013269888E10,TO_NEGINF] --> [2013269888,2013269888] --> OK [0.201326976E10,TO_NEGINF] --> [2013269760,2013269760] --> OK [0.2013269632E10,TO_NEGINF] --> [2013269632,2013269632] --> OK [0.2013269504E10,TO_NEGINF] --> [2013269504,2013269504] --> OK [0.2013269376E10,TO_NEGINF] --> [2013269376,2013269376] --> OK [0.2013269248E10,TO_NEGINF] --> [2013269248,2013269248] --> OK [0.201326912E10,TO_NEGINF] --> [2013269120,2013269120] --> OK [0.2013268992E10,TO_NEGINF] --> [2013268992,2013268992] --> OK [0.2013268864E10,TO_NEGINF] --> [2013268864,2013268864] --> OK [0.2013268736E10,TO_NEGINF] --> [2013268736,2013268736] --> OK [0.2013268608E10,TO_NEGINF] --> [2013268608,2013268608] --> OK [0.201326848E10,TO_NEGINF] --> [2013268480,2013268480] --> OK [0.2013268352E10,TO_NEGINF] --> [2013268352,2013268352] --> OK [0.2013268224E10,TO_NEGINF] --> [2013268224,2013268224] --> OK [0.2013268096E10,TO_NEGINF] --> [2013268096,2013268096] --> OK [0.2013267968E10,TO_NEGINF] --> [2013267968,2013267968] --> OK [0.201326784E10,TO_NEGINF] --> [2013267840,2013267840] --> OK [0.2013267712E10,TO_NEGINF] --> [2013267712,2013267712] --> OK [0.2013267584E10,TO_NEGINF] --> [2013267584,2013267584] --> OK [0.2013267456E10,TO_NEGINF] --> [2013267456,2013267456] --> OK [0.2013267328E10,TO_NEGINF] --> [2013267328,2013267328] --> OK [0.20132672E10,TO_NEGINF] --> [2013267200,2013267200] --> OK [0.2013267072E10,TO_NEGINF] --> [2013267072,2013267072] --> OK [0.2013266944E10,TO_NEGINF] --> [2013266944,2013266944] --> OK [0.2013266816E10,TO_NEGINF] --> [2013266816,2013266816] --> OK [0.2013266688E10,TO_NEGINF] --> [2013266688,2013266688] --> OK [0.201326656E10,TO_NEGINF] --> [2013266560,2013266560] --> OK [0.2013266432E10,TO_NEGINF] --> [2013266432,2013266432] --> OK [0.2013266304E10,TO_NEGINF] --> [2013266304,2013266304] --> OK [0.2013266176E10,TO_NEGINF] --> [2013266176,2013266176] --> OK [0.2013266048E10,TO_NEGINF] --> [2013266048,2013266048] --> OK [0.2080366592E10,TO_NEGINF] --> [2080366592,2080366592] --> OK [0.208036672E10,TO_NEGINF] --> [2080366720,2080366720] --> OK [0.2080366848E10,TO_NEGINF] --> [2080366848,2080366848] --> OK [0.2080366976E10,TO_NEGINF] --> [2080366976,2080366976] --> OK [0.2080367104E10,TO_NEGINF] --> [2080367104,2080367104] --> OK [0.2080367232E10,TO_NEGINF] --> [2080367232,2080367232] --> OK [0.208036736E10,TO_NEGINF] --> [2080367360,2080367360] --> OK [0.2080367488E10,TO_NEGINF] --> [2080367488,2080367488] --> OK [0.2080367616E10,TO_NEGINF] --> [2080367616,2080367616] --> OK [0.2080367744E10,TO_NEGINF] --> [2080367744,2080367744] --> OK [0.2080367872E10,TO_NEGINF] --> [2080367872,2080367872] --> OK [0.2080368E10,TO_NEGINF] --> [2080368000,2080368000] --> OK [0.2080368128E10,TO_NEGINF] --> [2080368128,2080368128] --> OK [0.2080368256E10,TO_NEGINF] --> [2080368256,2080368256] --> OK [0.2080368384E10,TO_NEGINF] --> [2080368384,2080368384] --> OK [0.2080368512E10,TO_NEGINF] --> [2080368512,2080368512] --> OK [0.208036864E10,TO_NEGINF] --> [2080368640,2080368640] --> OK [0.2080368768E10,TO_NEGINF] --> [2080368768,2080368768] --> OK [0.2080368896E10,TO_NEGINF] --> [2080368896,2080368896] --> OK [0.2080369024E10,TO_NEGINF] --> [2080369024,2080369024] --> OK [0.2080369152E10,TO_NEGINF] --> [2080369152,2080369152] --> OK [0.208036928E10,TO_NEGINF] --> [2080369280,2080369280] --> OK [0.2080369408E10,TO_NEGINF] --> [2080369408,2080369408] --> OK [0.2080369536E10,TO_NEGINF] --> [2080369536,2080369536] --> OK [0.2080369664E10,TO_NEGINF] --> [2080369664,2080369664] --> OK [0.2080369792E10,TO_NEGINF] --> [2080369792,2080369792] --> OK [0.208036992E10,TO_NEGINF] --> [2080369920,2080369920] --> OK [0.2080370048E10,TO_NEGINF] --> [2080370048,2080370048] --> OK [0.2080370176E10,TO_NEGINF] --> [2080370176,2080370176] --> OK [0.2080370304E10,TO_NEGINF] --> [2080370304,2080370304] --> OK [0.2080370432E10,TO_NEGINF] --> [2080370432,2080370432] --> OK [0.208037056E10,TO_NEGINF] --> [2080370560,2080370560] --> OK [0.2080370688E10,TO_NEGINF] --> [2080370688,2080370688] --> OK [0.2080370816E10,TO_NEGINF] --> [2080370816,2080370816] --> OK [0.2080370944E10,TO_NEGINF] --> [2080370944,2080370944] --> OK [0.2080371072E10,TO_NEGINF] --> [2080371072,2080371072] --> OK [0.20803712E10,TO_NEGINF] --> [2080371200,2080371200] --> OK [0.2080371328E10,TO_NEGINF] --> [2080371328,2080371328] --> OK [0.2080371456E10,TO_NEGINF] --> [2080371456,2080371456] --> OK [0.2080371584E10,TO_NEGINF] --> [2080371584,2080371584] --> OK [0.2080371712E10,TO_NEGINF] --> [2080371712,2080371712] --> OK [0.208037184E10,TO_NEGINF] --> [2080371840,2080371840] --> OK [0.2080371968E10,TO_NEGINF] --> [2080371968,2080371968] --> OK [0.2080372096E10,TO_NEGINF] --> [2080372096,2080372096] --> OK [0.2080372224E10,TO_NEGINF] --> [2080372224,2080372224] --> OK [0.2080372352E10,TO_NEGINF] --> [2080372352,2080372352] --> OK [0.208037248E10,TO_NEGINF] --> [2080372480,2080372480] --> OK [0.2080372608E10,TO_NEGINF] --> [2080372608,2080372608] --> OK [0.2080372736E10,TO_NEGINF] --> [2080372736,2080372736] --> OK [0.2080372864E10,TO_NEGINF] --> [2080372864,2080372864] --> OK [0.2080372992E10,TO_NEGINF] --> [2080372992,2080372992] --> OK [0.208037312E10,TO_NEGINF] --> [2080373120,2080373120] --> OK [0.2080373248E10,TO_NEGINF] --> [2080373248,2080373248] --> OK [0.2080373376E10,TO_NEGINF] --> [2080373376,2080373376] --> OK [0.2080373504E10,TO_NEGINF] --> [2080373504,2080373504] --> OK [0.2080373632E10,TO_NEGINF] --> [2080373632,2080373632] --> OK [0.208037376E10,TO_NEGINF] --> [2080373760,2080373760] --> OK [0.2080373888E10,TO_NEGINF] --> [2080373888,2080373888] --> OK [0.2080374016E10,TO_NEGINF] --> [2080374016,2080374016] --> OK [0.2080374144E10,TO_NEGINF] --> [2080374144,2080374144] --> OK [0.2080374272E10,TO_NEGINF] --> [2080374272,2080374272] --> OK [0.20803744E10,TO_NEGINF] --> [2080374400,2080374400] --> OK [0.2080374528E10,TO_NEGINF] --> [2080374528,2080374528] --> OK [0.2080374656E10,TO_NEGINF] --> [2080374656,2080374656] --> OK [0.2080374784E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080382976E10,TO_NEGINF] --> [2080382976,2080382976] --> OK [0.2080382848E10,TO_NEGINF] --> [2080382848,2080382848] --> OK [0.208038272E10,TO_NEGINF] --> [2080382720,2080382720] --> OK [0.2080382592E10,TO_NEGINF] --> [2080382592,2080382592] --> OK [0.2080382464E10,TO_NEGINF] --> [2080382464,2080382464] --> OK [0.2080382336E10,TO_NEGINF] --> [2080382336,2080382336] --> OK [0.2080382208E10,TO_NEGINF] --> [2080382208,2080382208] --> OK [0.208038208E10,TO_NEGINF] --> [2080382080,2080382080] --> OK [0.2080381952E10,TO_NEGINF] --> [2080381952,2080381952] --> OK [0.2080381824E10,TO_NEGINF] --> [2080381824,2080381824] --> OK [0.2080381696E10,TO_NEGINF] --> [2080381696,2080381696] --> OK [0.2080381568E10,TO_NEGINF] --> [2080381568,2080381568] --> OK [0.208038144E10,TO_NEGINF] --> [2080381440,2080381440] --> OK [0.2080381312E10,TO_NEGINF] --> [2080381312,2080381312] --> OK [0.2080381184E10,TO_NEGINF] --> [2080381184,2080381184] --> OK [0.2080381056E10,TO_NEGINF] --> [2080381056,2080381056] --> OK [0.2080380928E10,TO_NEGINF] --> [2080380928,2080380928] --> OK [0.20803808E10,TO_NEGINF] --> [2080380800,2080380800] --> OK [0.2080380672E10,TO_NEGINF] --> [2080380672,2080380672] --> OK [0.2080380544E10,TO_NEGINF] --> [2080380544,2080380544] --> OK [0.2080380416E10,TO_NEGINF] --> [2080380416,2080380416] --> OK [0.2080380288E10,TO_NEGINF] --> [2080380288,2080380288] --> OK [0.208038016E10,TO_NEGINF] --> [2080380160,2080380160] --> OK [0.2080380032E10,TO_NEGINF] --> [2080380032,2080380032] --> OK [0.2080379904E10,TO_NEGINF] --> [2080379904,2080379904] --> OK [0.2080379776E10,TO_NEGINF] --> [2080379776,2080379776] --> OK [0.2080379648E10,TO_NEGINF] --> [2080379648,2080379648] --> OK [0.208037952E10,TO_NEGINF] --> [2080379520,2080379520] --> OK [0.2080379392E10,TO_NEGINF] --> [2080379392,2080379392] --> OK [0.2080379264E10,TO_NEGINF] --> [2080379264,2080379264] --> OK [0.2080379136E10,TO_NEGINF] --> [2080379136,2080379136] --> OK [0.2080379008E10,TO_NEGINF] --> [2080379008,2080379008] --> OK [0.208037888E10,TO_NEGINF] --> [2080378880,2080378880] --> OK [0.2080378752E10,TO_NEGINF] --> [2080378752,2080378752] --> OK [0.2080378624E10,TO_NEGINF] --> [2080378624,2080378624] --> OK [0.2080378496E10,TO_NEGINF] --> [2080378496,2080378496] --> OK [0.2080378368E10,TO_NEGINF] --> [2080378368,2080378368] --> OK [0.208037824E10,TO_NEGINF] --> [2080378240,2080378240] --> OK [0.2080378112E10,TO_NEGINF] --> [2080378112,2080378112] --> OK [0.2080377984E10,TO_NEGINF] --> [2080377984,2080377984] --> OK [0.2080377856E10,TO_NEGINF] --> [2080377856,2080377856] --> OK [0.2080377728E10,TO_NEGINF] --> [2080377728,2080377728] --> OK [0.20803776E10,TO_NEGINF] --> [2080377600,2080377600] --> OK [0.2080377472E10,TO_NEGINF] --> [2080377472,2080377472] --> OK [0.2080377344E10,TO_NEGINF] --> [2080377344,2080377344] --> OK [0.2080377216E10,TO_NEGINF] --> [2080377216,2080377216] --> OK [0.2080377088E10,TO_NEGINF] --> [2080377088,2080377088] --> OK [0.208037696E10,TO_NEGINF] --> [2080376960,2080376960] --> OK [0.2080376832E10,TO_NEGINF] --> [2080376832,2080376832] --> OK [0.2080376704E10,TO_NEGINF] --> [2080376704,2080376704] --> OK [0.2080376576E10,TO_NEGINF] --> [2080376576,2080376576] --> OK [0.2080376448E10,TO_NEGINF] --> [2080376448,2080376448] --> OK [0.208037632E10,TO_NEGINF] --> [2080376320,2080376320] --> OK [0.2080376192E10,TO_NEGINF] --> [2080376192,2080376192] --> OK [0.2080376064E10,TO_NEGINF] --> [2080376064,2080376064] --> OK [0.2080375936E10,TO_NEGINF] --> [2080375936,2080375936] --> OK [0.2080375808E10,TO_NEGINF] --> [2080375808,2080375808] --> OK [0.208037568E10,TO_NEGINF] --> [2080375680,2080375680] --> OK [0.2080375552E10,TO_NEGINF] --> [2080375552,2080375552] --> OK [0.2080375424E10,TO_NEGINF] --> [2080375424,2080375424] --> OK [0.2080375296E10,TO_NEGINF] --> [2080375296,2080375296] --> OK [0.2080375168E10,TO_NEGINF] --> [2080375168,2080375168] --> OK [0.208037504E10,TO_NEGINF] --> [2080375040,2080375040] --> OK [0.2080374912E10,TO_NEGINF] --> [2080374912,2080374912] --> OK [0.2113921024E10,TO_NEGINF] --> [2113921024,2113921024] --> OK [0.2113921152E10,TO_NEGINF] --> [2113921152,2113921152] --> OK [0.211392128E10,TO_NEGINF] --> [2113921280,2113921280] --> OK [0.2113921408E10,TO_NEGINF] --> [2113921408,2113921408] --> OK [0.2113921536E10,TO_NEGINF] --> [2113921536,2113921536] --> OK [0.2113921664E10,TO_NEGINF] --> [2113921664,2113921664] --> OK [0.2113921792E10,TO_NEGINF] --> [2113921792,2113921792] --> OK [0.211392192E10,TO_NEGINF] --> [2113921920,2113921920] --> OK [0.2113922048E10,TO_NEGINF] --> [2113922048,2113922048] --> OK [0.2113922176E10,TO_NEGINF] --> [2113922176,2113922176] --> OK [0.2113922304E10,TO_NEGINF] --> [2113922304,2113922304] --> OK [0.2113922432E10,TO_NEGINF] --> [2113922432,2113922432] --> OK [0.211392256E10,TO_NEGINF] --> [2113922560,2113922560] --> OK [0.2113922688E10,TO_NEGINF] --> [2113922688,2113922688] --> OK [0.2113922816E10,TO_NEGINF] --> [2113922816,2113922816] --> OK [0.2113922944E10,TO_NEGINF] --> [2113922944,2113922944] --> OK [0.2113923072E10,TO_NEGINF] --> [2113923072,2113923072] --> OK [0.21139232E10,TO_NEGINF] --> [2113923200,2113923200] --> OK [0.2113923328E10,TO_NEGINF] --> [2113923328,2113923328] --> OK [0.2113923456E10,TO_NEGINF] --> [2113923456,2113923456] --> OK [0.2113923584E10,TO_NEGINF] --> [2113923584,2113923584] --> OK [0.2113923712E10,TO_NEGINF] --> [2113923712,2113923712] --> OK [0.211392384E10,TO_NEGINF] --> [2113923840,2113923840] --> OK [0.2113923968E10,TO_NEGINF] --> [2113923968,2113923968] --> OK [0.2113924096E10,TO_NEGINF] --> [2113924096,2113924096] --> OK [0.2113924224E10,TO_NEGINF] --> [2113924224,2113924224] --> OK [0.2113924352E10,TO_NEGINF] --> [2113924352,2113924352] --> OK [0.211392448E10,TO_NEGINF] --> [2113924480,2113924480] --> OK [0.2113924608E10,TO_NEGINF] --> [2113924608,2113924608] --> OK [0.2113924736E10,TO_NEGINF] --> [2113924736,2113924736] --> OK [0.2113924864E10,TO_NEGINF] --> [2113924864,2113924864] --> OK [0.2113924992E10,TO_NEGINF] --> [2113924992,2113924992] --> OK [0.211392512E10,TO_NEGINF] --> [2113925120,2113925120] --> OK [0.2113925248E10,TO_NEGINF] --> [2113925248,2113925248] --> OK [0.2113925376E10,TO_NEGINF] --> [2113925376,2113925376] --> OK [0.2113925504E10,TO_NEGINF] --> [2113925504,2113925504] --> OK [0.2113925632E10,TO_NEGINF] --> [2113925632,2113925632] --> OK [0.211392576E10,TO_NEGINF] --> [2113925760,2113925760] --> OK [0.2113925888E10,TO_NEGINF] --> [2113925888,2113925888] --> OK [0.2113926016E10,TO_NEGINF] --> [2113926016,2113926016] --> OK [0.2113926144E10,TO_NEGINF] --> [2113926144,2113926144] --> OK [0.2113926272E10,TO_NEGINF] --> [2113926272,2113926272] --> OK [0.21139264E10,TO_NEGINF] --> [2113926400,2113926400] --> OK [0.2113926528E10,TO_NEGINF] --> [2113926528,2113926528] --> OK [0.2113926656E10,TO_NEGINF] --> [2113926656,2113926656] --> OK [0.2113926784E10,TO_NEGINF] --> [2113926784,2113926784] --> OK [0.2113926912E10,TO_NEGINF] --> [2113926912,2113926912] --> OK [0.211392704E10,TO_NEGINF] --> [2113927040,2113927040] --> OK [0.2113927168E10,TO_NEGINF] --> [2113927168,2113927168] --> OK [0.2113927296E10,TO_NEGINF] --> [2113927296,2113927296] --> OK [0.2113927424E10,TO_NEGINF] --> [2113927424,2113927424] --> OK [0.2113927552E10,TO_NEGINF] --> [2113927552,2113927552] --> OK [0.211392768E10,TO_NEGINF] --> [2113927680,2113927680] --> OK [0.2113927808E10,TO_NEGINF] --> [2113927808,2113927808] --> OK [0.2113927936E10,TO_NEGINF] --> [2113927936,2113927936] --> OK [0.2113928064E10,TO_NEGINF] --> [2113928064,2113928064] --> OK [0.2113928192E10,TO_NEGINF] --> [2113928192,2113928192] --> OK [0.211392832E10,TO_NEGINF] --> [2113928320,2113928320] --> OK [0.2113928448E10,TO_NEGINF] --> [2113928448,2113928448] --> OK [0.2113928576E10,TO_NEGINF] --> [2113928576,2113928576] --> OK [0.2113928704E10,TO_NEGINF] --> [2113928704,2113928704] --> OK [0.2113928832E10,TO_NEGINF] --> [2113928832,2113928832] --> OK [0.211392896E10,TO_NEGINF] --> [2113928960,2113928960] --> OK [0.2113929088E10,TO_NEGINF] --> [2113929088,2113929088] --> OK [0.2113929216E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113937408E10,TO_NEGINF] --> [2113937408,2113937408] --> OK [0.211393728E10,TO_NEGINF] --> [2113937280,2113937280] --> OK [0.2113937152E10,TO_NEGINF] --> [2113937152,2113937152] --> OK [0.2113937024E10,TO_NEGINF] --> [2113937024,2113937024] --> OK [0.2113936896E10,TO_NEGINF] --> [2113936896,2113936896] --> OK [0.2113936768E10,TO_NEGINF] --> [2113936768,2113936768] --> OK [0.211393664E10,TO_NEGINF] --> [2113936640,2113936640] --> OK [0.2113936512E10,TO_NEGINF] --> [2113936512,2113936512] --> OK [0.2113936384E10,TO_NEGINF] --> [2113936384,2113936384] --> OK [0.2113936256E10,TO_NEGINF] --> [2113936256,2113936256] --> OK [0.2113936128E10,TO_NEGINF] --> [2113936128,2113936128] --> OK [0.2113936E10,TO_NEGINF] --> [2113936000,2113936000] --> OK [0.2113935872E10,TO_NEGINF] --> [2113935872,2113935872] --> OK [0.2113935744E10,TO_NEGINF] --> [2113935744,2113935744] --> OK [0.2113935616E10,TO_NEGINF] --> [2113935616,2113935616] --> OK [0.2113935488E10,TO_NEGINF] --> [2113935488,2113935488] --> OK [0.211393536E10,TO_NEGINF] --> [2113935360,2113935360] --> OK [0.2113935232E10,TO_NEGINF] --> [2113935232,2113935232] --> OK [0.2113935104E10,TO_NEGINF] --> [2113935104,2113935104] --> OK [0.2113934976E10,TO_NEGINF] --> [2113934976,2113934976] --> OK [0.2113934848E10,TO_NEGINF] --> [2113934848,2113934848] --> OK [0.211393472E10,TO_NEGINF] --> [2113934720,2113934720] --> OK [0.2113934592E10,TO_NEGINF] --> [2113934592,2113934592] --> OK [0.2113934464E10,TO_NEGINF] --> [2113934464,2113934464] --> OK [0.2113934336E10,TO_NEGINF] --> [2113934336,2113934336] --> OK [0.2113934208E10,TO_NEGINF] --> [2113934208,2113934208] --> OK [0.211393408E10,TO_NEGINF] --> [2113934080,2113934080] --> OK [0.2113933952E10,TO_NEGINF] --> [2113933952,2113933952] --> OK [0.2113933824E10,TO_NEGINF] --> [2113933824,2113933824] --> OK [0.2113933696E10,TO_NEGINF] --> [2113933696,2113933696] --> OK [0.2113933568E10,TO_NEGINF] --> [2113933568,2113933568] --> OK [0.211393344E10,TO_NEGINF] --> [2113933440,2113933440] --> OK [0.2113933312E10,TO_NEGINF] --> [2113933312,2113933312] --> OK [0.2113933184E10,TO_NEGINF] --> [2113933184,2113933184] --> OK [0.2113933056E10,TO_NEGINF] --> [2113933056,2113933056] --> OK [0.2113932928E10,TO_NEGINF] --> [2113932928,2113932928] --> OK [0.21139328E10,TO_NEGINF] --> [2113932800,2113932800] --> OK [0.2113932672E10,TO_NEGINF] --> [2113932672,2113932672] --> OK [0.2113932544E10,TO_NEGINF] --> [2113932544,2113932544] --> OK [0.2113932416E10,TO_NEGINF] --> [2113932416,2113932416] --> OK [0.2113932288E10,TO_NEGINF] --> [2113932288,2113932288] --> OK [0.211393216E10,TO_NEGINF] --> [2113932160,2113932160] --> OK [0.2113932032E10,TO_NEGINF] --> [2113932032,2113932032] --> OK [0.2113931904E10,TO_NEGINF] --> [2113931904,2113931904] --> OK [0.2113931776E10,TO_NEGINF] --> [2113931776,2113931776] --> OK [0.2113931648E10,TO_NEGINF] --> [2113931648,2113931648] --> OK [0.211393152E10,TO_NEGINF] --> [2113931520,2113931520] --> OK [0.2113931392E10,TO_NEGINF] --> [2113931392,2113931392] --> OK [0.2113931264E10,TO_NEGINF] --> [2113931264,2113931264] --> OK [0.2113931136E10,TO_NEGINF] --> [2113931136,2113931136] --> OK [0.2113931008E10,TO_NEGINF] --> [2113931008,2113931008] --> OK [0.211393088E10,TO_NEGINF] --> [2113930880,2113930880] --> OK [0.2113930752E10,TO_NEGINF] --> [2113930752,2113930752] --> OK [0.2113930624E10,TO_NEGINF] --> [2113930624,2113930624] --> OK [0.2113930496E10,TO_NEGINF] --> [2113930496,2113930496] --> OK [0.2113930368E10,TO_NEGINF] --> [2113930368,2113930368] --> OK [0.211393024E10,TO_NEGINF] --> [2113930240,2113930240] --> OK [0.2113930112E10,TO_NEGINF] --> [2113930112,2113930112] --> OK [0.2113929984E10,TO_NEGINF] --> [2113929984,2113929984] --> OK [0.2113929856E10,TO_NEGINF] --> [2113929856,2113929856] --> OK [0.2113929728E10,TO_NEGINF] --> [2113929728,2113929728] --> OK [0.21139296E10,TO_NEGINF] --> [2113929600,2113929600] --> OK [0.2113929472E10,TO_NEGINF] --> [2113929472,2113929472] --> OK [0.2113929344E10,TO_NEGINF] --> [2113929344,2113929344] --> OK [0.2147475456E10,TO_NEGINF] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_NEGINF] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_NEGINF] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_NEGINF] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_NEGINF] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_NEGINF] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_NEGINF] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_NEGINF] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_NEGINF] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_NEGINF] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_NEGINF] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_NEGINF] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_NEGINF] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_NEGINF] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_NEGINF] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_NEGINF] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_NEGINF] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_NEGINF] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_NEGINF] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_NEGINF] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_NEGINF] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_NEGINF] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_NEGINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEGINF] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_NEGINF] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_NEGINF] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_NEGINF] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_NEGINF] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_NEGINF] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_NEGINF] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_NEGINF] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_NEGINF] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_NEGINF] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_NEGINF] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_NEGINF] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_NEGINF] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_NEGINF] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_NEGINF] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_NEGINF] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_NEGINF] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_NEGINF] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_NEGINF] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_NEGINF] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_NEGINF] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_NEGINF] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_NEGINF] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_NEGINF] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_NEGINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEGINF] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_NEGINF] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_NEGINF] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_NEGINF] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_NEGINF] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_NEGINF] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_NEGINF] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_NEGINF] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_NEGINF] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_NEGINF] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_NEGINF] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_NEGINF] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_NEGINF] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_NEGINF] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_NEGINF] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_NEGINF] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_NEGINF] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_NEGINF] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_NEGINF] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_NEGINF] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_NEGINF] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_NEGINF] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_NEGINF] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_NEGINF] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_NEGINF] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_NEGINF] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_NEGINF] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_NEGINF] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_NEGINF] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_NEGINF] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_NEGINF] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_NEGINF] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_NEGINF] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_NEGINF] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_NEGINF] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_NEGINF] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_NEGINF] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_NEGINF] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_NEGINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEGINF] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_NEGINF] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_NEGINF] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_NEGINF] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_NEGINF] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_NEGINF] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_NEGINF] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_NEGINF] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_NEGINF] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_NEGINF] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_NEGINF] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_NEGINF] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_NEGINF] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_NEGINF] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_NEGINF] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_NEGINF] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_NEGINF] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_NEGINF] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_NEGINF] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_NEGINF] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_NEGINF] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_NEGINF] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_NEGINF] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_NEGINF] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_NEGINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEGINF] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_NEGINF] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_NEGINF] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_NEGINF] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_NEGINF] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_NEGINF] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_NEGINF] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_NEGINF] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_NEGINF] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_NEGINF] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_NEGINF] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_NEGINF] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_NEGINF] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_NEGINF] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_NEGINF] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_NEGINF] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_NEGINF] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_NEGINF] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_NEGINF] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_NEGINF] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_NEGINF] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_NEGINF] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_NEGINF] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_NEGINF] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_NEGINF] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_NEGINF] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_NEGINF] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_NEGINF] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_NEGINF] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_NEGINF] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_NEGINF] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_NEGINF] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_NEGINF] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_NEGINF] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_NEGINF] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_NEGINF] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_NEGINF] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_NEGINF] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_NEGINF] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_NEGINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEGINF] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_NEGINF] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_NEGINF] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_NEGINF] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_NEGINF] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_NEGINF] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_NEGINF] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_NEGINF] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_NEGINF] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_NEGINF] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_NEGINF] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_NEGINF] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_NEGINF] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_NEGINF] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_NEGINF] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_NEGINF] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_NEGINF] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_NEGINF] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_NEGINF] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_NEGINF] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_NEGINF] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_NEGINF] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_NEGINF] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_NEGINF] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_NEGINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEGINF] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_NEGINF] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_NEGINF] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_NEGINF] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_NEGINF] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_NEGINF] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_NEGINF] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_NEGINF] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_NEGINF] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_NEGINF] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_NEGINF] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_NEGINF] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_NEGINF] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_NEGINF] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_NEGINF] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_NEGINF] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_NEGINF] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_NEGINF] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_NEGINF] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_NEGINF] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_NEGINF] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_NEGINF] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_NEGINF] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_NEGINF] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_NEGINF] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_NEGINF] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_NEGINF] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_NEGINF] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_NEGINF] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_NEGINF] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_NEGINF] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_NEGINF] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_NEGINF] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_NEGINF] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_NEGINF] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_NEGINF] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_NEGINF] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_NEGINF] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_NEGINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEGINF] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_NEGINF] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_NEGINF] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_NEGINF] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_NEGINF] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_NEGINF] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_NEGINF] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_NEGINF] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_NEGINF] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_NEGINF] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_NEGINF] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_NEGINF] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_NEGINF] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_NEGINF] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_NEGINF] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_NEGINF] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_NEGINF] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_NEGINF] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_NEGINF] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_NEGINF] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_NEGINF] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_NEGINF] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_NEGINF] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_NEGINF] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_NEGINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEGINF] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_NEGINF] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_NEGINF] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_NEGINF] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_NEGINF] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_NEGINF] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_NEGINF] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_NEGINF] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_NEGINF] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_NEGINF] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_NEGINF] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_NEGINF] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_NEGINF] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_NEGINF] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_NEGINF] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_NEGINF] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_NEGINF] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_NEGINF] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_NEGINF] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_NEGINF] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_NEGINF] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_NEGINF] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_NEGINF] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_NEGINF] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_NEGINF] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_NEGINF] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_NEGINF] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_NEGINF] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_NEGINF] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_NEGINF] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_NEGINF] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_NEGINF] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_NEGINF] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_NEGINF] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_NEGINF] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_NEGINF] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_NEGINF] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_NEGINF] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_NEGINF] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_NEGINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEGINF] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_NEGINF] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_NEGINF] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_NEGINF] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_NEGINF] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_NEGINF] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_NEGINF] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_NEGINF] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_NEGINF] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_NEGINF] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_NEGINF] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_NEGINF] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_NEGINF] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_NEGINF] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_NEGINF] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_NEGINF] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_NEGINF] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_NEGINF] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_NEGINF] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_NEGINF] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_NEGINF] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_NEGINF] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_NEGINF] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_NEGINF] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_NEGINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEGINF] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_NEGINF] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_NEGINF] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_NEGINF] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_NEGINF] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_NEGINF] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_NEGINF] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_NEGINF] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_NEGINF] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_NEGINF] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_NEGINF] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_NEGINF] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_NEGINF] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_NEGINF] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_NEGINF] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_NEGINF] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_NEGINF] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_NEGINF] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_NEGINF] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_NEGINF] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_NEGINF] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_NEGINF] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_NEGINF] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_NEGINF] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_NEGINF] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_NEGINF] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_NEGINF] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_NEGINF] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_NEGINF] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_NEGINF] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_NEGINF] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_NEGINF] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_NEGINF] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_NEGINF] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_NEGINF] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_NEGINF] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_NEGINF] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_NEGINF] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_NEGINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEGINF] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_NEGINF] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_NEGINF] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_NEGINF] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_NEGINF] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_NEGINF] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_NEGINF] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_NEGINF] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_NEGINF] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_NEGINF] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_NEGINF] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_NEGINF] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_NEGINF] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_NEGINF] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_NEGINF] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_NEGINF] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_NEGINF] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_NEGINF] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_NEGINF] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_NEGINF] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_NEGINF] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_NEGINF] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_NEGINF] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_NEGINF] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_NEGINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEGINF] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_NEGINF] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_NEGINF] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_NEGINF] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_NEGINF] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_NEGINF] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_NEGINF] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_NEGINF] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_NEGINF] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_NEGINF] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_NEGINF] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_NEGINF] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_NEGINF] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_NEGINF] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_NEGINF] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_NEGINF] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_NEGINF] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_NEGINF] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_NEGINF] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_NEGINF] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_NEGINF] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_NEGINF] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_NEGINF] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_NEGINF] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_NEGINF] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_NEGINF] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_NEGINF] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_NEGINF] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_NEGINF] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_NEGINF] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_NEGINF] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_NEGINF] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_NEGINF] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_NEGINF] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_NEGINF] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_NEGINF] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_NEGINF] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_NEGINF] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_NEGINF] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_NEGINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_NEGINF] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_NEGINF] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_NEGINF] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_NEGINF] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_NEGINF] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_NEGINF] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_NEGINF] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_NEGINF] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_NEGINF] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_NEGINF] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_NEGINF] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_NEGINF] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_NEGINF] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_NEGINF] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_NEGINF] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_NEGINF] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_NEGINF] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_NEGINF] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_NEGINF] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_NEGINF] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_NEGINF] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_NEGINF] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_NEGINF] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_NEGINF] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_NEGINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_NEGINF] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_NEGINF] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_NEGINF] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_NEGINF] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_NEGINF] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_NEGINF] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_NEGINF] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_NEGINF] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_NEGINF] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_NEGINF] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_NEGINF] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_NEGINF] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_NEGINF] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_NEGINF] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_NEGINF] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_NEGINF] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_NEGINF] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_NEGINF] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_NEGINF] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_NEGINF] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_NEGINF] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_NEGINF] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_NEGINF] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_NEGINF] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_NEGINF] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_NEGINF] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_NEGINF] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_NEGINF] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_NEGINF] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_NEGINF] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_NEGINF] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_NEGINF] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_NEGINF] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_NEGINF] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_NEGINF] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_NEGINF] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_NEGINF] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_NEGINF] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_NEGINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_NEGINF] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_NEGINF] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_NEGINF] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_NEGINF] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_NEGINF] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_NEGINF] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_NEGINF] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_NEGINF] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_NEGINF] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_NEGINF] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_NEGINF] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_NEGINF] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_NEGINF] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_NEGINF] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_NEGINF] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_NEGINF] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_NEGINF] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_NEGINF] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_NEGINF] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_NEGINF] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_NEGINF] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_NEGINF] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_NEGINF] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_NEGINF] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_NEGINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_NEGINF] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_NEGINF] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_NEGINF] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_NEGINF] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_NEGINF] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_NEGINF] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_NEGINF] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_NEGINF] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_NEGINF] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_NEGINF] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_NEGINF] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_NEGINF] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_NEGINF] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_NEGINF] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_NEGINF] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_NEGINF] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_NEGINF] --> [Overflow,2147483904] --> OK [~0.2147500032E10,TO_POSINF] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_POSINF] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_POSINF] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_POSINF] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_POSINF] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_POSINF] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_POSINF] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_POSINF] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_POSINF] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_POSINF] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_POSINF] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_POSINF] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_POSINF] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_POSINF] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_POSINF] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_POSINF] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_POSINF] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_POSINF] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_POSINF] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_POSINF] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_POSINF] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_POSINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_POSINF] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_POSINF] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_POSINF] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_POSINF] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_POSINF] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_POSINF] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_POSINF] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_POSINF] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_POSINF] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_POSINF] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_POSINF] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_POSINF] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_POSINF] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_POSINF] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_POSINF] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_POSINF] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_POSINF] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_POSINF] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_POSINF] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_POSINF] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_POSINF] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_POSINF] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_POSINF] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_POSINF] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_POSINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_POSINF] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_POSINF] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_POSINF] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_POSINF] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_POSINF] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_POSINF] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_POSINF] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_POSINF] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_POSINF] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_POSINF] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_POSINF] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_POSINF] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_POSINF] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_POSINF] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_POSINF] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_POSINF] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_POSINF] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_POSINF] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_POSINF] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_POSINF] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_POSINF] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_POSINF] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_POSINF] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_POSINF] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_POSINF] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_POSINF] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_POSINF] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_POSINF] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_POSINF] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_POSINF] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_POSINF] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_POSINF] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_POSINF] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_POSINF] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_POSINF] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_POSINF] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_POSINF] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_POSINF] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_POSINF] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_POSINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_POSINF] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_POSINF] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_POSINF] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_POSINF] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_POSINF] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_POSINF] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_POSINF] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_POSINF] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_POSINF] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_POSINF] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_POSINF] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_POSINF] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_POSINF] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_POSINF] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_POSINF] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_POSINF] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_POSINF] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_POSINF] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_POSINF] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_POSINF] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_POSINF] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_POSINF] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_POSINF] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_POSINF] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_POSINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_POSINF] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_POSINF] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_POSINF] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_POSINF] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_POSINF] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_POSINF] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_POSINF] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_POSINF] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_POSINF] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_POSINF] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_POSINF] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_POSINF] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_POSINF] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_POSINF] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_POSINF] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_POSINF] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_POSINF] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_POSINF] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_POSINF] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_POSINF] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_POSINF] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_POSINF] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_POSINF] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_POSINF] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_POSINF] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_POSINF] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_POSINF] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_POSINF] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_POSINF] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_POSINF] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_POSINF] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_POSINF] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_POSINF] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_POSINF] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_POSINF] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_POSINF] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_POSINF] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_POSINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_POSINF] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_POSINF] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_POSINF] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_POSINF] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_POSINF] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_POSINF] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_POSINF] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_POSINF] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_POSINF] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_POSINF] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_POSINF] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_POSINF] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_POSINF] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_POSINF] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_POSINF] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_POSINF] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_POSINF] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_POSINF] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_POSINF] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_POSINF] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_POSINF] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_POSINF] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_POSINF] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_POSINF] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_POSINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_POSINF] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_POSINF] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_POSINF] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_POSINF] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_POSINF] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_POSINF] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_POSINF] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_POSINF] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_POSINF] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_POSINF] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_POSINF] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_POSINF] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_POSINF] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_POSINF] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_POSINF] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_POSINF] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_POSINF] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_POSINF] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_POSINF] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_POSINF] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_POSINF] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_POSINF] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_POSINF] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_POSINF] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_POSINF] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_POSINF] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_POSINF] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_POSINF] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_POSINF] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_POSINF] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_POSINF] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_POSINF] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_POSINF] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_POSINF] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_POSINF] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_POSINF] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_POSINF] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_POSINF] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_POSINF] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_POSINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_POSINF] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_POSINF] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_POSINF] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_POSINF] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_POSINF] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_POSINF] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_POSINF] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_POSINF] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_POSINF] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_POSINF] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_POSINF] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_POSINF] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_POSINF] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_POSINF] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_POSINF] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_POSINF] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_POSINF] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_POSINF] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_POSINF] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_POSINF] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_POSINF] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_POSINF] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_POSINF] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_POSINF] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_POSINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_POSINF] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_POSINF] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_POSINF] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_POSINF] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_POSINF] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_POSINF] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_POSINF] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_POSINF] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_POSINF] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_POSINF] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_POSINF] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_POSINF] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_POSINF] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_POSINF] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_POSINF] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_POSINF] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_POSINF] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_POSINF] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_POSINF] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_POSINF] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_POSINF] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_POSINF] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_POSINF] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_POSINF] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_POSINF] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_POSINF] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_POSINF] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_POSINF] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_POSINF] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_POSINF] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_POSINF] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_POSINF] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_POSINF] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_POSINF] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_POSINF] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_POSINF] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_POSINF] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_POSINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_POSINF] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_POSINF] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_POSINF] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_POSINF] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_POSINF] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_POSINF] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_POSINF] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_POSINF] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_POSINF] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_POSINF] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_POSINF] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_POSINF] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_POSINF] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_POSINF] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_POSINF] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_POSINF] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_POSINF] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_POSINF] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_POSINF] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_POSINF] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_POSINF] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_POSINF] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_POSINF] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_POSINF] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_POSINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_POSINF] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_POSINF] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_POSINF] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_POSINF] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_POSINF] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_POSINF] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_POSINF] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_POSINF] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_POSINF] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_POSINF] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_POSINF] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_POSINF] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_POSINF] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_POSINF] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_POSINF] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_POSINF] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_POSINF] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_POSINF] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_POSINF] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_POSINF] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_POSINF] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_POSINF] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_POSINF] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_POSINF] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_POSINF] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_POSINF] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_POSINF] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_POSINF] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_POSINF] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_POSINF] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_POSINF] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_POSINF] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_POSINF] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_POSINF] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_POSINF] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_POSINF] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_POSINF] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_POSINF] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_POSINF] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_POSINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_POSINF] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_POSINF] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_POSINF] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_POSINF] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_POSINF] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_POSINF] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_POSINF] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_POSINF] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_POSINF] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_POSINF] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_POSINF] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_POSINF] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_POSINF] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_POSINF] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_POSINF] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_POSINF] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_POSINF] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_POSINF] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_POSINF] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_POSINF] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_POSINF] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_POSINF] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_POSINF] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_POSINF] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_POSINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_POSINF] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_POSINF] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_POSINF] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_POSINF] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_POSINF] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_POSINF] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_POSINF] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_POSINF] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_POSINF] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_POSINF] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_POSINF] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_POSINF] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_POSINF] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_POSINF] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_POSINF] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_POSINF] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_POSINF] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_POSINF] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_POSINF] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_POSINF] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_POSINF] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_POSINF] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_POSINF] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_POSINF] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_POSINF] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_POSINF] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_POSINF] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_POSINF] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_POSINF] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_POSINF] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_POSINF] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_POSINF] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_POSINF] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_POSINF] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_POSINF] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_POSINF] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_POSINF] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_POSINF] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_POSINF] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_POSINF] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_POSINF] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_POSINF] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_POSINF] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_POSINF] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_POSINF] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_POSINF] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_POSINF] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_POSINF] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_POSINF] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_POSINF] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_POSINF] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_POSINF] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_POSINF] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_POSINF] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_POSINF] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_POSINF] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_POSINF] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_POSINF] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_POSINF] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_POSINF] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_POSINF] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_POSINF] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_POSINF] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_POSINF] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_POSINF] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_POSINF] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_POSINF] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_POSINF] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_POSINF] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_POSINF] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_POSINF] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_POSINF] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_POSINF] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_POSINF] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_POSINF] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_POSINF] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_POSINF] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_POSINF] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_POSINF] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_POSINF] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_POSINF] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_POSINF] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_POSINF] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_POSINF] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_POSINF] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_POSINF] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_POSINF] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_POSINF] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_POSINF] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_POSINF] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_POSINF] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_POSINF] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_POSINF] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_POSINF] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_POSINF] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_POSINF] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_POSINF] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_POSINF] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_POSINF] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_POSINF] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_POSINF] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_POSINF] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_POSINF] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_POSINF] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_POSINF] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_POSINF] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_POSINF] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_POSINF] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_POSINF] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_POSINF] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_POSINF] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_POSINF] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_POSINF] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_POSINF] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_POSINF] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_POSINF] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_POSINF] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_POSINF] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_POSINF] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_POSINF] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_POSINF] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_POSINF] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_POSINF] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_POSINF] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_POSINF] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_POSINF] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_POSINF] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_POSINF] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_POSINF] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_POSINF] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_POSINF] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_POSINF] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_POSINF] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_POSINF] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_POSINF] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_POSINF] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_POSINF] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_POSINF] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_POSINF] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_POSINF] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_POSINF] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_POSINF] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_POSINF] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_POSINF] --> [~2147483520,~2147483520] --> OK [~0.2113937408E10,TO_POSINF] --> [~2113937408,~2113937408] --> OK [~0.211393728E10,TO_POSINF] --> [~2113937280,~2113937280] --> OK [~0.2113937152E10,TO_POSINF] --> [~2113937152,~2113937152] --> OK [~0.2113937024E10,TO_POSINF] --> [~2113937024,~2113937024] --> OK [~0.2113936896E10,TO_POSINF] --> [~2113936896,~2113936896] --> OK [~0.2113936768E10,TO_POSINF] --> [~2113936768,~2113936768] --> OK [~0.211393664E10,TO_POSINF] --> [~2113936640,~2113936640] --> OK [~0.2113936512E10,TO_POSINF] --> [~2113936512,~2113936512] --> OK [~0.2113936384E10,TO_POSINF] --> [~2113936384,~2113936384] --> OK [~0.2113936256E10,TO_POSINF] --> [~2113936256,~2113936256] --> OK [~0.2113936128E10,TO_POSINF] --> [~2113936128,~2113936128] --> OK [~0.2113936E10,TO_POSINF] --> [~2113936000,~2113936000] --> OK [~0.2113935872E10,TO_POSINF] --> [~2113935872,~2113935872] --> OK [~0.2113935744E10,TO_POSINF] --> [~2113935744,~2113935744] --> OK [~0.2113935616E10,TO_POSINF] --> [~2113935616,~2113935616] --> OK [~0.2113935488E10,TO_POSINF] --> [~2113935488,~2113935488] --> OK [~0.211393536E10,TO_POSINF] --> [~2113935360,~2113935360] --> OK [~0.2113935232E10,TO_POSINF] --> [~2113935232,~2113935232] --> OK [~0.2113935104E10,TO_POSINF] --> [~2113935104,~2113935104] --> OK [~0.2113934976E10,TO_POSINF] --> [~2113934976,~2113934976] --> OK [~0.2113934848E10,TO_POSINF] --> [~2113934848,~2113934848] --> OK [~0.211393472E10,TO_POSINF] --> [~2113934720,~2113934720] --> OK [~0.2113934592E10,TO_POSINF] --> [~2113934592,~2113934592] --> OK [~0.2113934464E10,TO_POSINF] --> [~2113934464,~2113934464] --> OK [~0.2113934336E10,TO_POSINF] --> [~2113934336,~2113934336] --> OK [~0.2113934208E10,TO_POSINF] --> [~2113934208,~2113934208] --> OK [~0.211393408E10,TO_POSINF] --> [~2113934080,~2113934080] --> OK [~0.2113933952E10,TO_POSINF] --> [~2113933952,~2113933952] --> OK [~0.2113933824E10,TO_POSINF] --> [~2113933824,~2113933824] --> OK [~0.2113933696E10,TO_POSINF] --> [~2113933696,~2113933696] --> OK [~0.2113933568E10,TO_POSINF] --> [~2113933568,~2113933568] --> OK [~0.211393344E10,TO_POSINF] --> [~2113933440,~2113933440] --> OK [~0.2113933312E10,TO_POSINF] --> [~2113933312,~2113933312] --> OK [~0.2113933184E10,TO_POSINF] --> [~2113933184,~2113933184] --> OK [~0.2113933056E10,TO_POSINF] --> [~2113933056,~2113933056] --> OK [~0.2113932928E10,TO_POSINF] --> [~2113932928,~2113932928] --> OK [~0.21139328E10,TO_POSINF] --> [~2113932800,~2113932800] --> OK [~0.2113932672E10,TO_POSINF] --> [~2113932672,~2113932672] --> OK [~0.2113932544E10,TO_POSINF] --> [~2113932544,~2113932544] --> OK [~0.2113932416E10,TO_POSINF] --> [~2113932416,~2113932416] --> OK [~0.2113932288E10,TO_POSINF] --> [~2113932288,~2113932288] --> OK [~0.211393216E10,TO_POSINF] --> [~2113932160,~2113932160] --> OK [~0.2113932032E10,TO_POSINF] --> [~2113932032,~2113932032] --> OK [~0.2113931904E10,TO_POSINF] --> [~2113931904,~2113931904] --> OK [~0.2113931776E10,TO_POSINF] --> [~2113931776,~2113931776] --> OK [~0.2113931648E10,TO_POSINF] --> [~2113931648,~2113931648] --> OK [~0.211393152E10,TO_POSINF] --> [~2113931520,~2113931520] --> OK [~0.2113931392E10,TO_POSINF] --> [~2113931392,~2113931392] --> OK [~0.2113931264E10,TO_POSINF] --> [~2113931264,~2113931264] --> OK [~0.2113931136E10,TO_POSINF] --> [~2113931136,~2113931136] --> OK [~0.2113931008E10,TO_POSINF] --> [~2113931008,~2113931008] --> OK [~0.211393088E10,TO_POSINF] --> [~2113930880,~2113930880] --> OK [~0.2113930752E10,TO_POSINF] --> [~2113930752,~2113930752] --> OK [~0.2113930624E10,TO_POSINF] --> [~2113930624,~2113930624] --> OK [~0.2113930496E10,TO_POSINF] --> [~2113930496,~2113930496] --> OK [~0.2113930368E10,TO_POSINF] --> [~2113930368,~2113930368] --> OK [~0.211393024E10,TO_POSINF] --> [~2113930240,~2113930240] --> OK [~0.2113930112E10,TO_POSINF] --> [~2113930112,~2113930112] --> OK [~0.2113929984E10,TO_POSINF] --> [~2113929984,~2113929984] --> OK [~0.2113929856E10,TO_POSINF] --> [~2113929856,~2113929856] --> OK [~0.2113929728E10,TO_POSINF] --> [~2113929728,~2113929728] --> OK [~0.21139296E10,TO_POSINF] --> [~2113929600,~2113929600] --> OK [~0.2113929472E10,TO_POSINF] --> [~2113929472,~2113929472] --> OK [~0.2113929344E10,TO_POSINF] --> [~2113929344,~2113929344] --> OK [~0.2113929216E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113921024E10,TO_POSINF] --> [~2113921024,~2113921024] --> OK [~0.2113921152E10,TO_POSINF] --> [~2113921152,~2113921152] --> OK [~0.211392128E10,TO_POSINF] --> [~2113921280,~2113921280] --> OK [~0.2113921408E10,TO_POSINF] --> [~2113921408,~2113921408] --> OK [~0.2113921536E10,TO_POSINF] --> [~2113921536,~2113921536] --> OK [~0.2113921664E10,TO_POSINF] --> [~2113921664,~2113921664] --> OK [~0.2113921792E10,TO_POSINF] --> [~2113921792,~2113921792] --> OK [~0.211392192E10,TO_POSINF] --> [~2113921920,~2113921920] --> OK [~0.2113922048E10,TO_POSINF] --> [~2113922048,~2113922048] --> OK [~0.2113922176E10,TO_POSINF] --> [~2113922176,~2113922176] --> OK [~0.2113922304E10,TO_POSINF] --> [~2113922304,~2113922304] --> OK [~0.2113922432E10,TO_POSINF] --> [~2113922432,~2113922432] --> OK [~0.211392256E10,TO_POSINF] --> [~2113922560,~2113922560] --> OK [~0.2113922688E10,TO_POSINF] --> [~2113922688,~2113922688] --> OK [~0.2113922816E10,TO_POSINF] --> [~2113922816,~2113922816] --> OK [~0.2113922944E10,TO_POSINF] --> [~2113922944,~2113922944] --> OK [~0.2113923072E10,TO_POSINF] --> [~2113923072,~2113923072] --> OK [~0.21139232E10,TO_POSINF] --> [~2113923200,~2113923200] --> OK [~0.2113923328E10,TO_POSINF] --> [~2113923328,~2113923328] --> OK [~0.2113923456E10,TO_POSINF] --> [~2113923456,~2113923456] --> OK [~0.2113923584E10,TO_POSINF] --> [~2113923584,~2113923584] --> OK [~0.2113923712E10,TO_POSINF] --> [~2113923712,~2113923712] --> OK [~0.211392384E10,TO_POSINF] --> [~2113923840,~2113923840] --> OK [~0.2113923968E10,TO_POSINF] --> [~2113923968,~2113923968] --> OK [~0.2113924096E10,TO_POSINF] --> [~2113924096,~2113924096] --> OK [~0.2113924224E10,TO_POSINF] --> [~2113924224,~2113924224] --> OK [~0.2113924352E10,TO_POSINF] --> [~2113924352,~2113924352] --> OK [~0.211392448E10,TO_POSINF] --> [~2113924480,~2113924480] --> OK [~0.2113924608E10,TO_POSINF] --> [~2113924608,~2113924608] --> OK [~0.2113924736E10,TO_POSINF] --> [~2113924736,~2113924736] --> OK [~0.2113924864E10,TO_POSINF] --> [~2113924864,~2113924864] --> OK [~0.2113924992E10,TO_POSINF] --> [~2113924992,~2113924992] --> OK [~0.211392512E10,TO_POSINF] --> [~2113925120,~2113925120] --> OK [~0.2113925248E10,TO_POSINF] --> [~2113925248,~2113925248] --> OK [~0.2113925376E10,TO_POSINF] --> [~2113925376,~2113925376] --> OK [~0.2113925504E10,TO_POSINF] --> [~2113925504,~2113925504] --> OK [~0.2113925632E10,TO_POSINF] --> [~2113925632,~2113925632] --> OK [~0.211392576E10,TO_POSINF] --> [~2113925760,~2113925760] --> OK [~0.2113925888E10,TO_POSINF] --> [~2113925888,~2113925888] --> OK [~0.2113926016E10,TO_POSINF] --> [~2113926016,~2113926016] --> OK [~0.2113926144E10,TO_POSINF] --> [~2113926144,~2113926144] --> OK [~0.2113926272E10,TO_POSINF] --> [~2113926272,~2113926272] --> OK [~0.21139264E10,TO_POSINF] --> [~2113926400,~2113926400] --> OK [~0.2113926528E10,TO_POSINF] --> [~2113926528,~2113926528] --> OK [~0.2113926656E10,TO_POSINF] --> [~2113926656,~2113926656] --> OK [~0.2113926784E10,TO_POSINF] --> [~2113926784,~2113926784] --> OK [~0.2113926912E10,TO_POSINF] --> [~2113926912,~2113926912] --> OK [~0.211392704E10,TO_POSINF] --> [~2113927040,~2113927040] --> OK [~0.2113927168E10,TO_POSINF] --> [~2113927168,~2113927168] --> OK [~0.2113927296E10,TO_POSINF] --> [~2113927296,~2113927296] --> OK [~0.2113927424E10,TO_POSINF] --> [~2113927424,~2113927424] --> OK [~0.2113927552E10,TO_POSINF] --> [~2113927552,~2113927552] --> OK [~0.211392768E10,TO_POSINF] --> [~2113927680,~2113927680] --> OK [~0.2113927808E10,TO_POSINF] --> [~2113927808,~2113927808] --> OK [~0.2113927936E10,TO_POSINF] --> [~2113927936,~2113927936] --> OK [~0.2113928064E10,TO_POSINF] --> [~2113928064,~2113928064] --> OK [~0.2113928192E10,TO_POSINF] --> [~2113928192,~2113928192] --> OK [~0.211392832E10,TO_POSINF] --> [~2113928320,~2113928320] --> OK [~0.2113928448E10,TO_POSINF] --> [~2113928448,~2113928448] --> OK [~0.2113928576E10,TO_POSINF] --> [~2113928576,~2113928576] --> OK [~0.2113928704E10,TO_POSINF] --> [~2113928704,~2113928704] --> OK [~0.2113928832E10,TO_POSINF] --> [~2113928832,~2113928832] --> OK [~0.211392896E10,TO_POSINF] --> [~2113928960,~2113928960] --> OK [~0.2113929088E10,TO_POSINF] --> [~2113929088,~2113929088] --> OK [~0.2080382976E10,TO_POSINF] --> [~2080382976,~2080382976] --> OK [~0.2080382848E10,TO_POSINF] --> [~2080382848,~2080382848] --> OK [~0.208038272E10,TO_POSINF] --> [~2080382720,~2080382720] --> OK [~0.2080382592E10,TO_POSINF] --> [~2080382592,~2080382592] --> OK [~0.2080382464E10,TO_POSINF] --> [~2080382464,~2080382464] --> OK [~0.2080382336E10,TO_POSINF] --> [~2080382336,~2080382336] --> OK [~0.2080382208E10,TO_POSINF] --> [~2080382208,~2080382208] --> OK [~0.208038208E10,TO_POSINF] --> [~2080382080,~2080382080] --> OK [~0.2080381952E10,TO_POSINF] --> [~2080381952,~2080381952] --> OK [~0.2080381824E10,TO_POSINF] --> [~2080381824,~2080381824] --> OK [~0.2080381696E10,TO_POSINF] --> [~2080381696,~2080381696] --> OK [~0.2080381568E10,TO_POSINF] --> [~2080381568,~2080381568] --> OK [~0.208038144E10,TO_POSINF] --> [~2080381440,~2080381440] --> OK [~0.2080381312E10,TO_POSINF] --> [~2080381312,~2080381312] --> OK [~0.2080381184E10,TO_POSINF] --> [~2080381184,~2080381184] --> OK [~0.2080381056E10,TO_POSINF] --> [~2080381056,~2080381056] --> OK [~0.2080380928E10,TO_POSINF] --> [~2080380928,~2080380928] --> OK [~0.20803808E10,TO_POSINF] --> [~2080380800,~2080380800] --> OK [~0.2080380672E10,TO_POSINF] --> [~2080380672,~2080380672] --> OK [~0.2080380544E10,TO_POSINF] --> [~2080380544,~2080380544] --> OK [~0.2080380416E10,TO_POSINF] --> [~2080380416,~2080380416] --> OK [~0.2080380288E10,TO_POSINF] --> [~2080380288,~2080380288] --> OK [~0.208038016E10,TO_POSINF] --> [~2080380160,~2080380160] --> OK [~0.2080380032E10,TO_POSINF] --> [~2080380032,~2080380032] --> OK [~0.2080379904E10,TO_POSINF] --> [~2080379904,~2080379904] --> OK [~0.2080379776E10,TO_POSINF] --> [~2080379776,~2080379776] --> OK [~0.2080379648E10,TO_POSINF] --> [~2080379648,~2080379648] --> OK [~0.208037952E10,TO_POSINF] --> [~2080379520,~2080379520] --> OK [~0.2080379392E10,TO_POSINF] --> [~2080379392,~2080379392] --> OK [~0.2080379264E10,TO_POSINF] --> [~2080379264,~2080379264] --> OK [~0.2080379136E10,TO_POSINF] --> [~2080379136,~2080379136] --> OK [~0.2080379008E10,TO_POSINF] --> [~2080379008,~2080379008] --> OK [~0.208037888E10,TO_POSINF] --> [~2080378880,~2080378880] --> OK [~0.2080378752E10,TO_POSINF] --> [~2080378752,~2080378752] --> OK [~0.2080378624E10,TO_POSINF] --> [~2080378624,~2080378624] --> OK [~0.2080378496E10,TO_POSINF] --> [~2080378496,~2080378496] --> OK [~0.2080378368E10,TO_POSINF] --> [~2080378368,~2080378368] --> OK [~0.208037824E10,TO_POSINF] --> [~2080378240,~2080378240] --> OK [~0.2080378112E10,TO_POSINF] --> [~2080378112,~2080378112] --> OK [~0.2080377984E10,TO_POSINF] --> [~2080377984,~2080377984] --> OK [~0.2080377856E10,TO_POSINF] --> [~2080377856,~2080377856] --> OK [~0.2080377728E10,TO_POSINF] --> [~2080377728,~2080377728] --> OK [~0.20803776E10,TO_POSINF] --> [~2080377600,~2080377600] --> OK [~0.2080377472E10,TO_POSINF] --> [~2080377472,~2080377472] --> OK [~0.2080377344E10,TO_POSINF] --> [~2080377344,~2080377344] --> OK [~0.2080377216E10,TO_POSINF] --> [~2080377216,~2080377216] --> OK [~0.2080377088E10,TO_POSINF] --> [~2080377088,~2080377088] --> OK [~0.208037696E10,TO_POSINF] --> [~2080376960,~2080376960] --> OK [~0.2080376832E10,TO_POSINF] --> [~2080376832,~2080376832] --> OK [~0.2080376704E10,TO_POSINF] --> [~2080376704,~2080376704] --> OK [~0.2080376576E10,TO_POSINF] --> [~2080376576,~2080376576] --> OK [~0.2080376448E10,TO_POSINF] --> [~2080376448,~2080376448] --> OK [~0.208037632E10,TO_POSINF] --> [~2080376320,~2080376320] --> OK [~0.2080376192E10,TO_POSINF] --> [~2080376192,~2080376192] --> OK [~0.2080376064E10,TO_POSINF] --> [~2080376064,~2080376064] --> OK [~0.2080375936E10,TO_POSINF] --> [~2080375936,~2080375936] --> OK [~0.2080375808E10,TO_POSINF] --> [~2080375808,~2080375808] --> OK [~0.208037568E10,TO_POSINF] --> [~2080375680,~2080375680] --> OK [~0.2080375552E10,TO_POSINF] --> [~2080375552,~2080375552] --> OK [~0.2080375424E10,TO_POSINF] --> [~2080375424,~2080375424] --> OK [~0.2080375296E10,TO_POSINF] --> [~2080375296,~2080375296] --> OK [~0.2080375168E10,TO_POSINF] --> [~2080375168,~2080375168] --> OK [~0.208037504E10,TO_POSINF] --> [~2080375040,~2080375040] --> OK [~0.2080374912E10,TO_POSINF] --> [~2080374912,~2080374912] --> OK [~0.2080374784E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080366592E10,TO_POSINF] --> [~2080366592,~2080366592] --> OK [~0.208036672E10,TO_POSINF] --> [~2080366720,~2080366720] --> OK [~0.2080366848E10,TO_POSINF] --> [~2080366848,~2080366848] --> OK [~0.2080366976E10,TO_POSINF] --> [~2080366976,~2080366976] --> OK [~0.2080367104E10,TO_POSINF] --> [~2080367104,~2080367104] --> OK [~0.2080367232E10,TO_POSINF] --> [~2080367232,~2080367232] --> OK [~0.208036736E10,TO_POSINF] --> [~2080367360,~2080367360] --> OK [~0.2080367488E10,TO_POSINF] --> [~2080367488,~2080367488] --> OK [~0.2080367616E10,TO_POSINF] --> [~2080367616,~2080367616] --> OK [~0.2080367744E10,TO_POSINF] --> [~2080367744,~2080367744] --> OK [~0.2080367872E10,TO_POSINF] --> [~2080367872,~2080367872] --> OK [~0.2080368E10,TO_POSINF] --> [~2080368000,~2080368000] --> OK [~0.2080368128E10,TO_POSINF] --> [~2080368128,~2080368128] --> OK [~0.2080368256E10,TO_POSINF] --> [~2080368256,~2080368256] --> OK [~0.2080368384E10,TO_POSINF] --> [~2080368384,~2080368384] --> OK [~0.2080368512E10,TO_POSINF] --> [~2080368512,~2080368512] --> OK [~0.208036864E10,TO_POSINF] --> [~2080368640,~2080368640] --> OK [~0.2080368768E10,TO_POSINF] --> [~2080368768,~2080368768] --> OK [~0.2080368896E10,TO_POSINF] --> [~2080368896,~2080368896] --> OK [~0.2080369024E10,TO_POSINF] --> [~2080369024,~2080369024] --> OK [~0.2080369152E10,TO_POSINF] --> [~2080369152,~2080369152] --> OK [~0.208036928E10,TO_POSINF] --> [~2080369280,~2080369280] --> OK [~0.2080369408E10,TO_POSINF] --> [~2080369408,~2080369408] --> OK [~0.2080369536E10,TO_POSINF] --> [~2080369536,~2080369536] --> OK [~0.2080369664E10,TO_POSINF] --> [~2080369664,~2080369664] --> OK [~0.2080369792E10,TO_POSINF] --> [~2080369792,~2080369792] --> OK [~0.208036992E10,TO_POSINF] --> [~2080369920,~2080369920] --> OK [~0.2080370048E10,TO_POSINF] --> [~2080370048,~2080370048] --> OK [~0.2080370176E10,TO_POSINF] --> [~2080370176,~2080370176] --> OK [~0.2080370304E10,TO_POSINF] --> [~2080370304,~2080370304] --> OK [~0.2080370432E10,TO_POSINF] --> [~2080370432,~2080370432] --> OK [~0.208037056E10,TO_POSINF] --> [~2080370560,~2080370560] --> OK [~0.2080370688E10,TO_POSINF] --> [~2080370688,~2080370688] --> OK [~0.2080370816E10,TO_POSINF] --> [~2080370816,~2080370816] --> OK [~0.2080370944E10,TO_POSINF] --> [~2080370944,~2080370944] --> OK [~0.2080371072E10,TO_POSINF] --> [~2080371072,~2080371072] --> OK [~0.20803712E10,TO_POSINF] --> [~2080371200,~2080371200] --> OK [~0.2080371328E10,TO_POSINF] --> [~2080371328,~2080371328] --> OK [~0.2080371456E10,TO_POSINF] --> [~2080371456,~2080371456] --> OK [~0.2080371584E10,TO_POSINF] --> [~2080371584,~2080371584] --> OK [~0.2080371712E10,TO_POSINF] --> [~2080371712,~2080371712] --> OK [~0.208037184E10,TO_POSINF] --> [~2080371840,~2080371840] --> OK [~0.2080371968E10,TO_POSINF] --> [~2080371968,~2080371968] --> OK [~0.2080372096E10,TO_POSINF] --> [~2080372096,~2080372096] --> OK [~0.2080372224E10,TO_POSINF] --> [~2080372224,~2080372224] --> OK [~0.2080372352E10,TO_POSINF] --> [~2080372352,~2080372352] --> OK [~0.208037248E10,TO_POSINF] --> [~2080372480,~2080372480] --> OK [~0.2080372608E10,TO_POSINF] --> [~2080372608,~2080372608] --> OK [~0.2080372736E10,TO_POSINF] --> [~2080372736,~2080372736] --> OK [~0.2080372864E10,TO_POSINF] --> [~2080372864,~2080372864] --> OK [~0.2080372992E10,TO_POSINF] --> [~2080372992,~2080372992] --> OK [~0.208037312E10,TO_POSINF] --> [~2080373120,~2080373120] --> OK [~0.2080373248E10,TO_POSINF] --> [~2080373248,~2080373248] --> OK [~0.2080373376E10,TO_POSINF] --> [~2080373376,~2080373376] --> OK [~0.2080373504E10,TO_POSINF] --> [~2080373504,~2080373504] --> OK [~0.2080373632E10,TO_POSINF] --> [~2080373632,~2080373632] --> OK [~0.208037376E10,TO_POSINF] --> [~2080373760,~2080373760] --> OK [~0.2080373888E10,TO_POSINF] --> [~2080373888,~2080373888] --> OK [~0.2080374016E10,TO_POSINF] --> [~2080374016,~2080374016] --> OK [~0.2080374144E10,TO_POSINF] --> [~2080374144,~2080374144] --> OK [~0.2080374272E10,TO_POSINF] --> [~2080374272,~2080374272] --> OK [~0.20803744E10,TO_POSINF] --> [~2080374400,~2080374400] --> OK [~0.2080374528E10,TO_POSINF] --> [~2080374528,~2080374528] --> OK [~0.2080374656E10,TO_POSINF] --> [~2080374656,~2080374656] --> OK [~0.2013274112E10,TO_POSINF] --> [~2013274112,~2013274112] --> OK [~0.2013273984E10,TO_POSINF] --> [~2013273984,~2013273984] --> OK [~0.2013273856E10,TO_POSINF] --> [~2013273856,~2013273856] --> OK [~0.2013273728E10,TO_POSINF] --> [~2013273728,~2013273728] --> OK [~0.20132736E10,TO_POSINF] --> [~2013273600,~2013273600] --> OK [~0.2013273472E10,TO_POSINF] --> [~2013273472,~2013273472] --> OK [~0.2013273344E10,TO_POSINF] --> [~2013273344,~2013273344] --> OK [~0.2013273216E10,TO_POSINF] --> [~2013273216,~2013273216] --> OK [~0.2013273088E10,TO_POSINF] --> [~2013273088,~2013273088] --> OK [~0.201327296E10,TO_POSINF] --> [~2013272960,~2013272960] --> OK [~0.2013272832E10,TO_POSINF] --> [~2013272832,~2013272832] --> OK [~0.2013272704E10,TO_POSINF] --> [~2013272704,~2013272704] --> OK [~0.2013272576E10,TO_POSINF] --> [~2013272576,~2013272576] --> OK [~0.2013272448E10,TO_POSINF] --> [~2013272448,~2013272448] --> OK [~0.201327232E10,TO_POSINF] --> [~2013272320,~2013272320] --> OK [~0.2013272192E10,TO_POSINF] --> [~2013272192,~2013272192] --> OK [~0.2013272064E10,TO_POSINF] --> [~2013272064,~2013272064] --> OK [~0.2013271936E10,TO_POSINF] --> [~2013271936,~2013271936] --> OK [~0.2013271808E10,TO_POSINF] --> [~2013271808,~2013271808] --> OK [~0.201327168E10,TO_POSINF] --> [~2013271680,~2013271680] --> OK [~0.2013271552E10,TO_POSINF] --> [~2013271552,~2013271552] --> OK [~0.2013271424E10,TO_POSINF] --> [~2013271424,~2013271424] --> OK [~0.2013271296E10,TO_POSINF] --> [~2013271296,~2013271296] --> OK [~0.2013271168E10,TO_POSINF] --> [~2013271168,~2013271168] --> OK [~0.201327104E10,TO_POSINF] --> [~2013271040,~2013271040] --> OK [~0.2013270912E10,TO_POSINF] --> [~2013270912,~2013270912] --> OK [~0.2013270784E10,TO_POSINF] --> [~2013270784,~2013270784] --> OK [~0.2013270656E10,TO_POSINF] --> [~2013270656,~2013270656] --> OK [~0.2013270528E10,TO_POSINF] --> [~2013270528,~2013270528] --> OK [~0.20132704E10,TO_POSINF] --> [~2013270400,~2013270400] --> OK [~0.2013270272E10,TO_POSINF] --> [~2013270272,~2013270272] --> OK [~0.2013270144E10,TO_POSINF] --> [~2013270144,~2013270144] --> OK [~0.2013270016E10,TO_POSINF] --> [~2013270016,~2013270016] --> OK [~0.2013269888E10,TO_POSINF] --> [~2013269888,~2013269888] --> OK [~0.201326976E10,TO_POSINF] --> [~2013269760,~2013269760] --> OK [~0.2013269632E10,TO_POSINF] --> [~2013269632,~2013269632] --> OK [~0.2013269504E10,TO_POSINF] --> [~2013269504,~2013269504] --> OK [~0.2013269376E10,TO_POSINF] --> [~2013269376,~2013269376] --> OK [~0.2013269248E10,TO_POSINF] --> [~2013269248,~2013269248] --> OK [~0.201326912E10,TO_POSINF] --> [~2013269120,~2013269120] --> OK [~0.2013268992E10,TO_POSINF] --> [~2013268992,~2013268992] --> OK [~0.2013268864E10,TO_POSINF] --> [~2013268864,~2013268864] --> OK [~0.2013268736E10,TO_POSINF] --> [~2013268736,~2013268736] --> OK [~0.2013268608E10,TO_POSINF] --> [~2013268608,~2013268608] --> OK [~0.201326848E10,TO_POSINF] --> [~2013268480,~2013268480] --> OK [~0.2013268352E10,TO_POSINF] --> [~2013268352,~2013268352] --> OK [~0.2013268224E10,TO_POSINF] --> [~2013268224,~2013268224] --> OK [~0.2013268096E10,TO_POSINF] --> [~2013268096,~2013268096] --> OK [~0.2013267968E10,TO_POSINF] --> [~2013267968,~2013267968] --> OK [~0.201326784E10,TO_POSINF] --> [~2013267840,~2013267840] --> OK [~0.2013267712E10,TO_POSINF] --> [~2013267712,~2013267712] --> OK [~0.2013267584E10,TO_POSINF] --> [~2013267584,~2013267584] --> OK [~0.2013267456E10,TO_POSINF] --> [~2013267456,~2013267456] --> OK [~0.2013267328E10,TO_POSINF] --> [~2013267328,~2013267328] --> OK [~0.20132672E10,TO_POSINF] --> [~2013267200,~2013267200] --> OK [~0.2013267072E10,TO_POSINF] --> [~2013267072,~2013267072] --> OK [~0.2013266944E10,TO_POSINF] --> [~2013266944,~2013266944] --> OK [~0.2013266816E10,TO_POSINF] --> [~2013266816,~2013266816] --> OK [~0.2013266688E10,TO_POSINF] --> [~2013266688,~2013266688] --> OK [~0.201326656E10,TO_POSINF] --> [~2013266560,~2013266560] --> OK [~0.2013266432E10,TO_POSINF] --> [~2013266432,~2013266432] --> OK [~0.2013266304E10,TO_POSINF] --> [~2013266304,~2013266304] --> OK [~0.2013266176E10,TO_POSINF] --> [~2013266176,~2013266176] --> OK [~0.2013266048E10,TO_POSINF] --> [~2013266048,~2013266048] --> OK [~0.201326592E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013257728E10,TO_POSINF] --> [~2013257728,~2013257728] --> OK [~0.2013257856E10,TO_POSINF] --> [~2013257856,~2013257856] --> OK [~0.2013257984E10,TO_POSINF] --> [~2013257984,~2013257984] --> OK [~0.2013258112E10,TO_POSINF] --> [~2013258112,~2013258112] --> OK [~0.201325824E10,TO_POSINF] --> [~2013258240,~2013258240] --> OK [~0.2013258368E10,TO_POSINF] --> [~2013258368,~2013258368] --> OK [~0.2013258496E10,TO_POSINF] --> [~2013258496,~2013258496] --> OK [~0.2013258624E10,TO_POSINF] --> [~2013258624,~2013258624] --> OK [~0.2013258752E10,TO_POSINF] --> [~2013258752,~2013258752] --> OK [~0.201325888E10,TO_POSINF] --> [~2013258880,~2013258880] --> OK [~0.2013259008E10,TO_POSINF] --> [~2013259008,~2013259008] --> OK [~0.2013259136E10,TO_POSINF] --> [~2013259136,~2013259136] --> OK [~0.2013259264E10,TO_POSINF] --> [~2013259264,~2013259264] --> OK [~0.2013259392E10,TO_POSINF] --> [~2013259392,~2013259392] --> OK [~0.201325952E10,TO_POSINF] --> [~2013259520,~2013259520] --> OK [~0.2013259648E10,TO_POSINF] --> [~2013259648,~2013259648] --> OK [~0.2013259776E10,TO_POSINF] --> [~2013259776,~2013259776] --> OK [~0.2013259904E10,TO_POSINF] --> [~2013259904,~2013259904] --> OK [~0.2013260032E10,TO_POSINF] --> [~2013260032,~2013260032] --> OK [~0.201326016E10,TO_POSINF] --> [~2013260160,~2013260160] --> OK [~0.2013260288E10,TO_POSINF] --> [~2013260288,~2013260288] --> OK [~0.2013260416E10,TO_POSINF] --> [~2013260416,~2013260416] --> OK [~0.2013260544E10,TO_POSINF] --> [~2013260544,~2013260544] --> OK [~0.2013260672E10,TO_POSINF] --> [~2013260672,~2013260672] --> OK [~0.20132608E10,TO_POSINF] --> [~2013260800,~2013260800] --> OK [~0.2013260928E10,TO_POSINF] --> [~2013260928,~2013260928] --> OK [~0.2013261056E10,TO_POSINF] --> [~2013261056,~2013261056] --> OK [~0.2013261184E10,TO_POSINF] --> [~2013261184,~2013261184] --> OK [~0.2013261312E10,TO_POSINF] --> [~2013261312,~2013261312] --> OK [~0.201326144E10,TO_POSINF] --> [~2013261440,~2013261440] --> OK [~0.2013261568E10,TO_POSINF] --> [~2013261568,~2013261568] --> OK [~0.2013261696E10,TO_POSINF] --> [~2013261696,~2013261696] --> OK [~0.2013261824E10,TO_POSINF] --> [~2013261824,~2013261824] --> OK [~0.2013261952E10,TO_POSINF] --> [~2013261952,~2013261952] --> OK [~0.201326208E10,TO_POSINF] --> [~2013262080,~2013262080] --> OK [~0.2013262208E10,TO_POSINF] --> [~2013262208,~2013262208] --> OK [~0.2013262336E10,TO_POSINF] --> [~2013262336,~2013262336] --> OK [~0.2013262464E10,TO_POSINF] --> [~2013262464,~2013262464] --> OK [~0.2013262592E10,TO_POSINF] --> [~2013262592,~2013262592] --> OK [~0.201326272E10,TO_POSINF] --> [~2013262720,~2013262720] --> OK [~0.2013262848E10,TO_POSINF] --> [~2013262848,~2013262848] --> OK [~0.2013262976E10,TO_POSINF] --> [~2013262976,~2013262976] --> OK [~0.2013263104E10,TO_POSINF] --> [~2013263104,~2013263104] --> OK [~0.2013263232E10,TO_POSINF] --> [~2013263232,~2013263232] --> OK [~0.201326336E10,TO_POSINF] --> [~2013263360,~2013263360] --> OK [~0.2013263488E10,TO_POSINF] --> [~2013263488,~2013263488] --> OK [~0.2013263616E10,TO_POSINF] --> [~2013263616,~2013263616] --> OK [~0.2013263744E10,TO_POSINF] --> [~2013263744,~2013263744] --> OK [~0.2013263872E10,TO_POSINF] --> [~2013263872,~2013263872] --> OK [~0.2013264E10,TO_POSINF] --> [~2013264000,~2013264000] --> OK [~0.2013264128E10,TO_POSINF] --> [~2013264128,~2013264128] --> OK [~0.2013264256E10,TO_POSINF] --> [~2013264256,~2013264256] --> OK [~0.2013264384E10,TO_POSINF] --> [~2013264384,~2013264384] --> OK [~0.2013264512E10,TO_POSINF] --> [~2013264512,~2013264512] --> OK [~0.201326464E10,TO_POSINF] --> [~2013264640,~2013264640] --> OK [~0.2013264768E10,TO_POSINF] --> [~2013264768,~2013264768] --> OK [~0.2013264896E10,TO_POSINF] --> [~2013264896,~2013264896] --> OK [~0.2013265024E10,TO_POSINF] --> [~2013265024,~2013265024] --> OK [~0.2013265152E10,TO_POSINF] --> [~2013265152,~2013265152] --> OK [~0.201326528E10,TO_POSINF] --> [~2013265280,~2013265280] --> OK [~0.2013265408E10,TO_POSINF] --> [~2013265408,~2013265408] --> OK [~0.2013265536E10,TO_POSINF] --> [~2013265536,~2013265536] --> OK [~0.2013265664E10,TO_POSINF] --> [~2013265664,~2013265664] --> OK [~0.2013265792E10,TO_POSINF] --> [~2013265792,~2013265792] --> OK [~0.1879056384E10,TO_POSINF] --> [~1879056384,~1879056384] --> OK [~0.1879056256E10,TO_POSINF] --> [~1879056256,~1879056256] --> OK [~0.1879056128E10,TO_POSINF] --> [~1879056128,~1879056128] --> OK [~0.1879056E10,TO_POSINF] --> [~1879056000,~1879056000] --> OK [~0.1879055872E10,TO_POSINF] --> [~1879055872,~1879055872] --> OK [~0.1879055744E10,TO_POSINF] --> [~1879055744,~1879055744] --> OK [~0.1879055616E10,TO_POSINF] --> [~1879055616,~1879055616] --> OK [~0.1879055488E10,TO_POSINF] --> [~1879055488,~1879055488] --> OK [~0.187905536E10,TO_POSINF] --> [~1879055360,~1879055360] --> OK [~0.1879055232E10,TO_POSINF] --> [~1879055232,~1879055232] --> OK [~0.1879055104E10,TO_POSINF] --> [~1879055104,~1879055104] --> OK [~0.1879054976E10,TO_POSINF] --> [~1879054976,~1879054976] --> OK [~0.1879054848E10,TO_POSINF] --> [~1879054848,~1879054848] --> OK [~0.187905472E10,TO_POSINF] --> [~1879054720,~1879054720] --> OK [~0.1879054592E10,TO_POSINF] --> [~1879054592,~1879054592] --> OK [~0.1879054464E10,TO_POSINF] --> [~1879054464,~1879054464] --> OK [~0.1879054336E10,TO_POSINF] --> [~1879054336,~1879054336] --> OK [~0.1879054208E10,TO_POSINF] --> [~1879054208,~1879054208] --> OK [~0.187905408E10,TO_POSINF] --> [~1879054080,~1879054080] --> OK [~0.1879053952E10,TO_POSINF] --> [~1879053952,~1879053952] --> OK [~0.1879053824E10,TO_POSINF] --> [~1879053824,~1879053824] --> OK [~0.1879053696E10,TO_POSINF] --> [~1879053696,~1879053696] --> OK [~0.1879053568E10,TO_POSINF] --> [~1879053568,~1879053568] --> OK [~0.187905344E10,TO_POSINF] --> [~1879053440,~1879053440] --> OK [~0.1879053312E10,TO_POSINF] --> [~1879053312,~1879053312] --> OK [~0.1879053184E10,TO_POSINF] --> [~1879053184,~1879053184] --> OK [~0.1879053056E10,TO_POSINF] --> [~1879053056,~1879053056] --> OK [~0.1879052928E10,TO_POSINF] --> [~1879052928,~1879052928] --> OK [~0.18790528E10,TO_POSINF] --> [~1879052800,~1879052800] --> OK [~0.1879052672E10,TO_POSINF] --> [~1879052672,~1879052672] --> OK [~0.1879052544E10,TO_POSINF] --> [~1879052544,~1879052544] --> OK [~0.1879052416E10,TO_POSINF] --> [~1879052416,~1879052416] --> OK [~0.1879052288E10,TO_POSINF] --> [~1879052288,~1879052288] --> OK [~0.187905216E10,TO_POSINF] --> [~1879052160,~1879052160] --> OK [~0.1879052032E10,TO_POSINF] --> [~1879052032,~1879052032] --> OK [~0.1879051904E10,TO_POSINF] --> [~1879051904,~1879051904] --> OK [~0.1879051776E10,TO_POSINF] --> [~1879051776,~1879051776] --> OK [~0.1879051648E10,TO_POSINF] --> [~1879051648,~1879051648] --> OK [~0.187905152E10,TO_POSINF] --> [~1879051520,~1879051520] --> OK [~0.1879051392E10,TO_POSINF] --> [~1879051392,~1879051392] --> OK [~0.1879051264E10,TO_POSINF] --> [~1879051264,~1879051264] --> OK [~0.1879051136E10,TO_POSINF] --> [~1879051136,~1879051136] --> OK [~0.1879051008E10,TO_POSINF] --> [~1879051008,~1879051008] --> OK [~0.187905088E10,TO_POSINF] --> [~1879050880,~1879050880] --> OK [~0.1879050752E10,TO_POSINF] --> [~1879050752,~1879050752] --> OK [~0.1879050624E10,TO_POSINF] --> [~1879050624,~1879050624] --> OK [~0.1879050496E10,TO_POSINF] --> [~1879050496,~1879050496] --> OK [~0.1879050368E10,TO_POSINF] --> [~1879050368,~1879050368] --> OK [~0.187905024E10,TO_POSINF] --> [~1879050240,~1879050240] --> OK [~0.1879050112E10,TO_POSINF] --> [~1879050112,~1879050112] --> OK [~0.1879049984E10,TO_POSINF] --> [~1879049984,~1879049984] --> OK [~0.1879049856E10,TO_POSINF] --> [~1879049856,~1879049856] --> OK [~0.1879049728E10,TO_POSINF] --> [~1879049728,~1879049728] --> OK [~0.18790496E10,TO_POSINF] --> [~1879049600,~1879049600] --> OK [~0.1879049472E10,TO_POSINF] --> [~1879049472,~1879049472] --> OK [~0.1879049344E10,TO_POSINF] --> [~1879049344,~1879049344] --> OK [~0.1879049216E10,TO_POSINF] --> [~1879049216,~1879049216] --> OK [~0.1879049088E10,TO_POSINF] --> [~1879049088,~1879049088] --> OK [~0.187904896E10,TO_POSINF] --> [~1879048960,~1879048960] --> OK [~0.1879048832E10,TO_POSINF] --> [~1879048832,~1879048832] --> OK [~0.1879048704E10,TO_POSINF] --> [~1879048704,~1879048704] --> OK [~0.1879048576E10,TO_POSINF] --> [~1879048576,~1879048576] --> OK [~0.1879048448E10,TO_POSINF] --> [~1879048448,~1879048448] --> OK [~0.187904832E10,TO_POSINF] --> [~1879048320,~1879048320] --> OK [~0.1879048192E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.187904E10,TO_POSINF] --> [~1879040000,~1879040000] --> OK [~0.1879040128E10,TO_POSINF] --> [~1879040128,~1879040128] --> OK [~0.1879040256E10,TO_POSINF] --> [~1879040256,~1879040256] --> OK [~0.1879040384E10,TO_POSINF] --> [~1879040384,~1879040384] --> OK [~0.1879040512E10,TO_POSINF] --> [~1879040512,~1879040512] --> OK [~0.187904064E10,TO_POSINF] --> [~1879040640,~1879040640] --> OK [~0.1879040768E10,TO_POSINF] --> [~1879040768,~1879040768] --> OK [~0.1879040896E10,TO_POSINF] --> [~1879040896,~1879040896] --> OK [~0.1879041024E10,TO_POSINF] --> [~1879041024,~1879041024] --> OK [~0.1879041152E10,TO_POSINF] --> [~1879041152,~1879041152] --> OK [~0.187904128E10,TO_POSINF] --> [~1879041280,~1879041280] --> OK [~0.1879041408E10,TO_POSINF] --> [~1879041408,~1879041408] --> OK [~0.1879041536E10,TO_POSINF] --> [~1879041536,~1879041536] --> OK [~0.1879041664E10,TO_POSINF] --> [~1879041664,~1879041664] --> OK [~0.1879041792E10,TO_POSINF] --> [~1879041792,~1879041792] --> OK [~0.187904192E10,TO_POSINF] --> [~1879041920,~1879041920] --> OK [~0.1879042048E10,TO_POSINF] --> [~1879042048,~1879042048] --> OK [~0.1879042176E10,TO_POSINF] --> [~1879042176,~1879042176] --> OK [~0.1879042304E10,TO_POSINF] --> [~1879042304,~1879042304] --> OK [~0.1879042432E10,TO_POSINF] --> [~1879042432,~1879042432] --> OK [~0.187904256E10,TO_POSINF] --> [~1879042560,~1879042560] --> OK [~0.1879042688E10,TO_POSINF] --> [~1879042688,~1879042688] --> OK [~0.1879042816E10,TO_POSINF] --> [~1879042816,~1879042816] --> OK [~0.1879042944E10,TO_POSINF] --> [~1879042944,~1879042944] --> OK [~0.1879043072E10,TO_POSINF] --> [~1879043072,~1879043072] --> OK [~0.18790432E10,TO_POSINF] --> [~1879043200,~1879043200] --> OK [~0.1879043328E10,TO_POSINF] --> [~1879043328,~1879043328] --> OK [~0.1879043456E10,TO_POSINF] --> [~1879043456,~1879043456] --> OK [~0.1879043584E10,TO_POSINF] --> [~1879043584,~1879043584] --> OK [~0.1879043712E10,TO_POSINF] --> [~1879043712,~1879043712] --> OK [~0.187904384E10,TO_POSINF] --> [~1879043840,~1879043840] --> OK [~0.1879043968E10,TO_POSINF] --> [~1879043968,~1879043968] --> OK [~0.1879044096E10,TO_POSINF] --> [~1879044096,~1879044096] --> OK [~0.1879044224E10,TO_POSINF] --> [~1879044224,~1879044224] --> OK [~0.1879044352E10,TO_POSINF] --> [~1879044352,~1879044352] --> OK [~0.187904448E10,TO_POSINF] --> [~1879044480,~1879044480] --> OK [~0.1879044608E10,TO_POSINF] --> [~1879044608,~1879044608] --> OK [~0.1879044736E10,TO_POSINF] --> [~1879044736,~1879044736] --> OK [~0.1879044864E10,TO_POSINF] --> [~1879044864,~1879044864] --> OK [~0.1879044992E10,TO_POSINF] --> [~1879044992,~1879044992] --> OK [~0.187904512E10,TO_POSINF] --> [~1879045120,~1879045120] --> OK [~0.1879045248E10,TO_POSINF] --> [~1879045248,~1879045248] --> OK [~0.1879045376E10,TO_POSINF] --> [~1879045376,~1879045376] --> OK [~0.1879045504E10,TO_POSINF] --> [~1879045504,~1879045504] --> OK [~0.1879045632E10,TO_POSINF] --> [~1879045632,~1879045632] --> OK [~0.187904576E10,TO_POSINF] --> [~1879045760,~1879045760] --> OK [~0.1879045888E10,TO_POSINF] --> [~1879045888,~1879045888] --> OK [~0.1879046016E10,TO_POSINF] --> [~1879046016,~1879046016] --> OK [~0.1879046144E10,TO_POSINF] --> [~1879046144,~1879046144] --> OK [~0.1879046272E10,TO_POSINF] --> [~1879046272,~1879046272] --> OK [~0.18790464E10,TO_POSINF] --> [~1879046400,~1879046400] --> OK [~0.1879046528E10,TO_POSINF] --> [~1879046528,~1879046528] --> OK [~0.1879046656E10,TO_POSINF] --> [~1879046656,~1879046656] --> OK [~0.1879046784E10,TO_POSINF] --> [~1879046784,~1879046784] --> OK [~0.1879046912E10,TO_POSINF] --> [~1879046912,~1879046912] --> OK [~0.187904704E10,TO_POSINF] --> [~1879047040,~1879047040] --> OK [~0.1879047168E10,TO_POSINF] --> [~1879047168,~1879047168] --> OK [~0.1879047296E10,TO_POSINF] --> [~1879047296,~1879047296] --> OK [~0.1879047424E10,TO_POSINF] --> [~1879047424,~1879047424] --> OK [~0.1879047552E10,TO_POSINF] --> [~1879047552,~1879047552] --> OK [~0.187904768E10,TO_POSINF] --> [~1879047680,~1879047680] --> OK [~0.1879047808E10,TO_POSINF] --> [~1879047808,~1879047808] --> OK [~0.1879047936E10,TO_POSINF] --> [~1879047936,~1879047936] --> OK [~0.1879048064E10,TO_POSINF] --> [~1879048064,~1879048064] --> OK [~0.1610620928E10,TO_POSINF] --> [~1610620928,~1610620928] --> OK [~0.16106208E10,TO_POSINF] --> [~1610620800,~1610620800] --> OK [~0.1610620672E10,TO_POSINF] --> [~1610620672,~1610620672] --> OK [~0.1610620544E10,TO_POSINF] --> [~1610620544,~1610620544] --> OK [~0.1610620416E10,TO_POSINF] --> [~1610620416,~1610620416] --> OK [~0.1610620288E10,TO_POSINF] --> [~1610620288,~1610620288] --> OK [~0.161062016E10,TO_POSINF] --> [~1610620160,~1610620160] --> OK [~0.1610620032E10,TO_POSINF] --> [~1610620032,~1610620032] --> OK [~0.1610619904E10,TO_POSINF] --> [~1610619904,~1610619904] --> OK [~0.1610619776E10,TO_POSINF] --> [~1610619776,~1610619776] --> OK [~0.1610619648E10,TO_POSINF] --> [~1610619648,~1610619648] --> OK [~0.161061952E10,TO_POSINF] --> [~1610619520,~1610619520] --> OK [~0.1610619392E10,TO_POSINF] --> [~1610619392,~1610619392] --> OK [~0.1610619264E10,TO_POSINF] --> [~1610619264,~1610619264] --> OK [~0.1610619136E10,TO_POSINF] --> [~1610619136,~1610619136] --> OK [~0.1610619008E10,TO_POSINF] --> [~1610619008,~1610619008] --> OK [~0.161061888E10,TO_POSINF] --> [~1610618880,~1610618880] --> OK [~0.1610618752E10,TO_POSINF] --> [~1610618752,~1610618752] --> OK [~0.1610618624E10,TO_POSINF] --> [~1610618624,~1610618624] --> OK [~0.1610618496E10,TO_POSINF] --> [~1610618496,~1610618496] --> OK [~0.1610618368E10,TO_POSINF] --> [~1610618368,~1610618368] --> OK [~0.161061824E10,TO_POSINF] --> [~1610618240,~1610618240] --> OK [~0.1610618112E10,TO_POSINF] --> [~1610618112,~1610618112] --> OK [~0.1610617984E10,TO_POSINF] --> [~1610617984,~1610617984] --> OK [~0.1610617856E10,TO_POSINF] --> [~1610617856,~1610617856] --> OK [~0.1610617728E10,TO_POSINF] --> [~1610617728,~1610617728] --> OK [~0.16106176E10,TO_POSINF] --> [~1610617600,~1610617600] --> OK [~0.1610617472E10,TO_POSINF] --> [~1610617472,~1610617472] --> OK [~0.1610617344E10,TO_POSINF] --> [~1610617344,~1610617344] --> OK [~0.1610617216E10,TO_POSINF] --> [~1610617216,~1610617216] --> OK [~0.1610617088E10,TO_POSINF] --> [~1610617088,~1610617088] --> OK [~0.161061696E10,TO_POSINF] --> [~1610616960,~1610616960] --> OK [~0.1610616832E10,TO_POSINF] --> [~1610616832,~1610616832] --> OK [~0.1610616704E10,TO_POSINF] --> [~1610616704,~1610616704] --> OK [~0.1610616576E10,TO_POSINF] --> [~1610616576,~1610616576] --> OK [~0.1610616448E10,TO_POSINF] --> [~1610616448,~1610616448] --> OK [~0.161061632E10,TO_POSINF] --> [~1610616320,~1610616320] --> OK [~0.1610616192E10,TO_POSINF] --> [~1610616192,~1610616192] --> OK [~0.1610616064E10,TO_POSINF] --> [~1610616064,~1610616064] --> OK [~0.1610615936E10,TO_POSINF] --> [~1610615936,~1610615936] --> OK [~0.1610615808E10,TO_POSINF] --> [~1610615808,~1610615808] --> OK [~0.161061568E10,TO_POSINF] --> [~1610615680,~1610615680] --> OK [~0.1610615552E10,TO_POSINF] --> [~1610615552,~1610615552] --> OK [~0.1610615424E10,TO_POSINF] --> [~1610615424,~1610615424] --> OK [~0.1610615296E10,TO_POSINF] --> [~1610615296,~1610615296] --> OK [~0.1610615168E10,TO_POSINF] --> [~1610615168,~1610615168] --> OK [~0.161061504E10,TO_POSINF] --> [~1610615040,~1610615040] --> OK [~0.1610614912E10,TO_POSINF] --> [~1610614912,~1610614912] --> OK [~0.1610614784E10,TO_POSINF] --> [~1610614784,~1610614784] --> OK [~0.1610614656E10,TO_POSINF] --> [~1610614656,~1610614656] --> OK [~0.1610614528E10,TO_POSINF] --> [~1610614528,~1610614528] --> OK [~0.16106144E10,TO_POSINF] --> [~1610614400,~1610614400] --> OK [~0.1610614272E10,TO_POSINF] --> [~1610614272,~1610614272] --> OK [~0.1610614144E10,TO_POSINF] --> [~1610614144,~1610614144] --> OK [~0.1610614016E10,TO_POSINF] --> [~1610614016,~1610614016] --> OK [~0.1610613888E10,TO_POSINF] --> [~1610613888,~1610613888] --> OK [~0.161061376E10,TO_POSINF] --> [~1610613760,~1610613760] --> OK [~0.1610613632E10,TO_POSINF] --> [~1610613632,~1610613632] --> OK [~0.1610613504E10,TO_POSINF] --> [~1610613504,~1610613504] --> OK [~0.1610613376E10,TO_POSINF] --> [~1610613376,~1610613376] --> OK [~0.1610613248E10,TO_POSINF] --> [~1610613248,~1610613248] --> OK [~0.161061312E10,TO_POSINF] --> [~1610613120,~1610613120] --> OK [~0.1610612992E10,TO_POSINF] --> [~1610612992,~1610612992] --> OK [~0.1610612864E10,TO_POSINF] --> [~1610612864,~1610612864] --> OK [~0.1610612736E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610604544E10,TO_POSINF] --> [~1610604544,~1610604544] --> OK [~0.1610604672E10,TO_POSINF] --> [~1610604672,~1610604672] --> OK [~0.16106048E10,TO_POSINF] --> [~1610604800,~1610604800] --> OK [~0.1610604928E10,TO_POSINF] --> [~1610604928,~1610604928] --> OK [~0.1610605056E10,TO_POSINF] --> [~1610605056,~1610605056] --> OK [~0.1610605184E10,TO_POSINF] --> [~1610605184,~1610605184] --> OK [~0.1610605312E10,TO_POSINF] --> [~1610605312,~1610605312] --> OK [~0.161060544E10,TO_POSINF] --> [~1610605440,~1610605440] --> OK [~0.1610605568E10,TO_POSINF] --> [~1610605568,~1610605568] --> OK [~0.1610605696E10,TO_POSINF] --> [~1610605696,~1610605696] --> OK [~0.1610605824E10,TO_POSINF] --> [~1610605824,~1610605824] --> OK [~0.1610605952E10,TO_POSINF] --> [~1610605952,~1610605952] --> OK [~0.161060608E10,TO_POSINF] --> [~1610606080,~1610606080] --> OK [~0.1610606208E10,TO_POSINF] --> [~1610606208,~1610606208] --> OK [~0.1610606336E10,TO_POSINF] --> [~1610606336,~1610606336] --> OK [~0.1610606464E10,TO_POSINF] --> [~1610606464,~1610606464] --> OK [~0.1610606592E10,TO_POSINF] --> [~1610606592,~1610606592] --> OK [~0.161060672E10,TO_POSINF] --> [~1610606720,~1610606720] --> OK [~0.1610606848E10,TO_POSINF] --> [~1610606848,~1610606848] --> OK [~0.1610606976E10,TO_POSINF] --> [~1610606976,~1610606976] --> OK [~0.1610607104E10,TO_POSINF] --> [~1610607104,~1610607104] --> OK [~0.1610607232E10,TO_POSINF] --> [~1610607232,~1610607232] --> OK [~0.161060736E10,TO_POSINF] --> [~1610607360,~1610607360] --> OK [~0.1610607488E10,TO_POSINF] --> [~1610607488,~1610607488] --> OK [~0.1610607616E10,TO_POSINF] --> [~1610607616,~1610607616] --> OK [~0.1610607744E10,TO_POSINF] --> [~1610607744,~1610607744] --> OK [~0.1610607872E10,TO_POSINF] --> [~1610607872,~1610607872] --> OK [~0.1610608E10,TO_POSINF] --> [~1610608000,~1610608000] --> OK [~0.1610608128E10,TO_POSINF] --> [~1610608128,~1610608128] --> OK [~0.1610608256E10,TO_POSINF] --> [~1610608256,~1610608256] --> OK [~0.1610608384E10,TO_POSINF] --> [~1610608384,~1610608384] --> OK [~0.1610608512E10,TO_POSINF] --> [~1610608512,~1610608512] --> OK [~0.161060864E10,TO_POSINF] --> [~1610608640,~1610608640] --> OK [~0.1610608768E10,TO_POSINF] --> [~1610608768,~1610608768] --> OK [~0.1610608896E10,TO_POSINF] --> [~1610608896,~1610608896] --> OK [~0.1610609024E10,TO_POSINF] --> [~1610609024,~1610609024] --> OK [~0.1610609152E10,TO_POSINF] --> [~1610609152,~1610609152] --> OK [~0.161060928E10,TO_POSINF] --> [~1610609280,~1610609280] --> OK [~0.1610609408E10,TO_POSINF] --> [~1610609408,~1610609408] --> OK [~0.1610609536E10,TO_POSINF] --> [~1610609536,~1610609536] --> OK [~0.1610609664E10,TO_POSINF] --> [~1610609664,~1610609664] --> OK [~0.1610609792E10,TO_POSINF] --> [~1610609792,~1610609792] --> OK [~0.161060992E10,TO_POSINF] --> [~1610609920,~1610609920] --> OK [~0.1610610048E10,TO_POSINF] --> [~1610610048,~1610610048] --> OK [~0.1610610176E10,TO_POSINF] --> [~1610610176,~1610610176] --> OK [~0.1610610304E10,TO_POSINF] --> [~1610610304,~1610610304] --> OK [~0.1610610432E10,TO_POSINF] --> [~1610610432,~1610610432] --> OK [~0.161061056E10,TO_POSINF] --> [~1610610560,~1610610560] --> OK [~0.1610610688E10,TO_POSINF] --> [~1610610688,~1610610688] --> OK [~0.1610610816E10,TO_POSINF] --> [~1610610816,~1610610816] --> OK [~0.1610610944E10,TO_POSINF] --> [~1610610944,~1610610944] --> OK [~0.1610611072E10,TO_POSINF] --> [~1610611072,~1610611072] --> OK [~0.16106112E10,TO_POSINF] --> [~1610611200,~1610611200] --> OK [~0.1610611328E10,TO_POSINF] --> [~1610611328,~1610611328] --> OK [~0.1610611456E10,TO_POSINF] --> [~1610611456,~1610611456] --> OK [~0.1610611584E10,TO_POSINF] --> [~1610611584,~1610611584] --> OK [~0.1610611712E10,TO_POSINF] --> [~1610611712,~1610611712] --> OK [~0.161061184E10,TO_POSINF] --> [~1610611840,~1610611840] --> OK [~0.1610611968E10,TO_POSINF] --> [~1610611968,~1610611968] --> OK [~0.1610612096E10,TO_POSINF] --> [~1610612096,~1610612096] --> OK [~0.1610612224E10,TO_POSINF] --> [~1610612224,~1610612224] --> OK [~0.1610612352E10,TO_POSINF] --> [~1610612352,~1610612352] --> OK [~0.161061248E10,TO_POSINF] --> [~1610612480,~1610612480] --> OK [~0.1610612608E10,TO_POSINF] --> [~1610612608,~1610612608] --> OK [~0.1073750016E10,TO_POSINF] --> [~1073750016,~1073750016] --> OK [~0.1073749888E10,TO_POSINF] --> [~1073749888,~1073749888] --> OK [~0.107374976E10,TO_POSINF] --> [~1073749760,~1073749760] --> OK [~0.1073749632E10,TO_POSINF] --> [~1073749632,~1073749632] --> OK [~0.1073749504E10,TO_POSINF] --> [~1073749504,~1073749504] --> OK [~0.1073749376E10,TO_POSINF] --> [~1073749376,~1073749376] --> OK [~0.1073749248E10,TO_POSINF] --> [~1073749248,~1073749248] --> OK [~0.107374912E10,TO_POSINF] --> [~1073749120,~1073749120] --> OK [~0.1073748992E10,TO_POSINF] --> [~1073748992,~1073748992] --> OK [~0.1073748864E10,TO_POSINF] --> [~1073748864,~1073748864] --> OK [~0.1073748736E10,TO_POSINF] --> [~1073748736,~1073748736] --> OK [~0.1073748608E10,TO_POSINF] --> [~1073748608,~1073748608] --> OK [~0.107374848E10,TO_POSINF] --> [~1073748480,~1073748480] --> OK [~0.1073748352E10,TO_POSINF] --> [~1073748352,~1073748352] --> OK [~0.1073748224E10,TO_POSINF] --> [~1073748224,~1073748224] --> OK [~0.1073748096E10,TO_POSINF] --> [~1073748096,~1073748096] --> OK [~0.1073747968E10,TO_POSINF] --> [~1073747968,~1073747968] --> OK [~0.107374784E10,TO_POSINF] --> [~1073747840,~1073747840] --> OK [~0.1073747712E10,TO_POSINF] --> [~1073747712,~1073747712] --> OK [~0.1073747584E10,TO_POSINF] --> [~1073747584,~1073747584] --> OK [~0.1073747456E10,TO_POSINF] --> [~1073747456,~1073747456] --> OK [~0.1073747328E10,TO_POSINF] --> [~1073747328,~1073747328] --> OK [~0.10737472E10,TO_POSINF] --> [~1073747200,~1073747200] --> OK [~0.1073747072E10,TO_POSINF] --> [~1073747072,~1073747072] --> OK [~0.1073746944E10,TO_POSINF] --> [~1073746944,~1073746944] --> OK [~0.1073746816E10,TO_POSINF] --> [~1073746816,~1073746816] --> OK [~0.1073746688E10,TO_POSINF] --> [~1073746688,~1073746688] --> OK [~0.107374656E10,TO_POSINF] --> [~1073746560,~1073746560] --> OK [~0.1073746432E10,TO_POSINF] --> [~1073746432,~1073746432] --> OK [~0.1073746304E10,TO_POSINF] --> [~1073746304,~1073746304] --> OK [~0.1073746176E10,TO_POSINF] --> [~1073746176,~1073746176] --> OK [~0.1073746048E10,TO_POSINF] --> [~1073746048,~1073746048] --> OK [~0.107374592E10,TO_POSINF] --> [~1073745920,~1073745920] --> OK [~0.1073745792E10,TO_POSINF] --> [~1073745792,~1073745792] --> OK [~0.1073745664E10,TO_POSINF] --> [~1073745664,~1073745664] --> OK [~0.1073745536E10,TO_POSINF] --> [~1073745536,~1073745536] --> OK [~0.1073745408E10,TO_POSINF] --> [~1073745408,~1073745408] --> OK [~0.107374528E10,TO_POSINF] --> [~1073745280,~1073745280] --> OK [~0.1073745152E10,TO_POSINF] --> [~1073745152,~1073745152] --> OK [~0.1073745024E10,TO_POSINF] --> [~1073745024,~1073745024] --> OK [~0.1073744896E10,TO_POSINF] --> [~1073744896,~1073744896] --> OK [~0.1073744768E10,TO_POSINF] --> [~1073744768,~1073744768] --> OK [~0.107374464E10,TO_POSINF] --> [~1073744640,~1073744640] --> OK [~0.1073744512E10,TO_POSINF] --> [~1073744512,~1073744512] --> OK [~0.1073744384E10,TO_POSINF] --> [~1073744384,~1073744384] --> OK [~0.1073744256E10,TO_POSINF] --> [~1073744256,~1073744256] --> OK [~0.1073744128E10,TO_POSINF] --> [~1073744128,~1073744128] --> OK [~0.1073744E10,TO_POSINF] --> [~1073744000,~1073744000] --> OK [~0.1073743872E10,TO_POSINF] --> [~1073743872,~1073743872] --> OK [~0.1073743744E10,TO_POSINF] --> [~1073743744,~1073743744] --> OK [~0.1073743616E10,TO_POSINF] --> [~1073743616,~1073743616] --> OK [~0.1073743488E10,TO_POSINF] --> [~1073743488,~1073743488] --> OK [~0.107374336E10,TO_POSINF] --> [~1073743360,~1073743360] --> OK [~0.1073743232E10,TO_POSINF] --> [~1073743232,~1073743232] --> OK [~0.1073743104E10,TO_POSINF] --> [~1073743104,~1073743104] --> OK [~0.1073742976E10,TO_POSINF] --> [~1073742976,~1073742976] --> OK [~0.1073742848E10,TO_POSINF] --> [~1073742848,~1073742848] --> OK [~0.107374272E10,TO_POSINF] --> [~1073742720,~1073742720] --> OK [~0.1073742592E10,TO_POSINF] --> [~1073742592,~1073742592] --> OK [~0.1073742464E10,TO_POSINF] --> [~1073742464,~1073742464] --> OK [~0.1073742336E10,TO_POSINF] --> [~1073742336,~1073742336] --> OK [~0.1073742208E10,TO_POSINF] --> [~1073742208,~1073742208] --> OK [~0.107374208E10,TO_POSINF] --> [~1073742080,~1073742080] --> OK [~0.1073741952E10,TO_POSINF] --> [~1073741952,~1073741952] --> OK [~0.1073741824E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073737728E10,TO_POSINF] --> [~1073737728,~1073737728] --> OK [~0.1073737792E10,TO_POSINF] --> [~1073737792,~1073737792] --> OK [~0.1073737856E10,TO_POSINF] --> [~1073737856,~1073737856] --> OK [~0.107373792E10,TO_POSINF] --> [~1073737920,~1073737920] --> OK [~0.1073737984E10,TO_POSINF] --> [~1073737984,~1073737984] --> OK [~0.1073738048E10,TO_POSINF] --> [~1073738048,~1073738048] --> OK [~0.1073738112E10,TO_POSINF] --> [~1073738112,~1073738112] --> OK [~0.1073738176E10,TO_POSINF] --> [~1073738176,~1073738176] --> OK [~0.107373824E10,TO_POSINF] --> [~1073738240,~1073738240] --> OK [~0.1073738304E10,TO_POSINF] --> [~1073738304,~1073738304] --> OK [~0.1073738368E10,TO_POSINF] --> [~1073738368,~1073738368] --> OK [~0.1073738432E10,TO_POSINF] --> [~1073738432,~1073738432] --> OK [~0.1073738496E10,TO_POSINF] --> [~1073738496,~1073738496] --> OK [~0.107373856E10,TO_POSINF] --> [~1073738560,~1073738560] --> OK [~0.1073738624E10,TO_POSINF] --> [~1073738624,~1073738624] --> OK [~0.1073738688E10,TO_POSINF] --> [~1073738688,~1073738688] --> OK [~0.1073738752E10,TO_POSINF] --> [~1073738752,~1073738752] --> OK [~0.1073738816E10,TO_POSINF] --> [~1073738816,~1073738816] --> OK [~0.107373888E10,TO_POSINF] --> [~1073738880,~1073738880] --> OK [~0.1073738944E10,TO_POSINF] --> [~1073738944,~1073738944] --> OK [~0.1073739008E10,TO_POSINF] --> [~1073739008,~1073739008] --> OK [~0.1073739072E10,TO_POSINF] --> [~1073739072,~1073739072] --> OK [~0.1073739136E10,TO_POSINF] --> [~1073739136,~1073739136] --> OK [~0.10737392E10,TO_POSINF] --> [~1073739200,~1073739200] --> OK [~0.1073739264E10,TO_POSINF] --> [~1073739264,~1073739264] --> OK [~0.1073739328E10,TO_POSINF] --> [~1073739328,~1073739328] --> OK [~0.1073739392E10,TO_POSINF] --> [~1073739392,~1073739392] --> OK [~0.1073739456E10,TO_POSINF] --> [~1073739456,~1073739456] --> OK [~0.107373952E10,TO_POSINF] --> [~1073739520,~1073739520] --> OK [~0.1073739584E10,TO_POSINF] --> [~1073739584,~1073739584] --> OK [~0.1073739648E10,TO_POSINF] --> [~1073739648,~1073739648] --> OK [~0.1073739712E10,TO_POSINF] --> [~1073739712,~1073739712] --> OK [~0.1073739776E10,TO_POSINF] --> [~1073739776,~1073739776] --> OK [~0.107373984E10,TO_POSINF] --> [~1073739840,~1073739840] --> OK [~0.1073739904E10,TO_POSINF] --> [~1073739904,~1073739904] --> OK [~0.1073739968E10,TO_POSINF] --> [~1073739968,~1073739968] --> OK [~0.1073740032E10,TO_POSINF] --> [~1073740032,~1073740032] --> OK [~0.1073740096E10,TO_POSINF] --> [~1073740096,~1073740096] --> OK [~0.107374016E10,TO_POSINF] --> [~1073740160,~1073740160] --> OK [~0.1073740224E10,TO_POSINF] --> [~1073740224,~1073740224] --> OK [~0.1073740288E10,TO_POSINF] --> [~1073740288,~1073740288] --> OK [~0.1073740352E10,TO_POSINF] --> [~1073740352,~1073740352] --> OK [~0.1073740416E10,TO_POSINF] --> [~1073740416,~1073740416] --> OK [~0.107374048E10,TO_POSINF] --> [~1073740480,~1073740480] --> OK [~0.1073740544E10,TO_POSINF] --> [~1073740544,~1073740544] --> OK [~0.1073740608E10,TO_POSINF] --> [~1073740608,~1073740608] --> OK [~0.1073740672E10,TO_POSINF] --> [~1073740672,~1073740672] --> OK [~0.1073740736E10,TO_POSINF] --> [~1073740736,~1073740736] --> OK [~0.10737408E10,TO_POSINF] --> [~1073740800,~1073740800] --> OK [~0.1073740864E10,TO_POSINF] --> [~1073740864,~1073740864] --> OK [~0.1073740928E10,TO_POSINF] --> [~1073740928,~1073740928] --> OK [~0.1073740992E10,TO_POSINF] --> [~1073740992,~1073740992] --> OK [~0.1073741056E10,TO_POSINF] --> [~1073741056,~1073741056] --> OK [~0.107374112E10,TO_POSINF] --> [~1073741120,~1073741120] --> OK [~0.1073741184E10,TO_POSINF] --> [~1073741184,~1073741184] --> OK [~0.1073741248E10,TO_POSINF] --> [~1073741248,~1073741248] --> OK [~0.1073741312E10,TO_POSINF] --> [~1073741312,~1073741312] --> OK [~0.1073741376E10,TO_POSINF] --> [~1073741376,~1073741376] --> OK [~0.107374144E10,TO_POSINF] --> [~1073741440,~1073741440] --> OK [~0.1073741504E10,TO_POSINF] --> [~1073741504,~1073741504] --> OK [~0.1073741568E10,TO_POSINF] --> [~1073741568,~1073741568] --> OK [~0.1073741632E10,TO_POSINF] --> [~1073741632,~1073741632] --> OK [~0.1073741696E10,TO_POSINF] --> [~1073741696,~1073741696] --> OK [~0.107374176E10,TO_POSINF] --> [~1073741760,~1073741760] --> OK [~0.30000153E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000015E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000148E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000145E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000143E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000014E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000138E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000136E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000134E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000013E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000129E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000126E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000124E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000122E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000012E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000117E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000114E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000112E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000011E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000107E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000105E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000103E1,TO_POSINF] --> [~3,~3] --> OK [~0.300001E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000098E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000095E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000093E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000009E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000088E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000086E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000083E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000008E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000079E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000076E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000074E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000072E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000007E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000067E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000064E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000062E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000006E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000057E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000055E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000052E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000005E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000048E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000045E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000043E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000004E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000038E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000036E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000033E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000003E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000029E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000026E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000024E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000021E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000002E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000017E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000014E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000012E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000001E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000007E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000005E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000002E1,TO_POSINF] --> [~3,~3] --> OK [~0.3E1,TO_POSINF] --> [~3,~3] --> OK [~0.29999847E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999985E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999852E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999855E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999857E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999986E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999862E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999864E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999866E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999987E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999871E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999874E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999876E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999878E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999988E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999883E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999886E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999888E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999989E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999893E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999895E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999897E1,TO_POSINF] --> [~2,~2] --> OK [~0.299999E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999902E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999905E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999907E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999991E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999912E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999914E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999917E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999992E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999921E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999924E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999926E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999928E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999993E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999933E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999936E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999938E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999994E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999943E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999945E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999948E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999995E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999952E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999955E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999957E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999996E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999962E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999964E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999967E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999997E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999971E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999974E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999976E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999979E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999998E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999983E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999986E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999988E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999993E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999995E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999998E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000153E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000015E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000148E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000145E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000143E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000014E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000138E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000136E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000134E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000013E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000129E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000126E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000124E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000122E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000012E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000117E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000114E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000112E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000011E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000107E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000105E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000103E1,TO_POSINF] --> [~2,~2] --> OK [~0.200001E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000098E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000095E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000093E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000009E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000088E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000086E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000083E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000008E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000079E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000076E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000074E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000072E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000007E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000067E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000064E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000062E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000006E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000057E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000055E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000052E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000005E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000048E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000045E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000043E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000004E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000038E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000036E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000033E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000003E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000029E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000026E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000024E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000021E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000002E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000017E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000014E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000012E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000001E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000007E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000005E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000002E1,TO_POSINF] --> [~2,~2] --> OK [~0.2E1,TO_POSINF] --> [~2,~2] --> OK [~0.19999924E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999925E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999926E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999927E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999928E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999993E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999931E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999932E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999933E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999934E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999936E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999937E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999938E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999939E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999994E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999942E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999943E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999944E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999945E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999946E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999948E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999949E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999995E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999951E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999952E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999954E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999955E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999956E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999957E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999958E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999996E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999961E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999962E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999963E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999964E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999965E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999967E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999968E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999969E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999997E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999971E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999973E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999974E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999975E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999976E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999977E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999979E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999998E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999981E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999982E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999983E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999985E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999986E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999987E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999988E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999989E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999992E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999993E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999994E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999995E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999996E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999998E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000076E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000075E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000074E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000073E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000072E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000007E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000069E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000068E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000067E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000066E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000064E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000063E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000062E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000061E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000006E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000058E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000057E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000056E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000055E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000054E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000052E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000051E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000005E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000049E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000048E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000046E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000045E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000044E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000043E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000042E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000004E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000039E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000038E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000037E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000036E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000035E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000033E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000032E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000031E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000003E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000029E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000027E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000026E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000025E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000024E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000023E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000021E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000002E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000019E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000018E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000017E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000015E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000014E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000013E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000012E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000011E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000001E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000008E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000007E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000006E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000005E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000004E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000002E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000001E1,TO_POSINF] --> [~1,~1] --> OK [~0.1E1,TO_POSINF] --> [~1,~1] --> OK [~0.9999962,TO_POSINF] --> [0,0] --> OK [~0.99999624,TO_POSINF] --> [0,0] --> OK [~0.9999963,TO_POSINF] --> [0,0] --> OK [~0.99999636,TO_POSINF] --> [0,0] --> OK [~0.9999964,TO_POSINF] --> [0,0] --> OK [~0.9999965,TO_POSINF] --> [0,0] --> OK [~0.99999654,TO_POSINF] --> [0,0] --> OK [~0.9999966,TO_POSINF] --> [0,0] --> OK [~0.99999666,TO_POSINF] --> [0,0] --> OK [~0.9999967,TO_POSINF] --> [0,0] --> OK [~0.9999968,TO_POSINF] --> [0,0] --> OK [~0.99999684,TO_POSINF] --> [0,0] --> OK [~0.9999969,TO_POSINF] --> [0,0] --> OK [~0.99999696,TO_POSINF] --> [0,0] --> OK [~0.999997,TO_POSINF] --> [0,0] --> OK [~0.9999971,TO_POSINF] --> [0,0] --> OK [~0.99999714,TO_POSINF] --> [0,0] --> OK [~0.9999972,TO_POSINF] --> [0,0] --> OK [~0.99999726,TO_POSINF] --> [0,0] --> OK [~0.9999973,TO_POSINF] --> [0,0] --> OK [~0.9999974,TO_POSINF] --> [0,0] --> OK [~0.99999744,TO_POSINF] --> [0,0] --> OK [~0.9999975,TO_POSINF] --> [0,0] --> OK [~0.99999756,TO_POSINF] --> [0,0] --> OK [~0.9999976,TO_POSINF] --> [0,0] --> OK [~0.9999977,TO_POSINF] --> [0,0] --> OK [~0.99999774,TO_POSINF] --> [0,0] --> OK [~0.9999978,TO_POSINF] --> [0,0] --> OK [~0.99999785,TO_POSINF] --> [0,0] --> OK [~0.9999979,TO_POSINF] --> [0,0] --> OK [~0.999998,TO_POSINF] --> [0,0] --> OK [~0.99999803,TO_POSINF] --> [0,0] --> OK [~0.9999981,TO_POSINF] --> [0,0] --> OK [~0.99999815,TO_POSINF] --> [0,0] --> OK [~0.9999982,TO_POSINF] --> [0,0] --> OK [~0.9999983,TO_POSINF] --> [0,0] --> OK [~0.99999833,TO_POSINF] --> [0,0] --> OK [~0.9999984,TO_POSINF] --> [0,0] --> OK [~0.99999845,TO_POSINF] --> [0,0] --> OK [~0.9999985,TO_POSINF] --> [0,0] --> OK [~0.99999857,TO_POSINF] --> [0,0] --> OK [~0.9999986,TO_POSINF] --> [0,0] --> OK [~0.9999987,TO_POSINF] --> [0,0] --> OK [~0.99999875,TO_POSINF] --> [0,0] --> OK [~0.9999988,TO_POSINF] --> [0,0] --> OK [~0.99999887,TO_POSINF] --> [0,0] --> OK [~0.9999989,TO_POSINF] --> [0,0] --> OK [~0.999999,TO_POSINF] --> [0,0] --> OK [~0.99999905,TO_POSINF] --> [0,0] --> OK [~0.9999991,TO_POSINF] --> [0,0] --> OK [~0.99999917,TO_POSINF] --> [0,0] --> OK [~0.9999992,TO_POSINF] --> [0,0] --> OK [~0.9999993,TO_POSINF] --> [0,0] --> OK [~0.99999934,TO_POSINF] --> [0,0] --> OK [~0.9999994,TO_POSINF] --> [0,0] --> OK [~0.99999946,TO_POSINF] --> [0,0] --> OK [~0.9999995,TO_POSINF] --> [0,0] --> OK [~0.9999996,TO_POSINF] --> [0,0] --> OK [~0.99999964,TO_POSINF] --> [0,0] --> OK [~0.9999997,TO_POSINF] --> [0,0] --> OK [~0.99999976,TO_POSINF] --> [0,0] --> OK [~0.9999998,TO_POSINF] --> [0,0] --> OK [~0.9999999,TO_POSINF] --> [0,0] --> OK [~0.99999994,TO_POSINF] --> [0,0] --> OK [~0.9E~43,TO_POSINF] --> [0,0] --> OK [~0.88E~43,TO_POSINF] --> [0,0] --> OK [~0.87E~43,TO_POSINF] --> [0,0] --> OK [~0.85E~43,TO_POSINF] --> [0,0] --> OK [~0.84E~43,TO_POSINF] --> [0,0] --> OK [~0.83E~43,TO_POSINF] --> [0,0] --> OK [~0.81E~43,TO_POSINF] --> [0,0] --> OK [~0.8E~43,TO_POSINF] --> [0,0] --> OK [~0.78E~43,TO_POSINF] --> [0,0] --> OK [~0.77E~43,TO_POSINF] --> [0,0] --> OK [~0.76E~43,TO_POSINF] --> [0,0] --> OK [~0.74E~43,TO_POSINF] --> [0,0] --> OK [~0.73E~43,TO_POSINF] --> [0,0] --> OK [~0.71E~43,TO_POSINF] --> [0,0] --> OK [~0.7E~43,TO_POSINF] --> [0,0] --> OK [~0.69E~43,TO_POSINF] --> [0,0] --> OK [~0.67E~43,TO_POSINF] --> [0,0] --> OK [~0.66E~43,TO_POSINF] --> [0,0] --> OK [~0.64E~43,TO_POSINF] --> [0,0] --> OK [~0.63E~43,TO_POSINF] --> [0,0] --> OK [~0.62E~43,TO_POSINF] --> [0,0] --> OK [~0.6E~43,TO_POSINF] --> [0,0] --> OK [~0.59E~43,TO_POSINF] --> [0,0] --> OK [~0.57E~43,TO_POSINF] --> [0,0] --> OK [~0.56E~43,TO_POSINF] --> [0,0] --> OK [~0.55E~43,TO_POSINF] --> [0,0] --> OK [~0.53E~43,TO_POSINF] --> [0,0] --> OK [~0.52E~43,TO_POSINF] --> [0,0] --> OK [~0.5E~43,TO_POSINF] --> [0,0] --> OK [~0.49E~43,TO_POSINF] --> [0,0] --> OK [~0.48E~43,TO_POSINF] --> [0,0] --> OK [~0.46E~43,TO_POSINF] --> [0,0] --> OK [~0.45E~43,TO_POSINF] --> [0,0] --> OK [~0.43E~43,TO_POSINF] --> [0,0] --> OK [~0.42E~43,TO_POSINF] --> [0,0] --> OK [~0.4E~43,TO_POSINF] --> [0,0] --> OK [~0.39E~43,TO_POSINF] --> [0,0] --> OK [~0.38E~43,TO_POSINF] --> [0,0] --> OK [~0.36E~43,TO_POSINF] --> [0,0] --> OK [~0.35E~43,TO_POSINF] --> [0,0] --> OK [~0.34E~43,TO_POSINF] --> [0,0] --> OK [~0.32E~43,TO_POSINF] --> [0,0] --> OK [~0.31E~43,TO_POSINF] --> [0,0] --> OK [~0.3E~43,TO_POSINF] --> [0,0] --> OK [~0.28E~43,TO_POSINF] --> [0,0] --> OK [~0.27E~43,TO_POSINF] --> [0,0] --> OK [~0.25E~43,TO_POSINF] --> [0,0] --> OK [~0.24E~43,TO_POSINF] --> [0,0] --> OK [~0.22E~43,TO_POSINF] --> [0,0] --> OK [~0.21E~43,TO_POSINF] --> [0,0] --> OK [~0.2E~43,TO_POSINF] --> [0,0] --> OK [~0.18E~43,TO_POSINF] --> [0,0] --> OK [~0.17E~43,TO_POSINF] --> [0,0] --> OK [~0.15E~43,TO_POSINF] --> [0,0] --> OK [~0.14E~43,TO_POSINF] --> [0,0] --> OK [~0.13E~43,TO_POSINF] --> [0,0] --> OK [~0.11E~43,TO_POSINF] --> [0,0] --> OK [~0.1E~43,TO_POSINF] --> [0,0] --> OK [~0.8E~44,TO_POSINF] --> [0,0] --> OK [~0.7E~44,TO_POSINF] --> [0,0] --> OK [~0.6E~44,TO_POSINF] --> [0,0] --> OK [~0.4E~44,TO_POSINF] --> [0,0] --> OK [~0.3E~44,TO_POSINF] --> [0,0] --> OK [~0.1E~44,TO_POSINF] --> [0,0] --> OK [0.0,TO_POSINF] --> [0,0] --> OK [0.9E~43,TO_POSINF] --> [1,1] --> OK [0.88E~43,TO_POSINF] --> [1,1] --> OK [0.87E~43,TO_POSINF] --> [1,1] --> OK [0.85E~43,TO_POSINF] --> [1,1] --> OK [0.84E~43,TO_POSINF] --> [1,1] --> OK [0.83E~43,TO_POSINF] --> [1,1] --> OK [0.81E~43,TO_POSINF] --> [1,1] --> OK [0.8E~43,TO_POSINF] --> [1,1] --> OK [0.78E~43,TO_POSINF] --> [1,1] --> OK [0.77E~43,TO_POSINF] --> [1,1] --> OK [0.76E~43,TO_POSINF] --> [1,1] --> OK [0.74E~43,TO_POSINF] --> [1,1] --> OK [0.73E~43,TO_POSINF] --> [1,1] --> OK [0.71E~43,TO_POSINF] --> [1,1] --> OK [0.7E~43,TO_POSINF] --> [1,1] --> OK [0.69E~43,TO_POSINF] --> [1,1] --> OK [0.67E~43,TO_POSINF] --> [1,1] --> OK [0.66E~43,TO_POSINF] --> [1,1] --> OK [0.64E~43,TO_POSINF] --> [1,1] --> OK [0.63E~43,TO_POSINF] --> [1,1] --> OK [0.62E~43,TO_POSINF] --> [1,1] --> OK [0.6E~43,TO_POSINF] --> [1,1] --> OK [0.59E~43,TO_POSINF] --> [1,1] --> OK [0.57E~43,TO_POSINF] --> [1,1] --> OK [0.56E~43,TO_POSINF] --> [1,1] --> OK [0.55E~43,TO_POSINF] --> [1,1] --> OK [0.53E~43,TO_POSINF] --> [1,1] --> OK [0.52E~43,TO_POSINF] --> [1,1] --> OK [0.5E~43,TO_POSINF] --> [1,1] --> OK [0.49E~43,TO_POSINF] --> [1,1] --> OK [0.48E~43,TO_POSINF] --> [1,1] --> OK [0.46E~43,TO_POSINF] --> [1,1] --> OK [0.45E~43,TO_POSINF] --> [1,1] --> OK [0.43E~43,TO_POSINF] --> [1,1] --> OK [0.42E~43,TO_POSINF] --> [1,1] --> OK [0.4E~43,TO_POSINF] --> [1,1] --> OK [0.39E~43,TO_POSINF] --> [1,1] --> OK [0.38E~43,TO_POSINF] --> [1,1] --> OK [0.36E~43,TO_POSINF] --> [1,1] --> OK [0.35E~43,TO_POSINF] --> [1,1] --> OK [0.34E~43,TO_POSINF] --> [1,1] --> OK [0.32E~43,TO_POSINF] --> [1,1] --> OK [0.31E~43,TO_POSINF] --> [1,1] --> OK [0.3E~43,TO_POSINF] --> [1,1] --> OK [0.28E~43,TO_POSINF] --> [1,1] --> OK [0.27E~43,TO_POSINF] --> [1,1] --> OK [0.25E~43,TO_POSINF] --> [1,1] --> OK [0.24E~43,TO_POSINF] --> [1,1] --> OK [0.22E~43,TO_POSINF] --> [1,1] --> OK [0.21E~43,TO_POSINF] --> [1,1] --> OK [0.2E~43,TO_POSINF] --> [1,1] --> OK [0.18E~43,TO_POSINF] --> [1,1] --> OK [0.17E~43,TO_POSINF] --> [1,1] --> OK [0.15E~43,TO_POSINF] --> [1,1] --> OK [0.14E~43,TO_POSINF] --> [1,1] --> OK [0.13E~43,TO_POSINF] --> [1,1] --> OK [0.11E~43,TO_POSINF] --> [1,1] --> OK [0.1E~43,TO_POSINF] --> [1,1] --> OK [0.8E~44,TO_POSINF] --> [1,1] --> OK [0.7E~44,TO_POSINF] --> [1,1] --> OK [0.6E~44,TO_POSINF] --> [1,1] --> OK [0.4E~44,TO_POSINF] --> [1,1] --> OK [0.3E~44,TO_POSINF] --> [1,1] --> OK [0.1E~44,TO_POSINF] --> [1,1] --> OK [0.9999962,TO_POSINF] --> [1,1] --> OK [0.99999624,TO_POSINF] --> [1,1] --> OK [0.9999963,TO_POSINF] --> [1,1] --> OK [0.99999636,TO_POSINF] --> [1,1] --> OK [0.9999964,TO_POSINF] --> [1,1] --> OK [0.9999965,TO_POSINF] --> [1,1] --> OK [0.99999654,TO_POSINF] --> [1,1] --> OK [0.9999966,TO_POSINF] --> [1,1] --> OK [0.99999666,TO_POSINF] --> [1,1] --> OK [0.9999967,TO_POSINF] --> [1,1] --> OK [0.9999968,TO_POSINF] --> [1,1] --> OK [0.99999684,TO_POSINF] --> [1,1] --> OK [0.9999969,TO_POSINF] --> [1,1] --> OK [0.99999696,TO_POSINF] --> [1,1] --> OK [0.999997,TO_POSINF] --> [1,1] --> OK [0.9999971,TO_POSINF] --> [1,1] --> OK [0.99999714,TO_POSINF] --> [1,1] --> OK [0.9999972,TO_POSINF] --> [1,1] --> OK [0.99999726,TO_POSINF] --> [1,1] --> OK [0.9999973,TO_POSINF] --> [1,1] --> OK [0.9999974,TO_POSINF] --> [1,1] --> OK [0.99999744,TO_POSINF] --> [1,1] --> OK [0.9999975,TO_POSINF] --> [1,1] --> OK [0.99999756,TO_POSINF] --> [1,1] --> OK [0.9999976,TO_POSINF] --> [1,1] --> OK [0.9999977,TO_POSINF] --> [1,1] --> OK [0.99999774,TO_POSINF] --> [1,1] --> OK [0.9999978,TO_POSINF] --> [1,1] --> OK [0.99999785,TO_POSINF] --> [1,1] --> OK [0.9999979,TO_POSINF] --> [1,1] --> OK [0.999998,TO_POSINF] --> [1,1] --> OK [0.99999803,TO_POSINF] --> [1,1] --> OK [0.9999981,TO_POSINF] --> [1,1] --> OK [0.99999815,TO_POSINF] --> [1,1] --> OK [0.9999982,TO_POSINF] --> [1,1] --> OK [0.9999983,TO_POSINF] --> [1,1] --> OK [0.99999833,TO_POSINF] --> [1,1] --> OK [0.9999984,TO_POSINF] --> [1,1] --> OK [0.99999845,TO_POSINF] --> [1,1] --> OK [0.9999985,TO_POSINF] --> [1,1] --> OK [0.99999857,TO_POSINF] --> [1,1] --> OK [0.9999986,TO_POSINF] --> [1,1] --> OK [0.9999987,TO_POSINF] --> [1,1] --> OK [0.99999875,TO_POSINF] --> [1,1] --> OK [0.9999988,TO_POSINF] --> [1,1] --> OK [0.99999887,TO_POSINF] --> [1,1] --> OK [0.9999989,TO_POSINF] --> [1,1] --> OK [0.999999,TO_POSINF] --> [1,1] --> OK [0.99999905,TO_POSINF] --> [1,1] --> OK [0.9999991,TO_POSINF] --> [1,1] --> OK [0.99999917,TO_POSINF] --> [1,1] --> OK [0.9999992,TO_POSINF] --> [1,1] --> OK [0.9999993,TO_POSINF] --> [1,1] --> OK [0.99999934,TO_POSINF] --> [1,1] --> OK [0.9999994,TO_POSINF] --> [1,1] --> OK [0.99999946,TO_POSINF] --> [1,1] --> OK [0.9999995,TO_POSINF] --> [1,1] --> OK [0.9999996,TO_POSINF] --> [1,1] --> OK [0.99999964,TO_POSINF] --> [1,1] --> OK [0.9999997,TO_POSINF] --> [1,1] --> OK [0.99999976,TO_POSINF] --> [1,1] --> OK [0.9999998,TO_POSINF] --> [1,1] --> OK [0.9999999,TO_POSINF] --> [1,1] --> OK [0.99999994,TO_POSINF] --> [1,1] --> OK [0.1E1,TO_POSINF] --> [1,1] --> OK [0.10000076E1,TO_POSINF] --> [2,2] --> OK [0.10000075E1,TO_POSINF] --> [2,2] --> OK [0.10000074E1,TO_POSINF] --> [2,2] --> OK [0.10000073E1,TO_POSINF] --> [2,2] --> OK [0.10000072E1,TO_POSINF] --> [2,2] --> OK [0.1000007E1,TO_POSINF] --> [2,2] --> OK [0.10000069E1,TO_POSINF] --> [2,2] --> OK [0.10000068E1,TO_POSINF] --> [2,2] --> OK [0.10000067E1,TO_POSINF] --> [2,2] --> OK [0.10000066E1,TO_POSINF] --> [2,2] --> OK [0.10000064E1,TO_POSINF] --> [2,2] --> OK [0.10000063E1,TO_POSINF] --> [2,2] --> OK [0.10000062E1,TO_POSINF] --> [2,2] --> OK [0.10000061E1,TO_POSINF] --> [2,2] --> OK [0.1000006E1,TO_POSINF] --> [2,2] --> OK [0.10000058E1,TO_POSINF] --> [2,2] --> OK [0.10000057E1,TO_POSINF] --> [2,2] --> OK [0.10000056E1,TO_POSINF] --> [2,2] --> OK [0.10000055E1,TO_POSINF] --> [2,2] --> OK [0.10000054E1,TO_POSINF] --> [2,2] --> OK [0.10000052E1,TO_POSINF] --> [2,2] --> OK [0.10000051E1,TO_POSINF] --> [2,2] --> OK [0.1000005E1,TO_POSINF] --> [2,2] --> OK [0.10000049E1,TO_POSINF] --> [2,2] --> OK [0.10000048E1,TO_POSINF] --> [2,2] --> OK [0.10000046E1,TO_POSINF] --> [2,2] --> OK [0.10000045E1,TO_POSINF] --> [2,2] --> OK [0.10000044E1,TO_POSINF] --> [2,2] --> OK [0.10000043E1,TO_POSINF] --> [2,2] --> OK [0.10000042E1,TO_POSINF] --> [2,2] --> OK [0.1000004E1,TO_POSINF] --> [2,2] --> OK [0.10000039E1,TO_POSINF] --> [2,2] --> OK [0.10000038E1,TO_POSINF] --> [2,2] --> OK [0.10000037E1,TO_POSINF] --> [2,2] --> OK [0.10000036E1,TO_POSINF] --> [2,2] --> OK [0.10000035E1,TO_POSINF] --> [2,2] --> OK [0.10000033E1,TO_POSINF] --> [2,2] --> OK [0.10000032E1,TO_POSINF] --> [2,2] --> OK [0.10000031E1,TO_POSINF] --> [2,2] --> OK [0.1000003E1,TO_POSINF] --> [2,2] --> OK [0.10000029E1,TO_POSINF] --> [2,2] --> OK [0.10000027E1,TO_POSINF] --> [2,2] --> OK [0.10000026E1,TO_POSINF] --> [2,2] --> OK [0.10000025E1,TO_POSINF] --> [2,2] --> OK [0.10000024E1,TO_POSINF] --> [2,2] --> OK [0.10000023E1,TO_POSINF] --> [2,2] --> OK [0.10000021E1,TO_POSINF] --> [2,2] --> OK [0.1000002E1,TO_POSINF] --> [2,2] --> OK [0.10000019E1,TO_POSINF] --> [2,2] --> OK [0.10000018E1,TO_POSINF] --> [2,2] --> OK [0.10000017E1,TO_POSINF] --> [2,2] --> OK [0.10000015E1,TO_POSINF] --> [2,2] --> OK [0.10000014E1,TO_POSINF] --> [2,2] --> OK [0.10000013E1,TO_POSINF] --> [2,2] --> OK [0.10000012E1,TO_POSINF] --> [2,2] --> OK [0.10000011E1,TO_POSINF] --> [2,2] --> OK [0.1000001E1,TO_POSINF] --> [2,2] --> OK [0.10000008E1,TO_POSINF] --> [2,2] --> OK [0.10000007E1,TO_POSINF] --> [2,2] --> OK [0.10000006E1,TO_POSINF] --> [2,2] --> OK [0.10000005E1,TO_POSINF] --> [2,2] --> OK [0.10000004E1,TO_POSINF] --> [2,2] --> OK [0.10000002E1,TO_POSINF] --> [2,2] --> OK [0.10000001E1,TO_POSINF] --> [2,2] --> OK [0.19999924E1,TO_POSINF] --> [2,2] --> OK [0.19999925E1,TO_POSINF] --> [2,2] --> OK [0.19999926E1,TO_POSINF] --> [2,2] --> OK [0.19999927E1,TO_POSINF] --> [2,2] --> OK [0.19999928E1,TO_POSINF] --> [2,2] --> OK [0.1999993E1,TO_POSINF] --> [2,2] --> OK [0.19999931E1,TO_POSINF] --> [2,2] --> OK [0.19999932E1,TO_POSINF] --> [2,2] --> OK [0.19999933E1,TO_POSINF] --> [2,2] --> OK [0.19999934E1,TO_POSINF] --> [2,2] --> OK [0.19999936E1,TO_POSINF] --> [2,2] --> OK [0.19999937E1,TO_POSINF] --> [2,2] --> OK [0.19999938E1,TO_POSINF] --> [2,2] --> OK [0.19999939E1,TO_POSINF] --> [2,2] --> OK [0.1999994E1,TO_POSINF] --> [2,2] --> OK [0.19999942E1,TO_POSINF] --> [2,2] --> OK [0.19999943E1,TO_POSINF] --> [2,2] --> OK [0.19999944E1,TO_POSINF] --> [2,2] --> OK [0.19999945E1,TO_POSINF] --> [2,2] --> OK [0.19999946E1,TO_POSINF] --> [2,2] --> OK [0.19999948E1,TO_POSINF] --> [2,2] --> OK [0.19999949E1,TO_POSINF] --> [2,2] --> OK [0.1999995E1,TO_POSINF] --> [2,2] --> OK [0.19999951E1,TO_POSINF] --> [2,2] --> OK [0.19999952E1,TO_POSINF] --> [2,2] --> OK [0.19999954E1,TO_POSINF] --> [2,2] --> OK [0.19999955E1,TO_POSINF] --> [2,2] --> OK [0.19999956E1,TO_POSINF] --> [2,2] --> OK [0.19999957E1,TO_POSINF] --> [2,2] --> OK [0.19999958E1,TO_POSINF] --> [2,2] --> OK [0.1999996E1,TO_POSINF] --> [2,2] --> OK [0.19999961E1,TO_POSINF] --> [2,2] --> OK [0.19999962E1,TO_POSINF] --> [2,2] --> OK [0.19999963E1,TO_POSINF] --> [2,2] --> OK [0.19999964E1,TO_POSINF] --> [2,2] --> OK [0.19999965E1,TO_POSINF] --> [2,2] --> OK [0.19999967E1,TO_POSINF] --> [2,2] --> OK [0.19999968E1,TO_POSINF] --> [2,2] --> OK [0.19999969E1,TO_POSINF] --> [2,2] --> OK [0.1999997E1,TO_POSINF] --> [2,2] --> OK [0.19999971E1,TO_POSINF] --> [2,2] --> OK [0.19999973E1,TO_POSINF] --> [2,2] --> OK [0.19999974E1,TO_POSINF] --> [2,2] --> OK [0.19999975E1,TO_POSINF] --> [2,2] --> OK [0.19999976E1,TO_POSINF] --> [2,2] --> OK [0.19999977E1,TO_POSINF] --> [2,2] --> OK [0.19999979E1,TO_POSINF] --> [2,2] --> OK [0.1999998E1,TO_POSINF] --> [2,2] --> OK [0.19999981E1,TO_POSINF] --> [2,2] --> OK [0.19999982E1,TO_POSINF] --> [2,2] --> OK [0.19999983E1,TO_POSINF] --> [2,2] --> OK [0.19999985E1,TO_POSINF] --> [2,2] --> OK [0.19999986E1,TO_POSINF] --> [2,2] --> OK [0.19999987E1,TO_POSINF] --> [2,2] --> OK [0.19999988E1,TO_POSINF] --> [2,2] --> OK [0.19999989E1,TO_POSINF] --> [2,2] --> OK [0.1999999E1,TO_POSINF] --> [2,2] --> OK [0.19999992E1,TO_POSINF] --> [2,2] --> OK [0.19999993E1,TO_POSINF] --> [2,2] --> OK [0.19999994E1,TO_POSINF] --> [2,2] --> OK [0.19999995E1,TO_POSINF] --> [2,2] --> OK [0.19999996E1,TO_POSINF] --> [2,2] --> OK [0.19999998E1,TO_POSINF] --> [2,2] --> OK [0.19999999E1,TO_POSINF] --> [2,2] --> OK [0.2E1,TO_POSINF] --> [2,2] --> OK [0.20000153E1,TO_POSINF] --> [3,3] --> OK [0.2000015E1,TO_POSINF] --> [3,3] --> OK [0.20000148E1,TO_POSINF] --> [3,3] --> OK [0.20000145E1,TO_POSINF] --> [3,3] --> OK [0.20000143E1,TO_POSINF] --> [3,3] --> OK [0.2000014E1,TO_POSINF] --> [3,3] --> OK [0.20000138E1,TO_POSINF] --> [3,3] --> OK [0.20000136E1,TO_POSINF] --> [3,3] --> OK [0.20000134E1,TO_POSINF] --> [3,3] --> OK [0.2000013E1,TO_POSINF] --> [3,3] --> OK [0.20000129E1,TO_POSINF] --> [3,3] --> OK [0.20000126E1,TO_POSINF] --> [3,3] --> OK [0.20000124E1,TO_POSINF] --> [3,3] --> OK [0.20000122E1,TO_POSINF] --> [3,3] --> OK [0.2000012E1,TO_POSINF] --> [3,3] --> OK [0.20000117E1,TO_POSINF] --> [3,3] --> OK [0.20000114E1,TO_POSINF] --> [3,3] --> OK [0.20000112E1,TO_POSINF] --> [3,3] --> OK [0.2000011E1,TO_POSINF] --> [3,3] --> OK [0.20000107E1,TO_POSINF] --> [3,3] --> OK [0.20000105E1,TO_POSINF] --> [3,3] --> OK [0.20000103E1,TO_POSINF] --> [3,3] --> OK [0.200001E1,TO_POSINF] --> [3,3] --> OK [0.20000098E1,TO_POSINF] --> [3,3] --> OK [0.20000095E1,TO_POSINF] --> [3,3] --> OK [0.20000093E1,TO_POSINF] --> [3,3] --> OK [0.2000009E1,TO_POSINF] --> [3,3] --> OK [0.20000088E1,TO_POSINF] --> [3,3] --> OK [0.20000086E1,TO_POSINF] --> [3,3] --> OK [0.20000083E1,TO_POSINF] --> [3,3] --> OK [0.2000008E1,TO_POSINF] --> [3,3] --> OK [0.20000079E1,TO_POSINF] --> [3,3] --> OK [0.20000076E1,TO_POSINF] --> [3,3] --> OK [0.20000074E1,TO_POSINF] --> [3,3] --> OK [0.20000072E1,TO_POSINF] --> [3,3] --> OK [0.2000007E1,TO_POSINF] --> [3,3] --> OK [0.20000067E1,TO_POSINF] --> [3,3] --> OK [0.20000064E1,TO_POSINF] --> [3,3] --> OK [0.20000062E1,TO_POSINF] --> [3,3] --> OK [0.2000006E1,TO_POSINF] --> [3,3] --> OK [0.20000057E1,TO_POSINF] --> [3,3] --> OK [0.20000055E1,TO_POSINF] --> [3,3] --> OK [0.20000052E1,TO_POSINF] --> [3,3] --> OK [0.2000005E1,TO_POSINF] --> [3,3] --> OK [0.20000048E1,TO_POSINF] --> [3,3] --> OK [0.20000045E1,TO_POSINF] --> [3,3] --> OK [0.20000043E1,TO_POSINF] --> [3,3] --> OK [0.2000004E1,TO_POSINF] --> [3,3] --> OK [0.20000038E1,TO_POSINF] --> [3,3] --> OK [0.20000036E1,TO_POSINF] --> [3,3] --> OK [0.20000033E1,TO_POSINF] --> [3,3] --> OK [0.2000003E1,TO_POSINF] --> [3,3] --> OK [0.20000029E1,TO_POSINF] --> [3,3] --> OK [0.20000026E1,TO_POSINF] --> [3,3] --> OK [0.20000024E1,TO_POSINF] --> [3,3] --> OK [0.20000021E1,TO_POSINF] --> [3,3] --> OK [0.2000002E1,TO_POSINF] --> [3,3] --> OK [0.20000017E1,TO_POSINF] --> [3,3] --> OK [0.20000014E1,TO_POSINF] --> [3,3] --> OK [0.20000012E1,TO_POSINF] --> [3,3] --> OK [0.2000001E1,TO_POSINF] --> [3,3] --> OK [0.20000007E1,TO_POSINF] --> [3,3] --> OK [0.20000005E1,TO_POSINF] --> [3,3] --> OK [0.20000002E1,TO_POSINF] --> [3,3] --> OK [0.29999847E1,TO_POSINF] --> [3,3] --> OK [0.2999985E1,TO_POSINF] --> [3,3] --> OK [0.29999852E1,TO_POSINF] --> [3,3] --> OK [0.29999855E1,TO_POSINF] --> [3,3] --> OK [0.29999857E1,TO_POSINF] --> [3,3] --> OK [0.2999986E1,TO_POSINF] --> [3,3] --> OK [0.29999862E1,TO_POSINF] --> [3,3] --> OK [0.29999864E1,TO_POSINF] --> [3,3] --> OK [0.29999866E1,TO_POSINF] --> [3,3] --> OK [0.2999987E1,TO_POSINF] --> [3,3] --> OK [0.29999871E1,TO_POSINF] --> [3,3] --> OK [0.29999874E1,TO_POSINF] --> [3,3] --> OK [0.29999876E1,TO_POSINF] --> [3,3] --> OK [0.29999878E1,TO_POSINF] --> [3,3] --> OK [0.2999988E1,TO_POSINF] --> [3,3] --> OK [0.29999883E1,TO_POSINF] --> [3,3] --> OK [0.29999886E1,TO_POSINF] --> [3,3] --> OK [0.29999888E1,TO_POSINF] --> [3,3] --> OK [0.2999989E1,TO_POSINF] --> [3,3] --> OK [0.29999893E1,TO_POSINF] --> [3,3] --> OK [0.29999895E1,TO_POSINF] --> [3,3] --> OK [0.29999897E1,TO_POSINF] --> [3,3] --> OK [0.299999E1,TO_POSINF] --> [3,3] --> OK [0.29999902E1,TO_POSINF] --> [3,3] --> OK [0.29999905E1,TO_POSINF] --> [3,3] --> OK [0.29999907E1,TO_POSINF] --> [3,3] --> OK [0.2999991E1,TO_POSINF] --> [3,3] --> OK [0.29999912E1,TO_POSINF] --> [3,3] --> OK [0.29999914E1,TO_POSINF] --> [3,3] --> OK [0.29999917E1,TO_POSINF] --> [3,3] --> OK [0.2999992E1,TO_POSINF] --> [3,3] --> OK [0.29999921E1,TO_POSINF] --> [3,3] --> OK [0.29999924E1,TO_POSINF] --> [3,3] --> OK [0.29999926E1,TO_POSINF] --> [3,3] --> OK [0.29999928E1,TO_POSINF] --> [3,3] --> OK [0.2999993E1,TO_POSINF] --> [3,3] --> OK [0.29999933E1,TO_POSINF] --> [3,3] --> OK [0.29999936E1,TO_POSINF] --> [3,3] --> OK [0.29999938E1,TO_POSINF] --> [3,3] --> OK [0.2999994E1,TO_POSINF] --> [3,3] --> OK [0.29999943E1,TO_POSINF] --> [3,3] --> OK [0.29999945E1,TO_POSINF] --> [3,3] --> OK [0.29999948E1,TO_POSINF] --> [3,3] --> OK [0.2999995E1,TO_POSINF] --> [3,3] --> OK [0.29999952E1,TO_POSINF] --> [3,3] --> OK [0.29999955E1,TO_POSINF] --> [3,3] --> OK [0.29999957E1,TO_POSINF] --> [3,3] --> OK [0.2999996E1,TO_POSINF] --> [3,3] --> OK [0.29999962E1,TO_POSINF] --> [3,3] --> OK [0.29999964E1,TO_POSINF] --> [3,3] --> OK [0.29999967E1,TO_POSINF] --> [3,3] --> OK [0.2999997E1,TO_POSINF] --> [3,3] --> OK [0.29999971E1,TO_POSINF] --> [3,3] --> OK [0.29999974E1,TO_POSINF] --> [3,3] --> OK [0.29999976E1,TO_POSINF] --> [3,3] --> OK [0.29999979E1,TO_POSINF] --> [3,3] --> OK [0.2999998E1,TO_POSINF] --> [3,3] --> OK [0.29999983E1,TO_POSINF] --> [3,3] --> OK [0.29999986E1,TO_POSINF] --> [3,3] --> OK [0.29999988E1,TO_POSINF] --> [3,3] --> OK [0.2999999E1,TO_POSINF] --> [3,3] --> OK [0.29999993E1,TO_POSINF] --> [3,3] --> OK [0.29999995E1,TO_POSINF] --> [3,3] --> OK [0.29999998E1,TO_POSINF] --> [3,3] --> OK [0.3E1,TO_POSINF] --> [3,3] --> OK [0.30000153E1,TO_POSINF] --> [4,4] --> OK [0.3000015E1,TO_POSINF] --> [4,4] --> OK [0.30000148E1,TO_POSINF] --> [4,4] --> OK [0.30000145E1,TO_POSINF] --> [4,4] --> OK [0.30000143E1,TO_POSINF] --> [4,4] --> OK [0.3000014E1,TO_POSINF] --> [4,4] --> OK [0.30000138E1,TO_POSINF] --> [4,4] --> OK [0.30000136E1,TO_POSINF] --> [4,4] --> OK [0.30000134E1,TO_POSINF] --> [4,4] --> OK [0.3000013E1,TO_POSINF] --> [4,4] --> OK [0.30000129E1,TO_POSINF] --> [4,4] --> OK [0.30000126E1,TO_POSINF] --> [4,4] --> OK [0.30000124E1,TO_POSINF] --> [4,4] --> OK [0.30000122E1,TO_POSINF] --> [4,4] --> OK [0.3000012E1,TO_POSINF] --> [4,4] --> OK [0.30000117E1,TO_POSINF] --> [4,4] --> OK [0.30000114E1,TO_POSINF] --> [4,4] --> OK [0.30000112E1,TO_POSINF] --> [4,4] --> OK [0.3000011E1,TO_POSINF] --> [4,4] --> OK [0.30000107E1,TO_POSINF] --> [4,4] --> OK [0.30000105E1,TO_POSINF] --> [4,4] --> OK [0.30000103E1,TO_POSINF] --> [4,4] --> OK [0.300001E1,TO_POSINF] --> [4,4] --> OK [0.30000098E1,TO_POSINF] --> [4,4] --> OK [0.30000095E1,TO_POSINF] --> [4,4] --> OK [0.30000093E1,TO_POSINF] --> [4,4] --> OK [0.3000009E1,TO_POSINF] --> [4,4] --> OK [0.30000088E1,TO_POSINF] --> [4,4] --> OK [0.30000086E1,TO_POSINF] --> [4,4] --> OK [0.30000083E1,TO_POSINF] --> [4,4] --> OK [0.3000008E1,TO_POSINF] --> [4,4] --> OK [0.30000079E1,TO_POSINF] --> [4,4] --> OK [0.30000076E1,TO_POSINF] --> [4,4] --> OK [0.30000074E1,TO_POSINF] --> [4,4] --> OK [0.30000072E1,TO_POSINF] --> [4,4] --> OK [0.3000007E1,TO_POSINF] --> [4,4] --> OK [0.30000067E1,TO_POSINF] --> [4,4] --> OK [0.30000064E1,TO_POSINF] --> [4,4] --> OK [0.30000062E1,TO_POSINF] --> [4,4] --> OK [0.3000006E1,TO_POSINF] --> [4,4] --> OK [0.30000057E1,TO_POSINF] --> [4,4] --> OK [0.30000055E1,TO_POSINF] --> [4,4] --> OK [0.30000052E1,TO_POSINF] --> [4,4] --> OK [0.3000005E1,TO_POSINF] --> [4,4] --> OK [0.30000048E1,TO_POSINF] --> [4,4] --> OK [0.30000045E1,TO_POSINF] --> [4,4] --> OK [0.30000043E1,TO_POSINF] --> [4,4] --> OK [0.3000004E1,TO_POSINF] --> [4,4] --> OK [0.30000038E1,TO_POSINF] --> [4,4] --> OK [0.30000036E1,TO_POSINF] --> [4,4] --> OK [0.30000033E1,TO_POSINF] --> [4,4] --> OK [0.3000003E1,TO_POSINF] --> [4,4] --> OK [0.30000029E1,TO_POSINF] --> [4,4] --> OK [0.30000026E1,TO_POSINF] --> [4,4] --> OK [0.30000024E1,TO_POSINF] --> [4,4] --> OK [0.30000021E1,TO_POSINF] --> [4,4] --> OK [0.3000002E1,TO_POSINF] --> [4,4] --> OK [0.30000017E1,TO_POSINF] --> [4,4] --> OK [0.30000014E1,TO_POSINF] --> [4,4] --> OK [0.30000012E1,TO_POSINF] --> [4,4] --> OK [0.3000001E1,TO_POSINF] --> [4,4] --> OK [0.30000007E1,TO_POSINF] --> [4,4] --> OK [0.30000005E1,TO_POSINF] --> [4,4] --> OK [0.30000002E1,TO_POSINF] --> [4,4] --> OK [0.1073737728E10,TO_POSINF] --> [1073737728,1073737728] --> OK [0.1073737792E10,TO_POSINF] --> [1073737792,1073737792] --> OK [0.1073737856E10,TO_POSINF] --> [1073737856,1073737856] --> OK [0.107373792E10,TO_POSINF] --> [1073737920,1073737920] --> OK [0.1073737984E10,TO_POSINF] --> [1073737984,1073737984] --> OK [0.1073738048E10,TO_POSINF] --> [1073738048,1073738048] --> OK [0.1073738112E10,TO_POSINF] --> [1073738112,1073738112] --> OK [0.1073738176E10,TO_POSINF] --> [1073738176,1073738176] --> OK [0.107373824E10,TO_POSINF] --> [1073738240,1073738240] --> OK [0.1073738304E10,TO_POSINF] --> [1073738304,1073738304] --> OK [0.1073738368E10,TO_POSINF] --> [1073738368,1073738368] --> OK [0.1073738432E10,TO_POSINF] --> [1073738432,1073738432] --> OK [0.1073738496E10,TO_POSINF] --> [1073738496,1073738496] --> OK [0.107373856E10,TO_POSINF] --> [1073738560,1073738560] --> OK [0.1073738624E10,TO_POSINF] --> [1073738624,1073738624] --> OK [0.1073738688E10,TO_POSINF] --> [1073738688,1073738688] --> OK [0.1073738752E10,TO_POSINF] --> [1073738752,1073738752] --> OK [0.1073738816E10,TO_POSINF] --> [1073738816,1073738816] --> OK [0.107373888E10,TO_POSINF] --> [1073738880,1073738880] --> OK [0.1073738944E10,TO_POSINF] --> [1073738944,1073738944] --> OK [0.1073739008E10,TO_POSINF] --> [1073739008,1073739008] --> OK [0.1073739072E10,TO_POSINF] --> [1073739072,1073739072] --> OK [0.1073739136E10,TO_POSINF] --> [1073739136,1073739136] --> OK [0.10737392E10,TO_POSINF] --> [1073739200,1073739200] --> OK [0.1073739264E10,TO_POSINF] --> [1073739264,1073739264] --> OK [0.1073739328E10,TO_POSINF] --> [1073739328,1073739328] --> OK [0.1073739392E10,TO_POSINF] --> [1073739392,1073739392] --> OK [0.1073739456E10,TO_POSINF] --> [1073739456,1073739456] --> OK [0.107373952E10,TO_POSINF] --> [1073739520,1073739520] --> OK [0.1073739584E10,TO_POSINF] --> [1073739584,1073739584] --> OK [0.1073739648E10,TO_POSINF] --> [1073739648,1073739648] --> OK [0.1073739712E10,TO_POSINF] --> [1073739712,1073739712] --> OK [0.1073739776E10,TO_POSINF] --> [1073739776,1073739776] --> OK [0.107373984E10,TO_POSINF] --> [1073739840,1073739840] --> OK [0.1073739904E10,TO_POSINF] --> [1073739904,1073739904] --> OK [0.1073739968E10,TO_POSINF] --> [1073739968,1073739968] --> OK [0.1073740032E10,TO_POSINF] --> [1073740032,1073740032] --> OK [0.1073740096E10,TO_POSINF] --> [1073740096,1073740096] --> OK [0.107374016E10,TO_POSINF] --> [1073740160,1073740160] --> OK [0.1073740224E10,TO_POSINF] --> [1073740224,1073740224] --> OK [0.1073740288E10,TO_POSINF] --> [1073740288,1073740288] --> OK [0.1073740352E10,TO_POSINF] --> [1073740352,1073740352] --> OK [0.1073740416E10,TO_POSINF] --> [1073740416,1073740416] --> OK [0.107374048E10,TO_POSINF] --> [1073740480,1073740480] --> OK [0.1073740544E10,TO_POSINF] --> [1073740544,1073740544] --> OK [0.1073740608E10,TO_POSINF] --> [1073740608,1073740608] --> OK [0.1073740672E10,TO_POSINF] --> [1073740672,1073740672] --> OK [0.1073740736E10,TO_POSINF] --> [1073740736,1073740736] --> OK [0.10737408E10,TO_POSINF] --> [1073740800,1073740800] --> OK [0.1073740864E10,TO_POSINF] --> [1073740864,1073740864] --> OK [0.1073740928E10,TO_POSINF] --> [1073740928,1073740928] --> OK [0.1073740992E10,TO_POSINF] --> [1073740992,1073740992] --> OK [0.1073741056E10,TO_POSINF] --> [1073741056,1073741056] --> OK [0.107374112E10,TO_POSINF] --> [1073741120,1073741120] --> OK [0.1073741184E10,TO_POSINF] --> [1073741184,1073741184] --> OK [0.1073741248E10,TO_POSINF] --> [1073741248,1073741248] --> OK [0.1073741312E10,TO_POSINF] --> [1073741312,1073741312] --> OK [0.1073741376E10,TO_POSINF] --> [1073741376,1073741376] --> OK [0.107374144E10,TO_POSINF] --> [1073741440,1073741440] --> OK [0.1073741504E10,TO_POSINF] --> [1073741504,1073741504] --> OK [0.1073741568E10,TO_POSINF] --> [1073741568,1073741568] --> OK [0.1073741632E10,TO_POSINF] --> [1073741632,1073741632] --> OK [0.1073741696E10,TO_POSINF] --> [1073741696,1073741696] --> OK [0.107374176E10,TO_POSINF] --> [1073741760,1073741760] --> OK [0.1073741824E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073750016E10,TO_POSINF] --> [1073750016,1073750016] --> OK [0.1073749888E10,TO_POSINF] --> [1073749888,1073749888] --> OK [0.107374976E10,TO_POSINF] --> [1073749760,1073749760] --> OK [0.1073749632E10,TO_POSINF] --> [1073749632,1073749632] --> OK [0.1073749504E10,TO_POSINF] --> [1073749504,1073749504] --> OK [0.1073749376E10,TO_POSINF] --> [1073749376,1073749376] --> OK [0.1073749248E10,TO_POSINF] --> [1073749248,1073749248] --> OK [0.107374912E10,TO_POSINF] --> [1073749120,1073749120] --> OK [0.1073748992E10,TO_POSINF] --> [1073748992,1073748992] --> OK [0.1073748864E10,TO_POSINF] --> [1073748864,1073748864] --> OK [0.1073748736E10,TO_POSINF] --> [1073748736,1073748736] --> OK [0.1073748608E10,TO_POSINF] --> [1073748608,1073748608] --> OK [0.107374848E10,TO_POSINF] --> [1073748480,1073748480] --> OK [0.1073748352E10,TO_POSINF] --> [1073748352,1073748352] --> OK [0.1073748224E10,TO_POSINF] --> [1073748224,1073748224] --> OK [0.1073748096E10,TO_POSINF] --> [1073748096,1073748096] --> OK [0.1073747968E10,TO_POSINF] --> [1073747968,1073747968] --> OK [0.107374784E10,TO_POSINF] --> [1073747840,1073747840] --> OK [0.1073747712E10,TO_POSINF] --> [1073747712,1073747712] --> OK [0.1073747584E10,TO_POSINF] --> [1073747584,1073747584] --> OK [0.1073747456E10,TO_POSINF] --> [1073747456,1073747456] --> OK [0.1073747328E10,TO_POSINF] --> [1073747328,1073747328] --> OK [0.10737472E10,TO_POSINF] --> [1073747200,1073747200] --> OK [0.1073747072E10,TO_POSINF] --> [1073747072,1073747072] --> OK [0.1073746944E10,TO_POSINF] --> [1073746944,1073746944] --> OK [0.1073746816E10,TO_POSINF] --> [1073746816,1073746816] --> OK [0.1073746688E10,TO_POSINF] --> [1073746688,1073746688] --> OK [0.107374656E10,TO_POSINF] --> [1073746560,1073746560] --> OK [0.1073746432E10,TO_POSINF] --> [1073746432,1073746432] --> OK [0.1073746304E10,TO_POSINF] --> [1073746304,1073746304] --> OK [0.1073746176E10,TO_POSINF] --> [1073746176,1073746176] --> OK [0.1073746048E10,TO_POSINF] --> [1073746048,1073746048] --> OK [0.107374592E10,TO_POSINF] --> [1073745920,1073745920] --> OK [0.1073745792E10,TO_POSINF] --> [1073745792,1073745792] --> OK [0.1073745664E10,TO_POSINF] --> [1073745664,1073745664] --> OK [0.1073745536E10,TO_POSINF] --> [1073745536,1073745536] --> OK [0.1073745408E10,TO_POSINF] --> [1073745408,1073745408] --> OK [0.107374528E10,TO_POSINF] --> [1073745280,1073745280] --> OK [0.1073745152E10,TO_POSINF] --> [1073745152,1073745152] --> OK [0.1073745024E10,TO_POSINF] --> [1073745024,1073745024] --> OK [0.1073744896E10,TO_POSINF] --> [1073744896,1073744896] --> OK [0.1073744768E10,TO_POSINF] --> [1073744768,1073744768] --> OK [0.107374464E10,TO_POSINF] --> [1073744640,1073744640] --> OK [0.1073744512E10,TO_POSINF] --> [1073744512,1073744512] --> OK [0.1073744384E10,TO_POSINF] --> [1073744384,1073744384] --> OK [0.1073744256E10,TO_POSINF] --> [1073744256,1073744256] --> OK [0.1073744128E10,TO_POSINF] --> [1073744128,1073744128] --> OK [0.1073744E10,TO_POSINF] --> [1073744000,1073744000] --> OK [0.1073743872E10,TO_POSINF] --> [1073743872,1073743872] --> OK [0.1073743744E10,TO_POSINF] --> [1073743744,1073743744] --> OK [0.1073743616E10,TO_POSINF] --> [1073743616,1073743616] --> OK [0.1073743488E10,TO_POSINF] --> [1073743488,1073743488] --> OK [0.107374336E10,TO_POSINF] --> [1073743360,1073743360] --> OK [0.1073743232E10,TO_POSINF] --> [1073743232,1073743232] --> OK [0.1073743104E10,TO_POSINF] --> [1073743104,1073743104] --> OK [0.1073742976E10,TO_POSINF] --> [1073742976,1073742976] --> OK [0.1073742848E10,TO_POSINF] --> [1073742848,1073742848] --> OK [0.107374272E10,TO_POSINF] --> [1073742720,1073742720] --> OK [0.1073742592E10,TO_POSINF] --> [1073742592,1073742592] --> OK [0.1073742464E10,TO_POSINF] --> [1073742464,1073742464] --> OK [0.1073742336E10,TO_POSINF] --> [1073742336,1073742336] --> OK [0.1073742208E10,TO_POSINF] --> [1073742208,1073742208] --> OK [0.107374208E10,TO_POSINF] --> [1073742080,1073742080] --> OK [0.1073741952E10,TO_POSINF] --> [1073741952,1073741952] --> OK [0.1610604544E10,TO_POSINF] --> [1610604544,1610604544] --> OK [0.1610604672E10,TO_POSINF] --> [1610604672,1610604672] --> OK [0.16106048E10,TO_POSINF] --> [1610604800,1610604800] --> OK [0.1610604928E10,TO_POSINF] --> [1610604928,1610604928] --> OK [0.1610605056E10,TO_POSINF] --> [1610605056,1610605056] --> OK [0.1610605184E10,TO_POSINF] --> [1610605184,1610605184] --> OK [0.1610605312E10,TO_POSINF] --> [1610605312,1610605312] --> OK [0.161060544E10,TO_POSINF] --> [1610605440,1610605440] --> OK [0.1610605568E10,TO_POSINF] --> [1610605568,1610605568] --> OK [0.1610605696E10,TO_POSINF] --> [1610605696,1610605696] --> OK [0.1610605824E10,TO_POSINF] --> [1610605824,1610605824] --> OK [0.1610605952E10,TO_POSINF] --> [1610605952,1610605952] --> OK [0.161060608E10,TO_POSINF] --> [1610606080,1610606080] --> OK [0.1610606208E10,TO_POSINF] --> [1610606208,1610606208] --> OK [0.1610606336E10,TO_POSINF] --> [1610606336,1610606336] --> OK [0.1610606464E10,TO_POSINF] --> [1610606464,1610606464] --> OK [0.1610606592E10,TO_POSINF] --> [1610606592,1610606592] --> OK [0.161060672E10,TO_POSINF] --> [1610606720,1610606720] --> OK [0.1610606848E10,TO_POSINF] --> [1610606848,1610606848] --> OK [0.1610606976E10,TO_POSINF] --> [1610606976,1610606976] --> OK [0.1610607104E10,TO_POSINF] --> [1610607104,1610607104] --> OK [0.1610607232E10,TO_POSINF] --> [1610607232,1610607232] --> OK [0.161060736E10,TO_POSINF] --> [1610607360,1610607360] --> OK [0.1610607488E10,TO_POSINF] --> [1610607488,1610607488] --> OK [0.1610607616E10,TO_POSINF] --> [1610607616,1610607616] --> OK [0.1610607744E10,TO_POSINF] --> [1610607744,1610607744] --> OK [0.1610607872E10,TO_POSINF] --> [1610607872,1610607872] --> OK [0.1610608E10,TO_POSINF] --> [1610608000,1610608000] --> OK [0.1610608128E10,TO_POSINF] --> [1610608128,1610608128] --> OK [0.1610608256E10,TO_POSINF] --> [1610608256,1610608256] --> OK [0.1610608384E10,TO_POSINF] --> [1610608384,1610608384] --> OK [0.1610608512E10,TO_POSINF] --> [1610608512,1610608512] --> OK [0.161060864E10,TO_POSINF] --> [1610608640,1610608640] --> OK [0.1610608768E10,TO_POSINF] --> [1610608768,1610608768] --> OK [0.1610608896E10,TO_POSINF] --> [1610608896,1610608896] --> OK [0.1610609024E10,TO_POSINF] --> [1610609024,1610609024] --> OK [0.1610609152E10,TO_POSINF] --> [1610609152,1610609152] --> OK [0.161060928E10,TO_POSINF] --> [1610609280,1610609280] --> OK [0.1610609408E10,TO_POSINF] --> [1610609408,1610609408] --> OK [0.1610609536E10,TO_POSINF] --> [1610609536,1610609536] --> OK [0.1610609664E10,TO_POSINF] --> [1610609664,1610609664] --> OK [0.1610609792E10,TO_POSINF] --> [1610609792,1610609792] --> OK [0.161060992E10,TO_POSINF] --> [1610609920,1610609920] --> OK [0.1610610048E10,TO_POSINF] --> [1610610048,1610610048] --> OK [0.1610610176E10,TO_POSINF] --> [1610610176,1610610176] --> OK [0.1610610304E10,TO_POSINF] --> [1610610304,1610610304] --> OK [0.1610610432E10,TO_POSINF] --> [1610610432,1610610432] --> OK [0.161061056E10,TO_POSINF] --> [1610610560,1610610560] --> OK [0.1610610688E10,TO_POSINF] --> [1610610688,1610610688] --> OK [0.1610610816E10,TO_POSINF] --> [1610610816,1610610816] --> OK [0.1610610944E10,TO_POSINF] --> [1610610944,1610610944] --> OK [0.1610611072E10,TO_POSINF] --> [1610611072,1610611072] --> OK [0.16106112E10,TO_POSINF] --> [1610611200,1610611200] --> OK [0.1610611328E10,TO_POSINF] --> [1610611328,1610611328] --> OK [0.1610611456E10,TO_POSINF] --> [1610611456,1610611456] --> OK [0.1610611584E10,TO_POSINF] --> [1610611584,1610611584] --> OK [0.1610611712E10,TO_POSINF] --> [1610611712,1610611712] --> OK [0.161061184E10,TO_POSINF] --> [1610611840,1610611840] --> OK [0.1610611968E10,TO_POSINF] --> [1610611968,1610611968] --> OK [0.1610612096E10,TO_POSINF] --> [1610612096,1610612096] --> OK [0.1610612224E10,TO_POSINF] --> [1610612224,1610612224] --> OK [0.1610612352E10,TO_POSINF] --> [1610612352,1610612352] --> OK [0.161061248E10,TO_POSINF] --> [1610612480,1610612480] --> OK [0.1610612608E10,TO_POSINF] --> [1610612608,1610612608] --> OK [0.1610612736E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610620928E10,TO_POSINF] --> [1610620928,1610620928] --> OK [0.16106208E10,TO_POSINF] --> [1610620800,1610620800] --> OK [0.1610620672E10,TO_POSINF] --> [1610620672,1610620672] --> OK [0.1610620544E10,TO_POSINF] --> [1610620544,1610620544] --> OK [0.1610620416E10,TO_POSINF] --> [1610620416,1610620416] --> OK [0.1610620288E10,TO_POSINF] --> [1610620288,1610620288] --> OK [0.161062016E10,TO_POSINF] --> [1610620160,1610620160] --> OK [0.1610620032E10,TO_POSINF] --> [1610620032,1610620032] --> OK [0.1610619904E10,TO_POSINF] --> [1610619904,1610619904] --> OK [0.1610619776E10,TO_POSINF] --> [1610619776,1610619776] --> OK [0.1610619648E10,TO_POSINF] --> [1610619648,1610619648] --> OK [0.161061952E10,TO_POSINF] --> [1610619520,1610619520] --> OK [0.1610619392E10,TO_POSINF] --> [1610619392,1610619392] --> OK [0.1610619264E10,TO_POSINF] --> [1610619264,1610619264] --> OK [0.1610619136E10,TO_POSINF] --> [1610619136,1610619136] --> OK [0.1610619008E10,TO_POSINF] --> [1610619008,1610619008] --> OK [0.161061888E10,TO_POSINF] --> [1610618880,1610618880] --> OK [0.1610618752E10,TO_POSINF] --> [1610618752,1610618752] --> OK [0.1610618624E10,TO_POSINF] --> [1610618624,1610618624] --> OK [0.1610618496E10,TO_POSINF] --> [1610618496,1610618496] --> OK [0.1610618368E10,TO_POSINF] --> [1610618368,1610618368] --> OK [0.161061824E10,TO_POSINF] --> [1610618240,1610618240] --> OK [0.1610618112E10,TO_POSINF] --> [1610618112,1610618112] --> OK [0.1610617984E10,TO_POSINF] --> [1610617984,1610617984] --> OK [0.1610617856E10,TO_POSINF] --> [1610617856,1610617856] --> OK [0.1610617728E10,TO_POSINF] --> [1610617728,1610617728] --> OK [0.16106176E10,TO_POSINF] --> [1610617600,1610617600] --> OK [0.1610617472E10,TO_POSINF] --> [1610617472,1610617472] --> OK [0.1610617344E10,TO_POSINF] --> [1610617344,1610617344] --> OK [0.1610617216E10,TO_POSINF] --> [1610617216,1610617216] --> OK [0.1610617088E10,TO_POSINF] --> [1610617088,1610617088] --> OK [0.161061696E10,TO_POSINF] --> [1610616960,1610616960] --> OK [0.1610616832E10,TO_POSINF] --> [1610616832,1610616832] --> OK [0.1610616704E10,TO_POSINF] --> [1610616704,1610616704] --> OK [0.1610616576E10,TO_POSINF] --> [1610616576,1610616576] --> OK [0.1610616448E10,TO_POSINF] --> [1610616448,1610616448] --> OK [0.161061632E10,TO_POSINF] --> [1610616320,1610616320] --> OK [0.1610616192E10,TO_POSINF] --> [1610616192,1610616192] --> OK [0.1610616064E10,TO_POSINF] --> [1610616064,1610616064] --> OK [0.1610615936E10,TO_POSINF] --> [1610615936,1610615936] --> OK [0.1610615808E10,TO_POSINF] --> [1610615808,1610615808] --> OK [0.161061568E10,TO_POSINF] --> [1610615680,1610615680] --> OK [0.1610615552E10,TO_POSINF] --> [1610615552,1610615552] --> OK [0.1610615424E10,TO_POSINF] --> [1610615424,1610615424] --> OK [0.1610615296E10,TO_POSINF] --> [1610615296,1610615296] --> OK [0.1610615168E10,TO_POSINF] --> [1610615168,1610615168] --> OK [0.161061504E10,TO_POSINF] --> [1610615040,1610615040] --> OK [0.1610614912E10,TO_POSINF] --> [1610614912,1610614912] --> OK [0.1610614784E10,TO_POSINF] --> [1610614784,1610614784] --> OK [0.1610614656E10,TO_POSINF] --> [1610614656,1610614656] --> OK [0.1610614528E10,TO_POSINF] --> [1610614528,1610614528] --> OK [0.16106144E10,TO_POSINF] --> [1610614400,1610614400] --> OK [0.1610614272E10,TO_POSINF] --> [1610614272,1610614272] --> OK [0.1610614144E10,TO_POSINF] --> [1610614144,1610614144] --> OK [0.1610614016E10,TO_POSINF] --> [1610614016,1610614016] --> OK [0.1610613888E10,TO_POSINF] --> [1610613888,1610613888] --> OK [0.161061376E10,TO_POSINF] --> [1610613760,1610613760] --> OK [0.1610613632E10,TO_POSINF] --> [1610613632,1610613632] --> OK [0.1610613504E10,TO_POSINF] --> [1610613504,1610613504] --> OK [0.1610613376E10,TO_POSINF] --> [1610613376,1610613376] --> OK [0.1610613248E10,TO_POSINF] --> [1610613248,1610613248] --> OK [0.161061312E10,TO_POSINF] --> [1610613120,1610613120] --> OK [0.1610612992E10,TO_POSINF] --> [1610612992,1610612992] --> OK [0.1610612864E10,TO_POSINF] --> [1610612864,1610612864] --> OK [0.187904E10,TO_POSINF] --> [1879040000,1879040000] --> OK [0.1879040128E10,TO_POSINF] --> [1879040128,1879040128] --> OK [0.1879040256E10,TO_POSINF] --> [1879040256,1879040256] --> OK [0.1879040384E10,TO_POSINF] --> [1879040384,1879040384] --> OK [0.1879040512E10,TO_POSINF] --> [1879040512,1879040512] --> OK [0.187904064E10,TO_POSINF] --> [1879040640,1879040640] --> OK [0.1879040768E10,TO_POSINF] --> [1879040768,1879040768] --> OK [0.1879040896E10,TO_POSINF] --> [1879040896,1879040896] --> OK [0.1879041024E10,TO_POSINF] --> [1879041024,1879041024] --> OK [0.1879041152E10,TO_POSINF] --> [1879041152,1879041152] --> OK [0.187904128E10,TO_POSINF] --> [1879041280,1879041280] --> OK [0.1879041408E10,TO_POSINF] --> [1879041408,1879041408] --> OK [0.1879041536E10,TO_POSINF] --> [1879041536,1879041536] --> OK [0.1879041664E10,TO_POSINF] --> [1879041664,1879041664] --> OK [0.1879041792E10,TO_POSINF] --> [1879041792,1879041792] --> OK [0.187904192E10,TO_POSINF] --> [1879041920,1879041920] --> OK [0.1879042048E10,TO_POSINF] --> [1879042048,1879042048] --> OK [0.1879042176E10,TO_POSINF] --> [1879042176,1879042176] --> OK [0.1879042304E10,TO_POSINF] --> [1879042304,1879042304] --> OK [0.1879042432E10,TO_POSINF] --> [1879042432,1879042432] --> OK [0.187904256E10,TO_POSINF] --> [1879042560,1879042560] --> OK [0.1879042688E10,TO_POSINF] --> [1879042688,1879042688] --> OK [0.1879042816E10,TO_POSINF] --> [1879042816,1879042816] --> OK [0.1879042944E10,TO_POSINF] --> [1879042944,1879042944] --> OK [0.1879043072E10,TO_POSINF] --> [1879043072,1879043072] --> OK [0.18790432E10,TO_POSINF] --> [1879043200,1879043200] --> OK [0.1879043328E10,TO_POSINF] --> [1879043328,1879043328] --> OK [0.1879043456E10,TO_POSINF] --> [1879043456,1879043456] --> OK [0.1879043584E10,TO_POSINF] --> [1879043584,1879043584] --> OK [0.1879043712E10,TO_POSINF] --> [1879043712,1879043712] --> OK [0.187904384E10,TO_POSINF] --> [1879043840,1879043840] --> OK [0.1879043968E10,TO_POSINF] --> [1879043968,1879043968] --> OK [0.1879044096E10,TO_POSINF] --> [1879044096,1879044096] --> OK [0.1879044224E10,TO_POSINF] --> [1879044224,1879044224] --> OK [0.1879044352E10,TO_POSINF] --> [1879044352,1879044352] --> OK [0.187904448E10,TO_POSINF] --> [1879044480,1879044480] --> OK [0.1879044608E10,TO_POSINF] --> [1879044608,1879044608] --> OK [0.1879044736E10,TO_POSINF] --> [1879044736,1879044736] --> OK [0.1879044864E10,TO_POSINF] --> [1879044864,1879044864] --> OK [0.1879044992E10,TO_POSINF] --> [1879044992,1879044992] --> OK [0.187904512E10,TO_POSINF] --> [1879045120,1879045120] --> OK [0.1879045248E10,TO_POSINF] --> [1879045248,1879045248] --> OK [0.1879045376E10,TO_POSINF] --> [1879045376,1879045376] --> OK [0.1879045504E10,TO_POSINF] --> [1879045504,1879045504] --> OK [0.1879045632E10,TO_POSINF] --> [1879045632,1879045632] --> OK [0.187904576E10,TO_POSINF] --> [1879045760,1879045760] --> OK [0.1879045888E10,TO_POSINF] --> [1879045888,1879045888] --> OK [0.1879046016E10,TO_POSINF] --> [1879046016,1879046016] --> OK [0.1879046144E10,TO_POSINF] --> [1879046144,1879046144] --> OK [0.1879046272E10,TO_POSINF] --> [1879046272,1879046272] --> OK [0.18790464E10,TO_POSINF] --> [1879046400,1879046400] --> OK [0.1879046528E10,TO_POSINF] --> [1879046528,1879046528] --> OK [0.1879046656E10,TO_POSINF] --> [1879046656,1879046656] --> OK [0.1879046784E10,TO_POSINF] --> [1879046784,1879046784] --> OK [0.1879046912E10,TO_POSINF] --> [1879046912,1879046912] --> OK [0.187904704E10,TO_POSINF] --> [1879047040,1879047040] --> OK [0.1879047168E10,TO_POSINF] --> [1879047168,1879047168] --> OK [0.1879047296E10,TO_POSINF] --> [1879047296,1879047296] --> OK [0.1879047424E10,TO_POSINF] --> [1879047424,1879047424] --> OK [0.1879047552E10,TO_POSINF] --> [1879047552,1879047552] --> OK [0.187904768E10,TO_POSINF] --> [1879047680,1879047680] --> OK [0.1879047808E10,TO_POSINF] --> [1879047808,1879047808] --> OK [0.1879047936E10,TO_POSINF] --> [1879047936,1879047936] --> OK [0.1879048064E10,TO_POSINF] --> [1879048064,1879048064] --> OK [0.1879048192E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879056384E10,TO_POSINF] --> [1879056384,1879056384] --> OK [0.1879056256E10,TO_POSINF] --> [1879056256,1879056256] --> OK [0.1879056128E10,TO_POSINF] --> [1879056128,1879056128] --> OK [0.1879056E10,TO_POSINF] --> [1879056000,1879056000] --> OK [0.1879055872E10,TO_POSINF] --> [1879055872,1879055872] --> OK [0.1879055744E10,TO_POSINF] --> [1879055744,1879055744] --> OK [0.1879055616E10,TO_POSINF] --> [1879055616,1879055616] --> OK [0.1879055488E10,TO_POSINF] --> [1879055488,1879055488] --> OK [0.187905536E10,TO_POSINF] --> [1879055360,1879055360] --> OK [0.1879055232E10,TO_POSINF] --> [1879055232,1879055232] --> OK [0.1879055104E10,TO_POSINF] --> [1879055104,1879055104] --> OK [0.1879054976E10,TO_POSINF] --> [1879054976,1879054976] --> OK [0.1879054848E10,TO_POSINF] --> [1879054848,1879054848] --> OK [0.187905472E10,TO_POSINF] --> [1879054720,1879054720] --> OK [0.1879054592E10,TO_POSINF] --> [1879054592,1879054592] --> OK [0.1879054464E10,TO_POSINF] --> [1879054464,1879054464] --> OK [0.1879054336E10,TO_POSINF] --> [1879054336,1879054336] --> OK [0.1879054208E10,TO_POSINF] --> [1879054208,1879054208] --> OK [0.187905408E10,TO_POSINF] --> [1879054080,1879054080] --> OK [0.1879053952E10,TO_POSINF] --> [1879053952,1879053952] --> OK [0.1879053824E10,TO_POSINF] --> [1879053824,1879053824] --> OK [0.1879053696E10,TO_POSINF] --> [1879053696,1879053696] --> OK [0.1879053568E10,TO_POSINF] --> [1879053568,1879053568] --> OK [0.187905344E10,TO_POSINF] --> [1879053440,1879053440] --> OK [0.1879053312E10,TO_POSINF] --> [1879053312,1879053312] --> OK [0.1879053184E10,TO_POSINF] --> [1879053184,1879053184] --> OK [0.1879053056E10,TO_POSINF] --> [1879053056,1879053056] --> OK [0.1879052928E10,TO_POSINF] --> [1879052928,1879052928] --> OK [0.18790528E10,TO_POSINF] --> [1879052800,1879052800] --> OK [0.1879052672E10,TO_POSINF] --> [1879052672,1879052672] --> OK [0.1879052544E10,TO_POSINF] --> [1879052544,1879052544] --> OK [0.1879052416E10,TO_POSINF] --> [1879052416,1879052416] --> OK [0.1879052288E10,TO_POSINF] --> [1879052288,1879052288] --> OK [0.187905216E10,TO_POSINF] --> [1879052160,1879052160] --> OK [0.1879052032E10,TO_POSINF] --> [1879052032,1879052032] --> OK [0.1879051904E10,TO_POSINF] --> [1879051904,1879051904] --> OK [0.1879051776E10,TO_POSINF] --> [1879051776,1879051776] --> OK [0.1879051648E10,TO_POSINF] --> [1879051648,1879051648] --> OK [0.187905152E10,TO_POSINF] --> [1879051520,1879051520] --> OK [0.1879051392E10,TO_POSINF] --> [1879051392,1879051392] --> OK [0.1879051264E10,TO_POSINF] --> [1879051264,1879051264] --> OK [0.1879051136E10,TO_POSINF] --> [1879051136,1879051136] --> OK [0.1879051008E10,TO_POSINF] --> [1879051008,1879051008] --> OK [0.187905088E10,TO_POSINF] --> [1879050880,1879050880] --> OK [0.1879050752E10,TO_POSINF] --> [1879050752,1879050752] --> OK [0.1879050624E10,TO_POSINF] --> [1879050624,1879050624] --> OK [0.1879050496E10,TO_POSINF] --> [1879050496,1879050496] --> OK [0.1879050368E10,TO_POSINF] --> [1879050368,1879050368] --> OK [0.187905024E10,TO_POSINF] --> [1879050240,1879050240] --> OK [0.1879050112E10,TO_POSINF] --> [1879050112,1879050112] --> OK [0.1879049984E10,TO_POSINF] --> [1879049984,1879049984] --> OK [0.1879049856E10,TO_POSINF] --> [1879049856,1879049856] --> OK [0.1879049728E10,TO_POSINF] --> [1879049728,1879049728] --> OK [0.18790496E10,TO_POSINF] --> [1879049600,1879049600] --> OK [0.1879049472E10,TO_POSINF] --> [1879049472,1879049472] --> OK [0.1879049344E10,TO_POSINF] --> [1879049344,1879049344] --> OK [0.1879049216E10,TO_POSINF] --> [1879049216,1879049216] --> OK [0.1879049088E10,TO_POSINF] --> [1879049088,1879049088] --> OK [0.187904896E10,TO_POSINF] --> [1879048960,1879048960] --> OK [0.1879048832E10,TO_POSINF] --> [1879048832,1879048832] --> OK [0.1879048704E10,TO_POSINF] --> [1879048704,1879048704] --> OK [0.1879048576E10,TO_POSINF] --> [1879048576,1879048576] --> OK [0.1879048448E10,TO_POSINF] --> [1879048448,1879048448] --> OK [0.187904832E10,TO_POSINF] --> [1879048320,1879048320] --> OK [0.2013257728E10,TO_POSINF] --> [2013257728,2013257728] --> OK [0.2013257856E10,TO_POSINF] --> [2013257856,2013257856] --> OK [0.2013257984E10,TO_POSINF] --> [2013257984,2013257984] --> OK [0.2013258112E10,TO_POSINF] --> [2013258112,2013258112] --> OK [0.201325824E10,TO_POSINF] --> [2013258240,2013258240] --> OK [0.2013258368E10,TO_POSINF] --> [2013258368,2013258368] --> OK [0.2013258496E10,TO_POSINF] --> [2013258496,2013258496] --> OK [0.2013258624E10,TO_POSINF] --> [2013258624,2013258624] --> OK [0.2013258752E10,TO_POSINF] --> [2013258752,2013258752] --> OK [0.201325888E10,TO_POSINF] --> [2013258880,2013258880] --> OK [0.2013259008E10,TO_POSINF] --> [2013259008,2013259008] --> OK [0.2013259136E10,TO_POSINF] --> [2013259136,2013259136] --> OK [0.2013259264E10,TO_POSINF] --> [2013259264,2013259264] --> OK [0.2013259392E10,TO_POSINF] --> [2013259392,2013259392] --> OK [0.201325952E10,TO_POSINF] --> [2013259520,2013259520] --> OK [0.2013259648E10,TO_POSINF] --> [2013259648,2013259648] --> OK [0.2013259776E10,TO_POSINF] --> [2013259776,2013259776] --> OK [0.2013259904E10,TO_POSINF] --> [2013259904,2013259904] --> OK [0.2013260032E10,TO_POSINF] --> [2013260032,2013260032] --> OK [0.201326016E10,TO_POSINF] --> [2013260160,2013260160] --> OK [0.2013260288E10,TO_POSINF] --> [2013260288,2013260288] --> OK [0.2013260416E10,TO_POSINF] --> [2013260416,2013260416] --> OK [0.2013260544E10,TO_POSINF] --> [2013260544,2013260544] --> OK [0.2013260672E10,TO_POSINF] --> [2013260672,2013260672] --> OK [0.20132608E10,TO_POSINF] --> [2013260800,2013260800] --> OK [0.2013260928E10,TO_POSINF] --> [2013260928,2013260928] --> OK [0.2013261056E10,TO_POSINF] --> [2013261056,2013261056] --> OK [0.2013261184E10,TO_POSINF] --> [2013261184,2013261184] --> OK [0.2013261312E10,TO_POSINF] --> [2013261312,2013261312] --> OK [0.201326144E10,TO_POSINF] --> [2013261440,2013261440] --> OK [0.2013261568E10,TO_POSINF] --> [2013261568,2013261568] --> OK [0.2013261696E10,TO_POSINF] --> [2013261696,2013261696] --> OK [0.2013261824E10,TO_POSINF] --> [2013261824,2013261824] --> OK [0.2013261952E10,TO_POSINF] --> [2013261952,2013261952] --> OK [0.201326208E10,TO_POSINF] --> [2013262080,2013262080] --> OK [0.2013262208E10,TO_POSINF] --> [2013262208,2013262208] --> OK [0.2013262336E10,TO_POSINF] --> [2013262336,2013262336] --> OK [0.2013262464E10,TO_POSINF] --> [2013262464,2013262464] --> OK [0.2013262592E10,TO_POSINF] --> [2013262592,2013262592] --> OK [0.201326272E10,TO_POSINF] --> [2013262720,2013262720] --> OK [0.2013262848E10,TO_POSINF] --> [2013262848,2013262848] --> OK [0.2013262976E10,TO_POSINF] --> [2013262976,2013262976] --> OK [0.2013263104E10,TO_POSINF] --> [2013263104,2013263104] --> OK [0.2013263232E10,TO_POSINF] --> [2013263232,2013263232] --> OK [0.201326336E10,TO_POSINF] --> [2013263360,2013263360] --> OK [0.2013263488E10,TO_POSINF] --> [2013263488,2013263488] --> OK [0.2013263616E10,TO_POSINF] --> [2013263616,2013263616] --> OK [0.2013263744E10,TO_POSINF] --> [2013263744,2013263744] --> OK [0.2013263872E10,TO_POSINF] --> [2013263872,2013263872] --> OK [0.2013264E10,TO_POSINF] --> [2013264000,2013264000] --> OK [0.2013264128E10,TO_POSINF] --> [2013264128,2013264128] --> OK [0.2013264256E10,TO_POSINF] --> [2013264256,2013264256] --> OK [0.2013264384E10,TO_POSINF] --> [2013264384,2013264384] --> OK [0.2013264512E10,TO_POSINF] --> [2013264512,2013264512] --> OK [0.201326464E10,TO_POSINF] --> [2013264640,2013264640] --> OK [0.2013264768E10,TO_POSINF] --> [2013264768,2013264768] --> OK [0.2013264896E10,TO_POSINF] --> [2013264896,2013264896] --> OK [0.2013265024E10,TO_POSINF] --> [2013265024,2013265024] --> OK [0.2013265152E10,TO_POSINF] --> [2013265152,2013265152] --> OK [0.201326528E10,TO_POSINF] --> [2013265280,2013265280] --> OK [0.2013265408E10,TO_POSINF] --> [2013265408,2013265408] --> OK [0.2013265536E10,TO_POSINF] --> [2013265536,2013265536] --> OK [0.2013265664E10,TO_POSINF] --> [2013265664,2013265664] --> OK [0.2013265792E10,TO_POSINF] --> [2013265792,2013265792] --> OK [0.201326592E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013274112E10,TO_POSINF] --> [2013274112,2013274112] --> OK [0.2013273984E10,TO_POSINF] --> [2013273984,2013273984] --> OK [0.2013273856E10,TO_POSINF] --> [2013273856,2013273856] --> OK [0.2013273728E10,TO_POSINF] --> [2013273728,2013273728] --> OK [0.20132736E10,TO_POSINF] --> [2013273600,2013273600] --> OK [0.2013273472E10,TO_POSINF] --> [2013273472,2013273472] --> OK [0.2013273344E10,TO_POSINF] --> [2013273344,2013273344] --> OK [0.2013273216E10,TO_POSINF] --> [2013273216,2013273216] --> OK [0.2013273088E10,TO_POSINF] --> [2013273088,2013273088] --> OK [0.201327296E10,TO_POSINF] --> [2013272960,2013272960] --> OK [0.2013272832E10,TO_POSINF] --> [2013272832,2013272832] --> OK [0.2013272704E10,TO_POSINF] --> [2013272704,2013272704] --> OK [0.2013272576E10,TO_POSINF] --> [2013272576,2013272576] --> OK [0.2013272448E10,TO_POSINF] --> [2013272448,2013272448] --> OK [0.201327232E10,TO_POSINF] --> [2013272320,2013272320] --> OK [0.2013272192E10,TO_POSINF] --> [2013272192,2013272192] --> OK [0.2013272064E10,TO_POSINF] --> [2013272064,2013272064] --> OK [0.2013271936E10,TO_POSINF] --> [2013271936,2013271936] --> OK [0.2013271808E10,TO_POSINF] --> [2013271808,2013271808] --> OK [0.201327168E10,TO_POSINF] --> [2013271680,2013271680] --> OK [0.2013271552E10,TO_POSINF] --> [2013271552,2013271552] --> OK [0.2013271424E10,TO_POSINF] --> [2013271424,2013271424] --> OK [0.2013271296E10,TO_POSINF] --> [2013271296,2013271296] --> OK [0.2013271168E10,TO_POSINF] --> [2013271168,2013271168] --> OK [0.201327104E10,TO_POSINF] --> [2013271040,2013271040] --> OK [0.2013270912E10,TO_POSINF] --> [2013270912,2013270912] --> OK [0.2013270784E10,TO_POSINF] --> [2013270784,2013270784] --> OK [0.2013270656E10,TO_POSINF] --> [2013270656,2013270656] --> OK [0.2013270528E10,TO_POSINF] --> [2013270528,2013270528] --> OK [0.20132704E10,TO_POSINF] --> [2013270400,2013270400] --> OK [0.2013270272E10,TO_POSINF] --> [2013270272,2013270272] --> OK [0.2013270144E10,TO_POSINF] --> [2013270144,2013270144] --> OK [0.2013270016E10,TO_POSINF] --> [2013270016,2013270016] --> OK [0.2013269888E10,TO_POSINF] --> [2013269888,2013269888] --> OK [0.201326976E10,TO_POSINF] --> [2013269760,2013269760] --> OK [0.2013269632E10,TO_POSINF] --> [2013269632,2013269632] --> OK [0.2013269504E10,TO_POSINF] --> [2013269504,2013269504] --> OK [0.2013269376E10,TO_POSINF] --> [2013269376,2013269376] --> OK [0.2013269248E10,TO_POSINF] --> [2013269248,2013269248] --> OK [0.201326912E10,TO_POSINF] --> [2013269120,2013269120] --> OK [0.2013268992E10,TO_POSINF] --> [2013268992,2013268992] --> OK [0.2013268864E10,TO_POSINF] --> [2013268864,2013268864] --> OK [0.2013268736E10,TO_POSINF] --> [2013268736,2013268736] --> OK [0.2013268608E10,TO_POSINF] --> [2013268608,2013268608] --> OK [0.201326848E10,TO_POSINF] --> [2013268480,2013268480] --> OK [0.2013268352E10,TO_POSINF] --> [2013268352,2013268352] --> OK [0.2013268224E10,TO_POSINF] --> [2013268224,2013268224] --> OK [0.2013268096E10,TO_POSINF] --> [2013268096,2013268096] --> OK [0.2013267968E10,TO_POSINF] --> [2013267968,2013267968] --> OK [0.201326784E10,TO_POSINF] --> [2013267840,2013267840] --> OK [0.2013267712E10,TO_POSINF] --> [2013267712,2013267712] --> OK [0.2013267584E10,TO_POSINF] --> [2013267584,2013267584] --> OK [0.2013267456E10,TO_POSINF] --> [2013267456,2013267456] --> OK [0.2013267328E10,TO_POSINF] --> [2013267328,2013267328] --> OK [0.20132672E10,TO_POSINF] --> [2013267200,2013267200] --> OK [0.2013267072E10,TO_POSINF] --> [2013267072,2013267072] --> OK [0.2013266944E10,TO_POSINF] --> [2013266944,2013266944] --> OK [0.2013266816E10,TO_POSINF] --> [2013266816,2013266816] --> OK [0.2013266688E10,TO_POSINF] --> [2013266688,2013266688] --> OK [0.201326656E10,TO_POSINF] --> [2013266560,2013266560] --> OK [0.2013266432E10,TO_POSINF] --> [2013266432,2013266432] --> OK [0.2013266304E10,TO_POSINF] --> [2013266304,2013266304] --> OK [0.2013266176E10,TO_POSINF] --> [2013266176,2013266176] --> OK [0.2013266048E10,TO_POSINF] --> [2013266048,2013266048] --> OK [0.2080366592E10,TO_POSINF] --> [2080366592,2080366592] --> OK [0.208036672E10,TO_POSINF] --> [2080366720,2080366720] --> OK [0.2080366848E10,TO_POSINF] --> [2080366848,2080366848] --> OK [0.2080366976E10,TO_POSINF] --> [2080366976,2080366976] --> OK [0.2080367104E10,TO_POSINF] --> [2080367104,2080367104] --> OK [0.2080367232E10,TO_POSINF] --> [2080367232,2080367232] --> OK [0.208036736E10,TO_POSINF] --> [2080367360,2080367360] --> OK [0.2080367488E10,TO_POSINF] --> [2080367488,2080367488] --> OK [0.2080367616E10,TO_POSINF] --> [2080367616,2080367616] --> OK [0.2080367744E10,TO_POSINF] --> [2080367744,2080367744] --> OK [0.2080367872E10,TO_POSINF] --> [2080367872,2080367872] --> OK [0.2080368E10,TO_POSINF] --> [2080368000,2080368000] --> OK [0.2080368128E10,TO_POSINF] --> [2080368128,2080368128] --> OK [0.2080368256E10,TO_POSINF] --> [2080368256,2080368256] --> OK [0.2080368384E10,TO_POSINF] --> [2080368384,2080368384] --> OK [0.2080368512E10,TO_POSINF] --> [2080368512,2080368512] --> OK [0.208036864E10,TO_POSINF] --> [2080368640,2080368640] --> OK [0.2080368768E10,TO_POSINF] --> [2080368768,2080368768] --> OK [0.2080368896E10,TO_POSINF] --> [2080368896,2080368896] --> OK [0.2080369024E10,TO_POSINF] --> [2080369024,2080369024] --> OK [0.2080369152E10,TO_POSINF] --> [2080369152,2080369152] --> OK [0.208036928E10,TO_POSINF] --> [2080369280,2080369280] --> OK [0.2080369408E10,TO_POSINF] --> [2080369408,2080369408] --> OK [0.2080369536E10,TO_POSINF] --> [2080369536,2080369536] --> OK [0.2080369664E10,TO_POSINF] --> [2080369664,2080369664] --> OK [0.2080369792E10,TO_POSINF] --> [2080369792,2080369792] --> OK [0.208036992E10,TO_POSINF] --> [2080369920,2080369920] --> OK [0.2080370048E10,TO_POSINF] --> [2080370048,2080370048] --> OK [0.2080370176E10,TO_POSINF] --> [2080370176,2080370176] --> OK [0.2080370304E10,TO_POSINF] --> [2080370304,2080370304] --> OK [0.2080370432E10,TO_POSINF] --> [2080370432,2080370432] --> OK [0.208037056E10,TO_POSINF] --> [2080370560,2080370560] --> OK [0.2080370688E10,TO_POSINF] --> [2080370688,2080370688] --> OK [0.2080370816E10,TO_POSINF] --> [2080370816,2080370816] --> OK [0.2080370944E10,TO_POSINF] --> [2080370944,2080370944] --> OK [0.2080371072E10,TO_POSINF] --> [2080371072,2080371072] --> OK [0.20803712E10,TO_POSINF] --> [2080371200,2080371200] --> OK [0.2080371328E10,TO_POSINF] --> [2080371328,2080371328] --> OK [0.2080371456E10,TO_POSINF] --> [2080371456,2080371456] --> OK [0.2080371584E10,TO_POSINF] --> [2080371584,2080371584] --> OK [0.2080371712E10,TO_POSINF] --> [2080371712,2080371712] --> OK [0.208037184E10,TO_POSINF] --> [2080371840,2080371840] --> OK [0.2080371968E10,TO_POSINF] --> [2080371968,2080371968] --> OK [0.2080372096E10,TO_POSINF] --> [2080372096,2080372096] --> OK [0.2080372224E10,TO_POSINF] --> [2080372224,2080372224] --> OK [0.2080372352E10,TO_POSINF] --> [2080372352,2080372352] --> OK [0.208037248E10,TO_POSINF] --> [2080372480,2080372480] --> OK [0.2080372608E10,TO_POSINF] --> [2080372608,2080372608] --> OK [0.2080372736E10,TO_POSINF] --> [2080372736,2080372736] --> OK [0.2080372864E10,TO_POSINF] --> [2080372864,2080372864] --> OK [0.2080372992E10,TO_POSINF] --> [2080372992,2080372992] --> OK [0.208037312E10,TO_POSINF] --> [2080373120,2080373120] --> OK [0.2080373248E10,TO_POSINF] --> [2080373248,2080373248] --> OK [0.2080373376E10,TO_POSINF] --> [2080373376,2080373376] --> OK [0.2080373504E10,TO_POSINF] --> [2080373504,2080373504] --> OK [0.2080373632E10,TO_POSINF] --> [2080373632,2080373632] --> OK [0.208037376E10,TO_POSINF] --> [2080373760,2080373760] --> OK [0.2080373888E10,TO_POSINF] --> [2080373888,2080373888] --> OK [0.2080374016E10,TO_POSINF] --> [2080374016,2080374016] --> OK [0.2080374144E10,TO_POSINF] --> [2080374144,2080374144] --> OK [0.2080374272E10,TO_POSINF] --> [2080374272,2080374272] --> OK [0.20803744E10,TO_POSINF] --> [2080374400,2080374400] --> OK [0.2080374528E10,TO_POSINF] --> [2080374528,2080374528] --> OK [0.2080374656E10,TO_POSINF] --> [2080374656,2080374656] --> OK [0.2080374784E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080382976E10,TO_POSINF] --> [2080382976,2080382976] --> OK [0.2080382848E10,TO_POSINF] --> [2080382848,2080382848] --> OK [0.208038272E10,TO_POSINF] --> [2080382720,2080382720] --> OK [0.2080382592E10,TO_POSINF] --> [2080382592,2080382592] --> OK [0.2080382464E10,TO_POSINF] --> [2080382464,2080382464] --> OK [0.2080382336E10,TO_POSINF] --> [2080382336,2080382336] --> OK [0.2080382208E10,TO_POSINF] --> [2080382208,2080382208] --> OK [0.208038208E10,TO_POSINF] --> [2080382080,2080382080] --> OK [0.2080381952E10,TO_POSINF] --> [2080381952,2080381952] --> OK [0.2080381824E10,TO_POSINF] --> [2080381824,2080381824] --> OK [0.2080381696E10,TO_POSINF] --> [2080381696,2080381696] --> OK [0.2080381568E10,TO_POSINF] --> [2080381568,2080381568] --> OK [0.208038144E10,TO_POSINF] --> [2080381440,2080381440] --> OK [0.2080381312E10,TO_POSINF] --> [2080381312,2080381312] --> OK [0.2080381184E10,TO_POSINF] --> [2080381184,2080381184] --> OK [0.2080381056E10,TO_POSINF] --> [2080381056,2080381056] --> OK [0.2080380928E10,TO_POSINF] --> [2080380928,2080380928] --> OK [0.20803808E10,TO_POSINF] --> [2080380800,2080380800] --> OK [0.2080380672E10,TO_POSINF] --> [2080380672,2080380672] --> OK [0.2080380544E10,TO_POSINF] --> [2080380544,2080380544] --> OK [0.2080380416E10,TO_POSINF] --> [2080380416,2080380416] --> OK [0.2080380288E10,TO_POSINF] --> [2080380288,2080380288] --> OK [0.208038016E10,TO_POSINF] --> [2080380160,2080380160] --> OK [0.2080380032E10,TO_POSINF] --> [2080380032,2080380032] --> OK [0.2080379904E10,TO_POSINF] --> [2080379904,2080379904] --> OK [0.2080379776E10,TO_POSINF] --> [2080379776,2080379776] --> OK [0.2080379648E10,TO_POSINF] --> [2080379648,2080379648] --> OK [0.208037952E10,TO_POSINF] --> [2080379520,2080379520] --> OK [0.2080379392E10,TO_POSINF] --> [2080379392,2080379392] --> OK [0.2080379264E10,TO_POSINF] --> [2080379264,2080379264] --> OK [0.2080379136E10,TO_POSINF] --> [2080379136,2080379136] --> OK [0.2080379008E10,TO_POSINF] --> [2080379008,2080379008] --> OK [0.208037888E10,TO_POSINF] --> [2080378880,2080378880] --> OK [0.2080378752E10,TO_POSINF] --> [2080378752,2080378752] --> OK [0.2080378624E10,TO_POSINF] --> [2080378624,2080378624] --> OK [0.2080378496E10,TO_POSINF] --> [2080378496,2080378496] --> OK [0.2080378368E10,TO_POSINF] --> [2080378368,2080378368] --> OK [0.208037824E10,TO_POSINF] --> [2080378240,2080378240] --> OK [0.2080378112E10,TO_POSINF] --> [2080378112,2080378112] --> OK [0.2080377984E10,TO_POSINF] --> [2080377984,2080377984] --> OK [0.2080377856E10,TO_POSINF] --> [2080377856,2080377856] --> OK [0.2080377728E10,TO_POSINF] --> [2080377728,2080377728] --> OK [0.20803776E10,TO_POSINF] --> [2080377600,2080377600] --> OK [0.2080377472E10,TO_POSINF] --> [2080377472,2080377472] --> OK [0.2080377344E10,TO_POSINF] --> [2080377344,2080377344] --> OK [0.2080377216E10,TO_POSINF] --> [2080377216,2080377216] --> OK [0.2080377088E10,TO_POSINF] --> [2080377088,2080377088] --> OK [0.208037696E10,TO_POSINF] --> [2080376960,2080376960] --> OK [0.2080376832E10,TO_POSINF] --> [2080376832,2080376832] --> OK [0.2080376704E10,TO_POSINF] --> [2080376704,2080376704] --> OK [0.2080376576E10,TO_POSINF] --> [2080376576,2080376576] --> OK [0.2080376448E10,TO_POSINF] --> [2080376448,2080376448] --> OK [0.208037632E10,TO_POSINF] --> [2080376320,2080376320] --> OK [0.2080376192E10,TO_POSINF] --> [2080376192,2080376192] --> OK [0.2080376064E10,TO_POSINF] --> [2080376064,2080376064] --> OK [0.2080375936E10,TO_POSINF] --> [2080375936,2080375936] --> OK [0.2080375808E10,TO_POSINF] --> [2080375808,2080375808] --> OK [0.208037568E10,TO_POSINF] --> [2080375680,2080375680] --> OK [0.2080375552E10,TO_POSINF] --> [2080375552,2080375552] --> OK [0.2080375424E10,TO_POSINF] --> [2080375424,2080375424] --> OK [0.2080375296E10,TO_POSINF] --> [2080375296,2080375296] --> OK [0.2080375168E10,TO_POSINF] --> [2080375168,2080375168] --> OK [0.208037504E10,TO_POSINF] --> [2080375040,2080375040] --> OK [0.2080374912E10,TO_POSINF] --> [2080374912,2080374912] --> OK [0.2113921024E10,TO_POSINF] --> [2113921024,2113921024] --> OK [0.2113921152E10,TO_POSINF] --> [2113921152,2113921152] --> OK [0.211392128E10,TO_POSINF] --> [2113921280,2113921280] --> OK [0.2113921408E10,TO_POSINF] --> [2113921408,2113921408] --> OK [0.2113921536E10,TO_POSINF] --> [2113921536,2113921536] --> OK [0.2113921664E10,TO_POSINF] --> [2113921664,2113921664] --> OK [0.2113921792E10,TO_POSINF] --> [2113921792,2113921792] --> OK [0.211392192E10,TO_POSINF] --> [2113921920,2113921920] --> OK [0.2113922048E10,TO_POSINF] --> [2113922048,2113922048] --> OK [0.2113922176E10,TO_POSINF] --> [2113922176,2113922176] --> OK [0.2113922304E10,TO_POSINF] --> [2113922304,2113922304] --> OK [0.2113922432E10,TO_POSINF] --> [2113922432,2113922432] --> OK [0.211392256E10,TO_POSINF] --> [2113922560,2113922560] --> OK [0.2113922688E10,TO_POSINF] --> [2113922688,2113922688] --> OK [0.2113922816E10,TO_POSINF] --> [2113922816,2113922816] --> OK [0.2113922944E10,TO_POSINF] --> [2113922944,2113922944] --> OK [0.2113923072E10,TO_POSINF] --> [2113923072,2113923072] --> OK [0.21139232E10,TO_POSINF] --> [2113923200,2113923200] --> OK [0.2113923328E10,TO_POSINF] --> [2113923328,2113923328] --> OK [0.2113923456E10,TO_POSINF] --> [2113923456,2113923456] --> OK [0.2113923584E10,TO_POSINF] --> [2113923584,2113923584] --> OK [0.2113923712E10,TO_POSINF] --> [2113923712,2113923712] --> OK [0.211392384E10,TO_POSINF] --> [2113923840,2113923840] --> OK [0.2113923968E10,TO_POSINF] --> [2113923968,2113923968] --> OK [0.2113924096E10,TO_POSINF] --> [2113924096,2113924096] --> OK [0.2113924224E10,TO_POSINF] --> [2113924224,2113924224] --> OK [0.2113924352E10,TO_POSINF] --> [2113924352,2113924352] --> OK [0.211392448E10,TO_POSINF] --> [2113924480,2113924480] --> OK [0.2113924608E10,TO_POSINF] --> [2113924608,2113924608] --> OK [0.2113924736E10,TO_POSINF] --> [2113924736,2113924736] --> OK [0.2113924864E10,TO_POSINF] --> [2113924864,2113924864] --> OK [0.2113924992E10,TO_POSINF] --> [2113924992,2113924992] --> OK [0.211392512E10,TO_POSINF] --> [2113925120,2113925120] --> OK [0.2113925248E10,TO_POSINF] --> [2113925248,2113925248] --> OK [0.2113925376E10,TO_POSINF] --> [2113925376,2113925376] --> OK [0.2113925504E10,TO_POSINF] --> [2113925504,2113925504] --> OK [0.2113925632E10,TO_POSINF] --> [2113925632,2113925632] --> OK [0.211392576E10,TO_POSINF] --> [2113925760,2113925760] --> OK [0.2113925888E10,TO_POSINF] --> [2113925888,2113925888] --> OK [0.2113926016E10,TO_POSINF] --> [2113926016,2113926016] --> OK [0.2113926144E10,TO_POSINF] --> [2113926144,2113926144] --> OK [0.2113926272E10,TO_POSINF] --> [2113926272,2113926272] --> OK [0.21139264E10,TO_POSINF] --> [2113926400,2113926400] --> OK [0.2113926528E10,TO_POSINF] --> [2113926528,2113926528] --> OK [0.2113926656E10,TO_POSINF] --> [2113926656,2113926656] --> OK [0.2113926784E10,TO_POSINF] --> [2113926784,2113926784] --> OK [0.2113926912E10,TO_POSINF] --> [2113926912,2113926912] --> OK [0.211392704E10,TO_POSINF] --> [2113927040,2113927040] --> OK [0.2113927168E10,TO_POSINF] --> [2113927168,2113927168] --> OK [0.2113927296E10,TO_POSINF] --> [2113927296,2113927296] --> OK [0.2113927424E10,TO_POSINF] --> [2113927424,2113927424] --> OK [0.2113927552E10,TO_POSINF] --> [2113927552,2113927552] --> OK [0.211392768E10,TO_POSINF] --> [2113927680,2113927680] --> OK [0.2113927808E10,TO_POSINF] --> [2113927808,2113927808] --> OK [0.2113927936E10,TO_POSINF] --> [2113927936,2113927936] --> OK [0.2113928064E10,TO_POSINF] --> [2113928064,2113928064] --> OK [0.2113928192E10,TO_POSINF] --> [2113928192,2113928192] --> OK [0.211392832E10,TO_POSINF] --> [2113928320,2113928320] --> OK [0.2113928448E10,TO_POSINF] --> [2113928448,2113928448] --> OK [0.2113928576E10,TO_POSINF] --> [2113928576,2113928576] --> OK [0.2113928704E10,TO_POSINF] --> [2113928704,2113928704] --> OK [0.2113928832E10,TO_POSINF] --> [2113928832,2113928832] --> OK [0.211392896E10,TO_POSINF] --> [2113928960,2113928960] --> OK [0.2113929088E10,TO_POSINF] --> [2113929088,2113929088] --> OK [0.2113929216E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113937408E10,TO_POSINF] --> [2113937408,2113937408] --> OK [0.211393728E10,TO_POSINF] --> [2113937280,2113937280] --> OK [0.2113937152E10,TO_POSINF] --> [2113937152,2113937152] --> OK [0.2113937024E10,TO_POSINF] --> [2113937024,2113937024] --> OK [0.2113936896E10,TO_POSINF] --> [2113936896,2113936896] --> OK [0.2113936768E10,TO_POSINF] --> [2113936768,2113936768] --> OK [0.211393664E10,TO_POSINF] --> [2113936640,2113936640] --> OK [0.2113936512E10,TO_POSINF] --> [2113936512,2113936512] --> OK [0.2113936384E10,TO_POSINF] --> [2113936384,2113936384] --> OK [0.2113936256E10,TO_POSINF] --> [2113936256,2113936256] --> OK [0.2113936128E10,TO_POSINF] --> [2113936128,2113936128] --> OK [0.2113936E10,TO_POSINF] --> [2113936000,2113936000] --> OK [0.2113935872E10,TO_POSINF] --> [2113935872,2113935872] --> OK [0.2113935744E10,TO_POSINF] --> [2113935744,2113935744] --> OK [0.2113935616E10,TO_POSINF] --> [2113935616,2113935616] --> OK [0.2113935488E10,TO_POSINF] --> [2113935488,2113935488] --> OK [0.211393536E10,TO_POSINF] --> [2113935360,2113935360] --> OK [0.2113935232E10,TO_POSINF] --> [2113935232,2113935232] --> OK [0.2113935104E10,TO_POSINF] --> [2113935104,2113935104] --> OK [0.2113934976E10,TO_POSINF] --> [2113934976,2113934976] --> OK [0.2113934848E10,TO_POSINF] --> [2113934848,2113934848] --> OK [0.211393472E10,TO_POSINF] --> [2113934720,2113934720] --> OK [0.2113934592E10,TO_POSINF] --> [2113934592,2113934592] --> OK [0.2113934464E10,TO_POSINF] --> [2113934464,2113934464] --> OK [0.2113934336E10,TO_POSINF] --> [2113934336,2113934336] --> OK [0.2113934208E10,TO_POSINF] --> [2113934208,2113934208] --> OK [0.211393408E10,TO_POSINF] --> [2113934080,2113934080] --> OK [0.2113933952E10,TO_POSINF] --> [2113933952,2113933952] --> OK [0.2113933824E10,TO_POSINF] --> [2113933824,2113933824] --> OK [0.2113933696E10,TO_POSINF] --> [2113933696,2113933696] --> OK [0.2113933568E10,TO_POSINF] --> [2113933568,2113933568] --> OK [0.211393344E10,TO_POSINF] --> [2113933440,2113933440] --> OK [0.2113933312E10,TO_POSINF] --> [2113933312,2113933312] --> OK [0.2113933184E10,TO_POSINF] --> [2113933184,2113933184] --> OK [0.2113933056E10,TO_POSINF] --> [2113933056,2113933056] --> OK [0.2113932928E10,TO_POSINF] --> [2113932928,2113932928] --> OK [0.21139328E10,TO_POSINF] --> [2113932800,2113932800] --> OK [0.2113932672E10,TO_POSINF] --> [2113932672,2113932672] --> OK [0.2113932544E10,TO_POSINF] --> [2113932544,2113932544] --> OK [0.2113932416E10,TO_POSINF] --> [2113932416,2113932416] --> OK [0.2113932288E10,TO_POSINF] --> [2113932288,2113932288] --> OK [0.211393216E10,TO_POSINF] --> [2113932160,2113932160] --> OK [0.2113932032E10,TO_POSINF] --> [2113932032,2113932032] --> OK [0.2113931904E10,TO_POSINF] --> [2113931904,2113931904] --> OK [0.2113931776E10,TO_POSINF] --> [2113931776,2113931776] --> OK [0.2113931648E10,TO_POSINF] --> [2113931648,2113931648] --> OK [0.211393152E10,TO_POSINF] --> [2113931520,2113931520] --> OK [0.2113931392E10,TO_POSINF] --> [2113931392,2113931392] --> OK [0.2113931264E10,TO_POSINF] --> [2113931264,2113931264] --> OK [0.2113931136E10,TO_POSINF] --> [2113931136,2113931136] --> OK [0.2113931008E10,TO_POSINF] --> [2113931008,2113931008] --> OK [0.211393088E10,TO_POSINF] --> [2113930880,2113930880] --> OK [0.2113930752E10,TO_POSINF] --> [2113930752,2113930752] --> OK [0.2113930624E10,TO_POSINF] --> [2113930624,2113930624] --> OK [0.2113930496E10,TO_POSINF] --> [2113930496,2113930496] --> OK [0.2113930368E10,TO_POSINF] --> [2113930368,2113930368] --> OK [0.211393024E10,TO_POSINF] --> [2113930240,2113930240] --> OK [0.2113930112E10,TO_POSINF] --> [2113930112,2113930112] --> OK [0.2113929984E10,TO_POSINF] --> [2113929984,2113929984] --> OK [0.2113929856E10,TO_POSINF] --> [2113929856,2113929856] --> OK [0.2113929728E10,TO_POSINF] --> [2113929728,2113929728] --> OK [0.21139296E10,TO_POSINF] --> [2113929600,2113929600] --> OK [0.2113929472E10,TO_POSINF] --> [2113929472,2113929472] --> OK [0.2113929344E10,TO_POSINF] --> [2113929344,2113929344] --> OK [0.2147475456E10,TO_POSINF] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_POSINF] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_POSINF] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_POSINF] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_POSINF] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_POSINF] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_POSINF] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_POSINF] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_POSINF] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_POSINF] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_POSINF] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_POSINF] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_POSINF] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_POSINF] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_POSINF] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_POSINF] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_POSINF] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_POSINF] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_POSINF] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_POSINF] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_POSINF] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_POSINF] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_POSINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_POSINF] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_POSINF] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_POSINF] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_POSINF] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_POSINF] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_POSINF] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_POSINF] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_POSINF] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_POSINF] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_POSINF] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_POSINF] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_POSINF] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_POSINF] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_POSINF] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_POSINF] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_POSINF] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_POSINF] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_POSINF] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_POSINF] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_POSINF] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_POSINF] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_POSINF] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_POSINF] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_POSINF] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_POSINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_POSINF] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_POSINF] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_POSINF] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_POSINF] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_POSINF] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_POSINF] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_POSINF] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_POSINF] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_POSINF] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_POSINF] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_POSINF] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_POSINF] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_POSINF] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_POSINF] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_POSINF] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_POSINF] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_POSINF] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_POSINF] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_POSINF] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_POSINF] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_POSINF] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_POSINF] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_POSINF] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_POSINF] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_POSINF] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_POSINF] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_POSINF] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_POSINF] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_POSINF] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_POSINF] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_POSINF] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_POSINF] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_POSINF] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_POSINF] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_POSINF] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_POSINF] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_POSINF] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_POSINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_POSINF] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_POSINF] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_POSINF] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_POSINF] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_POSINF] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_POSINF] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_POSINF] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_POSINF] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_POSINF] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_POSINF] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_POSINF] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_POSINF] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_POSINF] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_POSINF] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_POSINF] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_POSINF] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_POSINF] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_POSINF] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_POSINF] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_POSINF] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_POSINF] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_POSINF] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_POSINF] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_POSINF] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_POSINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_POSINF] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_POSINF] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_POSINF] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_POSINF] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_POSINF] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_POSINF] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_POSINF] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_POSINF] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_POSINF] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_POSINF] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_POSINF] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_POSINF] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_POSINF] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_POSINF] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_POSINF] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_POSINF] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_POSINF] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_POSINF] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_POSINF] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_POSINF] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_POSINF] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_POSINF] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_POSINF] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_POSINF] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_POSINF] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_POSINF] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_POSINF] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_POSINF] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_POSINF] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_POSINF] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_POSINF] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_POSINF] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_POSINF] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_POSINF] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_POSINF] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_POSINF] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_POSINF] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_POSINF] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_POSINF] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_POSINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_POSINF] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_POSINF] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_POSINF] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_POSINF] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_POSINF] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_POSINF] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_POSINF] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_POSINF] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_POSINF] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_POSINF] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_POSINF] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_POSINF] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_POSINF] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_POSINF] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_POSINF] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_POSINF] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_POSINF] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_POSINF] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_POSINF] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_POSINF] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_POSINF] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_POSINF] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_POSINF] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_POSINF] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_POSINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_POSINF] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_POSINF] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_POSINF] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_POSINF] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_POSINF] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_POSINF] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_POSINF] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_POSINF] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_POSINF] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_POSINF] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_POSINF] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_POSINF] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_POSINF] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_POSINF] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_POSINF] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_POSINF] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_POSINF] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_POSINF] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_POSINF] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_POSINF] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_POSINF] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_POSINF] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_POSINF] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_POSINF] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_POSINF] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_POSINF] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_POSINF] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_POSINF] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_POSINF] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_POSINF] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_POSINF] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_POSINF] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_POSINF] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_POSINF] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_POSINF] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_POSINF] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_POSINF] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_POSINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_POSINF] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_POSINF] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_POSINF] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_POSINF] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_POSINF] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_POSINF] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_POSINF] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_POSINF] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_POSINF] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_POSINF] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_POSINF] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_POSINF] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_POSINF] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_POSINF] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_POSINF] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_POSINF] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_POSINF] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_POSINF] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_POSINF] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_POSINF] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_POSINF] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_POSINF] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_POSINF] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_POSINF] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_POSINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_POSINF] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_POSINF] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_POSINF] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_POSINF] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_POSINF] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_POSINF] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_POSINF] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_POSINF] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_POSINF] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_POSINF] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_POSINF] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_POSINF] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_POSINF] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_POSINF] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_POSINF] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_POSINF] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_POSINF] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_POSINF] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_POSINF] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_POSINF] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_POSINF] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_POSINF] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_POSINF] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_POSINF] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_POSINF] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_POSINF] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_POSINF] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_POSINF] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_POSINF] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_POSINF] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_POSINF] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_POSINF] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_POSINF] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_POSINF] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_POSINF] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_POSINF] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_POSINF] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_POSINF] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_POSINF] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_POSINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_POSINF] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_POSINF] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_POSINF] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_POSINF] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_POSINF] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_POSINF] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_POSINF] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_POSINF] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_POSINF] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_POSINF] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_POSINF] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_POSINF] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_POSINF] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_POSINF] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_POSINF] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_POSINF] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_POSINF] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_POSINF] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_POSINF] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_POSINF] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_POSINF] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_POSINF] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_POSINF] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_POSINF] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_POSINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_POSINF] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_POSINF] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_POSINF] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_POSINF] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_POSINF] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_POSINF] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_POSINF] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_POSINF] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_POSINF] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_POSINF] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_POSINF] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_POSINF] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_POSINF] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_POSINF] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_POSINF] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_POSINF] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_POSINF] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_POSINF] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_POSINF] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_POSINF] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_POSINF] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_POSINF] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_POSINF] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_POSINF] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_POSINF] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_POSINF] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_POSINF] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_POSINF] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_POSINF] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_POSINF] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_POSINF] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_POSINF] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_POSINF] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_POSINF] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_POSINF] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_POSINF] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_POSINF] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_POSINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_POSINF] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_POSINF] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_POSINF] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_POSINF] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_POSINF] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_POSINF] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_POSINF] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_POSINF] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_POSINF] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_POSINF] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_POSINF] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_POSINF] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_POSINF] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_POSINF] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_POSINF] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_POSINF] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_POSINF] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_POSINF] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_POSINF] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_POSINF] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_POSINF] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_POSINF] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_POSINF] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_POSINF] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_POSINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_POSINF] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_POSINF] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_POSINF] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_POSINF] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_POSINF] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_POSINF] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_POSINF] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_POSINF] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_POSINF] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_POSINF] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_POSINF] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_POSINF] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_POSINF] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_POSINF] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_POSINF] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_POSINF] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_POSINF] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_POSINF] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_POSINF] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_POSINF] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_POSINF] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_POSINF] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_POSINF] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_POSINF] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_POSINF] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_POSINF] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_POSINF] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_POSINF] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_POSINF] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_POSINF] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_POSINF] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_POSINF] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_POSINF] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_POSINF] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_POSINF] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_POSINF] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_POSINF] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_POSINF] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_POSINF] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_POSINF] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_POSINF] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_POSINF] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_POSINF] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_POSINF] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_POSINF] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_POSINF] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_POSINF] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_POSINF] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_POSINF] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_POSINF] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_POSINF] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_POSINF] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_POSINF] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_POSINF] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_POSINF] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_POSINF] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_POSINF] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_POSINF] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_POSINF] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_POSINF] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_POSINF] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_POSINF] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_POSINF] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_POSINF] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_POSINF] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_POSINF] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_POSINF] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_POSINF] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_POSINF] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_POSINF] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_POSINF] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_POSINF] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_POSINF] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_POSINF] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_POSINF] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_POSINF] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_POSINF] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_POSINF] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_POSINF] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_POSINF] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_POSINF] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_POSINF] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_POSINF] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_POSINF] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_POSINF] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_POSINF] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_POSINF] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_POSINF] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_POSINF] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_POSINF] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_POSINF] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_POSINF] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_POSINF] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_POSINF] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_POSINF] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_POSINF] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_POSINF] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_POSINF] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_POSINF] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_POSINF] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_POSINF] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_POSINF] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_POSINF] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_POSINF] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_POSINF] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_POSINF] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_POSINF] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_POSINF] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_POSINF] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_POSINF] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_POSINF] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_POSINF] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_POSINF] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_POSINF] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_POSINF] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_POSINF] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_POSINF] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_POSINF] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_POSINF] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_POSINF] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_POSINF] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_POSINF] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_POSINF] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_POSINF] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_POSINF] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_POSINF] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_POSINF] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_POSINF] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_POSINF] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_POSINF] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_POSINF] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_POSINF] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_POSINF] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_POSINF] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_POSINF] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_POSINF] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_POSINF] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_POSINF] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_POSINF] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_POSINF] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_POSINF] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_POSINF] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_POSINF] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_POSINF] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_POSINF] --> [Overflow,2147483904] --> OK [~0.2147500032E10,TO_ZERO] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_ZERO] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_ZERO] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_ZERO] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_ZERO] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_ZERO] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_ZERO] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_ZERO] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_ZERO] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_ZERO] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_ZERO] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_ZERO] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_ZERO] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_ZERO] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_ZERO] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_ZERO] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_ZERO] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_ZERO] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_ZERO] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_ZERO] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_ZERO] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_ZERO] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_ZERO] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_ZERO] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_ZERO] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_ZERO] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_ZERO] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_ZERO] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_ZERO] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_ZERO] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_ZERO] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_ZERO] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_ZERO] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_ZERO] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_ZERO] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_ZERO] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_ZERO] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_ZERO] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_ZERO] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_ZERO] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_ZERO] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_ZERO] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_ZERO] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_ZERO] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_ZERO] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_ZERO] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_ZERO] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_ZERO] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_ZERO] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_ZERO] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_ZERO] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_ZERO] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_ZERO] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_ZERO] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_ZERO] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_ZERO] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_ZERO] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_ZERO] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_ZERO] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_ZERO] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_ZERO] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_ZERO] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_ZERO] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_ZERO] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_ZERO] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_ZERO] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_ZERO] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_ZERO] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_ZERO] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_ZERO] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_ZERO] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_ZERO] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_ZERO] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_ZERO] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_ZERO] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_ZERO] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_ZERO] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_ZERO] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_ZERO] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_ZERO] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_ZERO] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_ZERO] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_ZERO] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_ZERO] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_ZERO] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_ZERO] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_ZERO] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_ZERO] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_ZERO] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_ZERO] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_ZERO] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_ZERO] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_ZERO] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_ZERO] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_ZERO] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_ZERO] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_ZERO] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_ZERO] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_ZERO] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_ZERO] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_ZERO] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_ZERO] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_ZERO] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_ZERO] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_ZERO] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_ZERO] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_ZERO] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_ZERO] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_ZERO] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_ZERO] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_ZERO] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_ZERO] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_ZERO] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_ZERO] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_ZERO] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_ZERO] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_ZERO] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_ZERO] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_ZERO] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_ZERO] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_ZERO] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_ZERO] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_ZERO] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_ZERO] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_ZERO] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_ZERO] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_ZERO] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_ZERO] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_ZERO] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_ZERO] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_ZERO] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_ZERO] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_ZERO] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_ZERO] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_ZERO] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_ZERO] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_ZERO] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_ZERO] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_ZERO] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_ZERO] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_ZERO] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_ZERO] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_ZERO] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_ZERO] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_ZERO] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_ZERO] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_ZERO] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_ZERO] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_ZERO] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_ZERO] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_ZERO] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_ZERO] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_ZERO] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_ZERO] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_ZERO] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_ZERO] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_ZERO] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_ZERO] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_ZERO] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_ZERO] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_ZERO] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_ZERO] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_ZERO] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_ZERO] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_ZERO] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_ZERO] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_ZERO] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_ZERO] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_ZERO] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_ZERO] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_ZERO] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_ZERO] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_ZERO] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_ZERO] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_ZERO] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_ZERO] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_ZERO] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_ZERO] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_ZERO] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_ZERO] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_ZERO] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_ZERO] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_ZERO] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_ZERO] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_ZERO] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_ZERO] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_ZERO] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_ZERO] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_ZERO] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_ZERO] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_ZERO] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_ZERO] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_ZERO] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_ZERO] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_ZERO] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_ZERO] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_ZERO] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_ZERO] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_ZERO] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_ZERO] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_ZERO] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_ZERO] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_ZERO] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_ZERO] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_ZERO] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_ZERO] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_ZERO] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_ZERO] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_ZERO] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_ZERO] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_ZERO] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_ZERO] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_ZERO] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_ZERO] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_ZERO] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_ZERO] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_ZERO] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_ZERO] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_ZERO] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_ZERO] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_ZERO] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_ZERO] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_ZERO] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_ZERO] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_ZERO] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_ZERO] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_ZERO] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_ZERO] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_ZERO] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_ZERO] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_ZERO] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_ZERO] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_ZERO] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_ZERO] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_ZERO] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_ZERO] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_ZERO] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_ZERO] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_ZERO] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_ZERO] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_ZERO] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_ZERO] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_ZERO] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_ZERO] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_ZERO] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_ZERO] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_ZERO] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_ZERO] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_ZERO] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_ZERO] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_ZERO] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_ZERO] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_ZERO] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_ZERO] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_ZERO] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_ZERO] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_ZERO] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_ZERO] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_ZERO] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_ZERO] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_ZERO] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_ZERO] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_ZERO] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_ZERO] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_ZERO] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_ZERO] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_ZERO] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_ZERO] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_ZERO] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_ZERO] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_ZERO] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_ZERO] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_ZERO] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_ZERO] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_ZERO] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_ZERO] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_ZERO] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_ZERO] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_ZERO] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_ZERO] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_ZERO] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_ZERO] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_ZERO] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_ZERO] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_ZERO] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_ZERO] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_ZERO] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_ZERO] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_ZERO] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_ZERO] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_ZERO] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_ZERO] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_ZERO] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_ZERO] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_ZERO] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_ZERO] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_ZERO] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_ZERO] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_ZERO] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_ZERO] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_ZERO] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_ZERO] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_ZERO] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_ZERO] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_ZERO] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_ZERO] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_ZERO] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_ZERO] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_ZERO] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_ZERO] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_ZERO] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_ZERO] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_ZERO] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_ZERO] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_ZERO] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_ZERO] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_ZERO] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_ZERO] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_ZERO] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_ZERO] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_ZERO] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_ZERO] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_ZERO] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_ZERO] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_ZERO] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_ZERO] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_ZERO] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_ZERO] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_ZERO] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_ZERO] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_ZERO] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_ZERO] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_ZERO] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_ZERO] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_ZERO] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_ZERO] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_ZERO] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_ZERO] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_ZERO] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_ZERO] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_ZERO] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_ZERO] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_ZERO] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_ZERO] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_ZERO] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_ZERO] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_ZERO] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_ZERO] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_ZERO] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_ZERO] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_ZERO] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_ZERO] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_ZERO] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_ZERO] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_ZERO] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_ZERO] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_ZERO] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_ZERO] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_ZERO] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_ZERO] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_ZERO] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_ZERO] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_ZERO] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_ZERO] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_ZERO] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_ZERO] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_ZERO] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_ZERO] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_ZERO] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_ZERO] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_ZERO] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_ZERO] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_ZERO] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_ZERO] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_ZERO] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_ZERO] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_ZERO] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_ZERO] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_ZERO] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_ZERO] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_ZERO] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_ZERO] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_ZERO] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_ZERO] --> [~2147483520,~2147483520] --> OK [~0.2147500032E10,TO_ZERO] --> [Overflow,~2147500032] --> OK [~0.2147499776E10,TO_ZERO] --> [Overflow,~2147499776] --> OK [~0.214749952E10,TO_ZERO] --> [Overflow,~2147499520] --> OK [~0.2147499264E10,TO_ZERO] --> [Overflow,~2147499264] --> OK [~0.2147499008E10,TO_ZERO] --> [Overflow,~2147499008] --> OK [~0.2147498752E10,TO_ZERO] --> [Overflow,~2147498752] --> OK [~0.2147498496E10,TO_ZERO] --> [Overflow,~2147498496] --> OK [~0.214749824E10,TO_ZERO] --> [Overflow,~2147498240] --> OK [~0.2147497984E10,TO_ZERO] --> [Overflow,~2147497984] --> OK [~0.2147497728E10,TO_ZERO] --> [Overflow,~2147497728] --> OK [~0.2147497472E10,TO_ZERO] --> [Overflow,~2147497472] --> OK [~0.2147497216E10,TO_ZERO] --> [Overflow,~2147497216] --> OK [~0.214749696E10,TO_ZERO] --> [Overflow,~2147496960] --> OK [~0.2147496704E10,TO_ZERO] --> [Overflow,~2147496704] --> OK [~0.2147496448E10,TO_ZERO] --> [Overflow,~2147496448] --> OK [~0.2147496192E10,TO_ZERO] --> [Overflow,~2147496192] --> OK [~0.2147495936E10,TO_ZERO] --> [Overflow,~2147495936] --> OK [~0.214749568E10,TO_ZERO] --> [Overflow,~2147495680] --> OK [~0.2147495424E10,TO_ZERO] --> [Overflow,~2147495424] --> OK [~0.2147495168E10,TO_ZERO] --> [Overflow,~2147495168] --> OK [~0.2147494912E10,TO_ZERO] --> [Overflow,~2147494912] --> OK [~0.2147494656E10,TO_ZERO] --> [Overflow,~2147494656] --> OK [~0.21474944E10,TO_ZERO] --> [Overflow,~2147494400] --> OK [~0.2147494144E10,TO_ZERO] --> [Overflow,~2147494144] --> OK [~0.2147493888E10,TO_ZERO] --> [Overflow,~2147493888] --> OK [~0.2147493632E10,TO_ZERO] --> [Overflow,~2147493632] --> OK [~0.2147493376E10,TO_ZERO] --> [Overflow,~2147493376] --> OK [~0.214749312E10,TO_ZERO] --> [Overflow,~2147493120] --> OK [~0.2147492864E10,TO_ZERO] --> [Overflow,~2147492864] --> OK [~0.2147492608E10,TO_ZERO] --> [Overflow,~2147492608] --> OK [~0.2147492352E10,TO_ZERO] --> [Overflow,~2147492352] --> OK [~0.2147492096E10,TO_ZERO] --> [Overflow,~2147492096] --> OK [~0.214749184E10,TO_ZERO] --> [Overflow,~2147491840] --> OK [~0.2147491584E10,TO_ZERO] --> [Overflow,~2147491584] --> OK [~0.2147491328E10,TO_ZERO] --> [Overflow,~2147491328] --> OK [~0.2147491072E10,TO_ZERO] --> [Overflow,~2147491072] --> OK [~0.2147490816E10,TO_ZERO] --> [Overflow,~2147490816] --> OK [~0.214749056E10,TO_ZERO] --> [Overflow,~2147490560] --> OK [~0.2147490304E10,TO_ZERO] --> [Overflow,~2147490304] --> OK [~0.2147490048E10,TO_ZERO] --> [Overflow,~2147490048] --> OK [~0.2147489792E10,TO_ZERO] --> [Overflow,~2147489792] --> OK [~0.2147489536E10,TO_ZERO] --> [Overflow,~2147489536] --> OK [~0.214748928E10,TO_ZERO] --> [Overflow,~2147489280] --> OK [~0.2147489024E10,TO_ZERO] --> [Overflow,~2147489024] --> OK [~0.2147488768E10,TO_ZERO] --> [Overflow,~2147488768] --> OK [~0.2147488512E10,TO_ZERO] --> [Overflow,~2147488512] --> OK [~0.2147488256E10,TO_ZERO] --> [Overflow,~2147488256] --> OK [~0.2147488E10,TO_ZERO] --> [Overflow,~2147488000] --> OK [~0.2147487744E10,TO_ZERO] --> [Overflow,~2147487744] --> OK [~0.2147487488E10,TO_ZERO] --> [Overflow,~2147487488] --> OK [~0.2147487232E10,TO_ZERO] --> [Overflow,~2147487232] --> OK [~0.2147486976E10,TO_ZERO] --> [Overflow,~2147486976] --> OK [~0.214748672E10,TO_ZERO] --> [Overflow,~2147486720] --> OK [~0.2147486464E10,TO_ZERO] --> [Overflow,~2147486464] --> OK [~0.2147486208E10,TO_ZERO] --> [Overflow,~2147486208] --> OK [~0.2147485952E10,TO_ZERO] --> [Overflow,~2147485952] --> OK [~0.2147485696E10,TO_ZERO] --> [Overflow,~2147485696] --> OK [~0.214748544E10,TO_ZERO] --> [Overflow,~2147485440] --> OK [~0.2147485184E10,TO_ZERO] --> [Overflow,~2147485184] --> OK [~0.2147484928E10,TO_ZERO] --> [Overflow,~2147484928] --> OK [~0.2147484672E10,TO_ZERO] --> [Overflow,~2147484672] --> OK [~0.2147484416E10,TO_ZERO] --> [Overflow,~2147484416] --> OK [~0.214748416E10,TO_ZERO] --> [Overflow,~2147484160] --> OK [~0.2147483904E10,TO_ZERO] --> [Overflow,~2147483904] --> OK [~0.2147483648E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147475456E10,TO_ZERO] --> [~2147475456,~2147475456] --> OK [~0.2147475584E10,TO_ZERO] --> [~2147475584,~2147475584] --> OK [~0.2147475712E10,TO_ZERO] --> [~2147475712,~2147475712] --> OK [~0.214747584E10,TO_ZERO] --> [~2147475840,~2147475840] --> OK [~0.2147475968E10,TO_ZERO] --> [~2147475968,~2147475968] --> OK [~0.2147476096E10,TO_ZERO] --> [~2147476096,~2147476096] --> OK [~0.2147476224E10,TO_ZERO] --> [~2147476224,~2147476224] --> OK [~0.2147476352E10,TO_ZERO] --> [~2147476352,~2147476352] --> OK [~0.214747648E10,TO_ZERO] --> [~2147476480,~2147476480] --> OK [~0.2147476608E10,TO_ZERO] --> [~2147476608,~2147476608] --> OK [~0.2147476736E10,TO_ZERO] --> [~2147476736,~2147476736] --> OK [~0.2147476864E10,TO_ZERO] --> [~2147476864,~2147476864] --> OK [~0.2147476992E10,TO_ZERO] --> [~2147476992,~2147476992] --> OK [~0.214747712E10,TO_ZERO] --> [~2147477120,~2147477120] --> OK [~0.2147477248E10,TO_ZERO] --> [~2147477248,~2147477248] --> OK [~0.2147477376E10,TO_ZERO] --> [~2147477376,~2147477376] --> OK [~0.2147477504E10,TO_ZERO] --> [~2147477504,~2147477504] --> OK [~0.2147477632E10,TO_ZERO] --> [~2147477632,~2147477632] --> OK [~0.214747776E10,TO_ZERO] --> [~2147477760,~2147477760] --> OK [~0.2147477888E10,TO_ZERO] --> [~2147477888,~2147477888] --> OK [~0.2147478016E10,TO_ZERO] --> [~2147478016,~2147478016] --> OK [~0.2147478144E10,TO_ZERO] --> [~2147478144,~2147478144] --> OK [~0.2147478272E10,TO_ZERO] --> [~2147478272,~2147478272] --> OK [~0.21474784E10,TO_ZERO] --> [~2147478400,~2147478400] --> OK [~0.2147478528E10,TO_ZERO] --> [~2147478528,~2147478528] --> OK [~0.2147478656E10,TO_ZERO] --> [~2147478656,~2147478656] --> OK [~0.2147478784E10,TO_ZERO] --> [~2147478784,~2147478784] --> OK [~0.2147478912E10,TO_ZERO] --> [~2147478912,~2147478912] --> OK [~0.214747904E10,TO_ZERO] --> [~2147479040,~2147479040] --> OK [~0.2147479168E10,TO_ZERO] --> [~2147479168,~2147479168] --> OK [~0.2147479296E10,TO_ZERO] --> [~2147479296,~2147479296] --> OK [~0.2147479424E10,TO_ZERO] --> [~2147479424,~2147479424] --> OK [~0.2147479552E10,TO_ZERO] --> [~2147479552,~2147479552] --> OK [~0.214747968E10,TO_ZERO] --> [~2147479680,~2147479680] --> OK [~0.2147479808E10,TO_ZERO] --> [~2147479808,~2147479808] --> OK [~0.2147479936E10,TO_ZERO] --> [~2147479936,~2147479936] --> OK [~0.2147480064E10,TO_ZERO] --> [~2147480064,~2147480064] --> OK [~0.2147480192E10,TO_ZERO] --> [~2147480192,~2147480192] --> OK [~0.214748032E10,TO_ZERO] --> [~2147480320,~2147480320] --> OK [~0.2147480448E10,TO_ZERO] --> [~2147480448,~2147480448] --> OK [~0.2147480576E10,TO_ZERO] --> [~2147480576,~2147480576] --> OK [~0.2147480704E10,TO_ZERO] --> [~2147480704,~2147480704] --> OK [~0.2147480832E10,TO_ZERO] --> [~2147480832,~2147480832] --> OK [~0.214748096E10,TO_ZERO] --> [~2147480960,~2147480960] --> OK [~0.2147481088E10,TO_ZERO] --> [~2147481088,~2147481088] --> OK [~0.2147481216E10,TO_ZERO] --> [~2147481216,~2147481216] --> OK [~0.2147481344E10,TO_ZERO] --> [~2147481344,~2147481344] --> OK [~0.2147481472E10,TO_ZERO] --> [~2147481472,~2147481472] --> OK [~0.21474816E10,TO_ZERO] --> [~2147481600,~2147481600] --> OK [~0.2147481728E10,TO_ZERO] --> [~2147481728,~2147481728] --> OK [~0.2147481856E10,TO_ZERO] --> [~2147481856,~2147481856] --> OK [~0.2147481984E10,TO_ZERO] --> [~2147481984,~2147481984] --> OK [~0.2147482112E10,TO_ZERO] --> [~2147482112,~2147482112] --> OK [~0.214748224E10,TO_ZERO] --> [~2147482240,~2147482240] --> OK [~0.2147482368E10,TO_ZERO] --> [~2147482368,~2147482368] --> OK [~0.2147482496E10,TO_ZERO] --> [~2147482496,~2147482496] --> OK [~0.2147482624E10,TO_ZERO] --> [~2147482624,~2147482624] --> OK [~0.2147482752E10,TO_ZERO] --> [~2147482752,~2147482752] --> OK [~0.214748288E10,TO_ZERO] --> [~2147482880,~2147482880] --> OK [~0.2147483008E10,TO_ZERO] --> [~2147483008,~2147483008] --> OK [~0.2147483136E10,TO_ZERO] --> [~2147483136,~2147483136] --> OK [~0.2147483264E10,TO_ZERO] --> [~2147483264,~2147483264] --> OK [~0.2147483392E10,TO_ZERO] --> [~2147483392,~2147483392] --> OK [~0.214748352E10,TO_ZERO] --> [~2147483520,~2147483520] --> OK [~0.2113937408E10,TO_ZERO] --> [~2113937408,~2113937408] --> OK [~0.211393728E10,TO_ZERO] --> [~2113937280,~2113937280] --> OK [~0.2113937152E10,TO_ZERO] --> [~2113937152,~2113937152] --> OK [~0.2113937024E10,TO_ZERO] --> [~2113937024,~2113937024] --> OK [~0.2113936896E10,TO_ZERO] --> [~2113936896,~2113936896] --> OK [~0.2113936768E10,TO_ZERO] --> [~2113936768,~2113936768] --> OK [~0.211393664E10,TO_ZERO] --> [~2113936640,~2113936640] --> OK [~0.2113936512E10,TO_ZERO] --> [~2113936512,~2113936512] --> OK [~0.2113936384E10,TO_ZERO] --> [~2113936384,~2113936384] --> OK [~0.2113936256E10,TO_ZERO] --> [~2113936256,~2113936256] --> OK [~0.2113936128E10,TO_ZERO] --> [~2113936128,~2113936128] --> OK [~0.2113936E10,TO_ZERO] --> [~2113936000,~2113936000] --> OK [~0.2113935872E10,TO_ZERO] --> [~2113935872,~2113935872] --> OK [~0.2113935744E10,TO_ZERO] --> [~2113935744,~2113935744] --> OK [~0.2113935616E10,TO_ZERO] --> [~2113935616,~2113935616] --> OK [~0.2113935488E10,TO_ZERO] --> [~2113935488,~2113935488] --> OK [~0.211393536E10,TO_ZERO] --> [~2113935360,~2113935360] --> OK [~0.2113935232E10,TO_ZERO] --> [~2113935232,~2113935232] --> OK [~0.2113935104E10,TO_ZERO] --> [~2113935104,~2113935104] --> OK [~0.2113934976E10,TO_ZERO] --> [~2113934976,~2113934976] --> OK [~0.2113934848E10,TO_ZERO] --> [~2113934848,~2113934848] --> OK [~0.211393472E10,TO_ZERO] --> [~2113934720,~2113934720] --> OK [~0.2113934592E10,TO_ZERO] --> [~2113934592,~2113934592] --> OK [~0.2113934464E10,TO_ZERO] --> [~2113934464,~2113934464] --> OK [~0.2113934336E10,TO_ZERO] --> [~2113934336,~2113934336] --> OK [~0.2113934208E10,TO_ZERO] --> [~2113934208,~2113934208] --> OK [~0.211393408E10,TO_ZERO] --> [~2113934080,~2113934080] --> OK [~0.2113933952E10,TO_ZERO] --> [~2113933952,~2113933952] --> OK [~0.2113933824E10,TO_ZERO] --> [~2113933824,~2113933824] --> OK [~0.2113933696E10,TO_ZERO] --> [~2113933696,~2113933696] --> OK [~0.2113933568E10,TO_ZERO] --> [~2113933568,~2113933568] --> OK [~0.211393344E10,TO_ZERO] --> [~2113933440,~2113933440] --> OK [~0.2113933312E10,TO_ZERO] --> [~2113933312,~2113933312] --> OK [~0.2113933184E10,TO_ZERO] --> [~2113933184,~2113933184] --> OK [~0.2113933056E10,TO_ZERO] --> [~2113933056,~2113933056] --> OK [~0.2113932928E10,TO_ZERO] --> [~2113932928,~2113932928] --> OK [~0.21139328E10,TO_ZERO] --> [~2113932800,~2113932800] --> OK [~0.2113932672E10,TO_ZERO] --> [~2113932672,~2113932672] --> OK [~0.2113932544E10,TO_ZERO] --> [~2113932544,~2113932544] --> OK [~0.2113932416E10,TO_ZERO] --> [~2113932416,~2113932416] --> OK [~0.2113932288E10,TO_ZERO] --> [~2113932288,~2113932288] --> OK [~0.211393216E10,TO_ZERO] --> [~2113932160,~2113932160] --> OK [~0.2113932032E10,TO_ZERO] --> [~2113932032,~2113932032] --> OK [~0.2113931904E10,TO_ZERO] --> [~2113931904,~2113931904] --> OK [~0.2113931776E10,TO_ZERO] --> [~2113931776,~2113931776] --> OK [~0.2113931648E10,TO_ZERO] --> [~2113931648,~2113931648] --> OK [~0.211393152E10,TO_ZERO] --> [~2113931520,~2113931520] --> OK [~0.2113931392E10,TO_ZERO] --> [~2113931392,~2113931392] --> OK [~0.2113931264E10,TO_ZERO] --> [~2113931264,~2113931264] --> OK [~0.2113931136E10,TO_ZERO] --> [~2113931136,~2113931136] --> OK [~0.2113931008E10,TO_ZERO] --> [~2113931008,~2113931008] --> OK [~0.211393088E10,TO_ZERO] --> [~2113930880,~2113930880] --> OK [~0.2113930752E10,TO_ZERO] --> [~2113930752,~2113930752] --> OK [~0.2113930624E10,TO_ZERO] --> [~2113930624,~2113930624] --> OK [~0.2113930496E10,TO_ZERO] --> [~2113930496,~2113930496] --> OK [~0.2113930368E10,TO_ZERO] --> [~2113930368,~2113930368] --> OK [~0.211393024E10,TO_ZERO] --> [~2113930240,~2113930240] --> OK [~0.2113930112E10,TO_ZERO] --> [~2113930112,~2113930112] --> OK [~0.2113929984E10,TO_ZERO] --> [~2113929984,~2113929984] --> OK [~0.2113929856E10,TO_ZERO] --> [~2113929856,~2113929856] --> OK [~0.2113929728E10,TO_ZERO] --> [~2113929728,~2113929728] --> OK [~0.21139296E10,TO_ZERO] --> [~2113929600,~2113929600] --> OK [~0.2113929472E10,TO_ZERO] --> [~2113929472,~2113929472] --> OK [~0.2113929344E10,TO_ZERO] --> [~2113929344,~2113929344] --> OK [~0.2113929216E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113921024E10,TO_ZERO] --> [~2113921024,~2113921024] --> OK [~0.2113921152E10,TO_ZERO] --> [~2113921152,~2113921152] --> OK [~0.211392128E10,TO_ZERO] --> [~2113921280,~2113921280] --> OK [~0.2113921408E10,TO_ZERO] --> [~2113921408,~2113921408] --> OK [~0.2113921536E10,TO_ZERO] --> [~2113921536,~2113921536] --> OK [~0.2113921664E10,TO_ZERO] --> [~2113921664,~2113921664] --> OK [~0.2113921792E10,TO_ZERO] --> [~2113921792,~2113921792] --> OK [~0.211392192E10,TO_ZERO] --> [~2113921920,~2113921920] --> OK [~0.2113922048E10,TO_ZERO] --> [~2113922048,~2113922048] --> OK [~0.2113922176E10,TO_ZERO] --> [~2113922176,~2113922176] --> OK [~0.2113922304E10,TO_ZERO] --> [~2113922304,~2113922304] --> OK [~0.2113922432E10,TO_ZERO] --> [~2113922432,~2113922432] --> OK [~0.211392256E10,TO_ZERO] --> [~2113922560,~2113922560] --> OK [~0.2113922688E10,TO_ZERO] --> [~2113922688,~2113922688] --> OK [~0.2113922816E10,TO_ZERO] --> [~2113922816,~2113922816] --> OK [~0.2113922944E10,TO_ZERO] --> [~2113922944,~2113922944] --> OK [~0.2113923072E10,TO_ZERO] --> [~2113923072,~2113923072] --> OK [~0.21139232E10,TO_ZERO] --> [~2113923200,~2113923200] --> OK [~0.2113923328E10,TO_ZERO] --> [~2113923328,~2113923328] --> OK [~0.2113923456E10,TO_ZERO] --> [~2113923456,~2113923456] --> OK [~0.2113923584E10,TO_ZERO] --> [~2113923584,~2113923584] --> OK [~0.2113923712E10,TO_ZERO] --> [~2113923712,~2113923712] --> OK [~0.211392384E10,TO_ZERO] --> [~2113923840,~2113923840] --> OK [~0.2113923968E10,TO_ZERO] --> [~2113923968,~2113923968] --> OK [~0.2113924096E10,TO_ZERO] --> [~2113924096,~2113924096] --> OK [~0.2113924224E10,TO_ZERO] --> [~2113924224,~2113924224] --> OK [~0.2113924352E10,TO_ZERO] --> [~2113924352,~2113924352] --> OK [~0.211392448E10,TO_ZERO] --> [~2113924480,~2113924480] --> OK [~0.2113924608E10,TO_ZERO] --> [~2113924608,~2113924608] --> OK [~0.2113924736E10,TO_ZERO] --> [~2113924736,~2113924736] --> OK [~0.2113924864E10,TO_ZERO] --> [~2113924864,~2113924864] --> OK [~0.2113924992E10,TO_ZERO] --> [~2113924992,~2113924992] --> OK [~0.211392512E10,TO_ZERO] --> [~2113925120,~2113925120] --> OK [~0.2113925248E10,TO_ZERO] --> [~2113925248,~2113925248] --> OK [~0.2113925376E10,TO_ZERO] --> [~2113925376,~2113925376] --> OK [~0.2113925504E10,TO_ZERO] --> [~2113925504,~2113925504] --> OK [~0.2113925632E10,TO_ZERO] --> [~2113925632,~2113925632] --> OK [~0.211392576E10,TO_ZERO] --> [~2113925760,~2113925760] --> OK [~0.2113925888E10,TO_ZERO] --> [~2113925888,~2113925888] --> OK [~0.2113926016E10,TO_ZERO] --> [~2113926016,~2113926016] --> OK [~0.2113926144E10,TO_ZERO] --> [~2113926144,~2113926144] --> OK [~0.2113926272E10,TO_ZERO] --> [~2113926272,~2113926272] --> OK [~0.21139264E10,TO_ZERO] --> [~2113926400,~2113926400] --> OK [~0.2113926528E10,TO_ZERO] --> [~2113926528,~2113926528] --> OK [~0.2113926656E10,TO_ZERO] --> [~2113926656,~2113926656] --> OK [~0.2113926784E10,TO_ZERO] --> [~2113926784,~2113926784] --> OK [~0.2113926912E10,TO_ZERO] --> [~2113926912,~2113926912] --> OK [~0.211392704E10,TO_ZERO] --> [~2113927040,~2113927040] --> OK [~0.2113927168E10,TO_ZERO] --> [~2113927168,~2113927168] --> OK [~0.2113927296E10,TO_ZERO] --> [~2113927296,~2113927296] --> OK [~0.2113927424E10,TO_ZERO] --> [~2113927424,~2113927424] --> OK [~0.2113927552E10,TO_ZERO] --> [~2113927552,~2113927552] --> OK [~0.211392768E10,TO_ZERO] --> [~2113927680,~2113927680] --> OK [~0.2113927808E10,TO_ZERO] --> [~2113927808,~2113927808] --> OK [~0.2113927936E10,TO_ZERO] --> [~2113927936,~2113927936] --> OK [~0.2113928064E10,TO_ZERO] --> [~2113928064,~2113928064] --> OK [~0.2113928192E10,TO_ZERO] --> [~2113928192,~2113928192] --> OK [~0.211392832E10,TO_ZERO] --> [~2113928320,~2113928320] --> OK [~0.2113928448E10,TO_ZERO] --> [~2113928448,~2113928448] --> OK [~0.2113928576E10,TO_ZERO] --> [~2113928576,~2113928576] --> OK [~0.2113928704E10,TO_ZERO] --> [~2113928704,~2113928704] --> OK [~0.2113928832E10,TO_ZERO] --> [~2113928832,~2113928832] --> OK [~0.211392896E10,TO_ZERO] --> [~2113928960,~2113928960] --> OK [~0.2113929088E10,TO_ZERO] --> [~2113929088,~2113929088] --> OK [~0.2080382976E10,TO_ZERO] --> [~2080382976,~2080382976] --> OK [~0.2080382848E10,TO_ZERO] --> [~2080382848,~2080382848] --> OK [~0.208038272E10,TO_ZERO] --> [~2080382720,~2080382720] --> OK [~0.2080382592E10,TO_ZERO] --> [~2080382592,~2080382592] --> OK [~0.2080382464E10,TO_ZERO] --> [~2080382464,~2080382464] --> OK [~0.2080382336E10,TO_ZERO] --> [~2080382336,~2080382336] --> OK [~0.2080382208E10,TO_ZERO] --> [~2080382208,~2080382208] --> OK [~0.208038208E10,TO_ZERO] --> [~2080382080,~2080382080] --> OK [~0.2080381952E10,TO_ZERO] --> [~2080381952,~2080381952] --> OK [~0.2080381824E10,TO_ZERO] --> [~2080381824,~2080381824] --> OK [~0.2080381696E10,TO_ZERO] --> [~2080381696,~2080381696] --> OK [~0.2080381568E10,TO_ZERO] --> [~2080381568,~2080381568] --> OK [~0.208038144E10,TO_ZERO] --> [~2080381440,~2080381440] --> OK [~0.2080381312E10,TO_ZERO] --> [~2080381312,~2080381312] --> OK [~0.2080381184E10,TO_ZERO] --> [~2080381184,~2080381184] --> OK [~0.2080381056E10,TO_ZERO] --> [~2080381056,~2080381056] --> OK [~0.2080380928E10,TO_ZERO] --> [~2080380928,~2080380928] --> OK [~0.20803808E10,TO_ZERO] --> [~2080380800,~2080380800] --> OK [~0.2080380672E10,TO_ZERO] --> [~2080380672,~2080380672] --> OK [~0.2080380544E10,TO_ZERO] --> [~2080380544,~2080380544] --> OK [~0.2080380416E10,TO_ZERO] --> [~2080380416,~2080380416] --> OK [~0.2080380288E10,TO_ZERO] --> [~2080380288,~2080380288] --> OK [~0.208038016E10,TO_ZERO] --> [~2080380160,~2080380160] --> OK [~0.2080380032E10,TO_ZERO] --> [~2080380032,~2080380032] --> OK [~0.2080379904E10,TO_ZERO] --> [~2080379904,~2080379904] --> OK [~0.2080379776E10,TO_ZERO] --> [~2080379776,~2080379776] --> OK [~0.2080379648E10,TO_ZERO] --> [~2080379648,~2080379648] --> OK [~0.208037952E10,TO_ZERO] --> [~2080379520,~2080379520] --> OK [~0.2080379392E10,TO_ZERO] --> [~2080379392,~2080379392] --> OK [~0.2080379264E10,TO_ZERO] --> [~2080379264,~2080379264] --> OK [~0.2080379136E10,TO_ZERO] --> [~2080379136,~2080379136] --> OK [~0.2080379008E10,TO_ZERO] --> [~2080379008,~2080379008] --> OK [~0.208037888E10,TO_ZERO] --> [~2080378880,~2080378880] --> OK [~0.2080378752E10,TO_ZERO] --> [~2080378752,~2080378752] --> OK [~0.2080378624E10,TO_ZERO] --> [~2080378624,~2080378624] --> OK [~0.2080378496E10,TO_ZERO] --> [~2080378496,~2080378496] --> OK [~0.2080378368E10,TO_ZERO] --> [~2080378368,~2080378368] --> OK [~0.208037824E10,TO_ZERO] --> [~2080378240,~2080378240] --> OK [~0.2080378112E10,TO_ZERO] --> [~2080378112,~2080378112] --> OK [~0.2080377984E10,TO_ZERO] --> [~2080377984,~2080377984] --> OK [~0.2080377856E10,TO_ZERO] --> [~2080377856,~2080377856] --> OK [~0.2080377728E10,TO_ZERO] --> [~2080377728,~2080377728] --> OK [~0.20803776E10,TO_ZERO] --> [~2080377600,~2080377600] --> OK [~0.2080377472E10,TO_ZERO] --> [~2080377472,~2080377472] --> OK [~0.2080377344E10,TO_ZERO] --> [~2080377344,~2080377344] --> OK [~0.2080377216E10,TO_ZERO] --> [~2080377216,~2080377216] --> OK [~0.2080377088E10,TO_ZERO] --> [~2080377088,~2080377088] --> OK [~0.208037696E10,TO_ZERO] --> [~2080376960,~2080376960] --> OK [~0.2080376832E10,TO_ZERO] --> [~2080376832,~2080376832] --> OK [~0.2080376704E10,TO_ZERO] --> [~2080376704,~2080376704] --> OK [~0.2080376576E10,TO_ZERO] --> [~2080376576,~2080376576] --> OK [~0.2080376448E10,TO_ZERO] --> [~2080376448,~2080376448] --> OK [~0.208037632E10,TO_ZERO] --> [~2080376320,~2080376320] --> OK [~0.2080376192E10,TO_ZERO] --> [~2080376192,~2080376192] --> OK [~0.2080376064E10,TO_ZERO] --> [~2080376064,~2080376064] --> OK [~0.2080375936E10,TO_ZERO] --> [~2080375936,~2080375936] --> OK [~0.2080375808E10,TO_ZERO] --> [~2080375808,~2080375808] --> OK [~0.208037568E10,TO_ZERO] --> [~2080375680,~2080375680] --> OK [~0.2080375552E10,TO_ZERO] --> [~2080375552,~2080375552] --> OK [~0.2080375424E10,TO_ZERO] --> [~2080375424,~2080375424] --> OK [~0.2080375296E10,TO_ZERO] --> [~2080375296,~2080375296] --> OK [~0.2080375168E10,TO_ZERO] --> [~2080375168,~2080375168] --> OK [~0.208037504E10,TO_ZERO] --> [~2080375040,~2080375040] --> OK [~0.2080374912E10,TO_ZERO] --> [~2080374912,~2080374912] --> OK [~0.2080374784E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080366592E10,TO_ZERO] --> [~2080366592,~2080366592] --> OK [~0.208036672E10,TO_ZERO] --> [~2080366720,~2080366720] --> OK [~0.2080366848E10,TO_ZERO] --> [~2080366848,~2080366848] --> OK [~0.2080366976E10,TO_ZERO] --> [~2080366976,~2080366976] --> OK [~0.2080367104E10,TO_ZERO] --> [~2080367104,~2080367104] --> OK [~0.2080367232E10,TO_ZERO] --> [~2080367232,~2080367232] --> OK [~0.208036736E10,TO_ZERO] --> [~2080367360,~2080367360] --> OK [~0.2080367488E10,TO_ZERO] --> [~2080367488,~2080367488] --> OK [~0.2080367616E10,TO_ZERO] --> [~2080367616,~2080367616] --> OK [~0.2080367744E10,TO_ZERO] --> [~2080367744,~2080367744] --> OK [~0.2080367872E10,TO_ZERO] --> [~2080367872,~2080367872] --> OK [~0.2080368E10,TO_ZERO] --> [~2080368000,~2080368000] --> OK [~0.2080368128E10,TO_ZERO] --> [~2080368128,~2080368128] --> OK [~0.2080368256E10,TO_ZERO] --> [~2080368256,~2080368256] --> OK [~0.2080368384E10,TO_ZERO] --> [~2080368384,~2080368384] --> OK [~0.2080368512E10,TO_ZERO] --> [~2080368512,~2080368512] --> OK [~0.208036864E10,TO_ZERO] --> [~2080368640,~2080368640] --> OK [~0.2080368768E10,TO_ZERO] --> [~2080368768,~2080368768] --> OK [~0.2080368896E10,TO_ZERO] --> [~2080368896,~2080368896] --> OK [~0.2080369024E10,TO_ZERO] --> [~2080369024,~2080369024] --> OK [~0.2080369152E10,TO_ZERO] --> [~2080369152,~2080369152] --> OK [~0.208036928E10,TO_ZERO] --> [~2080369280,~2080369280] --> OK [~0.2080369408E10,TO_ZERO] --> [~2080369408,~2080369408] --> OK [~0.2080369536E10,TO_ZERO] --> [~2080369536,~2080369536] --> OK [~0.2080369664E10,TO_ZERO] --> [~2080369664,~2080369664] --> OK [~0.2080369792E10,TO_ZERO] --> [~2080369792,~2080369792] --> OK [~0.208036992E10,TO_ZERO] --> [~2080369920,~2080369920] --> OK [~0.2080370048E10,TO_ZERO] --> [~2080370048,~2080370048] --> OK [~0.2080370176E10,TO_ZERO] --> [~2080370176,~2080370176] --> OK [~0.2080370304E10,TO_ZERO] --> [~2080370304,~2080370304] --> OK [~0.2080370432E10,TO_ZERO] --> [~2080370432,~2080370432] --> OK [~0.208037056E10,TO_ZERO] --> [~2080370560,~2080370560] --> OK [~0.2080370688E10,TO_ZERO] --> [~2080370688,~2080370688] --> OK [~0.2080370816E10,TO_ZERO] --> [~2080370816,~2080370816] --> OK [~0.2080370944E10,TO_ZERO] --> [~2080370944,~2080370944] --> OK [~0.2080371072E10,TO_ZERO] --> [~2080371072,~2080371072] --> OK [~0.20803712E10,TO_ZERO] --> [~2080371200,~2080371200] --> OK [~0.2080371328E10,TO_ZERO] --> [~2080371328,~2080371328] --> OK [~0.2080371456E10,TO_ZERO] --> [~2080371456,~2080371456] --> OK [~0.2080371584E10,TO_ZERO] --> [~2080371584,~2080371584] --> OK [~0.2080371712E10,TO_ZERO] --> [~2080371712,~2080371712] --> OK [~0.208037184E10,TO_ZERO] --> [~2080371840,~2080371840] --> OK [~0.2080371968E10,TO_ZERO] --> [~2080371968,~2080371968] --> OK [~0.2080372096E10,TO_ZERO] --> [~2080372096,~2080372096] --> OK [~0.2080372224E10,TO_ZERO] --> [~2080372224,~2080372224] --> OK [~0.2080372352E10,TO_ZERO] --> [~2080372352,~2080372352] --> OK [~0.208037248E10,TO_ZERO] --> [~2080372480,~2080372480] --> OK [~0.2080372608E10,TO_ZERO] --> [~2080372608,~2080372608] --> OK [~0.2080372736E10,TO_ZERO] --> [~2080372736,~2080372736] --> OK [~0.2080372864E10,TO_ZERO] --> [~2080372864,~2080372864] --> OK [~0.2080372992E10,TO_ZERO] --> [~2080372992,~2080372992] --> OK [~0.208037312E10,TO_ZERO] --> [~2080373120,~2080373120] --> OK [~0.2080373248E10,TO_ZERO] --> [~2080373248,~2080373248] --> OK [~0.2080373376E10,TO_ZERO] --> [~2080373376,~2080373376] --> OK [~0.2080373504E10,TO_ZERO] --> [~2080373504,~2080373504] --> OK [~0.2080373632E10,TO_ZERO] --> [~2080373632,~2080373632] --> OK [~0.208037376E10,TO_ZERO] --> [~2080373760,~2080373760] --> OK [~0.2080373888E10,TO_ZERO] --> [~2080373888,~2080373888] --> OK [~0.2080374016E10,TO_ZERO] --> [~2080374016,~2080374016] --> OK [~0.2080374144E10,TO_ZERO] --> [~2080374144,~2080374144] --> OK [~0.2080374272E10,TO_ZERO] --> [~2080374272,~2080374272] --> OK [~0.20803744E10,TO_ZERO] --> [~2080374400,~2080374400] --> OK [~0.2080374528E10,TO_ZERO] --> [~2080374528,~2080374528] --> OK [~0.2080374656E10,TO_ZERO] --> [~2080374656,~2080374656] --> OK [~0.2013274112E10,TO_ZERO] --> [~2013274112,~2013274112] --> OK [~0.2013273984E10,TO_ZERO] --> [~2013273984,~2013273984] --> OK [~0.2013273856E10,TO_ZERO] --> [~2013273856,~2013273856] --> OK [~0.2013273728E10,TO_ZERO] --> [~2013273728,~2013273728] --> OK [~0.20132736E10,TO_ZERO] --> [~2013273600,~2013273600] --> OK [~0.2013273472E10,TO_ZERO] --> [~2013273472,~2013273472] --> OK [~0.2013273344E10,TO_ZERO] --> [~2013273344,~2013273344] --> OK [~0.2013273216E10,TO_ZERO] --> [~2013273216,~2013273216] --> OK [~0.2013273088E10,TO_ZERO] --> [~2013273088,~2013273088] --> OK [~0.201327296E10,TO_ZERO] --> [~2013272960,~2013272960] --> OK [~0.2013272832E10,TO_ZERO] --> [~2013272832,~2013272832] --> OK [~0.2013272704E10,TO_ZERO] --> [~2013272704,~2013272704] --> OK [~0.2013272576E10,TO_ZERO] --> [~2013272576,~2013272576] --> OK [~0.2013272448E10,TO_ZERO] --> [~2013272448,~2013272448] --> OK [~0.201327232E10,TO_ZERO] --> [~2013272320,~2013272320] --> OK [~0.2013272192E10,TO_ZERO] --> [~2013272192,~2013272192] --> OK [~0.2013272064E10,TO_ZERO] --> [~2013272064,~2013272064] --> OK [~0.2013271936E10,TO_ZERO] --> [~2013271936,~2013271936] --> OK [~0.2013271808E10,TO_ZERO] --> [~2013271808,~2013271808] --> OK [~0.201327168E10,TO_ZERO] --> [~2013271680,~2013271680] --> OK [~0.2013271552E10,TO_ZERO] --> [~2013271552,~2013271552] --> OK [~0.2013271424E10,TO_ZERO] --> [~2013271424,~2013271424] --> OK [~0.2013271296E10,TO_ZERO] --> [~2013271296,~2013271296] --> OK [~0.2013271168E10,TO_ZERO] --> [~2013271168,~2013271168] --> OK [~0.201327104E10,TO_ZERO] --> [~2013271040,~2013271040] --> OK [~0.2013270912E10,TO_ZERO] --> [~2013270912,~2013270912] --> OK [~0.2013270784E10,TO_ZERO] --> [~2013270784,~2013270784] --> OK [~0.2013270656E10,TO_ZERO] --> [~2013270656,~2013270656] --> OK [~0.2013270528E10,TO_ZERO] --> [~2013270528,~2013270528] --> OK [~0.20132704E10,TO_ZERO] --> [~2013270400,~2013270400] --> OK [~0.2013270272E10,TO_ZERO] --> [~2013270272,~2013270272] --> OK [~0.2013270144E10,TO_ZERO] --> [~2013270144,~2013270144] --> OK [~0.2013270016E10,TO_ZERO] --> [~2013270016,~2013270016] --> OK [~0.2013269888E10,TO_ZERO] --> [~2013269888,~2013269888] --> OK [~0.201326976E10,TO_ZERO] --> [~2013269760,~2013269760] --> OK [~0.2013269632E10,TO_ZERO] --> [~2013269632,~2013269632] --> OK [~0.2013269504E10,TO_ZERO] --> [~2013269504,~2013269504] --> OK [~0.2013269376E10,TO_ZERO] --> [~2013269376,~2013269376] --> OK [~0.2013269248E10,TO_ZERO] --> [~2013269248,~2013269248] --> OK [~0.201326912E10,TO_ZERO] --> [~2013269120,~2013269120] --> OK [~0.2013268992E10,TO_ZERO] --> [~2013268992,~2013268992] --> OK [~0.2013268864E10,TO_ZERO] --> [~2013268864,~2013268864] --> OK [~0.2013268736E10,TO_ZERO] --> [~2013268736,~2013268736] --> OK [~0.2013268608E10,TO_ZERO] --> [~2013268608,~2013268608] --> OK [~0.201326848E10,TO_ZERO] --> [~2013268480,~2013268480] --> OK [~0.2013268352E10,TO_ZERO] --> [~2013268352,~2013268352] --> OK [~0.2013268224E10,TO_ZERO] --> [~2013268224,~2013268224] --> OK [~0.2013268096E10,TO_ZERO] --> [~2013268096,~2013268096] --> OK [~0.2013267968E10,TO_ZERO] --> [~2013267968,~2013267968] --> OK [~0.201326784E10,TO_ZERO] --> [~2013267840,~2013267840] --> OK [~0.2013267712E10,TO_ZERO] --> [~2013267712,~2013267712] --> OK [~0.2013267584E10,TO_ZERO] --> [~2013267584,~2013267584] --> OK [~0.2013267456E10,TO_ZERO] --> [~2013267456,~2013267456] --> OK [~0.2013267328E10,TO_ZERO] --> [~2013267328,~2013267328] --> OK [~0.20132672E10,TO_ZERO] --> [~2013267200,~2013267200] --> OK [~0.2013267072E10,TO_ZERO] --> [~2013267072,~2013267072] --> OK [~0.2013266944E10,TO_ZERO] --> [~2013266944,~2013266944] --> OK [~0.2013266816E10,TO_ZERO] --> [~2013266816,~2013266816] --> OK [~0.2013266688E10,TO_ZERO] --> [~2013266688,~2013266688] --> OK [~0.201326656E10,TO_ZERO] --> [~2013266560,~2013266560] --> OK [~0.2013266432E10,TO_ZERO] --> [~2013266432,~2013266432] --> OK [~0.2013266304E10,TO_ZERO] --> [~2013266304,~2013266304] --> OK [~0.2013266176E10,TO_ZERO] --> [~2013266176,~2013266176] --> OK [~0.2013266048E10,TO_ZERO] --> [~2013266048,~2013266048] --> OK [~0.201326592E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013257728E10,TO_ZERO] --> [~2013257728,~2013257728] --> OK [~0.2013257856E10,TO_ZERO] --> [~2013257856,~2013257856] --> OK [~0.2013257984E10,TO_ZERO] --> [~2013257984,~2013257984] --> OK [~0.2013258112E10,TO_ZERO] --> [~2013258112,~2013258112] --> OK [~0.201325824E10,TO_ZERO] --> [~2013258240,~2013258240] --> OK [~0.2013258368E10,TO_ZERO] --> [~2013258368,~2013258368] --> OK [~0.2013258496E10,TO_ZERO] --> [~2013258496,~2013258496] --> OK [~0.2013258624E10,TO_ZERO] --> [~2013258624,~2013258624] --> OK [~0.2013258752E10,TO_ZERO] --> [~2013258752,~2013258752] --> OK [~0.201325888E10,TO_ZERO] --> [~2013258880,~2013258880] --> OK [~0.2013259008E10,TO_ZERO] --> [~2013259008,~2013259008] --> OK [~0.2013259136E10,TO_ZERO] --> [~2013259136,~2013259136] --> OK [~0.2013259264E10,TO_ZERO] --> [~2013259264,~2013259264] --> OK [~0.2013259392E10,TO_ZERO] --> [~2013259392,~2013259392] --> OK [~0.201325952E10,TO_ZERO] --> [~2013259520,~2013259520] --> OK [~0.2013259648E10,TO_ZERO] --> [~2013259648,~2013259648] --> OK [~0.2013259776E10,TO_ZERO] --> [~2013259776,~2013259776] --> OK [~0.2013259904E10,TO_ZERO] --> [~2013259904,~2013259904] --> OK [~0.2013260032E10,TO_ZERO] --> [~2013260032,~2013260032] --> OK [~0.201326016E10,TO_ZERO] --> [~2013260160,~2013260160] --> OK [~0.2013260288E10,TO_ZERO] --> [~2013260288,~2013260288] --> OK [~0.2013260416E10,TO_ZERO] --> [~2013260416,~2013260416] --> OK [~0.2013260544E10,TO_ZERO] --> [~2013260544,~2013260544] --> OK [~0.2013260672E10,TO_ZERO] --> [~2013260672,~2013260672] --> OK [~0.20132608E10,TO_ZERO] --> [~2013260800,~2013260800] --> OK [~0.2013260928E10,TO_ZERO] --> [~2013260928,~2013260928] --> OK [~0.2013261056E10,TO_ZERO] --> [~2013261056,~2013261056] --> OK [~0.2013261184E10,TO_ZERO] --> [~2013261184,~2013261184] --> OK [~0.2013261312E10,TO_ZERO] --> [~2013261312,~2013261312] --> OK [~0.201326144E10,TO_ZERO] --> [~2013261440,~2013261440] --> OK [~0.2013261568E10,TO_ZERO] --> [~2013261568,~2013261568] --> OK [~0.2013261696E10,TO_ZERO] --> [~2013261696,~2013261696] --> OK [~0.2013261824E10,TO_ZERO] --> [~2013261824,~2013261824] --> OK [~0.2013261952E10,TO_ZERO] --> [~2013261952,~2013261952] --> OK [~0.201326208E10,TO_ZERO] --> [~2013262080,~2013262080] --> OK [~0.2013262208E10,TO_ZERO] --> [~2013262208,~2013262208] --> OK [~0.2013262336E10,TO_ZERO] --> [~2013262336,~2013262336] --> OK [~0.2013262464E10,TO_ZERO] --> [~2013262464,~2013262464] --> OK [~0.2013262592E10,TO_ZERO] --> [~2013262592,~2013262592] --> OK [~0.201326272E10,TO_ZERO] --> [~2013262720,~2013262720] --> OK [~0.2013262848E10,TO_ZERO] --> [~2013262848,~2013262848] --> OK [~0.2013262976E10,TO_ZERO] --> [~2013262976,~2013262976] --> OK [~0.2013263104E10,TO_ZERO] --> [~2013263104,~2013263104] --> OK [~0.2013263232E10,TO_ZERO] --> [~2013263232,~2013263232] --> OK [~0.201326336E10,TO_ZERO] --> [~2013263360,~2013263360] --> OK [~0.2013263488E10,TO_ZERO] --> [~2013263488,~2013263488] --> OK [~0.2013263616E10,TO_ZERO] --> [~2013263616,~2013263616] --> OK [~0.2013263744E10,TO_ZERO] --> [~2013263744,~2013263744] --> OK [~0.2013263872E10,TO_ZERO] --> [~2013263872,~2013263872] --> OK [~0.2013264E10,TO_ZERO] --> [~2013264000,~2013264000] --> OK [~0.2013264128E10,TO_ZERO] --> [~2013264128,~2013264128] --> OK [~0.2013264256E10,TO_ZERO] --> [~2013264256,~2013264256] --> OK [~0.2013264384E10,TO_ZERO] --> [~2013264384,~2013264384] --> OK [~0.2013264512E10,TO_ZERO] --> [~2013264512,~2013264512] --> OK [~0.201326464E10,TO_ZERO] --> [~2013264640,~2013264640] --> OK [~0.2013264768E10,TO_ZERO] --> [~2013264768,~2013264768] --> OK [~0.2013264896E10,TO_ZERO] --> [~2013264896,~2013264896] --> OK [~0.2013265024E10,TO_ZERO] --> [~2013265024,~2013265024] --> OK [~0.2013265152E10,TO_ZERO] --> [~2013265152,~2013265152] --> OK [~0.201326528E10,TO_ZERO] --> [~2013265280,~2013265280] --> OK [~0.2013265408E10,TO_ZERO] --> [~2013265408,~2013265408] --> OK [~0.2013265536E10,TO_ZERO] --> [~2013265536,~2013265536] --> OK [~0.2013265664E10,TO_ZERO] --> [~2013265664,~2013265664] --> OK [~0.2013265792E10,TO_ZERO] --> [~2013265792,~2013265792] --> OK [~0.1879056384E10,TO_ZERO] --> [~1879056384,~1879056384] --> OK [~0.1879056256E10,TO_ZERO] --> [~1879056256,~1879056256] --> OK [~0.1879056128E10,TO_ZERO] --> [~1879056128,~1879056128] --> OK [~0.1879056E10,TO_ZERO] --> [~1879056000,~1879056000] --> OK [~0.1879055872E10,TO_ZERO] --> [~1879055872,~1879055872] --> OK [~0.1879055744E10,TO_ZERO] --> [~1879055744,~1879055744] --> OK [~0.1879055616E10,TO_ZERO] --> [~1879055616,~1879055616] --> OK [~0.1879055488E10,TO_ZERO] --> [~1879055488,~1879055488] --> OK [~0.187905536E10,TO_ZERO] --> [~1879055360,~1879055360] --> OK [~0.1879055232E10,TO_ZERO] --> [~1879055232,~1879055232] --> OK [~0.1879055104E10,TO_ZERO] --> [~1879055104,~1879055104] --> OK [~0.1879054976E10,TO_ZERO] --> [~1879054976,~1879054976] --> OK [~0.1879054848E10,TO_ZERO] --> [~1879054848,~1879054848] --> OK [~0.187905472E10,TO_ZERO] --> [~1879054720,~1879054720] --> OK [~0.1879054592E10,TO_ZERO] --> [~1879054592,~1879054592] --> OK [~0.1879054464E10,TO_ZERO] --> [~1879054464,~1879054464] --> OK [~0.1879054336E10,TO_ZERO] --> [~1879054336,~1879054336] --> OK [~0.1879054208E10,TO_ZERO] --> [~1879054208,~1879054208] --> OK [~0.187905408E10,TO_ZERO] --> [~1879054080,~1879054080] --> OK [~0.1879053952E10,TO_ZERO] --> [~1879053952,~1879053952] --> OK [~0.1879053824E10,TO_ZERO] --> [~1879053824,~1879053824] --> OK [~0.1879053696E10,TO_ZERO] --> [~1879053696,~1879053696] --> OK [~0.1879053568E10,TO_ZERO] --> [~1879053568,~1879053568] --> OK [~0.187905344E10,TO_ZERO] --> [~1879053440,~1879053440] --> OK [~0.1879053312E10,TO_ZERO] --> [~1879053312,~1879053312] --> OK [~0.1879053184E10,TO_ZERO] --> [~1879053184,~1879053184] --> OK [~0.1879053056E10,TO_ZERO] --> [~1879053056,~1879053056] --> OK [~0.1879052928E10,TO_ZERO] --> [~1879052928,~1879052928] --> OK [~0.18790528E10,TO_ZERO] --> [~1879052800,~1879052800] --> OK [~0.1879052672E10,TO_ZERO] --> [~1879052672,~1879052672] --> OK [~0.1879052544E10,TO_ZERO] --> [~1879052544,~1879052544] --> OK [~0.1879052416E10,TO_ZERO] --> [~1879052416,~1879052416] --> OK [~0.1879052288E10,TO_ZERO] --> [~1879052288,~1879052288] --> OK [~0.187905216E10,TO_ZERO] --> [~1879052160,~1879052160] --> OK [~0.1879052032E10,TO_ZERO] --> [~1879052032,~1879052032] --> OK [~0.1879051904E10,TO_ZERO] --> [~1879051904,~1879051904] --> OK [~0.1879051776E10,TO_ZERO] --> [~1879051776,~1879051776] --> OK [~0.1879051648E10,TO_ZERO] --> [~1879051648,~1879051648] --> OK [~0.187905152E10,TO_ZERO] --> [~1879051520,~1879051520] --> OK [~0.1879051392E10,TO_ZERO] --> [~1879051392,~1879051392] --> OK [~0.1879051264E10,TO_ZERO] --> [~1879051264,~1879051264] --> OK [~0.1879051136E10,TO_ZERO] --> [~1879051136,~1879051136] --> OK [~0.1879051008E10,TO_ZERO] --> [~1879051008,~1879051008] --> OK [~0.187905088E10,TO_ZERO] --> [~1879050880,~1879050880] --> OK [~0.1879050752E10,TO_ZERO] --> [~1879050752,~1879050752] --> OK [~0.1879050624E10,TO_ZERO] --> [~1879050624,~1879050624] --> OK [~0.1879050496E10,TO_ZERO] --> [~1879050496,~1879050496] --> OK [~0.1879050368E10,TO_ZERO] --> [~1879050368,~1879050368] --> OK [~0.187905024E10,TO_ZERO] --> [~1879050240,~1879050240] --> OK [~0.1879050112E10,TO_ZERO] --> [~1879050112,~1879050112] --> OK [~0.1879049984E10,TO_ZERO] --> [~1879049984,~1879049984] --> OK [~0.1879049856E10,TO_ZERO] --> [~1879049856,~1879049856] --> OK [~0.1879049728E10,TO_ZERO] --> [~1879049728,~1879049728] --> OK [~0.18790496E10,TO_ZERO] --> [~1879049600,~1879049600] --> OK [~0.1879049472E10,TO_ZERO] --> [~1879049472,~1879049472] --> OK [~0.1879049344E10,TO_ZERO] --> [~1879049344,~1879049344] --> OK [~0.1879049216E10,TO_ZERO] --> [~1879049216,~1879049216] --> OK [~0.1879049088E10,TO_ZERO] --> [~1879049088,~1879049088] --> OK [~0.187904896E10,TO_ZERO] --> [~1879048960,~1879048960] --> OK [~0.1879048832E10,TO_ZERO] --> [~1879048832,~1879048832] --> OK [~0.1879048704E10,TO_ZERO] --> [~1879048704,~1879048704] --> OK [~0.1879048576E10,TO_ZERO] --> [~1879048576,~1879048576] --> OK [~0.1879048448E10,TO_ZERO] --> [~1879048448,~1879048448] --> OK [~0.187904832E10,TO_ZERO] --> [~1879048320,~1879048320] --> OK [~0.1879048192E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.187904E10,TO_ZERO] --> [~1879040000,~1879040000] --> OK [~0.1879040128E10,TO_ZERO] --> [~1879040128,~1879040128] --> OK [~0.1879040256E10,TO_ZERO] --> [~1879040256,~1879040256] --> OK [~0.1879040384E10,TO_ZERO] --> [~1879040384,~1879040384] --> OK [~0.1879040512E10,TO_ZERO] --> [~1879040512,~1879040512] --> OK [~0.187904064E10,TO_ZERO] --> [~1879040640,~1879040640] --> OK [~0.1879040768E10,TO_ZERO] --> [~1879040768,~1879040768] --> OK [~0.1879040896E10,TO_ZERO] --> [~1879040896,~1879040896] --> OK [~0.1879041024E10,TO_ZERO] --> [~1879041024,~1879041024] --> OK [~0.1879041152E10,TO_ZERO] --> [~1879041152,~1879041152] --> OK [~0.187904128E10,TO_ZERO] --> [~1879041280,~1879041280] --> OK [~0.1879041408E10,TO_ZERO] --> [~1879041408,~1879041408] --> OK [~0.1879041536E10,TO_ZERO] --> [~1879041536,~1879041536] --> OK [~0.1879041664E10,TO_ZERO] --> [~1879041664,~1879041664] --> OK [~0.1879041792E10,TO_ZERO] --> [~1879041792,~1879041792] --> OK [~0.187904192E10,TO_ZERO] --> [~1879041920,~1879041920] --> OK [~0.1879042048E10,TO_ZERO] --> [~1879042048,~1879042048] --> OK [~0.1879042176E10,TO_ZERO] --> [~1879042176,~1879042176] --> OK [~0.1879042304E10,TO_ZERO] --> [~1879042304,~1879042304] --> OK [~0.1879042432E10,TO_ZERO] --> [~1879042432,~1879042432] --> OK [~0.187904256E10,TO_ZERO] --> [~1879042560,~1879042560] --> OK [~0.1879042688E10,TO_ZERO] --> [~1879042688,~1879042688] --> OK [~0.1879042816E10,TO_ZERO] --> [~1879042816,~1879042816] --> OK [~0.1879042944E10,TO_ZERO] --> [~1879042944,~1879042944] --> OK [~0.1879043072E10,TO_ZERO] --> [~1879043072,~1879043072] --> OK [~0.18790432E10,TO_ZERO] --> [~1879043200,~1879043200] --> OK [~0.1879043328E10,TO_ZERO] --> [~1879043328,~1879043328] --> OK [~0.1879043456E10,TO_ZERO] --> [~1879043456,~1879043456] --> OK [~0.1879043584E10,TO_ZERO] --> [~1879043584,~1879043584] --> OK [~0.1879043712E10,TO_ZERO] --> [~1879043712,~1879043712] --> OK [~0.187904384E10,TO_ZERO] --> [~1879043840,~1879043840] --> OK [~0.1879043968E10,TO_ZERO] --> [~1879043968,~1879043968] --> OK [~0.1879044096E10,TO_ZERO] --> [~1879044096,~1879044096] --> OK [~0.1879044224E10,TO_ZERO] --> [~1879044224,~1879044224] --> OK [~0.1879044352E10,TO_ZERO] --> [~1879044352,~1879044352] --> OK [~0.187904448E10,TO_ZERO] --> [~1879044480,~1879044480] --> OK [~0.1879044608E10,TO_ZERO] --> [~1879044608,~1879044608] --> OK [~0.1879044736E10,TO_ZERO] --> [~1879044736,~1879044736] --> OK [~0.1879044864E10,TO_ZERO] --> [~1879044864,~1879044864] --> OK [~0.1879044992E10,TO_ZERO] --> [~1879044992,~1879044992] --> OK [~0.187904512E10,TO_ZERO] --> [~1879045120,~1879045120] --> OK [~0.1879045248E10,TO_ZERO] --> [~1879045248,~1879045248] --> OK [~0.1879045376E10,TO_ZERO] --> [~1879045376,~1879045376] --> OK [~0.1879045504E10,TO_ZERO] --> [~1879045504,~1879045504] --> OK [~0.1879045632E10,TO_ZERO] --> [~1879045632,~1879045632] --> OK [~0.187904576E10,TO_ZERO] --> [~1879045760,~1879045760] --> OK [~0.1879045888E10,TO_ZERO] --> [~1879045888,~1879045888] --> OK [~0.1879046016E10,TO_ZERO] --> [~1879046016,~1879046016] --> OK [~0.1879046144E10,TO_ZERO] --> [~1879046144,~1879046144] --> OK [~0.1879046272E10,TO_ZERO] --> [~1879046272,~1879046272] --> OK [~0.18790464E10,TO_ZERO] --> [~1879046400,~1879046400] --> OK [~0.1879046528E10,TO_ZERO] --> [~1879046528,~1879046528] --> OK [~0.1879046656E10,TO_ZERO] --> [~1879046656,~1879046656] --> OK [~0.1879046784E10,TO_ZERO] --> [~1879046784,~1879046784] --> OK [~0.1879046912E10,TO_ZERO] --> [~1879046912,~1879046912] --> OK [~0.187904704E10,TO_ZERO] --> [~1879047040,~1879047040] --> OK [~0.1879047168E10,TO_ZERO] --> [~1879047168,~1879047168] --> OK [~0.1879047296E10,TO_ZERO] --> [~1879047296,~1879047296] --> OK [~0.1879047424E10,TO_ZERO] --> [~1879047424,~1879047424] --> OK [~0.1879047552E10,TO_ZERO] --> [~1879047552,~1879047552] --> OK [~0.187904768E10,TO_ZERO] --> [~1879047680,~1879047680] --> OK [~0.1879047808E10,TO_ZERO] --> [~1879047808,~1879047808] --> OK [~0.1879047936E10,TO_ZERO] --> [~1879047936,~1879047936] --> OK [~0.1879048064E10,TO_ZERO] --> [~1879048064,~1879048064] --> OK [~0.1610620928E10,TO_ZERO] --> [~1610620928,~1610620928] --> OK [~0.16106208E10,TO_ZERO] --> [~1610620800,~1610620800] --> OK [~0.1610620672E10,TO_ZERO] --> [~1610620672,~1610620672] --> OK [~0.1610620544E10,TO_ZERO] --> [~1610620544,~1610620544] --> OK [~0.1610620416E10,TO_ZERO] --> [~1610620416,~1610620416] --> OK [~0.1610620288E10,TO_ZERO] --> [~1610620288,~1610620288] --> OK [~0.161062016E10,TO_ZERO] --> [~1610620160,~1610620160] --> OK [~0.1610620032E10,TO_ZERO] --> [~1610620032,~1610620032] --> OK [~0.1610619904E10,TO_ZERO] --> [~1610619904,~1610619904] --> OK [~0.1610619776E10,TO_ZERO] --> [~1610619776,~1610619776] --> OK [~0.1610619648E10,TO_ZERO] --> [~1610619648,~1610619648] --> OK [~0.161061952E10,TO_ZERO] --> [~1610619520,~1610619520] --> OK [~0.1610619392E10,TO_ZERO] --> [~1610619392,~1610619392] --> OK [~0.1610619264E10,TO_ZERO] --> [~1610619264,~1610619264] --> OK [~0.1610619136E10,TO_ZERO] --> [~1610619136,~1610619136] --> OK [~0.1610619008E10,TO_ZERO] --> [~1610619008,~1610619008] --> OK [~0.161061888E10,TO_ZERO] --> [~1610618880,~1610618880] --> OK [~0.1610618752E10,TO_ZERO] --> [~1610618752,~1610618752] --> OK [~0.1610618624E10,TO_ZERO] --> [~1610618624,~1610618624] --> OK [~0.1610618496E10,TO_ZERO] --> [~1610618496,~1610618496] --> OK [~0.1610618368E10,TO_ZERO] --> [~1610618368,~1610618368] --> OK [~0.161061824E10,TO_ZERO] --> [~1610618240,~1610618240] --> OK [~0.1610618112E10,TO_ZERO] --> [~1610618112,~1610618112] --> OK [~0.1610617984E10,TO_ZERO] --> [~1610617984,~1610617984] --> OK [~0.1610617856E10,TO_ZERO] --> [~1610617856,~1610617856] --> OK [~0.1610617728E10,TO_ZERO] --> [~1610617728,~1610617728] --> OK [~0.16106176E10,TO_ZERO] --> [~1610617600,~1610617600] --> OK [~0.1610617472E10,TO_ZERO] --> [~1610617472,~1610617472] --> OK [~0.1610617344E10,TO_ZERO] --> [~1610617344,~1610617344] --> OK [~0.1610617216E10,TO_ZERO] --> [~1610617216,~1610617216] --> OK [~0.1610617088E10,TO_ZERO] --> [~1610617088,~1610617088] --> OK [~0.161061696E10,TO_ZERO] --> [~1610616960,~1610616960] --> OK [~0.1610616832E10,TO_ZERO] --> [~1610616832,~1610616832] --> OK [~0.1610616704E10,TO_ZERO] --> [~1610616704,~1610616704] --> OK [~0.1610616576E10,TO_ZERO] --> [~1610616576,~1610616576] --> OK [~0.1610616448E10,TO_ZERO] --> [~1610616448,~1610616448] --> OK [~0.161061632E10,TO_ZERO] --> [~1610616320,~1610616320] --> OK [~0.1610616192E10,TO_ZERO] --> [~1610616192,~1610616192] --> OK [~0.1610616064E10,TO_ZERO] --> [~1610616064,~1610616064] --> OK [~0.1610615936E10,TO_ZERO] --> [~1610615936,~1610615936] --> OK [~0.1610615808E10,TO_ZERO] --> [~1610615808,~1610615808] --> OK [~0.161061568E10,TO_ZERO] --> [~1610615680,~1610615680] --> OK [~0.1610615552E10,TO_ZERO] --> [~1610615552,~1610615552] --> OK [~0.1610615424E10,TO_ZERO] --> [~1610615424,~1610615424] --> OK [~0.1610615296E10,TO_ZERO] --> [~1610615296,~1610615296] --> OK [~0.1610615168E10,TO_ZERO] --> [~1610615168,~1610615168] --> OK [~0.161061504E10,TO_ZERO] --> [~1610615040,~1610615040] --> OK [~0.1610614912E10,TO_ZERO] --> [~1610614912,~1610614912] --> OK [~0.1610614784E10,TO_ZERO] --> [~1610614784,~1610614784] --> OK [~0.1610614656E10,TO_ZERO] --> [~1610614656,~1610614656] --> OK [~0.1610614528E10,TO_ZERO] --> [~1610614528,~1610614528] --> OK [~0.16106144E10,TO_ZERO] --> [~1610614400,~1610614400] --> OK [~0.1610614272E10,TO_ZERO] --> [~1610614272,~1610614272] --> OK [~0.1610614144E10,TO_ZERO] --> [~1610614144,~1610614144] --> OK [~0.1610614016E10,TO_ZERO] --> [~1610614016,~1610614016] --> OK [~0.1610613888E10,TO_ZERO] --> [~1610613888,~1610613888] --> OK [~0.161061376E10,TO_ZERO] --> [~1610613760,~1610613760] --> OK [~0.1610613632E10,TO_ZERO] --> [~1610613632,~1610613632] --> OK [~0.1610613504E10,TO_ZERO] --> [~1610613504,~1610613504] --> OK [~0.1610613376E10,TO_ZERO] --> [~1610613376,~1610613376] --> OK [~0.1610613248E10,TO_ZERO] --> [~1610613248,~1610613248] --> OK [~0.161061312E10,TO_ZERO] --> [~1610613120,~1610613120] --> OK [~0.1610612992E10,TO_ZERO] --> [~1610612992,~1610612992] --> OK [~0.1610612864E10,TO_ZERO] --> [~1610612864,~1610612864] --> OK [~0.1610612736E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610604544E10,TO_ZERO] --> [~1610604544,~1610604544] --> OK [~0.1610604672E10,TO_ZERO] --> [~1610604672,~1610604672] --> OK [~0.16106048E10,TO_ZERO] --> [~1610604800,~1610604800] --> OK [~0.1610604928E10,TO_ZERO] --> [~1610604928,~1610604928] --> OK [~0.1610605056E10,TO_ZERO] --> [~1610605056,~1610605056] --> OK [~0.1610605184E10,TO_ZERO] --> [~1610605184,~1610605184] --> OK [~0.1610605312E10,TO_ZERO] --> [~1610605312,~1610605312] --> OK [~0.161060544E10,TO_ZERO] --> [~1610605440,~1610605440] --> OK [~0.1610605568E10,TO_ZERO] --> [~1610605568,~1610605568] --> OK [~0.1610605696E10,TO_ZERO] --> [~1610605696,~1610605696] --> OK [~0.1610605824E10,TO_ZERO] --> [~1610605824,~1610605824] --> OK [~0.1610605952E10,TO_ZERO] --> [~1610605952,~1610605952] --> OK [~0.161060608E10,TO_ZERO] --> [~1610606080,~1610606080] --> OK [~0.1610606208E10,TO_ZERO] --> [~1610606208,~1610606208] --> OK [~0.1610606336E10,TO_ZERO] --> [~1610606336,~1610606336] --> OK [~0.1610606464E10,TO_ZERO] --> [~1610606464,~1610606464] --> OK [~0.1610606592E10,TO_ZERO] --> [~1610606592,~1610606592] --> OK [~0.161060672E10,TO_ZERO] --> [~1610606720,~1610606720] --> OK [~0.1610606848E10,TO_ZERO] --> [~1610606848,~1610606848] --> OK [~0.1610606976E10,TO_ZERO] --> [~1610606976,~1610606976] --> OK [~0.1610607104E10,TO_ZERO] --> [~1610607104,~1610607104] --> OK [~0.1610607232E10,TO_ZERO] --> [~1610607232,~1610607232] --> OK [~0.161060736E10,TO_ZERO] --> [~1610607360,~1610607360] --> OK [~0.1610607488E10,TO_ZERO] --> [~1610607488,~1610607488] --> OK [~0.1610607616E10,TO_ZERO] --> [~1610607616,~1610607616] --> OK [~0.1610607744E10,TO_ZERO] --> [~1610607744,~1610607744] --> OK [~0.1610607872E10,TO_ZERO] --> [~1610607872,~1610607872] --> OK [~0.1610608E10,TO_ZERO] --> [~1610608000,~1610608000] --> OK [~0.1610608128E10,TO_ZERO] --> [~1610608128,~1610608128] --> OK [~0.1610608256E10,TO_ZERO] --> [~1610608256,~1610608256] --> OK [~0.1610608384E10,TO_ZERO] --> [~1610608384,~1610608384] --> OK [~0.1610608512E10,TO_ZERO] --> [~1610608512,~1610608512] --> OK [~0.161060864E10,TO_ZERO] --> [~1610608640,~1610608640] --> OK [~0.1610608768E10,TO_ZERO] --> [~1610608768,~1610608768] --> OK [~0.1610608896E10,TO_ZERO] --> [~1610608896,~1610608896] --> OK [~0.1610609024E10,TO_ZERO] --> [~1610609024,~1610609024] --> OK [~0.1610609152E10,TO_ZERO] --> [~1610609152,~1610609152] --> OK [~0.161060928E10,TO_ZERO] --> [~1610609280,~1610609280] --> OK [~0.1610609408E10,TO_ZERO] --> [~1610609408,~1610609408] --> OK [~0.1610609536E10,TO_ZERO] --> [~1610609536,~1610609536] --> OK [~0.1610609664E10,TO_ZERO] --> [~1610609664,~1610609664] --> OK [~0.1610609792E10,TO_ZERO] --> [~1610609792,~1610609792] --> OK [~0.161060992E10,TO_ZERO] --> [~1610609920,~1610609920] --> OK [~0.1610610048E10,TO_ZERO] --> [~1610610048,~1610610048] --> OK [~0.1610610176E10,TO_ZERO] --> [~1610610176,~1610610176] --> OK [~0.1610610304E10,TO_ZERO] --> [~1610610304,~1610610304] --> OK [~0.1610610432E10,TO_ZERO] --> [~1610610432,~1610610432] --> OK [~0.161061056E10,TO_ZERO] --> [~1610610560,~1610610560] --> OK [~0.1610610688E10,TO_ZERO] --> [~1610610688,~1610610688] --> OK [~0.1610610816E10,TO_ZERO] --> [~1610610816,~1610610816] --> OK [~0.1610610944E10,TO_ZERO] --> [~1610610944,~1610610944] --> OK [~0.1610611072E10,TO_ZERO] --> [~1610611072,~1610611072] --> OK [~0.16106112E10,TO_ZERO] --> [~1610611200,~1610611200] --> OK [~0.1610611328E10,TO_ZERO] --> [~1610611328,~1610611328] --> OK [~0.1610611456E10,TO_ZERO] --> [~1610611456,~1610611456] --> OK [~0.1610611584E10,TO_ZERO] --> [~1610611584,~1610611584] --> OK [~0.1610611712E10,TO_ZERO] --> [~1610611712,~1610611712] --> OK [~0.161061184E10,TO_ZERO] --> [~1610611840,~1610611840] --> OK [~0.1610611968E10,TO_ZERO] --> [~1610611968,~1610611968] --> OK [~0.1610612096E10,TO_ZERO] --> [~1610612096,~1610612096] --> OK [~0.1610612224E10,TO_ZERO] --> [~1610612224,~1610612224] --> OK [~0.1610612352E10,TO_ZERO] --> [~1610612352,~1610612352] --> OK [~0.161061248E10,TO_ZERO] --> [~1610612480,~1610612480] --> OK [~0.1610612608E10,TO_ZERO] --> [~1610612608,~1610612608] --> OK [~0.1073750016E10,TO_ZERO] --> [~1073750016,~1073750016] --> OK [~0.1073749888E10,TO_ZERO] --> [~1073749888,~1073749888] --> OK [~0.107374976E10,TO_ZERO] --> [~1073749760,~1073749760] --> OK [~0.1073749632E10,TO_ZERO] --> [~1073749632,~1073749632] --> OK [~0.1073749504E10,TO_ZERO] --> [~1073749504,~1073749504] --> OK [~0.1073749376E10,TO_ZERO] --> [~1073749376,~1073749376] --> OK [~0.1073749248E10,TO_ZERO] --> [~1073749248,~1073749248] --> OK [~0.107374912E10,TO_ZERO] --> [~1073749120,~1073749120] --> OK [~0.1073748992E10,TO_ZERO] --> [~1073748992,~1073748992] --> OK [~0.1073748864E10,TO_ZERO] --> [~1073748864,~1073748864] --> OK [~0.1073748736E10,TO_ZERO] --> [~1073748736,~1073748736] --> OK [~0.1073748608E10,TO_ZERO] --> [~1073748608,~1073748608] --> OK [~0.107374848E10,TO_ZERO] --> [~1073748480,~1073748480] --> OK [~0.1073748352E10,TO_ZERO] --> [~1073748352,~1073748352] --> OK [~0.1073748224E10,TO_ZERO] --> [~1073748224,~1073748224] --> OK [~0.1073748096E10,TO_ZERO] --> [~1073748096,~1073748096] --> OK [~0.1073747968E10,TO_ZERO] --> [~1073747968,~1073747968] --> OK [~0.107374784E10,TO_ZERO] --> [~1073747840,~1073747840] --> OK [~0.1073747712E10,TO_ZERO] --> [~1073747712,~1073747712] --> OK [~0.1073747584E10,TO_ZERO] --> [~1073747584,~1073747584] --> OK [~0.1073747456E10,TO_ZERO] --> [~1073747456,~1073747456] --> OK [~0.1073747328E10,TO_ZERO] --> [~1073747328,~1073747328] --> OK [~0.10737472E10,TO_ZERO] --> [~1073747200,~1073747200] --> OK [~0.1073747072E10,TO_ZERO] --> [~1073747072,~1073747072] --> OK [~0.1073746944E10,TO_ZERO] --> [~1073746944,~1073746944] --> OK [~0.1073746816E10,TO_ZERO] --> [~1073746816,~1073746816] --> OK [~0.1073746688E10,TO_ZERO] --> [~1073746688,~1073746688] --> OK [~0.107374656E10,TO_ZERO] --> [~1073746560,~1073746560] --> OK [~0.1073746432E10,TO_ZERO] --> [~1073746432,~1073746432] --> OK [~0.1073746304E10,TO_ZERO] --> [~1073746304,~1073746304] --> OK [~0.1073746176E10,TO_ZERO] --> [~1073746176,~1073746176] --> OK [~0.1073746048E10,TO_ZERO] --> [~1073746048,~1073746048] --> OK [~0.107374592E10,TO_ZERO] --> [~1073745920,~1073745920] --> OK [~0.1073745792E10,TO_ZERO] --> [~1073745792,~1073745792] --> OK [~0.1073745664E10,TO_ZERO] --> [~1073745664,~1073745664] --> OK [~0.1073745536E10,TO_ZERO] --> [~1073745536,~1073745536] --> OK [~0.1073745408E10,TO_ZERO] --> [~1073745408,~1073745408] --> OK [~0.107374528E10,TO_ZERO] --> [~1073745280,~1073745280] --> OK [~0.1073745152E10,TO_ZERO] --> [~1073745152,~1073745152] --> OK [~0.1073745024E10,TO_ZERO] --> [~1073745024,~1073745024] --> OK [~0.1073744896E10,TO_ZERO] --> [~1073744896,~1073744896] --> OK [~0.1073744768E10,TO_ZERO] --> [~1073744768,~1073744768] --> OK [~0.107374464E10,TO_ZERO] --> [~1073744640,~1073744640] --> OK [~0.1073744512E10,TO_ZERO] --> [~1073744512,~1073744512] --> OK [~0.1073744384E10,TO_ZERO] --> [~1073744384,~1073744384] --> OK [~0.1073744256E10,TO_ZERO] --> [~1073744256,~1073744256] --> OK [~0.1073744128E10,TO_ZERO] --> [~1073744128,~1073744128] --> OK [~0.1073744E10,TO_ZERO] --> [~1073744000,~1073744000] --> OK [~0.1073743872E10,TO_ZERO] --> [~1073743872,~1073743872] --> OK [~0.1073743744E10,TO_ZERO] --> [~1073743744,~1073743744] --> OK [~0.1073743616E10,TO_ZERO] --> [~1073743616,~1073743616] --> OK [~0.1073743488E10,TO_ZERO] --> [~1073743488,~1073743488] --> OK [~0.107374336E10,TO_ZERO] --> [~1073743360,~1073743360] --> OK [~0.1073743232E10,TO_ZERO] --> [~1073743232,~1073743232] --> OK [~0.1073743104E10,TO_ZERO] --> [~1073743104,~1073743104] --> OK [~0.1073742976E10,TO_ZERO] --> [~1073742976,~1073742976] --> OK [~0.1073742848E10,TO_ZERO] --> [~1073742848,~1073742848] --> OK [~0.107374272E10,TO_ZERO] --> [~1073742720,~1073742720] --> OK [~0.1073742592E10,TO_ZERO] --> [~1073742592,~1073742592] --> OK [~0.1073742464E10,TO_ZERO] --> [~1073742464,~1073742464] --> OK [~0.1073742336E10,TO_ZERO] --> [~1073742336,~1073742336] --> OK [~0.1073742208E10,TO_ZERO] --> [~1073742208,~1073742208] --> OK [~0.107374208E10,TO_ZERO] --> [~1073742080,~1073742080] --> OK [~0.1073741952E10,TO_ZERO] --> [~1073741952,~1073741952] --> OK [~0.1073741824E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073737728E10,TO_ZERO] --> [~1073737728,~1073737728] --> OK [~0.1073737792E10,TO_ZERO] --> [~1073737792,~1073737792] --> OK [~0.1073737856E10,TO_ZERO] --> [~1073737856,~1073737856] --> OK [~0.107373792E10,TO_ZERO] --> [~1073737920,~1073737920] --> OK [~0.1073737984E10,TO_ZERO] --> [~1073737984,~1073737984] --> OK [~0.1073738048E10,TO_ZERO] --> [~1073738048,~1073738048] --> OK [~0.1073738112E10,TO_ZERO] --> [~1073738112,~1073738112] --> OK [~0.1073738176E10,TO_ZERO] --> [~1073738176,~1073738176] --> OK [~0.107373824E10,TO_ZERO] --> [~1073738240,~1073738240] --> OK [~0.1073738304E10,TO_ZERO] --> [~1073738304,~1073738304] --> OK [~0.1073738368E10,TO_ZERO] --> [~1073738368,~1073738368] --> OK [~0.1073738432E10,TO_ZERO] --> [~1073738432,~1073738432] --> OK [~0.1073738496E10,TO_ZERO] --> [~1073738496,~1073738496] --> OK [~0.107373856E10,TO_ZERO] --> [~1073738560,~1073738560] --> OK [~0.1073738624E10,TO_ZERO] --> [~1073738624,~1073738624] --> OK [~0.1073738688E10,TO_ZERO] --> [~1073738688,~1073738688] --> OK [~0.1073738752E10,TO_ZERO] --> [~1073738752,~1073738752] --> OK [~0.1073738816E10,TO_ZERO] --> [~1073738816,~1073738816] --> OK [~0.107373888E10,TO_ZERO] --> [~1073738880,~1073738880] --> OK [~0.1073738944E10,TO_ZERO] --> [~1073738944,~1073738944] --> OK [~0.1073739008E10,TO_ZERO] --> [~1073739008,~1073739008] --> OK [~0.1073739072E10,TO_ZERO] --> [~1073739072,~1073739072] --> OK [~0.1073739136E10,TO_ZERO] --> [~1073739136,~1073739136] --> OK [~0.10737392E10,TO_ZERO] --> [~1073739200,~1073739200] --> OK [~0.1073739264E10,TO_ZERO] --> [~1073739264,~1073739264] --> OK [~0.1073739328E10,TO_ZERO] --> [~1073739328,~1073739328] --> OK [~0.1073739392E10,TO_ZERO] --> [~1073739392,~1073739392] --> OK [~0.1073739456E10,TO_ZERO] --> [~1073739456,~1073739456] --> OK [~0.107373952E10,TO_ZERO] --> [~1073739520,~1073739520] --> OK [~0.1073739584E10,TO_ZERO] --> [~1073739584,~1073739584] --> OK [~0.1073739648E10,TO_ZERO] --> [~1073739648,~1073739648] --> OK [~0.1073739712E10,TO_ZERO] --> [~1073739712,~1073739712] --> OK [~0.1073739776E10,TO_ZERO] --> [~1073739776,~1073739776] --> OK [~0.107373984E10,TO_ZERO] --> [~1073739840,~1073739840] --> OK [~0.1073739904E10,TO_ZERO] --> [~1073739904,~1073739904] --> OK [~0.1073739968E10,TO_ZERO] --> [~1073739968,~1073739968] --> OK [~0.1073740032E10,TO_ZERO] --> [~1073740032,~1073740032] --> OK [~0.1073740096E10,TO_ZERO] --> [~1073740096,~1073740096] --> OK [~0.107374016E10,TO_ZERO] --> [~1073740160,~1073740160] --> OK [~0.1073740224E10,TO_ZERO] --> [~1073740224,~1073740224] --> OK [~0.1073740288E10,TO_ZERO] --> [~1073740288,~1073740288] --> OK [~0.1073740352E10,TO_ZERO] --> [~1073740352,~1073740352] --> OK [~0.1073740416E10,TO_ZERO] --> [~1073740416,~1073740416] --> OK [~0.107374048E10,TO_ZERO] --> [~1073740480,~1073740480] --> OK [~0.1073740544E10,TO_ZERO] --> [~1073740544,~1073740544] --> OK [~0.1073740608E10,TO_ZERO] --> [~1073740608,~1073740608] --> OK [~0.1073740672E10,TO_ZERO] --> [~1073740672,~1073740672] --> OK [~0.1073740736E10,TO_ZERO] --> [~1073740736,~1073740736] --> OK [~0.10737408E10,TO_ZERO] --> [~1073740800,~1073740800] --> OK [~0.1073740864E10,TO_ZERO] --> [~1073740864,~1073740864] --> OK [~0.1073740928E10,TO_ZERO] --> [~1073740928,~1073740928] --> OK [~0.1073740992E10,TO_ZERO] --> [~1073740992,~1073740992] --> OK [~0.1073741056E10,TO_ZERO] --> [~1073741056,~1073741056] --> OK [~0.107374112E10,TO_ZERO] --> [~1073741120,~1073741120] --> OK [~0.1073741184E10,TO_ZERO] --> [~1073741184,~1073741184] --> OK [~0.1073741248E10,TO_ZERO] --> [~1073741248,~1073741248] --> OK [~0.1073741312E10,TO_ZERO] --> [~1073741312,~1073741312] --> OK [~0.1073741376E10,TO_ZERO] --> [~1073741376,~1073741376] --> OK [~0.107374144E10,TO_ZERO] --> [~1073741440,~1073741440] --> OK [~0.1073741504E10,TO_ZERO] --> [~1073741504,~1073741504] --> OK [~0.1073741568E10,TO_ZERO] --> [~1073741568,~1073741568] --> OK [~0.1073741632E10,TO_ZERO] --> [~1073741632,~1073741632] --> OK [~0.1073741696E10,TO_ZERO] --> [~1073741696,~1073741696] --> OK [~0.107374176E10,TO_ZERO] --> [~1073741760,~1073741760] --> OK [~0.30000153E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000015E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000148E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000145E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000143E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000014E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000138E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000136E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000134E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000013E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000129E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000126E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000124E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000122E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000012E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000117E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000114E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000112E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000011E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000107E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000105E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000103E1,TO_ZERO] --> [~3,~3] --> OK [~0.300001E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000098E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000095E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000093E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000009E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000088E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000086E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000083E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000008E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000079E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000076E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000074E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000072E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000007E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000067E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000064E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000062E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000006E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000057E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000055E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000052E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000005E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000048E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000045E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000043E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000004E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000038E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000036E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000033E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000003E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000029E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000026E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000024E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000021E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000002E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000017E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000014E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000012E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000001E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000007E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000005E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000002E1,TO_ZERO] --> [~3,~3] --> OK [~0.3E1,TO_ZERO] --> [~3,~3] --> OK [~0.29999847E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999985E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999852E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999855E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999857E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999986E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999862E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999864E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999866E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999987E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999871E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999874E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999876E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999878E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999988E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999883E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999886E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999888E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999989E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999893E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999895E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999897E1,TO_ZERO] --> [~2,~2] --> OK [~0.299999E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999902E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999905E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999907E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999991E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999912E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999914E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999917E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999992E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999921E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999924E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999926E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999928E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999993E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999933E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999936E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999938E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999994E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999943E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999945E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999948E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999995E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999952E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999955E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999957E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999996E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999962E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999964E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999967E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999997E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999971E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999974E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999976E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999979E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999998E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999983E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999986E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999988E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999993E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999995E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999998E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000153E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000015E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000148E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000145E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000143E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000014E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000138E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000136E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000134E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000013E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000129E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000126E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000124E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000122E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000012E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000117E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000114E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000112E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000011E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000107E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000105E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000103E1,TO_ZERO] --> [~2,~2] --> OK [~0.200001E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000098E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000095E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000093E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000009E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000088E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000086E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000083E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000008E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000079E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000076E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000074E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000072E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000007E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000067E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000064E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000062E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000006E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000057E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000055E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000052E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000005E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000048E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000045E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000043E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000004E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000038E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000036E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000033E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000003E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000029E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000026E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000024E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000021E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000002E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000017E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000014E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000012E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000001E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000007E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000005E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000002E1,TO_ZERO] --> [~2,~2] --> OK [~0.2E1,TO_ZERO] --> [~2,~2] --> OK [~0.19999924E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999925E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999926E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999927E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999928E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999993E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999931E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999932E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999933E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999934E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999936E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999937E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999938E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999939E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999994E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999942E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999943E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999944E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999945E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999946E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999948E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999949E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999995E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999951E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999952E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999954E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999955E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999956E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999957E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999958E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999996E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999961E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999962E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999963E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999964E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999965E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999967E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999968E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999969E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999997E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999971E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999973E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999974E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999975E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999976E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999977E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999979E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999998E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999981E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999982E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999983E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999985E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999986E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999987E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999988E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999989E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999992E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999993E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999994E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999995E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999996E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999998E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000076E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000075E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000074E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000073E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000072E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000007E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000069E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000068E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000067E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000066E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000064E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000063E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000062E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000061E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000006E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000058E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000057E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000056E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000055E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000054E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000052E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000051E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000005E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000049E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000048E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000046E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000045E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000044E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000043E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000042E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000004E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000039E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000038E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000037E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000036E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000035E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000033E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000032E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000031E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000003E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000029E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000027E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000026E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000025E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000024E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000023E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000021E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000002E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000019E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000018E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000017E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000015E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000014E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000013E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000012E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000011E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000001E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000008E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000007E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000006E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000005E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000004E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000002E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000001E1,TO_ZERO] --> [~1,~1] --> OK [~0.1E1,TO_ZERO] --> [~1,~1] --> OK [~0.9999962,TO_ZERO] --> [0,0] --> OK [~0.99999624,TO_ZERO] --> [0,0] --> OK [~0.9999963,TO_ZERO] --> [0,0] --> OK [~0.99999636,TO_ZERO] --> [0,0] --> OK [~0.9999964,TO_ZERO] --> [0,0] --> OK [~0.9999965,TO_ZERO] --> [0,0] --> OK [~0.99999654,TO_ZERO] --> [0,0] --> OK [~0.9999966,TO_ZERO] --> [0,0] --> OK [~0.99999666,TO_ZERO] --> [0,0] --> OK [~0.9999967,TO_ZERO] --> [0,0] --> OK [~0.9999968,TO_ZERO] --> [0,0] --> OK [~0.99999684,TO_ZERO] --> [0,0] --> OK [~0.9999969,TO_ZERO] --> [0,0] --> OK [~0.99999696,TO_ZERO] --> [0,0] --> OK [~0.999997,TO_ZERO] --> [0,0] --> OK [~0.9999971,TO_ZERO] --> [0,0] --> OK [~0.99999714,TO_ZERO] --> [0,0] --> OK [~0.9999972,TO_ZERO] --> [0,0] --> OK [~0.99999726,TO_ZERO] --> [0,0] --> OK [~0.9999973,TO_ZERO] --> [0,0] --> OK [~0.9999974,TO_ZERO] --> [0,0] --> OK [~0.99999744,TO_ZERO] --> [0,0] --> OK [~0.9999975,TO_ZERO] --> [0,0] --> OK [~0.99999756,TO_ZERO] --> [0,0] --> OK [~0.9999976,TO_ZERO] --> [0,0] --> OK [~0.9999977,TO_ZERO] --> [0,0] --> OK [~0.99999774,TO_ZERO] --> [0,0] --> OK [~0.9999978,TO_ZERO] --> [0,0] --> OK [~0.99999785,TO_ZERO] --> [0,0] --> OK [~0.9999979,TO_ZERO] --> [0,0] --> OK [~0.999998,TO_ZERO] --> [0,0] --> OK [~0.99999803,TO_ZERO] --> [0,0] --> OK [~0.9999981,TO_ZERO] --> [0,0] --> OK [~0.99999815,TO_ZERO] --> [0,0] --> OK [~0.9999982,TO_ZERO] --> [0,0] --> OK [~0.9999983,TO_ZERO] --> [0,0] --> OK [~0.99999833,TO_ZERO] --> [0,0] --> OK [~0.9999984,TO_ZERO] --> [0,0] --> OK [~0.99999845,TO_ZERO] --> [0,0] --> OK [~0.9999985,TO_ZERO] --> [0,0] --> OK [~0.99999857,TO_ZERO] --> [0,0] --> OK [~0.9999986,TO_ZERO] --> [0,0] --> OK [~0.9999987,TO_ZERO] --> [0,0] --> OK [~0.99999875,TO_ZERO] --> [0,0] --> OK [~0.9999988,TO_ZERO] --> [0,0] --> OK [~0.99999887,TO_ZERO] --> [0,0] --> OK [~0.9999989,TO_ZERO] --> [0,0] --> OK [~0.999999,TO_ZERO] --> [0,0] --> OK [~0.99999905,TO_ZERO] --> [0,0] --> OK [~0.9999991,TO_ZERO] --> [0,0] --> OK [~0.99999917,TO_ZERO] --> [0,0] --> OK [~0.9999992,TO_ZERO] --> [0,0] --> OK [~0.9999993,TO_ZERO] --> [0,0] --> OK [~0.99999934,TO_ZERO] --> [0,0] --> OK [~0.9999994,TO_ZERO] --> [0,0] --> OK [~0.99999946,TO_ZERO] --> [0,0] --> OK [~0.9999995,TO_ZERO] --> [0,0] --> OK [~0.9999996,TO_ZERO] --> [0,0] --> OK [~0.99999964,TO_ZERO] --> [0,0] --> OK [~0.9999997,TO_ZERO] --> [0,0] --> OK [~0.99999976,TO_ZERO] --> [0,0] --> OK [~0.9999998,TO_ZERO] --> [0,0] --> OK [~0.9999999,TO_ZERO] --> [0,0] --> OK [~0.99999994,TO_ZERO] --> [0,0] --> OK [~0.9E~43,TO_ZERO] --> [0,0] --> OK [~0.88E~43,TO_ZERO] --> [0,0] --> OK [~0.87E~43,TO_ZERO] --> [0,0] --> OK [~0.85E~43,TO_ZERO] --> [0,0] --> OK [~0.84E~43,TO_ZERO] --> [0,0] --> OK [~0.83E~43,TO_ZERO] --> [0,0] --> OK [~0.81E~43,TO_ZERO] --> [0,0] --> OK [~0.8E~43,TO_ZERO] --> [0,0] --> OK [~0.78E~43,TO_ZERO] --> [0,0] --> OK [~0.77E~43,TO_ZERO] --> [0,0] --> OK [~0.76E~43,TO_ZERO] --> [0,0] --> OK [~0.74E~43,TO_ZERO] --> [0,0] --> OK [~0.73E~43,TO_ZERO] --> [0,0] --> OK [~0.71E~43,TO_ZERO] --> [0,0] --> OK [~0.7E~43,TO_ZERO] --> [0,0] --> OK [~0.69E~43,TO_ZERO] --> [0,0] --> OK [~0.67E~43,TO_ZERO] --> [0,0] --> OK [~0.66E~43,TO_ZERO] --> [0,0] --> OK [~0.64E~43,TO_ZERO] --> [0,0] --> OK [~0.63E~43,TO_ZERO] --> [0,0] --> OK [~0.62E~43,TO_ZERO] --> [0,0] --> OK [~0.6E~43,TO_ZERO] --> [0,0] --> OK [~0.59E~43,TO_ZERO] --> [0,0] --> OK [~0.57E~43,TO_ZERO] --> [0,0] --> OK [~0.56E~43,TO_ZERO] --> [0,0] --> OK [~0.55E~43,TO_ZERO] --> [0,0] --> OK [~0.53E~43,TO_ZERO] --> [0,0] --> OK [~0.52E~43,TO_ZERO] --> [0,0] --> OK [~0.5E~43,TO_ZERO] --> [0,0] --> OK [~0.49E~43,TO_ZERO] --> [0,0] --> OK [~0.48E~43,TO_ZERO] --> [0,0] --> OK [~0.46E~43,TO_ZERO] --> [0,0] --> OK [~0.45E~43,TO_ZERO] --> [0,0] --> OK [~0.43E~43,TO_ZERO] --> [0,0] --> OK [~0.42E~43,TO_ZERO] --> [0,0] --> OK [~0.4E~43,TO_ZERO] --> [0,0] --> OK [~0.39E~43,TO_ZERO] --> [0,0] --> OK [~0.38E~43,TO_ZERO] --> [0,0] --> OK [~0.36E~43,TO_ZERO] --> [0,0] --> OK [~0.35E~43,TO_ZERO] --> [0,0] --> OK [~0.34E~43,TO_ZERO] --> [0,0] --> OK [~0.32E~43,TO_ZERO] --> [0,0] --> OK [~0.31E~43,TO_ZERO] --> [0,0] --> OK [~0.3E~43,TO_ZERO] --> [0,0] --> OK [~0.28E~43,TO_ZERO] --> [0,0] --> OK [~0.27E~43,TO_ZERO] --> [0,0] --> OK [~0.25E~43,TO_ZERO] --> [0,0] --> OK [~0.24E~43,TO_ZERO] --> [0,0] --> OK [~0.22E~43,TO_ZERO] --> [0,0] --> OK [~0.21E~43,TO_ZERO] --> [0,0] --> OK [~0.2E~43,TO_ZERO] --> [0,0] --> OK [~0.18E~43,TO_ZERO] --> [0,0] --> OK [~0.17E~43,TO_ZERO] --> [0,0] --> OK [~0.15E~43,TO_ZERO] --> [0,0] --> OK [~0.14E~43,TO_ZERO] --> [0,0] --> OK [~0.13E~43,TO_ZERO] --> [0,0] --> OK [~0.11E~43,TO_ZERO] --> [0,0] --> OK [~0.1E~43,TO_ZERO] --> [0,0] --> OK [~0.8E~44,TO_ZERO] --> [0,0] --> OK [~0.7E~44,TO_ZERO] --> [0,0] --> OK [~0.6E~44,TO_ZERO] --> [0,0] --> OK [~0.4E~44,TO_ZERO] --> [0,0] --> OK [~0.3E~44,TO_ZERO] --> [0,0] --> OK [~0.1E~44,TO_ZERO] --> [0,0] --> OK [0.0,TO_ZERO] --> [0,0] --> OK [0.9E~43,TO_ZERO] --> [0,0] --> OK [0.88E~43,TO_ZERO] --> [0,0] --> OK [0.87E~43,TO_ZERO] --> [0,0] --> OK [0.85E~43,TO_ZERO] --> [0,0] --> OK [0.84E~43,TO_ZERO] --> [0,0] --> OK [0.83E~43,TO_ZERO] --> [0,0] --> OK [0.81E~43,TO_ZERO] --> [0,0] --> OK [0.8E~43,TO_ZERO] --> [0,0] --> OK [0.78E~43,TO_ZERO] --> [0,0] --> OK [0.77E~43,TO_ZERO] --> [0,0] --> OK [0.76E~43,TO_ZERO] --> [0,0] --> OK [0.74E~43,TO_ZERO] --> [0,0] --> OK [0.73E~43,TO_ZERO] --> [0,0] --> OK [0.71E~43,TO_ZERO] --> [0,0] --> OK [0.7E~43,TO_ZERO] --> [0,0] --> OK [0.69E~43,TO_ZERO] --> [0,0] --> OK [0.67E~43,TO_ZERO] --> [0,0] --> OK [0.66E~43,TO_ZERO] --> [0,0] --> OK [0.64E~43,TO_ZERO] --> [0,0] --> OK [0.63E~43,TO_ZERO] --> [0,0] --> OK [0.62E~43,TO_ZERO] --> [0,0] --> OK [0.6E~43,TO_ZERO] --> [0,0] --> OK [0.59E~43,TO_ZERO] --> [0,0] --> OK [0.57E~43,TO_ZERO] --> [0,0] --> OK [0.56E~43,TO_ZERO] --> [0,0] --> OK [0.55E~43,TO_ZERO] --> [0,0] --> OK [0.53E~43,TO_ZERO] --> [0,0] --> OK [0.52E~43,TO_ZERO] --> [0,0] --> OK [0.5E~43,TO_ZERO] --> [0,0] --> OK [0.49E~43,TO_ZERO] --> [0,0] --> OK [0.48E~43,TO_ZERO] --> [0,0] --> OK [0.46E~43,TO_ZERO] --> [0,0] --> OK [0.45E~43,TO_ZERO] --> [0,0] --> OK [0.43E~43,TO_ZERO] --> [0,0] --> OK [0.42E~43,TO_ZERO] --> [0,0] --> OK [0.4E~43,TO_ZERO] --> [0,0] --> OK [0.39E~43,TO_ZERO] --> [0,0] --> OK [0.38E~43,TO_ZERO] --> [0,0] --> OK [0.36E~43,TO_ZERO] --> [0,0] --> OK [0.35E~43,TO_ZERO] --> [0,0] --> OK [0.34E~43,TO_ZERO] --> [0,0] --> OK [0.32E~43,TO_ZERO] --> [0,0] --> OK [0.31E~43,TO_ZERO] --> [0,0] --> OK [0.3E~43,TO_ZERO] --> [0,0] --> OK [0.28E~43,TO_ZERO] --> [0,0] --> OK [0.27E~43,TO_ZERO] --> [0,0] --> OK [0.25E~43,TO_ZERO] --> [0,0] --> OK [0.24E~43,TO_ZERO] --> [0,0] --> OK [0.22E~43,TO_ZERO] --> [0,0] --> OK [0.21E~43,TO_ZERO] --> [0,0] --> OK [0.2E~43,TO_ZERO] --> [0,0] --> OK [0.18E~43,TO_ZERO] --> [0,0] --> OK [0.17E~43,TO_ZERO] --> [0,0] --> OK [0.15E~43,TO_ZERO] --> [0,0] --> OK [0.14E~43,TO_ZERO] --> [0,0] --> OK [0.13E~43,TO_ZERO] --> [0,0] --> OK [0.11E~43,TO_ZERO] --> [0,0] --> OK [0.1E~43,TO_ZERO] --> [0,0] --> OK [0.8E~44,TO_ZERO] --> [0,0] --> OK [0.7E~44,TO_ZERO] --> [0,0] --> OK [0.6E~44,TO_ZERO] --> [0,0] --> OK [0.4E~44,TO_ZERO] --> [0,0] --> OK [0.3E~44,TO_ZERO] --> [0,0] --> OK [0.1E~44,TO_ZERO] --> [0,0] --> OK [0.9999962,TO_ZERO] --> [0,0] --> OK [0.99999624,TO_ZERO] --> [0,0] --> OK [0.9999963,TO_ZERO] --> [0,0] --> OK [0.99999636,TO_ZERO] --> [0,0] --> OK [0.9999964,TO_ZERO] --> [0,0] --> OK [0.9999965,TO_ZERO] --> [0,0] --> OK [0.99999654,TO_ZERO] --> [0,0] --> OK [0.9999966,TO_ZERO] --> [0,0] --> OK [0.99999666,TO_ZERO] --> [0,0] --> OK [0.9999967,TO_ZERO] --> [0,0] --> OK [0.9999968,TO_ZERO] --> [0,0] --> OK [0.99999684,TO_ZERO] --> [0,0] --> OK [0.9999969,TO_ZERO] --> [0,0] --> OK [0.99999696,TO_ZERO] --> [0,0] --> OK [0.999997,TO_ZERO] --> [0,0] --> OK [0.9999971,TO_ZERO] --> [0,0] --> OK [0.99999714,TO_ZERO] --> [0,0] --> OK [0.9999972,TO_ZERO] --> [0,0] --> OK [0.99999726,TO_ZERO] --> [0,0] --> OK [0.9999973,TO_ZERO] --> [0,0] --> OK [0.9999974,TO_ZERO] --> [0,0] --> OK [0.99999744,TO_ZERO] --> [0,0] --> OK [0.9999975,TO_ZERO] --> [0,0] --> OK [0.99999756,TO_ZERO] --> [0,0] --> OK [0.9999976,TO_ZERO] --> [0,0] --> OK [0.9999977,TO_ZERO] --> [0,0] --> OK [0.99999774,TO_ZERO] --> [0,0] --> OK [0.9999978,TO_ZERO] --> [0,0] --> OK [0.99999785,TO_ZERO] --> [0,0] --> OK [0.9999979,TO_ZERO] --> [0,0] --> OK [0.999998,TO_ZERO] --> [0,0] --> OK [0.99999803,TO_ZERO] --> [0,0] --> OK [0.9999981,TO_ZERO] --> [0,0] --> OK [0.99999815,TO_ZERO] --> [0,0] --> OK [0.9999982,TO_ZERO] --> [0,0] --> OK [0.9999983,TO_ZERO] --> [0,0] --> OK [0.99999833,TO_ZERO] --> [0,0] --> OK [0.9999984,TO_ZERO] --> [0,0] --> OK [0.99999845,TO_ZERO] --> [0,0] --> OK [0.9999985,TO_ZERO] --> [0,0] --> OK [0.99999857,TO_ZERO] --> [0,0] --> OK [0.9999986,TO_ZERO] --> [0,0] --> OK [0.9999987,TO_ZERO] --> [0,0] --> OK [0.99999875,TO_ZERO] --> [0,0] --> OK [0.9999988,TO_ZERO] --> [0,0] --> OK [0.99999887,TO_ZERO] --> [0,0] --> OK [0.9999989,TO_ZERO] --> [0,0] --> OK [0.999999,TO_ZERO] --> [0,0] --> OK [0.99999905,TO_ZERO] --> [0,0] --> OK [0.9999991,TO_ZERO] --> [0,0] --> OK [0.99999917,TO_ZERO] --> [0,0] --> OK [0.9999992,TO_ZERO] --> [0,0] --> OK [0.9999993,TO_ZERO] --> [0,0] --> OK [0.99999934,TO_ZERO] --> [0,0] --> OK [0.9999994,TO_ZERO] --> [0,0] --> OK [0.99999946,TO_ZERO] --> [0,0] --> OK [0.9999995,TO_ZERO] --> [0,0] --> OK [0.9999996,TO_ZERO] --> [0,0] --> OK [0.99999964,TO_ZERO] --> [0,0] --> OK [0.9999997,TO_ZERO] --> [0,0] --> OK [0.99999976,TO_ZERO] --> [0,0] --> OK [0.9999998,TO_ZERO] --> [0,0] --> OK [0.9999999,TO_ZERO] --> [0,0] --> OK [0.99999994,TO_ZERO] --> [0,0] --> OK [0.1E1,TO_ZERO] --> [1,1] --> OK [0.10000076E1,TO_ZERO] --> [1,1] --> OK [0.10000075E1,TO_ZERO] --> [1,1] --> OK [0.10000074E1,TO_ZERO] --> [1,1] --> OK [0.10000073E1,TO_ZERO] --> [1,1] --> OK [0.10000072E1,TO_ZERO] --> [1,1] --> OK [0.1000007E1,TO_ZERO] --> [1,1] --> OK [0.10000069E1,TO_ZERO] --> [1,1] --> OK [0.10000068E1,TO_ZERO] --> [1,1] --> OK [0.10000067E1,TO_ZERO] --> [1,1] --> OK [0.10000066E1,TO_ZERO] --> [1,1] --> OK [0.10000064E1,TO_ZERO] --> [1,1] --> OK [0.10000063E1,TO_ZERO] --> [1,1] --> OK [0.10000062E1,TO_ZERO] --> [1,1] --> OK [0.10000061E1,TO_ZERO] --> [1,1] --> OK [0.1000006E1,TO_ZERO] --> [1,1] --> OK [0.10000058E1,TO_ZERO] --> [1,1] --> OK [0.10000057E1,TO_ZERO] --> [1,1] --> OK [0.10000056E1,TO_ZERO] --> [1,1] --> OK [0.10000055E1,TO_ZERO] --> [1,1] --> OK [0.10000054E1,TO_ZERO] --> [1,1] --> OK [0.10000052E1,TO_ZERO] --> [1,1] --> OK [0.10000051E1,TO_ZERO] --> [1,1] --> OK [0.1000005E1,TO_ZERO] --> [1,1] --> OK [0.10000049E1,TO_ZERO] --> [1,1] --> OK [0.10000048E1,TO_ZERO] --> [1,1] --> OK [0.10000046E1,TO_ZERO] --> [1,1] --> OK [0.10000045E1,TO_ZERO] --> [1,1] --> OK [0.10000044E1,TO_ZERO] --> [1,1] --> OK [0.10000043E1,TO_ZERO] --> [1,1] --> OK [0.10000042E1,TO_ZERO] --> [1,1] --> OK [0.1000004E1,TO_ZERO] --> [1,1] --> OK [0.10000039E1,TO_ZERO] --> [1,1] --> OK [0.10000038E1,TO_ZERO] --> [1,1] --> OK [0.10000037E1,TO_ZERO] --> [1,1] --> OK [0.10000036E1,TO_ZERO] --> [1,1] --> OK [0.10000035E1,TO_ZERO] --> [1,1] --> OK [0.10000033E1,TO_ZERO] --> [1,1] --> OK [0.10000032E1,TO_ZERO] --> [1,1] --> OK [0.10000031E1,TO_ZERO] --> [1,1] --> OK [0.1000003E1,TO_ZERO] --> [1,1] --> OK [0.10000029E1,TO_ZERO] --> [1,1] --> OK [0.10000027E1,TO_ZERO] --> [1,1] --> OK [0.10000026E1,TO_ZERO] --> [1,1] --> OK [0.10000025E1,TO_ZERO] --> [1,1] --> OK [0.10000024E1,TO_ZERO] --> [1,1] --> OK [0.10000023E1,TO_ZERO] --> [1,1] --> OK [0.10000021E1,TO_ZERO] --> [1,1] --> OK [0.1000002E1,TO_ZERO] --> [1,1] --> OK [0.10000019E1,TO_ZERO] --> [1,1] --> OK [0.10000018E1,TO_ZERO] --> [1,1] --> OK [0.10000017E1,TO_ZERO] --> [1,1] --> OK [0.10000015E1,TO_ZERO] --> [1,1] --> OK [0.10000014E1,TO_ZERO] --> [1,1] --> OK [0.10000013E1,TO_ZERO] --> [1,1] --> OK [0.10000012E1,TO_ZERO] --> [1,1] --> OK [0.10000011E1,TO_ZERO] --> [1,1] --> OK [0.1000001E1,TO_ZERO] --> [1,1] --> OK [0.10000008E1,TO_ZERO] --> [1,1] --> OK [0.10000007E1,TO_ZERO] --> [1,1] --> OK [0.10000006E1,TO_ZERO] --> [1,1] --> OK [0.10000005E1,TO_ZERO] --> [1,1] --> OK [0.10000004E1,TO_ZERO] --> [1,1] --> OK [0.10000002E1,TO_ZERO] --> [1,1] --> OK [0.10000001E1,TO_ZERO] --> [1,1] --> OK [0.19999924E1,TO_ZERO] --> [1,1] --> OK [0.19999925E1,TO_ZERO] --> [1,1] --> OK [0.19999926E1,TO_ZERO] --> [1,1] --> OK [0.19999927E1,TO_ZERO] --> [1,1] --> OK [0.19999928E1,TO_ZERO] --> [1,1] --> OK [0.1999993E1,TO_ZERO] --> [1,1] --> OK [0.19999931E1,TO_ZERO] --> [1,1] --> OK [0.19999932E1,TO_ZERO] --> [1,1] --> OK [0.19999933E1,TO_ZERO] --> [1,1] --> OK [0.19999934E1,TO_ZERO] --> [1,1] --> OK [0.19999936E1,TO_ZERO] --> [1,1] --> OK [0.19999937E1,TO_ZERO] --> [1,1] --> OK [0.19999938E1,TO_ZERO] --> [1,1] --> OK [0.19999939E1,TO_ZERO] --> [1,1] --> OK [0.1999994E1,TO_ZERO] --> [1,1] --> OK [0.19999942E1,TO_ZERO] --> [1,1] --> OK [0.19999943E1,TO_ZERO] --> [1,1] --> OK [0.19999944E1,TO_ZERO] --> [1,1] --> OK [0.19999945E1,TO_ZERO] --> [1,1] --> OK [0.19999946E1,TO_ZERO] --> [1,1] --> OK [0.19999948E1,TO_ZERO] --> [1,1] --> OK [0.19999949E1,TO_ZERO] --> [1,1] --> OK [0.1999995E1,TO_ZERO] --> [1,1] --> OK [0.19999951E1,TO_ZERO] --> [1,1] --> OK [0.19999952E1,TO_ZERO] --> [1,1] --> OK [0.19999954E1,TO_ZERO] --> [1,1] --> OK [0.19999955E1,TO_ZERO] --> [1,1] --> OK [0.19999956E1,TO_ZERO] --> [1,1] --> OK [0.19999957E1,TO_ZERO] --> [1,1] --> OK [0.19999958E1,TO_ZERO] --> [1,1] --> OK [0.1999996E1,TO_ZERO] --> [1,1] --> OK [0.19999961E1,TO_ZERO] --> [1,1] --> OK [0.19999962E1,TO_ZERO] --> [1,1] --> OK [0.19999963E1,TO_ZERO] --> [1,1] --> OK [0.19999964E1,TO_ZERO] --> [1,1] --> OK [0.19999965E1,TO_ZERO] --> [1,1] --> OK [0.19999967E1,TO_ZERO] --> [1,1] --> OK [0.19999968E1,TO_ZERO] --> [1,1] --> OK [0.19999969E1,TO_ZERO] --> [1,1] --> OK [0.1999997E1,TO_ZERO] --> [1,1] --> OK [0.19999971E1,TO_ZERO] --> [1,1] --> OK [0.19999973E1,TO_ZERO] --> [1,1] --> OK [0.19999974E1,TO_ZERO] --> [1,1] --> OK [0.19999975E1,TO_ZERO] --> [1,1] --> OK [0.19999976E1,TO_ZERO] --> [1,1] --> OK [0.19999977E1,TO_ZERO] --> [1,1] --> OK [0.19999979E1,TO_ZERO] --> [1,1] --> OK [0.1999998E1,TO_ZERO] --> [1,1] --> OK [0.19999981E1,TO_ZERO] --> [1,1] --> OK [0.19999982E1,TO_ZERO] --> [1,1] --> OK [0.19999983E1,TO_ZERO] --> [1,1] --> OK [0.19999985E1,TO_ZERO] --> [1,1] --> OK [0.19999986E1,TO_ZERO] --> [1,1] --> OK [0.19999987E1,TO_ZERO] --> [1,1] --> OK [0.19999988E1,TO_ZERO] --> [1,1] --> OK [0.19999989E1,TO_ZERO] --> [1,1] --> OK [0.1999999E1,TO_ZERO] --> [1,1] --> OK [0.19999992E1,TO_ZERO] --> [1,1] --> OK [0.19999993E1,TO_ZERO] --> [1,1] --> OK [0.19999994E1,TO_ZERO] --> [1,1] --> OK [0.19999995E1,TO_ZERO] --> [1,1] --> OK [0.19999996E1,TO_ZERO] --> [1,1] --> OK [0.19999998E1,TO_ZERO] --> [1,1] --> OK [0.19999999E1,TO_ZERO] --> [1,1] --> OK [0.2E1,TO_ZERO] --> [2,2] --> OK [0.20000153E1,TO_ZERO] --> [2,2] --> OK [0.2000015E1,TO_ZERO] --> [2,2] --> OK [0.20000148E1,TO_ZERO] --> [2,2] --> OK [0.20000145E1,TO_ZERO] --> [2,2] --> OK [0.20000143E1,TO_ZERO] --> [2,2] --> OK [0.2000014E1,TO_ZERO] --> [2,2] --> OK [0.20000138E1,TO_ZERO] --> [2,2] --> OK [0.20000136E1,TO_ZERO] --> [2,2] --> OK [0.20000134E1,TO_ZERO] --> [2,2] --> OK [0.2000013E1,TO_ZERO] --> [2,2] --> OK [0.20000129E1,TO_ZERO] --> [2,2] --> OK [0.20000126E1,TO_ZERO] --> [2,2] --> OK [0.20000124E1,TO_ZERO] --> [2,2] --> OK [0.20000122E1,TO_ZERO] --> [2,2] --> OK [0.2000012E1,TO_ZERO] --> [2,2] --> OK [0.20000117E1,TO_ZERO] --> [2,2] --> OK [0.20000114E1,TO_ZERO] --> [2,2] --> OK [0.20000112E1,TO_ZERO] --> [2,2] --> OK [0.2000011E1,TO_ZERO] --> [2,2] --> OK [0.20000107E1,TO_ZERO] --> [2,2] --> OK [0.20000105E1,TO_ZERO] --> [2,2] --> OK [0.20000103E1,TO_ZERO] --> [2,2] --> OK [0.200001E1,TO_ZERO] --> [2,2] --> OK [0.20000098E1,TO_ZERO] --> [2,2] --> OK [0.20000095E1,TO_ZERO] --> [2,2] --> OK [0.20000093E1,TO_ZERO] --> [2,2] --> OK [0.2000009E1,TO_ZERO] --> [2,2] --> OK [0.20000088E1,TO_ZERO] --> [2,2] --> OK [0.20000086E1,TO_ZERO] --> [2,2] --> OK [0.20000083E1,TO_ZERO] --> [2,2] --> OK [0.2000008E1,TO_ZERO] --> [2,2] --> OK [0.20000079E1,TO_ZERO] --> [2,2] --> OK [0.20000076E1,TO_ZERO] --> [2,2] --> OK [0.20000074E1,TO_ZERO] --> [2,2] --> OK [0.20000072E1,TO_ZERO] --> [2,2] --> OK [0.2000007E1,TO_ZERO] --> [2,2] --> OK [0.20000067E1,TO_ZERO] --> [2,2] --> OK [0.20000064E1,TO_ZERO] --> [2,2] --> OK [0.20000062E1,TO_ZERO] --> [2,2] --> OK [0.2000006E1,TO_ZERO] --> [2,2] --> OK [0.20000057E1,TO_ZERO] --> [2,2] --> OK [0.20000055E1,TO_ZERO] --> [2,2] --> OK [0.20000052E1,TO_ZERO] --> [2,2] --> OK [0.2000005E1,TO_ZERO] --> [2,2] --> OK [0.20000048E1,TO_ZERO] --> [2,2] --> OK [0.20000045E1,TO_ZERO] --> [2,2] --> OK [0.20000043E1,TO_ZERO] --> [2,2] --> OK [0.2000004E1,TO_ZERO] --> [2,2] --> OK [0.20000038E1,TO_ZERO] --> [2,2] --> OK [0.20000036E1,TO_ZERO] --> [2,2] --> OK [0.20000033E1,TO_ZERO] --> [2,2] --> OK [0.2000003E1,TO_ZERO] --> [2,2] --> OK [0.20000029E1,TO_ZERO] --> [2,2] --> OK [0.20000026E1,TO_ZERO] --> [2,2] --> OK [0.20000024E1,TO_ZERO] --> [2,2] --> OK [0.20000021E1,TO_ZERO] --> [2,2] --> OK [0.2000002E1,TO_ZERO] --> [2,2] --> OK [0.20000017E1,TO_ZERO] --> [2,2] --> OK [0.20000014E1,TO_ZERO] --> [2,2] --> OK [0.20000012E1,TO_ZERO] --> [2,2] --> OK [0.2000001E1,TO_ZERO] --> [2,2] --> OK [0.20000007E1,TO_ZERO] --> [2,2] --> OK [0.20000005E1,TO_ZERO] --> [2,2] --> OK [0.20000002E1,TO_ZERO] --> [2,2] --> OK [0.29999847E1,TO_ZERO] --> [2,2] --> OK [0.2999985E1,TO_ZERO] --> [2,2] --> OK [0.29999852E1,TO_ZERO] --> [2,2] --> OK [0.29999855E1,TO_ZERO] --> [2,2] --> OK [0.29999857E1,TO_ZERO] --> [2,2] --> OK [0.2999986E1,TO_ZERO] --> [2,2] --> OK [0.29999862E1,TO_ZERO] --> [2,2] --> OK [0.29999864E1,TO_ZERO] --> [2,2] --> OK [0.29999866E1,TO_ZERO] --> [2,2] --> OK [0.2999987E1,TO_ZERO] --> [2,2] --> OK [0.29999871E1,TO_ZERO] --> [2,2] --> OK [0.29999874E1,TO_ZERO] --> [2,2] --> OK [0.29999876E1,TO_ZERO] --> [2,2] --> OK [0.29999878E1,TO_ZERO] --> [2,2] --> OK [0.2999988E1,TO_ZERO] --> [2,2] --> OK [0.29999883E1,TO_ZERO] --> [2,2] --> OK [0.29999886E1,TO_ZERO] --> [2,2] --> OK [0.29999888E1,TO_ZERO] --> [2,2] --> OK [0.2999989E1,TO_ZERO] --> [2,2] --> OK [0.29999893E1,TO_ZERO] --> [2,2] --> OK [0.29999895E1,TO_ZERO] --> [2,2] --> OK [0.29999897E1,TO_ZERO] --> [2,2] --> OK [0.299999E1,TO_ZERO] --> [2,2] --> OK [0.29999902E1,TO_ZERO] --> [2,2] --> OK [0.29999905E1,TO_ZERO] --> [2,2] --> OK [0.29999907E1,TO_ZERO] --> [2,2] --> OK [0.2999991E1,TO_ZERO] --> [2,2] --> OK [0.29999912E1,TO_ZERO] --> [2,2] --> OK [0.29999914E1,TO_ZERO] --> [2,2] --> OK [0.29999917E1,TO_ZERO] --> [2,2] --> OK [0.2999992E1,TO_ZERO] --> [2,2] --> OK [0.29999921E1,TO_ZERO] --> [2,2] --> OK [0.29999924E1,TO_ZERO] --> [2,2] --> OK [0.29999926E1,TO_ZERO] --> [2,2] --> OK [0.29999928E1,TO_ZERO] --> [2,2] --> OK [0.2999993E1,TO_ZERO] --> [2,2] --> OK [0.29999933E1,TO_ZERO] --> [2,2] --> OK [0.29999936E1,TO_ZERO] --> [2,2] --> OK [0.29999938E1,TO_ZERO] --> [2,2] --> OK [0.2999994E1,TO_ZERO] --> [2,2] --> OK [0.29999943E1,TO_ZERO] --> [2,2] --> OK [0.29999945E1,TO_ZERO] --> [2,2] --> OK [0.29999948E1,TO_ZERO] --> [2,2] --> OK [0.2999995E1,TO_ZERO] --> [2,2] --> OK [0.29999952E1,TO_ZERO] --> [2,2] --> OK [0.29999955E1,TO_ZERO] --> [2,2] --> OK [0.29999957E1,TO_ZERO] --> [2,2] --> OK [0.2999996E1,TO_ZERO] --> [2,2] --> OK [0.29999962E1,TO_ZERO] --> [2,2] --> OK [0.29999964E1,TO_ZERO] --> [2,2] --> OK [0.29999967E1,TO_ZERO] --> [2,2] --> OK [0.2999997E1,TO_ZERO] --> [2,2] --> OK [0.29999971E1,TO_ZERO] --> [2,2] --> OK [0.29999974E1,TO_ZERO] --> [2,2] --> OK [0.29999976E1,TO_ZERO] --> [2,2] --> OK [0.29999979E1,TO_ZERO] --> [2,2] --> OK [0.2999998E1,TO_ZERO] --> [2,2] --> OK [0.29999983E1,TO_ZERO] --> [2,2] --> OK [0.29999986E1,TO_ZERO] --> [2,2] --> OK [0.29999988E1,TO_ZERO] --> [2,2] --> OK [0.2999999E1,TO_ZERO] --> [2,2] --> OK [0.29999993E1,TO_ZERO] --> [2,2] --> OK [0.29999995E1,TO_ZERO] --> [2,2] --> OK [0.29999998E1,TO_ZERO] --> [2,2] --> OK [0.3E1,TO_ZERO] --> [3,3] --> OK [0.30000153E1,TO_ZERO] --> [3,3] --> OK [0.3000015E1,TO_ZERO] --> [3,3] --> OK [0.30000148E1,TO_ZERO] --> [3,3] --> OK [0.30000145E1,TO_ZERO] --> [3,3] --> OK [0.30000143E1,TO_ZERO] --> [3,3] --> OK [0.3000014E1,TO_ZERO] --> [3,3] --> OK [0.30000138E1,TO_ZERO] --> [3,3] --> OK [0.30000136E1,TO_ZERO] --> [3,3] --> OK [0.30000134E1,TO_ZERO] --> [3,3] --> OK [0.3000013E1,TO_ZERO] --> [3,3] --> OK [0.30000129E1,TO_ZERO] --> [3,3] --> OK [0.30000126E1,TO_ZERO] --> [3,3] --> OK [0.30000124E1,TO_ZERO] --> [3,3] --> OK [0.30000122E1,TO_ZERO] --> [3,3] --> OK [0.3000012E1,TO_ZERO] --> [3,3] --> OK [0.30000117E1,TO_ZERO] --> [3,3] --> OK [0.30000114E1,TO_ZERO] --> [3,3] --> OK [0.30000112E1,TO_ZERO] --> [3,3] --> OK [0.3000011E1,TO_ZERO] --> [3,3] --> OK [0.30000107E1,TO_ZERO] --> [3,3] --> OK [0.30000105E1,TO_ZERO] --> [3,3] --> OK [0.30000103E1,TO_ZERO] --> [3,3] --> OK [0.300001E1,TO_ZERO] --> [3,3] --> OK [0.30000098E1,TO_ZERO] --> [3,3] --> OK [0.30000095E1,TO_ZERO] --> [3,3] --> OK [0.30000093E1,TO_ZERO] --> [3,3] --> OK [0.3000009E1,TO_ZERO] --> [3,3] --> OK [0.30000088E1,TO_ZERO] --> [3,3] --> OK [0.30000086E1,TO_ZERO] --> [3,3] --> OK [0.30000083E1,TO_ZERO] --> [3,3] --> OK [0.3000008E1,TO_ZERO] --> [3,3] --> OK [0.30000079E1,TO_ZERO] --> [3,3] --> OK [0.30000076E1,TO_ZERO] --> [3,3] --> OK [0.30000074E1,TO_ZERO] --> [3,3] --> OK [0.30000072E1,TO_ZERO] --> [3,3] --> OK [0.3000007E1,TO_ZERO] --> [3,3] --> OK [0.30000067E1,TO_ZERO] --> [3,3] --> OK [0.30000064E1,TO_ZERO] --> [3,3] --> OK [0.30000062E1,TO_ZERO] --> [3,3] --> OK [0.3000006E1,TO_ZERO] --> [3,3] --> OK [0.30000057E1,TO_ZERO] --> [3,3] --> OK [0.30000055E1,TO_ZERO] --> [3,3] --> OK [0.30000052E1,TO_ZERO] --> [3,3] --> OK [0.3000005E1,TO_ZERO] --> [3,3] --> OK [0.30000048E1,TO_ZERO] --> [3,3] --> OK [0.30000045E1,TO_ZERO] --> [3,3] --> OK [0.30000043E1,TO_ZERO] --> [3,3] --> OK [0.3000004E1,TO_ZERO] --> [3,3] --> OK [0.30000038E1,TO_ZERO] --> [3,3] --> OK [0.30000036E1,TO_ZERO] --> [3,3] --> OK [0.30000033E1,TO_ZERO] --> [3,3] --> OK [0.3000003E1,TO_ZERO] --> [3,3] --> OK [0.30000029E1,TO_ZERO] --> [3,3] --> OK [0.30000026E1,TO_ZERO] --> [3,3] --> OK [0.30000024E1,TO_ZERO] --> [3,3] --> OK [0.30000021E1,TO_ZERO] --> [3,3] --> OK [0.3000002E1,TO_ZERO] --> [3,3] --> OK [0.30000017E1,TO_ZERO] --> [3,3] --> OK [0.30000014E1,TO_ZERO] --> [3,3] --> OK [0.30000012E1,TO_ZERO] --> [3,3] --> OK [0.3000001E1,TO_ZERO] --> [3,3] --> OK [0.30000007E1,TO_ZERO] --> [3,3] --> OK [0.30000005E1,TO_ZERO] --> [3,3] --> OK [0.30000002E1,TO_ZERO] --> [3,3] --> OK [0.1073737728E10,TO_ZERO] --> [1073737728,1073737728] --> OK [0.1073737792E10,TO_ZERO] --> [1073737792,1073737792] --> OK [0.1073737856E10,TO_ZERO] --> [1073737856,1073737856] --> OK [0.107373792E10,TO_ZERO] --> [1073737920,1073737920] --> OK [0.1073737984E10,TO_ZERO] --> [1073737984,1073737984] --> OK [0.1073738048E10,TO_ZERO] --> [1073738048,1073738048] --> OK [0.1073738112E10,TO_ZERO] --> [1073738112,1073738112] --> OK [0.1073738176E10,TO_ZERO] --> [1073738176,1073738176] --> OK [0.107373824E10,TO_ZERO] --> [1073738240,1073738240] --> OK [0.1073738304E10,TO_ZERO] --> [1073738304,1073738304] --> OK [0.1073738368E10,TO_ZERO] --> [1073738368,1073738368] --> OK [0.1073738432E10,TO_ZERO] --> [1073738432,1073738432] --> OK [0.1073738496E10,TO_ZERO] --> [1073738496,1073738496] --> OK [0.107373856E10,TO_ZERO] --> [1073738560,1073738560] --> OK [0.1073738624E10,TO_ZERO] --> [1073738624,1073738624] --> OK [0.1073738688E10,TO_ZERO] --> [1073738688,1073738688] --> OK [0.1073738752E10,TO_ZERO] --> [1073738752,1073738752] --> OK [0.1073738816E10,TO_ZERO] --> [1073738816,1073738816] --> OK [0.107373888E10,TO_ZERO] --> [1073738880,1073738880] --> OK [0.1073738944E10,TO_ZERO] --> [1073738944,1073738944] --> OK [0.1073739008E10,TO_ZERO] --> [1073739008,1073739008] --> OK [0.1073739072E10,TO_ZERO] --> [1073739072,1073739072] --> OK [0.1073739136E10,TO_ZERO] --> [1073739136,1073739136] --> OK [0.10737392E10,TO_ZERO] --> [1073739200,1073739200] --> OK [0.1073739264E10,TO_ZERO] --> [1073739264,1073739264] --> OK [0.1073739328E10,TO_ZERO] --> [1073739328,1073739328] --> OK [0.1073739392E10,TO_ZERO] --> [1073739392,1073739392] --> OK [0.1073739456E10,TO_ZERO] --> [1073739456,1073739456] --> OK [0.107373952E10,TO_ZERO] --> [1073739520,1073739520] --> OK [0.1073739584E10,TO_ZERO] --> [1073739584,1073739584] --> OK [0.1073739648E10,TO_ZERO] --> [1073739648,1073739648] --> OK [0.1073739712E10,TO_ZERO] --> [1073739712,1073739712] --> OK [0.1073739776E10,TO_ZERO] --> [1073739776,1073739776] --> OK [0.107373984E10,TO_ZERO] --> [1073739840,1073739840] --> OK [0.1073739904E10,TO_ZERO] --> [1073739904,1073739904] --> OK [0.1073739968E10,TO_ZERO] --> [1073739968,1073739968] --> OK [0.1073740032E10,TO_ZERO] --> [1073740032,1073740032] --> OK [0.1073740096E10,TO_ZERO] --> [1073740096,1073740096] --> OK [0.107374016E10,TO_ZERO] --> [1073740160,1073740160] --> OK [0.1073740224E10,TO_ZERO] --> [1073740224,1073740224] --> OK [0.1073740288E10,TO_ZERO] --> [1073740288,1073740288] --> OK [0.1073740352E10,TO_ZERO] --> [1073740352,1073740352] --> OK [0.1073740416E10,TO_ZERO] --> [1073740416,1073740416] --> OK [0.107374048E10,TO_ZERO] --> [1073740480,1073740480] --> OK [0.1073740544E10,TO_ZERO] --> [1073740544,1073740544] --> OK [0.1073740608E10,TO_ZERO] --> [1073740608,1073740608] --> OK [0.1073740672E10,TO_ZERO] --> [1073740672,1073740672] --> OK [0.1073740736E10,TO_ZERO] --> [1073740736,1073740736] --> OK [0.10737408E10,TO_ZERO] --> [1073740800,1073740800] --> OK [0.1073740864E10,TO_ZERO] --> [1073740864,1073740864] --> OK [0.1073740928E10,TO_ZERO] --> [1073740928,1073740928] --> OK [0.1073740992E10,TO_ZERO] --> [1073740992,1073740992] --> OK [0.1073741056E10,TO_ZERO] --> [1073741056,1073741056] --> OK [0.107374112E10,TO_ZERO] --> [1073741120,1073741120] --> OK [0.1073741184E10,TO_ZERO] --> [1073741184,1073741184] --> OK [0.1073741248E10,TO_ZERO] --> [1073741248,1073741248] --> OK [0.1073741312E10,TO_ZERO] --> [1073741312,1073741312] --> OK [0.1073741376E10,TO_ZERO] --> [1073741376,1073741376] --> OK [0.107374144E10,TO_ZERO] --> [1073741440,1073741440] --> OK [0.1073741504E10,TO_ZERO] --> [1073741504,1073741504] --> OK [0.1073741568E10,TO_ZERO] --> [1073741568,1073741568] --> OK [0.1073741632E10,TO_ZERO] --> [1073741632,1073741632] --> OK [0.1073741696E10,TO_ZERO] --> [1073741696,1073741696] --> OK [0.107374176E10,TO_ZERO] --> [1073741760,1073741760] --> OK [0.1073741824E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073750016E10,TO_ZERO] --> [1073750016,1073750016] --> OK [0.1073749888E10,TO_ZERO] --> [1073749888,1073749888] --> OK [0.107374976E10,TO_ZERO] --> [1073749760,1073749760] --> OK [0.1073749632E10,TO_ZERO] --> [1073749632,1073749632] --> OK [0.1073749504E10,TO_ZERO] --> [1073749504,1073749504] --> OK [0.1073749376E10,TO_ZERO] --> [1073749376,1073749376] --> OK [0.1073749248E10,TO_ZERO] --> [1073749248,1073749248] --> OK [0.107374912E10,TO_ZERO] --> [1073749120,1073749120] --> OK [0.1073748992E10,TO_ZERO] --> [1073748992,1073748992] --> OK [0.1073748864E10,TO_ZERO] --> [1073748864,1073748864] --> OK [0.1073748736E10,TO_ZERO] --> [1073748736,1073748736] --> OK [0.1073748608E10,TO_ZERO] --> [1073748608,1073748608] --> OK [0.107374848E10,TO_ZERO] --> [1073748480,1073748480] --> OK [0.1073748352E10,TO_ZERO] --> [1073748352,1073748352] --> OK [0.1073748224E10,TO_ZERO] --> [1073748224,1073748224] --> OK [0.1073748096E10,TO_ZERO] --> [1073748096,1073748096] --> OK [0.1073747968E10,TO_ZERO] --> [1073747968,1073747968] --> OK [0.107374784E10,TO_ZERO] --> [1073747840,1073747840] --> OK [0.1073747712E10,TO_ZERO] --> [1073747712,1073747712] --> OK [0.1073747584E10,TO_ZERO] --> [1073747584,1073747584] --> OK [0.1073747456E10,TO_ZERO] --> [1073747456,1073747456] --> OK [0.1073747328E10,TO_ZERO] --> [1073747328,1073747328] --> OK [0.10737472E10,TO_ZERO] --> [1073747200,1073747200] --> OK [0.1073747072E10,TO_ZERO] --> [1073747072,1073747072] --> OK [0.1073746944E10,TO_ZERO] --> [1073746944,1073746944] --> OK [0.1073746816E10,TO_ZERO] --> [1073746816,1073746816] --> OK [0.1073746688E10,TO_ZERO] --> [1073746688,1073746688] --> OK [0.107374656E10,TO_ZERO] --> [1073746560,1073746560] --> OK [0.1073746432E10,TO_ZERO] --> [1073746432,1073746432] --> OK [0.1073746304E10,TO_ZERO] --> [1073746304,1073746304] --> OK [0.1073746176E10,TO_ZERO] --> [1073746176,1073746176] --> OK [0.1073746048E10,TO_ZERO] --> [1073746048,1073746048] --> OK [0.107374592E10,TO_ZERO] --> [1073745920,1073745920] --> OK [0.1073745792E10,TO_ZERO] --> [1073745792,1073745792] --> OK [0.1073745664E10,TO_ZERO] --> [1073745664,1073745664] --> OK [0.1073745536E10,TO_ZERO] --> [1073745536,1073745536] --> OK [0.1073745408E10,TO_ZERO] --> [1073745408,1073745408] --> OK [0.107374528E10,TO_ZERO] --> [1073745280,1073745280] --> OK [0.1073745152E10,TO_ZERO] --> [1073745152,1073745152] --> OK [0.1073745024E10,TO_ZERO] --> [1073745024,1073745024] --> OK [0.1073744896E10,TO_ZERO] --> [1073744896,1073744896] --> OK [0.1073744768E10,TO_ZERO] --> [1073744768,1073744768] --> OK [0.107374464E10,TO_ZERO] --> [1073744640,1073744640] --> OK [0.1073744512E10,TO_ZERO] --> [1073744512,1073744512] --> OK [0.1073744384E10,TO_ZERO] --> [1073744384,1073744384] --> OK [0.1073744256E10,TO_ZERO] --> [1073744256,1073744256] --> OK [0.1073744128E10,TO_ZERO] --> [1073744128,1073744128] --> OK [0.1073744E10,TO_ZERO] --> [1073744000,1073744000] --> OK [0.1073743872E10,TO_ZERO] --> [1073743872,1073743872] --> OK [0.1073743744E10,TO_ZERO] --> [1073743744,1073743744] --> OK [0.1073743616E10,TO_ZERO] --> [1073743616,1073743616] --> OK [0.1073743488E10,TO_ZERO] --> [1073743488,1073743488] --> OK [0.107374336E10,TO_ZERO] --> [1073743360,1073743360] --> OK [0.1073743232E10,TO_ZERO] --> [1073743232,1073743232] --> OK [0.1073743104E10,TO_ZERO] --> [1073743104,1073743104] --> OK [0.1073742976E10,TO_ZERO] --> [1073742976,1073742976] --> OK [0.1073742848E10,TO_ZERO] --> [1073742848,1073742848] --> OK [0.107374272E10,TO_ZERO] --> [1073742720,1073742720] --> OK [0.1073742592E10,TO_ZERO] --> [1073742592,1073742592] --> OK [0.1073742464E10,TO_ZERO] --> [1073742464,1073742464] --> OK [0.1073742336E10,TO_ZERO] --> [1073742336,1073742336] --> OK [0.1073742208E10,TO_ZERO] --> [1073742208,1073742208] --> OK [0.107374208E10,TO_ZERO] --> [1073742080,1073742080] --> OK [0.1073741952E10,TO_ZERO] --> [1073741952,1073741952] --> OK [0.1610604544E10,TO_ZERO] --> [1610604544,1610604544] --> OK [0.1610604672E10,TO_ZERO] --> [1610604672,1610604672] --> OK [0.16106048E10,TO_ZERO] --> [1610604800,1610604800] --> OK [0.1610604928E10,TO_ZERO] --> [1610604928,1610604928] --> OK [0.1610605056E10,TO_ZERO] --> [1610605056,1610605056] --> OK [0.1610605184E10,TO_ZERO] --> [1610605184,1610605184] --> OK [0.1610605312E10,TO_ZERO] --> [1610605312,1610605312] --> OK [0.161060544E10,TO_ZERO] --> [1610605440,1610605440] --> OK [0.1610605568E10,TO_ZERO] --> [1610605568,1610605568] --> OK [0.1610605696E10,TO_ZERO] --> [1610605696,1610605696] --> OK [0.1610605824E10,TO_ZERO] --> [1610605824,1610605824] --> OK [0.1610605952E10,TO_ZERO] --> [1610605952,1610605952] --> OK [0.161060608E10,TO_ZERO] --> [1610606080,1610606080] --> OK [0.1610606208E10,TO_ZERO] --> [1610606208,1610606208] --> OK [0.1610606336E10,TO_ZERO] --> [1610606336,1610606336] --> OK [0.1610606464E10,TO_ZERO] --> [1610606464,1610606464] --> OK [0.1610606592E10,TO_ZERO] --> [1610606592,1610606592] --> OK [0.161060672E10,TO_ZERO] --> [1610606720,1610606720] --> OK [0.1610606848E10,TO_ZERO] --> [1610606848,1610606848] --> OK [0.1610606976E10,TO_ZERO] --> [1610606976,1610606976] --> OK [0.1610607104E10,TO_ZERO] --> [1610607104,1610607104] --> OK [0.1610607232E10,TO_ZERO] --> [1610607232,1610607232] --> OK [0.161060736E10,TO_ZERO] --> [1610607360,1610607360] --> OK [0.1610607488E10,TO_ZERO] --> [1610607488,1610607488] --> OK [0.1610607616E10,TO_ZERO] --> [1610607616,1610607616] --> OK [0.1610607744E10,TO_ZERO] --> [1610607744,1610607744] --> OK [0.1610607872E10,TO_ZERO] --> [1610607872,1610607872] --> OK [0.1610608E10,TO_ZERO] --> [1610608000,1610608000] --> OK [0.1610608128E10,TO_ZERO] --> [1610608128,1610608128] --> OK [0.1610608256E10,TO_ZERO] --> [1610608256,1610608256] --> OK [0.1610608384E10,TO_ZERO] --> [1610608384,1610608384] --> OK [0.1610608512E10,TO_ZERO] --> [1610608512,1610608512] --> OK [0.161060864E10,TO_ZERO] --> [1610608640,1610608640] --> OK [0.1610608768E10,TO_ZERO] --> [1610608768,1610608768] --> OK [0.1610608896E10,TO_ZERO] --> [1610608896,1610608896] --> OK [0.1610609024E10,TO_ZERO] --> [1610609024,1610609024] --> OK [0.1610609152E10,TO_ZERO] --> [1610609152,1610609152] --> OK [0.161060928E10,TO_ZERO] --> [1610609280,1610609280] --> OK [0.1610609408E10,TO_ZERO] --> [1610609408,1610609408] --> OK [0.1610609536E10,TO_ZERO] --> [1610609536,1610609536] --> OK [0.1610609664E10,TO_ZERO] --> [1610609664,1610609664] --> OK [0.1610609792E10,TO_ZERO] --> [1610609792,1610609792] --> OK [0.161060992E10,TO_ZERO] --> [1610609920,1610609920] --> OK [0.1610610048E10,TO_ZERO] --> [1610610048,1610610048] --> OK [0.1610610176E10,TO_ZERO] --> [1610610176,1610610176] --> OK [0.1610610304E10,TO_ZERO] --> [1610610304,1610610304] --> OK [0.1610610432E10,TO_ZERO] --> [1610610432,1610610432] --> OK [0.161061056E10,TO_ZERO] --> [1610610560,1610610560] --> OK [0.1610610688E10,TO_ZERO] --> [1610610688,1610610688] --> OK [0.1610610816E10,TO_ZERO] --> [1610610816,1610610816] --> OK [0.1610610944E10,TO_ZERO] --> [1610610944,1610610944] --> OK [0.1610611072E10,TO_ZERO] --> [1610611072,1610611072] --> OK [0.16106112E10,TO_ZERO] --> [1610611200,1610611200] --> OK [0.1610611328E10,TO_ZERO] --> [1610611328,1610611328] --> OK [0.1610611456E10,TO_ZERO] --> [1610611456,1610611456] --> OK [0.1610611584E10,TO_ZERO] --> [1610611584,1610611584] --> OK [0.1610611712E10,TO_ZERO] --> [1610611712,1610611712] --> OK [0.161061184E10,TO_ZERO] --> [1610611840,1610611840] --> OK [0.1610611968E10,TO_ZERO] --> [1610611968,1610611968] --> OK [0.1610612096E10,TO_ZERO] --> [1610612096,1610612096] --> OK [0.1610612224E10,TO_ZERO] --> [1610612224,1610612224] --> OK [0.1610612352E10,TO_ZERO] --> [1610612352,1610612352] --> OK [0.161061248E10,TO_ZERO] --> [1610612480,1610612480] --> OK [0.1610612608E10,TO_ZERO] --> [1610612608,1610612608] --> OK [0.1610612736E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610620928E10,TO_ZERO] --> [1610620928,1610620928] --> OK [0.16106208E10,TO_ZERO] --> [1610620800,1610620800] --> OK [0.1610620672E10,TO_ZERO] --> [1610620672,1610620672] --> OK [0.1610620544E10,TO_ZERO] --> [1610620544,1610620544] --> OK [0.1610620416E10,TO_ZERO] --> [1610620416,1610620416] --> OK [0.1610620288E10,TO_ZERO] --> [1610620288,1610620288] --> OK [0.161062016E10,TO_ZERO] --> [1610620160,1610620160] --> OK [0.1610620032E10,TO_ZERO] --> [1610620032,1610620032] --> OK [0.1610619904E10,TO_ZERO] --> [1610619904,1610619904] --> OK [0.1610619776E10,TO_ZERO] --> [1610619776,1610619776] --> OK [0.1610619648E10,TO_ZERO] --> [1610619648,1610619648] --> OK [0.161061952E10,TO_ZERO] --> [1610619520,1610619520] --> OK [0.1610619392E10,TO_ZERO] --> [1610619392,1610619392] --> OK [0.1610619264E10,TO_ZERO] --> [1610619264,1610619264] --> OK [0.1610619136E10,TO_ZERO] --> [1610619136,1610619136] --> OK [0.1610619008E10,TO_ZERO] --> [1610619008,1610619008] --> OK [0.161061888E10,TO_ZERO] --> [1610618880,1610618880] --> OK [0.1610618752E10,TO_ZERO] --> [1610618752,1610618752] --> OK [0.1610618624E10,TO_ZERO] --> [1610618624,1610618624] --> OK [0.1610618496E10,TO_ZERO] --> [1610618496,1610618496] --> OK [0.1610618368E10,TO_ZERO] --> [1610618368,1610618368] --> OK [0.161061824E10,TO_ZERO] --> [1610618240,1610618240] --> OK [0.1610618112E10,TO_ZERO] --> [1610618112,1610618112] --> OK [0.1610617984E10,TO_ZERO] --> [1610617984,1610617984] --> OK [0.1610617856E10,TO_ZERO] --> [1610617856,1610617856] --> OK [0.1610617728E10,TO_ZERO] --> [1610617728,1610617728] --> OK [0.16106176E10,TO_ZERO] --> [1610617600,1610617600] --> OK [0.1610617472E10,TO_ZERO] --> [1610617472,1610617472] --> OK [0.1610617344E10,TO_ZERO] --> [1610617344,1610617344] --> OK [0.1610617216E10,TO_ZERO] --> [1610617216,1610617216] --> OK [0.1610617088E10,TO_ZERO] --> [1610617088,1610617088] --> OK [0.161061696E10,TO_ZERO] --> [1610616960,1610616960] --> OK [0.1610616832E10,TO_ZERO] --> [1610616832,1610616832] --> OK [0.1610616704E10,TO_ZERO] --> [1610616704,1610616704] --> OK [0.1610616576E10,TO_ZERO] --> [1610616576,1610616576] --> OK [0.1610616448E10,TO_ZERO] --> [1610616448,1610616448] --> OK [0.161061632E10,TO_ZERO] --> [1610616320,1610616320] --> OK [0.1610616192E10,TO_ZERO] --> [1610616192,1610616192] --> OK [0.1610616064E10,TO_ZERO] --> [1610616064,1610616064] --> OK [0.1610615936E10,TO_ZERO] --> [1610615936,1610615936] --> OK [0.1610615808E10,TO_ZERO] --> [1610615808,1610615808] --> OK [0.161061568E10,TO_ZERO] --> [1610615680,1610615680] --> OK [0.1610615552E10,TO_ZERO] --> [1610615552,1610615552] --> OK [0.1610615424E10,TO_ZERO] --> [1610615424,1610615424] --> OK [0.1610615296E10,TO_ZERO] --> [1610615296,1610615296] --> OK [0.1610615168E10,TO_ZERO] --> [1610615168,1610615168] --> OK [0.161061504E10,TO_ZERO] --> [1610615040,1610615040] --> OK [0.1610614912E10,TO_ZERO] --> [1610614912,1610614912] --> OK [0.1610614784E10,TO_ZERO] --> [1610614784,1610614784] --> OK [0.1610614656E10,TO_ZERO] --> [1610614656,1610614656] --> OK [0.1610614528E10,TO_ZERO] --> [1610614528,1610614528] --> OK [0.16106144E10,TO_ZERO] --> [1610614400,1610614400] --> OK [0.1610614272E10,TO_ZERO] --> [1610614272,1610614272] --> OK [0.1610614144E10,TO_ZERO] --> [1610614144,1610614144] --> OK [0.1610614016E10,TO_ZERO] --> [1610614016,1610614016] --> OK [0.1610613888E10,TO_ZERO] --> [1610613888,1610613888] --> OK [0.161061376E10,TO_ZERO] --> [1610613760,1610613760] --> OK [0.1610613632E10,TO_ZERO] --> [1610613632,1610613632] --> OK [0.1610613504E10,TO_ZERO] --> [1610613504,1610613504] --> OK [0.1610613376E10,TO_ZERO] --> [1610613376,1610613376] --> OK [0.1610613248E10,TO_ZERO] --> [1610613248,1610613248] --> OK [0.161061312E10,TO_ZERO] --> [1610613120,1610613120] --> OK [0.1610612992E10,TO_ZERO] --> [1610612992,1610612992] --> OK [0.1610612864E10,TO_ZERO] --> [1610612864,1610612864] --> OK [0.187904E10,TO_ZERO] --> [1879040000,1879040000] --> OK [0.1879040128E10,TO_ZERO] --> [1879040128,1879040128] --> OK [0.1879040256E10,TO_ZERO] --> [1879040256,1879040256] --> OK [0.1879040384E10,TO_ZERO] --> [1879040384,1879040384] --> OK [0.1879040512E10,TO_ZERO] --> [1879040512,1879040512] --> OK [0.187904064E10,TO_ZERO] --> [1879040640,1879040640] --> OK [0.1879040768E10,TO_ZERO] --> [1879040768,1879040768] --> OK [0.1879040896E10,TO_ZERO] --> [1879040896,1879040896] --> OK [0.1879041024E10,TO_ZERO] --> [1879041024,1879041024] --> OK [0.1879041152E10,TO_ZERO] --> [1879041152,1879041152] --> OK [0.187904128E10,TO_ZERO] --> [1879041280,1879041280] --> OK [0.1879041408E10,TO_ZERO] --> [1879041408,1879041408] --> OK [0.1879041536E10,TO_ZERO] --> [1879041536,1879041536] --> OK [0.1879041664E10,TO_ZERO] --> [1879041664,1879041664] --> OK [0.1879041792E10,TO_ZERO] --> [1879041792,1879041792] --> OK [0.187904192E10,TO_ZERO] --> [1879041920,1879041920] --> OK [0.1879042048E10,TO_ZERO] --> [1879042048,1879042048] --> OK [0.1879042176E10,TO_ZERO] --> [1879042176,1879042176] --> OK [0.1879042304E10,TO_ZERO] --> [1879042304,1879042304] --> OK [0.1879042432E10,TO_ZERO] --> [1879042432,1879042432] --> OK [0.187904256E10,TO_ZERO] --> [1879042560,1879042560] --> OK [0.1879042688E10,TO_ZERO] --> [1879042688,1879042688] --> OK [0.1879042816E10,TO_ZERO] --> [1879042816,1879042816] --> OK [0.1879042944E10,TO_ZERO] --> [1879042944,1879042944] --> OK [0.1879043072E10,TO_ZERO] --> [1879043072,1879043072] --> OK [0.18790432E10,TO_ZERO] --> [1879043200,1879043200] --> OK [0.1879043328E10,TO_ZERO] --> [1879043328,1879043328] --> OK [0.1879043456E10,TO_ZERO] --> [1879043456,1879043456] --> OK [0.1879043584E10,TO_ZERO] --> [1879043584,1879043584] --> OK [0.1879043712E10,TO_ZERO] --> [1879043712,1879043712] --> OK [0.187904384E10,TO_ZERO] --> [1879043840,1879043840] --> OK [0.1879043968E10,TO_ZERO] --> [1879043968,1879043968] --> OK [0.1879044096E10,TO_ZERO] --> [1879044096,1879044096] --> OK [0.1879044224E10,TO_ZERO] --> [1879044224,1879044224] --> OK [0.1879044352E10,TO_ZERO] --> [1879044352,1879044352] --> OK [0.187904448E10,TO_ZERO] --> [1879044480,1879044480] --> OK [0.1879044608E10,TO_ZERO] --> [1879044608,1879044608] --> OK [0.1879044736E10,TO_ZERO] --> [1879044736,1879044736] --> OK [0.1879044864E10,TO_ZERO] --> [1879044864,1879044864] --> OK [0.1879044992E10,TO_ZERO] --> [1879044992,1879044992] --> OK [0.187904512E10,TO_ZERO] --> [1879045120,1879045120] --> OK [0.1879045248E10,TO_ZERO] --> [1879045248,1879045248] --> OK [0.1879045376E10,TO_ZERO] --> [1879045376,1879045376] --> OK [0.1879045504E10,TO_ZERO] --> [1879045504,1879045504] --> OK [0.1879045632E10,TO_ZERO] --> [1879045632,1879045632] --> OK [0.187904576E10,TO_ZERO] --> [1879045760,1879045760] --> OK [0.1879045888E10,TO_ZERO] --> [1879045888,1879045888] --> OK [0.1879046016E10,TO_ZERO] --> [1879046016,1879046016] --> OK [0.1879046144E10,TO_ZERO] --> [1879046144,1879046144] --> OK [0.1879046272E10,TO_ZERO] --> [1879046272,1879046272] --> OK [0.18790464E10,TO_ZERO] --> [1879046400,1879046400] --> OK [0.1879046528E10,TO_ZERO] --> [1879046528,1879046528] --> OK [0.1879046656E10,TO_ZERO] --> [1879046656,1879046656] --> OK [0.1879046784E10,TO_ZERO] --> [1879046784,1879046784] --> OK [0.1879046912E10,TO_ZERO] --> [1879046912,1879046912] --> OK [0.187904704E10,TO_ZERO] --> [1879047040,1879047040] --> OK [0.1879047168E10,TO_ZERO] --> [1879047168,1879047168] --> OK [0.1879047296E10,TO_ZERO] --> [1879047296,1879047296] --> OK [0.1879047424E10,TO_ZERO] --> [1879047424,1879047424] --> OK [0.1879047552E10,TO_ZERO] --> [1879047552,1879047552] --> OK [0.187904768E10,TO_ZERO] --> [1879047680,1879047680] --> OK [0.1879047808E10,TO_ZERO] --> [1879047808,1879047808] --> OK [0.1879047936E10,TO_ZERO] --> [1879047936,1879047936] --> OK [0.1879048064E10,TO_ZERO] --> [1879048064,1879048064] --> OK [0.1879048192E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879056384E10,TO_ZERO] --> [1879056384,1879056384] --> OK [0.1879056256E10,TO_ZERO] --> [1879056256,1879056256] --> OK [0.1879056128E10,TO_ZERO] --> [1879056128,1879056128] --> OK [0.1879056E10,TO_ZERO] --> [1879056000,1879056000] --> OK [0.1879055872E10,TO_ZERO] --> [1879055872,1879055872] --> OK [0.1879055744E10,TO_ZERO] --> [1879055744,1879055744] --> OK [0.1879055616E10,TO_ZERO] --> [1879055616,1879055616] --> OK [0.1879055488E10,TO_ZERO] --> [1879055488,1879055488] --> OK [0.187905536E10,TO_ZERO] --> [1879055360,1879055360] --> OK [0.1879055232E10,TO_ZERO] --> [1879055232,1879055232] --> OK [0.1879055104E10,TO_ZERO] --> [1879055104,1879055104] --> OK [0.1879054976E10,TO_ZERO] --> [1879054976,1879054976] --> OK [0.1879054848E10,TO_ZERO] --> [1879054848,1879054848] --> OK [0.187905472E10,TO_ZERO] --> [1879054720,1879054720] --> OK [0.1879054592E10,TO_ZERO] --> [1879054592,1879054592] --> OK [0.1879054464E10,TO_ZERO] --> [1879054464,1879054464] --> OK [0.1879054336E10,TO_ZERO] --> [1879054336,1879054336] --> OK [0.1879054208E10,TO_ZERO] --> [1879054208,1879054208] --> OK [0.187905408E10,TO_ZERO] --> [1879054080,1879054080] --> OK [0.1879053952E10,TO_ZERO] --> [1879053952,1879053952] --> OK [0.1879053824E10,TO_ZERO] --> [1879053824,1879053824] --> OK [0.1879053696E10,TO_ZERO] --> [1879053696,1879053696] --> OK [0.1879053568E10,TO_ZERO] --> [1879053568,1879053568] --> OK [0.187905344E10,TO_ZERO] --> [1879053440,1879053440] --> OK [0.1879053312E10,TO_ZERO] --> [1879053312,1879053312] --> OK [0.1879053184E10,TO_ZERO] --> [1879053184,1879053184] --> OK [0.1879053056E10,TO_ZERO] --> [1879053056,1879053056] --> OK [0.1879052928E10,TO_ZERO] --> [1879052928,1879052928] --> OK [0.18790528E10,TO_ZERO] --> [1879052800,1879052800] --> OK [0.1879052672E10,TO_ZERO] --> [1879052672,1879052672] --> OK [0.1879052544E10,TO_ZERO] --> [1879052544,1879052544] --> OK [0.1879052416E10,TO_ZERO] --> [1879052416,1879052416] --> OK [0.1879052288E10,TO_ZERO] --> [1879052288,1879052288] --> OK [0.187905216E10,TO_ZERO] --> [1879052160,1879052160] --> OK [0.1879052032E10,TO_ZERO] --> [1879052032,1879052032] --> OK [0.1879051904E10,TO_ZERO] --> [1879051904,1879051904] --> OK [0.1879051776E10,TO_ZERO] --> [1879051776,1879051776] --> OK [0.1879051648E10,TO_ZERO] --> [1879051648,1879051648] --> OK [0.187905152E10,TO_ZERO] --> [1879051520,1879051520] --> OK [0.1879051392E10,TO_ZERO] --> [1879051392,1879051392] --> OK [0.1879051264E10,TO_ZERO] --> [1879051264,1879051264] --> OK [0.1879051136E10,TO_ZERO] --> [1879051136,1879051136] --> OK [0.1879051008E10,TO_ZERO] --> [1879051008,1879051008] --> OK [0.187905088E10,TO_ZERO] --> [1879050880,1879050880] --> OK [0.1879050752E10,TO_ZERO] --> [1879050752,1879050752] --> OK [0.1879050624E10,TO_ZERO] --> [1879050624,1879050624] --> OK [0.1879050496E10,TO_ZERO] --> [1879050496,1879050496] --> OK [0.1879050368E10,TO_ZERO] --> [1879050368,1879050368] --> OK [0.187905024E10,TO_ZERO] --> [1879050240,1879050240] --> OK [0.1879050112E10,TO_ZERO] --> [1879050112,1879050112] --> OK [0.1879049984E10,TO_ZERO] --> [1879049984,1879049984] --> OK [0.1879049856E10,TO_ZERO] --> [1879049856,1879049856] --> OK [0.1879049728E10,TO_ZERO] --> [1879049728,1879049728] --> OK [0.18790496E10,TO_ZERO] --> [1879049600,1879049600] --> OK [0.1879049472E10,TO_ZERO] --> [1879049472,1879049472] --> OK [0.1879049344E10,TO_ZERO] --> [1879049344,1879049344] --> OK [0.1879049216E10,TO_ZERO] --> [1879049216,1879049216] --> OK [0.1879049088E10,TO_ZERO] --> [1879049088,1879049088] --> OK [0.187904896E10,TO_ZERO] --> [1879048960,1879048960] --> OK [0.1879048832E10,TO_ZERO] --> [1879048832,1879048832] --> OK [0.1879048704E10,TO_ZERO] --> [1879048704,1879048704] --> OK [0.1879048576E10,TO_ZERO] --> [1879048576,1879048576] --> OK [0.1879048448E10,TO_ZERO] --> [1879048448,1879048448] --> OK [0.187904832E10,TO_ZERO] --> [1879048320,1879048320] --> OK [0.2013257728E10,TO_ZERO] --> [2013257728,2013257728] --> OK [0.2013257856E10,TO_ZERO] --> [2013257856,2013257856] --> OK [0.2013257984E10,TO_ZERO] --> [2013257984,2013257984] --> OK [0.2013258112E10,TO_ZERO] --> [2013258112,2013258112] --> OK [0.201325824E10,TO_ZERO] --> [2013258240,2013258240] --> OK [0.2013258368E10,TO_ZERO] --> [2013258368,2013258368] --> OK [0.2013258496E10,TO_ZERO] --> [2013258496,2013258496] --> OK [0.2013258624E10,TO_ZERO] --> [2013258624,2013258624] --> OK [0.2013258752E10,TO_ZERO] --> [2013258752,2013258752] --> OK [0.201325888E10,TO_ZERO] --> [2013258880,2013258880] --> OK [0.2013259008E10,TO_ZERO] --> [2013259008,2013259008] --> OK [0.2013259136E10,TO_ZERO] --> [2013259136,2013259136] --> OK [0.2013259264E10,TO_ZERO] --> [2013259264,2013259264] --> OK [0.2013259392E10,TO_ZERO] --> [2013259392,2013259392] --> OK [0.201325952E10,TO_ZERO] --> [2013259520,2013259520] --> OK [0.2013259648E10,TO_ZERO] --> [2013259648,2013259648] --> OK [0.2013259776E10,TO_ZERO] --> [2013259776,2013259776] --> OK [0.2013259904E10,TO_ZERO] --> [2013259904,2013259904] --> OK [0.2013260032E10,TO_ZERO] --> [2013260032,2013260032] --> OK [0.201326016E10,TO_ZERO] --> [2013260160,2013260160] --> OK [0.2013260288E10,TO_ZERO] --> [2013260288,2013260288] --> OK [0.2013260416E10,TO_ZERO] --> [2013260416,2013260416] --> OK [0.2013260544E10,TO_ZERO] --> [2013260544,2013260544] --> OK [0.2013260672E10,TO_ZERO] --> [2013260672,2013260672] --> OK [0.20132608E10,TO_ZERO] --> [2013260800,2013260800] --> OK [0.2013260928E10,TO_ZERO] --> [2013260928,2013260928] --> OK [0.2013261056E10,TO_ZERO] --> [2013261056,2013261056] --> OK [0.2013261184E10,TO_ZERO] --> [2013261184,2013261184] --> OK [0.2013261312E10,TO_ZERO] --> [2013261312,2013261312] --> OK [0.201326144E10,TO_ZERO] --> [2013261440,2013261440] --> OK [0.2013261568E10,TO_ZERO] --> [2013261568,2013261568] --> OK [0.2013261696E10,TO_ZERO] --> [2013261696,2013261696] --> OK [0.2013261824E10,TO_ZERO] --> [2013261824,2013261824] --> OK [0.2013261952E10,TO_ZERO] --> [2013261952,2013261952] --> OK [0.201326208E10,TO_ZERO] --> [2013262080,2013262080] --> OK [0.2013262208E10,TO_ZERO] --> [2013262208,2013262208] --> OK [0.2013262336E10,TO_ZERO] --> [2013262336,2013262336] --> OK [0.2013262464E10,TO_ZERO] --> [2013262464,2013262464] --> OK [0.2013262592E10,TO_ZERO] --> [2013262592,2013262592] --> OK [0.201326272E10,TO_ZERO] --> [2013262720,2013262720] --> OK [0.2013262848E10,TO_ZERO] --> [2013262848,2013262848] --> OK [0.2013262976E10,TO_ZERO] --> [2013262976,2013262976] --> OK [0.2013263104E10,TO_ZERO] --> [2013263104,2013263104] --> OK [0.2013263232E10,TO_ZERO] --> [2013263232,2013263232] --> OK [0.201326336E10,TO_ZERO] --> [2013263360,2013263360] --> OK [0.2013263488E10,TO_ZERO] --> [2013263488,2013263488] --> OK [0.2013263616E10,TO_ZERO] --> [2013263616,2013263616] --> OK [0.2013263744E10,TO_ZERO] --> [2013263744,2013263744] --> OK [0.2013263872E10,TO_ZERO] --> [2013263872,2013263872] --> OK [0.2013264E10,TO_ZERO] --> [2013264000,2013264000] --> OK [0.2013264128E10,TO_ZERO] --> [2013264128,2013264128] --> OK [0.2013264256E10,TO_ZERO] --> [2013264256,2013264256] --> OK [0.2013264384E10,TO_ZERO] --> [2013264384,2013264384] --> OK [0.2013264512E10,TO_ZERO] --> [2013264512,2013264512] --> OK [0.201326464E10,TO_ZERO] --> [2013264640,2013264640] --> OK [0.2013264768E10,TO_ZERO] --> [2013264768,2013264768] --> OK [0.2013264896E10,TO_ZERO] --> [2013264896,2013264896] --> OK [0.2013265024E10,TO_ZERO] --> [2013265024,2013265024] --> OK [0.2013265152E10,TO_ZERO] --> [2013265152,2013265152] --> OK [0.201326528E10,TO_ZERO] --> [2013265280,2013265280] --> OK [0.2013265408E10,TO_ZERO] --> [2013265408,2013265408] --> OK [0.2013265536E10,TO_ZERO] --> [2013265536,2013265536] --> OK [0.2013265664E10,TO_ZERO] --> [2013265664,2013265664] --> OK [0.2013265792E10,TO_ZERO] --> [2013265792,2013265792] --> OK [0.201326592E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013274112E10,TO_ZERO] --> [2013274112,2013274112] --> OK [0.2013273984E10,TO_ZERO] --> [2013273984,2013273984] --> OK [0.2013273856E10,TO_ZERO] --> [2013273856,2013273856] --> OK [0.2013273728E10,TO_ZERO] --> [2013273728,2013273728] --> OK [0.20132736E10,TO_ZERO] --> [2013273600,2013273600] --> OK [0.2013273472E10,TO_ZERO] --> [2013273472,2013273472] --> OK [0.2013273344E10,TO_ZERO] --> [2013273344,2013273344] --> OK [0.2013273216E10,TO_ZERO] --> [2013273216,2013273216] --> OK [0.2013273088E10,TO_ZERO] --> [2013273088,2013273088] --> OK [0.201327296E10,TO_ZERO] --> [2013272960,2013272960] --> OK [0.2013272832E10,TO_ZERO] --> [2013272832,2013272832] --> OK [0.2013272704E10,TO_ZERO] --> [2013272704,2013272704] --> OK [0.2013272576E10,TO_ZERO] --> [2013272576,2013272576] --> OK [0.2013272448E10,TO_ZERO] --> [2013272448,2013272448] --> OK [0.201327232E10,TO_ZERO] --> [2013272320,2013272320] --> OK [0.2013272192E10,TO_ZERO] --> [2013272192,2013272192] --> OK [0.2013272064E10,TO_ZERO] --> [2013272064,2013272064] --> OK [0.2013271936E10,TO_ZERO] --> [2013271936,2013271936] --> OK [0.2013271808E10,TO_ZERO] --> [2013271808,2013271808] --> OK [0.201327168E10,TO_ZERO] --> [2013271680,2013271680] --> OK [0.2013271552E10,TO_ZERO] --> [2013271552,2013271552] --> OK [0.2013271424E10,TO_ZERO] --> [2013271424,2013271424] --> OK [0.2013271296E10,TO_ZERO] --> [2013271296,2013271296] --> OK [0.2013271168E10,TO_ZERO] --> [2013271168,2013271168] --> OK [0.201327104E10,TO_ZERO] --> [2013271040,2013271040] --> OK [0.2013270912E10,TO_ZERO] --> [2013270912,2013270912] --> OK [0.2013270784E10,TO_ZERO] --> [2013270784,2013270784] --> OK [0.2013270656E10,TO_ZERO] --> [2013270656,2013270656] --> OK [0.2013270528E10,TO_ZERO] --> [2013270528,2013270528] --> OK [0.20132704E10,TO_ZERO] --> [2013270400,2013270400] --> OK [0.2013270272E10,TO_ZERO] --> [2013270272,2013270272] --> OK [0.2013270144E10,TO_ZERO] --> [2013270144,2013270144] --> OK [0.2013270016E10,TO_ZERO] --> [2013270016,2013270016] --> OK [0.2013269888E10,TO_ZERO] --> [2013269888,2013269888] --> OK [0.201326976E10,TO_ZERO] --> [2013269760,2013269760] --> OK [0.2013269632E10,TO_ZERO] --> [2013269632,2013269632] --> OK [0.2013269504E10,TO_ZERO] --> [2013269504,2013269504] --> OK [0.2013269376E10,TO_ZERO] --> [2013269376,2013269376] --> OK [0.2013269248E10,TO_ZERO] --> [2013269248,2013269248] --> OK [0.201326912E10,TO_ZERO] --> [2013269120,2013269120] --> OK [0.2013268992E10,TO_ZERO] --> [2013268992,2013268992] --> OK [0.2013268864E10,TO_ZERO] --> [2013268864,2013268864] --> OK [0.2013268736E10,TO_ZERO] --> [2013268736,2013268736] --> OK [0.2013268608E10,TO_ZERO] --> [2013268608,2013268608] --> OK [0.201326848E10,TO_ZERO] --> [2013268480,2013268480] --> OK [0.2013268352E10,TO_ZERO] --> [2013268352,2013268352] --> OK [0.2013268224E10,TO_ZERO] --> [2013268224,2013268224] --> OK [0.2013268096E10,TO_ZERO] --> [2013268096,2013268096] --> OK [0.2013267968E10,TO_ZERO] --> [2013267968,2013267968] --> OK [0.201326784E10,TO_ZERO] --> [2013267840,2013267840] --> OK [0.2013267712E10,TO_ZERO] --> [2013267712,2013267712] --> OK [0.2013267584E10,TO_ZERO] --> [2013267584,2013267584] --> OK [0.2013267456E10,TO_ZERO] --> [2013267456,2013267456] --> OK [0.2013267328E10,TO_ZERO] --> [2013267328,2013267328] --> OK [0.20132672E10,TO_ZERO] --> [2013267200,2013267200] --> OK [0.2013267072E10,TO_ZERO] --> [2013267072,2013267072] --> OK [0.2013266944E10,TO_ZERO] --> [2013266944,2013266944] --> OK [0.2013266816E10,TO_ZERO] --> [2013266816,2013266816] --> OK [0.2013266688E10,TO_ZERO] --> [2013266688,2013266688] --> OK [0.201326656E10,TO_ZERO] --> [2013266560,2013266560] --> OK [0.2013266432E10,TO_ZERO] --> [2013266432,2013266432] --> OK [0.2013266304E10,TO_ZERO] --> [2013266304,2013266304] --> OK [0.2013266176E10,TO_ZERO] --> [2013266176,2013266176] --> OK [0.2013266048E10,TO_ZERO] --> [2013266048,2013266048] --> OK [0.2080366592E10,TO_ZERO] --> [2080366592,2080366592] --> OK [0.208036672E10,TO_ZERO] --> [2080366720,2080366720] --> OK [0.2080366848E10,TO_ZERO] --> [2080366848,2080366848] --> OK [0.2080366976E10,TO_ZERO] --> [2080366976,2080366976] --> OK [0.2080367104E10,TO_ZERO] --> [2080367104,2080367104] --> OK [0.2080367232E10,TO_ZERO] --> [2080367232,2080367232] --> OK [0.208036736E10,TO_ZERO] --> [2080367360,2080367360] --> OK [0.2080367488E10,TO_ZERO] --> [2080367488,2080367488] --> OK [0.2080367616E10,TO_ZERO] --> [2080367616,2080367616] --> OK [0.2080367744E10,TO_ZERO] --> [2080367744,2080367744] --> OK [0.2080367872E10,TO_ZERO] --> [2080367872,2080367872] --> OK [0.2080368E10,TO_ZERO] --> [2080368000,2080368000] --> OK [0.2080368128E10,TO_ZERO] --> [2080368128,2080368128] --> OK [0.2080368256E10,TO_ZERO] --> [2080368256,2080368256] --> OK [0.2080368384E10,TO_ZERO] --> [2080368384,2080368384] --> OK [0.2080368512E10,TO_ZERO] --> [2080368512,2080368512] --> OK [0.208036864E10,TO_ZERO] --> [2080368640,2080368640] --> OK [0.2080368768E10,TO_ZERO] --> [2080368768,2080368768] --> OK [0.2080368896E10,TO_ZERO] --> [2080368896,2080368896] --> OK [0.2080369024E10,TO_ZERO] --> [2080369024,2080369024] --> OK [0.2080369152E10,TO_ZERO] --> [2080369152,2080369152] --> OK [0.208036928E10,TO_ZERO] --> [2080369280,2080369280] --> OK [0.2080369408E10,TO_ZERO] --> [2080369408,2080369408] --> OK [0.2080369536E10,TO_ZERO] --> [2080369536,2080369536] --> OK [0.2080369664E10,TO_ZERO] --> [2080369664,2080369664] --> OK [0.2080369792E10,TO_ZERO] --> [2080369792,2080369792] --> OK [0.208036992E10,TO_ZERO] --> [2080369920,2080369920] --> OK [0.2080370048E10,TO_ZERO] --> [2080370048,2080370048] --> OK [0.2080370176E10,TO_ZERO] --> [2080370176,2080370176] --> OK [0.2080370304E10,TO_ZERO] --> [2080370304,2080370304] --> OK [0.2080370432E10,TO_ZERO] --> [2080370432,2080370432] --> OK [0.208037056E10,TO_ZERO] --> [2080370560,2080370560] --> OK [0.2080370688E10,TO_ZERO] --> [2080370688,2080370688] --> OK [0.2080370816E10,TO_ZERO] --> [2080370816,2080370816] --> OK [0.2080370944E10,TO_ZERO] --> [2080370944,2080370944] --> OK [0.2080371072E10,TO_ZERO] --> [2080371072,2080371072] --> OK [0.20803712E10,TO_ZERO] --> [2080371200,2080371200] --> OK [0.2080371328E10,TO_ZERO] --> [2080371328,2080371328] --> OK [0.2080371456E10,TO_ZERO] --> [2080371456,2080371456] --> OK [0.2080371584E10,TO_ZERO] --> [2080371584,2080371584] --> OK [0.2080371712E10,TO_ZERO] --> [2080371712,2080371712] --> OK [0.208037184E10,TO_ZERO] --> [2080371840,2080371840] --> OK [0.2080371968E10,TO_ZERO] --> [2080371968,2080371968] --> OK [0.2080372096E10,TO_ZERO] --> [2080372096,2080372096] --> OK [0.2080372224E10,TO_ZERO] --> [2080372224,2080372224] --> OK [0.2080372352E10,TO_ZERO] --> [2080372352,2080372352] --> OK [0.208037248E10,TO_ZERO] --> [2080372480,2080372480] --> OK [0.2080372608E10,TO_ZERO] --> [2080372608,2080372608] --> OK [0.2080372736E10,TO_ZERO] --> [2080372736,2080372736] --> OK [0.2080372864E10,TO_ZERO] --> [2080372864,2080372864] --> OK [0.2080372992E10,TO_ZERO] --> [2080372992,2080372992] --> OK [0.208037312E10,TO_ZERO] --> [2080373120,2080373120] --> OK [0.2080373248E10,TO_ZERO] --> [2080373248,2080373248] --> OK [0.2080373376E10,TO_ZERO] --> [2080373376,2080373376] --> OK [0.2080373504E10,TO_ZERO] --> [2080373504,2080373504] --> OK [0.2080373632E10,TO_ZERO] --> [2080373632,2080373632] --> OK [0.208037376E10,TO_ZERO] --> [2080373760,2080373760] --> OK [0.2080373888E10,TO_ZERO] --> [2080373888,2080373888] --> OK [0.2080374016E10,TO_ZERO] --> [2080374016,2080374016] --> OK [0.2080374144E10,TO_ZERO] --> [2080374144,2080374144] --> OK [0.2080374272E10,TO_ZERO] --> [2080374272,2080374272] --> OK [0.20803744E10,TO_ZERO] --> [2080374400,2080374400] --> OK [0.2080374528E10,TO_ZERO] --> [2080374528,2080374528] --> OK [0.2080374656E10,TO_ZERO] --> [2080374656,2080374656] --> OK [0.2080374784E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080382976E10,TO_ZERO] --> [2080382976,2080382976] --> OK [0.2080382848E10,TO_ZERO] --> [2080382848,2080382848] --> OK [0.208038272E10,TO_ZERO] --> [2080382720,2080382720] --> OK [0.2080382592E10,TO_ZERO] --> [2080382592,2080382592] --> OK [0.2080382464E10,TO_ZERO] --> [2080382464,2080382464] --> OK [0.2080382336E10,TO_ZERO] --> [2080382336,2080382336] --> OK [0.2080382208E10,TO_ZERO] --> [2080382208,2080382208] --> OK [0.208038208E10,TO_ZERO] --> [2080382080,2080382080] --> OK [0.2080381952E10,TO_ZERO] --> [2080381952,2080381952] --> OK [0.2080381824E10,TO_ZERO] --> [2080381824,2080381824] --> OK [0.2080381696E10,TO_ZERO] --> [2080381696,2080381696] --> OK [0.2080381568E10,TO_ZERO] --> [2080381568,2080381568] --> OK [0.208038144E10,TO_ZERO] --> [2080381440,2080381440] --> OK [0.2080381312E10,TO_ZERO] --> [2080381312,2080381312] --> OK [0.2080381184E10,TO_ZERO] --> [2080381184,2080381184] --> OK [0.2080381056E10,TO_ZERO] --> [2080381056,2080381056] --> OK [0.2080380928E10,TO_ZERO] --> [2080380928,2080380928] --> OK [0.20803808E10,TO_ZERO] --> [2080380800,2080380800] --> OK [0.2080380672E10,TO_ZERO] --> [2080380672,2080380672] --> OK [0.2080380544E10,TO_ZERO] --> [2080380544,2080380544] --> OK [0.2080380416E10,TO_ZERO] --> [2080380416,2080380416] --> OK [0.2080380288E10,TO_ZERO] --> [2080380288,2080380288] --> OK [0.208038016E10,TO_ZERO] --> [2080380160,2080380160] --> OK [0.2080380032E10,TO_ZERO] --> [2080380032,2080380032] --> OK [0.2080379904E10,TO_ZERO] --> [2080379904,2080379904] --> OK [0.2080379776E10,TO_ZERO] --> [2080379776,2080379776] --> OK [0.2080379648E10,TO_ZERO] --> [2080379648,2080379648] --> OK [0.208037952E10,TO_ZERO] --> [2080379520,2080379520] --> OK [0.2080379392E10,TO_ZERO] --> [2080379392,2080379392] --> OK [0.2080379264E10,TO_ZERO] --> [2080379264,2080379264] --> OK [0.2080379136E10,TO_ZERO] --> [2080379136,2080379136] --> OK [0.2080379008E10,TO_ZERO] --> [2080379008,2080379008] --> OK [0.208037888E10,TO_ZERO] --> [2080378880,2080378880] --> OK [0.2080378752E10,TO_ZERO] --> [2080378752,2080378752] --> OK [0.2080378624E10,TO_ZERO] --> [2080378624,2080378624] --> OK [0.2080378496E10,TO_ZERO] --> [2080378496,2080378496] --> OK [0.2080378368E10,TO_ZERO] --> [2080378368,2080378368] --> OK [0.208037824E10,TO_ZERO] --> [2080378240,2080378240] --> OK [0.2080378112E10,TO_ZERO] --> [2080378112,2080378112] --> OK [0.2080377984E10,TO_ZERO] --> [2080377984,2080377984] --> OK [0.2080377856E10,TO_ZERO] --> [2080377856,2080377856] --> OK [0.2080377728E10,TO_ZERO] --> [2080377728,2080377728] --> OK [0.20803776E10,TO_ZERO] --> [2080377600,2080377600] --> OK [0.2080377472E10,TO_ZERO] --> [2080377472,2080377472] --> OK [0.2080377344E10,TO_ZERO] --> [2080377344,2080377344] --> OK [0.2080377216E10,TO_ZERO] --> [2080377216,2080377216] --> OK [0.2080377088E10,TO_ZERO] --> [2080377088,2080377088] --> OK [0.208037696E10,TO_ZERO] --> [2080376960,2080376960] --> OK [0.2080376832E10,TO_ZERO] --> [2080376832,2080376832] --> OK [0.2080376704E10,TO_ZERO] --> [2080376704,2080376704] --> OK [0.2080376576E10,TO_ZERO] --> [2080376576,2080376576] --> OK [0.2080376448E10,TO_ZERO] --> [2080376448,2080376448] --> OK [0.208037632E10,TO_ZERO] --> [2080376320,2080376320] --> OK [0.2080376192E10,TO_ZERO] --> [2080376192,2080376192] --> OK [0.2080376064E10,TO_ZERO] --> [2080376064,2080376064] --> OK [0.2080375936E10,TO_ZERO] --> [2080375936,2080375936] --> OK [0.2080375808E10,TO_ZERO] --> [2080375808,2080375808] --> OK [0.208037568E10,TO_ZERO] --> [2080375680,2080375680] --> OK [0.2080375552E10,TO_ZERO] --> [2080375552,2080375552] --> OK [0.2080375424E10,TO_ZERO] --> [2080375424,2080375424] --> OK [0.2080375296E10,TO_ZERO] --> [2080375296,2080375296] --> OK [0.2080375168E10,TO_ZERO] --> [2080375168,2080375168] --> OK [0.208037504E10,TO_ZERO] --> [2080375040,2080375040] --> OK [0.2080374912E10,TO_ZERO] --> [2080374912,2080374912] --> OK [0.2113921024E10,TO_ZERO] --> [2113921024,2113921024] --> OK [0.2113921152E10,TO_ZERO] --> [2113921152,2113921152] --> OK [0.211392128E10,TO_ZERO] --> [2113921280,2113921280] --> OK [0.2113921408E10,TO_ZERO] --> [2113921408,2113921408] --> OK [0.2113921536E10,TO_ZERO] --> [2113921536,2113921536] --> OK [0.2113921664E10,TO_ZERO] --> [2113921664,2113921664] --> OK [0.2113921792E10,TO_ZERO] --> [2113921792,2113921792] --> OK [0.211392192E10,TO_ZERO] --> [2113921920,2113921920] --> OK [0.2113922048E10,TO_ZERO] --> [2113922048,2113922048] --> OK [0.2113922176E10,TO_ZERO] --> [2113922176,2113922176] --> OK [0.2113922304E10,TO_ZERO] --> [2113922304,2113922304] --> OK [0.2113922432E10,TO_ZERO] --> [2113922432,2113922432] --> OK [0.211392256E10,TO_ZERO] --> [2113922560,2113922560] --> OK [0.2113922688E10,TO_ZERO] --> [2113922688,2113922688] --> OK [0.2113922816E10,TO_ZERO] --> [2113922816,2113922816] --> OK [0.2113922944E10,TO_ZERO] --> [2113922944,2113922944] --> OK [0.2113923072E10,TO_ZERO] --> [2113923072,2113923072] --> OK [0.21139232E10,TO_ZERO] --> [2113923200,2113923200] --> OK [0.2113923328E10,TO_ZERO] --> [2113923328,2113923328] --> OK [0.2113923456E10,TO_ZERO] --> [2113923456,2113923456] --> OK [0.2113923584E10,TO_ZERO] --> [2113923584,2113923584] --> OK [0.2113923712E10,TO_ZERO] --> [2113923712,2113923712] --> OK [0.211392384E10,TO_ZERO] --> [2113923840,2113923840] --> OK [0.2113923968E10,TO_ZERO] --> [2113923968,2113923968] --> OK [0.2113924096E10,TO_ZERO] --> [2113924096,2113924096] --> OK [0.2113924224E10,TO_ZERO] --> [2113924224,2113924224] --> OK [0.2113924352E10,TO_ZERO] --> [2113924352,2113924352] --> OK [0.211392448E10,TO_ZERO] --> [2113924480,2113924480] --> OK [0.2113924608E10,TO_ZERO] --> [2113924608,2113924608] --> OK [0.2113924736E10,TO_ZERO] --> [2113924736,2113924736] --> OK [0.2113924864E10,TO_ZERO] --> [2113924864,2113924864] --> OK [0.2113924992E10,TO_ZERO] --> [2113924992,2113924992] --> OK [0.211392512E10,TO_ZERO] --> [2113925120,2113925120] --> OK [0.2113925248E10,TO_ZERO] --> [2113925248,2113925248] --> OK [0.2113925376E10,TO_ZERO] --> [2113925376,2113925376] --> OK [0.2113925504E10,TO_ZERO] --> [2113925504,2113925504] --> OK [0.2113925632E10,TO_ZERO] --> [2113925632,2113925632] --> OK [0.211392576E10,TO_ZERO] --> [2113925760,2113925760] --> OK [0.2113925888E10,TO_ZERO] --> [2113925888,2113925888] --> OK [0.2113926016E10,TO_ZERO] --> [2113926016,2113926016] --> OK [0.2113926144E10,TO_ZERO] --> [2113926144,2113926144] --> OK [0.2113926272E10,TO_ZERO] --> [2113926272,2113926272] --> OK [0.21139264E10,TO_ZERO] --> [2113926400,2113926400] --> OK [0.2113926528E10,TO_ZERO] --> [2113926528,2113926528] --> OK [0.2113926656E10,TO_ZERO] --> [2113926656,2113926656] --> OK [0.2113926784E10,TO_ZERO] --> [2113926784,2113926784] --> OK [0.2113926912E10,TO_ZERO] --> [2113926912,2113926912] --> OK [0.211392704E10,TO_ZERO] --> [2113927040,2113927040] --> OK [0.2113927168E10,TO_ZERO] --> [2113927168,2113927168] --> OK [0.2113927296E10,TO_ZERO] --> [2113927296,2113927296] --> OK [0.2113927424E10,TO_ZERO] --> [2113927424,2113927424] --> OK [0.2113927552E10,TO_ZERO] --> [2113927552,2113927552] --> OK [0.211392768E10,TO_ZERO] --> [2113927680,2113927680] --> OK [0.2113927808E10,TO_ZERO] --> [2113927808,2113927808] --> OK [0.2113927936E10,TO_ZERO] --> [2113927936,2113927936] --> OK [0.2113928064E10,TO_ZERO] --> [2113928064,2113928064] --> OK [0.2113928192E10,TO_ZERO] --> [2113928192,2113928192] --> OK [0.211392832E10,TO_ZERO] --> [2113928320,2113928320] --> OK [0.2113928448E10,TO_ZERO] --> [2113928448,2113928448] --> OK [0.2113928576E10,TO_ZERO] --> [2113928576,2113928576] --> OK [0.2113928704E10,TO_ZERO] --> [2113928704,2113928704] --> OK [0.2113928832E10,TO_ZERO] --> [2113928832,2113928832] --> OK [0.211392896E10,TO_ZERO] --> [2113928960,2113928960] --> OK [0.2113929088E10,TO_ZERO] --> [2113929088,2113929088] --> OK [0.2113929216E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113937408E10,TO_ZERO] --> [2113937408,2113937408] --> OK [0.211393728E10,TO_ZERO] --> [2113937280,2113937280] --> OK [0.2113937152E10,TO_ZERO] --> [2113937152,2113937152] --> OK [0.2113937024E10,TO_ZERO] --> [2113937024,2113937024] --> OK [0.2113936896E10,TO_ZERO] --> [2113936896,2113936896] --> OK [0.2113936768E10,TO_ZERO] --> [2113936768,2113936768] --> OK [0.211393664E10,TO_ZERO] --> [2113936640,2113936640] --> OK [0.2113936512E10,TO_ZERO] --> [2113936512,2113936512] --> OK [0.2113936384E10,TO_ZERO] --> [2113936384,2113936384] --> OK [0.2113936256E10,TO_ZERO] --> [2113936256,2113936256] --> OK [0.2113936128E10,TO_ZERO] --> [2113936128,2113936128] --> OK [0.2113936E10,TO_ZERO] --> [2113936000,2113936000] --> OK [0.2113935872E10,TO_ZERO] --> [2113935872,2113935872] --> OK [0.2113935744E10,TO_ZERO] --> [2113935744,2113935744] --> OK [0.2113935616E10,TO_ZERO] --> [2113935616,2113935616] --> OK [0.2113935488E10,TO_ZERO] --> [2113935488,2113935488] --> OK [0.211393536E10,TO_ZERO] --> [2113935360,2113935360] --> OK [0.2113935232E10,TO_ZERO] --> [2113935232,2113935232] --> OK [0.2113935104E10,TO_ZERO] --> [2113935104,2113935104] --> OK [0.2113934976E10,TO_ZERO] --> [2113934976,2113934976] --> OK [0.2113934848E10,TO_ZERO] --> [2113934848,2113934848] --> OK [0.211393472E10,TO_ZERO] --> [2113934720,2113934720] --> OK [0.2113934592E10,TO_ZERO] --> [2113934592,2113934592] --> OK [0.2113934464E10,TO_ZERO] --> [2113934464,2113934464] --> OK [0.2113934336E10,TO_ZERO] --> [2113934336,2113934336] --> OK [0.2113934208E10,TO_ZERO] --> [2113934208,2113934208] --> OK [0.211393408E10,TO_ZERO] --> [2113934080,2113934080] --> OK [0.2113933952E10,TO_ZERO] --> [2113933952,2113933952] --> OK [0.2113933824E10,TO_ZERO] --> [2113933824,2113933824] --> OK [0.2113933696E10,TO_ZERO] --> [2113933696,2113933696] --> OK [0.2113933568E10,TO_ZERO] --> [2113933568,2113933568] --> OK [0.211393344E10,TO_ZERO] --> [2113933440,2113933440] --> OK [0.2113933312E10,TO_ZERO] --> [2113933312,2113933312] --> OK [0.2113933184E10,TO_ZERO] --> [2113933184,2113933184] --> OK [0.2113933056E10,TO_ZERO] --> [2113933056,2113933056] --> OK [0.2113932928E10,TO_ZERO] --> [2113932928,2113932928] --> OK [0.21139328E10,TO_ZERO] --> [2113932800,2113932800] --> OK [0.2113932672E10,TO_ZERO] --> [2113932672,2113932672] --> OK [0.2113932544E10,TO_ZERO] --> [2113932544,2113932544] --> OK [0.2113932416E10,TO_ZERO] --> [2113932416,2113932416] --> OK [0.2113932288E10,TO_ZERO] --> [2113932288,2113932288] --> OK [0.211393216E10,TO_ZERO] --> [2113932160,2113932160] --> OK [0.2113932032E10,TO_ZERO] --> [2113932032,2113932032] --> OK [0.2113931904E10,TO_ZERO] --> [2113931904,2113931904] --> OK [0.2113931776E10,TO_ZERO] --> [2113931776,2113931776] --> OK [0.2113931648E10,TO_ZERO] --> [2113931648,2113931648] --> OK [0.211393152E10,TO_ZERO] --> [2113931520,2113931520] --> OK [0.2113931392E10,TO_ZERO] --> [2113931392,2113931392] --> OK [0.2113931264E10,TO_ZERO] --> [2113931264,2113931264] --> OK [0.2113931136E10,TO_ZERO] --> [2113931136,2113931136] --> OK [0.2113931008E10,TO_ZERO] --> [2113931008,2113931008] --> OK [0.211393088E10,TO_ZERO] --> [2113930880,2113930880] --> OK [0.2113930752E10,TO_ZERO] --> [2113930752,2113930752] --> OK [0.2113930624E10,TO_ZERO] --> [2113930624,2113930624] --> OK [0.2113930496E10,TO_ZERO] --> [2113930496,2113930496] --> OK [0.2113930368E10,TO_ZERO] --> [2113930368,2113930368] --> OK [0.211393024E10,TO_ZERO] --> [2113930240,2113930240] --> OK [0.2113930112E10,TO_ZERO] --> [2113930112,2113930112] --> OK [0.2113929984E10,TO_ZERO] --> [2113929984,2113929984] --> OK [0.2113929856E10,TO_ZERO] --> [2113929856,2113929856] --> OK [0.2113929728E10,TO_ZERO] --> [2113929728,2113929728] --> OK [0.21139296E10,TO_ZERO] --> [2113929600,2113929600] --> OK [0.2113929472E10,TO_ZERO] --> [2113929472,2113929472] --> OK [0.2113929344E10,TO_ZERO] --> [2113929344,2113929344] --> OK [0.2147475456E10,TO_ZERO] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_ZERO] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_ZERO] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_ZERO] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_ZERO] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_ZERO] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_ZERO] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_ZERO] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_ZERO] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_ZERO] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_ZERO] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_ZERO] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_ZERO] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_ZERO] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_ZERO] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_ZERO] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_ZERO] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_ZERO] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_ZERO] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_ZERO] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_ZERO] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_ZERO] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_ZERO] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_ZERO] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_ZERO] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_ZERO] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_ZERO] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_ZERO] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_ZERO] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_ZERO] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_ZERO] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_ZERO] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_ZERO] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_ZERO] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_ZERO] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_ZERO] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_ZERO] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_ZERO] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_ZERO] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_ZERO] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_ZERO] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_ZERO] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_ZERO] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_ZERO] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_ZERO] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_ZERO] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_ZERO] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_ZERO] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_ZERO] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_ZERO] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_ZERO] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_ZERO] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_ZERO] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_ZERO] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_ZERO] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_ZERO] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_ZERO] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_ZERO] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_ZERO] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_ZERO] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_ZERO] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_ZERO] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_ZERO] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_ZERO] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_ZERO] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_ZERO] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_ZERO] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_ZERO] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_ZERO] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_ZERO] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_ZERO] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_ZERO] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_ZERO] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_ZERO] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_ZERO] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_ZERO] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_ZERO] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_ZERO] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_ZERO] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_ZERO] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_ZERO] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_ZERO] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_ZERO] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_ZERO] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_ZERO] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_ZERO] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_ZERO] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_ZERO] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_ZERO] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_ZERO] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_ZERO] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_ZERO] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_ZERO] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_ZERO] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_ZERO] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_ZERO] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_ZERO] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_ZERO] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_ZERO] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_ZERO] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_ZERO] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_ZERO] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_ZERO] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_ZERO] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_ZERO] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_ZERO] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_ZERO] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_ZERO] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_ZERO] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_ZERO] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_ZERO] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_ZERO] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_ZERO] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_ZERO] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_ZERO] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_ZERO] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_ZERO] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_ZERO] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_ZERO] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_ZERO] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_ZERO] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_ZERO] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_ZERO] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_ZERO] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_ZERO] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_ZERO] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_ZERO] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_ZERO] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_ZERO] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_ZERO] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_ZERO] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_ZERO] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_ZERO] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_ZERO] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_ZERO] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_ZERO] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_ZERO] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_ZERO] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_ZERO] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_ZERO] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_ZERO] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_ZERO] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_ZERO] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_ZERO] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_ZERO] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_ZERO] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_ZERO] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_ZERO] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_ZERO] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_ZERO] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_ZERO] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_ZERO] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_ZERO] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_ZERO] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_ZERO] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_ZERO] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_ZERO] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_ZERO] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_ZERO] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_ZERO] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_ZERO] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_ZERO] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_ZERO] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_ZERO] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_ZERO] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_ZERO] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_ZERO] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_ZERO] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_ZERO] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_ZERO] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_ZERO] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_ZERO] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_ZERO] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_ZERO] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_ZERO] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_ZERO] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_ZERO] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_ZERO] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_ZERO] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_ZERO] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_ZERO] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_ZERO] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_ZERO] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_ZERO] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_ZERO] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_ZERO] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_ZERO] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_ZERO] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_ZERO] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_ZERO] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_ZERO] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_ZERO] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_ZERO] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_ZERO] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_ZERO] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_ZERO] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_ZERO] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_ZERO] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_ZERO] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_ZERO] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_ZERO] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_ZERO] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_ZERO] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_ZERO] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_ZERO] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_ZERO] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_ZERO] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_ZERO] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_ZERO] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_ZERO] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_ZERO] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_ZERO] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_ZERO] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_ZERO] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_ZERO] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_ZERO] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_ZERO] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_ZERO] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_ZERO] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_ZERO] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_ZERO] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_ZERO] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_ZERO] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_ZERO] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_ZERO] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_ZERO] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_ZERO] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_ZERO] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_ZERO] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_ZERO] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_ZERO] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_ZERO] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_ZERO] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_ZERO] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_ZERO] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_ZERO] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_ZERO] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_ZERO] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_ZERO] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_ZERO] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_ZERO] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_ZERO] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_ZERO] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_ZERO] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_ZERO] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_ZERO] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_ZERO] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_ZERO] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_ZERO] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_ZERO] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_ZERO] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_ZERO] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_ZERO] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_ZERO] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_ZERO] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_ZERO] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_ZERO] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_ZERO] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_ZERO] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_ZERO] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_ZERO] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_ZERO] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_ZERO] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_ZERO] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_ZERO] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_ZERO] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_ZERO] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_ZERO] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_ZERO] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_ZERO] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_ZERO] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_ZERO] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_ZERO] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_ZERO] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_ZERO] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_ZERO] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_ZERO] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_ZERO] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_ZERO] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_ZERO] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_ZERO] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_ZERO] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_ZERO] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_ZERO] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_ZERO] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_ZERO] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_ZERO] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_ZERO] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_ZERO] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_ZERO] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_ZERO] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_ZERO] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_ZERO] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_ZERO] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_ZERO] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_ZERO] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_ZERO] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_ZERO] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_ZERO] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_ZERO] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_ZERO] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_ZERO] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_ZERO] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_ZERO] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_ZERO] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_ZERO] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_ZERO] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_ZERO] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_ZERO] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_ZERO] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_ZERO] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_ZERO] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_ZERO] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_ZERO] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_ZERO] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_ZERO] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_ZERO] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_ZERO] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_ZERO] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_ZERO] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_ZERO] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_ZERO] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_ZERO] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_ZERO] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_ZERO] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_ZERO] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_ZERO] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_ZERO] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_ZERO] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_ZERO] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_ZERO] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_ZERO] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_ZERO] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_ZERO] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_ZERO] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_ZERO] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_ZERO] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_ZERO] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_ZERO] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_ZERO] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_ZERO] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_ZERO] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_ZERO] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_ZERO] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_ZERO] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_ZERO] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_ZERO] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_ZERO] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_ZERO] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_ZERO] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_ZERO] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_ZERO] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_ZERO] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_ZERO] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_ZERO] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_ZERO] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_ZERO] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_ZERO] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_ZERO] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_ZERO] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_ZERO] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_ZERO] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_ZERO] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_ZERO] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_ZERO] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_ZERO] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_ZERO] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_ZERO] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_ZERO] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_ZERO] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_ZERO] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_ZERO] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_ZERO] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_ZERO] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_ZERO] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_ZERO] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_ZERO] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_ZERO] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_ZERO] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_ZERO] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_ZERO] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_ZERO] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_ZERO] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_ZERO] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_ZERO] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_ZERO] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_ZERO] --> [Overflow,2147483904] --> OK [0.2147475456E10,TO_ZERO] --> [2147475456,2147475456] --> OK [0.2147475584E10,TO_ZERO] --> [2147475584,2147475584] --> OK [0.2147475712E10,TO_ZERO] --> [2147475712,2147475712] --> OK [0.214747584E10,TO_ZERO] --> [2147475840,2147475840] --> OK [0.2147475968E10,TO_ZERO] --> [2147475968,2147475968] --> OK [0.2147476096E10,TO_ZERO] --> [2147476096,2147476096] --> OK [0.2147476224E10,TO_ZERO] --> [2147476224,2147476224] --> OK [0.2147476352E10,TO_ZERO] --> [2147476352,2147476352] --> OK [0.214747648E10,TO_ZERO] --> [2147476480,2147476480] --> OK [0.2147476608E10,TO_ZERO] --> [2147476608,2147476608] --> OK [0.2147476736E10,TO_ZERO] --> [2147476736,2147476736] --> OK [0.2147476864E10,TO_ZERO] --> [2147476864,2147476864] --> OK [0.2147476992E10,TO_ZERO] --> [2147476992,2147476992] --> OK [0.214747712E10,TO_ZERO] --> [2147477120,2147477120] --> OK [0.2147477248E10,TO_ZERO] --> [2147477248,2147477248] --> OK [0.2147477376E10,TO_ZERO] --> [2147477376,2147477376] --> OK [0.2147477504E10,TO_ZERO] --> [2147477504,2147477504] --> OK [0.2147477632E10,TO_ZERO] --> [2147477632,2147477632] --> OK [0.214747776E10,TO_ZERO] --> [2147477760,2147477760] --> OK [0.2147477888E10,TO_ZERO] --> [2147477888,2147477888] --> OK [0.2147478016E10,TO_ZERO] --> [2147478016,2147478016] --> OK [0.2147478144E10,TO_ZERO] --> [2147478144,2147478144] --> OK [0.2147478272E10,TO_ZERO] --> [2147478272,2147478272] --> OK [0.21474784E10,TO_ZERO] --> [2147478400,2147478400] --> OK [0.2147478528E10,TO_ZERO] --> [2147478528,2147478528] --> OK [0.2147478656E10,TO_ZERO] --> [2147478656,2147478656] --> OK [0.2147478784E10,TO_ZERO] --> [2147478784,2147478784] --> OK [0.2147478912E10,TO_ZERO] --> [2147478912,2147478912] --> OK [0.214747904E10,TO_ZERO] --> [2147479040,2147479040] --> OK [0.2147479168E10,TO_ZERO] --> [2147479168,2147479168] --> OK [0.2147479296E10,TO_ZERO] --> [2147479296,2147479296] --> OK [0.2147479424E10,TO_ZERO] --> [2147479424,2147479424] --> OK [0.2147479552E10,TO_ZERO] --> [2147479552,2147479552] --> OK [0.214747968E10,TO_ZERO] --> [2147479680,2147479680] --> OK [0.2147479808E10,TO_ZERO] --> [2147479808,2147479808] --> OK [0.2147479936E10,TO_ZERO] --> [2147479936,2147479936] --> OK [0.2147480064E10,TO_ZERO] --> [2147480064,2147480064] --> OK [0.2147480192E10,TO_ZERO] --> [2147480192,2147480192] --> OK [0.214748032E10,TO_ZERO] --> [2147480320,2147480320] --> OK [0.2147480448E10,TO_ZERO] --> [2147480448,2147480448] --> OK [0.2147480576E10,TO_ZERO] --> [2147480576,2147480576] --> OK [0.2147480704E10,TO_ZERO] --> [2147480704,2147480704] --> OK [0.2147480832E10,TO_ZERO] --> [2147480832,2147480832] --> OK [0.214748096E10,TO_ZERO] --> [2147480960,2147480960] --> OK [0.2147481088E10,TO_ZERO] --> [2147481088,2147481088] --> OK [0.2147481216E10,TO_ZERO] --> [2147481216,2147481216] --> OK [0.2147481344E10,TO_ZERO] --> [2147481344,2147481344] --> OK [0.2147481472E10,TO_ZERO] --> [2147481472,2147481472] --> OK [0.21474816E10,TO_ZERO] --> [2147481600,2147481600] --> OK [0.2147481728E10,TO_ZERO] --> [2147481728,2147481728] --> OK [0.2147481856E10,TO_ZERO] --> [2147481856,2147481856] --> OK [0.2147481984E10,TO_ZERO] --> [2147481984,2147481984] --> OK [0.2147482112E10,TO_ZERO] --> [2147482112,2147482112] --> OK [0.214748224E10,TO_ZERO] --> [2147482240,2147482240] --> OK [0.2147482368E10,TO_ZERO] --> [2147482368,2147482368] --> OK [0.2147482496E10,TO_ZERO] --> [2147482496,2147482496] --> OK [0.2147482624E10,TO_ZERO] --> [2147482624,2147482624] --> OK [0.2147482752E10,TO_ZERO] --> [2147482752,2147482752] --> OK [0.214748288E10,TO_ZERO] --> [2147482880,2147482880] --> OK [0.2147483008E10,TO_ZERO] --> [2147483008,2147483008] --> OK [0.2147483136E10,TO_ZERO] --> [2147483136,2147483136] --> OK [0.2147483264E10,TO_ZERO] --> [2147483264,2147483264] --> OK [0.2147483392E10,TO_ZERO] --> [2147483392,2147483392] --> OK [0.214748352E10,TO_ZERO] --> [2147483520,2147483520] --> OK [0.2147483648E10,TO_ZERO] --> [Overflow,2147483648] --> OK [0.2147500032E10,TO_ZERO] --> [Overflow,2147500032] --> OK [0.2147499776E10,TO_ZERO] --> [Overflow,2147499776] --> OK [0.214749952E10,TO_ZERO] --> [Overflow,2147499520] --> OK [0.2147499264E10,TO_ZERO] --> [Overflow,2147499264] --> OK [0.2147499008E10,TO_ZERO] --> [Overflow,2147499008] --> OK [0.2147498752E10,TO_ZERO] --> [Overflow,2147498752] --> OK [0.2147498496E10,TO_ZERO] --> [Overflow,2147498496] --> OK [0.214749824E10,TO_ZERO] --> [Overflow,2147498240] --> OK [0.2147497984E10,TO_ZERO] --> [Overflow,2147497984] --> OK [0.2147497728E10,TO_ZERO] --> [Overflow,2147497728] --> OK [0.2147497472E10,TO_ZERO] --> [Overflow,2147497472] --> OK [0.2147497216E10,TO_ZERO] --> [Overflow,2147497216] --> OK [0.214749696E10,TO_ZERO] --> [Overflow,2147496960] --> OK [0.2147496704E10,TO_ZERO] --> [Overflow,2147496704] --> OK [0.2147496448E10,TO_ZERO] --> [Overflow,2147496448] --> OK [0.2147496192E10,TO_ZERO] --> [Overflow,2147496192] --> OK [0.2147495936E10,TO_ZERO] --> [Overflow,2147495936] --> OK [0.214749568E10,TO_ZERO] --> [Overflow,2147495680] --> OK [0.2147495424E10,TO_ZERO] --> [Overflow,2147495424] --> OK [0.2147495168E10,TO_ZERO] --> [Overflow,2147495168] --> OK [0.2147494912E10,TO_ZERO] --> [Overflow,2147494912] --> OK [0.2147494656E10,TO_ZERO] --> [Overflow,2147494656] --> OK [0.21474944E10,TO_ZERO] --> [Overflow,2147494400] --> OK [0.2147494144E10,TO_ZERO] --> [Overflow,2147494144] --> OK [0.2147493888E10,TO_ZERO] --> [Overflow,2147493888] --> OK [0.2147493632E10,TO_ZERO] --> [Overflow,2147493632] --> OK [0.2147493376E10,TO_ZERO] --> [Overflow,2147493376] --> OK [0.214749312E10,TO_ZERO] --> [Overflow,2147493120] --> OK [0.2147492864E10,TO_ZERO] --> [Overflow,2147492864] --> OK [0.2147492608E10,TO_ZERO] --> [Overflow,2147492608] --> OK [0.2147492352E10,TO_ZERO] --> [Overflow,2147492352] --> OK [0.2147492096E10,TO_ZERO] --> [Overflow,2147492096] --> OK [0.214749184E10,TO_ZERO] --> [Overflow,2147491840] --> OK [0.2147491584E10,TO_ZERO] --> [Overflow,2147491584] --> OK [0.2147491328E10,TO_ZERO] --> [Overflow,2147491328] --> OK [0.2147491072E10,TO_ZERO] --> [Overflow,2147491072] --> OK [0.2147490816E10,TO_ZERO] --> [Overflow,2147490816] --> OK [0.214749056E10,TO_ZERO] --> [Overflow,2147490560] --> OK [0.2147490304E10,TO_ZERO] --> [Overflow,2147490304] --> OK [0.2147490048E10,TO_ZERO] --> [Overflow,2147490048] --> OK [0.2147489792E10,TO_ZERO] --> [Overflow,2147489792] --> OK [0.2147489536E10,TO_ZERO] --> [Overflow,2147489536] --> OK [0.214748928E10,TO_ZERO] --> [Overflow,2147489280] --> OK [0.2147489024E10,TO_ZERO] --> [Overflow,2147489024] --> OK [0.2147488768E10,TO_ZERO] --> [Overflow,2147488768] --> OK [0.2147488512E10,TO_ZERO] --> [Overflow,2147488512] --> OK [0.2147488256E10,TO_ZERO] --> [Overflow,2147488256] --> OK [0.2147488E10,TO_ZERO] --> [Overflow,2147488000] --> OK [0.2147487744E10,TO_ZERO] --> [Overflow,2147487744] --> OK [0.2147487488E10,TO_ZERO] --> [Overflow,2147487488] --> OK [0.2147487232E10,TO_ZERO] --> [Overflow,2147487232] --> OK [0.2147486976E10,TO_ZERO] --> [Overflow,2147486976] --> OK [0.214748672E10,TO_ZERO] --> [Overflow,2147486720] --> OK [0.2147486464E10,TO_ZERO] --> [Overflow,2147486464] --> OK [0.2147486208E10,TO_ZERO] --> [Overflow,2147486208] --> OK [0.2147485952E10,TO_ZERO] --> [Overflow,2147485952] --> OK [0.2147485696E10,TO_ZERO] --> [Overflow,2147485696] --> OK [0.214748544E10,TO_ZERO] --> [Overflow,2147485440] --> OK [0.2147485184E10,TO_ZERO] --> [Overflow,2147485184] --> OK [0.2147484928E10,TO_ZERO] --> [Overflow,2147484928] --> OK [0.2147484672E10,TO_ZERO] --> [Overflow,2147484672] --> OK [0.2147484416E10,TO_ZERO] --> [Overflow,2147484416] --> OK [0.214748416E10,TO_ZERO] --> [Overflow,2147484160] --> OK [0.2147483904E10,TO_ZERO] --> [Overflow,2147483904] --> OK [~2147483648,~2147483648] --> [~0.2147483648E10,~0.2147483648E10] --> OK [~2147483647,~2147483647] --> [~0.2147483647E10,~0.2147483647E10] --> OK [~2147483646,~2147483646] --> [~0.2147483646E10,~0.2147483646E10] --> OK [~2147483645,~2147483645] --> [~0.2147483645E10,~0.2147483645E10] --> OK [~2113929217,~2113929217] --> [~0.2113929217E10,~0.2113929217E10] --> OK [~2080374785,~2080374785] --> [~0.2080374785E10,~0.2080374785E10] --> OK [~2013265921,~2013265921] --> [~0.2013265921E10,~0.2013265921E10] --> OK [~1879048193,~1879048193] --> [~0.1879048193E10,~0.1879048193E10] --> OK [~1610612737,~1610612737] --> [~0.1610612737E10,~0.1610612737E10] --> OK [~1073741825,~1073741825] --> [~0.1073741825E10,~0.1073741825E10] --> OK [~3,~3] --> [~0.3E1,~0.3E1] --> OK [~2,~2] --> [~0.2E1,~0.2E1] --> OK [~1,~1] --> [~0.1E1,~0.1E1] --> OK [0,0] --> [0.0,0.0] --> OK [1,1] --> [0.1E1,0.1E1] --> OK [2,2] --> [0.2E1,0.2E1] --> OK [3,3] --> [0.3E1,0.3E1] --> OK [1073741824,1073741824] --> [0.1073741824E10,0.1073741824E10] --> OK [1610612736,1610612736] --> [0.1610612736E10,0.1610612736E10] --> OK [1879048192,1879048192] --> [0.1879048192E10,0.1879048192E10] --> OK [2013265920,2013265920] --> [0.201326592E10,0.201326592E10] --> OK [2080374784,2080374784] --> [0.2080374784E10,0.2080374784E10] --> OK [2113929216,2113929216] --> [0.2113929216E10,0.2113929216E10] --> OK [2147483644,2147483644] --> [0.2147483644E10,0.2147483644E10] --> OK [2147483645,2147483645] --> [0.2147483645E10,0.2147483645E10] --> OK [2147483646,2147483646] --> [0.2147483646E10,0.2147483646E10] --> OK [2147483647,2147483647] --> [0.2147483647E10,0.2147483647E10] --> OK [~0.21474836480000305E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.214748364800003E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000296E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000029E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000286E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000028E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000277E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000027E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000267E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000026E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000257E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000253E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000025E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000243E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000024E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000234E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000023E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000224E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000022E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000215E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000021E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000205E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.214748364800002E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000196E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000019E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000186E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000018E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000176E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000017E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000167E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000016E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000157E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000153E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000015E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000143E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000014E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000134E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000013E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000124E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000012E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000114E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000011E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000105E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.214748364800001E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000095E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000009E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000086E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000008E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000076E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000007E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000067E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000006E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000057E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000052E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000005E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000043E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000004E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000033E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000003E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000024E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000002E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000014E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648000001E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836480000005E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483648E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999847E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999985E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999852E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999855E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999857E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999986E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999862E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999864E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999866E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999987E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999871E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999874E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999876E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999878E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999988E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999883E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999886E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999888E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999989E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999893E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999895E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999897E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.214748364799999E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999902E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999905E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999907E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999991E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999912E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999914E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999917E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999992E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999921E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999924E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999926E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999928E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999993E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999933E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999936E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999938E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999994E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999943E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999945E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999948E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999995E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999952E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999955E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999957E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999996E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999962E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999964E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999967E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999997E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999971E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999974E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999976E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999979E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999998E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999983E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999986E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999988E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.2147483647999999E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999993E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999995E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836479999998E10,TO_NEAREST] --> [~2147483648,~2147483648] --> OK [~0.21474836470000153E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000015E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000148E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000145E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000143E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000014E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000138E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000136E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000134E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000013E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000129E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000126E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000124E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000122E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000012E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000117E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000114E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000112E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000011E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000107E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000105E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000103E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.214748364700001E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000098E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000095E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000093E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000009E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000088E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000086E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000083E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000008E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000079E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000076E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000074E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000072E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000007E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000067E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000064E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000062E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000006E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000057E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000055E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000052E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000005E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000048E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000045E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000043E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000004E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000038E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000036E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000033E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000003E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000029E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000026E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000024E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000021E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000002E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000017E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000014E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000012E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647000001E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000007E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000005E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836470000002E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483647E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999847E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999985E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999852E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999855E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999857E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999986E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999862E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999864E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999866E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999987E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999871E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999874E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999876E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999878E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999988E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999883E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999886E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999888E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999989E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999893E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999895E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999897E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.214748364699999E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999902E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999905E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999907E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999991E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999912E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999914E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999917E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999992E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999921E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999924E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999926E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999928E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999993E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999933E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999936E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999938E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999994E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999943E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999945E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999948E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999995E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999952E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999955E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999957E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999996E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999962E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999964E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999967E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999997E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999971E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999974E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999976E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999979E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999998E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999983E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999986E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999988E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.2147483646999999E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999993E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999995E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836469999998E10,TO_NEAREST] --> [~2147483647,~2147483647] --> OK [~0.21474836460000153E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000015E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000148E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000145E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000143E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000014E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000138E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000136E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000134E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000013E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000129E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000126E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000124E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000122E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000012E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000117E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000114E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000112E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000011E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000107E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000105E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000103E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.214748364600001E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000098E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000095E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000093E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000009E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000088E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000086E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000083E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000008E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000079E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000076E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000074E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000072E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000007E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000067E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000064E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000062E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000006E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000057E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000055E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000052E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000005E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000048E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000045E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000043E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000004E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000038E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000036E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000033E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000003E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000029E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000026E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000024E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000021E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000002E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000017E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000014E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000012E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646000001E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000007E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000005E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836460000002E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483646E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999847E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999985E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999852E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999855E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999857E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999986E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999862E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999864E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999866E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999987E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999871E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999874E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999876E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999878E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999988E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999883E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999886E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999888E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999989E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999893E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999895E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999897E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.214748364599999E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999902E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999905E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999907E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999991E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999912E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999914E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999917E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999992E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999921E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999924E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999926E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999928E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999993E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999933E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999936E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999938E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999994E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999943E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999945E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999948E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999995E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999952E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999955E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999957E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999996E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999962E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999964E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999967E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999997E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999971E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999974E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999976E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999979E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999998E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999983E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999986E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999988E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.2147483645999999E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999993E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999995E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836459999998E10,TO_NEAREST] --> [~2147483646,~2147483646] --> OK [~0.21474836450000153E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000015E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000148E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000145E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000143E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000014E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000138E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000136E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000134E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000013E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000129E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000126E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000124E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000122E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000012E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000117E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000114E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000112E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000011E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000107E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000105E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000103E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.214748364500001E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000098E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000095E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000093E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000009E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000088E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000086E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000083E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000008E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000079E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000076E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000074E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000072E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000007E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000067E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000064E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000062E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000006E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000057E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000055E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000052E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000005E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000048E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000045E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000043E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000004E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000038E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000036E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000033E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000003E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000029E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000026E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000024E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000021E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000002E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000017E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000014E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000012E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645000001E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000007E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000005E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836450000002E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483645E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999847E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999985E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999852E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999855E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999857E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999986E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999862E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999864E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999866E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999987E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999871E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999874E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999876E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999878E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999988E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999883E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999886E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999888E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999989E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999893E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999895E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999897E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.214748364499999E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999902E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999905E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999907E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999991E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999912E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999914E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999917E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999992E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999921E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999924E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999926E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999928E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999993E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999933E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999936E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999938E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999994E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999943E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999945E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999948E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999995E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999952E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999955E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999957E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999996E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999962E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999964E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999967E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999997E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999971E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999974E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999976E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999979E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999998E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999983E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999986E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999988E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.2147483644999999E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999993E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999995E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21474836449999998E10,TO_NEAREST] --> [~2147483645,~2147483645] --> OK [~0.21139292170000153E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000015E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000148E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000145E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000143E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000014E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000138E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000136E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000134E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000013E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000129E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000126E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000124E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000122E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000012E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000117E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000114E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000112E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000011E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000107E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000105E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000103E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.211392921700001E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000098E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000095E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000093E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000009E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000088E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000086E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000083E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000008E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000079E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000076E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000074E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000072E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000007E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000067E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000064E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000062E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000006E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000057E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000055E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000052E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000005E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000048E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000045E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000043E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000004E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000038E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000036E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000033E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000003E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000029E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000026E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000024E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000021E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000002E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000017E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000014E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000012E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217000001E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000007E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000005E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292170000002E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929217E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999847E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999985E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999852E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999855E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999857E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999986E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999862E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999864E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999866E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999987E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999871E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999874E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999876E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999878E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999988E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999883E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999886E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999888E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999989E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999893E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999895E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999897E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.211392921699999E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999902E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999905E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999907E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999991E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999912E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999914E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999917E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999992E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999921E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999924E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999926E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999928E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999993E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999933E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999936E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999938E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999994E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999943E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999945E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999948E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999995E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999952E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999955E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999957E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999996E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999962E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999964E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999967E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999997E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999971E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999974E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999976E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999979E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999998E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999983E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999986E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999988E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.2113929216999999E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999993E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999995E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.21139292169999998E10,TO_NEAREST] --> [~2113929217,~2113929217] --> OK [~0.20803747850000153E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000015E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000148E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000145E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000143E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000014E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000138E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000136E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000134E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000013E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000129E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000126E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000124E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000122E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000012E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000117E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000114E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000112E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000011E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000107E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000105E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000103E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.208037478500001E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000098E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000095E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000093E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000009E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000088E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000086E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000083E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000008E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000079E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000076E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000074E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000072E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000007E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000067E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000064E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000062E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000006E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000057E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000055E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000052E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000005E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000048E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000045E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000043E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000004E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000038E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000036E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000033E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000003E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000029E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000026E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000024E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000021E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000002E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000017E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000014E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000012E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785000001E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000007E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000005E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747850000002E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374785E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999847E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999985E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999852E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999855E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999857E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999986E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999862E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999864E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999866E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999987E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999871E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999874E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999876E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999878E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999988E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999883E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999886E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999888E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999989E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999893E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999895E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999897E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.208037478499999E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999902E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999905E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999907E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999991E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999912E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999914E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999917E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999992E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999921E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999924E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999926E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999928E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999993E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999933E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999936E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999938E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999994E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999943E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999945E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999948E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999995E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999952E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999955E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999957E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999996E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999962E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999964E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999967E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999997E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999971E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999974E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999976E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999979E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999998E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999983E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999986E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999988E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.2080374784999999E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999993E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999995E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20803747849999998E10,TO_NEAREST] --> [~2080374785,~2080374785] --> OK [~0.20132659210000153E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000015E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000148E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000145E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000143E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000014E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000138E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000136E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000134E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000013E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000129E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000126E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000124E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000122E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000012E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000117E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000114E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000112E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000011E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000107E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000105E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000103E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.201326592100001E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000098E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000095E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000093E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000009E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000088E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000086E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000083E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000008E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000079E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000076E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000074E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000072E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000007E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000067E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000064E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000062E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000006E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000057E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000055E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000052E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000005E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000048E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000045E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000043E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000004E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000038E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000036E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000033E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000003E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000029E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000026E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000024E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000021E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000002E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000017E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000014E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000012E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921000001E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000007E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000005E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659210000002E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265921E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999847E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999985E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999852E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999855E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999857E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999986E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999862E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999864E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999866E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999987E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999871E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999874E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999876E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999878E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999988E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999883E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999886E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999888E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999989E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999893E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999895E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999897E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.201326592099999E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999902E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999905E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999907E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999991E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999912E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999914E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999917E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999992E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999921E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999924E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999926E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999928E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999993E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999933E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999936E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999938E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999994E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999943E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999945E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999948E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999995E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999952E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999955E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999957E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999996E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999962E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999964E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999967E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999997E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999971E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999974E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999976E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999979E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999998E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999983E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999986E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999988E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.2013265920999999E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999993E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999995E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.20132659209999998E10,TO_NEAREST] --> [~2013265921,~2013265921] --> OK [~0.18790481930000153E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000015E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000148E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000145E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000143E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000014E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000138E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000136E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000134E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000013E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000129E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000126E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000124E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000122E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000012E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000117E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000114E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000112E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000011E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000107E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000105E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000103E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.187904819300001E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000098E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000095E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000093E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000009E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000088E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000086E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000083E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000008E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000079E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000076E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000074E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000072E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000007E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000067E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000064E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000062E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000006E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000057E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000055E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000052E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000005E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000048E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000045E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000043E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000004E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000038E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000036E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000033E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000003E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000029E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000026E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000024E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000021E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000002E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000017E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000014E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000012E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193000001E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000007E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000005E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481930000002E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048193E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999847E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999985E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999852E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999855E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999857E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999986E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999862E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999864E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999866E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999987E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999871E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999874E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999876E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999878E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999988E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999883E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999886E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999888E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999989E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999893E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999895E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999897E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.187904819299999E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999902E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999905E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999907E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999991E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999912E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999914E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999917E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999992E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999921E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999924E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999926E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999928E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999993E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999933E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999936E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999938E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999994E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999943E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999945E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999948E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999995E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999952E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999955E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999957E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999996E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999962E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999964E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999967E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999997E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999971E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999974E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999976E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999979E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999998E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999983E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999986E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999988E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.1879048192999999E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999993E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999995E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.18790481929999998E10,TO_NEAREST] --> [~1879048193,~1879048193] --> OK [~0.16106127370000153E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000015E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000148E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000145E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000143E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000014E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000138E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000136E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000134E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000013E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000129E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000126E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000124E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000122E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000012E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000117E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000114E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000112E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000011E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000107E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000105E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000103E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.161061273700001E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000098E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000095E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000093E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000009E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000088E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000086E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000083E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000008E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000079E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000076E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000074E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000072E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000007E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000067E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000064E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000062E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000006E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000057E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000055E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000052E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000005E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000048E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000045E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000043E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000004E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000038E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000036E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000033E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000003E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000029E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000026E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000024E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000021E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000002E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000017E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000014E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000012E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737000001E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000007E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000005E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127370000002E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612737E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999847E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999985E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999852E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999855E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999857E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999986E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999862E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999864E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999866E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999987E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999871E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999874E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999876E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999878E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999988E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999883E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999886E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999888E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999989E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999893E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999895E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999897E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.161061273699999E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999902E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999905E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999907E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999991E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999912E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999914E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999917E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999992E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999921E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999924E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999926E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999928E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999993E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999933E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999936E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999938E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999994E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999943E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999945E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999948E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999995E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999952E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999955E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999957E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999996E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999962E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999964E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999967E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999997E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999971E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999974E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999976E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999979E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999998E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999983E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999986E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999988E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.1610612736999999E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999993E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999995E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.16106127369999998E10,TO_NEAREST] --> [~1610612737,~1610612737] --> OK [~0.10737418250000153E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000015E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000148E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000145E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000143E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000014E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000138E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000136E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000134E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000013E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000129E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000126E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000124E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000122E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000012E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000117E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000114E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000112E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000011E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000107E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000105E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000103E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.107374182500001E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000098E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000095E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000093E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000009E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000088E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000086E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000083E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000008E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000079E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000076E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000074E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000072E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000007E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000067E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000064E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000062E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000006E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000057E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000055E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000052E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000005E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000048E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000045E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000043E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000004E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000038E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000036E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000033E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000003E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000029E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000026E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000024E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000021E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000002E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000017E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000014E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000012E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825000001E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000007E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000005E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418250000002E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741825E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999847E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999985E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999852E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999855E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999857E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999986E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999862E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999864E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999866E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999987E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999871E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999874E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999876E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999878E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999988E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999883E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999886E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999888E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999989E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999893E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999895E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999897E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.107374182499999E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999902E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999905E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999907E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999991E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999912E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999914E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999917E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999992E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999921E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999924E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999926E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999928E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999993E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999933E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999936E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999938E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999994E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999943E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999945E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999948E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999995E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999952E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999955E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999957E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999996E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999962E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999964E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999967E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999997E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999971E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999974E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999976E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999979E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999998E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999983E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999986E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999988E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.1073741824999999E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999993E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999995E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.10737418249999998E10,TO_NEAREST] --> [~1073741825,~1073741825] --> OK [~0.30000000000000284E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000028E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000275E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000027E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000266E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000026E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000258E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000253E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000025E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000244E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000024E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000235E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000023E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000226E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000022E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000218E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000213E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000021E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000204E1,TO_NEAREST] --> [~3,~3] --> OK [~0.300000000000002E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000195E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000019E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000187E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000018E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000178E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000173E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000017E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000164E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000016E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000155E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000015E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000147E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000014E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000138E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000133E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000013E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000124E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000012E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000115E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000011E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000107E1,TO_NEAREST] --> [~3,~3] --> OK [~0.300000000000001E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000098E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000093E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000009E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000084E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000008E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000075E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000007E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000067E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000006E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000058E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000053E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000005E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000044E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000004E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000036E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000003E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000027E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000002E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000018E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000013E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3000000000000001E1,TO_NEAREST] --> [~3,~3] --> OK [~0.30000000000000004E1,TO_NEAREST] --> [~3,~3] --> OK [~0.3E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999716E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999972E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999725E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999973E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999734E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999974E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999742E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999747E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999975E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999756E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999976E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999765E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999977E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999774E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999978E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999782E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999787E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999979E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999796E1,TO_NEAREST] --> [~3,~3] --> OK [~0.299999999999998E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999805E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999981E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999813E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999982E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999822E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999827E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999983E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999836E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999984E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999845E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999985E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999853E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999986E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999862E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999867E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999987E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999876E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999988E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999885E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999989E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999893E1,TO_NEAREST] --> [~3,~3] --> OK [~0.299999999999999E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999902E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999907E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999991E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999916E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999992E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999925E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999993E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999933E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999994E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999942E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999947E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999995E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999956E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999996E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999964E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999997E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999973E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999998E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999982E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999987E1,TO_NEAREST] --> [~3,~3] --> OK [~0.2999999999999999E1,TO_NEAREST] --> [~3,~3] --> OK [~0.29999999999999996E1,TO_NEAREST] --> [~3,~3] --> OK [~0.20000000000000284E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000028E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000275E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000027E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000266E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000026E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000258E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000253E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000025E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000244E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000024E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000235E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000023E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000226E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000022E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000218E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000213E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000021E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000204E1,TO_NEAREST] --> [~2,~2] --> OK [~0.200000000000002E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000195E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000019E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000187E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000018E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000178E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000173E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000017E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000164E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000016E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000155E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000015E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000147E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000014E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000138E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000133E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000013E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000124E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000012E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000115E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000011E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000107E1,TO_NEAREST] --> [~2,~2] --> OK [~0.200000000000001E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000098E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000093E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000009E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000084E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000008E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000075E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000007E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000067E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000006E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000058E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000053E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000005E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000044E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000004E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000036E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000003E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000027E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000002E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000018E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000013E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2000000000000001E1,TO_NEAREST] --> [~2,~2] --> OK [~0.20000000000000004E1,TO_NEAREST] --> [~2,~2] --> OK [~0.2E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999858E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999986E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999862E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999865E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999867E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999987E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999871E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999873E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999876E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999878E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999988E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999882E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999885E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999887E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999989E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999891E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999893E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999896E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999898E1,TO_NEAREST] --> [~2,~2] --> OK [~0.199999999999999E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999902E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999905E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999907E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999991E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999911E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999913E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999916E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999918E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999992E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999922E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999925E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999927E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999993E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999931E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999933E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999936E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999938E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999994E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999942E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999944E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999947E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999995E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999951E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999953E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999956E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999958E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999996E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999962E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999964E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999967E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999997E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999971E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999973E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999976E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999978E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999998E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999982E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999984E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999987E1,TO_NEAREST] --> [~2,~2] --> OK [~0.1999999999999999E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999991E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999993E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999996E1,TO_NEAREST] --> [~2,~2] --> OK [~0.19999999999999998E1,TO_NEAREST] --> [~2,~2] --> OK [~0.10000000000000142E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000014E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000138E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000135E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000133E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000013E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000129E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000127E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000124E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000122E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000012E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000118E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000115E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000113E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000011E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000109E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000107E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000104E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000102E1,TO_NEAREST] --> [~1,~1] --> OK [~0.100000000000001E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000098E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000095E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000093E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000009E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000089E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000087E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000084E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000082E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000008E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000078E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000075E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000073E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000007E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000069E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000067E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000064E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000062E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000006E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000058E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000056E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000053E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000005E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000049E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000047E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000044E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000042E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000004E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000038E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000036E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000033E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000003E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000029E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000027E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000024E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000022E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000002E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000018E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000016E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000013E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1000000000000001E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000009E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000007E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000004E1,TO_NEAREST] --> [~1,~1] --> OK [~0.10000000000000002E1,TO_NEAREST] --> [~1,~1] --> OK [~0.1E1,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999929,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999993,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999931,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999932,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999933,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999934,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999936,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999937,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999938,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999939,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999994,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999941,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999942,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999943,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999944,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999946,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999947,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999948,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999949,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999995,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999951,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999952,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999953,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999954,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999956,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999957,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999958,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999959,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999996,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999961,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999962,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999963,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999964,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999966,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999967,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999968,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999969,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999997,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999971,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999972,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999973,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999974,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999976,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999977,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999978,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999979,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999998,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999981,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999982,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999983,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999984,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999986,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999987,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999988,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999989,TO_NEAREST] --> [~1,~1] --> OK [~0.999999999999999,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999991,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999992,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999993,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999994,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999996,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999997,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999998,TO_NEAREST] --> [~1,~1] --> OK [~0.9999999999999999,TO_NEAREST] --> [~1,~1] --> OK [~0.316E~321,TO_NEAREST] --> [0,0] --> OK [~0.31E~321,TO_NEAREST] --> [0,0] --> OK [~0.306E~321,TO_NEAREST] --> [0,0] --> OK [~0.3E~321,TO_NEAREST] --> [0,0] --> OK [~0.296E~321,TO_NEAREST] --> [0,0] --> OK [~0.29E~321,TO_NEAREST] --> [0,0] --> OK [~0.287E~321,TO_NEAREST] --> [0,0] --> OK [~0.28E~321,TO_NEAREST] --> [0,0] --> OK [~0.277E~321,TO_NEAREST] --> [0,0] --> OK [~0.27E~321,TO_NEAREST] --> [0,0] --> OK [~0.267E~321,TO_NEAREST] --> [0,0] --> OK [~0.26E~321,TO_NEAREST] --> [0,0] --> OK [~0.257E~321,TO_NEAREST] --> [0,0] --> OK [~0.25E~321,TO_NEAREST] --> [0,0] --> OK [~0.247E~321,TO_NEAREST] --> [0,0] --> OK [~0.24E~321,TO_NEAREST] --> [0,0] --> OK [~0.237E~321,TO_NEAREST] --> [0,0] --> OK [~0.23E~321,TO_NEAREST] --> [0,0] --> OK [~0.227E~321,TO_NEAREST] --> [0,0] --> OK [~0.22E~321,TO_NEAREST] --> [0,0] --> OK [~0.217E~321,TO_NEAREST] --> [0,0] --> OK [~0.21E~321,TO_NEAREST] --> [0,0] --> OK [~0.208E~321,TO_NEAREST] --> [0,0] --> OK [~0.203E~321,TO_NEAREST] --> [0,0] --> OK [~0.2E~321,TO_NEAREST] --> [0,0] --> OK [~0.193E~321,TO_NEAREST] --> [0,0] --> OK [~0.19E~321,TO_NEAREST] --> [0,0] --> OK [~0.183E~321,TO_NEAREST] --> [0,0] --> OK [~0.18E~321,TO_NEAREST] --> [0,0] --> OK [~0.173E~321,TO_NEAREST] --> [0,0] --> OK [~0.17E~321,TO_NEAREST] --> [0,0] --> OK [~0.163E~321,TO_NEAREST] --> [0,0] --> OK [~0.16E~321,TO_NEAREST] --> [0,0] --> OK [~0.153E~321,TO_NEAREST] --> [0,0] --> OK [~0.15E~321,TO_NEAREST] --> [0,0] --> OK [~0.143E~321,TO_NEAREST] --> [0,0] --> OK [~0.14E~321,TO_NEAREST] --> [0,0] --> OK [~0.133E~321,TO_NEAREST] --> [0,0] --> OK [~0.13E~321,TO_NEAREST] --> [0,0] --> OK [~0.124E~321,TO_NEAREST] --> [0,0] --> OK [~0.12E~321,TO_NEAREST] --> [0,0] --> OK [~0.114E~321,TO_NEAREST] --> [0,0] --> OK [~0.11E~321,TO_NEAREST] --> [0,0] --> OK [~0.104E~321,TO_NEAREST] --> [0,0] --> OK [~0.1E~321,TO_NEAREST] --> [0,0] --> OK [~0.94E~322,TO_NEAREST] --> [0,0] --> OK [~0.9E~322,TO_NEAREST] --> [0,0] --> OK [~0.84E~322,TO_NEAREST] --> [0,0] --> OK [~0.8E~322,TO_NEAREST] --> [0,0] --> OK [~0.74E~322,TO_NEAREST] --> [0,0] --> OK [~0.7E~322,TO_NEAREST] --> [0,0] --> OK [~0.64E~322,TO_NEAREST] --> [0,0] --> OK [~0.6E~322,TO_NEAREST] --> [0,0] --> OK [~0.54E~322,TO_NEAREST] --> [0,0] --> OK [~0.5E~322,TO_NEAREST] --> [0,0] --> OK [~0.44E~322,TO_NEAREST] --> [0,0] --> OK [~0.4E~322,TO_NEAREST] --> [0,0] --> OK [~0.35E~322,TO_NEAREST] --> [0,0] --> OK [~0.3E~322,TO_NEAREST] --> [0,0] --> OK [~0.25E~322,TO_NEAREST] --> [0,0] --> OK [~0.2E~322,TO_NEAREST] --> [0,0] --> OK [~0.15E~322,TO_NEAREST] --> [0,0] --> OK [~0.1E~322,TO_NEAREST] --> [0,0] --> OK [~0.5E~323,TO_NEAREST] --> [0,0] --> OK [0.0,TO_NEAREST] --> [0,0] --> OK [0.316E~321,TO_NEAREST] --> [0,0] --> OK [0.31E~321,TO_NEAREST] --> [0,0] --> OK [0.306E~321,TO_NEAREST] --> [0,0] --> OK [0.3E~321,TO_NEAREST] --> [0,0] --> OK [0.296E~321,TO_NEAREST] --> [0,0] --> OK [0.29E~321,TO_NEAREST] --> [0,0] --> OK [0.287E~321,TO_NEAREST] --> [0,0] --> OK [0.28E~321,TO_NEAREST] --> [0,0] --> OK [0.277E~321,TO_NEAREST] --> [0,0] --> OK [0.27E~321,TO_NEAREST] --> [0,0] --> OK [0.267E~321,TO_NEAREST] --> [0,0] --> OK [0.26E~321,TO_NEAREST] --> [0,0] --> OK [0.257E~321,TO_NEAREST] --> [0,0] --> OK [0.25E~321,TO_NEAREST] --> [0,0] --> OK [0.247E~321,TO_NEAREST] --> [0,0] --> OK [0.24E~321,TO_NEAREST] --> [0,0] --> OK [0.237E~321,TO_NEAREST] --> [0,0] --> OK [0.23E~321,TO_NEAREST] --> [0,0] --> OK [0.227E~321,TO_NEAREST] --> [0,0] --> OK [0.22E~321,TO_NEAREST] --> [0,0] --> OK [0.217E~321,TO_NEAREST] --> [0,0] --> OK [0.21E~321,TO_NEAREST] --> [0,0] --> OK [0.208E~321,TO_NEAREST] --> [0,0] --> OK [0.203E~321,TO_NEAREST] --> [0,0] --> OK [0.2E~321,TO_NEAREST] --> [0,0] --> OK [0.193E~321,TO_NEAREST] --> [0,0] --> OK [0.19E~321,TO_NEAREST] --> [0,0] --> OK [0.183E~321,TO_NEAREST] --> [0,0] --> OK [0.18E~321,TO_NEAREST] --> [0,0] --> OK [0.173E~321,TO_NEAREST] --> [0,0] --> OK [0.17E~321,TO_NEAREST] --> [0,0] --> OK [0.163E~321,TO_NEAREST] --> [0,0] --> OK [0.16E~321,TO_NEAREST] --> [0,0] --> OK [0.153E~321,TO_NEAREST] --> [0,0] --> OK [0.15E~321,TO_NEAREST] --> [0,0] --> OK [0.143E~321,TO_NEAREST] --> [0,0] --> OK [0.14E~321,TO_NEAREST] --> [0,0] --> OK [0.133E~321,TO_NEAREST] --> [0,0] --> OK [0.13E~321,TO_NEAREST] --> [0,0] --> OK [0.124E~321,TO_NEAREST] --> [0,0] --> OK [0.12E~321,TO_NEAREST] --> [0,0] --> OK [0.114E~321,TO_NEAREST] --> [0,0] --> OK [0.11E~321,TO_NEAREST] --> [0,0] --> OK [0.104E~321,TO_NEAREST] --> [0,0] --> OK [0.1E~321,TO_NEAREST] --> [0,0] --> OK [0.94E~322,TO_NEAREST] --> [0,0] --> OK [0.9E~322,TO_NEAREST] --> [0,0] --> OK [0.84E~322,TO_NEAREST] --> [0,0] --> OK [0.8E~322,TO_NEAREST] --> [0,0] --> OK [0.74E~322,TO_NEAREST] --> [0,0] --> OK [0.7E~322,TO_NEAREST] --> [0,0] --> OK [0.64E~322,TO_NEAREST] --> [0,0] --> OK [0.6E~322,TO_NEAREST] --> [0,0] --> OK [0.54E~322,TO_NEAREST] --> [0,0] --> OK [0.5E~322,TO_NEAREST] --> [0,0] --> OK [0.44E~322,TO_NEAREST] --> [0,0] --> OK [0.4E~322,TO_NEAREST] --> [0,0] --> OK [0.35E~322,TO_NEAREST] --> [0,0] --> OK [0.3E~322,TO_NEAREST] --> [0,0] --> OK [0.25E~322,TO_NEAREST] --> [0,0] --> OK [0.2E~322,TO_NEAREST] --> [0,0] --> OK [0.15E~322,TO_NEAREST] --> [0,0] --> OK [0.1E~322,TO_NEAREST] --> [0,0] --> OK [0.5E~323,TO_NEAREST] --> [0,0] --> OK [0.9999999999999929,TO_NEAREST] --> [1,1] --> OK [0.999999999999993,TO_NEAREST] --> [1,1] --> OK [0.9999999999999931,TO_NEAREST] --> [1,1] --> OK [0.9999999999999932,TO_NEAREST] --> [1,1] --> OK [0.9999999999999933,TO_NEAREST] --> [1,1] --> OK [0.9999999999999934,TO_NEAREST] --> [1,1] --> OK [0.9999999999999936,TO_NEAREST] --> [1,1] --> OK [0.9999999999999937,TO_NEAREST] --> [1,1] --> OK [0.9999999999999938,TO_NEAREST] --> [1,1] --> OK [0.9999999999999939,TO_NEAREST] --> [1,1] --> OK [0.999999999999994,TO_NEAREST] --> [1,1] --> OK [0.9999999999999941,TO_NEAREST] --> [1,1] --> OK [0.9999999999999942,TO_NEAREST] --> [1,1] --> OK [0.9999999999999943,TO_NEAREST] --> [1,1] --> OK [0.9999999999999944,TO_NEAREST] --> [1,1] --> OK [0.9999999999999946,TO_NEAREST] --> [1,1] --> OK [0.9999999999999947,TO_NEAREST] --> [1,1] --> OK [0.9999999999999948,TO_NEAREST] --> [1,1] --> OK [0.9999999999999949,TO_NEAREST] --> [1,1] --> OK [0.999999999999995,TO_NEAREST] --> [1,1] --> OK [0.9999999999999951,TO_NEAREST] --> [1,1] --> OK [0.9999999999999952,TO_NEAREST] --> [1,1] --> OK [0.9999999999999953,TO_NEAREST] --> [1,1] --> OK [0.9999999999999954,TO_NEAREST] --> [1,1] --> OK [0.9999999999999956,TO_NEAREST] --> [1,1] --> OK [0.9999999999999957,TO_NEAREST] --> [1,1] --> OK [0.9999999999999958,TO_NEAREST] --> [1,1] --> OK [0.9999999999999959,TO_NEAREST] --> [1,1] --> OK [0.999999999999996,TO_NEAREST] --> [1,1] --> OK [0.9999999999999961,TO_NEAREST] --> [1,1] --> OK [0.9999999999999962,TO_NEAREST] --> [1,1] --> OK [0.9999999999999963,TO_NEAREST] --> [1,1] --> OK [0.9999999999999964,TO_NEAREST] --> [1,1] --> OK [0.9999999999999966,TO_NEAREST] --> [1,1] --> OK [0.9999999999999967,TO_NEAREST] --> [1,1] --> OK [0.9999999999999968,TO_NEAREST] --> [1,1] --> OK [0.9999999999999969,TO_NEAREST] --> [1,1] --> OK [0.999999999999997,TO_NEAREST] --> [1,1] --> OK [0.9999999999999971,TO_NEAREST] --> [1,1] --> OK [0.9999999999999972,TO_NEAREST] --> [1,1] --> OK [0.9999999999999973,TO_NEAREST] --> [1,1] --> OK [0.9999999999999974,TO_NEAREST] --> [1,1] --> OK [0.9999999999999976,TO_NEAREST] --> [1,1] --> OK [0.9999999999999977,TO_NEAREST] --> [1,1] --> OK [0.9999999999999978,TO_NEAREST] --> [1,1] --> OK [0.9999999999999979,TO_NEAREST] --> [1,1] --> OK [0.999999999999998,TO_NEAREST] --> [1,1] --> OK [0.9999999999999981,TO_NEAREST] --> [1,1] --> OK [0.9999999999999982,TO_NEAREST] --> [1,1] --> OK [0.9999999999999983,TO_NEAREST] --> [1,1] --> OK [0.9999999999999984,TO_NEAREST] --> [1,1] --> OK [0.9999999999999986,TO_NEAREST] --> [1,1] --> OK [0.9999999999999987,TO_NEAREST] --> [1,1] --> OK [0.9999999999999988,TO_NEAREST] --> [1,1] --> OK [0.9999999999999989,TO_NEAREST] --> [1,1] --> OK [0.999999999999999,TO_NEAREST] --> [1,1] --> OK [0.9999999999999991,TO_NEAREST] --> [1,1] --> OK [0.9999999999999992,TO_NEAREST] --> [1,1] --> OK [0.9999999999999993,TO_NEAREST] --> [1,1] --> OK [0.9999999999999994,TO_NEAREST] --> [1,1] --> OK [0.9999999999999996,TO_NEAREST] --> [1,1] --> OK [0.9999999999999997,TO_NEAREST] --> [1,1] --> OK [0.9999999999999998,TO_NEAREST] --> [1,1] --> OK [0.9999999999999999,TO_NEAREST] --> [1,1] --> OK [0.1E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000142E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000014E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000138E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000135E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000133E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000013E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000129E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000127E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000124E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000122E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000012E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000118E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000115E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000113E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000011E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000109E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000107E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000104E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000102E1,TO_NEAREST] --> [1,1] --> OK [0.100000000000001E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000098E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000095E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000093E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000009E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000089E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000087E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000084E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000082E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000008E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000078E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000075E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000073E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000007E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000069E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000067E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000064E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000062E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000006E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000058E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000056E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000053E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000005E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000049E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000047E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000044E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000042E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000004E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000038E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000036E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000033E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000003E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000029E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000027E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000024E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000022E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000002E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000018E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000016E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000013E1,TO_NEAREST] --> [1,1] --> OK [0.1000000000000001E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000009E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000007E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000004E1,TO_NEAREST] --> [1,1] --> OK [0.10000000000000002E1,TO_NEAREST] --> [1,1] --> OK [0.19999999999999858E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999986E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999862E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999865E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999867E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999987E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999871E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999873E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999876E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999878E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999988E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999882E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999885E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999887E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999989E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999891E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999893E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999896E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999898E1,TO_NEAREST] --> [2,2] --> OK [0.199999999999999E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999902E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999905E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999907E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999991E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999911E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999913E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999916E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999918E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999992E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999922E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999925E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999927E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999993E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999931E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999933E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999936E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999938E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999994E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999942E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999944E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999947E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999995E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999951E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999953E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999956E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999958E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999996E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999962E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999964E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999967E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999997E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999971E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999973E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999976E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999978E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999998E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999982E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999984E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999987E1,TO_NEAREST] --> [2,2] --> OK [0.1999999999999999E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999991E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999993E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999996E1,TO_NEAREST] --> [2,2] --> OK [0.19999999999999998E1,TO_NEAREST] --> [2,2] --> OK [0.2E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000284E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000028E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000275E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000027E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000266E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000026E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000258E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000253E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000025E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000244E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000024E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000235E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000023E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000226E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000022E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000218E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000213E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000021E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000204E1,TO_NEAREST] --> [2,2] --> OK [0.200000000000002E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000195E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000019E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000187E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000018E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000178E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000173E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000017E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000164E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000016E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000155E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000015E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000147E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000014E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000138E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000133E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000013E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000124E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000012E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000115E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000011E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000107E1,TO_NEAREST] --> [2,2] --> OK [0.200000000000001E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000098E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000093E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000009E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000084E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000008E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000075E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000007E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000067E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000006E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000058E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000053E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000005E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000044E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000004E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000036E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000003E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000027E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000002E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000018E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000013E1,TO_NEAREST] --> [2,2] --> OK [0.2000000000000001E1,TO_NEAREST] --> [2,2] --> OK [0.20000000000000004E1,TO_NEAREST] --> [2,2] --> OK [0.29999999999999716E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999972E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999725E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999973E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999734E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999974E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999742E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999747E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999975E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999756E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999976E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999765E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999977E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999774E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999978E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999782E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999787E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999979E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999796E1,TO_NEAREST] --> [3,3] --> OK [0.299999999999998E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999805E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999981E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999813E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999982E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999822E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999827E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999983E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999836E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999984E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999845E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999985E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999853E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999986E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999862E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999867E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999987E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999876E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999988E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999885E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999989E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999893E1,TO_NEAREST] --> [3,3] --> OK [0.299999999999999E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999902E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999907E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999991E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999916E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999992E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999925E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999993E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999933E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999994E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999942E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999947E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999995E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999956E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999996E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999964E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999997E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999973E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999998E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999982E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999987E1,TO_NEAREST] --> [3,3] --> OK [0.2999999999999999E1,TO_NEAREST] --> [3,3] --> OK [0.29999999999999996E1,TO_NEAREST] --> [3,3] --> OK [0.3E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000284E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000028E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000275E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000027E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000266E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000026E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000258E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000253E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000025E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000244E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000024E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000235E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000023E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000226E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000022E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000218E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000213E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000021E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000204E1,TO_NEAREST] --> [3,3] --> OK [0.300000000000002E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000195E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000019E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000187E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000018E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000178E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000173E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000017E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000164E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000016E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000155E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000015E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000147E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000014E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000138E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000133E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000013E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000124E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000012E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000115E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000011E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000107E1,TO_NEAREST] --> [3,3] --> OK [0.300000000000001E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000098E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000093E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000009E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000084E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000008E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000075E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000007E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000067E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000006E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000058E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000053E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000005E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000044E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000004E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000036E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000003E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000027E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000002E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000018E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000013E1,TO_NEAREST] --> [3,3] --> OK [0.3000000000000001E1,TO_NEAREST] --> [3,3] --> OK [0.30000000000000004E1,TO_NEAREST] --> [3,3] --> OK [0.10737418239999924E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999925E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999926E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999927E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999928E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999993E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999931E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999932E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999933E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999934E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999936E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999937E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999938E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999939E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999994E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999942E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999943E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999944E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999945E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999946E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999948E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999949E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999995E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999951E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999952E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999954E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999955E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999956E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999957E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999958E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999996E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999961E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999962E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999963E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999964E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999965E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999967E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999968E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999969E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999997E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999971E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999973E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999974E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999975E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999976E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999977E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999979E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999998E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999981E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999982E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999983E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999985E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999986E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999987E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999988E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999989E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741823999999E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999992E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999993E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999994E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999995E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999996E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999998E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418239999999E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000153E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000015E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000148E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000145E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000143E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000014E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000138E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000136E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000134E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000013E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000129E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000126E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000124E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000122E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000012E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000117E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000114E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000112E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000011E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000107E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000105E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000103E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.107374182400001E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000098E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000095E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000093E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000009E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000088E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000086E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000083E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000008E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000079E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000076E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000074E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000072E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000007E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000067E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000064E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000062E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000006E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000057E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000055E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000052E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000005E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000048E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000045E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000043E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000004E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000038E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000036E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000033E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000003E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000029E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000026E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000024E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000021E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000002E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000017E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000014E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000012E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.1073741824000001E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000007E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000005E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.10737418240000002E10,TO_NEAREST] --> [1073741824,1073741824] --> OK [0.16106127359999847E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999985E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999852E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999855E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999857E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999986E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999862E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999864E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999866E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999987E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999871E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999874E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999876E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999878E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999988E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999883E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999886E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999888E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999989E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999893E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999895E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999897E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.161061273599999E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999902E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999905E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999907E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999991E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999912E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999914E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999917E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999992E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999921E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999924E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999926E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999928E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999993E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999933E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999936E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999938E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999994E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999943E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999945E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999948E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999995E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999952E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999955E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999957E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999996E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999962E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999964E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999967E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999997E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999971E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999974E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999976E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999979E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999998E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999983E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999986E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999988E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612735999999E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999993E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999995E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127359999998E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000153E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000015E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000148E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000145E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000143E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000014E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000138E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000136E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000134E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000013E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000129E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000126E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000124E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000122E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000012E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000117E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000114E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000112E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000011E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000107E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000105E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000103E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.161061273600001E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000098E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000095E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000093E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000009E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000088E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000086E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000083E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000008E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000079E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000076E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000074E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000072E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000007E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000067E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000064E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000062E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000006E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000057E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000055E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000052E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000005E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000048E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000045E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000043E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000004E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000038E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000036E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000033E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000003E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000029E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000026E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000024E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000021E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000002E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000017E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000014E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000012E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.1610612736000001E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000007E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000005E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.16106127360000002E10,TO_NEAREST] --> [1610612736,1610612736] --> OK [0.18790481919999847E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999985E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999852E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999855E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999857E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999986E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999862E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999864E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999866E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999987E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999871E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999874E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999876E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999878E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999988E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999883E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999886E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999888E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999989E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999893E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999895E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999897E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.187904819199999E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999902E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999905E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999907E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999991E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999912E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999914E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999917E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999992E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999921E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999924E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999926E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999928E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999993E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999933E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999936E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999938E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999994E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999943E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999945E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999948E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999995E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999952E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999955E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999957E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999996E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999962E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999964E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999967E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999997E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999971E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999974E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999976E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999979E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999998E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999983E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999986E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999988E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048191999999E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999993E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999995E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481919999998E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000153E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000015E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000148E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000145E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000143E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000014E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000138E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000136E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000134E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000013E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000129E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000126E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000124E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000122E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000012E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000117E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000114E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000112E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000011E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000107E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000105E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000103E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.187904819200001E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000098E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000095E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000093E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000009E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000088E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000086E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000083E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000008E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000079E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000076E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000074E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000072E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000007E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000067E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000064E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000062E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000006E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000057E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000055E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000052E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000005E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000048E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000045E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000043E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000004E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000038E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000036E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000033E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000003E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000029E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000026E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000024E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000021E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000002E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000017E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000014E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000012E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.1879048192000001E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000007E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000005E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.18790481920000002E10,TO_NEAREST] --> [1879048192,1879048192] --> OK [0.20132659199999847E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999985E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999852E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999855E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999857E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999986E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999862E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999864E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999866E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999987E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999871E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999874E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999876E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999878E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999988E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999883E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999886E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999888E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999989E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999893E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999895E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999897E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.201326591999999E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999902E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999905E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999907E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999991E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999912E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999914E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999917E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999992E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999921E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999924E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999926E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999928E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999993E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999933E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999936E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999938E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999994E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999943E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999945E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999948E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999995E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999952E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999955E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999957E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999996E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999962E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999964E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999967E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999997E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999971E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999974E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999976E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999979E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999998E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999983E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999986E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999988E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265919999999E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999993E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999995E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659199999998E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.201326592E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000153E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000015E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000148E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000145E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000143E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000014E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000138E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000136E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000134E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000013E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000129E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000126E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000124E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000122E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000012E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000117E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000114E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000112E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000011E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000107E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000105E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000103E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.201326592000001E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000098E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000095E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000093E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000009E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000088E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000086E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000083E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000008E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000079E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000076E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000074E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000072E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000007E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000067E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000064E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000062E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000006E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000057E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000055E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000052E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000005E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000048E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000045E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000043E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000004E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000038E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000036E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000033E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000003E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000029E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000026E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000024E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000021E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000002E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000017E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000014E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000012E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.2013265920000001E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000007E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000005E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20132659200000002E10,TO_NEAREST] --> [2013265920,2013265920] --> OK [0.20803747839999847E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999985E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999852E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999855E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999857E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999986E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999862E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999864E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999866E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999987E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999871E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999874E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999876E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999878E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999988E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999883E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999886E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999888E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999989E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999893E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999895E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999897E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.208037478399999E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999902E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999905E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999907E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999991E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999912E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999914E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999917E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999992E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999921E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999924E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999926E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999928E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999993E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999933E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999936E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999938E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999994E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999943E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999945E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999948E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999995E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999952E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999955E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999957E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999996E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999962E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999964E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999967E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999997E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999971E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999974E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999976E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999979E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999998E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999983E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999986E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999988E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374783999999E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999993E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999995E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747839999998E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000153E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000015E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000148E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000145E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000143E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000014E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000138E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000136E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000134E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000013E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000129E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000126E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000124E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000122E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000012E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000117E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000114E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000112E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000011E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000107E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000105E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000103E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.208037478400001E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000098E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000095E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000093E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000009E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000088E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000086E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000083E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000008E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000079E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000076E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000074E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000072E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000007E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000067E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000064E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000062E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000006E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000057E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000055E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000052E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000005E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000048E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000045E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000043E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000004E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000038E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000036E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000033E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000003E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000029E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000026E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000024E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000021E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000002E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000017E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000014E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000012E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.2080374784000001E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000007E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000005E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.20803747840000002E10,TO_NEAREST] --> [2080374784,2080374784] --> OK [0.21139292159999847E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999985E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999852E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999855E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999857E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999986E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999862E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999864E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999866E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999987E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999871E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999874E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999876E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999878E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999988E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999883E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999886E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999888E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999989E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999893E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999895E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999897E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.211392921599999E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999902E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999905E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999907E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999991E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999912E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999914E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999917E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999992E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999921E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999924E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999926E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999928E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999993E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999933E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999936E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999938E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999994E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999943E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999945E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999948E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999995E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999952E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999955E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999957E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999996E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999962E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999964E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999967E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999997E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999971E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999974E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999976E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999979E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999998E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999983E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999986E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999988E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929215999999E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999993E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999995E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292159999998E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000153E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000015E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000148E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000145E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000143E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000014E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000138E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000136E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000134E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000013E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000129E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000126E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000124E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000122E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000012E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000117E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000114E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000112E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000011E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000107E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000105E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000103E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.211392921600001E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000098E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000095E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000093E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000009E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000088E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000086E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000083E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000008E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000079E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000076E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000074E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000072E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000007E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000067E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000064E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000062E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000006E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000057E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000055E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000052E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000005E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000048E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000045E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000043E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000004E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000038E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000036E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000033E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000003E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000029E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000026E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000024E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000021E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000002E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000017E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000014E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000012E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.2113929216000001E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000007E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000005E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21139292160000002E10,TO_NEAREST] --> [2113929216,2113929216] --> OK [0.21474836439999847E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999985E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999852E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999855E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999857E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999986E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999862E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999864E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999866E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999987E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999871E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999874E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999876E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999878E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999988E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999883E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999886E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999888E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999989E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999893E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999895E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999897E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.214748364399999E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999902E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999905E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999907E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999991E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999912E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999914E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999917E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999992E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999921E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999924E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999926E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999928E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999993E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999933E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999936E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999938E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999994E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999943E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999945E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999948E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999995E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999952E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999955E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999957E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999996E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999962E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999964E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999967E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999997E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999971E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999974E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999976E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999979E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999998E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999983E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999986E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999988E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483643999999E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999993E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999995E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836439999998E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000153E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000015E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000148E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000145E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000143E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000014E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000138E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000136E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000134E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000013E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000129E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000126E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000124E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000122E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000012E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000117E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000114E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000112E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000011E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000107E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000105E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000103E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.214748364400001E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000098E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000095E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000093E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000009E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000088E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000086E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000083E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000008E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000079E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000076E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000074E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000072E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000007E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000067E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000064E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000062E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000006E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000057E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000055E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000052E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000005E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000048E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000045E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000043E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000004E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000038E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000036E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000033E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000003E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000029E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000026E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000024E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000021E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000002E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000017E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000014E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000012E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.2147483644000001E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000007E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000005E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836440000002E10,TO_NEAREST] --> [2147483644,2147483644] --> OK [0.21474836449999847E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999985E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999852E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999855E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999857E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999986E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999862E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999864E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999866E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999987E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999871E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999874E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999876E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999878E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999988E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999883E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999886E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999888E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999989E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999893E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999895E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999897E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.214748364499999E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999902E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999905E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999907E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999991E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999912E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999914E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999917E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999992E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999921E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999924E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999926E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999928E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999993E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999933E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999936E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999938E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999994E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999943E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999945E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999948E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999995E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999952E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999955E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999957E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999996E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999962E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999964E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999967E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999997E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999971E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999974E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999976E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999979E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999998E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999983E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999986E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999988E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483644999999E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999993E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999995E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836449999998E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000153E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000015E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000148E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000145E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000143E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000014E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000138E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000136E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000134E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000013E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000129E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000126E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000124E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000122E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000012E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000117E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000114E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000112E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000011E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000107E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000105E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000103E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.214748364500001E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000098E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000095E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000093E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000009E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000088E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000086E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000083E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000008E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000079E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000076E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000074E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000072E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000007E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000067E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000064E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000062E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000006E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000057E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000055E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000052E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000005E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000048E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000045E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000043E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000004E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000038E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000036E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000033E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000003E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000029E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000026E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000024E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000021E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000002E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000017E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000014E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000012E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.2147483645000001E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000007E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000005E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836450000002E10,TO_NEAREST] --> [2147483645,2147483645] --> OK [0.21474836459999847E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999985E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999852E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999855E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999857E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999986E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999862E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999864E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999866E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999987E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999871E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999874E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999876E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999878E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999988E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999883E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999886E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999888E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999989E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999893E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999895E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999897E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.214748364599999E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999902E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999905E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999907E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999991E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999912E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999914E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999917E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999992E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999921E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999924E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999926E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999928E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999993E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999933E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999936E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999938E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999994E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999943E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999945E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999948E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999995E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999952E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999955E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999957E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999996E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999962E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999964E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999967E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999997E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999971E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999974E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999976E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999979E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999998E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999983E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999986E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999988E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483645999999E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999993E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999995E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836459999998E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000153E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000015E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000148E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000145E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000143E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000014E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000138E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000136E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000134E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000013E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000129E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000126E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000124E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000122E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000012E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000117E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000114E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000112E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000011E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000107E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000105E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000103E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.214748364600001E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000098E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000095E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000093E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000009E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000088E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000086E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000083E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000008E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000079E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000076E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000074E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000072E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000007E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000067E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000064E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000062E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000006E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000057E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000055E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000052E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000005E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000048E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000045E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000043E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000004E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000038E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000036E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000033E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000003E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000029E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000026E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000024E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000021E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000002E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000017E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000014E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000012E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.2147483646000001E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000007E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000005E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836460000002E10,TO_NEAREST] --> [2147483646,2147483646] --> OK [0.21474836469999847E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999985E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999852E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999855E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999857E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999986E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999862E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999864E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999866E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999987E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999871E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999874E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999876E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999878E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999988E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999883E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999886E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999888E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999989E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999893E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999895E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999897E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.214748364699999E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999902E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999905E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999907E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999991E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999912E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999914E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999917E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999992E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999921E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999924E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999926E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999928E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999993E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999933E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999936E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999938E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999994E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999943E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999945E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999948E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999995E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999952E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999955E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999957E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999996E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999962E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999964E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999967E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999997E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999971E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999974E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999976E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999979E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999998E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999983E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999986E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999988E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483646999999E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999993E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999995E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836469999998E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000153E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000015E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000148E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000145E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000143E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000014E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000138E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000136E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000134E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000013E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000129E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000126E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000124E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000122E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000012E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000117E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000114E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000112E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000011E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000107E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000105E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000103E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.214748364700001E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000098E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000095E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000093E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000009E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000088E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000086E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000083E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000008E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000079E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000076E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000074E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000072E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000007E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000067E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000064E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000062E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000006E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000057E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000055E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000052E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000005E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000048E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000045E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000043E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000004E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000038E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000036E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000033E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000003E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000029E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000026E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000024E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000021E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000002E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000017E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000014E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000012E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.2147483647000001E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000007E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000005E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [0.21474836470000002E10,TO_NEAREST] --> [2147483647,2147483647] --> OK [~0.21474836480000305E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.214748364800003E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000296E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000029E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000286E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000028E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000277E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000027E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000267E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000026E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000257E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000253E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000025E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000243E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000024E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000234E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000023E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000224E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000022E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000215E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000021E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000205E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.214748364800002E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000196E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000019E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000186E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000018E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000176E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000017E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000167E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000016E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000157E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000153E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000015E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000143E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000014E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000134E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000013E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000124E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000012E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000114E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000011E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000105E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.214748364800001E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000095E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000009E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000086E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000008E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000076E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000007E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000067E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000006E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000057E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000052E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000005E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000043E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000004E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000033E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000003E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000024E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000002E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000014E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648000001E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.21474836480000005E10,TO_NEGINF] --> [Overflow,~2147483649] --> OK [~0.2147483648E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999847E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999985E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999852E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999855E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999857E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999986E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999862E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999864E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999866E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999987E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999871E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999874E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999876E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999878E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999988E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999883E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999886E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999888E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999989E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999893E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999895E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999897E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.214748364799999E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999902E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999905E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999907E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999991E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999912E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999914E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999917E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999992E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999921E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999924E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999926E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999928E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999993E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999933E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999936E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999938E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999994E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999943E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999945E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999948E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999995E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999952E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999955E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999957E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999996E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999962E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999964E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999967E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999997E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999971E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999974E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999976E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999979E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999998E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999983E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999986E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999988E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647999999E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999993E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999995E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999998E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000153E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000015E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000148E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000145E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000143E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000014E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000138E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000136E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000134E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000013E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000129E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000126E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000124E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000122E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000012E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000117E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000114E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000112E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000011E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000107E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000105E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000103E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.214748364700001E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000098E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000095E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000093E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000009E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000088E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000086E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000083E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000008E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000079E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000076E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000074E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000072E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000007E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000067E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000064E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000062E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000006E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000057E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000055E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000052E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000005E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000048E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000045E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000043E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000004E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000038E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000036E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000033E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000003E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000029E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000026E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000024E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000021E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000002E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000017E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000014E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000012E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647000001E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000007E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000005E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.21474836470000002E10,TO_NEGINF] --> [~2147483648,~2147483648] --> OK [~0.2147483647E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999847E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999985E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999852E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999855E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999857E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999986E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999862E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999864E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999866E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999987E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999871E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999874E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999876E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999878E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999988E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999883E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999886E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999888E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999989E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999893E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999895E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999897E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.214748364699999E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999902E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999905E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999907E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999991E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999912E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999914E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999917E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999992E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999921E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999924E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999926E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999928E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999993E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999933E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999936E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999938E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999994E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999943E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999945E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999948E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999995E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999952E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999955E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999957E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999996E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999962E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999964E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999967E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999997E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999971E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999974E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999976E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999979E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999998E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999983E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999986E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999988E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646999999E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999993E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999995E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999998E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000153E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000015E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000148E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000145E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000143E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000014E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000138E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000136E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000134E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000013E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000129E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000126E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000124E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000122E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000012E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000117E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000114E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000112E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000011E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000107E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000105E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000103E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.214748364600001E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000098E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000095E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000093E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000009E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000088E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000086E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000083E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000008E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000079E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000076E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000074E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000072E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000007E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000067E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000064E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000062E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000006E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000057E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000055E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000052E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000005E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000048E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000045E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000043E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000004E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000038E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000036E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000033E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000003E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000029E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000026E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000024E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000021E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000002E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000017E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000014E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000012E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646000001E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000007E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000005E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.21474836460000002E10,TO_NEGINF] --> [~2147483647,~2147483647] --> OK [~0.2147483646E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999847E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999985E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999852E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999855E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999857E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999986E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999862E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999864E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999866E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999987E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999871E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999874E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999876E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999878E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999988E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999883E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999886E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999888E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999989E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999893E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999895E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999897E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.214748364599999E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999902E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999905E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999907E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999991E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999912E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999914E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999917E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999992E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999921E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999924E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999926E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999928E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999993E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999933E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999936E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999938E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999994E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999943E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999945E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999948E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999995E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999952E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999955E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999957E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999996E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999962E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999964E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999967E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999997E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999971E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999974E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999976E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999979E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999998E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999983E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999986E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999988E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645999999E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999993E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999995E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999998E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000153E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000015E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000148E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000145E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000143E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000014E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000138E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000136E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000134E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000013E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000129E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000126E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000124E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000122E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000012E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000117E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000114E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000112E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000011E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000107E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000105E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000103E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.214748364500001E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000098E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000095E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000093E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000009E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000088E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000086E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000083E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000008E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000079E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000076E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000074E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000072E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000007E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000067E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000064E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000062E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000006E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000057E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000055E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000052E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000005E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000048E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000045E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000043E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000004E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000038E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000036E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000033E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000003E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000029E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000026E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000024E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000021E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000002E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000017E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000014E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000012E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645000001E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000007E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000005E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.21474836450000002E10,TO_NEGINF] --> [~2147483646,~2147483646] --> OK [~0.2147483645E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999847E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999985E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999852E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999855E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999857E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999986E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999862E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999864E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999866E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999987E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999871E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999874E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999876E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999878E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999988E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999883E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999886E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999888E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999989E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999893E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999895E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999897E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.214748364499999E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999902E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999905E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999907E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999991E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999912E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999914E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999917E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999992E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999921E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999924E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999926E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999928E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999993E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999933E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999936E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999938E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999994E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999943E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999945E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999948E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999995E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999952E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999955E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999957E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999996E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999962E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999964E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999967E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999997E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999971E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999974E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999976E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999979E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999998E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999983E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999986E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999988E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.2147483644999999E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999993E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999995E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999998E10,TO_NEGINF] --> [~2147483645,~2147483645] --> OK [~0.21139292170000153E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000015E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000148E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000145E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000143E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000014E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000138E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000136E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000134E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000013E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000129E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000126E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000124E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000122E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000012E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000117E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000114E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000112E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000011E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000107E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000105E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000103E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.211392921700001E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000098E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000095E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000093E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000009E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000088E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000086E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000083E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000008E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000079E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000076E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000074E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000072E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000007E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000067E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000064E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000062E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000006E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000057E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000055E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000052E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000005E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000048E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000045E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000043E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000004E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000038E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000036E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000033E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000003E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000029E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000026E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000024E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000021E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000002E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000017E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000014E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000012E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217000001E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000007E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000005E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.21139292170000002E10,TO_NEGINF] --> [~2113929218,~2113929218] --> OK [~0.2113929217E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999847E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999985E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999852E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999855E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999857E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999986E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999862E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999864E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999866E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999987E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999871E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999874E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999876E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999878E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999988E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999883E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999886E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999888E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999989E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999893E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999895E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999897E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.211392921699999E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999902E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999905E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999907E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999991E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999912E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999914E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999917E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999992E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999921E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999924E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999926E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999928E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999993E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999933E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999936E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999938E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999994E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999943E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999945E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999948E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999995E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999952E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999955E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999957E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999996E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999962E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999964E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999967E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999997E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999971E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999974E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999976E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999979E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999998E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999983E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999986E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999988E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.2113929216999999E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999993E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999995E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999998E10,TO_NEGINF] --> [~2113929217,~2113929217] --> OK [~0.20803747850000153E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000015E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000148E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000145E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000143E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000014E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000138E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000136E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000134E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000013E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000129E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000126E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000124E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000122E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000012E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000117E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000114E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000112E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000011E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000107E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000105E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000103E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.208037478500001E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000098E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000095E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000093E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000009E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000088E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000086E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000083E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000008E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000079E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000076E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000074E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000072E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000007E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000067E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000064E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000062E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000006E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000057E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000055E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000052E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000005E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000048E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000045E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000043E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000004E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000038E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000036E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000033E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000003E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000029E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000026E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000024E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000021E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000002E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000017E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000014E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000012E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785000001E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000007E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000005E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.20803747850000002E10,TO_NEGINF] --> [~2080374786,~2080374786] --> OK [~0.2080374785E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999847E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999985E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999852E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999855E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999857E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999986E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999862E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999864E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999866E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999987E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999871E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999874E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999876E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999878E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999988E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999883E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999886E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999888E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999989E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999893E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999895E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999897E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.208037478499999E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999902E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999905E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999907E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999991E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999912E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999914E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999917E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999992E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999921E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999924E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999926E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999928E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999993E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999933E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999936E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999938E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999994E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999943E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999945E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999948E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999995E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999952E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999955E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999957E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999996E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999962E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999964E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999967E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999997E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999971E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999974E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999976E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999979E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999998E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999983E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999986E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999988E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.2080374784999999E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999993E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999995E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999998E10,TO_NEGINF] --> [~2080374785,~2080374785] --> OK [~0.20132659210000153E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000015E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000148E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000145E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000143E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000014E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000138E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000136E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000134E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000013E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000129E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000126E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000124E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000122E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000012E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000117E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000114E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000112E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000011E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000107E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000105E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000103E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.201326592100001E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000098E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000095E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000093E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000009E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000088E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000086E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000083E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000008E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000079E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000076E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000074E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000072E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000007E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000067E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000064E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000062E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000006E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000057E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000055E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000052E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000005E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000048E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000045E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000043E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000004E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000038E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000036E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000033E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000003E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000029E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000026E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000024E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000021E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000002E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000017E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000014E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000012E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921000001E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000007E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000005E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.20132659210000002E10,TO_NEGINF] --> [~2013265922,~2013265922] --> OK [~0.2013265921E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999847E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999985E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999852E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999855E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999857E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999986E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999862E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999864E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999866E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999987E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999871E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999874E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999876E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999878E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999988E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999883E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999886E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999888E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999989E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999893E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999895E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999897E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.201326592099999E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999902E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999905E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999907E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999991E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999912E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999914E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999917E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999992E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999921E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999924E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999926E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999928E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999993E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999933E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999936E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999938E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999994E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999943E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999945E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999948E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999995E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999952E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999955E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999957E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999996E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999962E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999964E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999967E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999997E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999971E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999974E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999976E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999979E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999998E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999983E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999986E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999988E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.2013265920999999E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999993E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999995E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999998E10,TO_NEGINF] --> [~2013265921,~2013265921] --> OK [~0.18790481930000153E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000015E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000148E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000145E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000143E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000014E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000138E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000136E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000134E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000013E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000129E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000126E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000124E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000122E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000012E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000117E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000114E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000112E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000011E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000107E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000105E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000103E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.187904819300001E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000098E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000095E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000093E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000009E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000088E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000086E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000083E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000008E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000079E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000076E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000074E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000072E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000007E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000067E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000064E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000062E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000006E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000057E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000055E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000052E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000005E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000048E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000045E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000043E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000004E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000038E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000036E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000033E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000003E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000029E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000026E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000024E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000021E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000002E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000017E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000014E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000012E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193000001E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000007E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000005E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.18790481930000002E10,TO_NEGINF] --> [~1879048194,~1879048194] --> OK [~0.1879048193E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999847E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999985E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999852E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999855E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999857E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999986E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999862E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999864E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999866E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999987E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999871E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999874E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999876E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999878E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999988E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999883E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999886E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999888E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999989E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999893E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999895E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999897E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.187904819299999E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999902E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999905E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999907E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999991E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999912E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999914E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999917E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999992E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999921E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999924E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999926E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999928E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999993E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999933E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999936E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999938E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999994E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999943E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999945E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999948E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999995E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999952E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999955E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999957E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999996E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999962E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999964E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999967E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999997E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999971E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999974E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999976E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999979E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999998E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999983E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999986E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999988E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.1879048192999999E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999993E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999995E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999998E10,TO_NEGINF] --> [~1879048193,~1879048193] --> OK [~0.16106127370000153E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000015E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000148E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000145E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000143E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000014E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000138E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000136E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000134E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000013E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000129E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000126E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000124E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000122E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000012E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000117E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000114E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000112E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000011E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000107E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000105E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000103E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.161061273700001E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000098E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000095E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000093E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000009E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000088E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000086E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000083E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000008E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000079E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000076E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000074E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000072E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000007E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000067E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000064E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000062E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000006E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000057E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000055E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000052E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000005E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000048E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000045E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000043E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000004E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000038E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000036E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000033E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000003E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000029E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000026E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000024E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000021E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000002E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000017E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000014E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000012E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737000001E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000007E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000005E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.16106127370000002E10,TO_NEGINF] --> [~1610612738,~1610612738] --> OK [~0.1610612737E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999847E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999985E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999852E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999855E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999857E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999986E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999862E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999864E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999866E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999987E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999871E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999874E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999876E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999878E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999988E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999883E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999886E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999888E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999989E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999893E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999895E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999897E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.161061273699999E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999902E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999905E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999907E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999991E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999912E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999914E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999917E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999992E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999921E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999924E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999926E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999928E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999993E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999933E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999936E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999938E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999994E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999943E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999945E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999948E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999995E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999952E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999955E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999957E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999996E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999962E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999964E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999967E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999997E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999971E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999974E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999976E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999979E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999998E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999983E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999986E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999988E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.1610612736999999E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999993E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999995E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999998E10,TO_NEGINF] --> [~1610612737,~1610612737] --> OK [~0.10737418250000153E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000015E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000148E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000145E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000143E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000014E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000138E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000136E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000134E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000013E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000129E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000126E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000124E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000122E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000012E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000117E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000114E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000112E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000011E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000107E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000105E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000103E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.107374182500001E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000098E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000095E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000093E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000009E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000088E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000086E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000083E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000008E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000079E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000076E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000074E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000072E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000007E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000067E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000064E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000062E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000006E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000057E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000055E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000052E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000005E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000048E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000045E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000043E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000004E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000038E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000036E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000033E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000003E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000029E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000026E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000024E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000021E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000002E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000017E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000014E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000012E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825000001E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000007E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000005E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.10737418250000002E10,TO_NEGINF] --> [~1073741826,~1073741826] --> OK [~0.1073741825E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999847E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999985E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999852E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999855E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999857E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999986E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999862E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999864E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999866E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999987E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999871E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999874E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999876E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999878E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999988E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999883E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999886E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999888E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999989E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999893E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999895E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999897E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.107374182499999E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999902E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999905E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999907E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999991E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999912E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999914E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999917E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999992E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999921E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999924E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999926E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999928E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999993E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999933E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999936E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999938E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999994E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999943E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999945E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999948E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999995E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999952E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999955E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999957E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999996E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999962E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999964E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999967E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999997E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999971E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999974E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999976E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999979E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999998E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999983E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999986E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999988E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.1073741824999999E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999993E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999995E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999998E10,TO_NEGINF] --> [~1073741825,~1073741825] --> OK [~0.30000000000000284E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000028E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000275E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000027E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000266E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000026E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000258E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000253E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000025E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000244E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000024E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000235E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000023E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000226E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000022E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000218E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000213E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000021E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000204E1,TO_NEGINF] --> [~4,~4] --> OK [~0.300000000000002E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000195E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000019E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000187E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000018E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000178E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000173E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000017E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000164E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000016E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000155E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000015E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000147E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000014E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000138E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000133E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000013E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000124E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000012E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000115E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000011E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000107E1,TO_NEGINF] --> [~4,~4] --> OK [~0.300000000000001E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000098E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000093E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000009E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000084E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000008E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000075E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000007E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000067E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000006E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000058E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000053E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000005E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000044E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000004E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000036E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000003E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000027E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000002E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000018E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000013E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3000000000000001E1,TO_NEGINF] --> [~4,~4] --> OK [~0.30000000000000004E1,TO_NEGINF] --> [~4,~4] --> OK [~0.3E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999716E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999972E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999725E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999973E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999734E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999974E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999742E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999747E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999975E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999756E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999976E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999765E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999977E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999774E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999978E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999782E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999787E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999979E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999796E1,TO_NEGINF] --> [~3,~3] --> OK [~0.299999999999998E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999805E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999981E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999813E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999982E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999822E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999827E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999983E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999836E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999984E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999845E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999985E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999853E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999986E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999862E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999867E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999987E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999876E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999988E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999885E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999989E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999893E1,TO_NEGINF] --> [~3,~3] --> OK [~0.299999999999999E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999902E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999907E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999991E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999916E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999992E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999925E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999993E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999933E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999994E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999942E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999947E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999995E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999956E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999996E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999964E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999997E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999973E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999998E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999982E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999987E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2999999999999999E1,TO_NEGINF] --> [~3,~3] --> OK [~0.29999999999999996E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000284E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000028E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000275E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000027E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000266E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000026E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000258E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000253E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000025E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000244E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000024E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000235E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000023E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000226E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000022E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000218E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000213E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000021E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000204E1,TO_NEGINF] --> [~3,~3] --> OK [~0.200000000000002E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000195E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000019E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000187E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000018E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000178E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000173E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000017E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000164E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000016E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000155E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000015E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000147E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000014E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000138E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000133E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000013E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000124E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000012E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000115E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000011E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000107E1,TO_NEGINF] --> [~3,~3] --> OK [~0.200000000000001E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000098E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000093E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000009E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000084E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000008E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000075E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000007E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000067E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000006E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000058E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000053E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000005E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000044E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000004E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000036E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000003E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000027E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000002E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000018E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000013E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2000000000000001E1,TO_NEGINF] --> [~3,~3] --> OK [~0.20000000000000004E1,TO_NEGINF] --> [~3,~3] --> OK [~0.2E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999858E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999986E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999862E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999865E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999867E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999987E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999871E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999873E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999876E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999878E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999988E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999882E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999885E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999887E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999989E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999891E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999893E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999896E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999898E1,TO_NEGINF] --> [~2,~2] --> OK [~0.199999999999999E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999902E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999905E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999907E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999991E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999911E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999913E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999916E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999918E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999992E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999922E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999925E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999927E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999993E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999931E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999933E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999936E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999938E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999994E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999942E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999944E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999947E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999995E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999951E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999953E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999956E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999958E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999996E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999962E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999964E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999967E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999997E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999971E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999973E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999976E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999978E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999998E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999982E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999984E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999987E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1999999999999999E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999991E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999993E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999996E1,TO_NEGINF] --> [~2,~2] --> OK [~0.19999999999999998E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000142E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000014E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000138E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000135E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000133E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000013E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000129E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000127E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000124E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000122E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000012E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000118E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000115E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000113E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000011E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000109E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000107E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000104E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000102E1,TO_NEGINF] --> [~2,~2] --> OK [~0.100000000000001E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000098E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000095E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000093E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000009E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000089E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000087E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000084E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000082E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000008E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000078E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000075E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000073E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000007E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000069E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000067E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000064E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000062E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000006E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000058E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000056E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000053E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000005E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000049E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000047E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000044E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000042E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000004E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000038E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000036E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000033E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000003E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000029E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000027E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000024E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000022E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000002E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000018E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000016E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000013E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1000000000000001E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000009E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000007E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000004E1,TO_NEGINF] --> [~2,~2] --> OK [~0.10000000000000002E1,TO_NEGINF] --> [~2,~2] --> OK [~0.1E1,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999929,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999993,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999931,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999932,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999933,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999934,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999936,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999937,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999938,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999939,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999994,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999941,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999942,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999943,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999944,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999946,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999947,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999948,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999949,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999995,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999951,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999952,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999953,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999954,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999956,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999957,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999958,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999959,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999996,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999961,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999962,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999963,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999964,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999966,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999967,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999968,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999969,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999997,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999971,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999972,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999973,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999974,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999976,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999977,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999978,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999979,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999998,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999981,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999982,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999983,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999984,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999986,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999987,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999988,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999989,TO_NEGINF] --> [~1,~1] --> OK [~0.999999999999999,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999991,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999992,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999993,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999994,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999996,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999997,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999998,TO_NEGINF] --> [~1,~1] --> OK [~0.9999999999999999,TO_NEGINF] --> [~1,~1] --> OK [~0.316E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.31E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.306E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.3E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.296E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.29E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.287E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.28E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.277E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.27E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.267E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.26E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.257E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.25E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.247E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.24E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.237E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.23E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.227E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.22E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.217E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.21E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.208E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.203E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.2E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.193E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.19E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.183E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.18E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.173E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.17E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.163E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.16E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.153E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.15E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.143E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.14E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.133E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.13E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.124E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.12E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.114E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.11E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.104E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.1E~321,TO_NEGINF] --> [~1,~1] --> OK [~0.94E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.9E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.84E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.8E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.74E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.7E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.64E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.6E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.54E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.5E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.44E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.4E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.35E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.3E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.25E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.2E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.15E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.1E~322,TO_NEGINF] --> [~1,~1] --> OK [~0.5E~323,TO_NEGINF] --> [~1,~1] --> OK [0.0,TO_NEGINF] --> [0,0] --> OK [0.316E~321,TO_NEGINF] --> [0,0] --> OK [0.31E~321,TO_NEGINF] --> [0,0] --> OK [0.306E~321,TO_NEGINF] --> [0,0] --> OK [0.3E~321,TO_NEGINF] --> [0,0] --> OK [0.296E~321,TO_NEGINF] --> [0,0] --> OK [0.29E~321,TO_NEGINF] --> [0,0] --> OK [0.287E~321,TO_NEGINF] --> [0,0] --> OK [0.28E~321,TO_NEGINF] --> [0,0] --> OK [0.277E~321,TO_NEGINF] --> [0,0] --> OK [0.27E~321,TO_NEGINF] --> [0,0] --> OK [0.267E~321,TO_NEGINF] --> [0,0] --> OK [0.26E~321,TO_NEGINF] --> [0,0] --> OK [0.257E~321,TO_NEGINF] --> [0,0] --> OK [0.25E~321,TO_NEGINF] --> [0,0] --> OK [0.247E~321,TO_NEGINF] --> [0,0] --> OK [0.24E~321,TO_NEGINF] --> [0,0] --> OK [0.237E~321,TO_NEGINF] --> [0,0] --> OK [0.23E~321,TO_NEGINF] --> [0,0] --> OK [0.227E~321,TO_NEGINF] --> [0,0] --> OK [0.22E~321,TO_NEGINF] --> [0,0] --> OK [0.217E~321,TO_NEGINF] --> [0,0] --> OK [0.21E~321,TO_NEGINF] --> [0,0] --> OK [0.208E~321,TO_NEGINF] --> [0,0] --> OK [0.203E~321,TO_NEGINF] --> [0,0] --> OK [0.2E~321,TO_NEGINF] --> [0,0] --> OK [0.193E~321,TO_NEGINF] --> [0,0] --> OK [0.19E~321,TO_NEGINF] --> [0,0] --> OK [0.183E~321,TO_NEGINF] --> [0,0] --> OK [0.18E~321,TO_NEGINF] --> [0,0] --> OK [0.173E~321,TO_NEGINF] --> [0,0] --> OK [0.17E~321,TO_NEGINF] --> [0,0] --> OK [0.163E~321,TO_NEGINF] --> [0,0] --> OK [0.16E~321,TO_NEGINF] --> [0,0] --> OK [0.153E~321,TO_NEGINF] --> [0,0] --> OK [0.15E~321,TO_NEGINF] --> [0,0] --> OK [0.143E~321,TO_NEGINF] --> [0,0] --> OK [0.14E~321,TO_NEGINF] --> [0,0] --> OK [0.133E~321,TO_NEGINF] --> [0,0] --> OK [0.13E~321,TO_NEGINF] --> [0,0] --> OK [0.124E~321,TO_NEGINF] --> [0,0] --> OK [0.12E~321,TO_NEGINF] --> [0,0] --> OK [0.114E~321,TO_NEGINF] --> [0,0] --> OK [0.11E~321,TO_NEGINF] --> [0,0] --> OK [0.104E~321,TO_NEGINF] --> [0,0] --> OK [0.1E~321,TO_NEGINF] --> [0,0] --> OK [0.94E~322,TO_NEGINF] --> [0,0] --> OK [0.9E~322,TO_NEGINF] --> [0,0] --> OK [0.84E~322,TO_NEGINF] --> [0,0] --> OK [0.8E~322,TO_NEGINF] --> [0,0] --> OK [0.74E~322,TO_NEGINF] --> [0,0] --> OK [0.7E~322,TO_NEGINF] --> [0,0] --> OK [0.64E~322,TO_NEGINF] --> [0,0] --> OK [0.6E~322,TO_NEGINF] --> [0,0] --> OK [0.54E~322,TO_NEGINF] --> [0,0] --> OK [0.5E~322,TO_NEGINF] --> [0,0] --> OK [0.44E~322,TO_NEGINF] --> [0,0] --> OK [0.4E~322,TO_NEGINF] --> [0,0] --> OK [0.35E~322,TO_NEGINF] --> [0,0] --> OK [0.3E~322,TO_NEGINF] --> [0,0] --> OK [0.25E~322,TO_NEGINF] --> [0,0] --> OK [0.2E~322,TO_NEGINF] --> [0,0] --> OK [0.15E~322,TO_NEGINF] --> [0,0] --> OK [0.1E~322,TO_NEGINF] --> [0,0] --> OK [0.5E~323,TO_NEGINF] --> [0,0] --> OK [0.9999999999999929,TO_NEGINF] --> [0,0] --> OK [0.999999999999993,TO_NEGINF] --> [0,0] --> OK [0.9999999999999931,TO_NEGINF] --> [0,0] --> OK [0.9999999999999932,TO_NEGINF] --> [0,0] --> OK [0.9999999999999933,TO_NEGINF] --> [0,0] --> OK [0.9999999999999934,TO_NEGINF] --> [0,0] --> OK [0.9999999999999936,TO_NEGINF] --> [0,0] --> OK [0.9999999999999937,TO_NEGINF] --> [0,0] --> OK [0.9999999999999938,TO_NEGINF] --> [0,0] --> OK [0.9999999999999939,TO_NEGINF] --> [0,0] --> OK [0.999999999999994,TO_NEGINF] --> [0,0] --> OK [0.9999999999999941,TO_NEGINF] --> [0,0] --> OK [0.9999999999999942,TO_NEGINF] --> [0,0] --> OK [0.9999999999999943,TO_NEGINF] --> [0,0] --> OK [0.9999999999999944,TO_NEGINF] --> [0,0] --> OK [0.9999999999999946,TO_NEGINF] --> [0,0] --> OK [0.9999999999999947,TO_NEGINF] --> [0,0] --> OK [0.9999999999999948,TO_NEGINF] --> [0,0] --> OK [0.9999999999999949,TO_NEGINF] --> [0,0] --> OK [0.999999999999995,TO_NEGINF] --> [0,0] --> OK [0.9999999999999951,TO_NEGINF] --> [0,0] --> OK [0.9999999999999952,TO_NEGINF] --> [0,0] --> OK [0.9999999999999953,TO_NEGINF] --> [0,0] --> OK [0.9999999999999954,TO_NEGINF] --> [0,0] --> OK [0.9999999999999956,TO_NEGINF] --> [0,0] --> OK [0.9999999999999957,TO_NEGINF] --> [0,0] --> OK [0.9999999999999958,TO_NEGINF] --> [0,0] --> OK [0.9999999999999959,TO_NEGINF] --> [0,0] --> OK [0.999999999999996,TO_NEGINF] --> [0,0] --> OK [0.9999999999999961,TO_NEGINF] --> [0,0] --> OK [0.9999999999999962,TO_NEGINF] --> [0,0] --> OK [0.9999999999999963,TO_NEGINF] --> [0,0] --> OK [0.9999999999999964,TO_NEGINF] --> [0,0] --> OK [0.9999999999999966,TO_NEGINF] --> [0,0] --> OK [0.9999999999999967,TO_NEGINF] --> [0,0] --> OK [0.9999999999999968,TO_NEGINF] --> [0,0] --> OK [0.9999999999999969,TO_NEGINF] --> [0,0] --> OK [0.999999999999997,TO_NEGINF] --> [0,0] --> OK [0.9999999999999971,TO_NEGINF] --> [0,0] --> OK [0.9999999999999972,TO_NEGINF] --> [0,0] --> OK [0.9999999999999973,TO_NEGINF] --> [0,0] --> OK [0.9999999999999974,TO_NEGINF] --> [0,0] --> OK [0.9999999999999976,TO_NEGINF] --> [0,0] --> OK [0.9999999999999977,TO_NEGINF] --> [0,0] --> OK [0.9999999999999978,TO_NEGINF] --> [0,0] --> OK [0.9999999999999979,TO_NEGINF] --> [0,0] --> OK [0.999999999999998,TO_NEGINF] --> [0,0] --> OK [0.9999999999999981,TO_NEGINF] --> [0,0] --> OK [0.9999999999999982,TO_NEGINF] --> [0,0] --> OK [0.9999999999999983,TO_NEGINF] --> [0,0] --> OK [0.9999999999999984,TO_NEGINF] --> [0,0] --> OK [0.9999999999999986,TO_NEGINF] --> [0,0] --> OK [0.9999999999999987,TO_NEGINF] --> [0,0] --> OK [0.9999999999999988,TO_NEGINF] --> [0,0] --> OK [0.9999999999999989,TO_NEGINF] --> [0,0] --> OK [0.999999999999999,TO_NEGINF] --> [0,0] --> OK [0.9999999999999991,TO_NEGINF] --> [0,0] --> OK [0.9999999999999992,TO_NEGINF] --> [0,0] --> OK [0.9999999999999993,TO_NEGINF] --> [0,0] --> OK [0.9999999999999994,TO_NEGINF] --> [0,0] --> OK [0.9999999999999996,TO_NEGINF] --> [0,0] --> OK [0.9999999999999997,TO_NEGINF] --> [0,0] --> OK [0.9999999999999998,TO_NEGINF] --> [0,0] --> OK [0.9999999999999999,TO_NEGINF] --> [0,0] --> OK [0.1E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000142E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000014E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000138E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000135E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000133E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000013E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000129E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000127E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000124E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000122E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000012E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000118E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000115E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000113E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000011E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000109E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000107E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000104E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000102E1,TO_NEGINF] --> [1,1] --> OK [0.100000000000001E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000098E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000095E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000093E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000009E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000089E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000087E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000084E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000082E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000008E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000078E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000075E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000073E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000007E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000069E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000067E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000064E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000062E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000006E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000058E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000056E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000053E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000005E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000049E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000047E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000044E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000042E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000004E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000038E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000036E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000033E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000003E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000029E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000027E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000024E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000022E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000002E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000018E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000016E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000013E1,TO_NEGINF] --> [1,1] --> OK [0.1000000000000001E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000009E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000007E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000004E1,TO_NEGINF] --> [1,1] --> OK [0.10000000000000002E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999858E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999986E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999862E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999865E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999867E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999987E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999871E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999873E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999876E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999878E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999988E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999882E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999885E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999887E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999989E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999891E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999893E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999896E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999898E1,TO_NEGINF] --> [1,1] --> OK [0.199999999999999E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999902E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999905E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999907E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999991E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999911E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999913E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999916E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999918E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999992E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999922E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999925E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999927E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999993E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999931E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999933E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999936E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999938E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999994E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999942E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999944E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999947E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999995E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999951E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999953E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999956E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999958E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999996E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999962E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999964E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999967E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999997E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999971E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999973E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999976E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999978E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999998E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999982E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999984E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999987E1,TO_NEGINF] --> [1,1] --> OK [0.1999999999999999E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999991E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999993E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999996E1,TO_NEGINF] --> [1,1] --> OK [0.19999999999999998E1,TO_NEGINF] --> [1,1] --> OK [0.2E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000284E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000028E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000275E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000027E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000266E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000026E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000258E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000253E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000025E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000244E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000024E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000235E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000023E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000226E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000022E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000218E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000213E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000021E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000204E1,TO_NEGINF] --> [2,2] --> OK [0.200000000000002E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000195E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000019E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000187E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000018E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000178E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000173E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000017E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000164E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000016E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000155E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000015E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000147E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000014E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000138E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000133E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000013E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000124E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000012E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000115E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000011E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000107E1,TO_NEGINF] --> [2,2] --> OK [0.200000000000001E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000098E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000093E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000009E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000084E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000008E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000075E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000007E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000067E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000006E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000058E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000053E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000005E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000044E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000004E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000036E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000003E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000027E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000002E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000018E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000013E1,TO_NEGINF] --> [2,2] --> OK [0.2000000000000001E1,TO_NEGINF] --> [2,2] --> OK [0.20000000000000004E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999716E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999972E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999725E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999973E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999734E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999974E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999742E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999747E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999975E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999756E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999976E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999765E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999977E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999774E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999978E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999782E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999787E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999979E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999796E1,TO_NEGINF] --> [2,2] --> OK [0.299999999999998E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999805E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999981E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999813E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999982E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999822E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999827E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999983E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999836E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999984E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999845E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999985E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999853E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999986E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999862E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999867E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999987E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999876E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999988E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999885E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999989E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999893E1,TO_NEGINF] --> [2,2] --> OK [0.299999999999999E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999902E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999907E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999991E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999916E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999992E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999925E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999993E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999933E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999994E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999942E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999947E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999995E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999956E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999996E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999964E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999997E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999973E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999998E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999982E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999987E1,TO_NEGINF] --> [2,2] --> OK [0.2999999999999999E1,TO_NEGINF] --> [2,2] --> OK [0.29999999999999996E1,TO_NEGINF] --> [2,2] --> OK [0.3E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000284E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000028E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000275E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000027E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000266E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000026E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000258E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000253E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000025E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000244E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000024E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000235E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000023E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000226E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000022E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000218E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000213E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000021E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000204E1,TO_NEGINF] --> [3,3] --> OK [0.300000000000002E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000195E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000019E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000187E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000018E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000178E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000173E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000017E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000164E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000016E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000155E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000015E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000147E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000014E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000138E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000133E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000013E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000124E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000012E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000115E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000011E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000107E1,TO_NEGINF] --> [3,3] --> OK [0.300000000000001E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000098E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000093E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000009E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000084E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000008E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000075E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000007E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000067E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000006E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000058E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000053E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000005E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000044E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000004E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000036E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000003E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000027E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000002E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000018E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000013E1,TO_NEGINF] --> [3,3] --> OK [0.3000000000000001E1,TO_NEGINF] --> [3,3] --> OK [0.30000000000000004E1,TO_NEGINF] --> [3,3] --> OK [0.10737418239999924E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999925E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999926E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999927E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999928E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999993E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999931E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999932E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999933E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999934E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999936E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999937E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999938E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999939E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999994E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999942E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999943E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999944E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999945E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999946E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999948E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999949E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999995E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999951E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999952E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999954E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999955E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999956E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999957E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999958E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999996E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999961E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999962E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999963E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999964E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999965E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999967E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999968E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999969E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999997E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999971E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999973E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999974E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999975E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999976E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999977E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999979E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999998E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999981E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999982E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999983E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999985E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999986E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999987E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999988E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999989E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741823999999E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999992E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999993E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999994E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999995E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999996E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999998E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.10737418239999999E10,TO_NEGINF] --> [1073741823,1073741823] --> OK [0.1073741824E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000153E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000015E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000148E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000145E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000143E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000014E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000138E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000136E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000134E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000013E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000129E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000126E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000124E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000122E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000012E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000117E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000114E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000112E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000011E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000107E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000105E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000103E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.107374182400001E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000098E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000095E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000093E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000009E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000088E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000086E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000083E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000008E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000079E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000076E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000074E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000072E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000007E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000067E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000064E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000062E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000006E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000057E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000055E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000052E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000005E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000048E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000045E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000043E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000004E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000038E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000036E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000033E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000003E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000029E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000026E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000024E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000021E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000002E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000017E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000014E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000012E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.1073741824000001E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000007E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000005E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.10737418240000002E10,TO_NEGINF] --> [1073741824,1073741824] --> OK [0.16106127359999847E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999985E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999852E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999855E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999857E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999986E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999862E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999864E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999866E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999987E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999871E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999874E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999876E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999878E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999988E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999883E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999886E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999888E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999989E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999893E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999895E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999897E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.161061273599999E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999902E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999905E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999907E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999991E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999912E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999914E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999917E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999992E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999921E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999924E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999926E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999928E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999993E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999933E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999936E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999938E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999994E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999943E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999945E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999948E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999995E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999952E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999955E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999957E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999996E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999962E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999964E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999967E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999997E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999971E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999974E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999976E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999979E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999998E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999983E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999986E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999988E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612735999999E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999993E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999995E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.16106127359999998E10,TO_NEGINF] --> [1610612735,1610612735] --> OK [0.1610612736E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000153E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000015E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000148E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000145E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000143E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000014E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000138E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000136E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000134E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000013E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000129E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000126E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000124E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000122E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000012E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000117E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000114E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000112E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000011E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000107E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000105E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000103E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.161061273600001E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000098E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000095E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000093E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000009E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000088E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000086E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000083E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000008E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000079E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000076E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000074E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000072E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000007E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000067E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000064E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000062E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000006E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000057E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000055E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000052E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000005E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000048E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000045E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000043E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000004E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000038E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000036E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000033E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000003E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000029E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000026E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000024E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000021E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000002E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000017E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000014E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000012E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.1610612736000001E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000007E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000005E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.16106127360000002E10,TO_NEGINF] --> [1610612736,1610612736] --> OK [0.18790481919999847E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999985E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999852E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999855E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999857E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999986E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999862E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999864E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999866E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999987E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999871E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999874E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999876E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999878E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999988E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999883E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999886E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999888E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999989E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999893E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999895E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999897E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.187904819199999E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999902E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999905E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999907E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999991E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999912E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999914E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999917E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999992E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999921E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999924E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999926E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999928E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999993E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999933E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999936E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999938E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999994E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999943E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999945E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999948E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999995E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999952E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999955E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999957E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999996E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999962E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999964E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999967E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999997E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999971E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999974E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999976E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999979E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999998E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999983E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999986E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999988E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048191999999E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999993E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999995E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.18790481919999998E10,TO_NEGINF] --> [1879048191,1879048191] --> OK [0.1879048192E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000153E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000015E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000148E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000145E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000143E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000014E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000138E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000136E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000134E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000013E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000129E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000126E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000124E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000122E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000012E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000117E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000114E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000112E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000011E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000107E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000105E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000103E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.187904819200001E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000098E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000095E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000093E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000009E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000088E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000086E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000083E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000008E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000079E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000076E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000074E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000072E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000007E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000067E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000064E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000062E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000006E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000057E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000055E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000052E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000005E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000048E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000045E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000043E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000004E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000038E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000036E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000033E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000003E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000029E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000026E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000024E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000021E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000002E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000017E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000014E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000012E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.1879048192000001E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000007E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000005E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.18790481920000002E10,TO_NEGINF] --> [1879048192,1879048192] --> OK [0.20132659199999847E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999985E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999852E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999855E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999857E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999986E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999862E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999864E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999866E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999987E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999871E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999874E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999876E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999878E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999988E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999883E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999886E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999888E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999989E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999893E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999895E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999897E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.201326591999999E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999902E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999905E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999907E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999991E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999912E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999914E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999917E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999992E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999921E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999924E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999926E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999928E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999993E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999933E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999936E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999938E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999994E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999943E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999945E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999948E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999995E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999952E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999955E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999957E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999996E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999962E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999964E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999967E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999997E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999971E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999974E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999976E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999979E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999998E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999983E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999986E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999988E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.2013265919999999E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999993E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999995E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.20132659199999998E10,TO_NEGINF] --> [2013265919,2013265919] --> OK [0.201326592E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000153E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000015E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000148E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000145E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000143E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000014E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000138E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000136E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000134E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000013E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000129E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000126E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000124E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000122E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000012E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000117E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000114E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000112E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000011E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000107E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000105E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000103E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.201326592000001E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000098E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000095E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000093E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000009E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000088E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000086E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000083E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000008E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000079E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000076E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000074E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000072E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000007E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000067E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000064E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000062E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000006E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000057E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000055E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000052E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000005E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000048E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000045E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000043E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000004E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000038E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000036E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000033E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000003E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000029E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000026E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000024E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000021E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000002E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000017E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000014E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000012E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.2013265920000001E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000007E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000005E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20132659200000002E10,TO_NEGINF] --> [2013265920,2013265920] --> OK [0.20803747839999847E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999985E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999852E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999855E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999857E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999986E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999862E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999864E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999866E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999987E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999871E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999874E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999876E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999878E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999988E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999883E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999886E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999888E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999989E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999893E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999895E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999897E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.208037478399999E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999902E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999905E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999907E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999991E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999912E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999914E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999917E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999992E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999921E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999924E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999926E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999928E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999993E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999933E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999936E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999938E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999994E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999943E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999945E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999948E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999995E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999952E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999955E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999957E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999996E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999962E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999964E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999967E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999997E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999971E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999974E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999976E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999979E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999998E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999983E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999986E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999988E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374783999999E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999993E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999995E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.20803747839999998E10,TO_NEGINF] --> [2080374783,2080374783] --> OK [0.2080374784E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000153E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000015E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000148E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000145E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000143E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000014E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000138E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000136E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000134E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000013E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000129E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000126E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000124E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000122E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000012E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000117E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000114E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000112E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000011E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000107E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000105E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000103E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.208037478400001E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000098E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000095E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000093E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000009E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000088E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000086E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000083E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000008E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000079E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000076E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000074E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000072E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000007E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000067E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000064E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000062E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000006E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000057E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000055E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000052E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000005E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000048E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000045E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000043E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000004E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000038E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000036E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000033E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000003E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000029E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000026E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000024E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000021E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000002E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000017E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000014E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000012E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.2080374784000001E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000007E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000005E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.20803747840000002E10,TO_NEGINF] --> [2080374784,2080374784] --> OK [0.21139292159999847E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999985E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999852E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999855E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999857E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999986E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999862E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999864E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999866E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999987E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999871E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999874E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999876E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999878E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999988E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999883E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999886E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999888E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999989E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999893E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999895E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999897E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.211392921599999E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999902E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999905E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999907E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999991E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999912E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999914E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999917E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999992E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999921E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999924E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999926E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999928E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999993E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999933E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999936E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999938E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999994E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999943E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999945E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999948E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999995E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999952E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999955E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999957E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999996E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999962E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999964E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999967E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999997E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999971E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999974E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999976E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999979E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999998E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999983E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999986E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999988E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929215999999E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999993E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999995E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.21139292159999998E10,TO_NEGINF] --> [2113929215,2113929215] --> OK [0.2113929216E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000153E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000015E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000148E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000145E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000143E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000014E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000138E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000136E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000134E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000013E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000129E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000126E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000124E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000122E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000012E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000117E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000114E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000112E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000011E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000107E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000105E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000103E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.211392921600001E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000098E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000095E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000093E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000009E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000088E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000086E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000083E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000008E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000079E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000076E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000074E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000072E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000007E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000067E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000064E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000062E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000006E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000057E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000055E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000052E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000005E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000048E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000045E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000043E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000004E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000038E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000036E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000033E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000003E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000029E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000026E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000024E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000021E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000002E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000017E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000014E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000012E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.2113929216000001E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000007E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000005E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21139292160000002E10,TO_NEGINF] --> [2113929216,2113929216] --> OK [0.21474836439999847E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999985E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999852E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999855E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999857E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999986E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999862E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999864E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999866E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999987E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999871E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999874E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999876E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999878E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999988E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999883E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999886E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999888E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999989E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999893E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999895E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999897E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.214748364399999E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999902E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999905E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999907E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999991E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999912E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999914E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999917E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999992E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999921E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999924E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999926E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999928E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999993E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999933E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999936E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999938E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999994E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999943E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999945E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999948E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999995E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999952E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999955E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999957E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999996E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999962E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999964E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999967E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999997E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999971E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999974E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999976E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999979E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999998E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999983E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999986E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999988E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483643999999E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999993E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999995E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.21474836439999998E10,TO_NEGINF] --> [2147483643,2147483643] --> OK [0.2147483644E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000153E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000015E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000148E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000145E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000143E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000014E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000138E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000136E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000134E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000013E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000129E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000126E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000124E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000122E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000012E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000117E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000114E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000112E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000011E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000107E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000105E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000103E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.214748364400001E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000098E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000095E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000093E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000009E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000088E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000086E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000083E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000008E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000079E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000076E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000074E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000072E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000007E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000067E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000064E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000062E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000006E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000057E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000055E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000052E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000005E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000048E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000045E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000043E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000004E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000038E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000036E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000033E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000003E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000029E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000026E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000024E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000021E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000002E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000017E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000014E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000012E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644000001E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000007E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000005E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836440000002E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999847E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999985E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999852E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999855E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999857E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999986E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999862E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999864E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999866E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999987E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999871E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999874E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999876E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999878E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999988E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999883E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999886E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999888E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999989E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999893E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999895E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999897E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.214748364499999E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999902E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999905E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999907E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999991E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999912E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999914E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999917E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999992E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999921E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999924E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999926E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999928E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999993E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999933E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999936E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999938E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999994E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999943E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999945E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999948E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999995E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999952E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999955E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999957E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999996E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999962E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999964E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999967E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999997E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999971E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999974E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999976E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999979E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999998E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999983E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999986E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999988E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483644999999E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999993E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999995E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.21474836449999998E10,TO_NEGINF] --> [2147483644,2147483644] --> OK [0.2147483645E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000153E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000015E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000148E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000145E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000143E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000014E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000138E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000136E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000134E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000013E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000129E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000126E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000124E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000122E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000012E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000117E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000114E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000112E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000011E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000107E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000105E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000103E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.214748364500001E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000098E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000095E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000093E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000009E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000088E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000086E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000083E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000008E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000079E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000076E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000074E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000072E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000007E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000067E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000064E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000062E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000006E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000057E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000055E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000052E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000005E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000048E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000045E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000043E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000004E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000038E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000036E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000033E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000003E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000029E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000026E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000024E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000021E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000002E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000017E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000014E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000012E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645000001E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000007E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000005E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836450000002E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999847E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999985E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999852E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999855E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999857E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999986E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999862E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999864E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999866E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999987E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999871E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999874E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999876E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999878E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999988E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999883E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999886E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999888E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999989E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999893E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999895E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999897E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.214748364599999E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999902E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999905E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999907E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999991E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999912E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999914E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999917E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999992E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999921E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999924E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999926E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999928E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999993E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999933E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999936E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999938E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999994E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999943E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999945E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999948E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999995E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999952E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999955E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999957E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999996E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999962E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999964E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999967E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999997E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999971E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999974E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999976E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999979E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999998E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999983E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999986E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999988E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483645999999E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999993E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999995E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.21474836459999998E10,TO_NEGINF] --> [2147483645,2147483645] --> OK [0.2147483646E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000153E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000015E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000148E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000145E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000143E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000014E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000138E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000136E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000134E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000013E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000129E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000126E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000124E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000122E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000012E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000117E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000114E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000112E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000011E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000107E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000105E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000103E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.214748364600001E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000098E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000095E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000093E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000009E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000088E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000086E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000083E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000008E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000079E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000076E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000074E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000072E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000007E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000067E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000064E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000062E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000006E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000057E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000055E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000052E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000005E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000048E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000045E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000043E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000004E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000038E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000036E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000033E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000003E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000029E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000026E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000024E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000021E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000002E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000017E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000014E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000012E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646000001E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000007E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000005E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836460000002E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999847E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999985E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999852E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999855E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999857E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999986E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999862E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999864E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999866E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999987E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999871E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999874E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999876E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999878E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999988E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999883E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999886E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999888E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999989E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999893E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999895E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999897E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.214748364699999E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999902E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999905E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999907E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999991E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999912E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999914E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999917E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999992E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999921E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999924E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999926E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999928E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999993E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999933E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999936E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999938E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999994E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999943E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999945E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999948E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999995E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999952E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999955E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999957E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999996E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999962E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999964E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999967E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999997E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999971E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999974E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999976E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999979E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999998E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999983E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999986E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999988E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483646999999E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999993E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999995E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.21474836469999998E10,TO_NEGINF] --> [2147483646,2147483646] --> OK [0.2147483647E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000153E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000015E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000148E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000145E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000143E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000014E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000138E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000136E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000134E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000013E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000129E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000126E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000124E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000122E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000012E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000117E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000114E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000112E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000011E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000107E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000105E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000103E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.214748364700001E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000098E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000095E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000093E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000009E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000088E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000086E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000083E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000008E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000079E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000076E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000074E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000072E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000007E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000067E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000064E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000062E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000006E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000057E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000055E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000052E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000005E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000048E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000045E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000043E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000004E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000038E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000036E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000033E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000003E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000029E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000026E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000024E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000021E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000002E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000017E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000014E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000012E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.2147483647000001E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000007E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000005E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [0.21474836470000002E10,TO_NEGINF] --> [2147483647,2147483647] --> OK [~0.21474836480000305E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.214748364800003E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000296E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000029E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000286E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000028E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000277E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000027E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000267E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000026E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000257E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000253E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000025E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000243E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000024E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000234E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000023E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000224E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000022E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000215E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000021E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000205E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.214748364800002E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000196E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000019E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000186E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000018E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000176E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000017E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000167E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000016E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000157E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000153E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000015E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000143E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000014E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000134E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000013E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000124E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000012E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000114E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000011E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000105E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.214748364800001E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000095E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000009E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000086E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000008E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000076E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000007E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000067E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000006E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000057E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000052E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000005E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000043E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000004E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000033E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000003E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000024E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000002E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000014E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648000001E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836480000005E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.2147483648E10,TO_POSINF] --> [~2147483648,~2147483648] --> OK [~0.21474836479999847E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999985E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999852E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999855E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999857E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999986E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999862E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999864E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999866E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999987E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999871E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999874E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999876E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999878E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999988E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999883E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999886E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999888E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999989E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999893E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999895E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999897E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.214748364799999E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999902E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999905E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999907E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999991E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999912E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999914E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999917E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999992E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999921E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999924E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999926E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999928E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999993E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999933E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999936E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999938E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999994E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999943E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999945E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999948E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999995E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999952E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999955E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999957E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999996E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999962E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999964E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999967E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999997E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999971E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999974E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999976E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999979E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999998E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999983E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999986E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999988E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647999999E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999993E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999995E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836479999998E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000153E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000015E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000148E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000145E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000143E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000014E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000138E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000136E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000134E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000013E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000129E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000126E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000124E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000122E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000012E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000117E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000114E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000112E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000011E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000107E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000105E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000103E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.214748364700001E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000098E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000095E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000093E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000009E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000088E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000086E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000083E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000008E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000079E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000076E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000074E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000072E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000007E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000067E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000064E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000062E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000006E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000057E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000055E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000052E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000005E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000048E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000045E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000043E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000004E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000038E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000036E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000033E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000003E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000029E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000026E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000024E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000021E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000002E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000017E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000014E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000012E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647000001E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000007E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000005E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836470000002E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.2147483647E10,TO_POSINF] --> [~2147483647,~2147483647] --> OK [~0.21474836469999847E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999985E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999852E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999855E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999857E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999986E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999862E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999864E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999866E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999987E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999871E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999874E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999876E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999878E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999988E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999883E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999886E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999888E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999989E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999893E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999895E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999897E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.214748364699999E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999902E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999905E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999907E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999991E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999912E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999914E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999917E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999992E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999921E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999924E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999926E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999928E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999993E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999933E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999936E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999938E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999994E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999943E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999945E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999948E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999995E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999952E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999955E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999957E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999996E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999962E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999964E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999967E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999997E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999971E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999974E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999976E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999979E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999998E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999983E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999986E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999988E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646999999E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999993E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999995E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836469999998E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000153E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000015E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000148E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000145E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000143E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000014E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000138E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000136E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000134E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000013E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000129E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000126E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000124E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000122E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000012E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000117E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000114E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000112E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000011E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000107E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000105E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000103E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.214748364600001E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000098E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000095E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000093E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000009E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000088E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000086E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000083E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000008E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000079E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000076E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000074E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000072E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000007E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000067E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000064E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000062E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000006E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000057E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000055E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000052E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000005E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000048E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000045E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000043E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000004E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000038E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000036E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000033E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000003E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000029E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000026E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000024E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000021E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000002E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000017E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000014E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000012E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646000001E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000007E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000005E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836460000002E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.2147483646E10,TO_POSINF] --> [~2147483646,~2147483646] --> OK [~0.21474836459999847E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999985E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999852E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999855E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999857E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999986E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999862E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999864E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999866E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999987E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999871E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999874E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999876E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999878E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999988E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999883E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999886E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999888E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999989E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999893E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999895E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999897E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.214748364599999E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999902E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999905E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999907E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999991E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999912E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999914E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999917E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999992E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999921E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999924E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999926E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999928E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999993E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999933E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999936E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999938E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999994E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999943E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999945E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999948E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999995E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999952E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999955E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999957E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999996E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999962E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999964E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999967E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999997E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999971E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999974E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999976E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999979E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999998E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999983E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999986E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999988E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645999999E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999993E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999995E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836459999998E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000153E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000015E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000148E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000145E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000143E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000014E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000138E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000136E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000134E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000013E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000129E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000126E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000124E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000122E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000012E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000117E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000114E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000112E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000011E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000107E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000105E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000103E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.214748364500001E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000098E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000095E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000093E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000009E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000088E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000086E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000083E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000008E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000079E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000076E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000074E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000072E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000007E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000067E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000064E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000062E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000006E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000057E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000055E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000052E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000005E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000048E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000045E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000043E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000004E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000038E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000036E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000033E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000003E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000029E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000026E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000024E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000021E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000002E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000017E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000014E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000012E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645000001E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000007E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000005E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836450000002E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.2147483645E10,TO_POSINF] --> [~2147483645,~2147483645] --> OK [~0.21474836449999847E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999985E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999852E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999855E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999857E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999986E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999862E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999864E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999866E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999987E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999871E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999874E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999876E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999878E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999988E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999883E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999886E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999888E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999989E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999893E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999895E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999897E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.214748364499999E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999902E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999905E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999907E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999991E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999912E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999914E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999917E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999992E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999921E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999924E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999926E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999928E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999993E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999933E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999936E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999938E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999994E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999943E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999945E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999948E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999995E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999952E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999955E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999957E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999996E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999962E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999964E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999967E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999997E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999971E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999974E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999976E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999979E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999998E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999983E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999986E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999988E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.2147483644999999E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999993E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999995E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21474836449999998E10,TO_POSINF] --> [~2147483644,~2147483644] --> OK [~0.21139292170000153E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000015E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000148E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000145E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000143E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000014E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000138E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000136E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000134E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000013E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000129E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000126E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000124E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000122E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000012E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000117E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000114E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000112E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000011E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000107E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000105E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000103E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.211392921700001E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000098E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000095E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000093E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000009E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000088E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000086E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000083E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000008E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000079E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000076E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000074E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000072E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000007E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000067E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000064E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000062E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000006E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000057E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000055E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000052E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000005E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000048E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000045E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000043E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000004E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000038E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000036E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000033E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000003E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000029E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000026E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000024E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000021E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000002E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000017E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000014E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000012E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217000001E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000007E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000005E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292170000002E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.2113929217E10,TO_POSINF] --> [~2113929217,~2113929217] --> OK [~0.21139292169999847E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999985E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999852E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999855E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999857E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999986E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999862E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999864E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999866E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999987E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999871E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999874E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999876E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999878E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999988E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999883E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999886E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999888E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999989E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999893E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999895E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999897E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.211392921699999E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999902E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999905E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999907E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999991E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999912E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999914E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999917E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999992E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999921E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999924E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999926E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999928E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999993E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999933E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999936E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999938E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999994E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999943E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999945E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999948E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999995E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999952E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999955E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999957E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999996E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999962E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999964E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999967E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999997E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999971E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999974E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999976E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999979E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999998E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999983E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999986E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999988E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.2113929216999999E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999993E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999995E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.21139292169999998E10,TO_POSINF] --> [~2113929216,~2113929216] --> OK [~0.20803747850000153E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000015E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000148E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000145E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000143E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000014E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000138E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000136E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000134E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000013E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000129E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000126E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000124E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000122E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000012E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000117E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000114E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000112E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000011E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000107E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000105E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000103E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.208037478500001E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000098E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000095E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000093E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000009E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000088E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000086E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000083E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000008E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000079E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000076E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000074E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000072E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000007E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000067E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000064E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000062E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000006E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000057E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000055E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000052E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000005E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000048E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000045E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000043E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000004E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000038E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000036E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000033E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000003E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000029E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000026E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000024E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000021E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000002E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000017E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000014E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000012E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785000001E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000007E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000005E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747850000002E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.2080374785E10,TO_POSINF] --> [~2080374785,~2080374785] --> OK [~0.20803747849999847E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999985E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999852E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999855E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999857E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999986E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999862E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999864E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999866E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999987E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999871E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999874E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999876E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999878E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999988E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999883E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999886E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999888E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999989E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999893E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999895E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999897E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.208037478499999E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999902E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999905E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999907E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999991E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999912E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999914E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999917E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999992E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999921E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999924E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999926E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999928E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999993E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999933E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999936E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999938E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999994E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999943E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999945E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999948E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999995E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999952E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999955E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999957E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999996E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999962E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999964E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999967E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999997E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999971E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999974E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999976E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999979E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999998E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999983E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999986E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999988E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.2080374784999999E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999993E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999995E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20803747849999998E10,TO_POSINF] --> [~2080374784,~2080374784] --> OK [~0.20132659210000153E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000015E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000148E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000145E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000143E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000014E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000138E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000136E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000134E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000013E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000129E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000126E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000124E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000122E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000012E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000117E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000114E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000112E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000011E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000107E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000105E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000103E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.201326592100001E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000098E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000095E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000093E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000009E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000088E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000086E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000083E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000008E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000079E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000076E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000074E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000072E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000007E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000067E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000064E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000062E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000006E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000057E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000055E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000052E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000005E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000048E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000045E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000043E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000004E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000038E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000036E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000033E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000003E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000029E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000026E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000024E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000021E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000002E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000017E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000014E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000012E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921000001E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000007E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000005E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659210000002E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.2013265921E10,TO_POSINF] --> [~2013265921,~2013265921] --> OK [~0.20132659209999847E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999985E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999852E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999855E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999857E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999986E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999862E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999864E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999866E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999987E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999871E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999874E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999876E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999878E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999988E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999883E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999886E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999888E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999989E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999893E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999895E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999897E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.201326592099999E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999902E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999905E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999907E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999991E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999912E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999914E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999917E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999992E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999921E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999924E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999926E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999928E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999993E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999933E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999936E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999938E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999994E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999943E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999945E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999948E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999995E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999952E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999955E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999957E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999996E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999962E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999964E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999967E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999997E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999971E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999974E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999976E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999979E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999998E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999983E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999986E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999988E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.2013265920999999E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999993E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999995E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.20132659209999998E10,TO_POSINF] --> [~2013265920,~2013265920] --> OK [~0.18790481930000153E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000015E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000148E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000145E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000143E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000014E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000138E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000136E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000134E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000013E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000129E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000126E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000124E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000122E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000012E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000117E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000114E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000112E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000011E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000107E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000105E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000103E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.187904819300001E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000098E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000095E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000093E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000009E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000088E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000086E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000083E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000008E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000079E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000076E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000074E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000072E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000007E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000067E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000064E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000062E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000006E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000057E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000055E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000052E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000005E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000048E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000045E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000043E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000004E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000038E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000036E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000033E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000003E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000029E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000026E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000024E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000021E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000002E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000017E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000014E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000012E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193000001E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000007E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000005E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481930000002E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.1879048193E10,TO_POSINF] --> [~1879048193,~1879048193] --> OK [~0.18790481929999847E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999985E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999852E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999855E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999857E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999986E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999862E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999864E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999866E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999987E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999871E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999874E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999876E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999878E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999988E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999883E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999886E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999888E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999989E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999893E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999895E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999897E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.187904819299999E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999902E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999905E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999907E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999991E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999912E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999914E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999917E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999992E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999921E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999924E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999926E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999928E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999993E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999933E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999936E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999938E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999994E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999943E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999945E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999948E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999995E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999952E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999955E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999957E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999996E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999962E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999964E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999967E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999997E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999971E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999974E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999976E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999979E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999998E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999983E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999986E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999988E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.1879048192999999E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999993E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999995E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.18790481929999998E10,TO_POSINF] --> [~1879048192,~1879048192] --> OK [~0.16106127370000153E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000015E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000148E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000145E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000143E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000014E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000138E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000136E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000134E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000013E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000129E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000126E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000124E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000122E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000012E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000117E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000114E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000112E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000011E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000107E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000105E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000103E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.161061273700001E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000098E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000095E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000093E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000009E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000088E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000086E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000083E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000008E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000079E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000076E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000074E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000072E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000007E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000067E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000064E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000062E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000006E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000057E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000055E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000052E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000005E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000048E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000045E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000043E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000004E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000038E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000036E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000033E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000003E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000029E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000026E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000024E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000021E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000002E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000017E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000014E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000012E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737000001E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000007E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000005E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127370000002E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.1610612737E10,TO_POSINF] --> [~1610612737,~1610612737] --> OK [~0.16106127369999847E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999985E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999852E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999855E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999857E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999986E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999862E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999864E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999866E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999987E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999871E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999874E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999876E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999878E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999988E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999883E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999886E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999888E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999989E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999893E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999895E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999897E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.161061273699999E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999902E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999905E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999907E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999991E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999912E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999914E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999917E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999992E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999921E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999924E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999926E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999928E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999993E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999933E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999936E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999938E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999994E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999943E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999945E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999948E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999995E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999952E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999955E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999957E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999996E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999962E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999964E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999967E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999997E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999971E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999974E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999976E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999979E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999998E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999983E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999986E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999988E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.1610612736999999E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999993E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999995E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.16106127369999998E10,TO_POSINF] --> [~1610612736,~1610612736] --> OK [~0.10737418250000153E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000015E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000148E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000145E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000143E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000014E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000138E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000136E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000134E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000013E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000129E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000126E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000124E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000122E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000012E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000117E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000114E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000112E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000011E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000107E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000105E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000103E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.107374182500001E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000098E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000095E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000093E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000009E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000088E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000086E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000083E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000008E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000079E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000076E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000074E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000072E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000007E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000067E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000064E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000062E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000006E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000057E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000055E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000052E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000005E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000048E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000045E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000043E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000004E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000038E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000036E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000033E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000003E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000029E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000026E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000024E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000021E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000002E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000017E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000014E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000012E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825000001E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000007E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000005E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418250000002E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.1073741825E10,TO_POSINF] --> [~1073741825,~1073741825] --> OK [~0.10737418249999847E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999985E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999852E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999855E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999857E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999986E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999862E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999864E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999866E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999987E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999871E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999874E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999876E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999878E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999988E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999883E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999886E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999888E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999989E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999893E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999895E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999897E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.107374182499999E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999902E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999905E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999907E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999991E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999912E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999914E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999917E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999992E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999921E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999924E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999926E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999928E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999993E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999933E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999936E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999938E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999994E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999943E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999945E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999948E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999995E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999952E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999955E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999957E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999996E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999962E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999964E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999967E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999997E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999971E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999974E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999976E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999979E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999998E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999983E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999986E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999988E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.1073741824999999E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999993E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999995E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.10737418249999998E10,TO_POSINF] --> [~1073741824,~1073741824] --> OK [~0.30000000000000284E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000028E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000275E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000027E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000266E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000026E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000258E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000253E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000025E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000244E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000024E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000235E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000023E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000226E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000022E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000218E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000213E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000021E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000204E1,TO_POSINF] --> [~3,~3] --> OK [~0.300000000000002E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000195E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000019E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000187E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000018E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000178E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000173E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000017E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000164E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000016E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000155E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000015E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000147E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000014E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000138E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000133E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000013E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000124E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000012E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000115E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000011E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000107E1,TO_POSINF] --> [~3,~3] --> OK [~0.300000000000001E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000098E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000093E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000009E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000084E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000008E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000075E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000007E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000067E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000006E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000058E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000053E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000005E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000044E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000004E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000036E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000003E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000027E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000002E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000018E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000013E1,TO_POSINF] --> [~3,~3] --> OK [~0.3000000000000001E1,TO_POSINF] --> [~3,~3] --> OK [~0.30000000000000004E1,TO_POSINF] --> [~3,~3] --> OK [~0.3E1,TO_POSINF] --> [~3,~3] --> OK [~0.29999999999999716E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999972E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999725E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999973E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999734E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999974E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999742E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999747E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999975E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999756E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999976E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999765E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999977E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999774E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999978E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999782E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999787E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999979E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999796E1,TO_POSINF] --> [~2,~2] --> OK [~0.299999999999998E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999805E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999981E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999813E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999982E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999822E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999827E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999983E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999836E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999984E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999845E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999985E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999853E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999986E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999862E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999867E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999987E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999876E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999988E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999885E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999989E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999893E1,TO_POSINF] --> [~2,~2] --> OK [~0.299999999999999E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999902E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999907E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999991E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999916E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999992E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999925E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999993E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999933E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999994E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999942E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999947E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999995E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999956E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999996E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999964E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999997E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999973E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999998E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999982E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999987E1,TO_POSINF] --> [~2,~2] --> OK [~0.2999999999999999E1,TO_POSINF] --> [~2,~2] --> OK [~0.29999999999999996E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000284E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000028E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000275E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000027E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000266E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000026E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000258E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000253E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000025E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000244E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000024E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000235E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000023E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000226E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000022E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000218E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000213E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000021E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000204E1,TO_POSINF] --> [~2,~2] --> OK [~0.200000000000002E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000195E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000019E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000187E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000018E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000178E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000173E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000017E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000164E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000016E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000155E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000015E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000147E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000014E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000138E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000133E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000013E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000124E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000012E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000115E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000011E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000107E1,TO_POSINF] --> [~2,~2] --> OK [~0.200000000000001E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000098E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000093E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000009E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000084E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000008E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000075E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000007E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000067E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000006E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000058E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000053E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000005E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000044E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000004E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000036E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000003E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000027E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000002E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000018E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000013E1,TO_POSINF] --> [~2,~2] --> OK [~0.2000000000000001E1,TO_POSINF] --> [~2,~2] --> OK [~0.20000000000000004E1,TO_POSINF] --> [~2,~2] --> OK [~0.2E1,TO_POSINF] --> [~2,~2] --> OK [~0.19999999999999858E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999986E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999862E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999865E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999867E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999987E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999871E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999873E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999876E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999878E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999988E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999882E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999885E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999887E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999989E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999891E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999893E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999896E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999898E1,TO_POSINF] --> [~1,~1] --> OK [~0.199999999999999E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999902E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999905E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999907E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999991E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999911E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999913E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999916E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999918E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999992E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999922E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999925E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999927E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999993E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999931E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999933E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999936E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999938E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999994E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999942E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999944E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999947E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999995E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999951E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999953E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999956E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999958E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999996E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999962E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999964E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999967E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999997E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999971E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999973E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999976E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999978E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999998E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999982E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999984E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999987E1,TO_POSINF] --> [~1,~1] --> OK [~0.1999999999999999E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999991E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999993E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999996E1,TO_POSINF] --> [~1,~1] --> OK [~0.19999999999999998E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000142E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000014E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000138E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000135E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000133E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000013E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000129E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000127E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000124E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000122E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000012E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000118E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000115E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000113E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000011E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000109E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000107E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000104E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000102E1,TO_POSINF] --> [~1,~1] --> OK [~0.100000000000001E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000098E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000095E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000093E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000009E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000089E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000087E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000084E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000082E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000008E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000078E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000075E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000073E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000007E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000069E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000067E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000064E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000062E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000006E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000058E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000056E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000053E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000005E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000049E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000047E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000044E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000042E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000004E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000038E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000036E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000033E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000003E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000029E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000027E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000024E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000022E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000002E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000018E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000016E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000013E1,TO_POSINF] --> [~1,~1] --> OK [~0.1000000000000001E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000009E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000007E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000004E1,TO_POSINF] --> [~1,~1] --> OK [~0.10000000000000002E1,TO_POSINF] --> [~1,~1] --> OK [~0.1E1,TO_POSINF] --> [~1,~1] --> OK [~0.9999999999999929,TO_POSINF] --> [0,0] --> OK [~0.999999999999993,TO_POSINF] --> [0,0] --> OK [~0.9999999999999931,TO_POSINF] --> [0,0] --> OK [~0.9999999999999932,TO_POSINF] --> [0,0] --> OK [~0.9999999999999933,TO_POSINF] --> [0,0] --> OK [~0.9999999999999934,TO_POSINF] --> [0,0] --> OK [~0.9999999999999936,TO_POSINF] --> [0,0] --> OK [~0.9999999999999937,TO_POSINF] --> [0,0] --> OK [~0.9999999999999938,TO_POSINF] --> [0,0] --> OK [~0.9999999999999939,TO_POSINF] --> [0,0] --> OK [~0.999999999999994,TO_POSINF] --> [0,0] --> OK [~0.9999999999999941,TO_POSINF] --> [0,0] --> OK [~0.9999999999999942,TO_POSINF] --> [0,0] --> OK [~0.9999999999999943,TO_POSINF] --> [0,0] --> OK [~0.9999999999999944,TO_POSINF] --> [0,0] --> OK [~0.9999999999999946,TO_POSINF] --> [0,0] --> OK [~0.9999999999999947,TO_POSINF] --> [0,0] --> OK [~0.9999999999999948,TO_POSINF] --> [0,0] --> OK [~0.9999999999999949,TO_POSINF] --> [0,0] --> OK [~0.999999999999995,TO_POSINF] --> [0,0] --> OK [~0.9999999999999951,TO_POSINF] --> [0,0] --> OK [~0.9999999999999952,TO_POSINF] --> [0,0] --> OK [~0.9999999999999953,TO_POSINF] --> [0,0] --> OK [~0.9999999999999954,TO_POSINF] --> [0,0] --> OK [~0.9999999999999956,TO_POSINF] --> [0,0] --> OK [~0.9999999999999957,TO_POSINF] --> [0,0] --> OK [~0.9999999999999958,TO_POSINF] --> [0,0] --> OK [~0.9999999999999959,TO_POSINF] --> [0,0] --> OK [~0.999999999999996,TO_POSINF] --> [0,0] --> OK [~0.9999999999999961,TO_POSINF] --> [0,0] --> OK [~0.9999999999999962,TO_POSINF] --> [0,0] --> OK [~0.9999999999999963,TO_POSINF] --> [0,0] --> OK [~0.9999999999999964,TO_POSINF] --> [0,0] --> OK [~0.9999999999999966,TO_POSINF] --> [0,0] --> OK [~0.9999999999999967,TO_POSINF] --> [0,0] --> OK [~0.9999999999999968,TO_POSINF] --> [0,0] --> OK [~0.9999999999999969,TO_POSINF] --> [0,0] --> OK [~0.999999999999997,TO_POSINF] --> [0,0] --> OK [~0.9999999999999971,TO_POSINF] --> [0,0] --> OK [~0.9999999999999972,TO_POSINF] --> [0,0] --> OK [~0.9999999999999973,TO_POSINF] --> [0,0] --> OK [~0.9999999999999974,TO_POSINF] --> [0,0] --> OK [~0.9999999999999976,TO_POSINF] --> [0,0] --> OK [~0.9999999999999977,TO_POSINF] --> [0,0] --> OK [~0.9999999999999978,TO_POSINF] --> [0,0] --> OK [~0.9999999999999979,TO_POSINF] --> [0,0] --> OK [~0.999999999999998,TO_POSINF] --> [0,0] --> OK [~0.9999999999999981,TO_POSINF] --> [0,0] --> OK [~0.9999999999999982,TO_POSINF] --> [0,0] --> OK [~0.9999999999999983,TO_POSINF] --> [0,0] --> OK [~0.9999999999999984,TO_POSINF] --> [0,0] --> OK [~0.9999999999999986,TO_POSINF] --> [0,0] --> OK [~0.9999999999999987,TO_POSINF] --> [0,0] --> OK [~0.9999999999999988,TO_POSINF] --> [0,0] --> OK [~0.9999999999999989,TO_POSINF] --> [0,0] --> OK [~0.999999999999999,TO_POSINF] --> [0,0] --> OK [~0.9999999999999991,TO_POSINF] --> [0,0] --> OK [~0.9999999999999992,TO_POSINF] --> [0,0] --> OK [~0.9999999999999993,TO_POSINF] --> [0,0] --> OK [~0.9999999999999994,TO_POSINF] --> [0,0] --> OK [~0.9999999999999996,TO_POSINF] --> [0,0] --> OK [~0.9999999999999997,TO_POSINF] --> [0,0] --> OK [~0.9999999999999998,TO_POSINF] --> [0,0] --> OK [~0.9999999999999999,TO_POSINF] --> [0,0] --> OK [~0.316E~321,TO_POSINF] --> [0,0] --> OK [~0.31E~321,TO_POSINF] --> [0,0] --> OK [~0.306E~321,TO_POSINF] --> [0,0] --> OK [~0.3E~321,TO_POSINF] --> [0,0] --> OK [~0.296E~321,TO_POSINF] --> [0,0] --> OK [~0.29E~321,TO_POSINF] --> [0,0] --> OK [~0.287E~321,TO_POSINF] --> [0,0] --> OK [~0.28E~321,TO_POSINF] --> [0,0] --> OK [~0.277E~321,TO_POSINF] --> [0,0] --> OK [~0.27E~321,TO_POSINF] --> [0,0] --> OK [~0.267E~321,TO_POSINF] --> [0,0] --> OK [~0.26E~321,TO_POSINF] --> [0,0] --> OK [~0.257E~321,TO_POSINF] --> [0,0] --> OK [~0.25E~321,TO_POSINF] --> [0,0] --> OK [~0.247E~321,TO_POSINF] --> [0,0] --> OK [~0.24E~321,TO_POSINF] --> [0,0] --> OK [~0.237E~321,TO_POSINF] --> [0,0] --> OK [~0.23E~321,TO_POSINF] --> [0,0] --> OK [~0.227E~321,TO_POSINF] --> [0,0] --> OK [~0.22E~321,TO_POSINF] --> [0,0] --> OK [~0.217E~321,TO_POSINF] --> [0,0] --> OK [~0.21E~321,TO_POSINF] --> [0,0] --> OK [~0.208E~321,TO_POSINF] --> [0,0] --> OK [~0.203E~321,TO_POSINF] --> [0,0] --> OK [~0.2E~321,TO_POSINF] --> [0,0] --> OK [~0.193E~321,TO_POSINF] --> [0,0] --> OK [~0.19E~321,TO_POSINF] --> [0,0] --> OK [~0.183E~321,TO_POSINF] --> [0,0] --> OK [~0.18E~321,TO_POSINF] --> [0,0] --> OK [~0.173E~321,TO_POSINF] --> [0,0] --> OK [~0.17E~321,TO_POSINF] --> [0,0] --> OK [~0.163E~321,TO_POSINF] --> [0,0] --> OK [~0.16E~321,TO_POSINF] --> [0,0] --> OK [~0.153E~321,TO_POSINF] --> [0,0] --> OK [~0.15E~321,TO_POSINF] --> [0,0] --> OK [~0.143E~321,TO_POSINF] --> [0,0] --> OK [~0.14E~321,TO_POSINF] --> [0,0] --> OK [~0.133E~321,TO_POSINF] --> [0,0] --> OK [~0.13E~321,TO_POSINF] --> [0,0] --> OK [~0.124E~321,TO_POSINF] --> [0,0] --> OK [~0.12E~321,TO_POSINF] --> [0,0] --> OK [~0.114E~321,TO_POSINF] --> [0,0] --> OK [~0.11E~321,TO_POSINF] --> [0,0] --> OK [~0.104E~321,TO_POSINF] --> [0,0] --> OK [~0.1E~321,TO_POSINF] --> [0,0] --> OK [~0.94E~322,TO_POSINF] --> [0,0] --> OK [~0.9E~322,TO_POSINF] --> [0,0] --> OK [~0.84E~322,TO_POSINF] --> [0,0] --> OK [~0.8E~322,TO_POSINF] --> [0,0] --> OK [~0.74E~322,TO_POSINF] --> [0,0] --> OK [~0.7E~322,TO_POSINF] --> [0,0] --> OK [~0.64E~322,TO_POSINF] --> [0,0] --> OK [~0.6E~322,TO_POSINF] --> [0,0] --> OK [~0.54E~322,TO_POSINF] --> [0,0] --> OK [~0.5E~322,TO_POSINF] --> [0,0] --> OK [~0.44E~322,TO_POSINF] --> [0,0] --> OK [~0.4E~322,TO_POSINF] --> [0,0] --> OK [~0.35E~322,TO_POSINF] --> [0,0] --> OK [~0.3E~322,TO_POSINF] --> [0,0] --> OK [~0.25E~322,TO_POSINF] --> [0,0] --> OK [~0.2E~322,TO_POSINF] --> [0,0] --> OK [~0.15E~322,TO_POSINF] --> [0,0] --> OK [~0.1E~322,TO_POSINF] --> [0,0] --> OK [~0.5E~323,TO_POSINF] --> [0,0] --> OK [0.0,TO_POSINF] --> [0,0] --> OK [0.316E~321,TO_POSINF] --> [1,1] --> OK [0.31E~321,TO_POSINF] --> [1,1] --> OK [0.306E~321,TO_POSINF] --> [1,1] --> OK [0.3E~321,TO_POSINF] --> [1,1] --> OK [0.296E~321,TO_POSINF] --> [1,1] --> OK [0.29E~321,TO_POSINF] --> [1,1] --> OK [0.287E~321,TO_POSINF] --> [1,1] --> OK [0.28E~321,TO_POSINF] --> [1,1] --> OK [0.277E~321,TO_POSINF] --> [1,1] --> OK [0.27E~321,TO_POSINF] --> [1,1] --> OK [0.267E~321,TO_POSINF] --> [1,1] --> OK [0.26E~321,TO_POSINF] --> [1,1] --> OK [0.257E~321,TO_POSINF] --> [1,1] --> OK [0.25E~321,TO_POSINF] --> [1,1] --> OK [0.247E~321,TO_POSINF] --> [1,1] --> OK [0.24E~321,TO_POSINF] --> [1,1] --> OK [0.237E~321,TO_POSINF] --> [1,1] --> OK [0.23E~321,TO_POSINF] --> [1,1] --> OK [0.227E~321,TO_POSINF] --> [1,1] --> OK [0.22E~321,TO_POSINF] --> [1,1] --> OK [0.217E~321,TO_POSINF] --> [1,1] --> OK [0.21E~321,TO_POSINF] --> [1,1] --> OK [0.208E~321,TO_POSINF] --> [1,1] --> OK [0.203E~321,TO_POSINF] --> [1,1] --> OK [0.2E~321,TO_POSINF] --> [1,1] --> OK [0.193E~321,TO_POSINF] --> [1,1] --> OK [0.19E~321,TO_POSINF] --> [1,1] --> OK [0.183E~321,TO_POSINF] --> [1,1] --> OK [0.18E~321,TO_POSINF] --> [1,1] --> OK [0.173E~321,TO_POSINF] --> [1,1] --> OK [0.17E~321,TO_POSINF] --> [1,1] --> OK [0.163E~321,TO_POSINF] --> [1,1] --> OK [0.16E~321,TO_POSINF] --> [1,1] --> OK [0.153E~321,TO_POSINF] --> [1,1] --> OK [0.15E~321,TO_POSINF] --> [1,1] --> OK [0.143E~321,TO_POSINF] --> [1,1] --> OK [0.14E~321,TO_POSINF] --> [1,1] --> OK [0.133E~321,TO_POSINF] --> [1,1] --> OK [0.13E~321,TO_POSINF] --> [1,1] --> OK [0.124E~321,TO_POSINF] --> [1,1] --> OK [0.12E~321,TO_POSINF] --> [1,1] --> OK [0.114E~321,TO_POSINF] --> [1,1] --> OK [0.11E~321,TO_POSINF] --> [1,1] --> OK [0.104E~321,TO_POSINF] --> [1,1] --> OK [0.1E~321,TO_POSINF] --> [1,1] --> OK [0.94E~322,TO_POSINF] --> [1,1] --> OK [0.9E~322,TO_POSINF] --> [1,1] --> OK [0.84E~322,TO_POSINF] --> [1,1] --> OK [0.8E~322,TO_POSINF] --> [1,1] --> OK [0.74E~322,TO_POSINF] --> [1,1] --> OK [0.7E~322,TO_POSINF] --> [1,1] --> OK [0.64E~322,TO_POSINF] --> [1,1] --> OK [0.6E~322,TO_POSINF] --> [1,1] --> OK [0.54E~322,TO_POSINF] --> [1,1] --> OK [0.5E~322,TO_POSINF] --> [1,1] --> OK [0.44E~322,TO_POSINF] --> [1,1] --> OK [0.4E~322,TO_POSINF] --> [1,1] --> OK [0.35E~322,TO_POSINF] --> [1,1] --> OK [0.3E~322,TO_POSINF] --> [1,1] --> OK [0.25E~322,TO_POSINF] --> [1,1] --> OK [0.2E~322,TO_POSINF] --> [1,1] --> OK [0.15E~322,TO_POSINF] --> [1,1] --> OK [0.1E~322,TO_POSINF] --> [1,1] --> OK [0.5E~323,TO_POSINF] --> [1,1] --> OK [0.9999999999999929,TO_POSINF] --> [1,1] --> OK [0.999999999999993,TO_POSINF] --> [1,1] --> OK [0.9999999999999931,TO_POSINF] --> [1,1] --> OK [0.9999999999999932,TO_POSINF] --> [1,1] --> OK [0.9999999999999933,TO_POSINF] --> [1,1] --> OK [0.9999999999999934,TO_POSINF] --> [1,1] --> OK [0.9999999999999936,TO_POSINF] --> [1,1] --> OK [0.9999999999999937,TO_POSINF] --> [1,1] --> OK [0.9999999999999938,TO_POSINF] --> [1,1] --> OK [0.9999999999999939,TO_POSINF] --> [1,1] --> OK [0.999999999999994,TO_POSINF] --> [1,1] --> OK [0.9999999999999941,TO_POSINF] --> [1,1] --> OK [0.9999999999999942,TO_POSINF] --> [1,1] --> OK [0.9999999999999943,TO_POSINF] --> [1,1] --> OK [0.9999999999999944,TO_POSINF] --> [1,1] --> OK [0.9999999999999946,TO_POSINF] --> [1,1] --> OK [0.9999999999999947,TO_POSINF] --> [1,1] --> OK [0.9999999999999948,TO_POSINF] --> [1,1] --> OK [0.9999999999999949,TO_POSINF] --> [1,1] --> OK [0.999999999999995,TO_POSINF] --> [1,1] --> OK [0.9999999999999951,TO_POSINF] --> [1,1] --> OK [0.9999999999999952,TO_POSINF] --> [1,1] --> OK [0.9999999999999953,TO_POSINF] --> [1,1] --> OK [0.9999999999999954,TO_POSINF] --> [1,1] --> OK [0.9999999999999956,TO_POSINF] --> [1,1] --> OK [0.9999999999999957,TO_POSINF] --> [1,1] --> OK [0.9999999999999958,TO_POSINF] --> [1,1] --> OK [0.9999999999999959,TO_POSINF] --> [1,1] --> OK [0.999999999999996,TO_POSINF] --> [1,1] --> OK [0.9999999999999961,TO_POSINF] --> [1,1] --> OK [0.9999999999999962,TO_POSINF] --> [1,1] --> OK [0.9999999999999963,TO_POSINF] --> [1,1] --> OK [0.9999999999999964,TO_POSINF] --> [1,1] --> OK [0.9999999999999966,TO_POSINF] --> [1,1] --> OK [0.9999999999999967,TO_POSINF] --> [1,1] --> OK [0.9999999999999968,TO_POSINF] --> [1,1] --> OK [0.9999999999999969,TO_POSINF] --> [1,1] --> OK [0.999999999999997,TO_POSINF] --> [1,1] --> OK [0.9999999999999971,TO_POSINF] --> [1,1] --> OK [0.9999999999999972,TO_POSINF] --> [1,1] --> OK [0.9999999999999973,TO_POSINF] --> [1,1] --> OK [0.9999999999999974,TO_POSINF] --> [1,1] --> OK [0.9999999999999976,TO_POSINF] --> [1,1] --> OK [0.9999999999999977,TO_POSINF] --> [1,1] --> OK [0.9999999999999978,TO_POSINF] --> [1,1] --> OK [0.9999999999999979,TO_POSINF] --> [1,1] --> OK [0.999999999999998,TO_POSINF] --> [1,1] --> OK [0.9999999999999981,TO_POSINF] --> [1,1] --> OK [0.9999999999999982,TO_POSINF] --> [1,1] --> OK [0.9999999999999983,TO_POSINF] --> [1,1] --> OK [0.9999999999999984,TO_POSINF] --> [1,1] --> OK [0.9999999999999986,TO_POSINF] --> [1,1] --> OK [0.9999999999999987,TO_POSINF] --> [1,1] --> OK [0.9999999999999988,TO_POSINF] --> [1,1] --> OK [0.9999999999999989,TO_POSINF] --> [1,1] --> OK [0.999999999999999,TO_POSINF] --> [1,1] --> OK [0.9999999999999991,TO_POSINF] --> [1,1] --> OK [0.9999999999999992,TO_POSINF] --> [1,1] --> OK [0.9999999999999993,TO_POSINF] --> [1,1] --> OK [0.9999999999999994,TO_POSINF] --> [1,1] --> OK [0.9999999999999996,TO_POSINF] --> [1,1] --> OK [0.9999999999999997,TO_POSINF] --> [1,1] --> OK [0.9999999999999998,TO_POSINF] --> [1,1] --> OK [0.9999999999999999,TO_POSINF] --> [1,1] --> OK [0.1E1,TO_POSINF] --> [1,1] --> OK [0.10000000000000142E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000014E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000138E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000135E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000133E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000013E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000129E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000127E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000124E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000122E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000012E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000118E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000115E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000113E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000011E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000109E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000107E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000104E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000102E1,TO_POSINF] --> [2,2] --> OK [0.100000000000001E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000098E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000095E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000093E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000009E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000089E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000087E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000084E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000082E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000008E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000078E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000075E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000073E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000007E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000069E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000067E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000064E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000062E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000006E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000058E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000056E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000053E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000005E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000049E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000047E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000044E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000042E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000004E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000038E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000036E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000033E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000003E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000029E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000027E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000024E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000022E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000002E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000018E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000016E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000013E1,TO_POSINF] --> [2,2] --> OK [0.1000000000000001E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000009E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000007E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000004E1,TO_POSINF] --> [2,2] --> OK [0.10000000000000002E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999858E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999986E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999862E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999865E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999867E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999987E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999871E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999873E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999876E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999878E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999988E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999882E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999885E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999887E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999989E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999891E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999893E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999896E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999898E1,TO_POSINF] --> [2,2] --> OK [0.199999999999999E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999902E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999905E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999907E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999991E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999911E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999913E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999916E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999918E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999992E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999922E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999925E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999927E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999993E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999931E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999933E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999936E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999938E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999994E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999942E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999944E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999947E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999995E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999951E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999953E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999956E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999958E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999996E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999962E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999964E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999967E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999997E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999971E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999973E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999976E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999978E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999998E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999982E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999984E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999987E1,TO_POSINF] --> [2,2] --> OK [0.1999999999999999E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999991E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999993E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999996E1,TO_POSINF] --> [2,2] --> OK [0.19999999999999998E1,TO_POSINF] --> [2,2] --> OK [0.2E1,TO_POSINF] --> [2,2] --> OK [0.20000000000000284E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000028E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000275E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000027E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000266E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000026E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000258E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000253E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000025E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000244E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000024E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000235E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000023E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000226E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000022E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000218E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000213E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000021E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000204E1,TO_POSINF] --> [3,3] --> OK [0.200000000000002E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000195E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000019E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000187E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000018E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000178E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000173E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000017E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000164E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000016E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000155E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000015E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000147E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000014E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000138E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000133E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000013E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000124E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000012E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000115E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000011E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000107E1,TO_POSINF] --> [3,3] --> OK [0.200000000000001E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000098E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000093E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000009E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000084E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000008E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000075E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000007E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000067E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000006E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000058E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000053E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000005E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000044E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000004E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000036E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000003E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000027E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000002E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000018E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000013E1,TO_POSINF] --> [3,3] --> OK [0.2000000000000001E1,TO_POSINF] --> [3,3] --> OK [0.20000000000000004E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999716E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999972E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999725E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999973E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999734E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999974E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999742E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999747E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999975E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999756E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999976E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999765E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999977E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999774E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999978E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999782E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999787E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999979E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999796E1,TO_POSINF] --> [3,3] --> OK [0.299999999999998E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999805E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999981E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999813E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999982E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999822E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999827E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999983E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999836E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999984E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999845E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999985E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999853E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999986E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999862E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999867E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999987E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999876E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999988E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999885E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999989E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999893E1,TO_POSINF] --> [3,3] --> OK [0.299999999999999E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999902E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999907E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999991E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999916E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999992E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999925E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999993E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999933E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999994E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999942E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999947E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999995E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999956E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999996E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999964E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999997E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999973E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999998E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999982E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999987E1,TO_POSINF] --> [3,3] --> OK [0.2999999999999999E1,TO_POSINF] --> [3,3] --> OK [0.29999999999999996E1,TO_POSINF] --> [3,3] --> OK [0.3E1,TO_POSINF] --> [3,3] --> OK [0.30000000000000284E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000028E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000275E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000027E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000266E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000026E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000258E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000253E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000025E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000244E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000024E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000235E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000023E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000226E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000022E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000218E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000213E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000021E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000204E1,TO_POSINF] --> [4,4] --> OK [0.300000000000002E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000195E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000019E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000187E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000018E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000178E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000173E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000017E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000164E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000016E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000155E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000015E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000147E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000014E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000138E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000133E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000013E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000124E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000012E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000115E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000011E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000107E1,TO_POSINF] --> [4,4] --> OK [0.300000000000001E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000098E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000093E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000009E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000084E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000008E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000075E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000007E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000067E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000006E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000058E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000053E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000005E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000044E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000004E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000036E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000003E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000027E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000002E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000018E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000013E1,TO_POSINF] --> [4,4] --> OK [0.3000000000000001E1,TO_POSINF] --> [4,4] --> OK [0.30000000000000004E1,TO_POSINF] --> [4,4] --> OK [0.10737418239999924E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999925E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999926E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999927E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999928E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999993E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999931E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999932E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999933E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999934E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999936E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999937E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999938E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999939E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999994E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999942E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999943E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999944E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999945E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999946E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999948E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999949E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999995E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999951E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999952E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999954E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999955E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999956E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999957E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999958E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999996E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999961E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999962E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999963E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999964E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999965E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999967E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999968E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999969E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999997E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999971E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999973E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999974E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999975E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999976E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999977E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999979E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999998E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999981E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999982E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999983E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999985E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999986E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999987E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999988E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999989E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741823999999E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999992E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999993E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999994E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999995E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999996E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999998E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418239999999E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.1073741824E10,TO_POSINF] --> [1073741824,1073741824] --> OK [0.10737418240000153E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000015E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000148E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000145E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000143E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000014E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000138E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000136E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000134E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000013E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000129E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000126E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000124E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000122E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000012E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000117E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000114E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000112E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000011E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000107E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000105E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000103E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.107374182400001E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000098E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000095E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000093E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000009E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000088E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000086E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000083E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000008E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000079E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000076E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000074E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000072E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000007E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000067E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000064E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000062E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000006E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000057E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000055E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000052E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000005E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000048E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000045E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000043E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000004E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000038E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000036E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000033E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000003E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000029E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000026E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000024E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000021E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000002E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000017E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000014E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000012E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.1073741824000001E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000007E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000005E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.10737418240000002E10,TO_POSINF] --> [1073741825,1073741825] --> OK [0.16106127359999847E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999985E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999852E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999855E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999857E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999986E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999862E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999864E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999866E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999987E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999871E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999874E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999876E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999878E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999988E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999883E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999886E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999888E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999989E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999893E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999895E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999897E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.161061273599999E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999902E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999905E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999907E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999991E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999912E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999914E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999917E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999992E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999921E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999924E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999926E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999928E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999993E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999933E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999936E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999938E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999994E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999943E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999945E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999948E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999995E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999952E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999955E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999957E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999996E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999962E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999964E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999967E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999997E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999971E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999974E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999976E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999979E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999998E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999983E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999986E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999988E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612735999999E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999993E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999995E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127359999998E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.1610612736E10,TO_POSINF] --> [1610612736,1610612736] --> OK [0.16106127360000153E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000015E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000148E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000145E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000143E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000014E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000138E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000136E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000134E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000013E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000129E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000126E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000124E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000122E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000012E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000117E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000114E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000112E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000011E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000107E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000105E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000103E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.161061273600001E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000098E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000095E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000093E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000009E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000088E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000086E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000083E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000008E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000079E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000076E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000074E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000072E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000007E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000067E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000064E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000062E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000006E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000057E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000055E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000052E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000005E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000048E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000045E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000043E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000004E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000038E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000036E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000033E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000003E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000029E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000026E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000024E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000021E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000002E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000017E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000014E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000012E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.1610612736000001E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000007E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000005E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.16106127360000002E10,TO_POSINF] --> [1610612737,1610612737] --> OK [0.18790481919999847E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999985E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999852E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999855E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999857E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999986E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999862E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999864E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999866E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999987E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999871E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999874E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999876E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999878E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999988E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999883E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999886E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999888E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999989E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999893E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999895E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999897E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.187904819199999E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999902E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999905E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999907E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999991E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999912E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999914E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999917E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999992E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999921E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999924E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999926E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999928E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999993E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999933E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999936E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999938E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999994E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999943E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999945E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999948E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999995E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999952E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999955E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999957E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999996E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999962E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999964E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999967E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999997E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999971E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999974E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999976E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999979E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999998E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999983E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999986E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999988E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048191999999E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999993E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999995E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481919999998E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.1879048192E10,TO_POSINF] --> [1879048192,1879048192] --> OK [0.18790481920000153E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000015E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000148E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000145E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000143E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000014E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000138E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000136E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000134E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000013E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000129E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000126E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000124E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000122E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000012E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000117E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000114E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000112E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000011E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000107E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000105E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000103E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.187904819200001E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000098E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000095E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000093E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000009E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000088E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000086E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000083E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000008E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000079E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000076E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000074E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000072E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000007E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000067E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000064E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000062E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000006E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000057E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000055E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000052E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000005E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000048E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000045E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000043E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000004E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000038E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000036E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000033E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000003E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000029E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000026E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000024E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000021E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000002E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000017E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000014E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000012E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.1879048192000001E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000007E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000005E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.18790481920000002E10,TO_POSINF] --> [1879048193,1879048193] --> OK [0.20132659199999847E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999985E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999852E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999855E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999857E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999986E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999862E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999864E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999866E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999987E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999871E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999874E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999876E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999878E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999988E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999883E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999886E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999888E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999989E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999893E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999895E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999897E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.201326591999999E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999902E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999905E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999907E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999991E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999912E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999914E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999917E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999992E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999921E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999924E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999926E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999928E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999993E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999933E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999936E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999938E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999994E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999943E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999945E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999948E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999995E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999952E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999955E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999957E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999996E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999962E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999964E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999967E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999997E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999971E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999974E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999976E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999979E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999998E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999983E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999986E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999988E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.2013265919999999E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999993E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999995E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659199999998E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.201326592E10,TO_POSINF] --> [2013265920,2013265920] --> OK [0.20132659200000153E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000015E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000148E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000145E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000143E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000014E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000138E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000136E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000134E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000013E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000129E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000126E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000124E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000122E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000012E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000117E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000114E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000112E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000011E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000107E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000105E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000103E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.201326592000001E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000098E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000095E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000093E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000009E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000088E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000086E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000083E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000008E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000079E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000076E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000074E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000072E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000007E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000067E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000064E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000062E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000006E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000057E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000055E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000052E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000005E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000048E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000045E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000043E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000004E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000038E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000036E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000033E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000003E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000029E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000026E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000024E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000021E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000002E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000017E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000014E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000012E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.2013265920000001E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000007E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000005E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20132659200000002E10,TO_POSINF] --> [2013265921,2013265921] --> OK [0.20803747839999847E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999985E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999852E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999855E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999857E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999986E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999862E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999864E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999866E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999987E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999871E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999874E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999876E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999878E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999988E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999883E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999886E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999888E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999989E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999893E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999895E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999897E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.208037478399999E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999902E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999905E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999907E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999991E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999912E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999914E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999917E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999992E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999921E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999924E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999926E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999928E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999993E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999933E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999936E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999938E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999994E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999943E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999945E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999948E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999995E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999952E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999955E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999957E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999996E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999962E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999964E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999967E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999997E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999971E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999974E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999976E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999979E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999998E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999983E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999986E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999988E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374783999999E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999993E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999995E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747839999998E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.2080374784E10,TO_POSINF] --> [2080374784,2080374784] --> OK [0.20803747840000153E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000015E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000148E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000145E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000143E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000014E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000138E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000136E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000134E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000013E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000129E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000126E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000124E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000122E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000012E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000117E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000114E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000112E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000011E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000107E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000105E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000103E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.208037478400001E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000098E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000095E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000093E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000009E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000088E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000086E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000083E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000008E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000079E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000076E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000074E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000072E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000007E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000067E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000064E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000062E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000006E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000057E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000055E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000052E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000005E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000048E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000045E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000043E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000004E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000038E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000036E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000033E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000003E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000029E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000026E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000024E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000021E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000002E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000017E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000014E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000012E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.2080374784000001E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000007E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000005E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.20803747840000002E10,TO_POSINF] --> [2080374785,2080374785] --> OK [0.21139292159999847E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999985E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999852E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999855E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999857E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999986E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999862E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999864E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999866E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999987E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999871E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999874E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999876E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999878E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999988E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999883E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999886E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999888E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999989E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999893E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999895E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999897E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.211392921599999E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999902E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999905E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999907E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999991E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999912E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999914E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999917E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999992E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999921E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999924E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999926E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999928E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999993E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999933E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999936E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999938E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999994E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999943E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999945E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999948E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999995E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999952E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999955E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999957E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999996E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999962E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999964E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999967E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999997E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999971E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999974E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999976E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999979E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999998E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999983E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999986E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999988E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929215999999E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999993E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999995E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292159999998E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.2113929216E10,TO_POSINF] --> [2113929216,2113929216] --> OK [0.21139292160000153E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000015E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000148E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000145E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000143E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000014E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000138E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000136E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000134E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000013E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000129E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000126E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000124E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000122E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000012E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000117E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000114E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000112E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000011E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000107E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000105E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000103E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.211392921600001E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000098E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000095E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000093E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000009E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000088E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000086E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000083E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000008E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000079E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000076E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000074E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000072E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000007E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000067E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000064E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000062E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000006E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000057E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000055E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000052E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000005E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000048E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000045E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000043E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000004E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000038E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000036E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000033E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000003E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000029E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000026E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000024E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000021E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000002E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000017E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000014E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000012E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.2113929216000001E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000007E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000005E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21139292160000002E10,TO_POSINF] --> [2113929217,2113929217] --> OK [0.21474836439999847E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999985E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999852E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999855E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999857E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999986E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999862E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999864E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999866E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999987E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999871E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999874E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999876E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999878E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999988E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999883E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999886E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999888E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999989E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999893E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999895E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999897E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.214748364399999E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999902E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999905E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999907E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999991E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999912E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999914E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999917E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999992E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999921E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999924E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999926E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999928E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999993E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999933E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999936E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999938E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999994E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999943E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999945E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999948E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999995E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999952E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999955E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999957E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999996E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999962E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999964E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999967E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999997E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999971E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999974E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999976E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999979E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999998E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999983E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999986E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999988E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483643999999E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999993E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999995E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836439999998E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.2147483644E10,TO_POSINF] --> [2147483644,2147483644] --> OK [0.21474836440000153E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000015E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000148E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000145E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000143E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000014E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000138E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000136E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000134E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000013E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000129E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000126E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000124E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000122E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000012E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000117E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000114E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000112E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000011E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000107E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000105E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000103E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.214748364400001E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000098E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000095E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000093E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000009E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000088E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000086E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000083E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000008E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000079E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000076E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000074E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000072E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000007E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000067E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000064E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000062E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000006E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000057E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000055E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000052E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000005E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000048E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000045E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000043E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000004E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000038E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000036E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000033E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000003E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000029E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000026E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000024E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000021E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000002E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000017E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000014E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000012E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644000001E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000007E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000005E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836440000002E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999847E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999985E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999852E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999855E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999857E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999986E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999862E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999864E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999866E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999987E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999871E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999874E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999876E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999878E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999988E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999883E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999886E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999888E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999989E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999893E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999895E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999897E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.214748364499999E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999902E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999905E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999907E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999991E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999912E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999914E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999917E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999992E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999921E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999924E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999926E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999928E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999993E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999933E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999936E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999938E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999994E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999943E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999945E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999948E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999995E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999952E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999955E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999957E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999996E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999962E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999964E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999967E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999997E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999971E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999974E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999976E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999979E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999998E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999983E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999986E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999988E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483644999999E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999993E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999995E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836449999998E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.2147483645E10,TO_POSINF] --> [2147483645,2147483645] --> OK [0.21474836450000153E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000015E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000148E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000145E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000143E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000014E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000138E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000136E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000134E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000013E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000129E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000126E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000124E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000122E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000012E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000117E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000114E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000112E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000011E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000107E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000105E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000103E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.214748364500001E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000098E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000095E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000093E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000009E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000088E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000086E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000083E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000008E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000079E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000076E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000074E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000072E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000007E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000067E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000064E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000062E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000006E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000057E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000055E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000052E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000005E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000048E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000045E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000043E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000004E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000038E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000036E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000033E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000003E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000029E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000026E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000024E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000021E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000002E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000017E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000014E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000012E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645000001E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000007E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000005E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836450000002E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999847E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999985E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999852E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999855E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999857E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999986E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999862E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999864E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999866E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999987E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999871E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999874E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999876E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999878E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999988E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999883E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999886E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999888E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999989E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999893E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999895E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999897E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.214748364599999E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999902E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999905E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999907E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999991E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999912E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999914E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999917E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999992E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999921E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999924E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999926E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999928E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999993E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999933E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999936E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999938E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999994E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999943E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999945E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999948E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999995E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999952E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999955E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999957E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999996E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999962E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999964E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999967E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999997E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999971E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999974E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999976E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999979E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999998E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999983E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999986E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999988E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483645999999E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999993E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999995E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836459999998E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.2147483646E10,TO_POSINF] --> [2147483646,2147483646] --> OK [0.21474836460000153E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000015E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000148E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000145E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000143E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000014E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000138E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000136E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000134E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000013E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000129E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000126E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000124E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000122E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000012E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000117E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000114E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000112E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000011E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000107E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000105E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000103E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.214748364600001E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000098E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000095E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000093E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000009E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000088E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000086E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000083E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000008E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000079E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000076E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000074E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000072E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000007E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000067E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000064E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000062E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000006E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000057E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000055E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000052E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000005E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000048E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000045E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000043E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000004E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000038E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000036E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000033E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000003E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000029E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000026E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000024E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000021E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000002E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000017E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000014E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000012E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646000001E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000007E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000005E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836460000002E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999847E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999985E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999852E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999855E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999857E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999986E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999862E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999864E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999866E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999987E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999871E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999874E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999876E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999878E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999988E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999883E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999886E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999888E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999989E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999893E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999895E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999897E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.214748364699999E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999902E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999905E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999907E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999991E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999912E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999914E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999917E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999992E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999921E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999924E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999926E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999928E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999993E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999933E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999936E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999938E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999994E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999943E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999945E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999948E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999995E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999952E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999955E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999957E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999996E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999962E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999964E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999967E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999997E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999971E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999974E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999976E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999979E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999998E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999983E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999986E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999988E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483646999999E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999993E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999995E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836469999998E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.2147483647E10,TO_POSINF] --> [2147483647,2147483647] --> OK [0.21474836470000153E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000015E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000148E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000145E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000143E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000014E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000138E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000136E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000134E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000013E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000129E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000126E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000124E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000122E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000012E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000117E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000114E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000112E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000011E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000107E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000105E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000103E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.214748364700001E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000098E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000095E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000093E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000009E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000088E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000086E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000083E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000008E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000079E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000076E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000074E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000072E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000007E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000067E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000064E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000062E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000006E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000057E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000055E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000052E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000005E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000048E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000045E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000043E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000004E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000038E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000036E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000033E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000003E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000029E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000026E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000024E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000021E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000002E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000017E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000014E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000012E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.2147483647000001E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000007E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000005E10,TO_POSINF] --> [Overflow,2147483648] --> OK [0.21474836470000002E10,TO_POSINF] --> [Overflow,2147483648] --> OK [~0.21474836480000305E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.214748364800003E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000296E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000029E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000286E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000028E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000277E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000027E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000267E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000026E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000257E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000253E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000025E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000243E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000024E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000234E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000023E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000224E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000022E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000215E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000021E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000205E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.214748364800002E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000196E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000019E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000186E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000018E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000176E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000017E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000167E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000016E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000157E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000153E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000015E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000143E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000014E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000134E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000013E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000124E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000012E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000114E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000011E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000105E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.214748364800001E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000095E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000009E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000086E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000008E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000076E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000007E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000067E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000006E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000057E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000052E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000005E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000043E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000004E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000033E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000003E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000024E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000002E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000014E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648000001E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836480000005E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.2147483648E10,TO_ZERO] --> [~2147483648,~2147483648] --> OK [~0.21474836479999847E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999985E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999852E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999855E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999857E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999986E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999862E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999864E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999866E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999987E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999871E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999874E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999876E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999878E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999988E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999883E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999886E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999888E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999989E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999893E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999895E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999897E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.214748364799999E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999902E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999905E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999907E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999991E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999912E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999914E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999917E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999992E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999921E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999924E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999926E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999928E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999993E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999933E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999936E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999938E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999994E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999943E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999945E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999948E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999995E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999952E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999955E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999957E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999996E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999962E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999964E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999967E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999997E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999971E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999974E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999976E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999979E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999998E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999983E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999986E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999988E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647999999E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999993E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999995E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836479999998E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000153E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000015E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000148E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000145E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000143E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000014E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000138E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000136E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000134E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000013E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000129E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000126E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000124E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000122E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000012E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000117E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000114E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000112E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000011E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000107E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000105E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000103E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.214748364700001E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000098E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000095E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000093E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000009E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000088E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000086E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000083E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000008E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000079E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000076E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000074E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000072E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000007E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000067E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000064E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000062E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000006E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000057E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000055E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000052E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000005E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000048E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000045E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000043E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000004E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000038E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000036E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000033E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000003E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000029E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000026E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000024E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000021E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000002E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000017E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000014E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000012E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647000001E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000007E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000005E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836470000002E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.2147483647E10,TO_ZERO] --> [~2147483647,~2147483647] --> OK [~0.21474836469999847E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999985E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999852E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999855E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999857E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999986E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999862E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999864E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999866E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999987E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999871E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999874E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999876E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999878E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999988E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999883E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999886E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999888E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999989E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999893E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999895E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999897E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.214748364699999E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999902E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999905E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999907E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999991E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999912E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999914E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999917E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999992E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999921E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999924E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999926E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999928E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999993E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999933E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999936E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999938E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999994E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999943E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999945E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999948E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999995E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999952E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999955E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999957E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999996E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999962E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999964E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999967E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999997E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999971E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999974E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999976E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999979E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999998E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999983E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999986E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999988E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646999999E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999993E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999995E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836469999998E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000153E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000015E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000148E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000145E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000143E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000014E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000138E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000136E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000134E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000013E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000129E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000126E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000124E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000122E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000012E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000117E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000114E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000112E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000011E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000107E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000105E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000103E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.214748364600001E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000098E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000095E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000093E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000009E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000088E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000086E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000083E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000008E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000079E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000076E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000074E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000072E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000007E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000067E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000064E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000062E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000006E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000057E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000055E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000052E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000005E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000048E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000045E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000043E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000004E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000038E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000036E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000033E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000003E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000029E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000026E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000024E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000021E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000002E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000017E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000014E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000012E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646000001E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000007E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000005E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836460000002E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.2147483646E10,TO_ZERO] --> [~2147483646,~2147483646] --> OK [~0.21474836459999847E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999985E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999852E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999855E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999857E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999986E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999862E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999864E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999866E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999987E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999871E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999874E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999876E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999878E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999988E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999883E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999886E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999888E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999989E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999893E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999895E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999897E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.214748364599999E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999902E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999905E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999907E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999991E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999912E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999914E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999917E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999992E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999921E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999924E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999926E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999928E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999993E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999933E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999936E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999938E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999994E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999943E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999945E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999948E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999995E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999952E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999955E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999957E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999996E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999962E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999964E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999967E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999997E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999971E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999974E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999976E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999979E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999998E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999983E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999986E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999988E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645999999E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999993E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999995E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836459999998E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000153E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000015E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000148E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000145E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000143E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000014E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000138E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000136E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000134E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000013E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000129E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000126E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000124E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000122E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000012E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000117E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000114E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000112E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000011E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000107E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000105E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000103E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.214748364500001E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000098E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000095E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000093E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000009E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000088E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000086E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000083E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000008E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000079E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000076E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000074E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000072E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000007E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000067E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000064E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000062E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000006E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000057E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000055E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000052E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000005E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000048E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000045E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000043E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000004E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000038E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000036E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000033E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000003E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000029E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000026E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000024E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000021E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000002E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000017E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000014E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000012E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645000001E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000007E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000005E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836450000002E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.2147483645E10,TO_ZERO] --> [~2147483645,~2147483645] --> OK [~0.21474836449999847E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999985E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999852E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999855E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999857E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999986E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999862E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999864E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999866E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999987E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999871E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999874E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999876E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999878E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999988E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999883E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999886E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999888E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999989E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999893E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999895E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999897E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.214748364499999E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999902E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999905E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999907E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999991E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999912E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999914E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999917E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999992E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999921E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999924E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999926E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999928E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999993E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999933E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999936E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999938E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999994E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999943E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999945E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999948E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999995E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999952E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999955E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999957E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999996E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999962E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999964E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999967E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999997E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999971E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999974E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999976E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999979E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999998E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999983E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999986E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999988E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.2147483644999999E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999993E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999995E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21474836449999998E10,TO_ZERO] --> [~2147483644,~2147483644] --> OK [~0.21139292170000153E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000015E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000148E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000145E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000143E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000014E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000138E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000136E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000134E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000013E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000129E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000126E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000124E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000122E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000012E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000117E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000114E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000112E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000011E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000107E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000105E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000103E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.211392921700001E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000098E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000095E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000093E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000009E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000088E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000086E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000083E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000008E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000079E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000076E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000074E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000072E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000007E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000067E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000064E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000062E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000006E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000057E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000055E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000052E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000005E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000048E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000045E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000043E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000004E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000038E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000036E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000033E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000003E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000029E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000026E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000024E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000021E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000002E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000017E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000014E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000012E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217000001E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000007E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000005E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292170000002E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.2113929217E10,TO_ZERO] --> [~2113929217,~2113929217] --> OK [~0.21139292169999847E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999985E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999852E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999855E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999857E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999986E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999862E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999864E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999866E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999987E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999871E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999874E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999876E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999878E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999988E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999883E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999886E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999888E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999989E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999893E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999895E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999897E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.211392921699999E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999902E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999905E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999907E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999991E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999912E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999914E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999917E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999992E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999921E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999924E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999926E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999928E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999993E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999933E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999936E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999938E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999994E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999943E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999945E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999948E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999995E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999952E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999955E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999957E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999996E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999962E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999964E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999967E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999997E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999971E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999974E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999976E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999979E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999998E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999983E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999986E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999988E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.2113929216999999E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999993E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999995E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.21139292169999998E10,TO_ZERO] --> [~2113929216,~2113929216] --> OK [~0.20803747850000153E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000015E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000148E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000145E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000143E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000014E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000138E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000136E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000134E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000013E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000129E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000126E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000124E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000122E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000012E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000117E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000114E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000112E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000011E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000107E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000105E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000103E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.208037478500001E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000098E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000095E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000093E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000009E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000088E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000086E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000083E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000008E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000079E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000076E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000074E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000072E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000007E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000067E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000064E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000062E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000006E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000057E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000055E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000052E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000005E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000048E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000045E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000043E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000004E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000038E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000036E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000033E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000003E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000029E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000026E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000024E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000021E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000002E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000017E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000014E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000012E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785000001E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000007E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000005E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747850000002E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.2080374785E10,TO_ZERO] --> [~2080374785,~2080374785] --> OK [~0.20803747849999847E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999985E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999852E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999855E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999857E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999986E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999862E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999864E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999866E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999987E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999871E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999874E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999876E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999878E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999988E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999883E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999886E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999888E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999989E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999893E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999895E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999897E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.208037478499999E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999902E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999905E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999907E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999991E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999912E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999914E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999917E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999992E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999921E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999924E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999926E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999928E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999993E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999933E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999936E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999938E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999994E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999943E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999945E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999948E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999995E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999952E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999955E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999957E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999996E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999962E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999964E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999967E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999997E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999971E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999974E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999976E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999979E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999998E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999983E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999986E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999988E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.2080374784999999E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999993E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999995E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20803747849999998E10,TO_ZERO] --> [~2080374784,~2080374784] --> OK [~0.20132659210000153E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000015E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000148E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000145E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000143E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000014E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000138E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000136E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000134E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000013E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000129E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000126E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000124E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000122E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000012E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000117E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000114E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000112E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000011E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000107E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000105E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000103E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.201326592100001E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000098E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000095E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000093E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000009E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000088E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000086E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000083E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000008E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000079E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000076E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000074E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000072E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000007E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000067E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000064E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000062E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000006E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000057E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000055E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000052E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000005E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000048E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000045E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000043E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000004E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000038E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000036E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000033E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000003E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000029E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000026E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000024E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000021E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000002E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000017E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000014E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000012E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921000001E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000007E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000005E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659210000002E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.2013265921E10,TO_ZERO] --> [~2013265921,~2013265921] --> OK [~0.20132659209999847E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999985E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999852E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999855E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999857E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999986E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999862E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999864E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999866E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999987E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999871E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999874E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999876E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999878E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999988E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999883E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999886E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999888E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999989E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999893E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999895E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999897E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.201326592099999E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999902E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999905E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999907E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999991E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999912E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999914E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999917E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999992E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999921E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999924E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999926E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999928E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999993E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999933E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999936E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999938E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999994E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999943E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999945E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999948E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999995E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999952E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999955E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999957E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999996E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999962E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999964E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999967E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999997E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999971E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999974E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999976E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999979E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999998E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999983E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999986E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999988E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.2013265920999999E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999993E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999995E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.20132659209999998E10,TO_ZERO] --> [~2013265920,~2013265920] --> OK [~0.18790481930000153E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000015E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000148E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000145E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000143E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000014E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000138E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000136E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000134E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000013E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000129E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000126E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000124E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000122E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000012E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000117E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000114E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000112E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000011E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000107E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000105E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000103E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.187904819300001E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000098E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000095E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000093E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000009E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000088E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000086E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000083E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000008E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000079E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000076E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000074E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000072E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000007E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000067E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000064E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000062E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000006E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000057E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000055E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000052E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000005E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000048E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000045E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000043E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000004E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000038E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000036E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000033E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000003E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000029E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000026E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000024E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000021E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000002E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000017E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000014E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000012E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193000001E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000007E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000005E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481930000002E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.1879048193E10,TO_ZERO] --> [~1879048193,~1879048193] --> OK [~0.18790481929999847E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999985E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999852E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999855E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999857E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999986E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999862E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999864E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999866E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999987E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999871E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999874E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999876E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999878E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999988E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999883E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999886E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999888E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999989E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999893E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999895E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999897E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.187904819299999E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999902E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999905E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999907E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999991E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999912E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999914E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999917E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999992E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999921E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999924E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999926E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999928E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999993E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999933E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999936E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999938E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999994E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999943E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999945E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999948E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999995E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999952E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999955E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999957E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999996E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999962E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999964E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999967E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999997E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999971E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999974E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999976E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999979E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999998E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999983E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999986E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999988E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.1879048192999999E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999993E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999995E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.18790481929999998E10,TO_ZERO] --> [~1879048192,~1879048192] --> OK [~0.16106127370000153E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000015E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000148E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000145E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000143E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000014E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000138E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000136E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000134E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000013E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000129E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000126E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000124E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000122E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000012E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000117E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000114E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000112E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000011E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000107E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000105E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000103E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.161061273700001E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000098E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000095E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000093E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000009E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000088E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000086E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000083E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000008E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000079E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000076E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000074E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000072E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000007E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000067E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000064E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000062E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000006E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000057E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000055E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000052E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000005E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000048E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000045E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000043E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000004E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000038E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000036E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000033E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000003E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000029E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000026E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000024E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000021E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000002E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000017E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000014E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000012E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737000001E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000007E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000005E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127370000002E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.1610612737E10,TO_ZERO] --> [~1610612737,~1610612737] --> OK [~0.16106127369999847E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999985E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999852E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999855E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999857E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999986E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999862E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999864E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999866E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999987E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999871E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999874E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999876E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999878E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999988E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999883E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999886E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999888E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999989E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999893E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999895E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999897E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.161061273699999E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999902E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999905E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999907E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999991E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999912E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999914E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999917E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999992E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999921E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999924E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999926E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999928E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999993E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999933E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999936E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999938E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999994E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999943E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999945E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999948E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999995E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999952E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999955E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999957E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999996E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999962E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999964E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999967E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999997E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999971E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999974E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999976E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999979E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999998E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999983E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999986E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999988E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.1610612736999999E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999993E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999995E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.16106127369999998E10,TO_ZERO] --> [~1610612736,~1610612736] --> OK [~0.10737418250000153E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000015E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000148E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000145E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000143E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000014E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000138E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000136E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000134E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000013E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000129E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000126E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000124E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000122E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000012E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000117E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000114E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000112E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000011E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000107E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000105E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000103E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.107374182500001E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000098E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000095E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000093E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000009E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000088E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000086E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000083E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000008E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000079E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000076E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000074E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000072E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000007E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000067E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000064E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000062E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000006E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000057E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000055E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000052E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000005E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000048E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000045E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000043E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000004E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000038E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000036E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000033E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000003E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000029E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000026E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000024E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000021E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000002E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000017E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000014E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000012E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825000001E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000007E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000005E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418250000002E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.1073741825E10,TO_ZERO] --> [~1073741825,~1073741825] --> OK [~0.10737418249999847E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999985E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999852E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999855E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999857E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999986E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999862E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999864E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999866E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999987E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999871E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999874E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999876E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999878E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999988E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999883E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999886E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999888E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999989E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999893E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999895E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999897E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.107374182499999E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999902E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999905E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999907E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999991E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999912E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999914E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999917E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999992E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999921E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999924E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999926E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999928E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999993E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999933E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999936E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999938E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999994E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999943E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999945E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999948E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999995E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999952E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999955E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999957E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999996E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999962E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999964E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999967E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999997E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999971E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999974E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999976E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999979E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999998E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999983E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999986E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999988E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.1073741824999999E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999993E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999995E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.10737418249999998E10,TO_ZERO] --> [~1073741824,~1073741824] --> OK [~0.30000000000000284E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000028E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000275E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000027E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000266E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000026E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000258E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000253E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000025E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000244E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000024E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000235E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000023E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000226E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000022E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000218E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000213E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000021E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000204E1,TO_ZERO] --> [~3,~3] --> OK [~0.300000000000002E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000195E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000019E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000187E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000018E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000178E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000173E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000017E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000164E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000016E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000155E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000015E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000147E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000014E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000138E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000133E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000013E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000124E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000012E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000115E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000011E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000107E1,TO_ZERO] --> [~3,~3] --> OK [~0.300000000000001E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000098E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000093E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000009E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000084E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000008E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000075E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000007E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000067E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000006E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000058E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000053E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000005E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000044E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000004E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000036E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000003E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000027E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000002E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000018E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000013E1,TO_ZERO] --> [~3,~3] --> OK [~0.3000000000000001E1,TO_ZERO] --> [~3,~3] --> OK [~0.30000000000000004E1,TO_ZERO] --> [~3,~3] --> OK [~0.3E1,TO_ZERO] --> [~3,~3] --> OK [~0.29999999999999716E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999972E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999725E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999973E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999734E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999974E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999742E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999747E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999975E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999756E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999976E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999765E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999977E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999774E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999978E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999782E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999787E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999979E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999796E1,TO_ZERO] --> [~2,~2] --> OK [~0.299999999999998E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999805E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999981E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999813E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999982E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999822E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999827E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999983E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999836E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999984E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999845E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999985E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999853E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999986E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999862E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999867E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999987E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999876E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999988E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999885E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999989E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999893E1,TO_ZERO] --> [~2,~2] --> OK [~0.299999999999999E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999902E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999907E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999991E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999916E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999992E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999925E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999993E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999933E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999994E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999942E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999947E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999995E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999956E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999996E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999964E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999997E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999973E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999998E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999982E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999987E1,TO_ZERO] --> [~2,~2] --> OK [~0.2999999999999999E1,TO_ZERO] --> [~2,~2] --> OK [~0.29999999999999996E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000284E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000028E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000275E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000027E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000266E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000026E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000258E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000253E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000025E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000244E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000024E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000235E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000023E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000226E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000022E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000218E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000213E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000021E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000204E1,TO_ZERO] --> [~2,~2] --> OK [~0.200000000000002E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000195E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000019E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000187E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000018E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000178E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000173E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000017E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000164E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000016E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000155E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000015E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000147E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000014E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000138E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000133E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000013E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000124E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000012E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000115E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000011E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000107E1,TO_ZERO] --> [~2,~2] --> OK [~0.200000000000001E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000098E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000093E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000009E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000084E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000008E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000075E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000007E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000067E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000006E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000058E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000053E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000005E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000044E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000004E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000036E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000003E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000027E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000002E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000018E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000013E1,TO_ZERO] --> [~2,~2] --> OK [~0.2000000000000001E1,TO_ZERO] --> [~2,~2] --> OK [~0.20000000000000004E1,TO_ZERO] --> [~2,~2] --> OK [~0.2E1,TO_ZERO] --> [~2,~2] --> OK [~0.19999999999999858E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999986E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999862E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999865E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999867E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999987E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999871E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999873E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999876E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999878E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999988E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999882E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999885E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999887E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999989E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999891E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999893E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999896E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999898E1,TO_ZERO] --> [~1,~1] --> OK [~0.199999999999999E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999902E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999905E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999907E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999991E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999911E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999913E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999916E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999918E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999992E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999922E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999925E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999927E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999993E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999931E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999933E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999936E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999938E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999994E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999942E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999944E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999947E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999995E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999951E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999953E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999956E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999958E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999996E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999962E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999964E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999967E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999997E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999971E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999973E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999976E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999978E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999998E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999982E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999984E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999987E1,TO_ZERO] --> [~1,~1] --> OK [~0.1999999999999999E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999991E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999993E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999996E1,TO_ZERO] --> [~1,~1] --> OK [~0.19999999999999998E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000142E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000014E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000138E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000135E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000133E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000013E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000129E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000127E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000124E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000122E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000012E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000118E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000115E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000113E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000011E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000109E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000107E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000104E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000102E1,TO_ZERO] --> [~1,~1] --> OK [~0.100000000000001E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000098E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000095E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000093E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000009E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000089E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000087E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000084E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000082E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000008E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000078E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000075E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000073E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000007E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000069E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000067E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000064E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000062E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000006E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000058E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000056E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000053E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000005E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000049E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000047E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000044E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000042E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000004E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000038E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000036E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000033E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000003E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000029E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000027E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000024E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000022E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000002E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000018E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000016E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000013E1,TO_ZERO] --> [~1,~1] --> OK [~0.1000000000000001E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000009E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000007E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000004E1,TO_ZERO] --> [~1,~1] --> OK [~0.10000000000000002E1,TO_ZERO] --> [~1,~1] --> OK [~0.1E1,TO_ZERO] --> [~1,~1] --> OK [~0.9999999999999929,TO_ZERO] --> [0,0] --> OK [~0.999999999999993,TO_ZERO] --> [0,0] --> OK [~0.9999999999999931,TO_ZERO] --> [0,0] --> OK [~0.9999999999999932,TO_ZERO] --> [0,0] --> OK [~0.9999999999999933,TO_ZERO] --> [0,0] --> OK [~0.9999999999999934,TO_ZERO] --> [0,0] --> OK [~0.9999999999999936,TO_ZERO] --> [0,0] --> OK [~0.9999999999999937,TO_ZERO] --> [0,0] --> OK [~0.9999999999999938,TO_ZERO] --> [0,0] --> OK [~0.9999999999999939,TO_ZERO] --> [0,0] --> OK [~0.999999999999994,TO_ZERO] --> [0,0] --> OK [~0.9999999999999941,TO_ZERO] --> [0,0] --> OK [~0.9999999999999942,TO_ZERO] --> [0,0] --> OK [~0.9999999999999943,TO_ZERO] --> [0,0] --> OK [~0.9999999999999944,TO_ZERO] --> [0,0] --> OK [~0.9999999999999946,TO_ZERO] --> [0,0] --> OK [~0.9999999999999947,TO_ZERO] --> [0,0] --> OK [~0.9999999999999948,TO_ZERO] --> [0,0] --> OK [~0.9999999999999949,TO_ZERO] --> [0,0] --> OK [~0.999999999999995,TO_ZERO] --> [0,0] --> OK [~0.9999999999999951,TO_ZERO] --> [0,0] --> OK [~0.9999999999999952,TO_ZERO] --> [0,0] --> OK [~0.9999999999999953,TO_ZERO] --> [0,0] --> OK [~0.9999999999999954,TO_ZERO] --> [0,0] --> OK [~0.9999999999999956,TO_ZERO] --> [0,0] --> OK [~0.9999999999999957,TO_ZERO] --> [0,0] --> OK [~0.9999999999999958,TO_ZERO] --> [0,0] --> OK [~0.9999999999999959,TO_ZERO] --> [0,0] --> OK [~0.999999999999996,TO_ZERO] --> [0,0] --> OK [~0.9999999999999961,TO_ZERO] --> [0,0] --> OK [~0.9999999999999962,TO_ZERO] --> [0,0] --> OK [~0.9999999999999963,TO_ZERO] --> [0,0] --> OK [~0.9999999999999964,TO_ZERO] --> [0,0] --> OK [~0.9999999999999966,TO_ZERO] --> [0,0] --> OK [~0.9999999999999967,TO_ZERO] --> [0,0] --> OK [~0.9999999999999968,TO_ZERO] --> [0,0] --> OK [~0.9999999999999969,TO_ZERO] --> [0,0] --> OK [~0.999999999999997,TO_ZERO] --> [0,0] --> OK [~0.9999999999999971,TO_ZERO] --> [0,0] --> OK [~0.9999999999999972,TO_ZERO] --> [0,0] --> OK [~0.9999999999999973,TO_ZERO] --> [0,0] --> OK [~0.9999999999999974,TO_ZERO] --> [0,0] --> OK [~0.9999999999999976,TO_ZERO] --> [0,0] --> OK [~0.9999999999999977,TO_ZERO] --> [0,0] --> OK [~0.9999999999999978,TO_ZERO] --> [0,0] --> OK [~0.9999999999999979,TO_ZERO] --> [0,0] --> OK [~0.999999999999998,TO_ZERO] --> [0,0] --> OK [~0.9999999999999981,TO_ZERO] --> [0,0] --> OK [~0.9999999999999982,TO_ZERO] --> [0,0] --> OK [~0.9999999999999983,TO_ZERO] --> [0,0] --> OK [~0.9999999999999984,TO_ZERO] --> [0,0] --> OK [~0.9999999999999986,TO_ZERO] --> [0,0] --> OK [~0.9999999999999987,TO_ZERO] --> [0,0] --> OK [~0.9999999999999988,TO_ZERO] --> [0,0] --> OK [~0.9999999999999989,TO_ZERO] --> [0,0] --> OK [~0.999999999999999,TO_ZERO] --> [0,0] --> OK [~0.9999999999999991,TO_ZERO] --> [0,0] --> OK [~0.9999999999999992,TO_ZERO] --> [0,0] --> OK [~0.9999999999999993,TO_ZERO] --> [0,0] --> OK [~0.9999999999999994,TO_ZERO] --> [0,0] --> OK [~0.9999999999999996,TO_ZERO] --> [0,0] --> OK [~0.9999999999999997,TO_ZERO] --> [0,0] --> OK [~0.9999999999999998,TO_ZERO] --> [0,0] --> OK [~0.9999999999999999,TO_ZERO] --> [0,0] --> OK [~0.316E~321,TO_ZERO] --> [0,0] --> OK [~0.31E~321,TO_ZERO] --> [0,0] --> OK [~0.306E~321,TO_ZERO] --> [0,0] --> OK [~0.3E~321,TO_ZERO] --> [0,0] --> OK [~0.296E~321,TO_ZERO] --> [0,0] --> OK [~0.29E~321,TO_ZERO] --> [0,0] --> OK [~0.287E~321,TO_ZERO] --> [0,0] --> OK [~0.28E~321,TO_ZERO] --> [0,0] --> OK [~0.277E~321,TO_ZERO] --> [0,0] --> OK [~0.27E~321,TO_ZERO] --> [0,0] --> OK [~0.267E~321,TO_ZERO] --> [0,0] --> OK [~0.26E~321,TO_ZERO] --> [0,0] --> OK [~0.257E~321,TO_ZERO] --> [0,0] --> OK [~0.25E~321,TO_ZERO] --> [0,0] --> OK [~0.247E~321,TO_ZERO] --> [0,0] --> OK [~0.24E~321,TO_ZERO] --> [0,0] --> OK [~0.237E~321,TO_ZERO] --> [0,0] --> OK [~0.23E~321,TO_ZERO] --> [0,0] --> OK [~0.227E~321,TO_ZERO] --> [0,0] --> OK [~0.22E~321,TO_ZERO] --> [0,0] --> OK [~0.217E~321,TO_ZERO] --> [0,0] --> OK [~0.21E~321,TO_ZERO] --> [0,0] --> OK [~0.208E~321,TO_ZERO] --> [0,0] --> OK [~0.203E~321,TO_ZERO] --> [0,0] --> OK [~0.2E~321,TO_ZERO] --> [0,0] --> OK [~0.193E~321,TO_ZERO] --> [0,0] --> OK [~0.19E~321,TO_ZERO] --> [0,0] --> OK [~0.183E~321,TO_ZERO] --> [0,0] --> OK [~0.18E~321,TO_ZERO] --> [0,0] --> OK [~0.173E~321,TO_ZERO] --> [0,0] --> OK [~0.17E~321,TO_ZERO] --> [0,0] --> OK [~0.163E~321,TO_ZERO] --> [0,0] --> OK [~0.16E~321,TO_ZERO] --> [0,0] --> OK [~0.153E~321,TO_ZERO] --> [0,0] --> OK [~0.15E~321,TO_ZERO] --> [0,0] --> OK [~0.143E~321,TO_ZERO] --> [0,0] --> OK [~0.14E~321,TO_ZERO] --> [0,0] --> OK [~0.133E~321,TO_ZERO] --> [0,0] --> OK [~0.13E~321,TO_ZERO] --> [0,0] --> OK [~0.124E~321,TO_ZERO] --> [0,0] --> OK [~0.12E~321,TO_ZERO] --> [0,0] --> OK [~0.114E~321,TO_ZERO] --> [0,0] --> OK [~0.11E~321,TO_ZERO] --> [0,0] --> OK [~0.104E~321,TO_ZERO] --> [0,0] --> OK [~0.1E~321,TO_ZERO] --> [0,0] --> OK [~0.94E~322,TO_ZERO] --> [0,0] --> OK [~0.9E~322,TO_ZERO] --> [0,0] --> OK [~0.84E~322,TO_ZERO] --> [0,0] --> OK [~0.8E~322,TO_ZERO] --> [0,0] --> OK [~0.74E~322,TO_ZERO] --> [0,0] --> OK [~0.7E~322,TO_ZERO] --> [0,0] --> OK [~0.64E~322,TO_ZERO] --> [0,0] --> OK [~0.6E~322,TO_ZERO] --> [0,0] --> OK [~0.54E~322,TO_ZERO] --> [0,0] --> OK [~0.5E~322,TO_ZERO] --> [0,0] --> OK [~0.44E~322,TO_ZERO] --> [0,0] --> OK [~0.4E~322,TO_ZERO] --> [0,0] --> OK [~0.35E~322,TO_ZERO] --> [0,0] --> OK [~0.3E~322,TO_ZERO] --> [0,0] --> OK [~0.25E~322,TO_ZERO] --> [0,0] --> OK [~0.2E~322,TO_ZERO] --> [0,0] --> OK [~0.15E~322,TO_ZERO] --> [0,0] --> OK [~0.1E~322,TO_ZERO] --> [0,0] --> OK [~0.5E~323,TO_ZERO] --> [0,0] --> OK [0.0,TO_ZERO] --> [0,0] --> OK [0.316E~321,TO_ZERO] --> [0,0] --> OK [0.31E~321,TO_ZERO] --> [0,0] --> OK [0.306E~321,TO_ZERO] --> [0,0] --> OK [0.3E~321,TO_ZERO] --> [0,0] --> OK [0.296E~321,TO_ZERO] --> [0,0] --> OK [0.29E~321,TO_ZERO] --> [0,0] --> OK [0.287E~321,TO_ZERO] --> [0,0] --> OK [0.28E~321,TO_ZERO] --> [0,0] --> OK [0.277E~321,TO_ZERO] --> [0,0] --> OK [0.27E~321,TO_ZERO] --> [0,0] --> OK [0.267E~321,TO_ZERO] --> [0,0] --> OK [0.26E~321,TO_ZERO] --> [0,0] --> OK [0.257E~321,TO_ZERO] --> [0,0] --> OK [0.25E~321,TO_ZERO] --> [0,0] --> OK [0.247E~321,TO_ZERO] --> [0,0] --> OK [0.24E~321,TO_ZERO] --> [0,0] --> OK [0.237E~321,TO_ZERO] --> [0,0] --> OK [0.23E~321,TO_ZERO] --> [0,0] --> OK [0.227E~321,TO_ZERO] --> [0,0] --> OK [0.22E~321,TO_ZERO] --> [0,0] --> OK [0.217E~321,TO_ZERO] --> [0,0] --> OK [0.21E~321,TO_ZERO] --> [0,0] --> OK [0.208E~321,TO_ZERO] --> [0,0] --> OK [0.203E~321,TO_ZERO] --> [0,0] --> OK [0.2E~321,TO_ZERO] --> [0,0] --> OK [0.193E~321,TO_ZERO] --> [0,0] --> OK [0.19E~321,TO_ZERO] --> [0,0] --> OK [0.183E~321,TO_ZERO] --> [0,0] --> OK [0.18E~321,TO_ZERO] --> [0,0] --> OK [0.173E~321,TO_ZERO] --> [0,0] --> OK [0.17E~321,TO_ZERO] --> [0,0] --> OK [0.163E~321,TO_ZERO] --> [0,0] --> OK [0.16E~321,TO_ZERO] --> [0,0] --> OK [0.153E~321,TO_ZERO] --> [0,0] --> OK [0.15E~321,TO_ZERO] --> [0,0] --> OK [0.143E~321,TO_ZERO] --> [0,0] --> OK [0.14E~321,TO_ZERO] --> [0,0] --> OK [0.133E~321,TO_ZERO] --> [0,0] --> OK [0.13E~321,TO_ZERO] --> [0,0] --> OK [0.124E~321,TO_ZERO] --> [0,0] --> OK [0.12E~321,TO_ZERO] --> [0,0] --> OK [0.114E~321,TO_ZERO] --> [0,0] --> OK [0.11E~321,TO_ZERO] --> [0,0] --> OK [0.104E~321,TO_ZERO] --> [0,0] --> OK [0.1E~321,TO_ZERO] --> [0,0] --> OK [0.94E~322,TO_ZERO] --> [0,0] --> OK [0.9E~322,TO_ZERO] --> [0,0] --> OK [0.84E~322,TO_ZERO] --> [0,0] --> OK [0.8E~322,TO_ZERO] --> [0,0] --> OK [0.74E~322,TO_ZERO] --> [0,0] --> OK [0.7E~322,TO_ZERO] --> [0,0] --> OK [0.64E~322,TO_ZERO] --> [0,0] --> OK [0.6E~322,TO_ZERO] --> [0,0] --> OK [0.54E~322,TO_ZERO] --> [0,0] --> OK [0.5E~322,TO_ZERO] --> [0,0] --> OK [0.44E~322,TO_ZERO] --> [0,0] --> OK [0.4E~322,TO_ZERO] --> [0,0] --> OK [0.35E~322,TO_ZERO] --> [0,0] --> OK [0.3E~322,TO_ZERO] --> [0,0] --> OK [0.25E~322,TO_ZERO] --> [0,0] --> OK [0.2E~322,TO_ZERO] --> [0,0] --> OK [0.15E~322,TO_ZERO] --> [0,0] --> OK [0.1E~322,TO_ZERO] --> [0,0] --> OK [0.5E~323,TO_ZERO] --> [0,0] --> OK [0.9999999999999929,TO_ZERO] --> [0,0] --> OK [0.999999999999993,TO_ZERO] --> [0,0] --> OK [0.9999999999999931,TO_ZERO] --> [0,0] --> OK [0.9999999999999932,TO_ZERO] --> [0,0] --> OK [0.9999999999999933,TO_ZERO] --> [0,0] --> OK [0.9999999999999934,TO_ZERO] --> [0,0] --> OK [0.9999999999999936,TO_ZERO] --> [0,0] --> OK [0.9999999999999937,TO_ZERO] --> [0,0] --> OK [0.9999999999999938,TO_ZERO] --> [0,0] --> OK [0.9999999999999939,TO_ZERO] --> [0,0] --> OK [0.999999999999994,TO_ZERO] --> [0,0] --> OK [0.9999999999999941,TO_ZERO] --> [0,0] --> OK [0.9999999999999942,TO_ZERO] --> [0,0] --> OK [0.9999999999999943,TO_ZERO] --> [0,0] --> OK [0.9999999999999944,TO_ZERO] --> [0,0] --> OK [0.9999999999999946,TO_ZERO] --> [0,0] --> OK [0.9999999999999947,TO_ZERO] --> [0,0] --> OK [0.9999999999999948,TO_ZERO] --> [0,0] --> OK [0.9999999999999949,TO_ZERO] --> [0,0] --> OK [0.999999999999995,TO_ZERO] --> [0,0] --> OK [0.9999999999999951,TO_ZERO] --> [0,0] --> OK [0.9999999999999952,TO_ZERO] --> [0,0] --> OK [0.9999999999999953,TO_ZERO] --> [0,0] --> OK [0.9999999999999954,TO_ZERO] --> [0,0] --> OK [0.9999999999999956,TO_ZERO] --> [0,0] --> OK [0.9999999999999957,TO_ZERO] --> [0,0] --> OK [0.9999999999999958,TO_ZERO] --> [0,0] --> OK [0.9999999999999959,TO_ZERO] --> [0,0] --> OK [0.999999999999996,TO_ZERO] --> [0,0] --> OK [0.9999999999999961,TO_ZERO] --> [0,0] --> OK [0.9999999999999962,TO_ZERO] --> [0,0] --> OK [0.9999999999999963,TO_ZERO] --> [0,0] --> OK [0.9999999999999964,TO_ZERO] --> [0,0] --> OK [0.9999999999999966,TO_ZERO] --> [0,0] --> OK [0.9999999999999967,TO_ZERO] --> [0,0] --> OK [0.9999999999999968,TO_ZERO] --> [0,0] --> OK [0.9999999999999969,TO_ZERO] --> [0,0] --> OK [0.999999999999997,TO_ZERO] --> [0,0] --> OK [0.9999999999999971,TO_ZERO] --> [0,0] --> OK [0.9999999999999972,TO_ZERO] --> [0,0] --> OK [0.9999999999999973,TO_ZERO] --> [0,0] --> OK [0.9999999999999974,TO_ZERO] --> [0,0] --> OK [0.9999999999999976,TO_ZERO] --> [0,0] --> OK [0.9999999999999977,TO_ZERO] --> [0,0] --> OK [0.9999999999999978,TO_ZERO] --> [0,0] --> OK [0.9999999999999979,TO_ZERO] --> [0,0] --> OK [0.999999999999998,TO_ZERO] --> [0,0] --> OK [0.9999999999999981,TO_ZERO] --> [0,0] --> OK [0.9999999999999982,TO_ZERO] --> [0,0] --> OK [0.9999999999999983,TO_ZERO] --> [0,0] --> OK [0.9999999999999984,TO_ZERO] --> [0,0] --> OK [0.9999999999999986,TO_ZERO] --> [0,0] --> OK [0.9999999999999987,TO_ZERO] --> [0,0] --> OK [0.9999999999999988,TO_ZERO] --> [0,0] --> OK [0.9999999999999989,TO_ZERO] --> [0,0] --> OK [0.999999999999999,TO_ZERO] --> [0,0] --> OK [0.9999999999999991,TO_ZERO] --> [0,0] --> OK [0.9999999999999992,TO_ZERO] --> [0,0] --> OK [0.9999999999999993,TO_ZERO] --> [0,0] --> OK [0.9999999999999994,TO_ZERO] --> [0,0] --> OK [0.9999999999999996,TO_ZERO] --> [0,0] --> OK [0.9999999999999997,TO_ZERO] --> [0,0] --> OK [0.9999999999999998,TO_ZERO] --> [0,0] --> OK [0.9999999999999999,TO_ZERO] --> [0,0] --> OK [0.1E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000142E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000014E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000138E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000135E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000133E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000013E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000129E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000127E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000124E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000122E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000012E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000118E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000115E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000113E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000011E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000109E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000107E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000104E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000102E1,TO_ZERO] --> [1,1] --> OK [0.100000000000001E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000098E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000095E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000093E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000009E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000089E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000087E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000084E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000082E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000008E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000078E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000075E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000073E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000007E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000069E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000067E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000064E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000062E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000006E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000058E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000056E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000053E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000005E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000049E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000047E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000044E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000042E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000004E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000038E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000036E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000033E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000003E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000029E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000027E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000024E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000022E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000002E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000018E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000016E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000013E1,TO_ZERO] --> [1,1] --> OK [0.1000000000000001E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000009E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000007E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000004E1,TO_ZERO] --> [1,1] --> OK [0.10000000000000002E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999858E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999986E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999862E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999865E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999867E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999987E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999871E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999873E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999876E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999878E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999988E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999882E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999885E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999887E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999989E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999891E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999893E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999896E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999898E1,TO_ZERO] --> [1,1] --> OK [0.199999999999999E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999902E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999905E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999907E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999991E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999911E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999913E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999916E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999918E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999992E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999922E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999925E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999927E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999993E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999931E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999933E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999936E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999938E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999994E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999942E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999944E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999947E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999995E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999951E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999953E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999956E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999958E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999996E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999962E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999964E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999967E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999997E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999971E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999973E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999976E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999978E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999998E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999982E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999984E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999987E1,TO_ZERO] --> [1,1] --> OK [0.1999999999999999E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999991E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999993E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999996E1,TO_ZERO] --> [1,1] --> OK [0.19999999999999998E1,TO_ZERO] --> [1,1] --> OK [0.2E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000284E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000028E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000275E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000027E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000266E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000026E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000258E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000253E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000025E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000244E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000024E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000235E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000023E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000226E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000022E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000218E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000213E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000021E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000204E1,TO_ZERO] --> [2,2] --> OK [0.200000000000002E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000195E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000019E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000187E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000018E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000178E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000173E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000017E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000164E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000016E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000155E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000015E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000147E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000014E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000138E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000133E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000013E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000124E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000012E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000115E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000011E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000107E1,TO_ZERO] --> [2,2] --> OK [0.200000000000001E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000098E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000093E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000009E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000084E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000008E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000075E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000007E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000067E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000006E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000058E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000053E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000005E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000044E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000004E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000036E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000003E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000027E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000002E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000018E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000013E1,TO_ZERO] --> [2,2] --> OK [0.2000000000000001E1,TO_ZERO] --> [2,2] --> OK [0.20000000000000004E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999716E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999972E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999725E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999973E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999734E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999974E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999742E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999747E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999975E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999756E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999976E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999765E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999977E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999774E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999978E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999782E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999787E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999979E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999796E1,TO_ZERO] --> [2,2] --> OK [0.299999999999998E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999805E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999981E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999813E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999982E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999822E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999827E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999983E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999836E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999984E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999845E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999985E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999853E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999986E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999862E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999867E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999987E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999876E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999988E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999885E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999989E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999893E1,TO_ZERO] --> [2,2] --> OK [0.299999999999999E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999902E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999907E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999991E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999916E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999992E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999925E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999993E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999933E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999994E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999942E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999947E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999995E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999956E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999996E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999964E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999997E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999973E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999998E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999982E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999987E1,TO_ZERO] --> [2,2] --> OK [0.2999999999999999E1,TO_ZERO] --> [2,2] --> OK [0.29999999999999996E1,TO_ZERO] --> [2,2] --> OK [0.3E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000284E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000028E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000275E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000027E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000266E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000026E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000258E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000253E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000025E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000244E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000024E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000235E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000023E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000226E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000022E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000218E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000213E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000021E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000204E1,TO_ZERO] --> [3,3] --> OK [0.300000000000002E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000195E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000019E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000187E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000018E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000178E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000173E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000017E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000164E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000016E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000155E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000015E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000147E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000014E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000138E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000133E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000013E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000124E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000012E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000115E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000011E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000107E1,TO_ZERO] --> [3,3] --> OK [0.300000000000001E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000098E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000093E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000009E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000084E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000008E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000075E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000007E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000067E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000006E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000058E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000053E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000005E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000044E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000004E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000036E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000003E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000027E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000002E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000018E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000013E1,TO_ZERO] --> [3,3] --> OK [0.3000000000000001E1,TO_ZERO] --> [3,3] --> OK [0.30000000000000004E1,TO_ZERO] --> [3,3] --> OK [0.10737418239999924E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999925E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999926E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999927E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999928E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999993E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999931E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999932E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999933E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999934E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999936E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999937E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999938E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999939E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999994E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999942E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999943E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999944E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999945E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999946E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999948E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999949E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999995E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999951E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999952E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999954E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999955E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999956E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999957E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999958E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999996E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999961E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999962E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999963E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999964E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999965E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999967E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999968E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999969E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999997E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999971E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999973E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999974E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999975E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999976E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999977E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999979E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999998E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999981E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999982E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999983E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999985E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999986E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999987E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999988E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999989E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741823999999E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999992E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999993E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999994E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999995E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999996E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999998E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.10737418239999999E10,TO_ZERO] --> [1073741823,1073741823] --> OK [0.1073741824E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000153E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000015E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000148E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000145E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000143E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000014E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000138E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000136E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000134E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000013E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000129E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000126E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000124E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000122E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000012E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000117E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000114E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000112E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000011E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000107E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000105E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000103E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.107374182400001E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000098E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000095E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000093E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000009E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000088E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000086E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000083E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000008E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000079E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000076E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000074E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000072E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000007E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000067E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000064E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000062E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000006E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000057E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000055E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000052E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000005E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000048E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000045E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000043E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000004E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000038E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000036E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000033E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000003E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000029E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000026E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000024E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000021E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000002E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000017E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000014E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000012E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.1073741824000001E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000007E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000005E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.10737418240000002E10,TO_ZERO] --> [1073741824,1073741824] --> OK [0.16106127359999847E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999985E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999852E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999855E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999857E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999986E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999862E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999864E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999866E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999987E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999871E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999874E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999876E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999878E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999988E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999883E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999886E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999888E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999989E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999893E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999895E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999897E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.161061273599999E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999902E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999905E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999907E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999991E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999912E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999914E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999917E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999992E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999921E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999924E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999926E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999928E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999993E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999933E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999936E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999938E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999994E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999943E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999945E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999948E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999995E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999952E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999955E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999957E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999996E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999962E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999964E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999967E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999997E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999971E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999974E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999976E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999979E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999998E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999983E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999986E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999988E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612735999999E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999993E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999995E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.16106127359999998E10,TO_ZERO] --> [1610612735,1610612735] --> OK [0.1610612736E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000153E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000015E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000148E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000145E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000143E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000014E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000138E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000136E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000134E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000013E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000129E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000126E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000124E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000122E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000012E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000117E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000114E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000112E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000011E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000107E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000105E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000103E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.161061273600001E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000098E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000095E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000093E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000009E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000088E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000086E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000083E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000008E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000079E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000076E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000074E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000072E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000007E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000067E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000064E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000062E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000006E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000057E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000055E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000052E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000005E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000048E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000045E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000043E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000004E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000038E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000036E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000033E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000003E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000029E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000026E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000024E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000021E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000002E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000017E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000014E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000012E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.1610612736000001E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000007E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000005E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.16106127360000002E10,TO_ZERO] --> [1610612736,1610612736] --> OK [0.18790481919999847E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999985E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999852E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999855E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999857E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999986E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999862E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999864E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999866E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999987E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999871E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999874E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999876E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999878E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999988E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999883E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999886E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999888E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999989E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999893E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999895E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999897E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.187904819199999E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999902E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999905E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999907E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999991E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999912E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999914E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999917E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999992E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999921E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999924E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999926E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999928E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999993E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999933E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999936E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999938E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999994E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999943E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999945E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999948E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999995E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999952E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999955E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999957E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999996E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999962E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999964E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999967E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999997E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999971E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999974E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999976E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999979E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999998E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999983E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999986E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999988E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048191999999E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999993E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999995E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.18790481919999998E10,TO_ZERO] --> [1879048191,1879048191] --> OK [0.1879048192E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000153E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000015E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000148E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000145E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000143E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000014E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000138E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000136E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000134E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000013E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000129E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000126E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000124E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000122E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000012E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000117E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000114E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000112E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000011E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000107E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000105E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000103E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.187904819200001E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000098E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000095E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000093E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000009E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000088E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000086E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000083E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000008E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000079E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000076E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000074E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000072E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000007E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000067E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000064E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000062E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000006E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000057E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000055E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000052E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000005E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000048E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000045E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000043E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000004E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000038E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000036E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000033E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000003E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000029E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000026E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000024E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000021E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000002E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000017E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000014E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000012E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.1879048192000001E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000007E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000005E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.18790481920000002E10,TO_ZERO] --> [1879048192,1879048192] --> OK [0.20132659199999847E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999985E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999852E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999855E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999857E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999986E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999862E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999864E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999866E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999987E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999871E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999874E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999876E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999878E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999988E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999883E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999886E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999888E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999989E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999893E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999895E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999897E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.201326591999999E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999902E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999905E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999907E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999991E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999912E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999914E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999917E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999992E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999921E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999924E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999926E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999928E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999993E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999933E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999936E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999938E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999994E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999943E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999945E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999948E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999995E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999952E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999955E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999957E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999996E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999962E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999964E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999967E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999997E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999971E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999974E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999976E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999979E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999998E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999983E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999986E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999988E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.2013265919999999E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999993E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999995E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.20132659199999998E10,TO_ZERO] --> [2013265919,2013265919] --> OK [0.201326592E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000153E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000015E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000148E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000145E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000143E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000014E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000138E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000136E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000134E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000013E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000129E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000126E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000124E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000122E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000012E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000117E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000114E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000112E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000011E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000107E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000105E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000103E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.201326592000001E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000098E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000095E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000093E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000009E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000088E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000086E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000083E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000008E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000079E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000076E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000074E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000072E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000007E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000067E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000064E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000062E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000006E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000057E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000055E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000052E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000005E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000048E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000045E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000043E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000004E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000038E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000036E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000033E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000003E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000029E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000026E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000024E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000021E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000002E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000017E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000014E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000012E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.2013265920000001E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000007E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000005E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20132659200000002E10,TO_ZERO] --> [2013265920,2013265920] --> OK [0.20803747839999847E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999985E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999852E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999855E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999857E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999986E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999862E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999864E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999866E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999987E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999871E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999874E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999876E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999878E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999988E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999883E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999886E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999888E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999989E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999893E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999895E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999897E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.208037478399999E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999902E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999905E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999907E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999991E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999912E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999914E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999917E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999992E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999921E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999924E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999926E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999928E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999993E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999933E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999936E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999938E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999994E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999943E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999945E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999948E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999995E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999952E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999955E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999957E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999996E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999962E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999964E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999967E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999997E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999971E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999974E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999976E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999979E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999998E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999983E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999986E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999988E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374783999999E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999993E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999995E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.20803747839999998E10,TO_ZERO] --> [2080374783,2080374783] --> OK [0.2080374784E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000153E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000015E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000148E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000145E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000143E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000014E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000138E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000136E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000134E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000013E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000129E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000126E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000124E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000122E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000012E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000117E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000114E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000112E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000011E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000107E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000105E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000103E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.208037478400001E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000098E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000095E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000093E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000009E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000088E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000086E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000083E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000008E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000079E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000076E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000074E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000072E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000007E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000067E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000064E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000062E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000006E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000057E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000055E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000052E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000005E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000048E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000045E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000043E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000004E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000038E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000036E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000033E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000003E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000029E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000026E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000024E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000021E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000002E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000017E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000014E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000012E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.2080374784000001E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000007E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000005E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.20803747840000002E10,TO_ZERO] --> [2080374784,2080374784] --> OK [0.21139292159999847E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999985E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999852E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999855E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999857E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999986E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999862E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999864E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999866E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999987E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999871E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999874E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999876E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999878E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999988E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999883E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999886E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999888E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999989E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999893E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999895E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999897E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.211392921599999E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999902E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999905E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999907E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999991E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999912E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999914E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999917E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999992E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999921E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999924E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999926E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999928E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999993E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999933E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999936E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999938E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999994E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999943E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999945E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999948E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999995E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999952E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999955E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999957E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999996E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999962E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999964E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999967E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999997E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999971E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999974E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999976E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999979E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999998E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999983E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999986E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999988E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929215999999E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999993E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999995E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.21139292159999998E10,TO_ZERO] --> [2113929215,2113929215] --> OK [0.2113929216E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000153E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000015E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000148E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000145E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000143E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000014E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000138E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000136E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000134E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000013E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000129E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000126E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000124E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000122E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000012E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000117E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000114E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000112E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000011E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000107E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000105E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000103E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.211392921600001E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000098E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000095E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000093E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000009E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000088E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000086E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000083E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000008E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000079E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000076E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000074E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000072E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000007E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000067E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000064E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000062E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000006E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000057E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000055E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000052E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000005E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000048E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000045E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000043E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000004E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000038E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000036E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000033E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000003E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000029E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000026E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000024E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000021E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000002E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000017E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000014E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000012E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.2113929216000001E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000007E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000005E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21139292160000002E10,TO_ZERO] --> [2113929216,2113929216] --> OK [0.21474836439999847E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999985E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999852E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999855E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999857E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999986E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999862E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999864E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999866E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999987E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999871E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999874E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999876E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999878E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999988E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999883E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999886E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999888E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999989E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999893E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999895E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999897E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.214748364399999E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999902E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999905E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999907E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999991E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999912E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999914E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999917E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999992E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999921E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999924E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999926E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999928E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999993E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999933E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999936E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999938E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999994E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999943E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999945E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999948E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999995E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999952E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999955E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999957E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999996E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999962E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999964E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999967E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999997E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999971E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999974E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999976E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999979E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999998E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999983E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999986E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999988E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483643999999E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999993E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999995E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.21474836439999998E10,TO_ZERO] --> [2147483643,2147483643] --> OK [0.2147483644E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000153E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000015E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000148E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000145E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000143E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000014E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000138E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000136E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000134E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000013E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000129E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000126E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000124E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000122E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000012E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000117E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000114E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000112E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000011E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000107E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000105E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000103E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.214748364400001E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000098E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000095E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000093E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000009E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000088E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000086E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000083E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000008E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000079E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000076E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000074E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000072E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000007E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000067E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000064E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000062E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000006E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000057E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000055E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000052E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000005E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000048E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000045E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000043E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000004E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000038E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000036E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000033E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000003E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000029E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000026E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000024E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000021E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000002E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000017E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000014E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000012E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644000001E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000007E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000005E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836440000002E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999847E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999985E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999852E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999855E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999857E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999986E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999862E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999864E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999866E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999987E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999871E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999874E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999876E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999878E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999988E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999883E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999886E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999888E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999989E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999893E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999895E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999897E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.214748364499999E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999902E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999905E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999907E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999991E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999912E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999914E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999917E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999992E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999921E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999924E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999926E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999928E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999993E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999933E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999936E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999938E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999994E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999943E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999945E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999948E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999995E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999952E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999955E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999957E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999996E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999962E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999964E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999967E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999997E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999971E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999974E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999976E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999979E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999998E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999983E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999986E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999988E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483644999999E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999993E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999995E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.21474836449999998E10,TO_ZERO] --> [2147483644,2147483644] --> OK [0.2147483645E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000153E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000015E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000148E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000145E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000143E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000014E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000138E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000136E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000134E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000013E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000129E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000126E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000124E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000122E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000012E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000117E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000114E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000112E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000011E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000107E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000105E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000103E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.214748364500001E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000098E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000095E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000093E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000009E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000088E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000086E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000083E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000008E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000079E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000076E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000074E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000072E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000007E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000067E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000064E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000062E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000006E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000057E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000055E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000052E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000005E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000048E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000045E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000043E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000004E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000038E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000036E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000033E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000003E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000029E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000026E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000024E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000021E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000002E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000017E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000014E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000012E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645000001E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000007E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000005E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836450000002E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999847E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999985E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999852E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999855E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999857E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999986E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999862E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999864E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999866E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999987E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999871E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999874E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999876E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999878E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999988E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999883E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999886E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999888E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999989E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999893E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999895E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999897E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.214748364599999E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999902E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999905E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999907E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999991E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999912E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999914E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999917E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999992E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999921E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999924E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999926E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999928E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999993E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999933E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999936E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999938E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999994E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999943E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999945E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999948E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999995E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999952E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999955E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999957E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999996E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999962E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999964E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999967E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999997E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999971E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999974E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999976E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999979E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999998E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999983E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999986E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999988E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483645999999E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999993E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999995E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.21474836459999998E10,TO_ZERO] --> [2147483645,2147483645] --> OK [0.2147483646E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000153E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000015E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000148E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000145E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000143E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000014E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000138E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000136E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000134E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000013E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000129E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000126E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000124E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000122E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000012E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000117E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000114E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000112E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000011E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000107E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000105E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000103E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.214748364600001E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000098E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000095E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000093E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000009E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000088E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000086E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000083E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000008E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000079E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000076E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000074E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000072E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000007E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000067E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000064E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000062E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000006E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000057E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000055E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000052E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000005E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000048E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000045E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000043E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000004E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000038E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000036E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000033E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000003E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000029E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000026E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000024E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000021E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000002E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000017E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000014E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000012E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646000001E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000007E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000005E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836460000002E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999847E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999985E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999852E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999855E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999857E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999986E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999862E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999864E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999866E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999987E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999871E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999874E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999876E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999878E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999988E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999883E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999886E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999888E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999989E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999893E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999895E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999897E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.214748364699999E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999902E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999905E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999907E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999991E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999912E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999914E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999917E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999992E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999921E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999924E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999926E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999928E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999993E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999933E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999936E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999938E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999994E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999943E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999945E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999948E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999995E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999952E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999955E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999957E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999996E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999962E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999964E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999967E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999997E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999971E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999974E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999976E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999979E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999998E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999983E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999986E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999988E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483646999999E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999993E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999995E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.21474836469999998E10,TO_ZERO] --> [2147483646,2147483646] --> OK [0.2147483647E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000153E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000015E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000148E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000145E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000143E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000014E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000138E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000136E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000134E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000013E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000129E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000126E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000124E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000122E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000012E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000117E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000114E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000112E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000011E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000107E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000105E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000103E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.214748364700001E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000098E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000095E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000093E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000009E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000088E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000086E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000083E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000008E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000079E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000076E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000074E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000072E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000007E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000067E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000064E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000062E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000006E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000057E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000055E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000052E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000005E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000048E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000045E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000043E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000004E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000038E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000036E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000033E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000003E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000029E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000026E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000024E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000021E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000002E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000017E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000014E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000012E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.2147483647000001E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000007E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000005E10,TO_ZERO] --> [2147483647,2147483647] --> OK [0.21474836470000002E10,TO_ZERO] --> [2147483647,2147483647] --> OK mlton-20100608/regression/real-int.sml0000644000076600000240000000724011404435617016177 0ustar mtfstafffunctor Test (structure Real : REAL) = struct datatype z = datatype IEEEReal.float_class datatype z = datatype IEEEReal.rounding_mode fun showReal r = print (Real.fmt StringCvt.EXACT r) fun showInt i = print (Int.fmt StringCvt.DEC i) fun showLargeInt li = print (LargeInt.fmt StringCvt.DEC li) fun showMode mode = case mode of TO_NEAREST => print "TO_NEAREST" | TO_NEGINF => print "TO_NEGINF" | TO_POSINF => print "TO_POSINF" | TO_ZERO => print "TO_ZERO" datatype 'a res = OK of 'a | OVERFLOW fun showRes showOk r = case r of OK x => showOk x | OVERFLOW => print "Overflow" fun wrap th = (OK (th ())) handle Overflow => OVERFLOW fun checkIntToReal i = let val li = Int.toLarge i val ri = Real.fromInt i val rli = Real.fromLargeInt li in () ; print "[" ; showInt i ; print "," ; showLargeInt li ; print "] --> [" ; showReal ri ; print "," ; showReal rli ; print "] --> " ; print (if Real.== (ri, rli) then "OK\n" else "BAD\n") ; () end fun checkRealToInt mode r = let val i = wrap (fn () => Real.toInt mode r) val li = Real.toLargeInt mode r in () ; print "[" ; showReal r ; print "," ; showMode mode ; print "] --> [" ; showRes showInt i ; print "," ; showLargeInt li ; print "] --> " ; print (if wrap (fn () => Int.fromLarge li) = i then "OK\n" else "BAD\n") ; () end val is : Int.int list = let val op + = Int.+ val op div = Int.div val op * = Int.* val ~ = Int.~ val op - = Int.- val minInt = valOf Int.minInt val maxInt = valOf Int.maxInt val (zero,one,two,three) = (Int.fromInt 0, Int.fromInt 1, Int.fromInt 2, Int.fromInt 3) val one_half = maxInt div two val four = two * two val one_fourth = maxInt div four val eight = four * two val one_eighth = maxInt div eight val sixteen = eight * two val one_sixteenth = maxInt div sixteen val thirtytwo = sixteen * two val one_thirtysecond = maxInt div thirtytwo val sixtyfour = thirtytwo * two val one_sixtyfourth = maxInt div sixtyfour in [minInt, minInt + one, minInt + two, minInt + three, minInt + one_sixtyfourth, minInt + one_thirtysecond, minInt + one_sixteenth, minInt + one_eighth, minInt + one_fourth, minInt + one_half, ~three,~two,~one,zero,one,two,three, maxInt - one_half, maxInt - one_fourth, maxInt - one_eighth, maxInt - one_sixteenth, maxInt - one_thirtysecond, maxInt - one_sixtyfourth, maxInt - three, maxInt - two, maxInt - one, maxInt] end val () = List.app checkIntToReal is val rs = List.map (fn i => let val r = Real.fromInt i fun make (fold,inf) = fold (fn (_,(r,l)) => let val r' = Real.nextAfter (r, inf) in (r',r'::l) end) (r,[]) (List.tabulate (64,fn _ => ())) val make = fn (fold,inf) => #2 (make (fold,inf)) in (make (foldl,Real.negInf)) @ [r] @ (make (foldr,Real.posInf)) end) is val rs = List.concat rs val () = List.app (checkRealToInt TO_NEAREST) rs val () = List.app (checkRealToInt TO_NEGINF) rs val () = List.app (checkRealToInt TO_POSINF) rs val () = List.app (checkRealToInt TO_ZERO) rs end structure Z = Test (structure Real = Real32) structure Z = Test (structure Real = Real64) mlton-20100608/regression/real-str.ok0000644000076600000240000000016211404435621016022 0ustar mtfstaffYES BFB999999999999A BFB9999999999999 YES BFB999999999999A BFB9999999999999 YES 3FB999999999999A 3FB999999999999A mlton-20100608/regression/real-str.sml0000644000076600000240000000232711404435620016210 0ustar mtfstaff structure I = IEEEReal structure R = Real structure V = Word8Vector structure P = PackRealBig fun down() = I.setRoundingMode I.TO_NEGINF fun up() = I.setRoundingMode I.TO_POSINF fun word8vectorToString v = V.foldr (fn(w,s) => Word8.toString w ^ s) "" v val _ = down() val x = ~1.0/10.0 val _ = up() val y = ~1.0/10.0 val _ = if R.<=(x,y) then print "YES\n" else print "NO\n" val _ = print(word8vectorToString (P.toBytes x) ^ "\n") val _ = print(word8vectorToString (P.toBytes y) ^ "\n") val s = "~0.1" val _ = down() val x = Option.valOf (Real.fromString s) val _ = up() val y = Option.valOf (Real.fromString s) val _ = if R.<=(x,y) then print "YES\n" else print "NO\n" val _ = print(word8vectorToString (P.toBytes x) ^ "\n") val _ = print(word8vectorToString (P.toBytes y) ^ "\n") val da = {class = IEEEReal.NORMAL, sign = false, digits = [1], exp = 0} val _ = down() val x = Option.valOf (Real.fromDecimal da) val _ = up() val y = Option.valOf (Real.fromDecimal da) val _ = if R.<=(x,y) then print "YES\n" else print "NO\n" val _ = print(word8vectorToString (P.toBytes x) ^ "\n") val _ = print(word8vectorToString (P.toBytes y) ^ "\n") mlton-20100608/regression/real.alpha-linux.ok0000644000076600000240000057036111404435621017452 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.amd64-darwin.ok0000644000076600000240000057035411404435617017434 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796251 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796251 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195423 1.144729972 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 0.9999999404 0.4342944622 0.4107813835 7.544136524 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342377245 1.856761098 0.2070141882 0.9424887896 1.564468503 1.109053612 2.819815874 0.8425793052 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796251 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796251 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195423 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813835 ~7.544136524 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342377245 1.856761098 nan nan ~0.9424887896 ~1.564468503 nan ~2.819815874 ~0.8425793052 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796251 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796251 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796251 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 0.0 ~0.1E1 0.0 ~0.123E~2 0.0 ~0.1E1 0.0 ~0.11754944E~37 0.0 ~0.1E1 0.0 ~0.5877472E~38 0.0 ~0.1E1 0.0 ~0.1E~44 0.0 ~0.1E1 0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 ~0.0 0.0 0.123E~2 0.1E1 ~0.0 0.0 0.22250738585072014E~307 0.1E1 ~0.0 0.0 0.11125369292536007E~307 0.1E1 ~0.0 0.0 0.5E~323 0.1E1 ~0.0 0.0 0.0 0.0 ~0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 0.0 ~0.1E1 0.0 ~0.123E~2 0.0 ~0.1E1 0.0 ~0.22250738585072014E~307 0.0 ~0.1E1 0.0 ~0.11125369292536007E~307 0.0 ~0.1E1 0.0 ~0.5E~323 0.0 ~0.1E1 0.0 ~0.0 0.0 ~0.0 0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.amd64-freebsd.ok0000644000076600000240000057036111404435617017560 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.amd64-linux.ok0000644000076600000240000057036111404435620017277 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.hppa-hpux.ok0000644000076600000240000057037611404435617017155 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083015 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544176 1 nan nan 1.262627363 ~1 11.59195518 1.144729972 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 0.9999999404 0.4342944622 0.4107813537 7.544136524 1.648721218 ~0.4505496025 0.9913288951 nan nan 0.8881738186 0.3342376947 1.856761098 0.2070141882 0.9424887896 1.564468503 1.109053612 2.819815874 0.8425793052 1.447484136 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240864 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083015 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544176 ~1 nan nan ~1.262627363 ~1 11.59195423 nan nan nan ~0.9962721467 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136524 nan 0.4505496025 ~0.9913288355 nan nan ~0.8881738186 0.3342376947 1.856761098 nan nan ~0.9424887896 ~1.564468503 nan ~2.819815874 ~0.8425793052 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240864 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.hppa-linux.ok0000644000076600000240000057035111404435621017314 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.587747E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754941E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.587747E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754941E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.587747E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.587747E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754941E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754941E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.587747E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754941E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.587747E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754941E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.587747E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.587747E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754941E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754941E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.mips-linux.ok0000644000076600000240000057036111404435617017342 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.mipsel-linux.ok0000644000076600000240000057036111404435617017663 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.ok0000644000076600000240000057037411404435617015242 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195423 1.144729972 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 0.9999999404 0.4342944622 0.4107813537 7.544136524 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424887896 1.564468503 1.109053612 2.819815874 0.8425793052 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195423 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136524 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424887896 ~1.564468503 nan ~2.819815874 ~0.8425793052 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.powerpc-linux.ok0000644000076600000240000057036111404435617020051 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.s390-linux.ok0000644000076600000240000057036111404435621017063 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/real.sml0000644000076600000240000005650411404435617015416 0ustar mtfstafffunctor Test (structure Real: REAL val size: int) = struct open Real open Math infix == != datatype z = datatype IEEEReal.float_class datatype z = datatype IEEEReal.rounding_mode datatype z = datatype General.order val b2s = Bool.toString val i2s = Int.toString val exact = fmt StringCvt.EXACT val s2r = valOf o fromString val zero = s2r "0.0" val one = s2r "1.0" val two = s2r "2.0" val nan = posInf + negInf val halfMaxFinite = maxFinite / two val halfMinNormalPos = minNormalPos / two val reals = [maxFinite, halfMaxFinite, s2r "1.23E3", s2r "1.23E1", Math.pi, Math.e, s2r "1.23E0", s2r "1.23E~1", s2r "1.23E~3", minNormalPos, halfMinNormalPos, minPos, zero] fun for f = (List.app f reals; List.app (f o ~) reals) val reals' = [posInf, negInf, posInf + negInf, maxFinite * s2r "2.0"] fun for' f = (for f; List.app f reals') val _ = print (concat ["\nTesting Real", Int.toString size, "\n"]) val _ = print "\nTesting fmt\n" val _ = for (fn r => List.app (fn spec => print (concat [fmt spec r, "\n"])) let open StringCvt in [EXACT, SCI NONE, FIX NONE, GEN NONE, SCI (SOME 0), FIX (SOME 0), GEN (SOME 1), SCI (SOME 10), FIX (SOME 10), GEN (SOME 10)] end) val _ = let fun doit (s,r, s0, s1, s2, s6) = if (fmt (StringCvt.FIX (SOME 0)) r = s0 andalso fmt (StringCvt.FIX (SOME 1)) r = s1 andalso fmt (StringCvt.FIX (SOME 2)) r = s2 andalso fmt (StringCvt.FIX (SOME 6)) r = s6 andalso fmt (StringCvt.FIX NONE) r = s6) then () else raise Fail (concat ["fmt bug: ", s, " ", exact r]) in List.app (fn (s,r, s0, s1, s2, s6) => (doit (s,r, s0, s1, s2, s6) ; if r == zero then () else doit (s^"~",~r, "~"^s0, "~"^s1, "~"^s2, "~"^s6))) [("a", s2r "0.0", "0", "0.0", "0.00", "0.000000"), ("b", s2r "1.0", "1", "1.0", "1.00", "1.000000"), ("c", s2r "1.4", "1", "1.4", "1.40", "1.400000"), ("d", s2r "1.5", "2", "1.5", "1.50", "1.500000"), ("e", s2r "2.5", "2", "2.5", "2.50", "2.500000"), ("f", s2r "1.6", "2", "1.6", "1.60", "1.600000"), ("h", s2r "3.141592653589", "3", "3.1", "3.14", "3.141593"), ("j", s2r "91827365478400.0", "91827365478400", "91827365478400.0", "91827365478400.00", "91827365478400.000000")] end val _ = let fun chkSCI (r, s0, s1, s2, s6) = fmt (StringCvt.SCI (SOME 0)) r = s0 andalso fmt (StringCvt.SCI (SOME 1)) r = s1 andalso fmt (StringCvt.SCI (SOME 2)) r = s2 andalso fmt (StringCvt.SCI (SOME 6)) r = s6 andalso fmt (StringCvt.SCI NONE) r = s6 in List.app (fn (r, s0, s1, s2, s6) => if chkSCI(r, s0, s1, s2, s6) andalso (r == zero orelse chkSCI(~r, "~"^s0, "~"^s1, "~"^s2, "~"^s6)) then () else raise Fail (concat ["fmt SCI bug: ", exact r])) [(s2r "0.0", "0E0", "0.0E0", "0.00E0", "0.000000E0"), (s2r "0.0012345678", "1E~3", "1.2E~3", "1.23E~3", "1.234568E~3"), (s2r "1.0", "1E0", "1.0E0", "1.00E0", "1.000000E0"), (s2r "1.4", "1E0", "1.4E0", "1.40E0", "1.400000E0"), (s2r "1.5", "2E0", "1.5E0", "1.50E0", "1.500000E0"), (s2r "1.6", "2E0", "1.6E0", "1.60E0", "1.600000E0"), (s2r "3.141592653589", "3E0", "3.1E0", "3.14E0", "3.141593E0"), (s2r "91827365478400.0", "9E13", "9.2E13", "9.18E13", "9.182737E13")] end val _ = let fun chkGEN (r, s1, s2, s6, s12) = fmt (StringCvt.GEN (SOME 1)) r = s1 andalso fmt (StringCvt.GEN (SOME 2)) r = s2 andalso fmt (StringCvt.GEN (SOME 6)) r = s6 andalso fmt (StringCvt.GEN (SOME 12)) r = s12 andalso fmt (StringCvt.GEN NONE) r = s12 andalso toString r = s12; in List.app (fn (r, s1, s2, s6, s12) => if chkGEN(r, s1, s2, s6, s12) andalso (r == zero orelse chkGEN(~r, "~"^s1, "~"^s2, "~"^s6, "~"^s12)) then () else raise Fail (concat ["fmt GEN bug: ", exact r])) [(s2r "0.0", "0", "0", "0", "0"), (s2r "1.0", "1", "1", "1", "1"), (s2r "1.5", "2", "1.5", "1.5", "1.5"), (s2r "91827365478400.0", "9E13", "9.2E13", "9.18274E13", "91827365478400")] end val _ = print "\nTesting scan" val _ = for' (fn r => let val r' = valOf (StringCvt.scanString scan (exact r)) val _ = print (concat [exact r, "\t", exact r', "\n"]) in if r == r' orelse unordered (r, r') then () else raise Fail "scan bug" end) val _ = print "\nTesting checkFloat\n" val _ = for' (fn r => if (case class r of INF => ((checkFloat r; false) handle Overflow => true | _ => false) | NAN => ((checkFloat r; false) handle Div => true | _ => false) | _ => (checkFloat r; true) handle _ => false) then () else raise Fail "checkFloat bug") val _ = print "\nTesting class, isFinite, isNan, isNormal\n" val _ = for' (fn r => let val c = case class r of INF => "inf" | NAN => "nan" | NORMAL => "normal" | SUBNORMAL => "subnormal" | ZERO => "zero" in print (concat [exact r, "\t", c, "\n", "\tisFinite = ", b2s (isFinite r), "\tisNan = ", b2s (isNan r), "\tisNormal = ", b2s (isNormal r), "\n"]) end) val _ = print "\nTesting maxFinite, minPos, minNormalPos\n" local val isNormal = Real.isNormal val isFinite = Real.isFinite (* * Total hack!! Bounce r through isNormal (a C call) to force r out of the * FPU. Interestingly, the same hack works for SML/NJ. *) val isPositive = fn r => (Real.isNormal r; r > zero) fun min (p: real -> bool): real = let fun loop (x: real): real = let val y = x / two in if p y then loop y else x end in loop one end in val minNormalPos = min isNormal val minPos = min isPositive val maxFinite = let fun up (x: real): real = let val y = x * two in if isFinite y then up y else x end fun down (x: real, y: real): real = let val y = y / two val z = x + y in if isFinite z then down (z, y) else x end val z = up one in down (z, z) end end val _ = print ((Real.toString maxFinite) ^ "\n") val _ = print ((Real.toString Real.maxFinite) ^ "\n") val _ = print ((Bool.toString (Real.==(Real.maxFinite, maxFinite))) ^ "\n") val _ = print ((Real.toString minPos) ^ "\n") val _ = print ((Real.toString Real.minPos) ^ "\n") val _ = print ((Bool.toString (Real.==(Real.minPos, minPos))) ^ "\n") val _ = print ((Real.toString minNormalPos) ^ "\n") val _ = print ((Real.toString Real.minNormalPos) ^ "\n") val _ = print ((Bool.toString (Real.==(Real.minNormalPos, minNormalPos))) ^ "\n") val _ = print "\nTestring fromString\n" val _ = List.app (fn (s1, s2) => if valOf (fromString s1) == valOf (fromString s2) then () else raise Fail "fromString bug") [("12.", "12.0"), ("12.E", "12.0"), ("12.E+", "12.0"), ("12.E-", "12.0"), ("12.E2", "12.0"), ("12.E+2", "12.0"), ("12.E-2", "12.0"), ("12E+", "12.0"), ("12E-", "12.0"), ("0", "0.0"), ("156", "156.0"), ("+156", "156.0"), ("~156", "~156.0"), ("-156", "~156.0"), ("156.25", "156.25"), ("+156.25", "156.25"), ("~156.25", "~156.25"), ("-156.25", "~156.25"), (".25", "0.25"), ("+.25", "0.25"), ("~.25", "~0.25"), ("-.25", "~0.25"), ("156E024", "156E024"), ("+156E024", "156E024"), ("~156E024", "~156E024"), ("-156E024", "~156E024"), ("156.25E024", "156.25E024"), ("+156.25E024", "156.25E024"), ("~156.25E024", "~156.25E024"), ("-156.25E024", "~156.25E024"), (".25E024", "0.25E024"), ("+.25E024", "0.25E024"), ("~.25E024", "~0.25E024"), ("-.25E024", "~0.25E024"), ("156E+024", "156E024"), ("+156E+024", "156E024"), ("~156E+024", "~156E024"), ("-156E+024", "~156E024"), ("156.25E+024", "156.25E024"), ("+156.25E+024", "156.25E024"), ("~156.25E+024", "~156.25E024"), ("-156.25E+024", "~156.25E024"), (".25E+024", "0.25E024"), ("+.25E+024", "0.25E024"), ("~.25E+024", "~0.25E024"), ("-.25E+024", "~0.25E024"), ("156E~024", "156E~024"), ("+156E~024", "156E~024"), ("~156E~024", "~156E~024"), ("-156E~024", "~156E~024"), ("156.25E~024", "156.25E~024"), ("+156.25E~024", "156.25E~024"), ("~156.25E~024", "~156.25E~024"), ("-156.25E~024", "~156.25E~024"), (".25E~024", "0.25E~024"), ("+.25E~024", "0.25E~024"), ("~.25E~024", "~0.25E~024"), ("-.25E~024", "~0.25E~024"), ("156E-024", "156E~024"), ("+156E-024", "156E~024"), ("~156E-024", "~156E~024"), ("-156E-024", "~156E~024"), ("156.25E-024", "156.25E~024"), ("+156.25E-024", "156.25E~024"), ("~156.25E-024", "~156.25E~024"), ("-156.25E-024", "~156.25E~024"), (".25E-024", "0.25E~024"), ("+.25E-024", "0.25E~024"), ("~.25E-024", "~0.25E~024"), ("-.25E-024", "~0.25E~024"), ("156e024", "156E024"), ("+156e024", "156E024"), ("~156e024", "~156E024"), ("-156e024", "~156E024"), ("156.25e024", "156.25E024"), ("+156.25e024", "156.25E024"), ("~156.25e024", "~156.25E024"), ("-156.25e024", "~156.25E024"), (".25e024", "0.25E024"), ("+.25e024", "0.25E024"), ("~.25e024", "~0.25E024"), ("-.25e024", "~0.25E024"), ("156e+024", "156E024"), ("+156e+024", "156E024"), ("~156e+024", "~156E024"), ("-156e+024", "~156E024"), ("156.25e+024", "156.25E024"), ("+156.25e+024", "156.25E024"), ("~156.25e+024", "~156.25E024"), ("-156.25e+024", "~156.25E024"), (".25e+024", "0.25E024"), ("+.25e+024", "0.25E024"), ("~.25e+024", "~0.25E024"), ("-.25e+024", "~0.25E024"), ("156e~024", "156E~024"), ("+156e~024", "156E~024"), ("~156e~024", "~156E~024"), ("-156e~024", "~156E~024"), ("156.25e~024", "156.25E~024"), ("+156.25e~024", "156.25E~024"), ("~156.25e~024", "~156.25E~024"), ("-156.25e~024", "~156.25E~024"), (".25e~024", "0.25E~024"), ("+.25e~024", "0.25E~024"), ("~.25e~024", "~0.25E~024"), ("-.25e~024", "~0.25E~024"), ("156e-024", "156E~024"), ("+156e-024", "156E~024"), ("~156e-024", "~156E~024"), ("-156e-024", "~156E~024"), ("156.25e-024", "156.25E~024"), ("+156.25e-024", "156.25E~024"), ("~156.25e-024", "~156.25E~024"), ("-156.25e-024", "~156.25E~024"), (".25e-024", "0.25E~024"), ("+.25e-024", "0.25E~024"), ("~.25e-024", "~0.25E~024"), ("-.25e-024", "~0.25E~024")] val _ = print "\nTesting {from,to}Decimal\n" val _ = List.app (fn r => let val da = valOf (IEEEReal.fromString r) val s1 = IEEEReal.toString da val x = valOf (fromDecimal da) val s2 = exact x val da' = toDecimal x val b = Bool.toString (da = da') in print (concat [s1, " ", s2, " ", b, "\n"]) end) ["inf", "+inF", "~iNf", "-Inf", "infinity", "+infinity", "~infinity", "-infinity", "nan", "+naN", "~nAn", "-Nan", "0", "0.0", "0.0E0", "~0", "15", "1.5", "~1.5e+1", "15.0", ".15e~2", ".15e-2", "000.0015e0", "1.2E999", "~1.2E999", "1E~999", "~1E~999", "1E12345678901234567890"] val _ = print "\nTesting {from,to}LargeInt\n" val _ = for (fn r => let val i = toLargeInt IEEEReal.TO_NEGINF r val r' = fromLargeInt i val _ = print (concat [exact r, "\t", LargeInt.toString i, "\t", exact r', "\n"]) in if r' == realFloor r then () else raise Fail "bug" end) val roundingModes = [(TO_NEAREST, "nearest"), (TO_NEGINF, "neginf"), (TO_POSINF, "posinf"), (TO_ZERO, "zero")] val _ = let fun doit (x, mode, name) = let val i = toLargeInt mode x in print (concat [name, "\t", exact x, "\t", LargeInt.toString i, "\n"]) end in List.app (fn (mode, name) => List.app (fn s => let val x = s2r s in doit (x, mode, name) ; doit (~ x, mode, name) ; doit (s2r "1E12" + x, mode, name) ; doit (s2r "~1E12" + x, mode, name) end) ["0.0", "0.25", "0.5", "0.75", "1.0", "1.25", "1.5", "1.75", "2.0", "2.5", "3.0"]) roundingModes end val _ = print "\nTesting fromInt\n" val _ = for (fn r => case SOME (round r) handle Overflow => NONE of NONE => () | SOME i => let val r = fromInt i in if r == fromInt (round r) then () else raise Fail "fromInt bug" end) val _ = print "\nTesting toInt\n" val _ = for (fn r => List.app (fn (mode, name) => case SOME (toInt mode r) handle Overflow => NONE of NONE => () | SOME i => if i = LargeInt.toInt (toLargeInt mode r) then () else raise Fail "bug") roundingModes) val _ = print "\nTesting ceil,floor,round,trunc\n" val _ = for (fn r => List.app (fn (mode, f) => case SOME (toInt mode r) handle Overflow => NONE of NONE => () | SOME i => if i = f r then () else raise Fail "bug") [(TO_NEAREST, round), (TO_NEGINF, floor), (TO_POSINF, ceil), (TO_ZERO, trunc)]) val _ = print "\nTesting copySign, sameSign, sign, signBit\n" val _ = for' (fn r1 => (for' (fn r2 => if unordered (r1, r2) orelse (if false then print (concat [b2s (signBit r1), "\t", b2s (signBit r2), "\t", i2s (sign r1), "\t", b2s (sameSign (r1, r2)), "\t", exact (copySign (r1, r2)), "\n"]) else () ; (signBit r1 = Int.< (sign r1, 0) orelse r1 == zero) andalso (sameSign (r1, r2)) = (signBit r1 = signBit r2) andalso sameSign (r2, copySign (r1, r2))) then () else raise Fail "bug"))) val _ = print "\nTesting max, min\n" val _ = for' (fn r1 => for' (fn r2 => let val max = max (r1, r2) val min = min (r1, r2) in if (isNan r1 orelse (r1 <= max andalso min <= r1)) andalso (isNan r2 orelse (r2 <= max andalso min <= r2)) andalso (r1 == max orelse r2 == max orelse (isNan r1 andalso isNan r2)) andalso (r1 == min orelse r2 == min orelse (isNan r1 andalso isNan r2)) then () else raise Fail "bug" end)) val _ = print "\nTesting Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh}\n" val _ = for' (fn r => List.app (fn (name, f, except) => if List.exists (fn r' => r == r') except then () else print (concat [(*name, " ", exact r, " = ", *) fmt (StringCvt.GEN (SOME 10)) (f r), "\n"])) let open Real.Math in [("acos", acos, []), ("asin", asin, []), ("atan", atan, []), ("cos", cos, [maxFinite, halfMaxFinite, ~maxFinite, ~halfMaxFinite]), ("cosh", cosh, [s2r "12.3", s2r "~12.3", e, ~e]), ("exp", exp, [s2r "12.3", pi, s2r "1.23", s2r "~12.3", ~pi, s2r "~1.23"]), ("ln", ln, []), ("log10", log10, [s2r "1.23", pi]), ("sin", sin, [maxFinite, halfMaxFinite, ~maxFinite, ~halfMaxFinite, pi, ~pi]), ("sinh", sinh, [pi, ~pi, s2r "0.123", s2r "~0.123"]), ("sqrt", sqrt, [maxFinite]), ("tan", tan, [maxFinite, halfMaxFinite, ~maxFinite, ~halfMaxFinite, pi, ~pi]), ("tanh", tanh, [s2r "0.123", s2r "~0.123"])] end) val _ = print "\nTesting Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow}\n" val _ = for' (fn r1 => for' (fn r2 => List.app (fn (name, f, except) => if List.exists (fn (r1', r2') => r1 == r1' andalso r2 == r2') except then () else print (concat [(*name, " (", exact r1, ", ", exact r2, ") = ", *) exact (f (r1, r2)), "\n"])) [("*", op *, []), ("+", op +, []), ("-", op -, []), ("/", op /, [(s2r "1.23", halfMaxFinite), (s2r "1.23", ~halfMaxFinite), (s2r "~1.23", halfMaxFinite), (s2r "~1.23", ~halfMaxFinite) ]), ("nextAfter", nextAfter, []) (* ("rem", rem, []), *) (* ("atan2", Math.atan2, []), *) (* ("pow", Math.pow, [(halfMaxFinite, s2r "0.123"), (pi, e)]) *) ])) val _ = if List.all (op ==) [(posInf + posInf, posInf), (negInf + negInf, negInf), (posInf - negInf, posInf), (negInf - posInf, negInf)] andalso List.all isNan [nan, nan + one, nan - one, nan * one, nan / one] andalso List.all isNan [posInf + negInf, negInf + posInf, posInf - posInf, negInf - negInf] then () else raise Fail "bug" val _ = print "\nTesting *+, *-\n" val _ = for (fn r1 => for (fn r2 => for (fn r3 => if *+ (r1, r2, r3) == r1 * r2 + r3 then () else raise Fail "*+ bug"))) val _ = print "\nTesting Real.{realCeil,realFloor,realTrunc}\n" val _ = for (fn r => let val ceil = realCeil r val floor = realFloor r val trunc = realTrunc r val _ = print (concat [exact r, " ", exact ceil, " ", exact floor, " ", exact trunc, "\n"]) in if floor <= r andalso r <= ceil andalso abs trunc <= abs r then () else raise Fail "bug" end) val _ = print "\nTesting Real.{<,<=,>,>=,==,!=,?=,unordered}\n" val _ = for (fn r1 => for (fn r2 => let val _ = List.app (fn (f, name) => print (concat [(* name, " (", exact r1, ", ", exact r2, ") = ", *) b2s (f (r1, r2)), "\n"])) [(Real.<, "<"), (Real.>, ">"), (Real.==, "=="), (Real.?=, "?=")] in if unordered (r1, r2) = (isNan r1 orelse isNan r2) andalso (r1 != r2) = not (r1 == r2) andalso if unordered (r1, r2) then (false = (r1 <= r2) andalso false = (r1 < r2) andalso false = (r1 >= r2) andalso false = (r1 > r2) andalso false = (r1 == r2) andalso if isNan r1 andalso isNan r2 then true = ?= (r1, r2) else true) else ((r1 < r2) = not (r1 >= r2) andalso (r1 > r2) = not (r1 <= r2)) then () else raise Fail "bug" end)) val _ = print "\nTesting compare, compareReal\n" val _ = for (fn r => for (fn r' => let val c = case SOME (compare (r, r')) handle IEEEReal.Unordered => NONE of NONE => "Unordered" | SOME z => case z of EQUAL => "EQUAL" | GREATER => "GREATER" | LESS => "LESS" datatype z = datatype IEEEReal.real_order val cr = case compareReal (r, r') of EQUAL => "EQUAL" | GREATER => "GREATER" | LESS => "LESS" | UNORDERED => "UNORDERED" val _ = print (concat [(* exact r, " ", exact r', "\t", *) c, "\t", cr, "\n"]) in if compareReal (r, r') = (case compareReal (r', r) of EQUAL => EQUAL | GREATER => LESS | LESS => GREATER | UNORDERED => UNORDERED) then () else raise Fail "compareReal bug" end)) val _ = print "\nTesting abs\n" val _ = for (fn r => if abs r == abs (~ r) then () else raise Fail "abs bug") val _ = print "\nTesting {from,to}ManExp\n" val _ = for (fn x => if List.exists (fn y => x == y) [halfMinNormalPos, minPos, ~halfMinNormalPos, ~minPos] then () else let val {exp, man} = toManExp x val _ = if true then print (concat [exact x, " = ", exact man, " * 2^", i2s exp, "\n"]) else () val x' = fromManExp {exp = exp, man = man} val _ = if true then print (concat ["\t = ", exact x', "\n"]) else () in if x == x' then () else raise Fail "bug" end) val _ = print "\nTesting split\n" val _ = for (fn r => let val {whole, frac} = split r val _ = if false then print (concat ["split ", exact r, " = {whole = ", exact whole, ", frac = ", exact frac, "}\n", "realMod ", exact whole, " = ", exact (realMod whole), "\t", b2s (sameSign (r, whole)), "\t", b2s (sameSign (r, frac)), "\n"]) else () in if realMod r == frac andalso realMod whole == zero andalso abs frac < one andalso sameSign (r, whole) andalso sameSign (r, frac) andalso (case class r of INF => whole == r andalso frac == zero | NAN => isNan whole andalso isNan frac | _ => r == whole + frac) then () else raise Fail "bug" end) val _ = print "\nTesting {from,to}Large\n" val _ = for (fn r => if r == fromLarge TO_NEAREST (toLarge r) then () else raise Fail "{from,to}Large bug") end structure Z = Test (structure Real = Real32 val size = 32) structure Z = Test (structure Real = Real64 val size = 64) mlton-20100608/regression/real.sparc-linux.ok0000644000076600000240000057036111404435617017502 0ustar mtfstaff Testing Real32 Testing fmt 0.34028235E39 3.402823E38 340282346638528859811704183484516925440.000000 3.40282346639E38 3E38 340282346638528859811704183484516925440 3E38 3.4028234664E38 340282346638528859811704183484516925440.0000000000 3.402823466E38 0.17014117E39 1.701412E38 170141173319264429905852091742258462720.000000 1.70141173319E38 2E38 170141173319264429905852091742258462720 2E38 1.7014117332E38 170141173319264429905852091742258462720.0000000000 1.701411733E38 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3000001907 1E1 12 10 1.2300000191E1 12.3000001907 12.30000019 0.31415927E1 3.141593E0 3.141593 3.14159274101 3E0 3 3 3.1415927410E0 3.1415927410 3.141592741 0.27182817E1 2.718282E0 2.718282 2.71828174591 3E0 3 3 2.7182817459E0 2.7182817459 2.718281746 0.123E1 1.230000E0 1.230000 1.23000001907 1E0 1 1 1.2300000191E0 1.2300000191 1.230000019 0.123 1.230000E~1 0.123000 0.123000003397 1E~1 0 0.1 1.2300000340E~1 0.1230000034 0.1230000034 0.123E~2 1.230000E~3 0.001230 0.0012300000526 1E~3 0 1E~3 1.2300000526E~3 0.0012300001 0.001230000053 0.11754944E~37 1.175494E~38 0.000000 1.17549435082E~38 1E~38 0 1E~38 1.1754943508E~38 0.0000000000 1.175494351E~38 0.5877472E~38 5.877472E~39 0.000000 5.87747175411E~39 6E~39 0 6E~39 5.8774717541E~39 0.0000000000 5.877471754E~39 0.1E~44 1.401298E~45 0.000000 1.40129846432E~45 1E~45 0 1E~45 1.4012984643E~45 0.0000000000 1.401298464E~45 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.34028235E39 ~3.402823E38 ~340282346638528859811704183484516925440.000000 ~3.40282346639E38 ~3E38 ~340282346638528859811704183484516925440 ~3E38 ~3.4028234664E38 ~340282346638528859811704183484516925440.0000000000 ~3.402823466E38 ~0.17014117E39 ~1.701412E38 ~170141173319264429905852091742258462720.000000 ~1.70141173319E38 ~2E38 ~170141173319264429905852091742258462720 ~2E38 ~1.7014117332E38 ~170141173319264429905852091742258462720.0000000000 ~1.701411733E38 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3000001907 ~1E1 ~12 ~10 ~1.2300000191E1 ~12.3000001907 ~12.30000019 ~0.31415927E1 ~3.141593E0 ~3.141593 ~3.14159274101 ~3E0 ~3 ~3 ~3.1415927410E0 ~3.1415927410 ~3.141592741 ~0.27182817E1 ~2.718282E0 ~2.718282 ~2.71828174591 ~3E0 ~3 ~3 ~2.7182817459E0 ~2.7182817459 ~2.718281746 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23000001907 ~1E0 ~1 ~1 ~1.2300000191E0 ~1.2300000191 ~1.230000019 ~0.123 ~1.230000E~1 ~0.123000 ~0.123000003397 ~1E~1 ~0 ~0.1 ~1.2300000340E~1 ~0.1230000034 ~0.1230000034 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.0012300000526 ~1E~3 ~0 ~1E~3 ~1.2300000526E~3 ~0.0012300001 ~0.001230000053 ~0.11754944E~37 ~1.175494E~38 ~0.000000 ~1.17549435082E~38 ~1E~38 ~0 ~1E~38 ~1.1754943508E~38 ~0.0000000000 ~1.175494351E~38 ~0.5877472E~38 ~5.877472E~39 ~0.000000 ~5.87747175411E~39 ~6E~39 ~0 ~6E~39 ~5.8774717541E~39 ~0.0000000000 ~5.877471754E~39 ~0.1E~44 ~1.401298E~45 ~0.000000 ~1.40129846432E~45 ~1E~45 ~0 ~1E~45 ~1.4012984643E~45 ~0.0000000000 ~1.401298464E~45 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E2 0.123E2 0.31415927E1 0.31415927E1 0.27182817E1 0.27182817E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.11754944E~37 0.11754944E~37 0.5877472E~38 0.5877472E~38 0.1E~44 0.1E~44 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.31415927E1 ~0.31415927E1 ~0.27182817E1 ~0.27182817E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.11754944E~37 ~0.11754944E~37 ~0.5877472E~38 ~0.5877472E~38 ~0.1E~44 ~0.1E~44 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.34028235E39 normal isFinite = true isNan = false isNormal = true 0.17014117E39 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.31415927E1 normal isFinite = true isNan = false isNormal = true 0.27182817E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.11754944E~37 normal isFinite = true isNan = false isNormal = true 0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false 0.1E~44 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.34028235E39 normal isFinite = true isNan = false isNormal = true ~0.17014117E39 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.31415927E1 normal isFinite = true isNan = false isNormal = true ~0.27182817E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.11754944E~37 normal isFinite = true isNan = false isNormal = true ~0.5877472E~38 subnormal isFinite = true isNan = false isNormal = false ~0.1E~44 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 3.40282346639E38 3.40282346639E38 true 1.40129846432E~45 1.40129846432E~45 true 1.17549435082E~38 1.17549435082E~38 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.34028235E39 340282346638528859811704183484516925440 0.34028235E39 0.17014117E39 170141173319264429905852091742258462720 0.17014117E39 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.31415927E1 3 0.3E1 0.27182817E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.11754944E~37 0 0.0 0.5877472E~38 0 0.0 0.1E~44 0 0.0 0.0 0 0.0 ~0.34028235E39 ~340282346638528859811704183484516925440 ~0.34028235E39 ~0.17014117E39 ~170141173319264429905852091742258462720 ~0.17014117E39 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.31415927E1 ~4 ~0.4E1 ~0.27182817E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.11754944E~37 ~1 ~0.1E1 ~0.5877472E~38 ~1 ~0.1E1 ~0.1E~44 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25 0 nearest ~0.25 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.5 0 nearest ~0.5 0 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.999999995904E12 999999995904 nearest ~0.999999995904E12 ~999999995904 neginf 0.0 0 neginf ~0.0 0 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.999999995904E12 999999995904 neginf ~0.999999995904E12 ~999999995904 posinf 0.0 0 posinf ~0.0 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25 1 posinf ~0.25 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.5 1 posinf ~0.5 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.75 1 posinf ~0.75 0 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.999999995904E12 999999995904 posinf ~0.999999995904E12 ~999999995904 zero 0.0 0 zero ~0.0 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25 0 zero ~0.25 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.5 0 zero ~0.5 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.75 0 zero ~0.75 0 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.999999995904E12 999999995904 zero ~0.999999995904E12 ~999999995904 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796371 inf inf 88.72283936 38.53184128 inf 1 nan nan 1.570796371 inf inf 88.0296936 38.23080826 inf 1.30438176E19 1 nan nan 1.569983363 0.06642717123 inf inf 7.114769459 3.089905024 ~0.9977912903 inf 35.07135773 ~15.02083111 1 nan nan 1.489673972 0.9647326469 2.509599209 1.089905143 ~0.2632316053 109848.0156 3.50713563 ~0.2728544474 1 nan nan 1.262627244 ~1 11.59195518 1.144729853 1.772453904 0.9962720871 nan nan 1.218282938 ~0.9117338657 15.15426064 1 0.4342944622 0.4107813537 7.544136047 1.648721218 ~0.4505496323 0.9913288951 nan nan 0.888173759 0.3342376947 1.856761098 0.2070141882 0.9424888492 1.564468503 1.109053612 2.819815874 0.8425793648 1.447484016 0.1233122796 0.1223852858 0.9924450517 1.007574081 1.130884409 ~2.095570803 ~0.9100948572 0.1226900965 0.350713551 0.1236240715 1.569566369 0.001230000402 0.001229999471 0.9999992251 1.000000715 1.001230717 ~6.700741291 ~2.910094976 0.001229999703 0.001230000402 0.03507135808 0.001230000635 0.001229999471 1.570796371 1.175494351E~38 1.175494351E~38 1 1 1 ~87.33654785 ~37.92977905 1.175494351E~38 1.175494351E~38 1.084202172E~19 1.175494351E~38 1.175494351E~38 1.570796371 5.877471754E~39 5.877471754E~39 1 1 1 ~88.0296936 ~38.23080826 5.877471754E~39 5.877471754E~39 7.666466952E~20 5.877471754E~39 5.877471754E~39 1.570796371 1.401298464E~45 1.401298464E~45 1 1 1 ~103.2789307 ~44.85346985 1.401298464E~45 1.401298464E~45 3.743392067E~23 1.401298464E~45 1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796371 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983363 0.06642717123 inf 0 nan nan 0.9977912903 ~inf nan 15.02083111 ~1 nan nan ~1.489673972 0.9647326469 nan nan 0.2632316053 ~109848.0156 nan 0.2728544474 ~1 nan nan ~1.262627244 ~1 11.59195518 nan nan nan ~0.9962720871 nan nan ~1.218282938 ~0.9117338657 0.06598804146 nan nan ~0.4107813537 ~7.544136047 nan 0.4505496323 ~0.9913288951 nan nan ~0.888173759 0.3342376947 1.856761098 nan nan ~0.9424888492 ~1.564468503 nan ~2.819815874 ~0.8425793648 1.694108605 ~0.1233122796 ~0.1223852858 0.9924450517 1.007574081 0.8842636347 nan nan ~0.1226900965 nan ~0.1236240715 1.572026372 ~0.001230000402 ~0.001229999471 0.9999992251 1.000000715 0.9987707734 nan nan ~0.001229999703 ~0.001230000402 nan ~0.001230000635 ~0.001229999471 1.570796371 ~1.175494351E~38 ~1.175494351E~38 1 1 1 nan nan ~1.175494351E~38 ~1.175494351E~38 nan ~1.175494351E~38 ~1.175494351E~38 1.570796371 ~5.877471754E~39 ~5.877471754E~39 1 1 1 nan nan ~5.877471754E~39 ~5.877471754E~39 nan ~5.877471754E~39 ~5.877471754E~39 1.570796371 ~1.401298464E~45 ~1.401298464E~45 1 1 1 nan nan ~1.401298464E~45 ~1.401298464E~45 nan ~1.401298464E~45 ~1.401298464E~45 1.570796371 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796371 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796371 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.34028235E39 inf inf 0.17014117E39 0.2E1 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.2766523E36 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665232E38 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.10831523E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.12518288E39 0.34028233E39 inf 0.34028235E39 0.34028235E39 0.27665231E39 0.34028233E39 0.4185473E38 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.4185473E36 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.39999998E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.19999999E1 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.47683713E~6 0.34028235E39 0.34028235E39 inf 0.34028233E39 0.0 0.34028235E39 0.34028235E39 inf 0.34028233E39 ~inf 0.0 inf ~0.1E1 0.34028233E39 ~inf 0.17014117E39 inf ~0.2E1 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.2766523E36 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665232E38 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.10831523E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.12518288E39 0.34028233E39 ~inf 0.34028235E39 0.34028235E39 ~0.27665231E39 0.34028233E39 ~0.4185473E38 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.4185473E36 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.39999998E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.19999999E1 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.47683713E~6 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 ~0.0 0.34028235E39 0.34028235E39 ~inf 0.34028233E39 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.34028233E39 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.17014117E39 0.5 0.17014118E39 inf 0.34028235E39 0.0 0.1E1 0.17014117E39 inf 0.17014117E39 0.17014117E39 0.13832615E36 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.13832616E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.54157613E38 0.17014116E39 inf 0.17014117E39 0.17014117E39 0.6259144E38 0.17014116E39 0.20927364E39 0.17014117E39 0.17014117E39 0.13832616E39 0.17014116E39 0.20927365E38 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.20927364E36 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.19999999E1 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.99999994 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.23841856E~6 0.17014117E39 0.17014117E39 inf 0.17014116E39 0.0 0.17014117E39 0.17014117E39 inf 0.17014116E39 ~inf ~0.17014117E39 inf ~0.5 0.17014116E39 ~inf 0.0 0.34028235E39 ~0.1E1 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832615E36 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.13832616E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.54157613E38 0.17014116E39 ~inf 0.17014117E39 0.17014117E39 ~0.6259144E38 0.17014116E39 ~0.20927364E39 0.17014117E39 0.17014117E39 ~0.13832616E39 0.17014116E39 ~0.20927365E38 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.20927364E36 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.19999999E1 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.99999994 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.23841856E~6 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 ~0.0 0.17014117E39 0.17014117E39 ~inf 0.17014116E39 inf inf ~inf 0.0 0.17014118E39 ~inf ~inf inf ~0.0 0.17014116E39 nan nan nan nan nan inf inf ~inf 0.0 0.17014118E39 inf 0.34028235E39 ~0.34028235E39 0.36146455E~35 0.12300001E4 inf 0.17014117E39 ~0.17014117E39 0.7229291E~35 0.12300001E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999E4 0.38641592E4 0.12331416E4 0.12268584E4 0.39152115E3 0.12299999E4 0.33434866E4 0.12327183E4 0.12272817E4 0.45249173E3 0.12299999E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999E4 0.15129001E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999E4 0.15129001E1 0.12300012E4 0.12299988E4 0.99999994E6 0.12299999E4 0.1445858E~34 0.123E4 0.123E4 inf 0.12299999E4 0.722929E~35 0.123E4 0.123E4 inf 0.12299999E4 0.1724E~41 0.123E4 0.123E4 inf 0.12299999E4 0.0 0.123E4 0.123E4 inf 0.12299999E4 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~35 0.12299999E4 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~35 0.12299999E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999E4 ~0.38641592E4 0.12268584E4 0.12331416E4 ~0.39152115E3 0.12299999E4 ~0.33434866E4 0.12272817E4 0.12327183E4 ~0.45249173E3 0.12299999E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999E4 ~0.15129001E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999E4 ~0.15129001E1 0.12299988E4 0.12300012E4 ~0.99999994E6 0.12299999E4 ~0.1445858E~34 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.722929E~35 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.1724E~41 0.123E4 0.123E4 ~inf 0.12299999E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999E4 inf inf ~inf 0.0 0.12300001E4 ~inf ~inf inf ~0.0 0.12299999E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E4 inf 0.34028235E39 ~0.34028235E39 0.36146455E~37 0.12300001E2 inf 0.17014117E39 ~0.17014117E39 0.7229291E~37 0.12300001E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300001E2 0.15129001E3 0.246E2 0.0 0.1E1 0.123E2 0.3864159E2 0.15441593E2 0.9158407E1 0.39152114E1 0.12299999E2 0.33434868E2 0.15018282E2 0.9581718E1 0.4524917E1 0.12299999E2 0.15129001E2 0.13530001E2 0.1107E2 0.1E2 0.12299999E2 0.15129001E1 0.12423E2 0.12177E2 0.1E3 0.12299999E2 0.15129001E~1 0.1230123E2 0.1229877E2 0.1E5 0.12299999E2 0.14458581E~36 0.123E2 0.123E2 inf 0.12299999E2 0.72292904E~37 0.123E2 0.123E2 inf 0.12299999E2 0.17E~43 0.123E2 0.123E2 inf 0.12299999E2 0.0 0.123E2 0.123E2 inf 0.12299999E2 ~inf ~0.34028235E39 0.34028235E39 ~0.36146455E~37 0.12299999E2 ~inf ~0.17014117E39 0.17014117E39 ~0.7229291E~37 0.12299999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999E2 ~0.15129001E3 0.0 0.246E2 ~0.1E1 0.12299999E2 ~0.3864159E2 0.9158407E1 0.15441593E2 ~0.39152114E1 0.12299999E2 ~0.33434868E2 0.9581718E1 0.15018282E2 ~0.4524917E1 0.12299999E2 ~0.15129001E2 0.1107E2 0.13530001E2 ~0.1E2 0.12299999E2 ~0.15129001E1 0.12177E2 0.12423E2 ~0.1E3 0.12299999E2 ~0.15129001E~1 0.1229877E2 0.1230123E2 ~0.1E5 0.12299999E2 ~0.14458581E~36 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.72292904E~37 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.17E~43 0.123E2 0.123E2 ~inf 0.12299999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999E2 inf inf ~inf 0.0 0.12300001E2 ~inf ~inf inf ~0.0 0.12299999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E2 inf 0.34028235E39 ~0.34028235E39 0.9232312E~38 0.3141593E1 inf 0.17014117E39 ~0.17014117E39 0.18464624E~37 0.3141593E1 0.38641592E4 0.12331416E4 ~0.12268584E4 0.25541405E~2 0.3141593E1 0.3864159E2 0.15441593E2 ~0.9158407E1 0.25541404 0.3141593E1 0.9869605E1 0.62831855E1 0.0 0.1E1 0.31415927E1 0.8539734E1 0.58598747E1 0.423311 0.11557274E1 0.31415925E1 0.3864159E1 0.43715925E1 0.19115927E1 0.25541403E1 0.31415925E1 0.38641593 0.32645926E1 0.30185928E1 0.25541403E2 0.31415925E1 0.38641593E~2 0.31428227E1 0.31403627E1 0.25541404E4 0.31415925E1 0.36929245E~37 0.31415927E1 0.31415927E1 0.26725715E39 0.31415925E1 0.18464623E~37 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.4E~44 0.31415927E1 0.31415927E1 inf 0.31415925E1 0.0 0.31415927E1 0.31415927E1 inf 0.31415925E1 ~inf ~0.34028235E39 0.34028235E39 ~0.9232312E~38 0.31415925E1 ~inf ~0.17014117E39 0.17014117E39 ~0.18464624E~37 0.31415925E1 ~0.38641592E4 ~0.12268584E4 0.12331416E4 ~0.25541405E~2 0.31415925E1 ~0.3864159E2 ~0.9158407E1 0.15441593E2 ~0.25541404 0.31415925E1 ~0.9869605E1 0.0 0.62831855E1 ~0.1E1 0.31415925E1 ~0.8539734E1 0.423311 0.58598747E1 ~0.11557274E1 0.31415925E1 ~0.3864159E1 0.19115927E1 0.43715925E1 ~0.25541403E1 0.31415925E1 ~0.38641593 0.30185928E1 0.32645926E1 ~0.25541403E2 0.31415925E1 ~0.38641593E~2 0.31403627E1 0.31428227E1 ~0.25541404E4 0.31415925E1 ~0.36929245E~37 0.31415927E1 0.31415927E1 ~0.26725715E39 0.31415925E1 ~0.18464623E~37 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.4E~44 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 ~0.0 0.31415927E1 0.31415927E1 ~inf 0.31415925E1 inf inf ~inf 0.0 0.3141593E1 ~inf ~inf inf ~0.0 0.31415925E1 nan nan nan nan nan inf inf ~inf 0.0 0.3141593E1 inf 0.34028235E39 ~0.34028235E39 0.7988312E~38 0.2718282E1 inf 0.17014117E39 ~0.17014117E39 0.15976626E~37 0.2718282E1 0.33434866E4 0.12327183E4 ~0.12272817E4 0.22099852E~2 0.2718282E1 0.33434868E2 0.15018282E2 ~0.9581718E1 0.22099851 0.2718282E1 0.8539734E1 0.58598747E1 ~0.423311 0.86525595 0.2718282E1 0.73890557E1 0.54365635E1 0.0 0.1E1 0.27182817E1 0.33434865E1 0.39482818E1 0.14882817E1 0.2209985E1 0.27182815E1 0.33434868 0.28412817E1 0.25952818E1 0.22099852E2 0.27182815E1 0.33434867E~2 0.27195117E1 0.27170517E1 0.2209985E4 0.27182815E1 0.31953248E~37 0.27182817E1 0.27182817E1 0.23124584E39 0.27182815E1 0.15976624E~37 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.4E~44 0.27182817E1 0.27182817E1 inf 0.27182815E1 0.0 0.27182817E1 0.27182817E1 inf 0.27182815E1 ~inf ~0.34028235E39 0.34028235E39 ~0.7988312E~38 0.27182815E1 ~inf ~0.17014117E39 0.17014117E39 ~0.15976626E~37 0.27182815E1 ~0.33434866E4 ~0.12272817E4 0.12327183E4 ~0.22099852E~2 0.27182815E1 ~0.33434868E2 ~0.9581718E1 0.15018282E2 ~0.22099851 0.27182815E1 ~0.8539734E1 ~0.423311 0.58598747E1 ~0.86525595 0.27182815E1 ~0.73890557E1 0.0 0.54365635E1 ~0.1E1 0.27182815E1 ~0.33434865E1 0.14882817E1 0.39482818E1 ~0.2209985E1 0.27182815E1 ~0.33434868 0.25952818E1 0.28412817E1 ~0.22099852E2 0.27182815E1 ~0.33434867E~2 0.27170517E1 0.27195117E1 ~0.2209985E4 0.27182815E1 ~0.31953248E~37 0.27182817E1 0.27182817E1 ~0.23124584E39 0.27182815E1 ~0.15976624E~37 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.4E~44 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 ~0.0 0.27182817E1 0.27182817E1 ~inf 0.27182815E1 inf inf ~inf 0.0 0.2718282E1 ~inf ~inf inf ~0.0 0.27182815E1 nan nan nan nan nan inf inf ~inf 0.0 0.2718282E1 inf 0.34028235E39 ~0.34028235E39 0.3614645E~38 0.12300001E1 0.20927364E39 0.17014117E39 ~0.17014117E39 0.12300001E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300001E1 0.15129001E2 0.13530001E2 ~0.1107E2 0.1 0.12300001E1 0.3864159E1 0.43715925E1 ~0.19115927E1 0.39152116 0.12300001E1 0.33434865E1 0.39482818E1 ~0.14882817E1 0.45249173 0.12300001E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999E1 0.15129001E~2 0.123123E1 0.122877E1 0.1E4 0.12299999E1 0.14458581E~37 0.123E1 0.123E1 0.10463683E39 0.12299999E1 0.722929E~38 0.123E1 0.123E1 0.20927366E39 0.12299999E1 0.1E~44 0.123E1 0.123E1 inf 0.12299999E1 0.0 0.123E1 0.123E1 inf 0.12299999E1 ~inf ~0.34028235E39 0.34028235E39 ~0.3614645E~38 0.12299999E1 ~0.20927364E39 ~0.17014117E39 0.17014117E39 0.12299999E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999E1 ~0.15129001E2 ~0.1107E2 0.13530001E2 ~0.1 0.12299999E1 ~0.3864159E1 ~0.19115927E1 0.43715925E1 ~0.39152116 0.12299999E1 ~0.33434865E1 ~0.14882817E1 0.39482818E1 ~0.45249173 0.12299999E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999E1 ~0.15129001E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999E1 ~0.14458581E~37 0.123E1 0.123E1 ~0.10463683E39 0.12299999E1 ~0.722929E~38 0.123E1 0.123E1 ~0.20927366E39 0.12299999E1 ~0.1E~44 0.123E1 0.123E1 ~inf 0.12299999E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999E1 inf inf ~inf 0.0 0.12300001E1 ~inf ~inf inf ~0.0 0.12299999E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300001E1 0.4185473E38 0.34028235E39 ~0.34028235E39 0.361465E~39 0.12300001 0.20927365E38 0.17014117E39 ~0.17014117E39 0.722928E~39 0.12300001 0.15129001E3 0.1230123E4 ~0.1229877E4 0.100000005E~3 0.12300001 0.15129001E1 0.12423E2 ~0.12177E2 0.1E~1 0.12300001 0.38641593 0.32645926E1 ~0.30185928E1 0.39152116E~1 0.12300001 0.33434868 0.28412817E1 ~0.25952818E1 0.45249175E~1 0.12300001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300001 0.15129001E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.124230005 0.12177 0.1E3 0.122999996 0.1445858E~38 0.123 0.123 0.10463683E38 0.122999996 0.722928E~39 0.123 0.123 0.20927366E38 0.122999996 0.0 0.123 0.123 inf 0.122999996 0.0 0.123 0.123 inf 0.122999996 ~0.4185473E38 ~0.34028235E39 0.34028235E39 ~0.361465E~39 0.122999996 ~0.20927365E38 ~0.17014117E39 0.17014117E39 ~0.722928E~39 0.122999996 ~0.15129001E3 ~0.1229877E4 0.1230123E4 ~0.100000005E~3 0.122999996 ~0.15129001E1 ~0.12177E2 0.12423E2 ~0.1E~1 0.122999996 ~0.38641593 ~0.30185928E1 0.32645926E1 ~0.39152116E~1 0.122999996 ~0.33434868 ~0.25952818E1 0.28412817E1 ~0.45249175E~1 0.122999996 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.122999996 ~0.15129001E~1 0.0 0.246 ~0.1E1 0.122999996 ~0.15129E~3 0.12177 0.124230005 ~0.1E3 0.122999996 ~0.1445858E~38 0.123 0.123 ~0.10463683E38 0.122999996 ~0.722928E~39 0.123 0.123 ~0.20927366E38 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 ~0.0 0.123 0.123 ~inf 0.122999996 inf inf ~inf 0.0 0.12300001 ~inf ~inf inf ~0.0 0.122999996 nan nan nan nan nan inf inf ~inf 0.0 0.12300001 0.4185473E36 0.34028235E39 ~0.34028235E39 0.3614E~41 0.12300002E~2 0.20927364E36 0.17014117E39 ~0.17014117E39 0.7229E~41 0.12300002E~2 0.15129001E1 0.12300012E4 ~0.12299988E4 0.1E~5 0.12300002E~2 0.15129001E~1 0.1230123E2 ~0.1229877E2 0.100000005E~3 0.12300002E~2 0.38641593E~2 0.31428227E1 ~0.31403627E1 0.39152117E~3 0.12300002E~2 0.33434867E~2 0.27195117E1 ~0.27170517E1 0.45249175E~3 0.12300002E~2 0.15129001E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300002E~2 0.15129E~3 0.124230005 ~0.12177 0.1E~1 0.12300002E~2 0.15129001E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.14459E~40 0.123E~2 0.123E~2 0.10463683E36 0.12299999E~2 0.7229E~41 0.123E~2 0.123E~2 0.20927366E36 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999E~2 ~0.4185473E36 ~0.34028235E39 0.34028235E39 ~0.3614E~41 0.12299999E~2 ~0.20927364E36 ~0.17014117E39 0.17014117E39 ~0.7229E~41 0.12299999E~2 ~0.15129001E1 ~0.12299988E4 0.12300012E4 ~0.1E~5 0.12299999E~2 ~0.15129001E~1 ~0.1229877E2 0.1230123E2 ~0.100000005E~3 0.12299999E~2 ~0.38641593E~2 ~0.31403627E1 0.31428227E1 ~0.39152117E~3 0.12299999E~2 ~0.33434867E~2 ~0.27170517E1 0.27195117E1 ~0.45249175E~3 0.12299999E~2 ~0.15129001E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999E~2 ~0.15129E~3 ~0.12177 0.124230005 ~0.1E~1 0.12299999E~2 ~0.15129001E~5 0.0 0.246E~2 ~0.1E1 0.12299999E~2 ~0.14459E~40 0.123E~2 0.123E~2 ~0.10463683E36 0.12299999E~2 ~0.7229E~41 0.123E~2 0.123E~2 ~0.20927366E36 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999E~2 inf inf ~inf 0.0 0.12300002E~2 ~inf ~inf inf ~0.0 0.12299999E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300002E~2 0.39999998E1 0.34028235E39 ~0.34028235E39 0.0 0.11754945E~37 0.19999999E1 0.17014117E39 ~0.17014117E39 0.0 0.11754945E~37 0.1445858E~34 0.123E4 ~0.123E4 0.9557E~41 0.11754945E~37 0.14458581E~36 0.123E2 ~0.123E2 0.955687E~39 0.11754945E~37 0.36929245E~37 0.31415927E1 ~0.31415927E1 0.3741715E~38 0.11754945E~37 0.31953248E~37 0.27182817E1 ~0.27182817E1 0.4324403E~38 0.11754945E~37 0.14458581E~37 0.123E1 ~0.123E1 0.9556864E~38 0.11754945E~37 0.1445858E~38 0.123 ~0.123 0.9556864E~37 0.11754945E~37 0.14459E~40 0.123E~2 ~0.123E~2 0.95568645E~35 0.11754945E~37 0.0 0.23509887E~37 0.0 0.1E1 0.11754944E~37 0.0 0.17632415E~37 0.5877472E~38 0.2E1 0.11754942E~37 0.0 0.11754945E~37 0.11754942E~37 0.8388608E7 0.11754942E~37 0.0 0.11754944E~37 0.11754944E~37 inf 0.11754942E~37 ~0.39999998E1 ~0.34028235E39 0.34028235E39 ~0.0 0.11754942E~37 ~0.19999999E1 ~0.17014117E39 0.17014117E39 ~0.0 0.11754942E~37 ~0.1445858E~34 ~0.123E4 0.123E4 ~0.9557E~41 0.11754942E~37 ~0.14458581E~36 ~0.123E2 0.123E2 ~0.955687E~39 0.11754942E~37 ~0.36929245E~37 ~0.31415927E1 0.31415927E1 ~0.3741715E~38 0.11754942E~37 ~0.31953248E~37 ~0.27182817E1 0.27182817E1 ~0.4324403E~38 0.11754942E~37 ~0.14458581E~37 ~0.123E1 0.123E1 ~0.9556864E~38 0.11754942E~37 ~0.1445858E~38 ~0.123 0.123 ~0.9556864E~37 0.11754942E~37 ~0.14459E~40 ~0.123E~2 0.123E~2 ~0.95568645E~35 0.11754942E~37 ~0.0 0.0 0.23509887E~37 ~0.1E1 0.11754942E~37 ~0.0 0.5877472E~38 0.17632415E~37 ~0.2E1 0.11754942E~37 ~0.0 0.11754942E~37 0.11754945E~37 ~0.8388608E7 0.11754942E~37 ~0.0 0.11754944E~37 0.11754944E~37 ~inf 0.11754942E~37 inf inf ~inf 0.0 0.11754945E~37 ~inf ~inf inf ~0.0 0.11754942E~37 nan nan nan nan nan inf inf ~inf 0.0 0.11754945E~37 0.19999999E1 0.34028235E39 ~0.34028235E39 0.0 0.5877473E~38 0.99999994 0.17014117E39 ~0.17014117E39 0.0 0.5877473E~38 0.722929E~35 0.123E4 ~0.123E4 0.4778E~41 0.5877473E~38 0.72292904E~37 0.123E2 ~0.123E2 0.477843E~39 0.5877473E~38 0.18464623E~37 0.31415927E1 ~0.31415927E1 0.1870857E~38 0.5877473E~38 0.15976624E~37 0.27182817E1 ~0.27182817E1 0.2162201E~38 0.5877473E~38 0.722929E~38 0.123E1 ~0.123E1 0.4778432E~38 0.5877473E~38 0.722928E~39 0.123 ~0.123 0.4778432E~37 0.5877473E~38 0.7229E~41 0.123E~2 ~0.123E~2 0.47784322E~35 0.5877473E~38 0.0 0.17632415E~37 ~0.5877472E~38 0.5 0.5877473E~38 0.0 0.11754944E~37 0.0 0.1E1 0.5877472E~38 0.0 0.5877473E~38 0.587747E~38 0.4194304E7 0.587747E~38 0.0 0.5877472E~38 0.5877472E~38 inf 0.587747E~38 ~0.19999999E1 ~0.34028235E39 0.34028235E39 ~0.0 0.587747E~38 ~0.99999994 ~0.17014117E39 0.17014117E39 ~0.0 0.587747E~38 ~0.722929E~35 ~0.123E4 0.123E4 ~0.4778E~41 0.587747E~38 ~0.72292904E~37 ~0.123E2 0.123E2 ~0.477843E~39 0.587747E~38 ~0.18464623E~37 ~0.31415927E1 0.31415927E1 ~0.1870857E~38 0.587747E~38 ~0.15976624E~37 ~0.27182817E1 0.27182817E1 ~0.2162201E~38 0.587747E~38 ~0.722929E~38 ~0.123E1 0.123E1 ~0.4778432E~38 0.587747E~38 ~0.722928E~39 ~0.123 0.123 ~0.4778432E~37 0.587747E~38 ~0.7229E~41 ~0.123E~2 0.123E~2 ~0.47784322E~35 0.587747E~38 ~0.0 ~0.5877472E~38 0.17632415E~37 ~0.5 0.587747E~38 ~0.0 0.0 0.11754944E~37 ~0.1E1 0.587747E~38 ~0.0 0.587747E~38 0.5877473E~38 ~0.4194304E7 0.587747E~38 ~0.0 0.5877472E~38 0.5877472E~38 ~inf 0.587747E~38 inf inf ~inf 0.0 0.5877473E~38 ~inf ~inf inf ~0.0 0.587747E~38 nan nan nan nan nan inf inf ~inf 0.0 0.5877473E~38 0.47683713E~6 0.34028235E39 ~0.34028235E39 0.0 0.3E~44 0.23841856E~6 0.17014117E39 ~0.17014117E39 0.0 0.3E~44 0.1724E~41 0.123E4 ~0.123E4 0.0 0.3E~44 0.17E~43 0.123E2 ~0.123E2 0.0 0.3E~44 0.4E~44 0.31415927E1 ~0.31415927E1 0.0 0.3E~44 0.4E~44 0.27182817E1 ~0.27182817E1 0.0 0.3E~44 0.1E~44 0.123E1 ~0.123E1 0.1E~44 0.3E~44 0.0 0.123 ~0.123 0.11E~43 0.3E~44 0.0 0.123E~2 ~0.123E~2 0.1139E~41 0.3E~44 0.0 0.11754945E~37 ~0.11754942E~37 0.11920929E~6 0.3E~44 0.0 0.5877473E~38 ~0.587747E~38 0.23841858E~6 0.3E~44 0.0 0.3E~44 0.0 0.1E1 0.1E~44 0.0 0.1E~44 0.1E~44 inf 0.0 ~0.47683713E~6 ~0.34028235E39 0.34028235E39 ~0.0 0.0 ~0.23841856E~6 ~0.17014117E39 0.17014117E39 ~0.0 0.0 ~0.1724E~41 ~0.123E4 0.123E4 ~0.0 0.0 ~0.17E~43 ~0.123E2 0.123E2 ~0.0 0.0 ~0.4E~44 ~0.31415927E1 0.31415927E1 ~0.0 0.0 ~0.4E~44 ~0.27182817E1 0.27182817E1 ~0.0 0.0 ~0.1E~44 ~0.123E1 0.123E1 ~0.1E~44 0.0 ~0.0 ~0.123 0.123 ~0.11E~43 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.1139E~41 0.0 ~0.0 ~0.11754942E~37 0.11754945E~37 ~0.11920929E~6 0.0 ~0.0 ~0.587747E~38 0.5877473E~38 ~0.23841858E~6 0.0 ~0.0 0.0 0.3E~44 ~0.1E1 0.0 ~0.0 0.1E~44 0.1E~44 ~inf 0.0 inf inf ~inf 0.0 0.3E~44 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.3E~44 0.0 0.34028235E39 ~0.34028235E39 0.0 0.1E~44 0.0 0.17014117E39 ~0.17014117E39 0.0 0.1E~44 0.0 0.123E4 ~0.123E4 0.0 0.1E~44 0.0 0.123E2 ~0.123E2 0.0 0.1E~44 0.0 0.31415927E1 ~0.31415927E1 0.0 0.1E~44 0.0 0.27182817E1 ~0.27182817E1 0.0 0.1E~44 0.0 0.123E1 ~0.123E1 0.0 0.1E~44 0.0 0.123 ~0.123 0.0 0.1E~44 0.0 0.123E~2 ~0.123E~2 0.0 0.1E~44 0.0 0.11754944E~37 ~0.11754944E~37 0.0 0.1E~44 0.0 0.5877472E~38 ~0.5877472E~38 0.0 0.1E~44 0.0 0.1E~44 ~0.1E~44 0.0 0.1E~44 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.34028235E39 0.34028235E39 ~0.0 ~0.1E~44 ~0.0 ~0.17014117E39 0.17014117E39 ~0.0 ~0.1E~44 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.1E~44 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.1E~44 ~0.0 ~0.31415927E1 0.31415927E1 ~0.0 ~0.1E~44 ~0.0 ~0.27182817E1 0.27182817E1 ~0.0 ~0.1E~44 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.1E~44 ~0.0 ~0.123 0.123 ~0.0 ~0.1E~44 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.1E~44 ~0.0 ~0.11754944E~37 0.11754944E~37 ~0.0 ~0.1E~44 ~0.0 ~0.5877472E~38 0.5877472E~38 ~0.0 ~0.1E~44 ~0.0 ~0.1E~44 0.1E~44 ~0.0 ~0.1E~44 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.1E~44 nan ~inf inf ~0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf 0.0 0.1E~44 ~inf 0.0 ~inf ~0.1E1 ~0.34028233E39 ~inf ~0.17014117E39 ~inf ~0.2E1 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.2766523E36 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665232E38 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.10831523E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.12518288E39 ~0.34028233E39 ~inf ~0.34028235E39 ~0.34028235E39 ~0.27665231E39 ~0.34028233E39 ~0.4185473E38 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.4185473E36 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.39999998E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.19999999E1 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.47683713E~6 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 ~0.0 ~0.34028235E39 ~0.34028235E39 ~inf ~0.34028233E39 inf ~inf 0.0 0.1E1 ~0.34028235E39 inf ~inf ~0.17014117E39 0.2E1 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.2766523E36 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665232E38 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.10831523E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.12518288E39 ~0.34028233E39 inf ~0.34028235E39 ~0.34028235E39 0.27665231E39 ~0.34028233E39 0.4185473E38 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.4185473E36 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.39999998E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.19999999E1 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.47683713E~6 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 0.0 ~0.34028235E39 ~0.34028235E39 inf ~0.34028233E39 ~inf inf ~inf ~0.0 ~0.34028233E39 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.34028233E39 ~inf 0.17014117E39 ~inf ~0.5 ~0.17014116E39 ~inf 0.0 ~0.34028235E39 ~0.1E1 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832615E36 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.13832616E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.54157613E38 ~0.17014116E39 ~inf ~0.17014117E39 ~0.17014117E39 ~0.6259144E38 ~0.17014116E39 ~0.20927364E39 ~0.17014117E39 ~0.17014117E39 ~0.13832616E39 ~0.17014116E39 ~0.20927365E38 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.20927364E36 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.19999999E1 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.99999994 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.23841856E~6 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 ~0.0 ~0.17014117E39 ~0.17014117E39 ~inf ~0.17014116E39 inf ~inf 0.17014117E39 0.5 ~0.17014118E39 inf ~0.34028235E39 0.0 0.1E1 ~0.17014117E39 inf ~0.17014117E39 ~0.17014117E39 0.13832615E36 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.13832616E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.54157613E38 ~0.17014116E39 inf ~0.17014117E39 ~0.17014117E39 0.6259144E38 ~0.17014116E39 0.20927364E39 ~0.17014117E39 ~0.17014117E39 0.13832616E39 ~0.17014116E39 0.20927365E38 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.20927364E36 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.19999999E1 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.99999994 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.23841856E~6 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 0.0 ~0.17014117E39 ~0.17014117E39 inf ~0.17014116E39 ~inf inf ~inf ~0.0 ~0.17014116E39 inf ~inf inf 0.0 ~0.17014118E39 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17014116E39 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~35 ~0.12299999E4 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~35 ~0.12299999E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999E4 ~0.38641592E4 ~0.12268584E4 ~0.12331416E4 ~0.39152115E3 ~0.12299999E4 ~0.33434866E4 ~0.12272817E4 ~0.12327183E4 ~0.45249173E3 ~0.12299999E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999E4 ~0.15129001E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999E4 ~0.15129001E1 ~0.12299988E4 ~0.12300012E4 ~0.99999994E6 ~0.12299999E4 ~0.1445858E~34 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.722929E~35 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.1724E~41 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999E4 inf ~0.34028235E39 0.34028235E39 0.36146455E~35 ~0.12300001E4 inf ~0.17014117E39 0.17014117E39 0.7229291E~35 ~0.12300001E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999E4 0.38641592E4 ~0.12331416E4 ~0.12268584E4 0.39152115E3 ~0.12299999E4 0.33434866E4 ~0.12327183E4 ~0.12272817E4 0.45249173E3 ~0.12299999E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999E4 0.15129001E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999E4 0.15129001E1 ~0.12300012E4 ~0.12299988E4 0.99999994E6 ~0.12299999E4 0.1445858E~34 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.722929E~35 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.1724E~41 ~0.123E4 ~0.123E4 inf ~0.12299999E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999E4 ~inf inf ~inf ~0.0 ~0.12299999E4 inf ~inf inf 0.0 ~0.12300001E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E4 ~inf 0.34028235E39 ~0.34028235E39 ~0.36146455E~37 ~0.12299999E2 ~inf 0.17014117E39 ~0.17014117E39 ~0.7229291E~37 ~0.12299999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999E2 ~0.15129001E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999E2 ~0.3864159E2 ~0.9158407E1 ~0.15441593E2 ~0.39152114E1 ~0.12299999E2 ~0.33434868E2 ~0.9581718E1 ~0.15018282E2 ~0.4524917E1 ~0.12299999E2 ~0.15129001E2 ~0.1107E2 ~0.13530001E2 ~0.1E2 ~0.12299999E2 ~0.15129001E1 ~0.12177E2 ~0.12423E2 ~0.1E3 ~0.12299999E2 ~0.15129001E~1 ~0.1229877E2 ~0.1230123E2 ~0.1E5 ~0.12299999E2 ~0.14458581E~36 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.72292904E~37 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.17E~43 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999E2 inf ~0.34028235E39 0.34028235E39 0.36146455E~37 ~0.12300001E2 inf ~0.17014117E39 0.17014117E39 0.7229291E~37 ~0.12300001E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300001E2 0.15129001E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864159E2 ~0.15441593E2 ~0.9158407E1 0.39152114E1 ~0.12299999E2 0.33434868E2 ~0.15018282E2 ~0.9581718E1 0.4524917E1 ~0.12299999E2 0.15129001E2 ~0.13530001E2 ~0.1107E2 0.1E2 ~0.12299999E2 0.15129001E1 ~0.12423E2 ~0.12177E2 0.1E3 ~0.12299999E2 0.15129001E~1 ~0.1230123E2 ~0.1229877E2 0.1E5 ~0.12299999E2 0.14458581E~36 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.72292904E~37 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.17E~43 ~0.123E2 ~0.123E2 inf ~0.12299999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999E2 ~inf inf ~inf ~0.0 ~0.12299999E2 inf ~inf inf 0.0 ~0.12300001E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E2 ~inf 0.34028235E39 ~0.34028235E39 ~0.9232312E~38 ~0.31415925E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.18464624E~37 ~0.31415925E1 ~0.38641592E4 0.12268584E4 ~0.12331416E4 ~0.25541405E~2 ~0.31415925E1 ~0.3864159E2 0.9158407E1 ~0.15441593E2 ~0.25541404 ~0.31415925E1 ~0.9869605E1 0.0 ~0.62831855E1 ~0.1E1 ~0.31415925E1 ~0.8539734E1 ~0.423311 ~0.58598747E1 ~0.11557274E1 ~0.31415925E1 ~0.3864159E1 ~0.19115927E1 ~0.43715925E1 ~0.25541403E1 ~0.31415925E1 ~0.38641593 ~0.30185928E1 ~0.32645926E1 ~0.25541403E2 ~0.31415925E1 ~0.38641593E~2 ~0.31403627E1 ~0.31428227E1 ~0.25541404E4 ~0.31415925E1 ~0.36929245E~37 ~0.31415927E1 ~0.31415927E1 ~0.26725715E39 ~0.31415925E1 ~0.18464623E~37 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.4E~44 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 ~0.0 ~0.31415927E1 ~0.31415927E1 ~inf ~0.31415925E1 inf ~0.34028235E39 0.34028235E39 0.9232312E~38 ~0.3141593E1 inf ~0.17014117E39 0.17014117E39 0.18464624E~37 ~0.3141593E1 0.38641592E4 ~0.12331416E4 0.12268584E4 0.25541405E~2 ~0.3141593E1 0.3864159E2 ~0.15441593E2 0.9158407E1 0.25541404 ~0.3141593E1 0.9869605E1 ~0.62831855E1 0.0 0.1E1 ~0.31415927E1 0.8539734E1 ~0.58598747E1 ~0.423311 0.11557274E1 ~0.31415925E1 0.3864159E1 ~0.43715925E1 ~0.19115927E1 0.25541403E1 ~0.31415925E1 0.38641593 ~0.32645926E1 ~0.30185928E1 0.25541403E2 ~0.31415925E1 0.38641593E~2 ~0.31428227E1 ~0.31403627E1 0.25541404E4 ~0.31415925E1 0.36929245E~37 ~0.31415927E1 ~0.31415927E1 0.26725715E39 ~0.31415925E1 0.18464623E~37 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.4E~44 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 0.0 ~0.31415927E1 ~0.31415927E1 inf ~0.31415925E1 ~inf inf ~inf ~0.0 ~0.31415925E1 inf ~inf inf 0.0 ~0.3141593E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415925E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.7988312E~38 ~0.27182815E1 ~inf 0.17014117E39 ~0.17014117E39 ~0.15976626E~37 ~0.27182815E1 ~0.33434866E4 0.12272817E4 ~0.12327183E4 ~0.22099852E~2 ~0.27182815E1 ~0.33434868E2 0.9581718E1 ~0.15018282E2 ~0.22099851 ~0.27182815E1 ~0.8539734E1 0.423311 ~0.58598747E1 ~0.86525595 ~0.27182815E1 ~0.73890557E1 0.0 ~0.54365635E1 ~0.1E1 ~0.27182815E1 ~0.33434865E1 ~0.14882817E1 ~0.39482818E1 ~0.2209985E1 ~0.27182815E1 ~0.33434868 ~0.25952818E1 ~0.28412817E1 ~0.22099852E2 ~0.27182815E1 ~0.33434867E~2 ~0.27170517E1 ~0.27195117E1 ~0.2209985E4 ~0.27182815E1 ~0.31953248E~37 ~0.27182817E1 ~0.27182817E1 ~0.23124584E39 ~0.27182815E1 ~0.15976624E~37 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.4E~44 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 ~0.0 ~0.27182817E1 ~0.27182817E1 ~inf ~0.27182815E1 inf ~0.34028235E39 0.34028235E39 0.7988312E~38 ~0.2718282E1 inf ~0.17014117E39 0.17014117E39 0.15976626E~37 ~0.2718282E1 0.33434866E4 ~0.12327183E4 0.12272817E4 0.22099852E~2 ~0.2718282E1 0.33434868E2 ~0.15018282E2 0.9581718E1 0.22099851 ~0.2718282E1 0.8539734E1 ~0.58598747E1 0.423311 0.86525595 ~0.2718282E1 0.73890557E1 ~0.54365635E1 0.0 0.1E1 ~0.27182817E1 0.33434865E1 ~0.39482818E1 ~0.14882817E1 0.2209985E1 ~0.27182815E1 0.33434868 ~0.28412817E1 ~0.25952818E1 0.22099852E2 ~0.27182815E1 0.33434867E~2 ~0.27195117E1 ~0.27170517E1 0.2209985E4 ~0.27182815E1 0.31953248E~37 ~0.27182817E1 ~0.27182817E1 0.23124584E39 ~0.27182815E1 0.15976624E~37 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.4E~44 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 0.0 ~0.27182817E1 ~0.27182817E1 inf ~0.27182815E1 ~inf inf ~inf ~0.0 ~0.27182815E1 inf ~inf inf 0.0 ~0.2718282E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182815E1 ~inf 0.34028235E39 ~0.34028235E39 ~0.3614645E~38 ~0.12299999E1 ~0.20927364E39 0.17014117E39 ~0.17014117E39 ~0.12299999E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999E1 ~0.15129001E2 0.1107E2 ~0.13530001E2 ~0.1 ~0.12299999E1 ~0.3864159E1 0.19115927E1 ~0.43715925E1 ~0.39152116 ~0.12299999E1 ~0.33434865E1 0.14882817E1 ~0.39482818E1 ~0.45249173 ~0.12299999E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999E1 ~0.15129001E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999E1 ~0.14458581E~37 ~0.123E1 ~0.123E1 ~0.10463683E39 ~0.12299999E1 ~0.722929E~38 ~0.123E1 ~0.123E1 ~0.20927366E39 ~0.12299999E1 ~0.1E~44 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999E1 inf ~0.34028235E39 0.34028235E39 0.3614645E~38 ~0.12300001E1 0.20927364E39 ~0.17014117E39 0.17014117E39 ~0.12300001E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300001E1 0.15129001E2 ~0.13530001E2 0.1107E2 0.1 ~0.12300001E1 0.3864159E1 ~0.43715925E1 0.19115927E1 0.39152116 ~0.12300001E1 0.33434865E1 ~0.39482818E1 0.14882817E1 0.45249173 ~0.12300001E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999E1 0.15129001E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999E1 0.14458581E~37 ~0.123E1 ~0.123E1 0.10463683E39 ~0.12299999E1 0.722929E~38 ~0.123E1 ~0.123E1 0.20927366E39 ~0.12299999E1 0.1E~44 ~0.123E1 ~0.123E1 inf ~0.12299999E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999E1 ~inf inf ~inf ~0.0 ~0.12299999E1 inf ~inf inf 0.0 ~0.12300001E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E1 ~0.4185473E38 0.34028235E39 ~0.34028235E39 ~0.361465E~39 ~0.122999996 ~0.20927365E38 0.17014117E39 ~0.17014117E39 ~0.722928E~39 ~0.122999996 ~0.15129001E3 0.1229877E4 ~0.1230123E4 ~0.100000005E~3 ~0.122999996 ~0.15129001E1 0.12177E2 ~0.12423E2 ~0.1E~1 ~0.122999996 ~0.38641593 0.30185928E1 ~0.32645926E1 ~0.39152116E~1 ~0.122999996 ~0.33434868 0.25952818E1 ~0.28412817E1 ~0.45249175E~1 ~0.122999996 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.122999996 ~0.15129001E~1 0.0 ~0.246 ~0.1E1 ~0.122999996 ~0.15129E~3 ~0.12177 ~0.124230005 ~0.1E3 ~0.122999996 ~0.1445858E~38 ~0.123 ~0.123 ~0.10463683E38 ~0.122999996 ~0.722928E~39 ~0.123 ~0.123 ~0.20927366E38 ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 ~0.0 ~0.123 ~0.123 ~inf ~0.122999996 0.4185473E38 ~0.34028235E39 0.34028235E39 0.361465E~39 ~0.12300001 0.20927365E38 ~0.17014117E39 0.17014117E39 0.722928E~39 ~0.12300001 0.15129001E3 ~0.1230123E4 0.1229877E4 0.100000005E~3 ~0.12300001 0.15129001E1 ~0.12423E2 0.12177E2 0.1E~1 ~0.12300001 0.38641593 ~0.32645926E1 0.30185928E1 0.39152116E~1 ~0.12300001 0.33434868 ~0.28412817E1 0.25952818E1 0.45249175E~1 ~0.12300001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300001 0.15129001E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.124230005 ~0.12177 0.1E3 ~0.122999996 0.1445858E~38 ~0.123 ~0.123 0.10463683E38 ~0.122999996 0.722928E~39 ~0.123 ~0.123 0.20927366E38 ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 0.0 ~0.123 ~0.123 inf ~0.122999996 ~inf inf ~inf ~0.0 ~0.122999996 inf ~inf inf 0.0 ~0.12300001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.122999996 ~0.4185473E36 0.34028235E39 ~0.34028235E39 ~0.3614E~41 ~0.12299999E~2 ~0.20927364E36 0.17014117E39 ~0.17014117E39 ~0.7229E~41 ~0.12299999E~2 ~0.15129001E1 0.12299988E4 ~0.12300012E4 ~0.1E~5 ~0.12299999E~2 ~0.15129001E~1 0.1229877E2 ~0.1230123E2 ~0.100000005E~3 ~0.12299999E~2 ~0.38641593E~2 0.31403627E1 ~0.31428227E1 ~0.39152117E~3 ~0.12299999E~2 ~0.33434867E~2 0.27170517E1 ~0.27195117E1 ~0.45249175E~3 ~0.12299999E~2 ~0.15129001E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999E~2 ~0.15129E~3 0.12177 ~0.124230005 ~0.1E~1 ~0.12299999E~2 ~0.15129001E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999E~2 ~0.14459E~40 ~0.123E~2 ~0.123E~2 ~0.10463683E36 ~0.12299999E~2 ~0.7229E~41 ~0.123E~2 ~0.123E~2 ~0.20927366E36 ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999E~2 0.4185473E36 ~0.34028235E39 0.34028235E39 0.3614E~41 ~0.12300002E~2 0.20927364E36 ~0.17014117E39 0.17014117E39 0.7229E~41 ~0.12300002E~2 0.15129001E1 ~0.12300012E4 0.12299988E4 0.1E~5 ~0.12300002E~2 0.15129001E~1 ~0.1230123E2 0.1229877E2 0.100000005E~3 ~0.12300002E~2 0.38641593E~2 ~0.31428227E1 0.31403627E1 0.39152117E~3 ~0.12300002E~2 0.33434867E~2 ~0.27195117E1 0.27170517E1 0.45249175E~3 ~0.12300002E~2 0.15129001E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300002E~2 0.15129E~3 ~0.124230005 0.12177 0.1E~1 ~0.12300002E~2 0.15129001E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.14459E~40 ~0.123E~2 ~0.123E~2 0.10463683E36 ~0.12299999E~2 0.7229E~41 ~0.123E~2 ~0.123E~2 0.20927366E36 ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999E~2 ~inf inf ~inf ~0.0 ~0.12299999E~2 inf ~inf inf 0.0 ~0.12300002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999E~2 ~0.39999998E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.11754942E~37 ~0.19999999E1 0.17014117E39 ~0.17014117E39 ~0.0 ~0.11754942E~37 ~0.1445858E~34 0.123E4 ~0.123E4 ~0.9557E~41 ~0.11754942E~37 ~0.14458581E~36 0.123E2 ~0.123E2 ~0.955687E~39 ~0.11754942E~37 ~0.36929245E~37 0.31415927E1 ~0.31415927E1 ~0.3741715E~38 ~0.11754942E~37 ~0.31953248E~37 0.27182817E1 ~0.27182817E1 ~0.4324403E~38 ~0.11754942E~37 ~0.14458581E~37 0.123E1 ~0.123E1 ~0.9556864E~38 ~0.11754942E~37 ~0.1445858E~38 0.123 ~0.123 ~0.9556864E~37 ~0.11754942E~37 ~0.14459E~40 0.123E~2 ~0.123E~2 ~0.95568645E~35 ~0.11754942E~37 ~0.0 0.0 ~0.23509887E~37 ~0.1E1 ~0.11754942E~37 ~0.0 ~0.5877472E~38 ~0.17632415E~37 ~0.2E1 ~0.11754942E~37 ~0.0 ~0.11754942E~37 ~0.11754945E~37 ~0.8388608E7 ~0.11754942E~37 ~0.0 ~0.11754944E~37 ~0.11754944E~37 ~inf ~0.11754942E~37 0.39999998E1 ~0.34028235E39 0.34028235E39 0.0 ~0.11754945E~37 0.19999999E1 ~0.17014117E39 0.17014117E39 0.0 ~0.11754945E~37 0.1445858E~34 ~0.123E4 0.123E4 0.9557E~41 ~0.11754945E~37 0.14458581E~36 ~0.123E2 0.123E2 0.955687E~39 ~0.11754945E~37 0.36929245E~37 ~0.31415927E1 0.31415927E1 0.3741715E~38 ~0.11754945E~37 0.31953248E~37 ~0.27182817E1 0.27182817E1 0.4324403E~38 ~0.11754945E~37 0.14458581E~37 ~0.123E1 0.123E1 0.9556864E~38 ~0.11754945E~37 0.1445858E~38 ~0.123 0.123 0.9556864E~37 ~0.11754945E~37 0.14459E~40 ~0.123E~2 0.123E~2 0.95568645E~35 ~0.11754945E~37 0.0 ~0.23509887E~37 0.0 0.1E1 ~0.11754944E~37 0.0 ~0.17632415E~37 ~0.5877472E~38 0.2E1 ~0.11754942E~37 0.0 ~0.11754945E~37 ~0.11754942E~37 0.8388608E7 ~0.11754942E~37 0.0 ~0.11754944E~37 ~0.11754944E~37 inf ~0.11754942E~37 ~inf inf ~inf ~0.0 ~0.11754942E~37 inf ~inf inf 0.0 ~0.11754945E~37 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11754942E~37 ~0.19999999E1 0.34028235E39 ~0.34028235E39 ~0.0 ~0.587747E~38 ~0.99999994 0.17014117E39 ~0.17014117E39 ~0.0 ~0.587747E~38 ~0.722929E~35 0.123E4 ~0.123E4 ~0.4778E~41 ~0.587747E~38 ~0.72292904E~37 0.123E2 ~0.123E2 ~0.477843E~39 ~0.587747E~38 ~0.18464623E~37 0.31415927E1 ~0.31415927E1 ~0.1870857E~38 ~0.587747E~38 ~0.15976624E~37 0.27182817E1 ~0.27182817E1 ~0.2162201E~38 ~0.587747E~38 ~0.722929E~38 0.123E1 ~0.123E1 ~0.4778432E~38 ~0.587747E~38 ~0.722928E~39 0.123 ~0.123 ~0.4778432E~37 ~0.587747E~38 ~0.7229E~41 0.123E~2 ~0.123E~2 ~0.47784322E~35 ~0.587747E~38 ~0.0 0.5877472E~38 ~0.17632415E~37 ~0.5 ~0.587747E~38 ~0.0 0.0 ~0.11754944E~37 ~0.1E1 ~0.587747E~38 ~0.0 ~0.587747E~38 ~0.5877473E~38 ~0.4194304E7 ~0.587747E~38 ~0.0 ~0.5877472E~38 ~0.5877472E~38 ~inf ~0.587747E~38 0.19999999E1 ~0.34028235E39 0.34028235E39 0.0 ~0.5877473E~38 0.99999994 ~0.17014117E39 0.17014117E39 0.0 ~0.5877473E~38 0.722929E~35 ~0.123E4 0.123E4 0.4778E~41 ~0.5877473E~38 0.72292904E~37 ~0.123E2 0.123E2 0.477843E~39 ~0.5877473E~38 0.18464623E~37 ~0.31415927E1 0.31415927E1 0.1870857E~38 ~0.5877473E~38 0.15976624E~37 ~0.27182817E1 0.27182817E1 0.2162201E~38 ~0.5877473E~38 0.722929E~38 ~0.123E1 0.123E1 0.4778432E~38 ~0.5877473E~38 0.722928E~39 ~0.123 0.123 0.4778432E~37 ~0.5877473E~38 0.7229E~41 ~0.123E~2 0.123E~2 0.47784322E~35 ~0.5877473E~38 0.0 ~0.17632415E~37 0.5877472E~38 0.5 ~0.5877473E~38 0.0 ~0.11754944E~37 0.0 0.1E1 ~0.5877472E~38 0.0 ~0.5877473E~38 ~0.587747E~38 0.4194304E7 ~0.587747E~38 0.0 ~0.5877472E~38 ~0.5877472E~38 inf ~0.587747E~38 ~inf inf ~inf ~0.0 ~0.587747E~38 inf ~inf inf 0.0 ~0.5877473E~38 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.587747E~38 ~0.47683713E~6 0.34028235E39 ~0.34028235E39 ~0.0 ~0.0 ~0.23841856E~6 0.17014117E39 ~0.17014117E39 ~0.0 ~0.0 ~0.1724E~41 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.17E~43 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.4E~44 0.31415927E1 ~0.31415927E1 ~0.0 ~0.0 ~0.4E~44 0.27182817E1 ~0.27182817E1 ~0.0 ~0.0 ~0.1E~44 0.123E1 ~0.123E1 ~0.1E~44 ~0.0 ~0.0 0.123 ~0.123 ~0.11E~43 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.1139E~41 ~0.0 ~0.0 0.11754942E~37 ~0.11754945E~37 ~0.11920929E~6 ~0.0 ~0.0 0.587747E~38 ~0.5877473E~38 ~0.23841858E~6 ~0.0 ~0.0 0.0 ~0.3E~44 ~0.1E1 ~0.0 ~0.0 ~0.1E~44 ~0.1E~44 ~inf ~0.0 0.47683713E~6 ~0.34028235E39 0.34028235E39 0.0 ~0.3E~44 0.23841856E~6 ~0.17014117E39 0.17014117E39 0.0 ~0.3E~44 0.1724E~41 ~0.123E4 0.123E4 0.0 ~0.3E~44 0.17E~43 ~0.123E2 0.123E2 0.0 ~0.3E~44 0.4E~44 ~0.31415927E1 0.31415927E1 0.0 ~0.3E~44 0.4E~44 ~0.27182817E1 0.27182817E1 0.0 ~0.3E~44 0.1E~44 ~0.123E1 0.123E1 0.1E~44 ~0.3E~44 0.0 ~0.123 0.123 0.11E~43 ~0.3E~44 0.0 ~0.123E~2 0.123E~2 0.1139E~41 ~0.3E~44 0.0 ~0.11754945E~37 0.11754942E~37 0.11920929E~6 ~0.3E~44 0.0 ~0.5877473E~38 0.587747E~38 0.23841858E~6 ~0.3E~44 0.0 ~0.3E~44 0.0 0.1E1 ~0.1E~44 0.0 ~0.1E~44 ~0.1E~44 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.3E~44 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.34028235E39 ~0.34028235E39 ~0.0 0.1E~44 ~0.0 0.17014117E39 ~0.17014117E39 ~0.0 0.1E~44 ~0.0 0.123E4 ~0.123E4 ~0.0 0.1E~44 ~0.0 0.123E2 ~0.123E2 ~0.0 0.1E~44 ~0.0 0.31415927E1 ~0.31415927E1 ~0.0 0.1E~44 ~0.0 0.27182817E1 ~0.27182817E1 ~0.0 0.1E~44 ~0.0 0.123E1 ~0.123E1 ~0.0 0.1E~44 ~0.0 0.123 ~0.123 ~0.0 0.1E~44 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.1E~44 ~0.0 0.11754944E~37 ~0.11754944E~37 ~0.0 0.1E~44 ~0.0 0.5877472E~38 ~0.5877472E~38 ~0.0 0.1E~44 ~0.0 0.1E~44 ~0.1E~44 ~0.0 0.1E~44 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.34028235E39 0.34028235E39 0.0 ~0.1E~44 0.0 ~0.17014117E39 0.17014117E39 0.0 ~0.1E~44 0.0 ~0.123E4 0.123E4 0.0 ~0.1E~44 0.0 ~0.123E2 0.123E2 0.0 ~0.1E~44 0.0 ~0.31415927E1 0.31415927E1 0.0 ~0.1E~44 0.0 ~0.27182817E1 0.27182817E1 0.0 ~0.1E~44 0.0 ~0.123E1 0.123E1 0.0 ~0.1E~44 0.0 ~0.123 0.123 0.0 ~0.1E~44 0.0 ~0.123E~2 0.123E~2 0.0 ~0.1E~44 0.0 ~0.11754944E~37 0.11754944E~37 0.0 ~0.1E~44 0.0 ~0.5877472E~38 0.5877472E~38 0.0 ~0.1E~44 0.0 ~0.1E~44 0.1E~44 0.0 ~0.1E~44 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.1E~44 nan ~inf inf 0.0 ~0.1E~44 nan nan nan nan nan nan inf ~inf ~0.0 0.1E~44 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.34028235E39 0.34028235E39 0.34028235E39 0.34028235E39 0.17014117E39 0.17014117E39 0.17014117E39 0.17014117E39 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.31415927E1 0.4E1 0.3E1 0.3E1 0.27182817E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.11754944E~37 0.1E1 0.0 0.0 0.5877472E~38 0.1E1 0.0 0.0 0.1E~44 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.34028235E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.17014117E39 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.31415927E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.27182817E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.11754944E~37 ~0.0 ~0.1E1 ~0.0 ~0.5877472E~38 ~0.0 ~0.1E1 ~0.0 ~0.1E~44 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.34028235E39 = 0.99999994 * 2^128 = 0.34028235E39 0.17014117E39 = 0.99999994 * 2^127 = 0.17014117E39 0.123E4 = 0.60058594 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.31415927E1 = 0.7853982 * 2^2 = 0.31415927E1 0.27182817E1 = 0.67957044 * 2^2 = 0.27182817E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.11754944E~37 = 0.5 * 2^~125 = 0.11754944E~37 0.0 = 0.0 * 2^0 = 0.0 ~0.34028235E39 = ~0.99999994 * 2^128 = ~0.34028235E39 ~0.17014117E39 = ~0.99999994 * 2^127 = ~0.17014117E39 ~0.123E4 = ~0.60058594 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.31415927E1 = ~0.7853982 * 2^2 = ~0.31415927E1 ~0.27182817E1 = ~0.67957044 * 2^2 = ~0.27182817E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.11754944E~37 = ~0.5 * 2^~125 = ~0.11754944E~37 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large Testing Real64 Testing fmt 0.17976931348623157E309 1.797693E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 1.79769313486E308 2E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 2E308 1.7976931349E308 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 1.797693135E308 0.8988465674311579E308 8.988466E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 8.98846567431E307 9E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 9E307 8.9884656743E307 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 8.988465674E307 0.123E4 1.230000E3 1230.000000 1230 1E3 1230 1E3 1.2300000000E3 1230.0000000000 1230 0.123E2 1.230000E1 12.300000 12.3 1E1 12 10 1.2300000000E1 12.3000000000 12.3 0.3141592653589793E1 3.141593E0 3.141593 3.14159265359 3E0 3 3 3.1415926536E0 3.1415926536 3.141592654 0.2718281828459045E1 2.718282E0 2.718282 2.71828182846 3E0 3 3 2.7182818285E0 2.7182818285 2.718281828 0.123E1 1.230000E0 1.230000 1.23 1E0 1 1 1.2300000000E0 1.2300000000 1.23 0.123 1.230000E~1 0.123000 0.123 1E~1 0 0.1 1.2300000000E~1 0.1230000000 0.123 0.123E~2 1.230000E~3 0.001230 0.00123 1E~3 0 1E~3 1.2300000000E~3 0.0012300000 0.00123 0.22250738585072014E~307 2.225074E~308 0.000000 2.22507385851E~308 2E~308 0 2E~308 2.2250738585E~308 0.0000000000 2.225073859E~308 0.11125369292536007E~307 1.112537E~308 0.000000 1.11253692925E~308 1E~308 0 1E~308 1.1125369293E~308 0.0000000000 1.112536929E~308 0.5E~323 4.940656E~324 0.000000 4.94065645841E~324 5E~324 0 5E~324 4.9406564584E~324 0.0000000000 4.940656458E~324 0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 ~0.17976931348623157E309 ~1.797693E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 ~1.79769313486E308 ~2E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~2E308 ~1.7976931349E308 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000 ~1.797693135E308 ~0.8988465674311579E308 ~8.988466E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.000000 ~8.98846567431E307 ~9E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~9E307 ~8.9884656743E307 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184.0000000000 ~8.988465674E307 ~0.123E4 ~1.230000E3 ~1230.000000 ~1230 ~1E3 ~1230 ~1E3 ~1.2300000000E3 ~1230.0000000000 ~1230 ~0.123E2 ~1.230000E1 ~12.300000 ~12.3 ~1E1 ~12 ~10 ~1.2300000000E1 ~12.3000000000 ~12.3 ~0.3141592653589793E1 ~3.141593E0 ~3.141593 ~3.14159265359 ~3E0 ~3 ~3 ~3.1415926536E0 ~3.1415926536 ~3.141592654 ~0.2718281828459045E1 ~2.718282E0 ~2.718282 ~2.71828182846 ~3E0 ~3 ~3 ~2.7182818285E0 ~2.7182818285 ~2.718281828 ~0.123E1 ~1.230000E0 ~1.230000 ~1.23 ~1E0 ~1 ~1 ~1.2300000000E0 ~1.2300000000 ~1.23 ~0.123 ~1.230000E~1 ~0.123000 ~0.123 ~1E~1 ~0 ~0.1 ~1.2300000000E~1 ~0.1230000000 ~0.123 ~0.123E~2 ~1.230000E~3 ~0.001230 ~0.00123 ~1E~3 ~0 ~1E~3 ~1.2300000000E~3 ~0.0012300000 ~0.00123 ~0.22250738585072014E~307 ~2.225074E~308 ~0.000000 ~2.22507385851E~308 ~2E~308 ~0 ~2E~308 ~2.2250738585E~308 ~0.0000000000 ~2.225073859E~308 ~0.11125369292536007E~307 ~1.112537E~308 ~0.000000 ~1.11253692925E~308 ~1E~308 ~0 ~1E~308 ~1.1125369293E~308 ~0.0000000000 ~1.112536929E~308 ~0.5E~323 ~4.940656E~324 ~0.000000 ~4.94065645841E~324 ~5E~324 ~0 ~5E~324 ~4.9406564584E~324 ~0.0000000000 ~4.940656458E~324 ~0.0 0.000000E0 0.000000 0 0E0 0 0 0.0000000000E0 0.0000000000 0 Testing scan0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E2 0.123E2 0.3141592653589793E1 0.3141592653589793E1 0.2718281828459045E1 0.2718281828459045E1 0.123E1 0.123E1 0.123 0.123 0.123E~2 0.123E~2 0.22250738585072014E~307 0.22250738585072014E~307 0.11125369292536007E~307 0.11125369292536007E~307 0.5E~323 0.5E~323 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E2 ~0.123E2 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.123E1 ~0.123E1 ~0.123 ~0.123 ~0.123E~2 ~0.123E~2 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.5E~323 ~0.5E~323 ~0.0 ~0.0 inf inf ~inf ~inf nan nan inf inf Testing checkFloat Testing class, isFinite, isNan, isNormal 0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true 0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true 0.123E4 normal isFinite = true isNan = false isNormal = true 0.123E2 normal isFinite = true isNan = false isNormal = true 0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true 0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true 0.123E1 normal isFinite = true isNan = false isNormal = true 0.123 normal isFinite = true isNan = false isNormal = true 0.123E~2 normal isFinite = true isNan = false isNormal = true 0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true 0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false 0.5E~323 subnormal isFinite = true isNan = false isNormal = false 0.0 zero isFinite = true isNan = false isNormal = false ~0.17976931348623157E309 normal isFinite = true isNan = false isNormal = true ~0.8988465674311579E308 normal isFinite = true isNan = false isNormal = true ~0.123E4 normal isFinite = true isNan = false isNormal = true ~0.123E2 normal isFinite = true isNan = false isNormal = true ~0.3141592653589793E1 normal isFinite = true isNan = false isNormal = true ~0.2718281828459045E1 normal isFinite = true isNan = false isNormal = true ~0.123E1 normal isFinite = true isNan = false isNormal = true ~0.123 normal isFinite = true isNan = false isNormal = true ~0.123E~2 normal isFinite = true isNan = false isNormal = true ~0.22250738585072014E~307 normal isFinite = true isNan = false isNormal = true ~0.11125369292536007E~307 subnormal isFinite = true isNan = false isNormal = false ~0.5E~323 subnormal isFinite = true isNan = false isNormal = false ~0.0 zero isFinite = true isNan = false isNormal = false inf inf isFinite = false isNan = false isNormal = false ~inf inf isFinite = false isNan = false isNormal = false nan nan isFinite = false isNan = true isNormal = false inf inf isFinite = false isNan = false isNormal = false Testing maxFinite, minPos, minNormalPos 1.79769313486E308 1.79769313486E308 true 4.94065645841E~324 4.94065645841E~324 true 2.22507385851E~308 2.22507385851E~308 true Testring fromString Testing {from,to}Decimal inf inf true inf inf true ~inf ~inf true ~inf ~inf true inf inf true inf inf true ~inf ~inf true ~inf ~inf true nan nan true nan nan true ~nan nan false ~nan nan false 0.0 0.0 true 0.0 0.0 true 0.0 0.0 true ~0.0 ~0.0 true 0.15E2 0.15E2 true 0.15E1 0.15E1 true ~0.15E2 ~0.15E2 true 0.15E2 0.15E2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.15E~2 0.15E~2 true 0.12E1000 inf false ~0.12E1000 ~inf false 0.1E~998 0.0 false ~0.1E~998 ~0.0 false inf inf true Testing {from,to}LargeInt 0.17976931348623157E309 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 0.17976931348623157E309 0.8988465674311579E308 89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 0.8988465674311579E308 0.123E4 1230 0.123E4 0.123E2 12 0.12E2 0.3141592653589793E1 3 0.3E1 0.2718281828459045E1 2 0.2E1 0.123E1 1 0.1E1 0.123 0 0.0 0.123E~2 0 0.0 0.22250738585072014E~307 0 0.0 0.11125369292536007E~307 0 0.0 0.5E~323 0 0.0 0.0 0 0.0 ~0.17976931348623157E309 ~179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 ~0.17976931348623157E309 ~0.8988465674311579E308 ~89884656743115785407263711865852178399035283762922498299458738401578630390014269380294779316383439085770229476757191232117160663444732091384233773351768758493024955288275641038122745045194664472037934254227566971152291618451611474082904279666061674137398913102072361584369088590459649940625202013092062429184 ~0.8988465674311579E308 ~0.123E4 ~1230 ~0.123E4 ~0.123E2 ~13 ~0.13E2 ~0.3141592653589793E1 ~4 ~0.4E1 ~0.2718281828459045E1 ~3 ~0.3E1 ~0.123E1 ~2 ~0.2E1 ~0.123 ~1 ~0.1E1 ~0.123E~2 ~1 ~0.1E1 ~0.22250738585072014E~307 ~1 ~0.1E1 ~0.11125369292536007E~307 ~1 ~0.1E1 ~0.5E~323 ~1 ~0.1E1 ~0.0 0 0.0 nearest 0.0 0 nearest ~0.0 0 nearest 0.1E13 1000000000000 nearest ~0.1E13 ~1000000000000 nearest 0.25 0 nearest ~0.25 0 nearest 0.100000000000025E13 1000000000000 nearest ~0.99999999999975E12 ~1000000000000 nearest 0.5 0 nearest ~0.5 0 nearest 0.10000000000005E13 1000000000000 nearest ~0.9999999999995E12 ~1000000000000 nearest 0.75 1 nearest ~0.75 ~1 nearest 0.100000000000075E13 1000000000001 nearest ~0.99999999999925E12 ~999999999999 nearest 0.1E1 1 nearest ~0.1E1 ~1 nearest 0.1000000000001E13 1000000000001 nearest ~0.999999999999E12 ~999999999999 nearest 0.125E1 1 nearest ~0.125E1 ~1 nearest 0.100000000000125E13 1000000000001 nearest ~0.99999999999875E12 ~999999999999 nearest 0.15E1 2 nearest ~0.15E1 ~2 nearest 0.10000000000015E13 1000000000002 nearest ~0.9999999999985E12 ~999999999998 nearest 0.175E1 2 nearest ~0.175E1 ~2 nearest 0.100000000000175E13 1000000000002 nearest ~0.99999999999825E12 ~999999999998 nearest 0.2E1 2 nearest ~0.2E1 ~2 nearest 0.1000000000002E13 1000000000002 nearest ~0.999999999998E12 ~999999999998 nearest 0.25E1 2 nearest ~0.25E1 ~2 nearest 0.10000000000025E13 1000000000002 nearest ~0.9999999999975E12 ~999999999998 nearest 0.3E1 3 nearest ~0.3E1 ~3 nearest 0.1000000000003E13 1000000000003 nearest ~0.999999999997E12 ~999999999997 neginf 0.0 0 neginf ~0.0 0 neginf 0.1E13 1000000000000 neginf ~0.1E13 ~1000000000000 neginf 0.25 0 neginf ~0.25 ~1 neginf 0.100000000000025E13 1000000000000 neginf ~0.99999999999975E12 ~1000000000000 neginf 0.5 0 neginf ~0.5 ~1 neginf 0.10000000000005E13 1000000000000 neginf ~0.9999999999995E12 ~1000000000000 neginf 0.75 0 neginf ~0.75 ~1 neginf 0.100000000000075E13 1000000000000 neginf ~0.99999999999925E12 ~1000000000000 neginf 0.1E1 1 neginf ~0.1E1 ~1 neginf 0.1000000000001E13 1000000000001 neginf ~0.999999999999E12 ~999999999999 neginf 0.125E1 1 neginf ~0.125E1 ~2 neginf 0.100000000000125E13 1000000000001 neginf ~0.99999999999875E12 ~999999999999 neginf 0.15E1 1 neginf ~0.15E1 ~2 neginf 0.10000000000015E13 1000000000001 neginf ~0.9999999999985E12 ~999999999999 neginf 0.175E1 1 neginf ~0.175E1 ~2 neginf 0.100000000000175E13 1000000000001 neginf ~0.99999999999825E12 ~999999999999 neginf 0.2E1 2 neginf ~0.2E1 ~2 neginf 0.1000000000002E13 1000000000002 neginf ~0.999999999998E12 ~999999999998 neginf 0.25E1 2 neginf ~0.25E1 ~3 neginf 0.10000000000025E13 1000000000002 neginf ~0.9999999999975E12 ~999999999998 neginf 0.3E1 3 neginf ~0.3E1 ~3 neginf 0.1000000000003E13 1000000000003 neginf ~0.999999999997E12 ~999999999997 posinf 0.0 0 posinf ~0.0 0 posinf 0.1E13 1000000000000 posinf ~0.1E13 ~1000000000000 posinf 0.25 1 posinf ~0.25 0 posinf 0.100000000000025E13 1000000000001 posinf ~0.99999999999975E12 ~999999999999 posinf 0.5 1 posinf ~0.5 0 posinf 0.10000000000005E13 1000000000001 posinf ~0.9999999999995E12 ~999999999999 posinf 0.75 1 posinf ~0.75 0 posinf 0.100000000000075E13 1000000000001 posinf ~0.99999999999925E12 ~999999999999 posinf 0.1E1 1 posinf ~0.1E1 ~1 posinf 0.1000000000001E13 1000000000001 posinf ~0.999999999999E12 ~999999999999 posinf 0.125E1 2 posinf ~0.125E1 ~1 posinf 0.100000000000125E13 1000000000002 posinf ~0.99999999999875E12 ~999999999998 posinf 0.15E1 2 posinf ~0.15E1 ~1 posinf 0.10000000000015E13 1000000000002 posinf ~0.9999999999985E12 ~999999999998 posinf 0.175E1 2 posinf ~0.175E1 ~1 posinf 0.100000000000175E13 1000000000002 posinf ~0.99999999999825E12 ~999999999998 posinf 0.2E1 2 posinf ~0.2E1 ~2 posinf 0.1000000000002E13 1000000000002 posinf ~0.999999999998E12 ~999999999998 posinf 0.25E1 3 posinf ~0.25E1 ~2 posinf 0.10000000000025E13 1000000000003 posinf ~0.9999999999975E12 ~999999999997 posinf 0.3E1 3 posinf ~0.3E1 ~3 posinf 0.1000000000003E13 1000000000003 posinf ~0.999999999997E12 ~999999999997 zero 0.0 0 zero ~0.0 0 zero 0.1E13 1000000000000 zero ~0.1E13 ~1000000000000 zero 0.25 0 zero ~0.25 0 zero 0.100000000000025E13 1000000000000 zero ~0.99999999999975E12 ~999999999999 zero 0.5 0 zero ~0.5 0 zero 0.10000000000005E13 1000000000000 zero ~0.9999999999995E12 ~999999999999 zero 0.75 0 zero ~0.75 0 zero 0.100000000000075E13 1000000000000 zero ~0.99999999999925E12 ~999999999999 zero 0.1E1 1 zero ~0.1E1 ~1 zero 0.1000000000001E13 1000000000001 zero ~0.999999999999E12 ~999999999999 zero 0.125E1 1 zero ~0.125E1 ~1 zero 0.100000000000125E13 1000000000001 zero ~0.99999999999875E12 ~999999999998 zero 0.15E1 1 zero ~0.15E1 ~1 zero 0.10000000000015E13 1000000000001 zero ~0.9999999999985E12 ~999999999998 zero 0.175E1 1 zero ~0.175E1 ~1 zero 0.100000000000175E13 1000000000001 zero ~0.99999999999825E12 ~999999999998 zero 0.2E1 2 zero ~0.2E1 ~2 zero 0.1000000000002E13 1000000000002 zero ~0.999999999998E12 ~999999999998 zero 0.25E1 2 zero ~0.25E1 ~2 zero 0.10000000000025E13 1000000000002 zero ~0.9999999999975E12 ~999999999997 zero 0.3E1 3 zero ~0.3E1 ~3 zero 0.1000000000003E13 1000000000003 zero ~0.999999999997E12 ~999999999997 Testing fromInt Testing toInt Testing ceil,floor,round,trunc Testing copySign, sameSign, sign, signBit Testing max, min Testing Real.Math.{acos,asin,atan,cos,cosh,exp,ln,log10,sin,sinh,sqrt,tan,tanh} nan nan 1.570796327 inf inf 709.7827129 308.2547156 inf 1 nan nan 1.570796327 inf inf 709.0895657 307.9536856 inf 9.480751908E153 1 nan nan 1.569983319 0.06642716993 inf inf 7.114769448 3.089905111 ~0.9977912763 inf 35.07135583 ~15.02083074 1 nan nan 1.489673935 0.9647326179 2.509599262 1.089905111 ~0.2632317914 109847.9943 3.507135583 ~0.272854661 1 nan nan 1.262627256 ~1 11.59195328 1.144729886 1.772453851 0.9962720762 nan nan 1.218282905 ~0.9117339148 15.15426224 1 0.4342944819 0.4107812905 7.544137103 1.648721271 ~0.4505495341 0.9913289158 nan nan 0.8881737744 0.3342377271 1.856761057 0.2070141694 0.9424888019 1.564468479 1.109053651 2.819815734 0.8425793257 1.447484052 0.1233122752 0.1223852815 0.9924450321 1.007574042 1.130884421 ~2.095570924 ~0.9100948886 0.12269009 0.3507135583 0.1236240659 1.569566326 0.00123000031 0.00122999938 0.9999992436 1.000000756 1.001230757 ~6.70074111 ~2.910094889 0.00122999969 0.00123000031 0.03507135583 0.00123000062 0.00122999938 1.570796327 2.225073859E~308 2.225073859E~308 1 1 1 ~708.3964185 ~307.6526556 2.225073859E~308 2.225073859E~308 1.491668146E~154 2.225073859E~308 2.225073859E~308 1.570796327 1.112536929E~308 1.112536929E~308 1 1 1 ~709.0895657 ~307.9536856 1.112536929E~308 1.112536929E~308 1.054768661E~154 1.112536929E~308 1.112536929E~308 1.570796327 4.940656458E~324 4.940656458E~324 1 1 1 ~744.4400719 ~323.3062153 4.940656458E~324 4.940656458E~324 2.222758749E~162 4.940656458E~324 4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.570796327 inf 0 nan nan ~inf nan ~1 nan nan ~1.569983319 0.06642716993 inf 0 nan nan 0.9977912763 ~inf nan 15.02083074 ~1 nan nan ~1.489673935 0.9647326179 nan nan 0.2632317914 ~109847.9943 nan 0.272854661 ~1 nan nan ~1.262627256 ~1 11.59195328 nan nan nan ~0.9962720762 nan nan ~1.218282905 ~0.9117339148 0.06598803585 nan nan ~0.4107812905 ~7.544137103 nan 0.4505495341 ~0.9913289158 nan nan ~0.8881737744 0.3342377271 1.856761057 nan nan ~0.9424888019 ~1.564468479 nan ~2.819815734 ~0.8425793257 1.694108602 ~0.1233122752 ~0.1223852815 0.9924450321 1.007574042 0.8842636626 nan nan ~0.12269009 nan ~0.1236240659 1.572026327 ~0.00123000031 ~0.00122999938 0.9999992436 1.000000756 0.9987707561 nan nan ~0.00122999969 ~0.00123000031 nan ~0.00123000062 ~0.00122999938 1.570796327 ~2.225073859E~308 ~2.225073859E~308 1 1 1 nan nan ~2.225073859E~308 ~2.225073859E~308 nan ~2.225073859E~308 ~2.225073859E~308 1.570796327 ~1.112536929E~308 ~1.112536929E~308 1 1 1 nan nan ~1.112536929E~308 ~1.112536929E~308 nan ~1.112536929E~308 ~1.112536929E~308 1.570796327 ~4.940656458E~324 ~4.940656458E~324 1 1 1 nan nan ~4.940656458E~324 ~4.940656458E~324 nan ~4.940656458E~324 ~4.940656458E~324 1.570796327 0 0 1 1 1 ~inf ~inf 0 0 0 0 0 nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 nan nan ~1.570796327 nan ~inf 0 nan nan nan ~inf nan nan ~1 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.570796327 nan inf inf inf inf nan inf inf nan 1 Testing Real.{*,+,-,/,nextAfter,rem} Real.Math.{atan2,pow} inf inf 0.0 0.1E1 0.17976931348623157E309 inf inf 0.8988465674311579E308 0.2E1 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E306 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.5722234971514056E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.661334345850887E308 0.17976931348623155E309 inf 0.17976931348623157E309 0.17976931348623157E309 0.1461539134034403E309 0.17976931348623155E309 0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 0.0 0.17976931348623157E309 0.17976931348623157E309 inf 0.17976931348623155E309 ~inf 0.0 inf ~0.1E1 0.17976931348623155E309 ~inf 0.8988465674311579E308 inf ~0.2E1 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E306 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.5722234971514056E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.661334345850887E308 0.17976931348623155E309 ~inf 0.17976931348623157E309 0.17976931348623157E309 ~0.1461539134034403E309 0.17976931348623155E309 ~0.22111625558806483E308 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.2211162555880648E306 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.39999999999999996E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.19999999999999998E1 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.8881784197001251E~15 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 ~0.0 0.17976931348623157E309 0.17976931348623157E309 ~inf 0.17976931348623155E309 inf inf ~inf 0.0 inf ~inf ~inf inf ~0.0 0.17976931348623155E309 nan nan nan nan nan inf inf ~inf 0.0 inf inf inf ~0.8988465674311579E308 0.5 0.898846567431158E308 inf 0.17976931348623157E309 0.0 0.1E1 0.8988465674311579E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E305 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172014E307 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.2861117485757028E308 0.8988465674311578E308 inf 0.8988465674311579E308 0.8988465674311579E308 0.3306671729254435E308 0.8988465674311578E308 0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 0.7307695670172015E308 0.8988465674311578E308 0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 0.0 0.8988465674311579E308 0.8988465674311579E308 inf 0.8988465674311578E308 ~inf ~0.8988465674311579E308 inf ~0.5 0.8988465674311578E308 ~inf 0.0 0.17976931348623157E309 ~0.1E1 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E305 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172014E307 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.2861117485757028E308 0.8988465674311578E308 ~inf 0.8988465674311579E308 0.8988465674311579E308 ~0.3306671729254435E308 0.8988465674311578E308 ~0.1105581277940324E309 0.8988465674311579E308 0.8988465674311579E308 ~0.7307695670172015E308 0.8988465674311578E308 ~0.11055812779403241E308 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.1105581277940324E306 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.19999999999999998E1 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.9999999999999999 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.44408920985006257E~15 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 ~0.0 0.8988465674311579E308 0.8988465674311579E308 ~inf 0.8988465674311578E308 inf inf ~inf 0.0 0.898846567431158E308 ~inf ~inf inf ~0.0 0.8988465674311578E308 nan nan nan nan nan inf inf ~inf 0.0 0.898846567431158E308 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~305 0.12300000000000002E4 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422981929E~304 0.12300000000000002E4 0.15129E7 0.246E4 0.0 0.1E1 0.123E4 0.15129E5 0.12423E4 0.12177E4 0.1E3 0.12299999999999998E4 0.38641589639154454E4 0.123314159265359E4 0.122685840734641E4 0.39152116000606253E3 0.12299999999999998E4 0.33434866490046256E4 0.1232718281828459E4 0.1227281718171541E4 0.4524917126408741E3 0.12299999999999998E4 0.15129E4 0.123123E4 0.122877E4 0.1E4 0.12299999999999998E4 0.15129E3 0.1230123E4 0.1229877E4 0.1E5 0.12299999999999998E4 0.15129E1 0.123000123E4 0.122999877E4 0.1E7 0.12299999999999998E4 0.27368408459638577E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.13684204229819289E~304 0.123E4 0.123E4 inf 0.12299999999999998E4 0.6077E~320 0.123E4 0.123E4 inf 0.12299999999999998E4 0.0 0.123E4 0.123E4 inf 0.12299999999999998E4 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~305 0.12299999999999998E4 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422981929E~304 0.12299999999999998E4 ~0.15129E7 0.0 0.246E4 ~0.1E1 0.12299999999999998E4 ~0.15129E5 0.12177E4 0.12423E4 ~0.1E3 0.12299999999999998E4 ~0.38641589639154454E4 0.122685840734641E4 0.123314159265359E4 ~0.39152116000606253E3 0.12299999999999998E4 ~0.33434866490046256E4 0.1227281718171541E4 0.1232718281828459E4 ~0.4524917126408741E3 0.12299999999999998E4 ~0.15129E4 0.122877E4 0.123123E4 ~0.1E4 0.12299999999999998E4 ~0.15129E3 0.1229877E4 0.1230123E4 ~0.1E5 0.12299999999999998E4 ~0.15129E1 0.122999877E4 0.123000123E4 ~0.1E7 0.12299999999999998E4 ~0.27368408459638577E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.13684204229819289E~304 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.6077E~320 0.123E4 0.123E4 ~inf 0.12299999999999998E4 ~0.0 0.123E4 0.123E4 ~inf 0.12299999999999998E4 inf inf ~inf 0.0 0.12300000000000002E4 ~inf ~inf inf ~0.0 0.12299999999999998E4 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E4 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909646E~307 0.12300000000000002E2 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.13684204229819291E~306 0.12300000000000002E2 0.15129E5 0.12423E4 ~0.12177E4 0.1E~1 0.12300000000000002E2 0.15129000000000002E3 0.246E2 0.0 0.1E1 0.123E2 0.3864158963915446E2 0.15441592653589794E2 0.9158407346410208E1 0.3915211600060626E1 0.12299999999999999E2 0.33434866490046254E2 0.15018281828459045E2 0.9581718171540956E1 0.4524917126408741E1 0.12299999999999999E2 0.15129000000000001E2 0.13530000000000001E2 0.1107E2 0.1E2 0.12299999999999999E2 0.15129000000000001E1 0.12423E2 0.12177000000000001E2 0.10000000000000001E3 0.12299999999999999E2 0.15129E~1 0.1230123E2 0.12298770000000001E2 0.1E5 0.12299999999999999E2 0.2736840845963858E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.1368420422981929E~306 0.123E2 0.123E2 inf 0.12299999999999999E2 0.6E~322 0.123E2 0.123E2 inf 0.12299999999999999E2 0.0 0.123E2 0.123E2 inf 0.12299999999999999E2 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909646E~307 0.12299999999999999E2 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.13684204229819291E~306 0.12299999999999999E2 ~0.15129E5 ~0.12177E4 0.12423E4 ~0.1E~1 0.12299999999999999E2 ~0.15129000000000002E3 0.0 0.246E2 ~0.1E1 0.12299999999999999E2 ~0.3864158963915446E2 0.9158407346410208E1 0.15441592653589794E2 ~0.3915211600060626E1 0.12299999999999999E2 ~0.33434866490046254E2 0.9581718171540956E1 0.15018281828459045E2 ~0.4524917126408741E1 0.12299999999999999E2 ~0.15129000000000001E2 0.1107E2 0.13530000000000001E2 ~0.1E2 0.12299999999999999E2 ~0.15129000000000001E1 0.12177000000000001E2 0.12423E2 ~0.10000000000000001E3 0.12299999999999999E2 ~0.15129E~1 0.12298770000000001E2 0.1230123E2 ~0.1E5 0.12299999999999999E2 ~0.2736840845963858E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.1368420422981929E~306 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.6E~322 0.123E2 0.123E2 ~inf 0.12299999999999999E2 ~0.0 0.123E2 0.123E2 ~inf 0.12299999999999999E2 inf inf ~inf 0.0 0.12300000000000002E2 ~inf ~inf inf ~0.0 0.12299999999999999E2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E2 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.17475689218952297E~307 0.31415926535897936E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.349513784379046E~307 0.31415926535897936E1 0.38641589639154454E4 0.123314159265359E4 ~0.122685840734641E4 0.25541403687721893E~2 0.31415926535897936E1 0.3864158963915446E2 0.15441592653589794E2 ~0.9158407346410208E1 0.2554140368772189 0.31415926535897936E1 0.9869604401089358E1 0.6283185307179586E1 0.0 0.1E1 0.3141592653589793E1 0.8539734222673566E1 0.5859874482048838E1 0.423310825130748 0.11557273497909217E1 0.31415926535897927E1 0.38641589639154454E1 0.43715926535897935E1 0.19115926535897931E1 0.25541403687721895E1 0.31415926535897927E1 0.38641589639154456 0.32645926535897933E1 0.3018592653589793E1 0.25541403687721896E2 0.31415926535897927E1 0.38641589639154456E~2 0.3142822653589793E1 0.3140362653589793E1 0.25541403687721895E4 0.31415926535897927E1 0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 0.14119048864730642E309 0.31415926535897927E1 0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.15E~322 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 0.0 0.3141592653589793E1 0.3141592653589793E1 inf 0.31415926535897927E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.17475689218952297E~307 0.31415926535897927E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.349513784379046E~307 0.31415926535897927E1 ~0.38641589639154454E4 ~0.122685840734641E4 0.123314159265359E4 ~0.25541403687721893E~2 0.31415926535897927E1 ~0.3864158963915446E2 ~0.9158407346410208E1 0.15441592653589794E2 ~0.2554140368772189 0.31415926535897927E1 ~0.9869604401089358E1 0.0 0.6283185307179586E1 ~0.1E1 0.31415926535897927E1 ~0.8539734222673566E1 0.423310825130748 0.5859874482048838E1 ~0.11557273497909217E1 0.31415926535897927E1 ~0.38641589639154454E1 0.19115926535897931E1 0.43715926535897935E1 ~0.25541403687721895E1 0.31415926535897927E1 ~0.38641589639154456 0.3018592653589793E1 0.32645926535897933E1 ~0.25541403687721896E2 0.31415926535897927E1 ~0.38641589639154456E~2 0.3140362653589793E1 0.3142822653589793E1 ~0.25541403687721895E4 0.31415926535897927E1 ~0.6990275687580919E~307 0.3141592653589793E1 0.3141592653589793E1 ~0.14119048864730642E309 0.31415926535897927E1 ~0.34951378437904593E~307 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.15E~322 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 ~0.0 0.3141592653589793E1 0.3141592653589793E1 ~inf 0.31415926535897927E1 inf inf ~inf 0.0 0.31415926535897936E1 ~inf ~inf inf ~0.0 0.31415926535897927E1 nan nan nan nan nan inf inf ~inf 0.0 0.31415926535897936E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.15120944591398447E~307 0.27182818284590455E1 inf 0.8988465674311579E308 ~0.8988465674311579E308 0.30241889182796895E~307 0.27182818284590455E1 0.33434866490046256E4 0.1232718281828459E4 ~0.1227281718171541E4 0.22099852263894678E~2 0.27182818284590455E1 0.33434866490046254E2 0.15018281828459045E2 ~0.9581718171540956E1 0.22099852263894673 0.27182818284590455E1 0.8539734222673566E1 0.5859874482048838E1 ~0.423310825130748 0.8652559794322651 0.27182818284590455E1 0.73890560989306495E1 0.543656365691809E1 0.0 0.1E1 0.2718281828459045E1 0.33434866490046256E1 0.3948281828459045E1 0.1488281828459045E1 0.22099852263894677E1 0.27182818284590446E1 0.33434866490046256 0.2841281828459045E1 0.25952818284590453E1 0.22099852263894675E2 0.27182818284590446E1 0.33434866490046253E~2 0.2719511828459045E1 0.2717051828459045E1 0.22099852263894677E4 0.27182818284590446E1 0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 0.12216591454104522E309 0.27182818284590446E1 0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.15E~322 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 0.0 0.2718281828459045E1 0.2718281828459045E1 inf 0.27182818284590446E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.15120944591398447E~307 0.27182818284590446E1 ~inf ~0.8988465674311579E308 0.8988465674311579E308 ~0.30241889182796895E~307 0.27182818284590446E1 ~0.33434866490046256E4 ~0.1227281718171541E4 0.1232718281828459E4 ~0.22099852263894678E~2 0.27182818284590446E1 ~0.33434866490046254E2 ~0.9581718171540956E1 0.15018281828459045E2 ~0.22099852263894673 0.27182818284590446E1 ~0.8539734222673566E1 ~0.423310825130748 0.5859874482048838E1 ~0.8652559794322651 0.27182818284590446E1 ~0.73890560989306495E1 0.0 0.543656365691809E1 ~0.1E1 0.27182818284590446E1 ~0.33434866490046256E1 0.1488281828459045E1 0.3948281828459045E1 ~0.22099852263894677E1 0.27182818284590446E1 ~0.33434866490046256 0.25952818284590453E1 0.2841281828459045E1 ~0.22099852263894675E2 0.27182818284590446E1 ~0.33434866490046253E~2 0.2717051828459045E1 0.2719511828459045E1 ~0.22099852263894677E4 0.27182818284590446E1 ~0.6048377836559378E~307 0.2718281828459045E1 0.2718281828459045E1 ~0.12216591454104522E309 0.27182818284590446E1 ~0.3024188918279689E~307 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.15E~322 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 ~0.0 0.2718281828459045E1 0.2718281828459045E1 ~inf 0.27182818284590446E1 inf inf ~inf 0.0 0.27182818284590455E1 ~inf ~inf inf ~0.0 0.27182818284590446E1 nan nan nan nan nan inf inf ~inf 0.0 0.27182818284590455E1 inf 0.17976931348623157E309 ~0.17976931348623157E309 0.6842102114909647E~308 0.12300000000000002E1 0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 0.12300000000000002E1 0.15129E4 0.123123E4 ~0.122877E4 0.1E~2 0.12300000000000002E1 0.15129000000000001E2 0.13530000000000001E2 ~0.1107E2 0.9999999999999999E~1 0.12300000000000002E1 0.38641589639154454E1 0.43715926535897935E1 ~0.19115926535897931E1 0.3915211600060625 0.12300000000000002E1 0.33434866490046256E1 0.3948281828459045E1 ~0.1488281828459045E1 0.45249171264087407 0.12300000000000002E1 0.15129E1 0.246E1 0.0 0.1E1 0.123E1 0.15129 0.1353E1 0.1107E1 0.1E2 0.12299999999999998E1 0.15129E~2 0.123123E1 0.122877E1 0.1E4 0.12299999999999998E1 0.27368408459638577E~307 0.123E1 0.123E1 0.5527906389701621E308 0.12299999999999998E1 0.1368420422981929E~307 0.123E1 0.123E1 0.11055812779403243E309 0.12299999999999998E1 0.5E~323 0.123E1 0.123E1 inf 0.12299999999999998E1 0.0 0.123E1 0.123E1 inf 0.12299999999999998E1 ~inf ~0.17976931348623157E309 0.17976931348623157E309 ~0.6842102114909647E~308 0.12299999999999998E1 ~0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 0.12299999999999998E1 ~0.15129E4 ~0.122877E4 0.123123E4 ~0.1E~2 0.12299999999999998E1 ~0.15129000000000001E2 ~0.1107E2 0.13530000000000001E2 ~0.9999999999999999E~1 0.12299999999999998E1 ~0.38641589639154454E1 ~0.19115926535897931E1 0.43715926535897935E1 ~0.3915211600060625 0.12299999999999998E1 ~0.33434866490046256E1 ~0.1488281828459045E1 0.3948281828459045E1 ~0.45249171264087407 0.12299999999999998E1 ~0.15129E1 0.0 0.246E1 ~0.1E1 0.12299999999999998E1 ~0.15129 0.1107E1 0.1353E1 ~0.1E2 0.12299999999999998E1 ~0.15129E~2 0.122877E1 0.123123E1 ~0.1E4 0.12299999999999998E1 ~0.27368408459638577E~307 0.123E1 0.123E1 ~0.5527906389701621E308 0.12299999999999998E1 ~0.1368420422981929E~307 0.123E1 0.123E1 ~0.11055812779403243E309 0.12299999999999998E1 ~0.5E~323 0.123E1 0.123E1 ~inf 0.12299999999999998E1 ~0.0 0.123E1 0.123E1 ~inf 0.12299999999999998E1 inf inf ~inf 0.0 0.12300000000000002E1 ~inf ~inf inf ~0.0 0.12299999999999998E1 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E1 0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211490966E~309 0.12300000000000001 0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 0.136842042298193E~308 0.12300000000000001 0.15129E3 0.1230123E4 ~0.1229877E4 0.1E~3 0.12300000000000001 0.15129000000000001E1 0.12423E2 ~0.12177000000000001E2 0.9999999999999998E~2 0.12300000000000001 0.38641589639154456 0.32645926535897933E1 ~0.3018592653589793E1 0.3915211600060625E~1 0.12300000000000001 0.33434866490046256 0.2841281828459045E1 ~0.25952818284590453E1 0.4524917126408741E~1 0.12300000000000001 0.15129 0.1353E1 ~0.1107E1 0.1 0.12300000000000001 0.15129E~1 0.246 0.0 0.1E1 0.123 0.15129E~3 0.12423 0.12177 0.1E3 0.12299999999999998 0.273684084596386E~308 0.123 0.123 0.55279063897016213E307 0.12299999999999998 0.136842042298193E~308 0.123 0.123 0.11055812779403243E308 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 0.0 0.123 0.123 inf 0.12299999999999998 ~0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211490966E~309 0.12299999999999998 ~0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 ~0.136842042298193E~308 0.12299999999999998 ~0.15129E3 ~0.1229877E4 0.1230123E4 ~0.1E~3 0.12299999999999998 ~0.15129000000000001E1 ~0.12177000000000001E2 0.12423E2 ~0.9999999999999998E~2 0.12299999999999998 ~0.38641589639154456 ~0.3018592653589793E1 0.32645926535897933E1 ~0.3915211600060625E~1 0.12299999999999998 ~0.33434866490046256 ~0.25952818284590453E1 0.2841281828459045E1 ~0.4524917126408741E~1 0.12299999999999998 ~0.15129 ~0.1107E1 0.1353E1 ~0.1 0.12299999999999998 ~0.15129E~1 0.0 0.246 ~0.1E1 0.12299999999999998 ~0.15129E~3 0.12177 0.12423 ~0.1E3 0.12299999999999998 ~0.273684084596386E~308 0.123 0.123 ~0.55279063897016213E307 0.12299999999999998 ~0.136842042298193E~308 0.123 0.123 ~0.11055812779403243E308 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 ~0.0 0.123 0.123 ~inf 0.12299999999999998 inf inf ~inf 0.0 0.12300000000000001 ~inf ~inf inf ~0.0 0.12299999999999998 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000001 0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 0.684210211491E~311 0.12300000000000002E~2 0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 0.1368420422982E~310 0.12300000000000002E~2 0.15129E1 0.123000123E4 ~0.122999877E4 0.1E~5 0.12300000000000002E~2 0.15129E~1 0.1230123E2 ~0.12298770000000001E2 0.9999999999999999E~4 0.12300000000000002E~2 0.38641589639154456E~2 0.3142822653589793E1 ~0.3140362653589793E1 0.3915211600060625E~3 0.12300000000000002E~2 0.33434866490046253E~2 0.2719511828459045E1 ~0.2717051828459045E1 0.45249171264087406E~3 0.12300000000000002E~2 0.15129E~2 0.123123E1 ~0.122877E1 0.1E~2 0.12300000000000002E~2 0.15129E~3 0.12423 ~0.12177 0.1E~1 0.12300000000000002E~2 0.15129E~5 0.246E~2 0.0 0.1E1 0.123E~2 0.2736840845964E~310 0.123E~2 0.123E~2 0.5527906389701621E305 0.12299999999999998E~2 0.1368420422982E~310 0.123E~2 0.123E~2 0.11055812779403243E306 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 0.0 0.123E~2 0.123E~2 inf 0.12299999999999998E~2 ~0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 ~0.684210211491E~311 0.12299999999999998E~2 ~0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 ~0.1368420422982E~310 0.12299999999999998E~2 ~0.15129E1 ~0.122999877E4 0.123000123E4 ~0.1E~5 0.12299999999999998E~2 ~0.15129E~1 ~0.12298770000000001E2 0.1230123E2 ~0.9999999999999999E~4 0.12299999999999998E~2 ~0.38641589639154456E~2 ~0.3140362653589793E1 0.3142822653589793E1 ~0.3915211600060625E~3 0.12299999999999998E~2 ~0.33434866490046253E~2 ~0.2717051828459045E1 0.2719511828459045E1 ~0.45249171264087406E~3 0.12299999999999998E~2 ~0.15129E~2 ~0.122877E1 0.123123E1 ~0.1E~2 0.12299999999999998E~2 ~0.15129E~3 ~0.12177 0.12423 ~0.1E~1 0.12299999999999998E~2 ~0.15129E~5 0.0 0.246E~2 ~0.1E1 0.12299999999999998E~2 ~0.2736840845964E~310 0.123E~2 0.123E~2 ~0.5527906389701621E305 0.12299999999999998E~2 ~0.1368420422982E~310 0.123E~2 0.123E~2 ~0.11055812779403243E306 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 ~0.0 0.123E~2 0.123E~2 ~inf 0.12299999999999998E~2 inf inf ~inf 0.0 0.12300000000000002E~2 ~inf ~inf inf ~0.0 0.12299999999999998E~2 nan nan nan nan nan inf inf ~inf 0.0 0.12300000000000002E~2 0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.2225073858507202E~307 0.27368408459638577E~304 0.123E4 ~0.123E4 0.18090031369976E~310 0.2225073858507202E~307 0.2736840845963858E~306 0.123E2 ~0.123E2 0.1809003136997725E~308 0.2225073858507202E~307 0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.7082630066519554E~308 0.2225073858507202E~307 0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.818558927632814E~308 0.2225073858507202E~307 0.27368408459638577E~307 0.123E1 ~0.123E1 0.18090031369977247E~307 0.2225073858507202E~307 0.273684084596386E~308 0.123 ~0.123 0.1809003136997725E~306 0.2225073858507202E~307 0.2736840845964E~310 0.123E~2 ~0.123E~2 0.18090031369977247E~304 0.2225073858507202E~307 0.0 0.4450147717014403E~307 0.0 0.1E1 0.22250738585072014E~307 0.0 0.3337610787760802E~307 0.11125369292536007E~307 0.2E1 0.2225073858507201E~307 0.0 0.2225073858507202E~307 0.2225073858507201E~307 0.4503599627370496E16 0.2225073858507201E~307 0.0 0.22250738585072014E~307 0.22250738585072014E~307 inf 0.2225073858507201E~307 ~0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.2225073858507201E~307 ~0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.2225073858507201E~307 ~0.27368408459638577E~304 ~0.123E4 0.123E4 ~0.18090031369976E~310 0.2225073858507201E~307 ~0.2736840845963858E~306 ~0.123E2 0.123E2 ~0.1809003136997725E~308 0.2225073858507201E~307 ~0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.7082630066519554E~308 0.2225073858507201E~307 ~0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.818558927632814E~308 0.2225073858507201E~307 ~0.27368408459638577E~307 ~0.123E1 0.123E1 ~0.18090031369977247E~307 0.2225073858507201E~307 ~0.273684084596386E~308 ~0.123 0.123 ~0.1809003136997725E~306 0.2225073858507201E~307 ~0.2736840845964E~310 ~0.123E~2 0.123E~2 ~0.18090031369977247E~304 0.2225073858507201E~307 ~0.0 0.0 0.4450147717014403E~307 ~0.1E1 0.2225073858507201E~307 ~0.0 0.11125369292536007E~307 0.3337610787760802E~307 ~0.2E1 0.2225073858507201E~307 ~0.0 0.2225073858507201E~307 0.2225073858507202E~307 ~0.4503599627370496E16 0.2225073858507201E~307 ~0.0 0.22250738585072014E~307 0.22250738585072014E~307 ~inf 0.2225073858507201E~307 inf inf ~inf 0.0 0.2225073858507202E~307 ~inf ~inf inf ~0.0 0.2225073858507201E~307 nan nan nan nan nan inf inf ~inf 0.0 0.2225073858507202E~307 0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1112536929253601E~307 0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1112536929253601E~307 0.13684204229819289E~304 0.123E4 ~0.123E4 0.904501568499E~311 0.1112536929253601E~307 0.1368420422981929E~306 0.123E2 ~0.123E2 0.90450156849886E~309 0.1112536929253601E~307 0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 0.3541315033259774E~308 0.1112536929253601E~307 0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 0.409279463816407E~308 0.1112536929253601E~307 0.1368420422981929E~307 0.123E1 ~0.123E1 0.9045015684988623E~308 0.1112536929253601E~307 0.136842042298193E~308 0.123 ~0.123 0.9045015684988624E~307 0.1112536929253601E~307 0.1368420422982E~310 0.123E~2 ~0.123E~2 0.9045015684988623E~305 0.1112536929253601E~307 0.0 0.3337610787760802E~307 ~0.11125369292536007E~307 0.5 0.1112536929253601E~307 0.0 0.22250738585072014E~307 0.0 0.1E1 0.11125369292536007E~307 0.0 0.1112536929253601E~307 0.11125369292536E~307 0.2251799813685248E16 0.11125369292536E~307 0.0 0.11125369292536007E~307 0.11125369292536007E~307 inf 0.11125369292536E~307 ~0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.11125369292536E~307 ~0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.11125369292536E~307 ~0.13684204229819289E~304 ~0.123E4 0.123E4 ~0.904501568499E~311 0.11125369292536E~307 ~0.1368420422981929E~306 ~0.123E2 0.123E2 ~0.90450156849886E~309 0.11125369292536E~307 ~0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 ~0.3541315033259774E~308 0.11125369292536E~307 ~0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 ~0.409279463816407E~308 0.11125369292536E~307 ~0.1368420422981929E~307 ~0.123E1 0.123E1 ~0.9045015684988623E~308 0.11125369292536E~307 ~0.136842042298193E~308 ~0.123 0.123 ~0.9045015684988624E~307 0.11125369292536E~307 ~0.1368420422982E~310 ~0.123E~2 0.123E~2 ~0.9045015684988623E~305 0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 0.3337610787760802E~307 ~0.5 0.11125369292536E~307 ~0.0 0.0 0.22250738585072014E~307 ~0.1E1 0.11125369292536E~307 ~0.0 0.11125369292536E~307 0.1112536929253601E~307 ~0.2251799813685248E16 0.11125369292536E~307 ~0.0 0.11125369292536007E~307 0.11125369292536007E~307 ~inf 0.11125369292536E~307 inf inf ~inf 0.0 0.1112536929253601E~307 ~inf ~inf inf ~0.0 0.11125369292536E~307 nan nan nan nan nan inf inf ~inf 0.0 0.1112536929253601E~307 0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.1E~322 0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.1E~322 0.6077E~320 0.123E4 ~0.123E4 0.0 0.1E~322 0.6E~322 0.123E2 ~0.123E2 0.0 0.1E~322 0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.1E~322 0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.1E~322 0.5E~323 0.123E1 ~0.123E1 0.5E~323 0.1E~322 0.0 0.123 ~0.123 0.4E~322 0.1E~322 0.0 0.123E~2 ~0.123E~2 0.4017E~320 0.1E~322 0.0 0.2225073858507202E~307 ~0.2225073858507201E~307 0.2220446049250313E~15 0.1E~322 0.0 0.1112536929253601E~307 ~0.11125369292536E~307 0.4440892098500626E~15 0.1E~322 0.0 0.1E~322 0.0 0.1E1 0.5E~323 0.0 0.5E~323 0.5E~323 inf 0.0 ~0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 0.0 ~0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 0.0 ~0.6077E~320 ~0.123E4 0.123E4 ~0.0 0.0 ~0.6E~322 ~0.123E2 0.123E2 ~0.0 0.0 ~0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 0.0 ~0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 0.0 ~0.5E~323 ~0.123E1 0.123E1 ~0.5E~323 0.0 ~0.0 ~0.123 0.123 ~0.4E~322 0.0 ~0.0 ~0.123E~2 0.123E~2 ~0.4017E~320 0.0 ~0.0 ~0.2225073858507201E~307 0.2225073858507202E~307 ~0.2220446049250313E~15 0.0 ~0.0 ~0.11125369292536E~307 0.1112536929253601E~307 ~0.4440892098500626E~15 0.0 ~0.0 0.0 0.1E~322 ~0.1E1 0.0 ~0.0 0.5E~323 0.5E~323 ~inf 0.0 inf inf ~inf 0.0 0.1E~322 ~inf ~inf inf ~0.0 0.0 nan nan nan nan nan inf inf ~inf 0.0 0.1E~322 0.0 0.17976931348623157E309 ~0.17976931348623157E309 0.0 0.5E~323 0.0 0.8988465674311579E308 ~0.8988465674311579E308 0.0 0.5E~323 0.0 0.123E4 ~0.123E4 0.0 0.5E~323 0.0 0.123E2 ~0.123E2 0.0 0.5E~323 0.0 0.3141592653589793E1 ~0.3141592653589793E1 0.0 0.5E~323 0.0 0.2718281828459045E1 ~0.2718281828459045E1 0.0 0.5E~323 0.0 0.123E1 ~0.123E1 0.0 0.5E~323 0.0 0.123 ~0.123 0.0 0.5E~323 0.0 0.123E~2 ~0.123E~2 0.0 0.5E~323 0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 0.0 0.5E~323 0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 0.0 0.5E~323 0.0 0.5E~323 ~0.5E~323 0.0 0.5E~323 0.0 0.0 0.0 nan 0.0 ~0.0 ~0.17976931348623157E309 0.17976931348623157E309 ~0.0 ~0.5E~323 ~0.0 ~0.8988465674311579E308 0.8988465674311579E308 ~0.0 ~0.5E~323 ~0.0 ~0.123E4 0.123E4 ~0.0 ~0.5E~323 ~0.0 ~0.123E2 0.123E2 ~0.0 ~0.5E~323 ~0.0 ~0.3141592653589793E1 0.3141592653589793E1 ~0.0 ~0.5E~323 ~0.0 ~0.2718281828459045E1 0.2718281828459045E1 ~0.0 ~0.5E~323 ~0.0 ~0.123E1 0.123E1 ~0.0 ~0.5E~323 ~0.0 ~0.123 0.123 ~0.0 ~0.5E~323 ~0.0 ~0.123E~2 0.123E~2 ~0.0 ~0.5E~323 ~0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 ~0.0 ~0.5E~323 ~0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 ~0.0 ~0.5E~323 ~0.0 ~0.5E~323 0.5E~323 ~0.0 ~0.5E~323 ~0.0 0.0 0.0 nan ~0.0 nan inf ~inf 0.0 0.5E~323 nan ~inf inf ~0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf 0.0 0.5E~323 ~inf 0.0 ~inf ~0.1E1 ~0.17976931348623155E309 ~inf ~0.8988465674311579E308 ~inf ~0.2E1 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E306 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.5722234971514056E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.661334345850887E308 ~0.17976931348623155E309 ~inf ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.1461539134034403E309 ~0.17976931348623155E309 ~0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 ~0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~inf ~0.17976931348623155E309 inf ~inf 0.0 0.1E1 ~0.17976931348623157E309 inf ~inf ~0.8988465674311579E308 0.2E1 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E306 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.5722234971514056E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.661334345850887E308 ~0.17976931348623155E309 inf ~0.17976931348623157E309 ~0.17976931348623157E309 0.1461539134034403E309 ~0.17976931348623155E309 0.22111625558806483E308 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.2211162555880648E306 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.39999999999999996E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.19999999999999998E1 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.8881784197001251E~15 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 inf ~0.17976931348623155E309 ~inf inf ~inf ~0.0 ~0.17976931348623155E309 inf ~inf inf 0.0 ~inf nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.17976931348623155E309 ~inf 0.8988465674311579E308 ~inf ~0.5 ~0.8988465674311578E308 ~inf 0.0 ~0.17976931348623157E309 ~0.1E1 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E305 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172014E307 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.2861117485757028E308 ~0.8988465674311578E308 ~inf ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.3306671729254435E308 ~0.8988465674311578E308 ~0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.7307695670172015E308 ~0.8988465674311578E308 ~0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 ~0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 ~inf ~0.8988465674311578E308 inf ~inf 0.8988465674311579E308 0.5 ~0.898846567431158E308 inf ~0.17976931348623157E309 0.0 0.1E1 ~0.8988465674311579E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E305 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172014E307 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.2861117485757028E308 ~0.8988465674311578E308 inf ~0.8988465674311579E308 ~0.8988465674311579E308 0.3306671729254435E308 ~0.8988465674311578E308 0.1105581277940324E309 ~0.8988465674311579E308 ~0.8988465674311579E308 0.7307695670172015E308 ~0.8988465674311578E308 0.11055812779403241E308 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.1105581277940324E306 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.19999999999999998E1 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.9999999999999999 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.44408920985006257E~15 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 0.0 ~0.8988465674311579E308 ~0.8988465674311579E308 inf ~0.8988465674311578E308 ~inf inf ~inf ~0.0 ~0.8988465674311578E308 inf ~inf inf 0.0 ~0.898846567431158E308 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.8988465674311578E308 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~305 ~0.12299999999999998E4 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422981929E~304 ~0.12299999999999998E4 ~0.15129E7 0.0 ~0.246E4 ~0.1E1 ~0.12299999999999998E4 ~0.15129E5 ~0.12177E4 ~0.12423E4 ~0.1E3 ~0.12299999999999998E4 ~0.38641589639154454E4 ~0.122685840734641E4 ~0.123314159265359E4 ~0.39152116000606253E3 ~0.12299999999999998E4 ~0.33434866490046256E4 ~0.1227281718171541E4 ~0.1232718281828459E4 ~0.4524917126408741E3 ~0.12299999999999998E4 ~0.15129E4 ~0.122877E4 ~0.123123E4 ~0.1E4 ~0.12299999999999998E4 ~0.15129E3 ~0.1229877E4 ~0.1230123E4 ~0.1E5 ~0.12299999999999998E4 ~0.15129E1 ~0.122999877E4 ~0.123000123E4 ~0.1E7 ~0.12299999999999998E4 ~0.27368408459638577E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.13684204229819289E~304 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.6077E~320 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 ~0.0 ~0.123E4 ~0.123E4 ~inf ~0.12299999999999998E4 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~305 ~0.12300000000000002E4 inf ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422981929E~304 ~0.12300000000000002E4 0.15129E7 ~0.246E4 0.0 0.1E1 ~0.123E4 0.15129E5 ~0.12423E4 ~0.12177E4 0.1E3 ~0.12299999999999998E4 0.38641589639154454E4 ~0.123314159265359E4 ~0.122685840734641E4 0.39152116000606253E3 ~0.12299999999999998E4 0.33434866490046256E4 ~0.1232718281828459E4 ~0.1227281718171541E4 0.4524917126408741E3 ~0.12299999999999998E4 0.15129E4 ~0.123123E4 ~0.122877E4 0.1E4 ~0.12299999999999998E4 0.15129E3 ~0.1230123E4 ~0.1229877E4 0.1E5 ~0.12299999999999998E4 0.15129E1 ~0.123000123E4 ~0.122999877E4 0.1E7 ~0.12299999999999998E4 0.27368408459638577E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.13684204229819289E~304 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.6077E~320 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 0.0 ~0.123E4 ~0.123E4 inf ~0.12299999999999998E4 ~inf inf ~inf ~0.0 ~0.12299999999999998E4 inf ~inf inf 0.0 ~0.12300000000000002E4 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E4 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909646E~307 ~0.12299999999999999E2 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.13684204229819291E~306 ~0.12299999999999999E2 ~0.15129E5 0.12177E4 ~0.12423E4 ~0.1E~1 ~0.12299999999999999E2 ~0.15129000000000002E3 0.0 ~0.246E2 ~0.1E1 ~0.12299999999999999E2 ~0.3864158963915446E2 ~0.9158407346410208E1 ~0.15441592653589794E2 ~0.3915211600060626E1 ~0.12299999999999999E2 ~0.33434866490046254E2 ~0.9581718171540956E1 ~0.15018281828459045E2 ~0.4524917126408741E1 ~0.12299999999999999E2 ~0.15129000000000001E2 ~0.1107E2 ~0.13530000000000001E2 ~0.1E2 ~0.12299999999999999E2 ~0.15129000000000001E1 ~0.12177000000000001E2 ~0.12423E2 ~0.10000000000000001E3 ~0.12299999999999999E2 ~0.15129E~1 ~0.12298770000000001E2 ~0.1230123E2 ~0.1E5 ~0.12299999999999999E2 ~0.2736840845963858E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.1368420422981929E~306 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.6E~322 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 ~0.0 ~0.123E2 ~0.123E2 ~inf ~0.12299999999999999E2 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909646E~307 ~0.12300000000000002E2 inf ~0.8988465674311579E308 0.8988465674311579E308 0.13684204229819291E~306 ~0.12300000000000002E2 0.15129E5 ~0.12423E4 0.12177E4 0.1E~1 ~0.12300000000000002E2 0.15129000000000002E3 ~0.246E2 0.0 0.1E1 ~0.123E2 0.3864158963915446E2 ~0.15441592653589794E2 ~0.9158407346410208E1 0.3915211600060626E1 ~0.12299999999999999E2 0.33434866490046254E2 ~0.15018281828459045E2 ~0.9581718171540956E1 0.4524917126408741E1 ~0.12299999999999999E2 0.15129000000000001E2 ~0.13530000000000001E2 ~0.1107E2 0.1E2 ~0.12299999999999999E2 0.15129000000000001E1 ~0.12423E2 ~0.12177000000000001E2 0.10000000000000001E3 ~0.12299999999999999E2 0.15129E~1 ~0.1230123E2 ~0.12298770000000001E2 0.1E5 ~0.12299999999999999E2 0.2736840845963858E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.1368420422981929E~306 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.6E~322 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 0.0 ~0.123E2 ~0.123E2 inf ~0.12299999999999999E2 ~inf inf ~inf ~0.0 ~0.12299999999999999E2 inf ~inf inf 0.0 ~0.12300000000000002E2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999999E2 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.17475689218952297E~307 ~0.31415926535897927E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.349513784379046E~307 ~0.31415926535897927E1 ~0.38641589639154454E4 0.122685840734641E4 ~0.123314159265359E4 ~0.25541403687721893E~2 ~0.31415926535897927E1 ~0.3864158963915446E2 0.9158407346410208E1 ~0.15441592653589794E2 ~0.2554140368772189 ~0.31415926535897927E1 ~0.9869604401089358E1 0.0 ~0.6283185307179586E1 ~0.1E1 ~0.31415926535897927E1 ~0.8539734222673566E1 ~0.423310825130748 ~0.5859874482048838E1 ~0.11557273497909217E1 ~0.31415926535897927E1 ~0.38641589639154454E1 ~0.19115926535897931E1 ~0.43715926535897935E1 ~0.25541403687721895E1 ~0.31415926535897927E1 ~0.38641589639154456 ~0.3018592653589793E1 ~0.32645926535897933E1 ~0.25541403687721896E2 ~0.31415926535897927E1 ~0.38641589639154456E~2 ~0.3140362653589793E1 ~0.3142822653589793E1 ~0.25541403687721895E4 ~0.31415926535897927E1 ~0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~0.14119048864730642E309 ~0.31415926535897927E1 ~0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 ~0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 ~inf ~0.31415926535897927E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.17475689218952297E~307 ~0.31415926535897936E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.349513784379046E~307 ~0.31415926535897936E1 0.38641589639154454E4 ~0.123314159265359E4 0.122685840734641E4 0.25541403687721893E~2 ~0.31415926535897936E1 0.3864158963915446E2 ~0.15441592653589794E2 0.9158407346410208E1 0.2554140368772189 ~0.31415926535897936E1 0.9869604401089358E1 ~0.6283185307179586E1 0.0 0.1E1 ~0.3141592653589793E1 0.8539734222673566E1 ~0.5859874482048838E1 ~0.423310825130748 0.11557273497909217E1 ~0.31415926535897927E1 0.38641589639154454E1 ~0.43715926535897935E1 ~0.19115926535897931E1 0.25541403687721895E1 ~0.31415926535897927E1 0.38641589639154456 ~0.32645926535897933E1 ~0.3018592653589793E1 0.25541403687721896E2 ~0.31415926535897927E1 0.38641589639154456E~2 ~0.3142822653589793E1 ~0.3140362653589793E1 0.25541403687721895E4 ~0.31415926535897927E1 0.6990275687580919E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 0.14119048864730642E309 ~0.31415926535897927E1 0.34951378437904593E~307 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.15E~322 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 0.0 ~0.3141592653589793E1 ~0.3141592653589793E1 inf ~0.31415926535897927E1 ~inf inf ~inf ~0.0 ~0.31415926535897927E1 inf ~inf inf 0.0 ~0.31415926535897936E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.31415926535897927E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.15120944591398447E~307 ~0.27182818284590446E1 ~inf 0.8988465674311579E308 ~0.8988465674311579E308 ~0.30241889182796895E~307 ~0.27182818284590446E1 ~0.33434866490046256E4 0.1227281718171541E4 ~0.1232718281828459E4 ~0.22099852263894678E~2 ~0.27182818284590446E1 ~0.33434866490046254E2 0.9581718171540956E1 ~0.15018281828459045E2 ~0.22099852263894673 ~0.27182818284590446E1 ~0.8539734222673566E1 0.423310825130748 ~0.5859874482048838E1 ~0.8652559794322651 ~0.27182818284590446E1 ~0.73890560989306495E1 0.0 ~0.543656365691809E1 ~0.1E1 ~0.27182818284590446E1 ~0.33434866490046256E1 ~0.1488281828459045E1 ~0.3948281828459045E1 ~0.22099852263894677E1 ~0.27182818284590446E1 ~0.33434866490046256 ~0.25952818284590453E1 ~0.2841281828459045E1 ~0.22099852263894675E2 ~0.27182818284590446E1 ~0.33434866490046253E~2 ~0.2717051828459045E1 ~0.2719511828459045E1 ~0.22099852263894677E4 ~0.27182818284590446E1 ~0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~0.12216591454104522E309 ~0.27182818284590446E1 ~0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 ~0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 ~inf ~0.27182818284590446E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.15120944591398447E~307 ~0.27182818284590455E1 inf ~0.8988465674311579E308 0.8988465674311579E308 0.30241889182796895E~307 ~0.27182818284590455E1 0.33434866490046256E4 ~0.1232718281828459E4 0.1227281718171541E4 0.22099852263894678E~2 ~0.27182818284590455E1 0.33434866490046254E2 ~0.15018281828459045E2 0.9581718171540956E1 0.22099852263894673 ~0.27182818284590455E1 0.8539734222673566E1 ~0.5859874482048838E1 0.423310825130748 0.8652559794322651 ~0.27182818284590455E1 0.73890560989306495E1 ~0.543656365691809E1 0.0 0.1E1 ~0.2718281828459045E1 0.33434866490046256E1 ~0.3948281828459045E1 ~0.1488281828459045E1 0.22099852263894677E1 ~0.27182818284590446E1 0.33434866490046256 ~0.2841281828459045E1 ~0.25952818284590453E1 0.22099852263894675E2 ~0.27182818284590446E1 0.33434866490046253E~2 ~0.2719511828459045E1 ~0.2717051828459045E1 0.22099852263894677E4 ~0.27182818284590446E1 0.6048377836559378E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 0.12216591454104522E309 ~0.27182818284590446E1 0.3024188918279689E~307 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.15E~322 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 0.0 ~0.2718281828459045E1 ~0.2718281828459045E1 inf ~0.27182818284590446E1 ~inf inf ~inf ~0.0 ~0.27182818284590446E1 inf ~inf inf 0.0 ~0.27182818284590455E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.27182818284590446E1 ~inf 0.17976931348623157E309 ~0.17976931348623157E309 ~0.6842102114909647E~308 ~0.12299999999999998E1 ~0.1105581277940324E309 0.8988465674311579E308 ~0.8988465674311579E308 ~0.12299999999999998E1 ~0.15129E4 0.122877E4 ~0.123123E4 ~0.1E~2 ~0.12299999999999998E1 ~0.15129000000000001E2 0.1107E2 ~0.13530000000000001E2 ~0.9999999999999999E~1 ~0.12299999999999998E1 ~0.38641589639154454E1 0.19115926535897931E1 ~0.43715926535897935E1 ~0.3915211600060625 ~0.12299999999999998E1 ~0.33434866490046256E1 0.1488281828459045E1 ~0.3948281828459045E1 ~0.45249171264087407 ~0.12299999999999998E1 ~0.15129E1 0.0 ~0.246E1 ~0.1E1 ~0.12299999999999998E1 ~0.15129 ~0.1107E1 ~0.1353E1 ~0.1E2 ~0.12299999999999998E1 ~0.15129E~2 ~0.122877E1 ~0.123123E1 ~0.1E4 ~0.12299999999999998E1 ~0.27368408459638577E~307 ~0.123E1 ~0.123E1 ~0.5527906389701621E308 ~0.12299999999999998E1 ~0.1368420422981929E~307 ~0.123E1 ~0.123E1 ~0.11055812779403243E309 ~0.12299999999999998E1 ~0.5E~323 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 ~0.0 ~0.123E1 ~0.123E1 ~inf ~0.12299999999999998E1 inf ~0.17976931348623157E309 0.17976931348623157E309 0.6842102114909647E~308 ~0.12300000000000002E1 0.1105581277940324E309 ~0.8988465674311579E308 0.8988465674311579E308 ~0.12300000000000002E1 0.15129E4 ~0.123123E4 0.122877E4 0.1E~2 ~0.12300000000000002E1 0.15129000000000001E2 ~0.13530000000000001E2 0.1107E2 0.9999999999999999E~1 ~0.12300000000000002E1 0.38641589639154454E1 ~0.43715926535897935E1 0.19115926535897931E1 0.3915211600060625 ~0.12300000000000002E1 0.33434866490046256E1 ~0.3948281828459045E1 0.1488281828459045E1 0.45249171264087407 ~0.12300000000000002E1 0.15129E1 ~0.246E1 0.0 0.1E1 ~0.123E1 0.15129 ~0.1353E1 ~0.1107E1 0.1E2 ~0.12299999999999998E1 0.15129E~2 ~0.123123E1 ~0.122877E1 0.1E4 ~0.12299999999999998E1 0.27368408459638577E~307 ~0.123E1 ~0.123E1 0.5527906389701621E308 ~0.12299999999999998E1 0.1368420422981929E~307 ~0.123E1 ~0.123E1 0.11055812779403243E309 ~0.12299999999999998E1 0.5E~323 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 0.0 ~0.123E1 ~0.123E1 inf ~0.12299999999999998E1 ~inf inf ~inf ~0.0 ~0.12299999999999998E1 inf ~inf inf 0.0 ~0.12300000000000002E1 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E1 ~0.22111625558806483E308 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211490966E~309 ~0.12299999999999998 ~0.11055812779403241E308 0.8988465674311579E308 ~0.8988465674311579E308 ~0.136842042298193E~308 ~0.12299999999999998 ~0.15129E3 0.1229877E4 ~0.1230123E4 ~0.1E~3 ~0.12299999999999998 ~0.15129000000000001E1 0.12177000000000001E2 ~0.12423E2 ~0.9999999999999998E~2 ~0.12299999999999998 ~0.38641589639154456 0.3018592653589793E1 ~0.32645926535897933E1 ~0.3915211600060625E~1 ~0.12299999999999998 ~0.33434866490046256 0.25952818284590453E1 ~0.2841281828459045E1 ~0.4524917126408741E~1 ~0.12299999999999998 ~0.15129 0.1107E1 ~0.1353E1 ~0.1 ~0.12299999999999998 ~0.15129E~1 0.0 ~0.246 ~0.1E1 ~0.12299999999999998 ~0.15129E~3 ~0.12177 ~0.12423 ~0.1E3 ~0.12299999999999998 ~0.273684084596386E~308 ~0.123 ~0.123 ~0.55279063897016213E307 ~0.12299999999999998 ~0.136842042298193E~308 ~0.123 ~0.123 ~0.11055812779403243E308 ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 ~0.0 ~0.123 ~0.123 ~inf ~0.12299999999999998 0.22111625558806483E308 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211490966E~309 ~0.12300000000000001 0.11055812779403241E308 ~0.8988465674311579E308 0.8988465674311579E308 0.136842042298193E~308 ~0.12300000000000001 0.15129E3 ~0.1230123E4 0.1229877E4 0.1E~3 ~0.12300000000000001 0.15129000000000001E1 ~0.12423E2 0.12177000000000001E2 0.9999999999999998E~2 ~0.12300000000000001 0.38641589639154456 ~0.32645926535897933E1 0.3018592653589793E1 0.3915211600060625E~1 ~0.12300000000000001 0.33434866490046256 ~0.2841281828459045E1 0.25952818284590453E1 0.4524917126408741E~1 ~0.12300000000000001 0.15129 ~0.1353E1 0.1107E1 0.1 ~0.12300000000000001 0.15129E~1 ~0.246 0.0 0.1E1 ~0.123 0.15129E~3 ~0.12423 ~0.12177 0.1E3 ~0.12299999999999998 0.273684084596386E~308 ~0.123 ~0.123 0.55279063897016213E307 ~0.12299999999999998 0.136842042298193E~308 ~0.123 ~0.123 0.11055812779403243E308 ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 0.0 ~0.123 ~0.123 inf ~0.12299999999999998 ~inf inf ~inf ~0.0 ~0.12299999999999998 inf ~inf inf 0.0 ~0.12300000000000001 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998 ~0.2211162555880648E306 0.17976931348623157E309 ~0.17976931348623157E309 ~0.684210211491E~311 ~0.12299999999999998E~2 ~0.1105581277940324E306 0.8988465674311579E308 ~0.8988465674311579E308 ~0.1368420422982E~310 ~0.12299999999999998E~2 ~0.15129E1 0.122999877E4 ~0.123000123E4 ~0.1E~5 ~0.12299999999999998E~2 ~0.15129E~1 0.12298770000000001E2 ~0.1230123E2 ~0.9999999999999999E~4 ~0.12299999999999998E~2 ~0.38641589639154456E~2 0.3140362653589793E1 ~0.3142822653589793E1 ~0.3915211600060625E~3 ~0.12299999999999998E~2 ~0.33434866490046253E~2 0.2717051828459045E1 ~0.2719511828459045E1 ~0.45249171264087406E~3 ~0.12299999999999998E~2 ~0.15129E~2 0.122877E1 ~0.123123E1 ~0.1E~2 ~0.12299999999999998E~2 ~0.15129E~3 0.12177 ~0.12423 ~0.1E~1 ~0.12299999999999998E~2 ~0.15129E~5 0.0 ~0.246E~2 ~0.1E1 ~0.12299999999999998E~2 ~0.2736840845964E~310 ~0.123E~2 ~0.123E~2 ~0.5527906389701621E305 ~0.12299999999999998E~2 ~0.1368420422982E~310 ~0.123E~2 ~0.123E~2 ~0.11055812779403243E306 ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 ~0.0 ~0.123E~2 ~0.123E~2 ~inf ~0.12299999999999998E~2 0.2211162555880648E306 ~0.17976931348623157E309 0.17976931348623157E309 0.684210211491E~311 ~0.12300000000000002E~2 0.1105581277940324E306 ~0.8988465674311579E308 0.8988465674311579E308 0.1368420422982E~310 ~0.12300000000000002E~2 0.15129E1 ~0.123000123E4 0.122999877E4 0.1E~5 ~0.12300000000000002E~2 0.15129E~1 ~0.1230123E2 0.12298770000000001E2 0.9999999999999999E~4 ~0.12300000000000002E~2 0.38641589639154456E~2 ~0.3142822653589793E1 0.3140362653589793E1 0.3915211600060625E~3 ~0.12300000000000002E~2 0.33434866490046253E~2 ~0.2719511828459045E1 0.2717051828459045E1 0.45249171264087406E~3 ~0.12300000000000002E~2 0.15129E~2 ~0.123123E1 0.122877E1 0.1E~2 ~0.12300000000000002E~2 0.15129E~3 ~0.12423 0.12177 0.1E~1 ~0.12300000000000002E~2 0.15129E~5 ~0.246E~2 0.0 0.1E1 ~0.123E~2 0.2736840845964E~310 ~0.123E~2 ~0.123E~2 0.5527906389701621E305 ~0.12299999999999998E~2 0.1368420422982E~310 ~0.123E~2 ~0.123E~2 0.11055812779403243E306 ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 0.0 ~0.123E~2 ~0.123E~2 inf ~0.12299999999999998E~2 ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 inf ~inf inf 0.0 ~0.12300000000000002E~2 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.12299999999999998E~2 ~0.39999999999999996E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.2225073858507201E~307 ~0.27368408459638577E~304 0.123E4 ~0.123E4 ~0.18090031369976E~310 ~0.2225073858507201E~307 ~0.2736840845963858E~306 0.123E2 ~0.123E2 ~0.1809003136997725E~308 ~0.2225073858507201E~307 ~0.6990275687580919E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.7082630066519554E~308 ~0.2225073858507201E~307 ~0.6048377836559378E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.818558927632814E~308 ~0.2225073858507201E~307 ~0.27368408459638577E~307 0.123E1 ~0.123E1 ~0.18090031369977247E~307 ~0.2225073858507201E~307 ~0.273684084596386E~308 0.123 ~0.123 ~0.1809003136997725E~306 ~0.2225073858507201E~307 ~0.2736840845964E~310 0.123E~2 ~0.123E~2 ~0.18090031369977247E~304 ~0.2225073858507201E~307 ~0.0 0.0 ~0.4450147717014403E~307 ~0.1E1 ~0.2225073858507201E~307 ~0.0 ~0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.2E1 ~0.2225073858507201E~307 ~0.0 ~0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.4503599627370496E16 ~0.2225073858507201E~307 ~0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 ~inf ~0.2225073858507201E~307 0.39999999999999996E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.2225073858507202E~307 0.19999999999999998E1 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.2225073858507202E~307 0.27368408459638577E~304 ~0.123E4 0.123E4 0.18090031369976E~310 ~0.2225073858507202E~307 0.2736840845963858E~306 ~0.123E2 0.123E2 0.1809003136997725E~308 ~0.2225073858507202E~307 0.6990275687580919E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.7082630066519554E~308 ~0.2225073858507202E~307 0.6048377836559378E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.818558927632814E~308 ~0.2225073858507202E~307 0.27368408459638577E~307 ~0.123E1 0.123E1 0.18090031369977247E~307 ~0.2225073858507202E~307 0.273684084596386E~308 ~0.123 0.123 0.1809003136997725E~306 ~0.2225073858507202E~307 0.2736840845964E~310 ~0.123E~2 0.123E~2 0.18090031369977247E~304 ~0.2225073858507202E~307 0.0 ~0.4450147717014403E~307 0.0 0.1E1 ~0.22250738585072014E~307 0.0 ~0.3337610787760802E~307 ~0.11125369292536007E~307 0.2E1 ~0.2225073858507201E~307 0.0 ~0.2225073858507202E~307 ~0.2225073858507201E~307 0.4503599627370496E16 ~0.2225073858507201E~307 0.0 ~0.22250738585072014E~307 ~0.22250738585072014E~307 inf ~0.2225073858507201E~307 ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 inf ~inf inf 0.0 ~0.2225073858507202E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.2225073858507201E~307 ~0.19999999999999998E1 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.11125369292536E~307 ~0.9999999999999999 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.11125369292536E~307 ~0.13684204229819289E~304 0.123E4 ~0.123E4 ~0.904501568499E~311 ~0.11125369292536E~307 ~0.1368420422981929E~306 0.123E2 ~0.123E2 ~0.90450156849886E~309 ~0.11125369292536E~307 ~0.34951378437904593E~307 0.3141592653589793E1 ~0.3141592653589793E1 ~0.3541315033259774E~308 ~0.11125369292536E~307 ~0.3024188918279689E~307 0.2718281828459045E1 ~0.2718281828459045E1 ~0.409279463816407E~308 ~0.11125369292536E~307 ~0.1368420422981929E~307 0.123E1 ~0.123E1 ~0.9045015684988623E~308 ~0.11125369292536E~307 ~0.136842042298193E~308 0.123 ~0.123 ~0.9045015684988624E~307 ~0.11125369292536E~307 ~0.1368420422982E~310 0.123E~2 ~0.123E~2 ~0.9045015684988623E~305 ~0.11125369292536E~307 ~0.0 0.11125369292536007E~307 ~0.3337610787760802E~307 ~0.5 ~0.11125369292536E~307 ~0.0 0.0 ~0.22250738585072014E~307 ~0.1E1 ~0.11125369292536E~307 ~0.0 ~0.11125369292536E~307 ~0.1112536929253601E~307 ~0.2251799813685248E16 ~0.11125369292536E~307 ~0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 ~inf ~0.11125369292536E~307 0.19999999999999998E1 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1112536929253601E~307 0.9999999999999999 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1112536929253601E~307 0.13684204229819289E~304 ~0.123E4 0.123E4 0.904501568499E~311 ~0.1112536929253601E~307 0.1368420422981929E~306 ~0.123E2 0.123E2 0.90450156849886E~309 ~0.1112536929253601E~307 0.34951378437904593E~307 ~0.3141592653589793E1 0.3141592653589793E1 0.3541315033259774E~308 ~0.1112536929253601E~307 0.3024188918279689E~307 ~0.2718281828459045E1 0.2718281828459045E1 0.409279463816407E~308 ~0.1112536929253601E~307 0.1368420422981929E~307 ~0.123E1 0.123E1 0.9045015684988623E~308 ~0.1112536929253601E~307 0.136842042298193E~308 ~0.123 0.123 0.9045015684988624E~307 ~0.1112536929253601E~307 0.1368420422982E~310 ~0.123E~2 0.123E~2 0.9045015684988623E~305 ~0.1112536929253601E~307 0.0 ~0.3337610787760802E~307 0.11125369292536007E~307 0.5 ~0.1112536929253601E~307 0.0 ~0.22250738585072014E~307 0.0 0.1E1 ~0.11125369292536007E~307 0.0 ~0.1112536929253601E~307 ~0.11125369292536E~307 0.2251799813685248E16 ~0.11125369292536E~307 0.0 ~0.11125369292536007E~307 ~0.11125369292536007E~307 inf ~0.11125369292536E~307 ~inf inf ~inf ~0.0 ~0.11125369292536E~307 inf ~inf inf 0.0 ~0.1112536929253601E~307 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.11125369292536E~307 ~0.8881784197001251E~15 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 ~0.0 ~0.44408920985006257E~15 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 ~0.0 ~0.6077E~320 0.123E4 ~0.123E4 ~0.0 ~0.0 ~0.6E~322 0.123E2 ~0.123E2 ~0.0 ~0.0 ~0.15E~322 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 ~0.0 ~0.15E~322 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 ~0.0 ~0.5E~323 0.123E1 ~0.123E1 ~0.5E~323 ~0.0 ~0.0 0.123 ~0.123 ~0.4E~322 ~0.0 ~0.0 0.123E~2 ~0.123E~2 ~0.4017E~320 ~0.0 ~0.0 0.2225073858507201E~307 ~0.2225073858507202E~307 ~0.2220446049250313E~15 ~0.0 ~0.0 0.11125369292536E~307 ~0.1112536929253601E~307 ~0.4440892098500626E~15 ~0.0 ~0.0 0.0 ~0.1E~322 ~0.1E1 ~0.0 ~0.0 ~0.5E~323 ~0.5E~323 ~inf ~0.0 0.8881784197001251E~15 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.1E~322 0.44408920985006257E~15 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.1E~322 0.6077E~320 ~0.123E4 0.123E4 0.0 ~0.1E~322 0.6E~322 ~0.123E2 0.123E2 0.0 ~0.1E~322 0.15E~322 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.1E~322 0.15E~322 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.1E~322 0.5E~323 ~0.123E1 0.123E1 0.5E~323 ~0.1E~322 0.0 ~0.123 0.123 0.4E~322 ~0.1E~322 0.0 ~0.123E~2 0.123E~2 0.4017E~320 ~0.1E~322 0.0 ~0.2225073858507202E~307 0.2225073858507201E~307 0.2220446049250313E~15 ~0.1E~322 0.0 ~0.1112536929253601E~307 0.11125369292536E~307 0.4440892098500626E~15 ~0.1E~322 0.0 ~0.1E~322 0.0 0.1E1 ~0.5E~323 0.0 ~0.5E~323 ~0.5E~323 inf ~0.0 ~inf inf ~inf ~0.0 ~0.0 inf ~inf inf 0.0 ~0.1E~322 nan nan nan nan nan ~inf inf ~inf ~0.0 ~0.0 ~0.0 0.17976931348623157E309 ~0.17976931348623157E309 ~0.0 0.5E~323 ~0.0 0.8988465674311579E308 ~0.8988465674311579E308 ~0.0 0.5E~323 ~0.0 0.123E4 ~0.123E4 ~0.0 0.5E~323 ~0.0 0.123E2 ~0.123E2 ~0.0 0.5E~323 ~0.0 0.3141592653589793E1 ~0.3141592653589793E1 ~0.0 0.5E~323 ~0.0 0.2718281828459045E1 ~0.2718281828459045E1 ~0.0 0.5E~323 ~0.0 0.123E1 ~0.123E1 ~0.0 0.5E~323 ~0.0 0.123 ~0.123 ~0.0 0.5E~323 ~0.0 0.123E~2 ~0.123E~2 ~0.0 0.5E~323 ~0.0 0.22250738585072014E~307 ~0.22250738585072014E~307 ~0.0 0.5E~323 ~0.0 0.11125369292536007E~307 ~0.11125369292536007E~307 ~0.0 0.5E~323 ~0.0 0.5E~323 ~0.5E~323 ~0.0 0.5E~323 ~0.0 0.0 ~0.0 nan 0.0 0.0 ~0.17976931348623157E309 0.17976931348623157E309 0.0 ~0.5E~323 0.0 ~0.8988465674311579E308 0.8988465674311579E308 0.0 ~0.5E~323 0.0 ~0.123E4 0.123E4 0.0 ~0.5E~323 0.0 ~0.123E2 0.123E2 0.0 ~0.5E~323 0.0 ~0.3141592653589793E1 0.3141592653589793E1 0.0 ~0.5E~323 0.0 ~0.2718281828459045E1 0.2718281828459045E1 0.0 ~0.5E~323 0.0 ~0.123E1 0.123E1 0.0 ~0.5E~323 0.0 ~0.123 0.123 0.0 ~0.5E~323 0.0 ~0.123E~2 0.123E~2 0.0 ~0.5E~323 0.0 ~0.22250738585072014E~307 0.22250738585072014E~307 0.0 ~0.5E~323 0.0 ~0.11125369292536007E~307 0.11125369292536007E~307 0.0 ~0.5E~323 0.0 ~0.5E~323 0.5E~323 0.0 ~0.5E~323 0.0 ~0.0 0.0 nan ~0.0 nan inf ~inf ~0.0 0.5E~323 nan ~inf inf 0.0 ~0.5E~323 nan nan nan nan nan nan inf ~inf ~0.0 0.5E~323 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf ~inf nan ~inf ~inf ~inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf inf ~inf ~inf inf ~inf nan ~inf ~inf inf ~inf ~inf nan ~inf nan ~inf inf ~inf nan nan ~inf nan nan nan nan nan ~inf nan ~inf nan ~inf nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf nan inf inf inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf ~inf inf inf ~inf inf nan inf inf ~inf inf inf inf nan nan inf ~inf nan inf nan inf nan nan nan nan nan inf inf nan nan inf Testing *+, *- Testing Real.{realCeil,realFloor,realTrunc} 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.17976931348623157E309 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.8988465674311579E308 0.123E4 0.123E4 0.123E4 0.123E4 0.123E2 0.13E2 0.12E2 0.12E2 0.3141592653589793E1 0.4E1 0.3E1 0.3E1 0.2718281828459045E1 0.3E1 0.2E1 0.2E1 0.123E1 0.2E1 0.1E1 0.1E1 0.123 0.1E1 0.0 0.0 0.123E~2 0.1E1 0.0 0.0 0.22250738585072014E~307 0.1E1 0.0 0.0 0.11125369292536007E~307 0.1E1 0.0 0.0 0.5E~323 0.1E1 0.0 0.0 0.0 0.0 0.0 0.0 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.17976931348623157E309 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.8988465674311579E308 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E4 ~0.123E2 ~0.12E2 ~0.13E2 ~0.12E2 ~0.3141592653589793E1 ~0.3E1 ~0.4E1 ~0.3E1 ~0.2718281828459045E1 ~0.2E1 ~0.3E1 ~0.2E1 ~0.123E1 ~0.1E1 ~0.2E1 ~0.1E1 ~0.123 ~0.0 ~0.1E1 ~0.0 ~0.123E~2 ~0.0 ~0.1E1 ~0.0 ~0.22250738585072014E~307 ~0.0 ~0.1E1 ~0.0 ~0.11125369292536007E~307 ~0.0 ~0.1E1 ~0.0 ~0.5E~323 ~0.0 ~0.1E1 ~0.0 ~0.0 ~0.0 ~0.0 ~0.0 Testing Real.{<,<=,>,>=,==,!=,?=,unordered} false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false false true true false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false true false false false false true true Testing compare, compareReal EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS LESS EQUAL EQUAL GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER GREATER EQUAL EQUAL Testing abs Testing {from,to}ManExp 0.17976931348623157E309 = 0.9999999999999999 * 2^1024 = 0.17976931348623157E309 0.8988465674311579E308 = 0.9999999999999999 * 2^1023 = 0.8988465674311579E308 0.123E4 = 0.6005859375 * 2^11 = 0.123E4 0.123E2 = 0.76875 * 2^4 = 0.123E2 0.3141592653589793E1 = 0.7853981633974483 * 2^2 = 0.3141592653589793E1 0.2718281828459045E1 = 0.6795704571147613 * 2^2 = 0.2718281828459045E1 0.123E1 = 0.615 * 2^1 = 0.123E1 0.123 = 0.984 * 2^~3 = 0.123 0.123E~2 = 0.62976 * 2^~9 = 0.123E~2 0.22250738585072014E~307 = 0.5 * 2^~1021 = 0.22250738585072014E~307 0.0 = 0.0 * 2^0 = 0.0 ~0.17976931348623157E309 = ~0.9999999999999999 * 2^1024 = ~0.17976931348623157E309 ~0.8988465674311579E308 = ~0.9999999999999999 * 2^1023 = ~0.8988465674311579E308 ~0.123E4 = ~0.6005859375 * 2^11 = ~0.123E4 ~0.123E2 = ~0.76875 * 2^4 = ~0.123E2 ~0.3141592653589793E1 = ~0.7853981633974483 * 2^2 = ~0.3141592653589793E1 ~0.2718281828459045E1 = ~0.6795704571147613 * 2^2 = ~0.2718281828459045E1 ~0.123E1 = ~0.615 * 2^1 = ~0.123E1 ~0.123 = ~0.984 * 2^~3 = ~0.123 ~0.123E~2 = ~0.62976 * 2^~9 = ~0.123E~2 ~0.22250738585072014E~307 = ~0.5 * 2^~1021 = ~0.22250738585072014E~307 ~0.0 = ~0.0 * 2^0 = ~0.0 Testing split Testing {from,to}Large mlton-20100608/regression/ref-flatten.2.ok0000644000076600000240000000000611404435620016634 0ustar mtfstaff71 EC mlton-20100608/regression/ref-flatten.2.sml0000644000076600000240000000137711404435617017040 0ustar mtfstaffdatatype t = A of Word16.word ref * Word16.word ref * int list | B val a = Array.tabulate (100, fn i => let val l = [100 + i, 2, 3] in case i mod 2 of 0 => A (ref 0w13, ref 0w123, l) | 1 => B end) val _ = Array.app (fn B => () | A (r, r', l) => (r := !r + Word16.fromLarge (LargeWord.fromInt (hd l)) ; r' := !r' + !r)) a val A (w, w', _) = Array.sub (a, 0) val _ = print (concat [Word16.toString (!w), " ", Word16.toString (!w'), "\n"]) mlton-20100608/regression/ref-flatten.3.ok0000644000076600000240000000000411404435620016633 0ustar mtfstaff0 0 mlton-20100608/regression/ref-flatten.3.sml0000644000076600000240000000135311404435617017033 0ustar mtfstaff(* * This example tests for a bug that was in refFlatten at one point. The idea * is to allocate a ref cell outside a loop, and then allocate a tuple containing * the ref cell at each iteration of the loop. At one point, refFlatten * mistakenly flattened the ref cell, which meant that it wasn't shared across * all the tuples allocated in the loop, as it should have been. *) fun loop i = if i = 0 then () else let val r = ref 13 val l = List.tabulate (10, fn i => (r, ref i)) val (r1, r2) = List.nth (l, 0) val () = r1 := !r2 val (r1, _) = List.nth (l, 1) val () = print (concat [Int.toString (!r1), "\n"]) in loop (i - 1) end val () = loop 2 mlton-20100608/regression/ref-flatten.4.ok0000644000076600000240000000001411404435621016636 0ustar mtfstaffNONE SOME 9 mlton-20100608/regression/ref-flatten.4.sml0000644000076600000240000000241011404435617017027 0ustar mtfstaffstructure CList = struct datatype 'a clist' = Cons of 'a * 'a clist ref withtype 'a clist = 'a clist' option fun cnil () = NONE fun ccons (h, t) = SOME (Cons (h, ref t)) fun match cl nilCase consCase = case cl of NONE => nilCase () | SOME (Cons (h, t)) => consCase (h, !t) fun fromList l = case l of [] => cnil () | h::t => ccons (h, fromList t) fun repeat x = let val r = ref NONE val cl = SOME (Cons (x, r)) val () = r := cl in cl end local val max = 1000 fun length' (cl, n) = if n >= max then NONE else match cl (fn () => SOME n) (fn (_,t) => length' (t, n + 1)) in fun length cl = length' (cl, 0) end end val cl = CList.repeat #"x" val n = CList.length cl val () = case n of NONE => print "NONE\n" | SOME n => print (concat ["SOME ", Int.toString n, "\n"]) val cl = CList.fromList [1,2,3,4,5,6,7,8,9] val n = CList.length cl val () = case n of NONE => print "NONE\n" | SOME n => print (concat ["SOME ", Int.toString n, "\n"]) mlton-20100608/regression/ref-flatten.5.ok0000644000076600000240000000000311404435617016642 0ustar mtfstaff59 mlton-20100608/regression/ref-flatten.5.sml0000644000076600000240000000120711404435617017033 0ustar mtfstaffdatatype t = A of int ref * int | B val n = 100 val a = Array.tabulate (n, fn i => case i mod 3 of 0 => B | 1 => A (ref 13, 14) | 2 => A (ref 15, 16)) datatype t = A' of int ref * int | B' val a' = Array.tabulate (n, fn i => case Array.sub (a, i) of B => B' | A (r, n) => A' (r, n + 1)) val _ = Array.app (fn A (r, n) => r := 17 + n + !r | B => ()) a val _ = case Array.sub (a', 1) of A' (r, n) => print (concat [Int.toString (!r + n), "\n"]) | B' => () mlton-20100608/regression/ref-flatten.6.ok0000644000076600000240000000000311404435617016643 0ustar mtfstaffhi mlton-20100608/regression/ref-flatten.6.sml0000644000076600000240000000200211404435620017020 0ustar mtfstaffdatatype ('a, 'b) either = LEFT of 'a | RIGHT of 'b fun eval thunk = LEFT (thunk ()) handle e => RIGHT e datatype 'a status = LAZY of unit -> 'a promise | EAGER of ('a, exn) either withtype 'a promise = 'a status ref ref fun lazy exp = ref (ref (LAZY exp)) fun delay exp = lazy (fn () => ref (ref (EAGER (eval exp)))) fun force promise = case !(!promise) of EAGER (LEFT x) => x | EAGER (RIGHT x) => raise x | LAZY exp => let val promise' = exp () in (case !(!promise) of LAZY _ => (!promise := !(!promise') ; promise' := !promise) | _ => ()) ; force promise end exception Assertion fun check (b, e) = if b then () else raise e fun verify b = check (b, Assertion) val () = let val r = delay (fn () => (print "hi\n" ; 1)) val s = lazy (fn () => r) val t = lazy (fn () => s) in verify (1 = force t) ; verify (1 = force r) end mlton-20100608/regression/ref-flatten.ok0000644000076600000240000000000311404435620016471 0ustar mtfstaff44 mlton-20100608/regression/ref-flatten.sml0000644000076600000240000000112411404435617016666 0ustar mtfstaffdatatype t = A of int ref * int | B val n = 100 val a = Array.tabulate (n, fn i => case i mod 3 of 0 => B | 1 => A (ref 13, 14) | 2 => A (ref 15, 16)) val a' = Array.tabulate (n, fn i => case Array.sub (a, i) of B => B | A (r, n) => A (r, n + 1)) val _ = Array.app (fn A (r, n) => r := 17 + n + !r | B => ()) a val _ = case Array.sub (a', 1) of A (r, _) => print (concat [Int.toString (!r), "\n"]) | B => () mlton-20100608/regression/rem-unused.1.ok0000644000076600000240000000000511404435620016507 0ustar mtfstafftrue mlton-20100608/regression/rem-unused.1.sml0000644000076600000240000000061011404435617016701 0ustar mtfstaffdatatype ttt = AAA | BBB of ttt vector val z = AAA val y = BBB (Vector.tabulate (1, fn _ => z)) (* val x = BBB (Vector.tabulate (1, fn _ => z)) *) (* val _ = print (concat [Bool.toString (y = x), "\n"]) *) val a : ttt vector = Vector.tabulate (0, fn _ => raise Fail "a") val b : ttt vector = Vector.tabulate (0, fn _ => raise Fail "b") val _ = print (concat [Bool.toString (a = b), "\n"]) mlton-20100608/regression/ring.ok0000644000076600000240000000000211404435617015226 0ustar mtfstaff2 mlton-20100608/regression/ring.sml0000644000076600000240000000427611404435617015431 0ustar mtfstaffsignature RING = sig type ring type elt val make : {zero : 'a, one : 'a, + : 'a * 'a -> 'a, * : 'a * 'a -> 'a} -> {ring : ring, valOf : elt -> 'a} val zero : ring -> elt val one : ring -> elt val ringOf : elt -> ring exception TypeError (* raised by * or + with bogus args *) val * : elt * elt -> elt val + : elt * elt -> elt end structure Ring : RING = struct datatype ring = Ring of unit -> {zero : elt, one : elt, + : elt * elt -> elt, * : elt * elt -> elt} and elt = Elt of unit -> {ring : ring} fun ringOf(Elt th) = #ring(th()) fun extract sel (Ring th) = sel(th()) val zero = extract #zero val one = extract #one local fun make sel (x,y) = extract sel (ringOf x) (x,y) in val op * = make(# * ) val op + = make(# +) end exception TypeError fun 'a make{zero, one, +, * = op *} = let val r : 'a option ref = ref NONE fun valOf(Elt th) = (th() ; case !r of NONE => raise TypeError | SOME x => (x before r := NONE)) fun ring() = {zero = elt zero, one = elt one, + = binary(op +), * = binary(op * )} and elt(x : 'a) = Elt(fn () => (r := SOME x ; {ring = Ring ring})) and binary (f : 'a * 'a -> 'a) (x : elt, y : elt) = elt(f(valOf x, valOf y)) in {ring = Ring ring, valOf = valOf} end end val {ring = ints, valOf} = Ring.make{zero = 0, one = 1, + = op +, * = op *} val _ = (print(Int.toString(valOf(Ring.+(Ring.one ints, Ring.one ints)))) ; print "\n") mlton-20100608/regression/rlimit.ok0000644000076600000240000000000511404435617015572 0ustar mtfstafftrue mlton-20100608/regression/rlimit.sml0000644000076600000240000000055311404435617015764 0ustar mtfstaffopen MLton.Rlimit val _ = List.app (fn r => set (r, get r) handle _ => ()) [cpuTime, coreFileSize, dataSize, fileSize, (*lockedInMemorySize,*) numFiles, (*numProcesses,*) (*residentSetSize,*) stackSize, virtualMemorySize] val _ = print (concat [Bool.toString ((RLim.castToSysWord infinity) >= 0wxFFFF), "\n"]) mlton-20100608/regression/same-fringe.ok0000644000076600000240000000001011404435617016463 0ustar mtfstaffsuccess mlton-20100608/regression/same-fringe.sml0000644000076600000240000000323111404435617016655 0ustar mtfstaffstructure Z = struct structure Thread = MLton.Thread fun generate(f: ('a -> unit) -> unit): unit -> 'a option = let val paused: 'a option Thread.t option ref = ref NONE val gen: unit Thread.t option ref = ref NONE fun return(a: 'a option): unit = Thread.switch(fn t' => let val _ = gen := SOME t' val t = valOf(!paused) val _ = paused := NONE in Thread.prepare (t, a) end) val _ = gen := SOME(Thread.new(fn () => (f (return o SOME) ; return NONE))) in fn () => Thread.switch(fn t => (paused := SOME t ; Thread.prepare (valOf(!gen), ()))) end datatype 'a tree = L of 'a | N of 'a tree * 'a tree fun foreach(t: 'a tree, f: 'a -> unit): unit = let val rec loop = fn L a => f a | N(l, r) => (loop l; loop r) in loop t end fun same(f: unit -> 'a option, g: unit -> 'a option, eq: 'a * 'a -> bool): bool = let fun loop() = case (f(), g()) of (NONE, NONE) => true | (SOME x, SOME y) => eq(x, y) andalso loop() | _ => false in loop() end fun fringe(t: 'a tree): unit -> 'a option = generate(fn f => foreach(t, f)) fun sameFringe(t1: 'a tree, t2: 'a tree, eq: 'a * 'a -> bool): bool = same(fringe t1, fringe t2, eq) val t1 = N(N(L 1, L 2), N(N(L 3, L 4), L 5)) val t2 = N(L 1, N(N(L 2, L 3), N(L 4, L 5))) val _ = if sameFringe(t1, t2, op =) then print "success\n" else print "failure\n" end mlton-20100608/regression/scon.ok0000644000076600000240000000000011404435617015227 0ustar mtfstaffmlton-20100608/regression/scon.sml0000644000076600000240000000031111404435617015416 0ustar mtfstaff(* scon *) (* Checks parsing of special constants. *) #"\^C"; #"\a"; #"\u0000"; #"\ \x\ \"; 3.2121212121212121212121212121; 2e3; 0.00000000000e123213213123213123123; 0wxabcd; 0xAaAa; mlton-20100608/regression/semicolon.ok0000644000076600000240000000000011404435617016255 0ustar mtfstaffmlton-20100608/regression/semicolon.sml0000644000076600000240000000023211404435617016446 0ustar mtfstaff(* semicolon.sml *) (* Checks parsing of semicolons. *) structure A = struct ;;;;;;;; end; signature S = sig ;;;;;;;;;;; end; ;;;;;;;;;;;;;;;; mlton-20100608/regression/serialize.ok0000644000076600000240000000003711404435617016266 0ustar mtfstafftrue 1 2 3 4 true true 13 15 mlton-20100608/regression/serialize.sml0000644000076600000240000000117511404435617016454 0ustar mtfstaffopen MLton val l = [1, 2, 3, 4] structure W = Word8 structure V = Word8Vector val r = ref 0 val t = (r, r) fun pv v = (V.app (fn w => (print(W.toString w); print " ")) v ; print "\n") fun pr s = (print s; print "\n") fun pi i = (print(Int.toString i); print " ") fun pl l = List.app pi l fun 'a ds(a: 'a): 'a = deserialize(serialize a) val pb = pr o Bool.toString val _ = (pb(serialize l = serialize l) ; pl(ds l) ; print "\n" ; pb(l = ds l) ; pb(let val t: int ref * int ref = ds t in #1 t = #2 t end) ; pi(ds (fn x => x) 13) ; pi(ds (fn x => x + 1) 14) ; print "\n") mlton-20100608/regression/sharing.ok0000644000076600000240000000000011404435617015720 0ustar mtfstaffmlton-20100608/regression/sharing.sml0000644000076600000240000000251611404435617016120 0ustar mtfstaff(* sharing.sml *) (* Checks treatment of sharing constraints. *) signature S = sig type t type s = t sharing type t = s end; signature T = (* from SML/NJ doc *) sig type s structure A : sig datatype d = D of s datatype t = K end sharing type s = A.t end; (* Check that multiple sharing equations is all pairs. *) signature S = sig structure T: sig end structure U: sig type t = int end sharing T = U end functor F (structure A: sig type t end structure B: sig end structure C: sig type t end sharing A = B = C) = struct val _: A.t -> C.t = fn x => x end (* Check that sharing doesn't mistakenly share structures that only differ in * free flexible tycons. *) signature T = sig type t structure U: sig val x: t end end structure S: sig structure T1: T structure T2: T sharing T1.U = T2.U end = struct structure T1 = struct type t = int structure U = struct val x = 13 end end structure T2 = struct type t = real structure U = struct val x = 13.0 end end end ; mlton-20100608/regression/signals.ok0000644000076600000240000000020711404435617015736 0ustar mtfstaffsending 1 Got a hup. You can't int me you loser. Don't even try to term me. sending 2 Got a hup. You can't int me you loser. sending 3 mlton-20100608/regression/signals.sml0000644000076600000240000000224411404435620016115 0ustar mtfstaffstructure List = struct open List fun foreach (l, f) = app f l end structure Process = Posix.Process open Process Posix.Signal MLton.Signal fun print s = let open TextIO in output (stdErr, s) ; output (stdErr, "\n") end val sleep = sleep o Time.fromSeconds val _ = case fork () of NONE => let val _ = List.foreach ([(hup, "Got a hup."), (int, "You can't int me you loser."), (term, "Don't even try to term me.")], fn (signal, msg) => setHandler (signal, Handler.simple (fn () => print msg))) fun loop' () = (sleep 1; loop' ()) in loop' () end | SOME pid => let fun signal s = Process.kill (K_PROC pid, s) in sleep 1 ; print "sending 1" ; List.foreach ([hup, int, term], signal) ; sleep 3 ; print "sending 2" ; List.foreach ([hup, int], signal) ; sleep 3 ; print "sending 3" ; signal kill ; wait () end mlton-20100608/regression/signals2.ok0000644000076600000240000171435311404435620016031 0ustar mtfstaff0 1 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 68 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 74 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 75 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 81 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 82 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 86 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 87 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 91 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 92 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 96 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 105 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 106 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 113 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 114 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 115 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 118 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 119 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 124 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 125 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 126 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 129 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 130 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 131 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 134 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 135 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 136 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 137 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 138 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 139 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 141 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 142 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 143 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 150 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 151 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 152 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 155 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 157 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 159 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 256 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 257 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 258 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 259 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 260 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 261 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 262 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 266 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 267 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 268 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 269 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 270 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 273 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 274 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 275 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 278 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 282 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 286 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 290 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 293 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 294 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 295 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 296 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 297 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 298 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 299 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 301 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 302 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 303 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 304 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 306 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 307 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 308 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 309 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 310 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 311 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 312 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 313 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 314 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 315 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 317 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 318 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 319 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 322 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 323 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 324 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 325 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 327 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 329 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 332 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 333 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 334 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 335 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 338 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 341 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 342 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 343 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 344 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 345 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 346 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 347 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 348 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 349 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 350 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 351 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 354 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 355 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 356 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 357 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 358 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 359 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 360 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 361 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 362 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 366 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 367 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 368 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 370 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 371 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 372 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 373 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 374 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 375 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 376 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 378 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 379 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 380 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 381 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 382 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 383 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 384 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 385 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 386 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 387 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 388 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 389 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 390 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 391 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 392 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 393 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 394 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 395 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 396 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 397 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 398 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 400 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 401 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 402 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 403 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 404 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 405 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 406 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 407 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 408 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 409 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 410 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 411 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 412 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 413 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 414 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 415 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 416 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 417 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 418 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 419 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 420 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 421 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 422 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 423 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 424 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 425 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 426 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 427 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 428 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 429 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 430 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 431 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 432 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 433 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 434 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 436 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 437 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 438 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 439 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 440 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 441 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 442 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 443 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 444 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 445 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 446 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 447 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 448 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 449 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 450 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 451 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 452 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 453 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 454 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 455 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 456 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 457 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 458 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 459 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 460 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 461 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 462 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 463 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 464 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 465 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 466 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 467 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 468 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 469 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 470 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 471 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 472 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 473 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 474 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 475 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 476 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 477 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 478 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 479 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 480 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 481 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 482 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 483 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 484 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 485 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 486 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 487 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 488 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 489 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 490 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 491 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 492 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 493 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 494 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 495 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 497 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 498 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 499 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 mlton-20100608/regression/signals2.sml0000644000076600000240000000303111404435617016200 0ustar mtfstaffsignature CRITICAL = sig val atomicBegin : unit -> unit val atomicEnd : unit -> unit val doAtomic : (unit -> unit) -> unit end structure Critical : CRITICAL = struct structure Thread = MLton.Thread val atomicBegin = Thread.atomicBegin val atomicEnd = Thread.atomicEnd fun doAtomic f = (atomicBegin (); f (); atomicEnd ()) end structure Main = struct structure Signal = MLton.Signal structure Itimer = MLton.Itimer val alrmHandler = fn t => t fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun setAlrmHandler h = Signal.setHandler (Itimer.signal Itimer.Real, h) fun print s = Critical.doAtomic (fn () => TextIO.print s) fun doit n = let val () = setAlrmHandler (Signal.Handler.handler alrmHandler) val () = setItimer (Time.fromMilliseconds 10) fun loop i = if i > n then OS.Process.exit OS.Process.success else let val i' = (Int.toString i) ^ "\n" fun loop' j = if j > i then () else (print i' ; loop' (j + 1)) in loop' 0 ; loop (i + 1) end in loop 0 end end val _ = Main.doit 500 mlton-20100608/regression/signals3.ok0000644000076600000240000000020711404435621016014 0ustar mtfstaffsending 1 Got a hup. You can't int me you loser. Don't even try to term me. sending 2 Got a hup. You can't int me you loser. sending 3 mlton-20100608/regression/signals3.sml0000644000076600000240000000223111404435620016174 0ustar mtfstaffstructure List = struct open List fun foreach (l, f) = app f l end structure Process = Posix.Process open Process Posix.Signal MLton.Signal fun print s = let open TextIO in output (stdErr, s) ; output (stdErr, "\n") end val sleep = sleep o Time.fromSeconds val _ = case fork () of NONE => let val _ = List.foreach ([(hup, "Got a hup."), (int, "You can't int me you loser."), (term, "Don't even try to term me.")], fn (signal, msg) => setHandler (signal, Handler.simple (fn () => print msg))) fun loop' () = loop' () in loop' () end | SOME pid => let fun signal s = Process.kill (K_PROC pid, s) in sleep 1 ; print "sending 1" ; List.foreach ([hup, int, term], signal) ; sleep 3 ; print "sending 2" ; List.foreach ([hup, int], signal) ; sleep 3 ; print "sending 3" ; signal kill ; wait () end mlton-20100608/regression/signals4.ok0000644000076600000240000000020711404435621016015 0ustar mtfstaffsending 1 Got a hup. You can't int me you loser. Don't even try to term me. sending 2 Got a hup. You can't int me you loser. sending 3 mlton-20100608/regression/signals4.sml0000644000076600000240000000207211404435620016200 0ustar mtfstaffstructure List = struct open List fun foreach (l, f) = app f l end structure Process = Posix.Process open Process Posix.Signal MLton.Signal fun print s = let open TextIO in output (stdErr, s) ; output (stdErr, "\n") end val sleep = sleep o Time.fromSeconds val _ = List.foreach ([(hup, "Got a hup."), (int, "You can't int me you loser."), (term, "Don't even try to term me.")], fn (signal, msg) => setHandler (signal, Handler.simple (fn () => print msg))) val _ = case fork () of NONE => let fun loop' () = loop' () in loop' () end | SOME pid => let fun signal s = Process.kill (K_PROC pid, s) in sleep 1 ; print "sending 1" ; List.foreach ([hup, int, term], signal) ; sleep 3 ; print "sending 2" ; List.foreach ([hup, int], signal) ; sleep 3 ; print "sending 3" ; signal kill ; wait () end mlton-20100608/regression/sigs.sml0000644000076600000240000000076111404435617015432 0ustar mtfstaffsignature S = sig end functor f () = struct structure K : S = struct end end signature A = sig type t val a : t end signature B = sig type s structure A : A where type t= s val a : s end signature C = sig structure A : A structure B : B sharing type A.t = B.s = B.A.t end structure A = struct datatype t = A | B val a = A val b = B end structure A' = A : A structure A'' : A = A val test1 = A'.a = A''.amlton-20100608/regression/size.ok0000644000076600000240000000071511404435620015246 0ustar mtfstaffThe size of a char is >= 0 bytes. The size of an int list of length 4 is >= 48 bytes. The size of a string of length 10 is >= 24 bytes. The size of an int array of length 10 is >= 52 bytes. The size of a double array of length 10 is >= 92 bytes. The size of an array of length 10 of 2-ples of ints is >= 92 bytes. The size of a useless function is >= 0 bytes. The size of a continuation option ref is > 1000. 13 The size of a continuation option ref is < 1000. mlton-20100608/regression/size.sml0000644000076600000240000000301111404435617015426 0ustar mtfstafffun 'a printSize (name: string, min: int, value: 'a): unit= if MLton.size value >= min then (print "The size of " ; print name ; print " is >= " ; print (Int.toString min) ; print " bytes.\n") else () val l = [1, 2, 3, 4] val _ = ( printSize ("a char", 0, #"c") ; printSize ("an int list of length 4", 48, l) ; printSize ("a string of length 10", 24, "0123456789") ; printSize ("an int array of length 10", 52, Array.tabulate (10, fn _ => 0)) ; printSize ("a double array of length 10", 92, Array.tabulate (10, fn _ => 0.0)) ; printSize ("an array of length 10 of 2-ples of ints", 92, Array.tabulate (10, fn i => (i, i + 1))) ; printSize ("a useless function", 0, fn _ => 13) ) (* This is here so that the list is "useful". * If it were removed, then the optimizer (remove-unused-constructors) * would remove l entirely. *) val _ = if 10 = foldl (op +) 0 l then () else raise Fail "bug" local open MLton.Cont in val rc: int option t option ref = ref NONE val _ = case callcc (fn k: int option t => (rc := SOME k; throw (k, NONE))) of NONE => () | SOME i => print (concat [Int.toString i, "\n"]) end val _ = (print "The size of a continuation option ref is " ; if MLton.size rc > 1000 then print "> 1000.\n" else print "< 1000.\n") val _ = case !rc of NONE => () | SOME k => (rc := NONE; MLton.Cont.throw (k, SOME 13)) mlton-20100608/regression/size2.alpha-linux.ok0000644000076600000240000000330111404435617017551 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 96 bytes. The size of a string of length 10 is = 40 bytes. The size of an int array of length 10 is = 64 bytes. The size of a double array of length 10 is = 104 bytes. The size of a (word32 * double) array of length 10 is = 184 bytes. The size of a (word32 * word32 * double) array of length 10 is = 184 bytes. The size of a (word64 * double) array of length 10 is = 184 bytes. The size of a (word16 * double) array of length 10 is = 184 bytes. The size of a word64 array of length 10 is = 104 bytes. The size of a (word32 * word64) array of length 10 is = 184 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 184 bytes. The size of a (word64 * word64) array of length 10 is = 184 bytes. The size of a (word16 * word64) array of length 10 is = 184 bytes. The size of an array of length 10 of 2-ples of ints is = 104 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 104 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1144 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 208 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1224 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.amd64-darwin.ok0000644000076600000240000000330111404435617017524 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 96 bytes. The size of a string of length 10 is = 40 bytes. The size of an int array of length 10 is = 64 bytes. The size of a double array of length 10 is = 104 bytes. The size of a (word32 * double) array of length 10 is = 184 bytes. The size of a (word32 * word32 * double) array of length 10 is = 184 bytes. The size of a (word64 * double) array of length 10 is = 184 bytes. The size of a (word16 * double) array of length 10 is = 184 bytes. The size of a word64 array of length 10 is = 104 bytes. The size of a (word32 * word64) array of length 10 is = 184 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 184 bytes. The size of a (word64 * word64) array of length 10 is = 184 bytes. The size of a (word16 * word64) array of length 10 is = 184 bytes. The size of an array of length 10 of 2-ples of ints is = 104 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 104 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1144 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 208 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1224 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.amd64-freebsd.ok0000644000076600000240000000330111404435617017652 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 96 bytes. The size of a string of length 10 is = 40 bytes. The size of an int array of length 10 is = 64 bytes. The size of a double array of length 10 is = 104 bytes. The size of a (word32 * double) array of length 10 is = 184 bytes. The size of a (word32 * word32 * double) array of length 10 is = 184 bytes. The size of a (word64 * double) array of length 10 is = 184 bytes. The size of a (word16 * double) array of length 10 is = 184 bytes. The size of a word64 array of length 10 is = 104 bytes. The size of a (word32 * word64) array of length 10 is = 184 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 184 bytes. The size of a (word64 * word64) array of length 10 is = 184 bytes. The size of a (word16 * word64) array of length 10 is = 184 bytes. The size of an array of length 10 of 2-ples of ints is = 104 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 104 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1144 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 208 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1224 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.amd64-linux.ok0000644000076600000240000000330111404435617017377 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 96 bytes. The size of a string of length 10 is = 40 bytes. The size of an int array of length 10 is = 64 bytes. The size of a double array of length 10 is = 104 bytes. The size of a (word32 * double) array of length 10 is = 184 bytes. The size of a (word32 * word32 * double) array of length 10 is = 184 bytes. The size of a (word64 * double) array of length 10 is = 184 bytes. The size of a (word16 * double) array of length 10 is = 184 bytes. The size of a word64 array of length 10 is = 104 bytes. The size of a (word32 * word64) array of length 10 is = 184 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 184 bytes. The size of a (word64 * word64) array of length 10 is = 184 bytes. The size of a (word16 * word64) array of length 10 is = 184 bytes. The size of an array of length 10 of 2-ples of ints is = 104 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 104 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1144 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 208 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1224 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.amd64-mingw.ok0000644000076600000240000000330111404435617017361 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 96 bytes. The size of a string of length 10 is = 40 bytes. The size of an int array of length 10 is = 64 bytes. The size of a double array of length 10 is = 104 bytes. The size of a (word32 * double) array of length 10 is = 184 bytes. The size of a (word32 * word32 * double) array of length 10 is = 184 bytes. The size of a (word64 * double) array of length 10 is = 184 bytes. The size of a (word16 * double) array of length 10 is = 184 bytes. The size of a word64 array of length 10 is = 104 bytes. The size of a (word32 * word64) array of length 10 is = 184 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 184 bytes. The size of a (word64 * word64) array of length 10 is = 184 bytes. The size of a (word16 * word64) array of length 10 is = 184 bytes. The size of an array of length 10 of 2-ples of ints is = 104 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 104 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1144 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 208 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1224 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.hppa-hpux.ok0000644000076600000240000000327511404435620017245 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 64 bytes. The size of a string of length 10 is = 24 bytes. The size of an int array of length 10 is = 56 bytes. The size of a double array of length 10 is = 96 bytes. The size of a (word32 * double) array of length 10 is = 176 bytes. The size of a (word32 * word32 * double) array of length 10 is = 176 bytes. The size of a (word64 * double) array of length 10 is = 176 bytes. The size of a (word16 * double) array of length 10 is = 176 bytes. The size of a word64 array of length 10 is = 96 bytes. The size of a (word32 * word64) array of length 10 is = 176 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 176 bytes. The size of a (word64 * word64) array of length 10 is = 176 bytes. The size of a (word16 * word64) array of length 10 is = 176 bytes. The size of an array of length 10 of 2-ples of ints is = 96 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 96 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1016 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 152 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1136 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1136 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.hppa-linux.ok0000644000076600000240000000327511404435621017421 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 64 bytes. The size of a string of length 10 is = 24 bytes. The size of an int array of length 10 is = 56 bytes. The size of a double array of length 10 is = 96 bytes. The size of a (word32 * double) array of length 10 is = 176 bytes. The size of a (word32 * word32 * double) array of length 10 is = 176 bytes. The size of a (word64 * double) array of length 10 is = 176 bytes. The size of a (word16 * double) array of length 10 is = 176 bytes. The size of a word64 array of length 10 is = 96 bytes. The size of a (word32 * word64) array of length 10 is = 176 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 176 bytes. The size of a (word64 * word64) array of length 10 is = 176 bytes. The size of a (word16 * word64) array of length 10 is = 176 bytes. The size of an array of length 10 of 2-ples of ints is = 96 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 96 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1016 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 152 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1136 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1136 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.ia64-hpux.ok0000644000076600000240000000327511404435620017060 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 64 bytes. The size of a string of length 10 is = 24 bytes. The size of an int array of length 10 is = 56 bytes. The size of a double array of length 10 is = 96 bytes. The size of a (word32 * double) array of length 10 is = 176 bytes. The size of a (word32 * word32 * double) array of length 10 is = 176 bytes. The size of a (word64 * double) array of length 10 is = 176 bytes. The size of a (word16 * double) array of length 10 is = 176 bytes. The size of a word64 array of length 10 is = 96 bytes. The size of a (word32 * word64) array of length 10 is = 176 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 176 bytes. The size of a (word64 * word64) array of length 10 is = 176 bytes. The size of a (word16 * word64) array of length 10 is = 176 bytes. The size of an array of length 10 of 2-ples of ints is = 96 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 96 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1016 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 152 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1136 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1136 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.ia64-linux.ok0000644000076600000240000000330111404435617017227 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 96 bytes. The size of a string of length 10 is = 40 bytes. The size of an int array of length 10 is = 64 bytes. The size of a double array of length 10 is = 104 bytes. The size of a (word32 * double) array of length 10 is = 184 bytes. The size of a (word32 * word32 * double) array of length 10 is = 184 bytes. The size of a (word64 * double) array of length 10 is = 184 bytes. The size of a (word16 * double) array of length 10 is = 184 bytes. The size of a word64 array of length 10 is = 104 bytes. The size of a (word32 * word64) array of length 10 is = 184 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 184 bytes. The size of a (word64 * word64) array of length 10 is = 184 bytes. The size of a (word16 * word64) array of length 10 is = 184 bytes. The size of an array of length 10 of 2-ples of ints is = 104 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 104 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1144 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 208 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1224 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1224 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.ok0000644000076600000240000000327411404435617015341 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 48 bytes. The size of a string of length 10 is = 24 bytes. The size of an int array of length 10 is = 52 bytes. The size of a double array of length 10 is = 92 bytes. The size of a (word32 * double) array of length 10 is = 132 bytes. The size of a (word32 * word32 * double) array of length 10 is = 172 bytes. The size of a (word64 * double) array of length 10 is = 172 bytes. The size of a (word16 * double) array of length 10 is = 132 bytes. The size of a word64 array of length 10 is = 92 bytes. The size of a (word32 * word64) array of length 10 is = 132 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 172 bytes. The size of a (word64 * word64) array of length 10 is = 172 bytes. The size of a (word16 * word64) array of length 10 is = 132 bytes. The size of an array of length 10 of 2-ples of ints is = 92 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 92 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 972 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 144 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1012 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1012 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1052 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1012 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1052 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.s390-linux.ok0000644000076600000240000000327511404435621017167 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 64 bytes. The size of a string of length 10 is = 24 bytes. The size of an int array of length 10 is = 56 bytes. The size of a double array of length 10 is = 96 bytes. The size of a (word32 * double) array of length 10 is = 176 bytes. The size of a (word32 * word32 * double) array of length 10 is = 176 bytes. The size of a (word64 * double) array of length 10 is = 176 bytes. The size of a (word16 * double) array of length 10 is = 176 bytes. The size of a word64 array of length 10 is = 96 bytes. The size of a (word32 * word64) array of length 10 is = 176 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 176 bytes. The size of a (word64 * word64) array of length 10 is = 176 bytes. The size of a (word16 * word64) array of length 10 is = 176 bytes. The size of an array of length 10 of 2-ples of ints is = 96 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 96 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1016 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 152 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1136 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1136 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/size2.sml0000644000076600000240000000770611404435617015527 0ustar mtfstafffun 'a printSize (name: string, value: 'a): unit= (print "The size of " ; print name ; print " is = " ; print (Int.toString (MLton.size value)) ; print " bytes.\n") val l = [1, 2, 3, 4] val _ = ( printSize ("a char", #"c") ; printSize ("an int list of length 4", l) ; printSize ("a string of length 10", "0123456789") ; printSize ("an int array of length 10", Array.tabulate (10, fn _ => 0)) ; printSize ("a double array of length 10", Array.tabulate (10, fn _ => 0.0)) ; printSize ("a (word32 * double) array of length 10", Array.tabulate (10, fn i => (Word32.fromInt i, 0.0))) ; printSize ("a (word32 * word32 * double) array of length 10", Array.tabulate (10, fn i => (Word32.fromInt (i + 1), Word32.fromInt i, 0.0))) ; printSize ("a (word64 * double) array of length 10", Array.tabulate (10, fn i => (Word64.fromInt (i + 1), 0.0))) ; printSize ("a (word16 * double) array of length 10", Array.tabulate (10, fn i => (Word16.fromInt (i + 1), 0.0))) ; printSize ("a word64 array of length 10", Array.tabulate (10, fn i => Word64.fromInt i)) ; printSize ("a (word32 * word64) array of length 10", Array.tabulate (10, fn i => (Word32.fromInt i, Word64.fromInt i))) ; printSize ("a (word32 * word32 * word64) array of length 10", Array.tabulate (10, fn i => (Word32.fromInt i, Word32.fromInt (i + 1), Word64.fromInt i))) ; printSize ("a (word64 * word64) array of length 10", Array.tabulate (10, fn i => (Word64.fromInt (i + 1), Word64.fromInt i))) ; printSize ("a (word16 * word64) array of length 10", Array.tabulate (10, fn i => (Word16.fromInt (i + 1), Word64.fromInt i))) ; printSize ("an array of length 10 of 2-ples of ints", Array.tabulate (10, fn i => (i, i + 1))) ; printSize ("an array of length 10 of 2-ples of (shared) ints", let val t = (0, 1) in Array.tabulate (10, fn _ => t) end) ; printSize ("an array of length 10 of arrays of length 20 of ints", Array.tabulate (10, fn i => Array.tabulate (20, fn j => i + j))) ; printSize ("an array of length 10 of (shared) arrays of length 20 of ints", let val a = Array.tabulate (20, fn j => j) in Array.tabulate (10, fn i => a) end) ; printSize ("an array of length 10 of tuples of word16 * (arrays of length 20 of ints)", Array.tabulate (10, fn i => (Word16.fromInt i, Array.tabulate (20, fn j => i + j)))) ; printSize ("an array of length 10 of tuples of word32 * (arrays of length 20 of ints)", Array.tabulate (10, fn i => (Word32.fromInt i, Array.tabulate (20, fn j => i + j)))) ; printSize ("an array of length 10 of tuples of word64 * (arrays of length 20 of ints)", Array.tabulate (10, fn i => (Word64.fromInt i, Array.tabulate (20, fn j => i + j)))) ; printSize ("an array of length 10 of tuples of real32 * (arrays of length 20 of ints)", Array.tabulate (10, fn i => (Real32.fromInt i, Array.tabulate (20, fn j => i + j)))) ; printSize ("an array of length 10 of tuples of real64 * (arrays of length 20 of ints)", Array.tabulate (10, fn i => (Real64.fromInt i, Array.tabulate (20, fn j => i + j)))) ; printSize ("a useless function", fn _ => 13) ) (* This is here so that the list is "useful". * If it were removed, then the optimizer (remove-unused-constructors) * would remove l entirely. *) val _ = if 10 = foldl (op +) 0 l then () else raise Fail "bug" mlton-20100608/regression/size2.sparc-linux.ok0000644000076600000240000000327511404435617017606 0ustar mtfstaffThe size of a char is = 0 bytes. The size of an int list of length 4 is = 64 bytes. The size of a string of length 10 is = 24 bytes. The size of an int array of length 10 is = 56 bytes. The size of a double array of length 10 is = 96 bytes. The size of a (word32 * double) array of length 10 is = 176 bytes. The size of a (word32 * word32 * double) array of length 10 is = 176 bytes. The size of a (word64 * double) array of length 10 is = 176 bytes. The size of a (word16 * double) array of length 10 is = 176 bytes. The size of a word64 array of length 10 is = 96 bytes. The size of a (word32 * word64) array of length 10 is = 176 bytes. The size of a (word32 * word32 * word64) array of length 10 is = 176 bytes. The size of a (word64 * word64) array of length 10 is = 176 bytes. The size of a (word16 * word64) array of length 10 is = 176 bytes. The size of an array of length 10 of 2-ples of ints is = 96 bytes. The size of an array of length 10 of 2-ples of (shared) ints is = 96 bytes. The size of an array of length 10 of arrays of length 20 of ints is = 1016 bytes. The size of an array of length 10 of (shared) arrays of length 20 of ints is = 152 bytes. The size of an array of length 10 of tuples of word16 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of word64 * (arrays of length 20 of ints) is = 1136 bytes. The size of an array of length 10 of tuples of real32 * (arrays of length 20 of ints) is = 1056 bytes. The size of an array of length 10 of tuples of real64 * (arrays of length 20 of ints) is = 1136 bytes. The size of a useless function is = 0 bytes. mlton-20100608/regression/slow.ok0000644000076600000240000000000711404435617015260 0ustar mtfstaffAll ok mlton-20100608/regression/slow.sml0000644000076600000240000000031611404435617015445 0ustar mtfstafffun loop (left: IntInf.int): unit = case IntInf.compare (left, 0) of LESS => () | EQUAL => () | GREATER => loop (left + ~1) val _ = loop 100000000 val _ = print "All ok\n" mlton-20100608/regression/slow2.ok0000644000076600000240000000000711404435617015342 0ustar mtfstaffAll ok mlton-20100608/regression/slow2.sml0000644000076600000240000000023611404435620015522 0ustar mtfstafffun loop (left: IntInf.int): unit = if left = 0 then () else loop (left + ~1) val _ = loop 100000000 val _ = print "All ok\n" mlton-20100608/regression/slower.ok0000644000076600000240000000000711404435617015607 0ustar mtfstaffAll ok mlton-20100608/regression/slower.sml0000644000076600000240000000033011404435621015763 0ustar mtfstafffun loop (left: IntInf.int): unit = case IntInf.compare (left, 4294967296) of LESS => () | EQUAL => () | GREATER => loop (left + ~1) val _ = loop 4304967296 val _ = print "All ok\n" mlton-20100608/regression/smith-normal-form.ok0000644000076600000240000001632711404435620017655 0ustar mtfstaff 8 ~3 1 3 6 9 ~2 4 ~9 ~9 2 3 8 ~1 3 ~5 4 ~3 ~5 ~6 8 1 4 ~5 7 ~4 ~4 ~7 7 1 4 ~3 0 8 ~6 ~2 ~3 4 5 ~2 7 ~7 ~6 ~7 ~3 ~4 9 7 ~3 3 0 3 3 ~8 ~8 2 3 8 3 ~2 ~4 3 ~6 ~6 0 ~5 8 ~9 2 4 2 7 ~4 9 ~3 6 ~2 3 ~3 0 ~9 5 8 ~1 2 ~8 3 4 ~6 5 ~6 ~5 ~8 0 ~5 3 5 4 7 2 3 ~9 7 ~7 3 ~8 7 5 5 ~2 ~6 ~3 6 5 3 ~1 ~1 4 5 ~5 5 9 9 3 8 ~3 ~1 9 2 9 9 3 ~4 0 9 2 5 3 ~5 ~3 ~1 1 8 ~6 2 ~4 ~8 ~7 ~8 4 5 8 ~1 ~1 7 2 5 5 ~4 ~7 5 5 1 ~7 3 ~5 4 9 3 4 4 ~5 7 ~1 7 4 ~7 7 ~7 ~2 9 ~9 0 ~4 ~4 0 2 6 3 ~1 6 6 7 1 2 7 6 5 ~6 ~3 ~4 ~8 0 9 6 1 2 ~5 4 4 4 ~6 ~7 ~9 ~6 2 ~4 5 ~2 1 0 1 ~8 7 6 2 ~1 ~8 4 ~7 7 ~3 ~2 ~5 3 0 3 ~9 3 3 9 ~1 4 8 ~9 6 ~5 9 5 ~1 ~1 ~9 7 ~2 3 9 0 ~6 ~3 ~7 ~1 5 ~2 8 ~5 ~3 ~8 7 ~2 ~2 0 ~8 4 8 9 ~5 ~4 ~8 ~1 7 1 1 6 ~9 ~4 0 8 4 ~4 9 6 ~3 ~2 ~6 ~3 4 8 ~8 1 ~5 9 7 9 7 ~9 ~6 6 1 ~3 3 ~3 ~7 1 7 ~7 0 ~2 7 ~4 ~6 6 7 ~5 ~9 6 1 8 4 ~2 7 ~7 ~1 ~9 1 ~6 ~5 4 9 6 0 ~8 ~3 1 ~3 8 ~3 2 9 ~3 ~9 ~1 ~3 1 7 ~8 ~9 ~7 ~3 8 9 ~7 ~1 ~7 4 0 0 1 ~5 9 ~8 ~1 ~2 3 5 9 ~9 5 4 ~9 1 ~4 ~2 3 ~4 ~5 ~4 ~4 9 2 7 ~2 6 7 2 ~9 4 2 7 8 ~9 2 5 3 9 6 3 0 ~7 ~6 ~7 6 ~2 9 ~3 ~6 9 5 ~7 8 ~4 8 8 ~4 ~9 6 0 ~3 6 0 8 8 ~6 ~2 5 4 ~1 ~8 1 ~3 ~1 2 3 ~9 ~9 ~5 1 8 ~5 7 ~5 ~1 5 ~2 7 0 ~7 ~1 8 8 ~3 9 ~5 7 ~8 ~8 ~4 3 2 ~1 8 ~2 1 2 5 0 ~6 7 3 3 7 ~4 ~2 3 ~3 ~1 2 ~2 ~1 ~9 ~5 1 0 0 2 9 ~3 ~9 2 9 3 8 ~3 4 8 8 3 ~3 ~1 ~4 4 ~6 ~9 5 1 4 ~3 ~1 ~9 5 ~8 ~8 6 1 1 ~2 7 5 6 ~4 2 ~7 0 ~7 ~3 ~5 9 3 4 ~6 8 ~4 3 6 0 2 ~6 ~1 8 4 ~3 ~1 ~6 ~2 ~8 ~2 ~1 ~1 ~5 ~9 ~8 9 ~9 5 1 9 ~1 ~6 9 ~7 2 8 ~7 4 ~9 7 6 ~2 9 ~9 ~6 1 ~8 8 4 ~6 8 1 ~3 ~7 8 ~5 2 ~8 1 3 ~2 6 6 6 1 0 0 ~7 7 ~3 ~3 0 ~4 ~7 ~4 4 1 ~1 ~3 ~8 3 7 9 8 3 0 4 4 ~1 ~5 4 2 2 0 6 ~6 2 ~9 8 ~9 3 ~2 2 6 6 ~5 8 6 1 ~6 ~6 6 1 1 ~3 ~9 ~6 2 ~7 2 ~1 6 ~6 0 2 ~7 8 ~8 4 9 ~3 9 ~7 ~9 ~6 ~4 ~4 ~4 ~7 ~2 2 ~4 ~2 6 ~3 ~1 ~4 0 ~5 9 7 ~6 ~9 7 ~9 ~6 2 ~3 1 5 ~9 4 ~5 4 ~9 1 ~2 ~2 4 ~9 6 6 ~5 ~1 ~7 4 ~9 4 ~1 6 ~4 7 2 8 7 3 1 ~7 7 7 9 8 ~9 7 2 1 2 ~8 4 5 6 4 ~3 8 0 ~2 ~2 2 ~3 8 3 1 ~8 ~5 ~2 5 6 8 0 ~3 4 ~2 4 ~9 ~5 7 6 ~4 ~7 2 4 ~3 ~8 ~8 ~8 6 ~2 ~6 8 ~3 3 ~1 ~7 1 9 1 7 ~6 8 ~2 ~9 ~1 3 ~4 7 8 ~1 9 ~9 6 ~3 5 0 2 5 5 ~2 3 0 ~9 ~8 ~6 1 8 0 1 2 ~8 ~2 0 ~9 ~8 0 5 ~3 ~4 5 6 ~2 ~5 0 ~9 9 ~9 ~5 9 9 ~4 5 ~5 7 8 9 7 ~3 1 9 ~7 ~1 8 ~5 ~1 2 ~8 1 0 9 ~8 ~1 6 ~1 9 ~8 7 4 ~8 7 0 ~6 7 0 ~9 6 8 2 2 5 ~6 ~6 9 ~5 9 2 2 ~8 0 ~6 ~9 ~6 ~4 ~9 8 ~2 9 7 ~5 ~1 7 2 ~7 7 8 ~7 ~9 ~6 9 ~7 ~7 6 ~8 9 5 ~4 1 ~7 ~8 ~6 ~3 8 ~8 1 ~8 6 9 ~3 ~7 7 1 6 1 0 8 ~5 ~3 ~2 8 1 ~1 ~1 ~4 3 7 ~2 ~9 9 ~8 ~9 6 ~4 7 ~1 ~5 ~3 ~9 0 ~3 0 7 9 1 ~2 7 ~9 ~6 3 ~9 ~9 ~2 ~9 ~9 9 6 6 7 5 ~1 ~2 1 5 2 ~3 ~4 1 ~6 0 ~3 ~9 ~1 7 0 ~9 5 ~2 ~2 5 3 4 7 7 8 7 6 1 ~2 5 ~6 9 4 8 5 0 ~4 ~2 ~2 ~5 ~2 ~6 9 ~8 ~2 ~5 ~9 3 ~6 ~3 ~4 ~5 ~2 6 dd: pos = 0 dd: pos = 1 dd: pos = 2 dd: pos = 3 dd: pos = 4 dd: pos = 5 dd: pos = 6 dd: pos = 7 dd: pos = 8 dd: pos = 9 dd: pos = 10 dd: pos = 11 dd: pos = 12 dd: pos = 13 dd: pos = 14 dd: pos = 15 dd: pos = 16 dd: pos = 17 dd: pos = 18 dd: pos = 19 dd: pos = 20 dd: pos = 21 dd: pos = 22 dd: pos = 23 dd: pos = 24 dd: pos = 25 dd: pos = 26 dd: pos = 27 dd: pos = 28 dd: pos = 29 dd: pos = 30 dd: pos = 31 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ~8074709755269798283190497453463562613129 mlton-20100608/regression/smith-normal-form.sml0000644000076600000240000006276611404435617020055 0ustar mtfstaffsignature MATRIX = sig type 'entry matrix val make: int * int * (int * int -> 'entry) -> 'entry matrix val height: 'entry matrix -> int val width: 'entry matrix -> int val fetch: 'entry matrix * int * int -> 'entry val fetchRow: 'entry matrix * int -> int -> 'entry val fetchCol: 'entry matrix * int -> int -> 'entry val store: 'entry matrix * int * int * 'entry -> unit val storeRow: 'entry matrix * int -> int * 'entry -> unit val storeCol: 'entry matrix * int -> int * 'entry -> unit val rowSwap: 'entry matrix * int * int -> unit val colSwap: 'entry matrix * int * int -> unit val rowOp: 'entry matrix * int * int * ('entry * 'entry -> 'entry) -> unit val colOp: 'entry matrix * int * int * ('entry * 'entry -> 'entry) -> unit val copy: 'entry matrix -> 'entry matrix val map: 'entry1 matrix * ('entry1 -> 'entry2) -> 'entry2 matrix val toString: 'entry matrix * ('entry -> string) -> string end structure Matrix:> MATRIX = struct type 'entry matrix = int * int * 'entry array exception sizeError exception index exception foldError fun make (height: int, width: int, generator: int * int -> 'entry) : 'entry matrix = if height < 0 orelse width < 0 then raise sizeError else (height, width, Array.tabulate (height*width, fn z => generator (z div width, z mod width))) fun height (height, _, _) = height fun width (width, _, _) = width fun fetch ((height, width, mat), row, col) = if 0 <= row andalso row < height andalso 0 <= col andalso col < width then Array.sub (mat, col + width*row) else raise index fun fetchRow ((height, width, mat), row) = if 0 <= row andalso row < height then let val offset = width * row in fn col => if 0 <= col andalso col < width then Array.sub (mat, col + offset) else raise index end else raise index fun fetchCol ((height, width, mat), col) = if 0 <= col andalso col < width then fn row => if 0 <= row andalso row < height then Array.sub (mat, col + width*row) else raise index else raise index fun store ((height, width, mat), row, col, entry) = if 0 <= row andalso row < height andalso 0 <= col andalso col < width then Array.update (mat, col + width*row, entry) else raise index fun storeRow ((height, width, mat), row) = if 0 <= row andalso row < height then let val offset = width * row in fn (col, entry) => if 0 <= col andalso col < width then Array.update (mat, col + offset, entry) else raise index end else raise index fun storeCol ((height, width, mat), col) = if 0 <= col andalso col < width then fn (row, entry) => if 0 <= row andalso row < height then Array.update (mat, col + width*row, entry) else raise index else raise index fun swapLoop (from1: int -> 'entry, to1: int * 'entry -> unit, from2: int -> 'entry, to2: int * 'entry -> unit, limit: int): unit = let fun loop (i: int): unit = if i = limit then () else let val tmp = from1 i in to1 (i, from2 i); to2 (i, tmp); loop (i + 1) end in loop 0 end fun rowSwap (mat as (height, width, _), row1, row2): unit = if 0 <= row1 andalso row1 < height andalso 0 <= row2 andalso row2 < height then if row1 = row2 then () else swapLoop (fetchRow (mat, row1), storeRow (mat, row1), fetchRow (mat, row2), storeRow (mat, row2), width) else raise index fun colSwap (mat as (height, width, _), col1, col2): unit = if 0 <= col1 andalso col1 < width andalso 0 <= col2 andalso col2 < width then if col1 = col2 then () else swapLoop (fetchCol (mat, col1), storeCol (mat, col1), fetchCol (mat, col2), storeCol (mat, col2), height) else raise index fun opLoop (from1: int -> 'entry, from2: int -> 'entry, to2: int * 'entry -> unit, limit: int, f: 'entry * 'entry -> 'entry): unit = let fun loop (i: int): unit = if i = limit then () else ( to2 (i, f (from1 i, from2 i)); loop (i + 1)) in loop 0 end fun rowOp (mat as (height, width, _), row1, row2, f: 'entry * 'entry -> 'entry): unit = if 0 <= row1 andalso row1 < height andalso 0 <= row2 andalso row2 < height andalso row1 <> row2 then opLoop (fetchRow (mat, row1), fetchRow (mat, row2), storeRow (mat, row2), width, f) else raise index fun colOp (mat as (height, width, _), col1, col2, f: 'entry * 'entry -> 'entry): unit = if 0 <= col1 andalso col1 < width andalso 0 <= col2 andalso col2 < width andalso col1 <> col2 then opLoop (fetchCol (mat, col1), fetchCol (mat, col2), storeCol (mat, col2), height, f) else raise index fun copy ((height, width, mat)) = (height, width, Array.tabulate (Array.length mat, fn i => Array.sub (mat, i))) fun map ((height, width, mat: 'entry1 Array.array), f: 'entry1 -> 'entry2) : 'entry2 matrix = (height, width, Array.tabulate (Array.length mat, fn i => f (Array.sub (mat, i)))) (* Natural fold a range of integers in reverse. *) fun naturalFold (limit: int, state: 'state, folder: int * 'state -> 'state): 'state = let fun loop (i: int, state: 'state) = if i = 0 then state else loop (i - 1, folder (i - 1, state)) in if limit < 0 then raise foldError else loop (limit, state) end local val blank8 = Byte.charToByte #" " fun makeBlanks size = let val blanks = Word8Vector.tabulate (size, fn _ => blank8) in Byte.bytesToString blanks end in fun toString (mat: 'entry matrix, f: 'entry -> string): string = let val mat as (height, width, _) = map (mat, f) fun maxSize from (i, width) = Int.max (String.size (from i), width) fun colWidth col = naturalFold (height, 0, maxSize (fetchCol (mat, col))) val widths = Vector.tabulate (width, colWidth) fun doRow (row: int, ac: string list): string list = let val from = fetchRow (mat, row) fun loop (col: int, ac: string list) = let val next = from col val ac = next::ac val s = String.size next val pad = Vector.sub (widths, col) - s val ac = if pad <= 0 then ac else (makeBlanks pad)::ac in if col = 0 then ac else loop (col - 1, " "::ac) end val ac = "\n"::ac in if width = 0 then ac else loop (width - 1, ac) end val pieces = naturalFold (height, [], doRow) in String.concat pieces end end end val zero = IntInf.fromInt 0 fun smaller (a: IntInf.int, b: IntInf.int): bool = (not (a = zero)) andalso (b = zero orelse IntInf.< (IntInf.abs a , IntInf.abs b)) fun smithNormalForm (mat: IntInf.int Matrix.matrix): IntInf.int Matrix.matrix = let val height = Matrix.height mat val width = Matrix.width mat val mat = Matrix.copy mat val range = Int.min (width, height) fun dd pos = let val matCol = Matrix.fetchCol (mat, pos) val matRow = Matrix.fetchRow (mat, pos) val _ = print ("dd: pos = " ^ (Int.toString pos) ^ "\n") fun swapRowLoop (best, bestRow, bestCol, row) = if row >= height then (Matrix.rowSwap (mat, pos, bestRow); Matrix.colSwap (mat, pos, bestCol)) else let val matRow = Matrix.fetchRow (mat, row) fun swapColLoop (best, bestRow, bestCol, col) = if col >= width then swapRowLoop (best, bestRow, bestCol, row + 1) else let val next = matRow col in if smaller (next, best) then swapColLoop (next, row, col, col + 1) else swapColLoop (best, bestRow, bestCol, col + 1) end in swapColLoop (best, bestRow, bestCol, pos) end fun rowLoop row = if row < height then if (matCol row) = zero then rowLoop (row + 1) else (Matrix.rowOp (mat, pos, row, let val x = IntInf.~ (IntInf.quot(matCol row, matCol pos)) in fn (lhs, rhs) => IntInf.+ (IntInf.* (lhs, x), rhs) end); if (matCol row) = zero then rowLoop (row + 1) else hitPosAgain ()) else let fun colLoop col = if col < width then if (matRow col) = zero then colLoop (col + 1) else (Matrix.colOp (mat, pos, col, let val x = IntInf.~ (IntInf.quot (matRow col, matRow pos)) in fn (lhs, rhs) => IntInf.+ (IntInf.* (lhs, x), rhs) end); if (matRow col) = zero then colLoop (col + 1) else hitPosAgain ()) else () in colLoop (pos + 1) end and hitPosAgain () = (swapRowLoop (zero, pos, pos, pos); rowLoop (pos + 1)) in hitPosAgain () end fun loop pos = if pos = range then mat else (dd pos; loop (pos + 1)) in loop 0 end val table = [[ 8, ~3, 1, 3, 6, 9, ~2, 4, ~9, ~9, 2, 3, 8, ~1, 3, ~5, 4, ~3, ~5, ~6, 8, 1, 4, ~5, 7, ~4, ~4, ~7, 7, 1, 4, ~3, 8, 4, ~4, ~8, 5, ~9, 3, ~4, 1, 9, ~8, ~6, ~2, 8, ~9, ~5, ~3, ~3], [ 0, 8, ~6, ~2, ~3, 4, 5, ~2, 7, ~7, ~6, ~7, ~3, ~4, 9, 7, ~3, 3, 0, 3, 3, ~8, ~8, 2, 3, 8, 3, ~2, ~4, 3, ~6, ~6, ~2, 6, 5, ~1, ~3, 1, 8, ~8, 2, 1, ~7, ~7, ~7, ~3, ~6, 6, ~4, ~9], [ 0, ~5, 8, ~9, 2, 4, 2, 7, ~4, 9, ~3, 6, ~2, 3, ~3, 0, ~9, 5, 8, ~1, 2, ~8, 3, 4, ~6, 5, ~6, ~5, ~8, 0, ~5, 3, ~2, ~5, 8, 7, ~1, 1, ~1, 7, 6, 3, 6, 5, 6, 8, 7, 9, 7, ~3], [ 5, 4, 7, 2, 3, ~9, 7, ~7, 3, ~8, 7, 5, 5, ~2, ~6, ~3, 6, 5, 3, ~1, ~1, 4, 5, ~5, 5, 9, 9, 3, 8, ~3, ~1, 9, ~9, 6, ~7, 7, 4, 6, ~8, ~9, 0, ~3, ~2, ~7, 1, ~2, ~6, 7, 7, 7], [ 2, 9, 9, 3, ~4, 0, 9, 2, 5, 3, ~5, ~3, ~1, 1, 8, ~6, 2, ~4, ~8, ~7, ~8, 4, 5, 8, ~1, ~1, 7, 2, 5, 5, ~4, ~7, ~3, ~7, 6, ~4, ~5, ~8, ~5, ~9, ~8, 5, ~5, ~5, 0, 8, 8, 6, 4, ~1], [ 5, 5, 1, ~7, 3, ~5, 4, 9, 3, 4, 4, ~5, 7, ~1, 7, 4, ~7, 7, ~7, ~2, 9, ~9, 0, ~4, ~4, 0, 2, 6, 3, ~1, 6, 6, 8, ~6, ~4, ~9, 3, ~2, ~5, 5, ~3, 2, ~1, ~6, 9, 3, ~3, ~8, ~9, 7], [ 7, 1, 2, 7, 6, 5, ~6, ~3, ~4, ~8, 0, 9, 6, 1, 2, ~5, 4, 4, 4, ~6, ~7, ~9, ~6, 2, ~4, 5, ~2, 1, 0, 1, ~8, 7, ~7, ~5, 4, 1, ~5, 4, ~4, ~2, ~3, 1, 1, 3, 4, ~4, ~5, 9, 8, ~2], [ 6, 2, ~1, ~8, 4, ~7, 7, ~3, ~2, ~5, 3, 0, 3, ~9, 3, 3, 9, ~1, 4, 8, ~9, 6, ~5, 9, 5, ~1, ~1, ~9, 7, ~2, 3, 9, 8, 9, 2, 7, 7, 6, ~1, ~1, ~2, ~2, ~7, 3, ~6, 0, ~9, 4, 3, 7], [ 0, ~6, ~3, ~7, ~1, 5, ~2, 8, ~5, ~3, ~8, 7, ~2, ~2, 0, ~8, 4, 8, 9, ~5, ~4, ~8, ~1, 7, 1, 1, 6, ~9, ~4, 0, 8, 4, 3, ~7, 6, 0, 1, 8, 6, ~1, ~1, ~7, 9, ~9, ~5, ~2, ~2, ~1, 1, 0], [~4, 9, 6, ~3, ~2, ~6, ~3, 4, 8, ~8, 1, ~5, 9, 7, 9, 7, ~9, ~6, 6, 1, ~3, 3, ~3, ~7, 1, 7, ~7, 0, ~2, 7, ~4, ~6, 0, 1, ~3, ~5, ~9, ~7, 8, 4, 9, ~8, ~8, ~7, ~6, 7, 6, ~3, ~8, 5], [ 6, 7, ~5, ~9, 6, 1, 8, 4, ~2, 7, ~7, ~1, ~9, 1, ~6, ~5, 4, 9, 6, 0, ~8, ~3, 1, ~3, 8, ~3, 2, 9, ~3, ~9, ~1, ~3, 4, 3, 2, ~9, ~5, ~3, 8, ~4, 8, 5, ~4, 7, 6, ~8, 7, 6, ~5, 5], [ 1, 7, ~8, ~9, ~7, ~3, 8, 9, ~7, ~1, ~7, 4, 0, 0, 1, ~5, 9, ~8, ~1, ~2, 3, 5, 9, ~9, 5, 4, ~9, 1, ~4, ~2, 3, ~4, 8, ~6, ~4, ~8, ~5, ~5, 4, ~2, ~4, ~1, ~9, ~5, 2, ~9, 2, ~9, ~2, ~3], [~5, ~4, ~4, 9, 2, 7, ~2, 6, 7, 2, ~9, 4, 2, 7, 8, ~9, 2, 5, 3, 9, 6, 3, 0, ~7, ~6, ~7, 6, ~2, 9, ~3, ~6, 9, ~9, 2, 2, ~6, ~1, 4, ~3, 3, 0, 6, ~3, 4, 9, 9, ~6, 5, 5, ~5], [ 5, ~7, 8, ~4, 8, 8, ~4, ~9, 6, 0, ~3, 6, 0, 8, 8, ~6, ~2, 5, 4, ~1, ~8, 1, ~3, ~1, 2, 3, ~9, ~9, ~5, 1, 8, ~5, ~3, 0, ~4, ~9, 0, ~6, 3, ~1, ~7, 0, 8, 9, ~6, ~1, ~9, 1, ~6, 2], [ 7, ~5, ~1, 5, ~2, 7, 0, ~7, ~1, 8, 8, ~3, 9, ~5, 7, ~8, ~8, ~4, 3, 2, ~1, 8, ~2, 1, 2, 5, 0, ~6, 7, 3, 3, 7, ~5, 5, ~1, 1, 0, ~8, 1, 0, 0, ~4, 6, 9, ~5, ~6, 3, ~5, 8, 5], [~4, ~2, 3, ~3, ~1, 2, ~2, ~1, ~9, ~5, 1, 0, 0, 2, 9, ~3, ~9, 2, 9, 3, 8, ~3, 4, 8, 8, 3, ~3, ~1, ~4, 4, ~6, ~9, 5, ~2, 1, 3, ~7, ~5, ~6, ~5, ~8, 4, ~8, ~3, 5, 0, 7, ~9, 6, 2], [ 5, 1, 4, ~3, ~1, ~9, 5, ~8, ~8, 6, 1, 1, ~2, 7, 5, 6, ~4, 2, ~7, 0, ~7, ~3, ~5, 9, 3, 4, ~6, 8, ~4, 3, 6, 0, 2, 3, ~6, 3, 9, 4, 1, ~4, 6, ~5, ~7, 0, ~1, ~8, ~3, ~9, 9, 7], [ 2, ~6, ~1, 8, 4, ~3, ~1, ~6, ~2, ~8, ~2, ~1, ~1, ~5, ~9, ~8, 9, ~9, 5, 1, 9, ~1, ~6, 9, ~7, 2, 8, ~7, 4, ~9, 7, 6, ~2, 1, ~2, ~7, 8, 0, 5, 0, ~5, ~7, ~6, 0, 4, 0, 3, ~8, 5, 4], [~2, 9, ~9, ~6, 1, ~8, 8, 4, ~6, 8, 1, ~3, ~7, 8, ~5, 2, ~8, 1, 3, ~2, 6, 6, 6, 1, 0, 0, ~7, 7, ~3, ~3, 0, ~4, 3, ~7, ~6, 7, 5, 9, ~5, 7, ~8, 2, 3, ~8, ~7, 6, ~5, ~5, ~8, ~9], [~7, ~4, 4, 1, ~1, ~3, ~8, 3, 7, 9, 8, 3, 0, 4, 4, ~1, ~5, 4, 2, 2, 0, 6, ~6, 2, ~9, 8, ~9, 3, ~2, 2, 6, 6, 1, 7, 1, 0, ~8, 2, 3, ~3, 8, 9, 5, 5, ~6, 4, ~7, ~4, ~2, ~3], [~5, 8, 6, 1, ~6, ~6, 6, 1, 1, ~3, ~9, ~6, 2, ~7, 2, ~1, 6, ~6, 0, 2, ~7, 8, ~8, 4, 9, ~3, 9, ~7, ~9, ~6, ~4, ~4, ~5, 8, 2, ~5, ~4, ~3, 5, 2, 1, ~3, ~3, ~7, ~9, 3, 7, ~7, 3, ~8], [~4, ~7, ~2, 2, ~4, ~2, 6, ~3, ~1, ~4, 0, ~5, 9, 7, ~6, ~9, 7, ~9, ~6, 2, ~3, 1, 5, ~9, 4, ~5, 4, ~9, 1, ~2, ~2, 4, 0, 4, ~8, ~8, 3, ~1, ~5, ~4, ~9, ~7, 7, 6, 3, ~9, 6, 4, ~4, ~7], [~9, 6, 6, ~5, ~1, ~7, 4, ~9, 4, ~1, 6, ~4, 7, 2, 8, 7, 3, 1, ~7, 7, 7, 9, 8, ~9, 7, 2, 1, 2, ~8, 4, 5, 6, 7, 2, ~7, 6, 8, 4, ~9, 7, ~5, 6, 9, ~1, 9, 2, 0, 9, 3, 6], [ 4, ~3, 8, 0, ~2, ~2, 2, ~3, 8, 3, 1, ~8, ~5, ~2, 5, 6, 8, 0, ~3, 4, ~2, 4, ~9, ~5, 7, 6, ~4, ~7, 2, 4, ~3, ~8, ~9, 9, 8, ~9, 3, ~7, 4, ~7, ~5, 4, 9, 3, ~6, ~3, ~7, 4, 2, ~2], [~8, ~8, 6, ~2, ~6, 8, ~3, 3, ~1, ~7, 1, 9, 1, 7, ~6, 8, ~2, ~9, ~1, 3, ~4, 7, 8, ~1, 9, ~9, 6, ~3, 5, 0, 2, 5, ~1, ~6, ~6, 1, 8, 6, ~3, ~9, ~1, 9, ~2, 9, ~8, ~7, ~3, 6, ~3, ~3], [ 5, ~2, 3, 0, ~9, ~8, ~6, 1, 8, 0, 1, 2, ~8, ~2, 0, ~9, ~8, 0, 5, ~3, ~4, 5, 6, ~2, ~5, 0, ~9, 9, ~9, ~5, 9, 9, ~5, ~2, 4, 3, 8, ~8, ~7, 5, ~3, ~2, 2, 3, 9, 7, ~1, 0, 4, ~1], [~4, 5, ~5, 7, 8, 9, 7, ~3, 1, 9, ~7, ~1, 8, ~5, ~1, 2, ~8, 1, 0, 9, ~8, ~1, 6, ~1, 9, ~8, 7, 4, ~8, 7, 0, ~6, 2, 3, 7, 4, ~3, ~5, 9, ~3, 0, 6, ~9, 2, 4, ~8, 6, ~7, 9, 1], [ 7, 0, ~9, 6, 8, 2, 2, 5, ~6, ~6, 9, ~5, 9, 2, 2, ~8, 0, ~6, ~9, ~6, ~4, ~9, 8, ~2, 9, 7, ~5, ~1, 7, 2, ~7, 7, ~1, ~3, 6, 6, 1, ~4, 0, ~1, ~6, ~5, 6, ~7, ~3, ~2, 8, 2, ~9, 8], [ 8, ~7, ~9, ~6, 9, ~7, ~7, 6, ~8, 9, 5, ~4, 1, ~7, ~8, ~6, ~3, 8, ~8, 1, ~8, 6, 9, ~3, ~7, 7, 1, 6, 1, 0, 8, ~5, ~8, 8, ~9, 0, 4, 4, 3, ~4, 6, ~3, ~9, 0, 4, ~4, ~5, ~9, ~5, ~8], [~3, ~2, 8, 1, ~1, ~1, ~4, 3, 7, ~2, ~9, 9, ~8, ~9, 6, ~4, 7, ~1, ~5, ~3, ~9, 0, ~3, 0, 7, 9, 1, ~2, 7, ~9, ~6, 3, 3, ~4, ~7, ~3, ~4, ~8, ~2, ~3, ~9, ~2, ~6, 3, ~6, ~4, 7, ~5, ~8, ~1], [~9, ~9, ~2, ~9, ~9, 9, 6, 6, 7, 5, ~1, ~2, 1, 5, 2, ~3, ~4, 1, ~6, 0, ~3, ~9, ~1, 7, 0, ~9, 5, ~2, ~2, 5, 3, 4, ~1, 6, ~6, 3, ~6, 7, ~1, 5, ~8, ~4, ~2, ~2, ~6, ~5, ~6, 3, ~1, 4], [ 7, 7, 8, 7, 6, 1, ~2, 5, ~6, 9, 4, 8, 5, 0, ~4, ~2, ~2, ~5, ~2, ~6, 9, ~8, ~2, ~5, ~9, 3, ~6, ~3, ~4, ~5, ~2, 6, 1, 6, ~5, 0, ~3, ~2, 4, ~6, 1, 6, ~1, 3, ~9, 2, ~3, 1, 5, ~6], [ 6, 4, ~7, 3, ~7, 9, 1, ~7, ~8, 0, ~6, 8, 4, 1, 9, 6, 8, 3, 0, 9, 0, 4, 9, ~7, ~7, 1, 5, 1, ~5, 6, 9, 2, 4, 1, ~9, 8, 4, 5, 8, 3, 2, ~9, ~6, ~9, 9, ~9, 7, ~6, ~4, 3], [~3, ~9, ~4, 2, 3, 9, ~9, 8, ~9, 9, ~4, ~9, ~5, 5, 0, 7, 3, ~5, ~8, 2, ~3, 0, ~9, ~3, 1, 9, 4, 5, ~1, 8, 0, ~4, ~2, 9, ~4, ~1, 3, 5, 9, ~1, 1, 4, ~8, ~2, ~3, 5, 1, 5, ~6, 7], [ 9, ~3, 2, ~9, 3, 4, 0, 7, ~5, 9, 0, ~6, 7, ~2, 3, ~7, 2, ~5, ~2, 6, 3, ~9, ~5, ~9, 5, 2, ~5, ~3, 8, ~5, 6, 2, 9, ~7, ~7, ~7, ~6, 9, ~3, 6, 0, 6, ~6, ~9, 4, ~3, ~9, 0, ~4, ~9], [~4, ~8, 8, ~7, 7, 0, ~6, ~6, 8, ~9, ~4, 5, ~3, ~1, 7, ~5, ~6, ~1, 8, 6, ~2, 1, ~1, 5, ~9, 1, ~1, ~7, ~6, ~6, ~6, ~4, 6, 3, ~5, ~5, ~6, 2, 3, ~6, ~8, ~3, 8, ~2, ~5, ~4, ~3, 1, 4, ~4], [ 4, ~6, 2, 6, 2, ~8, 8, 5, 8, ~2, 0, ~6, ~1, ~6, ~2, 2, 6, ~9, ~7, ~6, ~4, ~4, ~7, ~2, 8, 6, 3, ~7, ~6, 8, 2, 3, 4, 5, 3, 4, ~6, 8, 8, ~1, 4, ~5, 6, 2, 8, ~3, ~9, ~2, 6, 7], [ 3, ~4, 0, ~3, ~5, 0, ~2, ~6, ~2, 8, 5, ~9, ~4, ~8, ~6, 0, 8, 9, 1, ~2, 8, 2, ~2, 8, 9, 3, 3, 5, ~9, ~3, ~2, 7, 2, 9, 0, 4, 8, ~9, 0, ~6, 9, ~9, 9, ~4, 8, ~8, ~8, 2, ~3, 2], [~1, 3, ~9, ~8, ~7, 6, ~6, 3, 0, 5, ~5, 1, 2, ~2, ~3, 7, 7, 3, ~4, ~2, ~9, ~5, ~1, 9, 6, 8, 2, 8, 7, ~3, 4, 6, 6, 0, ~2, 2, ~7, ~7, 6, ~3, 8, 2, 1, 0, 8, ~1, 3, 9, 8, 6], [ 1, ~2, ~3, 6, 5, 5, ~6, ~4, ~5, 1, 1, 6, ~7, ~4, ~3, 4, 4, ~8, ~9, 7, ~2, ~3, ~7, ~2, 1, 2, 0, 8, ~6, ~5, ~5, 7, 8, 5, ~2, 3, 9, 0, 5, 1, 3, ~4, ~6, 1, 4, ~9, ~2, 5, 4, 3], [ 3, 3, 9, ~2, 6, 9, 4, 9, 4, ~8, 5, ~1, 3, ~2, 1, ~7, ~3, 2, 2, 0, ~3, 3, 8, 2, 0, ~5, 7, 1, 4, ~8, 8, ~9, ~1, 1, ~9, ~4, 5, 2, 2, 8, 6, 1, 6, ~2, 2, 7, 1, ~6, ~1, ~1], [ 4, ~2, 4, ~1, ~5, ~1, 5, ~2, 3, ~4, ~5, 0, 2, ~4, 6, 4, ~3, 2, 2, 5, ~6, ~7, ~9, ~1, ~9, ~9, 6, 0, 6, 5, 9, ~1, 3, ~3, ~8, 8, ~8, 8, 4, 5, ~1, ~5, 1, 0, 3, ~2, 5, 6, 6, 5], [~4, 9, 6, 8, ~9, 5, 5, ~3, ~7, 7, 6, 8, ~8, 0, 4, ~1, 9, 5, ~7, 0, ~1, ~2, 3, 6, 0, 4, ~3, 1, 4, 6, 4, 0, 5, ~1, 7, ~7, ~6, ~8, ~3, ~6, 7, ~1, ~3, ~2, ~3, ~5, 3, 1, ~8, ~9], [~6, 4, ~5, 9, 9, ~7, ~1, ~8, ~4, 2, ~6, 0, ~6, ~6, 7, 6, 0, 1, 7, ~7, 0, ~4, ~6, ~8, ~9, 5, ~6, ~9, 2, ~7, ~2, ~6, 9, 4, ~5, 0, 4, ~4, ~5, 6, 9, 1, ~6, ~5, 3, ~1, 7, ~7, ~6, 7], [~8, 7, 7, ~6, 7, ~4, 8, 0, ~9, ~8, ~3, 7, ~3, 3, 8, ~7, ~2, ~7, 5, 5, ~5, 4, 6, 2, 4, 1, 4, ~9, ~3, 8, 8, ~9, ~4, ~2, 1, ~3, 1, 3, 9, ~5, ~8, ~2, 7, 8, 9, 2, 0, 1, ~9, 6], [~7, 1, ~9, 5, ~5, ~5, 7, 6, ~5, ~9, ~6, ~8, ~6, 9, 7, 9, 0, ~5, 7, 7, ~6, 4, 5, ~9, ~1, ~2, ~7, 3, ~5, ~2, ~5, 5, ~3, ~4, ~2, ~8, 2, ~8, 0, ~8, 0, ~8, 9, 8, ~5, ~5, 1, 3, 5, ~4], [~8, ~8, 0, ~5, ~8, ~6, 3, ~6, ~4, 6, 1, ~5, ~6, ~8, ~4, ~6, ~2, ~6, 6, ~4, 8, 8, 4, ~5, ~1, 0, 9, ~8, ~3, ~1, ~8, 7, ~3, 0, ~7, 1, ~7, ~1, ~7, 3, ~7, 3, ~4, ~8, 8, ~7, ~9, ~8, 3, 2], [ 3, 6, 8, ~9, 7, 1, ~9, 9, 3, 8, 6, 4, ~2, 1, ~8, 4, ~7, ~4, ~3, 3, ~5, ~6, ~7, ~2, 0, ~4, 5, 2, 5, 6, 3, ~8, 2, ~5, ~7, 6, 8, ~2, ~5, ~4, 9, 9, 2, ~2, ~2, 7, 4, 4, ~2, 3], [ 6, 6, ~5, ~2, ~8, ~2, ~9, 0, 2, 4, ~6, ~9, 9, 0, ~8, ~3, ~1, ~2, ~1, 6, 8, 2, ~9, 5, ~2, 1, 7, ~6, 5, 1, ~1, 4, ~4, ~7, ~6, ~3, ~8, 2, 2, 5, 5, ~6, 5, 3, 3, 7, 4, 7, ~3, ~9], [~9, 6, ~4, 1, 3, ~8, ~8, ~8, ~1, 5, 1, 1, ~1, 6, 5, 1, ~1, 5, ~8, 8, ~7, ~5, ~1, ~1, 6, ~8, ~3, ~1, ~2, ~6, ~5, ~5, ~6, 0, 2, 2, 7, ~1, ~5, ~7, ~1, ~3, 7, 6, 0, 2, 4, ~5, 0, ~4]] fun f (x, y) = List.nth (List.nth (table, x), y) fun show m = print (Matrix.toString (m, IntInf.toString)) val _ = let val dim = 32 val big = Matrix.map (Matrix.make (dim, dim, f), IntInf.fromInt) in show big; print "\n"; show (smithNormalForm big) end mlton-20100608/regression/socket.ok0000644000076600000240000000004411404435617015565 0ustar mtfstaffOK hello, world NONE goodbye, world mlton-20100608/regression/socket.sml0000644000076600000240000000313111404435617015747 0ustar mtfstaffval addr = INetSock.any 0 val socket = INetSock.TCP.socket () val _ = Socket.bind (socket, addr) val _ = Socket.listen (socket, 5) val addr = Socket.Ctl.getSockName socket fun read socket : string = Byte.unpackStringVec (Word8VectorSlice.full (Socket.recvVec (socket, 100))) fun readNB socket : string option = Option.map (Byte.unpackStringVec o Word8VectorSlice.full) (Socket.recvVecNB (socket, 100)) fun write (socket, s: string): unit = (Socket.sendVec (socket, Word8VectorSlice.full (Byte.stringToBytes s)) ; ()) val _ = print (case Socket.acceptNB socket of NONE => "OK\n" | SOME _ => "WRONG\n") val _ = case Posix.Process.fork () of NONE => let val _ = Posix.Process.sleep (Time.fromSeconds 1) val (socket, _) = Socket.accept socket val _ = print (read socket) val _ = print (case readNB socket of NONE => "NONE\n" | SOME s => s) val _ = write (socket, "goodbye, world\n"); val _ = Socket.close socket in () end | SOME pid => let val socket' = INetSock.TCP.socket () val _ = Socket.connect (socket', addr) val _ = write (socket', "hello, world\n") val _ = print (read socket') val _ = Socket.close socket' val (pid', status) = Posix.Process.wait () in if pid = pid' andalso status = Posix.Process.W_EXITED then () else print "child failed\n" end mlton-20100608/regression/string.fromString.ok0000644000076600000240000000007511404435617017740 0ustar mtfstaffOK [abc] OK [] OK [a] OK [a] OK [] OK [] OK [] OK [] mlton-20100608/regression/string.fromString.sml0000644000076600000240000000066411404435617020126 0ustar mtfstafffun check (s, s') = case String.fromString s of NONE => print "WRONG NONE\n" | SOME s'' => if s' = s'' then print (concat ["OK [", s', "]\n"]) else print (concat ["WRONG [", s', "] [", s'', "]\n"]) val _ = List.app check [("abc\"def", "abc"), ("\\q", ""), ("a\^D", "a"), ("a\\ \\\\q", "a"), ("\\ \\", ""), ("", ""), ("\\ \\\^D", ""), ("\\ a", "")] mlton-20100608/regression/string.ok0000644000076600000240000000111411404435617015602 0ustar mtfstaffTesting String... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK test9 OK test10 OK test11a OK test11b OK test11c OK test11d OK test11e OK test11f OK test11g OK test11h OK test12a OK test12b OK test12c OK test12d OK test12e OK test12f OK test12g OK test13a OK test13b OK test14 OK test15 OK test16a OK test16b OK test17 OK test18 OK test19 OK test20 OK test21 OK test22 OK test23 OK test24 OK test25 OK mlton-20100608/regression/string.sml0000644000076600000240000003152611404435621015771 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/string.sml PS 1994-12-10, 1995-06-14, 1996-05-16 *) (*KILL 05/11/1997 11:02. tho.: use "auxil.sml"; *) val _ = print "Testing String...\n"; local val map' = map open Char String val map = map' val s1 = "" (* size s1 = 0 *) and s2 = "ABCDE\tFGHI"; (* size s2 = 10 *) val ABCDE = List.map chr [65,66,67,68,69]; in val test1 = tst' "test1" (fn _ => (size s1 = 0 andalso size s2 = 10)); val test2 = tst' "test2" (fn _ => (sub(s2,6) = chr 70 andalso sub(s2,9) = chr 73)); val test3 = tst0 "test3" ((sub(s1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test4 = tst0 "test4" ((sub(s2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test5 = tst0 "test5" ((sub(s2, 10) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test6 = tst' "test6" (fn _ => "" = concat [] andalso "" = concat [s1] andalso s2 = concat [s2] andalso s2^s2 = concat [s2,s2] andalso "ABCD" = concat ["A","B","C","D"]); val test7 = tst' "test7" (fn _ => "A" = str(chr 65)); val test8 = tst' "test8" (fn _ => "" = implode [] andalso "ABCDE" = implode ABCDE); val test9 = tst' "test9" (fn _ => [] = explode "" andalso ABCDE = explode "ABCDE"); val test10 = tst' "test10" (fn _ => s1 < s2 andalso s1 <= s1 andalso s2 > s1 andalso s2 >=s2); val test11a = tst' "test11a" (fn _ => s2 = extract(s2, 0, SOME (size s2)) andalso s2 = extract(s2, 0, NONE) andalso "" = extract(s2, size s2, SOME 0) andalso "" = extract(s2, size s2, NONE) andalso "" = extract(s1, 0, SOME 0) andalso "" = extract(s1, 0, NONE)); val test11b = tst0 "test11b" ((extract(s2, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11c = tst0 "test11c" ((extract(s2, 11, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11d = tst0 "test11d" ((extract(s2, 0, SOME 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11e = tst0 "test11e" ((extract(s2, 10, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11f = tst0 "test11f" ((extract(s2, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11g = tst0 "test11g" ((extract(s2, 11, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test11h = tst' "test11h" (fn _ => "ABCDE" = extract(s2, 0, SOME 5) andalso "FGHI" = extract(s2, 6, SOME 4) andalso "FGHI" = extract(s2, 6, NONE)); val test12a = tst' "test12a" (fn _ => s2 = substring(s2, 0, size s2) andalso "" = substring(s2, size s2, 0) andalso "" = substring(s1, 0, 0)); val test12b = tst0 "test12b" ((substring(s2, ~1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test12c = tst0 "test12c" ((substring(s2, 11, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test12d = tst0 "test12d" ((substring(s2, 0, 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test12e = tst0 "test12e" ((substring(s2, 10, 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"); val test12f = tst' "test12f" (fn _ => "ABCDE" = substring(s2, 0, 5) andalso "FGHI" = substring(s2, 6, 4)); val test12g = tst0 "test12g" (case (Int.minInt, Int.maxInt) of (SOME min, SOME max) => ((substring("", max, max); substring("", min, min); "WRONG") handle Subscript => "OK" | _ => "WRONG") | _ => "OK"); val test13a = tst' "test13a" (fn _ => (translate (fn _ => "") s2 = "" andalso translate (fn x => str x) "" = "" andalso translate (fn x => str x) s2 = s2)); val test13b = tst' "test13b" (fn _ => (translate (fn c => if c = #"\t" then "XYZ " else str c) s2 = "ABCDEXYZ FGHI")); val test14 = tst' "test14" (fn _ => (tokens isSpace "" = [] andalso tokens isSpace " \t \n" = [] andalso tokens (fn c => c = #",") ",asd,,def,fgh" = ["asd","def","fgh"])); val test15 = tst' "test15" (fn _ => (fields isSpace "" = [""] andalso fields isSpace " \t \n" = ["","","","","","",""] andalso fields (fn c => c = #",") ",asd,,def,fgh" = ["","asd","","def","fgh"])); val test16a = tst' "test16a" (fn _ => EQUAL = compare(s1,s1) andalso EQUAL = compare(s2,s2) andalso LESS = compare("A", "B") andalso GREATER = compare("B", "A") andalso LESS = compare("ABCD", "ABCDE") andalso GREATER = compare("ABCDE", "ABCD")); val test16b = tst' "test16b" (fn _ => EQUAL = compare(s1,s1) andalso EQUAL = compare(s2,s2) andalso LESS = compare("A", "a") andalso GREATER = compare("b", "B") andalso LESS = compare("abcd", "abcde") andalso GREATER = compare("abcde", "abcd")); (* Test cases for SML string escape functions. *) val test17 = let fun chk (arg, res) = toString (str arg) = res val argResList = [(#"\000", "\\^@"), (#"\001", "\\^A"), (#"\006", "\\^F"), (#"\007", "\\a"), (#"\008", "\\b"), (#"\009", "\\t"), (#"\010", "\\n"), (#"\011", "\\v"), (#"\012", "\\f"), (#"\013", "\\r"), (#"\014", "\\^N"), (#"\031", "\\^_"), (#"\032", " "), (#"\126", "~"), (#"\\", "\\\\"), (#"\"", "\\\""), (#"A", "A"), (#"\127", "\\127"), (#"\128", "\\128"), (#"\255", "\\255")] val (arg, res) = (implode (map #1 argResList), concat (map #2 argResList)) in tst' "test17" (fn _ => List.all chk argResList andalso toString arg = res) end; val test18 = let val chars = CharVector.tabulate(256, chr) val l = CharVector.foldl (fn (e,l) => e :: l) [] chars val chars = implode l in tst' "test18" (fn _ => fromString(toString chars) = SOME chars) end val test19 = let fun chkFromString (arg, res) = fromString arg = SOME (str res) val argResList = [("A", #"A"), ("z", #"z"), ("@", #"@"), ("~", #"~"), ("\\a", #"\007"), ("\\b", #"\008"), ("\\t", #"\009"), ("\\n", #"\010"), ("\\v", #"\011"), ("\\f", #"\012"), ("\\r", #"\013"), ("\\\\", #"\\"), ("\\\"", #"\""), ("\\^@", #"\000"), ("\\^A", #"\001"), ("\\^Z", #"\026"), ("\\^_", #"\031"), ("\\000", #"\000"), ("\\097", #"a"), ("\\255", #"\255"), ("\\ \t\n\n \\A", #"A"), ("\\ \t\n\n \\z", #"z"), ("\\ \t\n\n \\@", #"@"), ("\\ \t\n\n \\~", #"~"), ("\\ \t\n\n \\\\n", #"\n"), ("\\ \t\n\n \\\\t", #"\t"), ("\\ \t\n\n \\\\\\", #"\\"), ("\\ \t\n\n \\\\\"", #"\""), ("\\ \t\n\n \\\\^@", #"\000"), ("\\ \t\n\n \\\\^A", #"\001"), ("\\ \t\n\n \\\\^Z", #"\026"), ("\\ \t\n\n \\\\^_", #"\031"), ("\\ \t\n\n \\\\000", #"\000"), ("\\ \t\n\n \\\\097", #"a"), ("\\ \t\n\n \\\\255", #"\255")] val (arg, res) = (concat (map #1 argResList), implode (map #2 argResList)) in tst' "test19" (fn _ => List.all chkFromString argResList andalso fromString arg = SOME res) end; val test20 = tst' "test20" (fn _ => List.all (fn arg => isSome (fromString arg)) ["\\", "\\c", "\\F", "\\e", "\\g", "\\N", "\\T", "\\1", "\\11", "\\256", "\\-65", "\\~65", "\\?", "\\^`", "\\^a", "\\^z", "\\ a", "\\ a\\B", "\\ \\"]); (* Test cases for C string escape functions *) val test21 = let val chars = CharVector.tabulate(256, chr) val l = CharVector.foldl (fn (e,l) => e :: l) [] chars val chars = implode l in tst' "test21" (fn _ => fromCString(toCString chars) = SOME chars) end; val test22 = let val argResList = [("\010", "\\n"), ("\009", "\\t"), ("\011", "\\v"), ("\008", "\\b"), ("\013", "\\r"), ("\012", "\\f"), ("\007", "\\a"), ("\\", "\\\\"), ("?", "\\?"), ("'", "\\'"), ("\"", "\\\"")] val (arg, res) = (concat (map #1 argResList), concat (map #2 argResList)) in tst' "test22" (fn _ => List.all (fn (arg, res) => toCString arg = res) argResList andalso toCString arg = res) end; val test23 = let fun checkFromCStringSucc (arg, res) = fromCString arg = SOME res val argResList = [("\\n", "\010"), ("\\t", "\009"), ("\\v", "\011"), ("\\b", "\008"), ("\\r", "\013"), ("\\f", "\012"), ("\\a", "\007"), ("\\\\", "\\"), ("\\?", "?"), ("\\'", "'"), ("\\\"", "\""), ("\\1", "\001"), ("\\11", "\009"), ("\\111", "\073"), ("\\1007", "\0647"), ("\\100A", "\064A"), ("\\0", "\000"), ("\\377", "\255"), ("\\18", "\0018"), ("\\178", "\0158"), ("\\1C", "\001C"), ("\\17C", "\015C"), ("\\x0", "\000"), ("\\xff", "\255"), ("\\xFF", "\255"), ("\\x1", "\001"), ("\\x11", "\017"), ("\\xag", "\010g"), ("\\xAAg", "\170g"), ("\\x0000000a", "\010"), ("\\x0000000a2", "\162"), ("\\x0000000ag", "\010g"), ("\\x0000000A", "\010"), ("\\x0000000A2", "\162"), ("\\x0000000Ag", "\010g"), ("\\x00000000000000000000000000000000000000000000000000000000000000011+", "\017+")] val (arg, res) = (concat (map #1 argResList), concat (map #2 argResList)) in tst' "test23" (fn _ => List.all checkFromCStringSucc argResList andalso fromCString arg = SOME res) end; val test24 = let fun checkFromCStringFail arg = isSome (fromCString arg) in tst' "test24" (fn _ => List.all checkFromCStringFail ["\\", "\\X", "\\=", "\\400", "\\777", "\\8", "\\9", "\\c", "\\d", "\\x", "\\x100", "\\xG"]) end; val test25 = tst' "test25" (fn _ => isPrefix "" "" andalso isPrefix "" "abcde" andalso isPrefix "a" "abcde" andalso isPrefix "abcd" "abcde" andalso isPrefix "abcde" "abcde" andalso not (isPrefix "abcde" "") andalso not (isPrefix "abcdef" "abcde") andalso not (isPrefix "Abcde" "abcde") andalso not (isPrefix "abcdE" "abcde")) end mlton-20100608/regression/string2.ok0000644000076600000240000000001111404435617015657 0ustar mtfstaff\000\000 mlton-20100608/regression/string2.sml0000644000076600000240000000016711404435621016050 0ustar mtfstaffval _ = print(concat[Char.toCString #"\000", String.toCString "\000", "\n"]) mlton-20100608/regression/stringcvt.ok0000644000076600000240000000026711404435617016327 0ustar mtfstaff File stringcvt.sml: Testing structure StringCvt... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK test7 OK test8 OK test9 OK test10 OK mlton-20100608/regression/stringcvt.sml0000644000076600000240000001542311404435621016504 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/stringcvt.sml -- 1995-10-26, 1996-07-05 *) (*KILL 05/11/1997 11:02. tho.: use "auxil.sml"; *) val _ = print "\nFile stringcvt.sml: Testing structure StringCvt...\n"; local open StringCvt (* Read all upper case letters, skip lowercase letters, scan an * integer, and return the excess characters: *) fun triple getc src = let open StringCvt val (str1, src1) = splitl Char.isUpper getc src val src2 = dropl Char.isLower getc src1 in case Int.scan DEC getc src2 of NONE => NONE | SOME (i, src3) => let val str2 = takel (fn _ => true) getc src3 in SOME((str1, i, str2), src3) end end (* Testing TextIO.scanStream: *) val tmpfile = "textio.tmp"; fun putandscan scan s = let open TextIO val os = openOut tmpfile val _ = output(os, s) val _ = closeOut os val is = openIn tmpfile in scanStream scan is before closeIn is end; fun testtrip (s, res) = scanString triple s = res andalso putandscan triple s = res datatype result = Bool of bool | Int of int fun backtrack getc src = case Bool.scan getc src of SOME(b, rest) => SOME (Bool b, rest) | NONE => case Int.scan StringCvt.DEC getc src of SOME(i, rest) => SOME(Int i, rest) | NONE => case Int.scan StringCvt.HEX getc src of SOME(i, rest) => SOME(Int i, rest) | NONE => NONE fun testback (s, res) = scanString backtrack s = res andalso putandscan backtrack s = res in val test1 = tst' "test1" (fn _ => padLeft #"#" 0 "abcdef" = "abcdef" andalso padLeft #"#" 6 "abcdef" = "abcdef" andalso padLeft #"#" 7 "abcdef" = "#abcdef" andalso padLeft #"#" 10 "abcdef" = "####abcdef" andalso padLeft #"#" ~3 "abcdef" = "abcdef"); val test2 = tst' "test2" (fn _ => padRight #"#" 0 "abcdef" = "abcdef" andalso padRight #"#" 6 "abcdef" = "abcdef" andalso padRight #"#" 7 "abcdef" = "abcdef#" andalso padRight #"#" 10 "abcdef" = "abcdef####" andalso padRight #"#" ~3 "abcdef" = "abcdef"); val test3 = tst' "test3" (fn _ => testtrip ("", NONE) andalso testtrip(" a1", NONE) andalso testtrip(" A1", NONE) andalso testtrip("ABC A1", NONE) andalso testtrip("ABC a1", NONE) andalso testtrip(" *1", NONE) andalso testtrip("ABC *1", NONE)); val test4 = tst' "test4" (fn _ => testtrip ("1", SOME("", 1, "")) andalso testtrip ("1", SOME("", 1, "")) andalso testtrip (" 1", SOME("", 1, "")) andalso testtrip (" 1 ", SOME("", 1, " "))); val test5 = tst' "test5" (fn _ => testtrip ("1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("a1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("a1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("azbc1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("azbc1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("azbc 1a123+ +&D", SOME("", 1, "a123+ +&D")) andalso testtrip ("azbc 1a123+ +&D", SOME("", 1, "a123+ +&D"))) val test6 = tst' "test6" (fn _ => testtrip ("~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("a~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("a~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("azbc~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("azbc~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("azbc ~1234a123+ +&D", SOME("", ~1234, "a123+ +&D")) andalso testtrip ("azbc ~1234a123+ +&D", SOME("", ~1234, "a123+ +&D"))) val test7 = tst' "test7" (fn _ => testtrip ("A1a123+ +&D", SOME("A", 1, "a123+ +&D")) andalso testtrip ("ABCDEFG1a123+ +&D", SOME("ABCDEFG", 1, "a123+ +&D")) andalso testtrip ("Aa1a123+ +&D", SOME("A", 1, "a123+ +&D")) andalso testtrip ("ABCDEFGa1a123+ +&D", SOME("ABCDEFG", 1, "a123+ +&D")) andalso testtrip ("Aazbc1a123+ +&D", SOME("A", 1, "a123+ +&D")) andalso testtrip ("ABCDEFGazbc1a123+ +&D", SOME("ABCDEFG", 1, "a123+ +&D")) andalso testtrip ("Aazbc 1a123+ +&D", SOME("A", 1, "a123+ +&D")) andalso testtrip ("ABCDEFGazbc 1a123+ +&D", SOME("ABCDEFG", 1, "a123+ +&D"))) val test8 = tst' "test8" (fn _ => testtrip ("A~1234a123+ +&D", SOME("A", ~1234, "a123+ +&D")) andalso testtrip ("ABCDEFG~1234a123+ +&D", SOME("ABCDEFG", ~1234, "a123+ +&D")) andalso testtrip ("Aa~1234a123+ +&D", SOME("A", ~1234, "a123+ +&D")) andalso testtrip ("ABCDEFGa~1234a123+ +&D", SOME("ABCDEFG", ~1234, "a123+ +&D")) andalso testtrip ("Aazbc~1234a123+ +&D", SOME("A", ~1234, "a123+ +&D")) andalso testtrip ("ABCDEFGazbc~1234a123+ +&D", SOME("ABCDEFG", ~1234, "a123+ +&D")) andalso testtrip ("Aazbc ~1234a123+ +&D", SOME("A", ~1234, "a123+ +&D")) andalso testtrip ("ABCDEFGazbc ~1234a123+ +&D", SOME("ABCDEFG", ~1234, "a123+ +&D"))) val test9 = tst' "test9" (fn _ => let fun getstring b getc src = SOME(takel (fn _ => b) getc src, src) fun dup 0 s = s | dup n s = dup (n-1) (s^s); val longstring = dup 13 "abcDEFGHI" in scanString (getstring true) longstring = SOME longstring andalso scanString (getstring false) longstring = SOME "" andalso putandscan (getstring true) longstring = SOME longstring end) val test10 = tst' "test10" (fn _ => List.all testback [("false", SOME (Bool false)), ("true", SOME (Bool true)), ("tru e", NONE), ("fals e", SOME (Int 250)), ("fa", SOME (Int 250)), ("fa00", SOME (Int 64000)), ("21a", SOME (Int 21)), ("a21", SOME (Int 2593)), ("", NONE), ("gryf", NONE) ]); (*val _ = FileSys.remove tmpfile*) end mlton-20100608/regression/substring-overflow.ok0000644000076600000240000000000311404435617020151 0ustar mtfstaffOK mlton-20100608/regression/substring-overflow.sml0000644000076600000240000000020611404435617020340 0ustar mtfstaffopen Substring val _ = (slice (full "abc", 1, SOME (valOf Int.maxInt)) ; print "ERROR\n") handle Subscript => print "OK\n" mlton-20100608/regression/substring.ok0000644000076600000240000000171111404435617016317 0ustar mtfstafftest1a OK test1b OK test1c OK test1d OK test1e OK test1f OK test1g OK test1h OK test2a OK test2b OK test2c OK test3a OK test3b OK test3c OK test4 OK test5a OK test5b OK test6 OK test7 OK test8a OK test8b OK test8c OK test8d OK test8e OK test8f OK test9a OK test9b OK test9c OK test9d OK test9e OK test9f OK test9g OK test9h OK test12 OK test13 OK test14 OK test15 OK test16 OK test17 OK test18 OK test19 OK test20 OK test21 OK test22a OK test22b OK test23 OK test24 OK test25 OK test26a OK test26b OK test27a OK test27b OK test28 OK test29a OK test29b OK test29c OK test30a OK test30b OK test30c OK test30d OK test30e OK test30f OK test31 OK test32a OK test32b OK test32c OK test32d OK test32e OK mlton-20100608/regression/substring.sml0000644000076600000240000003752311404435617016513 0ustar mtfstaff(* test/substring.sml 1995-04-27, 1997-06-03 *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun checkrange bounds = check o range bounds; local open Char Substring val all = full fun base2 (a, b) = (base a, base b) val s1 = "" (* String.size s1 = 0 *) and s2 = "ABCDE\tFGHI"; (* String.size s2 = 10 *) val ss1 = all s1 (* size s1 = 0 *) and ss2 = all s2; (* size s2 = 10 *) val sa = "AAAAaAbAABBBB"; (* String.size sa = 14 *) (* 45678 *) val ssa1 = extract(sa, 4, SOME 0) (* size ssa1 = 0 *) val ssa2 = extract(sa, 4, SOME 5) (* size ssa2 = 5 *) val ss3 = extract("junk this is a (clear)textjunk", 4, SOME 24); (* 456789012345678901234567 *) in val test1a = tst' "test1a" (fn _ => (s2, 10, 0) = base(extract(s2, 10, SOME 0)) andalso (s2, 10, 0) = base(extract(s2, 10, NONE)) andalso (s2, 0, 0) = base(extract(s2, 0, SOME 0)) andalso (s2, 4, 3) = base(extract(s2, 4, SOME 3)) andalso (s2, 4, 6) = base(extract(s2, 4, SOME 6)) andalso (s2, 4, 6) = base(extract(s2, 4, NONE)) andalso (s2, 0, 10) = base(extract(s2, 0, SOME 10)) andalso (s2, 0, 10) = base(extract(s2, 0, NONE))); val test1b = tst0 "test1b" ((extract(s2, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1c = tst0 "test1c" ((extract(s2, 11, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1d = tst0 "test1d" ((extract(s2, 0, SOME 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1e = tst0 "test1e" ((extract(s2, 10, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1f = tst0 "test1f" ((extract(s2, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1g = tst0 "test1g" ((extract(s2, 11, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test1h = tst' "test1h" (fn _ => string ssa1 = "" andalso string ssa2 = "aAbAA" andalso s1 = string (all s1) andalso s2 = string (all s2)); val test2a = tst' "test2a" (fn _ => string(triml 6 ss2) = "FGHI" andalso s2 = string(triml 0 ss2) andalso s1 = string(triml 0 ss1) andalso (s2, 10, 0) = base(triml 10 ss2) andalso (s2, 10, 0) = base(triml 11 ss2) andalso (sa, 6, 3) = base(triml 2 ssa2) andalso (sa, 9, 0) = base(triml 5 ssa2) andalso (sa, 9, 0) = base(triml 6 ssa2)); val test2b = tst0 "test2b" ((triml ~1 ss2 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test2c = tst0 "test2c" ((triml ~1 ssa2 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test3a = tst' "test3a" (fn _ => string(trimr 6 ss2) = "ABCD" andalso s2 = string(trimr 0 ss2) andalso s1 = string(trimr 0 ss1) andalso (s2, 0, 0) = base(trimr 10 ss2) andalso (s2, 0, 0) = base(trimr 11 ss2) andalso (sa, 4, 3) = base(trimr 2 ssa2) andalso (sa, 4, 0) = base(trimr 5 ssa2) andalso (sa, 4, 0) = base(trimr 6 ssa2)); val test3b = tst0 "test3b" ((trimr ~1 ss2 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test3c = tst0 "test3c" ((trimr ~1 ssa2 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test4 = tst' "test4" (fn _ => isEmpty ss1 andalso not (isEmpty ss2) andalso isEmpty ssa1 andalso not (isEmpty ssa2)); val test5a = tst' "test5a" (fn _ => case getc ssa1 of NONE => true | _ => false); val test5b = tst' "test5b" (fn _ => case getc ssa2 of NONE => false | SOME(#"a", rest) => "AbAA" = string rest | _ => false); val test6 = tst' "test6" (fn _ => first ssa1 = NONE andalso first ssa2 = SOME #"a") val test7 = tst' "test7" (fn _ => (size ss1 = 0 andalso size ss2 = 10 andalso size ssa1 = 0 andalso size ssa2 = 5)); val test8a = tst' "test8a" (fn _ => (sub(ss2,6) = chr 70 andalso sub(ss2,9) = chr 73 andalso sub(ssa2, 1) = chr 65)); val test8b = tst0 "test8b" ((sub(ss1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8c = tst0 "test8c" ((sub(ss2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8d = tst0 "test8d" ((sub(ss2, 10) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8e = tst0 "test8e" ((sub(ssa2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8f = tst0 "test8f" ((sub(ssa2, 5) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9a = tst' "test9a" (fn _ => base ss2 = base(slice(ss2, 0, SOME (size ss2))) andalso base ss2 = base(slice(ss2, 0, NONE)) andalso (s2, 10, 0) = base(slice(ss2, size ss2, SOME 0)) andalso (s2, 10, 0) = base(slice(ss2, size ss2, NONE)) andalso base ss1 = base(slice(ss1, 0, SOME 0)) andalso base ss1 = base(slice(ss1, 0, NONE))); val test9b = tst' "test9b" (fn _ => (sa, 4, 5) = base(slice(ssa2, 0, SOME 5)) andalso (sa, 4, 5) = base(slice(ssa2, 0, NONE)) andalso (sa, 4, 0) = base(slice(ssa2, 0, SOME 0)) andalso (sa, 9, 0) = base(slice(ssa2, 5, SOME 0)) andalso (sa, 9, 0) = base(slice(ssa2, 5, NONE)) andalso (sa, 5, 3) = base(slice(ssa2, 1, SOME 3)) andalso (sa, 5, 4) = base(slice(ssa2, 1, SOME 4)) andalso (sa, 5, 4) = base(slice(ssa2, 1, NONE))); val test9c = tst0 "test9c" ((slice(ssa2, ~1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9d = tst0 "test9d" ((slice(ssa2, 6, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9e = tst0 "test9e" ((slice(ssa2, 0, SOME 6) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9f = tst0 "test9f" ((slice(ssa2, 5, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9g = tst0 "test9g" ((slice(ssa2, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9h = tst0 "test9h" ((slice(ssa2, 6, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test12 = tst' "test12" (fn _ => concat [] = "" andalso concat [ssa1, ssa1, ssa1] = "" andalso concat [ssa2, ssa2, ssa2] = "aAbAAaAbAAaAbAA" andalso concat [ssa2, ssa1, ss2, ss1] = "aAbAAABCDE\tFGHI"); val test13 = tst' "test13" (fn _ => explode ss1 = [] andalso explode ssa1 = [] andalso explode ssa2 = [#"a", #"A", #"b", #"A", #"A"]); val test14 = tst' "test14" (fn _ => EQUAL = compare(ssa1,ssa1) andalso EQUAL = compare(ssa2,ssa2) andalso LESS = compare(triml 1 ssa2, ssa2) andalso GREATER = compare(ssa2, triml 1 ssa2) andalso LESS = compare(trimr 1 ssa2, ssa2) andalso GREATER = compare(ssa2, trimr 1 ssa2) andalso LESS = compare(all "AB", ssa2) andalso GREATER = compare(ssa2, all "AB")); fun finda c = c <> #"A"; fun findb c = c <> #"B"; val test15 = tst' "test15" (fn _ => (sa, 5, 4) = base(dropl finda ssa2) andalso (sa, 9, 0) = base(dropl findb ssa2) andalso base ssa1 = base(dropl finda ssa1)); val test16 = tst' "test16" (fn _ => (sa, 4, 5) = base(dropr finda ssa2) andalso (sa, 4, 0) = base(dropr findb ssa2) andalso base ssa1 = base(dropr finda ssa1)); val test17 = tst' "test17" (fn _ => (sa, 4, 1) = base(takel finda ssa2) andalso (sa, 4, 5) = base(takel findb ssa2) andalso base ssa1 = base(takel finda ssa1)); val test18 = tst' "test18" (fn _ => (sa, 9, 0) = base(taker finda ssa2) andalso (sa, 4, 5) = base(taker findb ssa2) andalso base ssa1 = base(taker finda ssa1)); val test19 = tst' "test19" (fn _ => ((sa, 4, 1), (sa, 5, 4)) = base2(splitl finda ssa2) andalso ((sa, 4, 5), (sa, 9, 0)) = base2(splitl findb ssa2) andalso base2(ssa1, ssa1) = base2(splitl finda ssa1)); val test20 = tst' "test20" (fn _ => ((sa, 4, 5), (sa, 9, 0)) = base2(splitr finda ssa2) andalso ((sa, 4, 0), (sa, 4, 5)) = base2(splitr findb ssa2) andalso base2(ssa1, ssa1) = base2 (splitr finda ssa1)); val test21 = tst' "test21" (fn _ => ((sa, 4, 0), (sa, 4, 5)) = base2(position "" ssa2) andalso ((sa, 4, 1), (sa, 5, 4)) = base2(position "Ab" ssa2) andalso ((sa, 4, 5), (sa, 9, 0)) = base2(position "B" ssa2) andalso ((sa, 4, 5), (sa, 9, 0)) = base2(position "AAB" ssa2) andalso ((sa, 4, 0), (sa, 4, 5)) = base2(position "aA" ssa2) andalso ((sa, 4, 2), (sa, 6, 3)) = base2(position "bAA" ssa2) andalso (base ssa1, base ssa1) = base2(position "A" ssa1) andalso (base ssa1, base ssa1) = base2(position "" ssa1)); (* For the pre-November 1995 version of position: val test21 = tst' "test21" (fn _ => (sa, 4, 5) = base(position "" ssa2) andalso (sa, 5, 4) = base(position "Ab" ssa2) andalso (sa, 9, 0) = base(position "B" ssa2) andalso (sa, 9, 0) = base(position "AAB" ssa2) andalso (sa, 4, 5) = base(position "aA" ssa2) andalso (sa, 6, 3) = base(position "bAA" ssa2) andalso base ssa1 = base(position "A" ssa1) andalso base ssa1 = base(position "" ssa1)); *) val test22a = tst' "test22a" (fn _ => (translate (fn _ => "") ssa2 = "" andalso translate (fn x => str x) ssa1 = "" andalso translate (fn x => str x) ssa2 = string ssa2)); val test22b = tst' "test22b" (fn _ => (translate (fn c => if c = #"b" then "XYZ " else str c) ssa2 = "aAXYZ AA")); val test23 = tst' "test23" (fn _ => (null(tokens isSpace ssa1) andalso null(tokens (Char.contains "Aab") ssa2) andalso map string (tokens (fn c => c = #"A") ssa2) = ["a","b"])); val test24 = tst' "test24" (fn _ => (map base (fields isSpace ssa1) = [base ssa1] andalso map base (fields (contains "Aab") ssa2) = [(sa,4,0),(sa,5,0),(sa,6,0),(sa,7,0),(sa,8,0),(sa,9,0)] andalso map string (fields (fn c => c = #"A") ssa2) = ["a","b","",""])); val test25 = tst' "test25" (fn _ => null(tokens (fn _ => true) ss3) andalso null(tokens (fn _ => false) (all "")) andalso null(tokens (contains " ()") (all "(()())(( ()")) andalso ["this","is","a","clear","text"] = map string (tokens (contains " ()") ss3)); local val v = ref 0 fun setv c = v := ord c; in val test26a = tst' "test26a" (fn _ => (v := 0; foldl (fn (x, _) => setv x) () ssa2; !v = 65)); val test26b = tst' "test26b" (fn _ => implode(foldl (op ::) [] ssa2) = "AAbAa"); val test27a = tst' "test27a" (fn _ => (v := 0; foldr (fn (x, _) => setv x) () ssa2; !v = 97)); val test27b = tst' "test27b" (fn _ => implode(foldr (op ::) [] ssa2) = "aAbAA"); val test28 = tst' "test28" (fn _ => (v := 0; app setv ssa2; !v = 65)); end val test29a = tst' "test29a" (fn _ => base2(splitAt(ssa1, 0)) = ((sa, 4, 0), (sa, 4, 0)) andalso base2(splitAt(ssa2, 0)) = ((sa, 4, 0), (sa, 4, 5)) andalso base2(splitAt(ssa2, 1)) = ((sa, 4, 1), (sa, 5, 4)) andalso base2(splitAt(ssa2, 4)) = ((sa, 4, 4), (sa, 8, 1)) andalso base2(splitAt(ssa2, 5)) = ((sa, 4, 5), (sa, 9, 0))); val test29b = tst0 "test29b" ((splitAt(ssa2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test29c = tst0 "test29c" ((splitAt(ssa2, 6) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30a = tst' "test30a" (fn _ => (s2, 10, 0) = base(substring(s2, 10, 0)) andalso (s2, 0, 0) = base(substring(s2, 0, 0)) andalso (s2, 4, 3) = base(substring(s2, 4, 3)) andalso (s2, 4, 6) = base(substring(s2, 4, 6)) andalso (s2, 0, 10) = base(substring(s2, 0, 10))); val test30b = tst0 "test30b" ((substring(s2, ~1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30c = tst0 "test30c" ((substring(s2, 11, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30d = tst0 "test30d" ((substring(s2, 0, 11) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30e = tst0 "test30e" ((substring(s2, 10, 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test30f = tst0 "test30f" ((case (Int.minInt, Int.maxInt) of (SOME min, SOME max) => ((substring("", max, max); "WRONG") handle Subscript => ((substring("", min, min); "WRONG") handle Subscript => "OK" | _ => "WRONG")) | _ => "OK") handle _ => "EXN") (* val sa = "AAAAaAbAABBBB"; *) val test31 = tst' "test31" (fn _ => isPrefix "" (substring(sa, 0, 0)) andalso isPrefix "" (substring(sa, 13, 0)) andalso isPrefix "" ssa1 andalso isPrefix "aAbAA" ssa2 andalso isPrefix "aAbA" ssa2 andalso not (isPrefix "aAbAAB" ssa2) andalso not (isPrefix "aAbAAB" ssa1)) fun eqspan(sus1, sus2, res) = base(span(sus1, sus2)) = base res val test32a = tst' "test32a" (fn _ => eqspan(substring(sa, 0, 0), substring(sa, 0, 13), all sa) andalso eqspan(substring(sa, 0, 13), substring(sa, 13, 0), all sa) andalso eqspan(substring(sa, 5, 0), substring(sa, 5, 0), substring(sa, 5,0)) andalso eqspan(substring(sa, 0, 5), substring(sa, 5, 8), all sa) andalso eqspan(substring(sa, 0, 13), substring(sa, 0, 13), all sa) andalso eqspan(substring(sa, 5, 4), substring(sa, 2, 4), substring(sa,5,1)) andalso eqspan(substring(sa, 2, 5), substring(sa, 6, 3), substring(sa, 2,7)) andalso eqspan(substring("abcd", 1, 0), substring("abcd", 1, 2), substring("abcd", 1, 2)) andalso eqspan(substring("", 0, 0), substring("", 0, 0), all "")) val test32b = tst0 "test32b" ((span(substring("a", 0, 0), substring("b", 0, 0)) seq "WRONG") handle Span => "OK" | _ => "WRONG") val test32c = tst0 "test32c" ((span(substring(sa, 1, 0), substring(sa, 0, 0)) seq "WRONG") handle Span => "OK" | _ => "WRONG") val test32d = tst0 "test32d" ((span(substring(sa, 3, 2), substring("abcd", 2, 1)) seq "WRONG") handle Span => "OK" | _ => "WRONG") val test32e = tst0 "test32e" ((span(substring("a", 0, 0), substring("b", 0, 0)) seq "WRONG") handle Span => "OK" | _ => "WRONG") end; mlton-20100608/regression/suspend.ok0000644000076600000240000000007711404435617015764 0ustar mtfstaffchild suspending parent sending int child got an int done done mlton-20100608/regression/suspend.sml0000644000076600000240000000067411404435620016143 0ustar mtfstaffopen Posix.Signal MLton.Signal Posix.Process val _ = case fork () of NONE => (setHandler (int, Handler.simple (fn () => print "child got an int\n")) ; print "child suspending\n" ; suspend Mask.none ; print "done\n") | SOME pid => (sleep (Time.fromSeconds 1) ; print "parent sending int\n" ; kill (K_PROC pid, int) ; wait () ; print "done\n") mlton-20100608/regression/tak.ok0000644000076600000240000000000211404435617015046 0ustar mtfstaff7 mlton-20100608/regression/tak.sml0000644000076600000240000000027611404435620015237 0ustar mtfstafffun tak(x,y,z) = if y >= x then z else tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y)) val _ = print(concat[Int.toString(tak(18,12,6)), "\n"]) mlton-20100608/regression/taut.sml0000644000076600000240000000042211404435617015434 0ustar mtfstaff(* a tautology checker *) datatype t = Base of bool | Fun of bool -> t val rec taut = fn Base b => b | Fun f => taut (f true) andalso taut (f false) val rec bigTrue = fn 0 => Base true | n => Fun (fn _ => bigTrue (n - 1)) val _ = taut (bigTrue 12) mlton-20100608/regression/test-create.ok0000644000076600000240000000024411404435621016512 0ustar mtfstaffcreate test: testing stdout... Hello world! [stdout] exit_status: W_EXITED testing exit... exit_status: W_EXITSTATUS 7 testing diverge... exit_status: W_SIGNALED 9 mlton-20100608/regression/test-create.sml0000644000076600000240000000350411404435617016703 0ustar mtfstafffun statusToString status = case status of Posix.Process.W_EXITED => "W_EXITED" | Posix.Process.W_EXITSTATUS w => concat ["W_EXITSTATUS ", Word8.toString w] | Posix.Process.W_SIGNALED s => concat ["W_SIGNALED ", SysWord.toString (Posix.Signal.toWord s)] | Posix.Process.W_STOPPED s => concat ["W_STOPPED ", SysWord.toString (Posix.Signal.toWord s)] val cmd = CommandLine.name () fun stdout () = TextIO.output (TextIO.stdOut, "Hello world! [stdout]\n") fun exit () = Posix.Process.exit 0wx7 fun diverge () = diverge () fun test () = let fun create arg = let val _ = TextIO.flushOut (TextIO.stdOut) val _ = TextIO.flushOut (TextIO.stdErr) in MLton.Process.create {path = cmd, args = [arg], env = NONE, stdin = MLton.Process.Param.self, stdout = MLton.Process.Param.self, stderr = MLton.Process.Param.self} end fun reap pid = MLton.Process.reap pid fun kill (pid, signal) = MLton.Process.kill (pid, signal) fun doTest (arg, withPid) = let val _ = print (concat ["testing ", arg, "...\n"]) val pid = create arg val () = withPid pid val status = reap pid val _ = print (concat ["exit_status: ", statusToString status, "\n"]) in () end fun doSimpleTest arg = doTest (arg, fn _ => ()) in print "create test:\n" ; doSimpleTest "stdout" ; doSimpleTest "exit" ; doTest ("diverge", fn pid => kill (pid, Posix.Signal.kill)) end val _ = case CommandLine.arguments () of [] => test () | ["stdout"] => stdout () | ["exit"] => exit () | ["diverge"] => diverge () | _ => raise Match mlton-20100608/regression/test-spawn.ok0000644000076600000240000000024311404435617016403 0ustar mtfstaffspawn test: testing stdout... Hello world! [stdout] exit_status: W_EXITED testing exit... exit_status: W_EXITSTATUS 7 testing diverge... exit_status: W_SIGNALED 9 mlton-20100608/regression/test-spawn.sml0000644000076600000240000000365111404435617016573 0ustar mtfstafffun statusToString status = case status of Posix.Process.W_EXITED => "W_EXITED" | Posix.Process.W_EXITSTATUS w => concat ["W_EXITSTATUS ", Word8.toString w] | Posix.Process.W_SIGNALED s => concat ["W_SIGNALED ", SysWord.toString (Posix.Signal.toWord s)] | Posix.Process.W_STOPPED s => concat ["W_STOPPED ", SysWord.toString (Posix.Signal.toWord s)] val cmd = CommandLine.name () fun stdout () = TextIO.output (TextIO.stdOut, "Hello world! [stdout]\n") fun exit () = Posix.Process.exit 0wx7 fun diverge () = diverge () fun test () = let fun spawn arg = let val _ = TextIO.flushOut (TextIO.stdOut) val _ = TextIO.flushOut (TextIO.stdErr) in MLton.Process.spawn {path = cmd, args = [cmd, arg]} end fun waitpid pid = let val (pid', status) = Posix.Process.waitpid (Posix.Process.W_CHILD pid, []) val () = if pid <> pid' then raise Fail "reap: pid <> pid'" else () in status end fun kill (pid, signal) = Posix.Process.kill (Posix.Process.K_PROC pid, signal) fun doTest (arg, withPid) = let val _ = print (concat ["testing ", arg, "...\n"]) val pid = spawn arg val () = withPid pid val status = waitpid pid val _ = print (concat ["exit_status: ", statusToString status, "\n"]) in () end fun doSimpleTest arg = doTest (arg, fn _ => ()) in print "spawn test:\n" ; doSimpleTest "stdout" ; doSimpleTest "exit" ; doTest ("diverge", fn pid => kill (pid, Posix.Signal.kill)) end val _ = case CommandLine.arguments () of [] => test () | ["stdout"] => stdout () | ["exit"] => exit () | ["diverge"] => diverge () | _ => raise Match mlton-20100608/regression/testdyn1.ok0000644000076600000240000000306611404435617016057 0ustar mtfstaffTesting list operations: [rev, @, map]... Ok - rev... Ok - map... Ok - @... Testing string operations: [implode, explode, chr, ord, size]... Ok - int_to_string... Ok - implode... Ok - explode... Ok - chr... Ok - ord... Ok - Chr... Ok - Chr2... Ok - size... Testing ref [ref, :=, !]... Ok - !1... Ok - :=1... Ok - !2... Ok - :=2... Ok - !3... Testing polymorphic equality... Ok - equal... Ok - equal2... Ok - equal3... Ok - equal4... Ok - equal5 (ref1)... Ok - equal5 (ref2)... Ok - equal6 (dat k)... Ok - equal7 (dat k)... Testing arithmetic integer operations: [~, abs, floor, +, -, *, div, mod, <, >, <=, >=] ... Ok - ~1... Ok - ~2... Ok - abs1... Ok - abs2... Ok - floor1... Ok - floor2... Ok - floor3... Ok - +... Ok - -... Ok - *... Ok - intdivmod - 2 mod 3 = 2, 2 div 3 = 0... Ok - intdivmod - 34 mod ~3 = ~2, 34 div ~3 = ~12... Ok - intdivmod - 5 mod ~2 = ~1, 5 div ~2 = ~3... Ok - intdivmod - ~7 mod 3 = 2, ~7 div 3 = ~3... Ok - Div1... Ok - Div2... Ok - <1... Ok - <2... Ok - <3... Ok - >1... Ok - >2... Ok - >3... Ok - <=1... Ok - <=2... Ok - <=3... Ok - >=1... Ok - >=2... Ok - >=3... Testing arithmetic real operations: [+, -, *, /, ~, abs, real, sqrt, <, >, <=, >=] ... Ok - +... Ok - -... Ok - *... Ok - /... Ok - ~1... Ok - ~2... Ok - abs1... Ok - abs2... Ok - real1... Ok - real2... Ok - sqrt1... Ok - sqrt2... Ok - sqrt3... Ok - <1... Ok - <2... Ok - <3... Ok - >1... Ok - >2... Ok - >3... Ok - <=1... Ok - <=2... Ok - <=3... Ok - >=1... Ok - >=2... Ok - >=3... Testing composition o: Ok - o... Testing generative exceptions: Ok - exn - generative... End of test. mlton-20100608/regression/testdyn1.sml0000644000076600000240000001504411404435620016232 0ustar mtfstaff(*testdyn1.sml*) (* ------------------------------------------------------------------- *) (* testdyn1, 08/02/1995 19:17, Martin *) (* Dynamic test of primitives... except for input/output *) (* ------------------------------------------------------------------- *) (* MEMO : 'sin', 'cos', 'arctan', 'ln' and 'exp' are not checked yet. *) infix == val epsilon = 0.000666 fun r1 == r2 = abs (r1 - r2) < epsilon (*no perfect world*) fun digit n = chr(ord #"0" + n) fun digits(n,acc) = if n >=0 andalso n<=9 then digit n:: acc else digits (n div 10, digit(n mod 10) :: acc) fun int_to_string(n) = if n >= 0 then implode(digits(n,[])) else "~" ^ int_to_string(~n) fun error b s = print ((if b then "Ok - " else "Error - ") ^ s ^ "...\n") (* testing stuff *) val _ = let val _ = print "Testing list operations:\n\ \ [rev, @, map]...\n" in error (rev [3,34,2,23] = [23,2,34,3]) "rev"; error (map (fn a:int => 2 * a) [3,34,2] = [6,68,4]) "map"; error ([34,56] @ [12,67] = [34,56,12,67]) "@" end val _ = let val _ = print "Testing string operations:\n\ \ [implode, explode, chr, ord, size]...\n" fun hds [] = #"-" | hds (x::_) = x in error (int_to_string 232 = "232") "int_to_string"; error (implode [#"h", #"e", #"l", #"l", #" "] = "hell ") "implode"; error (hds (explode "hello") = #"h") "explode"; error (chr 66 = #"B") "chr"; error (ord #"B" = 66) "ord"; error (((chr 1000) handle Chr => #"h") = #"h") "Chr"; error (((chr 1000) handle Div => #"h" | Chr => #"k") = #"k") "Chr2"; error (size "hello I'm 19 long.." = 19) "size" end val _ = let val _ = print "Testing ref [ref, :=, !]...\n" val a = ref "hello" val g = ref 45 in error (!a = "hello") "!1"; error ((a := "hej") = ()) ":=1"; error (!a = "hej") "!2"; error ((g := !g + 1) = ()) ":=2"; error (!g = 46) "!3" end val _ = let val _ = print "Testing polymorphic equality...\n" val a = [(34,"hejsa"), (4, "bw")] val b = [[3,23], [~34,23]] val c = (56, ref "hello") val d = ref "hej" datatype k = A of int * string | B | C of k * k val k1 = C (A(5,"hello"), B) val k2 = C (A(5,"hello2"), B) val k3 = C (A(5,"hello2"), B) in error (a = [(34,"hejsa"), (4, "bw")]) "equal"; error ((a = [(34,"hejsa"), (4, "cw")]) = false) "equal2"; error (b = [[3,23], [~34,23]]) "equal3"; error ((b = [[3,23], [~34,21]]) = false) "equal4"; error ((c = (56, ref "hello")) = false) "equal5 (ref1)"; error ((34,d) = (34,d)) "equal5 (ref2)"; error (k1 <> k2) "equal6 (dat k)"; error (k2 = k3) "equal7 (dat k)" end val _ = let val _ = print "Testing arithmetic integer operations:\n\ \ [~, abs, floor, +, -, *, div, mod, <, >, <=, >=] ...\n" fun checkdivmod (i, d) = let val (r, q) = (i mod d, i div d) val gt_zero = fn a => a > 0 in error (gt_zero r = gt_zero d andalso d * q + r = i) ("intdivmod - " ^ int_to_string i ^ " mod " ^ int_to_string d ^ " = " ^ int_to_string r ^ ", " ^ int_to_string i ^ " div " ^ int_to_string d ^ " = " ^ int_to_string q) end in error (~ 5 = ~5) "~1"; error (~ (~2) = 2) "~2"; error (abs 5 = 5) "abs1"; error (abs (~23) = 23) "abs2"; error (floor (23.23) = 23) "floor1"; error (floor (~23.23) = ~24) "floor2"; error (((floor (23.0E23)) handle Overflow => 4) = 4) "floor3"; error (23 + 12 = 35 andalso ~4 + 5 = 1) "+"; error (34 - 12 = 22 andalso ~23 - 15 = ~38) "-"; error (12 * 3 = 36 andalso ~23 * 2 = ~46) "*"; map checkdivmod [(2,3), (34, ~3), (5, ~2), (~7, 3)]; error (((3 div 0) handle Div => 60) = 60) "Div1"; error (((3 mod 0) handle Div => 45) = 45) "Div2"; error ((23 < 40) = true) "<1"; error ((54 < 40) = false) "<2"; error ((40 < 40) = false) "<3"; error ((23 > 40) = false) ">1"; error ((54 > 40) = true) ">2"; error ((40 > 40) = false) ">3"; error ((23 <= 40) = true) "<=1"; error ((54 <= 40) = false) "<=2"; error ((40 <= 40) = true) "<=3"; error ((23 >= 40) = false) ">=1"; error ((54 >= 40) = true) ">=2"; error ((40 >= 40) = true) ">=3" end val _ = let val _ = print "Testing arithmetic real operations:\n\ \ [+, -, *, /, ~, abs, real, sqrt, <, >, <=, >=] ...\n" in error (4.0 + 3.0 == 7.0) "+"; error (4.0 - 1.0 == 3.0) "-"; error (4.0 * 3.0 == 12.0) "*"; error (9.0 / 2.0 == 4.5) "/"; error (~ 5.3 == ~5.3) "~1"; error (~ (~2.23) == 2.23) "~2"; error (abs 5.23 == 5.23) "abs1"; error (abs (~23.12) == 23.12) "abs2"; error (real 5 == 5.0) "real1"; error (real ~5 == ~5.0) "real2"; error (Math.sqrt 0.0 == 0.0) "sqrt1"; error (Math.sqrt 2.0 > 1.4) "sqrt2"; error (Math.sqrt 2.0 < 1.5) "sqrt3"; error ((23.34 < 40.23) = true) "<1"; error ((54.12 < 40.45) = false) "<2"; error ((40.12 < 40.12) = false) "<3"; error ((23.34 > 40.12) = false) ">1"; error ((54.45 > 40.23) = true) ">2"; error ((40.23 > 40.23) = false) ">3"; error ((23.12 <= 40.34) = true) "<=1"; error ((54.23 <= 40.23) = false) "<=2"; error ((40.23 <= 40.23) = true) "<=3"; error ((23.75 >= 40.75) = false) ">=1"; error ((54.57 >= 40.57) = true) ">=2"; error ((40.23 >= 40.23) = true) ">=3" end val _ = let val _ = print "Testing composition o:\n" fun f x = 3 + x fun g y = (y, 2*y) in error ((g o f) 7 = (10,20)) "o" end val _ = let val _ = print "Testing generative exceptions:\n" fun g a = let fun f x = let exception E in if x < 1 then raise E else ((f (x-1)) handle E => 7) (* should not handle this.. *) end in (f a) handle _ => a end (* a *) in error (g 10 = 10) "exn - generative" end fun etst b s = if b then () else print ("Error - " ^ s ^ "...\n"); val _ = etst ("\u0041\u000a\\u0041\n" = "A\n\092" ^ "u0041\010") "backslash u does not work or somepin"; val _ = etst (map ord [#"a", #"A", #" ", chr 42, #"\117"] = [97, 65, 32, 42, 117]) "char problem, maybe #" val _ = print "End of test.\n" mlton-20100608/regression/testdyn2.ok0000644000076600000240000000016011404435617016050 0ustar mtfstaffTesting [open_out, output, close_out] Testing [open_in, input, lookahead, end_of_stream, close_in] End of test. mlton-20100608/regression/testMatrix.ok0000644000076600000240000000005411404435620016434 0ustar mtfstaff{x = 1, y = 2, z = 3} {x = 3, y = 5, z = 7} mlton-20100608/regression/testMatrix.sml0000644000076600000240000000225111404435617016625 0ustar mtfstaff exception Error fun translateXYZ (translateX : real, translateY : real, translateZ : real) = ((1.0, 0.0, 0.0, translateX), (0.0, 1.0, 0.0, translateY), (0.0, 0.0, 1.0, translateZ), (0.0, 0.0, 0.0, 1.0)) fun transformPoint matr {x, y, z} = let val ((in00, in01, in02, in03), (in10, in11, in12, in13), (in20, in21, in22, in23), (in30, in31, in32, in33)) = matr val w = x * in30 + y * in31 + z * in32 + in33 in if Real.== (0.0, w) then raise Error else {x = ((in00 * x) + (in01 * y) + (in02 * z) + in03) / w, y = ((in10 * x) + (in11 * y) + (in12 * z) + in13) / w, z = ((in20 * x) + (in21 * y) + (in22 * z) + in23) / w} end fun Point3DToString {x, y, z} = "{x = " ^ (Real.toString x) ^ ", y = " ^ (Real.toString y) ^ ", z = " ^ (Real.toString z) ^ "}\n" val m = translateXYZ (2.0, 3.0, 4.0) val p = {x = 1.0, y = 2.0, z = 3.0} val _ = print (Point3DToString p) val p' = transformPoint m p val _ = print (Point3DToString p') mlton-20100608/regression/textio.2.ok0000644000076600000240000000023711404435620015747 0ustar mtfstaffbasic test of writing and reading back all characters done test of writing files of all possible characters in strings of lengths 0-256 finished test finished mlton-20100608/regression/textio.2.sml0000644000076600000240000000300411404435617016132 0ustar mtfstaff(* Notice: This test will not be passed on platforms like Win32! (due to behind-the-scenes CR/LF <=> LF conversions). *) val filename = OS.FileSys.tmpName () fun testRange (start, length) = let val allChars = CharVector.tabulate(length, fn i => chr ((i + start) mod 256)) val outStr = TextIO.openOut filename val _ = TextIO.output (outStr, allChars) val _ = TextIO.closeOut outStr val inStr = TextIO.openIn filename val readChars = TextIO.inputAll inStr val _ = TextIO.closeIn inStr val _ = OS.FileSys.remove filename fun testCharF (c, cnt) = let val readC = CharVector.sub(readChars, cnt) val _ = if c = readC then () else print ("Error at index: " ^ (Int.toString cnt) ^ ": " ^ (Char.toString c) ^ " <> " ^ (Char.toString readC) ^ "\n") in cnt + 1 end val _ = CharVector.foldl testCharF 0 allChars in () end val _ = testRange (0, 256) val _ = print "basic test of writing and reading back all characters done\n" val _ = List.tabulate(256, fn i => List.tabulate(257, fn i2 => testRange (i, i2))) val _ = print "test of writing files of all possible characters in strings of lengths 0-256 finished\n" val _ = List.tabulate(6, fn i => List.tabulate(5000, fn i2 => testRange (i, i2))) val _ = print "test finished\n" mlton-20100608/regression/textio.ok0000644000076600000240000000107311404435617015614 0ustar mtfstaffTesting TextIO... test1 OK test2 OK test3 OK test4 OK test5 OK test6 OK Two lines of output follow: 1234 <--- this should read 1234 12345 <--- this should read 12345 test7a OK test7b OK test7c OK test8a OK test8b OK test8c OK test8d OK test8e OK test8f OK test9a OK test9b OK test9c OK test9d OK test9e OK test10 OK test11 OK test12a OK test12b OK test12c OK test12d OK Two lines of output follow: abcde <--- this should read abcde abcde <--- this should read abcde mlton-20100608/regression/textio.sml0000644000076600000240000002332111404435617015776 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/textio.sml PS 1995-11-22, 1996-04-18 *) (*KILL 05/11/1997 11:03. tho.: use "auxil.sml"; *) val _ = print "Testing TextIO...\n"; local open TextIO fun fileSize s = let val is = openIn s in size (inputAll is) before closeIn is end; fun dup 0 s = s | dup n s = dup (n-1) (s^s) val longstring = dup 5 "abcdefg" (* was 16 but because `limit stack` = 8192 kbytes on frigg * I received a SIGSEGV for stack growth failure. *) in val empty = openOut "empty.dat"; val small = openOut "small1.dat"; val medium = openOut "medium.dat"; val text = openOut "text.dat"; val test1 = tst' "test1" (fn _ => (closeOut empty; fileSize "empty.dat" = 0 andalso fileSize "empty.dat" = 0)); val test2 = tst' "test2" (fn _ => (output1(small, #"+"); closeOut small; fileSize "small1.dat" = 1 andalso fileSize "small1.dat" = 1)); val test3 = tst' "test3" (fn _ => let val small = openOut "small2.dat" in output(small, "*"); closeOut small; fileSize "small2.dat" = 1 andalso fileSize "small2.dat" = 1 end); val test4 = tst' "test4" (fn _ => (output(medium, longstring); closeOut medium; fileSize "medium.dat" = size longstring andalso fileSize "medium.dat" = size longstring)) val test5 = tst' "test5" (fn _ => let val small = openAppend "small2.dat" in output(small, "1"); closeOut small; fileSize "small2.dat" = 2 andalso fileSize "small2.dat" = 2 end); val test6 = tst' "test6" (fn _ => (output(text, "Line 1\n"); output(text, "Line 2\n"); output(text, "Line 3"); closeOut text; fileSize "text.dat" = 20 andalso fileSize "text.dat" = 20)); (* Test that stdErr is flushed immediately, that flushOut works, and * that print flushes stdOut. Assumes that stdOut is *not* flushed * immediately: *) val _ = let fun stdo s = output(stdOut, s) fun stde s = output(stdErr, s) in print "Two lines of output follow:\n"; stdo "3"; stde "1"; stdo "4"; stde "2"; flushOut stdOut; stde " <--- this should read 1234\n"; stdo "2"; stde "1"; print "3"; stde "4"; stdo "5"; flushOut stdOut; stde " <--- this should read 12345\n" end; val test7a = tst' "test7a" (fn _ => let val is = openIn "empty.dat" in (endOfStream is andalso input1 is = NONE andalso endOfStream is andalso input1 is = NONE) before closeIn is end); val test7b = tst' "test7b" (fn _ => let val is = openIn "small1.dat" in (not (endOfStream is) andalso input1 is = SOME #"+" andalso endOfStream is andalso input1 is = NONE andalso input1 is = NONE) before closeIn is end); val test7c = tst' "test7c" (fn _ => let val is = openIn "small2.dat" in (not (endOfStream is) andalso input1 is = SOME #"*" andalso not (endOfStream is) andalso input1 is = SOME #"1" andalso endOfStream is andalso input1 is = NONE andalso input1 is = NONE) before closeIn is end); val test8a = tst' "test8a" (fn _ => let val is = openIn "empty.dat" in (inputN(is, 0) = "" andalso inputN(is, 1) = "" andalso inputN(is, 100) = "" andalso endOfStream is) before closeIn is end); val test8b = tst' "test8b" (fn _ => let val is = openIn "small1.dat" in (inputN(is, 0) = "" andalso inputN(is, 1) = "+" andalso inputN(is, 100) = "") before closeIn is end); val test8c = tst' "test8c" (fn _ => let val is = openIn "small1.dat" in (inputN(is, 0) = "" andalso inputN(is, 100) = "+" andalso inputN(is, 100) = "") before closeIn is end); val test8d = tst' "test8d" (fn _ => let val is = openIn "small2.dat" in (inputN(is, 0) = "" andalso inputN(is, 1) = "*" andalso inputN(is, 100) = "1" andalso inputN(is, 100) = "") before closeIn is end); val test8e = tst' "test8e" (fn _ => let val is = openIn "medium.dat" in (inputN(is, 0) = "" andalso inputN(is, 15) = "abcdefgabcdefga" andalso inputN(is, 15) = "bcdefgabcdefgab" andalso inputN(is, 0) = "" andalso not (endOfStream is)) before closeIn is end); val test8f = tst' "test8f" (fn _ => let val is = openIn "medium.dat" in (inputN(is, 500000) = longstring andalso inputN(is, 100) = "" andalso endOfStream is) before closeIn is end); val test9a = tst' "test9a" (fn _ => let val is = openIn "empty.dat" in (lookahead is = NONE andalso input is = "" andalso lookahead is = NONE andalso input is = "") before closeIn is end); val test9b = tst' "test9b" (fn _ => let val is = openIn "small1.dat" in (lookahead is = SOME #"+" andalso input is = "+" andalso input is = "" andalso lookahead is = NONE) before closeIn is end); val test9c = tst' "test9c" (fn _ => let val is = openIn "small2.dat" in (lookahead is = SOME #"*" andalso input is = "*1" andalso input is = "" andalso lookahead is = NONE) before closeIn is end); val test9d = tst' "test9d" (fn _ => let val is = openIn "small2.dat" in (input is = "*1" andalso input is = "") before closeIn is end); val test9e = tst' "test9e" (fn _ => let val is = openIn "medium.dat" in lookahead is = SOME #"a" andalso String.substring(input is, 0, 15) = "abcdefgabcdefga" before closeIn is end); val test10 = tst' "test10" (fn _ => let val is = openIn "medium.dat" in (lookahead is = SOME #"a" andalso input1 is = SOME #"a" andalso lookahead is = SOME #"b" andalso input1 is = SOME #"b" andalso lookahead is = SOME #"c") before closeIn is end); val test11 = tst' "test11" (fn _ => let val is = openIn "medium.dat" in (lookahead is = SOME #"a" andalso inputN(is, 5) = "abcde" andalso lookahead is = SOME #"f" andalso inputN(is, 4) = "fgab" andalso lookahead is = SOME #"c") before closeIn is end); val test12a = tst' "test12a" (fn _ => let val is = openIn "empty.dat" in (inputLine is = NONE andalso inputLine is = NONE) before closeIn is end); val test12b = tst' "test12b" (fn _ => let val is = openIn "small1.dat" in (inputLine is = SOME "+\n" andalso inputLine is = NONE) before closeIn is end); val test12c = tst' "test12c" (fn _ => let val is = openIn "text.dat" in (inputLine is = SOME "Line 1\n" andalso inputLine is = SOME "Line 2\n" andalso inputLine is = SOME "Line 3\n" andalso inputLine is = NONE) before closeIn is end); val test12d = tst' "test12d" (fn _ => let val is = openIn "medium.dat" in (inputLine is = SOME (longstring ^ "\n") andalso inputLine is = NONE) before closeIn is end); (* Test that outputSubstr works *) val _ = let fun stdo s i n = outputSubstr(stdOut, Substring.substring(s, i, n)) fun stde s = output(stdErr, s) val abcde = "abcde" in print "Two lines of output follow:\n"; stdo abcde 0 1; stdo abcde 1 3; stdo "" 0 0; stdo abcde 0 0; stdo abcde 5 0; stdo abcde 3 0; stdo abcde 4 1; flushOut stdOut; stde " <--- this should read abcde\n"; stdo abcde 0 5; flushOut stdOut; stde " <--- this should read abcde\n" end; end mlton-20100608/regression/thread-switch-share.ok0000644000076600000240000000005111404435617020141 0ustar mtfstaffsize1 >= size2 = true sum1 = sum2 = true mlton-20100608/regression/thread-switch-share.sml0000644000076600000240000000176611404435621020334 0ustar mtfstaff(* Access the current stack in the heap via a MLton.share object trace. *) val rt : MLton.Thread.Runnable.t option ref = ref NONE fun stats () = let val () = MLton.share rt in () end fun switcheroo () = MLton.Thread.switch (fn t => let val () = rt := SOME (MLton.Thread.prepare (t, ())) val () = stats () in valOf (!rt) end) (* tuple option array *) val a = Array.tabulate (100, fn i => SOME (i mod 2, i mod 3)) val () = Array.update (a, 0, NONE) fun touch () = let val size = MLton.size a val sum = Array.foldr (fn (NONE,sum) => sum | (SOME (a, b),sum) => a + b + sum) 0 a in (size, sum) end val (size1,sum1) = touch () val () = switcheroo () val (size2,sum2) = touch () val _ = print (concat ["size1 >= size2 = ", Bool.toString (size1 >= size2), "\n"]) val _ = print (concat ["sum1 = sum2 = ", Bool.toString (sum1 >= sum2), "\n"]) mlton-20100608/regression/thread-switch-size.ok0000644000076600000240000000001711404435617020013 0ustar mtfstaff!rs > 0 = true mlton-20100608/regression/thread-switch-size.sml0000644000076600000240000000104111404435617020173 0ustar mtfstaff(* Access the current stack in the heap via a MLton.size object trace. *) val rt : MLton.Thread.Runnable.t option ref = ref NONE val rs : int ref = ref 0 fun stats () = let val () = rs := MLton.size rt in () end fun switcheroo () = MLton.Thread.switch (fn t => let val () = rt := SOME (MLton.Thread.prepare (t, ())) val () = stats () in valOf (!rt) end) val () = switcheroo () val _ = print (concat ["!rs > 0 = ", Bool.toString (!rs > 0), "\n"]) mlton-20100608/regression/thread-switch.ok0000644000076600000240000000000311404435621017031 0ustar mtfstaffok mlton-20100608/regression/thread-switch.sml0000644000076600000240000000166411404435617017236 0ustar mtfstaff(* * On my 400MhZ system, thread-switch 10000000 takes 4.98s, which comes out to * 2,008,032 switches per second. *) structure Main = struct type int = Int.int open MLton open Thread datatype t = T of (int * t) Thread.t val done: Thread.Runnable.t option ref = ref NONE fun loop (n: int, T t): unit = if n = 0 then switch (fn _ => valOf (!done)) else let val (n, t) = switch (fn t' => prepare (t, (n - 1, T t'))) in loop(n, t) end fun main () = let val numSwitches = case CommandLine.arguments () of [] => 1000 | s :: _ => valOf (Int.fromString s) in switch (fn cur => (done := SOME (prepare (cur, ())) ; prepare (new loop, (numSwitches, T (new loop))))) ; print "ok\n" end end val _ = Main.main () (* SMLofNJ.exportFn * ("thread-switch", fn _ => (Main.main(); OS.Process.success)) *) mlton-20100608/regression/thread0.ok0000644000076600000240000000006011404435621015615 0ustar mtfstaff1 succeeded 2 succeeded 3 succeeded 4 succeeded mlton-20100608/regression/thread0.sml0000644000076600000240000000133511404435620016004 0ustar mtfstaffopen MLton.Thread val _ = if 13 = 1 + switch(fn t => prepare (t, 12)) then print "1 succeeded\n" else () val _ = if 13 = 1 + switch(fn t => prepare (new(fn () => switch(fn _ => prepare (t, 12))), ())) then print "2 succeeded\n" else () val _ = if 13 = switch(fn t => prepare (prepend(t, fn n => n + 1), 12)) then print "3 succeeded\n" else () val _ = if 13 = switch(fn t => prepare (new(fn () => let val t = prepend(t, fn n => n + 1) in switch(fn _ => prepare (t, 12)) end), ())) then print "4 succeeded\n" else () mlton-20100608/regression/thread1.ok0000644000076600000240000000007511404435617015631 0ustar mtfstaff10 8 6 4 2 9 7 5 3 1 8 6 4 2 7 5 3 1 6 4 2 5 3 1 4 2 3 1 2 1 mlton-20100608/regression/thread1.sml0000644000076600000240000000425611404435621016013 0ustar mtfstaffstructure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new() = T{front = ref [], back = ref []} fun enque(T{back, ...}, x) = back := x :: !back fun deque(T{front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit end = struct open MLton open Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new() in fun ready (t: Thread.Runnable.t) : unit = Queue.enque(threads, t) fun next () : Thread.Runnable.t = case Queue.deque threads of NONE => valOf(!topLevel) | SOME t => t end fun 'a exit(): 'a = switch(fn _ => next()) fun new(f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f() handle _ => exit()) ; exit())), ()) fun schedule t = (ready t; next()) fun yield(): unit = switch(fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun run(): unit = (switch(fn t => (topLevel := SOME (Thread.prepare (t, ())) ; next())) ; topLevel := NONE) end val rec loop = fn 0 => () | n => (print(concat[Int.toString n, "\n"]) ; Thread.yield() ; loop(n - 1)) val rec loop' = fn 0 => () | n => (Thread.spawn(fn () => loop n); loop'(n - 2)) val _ = Thread.spawn(fn () => loop' 10) val _ = Thread.run() mlton-20100608/regression/thread2.ok0000644000076600000240000000001011404435617015617 0ustar mtfstaffsuccess mlton-20100608/regression/thread2.sml0000644000076600000240000000501411404435617016012 0ustar mtfstaffstructure Queue: sig type 'a t val new: unit -> 'a t val enque: 'a t * 'a -> unit val deque: 'a t -> 'a option end = struct datatype 'a t = T of {front: 'a list ref, back: 'a list ref} fun new () = T {front = ref [], back = ref []} fun enque (T {back, ...}, x) = back := x :: !back fun deque (T {front, back}) = case !front of [] => (case !back of [] => NONE | l => let val l = rev l in case l of [] => raise Fail "deque" | x :: l => (back := []; front := l; SOME x) end) | x :: l => (front := l; SOME x) end structure Thread: sig val exit: unit -> 'a val run: unit -> unit val spawn: (unit -> unit) -> unit val yield: unit -> unit end = struct open Posix.Signal open MLton open Itimer Signal Thread val topLevel: Thread.Runnable.t option ref = ref NONE local val threads: Thread.Runnable.t Queue.t = Queue.new () in fun ready t = Queue.enque (threads, t) fun next () = case Queue.deque threads of NONE => valOf (!topLevel) | SOME t => t end fun 'a exit (): 'a = switch (fn _ => next ()) fun new (f: unit -> unit): Thread.Runnable.t = Thread.prepare (Thread.new (fn () => ((f () handle _ => exit ()) ; exit ())), ()) fun schedule t = (ready t; next ()) fun yield (): unit = switch (fn t => schedule (Thread.prepare (t, ()))) val spawn = ready o new fun setItimer t = Itimer.set (Itimer.Real, {value = t, interval = t}) fun run (): unit = (switch (fn t => (topLevel := SOME (Thread.prepare (t, ())) ; new (fn () => (setHandler (alrm, Handler.handler schedule) ; setItimer (Time.fromMilliseconds 20))))) ; setItimer Time.zeroTime ; ignore alrm ; topLevel := NONE) end val rec delay = fn 0 => () | n => delay (n - 1) val rec loop = fn 0 => () | n => (delay 500000; loop (n - 1)) val rec loop' = fn 0 => () | n => (Thread.spawn (fn () => loop n); loop' (n - 1)) val _ = Thread.spawn (fn () => loop' 10) val _ = Thread.run () val _ = print "success\n" mlton-20100608/regression/time.ok0000644000076600000240000000067611404435617015246 0ustar mtfstaff File time.sml: Testing structure Time... test1 OK test2a OK test2b OK test2c OK test2d OK test2e OK test3a OK test3b OK test3c OK test4a OK test6a OK test7a OK test8a OK test9a OK test9b OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10a OK test10b OK test10b OK test10b OK mlton-20100608/regression/time.sml0000644000076600000240000000732511404435617015426 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/time.sml PS 1995-03-23 *) val _ = print "\nFile time.sml: Testing structure Time...\n" local fun fib n = if n<2 then 1 else fib(n-1) + fib(n-2); open Time val bigt = fromSeconds 987654321 + fromMicroseconds 500012; val litt = fromSeconds 454 + fromMicroseconds 501701 val test1 = tst' "test1" (fn _ => zeroTime + bigt = bigt andalso bigt - zeroTime = bigt); val test2a = tst' "test2a" (fn _ => toSeconds zeroTime = 0 andalso zeroTime = fromSeconds 0 andalso zeroTime = fromMilliseconds 0 andalso zeroTime = fromMicroseconds 0); val test2b = tst' "test2b" (fn _ => toSeconds bigt = 987654321 andalso toSeconds litt = 454 andalso toMilliseconds litt = 454501 andalso toMicroseconds litt = 454501701); val test2c = tst0 "test2c" ((fromSeconds ~1 seq "OK") handle _ => "WRONG") val test2d = tst0 "test2d" ((fromMilliseconds ~1 seq "OK") handle _ => "WRONG") val test2e = tst0 "test2e" ((fromMicroseconds ~1 seq "OK") handle _ => "WRONG") val test3a = tst' "test3a" (fn _ => fromReal 0.0 = zeroTime andalso fromReal 10.25 = fromSeconds 10 + fromMilliseconds 250); val test3b = tst0 "test3b" ((fromReal ~1.0 seq "OK") handle _ => "WRONG") val test3c = tst0 "test3c" ((fromReal 1E300 seq "OK") handle Time => "OK" | _ => "WRONG") val test4a = tst' "test4a" (fn _ => Real.==(toReal (fromReal 100.25), 100.25)); val test6a = tst' "test6a" (fn _ => bigt + litt = litt + bigt andalso (bigt + litt) - litt = bigt andalso (bigt - litt) + litt = bigt); val test7a = tst' "test7a" (fn _ => litt <= litt andalso litt >= litt andalso zeroTime < litt andalso litt > zeroTime andalso litt < bigt andalso bigt > litt andalso not (litt > bigt) andalso not (bigt < litt) andalso not(litt < litt) andalso not(litt > litt)); val test8a = tst' "test8a" (fn _ => now() <= now() andalso (now () before fib 27 seq ()) <= now()); val test9a = tst' "test9a" (fn _ => fmt 0 litt = "455") val test9b = tst' "test9b" (fn _ => fmt 1 litt = "454.5" andalso fmt 2 litt = "454.50" andalso fmt 3 litt = "454.502" andalso fmt 4 litt = "454.5017" andalso fmt 5 litt = "454.50170" andalso fmt 6 litt = "454.501701"); fun chk (s, r) = tst' "test10a" (fn _ => case fromString s of SOME res => res = fromMicroseconds r | NONE => false) val test10a = List.map chk [("189", 189000000), ("189.1", 189100000), ("189.125125", 189125125), (".1", 100000), (".125125", 125125), (" \n\t189crap", 189000000), (" \n\t189.1crap", 189100000), (" \n\t189.125125crap", 189125125), (" \n\t.1crap", 100000), (" \n\t.125125crap", 125125)]; val test10b = List.app (fn s => tst0 "test10b" (case fromString s of NONE => "OK" | _ => "WRONG")) ["", "now", "Monday"]; in end mlton-20100608/regression/time2.ok0000644000076600000240000000001411404435617015312 0ustar mtfstaffOK OK OK OK mlton-20100608/regression/time2.sml0000644000076600000240000000074611404435617015510 0ustar mtfstaffopen Time val _ = if 1000000000000 = toMilliseconds (fromSeconds 1000000000) then print "OK\n" else print "ERROR\n" val _ = if 1000000000000 = toMicroseconds (fromSeconds 1000000) then print "OK\n" else print "ERROR\n" val _ = if 1000000000 = toSeconds (fromMilliseconds 1000000000000) then print "OK\n" else print "ERROR\n" val _ = if 1000000000 = toSeconds (fromMicroseconds 1000000000000000) then print "OK\n" else print "ERROR\n" mlton-20100608/regression/time3.ok0000644000076600000240000000016111404435617015316 0ustar mtfstaff0.000 123.457 123 123.5 123.46 123.457 123.4568 123.45679 123.456789 123.4567890 123.457 123.000 123.456 123.457 mlton-20100608/regression/time3.sml0000644000076600000240000000055211404435617015504 0ustar mtfstaffopen Time fun pt t = (print(toString t) ; print "\n") val messy = fromReal 123.456789 val _ = (pt zeroTime; pt messy; app (fn d => (print(fmt d messy) ; print "\n")) [0,1,2,3,4,5,6,7]; pt(fromReal 123.456789); pt(fromSeconds 123); pt(fromMilliseconds 123456); pt(fromMicroseconds 123456789) ) mlton-20100608/regression/time4.ok0000644000076600000240000000006411404435620015313 0ustar mtfstaff0.417 0.999 0.417 0.999 ~0.417 ~0.999 ~0.417 ~0.999 mlton-20100608/regression/time4.sml0000644000076600000240000000131011404435617015476 0ustar mtfstaff val t = valOf (Time.fromString "0.417") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "0.999") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString ".417") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString ".999") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "~0.417") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "~0.999") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "~.417") val () = print (concat [Time.toString t, "\n"]) val t = valOf (Time.fromString "~.999") val () = print (concat [Time.toString t, "\n"]) mlton-20100608/regression/timeout.ok0000644000076600000240000000001011404435620015746 0ustar mtfstaffsuccess mlton-20100608/regression/timeout.sml0000644000076600000240000000216511404435620016145 0ustar mtfstaffopen MLton MLton.Signal fun timeLimit (t: Time.time, f: unit -> 'a): 'a option = let val which = Itimer.Real val signal = Itimer.signal which val res = Thread.switch (fn cur: 'a option Thread.t => let val _ = setHandler (signal, Handler.handler (fn _ => Thread.prepare (cur, NONE))) val _ = Itimer.set (which, {value = t, interval = Time.zeroTime}) val t = Thread.new (fn () => let val res = SOME (f ()) handle _ => NONE in Thread.switch (fn _ => Thread.prepare (cur, res)) end) in Thread.prepare (t, ()) end) val _ = setHandler (signal, Handler.default) in res end val _ = case timeLimit (Time.fromSeconds 10, let fun loop () = loop () in loop end) of NONE => print "success\n" | SOME _ => print "failure\n" mlton-20100608/regression/timer.ok0000644000076600000240000000014011404435617015412 0ustar mtfstaff File timer.sml: Testing structure Timer... test1 OK test2 OK test3 OK test4 OK mlton-20100608/regression/tststrcmp.ok0000644000076600000240000004700011404435617016343 0ustar mtfstaff1 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok 10 ok 11 ok 12 ok 13 ok 14 ok 15 ok 16 ok 17 ok 18 ok 19 ok 20 ok 21 ok 22 ok 23 ok 24 ok 25 ok 26 ok 27 ok 28 ok 29 ok 30 ok 31 ok 32 ok 33 ok 34 ok 35 ok 36 ok 37 ok 38 ok 39 ok 40 ok 41 ok 42 ok 43 ok 44 ok 45 ok 46 ok 47 ok 48 ok 49 ok 50 ok 51 ok 52 ok 53 ok 54 ok 55 ok 56 ok 57 ok 58 ok 59 ok 60 ok 61 ok 62 ok 63 ok 64 ok 65 ok 66 ok 67 ok 68 ok 69 ok 70 ok 71 ok 72 ok 73 ok 74 ok 75 ok 76 ok 77 ok 78 ok 79 ok 80 ok 81 ok 82 ok 83 ok 84 ok 85 ok 86 ok 87 ok 88 ok 89 ok 90 ok 91 ok 92 ok 93 ok 94 ok 95 ok 96 ok Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. Der laa den Ridder i Graesset og drev. Hejsa, nu sadler vi af. Der laa hans Harnisk, hans Skjold og Vaerge, Hans Tanker de floej over alle Bjerge. De floej paa Skyer gennem Luften den blaa --- Den Rejse man bruger ej Vaaben paa. Den Ridder han laa, hvor han steded sig foerst Han kendte ej Sult, han kendte ej Toerst Og Solen kom og Stedet og gik; Han lytted som efter en sagte Musik. mlton-20100608/regression/tststrcmp.sml0000644000076600000240000001441311404435617016527 0ustar mtfstaff(*tststrcmp.sml 27/06/1997 17:21. tho.*) (*test <, etc. on strings*) fun pr s = print s; fun prl s = pr (s ^ "\n"); local fun string' 0 = "0" | string' 1 = "1" | string' 2 = "2" | string' 3 = "3" | string' 4 = "4" | string' 5 = "5" | string' 6 = "6" | string' 7 = "7" | string' 8 = "8" | string' 9 = "9" | string' n = string' (n div 10) ^ string' (n mod 10) in fun int_to_string n = if n < 0 then "~" ^ string' (~n) else string' n end local val r = ref 0 in fun etst s e1 e2 = prl (int_to_string (r := !r + 1; !r) ^ (if e1 = e2 then " ok" else " * n o t o k ! *")) end val () = etst "1" ("" < "abc") true; (*den ene tom*) val () = etst "2" ("" > "abc") false; val () = etst "2" ("" >= "abc") false; val () = etst "2" ("" <= "abc") true; val () = etst "2" ("" = "abc") false; val () = etst "2" ("" <> "abc") true; val () = etst "3" ("abc" < "") false; (*den anden tom*) val () = etst "4" ("abc" > "") true; val () = etst "4" ("abc" >= "") true; val () = etst "4" ("abc" <= "") false; val () = etst "4" ("abc" = "") false; val () = etst "4" ("abc" <> "") true; val () = etst "5" ("abc" < "abc") false; (*ens*) val () = etst "6" ("abc" > "abc") false; val () = etst "6" ("abc" >= "abc") true; val () = etst "6" ("abc" <= "abc") true; val () = etst "6" ("abc" = "abc") true; val () = etst "6" ("abc" <> "abc") false; val () = etst "5" ("" < "") false; (*begge tomme*) val () = etst "6" ("" > "") false; val () = etst "6" ("" >= "") true; val () = etst "6" ("" <= "") true; val () = etst "6" ("" = "") true; val () = etst "6" ("" <> "") false; val () = etst "7" ("abc" < "abcd") true; (*den ene lngere*) val () = etst "8" ("abc" > "abcd") false; val () = etst "8" ("abc" >= "abcd") false; val () = etst "8" ("abc" <= "abcd") true; val () = etst "8" ("abc" = "abcd") false; val () = etst "8" ("abc" <> "abcd") true; val () = etst "-" ("abcd" < "abc") false; (*den anden lngere*) val () = etst "-" ("abcd" > "abc") true; val () = etst "-" ("abcd" >= "abc") true; val () = etst "-" ("abcd" <= "abc") false; val () = etst "-" ("abcd" = "abc") false; val () = etst "-" ("abcd" <> "abc") true; val () = etst "-" ("abc" < "abd") true; (*lige lange, sidste strst*) val () = etst "-" ("abc" > "abd") false; val () = etst "-" ("abc" >= "abd") false; val () = etst "-" ("abc" <= "abd") true; val () = etst "-" ("abc" = "abd") false; val () = etst "-" ("abc" <> "abd") true; val () = etst "-" ("abd" < "abc") false; (*lige lange, frste strst*) val () = etst "-" ("abd" > "abc") true; val () = etst "-" ("abd" >= "abc") true; val () = etst "-" ("abd" <= "abc") false; val () = etst "-" ("abd" = "abc") false; val () = etst "-" ("abd" <> "abc") true; (*& nu hele molevitten igen bare med meget lange strenge. Det er godt nok strenge...*) fun repeat 0 s = "" | repeat n s = s ^ repeat (n-1) s val long = repeat 50 "Der laa den Ridder i Graesset og drev.\n\ \Hejsa, nu sadler vi af.\n\ \Der laa hans Harnisk, hans Skjold og Vaerge,\n\ \Hans Tanker de floej over alle Bjerge.\n\ \De floej paa Skyer gennem Luften den blaa ---\n\ \Den Rejse man bruger ej Vaaben paa.\n\ \\n\ \Den Ridder han laa, hvor han steded sig foerst\n\ \Han kendte ej Sult, han kendte ej Toerst\n\ \Og Solen kom og Stedet og gik;\n\ \Han lytted som efter en sagte Musik.\n\ \\n\ \\n" val () = etst "1" (long ^ "" < long ^ "abc") true; (*den ene tom*) val () = etst "2" (long ^ "" > long ^ "abc") false; val () = etst "2" (long ^ "" >= long ^ "abc") false; val () = etst "2" (long ^ "" <= long ^ "abc") true; val () = etst "2" (long ^ "" = long ^ "abc") false; val () = etst "2" (long ^ "" <> long ^ "abc") true; val () = etst "3" (long ^ "abc" < long ^ "") false; (*den anden tom*) val () = etst "4" (long ^ "abc" > long ^ "") true; val () = etst "4" (long ^ "abc" >= long ^ "") true; val () = etst "4" (long ^ "abc" <= long ^ "") false; val () = etst "4" (long ^ "abc" = long ^ "") false; val () = etst "4" (long ^ "abc" <> long ^ "") true; val () = etst "5" (long ^ "abc" < long ^ "abc") false; (*ens*) val () = etst "6" (long ^ "abc" > long ^ "abc") false; val () = etst "6" (long ^ "abc" >= long ^ "abc") true; val () = etst "6" (long ^ "abc" <= long ^ "abc") true; val () = etst "6" (long ^ "abc" = long ^ "abc") true; val () = etst "6" (long ^ "abc" <> long ^ "abc") false; val () = etst "5" (long ^ "" < long ^ "") false; (*begge tomme*) val () = etst "6" (long ^ "" > long ^ "") false; val () = etst "6" (long ^ "" >= long ^ "") true; val () = etst "6" (long ^ "" <= long ^ "") true; val () = etst "6" (long ^ "" = long ^ "") true; val () = etst "6" (long ^ "" <> long ^ "") false; val () = etst "7" (long ^ "abc" < long ^ "abcd") true; (*den ene lngere*) val () = etst "8" (long ^ "abc" > long ^ "abcd") false; val () = etst "8" (long ^ "abc" >= long ^ "abcd") false; val () = etst "8" (long ^ "abc" <= long ^ "abcd") true; val () = etst "8" (long ^ "abc" = long ^ "abcd") false; val () = etst "8" (long ^ "abc" <> long ^ "abcd") true; val () = etst "-" (long ^ "abcd" < long ^ "abc") false; (*den anden lngere*) val () = etst "-" (long ^ "abcd" > long ^ "abc") true; val () = etst "-" (long ^ "abcd" >= long ^ "abc") true; val () = etst "-" (long ^ "abcd" <= long ^ "abc") false; val () = etst "-" (long ^ "abcd" = long ^ "abc") false; val () = etst "-" (long ^ "abcd" <> long ^ "abc") true; val () = etst "-" (long ^ "abc" < long ^ "abd") true; (*lige lange, sidste strst*) val () = etst "-" (long ^ "abc" > long ^ "abd") false; val () = etst "-" (long ^ "abc" >= long ^ "abd") false; val () = etst "-" (long ^ "abc" <= long ^ "abd") true; val () = etst "-" (long ^ "abc" = long ^ "abd") false; val () = etst "-" (long ^ "abc" <> long ^ "abd") true; val () = etst "-" (long ^ "abd" < long ^ "abc") false; (*lige lange, frste strst*) val () = etst "-" (long ^ "abd" > long ^ "abc") true; val () = etst "-" (long ^ "abd" >= long ^ "abc") true; val () = etst "-" (long ^ "abd" <= long ^ "abc") false; val () = etst "-" (long ^ "abd" = long ^ "abc") false; val () = etst "-" (long ^ "abd" <> long ^ "abc") true; val _ = prl long; mlton-20100608/regression/type-check.sml0000644000076600000240000000326311404435620016513 0ustar mtfstaff(* This example is interesting because at the time of generalization of f, the * tyvar 'a is in scope, but does not appear in type types of any of the * variables in the environment (x's type has not yet been determined to be 'a). * Nevertheless, it is essential to not generalize 'a at g *) val 'a f = fn x => let exception E of 'a fun g (E y) = y | g _ = raise Fail "bug" in E x end (* This example is interesting because it binds a type variable at a scope where * the type variable does not appear in the type. Nevertheless, it is essential * to keep the type variable there, because it occurs in an inner scope. *) fun 'a f () = let val x: 'a = raise Fail "bug" in () end (* This example shows that type variables can be rebound in nested datatype * declarations, unlike the situation for nested value declarations. *) val 'a x = fn () => let datatype 'a t = T of 'a in () end (* This example verifies that datatype replication is allowed, even when the * right-hand side isn't a datatype. *) type 'a t = 'a * 'a datatype u = datatype t val _: int u = (13, 14); (* The following examples demonstrate acceptable forms of type variable scoping. *) fun f (x: 'a) = let fun g (y: 'a) = y in () end fun f (x: 'a) = let fun 'b g (y: 'b) = y in () end fun 'a f (x: 'a) = let fun g (y: 'a) = y in () end fun 'a f (x: 'a) = let fun 'b g (y: 'b) = y in () end val 'a x = fn () => let datatype 'a t = T of 'a in () end (* This example confirms that bools can be used as labels. *) val {false = x, ...} = {false = 13}; mlton-20100608/regression/typespec.ok0000644000076600000240000000000011404435620016113 0ustar mtfstaffmlton-20100608/regression/typespec.sml0000644000076600000240000000035011404435621016306 0ustar mtfstaff(* typespec.sml *) (* Checks scoping of definitional type specifications. *) type t = int signature S = sig type t = bool and u = t end structure X : S = struct type t = bool and u = bool end; mlton-20100608/regression/unary.2.ok0000644000076600000240000000000011404435617015563 0ustar mtfstaffmlton-20100608/regression/unary.2.sml0000644000076600000240000000043011404435620015746 0ustar mtfstaffdatatype num = Z | S of num val rec plus = fn (n, Z) => n | (n, S m) => S (plus (n,m)) val rec times = fn (_, Z) => Z | (n, S m) => plus (n, times (n,m)) val rec fact = fn Z => S Z | n as S m => times (n, fact m) val x = fact (S (S (S Z))) mlton-20100608/regression/unary.ok0000644000076600000240000000000011404435617015423 0ustar mtfstaffmlton-20100608/regression/unary.sml0000644000076600000240000000067111404435617015623 0ustar mtfstaffdatatype num = Z | S of num val rec plus = fn (n, Z) => n | (n, S m) => S (plus (n,m)) val zero = Z val one = S Z val two = plus (one,one) val rec times = fn (_, Z) => Z | (n, S m) => plus (n, times (n,m)) val square = fn n => times (n,n) val four = square two val sixteen = square four val two56 = square sixteen val rec fib = fn Z => Z | S Z => S Z | S (S n) => plus (fib (S n), fib n) val x = fib (S Z) mlton-20100608/regression/undetermined.ok0000644000076600000240000000000011404435620016742 0ustar mtfstaffmlton-20100608/regression/undetermined.sml0000644000076600000240000000151511404435617017146 0ustar mtfstaff(* undetermined.sml *) (* Checks inference for non-generalised types (aka "free type variables"). *) val f = (fn x => x) (fn x => x) structure A = struct end val y = f 7 ; structure A: sig val f: int -> int end = struct val f = (fn x => x) (fn x => x) end ; structure A : sig val a : int list ref end = struct val a = ref nil end ; val x = ref nil val _ = 1 :: !x ; ; ; val _ = let val x = ref nil val _ = 1 :: !x in () end ; (* 2.sml *) val id = (fn x => x) (fn x => x) val _ = id 13 ; structure X = struct val id = (fn x => x) (fn x => x) val _ = id 13 end ; (* 4.sml *) datatype t = T val id = (fn x => x) (fn x => x) val _ = id T ; (* 5.sml *) local val id = (fn x => x) (fn x => x) in val _ = id 13 end ; (* 7.sml *) val id = (fn x => x) (fn x => x) val _ = id 13 val id = () ; mlton-20100608/regression/unixpath.ok0000644000076600000240000000155211404435620016134 0ustar mtfstaff File unixpath.sml: Testing structure Path... test1a OK test1b OK test1c OK test1d OK test1e OK test1f OK test1g OK test1h OK test1i OK test1j OK test1k OK test1l OK test1m OK test1n OK test2a OK test2b OK test2c OK test2d OK test2e OK test2f OK test2g OK test2h OK test2i OK test2j OK test2k OK test2l OK test2m OK test2n OK test2o OK test2p OK test3b OK test3c OK test3d OK test3e OK test3f OK test3g OK test3h OK test4a OK test4b OK test5a OK test6a OK test6b OK test7a OK test7b OK test7c OK test8a OK test8b OK test8c OK test9a OK test10a OK test11a OK test12 OK test13 OK test14 OK test15 OK test16 OK test17 OK test18 OK test19 OK mlton-20100608/regression/unixpath.sml0000644000076600000240000003622211404435617016326 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/unixpath.sml 6 -- for Unix, 1995-05-23 *) val _ = print "\nFile unixpath.sml: Testing structure Path...\n" local open OS.Path val test1a = tst' "test1a" (fn _ => fromString "" = {isAbs=false, vol = "", arcs = []}); val test1b = tst' "test1b" (fn _ => fromString "/" = {isAbs=true, vol="", arcs=[""]}); val test1c = tst' "test1c" (fn _ => fromString "//" = {isAbs=true, vol="", arcs=["", ""]}); val test1d = tst' "test1d" (fn _ => fromString "a" = {isAbs=false, vol = "", arcs = ["a"]}); val test1e = tst' "test1e" (fn _ => fromString "/a" = {isAbs=true, vol="", arcs=["a"]}); val test1f = tst' "test1f" (fn _ => fromString "//a" = {isAbs=true, vol="", arcs=["","a"]}); val test1g = tst' "test1g" (fn _ => fromString "a/" = {isAbs=false, vol = "", arcs = ["a", ""]}); val test1h = tst' "test1h" (fn _ => fromString "a//" = {isAbs=false, vol = "", arcs = ["a", "", ""]}); val test1i = tst' "test1i" (fn _ => fromString "a/b" = {isAbs=false, vol = "", arcs = ["a", "b"]}); val test1j = tst' "test1j" (fn _ => fromString "a.b/c" = {isAbs=false, vol = "", arcs = ["a.b", "c"]}); val test1k = tst' "test1k" (fn _ => fromString "a.b/c/" = {isAbs=false, vol = "", arcs = ["a.b", "c", ""]}); val test1l = tst' "test1l" (fn _ => fromString "a/./c" = {isAbs=false, vol = "", arcs = ["a", ".", "c"]}); val test1m = tst' "test1m" (fn _ => fromString "a/../c" = {isAbs=false, vol = "", arcs = ["a", "..", "c"]}); val test1n = tst' "test1n" (fn _ => fromString "." = {isAbs=false, vol = "", arcs = ["."]}); val test2a = tst' "test2a" (fn _ => toString {isAbs=false, vol = "", arcs = []} = ""); val test2b = tst' "test2b" (fn _ => toString {isAbs=true, vol="", arcs=[]} = "/"); val test2c = tst' "test2c" (fn _ => toString {isAbs=true, vol="", arcs=["", ""]} = "//"); val test2d = tst' "test2d" (fn _ => toString {isAbs=false, vol = "", arcs = ["a"]} = "a"); val test2e = tst' "test2e" (fn _ => toString {isAbs=true, vol="", arcs=["a"]} = "/a"); val test2f = tst' "test2f" (fn _ => toString {isAbs=true, vol="", arcs=["","a"]} = "//a"); val test2g = tst' "test2g" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", ""]} = "a/"); val test2h = tst' "test2h" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", "", ""]} = "a//"); val test2i = tst' "test2i" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", "b"]} = "a/b"); val test2j = tst' "test2j" (fn _ => toString {isAbs=false, vol = "", arcs = ["a.b", "c"]} = "a.b/c"); val test2k = tst' "test2k" (fn _ => toString {isAbs=false, vol = "", arcs = ["a.b", "c", ""]} = "a.b/c/"); val test2l = tst' "test2l" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", ".", "c"]} = "a/./c"); val test2m = tst' "test2m" (fn _ => toString {isAbs=false, vol = "", arcs = ["a", "..", "c"]} = "a/../c"); val test2n = tst' "test2n" (fn _ => toString {isAbs=true, vol="", arcs=["a", "..", "c"]} = "/a/../c"); val test2o = tst0 "test2o" ((toString {isAbs=false, vol = "", arcs = ["", "a"]} seq "WRONG") handle Path => "OK" | _ => "WRONG") val test2p = tst0 "test2p" ((toString {isAbs=true, vol = "C:", arcs = ["windows"]} seq "WRONG") handle Path => "OK" | _ => "WRONG") val test3b = tst' "test3b" (fn _ => getVolume "/" = ""); val test3c = tst' "test3c" (fn _ => getVolume "//" = ""); val test3d = tst' "test3d" (fn _ => getVolume "a//b/c/" = ""); val test3e = tst' "test3e" (fn _ => getVolume "./" = ""); val test3f = tst' "test3f" (fn _ => getVolume "../" = ""); val test3g = tst' "test3g" (fn _ => getVolume "" = ""); val test3h = tst' "test3h" (fn _ => getVolume "C:" = ""); val test4a = tst' "test4a" (fn _ => List.all isRelative ["", ".", "..", "a//"] andalso not (List.exists isRelative ["/", "/a", "//"])); val test4b = tst' "test4b" (fn _ => List.all isAbsolute ["/", "/a", "//", "/.", "/.."] andalso not (List.exists isAbsolute ["", ".", "..", "a//"])); val test5a = tst' "test5a" (fn _ => getParent "/" = "/" andalso getParent "a" = "." andalso getParent "a/" = "a/.." andalso getParent "a///" = "a///.." andalso getParent "a/b" = "a" andalso getParent "a/b/" = "a/b/.." andalso getParent "/a/b" = "/a" andalso getParent "/a/b/" = "/a/b/.." andalso getParent ".." = "../.." andalso getParent "." = ".." andalso getParent "../" = "../.." andalso getParent "./" = "./.." andalso getParent "" = ".."); val test6a = tst' "test6a" (fn _ => concat("a", "b") = "a/b" andalso concat("a", "b/c") = "a/b/c" andalso concat("/", "b/c") = "/b/c" andalso concat("", "b/c") = "b/c" andalso concat("/a", "b/c") = "/a/b/c" andalso concat("a/", "b/c") = "a/b/c" andalso concat("a//", "b/c") = "a//b/c" andalso concat(".", "b/c") = "./b/c" andalso concat("a/b", "..") = "a/b/.." andalso concat("a/b", "../c") = "a/b/../c"); val test6b = tst0 "test6b" ((concat ("a", "/b") seq "WRONG") handle Path => "OK" | _ => "WRONG") val mkAbsolute = fn (p, r) => mkAbsolute {path = p, relativeTo = r} val test7a = tst' "test7a" (fn _ => mkAbsolute("/a/b", "/c/d") = "/a/b" andalso mkAbsolute("/", "/c/d") = "/" andalso mkAbsolute("a/b", "/c/d") = "/c/d/a/b"); val test7b = tst0 "test7b" ((mkAbsolute("a", "c/d") seq "WRONG") handle Path => "OK" | _ => "WRONG") val test7c = tst0 "test7c" ((mkAbsolute("/a", "c/d") seq "WRONG") handle Path => "OK" | _ => "WRONG") val mkRelative = fn (p, r) => mkRelative {path = p, relativeTo = r} val test8a = tst' "test8a" (fn _ => mkRelative("a/b", "/c/d") = "a/b" andalso mkRelative("/", "/a/b/c") = "../../.." andalso mkRelative("/a/", "/a/b/c") = "../../" andalso mkRelative("/a/b/", "/a/c") = "../b/" andalso mkRelative("/a/b", "/a/c/") = "../b" andalso mkRelative("/a/b/", "/a/c/") = "../b/" andalso mkRelative("/", "/") = "." andalso mkRelative("/", "/.") = "." andalso mkRelative("/", "/..") = "." andalso mkRelative("/", "/a") = ".." andalso mkRelative("/a/b/../c", "/a/d") = "../b/../c" andalso mkRelative("/a/b", "/c/d") = "../../a/b" andalso mkRelative("/c/a/b", "/c/d") = "../a/b" andalso mkRelative("/c/d/a/b", "/c/d") = "a/b"); val test8b = tst0 "test8b" ((mkRelative("/a", "c/d") seq "WRONG") handle Path => "OK" | _ => "WRONG") val test8c = tst0 "test8c" ((mkRelative("a", "c/d") seq "WRONG") handle Path => "OK" | _ => "WRONG") val test9a = let fun chkCanon (a, b) = (mkCanonical a = b) andalso (mkCanonical b = b) andalso (isCanonical b) in tst' "test9a" (fn _ => chkCanon("", ".") andalso chkCanon(".", ".") andalso chkCanon("./.", ".") andalso chkCanon("/.", "/") andalso chkCanon("..", "..") andalso chkCanon("../..", "../..") andalso chkCanon("b", "b") andalso chkCanon("a/b", "a/b") andalso chkCanon("/a/b", "/a/b") andalso chkCanon("a/b/", "a/b") andalso chkCanon("a/b//", "a/b") andalso chkCanon("a/../b", "b") andalso chkCanon("a/..", ".") andalso chkCanon("a/.", "a") andalso chkCanon("a/", "a") andalso chkCanon("/a/../b/", "/b") andalso chkCanon("/..", "/") andalso chkCanon("/../../a/b", "/a/b") andalso chkCanon("/./../../a/b", "/a/b") andalso chkCanon("/./../..", "/") andalso chkCanon("a/../b", "b") andalso chkCanon("a/./b", "a/b") andalso chkCanon("a////b", "a/b") andalso chkCanon("a////b", "a/b")) end val test10a = tst' "test10a" (fn _ => not (isCanonical "./." orelse isCanonical "/.." orelse isCanonical "/." orelse isCanonical "//" orelse isCanonical "a/.." orelse isCanonical "a//b" orelse isCanonical "a/." orelse isCanonical "a/b/" orelse isCanonical "a/..")) val test11a = tst' "test11a" (fn _ => splitDirFile "" = {dir = "", file = ""} andalso splitDirFile "." = {dir = "", file = "."} andalso splitDirFile ".." = {dir = "", file = ".."} andalso splitDirFile "b" = {dir = "", file = "b"} andalso splitDirFile "b/" = {dir = "b", file = ""} andalso splitDirFile "a/b" = {dir = "a", file = "b"} andalso splitDirFile "/a" = {dir = "/", file = "a"} andalso splitDirFile "/a/b" = {dir = "/a", file = "b"} andalso splitDirFile "/c/a/b" = {dir = "/c/a", file = "b"} andalso splitDirFile "/c/a/b/" = {dir = "/c/a/b", file = ""} andalso splitDirFile "/c/a/b.foo.bar" = {dir = "/c/a", file="b.foo.bar"} andalso splitDirFile "/c/a/b.foo" = {dir = "/c/a", file = "b.foo"}); (* val test11b = (splitDirFile "" seq "WRONG") handle Path => "OK" | _ => "WRONG"; *) val test12 = tst' "test12" (fn _ => List.all (fn (res, dir, file) => res = joinDirFile {dir = dir, file = file}) [("", "", ""), ("b", "", "b"), ("/", "/", ""), ("/b", "/", "b"), ("a/b", "a", "b"), ("/a/b", "/a", "b"), ("/c/a/b", "/c/a", "b"), ("/c/a/b/", "/c/a/b", ""), ("/c/a/b.foo.bar", "/c/a","b.foo.bar"), ("/c/a/b.foo", "/c/a", "b.foo")]) val test13 = tst' "test13" (fn _ => dir "b" = "" andalso dir "a/b" = "a" andalso dir "/" = "/" andalso dir "/b" = "/" andalso dir "/a/b" = "/a" andalso dir "/c/a/b" = "/c/a" andalso dir "/c/a/b/" = "/c/a/b" andalso dir "/c/a/b.foo.bar" = "/c/a" andalso dir "/c/a/b.foo" = "/c/a"); val test14 = tst' "test14" (fn _ => file "b" = "b" andalso file "a/b" = "b" andalso file "/" = "" andalso file "/b" = "b" andalso file "/a/b" = "b" andalso file "/c/a/b" = "b" andalso file "/c/a/b/" = "" andalso file "/c/a/b.foo.bar" = "b.foo.bar" andalso file "/c/a/b.foo" = "b.foo"); val test15 = tst' "test15" (fn _ => splitBaseExt "" = {base = "", ext = NONE} andalso splitBaseExt ".login" = {base = ".login", ext = NONE} andalso splitBaseExt "/.login" = {base = "/.login", ext = NONE} andalso splitBaseExt "a" = {base = "a", ext = NONE} andalso splitBaseExt "a." = {base = "a.", ext = NONE} andalso splitBaseExt "a.b" = {base = "a", ext = SOME "b"} andalso splitBaseExt "a.b.c" = {base = "a.b", ext = SOME "c"} andalso splitBaseExt "/a.b" = {base = "/a", ext = SOME "b"} andalso splitBaseExt "/c/a.b" = {base = "/c/a", ext = SOME "b"} andalso splitBaseExt "/c/a/b/.d" = {base = "/c/a/b/.d", ext = NONE} andalso splitBaseExt "/c.a/b.d" = {base = "/c.a/b", ext = SOME "d"} andalso splitBaseExt "/c.a/bd" = {base = "/c.a/bd", ext = NONE} andalso splitBaseExt "/c/a/b.foo.bar" = {base="/c/a/b.foo",ext=SOME "bar"} andalso splitBaseExt "/c/a/b.foo" = {base = "/c/a/b", ext = SOME "foo"}); val test16 = tst' "test16" (fn _ => "" = joinBaseExt {base = "", ext = NONE} andalso ".login" = joinBaseExt {base = ".login", ext = NONE} andalso "a" = joinBaseExt {base = "a", ext = NONE} andalso "a" = joinBaseExt {base = "a", ext = SOME ""} andalso "a.b" = joinBaseExt {base = "a", ext = SOME "b"} andalso "a.b.c" = joinBaseExt {base = "a.b", ext = SOME "c"} andalso "a.b.c.d" = joinBaseExt {base = "a.b", ext = SOME "c.d"} andalso "/a.b" = joinBaseExt {base = "/a", ext = SOME "b"} andalso "/c/a.b" = joinBaseExt {base = "/c/a", ext = SOME "b"} andalso "/c/a/b/.d" = joinBaseExt {base = "/c/a/b/", ext = SOME "d"} andalso "/c/a/b.foo.bar" = joinBaseExt {base="/c/a/b",ext=SOME "foo.bar"} andalso "/c/a/b.foo" = joinBaseExt {base = "/c/a/b", ext = SOME "foo"}); val test17 = tst' "test17" (fn _ => ext "" = NONE andalso ext ".login" = NONE andalso ext "/.login" = NONE andalso ext "a" = NONE andalso ext "a." = NONE andalso ext "a.b" = SOME "b" andalso ext "a.b.c" = SOME "c" andalso ext "a.b.c.d" = SOME "d" andalso ext "/a.b" = SOME "b" andalso ext "/c/a.b" = SOME "b" andalso ext "/c/a/b/.d" = NONE andalso ext "/c.a/b.d" = SOME "d" andalso ext "/c.a/bd" = NONE andalso ext "/c/a/b.foo.bar" = SOME "bar" andalso ext "/c/a/b.foo" = SOME "foo"); val test18 = tst' "test18" (fn _ => base "" = "" andalso base ".d" = ".d" andalso base ".login" = ".login" andalso base "/.login" = "/.login" andalso base "a" = "a" andalso base "a." = "a." andalso base "a.b" = "a" andalso base "a.b.c" = "a.b" andalso base "a.b.c.d" = "a.b.c" andalso base "/a.b" = "/a" andalso base "/c/a.b" = "/c/a" andalso base "/c/a/b/.d" = "/c/a/b/.d" andalso base "/c.a/b.d" = "/c.a/b" andalso base "/c.a/bd" = "/c.a/bd" andalso base "/c/a/b.foo.bar" = "/c/a/b.foo" andalso base "/c/a/b.foo" = "/c/a/b"); val test19 = tst' "test19" (fn () => validVolume{isAbs=false, vol=""} andalso validVolume{isAbs=true, vol=""} andalso not (validVolume{isAbs=true, vol="/"} orelse validVolume{isAbs=false, vol="/"} orelse validVolume{isAbs=true, vol="C:"} orelse validVolume{isAbs=false, vol="C:"} orelse validVolume{isAbs=true, vol=" "} orelse validVolume{isAbs=false, vol=" "})); in end mlton-20100608/regression/useless-string.ok0000644000076600000240000000000011404435620017246 0ustar mtfstaffmlton-20100608/regression/useless-string.sml0000644000076600000240000000030311404435620017436 0ustar mtfstaffval x = "abc" val y = "defg" val _ = if 3 = (String.size (if 0 = length (CommandLine.arguments ()) then x else y)) then () else raise Fail "bug" mlton-20100608/regression/valrec.ok0000644000076600000240000000003411404435621015543 0ustar mtfstaffHello, world! Hello, world! mlton-20100608/regression/valrec.sml0000644000076600000240000000143511404435617015740 0ustar mtfstaffval rec ((((((((x)))))))) = fn () => () val _ = x () local val 'a rec f = fn () => () in end local val x = "Hello, world!\n" val x = "BUG\n" and rec f = fn () => print x in val _ = f () end local val x = "BUG\n" val x = "Hello, world!\n" and rec f = fn y => print y in val _ = f x end local val rec rec f = fn () => () in end local val rec f = fn () => () and rec g = fn () => () in end (* valrec.sml *) (* Checks parsing, scoping, typing and dynamic semantics of "val rec". *) fun x x = x val _ = case x 1 of 1 => () | _ => raise Fail "bug" val a = fn x => x val a = 1 and rec b = fn x => a(b(c(d(e(f(g x)))))) and c : 'a -> 'a as d : 'a -> 'a = fn x => x and rec e as f as g = fn x => x and h : 'b -> 'b : 'b -> 'b = fn x => x; mlton-20100608/regression/vector-loop.ok0000644000076600000240000000000011404435617016536 0ustar mtfstaffmlton-20100608/regression/vector-loop.sml0000644000076600000240000000035411404435620016726 0ustar mtfstaffopen Vector datatype t = T of t vector fun makeT() = T(tabulate(0, fn _ => makeT())) fun destT(T v) = if length v > 0 then 1 + destT(sub(v, 0)) else 0 val _ = if 0 = destT(makeT()) then () else raise Fail "bug" mlton-20100608/regression/vector.ok0000644000076600000240000000056511404435617015607 0ustar mtfstaffTesting Vector... test1: OK test2: OK test3: OK test4a: OK test4b: OK test4c: OK test5: OK test6a: OK test6b: OK test6c: OK test7: OK test8: OK test9: OK test9a: OK test9b: OK test9c: OK test9d: OK test9e: OK test9f: OK test9g: OK test9h: OK test9i: OK test10a: OK test11a: OK test11b: OK test11c: OK test11d: OK test11e: OK test11f: OK test11g: OK test11h: OK test11i: OK mlton-20100608/regression/vector.sml0000644000076600000240000001240711404435617015767 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/vector.sml -- some test cases for Vector PS 1994-12-10, 1995-06-14, 1997-03-07 *) (*KILL 05/11/1997 11:04. tho.: use "auxil.sml"; *) val _ = print "Testing Vector...\n"; fun prtest (s, s') = print(s ^ ": " ^ s' ^ "\n") local open Vector; infix 9 sub; fun extract (vec, s, l) = VectorSlice.vector (VectorSlice.slice (vec, s, l)) fun mapi f (vec, s, l) = VectorSlice.mapi (fn (i,x) => f (i+s,x)) (VectorSlice.slice (vec, s, l)) in val a = fromList [0,1,2,3,4,5,6]; val b = fromList [44,55,66]; val c = fromList [0,1,2,3,4,5,6]; val test1 = check'(fn _ => a<>b); val _ = prtest("test1", test1); val test2 = check'(fn _ => a=c); val _ = prtest("test2", test2); val d = tabulate(100, fn i => i mod 7); val test3 = check'(fn _ => d sub 27 = 6); val _ = prtest("test3", test3); val test4a = (tabulate(maxLen+1, fn i => i) seq "WRONG") handle Overflow => "OK" | Size => "OK" | _ => "WRONG"; val _ = prtest("test4a", test4a); val test4b = (tabulate(~1, fn i => i) seq "WRONG") handle Size => "OK" | _ => "WRONG"; val _ = prtest("test4b", test4b); val test4c = check'(fn _ => length (tabulate(0, fn i => i div 0)) = 0); val _ = prtest("test4c", test4c); val test5 = check'(fn _ => length (fromList []) = 0 andalso length a = 7); val _ = prtest("test5", test5); val test6a = (c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test6a", test6a); val test6b = (c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test6b", test6b); val test6c = check'(fn _ => c sub 0 = 0); val _ = prtest("test6c", test6c); val e = concat [d, b, d]; val test7 = check'(fn _ => length e = 203); val _ = prtest("test7", test7); val test8 = check'(fn _ => length (concat []) = 0); val _ = prtest("test8", test8); val f = extract (e, 100, SOME 3); val test9 = check'(fn _ => f = b); val _ = prtest("test9", test9); val test9a = check'(fn _ => e = extract(e, 0, SOME (length e)) andalso e = extract(e, 0, NONE)); val _ = prtest("test9a", test9a); val test9b = check'(fn _ => fromList [] = extract(e, 100, SOME 0)); val _ = prtest("test9b", test9b); val test9c = (extract(e, ~1, SOME (length e)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9c", test9c); val test9d = (extract(e, length e + 1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9d", test9d); val test9e = (extract(e, 0, SOME (length e+1)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9e", test9e); val test9f = (extract(e, 20, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9f", test9f); val test9g = (extract(e, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9g", test9g); val test9h = (extract(e, length e + 1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG" val _ = prtest("test9h", test9h); val test9i = check'(fn _ => fromList [] = extract(e, length e, SOME 0) andalso fromList [] = extract(e, length e, NONE)); val _ = prtest("test9i", test9i); fun chkiter iter f vec reslast = check'(fn _ => let val last = ref ~1 val res = iter (fn x => (last := x; f x)) vec in (res, !last) = reslast end) fun chkiteri iter f vec reslast = check'(fn _ => let val last = ref ~1 val res = iter (fn (i, x) => (last := i; f x)) vec in (res, !last) = reslast end) val test10a = chkiter map (fn x => 2*x) b (fromList [88,110,132], 66) val _ = prtest("test10a", test10a); val test11a = chkiteri mapi (fn x => 2*x) (b, 0, NONE) (fromList [88,110,132], 2) val _ = prtest("test11a", test11a); val test11b = chkiteri mapi (fn x => 2*x) (b, 1, NONE) (fromList [110,132], 2) val _ = prtest("test11b", test11b); val test11c = chkiteri mapi (fn x => 2*x) (b, 1, SOME 0) (fromList [], ~1) val _ = prtest("test11c", test11c); val test11d = chkiteri mapi (fn x => 2*x) (b, 1, SOME 1) (fromList [110], 1) val _ = prtest("test11d", test11d); val test11e = chkiteri mapi (fn x => 2*x) (b, 3, NONE) (fromList [], ~1) val _ = prtest("test11e", test11e); val test11f = (mapi #2 (b, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test11f", test11f); val test11g = (mapi #2 (b, 3, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test11g", test11g); val test11h = (mapi #2 (b, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test11h", test11h); val test11i = (mapi #2 (b, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG"; val _ = prtest("test11i", test11i); end; mlton-20100608/regression/vector2.ok0000644000076600000240000000000211404435617015653 0ustar mtfstaff6 mlton-20100608/regression/vector2.sml0000644000076600000240000000016411404435617016046 0ustar mtfstaffopen Vector val v = tabulate(13, fn i => fn j => i + j) val _ = print(Int.toString(sub(v, 5) 1)) val _ = print "\n" mlton-20100608/regression/vector3.ok0000644000076600000240000000000511404435617015657 0ustar mtfstaff1000 mlton-20100608/regression/vector3.sml0000644000076600000240000000020711404435617016045 0ustar mtfstaffval v = Vector.tabulate (1000, fn i => ()) val r = ref 0 val _ = r := Vector.length v val _ = print (concat [Int.toString (!r), "\n"]) mlton-20100608/regression/vector4.ok0000644000076600000240000000000011404435617015653 0ustar mtfstaffmlton-20100608/regression/vector4.sml0000644000076600000240000000072111404435617016047 0ustar mtfstaffopen Vector fun assert(msg,b) = (if b then () else print("assertion failed: " ^ msg ^ "\n")) val v1 = fromList[1,2,3] val v2 = fromList[1,2,3] val _ = assert("vector equality", v1 = v2 andalso fromList[v1, v2] = fromList[v2, v1] andalso v1 <> fromList[1,2] andalso v1 <> fromList[1,2,4]) open Array val a1 = fromList[1,2,3] val a2 = fromList[1,2,3] val _ = assert("array equality", a1 <> a2) mlton-20100608/regression/warn/0000755000076600000240000000000011404470407014707 5ustar mtfstaffmlton-20100608/regression/warn/undetermined.sml0000644000076600000240000000054011404435614020107 0ustar mtfstaff(* 1.sml *) val id = (fn x => x) (fn x => x) ; structure B : sig end = struct val a = ref nil end ; (* 3.sml *) val id = (fn x => x) (fn x => x) ; val _ = id 13 ; (* 6.sml *) val id = (fn x => x) (fn x => x) val id = () ; val x = ref []; val _ = 1 :: !x ; val x = ref nil signature S = sig end val _ = 1 :: !x ; val x = ref nil; val _ = () :: !x mlton-20100608/regression/warn/warning.sml0000644000076600000240000000072311404435614017074 0ustar mtfstaff(* No warning according to page 28 of defn *) val x::l = [] structure S = struct val x :: l = [] end val _ = let val x::l = [] (* But this should generate a warning. *) in () end val _ = case 13 of 1 => () val _ = case 13 of 1 => 2 | 1 => 3 | 1 => 4 val NONE = NONE fun f _ 1 = () | f 1 _ = () fun f _ _ = () | f 1 2 = () | f 3 4 = () val _ = fn 13 => () val _ = () handle _ => () | x => () mlton-20100608/regression/weak.2.ok0000644000076600000240000000000511404435617015361 0ustar mtfstafftrue mlton-20100608/regression/weak.2.sml0000644000076600000240000000121611404435617015550 0ustar mtfstaffstructure Weak = MLton.Weak val x = (13, ref 5) val wx = Weak.new x fun isAlive () = isSome (Weak.get wx) val _ = MLton.GC.collect () val _ = print (Bool.toString (isAlive ()) ^ "\n") (* fun sum (x : int * (int list ref vector * int * int) ref) = #1 x + #2 (! (#2 x)) + #3 (! (#2 x)) + Vector.foldr (fn (lr,s) => List.foldr (op +) s (!lr)) 0 (#1 (! (#2 x))) val x = (13, ref (Vector.tabulate (10, fn n => ref (List.tabulate (n, fn i => i))), 4, 5)) val wx = Weak.new x fun isAlive () = isSome (Weak.get wx) val _ = MLton.GC.collect () val _ = print (Bool.toString (isAlive ()) ^ "\n") val s1 = sum x *)mlton-20100608/regression/weak.ok0000644000076600000240000000004011404435617015220 0ustar mtfstaff13 12345678901234567890 1 12345 mlton-20100608/regression/weak.sml0000644000076600000240000000227411404435617015415 0ustar mtfstaffstructure Weak = MLton.Weak val w = Weak.new 13 val _ = if isSome (Weak.get w) then raise Fail "bug int" else () fun testIntInf (i: IntInf.int) = let val w = Weak.new i val _ = case Weak.get w of NONE => raise Fail "bug IntInf" | SOME i => print (concat [IntInf.toString i, "\n"]) in () end val _ = testIntInf 13 val _ = testIntInf 12345678901234567890 val r = ref 13 val n = 2 val rs = Array.tabulate (n, ref) val ws = Array.tabulate (n, fn i => Weak.new (Array.sub (rs, i))) fun isAlive i = isSome (Weak.get (Array.sub (ws, i))) val _ = MLton.GC.collect () val _ = if isAlive 0 andalso isAlive 1 then () else raise Fail "bug1" fun clear i = Array.update (rs, i, r) fun sub i = ! (Array.sub (rs, i)) fun pi x = print (concat [Int.toString x, "\n"]) val _ = pi (sub 0 + sub 1) val _ = valOf (Weak.get (Array.sub (ws, 0))) := 12345 val _ = clear 1 val _ = MLton.GC.collect () val _ = if isAlive 0 andalso not (isAlive 1) then () else raise Fail "bug2" val _ = pi (sub 0) val _ = clear 0 val _ = MLton.GC.collect () val _ = if not (isAlive 0) andalso not (isAlive 1) then () else raise Fail "bug2" mlton-20100608/regression/where-and.ok0000644000076600000240000000000011404435617016137 0ustar mtfstaffmlton-20100608/regression/where-and.sml0000644000076600000240000000174411404435617016341 0ustar mtfstaff(* where-and.sml *) (* Checks parsing of where type ... and derived form. *) signature S = sig type t and u end signature T = S where type t = int and type u = bool and U = S where type t = int and type u = bool signature V = sig structure A : S where type t = int and type u = bool and B : S where type t = int and type u = bool end structure A : S where type t = int and type u = bool = struct type t = int type u = bool end structure B = A : S where type t = int and type u = bool and C = A : S where type t = int and type u = bool functor F(X : S where type t = int and type u = bool) : S where type t = int and type u = bool = X : S where type t = int and type u = bool and G(Y : S where type t = int and type u = bool) : S where type t = int and type u = bool = Y : S where type t = int and type u = bool signature W = sig type t and u and v end signature W' = W where type t = int and type u = int where type v = int and W'' = W; mlton-20100608/regression/where.ok0000644000076600000240000000000011404435617015377 0ustar mtfstaffmlton-20100608/regression/where.sml0000644000076600000240000000057011404435620015567 0ustar mtfstaff(* where.sml *) (* Checks treatment of type realisations. *) signature S = sig type t type s = t end where type s = int; (* Due to Martin Elsman, also see SML/NJ bug 1330. *) signature T = sig type s structure U : sig type 'a t type u = (int * real) t end where type 'a t = s end where type U.u = int; mlton-20100608/regression/widechar.ok0000644000076600000240000000077011404435620016063 0ustar mtfstaffFile widechar.sml: Testing structure WideChar... test4 OK test5 OK test6 OK test18 OK test19 OK test20 OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK checkset OK test31 OK test32 OK test33 OK test34a OK test34b OK test35a OK test35b OK test36 OK test37 OK test38 OK test39 OK test40 OK test41 OK test42 OK test43 OK mlton-20100608/regression/widechar.sml0000644000076600000240000002626111404435620016250 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") (* handle _ => "EXN" *); fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/widechar.sml -- test cases WideChar, suitable for ASCII PS 1994-12-10, 1995-05-11, 1995-11-10, 1996-09-30 *) (*KILL 05/11/1997 10:55. tho.: use "auxil.sml"; *) val _ = print "File widechar.sml: Testing structure WideChar...\n" val test4 = tstrange "test4" (0, WideChar.maxOrd) (fn i => (WideChar.ord o WideChar.chr) i = i); val test5 = tst0 "test5" ((WideChar.chr ~1 seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test6 = tst0 "test6" ((WideChar.chr (WideChar.maxOrd+1) seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test18 = tst "test18" (not (WideChar.contains "" (WideChar.chr 65)) andalso not (WideChar.contains "aBCDE" (WideChar.chr 65)) andalso (WideChar.contains "ABCD" (WideChar.chr 67)) andalso not (WideChar.contains "" #"\000") andalso not (WideChar.contains "" #"\255") andalso not (WideChar.contains "azAZ09" #"\000") andalso not (WideChar.contains "azAZ09" #"\255")); val test19 = tst "test19" (WideChar.notContains "" (WideChar.chr 65) andalso WideChar.notContains "aBCDE" (WideChar.chr 65) andalso not (WideChar.notContains "ABCD" (WideChar.chr 67)) andalso WideChar.notContains "" #"\000" andalso WideChar.notContains "" #"\255" andalso WideChar.notContains "azAZ09" #"\000" andalso WideChar.notContains "azAZ09" #"\255"); val test20 = tst "test20" (WideChar.ord WideChar.maxChar = WideChar.maxOrd); local fun mycontains s c = let val stop = WideString.size s fun h i = i < stop andalso (c = WideString.sub(s, i) orelse h(i+1)) in h 0 end; (* Check that p(c) = (mycontains s c) for all characters: *) fun equivalent p s = let fun h n = n > 255 orelse (p (WideChar.chr n) = mycontains s (WideChar.chr n)) andalso h(n+1) in h 0 end fun checkset p s = tst' "checkset" (fn _ => equivalent p s); val graphchars : WideString.string = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\ \[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; val ascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127" val lowerascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127" val upperascii = "\^@\^A\^B\^C\^D\^E\^F\^G\^H\t\n\^K\^L\^M\^N\^O\^P\ \\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_\ \ !\"#$%&'()*+,-./0123456789:;<=>?@\ \ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\127" val allchars = let fun h 0 res = WideChar.chr 0 :: res | h n res = h (n-1) (WideChar.chr n :: res) in h 255 [] end open WideChar in val test21 = checkset isLower "abcdefghijklmnopqrstuvwxyz"; val test22 = checkset isUpper "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test23 = checkset isDigit "0123456789"; val test24 = checkset isAlpha "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test25 = checkset isHexDigit "0123456789abcdefABCDEF"; val test26 = checkset isAlphaNum "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; val test27 = checkset isPrint (WideString.^ (" ", graphchars)) val test28 = checkset isSpace " \009\010\011\012\013"; val test29 = checkset isGraph graphchars val test30 = checkset isAscii ascii val test31 = tst' "test31" (fn _ => map toLower (WideString.explode ascii) = WideString.explode lowerascii) val test32 = tst' "test32" (fn _ => map toUpper (WideString.explode ascii) = WideString.explode upperascii) val test33 = tst' "test33" (fn _ => map toUpper (WideString.explode graphchars) seq map toLower (WideString.explode graphchars) seq true) val test34a = tst' "test34a" (fn _ => map pred (List.drop(allchars, 1)) = List.take(allchars, 255)); val test34b = tst0 "test34b" ((pred minChar seq "WRONG") handle Chr => "OK" | _ => "WRONG") val test35a = tst' "test35a" (fn _ => map succ (List.take(allchars, 255)) = List.drop(allchars, 1)); val test35b = tst0 "test35b" ((succ maxChar seq "WRONG") handle Chr => "OK" | _ => "WRONG") end (* Test cases for SML character escape functions. *) val test36 = let fun chk (arg, res) = WideChar.toString arg = res in tst' "test36" (fn _ => List.all chk [(#"\000", "\\^@"), (#"\001", "\\^A"), (#"\006", "\\^F"), (#"\007", "\\a"), (#"\008", "\\b"), (#"\009", "\\t"), (#"\010", "\\n"), (#"\011", "\\v"), (#"\012", "\\f"), (#"\013", "\\r"), (#"\014", "\\^N"), (#"\031", "\\^_"), (#"\032", " "), (#"\126", "~"), (#"\\", "\\\\"), (#"\"", "\\\""), (#"A", "A"), (#"\127", "\\127"), (#"\128", "\\128"), (#"\255", "\\255")]) end; val test37 = let val chars = List.tabulate(256, WideChar.chr) fun chk c = WideChar.fromString(WideChar.toString c) = SOME c in tst' "test37" (fn _ => List.all chk chars) end val test38 = let fun chkFromString (arg, res) = WideChar.fromString arg = SOME res val argResList = [("A", #"A"), ("z", #"z"), ("@", #"@"), ("~", #"~"), ("\\a", #"\007"), ("\\b", #"\008"), ("\\t", #"\009"), ("\\n", #"\010"), ("\\v", #"\011"), ("\\f", #"\012"), ("\\r", #"\013"), ("\\\\", #"\\"), ("\\\"", #"\""), ("\\^@", #"\000"), ("\\^A", #"\001"), ("\\^Z", #"\026"), ("\\^_", #"\031"), ("\\000", #"\000"), ("\\097", #"a"), ("\\255", #"\255"), ("\\256", #"\256"), ("\\999", #"\999"), ("\\u0000", #"\000"), ("\\u67ab", #"\u67ab"), ("\\U001067ab", #"\U001067ab"), ("\\U0010ffff", #"\U0010ffff"), ("\\ \t\n\n \\A", #"A"), ("\\ \t\n\n \\z", #"z"), ("\\ \t\n\n \\@", #"@"), ("\\ \t\n\n \\~", #"~"), ("\\ \t\n\n \\\\n", #"\n"), ("\\ \t\n\n \\\\t", #"\t"), ("\\ \t\n\n \\\\\\", #"\\"), ("\\ \t\n\n \\\\\"", #"\""), ("\\ \t\n\n \\\\^@", #"\000"), ("\\ \t\n\n \\\\^A", #"\001"), ("\\ \t\n\n \\\\^Z", #"\026"), ("\\ \t\n\n \\\\^_", #"\031"), ("\\ \t\n\n \\\\000", #"\000"), ("\\ \t\n\n \\\\097", #"a"), ("\\ \t\n\n \\\\255", #"\255")] in tst' "test38" (fn _ => List.all chkFromString argResList) end; val test39 = tst' "test39" (fn _ => List.all (fn arg => WideChar.fromString arg = NONE) ["\\", "\\c", "\\F", "\\e", "\\g", "\\N", "\\T", "\\1", "\\11", "\\-65", "\\~65", "\\?", "\\^`", "\\^a", "\\^z", "\\U00110000", (* outside the range of Unicode *) "\\ a", "\\ a\\B", "\\ \\"]); (* Test cases for C string escape functions *) val test40 = let val chars = List.tabulate(256, WideChar.chr) in tst' "test40" (fn _ => List.map SOME chars = List.map WideChar.fromCString (List.map WideChar.toCString chars)) end; val test41 = let val argResList = [(#"\010", "\\n"), (#"\009", "\\t"), (#"\011", "\\v"), (#"\008", "\\b"), (#"\013", "\\r"), (#"\012", "\\f"), (#"\007", "\\a"), (#"\\", "\\\\"), (#"?", "\\?"), (#"'", "\\'"), (#"\"", "\\\"")] in tst' "test41" (fn _ => List.all (fn (arg, res) => WideChar.toCString arg = res) argResList) end; val test42 = let fun checkFromCStringSucc (arg, res) = WideString.str (valOf (WideChar.fromCString arg)) = res val argResList = [("\\n", "\010"), ("\\t", "\009"), ("\\v", "\011"), ("\\b", "\008"), ("\\r", "\013"), ("\\f", "\012"), ("\\a", "\007"), ("\\\\", "\\"), ("\\?", "?"), ("\\'", "'"), ("\\\"", "\""), ("\\1", "\001"), ("\\11", "\009"), ("\\111", "\073"), ("\\1007", "\064"), ("\\100A", "\064"), ("\\0", "\000"), ("\\377", "\255"), ("\\18", "\001"), ("\\178", "\015"), ("\\1C", "\001"), ("\\17C", "\015"), ("\\x0", "\000"), ("\\xff", "\255"), ("\\xFF", "\255"), ("\\x1", "\001"), ("\\x11", "\017"), ("\\xag", "\010"), ("\\xAAg", "\170"), ("\\u0000", "\000"), ("\\x67ab", "\u67ab"), ("\\u67ab", "\u67ab"), ("\\uffff", "\uffff"), ("\\U001067ab", "\U001067ab"), ("\\U0010ffff", "\U0010ffff"), ("\\x0000000a", "\010"), ("\\x0000000a2", "\162"), ("\\x0000000ag", "\010"), ("\\x0000000A", "\010"), ("\\x0000000A2", "\162"), ("\\x0000000Ag", "\010"), ("\\x00000000000000000000000000000000000000000000000000000000000000011+", "\017") ] in tst' "test42" (fn _ => List.all checkFromCStringSucc argResList) end; val test43 = let fun checkFromCStringFail arg = WideChar.fromCString arg = NONE in tst' "test43" (fn _ => List.all checkFromCStringFail ["\\", "\\X", "\\=", "\\8", "\\9", "\\c", "\\d", "\\x", "\\U00110000", (* outside the range of Unicode *) "\\xG"]) end; mlton-20100608/regression/withtype.ok0000644000076600000240000000000011404435617016142 0ustar mtfstaffmlton-20100608/regression/withtype.sml0000644000076600000240000000023011404435620016323 0ustar mtfstaff(* withtype.sml *) (* Checks scoping rules of withtype *) type u = int datatype t = T of u * v withtype u = bool and v = u val x = T(true, 6); mlton-20100608/regression/withtype2.ok0000644000076600000240000000000011404435620016216 0ustar mtfstaffmlton-20100608/regression/withtype2.sml0000644000076600000240000000033411404435621016413 0ustar mtfstaff(* withtype2.sml *) (* Checks scoping rules of withtype *) type u = real datatype t = A of v | B of u withtype u = int and v = u val a = A 1.0 val b = B 1 val x : v = 1.0 val y : u = 1 fun uEq (a: u, b: u) = a = b mlton-20100608/regression/withtype3.ok0000644000076600000240000000000011404435620016217 0ustar mtfstaffmlton-20100608/regression/withtype3.sml0000644000076600000240000000032011404435617016414 0ustar mtfstaff(* withtype3.sml *) (* Checks scoping rules of withtype *) type u = real datatype t = T of u * v withtype u = int and v = u val z = T (1, 1.0) val x : v = 1.0 val y : u = 1 fun uEq (a: u, b: u) = a = b mlton-20100608/regression/withtype4.ok0000644000076600000240000000000011404435621016221 0ustar mtfstaffmlton-20100608/regression/withtype4.sml0000644000076600000240000000026611404435617016426 0ustar mtfstaff(* withtype4.sml *) (* Checks scoping rules of withtype *) type u = real datatype t = T of u * v withtype u = int and v = u val x = T(1, 1.0); fun uEq (a: u, b: u) = a = b mlton-20100608/regression/withtype5.ok0000644000076600000240000000000011404435617016227 0ustar mtfstaffmlton-20100608/regression/withtype5.sml0000644000076600000240000000041611404435617016424 0ustar mtfstaff(* withtype.sml *) (* Checks scoping rules of withtype *) type u = int datatype t = T of u * v withtype u = bool and v = u val z = T(true, 6) val y : u = true val x : v = 1 fun tEq (a: t, b: t) = a = b fun uEq (a: u, b: u) = a = b fun vEq (a: v, b: v) = a = b mlton-20100608/regression/word-all.ok0000644000076600000240000000646711404435617016035 0ustar mtfstaffTesting Word2 3 11 3 3 3 2 10 2 2 2 1 1 1 1 1 3 11 3 3 3 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word3 7 111 7 7 7 6 110 6 6 6 3 11 3 3 3 7 111 7 7 7 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word4 F 1111 17 15 F E 1110 16 14 E 7 111 7 7 7 F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word7 7F 1111111 177 127 7F 7E 1111110 176 126 7E 3F 111111 77 63 3F F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word8 FF 11111111 377 255 FF FE 11111110 376 254 FE 7F 1111111 177 127 7F F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word9 1FF 111111111 777 511 1FF 1FE 111111110 776 510 1FE FF 11111111 377 255 FF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word13 1FFF 1111111111111 17777 8191 1FFF 1FFE 1111111111110 17776 8190 1FFE FFF 111111111111 7777 4095 FFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word16 FFFF 1111111111111111 177777 65535 FFFF FFFE 1111111111111110 177776 65534 FFFE 7FFF 111111111111111 77777 32767 7FFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word17 1FFFF 11111111111111111 377777 131071 1FFFF 1FFFE 11111111111111110 377776 131070 1FFFE FFFF 1111111111111111 177777 65535 FFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word20 FFFFF 11111111111111111111 3777777 1048575 FFFFF FFFFE 11111111111111111110 3777776 1048574 FFFFE 7FFFF 1111111111111111111 1777777 524287 7FFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word25 1FFFFFF 1111111111111111111111111 177777777 33554431 1FFFFFF 1FFFFFE 1111111111111111111111110 177777776 33554430 1FFFFFE FFFFFF 111111111111111111111111 77777777 16777215 FFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word30 3FFFFFFF 111111111111111111111111111111 7777777777 1073741823 3FFFFFFF 3FFFFFFE 111111111111111111111111111110 7777777776 1073741822 3FFFFFFE 1FFFFFFF 11111111111111111111111111111 3777777777 536870911 1FFFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word31 7FFFFFFF 1111111111111111111111111111111 17777777777 2147483647 7FFFFFFF 7FFFFFFE 1111111111111111111111111111110 17777777776 2147483646 7FFFFFFE 3FFFFFFF 111111111111111111111111111111 7777777777 1073741823 3FFFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word32 FFFFFFFF 11111111111111111111111111111111 37777777777 4294967295 FFFFFFFF FFFFFFFE 11111111111111111111111111111110 37777777776 4294967294 FFFFFFFE 7FFFFFFF 1111111111111111111111111111111 17777777777 2147483647 7FFFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 Testing Word64 FFFFFFFFFFFFFFFF 1111111111111111111111111111111111111111111111111111111111111111 1777777777777777777777 18446744073709551615 FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFE 1111111111111111111111111111111111111111111111111111111111111110 1777777777777777777776 18446744073709551614 FFFFFFFFFFFFFFFE 7FFFFFFFFFFFFFFF 111111111111111111111111111111111111111111111111111111111111111 777777777777777777777 9223372036854775807 7FFFFFFFFFFFFFFF F 1111 17 15 F 2 10 2 2 2 1 1 1 1 1 0 0 0 0 0 mlton-20100608/regression/word-all.sml0000644000076600000240000001204611404435617016205 0ustar mtfstafffunctor Test (W: WORD) = struct structure LW = LargeWord val zero = W.fromInt 0 val one = W.fromInt 1 val two = W.fromInt 2 val max = W.~ one val words = [max, W.- (max, one), W.div (max, two), W.fromInt 0xF, two, one, zero] fun foreach (l, f) = List.app f l fun for (f: W.word -> unit) = foreach (words, f) structure Answer = struct datatype t = Div | Overflow | Word of W.word val toString = fn Div => "Div" | Overflow => "Overflow" | Word w => W.toString w fun run (f: unit -> W.word): t = Word (f ()) handle General.Div => Div | General.Overflow => Overflow val equals: t * t -> bool = op = end val m = concat ["Word", Int.toString W.wordSize] val _ = print (concat ["Testing ", m, "\n"]) fun err msg = print (concat [m, ": ", concat msg, "\n"]) val _ = for (fn w => print (concat [W.toString w, "\n", "\t", W.fmt StringCvt.BIN w, "\n", "\t", W.fmt StringCvt.OCT w, "\n", "\t", W.fmt StringCvt.DEC w, "\n", "\t", W.fmt StringCvt.HEX w, "\n"])) val _ = foreach ([("+", W.+, LW.+), ("-", W.-, LW.-), ("*", W.*, LW.* ), ("andb", W.andb, LW.andb), ("div", W.div, LW.div), ("max", W.max, LW.max), ("min", W.min, LW.min), ("mod", W.mod, LW.mod), ("orb", W.orb, LW.orb), ("xorb", W.xorb, LW.xorb)], fn (name, f, f') => for (fn w => for (fn w' => let val a = Answer.run (fn () => f (w, w')) val a' = Answer.run (fn () => W.fromLarge (f' (W.toLarge w, W.toLarge w'))) in if Answer.equals (a, a') then () else err [W.toString w, " ", name, " ", W.toString w', " = ", Answer.toString a, " <> ", Answer.toString a'] end))) val _ = for (fn w => if w = valOf (W.fromString (W.toString w)) then () else err ["{from,to}String"]) val _ = foreach ([("<<", W.<<, LW.<<), (">>", W.>>, LW.>>)], fn (name, f, f') => for (fn w => foreach ([0w0, 0w1, 0w2, 0w4, 0w8, 0w15, 0w30, 0wxFF], fn w' => let val a = f (w, w') val a' = W.fromLarge (f' (W.toLarge w, w')) in if a = a' then () else err [W.toString w, " ", name, " ", Word.toString w', " = ", W.toString a, " <> ", W.toString a'] end))) val _ = foreach ([("~>>", W.~>>, LW.~>>)], fn (name, f, f') => for (fn w => foreach ([0w0, 0w1, 0w2, 0w4, 0w8, 0w15, 0w30, 0wxFF], fn w' => let val a = f (w, w') val a' = W.fromLarge (f' (W.toLargeX w, w')) in if a = a' then () else err [W.toString w, " ", name, " ", Word.toString w', " = ", W.toString a, " <> ", W.toString a'] end))) val _ = foreach ([("<", W.<, LW.<), ("<=", W.<=, LW.<=), (">", W.>, LW.>), (">=", W.>=, LW.>=)], fn (name, f, f') => for (fn w => for (fn w' => let val b = f (w, w') val b' = f' (W.toLarge w, W.toLarge w') in if b = b' then () else err [W.toString w, " ", name, " ", W.toString w', " = ", Bool.toString b, " <> ", Bool.toString b'] end))) val _ = foreach ([("compare", W.compare, LW.compare)], fn (name, f, f') => for (fn w => for (fn w' => let val or = f (w, w') val or' = f' (W.toLarge w, W.toLarge w') in if or = or' then () else err [W.toString w, " ", name, " ", W.toString w'] end))) val _ = for (fn w => if w = W.fromLargeInt (W.toLargeInt w) andalso w = W.fromLargeInt (W.toLargeIntX w) andalso (case SOME (W.toInt w) handle Overflow => NONE of NONE => true | SOME i => w = W.fromInt i) andalso (case SOME (W.toIntX w) handle Overflow => NONE of NONE => true | SOME i => w = W.fromInt i) then () else err ["{from,to}Large"]) val _ = for (fn w => let val a = W.notb w val a' = W.fromLarge (LW.notb (W.toLarge w)) in if a = a' then () else err ["notb ", W.toString w, " = ", W.toString a, " <> ", W.toString a'] end) val _ = for (fn w => if W.~ w = W.- (zero, w) then () else err ["~"]) end structure Z = Test (Word2) structure Z = Test (Word3) structure Z = Test (Word4) structure Z = Test (Word7) structure Z = Test (Word8) structure Z = Test (Word9) structure Z = Test (Word13) structure Z = Test (Word16) structure Z = Test (Word17) structure Z = Test (Word20) structure Z = Test (Word25) structure Z = Test (Word30) structure Z = Test (Word31) structure Z = Test (Word32) structure Z = Test (Word64) mlton-20100608/regression/word.ok0000644000076600000240000000174511404435617015261 0ustar mtfstafftest1: OK test3: OK test5a: OK test5b: OK test6a: OK test6b: OK test7a: OK test7b: OK test8a: OK test8b: OK test9a: OK test9b: OK test9c: OK test9d: OK test9e: OK test9f: OK test9g: OK test9h: OK test10a: OK test10b: OK test10c: OK test10d: OK test11a: OK test11b: OK test11c: OK test11d: OK test11e: OK test11f: OK test11g: OK test11h: OK test11i: OK test12a: OK test12b: OK test12c: OK test12d: OK test12e: OK test12f: OK test12g: OK test12h: OK test12i: OK test12j: OK test12k: OK test12l: OK test12m: OK test12n: OK test12o: OK test12p: OK test12r: OK test12s: OK test13a: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test13b: OKOKOKOKOKOKOKOKOKOKOKOK test14a: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test14b: OKOKOKOKOKOKOKOKOKOKOKOK test15a: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test15b: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test16a: OKOKOKOKOKOKOKOKOKOKOKOKOKOK test16b: OKOKOKOKOKOKOKOKOKOKOKOKOK test17a: OKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOK test17b: OKOKOKOKOKOKOKOKOKOKOK test18: OK test19: OK test20: OK test21: OK test22: OK mlton-20100608/regression/word.sml0000644000076600000240000002701211404435620015430 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/word.sml -- some test cases for Word, appropriate for a two's complement machine whose Int.precision = SOME 31 PS 1995-03-19, 1995-07-12, 1995-11-06, 1996-04-01, 1996-10-01 modified to work for Int.precision = SOME 32 -- ME 1998-10-07 *) (*KILL 05/11/1997 11:04. tho.: use "auxil.sml"; *) local (* Isn't this disgusting: *) val [gt, lt, ge, le] = [op>, op<, op>=, op<=] : (int * int -> bool) list val [add, sub, mul, idiv, imod] = [op+, op-, op*, op div, op mod] : (int * int -> int) list open Word; val op > = gt and op < = lt and op >= = ge and op <= = le; val op + = add and op - = sub and op * = mul and op div = idiv and op mod = imod; val i2w = fromInt and w2i = toIntX; fun pr_ln s s' = print (s ^ ": " ^ s' ^ "\n") in val test1 = checkrange (0, 1025) (fn i => i = w2i (i2w i)); val _ = pr_ln "test1" test1 val test3 = checkrange (~1000, 1000) (fn i => i = toIntX (i2w i)); val _ = pr_ln "test3" test3 val test5a = checkrange (0,15) (fn i => (i+960) div 2 * 2 + 1 = w2i (orb (i2w i, i2w 961))); val _ = pr_ln "test5a" test5a val test5b = checkrange (0,513) (fn i => i = w2i (orb (i2w i, i2w i))); val _ = pr_ln "test5b" test5b val test6a = checkrange (0,15) (fn i => i div 2 * 2 = w2i (andb (i2w i, i2w ~2))); val _ = pr_ln "test6a" test6a val test6b = checkrange (0,513) (fn i => i = w2i (andb (i2w i, i2w i))); val _ = pr_ln "test6b" test6b val test7a = checkrange (0,15) (fn i => i+960 = w2i (xorb (i2w i, i2w 960))); val _ = pr_ln "test7a" test7a val test7b = checkrange (0, 513) (fn i => 0 = w2i (xorb (i2w i, i2w i))); val _ = pr_ln "test7b" test7b val test8a = check(~1 = w2i (notb (i2w 0))); val _ = pr_ln "test8a" test8a val test8b = check (0 = w2i (notb (i2w ~1))); val _ = pr_ln "test8b" test8b val maxposint = valOf Int.maxInt; val maxnegint = (Int.~ maxposint)-1; fun pwr2 0 = 1 | pwr2 n = 2 * pwr2 (n-1); fun rwp i 0 = i | rwp i n = rwp i (n-1) div 2; val test9a = checkrange (0,29) (fn k => pwr2 k = w2i (<< (i2w 1, i2w k))); val _ = pr_ln "test9a" test9a val test9b = checkrange (32,65) (fn k => 0 = w2i (<< (i2w 1, i2w k))); val _ = pr_ln "test9b" test9b val test9c = check (maxnegint = w2i (<< (i2w 1, i2w 31))); val _ = pr_ln "test9c" test9c val test9d = checkrange (0, 1025) (fn i => 2 * i = w2i (<< (i2w i, i2w 1))); val _ = pr_ln "test9d" test9d val test9e = checkrange (0, 1025) (fn i => i div 2 = w2i (>> (i2w i, i2w 1))); val _ = pr_ln "test9e" test9e val test9f = checkrange (0,65) (fn k => rwp maxposint k = w2i (>> (i2w maxposint, i2w k))); val _ = pr_ln "test9f" test9f val test9g = checkrange (32,65) (fn k => 0 = w2i (<< (i2w ~1, i2w k))); val _ = pr_ln "test9g" test9g val test9h = checkrange (1,65) (fn k => 0 = w2i (>> (i2w 1, i2w k))); val _ = pr_ln "test9h" test9h val test10a = checkrange (1,65) (fn k => 0 = w2i (~>> (i2w 1, i2w k))); val _ = pr_ln "test10a" test10a val test10b = checkrange (1,65) (fn k => ~1 = w2i (~>> (i2w ~1, i2w k))); val _ = pr_ln "test10b" test10b val test10c = checkrange (~513, 513) (fn i => i div 2 = toIntX (~>> (i2w i, i2w 1))); val _ = pr_ln "test10c" test10c val test10d = checkrange (0,65) (fn k => rwp maxnegint k = toIntX (~>> (i2w maxnegint, i2w k))); val _ = pr_ln "test10d" test10d local open Word in val test11a = check (i2w 256 > i2w 255); val _ = pr_ln "test11a" test11a val test11b = check (i2w 0 < i2w ~1); val _ = pr_ln "test11b" test11b val test11c = check (i2w maxposint >= i2w maxposint); val _ = pr_ln "test11c" test11c val test11d = check (i2w maxnegint >= i2w 127); val _ = pr_ln "test11d" test11d val test11e = check (i2w 1 <= i2w 1); val _ = pr_ln "test11e" test11e val test11f = check (i2w 0 <= i2w 1); val _ = pr_ln "test11f" test11f val test11g = check (i2w 0 < i2w maxposint); val _ = pr_ln "test11g" test11g val test11h = check (i2w maxposint < i2w maxnegint); val _ = pr_ln "test11h" test11h val test11i = check (i2w maxnegint < i2w ~1); val _ = pr_ln "test11i" test11i end; local open Word in val test12a = checkrange(0, 300) (fn k => w2i (i2w k + i2w 17) = add(k, 17)); val _ = pr_ln "test12a" test12a val test12b = checkrange(0, 300) (fn k => w2i (i2w k - i2w 17) = sub(k, 17)); val _ = pr_ln "test12b" test12b val test12c = checkrange(0, 300) (fn k => w2i (i2w k * i2w 17) = mul(k, 17)); val _ = pr_ln "test12c" test12c val test12d = checkrange(0, 300) (fn k => w2i (i2w k div i2w 17) = idiv(k, 17)); val _ = pr_ln "test12d" test12d val test12e = checkrange(0, 300) (fn k => w2i (i2w k mod i2w 17) = imod(k, 17)); val _ = pr_ln "test12e" test12e val test12f = checkrange(0, 300) (fn k => w2i (i2w k + i2w maxnegint) = add(k, maxnegint)); val _ = pr_ln "test12f" test12f val test12g = checkrange(0, 300) (fn k => w2i (i2w maxnegint - i2w k - i2w 1) = sub(maxposint,k)); val _ = pr_ln "test12g" test12g val test12h = checkrange(0, 300) (fn k => w2i (i2w k * i2w maxnegint) = mul(imod(k, 2), maxnegint)); val _ = pr_ln "test12h" test12h val test12i = checkrange(0, 300) (fn k => w2i (i2w k * i2w maxposint + i2w k) = mul(imod(k, 2), maxnegint)); val _ = pr_ln "test12i" test12i val test12j = checkrange(0, 300) (fn k => w2i (i2w k div i2w ~1) = 0); val _ = pr_ln "test12j" test12j val test12k = checkrange(0, 300) (fn k => w2i (i2w k mod i2w ~1) = k); val _ = pr_ln "test12k" test12k val test12l = check(w2i (i2w maxposint + i2w 1) = maxnegint); val _ = pr_ln "test12l" test12l val test12m = check(w2i (i2w maxnegint - i2w 1) = maxposint); val _ = pr_ln "test12m" test12m val test12n = check(w2i (i2w ~1 div i2w 2) = maxposint); val _ = pr_ln "test12n" test12n val test12o = check(w2i (i2w ~1 mod i2w 2) = 1); val _ = pr_ln "test12o" test12o val test12p = check(w2i (i2w ~1 div i2w 100) = idiv(maxposint, 50)); val _ = pr_ln "test12p" test12p (*31bit val test12q = check(w2i (i2w ~1 mod i2w 10) = 7); val _ = pr_ln "test12q" test12q *) val test12r = (i2w 17 div i2w 0 seq "WRONG") handle Div => "OK" | _ => "WRONG"; val _ = pr_ln "test12r" test12r val test12s = (i2w 17 mod i2w 0 seq "WRONG") handle Div => "OK" | _ => "WRONG"; val _ = pr_ln "test12s" test12s fun chk f (s, r) = check'(fn _ => case f s of SOME res => res = i2w r | NONE => false) fun chkScan fmt = chk (StringCvt.scanString (scan fmt)) val test13a = List.map (chk fromString) [("20Af", 8367), (" \n\t20AfGrap", 8367), ("0w20Af", 0 (*8367*)), (" \n\t0w20AfGrap", 0 (*8367*)), ("0", 0), ("0w", 0), ("0W1", 0), ("0w ", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 1), ("0wX1", 1), ("0wx ", 0), ("0wX ", 0)]; val _ = pr_ln "test13a" (concat test13a) val test13b = List.map (fn s => case fromString s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1", "GG"]; val _ = pr_ln "test13b" (concat test13b) val test14a = List.map (chkScan StringCvt.DEC) [("10789", 10789), (" \n\t10789crap", 10789), ("0w10789", 10789), (" \n\t0w10789crap", 10789), ("0", 0), ("0w", 0), ("0W1", 0), ("0w ", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 0), ("0wX1", 0), ("0wx ", 0), ("0wX ", 0)]; val _ = pr_ln "test14a" (concat test14a) val test14b = List.map (fn s => case StringCvt.scanString (scan StringCvt.DEC) s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1", "ff"]; val _ = pr_ln "test14b" (concat test14b) val test15a = List.map (chkScan StringCvt.BIN) [("10010", 18), (" \n\t10010crap", 18), ("0w10010", 18), (" \n\t0w10010crap", 18), ("0", 0), ("0w", 0), ("0W1", 0), ("0w ", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 0), ("0wX1", 0), ("0wx ", 0), ("0wX ", 0)]; val _ = pr_ln "test15a" (concat test15a) val test15b = List.map (fn s => case StringCvt.scanString (scan StringCvt.BIN) s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1", "2", "8", "ff"]; val _ = pr_ln "test15b" (concat test15b) val test16a = List.map (chkScan StringCvt.OCT) [("2071", 1081), (" \n\t2071crap", 1081), ("0w2071", 1081), (" \n\t0w2071crap", 1081), ("0", 0), ("0w", 0), ("0W1", 0), ("0w ", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 0), ("0wX1", 0), ("0wx ", 0), ("0wX ", 0)]; val _ = pr_ln "test16a" (concat test16a) val test16b = List.map (fn s => case StringCvt.scanString (scan StringCvt.OCT) s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1", "8", "ff"]; val _ = pr_ln "test16b" (concat test16b) val test17a = List.map (chkScan StringCvt.HEX) [("20Af", 8367), (" \n\t20AfGrap", 8367), ("0wx20Af", 8367), (" \n\t0wx20AfGrap", 8367), ("0wX20Af", 8367), (" \n\t0wX20AfGrap", 8367), ("0x20Af", 8367), (" \n\t0x20AfGrap", 8367), ("0X20Af", 8367), (" \n\t0X20AfGrap", 8367), ("0", 0), ("0w", 0), ("0w ", 0), ("0w1", 0 (*1*)), ("0W1", 0), ("0wx", 0), ("0wX", 0), ("0wx1", 1), ("0wX1", 1)]; val _ = pr_ln "test17a" (concat test17a) val test17b = List.map (fn s => case StringCvt.scanString (scan StringCvt.HEX) s of NONE => "OK" | _ => "WRONG") ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", "+1", "~1", "-1"]; val _ = pr_ln "test17b" (concat test17b) end; local fun fromToString i = fromString (toString (fromInt i)) = SOME (fromInt i); fun scanFmt radix i = let val w = fromInt i val s = fmt radix w in StringCvt.scanString (scan radix) s = SOME w end; in val test18 = check'(fn _ => range (0, 1200) fromToString); val _ = pr_ln "test18" test18 val test19 = check'(fn _ => range (0, 1200) (scanFmt StringCvt.BIN)); val _ = pr_ln "test19" test19 val test20 = check'(fn _ => range (0, 1200) (scanFmt StringCvt.OCT)); val _ = pr_ln "test20" test20 val test21 = check'(fn _ => range (0, 1200) (scanFmt StringCvt.DEC)); val _ = pr_ln "test21" test21 val test22 = check'(fn _ => range (0, 1200) (scanFmt StringCvt.HEX)); val _ = pr_ln "test22" test22 end end; mlton-20100608/regression/word8array.ok0000644000076600000240000000121511404435617016400 0ustar mtfstaffTesting Word8Array... test1 OK test2 OK test3 OK test4a OK test4b OK test4c OK test5a OK test5b OK test6a OK test6b OK test6c OK test7 OK test8a OK test8b OK test9 OK test9a OK test9b OK test9c OK test9d OK test9e OK test9f OK test9g OK test9h OK test9i OK test10a OK test10b OK test10c OK test10d OK test10e OK test10f OK test10g OK test10h OK test10i OK test11a OK test11b OK test11c OK test11d OK test11e OK test11f OK test11g OK test11h OK test11i OK test11j OK test11k OK mlton-20100608/regression/word8array.sml0000644000076600000240000002020011404435617016555 0ustar mtfstaff(* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/word8array.sml -- some test cases for Word8Array PS 1994-12-21, 1995-05-11 *) (*KILL 05/11/1997 11:05. tho.: use "auxil.sml"; *) val _ = print "Testing Word8Array...\n"; local open Word8Array infix 9 sub; val array0 = fromList []; val copy = fn {src, si, len, dst, di} => Word8ArraySlice.copy {src = Word8ArraySlice.slice (src, si, len), dst = dst, di = di} val extract = fn (a, i, sz) => Word8ArraySlice.vector (Word8ArraySlice.slice (a, i, sz)) in val i2w = Word8.fromInt; val w127 = i2w 127; val a = fromList (map i2w [0,1,2,3,4,5,6]); val b = fromList (map i2w [44,55,66]); val c = fromList (map i2w [0,1,2,3,4,5,6]); val test1:unit = tst' "test1" (fn () => a<>c); val test2:unit = tst' "test2" (fn () => array(0, w127) <> array0 andalso array(0, w127) <> tabulate(0, fn _ => w127) andalso tabulate(0, fn _ => w127) <> fromList [] andalso array(0, w127) <> array(0, w127) andalso tabulate(0, fn _ => w127) <> tabulate(0, fn _ => w127) andalso fromList [] <> fromList []) val d = tabulate(100, fn i => i2w (i mod 7)) val test3:unit = tst' "test3" (fn () => d sub 27 = i2w 6) val test4a:unit = tst0 "test4a" ((tabulate(maxLen+1, i2w) seq "WRONG") handle Overflow => "OK" | Size => "OK" | _ => "WRONG") val test4b:unit = tst0 "test4b" ((tabulate(~1, i2w) seq "WRONG") handle Size => "OK" | _ => "WRONG") val test4c:unit = tst' "test4c" (fn () => length (tabulate(0, fn i => i2w (i div 0))) = 0); val test5a:unit = tst' "test5a" (fn () => length (fromList []) = 0 andalso length a = 7); val test5b:unit = tst' "test5b" (fn () => length array0 = 0); val test6a:unit = tst0 "test6a" ((c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test6b:unit = tst0 "test6b" ((c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test6c:unit = tst' "test6c" (fn () => c sub 0 = i2w 0); val e = array(203, i2w 0); val _ = (copy{src=d, si=0, dst=e, di=0, len=NONE}; copy{src=b, si=0, dst=e, di=length d, len=NONE}; copy{src=d, si=0, dst=e, di=length d + length b, len=NONE}); fun a2v a = extract(a, 0, NONE); val ev = Word8Vector.concat [a2v d, a2v b, a2v d]; val test7:unit = tst' "test7" (fn () => length e = 203); val test8a:unit = tst0 "test8a" ((update(e, ~1, w127); "WRONG") handle Subscript => "OK" | _ => "WRONG") val test8b:unit = tst0 "test8b" ((update(e, length e, w127); "WRONG") handle Subscript => "OK" | _ => "WRONG") val f = extract (e, 100, SOME 3); fun equal (v, v') = let val n = Word8Vector.length v val n' = Word8Vector.length v' fun loop i = i = n orelse (Word8Vector.sub (v, i) = Word8Vector.sub (v', i) andalso loop (i + 1)) in n = n' andalso loop 0 end val test9:unit = tst' "test9" (fn () => equal (f, a2v b)); val test9a:unit = tst' "test9a" (fn () => equal (ev, extract(e, 0, NONE)) andalso equal (ev, extract(e, 0, SOME (length e)))); val test9b:unit = tst' "test9b" (fn () => equal (Word8Vector.fromList [], extract(e, 100, SOME 0))); val test9c:unit = tst0 "test9c" ((extract(e, ~1, SOME (length e)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9d:unit = tst0 "test9d" ((extract(e, length e+1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9e:unit = tst0 "test9e" ((extract(e, 0, SOME (length e+1)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9f:unit = tst0 "test9f" ((extract(e, 20, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9g:unit = tst0 "test9g" ((extract(e, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9h:unit = tst0 "test9h" ((extract(e, length e+1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9i:unit = tst' "test9i" (fn () => equal (a2v (fromList []), extract(e, length e, SOME 0)) andalso equal (a2v (fromList []), extract(e, length e, NONE))); val _ = copy{src=e, si=0, dst=e, di=0, len=NONE}; val g = array(203, w127); val _ = copy{src=e, si=0, dst=g, di=0, len=NONE}; val test10a:unit = tst' "test10a" (fn () => equal (ev, extract(e, 0, NONE)) andalso equal (ev, extract(e, 0, SOME (length e)))); val test10b:unit = tst' "test10b" (fn () => equal (ev, extract(g, 0, NONE)) andalso equal (ev, extract(g, 0, SOME (length g)))); val _ = copy{src=g, si=203, dst=g, di=0, len=SOME 0}; val test10c:unit = tst' "test10c" (fn () => equal (ev, extract(g, 0, NONE))); val _ = copy{src=g, si=0, dst=g, di=203, len=SOME 0}; val test10d:unit = tst' "test10d" (fn () => equal (ev, extract(g, 0, NONE))); val _ = copy{src=g, si=0, dst=g, di=1, len=SOME (length g-1)}; val test10e:unit = tst' "test10e" (fn () => equal (a2v b, extract(g, 101, SOME 3))); val _ = copy{src=g, si=1, dst=g, di=0, len=SOME(length g-1)}; val test10f:unit = tst' "test10f" (fn () => equal (a2v b, extract(g, 100, SOME 3))); val _ = copy{src=g, si=202, dst=g, di=202, len=SOME 1}; val test10g:unit = tst' "test10g" (fn () => g sub 202 = i2w ((202-1-103) mod 7)); val test10h:unit = tst' "test10h" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=NONE}; array0 <> array(0, w127))); val test10i:unit = tst' "test10i" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=SOME 0}; array0 <> array(0, w127))); val test11a:unit = tst0 "test11a" ((copy{src=g, si= ~1, dst=g, di=0, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11b:unit = tst0 "test11b" ((copy{src=g, si=0, dst=g, di= ~1, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11c:unit = tst0 "test11c" ((copy{src=g, si=1, dst=g, di=0, len=NONE}; "OK") handle _ => "WRONG") val test11d:unit = tst0 "test11d" ((copy{src=g, si=0, dst=g, di=1, len=NONE}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11e:unit = tst0 "test11e" ((copy{src=g, si=203, dst=g, di=0, len=NONE}; "OK") handle _ => "WRONG") val test11f:unit = tst0 "test11f" ((copy{src=g, si= ~1, dst=g, di=0, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11g:unit = tst0 "test11g" ((copy{src=g, si=0, dst=g, di= ~1, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11h:unit = tst0 "test11h" ((copy{src=g, si=1, dst=g, di=0, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11i:unit = tst0 "test11i" ((copy{src=g, si=0, dst=g, di=1, len=SOME (length g)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11j:unit = tst0 "test11j" ((copy{src=g, si=0, dst=g, di=0, len=SOME (length g+1)}; "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11k:unit = tst0 "test11k" ((copy{src=g, si=203, dst=g, di=0, len=SOME 1}; "WRONG") handle Subscript => "OK" | _ => "WRONG") end; mlton-20100608/regression/word8vector.ok0000644000076600000240000000074611404435620016566 0ustar mtfstafftest1 OK test2 OK test3 OK test4a OK test4b OK test4c OK test5 OK test6a OK test6b OK test6c OK test7 OK test8 OK test9 OK test9a OK test9b OK test9c OK test9d OK test9e OK test9f OK test9g OK test9h OK test9i OK test_chkiter OK test_chkiteri OK test_chkiteri OK test_chkiteri OK test_chkiteri OK test_chkiteri OK test11f OK test11g OK test11h OK test11i OK mlton-20100608/regression/word8vector.sml0000644000076600000240000001263711404435617016760 0ustar mtfstafftype word8 = Word8.word (* Auxiliary functions for test cases *) infix 1 seq fun e1 seq e2 = e2; fun check b = if b then "OK" else "WRONG"; fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; fun range (from, to) p = let open Int in (from > to) orelse (p from) andalso (range (from+1, to) p) end; fun checkrange bounds = check o range bounds; fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); fun tst s b = tst0 s (check b); fun tst' s f = tst0 s (check' f); fun tstrange s bounds = (tst s) o range bounds (* test/vector.sml -- some test cases for Vector PS 1994-12-10, 1995-06-14 *) (*KILL 05/11/1997 11:05. tho.: use "auxil.sml"; *) local open Word8Vector; fun extract (vec, s, l) = Word8VectorSlice.vector (Word8VectorSlice.slice (vec, s, l)) fun mapi f (vec, s, l) = Word8VectorSlice.mapi (fn (i,x) => f (i+s,x)) (Word8VectorSlice.slice (vec, s, l)) val i2w = Word8.fromInt; infix 9 sub; in val a = fromList (List.map i2w [0,1,2,3,4,5,6]); val b = fromList (List.map i2w [44,55,66]); val c = fromList (List.map i2w [0,1,2,3,4,5,6]); fun equal (v, v') = let val n = Word8Vector.length v val n' = Word8Vector.length v' fun loop i = i = n orelse (Word8Vector.sub (v, i) = Word8Vector.sub (v', i) andalso loop (i + 1)) in n = n' andalso loop 0 end val test1:unit = tst' "test1" (fn _ => not (equal (a,b))); val test2:unit = tst' "test2" (fn _ => equal (a, c)); val d = tabulate(100, fn i => i2w (i mod 7)); val test3:unit = tst' "test3" (fn _ => d sub 27 = i2w 6); val test4a:unit = tst0 "test4a" ((tabulate(maxLen+1, i2w) seq "WRONG") handle Overflow => "OK" | Size => "OK" | _ => "WRONG") val test4b:unit = tst0 "test4b" ((tabulate(~1, i2w) seq "WRONG") handle Size => "OK" | _ => "WRONG") val test4c:unit = tst' "test4c" (fn _ => length (tabulate(0, fn i => i2w (i div 0))) = 0); val test5:unit = tst' "test5" (fn _ => length (fromList []) = 0 andalso length a = 7); val test6a:unit = tst0 "test6a" ((c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test6b:unit = tst0 "test6b" ((c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test6c:unit = tst' "test6c" (fn _ => c sub 0 = i2w 0); val e = concat [d, b, d]; val test7:unit = tst' "test7" (fn _ => length e = 203); val test8:unit = tst' "test8" (fn _ => length (concat []) = 0); val f = extract (e, 100, SOME 3); val test9:unit = tst' "test9" (fn _ => equal (f, b)); val test9a:unit = tst' "test9a" (fn _ => equal (e, extract(e, 0, SOME (length e))) andalso equal (e, extract(e, 0, NONE))); val test9b:unit = tst' "test9b" (fn _ => equal (fromList [], extract(e, 100, SOME 0))); val test9c:unit = tst0 "test9c" ((extract(e, ~1, SOME (length e)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9d:unit = tst0 "test9d" ((extract(e, length e + 1, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9e:unit = tst0 "test9e" ((extract(e, 0, SOME (length e+1)) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9f:unit = tst0 "test9f" ((extract(e, 20, SOME ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9g:unit = tst0 "test9g" ((extract(e, ~1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9h:unit = tst0 "test9h" ((extract(e, length e + 1, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test9i:unit = tst' "test9i" (fn _ => equal (fromList [], extract (e, length e, SOME 0)) andalso equal (fromList [], extract(e, length e, NONE))); fun chkiter iter f vec (res', last') = tst' "test_chkiter" (fn _ => let val last = ref (0w255:word8) val res = iter (fn x => (last := x; f x)) vec in equal (res, res') andalso !last = last' end) fun chkiteri iter f vec (res', last') = tst' "test_chkiteri" (fn _ => let val last = ref ~1 val res = iter (fn (i, x) => (last := i; f x)) vec in equal (res, res') andalso !last = last' end) val test10a:unit = chkiter map (fn x => 0w2*x) b (fromList [0w88,0w110,0w132], 0w66) val test11a:unit = chkiteri mapi (fn x => 0w2*x) (b, 0, NONE) (fromList [0w88,0w110,0w132], 2) val test11b:unit = chkiteri mapi (fn x => 0w2*x) (b, 1, NONE) (fromList [0w110,0w132], 2) val test11c:unit = chkiteri mapi (fn x => 0w2*x) (b, 1, SOME 0) (fromList [], ~1) val test11d:unit = chkiteri mapi (fn x => 0w2*x) (b, 1, SOME 1) (fromList [0w110], 1) val test11e:unit = chkiteri mapi (fn x => 0w2*x) (b, 3, NONE) (fromList [], ~1) val test11f:unit = tst0 "test11f" ((mapi #2 (b, 0, SOME 4) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11g:unit = tst0 "test11g" ((mapi #2 (b, 3, SOME 1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11h:unit = tst0 "test11h" ((mapi #2 (b, 4, SOME 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") val test11i:unit = tst0 "test11i" ((mapi #2 (b, 4, NONE) seq "WRONG") handle Subscript => "OK" | _ => "WRONG") end; mlton-20100608/regression/wordn-array.ok0000644000076600000240000000001611404435617016541 0ustar mtfstaff9 9 9 9 9 9 9 mlton-20100608/regression/wordn-array.sml0000644000076600000240000000057411404435617016734 0ustar mtfstaff(* Make sure that arrays of odd-size words work. *) functor F (W: WORD) = struct val v = Vector.tabulate (10, W.fromInt) val () = print (concat [W.toString (Vector.sub (v, 9)), "\n"]) end structure S = F (Word5) structure S = F (Word7) structure S = F (Word9) structure S = F (Word14) structure S = F (Word17) structure S = F (Word22) structure S = F (Word30) mlton-20100608/regression/world1.ok0000644000076600000240000000004111404435617015502 0ustar mtfstaffI am the original I am the clone mlton-20100608/regression/world1.sml0000644000076600000240000000141311404435617015670 0ustar mtfstafffun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val _ = case save w of Clone => (print "I am the clone\n"; succeed ()) | Original => print "I am the original\n" val _ = run (fn () => load w) val _ = OS.FileSys.remove w mlton-20100608/regression/world2.ok0000644000076600000240000000000311404435620015473 0ustar mtfstaff30 mlton-20100608/regression/world2.sml0000644000076600000240000000164711404435617015702 0ustar mtfstafffun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val a = Array.array (10000, 17) val _ = case save w of Original => () | Clone => (Array.update (a, 0, 13) ; print (concat [Int.toString (Array.sub (a, 0) + Array.sub (a, 1)), "\n"]) ; succeed ()) val _ = run (fn () => load w) val _ = OS.FileSys.remove w mlton-20100608/regression/world3.ok0000644000076600000240000000001311404435620015475 0ustar mtfstaffcaught foo mlton-20100608/regression/world3.sml0000644000076600000240000000155211404435617015676 0ustar mtfstafffun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out exception Foo fun f n = if n = 0 then (case save w of Original => 0 | Clone => raise Foo) else f (n - 1) + 1 val _ = (f 13; ()) handle Foo => (print "caught foo\n"; succeed ()) val _ = run (fn () => load w) val _ = OS.FileSys.remove w mlton-20100608/regression/world4.ok0000644000076600000240000000011511404435620015501 0ustar mtfstaffbefore saves between saves after saves between saves after saves after saves mlton-20100608/regression/world4.sml0000644000076600000240000000223211404435617015673 0ustar mtfstafffun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World val (w1, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val (w2, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val _ = print "before saves\n" val original = ref true val _ = (case save w1 of Clone => original := false | Original => ()) val _ = print "between saves\n" val _ = (case save w2 of Clone => original := false | Original => ()) val _ = print "after saves\n" val _ = if !original then (run (fn () => load w1) ; run (fn () => load w2) ; OS.FileSys.remove w1 ; OS.FileSys.remove w2) else () mlton-20100608/regression/world5.ok0000644000076600000240000000002011404435621015476 0ustar mtfstaffsuccess success mlton-20100608/regression/world5.sml0000644000076600000240000000324111404435617015675 0ustar mtfstafffun run (f: unit -> unit) = case Posix.Process.fork () of SOME pid => let open Posix.Process val (pid', status) = waitpid (W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit ((f (); success) handle _ => failure) end fun succeed () = let open OS.Process in exit success end open MLton.World MLton.Signal Posix.Signal Posix.Process Posix.ProcEnv val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val childReady = ref false fun print s = TextIO.output (TextIO.stdErr, s) val _ = setHandler (usr1, Handler.simple (fn () => childReady := true)) val parent = getpid () val _ = case fork () of NONE => let val canExit = ref false in setHandler (usr1, Handler.handler (fn t => (canExit := true ; saveThread (w, t) ; t))) ; kill (K_PROC parent, usr1) ; let fun loop () = if !canExit then print "success\n" else loop () in loop () end ; let open OS.Process in exit success end end | SOME child => let fun loop () = if !childReady then () else loop () in loop () ; kill (K_PROC child, usr1) ; wait () ; run (fn () => load w) ; OS.FileSys.remove w end mlton-20100608/regression/world6.ok0000644000076600000240000000001711404435617015512 0ustar mtfstaff./world6 a b c mlton-20100608/regression/world6.sml0000644000076600000240000000174711404435620015701 0ustar mtfstafffun run(f: unit -> unit) = case Posix.Process.fork() of SOME pid => let open Posix.Process val (pid', status) = waitpid(W_CHILD pid, []) in if pid = pid' andalso status = W_EXITED then () else raise Fail "child failed" end | NONE => let open OS.Process in exit((f(); success) handle _ => failure) end fun succeed() = let open OS.Process in exit success end open MLton.World val (w, out) = MLton.TextIO.mkstemp "/tmp/world" val _ = TextIO.closeOut out val _ = case save w of Clone => let fun p s = (print s; print "\n") in p (CommandLine.name ()) ; List.app p (CommandLine.arguments ()) ; succeed () end | Original => () val _ = OS.Process.system (concat[CommandLine.name (), " @MLton load-world ", w, " -- a b c"]) val _ = OS.FileSys.remove w mlton-20100608/runtime/0000755000076600000240000000000011404470407013243 5ustar mtfstaffmlton-20100608/runtime/.ignore0000644000076600000240000000004711404435622014530 0ustar mtfstaff*.a gdtoa basis.c c-types.h ml-types.h mlton-20100608/runtime/basis/0000755000076600000240000000000011404470407014344 5ustar mtfstaffmlton-20100608/runtime/basis/coerce.c0000644000076600000240000000134111404435622015747 0ustar mtfstaff#include "platform.h" #include "coerce.h" /* Real coercions depend on rounding mode and can't be inlined where * gcc might constant-fold them. */ #define coerce(n, f, t) \ t f##_##n##To##t (f x) { \ return (t)x; \ } #define bothFromWordCoerce(name, from, to) \ coerce (name, Word##S##from, to) \ coerce (name, Word##U##from, to) #define allWordCoerce(size) \ bothFromWordCoerce(rnd, size, Real32) \ bothFromWordCoerce(rnd, size, Real64) allWordCoerce(8) allWordCoerce(16) allWordCoerce(32) allWordCoerce(64) #undef allWordCoerce #undef bothToWordCoerce #undef bothFromWordCoerce #undef coerce mlton-20100608/runtime/basis/coerce.h0000644000076600000240000000271611404435622015763 0ustar mtfstaff #define coerce(n, f, t) \ MLTON_CODEGEN_STATIC_INLINE \ t f##_##n##To##t (f x) { \ return (t)x; \ } #define bothFromWordCoerce(name, from, to) \ coerce (name, Word##S##from, to) \ coerce (name, Word##U##from, to) #define bothToWordCoerce(name, from, to) \ coerce (name, from, Word##S##to) \ coerce (name, from, Word##U##to) #define allWordCoerce(size) \ bothToWordCoerce(rnd, Real32, size) \ bothToWordCoerce(rnd, Real64, size) \ bothFromWordCoerce(extd, size, Word8) \ bothFromWordCoerce(extd, size, Word16) \ bothFromWordCoerce(extd, size, Word32) \ bothFromWordCoerce(extd, size, Word64) allWordCoerce(8) allWordCoerce(16) allWordCoerce(32) allWordCoerce(64) #undef allWordCoerce #undef bothToWordCoerce #undef bothFromWordCoerce coerce(rnd, Real32, Real32) coerce(rnd, Real32, Real64) coerce(rnd, Real64, Real32) coerce(rnd, Real64, Real64) #undef coerce #define cast(f, t) \ MLTON_CODEGEN_STATIC_INLINE \ t f##_castTo##t (f x) { \ t y; \ memcpy(&y, &x, sizeof(t)); \ return y; \ } cast(Real32, Word32) cast(Word32, Real32) cast(Real64, Word64) cast(Word64, Real64) #undef cast mlton-20100608/runtime/basis/cpointer.c0000644000076600000240000000005511404435622016333 0ustar mtfstaff#include "platform.h" #include "cpointer.h" mlton-20100608/runtime/basis/cpointer.h0000644000076600000240000000225211404435622016341 0ustar mtfstaff MLTON_CODEGEN_STATIC_INLINE Pointer CPointer_add (Pointer p, C_Size_t s); MLTON_CODEGEN_STATIC_INLINE C_Size_t CPointer_diff (Pointer p1, Pointer p2); MLTON_CODEGEN_STATIC_INLINE Bool CPointer_equal (Pointer p1, Pointer p2); MLTON_CODEGEN_STATIC_INLINE Pointer CPointer_fromWord (C_Pointer_t x); MLTON_CODEGEN_STATIC_INLINE Bool CPointer_lt (Pointer p1, Pointer p2); MLTON_CODEGEN_STATIC_INLINE Pointer CPointer_sub (Pointer p, C_Size_t s); MLTON_CODEGEN_STATIC_INLINE C_Pointer_t CPointer_toWord (Pointer p); MLTON_CODEGEN_STATIC_INLINE Pointer CPointer_add (Pointer p, C_Size_t s) { return (p + s); } MLTON_CODEGEN_STATIC_INLINE C_Size_t CPointer_diff (Pointer p1, Pointer p2) { return (size_t)(p1 - p2); } MLTON_CODEGEN_STATIC_INLINE Bool CPointer_equal (Pointer p1, Pointer p2) { return (p1 == p2); } MLTON_CODEGEN_STATIC_INLINE Pointer CPointer_fromWord (C_Pointer_t x) { return (Pointer)x; } MLTON_CODEGEN_STATIC_INLINE Bool CPointer_lt (Pointer p1, Pointer p2) { return (p1 < p2); } MLTON_CODEGEN_STATIC_INLINE Pointer CPointer_sub (Pointer p, C_Size_t s) { return (p - s); } MLTON_CODEGEN_STATIC_INLINE C_Pointer_t CPointer_toWord (Pointer p) { return (C_Pointer_t)p; } mlton-20100608/runtime/basis/MLton/0000755000076600000240000000000011404470407015375 5ustar mtfstaffmlton-20100608/runtime/basis/MLton/bug.c0000644000076600000240000000057311404435622016323 0ustar mtfstaff#include "platform.h" /* print a bug message and exit (2) */ void MLton_bug (String8_t msg) { uintmax_t size = GC_getArrayLength ((pointer)msg); fprintf (stderr, "MLton bug: "); unless (0 == size) while (1 != fwrite ((const void*)msg, (size_t)size, 1, stderr)) /* nothing */; fprintf (stderr, "\nPlease send a bug report to MLton@mlton.org.\n"); exit (2); } mlton-20100608/runtime/basis/MLton/Itimer/0000755000076600000240000000000011404470407016626 5ustar mtfstaffmlton-20100608/runtime/basis/MLton/Itimer/itimer-consts.c0000644000076600000240000000025211404435622021571 0ustar mtfstaff#include "platform.h" const C_Int_t MLton_Itimer_PROF = ITIMER_PROF; const C_Int_t MLton_Itimer_REAL = ITIMER_REAL; const C_Int_t MLton_Itimer_VIRTUAL = ITIMER_VIRTUAL; mlton-20100608/runtime/basis/MLton/Itimer/set.c0000644000076600000240000000074111404435622017567 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) MLton_Itimer_set (C_Int_t which, C_Time_t interval_tv_sec, C_SUSeconds_t interval_tv_usec, C_Time_t value_tv_sec, C_SUSeconds_t value_tv_usec) { struct itimerval v; v.it_interval.tv_sec = interval_tv_sec; v.it_interval.tv_usec = interval_tv_usec; v.it_value.tv_sec = value_tv_sec; v.it_value.tv_usec = value_tv_usec; return setitimer (which, &v, (struct itimerval *)NULL); } mlton-20100608/runtime/basis/MLton/Process/0000755000076600000240000000000011404470407017013 5ustar mtfstaffmlton-20100608/runtime/basis/MLton/Process/spawne.c0000644000076600000240000000243711404435622020462 0ustar mtfstaff#include "platform.h" #if HAS_SPAWN C_Errno_t(C_PId_t) MLton_Process_spawne (NullString8_t pNStr, Array(NullString8_t) aStr, Array(NullString8_t) eStr) { const char *path; char **args; char **env; int aLen; int eLen; char *aSaved; char *eSaved; C_PId_t res; path = (const char *) pNStr; args = (char **) aStr; aLen = GC_getArrayLength((pointer)aStr); aSaved = args[aLen - 1]; args[aLen - 1] = NULL; env = (char **) eStr; eLen = GC_getArrayLength((pointer)eStr); eSaved = env[eLen - 1]; env[eLen - 1] = NULL; res = spawnve (SPAWN_MODE, path, (const char * const *)args, (const char * const *)env); /* spawnve failed */ args[aLen - 1] = aSaved; env[eLen - 1] = eSaved; return (C_Errno_t(C_PId_t))res; } #else __attribute__ ((noreturn)) C_Errno_t(C_PId_t) MLton_Process_spawne (__attribute__ ((unused))NullString8_t pNStr, __attribute__ ((unused))Array(NullString8_t) aStr, __attribute__ ((unused))Array(NullString8_t) ePtr) { die ("MLton_Process_spawne not implemented"); } #endif mlton-20100608/runtime/basis/MLton/Process/spawnp.c0000644000076600000240000000157411404435622020476 0ustar mtfstaff#include "platform.h" #if HAS_SPAWN C_Errno_t(C_PId_t) MLton_Process_spawnp (NullString8_t pNStr, Array(NullString8_t) aStr) { const char *path; char **args; int aLen; char *aSaved; C_PId_t res; path = (const char *) pNStr; args = (char **) aStr; aLen = GC_getArrayLength((pointer)aStr); aSaved = args[aLen - 1]; args[aLen - 1] = NULL; res = spawnvp (SPAWN_MODE, path, (const char * const *)args); /* spawnvp failed */ args[aLen - 1] = aSaved; return (C_Errno_t(C_PId_t))res; } #else __attribute__ ((noreturn)) C_Errno_t(C_PId_t) MLton_Process_spawnp (__attribute__ ((unused)) NullString8_t pNStr, __attribute__ ((unused)) Array(NullString8_t) aStr) { die ("MLton_Process_spawnp not implemented"); } #endif mlton-20100608/runtime/basis/MLton/Rlimit/0000755000076600000240000000000011404470407016635 5ustar mtfstaffmlton-20100608/runtime/basis/MLton/Rlimit/rlimit-consts.c0000644000076600000240000000174511404435622021617 0ustar mtfstaff#include "platform.h" #if (defined (RLIMIT_AS)) const C_Int_t MLton_Rlimit_AS = RLIMIT_AS; #elif (defined (RLIMIT_DATA)) const C_Int_t MLton_Rlimit_AS = RLIMIT_DATA; #else #error MLton_Rlimit_AS not defined #endif const C_Int_t MLton_Rlimit_CORE = RLIMIT_CORE; const C_Int_t MLton_Rlimit_CPU = RLIMIT_CPU; const C_Int_t MLton_Rlimit_DATA = RLIMIT_DATA; const C_Int_t MLton_Rlimit_FSIZE = RLIMIT_FSIZE; /* NOT STANDARD */ #if (defined (RLIMIT_MEMLOCK)) const C_Int_t MLton_Rlimit_MEMLOCK = RLIMIT_MEMLOCK; #else const C_Int_t MLton_Rlimit_MEMLOCK = -1; #endif /* */ const C_Int_t MLton_Rlimit_NOFILE = RLIMIT_NOFILE; /* NOT STANDARD */ #if (defined (RLIMIT_NPROC)) const C_Int_t MLton_Rlimit_NPROC = RLIMIT_NPROC; #else const C_Int_t MLton_Rlimit_NPROC = -1; #endif #if (defined (RLIMIT_RSS)) const C_Int_t MLton_Rlimit_RSS = RLIMIT_RSS; #else const C_Int_t MLton_Rlimit_RSS = -1; #endif /* */ const C_Int_t MLton_Rlimit_STACK = RLIMIT_STACK; const C_RLim_t MLton_Rlimit_INFINITY = RLIM_INFINITY; mlton-20100608/runtime/basis/MLton/Rlimit/rlimit.c0000644000076600000240000000102511404435622020277 0ustar mtfstaff#include "platform.h" static struct rlimit MLton_RLimit_rlimit; C_Errno_t(C_Int_t) MLton_Rlimit_get (C_Int_t r) { return getrlimit (r, &MLton_RLimit_rlimit); } C_RLim_t MLton_Rlimit_getHard (void) { return MLton_RLimit_rlimit.rlim_max; } C_RLim_t MLton_Rlimit_getSoft (void) { return MLton_RLimit_rlimit.rlim_cur; } C_Errno_t(C_Int_t) MLton_Rlimit_set (C_Int_t r, C_RLim_t hard, C_RLim_t soft) { MLton_RLimit_rlimit.rlim_max = hard; MLton_RLimit_rlimit.rlim_cur = soft; return setrlimit (r, &MLton_RLimit_rlimit); } mlton-20100608/runtime/basis/MLton/Rusage/0000755000076600000240000000000011404470407016623 5ustar mtfstaffmlton-20100608/runtime/basis/MLton/Rusage/rusage.c0000644000076600000240000000301411404435622020253 0ustar mtfstaff#include "platform.h" extern struct GC_state gcState; static struct rusage MLton_Rusage_self; static struct rusage MLton_Rusage_children; static struct rusage MLton_Rusage_gc; C_Time_t MLton_Rusage_self_utime_sec (void) { return MLton_Rusage_self.ru_utime.tv_sec; } C_SUSeconds_t MLton_Rusage_self_utime_usec (void) { return MLton_Rusage_self.ru_utime.tv_usec; } C_Time_t MLton_Rusage_self_stime_sec (void) { return MLton_Rusage_self.ru_stime.tv_sec; } C_SUSeconds_t MLton_Rusage_self_stime_usec (void) { return MLton_Rusage_self.ru_stime.tv_usec; } C_Time_t MLton_Rusage_children_utime_sec (void) { return MLton_Rusage_children.ru_utime.tv_sec; } C_SUSeconds_t MLton_Rusage_children_utime_usec (void) { return MLton_Rusage_children.ru_utime.tv_usec; } C_Time_t MLton_Rusage_children_stime_sec (void) { return MLton_Rusage_children.ru_stime.tv_sec; } C_SUSeconds_t MLton_Rusage_children_stime_usec (void) { return MLton_Rusage_children.ru_stime.tv_usec; } C_Time_t MLton_Rusage_gc_utime_sec (void) { return MLton_Rusage_gc.ru_utime.tv_sec; } C_SUSeconds_t MLton_Rusage_gc_utime_usec (void) { return MLton_Rusage_gc.ru_utime.tv_usec; } C_Time_t MLton_Rusage_gc_stime_sec (void) { return MLton_Rusage_gc.ru_stime.tv_sec; } C_SUSeconds_t MLton_Rusage_gc_stime_usec (void) { return MLton_Rusage_gc.ru_stime.tv_usec; } void MLton_Rusage_getrusage (void) { MLton_Rusage_gc = *(GC_getRusageGCAddr (&gcState)); getrusage (RUSAGE_SELF, &MLton_Rusage_self); getrusage (RUSAGE_CHILDREN, &MLton_Rusage_children); } mlton-20100608/runtime/basis/MLton/Syslog/0000755000076600000240000000000011404470407016655 5ustar mtfstaffmlton-20100608/runtime/basis/MLton/Syslog/Syslog-consts.c0000644000076600000240000000413111404435622021607 0ustar mtfstaff#include "platform.h" const C_Int_t MLton_Syslog_Logopt_LOG_CONS = LOG_CONS; const C_Int_t MLton_Syslog_Logopt_LOG_NDELAY = LOG_NDELAY; const C_Int_t MLton_Syslog_Logopt_LOG_NOWAIT = LOG_NOWAIT; const C_Int_t MLton_Syslog_Logopt_LOG_ODELAY = LOG_ODELAY; /* NOT STANDARD */ #if (defined (LOG_PERROR)) const C_Int_t MLton_Syslog_Logopt_LOG_PERROR = LOG_PERROR; #else const C_Int_t MLton_Syslog_Logopt_LOG_PERROR = -1; #endif /* */ const C_Int_t MLton_Syslog_Logopt_LOG_PID = LOG_PID; const C_Int_t MLton_Syslog_Facility_LOG_AUTH = LOG_AUTH; const C_Int_t MLton_Syslog_Facility_LOG_CRON = LOG_CRON; const C_Int_t MLton_Syslog_Facility_LOG_DAEMON = LOG_DAEMON; const C_Int_t MLton_Syslog_Facility_LOG_KERN = LOG_KERN; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL0 = LOG_LOCAL0; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL1 = LOG_LOCAL1; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL2 = LOG_LOCAL2; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL3 = LOG_LOCAL3; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL4 = LOG_LOCAL4; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL5 = LOG_LOCAL5; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL6 = LOG_LOCAL6; const C_Int_t MLton_Syslog_Facility_LOG_LOCAL7 = LOG_LOCAL7; const C_Int_t MLton_Syslog_Facility_LOG_LPR = LOG_LPR; const C_Int_t MLton_Syslog_Facility_LOG_MAIL = LOG_MAIL; const C_Int_t MLton_Syslog_Facility_LOG_NEWS = LOG_NEWS; /* NOT STANDARD */ #if (defined (LOG_SYSLOG)) const C_Int_t MLton_Syslog_Facility_LOG_SYSLOG = LOG_SYSLOG; #else const C_Int_t MLton_Syslog_Facility_LOG_SYSLOG = -1; #endif /* */ const C_Int_t MLton_Syslog_Facility_LOG_USER = LOG_USER; const C_Int_t MLton_Syslog_Facility_LOG_UUCP = LOG_UUCP; const C_Int_t MLton_Syslog_Severity_LOG_ALERT = LOG_ALERT; const C_Int_t MLton_Syslog_Severity_LOG_CRIT = LOG_CRIT; const C_Int_t MLton_Syslog_Severity_LOG_DEBUG = LOG_DEBUG; const C_Int_t MLton_Syslog_Severity_LOG_EMERG = LOG_EMERG; const C_Int_t MLton_Syslog_Severity_LOG_ERR = LOG_ERR; const C_Int_t MLton_Syslog_Severity_LOG_INFO = LOG_INFO; const C_Int_t MLton_Syslog_Severity_LOG_NOTICE = LOG_NOTICE; const C_Int_t MLton_Syslog_Severity_LOG_WARNING = LOG_WARNING; mlton-20100608/runtime/basis/MLton/Syslog/Syslog.c0000644000076600000240000000060711404435622020304 0ustar mtfstaff#include "platform.h" void MLton_Syslog_closelog(void) { closelog(); } /* openlog relies on the string being around forever. */ void MLton_Syslog_openlog(NullString8_t s, C_Int_t o, C_Int_t f) { const char *s_ = strdup ((const char*)s); if (s_ == NULL) s_ = ""; openlog (s_, o, f); } void MLton_Syslog_syslog(C_Int_t p, NullString8_t s) { syslog(p, "%s", (const char*)s); } mlton-20100608/runtime/basis/Net/0000755000076600000240000000000011404470407015072 5ustar mtfstaffmlton-20100608/runtime/basis/Net/Net.c0000644000076600000240000000121011404435622015756 0ustar mtfstaff#include "platform.h" #ifndef DEBUG #define DEBUG FALSE #endif Word32_t Net_htonl (Word32_t w) { Word32_t r = htonl (w); if (DEBUG) printf ("%"PRIx32" = Net_htonl (%"PRIx32")\n", r, w); return r; } Word32_t Net_ntohl (Word32_t w) { Word32_t r = ntohl (w); if (DEBUG) printf ("%"PRIx32" = Net_ntohl (%"PRIx32")\n", r, w); return r; } Word16_t Net_htons (Word16_t w) { Word16_t r = htons (w); if (DEBUG) printf ("%"PRIx16" = Net_htonl (%"PRIx16")\n", r, w); return r; } Word16_t Net_ntohs (Word16_t w) { Word16_t r = ntohs (w); if (DEBUG) printf ("%"PRIx16" = Net_ntohl (%"PRIx16")\n", r, w); return r; } mlton-20100608/runtime/basis/Net/NetHostDB-consts.c0000644000076600000240000000020711404435622020336 0ustar mtfstaff#include "platform.h" const C_Size_t NetHostDB_inAddrSize = sizeof (struct in_addr); const C_Int_t NetHostDB_INADDR_ANY = INADDR_ANY; mlton-20100608/runtime/basis/Net/NetHostDB.c0000644000076600000240000000310311404435622017025 0ustar mtfstaff#include "platform.h" static struct hostent *NetHostDB_hostent; C_String_t NetHostDB_getEntryName(void) { return (C_String_t)(NetHostDB_hostent->h_name); } C_Int_t NetHostDB_getEntryAliasesNum(void) { int num = 0; while (NetHostDB_hostent->h_aliases[num] != NULL) num++; return num; } C_String_t NetHostDB_getEntryAliasesN(C_Int_t n) { return (C_String_t)(NetHostDB_hostent->h_aliases[n]); } C_Int_t NetHostDB_getEntryAddrType(void) { return NetHostDB_hostent->h_addrtype; } C_Int_t NetHostDB_getEntryLength(void) { return NetHostDB_hostent->h_length; } C_Int_t NetHostDB_getEntryAddrsNum(void) { int num = 0; while (NetHostDB_hostent->h_addr_list[num] != NULL) num++; return num; } void NetHostDB_getEntryAddrsN(C_Int_t n, Array(Word8_t) addr) { int i; for (i = 0; i < NetHostDB_hostent->h_length; i++) { ((char*)addr)[i] = NetHostDB_hostent->h_addr_list[n][i]; } return; } C_Int_t NetHostDB_getByAddress(Vector(Word8_t) addr, C_Socklen_t len) { MLton_initSockets (); NetHostDB_hostent = gethostbyaddr((const char*)addr, len, AF_INET); return (C_Int_t)(NetHostDB_hostent != NULL and NetHostDB_hostent->h_name != NULL); } C_Int_t NetHostDB_getByName(NullString8_t name) { MLton_initSockets (); NetHostDB_hostent = gethostbyname((const char*)name); return (C_Int_t)(NetHostDB_hostent != NULL and NetHostDB_hostent->h_name != NULL); } C_Errno_t(C_Int_t) NetHostDB_getHostName(Array(Char8_t) buf, C_Size_t len) { int out; MLton_initSockets (); out = gethostname ((char*)buf, len); if (out == -1) MLton_fixSocketErrno (); return out; } mlton-20100608/runtime/basis/Net/NetProtDB.c0000644000076600000240000000155311404435622017043 0ustar mtfstaff#include "platform.h" static struct protoent *NetProtDB_protoent; C_String_t NetProtDB_getEntryName(void) { return (C_String_t)(NetProtDB_protoent->p_name); } C_Int_t NetProtDB_getEntryAliasesNum(void) { int num = 0; while (NetProtDB_protoent->p_aliases[num] != NULL) num++; return num; } C_String_t NetProtDB_getEntryAliasesN(C_Int_t n) { return (C_String_t)(NetProtDB_protoent->p_aliases[n]); } C_Int_t NetProtDB_getEntryProto(void) { return NetProtDB_protoent->p_proto; } C_Int_t NetProtDB_getByName(NullString8_t name) { NetProtDB_protoent = getprotobyname((const char*)name); return (C_Int_t)(NetProtDB_protoent != NULL and NetProtDB_protoent->p_name != NULL); } C_Int_t NetProtDB_getByNumber(C_Int_t proto) { NetProtDB_protoent = getprotobynumber(proto); return (C_Int_t)(NetProtDB_protoent != NULL and NetProtDB_protoent->p_name != NULL); } mlton-20100608/runtime/basis/Net/NetServDB.c0000644000076600000240000000242211404435622017032 0ustar mtfstaff#define _ISOC99_SOURCE #define _BSD_SOURCE #include "platform.h" static struct servent *NetHostDB_servent; C_String_t NetServDB_getEntryName(void) { return (C_String_t)(NetHostDB_servent->s_name); } C_Int_t NetServDB_getEntryAliasesNum(void) { int num = 0; while (NetHostDB_servent->s_aliases[num] != NULL) num++; return num; } C_String_t NetServDB_getEntryAliasesN(C_Int_t n) { return (C_String_t)(NetHostDB_servent->s_aliases[n]); } C_Int_t NetServDB_getEntryPort(void) { return NetHostDB_servent->s_port; } C_String_t NetServDB_getEntryProto(void) { return (C_String_t)(NetHostDB_servent->s_proto); } C_Int_t NetServDB_getByName(NullString8_t name, NullString8_t proto) { NetHostDB_servent = getservbyname((const char*)name, (const char*)proto); return (C_Int_t)(NetHostDB_servent != NULL and NetHostDB_servent->s_name != NULL); } C_Int_t NetServDB_getByNameNull(NullString8_t name) { return NetServDB_getByName(name, (NullString8_t)NULL); } C_Int_t NetServDB_getByPort(C_Int_t port, NullString8_t proto) { NetHostDB_servent = getservbyport(port, (const char*)proto); return (C_Int_t)(NetHostDB_servent != NULL and NetHostDB_servent->s_name != NULL); } C_Int_t NetServDB_getByPortNull(C_Int_t port) { return NetServDB_getByPort(port, (NullString8_t)NULL); } mlton-20100608/runtime/basis/Net/Socket/0000755000076600000240000000000011404470407016322 5ustar mtfstaffmlton-20100608/runtime/basis/Net/Socket/GenericSock.c0000644000076600000240000000102611404435622020661 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Socket_GenericSock_socket (C_Int_t domain, C_Int_t type, C_Int_t protocol) { int out; MLton_initSockets (); out = socket (domain, type, protocol); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_GenericSock_socketPair (C_Int_t domain, C_Int_t type, C_Int_t protocol, Array(C_Int_t) sv) { int out; MLton_initSockets (); out = socketpair (domain, type, protocol, (int*)sv); if (out == -1) MLton_fixSocketErrno (); return out; } mlton-20100608/runtime/basis/Net/Socket/INetSock-consts.c0000644000076600000240000000022111404435622021447 0ustar mtfstaff#include "platform.h" const C_Int_t Socket_INetSock_Ctl_IPPROTO_TCP = IPPROTO_TCP; const C_Int_t Socket_INetSock_Ctl_TCP_NODELAY = TCP_NODELAY; mlton-20100608/runtime/basis/Net/Socket/INetSock.c0000644000076600000240000000171111404435622020145 0ustar mtfstaff#include "platform.h" void Socket_INetSock_toAddr (Vector(Word8_t) in_addr, Word16_t port, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) { struct sockaddr_in *sa = (struct sockaddr_in*)addr; sa->sin_family = AF_INET; sa->sin_port = (uint16_t)port; sa->sin_addr = *(const struct in_addr*)in_addr; *((socklen_t*)addrlen) = sizeof(struct sockaddr_in); } static uint16_t Socket_INetSock_fromAddr_port; static struct in_addr Socket_INetSock_fromAddr_in_addr; void Socket_INetSock_fromAddr (Vector(Word8_t) addr) { const struct sockaddr_in *sa = (const struct sockaddr_in*)addr; assert(sa->sin_family == AF_INET); Socket_INetSock_fromAddr_port = sa->sin_port; Socket_INetSock_fromAddr_in_addr = sa->sin_addr; } Word16_t Socket_INetSock_getPort (void) { return (Word16_t)Socket_INetSock_fromAddr_port; } void Socket_INetSock_getInAddr (Array(Word8_t) addr) { *(struct in_addr*)addr = Socket_INetSock_fromAddr_in_addr; } mlton-20100608/runtime/basis/Net/Socket/select.c0000644000076600000240000000517011404435622017750 0ustar mtfstaff#include "platform.h" static struct timeval Socket_timeout; static struct timeval *Socket_timeoutPtr; void Socket_setTimeout (C_Time_t sec, C_SUSeconds_t usec) { Socket_timeout.tv_sec = sec; Socket_timeout.tv_usec = usec; Socket_timeoutPtr = &Socket_timeout; } C_Time_t Socket_getTimeout_sec (void) { return Socket_timeout.tv_sec; } C_SUSeconds_t Socket_getTimeout_usec (void) { return Socket_timeout.tv_usec; } void Socket_setTimeoutNull (void) { Socket_timeoutPtr = NULL; } C_Errno_t(C_Int_t) Socket_select (Vector(C_Fd_t) read_vec, Vector(C_Fd_t) write_vec, Vector(C_Fd_t) except_vec, Array(C_Int) read_arr, Array(C_Int) write_arr, Array(C_Int) except_arr) { uintmax_t read_len, write_len, except_len; fd_set read_fd_set, write_fd_set, except_fd_set; fd_set *read_fds, *write_fds, *except_fds; int res; read_len = GC_getArrayLength((pointer)read_vec); if (read_len > 0) { read_fds = &read_fd_set; FD_ZERO(read_fds); for (unsigned int i = 0; i < read_len; i++) { int fd = ((int *)read_vec)[i]; FD_SET (fd, read_fds); } } else { read_fds = NULL; } write_len = GC_getArrayLength((pointer)write_vec); if (write_len > 0) { write_fds = &write_fd_set; FD_ZERO(write_fds); for (unsigned int i = 0; i < write_len; i++) { int fd = ((int *)write_vec)[i]; FD_SET (fd, write_fds); } } else { write_fds = NULL; } except_len = GC_getArrayLength((pointer)except_vec); if (except_len > 0) { except_fds = &except_fd_set; FD_ZERO(except_fds); for (unsigned int i = 0; i < except_len; i++) { int fd = ((int *)except_vec)[i]; FD_SET (fd, except_fds); } } else { except_fds = NULL; } MLton_initSockets (); res = select(FD_SETSIZE, read_fds, write_fds, except_fds, Socket_timeoutPtr); if (res == -1) { MLton_fixSocketErrno(); return res; } if (read_len > 0) { for (unsigned int i = 0; i < read_len; i++) { int fd = ((int *)read_vec)[i]; if (FD_ISSET (fd, read_fds)) { ((int *)read_arr)[i] = 1; } } } if (write_len > 0) { for (unsigned int i = 0; i < write_len; i++) { int fd = ((int *)write_vec)[i]; if (FD_ISSET (fd, write_fds)) { ((int *)write_arr)[i] = 1; } } } if (except_len > 0) { for (unsigned int i = 0; i < except_len; i++) { int fd = ((int *)except_vec)[i]; if (FD_ISSET (fd, except_fds)) { ((int *)except_arr)[i] = 1; } } } return res; } mlton-20100608/runtime/basis/Net/Socket/Socket-consts.c0000644000076600000240000000363311404435622021232 0ustar mtfstaff#include "platform.h" const C_Size_t Socket_sockAddrStorageLen = sizeof (struct sockaddr_storage); const C_Int_t Socket_AF_INET = AF_INET; const C_Int_t Socket_AF_INET6 = AF_INET6; const C_Int_t Socket_AF_UNIX = AF_UNIX; const C_Int_t Socket_AF_UNSPEC = AF_UNSPEC; const C_Int_t Socket_Ctl_SOL_SOCKET = SOL_SOCKET; const C_Int_t Socket_Ctl_SO_ACCEPTCONN = SO_ACCEPTCONN; const C_Int_t Socket_Ctl_SO_BROADCAST = SO_BROADCAST; const C_Int_t Socket_Ctl_SO_DEBUG = SO_DEBUG; const C_Int_t Socket_Ctl_SO_DONTROUTE = SO_DONTROUTE; const C_Int_t Socket_Ctl_SO_ERROR = SO_ERROR; const C_Int_t Socket_Ctl_SO_KEEPALIVE = SO_KEEPALIVE; const C_Int_t Socket_Ctl_SO_LINGER = SO_LINGER; const C_Int_t Socket_Ctl_SO_OOBINLINE = SO_OOBINLINE; const C_Int_t Socket_Ctl_SO_RCVBUF = SO_RCVBUF; const C_Int_t Socket_Ctl_SO_RCVLOWAT = SO_RCVLOWAT; const C_Int_t Socket_Ctl_SO_RCVTIMEO = SO_RCVTIMEO; const C_Int_t Socket_Ctl_SO_REUSEADDR = SO_REUSEADDR; const C_Int_t Socket_Ctl_SO_SNDBUF = SO_SNDBUF; const C_Int_t Socket_Ctl_SO_SNDLOWAT = SO_SNDLOWAT; const C_Int_t Socket_Ctl_SO_SNDTIMEO = SO_SNDTIMEO; const C_Int_t Socket_Ctl_SO_TYPE = SO_TYPE; const C_Int_t Socket_MSG_CTRUNC = MSG_CTRUNC; const C_Int_t Socket_MSG_DONTROUTE = MSG_DONTROUTE; const C_Int_t Socket_MSG_DONTWAIT = MSG_DONTWAIT; const C_Int_t Socket_MSG_EOR = MSG_EOR; const C_Int_t Socket_MSG_OOB = MSG_OOB; const C_Int_t Socket_MSG_PEEK = MSG_PEEK; const C_Int_t Socket_MSG_TRUNC = MSG_TRUNC; const C_Int_t Socket_MSG_WAITALL = MSG_WAITALL; const C_Int_t Socket_SHUT_RD = SHUT_RD; const C_Int_t Socket_SHUT_RDWR = SHUT_RDWR; const C_Int_t Socket_SHUT_WR = SHUT_WR; const C_Int_t Socket_SOCK_DGRAM = SOCK_DGRAM; const C_Int_t Socket_SOCK_RAW = SOCK_RAW; const C_Int_t Socket_SOCK_SEQPACKET = SOCK_SEQPACKET; const C_Int_t Socket_SOCK_STREAM = SOCK_STREAM; const C_Int_t Socket_Ctl_FIONBIO = FIONBIO; const C_Int_t Socket_Ctl_FIONREAD = FIONREAD; const C_Int_t Socket_Ctl_SIOCATMARK = SIOCATMARK; mlton-20100608/runtime/basis/Net/Socket/Socket.c0000644000076600000240000001273711404435622017730 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Socket_accept (C_Sock_t s, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) { int out; MLton_initSockets (); out = accept (s, (struct sockaddr*)addr, (socklen_t*)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_bind (C_Sock_t s, Vector(Word8_t) addr, C_Socklen_t addrlen) { int out; MLton_initSockets (); out = bind (s, (const struct sockaddr*)addr, (socklen_t)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_close(C_Sock_t s) { #ifdef __MINGW32__ int out; MLton_initSockets (); out = closesocket(s); if (out == -1) MLton_fixSocketErrno (); return out; #else return close(s); #endif } C_Errno_t(C_Int_t) Socket_connect (C_Sock_t s, Vector(Word8_t) addr, C_Socklen_t addrlen) { int out; MLton_initSockets (); out = connect (s, (const struct sockaddr*)addr, (socklen_t)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Int_t Socket_familyOfAddr(Vector(Word8_t) addr) { return ((const struct sockaddr*)addr)->sa_family; } C_Errno_t(C_Int_t) Socket_listen (C_Sock_t s, C_Int_t backlog) { int out; MLton_initSockets (); out = listen (s, backlog); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_SSize_t) Socket_recv (C_Sock_t s, Array(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags) { int out; MLton_initSockets (); out = MLton_recv (s, (void*)((char *)msg + start), len, flags); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_SSize_t) Socket_recvFrom (C_Sock_t s, Array(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) { int out; MLton_initSockets (); out = MLton_recvfrom (s, (void*)((char *)msg + start), len, flags, (struct sockaddr*)addr, (socklen_t*)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } static inline C_Errno_t(C_SSize_t) Socket_send (C_Sock_t s, Pointer msg, C_Int_t start, C_Size_t len, C_Int_t flags) { int out; MLton_initSockets (); out = send (s, (void*)((char *)msg + start), len, flags); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_SSize_t) Socket_sendArr (C_Sock_t s, Array(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags) { return Socket_send (s, (Pointer)msg, start, len, flags); } C_Errno_t(C_SSize_t) Socket_sendVec (C_Sock_t s, Vector(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags) { return Socket_send (s, (Pointer)msg, start, len, flags); } static inline C_Errno_t(C_SSize_t) Socket_sendTo (C_Sock_t s, Pointer msg, C_Int_t start, C_Size_t len, C_Int_t flags, Vector(Word8_t) addr, C_Socklen_t addrlen) { int out; MLton_initSockets (); out = sendto (s, (void*)((char *)msg + start), len, flags, (const struct sockaddr*)addr, (socklen_t)addrlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_SSize_t) Socket_sendArrTo (C_Sock_t s, Array(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags, Vector(Word8_t) addr, C_Socklen_t addrlen) { return Socket_sendTo (s, (Pointer)msg, start, len, flags, addr, addrlen); } C_Errno_t(C_SSize_t) Socket_sendVecTo (C_Sock_t s, Vector(Word8_t) msg, C_Int_t start, C_Size_t len, C_Int_t flags, Vector(Word8_t) addr, C_Socklen_t addrlen) { return Socket_sendTo (s, (Pointer)msg, start, len, flags, addr, addrlen); } C_Errno_t(C_Int_t) Socket_shutdown (C_Sock_t s, C_Int_t how) { int out; MLton_initSockets (); out = shutdown (s, how); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getSockOpt (C_Sock_t s, C_Int_t level, C_Int_t optname, Array(Word8_t) optval, Ref(C_Socklen_t) optlen) { int out; MLton_initSockets (); out = getsockopt (s, level, optname, (void*)optval, (socklen_t*)optlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_setSockOpt (C_Sock_t s, C_Int_t level, C_Int_t optname, Vector(Word8_t) optval, C_Socklen_t optlen) { int out; MLton_initSockets (); out = setsockopt (s, level, optname, (const void*)optval, (socklen_t)optlen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getIOCtl (C_Sock_t s, C_Int_t request, Array(Word8_t) argp) { int out; MLton_initSockets (); out = ioctl (s, request, (void*)argp); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_setIOCtl (C_Sock_t s, C_Int_t request, Vector(Word8_t) argp) { int out; MLton_initSockets (); out = ioctl (s, request, (const void*)argp); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getPeerName (C_Sock_t s, Array(Word8_t) name, Ref(C_Socklen_t) namelen) { int out; MLton_initSockets (); out = getpeername (s, (struct sockaddr*)name, (socklen_t*)namelen); if (out == -1) MLton_fixSocketErrno (); return out; } C_Errno_t(C_Int_t) Socket_Ctl_getSockName (C_Sock_t s, Array(Word8_t) name, Ref(C_Socklen_t) namelen) { int out; MLton_initSockets (); out = getsockname (s, (struct sockaddr*)name, (socklen_t*)namelen); if (out == -1) MLton_fixSocketErrno (); return out; } mlton-20100608/runtime/basis/Net/Socket/UnixSock.c0000644000076600000240000000244711404435622020240 0ustar mtfstaff#include "platform.h" #define UNIXSOCK_PATH_MAX (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path)) void Socket_UnixSock_toAddr (NullString8_t path, C_Size_t pathlen, Array(Word8_t) addr, Ref(C_Socklen_t) addrlen) { size_t i; struct sockaddr_un *sa = (struct sockaddr_un*)addr; sa->sun_family = AF_UNIX; i = 0; if (pathlen <= UNIXSOCK_PATH_MAX) { for (i = 0; i < pathlen; i++) { sa->sun_path[i] = ((const char*)path)[i]; } } else { for (i = 0; i < UNIXSOCK_PATH_MAX-1; i++) { sa->sun_path[i] = ((const char*)path)[i]; } sa->sun_path[UNIXSOCK_PATH_MAX-1] = '\000'; } *((socklen_t*)addrlen) = sizeof(struct sockaddr_un); } C_Size_t Socket_UnixSock_pathLen (Vector(Word8_t) addr) { size_t i; const struct sockaddr_un *sa = (const struct sockaddr_un*)addr; i = 0; if (sa->sun_path[i] == '\000') { return UNIXSOCK_PATH_MAX; } else { while (i < UNIXSOCK_PATH_MAX && sa->sun_path[i] != '\000') i++; return i; } } void Socket_UnixSock_fromAddr (Vector(Word8_t) addr, Array(Char8_t) path, C_Size_t pathlen) { size_t i; const struct sockaddr_un *sa = (const struct sockaddr_un*)addr; assert (sa->sun_family == AF_UNIX); for (i = 0; i < pathlen; i++) { ((char*)path)[i] = sa->sun_path[i]; } } #undef UNIXSOCK_PATH_MAX mlton-20100608/runtime/basis/Posix/0000755000076600000240000000000011404470407015446 5ustar mtfstaffmlton-20100608/runtime/basis/Posix/Error-consts.c0000644000076600000240000001553511404435622020223 0ustar mtfstaff#include "platform.h" #ifndef E2BIG #define E2BIG -1 #endif const C_Int_t Posix_Error_E2BIG = E2BIG; #ifndef EACCES #define EACCES -1 #endif const C_Int_t Posix_Error_EACCES = EACCES; #ifndef EADDRINUSE #define EADDRINUSE -1 #endif const C_Int_t Posix_Error_EADDRINUSE = EADDRINUSE; #ifndef EADDRNOTAVAIL #define EADDRNOTAVAIL -1 #endif const C_Int_t Posix_Error_EADDRNOTAVAIL = EADDRNOTAVAIL; #ifndef EAFNOSUPPORT #define EAFNOSUPPORT -1 #endif const C_Int_t Posix_Error_EAFNOSUPPORT = EAFNOSUPPORT; #ifndef EAGAIN #define EAGAIN -1 #endif const C_Int_t Posix_Error_EAGAIN = EAGAIN; #ifndef EALREADY #define EALREADY -1 #endif const C_Int_t Posix_Error_EALREADY = EALREADY; #ifndef EBADF #define EBADF -1 #endif const C_Int_t Posix_Error_EBADF = EBADF; #ifndef EBADMSG #define EBADMSG -1 #endif const C_Int_t Posix_Error_EBADMSG = EBADMSG; #ifndef EBUSY #define EBUSY -1 #endif const C_Int_t Posix_Error_EBUSY = EBUSY; #ifndef ECANCELED #define ECANCELED -1 #endif const C_Int_t Posix_Error_ECANCELED = ECANCELED; #ifndef ECHILD #define ECHILD -1 #endif const C_Int_t Posix_Error_ECHILD = ECHILD; #ifndef ECONNABORTED #define ECONNABORTED -1 #endif const C_Int_t Posix_Error_ECONNABORTED = ECONNABORTED; #ifndef ECONNREFUSED #define ECONNREFUSED -1 #endif const C_Int_t Posix_Error_ECONNREFUSED = ECONNREFUSED; #ifndef ECONNRESET #define ECONNRESET -1 #endif const C_Int_t Posix_Error_ECONNRESET = ECONNRESET; #ifndef EDEADLK #define EDEADLK -1 #endif const C_Int_t Posix_Error_EDEADLK = EDEADLK; #ifndef EDESTADDRREQ #define EDESTADDRREQ -1 #endif const C_Int_t Posix_Error_EDESTADDRREQ = EDESTADDRREQ; #ifndef EDOM #define EDOM -1 #endif const C_Int_t Posix_Error_EDOM = EDOM; #ifndef EDQUOT #define EDQUOT -1 #endif const C_Int_t Posix_Error_EDQUOT = EDQUOT; #ifndef EEXIST #define EEXIST -1 #endif const C_Int_t Posix_Error_EEXIST = EEXIST; #ifndef EFAULT #define EFAULT -1 #endif const C_Int_t Posix_Error_EFAULT = EFAULT; #ifndef EFBIG #define EFBIG -1 #endif const C_Int_t Posix_Error_EFBIG = EFBIG; #ifndef EHOSTUNREACH #define EHOSTUNREACH -1 #endif const C_Int_t Posix_Error_EHOSTUNREACH = EHOSTUNREACH; #ifndef EIDRM #define EIDRM -1 #endif const C_Int_t Posix_Error_EIDRM = EIDRM; #ifndef EILSEQ #define EILSEQ -1 #endif const C_Int_t Posix_Error_EILSEQ = EILSEQ; #ifndef EINPROGRESS #define EINPROGRESS -1 #endif const C_Int_t Posix_Error_EINPROGRESS = EINPROGRESS; #ifndef EINTR #define EINTR -1 #endif const C_Int_t Posix_Error_EINTR = EINTR; #ifndef EINVAL #define EINVAL -1 #endif const C_Int_t Posix_Error_EINVAL = EINVAL; #ifndef EIO #define EIO -1 #endif const C_Int_t Posix_Error_EIO = EIO; #ifndef EISCONN #define EISCONN -1 #endif const C_Int_t Posix_Error_EISCONN = EISCONN; #ifndef EISDIR #define EISDIR -1 #endif const C_Int_t Posix_Error_EISDIR = EISDIR; #ifndef ELOOP #define ELOOP -1 #endif const C_Int_t Posix_Error_ELOOP = ELOOP; #ifndef EMFILE #define EMFILE -1 #endif const C_Int_t Posix_Error_EMFILE = EMFILE; #ifndef EMLINK #define EMLINK -1 #endif const C_Int_t Posix_Error_EMLINK = EMLINK; #ifndef EMSGSIZE #define EMSGSIZE -1 #endif const C_Int_t Posix_Error_EMSGSIZE = EMSGSIZE; #ifndef EMULTIHOP #define EMULTIHOP -1 #endif const C_Int_t Posix_Error_EMULTIHOP = EMULTIHOP; #ifndef ENAMETOOLONG #define ENAMETOOLONG -1 #endif const C_Int_t Posix_Error_ENAMETOOLONG = ENAMETOOLONG; #ifndef ENETDOWN #define ENETDOWN -1 #endif const C_Int_t Posix_Error_ENETDOWN = ENETDOWN; #ifndef ENETRESET #define ENETRESET -1 #endif const C_Int_t Posix_Error_ENETRESET = ENETRESET; #ifndef ENETUNREACH #define ENETUNREACH -1 #endif const C_Int_t Posix_Error_ENETUNREACH = ENETUNREACH; #ifndef ENFILE #define ENFILE -1 #endif const C_Int_t Posix_Error_ENFILE = ENFILE; #ifndef ENOBUFS #define ENOBUFS -1 #endif const C_Int_t Posix_Error_ENOBUFS = ENOBUFS; #ifndef ENODATA #define ENODATA -1 #endif const C_Int_t Posix_Error_ENODATA = ENODATA; #ifndef ENODEV #define ENODEV -1 #endif const C_Int_t Posix_Error_ENODEV = ENODEV; #ifndef ENOENT #define ENOENT -1 #endif const C_Int_t Posix_Error_ENOENT = ENOENT; #ifndef ENOEXEC #define ENOEXEC -1 #endif const C_Int_t Posix_Error_ENOEXEC = ENOEXEC; #ifndef ENOLCK #define ENOLCK -1 #endif const C_Int_t Posix_Error_ENOLCK = ENOLCK; #ifndef ENOLINK #define ENOLINK -1 #endif const C_Int_t Posix_Error_ENOLINK = ENOLINK; #ifndef ENOMEM #define ENOMEM -1 #endif const C_Int_t Posix_Error_ENOMEM = ENOMEM; #ifndef ENOMSG #define ENOMSG -1 #endif const C_Int_t Posix_Error_ENOMSG = ENOMSG; #ifndef ENOPROTOOPT #define ENOPROTOOPT -1 #endif const C_Int_t Posix_Error_ENOPROTOOPT = ENOPROTOOPT; #ifndef ENOSPC #define ENOSPC -1 #endif const C_Int_t Posix_Error_ENOSPC = ENOSPC; #ifndef ENOSR #define ENOSR -1 #endif const C_Int_t Posix_Error_ENOSR = ENOSR; #ifndef ENOSTR #define ENOSTR -1 #endif const C_Int_t Posix_Error_ENOSTR = ENOSTR; #ifndef ENOSYS #define ENOSYS -1 #endif const C_Int_t Posix_Error_ENOSYS = ENOSYS; #ifndef ENOTCONN #define ENOTCONN -1 #endif const C_Int_t Posix_Error_ENOTCONN = ENOTCONN; #ifndef ENOTDIR #define ENOTDIR -1 #endif const C_Int_t Posix_Error_ENOTDIR = ENOTDIR; #ifndef ENOTEMPTY #define ENOTEMPTY -1 #endif const C_Int_t Posix_Error_ENOTEMPTY = ENOTEMPTY; #ifndef ENOTSOCK #define ENOTSOCK -1 #endif const C_Int_t Posix_Error_ENOTSOCK = ENOTSOCK; #ifndef ENOTSUP #define ENOTSUP -1 #endif const C_Int_t Posix_Error_ENOTSUP = ENOTSUP; #ifndef ENOTTY #define ENOTTY -1 #endif const C_Int_t Posix_Error_ENOTTY = ENOTTY; #ifndef ENXIO #define ENXIO -1 #endif const C_Int_t Posix_Error_ENXIO = ENXIO; #ifndef EOPNOTSUPP #define EOPNOTSUPP -1 #endif const C_Int_t Posix_Error_EOPNOTSUPP = EOPNOTSUPP; #ifndef EOVERFLOW #define EOVERFLOW -1 #endif const C_Int_t Posix_Error_EOVERFLOW = EOVERFLOW; #ifndef EPERM #define EPERM -1 #endif const C_Int_t Posix_Error_EPERM = EPERM; #ifndef EPIPE #define EPIPE -1 #endif const C_Int_t Posix_Error_EPIPE = EPIPE; #ifndef EPROTO #define EPROTO -1 #endif const C_Int_t Posix_Error_EPROTO = EPROTO; #ifndef EPROTONOSUPPORT #define EPROTONOSUPPORT -1 #endif const C_Int_t Posix_Error_EPROTONOSUPPORT = EPROTONOSUPPORT; #ifndef EPROTOTYPE #define EPROTOTYPE -1 #endif const C_Int_t Posix_Error_EPROTOTYPE = EPROTOTYPE; #ifndef ERANGE #define ERANGE -1 #endif const C_Int_t Posix_Error_ERANGE = ERANGE; #ifndef EROFS #define EROFS -1 #endif const C_Int_t Posix_Error_EROFS = EROFS; #ifndef ESPIPE #define ESPIPE -1 #endif const C_Int_t Posix_Error_ESPIPE = ESPIPE; #ifndef ESRCH #define ESRCH -1 #endif const C_Int_t Posix_Error_ESRCH = ESRCH; #ifndef ESTALE #define ESTALE -1 #endif const C_Int_t Posix_Error_ESTALE = ESTALE; #ifndef ETIME #define ETIME -1 #endif const C_Int_t Posix_Error_ETIME = ETIME; #ifndef ETIMEDOUT #define ETIMEDOUT -1 #endif const C_Int_t Posix_Error_ETIMEDOUT = ETIMEDOUT; #ifndef ETXTBSY #define ETXTBSY -1 #endif const C_Int_t Posix_Error_ETXTBSY = ETXTBSY; #ifndef EWOULDBLOCK #define EWOULDBLOCK -1 #endif const C_Int_t Posix_Error_EWOULDBLOCK = EWOULDBLOCK; #ifndef EXDEV #define EXDEV -1 #endif const C_Int_t Posix_Error_EXDEV = EXDEV; mlton-20100608/runtime/basis/Posix/Error.c0000644000076600000240000000035311404435622016704 0ustar mtfstaff#include "platform.h" void Posix_Error_clearErrno (void) { errno = 0; } C_Int_t Posix_Error_getErrno (void) { return errno; } C_String_t Posix_Error_strError (C_Int_t n) { char *res = strerror (n); return (C_String_t)res; } mlton-20100608/runtime/basis/Posix/FileSys/0000755000076600000240000000000011404470407017024 5ustar mtfstaffmlton-20100608/runtime/basis/Posix/FileSys/access.c0000644000076600000240000000020711404435622020430 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_access (NullString8_t f, C_Int_t i) { return access ((const char *) f, i); } mlton-20100608/runtime/basis/Posix/FileSys/chdir.c0000644000076600000240000000016511404435622020263 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_chdir(NullString8_t p) { return chdir((const char *) p); } mlton-20100608/runtime/basis/Posix/FileSys/chmod.c0000644000076600000240000000020611404435622020260 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_chmod (NullString8_t p, C_Mode_t m) { return chmod ((const char *) p, m); } mlton-20100608/runtime/basis/Posix/FileSys/chown.c0000644000076600000240000000022311404435622020303 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_chown (NullString8_t p, C_UId_t u, C_GId_t g) { return chown ((const char *) p, u, g); } mlton-20100608/runtime/basis/Posix/FileSys/Dirstream.c0000644000076600000240000000106611404435622021125 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_Dirstream_closeDir (C_DirP_t p) { return closedir ((DIR *) p); } C_Errno_t(C_DirP_t) Posix_FileSys_Dirstream_openDir (NullString8_t p) { DIR *res = opendir ((const char *) p); return (C_Errno_t(C_DirP_t))res; } C_Errno_t(C_String_t) Posix_FileSys_Dirstream_readDir (C_DirP_t d) { struct dirent *e; char *res; e = readdir ((DIR *) d); res = (NULL == e) ? NULL : e->d_name; return (C_Errno_t(C_String_t))res; } void Posix_FileSys_Dirstream_rewindDir (C_DirP_t p) { rewinddir ((DIR *) p); } mlton-20100608/runtime/basis/Posix/FileSys/fchdir.c0000644000076600000240000000014111404435622020423 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_fchdir(C_Fd_t f) { return fchdir(f); } mlton-20100608/runtime/basis/Posix/FileSys/fchmod.c0000644000076600000240000000016211404435622020427 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_fchmod (C_Fd_t f, C_Mode_t m) { return fchmod (f, m); } mlton-20100608/runtime/basis/Posix/FileSys/fchown.c0000644000076600000240000000017711404435622020461 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_fchown (C_Fd_t f, C_UId_t u, C_GId_t g) { return fchown (f, u, g); } mlton-20100608/runtime/basis/Posix/FileSys/FileSys-consts.c0000644000076600000240000001073711404435622022065 0ustar mtfstaff#include "platform.h" const C_Int_t Posix_FileSys_A_F_OK = F_OK; const C_Int_t Posix_FileSys_A_R_OK = R_OK; const C_Int_t Posix_FileSys_A_W_OK = W_OK; const C_Int_t Posix_FileSys_A_X_OK = X_OK; const C_Int_t Posix_FileSys_O_RDONLY = O_RDONLY; const C_Int_t Posix_FileSys_O_RDWR = O_RDWR; const C_Int_t Posix_FileSys_O_WRONLY = O_WRONLY; const C_Int_t Posix_FileSys_O_APPEND = O_APPEND; #ifndef O_BINARY #define O_BINARY 0 #endif const C_Int_t Posix_FileSys_O_BINARY = O_BINARY; const C_Int_t Posix_FileSys_O_CREAT = O_CREAT; #ifndef O_DSYNC #define O_DSYNC 0 #endif const C_Int_t Posix_FileSys_O_DSYNC = O_DSYNC; const C_Int_t Posix_FileSys_O_EXCL = O_EXCL; const C_Int_t Posix_FileSys_O_NOCTTY = O_NOCTTY; const C_Int_t Posix_FileSys_O_NONBLOCK = O_NONBLOCK; #ifndef O_RSYNC #define O_RSYNC 0 #endif const C_Int_t Posix_FileSys_O_RSYNC = O_RSYNC; const C_Int_t Posix_FileSys_O_SYNC = O_SYNC; #ifndef O_TEXT #define O_TEXT 0 #endif const C_Int_t Posix_FileSys_O_TEXT = O_TEXT; const C_Int_t Posix_FileSys_O_TRUNC = O_TRUNC; #ifndef _PC_FILESIZEBITS #define _PC_FILESIZEBITS -1 #endif const C_Int_t Posix_FileSys_PC_FILESIZEBITS = _PC_FILESIZEBITS; #ifndef _PC_LINK_MAX #define _PC_LINK_MAX -1 #endif #ifndef _PC_LINK_MAX #define _PC_LINK_MAX -1 #endif const C_Int_t Posix_FileSys_PC_LINK_MAX = _PC_LINK_MAX; #ifndef _PC_MAX_CANON #define _PC_MAX_CANON -1 #endif const C_Int_t Posix_FileSys_PC_MAX_CANON = _PC_MAX_CANON; #ifndef _PC_MAX_INPUT #define _PC_MAX_INPUT -1 #endif const C_Int_t Posix_FileSys_PC_MAX_INPUT = _PC_MAX_INPUT; #ifndef _PC_NAME_MAX #define _PC_NAME_MAX -1 #endif const C_Int_t Posix_FileSys_PC_NAME_MAX = _PC_NAME_MAX; #ifndef _PC_PATH_MAX #define _PC_PATH_MAX -1 #endif const C_Int_t Posix_FileSys_PC_PATH_MAX = _PC_PATH_MAX; #ifndef _PC_PIPE_BUF #define _PC_PIPE_BUF -1 #endif const C_Int_t Posix_FileSys_PC_PIPE_BUF = _PC_PIPE_BUF; #ifndef _PC_2_SYMLINKS #define _PC_2_SYMLINKS -1 #endif const C_Int_t Posix_FileSys_PC_TWO_SYMLINKS = _PC_2_SYMLINKS; #ifndef _PC_ALLOC_SIZE_MIN #define _PC_ALLOC_SIZE_MIN -1 #endif const C_Int_t Posix_FileSys_PC_ALLOC_SIZE_MIN = _PC_ALLOC_SIZE_MIN; #ifndef _PC_REC_INCR_XFER_SIZE #define _PC_REC_INCR_XFER_SIZE -1 #endif const C_Int_t Posix_FileSys_PC_REC_INCR_XFER_SIZE = _PC_REC_INCR_XFER_SIZE; #ifndef _PC_REC_MAX_XFER_SIZE #define _PC_REC_MAX_XFER_SIZE -1 #endif const C_Int_t Posix_FileSys_PC_REC_MAX_XFER_SIZE = _PC_REC_MAX_XFER_SIZE; #ifndef _PC_REC_MIN_XFER_SIZE #define _PC_REC_MIN_XFER_SIZE -1 #endif const C_Int_t Posix_FileSys_PC_REC_MIN_XFER_SIZE = _PC_REC_MIN_XFER_SIZE; #ifndef _PC_REC_XFER_ALIGN #define _PC_REC_XFER_ALIGN -1 #endif const C_Int_t Posix_FileSys_PC_REC_XFER_ALIGN = _PC_REC_XFER_ALIGN; #ifndef _PC_SYMLINK_MAX #define _PC_SYMLINK_MAX -1 #endif const C_Int_t Posix_FileSys_PC_SYMLINK_MAX = _PC_SYMLINK_MAX; #ifndef _PC_CHOWN_RESTRICTED #define _PC_CHOWN_RESTRICTED -1 #endif const C_Int_t Posix_FileSys_PC_CHOWN_RESTRICTED = _PC_CHOWN_RESTRICTED; #ifndef _PC_NO_TRUNC #define _PC_NO_TRUNC -1 #endif const C_Int_t Posix_FileSys_PC_NO_TRUNC = _PC_NO_TRUNC; #ifndef _PC_VDISABLE #define _PC_VDISABLE -1 #endif const C_Int_t Posix_FileSys_PC_VDISABLE = _PC_VDISABLE; #ifndef _PC_ASYNC_IO #define _PC_ASYNC_IO -1 #endif const C_Int_t Posix_FileSys_PC_ASYNC_IO = _PC_ASYNC_IO; #ifndef _PC_PRIO_IO #define _PC_PRIO_IO -1 #endif const C_Int_t Posix_FileSys_PC_PRIO_IO = _PC_PRIO_IO; #ifndef _PC_SYNC_IO #define _PC_SYNC_IO -1 #endif const C_Int_t Posix_FileSys_PC_SYNC_IO = _PC_SYNC_IO; const C_Mode_t Posix_FileSys_S_IFBLK = S_IFBLK; const C_Mode_t Posix_FileSys_S_IFCHR = S_IFCHR; const C_Mode_t Posix_FileSys_S_IFDIR = S_IFDIR; const C_Mode_t Posix_FileSys_S_IFIFO = S_IFIFO; const C_Mode_t Posix_FileSys_S_IFLNK = S_IFLNK; const C_Mode_t Posix_FileSys_S_IFMT = S_IFMT; const C_Mode_t Posix_FileSys_S_IFREG = S_IFREG; const C_Mode_t Posix_FileSys_S_IFSOCK = S_IFSOCK; const C_Mode_t Posix_FileSys_S_IRGRP = S_IRGRP; const C_Mode_t Posix_FileSys_S_IROTH = S_IROTH; const C_Mode_t Posix_FileSys_S_IRUSR = S_IRUSR; const C_Mode_t Posix_FileSys_S_IRWXG = S_IRWXG; const C_Mode_t Posix_FileSys_S_IRWXO = S_IRWXO; const C_Mode_t Posix_FileSys_S_IRWXU = S_IRWXU; const C_Mode_t Posix_FileSys_S_ISGID = S_ISGID; const C_Mode_t Posix_FileSys_S_ISUID = S_ISUID; const C_Mode_t Posix_FileSys_S_ISVTX = S_ISVTX; const C_Mode_t Posix_FileSys_S_IWGRP = S_IWGRP; const C_Mode_t Posix_FileSys_S_IWOTH = S_IWOTH; const C_Mode_t Posix_FileSys_S_IWUSR = S_IWUSR; const C_Mode_t Posix_FileSys_S_IXGRP = S_IXGRP; const C_Mode_t Posix_FileSys_S_IXOTH = S_IXOTH; const C_Mode_t Posix_FileSys_S_IXUSR = S_IXUSR; mlton-20100608/runtime/basis/Posix/FileSys/fpathconf.c0000644000076600000240000000017011404435622021136 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Long_t) Posix_FileSys_fpathconf (C_Fd_t f, C_Int_t n) { return fpathconf (f, n); } mlton-20100608/runtime/basis/Posix/FileSys/ftruncate.c0000644000076600000240000000016711404435622021167 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_ftruncate (C_Fd_t f, C_Off_t n) { return ftruncate (f, n); } mlton-20100608/runtime/basis/Posix/FileSys/getcwd.c0000644000076600000240000000023411404435622020444 0ustar mtfstaff#include "platform.h" C_String_t Posix_FileSys_getcwd (Array(Char8_t) buf, C_Size_t n) { char *res = getcwd ((char*)buf, n); return (C_String_t)res; } mlton-20100608/runtime/basis/Posix/FileSys/link.c0000644000076600000240000000023411404435622020124 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_link (NullString8_t p1, NullString8_t p2) { return link ((const char *) p1, (const char *) p2); } mlton-20100608/runtime/basis/Posix/FileSys/mkdir.c0000644000076600000240000000020611404435622020274 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_mkdir (NullString8_t p, C_Mode_t m) { return mkdir ((const char *) p, m); } mlton-20100608/runtime/basis/Posix/FileSys/mkfifo.c0000644000076600000240000000021011404435622020434 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_mkfifo (NullString8_t p, C_Mode_t m) { return mkfifo ((const char *) p, m); } mlton-20100608/runtime/basis/Posix/FileSys/open2.c0000644000076600000240000000020111404435622020204 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Fd_t) Posix_FileSys_open2 (NullString8_t p, C_Int_t i) { return open ((const char*)p, i); } mlton-20100608/runtime/basis/Posix/FileSys/open3.c0000644000076600000240000000023011404435622020207 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Fd_t) Posix_FileSys_open3 (NullString8_t p, C_Int_t i, C_Mode_t m) { return open ((const char*)p, i, (mode_t)m); } mlton-20100608/runtime/basis/Posix/FileSys/pathconf.c0000644000076600000240000000021311404435622020766 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Long_t) Posix_FileSys_pathconf (NullString8_t p, C_Int_t n) { return pathconf ((const char *)p, n); } mlton-20100608/runtime/basis/Posix/FileSys/readlink.c0000644000076600000240000000025011404435622020756 0ustar mtfstaff#include "platform.h" C_Errno_t(C_SSize_t) Posix_FileSys_readlink (NullString8_t p, Array(Char8_t) b, C_Size_t n) { return readlink ((const char*)p, (char*)b, n); } mlton-20100608/runtime/basis/Posix/FileSys/rename.c0000644000076600000240000000100411404435622020432 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_rename (NullString8_t p1, NullString8_t p2) { C_Errno_t(C_Int_t) res; res = rename ((const char *) p1, (const char *) p2); #ifdef __MINGW32__ /* the MinGW rename() function does not remove the destination file * if it exists; we emulate the Unix behavior here. */ if ((res != 0) && (errno == EEXIST)) { res = unlink ((const char *) p2); if (res == 0) res = rename((const char *) p1, (const char *) p2); } #endif return res; } mlton-20100608/runtime/basis/Posix/FileSys/rmdir.c0000644000076600000240000000016611404435622020310 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_rmdir (NullString8_t p) { return rmdir ((const char*) p); } mlton-20100608/runtime/basis/Posix/FileSys/ST.c0000644000076600000240000000100511404435622017512 0ustar mtfstaff#include "platform.h" C_Int_t Posix_FileSys_ST_isBlk (C_Mode_t m) { return S_ISBLK(m); } C_Int_t Posix_FileSys_ST_isChr (C_Mode_t m) { return S_ISCHR(m); } C_Int_t Posix_FileSys_ST_isDir (C_Mode_t m) { return S_ISDIR(m); } C_Int_t Posix_FileSys_ST_isFIFO (C_Mode_t m) { return S_ISFIFO(m); } C_Int_t Posix_FileSys_ST_isLink (C_Mode_t m) { return S_ISLNK(m); } C_Int_t Posix_FileSys_ST_isReg (C_Mode_t m) { return S_ISREG(m); } C_Int_t Posix_FileSys_ST_isSock (C_Mode_t m) { return S_ISSOCK(m); } mlton-20100608/runtime/basis/Posix/FileSys/Stat.c0000644000076600000240000000317411404435622020110 0ustar mtfstaff#include "platform.h" static struct stat Posix_FileSys_Stat_statbuf; C_Dev_t Posix_FileSys_Stat_getDev (void) { return Posix_FileSys_Stat_statbuf.st_dev; } C_INo_t Posix_FileSys_Stat_getINo (void) { return Posix_FileSys_Stat_statbuf.st_ino; } C_Mode_t Posix_FileSys_Stat_getMode (void) { return Posix_FileSys_Stat_statbuf.st_mode; } C_NLink_t Posix_FileSys_Stat_getNLink (void) { return Posix_FileSys_Stat_statbuf.st_nlink; } C_UId_t Posix_FileSys_Stat_getUId (void) { return Posix_FileSys_Stat_statbuf.st_uid; } C_GId_t Posix_FileSys_Stat_getGId (void) { return Posix_FileSys_Stat_statbuf.st_gid; } C_Dev_t Posix_FileSys_Stat_getRDev (void) { return Posix_FileSys_Stat_statbuf.st_rdev; } C_Off_t Posix_FileSys_Stat_getSize (void) { return Posix_FileSys_Stat_statbuf.st_size; } C_Time_t Posix_FileSys_Stat_getATime (void) { return Posix_FileSys_Stat_statbuf.st_atime; } C_Time_t Posix_FileSys_Stat_getMTime (void) { return Posix_FileSys_Stat_statbuf.st_mtime; } C_Time_t Posix_FileSys_Stat_getCTime (void) { return Posix_FileSys_Stat_statbuf.st_ctime; } /* C_BlkSize_t Posix_FileSys_Stat_getBlkSize (void) { return Posix_FileSys_Stat_statbuf.st_blksize; } C_BlkCnt_t Posix_FileSys_Stat_getBlkCnt (void) { return Posix_FileSys_Stat_statbuf.st_blocks; } */ C_Errno_t(C_Int_t) Posix_FileSys_Stat_fstat (C_Fd_t f) { return fstat (f, &Posix_FileSys_Stat_statbuf); } C_Errno_t(C_Int_t) Posix_FileSys_Stat_lstat (NullString8_t f) { return lstat ((const char*)f, &Posix_FileSys_Stat_statbuf); } C_Errno_t(C_Int_t) Posix_FileSys_Stat_stat (NullString8_t f) { return stat ((const char*)f, &Posix_FileSys_Stat_statbuf); } mlton-20100608/runtime/basis/Posix/FileSys/symlink.c0000644000076600000240000000024011404435622020652 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_symlink (NullString8_t p1, NullString8_t p2) { return symlink ((const char*) p1, (const char*) p2); } mlton-20100608/runtime/basis/Posix/FileSys/truncate.c0000644000076600000240000000021111404435622021007 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_truncate (NullString8_t p, C_Off_t n) { return truncate ((const char*)p, n); } mlton-20100608/runtime/basis/Posix/FileSys/umask.c0000644000076600000240000000013111404435622020303 0ustar mtfstaff#include "platform.h" C_Mode_t Posix_FileSys_umask (C_Mode_t m) { return umask (m); } mlton-20100608/runtime/basis/Posix/FileSys/unlink.c0000644000076600000240000000017011404435622020466 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_FileSys_unlink (NullString8_t p) { return unlink ((const char*) p); } mlton-20100608/runtime/basis/Posix/FileSys/Utimbuf.c0000644000076600000240000000063411404435622020606 0ustar mtfstaff#include "platform.h" static struct utimbuf Posix_FileSys_Utimbuf_utimbuf; void Posix_FileSys_Utimbuf_setAcTime (C_Time_t t) { Posix_FileSys_Utimbuf_utimbuf.actime = t; } void Posix_FileSys_Utimbuf_setModTime (C_Time_t t) { Posix_FileSys_Utimbuf_utimbuf.modtime = t; } C_Errno_t(C_Int_t) Posix_FileSys_Utimbuf_utime (NullString8_t s) { return utime((const char *)s, &Posix_FileSys_Utimbuf_utimbuf); } mlton-20100608/runtime/basis/Posix/IO/0000755000076600000240000000000011404470407015755 5ustar mtfstaffmlton-20100608/runtime/basis/Posix/IO/close.c0000644000076600000240000000013411404435622017224 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_close (C_Fd_t f) { return close (f); } mlton-20100608/runtime/basis/Posix/IO/dup.c0000644000076600000240000000012711404435622016711 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Fd_t) Posix_IO_dup (C_Fd_t f) { return dup (f); } mlton-20100608/runtime/basis/Posix/IO/dup2.c0000644000076600000240000000015211404435622016771 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Fd_t) Posix_IO_dup2 (C_Fd_t f1, C_Fd_t f2) { return dup2 (f1, f2); } mlton-20100608/runtime/basis/Posix/IO/fcntl-consts.c0000644000076600000240000000064111404435622020537 0ustar mtfstaff#include "platform.h" const C_Int_t Posix_IO_F_DUPFD = F_DUPFD; const C_Int_t Posix_IO_F_GETFD = F_GETFD; const C_Int_t Posix_IO_F_GETFL = F_GETFL; const C_Int_t Posix_IO_F_GETOWN = F_GETOWN; const C_Int_t Posix_IO_F_SETFD = F_SETFD; const C_Int_t Posix_IO_F_SETFL = F_SETFL; const C_Int_t Posix_IO_F_SETOWN = F_SETOWN; const C_Int_t Posix_IO_FD_CLOEXEC = FD_CLOEXEC; const C_Int_t Posix_IO_O_ACCMODE = O_ACCMODE; mlton-20100608/runtime/basis/Posix/IO/fcntl2.c0000644000076600000240000000015311404435622017310 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_fcntl2 (C_Fd_t f, C_Int_t i) { return fcntl (f, i); } mlton-20100608/runtime/basis/Posix/IO/fcntl3.c0000644000076600000240000000017111404435622017311 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_fcntl3 (C_Fd_t f, C_Int_t i, C_Int_t j) { return fcntl (f, i, j); } mlton-20100608/runtime/basis/Posix/IO/FLock-consts.c0000644000076600000240000000073511404435622020433 0ustar mtfstaff#include "platform.h" const C_Int_t Posix_IO_FLock_F_GETLK = F_GETLK; const C_Int_t Posix_IO_FLock_F_SETLK = F_SETLK; const C_Int_t Posix_IO_FLock_F_SETLKW = F_SETLKW; const C_Short_t Posix_IO_FLock_F_RDLCK = F_RDLCK; const C_Short_t Posix_IO_FLock_F_UNLCK = F_UNLCK; const C_Short_t Posix_IO_FLock_F_WRLCK = F_WRLCK; const C_Short_t Posix_IO_FLock_SEEK_CUR = SEEK_CUR; const C_Short_t Posix_IO_FLock_SEEK_END = SEEK_END; const C_Short_t Posix_IO_FLock_SEEK_SET = SEEK_SET; mlton-20100608/runtime/basis/Posix/IO/FLock.c0000644000076600000240000000175311404435622017125 0ustar mtfstaff#include "platform.h" static struct flock Posix_IO_FLock_flock; C_Errno_t(C_Int_t) Posix_IO_FLock_fcntl (C_Fd_t f, C_Int_t cmd) { return fcntl (f, cmd, &Posix_IO_FLock_flock); } C_Short_t Posix_IO_FLock_getType (void) { return Posix_IO_FLock_flock.l_type; } C_Short_t Posix_IO_FLock_getWhence (void) { return Posix_IO_FLock_flock.l_whence; } C_Off_t Posix_IO_FLock_getStart (void) { return Posix_IO_FLock_flock.l_start; } C_Off_t Posix_IO_FLock_getLen (void) { return Posix_IO_FLock_flock.l_len; } C_PId_t Posix_IO_FLock_getPId (void) { return Posix_IO_FLock_flock.l_pid; } void Posix_IO_FLock_setType (C_Short_t x) { Posix_IO_FLock_flock.l_type = x; } void Posix_IO_FLock_setWhence (C_Short_t x) { Posix_IO_FLock_flock.l_whence = x; } void Posix_IO_FLock_setStart (C_Off_t x) { Posix_IO_FLock_flock.l_start = x; } void Posix_IO_FLock_setLen (C_Off_t x) { Posix_IO_FLock_flock.l_len = x; } void Posix_IO_FLock_setPId (C_PId_t x) { Posix_IO_FLock_flock.l_pid = x; } mlton-20100608/runtime/basis/Posix/IO/fsync.c0000644000076600000240000000013411404435622017241 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_fsync (C_Fd_t f) { return fsync (f); } mlton-20100608/runtime/basis/Posix/IO/lseek-consts.c0000644000076600000240000000023311404435622020531 0ustar mtfstaff#include "platform.h" const C_Int_t Posix_IO_SEEK_CUR = SEEK_CUR; const C_Int_t Posix_IO_SEEK_END = SEEK_END; const C_Int_t Posix_IO_SEEK_SET = SEEK_SET; mlton-20100608/runtime/basis/Posix/IO/lseek.c0000644000076600000240000000017011404435622017222 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Off_t) Posix_IO_lseek (C_Fd_t f, C_Off_t i, C_Int_t j) { return lseek (f, i, j); } mlton-20100608/runtime/basis/Posix/IO/pipe.c0000644000076600000240000000015511404435622017057 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_IO_pipe (Array(C_Fd_t) fds) { return pipe ((int *) fds); } mlton-20100608/runtime/basis/Posix/IO/read.c0000644000076600000240000000077711404435622017047 0ustar mtfstaff#include "platform.h" static inline C_Errno_t(C_SSize_t) Posix_IO_read (C_Fd_t fd, Pointer b, C_Int_t i, C_Size_t s) { return read (fd, (void *) ((char *) b + i), s); } C_Errno_t(C_SSize_t) Posix_IO_readChar8 (C_Fd_t fd, Array(Char8) b, C_Int_t i, C_Size_t s) { return Posix_IO_read (fd, (Pointer)b, i, s); } C_Errno_t(C_SSize_t) Posix_IO_readWord8 (C_Fd_t fd, Array(Word8) b, C_Int_t i, C_Size_t s) { return Posix_IO_read (fd, (Pointer)b, i, s); } mlton-20100608/runtime/basis/Posix/IO/write.c0000644000076600000240000000157211404435622017260 0ustar mtfstaff#include "platform.h" static inline C_Errno_t(C_SSize_t) Posix_IO_write (C_Fd_t fd, Pointer b, C_Int_t i, C_Size_t s) { return write (fd, (void *) ((char *) b + i), s); } C_Errno_t(C_SSize_t) Posix_IO_writeChar8Arr (C_Fd_t fd, Array(Char8_t) b, C_Int_t i, C_Size_t s) { return Posix_IO_write (fd, (Pointer)b, i, s); } C_Errno_t(C_SSize_t) Posix_IO_writeChar8Vec (C_Fd_t fd, Vector(Char8_t) b, C_Int_t i, C_Size_t s) { return Posix_IO_write (fd, (Pointer)b, i, s); } C_Errno_t(C_SSize_t) Posix_IO_writeWord8Arr (C_Fd_t fd, Array(Word8_t) b, C_Int_t i, C_Size_t s) { return Posix_IO_write (fd, (Pointer)b, i, s); } C_Errno_t(C_SSize_t) Posix_IO_writeWord8Vec (C_Fd_t fd, Vector(Word8_t) b, C_Int_t i, C_Size_t s) { return Posix_IO_write (fd, (Pointer)b, i, s); } mlton-20100608/runtime/basis/Posix/ProcEnv/0000755000076600000240000000000011404470407017022 5ustar mtfstaffmlton-20100608/runtime/basis/Posix/ProcEnv/environ.c0000644000076600000240000000023611404435622020647 0ustar mtfstaff#include "platform.h" /* Manual initialization is a work-around for a Darwin linker issue. */ C_StringArray_t Posix_ProcEnv_environ = (C_StringArray_t)NULL; mlton-20100608/runtime/basis/Posix/ProcEnv/getenv.c0000644000076600000240000000021511404435622020454 0ustar mtfstaff#include "platform.h" C_String_t Posix_ProcEnv_getenv (NullString8_t s) { char *res = getenv((const char*)s); return (C_String_t)res; } mlton-20100608/runtime/basis/Posix/ProcEnv/getgroups.c0000644000076600000240000000033211404435622021203 0ustar mtfstaff#include "platform.h" C_Int_t Posix_ProcEnv_getgroupsN (void) { return getgroups (0, (gid_t*)NULL); } C_Errno_t(C_Int_t) Posix_ProcEnv_getgroups (C_Int_t i, Array(C_GId_t) a) { return getgroups (i, (gid_t*)a); } mlton-20100608/runtime/basis/Posix/ProcEnv/getlogin.c0000644000076600000240000000021711404435622020776 0ustar mtfstaff#include "platform.h" C_Errno_t(C_String_t) Posix_ProcEnv_getlogin (void) { char *res = getlogin (); return (C_Errno_t(C_String_t))res; } mlton-20100608/runtime/basis/Posix/ProcEnv/isatty.c0000644000076600000240000000013011404435622020475 0ustar mtfstaff#include "platform.h" C_Int_t Posix_ProcEnv_isatty (C_Fd_t f) { return isatty (f); } mlton-20100608/runtime/basis/Posix/ProcEnv/ProcEnv.c0000644000076600000240000000156111404435622020545 0ustar mtfstaff#include "platform.h" C_String_t Posix_ProcEnv_ctermid (void) { char *res = ctermid (NULL); return (C_String_t)res; } C_GId_t Posix_ProcEnv_getegid (void) { return getegid (); } C_UId_t Posix_ProcEnv_geteuid (void) { return geteuid (); } C_GId_t Posix_ProcEnv_getgid (void) { return getgid (); } C_PId_t Posix_ProcEnv_getpid (void) { return getpid (); } C_PId_t Posix_ProcEnv_getppid (void) { return getppid (); } C_PId_t Posix_ProcEnv_getpgrp (void) { return getpgrp (); } C_UId_t Posix_ProcEnv_getuid (void) { return getuid (); } C_Errno_t(C_Int_t) Posix_ProcEnv_setgid (C_GId_t g) { return setgid (g); } C_Errno_t(C_Int_t) Posix_ProcEnv_setpgid (C_PId_t p, C_PId_t g) { return setpgid (p, g); } C_Errno_t(C_PId_t) Posix_ProcEnv_setsid (void) { return setsid (); } C_Errno_t(C_Int_t) Posix_ProcEnv_setuid (C_UId_t u) { return setuid (u); } mlton-20100608/runtime/basis/Posix/ProcEnv/setenv.c0000644000076600000240000000023311404435622020470 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_ProcEnv_setenv (NullString8_t s, NullString8_t v) { return setenv ((const char*)s, (const char*)v, 1); } mlton-20100608/runtime/basis/Posix/ProcEnv/setgroups.c0000644000076600000240000000021611404435622021220 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_ProcEnv_setgroups (C_Int_t i, Vector(C_GId_t) v) { return setgroups (i, (const gid_t*)v); } mlton-20100608/runtime/basis/Posix/ProcEnv/sysconf-consts.c0000644000076600000240000003700311404435622022164 0ustar mtfstaff#include "platform.h" #ifndef _SC_AIO_LISTIO_MAX #define _SC_AIO_LISTIO_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_AIO_LISTIO_MAX = _SC_AIO_LISTIO_MAX; #ifndef _SC_AIO_MAX #define _SC_AIO_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_AIO_MAX = _SC_AIO_MAX; #ifndef _SC_AIO_PRIO_DELTA_MAX #define _SC_AIO_PRIO_DELTA_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX = _SC_AIO_PRIO_DELTA_MAX; #ifndef _SC_ARG_MAX #define _SC_ARG_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_ARG_MAX = _SC_ARG_MAX; #ifndef _SC_ATEXIT_MAX #define _SC_ATEXIT_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_ATEXIT_MAX = _SC_ATEXIT_MAX; #ifndef _SC_BC_BASE_MAX #define _SC_BC_BASE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_BC_BASE_MAX = _SC_BC_BASE_MAX; #ifndef _SC_BC_DIM_MAX #define _SC_BC_DIM_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_BC_DIM_MAX = _SC_BC_DIM_MAX; #ifndef _SC_BC_SCALE_MAX #define _SC_BC_SCALE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_BC_SCALE_MAX = _SC_BC_SCALE_MAX; #ifndef _SC_BC_STRING_MAX #define _SC_BC_STRING_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_BC_STRING_MAX = _SC_BC_STRING_MAX; #ifndef _SC_CHILD_MAX #define _SC_CHILD_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_CHILD_MAX = _SC_CHILD_MAX; #ifndef _SC_CLK_TCK #define _SC_CLK_TCK -1 #endif const C_Int_t Posix_ProcEnv_SC_CLK_TCK = _SC_CLK_TCK; #ifndef _SC_COLL_WEIGHTS_MAX #define _SC_COLL_WEIGHTS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_COLL_WEIGHTS_MAX = _SC_COLL_WEIGHTS_MAX; #ifndef _SC_DELAYTIMER_MAX #define _SC_DELAYTIMER_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_DELAYTIMER_MAX = _SC_DELAYTIMER_MAX; #ifndef _SC_EXPR_NEST_MAX #define _SC_EXPR_NEST_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_EXPR_NEST_MAX = _SC_EXPR_NEST_MAX; #ifndef _SC_HOST_NAME_MAX #define _SC_HOST_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_HOST_NAME_MAX = _SC_HOST_NAME_MAX; #ifndef _SC_IOV_MAX #define _SC_IOV_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_IOV_MAX = _SC_IOV_MAX; #ifndef _SC_LINE_MAX #define _SC_LINE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_LINE_MAX = _SC_LINE_MAX; #ifndef _SC_LOGIN_NAME_MAX #define _SC_LOGIN_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_LOGIN_NAME_MAX = _SC_LOGIN_NAME_MAX; #ifndef _SC_NGROUPS_MAX #define _SC_NGROUPS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_NGROUPS_MAX = _SC_NGROUPS_MAX; #ifndef _SC_GETGR_R_SIZE_MAX #define _SC_GETGR_R_SIZE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_GETGR_R_SIZE_MAX = _SC_GETGR_R_SIZE_MAX; #ifndef _SC_GETPW_R_SIZE_MAX #define _SC_GETPW_R_SIZE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_GETPW_R_SIZE_MAX = _SC_GETPW_R_SIZE_MAX; #ifndef _SC_MQ_OPEN_MAX #define _SC_MQ_OPEN_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_MQ_OPEN_MAX = _SC_MQ_OPEN_MAX; #ifndef _SC_MQ_PRIO_MAX #define _SC_MQ_PRIO_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_MQ_PRIO_MAX = _SC_MQ_PRIO_MAX; #ifndef _SC_OPEN_MAX #define _SC_OPEN_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_OPEN_MAX = _SC_OPEN_MAX; #ifndef _SC_ADVISORY_INFO #define _SC_ADVISORY_INFO -1 #endif const C_Int_t Posix_ProcEnv_SC_ADVISORY_INFO = _SC_ADVISORY_INFO; #ifndef _SC_BARRIERS #define _SC_BARRIERS -1 #endif const C_Int_t Posix_ProcEnv_SC_BARRIERS = _SC_BARRIERS; #ifndef _SC_ASYNCHRONOUS_IO #define _SC_ASYNCHRONOUS_IO -1 #endif const C_Int_t Posix_ProcEnv_SC_ASYNCHRONOUS_IO = _SC_ASYNCHRONOUS_IO; #ifndef _SC_CLOCK_SELECTION #define _SC_CLOCK_SELECTION -1 #endif const C_Int_t Posix_ProcEnv_SC_CLOCK_SELECTION = _SC_CLOCK_SELECTION; #ifndef _SC_CPUTIME #define _SC_CPUTIME -1 #endif const C_Int_t Posix_ProcEnv_SC_CPUTIME = _SC_CPUTIME; #ifndef _SC_FSYNC #define _SC_FSYNC -1 #endif const C_Int_t Posix_ProcEnv_SC_FSYNC = _SC_FSYNC; #ifndef _SC_IPV6 #define _SC_IPV6 -1 #endif const C_Int_t Posix_ProcEnv_SC_IPV6 = _SC_IPV6; #ifndef _SC_JOB_CONTROL #define _SC_JOB_CONTROL -1 #endif const C_Int_t Posix_ProcEnv_SC_JOB_CONTROL = _SC_JOB_CONTROL; #ifndef _SC_MAPPED_FILES #define _SC_MAPPED_FILES -1 #endif const C_Int_t Posix_ProcEnv_SC_MAPPED_FILES = _SC_MAPPED_FILES; #ifndef _SC_MEMLOCK #define _SC_MEMLOCK -1 #endif const C_Int_t Posix_ProcEnv_SC_MEMLOCK = _SC_MEMLOCK; #ifndef _SC_MEMLOCK_RANGE #define _SC_MEMLOCK_RANGE -1 #endif const C_Int_t Posix_ProcEnv_SC_MEMLOCK_RANGE = _SC_MEMLOCK_RANGE; #ifndef _SC_MEMORY_PROTECTION #define _SC_MEMORY_PROTECTION -1 #endif const C_Int_t Posix_ProcEnv_SC_MEMORY_PROTECTION = _SC_MEMORY_PROTECTION; #ifndef _SC_MESSAGE_PASSING #define _SC_MESSAGE_PASSING -1 #endif const C_Int_t Posix_ProcEnv_SC_MESSAGE_PASSING = _SC_MESSAGE_PASSING; #ifndef _SC_MONOTONIC_CLOCK #define _SC_MONOTONIC_CLOCK -1 #endif const C_Int_t Posix_ProcEnv_SC_MONOTONIC_CLOCK = _SC_MONOTONIC_CLOCK; #ifndef _SC_PRIORITIZED_IO #define _SC_PRIORITIZED_IO -1 #endif const C_Int_t Posix_ProcEnv_SC_PRIORITIZED_IO = _SC_PRIORITIZED_IO; #ifndef _SC_PRIORITY_SCHEDULING #define _SC_PRIORITY_SCHEDULING -1 #endif const C_Int_t Posix_ProcEnv_SC_PRIORITY_SCHEDULING = _SC_PRIORITY_SCHEDULING; #ifndef _SC_RAW_SOCKETS #define _SC_RAW_SOCKETS -1 #endif const C_Int_t Posix_ProcEnv_SC_RAW_SOCKETS = _SC_RAW_SOCKETS; #ifndef _SC_READER_WRITER_LOCKS #define _SC_READER_WRITER_LOCKS -1 #endif const C_Int_t Posix_ProcEnv_SC_READER_WRITER_LOCKS = _SC_READER_WRITER_LOCKS; #ifndef _SC_REALTIME_SIGNALS #define _SC_REALTIME_SIGNALS -1 #endif const C_Int_t Posix_ProcEnv_SC_REALTIME_SIGNALS = _SC_REALTIME_SIGNALS; #ifndef _SC_REGEXP #define _SC_REGEXP -1 #endif const C_Int_t Posix_ProcEnv_SC_REGEXP = _SC_REGEXP; #ifndef _SC_SAVED_IDS #define _SC_SAVED_IDS -1 #endif const C_Int_t Posix_ProcEnv_SC_SAVED_IDS = _SC_SAVED_IDS; #ifndef _SC_SEMAPHORES #define _SC_SEMAPHORES -1 #endif const C_Int_t Posix_ProcEnv_SC_SEMAPHORES = _SC_SEMAPHORES; #ifndef _SC_SHARED_MEMORY_OBJECTS #define _SC_SHARED_MEMORY_OBJECTS -1 #endif const C_Int_t Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS = _SC_SHARED_MEMORY_OBJECTS; #ifndef _SC_SHELL #define _SC_SHELL -1 #endif const C_Int_t Posix_ProcEnv_SC_SHELL = _SC_SHELL; #ifndef _SC_SPAWN #define _SC_SPAWN -1 #endif const C_Int_t Posix_ProcEnv_SC_SPAWN = _SC_SPAWN; #ifndef _SC_SPIN_LOCKS #define _SC_SPIN_LOCKS -1 #endif const C_Int_t Posix_ProcEnv_SC_SPIN_LOCKS = _SC_SPIN_LOCKS; #ifndef _SC_SPORADIC_SERVER #define _SC_SPORADIC_SERVER -1 #endif const C_Int_t Posix_ProcEnv_SC_SPORADIC_SERVER = _SC_SPORADIC_SERVER; #ifndef _SC_SS_REPL_MAX #define _SC_SS_REPL_MAX -1 #endif #ifndef _SC_SS_REPL_MAX #define _SC_SS_REPL_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SS_REPL_MAX = _SC_SS_REPL_MAX; #ifndef _SC_SYNCHRONIZED_IO #define _SC_SYNCHRONIZED_IO -1 #endif const C_Int_t Posix_ProcEnv_SC_SYNCHRONIZED_IO = _SC_SYNCHRONIZED_IO; #ifndef _SC_THREAD_ATTR_STACKADDR #define _SC_THREAD_ATTR_STACKADDR -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR = _SC_THREAD_ATTR_STACKADDR; #ifndef _SC_THREAD_ATTR_STACKSIZE #define _SC_THREAD_ATTR_STACKSIZE -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE = _SC_THREAD_ATTR_STACKSIZE; #ifndef _SC_THREAD_CPUTIME #define _SC_THREAD_CPUTIME -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_CPUTIME = _SC_THREAD_CPUTIME; #ifndef _SC_THREAD_PRIO_INHERIT #define _SC_THREAD_PRIO_INHERIT -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_INHERIT = _SC_THREAD_PRIO_INHERIT; #ifndef _SC_THREAD_PRIO_PROTECT #define _SC_THREAD_PRIO_PROTECT -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_PROTECT = _SC_THREAD_PRIO_PROTECT; #ifndef _SC_THREAD_PRIORITY_SCHEDULING #define _SC_THREAD_PRIORITY_SCHEDULING -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING = _SC_THREAD_PRIORITY_SCHEDULING; #ifndef _SC_THREAD_PROCESS_SHARED #define _SC_THREAD_PROCESS_SHARED -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_PROCESS_SHARED = _SC_THREAD_PROCESS_SHARED; #ifndef _SC_THREAD_SAFE_FUNCTIONS #define _SC_THREAD_SAFE_FUNCTIONS -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS = _SC_THREAD_SAFE_FUNCTIONS; #ifndef _SC_THREAD_SPORADIC_SERVER #define _SC_THREAD_SPORADIC_SERVER -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER = _SC_THREAD_SPORADIC_SERVER; #ifndef _SC_THREADS #define _SC_THREADS -1 #endif const C_Int_t Posix_ProcEnv_SC_THREADS = _SC_THREADS; #ifndef _SC_TIMEOUTS #define _SC_TIMEOUTS -1 #endif const C_Int_t Posix_ProcEnv_SC_TIMEOUTS = _SC_TIMEOUTS; #ifndef _SC_TIMERS #define _SC_TIMERS -1 #endif const C_Int_t Posix_ProcEnv_SC_TIMERS = _SC_TIMERS; #ifndef _SC_TRACE #define _SC_TRACE -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE = _SC_TRACE; #ifndef _SC_TRACE_EVENT_FILTER #define _SC_TRACE_EVENT_FILTER -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_FILTER = _SC_TRACE_EVENT_FILTER; #ifndef _SC_TRACE_EVENT_NAME_MAX #define _SC_TRACE_EVENT_NAME_MAX -1 #endif #ifndef _SC_TRACE_EVENT_NAME_MAX #define _SC_TRACE_EVENT_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX = _SC_TRACE_EVENT_NAME_MAX; #ifndef _SC_TRACE_INHERIT #define _SC_TRACE_INHERIT -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_INHERIT = _SC_TRACE_INHERIT; #ifndef _SC_TRACE_LOG #define _SC_TRACE_LOG -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_LOG = _SC_TRACE_LOG; #ifndef _SC_TRACE_NAME_MAX #define _SC_TRACE_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_NAME_MAX = _SC_TRACE_NAME_MAX; #ifndef _SC_TRACE_SYS_MAX #define _SC_TRACE_SYS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_SYS_MAX = _SC_TRACE_SYS_MAX; #ifndef _SC_TRACE_USER_EVENT_MAX #define _SC_TRACE_USER_EVENT_MAX -1 #endif #ifndef _SC_TRACE_USER_EVENT_MAX #define _SC_TRACE_USER_EVENT_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX = _SC_TRACE_USER_EVENT_MAX; #ifndef _SC_TYPED_MEMORY_OBJECTS #define _SC_TYPED_MEMORY_OBJECTS -1 #endif const C_Int_t Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS = _SC_TYPED_MEMORY_OBJECTS; #ifndef _SC_VERSION #define _SC_VERSION -1 #endif const C_Int_t Posix_ProcEnv_SC_VERSION = _SC_VERSION; #ifndef _SC_V6_ILP32_OFF32 #define _SC_V6_ILP32_OFF32 -1 #endif const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFF32 = _SC_V6_ILP32_OFF32; #ifndef _SC_V6_ILP32_OFFBIG #define _SC_V6_ILP32_OFFBIG -1 #endif const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFFBIG = _SC_V6_ILP32_OFFBIG; #ifndef _SC_V6_LP64_OFF64 #define _SC_V6_LP64_OFF64 -1 #endif const C_Int_t Posix_ProcEnv_SC_V6_LP64_OFF64 = _SC_V6_LP64_OFF64; #ifndef _SC_V6_LPBIG_OFFBIG #define _SC_V6_LPBIG_OFFBIG -1 #endif const C_Int_t Posix_ProcEnv_SC_V6_LPBIG_OFFBIG = _SC_V6_LPBIG_OFFBIG; #ifndef _SC_2_C_BIND #define _SC_2_C_BIND -1 #endif const C_Int_t Posix_ProcEnv_SC_2_C_BIND = _SC_2_C_BIND; #ifndef _SC_2_C_DEV #define _SC_2_C_DEV -1 #endif const C_Int_t Posix_ProcEnv_SC_2_C_DEV = _SC_2_C_DEV; #ifndef _SC_2_CHAR_TERM #define _SC_2_CHAR_TERM -1 #endif const C_Int_t Posix_ProcEnv_SC_2_CHAR_TERM = _SC_2_CHAR_TERM; #ifndef _SC_2_FORT_DEV #define _SC_2_FORT_DEV -1 #endif const C_Int_t Posix_ProcEnv_SC_2_FORT_DEV = _SC_2_FORT_DEV; #ifndef _SC_2_FORT_RUN #define _SC_2_FORT_RUN -1 #endif const C_Int_t Posix_ProcEnv_SC_2_FORT_RUN = _SC_2_FORT_RUN; #ifndef _SC_2_LOCALEDEF #define _SC_2_LOCALEDEF -1 #endif const C_Int_t Posix_ProcEnv_SC_2_LOCALEDEF = _SC_2_LOCALEDEF; #ifndef _SC_2_PBS #define _SC_2_PBS -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS = _SC_2_PBS; #ifndef _SC_2_PBS_ACCOUNTING #define _SC_2_PBS_ACCOUNTING -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_ACCOUNTING = _SC_2_PBS_ACCOUNTING; #ifndef _SC_2_PBS_CHECKPOINT #define _SC_2_PBS_CHECKPOINT -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_CHECKPOINT = _SC_2_PBS_CHECKPOINT; #ifndef _SC_2_PBS_LOCATE #define _SC_2_PBS_LOCATE -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_LOCATE = _SC_2_PBS_LOCATE; #ifndef _SC_2_PBS_MESSAGE #define _SC_2_PBS_MESSAGE -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_MESSAGE = _SC_2_PBS_MESSAGE; #ifndef _SC_2_PBS_TRACK #define _SC_2_PBS_TRACK -1 #endif const C_Int_t Posix_ProcEnv_SC_2_PBS_TRACK = _SC_2_PBS_TRACK; #ifndef _SC_2_SW_DEV #define _SC_2_SW_DEV -1 #endif const C_Int_t Posix_ProcEnv_SC_2_SW_DEV = _SC_2_SW_DEV; #ifndef _SC_2_UPE #define _SC_2_UPE -1 #endif const C_Int_t Posix_ProcEnv_SC_2_UPE = _SC_2_UPE; #ifndef _SC_2_VERSION #define _SC_2_VERSION -1 #endif const C_Int_t Posix_ProcEnv_SC_2_VERSION = _SC_2_VERSION; #ifndef _SC_PAGE_SIZE #define _SC_PAGE_SIZE -1 #endif const C_Int_t Posix_ProcEnv_SC_PAGE_SIZE = _SC_PAGE_SIZE; #ifndef _SC_PAGESIZE #define _SC_PAGESIZE -1 #endif const C_Int_t Posix_ProcEnv_SC_PAGESIZE = _SC_PAGESIZE; #ifndef _SC_THREAD_DESTRUCTOR_ITERATIONS #define _SC_THREAD_DESTRUCTOR_ITERATIONS -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS = _SC_THREAD_DESTRUCTOR_ITERATIONS; #ifndef _SC_THREAD_KEYS_MAX #define _SC_THREAD_KEYS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_KEYS_MAX = _SC_THREAD_KEYS_MAX; #ifndef _SC_THREAD_STACK_MIN #define _SC_THREAD_STACK_MIN -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_STACK_MIN = _SC_THREAD_STACK_MIN; #ifndef _SC_THREAD_THREADS_MAX #define _SC_THREAD_THREADS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_THREAD_THREADS_MAX = _SC_THREAD_THREADS_MAX; #ifndef _SC_RE_DUP_MAX #define _SC_RE_DUP_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_RE_DUP_MAX = _SC_RE_DUP_MAX; #ifndef _SC_RTSIG_MAX #define _SC_RTSIG_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_RTSIG_MAX = _SC_RTSIG_MAX; #ifndef _SC_SEM_NSEMS_MAX #define _SC_SEM_NSEMS_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SEM_NSEMS_MAX = _SC_SEM_NSEMS_MAX; #ifndef _SC_SEM_VALUE_MAX #define _SC_SEM_VALUE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SEM_VALUE_MAX = _SC_SEM_VALUE_MAX; #ifndef _SC_SIGQUEUE_MAX #define _SC_SIGQUEUE_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SIGQUEUE_MAX = _SC_SIGQUEUE_MAX; #ifndef _SC_STREAM_MAX #define _SC_STREAM_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_STREAM_MAX = _SC_STREAM_MAX; #ifndef _SC_SYMLOOP_MAX #define _SC_SYMLOOP_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_SYMLOOP_MAX = _SC_SYMLOOP_MAX; #ifndef _SC_TIMER_MAX #define _SC_TIMER_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TIMER_MAX = _SC_TIMER_MAX; #ifndef _SC_TTY_NAME_MAX #define _SC_TTY_NAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TTY_NAME_MAX = _SC_TTY_NAME_MAX; #ifndef _SC_TZNAME_MAX #define _SC_TZNAME_MAX -1 #endif const C_Int_t Posix_ProcEnv_SC_TZNAME_MAX = _SC_TZNAME_MAX; #ifndef _SC_XBS5_ILP32_OFF32 #define _SC_XBS5_ILP32_OFF32 -1 #endif const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFF32 = _SC_XBS5_ILP32_OFF32; #ifndef _SC_XBS5_ILP32_OFFBIG #define _SC_XBS5_ILP32_OFFBIG -1 #endif const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG = _SC_XBS5_ILP32_OFFBIG; #ifndef _SC_XBS5_LP64_OFF64 #define _SC_XBS5_LP64_OFF64 -1 #endif const C_Int_t Posix_ProcEnv_SC_XBS5_LP64_OFF64 = _SC_XBS5_LP64_OFF64; #ifndef _SC_XBS5_LPBIG_OFFBIG #define _SC_XBS5_LPBIG_OFFBIG -1 #endif const C_Int_t Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG = _SC_XBS5_LPBIG_OFFBIG; #ifndef _SC_XOPEN_CRYPT #define _SC_XOPEN_CRYPT -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_CRYPT = _SC_XOPEN_CRYPT; #ifndef _SC_XOPEN_ENH_I18N #define _SC_XOPEN_ENH_I18N -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_ENH_I18N = _SC_XOPEN_ENH_I18N; #ifndef _SC_XOPEN_LEGACY #define _SC_XOPEN_LEGACY -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_LEGACY = _SC_XOPEN_LEGACY; #ifndef _SC_XOPEN_REALTIME #define _SC_XOPEN_REALTIME -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME = _SC_XOPEN_REALTIME; #ifndef _SC_XOPEN_REALTIME_THREADS #define _SC_XOPEN_REALTIME_THREADS -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS = _SC_XOPEN_REALTIME_THREADS; #ifndef _SC_XOPEN_SHM #define _SC_XOPEN_SHM -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_SHM = _SC_XOPEN_SHM; #ifndef _SC_XOPEN_STREAMS #define _SC_XOPEN_STREAMS -1 #endif #ifndef _SC_XOPEN_STREAMS #define _SC_XOPEN_STREAMS -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_STREAMS = _SC_XOPEN_STREAMS; #ifndef _SC_XOPEN_UNIX #define _SC_XOPEN_UNIX -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_UNIX = _SC_XOPEN_UNIX; #ifndef _SC_XOPEN_VERSION #define _SC_XOPEN_VERSION -1 #endif const C_Int_t Posix_ProcEnv_SC_XOPEN_VERSION = _SC_XOPEN_VERSION; mlton-20100608/runtime/basis/Posix/ProcEnv/sysconf.c0000644000076600000240000000014711404435622020654 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Long_t) Posix_ProcEnv_sysconf (C_Int_t i) { return sysconf (i); } mlton-20100608/runtime/basis/Posix/ProcEnv/Times.c0000644000076600000240000000103411404435622020245 0ustar mtfstaff#include "platform.h" static struct tms Posix_ProcEnv_Times_tms; C_Clock_t Posix_ProcEnv_Times_getUTime(void) { return Posix_ProcEnv_Times_tms.tms_utime; } C_Clock_t Posix_ProcEnv_Times_getSTime(void) { return Posix_ProcEnv_Times_tms.tms_stime; } C_Clock_t Posix_ProcEnv_Times_getCUTime(void) { return Posix_ProcEnv_Times_tms.tms_cutime; } C_Clock_t Posix_ProcEnv_Times_getCSTime(void) { return Posix_ProcEnv_Times_tms.tms_cstime; } C_Errno_t(C_Clock_t) Posix_ProcEnv_times(void) { return times(&Posix_ProcEnv_Times_tms); } mlton-20100608/runtime/basis/Posix/ProcEnv/ttyname.c0000644000076600000240000000022211404435622020643 0ustar mtfstaff#include "platform.h" C_Errno_t(C_String_t) Posix_ProcEnv_ttyname (C_Fd_t f) { char *res = ttyname (f); return (C_Errno_t(C_String_t))res; } mlton-20100608/runtime/basis/Posix/ProcEnv/Uname.c0000644000076600000240000000133611404435622020236 0ustar mtfstaff#include "platform.h" static struct utsname Posix_ProcEnv_Uname_utsname; C_String_t Posix_ProcEnv_Uname_getSysName (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.sysname; } C_String_t Posix_ProcEnv_Uname_getNodeName (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.nodename; } C_String_t Posix_ProcEnv_Uname_getRelease (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.release; } C_String_t Posix_ProcEnv_Uname_getVersion (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.version; } C_String_t Posix_ProcEnv_Uname_getMachine (void) { return (C_String_t)Posix_ProcEnv_Uname_utsname.machine; } C_Errno_t(C_Int_t) Posix_ProcEnv_uname (void) { return uname (&Posix_ProcEnv_Uname_utsname); } mlton-20100608/runtime/basis/Posix/Process/0000755000076600000240000000000011404470407017064 5ustar mtfstaffmlton-20100608/runtime/basis/Posix/Process/alarm.c0000644000076600000240000000013111404435622020317 0ustar mtfstaff#include "platform.h" C_UInt_t Posix_Process_alarm (C_UInt_t i) { return alarm (i); } mlton-20100608/runtime/basis/Posix/Process/exece.c0000644000076600000240000000160411404435622020322 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_exece (NullString8_t pNStr, Array(NullString8_t) aStr, Array(NullString8_t) eStr) { const char *path; char **args; char **env; uintmax_t aLen; uintmax_t eLen; char *aSaved; char *eSaved; int res; path = (const char *) pNStr; args = (char **) aStr; aLen = GC_getArrayLength((pointer)aStr); aSaved = args[aLen - 1]; args[aLen - 1] = NULL; env = (char **) eStr; eLen = GC_getArrayLength((pointer)eStr); eSaved = env[eLen - 1]; env[eLen - 1] = NULL; res = EXECVE (path, (char * const *)args, (char * const *)env); /* exece failed */ args[aLen - 1] = aSaved; env[eLen - 1] = eSaved; return (C_Errno_t(C_Int_t))res; } mlton-20100608/runtime/basis/Posix/Process/execp.c0000644000076600000240000000110111404435622020325 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_execp (NullString8_t fNStr, Array(NullString8_t) aStr) { const char *file; char **args; uintmax_t aLen; char *aSaved; int res; file = (const char *) fNStr; args = (char **) aStr; aLen = GC_getArrayLength((pointer)aStr); aSaved = args[aLen - 1]; args[aLen - 1] = NULL; res = EXECVP (file, (char * const *)args); /* execp failed */ args[aLen - 1] = aSaved; return (C_Errno_t(C_Int_t))res; } mlton-20100608/runtime/basis/Posix/Process/exit.c0000644000076600000240000000011611404435622020177 0ustar mtfstaff#include "platform.h" void Posix_Process_exit (C_Status_t i) { exit (i); } mlton-20100608/runtime/basis/Posix/Process/exitStatus.c0000644000076600000240000000017011404435622021403 0ustar mtfstaff#include "platform.h" C_Int_t Posix_Process_exitStatus (C_Status_t s) { int i; i = s; return WEXITSTATUS (i); } mlton-20100608/runtime/basis/Posix/Process/fork.c0000644000076600000240000000060111404435622020166 0ustar mtfstaff#include "platform.h" extern struct GC_state gcState; C_Errno_t(C_PId_t) Posix_Process_fork (void) { pid_t pid = fork (); #if (defined (__Darwin__)) /* Contrary to the documentation, a forked process does not inherit * the alternate signal stack; re-install the alternate signal * stack. */ if (pid == 0) { GC_initSignalStack(&gcState); } #endif return pid; } mlton-20100608/runtime/basis/Posix/Process/ifExited.c0000644000076600000240000000014111404435622020765 0ustar mtfstaff#include "platform.h" C_Int_t Posix_Process_ifExited (C_Status_t s) { return WIFEXITED (s); } mlton-20100608/runtime/basis/Posix/Process/ifSignaled.c0000644000076600000240000000014511404435622021275 0ustar mtfstaff#include "platform.h" C_Int_t Posix_Process_ifSignaled (C_Status_t s) { return WIFSIGNALED (s); } mlton-20100608/runtime/basis/Posix/Process/ifStopped.c0000644000076600000240000000014311404435622021163 0ustar mtfstaff#include "platform.h" C_Int_t Posix_Process_ifStopped (C_Status_t s) { return WIFSTOPPED (s); } mlton-20100608/runtime/basis/Posix/Process/kill.c0000644000076600000240000000016111404435622020161 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_kill (C_PId_t p, C_Signal_t s) { return kill (p, s); } mlton-20100608/runtime/basis/Posix/Process/nanosleep.c0000644000076600000240000000057211404435622021220 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_nanosleep (Ref(C_Time_t) sec, Ref(C_Long_t) nsec) { struct timespec rem; struct timespec req; int res; req.tv_sec = *((time_t*)sec); req.tv_nsec =*((long*)nsec); rem.tv_sec = 0; rem.tv_nsec = 0; res = nanosleep (&req, &rem); *((time_t*)sec) = rem.tv_sec; *((long*)nsec) = rem.tv_nsec; return res; } mlton-20100608/runtime/basis/Posix/Process/pause.c0000644000076600000240000000013411404435622020343 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) Posix_Process_pause (void) { return pause (); } mlton-20100608/runtime/basis/Posix/Process/sleep.c0000644000076600000240000000013111404435622020333 0ustar mtfstaff#include "platform.h" C_UInt_t Posix_Process_sleep (C_UInt_t i) { return sleep (i); } mlton-20100608/runtime/basis/Posix/Process/stopSig.c0000644000076600000240000000016511404435622020662 0ustar mtfstaff#include "platform.h" C_Signal_t Posix_Process_stopSig (C_Status_t s) { int i; i = s; return WSTOPSIG (i); } mlton-20100608/runtime/basis/Posix/Process/system.c0000644000076600000240000000017711404435622020561 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Status_t) Posix_Process_system (NullString8_t cmd) { return system ((const char*) cmd); } mlton-20100608/runtime/basis/Posix/Process/termSig.c0000644000076600000240000000014211404435622020637 0ustar mtfstaff#include "platform.h" C_Signal_t Posix_Process_termSig (C_Status_t s) { return WTERMSIG (s); } mlton-20100608/runtime/basis/Posix/Process/waitpid-consts.c0000644000076600000240000000026411404435622022202 0ustar mtfstaff#include "platform.h" // const C_Int_t Posix_Process_W_CONTINUED = WCONTINUED; const C_Int_t Posix_Process_W_NOHANG = WNOHANG; const C_Int_t Posix_Process_W_UNTRACED = WUNTRACED; mlton-20100608/runtime/basis/Posix/Process/waitpid.c0000644000076600000240000000022011404435622020663 0ustar mtfstaff#include "platform.h" C_Errno_t(C_PId_t) Posix_Process_waitpid (C_PId_t p, Ref(C_Status_t) s, C_Int_t i) { return waitpid (p, (int*)s, i); } mlton-20100608/runtime/basis/Posix/Signal-consts.c0000644000076600000240000000551511404435622020344 0ustar mtfstaff#include "platform.h" #if (defined (NSIG)) const C_Int_t Posix_Signal_NSIG = NSIG; #elif (defined (_NSIG)) const C_Int_t Posix_Signal_NSIG = _NSIG; #else #error Posix_Signal_numSignals not defined #endif const C_Int_t Posix_Signal_SIG_BLOCK = SIG_BLOCK; const C_Int_t Posix_Signal_SIG_SETMASK = SIG_SETMASK; const C_Int_t Posix_Signal_SIG_UNBLOCK = SIG_UNBLOCK; #ifndef SIGABRT #define SIGABRT -1 #endif const C_Signal_t Posix_Signal_SIGABRT = SIGABRT; #ifndef SIGALRM #define SIGALRM -1 #endif const C_Signal_t Posix_Signal_SIGALRM = SIGALRM; #ifndef SIGBUS #define SIGBUS -1 #endif const C_Signal_t Posix_Signal_SIGBUS = SIGBUS; #ifndef SIGCHLD #define SIGCHLD -1 #endif const C_Signal_t Posix_Signal_SIGCHLD = SIGCHLD; #ifndef SIGCONT #define SIGCONT -1 #endif const C_Signal_t Posix_Signal_SIGCONT = SIGCONT; #ifndef SIGFPE #define SIGFPE -1 #endif const C_Signal_t Posix_Signal_SIGFPE = SIGFPE; #ifndef SIGHUP #define SIGHUP -1 #endif const C_Signal_t Posix_Signal_SIGHUP = SIGHUP; #ifndef SIGILL #define SIGILL -1 #endif const C_Signal_t Posix_Signal_SIGILL = SIGILL; #ifndef SIGINT #define SIGINT -1 #endif const C_Signal_t Posix_Signal_SIGINT = SIGINT; #ifndef SIGKILL #define SIGKILL -1 #endif const C_Signal_t Posix_Signal_SIGKILL = SIGKILL; #ifndef SIGPIPE #define SIGPIPE -1 #endif const C_Signal_t Posix_Signal_SIGPIPE = SIGPIPE; #ifndef SIGQUIT #define SIGQUIT -1 #endif const C_Signal_t Posix_Signal_SIGQUIT = SIGQUIT; #ifndef SIGSEGV #define SIGSEGV -1 #endif const C_Signal_t Posix_Signal_SIGSEGV = SIGSEGV; #ifndef SIGSTOP #define SIGSTOP -1 #endif const C_Signal_t Posix_Signal_SIGSTOP = SIGSTOP; #ifndef SIGTERM #define SIGTERM -1 #endif const C_Signal_t Posix_Signal_SIGTERM = SIGTERM; #ifndef SIGTSTP #define SIGTSTP -1 #endif const C_Signal_t Posix_Signal_SIGTSTP = SIGTSTP; #ifndef SIGTTIN #define SIGTTIN -1 #endif const C_Signal_t Posix_Signal_SIGTTIN = SIGTTIN; #ifndef SIGTTOU #define SIGTTOU -1 #endif const C_Signal_t Posix_Signal_SIGTTOU = SIGTTOU; #ifndef SIGUSR1 #define SIGUSR1 -1 #endif const C_Signal_t Posix_Signal_SIGUSR1 = SIGUSR1; #ifndef SIGUSR2 #define SIGUSR2 -1 #endif const C_Signal_t Posix_Signal_SIGUSR2 = SIGUSR2; #ifndef SIGPOLL #define SIGPOLL -1 #endif const C_Signal_t Posix_Signal_SIGPOLL = SIGPOLL; #ifndef SIGPROF #define SIGPROF -1 #endif const C_Signal_t Posix_Signal_SIGPROF = SIGPROF; #ifndef SIGSYS #define SIGSYS -1 #endif const C_Signal_t Posix_Signal_SIGSYS = SIGSYS; #ifndef SIGTRAP #define SIGTRAP -1 #endif const C_Signal_t Posix_Signal_SIGTRAP = SIGTRAP; #ifndef SIGURG #define SIGURG -1 #endif const C_Signal_t Posix_Signal_SIGURG = SIGURG; #ifndef SIGVTALRM #define SIGVTALRM -1 #endif const C_Signal_t Posix_Signal_SIGVTALRM = SIGVTALRM; #ifndef SIGXCPU #define SIGXCPU -1 #endif const C_Signal_t Posix_Signal_SIGXCPU = SIGXCPU; #ifndef SIGXFSZ #define SIGXFSZ -1 #endif const C_Signal_t Posix_Signal_SIGXFSZ = SIGXFSZ; mlton-20100608/runtime/basis/Posix/Signal.c0000644000076600000240000000545211404435622017035 0ustar mtfstaff#include "platform.h" extern struct GC_state gcState; static void handler (int signum) { GC_handler (&gcState, signum); } C_Errno_t(C_Int_t) Posix_Signal_default (C_Signal_t signum) { struct sigaction sa; sigdelset (GC_getSignalsHandledAddr (&gcState), signum); memset (&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; return sigaction (signum, &sa, NULL); } C_Errno_t(C_Int_t) Posix_Signal_isDefault (C_Int_t signum, Ref(C_Int_t) isDef) { int res; struct sigaction sa; memset (&sa, 0, sizeof(sa)); res = sigaction (signum, NULL, &sa); *((C_Int_t*)isDef) = sa.sa_handler == SIG_DFL; return res; } C_Errno_t(C_Int_t) Posix_Signal_ignore (C_Signal_t signum) { struct sigaction sa; sigdelset (GC_getSignalsHandledAddr (&gcState), signum); memset (&sa, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; return sigaction (signum, &sa, NULL); } C_Errno_t(C_Int_t) Posix_Signal_isIgnore (C_Int_t signum, Ref(C_Int_t) isIgn) { int res; struct sigaction sa; memset (&sa, 0, sizeof(sa)); res = sigaction (signum, NULL, &sa); *((C_Int_t*)isIgn) = sa.sa_handler == SIG_IGN; return res; } C_Errno_t(C_Int_t) Posix_Signal_handlee (C_Int_t signum) { static struct sigaction sa; sigaddset (GC_getSignalsHandledAddr (&gcState), signum); memset (&sa, 0, sizeof(sa)); /* The mask must be full because GC_handler reads and writes * s->signalsPending (else there is a race condition). */ sigfillset (&sa.sa_mask); #if HAS_SIGALTSTACK sa.sa_flags = SA_ONSTACK; #endif sa.sa_handler = handler; return sigaction (signum, &sa, NULL); } void Posix_Signal_handleGC (void) { GC_setGCSignalHandled (&gcState, TRUE); } C_Int_t Posix_Signal_isPending (C_Int_t signum) { return sigismember (GC_getSignalsPendingAddr (&gcState), signum); } C_Int_t Posix_Signal_isPendingGC (void) { return GC_getGCSignalPending (&gcState); } void Posix_Signal_resetPending (void) { sigemptyset (GC_getSignalsPendingAddr (&gcState)); GC_setGCSignalPending (&gcState, FALSE); } static sigset_t Posix_Signal_sigset; C_Errno_t(C_Int_t) Posix_Signal_sigaddset (C_Signal_t signum) { return sigaddset (&Posix_Signal_sigset, signum); } C_Errno_t(C_Int_t) Posix_Signal_sigdelset (C_Signal_t signum) { return sigdelset (&Posix_Signal_sigset, signum); } C_Errno_t(C_Int_t) Posix_Signal_sigemptyset (void) { return sigemptyset (&Posix_Signal_sigset); } C_Errno_t(C_Int_t) Posix_Signal_sigfillset (void) { return sigfillset (&Posix_Signal_sigset); } C_Errno_t(C_Int_t) Posix_Signal_sigismember (C_Signal_t signum) { return sigismember (&Posix_Signal_sigset, signum); } C_Errno_t(C_Int_t) Posix_Signal_sigprocmask (C_Int_t how) { return sigprocmask (how, &Posix_Signal_sigset, &Posix_Signal_sigset); } void Posix_Signal_sigsuspend (void) { int res; res = sigsuspend (&Posix_Signal_sigset); assert (-1 == res); } mlton-20100608/runtime/basis/Posix/SysDB/0000755000076600000240000000000011404470407016432 5ustar mtfstaffmlton-20100608/runtime/basis/Posix/SysDB/Group.c0000644000076600000240000000116511404435622017675 0ustar mtfstaff#include "platform.h" static struct group *Posix_SysDB_Group_group; C_String_t Posix_SysDB_Group_getName(void) { return (C_String_t)(Posix_SysDB_Group_group->gr_name); } C_GId_t Posix_SysDB_Group_getGId(void) { return Posix_SysDB_Group_group->gr_gid; } C_StringArray_t Posix_SysDB_Group_getMem(void) { return (C_StringArray_t)(Posix_SysDB_Group_group->gr_mem); } C_Errno_t(C_Int_t) Posix_SysDB_getgrgid(C_GId_t g) { return NULL != (Posix_SysDB_Group_group = getgrgid ((gid_t)g)); } C_Errno_t(C_Int_t) Posix_SysDB_getgrnam(NullString8_t s) { return NULL != (Posix_SysDB_Group_group = getgrnam ((const char*)s)); } mlton-20100608/runtime/basis/Posix/SysDB/Passwd.c0000644000076600000240000000147311404435622020044 0ustar mtfstaff#include "platform.h" static struct passwd *Posix_SysDB_Passwd_passwd; C_String_t Posix_SysDB_Passwd_getName(void) { return (C_String_t)(Posix_SysDB_Passwd_passwd->pw_name); } C_UId_t Posix_SysDB_Passwd_getUId(void) { return Posix_SysDB_Passwd_passwd->pw_uid; } C_GId_t Posix_SysDB_Passwd_getGId(void) { return Posix_SysDB_Passwd_passwd->pw_gid; } C_String_t Posix_SysDB_Passwd_getDir(void) { return (C_String_t)(Posix_SysDB_Passwd_passwd->pw_dir); } C_String_t Posix_SysDB_Passwd_getShell(void) { return (C_String_t)(Posix_SysDB_Passwd_passwd->pw_shell); } C_Errno_t(C_Int_t) Posix_SysDB_getpwnam(NullString8_t p) { return NULL != (Posix_SysDB_Passwd_passwd = getpwnam((const char *) p)); } C_Errno_t(C_Int_t) Posix_SysDB_getpwuid(C_UId_t u) { return NULL != (Posix_SysDB_Passwd_passwd = getpwuid(u)); } mlton-20100608/runtime/basis/Posix/TTY-consts.c0000644000076600000240000001730011404435622017602 0ustar mtfstaff#include "platform.h" const C_Int_t Posix_TTY_V_NCCS = NCCS; #ifndef VEOF #define VEOF -1 #endif const C_Int_t Posix_TTY_V_VEOF = VEOF; #ifndef VEOL #define VEOL -1 #endif const C_Int_t Posix_TTY_V_VEOL = VEOL; #ifndef VERASE #define VERASE -1 #endif const C_Int_t Posix_TTY_V_VERASE = VERASE; #ifndef VINTR #define VINTR -1 #endif const C_Int_t Posix_TTY_V_VINTR = VINTR; #ifndef VKILL #define VKILL -1 #endif const C_Int_t Posix_TTY_V_VKILL = VKILL; #ifndef VMIN #define VMIN -1 #endif const C_Int_t Posix_TTY_V_VMIN = VMIN; #ifndef VQUIT #define VQUIT -1 #endif const C_Int_t Posix_TTY_V_VQUIT = VQUIT; #ifndef VSTART #define VSTART -1 #endif const C_Int_t Posix_TTY_V_VSTART = VSTART; #ifndef VSTOP #define VSTOP -1 #endif const C_Int_t Posix_TTY_V_VSTOP = VSTOP; #ifndef VSUSP #define VSUSP -1 #endif const C_Int_t Posix_TTY_V_VSUSP = VSUSP; #ifndef VTIME #define VTIME -1 #endif const C_Int_t Posix_TTY_V_VTIME = VTIME; #ifndef BRKINT #define BRKINT -1 #endif const C_TCFlag_t Posix_TTY_I_BRKINT = BRKINT; #ifndef ICRNL #define ICRNL -1 #endif const C_TCFlag_t Posix_TTY_I_ICRNL = ICRNL; #ifndef IGNBRK #define IGNBRK -1 #endif const C_TCFlag_t Posix_TTY_I_IGNBRK = IGNBRK; #ifndef IGNCR #define IGNCR -1 #endif const C_TCFlag_t Posix_TTY_I_IGNCR = IGNCR; #ifndef IGNPAR #define IGNPAR -1 #endif const C_TCFlag_t Posix_TTY_I_IGNPAR = IGNPAR; #ifndef INLCR #define INLCR -1 #endif const C_TCFlag_t Posix_TTY_I_INLCR = INLCR; #ifndef INPCK #define INPCK -1 #endif const C_TCFlag_t Posix_TTY_I_INPCK = INPCK; #ifndef ISTRIP #define ISTRIP -1 #endif const C_TCFlag_t Posix_TTY_I_ISTRIP = ISTRIP; #ifndef IXANY #define IXANY -1 #endif const C_TCFlag_t Posix_TTY_I_IXANY = IXANY; #ifndef IXOFF #define IXOFF -1 #endif const C_TCFlag_t Posix_TTY_I_IXOFF = IXOFF; #ifndef IXON #define IXON -1 #endif const C_TCFlag_t Posix_TTY_I_IXON = IXON; #ifndef PARMRK #define PARMRK -1 #endif const C_TCFlag_t Posix_TTY_I_PARMRK = PARMRK; #ifndef OPOST #define OPOST -1 #endif const C_TCFlag_t Posix_TTY_O_OPOST = OPOST; #ifndef ONLCR #define ONLCR -1 #endif const C_TCFlag_t Posix_TTY_O_ONLCR = ONLCR; #ifndef OCRNL #define OCRNL -1 #endif const C_TCFlag_t Posix_TTY_O_OCRNL = OCRNL; #ifndef ONOCR #define ONOCR -1 #endif const C_TCFlag_t Posix_TTY_O_ONOCR = ONOCR; #ifndef ONLRET #define ONLRET -1 #endif const C_TCFlag_t Posix_TTY_O_ONLRET = ONLRET; #ifndef OFILL #define OFILL -1 #endif const C_TCFlag_t Posix_TTY_O_OFILL = OFILL; #ifndef NLDLY #define NLDLY -1 #endif const C_TCFlag_t Posix_TTY_O_NLDLY = NLDLY; #ifndef NL0 #define NL0 -1 #endif const C_TCFlag_t Posix_TTY_O_NL0 = NL0; #ifndef NL1 #define NL1 -1 #endif const C_TCFlag_t Posix_TTY_O_NL1 = NL1; #ifndef CRDLY #define CRDLY -1 #endif const C_TCFlag_t Posix_TTY_O_CRDLY = CRDLY; #ifndef CR0 #define CR0 -1 #endif const C_TCFlag_t Posix_TTY_O_CR0 = CR0; #ifndef CR1 #define CR1 -1 #endif const C_TCFlag_t Posix_TTY_O_CR1 = CR1; #ifndef CR2 #define CR2 -1 #endif const C_TCFlag_t Posix_TTY_O_CR2 = CR2; #ifndef CR3 #define CR3 -1 #endif const C_TCFlag_t Posix_TTY_O_CR3 = CR3; #ifndef TABDLY #define TABDLY -1 #endif const C_TCFlag_t Posix_TTY_O_TABDLY = TABDLY; #ifndef TAB0 #define TAB0 -1 #endif const C_TCFlag_t Posix_TTY_O_TAB0 = TAB0; #ifndef TAB1 #define TAB1 -1 #endif const C_TCFlag_t Posix_TTY_O_TAB1 = TAB1; #ifndef TAB2 #define TAB2 -1 #endif const C_TCFlag_t Posix_TTY_O_TAB2 = TAB2; #ifndef TAB3 #define TAB3 -1 #endif const C_TCFlag_t Posix_TTY_O_TAB3 = TAB3; #ifndef BSDLY #define BSDLY -1 #endif const C_TCFlag_t Posix_TTY_O_BSDLY = BSDLY; #ifndef BS0 #define BS0 -1 #endif const C_TCFlag_t Posix_TTY_O_BS0 = BS0; #ifndef BS1 #define BS1 -1 #endif const C_TCFlag_t Posix_TTY_O_BS1 = BS1; #ifndef VTDLY #define VTDLY -1 #endif const C_TCFlag_t Posix_TTY_O_VTDLY = VTDLY; #ifndef VT0 #define VT0 -1 #endif const C_TCFlag_t Posix_TTY_O_VT0 = VT0; #ifndef VT1 #define VT1 -1 #endif const C_TCFlag_t Posix_TTY_O_VT1 = VT1; #ifndef FFDLY #define FFDLY -1 #endif const C_TCFlag_t Posix_TTY_O_FFDLY = FFDLY; #ifndef FF0 #define FF0 -1 #endif const C_TCFlag_t Posix_TTY_O_FF0 = FF0; #ifndef FF1 #define FF1 -1 #endif const C_TCFlag_t Posix_TTY_O_FF1 = FF1; #ifndef CSIZE #define CSIZE -1 #endif const C_TCFlag_t Posix_TTY_C_CSIZE = CSIZE; #ifndef CS5 #define CS5 -1 #endif const C_TCFlag_t Posix_TTY_C_CS5 = CS5; #ifndef CS6 #define CS6 -1 #endif const C_TCFlag_t Posix_TTY_C_CS6 = CS6; #ifndef CS7 #define CS7 -1 #endif const C_TCFlag_t Posix_TTY_C_CS7 = CS7; #ifndef CS8 #define CS8 -1 #endif const C_TCFlag_t Posix_TTY_C_CS8 = CS8; #ifndef CSTOPB #define CSTOPB -1 #endif const C_TCFlag_t Posix_TTY_C_CSTOPB = CSTOPB; #ifndef CREAD #define CREAD -1 #endif const C_TCFlag_t Posix_TTY_C_CREAD = CREAD; #ifndef PARENB #define PARENB -1 #endif const C_TCFlag_t Posix_TTY_C_PARENB = PARENB; #ifndef PARODD #define PARODD -1 #endif const C_TCFlag_t Posix_TTY_C_PARODD = PARODD; #ifndef HUPCL #define HUPCL -1 #endif const C_TCFlag_t Posix_TTY_C_HUPCL = HUPCL; #ifndef CLOCAL #define CLOCAL -1 #endif const C_TCFlag_t Posix_TTY_C_CLOCAL = CLOCAL; #ifndef ECHO #define ECHO -1 #endif const C_TCFlag_t Posix_TTY_L_ECHO = ECHO; #ifndef ECHOE #define ECHOE -1 #endif const C_TCFlag_t Posix_TTY_L_ECHOE = ECHOE; #ifndef ECHOK #define ECHOK -1 #endif const C_TCFlag_t Posix_TTY_L_ECHOK = ECHOK; #ifndef ECHONL #define ECHONL -1 #endif const C_TCFlag_t Posix_TTY_L_ECHONL = ECHONL; #ifndef ICANON #define ICANON -1 #endif const C_TCFlag_t Posix_TTY_L_ICANON = ICANON; #ifndef IEXTEN #define IEXTEN -1 #endif const C_TCFlag_t Posix_TTY_L_IEXTEN = IEXTEN; #ifndef ISIG #define ISIG -1 #endif const C_TCFlag_t Posix_TTY_L_ISIG = ISIG; #ifndef NOFLSH #define NOFLSH -1 #endif const C_TCFlag_t Posix_TTY_L_NOFLSH = NOFLSH; #ifndef TOSTOP #define TOSTOP -1 #endif const C_TCFlag_t Posix_TTY_L_TOSTOP = TOSTOP; #ifndef B0 #define B0 -1 #endif const C_Speed_t Posix_TTY_B0 = B0; #ifndef B50 #define B50 -1 #endif const C_Speed_t Posix_TTY_B50 = B50; #ifndef B75 #define B75 -1 #endif const C_Speed_t Posix_TTY_B75 = B75; #ifndef B110 #define B110 -1 #endif const C_Speed_t Posix_TTY_B110 = B110; #ifndef B134 #define B134 -1 #endif const C_Speed_t Posix_TTY_B134 = B134; #ifndef B150 #define B150 -1 #endif const C_Speed_t Posix_TTY_B150 = B150; #ifndef B200 #define B200 -1 #endif const C_Speed_t Posix_TTY_B200 = B200; #ifndef B300 #define B300 -1 #endif const C_Speed_t Posix_TTY_B300 = B300; #ifndef B600 #define B600 -1 #endif const C_Speed_t Posix_TTY_B600 = B600; #ifndef B1200 #define B1200 -1 #endif const C_Speed_t Posix_TTY_B1200 = B1200; #ifndef B1800 #define B1800 -1 #endif const C_Speed_t Posix_TTY_B1800 = B1800; #ifndef B2400 #define B2400 -1 #endif const C_Speed_t Posix_TTY_B2400 = B2400; #ifndef B4800 #define B4800 -1 #endif const C_Speed_t Posix_TTY_B4800 = B4800; #ifndef B9600 #define B9600 -1 #endif const C_Speed_t Posix_TTY_B9600 = B9600; #ifndef B19200 #define B19200 -1 #endif const C_Speed_t Posix_TTY_B19200 = B19200; #ifndef B38400 #define B38400 -1 #endif const C_Speed_t Posix_TTY_B38400 = B38400; #ifndef TCSADRAIN #define TCSADRAIN -1 #endif const C_Int_t Posix_TTY_TC_TCSADRAIN = TCSADRAIN; #ifndef TCSAFLUSH #define TCSAFLUSH -1 #endif const C_Int_t Posix_TTY_TC_TCSAFLUSH = TCSAFLUSH; #ifndef TCSANOW #define TCSANOW -1 #endif const C_Int_t Posix_TTY_TC_TCSANOW = TCSANOW; #ifndef TCIOFF #define TCIOFF -1 #endif const C_Int_t Posix_TTY_TC_TCIOFF = TCIOFF; #ifndef TCION #define TCION -1 #endif const C_Int_t Posix_TTY_TC_TCION = TCION; #ifndef TCOOFF #define TCOOFF -1 #endif const C_Int_t Posix_TTY_TC_TCOOFF = TCOOFF; #ifndef TCOON #define TCOON -1 #endif const C_Int_t Posix_TTY_TC_TCOON = TCOON; #ifndef TCIFLUSH #define TCIFLUSH -1 #endif const C_Int_t Posix_TTY_TC_TCIFLUSH = TCIFLUSH; #ifndef TCIOFLUSH #define TCIOFLUSH -1 #endif const C_Int_t Posix_TTY_TC_TCIOFLUSH = TCIOFLUSH; #ifndef TCOFLUSH #define TCOFLUSH -1 #endif const C_Int_t Posix_TTY_TC_TCOFLUSH = TCOFLUSH; mlton-20100608/runtime/basis/Posix/TTY.c0000644000076600000240000000440411404435622016274 0ustar mtfstaff#include "platform.h" static struct termios Posix_TTY_Termios_termios; C_TCFlag_t Posix_TTY_Termios_getIFlag (void) { return Posix_TTY_Termios_termios.c_iflag; } C_TCFlag_t Posix_TTY_Termios_getOFlag (void) { return Posix_TTY_Termios_termios.c_oflag; } C_TCFlag_t Posix_TTY_Termios_getCFlag (void) { return Posix_TTY_Termios_termios.c_cflag; } C_TCFlag_t Posix_TTY_Termios_getLFlag (void) { return Posix_TTY_Termios_termios.c_lflag; } void Posix_TTY_Termios_getCC (Array(C_CC_t) a) { for (int i = 0; i < NCCS; i++) ((cc_t*)a)[i] = Posix_TTY_Termios_termios.c_cc[i]; } C_Speed_t Posix_TTY_Termios_cfGetOSpeed (void) { return cfgetospeed (&Posix_TTY_Termios_termios); } C_Speed_t Posix_TTY_Termios_cfGetISpeed (void) { return cfgetispeed (&Posix_TTY_Termios_termios); } void Posix_TTY_Termios_setIFlag (C_TCFlag_t f) { Posix_TTY_Termios_termios.c_iflag = f; } void Posix_TTY_Termios_setOFlag (C_TCFlag_t f) { Posix_TTY_Termios_termios.c_oflag = f; } void Posix_TTY_Termios_setCFlag (C_TCFlag_t f) { Posix_TTY_Termios_termios.c_cflag = f; } void Posix_TTY_Termios_setLFlag (C_TCFlag_t f) { Posix_TTY_Termios_termios.c_lflag = f; } void Posix_TTY_Termios_setCC (Array(C_CC_t) a) { for (int i = 0; i < NCCS; i++) Posix_TTY_Termios_termios.c_cc[i] = ((cc_t*)a)[i]; } C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetOSpeed (C_Speed_t s) { return cfsetospeed (&Posix_TTY_Termios_termios, s); } C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetISpeed (C_Speed_t s) { return cfsetispeed (&Posix_TTY_Termios_termios, s); } C_Errno_t(C_Int_t) Posix_TTY_TC_drain (C_Fd_t f) { return tcdrain (f); } C_Errno_t(C_Int_t) Posix_TTY_TC_flow (C_Fd_t f, C_Int_t i) { return tcflow (f, i); } C_Errno_t(C_Int_t) Posix_TTY_TC_flush (C_Fd_t f, C_Int_t i) { return tcflush (f, i); } C_Errno_t(C_Int_t) Posix_TTY_TC_getattr (C_Fd_t f) { return tcgetattr (f, &Posix_TTY_Termios_termios); } C_Errno_t(C_PId_t) Posix_TTY_TC_getpgrp (C_Fd_t f) { return tcgetpgrp (f); } C_Errno_t(C_Int_t) Posix_TTY_TC_sendbreak (C_Fd_t f, C_Int_t i) { return tcsendbreak (f, i); } C_Errno_t(C_Int_t) Posix_TTY_TC_setattr (C_Fd_t f, C_Int_t i) { return tcsetattr (f, i, &Posix_TTY_Termios_termios); } C_Errno_t(C_Int_t) Posix_TTY_TC_setpgrp (C_Fd_t f, C_PId_t p) { return tcsetpgrp (f, p); } mlton-20100608/runtime/basis/Real/0000755000076600000240000000000011404470407015227 5ustar mtfstaffmlton-20100608/runtime/basis/Real/class.c0000644000076600000240000000736511404435622016513 0ustar mtfstaff#include "platform.h" #if defined (HAS_FPCLASSIFY) && HAS_FPCLASSIFY C_Int_t Real32_class (Real32_t f) { return fpclassify (f); } #elif defined (HAS_FPCLASSIFY32) && HAS_FPCLASSIFY32 C_Int_t Real32_class (Real32_t f) { return fpclassify32 (f); } #else /* This code assumes IEEE 754/854. * * In little-endian memory, the 32 bits of a float are layed out as follows. * * d[0] bits 7-0 of mantissa * d[1] bits 15-8 of mantissa * d[2] bit 0 of exponent * bits 22-16 of mantissa * d[3] sign bit * bits 7-1 of exponent * * In big-endian memory, the 32 bits of a float are layed out as follows. * * d[3] bits 7-0 of mantissa * d[2] bits 15-8 of mantissa * d[1] bit 0 of exponent * bits 22-16 of mantissa * d[0] sign bit * bits 7-1 of exponent */ /* masks for least/most significant word */ #define EXPONENT_MASK32 0x7F800000 #define MANTISSA_MASK32 0x007FFFFF #define SIGNBIT_MASK32 0x80000000 #define MANTISSA_HIGHBIT_MASK32 0x00400000 C_Int_t Real32_class (Real32_t f) { uint32_t word0; int res; /* Using memcpy; * Technically correct. */ uint32_t words[1]; memcpy(&words, &f, sizeof(Real32_t)); word0 = words[0]; /* Using union; * Technically undefined, but widely supported. */ /* union {float f; uint32_t words[1];} fws; fws.f = f; word0 = fws.words[0]; */ if ((word0 & EXPONENT_MASK32) == EXPONENT_MASK32) { if (word0 & MANTISSA_MASK32) res = FP_NAN; else res = FP_INFINITE; } else if (word0 & EXPONENT_MASK32) res = FP_NORMAL; else if (word0 & MANTISSA_MASK32) res = FP_SUBNORMAL; else res = FP_ZERO; return res; } #endif #if defined (HAS_FPCLASSIFY) && HAS_FPCLASSIFY C_Int_t Real64_class (Real64_t d) { return fpclassify (d); } #elif defined (HAS_FPCLASSIFY64) && HAS_FPCLASSIFY64 C_Int_t Real64_class (Real64_t d) { return fpclassify64 (d); } #else /* This code assumes IEEE 754/854. * * In little-endian memory, the 64 bits of a double are layed out as follows. * * d[0] bits 7-0 of mantissa * d[1] bits 15-8 of mantissa * d[2] bits 23-16 of mantissa * d[3] bits 31-24 of mantissa * d[4] bits 39-32 of mantissa * d[5] bits 47-40 of mantissa * d[6] bits 3-0 of exponent * bits 51-48 of mantissa * d[7] sign bit * bits 10-4 of exponent * * In big-endian memory, the 64 bits of a double are layed out as follows. * * d[7] bits 7-0 of mantissa * d[6] bits 15-8 of mantissa * d[5] bits 23-16 of mantissa * d[4] bits 31-24 of mantissa * d[3] bits 39-32 of mantissa * d[2] bits 47-40 of mantissa * d[1] bits 3-0 of exponent * bits 51-48 of mantissa * d[0] sign bit * bits 10-4 of exponent */ /* masks for most-significant word */ #define EXPONENT_MASK64 0x7FF00000 #define MANTISSA_MASK64 0x000FFFFF #define SIGNBIT_MASK64 0x80000000 #define MANTISSA_HIGHBIT_MASK64 0x00080000 C_Int_t Real64_class (Real64_t d) { uint32_t word0, word1; int res; /* Using memcpy; * Technically correct. */ uint32_t words[2]; memcpy(&words, &d, sizeof(Real64_t)); if (isBigEndian()) { word1 = words[0]; word0 = words[1]; } else { word0 = words[0]; word1 = words[1]; } /* Using union; * Technically undefined, but widely supported. */ /* union {double d; uint32_t words[2];} dws; dws.d = d; if (isBigEndian()) { word1 = dws.words[0]; word0 = dws.words[1]; } else { word0 = dws.words[0]; word1 = dws.words[1]; } */ if ((word1 & EXPONENT_MASK64) == EXPONENT_MASK64) { if (word0 or (word1 & MANTISSA_MASK64)) res = FP_NAN; else res = FP_INFINITE; } else if (word1 & EXPONENT_MASK64) res = FP_NORMAL; else if (word0 or (word1 & MANTISSA_MASK64)) res = FP_SUBNORMAL; else res = FP_ZERO; return res; } #endif mlton-20100608/runtime/basis/Real/gdtoa.c0000644000076600000240000000343011404435622016471 0ustar mtfstaff#include "platform.h" #include "gdtoa/gdtoa.h" #ifndef DEBUG #define DEBUG FALSE #endif /* This code is patterned on g_dfmt from the gdtoa sources. */ C_String_t Real32_gdtoa (Real32_t f, C_Int_t mode, C_Int_t ndig, C_Int_t rounding, Ref(C_Int_t) decpt) { ULong bits[1]; int ex; FPI fpi = { 24, 1-127-24+1, 254-127-24+1, (int)rounding, 0 }; int i; ULong L[1]; char *result; ULong sign; memcpy(L, &f, sizeof(Real32_t)); sign = L[0] & 0x80000000L; bits[0] = L[0] & 0x7fffff; if (0 != (ex = (L[0] >> 23) & 0xff)) bits[0] |= 0x800000; else ex = 1; ex -= 0x7f + 23; i = STRTOG_Normal; result = gdtoa__gdtoa (&fpi, ex, bits, &i, (int)mode, (int)ndig, (int*)decpt, NULL); if (DEBUG) fprintf (stderr, "%s = gdtoa (%g, %d, %d, %d) decpt = %d\n", result, (double)f, (int)mode, (int)ndig, (int)rounding, *((int*)decpt)); return (C_String_t)result; } C_String_t Real64_gdtoa (Real64_t d, C_Int_t mode, C_Int_t ndig, C_Int_t rounding, Ref(C_Int_t) decpt) { ULong bits[2]; int ex; FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, (int)rounding, 0 }; int i; ULong L[2]; char *result; ULong sign; int x0, x1; if (isBigEndian()) { x0 = 0; x1 = 1; } else { x0 = 1; x1 = 0; } memcpy(L, &d, sizeof(Real64_t)); sign = L[x0] & 0x80000000L; bits[0] = L[x1]; bits[1] = L[x0] & 0xfffff; if (0 != (ex = (L[x0] >> 20) & 0x7ff)) bits[1] |= 0x100000; else ex = 1; ex -= 0x3ff + 52; i = STRTOG_Normal; result = gdtoa__gdtoa (&fpi, ex, bits, &i, mode, ndig, (int*)decpt, NULL); if (DEBUG) fprintf (stderr, "%s = gdtoa (%g, %d, %d, %d) decpt = %d\n", result, d, (int)mode, (int)ndig, (int)rounding, *((int*)decpt)); return (C_String_t)result; } mlton-20100608/runtime/basis/Real/IEEEReal-consts.c0000644000076600000240000000116411404435622020217 0ustar mtfstaff#include "platform.h" const C_Int_t IEEEReal_FloatClass_FP_INFINITE = FP_INFINITE; const C_Int_t IEEEReal_FloatClass_FP_NAN = FP_NAN; const C_Int_t IEEEReal_FloatClass_FP_NORMAL = FP_NORMAL; const C_Int_t IEEEReal_FloatClass_FP_SUBNORMAL = FP_SUBNORMAL; const C_Int_t IEEEReal_FloatClass_FP_ZERO = FP_ZERO; const C_Int_t IEEEReal_RoundingMode_FE_TONEAREST = FE_TONEAREST; const C_Int_t IEEEReal_RoundingMode_FE_DOWNWARD = FE_DOWNWARD; const C_Int_t IEEEReal_RoundingMode_FE_NOSUPPORT = FE_NOSUPPORT; const C_Int_t IEEEReal_RoundingMode_FE_UPWARD = FE_UPWARD; const C_Int_t IEEEReal_RoundingMode_FE_TOWARDZERO = FE_TOWARDZERO; mlton-20100608/runtime/basis/Real/IEEEReal.c0000644000076600000240000000407611404435622016715 0ustar mtfstaff#include "platform.h" #if !HAS_FEROUND #if (defined __i386__) || (defined __x86_64__) /* Macros for accessing the hardware control word. */ #define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) #define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) #define _SSE_GETCSR(csr) __asm__ ("stmxcsr %0" : "=m" (*&csr)) #define _SSE_SETCSR(csr) __asm__ ("ldmxcsr %0" : : "m" (*&csr)) #define FPU_ROUNDING_CONTROL_MASK 0x0C00 #define FPU_ROUNDING_CONTROL_SHIFT 10 #define SSE_ROUNDING_CONTROL_MASK 0x00006000 #define SSE_ROUNDING_CONTROL_SHIFT 13 static inline C_Int_t fegetround (void) { uint16_t fpuControl; _FPU_GETCW (fpuControl); return (fpuControl & FPU_ROUNDING_CONTROL_MASK) >> FPU_ROUNDING_CONTROL_SHIFT; } static inline C_Int_t fesetround (C_Int_t mode) { uint16_t fpuControl; #ifdef __x86_64__ uint32_t sseControl; #endif _FPU_GETCW (fpuControl); fpuControl &= ~FPU_ROUNDING_CONTROL_MASK; fpuControl |= mode << FPU_ROUNDING_CONTROL_SHIFT; _FPU_SETCW (fpuControl); #ifdef __x86_64__ _SSE_GETCSR (sseControl); sseControl &= ~SSE_ROUNDING_CONTROL_MASK; sseControl |= mode << SSE_ROUNDING_CONTROL_SHIFT; _SSE_SETCSR (sseControl); #endif return 0; } #elif (defined __UCLIBC__) /* Use whatever we got from fpu_control.h for this CPU model */ #define FE_MASK (FE_DOWNWARD|FE_TONEAREST|FE_TOWARDZERO|FE_UPWARD) static inline int fegetround () { fpu_control_t controlWord; _FPU_GETCW(controlWord); return controlWord & FE_MASK; } static inline int fesetround (int mode) { fpu_control_t controlWord; _FPU_GETCW (controlWord); controlWord = (controlWord & ~FE_MASK) | mode; _FPU_SETCW (controlWord); return 0; } #else #error fe{get,set}round not implemented #endif #endif /* !HAS_FEROUND */ C_Int_t IEEEReal_getRoundingMode (void) { return fegetround (); } C_Int_t IEEEReal_setRoundingMode (C_Int_t m) { assert (m != IEEEReal_RoundingMode_FE_NOSUPPORT); return fesetround (m); } mlton-20100608/runtime/basis/Real/Math-fns.h0000644000076600000240000001374711404435622017071 0ustar mtfstaff #define unaryReal(g, h) \ MLTON_CODEGEN_MATHFN(Real64_t h(Real64_t x);) \ MLTON_CODEGEN_STATIC_INLINE \ Real64_t Real64_##g (Real64_t x) { \ return h (x); \ } \ MLTON_CODEGEN_MATHFN(Real32_t h##f(Real32_t x);) \ MLTON_CODEGEN_STATIC_INLINE \ Real32_t Real32_##g (Real32_t x) { \ return h##f (x); \ } unaryReal(abs, fabs) unaryReal(round, rint) #undef unaryReal #define binaryReal(g, h) \ MLTON_CODEGEN_MATHFN(Real64_t h(Real64_t x, Real64_t y);) \ MLTON_CODEGEN_STATIC_INLINE \ Real64_t Real64_Math_##g (Real64_t x, Real64_t y) { \ return h (x, y); \ } \ MLTON_CODEGEN_MATHFN(Real32_t h##f(Real32_t x, Real32_t y);) \ MLTON_CODEGEN_STATIC_INLINE \ Real32_t Real32_Math_##g (Real32_t x, Real32_t y) { \ return h##f (x, y); \ } binaryReal(atan2, atan2) binaryReal(pow, pow) #undef binaryReal #define unaryReal(g, h) \ MLTON_CODEGEN_MATHFN(Real64_t h(Real64_t x);) \ MLTON_CODEGEN_STATIC_INLINE \ Real64_t Real64_Math_##g (Real64_t x) { \ return h (x); \ } \ MLTON_CODEGEN_MATHFN(Real32_t h##f(Real32_t x);) \ MLTON_CODEGEN_STATIC_INLINE \ Real32_t Real32_Math_##g (Real32_t x) { \ return h##f (x); \ } unaryReal(acos, acos) unaryReal(asin, asin) unaryReal(atan, atan) unaryReal(cos, cos) unaryReal(cosh, cosh) unaryReal(exp, exp) unaryReal(ln, log) unaryReal(log10, log10) unaryReal(sin, sin) unaryReal(sinh, sinh) unaryReal(sqrt, sqrt) unaryReal(tan, tan) unaryReal(tanh, tanh) #undef unaryReal #define binaryRealIntRef(g, h) \ MLTON_CODEGEN_MATHFN(Real64_t h (Real64_t x, int* ip);) \ MLTON_CODEGEN_STATIC_INLINE \ Real64_t Real64_##g (Real64_t x, Ref(C_Int_t) i) { \ return h (x, (int*)i); \ } \ MLTON_CODEGEN_MATHFN(Real32_t h##f (Real32_t x, int* ip);) \ MLTON_CODEGEN_STATIC_INLINE \ Real32_t Real32_##g (Real32_t x, Ref(C_Int_t) i) { \ return h##f (x, (int*)i); \ } binaryRealIntRef(frexp, frexp) #undef binaryRealIntRef #define binaryRealInt(g, h) \ MLTON_CODEGEN_MATHFN(Real64_t h (Real64_t x, int i);) \ MLTON_CODEGEN_STATIC_INLINE \ Real64_t Real64_##g (Real64_t x, C_Int_t i) { \ return h (x, i); \ } \ MLTON_CODEGEN_MATHFN(Real32_t h##f (Real32_t x, int i);) \ MLTON_CODEGEN_STATIC_INLINE \ Real32_t Real32_##g (Real32_t x, C_Int_t i) { \ return h##f (x, i); \ } binaryRealInt(ldexp, ldexp) #undef binaryRealInt #if (defined (__hppa__) || defined (__sparc__)) #define binaryRealRealRef(g, h) \ MLTON_CODEGEN_MATHFN(Real32_t h##f (Real32_t x, Real32_t *yp);) \ MLTON_CODEGEN_STATIC_INLINE \ Real32_t Real32_##g (Real32_t x, Ref(Real32_t) yp) { \ /* Real32_t r, res; */ \ /* r = Real32_fetch (yp); */ \ /* res = h##f (x, &r); */ \ /* Real32_store (yp, r); */ \ /* return res; */ \ return h##f (x, (Real32_t*)yp); \ } \ MLTON_CODEGEN_MATHFN(Real64_t h (Real64_t x, Real64_t *yp);) \ MLTON_CODEGEN_STATIC_INLINE \ Real64_t Real64_##g (Real64_t x, Ref(Real64_t) yp) { \ Real64_t r, res; \ /* r = Real64_fetch (yp); */ \ res = h (x, &r); \ Real64_store (yp, r); \ return res; \ } #else #define binaryRealRealRef(g, h) \ MLTON_CODEGEN_MATHFN(Real32_t h##f (Real32_t x, Real32_t *yp);) \ MLTON_CODEGEN_STATIC_INLINE \ Real32_t Real32_##g (Real32_t x, Ref(Real32_t) yp) { \ return h##f (x, (Real32_t*)yp); \ } \ MLTON_CODEGEN_MATHFN(Real64_t h (Real64_t x, Real64_t *yp);) \ MLTON_CODEGEN_STATIC_INLINE \ Real64_t Real64_##g (Real64_t x, Ref(Real64_t) yp) { \ return h (x, (Real64_t*)yp); \ } #endif binaryRealRealRef(modf, modf) #undef binaryRealRealRef mlton-20100608/runtime/basis/Real/Math.c0000644000076600000240000000005511404435622016264 0ustar mtfstaff#include "platform.h" #include "Math-fns.h" mlton-20100608/runtime/basis/Real/Real-consts.c0000644000076600000240000000105111404435622017562 0ustar mtfstaff#include "platform.h" Real32_t Real32_Math_pi = (Real32_t)3.14159265358979323846; Real32_t Real32_Math_e = (Real32_t)2.71828182845904523536; Real32_t Real32_maxFinite = 3.40282347e+38; Real32_t Real32_minNormalPos = 1.17549435e-38; Real32_t Real32_minPos = 1.40129846e-45; Real64_t Real64_Math_pi = 3.14159265358979323846; Real64_t Real64_Math_e = 2.71828182845904523536; Real64_t Real64_maxFinite = 1.7976931348623157e+308; Real64_t Real64_minNormalPos = 2.2250738585072014e-308; Real64_t Real64_minPos = 4.9406564584124654e-324; mlton-20100608/runtime/basis/Real/Real-ops.h0000644000076600000240000001030111404435622017055 0ustar mtfstaff #define binary(size, name, op) \ MLTON_CODEGEN_STATIC_INLINE \ Real##size##_t Real##size##_##name (Real##size##_t r1, Real##size##_t r2) { \ return r1 op r2; \ } #define compare(size, name, op) \ MLTON_CODEGEN_STATIC_INLINE \ Bool Real##size##_##name (Real##size##_t r1, Real##size##_t r2) { \ return r1 op r2; \ } #define ternary(size, name, op) \ MLTON_CODEGEN_STATIC_INLINE \ Real##size##_t Real##size##_mul##name (Real##size##_t r1, Real##size##_t r2, Real##size##_t r3) { \ return r1 * r2 op r3; \ } #define unary(size, name, op) \ MLTON_CODEGEN_STATIC_INLINE \ Real##size##_t Real##size##_##name (Real##size##_t r1) { \ return op r1; \ } #define misaligned(size) \ typedef volatile union { \ Real##size##_t r; \ Word32_t ws[sizeof(Real##size##_t) / sizeof(Word32_t)]; \ } __attribute__((__may_alias__)) Real##size##OrWord32s; \ MLTON_CODEGEN_STATIC_INLINE \ Real##size##_t Real##size##_fetch (Ref(Real##size##_t) rp) { \ Real##size##OrWord32s u; \ Word32_t *wsp; \ wsp = (Word32_t*)rp; \ u.ws[0] = wsp[0]; \ if ((sizeof(Real##size##_t) / sizeof(Word32_t)) > 1) \ u.ws[1] = wsp[1]; \ return u.r; \ } \ MLTON_CODEGEN_STATIC_INLINE \ void Real##size##_store (Ref(Real##size##_t) rp, Real##size##_t r) { \ Real##size##OrWord32s u; \ Word32_t *wsp; \ wsp = (Word32_t*)rp; \ u.r = r; \ wsp[0] = u.ws[0]; \ if ((sizeof(Real##size##_t) / sizeof(Word32_t)) > 1) \ wsp[1] = u.ws[1]; \ return; \ } \ MLTON_CODEGEN_STATIC_INLINE \ void Real##size##_move (Ref(Real##size##_t) dst, Ref(Real##size##_t) src) { \ Real##size##_t r; \ r = Real##size##_fetch (src); \ Real##size##_store (dst, r); \ return; \ } #define all(size) \ binary(size, add, +) \ binary(size, div, /) \ binary(size, mul, *) \ binary(size, sub, -) \ compare(size, equal, ==) \ compare(size, le, <=) \ compare(size, lt, <) \ ternary(size, add, +) \ ternary(size, sub, -) \ unary(size, neg, -) \ misaligned(size) all(32) all(64) #undef all #undef misaligned #undef unary #undef ternary #undef compare #undef binary mlton-20100608/runtime/basis/Real/Real.c0000644000076600000240000000005511404435622016256 0ustar mtfstaff#include "platform.h" #include "Real-ops.h" mlton-20100608/runtime/basis/Real/signBit.c0000644000076600000240000000305311404435622016773 0ustar mtfstaff#include "platform.h" #if HAS_SIGNBIT C_Int_t Real32_signBit (Real32_t f) { return signbit (f); } C_Int_t Real64_signBit (Real64_t d) { return signbit (d); } #else enum { LITTLE_R32_byte = 3, LITTLE_R64_byte = 7, }; enum { BIG_R32_byte = 0, BIG_R64_byte = 0, }; C_Int_t Real32_signBit (Real32_t f) { int R32_byte; if (isBigEndian()) { R32_byte = BIG_R32_byte; } else { R32_byte = LITTLE_R32_byte; } /* Using memcpy. * Technically correct. */ unsigned char chars[4]; memcpy(chars, &f, sizeof(Real32_t)); return (chars[R32_byte] & 0x80) >> 7; /* Using cast; * Technically correct, as (unsigned char*) may alias. */ /* return (((unsigned char*)(&f))[R32_byte] & 0x80) >> 7; */ /* Using union; * Technically undefined, but widely supported. */ /* union {float f; unsigned char c[4];} fc; fc.f = f; return (fc.c[R32_byte] & 0x80) >> 7; */ } C_Int_t Real64_signBit (Real64_t d) { int R64_byte; if (isBigEndian()) { R64_byte = BIG_R64_byte; } else { R64_byte = LITTLE_R64_byte; } /* Using memcpy. * Technically correct. */ unsigned char chars[8]; memcpy(chars, &d, sizeof(Real64_t)); return (chars[R64_byte] & 0x80) >> 7; /* Using cast; * Technically correct, as (unsigned char*) may alias. */ /* return (((unsigned char*)(&d))[R64_byte] & 0x80) >> 7; */ /* Using union; * Technically undefined, but widely supported. */ /* union {double d; unsigned char c[8];} dc; dc.d = d; return (dc.c[R64_byte] & 0x80) >> 7; */ } #endif mlton-20100608/runtime/basis/Real/strto.c0000644000076600000240000000074511404435622016554 0ustar mtfstaff#include "platform.h" #include "gdtoa/gdtoa.h" Real32_t Real32_strto (NullString8_t s, C_Int_t rounding) { char *endptr; Real32_t res; int ret; ret = gdtoa__strtorf ((const char*)s, &endptr, (int)rounding, &res); assert (NULL != endptr); return res; } Real64_t Real64_strto (NullString8_t s, C_Int_t rounding) { char *endptr; Real64_t res; int ret; ret = gdtoa__strtord ((const char*)s, &endptr, (int)rounding, &res); assert (NULL != endptr); return res; } mlton-20100608/runtime/basis/Stdio.c0000644000076600000240000000075511404435622015601 0ustar mtfstaff#include "platform.h" void Stdio_printStderr (String8_t s) { uintmax_t size = GC_getArrayLength ((pointer)s); if (0 == size) return; while (1 != fwrite ((const void*)s, (size_t)size, 1, stderr)) /* nothing */; } void Stdio_printStdout (String8_t s) { uintmax_t size = GC_getArrayLength ((pointer)s); if (0 == size) return; while (1 != fwrite ((const void*)s, (size_t)size, 1, stdout)) /* nothing */; } void Stdio_print (String8_t s) { Stdio_printStderr (s); } mlton-20100608/runtime/basis/System/0000755000076600000240000000000011404470407015630 5ustar mtfstaffmlton-20100608/runtime/basis/System/CommandLine.c0000644000076600000240000000035611404435622020166 0ustar mtfstaff#include "platform.h" /* Manual initialization is a work-around for a Darwin linker issue. */ C_Int_t CommandLine_argc = 0; C_StringArray_t CommandLine_argv = (C_StringArray_t)NULL; C_String_t CommandLine_commandName = (C_String_t)NULL; mlton-20100608/runtime/basis/System/Date.c0000644000076600000240000000351211404435622016652 0ustar mtfstaff#include "platform.h" static struct tm Date_tmIn; static struct tm *Date_tmOut; C_Int_t Date_Tm_getHour(void) { return Date_tmOut->tm_hour; } C_Int_t Date_Tm_getIsDst(void) { return Date_tmOut->tm_isdst; } C_Int_t Date_Tm_getMDay(void) { return Date_tmOut->tm_mday; } C_Int_t Date_Tm_getMin(void) { return Date_tmOut->tm_min; } C_Int_t Date_Tm_getMon(void) { return Date_tmOut->tm_mon; } C_Int_t Date_Tm_getSec(void) { return Date_tmOut->tm_sec; } C_Int_t Date_Tm_getWDay(void) { return Date_tmOut->tm_wday; } C_Int_t Date_Tm_getYDay(void) { return Date_tmOut->tm_yday; } C_Int_t Date_Tm_getYear(void) { return Date_tmOut->tm_year; } void Date_Tm_setHour(C_Int_t x) { Date_tmIn.tm_hour = x; } void Date_Tm_setIsDst(C_Int_t x) { Date_tmIn.tm_isdst = x; } void Date_Tm_setMDay(C_Int_t x) { Date_tmIn.tm_mday = x; } void Date_Tm_setMin(C_Int_t x) { Date_tmIn.tm_min = x; } void Date_Tm_setMon(C_Int_t x) { Date_tmIn.tm_mon = x; } void Date_Tm_setSec(C_Int_t x) { Date_tmIn.tm_sec = x; } void Date_Tm_setWDay(C_Int_t x) { Date_tmIn.tm_wday = x; } void Date_Tm_setYDay(C_Int_t x) { Date_tmIn.tm_yday = x; } void Date_Tm_setYear(C_Int_t x) { Date_tmIn.tm_year = x; } C_Errno_t(C_Int_t) Date_gmTime(Ref(C_Time_t) p) { Date_tmOut = gmtime((time_t*)p); if (Date_tmOut == NULL) return -1; return 0; } /* The idea for Date_localOffset comes from KitV3 src/Runtime/Time.c */ C_Double_t Date_localOffset(void) { time_t t1, t2; t1 = time(NULL); t2 = mktime(gmtime(&t1)); return difftime(t2, t1); } C_Errno_t(C_Int_t) Date_localTime(Ref(C_Time_t) p) { Date_tmOut = localtime((time_t*)p); if (Date_tmOut == NULL) return -1; return 0; } C_Errno_t(C_Time_t) Date_mkTime(void) { return mktime(&Date_tmIn); } C_Size_t Date_strfTime(Array(Char8_t) buf, C_Size_t n, NullString8_t fmt) { return strftime((char*)(buf), n, (const char*)(fmt), &Date_tmIn); } mlton-20100608/runtime/basis/System/OS/0000755000076600000240000000000011404470407016151 5ustar mtfstaffmlton-20100608/runtime/basis/System/OS/IO/0000755000076600000240000000000011404470407016460 5ustar mtfstaffmlton-20100608/runtime/basis/System/OS/IO/poll-consts.c0000644000076600000240000000022011404435622021073 0ustar mtfstaff#include "platform.h" const C_Short_t OS_IO_POLLIN = POLLIN; const C_Short_t OS_IO_POLLPRI = POLLPRI; const C_Short_t OS_IO_POLLOUT = POLLOUT; mlton-20100608/runtime/basis/System/OS/IO/poll.c0000644000076600000240000000100111404435622017562 0ustar mtfstaff#include "platform.h" C_Errno_t(C_Int_t) OS_IO_poll (Vector(C_Fd_t) fds, Vector(C_Short_t) eventss, C_NFds_t n, C_Int_t timeout, Array(C_Short_t) reventss) { unsigned int i; int res; struct pollfd ufds[n]; for (i = 0; i < n; i++) { ufds[i].fd = ((const int*)fds)[i]; ufds[i].events = ((const short*)eventss)[i]; } res = poll (ufds, n, timeout); for (i = 0; i < n; i++) { ((short*)reventss)[i] = ufds[i].revents; } return res; } mlton-20100608/runtime/basis/System/Time.c0000644000076600000240000000047011404435622016673 0ustar mtfstaff#include "platform.h" C_Int_t Time_getTimeOfDay (Ref(C_Time_t) sec, Ref(C_SUSeconds_t) usec) { struct timeval timeval; int res; res = gettimeofday (&timeval, (struct timezone*)NULL); if (! res) { *((C_Time_t*)sec) = timeval.tv_sec; *((C_SUSeconds_t*)usec) = timeval.tv_usec; } return res; } mlton-20100608/runtime/basis/Word/0000755000076600000240000000000011404470407015257 5ustar mtfstaffmlton-20100608/runtime/basis/Word/Word-check.h0000644000076600000240000002151111404435622017416 0ustar mtfstaff #define WordS_addCheckBody(size, x, y, doOverflow, doSuccess) \ do { \ if (x >= 0) { \ if (y > WordS##size##_max - x) { \ doOverflow; \ } \ } else if (y < WordS##size##_min - x) { \ doOverflow; \ } \ doSuccess; \ } while (0) #define WordS_addCheckBodyCX(size, c, x, doOverflow, doSuccess) \ WordS_addCheckBody(size, c, x, doOverflow, doSuccess) #define WordU_addCheckBody(size, x, y, doOverflow, doSuccess) \ do { \ if (y > Word##size##_max - x) { \ doOverflow; \ } \ doSuccess; \ } while (0) #define WordU_addCheckBodyCX(size, c, x, doOverflow, doSuccess) \ WordU_addCheckBody(size, c, x, doOverflow, doSuccess) #define WordS_mulCheckBody(size, x, y, doOverflow, doSuccess) \ do { \ if ((x == (WordS##size)0) || (y == (WordS##size)0)) { \ } else \ if (x > (WordS## size)0) { \ if (y > (WordS##size)0) { \ if (x > WordS##size##_quot (WordS##size##_max, y)) { \ doOverflow; \ } \ } else /* (y < (WordS##size)0) */ { \ if (y < WordS##size##_quot (WordS##size##_min, x)) { \ doOverflow; \ } \ } \ } else /* (x < (WordS##size)0) */ { \ if (y > (WordS##size)0) { \ if (x < WordS##size##_quot (WordS##size##_min, y)) { \ doOverflow; \ } \ } else /* (y < (WordS##size)0) */ { \ if (y < WordS##size##_quot (WordS##size##_max, x)) { \ doOverflow; \ } \ } \ } \ doSuccess; \ } while (0) // #undef WordS_mulCheckBody #define WordU_mulCheckBody(size, x, y, doOverflow, doSuccess) \ do { \ if ((x == (WordU##size)0) || (y == (WordU##size)0)) { \ } else \ if (x > WordU##size##_quot (Word##size##_max, y)) { \ doOverflow; \ } \ doSuccess; \ } while (0) // #undef WordU_mulCheckBody /* #define Word_mulCheckBody(small, large, x, y, doOverflow, doSuccess) \ */ /* do { \ */ /* Word##large tmp; \ */ /* Word##small res; \ */ /* tmp = ((Word##large)x) * ((Word##large)y); \ */ /* res = (Word##small)tmp; \ */ /* if (tmp != res) { \ */ /* doOverflow; \ */ /* } \ */ /* doSuccess; \ */ /* } while (0) */ /* #define WordS_mulCheckBody(small, large, x, y, doOverflow, doSuccess) \ */ /* Word_mulCheckBody(S##small, S##large, x, y, doOverflow, doSuccess) */ /* #define WordU_mulCheckBody(small, large, x, y, doOverflow, doSuccess) \ */ /* Word_mulCheckBody(U##small, U##large, x, y, doOverflow, doSuccess) */ #define WordS_negCheckBody(size, x, doOverflow, doSuccess) \ do { \ if (x == WordS##size##_min) { \ doOverflow; \ } \ doSuccess; \ } while (0) #define WordS_subCheckBodyCX(size, c, x, doOverflow, doSuccess) \ do { \ if (c >= 0) { \ if (x < c - WordS##size##_max) { \ doOverflow; \ } \ } else if (x > c - WordS##size##_min) { \ doOverflow; \ } \ doSuccess; \ } while (0) #define WordS_subCheckBodyXC(size, x, c, doOverflow, doSuccess) \ do { \ if (c <= 0) { \ if (x > WordS##size##_max + c) { \ doOverflow; \ } \ } else if (x < WordS##size##_min + c) { \ doOverflow; \ } \ doSuccess; \ } while (0) #define WordS_subCheckBody(size, x, y, doOverflow, doSuccess) \ WordS_subCheckBodyCX(size, x, y, doOverflow, doSuccess) #define WordS_addCheckOverflows(size) \ MLTON_CODEGEN_STATIC_INLINE \ Bool WordS##size##_addCheckOverflows (WordS##size x, WordS##size y) { \ WordS_addCheckBody(size, x, y, return TRUE, return FALSE); \ } #define WordU_addCheckOverflows(size) \ MLTON_CODEGEN_STATIC_INLINE \ Bool WordU##size##_addCheckOverflows (WordU##size x, WordU##size y) { \ WordU_addCheckBody(size, x, y, return TRUE, return FALSE); \ } #define WordS_mulCheckOverflows(size) \ MLTON_CODEGEN_STATIC_INLINE \ Bool WordS##size##_mulCheckOverflows (WordS##size x, WordS##size y) { \ WordS_mulCheckBody(size, x, y, return TRUE, return FALSE); \ } #define WordU_mulCheckOverflows(size) \ MLTON_CODEGEN_STATIC_INLINE \ Bool WordU##size##_mulCheckOverflows (WordU##size x, WordU##size y) { \ WordU_mulCheckBody(size, x, y, return TRUE, return FALSE); \ } #define WordS_negCheckOverflows(size) \ MLTON_CODEGEN_STATIC_INLINE \ Bool WordS##size##_negCheckOverflows (WordS##size x) { \ WordS_negCheckBody(size, x, return TRUE, return FALSE); \ } #define WordS_subCheckOverflows(size) \ MLTON_CODEGEN_STATIC_INLINE \ Bool WordS##size##_subCheckOverflows (WordS##size x, WordS##size y) { \ WordS_subCheckBody(size, x, y, return TRUE, return FALSE); \ } #define all(size) \ WordS_addCheckOverflows(size) \ WordU_addCheckOverflows(size) \ WordS_mulCheckOverflows(size) \ WordU_mulCheckOverflows(size) \ WordS_negCheckOverflows(size) \ WordS_subCheckOverflows(size) all(8) all(16) all(32) all(64) #undef all #undef WordS_subCheckOverflows #undef WordS_negCheckOverflows #undef WordU_mulCheckOverflows #undef WordS_mulCheckOverflows #undef WordU_addCheckOverflows #undef WordS_addCheckOverflows mlton-20100608/runtime/basis/Word/Word-consts.h0000644000076600000240000000072311404435622017654 0ustar mtfstaff#define WordS8_max (WordS8)0x7F #define WordS8_min (WordS8)0x80 #define WordS16_max (WordS16)0x7FFF #define WordS16_min (WordS16)0x8000 #define WordS32_max (WordS32)0x7FFFFFFF #define WordS32_min (WordS32)0x80000000 #define WordS64_max (WordS64)0x7FFFFFFFFFFFFFFFll #define WordS64_min (WordS64)0x8000000000000000ll #define Word8_max (Word8)0xFF #define Word16_max (Word16)0xFFFF #define Word32_max (Word32)0xFFFFFFFF #define Word64_max (Word64)0xFFFFFFFFFFFFFFFFull mlton-20100608/runtime/basis/Word/Word-ops.h0000644000076600000240000001473511404435622017154 0ustar mtfstaff #define binary(kind, name, op) \ MLTON_CODEGEN_STATIC_INLINE \ Word##kind Word##kind##_##name (Word##kind w1, Word##kind w2) { \ return w1 op w2; \ } #define bothBinary(size, name, op) \ binary (S##size, name, op) \ binary (U##size, name, op) #define compare(kind, name, op) \ MLTON_CODEGEN_STATIC_INLINE \ Bool Word##kind##_##name (Word##kind w1, Word##kind w2) { \ return w1 op w2; \ } #define bothCompare(size, name, op) \ compare (S##size, name, op) \ compare (U##size, name, op) #define rol(size) \ MLTON_CODEGEN_STATIC_INLINE \ Word##size Word##size##_rol (Word##size w1, Word32 w2) { \ return (w1 >> (size - w2)) | (w1 << w2); \ } #define ror(size) \ MLTON_CODEGEN_STATIC_INLINE \ Word##size Word##size##_ror (Word##size w1, Word32 w2) { \ return (w1 >> w2) | (w1 << (size - w2)); \ } \ #define shift(kind, name, op) \ MLTON_CODEGEN_STATIC_INLINE \ Word##kind Word##kind##_##name (Word##kind w1, Word32 w2) { \ return w1 op w2; \ } #define unary(kind, name, op) \ MLTON_CODEGEN_STATIC_INLINE \ Word##kind Word##kind##_##name (Word##kind w) { \ return op w; \ } #define misaligned(size) \ typedef volatile union { \ Word##size##_t w; \ Word32_t ws[sizeof(Word##size##_t) / sizeof(Word32_t)]; \ } __attribute__((__may_alias__)) Word##size##OrWord32s; \ MLTON_CODEGEN_STATIC_INLINE \ Word##size##_t Word##size##_fetch (Ref(Word##size##_t) wp) { \ Word##size##OrWord32s u; \ Word32_t *wsp; \ wsp = (Word32_t*)wp; \ u.ws[0] = wsp[0]; \ if ((sizeof(Word##size##_t) / sizeof(Word32_t)) > 1) \ u.ws[1] = wsp[1]; \ return u.w; \ } \ MLTON_CODEGEN_STATIC_INLINE \ void Word##size##_store (Ref(Word##size##_t) wp, Word##size##_t w) { \ Word##size##OrWord32s u; \ Word32_t *wsp; \ wsp = (Word32_t*)wp; \ u.w = w; \ wsp[0] = u.ws[0]; \ if ((sizeof(Word##size##_t) / sizeof(Word32_t)) > 1) \ wsp[1] = u.ws[1]; \ return; \ } \ MLTON_CODEGEN_STATIC_INLINE \ void Word##size##_move (Ref(Word##size##_t) dst, Ref(Word##size##_t) src) { \ Word##size##_t w; \ w = Word##size##_fetch (src); \ Word##size##_store (dst, w); \ return; \ } #define all(size) \ binary (size, add, +) \ binary (size, andb, &) \ compare (size, equal, ==) \ bothCompare (size, ge, >=) \ bothCompare (size, gt, >) \ bothCompare (size, le, <=) \ shift (size, lshift, <<) \ bothCompare (size, lt, <) \ bothBinary (size, mul, *) \ unary (size, neg, -) \ unary (size, notb, ~) \ /* WordS_quot and WordS_rem can't be inlined with the C-codegen, \ * because the gcc optimizer sometimes produces incorrect results \ * when one of the arguments is a constant. \ * WordS_quot and WordS_rem can be inlined with the \ * bytecode-codegen, since they will be used in a context where the \ * arguments are variables. \ */ \ MLTON_CODEGEN_WORDSQUOTREM_IMPL(binary (S##size, quot, /)) \ MLTON_CODEGEN_WORDSQUOTREM_IMPL(binary (S##size, rem, %)) \ binary (U##size, quot, /) \ binary (U##size, rem, %) \ binary (size, orb, |) \ rol(size) \ ror(size) \ /* WordS_rshift isn't ANSI C, because ANSI doesn't guarantee sign \ * extension. We use it anyway cause it always seems to work. \ */ \ shift (S##size, rshift, >>) \ shift (U##size, rshift, >>) \ binary (size, sub, -) \ binary (size, xorb, ^) all (8) all (16) all (32) all (64) misaligned(64) #undef all #undef misaligned #undef unary #undef shift #undef ror #undef rol #undef bothCompare #undef compare #undef bothBinary #undef binary mlton-20100608/runtime/basis/Word/Word.c0000644000076600000240000000303611404435622016340 0ustar mtfstaff#include "platform.h" /* * We have to be very careful implementing WordS_quot and WordS_rem using / and % * because C allows * "The direction of truncation for / and the sign of the result for % are * machine-dependent for negative operands, ..." (K&R p. 41) (See also p. 205.) * On the other hand, the SML Basis library spec is completely nailed down. * On x86, gcc implements / and % using idiv, which fortunately does have the * same semantics as the SML Basis library. However, gcc's optimizer sometimes * takes advantage of the flexibility in the C spec when one of the arguments * is a constant, producing incorrect results. So, we have two options: * * Put them in a separate file, all by themselves, without a static inline, and * use / and % where we know gcc's optimer can't hurt us. * OR * Use inline assembler. * * We've gone for the first option because of simplicity, and because * quot and rem are only used with the C codegen. If you really want * speed, you could try inline assembler. * * To get this working on another architecture, you need to check how gcc * implements / and %. */ #if ! (defined(__alpha__) || defined (__amd64__) || defined (__hppa__) || defined (__i386__) || defined(__ia64__) || defined(__mips__) || defined (__ppc__) || defined (__powerpc__) || defined (__powerpc64__) || defined (__sparc__) || defined (__arm__) || defined(__s390__)) #error check that C {/,%} correctly implement {quot,rem} from the basis library #endif #include "Word-consts.h" #include "Word-ops.h" #include "Word-check.h" mlton-20100608/runtime/basis-ffi.h0000644000076600000240000020077011404435622015265 0ustar mtfstaff/* This file is automatically generated. Do not edit. */ #ifndef _MLTON_BASIS_FFI_H_ #define _MLTON_BASIS_FFI_H_ PRIVATE extern C_Int_t CommandLine_argc; PRIVATE extern C_StringArray_t CommandLine_argv; PRIVATE extern C_String_t CommandLine_commandName; PRIVATE C_String_t Cygwin_toFullWindowsPath(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Date_gmTime(Ref(C_Time_t)); PRIVATE C_Double_t Date_localOffset(void); PRIVATE C_Errno_t(C_Int_t) Date_localTime(Ref(C_Time_t)); PRIVATE C_Errno_t(C_Time_t) Date_mkTime(void); PRIVATE C_Size_t Date_strfTime(Array(Char8_t),C_Size_t,NullString8_t); PRIVATE C_Int_t Date_Tm_getHour(void); PRIVATE C_Int_t Date_Tm_getIsDst(void); PRIVATE C_Int_t Date_Tm_getMDay(void); PRIVATE C_Int_t Date_Tm_getMin(void); PRIVATE C_Int_t Date_Tm_getMon(void); PRIVATE C_Int_t Date_Tm_getSec(void); PRIVATE C_Int_t Date_Tm_getWDay(void); PRIVATE C_Int_t Date_Tm_getYDay(void); PRIVATE C_Int_t Date_Tm_getYear(void); PRIVATE void Date_Tm_setHour(C_Int_t); PRIVATE void Date_Tm_setIsDst(C_Int_t); PRIVATE void Date_Tm_setMDay(C_Int_t); PRIVATE void Date_Tm_setMin(C_Int_t); PRIVATE void Date_Tm_setMon(C_Int_t); PRIVATE void Date_Tm_setSec(C_Int_t); PRIVATE void Date_Tm_setWDay(C_Int_t); PRIVATE void Date_Tm_setYDay(C_Int_t); PRIVATE void Date_Tm_setYear(C_Int_t); PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_INFINITE; PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_NAN; PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_NORMAL; PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_SUBNORMAL; PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_ZERO; PRIVATE C_Int_t IEEEReal_getRoundingMode(void); PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_DOWNWARD; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_NOSUPPORT; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_TONEAREST; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_TOWARDZERO; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_UPWARD; PRIVATE C_Int_t IEEEReal_setRoundingMode(C_Int_t); PRIVATE void MinGW_clearNonBlock(C_Fd_t); PRIVATE C_Size_t MinGW_getTempPath(C_Size_t,Array(Char8_t)); PRIVATE void MinGW_setNonBlock(C_Fd_t); PRIVATE __attribute__((noreturn)) void MLton_bug(String8_t); PRIVATE extern const C_Int_t MLton_Itimer_PROF; PRIVATE extern const C_Int_t MLton_Itimer_REAL; PRIVATE C_Errno_t(C_Int_t) MLton_Itimer_set(C_Int_t,C_Time_t,C_SUSeconds_t,C_Time_t,C_SUSeconds_t); PRIVATE extern const C_Int_t MLton_Itimer_VIRTUAL; PRIVATE C_Errno_t(C_PId_t) MLton_Process_spawne(NullString8_t,Array(NullString8_t),Array(NullString8_t)); PRIVATE C_Errno_t(C_PId_t) MLton_Process_spawnp(NullString8_t,Array(NullString8_t)); PRIVATE extern const C_Int_t MLton_Rlimit_AS; PRIVATE extern const C_Int_t MLton_Rlimit_CORE; PRIVATE extern const C_Int_t MLton_Rlimit_CPU; PRIVATE extern const C_Int_t MLton_Rlimit_DATA; PRIVATE extern const C_Int_t MLton_Rlimit_FSIZE; PRIVATE C_Errno_t(C_Int_t) MLton_Rlimit_get(C_Int_t); PRIVATE C_RLim_t MLton_Rlimit_getHard(void); PRIVATE C_RLim_t MLton_Rlimit_getSoft(void); PRIVATE extern const C_RLim_t MLton_Rlimit_INFINITY; PRIVATE extern const C_Int_t MLton_Rlimit_MEMLOCK; PRIVATE extern const C_Int_t MLton_Rlimit_NOFILE; PRIVATE extern const C_Int_t MLton_Rlimit_NPROC; PRIVATE extern const C_Int_t MLton_Rlimit_RSS; PRIVATE C_Errno_t(C_Int_t) MLton_Rlimit_set(C_Int_t,C_RLim_t,C_RLim_t); PRIVATE extern const C_Int_t MLton_Rlimit_STACK; PRIVATE C_Time_t MLton_Rusage_children_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_children_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_children_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_children_utime_usec(void); PRIVATE C_Time_t MLton_Rusage_gc_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_gc_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_gc_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_gc_utime_usec(void); PRIVATE void MLton_Rusage_getrusage(void); PRIVATE C_Time_t MLton_Rusage_self_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_self_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_self_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_self_utime_usec(void); PRIVATE void MLton_Syslog_closelog(void); PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_AUTH; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_CRON; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_DAEMON; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_KERN; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL0; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL1; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL2; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL3; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL4; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL5; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL6; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL7; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LPR; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_MAIL; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_NEWS; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_SYSLOG; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_USER; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_UUCP; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_CONS; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_NDELAY; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_NOWAIT; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_ODELAY; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_PERROR; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_PID; PRIVATE void MLton_Syslog_openlog(NullString8_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_ALERT; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_CRIT; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_DEBUG; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_EMERG; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_ERR; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_INFO; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_NOTICE; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_WARNING; PRIVATE void MLton_Syslog_syslog(C_Int_t,NullString8_t); PRIVATE Word32_t Net_htonl(Word32_t); PRIVATE Word16_t Net_htons(Word16_t); PRIVATE Word32_t Net_ntohl(Word32_t); PRIVATE Word16_t Net_ntohs(Word16_t); PRIVATE C_Int_t NetHostDB_getByAddress(Vector(Word8_t),C_Socklen_t); PRIVATE C_Int_t NetHostDB_getByName(NullString8_t); PRIVATE void NetHostDB_getEntryAddrsN(C_Int_t,Array(Word8_t)); PRIVATE C_Int_t NetHostDB_getEntryAddrsNum(void); PRIVATE C_Int_t NetHostDB_getEntryAddrType(void); PRIVATE C_String_t NetHostDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetHostDB_getEntryAliasesNum(void); PRIVATE C_Int_t NetHostDB_getEntryLength(void); PRIVATE C_String_t NetHostDB_getEntryName(void); PRIVATE C_Errno_t(C_Int_t) NetHostDB_getHostName(Array(Char8_t),C_Size_t); PRIVATE extern const C_Int_t NetHostDB_INADDR_ANY; PRIVATE extern const C_Size_t NetHostDB_inAddrSize; PRIVATE C_Int_t NetProtDB_getByName(NullString8_t); PRIVATE C_Int_t NetProtDB_getByNumber(C_Int_t); PRIVATE C_String_t NetProtDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetProtDB_getEntryAliasesNum(void); PRIVATE C_String_t NetProtDB_getEntryName(void); PRIVATE C_Int_t NetProtDB_getEntryProto(void); PRIVATE C_Int_t NetServDB_getByName(NullString8_t,NullString8_t); PRIVATE C_Int_t NetServDB_getByNameNull(NullString8_t); PRIVATE C_Int_t NetServDB_getByPort(C_Int_t,NullString8_t); PRIVATE C_Int_t NetServDB_getByPortNull(C_Int_t); PRIVATE C_String_t NetServDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetServDB_getEntryAliasesNum(void); PRIVATE C_String_t NetServDB_getEntryName(void); PRIVATE C_Int_t NetServDB_getEntryPort(void); PRIVATE C_String_t NetServDB_getEntryProto(void); PRIVATE C_Errno_t(C_Int_t) OS_IO_poll(Vector(C_Fd_t),Vector(C_Short_t),C_NFds_t,C_Int_t,Array(C_Short_t)); PRIVATE extern const C_Short_t OS_IO_POLLIN; PRIVATE extern const C_Short_t OS_IO_POLLOUT; PRIVATE extern const C_Short_t OS_IO_POLLPRI; PRIVATE void Posix_Error_clearErrno(void); PRIVATE extern const C_Int_t Posix_Error_E2BIG; PRIVATE extern const C_Int_t Posix_Error_EACCES; PRIVATE extern const C_Int_t Posix_Error_EADDRINUSE; PRIVATE extern const C_Int_t Posix_Error_EADDRNOTAVAIL; PRIVATE extern const C_Int_t Posix_Error_EAFNOSUPPORT; PRIVATE extern const C_Int_t Posix_Error_EAGAIN; PRIVATE extern const C_Int_t Posix_Error_EALREADY; PRIVATE extern const C_Int_t Posix_Error_EBADF; PRIVATE extern const C_Int_t Posix_Error_EBADMSG; PRIVATE extern const C_Int_t Posix_Error_EBUSY; PRIVATE extern const C_Int_t Posix_Error_ECANCELED; PRIVATE extern const C_Int_t Posix_Error_ECHILD; PRIVATE extern const C_Int_t Posix_Error_ECONNABORTED; PRIVATE extern const C_Int_t Posix_Error_ECONNREFUSED; PRIVATE extern const C_Int_t Posix_Error_ECONNRESET; PRIVATE extern const C_Int_t Posix_Error_EDEADLK; PRIVATE extern const C_Int_t Posix_Error_EDESTADDRREQ; PRIVATE extern const C_Int_t Posix_Error_EDOM; PRIVATE extern const C_Int_t Posix_Error_EDQUOT; PRIVATE extern const C_Int_t Posix_Error_EEXIST; PRIVATE extern const C_Int_t Posix_Error_EFAULT; PRIVATE extern const C_Int_t Posix_Error_EFBIG; PRIVATE extern const C_Int_t Posix_Error_EHOSTUNREACH; PRIVATE extern const C_Int_t Posix_Error_EIDRM; PRIVATE extern const C_Int_t Posix_Error_EILSEQ; PRIVATE extern const C_Int_t Posix_Error_EINPROGRESS; PRIVATE extern const C_Int_t Posix_Error_EINTR; PRIVATE extern const C_Int_t Posix_Error_EINVAL; PRIVATE extern const C_Int_t Posix_Error_EIO; PRIVATE extern const C_Int_t Posix_Error_EISCONN; PRIVATE extern const C_Int_t Posix_Error_EISDIR; PRIVATE extern const C_Int_t Posix_Error_ELOOP; PRIVATE extern const C_Int_t Posix_Error_EMFILE; PRIVATE extern const C_Int_t Posix_Error_EMLINK; PRIVATE extern const C_Int_t Posix_Error_EMSGSIZE; PRIVATE extern const C_Int_t Posix_Error_EMULTIHOP; PRIVATE extern const C_Int_t Posix_Error_ENAMETOOLONG; PRIVATE extern const C_Int_t Posix_Error_ENETDOWN; PRIVATE extern const C_Int_t Posix_Error_ENETRESET; PRIVATE extern const C_Int_t Posix_Error_ENETUNREACH; PRIVATE extern const C_Int_t Posix_Error_ENFILE; PRIVATE extern const C_Int_t Posix_Error_ENOBUFS; PRIVATE extern const C_Int_t Posix_Error_ENODATA; PRIVATE extern const C_Int_t Posix_Error_ENODEV; PRIVATE extern const C_Int_t Posix_Error_ENOENT; PRIVATE extern const C_Int_t Posix_Error_ENOEXEC; PRIVATE extern const C_Int_t Posix_Error_ENOLCK; PRIVATE extern const C_Int_t Posix_Error_ENOLINK; PRIVATE extern const C_Int_t Posix_Error_ENOMEM; PRIVATE extern const C_Int_t Posix_Error_ENOMSG; PRIVATE extern const C_Int_t Posix_Error_ENOPROTOOPT; PRIVATE extern const C_Int_t Posix_Error_ENOSPC; PRIVATE extern const C_Int_t Posix_Error_ENOSR; PRIVATE extern const C_Int_t Posix_Error_ENOSTR; PRIVATE extern const C_Int_t Posix_Error_ENOSYS; PRIVATE extern const C_Int_t Posix_Error_ENOTCONN; PRIVATE extern const C_Int_t Posix_Error_ENOTDIR; PRIVATE extern const C_Int_t Posix_Error_ENOTEMPTY; PRIVATE extern const C_Int_t Posix_Error_ENOTSOCK; PRIVATE extern const C_Int_t Posix_Error_ENOTSUP; PRIVATE extern const C_Int_t Posix_Error_ENOTTY; PRIVATE extern const C_Int_t Posix_Error_ENXIO; PRIVATE extern const C_Int_t Posix_Error_EOPNOTSUPP; PRIVATE extern const C_Int_t Posix_Error_EOVERFLOW; PRIVATE extern const C_Int_t Posix_Error_EPERM; PRIVATE extern const C_Int_t Posix_Error_EPIPE; PRIVATE extern const C_Int_t Posix_Error_EPROTO; PRIVATE extern const C_Int_t Posix_Error_EPROTONOSUPPORT; PRIVATE extern const C_Int_t Posix_Error_EPROTOTYPE; PRIVATE extern const C_Int_t Posix_Error_ERANGE; PRIVATE extern const C_Int_t Posix_Error_EROFS; PRIVATE extern const C_Int_t Posix_Error_ESPIPE; PRIVATE extern const C_Int_t Posix_Error_ESRCH; PRIVATE extern const C_Int_t Posix_Error_ESTALE; PRIVATE extern const C_Int_t Posix_Error_ETIME; PRIVATE extern const C_Int_t Posix_Error_ETIMEDOUT; PRIVATE extern const C_Int_t Posix_Error_ETXTBSY; PRIVATE extern const C_Int_t Posix_Error_EWOULDBLOCK; PRIVATE extern const C_Int_t Posix_Error_EXDEV; PRIVATE C_Int_t Posix_Error_getErrno(void); PRIVATE C_String_t Posix_Error_strError(C_Int_t); PRIVATE extern const C_Int_t Posix_FileSys_A_F_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_R_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_W_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_X_OK; PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_access(NullString8_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chdir(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chmod(NullString8_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chown(NullString8_t,C_UId_t,C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Dirstream_closeDir(C_DirP_t); PRIVATE C_Errno_t(C_DirP_t) Posix_FileSys_Dirstream_openDir(NullString8_t); PRIVATE C_Errno_t(C_String_t) Posix_FileSys_Dirstream_readDir(C_DirP_t); PRIVATE void Posix_FileSys_Dirstream_rewindDir(C_DirP_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchdir(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchmod(C_Fd_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchown(C_Fd_t,C_UId_t,C_GId_t); PRIVATE C_Errno_t(C_Long_t) Posix_FileSys_fpathconf(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_ftruncate(C_Fd_t,C_Off_t); PRIVATE C_Errno_t(C_String_t) Posix_FileSys_getcwd(Array(Char8_t),C_Size_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_link(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_mkdir(NullString8_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_mkfifo(NullString8_t,C_Mode_t); PRIVATE extern const C_Int_t Posix_FileSys_O_APPEND; PRIVATE extern const C_Int_t Posix_FileSys_O_BINARY; PRIVATE extern const C_Int_t Posix_FileSys_O_CREAT; PRIVATE extern const C_Int_t Posix_FileSys_O_DSYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_EXCL; PRIVATE extern const C_Int_t Posix_FileSys_O_NOCTTY; PRIVATE extern const C_Int_t Posix_FileSys_O_NONBLOCK; PRIVATE extern const C_Int_t Posix_FileSys_O_RDONLY; PRIVATE extern const C_Int_t Posix_FileSys_O_RDWR; PRIVATE extern const C_Int_t Posix_FileSys_O_RSYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_SYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_TEXT; PRIVATE extern const C_Int_t Posix_FileSys_O_TRUNC; PRIVATE extern const C_Int_t Posix_FileSys_O_WRONLY; PRIVATE C_Errno_t(C_Fd_t) Posix_FileSys_open2(NullString8_t,C_Int_t); PRIVATE C_Errno_t(C_Fd_t) Posix_FileSys_open3(NullString8_t,C_Int_t,C_Mode_t); PRIVATE C_Errno_t(C_Long_t) Posix_FileSys_pathconf(NullString8_t,C_Int_t); PRIVATE extern const C_Int_t Posix_FileSys_PC_ALLOC_SIZE_MIN; PRIVATE extern const C_Int_t Posix_FileSys_PC_ASYNC_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_CHOWN_RESTRICTED; PRIVATE extern const C_Int_t Posix_FileSys_PC_FILESIZEBITS; PRIVATE extern const C_Int_t Posix_FileSys_PC_LINK_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_MAX_CANON; PRIVATE extern const C_Int_t Posix_FileSys_PC_MAX_INPUT; PRIVATE extern const C_Int_t Posix_FileSys_PC_NAME_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_NO_TRUNC; PRIVATE extern const C_Int_t Posix_FileSys_PC_PATH_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_PIPE_BUF; PRIVATE extern const C_Int_t Posix_FileSys_PC_PRIO_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_INCR_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_MAX_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_MIN_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_XFER_ALIGN; PRIVATE extern const C_Int_t Posix_FileSys_PC_SYMLINK_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_SYNC_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_TWO_SYMLINKS; PRIVATE extern const C_Int_t Posix_FileSys_PC_VDISABLE; PRIVATE C_Errno_t(C_SSize_t) Posix_FileSys_readlink(NullString8_t,Array(Char8_t),C_Size_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_rename(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_rmdir(NullString8_t); PRIVATE extern const C_Mode_t Posix_FileSys_S_IFBLK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFCHR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFDIR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFIFO; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFLNK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFMT; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFREG; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFSOCK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IROTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRUSR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXG; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXO; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXU; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISGID; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISUID; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISVTX; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWOTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWUSR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXOTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXUSR; PRIVATE C_Int_t Posix_FileSys_ST_isBlk(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isChr(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isDir(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isFIFO(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isLink(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isReg(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isSock(C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_fstat(C_Fd_t); PRIVATE C_Time_t Posix_FileSys_Stat_getATime(void); PRIVATE C_Time_t Posix_FileSys_Stat_getCTime(void); PRIVATE C_Dev_t Posix_FileSys_Stat_getDev(void); PRIVATE C_GId_t Posix_FileSys_Stat_getGId(void); PRIVATE C_INo_t Posix_FileSys_Stat_getINo(void); PRIVATE C_Mode_t Posix_FileSys_Stat_getMode(void); PRIVATE C_Time_t Posix_FileSys_Stat_getMTime(void); PRIVATE C_NLink_t Posix_FileSys_Stat_getNLink(void); PRIVATE C_Dev_t Posix_FileSys_Stat_getRDev(void); PRIVATE C_Off_t Posix_FileSys_Stat_getSize(void); PRIVATE C_UId_t Posix_FileSys_Stat_getUId(void); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_lstat(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_stat(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_symlink(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_truncate(NullString8_t,C_Off_t); PRIVATE C_Mode_t Posix_FileSys_umask(C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_unlink(NullString8_t); PRIVATE void Posix_FileSys_Utimbuf_setAcTime(C_Time_t); PRIVATE void Posix_FileSys_Utimbuf_setModTime(C_Time_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Utimbuf_utime(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_close(C_Fd_t); PRIVATE C_Errno_t(C_Fd_t) Posix_IO_dup(C_Fd_t); PRIVATE C_Errno_t(C_Fd_t) Posix_IO_dup2(C_Fd_t,C_Fd_t); PRIVATE extern const C_Int_t Posix_IO_F_DUPFD; PRIVATE extern const C_Int_t Posix_IO_F_GETFD; PRIVATE extern const C_Int_t Posix_IO_F_GETFL; PRIVATE extern const C_Int_t Posix_IO_F_GETOWN; PRIVATE extern const C_Int_t Posix_IO_F_SETFD; PRIVATE extern const C_Int_t Posix_IO_F_SETFL; PRIVATE extern const C_Int_t Posix_IO_F_SETOWN; PRIVATE C_Errno_t(C_Int_t) Posix_IO_fcntl2(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_fcntl3(C_Fd_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t Posix_IO_FD_CLOEXEC; PRIVATE extern const C_Int_t Posix_IO_FLock_F_GETLK; PRIVATE extern const C_Short_t Posix_IO_FLock_F_RDLCK; PRIVATE extern const C_Int_t Posix_IO_FLock_F_SETLK; PRIVATE extern const C_Int_t Posix_IO_FLock_F_SETLKW; PRIVATE extern const C_Short_t Posix_IO_FLock_F_UNLCK; PRIVATE extern const C_Short_t Posix_IO_FLock_F_WRLCK; PRIVATE C_Errno_t(C_Int_t) Posix_IO_FLock_fcntl(C_Fd_t,C_Int_t); PRIVATE C_Off_t Posix_IO_FLock_getLen(void); PRIVATE C_PId_t Posix_IO_FLock_getPId(void); PRIVATE C_Off_t Posix_IO_FLock_getStart(void); PRIVATE C_Short_t Posix_IO_FLock_getType(void); PRIVATE C_Short_t Posix_IO_FLock_getWhence(void); PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_CUR; PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_END; PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_SET; PRIVATE void Posix_IO_FLock_setLen(C_Off_t); PRIVATE void Posix_IO_FLock_setPId(C_PId_t); PRIVATE void Posix_IO_FLock_setStart(C_Off_t); PRIVATE void Posix_IO_FLock_setType(C_Short_t); PRIVATE void Posix_IO_FLock_setWhence(C_Short_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_fsync(C_Fd_t); PRIVATE C_Errno_t(C_Off_t) Posix_IO_lseek(C_Fd_t,C_Off_t,C_Int_t); PRIVATE extern const C_Int_t Posix_IO_O_ACCMODE; PRIVATE C_Errno_t(C_Int_t) Posix_IO_pipe(Array(C_Fd_t)); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_readChar8(C_Fd_t,Array(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_readWord8(C_Fd_t,Array(Word8_t),C_Int_t,C_Size_t); PRIVATE extern const C_Int_t Posix_IO_SEEK_CUR; PRIVATE extern const C_Int_t Posix_IO_SEEK_END; PRIVATE extern const C_Int_t Posix_IO_SEEK_SET; PRIVATE void Posix_IO_setbin(C_Fd_t); PRIVATE void Posix_IO_settext(C_Fd_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeChar8Arr(C_Fd_t,Array(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeChar8Vec(C_Fd_t,Vector(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeWord8Arr(C_Fd_t,Array(Word8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeWord8Vec(C_Fd_t,Vector(Word8_t),C_Int_t,C_Size_t); PRIVATE C_String_t Posix_ProcEnv_ctermid(void); PRIVATE extern C_StringArray_t Posix_ProcEnv_environ; PRIVATE C_GId_t Posix_ProcEnv_getegid(void); PRIVATE C_String_t Posix_ProcEnv_getenv(NullString8_t); PRIVATE C_UId_t Posix_ProcEnv_geteuid(void); PRIVATE C_GId_t Posix_ProcEnv_getgid(void); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_getgroups(C_Int_t,Array(C_GId_t)); PRIVATE C_Int_t Posix_ProcEnv_getgroupsN(void); PRIVATE C_Errno_t(C_String_t) Posix_ProcEnv_getlogin(void); PRIVATE C_PId_t Posix_ProcEnv_getpgrp(void); PRIVATE C_PId_t Posix_ProcEnv_getpid(void); PRIVATE C_PId_t Posix_ProcEnv_getppid(void); PRIVATE C_UId_t Posix_ProcEnv_getuid(void); PRIVATE C_Int_t Posix_ProcEnv_isatty(C_Fd_t); PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_C_BIND; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_C_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_CHAR_TERM; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_FORT_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_FORT_RUN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_LOCALEDEF; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_ACCOUNTING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_CHECKPOINT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_LOCATE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_MESSAGE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_TRACK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_SW_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_UPE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_VERSION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ADVISORY_INFO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_LISTIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ARG_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ASYNCHRONOUS_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ATEXIT_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BARRIERS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_BASE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_DIM_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_SCALE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_STRING_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CHILD_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CLK_TCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CLOCK_SELECTION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_COLL_WEIGHTS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CPUTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_DELAYTIMER_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_EXPR_NEST_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_FSYNC; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_GETGR_R_SIZE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_GETPW_R_SIZE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_HOST_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_IOV_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_IPV6; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_JOB_CONTROL; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_LINE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_LOGIN_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MAPPED_FILES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMLOCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMLOCK_RANGE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMORY_PROTECTION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MESSAGE_PASSING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MONOTONIC_CLOCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MQ_OPEN_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MQ_PRIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_NGROUPS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_OPEN_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PAGE_SIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PAGESIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PRIORITIZED_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PRIORITY_SCHEDULING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RAW_SOCKETS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RE_DUP_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_READER_WRITER_LOCKS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_REALTIME_SIGNALS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_REGEXP; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RTSIG_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SAVED_IDS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEM_NSEMS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEM_VALUE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEMAPHORES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SHELL; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SIGQUEUE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPAWN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPIN_LOCKS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPORADIC_SERVER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SS_REPL_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_STREAM_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SYMLOOP_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SYNCHRONIZED_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_CPUTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_KEYS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_INHERIT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_PROTECT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PROCESS_SHARED; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_STACK_MIN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_THREADS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREADS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMEOUTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMER_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMERS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_FILTER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_INHERIT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_LOG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_SYS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TTY_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TZNAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFF32; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_LP64_OFF64; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_LPBIG_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_VERSION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFF32; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_LP64_OFF64; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_CRYPT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_ENH_I18N; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_LEGACY; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_SHM; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_STREAMS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_UNIX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_VERSION; PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setenv(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setgid(C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setgroups(C_Int_t,Vector(C_GId_t)); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setpgid(C_PId_t,C_PId_t); PRIVATE C_Errno_t(C_PId_t) Posix_ProcEnv_setsid(void); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setuid(C_UId_t); PRIVATE C_Errno_t(C_Long_t) Posix_ProcEnv_sysconf(C_Int_t); PRIVATE C_Errno_t(C_Clock_t) Posix_ProcEnv_times(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getCSTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getCUTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getSTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getUTime(void); PRIVATE C_Errno_t(C_String_t) Posix_ProcEnv_ttyname(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_uname(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getMachine(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getNodeName(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getRelease(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getSysName(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getVersion(void); PRIVATE C_UInt_t Posix_Process_alarm(C_UInt_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_exece(NullString8_t,Array(NullString8_t),Array(NullString8_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Process_execp(NullString8_t,Array(NullString8_t)); PRIVATE __attribute__((noreturn)) void Posix_Process_exit(C_Status_t); PRIVATE C_Int_t Posix_Process_exitStatus(C_Status_t); PRIVATE C_Errno_t(C_PId_t) Posix_Process_fork(void); PRIVATE C_Int_t Posix_Process_ifExited(C_Status_t); PRIVATE C_Int_t Posix_Process_ifSignaled(C_Status_t); PRIVATE C_Int_t Posix_Process_ifStopped(C_Status_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_kill(C_PId_t,C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_nanosleep(Ref(C_Time_t),Ref(C_Long_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Process_pause(void); PRIVATE C_UInt_t Posix_Process_sleep(C_UInt_t); PRIVATE C_Signal_t Posix_Process_stopSig(C_Status_t); PRIVATE C_Errno_t(C_Status_t) Posix_Process_system(NullString8_t); PRIVATE C_Signal_t Posix_Process_termSig(C_Status_t); PRIVATE extern const C_Int_t Posix_Process_W_NOHANG; PRIVATE extern const C_Int_t Posix_Process_W_UNTRACED; PRIVATE C_Errno_t(C_PId_t) Posix_Process_waitpid(C_PId_t,Ref(C_Status_t),C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_default(C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_handlee(C_Signal_t); PRIVATE void Posix_Signal_handleGC(void); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_ignore(C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_isDefault(C_Signal_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_isIgnore(C_Signal_t,Ref(C_Int_t)); PRIVATE C_Int_t Posix_Signal_isPending(C_Signal_t); PRIVATE C_Int_t Posix_Signal_isPendingGC(void); PRIVATE extern const C_Int_t Posix_Signal_NSIG; PRIVATE void Posix_Signal_resetPending(void); PRIVATE extern const C_Int_t Posix_Signal_SIG_BLOCK; PRIVATE extern const C_Int_t Posix_Signal_SIG_SETMASK; PRIVATE extern const C_Int_t Posix_Signal_SIG_UNBLOCK; PRIVATE extern const C_Signal_t Posix_Signal_SIGABRT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigaddset(C_Signal_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGALRM; PRIVATE extern const C_Signal_t Posix_Signal_SIGBUS; PRIVATE extern const C_Signal_t Posix_Signal_SIGCHLD; PRIVATE extern const C_Signal_t Posix_Signal_SIGCONT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigdelset(C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigemptyset(void); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigfillset(void); PRIVATE extern const C_Signal_t Posix_Signal_SIGFPE; PRIVATE extern const C_Signal_t Posix_Signal_SIGHUP; PRIVATE extern const C_Signal_t Posix_Signal_SIGILL; PRIVATE extern const C_Signal_t Posix_Signal_SIGINT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigismember(C_Signal_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGKILL; PRIVATE extern const C_Signal_t Posix_Signal_SIGPIPE; PRIVATE extern const C_Signal_t Posix_Signal_SIGPOLL; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigprocmask(C_Int_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGPROF; PRIVATE extern const C_Signal_t Posix_Signal_SIGQUIT; PRIVATE extern const C_Signal_t Posix_Signal_SIGSEGV; PRIVATE extern const C_Signal_t Posix_Signal_SIGSTOP; PRIVATE void Posix_Signal_sigsuspend(void); PRIVATE extern const C_Signal_t Posix_Signal_SIGSYS; PRIVATE extern const C_Signal_t Posix_Signal_SIGTERM; PRIVATE extern const C_Signal_t Posix_Signal_SIGTRAP; PRIVATE extern const C_Signal_t Posix_Signal_SIGTSTP; PRIVATE extern const C_Signal_t Posix_Signal_SIGTTIN; PRIVATE extern const C_Signal_t Posix_Signal_SIGTTOU; PRIVATE extern const C_Signal_t Posix_Signal_SIGURG; PRIVATE extern const C_Signal_t Posix_Signal_SIGUSR1; PRIVATE extern const C_Signal_t Posix_Signal_SIGUSR2; PRIVATE extern const C_Signal_t Posix_Signal_SIGVTALRM; PRIVATE extern const C_Signal_t Posix_Signal_SIGXCPU; PRIVATE extern const C_Signal_t Posix_Signal_SIGXFSZ; PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getgrgid(C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getgrnam(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getpwnam(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getpwuid(C_GId_t); PRIVATE C_GId_t Posix_SysDB_Group_getGId(void); PRIVATE C_StringArray_t Posix_SysDB_Group_getMem(void); PRIVATE C_String_t Posix_SysDB_Group_getName(void); PRIVATE C_String_t Posix_SysDB_Passwd_getDir(void); PRIVATE C_GId_t Posix_SysDB_Passwd_getGId(void); PRIVATE C_String_t Posix_SysDB_Passwd_getName(void); PRIVATE C_String_t Posix_SysDB_Passwd_getShell(void); PRIVATE C_UId_t Posix_SysDB_Passwd_getUId(void); PRIVATE extern const C_Speed_t Posix_TTY_B0; PRIVATE extern const C_Speed_t Posix_TTY_B110; PRIVATE extern const C_Speed_t Posix_TTY_B1200; PRIVATE extern const C_Speed_t Posix_TTY_B134; PRIVATE extern const C_Speed_t Posix_TTY_B150; PRIVATE extern const C_Speed_t Posix_TTY_B1800; PRIVATE extern const C_Speed_t Posix_TTY_B19200; PRIVATE extern const C_Speed_t Posix_TTY_B200; PRIVATE extern const C_Speed_t Posix_TTY_B2400; PRIVATE extern const C_Speed_t Posix_TTY_B300; PRIVATE extern const C_Speed_t Posix_TTY_B38400; PRIVATE extern const C_Speed_t Posix_TTY_B4800; PRIVATE extern const C_Speed_t Posix_TTY_B50; PRIVATE extern const C_Speed_t Posix_TTY_B600; PRIVATE extern const C_Speed_t Posix_TTY_B75; PRIVATE extern const C_Speed_t Posix_TTY_B9600; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CLOCAL; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CREAD; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS5; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS6; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS7; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS8; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CSIZE; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CSTOPB; PRIVATE extern const C_TCFlag_t Posix_TTY_C_HUPCL; PRIVATE extern const C_TCFlag_t Posix_TTY_C_PARENB; PRIVATE extern const C_TCFlag_t Posix_TTY_C_PARODD; PRIVATE extern const C_TCFlag_t Posix_TTY_I_BRKINT; PRIVATE extern const C_TCFlag_t Posix_TTY_I_ICRNL; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNBRK; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNCR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNPAR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_INLCR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_INPCK; PRIVATE extern const C_TCFlag_t Posix_TTY_I_ISTRIP; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXANY; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXOFF; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXON; PRIVATE extern const C_TCFlag_t Posix_TTY_I_PARMRK; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHO; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHOE; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHOK; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHONL; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ICANON; PRIVATE extern const C_TCFlag_t Posix_TTY_L_IEXTEN; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ISIG; PRIVATE extern const C_TCFlag_t Posix_TTY_L_NOFLSH; PRIVATE extern const C_TCFlag_t Posix_TTY_L_TOSTOP; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BS0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BS1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BSDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR2; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR3; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CRDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FF0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FF1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FFDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NL0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NL1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NLDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OCRNL; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OFILL; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONLCR; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONLRET; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONOCR; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OPOST; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB2; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB3; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TABDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VT0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VT1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VTDLY; PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_drain(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_flow(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_flush(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_getattr(C_Fd_t); PRIVATE C_Errno_t(C_PId_t) Posix_TTY_TC_getpgrp(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_sendbreak(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_setattr(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_setpgrp(C_Fd_t,C_PId_t); PRIVATE extern const C_Int_t Posix_TTY_TC_TCIFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCIOFF; PRIVATE extern const C_Int_t Posix_TTY_TC_TCIOFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCION; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOOFF; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOON; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSADRAIN; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSAFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSANOW; PRIVATE C_Speed_t Posix_TTY_Termios_cfGetISpeed(void); PRIVATE C_Speed_t Posix_TTY_Termios_cfGetOSpeed(void); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetISpeed(C_Speed_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetOSpeed(C_Speed_t); PRIVATE void Posix_TTY_Termios_getCC(Array(C_CC_t)); PRIVATE C_TCFlag_t Posix_TTY_Termios_getCFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getIFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getLFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getOFlag(void); PRIVATE void Posix_TTY_Termios_setCC(Array(C_CC_t)); PRIVATE void Posix_TTY_Termios_setCFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setIFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setLFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setOFlag(C_TCFlag_t); PRIVATE extern const C_Int_t Posix_TTY_V_NCCS; PRIVATE extern const C_Int_t Posix_TTY_V_VEOF; PRIVATE extern const C_Int_t Posix_TTY_V_VEOL; PRIVATE extern const C_Int_t Posix_TTY_V_VERASE; PRIVATE extern const C_Int_t Posix_TTY_V_VINTR; PRIVATE extern const C_Int_t Posix_TTY_V_VKILL; PRIVATE extern const C_Int_t Posix_TTY_V_VMIN; PRIVATE extern const C_Int_t Posix_TTY_V_VQUIT; PRIVATE extern const C_Int_t Posix_TTY_V_VSTART; PRIVATE extern const C_Int_t Posix_TTY_V_VSTOP; PRIVATE extern const C_Int_t Posix_TTY_V_VSUSP; PRIVATE extern const C_Int_t Posix_TTY_V_VTIME; MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_abs(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_add(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Real32_castToWord32(Real32_t); PRIVATE C_Int_t Real32_class(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_div(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real32_equal(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_fetch(Ref(Real32_t)); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_frexp(Real32_t,Ref(C_Int_t)); PRIVATE C_String_t Real32_gdtoa(Real32_t,C_Int_t,C_Int_t,C_Int_t,Ref(C_Int_t)); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_ldexp(Real32_t,C_Int_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real32_le(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real32_lt(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_acos(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_asin(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_atan(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_atan2(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_cos(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_cosh(Real32_t); PRIVATE extern Real32_t Real32_Math_e; MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_exp(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_ln(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_log10(Real32_t); PRIVATE extern Real32_t Real32_Math_pi; MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_pow(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_sin(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_sinh(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_sqrt(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_tan(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_tanh(Real32_t); PRIVATE extern Real32_t Real32_maxFinite; PRIVATE extern Real32_t Real32_minNormalPos; PRIVATE extern Real32_t Real32_minPos; MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_modf(Real32_t,Ref(Real32_t)); MLTON_CODEGEN_STATIC_INLINE void Real32_move(Ref(Real32_t),Ref(Real32_t)); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_mul(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_muladd(Real32_t,Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_mulsub(Real32_t,Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_neg(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_rndToReal32(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real32_rndToReal64(Real32_t); MLTON_CODEGEN_STATIC_INLINE Int16_t Real32_rndToWordS16(Real32_t); MLTON_CODEGEN_STATIC_INLINE Int32_t Real32_rndToWordS32(Real32_t); MLTON_CODEGEN_STATIC_INLINE Int64_t Real32_rndToWordS64(Real32_t); MLTON_CODEGEN_STATIC_INLINE Int8_t Real32_rndToWordS8(Real32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Real32_rndToWordU16(Real32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Real32_rndToWordU32(Real32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Real32_rndToWordU64(Real32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Real32_rndToWordU8(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_round(Real32_t); PRIVATE C_Int_t Real32_signBit(Real32_t); MLTON_CODEGEN_STATIC_INLINE void Real32_store(Ref(Real32_t),Real32_t); PRIVATE Real32_t Real32_strto(NullString8_t,C_Int_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_sub(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_abs(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_add(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Real64_castToWord64(Real64_t); PRIVATE C_Int_t Real64_class(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_div(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real64_equal(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_fetch(Ref(Real64_t)); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_frexp(Real64_t,Ref(C_Int_t)); PRIVATE C_String_t Real64_gdtoa(Real64_t,C_Int_t,C_Int_t,C_Int_t,Ref(C_Int_t)); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_ldexp(Real64_t,C_Int_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real64_le(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real64_lt(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_acos(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_asin(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_atan(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_atan2(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_cos(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_cosh(Real64_t); PRIVATE extern Real64_t Real64_Math_e; MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_exp(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_ln(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_log10(Real64_t); PRIVATE extern Real64_t Real64_Math_pi; MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_pow(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_sin(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_sinh(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_sqrt(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_tan(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_tanh(Real64_t); PRIVATE extern Real64_t Real64_maxFinite; PRIVATE extern Real64_t Real64_minNormalPos; PRIVATE extern Real64_t Real64_minPos; MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_modf(Real64_t,Ref(Real64_t)); MLTON_CODEGEN_STATIC_INLINE void Real64_move(Ref(Real64_t),Ref(Real64_t)); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_mul(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_muladd(Real64_t,Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_mulsub(Real64_t,Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_neg(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real64_rndToReal32(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_rndToReal64(Real64_t); MLTON_CODEGEN_STATIC_INLINE Int16_t Real64_rndToWordS16(Real64_t); MLTON_CODEGEN_STATIC_INLINE Int32_t Real64_rndToWordS32(Real64_t); MLTON_CODEGEN_STATIC_INLINE Int64_t Real64_rndToWordS64(Real64_t); MLTON_CODEGEN_STATIC_INLINE Int8_t Real64_rndToWordS8(Real64_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Real64_rndToWordU16(Real64_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Real64_rndToWordU32(Real64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Real64_rndToWordU64(Real64_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Real64_rndToWordU8(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_round(Real64_t); PRIVATE C_Int_t Real64_signBit(Real64_t); MLTON_CODEGEN_STATIC_INLINE void Real64_store(Ref(Real64_t),Real64_t); PRIVATE Real64_t Real64_strto(NullString8_t,C_Int_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_sub(Real64_t,Real64_t); PRIVATE C_Errno_t(C_Int_t) Socket_accept(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE extern const C_Int_t Socket_AF_INET; PRIVATE extern const C_Int_t Socket_AF_INET6; PRIVATE extern const C_Int_t Socket_AF_UNIX; PRIVATE extern const C_Int_t Socket_AF_UNSPEC; PRIVATE C_Errno_t(C_Int_t) Socket_bind(C_Sock_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_Int_t) Socket_close(C_Sock_t); PRIVATE C_Errno_t(C_Int_t) Socket_connect(C_Sock_t,Vector(Word8_t),C_Socklen_t); PRIVATE extern const C_Int_t Socket_Ctl_FIONBIO; PRIVATE extern const C_Int_t Socket_Ctl_FIONREAD; PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getIOCtl(C_Sock_t,C_Int_t,Array(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getPeerName(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockName(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockOpt(C_Sock_t,C_Int_t,C_Int_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_setIOCtl(C_Sock_t,C_Int_t,Vector(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_setSockOpt(C_Sock_t,C_Int_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE extern const C_Int_t Socket_Ctl_SIOCATMARK; PRIVATE extern const C_Int_t Socket_Ctl_SO_ACCEPTCONN; PRIVATE extern const C_Int_t Socket_Ctl_SO_BROADCAST; PRIVATE extern const C_Int_t Socket_Ctl_SO_DEBUG; PRIVATE extern const C_Int_t Socket_Ctl_SO_DONTROUTE; PRIVATE extern const C_Int_t Socket_Ctl_SO_ERROR; PRIVATE extern const C_Int_t Socket_Ctl_SO_KEEPALIVE; PRIVATE extern const C_Int_t Socket_Ctl_SO_LINGER; PRIVATE extern const C_Int_t Socket_Ctl_SO_OOBINLINE; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVBUF; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVLOWAT; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVTIMEO; PRIVATE extern const C_Int_t Socket_Ctl_SO_REUSEADDR; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDBUF; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDLOWAT; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDTIMEO; PRIVATE extern const C_Int_t Socket_Ctl_SO_TYPE; PRIVATE extern const C_Int_t Socket_Ctl_SOL_SOCKET; PRIVATE C_Int_t Socket_familyOfAddr(Vector(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Socket_GenericSock_socket(C_Int_t,C_Int_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Socket_GenericSock_socketPair(C_Int_t,C_Int_t,C_Int_t,Array(C_Int_t)); PRIVATE C_Time_t Socket_getTimeout_sec(void); PRIVATE C_SUSeconds_t Socket_getTimeout_usec(void); PRIVATE extern const C_Int_t Socket_INetSock_Ctl_IPPROTO_TCP; PRIVATE extern const C_Int_t Socket_INetSock_Ctl_TCP_NODELAY; PRIVATE void Socket_INetSock_fromAddr(Vector(Word8_t)); PRIVATE void Socket_INetSock_getInAddr(Array(Word8_t)); PRIVATE Word16_t Socket_INetSock_getPort(void); PRIVATE void Socket_INetSock_toAddr(Vector(Word8_t),Word16_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_listen(C_Sock_t,C_Int_t); PRIVATE extern const C_Int_t Socket_MSG_CTRUNC; PRIVATE extern const C_Int_t Socket_MSG_DONTROUTE; PRIVATE extern const C_Int_t Socket_MSG_DONTWAIT; PRIVATE extern const C_Int_t Socket_MSG_EOR; PRIVATE extern const C_Int_t Socket_MSG_OOB; PRIVATE extern const C_Int_t Socket_MSG_PEEK; PRIVATE extern const C_Int_t Socket_MSG_TRUNC; PRIVATE extern const C_Int_t Socket_MSG_WAITALL; PRIVATE C_Errno_t(C_SSize_t) Socket_recv(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_recvFrom(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_select(Vector(C_Fd_t),Vector(C_Fd_t),Vector(C_Fd_t),Array(C_Int_t),Array(C_Int_t),Array(C_Int_t)); PRIVATE C_Errno_t(C_SSize_t) Socket_sendArr(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendArrTo(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendVec(C_Sock_t,Vector(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendVecTo(C_Sock_t,Vector(Word8_t),C_Int_t,C_Size_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE void Socket_setTimeout(C_Time_t,C_SUSeconds_t); PRIVATE void Socket_setTimeoutNull(void); PRIVATE extern const C_Int_t Socket_SHUT_RD; PRIVATE extern const C_Int_t Socket_SHUT_RDWR; PRIVATE extern const C_Int_t Socket_SHUT_WR; PRIVATE C_Errno_t(C_Int_t) Socket_shutdown(C_Sock_t,C_Int_t); PRIVATE extern const C_Int_t Socket_SOCK_DGRAM; PRIVATE extern const C_Int_t Socket_SOCK_RAW; PRIVATE extern const C_Int_t Socket_SOCK_SEQPACKET; PRIVATE extern const C_Int_t Socket_SOCK_STREAM; PRIVATE extern const C_Size_t Socket_sockAddrStorageLen; PRIVATE void Socket_UnixSock_fromAddr(Vector(Word8_t),Array(Char8_t),C_Size_t); PRIVATE C_Size_t Socket_UnixSock_pathLen(Vector(Word8_t)); PRIVATE void Socket_UnixSock_toAddr(NullString8_t,C_Size_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE void Stdio_print(String8_t); PRIVATE void Stdio_printStderr(String8_t); PRIVATE void Stdio_printStdout(String8_t); PRIVATE C_Int_t Time_getTimeOfDay(Ref(C_Time_t),Ref(C_SUSeconds_t)); PRIVATE C_Errno_t(C_PId_t) Windows_Process_create(NullString8_t,NullString8_t,NullString8_t,C_Fd_t,C_Fd_t,C_Fd_t); PRIVATE C_Errno_t(C_PId_t) Windows_Process_createNull(NullString8_t,NullString8_t,C_Fd_t,C_Fd_t,C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Windows_Process_getexitcode(C_PId_t,Ref(C_Status_t)); PRIVATE C_Errno_t(C_Int_t) Windows_Process_terminate(C_PId_t,C_Signal_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_add(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_andb(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Word16_equal(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_lshift(Word16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_neg(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_notb(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_orb(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_rol(Word16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_ror(Word16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_sub(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_xorb(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_add(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_andb(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Word32_castToReal32(Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Word32_equal(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_lshift(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_neg(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_notb(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_orb(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_rol(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_ror(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_sub(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_xorb(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_add(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_andb(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Word64_castToReal64(Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Word64_equal(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_fetch(Ref(Word64_t)); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_lshift(Word64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE void Word64_move(Ref(Word64_t),Ref(Word64_t)); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_neg(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_notb(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_orb(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_rol(Word64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_ror(Word64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE void Word64_store(Ref(Word64_t),Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_sub(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_xorb(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_add(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_andb(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Word8_equal(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_lshift(Word8_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_neg(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_notb(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_orb(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_rol(Word8_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_ror(Word8_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_sub(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_xorb(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_addCheckOverflows(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordS16_extdToWord16(Int16_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordS16_extdToWord32(Int16_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordS16_extdToWord64(Int16_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordS16_extdToWord8(Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_ge(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_gt(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_le(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_lt(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Int16_t WordS16_mul(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_mulCheckOverflows(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_negCheckOverflows(Int16_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int16_t WordS16_quot(Int16_t,Int16_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int16_t WordS16_rem(Int16_t,Int16_t); PRIVATE Real32_t WordS16_rndToReal32(Int16_t); PRIVATE Real64_t WordS16_rndToReal64(Int16_t); MLTON_CODEGEN_STATIC_INLINE Int16_t WordS16_rshift(Int16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_subCheckOverflows(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_addCheckOverflows(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordS32_extdToWord16(Int32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordS32_extdToWord32(Int32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordS32_extdToWord64(Int32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordS32_extdToWord8(Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_ge(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_gt(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_le(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_lt(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Int32_t WordS32_mul(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_mulCheckOverflows(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_negCheckOverflows(Int32_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int32_t WordS32_quot(Int32_t,Int32_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int32_t WordS32_rem(Int32_t,Int32_t); PRIVATE Real32_t WordS32_rndToReal32(Int32_t); PRIVATE Real64_t WordS32_rndToReal64(Int32_t); MLTON_CODEGEN_STATIC_INLINE Int32_t WordS32_rshift(Int32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_subCheckOverflows(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_addCheckOverflows(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordS64_extdToWord16(Int64_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordS64_extdToWord32(Int64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordS64_extdToWord64(Int64_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordS64_extdToWord8(Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_ge(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_gt(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_le(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_lt(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Int64_t WordS64_mul(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_mulCheckOverflows(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_negCheckOverflows(Int64_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int64_t WordS64_quot(Int64_t,Int64_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int64_t WordS64_rem(Int64_t,Int64_t); PRIVATE Real32_t WordS64_rndToReal32(Int64_t); PRIVATE Real64_t WordS64_rndToReal64(Int64_t); MLTON_CODEGEN_STATIC_INLINE Int64_t WordS64_rshift(Int64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_subCheckOverflows(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_addCheckOverflows(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordS8_extdToWord16(Int8_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordS8_extdToWord32(Int8_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordS8_extdToWord64(Int8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordS8_extdToWord8(Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_ge(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_gt(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_le(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_lt(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Int8_t WordS8_mul(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_mulCheckOverflows(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_negCheckOverflows(Int8_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int8_t WordS8_quot(Int8_t,Int8_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int8_t WordS8_rem(Int8_t,Int8_t); PRIVATE Real32_t WordS8_rndToReal32(Int8_t); PRIVATE Real64_t WordS8_rndToReal64(Int8_t); MLTON_CODEGEN_STATIC_INLINE Int8_t WordS8_rshift(Int8_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_subCheckOverflows(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_addCheckOverflows(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_extdToWord16(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU16_extdToWord32(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU16_extdToWord64(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU16_extdToWord8(Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_ge(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_gt(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_le(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_lt(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_mul(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_mulCheckOverflows(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_quot(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_rem(Word16_t,Word16_t); PRIVATE Real32_t WordU16_rndToReal32(Word16_t); PRIVATE Real64_t WordU16_rndToReal64(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_rshift(Word16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_addCheckOverflows(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU32_extdToWord16(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_extdToWord32(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU32_extdToWord64(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU32_extdToWord8(Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_ge(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_gt(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_le(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_lt(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_mul(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_mulCheckOverflows(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_quot(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_rem(Word32_t,Word32_t); PRIVATE Real32_t WordU32_rndToReal32(Word32_t); PRIVATE Real64_t WordU32_rndToReal64(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_rshift(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_addCheckOverflows(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU64_extdToWord16(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU64_extdToWord32(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_extdToWord64(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU64_extdToWord8(Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_ge(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_gt(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_le(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_lt(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_mul(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_mulCheckOverflows(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_quot(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_rem(Word64_t,Word64_t); PRIVATE Real32_t WordU64_rndToReal32(Word64_t); PRIVATE Real64_t WordU64_rndToReal64(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_rshift(Word64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_addCheckOverflows(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU8_extdToWord16(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU8_extdToWord32(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU8_extdToWord64(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_extdToWord8(Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_ge(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_gt(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_le(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_lt(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_mul(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_mulCheckOverflows(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_quot(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_rem(Word8_t,Word8_t); PRIVATE Real32_t WordU8_rndToReal32(Word8_t); PRIVATE Real64_t WordU8_rndToReal64(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_rshift(Word8_t,Word32_t); #endif /* _MLTON_BASIS_FFI_H_ */ mlton-20100608/runtime/bytecode/0000755000076600000240000000000011404470407015041 5ustar mtfstaffmlton-20100608/runtime/bytecode/.ignore0000644000076600000240000000005011404435622016320 0ustar mtfstaffprint-opcodes print-opcodes.exe opcodes mlton-20100608/runtime/bytecode/interpret.c0000644000076600000240000006574711404435622017244 0ustar mtfstaff/* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #define MLTON_GC_INTERNAL_TYPES #ifndef MLTON_CODEGEN_STATIC_INLINE #define MLTON_CODEGEN_STATIC_INLINE static inline #endif /* No need to declare inlined math functions, since comes * with "platform.h". */ #ifndef MLTON_CODEGEN_MATHFN #define MLTON_CODEGEN_MATHFN(decl) #endif /* WordS_quot and WordS_rem can be inlined with the * bytecode-codegen, since they will be used in a context where the * arguments are variables. */ #ifndef MLTON_CODEGEN_WORDSQUOTREM #define MLTON_CODEGEN_WORDSQUOTREM(func) func #endif #ifndef MLTON_CODEGEN_WORDSQUOTREM_IMPL #define MLTON_CODEGEN_WORDSQUOTREM_IMPL(func) func #endif /* No need to declare memcpy, since comes with platform.h. */ #ifndef MLTON_CODEGEN_MEMCPY #define MLTON_CODEGEN_MEMCPY(decl) #endif #include "platform.h" #include "c-chunk.h" // c-chunk.h must come before opcode.h because it // redefines some opcode symbols #include "interpret.h" #include "opcode.h" enum { DEBUG_BYTECODE = FALSE, }; #if defined (GC_MODEL_NATIVE32) #define WordPointer Word32 #define WordArrayIndex Word32 #elif defined (GC_MODEL_NATIVE64) #define WordPointer Word64 #define WordArrayIndex Word64 #else #error GC_MODEL_* undefined #endif typedef WordArrayIndex ArrayIndex; typedef Word16 ArrayOffset; typedef Word16 CallCIndex; typedef Word16 GlobalIndex; typedef uintptr_t Label; typedef Int16 Offset; // Offset must be signed. typedef Pointer ProgramCounter; typedef Word16 RegIndex; typedef Word8 Scale; typedef Int16 StackOffset; // StackOffset must be signed. PRIVATE extern struct GC_state gcState; //---------------------------------------------------------------------- // Imports //---------------------------------------------------------------------- #define regs(ty) \ int ty##RegI = 0; \ PRIVATE extern ty global##ty[]; \ static ty ty##VReg[1000]; \ ty ty##Reg[1000] = { 0 } regs(CPointer); regs(Objptr); regs(Real32); regs(Real64); regs(Word8); regs(Word16); regs(Word32); regs(Word64); PRIVATE extern Objptr globalObjptrNonRoot[]; #undef regs // // Virtual Registers. Explicitly referenced by the Machine IL. // #define R(ty, i) (ty##VReg [i]) //---------------------------------------------------------------------- #define Fetch(t, z) \ do { \ z = *(t*)pc; \ if (DEBUG or DEBUG_BYTECODE or disassemble) { \ if (! strcmp(#z,"label")) \ fprintf (stderr, " %s", offsetToLabel[z]); \ else if (! strcmp(#z, "opc")) \ fprintf (stderr, " %d", (int)z); \ } \ pc += sizeof (t); \ } while (0) enum { MODE_load, MODE_store, }; #define maybe unless (disassemble) #define StoreReg(t, z) maybe PushReg(t) = z #define loadStoreGen(mode, t, t2, z) \ switch (MODE_##mode) { \ case MODE_load: \ StoreReg (t2, (t2)z); \ break; \ case MODE_store: \ maybe z = (t) (PopReg (t2)); \ break; \ default: \ assert (FALSE); \ } #define loadStore(mode, t, z) loadStoreGen(mode, t, t, z) #define loadStoreArrayOffset(mode, ty) \ case opcodeSymOfTy2 (ty, mode##ArrayOffset): \ { \ ArrayOffset arrayOffset; \ Pointer arrayBase; \ ArrayIndex arrayIndex; \ Scale arrayScale; \ Fetch (ArrayOffset, arrayOffset); \ Fetch (Scale, arrayScale); \ if (disassemble) goto mainLoop; \ arrayIndex = PopRegX (WordArrayIndex); \ arrayBase = (Pointer) (PopRegX (WordPointer)); \ loadStore (mode, ty, \ *(ty*)(arrayBase + (arrayIndex * arrayScale) + arrayOffset)); \ goto mainLoop; \ } #define loadStoreContents(mode, ty) \ case opcodeSymOfTy2 (ty, mode##Contents): \ if (disassemble) goto mainLoop; \ { \ Pointer base; \ base = (Pointer) (PopRegX (WordPointer)); \ loadStore (mode, ty, C (ty, base)); \ goto mainLoop; \ } #define loadStoreFrontier(mode) \ case opcodeSym (mode##Frontier): \ if (disassemble) goto mainLoop; \ loadStoreGen (mode, Pointer, WordPointer, Frontier); \ goto mainLoop; #define loadGCState() \ case opcodeSym (loadGCState): \ if (disassemble) goto mainLoop; \ StoreReg (WordPointer, (WordPointer)&gcState); \ goto mainLoop; #define loadStoreGlobal(mode, ty) \ case opcodeSymOfTy2 (ty, mode##Global): \ { \ GlobalIndex globalIndex; \ Fetch (GlobalIndex, globalIndex); \ if (disassemble) goto mainLoop; \ loadStoreGen (mode, ty, ty, G (ty, globalIndex)); \ goto mainLoop; \ } #define loadStoreGlobalPointer(mode, ty) \ case opcodeSymOfTy2 (ty, mode##Global): \ { \ GlobalIndex globalIndex; \ Fetch (GlobalIndex, globalIndex); \ if (disassemble) goto mainLoop; \ loadStoreGen (mode, ty, WordPointer, G (ty, globalIndex)); \ goto mainLoop; \ } #define loadStoreGPNR(mode) \ case opcodeSym (mode##GPNR): \ { \ GlobalIndex globalIndex; \ Fetch (GlobalIndex, globalIndex); \ if (disassemble) goto mainLoop; \ loadStoreGen (mode, Objptr, WordPointer, GPNR (globalIndex)); \ goto mainLoop; \ } #define loadStoreOffset(mode, ty) \ case opcodeSymOfTy2 (ty, mode##Offset): \ { \ Pointer base; \ Offset offset; \ Fetch (Offset, offset); \ if (disassemble) goto mainLoop; \ base = (Pointer) (PopRegX (WordPointer)); \ maybe loadStore (mode, ty, O (ty, base, offset)); \ goto mainLoop; \ } #define loadStoreRegister(mode, ty) \ case opcodeSymOfTy2 (ty, mode##Register): \ { \ RegIndex regIndex; \ Fetch (RegIndex, regIndex); \ if (disassemble) goto mainLoop; \ loadStoreGen (mode, ty, ty, R (ty, regIndex)); \ goto mainLoop; \ } #define loadStoreRegisterPointer(mode, ty) \ case opcodeSymOfTy2 (ty, mode##Register): \ { \ RegIndex regIndex; \ Fetch (RegIndex, regIndex); \ if (disassemble) goto mainLoop; \ loadStoreGen (mode, ty, WordPointer, R (ty, regIndex)); \ goto mainLoop; \ } #define loadStoreStackOffset(mode, ty) \ case opcodeSymOfTy2 (ty, mode##StackOffset): \ { \ StackOffset stackOffset; \ Fetch (StackOffset, stackOffset); \ if (disassemble) goto mainLoop; \ loadStore (mode, ty, S (ty, stackOffset)); \ goto mainLoop; \ } #define loadStoreStackTop(mode) \ case opcodeSym (mode##StackTop): \ if (disassemble) goto mainLoop; \ loadStoreGen (mode, Pointer, WordPointer, StackTop); \ goto mainLoop; #define loadWord(size) \ case opcodeSymOfTy (Word, size, loadWord): \ { \ Word##size t0; \ Fetch (Word##size, t0); \ if (disassemble) goto mainLoop; \ loadStore (load, Word##size, t0); \ goto mainLoop; \ } #define binary(ty, f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ ty t0 = PopReg (ty); \ ty t1 = PopReg (ty); \ PushReg (ty) = f (t0, t1); \ goto mainLoop; \ } /* The bytecode interpreter relies on the fact that the overflow checking * primitives implemented in c-chunk.h only set the result if the operation does * not overflow. When the result overflow, the interpreter pushes a zero on * the stack for the result. */ #define binaryCheck(ty, f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ ty t0 = PopReg (ty); \ ty t1 = PopReg (ty); \ f (PushReg (ty), t0, t1, f##Overflow); \ overflow = FALSE; \ goto mainLoop; \ f##Overflow: \ PushReg (ty) = 0; /* overflow, push 0 */ \ overflow = TRUE; \ goto mainLoop; \ } #define coerceOp(n, f, t) opcodeSym (f##_##n##To##t) #define coerce(n, f1, t1, f2, t2) \ case coerceOp (n, f2, t2): \ if (disassemble) goto mainLoop; \ { \ f1 t0 = PopReg (f1); \ PushReg (t1) = f2##_##n##To##t2 (t0); \ goto mainLoop; \ } #define compare(ty, f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ ty t0 = PopReg (ty); \ ty t1 = PopReg (ty); \ PushReg (Word32) = f (t0, t1); \ goto mainLoop; \ } #define cpointerBinary(f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ Pointer t0; \ t0 = (Pointer) (PopRegX (WordPointer)); \ WordPointer t1 = PopRegX (WordPointer); \ Pointer t2 = f (t0, t1); \ PushRegX (WordPointer) = (WordPointer) t2; \ goto mainLoop; \ } #define cpointerCompare(f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ Pointer t0, t1; \ t0 = (Pointer) (PopRegX (WordPointer)); \ t1 = (Pointer) (PopRegX (WordPointer)); \ PushReg (Word32) = f (t0, t1); \ goto mainLoop; \ } #define cpointerCoerceFrom(f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ WordPointer t0 = PopRegX (WordPointer); \ Pointer t1 = f (t0); \ PushRegX (WordPointer) = (WordPointer) t1; \ goto mainLoop; \ } #define cpointerCoerceTo(f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ Pointer t0; \ t0 = (Pointer) (PopRegX (WordPointer)); \ PushRegX (WordPointer) = f (t0); \ goto mainLoop; \ } #define cpointerDiff(f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ Pointer t0, t1; \ t0 = (Pointer) (PopRegX (WordPointer)); \ t1 = (Pointer) (PopRegX (WordPointer)); \ PushRegX (WordPointer) = f (t0, t1); \ goto mainLoop; \ } #define cpointerLoadWord(f) \ case opcodeSym (f): \ { \ size_t t0; \ Fetch (WordPointer, t0); \ if (disassemble) goto mainLoop; \ StoreReg (CPointer, (CPointer)t0); \ goto mainLoop; \ } #define shift(ty, f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ ty w = PopReg (ty); \ Word32 s = PopReg (Word32); \ ty w2 = f (w, s); \ PushReg (ty) = w2; \ goto mainLoop; \ } #define unary(ty, f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ ty t0 = PopReg (ty); \ PushReg (ty) = f (t0); \ goto mainLoop; \ } /* The bytecode interpreter relies on the fact that the overflow checking * primitives implemented in c-chunk.h only set the result if the operation does * not overflow. When the result overflow, the interpreter pushes a zero on * the stack for the result. */ #define unaryCheck(ty, f) \ case opcodeSym (f): \ if (disassemble) goto mainLoop; \ { \ ty t0 = PopReg (ty); \ f (PushReg (ty), t0, f##Overflow); \ overflow = FALSE; \ goto mainLoop; \ f##Overflow: \ PushReg (ty) = 0; /* overflow, push 0 */ \ overflow = TRUE; \ goto mainLoop; \ } #define Goto(l) \ do { \ maybe pc = code + l; \ goto mainLoop; \ } while (0) #define Switch(size) \ case OPCODE_Switch##size: \ { \ Label label; \ ProgramCounter lastCase; \ Word##size test = 0; \ Word16 numCases; \ \ Fetch (Word16, numCases); \ if (sizeof(Label) == 4) { \ lastCase = pc + (4 + size/8) * numCases; \ } else if (sizeof(Label) == 8) { \ lastCase = pc + (8 + size/8) * numCases; \ } else { assert (FALSE); } \ maybe test = PopReg (Word##size); \ assertRegsEmpty (); \ while (pc < lastCase) { \ Word##size caseWord; \ if (DEBUG or DEBUG_BYTECODE or disassemble) \ fprintf (stderr, "\n\t "); \ Fetch (Word##size, caseWord); \ if (DEBUG or DEBUG_BYTECODE or disassemble) \ fprintf (stderr, " =>"); \ Fetch (Label, label); \ if (not disassemble and test == caseWord) \ Goto (label); \ } \ goto mainLoop; \ } typedef char *String; #undef CacheFrontier #undef CacheStackTop #undef FlushFrontier #undef FlushStackTop #define CacheFrontier() \ do { \ frontier = (Pointer)(gcState.frontier); \ } while (0) #define CacheStackTop() \ do { \ stackTop = (Pointer)(gcState.stackTop); \ } while (0) #define FlushFrontier() \ do { \ gcState.frontier = (pointer)frontier; \ } while (0) #define FlushStackTop() \ do { \ gcState.stackTop = (pointer)stackTop; \ } while (0) #define disp(ty,ty2,fmt) \ for (i = 0; i < ty##RegI; ++i) \ fprintf (stderr, "\n" #ty "Reg[%d] = "fmt, \ i, (ty2)(ty##Reg[i])) static inline void displayRegs (void) { int i; disp (CPointer,uintptr_t,FMTPTR); disp (Objptr,uintptr_t,FMTPTR); disp (Word8,Word8,"0x%02"PRIx8); disp (Word16,Word16,"0x%04"PRIx16); disp (Word32,Word32,"0x%08"PRIx32); disp (Word64,Word64,"0x%016"PRIx64); disp (Real32,Real32,"%f"); disp (Real64,Real64,"%f"); } static void interpret (Bytecode b, CodeOffset codeOffset, Bool disassemble) { CallCIndex callCIndex; Pointer code; Pointer frontier; unsigned int i; String name; String *offsetToLabel = NULL; Opcode opc; Bool overflow = FALSE; ProgramCounter pc; ProgramCounter pcMax; Pointer stackTop; code = b->code; pcMax = b->code + b->codeSize; if (DEBUG or DEBUG_BYTECODE or disassemble) { offsetToLabel = (String*)(calloc_safe (b->codeSize, sizeof(*offsetToLabel))); for (i = 0; i < b->nameOffsetsSize; ++i) offsetToLabel [b->nameOffsets[i].codeOffset] = b->addressNames + b->nameOffsets[i].nameOffset; } if (disassemble) pc = code; else { pc = code + codeOffset; } CacheFrontier (); CacheStackTop (); mainLoop: if (DEBUG_BYTECODE) displayRegs (); if (DEBUG or DEBUG_BYTECODE or disassemble) { if (pc == pcMax) goto done; name = offsetToLabel [pc - b->code]; unless (NULL == name) fprintf (stderr, "\n%s:", name); fprintf (stderr, "\n\t"); } assert (code <= pc and pc < pcMax); Fetch (Opcode, opc); assert (opc < (cardof (opcodeStrings))); if (DEBUG or DEBUG_BYTECODE or disassemble) fprintf (stderr, "%s", opcodeStrings[opc]); switch ((enum OpcodeEnum)opc) { prims (); case opcodeSym (CacheFrontier): { if (disassemble) goto mainLoop; CacheFrontier (); goto mainLoop; } case opcodeSym (FlushFrontier): { if (disassemble) goto mainLoop; FlushFrontier (); goto mainLoop; } case opcodeSym (CacheStackTop): { if (disassemble) goto mainLoop; CacheStackTop (); goto mainLoop; } case opcodeSym (FlushStackTop): { if (disassemble) goto mainLoop; FlushStackTop (); goto mainLoop; } case opcodeSym (BranchIfZero): { Label label; Fetch (Label, label); if (disassemble) goto mainLoop; if (0 == PopReg (Word32)) Goto (label); goto mainLoop; } case opcodeSym (CallC): Fetch (CallCIndex, callCIndex); unless (disassemble) { FlushFrontier (); FlushStackTop (); MLton_callC (callCIndex); CacheFrontier (); CacheStackTop (); } goto mainLoop; case opcodeSym (Goto): { Label label; Fetch (Label, label); Goto (label); } loadStoreGPNR(load); loadStoreGPNR(store); case opcodeSym (JumpOnOverflow): { Label label; Fetch (Label, label); if (overflow) Goto (label); goto mainLoop; } case opcodeSym (Raise): maybe StackTop = (Pointer)(gcState.stackBottom + gcState.exnStack); // fall through to Return. case opcodeSym (Return): Goto (*(Label*)(StackTop - sizeof (Label))); Switch(8); Switch(16); Switch(32); Switch(64); case opcodeSym (Thread_returnToC): if (disassemble) goto mainLoop; FlushFrontier (); FlushStackTop (); goto done; default: assert (FALSE); } assert (FALSE); done: if (DEBUG or DEBUG_BYTECODE or disassemble) free (offsetToLabel); return; } static void disassemble (Bytecode b, CodeOffset codeOffset) { interpret (b, codeOffset, TRUE); fprintf (stderr, "\n"); } void MLton_Bytecode_interpret (Bytecode b, CodeOffset codeOffset) { if (DEBUG or DEBUG_BYTECODE) { fprintf (stderr, "MLton_Bytecode_interpret ("FMTPTR", %"PRIxPTR")\n", (uintptr_t)b, codeOffset); disassemble (b, codeOffset); fprintf (stderr, "interpret starting\n"); } interpret (b, codeOffset, FALSE); } mlton-20100608/runtime/bytecode/interpret.h0000644000076600000240000000332211404435622017226 0ustar mtfstaff/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _INTERPRET_H_ #define _INTERPRET_H_ #include #include "assert.h" #define regs(ty) \ PRIVATE extern int ty##RegI; \ PRIVATE extern ty ty##Reg[] regs(CPointer); regs(Objptr); regs(Real32); regs(Real64); regs(Word8); regs(Word16); regs(Word32); regs(Word64); #undef regs #define assertRegsEmpty() \ do { \ assert (0 == CPointerRegI); \ assert (0 == ObjptrRegI); \ assert (0 == Real32RegI); \ assert (0 == Real64RegI); \ assert (0 == Word8RegI); \ assert (0 == Word16RegI); \ assert (0 == Word32RegI); \ assert (0 == Word64RegI); \ } while (0) typedef uintptr_t CodeOffset; struct NameOffsets { CodeOffset codeOffset; // An offset into code. Word32 nameOffset; // An offset into addressNames. }; typedef struct Bytecode { char *addressNames; Pointer code; CodeOffset codeSize; struct NameOffsets *nameOffsets; Word32 nameOffsetsSize; } *Bytecode; #define PopReg(ty) (assert (ty##RegI > 0), ty##Reg [--ty##RegI]) #define PopRegX(ty) PopReg(ty) #define PushReg(ty) ty##Reg [ty##RegI++] #define PushRegX(ty) PushReg(ty) PRIVATE void MLton_callC (int i); // provided by client PRIVATE void MLton_Bytecode_interpret (Bytecode b, CodeOffset codeOffset); #endif mlton-20100608/runtime/bytecode/Makefile0000644000076600000240000000035611404435622016505 0ustar mtfstaff## Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean: ../../bin/clean mlton-20100608/runtime/bytecode/opcode.h0000644000076600000240000002441111404435622016465 0ustar mtfstaff/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _OPCODE_H_ #define _OPCODE_H_ #define coercePrims() \ allWordCoercePrims(8) \ allWordCoercePrims(16) \ allWordCoercePrims(32) \ allWordCoercePrims(64) \ coerce(rnd, Real32, Real32, Real32, Real32) \ coerce(rnd, Real32, Real64, Real32, Real64) \ coerce(rnd, Real64, Real32, Real64, Real32) \ coerce(rnd, Real64, Real64, Real64, Real64) \ coerce(cast, Real32, Word32, Real32, Word32) \ coerce(cast, Word32, Real32, Word32, Real32) \ coerce(cast, Real64, Word64, Real64, Word64) \ coerce(cast, Word64, Real64, Word64, Real64) #define allWordCoercePrims(size) \ bothFromWordCoercePrims(rnd, size, Real32) \ bothFromWordCoercePrims(rnd, size, Real64) \ bothToWordCoercePrims(rnd, Real32, size) \ bothToWordCoercePrims(rnd, Real64, size) \ bothFromWordCoercePrims(extd, size, Word8) \ bothFromWordCoercePrims(extd, size, Word16) \ bothFromWordCoercePrims(extd, size, Word32) \ bothFromWordCoercePrims(extd, size, Word64) #define bothFromWordCoercePrims(name, from, to) \ coerce (name, Word##from, to, Word##S##from, to) \ coerce (name, Word##from, to, Word##U##from, to) #define bothToWordCoercePrims(name, from, to) \ coerce (name, from, Word##to, from, Word##S##to) \ coerce (name, from, Word##to, from, Word##U##to) #define loadStorePrimsOfTy(mode, ty) \ loadStoreArrayOffset (mode, ty) \ loadStoreContents (mode, ty) \ loadStoreGlobal (mode, ty) \ loadStoreOffset (mode, ty) \ loadStoreRegister (mode, ty) \ loadStoreStackOffset (mode, ty) #define loadStorePrims(mode) \ loadStorePrimsOfTy (mode, Real32) \ loadStorePrimsOfTy (mode, Real64) \ loadStorePrimsOfTy (mode, Word8) \ loadStorePrimsOfTy (mode, Word16) \ loadStorePrimsOfTy (mode, Word32) \ loadStorePrimsOfTy (mode, Word64) \ loadStoreGlobalPointer (mode, CPointer) \ loadStoreGlobalPointer (mode, Objptr) \ loadStoreRegisterPointer (mode, CPointer) \ loadStoreRegisterPointer (mode, Objptr) \ loadStoreFrontier (mode) \ loadStoreStackTop (mode) #define realPrimsOfSize(size) \ binary (Real##size, Real##size##_add) \ binary (Real##size, Real##size##_div) \ compare (Real##size, Real##size##_equal) \ compare (Real##size, Real##size##_le) \ compare (Real##size, Real##size##_lt) \ binary (Real##size, Real##size##_mul) \ unary (Real##size, Real##size##_neg) \ unary (Real##size, Real##size##_round) \ binary (Real##size, Real##size##_sub) \ unary (Real##size, Real##size##_Math_acos) \ unary (Real##size, Real##size##_Math_asin) \ unary (Real##size, Real##size##_Math_atan) \ binary (Real##size, Real##size##_Math_atan2) \ unary (Real##size, Real##size##_Math_cos) \ unary (Real##size, Real##size##_Math_exp) \ unary (Real##size, Real##size##_Math_ln) \ unary (Real##size, Real##size##_Math_log10) \ unary (Real##size, Real##size##_Math_sin) \ unary (Real##size, Real##size##_Math_sqrt) \ unary (Real##size, Real##size##_Math_tan) #define wordPrimsOfSize(size) \ binary (Word##size, Word##size##_add) \ binary (Word##size, Word##size##_andb) \ compare (Word##size, Word##size##_equal) \ compare (Word##size, WordS##size##_lt) \ compare (Word##size, WordU##size##_lt) \ shift (Word##size, Word##size##_lshift) \ binary (Word##size, WordS##size##_mul) \ binary (Word##size, WordU##size##_mul) \ unary (Word##size, Word##size##_neg) \ unary (Word##size, Word##size##_notb) \ binary (Word##size, Word##size##_orb) \ binary (Word##size, WordS##size##_quot) \ binary (Word##size, WordU##size##_quot) \ binary (Word##size, WordS##size##_rem) \ binary (Word##size, WordU##size##_rem) \ shift (Word##size, Word##size##_rol) \ shift (Word##size, Word##size##_ror) \ shift (Word##size, WordS##size##_rshift) \ shift (Word##size, WordU##size##_rshift) \ binary (Word##size, Word##size##_sub) \ binary (Word##size, Word##size##_xorb) \ binaryCheck (Word##size, WordS##size##_addCheck) \ binaryCheck (Word##size, WordU##size##_addCheck) \ binaryCheck (Word##size, WordS##size##_mulCheck) \ binaryCheck (Word##size, WordU##size##_mulCheck) \ unaryCheck (Word##size, Word##size##_negCheck) \ binaryCheck (Word##size, WordS##size##_subCheck) \ loadWord (size) #define cpointerPrims() \ cpointerBinary (CPointer_add) \ cpointerBinary (CPointer_sub) \ cpointerCompare(CPointer_equal) \ cpointerCompare(CPointer_lt) \ cpointerCoerceFrom (CPointer_fromWord) \ cpointerCoerceTo (CPointer_toWord) \ cpointerDiff (CPointer_diff) \ cpointerLoadWord (CPointer_loadWord) #define prims() \ coercePrims () \ cpointerPrims () \ loadGCState () \ loadStorePrims (load) \ loadStorePrims (store) \ realPrimsOfSize (32) \ realPrimsOfSize (64) \ wordPrimsOfSize (8) \ wordPrimsOfSize (16) \ wordPrimsOfSize (32) \ wordPrimsOfSize (64) #define opcodes() \ prims() \ opcodeGen (CacheFrontier) \ opcodeGen (FlushFrontier) \ opcodeGen (CacheStackTop) \ opcodeGen (FlushStackTop) \ opcodeGen (BranchIfZero) \ opcodeGen (CallC) \ opcodeGen (Goto) \ opcodeGen (loadGPNR) \ opcodeGen (storeGPNR) \ opcodeGen (JumpOnOverflow) \ opcodeGen (Raise) \ opcodeGen (Return) \ opcodeGen (Switch8) \ opcodeGen (Switch16) \ opcodeGen (Switch32) \ opcodeGen (Switch64) \ opcodeGen (Thread_returnToC) #define opcodeSym(z) OPCODE_##z #define opcodeSymOfTy(ty, size, name) opcodeSym (ty##size##_##name) #define opcodeSymOfTy2(ty, name) opcodeSym (ty##_##name) #define opcodeName(ty, size, name) opcodeGen (ty##size##_##name) #define opcodeName2(ty, name) opcodeGen (ty##_##name) #define binary(ty, f) opcodeGen (f) #define binaryCheck(ty, f) opcodeGen (f) #define coerceOp(n, f, t) opcodeGen (f##_##n##To##t) #define coerce(n, f1, t1, f2, t2) coerceOp (n, f2, t2) #define compare(ty, f) opcodeGen (f) #define cpointerBinary(f) opcodeGen (f) #define cpointerCompare(f) opcodeGen (f) #define cpointerCoerceFrom(f) opcodeGen (f) #define cpointerCoerceTo(f) opcodeGen (f) #define cpointerDiff(f) opcodeGen (f) #define cpointerLoadWord(f) opcodeGen (f) #define loadStoreArrayOffset(mode, ty) opcodeName2 (ty, mode##ArrayOffset) #define loadStoreContents(mode, ty) opcodeName2 (ty, mode##Contents) #define loadStoreFrontier(mode) opcodeGen (mode##Frontier) #define loadGCState() opcodeGen (loadGCState) #define loadStoreGlobal(mode, ty) opcodeName2 (ty, mode##Global) #define loadStoreGlobalPointer(mode, ty) opcodeName2 (ty, mode##Global) #define loadStoreOffset(mode, ty) opcodeName2 (ty, mode##Offset) #define loadStoreRegister(mode, ty) opcodeName2 (ty, mode##Register) #define loadStoreRegisterPointer(mode, ty) opcodeName2 (ty, mode##Register) #define loadStoreStackOffset(mode, ty) opcodeName2 (ty, mode##StackOffset) #define loadStoreStackTop(mode) opcodeGen (mode##StackTop) #define loadWord(size) opcodeName (Word, size, loadWord) #define shift(ty, f) opcodeGen (f) #define unary(ty, f) opcodeGen (f) #define unaryCheck(ty, f) opcodeGen (f) // Define the opcode strings. #define opcodeGen(z) #z, PRIVATE const char *opcodeStrings [] = { opcodes () }; #undef opcodeGen // Define the Opcode enum. #define opcodeGen(z) opcodeSym (z), enum OpcodeEnum { opcodes () }; typedef Word16 Opcode; #undef binary #undef binaryCheck #undef coerce #undef coerceOp #undef compare #undef cpointerBinary #undef cpointerCompare #undef cpointerCoerceFrom #undef cpointerCoerceTo #undef cpointerDiff #undef cpointerLoadWord #undef loadGCState #undef loadStoreArrayOffset #undef loadStoreContents #undef loadStoreFrontier #undef loadStoreGlobal #undef loadStoreGlobalPointer #undef loadStoreOffset #undef loadStoreRegister #undef loadStoreRegisterPointer #undef loadStoreStackOffset #undef loadStoreStackTop #undef loadWord #undef shift #undef unary #undef unaryCheck // At this point the opcodes() macro is still defined. #endif mlton-20100608/runtime/bytecode/print-opcodes.c0000644000076600000240000000120711404435622017773 0ustar mtfstaff/* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #include "platform.h" #include #include "opcode.h" int main (__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) { Opcode opc; unsigned int i; unless (cardof (opcodeStrings) < (1 << (8 * sizeof (opc)))) die ("too many opcodes\n"); for (i = 0; i < cardof (opcodeStrings); ++i) fprintf (stdout, "%s\n", opcodeStrings[i]); return 0; } mlton-20100608/runtime/cenv.h0000644000076600000240000001001311404435622014342 0ustar mtfstaff/* Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_CENV_H_ #define _MLTON_CENV_H_ /* GNU C Library Feature Macros */ #define _ISOC99_SOURCE #define _BSD_SOURCE // #define _XOPEN_SOURCE 600 /* Only enable _POSIX_C_SOURCE on platforms that don't have broken * system headers. */ #if (defined (__linux__) || defined(__GNU__)) #define _POSIX_C_SOURCE 200112L #endif #define _FILE_OFFSET_BITS 64 #ifndef ASSERT #define ASSERT 0 #define NDEBUG #endif /* C99 headers */ #include // #include #include #include // fenv.h (or approximate equivalent) comes from the n-way OS switch below. // #include #include // inttypes.h (or approximate equivalent) comes from the n-way OS switch below. // #include #include #include // #include #include // #include #include #include #include #include // stdint.h (or approximate equivalent) comes from the n-way OS switch below. // #include #include #include #include // #include #include // #include // #include #define COMPILE_TIME_ASSERT(name, x) \ typedef int _COMPILE_TIME_ASSERT___##name[(x) ? 1 : -1] COMPILE_TIME_ASSERT(CHAR_BIT__is_eight, CHAR_BIT == 8); COMPILE_TIME_ASSERT(sizeof_float__is_four, sizeof(float) == 4); COMPILE_TIME_ASSERT(sizeof_double__is_eight, sizeof(double) == 8); #if (defined (__APPLE_CC__)) #define __Darwin__ #endif #if (defined (_AIX)) #include "platform/aix.h" #elif (defined (__CYGWIN__)) #include "platform/cygwin.h" #elif (defined (__Darwin__)) #include "platform/darwin.h" #elif (defined (__FreeBSD__) || defined(__FreeBSD_kernel__)) #include "platform/freebsd.h" #elif (defined (__hpux__)) #include "platform/hpux.h" #elif (defined (__GNU__)) #include "platform/hurd.h" #elif (defined (__linux__)) #include "platform/linux.h" #elif (defined (__MINGW32__)) #include "platform/mingw.h" #elif (defined (__NetBSD__)) #include "platform/netbsd.h" #elif (defined (__OpenBSD__)) #include "platform/openbsd.h" #elif (defined (__sun__)) #include "platform/solaris.h" #else #error unknown platform os #endif #if (defined (__alpha__)) #include "platform/alpha.h" #elif (defined (__x86_64__)) #include "platform/amd64.h" #elif (defined (__arm__)) #include "platform/arm.h" #elif (defined (__hppa__)) #include "platform/hppa.h" #elif (defined (__ia64__)) #include "platform/ia64.h" #elif (defined (__m68k__)) #include "platform/m68k.h" #elif (defined (__mips__)) #include "platform/mips.h" #elif (defined (__powerpc64__)) #include "platform/powerpc64.h" #elif (defined (__ppc__)) || (defined (__powerpc__)) #include "platform/powerpc.h" #elif (defined (__s390__)) #include "platform/s390.h" #elif (defined (__sparc__)) #include "platform/sparc.h" #elif (defined (__i386__)) #include "platform/x86.h" #else #error unknown platform arch #endif #ifndef POINTER_BITS #if UINTPTR_MAX == UINT32_MAX #define POINTER_BITS 32 #elif UINTPTR_MAX == UINT64_MAX #define POINTER_BITS 64 #else #error Platform did not set POINTER_BITS and could not guess it. #endif #endif #ifndef ADDRESS_BITS #define ADDRESS_BITS POINTER_BITS #endif #include "gmp.h" #include "export.h" COMPILE_TIME_ASSERT(sizeof_uintptr_t__is__sizeof_voidStar, sizeof(uintptr_t) == sizeof(void*)); COMPILE_TIME_ASSERT(sizeof_uintptr_t__is__sizeof_size_t, sizeof(uintptr_t) == sizeof(size_t)); COMPILE_TIME_ASSERT(sizeof_uintptr_t__is__sizeof_ptrdiff_t, sizeof(uintptr_t) == sizeof(ptrdiff_t)); COMPILE_TIME_ASSERT(sizeof_voidStar__is__pointer_bits, sizeof(void*)*CHAR_BIT == POINTER_BITS); COMPILE_TIME_ASSERT(address_bits__lte__pointer_bits, ADDRESS_BITS <= POINTER_BITS); #endif /* _MLTON_CENV_H_ */ mlton-20100608/runtime/export.h0000644000076600000240000000277711404435622014752 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_EXPORT_H_ #define _MLTON_EXPORT_H_ /* ------------------------------------------------- */ /* Symbols */ /* ------------------------------------------------- */ /* An external symbol is something not defined by the module * (executable or library) being built. Rather, it is provided * from a library dependency (dll, dylib, or shared object). * * A public symbol is defined in this module as being available * to users outside of this module. If building a library, this * means the symbol will be part of the public interface. * * A private symbol is defined within this module, but will not * be made available outside of it. This is typically used for * internal implementation details that should not be accessible. */ #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) #define EXTERNAL __declspec(dllimport) #define PUBLIC __declspec(dllexport) #define PRIVATE #else #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) #define EXTERNAL __attribute__((visibility("default"))) #define PUBLIC __attribute__((visibility("default"))) #define PRIVATE __attribute__((visibility("hidden"))) #else #define EXTERNAL #define PUBLIC #define PRIVATE #endif #endif #endif /* _MLTON_EXPORT_H_ */ mlton-20100608/runtime/gc/0000755000076600000240000000000011404470407013634 5ustar mtfstaffmlton-20100608/runtime/gc/align.c0000644000076600000240000000133611404435622015075 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ size_t alignWithExtra (GC_state s, size_t bytes, size_t extra) { return align (bytes + extra, s->alignment) - extra; } #if ASSERT bool isFrontierAligned (GC_state s, pointer p) { return isAligned ((size_t)p + GC_NORMAL_HEADER_SIZE, s->alignment); } #endif pointer alignFrontier (GC_state s, pointer p) { size_t res; res = alignWithExtra (s, (size_t)p, GC_NORMAL_HEADER_SIZE); assert (isFrontierAligned (s, (pointer)res)); return (pointer)res; } mlton-20100608/runtime/gc/align.h0000644000076600000240000000106111404435622015075 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline size_t alignWithExtra (GC_state s, size_t bytes, size_t extra); #if ASSERT static inline bool isFrontierAligned (GC_state s, pointer p); #endif static inline pointer alignFrontier (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/array-allocate.c0000644000076600000240000001073011404435622016701 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ pointer GC_arrayAllocate (GC_state s, size_t ensureBytesFree, GC_arrayLength numElements, GC_header header) { size_t arraySize, arraySizeAligned; size_t bytesPerElement; uint16_t bytesNonObjptrs; uint16_t numObjptrs; pointer frontier; pointer last; pointer result; splitHeader(s, header, NULL, NULL, &bytesNonObjptrs, &numObjptrs); if (DEBUG) fprintf (stderr, "GC_arrayAllocate (%"PRIuMAX", "FMTARRLEN", "FMTHDR")\n", (uintmax_t)ensureBytesFree, numElements, header); bytesPerElement = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); /* Check for overflow when computing arraySize. * Note: bytesPerElement > 0 */ if (numElements > (SIZE_MAX / bytesPerElement)) { goto doOverflow; } arraySize = bytesPerElement * numElements; if (arraySize > SIZE_MAX - GC_ARRAY_HEADER_SIZE) { goto doOverflow; } arraySize += GC_ARRAY_HEADER_SIZE; arraySizeAligned = align (arraySize, s->alignment); if (arraySizeAligned < arraySize) { goto doOverflow; } if (arraySizeAligned < GC_ARRAY_HEADER_SIZE + OBJPTR_SIZE) { /* Very small (including empty) arrays have OBJPTR_SIZE bytes * space for the forwarding pointer. */ arraySize = GC_ARRAY_HEADER_SIZE; arraySizeAligned = align(GC_ARRAY_HEADER_SIZE + OBJPTR_SIZE, s->alignment); } if (DEBUG_ARRAY) fprintf (stderr, "Array with "FMTARRLEN" elts of size %"PRIuMAX" and total size %s and total aligned size %s. " "Ensure %s bytes free.\n", numElements, (uintmax_t)bytesPerElement, uintmaxToCommaString(arraySize), uintmaxToCommaString(arraySizeAligned), uintmaxToCommaString(ensureBytesFree)); if (arraySizeAligned >= s->controls.oldGenArraySize) { if (not hasHeapBytesFree (s, arraySizeAligned, ensureBytesFree)) { enter (s); performGC (s, arraySizeAligned, ensureBytesFree, FALSE, TRUE); leave (s); } frontier = s->heap.start + s->heap.oldGenSize; s->heap.oldGenSize += arraySizeAligned; s->cumulativeStatistics.bytesAllocated += arraySizeAligned; } else { size_t bytesRequested; pointer newFrontier; bytesRequested = arraySizeAligned + ensureBytesFree; if (not hasHeapBytesFree (s, 0, bytesRequested)) { enter (s); performGC (s, 0, bytesRequested, FALSE, TRUE); leave (s); } frontier = s->frontier; newFrontier = frontier + arraySizeAligned; assert (isFrontierAligned (s, newFrontier)); s->frontier = newFrontier; } last = frontier + arraySize; *((GC_arrayCounter*)(frontier)) = 0; frontier = frontier + GC_ARRAY_COUNTER_SIZE; *((GC_arrayLength*)(frontier)) = numElements; frontier = frontier + GC_ARRAY_LENGTH_SIZE; *((GC_header*)(frontier)) = header; frontier = frontier + GC_HEADER_SIZE; result = frontier; assert (isAligned ((size_t)result, s->alignment)); /* Initialize all pointers with BOGUS_OBJPTR. */ if (1 <= numObjptrs and 0 < numElements) { pointer p; if (0 == bytesNonObjptrs) for (p = frontier; p < last; p += OBJPTR_SIZE) *((objptr*)p) = BOGUS_OBJPTR; else { /* Array with a mix of pointers and non-pointers. */ size_t bytesObjptrs; bytesObjptrs = numObjptrs * OBJPTR_SIZE; for (p = frontier; p < last; ) { pointer next; p += bytesNonObjptrs; next = p + bytesObjptrs; assert (next <= last); for ( ; p < next; p += OBJPTR_SIZE) *((objptr*)p) = BOGUS_OBJPTR; } } } GC_profileAllocInc (s, arraySizeAligned); if (DEBUG_ARRAY) { fprintf (stderr, "GC_arrayAllocate done. result = "FMTPTR" frontier = "FMTPTR"\n", (uintptr_t)result, (uintptr_t)s->frontier); displayGCState (s, stderr); } assert (ensureBytesFree <= (size_t)(s->limitPlusSlop - s->frontier)); /* Unfortunately, the invariant isn't quite true here, because * unless we did the GC, we never set s->currentThread->stack->used * to reflect what the mutator did with stackTop. */ return result; doOverflow: die ("Out of memory. Unable to allocate array with "FMTARRLEN" elements and elements of size %"PRIuMAX" bytes.", numElements, (uintmax_t)bytesPerElement); } mlton-20100608/runtime/gc/array-allocate.h0000644000076600000240000000106411404435622016706 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE pointer GC_arrayAllocate (GC_state s, size_t ensureBytesFree, GC_arrayLength numElements, GC_header header); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/array.c0000644000076600000240000000342011404435622015115 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* getArrayLengthp (p) * * Returns a pointer to the length for the array pointed to by p. */ GC_arrayLength* getArrayLengthp (pointer a) { return (GC_arrayLength*)(a - GC_HEADER_SIZE - GC_ARRAY_LENGTH_SIZE); } /* getArrayLength (p) * * Returns the length for the array pointed to by p. */ GC_arrayLength getArrayLength (pointer a) { return *(getArrayLengthp (a)); } uintmax_t GC_getArrayLength (pointer a) { return ((uintmax_t)(getArrayLength (a))); } /* getArrayCounterp (p) * * Returns a pointer to the counter for the array pointed to by p. */ GC_arrayCounter* getArrayCounterp (pointer a) { return (GC_arrayCounter*)(a - GC_HEADER_SIZE - GC_ARRAY_LENGTH_SIZE - GC_ARRAY_COUNTER_SIZE); } /* getArrayCounter (p) * * Returns the counter for the array pointed to by p. */ GC_arrayCounter getArrayCounter (pointer a) { return *(getArrayCounterp (a)); } pointer indexArrayAtObjptrIndex (GC_state s, pointer a, GC_arrayCounter arrayIndex, uint32_t objptrIndex) { GC_header header; uint16_t bytesNonObjptrs; uint16_t numObjptrs; GC_objectTypeTag tag; header = getHeader (a); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); assert (tag == ARRAY_TAG); return a + (arrayIndex * (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE))) + bytesNonObjptrs + (objptrIndex * OBJPTR_SIZE); } mlton-20100608/runtime/gc/array.h0000644000076600000240000000421411404435622015124 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Array objects have the following layout: * * counter :: * length :: * header :: * ( (non heap-pointers)* :: (heap pointers)* )* * * The counter word is used by mark compact GC. The length word is * the number of elements in the array. Array elements have the same * individual layout as normal objects, omitting the header word. */ #define GC_ARRLEN_TYPE__(z) uint ## z ## _t #define GC_ARRLEN_TYPE_(z) GC_ARRLEN_TYPE__(z) #define GC_ARRLEN_TYPE GC_ARRLEN_TYPE_(GC_MODEL_ARRLEN_SIZE) typedef GC_ARRLEN_TYPE GC_arrayLength; #define GC_ARRAY_LENGTH_SIZE sizeof(GC_arrayLength) #define PRIxARRLEN__(z) PRIx ## z #define PRIxARRLEN_(z) PRIxARRLEN__(z) #define PRIxARRLEN PRIxARRLEN_(GC_MODEL_ARRLEN_SIZE) #define FMTARRLEN "%"PRIxARRLEN typedef GC_arrayLength GC_arrayCounter; #define GC_ARRAY_COUNTER_SIZE sizeof(GC_arrayCounter) #define PRIxARRCTR PRIxARRLEN #define FMTARRCTR "%"PRIxARRCTR #define GC_ARRAY_HEADER_SIZE (GC_ARRAY_COUNTER_SIZE + GC_ARRAY_LENGTH_SIZE + GC_HEADER_SIZE) COMPILE_TIME_ASSERT(sizeof_header__le__sizeof_arrlen, sizeof(GC_header) <= sizeof(GC_arrayLength)); COMPILE_TIME_ASSERT(sizeof_arrlen__eq__sizeof_arrctr, sizeof(GC_arrayLength) == sizeof(GC_arrayCounter)); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_arrayLength* getArrayLengthp (pointer a); static inline GC_arrayLength getArrayLength (pointer a); static inline GC_arrayCounter* getArrayCounterp (pointer a); static inline GC_arrayCounter getArrayCounter (pointer a); static inline pointer indexArrayAtObjptrIndex (GC_state s, pointer a, GC_arrayCounter arrayIndex, uint32_t objptrIndex); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ PRIVATE uintmax_t GC_getArrayLength (pointer a); mlton-20100608/runtime/gc/atomic.c0000644000076600000240000000101011404435622015244 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void beginAtomic (GC_state s) { s->atomicState++; if (0 == s->limit) s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; } void endAtomic (GC_state s) { s->atomicState--; if (0 == s->atomicState and s->signalsInfo.signalIsPending) s->limit = 0; } mlton-20100608/runtime/gc/atomic.h0000644000076600000240000000065611404435622015270 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void beginAtomic (GC_state s); static inline void endAtomic (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/call-stack.c0000644000076600000240000000271711404435622016025 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void numStackFramesAux (GC_state s, __attribute__ ((unused)) GC_frameIndex i) { s->callStackState.numStackFrames++; } uint32_t GC_numStackFrames (GC_state s) { s->callStackState.numStackFrames = 0; foreachStackFrame (s, numStackFramesAux); if (DEBUG_CALL_STACK) fprintf (stderr, "%"PRIu32" = GC_numStackFrames\n", s->callStackState.numStackFrames); return s->callStackState.numStackFrames; } void callStackAux (GC_state s, GC_frameIndex i) { if (DEBUG_CALL_STACK) fprintf (stderr, "callStackAux ("FMTFI")\n", i); s->callStackState.callStack[s->callStackState.numStackFrames] = i; s->callStackState.numStackFrames++; } void GC_callStack (GC_state s, pointer p) { if (DEBUG_CALL_STACK) fprintf (stderr, "GC_callStack\n"); s->callStackState.numStackFrames = 0; s->callStackState.callStack = (uint32_t*)p; foreachStackFrame (s, callStackAux); } uint32_t* GC_frameIndexSourceSeq (GC_state s, GC_frameIndex frameIndex) { uint32_t *res; res = s->sourceMaps.sourceSeqs[s->sourceMaps.frameSources[frameIndex]]; if (DEBUG_CALL_STACK) fprintf (stderr, FMTPTR" = GC_frameIndexSourceSeq ("FMTFI")\n", (uintptr_t)res, frameIndex); return res; } mlton-20100608/runtime/gc/call-stack.h0000644000076600000240000000162711404435622016031 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_callStackState { uint32_t numStackFrames; uint32_t *callStack; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void numStackFramesAux (GC_state s, GC_frameIndex i); static inline void callStackAux (GC_state s, GC_frameIndex i); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE uint32_t GC_numStackFrames (GC_state s); PRIVATE void GC_callStack (GC_state s, pointer p); PRIVATE uint32_t* GC_frameIndexSourceSeq (GC_state s, GC_frameIndex frameIndex); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/cheney-copy.c0000644000076600000240000001325511404435622016231 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Cheney Copying Collection */ /* ---------------------------------------------------------------- */ void updateWeaksForCheneyCopy (GC_state s) { pointer p; GC_weak w; for (w = s->weaks; w != NULL; w = w->link) { assert (BOGUS_OBJPTR != w->objptr); if (DEBUG_WEAK) fprintf (stderr, "updateWeaksForCheneyCopy w = "FMTPTR" ", (uintptr_t)w); p = objptrToPointer (w->objptr, s->heap.start); if (GC_FORWARDED == getHeader (p)) { if (DEBUG_WEAK) fprintf (stderr, "forwarded from "FMTOBJPTR" to "FMTOBJPTR"\n", w->objptr, *(objptr*)p); w->objptr = *(objptr*)p; } else { if (DEBUG_WEAK) fprintf (stderr, "cleared\n"); *(getHeaderp((pointer)w - offsetofWeak (s))) = GC_WEAK_GONE_HEADER; w->objptr = BOGUS_OBJPTR; } } s->weaks = NULL; } void swapHeapsForCheneyCopy (GC_state s) { struct GC_heap tempHeap; tempHeap = s->secondaryHeap; s->secondaryHeap = s->heap; s->heap = tempHeap; setCardMapAndCrossMap (s); } void majorCheneyCopyGC (GC_state s) { size_t bytesCopied; struct rusage ru_start; pointer toStart; assert (s->secondaryHeap.size >= s->heap.oldGenSize); if (detailedGCTime (s)) startTiming (&ru_start); s->cumulativeStatistics.numCopyingGCs++; s->forwardState.amInMinorGC = FALSE; if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Starting major Cheney-copy;]\n"); fprintf (stderr, "[GC:\tfrom heap at "FMTPTR" of size %s bytes,]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); fprintf (stderr, "[GC:\tto heap at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->secondaryHeap.start), uintmaxToCommaString(s->secondaryHeap.size)); } s->forwardState.toStart = s->secondaryHeap.start; s->forwardState.toLimit = s->secondaryHeap.start + s->secondaryHeap.size; assert (s->secondaryHeap.start != (pointer)NULL); /* The next assert ensures there is enough space for the copy to * succeed. It does not assert * (s->secondaryHeap.size >= s->heap.size) * because that is too strong. */ assert (s->secondaryHeap.size >= s->heap.oldGenSize); toStart = alignFrontier (s, s->secondaryHeap.start); s->forwardState.back = toStart; foreachGlobalObjptr (s, forwardObjptr); foreachObjptrInRange (s, toStart, &s->forwardState.back, forwardObjptr, TRUE); updateWeaksForCheneyCopy (s); s->secondaryHeap.oldGenSize = s->forwardState.back - s->secondaryHeap.start; bytesCopied = s->secondaryHeap.oldGenSize; s->cumulativeStatistics.bytesCopied += bytesCopied; swapHeapsForCheneyCopy (s); s->lastMajorStatistics.kind = GC_COPYING; if (detailedGCTime (s)) stopTiming (&ru_start, &s->cumulativeStatistics.ru_gcCopying); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Finished major Cheney-copy; copied %s bytes.]\n", uintmaxToCommaString(bytesCopied)); } /* ---------------------------------------------------------------- */ /* Minor Cheney Copying Collection */ /* ---------------------------------------------------------------- */ void minorCheneyCopyGC (GC_state s) { size_t bytesAllocated; size_t bytesCopied; struct rusage ru_start; if (DEBUG_GENERATIONAL) fprintf (stderr, "minorGC nursery = "FMTPTR" frontier = "FMTPTR"\n", (uintptr_t)s->heap.nursery, (uintptr_t)s->frontier); assert (invariantForGC (s)); bytesAllocated = s->frontier - s->heap.nursery; if (bytesAllocated == 0) return; s->cumulativeStatistics.bytesAllocated += bytesAllocated; if (not s->canMinor) { s->heap.oldGenSize += bytesAllocated; bytesCopied = 0; } else { if (detailedGCTime (s)) startTiming (&ru_start); s->cumulativeStatistics.numMinorGCs++; s->forwardState.amInMinorGC = TRUE; if (DEBUG_GENERATIONAL or s->controls.messages) { fprintf (stderr, "[GC: Starting minor Cheney-copy;]\n"); fprintf (stderr, "[GC:\tfrom nursery at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->heap.nursery), uintmaxToCommaString(bytesAllocated)); } s->forwardState.toStart = s->heap.start + s->heap.oldGenSize; assert (isFrontierAligned (s, s->forwardState.toStart)); s->forwardState.toLimit = s->forwardState.toStart + bytesAllocated; assert (invariantForGC (s)); s->forwardState.back = s->forwardState.toStart; /* Forward all globals. Would like to avoid doing this once all * the globals have been assigned. */ foreachGlobalObjptr (s, forwardObjptrIfInNursery); forwardInterGenerationalObjptrs (s); foreachObjptrInRange (s, s->forwardState.toStart, &s->forwardState.back, forwardObjptrIfInNursery, TRUE); updateWeaksForCheneyCopy (s); bytesCopied = s->forwardState.back - s->forwardState.toStart; s->cumulativeStatistics.bytesCopiedMinor += bytesCopied; s->heap.oldGenSize += bytesCopied; s->lastMajorStatistics.numMinorGCs++; if (detailedGCTime (s)) stopTiming (&ru_start, &s->cumulativeStatistics.ru_gcMinor); if (DEBUG_GENERATIONAL or s->controls.messages) fprintf (stderr, "[GC: Finished minor Cheney-copy; copied %s bytes.]\n", uintmaxToCommaString(bytesCopied)); } } mlton-20100608/runtime/gc/cheney-copy.h0000644000076600000240000000104011404435622016223 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void updateWeaksForCheneyCopy (GC_state s); static inline void swapHeapsForCheneyCopy (GC_state s); static void majorCheneyCopyGC (GC_state s); static void minorCheneyCopyGC (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/controls.c0000644000076600000240000000072111404435622015643 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ bool detailedGCTime (GC_state s) { return s->controls.summary; } bool needGCTime (GC_state s) { return DEBUG or s->controls.summary or s->controls.messages or s->controls.rusageMeasureGC; } mlton-20100608/runtime/gc/controls.h0000644000076600000240000000367511404435622015663 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_ratios { /* Minimum live ratio to use copying GC. */ float copy; /* Only use generational GC with copying collection if the ratio of * heap size to live data size is below copyGenerational. */ float copyGenerational; float grow; float hashCons; /* Desired ratio of heap size to live data. */ float live; /* Minimum live ratio to use mark-compact GC. */ float markCompact; /* Only use generational GC with mark-compact collection if the * ratio of heap size to live data size is below * markCompactGenerational. */ float markCompactGenerational; /* As long as the ratio of bytes live to nursery size is greater * than nurseryRatio, use minor GCs. */ float nursery; float ramSlop; float stackCurrentGrow; float stackCurrentMaxReserved; float stackCurrentPermitReserved; float stackCurrentShrink; float stackMaxReserved; float stackShrink; }; struct GC_controls { size_t fixedHeap; /* If 0, then no fixed heap. */ size_t maxHeap; /* if zero, then unlimited, else limit total heap */ bool mayLoadWorld; bool mayPageHeap; /* Permit paging heap to disk during GC */ bool mayProcessAtMLton; bool messages; /* Print a message at the start and end of each gc. */ size_t oldGenArraySize; /* Arrays larger are allocated in old gen, if possible. */ struct GC_ratios ratios; bool rusageMeasureGC; bool summary; /* Print a summary of gc info when program exits. */ }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool detailedGCTime (GC_state s); static inline bool needGCTime (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/copy-thread.c0000644000076600000240000000546311404435622016227 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ GC_thread copyThread (GC_state s, GC_thread from, size_t used) { GC_thread to; if (DEBUG_THREADS) fprintf (stderr, "copyThread ("FMTPTR")\n", (uintptr_t)from); /* newThread may do a GC, which invalidates from. * Hence we need to stash from someplace that the GC can find it. */ assert (s->savedThread == BOGUS_OBJPTR); s->savedThread = pointerToObjptr((pointer)from - offsetofThread (s), s->heap.start); to = newThread (s, alignStackReserved(s, used)); from = (GC_thread)(objptrToPointer(s->savedThread, s->heap.start) + offsetofThread (s)); s->savedThread = BOGUS_OBJPTR; if (DEBUG_THREADS) { fprintf (stderr, FMTPTR" = copyThread ("FMTPTR")\n", (uintptr_t)to, (uintptr_t)from); } copyStack (s, (GC_stack)(objptrToPointer(from->stack, s->heap.start)), (GC_stack)(objptrToPointer(to->stack, s->heap.start))); to->bytesNeeded = from->bytesNeeded; to->exnStack = from->exnStack; return to; } void GC_copyCurrentThread (GC_state s) { GC_thread fromThread; GC_stack fromStack; GC_thread toThread; GC_stack toStack; if (DEBUG_THREADS) fprintf (stderr, "GC_copyCurrentThread\n"); enter (s); fromThread = (GC_thread)(objptrToPointer(s->currentThread, s->heap.start) + offsetofThread (s)); fromStack = (GC_stack)(objptrToPointer(fromThread->stack, s->heap.start)); toThread = copyThread (s, fromThread, fromStack->used); toStack = (GC_stack)(objptrToPointer(toThread->stack, s->heap.start)); assert (toStack->reserved == alignStackReserved (s, toStack->used)); leave (s); if (DEBUG_THREADS) fprintf (stderr, FMTPTR" = GC_copyCurrentThread\n", (uintptr_t)toThread); assert (s->savedThread == BOGUS_OBJPTR); s->savedThread = pointerToObjptr((pointer)toThread - offsetofThread (s), s->heap.start); } pointer GC_copyThread (GC_state s, pointer p) { GC_thread fromThread; GC_stack fromStack; GC_thread toThread; GC_stack toStack; if (DEBUG_THREADS) fprintf (stderr, "GC_copyThread ("FMTPTR")\n", (uintptr_t)p); enter (s); fromThread = (GC_thread)(p + offsetofThread (s)); fromStack = (GC_stack)(objptrToPointer(fromThread->stack, s->heap.start)); toThread = copyThread (s, fromThread, fromStack->used); toStack = (GC_stack)(objptrToPointer(toThread->stack, s->heap.start)); assert (toStack->reserved == alignStackReserved (s, toStack->used)); leave (s); if (DEBUG_THREADS) fprintf (stderr, FMTPTR" = GC_copyThread ("FMTPTR")\n", (uintptr_t)toThread, (uintptr_t)fromThread); return ((pointer)toThread - offsetofThread (s)); } mlton-20100608/runtime/gc/copy-thread.h0000644000076600000240000000114711404435622016227 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_thread copyThread (GC_state s, GC_thread from, size_t size); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_copyCurrentThread (GC_state s); PRIVATE pointer GC_copyThread (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/current.c0000644000076600000240000000134311404435622015463 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ objptr getThreadCurrentObjptr (GC_state s) { return s->currentThread; } GC_thread getThreadCurrent (GC_state s) { pointer p = objptrToPointer(getThreadCurrentObjptr(s), s->heap.start); return (GC_thread)(p + offsetofThread (s)); } objptr getStackCurrentObjptr (GC_state s) { GC_thread thread = getThreadCurrent(s); return thread->stack; } GC_stack getStackCurrent (GC_state s) { pointer p = objptrToPointer(getStackCurrentObjptr(s), s->heap.start); return (GC_stack)p; } mlton-20100608/runtime/gc/current.h0000644000076600000240000000106511404435622015471 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline objptr getThreadCurrentObjptr (GC_state s); static inline GC_thread getThreadCurrent (GC_state s); static inline objptr getStackCurrentObjptr (GC_state s); static inline GC_stack getStackCurrent (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/debug.h0000644000076600000240000000164111404435622015075 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef DEBUG #define DEBUG FALSE #endif enum { DEBUG_ARRAY = FALSE, DEBUG_CALL_STACK = FALSE, DEBUG_CARD_MARKING = FALSE, DEBUG_DETAILED = FALSE, DEBUG_DFS_MARK = FALSE, DEBUG_ENTER_LEAVE = FALSE, DEBUG_GENERATIONAL = FALSE, DEBUG_INT_INF = FALSE, DEBUG_INT_INF_DETAILED = FALSE, DEBUG_MARK_COMPACT = FALSE, DEBUG_MEM = FALSE, DEBUG_OBJPTR = FALSE, DEBUG_PROFILE = FALSE, DEBUG_RESIZING = FALSE, DEBUG_SHARE = FALSE, DEBUG_SIGNALS = FALSE, DEBUG_SIZE = FALSE, DEBUG_SOURCES = FALSE, DEBUG_STACKS = FALSE, DEBUG_THREADS = FALSE, DEBUG_WEAK = FALSE, DEBUG_WORLD = FALSE, FORCE_GENERATIONAL = FALSE, FORCE_MARK_COMPACT = FALSE, }; mlton-20100608/runtime/gc/dfs-mark.c0000644000076600000240000003115111404435622015505 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Depth-first Marking */ /* ---------------------------------------------------------------- */ bool isPointerMarked (pointer p) { return MARK_MASK & getHeader (p); } bool isPointerMarkedByMode (pointer p, GC_markMode m) { switch (m) { case MARK_MODE: return isPointerMarked (p); case UNMARK_MODE: return not isPointerMarked (p); default: die ("bad mark mode %u", m); } } /* dfsMarkByMode (s, r, m, shc, slw) * * Sets all the mark bits in the object graph pointed to by r. * * If m is MARK_MODE, it sets the bits to 1. * If m is UNMARK_MODE, it sets the bits to 0. * * If shc, it hash-conses the objects marked. * * If slw, it links the weak objects marked. * * It returns the total size in bytes of the objects marked. */ size_t dfsMarkByMode (GC_state s, pointer root, GC_markMode mode, bool shouldHashCons, bool shouldLinkWeaks) { GC_header mark; /* Used to set or clear the mark bit. */ size_t size; /* Total number of bytes marked. */ pointer cur; /* The current object being marked. */ pointer prev; /* The previous object on the mark stack. */ pointer next; /* The next object to mark. */ pointer todo; /* A pointer to the pointer in cur to next. */ GC_header header; GC_header* headerp; uint16_t bytesNonObjptrs; uint16_t numObjptrs; GC_objectTypeTag tag; uint32_t objptrIndex; /* The i'th pointer in the object (element) being marked. */ GC_header nextHeader; GC_header* nextHeaderp; GC_arrayCounter arrayIndex; pointer top; /* The top of the next stack frame to mark. */ GC_returnAddress returnAddress; GC_frameLayout frameLayout; GC_frameOffsets frameOffsets; if (isPointerMarkedByMode (root, mode)) /* Object has already been marked. */ return 0; mark = (MARK_MODE == mode) ? MARK_MASK : 0; size = 0; cur = root; prev = NULL; headerp = getHeaderp (cur); header = *headerp; goto mark; markNext: /* cur is the object that was being marked. * prev is the mark stack. * next is the unmarked object to be marked. * nextHeaderp points to the header of next. * nextHeader is the header of next. * todo is a pointer to the pointer inside cur that points to next. */ if (DEBUG_DFS_MARK) fprintf (stderr, "markNext" " cur = "FMTPTR" next = "FMTPTR " prev = "FMTPTR" todo = "FMTPTR"\n", (uintptr_t)cur, (uintptr_t)next, (uintptr_t)prev, (uintptr_t)todo); assert (not isPointerMarkedByMode (next, mode)); assert (nextHeaderp == getHeaderp (next)); assert (nextHeader == getHeader (next)); // assert (*(pointer*) todo == next); assert (fetchObjptrToPointer (todo, s->heap.start) == next); headerp = nextHeaderp; header = nextHeader; // *(pointer*)todo = prev; storeObjptrFromPointer (todo, prev, s->heap.start); prev = cur; cur = next; mark: if (DEBUG_DFS_MARK) fprintf (stderr, "mark cur = "FMTPTR" prev = "FMTPTR" mode = %s\n", (uintptr_t)cur, (uintptr_t)prev, (mode == MARK_MODE) ? "mark" : "unmark"); /* cur is the object to mark. * prev is the mark stack. * headerp points to the header of cur. * header is the header of cur. */ assert (not isPointerMarkedByMode (cur, mode)); assert (header == getHeader (cur)); assert (headerp == getHeaderp (cur)); header ^= MARK_MASK; /* Store the mark. In the case of an object that contains a pointer to * itself, it is essential that we store the marked header before marking * the internal pointers (markInNormal below). If we didn't, then we * would see the object as unmarked and traverse it again. */ *headerp = header; splitHeader (s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); if (NORMAL_TAG == tag) { size += GC_NORMAL_HEADER_SIZE + bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); if (0 == numObjptrs) { /* There is nothing to mark. */ normalDone: if (shouldHashCons) cur = hashConsPointer (s, cur, TRUE); goto ret; } todo = cur + bytesNonObjptrs; objptrIndex = 0; markInNormal: if (DEBUG_DFS_MARK) fprintf (stderr, "markInNormal objptrIndex = %"PRIu32"\n", objptrIndex); assert (objptrIndex < numObjptrs); // next = *(pointer*)todo; next = fetchObjptrToPointer (todo, s->heap.start); if (not isPointer (next)) { markNextInNormal: assert (objptrIndex < numObjptrs); objptrIndex++; if (objptrIndex == numObjptrs) { /* Done. Clear out the counters and return. */ *headerp = header & ~COUNTER_MASK; goto normalDone; } todo += OBJPTR_SIZE; goto markInNormal; } nextHeaderp = getHeaderp (next); nextHeader = *nextHeaderp; if (mark == (nextHeader & MARK_MASK)) { if (shouldHashCons) shareObjptr (s, (objptr*)todo); goto markNextInNormal; } *headerp = (header & ~COUNTER_MASK) | (objptrIndex << COUNTER_SHIFT); goto markNext; } else if (WEAK_TAG == tag) { /* Store the marked header and don't follow any pointers. */ if (shouldLinkWeaks) { GC_weak w; w = (GC_weak)(cur + offsetofWeak (s)); if (DEBUG_WEAK) fprintf (stderr, "marking weak "FMTPTR" ", (uintptr_t)w); if (isObjptr (w->objptr)) { if (DEBUG_WEAK) fprintf (stderr, "linking\n"); w->link = s->weaks; s->weaks = w; } else { if (DEBUG_WEAK) fprintf (stderr, "not linking\n"); } } goto ret; } else if (ARRAY_TAG == tag) { /* When marking arrays: * arrayIndex is the index of the element to mark. * cur is the pointer to the array. * objptrIndex is the index of the pointer within the element * (i.e. the i'th pointer is at index i). * todo is the start of the element. */ size += GC_ARRAY_HEADER_SIZE + sizeofArrayNoHeader (s, getArrayLength (cur), bytesNonObjptrs, numObjptrs); if (0 == numObjptrs or 0 == getArrayLength (cur)) { /* There is nothing to mark. */ arrayDone: if (shouldHashCons) cur = hashConsPointer (s, cur, TRUE); goto ret; } /* Begin marking first element. */ arrayIndex = 0; todo = cur; markArrayElt: assert (arrayIndex < getArrayLength (cur)); objptrIndex = 0; /* Skip to the first pointer. */ todo += bytesNonObjptrs; markInArray: if (DEBUG_DFS_MARK) fprintf (stderr, "markInArray arrayIndex = %"PRIxARRCTR" objptrIndex = %"PRIu32"\n", arrayIndex, objptrIndex); assert (arrayIndex < getArrayLength (cur)); assert (objptrIndex < numObjptrs); assert (todo == indexArrayAtObjptrIndex (s, cur, arrayIndex, objptrIndex)); // next = *(pointer*)todo; next = fetchObjptrToPointer (todo, s->heap.start); if (not (isPointer(next))) { markNextInArray: assert (arrayIndex < getArrayLength (cur)); assert (objptrIndex < numObjptrs); assert (todo == indexArrayAtObjptrIndex (s, cur, arrayIndex, objptrIndex)); todo += OBJPTR_SIZE; objptrIndex++; if (objptrIndex < numObjptrs) goto markInArray; arrayIndex++; if (arrayIndex < getArrayLength (cur)) goto markArrayElt; /* Done. Clear out the counters and return. */ *getArrayCounterp (cur) = 0; *headerp = header & ~COUNTER_MASK; goto arrayDone; } nextHeaderp = getHeaderp (next); nextHeader = *nextHeaderp; if (mark == (nextHeader & MARK_MASK)) { if (shouldHashCons) shareObjptr (s, (objptr*)todo); goto markNextInArray; } /* Recur and mark next. */ *getArrayCounterp (cur) = arrayIndex; *headerp = (header & ~COUNTER_MASK) | (objptrIndex << COUNTER_SHIFT); goto markNext; } else { assert (STACK_TAG == tag); size += GC_STACK_HEADER_SIZE + sizeof (struct GC_stack) + ((GC_stack)cur)->reserved; top = getStackTop (s, (GC_stack)cur); assert (((GC_stack)cur)->used <= ((GC_stack)cur)->reserved); markInStack: /* Invariant: top points just past the return address of the frame * to be marked. */ assert (getStackBottom (s, (GC_stack)cur) <= top); if (DEBUG_DFS_MARK) fprintf (stderr, "markInStack top = %"PRIuMAX"\n", (uintmax_t)(top - getStackBottom (s, (GC_stack)cur))); if (top == getStackBottom (s, (GC_stack)(cur))) goto ret; objptrIndex = 0; returnAddress = *(GC_returnAddress*) (top - GC_RETURNADDRESS_SIZE); frameLayout = getFrameLayoutFromReturnAddress (s, returnAddress); frameOffsets = frameLayout->offsets; ((GC_stack)cur)->markTop = top; markInFrame: if (objptrIndex == frameOffsets [0]) { top -= frameLayout->size; goto markInStack; } todo = top - frameLayout->size + frameOffsets [objptrIndex + 1]; // next = *(pointer*)todo; next = fetchObjptrToPointer (todo, s->heap.start); if (DEBUG_DFS_MARK) fprintf (stderr, " offset %u todo "FMTPTR" next = "FMTPTR"\n", frameOffsets [objptrIndex + 1], (uintptr_t)todo, (uintptr_t)next); if (not isPointer (next)) { objptrIndex++; goto markInFrame; } nextHeaderp = getHeaderp (next); nextHeader = *nextHeaderp; if (mark == (nextHeader & MARK_MASK)) { objptrIndex++; if (shouldHashCons) shareObjptr (s, (objptr*)todo); goto markInFrame; } ((GC_stack)cur)->markIndex = objptrIndex; goto markNext; } assert (FALSE); ret: /* Done marking cur, continue with prev. * Need to set the pointer in the prev object that pointed to cur * to point back to prev, and restore prev. */ if (DEBUG_DFS_MARK) fprintf (stderr, "return cur = "FMTPTR" prev = "FMTPTR"\n", (uintptr_t)cur, (uintptr_t)prev); assert (isPointerMarkedByMode (cur, mode)); if (NULL == prev) return size; next = cur; cur = prev; headerp = getHeaderp (cur); header = *headerp; splitHeader (s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); /* It's impossible to get a WEAK_TAG here, since we would never * follow the weak object pointer. */ assert (WEAK_TAG != tag); if (NORMAL_TAG == tag) { todo = cur + bytesNonObjptrs; objptrIndex = (header & COUNTER_MASK) >> COUNTER_SHIFT; todo += objptrIndex * OBJPTR_SIZE; // prev = *(pointer*)todo; prev = fetchObjptrToPointer (todo, s->heap.start); // *(pointer*)todo = next; storeObjptrFromPointer (todo, next, s->heap.start); if (shouldHashCons) markIntergenerationalPointer (s, (pointer*)todo); goto markNextInNormal; } else if (ARRAY_TAG == tag) { arrayIndex = getArrayCounter (cur); todo = cur + arrayIndex * (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)); objptrIndex = (header & COUNTER_MASK) >> COUNTER_SHIFT; todo += bytesNonObjptrs + objptrIndex * OBJPTR_SIZE; // prev = *(pointer*)todo; prev = fetchObjptrToPointer (todo, s->heap.start); // *(pointer*)todo = next; storeObjptrFromPointer (todo, next, s->heap.start); if (shouldHashCons) markIntergenerationalPointer (s, (pointer*)todo); goto markNextInArray; } else { assert (STACK_TAG == tag); objptrIndex = ((GC_stack)cur)->markIndex; top = ((GC_stack)cur)->markTop; /* Invariant: top points just past a "return address". */ returnAddress = *(GC_returnAddress*) (top - GC_RETURNADDRESS_SIZE); frameLayout = getFrameLayoutFromReturnAddress (s, returnAddress); frameOffsets = frameLayout->offsets; todo = top - frameLayout->size + frameOffsets [objptrIndex + 1]; // prev = *(pointer*)todo; prev = fetchObjptrToPointer (todo, s->heap.start); // *(pointer*)todo = next; storeObjptrFromPointer (todo, next, s->heap.start); if (shouldHashCons) markIntergenerationalPointer (s, (pointer*)todo); objptrIndex++; goto markInFrame; } assert (FALSE); } void dfsMarkWithHashConsWithLinkWeaks (GC_state s, objptr *opp) { pointer p; p = objptrToPointer (*opp, s->heap.start); dfsMarkByMode (s, p, MARK_MODE, TRUE, TRUE); } void dfsMarkWithoutHashConsWithLinkWeaks (GC_state s, objptr *opp) { pointer p; p = objptrToPointer (*opp, s->heap.start); dfsMarkByMode (s, p, MARK_MODE, FALSE, TRUE); } void dfsUnmark (GC_state s, objptr *opp) { pointer p; p = objptrToPointer (*opp, s->heap.start); dfsMarkByMode (s, p, UNMARK_MODE, FALSE, FALSE); } mlton-20100608/runtime/gc/dfs-mark.h0000644000076600000240000000200711404435622015510 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef enum { MARK_MODE, UNMARK_MODE, } GC_markMode; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool isPointerMarked (pointer p); static inline bool isPointerMarkedByMode (pointer p, GC_markMode m); static size_t dfsMarkByMode (GC_state s, pointer root, GC_markMode mode, bool shouldHashCons, bool shouldLinkWeaks); static inline void dfsMarkWithHashConsWithLinkWeaks (GC_state s, objptr *opp); static inline void dfsMarkWithoutHashConsWithLinkWeaks (GC_state s, objptr *opp); static inline void dfsUnmark (GC_state s, objptr *opp); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/done.c0000644000076600000240000000672011404435622014732 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ static void displayCol (FILE *out, int width, const char *s) { int extra; int i; int len; len = strlen (s); if (len < width) { extra = width - len; for (i = 0; i < extra; i++) fprintf (out, " "); } fprintf (out, "%s\t", s); } static void displayCollectionStats (FILE *out, const char *name, struct rusage *ru, uintmax_t num, uintmax_t bytes) { uintmax_t ms; ms = rusageTime (ru); fprintf (out, "%s", name); displayCol (out, 7, uintmaxToCommaString (ms)); displayCol (out, 7, uintmaxToCommaString (num)); displayCol (out, 15, uintmaxToCommaString (bytes)); displayCol (out, 15, (ms > 0) ? uintmaxToCommaString ((uintmax_t)(1000.0 * (float)bytes/(float)ms)) : "-"); fprintf (out, "\n"); } void GC_done (GC_state s) { FILE *out; enter (s); minorGC (s); out = stderr; if (s->controls.summary) { struct rusage ru_total; uintmax_t gcTime; uintmax_t totalTime; getrusage (RUSAGE_SELF, &ru_total); totalTime = rusageTime (&ru_total); gcTime = rusageTime (&s->cumulativeStatistics.ru_gc); fprintf (out, "GC type\t\ttime ms\t number\t\t bytes\t bytes/sec\n"); fprintf (out, "-------------\t-------\t-------\t---------------\t---------------\n"); displayCollectionStats (out, "copying\t\t", &s->cumulativeStatistics.ru_gcCopying, s->cumulativeStatistics.numCopyingGCs, s->cumulativeStatistics.bytesCopied); displayCollectionStats (out, "mark-compact\t", &s->cumulativeStatistics.ru_gcMarkCompact, s->cumulativeStatistics.numMarkCompactGCs, s->cumulativeStatistics.bytesMarkCompacted); displayCollectionStats (out, "minor\t\t", &s->cumulativeStatistics.ru_gcMinor, s->cumulativeStatistics.numMinorGCs, s->cumulativeStatistics.bytesCopiedMinor); fprintf (out, "total time: %s ms\n", uintmaxToCommaString (totalTime)); fprintf (out, "total GC time: %s ms (%.1f%%)\n", uintmaxToCommaString (gcTime), (0 == totalTime) ? 0.0 : 100.0 * ((double) gcTime) / (double)totalTime); fprintf (out, "max pause time: %s ms\n", uintmaxToCommaString (s->cumulativeStatistics.maxPauseTime)); fprintf (out, "total bytes allocated: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.bytesAllocated)); fprintf (out, "max bytes live: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.maxBytesLive)); fprintf (out, "max heap size: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.maxHeapSize)); fprintf (out, "max stack size: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.maxStackSize)); fprintf (out, "num cards marked: %s\n", uintmaxToCommaString (s->cumulativeStatistics.numCardsMarked)); fprintf (out, "bytes scanned: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.bytesScannedMinor)); fprintf (out, "bytes hash consed: %s bytes\n", uintmaxToCommaString (s->cumulativeStatistics.bytesHashConsed)); } releaseHeap (s, &s->heap); releaseHeap (s, &s->secondaryHeap); } mlton-20100608/runtime/gc/done.h0000644000076600000240000000043611404435622014735 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ PRIVATE void GC_done (GC_state s); mlton-20100608/runtime/gc/enter_leave.c0000644000076600000240000000222011404435622016265 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* enter and leave should be called at the start and end of every GC * function that is exported to the outside world. They make sure * that the function is run in a critical section and check the GC * invariant. */ void enter (GC_state s) { if (DEBUG) fprintf (stderr, "enter\n"); /* used needs to be set because the mutator has changed s->stackTop. */ getStackCurrent(s)->used = sizeofGCStateCurrentStackUsed (s); getThreadCurrent(s)->exnStack = s->exnStack; if (DEBUG) displayGCState (s, stderr); beginAtomic (s); assert (invariantForGC (s)); if (DEBUG) fprintf (stderr, "enter ok\n"); } void leave (GC_state s) { if (DEBUG) fprintf (stderr, "leave\n"); /* The mutator frontier invariant may not hold * for functions that don't ensureBytesFree. */ assert (invariantForMutator (s, FALSE, TRUE)); endAtomic (s); if (DEBUG) fprintf (stderr, "leave ok\n"); } mlton-20100608/runtime/gc/enter_leave.h0000644000076600000240000000064411404435622016302 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void enter (GC_state s); static inline void leave (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/foreach.c0000644000076600000240000001713011404435622015411 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void callIfIsObjptr (GC_state s, GC_foreachObjptrFun f, objptr *opp) { if (isObjptr (*opp)) f (s, opp); } /* foreachGlobalObjptr (s, f) * * Apply f to each global object pointer into the heap. */ void foreachGlobalObjptr (GC_state s, GC_foreachObjptrFun f) { for (unsigned int i = 0; i < s->globalsLength; ++i) { if (DEBUG_DETAILED) fprintf (stderr, "foreachGlobal %u\n", i); callIfIsObjptr (s, f, &s->globals [i]); } if (DEBUG_DETAILED) fprintf (stderr, "foreachGlobal threads\n"); callIfIsObjptr (s, f, &s->callFromCHandlerThread); callIfIsObjptr (s, f, &s->currentThread); callIfIsObjptr (s, f, &s->savedThread); callIfIsObjptr (s, f, &s->signalHandlerThread); } /* foreachObjptrInObject (s, p, f, skipWeaks) * * Applies f to each object pointer in the object pointed to by p. * Returns pointer to the end of object, i.e. just past object. * * If skipWeaks, then the object pointer in weak objects is skipped. */ pointer foreachObjptrInObject (GC_state s, pointer p, GC_foreachObjptrFun f, bool skipWeaks) { GC_header header; uint16_t bytesNonObjptrs; uint16_t numObjptrs; GC_objectTypeTag tag; header = getHeader (p); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); if (DEBUG_DETAILED) fprintf (stderr, "foreachObjptrInObject ("FMTPTR")" " header = "FMTHDR " tag = %s" " bytesNonObjptrs = %d" " numObjptrs = %d\n", (uintptr_t)p, header, objectTypeTagToString (tag), bytesNonObjptrs, numObjptrs); if (NORMAL_TAG == tag) { p += bytesNonObjptrs; pointer max = p + (numObjptrs * OBJPTR_SIZE); /* Apply f to all internal pointers. */ for ( ; p < max; p += OBJPTR_SIZE) { if (DEBUG_DETAILED) fprintf (stderr, " p = "FMTPTR" *p = "FMTOBJPTR"\n", (uintptr_t)p, *(objptr*)p); callIfIsObjptr (s, f, (objptr*)p); } } else if (WEAK_TAG == tag) { p += bytesNonObjptrs; if (1 == numObjptrs) { if (not skipWeaks) callIfIsObjptr (s, f, (objptr*)p); p += OBJPTR_SIZE; } } else if (ARRAY_TAG == tag) { size_t bytesPerElement; size_t dataBytes; pointer last; GC_arrayLength numElements; numElements = getArrayLength (p); bytesPerElement = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); dataBytes = numElements * bytesPerElement; if (dataBytes < OBJPTR_SIZE) { /* Very small (including empty) arrays have OBJPTR_SIZE bytes * space for the forwarding pointer. */ dataBytes = OBJPTR_SIZE; } else if (0 == numObjptrs) { /* No objptrs to process. */ ; } else { last = p + dataBytes; if (0 == bytesNonObjptrs) /* Array with only pointers. */ for ( ; p < last; p += OBJPTR_SIZE) callIfIsObjptr (s, f, (objptr*)p); else { /* Array with a mix of pointers and non-pointers. */ size_t bytesObjptrs; bytesObjptrs = numObjptrs * OBJPTR_SIZE; /* For each array element. */ for ( ; p < last; ) { pointer next; /* Skip the non-pointers. */ p += bytesNonObjptrs; next = p + bytesObjptrs; /* For each internal pointer. */ for ( ; p < next; p += OBJPTR_SIZE) callIfIsObjptr (s, f, (objptr*)p); } } assert (p == last); p -= dataBytes; } p += alignWithExtra (s, dataBytes, GC_ARRAY_HEADER_SIZE); } else { /* stack */ GC_stack stack; pointer top, bottom; unsigned int i; GC_returnAddress returnAddress; GC_frameLayout frameLayout; GC_frameOffsets frameOffsets; assert (STACK_TAG == tag); stack = (GC_stack)p; bottom = getStackBottom (s, stack); top = getStackTop (s, stack); if (DEBUG) { fprintf (stderr, " bottom = "FMTPTR" top = "FMTPTR"\n", (uintptr_t)bottom, (uintptr_t)top); } assert (stack->used <= stack->reserved); while (top > bottom) { /* Invariant: top points just past a "return address". */ returnAddress = *((GC_returnAddress*)(top - GC_RETURNADDRESS_SIZE)); if (DEBUG) { fprintf (stderr, " top = "FMTPTR" return address = "FMTRA"\n", (uintptr_t)top, returnAddress); } frameLayout = getFrameLayoutFromReturnAddress (s, returnAddress); frameOffsets = frameLayout->offsets; top -= frameLayout->size; for (i = 0 ; i < frameOffsets[0] ; ++i) { if (DEBUG) fprintf(stderr, " offset %"PRIx16" address "FMTOBJPTR"\n", frameOffsets[i + 1], *(objptr*)(top + frameOffsets[i + 1])); callIfIsObjptr (s, f, (objptr*)(top + frameOffsets[i + 1])); } } assert(top == bottom); p += sizeof (struct GC_stack) + stack->reserved; } return p; } /* foreachObjptrInRange (s, front, back, f, skipWeaks) * * Apply f to each pointer between front and *back, which should be a * contiguous sequence of objects, where front points at the beginning * of the first object and *back points just past the end of the last * object. f may increase *back (for example, this is done by * forward). foreachObjptrInRange returns a pointer to the end of * the last object it visits. * * If skipWeaks, then the object pointer in weak objects is skipped. */ pointer foreachObjptrInRange (GC_state s, pointer front, pointer *back, GC_foreachObjptrFun f, bool skipWeaks) { pointer b; assert (isFrontierAligned (s, front)); if (DEBUG_DETAILED) fprintf (stderr, "foreachObjptrInRange front = "FMTPTR" *back = "FMTPTR"\n", (uintptr_t)front, (uintptr_t)(*back)); b = *back; assert (front <= b); while (front < b) { while (front < b) { assert (isAligned ((size_t)front, GC_MODEL_MINALIGN)); if (DEBUG_DETAILED) fprintf (stderr, " front = "FMTPTR" *back = "FMTPTR"\n", (uintptr_t)front, (uintptr_t)(*back)); pointer p = advanceToObjectData (s, front); assert (isAligned ((size_t)p, s->alignment)); front = foreachObjptrInObject (s, p, f, skipWeaks); } b = *back; } return front; } /* Apply f to the frame index of each frame in the current thread's stack. */ void foreachStackFrame (GC_state s, GC_foreachStackFrameFun f) { pointer bottom; GC_frameIndex findex; GC_frameLayout layout; GC_returnAddress returnAddress; pointer top; if (DEBUG_PROFILE) fprintf (stderr, "foreachStackFrame\n"); bottom = getStackBottom (s, getStackCurrent(s)); if (DEBUG_PROFILE) fprintf (stderr, " bottom = "FMTPTR" top = "FMTPTR".\n", (uintptr_t)bottom, (uintptr_t)s->stackTop); for (top = s->stackTop; top > bottom; top -= layout->size) { returnAddress = *((GC_returnAddress*)(top - GC_RETURNADDRESS_SIZE)); findex = getFrameIndexFromReturnAddress (s, returnAddress); if (DEBUG_PROFILE) fprintf (stderr, "top = "FMTPTR" findex = "FMTFI"\n", (uintptr_t)top, findex); unless (findex < s->frameLayoutsLength) die ("top = "FMTPTR" returnAddress = "FMTRA" findex = "FMTFI"\n", (uintptr_t)top, (uintptr_t)returnAddress, findex); f (s, findex); layout = &(s->frameLayouts[findex]); assert (layout->size > 0); } if (DEBUG_PROFILE) fprintf (stderr, "done foreachStackFrame\n"); } mlton-20100608/runtime/gc/foreach.h0000644000076600000240000000372111404435622015417 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) typedef void (*GC_foreachObjptrFun) (GC_state s, objptr *opp); static inline void callIfIsObjptr (GC_state s, GC_foreachObjptrFun f, objptr *opp); /* foreachGlobalObjptr (s, f) * * Apply f to each global object pointer into the heap. */ static inline void foreachGlobalObjptr (GC_state s, GC_foreachObjptrFun f); /* foreachObjptrInObject (s, p, skipWeaks, f) * * Applies f to each object pointer in the object pointed to by p. * Returns pointer to the end of object, i.e. just past object. * * If skipWeaks, then the object pointer in weak objects is skipped. */ static inline pointer foreachObjptrInObject (GC_state s, pointer p, GC_foreachObjptrFun f, bool skipWeaks); /* foreachObjptrInRange (s, front, back, f, skipWeaks) * * Apply f to each pointer between front and *back, which should be a * contiguous sequence of objects, where front points at the beginning * of the first object and *back points just past the end of the last * object. f may increase *back (for example, this is done by * forward). foreachObjptrInRange returns a pointer to the end of * the last object it visits. * * If skipWeaks, then the object pointer in weak objects is skipped. */ static inline pointer foreachObjptrInRange (GC_state s, pointer front, pointer *back, GC_foreachObjptrFun f, bool skipWeaks); typedef void (*GC_foreachStackFrameFun) (GC_state s, GC_frameIndex i); /* foreachStackFrame (s, f); * * Apply f to the frame index of each frame in the current stack. */ static inline void foreachStackFrame (GC_state s, GC_foreachStackFrameFun f); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/forward.c0000644000076600000240000001745611404435622015461 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ bool isPointerInToSpace (GC_state s, pointer p) { return (not (isPointer (p)) or (s->forwardState.toStart <= p and p < s->forwardState.toLimit)); } bool isObjptrInToSpace (GC_state s, objptr op) { pointer p; if (not (isObjptr (op))) return TRUE; p = objptrToPointer (op, s->forwardState.toStart); return isPointerInToSpace (s, p); } /* forward (s, opp) * Forwards the object pointed to by *opp and updates *opp to point to * the new object. */ void forwardObjptr (GC_state s, objptr *opp) { objptr op; pointer p; GC_header header; op = *opp; p = objptrToPointer (op, s->heap.start); if (DEBUG_DETAILED) fprintf (stderr, "forwardObjptr opp = "FMTPTR" op = "FMTOBJPTR" p = "FMTPTR"\n", (uintptr_t)opp, op, (uintptr_t)p); assert (isObjptrInFromSpace (s, *opp)); header = getHeader (p); if (DEBUG_DETAILED and header == GC_FORWARDED) fprintf (stderr, " already FORWARDED\n"); if (header != GC_FORWARDED) { /* forward the object */ size_t size, skip; size_t headerBytes, objectBytes; GC_objectTypeTag tag; uint16_t bytesNonObjptrs, numObjptrs; splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); /* Compute the space taken by the header and object body. */ if ((NORMAL_TAG == tag) or (WEAK_TAG == tag)) { /* Fixed size object. */ headerBytes = GC_NORMAL_HEADER_SIZE; objectBytes = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); skip = 0; } else if (ARRAY_TAG == tag) { headerBytes = GC_ARRAY_HEADER_SIZE; objectBytes = sizeofArrayNoHeader (s, getArrayLength (p), bytesNonObjptrs, numObjptrs); skip = 0; } else { /* Stack. */ bool current; size_t reservedNew; GC_stack stack; assert (STACK_TAG == tag); headerBytes = GC_STACK_HEADER_SIZE; stack = (GC_stack)p; current = getStackCurrent(s) == stack; reservedNew = sizeofStackShrinkReserved (s, stack, current); if (reservedNew < stack->reserved) { if (DEBUG_STACKS or s->controls.messages) fprintf (stderr, "[GC: Shrinking stack of size %s bytes to size %s bytes, using %s bytes.]\n", uintmaxToCommaString(stack->reserved), uintmaxToCommaString(reservedNew), uintmaxToCommaString(stack->used)); stack->reserved = reservedNew; } objectBytes = sizeof (struct GC_stack) + stack->used; skip = stack->reserved - stack->used; } size = headerBytes + objectBytes; assert (s->forwardState.back + size + skip <= s->forwardState.toLimit); /* Copy the object. */ GC_memcpy (p - headerBytes, s->forwardState.back, size); /* If the object has a valid weak pointer, link it into the weaks * for update after the copying GC is done. */ if ((WEAK_TAG == tag) and (numObjptrs == 1)) { GC_weak w; w = (GC_weak)(s->forwardState.back + GC_NORMAL_HEADER_SIZE + offsetofWeak (s)); if (DEBUG_WEAK) fprintf (stderr, "forwarding weak "FMTPTR" ", (uintptr_t)w); if (isObjptr (w->objptr) and (not s->forwardState.amInMinorGC or isObjptrInNursery (s, w->objptr))) { if (DEBUG_WEAK) fprintf (stderr, "linking\n"); w->link = s->weaks; s->weaks = w; } else { if (DEBUG_WEAK) fprintf (stderr, "not linking\n"); } } /* Store the forwarding pointer in the old object. */ *((GC_header*)(p - GC_HEADER_SIZE)) = GC_FORWARDED; *((objptr*)p) = pointerToObjptr (s->forwardState.back + headerBytes, s->forwardState.toStart); /* Update the back of the queue. */ s->forwardState.back += size + skip; assert (isAligned ((size_t)s->forwardState.back + GC_NORMAL_HEADER_SIZE, s->alignment)); } *opp = *((objptr*)p); if (DEBUG_DETAILED) fprintf (stderr, "forwardObjptr --> *opp = "FMTPTR"\n", (uintptr_t)*opp); assert (isObjptrInToSpace (s, *opp)); } void forwardObjptrIfInNursery (GC_state s, objptr *opp) { objptr op; pointer p; op = *opp; p = objptrToPointer (op, s->heap.start); if (p < s->heap.nursery) return; if (DEBUG_GENERATIONAL) fprintf (stderr, "forwardObjptrIfInNursery opp = "FMTPTR" op = "FMTOBJPTR" p = "FMTPTR"\n", (uintptr_t)opp, op, (uintptr_t)p); assert (s->heap.nursery <= p and p < s->limitPlusSlop); forwardObjptr (s, opp); } /* Walk through all the cards and forward all intergenerational pointers. */ void forwardInterGenerationalObjptrs (GC_state s) { GC_cardMapElem *cardMap; GC_crossMapElem *crossMap; pointer oldGenStart, oldGenEnd; size_t cardIndex, maxCardIndex; pointer cardStart, cardEnd; pointer objectStart; if (DEBUG_GENERATIONAL) fprintf (stderr, "Forwarding inter-generational pointers.\n"); updateCrossMap (s); /* Constants. */ cardMap = s->generationalMaps.cardMap; crossMap = s->generationalMaps.crossMap; maxCardIndex = sizeToCardMapIndex (align (s->heap.oldGenSize, CARD_SIZE)); oldGenStart = s->heap.start; oldGenEnd = oldGenStart + s->heap.oldGenSize; /* Loop variables*/ objectStart = alignFrontier (s, s->heap.start); cardIndex = 0; cardStart = oldGenStart; checkAll: assert (cardIndex <= maxCardIndex); assert (isFrontierAligned (s, objectStart)); if (cardIndex == maxCardIndex) goto done; checkCard: if (DEBUG_GENERATIONAL) fprintf (stderr, "checking card %"PRIuMAX" objectStart = "FMTPTR"\n", (uintmax_t)cardIndex, (uintptr_t)objectStart); assert (objectStart < oldGenStart + cardMapIndexToSize (cardIndex + 1)); if (cardMap[cardIndex]) { pointer lastObject; s->cumulativeStatistics.numCardsMarked++; if (DEBUG_GENERATIONAL) fprintf (stderr, "card %"PRIuMAX" is marked objectStart = "FMTPTR"\n", (uintmax_t)cardIndex, (uintptr_t)objectStart); assert (isFrontierAligned (s, objectStart)); cardEnd = cardStart + CARD_SIZE; if (oldGenEnd < cardEnd) cardEnd = oldGenEnd; assert (objectStart < cardEnd); lastObject = objectStart; /* If we ever add Weak.set, then there could be intergenerational * weak pointers, in which case we would need to link the weak * objects into s->weaks. But for now, since there is no * Weak.set, the foreachObjptrInRange will do the right thing on * weaks, since the weak pointer will never be into the nursery. */ objectStart = foreachObjptrInRange (s, objectStart, &cardEnd, forwardObjptrIfInNursery, FALSE); s->cumulativeStatistics.bytesScannedMinor += objectStart - lastObject; if (objectStart == oldGenEnd) goto done; cardIndex = sizeToCardMapIndex (objectStart - oldGenStart); cardStart = oldGenStart + cardMapIndexToSize (cardIndex); goto checkCard; } else { unless (CROSS_MAP_EMPTY == crossMap[cardIndex]) objectStart = cardStart + (size_t)(crossMap[cardIndex] * CROSS_MAP_OFFSET_SCALE); if (DEBUG_GENERATIONAL) fprintf (stderr, "card %"PRIuMAX" is not marked" " crossMap[%"PRIuMAX"] == %"PRIuMAX"" " objectStart = "FMTPTR"\n", (uintmax_t)cardIndex, (uintmax_t)cardIndex, (uintmax_t)(crossMap[cardIndex] * CROSS_MAP_OFFSET_SCALE), (uintptr_t)objectStart); cardIndex++; cardStart += CARD_SIZE; goto checkAll; } assert (FALSE); done: if (DEBUG_GENERATIONAL) fprintf (stderr, "Forwarding inter-generational pointers done.\n"); } mlton-20100608/runtime/gc/forward.h0000644000076600000240000000157711404435622015463 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_forwardState { bool amInMinorGC; pointer back; pointer toStart; pointer toLimit; }; #define GC_FORWARDED ~((GC_header)0) #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool isPointerInToSpace (GC_state s, pointer p); static inline bool isObjptrInToSpace (GC_state s, objptr op); static inline void forwardObjptr (GC_state s, objptr *opp); static inline void forwardObjptrIfInNursery (GC_state s, objptr *opp); static inline void forwardInterGenerationalObjptrs (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/frame.c0000644000076600000240000000222011404435622015066 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ GC_frameIndex getFrameIndexFromReturnAddress (GC_state s, GC_returnAddress ra) { GC_frameIndex res; res = s->returnAddressToFrameIndex (ra); if (DEBUG_DETAILED) fprintf (stderr, FMTFI" = getFrameIndexFromReturnAddress ("FMTRA")\n", res, ra); return res; } GC_frameLayout getFrameLayoutFromFrameIndex (GC_state s, GC_frameIndex findex) { GC_frameLayout layout; if (DEBUG_DETAILED) fprintf (stderr, "findex = "FMTFI" frameLayoutsLength = %"PRIu32"\n", findex, s->frameLayoutsLength); assert (findex < s->frameLayoutsLength); layout = &(s->frameLayouts[findex]); assert (layout->size > 0); return layout; } GC_frameLayout getFrameLayoutFromReturnAddress (GC_state s, GC_returnAddress ra) { GC_frameLayout layout; GC_frameIndex findex; findex = getFrameIndexFromReturnAddress (s, ra); layout = getFrameLayoutFromFrameIndex(s, findex); return layout; } mlton-20100608/runtime/gc/frame.h0000644000076600000240000000405111404435622015077 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * The "... reserved bytes ..." of a stack object constitute a linear * sequence of frames. For the purposes of garbage collection, we * must be able to recover the size and offsets of live heap-pointers * for each frame. This data is declared as follows: * * GC_frameLayout *frameLayouts; * * The frameLayouts pointer is initialized to point to a static array * of frame layouts that is emitted for each compiled program. The * kind field identifies whether or not the frame is for a C call. * (Note: The ML stack is distinct from the system stack. A C call * executes on the system stack. The frame left on the ML stack is * just a marker.) The size field indicates the size of the frame, * including space for the return address. The offsets field points * to an array (the zeroeth element recording the size of the array) * whose elements record byte offsets from the bottom of the frame at * which live heap pointers are located. */ typedef uint16_t *GC_frameOffsets; typedef enum { C_FRAME, ML_FRAME } GC_frameKind; typedef struct GC_frameLayout { GC_frameKind kind; GC_frameOffsets offsets; uint16_t size; } *GC_frameLayout; typedef uint32_t GC_frameIndex; #define PRIFI PRIu32 #define FMTFI "%"PRIFI typedef uintptr_t GC_returnAddress; #define GC_RETURNADDRESS_SIZE sizeof(GC_returnAddress) #define FMTRA "0x%016"PRIxPTR #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_frameIndex getFrameIndexFromReturnAddress (GC_state s, GC_returnAddress ra); static inline GC_frameLayout getFrameLayoutFromFrameIndex (GC_state s, GC_frameIndex findex); static inline GC_frameLayout getFrameLayoutFromReturnAddress (GC_state s, GC_returnAddress ra); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/garbage-collection.c0000644000076600000240000002174111404435622017526 0ustar mtfstaff/* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void minorGC (GC_state s) { minorCheneyCopyGC (s); } void majorGC (GC_state s, size_t bytesRequested, bool mayResize) { uintmax_t numGCs; size_t desiredSize; s->lastMajorStatistics.numMinorGCs = 0; numGCs = s->cumulativeStatistics.numCopyingGCs + s->cumulativeStatistics.numMarkCompactGCs; if (0 < numGCs and ((float)(s->cumulativeStatistics.numHashConsGCs) / (float)(numGCs) < s->controls.ratios.hashCons)) s->hashConsDuringGC = TRUE; desiredSize = sizeofHeapDesired (s, s->lastMajorStatistics.bytesLive + bytesRequested, 0); if (not FORCE_MARK_COMPACT and not s->hashConsDuringGC // only markCompact can hash cons and s->heap.withMapsSize < s->sysvals.ram and (not isHeapInit (&s->secondaryHeap) or createHeapSecondary (s, desiredSize))) majorCheneyCopyGC (s); else majorMarkCompactGC (s); s->hashConsDuringGC = FALSE; s->lastMajorStatistics.bytesLive = s->heap.oldGenSize; if (s->lastMajorStatistics.bytesLive > s->cumulativeStatistics.maxBytesLive) s->cumulativeStatistics.maxBytesLive = s->lastMajorStatistics.bytesLive; /* Notice that the s->lastMajorStatistics.bytesLive below is * different than the s->lastMajorStatistics.bytesLive used as an * argument to createHeapSecondary above. Above, it was an * estimate. Here, it is exactly how much was live after the GC. */ if (mayResize) { resizeHeap (s, s->lastMajorStatistics.bytesLive + bytesRequested); } setCardMapAndCrossMap (s); resizeHeapSecondary (s); assert (s->heap.oldGenSize + bytesRequested <= s->heap.size); } void growStackCurrent (GC_state s) { size_t reserved; GC_stack stack; reserved = sizeofStackGrowReserved (s, getStackCurrent(s)); if (DEBUG_STACKS or s->controls.messages) fprintf (stderr, "[GC: Growing stack of size %s bytes to size %s bytes, using %s bytes.]\n", uintmaxToCommaString(getStackCurrent(s)->reserved), uintmaxToCommaString(reserved), uintmaxToCommaString(getStackCurrent(s)->used)); assert (hasHeapBytesFree (s, sizeofStackWithHeader (s, reserved), 0)); stack = newStack (s, reserved, TRUE); copyStack (s, getStackCurrent(s), stack); getThreadCurrent(s)->stack = pointerToObjptr ((pointer)stack, s->heap.start); markCard (s, objptrToPointer (getThreadCurrentObjptr(s), s->heap.start)); } void enterGC (GC_state s) { if (s->profiling.isOn) { /* We don't need to profileEnter for count profiling because it * has already bumped the counter. If we did allow the bump, then * the count would look like function(s) had run an extra time. */ if (s->profiling.stack and not (PROFILE_COUNT == s->profiling.kind)) GC_profileEnter (s); } s->amInGC = TRUE; } void leaveGC (GC_state s) { if (s->profiling.isOn) { if (s->profiling.stack and not (PROFILE_COUNT == s->profiling.kind)) GC_profileLeave (s); } s->amInGC = FALSE; } void performGC (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested, bool forceMajor, bool mayResize) { uintmax_t gcTime; bool stackTopOk; size_t stackBytesRequested; struct rusage ru_start; size_t totalBytesRequested; enterGC (s); s->cumulativeStatistics.numGCs++; if (DEBUG or s->controls.messages) { size_t nurserySize = s->heap.size - (s->heap.nursery - s->heap.start); size_t nurseryUsed = s->frontier - s->heap.nursery; fprintf (stderr, "[GC: Starting gc #%s; requesting %s nursery bytes and %s old-gen bytes,]\n", uintmaxToCommaString(s->cumulativeStatistics.numGCs), uintmaxToCommaString(nurseryBytesRequested), uintmaxToCommaString(oldGenBytesRequested)); fprintf (stderr, "[GC:\theap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map),]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size), uintmaxToCommaString(s->heap.withMapsSize - s->heap.size)); fprintf (stderr, "[GC:\twith old-gen of size %s bytes (%.1f%% of heap),]\n", uintmaxToCommaString(s->heap.oldGenSize), 100.0 * ((double)(s->heap.oldGenSize) / (double)(s->heap.size))); fprintf (stderr, "[GC:\tand nursery of size %s bytes (%.1f%% of heap),]\n", uintmaxToCommaString(nurserySize), 100.0 * ((double)(nurserySize) / (double)(s->heap.size))); fprintf (stderr, "[GC:\tand nursery using %s bytes (%.1f%% of heap, %.1f%% of nursery).]\n", uintmaxToCommaString(nurseryUsed), 100.0 * ((double)(nurseryUsed) / (double)(s->heap.size)), 100.0 * ((double)(nurseryUsed) / (double)(nurserySize))); } assert (invariantForGC (s)); if (needGCTime (s)) startTiming (&ru_start); minorGC (s); stackTopOk = invariantForMutatorStack (s); stackBytesRequested = stackTopOk ? 0 : sizeofStackWithHeader (s, sizeofStackGrowReserved (s, getStackCurrent (s))); totalBytesRequested = oldGenBytesRequested + nurseryBytesRequested + stackBytesRequested; if (forceMajor or totalBytesRequested > s->heap.size - s->heap.oldGenSize) majorGC (s, totalBytesRequested, mayResize); setGCStateCurrentHeap (s, oldGenBytesRequested + stackBytesRequested, nurseryBytesRequested); assert (hasHeapBytesFree (s, oldGenBytesRequested + stackBytesRequested, nurseryBytesRequested)); unless (stackTopOk) growStackCurrent (s); setGCStateCurrentThreadAndStack (s); if (needGCTime (s)) { gcTime = stopTiming (&ru_start, &s->cumulativeStatistics.ru_gc); s->cumulativeStatistics.maxPauseTime = max (s->cumulativeStatistics.maxPauseTime, gcTime); } else gcTime = 0; /* Assign gcTime to quell gcc warning. */ if (DEBUG or s->controls.messages) { size_t nurserySize = s->heap.size - (s->heap.nursery - s->heap.start); fprintf (stderr, "[GC: Finished gc #%s; time %s ms,]\n", uintmaxToCommaString(s->cumulativeStatistics.numGCs), uintmaxToCommaString(gcTime)); fprintf (stderr, "[GC:\theap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map),]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size), uintmaxToCommaString(s->heap.withMapsSize - s->heap.size)); fprintf (stderr, "[GC:\twith old-gen of size %s bytes (%.1f%% of heap),]\n", uintmaxToCommaString(s->heap.oldGenSize), 100.0 * ((double)(s->heap.oldGenSize) / (double)(s->heap.size))); fprintf (stderr, "[GC:\tand nursery of size %s bytes (%.1f%% of heap).]\n", uintmaxToCommaString(nurserySize), 100.0 * ((double)(nurserySize) / (double)(s->heap.size))); } /* Send a GC signal. */ if (s->signalsInfo.gcSignalHandled and s->signalHandlerThread != BOGUS_OBJPTR) { if (DEBUG_SIGNALS) fprintf (stderr, "GC Signal pending.\n"); s->signalsInfo.gcSignalPending = TRUE; unless (s->signalsInfo.amInSignalHandler) s->signalsInfo.signalIsPending = TRUE; } if (DEBUG) displayGCState (s, stderr); assert (hasHeapBytesFree (s, oldGenBytesRequested, nurseryBytesRequested)); assert (invariantForGC (s)); leaveGC (s); } void ensureInvariantForMutator (GC_state s, bool force) { if (force or not (invariantForMutatorFrontier(s)) or not (invariantForMutatorStack(s))) { /* This GC will grow the stack, if necessary. */ performGC (s, 0, getThreadCurrent(s)->bytesNeeded, force, TRUE); } assert (invariantForMutatorFrontier(s)); assert (invariantForMutatorStack(s)); } /* ensureHasHeapBytesFree (s, oldGen, nursery) */ void ensureHasHeapBytesFree (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested) { assert (s->heap.nursery <= s->limitPlusSlop); assert (s->frontier <= s->limitPlusSlop); if (not hasHeapBytesFree (s, oldGenBytesRequested, nurseryBytesRequested)) performGC (s, oldGenBytesRequested, nurseryBytesRequested, FALSE, TRUE); assert (hasHeapBytesFree (s, oldGenBytesRequested, nurseryBytesRequested)); } void GC_collect (GC_state s, size_t bytesRequested, bool force) { enter (s); /* When the mutator requests zero bytes, it may actually need as * much as GC_HEAP_LIMIT_SLOP. */ if (0 == bytesRequested) bytesRequested = GC_HEAP_LIMIT_SLOP; getThreadCurrent(s)->bytesNeeded = bytesRequested; switchToSignalHandlerThreadIfNonAtomicAndSignalPending (s); ensureInvariantForMutator (s, force); assert (invariantForMutatorFrontier(s)); assert (invariantForMutatorStack(s)); leave (s); } mlton-20100608/runtime/gc/garbage-collection.h0000644000076600000240000000237611404435622017536 0ustar mtfstaff/* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void minorGC (GC_state s); static void majorGC (GC_state s, size_t bytesRequested, bool mayResize); static inline void growStackCurrent (GC_state s); static inline void enterGC (GC_state s); static inline void leaveGC (GC_state s); static void performGC (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested, bool forceMajor, bool mayResize); static inline void ensureInvariantForMutator (GC_state s, bool force); static inline void ensureHasHeapBytesFree (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_collect (GC_state s, size_t bytesRequested, bool force); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/gc_state.c0000644000076600000240000001476411404435622015605 0ustar mtfstaff/* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void displayGCState (GC_state s, FILE *stream) { fprintf (stream, "GC state\n"); fprintf (stream, "\tcurrentThread = "FMTOBJPTR"\n", s->currentThread); displayThread (s, (GC_thread)(objptrToPointer (s->currentThread, s->heap.start) + offsetofThread (s)), stream); fprintf (stream, "\tgenerational\n"); displayGenerationalMaps (s, &s->generationalMaps, stream); fprintf (stream, "\theap\n"); displayHeap (s, &s->heap, stream); fprintf (stream, "\tlimit = "FMTPTR"\n" "\tstackBottom = "FMTPTR"\n" "\tstackTop = "FMTPTR"\n", (uintptr_t)s->limit, (uintptr_t)s->stackBottom, (uintptr_t)s->stackTop); } size_t sizeofGCStateCurrentStackUsed (GC_state s) { return s->stackTop - s->stackBottom; } void setGCStateCurrentThreadAndStack (GC_state s) { GC_thread thread; GC_stack stack; thread = getThreadCurrent (s); s->exnStack = thread->exnStack; stack = getStackCurrent (s); s->stackBottom = getStackBottom (s, stack); s->stackTop = getStackTop (s, stack); s->stackLimit = getStackLimit (s, stack); markCard (s, (pointer)stack); } void setGCStateCurrentHeap (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested) { GC_heap h; pointer nursery; size_t nurserySize; pointer genNursery; size_t genNurserySize; if (DEBUG_DETAILED) fprintf (stderr, "setGCStateCurrentHeap(%s, %s)\n", uintmaxToCommaString(oldGenBytesRequested), uintmaxToCommaString(nurseryBytesRequested)); h = &s->heap; assert (isFrontierAligned (s, h->start + h->oldGenSize + oldGenBytesRequested)); s->limitPlusSlop = h->start + h->size; s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; nurserySize = h->size - (h->oldGenSize + oldGenBytesRequested); assert (isFrontierAligned (s, s->limitPlusSlop - nurserySize)); nursery = s->limitPlusSlop - nurserySize; genNursery = alignFrontier (s, s->limitPlusSlop - (nurserySize / 2)); genNurserySize = s->limitPlusSlop - genNursery; if (/* The mutator marks cards. */ s->mutatorMarksCards /* There is enough space in the generational nursery. */ and (nurseryBytesRequested <= genNurserySize) /* The nursery is large enough to be worth it. */ and (((float)(h->size - s->lastMajorStatistics.bytesLive) / (float)nurserySize) <= s->controls.ratios.nursery) and /* There is a reason to use generational GC. */ ( /* We must use it for debugging purposes. */ FORCE_GENERATIONAL /* We just did a mark compact, so it will be advantageous to to use it. */ or (s->lastMajorStatistics.kind == GC_MARK_COMPACT) /* The live ratio is low enough to make it worthwhile. */ or ((float)h->size / (float)s->lastMajorStatistics.bytesLive <= (h->withMapsSize < s->sysvals.ram ? s->controls.ratios.copyGenerational : s->controls.ratios.markCompactGenerational)) )) { s->canMinor = TRUE; nursery = genNursery; nurserySize = genNurserySize; clearCardMap (s); } else { unless (nurseryBytesRequested <= nurserySize) die ("Out of memory. Insufficient space in nursery."); s->canMinor = FALSE; } assert (nurseryBytesRequested <= nurserySize); s->heap.nursery = nursery; s->frontier = nursery; assert (nurseryBytesRequested <= (size_t)(s->limitPlusSlop - s->frontier)); assert (isFrontierAligned (s, s->heap.nursery)); assert (hasHeapBytesFree (s, oldGenBytesRequested, nurseryBytesRequested)); } bool GC_getAmOriginal (GC_state s) { return s->amOriginal; } void GC_setAmOriginal (GC_state s, bool b) { s->amOriginal = b; } void GC_setControlsMessages (GC_state s, bool b) { s->controls.messages = b; } void GC_setControlsSummary (GC_state s, bool b) { s->controls.summary = b; } void GC_setControlsRusageMeasureGC (GC_state s, bool b) { s->controls.rusageMeasureGC = b; } uintmax_t GC_getCumulativeStatisticsBytesAllocated (GC_state s) { return s->cumulativeStatistics.bytesAllocated; } uintmax_t GC_getCumulativeStatisticsNumCopyingGCs (GC_state s) { return s->cumulativeStatistics.numCopyingGCs; } uintmax_t GC_getCumulativeStatisticsNumMarkCompactGCs (GC_state s) { return s->cumulativeStatistics.numMarkCompactGCs; } uintmax_t GC_getCumulativeStatisticsNumMinorGCs (GC_state s) { return s->cumulativeStatistics.numMinorGCs; } size_t GC_getCumulativeStatisticsMaxBytesLive (GC_state s) { return s->cumulativeStatistics.maxBytesLive; } void GC_setHashConsDuringGC (GC_state s, bool b) { s->hashConsDuringGC = b; } size_t GC_getLastMajorStatisticsBytesLive (GC_state s) { return s->lastMajorStatistics.bytesLive; } pointer GC_getCallFromCHandlerThread (GC_state s) { pointer p = objptrToPointer (s->callFromCHandlerThread, s->heap.start); return p; } void GC_setCallFromCHandlerThread (GC_state s, pointer p) { objptr op = pointerToObjptr (p, s->heap.start); s->callFromCHandlerThread = op; } pointer GC_getCurrentThread (GC_state s) { pointer p = objptrToPointer (s->currentThread, s->heap.start); return p; } pointer GC_getSavedThread (GC_state s) { pointer p; assert(s->savedThread != BOGUS_OBJPTR); p = objptrToPointer (s->savedThread, s->heap.start); s->savedThread = BOGUS_OBJPTR; return p; } void GC_setSavedThread (GC_state s, pointer p) { objptr op; assert(s->savedThread == BOGUS_OBJPTR); op = pointerToObjptr (p, s->heap.start); s->savedThread = op; } void GC_setSignalHandlerThread (GC_state s, pointer p) { objptr op = pointerToObjptr (p, s->heap.start); s->signalHandlerThread = op; } struct rusage* GC_getRusageGCAddr (GC_state s) { return &(s->cumulativeStatistics.ru_gc); } sigset_t* GC_getSignalsHandledAddr (GC_state s) { return &(s->signalsInfo.signalsHandled); } sigset_t* GC_getSignalsPendingAddr (GC_state s) { return &(s->signalsInfo.signalsPending); } void GC_setGCSignalHandled (GC_state s, bool b) { s->signalsInfo.gcSignalHandled = b; } bool GC_getGCSignalPending (GC_state s) { return (s->signalsInfo.gcSignalPending); } void GC_setGCSignalPending (GC_state s, bool b) { s->signalsInfo.gcSignalPending = b; } mlton-20100608/runtime/gc/gc_state.h0000644000076600000240000001163011404435622015577 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_state { /* These fields are at the front because they are the most commonly * referenced, and having them at smaller offsets may decrease code * size and improve cache performance. */ pointer frontier; /* heap.start <= frontier < limit */ pointer limit; /* limit = heap.start + heap.size */ pointer stackTop; /* Top of stack in current thread. */ pointer stackLimit; /* stackBottom + stackSize - maxFrameSize */ size_t exnStack; /* Alphabetized fields follow. */ size_t alignment; /* */ bool amInGC; bool amOriginal; char **atMLtons; /* Initial @MLton args, processed before command line. */ uint32_t atMLtonsLength; uint32_t atomicState; objptr callFromCHandlerThread; /* Handler for exported C calls (in heap). */ struct GC_callStackState callStackState; bool canMinor; /* TRUE iff there is space for a minor gc. */ struct GC_controls controls; struct GC_cumulativeStatistics cumulativeStatistics; objptr currentThread; /* Currently executing thread (in heap). */ struct GC_forwardState forwardState; GC_frameLayout frameLayouts; /* Array of frame layouts. */ uint32_t frameLayoutsLength; /* Cardinality of frameLayouts array. */ struct GC_generationalMaps generationalMaps; objptr *globals; uint32_t globalsLength; bool hashConsDuringGC; struct GC_heap heap; struct GC_intInfInit *intInfInits; uint32_t intInfInitsLength; struct GC_lastMajorStatistics lastMajorStatistics; pointer limitPlusSlop; /* limit + GC_HEAP_LIMIT_SLOP */ int (*loadGlobals)(FILE *f); /* loads the globals from the file. */ uint32_t magic; /* The magic number for this executable. */ uint32_t maxFrameSize; bool mutatorMarksCards; GC_objectHashTable objectHashTable; GC_objectType objectTypes; /* Array of object types. */ uint32_t objectTypesLength; /* Cardinality of objectTypes array. */ struct GC_profiling profiling; GC_frameIndex (*returnAddressToFrameIndex) (GC_returnAddress ra); objptr savedThread; /* Result of GC_copyCurrentThread. * Thread interrupted by arrival of signal. */ int (*saveGlobals)(FILE *f); /* saves the globals to the file. */ bool saveWorldStatus; /* */ struct GC_heap secondaryHeap; /* Used for major copying collection. */ objptr signalHandlerThread; /* Handler for signals (in heap). */ struct GC_signalsInfo signalsInfo; struct GC_sourceMaps sourceMaps; pointer stackBottom; /* Bottom of stack in current thread. */ struct GC_sysvals sysvals; struct GC_translateState translateState; struct GC_vectorInit *vectorInits; uint32_t vectorInitsLength; GC_weak weaks; /* Linked list of (live) weak pointers */ }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void displayGCState (GC_state s, FILE *stream); static inline size_t sizeofGCStateCurrentStackUsed (GC_state s); static inline void setGCStateCurrentThreadAndStack (GC_state s); static void setGCStateCurrentHeap (GC_state s, size_t oldGenBytesRequested, size_t nurseryBytesRequested); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE bool GC_getAmOriginal (GC_state s); PRIVATE void GC_setAmOriginal (GC_state s, bool b); PRIVATE void GC_setControlsMessages (GC_state s, bool b); PRIVATE void GC_setControlsSummary (GC_state s, bool b); PRIVATE void GC_setControlsRusageMeasureGC (GC_state s, bool b); PRIVATE uintmax_t GC_getCumulativeStatisticsBytesAllocated (GC_state s); PRIVATE uintmax_t GC_getCumulativeStatisticsNumCopyingGCs (GC_state s); PRIVATE uintmax_t GC_getCumulativeStatisticsNumMarkCompactGCs (GC_state s); PRIVATE uintmax_t GC_getCumulativeStatisticsNumMinorGCs (GC_state s); PRIVATE size_t GC_getCumulativeStatisticsMaxBytesLive (GC_state s); PRIVATE void GC_setHashConsDuringGC (GC_state s, bool b); PRIVATE size_t GC_getLastMajorStatisticsBytesLive (GC_state s); PRIVATE pointer GC_getCallFromCHandlerThread (GC_state s); PRIVATE void GC_setCallFromCHandlerThread (GC_state s, pointer p); PRIVATE pointer GC_getCurrentThread (GC_state s); PRIVATE pointer GC_getSavedThread (GC_state s); PRIVATE void GC_setSavedThread (GC_state s, pointer p); PRIVATE void GC_setSignalHandlerThread (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ PRIVATE struct rusage* GC_getRusageGCAddr (GC_state s); PRIVATE sigset_t* GC_getSignalsHandledAddr (GC_state s); PRIVATE sigset_t* GC_getSignalsPendingAddr (GC_state s); PRIVATE void GC_setGCSignalHandled (GC_state s, bool b); PRIVATE bool GC_getGCSignalPending (GC_state s); PRIVATE void GC_setGCSignalPending (GC_state s, bool b); mlton-20100608/runtime/gc/generational.c0000644000076600000240000003215411404435622016455 0ustar mtfstaff/* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void displayGenerationalMaps (__attribute__ ((unused)) GC_state s, struct GC_generationalMaps *generational, FILE *stream) { fprintf(stream, "\t\tcardMap = "FMTPTR"\n" "\t\tcardMapAbsolute = "FMTPTR"\n" "\t\tcardMapLength = %"PRIuMAX"\n" "\t\tcrossMap = "FMTPTR"\n" "\t\tcrossMapLength = %"PRIuMAX"\n" "\t\tcrossMapValidSize = %"PRIuMAX"\n", (uintptr_t)generational->cardMap, (uintptr_t)generational->cardMapAbsolute, (uintmax_t)generational->cardMapLength, (uintptr_t)generational->crossMap, (uintmax_t)generational->crossMapLength, (uintmax_t)generational->crossMapValidSize); if (DEBUG_GENERATIONAL and DEBUG_DETAILED) { GC_crossMapIndex i; fprintf (stderr, "crossMap trues\n"); for (i = 0; i < generational->crossMapLength; i++) unless (CROSS_MAP_EMPTY == generational->crossMap[i]) fprintf (stderr, "\t%"PRIuMAX" "FMTCME" "FMTCME"\n", (uintmax_t)i, generational->crossMap[i], CROSS_MAP_OFFSET_SCALE * generational->crossMap[i]); fprintf (stderr, "\n"); } } GC_cardMapIndex sizeToCardMapIndex (size_t z) { return (GC_cardMapIndex)z >> CARD_SIZE_LOG2; } size_t cardMapIndexToSize (GC_cardMapIndex i) { return (size_t)i << CARD_SIZE_LOG2; } GC_cardMapIndex pointerToCardMapIndexAbsolute (pointer p) { return (GC_cardMapIndex)p >> CARD_SIZE_LOG2; } GC_cardMapElem *pointerToCardMapAddr (GC_state s, pointer p) { GC_cardMapElem *res; res = &s->generationalMaps.cardMapAbsolute[pointerToCardMapIndexAbsolute (p)]; if (DEBUG_CARD_MARKING) fprintf (stderr, "pointerToCardMapAddr ("FMTPTR") = "FMTPTR"\n", (uintptr_t)p, (uintptr_t)res); return res; } GC_crossMapIndex sizeToCrossMapIndex (size_t z) { return (GC_crossMapIndex)z >> CARD_SIZE_LOG2; } bool isCardMarked (GC_state s, pointer p) { return (*pointerToCardMapAddr (s, p) != 0x0); } void markCard (GC_state s, pointer p) { if (DEBUG_CARD_MARKING) fprintf (stderr, "markCard ("FMTPTR")\n", (uintptr_t)p); if (s->mutatorMarksCards) *(pointerToCardMapAddr (s, p)) = 0x1; } void markIntergenerationalPointer (GC_state s, pointer *pp) { if (s->mutatorMarksCards and isPointerInOldGen (s, (pointer)pp) and isPointerInNursery (s, *pp)) markCard (s, (pointer)pp); } void markIntergenerationalObjptr (GC_state s, objptr *opp) { if (s->mutatorMarksCards and isPointerInOldGen (s, (pointer)opp) and isObjptrInNursery (s, *opp)) markCard (s, (pointer)opp); } void setCardMapAbsolute (GC_state s) { unless (s->mutatorMarksCards) return; /* It's OK if the subtraction below underflows because all the * subsequent additions to mark the cards will overflow and put us * in the right place. */ s->generationalMaps.cardMapAbsolute = s->generationalMaps.cardMap - pointerToCardMapIndexAbsolute (s->heap.start); if (DEBUG_CARD_MARKING) fprintf (stderr, "setCardMapAbsolute = "FMTPTR"\n", (uintptr_t)s->generationalMaps.cardMapAbsolute); } pointer getCrossMapCardStart (GC_state s, pointer p) { /* The p - 1 is so that a pointer to the beginning of a card falls * into the index for the previous crossMap entry. */ return (p == s->heap.start) ? s->heap.start : (p - 1) - ((uintptr_t)(p - 1) % CARD_SIZE); } size_t sizeofCardMap (GC_state s, size_t heapSize) { unless (s->mutatorMarksCards) { return 0; } assert (isAligned (heapSize, CARD_SIZE)); GC_cardMapIndex cardMapLength; size_t cardMapSize; cardMapLength = sizeToCardMapIndex (heapSize); cardMapSize = align (cardMapLength * CARD_MAP_ELEM_SIZE, s->sysvals.pageSize); return cardMapSize; } GC_cardMapIndex lenofCardMap (__attribute__ ((unused)) GC_state s, size_t cardMapSize) { GC_cardMapIndex cardMapLength; assert (isAligned (cardMapSize, s->sysvals.pageSize)); assert (isAligned (cardMapSize, CARD_MAP_ELEM_SIZE)); cardMapLength = (GC_cardMapIndex)(cardMapSize / CARD_MAP_ELEM_SIZE); return cardMapLength; } size_t sizeofCrossMap (GC_state s, size_t heapSize) { unless (s->mutatorMarksCards) { return 0; } assert (isAligned (heapSize, CARD_SIZE)); GC_crossMapIndex crossMapLength; size_t crossMapSize; crossMapLength = sizeToCrossMapIndex (heapSize); crossMapSize = align (crossMapLength * CROSS_MAP_ELEM_SIZE, s->sysvals.pageSize); return crossMapSize; } GC_crossMapIndex lenofCrossMap (__attribute__ ((unused)) GC_state s, size_t crossMapSize) { GC_crossMapIndex crossMapLength; assert (isAligned (crossMapSize, s->sysvals.pageSize)); assert (isAligned (crossMapSize, CROSS_MAP_ELEM_SIZE)); crossMapLength = (GC_crossMapIndex)(crossMapSize / CROSS_MAP_ELEM_SIZE); return crossMapLength; } void clearCardMap (GC_state s) { if (DEBUG_GENERATIONAL and DEBUG_DETAILED) fprintf (stderr, "clearCardMap ()\n"); memset (s->generationalMaps.cardMap, 0, s->generationalMaps.cardMapLength * CARD_MAP_ELEM_SIZE); } void clearCrossMap (GC_state s) { if (DEBUG_GENERATIONAL and DEBUG_DETAILED) fprintf (stderr, "clearCrossMap ()\n"); s->generationalMaps.crossMapValidSize = 0; memset (s->generationalMaps.crossMap, CROSS_MAP_EMPTY, s->generationalMaps.crossMapLength * CROSS_MAP_ELEM_SIZE); } void clearCardMapAndCrossMap (GC_state s) { clearCardMap (s); clearCrossMap (s); } size_t sizeofCardMapAndCrossMap (GC_state s, size_t heapSize) { size_t totalMapSize; totalMapSize = sizeofCardMap (s, heapSize) + sizeofCrossMap (s, heapSize); assert (isAligned (totalMapSize, s->sysvals.pageSize)); return totalMapSize; } /* * heapSize = invertSizeofCardMapAndCrossMap (s, heapWithMapsSize); * implies * heapSize + sizeofCardMapAndCrossMap (s, heapSize) * <= heapWithMapsSize * < (heapSize + s->sysvals.pageSize) * + sizeofCardMapAndCrossMap (s, heapSize + s->sysvals.pageSize) */ size_t invertSizeofCardMapAndCrossMap (GC_state s, size_t heapWithMapsSize) { unless (s->mutatorMarksCards) { return heapWithMapsSize; } assert (isAligned (heapWithMapsSize, s->sysvals.pageSize)); size_t minHeapSize; if (heapWithMapsSize <= 3 * s->sysvals.pageSize) { minHeapSize = 0; } else { double minHeapSizeD; minHeapSizeD = (((double)(CARD_SIZE) / (double)(CARD_SIZE + CARD_MAP_ELEM_SIZE + CROSS_MAP_ELEM_SIZE)) * (double)(heapWithMapsSize - 3 * s->sysvals.pageSize)) - (((double)(CARD_MAP_ELEM_SIZE + CROSS_MAP_ELEM_SIZE) / (double)(CARD_SIZE + CARD_MAP_ELEM_SIZE + CROSS_MAP_ELEM_SIZE)) * (double)(s->sysvals.pageSize)); minHeapSize = alignDown ((size_t)minHeapSizeD, s->sysvals.pageSize); } size_t heapSize = minHeapSize; size_t nextHeapSize = heapSize + s->sysvals.pageSize; /* The termination condition is: * heapWithMapsSize >= nextHeapSize + sizeofCardMapAndCrossMap (s, nextHeapSize) * However, nextHeapSize + sizeofCardMapAndCrossMap (s, nextHeapSize) may overflow. */ while (heapWithMapsSize >= sizeofCardMapAndCrossMap (s, nextHeapSize) and heapWithMapsSize - sizeofCardMapAndCrossMap (s, nextHeapSize) >= nextHeapSize) { heapSize = nextHeapSize; nextHeapSize += s->sysvals.pageSize; } assert (isAligned (heapSize, s->sysvals.pageSize)); assert (heapSize + sizeofCardMapAndCrossMap (s, heapSize) <= heapWithMapsSize); assert (nextHeapSize == heapSize + s->sysvals.pageSize); assert (heapWithMapsSize < sizeofCardMapAndCrossMap (s, nextHeapSize) or heapWithMapsSize - sizeofCardMapAndCrossMap (s, nextHeapSize) < nextHeapSize); if (DEBUG_DETAILED) fprintf (stderr, "invertSizeofCardMapAndCrossMap(%s) = %s\n", uintmaxToCommaString(heapWithMapsSize), uintmaxToCommaString(heapSize)); return heapSize; } void setCardMapAndCrossMap (GC_state s) { unless (s->mutatorMarksCards) { s->generationalMaps.cardMapLength = 0; s->generationalMaps.cardMap = NULL; s->generationalMaps.cardMapAbsolute = NULL; s->generationalMaps.crossMapLength = 0; s->generationalMaps.crossMap = NULL; return; } GC_cardMapIndex cardMapLength; size_t cardMapSize; GC_crossMapIndex crossMapLength; size_t crossMapSize; cardMapSize = sizeofCardMap (s, s->heap.size); cardMapLength = lenofCardMap (s, cardMapSize); s->generationalMaps.cardMapLength = cardMapLength; crossMapSize = sizeofCrossMap (s, s->heap.size); crossMapLength = lenofCrossMap (s, crossMapSize); s->generationalMaps.crossMapLength = crossMapLength; /* The card map starts at the end of the heap. */ assert (s->heap.withMapsSize == s->heap.size + cardMapSize + crossMapSize); s->generationalMaps.cardMap = (GC_cardMap) (s->heap.start + s->heap.size); s->generationalMaps.crossMap = (GC_crossMap) (s->heap.start + s->heap.size + cardMapSize); setCardMapAbsolute (s); clearCardMapAndCrossMap (s); } #if ASSERT /* isCrossMapOk is a slower, but easier to understand, way of * computing the crossMap. updateCrossMap (below) incrementally * updates the crossMap, checking only the part of the old generation * that it hasn't seen before. isCrossMapOk simply walks through the * entire old generation. It is useful to check that the incremental * update is working correctly. */ bool isCrossMapOk (GC_state s) { static GC_crossMapElem *map; size_t mapSize; pointer front, back; GC_cardMapIndex cardIndex; pointer cardStart; if (DEBUG) fprintf (stderr, "isCrossMapOk ()\n"); mapSize = s->generationalMaps.crossMapLength * CROSS_MAP_ELEM_SIZE; map = GC_mmapAnon_safe (NULL, mapSize); memset (map, CROSS_MAP_EMPTY, mapSize); back = s->heap.start + s->heap.oldGenSize; cardIndex = 0; front = alignFrontier (s, s->heap.start); loopObjects: assert (front <= back); cardStart = getCrossMapCardStart (s, front); cardIndex = sizeToCardMapIndex (cardStart - s->heap.start); map[cardIndex] = (GC_crossMapElem)((front - cardStart) / CROSS_MAP_OFFSET_SCALE); if (front < back) { front += sizeofObject (s, advanceToObjectData (s, front)); goto loopObjects; } for (size_t i = 0; i < cardIndex; ++i) assert (map[i] == s->generationalMaps.crossMap[i]); GC_release (map, mapSize); return TRUE; } #endif void updateCrossMap (GC_state s) { GC_cardMapIndex cardIndex; pointer cardStart, cardEnd; pointer nextObject, objectStart; pointer oldGenEnd; if (DEBUG_GENERATIONAL) { fprintf (stderr, "updateCrossMap starting\n"); displayGenerationalMaps (s, &s->generationalMaps, stderr); } assert (isAligned (s->alignment, CROSS_MAP_OFFSET_SCALE)); if (s->generationalMaps.crossMapValidSize == s->heap.oldGenSize) goto done; oldGenEnd = s->heap.start + s->heap.oldGenSize; objectStart = s->heap.start + s->generationalMaps.crossMapValidSize; if (objectStart == s->heap.start) { cardIndex = 0; objectStart = alignFrontier (s, objectStart); } else cardIndex = sizeToCardMapIndex (objectStart - 1 - s->heap.start); cardStart = s->heap.start + cardMapIndexToSize (cardIndex); cardEnd = cardStart + CARD_SIZE; loopObjects: assert (objectStart < oldGenEnd); assert ((objectStart == s->heap.start or cardStart < objectStart) and objectStart <= cardEnd); nextObject = objectStart + sizeofObject (s, advanceToObjectData (s, objectStart)); if (DEBUG_GENERATIONAL) { fprintf (stderr, "\tloopObjects:\n" "\t cardIndex = %"PRIuMAX"\n" "\t cardStart = "FMTPTR"\n" "\t cardEnd = "FMTPTR"\n" "\tobjectStart = "FMTPTR"\n" "\t nextObject = "FMTPTR"\n", (uintmax_t)cardIndex, (uintptr_t)cardStart, (uintptr_t)cardEnd, (uintptr_t)objectStart, (uintptr_t)nextObject); } if (nextObject > cardEnd) { /* We're about to move to a new card, so we are looking at the * last object boundary in the current card. * Store it in the crossMap. */ size_t offset; offset = (objectStart - cardStart) / CROSS_MAP_OFFSET_SCALE; assert (offset < CROSS_MAP_EMPTY); if (DEBUG_GENERATIONAL) fprintf (stderr, "crossMap[%"PRIuMAX"] = %"PRIuMAX"\n", (uintmax_t)cardIndex, (uintmax_t)offset); s->generationalMaps.crossMap[cardIndex] = (GC_crossMapElem)offset; cardIndex = sizeToCardMapIndex (nextObject - 1 - s->heap.start); cardStart = s->heap.start + cardMapIndexToSize (cardIndex); cardEnd = cardStart + CARD_SIZE; } objectStart = nextObject; if (objectStart < oldGenEnd) goto loopObjects; assert (objectStart == oldGenEnd); s->generationalMaps.crossMap[cardIndex] = (GC_crossMapElem)(oldGenEnd - cardStart) / CROSS_MAP_OFFSET_SCALE; s->generationalMaps.crossMapValidSize = s->heap.oldGenSize; done: assert (s->generationalMaps.crossMapValidSize == s->heap.oldGenSize); assert (isCrossMapOk (s)); if (DEBUG_GENERATIONAL) { fprintf (stderr, "updateCrossMap finished\n"); displayGenerationalMaps (s, &s->generationalMaps, stderr); } } mlton-20100608/runtime/gc/generational.h0000644000076600000240000000711611404435622016462 0ustar mtfstaff/* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* must agree w/ cardSizeLog2 in ssa-to-rssa.fun */ #define CARD_SIZE_LOG2 8 #define CARD_SIZE TWOPOWER(CARD_SIZE_LOG2) typedef uint8_t GC_cardMapElem; typedef uint8_t GC_crossMapElem; typedef GC_cardMapElem *GC_cardMap; typedef GC_crossMapElem *GC_crossMap; typedef size_t GC_cardMapIndex; typedef size_t GC_crossMapIndex; #define CARD_MAP_ELEM_SIZE sizeof(GC_cardMapElem) #define CROSS_MAP_ELEM_SIZE sizeof(GC_crossMapElem) #define CROSS_MAP_EMPTY ((GC_crossMapElem)255) #define CROSS_MAP_OFFSET_SCALE 4 #define FMTCME "%"PRIu8 struct GC_generationalMaps { /* cardMap is an array with cardinality equal to the size of the * heap divided by card size. Each element in the array is * interpreted as a boolean; true indicates that some mutable field * of some object in the corresponding card in the heap has been * written since the last minor GC; hence, the corresponding card * must be traced at the next minor GC. */ GC_cardMap cardMap; GC_cardMap cardMapAbsolute; GC_cardMapIndex cardMapLength; /* crossMap is an array with cardinality equal to the size of the * heap divided by card size. Each element in the array is * interpreted as a byte offset (scaled by CARD_MAP_OFFSET_SCALE); * the offset indicates the start of the last object in the * corresponding card from the start of the card. */ GC_crossMap crossMap; GC_crossMapIndex crossMapLength; /* crossMapValidSize the size of the prefix of the old generation * for which the crossMap is valid. */ size_t crossMapValidSize; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void displayGenerationalMaps (GC_state s, struct GC_generationalMaps *generational, FILE *stream); static inline GC_cardMapIndex sizeToCardMapIndex (size_t z); static inline size_t cardMapIndexToSize (GC_cardMapIndex i); static inline GC_cardMapIndex pointerToCardMapIndexAbsolute (pointer p); static inline GC_cardMapElem *pointerToCardMapAddr (GC_state s, pointer p); static inline GC_crossMapIndex sizeToCrossMapIndex (size_t z); static inline bool isCardMarked (GC_state s, pointer p); static inline void markCard (GC_state s, pointer p); static inline void markIntergenerationalPointer (GC_state s, pointer *pp); static inline void markIntergenerationalObjptr (GC_state s, objptr *opp); static inline void setCardMapAbsolute (GC_state s); static inline pointer getCrossMapCardStart (GC_state s, pointer p); static inline size_t sizeofCardMap (GC_state s, size_t heapSize); static inline GC_cardMapIndex lenofCardMap (GC_state s, size_t cardMapSize); static inline size_t sizeofCrossMap (GC_state s, size_t heapSize); static inline GC_crossMapIndex lenofCrossMap (GC_state s, size_t crossMapSize); static size_t sizeofCardMapAndCrossMap (GC_state s, size_t heapSize); static size_t invertSizeofCardMapAndCrossMap (GC_state s, size_t heapWithMapsSize); static inline void clearCardMap (GC_state s); static inline void clearCrossMap (GC_state s); static inline void clearCardMapAndCrossMap (GC_state s); static void setCardMapAndCrossMap (GC_state s); #if ASSERT static bool isCrossMapOk (GC_state s); #endif static void updateCrossMap (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/handler.c0000644000076600000240000000505411404435622015421 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* GC_startSignalHandler does not do an enter()/leave(), even though * it is exported. The basis library uses it via _import, not _prim, * and so does not treat it as a runtime call -- so the invariant in * enter would fail miserably. It is OK because GC_startHandler must * be called from within a critical section. * * Don't make it inline, because it is also called in basis/Thread.c, * and when compiling with COMPILE_FAST, they may appear out of order. */ void GC_startSignalHandler (GC_state s) { /* Switch to the signal handler thread. */ if (DEBUG_SIGNALS) { fprintf (stderr, "GC_startSignalHandler\n"); } assert (s->atomicState == 1); assert (s->signalsInfo.signalIsPending); s->signalsInfo.signalIsPending = FALSE; s->signalsInfo.amInSignalHandler = TRUE; assert (s->savedThread == BOGUS_OBJPTR); s->savedThread = s->currentThread; /* Set s->atomicState to 2 when switching to the signal handler * thread; leaving the runtime will decrement s->atomicState to 1, * the signal handler will then run atomically and will finish by * switching to the thread to continue with, which will decrement * s->atomicState to 0. */ s->atomicState = 2; } void GC_finishSignalHandler (GC_state s) { if (DEBUG_SIGNALS) fprintf (stderr, "GC_finishSignalHandler ()\n"); assert (s->atomicState == 1); s->signalsInfo.amInSignalHandler = FALSE; } void switchToSignalHandlerThreadIfNonAtomicAndSignalPending (GC_state s) { if (s->atomicState == 1 and s->signalsInfo.signalIsPending) { GC_startSignalHandler (s); switchToThread (s, s->signalHandlerThread); } } /* GC_handler sets s->limit = 0 so that the next limit check will * fail. Signals need to be blocked during the handler (i.e. it * should run atomically) because sigaddset does both a read and a * write of s->signalsInfo.signalsPending. The signals are blocked * by Posix_Signal_handle (see Posix/Signal/Signal.c). */ void GC_handler (GC_state s, int signum) { if (DEBUG_SIGNALS) fprintf (stderr, "GC_handler signum = %d\n", signum); assert (sigismember (&s->signalsInfo.signalsHandled, signum)); if (s->atomicState == 0) s->limit = 0; s->signalsInfo.signalIsPending = TRUE; sigaddset (&s->signalsInfo.signalsPending, signum); if (DEBUG_SIGNALS) fprintf (stderr, "GC_handler done\n"); } mlton-20100608/runtime/gc/handler.h0000644000076600000240000000124011404435622015417 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void switchToSignalHandlerThreadIfNonAtomicAndSignalPending (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_startSignalHandler (GC_state s); PRIVATE void GC_finishSignalHandler (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ PRIVATE void GC_handler (GC_state s, int signum); mlton-20100608/runtime/gc/hash-cons.c0000644000076600000240000002334311404435622015670 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Object hash consing */ /* ---------------------------------------------------------------- */ /* Hashing based on Introduction to Algorithms by Cormen, Leiserson, and Rivest. * Section numbers in parens. * k is key to be hashed. * table is of size 2^p (it must be a power of two) * Open addressing (12.4), meaning that we stick the entries directly in the * table and probe until we find what we want. * Multiplication method (12.3.2), meaning that we compute the hash by * multiplying by a magic number, chosen by Knuth, and take the high-order p * bits of the low order 32 bits. * Double hashing (12.4), meaning that we use two hash functions, the first to * decide where to start looking and a second to decide at what offset to * probe. The second hash must be relatively prime to the table size, which * we ensure by making it odd and keeping the table size as a power of 2. */ GC_objectHashTable allocHashTable (GC_state s) { uint32_t elementsLengthMax; pointer regionStart; pointer regionEnd; GC_objectHashTable t; t = (GC_objectHashTable)(malloc_safe (sizeof(*t))); // Try to use space in the heap for the elements. if (not (isHeapInit (&s->secondaryHeap))) { if (DEBUG_SHARE) fprintf (stderr, "using secondaryHeap\n"); regionStart = s->secondaryHeap.start; regionEnd = s->secondaryHeap.start + s->secondaryHeap.size; } else if (s->amInGC or not s->canMinor) { if (DEBUG_SHARE) fprintf (stderr, "using end of heap\n"); regionStart = s->frontier; regionEnd = s->limitPlusSlop; } else { if (DEBUG_SHARE) fprintf (stderr, "using minor space\n"); assert (s->canMinor); regionStart = s->heap.start + s->heap.oldGenSize; regionEnd = s->heap.nursery; } elementsLengthMax = (regionEnd - regionStart) / sizeof (*(t->elements)); if (DEBUG_SHARE) fprintf (stderr, "elementsLengthMax = %"PRIu32"\n", elementsLengthMax); t->elementsLengthMax = 64; // some small power of two t->elementsLengthMaxLog2 = 6; // and its log base 2 if (elementsLengthMax < t->elementsLengthMax) { if (DEBUG_SHARE) fprintf (stderr, "elementsLengthMax too small -- using calloc\n"); t->elementsIsInHeap = FALSE; t->elements = (struct GC_objectHashElement *) (calloc_safe(t->elementsLengthMax, sizeof(*(t->elements)))); } else { if (DEBUG_SHARE) fprintf (stderr, "elementsLengthMax big enough -- using heap\n"); t->elementsIsInHeap = TRUE; t->elements = (struct GC_objectHashElement*)regionStart; // Find the largest power of two that fits. for ( ; t->elementsLengthMax <= elementsLengthMax; t->elementsLengthMax <<= 1, t->elementsLengthMaxLog2++) ; // nothing t->elementsLengthMax >>= 1; t->elementsLengthMaxLog2--; assert (t->elementsLengthMax <= elementsLengthMax); for (unsigned int i = 0; i < t->elementsLengthMax; ++i) t->elements[i].object = NULL; } t->elementsLengthCur = 0; t->mayInsert = TRUE; if (DEBUG_SHARE) { fprintf (stderr, "elementsIsInHeap = %s\n", boolToString (t->elementsIsInHeap)); fprintf (stderr, "elementsLengthMax = %"PRIu32"\n", t->elementsLengthMax); fprintf (stderr, FMTPTR" = allocHashTable ()\n", (uintptr_t)t); } return t; } void freeHashTable (GC_objectHashTable t) { unless (t->elementsIsInHeap) free (t->elements); free (t); } pointer insertHashTableElem (__attribute__ ((unused)) GC_state s, GC_objectHashTable t, GC_hash hash, pointer object, pointer max, bool mightBeThere) { static bool init = FALSE; static uint64_t mult; // magic multiplier for hashing static uint32_t maxNumProbes = 0; GC_objectHashElement e; uint32_t numProbes; uint32_t probe; uint32_t slot; // slot in the hash table we are considering unsigned int *p1; unsigned int *p2; if (DEBUG_SHARE) fprintf (stderr, "insertHashTableElem ("FMTHASH", "FMTPTR", "FMTPTR", %s)\n", hash, (uintptr_t)object, (uintptr_t)max, boolToString (mightBeThere)); if (! init) { init = TRUE; mult = floor (((sqrt (5.0) - 1.0) / 2.0) * (double)0x100000000llu); } slot = (uint32_t)(mult * (uint64_t)hash) >> (32 - t->elementsLengthMaxLog2); probe = (1 == slot % 2) ? slot : slot - 1; if (DEBUG_SHARE) fprintf (stderr, "probe = 0x%"PRIx32"\n", probe); assert (1 == probe % 2); numProbes = 0; look: if (DEBUG_SHARE) fprintf (stderr, "slot = 0x%"PRIx32"\n", slot); assert (slot < t->elementsLengthMax); numProbes++; e = &t->elements[slot]; if (NULL == e->object) { /* It's not in the table. Add it. */ unless (t->mayInsert) { if (DEBUG_SHARE) fprintf (stderr, "not inserting\n"); return object; } e->hash = hash; e->object = object; t->elementsLengthCur++; if (numProbes > maxNumProbes) { maxNumProbes = numProbes; if (DEBUG_SHARE) fprintf (stderr, "numProbes = %"PRIu32"\n", numProbes); } return object; } unless (hash == e->hash) { lookNext: slot = (slot + probe) % t->elementsLengthMax; goto look; } unless (mightBeThere) goto lookNext; if (DEBUG_SHARE) fprintf (stderr, "comparing "FMTPTR" to "FMTPTR"\n", (uintptr_t)object, (uintptr_t)e->object); /* Compare object to e->object. */ unless (object == e->object) { GC_header header; GC_objectTypeTag tag; header = getHeader (object); unless (header == getHeader (e->object)) goto lookNext; for (p1 = (unsigned int*)object, p2 = (unsigned int*)e->object; p1 < (unsigned int*)max; ++p1, ++p2) unless (*p1 == *p2) goto lookNext; splitHeader (s, header, &tag, NULL, NULL, NULL); if (ARRAY_TAG == tag and (getArrayLength (object) != getArrayLength (e->object))) goto lookNext; } /* object is equal to e->object. */ return e->object; } void growHashTableMaybe (GC_state s, GC_objectHashTable t) { GC_objectHashElement oldElement; struct GC_objectHashElement *oldElements; uint32_t oldElementsLengthMax; uint32_t newElementsLengthMax; if (not t->mayInsert or t->elementsLengthCur * 2 <= t->elementsLengthMax) return; oldElements = t->elements; oldElementsLengthMax = t->elementsLengthMax; newElementsLengthMax = oldElementsLengthMax * 2; if (DEBUG_SHARE) fprintf (stderr, "trying to grow table to cardinality %"PRIu32"\n", newElementsLengthMax); // Try to alocate the new table. t->elements = (struct GC_objectHashElement *) (calloc(newElementsLengthMax, sizeof(*(t->elements)))); if (NULL == t->elements) { t->mayInsert = FALSE; t->elements = oldElements; if (DEBUG_SHARE) fprintf (stderr, "unable to grow table\n"); return; } t->elementsLengthMax = newElementsLengthMax; t->elementsLengthMaxLog2++; for (unsigned int i = 0; i < oldElementsLengthMax; ++i) { oldElement = &oldElements[i]; unless (NULL == oldElement->object) insertHashTableElem (s, t, oldElement->hash, oldElement->object, NULL, FALSE); } if (t->elementsIsInHeap) t->elementsIsInHeap = FALSE; else free (oldElements); if (DEBUG_SHARE) fprintf (stderr, "done growing table\n"); } pointer hashConsPointer (GC_state s, pointer object, bool countBytesHashConsed) { GC_objectHashTable t; GC_header header; uint16_t bytesNonObjptrs; uint16_t numObjptrs; bool hasIdentity; GC_objectTypeTag tag; pointer max; GC_hash hash; GC_hash* p; pointer res; if (DEBUG_SHARE) fprintf (stderr, "hashConsPointer ("FMTPTR")\n", (uintptr_t)object); t = s->objectHashTable; header = getHeader (object); splitHeader(s, header, &tag, &hasIdentity, &bytesNonObjptrs, &numObjptrs); if (hasIdentity) { /* Don't hash cons. */ res = object; goto done; } assert ((ARRAY_TAG == tag) or (NORMAL_TAG == tag)); max = object + (ARRAY_TAG == tag ? (sizeofArrayNoHeader (s, getArrayLength (object), bytesNonObjptrs, numObjptrs)) : (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE))); // Compute the hash. hash = (GC_hash)header; for (p = (GC_hash*)object; p < (GC_hash*)max; ++p) hash = hash * 31 + *p; /* Insert into table. */ res = insertHashTableElem (s, t, hash, object, max, TRUE); growHashTableMaybe (s, t); if (countBytesHashConsed and res != object) { size_t amount; amount = max - object; if (ARRAY_TAG == tag) amount += GC_ARRAY_HEADER_SIZE; else amount += GC_NORMAL_HEADER_SIZE; s->lastMajorStatistics.bytesHashConsed += amount; } done: if (DEBUG_SHARE) fprintf (stderr, FMTPTR" = hashConsPointer ("FMTPTR")\n", (uintptr_t)res, (uintptr_t)object); return res; } void shareObjptr (GC_state s, objptr *opp) { pointer p; p = objptrToPointer (*opp, s->heap.start); if (DEBUG_SHARE) fprintf (stderr, "shareObjptr opp = "FMTPTR" *opp = "FMTOBJPTR"\n", (uintptr_t)opp, *opp); p = hashConsPointer (s, p, FALSE); *opp = pointerToObjptr (p, s->heap.start); markIntergenerationalObjptr (s, opp); } void printBytesHashConsedMessage (size_t bytesHashConsed, size_t bytesExamined) { fprintf (stderr, "[GC: hash-consed %s bytes (%.1f%% of bytes examined).]\n", uintmaxToCommaString(bytesHashConsed), 100.0 * ((double)bytesHashConsed / (double)bytesExamined)); } mlton-20100608/runtime/gc/hash-cons.h0000644000076600000240000000334111404435622015671 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* ---------------------------------------------------------------- */ /* Object hash consing */ /* ---------------------------------------------------------------- */ typedef uint32_t GC_hash; #define GC_HASH_SIZE sizeof(GC_hash) #define PRIxHASH PRIx32 #define FMTHASH "0x%08"PRIxHASH typedef struct GC_objectHashElement { GC_hash hash; pointer object; } *GC_objectHashElement; typedef struct GC_objectHashTable { struct GC_objectHashElement *elements; bool elementsIsInHeap; uint32_t elementsLengthCur; uint32_t elementsLengthMax; uint32_t elementsLengthMaxLog2; bool mayInsert; } *GC_objectHashTable; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_objectHashTable allocHashTable (GC_state s); static inline void freeHashTable (GC_objectHashTable t); static inline pointer insertHashTableElem (GC_state s, GC_objectHashTable t, GC_hash hash, pointer object, pointer max, bool mightBeThere); static inline void growHashTableMaybe (GC_state s, GC_objectHashTable t); static pointer hashConsPointer (GC_state s, pointer object, bool countBytesHashConsed); static inline void shareObjptr (GC_state s, objptr *opp); static void printBytesHashConsedMessage (size_t bytesHashConsed, size_t bytesExamined); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/heap.c0000644000076600000240000005213511404435622014723 0ustar mtfstaff/* Copyright (C) 2009-2010 Matthew Fluet. * Copyright (C) 2005-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void displayHeap (__attribute__ ((unused)) GC_state s, GC_heap heap, FILE *stream) { fprintf(stream, "\t\tnursery = "FMTPTR"\n" "\t\toldGenSize = %"PRIuMAX"\n" "\t\tsize = %"PRIuMAX"\n" "\t\tstart = "FMTPTR"\n" "\t\twithMapsSize = %"PRIuMAX"\n", (uintptr_t)heap->nursery, (uintmax_t)heap->oldGenSize, (uintmax_t)heap->size, (uintptr_t)heap->start, (uintmax_t)heap->withMapsSize); } void initHeap (__attribute__ ((unused)) GC_state s, GC_heap h) { h->nursery = NULL; h->oldGenSize = 0; h->size = 0; h->start = NULL; h->withMapsSize = 0; } /* sizeofHeapDesired (s, l, cs) * * returns the desired heap size for a heap with l bytes live, * given that the current heap size is cs. */ size_t sizeofHeapDesired (GC_state s, size_t liveSize, size_t currentSize) { size_t liveMapsSize, liveWithMapsSize; size_t currentMapsSize, currentWithMapsSize; size_t resSize, resWithMapsSize; size_t syslimSize, syslimMapsSize, syslimWithMapsSize; double ratio; syslimWithMapsSize = alignDown (SIZE_MAX, s->sysvals.pageSize); syslimSize = invertSizeofCardMapAndCrossMap (s, syslimWithMapsSize); syslimMapsSize = sizeofCardMapAndCrossMap (s, syslimSize); assert (syslimSize + syslimMapsSize <= syslimWithMapsSize); liveSize = align (liveSize, s->sysvals.pageSize); if (syslimSize < liveSize) die ("Out of memory with system-limit heap size %s.\n", uintmaxToCommaString(syslimSize)); liveMapsSize = sizeofCardMapAndCrossMap (s, liveSize); liveWithMapsSize = liveSize + liveMapsSize; assert (isAligned (currentSize, s->sysvals.pageSize)); currentMapsSize = sizeofCardMapAndCrossMap (s, currentSize); currentWithMapsSize = currentSize + currentMapsSize; ratio = (double)s->sysvals.ram / (double)liveWithMapsSize; if (ratio >= s->controls.ratios.live + s->controls.ratios.grow) { /* Cheney copying fits in RAM with desired ratios.live. */ resWithMapsSize = liveWithMapsSize * s->controls.ratios.live; /* If the heap is currently close in size to what we want, leave * it alone. Favor growing over shrinking. */ if (0.5 * currentWithMapsSize <= resWithMapsSize and resWithMapsSize <= 1.1 * currentWithMapsSize) { resWithMapsSize = currentWithMapsSize; } else { resWithMapsSize = align (resWithMapsSize, s->sysvals.pageSize); } } else if (s->controls.ratios.grow >= s->controls.ratios.copy and ratio >= 2.0 * s->controls.ratios.copy) { /* Split RAM in half. Round down by pageSize so that the total * amount of space taken isn't greater than RAM once rounding * happens. This is so resizeHeapSecondary doesn't get confused * and free a semispace in a misguided attempt to avoid paging. */ resWithMapsSize = alignDown (s->sysvals.ram / 2, s->sysvals.pageSize); } else if (ratio >= s->controls.ratios.copy + s->controls.ratios.grow) { /* Cheney copying fits in RAM. */ resWithMapsSize = s->sysvals.ram - s->controls.ratios.grow * liveWithMapsSize; /* If the heap isn't too much smaller than what we want, leave it * alone. On the other hand, if it is bigger we want to leave * resWithMapsSize as is so that the heap is shrunk, to try to * avoid paging. */ if (1.0 * currentWithMapsSize <= resWithMapsSize and resWithMapsSize <= 1.1 * currentWithMapsSize) { resWithMapsSize = currentWithMapsSize; } else { resWithMapsSize = align (resWithMapsSize, s->sysvals.pageSize); } } else if (ratio >= s->controls.ratios.markCompact) { /* Mark compact fits in RAM. It doesn't matter what the current * size is. If the heap is currently smaller, we are using * copying and should switch to mark-compact. If the heap is * currently bigger, we want to shrink back to RAM to avoid * paging. */ resWithMapsSize = s->sysvals.ram; } else { /* Required live ratio. */ double resWithMapsSizeD = liveWithMapsSize * (double)(s->controls.ratios.markCompact); if (resWithMapsSizeD > (double)syslimWithMapsSize) { resWithMapsSize = syslimWithMapsSize; } else { resWithMapsSize = align ((size_t)resWithMapsSizeD, s->sysvals.pageSize); } /* If the current heap is bigger than resWithMapsSize, then * shrinking always sounds like a good idea. However, depending * on what pages the VM keeps around, growing could be very * expensive, if it involves paging the entire heap. Hopefully * the copy loop in growHeap will make the right thing happen. */ } if (s->controls.fixedHeap > 0) { if (resWithMapsSize > s->controls.fixedHeap / 2) resWithMapsSize = s->controls.fixedHeap; else resWithMapsSize = s->controls.fixedHeap / 2; if (resWithMapsSize < liveWithMapsSize) die ("Out of memory with fixed heap size %s.", uintmaxToCommaString(s->controls.fixedHeap)); } else if (s->controls.maxHeap > 0) { if (resWithMapsSize > s->controls.maxHeap) resWithMapsSize = s->controls.maxHeap; if (resWithMapsSize < liveWithMapsSize) die ("Out of memory with max heap size %s.", uintmaxToCommaString(s->controls.maxHeap)); } resSize = invertSizeofCardMapAndCrossMap (s, resWithMapsSize); assert (isAligned (resSize, s->sysvals.pageSize)); if (DEBUG_RESIZING) fprintf (stderr, "%s = sizeofHeapDesired (%s, %s)\n", uintmaxToCommaString(resSize), uintmaxToCommaString(liveSize), uintmaxToCommaString(currentSize)); assert (resSize >= liveSize); return resSize; } void releaseHeap (GC_state s, GC_heap h) { if (NULL == h->start) return; if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Releasing heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map).]\n", (uintptr_t)(h->start), uintmaxToCommaString(h->size), uintmaxToCommaString(h->withMapsSize - h->size)); GC_release (h->start, h->withMapsSize); initHeap (s, h); } /* shrinkHeap (s, h, keepSize) */ void shrinkHeap (GC_state s, GC_heap h, size_t keepSize) { assert (keepSize <= h->size); if (0 == keepSize) { releaseHeap (s, h); return; } keepSize = align (keepSize, s->sysvals.pageSize); if (keepSize < h->size) { size_t keepWithMapsSize; keepWithMapsSize = keepSize + sizeofCardMapAndCrossMap (s, keepSize); if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Shrinking heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map)]\n", (uintptr_t)(h->start), uintmaxToCommaString(h->size), uintmaxToCommaString(h->withMapsSize - h->size)); fprintf (stderr, "[GC:\tto size %s bytes (+ %s bytes card/cross map).]\n", uintmaxToCommaString(keepSize), uintmaxToCommaString(keepWithMapsSize - keepSize)); } assert (isAligned (keepWithMapsSize, s->sysvals.pageSize)); assert (keepWithMapsSize <= h->withMapsSize); GC_release (h->start + keepWithMapsSize, h->withMapsSize - keepWithMapsSize); h->size = keepSize; h->withMapsSize = keepWithMapsSize; } } /* createHeap (s, h, desiredSize, minSize) * * allocates a heap of the size necessary to work with desiredSize * live data, and ensures that at least minSize is available. It * returns TRUE if it is able to allocate the space, and returns FALSE * if it is unable. */ bool createHeap (GC_state s, GC_heap h, size_t desiredSize, size_t minSize) { size_t newSize; size_t newWithMapsSize; if (DEBUG_MEM) fprintf (stderr, "createHeap desired size = %s min size = %s\n", uintmaxToCommaString(desiredSize), uintmaxToCommaString(minSize)); if (desiredSize < minSize) desiredSize = minSize; minSize = align (minSize, s->sysvals.pageSize); desiredSize = align (desiredSize, s->sysvals.pageSize); assert (isHeapInit (h) and NULL == h->start); /* Biased binary search (between minSize and desiredSize) for a * successful mmap. * Toggle back and forth between high and low addresses to decrease * the chance of virtual memory fragmentation; important for large * heaps. * Always try a NULL address last. */ size_t factor = 16; const size_t maxFactor = s->sysvals.pageSize; size_t lowSize = minSize; size_t highSize = desiredSize; newSize = highSize; unsigned int loopCount = 0; while (lowSize <= highSize) { pointer newStart; newWithMapsSize = newSize + sizeofCardMapAndCrossMap (s, newSize); assert (isAligned (newWithMapsSize, s->sysvals.pageSize)); const unsigned int addressCountLog2 = 5; const unsigned int addressCount = 0x1 << addressCountLog2; const size_t addressStep = (size_t)0x1 << (ADDRESS_BITS - addressCountLog2); #if ADDRESS_BITS == POINTER_BITS const size_t addressHigh = 0; #else const size_t addressHigh = (size_t)0x1 << ADDRESS_BITS; #endif static bool addressScanDir = TRUE; for (unsigned int i = 1; i <= addressCount; i++) { size_t address = (size_t)i * addressStep; if (addressScanDir) address = addressHigh - address; /* Always use 0 in the last step. */ if (i == addressCount) address = 0; newStart = GC_mmapAnon ((pointer)address, newWithMapsSize); unless ((void*)-1 == newStart) { addressScanDir = not addressScanDir; h->start = newStart; h->size = newSize; h->withMapsSize = newWithMapsSize; if (h->size > s->cumulativeStatistics.maxHeapSize) s->cumulativeStatistics.maxHeapSize = h->size; assert (minSize <= h->size and h->size <= desiredSize); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Created heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map).]\n", (uintptr_t)(h->start), uintmaxToCommaString(h->size), uintmaxToCommaString(h->withMapsSize - h->size)); return TRUE; } } size_t prevSize = newSize; size_t prevWithMapsSize = newWithMapsSize; highSize = newSize - s->sysvals.pageSize; newSize = align((factor-1) * (highSize / factor) + (lowSize / factor), s->sysvals.pageSize); if (s->controls.messages) { fprintf (stderr, "[GC: Creating heap of size %s bytes (+ %s bytes card/cross map) cannot be satisfied,]\n", uintmaxToCommaString (prevSize), uintmaxToCommaString (prevWithMapsSize - prevSize)); fprintf (stderr, "[GC:\tbacking off by %s bytes with minimum size of %s bytes.]\n", uintmaxToCommaString (prevSize - newSize), uintmaxToCommaString (minSize)); } if (factor < maxFactor and ++loopCount % 64 == 0) { factor += factor; } } return FALSE; } /* createHeapSecondary (s, desiredSize) */ bool createHeapSecondary (GC_state s, size_t desiredSize) { size_t desiredWithMapsSize; size_t minSize, minWithMapsSize; desiredWithMapsSize = desiredSize + sizeofCardMapAndCrossMap (s, desiredSize); if ((s->controls.fixedHeap > 0 and s->heap.withMapsSize + desiredWithMapsSize > s->controls.fixedHeap) or (s->controls.maxHeap > 0 and s->heap.withMapsSize + desiredWithMapsSize > s->controls.maxHeap)) return FALSE; minSize = align (s->heap.oldGenSize, s->sysvals.pageSize); minWithMapsSize = minSize + sizeofCardMapAndCrossMap (s, minSize); if (minWithMapsSize > SIZE_MAX - s->heap.withMapsSize) return FALSE; return createHeap (s, &s->secondaryHeap, desiredSize, s->heap.oldGenSize); } /* remapHeap (s, h, desiredSize, minSize) */ bool remapHeap (GC_state s, GC_heap h, size_t desiredSize, size_t minSize) { #if not HAS_REMAP return FALSE; #endif size_t newSize; size_t newWithMapsSize; int result; if (DEBUG_MEM) fprintf (stderr, "remapHeap desired size = %s min size = %s\n", uintmaxToCommaString(desiredSize), uintmaxToCommaString(minSize)); assert (minSize <= desiredSize); assert (desiredSize >= h->size); minSize = align (minSize, s->sysvals.pageSize); desiredSize = align (desiredSize, s->sysvals.pageSize); /* Biased binary search (between minSize and desiredSize) for a * successful mremap. */ size_t factor = 16; size_t lowSize = minSize; size_t highSize = desiredSize; newSize = highSize; result = FALSE; while (lowSize <= highSize) { pointer newStart; newWithMapsSize = newSize + sizeofCardMapAndCrossMap (s, newSize); assert (isAligned (newWithMapsSize, s->sysvals.pageSize)); newStart = GC_mremap (h->start, h->withMapsSize, newWithMapsSize); if ((void*)-1 != newStart) { pointer origStart = h->start; size_t origSize = h->size; size_t origWithMapsSize = h->withMapsSize; h->start = newStart; h->size = newSize; h->withMapsSize = newWithMapsSize; if (h->size > s->cumulativeStatistics.maxHeapSize) s->cumulativeStatistics.maxHeapSize = h->size; assert (minSize <= h->size and h->size <= desiredSize); if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Remapped heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map)]\n", (uintptr_t)origStart, uintmaxToCommaString(origSize), uintmaxToCommaString(origWithMapsSize - origSize)); fprintf (stderr, "[GC:\tto heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map).]\n", (uintptr_t)(h->start), uintmaxToCommaString(h->size), uintmaxToCommaString(h->withMapsSize - h->size)); } lowSize = newSize + s->sysvals.pageSize; newSize = align((factor-1) * (highSize / factor) + (lowSize / factor), s->sysvals.pageSize); result = TRUE; } else { size_t prevSize = newSize; size_t prevWithMapsSize = newWithMapsSize; highSize = newSize - s->sysvals.pageSize; newSize = align((factor-1) * (highSize / factor) + (lowSize / factor), s->sysvals.pageSize); if (s->controls.messages) { fprintf (stderr, "[GC: Remapping heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map)]\n", (uintptr_t)(h->start), uintmaxToCommaString (h->size), uintmaxToCommaString (h->withMapsSize - h->size)); fprintf (stderr, "[GC:\tto heap of size %s bytes (+ %s bytes card/cross map) cannot be satisfied,]\n", uintmaxToCommaString (prevSize), uintmaxToCommaString (prevWithMapsSize - prevSize)); if (result) { fprintf (stderr, "[GC:\tbacking off by %s bytes.]\n", uintmaxToCommaString (prevSize - newSize)); } else { fprintf (stderr, "[GC:\tbacking off by %s bytes with minimum size of %s bytes.]\n", uintmaxToCommaString (prevSize - newSize), uintmaxToCommaString (minSize)); } } } } return result; } enum { COPY_CHUNK_SIZE = 0x2000000, /* 32M */ }; /* growHeap (s, desiredSize, minSize) */ void growHeap (GC_state s, size_t desiredSize, size_t minSize) { GC_heap curHeapp; struct GC_heap newHeap; GC_heap newHeapp; bool useCurrent; pointer origStart; size_t liveSize; assert (isAligned (desiredSize, s->sysvals.pageSize)); assert (isAligned (minSize, s->sysvals.pageSize)); assert (desiredSize >= s->heap.size); if (DEBUG_RESIZING or s->controls.messages) { fprintf (stderr, "[GC: Growing heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map),]\n", (uintptr_t)s->heap.start, uintmaxToCommaString(s->heap.size), uintmaxToCommaString(s->heap.withMapsSize - s->heap.size)); fprintf (stderr, "[GC:\tto desired size of %s bytes (+ %s bytes card/cross map)]\n", uintmaxToCommaString(desiredSize), uintmaxToCommaString(sizeofCardMapAndCrossMap (s, desiredSize))); fprintf (stderr, "[GC:\tand minimum size of %s bytes (+ %s bytes card/cross map).]\n", uintmaxToCommaString(minSize), uintmaxToCommaString(sizeofCardMapAndCrossMap (s, minSize))); } if (minSize <= s->heap.size) { useCurrent = TRUE; /* Demand proper growth from remapHeap and/or createHeap. */ minSize = s->heap.size + s->sysvals.pageSize; } else { useCurrent = FALSE; } curHeapp = &s->heap; newHeapp = &newHeap; origStart = curHeapp->start; liveSize = curHeapp->oldGenSize; assert (liveSize <= curHeapp->size); if (remapHeap (s, curHeapp, desiredSize, minSize)) { goto done; } if (!useCurrent) shrinkHeap (s, curHeapp, liveSize); initHeap (s, newHeapp); /* Allocate a space of the desired size. */ if (minSize + sizeofCardMapAndCrossMap (s, minSize) <= SIZE_MAX - curHeapp->withMapsSize and createHeap (s, newHeapp, desiredSize, minSize)) { pointer from; pointer to; size_t remaining; from = curHeapp->start + liveSize; to = newHeapp->start + liveSize; remaining = liveSize; shrinkHeap (s, curHeapp, remaining); copy: assert (remaining == (size_t)(from - curHeapp->start) and from >= curHeapp->start and to >= newHeapp->start); if (remaining < COPY_CHUNK_SIZE) { GC_memcpy (curHeapp->start, newHeapp->start, remaining); releaseHeap (s, curHeapp); } else { remaining -= COPY_CHUNK_SIZE; from -= COPY_CHUNK_SIZE; to -= COPY_CHUNK_SIZE; GC_memcpy (from, to, COPY_CHUNK_SIZE); shrinkHeap (s, curHeapp, remaining); goto copy; } newHeapp->oldGenSize = liveSize; *curHeapp = *newHeapp; } else if (useCurrent) { if (DEBUG_RESIZING or s->controls.messages) { fprintf (stderr, "[GC: Using heap at "FMTPTR" of size %s bytes (+ %s bytes card/cross map).]\n", (uintptr_t)s->heap.start, uintmaxToCommaString(s->heap.size), uintmaxToCommaString(s->heap.withMapsSize - s->heap.size)); } } else if (s->controls.mayPageHeap) { /* Page the heap to disk and try again. */ void *data; if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Writing heap at "FMTPTR" of size %s bytes to disk.]\n", (uintptr_t)curHeapp->start, uintmaxToCommaString(liveSize)); } data = GC_diskBack_write (curHeapp->start, liveSize); releaseHeap (s, curHeapp); if (createHeap (s, curHeapp, desiredSize, minSize)) { if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Reading heap to "FMTPTR" of size %s bytes from disk.]\n", (uintptr_t)(curHeapp->start), uintmaxToCommaString(liveSize)); } GC_diskBack_read (data, curHeapp->start, liveSize); GC_diskBack_close (data); curHeapp->oldGenSize = liveSize; } else { GC_diskBack_close (data); goto oom; } } else { goto oom; } done: unless (origStart == s->heap.start) { translateHeap (s, origStart, s->heap.start, s->heap.oldGenSize); } return; oom: if (s->controls.messages) GC_displayMem (); die ("Out of memory. Unable to allocate heap with %s bytes.\n", uintmaxToCommaString(minSize)); } /* resizeHeap (s, minSize) */ void resizeHeap (GC_state s, size_t minSize) { size_t desiredSize; if (DEBUG_RESIZING) fprintf (stderr, "resizeHeap minSize = %s size = %s\n", uintmaxToCommaString(minSize), uintmaxToCommaString(s->heap.size)); desiredSize = sizeofHeapDesired (s, minSize, s->heap.size); assert (isAligned (desiredSize, s->sysvals.pageSize)); assert (minSize <= desiredSize); minSize = align (minSize, s->sysvals.pageSize); if (desiredSize <= s->heap.size) { shrinkHeap (s, &s->heap, desiredSize); } else { releaseHeap (s, &s->secondaryHeap); growHeap (s, desiredSize, minSize); } assert (s->heap.size >= minSize); } /* resizeHeapSecondary (s) */ void resizeHeapSecondary (GC_state s) { size_t primarySize, primaryWithMapsSize; size_t secondarySize, secondaryWithMapsSize; primarySize = s->heap.size; primaryWithMapsSize = s->heap.withMapsSize; secondarySize = s->secondaryHeap.size; secondaryWithMapsSize = s->secondaryHeap.withMapsSize; if (DEBUG_RESIZING) fprintf (stderr, "secondaryHeapResize\n"); if (0 == secondarySize) return; if (2 * primaryWithMapsSize > s->sysvals.ram) /* Holding on to secondaryHeap might cause paging. So don't. */ releaseHeap (s, &s->secondaryHeap); else if (secondarySize < primarySize) { unless (remapHeap (s, &s->secondaryHeap, primarySize, primarySize)) releaseHeap (s, &s->secondaryHeap); } else if (secondarySize > primarySize) shrinkHeap (s, &s->secondaryHeap, primarySize); assert (0 == s->secondaryHeap.size or s->heap.size == s->secondaryHeap.size); } mlton-20100608/runtime/gc/heap.h0000644000076600000240000000526411404435622014731 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * All ML objects (including ML execution stacks) are allocated in a * contiguous heap. The heap has the following general layout: * * ------------------------------------------------------------------------- * | old generation | | nursery | cardMap | crossMap | * ------------------------------------------------------------------------- * |------oldGenSize------| * |-----------------------size-----------------------| * ^ ^ * start nursery * |------------------------------withMapsSize-----------------------------| */ typedef struct GC_heap { pointer nursery; /* start of nursery */ size_t oldGenSize; /* size of old generation */ size_t size; /* size of heap */ pointer start; /* start of heap (and old generation) */ size_t withMapsSize; /* size of heap with card/cross maps */ } *GC_heap; #define GC_HEAP_LIMIT_SLOP 512 #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool isPointerInHeap (GC_state s, pointer p); static inline bool isPointerInOldGen (GC_state s, pointer p); static inline bool isPointerInNursery (GC_state s, pointer p); static inline bool isPointerInFromSpace (GC_state s, pointer p); static inline bool isObjptrInHeap (GC_state s, objptr op); static inline bool isObjptrInOldGen (GC_state s, objptr op); static inline bool isObjptrInNursery (GC_state s, objptr op); static inline bool isObjptrInFromSpace (GC_state s, objptr op); static inline bool hasHeapBytesFree (GC_state s, size_t oldGen, size_t nursery); static inline bool isHeapInit (GC_heap h); static void displayHeap (GC_state s, GC_heap heap, FILE *stream); static inline void initHeap (GC_state s, GC_heap h); static inline size_t sizeofHeapDesired (GC_state s, size_t live, size_t currentSize); static inline void releaseHeap (GC_state s, GC_heap h); static void shrinkHeap (GC_state s, GC_heap h, size_t keepSize); static bool createHeap (GC_state s, GC_heap h, size_t desiredSize, size_t minSize); static bool createHeapSecondary (GC_state s, size_t desiredSize); static bool remapHeap (GC_state s, GC_heap h, size_t desiredSize, size_t minSize); static void growHeap (GC_state s, size_t desiredSize, size_t minSize); static void resizeHeap (GC_state s, size_t minSize); static void resizeHeapSecondary (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/heap_predicates.c0000644000076600000240000000401711404435622017122 0ustar mtfstaff/* Copyright (C) 2005-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ bool isPointerInHeap (GC_state s, pointer p) { return (not (isPointer (p)) or (s->heap.start <= p and p < s->frontier)); } bool isPointerInOldGen (GC_state s, pointer p) { return (not (isPointer (p)) or (s->heap.start <= p and p < s->heap.start + s->heap.oldGenSize)); } bool isPointerInNursery (GC_state s, pointer p) { return (not (isPointer (p)) or (s->heap.nursery <= p and p < s->frontier)); } bool isPointerInFromSpace (GC_state s, pointer p) { return (isPointerInOldGen (s, p) or isPointerInNursery (s, p)); } bool isObjptrInHeap (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInHeap (s, p); } bool isObjptrInOldGen (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInOldGen (s, p); } bool isObjptrInNursery (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInNursery (s, p); } bool isObjptrInFromSpace (GC_state s, objptr op) { return (isObjptrInOldGen (s, op) or isObjptrInNursery (s, op)); } bool hasHeapBytesFree (GC_state s, size_t oldGen, size_t nursery) { size_t total; bool res; total = s->heap.oldGenSize + oldGen + (s->canMinor ? 2 : 1) * (s->limitPlusSlop - s->heap.nursery); res = (total <= s->heap.size) and (nursery <= (size_t)(s->limitPlusSlop - s->frontier)); if (DEBUG_DETAILED) fprintf (stderr, "%s = hasBytesFree (%s, %s)\n", boolToString (res), uintmaxToCommaString(oldGen), uintmaxToCommaString(nursery)); return res; } bool isHeapInit (GC_heap h) { return (0 == h->size); } mlton-20100608/runtime/gc/init-world.c0000644000076600000240000001230211404435622016066 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Initialization */ /* ---------------------------------------------------------------- */ size_t sizeofIntInfFromString (GC_state s, const char *str) { size_t slen = strlen (str); /* A slight overestimate. */ double bytesPerChar = 0.415241011861 /* = ((log(10.0) / log(2.0)) / 8.0) */ ; double bytes = ceil((double)slen * bytesPerChar); return align (GC_ARRAY_HEADER_SIZE + sizeof(mp_limb_t) // for the sign + align((size_t)bytes, sizeof(mp_limb_t)), s->alignment); } size_t sizeofInitialBytesLive (GC_state s) { uint32_t i; size_t dataBytes; size_t total; total = 0; for (i = 0; i < s->intInfInitsLength; ++i) { total += sizeofIntInfFromString (s, s->intInfInits[i].mlstr); } for (i = 0; i < s->vectorInitsLength; ++i) { dataBytes = s->vectorInits[i].bytesPerElement * s->vectorInits[i].numElements; total += align (GC_ARRAY_HEADER_SIZE + ((dataBytes < OBJPTR_SIZE) ? OBJPTR_SIZE : dataBytes), s->alignment); } return total; } void initIntInfs (GC_state s) { struct GC_intInfInit *inits; uint32_t i; const char *str; size_t bytes; bool neg; __mpz_struct resmpz; int ans; assert (isFrontierAligned (s, s->frontier)); for (i = 0; i < s->intInfInitsLength; i++) { inits = &(s->intInfInits[i]); assert (inits->globalIndex < s->globalsLength); str = inits->mlstr; bytes = sizeofIntInfFromString (s, str); neg = *str == '~'; if (neg) str++; initIntInfRes (s, &resmpz, bytes); ans = mpz_set_str (&resmpz, str, 10); assert (ans == 0); if (neg) resmpz._mp_size = - resmpz._mp_size; s->globals[inits->globalIndex] = finiIntInfRes (s, &resmpz, bytes); } assert (isFrontierAligned (s, s->frontier)); } void initVectors (GC_state s) { struct GC_vectorInit *inits; pointer frontier; uint32_t i; assert (isFrontierAligned (s, s->frontier)); inits = s->vectorInits; frontier = s->frontier; for (i = 0; i < s->vectorInitsLength; i++) { size_t bytesPerElement; size_t dataBytes; size_t objectSize; uint32_t typeIndex; bytesPerElement = inits[i].bytesPerElement; dataBytes = bytesPerElement * inits[i].numElements; objectSize = align (GC_ARRAY_HEADER_SIZE + ((dataBytes < OBJPTR_SIZE) ? OBJPTR_SIZE : dataBytes), s->alignment); assert (objectSize <= (size_t)(s->heap.start + s->heap.size - frontier)); *((GC_arrayCounter*)(frontier)) = 0; frontier = frontier + GC_ARRAY_COUNTER_SIZE; *((GC_arrayLength*)(frontier)) = inits[i].numElements; frontier = frontier + GC_ARRAY_LENGTH_SIZE; switch (bytesPerElement) { case 1: typeIndex = WORD8_VECTOR_TYPE_INDEX; break; case 2: typeIndex = WORD16_VECTOR_TYPE_INDEX; break; case 4: typeIndex = WORD32_VECTOR_TYPE_INDEX; break; case 8: typeIndex = WORD64_VECTOR_TYPE_INDEX; break; default: die ("unknown bytes per element in vectorInit: %"PRIuMAX"", (uintmax_t)bytesPerElement); } *((GC_header*)(frontier)) = buildHeaderFromTypeIndex (typeIndex); frontier = frontier + GC_HEADER_SIZE; s->globals[inits[i].globalIndex] = pointerToObjptr(frontier, s->heap.start); if (DEBUG_DETAILED) fprintf (stderr, "allocated vector at "FMTPTR"\n", (uintptr_t)(s->globals[inits[i].globalIndex])); memcpy (frontier, inits[i].bytes, dataBytes); frontier += objectSize - GC_ARRAY_HEADER_SIZE; } if (DEBUG_DETAILED) fprintf (stderr, "frontier after string allocation is "FMTPTR"\n", (uintptr_t)frontier); GC_profileAllocInc (s, (size_t)(frontier - s->frontier)); s->cumulativeStatistics.bytesAllocated += (size_t)(frontier - s->frontier); assert (isFrontierAligned (s, frontier)); s->frontier = frontier; } void initWorld (GC_state s) { uint32_t i; pointer start; GC_thread thread; for (i = 0; i < s->globalsLength; ++i) s->globals[i] = BOGUS_OBJPTR; s->lastMajorStatistics.bytesLive = sizeofInitialBytesLive (s); createHeap (s, &s->heap, sizeofHeapDesired (s, s->lastMajorStatistics.bytesLive, 0), s->lastMajorStatistics.bytesLive); setCardMapAndCrossMap (s); start = alignFrontier (s, s->heap.start); s->frontier = start; s->limitPlusSlop = s->heap.start + s->heap.size; s->limit = s->limitPlusSlop - GC_HEAP_LIMIT_SLOP; initIntInfs (s); initVectors (s); assert ((size_t)(s->frontier - start) <= s->lastMajorStatistics.bytesLive); s->heap.oldGenSize = s->frontier - s->heap.start; setGCStateCurrentHeap (s, 0, 0); thread = newThread (s, sizeofStackInitialReserved (s)); switchToThread (s, pointerToObjptr((pointer)thread - offsetofThread (s), s->heap.start)); } mlton-20100608/runtime/gc/init-world.h0000644000076600000240000000245511404435622016103 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* GC_init uses the array of struct intInfInits in s at program start * to allocate intInfs. * The globalIndex'th entry of the globals array in s is set to the * IntInf.int whose value corresponds to the mlstr string. * * The strings pointed to by the mlstr fields consist of * an optional ~ * one of [1-9] * zero or more of [0-9] * a trailing EOS */ struct GC_intInfInit { uint32_t globalIndex; const char *mlstr; }; /* GC_init allocates a collection of arrays/vectors in the heap. */ struct GC_vectorInit { pointer bytes; size_t bytesPerElement; uint32_t globalIndex; GC_arrayLength numElements; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline size_t sizeofIntInfFromString (GC_state s, const char *str); static inline size_t sizeofInitialBytesLive (GC_state s); static void initIntInfs (GC_state s); static void initVectors (GC_state s); static void initWorld (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/init.c0000644000076600000240000003711411404435622014751 0ustar mtfstaff/* Copyright (C) 2009 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Initialization */ /* ---------------------------------------------------------------- */ static bool stringToBool (char *s) { if (0 == strcmp (s, "false")) return FALSE; if (0 == strcmp (s, "true")) return TRUE; die ("Invalid @MLton bool: %s.", s); } // From gdtoa/gdtoa.h. // Can't include the whole thing because it brings in too much junk. float gdtoa__strtof (const char *, char **); static float stringToFloat (char *s) { char *endptr; float f; f = gdtoa__strtof (s, &endptr); if (s == endptr) die ("Invalid @MLton float: %s.", s); return f; } static size_t stringToBytes (char *s) { double d; char *endptr; size_t factor; d = strtod (s, &endptr); if (s == endptr) goto bad; switch (*endptr++) { case 'g': case 'G': factor = 1024 * 1024 * 1024; break; case 'k': case 'K': factor = 1024; break; case 'm': case 'M': factor = 1024 * 1024; break; default: goto bad; } d *= factor; unless (*endptr == '\0' and 0.0 <= d and d <= (double)SIZE_MAX) goto bad; return (size_t)d; bad: die ("Invalid @MLton memory amount: %s.", s); } /* ---------------------------------------------------------------- */ /* GC_init */ /* ---------------------------------------------------------------- */ int processAtMLton (GC_state s, int argc, char **argv, char **worldFile) { int i; i = 1; while (s->controls.mayProcessAtMLton and i < argc and (0 == strcmp (argv [i], "@MLton"))) { bool done; i++; done = FALSE; while (!done) { if (i == argc) die ("Missing -- at end of @MLton args."); else { char *arg; arg = argv[i]; if (0 == strcmp (arg, "copy-generational-ratio")) { i++; if (i == argc) die ("@MLton copy-generational-ratio missing argument."); s->controls.ratios.copyGenerational = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.copyGenerational) die ("@MLton copy-generational-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "copy-ratio")) { i++; if (i == argc) die ("@MLton copy-ratio missing argument."); s->controls.ratios.copy = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.copy) die ("@MLton copy-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "fixed-heap")) { i++; if (i == argc) die ("@MLton fixed-heap missing argument."); s->controls.fixedHeap = align (stringToBytes (argv[i++]), 2 * s->sysvals.pageSize); } else if (0 == strcmp (arg, "gc-messages")) { i++; s->controls.messages = TRUE; } else if (0 == strcmp (arg, "gc-summary")) { i++; s->controls.summary = TRUE; } else if (0 == strcmp (arg, "grow-ratio")) { i++; if (i == argc) die ("@MLton grow-ratio missing argument."); s->controls.ratios.grow = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.grow) die ("@MLton grow-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "hash-cons")) { i++; if (i == argc) die ("@MLton hash-cons missing argument."); s->controls.ratios.hashCons = stringToFloat (argv[i++]); unless (0.0 <= s->controls.ratios.hashCons and s->controls.ratios.hashCons <= 1.0) die ("@MLton hash-cons argument must be between 0.0 and 1.0."); } else if (0 == strcmp (arg, "live-ratio")) { i++; if (i == argc) die ("@MLton live-ratio missing argument."); s->controls.ratios.live = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.live) die ("@MLton live-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "load-world")) { unless (s->controls.mayLoadWorld) die ("May not load world."); i++; s->amOriginal = FALSE; if (i == argc) die ("@MLton load-world missing argument."); *worldFile = argv[i++]; } else if (0 == strcmp (arg, "mark-compact-generational-ratio")) { i++; if (i == argc) die ("@MLton mark-compact-generational-ratio missing argument."); s->controls.ratios.markCompactGenerational = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.markCompactGenerational) die ("@MLton mark-compact-generational-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "mark-compact-ratio")) { i++; if (i == argc) die ("@MLton mark-compact-ratio missing argument."); s->controls.ratios.markCompact = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.markCompact) die ("@MLton mark-compact-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "max-heap")) { i++; if (i == argc) die ("@MLton max-heap missing argument."); s->controls.maxHeap = align (stringToBytes (argv[i++]), 2 * s->sysvals.pageSize); } else if (0 == strcmp (arg, "may-page-heap")) { i++; if (i == argc) die ("@MLton may-page-heap missing argument."); s->controls.mayPageHeap = stringToBool (argv[i++]); } else if (0 == strcmp (arg, "no-load-world")) { i++; s->controls.mayLoadWorld = FALSE; } else if (0 == strcmp (arg, "nursery-ratio")) { i++; if (i == argc) die ("@MLton nursery-ratio missing argument."); s->controls.ratios.nursery = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.nursery) die ("@MLton nursery-ratio argument must be greater than 1.0."); } else if (0 == strcmp (arg, "ram-slop")) { i++; if (i == argc) die ("@MLton ram-slop missing argument."); s->controls.ratios.ramSlop = stringToFloat (argv[i++]); } else if (0 == strcmp (arg, "show-sources")) { showSources (s); exit (0); } else if (0 == strcmp (arg, "stop")) { i++; s->controls.mayProcessAtMLton = FALSE; } else if (0 == strcmp (arg, "stack-current-grow-ratio")) { i++; if (i == argc) die ("@MLton stack-current-grow-ratio missing argument."); s->controls.ratios.stackCurrentGrow = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.stackCurrentGrow) die ("@MLton stack-current-grow-ratio argument must greater than 1.0."); } else if (0 == strcmp (arg, "stack-current-max-reserved-ratio")) { i++; if (i == argc) die ("@MLton stack-current-max-reserved-ratio missing argument."); s->controls.ratios.stackCurrentMaxReserved = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.stackCurrentMaxReserved) die ("@MLton stack-current-max-reserved-ratio argument must greater than 1.0."); } else if (0 == strcmp (arg, "stack-current-permit-reserved-ratio")) { i++; if (i == argc) die ("@MLton stack-current-permit-reserved-ratio missing argument."); s->controls.ratios.stackCurrentPermitReserved = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.stackCurrentPermitReserved) die ("@MLton stack-current-permit-reserved-ratio argument must greater than 1.0."); } else if (0 == strcmp (arg, "stack-current-shrink-ratio")) { i++; if (i == argc) die ("@MLton stack-current-shrink-ratio missing argument."); s->controls.ratios.stackCurrentShrink = stringToFloat (argv[i++]); unless (0.0 <= s->controls.ratios.stackCurrentShrink and s->controls.ratios.stackCurrentShrink <= 1.0) die ("@MLton stack-current-shrink-ratio argument must be between 0.0 and 1.0."); } else if (0 == strcmp (arg, "stack-max-reserved-ratio")) { i++; if (i == argc) die ("@MLton stack-max-reserved-ratio missing argument."); s->controls.ratios.stackMaxReserved = stringToFloat (argv[i++]); unless (1.0 < s->controls.ratios.stackMaxReserved) die ("@MLton stack-max-reserved-ratio argument must greater than 1.0."); } else if (0 == strcmp (arg, "stack-shrink-ratio")) { i++; if (i == argc) die ("@MLton stack-shrink-ratio missing argument."); s->controls.ratios.stackShrink = stringToFloat (argv[i++]); unless (0.0 <= s->controls.ratios.stackShrink and s->controls.ratios.stackShrink <= 1.0) die ("@MLton stack-shrink-ratio argument must be between 0.0 and 1.0."); } else if (0 == strcmp (arg, "use-mmap")) { i++; if (i == argc) die ("@MLton use-mmap missing argument."); GC_setCygwinUseMmap (stringToBool (argv[i++])); } else if (0 == strcmp (arg, "--")) { i++; done = TRUE; } else if (i > 1) die ("Strange @MLton arg: %s", argv[i]); else done = TRUE; } } } return i; } int GC_init (GC_state s, int argc, char **argv) { char *worldFile; int res; assert (s->alignment >= GC_MODEL_MINALIGN); assert (isAligned (sizeof (struct GC_stack), s->alignment)); // While the following asserts are manifestly true, // they check the asserts in sizeofThread and sizeofWeak. assert (sizeofThread (s) == sizeofThread (s)); assert (sizeofWeak (s) == sizeofWeak (s)); s->amInGC = TRUE; s->amOriginal = TRUE; s->atomicState = 0; s->callFromCHandlerThread = BOGUS_OBJPTR; s->controls.fixedHeap = 0; s->controls.maxHeap = 0; s->controls.mayLoadWorld = TRUE; s->controls.mayPageHeap = FALSE; s->controls.mayProcessAtMLton = TRUE; s->controls.messages = FALSE; s->controls.oldGenArraySize = 0x100000; s->controls.ratios.copy = 4.0; s->controls.ratios.copyGenerational = 4.0; s->controls.ratios.grow = 8.0; s->controls.ratios.hashCons = 0.0; s->controls.ratios.live = 8.0; s->controls.ratios.markCompact = 1.04; s->controls.ratios.markCompactGenerational = 8.0; s->controls.ratios.nursery = 10.0; s->controls.ratios.ramSlop = 0.5; s->controls.ratios.stackCurrentGrow = 2.0; s->controls.ratios.stackCurrentMaxReserved = 32.0; s->controls.ratios.stackCurrentPermitReserved = 4.0; s->controls.ratios.stackCurrentShrink = 0.5; s->controls.ratios.stackMaxReserved = 8.0; s->controls.ratios.stackShrink = 0.5; s->controls.summary = FALSE; s->cumulativeStatistics.bytesAllocated = 0; s->cumulativeStatistics.bytesCopied = 0; s->cumulativeStatistics.bytesCopiedMinor = 0; s->cumulativeStatistics.bytesHashConsed = 0; s->cumulativeStatistics.bytesMarkCompacted = 0; s->cumulativeStatistics.bytesScannedMinor = 0; s->cumulativeStatistics.maxBytesLive = 0; s->cumulativeStatistics.maxHeapSize = 0; s->cumulativeStatistics.maxPauseTime = 0; s->cumulativeStatistics.maxStackSize = 0; s->cumulativeStatistics.numCardsMarked = 0; s->cumulativeStatistics.numCopyingGCs = 0; s->cumulativeStatistics.numHashConsGCs = 0; s->cumulativeStatistics.numMarkCompactGCs = 0; s->cumulativeStatistics.numMinorGCs = 0; rusageZero (&s->cumulativeStatistics.ru_gc); rusageZero (&s->cumulativeStatistics.ru_gcCopying); rusageZero (&s->cumulativeStatistics.ru_gcMarkCompact); rusageZero (&s->cumulativeStatistics.ru_gcMinor); s->currentThread = BOGUS_OBJPTR; s->hashConsDuringGC = FALSE; initHeap (s, &s->heap); s->lastMajorStatistics.bytesHashConsed = 0; s->lastMajorStatistics.bytesLive = 0; s->lastMajorStatistics.kind = GC_COPYING; s->lastMajorStatistics.numMinorGCs = 0; s->savedThread = BOGUS_OBJPTR; initHeap (s, &s->secondaryHeap); s->signalHandlerThread = BOGUS_OBJPTR; s->signalsInfo.amInSignalHandler = FALSE; s->signalsInfo.gcSignalHandled = FALSE; s->signalsInfo.gcSignalPending = FALSE; s->signalsInfo.signalIsPending = FALSE; sigemptyset (&s->signalsInfo.signalsHandled); sigemptyset (&s->signalsInfo.signalsPending); s->sysvals.pageSize = GC_pageSize (); s->sysvals.physMem = GC_physMem (); s->weaks = NULL; s->saveWorldStatus = true; initIntInf (s); initSignalStack (s); worldFile = NULL; unless (isAligned (s->sysvals.pageSize, CARD_SIZE)) die ("Page size must be a multiple of card size."); processAtMLton (s, s->atMLtonsLength, s->atMLtons, &worldFile); res = processAtMLton (s, argc, argv, &worldFile); if (s->controls.fixedHeap > 0 and s->controls.maxHeap > 0) die ("Cannot use both fixed-heap and max-heap."); unless (s->controls.ratios.markCompact <= s->controls.ratios.copy and s->controls.ratios.copy <= s->controls.ratios.live) die ("Ratios must satisfy mark-compact-ratio <= copy-ratio <= live-ratio."); unless (s->controls.ratios.stackCurrentPermitReserved <= s->controls.ratios.stackCurrentMaxReserved) die ("Ratios must satisfy stack-current-permit-reserved <= stack-current-max-reserved."); /* We align s->sysvals.ram by s->sysvals.pageSize so that we can * test whether or not we we are using mark-compact by comparing * heap size to ram size. If we didn't round, the size might be * slightly off. */ uintmax_t ram; ram = alignMax ((uintmax_t)(s->controls.ratios.ramSlop * (double)(s->sysvals.physMem)), (uintmax_t)(s->sysvals.pageSize)); ram = min (ram, alignMaxDown((uintmax_t)SIZE_MAX, (uintmax_t)(s->sysvals.pageSize))); s->sysvals.ram = (size_t)ram; if (DEBUG or DEBUG_RESIZING or s->controls.messages) fprintf (stderr, "[GC: Found %s bytes of RAM; using %s bytes (%.1f%% of RAM).]\n", uintmaxToCommaString(s->sysvals.physMem), uintmaxToCommaString(s->sysvals.ram), 100.0 * ((double)ram / (double)(s->sysvals.physMem))); if (DEBUG_SOURCES or DEBUG_PROFILE) { uint32_t i; for (i = 0; i < s->sourceMaps.frameSourcesLength; i++) { uint32_t j; uint32_t *sourceSeq; fprintf (stderr, "%"PRIu32"\n", i); sourceSeq = s->sourceMaps.sourceSeqs[s->sourceMaps.frameSources[i]]; for (j = 1; j <= sourceSeq[0]; j++) fprintf (stderr, "\t%s\n", s->sourceMaps.sourceNames[ s->sourceMaps.sources[sourceSeq[j]].sourceNameIndex ]); } } /* Initialize profiling. This must occur after processing * command-line arguments, because those may just be doing a * show-sources, in which case we don't want to initialize the * atExit. */ initProfiling (s); if (s->amOriginal) { initWorld (s); /* The mutator stack invariant doesn't hold, * because the mutator has yet to run. */ assert (invariantForMutator (s, TRUE, FALSE)); } else { loadWorldFromFileName (s, worldFile); if (s->profiling.isOn and s->profiling.stack) foreachStackFrame (s, enterFrameForProfiling); assert (invariantForMutator (s, TRUE, TRUE)); } s->amInGC = FALSE; return res; } mlton-20100608/runtime/gc/init.h0000644000076600000240000000077411404435622014760 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static int processAtMLton (GC_state s, int argc, char **argv, char **worldFile); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ PRIVATE int GC_init (GC_state s, int argc, char **argv); mlton-20100608/runtime/gc/int-inf.c0000644000076600000240000003334611404435622015355 0ustar mtfstaff/* Copyright (C) 1999-2005, 2007-2008 Henry Cejtin, Matthew Fluet, * Suresh Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* * Test if a intInf is a fixnum. */ static inline bool isSmall (objptr arg) { return (arg & 1); } static inline bool isEitherSmall (objptr arg1, objptr arg2) { return ((arg1 | arg2) & (objptr)1); } static inline bool areSmall (objptr arg1, objptr arg2) { return ((arg1 & arg2) & (objptr)1); } /* * Convert a bignum intInf to a bignum pointer. */ static inline GC_intInf toBignum (GC_state s, objptr arg) { GC_intInf bp; assert (not isSmall(arg)); bp = (GC_intInf)(objptrToPointer(arg, s->heap.start) - offsetof(struct GC_intInf, obj.body.isneg)); if (DEBUG_INT_INF) fprintf (stderr, "bp->header = "FMTHDR"\n", bp->header); assert (bp->header == GC_INTINF_HEADER); return bp; } /* * Given an intInf, a pointer to an __mpz_struct and space large * enough to contain LIMBS_PER_OBJPTR + 1 limbs, fill in the * __mpz_struct. */ void fillIntInfArg (GC_state s, objptr arg, __mpz_struct *res, mp_limb_t space[LIMBS_PER_OBJPTR + 1]) { GC_intInf bp; if (DEBUG_INT_INF) fprintf (stderr, "fillIntInfArg ("FMTOBJPTR", "FMTPTR", "FMTPTR")\n", arg, (uintptr_t)res, (uintptr_t)space); if (isSmall(arg)) { res->_mp_alloc = LIMBS_PER_OBJPTR + 1; res->_mp_d = space; if (arg == (objptr)1) { res->_mp_size = 0; } else { const objptr highBitMask = (objptr)1 << (CHAR_BIT * OBJPTR_SIZE - 1); bool neg = (arg & highBitMask) != (objptr)0; if (neg) { res->_mp_size = - LIMBS_PER_OBJPTR; arg = -((arg >> 1) | highBitMask); } else { res->_mp_size = LIMBS_PER_OBJPTR; arg = (arg >> 1); } for (int i = 0; i < LIMBS_PER_OBJPTR; i++) { space[i] = (mp_limb_t)arg; // The conditional below is to quell a gcc warning: // right shift count >= width of type // When 1 == LIMBS_PER_OBJPTR, the for loop will not continue, // so the shift doesn't matter. arg = arg >> (1 == LIMBS_PER_OBJPTR ? 0 : CHAR_BIT * sizeof(mp_limb_t)); } } } else { bp = toBignum (s, arg); /* The _mp_alloc field is declared as int. * No possibility of an overflowing assignment, as all *huge* * intInfs must have come from some previous GnuMP evaluation. */ res->_mp_alloc = (int)(bp->length - 1); res->_mp_d = (mp_limb_t*)(bp->obj.body.limbs); res->_mp_size = bp->obj.body.isneg ? - res->_mp_alloc : res->_mp_alloc; } assert ((res->_mp_size == 0) or (res->_mp_d[(res->_mp_size < 0 ? - res->_mp_size : res->_mp_size) - 1] != 0)); if (DEBUG_INT_INF_DETAILED) fprintf (stderr, "arg --> %s\n", mpz_get_str (NULL, 10, res)); } /* * Initialize an __mpz_struct to use the space provided by the heap. */ void initIntInfRes (GC_state s, __mpz_struct *res, __attribute__ ((unused)) size_t bytes) { GC_intInf bp; size_t nlimbs; assert (bytes <= (size_t)(s->limitPlusSlop - s->frontier)); bp = (GC_intInf)s->frontier; /* We have as much space for the limbs as there is to the end of the * heap. Divide by (sizeof(mp_limb_t)) to get number of limbs. */ nlimbs = ((size_t)(s->limitPlusSlop - (pointer)bp->obj.body.limbs)) / (sizeof(mp_limb_t)); /* The _mp_alloc field is declared as int. * Avoid an overflowing assignment, which could happen with huge * heaps. */ res->_mp_alloc = (int)(min(nlimbs,(size_t)INT_MAX)); res->_mp_d = (mp_limb_t*)(bp->obj.body.limbs); res->_mp_size = 0; /* is this necessary? */ } /* * Given an __mpz_struct pointer which reflects the answer, set * gcState.frontier and return the answer. * If the answer fits in a fixnum, we return that, with the frontier * rolled back. * If the answer doesn't need all of the space allocated, we adjust * the array size and roll the frontier slightly back. */ objptr finiIntInfRes (GC_state s, __mpz_struct *res, size_t bytes) { GC_intInf bp; int size; assert ((res->_mp_size == 0) or (res->_mp_d[(res->_mp_size < 0 ? - res->_mp_size : res->_mp_size) - 1] != 0)); if (DEBUG_INT_INF) fprintf (stderr, "finiIntInfRes ("FMTPTR", %"PRIuMAX")\n", (uintptr_t)res, (uintmax_t)bytes); if (DEBUG_INT_INF_DETAILED) fprintf (stderr, "res --> %s\n", mpz_get_str (NULL, 10, res)); bp = (GC_intInf)((pointer)res->_mp_d - offsetof(struct GC_intInf, obj.body.limbs)); assert (res->_mp_d == (mp_limb_t*)(bp->obj.body.limbs)); size = res->_mp_size; if (size < 0) { bp->obj.body.isneg = TRUE; size = - size; } else bp->obj.body.isneg = FALSE; assert (size >= 0); if (size <= 1) { uintmax_t val, ans; if (size == 0) val = 0; else val = bp->obj.body.limbs[0]; if (bp->obj.body.isneg) { /* * We only fit if val in [1, 2^(CHAR_BIT * OBJPTR_SIZE - 2)]. */ ans = - val; val = val - 1; } else /* * We only fit if val in [0, 2^(CHAR_BIT * OBJPTR_SIZE - 2) - 1]. */ ans = val; if (val < (uintmax_t)1<<(CHAR_BIT * OBJPTR_SIZE - 2)) { return (objptr)(ans<<1 | 1); } } setFrontier (s, (pointer)(&bp->obj.body.limbs[size]), bytes); bp->counter = (GC_arrayCounter)0; bp->length = (GC_arrayLength)(size + 1); /* +1 for isneg field */ bp->header = GC_INTINF_HEADER; return pointerToObjptr ((pointer)&bp->obj, s->heap.start); } static inline objptr binary (objptr lhs, objptr rhs, size_t bytes, void(*binop)(__mpz_struct *resmpz, __gmp_const __mpz_struct *lhsspace, __gmp_const __mpz_struct *rhsspace)) { __mpz_struct lhsmpz, rhsmpz, resmpz; mp_limb_t lhsspace[LIMBS_PER_OBJPTR + 1], rhsspace[LIMBS_PER_OBJPTR + 1]; initIntInfRes (&gcState, &resmpz, bytes); fillIntInfArg (&gcState, lhs, &lhsmpz, lhsspace); fillIntInfArg (&gcState, rhs, &rhsmpz, rhsspace); binop (&resmpz, &lhsmpz, &rhsmpz); return finiIntInfRes (&gcState, &resmpz, bytes); } objptr IntInf_add (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_add ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_add); } objptr IntInf_andb (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_andb ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_and); } objptr IntInf_gcd (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_gcd ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_gcd); } objptr IntInf_mul (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_mul ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_mul); } objptr IntInf_quot (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_quot ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_tdiv_q); } objptr IntInf_orb (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_orb ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_ior); } objptr IntInf_rem (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_quot ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_tdiv_r); } objptr IntInf_sub (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_sub ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_sub); } objptr IntInf_xorb (objptr lhs, objptr rhs, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_xorb ("FMTOBJPTR", "FMTOBJPTR", %"PRIuMAX")\n", lhs, rhs, (uintmax_t)bytes); return binary (lhs, rhs, bytes, &mpz_xor); } static objptr unary (objptr arg, size_t bytes, void(*unop)(__mpz_struct *resmpz, __gmp_const __mpz_struct *argspace)) { __mpz_struct argmpz, resmpz; mp_limb_t argspace[LIMBS_PER_OBJPTR + 1]; initIntInfRes (&gcState, &resmpz, bytes); fillIntInfArg (&gcState, arg, &argmpz, argspace); unop (&resmpz, &argmpz); return finiIntInfRes (&gcState, &resmpz, bytes); } objptr IntInf_neg (objptr arg, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_neg ("FMTOBJPTR", %"PRIuMAX")\n", arg, (uintmax_t)bytes); return unary (arg, bytes, &mpz_neg); } objptr IntInf_notb (objptr arg, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_notb ("FMTOBJPTR", %"PRIuMAX")\n", arg, (uintmax_t)bytes); return unary (arg, bytes, &mpz_com); } static objptr shary (objptr arg, Word32_t shift, size_t bytes, void(*shop)(__mpz_struct *resmpz, __gmp_const __mpz_struct *argspace, unsigned long shift)) { __mpz_struct argmpz, resmpz; mp_limb_t argspace[LIMBS_PER_OBJPTR + 1]; initIntInfRes (&gcState, &resmpz, bytes); fillIntInfArg (&gcState, arg, &argmpz, argspace); shop (&resmpz, &argmpz, (unsigned long)shift); return finiIntInfRes (&gcState, &resmpz, bytes); } objptr IntInf_arshift (objptr arg, Word32_t shift, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_arshift ("FMTOBJPTR", %"PRIu32", %"PRIuMAX")\n", arg, shift, (uintmax_t)bytes); return shary (arg, shift, bytes, &mpz_fdiv_q_2exp); } objptr IntInf_lshift (objptr arg, Word32_t shift, size_t bytes) { if (DEBUG_INT_INF) fprintf (stderr, "IntInf_lshift ("FMTOBJPTR", %"PRIu32", %"PRIuMAX")\n", arg, shift, (uintmax_t)bytes); return shary(arg, shift, bytes, &mpz_mul_2exp); } /* * Return an integer which compares to 0 as the two intInf args compare * to each other. */ Int32_t IntInf_compare (objptr lhs, objptr rhs) { __mpz_struct lhsmpz, rhsmpz; mp_limb_t lhsspace[LIMBS_PER_OBJPTR + 1], rhsspace[LIMBS_PER_OBJPTR + 1]; int res; if (DEBUG_INT_INF) fprintf (stderr, "IntInf_compare ("FMTOBJPTR", "FMTOBJPTR")\n", lhs, rhs); fillIntInfArg (&gcState, lhs, &lhsmpz, lhsspace); fillIntInfArg (&gcState, rhs, &rhsmpz, rhsspace); res = mpz_cmp (&lhsmpz, &rhsmpz); if (res < 0) return -1; if (res > 0) return 1; return 0; } /* * Check if two IntInf.int's are equal. */ Bool_t IntInf_equal (objptr lhs, objptr rhs) { if (lhs == rhs) return TRUE; if (isEitherSmall (lhs, rhs)) return FALSE; else return 0 == IntInf_compare (lhs, rhs); } /* * Convert an intInf to a string. * Arg is an intInf, base is the base to use (2, 8, 10 or 16) and * space is a string (mutable) which is large enough. */ objptr IntInf_toString (objptr arg, int32_t base, size_t bytes) { GC_string8 sp; __mpz_struct argmpz; mp_limb_t argspace[LIMBS_PER_OBJPTR + 1]; char *str; size_t size; if (DEBUG_INT_INF) fprintf (stderr, "IntInf_toString ("FMTOBJPTR", %"PRId32", %"PRIuMAX")\n", arg, base, (uintmax_t)bytes); assert (base == 2 || base == 8 || base == 10 || base == 16); fillIntInfArg (&gcState, arg, &argmpz, argspace); sp = (GC_string8)gcState.frontier; str = mpz_get_str((void*)&sp->obj, base, &argmpz); assert (str == (char*)&sp->obj); size = strlen(str); if (sp->obj.body.chars[0] == '-') sp->obj.body.chars[0] = '~'; if (base > 0) for (unsigned int i = 0; i < size; i++) { char c = sp->obj.body.chars[i]; if (('a' <= c) && (c <= 'z')) sp->obj.body.chars[i] = (char)(c + ('A' - 'a')); } setFrontier (&gcState, (pointer)&sp->obj + size, bytes); sp->counter = 0; sp->length = size; sp->header = GC_STRING8_HEADER; return pointerToObjptr ((pointer)&sp->obj, gcState.heap.start); } /* static GC_state intInfMemoryFuncsState; static void * wrap_alloc_func(size_t size) { if (DEBUG_INT_INF) fprintf (stderr, "alloc_func (size = %"PRIuMAX") = ", (uintmax_t)size); void * res = (*alloc_func_ptr)(size); if (DEBUG_INT_INF) fprintf (stderr, FMTPTR"\n", (uintptr_t)res); return res; } static void * wrap_realloc_func(void *ptr, size_t old_size, size_t new_size) { if (DEBUG_INT_INF) fprintf (stderr, "realloc_func (ptr = "FMTPTR", " "old_size = %"PRIuMAX", new_size = %"PRIuMAX") = ", (uintptr_t)ptr, (uintmax_t)old_size, (uintmax_t)new_size); assert (! isPointerInHeap(intInfMemoryFuncsState, (pointer)ptr)); void * res = (*realloc_func_ptr)(ptr, old_size, new_size); if (DEBUG_INT_INF) fprintf (stderr, FMTPTR"\n", (uintptr_t)res); return res; } static void wrap_free_func(void *ptr, size_t size) { if (DEBUG_INT_INF) fprintf (stderr, "free_func (ptr = "FMTPTR", size = %"PRIuMAX")", (uintptr_t)ptr, (uintmax_t)size); assert (! isPointerInHeap(intInfMemoryFuncsState, (pointer)ptr)); (*free_func_ptr)(ptr, size); if (DEBUG_INT_INF) fprintf (stderr, "\n"); return; } void initIntInf (GC_state s) { intInfMemoryFuncsState = s; mp_get_memory_functions (&alloc_func_ptr, &realloc_func_ptr, &free_func_ptr); mp_set_memory_functions (&wrap_alloc_func, &wrap_realloc_func, &wrap_free_func); return; } */ void initIntInf (__attribute__ ((unused)) GC_state s) { return; } mlton-20100608/runtime/gc/int-inf.h0000644000076600000240000000674211404435622015362 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* Layout of intInfs. * Note, the value passed around is a pointer to the obj member. */ typedef struct GC_intInf { GC_arrayCounter counter; GC_arrayLength length; GC_header header; union { struct { mp_limb_t isneg; mp_limb_t limbs[1]; } body; pointerAux _p; /* alignment */ } obj; } __attribute__ ((packed)) *GC_intInf; COMPILE_TIME_ASSERT(GC_intInf__obj_packed, offsetof(struct GC_intInf, obj) == sizeof(GC_arrayCounter) + sizeof(GC_arrayLength) + sizeof(GC_header)); COMPILE_TIME_ASSERT(GC_intInf__obj_body_isneg_packed, offsetof(struct GC_intInf, obj.body.isneg) == offsetof(struct GC_intInf, obj)); COMPILE_TIME_ASSERT(GC_intInf__obj_body_limbs_packed, offsetof(struct GC_intInf, obj.body.limbs) == offsetof(struct GC_intInf, obj) + sizeof(mp_limb_t)); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) COMPILE_TIME_ASSERT(sizeof_mp_limb_t__is_four_or_eight, (sizeof(mp_limb_t) == 4 || sizeof(mp_limb_t) == 8)); #define GC_INTINF_HEADER ( \ CHAR_BIT * sizeof(mp_limb_t) == 32 ? \ GC_WORD32_VECTOR_HEADER : ( \ CHAR_BIT * sizeof(mp_limb_t) == 64 ? \ GC_WORD64_VECTOR_HEADER : ( 0 ) ) ) COMPILE_TIME_ASSERT(sizeof_mp_limb_t__compat__sizeof_objptr, (sizeof(mp_limb_t) >= sizeof(objptr)) || (sizeof(objptr) % sizeof(mp_limb_t) == 0)); #define LIMBS_PER_OBJPTR ( \ sizeof(mp_limb_t) >= sizeof(objptr) ? \ 1 : (int)(sizeof(objptr) / sizeof(mp_limb_t))) PRIVATE void initIntInf (GC_state s); static inline void fillIntInfArg (GC_state s, objptr arg, __mpz_struct *res, mp_limb_t space[LIMBS_PER_OBJPTR + 1]); static inline void initIntInfRes (GC_state s, __mpz_struct *res, size_t bytes); static inline objptr finiIntInfRes (GC_state s, __mpz_struct *res, size_t bytes); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE objptr IntInf_add (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_andb (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_gcd (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_mul (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_quot (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_orb (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_rem (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_sub (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_xorb (objptr lhs, objptr rhs, size_t bytes); PRIVATE objptr IntInf_neg (objptr arg, size_t bytes); PRIVATE objptr IntInf_notb (objptr arg, size_t bytes); PRIVATE objptr IntInf_arshift (objptr arg, Word32_t shift, size_t bytes); PRIVATE objptr IntInf_lshift (objptr arg, Word32_t shift, size_t bytes); PRIVATE Int32_t IntInf_compare (objptr lhs, objptr rhs); PRIVATE Bool_t IntInf_equal (objptr lhs, objptr rhs); PRIVATE objptr IntInf_toString (objptr arg, Int32_t base, size_t bytes); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/invariant.c0000644000076600000240000001053711404435622016001 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void assertIsObjptrInFromSpace (GC_state s, objptr *opp) { assert (isObjptrInFromSpace (s, *opp)); unless (isObjptrInFromSpace (s, *opp)) die ("gc.c: assertIsObjptrInFromSpace " "opp = "FMTPTR" " "*opp = "FMTOBJPTR"\n", (uintptr_t)opp, *opp); /* The following checks that intergenerational pointers have the * appropriate card marked. Unfortunately, it doesn't work because * for stacks, the card containing the beginning of the stack is * marked, but any remaining cards aren't. */ if (FALSE and s->mutatorMarksCards and isPointerInOldGen (s, (pointer)opp) and isObjptrInNursery (s, *opp) and not isCardMarked (s, (pointer)opp)) { displayGCState (s, stderr); die ("gc.c: intergenerational pointer from "FMTPTR" to "FMTOBJPTR" with unmarked card.\n", (uintptr_t)opp, *opp); } } #if ASSERT bool invariantForGC (GC_state s) { if (DEBUG) fprintf (stderr, "invariantForGC\n"); /* Frame layouts */ for (unsigned int i = 0; i < s->frameLayoutsLength; ++i) { GC_frameLayout layout; layout = &(s->frameLayouts[i]); if (layout->size > 0) { GC_frameOffsets offsets; assert (layout->size <= s->maxFrameSize); offsets = layout->offsets; } } /* Generational */ if (s->mutatorMarksCards) { assert (s->generationalMaps.cardMap == &(s->generationalMaps.cardMapAbsolute [pointerToCardMapIndexAbsolute(s->heap.start)])); assert (&(s->generationalMaps.cardMapAbsolute [pointerToCardMapIndexAbsolute(s->heap.start + s->heap.size - 1)]) < (s->generationalMaps.cardMap + (s->generationalMaps.cardMapLength * CARD_MAP_ELEM_SIZE))); } assert (isAligned (s->heap.size, s->sysvals.pageSize)); assert (isAligned ((size_t)s->heap.start, CARD_SIZE)); assert (isFrontierAligned (s, s->heap.start + s->heap.oldGenSize)); assert (isFrontierAligned (s, s->heap.nursery)); assert (isFrontierAligned (s, s->frontier)); assert (s->heap.start + s->heap.oldGenSize <= s->heap.nursery); assert (s->heap.nursery <= s->heap.start + s->heap.size); assert (s->heap.nursery <= s->frontier); unless (0 == s->heap.size) { assert (s->frontier <= s->limitPlusSlop); assert (s->limit == s->limitPlusSlop - GC_HEAP_LIMIT_SLOP); assert (hasHeapBytesFree (s, 0, 0)); } assert (s->secondaryHeap.start == NULL or s->heap.size == s->secondaryHeap.size); /* Check that all pointers are into from space. */ foreachGlobalObjptr (s, assertIsObjptrInFromSpace); pointer back = s->heap.start + s->heap.oldGenSize; if (DEBUG_DETAILED) fprintf (stderr, "Checking old generation.\n"); foreachObjptrInRange (s, alignFrontier (s, s->heap.start), &back, assertIsObjptrInFromSpace, FALSE); if (DEBUG_DETAILED) fprintf (stderr, "Checking nursery.\n"); foreachObjptrInRange (s, s->heap.nursery, &s->frontier, assertIsObjptrInFromSpace, FALSE); /* Current thread. */ GC_stack stack = getStackCurrent(s); assert (isStackReservedAligned (s, stack->reserved)); assert (s->stackBottom == getStackBottom (s, stack)); assert (s->stackTop == getStackTop (s, stack)); assert (s->stackLimit == getStackLimit (s, stack)); assert (s->stackBottom <= s->stackTop); assert (stack->used == sizeofGCStateCurrentStackUsed (s)); assert (stack->used <= stack->reserved); if (DEBUG) fprintf (stderr, "invariantForGC passed\n"); return TRUE; } #endif bool invariantForMutatorFrontier (GC_state s) { GC_thread thread = getThreadCurrent(s); return (thread->bytesNeeded <= (size_t)(s->limitPlusSlop - s->frontier)); } bool invariantForMutatorStack (GC_state s) { GC_stack stack = getStackCurrent(s); return (getStackTop (s, stack) <= getStackLimit (s, stack) + getStackTopFrameSize (s, stack)); } #if ASSERT bool invariantForMutator (GC_state s, bool frontier, bool stack) { if (DEBUG) displayGCState (s, stderr); if (frontier) assert (invariantForMutatorFrontier(s)); if (stack) assert (invariantForMutatorStack(s)); assert (invariantForGC (s)); return TRUE; } #endif mlton-20100608/runtime/gc/invariant.h0000644000076600000240000000125311404435622016001 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void assertIsObjptrInFromSpace (GC_state s, objptr *opp); #if ASSERT static bool invariantForGC (GC_state s); #endif static inline bool invariantForMutatorFrontier (GC_state s); static inline bool invariantForMutatorStack (GC_state s); #if ASSERT static bool invariantForMutator (GC_state s, bool frontier, bool stack); #endif #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/major.h0000644000076600000240000000062611404435622015121 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef enum { GC_COPYING, GC_MARK_COMPACT, } GC_majorKind; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20100608/runtime/gc/Makefile0000644000076600000240000000044111404435622015273 0ustar mtfstaff## Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## all: .PHONY: clean: ../../bin/clean mlton-20100608/runtime/gc/mark-compact.c0000644000076600000240000003333111404435622016361 0ustar mtfstaff/* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* Jonkers Mark-compact Collection */ /* ---------------------------------------------------------------- */ void copyForThreadInternal (pointer dst, pointer src) { if (FALSE) fprintf (stderr, "copyForThreadInternal dst = "FMTPTR" src = "FMTPTR"\n", (uintptr_t)dst, (uintptr_t)src); if (OBJPTR_SIZE > GC_HEADER_SIZE) { size_t count; assert (0 == (OBJPTR_SIZE % GC_HEADER_SIZE)); count = (OBJPTR_SIZE - GC_HEADER_SIZE) / GC_HEADER_SIZE; src = src + GC_HEADER_SIZE * count; for (size_t i = 0; i <= count; i++) { *((GC_header*)dst) = *((GC_header*)src); dst += GC_HEADER_SIZE; src -= GC_HEADER_SIZE; } } else if (GC_HEADER_SIZE > OBJPTR_SIZE) { size_t count; assert (0 == (GC_HEADER_SIZE % OBJPTR_SIZE)); count = (GC_HEADER_SIZE - OBJPTR_SIZE) / OBJPTR_SIZE; dst = dst + OBJPTR_SIZE * count; for (size_t i = 0; i <= count; i++) { *((objptr*)dst) = *((objptr*)src); dst -= OBJPTR_SIZE; src += OBJPTR_SIZE; } } else /* (GC_HEADER_SIZE == OBJPTR_SIZE) */ { *((GC_header*)dst) = *((GC_header*)src); } } void threadInternalObjptr (GC_state s, objptr *opp) { objptr opop; pointer p; GC_header *headerp; opop = pointerToObjptr ((pointer)opp, s->heap.start); p = objptrToPointer (*opp, s->heap.start); if (FALSE) fprintf (stderr, "threadInternal opp = "FMTPTR" p = "FMTPTR" header = "FMTHDR"\n", (uintptr_t)opp, (uintptr_t)p, getHeader (p)); headerp = getHeaderp (p); copyForThreadInternal ((pointer)(opp), (pointer)(headerp)); copyForThreadInternal ((pointer)(headerp), (pointer)(&opop)); } /* If the object pointer is valid, and points to an unmarked object, * then clear the object pointer. */ void updateWeaksForMarkCompact (GC_state s) { pointer p; GC_weak w; for (w = s->weaks; w != NULL; w = w->link) { assert (BOGUS_OBJPTR != w->objptr); if (DEBUG_WEAK) fprintf (stderr, "updateWeaksForMarkCompact w = "FMTPTR" ", (uintptr_t)w); p = objptrToPointer(w->objptr, s->heap.start); /* If it's unmarked, clear the weak pointer. */ if (isPointerMarked(p)) { if (DEBUG_WEAK) fprintf (stderr, "not cleared\n"); } else { if (DEBUG_WEAK) fprintf (stderr, "cleared\n"); *(getHeaderp((pointer)w - offsetofWeak (s))) = GC_WEAK_GONE_HEADER | MARK_MASK; w->objptr = BOGUS_OBJPTR; } } s->weaks = NULL; } void updateForwardPointersForMarkCompact (GC_state s, GC_stack currentStack) { pointer back; pointer endOfLastMarked; pointer front; size_t gap; GC_header header; GC_header *headerp; pointer p; size_t size, skipFront, skipGap; if (DEBUG_MARK_COMPACT) fprintf (stderr, "Update forward pointers.\n"); front = alignFrontier (s, s->heap.start); back = s->heap.start + s->heap.oldGenSize; gap = 0; endOfLastMarked = front; updateObject: if (DEBUG_MARK_COMPACT) fprintf (stderr, "updateObject front = "FMTPTR" back = "FMTPTR"\n", (uintptr_t)front, (uintptr_t)back); if (front == back) goto done; p = advanceToObjectData (s, front); headerp = getHeaderp (p); header = *headerp; if (GC_VALID_HEADER_MASK & header) { /* It's a header */ if (MARK_MASK & header) { /* It is marked, but has no forward pointers. * Thread internal pointers. */ thread: assert (GC_VALID_HEADER_MASK & header); assert (MARK_MASK & header); size_t headerBytes, objectBytes; GC_objectTypeTag tag; uint16_t bytesNonObjptrs, numObjptrs; assert (header == getHeader (p)); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); /* Compute the space taken by the header and object body. */ if ((NORMAL_TAG == tag) or (WEAK_TAG == tag)) { /* Fixed size object. */ headerBytes = GC_NORMAL_HEADER_SIZE; objectBytes = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); skipFront = 0; skipGap = 0; } else if (ARRAY_TAG == tag) { headerBytes = GC_ARRAY_HEADER_SIZE; objectBytes = sizeofArrayNoHeader (s, getArrayLength (p), bytesNonObjptrs, numObjptrs); skipFront = 0; skipGap = 0; } else { /* Stack. */ bool current; size_t reservedNew, reservedOld; GC_stack stack; assert (STACK_TAG == tag); headerBytes = GC_STACK_HEADER_SIZE; stack = (GC_stack)p; current = currentStack == stack; reservedOld = stack->reserved; reservedNew = sizeofStackShrinkReserved (s, stack, current); objectBytes = sizeof (struct GC_stack) + stack->used; skipFront = reservedOld - stack->used; skipGap = reservedOld - reservedNew; } size = headerBytes + objectBytes; if (DEBUG_MARK_COMPACT) fprintf (stderr, "threading "FMTPTR" of size %"PRIuMAX"\n", (uintptr_t)p, (uintmax_t)size); if ((size_t)(front - endOfLastMarked) >= GC_ARRAY_HEADER_SIZE + OBJPTR_SIZE) { pointer newArray = endOfLastMarked; /* Compress all of the unmarked into one vector. We require * (GC_ARRAY_HEADER_SIZE + OBJPTR_SIZE) space to be available * because that is the smallest possible array. You cannot * use GC_ARRAY_HEADER_SIZE because even very small (including * zero-length) arrays require extra space for the forwarding * pointer. If you did use GC_ARRAY_HEADER_SIZE, * updateBackwardPointersAndSlideForMarkCompact would skip the * extra space and be completely busted. */ if (DEBUG_MARK_COMPACT) fprintf (stderr, "compressing from "FMTPTR" to "FMTPTR" (length = %"PRIuMAX")\n", (uintptr_t)endOfLastMarked, (uintptr_t)front, (uintmax_t)(front - endOfLastMarked)); *((GC_arrayCounter*)(newArray)) = 0; newArray += GC_ARRAY_COUNTER_SIZE; *((GC_arrayLength*)(newArray)) = ((size_t)(front - endOfLastMarked)) - GC_ARRAY_HEADER_SIZE; newArray += GC_ARRAY_LENGTH_SIZE; *((GC_header*)(newArray)) = GC_WORD8_VECTOR_HEADER; } gap += skipGap; front += size + skipFront; endOfLastMarked = front; foreachObjptrInObject (s, p, threadInternalObjptr, FALSE); goto updateObject; } else { /* It's not marked. */ size = sizeofObject (s, p); gap += size; front += size; goto updateObject; } } else { pointer new; objptr newObjptr; assert (not (GC_VALID_HEADER_MASK & header)); /* It's a pointer. This object must be live. Fix all the forward * pointers to it, store its header, then thread its internal * pointers. */ new = p - gap; newObjptr = pointerToObjptr (new, s->heap.start); do { pointer cur; objptr curObjptr; copyForThreadInternal ((pointer)(&curObjptr), (pointer)headerp); cur = objptrToPointer (curObjptr, s->heap.start); copyForThreadInternal ((pointer)headerp, cur); *((objptr*)cur) = newObjptr; header = *headerp; } while (0 == (1 & header)); goto thread; } assert (FALSE); done: return; } void updateBackwardPointersAndSlideForMarkCompact (GC_state s, GC_stack currentStack) { pointer back; pointer front; size_t gap; GC_header header; GC_header *headerp; pointer p; size_t size, skipFront, skipGap; if (DEBUG_MARK_COMPACT) fprintf (stderr, "Update backward pointers and slide.\n"); front = alignFrontier (s, s->heap.start); back = s->heap.start + s->heap.oldGenSize; gap = 0; updateObject: if (DEBUG_MARK_COMPACT) fprintf (stderr, "updateObject front = "FMTPTR" back = "FMTPTR"\n", (uintptr_t)front, (uintptr_t)back); if (front == back) goto done; p = advanceToObjectData (s, front); headerp = getHeaderp (p); header = *headerp; if (GC_VALID_HEADER_MASK & header) { /* It's a header */ if (MARK_MASK & header) { /* It is marked, but has no backward pointers to it. * Unmark it. */ unmark: assert (GC_VALID_HEADER_MASK & header); assert (MARK_MASK & header); size_t headerBytes, objectBytes; GC_objectTypeTag tag; uint16_t bytesNonObjptrs, numObjptrs; assert (header == getHeader (p)); splitHeader(s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); /* Compute the space taken by the header and object body. */ if ((NORMAL_TAG == tag) or (WEAK_TAG == tag)) { /* Fixed size object. */ headerBytes = GC_NORMAL_HEADER_SIZE; objectBytes = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); skipFront = 0; skipGap = 0; } else if (ARRAY_TAG == tag) { headerBytes = GC_ARRAY_HEADER_SIZE; objectBytes = sizeofArrayNoHeader (s, getArrayLength (p), bytesNonObjptrs, numObjptrs); skipFront = 0; skipGap = 0; } else { /* Stack. */ bool current; size_t reservedNew, reservedOld; GC_stack stack; assert (STACK_TAG == tag); headerBytes = GC_STACK_HEADER_SIZE; stack = (GC_stack)p; current = currentStack == stack; reservedOld = stack->reserved; reservedNew = sizeofStackShrinkReserved (s, stack, current); if (reservedNew < stack->reserved) { if (DEBUG_STACKS or s->controls.messages) fprintf (stderr, "[GC: Shrinking stack of size %s bytes to size %s bytes, using %s bytes.]\n", uintmaxToCommaString(stack->reserved), uintmaxToCommaString(reservedNew), uintmaxToCommaString(stack->used)); stack->reserved = reservedNew; } objectBytes = sizeof (struct GC_stack) + stack->used; skipFront = reservedOld - stack->used; skipGap = reservedOld - reservedNew; } size = headerBytes + objectBytes; /* unmark */ if (DEBUG_MARK_COMPACT) fprintf (stderr, "unmarking "FMTPTR" of size %"PRIuMAX"\n", (uintptr_t)p, (uintmax_t)size); *headerp = header & ~MARK_MASK; /* slide */ if (DEBUG_MARK_COMPACT) fprintf (stderr, "sliding "FMTPTR" down %"PRIuMAX" to "FMTPTR"\n", (uintptr_t)front, (uintmax_t)gap, (uintptr_t)(front - gap)); GC_memmove (front, front - gap, size); gap += skipGap; front += size + skipFront; goto updateObject; } else { /* It's not marked. */ size = sizeofObject (s, p); if (DEBUG_MARK_COMPACT) fprintf (stderr, "skipping "FMTPTR" of size %"PRIuMAX"\n", (uintptr_t)p, (uintmax_t)size); gap += size; front += size; goto updateObject; } } else { pointer new; objptr newObjptr; assert (not (GC_VALID_HEADER_MASK & header)); /* It's a pointer. This object must be live. Fix all the * backward pointers to it. Then unmark it. */ new = p - gap; newObjptr = pointerToObjptr (new, s->heap.start); do { pointer cur; objptr curObjptr; copyForThreadInternal ((pointer)(&curObjptr), (pointer)headerp); cur = objptrToPointer (curObjptr, s->heap.start); copyForThreadInternal ((pointer)headerp, cur); *((objptr*)cur) = newObjptr; header = *headerp; } while (0 == (1 & header)); /* The unmarked header will be stored by unmark. */ goto unmark; } assert (FALSE); done: s->heap.oldGenSize = front - gap - s->heap.start; if (DEBUG_MARK_COMPACT) fprintf (stderr, "oldGenSize = %"PRIuMAX"\n", (uintmax_t)s->heap.oldGenSize); return; } void majorMarkCompactGC (GC_state s) { size_t bytesHashConsed; size_t bytesMarkCompacted; GC_stack currentStack; struct rusage ru_start; if (detailedGCTime (s)) startTiming (&ru_start); s->cumulativeStatistics.numMarkCompactGCs++; if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Starting major mark-compact;]\n"); fprintf (stderr, "[GC:\theap at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); } currentStack = getStackCurrent (s); if (s->hashConsDuringGC) { s->lastMajorStatistics.bytesHashConsed = 0; s->cumulativeStatistics.numHashConsGCs++; s->objectHashTable = allocHashTable (s); foreachGlobalObjptr (s, dfsMarkWithHashConsWithLinkWeaks); freeHashTable (s->objectHashTable); } else { foreachGlobalObjptr (s, dfsMarkWithoutHashConsWithLinkWeaks); } updateWeaksForMarkCompact (s); foreachGlobalObjptr (s, threadInternalObjptr); updateForwardPointersForMarkCompact (s, currentStack); updateBackwardPointersAndSlideForMarkCompact (s, currentStack); bytesHashConsed = s->lastMajorStatistics.bytesHashConsed; s->cumulativeStatistics.bytesHashConsed += bytesHashConsed; bytesMarkCompacted = s->heap.oldGenSize; s->cumulativeStatistics.bytesMarkCompacted += bytesMarkCompacted; s->lastMajorStatistics.kind = GC_MARK_COMPACT; if (detailedGCTime (s)) stopTiming (&ru_start, &s->cumulativeStatistics.ru_gcMarkCompact); if (DEBUG or s->controls.messages) { fprintf (stderr, "[GC: Finished major mark-compact; mark compacted %s bytes.]\n", uintmaxToCommaString(bytesMarkCompacted)); if (s->hashConsDuringGC) printBytesHashConsedMessage(bytesHashConsed, bytesHashConsed + bytesMarkCompacted); } } mlton-20100608/runtime/gc/mark-compact.h0000644000076600000240000000137111404435622016365 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void copyForThreadInternal (pointer dst, pointer src); static inline void threadInternalObjptr (GC_state s, objptr *opp); static inline void updateWeaksForMarkCompact (GC_state s); static void updateForwardPointersForMarkCompact (GC_state s, GC_stack currentStack); static void updateBackwardPointersAndSlideForMarkCompact (GC_state s, GC_stack currentStack); static void majorMarkCompactGC (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/model.c0000644000076600000240000000030711404435622015100 0ustar mtfstaff/* Copyright (C) 2005-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ mlton-20100608/runtime/gc/model.h0000644000076600000240000001307211404435622015110 0ustar mtfstaff/* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* Consider the following schemes for representing object pointers and mapping them to 64-bit native pointers. A. 32 bits, with bottom two bits zero. B. 32 bits, with bottom bit zero, shift left by one. C. 32 bits, with bottom bit zero, shift left by two. D. 32 bits, shift left by two. E. 32 bits, shift left by three. F. 40 bits, with bottom two bits zero. G. 64 bits, with bottom two bits zero. These schemes vary in the number of bits to represent a pointer in an object, the time to load a pointer from memory into a register, the amount of addressable memory, and the object alignment. bits time mem(G) align A 32 fast 4 4 B 32 slow 8 4 C 32 slow 16 8 D 32 slow 16 4 E 32 slow 32 8 F 40 slow 256 4 G 64 fast 4G 4 Each of the (A-F) has a variant (AX-FX) in which pointers are added to some constant base address. This gives access to any region in the virtual address space instead of just the low addresses. The following diagram demonstrates what portion of the native pointer to which the object pointer corresponds. 64 32 0 | | | ----------------------------------------------------------------- ==============================00 A ===============================0 B ===============================0 C ================================ D ================================= E ======================================00 F ==============================================================00 G Algorithmically, we can compute the native pointer (P) from the object pointer (O) (with bitsize Z), given a shift (S) and a base (B): P = %add64(%shl64(%zxZ_64(O),S),B) Likewise, we can compute the object pointer (O) from the native pointer (P), given a shift (S) and a base (B): O = %lobits64_Z(%shr64(%sub64(P,B),S)) Hence, each of the schemes may be characterized by the size Z of the object pointer, the shift S, and whether or not the base B is zero. Noting that %zx64_64(x) = x %shl64(x, 0) = x %add64(x, 0) = x %lobits64_64(x) = x %shr64(x, 0) = x %sub64(x, 0) = x it is easy to compute the number of ALU operations required by each scheme: A :: Z = 32, S == 0, B == 0 ops = 1 AX :: Z = 32, S == 0, B != 0 ops = 2 B :: Z = 32, S == 1, B == 0 ops = 2 BX :: Z = 32, S == 1, B != 0 ops = 3 C :: Z = 32, S == 2, B == 0 ops = 2 CX :: Z = 32, S == 2, B != 0 ops = 3 D :: Z = 32, S == 2, B == 0 ops = 2 DX :: Z = 32, S == 2, B != 0 ops = 3 E :: Z = 32, S == 3, B == 0 ops = 2 EX :: Z = 32, S == 3, B != 0 ops = 3 F :: Z = 40, S == 0, B == 0 ops = 1 (#) FX :: Z = 40, S == 0, B != 0 ops = 2 (#) G :: Z = 64, S == 0, B == 0 ops = 0 #: In schemes F and FX, the conversion from object pointer to native pointer requires logical-shift-right, rather than zero-extend, since the object pointer would be fetched from memory as a 64-bit value. The cost may actually be higher, as storing an object pointer in memory requires some care so as not to overwrite neighboring data. It is not clear that any of the thirteen schemes dominates another. Here are some thoughts. (A) This is is what we have now, but is still useful on 64-bit machines where the bottom 4G may be less cluttered than on a 32-bit machine. (AX) seems like a nice cost/benefit tradeoff for a program that only needs 4G of memory, since the base can be used to find a contiguous 4G somewhere in the address space. (B) and (C) are similar, the tradeoff being to increase object alignment requirements in order to allow more memory. Importantly, pointers having a bottom zero bit means that we can still set the bottom bit to one to represent small values in sum types. (D) and (E) are problematic because they leave no room to represent small objects in sum types with pointers. I think that really rules them out. (F) costs some in object alignment because a sequence of pointers in an object may have to be padded to meet 4-byte alignment. Loading a pointer from memory into a register may be slightly faster than in (B) or (C) because we don't have to shift, but I wonder if that matters. (G) costs the most in space, but has the fastest load time for pointers of the schemes that allow access to 4G of memory. A reasonable tradeoff in implementation complexity vs allowing our users enough flexibility might be to provide: A, AX, B, BX, C, CX, G After some experiments on those, we might be able to find a more manageable set for users. */ #if defined (GC_MODEL_NATIVE32) #define GC_MODEL_OBJPTR_SIZE 32 #define GC_MODEL_OBJPTR_SHIFT 0 #define GC_MODEL_OBJPTR_BASE 0 #define GC_MODEL_HEADER_SIZE 32 #define GC_MODEL_ARRLEN_SIZE 32 #elif defined (GC_MODEL_NATIVE64) #define GC_MODEL_OBJPTR_SIZE 64 #define GC_MODEL_OBJPTR_SHIFT 0 #define GC_MODEL_OBJPTR_BASE 0 #define GC_MODEL_HEADER_SIZE 64 #define GC_MODEL_ARRLEN_SIZE 64 #else #error GC_MODEL_* undefined #endif #define GC_MODEL_MINALIGN_SHIFT max(2, GC_MODEL_OBJPTR_SHIFT + 1) #define GC_MODEL_MINALIGN TWOPOWER(GC_MODEL_MINALIGN_SHIFT) #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20100608/runtime/gc/new-object.c0000644000076600000240000000652411404435622016044 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* newObject (s, header, bytesRequested, allocInOldGen) * * Allocate a new object in the heap. * bytesRequested includes the size of the header. */ pointer newObject (GC_state s, GC_header header, size_t bytesRequested, bool allocInOldGen) { pointer frontier; pointer result; assert (isAligned (bytesRequested, s->alignment)); assert (allocInOldGen ? hasHeapBytesFree (s, bytesRequested, 0) : hasHeapBytesFree (s, 0, bytesRequested)); if (allocInOldGen) { frontier = s->heap.start + s->heap.oldGenSize; s->heap.oldGenSize += bytesRequested; s->cumulativeStatistics.bytesAllocated += bytesRequested; } else { if (DEBUG_DETAILED) fprintf (stderr, "frontier changed from "FMTPTR" to "FMTPTR"\n", (uintptr_t)s->frontier, (uintptr_t)(s->frontier + bytesRequested)); frontier = s->frontier; s->frontier += bytesRequested; } GC_profileAllocInc (s, bytesRequested); *((GC_header*)frontier) = header; result = frontier + GC_NORMAL_HEADER_SIZE; assert (isAligned ((size_t)result, s->alignment)); if (DEBUG) fprintf (stderr, FMTPTR " = newObject ("FMTHDR", %"PRIuMAX", %s)\n", (uintptr_t)result, header, (uintmax_t)bytesRequested, boolToString (allocInOldGen)); return result; } GC_stack newStack (GC_state s, size_t reserved, bool allocInOldGen) { GC_stack stack; assert (isStackReservedAligned (s, reserved)); if (reserved > s->cumulativeStatistics.maxStackSize) s->cumulativeStatistics.maxStackSize = reserved; stack = (GC_stack)(newObject (s, GC_STACK_HEADER, sizeofStackWithHeader (s, reserved), allocInOldGen)); stack->reserved = reserved; stack->used = 0; if (DEBUG_STACKS) fprintf (stderr, FMTPTR " = newStack (%"PRIuMAX")\n", (uintptr_t)stack, (uintmax_t)reserved); return stack; } GC_thread newThread (GC_state s, size_t reserved) { GC_stack stack; GC_thread thread; pointer res; assert (isStackReservedAligned (s, reserved)); ensureHasHeapBytesFree (s, 0, sizeofStackWithHeader (s, reserved) + sizeofThread (s)); stack = newStack (s, reserved, FALSE); res = newObject (s, GC_THREAD_HEADER, sizeofThread (s), FALSE); thread = (GC_thread)(res + offsetofThread (s)); thread->bytesNeeded = 0; thread->exnStack = BOGUS_EXN_STACK; thread->stack = pointerToObjptr((pointer)stack, s->heap.start); if (DEBUG_THREADS) fprintf (stderr, FMTPTR" = newThreadOfSize (%"PRIuMAX")\n", (uintptr_t)thread, (uintmax_t)reserved);; return thread; } static inline void setFrontier (GC_state s, pointer p, __attribute__ ((unused)) size_t bytes) { p = alignFrontier (s, p); assert ((size_t)(p - s->frontier) <= bytes); GC_profileAllocInc (s, p - s->frontier); s->cumulativeStatistics.bytesAllocated += p - s->frontier; s->frontier = p; assert (s->frontier <= s->limitPlusSlop); } mlton-20100608/runtime/gc/new-object.h0000644000076600000240000000127011404435622016042 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline pointer newObject (GC_state s, GC_header header, size_t bytesRequested, bool allocInOldGen); static inline GC_stack newStack (GC_state s, size_t reserved, bool allocInOldGen); static GC_thread newThread (GC_state s, size_t stackSize); static inline void setFrontier (GC_state s, pointer p, size_t bytes); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/object-size.c0000644000076600000240000000333511404435622016222 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ size_t sizeofArrayNoHeader (GC_state s, GC_arrayLength numElements, uint16_t bytesNonObjptrs, uint16_t numObjptrs) { size_t result; result = numElements * (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)); /* Very small (including empty) arrays have OBJPTR_SIZE bytes for * the forwarding pointer. */ if (result < OBJPTR_SIZE) result = OBJPTR_SIZE; return alignWithExtra (s, result, GC_ARRAY_HEADER_SIZE); } size_t sizeofStackNoHeader (__attribute__ ((unused)) GC_state s, GC_stack stack) { size_t result; result = sizeof (struct GC_stack) + stack->reserved; return result; } size_t sizeofObject (GC_state s, pointer p) { size_t headerBytes, objectBytes; GC_header header; GC_objectTypeTag tag; uint16_t bytesNonObjptrs, numObjptrs; header = getHeader (p); splitHeader (s, header, &tag, NULL, &bytesNonObjptrs, &numObjptrs); if ((NORMAL_TAG == tag) or (WEAK_TAG == tag)) { headerBytes = GC_NORMAL_HEADER_SIZE; objectBytes = bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE); } else if (ARRAY_TAG == tag) { headerBytes = GC_ARRAY_HEADER_SIZE; objectBytes = sizeofArrayNoHeader (s, getArrayLength (p), bytesNonObjptrs, numObjptrs); } else { /* Stack. */ assert (STACK_TAG == tag); headerBytes = GC_STACK_HEADER_SIZE; objectBytes = sizeofStackNoHeader (s, (GC_stack)p); } return headerBytes + objectBytes; } mlton-20100608/runtime/gc/object-size.h0000644000076600000240000000120611404435622016222 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline size_t sizeofArrayNoHeader (GC_state s, GC_arrayLength numElements, uint16_t bytesNonObjptrs, uint16_t numObjptrs); static inline size_t sizeofStackNoHeader (GC_state s, GC_stack stack); static inline size_t sizeofObject (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/object.c0000644000076600000240000000622111404435622015247 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ const char* objectTypeTagToString (GC_objectTypeTag tag) { switch (tag) { case ARRAY_TAG: return "ARRAY"; case NORMAL_TAG: return "NORMAL"; case STACK_TAG: return "STACK"; case WEAK_TAG: return "WEAK"; default: die ("bad GC_objectTypeTag %u", tag); } } /* getHeaderp (p) * * Returns a pointer to the header for the object pointed to by p. */ GC_header* getHeaderp (pointer p) { return (GC_header*)(p - GC_HEADER_SIZE); } /* getHeader (p) * * Returns the header for the object pointed to by p. */ GC_header getHeader (pointer p) { return *(getHeaderp(p)); } /* * Build the header for an object, given the index to its type info. */ GC_header buildHeaderFromTypeIndex (uint32_t t) { assert (t < TWOPOWER (TYPE_INDEX_BITS)); return 1 | (t << 1); } void splitHeader(GC_state s, GC_header header, GC_objectTypeTag *tagRet, bool *hasIdentityRet, uint16_t *bytesNonObjptrsRet, uint16_t *numObjptrsRet) { unsigned int objectTypeIndex; GC_objectType objectType; GC_objectTypeTag tag; bool hasIdentity; uint16_t bytesNonObjptrs, numObjptrs; assert (1 == (header & GC_VALID_HEADER_MASK)); objectTypeIndex = (header & TYPE_INDEX_MASK) >> TYPE_INDEX_SHIFT; assert (objectTypeIndex < s->objectTypesLength); objectType = &(s->objectTypes[objectTypeIndex]); tag = objectType->tag; hasIdentity = objectType->hasIdentity; bytesNonObjptrs = objectType->bytesNonObjptrs; numObjptrs = objectType->numObjptrs; if (DEBUG_DETAILED) fprintf (stderr, "splitHeader ("FMTHDR")" " objectTypeIndex = %u" " tag = %s" " hasIdentity = %s" " bytesNonObjptrs = %"PRIu16 " numObjptrs = %"PRIu16"\n", header, objectTypeIndex, objectTypeTagToString(tag), boolToString(hasIdentity), bytesNonObjptrs, numObjptrs); if (tagRet != NULL) *tagRet = tag; if (hasIdentityRet != NULL) *hasIdentityRet = hasIdentity; if (bytesNonObjptrsRet != NULL) *bytesNonObjptrsRet = bytesNonObjptrs; if (numObjptrsRet != NULL) *numObjptrsRet = numObjptrs; } /* advanceToObjectData (s, p) * * If p points at the beginning of an object, then advanceToObjectData * returns a pointer to the start of the object data. */ pointer advanceToObjectData (__attribute__ ((unused)) GC_state s, pointer p) { GC_header header; pointer res; assert (isFrontierAligned (s, p)); header = *(GC_header*)p; if (0 == header) /* Looking at the counter word in an array. */ res = p + GC_ARRAY_HEADER_SIZE; else /* Looking at a header word. */ res = p + GC_NORMAL_HEADER_SIZE; assert (isAligned ((uintptr_t)res, s->alignment)); if (DEBUG_DETAILED) fprintf (stderr, FMTPTR" = advanceToObjectData ("FMTPTR")\n", (uintptr_t)res, (uintptr_t)p); return res; } mlton-20100608/runtime/gc/object.h0000644000076600000240000001326211404435622015257 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * There are four kinds of ML objects: * array, normal (fixed size), stack, and weak. */ typedef enum { /* The tag indices here must agree with those in declareObjectTypes() * in codegen/c-codegen/c-codegen.fun. */ ARRAY_TAG = 0, NORMAL_TAG = 1, STACK_TAG = 2, WEAK_TAG = 3, } GC_objectTypeTag; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static const char* objectTypeTagToString (GC_objectTypeTag tag); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Each object has a header, which immediately precedes the object data. * A header has the following bit layout: * * 00 : 1 * 01 - 19 : type index bits, index into GC_state->objectTypes. * 20 - 30 : counter bits, used by mark compact GC (initially 0) * 31 : mark bit, used by mark compact GC (initially 0) * 32 - 63 : 0wx00000000 (only w/ 64-bit header) */ #define GC_HEADER_TYPE__(z) uint ## z ## _t #define GC_HEADER_TYPE_(z) GC_HEADER_TYPE__(z) #define GC_HEADER_TYPE GC_HEADER_TYPE_(GC_MODEL_HEADER_SIZE) typedef GC_HEADER_TYPE GC_header; #define GC_HEADER_SIZE sizeof(GC_header) #define PRIxHDR__(z) PRIx ## z #define PRIxHDR_(z) PRIxHDR__(z) #define PRIxHDR PRIxHDR_(GC_MODEL_HEADER_SIZE) #define FMTHDR "%08"PRIxHDR COMPILE_TIME_ASSERT(sizeof_objptr__eq__sizeof_header, sizeof(objptr) == sizeof(GC_header)); #define GC_VALID_HEADER_MASK ((GC_header)0x1) #define TYPE_INDEX_BITS 19 #define TYPE_INDEX_MASK ((GC_header)0x000FFFFE) #define TYPE_INDEX_SHIFT 1 #define COUNTER_BITS 10 #define COUNTER_MASK ((GC_header)0x7FF00000) #define COUNTER_SHIFT 20 #define MARK_BITS 1 #define MARK_MASK ((GC_header)0x80000000) #define MARK_SHIFT 31 #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_header* getHeaderp (pointer p); static inline GC_header getHeader (pointer p); static inline GC_header buildHeaderFromTypeIndex (uint32_t t); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Normal objects have the following layout: * * header :: * (non heap-pointers)* :: * (heap pointers)* * * Note that the non heap-pointers denote a sequence of primitive data * values. These data values need not map directly to values of the * native word size. MLton's aggressive representation strategies may * pack multiple primitive values into the same native word. * Likewise, a primitive value may span multiple native words (e.g., * Word64.word on an x86). */ #define GC_NORMAL_HEADER_SIZE GC_HEADER_SIZE #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ /* Array objects are described in "array.h" */ /* Stack objects are described in "stack.h" */ /* Weak objects are described in "weak.h" */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * The type index of a header is an index into an array of object * types, where each element describes the layout of an object. The * object types array is declared as: * * GC_objectType *objectTypes; * * The objectTypes pointer is initialized to point to a static array * of object types that is emitted for each compiled program. The * hasIdentity field indicates whether or not the object has mutable * fields, in which case it may not be hash-cons-ed. In a normal * object, the bytesNonObjptrs field indicates the number of bytes of * non heap-pointer data, while the numObjptrs field indicates the * number of heap pointers. In an array object, the bytesNonObjptrs * field indicates the number of bytes of non heap-pointer data in a * single array element, while the numObjptrs field indicates the * number of heap pointers in a single array element. In a stack * object, the bytesNonObjptrs and numObjptrs fields are irrelevant. * In a weak object, the bytesNonObjptrs and numObjptrs fields are * interpreted as in a normal object. */ typedef struct GC_objectType { /* Keep tag first, at zero offset, since it is referenced most often. */ GC_objectTypeTag tag; bool hasIdentity; uint16_t bytesNonObjptrs; uint16_t numObjptrs; } *GC_objectType; enum { /* The type indices here must agree with those in backend/rep-type.fun. */ STACK_TYPE_INDEX = 0, THREAD_TYPE_INDEX = 1, WEAK_GONE_TYPE_INDEX = 2, WORD8_VECTOR_TYPE_INDEX = 3, WORD32_VECTOR_TYPE_INDEX = 4, WORD16_VECTOR_TYPE_INDEX = 5, WORD64_VECTOR_TYPE_INDEX = 6, }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) #define GC_STACK_HEADER buildHeaderFromTypeIndex (STACK_TYPE_INDEX) #define GC_THREAD_HEADER buildHeaderFromTypeIndex (THREAD_TYPE_INDEX) #define GC_WEAK_GONE_HEADER buildHeaderFromTypeIndex (WEAK_GONE_TYPE_INDEX) #define GC_WORD8_VECTOR_HEADER buildHeaderFromTypeIndex (WORD8_VECTOR_TYPE_INDEX) #define GC_WORD16_VECTOR_HEADER buildHeaderFromTypeIndex (WORD16_VECTOR_TYPE_INDEX) #define GC_WORD32_VECTOR_HEADER buildHeaderFromTypeIndex (WORD32_VECTOR_TYPE_INDEX) #define GC_WORD64_VECTOR_HEADER buildHeaderFromTypeIndex (WORD64_VECTOR_TYPE_INDEX) static inline void splitHeader (GC_state s, GC_header header, GC_objectTypeTag *tagRet, bool *hasIdentityRet, uint16_t *bytesNonObjptrsRet, uint16_t *numObjptrsRet); static inline pointer advanceToObjectData (GC_state s, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/objptr.c0000644000076600000240000000356611404435622015312 0ustar mtfstaff/* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* isObjptr returns true if p looks like an object pointer. */ bool isObjptr (objptr p) { unsigned int shift = GC_MODEL_MINALIGN_SHIFT - GC_MODEL_OBJPTR_SHIFT; objptr mask = ~((~((objptr)0)) << shift); return (0 == (p & mask)); } pointer objptrToPointer (objptr O, pointer B) { uintptr_t O_ = (uintptr_t)O; uintptr_t B_; unsigned int S_ = GC_MODEL_OBJPTR_SHIFT; uintptr_t P_; pointer P; if (GC_MODEL_OBJPTR_BASE) { B_ = (uintptr_t)B; } else { B_ = 0; } P_ = ((O_ << S_) + B_); P = (pointer)P_; if (DEBUG_OBJPTR) fprintf (stderr, "objptrToPointer ("FMTOBJPTR") = "FMTPTR"\n", O, (uintptr_t)P); return P; } objptr pointerToObjptr (pointer P, pointer B) { uintptr_t P_ = (uintptr_t)P; uintptr_t B_; unsigned int S_ = GC_MODEL_OBJPTR_SHIFT; uintptr_t O_; objptr O; if (GC_MODEL_OBJPTR_BASE) { B_ = (uintptr_t)B; } else { B_ = 0; } O_ = ((P_ - B_) >> S_); O = (objptr)O_; if (DEBUG_OBJPTR) fprintf (stderr, "pointerToObjptr ("FMTPTR") = "FMTOBJPTR"\n", (uintptr_t)P, O); return O; } /* * Note that by indirectly fetching and storing object pointers, the * following functions admit implementations that behave according to * model characteristics determined at runtime. Hence, by making * exclusive use of these functions (and adding a GC_state->model * field set by the compiled program), we may be able to implement the * runtime in a manner which is agnostic to the actual objptr * representation. */ pointer fetchObjptrToPointer (pointer OP, pointer B) { return objptrToPointer (*((objptr*)OP), B); } void storeObjptrFromPointer (pointer OP, pointer P, pointer B) { *((objptr*)OP) = pointerToObjptr (P, B); } mlton-20100608/runtime/gc/objptr.h0000644000076600000240000000226011404435622015305 0ustar mtfstaff/* Copyright (C) 2005-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) #define OBJPTR_TYPE__(z) uint ## z ## _t #define OBJPTR_TYPE_(z) OBJPTR_TYPE__(z) #define OBJPTR_TYPE OBJPTR_TYPE_(GC_MODEL_OBJPTR_SIZE) typedef OBJPTR_TYPE objptr; #define OBJPTR_SIZE sizeof(objptr) #define PRIxOBJPTR__(z) PRIx ## z #define PRIxOBJPTR_(z) PRIxOBJPTR__(z) #define PRIxOBJPTR PRIxOBJPTR_(GC_MODEL_OBJPTR_SIZE) #define FMTOBJPTR "0x%016"PRIxOBJPTR COMPILE_TIME_ASSERT(sizeof_voidStar__gte__sizeof_objptr, sizeof(void*) >= sizeof(objptr)); #define BOGUS_OBJPTR (objptr)0x1 #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline bool isObjptr (objptr p); static inline pointer objptrToPointer (objptr O, pointer B); static inline objptr pointerToObjptr (pointer P, pointer B); static inline pointer fetchObjptrToPointer (pointer OP, pointer B); static inline void storeObjptrFromPointer (pointer OP, pointer P, pointer B); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/pack.c0000644000076600000240000000415311404435622014721 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void GC_pack (GC_state s) { size_t keep; enter (s); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Packing heap at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); /* Could put some code here to skip the GC if there hasn't been much * allocated since the last collection. But you would still need to * do a minor GC to make all objects contiguous. */ performGC (s, 0, 0, TRUE, FALSE); keep = s->heap.oldGenSize * 1.1; if (keep <= s->heap.size) { shrinkHeap (s, &s->heap, keep); setCardMapAndCrossMap (s); setGCStateCurrentHeap (s, 0, 0); setGCStateCurrentThreadAndStack (s); } releaseHeap (s, &s->secondaryHeap); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Packed heap at "FMTPTR" to size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); leave (s); } void GC_unpack (GC_state s) { enter (s); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Unpacking heap at "FMTPTR" of size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); /* The enterGC is needed here because minorGC and resizeHeap might * move the stack, and the SIGPROF catcher would then see a bogus * stack. The leaveGC has to happen after the setStack. */ enterGC (s); minorGC (s); resizeHeap (s, s->heap.oldGenSize); setCardMapAndCrossMap (s); resizeHeapSecondary (s); setGCStateCurrentHeap (s, 0, 0); setGCStateCurrentThreadAndStack (s); leaveGC (s); if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Unpacked heap at "FMTPTR" to size %s bytes.]\n", (uintptr_t)(s->heap.start), uintmaxToCommaString(s->heap.size)); leave (s); } mlton-20100608/runtime/gc/pack.h0000644000076600000240000000063611404435622014730 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_pack (GC_state s); PRIVATE void GC_unpack (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/pointer.c0000644000076600000240000000067511404435622015470 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* isPointer returns true if p looks like a pointer. */ bool isPointer (pointer p) { uintptr_t mask = ~((~((uintptr_t)0)) << GC_MODEL_MINALIGN_SHIFT); return (0 == ((uintptr_t)p & mask)); } mlton-20100608/runtime/gc/pointer.h0000644000076600000240000000064411404435622015471 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) #define BOGUS_POINTER (pointer)0x1 static inline bool isPointer (pointer p); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20100608/runtime/gc/profiling.c0000644000076600000240000003607111404435622016000 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ GC_profileMasterIndex sourceIndexToProfileMasterIndex (GC_state s, GC_sourceIndex i) { GC_profileMasterIndex pmi; pmi = s->sourceMaps.sources[i].sourceNameIndex + s->sourceMaps.sourcesLength; if (DEBUG_PROFILE) fprintf (stderr, "%"PRIu32" = sourceIndexToProfileMasterIndex ("FMTSI")\n", pmi, i); return pmi; } GC_sourceNameIndex profileMasterIndexToSourceNameIndex (GC_state s, GC_profileMasterIndex i) { assert (i >= s->sourceMaps.sourcesLength); return i - s->sourceMaps.sourcesLength; } char* profileIndexSourceName (GC_state s, GC_sourceIndex i) { char* res; if (i < s->sourceMaps.sourcesLength) res = getSourceName (s, i); else res = s->sourceMaps.sourceNames[profileMasterIndexToSourceNameIndex (s, i)]; return res; } GC_profileStack getProfileStackInfo (GC_state s, GC_profileMasterIndex i) { assert (s->profiling.data != NULL); return &(s->profiling.data->stack[i]); } static int profileDepth = 0; static void profileIndent (void) { int i; for (i = 0; i < profileDepth; ++i) fprintf (stderr, " "); } void addToStackForProfiling (GC_state s, GC_profileMasterIndex i) { GC_profileData p; GC_profileStack ps; p = s->profiling.data; ps = getProfileStackInfo (s, i); if (DEBUG_PROFILE) fprintf (stderr, "adding %s to stack lastTotal = %"PRIuMAX" lastTotalGC = %"PRIuMAX"\n", getSourceName (s, i), (uintmax_t)p->total, (uintmax_t)p->totalGC); ps->lastTotal = p->total; ps->lastTotalGC = p->totalGC; } void enterSourceForProfiling (GC_state s, GC_profileMasterIndex i) { GC_profileData p; GC_profileStack ps; p = s->profiling.data; ps = getProfileStackInfo (s, i); if (0 == ps->numOccurrences) { ps->lastTotal = p->total; ps->lastTotalGC = p->totalGC; } ps->numOccurrences++; } void enterForProfiling (GC_state s, GC_sourceSeqIndex sourceSeqIndex) { uint32_t i; GC_profileData p; GC_sourceIndex sourceIndex; uint32_t *sourceSeq; if (DEBUG_PROFILE) fprintf (stderr, "enterForProfiling ("FMTSSI")\n", sourceSeqIndex); assert (s->profiling.stack); assert (sourceSeqIndex < s->sourceMaps.sourceSeqsLength); p = s->profiling.data; sourceSeq = s->sourceMaps.sourceSeqs[sourceSeqIndex]; for (i = 1; i <= sourceSeq[0]; i++) { sourceIndex = sourceSeq[i]; if (DEBUG_ENTER_LEAVE or DEBUG_PROFILE) { profileIndent (); fprintf (stderr, "(entering %s\n", getSourceName (s, sourceIndex)); profileDepth++; } enterSourceForProfiling (s, (GC_profileMasterIndex)sourceIndex); enterSourceForProfiling (s, sourceIndexToProfileMasterIndex (s, sourceIndex)); } } void enterFrameForProfiling (GC_state s, GC_frameIndex i) { enterForProfiling (s, s->sourceMaps.frameSources[i]); } void GC_profileEnter (GC_state s) { enterForProfiling (s, getCachedStackTopFrameSourceSeqIndex (s)); } void removeFromStackForProfiling (GC_state s, GC_profileMasterIndex i) { GC_profileData p; GC_profileStack ps; p = s->profiling.data; ps = getProfileStackInfo (s, i); if (DEBUG_PROFILE) fprintf (stderr, "removing %s from stack ticksInc = %"PRIuMAX" ticksGCInc = %"PRIuMAX"\n", profileIndexSourceName (s, i), (uintmax_t)(p->total - ps->lastTotal), (uintmax_t)(p->totalGC - ps->lastTotalGC)); ps->ticks += p->total - ps->lastTotal; ps->ticksGC += p->totalGC - ps->lastTotalGC; } void leaveSourceForProfiling (GC_state s, GC_profileMasterIndex i) { GC_profileData p; GC_profileStack ps; p = s->profiling.data; ps = getProfileStackInfo (s, i); assert (ps->numOccurrences > 0); ps->numOccurrences--; if (0 == ps->numOccurrences) removeFromStackForProfiling (s, i); } void leaveForProfiling (GC_state s, GC_sourceSeqIndex sourceSeqIndex) { int32_t i; GC_profileData p; GC_sourceIndex sourceIndex; uint32_t *sourceSeq; if (DEBUG_PROFILE) fprintf (stderr, "leaveForProfiling ("FMTSSI")\n", sourceSeqIndex); assert (s->profiling.stack); assert (sourceSeqIndex < s->sourceMaps.sourceSeqsLength); p = s->profiling.data; sourceSeq = s->sourceMaps.sourceSeqs[sourceSeqIndex]; for (i = sourceSeq[0]; i > 0; i--) { sourceIndex = sourceSeq[i]; if (DEBUG_ENTER_LEAVE or DEBUG_PROFILE) { profileDepth--; profileIndent (); fprintf (stderr, "leaving %s)\n", getSourceName (s, sourceIndex)); } leaveSourceForProfiling (s, (GC_profileMasterIndex)sourceIndex); leaveSourceForProfiling (s, sourceIndexToProfileMasterIndex (s, sourceIndex)); } } void leaveFrameForProfiling (GC_state s, GC_frameIndex i) { leaveForProfiling (s, s->sourceMaps.frameSources[i]); } void GC_profileLeave (GC_state s) { leaveForProfiling (s, getCachedStackTopFrameSourceSeqIndex (s)); } void incForProfiling (GC_state s, size_t amount, GC_sourceSeqIndex sourceSeqIndex) { uint32_t *sourceSeq; GC_sourceIndex topSourceIndex; if (DEBUG_PROFILE) fprintf (stderr, "incForProfiling (%"PRIuMAX", "FMTSSI")\n", (uintmax_t)amount, sourceSeqIndex); assert (sourceSeqIndex < s->sourceMaps.sourceSeqsLength); sourceSeq = s->sourceMaps.sourceSeqs[sourceSeqIndex]; topSourceIndex = sourceSeq[0] > 0 ? sourceSeq[sourceSeq[0]] : SOURCES_INDEX_UNKNOWN; if (DEBUG_PROFILE) { profileIndent (); fprintf (stderr, "bumping %s by %"PRIuMAX"\n", getSourceName (s, topSourceIndex), (uintmax_t)amount); } s->profiling.data->countTop[topSourceIndex] += amount; s->profiling.data->countTop[sourceIndexToProfileMasterIndex (s, topSourceIndex)] += amount; if (s->profiling.stack) enterForProfiling (s, sourceSeqIndex); if (SOURCES_INDEX_GC == topSourceIndex) s->profiling.data->totalGC += amount; else s->profiling.data->total += amount; if (s->profiling.stack) leaveForProfiling (s, sourceSeqIndex); } void GC_profileInc (GC_state s, size_t amount) { if (DEBUG_PROFILE) fprintf (stderr, "GC_profileInc (%"PRIuMAX")\n", (uintmax_t)amount); incForProfiling (s, amount, s->amInGC ? SOURCE_SEQ_GC : getCachedStackTopFrameSourceSeqIndex (s)); } void GC_profileAllocInc (GC_state s, size_t amount) { if (s->profiling.isOn and (PROFILE_ALLOC == s->profiling.kind)) { if (DEBUG_PROFILE) fprintf (stderr, "GC_profileAllocInc (%"PRIuMAX")\n", (uintmax_t)amount); GC_profileInc (s, amount); } } GC_profileData profileMalloc (GC_state s) { GC_profileData p; uint32_t profileMasterLength; p = (GC_profileData)(malloc_safe (sizeof(*p))); p->total = 0; p->totalGC = 0; profileMasterLength = s->sourceMaps.sourcesLength + s->sourceMaps.sourceNamesLength; p->countTop = (uintmax_t*)(calloc_safe(profileMasterLength, sizeof(*(p->countTop)))); if (s->profiling.stack) p->stack = (struct GC_profileStack *) (calloc_safe(profileMasterLength, sizeof(*(p->stack)))); if (DEBUG_PROFILE) fprintf (stderr, FMTPTR" = profileMalloc ()\n", (uintptr_t)p); return p; } GC_profileData GC_profileMalloc (GC_state s) { return profileMalloc (s); } void profileFree (GC_state s, GC_profileData p) { if (DEBUG_PROFILE) fprintf (stderr, "profileFree ("FMTPTR")\n", (uintptr_t)p); free (p->countTop); if (s->profiling.stack) free (p->stack); free (p); } void GC_profileFree (GC_state s, GC_profileData p) { profileFree (s, p); } void writeProfileCount (GC_state s, FILE *f, GC_profileData p, GC_profileMasterIndex i) { writeUintmaxU (f, p->countTop[i]); if (s->profiling.stack) { GC_profileStack ps; ps = &(p->stack[i]); writeString (f, " "); writeUintmaxU (f, ps->ticks); writeString (f, " "); writeUintmaxU (f, ps->ticksGC); } writeNewline (f); } void profileWrite (GC_state s, GC_profileData p, const char *fileName) { FILE *f; const char* kind; if (DEBUG_PROFILE) fprintf (stderr, "profileWrite("FMTPTR",%s)\n", (uintptr_t)p, fileName); f = fopen_safe (fileName, "wb"); writeString (f, "MLton prof\n"); kind = ""; switch (s->profiling.kind) { case PROFILE_ALLOC: kind = "alloc\n"; break; case PROFILE_COUNT: kind = "count\n"; break; case PROFILE_NONE: die ("impossible PROFILE_NONE"); break; case PROFILE_TIME_FIELD: kind = "time\n"; break; case PROFILE_TIME_LABEL: kind = "time\n"; break; default: assert (FALSE); } writeString (f, kind); writeString (f, s->profiling.stack ? "stack\n" : "current\n"); writeUint32X (f, s->magic); writeNewline (f); writeUintmaxU (f, p->total); writeString (f, " "); writeUintmaxU (f, p->totalGC); writeNewline (f); writeUint32U (f, s->sourceMaps.sourcesLength); writeNewline (f); for (GC_sourceIndex i = 0; i < s->sourceMaps.sourcesLength; i++) writeProfileCount (s, f, p, (GC_profileMasterIndex)i); writeUint32U (f, s->sourceMaps.sourceNamesLength); writeNewline (f); for (GC_sourceNameIndex i = 0; i < s->sourceMaps.sourceNamesLength; i++) writeProfileCount (s, f, p, (GC_profileMasterIndex)(i + s->sourceMaps.sourcesLength)); fclose_safe (f); } void GC_profileWrite (GC_state s, GC_profileData p, NullString8_t fileName) { profileWrite (s, p, (const char*)fileName); } void setProfTimer (long usec) { struct itimerval iv; iv.it_interval.tv_sec = 0; iv.it_interval.tv_usec = usec; iv.it_value.tv_sec = 0; iv.it_value.tv_usec = usec; unless (0 == setitimer (ITIMER_PROF, &iv, NULL)) die ("setProfTimer: setitimer failed"); } #if not HAS_TIME_PROFILING /* No time profiling on this platform. There is a check in * mlton/main/main.fun to make sure that time profiling is never * turned on. */ __attribute__ ((noreturn)) void initProfilingTime (__attribute__ ((unused)) GC_state s) { die ("no time profiling"); } #else static GC_state handleSigProfState; void GC_handleSigProf (code_pointer pc) { GC_frameIndex frameIndex; GC_state s; GC_sourceSeqIndex sourceSeqsIndex; s = handleSigProfState; if (DEBUG_PROFILE) fprintf (stderr, "GC_handleSigProf ("FMTPTR")\n", (uintptr_t)pc); if (s->amInGC) sourceSeqsIndex = SOURCE_SEQ_GC; else { frameIndex = getCachedStackTopFrameIndex (s); if (C_FRAME == s->frameLayouts[frameIndex].kind) sourceSeqsIndex = s->sourceMaps.frameSources[frameIndex]; else { if (PROFILE_TIME_LABEL == s->profiling.kind) { uint32_t start, end, i; /* Binary search labels to find which method contains PC */ start = 0; end = s->sourceMaps.sourceLabelsLength; while (end - start > 1) { i = (start+end)/2; if ((uintptr_t)s->sourceMaps.sourceLabels[i].label <= (uintptr_t)pc) start = i; else end = i; } i = start; /* The last label is dead code. Any address past it is thus unknown. * The first label is before all SML code. Before it is also unknown. */ if (i-1 == s->sourceMaps.sourceLabelsLength || (i == 0 && (uintptr_t)pc < (uintptr_t)s->sourceMaps.sourceLabels[i].label)) { if (DEBUG_PROFILE) fprintf (stderr, "pc out of bounds\n"); sourceSeqsIndex = SOURCE_SEQ_UNKNOWN; } else { sourceSeqsIndex = s->sourceMaps.sourceLabels[start].sourceSeqIndex; } } else { sourceSeqsIndex = s->sourceMaps.curSourceSeqsIndex; } } } incForProfiling (s, 1, sourceSeqsIndex); } static void initProfilingTime (GC_state s) { struct sigaction sa; s->profiling.data = profileMalloc (s); if (PROFILE_TIME_LABEL == s->profiling.kind) { initSourceLabels (s); } else { s->sourceMaps.curSourceSeqsIndex = SOURCE_SEQ_UNKNOWN; } /* * Install catcher, which handles SIGPROF and calls MLton_Profile_inc. * * One thing I should point out that I discovered the hard way: If * the call to sigaction does NOT specify the SA_ONSTACK flag, then * even if you have called sigaltstack(), it will NOT switch stacks, * so you will probably die. Worse, if the call to sigaction DOES * have SA_ONSTACK and you have NOT called sigaltstack(), it still * switches stacks (to location 0) and you die of a SEGV. Thus the * sigaction() call MUST occur after the call to sigaltstack(), and * in order to have profiling cover as much as possible, you want it * to occur right after the sigaltstack() call. */ handleSigProfState = s; sigemptyset (&sa.sa_mask); GC_setSigProfHandler (&sa); unless (sigaction (SIGPROF, &sa, NULL) == 0) diee ("initProfilingTime: sigaction failed"); /* Start the SIGPROF timer. */ setProfTimer (10000); } #endif /* atexitForProfiling is for writing out an mlmon.out file even if the C code * terminates abnormally, e.g. due to running out of memory. It will * only run if the usual SML profile atExit cleanup code did not * manage to run. */ static GC_state atexitForProfilingState; void atexitForProfiling (void) { GC_state s; if (DEBUG_PROFILE) fprintf (stderr, "atexitForProfiling ()\n"); s = atexitForProfilingState; if (s->profiling.isOn) { fprintf (stderr, "profiling is on\n"); profileWrite (s, s->profiling.data, "mlmon.out"); } } void initProfiling (GC_state s) { if (PROFILE_NONE == s->profiling.kind) s->profiling.isOn = FALSE; else { s->profiling.isOn = TRUE; assert (s->sourceMaps.frameSourcesLength == s->frameLayoutsLength); switch (s->profiling.kind) { case PROFILE_ALLOC: case PROFILE_COUNT: s->profiling.data = profileMalloc (s); break; case PROFILE_NONE: die ("impossible PROFILE_NONE"); break; case PROFILE_TIME_FIELD: case PROFILE_TIME_LABEL: initProfilingTime (s); break; default: assert (FALSE); } atexitForProfilingState = s; atexit (atexitForProfiling); } } void GC_profileDone (GC_state s) { GC_profileData p; GC_profileMasterIndex profileMasterIndex; if (DEBUG_PROFILE) fprintf (stderr, "GC_profileDone ()\n"); assert (s->profiling.isOn); if (PROFILE_TIME_FIELD == s->profiling.kind or PROFILE_TIME_LABEL == s->profiling.kind) setProfTimer (0); s->profiling.isOn = FALSE; p = s->profiling.data; if (s->profiling.stack) { uint32_t profileMasterLength = s->sourceMaps.sourcesLength + s->sourceMaps.sourceNamesLength; for (profileMasterIndex = 0; profileMasterIndex < profileMasterLength; profileMasterIndex++) { if (p->stack[profileMasterIndex].numOccurrences > 0) { if (DEBUG_PROFILE) fprintf (stderr, "done leaving %s\n", profileIndexSourceName (s, profileMasterIndex)); removeFromStackForProfiling (s, profileMasterIndex); } } } } GC_profileData GC_getProfileCurrent (GC_state s) { return s->profiling.data; } void GC_setProfileCurrent (GC_state s, GC_profileData p) { s->profiling.data = p; } mlton-20100608/runtime/gc/profiling.h0000644000076600000240000001131711404435622016001 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef enum { PROFILE_ALLOC, PROFILE_COUNT, PROFILE_NONE, PROFILE_TIME_FIELD, PROFILE_TIME_LABEL } GC_profileKind; /* If profileStack, then there is one struct GC_profileStack for each * function. */ typedef struct GC_profileStack { /* ticks counts ticks while the function was on the stack. */ uintmax_t ticks; /* ticksGC counts ticks in GC while the function was on the stack. */ uintmax_t ticksGC; /* lastTotal is the value of total when the oldest occurrence of f * on the stack was pushed, i.e., the most recent time that * numTimesOnStack changed from 0 to 1. lastTotal is used to * compute the amount to attribute to f when the oldest occurrence * is finally popped. */ uintmax_t lastTotal; /* lastTotalGC is like lastTotal, but for GC ticks. */ uintmax_t lastTotalGC; /* numOccurrences is the number of times this function is on the * stack. */ uintmax_t numOccurrences; } *GC_profileStack; typedef uint32_t GC_profileMasterIndex; /* GC_profileData is used for both time and allocation profiling. * In the comments below, "ticks" mean clock ticks with time profiling and * bytes allocated with allocation profiling. * * All of the arrays in GC_profileData are of length sourcesLength + sourceNamesLength. * The first sourceLength entries are for handling the duplicate copies of * functions, and the next sourceNamesLength entries are for the master versions. */ typedef struct GC_profileData { /* countTop is an array that counts for each function the number of * ticks that occurred while the function was on top of the stack. */ uintmax_t *countTop; /* stack is an array that gives stack info for each function. * It is only used if profileStack. */ struct GC_profileStack *stack; /* The total number of mutator ticks. */ uintmax_t total; /* The total number of GC ticks. */ uintmax_t totalGC; } *GC_profileData; struct GC_profiling { GC_profileData data; bool isOn; GC_profileKind kind; bool stack; }; #else struct GC_profileData; typedef struct GC_profileData *GC_profileData; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_profileMasterIndex sourceIndexToProfileMasterIndex (GC_state s, GC_sourceIndex i); static inline GC_sourceNameIndex profileMasterIndexToSourceNameIndex (GC_state s, GC_profileMasterIndex i); static inline GC_profileStack getProfileStackInfo (GC_state s, GC_profileMasterIndex i); static inline void addToStackForProfiling (GC_state s, GC_profileMasterIndex i); static inline void enterSourceForProfiling (GC_state s, GC_profileMasterIndex i); static inline void enterForProfiling (GC_state s, GC_sourceSeqIndex sourceSeqIndex); static inline void enterFrameForProfiling (GC_state s, GC_frameIndex i); static inline void removeFromStackForProfiling (GC_state s, GC_profileMasterIndex i); static inline void leaveSourceForProfiling (GC_state s, GC_profileMasterIndex i); static inline void leaveForProfiling (GC_state s, GC_sourceSeqIndex sourceSeqIndex); static inline void leaveFrameForProfiling (GC_state s, GC_frameIndex i); static inline void incForProfiling (GC_state s, size_t amount, GC_sourceSeqIndex sourceSeqIndex); static inline char* profileIndexSourceName (GC_state s, GC_sourceIndex i); static void writeProfileCount (GC_state s, FILE *f, GC_profileData p, GC_profileMasterIndex i); PRIVATE GC_profileData profileMalloc (GC_state s); PRIVATE void profileWrite (GC_state s, GC_profileData p, const char* fileName); PRIVATE void profileFree (GC_state s, GC_profileData p); static void setProfTimer (long usec); static void initProfilingTime (GC_state s); static void atexitForProfiling (void); static void initProfiling (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_profileEnter (GC_state s); PRIVATE void GC_profileLeave (GC_state s); PRIVATE void GC_profileInc (GC_state s, size_t amount); PRIVATE void GC_profileAllocInc (GC_state s, size_t amount); PRIVATE GC_profileData GC_getProfileCurrent (GC_state s); PRIVATE void GC_setProfileCurrent (GC_state s, GC_profileData p); PRIVATE GC_profileData GC_profileMalloc (GC_state s); PRIVATE void GC_profileWrite (GC_state s, GC_profileData p, NullString8_t fileName); PRIVATE void GC_profileFree (GC_state s, GC_profileData p); PRIVATE void GC_profileDone (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ PRIVATE void GC_handleSigProf (code_pointer pc); mlton-20100608/runtime/gc/read_write.c0000644000076600000240000000134011404435622016123 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ static inline objptr readObjptr (FILE *f) { objptr res; fread_safe (&res, sizeof(objptr), 1, f); return res; } static inline pointer readPointer (FILE *f) { uintptr_t res; fread_safe (&res, sizeof(uintptr_t), 1, f); return (pointer)res; } static inline void writeObjptr (FILE *f, objptr op) { fwrite_safe (&op, sizeof(objptr), 1, f); } static inline void writePointer (FILE *f, pointer p) { uintptr_t u = (uintptr_t)p; fwrite_safe (&u, sizeof(uintptr_t), 1, f); } mlton-20100608/runtime/gc/rusage.c0000644000076600000240000000442511404435622015273 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void rusageZero (struct rusage *ru) { memset (ru, 0, sizeof (*ru)); } void rusagePlusMax (struct rusage *ru1, struct rusage *ru2, struct rusage *ru) { const int million = 1000000; time_t sec, usec; sec = ru1->ru_utime.tv_sec + ru2->ru_utime.tv_sec; usec = ru1->ru_utime.tv_usec + ru2->ru_utime.tv_usec; sec += (usec / million); usec %= million; ru->ru_utime.tv_sec = sec; ru->ru_utime.tv_usec = usec; sec = ru1->ru_stime.tv_sec + ru2->ru_stime.tv_sec; usec = ru1->ru_stime.tv_usec + ru2->ru_stime.tv_usec; sec += (usec / million); usec %= million; ru->ru_stime.tv_sec = sec; ru->ru_stime.tv_usec = usec; } void rusageMinusMax (struct rusage *ru1, struct rusage *ru2, struct rusage *ru) { const int million = 1000000; time_t sec, usec; sec = (ru1->ru_utime.tv_sec - ru2->ru_utime.tv_sec) - 1; usec = ru1->ru_utime.tv_usec + million - ru2->ru_utime.tv_usec; sec += (usec / million); usec %= million; ru->ru_utime.tv_sec = sec; ru->ru_utime.tv_usec = usec; sec = (ru1->ru_stime.tv_sec - ru2->ru_stime.tv_sec) - 1; usec = ru1->ru_stime.tv_usec + million - ru2->ru_stime.tv_usec; sec += (usec / million); usec %= million; ru->ru_stime.tv_sec = sec; ru->ru_stime.tv_usec = usec; } uintmax_t rusageTime (struct rusage *ru) { uintmax_t result; result = 0; result += 1000 * ru->ru_utime.tv_sec; result += 1000 * ru->ru_stime.tv_sec; result += ru->ru_utime.tv_usec / 1000; result += ru->ru_stime.tv_usec / 1000; return result; } void startTiming (struct rusage *ru_start) { getrusage (RUSAGE_SELF, ru_start); } /* Accumulate and return time as number of milliseconds. */ uintmax_t stopTiming (struct rusage *ru_start, struct rusage *ru_acc) { struct rusage ru_finish, ru_total; getrusage (RUSAGE_SELF, &ru_finish); rusageMinusMax (&ru_finish, ru_start, &ru_total); rusagePlusMax (ru_acc, &ru_total, ru_acc); return rusageTime (&ru_total); } mlton-20100608/runtime/gc/rusage.h0000644000076600000240000000161711404435622015300 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void rusageZero (struct rusage *ru); static inline void rusagePlusMax (struct rusage *ru1, struct rusage *ru2, struct rusage *ru); static inline void rusageMinusMax (struct rusage *ru1, struct rusage *ru2, struct rusage *ru); static inline uintmax_t rusageTime (struct rusage *ru); static inline void startTiming (struct rusage *ru_start); static uintmax_t stopTiming (struct rusage *ru_start, struct rusage *ru_gc); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/share.c0000644000076600000240000000217311404435622015105 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void GC_share (GC_state s, pointer object) { size_t bytesExamined; size_t bytesHashConsed; enter (s); /* update stack in heap, in case it is reached */ if (DEBUG_SHARE) fprintf (stderr, "GC_share "FMTPTR"\n", (uintptr_t)object); if (DEBUG_SHARE or s->controls.messages) s->lastMajorStatistics.bytesHashConsed = 0; // Don't hash cons during the first round of marking. bytesExamined = dfsMarkByMode (s, object, MARK_MODE, FALSE, FALSE); s->objectHashTable = allocHashTable (s); // Hash cons during the second round of (un)marking. dfsMarkByMode (s, object, UNMARK_MODE, TRUE, FALSE); freeHashTable (s->objectHashTable); bytesHashConsed = s->lastMajorStatistics.bytesHashConsed; s->cumulativeStatistics.bytesHashConsed += bytesHashConsed; if (DEBUG_SHARE or s->controls.messages) printBytesHashConsedMessage (bytesHashConsed, bytesExamined); leave (s); } mlton-20100608/runtime/gc/share.h0000644000076600000240000000061211404435622015106 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_share (GC_state s, pointer object); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/signals.c0000644000076600000240000000162211404435622015441 0ustar mtfstaff/* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if not HAS_SIGALTSTACK void initSignalStack (__attribute__ ((unused)) GC_state s) { } #else void initSignalStack (GC_state s) { static bool init = FALSE; static stack_t altstack; if (! init) { init = TRUE; size_t ss_size = align (SIGSTKSZ, s->sysvals.pageSize); size_t psize = s->sysvals.pageSize; void *ss_sp = GC_mmapAnon_safe_protect (NULL, 2 * ss_size, psize, psize); altstack.ss_sp = (void*)((pointer)ss_sp + ss_size); altstack.ss_size = ss_size; altstack.ss_flags = 0; } sigaltstack (&altstack, NULL); } #endif void GC_initSignalStack (GC_state s) { initSignalStack (s); } mlton-20100608/runtime/gc/signals.h0000644000076600000240000000207611404435622015452 0ustar mtfstaff/* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_signalsInfo { /* TRUE iff a signal handler is running. */ bool amInSignalHandler; bool gcSignalHandled; bool gcSignalPending; /* TRUE iff a signal has been received but not handled by the * mutator. */ volatile uint32_t signalIsPending; /* The signals for which a mutator signal handler needs to run in * order to handle the signal. */ sigset_t signalsHandled; /* The signals that have been recieved but not processed by the * mutator signal handler. */ sigset_t signalsPending; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void initSignalStack (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ void GC_initSignalStack (GC_state s); mlton-20100608/runtime/gc/size.c0000644000076600000240000000120211404435622014745 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ size_t GC_size (GC_state s, pointer root) { size_t res; enter (s); /* update stack in heap, in case it is reached */ if (DEBUG_SIZE) fprintf (stderr, "GC_size marking\n"); res = dfsMarkByMode (s, root, MARK_MODE, FALSE, FALSE); if (DEBUG_SIZE) fprintf (stderr, "GC_size unmarking\n"); dfsMarkByMode (s, root, UNMARK_MODE, FALSE, FALSE); leave(s); return res; } mlton-20100608/runtime/gc/size.h0000644000076600000240000000061111404435622014755 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE size_t GC_size (GC_state s, pointer root); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/sources.c0000644000076600000240000000672411404435622015474 0ustar mtfstaff/* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ GC_sourceSeqIndex getCachedStackTopFrameSourceSeqIndex (GC_state s) { GC_frameIndex i; i = getCachedStackTopFrameIndex (s); assert(i < s->sourceMaps.frameSourcesLength); return s->sourceMaps.frameSources[i]; } char* getSourceName (GC_state s, GC_sourceIndex i) { assert (i < s->sourceMaps.sourcesLength); return s->sourceMaps.sourceNames[s->sourceMaps.sources[i].sourceNameIndex]; } char* GC_sourceName (GC_state s, GC_sourceIndex i) { return getSourceName (s, i); } #if HAS_TIME_PROFILING int compareSourceLabels (const void *v1, const void *v2) { const struct GC_sourceLabel* l1 = (const struct GC_sourceLabel*)v1; const struct GC_sourceLabel* l2 = (const struct GC_sourceLabel*)v2; uintptr_t ui1 = (uintptr_t)(l1->label); uintptr_t ui2 = (uintptr_t)(l2->label); if (ui1 < ui2) return -1; else if (ui1 == ui2) return 0; else /* if (ui1 > ui2) */ return 1; } void sortSourceLabels (GC_state s) { GC_sourceLabelIndex i; /* Sort sourceLabels by address. */ qsort (s->sourceMaps.sourceLabels, s->sourceMaps.sourceLabelsLength, sizeof (*s->sourceMaps.sourceLabels), compareSourceLabels); if (0 == s->sourceMaps.sourceLabels[s->sourceMaps.sourceLabelsLength - 1].label) die ("Max source label is 0 -- something is wrong."); if (ASSERT) for (i = 1; i < s->sourceMaps.sourceLabelsLength; i++) assert (s->sourceMaps.sourceLabels[i-1].label <= s->sourceMaps.sourceLabels[i].label); } void compressSourceLabels (GC_state s) { GC_sourceLabelIndex in, out, i; GC_sourceSeqIndex sourceSeqIndex; /* Eliminate duplicate sourceLabels */ out = 0; sourceSeqIndex = SOURCE_SEQ_UNKNOWN; for (in = 0; in < s->sourceMaps.sourceLabelsLength; ++in) { if (s->sourceMaps.sourceLabels[in].sourceSeqIndex != sourceSeqIndex) { s->sourceMaps.sourceLabels[out++] = s->sourceMaps.sourceLabels[in]; sourceSeqIndex = s->sourceMaps.sourceLabels[in].sourceSeqIndex; } } s->sourceMaps.sourceLabelsLength = out; if (DEBUG_SOURCES) for (i = 0; i < s->sourceMaps.sourceLabelsLength; i++) fprintf (stderr, FMTPTR" "FMTSSI"\n", (uintptr_t)s->sourceMaps.sourceLabels[i].label, s->sourceMaps.sourceLabels[i].sourceSeqIndex); } void initSourceLabels (GC_state s) { sortSourceLabels (s); compressSourceLabels (s); } #endif void showSources (GC_state s) { uint32_t i; uint32_t j; fprintf (stdout, "0x%08"PRIx32"\n", s->magic); fprintf (stdout, "%"PRIu32"\n", s->sourceMaps.sourceNamesLength); for (i = 0; i < s->sourceMaps.sourceNamesLength; i++) fprintf (stdout, "%s\n", s->sourceMaps.sourceNames[i]); fprintf (stdout, "%"PRIu32"\n", s->sourceMaps.sourcesLength); for (i = 0; i < s->sourceMaps.sourcesLength; i++) fprintf (stdout, "%"PRIu32" %"PRIu32"\n", s->sourceMaps.sources[i].sourceNameIndex, s->sourceMaps.sources[i].successorSourceSeqIndex); fprintf (stdout, "%"PRIu32"\n", s->sourceMaps.sourceSeqsLength); for (i = 0; i < s->sourceMaps.sourceSeqsLength; i++) { uint32_t *sourceSeq; sourceSeq = s->sourceMaps.sourceSeqs[i]; for (j = 1; j <= sourceSeq[0]; j++) fprintf (stdout, "%"PRIu32" ", sourceSeq[j]); fprintf (stdout, "\n"); } } mlton-20100608/runtime/gc/sources.h0000644000076600000240000000510511404435622015471 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) typedef uint32_t GC_sourceNameIndex; #define PRISNI PRIu32 #define FMTSNI "%"PRISNI typedef uint32_t GC_sourceLabelIndex; #define PRISLI PRIu32 #define FMTSLI "%"PRISLI typedef uint32_t GC_sourceIndex; #define PRISI PRIu32 #define FMTSI "%"PRISI #define SOURCES_INDEX_UNKNOWN 0 #define SOURCES_INDEX_GC 1 typedef uint32_t GC_sourceSeqIndex; #define PRISSI PRIu32 #define FMTSSI "%"PRISSI #define SOURCE_SEQ_UNKNOWN 0 #define SOURCE_SEQ_GC 1 typedef struct GC_source { GC_sourceNameIndex sourceNameIndex; GC_sourceSeqIndex successorSourceSeqIndex; } *GC_source; typedef struct GC_sourceLabel { code_pointer label; GC_sourceSeqIndex sourceSeqIndex; } *GC_sourceLabel; struct GC_sourceMaps { volatile GC_sourceSeqIndex curSourceSeqsIndex; /* frameSources is an array of cardinality frameLayoutsLength that * for each stack frame, gives an index into sourceSeqs of the * sequence of source functions corresponding to the frame. */ GC_sourceSeqIndex *frameSources; uint32_t frameSourcesLength; struct GC_sourceLabel *sourceLabels; uint32_t sourceLabelsLength; char **sourceNames; uint32_t sourceNamesLength; /* Each entry in sourceSeqs is a vector, whose first element is a * length, and subsequent elements index into sources. */ uint32_t **sourceSeqs; uint32_t sourceSeqsLength; /* sources is an array of cardinality sourcesLength. Each entry * specifies an index into sourceNames and an index into sourceSeqs, * giving the name of the function and the successors, respectively. */ struct GC_source *sources; uint32_t sourcesLength; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline GC_sourceSeqIndex getCachedStackTopFrameSourceSeqIndex (GC_state s); static inline char* getSourceName (GC_state s, GC_sourceIndex i); #if HAS_TIME_PROFILING static inline int compareSourceLabels (const void *v1, const void *v2); static void sortSourceLabels (GC_state s); static void compressSourceLabels (GC_state s); static void initSourceLabels (GC_state s); #endif static void showSources (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE char* GC_sourceName (GC_state s, GC_sourceIndex i); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/stack.c0000644000076600000240000001643511404435622015116 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void displayStack (__attribute__ ((unused)) GC_state s, GC_stack stack, FILE *stream) { fprintf(stream, "\t\treserved = %"PRIuMAX"\n" "\t\tused = %"PRIuMAX"\n", (uintmax_t)stack->reserved, (uintmax_t)stack->used); } bool isStackEmpty (GC_stack stack) { return 0 == stack->used; } #if ASSERT bool isStackReservedAligned (GC_state s, size_t reserved) { return isAligned (GC_STACK_HEADER_SIZE + sizeof (struct GC_stack) + reserved, s->alignment); } #endif /* sizeofStackSlop returns the amount of "slop" space needed between * the top of the stack and the end of the stack space. */ size_t sizeofStackSlop (GC_state s) { return (size_t)(2 * s->maxFrameSize); } /* Pointer to the bottommost word in use on the stack. */ pointer getStackBottom (__attribute__ ((unused)) GC_state s, GC_stack stack) { pointer res; res = ((pointer)stack) + sizeof (struct GC_stack); assert (isAligned ((size_t)res, s->alignment)); return res; } /* Pointer to the topmost word in use on the stack. */ pointer getStackTop (GC_state s, GC_stack stack) { pointer res; res = getStackBottom (s, stack) + stack->used; assert (isAligned ((size_t)res, s->alignment)); return res; } /* Pointer to the end of stack. */ pointer getStackLimitPlusSlop (GC_state s, GC_stack stack) { pointer res; res = getStackBottom (s, stack) + stack->reserved; // assert (isAligned ((size_t)res, s->alignment)); return res; } /* The maximum value which is valid for stackTop. */ pointer getStackLimit (GC_state s, GC_stack stack) { pointer res; res = getStackLimitPlusSlop (s, stack) - sizeofStackSlop (s); // assert (isAligned ((size_t)res, s->alignment)); return res; } GC_frameIndex getCachedStackTopFrameIndex (GC_state s) { GC_frameIndex res; res = getFrameIndexFromReturnAddress (s, *((GC_returnAddress*)(s->stackTop - GC_RETURNADDRESS_SIZE))); return res; } GC_frameLayout getCachedStackTopFrameLayout (GC_state s) { GC_frameLayout layout; layout = getFrameLayoutFromFrameIndex (s, getCachedStackTopFrameIndex (s)); return layout; } GC_frameIndex getStackTopFrameIndex (GC_state s, GC_stack stack) { GC_frameIndex res; res = getFrameIndexFromReturnAddress (s, *((GC_returnAddress*)(getStackTop (s, stack) - GC_RETURNADDRESS_SIZE))); return res; } GC_frameLayout getStackTopFrameLayout (GC_state s, GC_stack stack) { GC_frameLayout layout; layout = getFrameLayoutFromFrameIndex (s, getStackTopFrameIndex (s, stack)); return layout; } uint16_t getStackTopFrameSize (GC_state s, GC_stack stack) { GC_frameLayout layout; assert (not (isStackEmpty (stack))); layout = getStackTopFrameLayout (s, stack); return layout->size; } size_t alignStackReserved (GC_state s, size_t reserved) { size_t res; res = alignWithExtra (s, reserved, GC_STACK_HEADER_SIZE + sizeof (struct GC_stack)); if (DEBUG_STACKS) fprintf (stderr, "%"PRIuMAX" = alignStackReserved (%"PRIuMAX")\n", (uintmax_t)res, (uintmax_t)reserved); assert (isStackReservedAligned (s, res)); return res; } size_t sizeofStackWithHeader (__attribute__ ((unused)) GC_state s, size_t reserved) { size_t res; assert (isStackReservedAligned (s, reserved)); res = GC_STACK_HEADER_SIZE + sizeof (struct GC_stack) + reserved; if (DEBUG_STACKS) fprintf (stderr, "%"PRIuMAX" = sizeofStackWithHeader (%"PRIuMAX")\n", (uintmax_t)res, (uintmax_t)reserved); assert (isAligned (res, s->alignment)); return res; } size_t sizeofStackInitialReserved (GC_state s) { size_t res; res = alignStackReserved(s, sizeofStackSlop (s)); return res; } size_t sizeofStackMinimumReserved (GC_state s, GC_stack stack) { size_t res; res = alignStackReserved (s, stack->used + sizeofStackSlop (s) - getStackTopFrameSize (s, stack)); return res; } size_t sizeofStackGrowReserved (GC_state s, GC_stack stack) { double reservedD; size_t reservedGrow, reservedMin, reservedNew; const size_t RESERVED_MAX = (SIZE_MAX >> 2); assert (isStackReservedAligned (s, stack->reserved)); reservedD = (double)(stack->reserved); double reservedGrowD = (double)s->controls.ratios.stackCurrentGrow * reservedD; reservedGrow = reservedGrowD > (double)RESERVED_MAX ? RESERVED_MAX : (size_t)reservedGrowD; reservedMin = sizeofStackMinimumReserved (s, stack); reservedNew = alignStackReserved (s, max (reservedGrow, reservedMin)); assert (isStackReservedAligned (s, reservedNew)); return reservedNew; } size_t sizeofStackShrinkReserved (GC_state s, GC_stack stack, bool current) { double usedD, reservedD; size_t reservedMax, reservedShrink, reservedMin, reservedNew; const size_t RESERVED_MAX = (SIZE_MAX >> 2); assert (isStackReservedAligned (s, stack->reserved)); usedD = (double)(stack->used); reservedD = (double)(stack->reserved); if (current) { /* Shrink current stacks. */ double reservedMaxD = (double)(s->controls.ratios.stackCurrentMaxReserved) * usedD; reservedMax = reservedMaxD > (double)RESERVED_MAX ? RESERVED_MAX : (size_t)reservedMaxD; double reservedPermitD = (double)(s->controls.ratios.stackCurrentPermitReserved) * usedD; size_t reservedPermit = reservedPermitD > (double)RESERVED_MAX ? RESERVED_MAX : (size_t)reservedPermitD; reservedShrink = (stack->reserved <= reservedPermit) ? stack->reserved : (size_t)((double)(s->controls.ratios.stackCurrentShrink) * reservedD); reservedMin = sizeofStackMinimumReserved (s, stack); } else { /* Shrink paused stacks. */ double reservedMaxD = (double)(s->controls.ratios.stackMaxReserved) * usedD; reservedMax = reservedMaxD > (double)RESERVED_MAX ? RESERVED_MAX : (size_t)reservedMaxD; reservedShrink = (size_t)((double)s->controls.ratios.stackShrink * reservedD); reservedMin = stack->used; } reservedNew = alignStackReserved (s, max(min(reservedMax,reservedShrink),reservedMin)); /* It's possible that reservedNew > stack->reserved for the current * stack if the stack invariant is violated. In that case, we want * to leave the stack alone, because some other part of the gc will * grow the stack. We cannot do any growing here because we may run * out of to space. */ assert (current or reservedNew <= stack->reserved); reservedNew = min (stack->reserved, reservedNew); assert (isStackReservedAligned (s, reservedNew)); return reservedNew; } void copyStack (GC_state s, GC_stack from, GC_stack to) { pointer fromBottom, toBottom; fromBottom = getStackBottom (s, from); toBottom = getStackBottom (s, to); assert (from->used <= to->reserved); to->used = from->used; if (DEBUG_STACKS) fprintf (stderr, "stackCopy from "FMTPTR" to "FMTPTR" of length %"PRIuMAX"\n", (uintptr_t)fromBottom, (uintptr_t)toBottom, (uintmax_t)from->used); GC_memcpy (fromBottom, toBottom, from->used); } mlton-20100608/runtime/gc/stack.h0000644000076600000240000000642411404435622015120 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Stack objects have the following layout: * * header :: * markTop (native-pointer) :: * markIndex (word32) :: * reserved :: * used :: * ... reserved bytes ... * * The markTop and markIndex are used by the mark-compact GC. The * reserved size gives the number of bytes for the stack (before the * next ML object). The used size gives the number of bytes currently * used by the stack. The sequence of reserved bytes correspond to ML * stack frames, which will be discussed in more detail in "frame.h". */ typedef struct GC_stack { /* markTop and markIndex are only used during marking. They record * the current pointer in the stack that is being followed. markTop * points to the top of the stack frame containing the pointer and * markIndex is the index in that frame's frameOffsets of the pointer * slot. So, when the GC pointer reversal gets back to the stack, * it can continue with the next pointer (either in the current * frame or the next frame). */ pointer markTop; uint32_t markIndex; /* reserved is the number of bytes reserved for stack, * i.e. its maximum size. */ size_t reserved; /* used is the number of bytes used by the stack. * Stacks with used == reserved are continuations. */ size_t used; /* The next address is the bottom of the stack, and the following * reserved bytes hold space for the stack. */ } *GC_stack; #define GC_STACK_HEADER_SIZE GC_HEADER_SIZE #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void displayStack (GC_state s, GC_stack stack, FILE *stream); static inline bool isStackEmpty (GC_stack stack); #if ASSERT static inline bool isStackReservedAligned (GC_state s, size_t reserved); #endif static inline size_t sizeofStackSlop (GC_state s); static inline pointer getStackBottom (GC_state s, GC_stack stack); static inline pointer getStackTop (GC_state s, GC_stack stack); static inline pointer getStackLimitPlusSlop (GC_state s, GC_stack stack); static inline pointer getStackLimit (GC_state s, GC_stack stack); static inline GC_frameIndex getCachedStackTopFrameIndex (GC_state s); static inline GC_frameLayout getCachedStackTopFrameLayout (GC_state s); static inline GC_frameIndex getStackTopFrameIndex (GC_state s, GC_stack stack); static inline GC_frameLayout getStackTopFrameLayout (GC_state s, GC_stack stack); static inline uint16_t getStackTopFrameSize (GC_state s, GC_stack stack); static inline size_t alignStackReserved (GC_state s, size_t reserved); static inline size_t sizeofStackWithHeader (GC_state s, size_t reserved); static inline size_t sizeofStackInitialReserved (GC_state s); static inline size_t sizeofStackMinimumReserved (GC_state s, GC_stack stack); static inline size_t sizeofStackGrowReserved (GC_state s, GC_stack stack); static inline size_t sizeofStackShrinkReserved (GC_state s, GC_stack stack, bool current); static inline void copyStack (GC_state s, GC_stack from, GC_stack to); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/statistics.c0000644000076600000240000000037211404435622016174 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ mlton-20100608/runtime/gc/statistics.h0000644000076600000240000000245511404435622016205 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_cumulativeStatistics { uintmax_t bytesAllocated; uintmax_t bytesCopied; uintmax_t bytesCopiedMinor; uintmax_t bytesHashConsed; uintmax_t bytesMarkCompacted; uintmax_t bytesScannedMinor; size_t maxBytesLive; size_t maxHeapSize; uintmax_t maxPauseTime; size_t maxStackSize; uintmax_t numCardsMarked; /* Number of marked cards seen during minor GCs. */ uintmax_t numGCs; uintmax_t numCopyingGCs; uintmax_t numHashConsGCs; uintmax_t numMarkCompactGCs; uintmax_t numMinorGCs; struct rusage ru_gc; /* total resource usage in gc. */ struct rusage ru_gcCopying; /* resource usage in major copying gcs. */ struct rusage ru_gcMarkCompact; /* resource usage in major mark-compact gcs. */ struct rusage ru_gcMinor; /* resource usage in minor copying gcs. */ }; struct GC_lastMajorStatistics { size_t bytesHashConsed; size_t bytesLive; /* Number of bytes live at most recent major GC. */ GC_majorKind kind; uintmax_t numMinorGCs; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20100608/runtime/gc/string.c0000644000076600000240000000047311404435622015312 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ GC_header GC_stringHeader (void) { return GC_STRING_HEADER; } mlton-20100608/runtime/gc/string.h0000644000076600000240000000231511404435622015314 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* Layout of strings. * Note, the value passed around is a pointer to the obj member. */ typedef struct GC_string8 { GC_arrayCounter counter; GC_arrayLength length; GC_header header; union { struct { char chars[1]; } body; pointerAux _p; /* alignment */ } obj; } __attribute__ ((packed)) *GC_string8; COMPILE_TIME_ASSERT(GC_string8__obj_packed, offsetof(struct GC_string8, obj) == sizeof(GC_arrayCounter) + sizeof(GC_arrayLength) + sizeof(GC_header)); COMPILE_TIME_ASSERT(GC_string8__obj_body_chars_packed, offsetof(struct GC_string8, obj.body.chars) == offsetof(struct GC_string8, obj)); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) #define GC_STRING8_HEADER GC_WORD8_VECTOR_HEADER #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/switch-thread.c0000644000076600000240000000466311404435622016557 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void switchToThread (GC_state s, objptr op) { if (DEBUG_THREADS) { GC_thread thread; GC_stack stack; thread = (GC_thread)(objptrToPointer (op, s->heap.start) + offsetofThread (s)); stack = (GC_stack)(objptrToPointer (thread->stack, s->heap.start)); fprintf (stderr, "switchToThread ("FMTOBJPTR") used = %"PRIuMAX " reserved = %"PRIuMAX"\n", op, (uintmax_t)stack->used, (uintmax_t)stack->reserved); } s->currentThread = op; setGCStateCurrentThreadAndStack (s); } void GC_switchToThread (GC_state s, pointer p, size_t ensureBytesFree) { if (DEBUG_THREADS) fprintf (stderr, "GC_switchToThread ("FMTPTR", %"PRIuMAX")\n", (uintptr_t)p, (uintmax_t)ensureBytesFree); if (FALSE) { /* This branch is slower than the else branch, especially * when debugging is turned on, because it does an invariant * check on every thread switch. * So, we'll stick with the else branch for now. */ enter (s); getThreadCurrent(s)->bytesNeeded = ensureBytesFree; switchToThread (s, pointerToObjptr(p, s->heap.start)); s->atomicState--; switchToSignalHandlerThreadIfNonAtomicAndSignalPending (s); ensureInvariantForMutator (s, FALSE); assert (invariantForMutatorFrontier(s)); assert (invariantForMutatorStack(s)); leave (s); } else { /* BEGIN: enter(s); */ getStackCurrent(s)->used = sizeofGCStateCurrentStackUsed (s); getThreadCurrent(s)->exnStack = s->exnStack; beginAtomic (s); /* END: enter(s); */ getThreadCurrent(s)->bytesNeeded = ensureBytesFree; switchToThread (s, pointerToObjptr(p, s->heap.start)); s->atomicState--; switchToSignalHandlerThreadIfNonAtomicAndSignalPending (s); /* BEGIN: ensureInvariantForMutator */ if (not (invariantForMutatorFrontier(s)) or not (invariantForMutatorStack(s))) { /* This GC will grow the stack, if necessary. */ performGC (s, 0, getThreadCurrent(s)->bytesNeeded, FALSE, TRUE); } /* END: ensureInvariantForMutator */ /* BEGIN: leave(s); */ endAtomic (s); /* END: leave(s); */ } assert (invariantForMutatorFrontier(s)); assert (invariantForMutatorStack(s)); } mlton-20100608/runtime/gc/switch-thread.h0000644000076600000240000000107511404435622016556 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void switchToThread (GC_state s, objptr op); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_switchToThread (GC_state s, pointer p, size_t ensureBytesFree); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/sysvals.h0000644000076600000240000000064311404435622015514 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_sysvals { size_t ram; size_t pageSize; uintmax_t physMem; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ mlton-20100608/runtime/gc/thread.c0000644000076600000240000000270511404435622015253 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void displayThread (GC_state s, GC_thread thread, FILE *stream) { fprintf(stream, "\t\texnStack = %"PRIuMAX"\n" "\t\tbytesNeeded = %"PRIuMAX"\n" "\t\tstack = "FMTOBJPTR"\n", (uintmax_t)thread->exnStack, (uintmax_t)thread->bytesNeeded, thread->stack); displayStack (s, (GC_stack)(objptrToPointer (thread->stack, s->heap.start)), stream); } size_t sizeofThread (GC_state s) { size_t res; res = GC_NORMAL_HEADER_SIZE + sizeof (struct GC_thread); res = align (res, s->alignment); if (DEBUG) { size_t check; uint16_t bytesNonObjptrs, numObjptrs; splitHeader (s, GC_THREAD_HEADER, NULL, NULL, &bytesNonObjptrs, &numObjptrs); check = GC_NORMAL_HEADER_SIZE + (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)); if (DEBUG_DETAILED) fprintf (stderr, "sizeofThread: res = %"PRIuMAX" check = %"PRIuMAX"\n", (uintmax_t)res, (uintmax_t)check); assert (check == res); } assert (isAligned (res, s->alignment)); return res; } size_t offsetofThread (GC_state s) { return (sizeofThread (s)) - (GC_NORMAL_HEADER_SIZE + sizeof (struct GC_thread)); } mlton-20100608/runtime/gc/thread.h0000644000076600000240000000323111404435622015253 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Thread objects are normal objects with the following layout: * * header :: * padding :: * bytesNeeded (size_t) :: * exnStack (size_t) :: * stack (object-pointer) * * There may be zero or more bytes of padding for alignment purposes. * * The bytesNeeded size_t is the number of bytes needed when returning * to this thread. * * The exnStack size_t is an offset added to stackBottom that * specifies the top of the exnStack. * * The final component is the stack object-pointer. * * Note that the order of the fields is important. The non-objptr * fields must be first, because a thread object must appear to be a * normal object. */ typedef struct GC_thread { size_t bytesNeeded; size_t exnStack; objptr stack; } __attribute__ ((packed)) *GC_thread; COMPILE_TIME_ASSERT(GC_thread__packed, sizeof(struct GC_thread) == sizeof(size_t) + sizeof(size_t) + sizeof(objptr)); #define BOGUS_EXN_STACK ((size_t)(-1)) #else struct GC_thread; typedef struct GC_thread *GC_thread; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void displayThread (GC_state s, GC_thread thread, FILE *stream); static inline size_t sizeofThread (GC_state s); static inline size_t offsetofThread (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/translate.c0000644000076600000240000000263011404435622015776 0ustar mtfstaff/* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* ---------------------------------------------------------------- */ /* translateHeap */ /* ---------------------------------------------------------------- */ void translateObjptr (GC_state s, objptr *opp) { pointer p; pointer from, to; from = s->translateState.from; to = s->translateState.to; p = objptrToPointer (*opp, from); p = (p - from) + to; *opp = pointerToObjptr (p, to); } /* translateHeap (s, from, to, size) */ void translateHeap (GC_state s, pointer from, pointer to, size_t size) { pointer limit; if (from == to) return; if (DEBUG or s->controls.messages) fprintf (stderr, "[GC: Translating old-gen of size %s bytes of heap at "FMTPTR" from "FMTPTR".]\n", uintmaxToCommaString(size), (uintptr_t)to, (uintptr_t)from); s->translateState.from = from; s->translateState.to = to; /* Translate globals and heap. */ foreachGlobalObjptr (s, translateObjptr); limit = to + size; foreachObjptrInRange (s, alignFrontier (s, to), &limit, translateObjptr, FALSE); } mlton-20100608/runtime/gc/translate.h0000644000076600000240000000117311404435622016004 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) struct GC_translateState { pointer from; pointer to; }; #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline void translateObjptr (GC_state s, objptr *opp); static void translateHeap (GC_state s, pointer from, pointer to, size_t size); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ mlton-20100608/runtime/gc/virtual-memory.c0000644000076600000240000000300111404435622016766 0ustar mtfstaff/* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void *GC_mmapAnon_safe (void *p, size_t length) { void *result; result = GC_mmapAnon (p, length); if ((void*)-1 == result) { GC_displayMem (); die ("Out of memory. Unable to allocate %s bytes.\n", uintmaxToCommaString(length)); } return result; } static inline void GC_memcpy (pointer src, pointer dst, size_t size) { if (DEBUG_DETAILED) fprintf (stderr, "GC_memcpy ("FMTPTR", "FMTPTR", %"PRIuMAX")\n", (uintptr_t)src, (uintptr_t)dst, (uintmax_t)size); assert (isAligned ((size_t)src, sizeof(unsigned int))); assert (isAligned ((size_t)dst, sizeof(unsigned int))); assert (isAligned (size, sizeof(unsigned int))); assert (! (src <= dst and dst < src + size)); assert (! (dst <= src and src < dst + size)); memcpy (dst, src, size); } static inline void GC_memmove (pointer src, pointer dst, size_t size) { if (DEBUG_DETAILED) fprintf (stderr, "GC_memmove ("FMTPTR", "FMTPTR", %"PRIuMAX")\n", (uintptr_t)src, (uintptr_t)dst, (uintmax_t)size); assert (isAligned ((size_t)src, sizeof(unsigned int))); assert (isAligned ((size_t)dst, sizeof(unsigned int))); assert (isAligned (size, sizeof(unsigned int))); if (src == dst) return; memmove (dst, src, size); } mlton-20100608/runtime/gc/weak.c0000644000076600000240000000376711404435622014744 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ size_t sizeofWeak (GC_state s) { size_t res; res = GC_NORMAL_HEADER_SIZE + sizeof (struct GC_weak); res = align (res, s->alignment); if (DEBUG) { size_t check; uint16_t bytesNonObjptrs, numObjptrs; splitHeader (s, GC_WEAK_GONE_HEADER, NULL, NULL, &bytesNonObjptrs, &numObjptrs); check = GC_NORMAL_HEADER_SIZE + (bytesNonObjptrs + (numObjptrs * OBJPTR_SIZE)); if (DEBUG_DETAILED) fprintf (stderr, "sizeofWeak: res = %"PRIuMAX" check = %"PRIuMAX"\n", (uintmax_t)res, (uintmax_t)check); assert (check == res); } assert (isAligned (res, s->alignment)); return res; } size_t offsetofWeak (GC_state s) { return (sizeofWeak (s)) - (GC_NORMAL_HEADER_SIZE + sizeof (struct GC_weak)); } uint32_t GC_weakCanGet (__attribute__ ((unused)) GC_state s, pointer p) { uint32_t res; res = GC_WEAK_GONE_HEADER != getHeader (p); if (DEBUG_WEAK) fprintf (stderr, "%s = GC_weakCanGet ("FMTPTR")\n", boolToString (res), (uintptr_t)p); return res; } pointer GC_weakGet (GC_state s, pointer p) { GC_weak weak; pointer res; weak = (GC_weak)(p + offsetofWeak (s)); res = objptrToPointer(weak->objptr, s->heap.start); if (DEBUG_WEAK) fprintf (stderr, FMTPTR" = GC_weakGet ("FMTPTR")\n", (uintptr_t)res, (uintptr_t)p); return res; } pointer GC_weakNew (GC_state s, GC_header header, pointer p) { GC_weak weak; pointer res; res = newObject (s, header, sizeofWeak (s), FALSE); weak = (GC_weak)(res + offsetofWeak (s)); weak->objptr = pointerToObjptr(p, s->heap.start); if (DEBUG_WEAK) fprintf (stderr, FMTPTR" = GC_weakNew ("FMTHDR", "FMTPTR")\n", (uintptr_t)res, header, (uintptr_t)p); return (pointer)res; } mlton-20100608/runtime/gc/weak.h0000644000076600000240000000351011404435622014733 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_TYPES)) /* * Weak objects have the following layout: * * header :: * padding :: * link (native-pointer) :: * objptr (object-pointer) * * The object type indexed by the header determines whether the weak * is valid or not. If the type has numObjptrs == 1, then the weak * pointer is valid. Otherwise, the type has numObjptrs == 0 and the * weak pointer is not valid. * * There may be zero or more bytes of padding for alignment purposes. * * The link native-pointer is used to chain the live weaks together * during a copying/mark-compact gc and is otherwise unused. * * The final component is the weak object-pointer. * * Note that the order of the fields is important. The non-objptr * field must be first, because a weak object is sometimes treated as * a normal object. */ typedef struct GC_weak { struct GC_weak *link; objptr objptr; } __attribute__ ((packed)) *GC_weak; COMPILE_TIME_ASSERT(GC_weak__packed, sizeof(struct GC_weak) == sizeof(struct GC_weak*) + sizeof(objptr)); #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static inline size_t sizeofWeak (GC_state s); static inline size_t offsetofWeak (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE uint32_t GC_weakCanGet (GC_state s, pointer p); PRIVATE pointer GC_weakGet (GC_state s, pointer p); PRIVATE pointer GC_weakNew (GC_state s, GC_header header, pointer p); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc/world.c0000644000076600000240000000715011404435622015132 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ void loadWorldFromFILE (GC_state s, FILE *f) { uint32_t magic; pointer start; if (DEBUG_WORLD) fprintf (stderr, "loadWorldFromFILE\n"); until (readChar (f) == '\000') ; magic = readUint32 (f); unless (s->magic == magic) die ("Invalid world: wrong magic number."); start = readPointer (f); s->heap.oldGenSize = readSize (f); s->atomicState = readUint32 (f); s->callFromCHandlerThread = readObjptr (f); s->currentThread = readObjptr (f); s->signalHandlerThread = readObjptr (f); createHeap (s, &s->heap, sizeofHeapDesired (s, s->heap.oldGenSize, 0), s->heap.oldGenSize); setCardMapAndCrossMap (s); fread_safe (s->heap.start, 1, s->heap.oldGenSize, f); if ((*(s->loadGlobals)) (f) != 0) diee("couldn't load globals"); // unless (EOF == fgetc (file)) // die ("Invalid world: junk at end of file."); /* translateHeap must occur after loading the heap and globals, * since it changes pointers in all of them. */ translateHeap (s, start, s->heap.start, s->heap.oldGenSize); setGCStateCurrentHeap (s, 0, 0); setGCStateCurrentThreadAndStack (s); } void loadWorldFromFileName (GC_state s, const char *fileName) { FILE *f; if (DEBUG_WORLD) fprintf (stderr, "loadWorldFromFileName (%s)\n", fileName); f = fopen_safe (fileName, "rb"); loadWorldFromFILE (s, f); fclose_safe (f); } /* Don't use 'safe' functions, because we don't want the ML program to die. * Instead, check return values, and propogate them up to SML for an exception. */ int saveWorldToFILE (GC_state s, FILE *f) { char buf[128]; size_t len; if (DEBUG_WORLD) fprintf (stderr, "saveWorldToFILE\n"); /* Compact the heap. */ performGC (s, 0, 0, TRUE, TRUE); snprintf (buf, cardof(buf), "Heap file created by MLton.\nheap.start = "FMTPTR"\nbytesLive = %"PRIuMAX"\n", (uintptr_t)s->heap.start, (uintmax_t)s->lastMajorStatistics.bytesLive); len = strlen(buf) + 1; /* +1 to get the '\000' */ if (fwrite (buf, 1, len, f) != len) return -1; if (fwrite (&s->magic, sizeof(uint32_t), 1, f) != 1) return -1; if (fwrite (&s->heap.start, sizeof(uintptr_t), 1, f) != 1) return -1; if (fwrite (&s->heap.oldGenSize, sizeof(size_t), 1, f) != 1) return -1; /* atomicState must be saved in the heap, because the saveWorld may * be run in the context of a critical section, which will expect to * be in the same context when it is restored. */ if (fwrite (&s->atomicState, sizeof(uint32_t), 1, f) != 1) return -1; if (fwrite (&s->callFromCHandlerThread, sizeof(objptr), 1, f) != 1) return -1; if (fwrite (&s->currentThread, sizeof(objptr), 1, f) != 1) return -1; if (fwrite (&s->signalHandlerThread, sizeof(objptr), 1, f) != 1) return -1; if (fwrite (s->heap.start, 1, s->heap.oldGenSize, f) != s->heap.oldGenSize) return -1; if ((*(s->saveGlobals)) (f) != 0) return -1; return 0; } void GC_saveWorld (GC_state s, NullString8_t fileName) { FILE *f; enter (s); f = fopen ((const char*)fileName, "wb"); if (f == 0) { s->saveWorldStatus = false; goto done; } if (saveWorldToFILE (s, f) != 0) { s->saveWorldStatus = false; goto done; } if (fclose (f) != 0) { s->saveWorldStatus = false; goto done; } s->saveWorldStatus = true; done: leave (s); return; } C_Errno_t(Bool_t) GC_getSaveWorldStatus (GC_state s) { return (Bool_t)(s->saveWorldStatus); } mlton-20100608/runtime/gc/world.h0000644000076600000240000000140311404435622015132 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #if (defined (MLTON_GC_INTERNAL_FUNCS)) static void loadWorldFromFILE (GC_state s, FILE *f); static void loadWorldFromFileName (GC_state s, const char *fileName); static int saveWorldToFILE (GC_state s, FILE *f); #endif /* (defined (MLTON_GC_INTERNAL_FUNCS)) */ #if (defined (MLTON_GC_INTERNAL_BASIS)) PRIVATE void GC_saveWorld (GC_state s, NullString8_t fileName); /* TRUE = success, FALSE = failure */ PRIVATE C_Errno_t(Bool_t) GC_getSaveWorldStatus (GC_state s); #endif /* (defined (MLTON_GC_INTERNAL_BASIS)) */ mlton-20100608/runtime/gc.c0000644000076600000240000000321111404435622013775 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #define MLTON_GC_INTERNAL_TYPES #define MLTON_GC_INTERNAL_FUNCS #define MLTON_GC_INTERNAL_BASIS #include "platform.h" #include "gc/virtual-memory.c" #include "gc/align.c" #include "gc/read_write.c" /* Import the global gcState (but try not to use it too much). */ extern struct GC_state gcState; #include "gc/array-allocate.c" #include "gc/array.c" #include "gc/atomic.c" #include "gc/call-stack.c" #include "gc/cheney-copy.c" #include "gc/controls.c" #include "gc/copy-thread.c" #include "gc/current.c" #include "gc/dfs-mark.c" #include "gc/done.c" #include "gc/enter_leave.c" #include "gc/foreach.c" #include "gc/forward.c" #include "gc/frame.c" #include "gc/garbage-collection.c" #include "gc/gc_state.c" #include "gc/generational.c" #include "gc/handler.c" #include "gc/hash-cons.c" #include "gc/heap.c" #include "gc/heap_predicates.c" #include "gc/init-world.c" #include "gc/init.c" #include "gc/int-inf.c" #include "gc/invariant.c" #include "gc/mark-compact.c" #include "gc/model.c" #include "gc/new-object.c" #include "gc/object-size.c" #include "gc/object.c" #include "gc/objptr.c" #include "gc/pack.c" #include "gc/pointer.c" #include "gc/profiling.c" #include "gc/rusage.c" #include "gc/share.c" #include "gc/signals.c" #include "gc/size.c" #include "gc/sources.c" #include "gc/stack.c" #include "gc/switch-thread.c" #include "gc/thread.c" #include "gc/translate.c" #include "gc/weak.c" #include "gc/world.c" mlton-20100608/runtime/gc.h0000644000076600000240000000341311404435622014006 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_GC_H_ #define _MLTON_GC_H_ #include "platform.h" struct GC_state; typedef struct GC_state *GC_state; typedef GC_state GCState_t; #if POINTER_BITS == 32 #define GC_MODEL_NATIVE32 #elif POINTER_BITS == 64 #define GC_MODEL_NATIVE64 #else #error POINTER_BITS not defined #endif #include "gc/debug.h" #include "gc/align.h" #include "gc/model.h" #include "gc/pointer.h" #include "gc/objptr.h" #include "gc/object.h" #include "gc/array.h" #include "gc/frame.h" #include "gc/stack.h" #include "gc/thread.h" #include "gc/weak.h" #include "gc/int-inf.h" #include "gc/string.h" #include "gc/object-size.h" #include "gc/generational.h" #include "gc/heap.h" #include "gc/current.h" #include "gc/foreach.h" #include "gc/translate.h" #include "gc/sysvals.h" #include "gc/controls.h" #include "gc/major.h" #include "gc/statistics.h" #include "gc/forward.h" #include "gc/cheney-copy.h" #include "gc/hash-cons.h" #include "gc/dfs-mark.h" #include "gc/mark-compact.h" #include "gc/invariant.h" #include "gc/atomic.h" #include "gc/enter_leave.h" #include "gc/signals.h" #include "gc/handler.h" #include "gc/switch-thread.h" #include "gc/garbage-collection.h" #include "gc/new-object.h" #include "gc/array-allocate.h" #include "gc/sources.h" #include "gc/call-stack.h" #include "gc/profiling.h" #include "gc/rusage.h" #include "gc/gc_state.h" #include "gc/init-world.h" #include "gc/world.h" #include "gc/init.h" #include "gc/done.h" #include "gc/copy-thread.h" #include "gc/pack.h" #include "gc/size.h" #include "gc/share.h" #endif /* _MLTON_GC_H_ */ mlton-20100608/runtime/gdtoa-patch0000644000076600000240000007174211404435622015374 0ustar mtfstaffdiff -u gdtoa.orig/arithchk.c gdtoa/arithchk.c --- gdtoa.orig/arithchk.c 1998-06-19 20:46:11 +0000 +++ gdtoa/arithchk.c 2008-10-04 02:01:43 +0000 @@ -136,7 +136,7 @@ return b == 0.; } -main() +int main() { Akind *a = 0; int Ldef = 0; diff -u gdtoa.orig/dmisc.c gdtoa/dmisc.c --- gdtoa.orig/dmisc.c 1998-11-02 19:34:31 +0000 +++ gdtoa/dmisc.c 2008-10-04 02:01:43 +0000 @@ -89,9 +89,9 @@ void #ifdef KR_headers -freedtoa(s) char *s; +gdtoa__freedtoa(s) char *s; #else -freedtoa(char *s) +gdtoa__freedtoa(char *s) #endif { Bigint *b = (Bigint *)((int *)s - 1); diff -u gdtoa.orig/dtoa.c gdtoa/dtoa.c --- gdtoa.orig/dtoa.c 2000-11-02 15:09:01 +0000 +++ gdtoa/dtoa.c 2008-10-04 02:01:43 +0000 @@ -80,7 +80,7 @@ #endif char * -dtoa +gdtoa__dtoa #ifdef KR_headers (d, mode, ndigits, decpt, sign, rve) double d; int mode, ndigits, *decpt, *sign; char **rve; @@ -142,7 +142,7 @@ #ifndef MULTIPLE_THREADS if (dtoa_result) { - freedtoa(dtoa_result); + gdtoa__freedtoa(dtoa_result); dtoa_result = 0; } #endif diff -u gdtoa.orig/g_Qfmt.c gdtoa/g_Qfmt.c --- gdtoa.orig/g_Qfmt.c 2000-11-01 15:21:10 +0000 +++ gdtoa/g_Qfmt.c 2008-10-04 02:01:43 +0000 @@ -57,9 +57,9 @@ char* #ifdef KR_headers -g_Qfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; unsigned bufsize; +gdtoa__g_Qfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; unsigned bufsize; #else -g_Qfmt(char *buf, void *V, int ndig, unsigned bufsize) +gdtoa__g_Qfmt(char *buf, void *V, int ndig, unsigned bufsize) #endif { static FPI fpi = { 113, 1-16383-113+1, 32766 - 16383 - 113 + 1, 1, 0 }; @@ -115,6 +115,6 @@ return 0; mode = 0; } - s = gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); + s = gdtoa__gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign); } diff -u gdtoa.orig/g__fmt.c gdtoa/g__fmt.c --- gdtoa.orig/g__fmt.c 2003-03-21 20:59:43 +0000 +++ gdtoa/g__fmt.c 2008-10-04 02:01:43 +0000 @@ -96,6 +96,6 @@ *b++ = '0'; *b = 0; } - freedtoa(s0); + gdtoa__freedtoa(s0); return b; } diff -u gdtoa.orig/g_ddfmt.c gdtoa/g_ddfmt.c --- gdtoa.orig/g_ddfmt.c 1998-09-09 12:09:31 +0000 +++ gdtoa/g_ddfmt.c 2008-10-04 02:01:43 +0000 @@ -40,9 +40,9 @@ char * #ifdef KR_headers -g_ddfmt(buf, dd, ndig, bufsize) char *buf; double *dd; int ndig; unsigned bufsize; +gdtoa__g_ddfmt(buf, dd, ndig, bufsize) char *buf; double *dd; int ndig; unsigned bufsize; #else -g_ddfmt(char *buf, double *dd, int ndig, unsigned bufsize) +gdtoa__g_ddfmt(char *buf, double *dd, int ndig, unsigned bufsize) #endif { FPI fpi; @@ -154,7 +154,7 @@ fpi.rounding = FPI_Round_near; fpi.sudden_underflow = 0; i = STRTOG_Normal; - s = gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); + s = gdtoa__gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); b = g__fmt(buf, s, se, decpt, z->sign); Bfree(z); return b; diff -u gdtoa.orig/g_dfmt.c gdtoa/g_dfmt.c --- gdtoa.orig/g_dfmt.c 1998-09-09 14:18:15 +0000 +++ gdtoa/g_dfmt.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ char* #ifdef KR_headers -g_dfmt(buf, d, ndig, bufsize) char *buf; double *d; int ndig; unsigned bufsize; +gdtoa__g_dfmt(buf, d, ndig, bufsize) char *buf; double *d; int ndig; unsigned bufsize; #else -g_dfmt(char *buf, double *d, int ndig, unsigned bufsize) +gdtoa__g_dfmt(char *buf, double *d, int ndig, unsigned bufsize) #endif { static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, 0 }; @@ -90,6 +90,6 @@ mode = 0; } i = STRTOG_Normal; - s = gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); + s = gdtoa__gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign); } diff -u gdtoa.orig/g_ffmt.c gdtoa/g_ffmt.c --- gdtoa.orig/g_ffmt.c 1998-09-12 20:39:39 +0000 +++ gdtoa/g_ffmt.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ char* #ifdef KR_headers -g_ffmt(buf, f, ndig, bufsize) char *buf; float *f; int ndig; unsigned bufsize; +gdtoa__g_ffmt(buf, f, ndig, bufsize) char *buf; float *f; int ndig; unsigned bufsize; #else -g_ffmt(char *buf, float *f, int ndig, unsigned bufsize) +gdtoa__g_ffmt(char *buf, float *f, int ndig, unsigned bufsize) #endif { static FPI fpi = { 24, 1-127-24+1, 254-127-24+1, 1, 0 }; @@ -89,6 +89,6 @@ mode = 0; } i = STRTOG_Normal; - s = gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); + s = gdtoa__gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign); } diff -u gdtoa.orig/g_xLfmt.c gdtoa/g_xLfmt.c --- gdtoa.orig/g_xLfmt.c 1998-09-09 16:35:43 +0000 +++ gdtoa/g_xLfmt.c 2008-10-04 02:01:43 +0000 @@ -55,9 +55,9 @@ char* #ifdef KR_headers -g_xLfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; unsigned bufsize; +gdtoa__g_xLfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; unsigned bufsize; #else -g_xLfmt(char *buf, void *V, int ndig, unsigned bufsize) +gdtoa__g_xLfmt(char *buf, void *V, int ndig, unsigned bufsize) #endif { static FPI fpi = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0 }; @@ -109,6 +109,6 @@ return 0; mode = 0; } - s = gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); + s = gdtoa__gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign); } diff -u gdtoa.orig/g_xfmt.c gdtoa/g_xfmt.c --- gdtoa.orig/g_xfmt.c 1998-09-09 13:59:17 +0000 +++ gdtoa/g_xfmt.c 2008-10-04 02:01:43 +0000 @@ -59,9 +59,9 @@ char* #ifdef KR_headers -g_xfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; unsigned bufsize; +gdtoa__g_xfmt(buf, V, ndig, bufsize) char *buf; char *V; int ndig; unsigned bufsize; #else -g_xfmt(char *buf, void *V, int ndig, unsigned bufsize) +gdtoa__g_xfmt(char *buf, void *V, int ndig, unsigned bufsize) #endif { static FPI fpi = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0 }; @@ -114,6 +114,6 @@ return 0; mode = 0; } - s = gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); + s = gdtoa__gdtoa(&fpi, ex, bits, &i, mode, ndig, &decpt, &se); return g__fmt(buf, s, se, decpt, sign); } Only in gdtoa: gdtoa diff -u gdtoa.orig/gdtoa.c gdtoa/gdtoa.c --- gdtoa.orig/gdtoa.c 1999-09-21 04:22:19 +0000 +++ gdtoa/gdtoa.c 2008-10-04 02:01:43 +0000 @@ -115,7 +115,7 @@ */ char * -gdtoa +gdtoa__gdtoa #ifdef KR_headers (fpi, be, bits, kindp, mode, ndigits, decpt, rve) FPI *fpi; int be; ULong *bits; @@ -168,7 +168,7 @@ #ifndef MULTIPLE_THREADS if (dtoa_result) { - freedtoa(dtoa_result); + gdtoa__freedtoa(dtoa_result); dtoa_result = 0; } #endif diff -u gdtoa.orig/gdtoa.h gdtoa/gdtoa.h --- gdtoa.orig/gdtoa.h 2000-11-01 15:01:39 +0000 +++ gdtoa/gdtoa.h 2008-10-04 02:01:43 +0000 @@ -108,49 +108,49 @@ extern "C" { #endif -extern char* dtoa ANSI((double d, int mode, int ndigits, int *decpt, +extern char* gdtoa__dtoa ANSI((double d, int mode, int ndigits, int *decpt, int *sign, char **rve)); -extern char* gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp, +extern char* gdtoa__gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp, int mode, int ndigits, int *decpt, char **rve)); -extern void freedtoa ANSI((char*)); -extern float strtof ANSI((CONST char *, char **)); -extern double strtod ANSI((CONST char *, char **)); -extern int strtodg ANSI((CONST char*, char**, FPI*, Long*, ULong*)); +extern void gdtoa__freedtoa ANSI((char*)); +extern float gdtoa__strtof ANSI((CONST char *, char **)); +extern double gdtoa__strtod ANSI((CONST char *, char **)); +extern int gdtoa__strtodg ANSI((CONST char*, char**, FPI*, Long*, ULong*)); -extern char* g_ddfmt ANSI((char*, double*, int, unsigned)); -extern char* g_dfmt ANSI((char*, double*, int, unsigned)); -extern char* g_ffmt ANSI((char*, float*, int, unsigned)); -extern char* g_Qfmt ANSI((char*, void*, int, unsigned)); -extern char* g_xfmt ANSI((char*, void*, int, unsigned)); -extern char* g_xLfmt ANSI((char*, void*, int, unsigned)); +extern char* gdtoa__g_ddfmt ANSI((char*, double*, int, unsigned)); +extern char* gdtoa__g_dfmt ANSI((char*, double*, int, unsigned)); +extern char* gdtoa__g_ffmt ANSI((char*, float*, int, unsigned)); +extern char* gdtoa__g_Qfmt ANSI((char*, void*, int, unsigned)); +extern char* gdtoa__g_xfmt ANSI((char*, void*, int, unsigned)); +extern char* gdtoa__g_xLfmt ANSI((char*, void*, int, unsigned)); -extern int strtoId ANSI((CONST char*, char**, double*, double*)); -extern int strtoIdd ANSI((CONST char*, char**, double*, double*)); -extern int strtoIf ANSI((CONST char*, char**, float*, float*)); -extern int strtoIQ ANSI((CONST char*, char**, void*, void*)); -extern int strtoIx ANSI((CONST char*, char**, void*, void*)); -extern int strtoIxL ANSI((CONST char*, char**, void*, void*)); -extern int strtord ANSI((CONST char*, char**, int, double*)); -extern int strtordd ANSI((CONST char*, char**, int, double*)); -extern int strtorf ANSI((CONST char*, char**, int, float*)); -extern int strtorQ ANSI((CONST char*, char**, int, void*)); -extern int strtorx ANSI((CONST char*, char**, int, void*)); -extern int strtorxL ANSI((CONST char*, char**, int, void*)); +extern int gdtoa__strtoId ANSI((CONST char*, char**, double*, double*)); +extern int gdtoa__strtoIdd ANSI((CONST char*, char**, double*, double*)); +extern int gdtoa__strtoIf ANSI((CONST char*, char**, float*, float*)); +extern int gdtoa__strtoIQ ANSI((CONST char*, char**, void*, void*)); +extern int gdtoa__strtoIx ANSI((CONST char*, char**, void*, void*)); +extern int gdtoa__strtoIxL ANSI((CONST char*, char**, void*, void*)); +extern int gdtoa__strtord ANSI((CONST char*, char**, int, double*)); +extern int gdtoa__strtordd ANSI((CONST char*, char**, int, double*)); +extern int gdtoa__strtorf ANSI((CONST char*, char**, int, float*)); +extern int gdtoa__strtorQ ANSI((CONST char*, char**, int, void*)); +extern int gdtoa__strtorx ANSI((CONST char*, char**, int, void*)); +extern int gdtoa__strtorxL ANSI((CONST char*, char**, int, void*)); #if 1 -extern int strtodI ANSI((CONST char*, char**, double*)); -extern int strtopd ANSI((CONST char*, char**, double*)); -extern int strtopdd ANSI((CONST char*, char**, double*)); -extern int strtopf ANSI((CONST char*, char**, float*)); -extern int strtopQ ANSI((CONST char*, char**, void*)); -extern int strtopx ANSI((CONST char*, char**, void*)); -extern int strtopxL ANSI((CONST char*, char**, void*)); +extern int gdtoa__strtodI ANSI((CONST char*, char**, double*)); +extern int gdtoa__strtopd ANSI((CONST char*, char**, double*)); +extern int gdtoa__strtopdd ANSI((CONST char*, char**, double*)); +extern int gdtoa__strtopf ANSI((CONST char*, char**, float*)); +extern int gdtoa__strtopQ ANSI((CONST char*, char**, void*)); +extern int gdtoa__strtopx ANSI((CONST char*, char**, void*)); +extern int gdtoa__strtopxL ANSI((CONST char*, char**, void*)); #else -#define strtopd(s,se,x) strtord(s,se,1,x) -#define strtopdd(s,se,x) strtordd(s,se,1,x) -#define strtopf(s,se,x) strtorf(s,se,1,x) -#define strtopQ(s,se,x) strtorQ(s,se,1,x) -#define strtopx(s,se,x) strtorx(s,se,1,x) -#define strtopxL(s,se,x) strtorxL(s,se,1,x) +#define gdtoa__strtopd(s,se,x) gdtoa__strtord(s,se,1,x) +#define gdtoa__strtopdd(s,se,x) gdtoa__strtordd(s,se,1,x) +#define gdtoa__strtopf(s,se,x) gdtoa__strtorf(s,se,1,x) +#define gdtoa__strtopQ(s,se,x) gdtoa__strtorQ(s,se,1,x) +#define gdtoa__strtopx(s,se,x) gdtoa__strtorx(s,se,1,x) +#define gdtoa__strtopxL(s,se,x) gdtoa__strtorxL(s,se,1,x) #endif #ifdef __cplusplus diff -u gdtoa.orig/gdtoaimp.h gdtoa/gdtoaimp.h --- gdtoa.orig/gdtoaimp.h 2000-11-02 15:09:01 +0000 +++ gdtoa/gdtoaimp.h 2008-10-04 02:24:16 +0000 @@ -267,7 +267,7 @@ Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. #endif -typedef union { double d; ULong L[2]; } U; +typedef union { double d; ULong L[2]; } __attribute__((__may_alias__)) U; #ifdef YES_ALIAS #define dval(x) x @@ -502,6 +502,7 @@ #define g__fmt g__fmt_D2A #define gethex gethex_D2A #define hexdig hexdig_D2A +#define hexdig_init hexdig_init_D2A #define hexnan hexnan_D2A #define hi0bits hi0bits_D2A #define i2b i2b_D2A @@ -551,7 +552,7 @@ int *decpt, int *sign, char **rve)); extern char *g__fmt ANSI((char*, char*, char*, int, ULong)); extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int)); - extern void hexdig_init_D2A(Void); + extern void hexdig_init ANSI((Void)); extern int hexnan ANSI((CONST char**, FPI*, ULong*)); extern int hi0bits ANSI((ULong)); extern Bigint *i2b ANSI((int)); @@ -570,8 +571,8 @@ extern Bigint *s2b ANSI((CONST char*, int, int, ULong)); extern Bigint *set_ones ANSI((Bigint*, int)); extern char *strcp ANSI((char*, const char*)); - extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*)); - extern double strtod ANSI((const char *s00, char **se)); + extern int gdtoa__strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*)); + extern double gdtoa__strtod ANSI((const char *s00, char **se)); extern Bigint *sum ANSI((Bigint*, Bigint*)); extern int trailz ANSI((Bigint*)); extern double ulp ANSI((double)); diff -u gdtoa.orig/gethex.c gdtoa/gethex.c --- gdtoa.orig/gethex.c 2003-03-26 20:33:08 +0000 +++ gdtoa/gethex.c 2008-10-04 02:24:16 +0000 @@ -57,7 +57,7 @@ #endif if (!hexdig['0']) - hexdig_init_D2A(); + hexdig_init(); havedig = 0; s0 = *(CONST unsigned char **)sp + 2; while(s0[havedig] == '0') diff -u gdtoa.orig/hd_init.c gdtoa/hd_init.c --- gdtoa.orig/hd_init.c 2000-11-03 01:45:35 +0000 +++ gdtoa/hd_init.c 2008-10-04 02:24:16 +0000 @@ -52,7 +52,7 @@ } void -hexdig_init_D2A(Void) +hexdig_init(Void) { #define USC (unsigned char *) htinit(hexdig, USC "0123456789", 0x10); diff -u gdtoa.orig/hexnan.c gdtoa/hexnan.c --- gdtoa.orig/hexnan.c 2000-11-03 01:44:38 +0000 +++ gdtoa/hexnan.c 2008-10-04 02:24:16 +0000 @@ -68,7 +68,7 @@ int havedig, hd0, i, nbits; if (!hexdig['0']) - hexdig_init_D2A(); + hexdig_init(); nbits = fpi->nbits; x = x0 + (nbits >> kshift); if (nbits & kmask) diff -u gdtoa.orig/strtoIQ.c gdtoa/strtoIQ.c --- gdtoa.orig/strtoIQ.c 1998-06-22 18:49:25 +0000 +++ gdtoa/strtoIQ.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtoIQ(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; +gdtoa__strtoIQ(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; #else -strtoIQ(CONST char *s, char **sp, void *a, void *b) +gdtoa__strtoIQ(CONST char *s, char **sp, void *a, void *b) #endif { static FPI fpi = { 113, 1-16383-113+1, 32766-16383-113+1, 1, SI }; @@ -52,7 +52,7 @@ B[0] = Balloc(2); B[0]->wds = 4; - k = strtoIg(s, sp, &fpi, exp, B, rv); + k = gdtoa__strtoIg(s, sp, &fpi, exp, B, rv); ULtoQ(L, B[0]->x, exp[0], rv[0]); Bfree(B[0]); if (B[1]) { diff -u gdtoa.orig/strtoId.c gdtoa/strtoId.c --- gdtoa.orig/strtoId.c 1998-09-09 13:59:17 +0000 +++ gdtoa/strtoId.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtoId(s, sp, f0, f1) CONST char *s; char **sp; double *f0, *f1; +gdtoa__strtoId(s, sp, f0, f1) CONST char *s; char **sp; double *f0, *f1; #else -strtoId(CONST char *s, char **sp, double *f0, double *f1) +gdtoa__strtoId(CONST char *s, char **sp, double *f0, double *f1) #endif { static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI }; @@ -51,7 +51,7 @@ B[0] = Balloc(1); B[0]->wds = 2; - k = strtoIg(s, sp, &fpi, exp, B, rv); + k = gdtoa__strtoIg(s, sp, &fpi, exp, B, rv); ULtod((ULong*)f0, B[0]->x, exp[0], rv[0]); Bfree(B[0]); if (B[1]) { diff -u gdtoa.orig/strtoIdd.c gdtoa/strtoIdd.c --- gdtoa.orig/strtoIdd.c 1998-09-09 13:59:17 +0000 +++ gdtoa/strtoIdd.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtoIdd(s, sp, f0, f1) CONST char *s; char **sp; double *f0, *f1; +gdtoa__strtoIdd(s, sp, f0, f1) CONST char *s; char **sp; double *f0, *f1; #else -strtoIdd(CONST char *s, char **sp, double *f0, double *f1) +gdtoa__strtoIdd(CONST char *s, char **sp, double *f0, double *f1) #endif { #ifdef Sudden_Underflow @@ -55,7 +55,7 @@ B[0] = Balloc(2); B[0]->wds = 4; - k = strtoIg(s, sp, &fpi, exp, B, rv); + k = gdtoa__strtoIg(s, sp, &fpi, exp, B, rv); ULtodd((ULong*)f0, B[0]->x, exp[0], rv[0]); Bfree(B[0]); if (B[1]) { diff -u gdtoa.orig/strtoIf.c gdtoa/strtoIf.c --- gdtoa.orig/strtoIf.c 1998-09-09 13:59:17 +0000 +++ gdtoa/strtoIf.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtoIf(s, sp, f0, f1) CONST char *s; char **sp; float *f0, *f1; +gdtoa__strtoIf(s, sp, f0, f1) CONST char *s; char **sp; float *f0, *f1; #else -strtoIf(CONST char *s, char **sp, float *f0, float *f1) +gdtoa__strtoIf(CONST char *s, char **sp, float *f0, float *f1) #endif { static FPI fpi = { 24, 1-127-24+1, 254-127-24+1, 1, SI }; @@ -51,7 +51,7 @@ B[0] = Balloc(0); B[0]->wds = 1; - k = strtoIg(s, sp, &fpi, exp, B, rv); + k = gdtoa__strtoIg(s, sp, &fpi, exp, B, rv); ULtof((ULong*)f0, B[0]->x, exp[0], rv[0]); Bfree(B[0]); if (B[1]) { diff -u gdtoa.orig/strtoIg.c gdtoa/strtoIg.c --- gdtoa.orig/strtoIg.c 1998-06-26 14:04:19 +0000 +++ gdtoa/strtoIg.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtoIg(s00, se, fpi, exp, B, rvp) CONST char *s00; char **se; FPI *fpi; Long *exp; Bigint **B; int *rvp; +gdtoa__strtoIg(s00, se, fpi, exp, B, rvp) CONST char *s00; char **se; FPI *fpi; Long *exp; Bigint **B; int *rvp; #else -strtoIg(CONST char *s00, char **se, FPI *fpi, Long *exp, Bigint **B, int *rvp) +gdtoa__strtoIg(CONST char *s00, char **se, FPI *fpi, Long *exp, Bigint **B, int *rvp) #endif { Bigint *b, *b1; @@ -50,7 +50,7 @@ Long e1; b = *B; - rv = strtodg(s00, se, fpi, exp, b->x); + rv = gdtoa__strtodg(s00, se, fpi, exp, b->x); if (!(rv & STRTOG_Inexact)) { B[1] = 0; return *rvp = rv; diff -u gdtoa.orig/strtoIx.c gdtoa/strtoIx.c --- gdtoa.orig/strtoIx.c 1998-09-09 13:13:22 +0000 +++ gdtoa/strtoIx.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtoIx(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; +gdtoa__strtoIx(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; #else -strtoIx(CONST char *s, char **sp, void *a, void *b) +gdtoa__strtoIx(CONST char *s, char **sp, void *a, void *b) #endif { static FPI fpi = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; @@ -52,7 +52,7 @@ B[0] = Balloc(1); B[0]->wds = 2; - k = strtoIg(s, sp, &fpi, exp, B, rv); + k = gdtoa__strtoIg(s, sp, &fpi, exp, B, rv); ULtox(L, B[0]->x, exp[0], rv[0]); Bfree(B[0]); if (B[1]) { diff -u gdtoa.orig/strtoIxL.c gdtoa/strtoIxL.c --- gdtoa.orig/strtoIxL.c 1998-09-09 13:13:22 +0000 +++ gdtoa/strtoIxL.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtoIxL(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; +gdtoa__strtoIxL(s, sp, a, b) CONST char *s; char **sp; void *a; void *b; #else -strtoIxL(CONST char *s, char **sp, void *a, void *b) +gdtoa__strtoIxL(CONST char *s, char **sp, void *a, void *b) #endif { static FPI fpi = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; @@ -52,7 +52,7 @@ B[0] = Balloc(1); B[0]->wds = 2; - k = strtoIg(s, sp, &fpi, exp, B, rv); + k = gdtoa__strtoIg(s, sp, &fpi, exp, B, rv); ULtoxL(L, B[0]->x, exp[0], rv[0]); Bfree(B[0]); if (B[1]) { diff -u gdtoa.orig/strtod.c gdtoa/strtod.c --- gdtoa.orig/strtod.c 2003-03-21 21:24:01 +0000 +++ gdtoa/strtod.c 2008-10-04 02:01:43 +0000 @@ -58,7 +58,7 @@ #endif double -strtod +gdtoa__strtod #ifdef KR_headers (s00, se) CONST char *s00; char **se; #else diff -u gdtoa.orig/strtodI.c gdtoa/strtodI.c --- gdtoa.orig/strtodI.c 2000-11-02 04:33:13 +0000 +++ gdtoa/strtodI.c 2008-10-04 02:01:43 +0000 @@ -56,9 +56,9 @@ int #ifdef KR_headers -strtodI(s, sp, dd) CONST char *s; char **sp; double *dd; +gdtoa__strtodI(s, sp, dd) CONST char *s; char **sp; double *dd; #else -strtodI(CONST char *s, char **sp, double *dd) +gdtoa__strtodI(CONST char *s, char **sp, double *dd) #endif { #ifdef Sudden_Underflow @@ -75,7 +75,7 @@ } U; U *u; - k = strtodg(s, sp, &fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, &fpi, &exp, bits); u = (U*)dd; sign = k & STRTOG_Neg ? 0x80000000L : 0; switch(k & STRTOG_Retmask) { diff -u gdtoa.orig/strtodg.c gdtoa/strtodg.c --- gdtoa.orig/strtodg.c 2003-03-21 20:59:43 +0000 +++ gdtoa/strtodg.c 2008-10-04 02:01:43 +0000 @@ -316,7 +316,7 @@ } int -strtodg +gdtoa__strtodg #ifdef KR_headers (s00, se, fpi, exp, bits) CONST char *s00; char **se; FPI *fpi; Long *exp; ULong *bits; diff -u gdtoa.orig/strtof.c gdtoa/strtof.c --- gdtoa.orig/strtof.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtof.c 2008-10-04 02:01:43 +0000 @@ -37,11 +37,11 @@ #include "gdtoaimp.h" - float + float gdtoa__strtof #ifdef KR_headers -strtof(s, sp) CONST char *s; char **sp; + (s, sp) CONST char *s; char **sp; #else -strtof(CONST char *s, char **sp) + (CONST char *s, char **sp) #endif { #ifdef Sudden_Underflow @@ -54,7 +54,7 @@ int k; union { ULong L[1]; float f; } u; - k = strtodg(s, sp, &fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, &fpi, &exp, bits); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: diff -u gdtoa.orig/strtopQ.c gdtoa/strtopQ.c --- gdtoa.orig/strtopQ.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtopQ.c 2008-10-04 02:01:43 +0000 @@ -57,9 +57,9 @@ int #ifdef KR_headers -strtopQ(s, sp, V) CONST char *s; char **sp; void *V; +gdtoa__strtopQ(s, sp, V) CONST char *s; char **sp; void *V; #else -strtopQ(CONST char *s, char **sp, void *V) +gdtoa__strtopQ(CONST char *s, char **sp, void *V) #endif { #ifdef Sudden_Underflow @@ -72,7 +72,7 @@ int k; ULong *L = (ULong*)V; - k = strtodg(s, sp, &fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, &fpi, &exp, bits); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: diff -u gdtoa.orig/strtopd.c gdtoa/strtopd.c --- gdtoa.orig/strtopd.c 1998-09-12 15:30:06 +0000 +++ gdtoa/strtopd.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtopd(s, sp, d) char *s; char **sp; double *d; +gdtoa__strtopd(s, sp, d) char *s; char **sp; double *d; #else -strtopd(CONST char *s, char **sp, double *d) +gdtoa__strtopd(CONST char *s, char **sp, double *d) #endif { static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI }; @@ -49,7 +49,7 @@ Long exp; int k; - k = strtodg(s, sp, &fpi0, &exp, bits); + k = gdtoa__strtodg(s, sp, &fpi0, &exp, bits); ULtod((ULong*)d, bits, exp, k); return k; } diff -u gdtoa.orig/strtopdd.c gdtoa/strtopdd.c --- gdtoa.orig/strtopdd.c 2000-11-02 04:33:46 +0000 +++ gdtoa/strtopdd.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtopdd(s, sp, dd) CONST char *s; char **sp; double *dd; +gdtoa__strtopdd(s, sp, dd) CONST char *s; char **sp; double *dd; #else -strtopdd(CONST char *s, char **sp, double *dd) +gdtoa__strtopdd(CONST char *s, char **sp, double *dd) #endif { #ifdef Sudden_Underflow @@ -58,7 +58,7 @@ } U; U *u; - rv = strtodg(s, sp, &fpi, &exp, bits); + rv = gdtoa__strtodg(s, sp, &fpi, &exp, bits); u = (U*)dd; switch(rv & STRTOG_Retmask) { case STRTOG_NoNumber: diff -u gdtoa.orig/strtopf.c gdtoa/strtopf.c --- gdtoa.orig/strtopf.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtopf.c 2008-10-04 02:01:43 +0000 @@ -39,9 +39,9 @@ int #ifdef KR_headers -strtopf(s, sp, f) CONST char *s; char **sp; float *f; +gdtoa__strtopf(s, sp, f) CONST char *s; char **sp; float *f; #else -strtopf(CONST char *s, char **sp, float *f) +gdtoa__strtopf(CONST char *s, char **sp, float *f) #endif { #ifdef Sudden_Underflow @@ -53,7 +53,7 @@ Long exp; int k; - k = strtodg(s, sp, &fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, &fpi, &exp, bits); L = (ULong*)f; switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: diff -u gdtoa.orig/strtopx.c gdtoa/strtopx.c --- gdtoa.orig/strtopx.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtopx.c 2008-10-04 02:01:43 +0000 @@ -59,9 +59,9 @@ int #ifdef KR_headers -strtopx(s, sp, V) CONST char *s; char **sp; void *V; +gdtoa__strtopx(s, sp, V) CONST char *s; char **sp; void *V; #else -strtopx(CONST char *s, char **sp, void *V) +gdtoa__strtopx(CONST char *s, char **sp, void *V) #endif { #ifdef Sudden_Underflow @@ -74,7 +74,7 @@ int k; UShort *L = (UShort*)V; - k = strtodg(s, sp, &fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, &fpi, &exp, bits); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: diff -u gdtoa.orig/strtopxL.c gdtoa/strtopxL.c --- gdtoa.orig/strtopxL.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtopxL.c 2008-10-04 02:01:43 +0000 @@ -55,9 +55,9 @@ int #ifdef KR_headers -strtopxL(s, sp, V) CONST char *s; char **sp; void *V; +gdtoa__strtopxL(s, sp, V) CONST char *s; char **sp; void *V; #else -strtopxL(CONST char *s, char **sp, void *V) +gdtoa__strtopxL(CONST char *s, char **sp, void *V) #endif { #ifdef Sudden_Underflow @@ -70,7 +70,7 @@ int k; ULong *L = (ULong*)V; - k = strtodg(s, sp, &fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, &fpi, &exp, bits); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: diff -u gdtoa.orig/strtorQ.c gdtoa/strtorQ.c --- gdtoa.orig/strtorQ.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtorQ.c 2008-10-04 02:01:43 +0000 @@ -98,9 +98,9 @@ int #ifdef KR_headers -strtorQ(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; +gdtoa__strtorQ(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; #else -strtorQ(CONST char *s, char **sp, int rounding, void *L) +gdtoa__strtorQ(CONST char *s, char **sp, int rounding, void *L) #endif { static FPI fpi0 = { 113, 1-16383-113+1, 32766-16383-113+1, 1, SI }; @@ -115,7 +115,7 @@ fpi1.rounding = rounding; fpi = &fpi1; } - k = strtodg(s, sp, fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtoQ((ULong*)L, bits, exp, k); return k; } diff -u gdtoa.orig/strtord.c gdtoa/strtord.c --- gdtoa.orig/strtord.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtord.c 2008-10-04 02:01:43 +0000 @@ -76,9 +76,9 @@ int #ifdef KR_headers -strtord(s, sp, rounding, d) CONST char *s; char **sp; int rounding; double *d; +gdtoa__strtord(s, sp, rounding, d) CONST char *s; char **sp; int rounding; double *d; #else -strtord(CONST char *s, char **sp, int rounding, double *d) +gdtoa__strtord(CONST char *s, char **sp, int rounding, double *d) #endif { static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI }; @@ -93,7 +93,7 @@ fpi1.rounding = rounding; fpi = &fpi1; } - k = strtodg(s, sp, fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtod((ULong*)d, bits, exp, k); return k; } diff -u gdtoa.orig/strtordd.c gdtoa/strtordd.c --- gdtoa.orig/strtordd.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtordd.c 2008-10-04 02:01:43 +0000 @@ -178,9 +178,9 @@ int #ifdef KR_headers -strtordd(s, sp, rounding, dd) CONST char *s; char **sp; int rounding; double *dd; +gdtoa__strtordd(s, sp, rounding, dd) CONST char *s; char **sp; int rounding; double *dd; #else -strtordd(CONST char *s, char **sp, int rounding, double *dd) +gdtoa__strtordd(CONST char *s, char **sp, int rounding, double *dd) #endif { #ifdef Sudden_Underflow @@ -199,7 +199,7 @@ fpi1.rounding = rounding; fpi = &fpi1; } - k = strtodg(s, sp, fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtodd((ULong*)dd, bits, exp, k); return k; } diff -u gdtoa.orig/strtorf.c gdtoa/strtorf.c --- gdtoa.orig/strtorf.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtorf.c 2008-10-04 02:01:43 +0000 @@ -72,9 +72,9 @@ int #ifdef KR_headers -strtorf(s, sp, rounding, f) CONST char *s; char **sp; int rounding; float *f; +gdtoa__strtorf(s, sp, rounding, f) CONST char *s; char **sp; int rounding; float *f; #else -strtorf(CONST char *s, char **sp, int rounding, float *f) +gdtoa__strtorf(CONST char *s, char **sp, int rounding, float *f) #endif { static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI }; @@ -89,7 +89,7 @@ fpi1.rounding = rounding; fpi = &fpi1; } - k = strtodg(s, sp, fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtof((ULong*)f, bits, exp, k); return k; } diff -u gdtoa.orig/strtorx.c gdtoa/strtorx.c --- gdtoa.orig/strtorx.c 2000-11-02 04:34:18 +0000 +++ gdtoa/strtorx.c 2008-10-04 02:01:43 +0000 @@ -95,9 +95,9 @@ int #ifdef KR_headers -strtorx(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; +gdtoa__strtorx(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; #else -strtorx(CONST char *s, char **sp, int rounding, void *L) +gdtoa__strtorx(CONST char *s, char **sp, int rounding, void *L) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; @@ -112,7 +112,7 @@ fpi1.rounding = rounding; fpi = &fpi1; } - k = strtodg(s, sp, fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtox((UShort*)L, bits, exp, k); return k; } diff -u gdtoa.orig/strtorxL.c gdtoa/strtorxL.c --- gdtoa.orig/strtorxL.c 2000-11-02 04:31:40 +0000 +++ gdtoa/strtorxL.c 2008-10-04 02:01:43 +0000 @@ -89,9 +89,9 @@ int #ifdef KR_headers -strtorxL(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; +gdtoa__strtorxL(s, sp, rounding, L) CONST char *s; char **sp; int rounding; void *L; #else -strtorxL(CONST char *s, char **sp, int rounding, void *L) +gdtoa__strtorxL(CONST char *s, char **sp, int rounding, void *L) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; @@ -106,7 +106,7 @@ fpi1.rounding = rounding; fpi = &fpi1; } - k = strtodg(s, sp, fpi, &exp, bits); + k = gdtoa__strtodg(s, sp, fpi, &exp, bits); ULtoxL((ULong*)L, bits, exp, k); return k; } Common subdirectories: gdtoa.orig/test and gdtoa/test mlton-20100608/runtime/gdtoa-patch.internal0000644000076600000240000001145611404435622017203 0ustar mtfstaff--- gdtoa/gdtoaimp.h.orig 2008-10-04 02:27:47 +0000 +++ gdtoa/gdtoaimp.h 2008-10-04 02:32:34 +0000 @@ -529,53 +530,53 @@ #define trailz trailz_D2A #define ulp ulp_D2A - extern char *dtoa_result; - extern CONST double bigtens[], tens[], tinytens[]; - extern unsigned char hexdig[]; - - extern Bigint *Balloc ANSI((int)); - extern void Bfree ANSI((Bigint*)); - extern void ULtof ANSI((ULong*, ULong*, Long, int)); - extern void ULtod ANSI((ULong*, ULong*, Long, int)); - extern void ULtodd ANSI((ULong*, ULong*, Long, int)); - extern void ULtoQ ANSI((ULong*, ULong*, Long, int)); - extern void ULtox ANSI((UShort*, ULong*, Long, int)); - extern void ULtoxL ANSI((ULong*, ULong*, Long, int)); - extern ULong any_on ANSI((Bigint*, int)); - extern double b2d ANSI((Bigint*, int*)); - extern int cmp ANSI((Bigint*, Bigint*)); - extern void copybits ANSI((ULong*, int, Bigint*)); - extern Bigint *d2b ANSI((double, int*, int*)); - extern int decrement ANSI((Bigint*)); - extern Bigint *diff ANSI((Bigint*, Bigint*)); - extern char *dtoa ANSI((double d, int mode, int ndigits, +PRIVATE extern char *dtoa_result; +PRIVATE extern CONST double bigtens[], tens[], tinytens[]; +PRIVATE extern unsigned char hexdig[]; + +PRIVATE extern Bigint *Balloc ANSI((int)); +PRIVATE extern void Bfree ANSI((Bigint*)); +PRIVATE extern void ULtof ANSI((ULong*, ULong*, Long, int)); +PRIVATE extern void ULtod ANSI((ULong*, ULong*, Long, int)); +PRIVATE extern void ULtodd ANSI((ULong*, ULong*, Long, int)); +PRIVATE extern void ULtoQ ANSI((ULong*, ULong*, Long, int)); +PRIVATE extern void ULtox ANSI((UShort*, ULong*, Long, int)); +PRIVATE extern void ULtoxL ANSI((ULong*, ULong*, Long, int)); +PRIVATE extern ULong any_on ANSI((Bigint*, int)); +PRIVATE extern double b2d ANSI((Bigint*, int*)); +PRIVATE extern int cmp ANSI((Bigint*, Bigint*)); +PRIVATE extern void copybits ANSI((ULong*, int, Bigint*)); +PRIVATE extern Bigint *d2b ANSI((double, int*, int*)); +PRIVATE extern int decrement ANSI((Bigint*)); +PRIVATE extern Bigint *diff ANSI((Bigint*, Bigint*)); +PRIVATE extern char *dtoa ANSI((double d, int mode, int ndigits, int *decpt, int *sign, char **rve)); - extern char *g__fmt ANSI((char*, char*, char*, int, ULong)); - extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int)); - extern void hexdig_init ANSI((Void)); - extern int hexnan ANSI((CONST char**, FPI*, ULong*)); - extern int hi0bits ANSI((ULong)); - extern Bigint *i2b ANSI((int)); - extern Bigint *increment ANSI((Bigint*)); - extern int lo0bits ANSI((ULong*)); - extern Bigint *lshift ANSI((Bigint*, int)); - extern int match ANSI((CONST char**, char*)); - extern Bigint *mult ANSI((Bigint*, Bigint*)); - extern Bigint *multadd ANSI((Bigint*, int, int)); - extern char *nrv_alloc ANSI((char*, char **, int)); - extern Bigint *pow5mult ANSI((Bigint*, int)); - extern int quorem ANSI((Bigint*, Bigint*)); - extern double ratio ANSI((Bigint*, Bigint*)); - extern void rshift ANSI((Bigint*, int)); - extern char *rv_alloc ANSI((int)); - extern Bigint *s2b ANSI((CONST char*, int, int, ULong)); - extern Bigint *set_ones ANSI((Bigint*, int)); - extern char *strcp ANSI((char*, const char*)); - extern int gdtoa__strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*)); - extern double gdtoa__strtod ANSI((const char *s00, char **se)); - extern Bigint *sum ANSI((Bigint*, Bigint*)); - extern int trailz ANSI((Bigint*)); - extern double ulp ANSI((double)); +PRIVATE extern char *g__fmt ANSI((char*, char*, char*, int, ULong)); +PRIVATE extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int)); +PRIVATE extern void hexdig_init ANSI((Void)); +PRIVATE extern int hexnan ANSI((CONST char**, FPI*, ULong*)); +PRIVATE extern int hi0bits ANSI((ULong)); +PRIVATE extern Bigint *i2b ANSI((int)); +PRIVATE extern Bigint *increment ANSI((Bigint*)); +PRIVATE extern int lo0bits ANSI((ULong*)); +PRIVATE extern Bigint *lshift ANSI((Bigint*, int)); +PRIVATE extern int match ANSI((CONST char**, char*)); +PRIVATE extern Bigint *mult ANSI((Bigint*, Bigint*)); +PRIVATE extern Bigint *multadd ANSI((Bigint*, int, int)); +PRIVATE extern char *nrv_alloc ANSI((char*, char **, int)); +PRIVATE extern Bigint *pow5mult ANSI((Bigint*, int)); +PRIVATE extern int quorem ANSI((Bigint*, Bigint*)); +PRIVATE extern double ratio ANSI((Bigint*, Bigint*)); +PRIVATE extern void rshift ANSI((Bigint*, int)); +PRIVATE extern char *rv_alloc ANSI((int)); +PRIVATE extern Bigint *s2b ANSI((CONST char*, int, int, ULong)); +PRIVATE extern Bigint *set_ones ANSI((Bigint*, int)); +PRIVATE extern char *strcp ANSI((char*, const char*)); +PRIVATE extern int gdtoa__strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*)); +PRIVATE extern double gdtoa__strtod ANSI((const char *s00, char **se)); +PRIVATE extern Bigint *sum ANSI((Bigint*, Bigint*)); +PRIVATE extern int trailz ANSI((Bigint*)); +PRIVATE extern double ulp ANSI((double)); #ifdef __cplusplus } mlton-20100608/runtime/gdtoa-patch.mlton0000644000076600000240000001237211404435622016516 0ustar mtfstaff--- gdtoa/gdtoa.h.orig 2008-07-31 18:07:23.128804424 +0200 +++ gdtoa/gdtoa.h 2008-07-31 18:09:01.333773640 +0200 @@ -39,6 +39,7 @@ #define GDTOA_H_INCLUDED #include "arith.h" +#include "../export.h" #ifndef Long #define Long long @@ -108,42 +109,42 @@ extern "C" { #endif -extern char* gdtoa__dtoa ANSI((double d, int mode, int ndigits, int *decpt, +PRIVATE extern char* gdtoa__dtoa ANSI((double d, int mode, int ndigits, int *decpt, int *sign, char **rve)); -extern char* gdtoa__gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp, +PRIVATE extern char* gdtoa__gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp, int mode, int ndigits, int *decpt, char **rve)); -extern void gdtoa__freedtoa ANSI((char*)); -extern float gdtoa__strtof ANSI((CONST char *, char **)); -extern double gdtoa__strtod ANSI((CONST char *, char **)); -extern int gdtoa__strtodg ANSI((CONST char*, char**, FPI*, Long*, ULong*)); - -extern char* gdtoa__g_ddfmt ANSI((char*, double*, int, unsigned)); -extern char* gdtoa__g_dfmt ANSI((char*, double*, int, unsigned)); -extern char* gdtoa__g_ffmt ANSI((char*, float*, int, unsigned)); -extern char* gdtoa__g_Qfmt ANSI((char*, void*, int, unsigned)); -extern char* gdtoa__g_xfmt ANSI((char*, void*, int, unsigned)); -extern char* gdtoa__g_xLfmt ANSI((char*, void*, int, unsigned)); - -extern int gdtoa__strtoId ANSI((CONST char*, char**, double*, double*)); -extern int gdtoa__strtoIdd ANSI((CONST char*, char**, double*, double*)); -extern int gdtoa__strtoIf ANSI((CONST char*, char**, float*, float*)); -extern int gdtoa__strtoIQ ANSI((CONST char*, char**, void*, void*)); -extern int gdtoa__strtoIx ANSI((CONST char*, char**, void*, void*)); -extern int gdtoa__strtoIxL ANSI((CONST char*, char**, void*, void*)); -extern int gdtoa__strtord ANSI((CONST char*, char**, int, double*)); -extern int gdtoa__strtordd ANSI((CONST char*, char**, int, double*)); -extern int gdtoa__strtorf ANSI((CONST char*, char**, int, float*)); -extern int gdtoa__strtorQ ANSI((CONST char*, char**, int, void*)); -extern int gdtoa__strtorx ANSI((CONST char*, char**, int, void*)); -extern int gdtoa__strtorxL ANSI((CONST char*, char**, int, void*)); +PRIVATE extern void gdtoa__freedtoa ANSI((char*)); +PRIVATE extern float gdtoa__strtof ANSI((CONST char *, char **)); +PRIVATE extern double gdtoa__strtod ANSI((CONST char *, char **)); +PRIVATE extern int gdtoa__strtodg ANSI((CONST char*, char**, FPI*, Long*, ULong*)); + +PRIVATE extern char* gdtoa__g_ddfmt ANSI((char*, double*, int, unsigned)); +PRIVATE extern char* gdtoa__g_dfmt ANSI((char*, double*, int, unsigned)); +PRIVATE extern char* gdtoa__g_ffmt ANSI((char*, float*, int, unsigned)); +PRIVATE extern char* gdtoa__g_Qfmt ANSI((char*, void*, int, unsigned)); +PRIVATE extern char* gdtoa__g_xfmt ANSI((char*, void*, int, unsigned)); +PRIVATE extern char* gdtoa__g_xLfmt ANSI((char*, void*, int, unsigned)); + +PRIVATE extern int gdtoa__strtoId ANSI((CONST char*, char**, double*, double*)); +PRIVATE extern int gdtoa__strtoIdd ANSI((CONST char*, char**, double*, double*)); +PRIVATE extern int gdtoa__strtoIf ANSI((CONST char*, char**, float*, float*)); +PRIVATE extern int gdtoa__strtoIQ ANSI((CONST char*, char**, void*, void*)); +PRIVATE extern int gdtoa__strtoIx ANSI((CONST char*, char**, void*, void*)); +PRIVATE extern int gdtoa__strtoIxL ANSI((CONST char*, char**, void*, void*)); +PRIVATE extern int gdtoa__strtord ANSI((CONST char*, char**, int, double*)); +PRIVATE extern int gdtoa__strtordd ANSI((CONST char*, char**, int, double*)); +PRIVATE extern int gdtoa__strtorf ANSI((CONST char*, char**, int, float*)); +PRIVATE extern int gdtoa__strtorQ ANSI((CONST char*, char**, int, void*)); +PRIVATE extern int gdtoa__strtorx ANSI((CONST char*, char**, int, void*)); +PRIVATE extern int gdtoa__strtorxL ANSI((CONST char*, char**, int, void*)); #if 1 -extern int gdtoa__strtodI ANSI((CONST char*, char**, double*)); -extern int gdtoa__strtopd ANSI((CONST char*, char**, double*)); -extern int gdtoa__strtopdd ANSI((CONST char*, char**, double*)); -extern int gdtoa__strtopf ANSI((CONST char*, char**, float*)); -extern int gdtoa__strtopQ ANSI((CONST char*, char**, void*)); -extern int gdtoa__strtopx ANSI((CONST char*, char**, void*)); -extern int gdtoa__strtopxL ANSI((CONST char*, char**, void*)); +PRIVATE extern int gdtoa__strtodI ANSI((CONST char*, char**, double*)); +PRIVATE extern int gdtoa__strtopd ANSI((CONST char*, char**, double*)); +PRIVATE extern int gdtoa__strtopdd ANSI((CONST char*, char**, double*)); +PRIVATE extern int gdtoa__strtopf ANSI((CONST char*, char**, float*)); +PRIVATE extern int gdtoa__strtopQ ANSI((CONST char*, char**, void*)); +PRIVATE extern int gdtoa__strtopx ANSI((CONST char*, char**, void*)); +PRIVATE extern int gdtoa__strtopxL ANSI((CONST char*, char**, void*)); #else #define gdtoa__strtopd(s,se,x) gdtoa__strtord(s,se,1,x) #define gdtoa__strtopdd(s,se,x) gdtoa__strtordd(s,se,1,x) --- gdtoa/gdtoaimp.h.orig 2008-10-04 02:33:51 +0000 +++ gdtoa/gdtoaimp.h 2008-10-04 02:34:41 +0000 @@ -503,7 +503,8 @@ #define g__fmt g__fmt_D2A #define gethex gethex_D2A #define hexdig hexdig_D2A -#define hexdig_init hexdig_init_D2A +/* work around MinGW bug */ +#define hexdig_init hexdig_init_D3A #define hexnan hexnan_D2A #define hi0bits hi0bits_D2A #define i2b i2b_D2A mlton-20100608/runtime/gdtoa.tgz0000644000076600000240000027352111404435622015101 0ustar mtfstaff‹Ê‚>ì[ksÛÆ’½_5¿bJ©\“¾$LÉ’åÇ:µ²$'ÚH¶lÙIv·ö²@`HÎHd~ýžîž@IqnÕV¶v«V•˜ Ì£§Owi]ÆO>žŸ^žýåOú™L&Ï4}îòçd_¾ãçéÞáÁžž={úìÙѳƒ£#=ÙÛv¸÷=ù³Ôÿi\WXJš/þà9S}í¾lF·ŸÿG~>-­Ó©­LR—ÕF'eQǶpÚ•M•=/+ëÌΪw˹žÙ‚®ÆßéÔ$63i¸¦_û0Щœ- ]•Mm ãF<š³Å"3ã‘NËfF<€YצHM:^a%–_;?;; £Í³2Æ‹ñª´E­ãÊÖËÜÔ6i¼­Êzi*~aœÙ/æá·FÚIÖ¤ø…Þ•Éýv±‡»Jí|Šô¿DúÔ|ùbª‘Þ=ÖoÃW<ó'“, ûk#’9ãUÓ€X€Ú9¾‰mÓ¸Wa»#ý®ÉMé˸^Fzï¹ì½8ÚŽôjéýýƒñþÁ¾"`öÝóÂÙÔàÙ“•nùR_•·¦º:‘Qlâ0àqšZWãŸËÌf¤÷^¼8PêÓÒ<$t » ¢îdû»ò¤…Œô-Äitaã9ÒK»Xêîu¼cx÷^¤5- ̪b¼¿0…©âÌþ†©J˜¬bÒ®®ê2Õl6Àžn¥©qIeg&UœÆ76Õ—‘þ>Æ vOÊŠŒ4ÛèeC¦¢ß°–ǧÞöH„;þËXîé“V .hÂ&xö¸ˆ³ƒå_ÆEC³®jµó®Œô‹Éxo2ÒoL–é‹x›½lª*Þèl–±¨'¯Ôβ®W/Ÿ<õ‡_›ø§¯ü…'áÁ4ÝÙâˆí±_ïK­hòäŒUÞ.áV°êœ\€6eCû)T›5F©·„X#z«2l¹õ²Bd˜Ç¹Í,ÁÑ\Ý1›—¬l²EãÂÄdФo†È¹ÿLÃg¸Xµá‘Õº½¸W”¢ñ¶C¬óÆL^æVØÈÜš´¯ £Ui{Ñ^­Û‹0AõéQ» Úm @&L¤‚ÔôV’—®æÇqoáACRžÔ*µÈU´Ñ.ê<,êùTêÚ3ApD§Ó4çuê’[—Чk/x–îjI@æ¢Dùì†Q©Âzû¸‡ð ð¢h…JDˆ°×`\±€ R¸Ð$¤wŸð3½Àö†ü…Qm–q›€šTù*Ã.ÇFqè;}_O{”̲øùl/ªêëF1T×%îÌâiaNX˜Å®aq,¨rýÜ‘b•Ÿ¨}%ö´Šx‰#ÞÍ+£å+çdöeˆïÅÂz÷9lw=¸°¶Z]»ªˆIcä‚ÇôtÿX6ÈÁ$îvbàüÙ¸Ä;OD»Iü»$›Î(ÔâÓ)ýŒ¢l¨»’Kñ#žA|]žÝ%å¤6Óæ:LWME]¼ï®øšHwÛy #R¦Þç{0“¯8—qÉÒ¤ C².pHK.Eõé8u- %¦¡`{MœùÚ&v TòP‚жÈeëGNoQ#ϦTÊžZ/Ò²ŽC%@îÉ/?_|:¿º8›~úN¹\·‘¹­J…¢ë€¨v`"þ©!}V&_H> :>ùðùüãÙôôÓûãéÅû“3bx¿ŠñöãÙÛ$òœBx´©s„y¼FSÐ mp†2osÎ`³à €çø·6äz±HÅ"ö´âþ­têéÐ'‡¯t™Ûº–èeÏã³NKd8m¤ÚåDd!‰Y<³gNs ü"â²ò ]y•åÖ:ê·ÁAªœ’èh’¡¶;ˆ1¹­\Ò£;1=¢qæÈ­oÊ/FäFÀê†Tp¤¯¾®BhÞã²íÖ˜”"™¼ÿÑW‹1¦/žP¹Õ=°®3ÖZ¯Ð±˜>w=¿Œò–Ô7ÙyG¾ MÅ¿Ϊñ9?E!0\¡ 7H¤½•‘‚8"Ç %«²ÌØuXÞt…äfÞ§E³ ÐT‘ ±×ä&ålã׆`¼¶ìÀØÉåñì aÒôQŽáß÷5ÉfBö¼55'A$/×PþI%™šì†JPžˆve"µ=®dÛQ.GNžØ*ir¢âÌÅî5¶úœ{æw™‰“qCßöéå¿¥w5Zú#ÅZ÷ HÅԘ‚ïBW‡ïOÕö q‹:‚½´m»8[*oTúêãùOǟΦ—g—ºÀO{¤?¢óXž¿cAGLÚùhÛ-Hèx|ÚüõþÄëG\Š]QBL0ZÊO©,è'Åx©šiÉN,"©Ïδ•¯¾mÄ7¥M¤‰Tk¡œ}Ú6­¹×Þv®¥N¿êÕ¯ Ÿ ÐrÚ0RœL0H>%nåjXŸ˜ubVµÞj¬ö53T¬ÚŸƒõU¼ve  qˆ¦Á§f‚üùgX¦?GúǘK(»ÇúÊs ’Õ'#€ÇEŒíãEj§;K´;"©úsC#} SØ{ñbo¤væ|.ÿFÆDÙ,‹åÍ“°¨1ˆò :ôo²ø§5x¡×þ'ÂÑ;^¼ªë.KïåÿqšÚ:XëÉÛ‹ãï¯3 lŒò°>?ÿòRcüoÔÎûë·zpzv¢?v=Ä kŒ™’T§E9…ÎÖÈÔÎuS¼¿ÖÑÞœþøq*å‡/oâtÊ9Ït©Ôù\oâßús«L‹>}¦ã–To’6ð€šÑ0ÓçݶàØ@Á}……Ûm A°Ç¥Ñy™e%WæÛ’*¥P=÷ì DÒ h„Â|ÔisÏ~v>çw³TŸ¶Ê‹¡üûíãùï÷‘Ûžûy¸XÜéʯ>ÜëÆ§ÿH_¾úð•.ûü¡v;uØ`5&&}1Ê÷åü–^BA\¶òi«ðißÅòIDü+ÇΤüU”·RŽö Àœ]È@:êÒÄ(õø¬·)ë–Ýì>NwýLXèû+ЦJŸF‚J°ƒ,.ƒêw]àc#ÜÖ 0OSÎjÁ¿ÁDžËtõéE8Æ“$Ÿâ÷Uw2‹!æx<_Yß‚ë#¿w0ÌŸkO’…C—ô¹íZCèèpsŒ¿+x|NU›šû6g¯Ûñt_b þü÷ÉH6 ÷ïßT|s7M´‡à¬R`£š“T/Úãn>ÄJß[íÿ,ÛF&éýP¹`®z/™a™mTˆ²j‹7ƒ™áöf§ ›RÎLèÇ‹k‹¾I(2Ïmaó&gêš®»I}RËÒ3xRH†|‹×Þ~ÛÚüaTfžQ÷…œ´‹°šKT‚;XÆêêèð ëÖõÎrêçCùÃù@èHÈP5õeŸ†œŸ”Üë<ùíxÑRIÇš~¨½N~îôþß³ñÞdÿéÐÉ¡×8WØ×ܰç\ÿh¥5ë òëÌ&dø•š1Å)ô=ÓõAIúx{T’™Ñ?û“ƒg÷¤Ký›÷éxçMr”Só|—n`€#9"}Ý£rt¤ŠK“°ØjsD’’߆`BãÄ[ûm(¶1HȃÞxQ’$ñìþß!·AÈÛ©IÖ’Â(©¨wG< V¤Oƒîó¼Öú^CDcM·ñq¸ßÞ‚)âɬW܃¦²ÀmEyÕ;3¦aê Ðõh:†ýü 3¾(c¢Ö~·ÏÇ#@šAF¤++ÜÑŸ9ó6×;QO9(ÕžÉ訬5™wŸ¶ŒúÝÛ§ÞîŸcVm=CLYíA§|ü{ÊÍÞ×Xä-¹ÎdÔ¿G*Ük o²íøãq×$‰XÿÅfÕ Ùö¥Y×{*-o‹î¹qxNI)xëPCONzßm7²'‹Ðêçë/’ñªÖÞ5^iÜRÎIC?$àÊ;¾·úÜ„Þý¨*Á]âÄé´ŠÃ÷Èç^­Ù¾î’8½_sËü¥MDíç­³{;ÿ#þ›œéDÖuTÓ©?ÒùèÅÜPàŸ~¾>£ËñÅ™HÞ:èšA¡ îO{ÕpÔ¢w˜¥©*Ú\V"™5¯º‡²Ü&x=ÂÚ®(|R$âµ/½!íÛþcpË|ñÏq’GeµPÿËõÏ‚ÒÊþ3þÆèëÿ59:”MžìžMöžíýÿßýOüâ¿“y®/ñŸL•Y¹@TVT±ÿH#@Ì­nêÕe.œ&‚ G\Îùò¸x=á ˜tÃ'ù/ü)rBg²é´L˜Jç¿((6¡ºÍC\P¦27L*)š”"û'3êÚš!Øùš_Òn°(AÆL¯¨NÇ p;ð ~qVÖËnˆû/RçP«n×½[·Lk*Ù¸$‹AÒªÞ|ü9¹ÚÚ>4 ˆ÷y xQП!ÔÔ§ø/öÞý¡#Y½¿JEÛùÖ–„„gF/0†\l“„sð#ÆÞìù²^îHŒXIØàØço¿õèç<$œì¤™~TWWWWUWW±¹°ˆ–¾NÄòŽ¥‡—SÚÍ'€¸mæ¨ ¢û4™ÇE=R"Ñ\ͅ°”Wa£1N Jøxb¸éÞ»g;/ߊç»ûÏö¶w_ì‹í½=ñÛö›7Û/ßîîì‹ßvßþjâÏÛož‹·¯ÄÛ_v÷Åþ«ŸÞB‘jq÷å³½wÏw_þLÕv_¼ÞÛÝynWõ“x±óæÙ/ðuûéîÞîÛÿÛ/Ÿ‹Ÿvß¾ÜÙß_…ÄËWbçïÃþ/؈èÕ(ø?X÷í¾€'»ÔÞÓ±·»ý6™Ÿ¸DqÿõγÝí=Ð’_>ß}³óŒª>{õrç×wXm{O<ß~±ý3ÃmʯÅß~Ù~»ÿ ú~ÜGë4Œã§7¯^ˆ½Wû:ìiU(þv«¾~ó ÀÞ¯Šß~ÙyûË΄}þöv÷ÕK, ¾}_«âåÎÏ{»?ï¼|¶ƒ_ai@Þ(øn_V¨·ßìîc¯Þ½ÅÚP„6^îp‹„y¨ŠPPÿ;o`Ì/¶©ÕŸŠÎL¬¯ËA‹*â-ŸïôXPVGQ|–j!4ç •¢=+jO™'ÓYo0^=Ú*Q£’wÑDÔ‰ÃÑF‘´fù¤º_ÜFKø£X@¹@TpÁl XC¾|ÛüI7HßÉ´p°æ­µ ›âq_½lO|­òûÏZkÇVú~Õ^,ñôEA¾{úÖñáß·ÿ!Â'xØÀ‡ÏÞlÿ|Šáqók Q)î‘·r©\„paÂ}'ÆR {úÞïÁ{üòUœmÝ é%¹Ø9U¼ôE Õ€q¿t^F[uE}åšeÐ ä¬^.—±QB=ª*ÐØÙêÞïÞ{Êáƒ08¶ò3ò5„³™¨€ˆøõõzÓ…È÷ÚÍÀnæ/9œ Õ^ Úëº[¹ j\£îµ€* ù ñô59僅SŽÄ¼ÔŒSÁ+O8ÔÎçûÛÏ7ó%<µºÀÓÈMqÿþFØ$؃~ØuG|D;†‡‘:îBO”Òýûeâ‘qÒé.É- áÐ÷g &úH} -¿Ýn­uØ[¾ßl4[¨d+1@9å’3ìxT{F7%¦‚j@‚ªÆYO„'~„UÛµ±‚U¡ŒÎ=âR5è³ü]áï+‚A»f#<² Æiåv¬)En¹†ˆbÿ³5 êzBUtä.4@D‡Ø×*‘sñ‡hJ}]¯ï³ xšxßåzŠÍÁàƒŠ³µá%V¨¬¶\h[ ê—$ˆ%šlh`Â)˜ÓX]S+…ÜG_¢¥8SGÒ›þs¤>o#†þ¦ð`{Oü­¸ª±Ô¶Pu¢¶…3LPaÃ5MZÓtí žšvG³.4иb5Øo™í=§1lc!»šD²Æ ad-³‰´Áì@ºIN¹ Æ¢ÿ嫃½W/¦_nÛÄé^àDм¤Œ^ìvl@%öȶü_/öLxã7cbÄëIê°«Â*z7»èN†Ê#YÕ"û¯Åìùgûô¦º!Ã|ûlØMOx-`÷ ¯Ñô0þO=ðê¹ýç6~®oÿ!¯Ïð v|yŒggà³m%ûnÌ\´†g¹­(·å¶¢¿¾­è‹ìƒ{VÑYLì(FErOB¼Æ‹GÉoÆã<«5Zõb¡¼úÅøŒDˆíÑè ¤C'æÓËÿ^{½Ý¨y­z«Xx·º¿º½ÊgÅ=!Î…7¯.֔ɵ‘!'KÍ¢~%ŸÛ3Æ´-*¨÷–Ô—r©Ä§è_3Ö©m„çŸzSrÉxò½6¶pT˜¨;Xè)vTêXZF’ŽIÑ@ÅÅ"h2Ùô«O‘8R4Z þ}6žD')/”@ÿß/ = ¾}5ôBÉz¬>îÇ™Ð{#WT:çUüÄýoø0=§_цê÷ÝÃÒTxêÝùº †€à…ÿk¬Ë3Šps¯ÃîñA=Pe§ƒªø ÿOõðµbŽVÅýÚÌ€®ü|ç黟ÑÕ‹`¨<"¹CeÄ®Kóªðôì°tL¤ø9$cF(é„ÕVý'TßÖ½¦ç Á9}ÆE OVD­†ÈëàË¿ìÐ˾ÄWÿF"ÁgD Q‰¶¤2ÙñøN‡ø7ÝKÃkÙÑŒn|Ïã¿axëÙÃ뙆2‡ùo¶ðä(vOS¤¾ôÆP"6ë…ÂÅ”XÖùÊ ¬Ú?/ÿÆDuɤZ¢[[¢Ðà Æ,§< ¼ó¾üy·‡ BE5L\ YïÈY€ c|ã¶ H.NU¸ƒ)x74ø èëúe† þgU:÷[ê}‰Gœ1~–OõK8HÓ¸;ܬ–x^ă&~>~»*³ TÅM8âêÁ…Ç”s@üþz2û»?¿Þ z¸îqêŠõ ÷{Ñ d¼xŸ­}áIÁ_oBT¯CÍä _º„D8ZÝ"ļ ä.„7°O0œ>´ {„b´<¶F“[8OJ°7ø^©WÆpJ¿aä‘‚‹£À eUzCVô «¥ãrY^vbÀ^Á}OQGUV9’^ÅxhX @5ÄðŠÓÓ±Lü1Q÷㌯ ‡2 ¯7=TpÌØ±UųWwñqB)vÄ0êÓ…iâùnv:‹0ÊÀ'…Žx-»úÞ—ä›;£9Ƈ!ÇóeùÓ‰Ç(› «¾5Óqx qvJ×#9H2pf¼N)(T¯¯ òKà ã‘ñ–7 ýÁúêDÜFââUÙ;Eô`‚FtqÜ‚:^`¤¿öT¬¯®»?Q¬Ê6ÞRoS¾Â†w½1þEååÀpãÓSZ„÷ÄUäOY׉{N!íb¼±ÅÛÝÂO‹ÞÅ °|­| %¦ý°ëìevßQ`esdíód=s2d0ve Ü@—àÙTƈQkƒíüò:ð1:àè*HH§\ÿþÙh€×v‘iaVFî«Ê&bHˆ\9²tÞ÷þU:®ùM ÿ“¼o¯1E ‘IJ²3¤Uµ‘Uè—ñh<9øiïíÁ›Wï^>ß×áNÞ(Æ¢8Lñ‡3:y†nOi5’/Øüoð§áŒo]N§¢t”•v"Ò#5øQõ¢.êÀÛÈtöW.wW:Ç‹•¯È ¬±aú™“U¿jÕ§ÓÕ¶Èvè3÷nÚ²ÎaÄ£Ja[2O›Ú N˜a„¦lŒ`—pvŸ X6!ߞĻ2¨2812”ba¦czG=%XPœU”ï1h ž$c€ášEZ‡Š‰`ƒö%Onƒ®á¯Ôì¼/C ±×‘ĈÕ2ry ˆÁÇÅBÁ››[:£xñ/Ó‚Ö&73˜oŒKPà¤"juA“’σtVð©5ZžŒ_…,ÄM­d8î dbÁ¸àV<[º§o±‹ªÚÑpµcBme° œòKŸ_fìi…B@ Q¿ªœñ²˜Ÿ©™ ±/'»C!µFЍ ŽŸƒå™uÍ£ „§NðÌŽ&áIB$NCNˤƒ+%H °q —˜ Ç=F°¹Ùg1Xòæu¡  ‘Á¶GÑ!EÏF°Õ&SŒé2 åP¯"‡;Åûä#•ŽªÄãÊ8]e½’% IsŒÚD¡ =î­ˆãL£“ŒØ „ÓÂoš„,êá°—xË™· º^ÖÔçq[•rgƒê4aìt/[I,DûSYFŽš‡iBÜCr(Ùª­¢žã©á¡Šë<µG®‰ÆcÁ,íÁè°J‘ðÝ}OÉé[5<%Ñ•q-þ®#OP“c#@x%­¡à+„ÑLõöÏtÜëéiØåðhè9Aeu¸Ciè51GãaOƪԜÎ%,@îctÞÝáhþ5á0n /`ÒðtŠœ{88áßÿÁÈN…UñÁ'ÿ™cx||@½U’ÞIr‡¹‚O Å)ü6±’ßzKT•ÿ>tÑßeO^¯PŽqç_†“ï}ëÃùss†köw|Ú®†³þž ÇøûhÀ^z“€z00݆rSÁ]nêmdní‚ÚÎ}™Kïï¼=Ø}¹óígoåuU0ò³qcšïa»B°óºrذßl¤yI°?¿å¼ÿi<é¡Zœ}8éÇ6Añ¦h–¸“¢òa9‘ì¬ÞC6„n!hÓVÞú¦õMñ¿ª}:ÌïÑÚFeñ¢=U•¾üV#߇P.-%º{D®ØxN¦žþ}ûe…gS‚Çgpçüôà„jr„×_”|â`ƒ®pœ¯á1‚9!h‰íÓrؼKoÒ Ÿa>ó@ܳ“G‹ìï.¬q§º¯:½/=±Ö,…”â—*Y/;Ó® {úˆ8ö¾‚˜‰ÊD“!— Ëÿáž,Ê´¡ëo¤ö}Ùwê*Ðë2‹¾€ê¢b©ñ5 ýÆ/«”Eˆ“®ÕöMK¦ƒéÀ\ù!"+ëÍ‹›x¯UÑi²:¼"g3Uè6HçzVñe†®R½ S’(¬ŠÈ@S-kRIáhÒ°lÈdk‹èvz4èÏ| š’¢â­-ó¼lÎÚâê ‰2:Úá9¼"5`ÆÄã±Öy@ ý§IØ¥¶|÷Õ^t¾¿á¡+}ŒÞs4ð(³Õ¦iRB„(×<’.f¬{I¸N‡ãÃÒy¹ð¿›ÿKýÕ&®Ÿ×ðÓ#øÅó=,È:â× Ž@ÃsÚx$_YmáóŠ|\¶[í• õµ§ƒpZ¦]_ ¸W$Ñu òÉTNæ6 ÍwŽ2Ê@Ǹ»ën:VÇÔ+à’ûõVëžïÀ˜š­V}}ÍçQü°—4(¬­7ƒõV³Ñò¿µày«~»å­ûAsÝk6[k¾ ÉV½üqäÂcf<–1Omû>¥P¹«j|&ëÐVd»¨ÁdC·áÅí‡ÑdÀ‘˜Íx¹6Å㳉è‡1kF®8ª>-Aqv*œÉ@Æ_åÚ2r4š¢¦N¯h\«&ÆÅ£š›hTI tCpú‡/ªØQ‰¦O5Ÿ{&ð¥³){±á­¤ `c USœPÙWV$H¸T°·6­bºÈ¸U –ÞT»-êë÷ ÃÓÂ<ÖZƒU§"öÁg]—F8oð”w5MépUS(÷Ü ôâ¯jª4¬¨Ö·–Ïᯠ…ÓÙA?ÄüŒ‰µ¿amC6P>Å‚p€þªh!‘â«ŠÖÆA4¢•Àwz# d«€ïCc'Gzh0 æª¦KõtKh ¬1‚¬q@Ü&Qþ‰¨¥U,~—Ч¯&Àø@ó 9ý]¯éMÅŽð€nL§(”¡@§tàH¨‡&)Ï*¿¤q í­61…â`ýÀBÓ¯5E2ú6µí¹\ÄA*»ˆðR”zè=D™ ¥"ùÂÅ^ yŒªI4óMa ÇšXP£svrzpvj*­¬ ¿â˜d9§Ä¾E‹iôi‹RŒk,ÌÈÏʃHN·Ñ 祋NÈ)"Žsµð%Â$û¸Ê«Â…ÆF|‰nÌ(–͘ï•ìiPøq¶ÄùÓBa]eš«8KHmŒ± H™Ãͼae‹´tÒ¿¸R«Ñ¥6€L D?ÍÐât!gÆ™Uù(s]Éß^‹(NðÖovI³I¼Kâ>æ©]R27)ºQ$£ç¤rÓ± ¦jBÝþ¾òøQh¡4+GßÍ´Íü Hçl§ïcÓb—+5dñ9Í ¥¨¬gø^t¹ÌÊexˆØå4IŸâìŒå8çÝ«X·ð’"9•ûö «b]n(%̃êcª"‡|¹ÌbD§ŽÜ„l¯Ü±-0{}Ä-¾iÖ[,¦í²ÖýK—L¿AÔZm™b¦,¬$Mž6©(‘S R©&ˆØr‘/ùÂY«BØãwðcsøØ&9µI ï¢N‘&÷”H¢ºx\L[âëëÐwY§žaò¾7ÿT¦<ú½â5XY©fñ5åøËA ®ÝT];ha9A5³ÓÄO´ˆN†c¹”Röã^ Ï6Á(‹Ã¶ºÀ)§? ·ÁŠhT^£é¯tH£L©d™gȸñ€Ž1ô ¬öZU°h¯CºöÀ¨Ýô‘Ç8:%uÁT —Ç™œFö#t°š¦hþ‡OáÓFQ)ìÜ ù85e³ Í›ÆR¤êÚ*£àSÉËJtyÒ”¤ØA™Ú<ïÈÇæî4ÂéôcKŽmê܈ ?m7§Âº³NU|(;²|1¥H§©·oc’š‡Rdž¬+íãnYž#±›2Ñ ÏzÈ÷áùü¿ÇÉ,#NoH½NŸ [4ª #.Mƒây¬ÅV[Ñâa33]Ù'tOG=PSå™aözÀzV-}²ŸÿW‰ïådߤóE.†˜Ë3Uïƒ×4SÓøw ?¾žK¹[os> “¥k4àt3x° Sº¨ÐSàa VÓù»ÙÚž±hmï >¦Ðzî509 Ÿ“{íj‘ ×Ñä(úS¤"%S¹åªjÁ»åû° w£¢2–“q6?rØ É LüJ耹ñ]m:̨*º»`>;,Á'Óè#*íþgÒå—œ§Ñ«zù7Aý(qÓ:;C"ÿ‘¸êt o©þÎìAªþÆ&ØiÀg¹~_/8lAÙ“Çr—oÚmÙo©–Ía-­Š›)CœÅOR¹¤Io+K·‚µe› (–€|dH“A\$ÐL#°™†,,C—ººY—|½xß–s”®Ý‘2ìõ°ß«B6:GxS³×ÑÄ#?YÌÃ0cÕñ\Ù UˆëûÖh-£"`þl¦®-·ð¥Y¶"NZ⪜Õñ~µYõÊe[æe¡Ò¼Ð7Lfy†±±–„c2eŒâ².Èn#öb% ú${H™Ä®ñ5]6Ðû(a‘'ç“÷±€6ÚäDa£VÝÔM¡Èu w†¢>ObÙ:Sªƒf‡o ” £_j[Ç<™OñÞ˜s8ægÉŸU[¤« …Jš¹xòÏüˆÉtEËqZeœèÆMùkº ³±‚BIÿ|ª‰îq?ò;"\ÜÙå…{ :¹4¡27è÷q1ôü‚Ìrô¶¶EŽ5?‚TöXÕ§!$T¨j£ôàéîöþÎsµh°IIéDÛh6&oŸ(¿Ï“ôíýx+¶³¬.”„DòøàЕ§™:)¿Ìºcù é‘&i9CƒÑ ï^ïÅ@Ä” i¢ƒ¾f*:rÑ@ܹ³ÂM‹Á’«ýCw™È–ˆJàÕB•¤¬qd+q™ƒãÑ`zÝÓÙ"[.¡½‰åÔ·x?1%î8ŠNí—_ÍTiM—Tj‰Ù±ÝÈW–Z:z…|H[4×§)3ôŽtø@“?@2pT½TÚD¦kÆùx)JŒdöïiDgÌ¢5űe%þÀã(ÞrècÚ`Ì`¤š«vŒu¥­š1ñ~}AÀ¤>»J®•Œq驜4\(¬¹Vr´Bœ.hM wÚ>äö¯v“9B€>ÃÕÅUAt&µ .&Œªn<c–'I»³v™«­þ¬ÅŸA†13ó2H–j5cn,1D×h¾D7ï¢LªÙ'Æ4`Ç$_„N~ ô§ú{sr S÷ôµeºd˜°ˆè•¤nÙaFÖ|jRóÑíQsúŠ£mQ9µ´Ä¶ÿöÍÛW?pg:™’sðeSE܈)ËR{ÈTvol¦Á·ÛýC[mw~ùêÍÎÁÿÝyóê`¾cC·®­,ê!p(¢:m»:Ç3<ï¼óI‰ÕȃÝÿUª7&÷MÛíÀyƒs>Ùy‘Ìíí N\·ôV0/(¾òý``GïrÉ=˜FVÆ$N;Îl *¡liâà<ùWúßÁÝéæ|jþÚj·mÊÿToçñ?oåç;ÐÿrÍ/×ürÍ/×ünDóC-재Ž'‡‹4Qlþýƒ½W϶÷v¬‚€fa±Å™™”ô*;(¥fC'©Qdî!*¼!TB”ÑÑk,½¦*b‰¦2ú˜ìÌÔ'{ “@iý„®Ínkø\@úsðµMQaT ë]©\Û’o9˦N! •@§êÃÕ‡ŽW—&!ŠNpÉtýó5“Ÿ2}ÝLbÂ)åµLYO,p u¾ÈïìþÙ //uD,ñˆ\ÖU&RDrFŽ‘I7Q¬ûÛÊjл/g•/W›[uµš„^ÓÇdDe—çrºG娪J¯Piu,¨ÒMcßÛ€º} Éä:ó³ùåê¯ïú „,)ñEAÕÁ vÒZ«}°®†™sP9H¨P±Pº,ÙÛ\QÓè9óŸ¾Ú§±&?Ê«r®J‘={øéRVa™)Dε=cê\´"/Wd‘Ð×Ì[æZ-f7&G•gi  x{gó¯äÿ^ïæ€ò»î·„×j¶›V»Ý®£üßl¹ü?¹üŸËÿ¹üŸËÿUùÿû8ùÑOŸÈp»G[ó•ÚŽÙÙëÍ;‘!+½ÞrÇ#ܰu>bXöˆDžÌ;ãÀ£ 4Cz|ÐÁæ×ÊçsyÔy”:UûÈ#º¨Jå„O>tKLBy•7L<ËÞùïxÜ?ñÉË-q$²6ïD¤×“Ї{&áÉ3 uø ¾ÿQÌ>€ÀVÜS“>ÂC§%äi7 GìʤÁ‘öbœëB…x€Ö‚•8P1˜¬{xvi«wxè¿·ï Z– ÿKÈêe÷L(YÑÍ|äC˜¯˜°´/‡iŸ¸Èq›wµ$5 Sú×â%q³Gw~’0Ä&¨˜Ä}åÑX=÷zhz_*¤³/ à ã%©Ñ.8HQ Ø#ÈFÈeOX²iù‰HEÚž¼Æƒ«Šóh€ò‰'Ÿøò }£`_‰U„½câ5 ‰mTÅ\Ú:çÊiÏÆYÑÜaÇ”ix kü´àS ØÂ…j|£#ˈ,ùs㋪òdŸF Åû†Þjƒr—™ëƒºû¬nªœsv¸ùôþYÞ\Aoôšßâ*,69=;¹t‹²ö <7™‰±Âõc>¦EtÎ9œ "î!£†—¬†Ó•9ÊAIŸ†c¾×÷YÏ©tÜ0þ>+d®­›t°_¬ŽT·ìÌ]q/ "¿Яñ² ìÀÔEß’Q‚­á¡B^K©K°†D‘£>l˜(<¼9 ¸é¸LÆØa»_´Ë­¬¼×¾›²Sz£)éëåN19€©CEØAée>Èçaðô}f ¶Ï=©ãØá'6 ˆjÐ`½Ö¬¯ Mð‹g<ð-~ˆÓ/í(³¯w9Êì†H—ï§|9øL]VN)'˜W>Ež–}ü*‰Üôg׎ãÏçÿ²ó¯í?wxþÛ†‡dÿizmøFç¿­Vnÿ¹ŸÜþ“ÛrûOnÿÉí?7êù;Ç Ö²ô,eèYÒΓe湆#l“ý`•TQµ$ þ¾¤ókp7ί¨£Îu~ÍPS­ W5-cû‰™MR/—µ“PÇú|S+³ìŽ@Uz¬‘W]ÍŽñ-­ŽqÒÉØF«6Ø.Å[[@”e5}úŒX»Ij—Jì\ªÿÚÒrNEOƒËº¦ÍE®©ßTYº„»êœùWòÿ.ý?ëu’ÿ[Íf d–ÿóóß[ùÉåÿ\þÏåÿ\þÏåÿ»’ÿûzûîÏ“ÿ)_€¨ô—ÿû1ñ_Õ¾†ô4HúÚµ Â>È; ëë’²¿7²ß–ý³E-ù¯¹’¿úºXò·®µék·*ðWúW;“¼QQÞÁJBp—r{]etÅvOŠík‹Äö6JíAý’R»ßú^¥ö[™%ÿŸïÝ™ÿg3¨7¤ý?hûu²ÿ7ƒ\þ¿•Ÿ\þÏåÿ\þÏåÿ\þÿÏ‹ü±8ØGY}©ø$T|ëÜè7ðÑj˜­FZ|VãRá=îè„c¹ð~¼îÙ1VtöpTyT+Vª©Qµj¤ˆÄXq ÂŽÖR*`²圴”QÞíq§”¢E9szÄ ³4óä‰ Lp¬Bõ)©ÅIP|ï%•cv벓œÉt§”é´ÉË×”Z¯OSVõ­-q¬s.¡šqޱ-;Þ 7æ0„ç6’j=@>pðꥎ~IÀø-S®Äõù—.¯ä§¯‚G¼²Âñ  ?’J9¢âÜ åÞ¹÷{­6 õ„;Pñ9‚º^ÎÓ¢¿ÆòÜšÒ™ÛI—Tx:à¹XÒè 0š‚L¤åܘÇu„$JÛjú"þ{t!–€¼Ë9Ó6(‰ò´½ÿlwW&y]’‡ÿAE›ž&¨A_ˆû¿Œ?a¹×9Sü„ΧP²öšb¾<;é©‹ín÷ Öc4¼¸u°‰ŸÏ@Xû³(µý×d•v©ÿ‚}ÿv4€­ü÷דqwÓ bîë=àj×=Ø‹OWÅzPó=ÿ½‚è ƒ.íwÓÇð¤à¯Š7!ÙY`çÁ憩³²*f´=ÃMô…“Ó¡L« (€í|¢ò,c BPúÚh†ûÒ(¢ÐŒýáx<)¼âc6°òª¿WÂ@©€ñaôvgYõßg¡ÜK¡7Ü_aµ(»,&`¯à ¥ œÕpT…`Uü„I†Ç°]£VÄ)QêŽ'åé˜#8€&T¦Ôãð¡LÃëG³É–:ŒFˆ€Hæa¦ íΆœ, åÌí ¶#[P)ÈqÿñSñQŠóÉø4< e‚ò.È'NæuÙħ#ØåuØ , :U8”éÏ`>Å[”Û˜R%‚~PLõUAiêYèšNÏNNI¼ f0Ð8á0p êÈcYÀLVe豈z0AØÌTøQP‡†ø¯=ë«ëîO«²·Ô۔Ћ,꓈`†‡(¡è5ŸžÒРÛ)Ú•u ¬šJLΆC|8P9•Q$ë«¥Ãat?†Ã3Õû‰ ‚S(1í‡]G¾²ûæIâÉ••t%¤4–Æ*’ì$:aéõäåahóÍC‹”ªš>¢?}3“¬©µ&®U¬äFlð/:Ä&‡@Œg?ò[jnäbŒU²“=A€?)àêå)WNT;€TI³ê‘lIÃéqDé¨b{ ùJBfxš:;ù'¤Ì àq¦i—Ï Y/€,H7°2Cˆb‰$½Lðì1ŽGCZ6Ÿp @ô–µÏBÒ?"#½ÇºÎÓ=²Vsd‚$5R€“†܂ֹZ!À ™Ë1|ý÷ÐMÔSŒ5&®ÿl4€­â™¶Q°z¼æªÔ< ³v¼ ¦²r,Pb€†ƒãHøÞ¿JÇ5¿Y–ÉÁ›á2P˜¢†PîPìÆ i•E,=¬AªP"CJ-,óF½SÛ–DO¥•ˆ³#¢…·‚¡íH@êDŽÈÅR%½ŠŒÉËPa–E%‹JªÙªl¶*r™j?sËÊ4mŠHPM–ì&U Û“CÒ寧kÁU-ØÙC¨+±;Å0Þ=¥]NzÅB¨€•îì @ú!Ì(MY;¹=P-aÂPD¦P,`«,\À#)ÀÞÑGm6T£)ý$êâÍ2Ñ+Tdˆ"Jª+L3Ìï¸V[©Å ÁUêu$‘cµŒœ ²3b(:7·Lžz†Ž‰ïb A¤êÉ èðâŽ^­ TƼ¤þ‚O­%{x>!Y, . (²¨¢™0rw¶=®F¨(‰Z¯Û͆½ä«jWÂ;Å ´}B»¬czéóËŒ}©P´“ð¼äW%”ÉJ¢ÐHf+žªÍ• -ó%áÜ%@’¤´Ìböm,Ïìg] EÌ "NÛžx°)þWžwìrŠã 2J>PÇ!o¢Ù Hmvþtùæÿ¤"£W óÎòF¼Ã<Ž?V§,´Tæ?pKÈ}‡ö_¹†‡¾kÖÙhòñ€m愈„‹ªX+' _.Ýž_Ê–êÜLWh~ìœêR~x>J’PU=Ô¶¤è€È¦B¦’HÓ¢ý‚–ËçR§lÐNt¶yòLSyd3DÍ„|$#›+¸²IU­çǾŸ>rOÛ—×ÜŠ:}6ÀôšeuAˆDGY…Ðú¢’t‘ý4 »H?΋/2}·¯ A»O_(L`DJß·Ì)¦=Ó\YßXT=ÂØžOžˆÚXTÄclPöKçåÂÿnþ/}ôW›ê¯t^ÃOàL •ò=,}Ë*âWÀN@"vZx$ßX-áóŠ|\¶Ú$œ•µ§ƒpZ¦]] ¨ U#a ©°¬ô# ¾ ~2>G¦zÆ1òbÝIçB·pL=¹OÏtX__ói<+ˆê^@ÀC‘`m½¬·š–ø­5€Ì[õÛ-oÝšë^³ÙZó-îT×O(Ù 4P( ÌFŽžˆO§°Æ‡«rd pN&c:%aã¨x5˜]¨ð6¼¢™%šÐA=RªŒV еÏ&°~#û£ót”ÅÙ©TµFÓÂ äª @""£ÑM$êØÉÅ5ýÀ®I QñL`rä£ì_T±/(ƒø^»]¥ê(Îâ7øÈuëð)øW­$§öjÕü†,Û#£ŒOêj—ÕcAÛìÑ“ˆ;¥-u¬ùK„0 A¤GèHÖ„æÜé\㚥߰$I\ ÇÜC(„0¹´ª|“‰”Æ ’à3“†"Ö=AjB•–ê숬¯«DÑÜõMfiØÖ¬ÔÙWKr)/K“ød$ï ^øRå¶MUaϽ¢óÓñ¥Ðé`ѯ…î¢#ß”•s~«}ØÐïj<¯e xŒlgJCl´aÆÚØ)¯»Ñ¬Ü›Êz=  ë­b øxoS°¹½V£Þr)k&2mFÊ2Ò&o¡ïC³•<Ô#æFbñÅŠâ‹&Øá)²aÚa ¹êãwä¯Z•¶k”ÜÞËNN¶©c±% Qúœ·Ñèà4$㪢À{:šþ~ÌNDˆÄFòV¡±ËŽÖÐ?P?òæu *LñÓ‡„G æ” xÖ¶yl·ÓÔíà§cYaE~Œ5Y“©VíXW³[gíDP°|ú¼%ÖË®KŽ=嶬«m©\ô zk`ÃvqÕ“–zeRœÃzÜIBÞcõɧ¸ø(Z#壄# ™€6v™ë„Ë­ãžUß°59¤W%±¢¶jÛ†ˆKÙ`ÇÀ²ìQF¥ ‰tj’ç:29–éGBæÂ‹€Ê")`Ô/Fó±ºêtÈw%Ö±þÂÝ×Ôk ‡nà¡§¼oZÆBéI-^TG” ¨ó´¾7=*&¹SAÖÑAö]™ýeth—BçHü¨„9ýËñ'!ß²†÷P4¸€Øg=9;­ŠÀúÞ­ ÖãpĈµÔé `àW$Ì }  ¥Â—{اq zñúÍγÝýƒÝ—;ÿØ~öà#ŽîˆæÈEš¹·ê(e k°µ0PSßÕ/™Ë^¯&~Α?yŠ+É–¾ƒNHó'h«¡› YBLd“c+¶>íÌ(xç}ãQiC nO‡,{YñÚøGr1ùÈqħҗ ‹k2¶ÇÓRŸ£ù©Æ9 |™Ôñ8EÛøÚD\ø[Áå+œÚ8´ŠéJF—­ªŒ‚¿ªG+÷½Ú±lÎÞø¨I(CANdË*É<&Ô¥µ ¶ÝMx™¯Z¦Sîi( è½Ï_ÕëÆL¶ZW¾ÅMHÇF+ÐAtĨ—`…ÖöéìýžÄ—þ«’àj'øª¢ª¬€TŠ¥˜ê©ì9¥×5¿\!á€U9³ø7õ¾Y؇ÆNŽôRÓ`@M3kêé–Ð@XcÑ쀘o¢üQK«0Xì?OÆùáåø@orú»q}~‡×°ŒG)c²•ã!–ƒ-QYí€]ËýbE=6Âä"³Ý›‚´Ú|Ä´¸ƒåëN—ØP ‰1¨’ ²×8š£Ê z²´â½JqPÀü‹ìcŒ *îâ{z)tlê…iÞ—ѳɲ Ç’Ê•ÝÇ·—¬’{k"­#«b¤òƒ³SØÊÊwDŒ,gòbZh´h:ÎcŒãk™ýY¿骳:ÏèÎñà ƒÇçNñ9kÎLù”å *\hR™Q¥Ï¡•õ 39ÀµGèRóǼhl#1Ÿ¸ÜPž‰ÏEÊdX9EÍNmJ5<‘=m*µÚ89+&þX¼2…®æV‚²$iÙ¡YlÆÒ6FP› €ÇÂØF±`µz$H¡0}ì©íZrVÏ’šž“Íá(üˆn+÷É´q_$ÿh„"P“ígw4;ÐÊ4ó? ¹3‰Yûú{ÅUµì UYLV3b©_è9¦ t4ŸSºÜVå3]LÕ{Fˆ„¤ÖKéêî{?í½=xóêÝK´pó“¾0Ïz‚ªØcŒ³é öµÝ#˜Oó|ëŠ!K½éïÉO±²©À²ÌáÙ ÊnV'K² .uÁ)±Üa ,V¶æ¬°KsU{XJxM]ál" „ö”£ xœÅÑ@ö[×ëõ~€7ðÙÔ3\@y˜g™û-‰U«—òÊJÅ0~¦rCÍCÕ–fôÆp¥žd§†¯'¨‰wò’9Ž…¹±Ûú-M=°ú*‡Géî)qÐÁôذ@ 0)n˜†q„î}òpC ÚÒL^3EµViíTéi1ÛZ% ØÉn¾Ô¤mþW3m²IÞHîßiJ#›¬¦#ŽÌZ¡èÙZJ'>S°ô& ß@ALÍGFð è”Ô© d‹T8 ŒŒKs@¯ððGüô>m•A…4§Aü˜·eß|ŠKq oÖ°¾Óñ§&šzKtlwҔ˨ƒz„yÞ‘Íù ÂYôc8d…À©akV~s»³N¦Ï™îbJ‘NS!n߯$­¸¦²;îÛ•öñ³, žÄfɸMžý@}dÔ ÃyråSåàsÔc3ò/“*²>µˆ»ï|ª…º.L)žbm¹Dm¤h4÷;ðbèrÙOõ«g³(ä–»=a3-Ž‹¼ÛFt2Íç"ÊV/þ}6žáóéc2P³E“\*m/H<3è >¦Ðzi5 HHÖïVõùÆëhr‚†»½tI ˺rÁTÕ‚5vÁöa/íFÚêOg °“‘sfHw Zâ·PB<  žD't”1˜QUt‹è¹;¡? <¾8“îä(‹^õÔË¿WC»ãÞÍÇŠ%$Ÿ]å}tQÞ×yß`ýù¨ûM:䛈 ØUh›ðµšv[ö[ªec;Ƥ‚ Å'”ÁÓb:'©üǾäÇéÄd ˜‹rmÙ&ˆÆµØp…õl'ÐË1°—£,‹Q—Ú¾Y8ݼƸosZ¥­w$ï {t²ê{U(Â'ÞT‚–سâXû|XÂá|›SÍ7“ R…¸Åà«¶4qeKÓ³µòmSÆêh¿Ú¬zå²-¨²UéXè3$¦³‹!ÁndQEŽÉð ”`[r3…€˜ƒ¾b±­,™F ~>É%R^±[úš-èٖؕÎ[H@ü—°\£(dÔj¢›Ê‹d9XÌ”‹lA@Z%™å„‡AÔ§ø¥D4%olÀ—ÚÖ1ÏöS¼Ø&ÁŽùYr¾Ú™ŠŽô¦0iv£kî̬˜†W´|§•¢‹hÆŠ¹)§?åkÆÎXA žä|6)£wÿüî‘‚˜Â Øäs#dÊOXi9¿ ½• 9„­é±ªO/$2h/W”ÖHÚÇÁÓÝíýçjEa“rÜco1ø /“(­LÙ¶"@h²ee¦.Êê¸îX:>ØËDî«|Éd €Ç„ÊÈB½÷KØ`Œä¬mƒC-WÏð¹¢\Ì¡h@–KËQœ$ܼþ?¸ÊÄ&þ$çö㚥LIGFª’%d¡A!좷b̤@гçý*R•-3&D ÈŸÃa•쉋–V­6xèuì[MÅž¤oòå¼uh$IÁv·TjœG!IœÏ-4¹û¤¯ ¦µ)Wâ¾zÈçéTŸHÉ,6ß­6óƒëÃ=o¥þã¥ÖŠƒÑè=‹Fc\Bü‡?§ãét€ƒðvÀ’5nfˆRYWØúÃ%§ŽZ÷û.2+™áiÝ4mˆ1,¸fÖ|´ŠžMÍiKD¯9«Ëbt²¸*ˆ¾˜ör™ßŽQf¿êèö1Ë—œ4 -YkOʬ—ÅTp(í/ìù}1D'_öÖ¦D³É8\O0’ó©‹Ý³ š&®{4>%Ç[#êX$!cËöClÅJ‹8ÛWKmJªÑyÒWº9)Å–¤ I®¼–FŠÆ‚d<2̘-ú¬ý"ä­û’w:YžÐH¢­CKŒ@›(Dß{†Â¹†iä·#•úœ,Xº]²9T”w…vØTÞD t¦@÷;…XŒ}{¿l*Gi•¿ÛøZÌçÿ»˜;þËÑ Å™ÿÅ÷ë~ ¼vŸëžPü¿•Çÿ¼•Ÿï þKù%ü’G~É#¿üE"¿°ñáçço_mürÀ¤·ó\ÇÁL¼°‚ŧ Ç •ÍÐhU•. é‰ÐI¥è:qqvqá7Ê’ÊÓ»D û˜¬B¶2ùÖ\]Qµ¶_îï¦\µVðák¼«R*ëGÇH›*À>ðî7 ~¯qîVÀøœbúƒº)vpŒËçíxè=Öì ùֺ½ó{ºœì_ÒMs ŠñªGîåOº~ n6кŠVÙ´ªŸðµ³zõégêÎY} ôSuÏ žÖ­úáKxÐp  6í^8´ $HPö€Tjºí&˜&ÌCtpLæáÙ©`Š0Ð;xĒວó)þ+Fç³èòþ³ûÆÇL=¤P»ã‡×[ÉÜ ]n€uøŠ  >º†Ó鲇å#¨ö—z`ú¥0¾ê*ªì™`±ÊpâK^¥}YF®{jR7mÕ‘øá•½d"É â5d… üÄÀoÊÖ"qB8˜,ôzý“™°‡T•PU/&^q|°2Õ½bå~JeÂ!ü]Xù×”Ê8IXwaåókUÞK",»²5iš´Ýž˜7k{òƒ;憎$©\¶‰þ\(Ô4ðßÔ~Û€DýI­~~Íê{ש>™?4‰s7™ÿ…Õç㞪g#~2ñT;{àóѾ¨ò\¤»•aç~¢‰Þî2ÄŸÖùéRË&½æ2«%µæ2‹$µâ‹#µÞ«"½Þâå@“âȤ;¥iuUA2–´Íß}x/™(š]¶+ÚÏ,ùk¬ä¯™%Ïc%ϳKîÅ‹îÙeªn¾&…ó¸…ÂV>ÿW™ËþKQJoÂÆ¸ þw3hHûoÝó[>åj{yüï[ùùì¿5´üçFàÜœs#ð%ŒÀ*8l(>†“ô¾ NeÁ´-#b<µÎ`†N×Áˆ"Њø-m j’ ™]¦Ñ¶§ð9š»3¤ÿ)6ÀBªÄÓŠä‡×°&#¼6DÕ…&â(t³°¨0Ϧ‚ž)ÃöÂSÉLÀË© À2¢;Ù‹º.É¥‹«âïÛÿÏÔX«X=?}Aáåú²[éÊ« J|¿æu˜öW#Œ vP°1±QüÂHR&ÑáCà¡-iÆ¡H-÷{@*s‹$:KÍz ¦lÂëwØH'êclFZбD|¯’ÂøH(‘bD‰B\þûlð1F:f©Œ×ñ¢¡XóÎ×ÚÖDT 1êÐñl2®µK¯Ÿ4ëUñâÙo¯Ÿa(­ @My‹#lœàü£‡þ`ˆñn†º•Q0’2²v޾‡­K¬P„£S\D‘ñ9ã‘ܸ¥ Ú!© Àܧñ䘰ÊÖãfÍ™‘ÞêÑ}»çéLËI{ ‡-÷ØJ£õè¹–ˆU±ÉkDÏ5Þ¼€†kÙK\OUðoŽ\ÅõÙlOîÍ2Þ²š™ÌÕãÀÑrÕc#2Lh‰bAáV8™ŒÆXz6Ÿw(Ô·¦@göÄ‘¨e2>† 샊rðg „@±A¡™Wˆ˜O¼"#«šzÔÈ ÄmWÓc) ú(ö èhRNbŽAÁ‹‹åp8OÄóUñ c F“‡„¶W«ý >U¡Ú±ìhí׉Á.ðÿq€c 5 ÀJnsZEBA®_”X±`ó9G›²¤âe)úX*, 3æ~u$±$PúTÖjöSôpYqÐz0DßûG"$ÇÓU€ÝH?áž…°ÏƺprÖ=âxe2RY0³8 Ï'g'º&ûï:t¨"G†Fî 4Ë 9t¨2¼à ïòp'ä¸ýTK]Þ)õ*X¾Ì#(E¸‚ðD—‹ð HùR©ˆëvèüïÕBø¿†Ge´¯’™ù©¶‚Aý( ¤ n pOpˆËÔ@ßñ‰vâí“”múBV4À³Eª„@X2v6óÅ›»ºGú±SŒŒÇG¨""´ƒÞY8T‘ÑŸFÝ¡„qÕWM(}n$”‘æf„b'VºïiªÂÄ «€tB.…ïg:¡z•#S¥ëjúSÒ¥í (k®ˆËJ)ö&;¤æ‘)<‘#îpg' Û!;³ˆî Q ÀE‘ÆM]MôÆ™)—ìîd|õÞèÄW*ìD¦i¤Ðz€»3¾c5ªÕ ïx4î6±ÏzúDÑ€ÍâžÛ.*" ÜáÜ#ÌúP”(¼¯Œ9<<›!Ýщ€¦‹•]\ˆÕ‹Z5¾s” Èn™`Ÿ™á¢z¢dd< ;B=>ð]DñÕlb€)A} ±«$ߨíǯӣã¸õ ùżcrçòøºÓΛ—Ï@kyþë»Wo¥R/&£ÞFæ§9Æ/x±v>àÈ'Ž^?ÃÉC8in°RŠ8ñÙ°’¥ÕŠ—±½±:'ä¤ïoJ†SèÂj],IPÕˆíÖ.aŒTLÃç´¤7‘Ò1º!13’*7I’å`­å¹ñê`ïÕËŸé—³´øؘö&Ub¨\Nîc÷j#Â#wŠúèfÞjЭS…^¡½¡{¤[¬Š‹ñ’ÖUÝÿ0À¿Eâ÷ ¥høL×VQ‘ ›V>í·½±L쀑ææKˆ º ÛG=’‹)Ðr>Eª›RÈ)~JáÃâò®’ Õ¶Í"6ЉpÇ—*eÔc1_#ˆ4Ñá`H®ú'A0¬àׂ«†ñÑCËT6B©1°UX_÷‡Õd @F¼û%R¢¨ØÖÓz`^`8Ê)oâ$'KS2ˆÉÖ~4Å„O·u\–Á¨+ 1o L P’TÓ ÐLúE-²üÀ:&;s7ÚXâ 9|%Œ‘YcxoØOyžÅCQœ y\*§–`62¥¤u, ²©wUÊ1%OíØ¨w6@üÂPË„kضŽ‘a—¬S”ÓpûÙ¯ïvßìëpþÿ¦m$= 9â§7;±8åè¼é¡´âX¥·&ùvS%bF+‹Ø: Ìãhz6Av~¾²u­ˆiúÃóB¢@7©ÚþÐÜ {ƉŽSêM挠=™RžIƒ•Ô.tâ.¨ÿ 4Br¦Z¦9¢ÚFté9ç·X^æÿ£ÐLË”%í£Y #bN"KS“4ŠliD§¦Â A3ÆUKb3¢XC’^ 7qùv<¬¯”:•¦Ó¥#aÚÿ8+#Œ7^|âz+óŠ•–,' jÇãØ¦ÌXUû²½–ÈŒ'ãÝ®:dWŠ”˜ØÝ¡\7|¦UŽëq¿ìüãà§×d Li!C_cX„ŠJž­Ÿ?œÚ,‚˜P,[œ ÎïŠéÀÐ_ì¼yóòï§œEG£‡ á%Êrˆlyµ«rÄI6- rôÎ_”z¯$:[6ZëžrNBµþ÷ƒ7j×Ó›žB˜½óÙJæóg{Û°V÷wÿ/PO—äTÿ³³°½Š<%#C#.(ï¤éñ1¶’¯¤íBIxì~A0“¯N¨…јX"¤¸3ÌÃÔÅàª6LÒȃü©Ëé„À±!ÌŽî­û-^Ò‚äi%ì< 9¾ v,‹À 'À‰I‡‡‡8Ä9±1pÑ“ÁgÖh,nˆÃnW«ëÍUŸ[¢ö*pgó,'`pÛ{;j2Iu<›°@=ÆÜ§µÀ{`%¯\M¹&K4ó¦Lü›XYÝ•Á¦žï<}÷³U`:ë ÆX@kžg”Iåþ)f¥íÃ.c›TÅý¿Mÿ9õû¼¼²ç`†Î¾ZiVƒÃA‡Z´žQ–; Œ´{(è-Ž~_ñû'øÜ¾ë¢Ú`ÕBy”Q±ŠT7Ø£l:øÌ’Þc²냦Õ3pŽÖÛm4˜¨'ÛØ¹±ŽêäÚÌ«¶ëê›Dº, çµðE|ƒQHÕ-k@ÑiR6 Ö3«÷Âo:Œ¢/êÞZâ>÷½ ¡_hå_ñ°5·×Û­õº_o¬µ‚ºßlG+Ô¨;5œ=U+ ªv^|ܪ§€”lS²ÔAÖn6Ûíz=Z­`“.HßþÇ%@ªgà)h/‹&ÏoøþZ½Ñò­õ h2MêàìX5v{Œ¬Ž/,`Õøvc­Þj´M%ºCÿ¨"deÛlDñåâçË–wh¬ìºÚGFuð¸>ÞXJEÙöü›bõys2'0þ·¿‡;°†tò-À9>±©~н[Š@%½.16ˆó¶ý`u =}Añ„_Üá“DuL7Yµ8ÈW•O‰ Oˆ¢ŒÅpæª!Ê&¨]µ§r¬îý¼ß_Å;sÃIïΕL–ï f±·KòÎQùÁyùwÿ½SÂO–ðÞǘiFKÞ–°/å±,©øž‘4¬4Ds§¶j[{Y ë÷swJÍkÅ:†lSªg-2g@ÅÄ­BjCË¡ûhéú&mÔò5AåèÅîë}TÊP’Kcñ6zJ’ÕŒ“oâQWu"%O¥|¨Ï/Ø•E/mÙe)¬vª]E%¤L‹á·ÄÑåðS.ÊY™¿|p¡3Û/•b·h+åiSºoʪøg1½¼—V¾ :"æ‚p§yIR[œA*Ä^Í ¢_˽áå[Úy‘H 2Å’Pù¤^ÛÙæšå²,'ó}@‡¨¿¢•ÒDOb{F÷†™ãš&­‹ê‚ÓB`ûz3Éí(ƒ ×”Ðc Í©3g1«Dà%Ÿúñ§˜°BÀn7ø“xég¾ §ÇøªÝï»/_‹¦'0íÊ<æÉ†Â-ÕàYPvô±µz¼5΄˜ú†4_ß7b‚Ê?#ä2ê'_ù‰Wš2#\H*pöà§£Þä"£yó.ÙþÞþSa`Ü">èÐþ¾Æžù¦‡½ñaðÚ*ûv0ºð„ç|÷­÷†â|#R*b‚GzSÿi8ã‹»SE9V¸y"]Èyë¬p«ŒŸ¸c^‰Æä%C«ÄÚXÞOøC<%^XâÎYbTIøRˆ–D#uI4Ò–„"úÔ%‘ñR/ /¾$¬¢%Ñj&i¿‘Ö&Ñ~ò Ñþ^ÿÖ ûЃ¥-sË£b¾F–^´ãÒFŶ-X{ GS¹jæ-›~|4æ/$gÑD WÍÕ—M#¾lâ<‹W·äêiF·C²ó©ÎO¥ºzÕµÓˆŽã¤óàµy·æðß–Kl~°žBm^JƒLmÞZ‚ÒÒÉ¥½€\<¯Æhq"Ê"˜DI’q^#ÑȉÏ"EÜÖÆÿ’i¦“ŒFÉoTŽyêð@“è-¹;¡bcj—홤+HŸœéƒ"XY`H`å³OD§œ(¯uÜ øTUHX‘Ü º}xª Ç Uãͪi$¬±#å ¥¬ÕäõŽN™“U!sùâžÖ“^4ªOÆy ª£FñÈ!"N{­œ¤Ì‘#+\l:QŽLéôXGNL$é¿äzD%/ ;No–HŸÍw{4ëÉ1ï*†·¬N¶½·wðê¥M”îê‘mZ&9Ùf#Ö¦Ååœ6V£øá—©–rFYpÂ/©­#~Né–Š-×ÿ– ·¨‚ìÀ*D‹þÅ?òAÏ•e0côK:ÿÔòãØ1Ÿ(JΧ¼e)|TSügÃ^¨êÉXüíSžd0+ŠÉB–rÍ×ìÈ1|Ötð<Ø–Vu¡‚ÄT¸ ËÒ®8ű?¯^”­JÎ9â{õÁ…üpA±>+ØÀ¸Ïö!4&ê ¦{*["û„Ìš©Dw×èÊZ vW¦/ö#ã?8,ó†Îlé·óüÝÞlü+ÿN<ïóïÄóÿN>—/’oÎùwòùžüã¼ Gx%Žþ8oP‡î3i›•wÝ“Süç>ƒé õ¬>8o{Aÿ¹Ï¢î$¢Û ú“û~ÐïÓ/÷élÈ‹Ög§ÌáÁ†½á?î<,?—œ7ðãåòŸø›Q8’Ü7œLEýuÞ `ă؈#5býÉy?s{ò¯ûN¦Ë¡?Λ“pFÎÅðÛ}Ž(:‰ãF†¹Vw#•ùØ|rÞ+ ýÁyËq·åç ¦ßóo÷9i’“$Ž)àvÃí4šYGSýÁ};›tOùwüùl¼{¨þºïÎNðŸóŒ–Db=Ì@@ç7òÃeÞN`çÿ,ÿ8oΆ§øž…ØIT,ÂßЯ8œ†”qU¶Û÷U¡ÿÊîoêè=ÚeâÇ÷º€ÚÀ$ ä ø¦i„v æ„üž+Ue˜ûq™wN°/ŽýEqyRkõ®VëjÕ~½R­sU‹‚D._mï2½±” 9¹ƒìDQEA/¥ 37äí,=V,k5§wá¦J)uá`ÇÙc8Ò¡1[C&Aéfq—X ¹Y7KûÓþd¤½Ì`nrëq®¹O,‹ÄF-7§Dpœx|<9¼ä”ÓôÈ O™HÃÈ¡±ŽäŽ–Ý‘‰ÀçT“Û5ïi32ÐO-œÝ¹Ë$ºK¥¹3Î_ 4É´Q¦ZGGŒ·M»Ýb겋‡½´—ˆÉÅì¸ Š)¬úÑñâAË]yñ”q„öê%YÁdÔó`bÍØTÓŽJ!0eáèšjÿ_\”“v“ „Š_¹»|üJg}¦á؉ i:¸U ÝRík&ñ+NÕ‡«õRn´{ÒøÐ{HyØâFL¨&G(³ßM= ”ЬJyzŠç.PŒó¶M½ßeí÷*}vÂ(…4·²©ˆß1{ö£’ìy.¤•é{“Ú­BYáì!ª,ɲöÊÊTg…´[p²Øy*ÿ¤J\‡sÂIÌF!³*pSòÖ¸ÂÊÂÊz"‹X.Ý´Ld7µð ²Øû*«tVTš‚©ÌµÇíºÅ¹ÝtQvJB£*†©´æ Vf?kF¸Ä& /•J¤²—¦5~QFGcJÁ>õ%¼SØóºGu-øÞàÃÓ‡Í—×ø¥@kKv¥k„ ²*[£²º0§IåDç”ò“3X«Ò+\ZŽEˆ¯Õ%¬k¥UüòEŒ0Ó⹿.IŠ(“û0 E‰hpx#Q#W ƒC§]€ý=Þ* |#Ê8-øXÝ÷*ðwÅi‹$ç”Åjáš¡4Œ‘ŽTh (¥FxÁtªÇ„PV›þlmr~_NóØ1iË)c9:c†FÙ‚´'ÿÊŹuU²H"¶Zmê'$ñ£³H k„¥ê*oåœ<Ó÷£ª‚¼‡™4 aúïÉ{Ýë™aj(XiHBµÚ”I'7éò9 ÄU=¨ ʥų´‡'îÞѧƒÚ–Ê¡£¸·„ÉBg‹™>šÜÔÙw¨[òKêHeζd¢:–Täk†uþûñÖûJP²n)Ìâv—Ð)¸­–Nȉ•)Ë&P›îú˜‰ ±*õX Þ‰NA:*kZÙ‰=yÀOÜËñüTÖMfªZªÉ–,ìa«Dè.!³Q&ÓñÇþð±NÍJ)XïåŠ_D,C’y²«³žbG“&Ç(ç¤ÚPÝ?QÝF’¢íÂ*YÕ†¬. ¶¨zkÓÆŠä\¢D¥U0,ùN²%7Òc=}´B¥Ì18Ͱ¡#3™´7ŒGzòdþ”èEe°¦MF3—K6‚q£L3Ô ÍWW)²A³1Å­ÎùB†^”*Û:ˆhøX~s'Za?>­\¶ Ÿjë›lå+CÿÕä{e2Š5O;÷7÷¬ÈhÛrV*b@-§rÚÂÖk昲´ÇŠ˜ÕYV­-ZöN _䢗«O.0½ˆÕʋ̓\tn"IJ¼eï¸)d› ŒøØÙ³ Ûî†ÐìuÛý2`žhD'Ÿ'¸bo]sYÜùHg˜[ES1URŒ`pv*—걦WnQl¿EQ6KsSÓ0aí– —Ts‰Ó(ü&Ô>$PóA`x‚’#Åèõ¬úeÃçWV\Öi/gà wׄHœ-ÁÚtÒg‹—û¦ $±€. V˜ÒG¢mÿoéÃ2[€%ƒm…Œ$ˆí äŒó+/ÖMe:o ÑG8¶LÚ÷Ô(ŠéfÌ]Ú¼qÑ-=eŒg‚˜Gܤn¬îH¾åX)Ï.â[e”Ï%v|69u1p4¥ƒO09¥¬`L.r{FðiªjQ•˜Á¡ã >!¨ m|SÅï.›^e\œ%Ã4¨þÊ5¸±!`|Ëÿ^ܓdžO䬉›*Ò|©ÍኙÉ<¾obþYÿÃHp˜yýftŒEú_½ÀÛ@í¯U÷éþg£ÑÈõ¿ÛøùA\_üA,ïÔóƒHSë~€ç××ì~×Ñí~×Õî~WÕï~×Ôð~××ñ~WÓò~×Òó챯%\OÙûA\[ÝÃ&®«ðý ®®òý ®«ôÑ®£öÁ:½žâ÷ƒˆ©~8³ß@û[Ý÷ÓO»ÿØÙ,V»bu\|ö v½n·øì§½íŸ÷ñ’С¨=w£%¬vWÑKûÿ”ž{ªu| Òeñ*«ÝbVïcÎ%½zÄyKWCxÊä›îÑ1•m˜Ì;ôq–=Ÿï©§çòƒjKF€ÒXh—¡ŒÃØ‚|9U)b̯úSÏ|2ûúÓ!7Â_Îõãó=õQWêíêO‡ê“nçôW«S]çÔôyjÊž›Oº›‰ÝÀDך˜&ºÉ¹ùD œÀï³á©!— ~%móÿƒ=o ŸACfúpú蟫ÝG«ãG‡ÿ?º”4“³ŠÔÄÿù?çø>!„£á £ß]àqU§eÌæâU;«á(B>[-Ïé¶$†‰}±cëh‰I¨¯)(“–85›0M^ÔD&… %‡fÒ™!ŸÅ¤–JgºåI-•Î ý-&µT:3ô·©ÁÜß§xÍçø8Ä}'É0FÁM•M&ãÉtöà³I—³ì`5A’Æ(šµ<œŠûçÜ%æîÝûUÁé†ýÙéãG¸äªcå’AùG\õð3RCõ˜:òˆ…ýŸÐ(Ô5[øÅÇ×ņâ3¥õ \'­ïªm\üîùï©™bw…xErOÉÄ+«¿‡ã÷¦®Õo>ÿÖüKýï&¯,ÐÿêõfÝãó?¯ŽÇº¨ÿy~;×ÿnãç;¸ÿQ¥ §ù)`~ ˜Ÿæ§€ËêæS@åñW²‡°:~Ç +˜AÅç{u2˜¼æÙ/(»Élòf÷ïÛow^ì˜T¤Ö3Ô½F<—£zJC©d•^‘)dPÄš_~ä>)%Ð2Ž¢ÌÚ-ýnµú¾**§ð÷3@€ÂaÛ0a“ÔÀ‹Oe†âÄ a¡t\vo¿J‰Û.øOtTsxñuæ NJˆa42 ’)3ÚÕú|~d$e_AÒ“M~8:LšRpŸ@„0ul8fu/¯ñ¤Â~¡. èê‰ ù$:„Ž£‰Z¢æÌë‚G~ê ü\<ms>v®cHÔê0?øFGù ë,[[ò˜K–õÍ1—.@‘äû@÷XX1³¨a™ã•›Ç×~‹ü8PË>ÓåuéyÍ¥×Ò Ûe¦l#¥lÝ.˜²A¢¬¯Jòñ©Váë^•uÕcÇﱤ^ÍzeìîT:è€ ’aâ*">LÒ´¼ˆxÂBÌ!¤RO] 8B2&Æ ­¬PƘ.+©ØoœÖI_dÜÀì´òíÝf”ý¿³£3Ç…nE¥sRY† “ÏVN3æ|é”×»¾:e6’”D=a¨åY^J˸~ZêméB~·úÌÏ,€JŸ99r™«è>Ì£‡š=D§EÓHb¬¨pèÿðÉAí¼Ô aH„æ…9ºä&Ôãvì _Ò1Ü„îñA›++ÈIõôÕ?yíÕÌw,'¯$u-—Eœ9š%“ÍcÕ…¿8?C+C OC‡® žÆ–‰ΆuR9›—¬Ò0UÒ\7¥J`ª$ùœI0ê2<»DC—HcxY|ntRçePvýèX¾dDÅtâÂ}™‹Ÿƒ +¸š¿‘ ‡å¦ÂB9u9øf.‡6š8ž4(ñŠÅ€®}‚²Ÿ€-ên¸wÂCúáïý¢]úåé²)ìØf¶ŸÓyðç,þû9ˆ¯zžú‘æÞ5ïJ[U,Ä|×ÚÖ¡Îò§?óÊüÔ±Ù÷'l ¬$/G[X\²Mb]áÆû#Ïìæ·*ÎCy©PÉ—hC}{¶¢ñ$$t 7$§<ê‡qÞ±nèvè]G8—%ŽPl`Qè±Á§®jNˆl9pj]„ yÐ6~î²WbÌüMútòA ÚlYЂÍÕc;E]׃RÄÚ?'v/ãTg]±Y…Àj6•ÞNé^ 0Üj&*¬½ðZAÏ){[E””ló0;Ìs¡¡€[â+ê¼ë†ä“ôV»™}Ì®9uK¸F?ð¯|üºh’½_G4"hý›;ÎìaâHËK qÑ|8˜\€°ÏA‚o} .^{j0ɵwÅUçHbÄù4KÂ…ÆàKîG Ô㵂¨Õ>uËy¨–’ºfûSWþbÆ®Ó&:P›MQåöÉRDæDI¨ Ç©»7ºxŸ6é— Z[¶„ ¿žzÍß븕ÿ! \ÿü )¾*y‹ýG1Ä[]»Œ"[—*B‰- jþûª@…[I6ǬՕ-7[µ•N›hkNe( åÚÚL¦3I}ejÜÔD¯i_Ûhî™Æ%Qªï(­R+h2]œ6µ}ÁøÆ,¾%÷g´ã6cKö´†6Ì¢9æØ†FnG›‹et©2ì§ã^ Ãö >†Æ`6™xÔˆtZT^ßîc5 25 ,C-¯Î9È]Üj¬QhjZΟ®¦èõÆáh¿ùj“ºü±Ï‘ß [ÁNLôWJ2ѱŒO„ó:â Ò*¨‰t³W—µ&¸=wl¾ËÂñœ9ê‹­Óär$Ÿ…2ë"3jŸ#}ÙvJŸf%)¡¹ÓꊅóY…ÚŒ›<‰ÅĽ; ~ÌBpc×hògòÏÆ­}e'BÑá·–Bo.WGAcb™Æ{ãb2êN¼1œ(¸Ú—±8-&¡ÈÜß0êx÷äôÛ«YŠ€Y…òŒ åm­‹ñl/ÒjÉK+Ñ骟¾û™©f ‚SßCí6D×Ó³ÃÒ}J: Tññ3é¿s»PŒXÛ}e'ù Û!­ôüv¨D'ÑŽš«¶)>X›Ö€ÏÖrHÊAÑà)6ž­å’£ÞÅw”B¼:¶*h…IGõGQóÅccçÄÔŸËó —S±—4—C¡›WµJÕÞˆÓGBÅÎR©;ãÉdü)i×´Ÿ§+Õ):5Šn'§0ÆŽ¢Œ{£UKÈ']'ðt׉beKpÊLƒ¼Ñ[¨¡ë[)r…ÍU+ TàË,6Ê$0WŸŸ§S»ºþ| [+ØƨÜ9ݹŒªR†9®Tcù£~Qm¬jGZrQ¢aµW‰åIƒ®måT b@> ¥¬®¡P½_¿×tÍÚ0.;£JÕðAÇy„´ ûdŽ3š‰ÔC£®qsö÷´Ö>§¶× /Ê—Gdbt×Ìõ—‹Üš€%(-ÂäÌSJ»d¯1m’;dUÙö§°VsTÅ0©*òan±¤Kk,ÞÍòi%JåßüjîŽÜ•„Ђ:ÅTI’5ƒøûö?TE¼ÜÓÒ”N+äÑÅC¯Ô+›g>=óé™âÍYÛ§fx4¸7¦ ÷.`ܸ›cœyÀü`„‰®í} £*l:ÑZ%²DÎøúg‘õ‰Ø1aïéíÎùéâ1™;|ã'æÀ[ö )lÑ,@R¼EŠƒ^j²Íc?%R)|z’X?g·Ì`‚0’ §—%W”\,‚ö³ªxáV´6ÜžLUg!;˜Dõ¤Å`ÎUêj²9ÓÜ2°ìpe{ª§Oñ®åÁ”»ò”ÍÓÌ$‚ë-ã3AŸ$L Ëœ‘Ò@?9\(—^$<†ÇÎâV«ê4ÜÕüH' \À—|SÀWÔ”¬¬÷1–zþ@fsíyú“ïȨ'S½*&DcŠ×I24”Wé°byn^÷ŠÌê^á4é Þð¥¯Jfîœá¤°>ž/1… ý@¡ŒgBáÍ.æ[Å®ÆHãœ,v,'Ñb= ,&iÔx¦aèôøivPsç>Øä„¹ô³&9¼Y0¡L 8)UŒtÑ=Ÿ"O`“·ìt‰ìÇ…raÊþ]bòBjW±”¯ÚîÓÏ^ 'Ócß·„{Íf0ÕXfkZéwÚ1ͤllÀîù–õšã^¢£ý^”ë6k j…ÎYøLv9+˜´j©*J?ÐG¥% !¢ °š¥ó.ìn…¼²I¶CJYsNÑx¬({O,8ᣠÍç4Ô1T«#eõ—A•2 ò,RFÃtÜÅLø 'dbAsG+Q 0øŽCžÊ™ '±>S{¹Ð‹Sz|¤dõ—xW7ïVÔé‚c¥Ó2ФãÂ"É>cMo² éêëÍ’Mr:mB²â‰¤Ž81?m Æ æ¡’¤Ï1Â"<©Õ‡ƒÛDÍ:¥s"NUHÖI‡%óaiùK ö§wþÒëš/s¢,G’¿ fÓ¨¼†GkD,&iœÞ,–jY·©‡d±¦_KyuÑhA-³iŸ›O˜cUoõ 2°F -p̲\i°”+´<¬²ïmšù:sDŽÀ#µdzùÎàp¦¿ó‰”ù­*ü®ø»ÕÀß~€×e¢ ÙÂS*»91Œ.œÚ5®^ãú5n &[¨A}Ìç ‰b>WèWè^²š¾L£ÜšcsñjêÁýÈ#¼Ö¨3üE¨hÒ€ðWZÖ«TÇçJ>£œ~S=Ÿ'j2@>Õõ©²/kT;à>G®*Ð3j+hXD„'£‚*E2œÎ&ÝSŠ,ÅFL.j0ÐvLSN–¨:q²‹¦LÇŠúh¥Ãç!™á%‡¬™K`^¾:Øûf÷åÏ¿ ¶³=‰Nº§Ò*:v—eq÷™—<Ï´#>‚nÕD7k(ØãOxŒk*¤:ÊÉá kWÈx²ƒúF¢tÇ”¦ƒbVÓµÁí%!¥¨„|JÑqÐ# Ï ŒaÑB †–ùçûŸÓ»ÌÿÕÆ‡^«Ýö[^½Ý¦ûŸA#ÿ+?ùýÏüþg~ÿ3¿ÿ™ßÿ¼ûŸÚ8Í0`#´º€»\¬—…œ”L|ò½ Žz±nl‚Néª)ͪºÆ<¡4òµ:†fóY ¼‚1* èÑ$T‡"¤Ââ,(M¦Wø­ {dR‹§Y7îô8ÇŸ>iÓ“W<ì:¶†m,LT—%ä)ž¶39çæëò¸a}€zÒÆ3E=|¬ècóøCÝ 2¥³³‡ÞCöϲ¯±`#øpªsII¥’¥Ôöì`Ê…µÛÑÂnbŽ]RÛ™ ;ÿöʼ ï{Š4ŽaRáû1]‹`{wˆæñNÐ÷&¿è¨|An t53D=é9´fEݨ©»Ž}Âä¦y‘¦èPIôscô´’ÒÕÉ꣡¬˜{¸® ¡ªñA 7Þ¹dãDãÎ ‘Ìyí@~l·º§pÒÜ GøH(xÕÍ „FnR'á¬{”Î~N«bV¶ã*Wféì…^òÇYÜ6q<0r¸‘‰•æ!J=|4s|¨É™bSTâ­Mñp›bïrðáÿûÐÞE¬< âÊØ~¨æ¥‹®E½ÄíR¼éDêµ®“~µÔ7MijBu£xF† .9Ÿl†ÖE•ÉK¥ZÂL€i9zsçËI÷Æxž¼J×rד41ú$,¾Â³Ú[S7[‚Ç5·¬’Òá_¼†mk¯ @ 2î*å@×a±?ùÆü¦Â[?]FåF˜L™Du~žß«,´Èù½^yø¶««Ç‘’σX²¾Qì¾iVÎ-j”sõmªtsÌÓI-aöxËÕŽÄŒ7(ÎÑñsßœÑ`|å'ò³ŒM|‹ÛKGÆœ£Q„TÖOE[2:µòì‹×vüóòùÿnç_ÚT|½±1,ÊÿØjù˜ÿ½QoõF«ÉùóøÏ·òóØrËOnùÉ-?¹åç/mùIχ#÷]4û >Å{Ìæc%Æ‘Gcêƒ}ðCÍÄì?–¦&kê35[ˆ‘÷!1ƒNÿtÀç­tÜYó[õµz ¾¬€(SÚ­–ûþßßÅóX6Eç§¿(o(‘é)•¶ƒÉGþ*Å$Ì2®¢2Z'^ØÈÆð”<–C=RVž†4*Ȉ¿ ‹( êöZ¦>gã_K°ü¸þ9½‡ š|·è©%v>A”%*®þ«û¦ºÏÕÉs  ë˯¶ácþlÐWŸ¿úòkÀ_ùµÎ_ëïe;N„‹o<ÿ¶ü×»+ù¯Iò_»Ùô-)ÿ5sùïV~rù/—ÿrù/—ÿrùïî俞’\úüóçI€òX¦‚%+}ßzs»¢þì/›,zA½Ö$/€ Úþ~%0.×ùq¹.¸œ\דÙÛ*eÜÕ<«ÿª’žÕD™iW–òŸSÈOòS徚Gþ»!pü×ðƒv\þkçñÿoç'—ÿrù/—ÿrù/—ÿîPþûfàµ$ÀÌ»ŒiB¯¥DC[*„ÇR,ôÍ¥õ¢¥iijîz\G¼®å°÷ÍDÌïKÆt ‰BA²P=Q(ÃJ™ÏÿŸcþmù¿Gößf+ÅþÛÊåÿÛøÉåÿ\þÏåÿ\þÏåÿ»“ÿûË‹ÿ ‡³ é¿?Gø·ê©‹Œ¿Aƒ$´ ] (‰ Ù°¾~Ó¯ÌüË fýo$—õ¯'–¡ã©i]T X1Éø;›[þ;¼ù¯Õª7Èÿ³Ñš~£Îò_=—ÿnã'—ÿrù/—ÿrù/—ÿîNþ1ǃyYLÎ9Éžg¤hƒÄµ TÙì5 Íí³ÊS;šq…ÃR¬Q#*ªÑªi´j5ZÕ¦Þ"®Ê°ÿò*ñ¨SU×Ôp<øù| $7+룰À/_K”¾Ê¾#)r>P‚¿—Š/¼_£ƒ_câÖbÿí›·¯~>ØEçaWåpxÊÖ0;Ü5Flr¢OéP„c’:ö饸W¬Áb"Éšnö¹ŽÀ¬m8€#<¡[rk¹îówŸ.Xw(Ì}Y?O¿[Ç‘ðq˜ñAÇòö2 W ‘úšœD¸X:ªÁ4ecÿ™`‹îÙM¿‰fœß`sS=Â8j:™‡B\>pñ‘¿‡÷bå´—+º•—ãÉI8„Y­êb6ÅÿÊçú(‚^RPRb÷(ꚨƒ8$•1/OáH¾|Á®q@P PrXue%ÂD„”è$äûlrî5Šû°³LñÅFúÑ€A¦ë[4í2ˆG·Z ôy4"dX¥ƒ¬`^€JÕÞ†.›‰Oè†ÑÓ4¤šÙ,‰Â’ëeÍÆ£hZâ5Îø¡U¦ñ­ç=>¤/.…Ï#^”Bæ—Ä¼Ê ‚÷jÅ=žƒÁ{Ly4`’°ƒëÇA¦ð‚i[¹ Âçñ½Ì¹·Èѧñ7)€2WvÙÀ»â\s1Î@ª žñ ]éµ°ì]6ά•DÃĺ1å‹ X¨Õ"?A¬{™ÍþËe^@¹kÀä™Mò»ÿ^ó}i˜à¬Cr“ l°w„ÂG±¨¥N/±Nœ†}·åXî™rú6æßÖÿÏïèü§íµøü§Ñn×[êÿ-/÷ÿ¿•Ÿ\ÿÏõÿ\ÿÏõÿ\ÿ¿;ýÿüÛÜÿ<ÿv÷?[ sý³Õз?),9<ƒ¿­F”¹òÐ}Ø-fê¨üb]UORn^÷¶ÀùõnžßÍ-п7øk#ÕÝêêóïÈ{wâÿoîù/÷ÿ¿¥Ÿ\þËå¿\þËå¿\þ»Cùoï €{" ðŠA@®-þí]SþÛ»%0qÿófæß’ÿn*üÇù¯ÑöÿÚ°ºÚhùóQþkÔý\þ»Ÿï@þ«@¹˜ ¹˜ 7"¢¬vOVǓùRšÊ¾¿s°÷êÙöÞŽU„pa±XFJ+—J[öòÕ=ÝÇ*:«å6î¼Ö½J™L¥ºÂ!!+í‡Ý³Òà_Í:.4 «ñxÐðt KP„´O£ÙŒÖTÔG}8Dh¬? áá(êFÓi8 /V…ØÅ,Ja±$BX‡P—˜e8B~ÂÜ ÝK¡[“âUó8³Žy~Ö׃f£Ýðà望ÌÉæ%ñúËx4žü´÷öàÍ«w/Ÿïk<¾q½‡ƒžÈ “Ïð,8­Fò…“‚T7øÓpv@_¦&µ˜ ³ÏÈHšÎÎHs]µÒS48žWÉ›¸q‚!zŠ4enEâ£N0Þé4ñ&íá×}E—#ø;…'•ý­p60Ï,æD‹è:j}¨¢tŽI"8¿Dþ}Æ86(´‹çŽÉ (C¥‡eŠÃ4ƒ¿¡iúÌ_žÒ ö´à/óok·1ò£<\ý¶;ØK/ÎLjìý·»/wþŒIú˜±/VUŒ‡½òËr&‰**â±¢§S¦×M3ý–MUüººÁQÍQñÀÞ˜büú)ìbÝ£RE&ªî"WzX{øOÜe›ì½‹r4ä ‚«J]á¢JßÓI=ù‡PÑ`N]ï±ö%m°¸ÍΨQùedùhéÛ_&ÖÁ@uǰûƒR¼Aþ5ýðl83]ð¾åéŠÿ7)q'åTlñ—üô*ѵ"iusƒT3ü‚Ô.Õ'9'S­¼ Áã:§q©oÿ³Ä¥†ÃXàyéÁTéH‰|€$Š“©|0d Ú æåÙI'šPkEü…)€¿¹µÐý†k÷ !l4tê^ÉÑêH.jéG%5NýU†2*½«”ÙÖ¶ö8§´Ô†eÙÍW›r6Šê‘I0Qà…@¤+ÓÅuêyUV÷*L±vSÐÐëªüöj-áÚaâ‡QŸžÎö s=xV®‡õ‡À‰VV霅ž÷ıN½QÒ¯r!V ¥HÙ°ýí¨¤ß¢¢Ÿ¹èg§èˆRZz)›¾Ì'­ð®‹àc 0Ù!õ$œŽ1³çƒJ?\}X6Ø#V 8—…ÆÕ¨gù™Á!±IŸ„Yü£Ïœë85Í++z¢i®+2qŽòLÓs¼)ž?Ý;x¾û3Ú¢TùÏvù”mÚ1ÞnsÛ´i(‰`Û)Má°É†@¢‡è“ÊŸwš¤'@ˆè{Ð(ÿQi·ÎN]_QsÙ¬E²0{† ±½HWàÝÈÙ|RÕžˆiT [V™$;H¶±€tÑòg­\€oh™¥‚‰µÃ³Ç³çòî³ MÑ«w ±¾0Ñ ¢ØPIÀ{Ô?#µº?Ÿ —„éͦ\LT@JÃpr±¾‰RÏAÓ'±lU•{$é!Â~60¯Ì4ìGd[ð[È…Ñ‚j›ØÒx4¼ͱKVª£û~°ü¾¯IÝ݉˜’Õ×]IØ8`Êx„{úýQÿ~Y;ïÖj’Þ+¦  J†¢HZef’Òày»ß'kŸõÒW/å3{WT“çìö ìÈ…ýeìâ~8bàµ@5>ø%:?x¾4£’Wé!P_YÑ$Î6H50Z°Ï,¨AŒO44Hož2†-¾ð̳ý:ŽzåéW_-îÖ,’Þo¯Þ<÷ÒÚR/}ÓšÞg3ŒÒLvz'â©cKÅÕ°•˜LÃCpsõñhÓþ‚ºý)¢½5'dÿ$k¡U™4sà¨(õÇCàQíœa¹Š& nQ¯fÚ¥Í#’/¡¯‡“ˆê‡}Lf<˜’ÊMD‡ðuN¢i„öIlhv„¦Lnö“hJUaV"2„(Þ@¹|ŒLD'*$CY[¡ø=¶¹êÑņIz¶n1GiÓ%d3D~Fyc ü@~+Ù™Ö­žÈî€9è×ß#&Õ‹R*q¦:4µù:»º^=o^>?xýæÕó_ß½z«&•ŬcÀÅåÇ,0‹·F i˜¸¹Ib'¿Do£ÑÁ)^61¸â,ѲþÇðü`ü±?φ=Ø«O""t1Œfh'ë©< à^F›9,Àïð,š®Ê¾Ìƒá[E†æ+’èï7â¤ÁG-·ˆI8:¤ó [FádÂêäl:S˜Ö:¹ÀÊ3#ÆÐéÆêªAFŒúxC2`|íd&¼IÐ ÓèA-â†cK¨.*%$Ûÿ8ØùÇë•§ƒpZók¯ÕM¤…ÀnÄÀ\qÁüA N—Öšw·‘²¿â»£°Û=›„³èàùO‡Š–v¡[KYõiw)‚‹Ó›Kn.µÙÄ–‚…Ÿg¼DCCMMš3~«1Þ Whã¨á©uº…<ÅŒ§8¿¯7îq‚—زL¦d.å±/´ Òm1e Þ´˜>éáñZ2·J›85? vÊ@Ù$ÔéB÷dÞ;§ )¯;› /}´cÔý ¬Í§@·ç JÐÝT•;¼o¶xºÜheÙ¤ÃÓÂorÎb»Ñ÷ð !–6›˜/÷q\–¾‡+“,¸Ûf¿7o^¾bæ6™ŒÆÐõΛí—?ïlÄv”gáèáLÌ&À«Ä/ï~Þ9øûöžÅ˜“„”ʪ¥~ 0«Ö„®½Ç(ÎÆŸÂIfI2lù²n¿¬ \eÇXŸÓx¬¤TëÎ_̪ç4¤X^¶Á²,r‘G•øˆ%hÙ ÆÚÓd•ÒPª¼F3¬õXÙ­$÷£ºR…Ìc $ýÅ:éá±8”ß$zÓ׆ÚP:,ÎZ¬ -¤qD3#6è§>°m’¨ÛßÐ ) ùæ(/Ù‘½p:ƒCZ;híÈS½a$é¨ÿòZí’Ä¢í§ó¶Øìn˜{¡M*s7¿™ª­ÔÝI±ÕÏKìÂF*CJ™Iƒ Yª-rvà}É^ã²±²¸äü›¹SÛyæŽ_pï6Ë™{¢˜!©tòvé2ŒñQc$ò‰ñE™zt çÉÂ.°%DoÖ–e‘ ≮¶ÚÌ‚ÊëTbõ.O¬ú×"#îÃ|àÎHû«Í•Ô …-¦N7\¶Ô¢ l²‡{È¥=u9]|OÅ!yÊÔž? ë–ŸÓl+º\³.6•^¯ÄòwÛc—}°)sÈãÎÚ‡Z=p,6¦š$YËÈW²ø7à&ñ ZÈO´€b(6V-'¸IÜSÔ,Xx°Z±øú\ ­->Ñ*¯…DZaóIkªü0O€ˆ1ÿ©NRV¡ÃÞˆRØ>6ÚNÌ„| ÐÑJt"¤ìOƒáPt‡Q8Rê)¢®Øvvj/ECj\̾´µ Í=G(žœ‚(j5W·)| ö#<æ`¯¶¤|À,î„N ƒŽ;¼8ÉNñèmàkÅ‘%ù} M*c{€Ø¡Ú ¸‡ -ÌÅÀ³ÄÉx@y%Í?}!ÇZ£hT°Ãºn˜’Øãàì±Plœ²QãÓáqdÌxï4B‰¸»B˜^S@Óï’ØÔDGÛ ’ΤY$æ0DÆ–ž £(ªøù1~ÞÐÝB!"D*M»2.æÓñ§&na¥¹34y#éP\ë9?v½ˆt:~¬‹€ºÐTp‘6è0¸ºu¹ž±ª¦U2pKª©œÕâÔ*7µÊ±ó•#G&ä~ƒ~ŸAêñsi¡÷µ-élU°¾*V„“Ñ=9-Ñ+l¸|9ÎbÔ€iãÚ™LÆt–0Œ¦x @‡}âlxj‹d÷$H›¤Cù¯a<1ÍS{l«ÉÖ(-›çná‰89Î8tø°çX ° "+YUGD´ÕÃ.;¼8€W±c(#Õ šÓ7UÓmQ½íKñPø§IØe‰Øu‘¡Í“þU‡,†ù".€¶@ ×¢lÙ2crÙ‹²ƒÄ‚СèN’$ÏÞø0x]ÞÐ…è°Þ!-œS-I)Œx«MSç«F©Aóã¹ãr•‹,ܨNŸlÆF-ûå:Ðéz%(³â9íEì¤$™ÑD“®ÐÀÐÕ¸­îSN-“ªfÁ’bá-YU¤¥ñ¹vtç°ôêÛÅ’°Ä¤ùOø¥S‡ßHÄáë'°ØxRœ¥§_Ë£bü‰,^#[VœéGÑCžÎÇœÄJü²¡X’‰^ÀDìÈͨ¼Å îÓíÖLÖ¿ØÙUá_H÷$ì…3ú¯ ”ñ%ˆV¤’ë7¡Õ¹”*’$:—@qø ¡¥P‚ᩩij¡YfìuÍz=—®‰#£C©{qÒÎElicÐCH ã×¹æÒbr3MßKÂa_m¨ °u•W Ö@ÿ"¼ü²$Y Ç}qŽfƒé4!J&_«ú4^åâœaâþ`RùEÑÉÓQorA”’mAO¡xl&›ÞâDl6£ùõ¬ò±ÃóB¦¯Àr‚Ç|‘"ÎÙ.!ÊhIfMA<œ#Ð,Ûù¢Í8eVr¥tלŒOzãO#ƒuó_51nnÚÔH` /ˆkŸÂ щfŸ¢h§#;~\)†| ›h}§ ˆ>‹¡Dii]•“þ(J–­íóíÉI“µÒÅÖ–eƒ9ìq\.²LveKbíàÞN.x ÂÕ!Sõ¹zÚÐ\ƒèŠEò¶Æ‹?_ô;±µ%.”éAó«žQæ Ó&#ošé3]&áV÷O†:MxÕÒHàLÇß4¾ÙV`©ü!qº·HJVˆC ÷€ÝЏ(<9²Î¦ÚÅLnÃM{¶l­kÚ½eîJæLêé E+¶¹ŸZ3­mdÚ(¾það–5$Œ¦àl \Ćn¤Z.²³šk@{#Dylnné3QêºÝètFgÏú±M}Úª7= ‡C<ŠYPRe)k ḁ̈ܽˆ& ÝâÆ×”ã§=ñÅæu)g©š‘$ÈÔ" 5It8®OÚ EŠƒ§»Ûû;ÏõU²ŽÄÞþS)Ë&Ú™#òÄ䣬î,§L[&ʨªN¹–ý$õLJAÚŠ‘¡hÜcSHB\Hnz¥0]]á­dÕ2|Xx’u躚Ñ^4o\B¨²]q3‘âlt\ ™«·W¡kÕPÀjÓD<¦î£˜4 \Y‹$»n?ßý(«ºYÙQO {_]]eã¿„?dU/X}¤ëK5læM\G¥œ®íz¡Vôå 3Œx5U‹©ãGš3`Ú²IM‰Kží ò&f>"Ô–«ÇT¬$|=¸Óš¼ÍÑ®$SãK’ð$™¦¸’pó+VóÖ¹!"Þõ9õÊÅd-ÍÐâcçN©Ù¨bÌÃ_»wÍæ{žwô¯D¨Ì#Æyú ½þ*)ª\šî6GÞ’F›ù>–˜«šñX®z¸2ÕzÕO}{…¦¹.vUH(¾…Kx.Èe±¤â"!=[#ãv™¾cC!÷‘Œ¶ñï³Ðq¸Õšÿ¼aqÖÂ,èÁ*;Ÿc Ñå/Mß܆’IÑ‹­+óO<)áfÁ)Dº xé±9Ê5ñîJ £n~™\´ƒ9ì¶Ä–qbžud_©Î™æ¤øÞwyÜ[\7ë¤xäøäÃÈ`Ó±‰š‚ÆcÈœœ\K§ýX 0~»,9ƒü»Bm`\–ñIdtrÜ0¦Ò¼#vûì‰@`-‡™ÁgؤKƒÕhµ* Ór/½®Ù"}U¹{KÏ^•x‚¼CVœMøÎ>]y£“ÏáxJž[¦3rMØ¢óðät=†ý>ˆju¯-âö¨X~¨÷-´«y’L£ÄaÊtñyÓ îk–9òžmtdÿzÜâªvGì/ËÉÎ’-ëP&ß6g<ÖºÔ»îgcÂyŽpF§³ñ©?ý(QNJ^¿+knK8„•·¥CÊl<Œ&Þc*R0î¬9 ¦3ü1Z½¢M1¹³ˆÕÆ:ý`%9ï«Mº+¦xFÜ ¦åíX qiÓú%¶ˆq 5Â9–_zö—©õ…´š-Õh2c¹Ôc<ÐÕõW‹e C©í¡5ʘ ´ ¤¨ô)1»ËŠîã^ŠvŸð =ˆ&—p|ÙRà­9rÂF1 RÛ©ËöãMºf¡°;¹Ðl†$FåAÛuÄîI@ÇkÞZ[L¢ÃÁ/¯±Û‘ö°°vèÞÞ{ÊFÎôÿ²¯ûŰ‘e¸µæ:yœ«7QF tm5Av´´ë]“NÐY.Ð6Kß´ÇE‡„m ¶ X=÷ÌEÌØ’J‚B÷Ï*SºRÌÁZÊx{U”‚ZMOìc[¼ùZ,æóÿ5ÿvüÇÝ»Éÿ‚A¿…ׯ(€­vàSüÇf½•ǼŸï þ#^öŒå óyÈ<äM€ü^¢€Ëà(2¦`2˜ è®hƒ/õÊ*Êb¥§Œ[úzaGð–Ï6R"kWÊ=´öž >Ñ©ôLšÔ½ßü÷â‹€¿è¡Î´@‚ #zóX…ü w„sØ©ùHgÆP/EŒ3$ç…<ïíª8ݽ޼xçz¬ ªzv kS'Q1i¼b :_|Õg{WlÂ&ô¥GGG\´"ÜaÈBŒÑg§æl„ eS9䞌ÁÃé\1âR…¨œ!èPé½X¨tsÇw0˜X0‚"^]?v²*âçó5)ÂíR¯dT&XQ¥ì2_‹Öa-—×öÎp`N6ãcS)6åøx:ñt,À¬xõ£l©ÖrÑÁ{1ÐÒ±ºX%_bh‘âjh«\¶ZÜT-³´/Q5‡#N£à š.@•.6Y”ïr#ih…AaxŠ&QEáMÊwrô¸¸wÒÙÊ^ÎÃŽUªI ÛœhÃÅà1Ý„î¨ü™cÚ<§Ì$\Yj_œÿ^]CZ½Û“aTF Fbéäã«ÿN™QêQŽ™«D¥-¡?x5Àð ÊÂßÛ ›{ÊoÆ2ÚÊ…Ä8[¡y±¨ 0&*O£r@ð\5T5 U톪vC”>¨Ç+’™v‹Úû^•UÉÉ’£Àpæ&¨UÅdLœ~é8ݨƒ)“PÔnC÷¦p5èØIh­ÇIPgÿRPr,ƒ¨md)‚׊š°ä“M;¨v0cûñlr6êjk² }ŽE_ã²uL]õöÅkgwAn².Å*¿ËFÀY‘R 8¡¸ÉŒ·F ÊØ/’Iº xƒx.ô*"hÏ>‡ðcƒ–/0‰‘ÞŒ=Nè;pûþà‚cô Bð˜îƒ'1JRÁ±e3»gpï&“ Ÿo'«@±f·r›5áo°ÆñÖ¯}¬Y’ñ²ß1àKGºÁ¾R¬°ûôú>û&?–?;>®Ê*jq#®΢ ÆÁ–¼£%½"yÌA~á‘¢a‚³«ªvpZ«(¢ró"r7!e‹ñݰ0‘¡wd…y±$òUZB²Åb= ˜B¡ƒN+ê>¡ÀÒGs6 ä=ítl¿Ù{j¤Ò=Ö¸!éël&…½B¤‚ZX hŒ)/v&E;RUÔfˆ@Z—·"ØŽÁG99³ZßB¬|ù¯¦lá×NrJZU›D<ÛÊ‘ušY0Îz_’s»vìÓù’\s Å¿$/>¥©¤t웩Õå©rÖ’Ô…¾Ð5#¡Õ^u¾³ìäzóÍ‚ceDOoØ1 ¨s? ™M²é¤™JɧqÛ:¶î¢)m5e5”ˆ§ ¨—”J!Û"ŠÛOåWT˜^^}L£\š)þ¦™~ ©Äàâž.8`,©n¹„Pð ×Dñå£dbì]i _R°¡øê Åo çA½¯íÎ`ÞÉIy{Ï ø¯nzûØÜLr&¾˜JÇ ÛÜN†2¼ÝmjJþ¥‘&„!ì†cf^öÊé={ñž=ݳ0q L°}§Þ—Ä}ì¢Ý91R­‚Ê3Šy)8ã²c9–´ÒÍɹXzT#˜“µs±èW B w2å…Ó³Ž;^u©Lž²<¦ó$†¡ÒzꜞPY´Îî‰Ëlz„ëCI Ö>%¸x!¤¦ÿDQwò‘KL>FôË×>*”“4Æö7–IJ¹B{<Î:#ß›Ÿ%4ä,¡óS…Â_–{(F;LýFœ: [˜òš’oFr+q¤ìï0#¨“ñÁÁ€r»¡7vò#{»ûsä½\ŽOÆ‚•ÞÓðŠD1t„­7_*žÀšN¼(²2|Z©­¼šß(§fl)BLYyúÍbž~3O¿yÍô›—çœyŽÎCf,;&é4)޳;i-áOo¬ ñŸuÆÞ*±C:¶£o”“%.mí…¡ ³1±è¼#8V^‡WLY¸ƒb‰G" ,夤úx0Ï^ý÷w›“À˜}¨ì”<Œï4U%ÁCÁŒÒ#øÐ«ô,–P$‹&°¢"Š %‘%5|½L–†b𦄲½.ƒX¦Ë%HÝ[’ÔGT¿b¶ÌôÑ,LXy¥a8£°×«“ñRÏÔãDòËË'j¤å¥¸ò·ÏØèä¹cé••ÜLe&¬B„Áºæ…¹µÓ~ùèÅ€mÓí„Seýo2+!¿û²IUœÀ)qÒ¶ÒÝY`¾·),>[Ÿ7 ‘=€9ð/þ7ÈÎËñwã‰ìþBô¢SýGL<›ÊÆìXâ-2æ?`Ó¾•x Ëbæ-xM?þ]‘,œ¶¹\HúùPmëä!'YT?ÿ•E7…²—«?HÝ·Óaq”cÈ„ƒ!rKT80Ù`Ä =’’jÇPL3HEBAu"ÈW™nþÒh{(Фkœ ã.žª,ÝøgòÖQ¼\|úHƒÚþ [ª û´þƒ%l3E ³¥¦KÍ+®°rÄ ò6«” }eÏ~,j>gýÓ9ÿâ³£ó­^õLÞÊÁbÓ8ßy %í_¼ M®©yFmò®IŒ}•$M(÷-0ÉÀ·ÙƒŽ…üù4†þ3Ž£ø—Êõ' ~‚äæ&=;ãšê;_DzE¨Gâ,€¼,G2»® ³²9Ùî4»¤ã(E-YÙçÖZOO§:ù«¥~“ÐHá'‚3nR„.<1åjwŸ1½ÊrYËÊ*‡}IJš9ÙJ|â:.•†N¹¨e±§7U‘LM'Y?­ ì-!Ý6©ÄV«†é_ØÈ_ú¬X» ¿¾gí5éÀ“ôìSùàtäP•].QAm¼o!?ß4|:ÑŒ:Mv©7ˆmB»BËÞ ”ä(:'?w"/Ë­hðÞ¸°ËjPËÍœæT¹Ëp#lz‚] ?fk¯ªiçB´g;ío®à& ‰t:Œ@Úu {œæc™’³æ( Ô4–]zŒËTæñ¼2rt†.¿|Q¬ç ¾I >%ÉÊ %5C官’H-‰ä²J‡R ñ\ÞL:!9n ÌwL,âºbK\S ÖæÌ³HJc°*Fr[-O¥À[ˆ9ÍD´”­Ó”|•ËNƒëŽ©„ +ýT*Ÿ¼z"žT¦–~Z6š_}âÌă,워\iþ*~&ÞH]±”Äkð$s°ä¨¬ x" …7Kµbï•ÌQóޝÚá3ìÆaWɺj—³ths]Ê8•ǽÊ·r Š™ÊŒ¬›y¯ÐOÎæzu@Må.¾ôdÇ£qÄ ÕÚ^¬0ðæòŸ5êK­Š”/¶9NžÚæØß+ã~@r®¤œ¥á÷fCU@žZm:B¬­ƒ½$7±/÷¨pD¸ýPC0òK´XíÜK6„ÓM Èb…=g4uÉJz—[¬OåÒµ'2Çæ"fR \R3a2»‡·jøe´È4—‚³Èï&áË=CÔÚd3²¤Õ£‘ÖhkjKß(47ÿ ¿Ä-€4¤Ð±Iò±Úr~ê–h(®¢¡/p ž»ºTZUhŠ¥Uaô fæ«›')ÇB”R¯7EŒõªe]Sq¼¤}•0BK(ùÞ1÷äi>mÖaº¬öðÞƒz¡e§òhÃa4š‡ƒ9¦ò°!)€ÔÎ{üvIL6´ž|i Ÿ†ƒãhx±>ã‰s0]”‡ʇG&¸õ‘¡VS”X`®o 5m[»G ùh ‹ìϪ•½µS7ž’;J g'©‘œ‡cd-zŠð©°Ðka÷É<´Z3jëu++Šô•À"×}BŽLAVš1šÁ ’ô—½lܰù$´Ó#àôêRصíEö¹tçôÈ"öÌ¢ÉÈQ1Ý}G4£šß"¯»-¶ðI4)|\Ãf¼W{£²¶š4`¦l=Uº©ÅpeÄ4PKšÙc®kÅî2Þv|sfÓí»<Ù? O<æŽÏZ2ºrîŠeøu’9K˜jù·Y¶¹/ÅËòÛŧ·WIš}Üì4®àt•Ë‚¶¹‰úˆÿÇ%ýB3f˜,Þ"ÔÆu%Ï2ð‰{I Ï&y÷çhôÑúéô-u›zÊ÷HB|½$~M^Õ‰­xE8òºÕ@Þ^Ëçÿ?yþ­øý ÿ·(ÿC#¨:ÿƒ×l`ü¿Fàåñÿnãç;ˆÿ—çÈæó€7ð{Éÿ"@˜™¡ÏùçäC°s ô3S \1í† ôk~Ю LQ ‚fÃúº8éÁâ²Rc^,ÙªR2ÃP  £Pô7ÄWq™„WÌL‘u`uÏrOÊŠø¬îg‚VÍÈÎ*ô8GV±öÛj?¨S¤ýúœþœ´±–çTsâ…ëqA¯k:2ø‚Úv%þÙa„ؾbg(› _6í&}ÈjŸô’|þocþ-ùÿô×»ÉÿÖôÛ͸üßl¹ü?¹üŸËÿ¹üŸËÿ¹ü òÿgtàÀÓŸ|ÈxáÂ…¬€ýÕ0¹üÁ‹g­µc|Eß(yîôˆîrÂ2üZŒ`)r@×*Ê×ЛðÌ_øæK ó¥.걜ҺS»­ºÝV`·åÛmy&Lúœ§okÕ×ê5ø‚ÚK=h·Zxpˆñ¯_Gîeô¢Ë6—¥%52´¤”„¿+ÉXŠ{œ³hï÷€ÿÔ¯/,ïý~PI´ð(ˆå@s›ê‘•Õ¬ng5K$5CQÛ÷Þ®¼¤´}mÐ$dKjiv>$Nd7¯zV@-¡Á¹ ª€äY ÚÙŽæhy:­[ª’Çé‰òù¿óù·õ¿ÞÝèõz­f»Õô}øÍùŸrýïV~¾ý/×ürÍ/×ürÍﯬùÍU‚z:vy~lWê-“ÛŽ>ìê&žX6Sõþ.j$nŽêTU$SçðâJÇ»=(RÒùÉMªSÝ‘óù¿±ùwä¿ç˾×j7´ý?h(ÿµ›yþÏ[ùùä¿ÜþŸK¹˜K—øùKJF èÍ3†ë­=.,%ô®j÷ZJP´eDx¼œsU?!hšF.cúPÖ4rbž]œF8é/R,¨$=ihS$ÔNá«x‡"¨¨ y‡/a'?#Û'«=c4·Ý¿¯ãORÛêý®Ò´÷ØvN‰'šËí¬ð%ilÄ›À¯’Çïɘé—u¶IÛÒJD¯Š:U벪©Y¤ûeÆ7¥ÎS¯IÞ)dj¤W›ú]SQÐ=À—>5§âXìd)J‡h.i ð’´¬/ßújÂWð];¼‰¾åTHšx$›‚‚J›jq$…0Rjò°zh\v¨t³ñ›izüÞû¬1ã›@þMù #cÐj”&°ë%Çi][K6M51³O¼éxô~Ó f ׃}z»ÎåVü˜õ]=÷ìyÕÀKúÕ»„…_Ï_/×ÓÅaÌ8¼80I»t©À*…‘»ÒKi˜"RLŒøåT½¶–Óa4‹†±èO™¸²8C5bb(pFEcSj]­Nº`ŒTê ‹Z0ˆuU²øÉÀâL@vÊ.{ù"ZMlÁÌO‚Ån;~¢‡Á%é äïaÊj-eÑ‘…gSÑXL+Õ#yȹ£\ é øƒCª¥:ž (|\!Kc$%‹bĤ ÉM½ž>‹]½Ë@³€þ¢‰øÑ˜€ŽšA©›ÄBúó²(- ÿå9Üà±¥¡›â{æ†$K7$¹Ú“ö}6Ó5ÙŒÄíAµ§²¼Ó÷2nÌó:ЇâY¤ŠÛÒ!žŠÓ ¡jB¤ŽÛ(L¾4W÷äÍÍo1ÿ¶ýï¦..¼ÿ4âþ¿-/·ÿÝÊOnÿËí¹ý/·ÿåö¿»¶ÿõ•ñ©?ÏúÇן*}×ö—}°ªkü¯VEeïr'Íq«íÛ¿!o×ë:¶Þ̰+ݼÂý¿KÞþ›{÷ûóù¿½ù·åÿó»ºÿ×ôòPÏåÿÛøÉåÿ\þÏåÿ\þÏåÿüþŸuµ¯!Ë\lØ ×3ö톗¼x~õ›ç7v3°Õ07ùZ´‹|­Æ²×/ÕV–Š”áˆ[x·ÛñL] ¤/ßé­@tʸš m »ón5Þ”Ý+ZuûUÉ:Þw¿Ô]*§¶{›Ë­íÇjÓ°c÷ËZóøì{^óîx©Q^ú®ß2ª^òÂ_\©Ëçÿ»œGÿÛ» ÿo¯Ñöú_»‘Ǽ•Ÿ\ÿËõ¿\ÿËõ¿\ÿûOÕÿkyAfõeu¹½k(s{¹6÷ÝGx¹9éÝDÑð’Q4|'ŠF](_ïÝ€€=/q®a]MÃÚ[:®R>ÿ71ÿRÿ;;¹¡³?üYäÿ×®ƒÎ×j6êõf½ÑBý/h¹ÿß­ü|ú_®ùåš_®ùåšß_YóO‡¸WÒ$–³“RÂOY 7ôÇŽ–A ”~_5ïmC=ìj±  ,˜b弋¿BüÕÁ_À6/6,¯ÃîñA=Pu>ëK,*„µ­O½©x":ôåÃ.ê¢Úþt¥ð‡ož³w±&Éq]nŠÒ|‚pI…â<ä7çøìÈÏØRW~Žà3Ð_ÔQ¹ø ø/K„> †<ŸGeíŠBjȱ‚Ùã½Îð®;yKÈšî`E0Þ–‡ˆÊoŠ =¶o…0Ñu!Qw™p•PÜ}•$O|žë…Sè˜õ¯ŽQ¾'Ôžâþ_‚åÙ•ßû“(*É/¼ÞÔEQ\¿s++¨M+ÍKjL]R‘–™–ÿgÑtöè×ÕñÙˆÜóåÿ¶ç{-”ÿÛÍfà7ð³_o6óóŸ[ù)îŽNÏf…¿Ô‹¬èþ ‚è¶T ›Ï¤Àʤ5~»ˆ¢iœ@Z? aªF¾h´á7üô~ ù *üÚ?™•€öM»Å}ì÷¾ìx÷W«“ª„EIY|µØßeÜRBaÉÂ}Õ²²[‹6b¢•ÀK"g- 9.n^ÃÃNOô²›F] 16Ž5ØYFl„¬Å²)ô`Ó»t‡S[z8‰¹ît{^‰F·ßnµ›u±5ºnÁz½±Öð ®–>¸ö¼Ñ-Õ¯5Û Êó'»Ñlµ×Ö“øñ½eC×늰¬Õ{@svÔi­Ûóë^c½±ÖO`H5,QÄý/D’ª_ :wżÂëÞB<5×ÖÓ—†ŸÊ8RÖF¦§¶Z^g}]´’y&—ˆßˆãHö½h¥øqÞ_*YÄ@ýª  ô½nG4¢µ~§½.±ÍVêã\ ~=.ÙoŒ,=°¥¯wÖúÁšhµúMØÂay­÷Zð4½v´Ö ýÆB^>Ä…¼`qÇ•/*Ü\†¤sÌT*¯×SXfÐZƒÒm?j‡=¶ÂFè뢷Öêúý0X‚Ú% )èª×ç’û2Ä™çheáùøJ#«t®BWë^XQ½Þéô`Q6ýþZs­ÙͰÕñ×{IºÊÀ×䕊¯Å8ô5¿ðRôåùÙûNpé}§Û\ï7÷ƿޭµ^Ïo7; ¬iûŽd!î‚;Pé;Pjáîåp—ö)E¦½:>ÛØ&[ø¯—‚Ïzk.>cŸZ‹¥Þeñ낵¿váøê^k¹Í!Îôõ~»ëµÚ¢ÕíùÝ–ß^[mßÑz?¬wšÍúÖû_Š\v—Ü÷l­ÞeÀœËíǤ h} ƒŽ;Ð…XköÂúz+í¨±Þ ;mÑ êõn½×[„¢Z:Š\*ZOÑ="ZX8Z@DµzÚÞ™†¢ÄÖÙé­ÕÛu_¬µ€×Ö× o`³A´&êÍf­ÑN.Š–Ø4SP´°çÐBÑ`. ¢\[(Õ½ö% Xå°7:PºÓ £nOtºQØh­uź4ZWR¢h¦IÀ“ÚW)–ÀfJó ÷–SÌjék.Ǜꭺ¿ûDg}­Ñ샫½ÕE}ÝoÕ›í,1ÄbŒ5ÓxÔBlµ p.„Ýš ÕOÁß2ªR£µÐÓ`ˆÍ~³Õð´ÕŽÂ5O´[õõu/J.Ô m¡ZÐÀ’õnAÚ’]Kd/ÙÅ€/¡5Y`×Ò±¸Üâ(‚°ª½Ñ ½ìBÀP:^CÔƒ èw£¤ìµ‹µt,ÆH1m/†ÅZÆ‹ ·.Iаû_‹^FRý:h|½Ž€?~ºúÀ”Û½¤U{1ƒ«aq XlidAáyÆîhéS€„1¯Ó zžºíÈo„}à™Æ< MÑJºùžõßµàewkªî§Xid`IØCÏ«‹îM­·AxYÇ€“‘èGýÈ1I)½ez^È~’3¾¸Û®Å}–€1“û¬¯zAs½í¯µ×ëAÃo´› ¶S‡ ¾ïi­S¨Tô×£^³Ý^a×÷×úQR U ¾2€Y¼fê)œg1$çYTxŽŒšzmÍõ&¾á5×Zëø¬·—Ñ€º­©þ[“&‡v6îÒÀXHŠªA“ ëÖà–§1´µË`h Šs>t;ÉÝny¬­-GéX[×<ú‹ž³ó«AÐôÚu´:â-J¿ÛõÚ’+8Iqž/'u­[÷]Ñí¯µ`‡I²qkáfÀ°XðJ[¸éôúŽÀŸd&&@¬_M^l¢BTk}Psýh-ô/‡¯úuð5ÏEÜB°|£ÜþOƽˆœeÙ~uu=àG‡QOô'ãá‹^ ˆ¦³2:çz¢4 '=ñ9šŒË–¨–"”-µ»Àþúú:p!þI~˜o”õÖý,f©êÖ"¨uk~á0{¥×R1—&Ms«`ÎpÉÚQט+Ç-–ef[f 󔬫Ó\~D]þ$?$1g«‹7t~AŸ®?·pc.E¥àeYŠº,^6A¥!&h.¦—%Æê/Y¸>^Rô eé¥ÑíÂŽ$’-Zg‹w‰tŠZ•CQó ÷æRÔ’dE]sºê–áQK`Ã_²pwÍ5®Ns-ø-ù“ü0—G5®È£õéPÔüÂí¹•‚—e)ê²xqxTb–áQKŒÕ_²pk½4—¤—$¹¬)½-)¦Ú”Ñ\d›‰†e›‰ucÏg Üi󹞜Î9p;3—øú’F¥NàþjÊQï²ë3]`YRnm.blW•[AåLæüÂóåÖÌ-»‚/9gO¸ê–Ù–À†¿dá¹rkšadIšë\Cn]Âè‘JQ‹út(j~áùrk ^–¥¨ËâÅá,iˆYfOXb¬þ’…çÊ­)eé%]`YRnm/ZgW•[AåPÔüÂóåÖÌ-KQ—Ɯ㮄ºexÔØð—,\’¢.‹‡G¥!fµÄXý% §È­KÛc†C´%Z¦ÅËÛ“.Ù‹ÍNóèn±CÁíX Ó—ãòV†Y+a/Ý¥!æ.l€™.¹ 0·^B–ZÒ˜Æ_™ŒæÑKšGÄ]Xø2ùË’¾4þrY¼8ô’†˜»°ßeñ—Ü~—ÛïËA¹ýî;·ß¥ñótac9yqñ=–Û±Îeòó%­siüü²xqf9 1wa{Ëâç¹í-·½]F^\Òö–Æ_Ò…åäÅïŲ–É_–´¬¥ñ—ËâÅ¡—ïÅn–Å_r»Yn7[,/^Õÿ.Ðf´ëù"7ž-†r»v±K£¨ô½ÖìÐó]¦¼?ß‹.“ær\n€»Œ@•»ØÝ°‹]E¥ï×f—ŸË£‹xÔâ›·cÄˤ¹Üˆ—ñr#ÞŸÞˆ—»Ø]ÕÌ—FQ‹,Kó]¦nJnýÖ†ÀLšË ¹!ð2rkîbwÃ.viµÈ:5—G­ß”Üú­‰™4—¯dLL³¢U±®Ÿ×®aU̯öæN{¹ÓÞm8í¥ÑË¢nØ€®"¶Þ…U1‹¢ò«½7|µ7wü[ž¢Ò7îÿ,Ç¿4zYÔí|u%së]X³(*·*~—VÅüjoî<˜;Þ†ó`½\ÚÚêÚ€nJnýÖVÅ,ŠÊ¯öÞðÕÞÜqyŠÊÓéåÒÖV‡G]ÉÜzVEuùüÿYç?–ÿÓ¿‰“Þ¼üŸ¾ß à FÁôê~»ÙàüŸvžÿó6~n'ÿçéd0šõK÷ÿ¶ZoîÞ×9#°Ó;É ºÉ}»ÆØ)B¹Î"r®)û[gÍÂk˜w‘vt3”ÛK“My ­±×]¥ÏÙ\D‹ˆfÚYІ}Õì¢T ÉYûfIRçp ê{-)w›`us9]γ «Õf¶€à/œ±›Kך͇¸Û¹|èös»nf@vã9_/ï/Á¹o*UlûÎÄØ&“½'¯/æä7–ŒvYV^wXùâ¼µËòòúR¼ü†SÜ.âçsøZê>|ë)r—ãë)òÄ,ÇÛívï0ñîÂYL]i·žžw3‘³®åë]vF–[W·’Unñê2P|'è6Ó¡K—‹2Ó¥·›©¥ÒKÞYáKÌ\<ð÷š€8cVâÐ/˜i7OñRmαéÝ|:ã9I¹Œï0ßñ’AiÄÂ%Ƽi oîætÃy’çá¾¶îo0‘ò¦…¡ø%’*//Ý-ÈŠxà ˜çà~ àS$»ÛË༴`îÈtKàdé¹[$Ô妱?«iì†óU_éË'y_Ϛ☠{j’wkëiXå“___K™N ±½üªLËk¿äÔ-±F˜ÚþjÓ¹vÝ©\[nµ¦OåÂA-žÞÅ+5Öhk‰Faº×¬ÔD>ùÆ5“Ûû’"׺u¯ÑÝþZ D¡L9!Ù‚Ùø ÑÞ›1ˆÅJVïM a‰~êi,µíYIi/sð™Ë5 Ò5çÏ‹Q[ˆæÎF_4º~´úËOdýòÓV¿Î´ÍÜK¿¤-x-9 1’FÓvՈ̱Äf·6%S÷Z2å; ¹²¹ðŽÉkQ´l3K·0Ëx 1‡Kþ^£NoΖBùòqd6—ÄÉ<ãÖÍÅ›É6ƒÜI(²GÄ,à ®²R•Es6Ç2|³±®³—IÁ·›Èq9|-Ù†GÂ7à&›„­¹¤ñ}ÇÙ\xg™,Š+³I“0oÜ`ï9«à sô}„ÿÞdœ9ëdñÄ.7ä9 éãúd.¤¤6ÿ¹“˜@›Ëæ,“ùm¶©ÍÅ‘z殣ŒJž½Ž®0E·Òœ(~9„.¤hsÉÏYFß$˜Qæ‚iÞVœ£MÊ·Žv”MgÉ‘ÝT$¤M9š[ ˆ”=“—_WßG0¥Íå€wk~›¬‘¶®Ço0$ü¢]Œ‡ï4ž<-‚åP¾|„¨Í%q2‡}Þ`$©Ì¥˜b…·ÚM™Ú¤že²(¸UY4gó5ÒŒbŸ½L’¾•÷DŽËákù˜UÜè<¾ÁÐUÙ$¼hÍ-ÐHï,ìÕærÀ;Ëd~›¬‘®Í]7›Î*¸Â}ý7gÎ:Y<±Ë yÎBºÁˆ]™ iŽ{¶ü¹“hO›Ëæ,“EÑ™°ÍÅ1˜¾E쨫äÈ^GW˜¢[IV@¿B—?¶¹äˆ¯~n;¨Ã³;ë(ïv’¨f.Ç%ÎLî"ëÝžÊ]7ëUÒ*d/Ç+LÑ­äd¸ë3·;ÈñŸ¹ågnYøºƒ3·«¤ªÍ>*¸“,¶7z`vÝ”·WI=1ÇÐ7i)nø´ë²Xä§]ùiW~Ú•ŸvýÉO»®’T8s&—8i¸‹„Äw{–uÝôÆWI3’M’W˜¢[ÉQr×'Uwó$?©ÊOª²ðu'UWIÝœm`¿“¬Î7zÌtÝÐWIÅ2Ç<~7iZnøŒè²ºägDùQ~F”v·+-_v~Pô×;(ʯo)Œÿ©¯o¥-´t™ÑH¤ÙGI‹ÐrÖäÜ}YXÿÏx•¹ÒòÓ¨L|å§Q©Ó¨üú–¥}·×·ÒVAºXi„ÖÌU°ÄÄܽàJ™ËÿüG^™+-?òʼò#¯üÈ+?òʯo}߇b×¼¾•¶Ð‘dŠ-BÃtqý?ã¹ZæJËÏÕ2ñ•Ÿ«ý¥ÎÕòë[–FúÝ^ßJ[‹ŽQ2WÁG+s÷‚+å¤ÿóÞe®´üðîÏx—vZ‡§xuý¼vS¼½˜ f¢ô¬,|Øik­Ø;ëF£™xuFãáøpM‹ÛáxƒÅ§âMSð1‚…þ:šœ ¦ÓÁx„gö03¸N/ªxì?èÃ_\㽬”AçlÅ`‚—E\ï½qÃhΰ!tGâôlr:žR)¼a|6ýˆFrM¢ÎEñpŽfQ¯*N'cZÔƒöÃü‚JñLj`á!ŽÆ³AŸžFáD F"‹ðz ùUìŒé&’•©Ü`Z<5£¶^Áž owN¢‰Õßôìôt<™g(:íšî±ÓQxáäɨ€ˆ'x2˜á\@¯¢!¾{4–ÞÇšž"Û§gá ;HÐY8áóÙ¸¨ç'‰Ì\( OO£î ?èVŧÉ`6‹F€ÜÁxbHgïݳ—oÅóÝýg{Û»/öÅöÞžømûÍ›í—owwöÅo»oov~Þ~ó\¼}%Þþ²»/ö_ýôŠìT‹»/Ÿí½{¾ûògª¶ûâõÞîÎs»ú«ŸÄ‹7Ï~¯ÛOw÷vßþØ~ù\ü´ûöåÎþþ*4 ^¾;GöÁF$@¯Þ@ÁÿÁú»o÷<Ù¥öžîˆ½Ýí§{;â'.Qܽólw{¯*v_>ß}³óŒª>{õrç×wXm{O<ß~±ý3ÃmʯÅß~Ù~»ÿ ú~Ü·÷ÇñÓ›W/ÄÞ«}ýÝþNŠ¿ÝÆª¯ß¼°÷«â·_vÞþ²óa߆ÿŸ½Ý}õKC§oßÀתx¹óóÞîÏ;/Ÿí`ÅWX÷ ¾Û—ªÅí7»ûØã«wo±6„¡—;Ü"aª"ÔÿÎó‹mjõ§¢30‘×å9ŠÅGñz…°P§Prçì6D$õ)Ò\Áf:ÅÂÓ¸È,ÎI8O€”«âͽ€žÕ­z±Ð†ýb|6BªÛ£ÑYT,¼8ƒ…u!~ ‡€¥ÿ‚j½Ý¨y­z«Xx·º¿º½Z,À¦ñÿv ñÚ0ìLW»ã“¢À½…½0‹â-¼óW…ܾå‡Ó_y%²›Ò¯«Pþ$ÈLE VÌtÖŒÊái¡0éàt€Nô ˜AopÈÏN:Ñ„>þp{À°Î}üà¯:·]pšÃáˆTÉqÁ {MÏ|x&ÃÐ÷À”ÑžSô¢n^Ô¬8šOÈ8C‡|4=Xí'áPô‡ã™Sít B•,RÅ:?•Eî¦/žlŠ5ñKt¬î¢¹ÉÉp=Žƒ/¤>Ljä6²YF·98 Éj[54ŠÎu媈fÝUžÄ0W< a>£Y4A2“sºÊ“þÃ`ÔžJï“LµztßôÊÅ?ŠÂ_XCå øåo ˆýAUôvg+ˆ6…WøƒïÏF¸«ýAÍ‚@[`$zâÝ~G­â÷Æû ñUœUÅÇߘˆbáÓÑ`•D Ž>Ìì´„“ü`ð9÷éK¹*—}YÜÛ] “Õ*S\ÅÃ2<* ú¢t¯2]Y¡oÐ`1EW FXñ˶ÙîT榄è"ã|8yøëáX…•`™LËXÇiMÕqÔ˜‚&¸¡€H¨Ä—/b ¶à³÷Pj¯W¶X3þ2£‹ î¶Æ´ÄÇ}‰éðã û© ûqÐýoº¯AÏ í³…äʦR—JÝÆüeó³s ¢ª&ž¢uı>—tõ‚k |©«~uø>?„gÌ3H†ùZÌçÿ&æß²ÿ¾ÙÙ~þbçlŒóí¿^£Ùn‚vÝhøu/¨û 4øux”Ûoãç-šF{ƒIÔyì·W4‚ µôlÒ•W¨¢Ñ”õ™eÒ˜>.{3Ô‰±Ô‚"ÒûˆV9Sõ†ÌÙð@ì ¨Š æi8ýyÜ/Öƒ,êå¨E‡¨V‡SñÑüúCi°2Žz*Zèň,ÝEBn:(¯ ñr¬KýT¿¥í Tbµ¸ÝÕZ6†0Y¦‰‘Ÿ¢¥ ?æ[d#¶6KÝñPNM{jÄ‚e¸5ïSÑû²þý" pµ•W‹E:k½²'ÿòŸ>ÿ9ß#Tcísþ4‰2ð úd¿€Ú²@3,(Ÿ§0“,Q,ôø…ÔJ­ç{ü- #´_ëwUD?´þTÉxŠÖšwî‰îÑàt õUÛt TYks1ž¨§Ì½ÑÉÙ0T†àôN~-üû,Li{ÿ þŠ»ª`¯WP 7ý©jºö¸yn§¤A£]¤Gœhœü^4Âï± ŒÎ1.âùÀp¨ DUl7:i ‘ ¨ Ëó¢@ ~‘4§ l¬§ ‰L>*Ú%2“è[Á’ /GS ˆ=ü+Ï¢ÃÁˆ,ãâþä¾4_ -†Ú‚Ò™†€êQÂàÁò´Íy^Ñ6ä‰R/ê‡gÃl©ö¼tc"F&ÜùO¯wè¾åAEZñPà°7ž…«GŒ‚ŸÞ!ʧ³A÷øâ1läh²º âÈÝ™˜ †ê~&ÖË/ÔÕ¯’æ"B1Dƒ¢©ˆ|¸ á D‹ñp8þ¡N€ö¿*‚*¢¬®Ú‹ºÇ‰æ¼"”‡Õ ûxÀ: #§ñPq 5/d8Dl89¤fšgiôï3üÚ‚"s!–œDÃècˆ6½ƒ (eŠÜÎihÜùNçtÆt <6v$ °Rà¡âJlEœ‚˜EòL雲þG:ƒÃšÉÂQ‘¨ Þ$òžê1i=UDÆ} ¿E#MºâW›gUcL‹ŽŠ ©“-–¦5X´­eZ±³‹S˜\ù÷E ñGÍ–qï+~#ßœWèUµ8£õ› –ÆØßö‘e„#6h~ ©Àôhü = ¡•mkñ¤ŠG¤â$ årŒÎBôˆúÕbçŒßA¿g°D/4–îÓŠà/÷yÀE^‡çÓñèᔊuàaH÷p #¦FƸ½%{A&wªWóP ‘ àw0ÿ–üß[…5}2æ|ù¿Õj7êèÿáyu¿Ýl´Pþoû^.ÿ߯uåº^”+x®Ë”ßfRF³7V’N}õ0ò¢¿áW:Ãëh/¦^†/bÒ‹)Ñ…ìÞñ,tJ(ª¹×mƒz´x ,¬¥aÁEÖC@‡ ÃN¯/ ôN£î%±æ ë¥!ÃÆÅZÖí Œ!Ô–B½îŽÁu4Ãf«nÏ £†èöÛ­v³î/Q-uD®;u|HÉn<*vq”Æf&<Zæ@æÆ ¯7š­öÚzg¾·õS]íã¨È°ëuCÑÖê½Èï$¦–ãî. U+¶&œ®RrWˆ]¾k—W¾‡sü*eÙæÚzê:ñ—a¦¾Z/Ýf½-ÂVË묯·“ÈjÄ‘%«/FX’‰$ºKe/»æ”ÕÔ%ëÌc)õ%YJ;ÎSꌣVÐ÷ºO4¢µ~§½¾˜§Ô#'¹ÝX`XX‰•ÊXs²Î¬Ô–ÄÊ".Å8ª¯wÖúÁZK´úMÏ÷Â䢋s©T-äR±n .ec,Zæ@–áR©Ü}Ù…g1›½­5_4Ú~Ô{á P‚q•˜è.8—ÍÛu:©\Kՙ˹òÂ[ëÅ­{a=šétzëëÍe·ÄâLC\¼»PÅ9e[i TEóüÌ2Xz‡Ô­Ä·¡ns½Ÿ²C®¥ N5±}Áü’ºL.}§ÄòÝ´òó%Зö))qŸ(m|(ê^ëJ»nH¸ ~h÷Û]¯Õn‰nÏï¶ü~rÙ®'6ÓÖvŠx?ô[7(JgC?wÀÕœDÍú2¨©IÔ´:a½³&š½°¾ÞŠÖ!¦¶ bÖˆq{ign Zb€Ùp/DJÊn™†î\)#@r\ó¶W_§vO¬w’;d1©{ãúÚ|Ä`Ûë í`½¾4Ö×ÖZA‹‡¡ÑA@dù%¹vxí8O{9±!Ž8Y–p›×xÇ_ot@šéô¨Ûë&9u3MnÀú 1—"8ÄûKÕרy›Å€LŽe!Òš,–¤`­¹¬š¸f3ÞçZuä™Ng}­Ñì§« Ü)0 ]Í$Ù¹½eƒfQS¥cW±DUY%½nIô‚Õë'Q¸¼Ð/[¢eâÓ‰Úès¾h7ûÍVï'ðÔ³ñÈí,FfÊjŽ÷› ¦µšc•)•ÚºÎ%°ZKEë’ËÛjŠBHýv3[ ÕÐë]«ÜÌb¬&×y¼Ûl RcuÒpÚZ×u.…Ô`I¤Æ…–¦“ë7Z^݇OÔË iŒÒµA6©ôB©%wÐúz¦0âÛR‹f )pÎÙM¢+œK¬¯Æî˜ÑJ°U¯Ó z^ ºíÈo„ýV3Ö•®rT‘è#"ÛÚèÖaÁØóbÒÊJ0'¥Õý¤p—º[–¢ü;xãïSObž‘QUHCMË‘G’äÒîG}ü}ù#8HJ»µ^÷ë wë>3£5[QPYàf“Ìúª4×ÛþZ{½»kuí¤ ¤GÞ·É(ÖÐ:5D:I˜…' 3…¨xý5ª¾PŠ ’‘8Zë ¬Åo1p–Ú¤eŒä8\[óê n¼†×\S}Å1ª¢ÌY˜·„ÑXh“v£ËcÇöS ¯›ÂéËr*×.Êï€8ÓPyÛÄ€ê×ôÚõµæZý|ÜD€a,µÀmrÌhˆö÷L$£úb$¹À}ƒŽ¬ÑÑÃc¢ìº.›NŒ‰ õK Î&¿[CÝBÞ˜ ¾xÛÞz:—@öõÓÂ{:¡^©vsI$ÖüBÉ9T_*L>}Ö¾suºx‹W|šJçö˜ ›£Ò9åYŒeX”´aäS¬”‚£á,–±ç¥´‘‚®%™%†ŸÌºàWJà7”¹&˜+W Ôo7(`?éI2·ÞTƒ€0™Á v(R,Jopr $îŒ?#m¸ÝìBzHŒ/™^À ݘÀØâàW —¾Öäd4Üøyó-F±&®Æ]ÜSasÈÅ)ßËDí¿ }¤ §³=;Y?K°“ÄxqùLé{ù4®@>ñàãrrbQáæ±“ÆÕØI,ªY,¹¸ÝDJüEáî¯@=iØé,ÄNFVéK1›Äp“ÑçÝÍ'ÏðçOs9â±i§)§f-CtLŸá1™*>u6“ЦƆw&³)1•nFüw«¹¥â¿§!7yÊ»xeÆ#_Kdóg=£s{¼‰«1v·ÇTØœ•ê”g±±u™•šDÖ+5 [ÅØrøüèZ‚Ï'†Ÿ î®Ü~S@™·rSì ‰K,u–—°Ø¤QO'.Åã”wâbU"Dö¢äW —¶Äý‚ñgäö½'OŒ/Ü[œ¥÷ àÒ—» ä"›»Ä›¸w鯅ždù¸Á¤Å2¡µ¯B)èé,FÃN–ÀÏì$1ÞDðìSúžG>ɃêÅä,''Z^l\ì<ŸJ.Q\ÌIÂâK—£{Å$¾õ¤a§³;©_/ÅlÃM(v7Ÿ>SÀ¿†a-fICãšek»´aÍõÓ‰cRÍVs‰0íôôî i™Òîr†´†ïavV­ùD˜†ž»4œe'Í g¹áì’ÜC]‚tí2s ͱà-c™üa9ËXŒ?ÔSíRó ·júÊN7™›¾rÓWnúú³š¾\Ö7—¤–æâ|ñ-‡Û4ueÎår¦®ãNÃNÂî4ŠÓÐs—¦­ìü}¹i+7m]’{¤Ú²æ vwl»ÊäËÙ®bü!ÕXµ@°»sãTvÖ¶Ü8•§nÆ8óú ´­JÕË-TK 2¹«×M¸zÅ®%ÆvÖTëÑOŸXwkÐʤ¦Ü •´rW¯ë»z¹ô·¡¤Z—æóxß•ý+“šrûWnÿÊí_^ûWîêu9{˜KLqƒLªmj§O¬‰»5—eRSn.ËÍe¹«×õ]½\úˆ[hRmWóùG¼‰ïʺ–IM¹uíZÖµ4sšÙêúyíêf¶ü†eîf!4w »†-FifÆ„Ík‘%ÖÆ]›Ù²è#¿p9|r·²Ü­ìÚne1òH3B&l^ ¸ËVÈ»4³eSnf»s3[~Ã2w;[b¥æng—'43cÂæµÈŒkã®ÍlYô‘_¸œG>¹ÓZî´vm§µy¤!6¯Üe +ä]šÙ\„Í;ÿßî %ôææÿó½Fà Ì{Ðö[z». ”ç·òü·ñ“’ÿowþròÛÅ^ϲ<¥fåƒ~j‰Œ¬|YYø,XRsfP©÷dGÔ˜gn©¬L €¨×-„,Ÿ©À (#S•ÊÎTgA•‘ªÎ§ÌLqëîl-‘!n~F8°E´DF6gîÙâÁõñWf¶EÔd6/šiùthYéÏ.C\˧33š‘~ŒJÍO0v™yœ›Ø+…Þ—Lè5?×¥\œ@ËÆÙ² ´–ÉÚ`™‘¶!}¡ÎÉ–º`³²%´¯œ—ÊÞ ¾È­ôO—X5—IŤ¡›ŸŠ)3õ’Vzî%Öò‰4Pó!e&>Zh$77¢;·Óñ«?Évi¥îYÄ0\²Y>qŽE6‹ç,H”cØžJÃB_v‚Ù¦ÁÚÒ‰iþ,ÍÊ÷bCºh¸Lv3åËgWY:›Š ô"¸Dò óÉKd•¥s•,Ùå3:g7a1“%„_¥%¹„‚’–‹ƒÓhXbåÒ©7RSmXÐdäÚ°™Êòé/,¦’–þbÉtö¼¤;hY[Òâ@þmnÛlIsâøËÌWÊ)a‘TÂ{1 xS294/îÚeÀ½E,ÏOްˆÎb:ÍjÔpƒÖxÙ€‹.™‚à2ôº0ò¿Ÿå¼ý§Í¿cÿ›nĸÈþW9Ûk5A«é-í°Ãäö¿ÛøÉí¹ý/·ÿåö¿Üþ—ÛÿrûßžýoͳõrärÞ%åå?Åž™s#`n¼k#à·c6¹107æÆÀÜxM~’Ï¿cÿÃ?«Ýoncšoÿó͆/ºf½­f‹ìAîÿw+?*×ü)ßE"<›'bܳ£ÁTLÇýÙ§p øü<ü8艫âçðbµX|6>½˜ f¢ô¬,|Ÿ« >z>,±wÖF3ñ6êÆÃñá š·‡CñËOÅ›æàcÔ+_G““Át:ð8L úÚž^Tñ&ù q½õ@æƒÎÙ,Š/‹h¯7îÂ*ÍÂ6„÷ÏÃÑ…8=›œŽ§TŠü†Çg3Ñh(GÑ$ê\'áhõªât2†±E=h?œÁ/¨ÔŒãh<táñéiNÄ`$Âá°¯’'PÅÎxvdšHV¦rƒiñÔŒÚzCBx.p¼Ýa88‰&VÓ³ÓÓñd6áVM÷Øé(<‰pöä HTÀÄ<Ìp. Wщß=KïcMOÑÁjœžu†ƒ.ˆ#… ™ÀóÙ¸¨ç' ‰Ì\( OO£î ?èVŧÉ`6‹F€ÜÁxbhgïݳ—oÅóÝýg{Û»/öÅöÞžømûÍ›í—owwöÅo»oov~Þ~ó\¼}%Þþ²»/ö_ýôŠìT‹»/Ÿí½{¾ûògª¶ûâõÞîÎs»ú«ŸÄ‹7Ï~¯ÛOw÷vßþØ~ù\ü´ûöåÎþþ*4 ^¾;GöÁF$@¯Þ@ÁÿÁú»o÷<Ù¥öžîˆ½Ýí§{;â'.Qܽólw{¯*v_>ß}³óŒª>{õrç×wXm{O<ß~±ý3ÃmʯÅß~Ù~»ÿ ú~Ü·÷ÇñÓ›W/ÄÞ«}ýÝþNŠ¿ÝÆª¯ß¼°÷«â·_vÞþ²óa߆ÿŸ½Ý}õKC§oßÀתx¹óóÞîÏ;/Ÿí`ÅWX÷ ¾Û—ªÅí7»ûØã«wo±6„¡—;Ü"aª"ÔÿÎó‹mjõ§¢30‘×e:ŠÅGñz…°P§Prçì6X$õ)Ò\Áæ:ÅÂÓ¸È,ÎI8O€”«âÍK<«Á&^,´€c¿ŸjÅöÇht /Î`a]ˆ_Ã!`é¿`‹Zo7j^«Þ*Þ­î¯n¯ °kü¿h¼6 ;ÓÕîø¤(¸£îð¬‰û´¿NNWî›§O¦³Þ`¼z´å>:ø¬(¦¸F»Öpç¬ÿ{à5ÖÞo@»½$þH¼¥³Ñtp8‚…8˦ÒÇñ Íö¡¤øï7GQØ‹&Óboz4þTúë½*zenº‚_7€ ÂÂDo£øC4œF²¨)QÕ%ÊPb ¶øG±@ï¶zä} xP€5zU1|ŽÆ}|T.C XÏ£Y¿tÿoS”bþ6<øoSümúÏÑ}XöØS±P€¡•ÞíÁ˜*å½òïÞûªˆ?óá6 ­~…‘C»Å˜¹ÒßaìeˆCJ@cÀÖèì¤LX‰"öp†þ BwøåCkÐ’TÅø¨ÆÜû=€Þz=ðžœ.Œùw”ÊpTZêû[/Eêû[† SXøt4F%QB4ô£Ù´4 ¬Itá—2| •ËâÞ¦W0"Y­2O6ÅCñ° ƒ¾(Ý«LWVè[FÛÿIDüm HH¬BÝÙ•Ý?@4ôze«2Ž®*îËrP½Ë¥iT“@¨4ÓË}’iïcð7ö—/ü÷e¸ûôýƒ‚f·g ñ‘zü;` a¸#b ¾|e¡¼Áï,SÃ#¨$¿ûò{À(Œ ‰ê6ep¨O3Ÿ†àÇžô”áb¤<åÂ#òüÎçß–ÿ{wqÿÇ÷ÛízåÏ«ûífƒä¯éåòÿmü$ÏÿO{ îÓYf¬•ê ÕUµÝnÕ›­µúzg}½Õ|¾àÜmcI<¤Jkx#-ëŠ&vd.Ùe]JÔ·ìz=;6Žë¡°"’=Ë‘¬d€Kí¥û3¤´·æe¶× ts™q†,÷g*æû?¨Š©Nz6üÕêLvkíz Ö›ÍNÐZ÷â¢–Ž ÷~tiçZ@*±Þ%©¤ o%>­71.у‰ßwzH§OûÈ™ÆEn(¦rš¯IÇâÞúº×ò×üu„¬ŽÖ`¿ÅžÕ©P¹Äb<«óâ2ňiÀ° ߬0xþƒY—J«4-B‘ ÕZ¶¥.Ýx"ÇwIà1ŸRèi´Xú1âU äûQãÈÊ%8ÍÑR™wÜl$*BÖið×m0ásƒ¤²Aš GŽ ä\ø¨4šz&*kÕp䙵îm¤õeÞ:½Tx£!³Öz•o;èÌ%Z_­½cöÉ"ÕÒÒJ\ayÈç»<ø@¹±­XDþˆ&n >-FIÉÈ£´©Û°%[e Í¥¯]TG¨#Áb·É|TÔhƒƒn†Ã—qh”ÙWkÓ°É]³È5WäVt鉵n>y‚S£Âú…ñZ÷JaaSaõEÁ]ømlYHøÇF|ß œÖІ”@SP¸åê†Ðû2L­F”ÁªY#yÓ\¼a¼ MõÓU «CN£ÀóGp‰,gbË®2¸ANXU{|þ$„Jâ¸Ü11èÀÔ!a³N^ídØ™ [-/ß.´——’#ÕÊóJŒ^‚X⇌¯¨ó„KÆùЄ©ÇR„C^1N"Eï«‚|Žu»(¿¹Bž»™ŒP•P¬v›üv¤ÆŒ"Ú ‘q¬.ëktkxÊA j®Ô_ 0Ücܵ¨f4*+š]^ÙV2ÅÚ†1t*WrÞ\~Þ ôœÀ‡›yM>·=׫Ÿ¦»&Dp  jx[â„2Ì6û£&c«²^­çI¤MHµ§£§³WžCOÌ1—‚g`ÂiÓ,b¢ Cì(¢WåL+Œpü:V¹ÕÆ.ðyAµyªÓÝ:g\Ñœ³ª_5âàLo€£”Þ¦úîk®ÜBâ®1d )öÃ,õMÐIÀãYÌŠx>H‚ Ù\¹}r™+)Wျu„ÎÉгÕ-‰çë¥C…^ÎEE£zÀ© `êŽï9Ä[A6Íj*w™õX)ó§ýä Ù$µ2_ÞÞ<ªÔ!G´>œÇ`$g>Â^à ŸšMÌì\¬DÅw!ÕV¦¥È d#ú¶‡mý­Ò¹9LcjÓ¢ÛjO”ÄžiST¹£ I[–Ìi~^“´”-” ’Vtæ-zÖölt´Û¶„‹ Cˆšˆo|âQ’xèYMÏ+;ºøŠ© ·ÝÕN/}‡Z»õK6HÃ^õ¤Ø®R-"aJ`ä!Ä0ŸX‡4ZÄI£(C#â3—O4íêÉã,ÆPÒT^co 21˜«®Ž²Øz–—z$žüœ©êÌŠ ƒël„Aì# ןl›“TnÚ7§ÞH„ªÛ* ¨rSªì¹RLWS½’U<˜ ˆ%DIåÑÊ”ðÊ—Ðïe[ê¸Òµé <àPŠ)ŸÒtD ÒY7˜n°¹ìNJµ°c¾×Õu Ëãçîx„¼GæçØyR›ð.:fwѱÊèj¤­3: ‹&³–.E›a + ê°vŸžÙwW‚bã4GW—¬hù*\2^ÙRnF:råpk¹¡TÛ,”›YJ™l$åJÈú{J¹Ð*¤Üè½j¡9áYo¦¢-ÎtÅhw’E³l¾G¹:Ë£\ËfSÅ)®²ç3-±;ƵZ­sÝ€nèƒïf”­FÍÃ;õç¦(3ÍÁ)Ò„NítR>åRG¬d««¡]žÐ1B÷l¡3Ã2þZ_êÓŽ—úRÅÊ)oœÚºTX_¯±Ø¬1Ýù³ÆÃ[V*k(ÛEuÌ\¨*κMòë:³OìÁ×úÄšãm7³2Íù¶Ë¥‘øQžÃ \5sšO—ì)–þkÎÄÝ̪j‡¸ò~_Gœ³ÑmÒê*æEMà-8þ÷Õ*0ŽòPÝ•úZ%Äf%H†¢Ô‚¡4ÄVÇœt NºMri}† @¶`M±kŽòÝÐd3Ôœå«ÙãóªýrÄ‘xQÅÙÒÒŸpýËœ;«m§vÞ­3j„)ÙnîyÉy“MÉ=²†˜‡$Û‰¶še)4Ú8¸:$éT[¨Ô—Lm jN«“,±!õ:eQGÍyWÁ^гŒðà àã˜åmc§^Ñk‡(/§OyY’BîRÇÁÕ!+”8Q YU³¬Ÿæ[{)#{³¬,js5ÂD<[Ã7Ö9s¼æg„ÙBw™yÀSéÏl–^ÑÙ4 ìë4[hP²ÂmThc… !×)+¬P!åsn}U¥ |f¿ÖIÖœEm¶ÂŠÖ£6çÊšã©5ÕŠ†í¬¯VôÕ\(O©®vÅú!ÕË>(ø`Åó¶bG}|µí ÕÂH£g´;Ãú“çÌÊ•’6ѽL˜6gn°e—3¡{¶Ð-rf•¾ÌžP¥°Æ‘ÕŸ#gVªÌ&hU“3+¤j“3Á{ð9³rNÞdešÃ½?uÎl3¹®´ªÚ Öºœ™ZæÌFp‰œMάRÙphÑ_4:øt9³R 6†Ò›&g¦¶9³ [Ð"gVÍ¢›mA6CÍAæŸ>g®ám¼¶ Γzþ£Î™lÛåÌFè‘5t‹œY¥P ËRh´q úgÉ™·Ñ©M´Þº&gVˆÝ*g6Â7€oΙU+fvª9AüSçÌõ£Ìk¯­s欞©sæ:zËœÙ=²…n“3+·%Ͳ 5 üt9ó6*´±Â†59³BÊV9³>³‡¯Í™­k£µb(¯VÊ¥mm´­¶µÑ¶6ÚÖFÛÚèW[•7æÈf¸im4ÐåyŠýUÛP®j µOµ¾6¨}zX²…Æ6©}º9˜ q )ÁÔ÷wêü 9ŸœÅëv¾ˆf@Jz}a¸/›­û½È¾—ïÉ«Ru³x–+ ¤,HEöåï𦠃¼°²Ü’ò;1òòFkWòqDæ$BaÌ Ê„IÔ1œ4b‚ÜZéÍ9Zx¡©K²®ë(TÁ ³\yCN£çá(ŠÓrÁÜbØÌx1IÔ’qÚ‹m:OpûÖ¬É{ûj“ôŽÐFœ¤N”y(Ñ€úNÃq<Ç%3ßÅð/듼Û1Ê]"EYÇnb£,újYÈc}C âxW©a/ºŠŠ½nò“—¥Îho€ÁÅX P¦ù±cöyãÒ’'‰ç2’f8®ø ' 3rÊ?Y½LÂQ”F>ž—𱵩¼’ˆB{9>³ë(›Õ}‡Da>œÖ(¨ðµU…嫘¨ytÏ:ÅæUŠÏB{ÁJW_×]Ѿô2‰FC[M9¡Ð–çÄÚ)iìÕÕT€6º¼ñü4÷gd[—Jrfwä$±ƒ¼Œb:f]†±8!QòÜÄõ±ÏlÜ,ùLnÖž]ºÖÍæÜ“0f#—AÄ:òìDQÕT)x±º¢¸C¬ëå–$Jè‘4¥˜*fyënV# jr³uâ¸5°kÙëªy¨ª#x‰a­±‚ãÒ ˜jcUyÚêHéŒÇ(8£àc–* .\ÃN`` ²)ƒ(t™ƒ"àØ¡™(-®*X«)Ƴ:*—XŒgu^xîÕ1 –á›Ï_b0ëRi•J]ÊÑO@Ñ!C'"ÜÇiúK]ºðD4$Žï’Àc>¥ÐÓredÄ|æ#ß‚GV.¹ÀiŽ~”ʬS)ÌF¢¢\óVå¯Û`ÂçIeƒ4AŽȹx¬ÂÈ´õ« |”*,ÁÔ€ÄGq%xeüîÀó]Ÿ1懕9¬!lAÑÄ h€’'yÒzˆˆãYàå>Ķ¡ðÞ4qcði1ÊHJF¥M݆(Q¹lÁ˜6èÉÕÑêÈE°ØmòA5Úà ›áðeeöÕÚ ÚdÎR›Ëó”^jA92§*ý°)} ÜqÐßåŸ*R ¢"3ZÞׇ¨‚ÁøäzØ£<â tÙnÍ|QŸ(ƒÄ?¢$Úé¥2½¾ZµœÂ:X.ãvƽ Íœ^ ¡œFY’®†aw~ :ñCF]Çõ„“ù³ÂÔc)Â!Œ4,QTœ°¯ ›9Öíâæ¡Êd„ª¥`µÛäG°#ùl3Šh3DƱvª¯Ñ­ÿû8¬ïïá±Úäâá'àÊTÛ]뼿%Œ/÷Juƒ‘õG~àáÕj1ˆ¥øJ(‡„Ÿhb.»d¢FG£˜fs HbGa6®Ê•Uáø-t¬rjuŠ¹Ç‘ªÍ»Ô˜îÖ9ãŠæœU½šgz¥ô6Õw_£ðßÉ¿¹_‘ã±j+Mf_n_yè$/½Ä¾›:.Jh†½hTYüD ±ÍöúR±sÓXƒØ´ä’¬ ÄUJÆÁÊå•;òóeT’_2§ùyM€]¶P2H^KÑè(ñ/&…òµb# B>Ì—`Ÿr‡’/e CŸyqBŸx‡“\)­zT…© ·ÝåÇ5Ž¨Ñ }Ñ U¦¦Z`÷%LM±îK˜Z£cñ衞㳠ÔÉ ò¹µ5–:\–S¥¼’a¸®ïPÂg¨ùJ'ÌS­ÜL±~×]Š×Š‹Eö´©‚ª˜ñª÷ée­áE£9פ7ð|€C)¦|Èe›äVJe)õ t~•ä¿Dç×)«u É?ºdþ\¶ú—$#­ÿåÉ'_cº~ý/Æ>¦|ý¯O°ï‹õ¿>m×ÿ~‰×³§w|u:ç—Šn—ÓšŽÐâr¿ˆÞSôf€^EÎÁôæãl|q¹@»{‡!ëCŒÀ Ý&Ùdγär2½š^Œ³ygÿê òÛçè4¼ÏÀ†Ìf×ãù|<ðGzf¸ÙÜ|ìñ§‚Gð—[j:ûÇ·‹¬Füؼtš€}OÑ‚âÏ‹&ÑÍíìf:w¡càêvF™àä2›eñÇÎÅ,š,²´‡nfS`-K~´€7hOßg‚–œÅÉt1NàòÍMÍÐx‚¢««ü<.¼‰hO—+ÍÆâ¾ñ¼s³âºò°ÄéùÈùM®¢ñu6«à›ßÞÜLg p'‰ÝÞ =G:‰®3®¼B…(à—\/¸.+Š3.ïTð’¾Ïôœû*hqs_ž°¡‹¸¾˜v–zà„‹’­tQJx~“%ãÑ8顳ñb‘M@¸ãé¬Â3t£·‡ÇçèÅðìàhøæ í¡ŸöOO÷χ‡gè§áùktzøjÿô:?A篇gèìäå9ÜrØë ŽÞ¾¿͆o~<¾¨6?y‰Þž¼†¯û? †çGûÇ/ÐËáùñáÙÙ ãtø7NÃÙk¤ èänü;o?<9æwÒóSøÚCLJ¯Ž†¯yÃ~7ïn|{V4èuöO‡gãÉÛsÞn€ãø0‡($M9ÿá)ðüf_@}Ù‘4м«ÏyÖé<{Š~¼Ê"0Ôy=9¾½€Q”wõ9ïs;U§ÓÙù!/rÆ9‹Ótå:ò‡ô!gèìà°ßLo'¼×¢ý÷Ùä6ëì¼¹Ãúˆ^¯®@Jÿ#TH½¾ ³óvp6Øtv`ÐøÏ€÷¯¢x>H¦×TwC)wà,®…o)b*GýÞrâ$7Fñm–¦€ÿˆSæh¬f¾HÇ“½¿ÀÕšÏ@ü…?Q\‡Ž/ò·×q6]f¿:à´~ÅüÍåo$‡½#@[JD#»Hü-›MÅ5>ç\œ7'¾»«{–W?ÕýÊœ›Üy¢œ:îK#”‚Å_GWht5¸ƒêßLÇà{ò[z¼ _ÜË=÷2#ô×ïC¯³_ÁÝ]pçÄEË=Êõä=_L¸(p‚8KS€ÍÅ‘Ã_¯¢Y »4É~]6î¡l‘ rõp ç o"Ði¶Èf¼«•zäš4ž$W· ÓoD`5¾¾\~³ºúW®Ééàò{ùÒÕ8æ×:pg³ âr¸ÈBK`·gÃÝ]¸ÔK.£ÙÓ½½çp㜻ñ„?ò¤ߎ~æ5»w=4åŸ1DWïà®Gi:ÈÐ[´{;Ჿ}5\ì­¼ŸŽS ew¢ÿ>ýå2‹Rà«“‚÷,v?ÀøÐCé^Žç)ÿú†MpôJŸweWó¬¼wuKoyËÜruþÙÙ¿sêˆ ´í¼=BÐÓ#è1»âóӽDz³òä!3ÜÙ{œöœÞ|ü[6ñïœól´ûÍ·sh)Þ}{õ+‚ÿÿ˜|£‡ÀÏ×G?ÿâ¼+>àw¼õ¿shß¹Cßýð¾ÇI+iy^PùüÃÓ9æo™xÃð ×I:\Ì º÷ÐÿöÐŒÏÈöò~Á8ÜR²þìZ`s5ìp‘££#ñ¥³#sÌS¸åÃåø*ÛE»œŸh~¾;<Ìó/{½Â ì¡? Ð]4{:çVñ=ÙƒK;ãÚýóÓy·+¾í@:Æu›’A~AëΆÞäç J¸3}2{òÞŽ3WöÀ]0›9—ž ­l1É[Œ¡Å2‘ç%ã‚*ô¯¡1ú>;OÐãÇ(¿>Éñ‚ÇÊžy¼;ïâ‘„iôoñ,‹þï9ç:‰&ÿÁÍmEÄ£œ²È“„æŸWpq/¯¸ù·[¹‹,¯÷ÍçàGFœ¤ú¦ècåèi®ü/~×d>°ókä]Ή …ƒ>ú¹DÆIɯ”$å¤ä×Üʵò>’_+;ÿ?&Eûí(½CúõûߣQÅ6PÅF¥9ñ9é9Ñ’/¦à×Àáù ¸Âåo@þswÎGŠùsn<è{®ûçhŽ¡'þóßÏ+½—:|Û÷ðŠ®‹‹žQvWü|Ù¿Š!²°ŽÇÜ<ÿŸ½oínãFܯݿ–FŽ(“L£ß-ÅžU9á®l-ûæÞûäôÓâD"µ$åÈ™ä¿oÝèI‘”â8äId²ªPO€Æ5­“KÝçú‚öoR,O(SN!h\T<&ÿFAåsú|yÃxÏjˆç4ßàˆüh\Ñòñø$Ï!¨~ôðÃ$MT¬¦RBE 7·`ðXzÈý1 wPåsã6–¦=Ù`/‘y9 ‡äXþw ƒr8¨|ÆÂR¦äŸÌ’C²óÍèúââ p&bL°:U{Vb‚š•ÙKº;EئÊ8)ó}™%‹#Qï3ÿTæWŽRyY ̨F±Öƒß@793«ÕñK¥6޾®Šä¼U;@‹³›9óù­ {ò¨°(à†ûÔû€¨×ÿ‹¦a‡tt¨nÌ·”жfÛËòv×®À´I ªT-¢ÿÍii"…´RÑLD­¾‚ú*ÂË þ\„ífìG­H»Í-Ü2Ò2Б®c=éäV¨$‘DB4ë­yiÄRMœM’o1ajSöòøÜcqÞ¸ìùCxÆÍ ª ¼ü«ñ_ÍÿÞEî? ò¿¶áºÄp=:¸“Ü –Cmþ÷>>ŸAþw›úݦ~·©ßmêw©Ï_1õ˃n™ÀÛ.HðòLåO‡üŠ›ŸF<Ñùþ=6W3»ÍÕ6•l½Ë<+X>–§&ûÈËÌŽH¾â€1êdþÓ­ÊIX9¬j¶!×Ê“²<#[MyÊd)fÉטp<ÅY*ã)Sž×”p~þùìÍwOþ¹1­+`ÈšñÕÅõÿ×E¶wçéŽÌ˜‚Œfû8wœžì•IVQU©&òÂyNX`$ÿá½ NNN~ö ßËIÀ‘5öo:2$‡70K5h½†ñ¾2-Œ…°/‰¥dL:™ŒÆÈ˜ãÄó³ÈÅ}>]Ìçä_^±6€E{1~ËA)ÆwQæüÃÏ,{Ý%72kå)ó‰ ¯$ŠótùM-]ÎÑ©Ì>§ñÕLfŸé2ÁŒ2ËiÜðôÀAôèa©Ö#öKf{ù$EÌX0Ë̆ð¦K ößCû!ÂÌS@tÀ½¯DkS,<ÔÁ¬l¾a4üE8mT“Ô¼=KL×*à}ƒ/¼e 7öó frzd ó§D ‘É™ÂÎqì3âóŽe·lbñvl2'맬>P0s®3¾úf‚É,†HÐÎO9c—½ž@—•¾{¼o1:„×+¥#ÔÚ¾’©SÌTšÀVÌwGðÿÁ/8¼9ù÷£GXv€…"›ŠŽŽdRˆˆªäkòË‘ÒÃFNƒ@üßÖƒÁ2ê¾=hp >`*ã%Å ~“sÉ8£,‚ýœ¶#’–ø*¸Q–ÖfA‘]©¢$Ë9ñ’¥*cãö(–_æ”VDã fOrÌz½ÌJ„ÿQ±*>X¯b=)ËÀjø–-ZAèmç݈ÕË u¡H,Q­¾nŸ§ñ/ûI§¶H' æ­Ë¹l±J14ܾT-‘„AÑôä–$™oIrÅÂÔéÎÞ´¿7M÷P»°ù'Ùéí`¦ÃV|°ÄÚ-²Ô ʾ´Í†4U¬:r/çˆ,IXæ^¬ äy^œî$DfP ›‘Va ˆlyQæSLp‡—täwʾËõò~‚ÿq”à1D¼­„ 0oò”?øÄ?àûÎËëÃäìݨI"2ժ؃´”å>_áž/eTò¥ß|É2ŠvrBš`Ê¢Í|ǘ-­ fìäHäjWQ¼ç˜xÎÑ"A•ˆž@¸qÛªVïf¬L¬ÉU .´,˜°$±Ð{UÒXìÌ ¼½v¥1Áœ^‹*¤M›ÉËŠÄjq2 ÃwöS¾µ¿SÞVz vö—öõ—¶õ‹¢Ã|±âª„ÓC9ëË@Mèá’цSÕ®'JßW}«#&°]tš€EaŒWr¼[Y²¨Ÿ3è’æ#V¥#rû±ûÿa¶Ìîÿ;ÜüæB¬TÕ»²ÿ¿yû¿ÊÍl€ô° »kmþÏäög«Ñ¢ , åËls®¶(ö?®lVwg ;ݳÒv}wÞnû¬ºÙ¾Úß’Ý¥'ö|Z8‚O5øùsIRVlÀ^Šm[ÖsÖÔ®½3}…}é­ü/妳?áþ?DZ©]½ÿ϶ìmþç>>êõÊÒŸ.nö3njÞ‰%@]Ss›â‚>M]ˆª¬+ÃÜEkÊVE²K¦*u iM‹-Ø•¡~ÌFD³ÃËív–Áˆz*Jee{‚å÷aû& VÚÝÁ €Ú½‚U‹Û¼Œ›Ú¥í|æ×t­ÉksUf·bLkãYmŠ©¹!¦·!jÖ%³ÚtEDç1¿×Àü]T¼õµòÞw:Gz… V•…6”ÍÅʯ ¾· HCЊª±Ð «¢ZÓp‰cU"* J³Uº§°]ä[À×w:à×V™/b܈tÜ$åv+8ƒ2€VI(ª×ˆ`ØŠ`ÞnUs-wA6È@qÍ#·^¥{çò?¿Åqî¡*Î!p ^´bï78‰rÓUDÊ\apÔ ZuÛÍ›®…h¥vMf=B°†Õ;0çEÖú"`­!ÐVŒëBcÛŃjÍÚ¹_ š1õ›‚׆¶+`:7Fh`5FW/Åœãø‚ëÆæê1B Ê>¡Þv Çkn,FhAµÉ;4´]Õ…1BcäØp7¦ŒmJ×k.Š6?®1´¢-ŽVŽ"WŠüVTƒ…ñƒ¿ªC¹Ø´QBJ]¾³s±dlÊj¬.f+úuïÜØv%ÛQ³¼d´ j/#ë :G2”‹šåC¹²¨³«zɈl½‰G#Ä·…âÂëÕçKHż©k·d`ï¶áç-‰žÓˆ^ûÄ#o·úÌH¸õÕ«[aÙ K~ckÓ„Ä%üt@ùîÑ9NE\¢ºî”ÄðVÎZ¶!ÝèJ/ë#v‰C[‘mr&MWAvN$Ê/{­ BO¢éF¡ùÄIB+pSþ\d}1 γ‘&œã·†¦K¸i†Ü¦¦#M¸zËÍFVÃu¾4%±M´>µmϰØc<2HÍ™°Š„Ûä®=ê9¦å†c;´ŒiãTÃðT,¢á”XÞnéÍÀ3+0íÀ÷]Ó-#Ò$ˆÐ`eDÌrÞq»±]‡h¹í·e)îïE_T¾µ6^8…ä—ð®íóýuæV;M ÀM—q¦þÜY¤µô,²Ùö\H¹ñêȶÍ#ó+ƒ*”$”DÝrÁ ¹$Šßv²ù9( |1»Þ’E þm_mº”·u7²jáµáÚ–…ª6]×¶Õ¬ír;\œm`w1ÏŽü–e0Õ …—”_\”¼¶ã1çê/'(^;Aí©ÁRÛeLº¹™iGµ1jh¼,®«ÊOo¡1 ljÀp?tm’ZvɲòÃ!lÂ#›±4­-!@½¥˜"pÝ€µ¡ºŒÝ ×Õ%ȬKCAÆ©í…o¬Ž˜‘Í‹_Vq‚bÂ/[¥Çi Û ÞÔj¸Ô1}¿„jS¨b«8.DB}Ùí<¯ÏùsC•q°Jv«\ úåIM€ùNÔÚõÜ-äWo¯»QÆY,0nã›QþÈ«ÄëÈ6$wšÚ.±ñÄ.+IJ3w«Ãê9­ÃêT1­µÅ¦K j•,O…­^ùRs]}ƒÛ!žI¿¾˜‘ÙxL.Âɇ´$"Ê}åÅ›lH˶™âªò5‘îæÇ$s,Ý^îæ‹CY.0œKGóµØXÉõÜ2›*Ý4 ~› Ú® J#G¥`1ŠN ŠÎí.$ß²ãó`‡¿eǽ²£íÆr•-uxØ7wü[Zn"Ö./g™Õ~š9PÃ'¨QRc@µ©’°G· GsÑÕØ[Ü 0h=4I}Í3Ϫ4Éb-žË2Õ¡uÿªÇ²æ`ô'Ãjž7 #í[3Ò^†‘ö–‘÷ËHܬߨ• OѵhfÃQ‰[kçç}n%îÞËɹù\nRÙÅ\nVÛ.ßZu·\Þ4—{-º\ƒÅ›Ú4»¾!áÖšýÙïGX…í÷µa>ã›Ôû¶ŒoQö:ão­ì[Æßãyþ½QçKûæ{mÑw»éèë*‘ve dñ×F¤7uìu>RÒQ×Ru^7©ùmxݬâ¼^%ßòzC¼§ŽÛt{™ãÌízÝ|¤y¥8ýV ¿ïãÌ·bü}a^RZ~)hUöfX)„ß À €8Kº„w_xXu®‡ßX\¿ªí¿§Ãª+zû: º¤4,öÿ‹¥a^ °±`+ w" ÜÜÔ‚²CѦ–™¸¾Cæ¥êJ;WÖ{¯†©ÛÂgÞ_±ñÂ,£Ú”º©4X·‡œ›Ÿ]nù¼2ŸçÎ-«Ñ¯K\3 ÛHkóÍ+—eµÙŠ{Úb)‹¦w4­(XW›VäÈÕ3Õ¦+#×Ìú¶YåbÖ·+øÍ(·¬ßëçÌ'JdëÅ$Nm' ¬l ­¿£9äÒ¾ y»)ßÐö.f *÷ÛÆ¶.šmWC¯™ÿ­ª¿ÿsTÿŽf[þoù[þ+ïÏîäåïÿkáûßavæUÞÿny†¹}ÿû}|T¡×Ù©†¬¸/Än¸.Dì]Ûµ² ñŒÐÖAÄAÆ÷ y]‡-oë[Ö8ÔA–C°¬®rE†¨Þ×ó«"d‹(‹Èz~qìW¶^¾P!ÓõÚ+Ï«Tù-T‰ c×5ÇI³ F™_¢Œp5ꨧRçר“Ðþ Ü8Q’bmŸÊF;•½ÛPÉu—¦®ïx¦»ˆÊÞJTJè’ÊžJ¥(ô*…íò¼eDj´Ðˆõ!,©á:fÈ D$«¿JÙ]YTüÂÊzeQÅR«(õÒ)_Ê\£µM±M ˆ.ÊQR£—ZU‚`)¦uý”(®%¨‰1ÖH‹îRŒ/^^WÙÛw=êù0fuWuÕZEŠ%ô\W-…HQhU ç©émä¯sÜMb/°-k¡–®DŸžë¡J/³+e‹t´ÑÍ“]/P R`ÙF¸„ìzÁRf©Ave'ªÂ֌ֈ¥]Ö@52xñ’;C³º7ÓÞÈì²[m ÷AÒý*Ëå±)*Ì#]yõFuÌûµÒæ}XéÅo°¬…R÷; ö{5ã2ÖL9»ëe,?cÌ1gÅ9Ø:‰®µÀ^g^†ønõmÃôñˆü#ËWŒ¶@¾ççbçG½&:ƒ:™×)£9eMJë*EA…¢ê ouܬíç‚Ûß"&e/.[Êäß™4Xú;Ð[yW^çnDNÂ]Væ¶®ˆ½Þ¨Fõ½Š£y_âØð^žåw$˜æš‚ÉßóYb›.™’ïÚðÅë9v]' \ŸÖm·ShqȢХ>á Éãr·Ê„“×àÖ[&9ñìP‹ö°·yT)mâÀiJ•-W”¶7}ÔϺ#Á³–¼å^ŠQÅÜòîs w˜ûŸ/æm¯Zøå£íŸ®¯ñòx¬Ìu²ñDÜÞï÷I|Ž>¤ ¿Å—’ýQNÒé¬Cfc@o6þ5œ$ä·t2î(®£î$šÈ“—o6‚Âñ37‚õfªD๥ jÉyVÊSƒ´ÝúöšHkr3½mQm25 ÄõæQgÓùž&*ðï ¨Zó‚ ÝNIÎQ•sì<ÎÑ58—w•ƒ)…žø‰±¹œ«“ÖÂ9…¶¨¶2çÚ©[̹ÿž €ª`ébÎÕãŸfΉU°ÐÅO.5o·8æiâÌøa©|bÏy¤ÃpÎ׳幞 'j£ÇVÙÔDé,bPŽx¯„9U‹]QâÂñ»så½NZÛà«î£…¶²ûh§n±ûˆÇïªb+ŽßYì>BýFι*ç’ÅŽß]ƒsIáøÝ:ç’Âñ{s9W'­…s®Ê¹ÚÊœk§n1çrü{‚ªÇ_¡»‰sõÉD3ç|>lébÇï¯äWÒÂñû*ŸÒÂñûKø•:9-ÜòùhµÐS2rM-ö+©âøýº_IÇïÏcP=¡ÛÌ ¡TÙbÇ¿8‡ÛÄ ¬pü%EÊ Ç,Á †EÂf Ej¡§Ä &‚3(SPgP¦8þ ZzÚ[™çâÔW™ ¯0í¥êœs.£é=Lu[Ã¥§ºTƒÎgtA›ŸÝ¶®<,É SZÎey3ÚV-=£5Õ©æ|5´ùIlƒ¶“Øí$v;‰ÝNbÿ“XWAÎB÷&®­¾ôÄÕUg”󼉠ÍÏUۼIJsUO(ÎewóÓV-=?õÔ‰ã|5´ù)iƒ¶SÒí”t;%½Ã)ie%ÖÌg¨äöŠí¼ôK_‚ýÒ&©_ø²+7ê4rnÞ\Ô¿‡Ùk+çþƳW•Y|f6—Yö̺ÝL¶•YÛ™ìv&»Éþ-–`¿´ií¾ìªú’t±ã÷×ð%·›ï¶rîo<ßU™•-vüÁ̺ÝÜ·•Y»¹oÓd'ÁVþ¼·Î$øKÞ“üÅ-Ô~ÉÛ·‹¶Ÿû¢má,¢¶)}9niŸÔo~ÜÆ­¿í ®Ê­–9}™[í³úÍO‚Û¸µo÷$o`Oò·´û%oCÞ.ó~î˼ª+i™Ò—]Iû¤~ósà6ným×|UnµÌéËÜjŸÕo~\¦oËÿ%ù¯¾ÿÿöãÍ¿cÔ˜ûþWÃs`Ø Ït,‹º&¥j™ÔÛ¾ÿõ>>_¬ùÑõ7ç) ¯gçã ¥˜§d:Îf¿†“”À÷ïÂÄ<ï“ïÃO}]:¾ú4~8Ÿ‘ý§³b¿g¢U‰>‘Óë8ÍÈ›4>/ƆéT?¾¸ ¯±ú”¼NÓD×ÿ•N.‡Óép<Â|pUåêSS^à þEEL† ìÃèz–Vp‚B_´œŒcÐÞÑ,œ! L”…£Oäêzr5ž²Zä×!Pu=#YÊ(9O'iôIÿ0 G³4é’«ÉHK€Îà4ŠÆS† 'q4ž cx|u•†2‘ðâB‡â¡0¬a4ž êY½áT¿*¨VŠ€$ÄçÒ_„ÃËt¢ô7½¾ºOf`Bô¹Ý¢{ìt^¦È<Á1ðÇ ž gÈ è•D)ŽwÂhI>¦zŠö Z\]GÃ_”ˆÎÂáŸÏÆzÎDœ HZðBŽðô*‡Ù0î’_'ÃÙ,ÁàÇ…fÓ·OO^¼!ß ÎžžžŸ‘ãÓSòãñë×Ç/Þ NÎȃ7?×'ß¿þ޼yIÞü08#g/Ÿ½*']}ðâééÛï/¾gÍÏÿu:8ùNmþòy~òúéðóøÛÁéàÍÿãß‘gƒ7/NÎÎú€¼xINþ q8û„^¾†ŠÿƒíoÎ<0xßžÓÁñ·§'䯡Ÿýëäéàø´K/¾¼>yÊš>}ùâìäÕ[lv|J¾;~~ü="ÃaŠŸú?¿9{ }¿ÏÞž¾A:ž½~ùœœ¾‘†0JÿÐy˜Aµ_χé>ÙÇ‹ 2 tº4€KÇûÑé ií!àE³ƒ)ró+òUiÃŒì?8˜>zÄ~ií‚L\§Ð‰ÆEüðǼD|9(BbÔû¯&_b;Ä_ø>0{ÚÁ6%h²Åˆ·B‹)„ËG‰¡ÀŠüþ;’'ðÝøŠ<|Høóà+Þ/(40"Ãýé#Ê;*õ¤iàßh’†¿°£pôO­‰]ŽÄt‡£ ÁtÉÎÞÅÍN—<<…(ï7šeû;ïF"Pß›B6¸¥rÒë=!ø¾°]ñnu Æ Þ Û?c\Ïžü¡Œ,²|Q7l ¸E\~ˆBƒüPT€Á›à¼‚JÖ‚Ï2`< +•í¯”ö[ÓÊç;Ž: ´€BÎø> sÁî Xª¥Ä°'ü0IÓ€üNÎR†ì!'sÆ^¼÷Ô~2†%íd´£HïºÒ b½ÌŒ0¢öéRÑ8'¢Ü÷iy;´¨Þúœ5¥Ñã~B¶Niœ:MCÓ22r`þ ׫ÓX¤°6Ýëûùb”åø m ß’ƒÂL@o¹à¡°³ QÄxÌ Ê¸ Êí>æC!±õ÷9c–è’w;{Ów ´!)Çj,lPJþÉŒ*Iö7£ë‹‹';¹Ô>`zЩZŠÒÐ(³ñ½¤»“ûlU²ƒ“ï2öÊÜ]âÝ/ó~˜SÌx^JÀ Ñ/”¥ª-cŸkAz1Mç¶`„g\’˜CûCÿ|ø¯ä¤Ýx hAþÇò>ŸAþg›úÙ¦~¶©Ÿmêg©ÏçžúY6] &’áä'=òÈŽ’ˆhqGä`ðk5ýÂã©jòe‡üq$’»Ã,I3ò_ÿ|ž†I:™êå‰2KVLŽÓ#}— y%VÜ•Å(†H;Ä– 1?0¬Ì‡ù$ ¦Ð†˜@›32 ™·=µχ§LJ“œ_Cn8‡l&°¿7íÈ9ßG‰2è‘J^E3t #M8”Éû*@¶ E'á~&y«§1³q{É!ŒÖ˜9‘Kd9†E¢ þãƒÿð¼G1Él¥JV9MA´¡¿Éœ!«®ÂÉéB8‚– Aÿ•øï2ü%͆éÆcŒùñÅëAÅl›Ú–azƶilã¿ûøì’õ#À]R꺯‰n ívISp· Ï×ïvÉ:Þ.Y7ÆÛ%«Fy»dÍ8o—¬éí’Õb½]²V´§ÒÞg’°^È·KÖúĺaß.Y=ðÛ%ë†~Œ‚u‚?ÐÓõ¿]R ‘³ˆûgoŸ=ü÷ÉÙ!éǤ?ÖŸ>çÇúÓg§Çߟá.žõûú1|ï÷¿æë9!´ŒûãC]ûÇþS°T½˜ÀÖ¤CþqÐuTø$l¹—ð’„ÿÃþ²2äû{sÊÿQjM‡¢|aÿèz‚w5'³þ˜üã~Bwɬ“w?Æžø#]tøXÀ€&yB†·fö­…·-Št÷cZZ’CKjÐ -‘Ð$°fX9¨$ HÀÉœ¬N&ádU8™€# ôWΫF8¯$œWU8¯Q ß87pn$œ›*œçFÂ9•€N›!æ Nk°N%0QÄ·‚]%ÉÙD•(¿b”dù…•Ç}¥š“J͉R3(Ù¢^2È« J€à \±R«åš¡H¢JŸŠôXí°Y`§ÃBd§ÃºÐBGj±žë£¢VÊP(ˆ7«›èoÐÐß è//Ã<“ë^RóÅ„%¾ª d#¥¬ä Öé(…¹+ÄñÄ——àÓ§Ü©'éN€qs_DÁb"VµÐ¥©ðÂד˜Ï’|öÅ´OÈ #ŸÆ×ä—ÑøWp÷àŠq¦7I¡+ò o‚Gëƒ_XqsʾB<‡ñ óùx’^¤!4!Pj`x€_(Ái†Âñg“Ø«1Ÿµ0@¬bÈŸCøÒe9VF jˆ³BN ù·#†-£ØëC«J \ša$·’‹øÆï±†ÏŸºðÃèðHéƒÂ±†nÿßu˜ôÁô0ôùÀðA9T•Y8n˜b]ë-ýtÂì’ô²J­1pü$ç%LÖ€À’_‡!gÀ+\¿À@5a¼¾Àð–-B:LòI« ø0!ºvù Ã+Lt-Æ`ŠGã©ü—mý¯¡»'¿…WÄ|òBµË+è‰Lðñï¿“Ëì€ùZáø$¿‘P«Pm0e€p;Œé° /bp’Ep’v8‰„ƒ¢3ÄÀ9‰ fÃ0“WG ID¼‰üò;y§k0€;ÿøÇp‡ EÞëÑ;Þ/”´t+Jú(E¤-Ð-ò«åÆ€<|rFªOgh0öVŠPhsöÏÆ×ñ¹ nn¦¸sèõÉñwÏO„+Ž¥™¥¹Iñ/ü›Œ cc¿ªÿ(9ÕSIœâ²K”Í¥ã.8ΕPx÷¸òšŒ|À„Àå2“3ü×+!ÖügÆþ€f»˜òÂ6 »ôŠ=âÖE&Ypô®/™ù øÍ`` ˜àð‰øAžàÊ9ÂPÔÎ § Åo ÙŠ¦‚=øÉ ï=¾HÃÑ¡´FýŸÂñ{´LüÊê_+à³LK&ç•”Ò›dL`¶üÿÌù¯äÿäðl<Ç´`ý×pLƒ­ÿZ†eض‰ù?‡n×ïå31t|Ã{Íž^gGØñä3;þŒ‡jÙÉZ<ŸÊ©â©Dv4O¼±coxZ†™Ác(ì4΄ÞLó`Z›‡ùÖÅoVÆé¿áR<ÿcÞQên÷ÜãGî3>»N’tôó[˜&M2˜([¡Õ ý޾Õÿ/\ÿ7oë¿YчîVÿïãs+ýg`«ÿ_²þó¹Öfelëÿ?ßÏ-ôWvô­þÙúoX ÿ®I¾ÿDŽٿe°ù¿kmõÿ>>òþïíÑÿíþïíþïíþïÛìýù¬÷Ë£ÿÜ™ö‰|øRœàï®!¨ßdxuGrC>±cøøÒ7y>ž~ǧx|îlBo<ÈŒƒgG÷Izz3“[›ywØÏöBüV­§âŸŽ/¯.NP¼t2O¦Õ“ïó÷­«ÏE~ô]lfÇMá? yôH'³OW)n>¿¡òãp±”žàVj¶¶~ÊΘkÚäíQ Šæ5N§Ó}¾óÞÅã7ì!ûx\|Áƒ„³r’úÛ0¹ø„^ï2œ¡±áØKÐBïMó-ñ|¼ØØó…#Þ{ù¼;žvŒúI¾áGªkäûø#ÀâGã=bÁ1È”=¤ùÃü¸£ì ßï®âuH` ž'…ÿ ñOšÐîÑ}WvÙ%r|DÇ9 Å ÍÛ¯¼e…'œ|ˆåAˆøñ‘I¡È\Ôð}ÝBâPÙã#Ök”:,ÅÓÐPg%0J€‰1üCñ÷YÀv§÷Ï!r™PEÐÛ.Ùy; ?¤x`Ÿü„ó þ·ßï¿CÁ†¼›à1k“„³íªÙŸv˜£Þ4Å÷`à [ÄMsË„w³¤b”Ô²['µa‹‘*ª4š* …]-j2‰ø–¡²m•}ƒÑíKé@¨Ç: ~¬C×@5|%È%Šžr G½X fµë>‰(Ôþ·<\sQ~ÌßOñ#žì§¤¶ïˆƒâËèØMÌ$/²Èùý ¾0A×X©4u;ÌðŽžìÈ—g@qš…[4IqáËßrðôø*¡!˜HYAÀ ÈS4\üåY|î¾üùG~Fš7c˜š¢jUàž†#Œ±7a&ä«6Ôƒ1xØx6"D ÞxÍ‘<4BÜ¡Ÿßù(ä‘”˜)Ý–ÿ÷ÎÿêüÿêÏÍÿ;¶Ëóÿ޽ÿßÇçù¿+žÿßêÿ—¬ÿ“ÏdýÏÙ¾ÿó^>·ÐÿÉVÿ¿hý¿«í õ߃‡¸ÿÏt-ϰØþ?ËÞêÿ½|hßÄ¥.ÓJ™ÿÒ_lÇõü@~uü ¨òÈ’u-µn¥i¥Ô U˜¥‡Mßx'–áæ½åßš±…ºžŠqOù½hM› zsJL(IqS‹zÐ7L'ð¨ï–i£C=¯þÜ÷ Ëv¡‰m8¾,UËçµÌ¾i:†gùŽï ã¤6"èן[üù­ôŸn\Æé¿mƒÏ·=Ó4Lj¹6;ÿ¿}ÿ÷ý|P¦MÂÕêÐ_PÓó§ìG^ÒSKzJ ׇ¼LüTJ…QkÈGe¥>”G¬oÇ‹ÅwµôRI­ïjÏNµ_'ïõï¤ÿÖÆel¾þ›že±÷ÿÛàû]Ïbïÿ‡`«ÿ÷ñÙåËUyÌ,_&“̺O†e÷Ù¾½ù”¤—áè«)¹OÅ+'Æ1]ò,&×áä¾üÃÅ¥ù"ø~8‰ÏáÏpv~™Î†q_׃Ô'®yY„`ï5ßr}Ã4SDØðÍÌB/rO£‰iDëȼKµ üÄK5ËŒR× \Ý…¦£YaêY.µÈw­$uMl@¡MÃÌKD‹,/ÂЂÃôÍ‹iEŽ­yð MßÑÔÀ¾AgÂ,N3Í¡™‘EN*m¾~¥ÀCŲ4ŠWmT³hl»™!$ꘚ“…õRGK3+Œ,Óc€­Bfk1(whX™nb f¥É°©fš‰ãxôD õüGЦF}Ë´²ÌÐÜ4 }Û ql ÛÒì_"øZºIfÄ6’Øziâ9v hÇ è[-À80$&Lþ¬8е 0¼,‰}ÝG„[sý ¡1 ˜D^b$aªƒ©2@Oaôb#òâHs8l„(C#ÍŠ]×ˆšŸº¾…®nyˆš ¨%†ewÓ84B˜zêž-KÒJ‰KZ¸E1<ð-ÍÍL7)Œ%s<¾FYA˜j40‚Ø¢‘`‰eƒ3½ÈL5;3)^0¢{s43B'‰ ­ؾéSÝGùòPÌÄrc-³ýÔ £D÷-À Xfƒ1õ`xµ¦%©å€¡G:-W³üÈ ü8Ö’ØÓ愈™dhÌØnˆPß5ƒ4su©n,#'JµÔñ<×JAŽ-dS³¢(‰ +Òü,ñ ꆀ tª9)H9È„fÚ V 2ãÕ£>HAeà&LÀß¶c€¥Ò ³"Ó7=¨f)E£ƒÏBÞúyQ•wèC@n`¸,‹}ªE±d†龉h@‘ãD¤ÑPó‚8Ihè]ÁhˆrêFô9KíÈq@€°ôîâÉ.ÏN4?ò½PÔM6´>hƒIÝØ2€ÇvF6¨Ïyšë9ŽéÂ01‡˜n¨)ž«¹6hæ%ZægŽgEžî¶(rŒJ‘‡RdÚ¶–ÀøÅi¨YàEmìk£9° ̓ø3q?lu °8 ?0˵C/ ,0>VæùYìꦃãÙžÊ|DCd9 11Eeµ´0±ÝÜ·ŽžuÚ%i%4žF4ñ<_·À`J†Ù†á›”d™Ue¦ea8@™å84µØ¡¶†‘N]O`‘Y)‚¦,Ôp™À› Ê” "i& ¼0AÞ<ËôíìZf‡¡‘%èb M´±™h`¯œ(€™Œ12 IiBà²fƒ/a®™JˆãàD¶mG ¡›EVé.à$ËâJ™åxˆ‹k¡\»&„ZìÒĦa¨{@Š,s*e’Ð3³ J5'qì$ðb¦¸ÐFÎŽ?Óâ¢48Ô÷‘{àî^b‚­HbÏMB[·p:ÊA} œEšAø§eN’Ú±\A „û@û`‚*†€³ç§>&ˆ›,tª…–ï1Æ`0cPkPׇaH¢ ú ,_F•BÛ…MІ¸É‰`(¬,J2 F<°™RÍŽ<}0va☡ Ê#üŠx`e 3³løÈHR Ø°3†ø¡AwÁF¢›´a€ÂȈ3ÓR _f<›Íœ°2Œ+…® ø0‹|¬È·Áé~`zÌ&Q”Ç*£fD˜vMmp¨4 A ÝñËB‡ž(Õ0SI°G™–ÓñmÊü”  f(p=°ÁÆ JÌÄA€\ÛFL!]u©IÑû ¼H„—ùØdÓDñ㥴R ýBôn¤~ò¢E²§€;x'æÖ èŽF¦ È›~Ä œ ÏÀ~MŠÑ@’„ÆÔ ü$EÐ&Ò‹®*ȘDø™‰¾ †Ñc¼ƒA§çø ¬±¢Aìa³ÙòǶ»¶¦ï"ƒa¥Ð3ØlÓ0"pÂ`uM”R`0Ø'>hI@³‘- X”R }¾c…à®}p¯†Å ü0M DN*Ã"÷nÚ µÈÔà»–ÑØ A‚À4Øèü@YAþíÈ0Rã¸ÈÊ`ðuß7--óíÄN 3&ˆÿwˆOL@ËgŽÎôùA•ùÔÍ’ÐD=û ÚjQ;Þ™nêøY¦…¶ŸÙBLBÁâ¡Ù+™¦Vg B@’Á' –Î4¥I¥,¡iZhLŒe#òœdY‚õ h° øoÅ™ïC°¤%–N˜¸û–á 5Af\0̧F aè.æO™v0¶q;Óg·Æè6Tö±oꀗüÿí}mwܶµîùÊù¬³ÒZ‰¤¯$“*纎Úè^ÙnmçtÕæzñÕžUYÒÕKꜶÿý>œqH€Ã‘4c'´‘%H{?ØûÙ Àr Z—c¬‚§"J„óOà2øüë¢ó5nÖÂÐ1Ô š’WRÁ“2^‚G„l*RÆ›*˜]®ê¨”Dìyó *N#‡ Ú¯bÔ¢À ™1¸5ãš ¯c|w¾†åeP¦aÏ0¢…\ÖµP 8Ù;ž¿…³]†k‚Cæ°±hcIQX&!y~ð§€|G^ÄðCE/0Î`šUÚäˆÀ t EÄQÈ„'(^d¨tDԇ×e¢¾X&Ÿ€ê*ÊÄs‹X &=H5ìk*aAÐ9˜%òÆ ”R¦)h:O“œ×äÓ5¼ ¬i,4m0ŸÔÓ¬‰†rò*éì{Õý¾Ý°_`#TX²¤P°œh%4q1/À:ÒMç†QŒÆ$À-DP¤p¦%GðÇ!éD>Œ°Q‚q¢®ºB,~Eü‰Ç‘1‘Ha½Á `,o¯ð9 [Ë$"w²%Ie"(A8*˜˜RAq®¦ñcŒ`L ¿A…1øá5Áþ*=ëR@“°»ˆÝà+(Ü‚_V(’ aRK‡ºL`«²Îê £0"„À©AJÒA Æ0>FÎ3Ç\Teš.(¢Ô1ø&£l¼0ðY $>8è'®‚¡4óYÞÁh2#0Á3QQ!"Êk™ÖÄ IÑä)Úà !× Ì(ÕÔÌá¹aJ€…Å xÃ‹Äø…×1Š¢4£i 4êu r¥’ªš—I ÈcD#µÔLàéäX¸]¢`ràIÔÌÔÇi3‰€%A_r°+PfŠP…xžM(âEH-Œ·€±ß›/$ôYÓáC¹A ÅM¬Ô©ªa´‹$)eÒ¦H ô2NBɆÌ-%ð €…ŒYqÊNBF`ˆ4 mÄ} `bEYA戜¥ÖMø())*†oÀ›`‘sYÀF݃ʸzFa bÏF'H((+ŠÒ`þiÏh4´ÈaY•1è@FøÝë4ÄVS'a|bP‚ˆˆBf§!Ø´‰;QDf°¦9BÒ˜•¼¨%(5x(à“9¤8桺.È® „·KJÁÕ8z^$íÁ·—äÆSv‹r4…Öy‰0´`掎,ŸLa9UEpÖIIìÀ3ˆ¹ r©Ìðþ¤)…e5†~†hLBïSP— hà”¥Èöˆj¡Z]N ;ŠrnrŽðj¦ °ºDpL9,@ .¢¢‘ ¬1OPŒm]"voPDX¡mi†¢ ~”±4ÈD]—9Š@9äÜ¥1õ€ "^g:H3(XS&EÔðý”Ð c[i˜€ªâéV\Á7J`´‰´ÒLÁ¯à©ð:…Š” –›2JZ1ò“ËZ80à'LÄST |-œ¦Œª¬LA(R`žÁ8i6Ž”­A¼‡(YDdMÐax/0}ê“V 1€ ߉ö"€!‚ ¿=AQdr0Æy‚È^eQ€(»@è“@Õ.zÝ‘&9AÏèì{pT)p§ÑŒ3ò¤ÔT ¨Å}‘¨+Ü CÏ)$$)Ga$ §Òº Qj„„ 6Ž‚c+¢¶‘Æf3ˆá_‚’, Òh·mÐ̆I9•yÁàƒï ˜QÉ&:šÈ5k>"#¸àW3‰0ðׄBhrJÞrãÉ2ØÈ@p¤•FU(pxL •Q‚]MrÐ H™ÒJk4\Éz^FtÊİK]÷5Æ J‡´£" È#µ8!Ç=ºàw2ÑA¬6œC’‚;ìÀVÂvt, Z û ×CY7ÊÈc)‡öœD.)UC„  0XLD>ÍrJs±”'å£ãx ¨ñÖÆ$U’Åa ÕyMÁ?5ÍiFí#ÏÌÄã‘b;8Dë”ÙI,® ¯SL ÍÔ¨½–iÃ÷‚·£çŠF1Ùj°h^çÑ4FNÍ3’ QƒÈ Ãi:/$;…â„G%dWˆëÃ^Á/À @ŠA Î_f±B»!G…Æ!Ô™ñbå<É` D¥ %݈ð££h…2€t‰ Ö‚þÀÍ0÷˜Ò”1ªStü3éCø­Iú“!NÄM8ä®HÏXºЖ*!€PÅ î@KG8 [*ƒ1”” Û‘H-œ4%%A™‰±"Šª`€€=àÏ’V¸M¸EÈ™@‹²°|u–‚ Õp1L ÀF "mf×àŠ""§ÔGÁ¢64HÃi Œî’12g|B, Á)jd”u‰ˆ$kŒ/xJN—" ˜#G”5ÄAÞuÜAýƒßá­aîÅ,â.3U€¾²¬@öÑ=Ei žŽ4YE¡±(ÊÎñT ƦƒèPÆ[ iÜ%øBMÔ C£H5©ŒÁFE Ö¨whJÉN)‘’WH9X8 1³ˆ¨FR©NctBarAD!y-‚„¥Pg°(ÜSŒu(ÚØA¹¦´ªò A4†FœÕ²ÀÏhŒ2°4c@P7¥À™u×iEÏ"šEn4{Ð2Íy¦‚BR<)ÁÕÀÈãv_’‹¦ÌÈ$€#øEPš z“²Áàát)€aEQÅSaeOê‚(4Æ-SÂÑx7ÙtJUÁ;Q’ý`˜7ÀœÖ µ+††DžäˆöiÆ ÑÏ& ÂžÇ’ÄÌßÄ$ò¬SŠR"vaÄX)‹ÖøLò2F¸•$5PÑ” P˜EM#´‚§ƒ·r8ñ¸†fÔ? Æ@Äð;x60d¦êÀ$¯*D“«S;!iBžÓ4µ$D‚ÏŠ±N1 B ºÇ„?”´P”ØC Ñ•œ¨j‚ð×Ò<,Ãø(ê"ÈÀ¾®Pä4=ö,ðÓ\Ew:Hd‘À† 0!IdÂd5¥èÒN1šˆ‹¥©š\;èh…ª)U§ÃÅפõH L“¦ƒdwàˆ˜…{OM×D¯Jwˆ^bU€Q"ÈdÛI”.`óbY§˜BÓñ?ð1H’nƒµºƒ5†áO‚a(þnŠ•b0ÎÑÓ„¨XÍf§@5–qdi8+eP4€tF“ Ó ž¦ ÂÇR‘ ¿1â†T°¢Xœ'h\L–*†õŒ…¡Éˆ?ÒTê –)HX]ÁaC¤â§©É{2JšÁTMcJlé­#HF"D¥à޳rºS±iL‘4˜9$ȉc%0 ”JÌ0Áª« fö ¦[NÆ ˜rU§œLâZÐB“›& ˜WªÖÑi©ÀË"Â’‹Ñ_XPM†2> TY% o !?ü xÜ ø …ô<ž%,GÔ &ûE±É!‚t£r1iè´¤@;-ë¬ÔÀMœ!jT)Å›YIš(KNã7`9xiU(øE"~01Ñ]•΢–ñ¹&ϦbÀ†±]²2Lb1·¬ Y]¨¡®«VG yÊ'(Š$È£Y1#¸ìZÕàÏDáׂ.XBØãÙàÚ먎Kc€:®c0 Šday´Éa§³iŸ´„Ýà„Äy\qJ2 ð¹$^Ù$»iÞ~Z¦¬w-£—òøhÀàÓ¤™÷U1p £ÀÛ((—IÉoŒv~Pbmd¶@Œ9‡Áy˜•”æn¨¤j 䯂`0Z8ˆ‘T€Ó€>k0<8 >Ѱ ̪fQü7þ„ÅD@a°ƒ1§!gpÔ2(«ñ žÈè(:btZšÙ ($¾S0%¦‰jã©)½VÀ ð²*2Vä°†èü!œˆÓÆ@pЄרAšágAÎÉ–3r^ Ц™G€ÅätV4-›#ô-I‹”´-iÃÉË9rÓrÊšEÄ«àú0ÊLí ¥ÑuVÖ°uFi¨ˆ&zk¡(ŽEM€¦ kÀ.£å<¬Öi]S\lb (‘ŽóœÍ–ºJDÚ±‰]`1(÷,ÔlCp¹$-pFšß ËשÈë¬t^ÀÆÆ¹CîQHå ÿðãE&Àä1 8™ +E³y’fp)u¡KFÓˆÏëHÕdHD…¡@Ô:Oi:·)É;%5,+”™"cä ›E£9n¯ò" »’dˆX¡HøtF£>&Jš©ãý"ÐpPЂNÅŠ¡õ”&Daaœâ3Ã[ JŠóº¦9è²F `Çt £Vä’P5bqI˜)ÍÀ­ƒ(õN CЕd9ÝRPTB™´.4*…XÑâ¬ù‰N)™kDW²’“ØdÒ1ŠàCà'ZƒÒäÈçÆ±ÊÔf€üJ`(˜È„_=K<×”ÁE@–ƒ žá© þ"<('ê‰Y¸(PaTE©PW]ºÚ ÉŒ« `ÈÁ¸Áݤ ¼¾„§§DiBk'ÈM¡„Æ@.`L*•C®)ÂFMØѨÁ.àšADüÜF N‹ðµb´Ž‰²Sõ)Y°fib¹¸€e‚Ùq¤™c²%EÆc ¿[eyF™sk8Ú|Bî‚–y J)bD%”Znð';øK(Ô"V¯IPʈX ¸0­˜2i¬*²˜y+J/R(¥©³ù7XYDÀ)‚F¨£¬À®‰ˆ%”ž‰J%͹ïÁ‚ÌãiZÓ 5h­p¢u|P.>ž—,¢¥"”ó‘sÐo¸lM„ æVÇb–h¤L¦Êë CwyS-5ËÀTYlÜ'Å0‚¬Bª¦ô+xfd¾M²ÔŸÒe4É(fIÅ¢Ž@­Ñã;…ÀŒŽq©>dïÍÒÚ³š¶ª¹¤}%.ÎÊë¢*Íy¸Qì†õôCó7£QAL/.¯hç)þI*|ü.;™í ô>;91'vT§´‡ÇÉ΄ïKzs æ„ÖdÀ#ÒA#˜˜itF1†2áÐÛÛ—×ïá³d˜ÿt5Û°°yeú2bB{…9mx~†0ºÓ2ŽÂ a ýûËÉÛ7ê÷W£ðíôÇ›g}>¢ºÍOûÐzðî¬fÚ>pV|R™w­] *ÀƘmQõa2iwÚ¼ÔÚëxbé8[î7Å!h\R^;äeÆB8½¨×ñd©ãTŸ¥ó¬Ý÷¤Ó÷ƒp¸ {£»wu—as"TÏÃ\di˜Èš¯êÞ½ñP'jkiÐ]"rööFoO, ß*Ò¡âL†ˆå¢°ÌÏtE0ÚLM¥+a<¿«‡ã^ª dw §æ/i÷EaÉV@kž†y)Dˆ ;Ì3 ž™ì bVí*X³î˜^…kzÍüV¸–´¥H ßÂ{Ë0.+PÇl娷Áµ³¶…B‡J¸qmÞŸ¿å¸Nó°ˆS 4Ætàa¢B%«|帾Uÿµµí.±j\Û­›ÐVó&_„µ(uX Õ·n}DÏê])Œ¤Ý•vŒœµÀjYØ1R¤˰f©ÙÔ¯3š)ŒȰ ÃQkö«ÄÑÚΡ'n3þ}¡,Z†6){Bá6ãSýJÑð•nà¦n—X*1^4Ö}5úLï“—Üž¸Ìî"·s2¢ŽCzk5Ì*‡xPfºT=i¤='£oãe\ÕÝx™Ã^Æ"t w* lz4,xU†¬ÈãPÔ|¥öìXfNiöêd +J8%`s1£$—I˜æi"ÿ—²@…¬O4z°:—•°W—¶$°¢„ ¼+mt;—‡I‘àeˆËX‡UÜ LÙ¼+LB|÷ꬶmœ%屨=©/5E3ÄĪ,09Œ±ÐéÌk^-e3öjÛ&ÂYÂó{àf­¾xƤ’¤¨â05BžÁwåèFšD}ŽÊm£¨ÕŒ'¶Ò¼rÛx²6 o§á#e´g’mdõ.‹Ã,U"ä1ËBUB_iVöGÖ*!í’mŒY´ÇØp‰ÑBâ·R^ʰN+²vB Zi·¾øí„do@²ä©KX„TÍÑö3;9ôNÈ´hásiÉì´dQ}iÍѲ¡íP:ÇìÕkûUÒVpY +e¡@WŠZõ¯ÛGm+µÖWšµ*Y·Fÿp~¿]»õQ-F }†5YéÖ¢Žû¨ a8Z°ÓÂ2ð­ÕëöÀ.1B@ÖmÑzâñ(¢3“’ÍÿúRÒn)Q3\‚Zvµó¦, j©â¶|º_Øë¸}àÆ‰Å‚¢ˆe?v±ôÑ]>½¯ûRríƒ7ntY(+»‘‹ìÏ´F•£æÕ¼Ì6ª:Õ¶©jï;\\ÿÝZQOO%ÌÜ:wˆ½ú¶`œ%–ôòìú´¤zÞŸ•ÕÍîvûûûtšËéÛùöv,||ZeÕåÕí^…¯Îþ‘]”áÿTg;-žba$£dJmLŠÇÒ¾LY‹Diï³zàÙ™¿­îeæï(aGÜžU6.ÂÕ²$òÑ’à Iì…$(ÎÊ[AЪVîzLPG:?†1Á;Ñ ½„IŒÆÄ(I,abœ(Fa¢_yÖÁÄ@ &,L}4&2­u¨—~ô$!Z°2õxl-ÀQ €‘Šcº-Ûú·õ›«Úî×w´=P¦mymçBˆP,ýÔ¶¼­¶m-kÛQ©mK·Gk{L·—´më÷(m÷k’m”°i[Ô¶EÙ…›w·u¬VÅÞ]ÄÞ{ÖÛô”ZÔ4Ðà%íØZœÞ6[°o™=žŠ1Ü¢íQÕýyT[ÝËCÌQÂ9Ä,’=ÄFIbÉ£ŽÅ(Ú¯¼Ë²JØ0a‹wÇb¢\—eéûÄ­îeL8J81a‘ÄhLŒ’Ä&Ɖb&ú•wYÖ@ &,!îhLTk²¬ÕÁ¬¶Š–à(ဥۣ0¦ÛK–ÝÖïQ~·_S—e ”°iÛ2í6ZÛõš,kõ›CÛ¶Š–µí(áÔ¶m¹ÎXméö’¶mý¥í~M]–5Pâ›NІ²6­$ÎúëÂ`["`5«çŠî;=ãä|#Ó3’JÏô»½„[¿7›‹qNHßAÛ¶HÛ|뉧¶G&^¬ÚÓí%mÛú½Ù,‹KÛ>Ëâ³,>Ëâ³,>˲Á,‹ÕWÚ‚÷!Y¯^ð{ß)§žF¦T¬¾rL·—4fë÷fó'._92bÕ¶-,Òöˆõ÷œ,qj{d²Äªí1Ý^Ò¶­ß›ÍŒ¸´í3#>3â3#23ÒYˉ’/Nëééôê'Ÿñ«W|ÆÄ/UY+‰b€-‚œXQ÷c3 ›Í«81áó*kÀÔ@ÞnjqÀ§Z|ªÅ§Z¶žjñ«WxöÅ/U€-0èd“ûs²·ÎÑ81ás4kÀ– @z¸uÚÆ Ÿ¶±¥mlyÊ߈Åõ½;äoü I|Å‹ûÈ/‚yˆ‹`¬Ú•¶Z¢–ãòV›Í߸à×Ŭ €Qi«%ŒË[m6ã€Ïß|"ùÿBÒ_=ãß>ò jâ‚«¶G¥­–œì¸¼Õfó7.ø56k`TÚj ãòV›Íß,‹â—­ÿÎù/lgŒDCç¿°ˆÎã iÏ särÌÍù/Œùó_¶ñÙÜù/çÓÓ«úñ£Ï÷9;~ûh±ß+*êñþvÁ;-æ€ZÀ{ôŠuSOŽ;mmZ[µóe\‚µ´í—qI}=Ʀþín>í€TÓ”¬†nïëNÎo_µõn_Úw;øf`àζG½ùô½ØæÉ9¸iJÒ7ïŽàá[—{1éM¬ãÈMƒùç| Ï:Úlæ¼ås{ºiÊe÷÷´žßîÐ8ñg=Yï­–õ=Ÿä”õžX2žC·÷eÏo_e<7pºÐ*ûÙ6Z‰Õ]må<"‡Ml^kðî¶RcÖ&N2ZGðv¨oçì#‡ä­¾=½ ä7wŠÁjæÀnúýQÏ<8p5ÊÅ!VÜšFk ±S™>®:Ö9ÃiëêØÀ©OëE)tÔ¶ŠrÆ)¦17¼fðþ¾¯U‹û‡‰Í}2µV‚¡iÀ–Ï¥r\5¹ÁöàýÎάÃïÿL«una6>Ë•Üis#ðÁûñyO*ﱉãºÖãîtl×Ç:áËIßM£ÚÆ|åý-ÉØâþAñoêt°aù«>_#ÿ(v0ب¶m_y›ÅßÜïiü'È·qØÙxñ7}üÓÑìj˜7¯e‹Ö¹ùîx®Úúh¨Ùú¹÷£ØcÖ¼–uZçþE÷ÖÕÉýã¶Î1õôsßMóÚÔtûÓ¥»·pbœKît\ÜÏû89wϨª-6w¦û=NJ²†-¿æ¾{Öb§ì¶t$CžýÚA:uÓ‚|ŠÝA¿q2MuÜ4®e3ÇßßêÜx}lð¼±J¡&(‡R¶uhžEœ­fµÕ±ú6&øâ6;¹Ûæ{Q ·?£Ï&×8Mô€:†oîérëçû9ôÐ?ÊÎÄÕ¦æt$àÁ`£ÚÁæÊûàÅ9_Üg [:Np¬üùíä¿-òäv=Œ¾_ÀE8Ôñé^è¤á–÷„-|‹o¸µœ)pÝÊziÊfÝß]ßE½½œCÒö­å,¢ÞæntF‰­xÏùÀÙ¥¡ óžß€vÂÚòös?ìÙæûÒ®Fu`Ž[y_Iïn`Ó<7¬Ç‰z›{ìhº$¶âííg—`}ßïu»“&ý†mñ-ðW –1ìºÕ²êy€ço`“?7†GÉus{йijâmógû{ßï¡;+ú ësýµ~àjÁ2`]·ö_$šuØÀ¦„nÀŽ’ëæö04 s‰gÅÛñÎöö~Þ›wÂTýü^©wc£ß™ŸÑëönõ³"PÙðËù®F-×­ÚA»ïú:ÿè4JÔÛÜÐÑØ —ÄVlpàìÒ¬ï{'¬-¬T6¼åÀ«Q˰vÝ;h÷]7)½ï¤ÖãD½Ím* 4][±³K°¾ï­œ°Žû ÛâF ®,cØukoƒÊ}ï“éÆð(¹nn[M:—xVlØpàlÿ`ïûU~'`“~Æ•{}ñÿÀÕ‚eÀºníïŰ"P¹ï}=Ý€%×Ímj@çÏŠ &œíïöÓ? ×)µ±ª­ ³¡lÿ]“½óè@ZtŒ\7·QéÆRûwÜÜtôá4îh¿Sý½j6v”͆òøw=üfôN©9Ð1rÝÜÆªKÚok3VŸ´÷Iû…x|ÒÞ'í}ÒÞ'íÖIûÑg¹³›}´ ÷z"Ò†2ôw=Ciô†»©Ì1rÝÜþ¼KÇßqOßÑg2¹ó–ýN ÷z‚Ó†rïw=óiôÁyË1rÝÜ~ÂK´okbŸh÷‰ö…x|¢Ý'Ú}¢ýS>ZÝgÛýÚúOtm½OÀ÷ x¿Þvï†Ò>àÞâìwjÅA­ãŽûÔÒôNXû4ýGNÓ[1lK½:1lMåbxÜÉhŸZæÞ‰aŸ¹÷™{Ÿ¹÷™û­eîýÚúu’ùw\[ï“ùýÆßC2ß/¤·Ý»¡…ôV Ûr¶îti¿S+•q'ó}j)'¬}Êÿ#§ü­¶¥q¶¦…1<îpÁOmÀ‰a? ð‘fliš‹ë{w˜ð»ïlk÷¿SëñýV;ÛÚjÇ/Ñ÷KôVKô­€]c–Å•wŽÇͳ|zÓ. ûUûsÕ¾Ãk̲¸òîÃ7ÏòéM¸0ì§~ÞÓ~÷mí¾ã×öojm¿ßjg[[íøåþ~¹ÿÏj¹¿°k̲¸òîÃ$oÜ<˧7à°àc¾`Åð³,®¼û0†Çͳ|zÓËÒ~ú[^e¿ÅmW¿ýp¼výÇýÐ-eHÿ2©Ì¿oþ¦¯„ˆEi+Åc)ã0b"Öì?ÂM´¥÷¹¾¼Ê.ДòýÛ媋¡ï›Î„‹&ŸöÉmsHcÊ6skúœ–q”‰2éG”jvìàfTßM8v°Þ¾QpUÖa·öötBÞãÎ ¾_ÞœàÛõßÞiif&,•ªê4ÊB^fŒ¼l_#y¿lÉ{lÏDtäíÅîÝŽìïˆå,bÓ:°wq^¯9®wUOö=qº°£Æ–Fezì¹#‰åóQ[²`¶RÝÀ®`žèøPVÕQ™×º/ f;õt5À™ý°Sk­Êñ^ˆ¡1; ׎tûÑÉ.¨kžæ%|ˆ*Š<³!É®HfU¯|ï䕈ÿRÜñ2Òfî)¬´(ŒË¼H¸ÌV]q+ÄÔ¸P°³L¾ñt”ЭÇ~š›:‹8•ÂÓ%JÉ*_=öo'‰[Pw”)F}‡-uJøÙI…„'IÀœJ] e1†}°Ï*_-Ë©ß5[Œb§Ì8£èÊHÁÌu’(V³´ ˪(²¤.F f `¬‚qÖlAL§L9J0ýsµ[â}°ö²u¦c§Í©Ó=ñŒ>-Û%$ÇqÙŽú<ȬLµ¦l¿Ùˆä''8¹eÁU"Ò·õQ¢Ž›¡ ‘k„xXéRõå’ö|”¾•“rWyã¤\ez !‹“²É"CÊŠH7¤deÁ«2dE‹š¯–ÅžCË”,íÃÂUe+ñ;ЬUd]X=Ô(YäeÒ`1O“BÄ,L¤,DÍ,Ü¥' »kZ) W•­äË@³|à²Nà‚áßÖGcp6^0)2•dª ËX벊-ã„ÙC'ÓßÊITݶö2«lÇ,ŒØsˆÆv¸å@R³T'ÌYRäª,‚óº:#šyí#Dc9Þ]uÛ”ØËdž¿Ü?Ác6AÉ|IQ50E\’äYf9Ò$²ð`nc­f`´±Õ™ÛF›£y{´9º2_°ÜÌ=‡¸lã®ïºYÓŠ,U‚Ç, Ué4+-ãn•¸öƉË6X:¿×ÙеÅÅo/®¼”M ­ËeVàVEQÝJ\ü–âr5"Yò÷®†ˆ«pî§ ò™vt´˜UœK[ ª%•êK{Âyp1À`Þ©ÌÆVƨV¢ [¬V!z…Ì‹ZYº Û]@«µØW¢£:Y·,„³En ôÎtŸçnÁû¨7À 60š}š_Š:¶àýf"×ÑŠh·üíhB{-‚»™kˆ*I"!5ô)#•èÔ%8â3:k¸TÔ|B ޏvKŒãZgJ<¶ ­W}[Z/{«¶Æ‹)YKL|mPLåZV1ÙpƒÏ´†Æ_ï,yÙ$?rüYh1[®\Z&:Z#ÏQÿÎgy–ÊÛ”¸ûmo‰Ï`Ä]Y4WÂ~®%q'ñ¸šÐ’µLcÃ;¢ºíއ“†lo7¶Çå:ѽ£¶Xùi–Ôö¥;úEçÀtGýúûÑF·ÌPJyÏ.“±¯èŽ–Éøío„2f ¤»Ãl¸ÌŠ â®8™÷kñË œ ¾x œôë·D¥2C¡ûž]&kádŒLÆoñw œX;Ì†Ë GS¶è`-œÐ»V‹ŒfµhO&ŽwïœäÇ Š~e}PtË ¹°=»ÖŸ6È;n=}$¬½cÃe†—+È»"€ÞTZ¬³3kí ï„€~e}tËôÖ/#À&€µ0B®íånkïØp™Þv8KPcà@1Àô/ƒ92+ß[Öœ­á#ß[Ùp׋_7-_ïͯ%‰Û¦åÖsE {çÁºnáûõ÷‡a·Ì g“ÉZÃpŒLÆïÍv ïlí0.3Ìâ¬Qø:8)G0–Ñ/MÝ'ýúû8é–YÁâl2Y 'cd2~ÿ³[àÄÚa6\f˜ÅÙ‚îµpR­ÇâF„× èWÖE·Ì gÀZ !×îa·ðáÖÞ±á2Ã,Î6 ¹êõX܈9Çô+ë# [f‹³.‡Z#àÚ{ë°öŽ —±±¸ ^½IÎuÜýdÆ ’F̘m"äf•cÓI¶·~Æ ÀµWÕ6sGîéû»" í9¸Að“(r#`l¢È‰€píô´Í¬>+ä³B>+ä³B>+ô)f…œ~·Ÿ€”üˆeÚ›H¹576äô»#àÚ|g›ù§ß›ïq" ŸZDÀ˜5Hî¸06¹ãDÀ¸¶®Ùf&ljŸÉñ™ŸÉñ™œû?Õ§süê ŸáñKî¼È Š~bx²qp·èmæÜ8ñy »‚¢Ÿ˜ÅàöËÛL ¹AáSC>5äSCŸfjȯòÙ"¿è. èg4†öàVºÛÌ)¹qâsJwE?É1 ŠÁ½i·™frƒÂ§™6{üžAͯ(òo£Ýým4¿Èè¡/2r"`LÂmüùlÛÌ79Aá×Ýcnã<Ûf¾É ŸoúTóMþ5¿:i<(ðÛh~ÁÒC_°äDÀ˜„ÛøÃ«¶™or‚¯aº+(Æ$ÜÆŸµÍ|SG(^ÿhB÷ü'¶3†¢ç?)%ÍùOZá{Þœÿ¤¸?ÿiŸ/è¾~7½ ëéIâßÓ³«ðbúöÝÕ~]…§UU^Rz5¯Â·Õiu‘]Uexvf“ææËŸ.¯ª÷¡.Yøììêìâ$ u’$,<»¯ÞUaõÿ®§?f'ÕéÕ¾?pÊ8õKß·Ý" à”M(þÀ)àTäœòNFŠ?pjp2òØàœòNù§üSþÀ)àÔíðNù§~üÅ8µ"_àœòNYáœòNù§–›¹†¨üSþÀ©ù/CÒòN9¾õNÕþÀ©{]ô眲¬îñN}J¯øø]fÖÀÉCyëçÁo)óà_ññûÇø÷yüû<ý}¿¥Ì8yÀ¯øø]fÖÀÉCyëçÁo)óP^ñðûÇø§VfWüö0~;â»$Šü^0>+ä³B>+ä³B>+´Å¬ÐƒßUøÁoéòà·öû·øLŽÏäøLÎCÌäø§Ö"~uÏðø¥@Ë‚óNù§üSþÀ)Ÿò©¡_VjȯòÙ"¿è. ðN=Üœ’?pʧ™üS«É‹?pÊ8µ­·Ñü"£‡¾ÈÈ8å×…?pÊç›ü jÎLÊæ_P{ð«“üÛh~Á’_°4þÀ©‡»†É8õ1ô¿tþý³_ÜûCÑàùOŒER‡QÌ•L±˜…(%¤òç?mãóÛ/îø™L^¿«ÂìúêÝÙExV‡Wt”ÔåY}õìÂ'õmöã´ Ÿí‡Ì~ÚŸLžžÿdN— ?Ý Yš&{ $Ããë¢:½ _WŻӳ“³·Óêròää$|IÅ/×TðcUN&ª.ÞO//§g§”……fÝç?íR"wZã_XåÃ`š__U6áË ²ò¬Àh<½Ê®èA”þÍN ϯ/ÎÏ.M)s¤ÕÙõUXW¦'懲*ÿiòö";½ªÊÝðüâ ]«JyþúèðUø—£×ß…/ÿøäå·áëáëïŽ^…¯^üá5ŠîNŽž?=þþÛ£ç4·=ûÓñÑá·íÛ_ü!|vøòéwøóÉïŽ^ÿwøäù·áŽ^??|õjŸ¿ÿ‹Úðê;zȬA/^¢àÓýG¯_…¸rdž÷ûÃðøèÉïÃ?4%&¯þtøôèÉñnxôüÛ£—‡OÍ­O_<uøçïé¶'Çá·Ož=ù#5¦yæìÏÉ_¾{òúÕ Ôý|õýñkêÇ^¾x¿xešþý«Ã]ý„nýÓËhö«Ýð/ß¾þîð%µý þÿôõÑ‹çT•¾~‰?wÃç‡<>úãáó§‡tã * á½DÁï_Ínؾ>%aÁ†Ÿœ¾ÝÁWxrU‡o¢ÅoÌ@ø Åg’‡ªŒw?:<<|óì©NþN_™¿’(‰ÃKXñ“’¼Ã¬¢r&“šxs×¢o(‘·øƒ…ìæòÉgÔÓzé~ª§};wÞÍoŸô&ï1ªÿ×Ù´Ü™üs1} ðÑü`_Orytuê0Ýmô}F»áþ¡ï¯OÉyýÓH ¼ž® ˯Ãïéobì?|þ;¼Þ ü+'yÿx7=©•¯¡¾ËǤ ùéÿTgµùcgw6®wB4kVþ‹K‚ùoÂßìàR0­ÃÇ¿úâòË/Í_¾ü’5-Õÿ¦ŸùE•ýýë(;ÍNÿ“°rӈϚF\^b0×ô˜ÝðÑç'ÂÙvÃ__ï¡¿‰~Ø5Ï\\`?´¾å?4 •8½ª?úÛé,*ýü1:Xú>ÜÛû&¬)øjU÷·S”íÖ×®®[ÛÛ3˜˜…7M™+ÿné‹Ð´ªAFü3o0Ãͯ ¬óÊšRÐËÅ—Œ4ýê`áQnîb„Èè‡æ6R.™’I¿¯ÞïÏ7nÞ ßÙÙiËžwÉ·1ÏìíEUýêW;ýêÑÎr{±ÿç¥%úý¼$9Ù’yÛy|YíÍÉtéK1rGMtû÷m]…7±¥¿fº"ÎFdkdï¡ò¥®ÏþýÛ£Ï?ßçìøíßÍcïÙß JJšqù7ÈvÞéæQ ÁͬKþ§qáWá£ß^Ÿœ|óhÑí_@ît Á¼ö^áór·©kþM˜-Ðü³Ñ€m©7­ìüûFfËÚ¾iÞ –¶'7Èl,N»¬ÂTóv8g|ИføV'Û?o² ·¨y޾Ööƒ­ØÜhŒ€"ìcΛtÐÆy^¹Ó2¯ôã¦#~l ù#Z¿²å­V®2ë¶’Y[ÉlÑJ8¯WΊ³å§±1Os£v©¤9™û÷”YªAÞÌB6s¨>‹[ÿ½d®›‹¸Ö |Ã/þ=ñúÿ¥ê¿ÿýóGÉÿF"b ѵ”Lò8Ž”Éÿ*ŸÿÝÊç#ç9àS¿>õëS¿>õ;êÓN´ÝdÕZ‰ž牞YRÄâðMì0Ë6°è«›ßùW-.Tœ‡öÏ®™ùyõuH7ŽWþŒß"óójî‹›ÔÆÍCµå¡Q÷¡Q÷¡Ìõвª³ë“«[=t¹¥aØ¥y^ÿNÿmþ‡=¢ïï›c¬àL26ãdPÿS,òüoŸ—‡O¾}vTºÊË"e—<Ì€ÉHsUñ@Æq2)f—¤‘ ²›”åìj•qY 2•b2¿šB²iÌÅ(KW²²Ì5+ÍÒdRÏŠÕ:J‹JŠ@¤*™Ì³Õô…Œ™JÓ€G’ÍÖµ”¯ŽðEœ×y’ä¨m~yvWI¢x ¢æzyd.We”䱌åM[Xœ™äI 8ÍõóÙs˜¨b&’rñ ‹Ùu\Éœ•о˜/™ jê²³hì²³hä²³5WY±u[¶U[Kkv–ŠKùqV¥m»{›Yµäì[îEÑÒÒ’¥-ôbüª&'žm0^µ¨Éò0ç˜Øàš6¯Ò“ÿ½>9ßDâwöYµþKÑû¿:Ž™ŽDÓü¹_ÿµ•Ï'ÿÝ¥Ÿ©Oû°Oûð¨Ï§žî$ÿ¦ïÏ)ÿ7™ùæ Üí<™õ^¾yWeeuq9 Ø™'>|=ù¬á?çWvæÙ*°góÞá1ÜÿìËŒIÇ )Wу~~8ó>»üûN¸>þÓÛùÂ\¹ü;ûšj7i¿W×eY¾ù\Ô'gÿ˜:q~Fêto¿:qþë œ?)üæ›P~=/Mõ؇ižù›5GCµ[„Ô‘½cz4UsùnZ_Í´ãðw7gÁX«ÎèƒÙˆn5ÕwêïÅ í[Í×ÇáÞÁr­íGSFK0D· ¡- ÷;úkoV׿M7梘qÍÌpÍOWÿ ÿÛØÒ/óYÁÿx¤hý¿–‘Œb®‰ÿ ¥üú¯­|f뿊´²`L‰Iü®x÷wZÁ"â<ÉbE ¸¢I _\ÐÕ¤äšç:1ã3¿Qµ(˜à¹˜N#5yûæÏ4‚Â*‘qE+‚bÚ»ñÍìj¥ê4¯¢€KA›ß•es½.êT*"N©øü²ˆ*¥²”– ÑHus9.d•¥Q‹ôpYèªb —SLfÓ2EPð(S•ÄÕÍ›µZh™E%X±xvõ]Àª\ʨ¬™°hrcÄ¥JåYÀRiZ¨ö®ú@Kz •è,Šb<{.&–qTYÀ““w嚣†Ôi–Ê*` 'xÀivJ]T"¯X‰Òi’´–)%²Œâ¤†ü">™?9S"ÍË<`’édr9»\k•Ö‘ÐèU¢fëâþl3eEZK‰fëÅz9\/#•Å™¦Ë‹ÕufÕ]&4×Q‰†‹ùsjª6ž”â†h~ý-]/TZð: „Lä|û)Z)X'EZ¢t-6¥2Ía¢®ãºU¯©µÔJé"¡òóæ—G ‚„H€Z8»nªdžrEÝ’*i¾ f²*Îâ„Ö†ñhVþœÄPqÁ %yÀâ9/ œµ* - ËÀŒZi#ΕœõàÜTPÄšÇ „̮ą¨³:Gz^éqUÊXÐWsÁ]Åp])Çõ$MæëÌ̱¢’’ÖÖ)¾¸N_aEFËã™"/¨Au¥ j1¦ùz5Ó D$@Dç'óç˜ÕZÔè*ˆé†ë÷„†"Šó”ÚÈåĤP¬Ì£\B…I*'^ÿ¿8ýlÿã?þã?þã?þã?Ûÿü×­[P mlton-20100608/runtime/gen/0000755000076600000240000000000011404470407014014 5ustar mtfstaffmlton-20100608/runtime/gen/.ignore0000644000076600000240000000022711404435622015301 0ustar mtfstaffc-types.h c-types.sml gen-basis-ffi gen-basis-ffi.exe gen-sizes gen-sizes.exe gen-sizes.stamp gen-types gen-types.exe gen-types.stamp ml-types.h sizes mlton-20100608/runtime/gen/basis-ffi.def0000644000076600000240000020544111404435622016345 0ustar mtfstaffCommandLine.argc = _symbol : C_Int.t CommandLine.argv = _symbol : C_StringArray.t CommandLine.commandName = _symbol : C_String.t Cygwin.toFullWindowsPath = _import PRIVATE : NullString8.t -> C_String.t Date.Tm.getHour = _import PRIVATE : unit -> C_Int.t Date.Tm.getIsDst = _import PRIVATE : unit -> C_Int.t Date.Tm.getMDay = _import PRIVATE : unit -> C_Int.t Date.Tm.getMin = _import PRIVATE : unit -> C_Int.t Date.Tm.getMon = _import PRIVATE : unit -> C_Int.t Date.Tm.getSec = _import PRIVATE : unit -> C_Int.t Date.Tm.getWDay = _import PRIVATE : unit -> C_Int.t Date.Tm.getYDay = _import PRIVATE : unit -> C_Int.t Date.Tm.getYear = _import PRIVATE : unit -> C_Int.t Date.Tm.setHour = _import PRIVATE : C_Int.t -> unit Date.Tm.setIsDst = _import PRIVATE : C_Int.t -> unit Date.Tm.setMDay = _import PRIVATE : C_Int.t -> unit Date.Tm.setMin = _import PRIVATE : C_Int.t -> unit Date.Tm.setMon = _import PRIVATE : C_Int.t -> unit Date.Tm.setSec = _import PRIVATE : C_Int.t -> unit Date.Tm.setWDay = _import PRIVATE : C_Int.t -> unit Date.Tm.setYDay = _import PRIVATE : C_Int.t -> unit Date.Tm.setYear = _import PRIVATE : C_Int.t -> unit Date.gmTime = _import PRIVATE : C_Time.t ref -> C_Int.t C_Errno.t Date.localOffset = _import PRIVATE : unit -> C_Double.t Date.localTime = _import PRIVATE : C_Time.t ref -> C_Int.t C_Errno.t Date.mkTime = _import PRIVATE : unit -> C_Time.t C_Errno.t Date.strfTime = _import PRIVATE : Char8.t array * C_Size.t * NullString8.t -> C_Size.t IEEEReal.FloatClass.FP_INFINITE = _const : C_Int.t IEEEReal.FloatClass.FP_NAN = _const : C_Int.t IEEEReal.FloatClass.FP_NORMAL = _const : C_Int.t IEEEReal.FloatClass.FP_SUBNORMAL = _const : C_Int.t IEEEReal.FloatClass.FP_ZERO = _const : C_Int.t IEEEReal.RoundingMode.FE_DOWNWARD = _const : C_Int.t IEEEReal.RoundingMode.FE_NOSUPPORT = _const : C_Int.t IEEEReal.RoundingMode.FE_TONEAREST = _const : C_Int.t IEEEReal.RoundingMode.FE_TOWARDZERO = _const : C_Int.t IEEEReal.RoundingMode.FE_UPWARD = _const : C_Int.t IEEEReal.getRoundingMode = _import PRIVATE : unit -> C_Int.t IEEEReal.setRoundingMode = _import PRIVATE : C_Int.t -> C_Int.t MLton.bug = _import PRIVATE __attribute__((noreturn)) : String8.t -> unit MLton.Itimer.PROF = _const : C_Int.t MLton.Itimer.REAL = _const : C_Int.t MLton.Itimer.VIRTUAL = _const : C_Int.t MLton.Itimer.set = _import PRIVATE : C_Int.t * C_Time.t * C_SUSeconds.t * C_Time.t * C_SUSeconds.t -> C_Int.t C_Errno.t MLton.Process.spawne = _import PRIVATE : NullString8.t * NullString8.t array * NullString8.t array -> C_PId.t C_Errno.t MLton.Process.spawnp = _import PRIVATE : NullString8.t * NullString8.t array -> C_PId.t C_Errno.t MLton.Rlimit.AS = _const : C_Int.t MLton.Rlimit.CORE = _const : C_Int.t MLton.Rlimit.CPU = _const : C_Int.t MLton.Rlimit.DATA = _const : C_Int.t MLton.Rlimit.FSIZE = _const : C_Int.t MLton.Rlimit.INFINITY = _const : C_RLim.t MLton.Rlimit.MEMLOCK = _const : C_Int.t MLton.Rlimit.NOFILE = _const : C_Int.t MLton.Rlimit.NPROC = _const : C_Int.t MLton.Rlimit.RSS = _const : C_Int.t MLton.Rlimit.STACK = _const : C_Int.t MLton.Rlimit.get = _import PRIVATE : C_Int.t -> C_Int.t C_Errno.t MLton.Rlimit.getHard = _import PRIVATE : unit -> C_RLim.t MLton.Rlimit.getSoft = _import PRIVATE : unit -> C_RLim.t MLton.Rlimit.set = _import PRIVATE : C_Int.t * C_RLim.t * C_RLim.t -> C_Int.t C_Errno.t MLton.Rusage.children_stime_sec = _import PRIVATE : unit -> C_Time.t MLton.Rusage.children_stime_usec = _import PRIVATE : unit -> C_SUSeconds.t MLton.Rusage.children_utime_sec = _import PRIVATE : unit -> C_Time.t MLton.Rusage.children_utime_usec = _import PRIVATE : unit -> C_SUSeconds.t MLton.Rusage.gc_stime_sec = _import PRIVATE : unit -> C_Time.t MLton.Rusage.gc_stime_usec = _import PRIVATE : unit -> C_SUSeconds.t MLton.Rusage.gc_utime_sec = _import PRIVATE : unit -> C_Time.t MLton.Rusage.gc_utime_usec = _import PRIVATE : unit -> C_SUSeconds.t MLton.Rusage.getrusage = _import PRIVATE : unit -> unit MLton.Rusage.self_stime_sec = _import PRIVATE : unit -> C_Time.t MLton.Rusage.self_stime_usec = _import PRIVATE : unit -> C_SUSeconds.t MLton.Rusage.self_utime_sec = _import PRIVATE : unit -> C_Time.t MLton.Rusage.self_utime_usec = _import PRIVATE : unit -> C_SUSeconds.t MLton.Syslog.Facility.LOG_AUTH = _const : C_Int.t MLton.Syslog.Facility.LOG_CRON = _const : C_Int.t MLton.Syslog.Facility.LOG_DAEMON = _const : C_Int.t MLton.Syslog.Facility.LOG_KERN = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL0 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL1 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL2 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL3 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL4 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL5 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL6 = _const : C_Int.t MLton.Syslog.Facility.LOG_LOCAL7 = _const : C_Int.t MLton.Syslog.Facility.LOG_LPR = _const : C_Int.t MLton.Syslog.Facility.LOG_MAIL = _const : C_Int.t MLton.Syslog.Facility.LOG_NEWS = _const : C_Int.t MLton.Syslog.Facility.LOG_SYSLOG = _const : C_Int.t MLton.Syslog.Facility.LOG_USER = _const : C_Int.t MLton.Syslog.Facility.LOG_UUCP = _const : C_Int.t MLton.Syslog.Logopt.LOG_CONS = _const : C_Int.t MLton.Syslog.Logopt.LOG_NDELAY = _const : C_Int.t MLton.Syslog.Logopt.LOG_NOWAIT = _const : C_Int.t MLton.Syslog.Logopt.LOG_ODELAY = _const : C_Int.t MLton.Syslog.Logopt.LOG_PERROR = _const : C_Int.t MLton.Syslog.Logopt.LOG_PID = _const : C_Int.t MLton.Syslog.Severity.LOG_ALERT = _const : C_Int.t MLton.Syslog.Severity.LOG_CRIT = _const : C_Int.t MLton.Syslog.Severity.LOG_DEBUG = _const : C_Int.t MLton.Syslog.Severity.LOG_EMERG = _const : C_Int.t MLton.Syslog.Severity.LOG_ERR = _const : C_Int.t MLton.Syslog.Severity.LOG_INFO = _const : C_Int.t MLton.Syslog.Severity.LOG_NOTICE = _const : C_Int.t MLton.Syslog.Severity.LOG_WARNING = _const : C_Int.t MLton.Syslog.closelog = _import PRIVATE : unit -> unit MLton.Syslog.openlog = _import PRIVATE : NullString8.t * C_Int.t * C_Int.t -> unit MLton.Syslog.syslog = _import PRIVATE : C_Int.t * NullString8.t -> unit MinGW.getTempPath = _import PRIVATE : C_Size.t * Char8.t array -> C_Size.t MinGW.setNonBlock = _import PRIVATE : C_Fd.t -> unit MinGW.clearNonBlock = _import PRIVATE : C_Fd.t -> unit Net.htonl = _import PRIVATE : Word32.t -> Word32.t Net.htons = _import PRIVATE : Word16.t -> Word16.t Net.ntohl = _import PRIVATE : Word32.t -> Word32.t Net.ntohs = _import PRIVATE : Word16.t -> Word16.t NetHostDB.INADDR_ANY = _const : C_Int.t NetHostDB.getByAddress = _import PRIVATE : Word8.t vector * C_Socklen.t -> C_Int.t NetHostDB.getByName = _import PRIVATE : NullString8.t -> C_Int.t NetHostDB.getEntryAddrType = _import PRIVATE : unit -> C_Int.t NetHostDB.getEntryAddrsN = _import PRIVATE : C_Int.t * Word8.t array -> unit NetHostDB.getEntryAddrsNum = _import PRIVATE : unit -> C_Int.t NetHostDB.getEntryAliasesN = _import PRIVATE : C_Int.t -> C_String.t NetHostDB.getEntryAliasesNum = _import PRIVATE : unit -> C_Int.t NetHostDB.getEntryLength = _import PRIVATE : unit -> C_Int.t NetHostDB.getEntryName = _import PRIVATE : unit -> C_String.t NetHostDB.getHostName = _import PRIVATE : Char8.t array * C_Size.t -> C_Int.t C_Errno.t NetHostDB.inAddrSize = _const : C_Size.t NetProtDB.getByName = _import PRIVATE : NullString8.t -> C_Int.t NetProtDB.getByNumber = _import PRIVATE : C_Int.t -> C_Int.t NetProtDB.getEntryAliasesN = _import PRIVATE : C_Int.t -> C_String.t NetProtDB.getEntryAliasesNum = _import PRIVATE : unit -> C_Int.t NetProtDB.getEntryName = _import PRIVATE : unit -> C_String.t NetProtDB.getEntryProto = _import PRIVATE : unit -> C_Int.t NetServDB.getByName = _import PRIVATE : NullString8.t * NullString8.t -> C_Int.t NetServDB.getByNameNull = _import PRIVATE : NullString8.t -> C_Int.t NetServDB.getByPort = _import PRIVATE : C_Int.t * NullString8.t -> C_Int.t NetServDB.getByPortNull = _import PRIVATE : C_Int.t -> C_Int.t NetServDB.getEntryAliasesN = _import PRIVATE : C_Int.t -> C_String.t NetServDB.getEntryAliasesNum = _import PRIVATE : unit -> C_Int.t NetServDB.getEntryName = _import PRIVATE : unit -> C_String.t NetServDB.getEntryPort = _import PRIVATE : unit -> C_Int.t NetServDB.getEntryProto = _import PRIVATE : unit -> C_String.t OS.IO.POLLIN = _const : C_Short.t OS.IO.POLLOUT = _const : C_Short.t OS.IO.POLLPRI = _const : C_Short.t OS.IO.poll = _import PRIVATE : C_Fd.t vector * C_Short.t vector * C_NFds.t * C_Int.t * C_Short.t array -> C_Int.t C_Errno.t Posix.Error.E2BIG = _const : C_Int.t Posix.Error.EACCES = _const : C_Int.t Posix.Error.EADDRINUSE = _const : C_Int.t Posix.Error.EADDRNOTAVAIL = _const : C_Int.t Posix.Error.EAFNOSUPPORT = _const : C_Int.t Posix.Error.EAGAIN = _const : C_Int.t Posix.Error.EALREADY = _const : C_Int.t Posix.Error.EBADF = _const : C_Int.t Posix.Error.EBADMSG = _const : C_Int.t Posix.Error.EBUSY = _const : C_Int.t Posix.Error.ECANCELED = _const : C_Int.t Posix.Error.ECHILD = _const : C_Int.t Posix.Error.ECONNABORTED = _const : C_Int.t Posix.Error.ECONNREFUSED = _const : C_Int.t Posix.Error.ECONNRESET = _const : C_Int.t Posix.Error.EDEADLK = _const : C_Int.t Posix.Error.EDESTADDRREQ = _const : C_Int.t Posix.Error.EDOM = _const : C_Int.t Posix.Error.EDQUOT = _const : C_Int.t Posix.Error.EEXIST = _const : C_Int.t Posix.Error.EFAULT = _const : C_Int.t Posix.Error.EFBIG = _const : C_Int.t Posix.Error.EHOSTUNREACH = _const : C_Int.t Posix.Error.EIDRM = _const : C_Int.t Posix.Error.EILSEQ = _const : C_Int.t Posix.Error.EINPROGRESS = _const : C_Int.t Posix.Error.EINTR = _const : C_Int.t Posix.Error.EINVAL = _const : C_Int.t Posix.Error.EIO = _const : C_Int.t Posix.Error.EISCONN = _const : C_Int.t Posix.Error.EISDIR = _const : C_Int.t Posix.Error.ELOOP = _const : C_Int.t Posix.Error.EMFILE = _const : C_Int.t Posix.Error.EMLINK = _const : C_Int.t Posix.Error.EMSGSIZE = _const : C_Int.t Posix.Error.EMULTIHOP = _const : C_Int.t Posix.Error.ENAMETOOLONG = _const : C_Int.t Posix.Error.ENETDOWN = _const : C_Int.t Posix.Error.ENETRESET = _const : C_Int.t Posix.Error.ENETUNREACH = _const : C_Int.t Posix.Error.ENFILE = _const : C_Int.t Posix.Error.ENOBUFS = _const : C_Int.t Posix.Error.ENODATA = _const : C_Int.t Posix.Error.ENODEV = _const : C_Int.t Posix.Error.ENOENT = _const : C_Int.t Posix.Error.ENOEXEC = _const : C_Int.t Posix.Error.ENOLCK = _const : C_Int.t Posix.Error.ENOLINK = _const : C_Int.t Posix.Error.ENOMEM = _const : C_Int.t Posix.Error.ENOMSG = _const : C_Int.t Posix.Error.ENOPROTOOPT = _const : C_Int.t Posix.Error.ENOSPC = _const : C_Int.t Posix.Error.ENOSR = _const : C_Int.t Posix.Error.ENOSTR = _const : C_Int.t Posix.Error.ENOSYS = _const : C_Int.t Posix.Error.ENOTCONN = _const : C_Int.t Posix.Error.ENOTDIR = _const : C_Int.t Posix.Error.ENOTEMPTY = _const : C_Int.t Posix.Error.ENOTSOCK = _const : C_Int.t Posix.Error.ENOTSUP = _const : C_Int.t Posix.Error.ENOTTY = _const : C_Int.t Posix.Error.ENXIO = _const : C_Int.t Posix.Error.EOPNOTSUPP = _const : C_Int.t Posix.Error.EOVERFLOW = _const : C_Int.t Posix.Error.EPERM = _const : C_Int.t Posix.Error.EPIPE = _const : C_Int.t Posix.Error.EPROTO = _const : C_Int.t Posix.Error.EPROTONOSUPPORT = _const : C_Int.t Posix.Error.EPROTOTYPE = _const : C_Int.t Posix.Error.ERANGE = _const : C_Int.t Posix.Error.EROFS = _const : C_Int.t Posix.Error.ESPIPE = _const : C_Int.t Posix.Error.ESRCH = _const : C_Int.t Posix.Error.ESTALE = _const : C_Int.t Posix.Error.ETIME = _const : C_Int.t Posix.Error.ETIMEDOUT = _const : C_Int.t Posix.Error.ETXTBSY = _const : C_Int.t Posix.Error.EWOULDBLOCK = _const : C_Int.t Posix.Error.EXDEV = _const : C_Int.t Posix.Error.clearErrno = _import PRIVATE : unit -> unit Posix.Error.getErrno = _import PRIVATE : unit -> C_Int.t Posix.Error.strError = _import PRIVATE : C_Int.t -> C_String.t Posix.FileSys.A.F_OK = _const : C_Int.t Posix.FileSys.A.R_OK = _const : C_Int.t Posix.FileSys.A.W_OK = _const : C_Int.t Posix.FileSys.A.X_OK = _const : C_Int.t Posix.FileSys.Dirstream.closeDir = _import PRIVATE : C_DirP.t -> C_Int.t C_Errno.t Posix.FileSys.Dirstream.openDir = _import PRIVATE : NullString8.t -> C_DirP.t C_Errno.t Posix.FileSys.Dirstream.readDir = _import PRIVATE : C_DirP.t -> C_String.t C_Errno.t Posix.FileSys.Dirstream.rewindDir = _import PRIVATE : C_DirP.t -> unit Posix.FileSys.O.APPEND = _const : C_Int.t Posix.FileSys.O.BINARY = _const : C_Int.t Posix.FileSys.O.CREAT = _const : C_Int.t Posix.FileSys.O.DSYNC = _const : C_Int.t Posix.FileSys.O.EXCL = _const : C_Int.t Posix.FileSys.O.NOCTTY = _const : C_Int.t Posix.FileSys.O.NONBLOCK = _const : C_Int.t Posix.FileSys.O.RDONLY = _const : C_Int.t Posix.FileSys.O.RDWR = _const : C_Int.t Posix.FileSys.O.RSYNC = _const : C_Int.t Posix.FileSys.O.SYNC = _const : C_Int.t Posix.FileSys.O.TEXT = _const : C_Int.t Posix.FileSys.O.TRUNC = _const : C_Int.t Posix.FileSys.O.WRONLY = _const : C_Int.t Posix.FileSys.PC.ALLOC_SIZE_MIN = _const : C_Int.t Posix.FileSys.PC.ASYNC_IO = _const : C_Int.t Posix.FileSys.PC.CHOWN_RESTRICTED = _const : C_Int.t Posix.FileSys.PC.FILESIZEBITS = _const : C_Int.t Posix.FileSys.PC.LINK_MAX = _const : C_Int.t Posix.FileSys.PC.MAX_CANON = _const : C_Int.t Posix.FileSys.PC.MAX_INPUT = _const : C_Int.t Posix.FileSys.PC.NAME_MAX = _const : C_Int.t Posix.FileSys.PC.NO_TRUNC = _const : C_Int.t Posix.FileSys.PC.PATH_MAX = _const : C_Int.t Posix.FileSys.PC.PIPE_BUF = _const : C_Int.t Posix.FileSys.PC.PRIO_IO = _const : C_Int.t Posix.FileSys.PC.REC_INCR_XFER_SIZE = _const : C_Int.t Posix.FileSys.PC.REC_MAX_XFER_SIZE = _const : C_Int.t Posix.FileSys.PC.REC_MIN_XFER_SIZE = _const : C_Int.t Posix.FileSys.PC.REC_XFER_ALIGN = _const : C_Int.t Posix.FileSys.PC.SYMLINK_MAX = _const : C_Int.t Posix.FileSys.PC.SYNC_IO = _const : C_Int.t Posix.FileSys.PC.TWO_SYMLINKS = _const : C_Int.t Posix.FileSys.PC.VDISABLE = _const : C_Int.t Posix.FileSys.S.IFBLK = _const : C_Mode.t Posix.FileSys.S.IFCHR = _const : C_Mode.t Posix.FileSys.S.IFDIR = _const : C_Mode.t Posix.FileSys.S.IFIFO = _const : C_Mode.t Posix.FileSys.S.IFLNK = _const : C_Mode.t Posix.FileSys.S.IFMT = _const : C_Mode.t Posix.FileSys.S.IFREG = _const : C_Mode.t Posix.FileSys.S.IFSOCK = _const : C_Mode.t Posix.FileSys.S.IRGRP = _const : C_Mode.t Posix.FileSys.S.IROTH = _const : C_Mode.t Posix.FileSys.S.IRUSR = _const : C_Mode.t Posix.FileSys.S.IRWXG = _const : C_Mode.t Posix.FileSys.S.IRWXO = _const : C_Mode.t Posix.FileSys.S.IRWXU = _const : C_Mode.t Posix.FileSys.S.ISGID = _const : C_Mode.t Posix.FileSys.S.ISUID = _const : C_Mode.t Posix.FileSys.S.ISVTX = _const : C_Mode.t Posix.FileSys.S.IWGRP = _const : C_Mode.t Posix.FileSys.S.IWOTH = _const : C_Mode.t Posix.FileSys.S.IWUSR = _const : C_Mode.t Posix.FileSys.S.IXGRP = _const : C_Mode.t Posix.FileSys.S.IXOTH = _const : C_Mode.t Posix.FileSys.S.IXUSR = _const : C_Mode.t Posix.FileSys.ST.isBlk = _import PRIVATE : C_Mode.t -> C_Int.t Posix.FileSys.ST.isChr = _import PRIVATE : C_Mode.t -> C_Int.t Posix.FileSys.ST.isDir = _import PRIVATE : C_Mode.t -> C_Int.t Posix.FileSys.ST.isFIFO = _import PRIVATE : C_Mode.t -> C_Int.t Posix.FileSys.ST.isLink = _import PRIVATE : C_Mode.t -> C_Int.t Posix.FileSys.ST.isReg = _import PRIVATE : C_Mode.t -> C_Int.t Posix.FileSys.ST.isSock = _import PRIVATE : C_Mode.t -> C_Int.t Posix.FileSys.Stat.fstat = _import PRIVATE : C_Fd.t -> C_Int.t C_Errno.t Posix.FileSys.Stat.getATime = _import PRIVATE : unit -> C_Time.t # Posix.FileSys.Stat.getBlkCnt = _import PRIVATE : unit -> C_BlkCnt.t # Posix.FileSys.Stat.getBlkSize = _import PRIVATE : unit -> C_BlkSize.t Posix.FileSys.Stat.getCTime = _import PRIVATE : unit -> C_Time.t Posix.FileSys.Stat.getDev = _import PRIVATE : unit -> C_Dev.t Posix.FileSys.Stat.getGId = _import PRIVATE : unit -> C_GId.t Posix.FileSys.Stat.getINo = _import PRIVATE : unit -> C_INo.t Posix.FileSys.Stat.getMTime = _import PRIVATE : unit -> C_Time.t Posix.FileSys.Stat.getMode = _import PRIVATE : unit -> C_Mode.t Posix.FileSys.Stat.getNLink = _import PRIVATE : unit -> C_NLink.t Posix.FileSys.Stat.getRDev = _import PRIVATE : unit -> C_Dev.t Posix.FileSys.Stat.getSize = _import PRIVATE : unit -> C_Off.t Posix.FileSys.Stat.getUId = _import PRIVATE : unit -> C_UId.t Posix.FileSys.Stat.lstat = _import PRIVATE : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.Stat.stat = _import PRIVATE : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.Utimbuf.setAcTime = _import PRIVATE : C_Time.t -> unit Posix.FileSys.Utimbuf.setModTime = _import PRIVATE : C_Time.t -> unit Posix.FileSys.Utimbuf.utime = _import PRIVATE : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.access = _import PRIVATE : NullString8.t * C_Int.t -> C_Int.t C_Errno.t Posix.FileSys.chdir = _import PRIVATE : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.chmod = _import PRIVATE : NullString8.t * C_Mode.t -> C_Int.t C_Errno.t Posix.FileSys.chown = _import PRIVATE : NullString8.t * C_UId.t * C_GId.t -> C_Int.t C_Errno.t Posix.FileSys.fchdir = _import PRIVATE : C_Fd.t -> C_Int.t C_Errno.t Posix.FileSys.fchmod = _import PRIVATE : C_Fd.t * C_Mode.t -> C_Int.t C_Errno.t Posix.FileSys.fchown = _import PRIVATE : C_Fd.t * C_UId.t * C_GId.t -> C_Int.t C_Errno.t Posix.FileSys.fpathconf = _import PRIVATE : C_Fd.t * C_Int.t -> C_Long.t C_Errno.t Posix.FileSys.ftruncate = _import PRIVATE : C_Fd.t * C_Off.t -> C_Int.t C_Errno.t Posix.FileSys.getcwd = _import PRIVATE : Char8.t array * C_Size.t -> C_String.t C_Errno.t Posix.FileSys.link = _import PRIVATE : NullString8.t * NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.mkdir = _import PRIVATE : NullString8.t * C_Mode.t -> C_Int.t C_Errno.t Posix.FileSys.mkfifo = _import PRIVATE : NullString8.t * C_Mode.t -> C_Int.t C_Errno.t Posix.FileSys.open2 = _import PRIVATE : NullString8.t * C_Int.t -> C_Fd.t C_Errno.t Posix.FileSys.open3 = _import PRIVATE : NullString8.t * C_Int.t * C_Mode.t -> C_Fd.t C_Errno.t Posix.FileSys.pathconf = _import PRIVATE : NullString8.t * C_Int.t -> C_Long.t C_Errno.t Posix.FileSys.readlink = _import PRIVATE : NullString8.t * Char8.t array * C_Size.t -> C_SSize.t C_Errno.t Posix.FileSys.rename = _import PRIVATE : NullString8.t * NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.rmdir = _import PRIVATE : NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.symlink = _import PRIVATE : NullString8.t * NullString8.t -> C_Int.t C_Errno.t Posix.FileSys.truncate = _import PRIVATE : NullString8.t * C_Off.t -> C_Int.t C_Errno.t Posix.FileSys.umask = _import PRIVATE : C_Mode.t -> C_Mode.t Posix.FileSys.unlink = _import PRIVATE : NullString8.t -> C_Int.t C_Errno.t Posix.IO.FD.CLOEXEC = _const : C_Int.t Posix.IO.FLock.F_GETLK = _const : C_Int.t Posix.IO.FLock.F_RDLCK = _const : C_Short.t Posix.IO.FLock.F_SETLK = _const : C_Int.t Posix.IO.FLock.F_SETLKW = _const : C_Int.t Posix.IO.FLock.F_UNLCK = _const : C_Short.t Posix.IO.FLock.F_WRLCK = _const : C_Short.t Posix.IO.FLock.SEEK_CUR = _const : C_Short.t Posix.IO.FLock.SEEK_END= _const : C_Short.t Posix.IO.FLock.SEEK_SET = _const : C_Short.t Posix.IO.FLock.fcntl = _import PRIVATE : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.IO.FLock.getLen = _import PRIVATE : unit -> C_Off.t Posix.IO.FLock.getPId = _import PRIVATE : unit -> C_PId.t Posix.IO.FLock.getStart = _import PRIVATE : unit -> C_Off.t Posix.IO.FLock.getType = _import PRIVATE : unit -> C_Short.t Posix.IO.FLock.getWhence = _import PRIVATE : unit -> C_Short.t Posix.IO.FLock.setLen = _import PRIVATE : C_Off.t -> unit Posix.IO.FLock.setPId = _import PRIVATE : C_PId.t -> unit Posix.IO.FLock.setStart = _import PRIVATE : C_Off.t -> unit Posix.IO.FLock.setType = _import PRIVATE : C_Short.t -> unit Posix.IO.FLock.setWhence = _import PRIVATE : C_Short.t -> unit Posix.IO.F_DUPFD = _const : C_Int.t Posix.IO.F_GETFD = _const : C_Int.t Posix.IO.F_GETFL = _const : C_Int.t Posix.IO.F_GETOWN = _const : C_Int.t Posix.IO.F_SETFD = _const : C_Int.t Posix.IO.F_SETFL = _const : C_Int.t Posix.IO.F_SETOWN = _const : C_Int.t Posix.IO.O_ACCMODE = _const : C_Int.t Posix.IO.SEEK_CUR = _const : C_Int.t Posix.IO.SEEK_END= _const : C_Int.t Posix.IO.SEEK_SET = _const : C_Int.t Posix.IO.close = _import PRIVATE : C_Fd.t -> C_Int.t C_Errno.t Posix.IO.dup = _import PRIVATE : C_Fd.t -> C_Fd.t C_Errno.t Posix.IO.dup2 = _import PRIVATE : C_Fd.t * C_Fd.t -> C_Fd.t C_Errno.t Posix.IO.fcntl2 = _import PRIVATE : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.IO.fcntl3 = _import PRIVATE : C_Fd.t * C_Int.t * C_Int.t -> C_Int.t C_Errno.t Posix.IO.fsync = _import PRIVATE : C_Fd.t -> C_Int.t C_Errno.t Posix.IO.lseek = _import PRIVATE : C_Fd.t * C_Off.t * C_Int.t -> C_Off.t C_Errno.t Posix.IO.pipe = _import PRIVATE : C_Fd.t array -> C_Int.t C_Errno.t Posix.IO.readChar8 = _import PRIVATE : C_Fd.t * Char8.t array * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.readWord8 = _import PRIVATE : C_Fd.t * Word8.t array * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.setbin = _import PRIVATE : C_Fd.t -> unit Posix.IO.settext = _import PRIVATE : C_Fd.t -> unit Posix.IO.writeChar8Arr = _import PRIVATE : C_Fd.t * Char8.t array * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.writeChar8Vec = _import PRIVATE : C_Fd.t * Char8.t vector * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.writeWord8Arr = _import PRIVATE : C_Fd.t * Word8.t array * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.IO.writeWord8Vec = _import PRIVATE : C_Fd.t * Word8.t vector * C_Int.t * C_Size.t -> C_SSize.t C_Errno.t Posix.ProcEnv.SC_2_CHAR_TERM = _const : C_Int.t Posix.ProcEnv.SC_2_C_BIND = _const : C_Int.t Posix.ProcEnv.SC_2_C_DEV = _const : C_Int.t Posix.ProcEnv.SC_2_FORT_DEV = _const : C_Int.t Posix.ProcEnv.SC_2_FORT_RUN = _const : C_Int.t Posix.ProcEnv.SC_2_LOCALEDEF = _const : C_Int.t Posix.ProcEnv.SC_2_PBS = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_ACCOUNTING = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_CHECKPOINT = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_LOCATE = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_MESSAGE = _const : C_Int.t Posix.ProcEnv.SC_2_PBS_TRACK = _const : C_Int.t Posix.ProcEnv.SC_2_SW_DEV = _const : C_Int.t Posix.ProcEnv.SC_2_UPE = _const : C_Int.t Posix.ProcEnv.SC_2_VERSION = _const : C_Int.t Posix.ProcEnv.SC_ADVISORY_INFO = _const : C_Int.t Posix.ProcEnv.SC_AIO_LISTIO_MAX = _const : C_Int.t Posix.ProcEnv.SC_AIO_MAX = _const : C_Int.t Posix.ProcEnv.SC_AIO_PRIO_DELTA_MAX = _const : C_Int.t Posix.ProcEnv.SC_ARG_MAX = _const : C_Int.t Posix.ProcEnv.SC_ASYNCHRONOUS_IO = _const : C_Int.t Posix.ProcEnv.SC_ATEXIT_MAX = _const : C_Int.t Posix.ProcEnv.SC_BARRIERS = _const : C_Int.t Posix.ProcEnv.SC_BC_BASE_MAX = _const : C_Int.t Posix.ProcEnv.SC_BC_DIM_MAX = _const : C_Int.t Posix.ProcEnv.SC_BC_SCALE_MAX = _const : C_Int.t Posix.ProcEnv.SC_BC_STRING_MAX = _const : C_Int.t Posix.ProcEnv.SC_CHILD_MAX = _const : C_Int.t Posix.ProcEnv.SC_CLK_TCK = _const : C_Int.t Posix.ProcEnv.SC_CLOCK_SELECTION = _const : C_Int.t Posix.ProcEnv.SC_COLL_WEIGHTS_MAX = _const : C_Int.t Posix.ProcEnv.SC_CPUTIME = _const : C_Int.t Posix.ProcEnv.SC_DELAYTIMER_MAX = _const : C_Int.t Posix.ProcEnv.SC_EXPR_NEST_MAX = _const : C_Int.t Posix.ProcEnv.SC_FSYNC = _const : C_Int.t Posix.ProcEnv.SC_GETGR_R_SIZE_MAX = _const : C_Int.t Posix.ProcEnv.SC_GETPW_R_SIZE_MAX = _const : C_Int.t Posix.ProcEnv.SC_HOST_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_IOV_MAX = _const : C_Int.t Posix.ProcEnv.SC_IPV6 = _const : C_Int.t Posix.ProcEnv.SC_JOB_CONTROL = _const : C_Int.t Posix.ProcEnv.SC_LINE_MAX = _const : C_Int.t Posix.ProcEnv.SC_LOGIN_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_MAPPED_FILES = _const : C_Int.t Posix.ProcEnv.SC_MEMLOCK = _const : C_Int.t Posix.ProcEnv.SC_MEMLOCK_RANGE = _const : C_Int.t Posix.ProcEnv.SC_MEMORY_PROTECTION = _const : C_Int.t Posix.ProcEnv.SC_MESSAGE_PASSING = _const : C_Int.t Posix.ProcEnv.SC_MONOTONIC_CLOCK = _const : C_Int.t Posix.ProcEnv.SC_MQ_OPEN_MAX = _const : C_Int.t Posix.ProcEnv.SC_MQ_PRIO_MAX = _const : C_Int.t Posix.ProcEnv.SC_NGROUPS_MAX = _const : C_Int.t Posix.ProcEnv.SC_OPEN_MAX = _const : C_Int.t Posix.ProcEnv.SC_PAGESIZE = _const : C_Int.t Posix.ProcEnv.SC_PAGE_SIZE = _const : C_Int.t Posix.ProcEnv.SC_PRIORITIZED_IO = _const : C_Int.t Posix.ProcEnv.SC_PRIORITY_SCHEDULING = _const : C_Int.t Posix.ProcEnv.SC_RAW_SOCKETS = _const : C_Int.t Posix.ProcEnv.SC_READER_WRITER_LOCKS = _const : C_Int.t Posix.ProcEnv.SC_REALTIME_SIGNALS = _const : C_Int.t Posix.ProcEnv.SC_REGEXP = _const : C_Int.t Posix.ProcEnv.SC_RE_DUP_MAX = _const : C_Int.t Posix.ProcEnv.SC_RTSIG_MAX = _const : C_Int.t Posix.ProcEnv.SC_SAVED_IDS = _const : C_Int.t Posix.ProcEnv.SC_SEMAPHORES = _const : C_Int.t Posix.ProcEnv.SC_SEM_NSEMS_MAX = _const : C_Int.t Posix.ProcEnv.SC_SEM_VALUE_MAX = _const : C_Int.t Posix.ProcEnv.SC_SHARED_MEMORY_OBJECTS = _const : C_Int.t Posix.ProcEnv.SC_SHELL = _const : C_Int.t Posix.ProcEnv.SC_SIGQUEUE_MAX = _const : C_Int.t Posix.ProcEnv.SC_SPAWN = _const : C_Int.t Posix.ProcEnv.SC_SPIN_LOCKS = _const : C_Int.t Posix.ProcEnv.SC_SPORADIC_SERVER = _const : C_Int.t Posix.ProcEnv.SC_SS_REPL_MAX = _const : C_Int.t Posix.ProcEnv.SC_STREAM_MAX = _const : C_Int.t Posix.ProcEnv.SC_SYMLOOP_MAX = _const : C_Int.t Posix.ProcEnv.SC_SYNCHRONIZED_IO = _const : C_Int.t Posix.ProcEnv.SC_THREADS = _const : C_Int.t Posix.ProcEnv.SC_THREAD_ATTR_STACKADDR = _const : C_Int.t Posix.ProcEnv.SC_THREAD_ATTR_STACKSIZE = _const : C_Int.t Posix.ProcEnv.SC_THREAD_CPUTIME = _const : C_Int.t Posix.ProcEnv.SC_THREAD_DESTRUCTOR_ITERATIONS = _const : C_Int.t Posix.ProcEnv.SC_THREAD_KEYS_MAX = _const : C_Int.t Posix.ProcEnv.SC_THREAD_PRIORITY_SCHEDULING = _const : C_Int.t Posix.ProcEnv.SC_THREAD_PRIO_INHERIT = _const : C_Int.t Posix.ProcEnv.SC_THREAD_PRIO_PROTECT = _const : C_Int.t Posix.ProcEnv.SC_THREAD_PROCESS_SHARED = _const : C_Int.t Posix.ProcEnv.SC_THREAD_SAFE_FUNCTIONS = _const : C_Int.t Posix.ProcEnv.SC_THREAD_SPORADIC_SERVER = _const : C_Int.t Posix.ProcEnv.SC_THREAD_STACK_MIN = _const : C_Int.t Posix.ProcEnv.SC_THREAD_THREADS_MAX = _const : C_Int.t Posix.ProcEnv.SC_TIMEOUTS = _const : C_Int.t Posix.ProcEnv.SC_TIMERS = _const : C_Int.t Posix.ProcEnv.SC_TIMER_MAX = _const : C_Int.t Posix.ProcEnv.SC_TRACE = _const : C_Int.t Posix.ProcEnv.SC_TRACE_EVENT_FILTER = _const : C_Int.t Posix.ProcEnv.SC_TRACE_EVENT_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_TRACE_INHERIT = _const : C_Int.t Posix.ProcEnv.SC_TRACE_LOG = _const : C_Int.t Posix.ProcEnv.SC_TRACE_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_TRACE_SYS_MAX = _const : C_Int.t Posix.ProcEnv.SC_TRACE_USER_EVENT_MAX = _const : C_Int.t Posix.ProcEnv.SC_TTY_NAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_TYPED_MEMORY_OBJECTS = _const : C_Int.t Posix.ProcEnv.SC_TZNAME_MAX = _const : C_Int.t Posix.ProcEnv.SC_V6_ILP32_OFF32 = _const : C_Int.t Posix.ProcEnv.SC_V6_ILP32_OFFBIG = _const : C_Int.t Posix.ProcEnv.SC_V6_LP64_OFF64 = _const : C_Int.t Posix.ProcEnv.SC_V6_LPBIG_OFFBIG = _const : C_Int.t Posix.ProcEnv.SC_VERSION = _const : C_Int.t Posix.ProcEnv.SC_XBS5_ILP32_OFF32 = _const : C_Int.t Posix.ProcEnv.SC_XBS5_ILP32_OFFBIG = _const : C_Int.t Posix.ProcEnv.SC_XBS5_LP64_OFF64 = _const : C_Int.t Posix.ProcEnv.SC_XBS5_LPBIG_OFFBIG = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_CRYPT = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_ENH_I18N = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_LEGACY = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_REALTIME = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_REALTIME_THREADS = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_SHM = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_STREAMS = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_UNIX = _const : C_Int.t Posix.ProcEnv.SC_XOPEN_VERSION = _const : C_Int.t Posix.ProcEnv.Times.getCSTime = _import PRIVATE : unit -> C_Clock.t Posix.ProcEnv.Times.getCUTime = _import PRIVATE : unit -> C_Clock.t Posix.ProcEnv.Times.getSTime = _import PRIVATE : unit -> C_Clock.t Posix.ProcEnv.Times.getUTime = _import PRIVATE : unit -> C_Clock.t Posix.ProcEnv.Uname.getMachine = _import PRIVATE : unit -> C_String.t Posix.ProcEnv.Uname.getNodeName = _import PRIVATE : unit -> C_String.t Posix.ProcEnv.Uname.getRelease = _import PRIVATE : unit -> C_String.t Posix.ProcEnv.Uname.getSysName = _import PRIVATE : unit -> C_String.t Posix.ProcEnv.Uname.getVersion = _import PRIVATE : unit -> C_String.t Posix.ProcEnv.ctermid = _import PRIVATE : unit -> C_String.t Posix.ProcEnv.environ = _symbol : C_StringArray.t Posix.ProcEnv.getegid = _import PRIVATE : unit -> C_GId.t Posix.ProcEnv.getenv = _import PRIVATE : NullString8.t -> C_String.t Posix.ProcEnv.geteuid = _import PRIVATE : unit -> C_UId.t Posix.ProcEnv.getgid = _import PRIVATE : unit -> C_GId.t Posix.ProcEnv.getgroups = _import PRIVATE : C_Int.t * C_GId.t array -> C_Int.t C_Errno.t Posix.ProcEnv.getgroupsN = _import PRIVATE : unit -> C_Int.t Posix.ProcEnv.getlogin = _import PRIVATE : unit -> C_String.t C_Errno.t Posix.ProcEnv.getpgrp = _import PRIVATE : unit -> C_PId.t Posix.ProcEnv.getpid = _import PRIVATE : unit -> C_PId.t Posix.ProcEnv.getppid = _import PRIVATE : unit -> C_PId.t Posix.ProcEnv.getuid = _import PRIVATE : unit -> C_UId.t Posix.ProcEnv.isatty = _import PRIVATE : C_Fd.t -> C_Int.t Posix.ProcEnv.setenv = _import PRIVATE : NullString8.t * NullString8.t -> C_Int.t C_Errno.t Posix.ProcEnv.setgid = _import PRIVATE : C_GId.t -> C_Int.t C_Errno.t Posix.ProcEnv.setgroups = _import PRIVATE : C_Int.t * C_GId.t vector -> C_Int.t C_Errno.t Posix.ProcEnv.setpgid = _import PRIVATE : C_PId.t * C_PId.t -> C_Int.t C_Errno.t Posix.ProcEnv.setsid = _import PRIVATE : unit -> C_PId.t C_Errno.t Posix.ProcEnv.setuid = _import PRIVATE : C_UId.t -> C_Int.t C_Errno.t Posix.ProcEnv.sysconf = _import PRIVATE : C_Int.t -> C_Long.t C_Errno.t Posix.ProcEnv.times = _import PRIVATE : unit -> C_Clock.t C_Errno.t Posix.ProcEnv.ttyname = _import PRIVATE : C_Fd.t -> C_String.t C_Errno.t Posix.ProcEnv.uname = _import PRIVATE : unit -> C_Int.t C_Errno.t # Posix.Process.W.CONTINUED = _const : C_Int.t Posix.Process.W.NOHANG = _const : C_Int.t Posix.Process.W.UNTRACED = _const : C_Int.t Posix.Process.alarm = _import PRIVATE : C_UInt.t -> C_UInt.t Posix.Process.exece = _import PRIVATE : NullString8.t * NullString8.t array * NullString8.t array -> C_Int.t C_Errno.t Posix.Process.execp = _import PRIVATE : NullString8.t * NullString8.t array -> C_Int.t C_Errno.t Posix.Process.exit = _import PRIVATE __attribute__((noreturn)) : C_Status.t -> unit Posix.Process.exitStatus = _import PRIVATE : C_Status.t -> C_Int.t Posix.Process.fork = _import PRIVATE : unit -> C_PId.t C_Errno.t Posix.Process.ifExited = _import PRIVATE : C_Status.t -> C_Int.t Posix.Process.ifSignaled = _import PRIVATE : C_Status.t -> C_Int.t Posix.Process.ifStopped = _import PRIVATE : C_Status.t -> C_Int.t Posix.Process.kill = _import PRIVATE : C_PId.t * C_Signal.t -> C_Int.t C_Errno.t Posix.Process.nanosleep = _import PRIVATE : C_Time.t ref * C_Long.t ref -> C_Int.t C_Errno.t Posix.Process.pause = _import PRIVATE : unit -> C_Int.t C_Errno.t Posix.Process.sleep = _import PRIVATE : C_UInt.t -> C_UInt.t Posix.Process.stopSig = _import PRIVATE : C_Status.t -> C_Signal.t Posix.Process.system = _import PRIVATE : NullString8.t -> C_Status.t C_Errno.t Posix.Process.termSig = _import PRIVATE : C_Status.t -> C_Signal.t Posix.Process.waitpid = _import PRIVATE : C_PId.t * C_Status.t ref * C_Int.t -> C_PId.t C_Errno.t Posix.Signal.NSIG = _const : C_Int.t Posix.Signal.SIGABRT = _const : C_Signal.t Posix.Signal.SIGALRM = _const : C_Signal.t Posix.Signal.SIGBUS = _const : C_Signal.t Posix.Signal.SIGCHLD = _const : C_Signal.t Posix.Signal.SIGCONT = _const : C_Signal.t Posix.Signal.SIGFPE = _const : C_Signal.t Posix.Signal.SIGHUP = _const : C_Signal.t Posix.Signal.SIGILL = _const : C_Signal.t Posix.Signal.SIGINT = _const : C_Signal.t Posix.Signal.SIGKILL = _const : C_Signal.t Posix.Signal.SIGPIPE = _const : C_Signal.t Posix.Signal.SIGPOLL = _const : C_Signal.t Posix.Signal.SIGPROF = _const : C_Signal.t Posix.Signal.SIGQUIT = _const : C_Signal.t Posix.Signal.SIGSEGV = _const : C_Signal.t Posix.Signal.SIGSTOP = _const : C_Signal.t Posix.Signal.SIGSYS = _const : C_Signal.t Posix.Signal.SIGTERM = _const : C_Signal.t Posix.Signal.SIGTRAP = _const : C_Signal.t Posix.Signal.SIGTSTP = _const : C_Signal.t Posix.Signal.SIGTTIN = _const : C_Signal.t Posix.Signal.SIGTTOU = _const : C_Signal.t Posix.Signal.SIGURG = _const : C_Signal.t Posix.Signal.SIGUSR1 = _const : C_Signal.t Posix.Signal.SIGUSR2 = _const : C_Signal.t Posix.Signal.SIGVTALRM = _const : C_Signal.t Posix.Signal.SIGXCPU = _const : C_Signal.t Posix.Signal.SIGXFSZ = _const : C_Signal.t Posix.Signal.SIG_BLOCK = _const : C_Int.t Posix.Signal.SIG_SETMASK = _const : C_Int.t Posix.Signal.SIG_UNBLOCK = _const : C_Int.t Posix.Signal.default = _import PRIVATE : C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.handleGC = _import PRIVATE : unit -> unit Posix.Signal.handlee = _import PRIVATE : C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.ignore = _import PRIVATE : C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.isDefault = _import PRIVATE : C_Signal.t * C_Int.t ref -> C_Int.t C_Errno.t Posix.Signal.isIgnore = _import PRIVATE : C_Signal.t * C_Int.t ref -> C_Int.t C_Errno.t Posix.Signal.isPending = _import PRIVATE : C_Signal.t -> C_Int.t Posix.Signal.isPendingGC = _import PRIVATE : unit -> C_Int.t Posix.Signal.resetPending = _import PRIVATE :unit -> unit Posix.Signal.sigaddset = _import PRIVATE : C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.sigdelset = _import PRIVATE : C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.sigemptyset = _import PRIVATE : unit -> C_Int.t C_Errno.t Posix.Signal.sigfillset = _import PRIVATE : unit -> C_Int.t C_Errno.t Posix.Signal.sigismember = _import PRIVATE : C_Signal.t -> C_Int.t C_Errno.t Posix.Signal.sigprocmask = _import PRIVATE : C_Int.t -> C_Int.t C_Errno.t Posix.Signal.sigsuspend = _import PRIVATE : unit -> unit Posix.SysDB.Group.getGId = _import PRIVATE : unit -> C_GId.t Posix.SysDB.Group.getMem = _import PRIVATE : unit -> C_StringArray.t Posix.SysDB.Group.getName = _import PRIVATE : unit -> C_String.t Posix.SysDB.Passwd.getDir = _import PRIVATE : unit -> C_String.t Posix.SysDB.Passwd.getGId = _import PRIVATE : unit -> C_GId.t Posix.SysDB.Passwd.getName = _import PRIVATE : unit -> C_String.t Posix.SysDB.Passwd.getShell = _import PRIVATE : unit -> C_String.t Posix.SysDB.Passwd.getUId = _import PRIVATE : unit -> C_UId.t Posix.SysDB.getgrgid = _import PRIVATE : C_GId.t -> C_Int.t C_Errno.t Posix.SysDB.getgrnam = _import PRIVATE : NullString8.t -> C_Int.t C_Errno.t Posix.SysDB.getpwnam = _import PRIVATE : NullString8.t -> C_Int.t C_Errno.t Posix.SysDB.getpwuid = _import PRIVATE : C_GId.t -> C_Int.t C_Errno.t Posix.TTY.B0 = _const : C_Speed.t Posix.TTY.B110 = _const : C_Speed.t Posix.TTY.B1200 = _const : C_Speed.t Posix.TTY.B134 = _const : C_Speed.t Posix.TTY.B150 = _const : C_Speed.t Posix.TTY.B1800 = _const : C_Speed.t Posix.TTY.B19200 = _const : C_Speed.t Posix.TTY.B200 = _const : C_Speed.t Posix.TTY.B2400 = _const : C_Speed.t Posix.TTY.B300 = _const : C_Speed.t Posix.TTY.B38400 = _const : C_Speed.t Posix.TTY.B4800 = _const : C_Speed.t Posix.TTY.B50 = _const : C_Speed.t Posix.TTY.B600 = _const : C_Speed.t Posix.TTY.B75 = _const : C_Speed.t Posix.TTY.B9600 = _const : C_Speed.t Posix.TTY.C.CLOCAL = _const : C_TCFlag.t Posix.TTY.C.CREAD = _const : C_TCFlag.t Posix.TTY.C.CS5 = _const : C_TCFlag.t Posix.TTY.C.CS6 = _const : C_TCFlag.t Posix.TTY.C.CS7 = _const : C_TCFlag.t Posix.TTY.C.CS8 = _const : C_TCFlag.t Posix.TTY.C.CSIZE = _const : C_TCFlag.t Posix.TTY.C.CSTOPB = _const : C_TCFlag.t Posix.TTY.C.HUPCL = _const : C_TCFlag.t Posix.TTY.C.PARENB = _const : C_TCFlag.t Posix.TTY.C.PARODD = _const : C_TCFlag.t Posix.TTY.I.BRKINT = _const : C_TCFlag.t Posix.TTY.I.ICRNL = _const : C_TCFlag.t Posix.TTY.I.IGNBRK = _const : C_TCFlag.t Posix.TTY.I.IGNCR = _const : C_TCFlag.t Posix.TTY.I.IGNPAR = _const : C_TCFlag.t Posix.TTY.I.INLCR = _const : C_TCFlag.t Posix.TTY.I.INPCK = _const : C_TCFlag.t Posix.TTY.I.ISTRIP = _const : C_TCFlag.t Posix.TTY.I.IXANY = _const : C_TCFlag.t Posix.TTY.I.IXOFF = _const : C_TCFlag.t Posix.TTY.I.IXON = _const : C_TCFlag.t Posix.TTY.I.PARMRK = _const : C_TCFlag.t Posix.TTY.L.ECHO = _const : C_TCFlag.t Posix.TTY.L.ECHOE = _const : C_TCFlag.t Posix.TTY.L.ECHOK = _const : C_TCFlag.t Posix.TTY.L.ECHONL = _const : C_TCFlag.t Posix.TTY.L.ICANON = _const : C_TCFlag.t Posix.TTY.L.IEXTEN = _const : C_TCFlag.t Posix.TTY.L.ISIG = _const : C_TCFlag.t Posix.TTY.L.NOFLSH = _const : C_TCFlag.t Posix.TTY.L.TOSTOP = _const : C_TCFlag.t Posix.TTY.O.BS0 = _const : C_TCFlag.t Posix.TTY.O.BS1 = _const : C_TCFlag.t Posix.TTY.O.BSDLY = _const : C_TCFlag.t Posix.TTY.O.CR0 = _const : C_TCFlag.t Posix.TTY.O.CR1 = _const : C_TCFlag.t Posix.TTY.O.CR2 = _const : C_TCFlag.t Posix.TTY.O.CR3 = _const : C_TCFlag.t Posix.TTY.O.CRDLY = _const : C_TCFlag.t Posix.TTY.O.FF0 = _const : C_TCFlag.t Posix.TTY.O.FF1 = _const : C_TCFlag.t Posix.TTY.O.FFDLY = _const : C_TCFlag.t Posix.TTY.O.NL0 = _const : C_TCFlag.t Posix.TTY.O.NL1 = _const : C_TCFlag.t Posix.TTY.O.NLDLY = _const : C_TCFlag.t Posix.TTY.O.OCRNL = _const : C_TCFlag.t Posix.TTY.O.OFILL = _const : C_TCFlag.t Posix.TTY.O.ONLCR = _const : C_TCFlag.t Posix.TTY.O.ONLRET = _const : C_TCFlag.t Posix.TTY.O.ONOCR = _const : C_TCFlag.t Posix.TTY.O.OPOST = _const : C_TCFlag.t Posix.TTY.O.TAB0 = _const : C_TCFlag.t Posix.TTY.O.TAB1 = _const : C_TCFlag.t Posix.TTY.O.TAB2 = _const : C_TCFlag.t Posix.TTY.O.TAB3 = _const : C_TCFlag.t Posix.TTY.O.TABDLY = _const : C_TCFlag.t Posix.TTY.O.VT0 = _const : C_TCFlag.t Posix.TTY.O.VT1 = _const : C_TCFlag.t Posix.TTY.O.VTDLY = _const : C_TCFlag.t Posix.TTY.TC.TCIFLUSH = _const : C_Int.t Posix.TTY.TC.TCIOFF = _const : C_Int.t Posix.TTY.TC.TCIOFLUSH = _const : C_Int.t Posix.TTY.TC.TCION = _const : C_Int.t Posix.TTY.TC.TCOFLUSH = _const : C_Int.t Posix.TTY.TC.TCOOFF = _const : C_Int.t Posix.TTY.TC.TCOON = _const : C_Int.t Posix.TTY.TC.TCSADRAIN = _const : C_Int.t Posix.TTY.TC.TCSAFLUSH = _const : C_Int.t Posix.TTY.TC.TCSANOW = _const : C_Int.t Posix.TTY.TC.drain = _import PRIVATE : C_Fd.t -> C_Int.t C_Errno.t Posix.TTY.TC.flow = _import PRIVATE : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.TTY.TC.flush = _import PRIVATE : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.TTY.TC.getattr = _import PRIVATE : C_Fd.t -> C_Int.t C_Errno.t Posix.TTY.TC.getpgrp = _import PRIVATE : C_Fd.t -> C_PId.t C_Errno.t Posix.TTY.TC.sendbreak = _import PRIVATE : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.TTY.TC.setattr = _import PRIVATE : C_Fd.t * C_Int.t -> C_Int.t C_Errno.t Posix.TTY.TC.setpgrp = _import PRIVATE : C_Fd.t * C_PId.t -> C_Int.t C_Errno.t Posix.TTY.Termios.cfGetISpeed = _import PRIVATE : unit -> C_Speed.t Posix.TTY.Termios.cfGetOSpeed = _import PRIVATE : unit -> C_Speed.t Posix.TTY.Termios.cfSetISpeed = _import PRIVATE : C_Speed.t -> C_Int.t C_Errno.t Posix.TTY.Termios.cfSetOSpeed = _import PRIVATE : C_Speed.t -> C_Int.t C_Errno.t Posix.TTY.Termios.getCC = _import PRIVATE : C_CC.t array -> unit Posix.TTY.Termios.getCFlag = _import PRIVATE : unit -> C_TCFlag.t Posix.TTY.Termios.getIFlag = _import PRIVATE : unit -> C_TCFlag.t Posix.TTY.Termios.getLFlag = _import PRIVATE : unit -> C_TCFlag.t Posix.TTY.Termios.getOFlag = _import PRIVATE : unit -> C_TCFlag.t Posix.TTY.Termios.setCC = _import PRIVATE : C_CC.t array -> unit Posix.TTY.Termios.setCFlag = _import PRIVATE : C_TCFlag.t -> unit Posix.TTY.Termios.setIFlag = _import PRIVATE : C_TCFlag.t -> unit Posix.TTY.Termios.setLFlag = _import PRIVATE : C_TCFlag.t -> unit Posix.TTY.Termios.setOFlag = _import PRIVATE : C_TCFlag.t -> unit Posix.TTY.V.NCCS = _const : C_Int.t Posix.TTY.V.VEOF = _const : C_Int.t Posix.TTY.V.VEOL = _const : C_Int.t Posix.TTY.V.VERASE = _const : C_Int.t Posix.TTY.V.VINTR = _const : C_Int.t Posix.TTY.V.VKILL = _const : C_Int.t Posix.TTY.V.VMIN = _const : C_Int.t Posix.TTY.V.VQUIT = _const : C_Int.t Posix.TTY.V.VSTART = _const : C_Int.t Posix.TTY.V.VSTOP = _const : C_Int.t Posix.TTY.V.VSUSP = _const : C_Int.t Posix.TTY.V.VTIME = _const : C_Int.t Socket.AF.INET = _const : C_Int.t Socket.AF.INET6 = _const : C_Int.t Socket.AF.UNIX = _const : C_Int.t Socket.AF.UNSPEC = _const : C_Int.t Socket.Ctl.FIONBIO = _const : C_Int.t Socket.Ctl.FIONREAD = _const : C_Int.t Socket.Ctl.SIOCATMARK = _const : C_Int.t Socket.Ctl.SOL_SOCKET = _const : C_Int.t Socket.Ctl.SO_ACCEPTCONN = _const : C_Int.t Socket.Ctl.SO_BROADCAST = _const : C_Int.t Socket.Ctl.SO_DEBUG = _const : C_Int.t Socket.Ctl.SO_DONTROUTE = _const : C_Int.t Socket.Ctl.SO_ERROR = _const : C_Int.t Socket.Ctl.SO_KEEPALIVE = _const : C_Int.t Socket.Ctl.SO_LINGER = _const : C_Int.t Socket.Ctl.SO_OOBINLINE = _const : C_Int.t Socket.Ctl.SO_RCVBUF = _const : C_Int.t Socket.Ctl.SO_RCVLOWAT = _const : C_Int.t Socket.Ctl.SO_RCVTIMEO = _const : C_Int.t Socket.Ctl.SO_REUSEADDR = _const : C_Int.t Socket.Ctl.SO_SNDBUF = _const : C_Int.t Socket.Ctl.SO_SNDLOWAT = _const : C_Int.t Socket.Ctl.SO_SNDTIMEO = _const : C_Int.t Socket.Ctl.SO_TYPE = _const : C_Int.t Socket.Ctl.getIOCtl = _import PRIVATE : C_Sock.t * C_Int.t * Word8.t array -> C_Int.t C_Errno.t Socket.Ctl.getPeerName = _import PRIVATE : C_Sock.t * Word8.t array * C_Socklen.t ref -> C_Int.t C_Errno.t Socket.Ctl.getSockName = _import PRIVATE : C_Sock.t * Word8.t array * C_Socklen.t ref -> C_Int.t C_Errno.t Socket.Ctl.getSockOpt = _import PRIVATE : C_Sock.t * C_Int.t * C_Int.t * Word8.t array * C_Socklen.t ref -> C_Int.t C_Errno.t Socket.Ctl.setIOCtl = _import PRIVATE : C_Sock.t * C_Int.t * Word8.t vector -> C_Int.t C_Errno.t Socket.Ctl.setSockOpt = _import PRIVATE : C_Sock.t * C_Int.t * C_Int.t * Word8.t vector * C_Socklen.t -> C_Int.t C_Errno.t Socket.GenericSock.socket = _import PRIVATE : C_Int.t * C_Int.t * C_Int.t -> C_Int.t C_Errno.t Socket.GenericSock.socketPair = _import PRIVATE : C_Int.t * C_Int.t * C_Int.t * C_Int.t array -> C_Int.t C_Errno.t Socket.INetSock.Ctl.IPPROTO_TCP = _const : C_Int.t Socket.INetSock.Ctl.TCP_NODELAY = _const : C_Int.t Socket.INetSock.fromAddr = _import PRIVATE : Word8.t vector -> unit Socket.INetSock.getInAddr = _import PRIVATE : Word8.t array -> unit Socket.INetSock.getPort = _import PRIVATE : unit -> Word16.t Socket.INetSock.toAddr = _import PRIVATE : Word8.t vector * Word16.t * Word8.t array * C_Socklen.t ref -> unit Socket.MSG_CTRUNC = _const : C_Int.t Socket.MSG_DONTROUTE = _const : C_Int.t Socket.MSG_DONTWAIT = _const : C_Int.t Socket.MSG_EOR = _const : C_Int.t Socket.MSG_OOB = _const : C_Int.t Socket.MSG_PEEK = _const : C_Int.t Socket.MSG_TRUNC = _const : C_Int.t Socket.MSG_WAITALL = _const : C_Int.t Socket.SHUT_RD = _const : C_Int.t Socket.SHUT_RDWR = _const : C_Int.t Socket.SHUT_WR = _const : C_Int.t Socket.SOCK.DGRAM = _const : C_Int.t Socket.SOCK.RAW = _const : C_Int.t Socket.SOCK.SEQPACKET = _const : C_Int.t Socket.SOCK.STREAM = _const : C_Int.t Socket.UnixSock.fromAddr = _import PRIVATE : Word8.t vector * Char8.t array * C_Size.t -> unit Socket.UnixSock.pathLen = _import PRIVATE : Word8.t vector -> C_Size.t Socket.UnixSock.toAddr = _import PRIVATE : NullString8.t * C_Size.t * Word8.t array * C_Socklen.t ref -> unit Socket.accept = _import PRIVATE : C_Sock.t * Word8.t array * C_Socklen.t ref -> C_Int.t C_Errno.t Socket.bind = _import PRIVATE : C_Sock.t * Word8.t vector * C_Socklen.t -> C_Int.t C_Errno.t Socket.close = _import PRIVATE : C_Sock.t -> C_Int.t C_Errno.t Socket.connect = _import PRIVATE : C_Sock.t * Word8.t vector * C_Socklen.t -> C_Int.t C_Errno.t Socket.familyOfAddr = _import PRIVATE : Word8.t vector -> C_Int.t Socket.getTimeout_sec = _import PRIVATE : unit -> C_Time.t Socket.getTimeout_usec = _import PRIVATE : unit -> C_SUSeconds.t Socket.listen = _import PRIVATE : C_Sock.t * C_Int.t -> C_Int.t C_Errno.t Socket.recv = _import PRIVATE : C_Sock.t * Word8.t array * C_Int.t * C_Size.t * C_Int.t -> C_SSize.t C_Errno.t Socket.recvFrom = _import PRIVATE : C_Sock.t * Word8.t array * C_Int.t * C_Size.t * C_Int.t * Word8.t array * C_Socklen.t ref -> C_SSize.t C_Errno.t Socket.select = _import PRIVATE : C_Fd.t vector * C_Fd.t vector * C_Fd.t vector * C_Int.t array * C_Int.t array * C_Int.t array -> C_Int.t C_Errno.t Socket.sendArr = _import PRIVATE : C_Sock.t * Word8.t array * C_Int.t * C_Size.t * C_Int.t -> C_SSize.t C_Errno.t Socket.sendArrTo = _import PRIVATE : C_Sock.t * Word8.t array * C_Int.t * C_Size.t * C_Int.t * Word8.t vector * C_Socklen.t -> C_SSize.t C_Errno.t Socket.sendVec = _import PRIVATE : C_Sock.t * Word8.t vector * C_Int.t * C_Size.t * C_Int.t -> C_SSize.t C_Errno.t Socket.sendVecTo = _import PRIVATE : C_Sock.t * Word8.t vector * C_Int.t * C_Size.t * C_Int.t * Word8.t vector * C_Socklen.t -> C_SSize.t C_Errno.t Socket.setTimeout = _import PRIVATE : C_Time.t * C_SUSeconds.t -> unit Socket.setTimeoutNull = _import PRIVATE : unit -> unit Socket.shutdown = _import PRIVATE : C_Sock.t * C_Int.t -> C_Int.t C_Errno.t Socket.sockAddrStorageLen = _const : C_Size.t Stdio.print = _import PRIVATE : String8.t -> unit Stdio.printStderr = _import PRIVATE : String8.t -> unit Stdio.printStdout = _import PRIVATE : String8.t -> unit Time.getTimeOfDay = _import PRIVATE : C_Time.t ref * C_SUSeconds.t ref -> C_Int.t Windows.Process.create = _import PRIVATE : NullString8.t * NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> C_PId.t C_Errno.t Windows.Process.createNull = _import PRIVATE : NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> C_PId.t C_Errno.t Windows.Process.getexitcode = _import PRIVATE : C_PId.t * C_Status.t ref -> C_Int.t C_Errno.t Windows.Process.terminate = _import PRIVATE : C_PId.t * C_Signal.t -> C_Int.t C_Errno.t ## Real32.Math.acos = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.asin = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.atan = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.atan2 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Real32.t Real32.Math.cos = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.cosh = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.e = _symbol : Real32.t Real32.Math.exp = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.ln = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.log10 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.pi = _symbol : Real32.t Real32.Math.pow = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Real32.t Real32.Math.sin = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.sinh = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.sqrt = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.tan = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.Math.tanh = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.abs = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.add = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Real32.t Real32.castToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Word32.t Real32.class = _import PRIVATE : Real32.t -> C_Int.t Real32.div = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Real32.t Real32.equal = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Bool.t Real32.fetch = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t ref -> Real32.t Real32.frexp = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * C_Int.t ref -> Real32.t Real32.gdtoa = _import PRIVATE : Real32.t * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t Real32.ldexp = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * C_Int.t -> Real32.t Real32.le = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Bool.t Real32.lt = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Bool.t Real32.maxFinite = _symbol : Real32.t Real32.minNormalPos = _symbol : Real32.t Real32.minPos = _symbol : Real32.t Real32.modf = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t ref -> Real32.t Real32.move = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t ref * Real32.t ref -> unit Real32.mul = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Real32.t Real32.muladd = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t * Real32.t -> Real32.t Real32.mulsub = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t * Real32.t -> Real32.t Real32.neg = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.rndToReal32 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.rndToReal64 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real64.t Real32.rndToWordS16 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Int16.t Real32.rndToWordS32 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Int32.t Real32.rndToWordS64 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Int64.t Real32.rndToWordS8 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Int8.t Real32.rndToWordU16 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Word16.t Real32.rndToWordU32 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Word32.t Real32.rndToWordU64 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Word64.t Real32.rndToWordU8 = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Word8.t Real32.round = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t -> Real32.t Real32.signBit = _import PRIVATE : Real32.t -> C_Int.t Real32.store = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t ref * Real32.t -> unit Real32.strto = _import PRIVATE : NullString8.t * C_Int.t -> Real32.t Real32.sub = _import MLTON_CODEGEN_STATIC_INLINE : Real32.t * Real32.t -> Real32.t Real64.Math.acos = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.asin = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.atan = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.atan2 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Real64.t Real64.Math.cos = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.cosh = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.e = _symbol : Real64.t Real64.Math.exp = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.ln = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.log10 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.pi = _symbol : Real64.t Real64.Math.pow = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Real64.t Real64.Math.sin = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.sinh = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.sqrt = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.tan = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.Math.tanh = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.abs = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.add = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Real64.t Real64.castToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Word64.t Real64.class = _import PRIVATE : Real64.t -> C_Int.t Real64.div = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Real64.t Real64.equal = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Bool.t Real64.fetch = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t ref -> Real64.t Real64.frexp = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * C_Int.t ref -> Real64.t Real64.gdtoa = _import PRIVATE : Real64.t * C_Int.t * C_Int.t * C_Int.t * C_Int.t ref -> C_String.t Real64.ldexp = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * C_Int.t -> Real64.t Real64.le = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Bool.t Real64.lt = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Bool.t Real64.maxFinite = _symbol : Real64.t Real64.minNormalPos = _symbol : Real64.t Real64.minPos = _symbol : Real64.t Real64.modf = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t ref -> Real64.t Real64.move = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t ref * Real64.t ref -> unit Real64.mul = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Real64.t Real64.muladd = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t * Real64.t -> Real64.t Real64.mulsub = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t * Real64.t -> Real64.t Real64.neg = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.rndToReal32 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real32.t Real64.rndToReal64 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.rndToWordS16 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Int16.t Real64.rndToWordS32 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Int32.t Real64.rndToWordS64 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Int64.t Real64.rndToWordS8 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Int8.t Real64.rndToWordU16 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Word16.t Real64.rndToWordU32 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Word32.t Real64.rndToWordU64 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Word64.t Real64.rndToWordU8 = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Word8.t Real64.round = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t -> Real64.t Real64.signBit = _import PRIVATE : Real64.t -> C_Int.t Real64.store = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t ref * Real64.t -> unit Real64.strto = _import PRIVATE : NullString8.t * C_Int.t -> Real64.t Real64.sub = _import MLTON_CODEGEN_STATIC_INLINE : Real64.t * Real64.t -> Real64.t Word16.add = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Word16.t Word16.andb = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Word16.t Word16.equal = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Bool.t Word16.lshift = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word32.t -> Word16.t Word16.neg = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t -> Word16.t Word16.notb = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t -> Word16.t Word16.orb = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Word16.t Word16.rol = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word32.t -> Word16.t Word16.ror = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word32.t -> Word16.t Word16.sub = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Word16.t Word16.xorb = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Word16.t Word32.add = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t Word32.andb = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t Word32.castToReal32 = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t -> Real32.t Word32.equal = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Bool.t Word32.lshift = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t Word32.neg = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t -> Word32.t Word32.notb = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t -> Word32.t Word32.orb = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t Word32.rol = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t Word32.ror = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t Word32.sub = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t Word32.xorb = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t Word64.add = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Word64.t Word64.andb = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Word64.t Word64.castToReal64 = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t -> Real64.t Word64.equal = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Bool.t Word64.fetch = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t ref -> Word64.t Word64.lshift = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word32.t -> Word64.t Word64.move = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t ref * Word64.t ref -> unit Word64.neg = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t -> Word64.t Word64.notb = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t -> Word64.t Word64.orb = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Word64.t Word64.rol = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word32.t -> Word64.t Word64.ror = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word32.t -> Word64.t Word64.store = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t ref * Word64.t -> unit Word64.sub = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Word64.t Word64.xorb = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Word64.t Word8.add = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Word8.t Word8.andb = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Word8.t Word8.equal = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Bool.t Word8.lshift = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word32.t -> Word8.t Word8.neg = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t -> Word8.t Word8.notb = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t -> Word8.t Word8.orb = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Word8.t Word8.rol = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word32.t -> Word8.t Word8.ror = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word32.t -> Word8.t Word8.sub = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Word8.t Word8.xorb = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Word8.t WordS16.addCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Int16.t -> Bool.t WordS16.extdToWord16 = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t -> Word16.t WordS16.extdToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t -> Word32.t WordS16.extdToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t -> Word64.t WordS16.extdToWord8 = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t -> Word8.t WordS16.ge = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Int16.t -> Bool.t WordS16.gt = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Int16.t -> Bool.t WordS16.le = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Int16.t -> Bool.t WordS16.lt = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Int16.t -> Bool.t WordS16.mul = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Int16.t -> Int16.t WordS16.mulCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Int16.t -> Bool.t WordS16.negCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t -> Bool.t WordS16.quot = _import MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) : Int16.t * Int16.t -> Int16.t WordS16.rem = _import MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) : Int16.t * Int16.t -> Int16.t WordS16.rndToReal32 = _import PRIVATE : Int16.t -> Real32.t WordS16.rndToReal64 = _import PRIVATE : Int16.t -> Real64.t WordS16.rshift = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Word32.t -> Int16.t WordS16.subCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int16.t * Int16.t -> Bool.t WordS32.addCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Int32.t -> Bool.t WordS32.extdToWord16 = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t -> Word16.t WordS32.extdToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t -> Word32.t WordS32.extdToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t -> Word64.t WordS32.extdToWord8 = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t -> Word8.t WordS32.ge = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Int32.t -> Bool.t WordS32.gt = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Int32.t -> Bool.t WordS32.le = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Int32.t -> Bool.t WordS32.lt = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Int32.t -> Bool.t WordS32.mul = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Int32.t -> Int32.t WordS32.mulCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Int32.t -> Bool.t WordS32.negCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t -> Bool.t WordS32.quot = _import MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) : Int32.t * Int32.t -> Int32.t WordS32.rem = _import MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) : Int32.t * Int32.t -> Int32.t WordS32.rndToReal32 = _import PRIVATE : Int32.t -> Real32.t WordS32.rndToReal64 = _import PRIVATE : Int32.t -> Real64.t WordS32.rshift = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Word32.t -> Int32.t WordS32.subCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int32.t * Int32.t -> Bool.t WordS64.addCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Int64.t -> Bool.t WordS64.extdToWord16 = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t -> Word16.t WordS64.extdToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t -> Word32.t WordS64.extdToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t -> Word64.t WordS64.extdToWord8 = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t -> Word8.t WordS64.ge = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Int64.t -> Bool.t WordS64.gt = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Int64.t -> Bool.t WordS64.le = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Int64.t -> Bool.t WordS64.lt = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Int64.t -> Bool.t WordS64.mul = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Int64.t -> Int64.t WordS64.mulCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Int64.t -> Bool.t WordS64.negCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t -> Bool.t WordS64.quot = _import MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) : Int64.t * Int64.t -> Int64.t WordS64.rem = _import MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) : Int64.t * Int64.t -> Int64.t WordS64.rndToReal32 = _import PRIVATE : Int64.t -> Real32.t WordS64.rndToReal64 = _import PRIVATE : Int64.t -> Real64.t WordS64.rshift = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Word32.t -> Int64.t WordS64.subCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int64.t * Int64.t -> Bool.t WordS8.addCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Int8.t -> Bool.t WordS8.extdToWord16 = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t -> Word16.t WordS8.extdToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t -> Word32.t WordS8.extdToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t -> Word64.t WordS8.extdToWord8 = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t -> Word8.t WordS8.ge = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Int8.t -> Bool.t WordS8.gt = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Int8.t -> Bool.t WordS8.le = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Int8.t -> Bool.t WordS8.lt = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Int8.t -> Bool.t WordS8.mul = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Int8.t -> Int8.t WordS8.mulCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Int8.t -> Bool.t WordS8.negCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t -> Bool.t WordS8.quot = _import MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) : Int8.t * Int8.t -> Int8.t WordS8.rem = _import MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) : Int8.t * Int8.t -> Int8.t WordS8.rndToReal32 = _import PRIVATE : Int8.t -> Real32.t WordS8.rndToReal64 = _import PRIVATE : Int8.t -> Real64.t WordS8.rshift = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Word32.t -> Int8.t WordS8.subCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Int8.t * Int8.t -> Bool.t WordU16.addCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Bool.t WordU16.extdToWord16 = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t -> Word16.t WordU16.extdToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t -> Word32.t WordU16.extdToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t -> Word64.t WordU16.extdToWord8 = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t -> Word8.t WordU16.ge = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Bool.t WordU16.gt = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Bool.t WordU16.le = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Bool.t WordU16.lt = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Bool.t WordU16.mul = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Word16.t WordU16.mulCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Bool.t WordU16.quot = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Word16.t WordU16.rem = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word16.t -> Word16.t WordU16.rndToReal32 = _import PRIVATE : Word16.t -> Real32.t WordU16.rndToReal64 = _import PRIVATE : Word16.t -> Real64.t WordU16.rshift = _import MLTON_CODEGEN_STATIC_INLINE : Word16.t * Word32.t -> Word16.t WordU32.addCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Bool.t WordU32.extdToWord16 = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t -> Word16.t WordU32.extdToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t -> Word32.t WordU32.extdToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t -> Word64.t WordU32.extdToWord8 = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t -> Word8.t WordU32.ge = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Bool.t WordU32.gt = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Bool.t WordU32.le = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Bool.t WordU32.lt = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Bool.t WordU32.mul = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t WordU32.mulCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Bool.t WordU32.quot = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t WordU32.rem = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t WordU32.rndToReal32 = _import PRIVATE : Word32.t -> Real32.t WordU32.rndToReal64 = _import PRIVATE : Word32.t -> Real64.t WordU32.rshift = _import MLTON_CODEGEN_STATIC_INLINE : Word32.t * Word32.t -> Word32.t WordU64.addCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Bool.t WordU64.extdToWord16 = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t -> Word16.t WordU64.extdToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t -> Word32.t WordU64.extdToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t -> Word64.t WordU64.extdToWord8 = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t -> Word8.t WordU64.ge = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Bool.t WordU64.gt = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Bool.t WordU64.le = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Bool.t WordU64.lt = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Bool.t WordU64.mul = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Word64.t WordU64.mulCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Bool.t WordU64.quot = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Word64.t WordU64.rem = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word64.t -> Word64.t WordU64.rndToReal32 = _import PRIVATE : Word64.t -> Real32.t WordU64.rndToReal64 = _import PRIVATE : Word64.t -> Real64.t WordU64.rshift = _import MLTON_CODEGEN_STATIC_INLINE : Word64.t * Word32.t -> Word64.t WordU8.addCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Bool.t WordU8.extdToWord16 = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t -> Word16.t WordU8.extdToWord32 = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t -> Word32.t WordU8.extdToWord64 = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t -> Word64.t WordU8.extdToWord8 = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t -> Word8.t WordU8.ge = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Bool.t WordU8.gt = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Bool.t WordU8.le = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Bool.t WordU8.lt = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Bool.t WordU8.mul = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Word8.t WordU8.mulCheckOverflows = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Bool.t WordU8.quot = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Word8.t WordU8.rem = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word8.t -> Word8.t WordU8.rndToReal32 = _import PRIVATE : Word8.t -> Real32.t WordU8.rndToReal64 = _import PRIVATE : Word8.t -> Real64.t WordU8.rshift = _import MLTON_CODEGEN_STATIC_INLINE : Word8.t * Word32.t -> Word8.t mlton-20100608/runtime/gen/basis-ffi.h0000644000076600000240000020077011404435622016036 0ustar mtfstaff/* This file is automatically generated. Do not edit. */ #ifndef _MLTON_BASIS_FFI_H_ #define _MLTON_BASIS_FFI_H_ PRIVATE extern C_Int_t CommandLine_argc; PRIVATE extern C_StringArray_t CommandLine_argv; PRIVATE extern C_String_t CommandLine_commandName; PRIVATE C_String_t Cygwin_toFullWindowsPath(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Date_gmTime(Ref(C_Time_t)); PRIVATE C_Double_t Date_localOffset(void); PRIVATE C_Errno_t(C_Int_t) Date_localTime(Ref(C_Time_t)); PRIVATE C_Errno_t(C_Time_t) Date_mkTime(void); PRIVATE C_Size_t Date_strfTime(Array(Char8_t),C_Size_t,NullString8_t); PRIVATE C_Int_t Date_Tm_getHour(void); PRIVATE C_Int_t Date_Tm_getIsDst(void); PRIVATE C_Int_t Date_Tm_getMDay(void); PRIVATE C_Int_t Date_Tm_getMin(void); PRIVATE C_Int_t Date_Tm_getMon(void); PRIVATE C_Int_t Date_Tm_getSec(void); PRIVATE C_Int_t Date_Tm_getWDay(void); PRIVATE C_Int_t Date_Tm_getYDay(void); PRIVATE C_Int_t Date_Tm_getYear(void); PRIVATE void Date_Tm_setHour(C_Int_t); PRIVATE void Date_Tm_setIsDst(C_Int_t); PRIVATE void Date_Tm_setMDay(C_Int_t); PRIVATE void Date_Tm_setMin(C_Int_t); PRIVATE void Date_Tm_setMon(C_Int_t); PRIVATE void Date_Tm_setSec(C_Int_t); PRIVATE void Date_Tm_setWDay(C_Int_t); PRIVATE void Date_Tm_setYDay(C_Int_t); PRIVATE void Date_Tm_setYear(C_Int_t); PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_INFINITE; PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_NAN; PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_NORMAL; PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_SUBNORMAL; PRIVATE extern const C_Int_t IEEEReal_FloatClass_FP_ZERO; PRIVATE C_Int_t IEEEReal_getRoundingMode(void); PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_DOWNWARD; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_NOSUPPORT; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_TONEAREST; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_TOWARDZERO; PRIVATE extern const C_Int_t IEEEReal_RoundingMode_FE_UPWARD; PRIVATE C_Int_t IEEEReal_setRoundingMode(C_Int_t); PRIVATE void MinGW_clearNonBlock(C_Fd_t); PRIVATE C_Size_t MinGW_getTempPath(C_Size_t,Array(Char8_t)); PRIVATE void MinGW_setNonBlock(C_Fd_t); PRIVATE __attribute__((noreturn)) void MLton_bug(String8_t); PRIVATE extern const C_Int_t MLton_Itimer_PROF; PRIVATE extern const C_Int_t MLton_Itimer_REAL; PRIVATE C_Errno_t(C_Int_t) MLton_Itimer_set(C_Int_t,C_Time_t,C_SUSeconds_t,C_Time_t,C_SUSeconds_t); PRIVATE extern const C_Int_t MLton_Itimer_VIRTUAL; PRIVATE C_Errno_t(C_PId_t) MLton_Process_spawne(NullString8_t,Array(NullString8_t),Array(NullString8_t)); PRIVATE C_Errno_t(C_PId_t) MLton_Process_spawnp(NullString8_t,Array(NullString8_t)); PRIVATE extern const C_Int_t MLton_Rlimit_AS; PRIVATE extern const C_Int_t MLton_Rlimit_CORE; PRIVATE extern const C_Int_t MLton_Rlimit_CPU; PRIVATE extern const C_Int_t MLton_Rlimit_DATA; PRIVATE extern const C_Int_t MLton_Rlimit_FSIZE; PRIVATE C_Errno_t(C_Int_t) MLton_Rlimit_get(C_Int_t); PRIVATE C_RLim_t MLton_Rlimit_getHard(void); PRIVATE C_RLim_t MLton_Rlimit_getSoft(void); PRIVATE extern const C_RLim_t MLton_Rlimit_INFINITY; PRIVATE extern const C_Int_t MLton_Rlimit_MEMLOCK; PRIVATE extern const C_Int_t MLton_Rlimit_NOFILE; PRIVATE extern const C_Int_t MLton_Rlimit_NPROC; PRIVATE extern const C_Int_t MLton_Rlimit_RSS; PRIVATE C_Errno_t(C_Int_t) MLton_Rlimit_set(C_Int_t,C_RLim_t,C_RLim_t); PRIVATE extern const C_Int_t MLton_Rlimit_STACK; PRIVATE C_Time_t MLton_Rusage_children_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_children_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_children_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_children_utime_usec(void); PRIVATE C_Time_t MLton_Rusage_gc_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_gc_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_gc_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_gc_utime_usec(void); PRIVATE void MLton_Rusage_getrusage(void); PRIVATE C_Time_t MLton_Rusage_self_stime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_self_stime_usec(void); PRIVATE C_Time_t MLton_Rusage_self_utime_sec(void); PRIVATE C_SUSeconds_t MLton_Rusage_self_utime_usec(void); PRIVATE void MLton_Syslog_closelog(void); PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_AUTH; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_CRON; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_DAEMON; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_KERN; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL0; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL1; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL2; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL3; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL4; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL5; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL6; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LOCAL7; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_LPR; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_MAIL; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_NEWS; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_SYSLOG; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_USER; PRIVATE extern const C_Int_t MLton_Syslog_Facility_LOG_UUCP; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_CONS; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_NDELAY; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_NOWAIT; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_ODELAY; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_PERROR; PRIVATE extern const C_Int_t MLton_Syslog_Logopt_LOG_PID; PRIVATE void MLton_Syslog_openlog(NullString8_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_ALERT; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_CRIT; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_DEBUG; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_EMERG; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_ERR; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_INFO; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_NOTICE; PRIVATE extern const C_Int_t MLton_Syslog_Severity_LOG_WARNING; PRIVATE void MLton_Syslog_syslog(C_Int_t,NullString8_t); PRIVATE Word32_t Net_htonl(Word32_t); PRIVATE Word16_t Net_htons(Word16_t); PRIVATE Word32_t Net_ntohl(Word32_t); PRIVATE Word16_t Net_ntohs(Word16_t); PRIVATE C_Int_t NetHostDB_getByAddress(Vector(Word8_t),C_Socklen_t); PRIVATE C_Int_t NetHostDB_getByName(NullString8_t); PRIVATE void NetHostDB_getEntryAddrsN(C_Int_t,Array(Word8_t)); PRIVATE C_Int_t NetHostDB_getEntryAddrsNum(void); PRIVATE C_Int_t NetHostDB_getEntryAddrType(void); PRIVATE C_String_t NetHostDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetHostDB_getEntryAliasesNum(void); PRIVATE C_Int_t NetHostDB_getEntryLength(void); PRIVATE C_String_t NetHostDB_getEntryName(void); PRIVATE C_Errno_t(C_Int_t) NetHostDB_getHostName(Array(Char8_t),C_Size_t); PRIVATE extern const C_Int_t NetHostDB_INADDR_ANY; PRIVATE extern const C_Size_t NetHostDB_inAddrSize; PRIVATE C_Int_t NetProtDB_getByName(NullString8_t); PRIVATE C_Int_t NetProtDB_getByNumber(C_Int_t); PRIVATE C_String_t NetProtDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetProtDB_getEntryAliasesNum(void); PRIVATE C_String_t NetProtDB_getEntryName(void); PRIVATE C_Int_t NetProtDB_getEntryProto(void); PRIVATE C_Int_t NetServDB_getByName(NullString8_t,NullString8_t); PRIVATE C_Int_t NetServDB_getByNameNull(NullString8_t); PRIVATE C_Int_t NetServDB_getByPort(C_Int_t,NullString8_t); PRIVATE C_Int_t NetServDB_getByPortNull(C_Int_t); PRIVATE C_String_t NetServDB_getEntryAliasesN(C_Int_t); PRIVATE C_Int_t NetServDB_getEntryAliasesNum(void); PRIVATE C_String_t NetServDB_getEntryName(void); PRIVATE C_Int_t NetServDB_getEntryPort(void); PRIVATE C_String_t NetServDB_getEntryProto(void); PRIVATE C_Errno_t(C_Int_t) OS_IO_poll(Vector(C_Fd_t),Vector(C_Short_t),C_NFds_t,C_Int_t,Array(C_Short_t)); PRIVATE extern const C_Short_t OS_IO_POLLIN; PRIVATE extern const C_Short_t OS_IO_POLLOUT; PRIVATE extern const C_Short_t OS_IO_POLLPRI; PRIVATE void Posix_Error_clearErrno(void); PRIVATE extern const C_Int_t Posix_Error_E2BIG; PRIVATE extern const C_Int_t Posix_Error_EACCES; PRIVATE extern const C_Int_t Posix_Error_EADDRINUSE; PRIVATE extern const C_Int_t Posix_Error_EADDRNOTAVAIL; PRIVATE extern const C_Int_t Posix_Error_EAFNOSUPPORT; PRIVATE extern const C_Int_t Posix_Error_EAGAIN; PRIVATE extern const C_Int_t Posix_Error_EALREADY; PRIVATE extern const C_Int_t Posix_Error_EBADF; PRIVATE extern const C_Int_t Posix_Error_EBADMSG; PRIVATE extern const C_Int_t Posix_Error_EBUSY; PRIVATE extern const C_Int_t Posix_Error_ECANCELED; PRIVATE extern const C_Int_t Posix_Error_ECHILD; PRIVATE extern const C_Int_t Posix_Error_ECONNABORTED; PRIVATE extern const C_Int_t Posix_Error_ECONNREFUSED; PRIVATE extern const C_Int_t Posix_Error_ECONNRESET; PRIVATE extern const C_Int_t Posix_Error_EDEADLK; PRIVATE extern const C_Int_t Posix_Error_EDESTADDRREQ; PRIVATE extern const C_Int_t Posix_Error_EDOM; PRIVATE extern const C_Int_t Posix_Error_EDQUOT; PRIVATE extern const C_Int_t Posix_Error_EEXIST; PRIVATE extern const C_Int_t Posix_Error_EFAULT; PRIVATE extern const C_Int_t Posix_Error_EFBIG; PRIVATE extern const C_Int_t Posix_Error_EHOSTUNREACH; PRIVATE extern const C_Int_t Posix_Error_EIDRM; PRIVATE extern const C_Int_t Posix_Error_EILSEQ; PRIVATE extern const C_Int_t Posix_Error_EINPROGRESS; PRIVATE extern const C_Int_t Posix_Error_EINTR; PRIVATE extern const C_Int_t Posix_Error_EINVAL; PRIVATE extern const C_Int_t Posix_Error_EIO; PRIVATE extern const C_Int_t Posix_Error_EISCONN; PRIVATE extern const C_Int_t Posix_Error_EISDIR; PRIVATE extern const C_Int_t Posix_Error_ELOOP; PRIVATE extern const C_Int_t Posix_Error_EMFILE; PRIVATE extern const C_Int_t Posix_Error_EMLINK; PRIVATE extern const C_Int_t Posix_Error_EMSGSIZE; PRIVATE extern const C_Int_t Posix_Error_EMULTIHOP; PRIVATE extern const C_Int_t Posix_Error_ENAMETOOLONG; PRIVATE extern const C_Int_t Posix_Error_ENETDOWN; PRIVATE extern const C_Int_t Posix_Error_ENETRESET; PRIVATE extern const C_Int_t Posix_Error_ENETUNREACH; PRIVATE extern const C_Int_t Posix_Error_ENFILE; PRIVATE extern const C_Int_t Posix_Error_ENOBUFS; PRIVATE extern const C_Int_t Posix_Error_ENODATA; PRIVATE extern const C_Int_t Posix_Error_ENODEV; PRIVATE extern const C_Int_t Posix_Error_ENOENT; PRIVATE extern const C_Int_t Posix_Error_ENOEXEC; PRIVATE extern const C_Int_t Posix_Error_ENOLCK; PRIVATE extern const C_Int_t Posix_Error_ENOLINK; PRIVATE extern const C_Int_t Posix_Error_ENOMEM; PRIVATE extern const C_Int_t Posix_Error_ENOMSG; PRIVATE extern const C_Int_t Posix_Error_ENOPROTOOPT; PRIVATE extern const C_Int_t Posix_Error_ENOSPC; PRIVATE extern const C_Int_t Posix_Error_ENOSR; PRIVATE extern const C_Int_t Posix_Error_ENOSTR; PRIVATE extern const C_Int_t Posix_Error_ENOSYS; PRIVATE extern const C_Int_t Posix_Error_ENOTCONN; PRIVATE extern const C_Int_t Posix_Error_ENOTDIR; PRIVATE extern const C_Int_t Posix_Error_ENOTEMPTY; PRIVATE extern const C_Int_t Posix_Error_ENOTSOCK; PRIVATE extern const C_Int_t Posix_Error_ENOTSUP; PRIVATE extern const C_Int_t Posix_Error_ENOTTY; PRIVATE extern const C_Int_t Posix_Error_ENXIO; PRIVATE extern const C_Int_t Posix_Error_EOPNOTSUPP; PRIVATE extern const C_Int_t Posix_Error_EOVERFLOW; PRIVATE extern const C_Int_t Posix_Error_EPERM; PRIVATE extern const C_Int_t Posix_Error_EPIPE; PRIVATE extern const C_Int_t Posix_Error_EPROTO; PRIVATE extern const C_Int_t Posix_Error_EPROTONOSUPPORT; PRIVATE extern const C_Int_t Posix_Error_EPROTOTYPE; PRIVATE extern const C_Int_t Posix_Error_ERANGE; PRIVATE extern const C_Int_t Posix_Error_EROFS; PRIVATE extern const C_Int_t Posix_Error_ESPIPE; PRIVATE extern const C_Int_t Posix_Error_ESRCH; PRIVATE extern const C_Int_t Posix_Error_ESTALE; PRIVATE extern const C_Int_t Posix_Error_ETIME; PRIVATE extern const C_Int_t Posix_Error_ETIMEDOUT; PRIVATE extern const C_Int_t Posix_Error_ETXTBSY; PRIVATE extern const C_Int_t Posix_Error_EWOULDBLOCK; PRIVATE extern const C_Int_t Posix_Error_EXDEV; PRIVATE C_Int_t Posix_Error_getErrno(void); PRIVATE C_String_t Posix_Error_strError(C_Int_t); PRIVATE extern const C_Int_t Posix_FileSys_A_F_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_R_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_W_OK; PRIVATE extern const C_Int_t Posix_FileSys_A_X_OK; PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_access(NullString8_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chdir(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chmod(NullString8_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_chown(NullString8_t,C_UId_t,C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Dirstream_closeDir(C_DirP_t); PRIVATE C_Errno_t(C_DirP_t) Posix_FileSys_Dirstream_openDir(NullString8_t); PRIVATE C_Errno_t(C_String_t) Posix_FileSys_Dirstream_readDir(C_DirP_t); PRIVATE void Posix_FileSys_Dirstream_rewindDir(C_DirP_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchdir(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchmod(C_Fd_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_fchown(C_Fd_t,C_UId_t,C_GId_t); PRIVATE C_Errno_t(C_Long_t) Posix_FileSys_fpathconf(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_ftruncate(C_Fd_t,C_Off_t); PRIVATE C_Errno_t(C_String_t) Posix_FileSys_getcwd(Array(Char8_t),C_Size_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_link(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_mkdir(NullString8_t,C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_mkfifo(NullString8_t,C_Mode_t); PRIVATE extern const C_Int_t Posix_FileSys_O_APPEND; PRIVATE extern const C_Int_t Posix_FileSys_O_BINARY; PRIVATE extern const C_Int_t Posix_FileSys_O_CREAT; PRIVATE extern const C_Int_t Posix_FileSys_O_DSYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_EXCL; PRIVATE extern const C_Int_t Posix_FileSys_O_NOCTTY; PRIVATE extern const C_Int_t Posix_FileSys_O_NONBLOCK; PRIVATE extern const C_Int_t Posix_FileSys_O_RDONLY; PRIVATE extern const C_Int_t Posix_FileSys_O_RDWR; PRIVATE extern const C_Int_t Posix_FileSys_O_RSYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_SYNC; PRIVATE extern const C_Int_t Posix_FileSys_O_TEXT; PRIVATE extern const C_Int_t Posix_FileSys_O_TRUNC; PRIVATE extern const C_Int_t Posix_FileSys_O_WRONLY; PRIVATE C_Errno_t(C_Fd_t) Posix_FileSys_open2(NullString8_t,C_Int_t); PRIVATE C_Errno_t(C_Fd_t) Posix_FileSys_open3(NullString8_t,C_Int_t,C_Mode_t); PRIVATE C_Errno_t(C_Long_t) Posix_FileSys_pathconf(NullString8_t,C_Int_t); PRIVATE extern const C_Int_t Posix_FileSys_PC_ALLOC_SIZE_MIN; PRIVATE extern const C_Int_t Posix_FileSys_PC_ASYNC_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_CHOWN_RESTRICTED; PRIVATE extern const C_Int_t Posix_FileSys_PC_FILESIZEBITS; PRIVATE extern const C_Int_t Posix_FileSys_PC_LINK_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_MAX_CANON; PRIVATE extern const C_Int_t Posix_FileSys_PC_MAX_INPUT; PRIVATE extern const C_Int_t Posix_FileSys_PC_NAME_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_NO_TRUNC; PRIVATE extern const C_Int_t Posix_FileSys_PC_PATH_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_PIPE_BUF; PRIVATE extern const C_Int_t Posix_FileSys_PC_PRIO_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_INCR_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_MAX_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_MIN_XFER_SIZE; PRIVATE extern const C_Int_t Posix_FileSys_PC_REC_XFER_ALIGN; PRIVATE extern const C_Int_t Posix_FileSys_PC_SYMLINK_MAX; PRIVATE extern const C_Int_t Posix_FileSys_PC_SYNC_IO; PRIVATE extern const C_Int_t Posix_FileSys_PC_TWO_SYMLINKS; PRIVATE extern const C_Int_t Posix_FileSys_PC_VDISABLE; PRIVATE C_Errno_t(C_SSize_t) Posix_FileSys_readlink(NullString8_t,Array(Char8_t),C_Size_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_rename(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_rmdir(NullString8_t); PRIVATE extern const C_Mode_t Posix_FileSys_S_IFBLK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFCHR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFDIR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFIFO; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFLNK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFMT; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFREG; PRIVATE extern const C_Mode_t Posix_FileSys_S_IFSOCK; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IROTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRUSR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXG; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXO; PRIVATE extern const C_Mode_t Posix_FileSys_S_IRWXU; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISGID; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISUID; PRIVATE extern const C_Mode_t Posix_FileSys_S_ISVTX; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWOTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IWUSR; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXGRP; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXOTH; PRIVATE extern const C_Mode_t Posix_FileSys_S_IXUSR; PRIVATE C_Int_t Posix_FileSys_ST_isBlk(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isChr(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isDir(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isFIFO(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isLink(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isReg(C_Mode_t); PRIVATE C_Int_t Posix_FileSys_ST_isSock(C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_fstat(C_Fd_t); PRIVATE C_Time_t Posix_FileSys_Stat_getATime(void); PRIVATE C_Time_t Posix_FileSys_Stat_getCTime(void); PRIVATE C_Dev_t Posix_FileSys_Stat_getDev(void); PRIVATE C_GId_t Posix_FileSys_Stat_getGId(void); PRIVATE C_INo_t Posix_FileSys_Stat_getINo(void); PRIVATE C_Mode_t Posix_FileSys_Stat_getMode(void); PRIVATE C_Time_t Posix_FileSys_Stat_getMTime(void); PRIVATE C_NLink_t Posix_FileSys_Stat_getNLink(void); PRIVATE C_Dev_t Posix_FileSys_Stat_getRDev(void); PRIVATE C_Off_t Posix_FileSys_Stat_getSize(void); PRIVATE C_UId_t Posix_FileSys_Stat_getUId(void); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_lstat(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Stat_stat(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_symlink(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_truncate(NullString8_t,C_Off_t); PRIVATE C_Mode_t Posix_FileSys_umask(C_Mode_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_unlink(NullString8_t); PRIVATE void Posix_FileSys_Utimbuf_setAcTime(C_Time_t); PRIVATE void Posix_FileSys_Utimbuf_setModTime(C_Time_t); PRIVATE C_Errno_t(C_Int_t) Posix_FileSys_Utimbuf_utime(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_close(C_Fd_t); PRIVATE C_Errno_t(C_Fd_t) Posix_IO_dup(C_Fd_t); PRIVATE C_Errno_t(C_Fd_t) Posix_IO_dup2(C_Fd_t,C_Fd_t); PRIVATE extern const C_Int_t Posix_IO_F_DUPFD; PRIVATE extern const C_Int_t Posix_IO_F_GETFD; PRIVATE extern const C_Int_t Posix_IO_F_GETFL; PRIVATE extern const C_Int_t Posix_IO_F_GETOWN; PRIVATE extern const C_Int_t Posix_IO_F_SETFD; PRIVATE extern const C_Int_t Posix_IO_F_SETFL; PRIVATE extern const C_Int_t Posix_IO_F_SETOWN; PRIVATE C_Errno_t(C_Int_t) Posix_IO_fcntl2(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_fcntl3(C_Fd_t,C_Int_t,C_Int_t); PRIVATE extern const C_Int_t Posix_IO_FD_CLOEXEC; PRIVATE extern const C_Int_t Posix_IO_FLock_F_GETLK; PRIVATE extern const C_Short_t Posix_IO_FLock_F_RDLCK; PRIVATE extern const C_Int_t Posix_IO_FLock_F_SETLK; PRIVATE extern const C_Int_t Posix_IO_FLock_F_SETLKW; PRIVATE extern const C_Short_t Posix_IO_FLock_F_UNLCK; PRIVATE extern const C_Short_t Posix_IO_FLock_F_WRLCK; PRIVATE C_Errno_t(C_Int_t) Posix_IO_FLock_fcntl(C_Fd_t,C_Int_t); PRIVATE C_Off_t Posix_IO_FLock_getLen(void); PRIVATE C_PId_t Posix_IO_FLock_getPId(void); PRIVATE C_Off_t Posix_IO_FLock_getStart(void); PRIVATE C_Short_t Posix_IO_FLock_getType(void); PRIVATE C_Short_t Posix_IO_FLock_getWhence(void); PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_CUR; PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_END; PRIVATE extern const C_Short_t Posix_IO_FLock_SEEK_SET; PRIVATE void Posix_IO_FLock_setLen(C_Off_t); PRIVATE void Posix_IO_FLock_setPId(C_PId_t); PRIVATE void Posix_IO_FLock_setStart(C_Off_t); PRIVATE void Posix_IO_FLock_setType(C_Short_t); PRIVATE void Posix_IO_FLock_setWhence(C_Short_t); PRIVATE C_Errno_t(C_Int_t) Posix_IO_fsync(C_Fd_t); PRIVATE C_Errno_t(C_Off_t) Posix_IO_lseek(C_Fd_t,C_Off_t,C_Int_t); PRIVATE extern const C_Int_t Posix_IO_O_ACCMODE; PRIVATE C_Errno_t(C_Int_t) Posix_IO_pipe(Array(C_Fd_t)); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_readChar8(C_Fd_t,Array(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_readWord8(C_Fd_t,Array(Word8_t),C_Int_t,C_Size_t); PRIVATE extern const C_Int_t Posix_IO_SEEK_CUR; PRIVATE extern const C_Int_t Posix_IO_SEEK_END; PRIVATE extern const C_Int_t Posix_IO_SEEK_SET; PRIVATE void Posix_IO_setbin(C_Fd_t); PRIVATE void Posix_IO_settext(C_Fd_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeChar8Arr(C_Fd_t,Array(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeChar8Vec(C_Fd_t,Vector(Char8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeWord8Arr(C_Fd_t,Array(Word8_t),C_Int_t,C_Size_t); PRIVATE C_Errno_t(C_SSize_t) Posix_IO_writeWord8Vec(C_Fd_t,Vector(Word8_t),C_Int_t,C_Size_t); PRIVATE C_String_t Posix_ProcEnv_ctermid(void); PRIVATE extern C_StringArray_t Posix_ProcEnv_environ; PRIVATE C_GId_t Posix_ProcEnv_getegid(void); PRIVATE C_String_t Posix_ProcEnv_getenv(NullString8_t); PRIVATE C_UId_t Posix_ProcEnv_geteuid(void); PRIVATE C_GId_t Posix_ProcEnv_getgid(void); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_getgroups(C_Int_t,Array(C_GId_t)); PRIVATE C_Int_t Posix_ProcEnv_getgroupsN(void); PRIVATE C_Errno_t(C_String_t) Posix_ProcEnv_getlogin(void); PRIVATE C_PId_t Posix_ProcEnv_getpgrp(void); PRIVATE C_PId_t Posix_ProcEnv_getpid(void); PRIVATE C_PId_t Posix_ProcEnv_getppid(void); PRIVATE C_UId_t Posix_ProcEnv_getuid(void); PRIVATE C_Int_t Posix_ProcEnv_isatty(C_Fd_t); PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_C_BIND; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_C_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_CHAR_TERM; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_FORT_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_FORT_RUN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_LOCALEDEF; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_ACCOUNTING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_CHECKPOINT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_LOCATE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_MESSAGE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_PBS_TRACK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_SW_DEV; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_UPE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_2_VERSION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ADVISORY_INFO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_LISTIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ARG_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ASYNCHRONOUS_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_ATEXIT_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BARRIERS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_BASE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_DIM_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_SCALE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_BC_STRING_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CHILD_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CLK_TCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CLOCK_SELECTION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_COLL_WEIGHTS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_CPUTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_DELAYTIMER_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_EXPR_NEST_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_FSYNC; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_GETGR_R_SIZE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_GETPW_R_SIZE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_HOST_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_IOV_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_IPV6; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_JOB_CONTROL; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_LINE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_LOGIN_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MAPPED_FILES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMLOCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMLOCK_RANGE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MEMORY_PROTECTION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MESSAGE_PASSING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MONOTONIC_CLOCK; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MQ_OPEN_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_MQ_PRIO_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_NGROUPS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_OPEN_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PAGE_SIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PAGESIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PRIORITIZED_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_PRIORITY_SCHEDULING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RAW_SOCKETS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RE_DUP_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_READER_WRITER_LOCKS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_REALTIME_SIGNALS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_REGEXP; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_RTSIG_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SAVED_IDS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEM_NSEMS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEM_VALUE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SEMAPHORES; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SHELL; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SIGQUEUE_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPAWN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPIN_LOCKS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SPORADIC_SERVER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SS_REPL_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_STREAM_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SYMLOOP_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_SYNCHRONIZED_IO; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_CPUTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_KEYS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_INHERIT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIO_PROTECT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_PROCESS_SHARED; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_STACK_MIN; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREAD_THREADS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_THREADS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMEOUTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMER_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TIMERS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_FILTER; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_INHERIT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_LOG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_SYS_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TTY_NAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_TZNAME_MAX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFF32; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_ILP32_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_LP64_OFF64; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_V6_LPBIG_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_VERSION; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFF32; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_LP64_OFF64; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_CRYPT; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_ENH_I18N; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_LEGACY; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_SHM; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_STREAMS; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_UNIX; PRIVATE extern const C_Int_t Posix_ProcEnv_SC_XOPEN_VERSION; PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setenv(NullString8_t,NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setgid(C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setgroups(C_Int_t,Vector(C_GId_t)); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setpgid(C_PId_t,C_PId_t); PRIVATE C_Errno_t(C_PId_t) Posix_ProcEnv_setsid(void); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_setuid(C_UId_t); PRIVATE C_Errno_t(C_Long_t) Posix_ProcEnv_sysconf(C_Int_t); PRIVATE C_Errno_t(C_Clock_t) Posix_ProcEnv_times(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getCSTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getCUTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getSTime(void); PRIVATE C_Clock_t Posix_ProcEnv_Times_getUTime(void); PRIVATE C_Errno_t(C_String_t) Posix_ProcEnv_ttyname(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_ProcEnv_uname(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getMachine(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getNodeName(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getRelease(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getSysName(void); PRIVATE C_String_t Posix_ProcEnv_Uname_getVersion(void); PRIVATE C_UInt_t Posix_Process_alarm(C_UInt_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_exece(NullString8_t,Array(NullString8_t),Array(NullString8_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Process_execp(NullString8_t,Array(NullString8_t)); PRIVATE __attribute__((noreturn)) void Posix_Process_exit(C_Status_t); PRIVATE C_Int_t Posix_Process_exitStatus(C_Status_t); PRIVATE C_Errno_t(C_PId_t) Posix_Process_fork(void); PRIVATE C_Int_t Posix_Process_ifExited(C_Status_t); PRIVATE C_Int_t Posix_Process_ifSignaled(C_Status_t); PRIVATE C_Int_t Posix_Process_ifStopped(C_Status_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_kill(C_PId_t,C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Process_nanosleep(Ref(C_Time_t),Ref(C_Long_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Process_pause(void); PRIVATE C_UInt_t Posix_Process_sleep(C_UInt_t); PRIVATE C_Signal_t Posix_Process_stopSig(C_Status_t); PRIVATE C_Errno_t(C_Status_t) Posix_Process_system(NullString8_t); PRIVATE C_Signal_t Posix_Process_termSig(C_Status_t); PRIVATE extern const C_Int_t Posix_Process_W_NOHANG; PRIVATE extern const C_Int_t Posix_Process_W_UNTRACED; PRIVATE C_Errno_t(C_PId_t) Posix_Process_waitpid(C_PId_t,Ref(C_Status_t),C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_default(C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_handlee(C_Signal_t); PRIVATE void Posix_Signal_handleGC(void); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_ignore(C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_isDefault(C_Signal_t,Ref(C_Int_t)); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_isIgnore(C_Signal_t,Ref(C_Int_t)); PRIVATE C_Int_t Posix_Signal_isPending(C_Signal_t); PRIVATE C_Int_t Posix_Signal_isPendingGC(void); PRIVATE extern const C_Int_t Posix_Signal_NSIG; PRIVATE void Posix_Signal_resetPending(void); PRIVATE extern const C_Int_t Posix_Signal_SIG_BLOCK; PRIVATE extern const C_Int_t Posix_Signal_SIG_SETMASK; PRIVATE extern const C_Int_t Posix_Signal_SIG_UNBLOCK; PRIVATE extern const C_Signal_t Posix_Signal_SIGABRT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigaddset(C_Signal_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGALRM; PRIVATE extern const C_Signal_t Posix_Signal_SIGBUS; PRIVATE extern const C_Signal_t Posix_Signal_SIGCHLD; PRIVATE extern const C_Signal_t Posix_Signal_SIGCONT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigdelset(C_Signal_t); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigemptyset(void); PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigfillset(void); PRIVATE extern const C_Signal_t Posix_Signal_SIGFPE; PRIVATE extern const C_Signal_t Posix_Signal_SIGHUP; PRIVATE extern const C_Signal_t Posix_Signal_SIGILL; PRIVATE extern const C_Signal_t Posix_Signal_SIGINT; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigismember(C_Signal_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGKILL; PRIVATE extern const C_Signal_t Posix_Signal_SIGPIPE; PRIVATE extern const C_Signal_t Posix_Signal_SIGPOLL; PRIVATE C_Errno_t(C_Int_t) Posix_Signal_sigprocmask(C_Int_t); PRIVATE extern const C_Signal_t Posix_Signal_SIGPROF; PRIVATE extern const C_Signal_t Posix_Signal_SIGQUIT; PRIVATE extern const C_Signal_t Posix_Signal_SIGSEGV; PRIVATE extern const C_Signal_t Posix_Signal_SIGSTOP; PRIVATE void Posix_Signal_sigsuspend(void); PRIVATE extern const C_Signal_t Posix_Signal_SIGSYS; PRIVATE extern const C_Signal_t Posix_Signal_SIGTERM; PRIVATE extern const C_Signal_t Posix_Signal_SIGTRAP; PRIVATE extern const C_Signal_t Posix_Signal_SIGTSTP; PRIVATE extern const C_Signal_t Posix_Signal_SIGTTIN; PRIVATE extern const C_Signal_t Posix_Signal_SIGTTOU; PRIVATE extern const C_Signal_t Posix_Signal_SIGURG; PRIVATE extern const C_Signal_t Posix_Signal_SIGUSR1; PRIVATE extern const C_Signal_t Posix_Signal_SIGUSR2; PRIVATE extern const C_Signal_t Posix_Signal_SIGVTALRM; PRIVATE extern const C_Signal_t Posix_Signal_SIGXCPU; PRIVATE extern const C_Signal_t Posix_Signal_SIGXFSZ; PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getgrgid(C_GId_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getgrnam(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getpwnam(NullString8_t); PRIVATE C_Errno_t(C_Int_t) Posix_SysDB_getpwuid(C_GId_t); PRIVATE C_GId_t Posix_SysDB_Group_getGId(void); PRIVATE C_StringArray_t Posix_SysDB_Group_getMem(void); PRIVATE C_String_t Posix_SysDB_Group_getName(void); PRIVATE C_String_t Posix_SysDB_Passwd_getDir(void); PRIVATE C_GId_t Posix_SysDB_Passwd_getGId(void); PRIVATE C_String_t Posix_SysDB_Passwd_getName(void); PRIVATE C_String_t Posix_SysDB_Passwd_getShell(void); PRIVATE C_UId_t Posix_SysDB_Passwd_getUId(void); PRIVATE extern const C_Speed_t Posix_TTY_B0; PRIVATE extern const C_Speed_t Posix_TTY_B110; PRIVATE extern const C_Speed_t Posix_TTY_B1200; PRIVATE extern const C_Speed_t Posix_TTY_B134; PRIVATE extern const C_Speed_t Posix_TTY_B150; PRIVATE extern const C_Speed_t Posix_TTY_B1800; PRIVATE extern const C_Speed_t Posix_TTY_B19200; PRIVATE extern const C_Speed_t Posix_TTY_B200; PRIVATE extern const C_Speed_t Posix_TTY_B2400; PRIVATE extern const C_Speed_t Posix_TTY_B300; PRIVATE extern const C_Speed_t Posix_TTY_B38400; PRIVATE extern const C_Speed_t Posix_TTY_B4800; PRIVATE extern const C_Speed_t Posix_TTY_B50; PRIVATE extern const C_Speed_t Posix_TTY_B600; PRIVATE extern const C_Speed_t Posix_TTY_B75; PRIVATE extern const C_Speed_t Posix_TTY_B9600; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CLOCAL; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CREAD; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS5; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS6; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS7; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CS8; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CSIZE; PRIVATE extern const C_TCFlag_t Posix_TTY_C_CSTOPB; PRIVATE extern const C_TCFlag_t Posix_TTY_C_HUPCL; PRIVATE extern const C_TCFlag_t Posix_TTY_C_PARENB; PRIVATE extern const C_TCFlag_t Posix_TTY_C_PARODD; PRIVATE extern const C_TCFlag_t Posix_TTY_I_BRKINT; PRIVATE extern const C_TCFlag_t Posix_TTY_I_ICRNL; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNBRK; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNCR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IGNPAR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_INLCR; PRIVATE extern const C_TCFlag_t Posix_TTY_I_INPCK; PRIVATE extern const C_TCFlag_t Posix_TTY_I_ISTRIP; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXANY; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXOFF; PRIVATE extern const C_TCFlag_t Posix_TTY_I_IXON; PRIVATE extern const C_TCFlag_t Posix_TTY_I_PARMRK; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHO; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHOE; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHOK; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ECHONL; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ICANON; PRIVATE extern const C_TCFlag_t Posix_TTY_L_IEXTEN; PRIVATE extern const C_TCFlag_t Posix_TTY_L_ISIG; PRIVATE extern const C_TCFlag_t Posix_TTY_L_NOFLSH; PRIVATE extern const C_TCFlag_t Posix_TTY_L_TOSTOP; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BS0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BS1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_BSDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR2; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CR3; PRIVATE extern const C_TCFlag_t Posix_TTY_O_CRDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FF0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FF1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_FFDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NL0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NL1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_NLDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OCRNL; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OFILL; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONLCR; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONLRET; PRIVATE extern const C_TCFlag_t Posix_TTY_O_ONOCR; PRIVATE extern const C_TCFlag_t Posix_TTY_O_OPOST; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB2; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TAB3; PRIVATE extern const C_TCFlag_t Posix_TTY_O_TABDLY; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VT0; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VT1; PRIVATE extern const C_TCFlag_t Posix_TTY_O_VTDLY; PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_drain(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_flow(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_flush(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_getattr(C_Fd_t); PRIVATE C_Errno_t(C_PId_t) Posix_TTY_TC_getpgrp(C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_sendbreak(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_setattr(C_Fd_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_TC_setpgrp(C_Fd_t,C_PId_t); PRIVATE extern const C_Int_t Posix_TTY_TC_TCIFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCIOFF; PRIVATE extern const C_Int_t Posix_TTY_TC_TCIOFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCION; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOOFF; PRIVATE extern const C_Int_t Posix_TTY_TC_TCOON; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSADRAIN; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSAFLUSH; PRIVATE extern const C_Int_t Posix_TTY_TC_TCSANOW; PRIVATE C_Speed_t Posix_TTY_Termios_cfGetISpeed(void); PRIVATE C_Speed_t Posix_TTY_Termios_cfGetOSpeed(void); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetISpeed(C_Speed_t); PRIVATE C_Errno_t(C_Int_t) Posix_TTY_Termios_cfSetOSpeed(C_Speed_t); PRIVATE void Posix_TTY_Termios_getCC(Array(C_CC_t)); PRIVATE C_TCFlag_t Posix_TTY_Termios_getCFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getIFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getLFlag(void); PRIVATE C_TCFlag_t Posix_TTY_Termios_getOFlag(void); PRIVATE void Posix_TTY_Termios_setCC(Array(C_CC_t)); PRIVATE void Posix_TTY_Termios_setCFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setIFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setLFlag(C_TCFlag_t); PRIVATE void Posix_TTY_Termios_setOFlag(C_TCFlag_t); PRIVATE extern const C_Int_t Posix_TTY_V_NCCS; PRIVATE extern const C_Int_t Posix_TTY_V_VEOF; PRIVATE extern const C_Int_t Posix_TTY_V_VEOL; PRIVATE extern const C_Int_t Posix_TTY_V_VERASE; PRIVATE extern const C_Int_t Posix_TTY_V_VINTR; PRIVATE extern const C_Int_t Posix_TTY_V_VKILL; PRIVATE extern const C_Int_t Posix_TTY_V_VMIN; PRIVATE extern const C_Int_t Posix_TTY_V_VQUIT; PRIVATE extern const C_Int_t Posix_TTY_V_VSTART; PRIVATE extern const C_Int_t Posix_TTY_V_VSTOP; PRIVATE extern const C_Int_t Posix_TTY_V_VSUSP; PRIVATE extern const C_Int_t Posix_TTY_V_VTIME; MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_abs(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_add(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Real32_castToWord32(Real32_t); PRIVATE C_Int_t Real32_class(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_div(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real32_equal(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_fetch(Ref(Real32_t)); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_frexp(Real32_t,Ref(C_Int_t)); PRIVATE C_String_t Real32_gdtoa(Real32_t,C_Int_t,C_Int_t,C_Int_t,Ref(C_Int_t)); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_ldexp(Real32_t,C_Int_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real32_le(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real32_lt(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_acos(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_asin(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_atan(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_atan2(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_cos(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_cosh(Real32_t); PRIVATE extern Real32_t Real32_Math_e; MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_exp(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_ln(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_log10(Real32_t); PRIVATE extern Real32_t Real32_Math_pi; MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_pow(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_sin(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_sinh(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_sqrt(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_tan(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_Math_tanh(Real32_t); PRIVATE extern Real32_t Real32_maxFinite; PRIVATE extern Real32_t Real32_minNormalPos; PRIVATE extern Real32_t Real32_minPos; MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_modf(Real32_t,Ref(Real32_t)); MLTON_CODEGEN_STATIC_INLINE void Real32_move(Ref(Real32_t),Ref(Real32_t)); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_mul(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_muladd(Real32_t,Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_mulsub(Real32_t,Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_neg(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_rndToReal32(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real32_rndToReal64(Real32_t); MLTON_CODEGEN_STATIC_INLINE Int16_t Real32_rndToWordS16(Real32_t); MLTON_CODEGEN_STATIC_INLINE Int32_t Real32_rndToWordS32(Real32_t); MLTON_CODEGEN_STATIC_INLINE Int64_t Real32_rndToWordS64(Real32_t); MLTON_CODEGEN_STATIC_INLINE Int8_t Real32_rndToWordS8(Real32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Real32_rndToWordU16(Real32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Real32_rndToWordU32(Real32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Real32_rndToWordU64(Real32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Real32_rndToWordU8(Real32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_round(Real32_t); PRIVATE C_Int_t Real32_signBit(Real32_t); MLTON_CODEGEN_STATIC_INLINE void Real32_store(Ref(Real32_t),Real32_t); PRIVATE Real32_t Real32_strto(NullString8_t,C_Int_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real32_sub(Real32_t,Real32_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_abs(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_add(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Real64_castToWord64(Real64_t); PRIVATE C_Int_t Real64_class(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_div(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real64_equal(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_fetch(Ref(Real64_t)); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_frexp(Real64_t,Ref(C_Int_t)); PRIVATE C_String_t Real64_gdtoa(Real64_t,C_Int_t,C_Int_t,C_Int_t,Ref(C_Int_t)); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_ldexp(Real64_t,C_Int_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real64_le(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Real64_lt(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_acos(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_asin(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_atan(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_atan2(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_cos(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_cosh(Real64_t); PRIVATE extern Real64_t Real64_Math_e; MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_exp(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_ln(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_log10(Real64_t); PRIVATE extern Real64_t Real64_Math_pi; MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_pow(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_sin(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_sinh(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_sqrt(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_tan(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_Math_tanh(Real64_t); PRIVATE extern Real64_t Real64_maxFinite; PRIVATE extern Real64_t Real64_minNormalPos; PRIVATE extern Real64_t Real64_minPos; MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_modf(Real64_t,Ref(Real64_t)); MLTON_CODEGEN_STATIC_INLINE void Real64_move(Ref(Real64_t),Ref(Real64_t)); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_mul(Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_muladd(Real64_t,Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_mulsub(Real64_t,Real64_t,Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_neg(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Real64_rndToReal32(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_rndToReal64(Real64_t); MLTON_CODEGEN_STATIC_INLINE Int16_t Real64_rndToWordS16(Real64_t); MLTON_CODEGEN_STATIC_INLINE Int32_t Real64_rndToWordS32(Real64_t); MLTON_CODEGEN_STATIC_INLINE Int64_t Real64_rndToWordS64(Real64_t); MLTON_CODEGEN_STATIC_INLINE Int8_t Real64_rndToWordS8(Real64_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Real64_rndToWordU16(Real64_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Real64_rndToWordU32(Real64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Real64_rndToWordU64(Real64_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Real64_rndToWordU8(Real64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_round(Real64_t); PRIVATE C_Int_t Real64_signBit(Real64_t); MLTON_CODEGEN_STATIC_INLINE void Real64_store(Ref(Real64_t),Real64_t); PRIVATE Real64_t Real64_strto(NullString8_t,C_Int_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Real64_sub(Real64_t,Real64_t); PRIVATE C_Errno_t(C_Int_t) Socket_accept(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE extern const C_Int_t Socket_AF_INET; PRIVATE extern const C_Int_t Socket_AF_INET6; PRIVATE extern const C_Int_t Socket_AF_UNIX; PRIVATE extern const C_Int_t Socket_AF_UNSPEC; PRIVATE C_Errno_t(C_Int_t) Socket_bind(C_Sock_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_Int_t) Socket_close(C_Sock_t); PRIVATE C_Errno_t(C_Int_t) Socket_connect(C_Sock_t,Vector(Word8_t),C_Socklen_t); PRIVATE extern const C_Int_t Socket_Ctl_FIONBIO; PRIVATE extern const C_Int_t Socket_Ctl_FIONREAD; PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getIOCtl(C_Sock_t,C_Int_t,Array(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getPeerName(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockName(C_Sock_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_getSockOpt(C_Sock_t,C_Int_t,C_Int_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_setIOCtl(C_Sock_t,C_Int_t,Vector(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Socket_Ctl_setSockOpt(C_Sock_t,C_Int_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE extern const C_Int_t Socket_Ctl_SIOCATMARK; PRIVATE extern const C_Int_t Socket_Ctl_SO_ACCEPTCONN; PRIVATE extern const C_Int_t Socket_Ctl_SO_BROADCAST; PRIVATE extern const C_Int_t Socket_Ctl_SO_DEBUG; PRIVATE extern const C_Int_t Socket_Ctl_SO_DONTROUTE; PRIVATE extern const C_Int_t Socket_Ctl_SO_ERROR; PRIVATE extern const C_Int_t Socket_Ctl_SO_KEEPALIVE; PRIVATE extern const C_Int_t Socket_Ctl_SO_LINGER; PRIVATE extern const C_Int_t Socket_Ctl_SO_OOBINLINE; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVBUF; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVLOWAT; PRIVATE extern const C_Int_t Socket_Ctl_SO_RCVTIMEO; PRIVATE extern const C_Int_t Socket_Ctl_SO_REUSEADDR; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDBUF; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDLOWAT; PRIVATE extern const C_Int_t Socket_Ctl_SO_SNDTIMEO; PRIVATE extern const C_Int_t Socket_Ctl_SO_TYPE; PRIVATE extern const C_Int_t Socket_Ctl_SOL_SOCKET; PRIVATE C_Int_t Socket_familyOfAddr(Vector(Word8_t)); PRIVATE C_Errno_t(C_Int_t) Socket_GenericSock_socket(C_Int_t,C_Int_t,C_Int_t); PRIVATE C_Errno_t(C_Int_t) Socket_GenericSock_socketPair(C_Int_t,C_Int_t,C_Int_t,Array(C_Int_t)); PRIVATE C_Time_t Socket_getTimeout_sec(void); PRIVATE C_SUSeconds_t Socket_getTimeout_usec(void); PRIVATE extern const C_Int_t Socket_INetSock_Ctl_IPPROTO_TCP; PRIVATE extern const C_Int_t Socket_INetSock_Ctl_TCP_NODELAY; PRIVATE void Socket_INetSock_fromAddr(Vector(Word8_t)); PRIVATE void Socket_INetSock_getInAddr(Array(Word8_t)); PRIVATE Word16_t Socket_INetSock_getPort(void); PRIVATE void Socket_INetSock_toAddr(Vector(Word8_t),Word16_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_listen(C_Sock_t,C_Int_t); PRIVATE extern const C_Int_t Socket_MSG_CTRUNC; PRIVATE extern const C_Int_t Socket_MSG_DONTROUTE; PRIVATE extern const C_Int_t Socket_MSG_DONTWAIT; PRIVATE extern const C_Int_t Socket_MSG_EOR; PRIVATE extern const C_Int_t Socket_MSG_OOB; PRIVATE extern const C_Int_t Socket_MSG_PEEK; PRIVATE extern const C_Int_t Socket_MSG_TRUNC; PRIVATE extern const C_Int_t Socket_MSG_WAITALL; PRIVATE C_Errno_t(C_SSize_t) Socket_recv(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_recvFrom(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE C_Errno_t(C_Int_t) Socket_select(Vector(C_Fd_t),Vector(C_Fd_t),Vector(C_Fd_t),Array(C_Int_t),Array(C_Int_t),Array(C_Int_t)); PRIVATE C_Errno_t(C_SSize_t) Socket_sendArr(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendArrTo(C_Sock_t,Array(Word8_t),C_Int_t,C_Size_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendVec(C_Sock_t,Vector(Word8_t),C_Int_t,C_Size_t,C_Int_t); PRIVATE C_Errno_t(C_SSize_t) Socket_sendVecTo(C_Sock_t,Vector(Word8_t),C_Int_t,C_Size_t,C_Int_t,Vector(Word8_t),C_Socklen_t); PRIVATE void Socket_setTimeout(C_Time_t,C_SUSeconds_t); PRIVATE void Socket_setTimeoutNull(void); PRIVATE extern const C_Int_t Socket_SHUT_RD; PRIVATE extern const C_Int_t Socket_SHUT_RDWR; PRIVATE extern const C_Int_t Socket_SHUT_WR; PRIVATE C_Errno_t(C_Int_t) Socket_shutdown(C_Sock_t,C_Int_t); PRIVATE extern const C_Int_t Socket_SOCK_DGRAM; PRIVATE extern const C_Int_t Socket_SOCK_RAW; PRIVATE extern const C_Int_t Socket_SOCK_SEQPACKET; PRIVATE extern const C_Int_t Socket_SOCK_STREAM; PRIVATE extern const C_Size_t Socket_sockAddrStorageLen; PRIVATE void Socket_UnixSock_fromAddr(Vector(Word8_t),Array(Char8_t),C_Size_t); PRIVATE C_Size_t Socket_UnixSock_pathLen(Vector(Word8_t)); PRIVATE void Socket_UnixSock_toAddr(NullString8_t,C_Size_t,Array(Word8_t),Ref(C_Socklen_t)); PRIVATE void Stdio_print(String8_t); PRIVATE void Stdio_printStderr(String8_t); PRIVATE void Stdio_printStdout(String8_t); PRIVATE C_Int_t Time_getTimeOfDay(Ref(C_Time_t),Ref(C_SUSeconds_t)); PRIVATE C_Errno_t(C_PId_t) Windows_Process_create(NullString8_t,NullString8_t,NullString8_t,C_Fd_t,C_Fd_t,C_Fd_t); PRIVATE C_Errno_t(C_PId_t) Windows_Process_createNull(NullString8_t,NullString8_t,C_Fd_t,C_Fd_t,C_Fd_t); PRIVATE C_Errno_t(C_Int_t) Windows_Process_getexitcode(C_PId_t,Ref(C_Status_t)); PRIVATE C_Errno_t(C_Int_t) Windows_Process_terminate(C_PId_t,C_Signal_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_add(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_andb(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Word16_equal(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_lshift(Word16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_neg(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_notb(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_orb(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_rol(Word16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_ror(Word16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_sub(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t Word16_xorb(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_add(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_andb(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Real32_t Word32_castToReal32(Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Word32_equal(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_lshift(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_neg(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_notb(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_orb(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_rol(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_ror(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_sub(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t Word32_xorb(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_add(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_andb(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Real64_t Word64_castToReal64(Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Word64_equal(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_fetch(Ref(Word64_t)); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_lshift(Word64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE void Word64_move(Ref(Word64_t),Ref(Word64_t)); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_neg(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_notb(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_orb(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_rol(Word64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_ror(Word64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE void Word64_store(Ref(Word64_t),Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_sub(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t Word64_xorb(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_add(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_andb(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t Word8_equal(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_lshift(Word8_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_neg(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_notb(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_orb(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_rol(Word8_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_ror(Word8_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_sub(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t Word8_xorb(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_addCheckOverflows(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordS16_extdToWord16(Int16_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordS16_extdToWord32(Int16_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordS16_extdToWord64(Int16_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordS16_extdToWord8(Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_ge(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_gt(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_le(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_lt(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Int16_t WordS16_mul(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_mulCheckOverflows(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_negCheckOverflows(Int16_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int16_t WordS16_quot(Int16_t,Int16_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int16_t WordS16_rem(Int16_t,Int16_t); PRIVATE Real32_t WordS16_rndToReal32(Int16_t); PRIVATE Real64_t WordS16_rndToReal64(Int16_t); MLTON_CODEGEN_STATIC_INLINE Int16_t WordS16_rshift(Int16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS16_subCheckOverflows(Int16_t,Int16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_addCheckOverflows(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordS32_extdToWord16(Int32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordS32_extdToWord32(Int32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordS32_extdToWord64(Int32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordS32_extdToWord8(Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_ge(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_gt(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_le(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_lt(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Int32_t WordS32_mul(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_mulCheckOverflows(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_negCheckOverflows(Int32_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int32_t WordS32_quot(Int32_t,Int32_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int32_t WordS32_rem(Int32_t,Int32_t); PRIVATE Real32_t WordS32_rndToReal32(Int32_t); PRIVATE Real64_t WordS32_rndToReal64(Int32_t); MLTON_CODEGEN_STATIC_INLINE Int32_t WordS32_rshift(Int32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS32_subCheckOverflows(Int32_t,Int32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_addCheckOverflows(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordS64_extdToWord16(Int64_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordS64_extdToWord32(Int64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordS64_extdToWord64(Int64_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordS64_extdToWord8(Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_ge(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_gt(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_le(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_lt(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Int64_t WordS64_mul(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_mulCheckOverflows(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_negCheckOverflows(Int64_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int64_t WordS64_quot(Int64_t,Int64_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int64_t WordS64_rem(Int64_t,Int64_t); PRIVATE Real32_t WordS64_rndToReal32(Int64_t); PRIVATE Real64_t WordS64_rndToReal64(Int64_t); MLTON_CODEGEN_STATIC_INLINE Int64_t WordS64_rshift(Int64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS64_subCheckOverflows(Int64_t,Int64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_addCheckOverflows(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordS8_extdToWord16(Int8_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordS8_extdToWord32(Int8_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordS8_extdToWord64(Int8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordS8_extdToWord8(Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_ge(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_gt(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_le(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_lt(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Int8_t WordS8_mul(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_mulCheckOverflows(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_negCheckOverflows(Int8_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int8_t WordS8_quot(Int8_t,Int8_t); MLTON_CODEGEN_WORDSQUOTREM(MLTON_CODEGEN_STATIC_INLINE) Int8_t WordS8_rem(Int8_t,Int8_t); PRIVATE Real32_t WordS8_rndToReal32(Int8_t); PRIVATE Real64_t WordS8_rndToReal64(Int8_t); MLTON_CODEGEN_STATIC_INLINE Int8_t WordS8_rshift(Int8_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordS8_subCheckOverflows(Int8_t,Int8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_addCheckOverflows(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_extdToWord16(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU16_extdToWord32(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU16_extdToWord64(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU16_extdToWord8(Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_ge(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_gt(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_le(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_lt(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_mul(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU16_mulCheckOverflows(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_quot(Word16_t,Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_rem(Word16_t,Word16_t); PRIVATE Real32_t WordU16_rndToReal32(Word16_t); PRIVATE Real64_t WordU16_rndToReal64(Word16_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU16_rshift(Word16_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_addCheckOverflows(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU32_extdToWord16(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_extdToWord32(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU32_extdToWord64(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU32_extdToWord8(Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_ge(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_gt(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_le(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_lt(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_mul(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU32_mulCheckOverflows(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_quot(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_rem(Word32_t,Word32_t); PRIVATE Real32_t WordU32_rndToReal32(Word32_t); PRIVATE Real64_t WordU32_rndToReal64(Word32_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU32_rshift(Word32_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_addCheckOverflows(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU64_extdToWord16(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU64_extdToWord32(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_extdToWord64(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU64_extdToWord8(Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_ge(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_gt(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_le(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_lt(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_mul(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU64_mulCheckOverflows(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_quot(Word64_t,Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_rem(Word64_t,Word64_t); PRIVATE Real32_t WordU64_rndToReal32(Word64_t); PRIVATE Real64_t WordU64_rndToReal64(Word64_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU64_rshift(Word64_t,Word32_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_addCheckOverflows(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word16_t WordU8_extdToWord16(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word32_t WordU8_extdToWord32(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word64_t WordU8_extdToWord64(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_extdToWord8(Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_ge(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_gt(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_le(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_lt(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_mul(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Bool_t WordU8_mulCheckOverflows(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_quot(Word8_t,Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_rem(Word8_t,Word8_t); PRIVATE Real32_t WordU8_rndToReal32(Word8_t); PRIVATE Real64_t WordU8_rndToReal64(Word8_t); MLTON_CODEGEN_STATIC_INLINE Word8_t WordU8_rshift(Word8_t,Word32_t); #endif /* _MLTON_BASIS_FFI_H_ */ mlton-20100608/runtime/gen/basis-ffi.sml0000644000076600000240000024564411404435622016413 0ustar mtfstaff(* This file is automatically generated. Do not edit. *) local open Primitive in structure PrimitiveFFI = struct structure CommandLine = struct val (argcGet, argcSet) = _symbol "CommandLine_argc" private : (unit -> (C_Int.t)) * ((C_Int.t) -> unit); val (argvGet, argvSet) = _symbol "CommandLine_argv" private : (unit -> (C_StringArray.t)) * ((C_StringArray.t) -> unit); val (commandNameGet, commandNameSet) = _symbol "CommandLine_commandName" private : (unit -> (C_String.t)) * ((C_String.t) -> unit); end structure Cygwin = struct val toFullWindowsPath = _import "Cygwin_toFullWindowsPath" private : NullString8.t -> C_String.t; end structure Date = struct val gmTime = _import "Date_gmTime" private : (C_Time.t) ref -> (C_Int.t) C_Errno.t; val localOffset = _import "Date_localOffset" private : unit -> C_Double.t; val localTime = _import "Date_localTime" private : (C_Time.t) ref -> (C_Int.t) C_Errno.t; val mkTime = _import "Date_mkTime" private : unit -> (C_Time.t) C_Errno.t; val strfTime = _import "Date_strfTime" private : (Char8.t) array * C_Size.t * NullString8.t -> C_Size.t; structure Tm = struct val getHour = _import "Date_Tm_getHour" private : unit -> C_Int.t; val getIsDst = _import "Date_Tm_getIsDst" private : unit -> C_Int.t; val getMDay = _import "Date_Tm_getMDay" private : unit -> C_Int.t; val getMin = _import "Date_Tm_getMin" private : unit -> C_Int.t; val getMon = _import "Date_Tm_getMon" private : unit -> C_Int.t; val getSec = _import "Date_Tm_getSec" private : unit -> C_Int.t; val getWDay = _import "Date_Tm_getWDay" private : unit -> C_Int.t; val getYDay = _import "Date_Tm_getYDay" private : unit -> C_Int.t; val getYear = _import "Date_Tm_getYear" private : unit -> C_Int.t; val setHour = _import "Date_Tm_setHour" private : C_Int.t -> unit; val setIsDst = _import "Date_Tm_setIsDst" private : C_Int.t -> unit; val setMDay = _import "Date_Tm_setMDay" private : C_Int.t -> unit; val setMin = _import "Date_Tm_setMin" private : C_Int.t -> unit; val setMon = _import "Date_Tm_setMon" private : C_Int.t -> unit; val setSec = _import "Date_Tm_setSec" private : C_Int.t -> unit; val setWDay = _import "Date_Tm_setWDay" private : C_Int.t -> unit; val setYDay = _import "Date_Tm_setYDay" private : C_Int.t -> unit; val setYear = _import "Date_Tm_setYear" private : C_Int.t -> unit; end end structure IEEEReal = struct structure FloatClass = struct val FP_INFINITE = _const "IEEEReal_FloatClass_FP_INFINITE" : C_Int.t; val FP_NAN = _const "IEEEReal_FloatClass_FP_NAN" : C_Int.t; val FP_NORMAL = _const "IEEEReal_FloatClass_FP_NORMAL" : C_Int.t; val FP_SUBNORMAL = _const "IEEEReal_FloatClass_FP_SUBNORMAL" : C_Int.t; val FP_ZERO = _const "IEEEReal_FloatClass_FP_ZERO" : C_Int.t; end val getRoundingMode = _import "IEEEReal_getRoundingMode" private : unit -> C_Int.t; structure RoundingMode = struct val FE_DOWNWARD = _const "IEEEReal_RoundingMode_FE_DOWNWARD" : C_Int.t; val FE_NOSUPPORT = _const "IEEEReal_RoundingMode_FE_NOSUPPORT" : C_Int.t; val FE_TONEAREST = _const "IEEEReal_RoundingMode_FE_TONEAREST" : C_Int.t; val FE_TOWARDZERO = _const "IEEEReal_RoundingMode_FE_TOWARDZERO" : C_Int.t; val FE_UPWARD = _const "IEEEReal_RoundingMode_FE_UPWARD" : C_Int.t; end val setRoundingMode = _import "IEEEReal_setRoundingMode" private : C_Int.t -> C_Int.t; end structure MinGW = struct val clearNonBlock = _import "MinGW_clearNonBlock" private : C_Fd.t -> unit; val getTempPath = _import "MinGW_getTempPath" private : C_Size.t * (Char8.t) array -> C_Size.t; val setNonBlock = _import "MinGW_setNonBlock" private : C_Fd.t -> unit; end structure MLton = struct val bug = _import "MLton_bug" private : String8.t -> unit; structure Itimer = struct val PROF = _const "MLton_Itimer_PROF" : C_Int.t; val REAL = _const "MLton_Itimer_REAL" : C_Int.t; val set = _import "MLton_Itimer_set" private : C_Int.t * C_Time.t * C_SUSeconds.t * C_Time.t * C_SUSeconds.t -> (C_Int.t) C_Errno.t; val VIRTUAL = _const "MLton_Itimer_VIRTUAL" : C_Int.t; end structure Process = struct val spawne = _import "MLton_Process_spawne" private : NullString8.t * (NullString8.t) array * (NullString8.t) array -> (C_PId.t) C_Errno.t; val spawnp = _import "MLton_Process_spawnp" private : NullString8.t * (NullString8.t) array -> (C_PId.t) C_Errno.t; end structure Rlimit = struct val AS = _const "MLton_Rlimit_AS" : C_Int.t; val CORE = _const "MLton_Rlimit_CORE" : C_Int.t; val CPU = _const "MLton_Rlimit_CPU" : C_Int.t; val DATA = _const "MLton_Rlimit_DATA" : C_Int.t; val FSIZE = _const "MLton_Rlimit_FSIZE" : C_Int.t; val get = _import "MLton_Rlimit_get" private : C_Int.t -> (C_Int.t) C_Errno.t; val getHard = _import "MLton_Rlimit_getHard" private : unit -> C_RLim.t; val getSoft = _import "MLton_Rlimit_getSoft" private : unit -> C_RLim.t; val INFINITY = _const "MLton_Rlimit_INFINITY" : C_RLim.t; val MEMLOCK = _const "MLton_Rlimit_MEMLOCK" : C_Int.t; val NOFILE = _const "MLton_Rlimit_NOFILE" : C_Int.t; val NPROC = _const "MLton_Rlimit_NPROC" : C_Int.t; val RSS = _const "MLton_Rlimit_RSS" : C_Int.t; val set = _import "MLton_Rlimit_set" private : C_Int.t * C_RLim.t * C_RLim.t -> (C_Int.t) C_Errno.t; val STACK = _const "MLton_Rlimit_STACK" : C_Int.t; end structure Rusage = struct val children_stime_sec = _import "MLton_Rusage_children_stime_sec" private : unit -> C_Time.t; val children_stime_usec = _import "MLton_Rusage_children_stime_usec" private : unit -> C_SUSeconds.t; val children_utime_sec = _import "MLton_Rusage_children_utime_sec" private : unit -> C_Time.t; val children_utime_usec = _import "MLton_Rusage_children_utime_usec" private : unit -> C_SUSeconds.t; val gc_stime_sec = _import "MLton_Rusage_gc_stime_sec" private : unit -> C_Time.t; val gc_stime_usec = _import "MLton_Rusage_gc_stime_usec" private : unit -> C_SUSeconds.t; val gc_utime_sec = _import "MLton_Rusage_gc_utime_sec" private : unit -> C_Time.t; val gc_utime_usec = _import "MLton_Rusage_gc_utime_usec" private : unit -> C_SUSeconds.t; val getrusage = _import "MLton_Rusage_getrusage" private : unit -> unit; val self_stime_sec = _import "MLton_Rusage_self_stime_sec" private : unit -> C_Time.t; val self_stime_usec = _import "MLton_Rusage_self_stime_usec" private : unit -> C_SUSeconds.t; val self_utime_sec = _import "MLton_Rusage_self_utime_sec" private : unit -> C_Time.t; val self_utime_usec = _import "MLton_Rusage_self_utime_usec" private : unit -> C_SUSeconds.t; end structure Syslog = struct val closelog = _import "MLton_Syslog_closelog" private : unit -> unit; structure Facility = struct val LOG_AUTH = _const "MLton_Syslog_Facility_LOG_AUTH" : C_Int.t; val LOG_CRON = _const "MLton_Syslog_Facility_LOG_CRON" : C_Int.t; val LOG_DAEMON = _const "MLton_Syslog_Facility_LOG_DAEMON" : C_Int.t; val LOG_KERN = _const "MLton_Syslog_Facility_LOG_KERN" : C_Int.t; val LOG_LOCAL0 = _const "MLton_Syslog_Facility_LOG_LOCAL0" : C_Int.t; val LOG_LOCAL1 = _const "MLton_Syslog_Facility_LOG_LOCAL1" : C_Int.t; val LOG_LOCAL2 = _const "MLton_Syslog_Facility_LOG_LOCAL2" : C_Int.t; val LOG_LOCAL3 = _const "MLton_Syslog_Facility_LOG_LOCAL3" : C_Int.t; val LOG_LOCAL4 = _const "MLton_Syslog_Facility_LOG_LOCAL4" : C_Int.t; val LOG_LOCAL5 = _const "MLton_Syslog_Facility_LOG_LOCAL5" : C_Int.t; val LOG_LOCAL6 = _const "MLton_Syslog_Facility_LOG_LOCAL6" : C_Int.t; val LOG_LOCAL7 = _const "MLton_Syslog_Facility_LOG_LOCAL7" : C_Int.t; val LOG_LPR = _const "MLton_Syslog_Facility_LOG_LPR" : C_Int.t; val LOG_MAIL = _const "MLton_Syslog_Facility_LOG_MAIL" : C_Int.t; val LOG_NEWS = _const "MLton_Syslog_Facility_LOG_NEWS" : C_Int.t; val LOG_SYSLOG = _const "MLton_Syslog_Facility_LOG_SYSLOG" : C_Int.t; val LOG_USER = _const "MLton_Syslog_Facility_LOG_USER" : C_Int.t; val LOG_UUCP = _const "MLton_Syslog_Facility_LOG_UUCP" : C_Int.t; end structure Logopt = struct val LOG_CONS = _const "MLton_Syslog_Logopt_LOG_CONS" : C_Int.t; val LOG_NDELAY = _const "MLton_Syslog_Logopt_LOG_NDELAY" : C_Int.t; val LOG_NOWAIT = _const "MLton_Syslog_Logopt_LOG_NOWAIT" : C_Int.t; val LOG_ODELAY = _const "MLton_Syslog_Logopt_LOG_ODELAY" : C_Int.t; val LOG_PERROR = _const "MLton_Syslog_Logopt_LOG_PERROR" : C_Int.t; val LOG_PID = _const "MLton_Syslog_Logopt_LOG_PID" : C_Int.t; end val openlog = _import "MLton_Syslog_openlog" private : NullString8.t * C_Int.t * C_Int.t -> unit; structure Severity = struct val LOG_ALERT = _const "MLton_Syslog_Severity_LOG_ALERT" : C_Int.t; val LOG_CRIT = _const "MLton_Syslog_Severity_LOG_CRIT" : C_Int.t; val LOG_DEBUG = _const "MLton_Syslog_Severity_LOG_DEBUG" : C_Int.t; val LOG_EMERG = _const "MLton_Syslog_Severity_LOG_EMERG" : C_Int.t; val LOG_ERR = _const "MLton_Syslog_Severity_LOG_ERR" : C_Int.t; val LOG_INFO = _const "MLton_Syslog_Severity_LOG_INFO" : C_Int.t; val LOG_NOTICE = _const "MLton_Syslog_Severity_LOG_NOTICE" : C_Int.t; val LOG_WARNING = _const "MLton_Syslog_Severity_LOG_WARNING" : C_Int.t; end val syslog = _import "MLton_Syslog_syslog" private : C_Int.t * NullString8.t -> unit; end end structure Net = struct val htonl = _import "Net_htonl" private : Word32.t -> Word32.t; val htons = _import "Net_htons" private : Word16.t -> Word16.t; val ntohl = _import "Net_ntohl" private : Word32.t -> Word32.t; val ntohs = _import "Net_ntohs" private : Word16.t -> Word16.t; end structure NetHostDB = struct val getByAddress = _import "NetHostDB_getByAddress" private : (Word8.t) vector * C_Socklen.t -> C_Int.t; val getByName = _import "NetHostDB_getByName" private : NullString8.t -> C_Int.t; val getEntryAddrsN = _import "NetHostDB_getEntryAddrsN" private : C_Int.t * (Word8.t) array -> unit; val getEntryAddrsNum = _import "NetHostDB_getEntryAddrsNum" private : unit -> C_Int.t; val getEntryAddrType = _import "NetHostDB_getEntryAddrType" private : unit -> C_Int.t; val getEntryAliasesN = _import "NetHostDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetHostDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryLength = _import "NetHostDB_getEntryLength" private : unit -> C_Int.t; val getEntryName = _import "NetHostDB_getEntryName" private : unit -> C_String.t; val getHostName = _import "NetHostDB_getHostName" private : (Char8.t) array * C_Size.t -> (C_Int.t) C_Errno.t; val INADDR_ANY = _const "NetHostDB_INADDR_ANY" : C_Int.t; val inAddrSize = _const "NetHostDB_inAddrSize" : C_Size.t; end structure NetProtDB = struct val getByName = _import "NetProtDB_getByName" private : NullString8.t -> C_Int.t; val getByNumber = _import "NetProtDB_getByNumber" private : C_Int.t -> C_Int.t; val getEntryAliasesN = _import "NetProtDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetProtDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryName = _import "NetProtDB_getEntryName" private : unit -> C_String.t; val getEntryProto = _import "NetProtDB_getEntryProto" private : unit -> C_Int.t; end structure NetServDB = struct val getByName = _import "NetServDB_getByName" private : NullString8.t * NullString8.t -> C_Int.t; val getByNameNull = _import "NetServDB_getByNameNull" private : NullString8.t -> C_Int.t; val getByPort = _import "NetServDB_getByPort" private : C_Int.t * NullString8.t -> C_Int.t; val getByPortNull = _import "NetServDB_getByPortNull" private : C_Int.t -> C_Int.t; val getEntryAliasesN = _import "NetServDB_getEntryAliasesN" private : C_Int.t -> C_String.t; val getEntryAliasesNum = _import "NetServDB_getEntryAliasesNum" private : unit -> C_Int.t; val getEntryName = _import "NetServDB_getEntryName" private : unit -> C_String.t; val getEntryPort = _import "NetServDB_getEntryPort" private : unit -> C_Int.t; val getEntryProto = _import "NetServDB_getEntryProto" private : unit -> C_String.t; end structure OS = struct structure IO = struct val poll = _import "OS_IO_poll" private : (C_Fd.t) vector * (C_Short.t) vector * C_NFds.t * C_Int.t * (C_Short.t) array -> (C_Int.t) C_Errno.t; val POLLIN = _const "OS_IO_POLLIN" : C_Short.t; val POLLOUT = _const "OS_IO_POLLOUT" : C_Short.t; val POLLPRI = _const "OS_IO_POLLPRI" : C_Short.t; end end structure Posix = struct structure Error = struct val clearErrno = _import "Posix_Error_clearErrno" private : unit -> unit; val E2BIG = _const "Posix_Error_E2BIG" : C_Int.t; val EACCES = _const "Posix_Error_EACCES" : C_Int.t; val EADDRINUSE = _const "Posix_Error_EADDRINUSE" : C_Int.t; val EADDRNOTAVAIL = _const "Posix_Error_EADDRNOTAVAIL" : C_Int.t; val EAFNOSUPPORT = _const "Posix_Error_EAFNOSUPPORT" : C_Int.t; val EAGAIN = _const "Posix_Error_EAGAIN" : C_Int.t; val EALREADY = _const "Posix_Error_EALREADY" : C_Int.t; val EBADF = _const "Posix_Error_EBADF" : C_Int.t; val EBADMSG = _const "Posix_Error_EBADMSG" : C_Int.t; val EBUSY = _const "Posix_Error_EBUSY" : C_Int.t; val ECANCELED = _const "Posix_Error_ECANCELED" : C_Int.t; val ECHILD = _const "Posix_Error_ECHILD" : C_Int.t; val ECONNABORTED = _const "Posix_Error_ECONNABORTED" : C_Int.t; val ECONNREFUSED = _const "Posix_Error_ECONNREFUSED" : C_Int.t; val ECONNRESET = _const "Posix_Error_ECONNRESET" : C_Int.t; val EDEADLK = _const "Posix_Error_EDEADLK" : C_Int.t; val EDESTADDRREQ = _const "Posix_Error_EDESTADDRREQ" : C_Int.t; val EDOM = _const "Posix_Error_EDOM" : C_Int.t; val EDQUOT = _const "Posix_Error_EDQUOT" : C_Int.t; val EEXIST = _const "Posix_Error_EEXIST" : C_Int.t; val EFAULT = _const "Posix_Error_EFAULT" : C_Int.t; val EFBIG = _const "Posix_Error_EFBIG" : C_Int.t; val EHOSTUNREACH = _const "Posix_Error_EHOSTUNREACH" : C_Int.t; val EIDRM = _const "Posix_Error_EIDRM" : C_Int.t; val EILSEQ = _const "Posix_Error_EILSEQ" : C_Int.t; val EINPROGRESS = _const "Posix_Error_EINPROGRESS" : C_Int.t; val EINTR = _const "Posix_Error_EINTR" : C_Int.t; val EINVAL = _const "Posix_Error_EINVAL" : C_Int.t; val EIO = _const "Posix_Error_EIO" : C_Int.t; val EISCONN = _const "Posix_Error_EISCONN" : C_Int.t; val EISDIR = _const "Posix_Error_EISDIR" : C_Int.t; val ELOOP = _const "Posix_Error_ELOOP" : C_Int.t; val EMFILE = _const "Posix_Error_EMFILE" : C_Int.t; val EMLINK = _const "Posix_Error_EMLINK" : C_Int.t; val EMSGSIZE = _const "Posix_Error_EMSGSIZE" : C_Int.t; val EMULTIHOP = _const "Posix_Error_EMULTIHOP" : C_Int.t; val ENAMETOOLONG = _const "Posix_Error_ENAMETOOLONG" : C_Int.t; val ENETDOWN = _const "Posix_Error_ENETDOWN" : C_Int.t; val ENETRESET = _const "Posix_Error_ENETRESET" : C_Int.t; val ENETUNREACH = _const "Posix_Error_ENETUNREACH" : C_Int.t; val ENFILE = _const "Posix_Error_ENFILE" : C_Int.t; val ENOBUFS = _const "Posix_Error_ENOBUFS" : C_Int.t; val ENODATA = _const "Posix_Error_ENODATA" : C_Int.t; val ENODEV = _const "Posix_Error_ENODEV" : C_Int.t; val ENOENT = _const "Posix_Error_ENOENT" : C_Int.t; val ENOEXEC = _const "Posix_Error_ENOEXEC" : C_Int.t; val ENOLCK = _const "Posix_Error_ENOLCK" : C_Int.t; val ENOLINK = _const "Posix_Error_ENOLINK" : C_Int.t; val ENOMEM = _const "Posix_Error_ENOMEM" : C_Int.t; val ENOMSG = _const "Posix_Error_ENOMSG" : C_Int.t; val ENOPROTOOPT = _const "Posix_Error_ENOPROTOOPT" : C_Int.t; val ENOSPC = _const "Posix_Error_ENOSPC" : C_Int.t; val ENOSR = _const "Posix_Error_ENOSR" : C_Int.t; val ENOSTR = _const "Posix_Error_ENOSTR" : C_Int.t; val ENOSYS = _const "Posix_Error_ENOSYS" : C_Int.t; val ENOTCONN = _const "Posix_Error_ENOTCONN" : C_Int.t; val ENOTDIR = _const "Posix_Error_ENOTDIR" : C_Int.t; val ENOTEMPTY = _const "Posix_Error_ENOTEMPTY" : C_Int.t; val ENOTSOCK = _const "Posix_Error_ENOTSOCK" : C_Int.t; val ENOTSUP = _const "Posix_Error_ENOTSUP" : C_Int.t; val ENOTTY = _const "Posix_Error_ENOTTY" : C_Int.t; val ENXIO = _const "Posix_Error_ENXIO" : C_Int.t; val EOPNOTSUPP = _const "Posix_Error_EOPNOTSUPP" : C_Int.t; val EOVERFLOW = _const "Posix_Error_EOVERFLOW" : C_Int.t; val EPERM = _const "Posix_Error_EPERM" : C_Int.t; val EPIPE = _const "Posix_Error_EPIPE" : C_Int.t; val EPROTO = _const "Posix_Error_EPROTO" : C_Int.t; val EPROTONOSUPPORT = _const "Posix_Error_EPROTONOSUPPORT" : C_Int.t; val EPROTOTYPE = _const "Posix_Error_EPROTOTYPE" : C_Int.t; val ERANGE = _const "Posix_Error_ERANGE" : C_Int.t; val EROFS = _const "Posix_Error_EROFS" : C_Int.t; val ESPIPE = _const "Posix_Error_ESPIPE" : C_Int.t; val ESRCH = _const "Posix_Error_ESRCH" : C_Int.t; val ESTALE = _const "Posix_Error_ESTALE" : C_Int.t; val ETIME = _const "Posix_Error_ETIME" : C_Int.t; val ETIMEDOUT = _const "Posix_Error_ETIMEDOUT" : C_Int.t; val ETXTBSY = _const "Posix_Error_ETXTBSY" : C_Int.t; val EWOULDBLOCK = _const "Posix_Error_EWOULDBLOCK" : C_Int.t; val EXDEV = _const "Posix_Error_EXDEV" : C_Int.t; val getErrno = _import "Posix_Error_getErrno" private : unit -> C_Int.t; val strError = _import "Posix_Error_strError" private : C_Int.t -> C_String.t; end structure FileSys = struct structure A = struct val F_OK = _const "Posix_FileSys_A_F_OK" : C_Int.t; val R_OK = _const "Posix_FileSys_A_R_OK" : C_Int.t; val W_OK = _const "Posix_FileSys_A_W_OK" : C_Int.t; val X_OK = _const "Posix_FileSys_A_X_OK" : C_Int.t; end val access = _import "Posix_FileSys_access" private : NullString8.t * C_Int.t -> (C_Int.t) C_Errno.t; val chdir = _import "Posix_FileSys_chdir" private : NullString8.t -> (C_Int.t) C_Errno.t; val chmod = _import "Posix_FileSys_chmod" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; val chown = _import "Posix_FileSys_chown" private : NullString8.t * C_UId.t * C_GId.t -> (C_Int.t) C_Errno.t; structure Dirstream = struct val closeDir = _import "Posix_FileSys_Dirstream_closeDir" private : C_DirP.t -> (C_Int.t) C_Errno.t; val openDir = _import "Posix_FileSys_Dirstream_openDir" private : NullString8.t -> (C_DirP.t) C_Errno.t; val readDir = _import "Posix_FileSys_Dirstream_readDir" private : C_DirP.t -> (C_String.t) C_Errno.t; val rewindDir = _import "Posix_FileSys_Dirstream_rewindDir" private : C_DirP.t -> unit; end val fchdir = _import "Posix_FileSys_fchdir" private : C_Fd.t -> (C_Int.t) C_Errno.t; val fchmod = _import "Posix_FileSys_fchmod" private : C_Fd.t * C_Mode.t -> (C_Int.t) C_Errno.t; val fchown = _import "Posix_FileSys_fchown" private : C_Fd.t * C_UId.t * C_GId.t -> (C_Int.t) C_Errno.t; val fpathconf = _import "Posix_FileSys_fpathconf" private : C_Fd.t * C_Int.t -> (C_Long.t) C_Errno.t; val ftruncate = _import "Posix_FileSys_ftruncate" private : C_Fd.t * C_Off.t -> (C_Int.t) C_Errno.t; val getcwd = _import "Posix_FileSys_getcwd" private : (Char8.t) array * C_Size.t -> (C_String.t) C_Errno.t; val link = _import "Posix_FileSys_link" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val mkdir = _import "Posix_FileSys_mkdir" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; val mkfifo = _import "Posix_FileSys_mkfifo" private : NullString8.t * C_Mode.t -> (C_Int.t) C_Errno.t; structure O = struct val APPEND = _const "Posix_FileSys_O_APPEND" : C_Int.t; val BINARY = _const "Posix_FileSys_O_BINARY" : C_Int.t; val CREAT = _const "Posix_FileSys_O_CREAT" : C_Int.t; val DSYNC = _const "Posix_FileSys_O_DSYNC" : C_Int.t; val EXCL = _const "Posix_FileSys_O_EXCL" : C_Int.t; val NOCTTY = _const "Posix_FileSys_O_NOCTTY" : C_Int.t; val NONBLOCK = _const "Posix_FileSys_O_NONBLOCK" : C_Int.t; val RDONLY = _const "Posix_FileSys_O_RDONLY" : C_Int.t; val RDWR = _const "Posix_FileSys_O_RDWR" : C_Int.t; val RSYNC = _const "Posix_FileSys_O_RSYNC" : C_Int.t; val SYNC = _const "Posix_FileSys_O_SYNC" : C_Int.t; val TEXT = _const "Posix_FileSys_O_TEXT" : C_Int.t; val TRUNC = _const "Posix_FileSys_O_TRUNC" : C_Int.t; val WRONLY = _const "Posix_FileSys_O_WRONLY" : C_Int.t; end val open2 = _import "Posix_FileSys_open2" private : NullString8.t * C_Int.t -> (C_Fd.t) C_Errno.t; val open3 = _import "Posix_FileSys_open3" private : NullString8.t * C_Int.t * C_Mode.t -> (C_Fd.t) C_Errno.t; val pathconf = _import "Posix_FileSys_pathconf" private : NullString8.t * C_Int.t -> (C_Long.t) C_Errno.t; structure PC = struct val ALLOC_SIZE_MIN = _const "Posix_FileSys_PC_ALLOC_SIZE_MIN" : C_Int.t; val ASYNC_IO = _const "Posix_FileSys_PC_ASYNC_IO" : C_Int.t; val CHOWN_RESTRICTED = _const "Posix_FileSys_PC_CHOWN_RESTRICTED" : C_Int.t; val FILESIZEBITS = _const "Posix_FileSys_PC_FILESIZEBITS" : C_Int.t; val LINK_MAX = _const "Posix_FileSys_PC_LINK_MAX" : C_Int.t; val MAX_CANON = _const "Posix_FileSys_PC_MAX_CANON" : C_Int.t; val MAX_INPUT = _const "Posix_FileSys_PC_MAX_INPUT" : C_Int.t; val NAME_MAX = _const "Posix_FileSys_PC_NAME_MAX" : C_Int.t; val NO_TRUNC = _const "Posix_FileSys_PC_NO_TRUNC" : C_Int.t; val PATH_MAX = _const "Posix_FileSys_PC_PATH_MAX" : C_Int.t; val PIPE_BUF = _const "Posix_FileSys_PC_PIPE_BUF" : C_Int.t; val PRIO_IO = _const "Posix_FileSys_PC_PRIO_IO" : C_Int.t; val REC_INCR_XFER_SIZE = _const "Posix_FileSys_PC_REC_INCR_XFER_SIZE" : C_Int.t; val REC_MAX_XFER_SIZE = _const "Posix_FileSys_PC_REC_MAX_XFER_SIZE" : C_Int.t; val REC_MIN_XFER_SIZE = _const "Posix_FileSys_PC_REC_MIN_XFER_SIZE" : C_Int.t; val REC_XFER_ALIGN = _const "Posix_FileSys_PC_REC_XFER_ALIGN" : C_Int.t; val SYMLINK_MAX = _const "Posix_FileSys_PC_SYMLINK_MAX" : C_Int.t; val SYNC_IO = _const "Posix_FileSys_PC_SYNC_IO" : C_Int.t; val TWO_SYMLINKS = _const "Posix_FileSys_PC_TWO_SYMLINKS" : C_Int.t; val VDISABLE = _const "Posix_FileSys_PC_VDISABLE" : C_Int.t; end val readlink = _import "Posix_FileSys_readlink" private : NullString8.t * (Char8.t) array * C_Size.t -> (C_SSize.t) C_Errno.t; val rename = _import "Posix_FileSys_rename" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val rmdir = _import "Posix_FileSys_rmdir" private : NullString8.t -> (C_Int.t) C_Errno.t; structure S = struct val IFBLK = _const "Posix_FileSys_S_IFBLK" : C_Mode.t; val IFCHR = _const "Posix_FileSys_S_IFCHR" : C_Mode.t; val IFDIR = _const "Posix_FileSys_S_IFDIR" : C_Mode.t; val IFIFO = _const "Posix_FileSys_S_IFIFO" : C_Mode.t; val IFLNK = _const "Posix_FileSys_S_IFLNK" : C_Mode.t; val IFMT = _const "Posix_FileSys_S_IFMT" : C_Mode.t; val IFREG = _const "Posix_FileSys_S_IFREG" : C_Mode.t; val IFSOCK = _const "Posix_FileSys_S_IFSOCK" : C_Mode.t; val IRGRP = _const "Posix_FileSys_S_IRGRP" : C_Mode.t; val IROTH = _const "Posix_FileSys_S_IROTH" : C_Mode.t; val IRUSR = _const "Posix_FileSys_S_IRUSR" : C_Mode.t; val IRWXG = _const "Posix_FileSys_S_IRWXG" : C_Mode.t; val IRWXO = _const "Posix_FileSys_S_IRWXO" : C_Mode.t; val IRWXU = _const "Posix_FileSys_S_IRWXU" : C_Mode.t; val ISGID = _const "Posix_FileSys_S_ISGID" : C_Mode.t; val ISUID = _const "Posix_FileSys_S_ISUID" : C_Mode.t; val ISVTX = _const "Posix_FileSys_S_ISVTX" : C_Mode.t; val IWGRP = _const "Posix_FileSys_S_IWGRP" : C_Mode.t; val IWOTH = _const "Posix_FileSys_S_IWOTH" : C_Mode.t; val IWUSR = _const "Posix_FileSys_S_IWUSR" : C_Mode.t; val IXGRP = _const "Posix_FileSys_S_IXGRP" : C_Mode.t; val IXOTH = _const "Posix_FileSys_S_IXOTH" : C_Mode.t; val IXUSR = _const "Posix_FileSys_S_IXUSR" : C_Mode.t; end structure ST = struct val isBlk = _import "Posix_FileSys_ST_isBlk" private : C_Mode.t -> C_Int.t; val isChr = _import "Posix_FileSys_ST_isChr" private : C_Mode.t -> C_Int.t; val isDir = _import "Posix_FileSys_ST_isDir" private : C_Mode.t -> C_Int.t; val isFIFO = _import "Posix_FileSys_ST_isFIFO" private : C_Mode.t -> C_Int.t; val isLink = _import "Posix_FileSys_ST_isLink" private : C_Mode.t -> C_Int.t; val isReg = _import "Posix_FileSys_ST_isReg" private : C_Mode.t -> C_Int.t; val isSock = _import "Posix_FileSys_ST_isSock" private : C_Mode.t -> C_Int.t; end structure Stat = struct val fstat = _import "Posix_FileSys_Stat_fstat" private : C_Fd.t -> (C_Int.t) C_Errno.t; val getATime = _import "Posix_FileSys_Stat_getATime" private : unit -> C_Time.t; val getCTime = _import "Posix_FileSys_Stat_getCTime" private : unit -> C_Time.t; val getDev = _import "Posix_FileSys_Stat_getDev" private : unit -> C_Dev.t; val getGId = _import "Posix_FileSys_Stat_getGId" private : unit -> C_GId.t; val getINo = _import "Posix_FileSys_Stat_getINo" private : unit -> C_INo.t; val getMode = _import "Posix_FileSys_Stat_getMode" private : unit -> C_Mode.t; val getMTime = _import "Posix_FileSys_Stat_getMTime" private : unit -> C_Time.t; val getNLink = _import "Posix_FileSys_Stat_getNLink" private : unit -> C_NLink.t; val getRDev = _import "Posix_FileSys_Stat_getRDev" private : unit -> C_Dev.t; val getSize = _import "Posix_FileSys_Stat_getSize" private : unit -> C_Off.t; val getUId = _import "Posix_FileSys_Stat_getUId" private : unit -> C_UId.t; val lstat = _import "Posix_FileSys_Stat_lstat" private : NullString8.t -> (C_Int.t) C_Errno.t; val stat = _import "Posix_FileSys_Stat_stat" private : NullString8.t -> (C_Int.t) C_Errno.t; end val symlink = _import "Posix_FileSys_symlink" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val truncate = _import "Posix_FileSys_truncate" private : NullString8.t * C_Off.t -> (C_Int.t) C_Errno.t; val umask = _import "Posix_FileSys_umask" private : C_Mode.t -> C_Mode.t; val unlink = _import "Posix_FileSys_unlink" private : NullString8.t -> (C_Int.t) C_Errno.t; structure Utimbuf = struct val setAcTime = _import "Posix_FileSys_Utimbuf_setAcTime" private : C_Time.t -> unit; val setModTime = _import "Posix_FileSys_Utimbuf_setModTime" private : C_Time.t -> unit; val utime = _import "Posix_FileSys_Utimbuf_utime" private : NullString8.t -> (C_Int.t) C_Errno.t; end end structure IO = struct val close = _import "Posix_IO_close" private : C_Fd.t -> (C_Int.t) C_Errno.t; val dup = _import "Posix_IO_dup" private : C_Fd.t -> (C_Fd.t) C_Errno.t; val dup2 = _import "Posix_IO_dup2" private : C_Fd.t * C_Fd.t -> (C_Fd.t) C_Errno.t; val F_DUPFD = _const "Posix_IO_F_DUPFD" : C_Int.t; val F_GETFD = _const "Posix_IO_F_GETFD" : C_Int.t; val F_GETFL = _const "Posix_IO_F_GETFL" : C_Int.t; val F_GETOWN = _const "Posix_IO_F_GETOWN" : C_Int.t; val F_SETFD = _const "Posix_IO_F_SETFD" : C_Int.t; val F_SETFL = _const "Posix_IO_F_SETFL" : C_Int.t; val F_SETOWN = _const "Posix_IO_F_SETOWN" : C_Int.t; val fcntl2 = _import "Posix_IO_fcntl2" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val fcntl3 = _import "Posix_IO_fcntl3" private : C_Fd.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; structure FD = struct val CLOEXEC = _const "Posix_IO_FD_CLOEXEC" : C_Int.t; end structure FLock = struct val F_GETLK = _const "Posix_IO_FLock_F_GETLK" : C_Int.t; val F_RDLCK = _const "Posix_IO_FLock_F_RDLCK" : C_Short.t; val F_SETLK = _const "Posix_IO_FLock_F_SETLK" : C_Int.t; val F_SETLKW = _const "Posix_IO_FLock_F_SETLKW" : C_Int.t; val F_UNLCK = _const "Posix_IO_FLock_F_UNLCK" : C_Short.t; val F_WRLCK = _const "Posix_IO_FLock_F_WRLCK" : C_Short.t; val fcntl = _import "Posix_IO_FLock_fcntl" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val getLen = _import "Posix_IO_FLock_getLen" private : unit -> C_Off.t; val getPId = _import "Posix_IO_FLock_getPId" private : unit -> C_PId.t; val getStart = _import "Posix_IO_FLock_getStart" private : unit -> C_Off.t; val getType = _import "Posix_IO_FLock_getType" private : unit -> C_Short.t; val getWhence = _import "Posix_IO_FLock_getWhence" private : unit -> C_Short.t; val SEEK_CUR = _const "Posix_IO_FLock_SEEK_CUR" : C_Short.t; val SEEK_END = _const "Posix_IO_FLock_SEEK_END" : C_Short.t; val SEEK_SET = _const "Posix_IO_FLock_SEEK_SET" : C_Short.t; val setLen = _import "Posix_IO_FLock_setLen" private : C_Off.t -> unit; val setPId = _import "Posix_IO_FLock_setPId" private : C_PId.t -> unit; val setStart = _import "Posix_IO_FLock_setStart" private : C_Off.t -> unit; val setType = _import "Posix_IO_FLock_setType" private : C_Short.t -> unit; val setWhence = _import "Posix_IO_FLock_setWhence" private : C_Short.t -> unit; end val fsync = _import "Posix_IO_fsync" private : C_Fd.t -> (C_Int.t) C_Errno.t; val lseek = _import "Posix_IO_lseek" private : C_Fd.t * C_Off.t * C_Int.t -> (C_Off.t) C_Errno.t; val O_ACCMODE = _const "Posix_IO_O_ACCMODE" : C_Int.t; val pipe = _import "Posix_IO_pipe" private : (C_Fd.t) array -> (C_Int.t) C_Errno.t; val readChar8 = _import "Posix_IO_readChar8" private : C_Fd.t * (Char8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val readWord8 = _import "Posix_IO_readWord8" private : C_Fd.t * (Word8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val SEEK_CUR = _const "Posix_IO_SEEK_CUR" : C_Int.t; val SEEK_END = _const "Posix_IO_SEEK_END" : C_Int.t; val SEEK_SET = _const "Posix_IO_SEEK_SET" : C_Int.t; val setbin = _import "Posix_IO_setbin" private : C_Fd.t -> unit; val settext = _import "Posix_IO_settext" private : C_Fd.t -> unit; val writeChar8Arr = _import "Posix_IO_writeChar8Arr" private : C_Fd.t * (Char8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeChar8Vec = _import "Posix_IO_writeChar8Vec" private : C_Fd.t * (Char8.t) vector * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeWord8Arr = _import "Posix_IO_writeWord8Arr" private : C_Fd.t * (Word8.t) array * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; val writeWord8Vec = _import "Posix_IO_writeWord8Vec" private : C_Fd.t * (Word8.t) vector * C_Int.t * C_Size.t -> (C_SSize.t) C_Errno.t; end structure ProcEnv = struct val ctermid = _import "Posix_ProcEnv_ctermid" private : unit -> C_String.t; val (environGet, environSet) = _symbol "Posix_ProcEnv_environ" private : (unit -> (C_StringArray.t)) * ((C_StringArray.t) -> unit); val getegid = _import "Posix_ProcEnv_getegid" private : unit -> C_GId.t; val getenv = _import "Posix_ProcEnv_getenv" private : NullString8.t -> C_String.t; val geteuid = _import "Posix_ProcEnv_geteuid" private : unit -> C_UId.t; val getgid = _import "Posix_ProcEnv_getgid" private : unit -> C_GId.t; val getgroups = _import "Posix_ProcEnv_getgroups" private : C_Int.t * (C_GId.t) array -> (C_Int.t) C_Errno.t; val getgroupsN = _import "Posix_ProcEnv_getgroupsN" private : unit -> C_Int.t; val getlogin = _import "Posix_ProcEnv_getlogin" private : unit -> (C_String.t) C_Errno.t; val getpgrp = _import "Posix_ProcEnv_getpgrp" private : unit -> C_PId.t; val getpid = _import "Posix_ProcEnv_getpid" private : unit -> C_PId.t; val getppid = _import "Posix_ProcEnv_getppid" private : unit -> C_PId.t; val getuid = _import "Posix_ProcEnv_getuid" private : unit -> C_UId.t; val isatty = _import "Posix_ProcEnv_isatty" private : C_Fd.t -> C_Int.t; val SC_2_C_BIND = _const "Posix_ProcEnv_SC_2_C_BIND" : C_Int.t; val SC_2_C_DEV = _const "Posix_ProcEnv_SC_2_C_DEV" : C_Int.t; val SC_2_CHAR_TERM = _const "Posix_ProcEnv_SC_2_CHAR_TERM" : C_Int.t; val SC_2_FORT_DEV = _const "Posix_ProcEnv_SC_2_FORT_DEV" : C_Int.t; val SC_2_FORT_RUN = _const "Posix_ProcEnv_SC_2_FORT_RUN" : C_Int.t; val SC_2_LOCALEDEF = _const "Posix_ProcEnv_SC_2_LOCALEDEF" : C_Int.t; val SC_2_PBS = _const "Posix_ProcEnv_SC_2_PBS" : C_Int.t; val SC_2_PBS_ACCOUNTING = _const "Posix_ProcEnv_SC_2_PBS_ACCOUNTING" : C_Int.t; val SC_2_PBS_CHECKPOINT = _const "Posix_ProcEnv_SC_2_PBS_CHECKPOINT" : C_Int.t; val SC_2_PBS_LOCATE = _const "Posix_ProcEnv_SC_2_PBS_LOCATE" : C_Int.t; val SC_2_PBS_MESSAGE = _const "Posix_ProcEnv_SC_2_PBS_MESSAGE" : C_Int.t; val SC_2_PBS_TRACK = _const "Posix_ProcEnv_SC_2_PBS_TRACK" : C_Int.t; val SC_2_SW_DEV = _const "Posix_ProcEnv_SC_2_SW_DEV" : C_Int.t; val SC_2_UPE = _const "Posix_ProcEnv_SC_2_UPE" : C_Int.t; val SC_2_VERSION = _const "Posix_ProcEnv_SC_2_VERSION" : C_Int.t; val SC_ADVISORY_INFO = _const "Posix_ProcEnv_SC_ADVISORY_INFO" : C_Int.t; val SC_AIO_LISTIO_MAX = _const "Posix_ProcEnv_SC_AIO_LISTIO_MAX" : C_Int.t; val SC_AIO_MAX = _const "Posix_ProcEnv_SC_AIO_MAX" : C_Int.t; val SC_AIO_PRIO_DELTA_MAX = _const "Posix_ProcEnv_SC_AIO_PRIO_DELTA_MAX" : C_Int.t; val SC_ARG_MAX = _const "Posix_ProcEnv_SC_ARG_MAX" : C_Int.t; val SC_ASYNCHRONOUS_IO = _const "Posix_ProcEnv_SC_ASYNCHRONOUS_IO" : C_Int.t; val SC_ATEXIT_MAX = _const "Posix_ProcEnv_SC_ATEXIT_MAX" : C_Int.t; val SC_BARRIERS = _const "Posix_ProcEnv_SC_BARRIERS" : C_Int.t; val SC_BC_BASE_MAX = _const "Posix_ProcEnv_SC_BC_BASE_MAX" : C_Int.t; val SC_BC_DIM_MAX = _const "Posix_ProcEnv_SC_BC_DIM_MAX" : C_Int.t; val SC_BC_SCALE_MAX = _const "Posix_ProcEnv_SC_BC_SCALE_MAX" : C_Int.t; val SC_BC_STRING_MAX = _const "Posix_ProcEnv_SC_BC_STRING_MAX" : C_Int.t; val SC_CHILD_MAX = _const "Posix_ProcEnv_SC_CHILD_MAX" : C_Int.t; val SC_CLK_TCK = _const "Posix_ProcEnv_SC_CLK_TCK" : C_Int.t; val SC_CLOCK_SELECTION = _const "Posix_ProcEnv_SC_CLOCK_SELECTION" : C_Int.t; val SC_COLL_WEIGHTS_MAX = _const "Posix_ProcEnv_SC_COLL_WEIGHTS_MAX" : C_Int.t; val SC_CPUTIME = _const "Posix_ProcEnv_SC_CPUTIME" : C_Int.t; val SC_DELAYTIMER_MAX = _const "Posix_ProcEnv_SC_DELAYTIMER_MAX" : C_Int.t; val SC_EXPR_NEST_MAX = _const "Posix_ProcEnv_SC_EXPR_NEST_MAX" : C_Int.t; val SC_FSYNC = _const "Posix_ProcEnv_SC_FSYNC" : C_Int.t; val SC_GETGR_R_SIZE_MAX = _const "Posix_ProcEnv_SC_GETGR_R_SIZE_MAX" : C_Int.t; val SC_GETPW_R_SIZE_MAX = _const "Posix_ProcEnv_SC_GETPW_R_SIZE_MAX" : C_Int.t; val SC_HOST_NAME_MAX = _const "Posix_ProcEnv_SC_HOST_NAME_MAX" : C_Int.t; val SC_IOV_MAX = _const "Posix_ProcEnv_SC_IOV_MAX" : C_Int.t; val SC_IPV6 = _const "Posix_ProcEnv_SC_IPV6" : C_Int.t; val SC_JOB_CONTROL = _const "Posix_ProcEnv_SC_JOB_CONTROL" : C_Int.t; val SC_LINE_MAX = _const "Posix_ProcEnv_SC_LINE_MAX" : C_Int.t; val SC_LOGIN_NAME_MAX = _const "Posix_ProcEnv_SC_LOGIN_NAME_MAX" : C_Int.t; val SC_MAPPED_FILES = _const "Posix_ProcEnv_SC_MAPPED_FILES" : C_Int.t; val SC_MEMLOCK = _const "Posix_ProcEnv_SC_MEMLOCK" : C_Int.t; val SC_MEMLOCK_RANGE = _const "Posix_ProcEnv_SC_MEMLOCK_RANGE" : C_Int.t; val SC_MEMORY_PROTECTION = _const "Posix_ProcEnv_SC_MEMORY_PROTECTION" : C_Int.t; val SC_MESSAGE_PASSING = _const "Posix_ProcEnv_SC_MESSAGE_PASSING" : C_Int.t; val SC_MONOTONIC_CLOCK = _const "Posix_ProcEnv_SC_MONOTONIC_CLOCK" : C_Int.t; val SC_MQ_OPEN_MAX = _const "Posix_ProcEnv_SC_MQ_OPEN_MAX" : C_Int.t; val SC_MQ_PRIO_MAX = _const "Posix_ProcEnv_SC_MQ_PRIO_MAX" : C_Int.t; val SC_NGROUPS_MAX = _const "Posix_ProcEnv_SC_NGROUPS_MAX" : C_Int.t; val SC_OPEN_MAX = _const "Posix_ProcEnv_SC_OPEN_MAX" : C_Int.t; val SC_PAGE_SIZE = _const "Posix_ProcEnv_SC_PAGE_SIZE" : C_Int.t; val SC_PAGESIZE = _const "Posix_ProcEnv_SC_PAGESIZE" : C_Int.t; val SC_PRIORITIZED_IO = _const "Posix_ProcEnv_SC_PRIORITIZED_IO" : C_Int.t; val SC_PRIORITY_SCHEDULING = _const "Posix_ProcEnv_SC_PRIORITY_SCHEDULING" : C_Int.t; val SC_RAW_SOCKETS = _const "Posix_ProcEnv_SC_RAW_SOCKETS" : C_Int.t; val SC_RE_DUP_MAX = _const "Posix_ProcEnv_SC_RE_DUP_MAX" : C_Int.t; val SC_READER_WRITER_LOCKS = _const "Posix_ProcEnv_SC_READER_WRITER_LOCKS" : C_Int.t; val SC_REALTIME_SIGNALS = _const "Posix_ProcEnv_SC_REALTIME_SIGNALS" : C_Int.t; val SC_REGEXP = _const "Posix_ProcEnv_SC_REGEXP" : C_Int.t; val SC_RTSIG_MAX = _const "Posix_ProcEnv_SC_RTSIG_MAX" : C_Int.t; val SC_SAVED_IDS = _const "Posix_ProcEnv_SC_SAVED_IDS" : C_Int.t; val SC_SEM_NSEMS_MAX = _const "Posix_ProcEnv_SC_SEM_NSEMS_MAX" : C_Int.t; val SC_SEM_VALUE_MAX = _const "Posix_ProcEnv_SC_SEM_VALUE_MAX" : C_Int.t; val SC_SEMAPHORES = _const "Posix_ProcEnv_SC_SEMAPHORES" : C_Int.t; val SC_SHARED_MEMORY_OBJECTS = _const "Posix_ProcEnv_SC_SHARED_MEMORY_OBJECTS" : C_Int.t; val SC_SHELL = _const "Posix_ProcEnv_SC_SHELL" : C_Int.t; val SC_SIGQUEUE_MAX = _const "Posix_ProcEnv_SC_SIGQUEUE_MAX" : C_Int.t; val SC_SPAWN = _const "Posix_ProcEnv_SC_SPAWN" : C_Int.t; val SC_SPIN_LOCKS = _const "Posix_ProcEnv_SC_SPIN_LOCKS" : C_Int.t; val SC_SPORADIC_SERVER = _const "Posix_ProcEnv_SC_SPORADIC_SERVER" : C_Int.t; val SC_SS_REPL_MAX = _const "Posix_ProcEnv_SC_SS_REPL_MAX" : C_Int.t; val SC_STREAM_MAX = _const "Posix_ProcEnv_SC_STREAM_MAX" : C_Int.t; val SC_SYMLOOP_MAX = _const "Posix_ProcEnv_SC_SYMLOOP_MAX" : C_Int.t; val SC_SYNCHRONIZED_IO = _const "Posix_ProcEnv_SC_SYNCHRONIZED_IO" : C_Int.t; val SC_THREAD_ATTR_STACKADDR = _const "Posix_ProcEnv_SC_THREAD_ATTR_STACKADDR" : C_Int.t; val SC_THREAD_ATTR_STACKSIZE = _const "Posix_ProcEnv_SC_THREAD_ATTR_STACKSIZE" : C_Int.t; val SC_THREAD_CPUTIME = _const "Posix_ProcEnv_SC_THREAD_CPUTIME" : C_Int.t; val SC_THREAD_DESTRUCTOR_ITERATIONS = _const "Posix_ProcEnv_SC_THREAD_DESTRUCTOR_ITERATIONS" : C_Int.t; val SC_THREAD_KEYS_MAX = _const "Posix_ProcEnv_SC_THREAD_KEYS_MAX" : C_Int.t; val SC_THREAD_PRIO_INHERIT = _const "Posix_ProcEnv_SC_THREAD_PRIO_INHERIT" : C_Int.t; val SC_THREAD_PRIO_PROTECT = _const "Posix_ProcEnv_SC_THREAD_PRIO_PROTECT" : C_Int.t; val SC_THREAD_PRIORITY_SCHEDULING = _const "Posix_ProcEnv_SC_THREAD_PRIORITY_SCHEDULING" : C_Int.t; val SC_THREAD_PROCESS_SHARED = _const "Posix_ProcEnv_SC_THREAD_PROCESS_SHARED" : C_Int.t; val SC_THREAD_SAFE_FUNCTIONS = _const "Posix_ProcEnv_SC_THREAD_SAFE_FUNCTIONS" : C_Int.t; val SC_THREAD_SPORADIC_SERVER = _const "Posix_ProcEnv_SC_THREAD_SPORADIC_SERVER" : C_Int.t; val SC_THREAD_STACK_MIN = _const "Posix_ProcEnv_SC_THREAD_STACK_MIN" : C_Int.t; val SC_THREAD_THREADS_MAX = _const "Posix_ProcEnv_SC_THREAD_THREADS_MAX" : C_Int.t; val SC_THREADS = _const "Posix_ProcEnv_SC_THREADS" : C_Int.t; val SC_TIMEOUTS = _const "Posix_ProcEnv_SC_TIMEOUTS" : C_Int.t; val SC_TIMER_MAX = _const "Posix_ProcEnv_SC_TIMER_MAX" : C_Int.t; val SC_TIMERS = _const "Posix_ProcEnv_SC_TIMERS" : C_Int.t; val SC_TRACE = _const "Posix_ProcEnv_SC_TRACE" : C_Int.t; val SC_TRACE_EVENT_FILTER = _const "Posix_ProcEnv_SC_TRACE_EVENT_FILTER" : C_Int.t; val SC_TRACE_EVENT_NAME_MAX = _const "Posix_ProcEnv_SC_TRACE_EVENT_NAME_MAX" : C_Int.t; val SC_TRACE_INHERIT = _const "Posix_ProcEnv_SC_TRACE_INHERIT" : C_Int.t; val SC_TRACE_LOG = _const "Posix_ProcEnv_SC_TRACE_LOG" : C_Int.t; val SC_TRACE_NAME_MAX = _const "Posix_ProcEnv_SC_TRACE_NAME_MAX" : C_Int.t; val SC_TRACE_SYS_MAX = _const "Posix_ProcEnv_SC_TRACE_SYS_MAX" : C_Int.t; val SC_TRACE_USER_EVENT_MAX = _const "Posix_ProcEnv_SC_TRACE_USER_EVENT_MAX" : C_Int.t; val SC_TTY_NAME_MAX = _const "Posix_ProcEnv_SC_TTY_NAME_MAX" : C_Int.t; val SC_TYPED_MEMORY_OBJECTS = _const "Posix_ProcEnv_SC_TYPED_MEMORY_OBJECTS" : C_Int.t; val SC_TZNAME_MAX = _const "Posix_ProcEnv_SC_TZNAME_MAX" : C_Int.t; val SC_V6_ILP32_OFF32 = _const "Posix_ProcEnv_SC_V6_ILP32_OFF32" : C_Int.t; val SC_V6_ILP32_OFFBIG = _const "Posix_ProcEnv_SC_V6_ILP32_OFFBIG" : C_Int.t; val SC_V6_LP64_OFF64 = _const "Posix_ProcEnv_SC_V6_LP64_OFF64" : C_Int.t; val SC_V6_LPBIG_OFFBIG = _const "Posix_ProcEnv_SC_V6_LPBIG_OFFBIG" : C_Int.t; val SC_VERSION = _const "Posix_ProcEnv_SC_VERSION" : C_Int.t; val SC_XBS5_ILP32_OFF32 = _const "Posix_ProcEnv_SC_XBS5_ILP32_OFF32" : C_Int.t; val SC_XBS5_ILP32_OFFBIG = _const "Posix_ProcEnv_SC_XBS5_ILP32_OFFBIG" : C_Int.t; val SC_XBS5_LP64_OFF64 = _const "Posix_ProcEnv_SC_XBS5_LP64_OFF64" : C_Int.t; val SC_XBS5_LPBIG_OFFBIG = _const "Posix_ProcEnv_SC_XBS5_LPBIG_OFFBIG" : C_Int.t; val SC_XOPEN_CRYPT = _const "Posix_ProcEnv_SC_XOPEN_CRYPT" : C_Int.t; val SC_XOPEN_ENH_I18N = _const "Posix_ProcEnv_SC_XOPEN_ENH_I18N" : C_Int.t; val SC_XOPEN_LEGACY = _const "Posix_ProcEnv_SC_XOPEN_LEGACY" : C_Int.t; val SC_XOPEN_REALTIME = _const "Posix_ProcEnv_SC_XOPEN_REALTIME" : C_Int.t; val SC_XOPEN_REALTIME_THREADS = _const "Posix_ProcEnv_SC_XOPEN_REALTIME_THREADS" : C_Int.t; val SC_XOPEN_SHM = _const "Posix_ProcEnv_SC_XOPEN_SHM" : C_Int.t; val SC_XOPEN_STREAMS = _const "Posix_ProcEnv_SC_XOPEN_STREAMS" : C_Int.t; val SC_XOPEN_UNIX = _const "Posix_ProcEnv_SC_XOPEN_UNIX" : C_Int.t; val SC_XOPEN_VERSION = _const "Posix_ProcEnv_SC_XOPEN_VERSION" : C_Int.t; val setenv = _import "Posix_ProcEnv_setenv" private : NullString8.t * NullString8.t -> (C_Int.t) C_Errno.t; val setgid = _import "Posix_ProcEnv_setgid" private : C_GId.t -> (C_Int.t) C_Errno.t; val setgroups = _import "Posix_ProcEnv_setgroups" private : C_Int.t * (C_GId.t) vector -> (C_Int.t) C_Errno.t; val setpgid = _import "Posix_ProcEnv_setpgid" private : C_PId.t * C_PId.t -> (C_Int.t) C_Errno.t; val setsid = _import "Posix_ProcEnv_setsid" private : unit -> (C_PId.t) C_Errno.t; val setuid = _import "Posix_ProcEnv_setuid" private : C_UId.t -> (C_Int.t) C_Errno.t; val sysconf = _import "Posix_ProcEnv_sysconf" private : C_Int.t -> (C_Long.t) C_Errno.t; val times = _import "Posix_ProcEnv_times" private : unit -> (C_Clock.t) C_Errno.t; structure Times = struct val getCSTime = _import "Posix_ProcEnv_Times_getCSTime" private : unit -> C_Clock.t; val getCUTime = _import "Posix_ProcEnv_Times_getCUTime" private : unit -> C_Clock.t; val getSTime = _import "Posix_ProcEnv_Times_getSTime" private : unit -> C_Clock.t; val getUTime = _import "Posix_ProcEnv_Times_getUTime" private : unit -> C_Clock.t; end val ttyname = _import "Posix_ProcEnv_ttyname" private : C_Fd.t -> (C_String.t) C_Errno.t; val uname = _import "Posix_ProcEnv_uname" private : unit -> (C_Int.t) C_Errno.t; structure Uname = struct val getMachine = _import "Posix_ProcEnv_Uname_getMachine" private : unit -> C_String.t; val getNodeName = _import "Posix_ProcEnv_Uname_getNodeName" private : unit -> C_String.t; val getRelease = _import "Posix_ProcEnv_Uname_getRelease" private : unit -> C_String.t; val getSysName = _import "Posix_ProcEnv_Uname_getSysName" private : unit -> C_String.t; val getVersion = _import "Posix_ProcEnv_Uname_getVersion" private : unit -> C_String.t; end end structure Process = struct val alarm = _import "Posix_Process_alarm" private : C_UInt.t -> C_UInt.t; val exece = _import "Posix_Process_exece" private : NullString8.t * (NullString8.t) array * (NullString8.t) array -> (C_Int.t) C_Errno.t; val execp = _import "Posix_Process_execp" private : NullString8.t * (NullString8.t) array -> (C_Int.t) C_Errno.t; val exit = _import "Posix_Process_exit" private : C_Status.t -> unit; val exitStatus = _import "Posix_Process_exitStatus" private : C_Status.t -> C_Int.t; val fork = _import "Posix_Process_fork" private : unit -> (C_PId.t) C_Errno.t; val ifExited = _import "Posix_Process_ifExited" private : C_Status.t -> C_Int.t; val ifSignaled = _import "Posix_Process_ifSignaled" private : C_Status.t -> C_Int.t; val ifStopped = _import "Posix_Process_ifStopped" private : C_Status.t -> C_Int.t; val kill = _import "Posix_Process_kill" private : C_PId.t * C_Signal.t -> (C_Int.t) C_Errno.t; val nanosleep = _import "Posix_Process_nanosleep" private : (C_Time.t) ref * (C_Long.t) ref -> (C_Int.t) C_Errno.t; val pause = _import "Posix_Process_pause" private : unit -> (C_Int.t) C_Errno.t; val sleep = _import "Posix_Process_sleep" private : C_UInt.t -> C_UInt.t; val stopSig = _import "Posix_Process_stopSig" private : C_Status.t -> C_Signal.t; val system = _import "Posix_Process_system" private : NullString8.t -> (C_Status.t) C_Errno.t; val termSig = _import "Posix_Process_termSig" private : C_Status.t -> C_Signal.t; structure W = struct val NOHANG = _const "Posix_Process_W_NOHANG" : C_Int.t; val UNTRACED = _const "Posix_Process_W_UNTRACED" : C_Int.t; end val waitpid = _import "Posix_Process_waitpid" private : C_PId.t * (C_Status.t) ref * C_Int.t -> (C_PId.t) C_Errno.t; end structure Signal = struct val default = _import "Posix_Signal_default" private : C_Signal.t -> (C_Int.t) C_Errno.t; val handlee = _import "Posix_Signal_handlee" private : C_Signal.t -> (C_Int.t) C_Errno.t; val handleGC = _import "Posix_Signal_handleGC" private : unit -> unit; val ignore = _import "Posix_Signal_ignore" private : C_Signal.t -> (C_Int.t) C_Errno.t; val isDefault = _import "Posix_Signal_isDefault" private : C_Signal.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val isIgnore = _import "Posix_Signal_isIgnore" private : C_Signal.t * (C_Int.t) ref -> (C_Int.t) C_Errno.t; val isPending = _import "Posix_Signal_isPending" private : C_Signal.t -> C_Int.t; val isPendingGC = _import "Posix_Signal_isPendingGC" private : unit -> C_Int.t; val NSIG = _const "Posix_Signal_NSIG" : C_Int.t; val resetPending = _import "Posix_Signal_resetPending" private : unit -> unit; val SIG_BLOCK = _const "Posix_Signal_SIG_BLOCK" : C_Int.t; val SIG_SETMASK = _const "Posix_Signal_SIG_SETMASK" : C_Int.t; val SIG_UNBLOCK = _const "Posix_Signal_SIG_UNBLOCK" : C_Int.t; val SIGABRT = _const "Posix_Signal_SIGABRT" : C_Signal.t; val sigaddset = _import "Posix_Signal_sigaddset" private : C_Signal.t -> (C_Int.t) C_Errno.t; val SIGALRM = _const "Posix_Signal_SIGALRM" : C_Signal.t; val SIGBUS = _const "Posix_Signal_SIGBUS" : C_Signal.t; val SIGCHLD = _const "Posix_Signal_SIGCHLD" : C_Signal.t; val SIGCONT = _const "Posix_Signal_SIGCONT" : C_Signal.t; val sigdelset = _import "Posix_Signal_sigdelset" private : C_Signal.t -> (C_Int.t) C_Errno.t; val sigemptyset = _import "Posix_Signal_sigemptyset" private : unit -> (C_Int.t) C_Errno.t; val sigfillset = _import "Posix_Signal_sigfillset" private : unit -> (C_Int.t) C_Errno.t; val SIGFPE = _const "Posix_Signal_SIGFPE" : C_Signal.t; val SIGHUP = _const "Posix_Signal_SIGHUP" : C_Signal.t; val SIGILL = _const "Posix_Signal_SIGILL" : C_Signal.t; val SIGINT = _const "Posix_Signal_SIGINT" : C_Signal.t; val sigismember = _import "Posix_Signal_sigismember" private : C_Signal.t -> (C_Int.t) C_Errno.t; val SIGKILL = _const "Posix_Signal_SIGKILL" : C_Signal.t; val SIGPIPE = _const "Posix_Signal_SIGPIPE" : C_Signal.t; val SIGPOLL = _const "Posix_Signal_SIGPOLL" : C_Signal.t; val sigprocmask = _import "Posix_Signal_sigprocmask" private : C_Int.t -> (C_Int.t) C_Errno.t; val SIGPROF = _const "Posix_Signal_SIGPROF" : C_Signal.t; val SIGQUIT = _const "Posix_Signal_SIGQUIT" : C_Signal.t; val SIGSEGV = _const "Posix_Signal_SIGSEGV" : C_Signal.t; val SIGSTOP = _const "Posix_Signal_SIGSTOP" : C_Signal.t; val sigsuspend = _import "Posix_Signal_sigsuspend" private : unit -> unit; val SIGSYS = _const "Posix_Signal_SIGSYS" : C_Signal.t; val SIGTERM = _const "Posix_Signal_SIGTERM" : C_Signal.t; val SIGTRAP = _const "Posix_Signal_SIGTRAP" : C_Signal.t; val SIGTSTP = _const "Posix_Signal_SIGTSTP" : C_Signal.t; val SIGTTIN = _const "Posix_Signal_SIGTTIN" : C_Signal.t; val SIGTTOU = _const "Posix_Signal_SIGTTOU" : C_Signal.t; val SIGURG = _const "Posix_Signal_SIGURG" : C_Signal.t; val SIGUSR1 = _const "Posix_Signal_SIGUSR1" : C_Signal.t; val SIGUSR2 = _const "Posix_Signal_SIGUSR2" : C_Signal.t; val SIGVTALRM = _const "Posix_Signal_SIGVTALRM" : C_Signal.t; val SIGXCPU = _const "Posix_Signal_SIGXCPU" : C_Signal.t; val SIGXFSZ = _const "Posix_Signal_SIGXFSZ" : C_Signal.t; end structure SysDB = struct val getgrgid = _import "Posix_SysDB_getgrgid" private : C_GId.t -> (C_Int.t) C_Errno.t; val getgrnam = _import "Posix_SysDB_getgrnam" private : NullString8.t -> (C_Int.t) C_Errno.t; val getpwnam = _import "Posix_SysDB_getpwnam" private : NullString8.t -> (C_Int.t) C_Errno.t; val getpwuid = _import "Posix_SysDB_getpwuid" private : C_GId.t -> (C_Int.t) C_Errno.t; structure Group = struct val getGId = _import "Posix_SysDB_Group_getGId" private : unit -> C_GId.t; val getMem = _import "Posix_SysDB_Group_getMem" private : unit -> C_StringArray.t; val getName = _import "Posix_SysDB_Group_getName" private : unit -> C_String.t; end structure Passwd = struct val getDir = _import "Posix_SysDB_Passwd_getDir" private : unit -> C_String.t; val getGId = _import "Posix_SysDB_Passwd_getGId" private : unit -> C_GId.t; val getName = _import "Posix_SysDB_Passwd_getName" private : unit -> C_String.t; val getShell = _import "Posix_SysDB_Passwd_getShell" private : unit -> C_String.t; val getUId = _import "Posix_SysDB_Passwd_getUId" private : unit -> C_UId.t; end end structure TTY = struct val B0 = _const "Posix_TTY_B0" : C_Speed.t; val B110 = _const "Posix_TTY_B110" : C_Speed.t; val B1200 = _const "Posix_TTY_B1200" : C_Speed.t; val B134 = _const "Posix_TTY_B134" : C_Speed.t; val B150 = _const "Posix_TTY_B150" : C_Speed.t; val B1800 = _const "Posix_TTY_B1800" : C_Speed.t; val B19200 = _const "Posix_TTY_B19200" : C_Speed.t; val B200 = _const "Posix_TTY_B200" : C_Speed.t; val B2400 = _const "Posix_TTY_B2400" : C_Speed.t; val B300 = _const "Posix_TTY_B300" : C_Speed.t; val B38400 = _const "Posix_TTY_B38400" : C_Speed.t; val B4800 = _const "Posix_TTY_B4800" : C_Speed.t; val B50 = _const "Posix_TTY_B50" : C_Speed.t; val B600 = _const "Posix_TTY_B600" : C_Speed.t; val B75 = _const "Posix_TTY_B75" : C_Speed.t; val B9600 = _const "Posix_TTY_B9600" : C_Speed.t; structure C = struct val CLOCAL = _const "Posix_TTY_C_CLOCAL" : C_TCFlag.t; val CREAD = _const "Posix_TTY_C_CREAD" : C_TCFlag.t; val CS5 = _const "Posix_TTY_C_CS5" : C_TCFlag.t; val CS6 = _const "Posix_TTY_C_CS6" : C_TCFlag.t; val CS7 = _const "Posix_TTY_C_CS7" : C_TCFlag.t; val CS8 = _const "Posix_TTY_C_CS8" : C_TCFlag.t; val CSIZE = _const "Posix_TTY_C_CSIZE" : C_TCFlag.t; val CSTOPB = _const "Posix_TTY_C_CSTOPB" : C_TCFlag.t; val HUPCL = _const "Posix_TTY_C_HUPCL" : C_TCFlag.t; val PARENB = _const "Posix_TTY_C_PARENB" : C_TCFlag.t; val PARODD = _const "Posix_TTY_C_PARODD" : C_TCFlag.t; end structure I = struct val BRKINT = _const "Posix_TTY_I_BRKINT" : C_TCFlag.t; val ICRNL = _const "Posix_TTY_I_ICRNL" : C_TCFlag.t; val IGNBRK = _const "Posix_TTY_I_IGNBRK" : C_TCFlag.t; val IGNCR = _const "Posix_TTY_I_IGNCR" : C_TCFlag.t; val IGNPAR = _const "Posix_TTY_I_IGNPAR" : C_TCFlag.t; val INLCR = _const "Posix_TTY_I_INLCR" : C_TCFlag.t; val INPCK = _const "Posix_TTY_I_INPCK" : C_TCFlag.t; val ISTRIP = _const "Posix_TTY_I_ISTRIP" : C_TCFlag.t; val IXANY = _const "Posix_TTY_I_IXANY" : C_TCFlag.t; val IXOFF = _const "Posix_TTY_I_IXOFF" : C_TCFlag.t; val IXON = _const "Posix_TTY_I_IXON" : C_TCFlag.t; val PARMRK = _const "Posix_TTY_I_PARMRK" : C_TCFlag.t; end structure L = struct val ECHO = _const "Posix_TTY_L_ECHO" : C_TCFlag.t; val ECHOE = _const "Posix_TTY_L_ECHOE" : C_TCFlag.t; val ECHOK = _const "Posix_TTY_L_ECHOK" : C_TCFlag.t; val ECHONL = _const "Posix_TTY_L_ECHONL" : C_TCFlag.t; val ICANON = _const "Posix_TTY_L_ICANON" : C_TCFlag.t; val IEXTEN = _const "Posix_TTY_L_IEXTEN" : C_TCFlag.t; val ISIG = _const "Posix_TTY_L_ISIG" : C_TCFlag.t; val NOFLSH = _const "Posix_TTY_L_NOFLSH" : C_TCFlag.t; val TOSTOP = _const "Posix_TTY_L_TOSTOP" : C_TCFlag.t; end structure O = struct val BS0 = _const "Posix_TTY_O_BS0" : C_TCFlag.t; val BS1 = _const "Posix_TTY_O_BS1" : C_TCFlag.t; val BSDLY = _const "Posix_TTY_O_BSDLY" : C_TCFlag.t; val CR0 = _const "Posix_TTY_O_CR0" : C_TCFlag.t; val CR1 = _const "Posix_TTY_O_CR1" : C_TCFlag.t; val CR2 = _const "Posix_TTY_O_CR2" : C_TCFlag.t; val CR3 = _const "Posix_TTY_O_CR3" : C_TCFlag.t; val CRDLY = _const "Posix_TTY_O_CRDLY" : C_TCFlag.t; val FF0 = _const "Posix_TTY_O_FF0" : C_TCFlag.t; val FF1 = _const "Posix_TTY_O_FF1" : C_TCFlag.t; val FFDLY = _const "Posix_TTY_O_FFDLY" : C_TCFlag.t; val NL0 = _const "Posix_TTY_O_NL0" : C_TCFlag.t; val NL1 = _const "Posix_TTY_O_NL1" : C_TCFlag.t; val NLDLY = _const "Posix_TTY_O_NLDLY" : C_TCFlag.t; val OCRNL = _const "Posix_TTY_O_OCRNL" : C_TCFlag.t; val OFILL = _const "Posix_TTY_O_OFILL" : C_TCFlag.t; val ONLCR = _const "Posix_TTY_O_ONLCR" : C_TCFlag.t; val ONLRET = _const "Posix_TTY_O_ONLRET" : C_TCFlag.t; val ONOCR = _const "Posix_TTY_O_ONOCR" : C_TCFlag.t; val OPOST = _const "Posix_TTY_O_OPOST" : C_TCFlag.t; val TAB0 = _const "Posix_TTY_O_TAB0" : C_TCFlag.t; val TAB1 = _const "Posix_TTY_O_TAB1" : C_TCFlag.t; val TAB2 = _const "Posix_TTY_O_TAB2" : C_TCFlag.t; val TAB3 = _const "Posix_TTY_O_TAB3" : C_TCFlag.t; val TABDLY = _const "Posix_TTY_O_TABDLY" : C_TCFlag.t; val VT0 = _const "Posix_TTY_O_VT0" : C_TCFlag.t; val VT1 = _const "Posix_TTY_O_VT1" : C_TCFlag.t; val VTDLY = _const "Posix_TTY_O_VTDLY" : C_TCFlag.t; end structure TC = struct val drain = _import "Posix_TTY_TC_drain" private : C_Fd.t -> (C_Int.t) C_Errno.t; val flow = _import "Posix_TTY_TC_flow" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val flush = _import "Posix_TTY_TC_flush" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val getattr = _import "Posix_TTY_TC_getattr" private : C_Fd.t -> (C_Int.t) C_Errno.t; val getpgrp = _import "Posix_TTY_TC_getpgrp" private : C_Fd.t -> (C_PId.t) C_Errno.t; val sendbreak = _import "Posix_TTY_TC_sendbreak" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val setattr = _import "Posix_TTY_TC_setattr" private : C_Fd.t * C_Int.t -> (C_Int.t) C_Errno.t; val setpgrp = _import "Posix_TTY_TC_setpgrp" private : C_Fd.t * C_PId.t -> (C_Int.t) C_Errno.t; val TCIFLUSH = _const "Posix_TTY_TC_TCIFLUSH" : C_Int.t; val TCIOFF = _const "Posix_TTY_TC_TCIOFF" : C_Int.t; val TCIOFLUSH = _const "Posix_TTY_TC_TCIOFLUSH" : C_Int.t; val TCION = _const "Posix_TTY_TC_TCION" : C_Int.t; val TCOFLUSH = _const "Posix_TTY_TC_TCOFLUSH" : C_Int.t; val TCOOFF = _const "Posix_TTY_TC_TCOOFF" : C_Int.t; val TCOON = _const "Posix_TTY_TC_TCOON" : C_Int.t; val TCSADRAIN = _const "Posix_TTY_TC_TCSADRAIN" : C_Int.t; val TCSAFLUSH = _const "Posix_TTY_TC_TCSAFLUSH" : C_Int.t; val TCSANOW = _const "Posix_TTY_TC_TCSANOW" : C_Int.t; end structure Termios = struct val cfGetISpeed = _import "Posix_TTY_Termios_cfGetISpeed" private : unit -> C_Speed.t; val cfGetOSpeed = _import "Posix_TTY_Termios_cfGetOSpeed" private : unit -> C_Speed.t; val cfSetISpeed = _import "Posix_TTY_Termios_cfSetISpeed" private : C_Speed.t -> (C_Int.t) C_Errno.t; val cfSetOSpeed = _import "Posix_TTY_Termios_cfSetOSpeed" private : C_Speed.t -> (C_Int.t) C_Errno.t; val getCC = _import "Posix_TTY_Termios_getCC" private : (C_CC.t) array -> unit; val getCFlag = _import "Posix_TTY_Termios_getCFlag" private : unit -> C_TCFlag.t; val getIFlag = _import "Posix_TTY_Termios_getIFlag" private : unit -> C_TCFlag.t; val getLFlag = _import "Posix_TTY_Termios_getLFlag" private : unit -> C_TCFlag.t; val getOFlag = _import "Posix_TTY_Termios_getOFlag" private : unit -> C_TCFlag.t; val setCC = _import "Posix_TTY_Termios_setCC" private : (C_CC.t) array -> unit; val setCFlag = _import "Posix_TTY_Termios_setCFlag" private : C_TCFlag.t -> unit; val setIFlag = _import "Posix_TTY_Termios_setIFlag" private : C_TCFlag.t -> unit; val setLFlag = _import "Posix_TTY_Termios_setLFlag" private : C_TCFlag.t -> unit; val setOFlag = _import "Posix_TTY_Termios_setOFlag" private : C_TCFlag.t -> unit; end structure V = struct val NCCS = _const "Posix_TTY_V_NCCS" : C_Int.t; val VEOF = _const "Posix_TTY_V_VEOF" : C_Int.t; val VEOL = _const "Posix_TTY_V_VEOL" : C_Int.t; val VERASE = _const "Posix_TTY_V_VERASE" : C_Int.t; val VINTR = _const "Posix_TTY_V_VINTR" : C_Int.t; val VKILL = _const "Posix_TTY_V_VKILL" : C_Int.t; val VMIN = _const "Posix_TTY_V_VMIN" : C_Int.t; val VQUIT = _const "Posix_TTY_V_VQUIT" : C_Int.t; val VSTART = _const "Posix_TTY_V_VSTART" : C_Int.t; val VSTOP = _const "Posix_TTY_V_VSTOP" : C_Int.t; val VSUSP = _const "Posix_TTY_V_VSUSP" : C_Int.t; val VTIME = _const "Posix_TTY_V_VTIME" : C_Int.t; end end end structure Real32 = struct type t = Real32.t val abs = _import "Real32_abs" private : Real32.t -> Real32.t; val add = _import "Real32_add" private : Real32.t * Real32.t -> Real32.t; val castToWord32 = _import "Real32_castToWord32" private : Real32.t -> Word32.t; val class = _import "Real32_class" private : Real32.t -> C_Int.t; val div = _import "Real32_div" private : Real32.t * Real32.t -> Real32.t; val equal = _import "Real32_equal" private : Real32.t * Real32.t -> Bool.t; val fetch = _import "Real32_fetch" private : (Real32.t) ref -> Real32.t; val frexp = _import "Real32_frexp" private : Real32.t * (C_Int.t) ref -> Real32.t; val gdtoa = _import "Real32_gdtoa" private : Real32.t * C_Int.t * C_Int.t * C_Int.t * (C_Int.t) ref -> C_String.t; val ldexp = _import "Real32_ldexp" private : Real32.t * C_Int.t -> Real32.t; val le = _import "Real32_le" private : Real32.t * Real32.t -> Bool.t; val lt = _import "Real32_lt" private : Real32.t * Real32.t -> Bool.t; structure Math = struct val acos = _import "Real32_Math_acos" private : Real32.t -> Real32.t; val asin = _import "Real32_Math_asin" private : Real32.t -> Real32.t; val atan = _import "Real32_Math_atan" private : Real32.t -> Real32.t; val atan2 = _import "Real32_Math_atan2" private : Real32.t * Real32.t -> Real32.t; val cos = _import "Real32_Math_cos" private : Real32.t -> Real32.t; val cosh = _import "Real32_Math_cosh" private : Real32.t -> Real32.t; val (eGet, eSet) = _symbol "Real32_Math_e" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val exp = _import "Real32_Math_exp" private : Real32.t -> Real32.t; val ln = _import "Real32_Math_ln" private : Real32.t -> Real32.t; val log10 = _import "Real32_Math_log10" private : Real32.t -> Real32.t; val (piGet, piSet) = _symbol "Real32_Math_pi" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val pow = _import "Real32_Math_pow" private : Real32.t * Real32.t -> Real32.t; val sin = _import "Real32_Math_sin" private : Real32.t -> Real32.t; val sinh = _import "Real32_Math_sinh" private : Real32.t -> Real32.t; val sqrt = _import "Real32_Math_sqrt" private : Real32.t -> Real32.t; val tan = _import "Real32_Math_tan" private : Real32.t -> Real32.t; val tanh = _import "Real32_Math_tanh" private : Real32.t -> Real32.t; end val (maxFiniteGet, maxFiniteSet) = _symbol "Real32_maxFinite" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val (minNormalPosGet, minNormalPosSet) = _symbol "Real32_minNormalPos" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val (minPosGet, minPosSet) = _symbol "Real32_minPos" private : (unit -> (Real32.t)) * ((Real32.t) -> unit); val modf = _import "Real32_modf" private : Real32.t * (Real32.t) ref -> Real32.t; val move = _import "Real32_move" private : (Real32.t) ref * (Real32.t) ref -> unit; val mul = _import "Real32_mul" private : Real32.t * Real32.t -> Real32.t; val muladd = _import "Real32_muladd" private : Real32.t * Real32.t * Real32.t -> Real32.t; val mulsub = _import "Real32_mulsub" private : Real32.t * Real32.t * Real32.t -> Real32.t; val neg = _import "Real32_neg" private : Real32.t -> Real32.t; val rndToReal32 = _import "Real32_rndToReal32" private : Real32.t -> Real32.t; val rndToReal64 = _import "Real32_rndToReal64" private : Real32.t -> Real64.t; val rndToWordS16 = _import "Real32_rndToWordS16" private : Real32.t -> Int16.t; val rndToWordS32 = _import "Real32_rndToWordS32" private : Real32.t -> Int32.t; val rndToWordS64 = _import "Real32_rndToWordS64" private : Real32.t -> Int64.t; val rndToWordS8 = _import "Real32_rndToWordS8" private : Real32.t -> Int8.t; val rndToWordU16 = _import "Real32_rndToWordU16" private : Real32.t -> Word16.t; val rndToWordU32 = _import "Real32_rndToWordU32" private : Real32.t -> Word32.t; val rndToWordU64 = _import "Real32_rndToWordU64" private : Real32.t -> Word64.t; val rndToWordU8 = _import "Real32_rndToWordU8" private : Real32.t -> Word8.t; val round = _import "Real32_round" private : Real32.t -> Real32.t; val signBit = _import "Real32_signBit" private : Real32.t -> C_Int.t; val store = _import "Real32_store" private : (Real32.t) ref * Real32.t -> unit; val strto = _import "Real32_strto" private : NullString8.t * C_Int.t -> Real32.t; val sub = _import "Real32_sub" private : Real32.t * Real32.t -> Real32.t; end structure Real64 = struct type t = Real64.t val abs = _import "Real64_abs" private : Real64.t -> Real64.t; val add = _import "Real64_add" private : Real64.t * Real64.t -> Real64.t; val castToWord64 = _import "Real64_castToWord64" private : Real64.t -> Word64.t; val class = _import "Real64_class" private : Real64.t -> C_Int.t; val div = _import "Real64_div" private : Real64.t * Real64.t -> Real64.t; val equal = _import "Real64_equal" private : Real64.t * Real64.t -> Bool.t; val fetch = _import "Real64_fetch" private : (Real64.t) ref -> Real64.t; val frexp = _import "Real64_frexp" private : Real64.t * (C_Int.t) ref -> Real64.t; val gdtoa = _import "Real64_gdtoa" private : Real64.t * C_Int.t * C_Int.t * C_Int.t * (C_Int.t) ref -> C_String.t; val ldexp = _import "Real64_ldexp" private : Real64.t * C_Int.t -> Real64.t; val le = _import "Real64_le" private : Real64.t * Real64.t -> Bool.t; val lt = _import "Real64_lt" private : Real64.t * Real64.t -> Bool.t; structure Math = struct val acos = _import "Real64_Math_acos" private : Real64.t -> Real64.t; val asin = _import "Real64_Math_asin" private : Real64.t -> Real64.t; val atan = _import "Real64_Math_atan" private : Real64.t -> Real64.t; val atan2 = _import "Real64_Math_atan2" private : Real64.t * Real64.t -> Real64.t; val cos = _import "Real64_Math_cos" private : Real64.t -> Real64.t; val cosh = _import "Real64_Math_cosh" private : Real64.t -> Real64.t; val (eGet, eSet) = _symbol "Real64_Math_e" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val exp = _import "Real64_Math_exp" private : Real64.t -> Real64.t; val ln = _import "Real64_Math_ln" private : Real64.t -> Real64.t; val log10 = _import "Real64_Math_log10" private : Real64.t -> Real64.t; val (piGet, piSet) = _symbol "Real64_Math_pi" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val pow = _import "Real64_Math_pow" private : Real64.t * Real64.t -> Real64.t; val sin = _import "Real64_Math_sin" private : Real64.t -> Real64.t; val sinh = _import "Real64_Math_sinh" private : Real64.t -> Real64.t; val sqrt = _import "Real64_Math_sqrt" private : Real64.t -> Real64.t; val tan = _import "Real64_Math_tan" private : Real64.t -> Real64.t; val tanh = _import "Real64_Math_tanh" private : Real64.t -> Real64.t; end val (maxFiniteGet, maxFiniteSet) = _symbol "Real64_maxFinite" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val (minNormalPosGet, minNormalPosSet) = _symbol "Real64_minNormalPos" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val (minPosGet, minPosSet) = _symbol "Real64_minPos" private : (unit -> (Real64.t)) * ((Real64.t) -> unit); val modf = _import "Real64_modf" private : Real64.t * (Real64.t) ref -> Real64.t; val move = _import "Real64_move" private : (Real64.t) ref * (Real64.t) ref -> unit; val mul = _import "Real64_mul" private : Real64.t * Real64.t -> Real64.t; val muladd = _import "Real64_muladd" private : Real64.t * Real64.t * Real64.t -> Real64.t; val mulsub = _import "Real64_mulsub" private : Real64.t * Real64.t * Real64.t -> Real64.t; val neg = _import "Real64_neg" private : Real64.t -> Real64.t; val rndToReal32 = _import "Real64_rndToReal32" private : Real64.t -> Real32.t; val rndToReal64 = _import "Real64_rndToReal64" private : Real64.t -> Real64.t; val rndToWordS16 = _import "Real64_rndToWordS16" private : Real64.t -> Int16.t; val rndToWordS32 = _import "Real64_rndToWordS32" private : Real64.t -> Int32.t; val rndToWordS64 = _import "Real64_rndToWordS64" private : Real64.t -> Int64.t; val rndToWordS8 = _import "Real64_rndToWordS8" private : Real64.t -> Int8.t; val rndToWordU16 = _import "Real64_rndToWordU16" private : Real64.t -> Word16.t; val rndToWordU32 = _import "Real64_rndToWordU32" private : Real64.t -> Word32.t; val rndToWordU64 = _import "Real64_rndToWordU64" private : Real64.t -> Word64.t; val rndToWordU8 = _import "Real64_rndToWordU8" private : Real64.t -> Word8.t; val round = _import "Real64_round" private : Real64.t -> Real64.t; val signBit = _import "Real64_signBit" private : Real64.t -> C_Int.t; val store = _import "Real64_store" private : (Real64.t) ref * Real64.t -> unit; val strto = _import "Real64_strto" private : NullString8.t * C_Int.t -> Real64.t; val sub = _import "Real64_sub" private : Real64.t * Real64.t -> Real64.t; end structure Socket = struct val accept = _import "Socket_accept" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; structure AF = struct val INET = _const "Socket_AF_INET" : C_Int.t; val INET6 = _const "Socket_AF_INET6" : C_Int.t; val UNIX = _const "Socket_AF_UNIX" : C_Int.t; val UNSPEC = _const "Socket_AF_UNSPEC" : C_Int.t; end val bind = _import "Socket_bind" private : C_Sock.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; val close = _import "Socket_close" private : C_Sock.t -> (C_Int.t) C_Errno.t; val connect = _import "Socket_connect" private : C_Sock.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; structure Ctl = struct val FIONBIO = _const "Socket_Ctl_FIONBIO" : C_Int.t; val FIONREAD = _const "Socket_Ctl_FIONREAD" : C_Int.t; val getIOCtl = _import "Socket_Ctl_getIOCtl" private : C_Sock.t * C_Int.t * (Word8.t) array -> (C_Int.t) C_Errno.t; val getPeerName = _import "Socket_Ctl_getPeerName" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val getSockName = _import "Socket_Ctl_getSockName" private : C_Sock.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val getSockOpt = _import "Socket_Ctl_getSockOpt" private : C_Sock.t * C_Int.t * C_Int.t * (Word8.t) array * (C_Socklen.t) ref -> (C_Int.t) C_Errno.t; val setIOCtl = _import "Socket_Ctl_setIOCtl" private : C_Sock.t * C_Int.t * (Word8.t) vector -> (C_Int.t) C_Errno.t; val setSockOpt = _import "Socket_Ctl_setSockOpt" private : C_Sock.t * C_Int.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_Int.t) C_Errno.t; val SIOCATMARK = _const "Socket_Ctl_SIOCATMARK" : C_Int.t; val SO_ACCEPTCONN = _const "Socket_Ctl_SO_ACCEPTCONN" : C_Int.t; val SO_BROADCAST = _const "Socket_Ctl_SO_BROADCAST" : C_Int.t; val SO_DEBUG = _const "Socket_Ctl_SO_DEBUG" : C_Int.t; val SO_DONTROUTE = _const "Socket_Ctl_SO_DONTROUTE" : C_Int.t; val SO_ERROR = _const "Socket_Ctl_SO_ERROR" : C_Int.t; val SO_KEEPALIVE = _const "Socket_Ctl_SO_KEEPALIVE" : C_Int.t; val SO_LINGER = _const "Socket_Ctl_SO_LINGER" : C_Int.t; val SO_OOBINLINE = _const "Socket_Ctl_SO_OOBINLINE" : C_Int.t; val SO_RCVBUF = _const "Socket_Ctl_SO_RCVBUF" : C_Int.t; val SO_RCVLOWAT = _const "Socket_Ctl_SO_RCVLOWAT" : C_Int.t; val SO_RCVTIMEO = _const "Socket_Ctl_SO_RCVTIMEO" : C_Int.t; val SO_REUSEADDR = _const "Socket_Ctl_SO_REUSEADDR" : C_Int.t; val SO_SNDBUF = _const "Socket_Ctl_SO_SNDBUF" : C_Int.t; val SO_SNDLOWAT = _const "Socket_Ctl_SO_SNDLOWAT" : C_Int.t; val SO_SNDTIMEO = _const "Socket_Ctl_SO_SNDTIMEO" : C_Int.t; val SO_TYPE = _const "Socket_Ctl_SO_TYPE" : C_Int.t; val SOL_SOCKET = _const "Socket_Ctl_SOL_SOCKET" : C_Int.t; end val familyOfAddr = _import "Socket_familyOfAddr" private : (Word8.t) vector -> C_Int.t; structure GenericSock = struct val socket = _import "Socket_GenericSock_socket" private : C_Int.t * C_Int.t * C_Int.t -> (C_Int.t) C_Errno.t; val socketPair = _import "Socket_GenericSock_socketPair" private : C_Int.t * C_Int.t * C_Int.t * (C_Int.t) array -> (C_Int.t) C_Errno.t; end val getTimeout_sec = _import "Socket_getTimeout_sec" private : unit -> C_Time.t; val getTimeout_usec = _import "Socket_getTimeout_usec" private : unit -> C_SUSeconds.t; structure INetSock = struct structure Ctl = struct val IPPROTO_TCP = _const "Socket_INetSock_Ctl_IPPROTO_TCP" : C_Int.t; val TCP_NODELAY = _const "Socket_INetSock_Ctl_TCP_NODELAY" : C_Int.t; end val fromAddr = _import "Socket_INetSock_fromAddr" private : (Word8.t) vector -> unit; val getInAddr = _import "Socket_INetSock_getInAddr" private : (Word8.t) array -> unit; val getPort = _import "Socket_INetSock_getPort" private : unit -> Word16.t; val toAddr = _import "Socket_INetSock_toAddr" private : (Word8.t) vector * Word16.t * (Word8.t) array * (C_Socklen.t) ref -> unit; end val listen = _import "Socket_listen" private : C_Sock.t * C_Int.t -> (C_Int.t) C_Errno.t; val MSG_CTRUNC = _const "Socket_MSG_CTRUNC" : C_Int.t; val MSG_DONTROUTE = _const "Socket_MSG_DONTROUTE" : C_Int.t; val MSG_DONTWAIT = _const "Socket_MSG_DONTWAIT" : C_Int.t; val MSG_EOR = _const "Socket_MSG_EOR" : C_Int.t; val MSG_OOB = _const "Socket_MSG_OOB" : C_Int.t; val MSG_PEEK = _const "Socket_MSG_PEEK" : C_Int.t; val MSG_TRUNC = _const "Socket_MSG_TRUNC" : C_Int.t; val MSG_WAITALL = _const "Socket_MSG_WAITALL" : C_Int.t; val recv = _import "Socket_recv" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val recvFrom = _import "Socket_recvFrom" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t * (Word8.t) array * (C_Socklen.t) ref -> (C_SSize.t) C_Errno.t; val select = _import "Socket_select" private : (C_Fd.t) vector * (C_Fd.t) vector * (C_Fd.t) vector * (C_Int.t) array * (C_Int.t) array * (C_Int.t) array -> (C_Int.t) C_Errno.t; val sendArr = _import "Socket_sendArr" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val sendArrTo = _import "Socket_sendArrTo" private : C_Sock.t * (Word8.t) array * C_Int.t * C_Size.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_SSize.t) C_Errno.t; val sendVec = _import "Socket_sendVec" private : C_Sock.t * (Word8.t) vector * C_Int.t * C_Size.t * C_Int.t -> (C_SSize.t) C_Errno.t; val sendVecTo = _import "Socket_sendVecTo" private : C_Sock.t * (Word8.t) vector * C_Int.t * C_Size.t * C_Int.t * (Word8.t) vector * C_Socklen.t -> (C_SSize.t) C_Errno.t; val setTimeout = _import "Socket_setTimeout" private : C_Time.t * C_SUSeconds.t -> unit; val setTimeoutNull = _import "Socket_setTimeoutNull" private : unit -> unit; val SHUT_RD = _const "Socket_SHUT_RD" : C_Int.t; val SHUT_RDWR = _const "Socket_SHUT_RDWR" : C_Int.t; val SHUT_WR = _const "Socket_SHUT_WR" : C_Int.t; val shutdown = _import "Socket_shutdown" private : C_Sock.t * C_Int.t -> (C_Int.t) C_Errno.t; structure SOCK = struct val DGRAM = _const "Socket_SOCK_DGRAM" : C_Int.t; val RAW = _const "Socket_SOCK_RAW" : C_Int.t; val SEQPACKET = _const "Socket_SOCK_SEQPACKET" : C_Int.t; val STREAM = _const "Socket_SOCK_STREAM" : C_Int.t; end val sockAddrStorageLen = _const "Socket_sockAddrStorageLen" : C_Size.t; structure UnixSock = struct val fromAddr = _import "Socket_UnixSock_fromAddr" private : (Word8.t) vector * (Char8.t) array * C_Size.t -> unit; val pathLen = _import "Socket_UnixSock_pathLen" private : (Word8.t) vector -> C_Size.t; val toAddr = _import "Socket_UnixSock_toAddr" private : NullString8.t * C_Size.t * (Word8.t) array * (C_Socklen.t) ref -> unit; end end structure Stdio = struct val print = _import "Stdio_print" private : String8.t -> unit; val printStderr = _import "Stdio_printStderr" private : String8.t -> unit; val printStdout = _import "Stdio_printStdout" private : String8.t -> unit; end structure Time = struct val getTimeOfDay = _import "Time_getTimeOfDay" private : (C_Time.t) ref * (C_SUSeconds.t) ref -> C_Int.t; end structure Windows = struct structure Process = struct val create = _import "Windows_Process_create" private : NullString8.t * NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> (C_PId.t) C_Errno.t; val createNull = _import "Windows_Process_createNull" private : NullString8.t * NullString8.t * C_Fd.t * C_Fd.t * C_Fd.t -> (C_PId.t) C_Errno.t; val getexitcode = _import "Windows_Process_getexitcode" private : C_PId.t * (C_Status.t) ref -> (C_Int.t) C_Errno.t; val terminate = _import "Windows_Process_terminate" private : C_PId.t * C_Signal.t -> (C_Int.t) C_Errno.t; end end structure Word16 = struct type t = Word16.t val add = _import "Word16_add" private : Word16.t * Word16.t -> Word16.t; val andb = _import "Word16_andb" private : Word16.t * Word16.t -> Word16.t; val equal = _import "Word16_equal" private : Word16.t * Word16.t -> Bool.t; val lshift = _import "Word16_lshift" private : Word16.t * Word32.t -> Word16.t; val neg = _import "Word16_neg" private : Word16.t -> Word16.t; val notb = _import "Word16_notb" private : Word16.t -> Word16.t; val orb = _import "Word16_orb" private : Word16.t * Word16.t -> Word16.t; val rol = _import "Word16_rol" private : Word16.t * Word32.t -> Word16.t; val ror = _import "Word16_ror" private : Word16.t * Word32.t -> Word16.t; val sub = _import "Word16_sub" private : Word16.t * Word16.t -> Word16.t; val xorb = _import "Word16_xorb" private : Word16.t * Word16.t -> Word16.t; end structure Word32 = struct type t = Word32.t val add = _import "Word32_add" private : Word32.t * Word32.t -> Word32.t; val andb = _import "Word32_andb" private : Word32.t * Word32.t -> Word32.t; val castToReal32 = _import "Word32_castToReal32" private : Word32.t -> Real32.t; val equal = _import "Word32_equal" private : Word32.t * Word32.t -> Bool.t; val lshift = _import "Word32_lshift" private : Word32.t * Word32.t -> Word32.t; val neg = _import "Word32_neg" private : Word32.t -> Word32.t; val notb = _import "Word32_notb" private : Word32.t -> Word32.t; val orb = _import "Word32_orb" private : Word32.t * Word32.t -> Word32.t; val rol = _import "Word32_rol" private : Word32.t * Word32.t -> Word32.t; val ror = _import "Word32_ror" private : Word32.t * Word32.t -> Word32.t; val sub = _import "Word32_sub" private : Word32.t * Word32.t -> Word32.t; val xorb = _import "Word32_xorb" private : Word32.t * Word32.t -> Word32.t; end structure Word64 = struct type t = Word64.t val add = _import "Word64_add" private : Word64.t * Word64.t -> Word64.t; val andb = _import "Word64_andb" private : Word64.t * Word64.t -> Word64.t; val castToReal64 = _import "Word64_castToReal64" private : Word64.t -> Real64.t; val equal = _import "Word64_equal" private : Word64.t * Word64.t -> Bool.t; val fetch = _import "Word64_fetch" private : (Word64.t) ref -> Word64.t; val lshift = _import "Word64_lshift" private : Word64.t * Word32.t -> Word64.t; val move = _import "Word64_move" private : (Word64.t) ref * (Word64.t) ref -> unit; val neg = _import "Word64_neg" private : Word64.t -> Word64.t; val notb = _import "Word64_notb" private : Word64.t -> Word64.t; val orb = _import "Word64_orb" private : Word64.t * Word64.t -> Word64.t; val rol = _import "Word64_rol" private : Word64.t * Word32.t -> Word64.t; val ror = _import "Word64_ror" private : Word64.t * Word32.t -> Word64.t; val store = _import "Word64_store" private : (Word64.t) ref * Word64.t -> unit; val sub = _import "Word64_sub" private : Word64.t * Word64.t -> Word64.t; val xorb = _import "Word64_xorb" private : Word64.t * Word64.t -> Word64.t; end structure Word8 = struct type t = Word8.t val add = _import "Word8_add" private : Word8.t * Word8.t -> Word8.t; val andb = _import "Word8_andb" private : Word8.t * Word8.t -> Word8.t; val equal = _import "Word8_equal" private : Word8.t * Word8.t -> Bool.t; val lshift = _import "Word8_lshift" private : Word8.t * Word32.t -> Word8.t; val neg = _import "Word8_neg" private : Word8.t -> Word8.t; val notb = _import "Word8_notb" private : Word8.t -> Word8.t; val orb = _import "Word8_orb" private : Word8.t * Word8.t -> Word8.t; val rol = _import "Word8_rol" private : Word8.t * Word32.t -> Word8.t; val ror = _import "Word8_ror" private : Word8.t * Word32.t -> Word8.t; val sub = _import "Word8_sub" private : Word8.t * Word8.t -> Word8.t; val xorb = _import "Word8_xorb" private : Word8.t * Word8.t -> Word8.t; end structure WordS16 = struct val addCheckOverflows = _import "WordS16_addCheckOverflows" private : Int16.t * Int16.t -> Bool.t; val extdToWord16 = _import "WordS16_extdToWord16" private : Int16.t -> Word16.t; val extdToWord32 = _import "WordS16_extdToWord32" private : Int16.t -> Word32.t; val extdToWord64 = _import "WordS16_extdToWord64" private : Int16.t -> Word64.t; val extdToWord8 = _import "WordS16_extdToWord8" private : Int16.t -> Word8.t; val ge = _import "WordS16_ge" private : Int16.t * Int16.t -> Bool.t; val gt = _import "WordS16_gt" private : Int16.t * Int16.t -> Bool.t; val le = _import "WordS16_le" private : Int16.t * Int16.t -> Bool.t; val lt = _import "WordS16_lt" private : Int16.t * Int16.t -> Bool.t; val mul = _import "WordS16_mul" private : Int16.t * Int16.t -> Int16.t; val mulCheckOverflows = _import "WordS16_mulCheckOverflows" private : Int16.t * Int16.t -> Bool.t; val negCheckOverflows = _import "WordS16_negCheckOverflows" private : Int16.t -> Bool.t; val quot = _import "WordS16_quot" private : Int16.t * Int16.t -> Int16.t; val rem = _import "WordS16_rem" private : Int16.t * Int16.t -> Int16.t; val rndToReal32 = _import "WordS16_rndToReal32" private : Int16.t -> Real32.t; val rndToReal64 = _import "WordS16_rndToReal64" private : Int16.t -> Real64.t; val rshift = _import "WordS16_rshift" private : Int16.t * Word32.t -> Int16.t; val subCheckOverflows = _import "WordS16_subCheckOverflows" private : Int16.t * Int16.t -> Bool.t; end structure WordS32 = struct val addCheckOverflows = _import "WordS32_addCheckOverflows" private : Int32.t * Int32.t -> Bool.t; val extdToWord16 = _import "WordS32_extdToWord16" private : Int32.t -> Word16.t; val extdToWord32 = _import "WordS32_extdToWord32" private : Int32.t -> Word32.t; val extdToWord64 = _import "WordS32_extdToWord64" private : Int32.t -> Word64.t; val extdToWord8 = _import "WordS32_extdToWord8" private : Int32.t -> Word8.t; val ge = _import "WordS32_ge" private : Int32.t * Int32.t -> Bool.t; val gt = _import "WordS32_gt" private : Int32.t * Int32.t -> Bool.t; val le = _import "WordS32_le" private : Int32.t * Int32.t -> Bool.t; val lt = _import "WordS32_lt" private : Int32.t * Int32.t -> Bool.t; val mul = _import "WordS32_mul" private : Int32.t * Int32.t -> Int32.t; val mulCheckOverflows = _import "WordS32_mulCheckOverflows" private : Int32.t * Int32.t -> Bool.t; val negCheckOverflows = _import "WordS32_negCheckOverflows" private : Int32.t -> Bool.t; val quot = _import "WordS32_quot" private : Int32.t * Int32.t -> Int32.t; val rem = _import "WordS32_rem" private : Int32.t * Int32.t -> Int32.t; val rndToReal32 = _import "WordS32_rndToReal32" private : Int32.t -> Real32.t; val rndToReal64 = _import "WordS32_rndToReal64" private : Int32.t -> Real64.t; val rshift = _import "WordS32_rshift" private : Int32.t * Word32.t -> Int32.t; val subCheckOverflows = _import "WordS32_subCheckOverflows" private : Int32.t * Int32.t -> Bool.t; end structure WordS64 = struct val addCheckOverflows = _import "WordS64_addCheckOverflows" private : Int64.t * Int64.t -> Bool.t; val extdToWord16 = _import "WordS64_extdToWord16" private : Int64.t -> Word16.t; val extdToWord32 = _import "WordS64_extdToWord32" private : Int64.t -> Word32.t; val extdToWord64 = _import "WordS64_extdToWord64" private : Int64.t -> Word64.t; val extdToWord8 = _import "WordS64_extdToWord8" private : Int64.t -> Word8.t; val ge = _import "WordS64_ge" private : Int64.t * Int64.t -> Bool.t; val gt = _import "WordS64_gt" private : Int64.t * Int64.t -> Bool.t; val le = _import "WordS64_le" private : Int64.t * Int64.t -> Bool.t; val lt = _import "WordS64_lt" private : Int64.t * Int64.t -> Bool.t; val mul = _import "WordS64_mul" private : Int64.t * Int64.t -> Int64.t; val mulCheckOverflows = _import "WordS64_mulCheckOverflows" private : Int64.t * Int64.t -> Bool.t; val negCheckOverflows = _import "WordS64_negCheckOverflows" private : Int64.t -> Bool.t; val quot = _import "WordS64_quot" private : Int64.t * Int64.t -> Int64.t; val rem = _import "WordS64_rem" private : Int64.t * Int64.t -> Int64.t; val rndToReal32 = _import "WordS64_rndToReal32" private : Int64.t -> Real32.t; val rndToReal64 = _import "WordS64_rndToReal64" private : Int64.t -> Real64.t; val rshift = _import "WordS64_rshift" private : Int64.t * Word32.t -> Int64.t; val subCheckOverflows = _import "WordS64_subCheckOverflows" private : Int64.t * Int64.t -> Bool.t; end structure WordS8 = struct val addCheckOverflows = _import "WordS8_addCheckOverflows" private : Int8.t * Int8.t -> Bool.t; val extdToWord16 = _import "WordS8_extdToWord16" private : Int8.t -> Word16.t; val extdToWord32 = _import "WordS8_extdToWord32" private : Int8.t -> Word32.t; val extdToWord64 = _import "WordS8_extdToWord64" private : Int8.t -> Word64.t; val extdToWord8 = _import "WordS8_extdToWord8" private : Int8.t -> Word8.t; val ge = _import "WordS8_ge" private : Int8.t * Int8.t -> Bool.t; val gt = _import "WordS8_gt" private : Int8.t * Int8.t -> Bool.t; val le = _import "WordS8_le" private : Int8.t * Int8.t -> Bool.t; val lt = _import "WordS8_lt" private : Int8.t * Int8.t -> Bool.t; val mul = _import "WordS8_mul" private : Int8.t * Int8.t -> Int8.t; val mulCheckOverflows = _import "WordS8_mulCheckOverflows" private : Int8.t * Int8.t -> Bool.t; val negCheckOverflows = _import "WordS8_negCheckOverflows" private : Int8.t -> Bool.t; val quot = _import "WordS8_quot" private : Int8.t * Int8.t -> Int8.t; val rem = _import "WordS8_rem" private : Int8.t * Int8.t -> Int8.t; val rndToReal32 = _import "WordS8_rndToReal32" private : Int8.t -> Real32.t; val rndToReal64 = _import "WordS8_rndToReal64" private : Int8.t -> Real64.t; val rshift = _import "WordS8_rshift" private : Int8.t * Word32.t -> Int8.t; val subCheckOverflows = _import "WordS8_subCheckOverflows" private : Int8.t * Int8.t -> Bool.t; end structure WordU16 = struct val addCheckOverflows = _import "WordU16_addCheckOverflows" private : Word16.t * Word16.t -> Bool.t; val extdToWord16 = _import "WordU16_extdToWord16" private : Word16.t -> Word16.t; val extdToWord32 = _import "WordU16_extdToWord32" private : Word16.t -> Word32.t; val extdToWord64 = _import "WordU16_extdToWord64" private : Word16.t -> Word64.t; val extdToWord8 = _import "WordU16_extdToWord8" private : Word16.t -> Word8.t; val ge = _import "WordU16_ge" private : Word16.t * Word16.t -> Bool.t; val gt = _import "WordU16_gt" private : Word16.t * Word16.t -> Bool.t; val le = _import "WordU16_le" private : Word16.t * Word16.t -> Bool.t; val lt = _import "WordU16_lt" private : Word16.t * Word16.t -> Bool.t; val mul = _import "WordU16_mul" private : Word16.t * Word16.t -> Word16.t; val mulCheckOverflows = _import "WordU16_mulCheckOverflows" private : Word16.t * Word16.t -> Bool.t; val quot = _import "WordU16_quot" private : Word16.t * Word16.t -> Word16.t; val rem = _import "WordU16_rem" private : Word16.t * Word16.t -> Word16.t; val rndToReal32 = _import "WordU16_rndToReal32" private : Word16.t -> Real32.t; val rndToReal64 = _import "WordU16_rndToReal64" private : Word16.t -> Real64.t; val rshift = _import "WordU16_rshift" private : Word16.t * Word32.t -> Word16.t; end structure WordU32 = struct val addCheckOverflows = _import "WordU32_addCheckOverflows" private : Word32.t * Word32.t -> Bool.t; val extdToWord16 = _import "WordU32_extdToWord16" private : Word32.t -> Word16.t; val extdToWord32 = _import "WordU32_extdToWord32" private : Word32.t -> Word32.t; val extdToWord64 = _import "WordU32_extdToWord64" private : Word32.t -> Word64.t; val extdToWord8 = _import "WordU32_extdToWord8" private : Word32.t -> Word8.t; val ge = _import "WordU32_ge" private : Word32.t * Word32.t -> Bool.t; val gt = _import "WordU32_gt" private : Word32.t * Word32.t -> Bool.t; val le = _import "WordU32_le" private : Word32.t * Word32.t -> Bool.t; val lt = _import "WordU32_lt" private : Word32.t * Word32.t -> Bool.t; val mul = _import "WordU32_mul" private : Word32.t * Word32.t -> Word32.t; val mulCheckOverflows = _import "WordU32_mulCheckOverflows" private : Word32.t * Word32.t -> Bool.t; val quot = _import "WordU32_quot" private : Word32.t * Word32.t -> Word32.t; val rem = _import "WordU32_rem" private : Word32.t * Word32.t -> Word32.t; val rndToReal32 = _import "WordU32_rndToReal32" private : Word32.t -> Real32.t; val rndToReal64 = _import "WordU32_rndToReal64" private : Word32.t -> Real64.t; val rshift = _import "WordU32_rshift" private : Word32.t * Word32.t -> Word32.t; end structure WordU64 = struct val addCheckOverflows = _import "WordU64_addCheckOverflows" private : Word64.t * Word64.t -> Bool.t; val extdToWord16 = _import "WordU64_extdToWord16" private : Word64.t -> Word16.t; val extdToWord32 = _import "WordU64_extdToWord32" private : Word64.t -> Word32.t; val extdToWord64 = _import "WordU64_extdToWord64" private : Word64.t -> Word64.t; val extdToWord8 = _import "WordU64_extdToWord8" private : Word64.t -> Word8.t; val ge = _import "WordU64_ge" private : Word64.t * Word64.t -> Bool.t; val gt = _import "WordU64_gt" private : Word64.t * Word64.t -> Bool.t; val le = _import "WordU64_le" private : Word64.t * Word64.t -> Bool.t; val lt = _import "WordU64_lt" private : Word64.t * Word64.t -> Bool.t; val mul = _import "WordU64_mul" private : Word64.t * Word64.t -> Word64.t; val mulCheckOverflows = _import "WordU64_mulCheckOverflows" private : Word64.t * Word64.t -> Bool.t; val quot = _import "WordU64_quot" private : Word64.t * Word64.t -> Word64.t; val rem = _import "WordU64_rem" private : Word64.t * Word64.t -> Word64.t; val rndToReal32 = _import "WordU64_rndToReal32" private : Word64.t -> Real32.t; val rndToReal64 = _import "WordU64_rndToReal64" private : Word64.t -> Real64.t; val rshift = _import "WordU64_rshift" private : Word64.t * Word32.t -> Word64.t; end structure WordU8 = struct val addCheckOverflows = _import "WordU8_addCheckOverflows" private : Word8.t * Word8.t -> Bool.t; val extdToWord16 = _import "WordU8_extdToWord16" private : Word8.t -> Word16.t; val extdToWord32 = _import "WordU8_extdToWord32" private : Word8.t -> Word32.t; val extdToWord64 = _import "WordU8_extdToWord64" private : Word8.t -> Word64.t; val extdToWord8 = _import "WordU8_extdToWord8" private : Word8.t -> Word8.t; val ge = _import "WordU8_ge" private : Word8.t * Word8.t -> Bool.t; val gt = _import "WordU8_gt" private : Word8.t * Word8.t -> Bool.t; val le = _import "WordU8_le" private : Word8.t * Word8.t -> Bool.t; val lt = _import "WordU8_lt" private : Word8.t * Word8.t -> Bool.t; val mul = _import "WordU8_mul" private : Word8.t * Word8.t -> Word8.t; val mulCheckOverflows = _import "WordU8_mulCheckOverflows" private : Word8.t * Word8.t -> Bool.t; val quot = _import "WordU8_quot" private : Word8.t * Word8.t -> Word8.t; val rem = _import "WordU8_rem" private : Word8.t * Word8.t -> Word8.t; val rndToReal32 = _import "WordU8_rndToReal32" private : Word8.t -> Real32.t; val rndToReal64 = _import "WordU8_rndToReal64" private : Word8.t -> Real64.t; val rshift = _import "WordU8_rshift" private : Word8.t * Word32.t -> Word8.t; end end end mlton-20100608/runtime/gen/gen-basis-ffi.sml0000644000076600000240000003304411404435622017147 0ustar mtfstaff(* Copyright (C) 2004-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. *) structure List = struct open List fun sort f l = let fun qsort l = case l of [] => [] | hd::tl => let val (lt,eq,gt) = List.foldr (fn (x,(lt,eq,gt)) => case f (x,hd) of LESS => (x::lt,eq,gt) | EQUAL => (lt,x::eq,gt) | GREATER => (lt,eq,x::gt)) ([],[],[]) tl val lt = qsort lt val gt = qsort gt in lt @ (hd :: eq) @ gt end in qsort l end end structure Substring = struct open Substring fun droplSpace ss = dropl Char.isSpace ss fun droprSpace ss = dropr Char.isSpace ss end structure Name = struct datatype t = T of string list fun compare (T ss1, T ss2) = List.collate (fn (s1,s2) => String.compare (CharVector.map Char.toLower s1, CharVector.map Char.toLower s2)) (ss1, ss2) fun last (T ss) = List.last ss fun toC (T ss) = String.concatWith "_" ss fun toML (T ss) = String.concatWith "." ss fun parse ss = let val ss = Substring.droplSpace ss val (names, rest) = Substring.splitl (fn c => Char.isAlphaNum c orelse c = #"." orelse c = #"_") ss val rest = Substring.droplSpace rest in if Substring.isEmpty names then NONE else let val names = Substring.fields (fn c => #"." = c) names val names = List.map Substring.string names in SOME (T names, rest) end end end structure Type = struct datatype t = Array of t | Base of Name.t | Con of Name.t * t | Ref of t | Unit | Vector of t fun toC t = case t of Array t => concat ["Array(", toC t, ")"] | Base name => Name.toC name | Con (name, t) => concat [Name.toC name, "(", toC t, ")"] | Ref t => concat ["Ref(", toC t, ")"] | Unit => "void" | Vector t => concat ["Vector(", toC t, ")"] fun toML t = case t of Array t => concat ["(", toML t, ") array"] | Base name => Name.toML name | Con (name, t) => concat ["(", toML t, ") ", Name.toML name] | Ref t => concat ["(", toML t, ") ref"] | Unit => "unit" | Vector t => concat ["(", toML t, ") vector"] fun parse s = let fun loop (s, t) = case Name.parse s of NONE => (t, s) | SOME (Name.T ["array"], rest) => loop (rest, Array t) | SOME (Name.T ["ref"], rest) => loop (rest, Ref t) | SOME (Name.T ["vector"], rest) => loop (rest, Vector t) | SOME (name, rest) => loop (rest, Con (name, t)) in case Name.parse s of NONE => raise Fail (concat ["Type.parse: \"", Substring.string s, "\""]) | SOME (Name.T ["unit"], rest) => loop (rest, Unit) | SOME (name, rest) => loop (rest, Base name) end fun parseFn s = let fun loop (s, args) = let val (arg, rest) = parse s in if Substring.isPrefix "*" rest then let val rest = #2 (Substring.splitAt (rest, 1)) in loop (rest, arg::args) end else if Substring.isPrefix "->" rest then let val rest = #2 (Substring.splitAt (rest, 2)) val (ret, rest) = parse rest in ({args = List.rev (arg::args), ret = ret}, rest) end else raise Fail (concat ["Type.parseFn: \"", Substring.string s, "\""]) end in loop (s, []) end end structure Entry = struct datatype t = Const of {name: Name.t, ty: Type.t} | Import of {attrs: string, name: Name.t, ty: {args: Type.t list, ret: Type.t}} | Symbol of {name: Name.t, ty: Type.t} fun name entry = case entry of Const {name,...} => name | Import {name,...} => name | Symbol {name,...} => name fun compare (entry1, entry2) = Name.compare (name entry1, name entry2) fun toC entry = case entry of Const {name, ty} => String.concat ["PRIVATE extern const ", Type.toC ty, " ", Name.toC name, ";"] | Import {attrs, name, ty = {args, ret}} => String.concat [attrs, if String.size attrs > 0 then " " else "", Type.toC ret, " ", Name.toC name, "(", String.concatWith "," (List.map Type.toC args), ");"] | Symbol {name, ty} => String.concat ["PRIVATE extern ", Type.toC ty, " ", Name.toC name, ";"] fun toML entry = case entry of Const {name, ty} => String.concat ["val ", Name.last name, " = _const \"", Name.toC name, "\" : ", Type.toML ty, ";"] | Import {attrs, name, ty = {args, ret}} => String.concat ["val ", Name.last name, " = _import \"", Name.toC name, "\" private : ", String.concatWith " * " (List.map Type.toML args), " -> ", Type.toML ret, ";"] | Symbol {name, ty} => String.concat ["val (", Name.last name, "Get, ", Name.last name, "Set) = _symbol \"", Name.toC name, "\" private : (unit -> (", Type.toML ty, ")) * ((", Type.toML ty, ") -> unit);"] fun parseConst (s, name) = let val s = #2 (Substring.splitAt (s, 6)) val s = Substring.droplSpace s val s = if Substring.isPrefix ":" s then #2 (Substring.splitAt (s, 1)) else raise Fail (concat ["Entry.parseConst: \"", Substring.string s, "\""]) val (ret, rest) = Type.parse s val () = if Substring.isEmpty rest then () else raise Fail (concat ["Entry.parseConst: \"", Substring.string s, "\""]) in Const {name = name, ty = ret} end fun parseImport (s, name) = let val s = #2 (Substring.splitAt (s, 7)) val s = Substring.droplSpace s val (attrs, s) = case CharVectorSlice.findi (fn (_, c) => c = #":") s of NONE => raise Fail (concat ["Entry.parseImport: \"", Substring.string s, "\""]) | SOME (i, _) => Substring.splitAt (s, i) val attrs = Substring.droprSpace attrs val s = if Substring.isPrefix ":" s then #2 (Substring.splitAt (s, 1)) else raise Fail (concat ["Entry.parseImport: \"", Substring.string s, "\""]) val ({args, ret}, rest) = Type.parseFn s val () = if Substring.isEmpty rest then () else raise Fail (concat ["Entry.parseImport: \"", Substring.string s, "\""]) in Import {attrs = Substring.string attrs, name = name, ty = {args = args, ret = ret}} end fun parseSymbol (s, name) = let val s = #2 (Substring.splitAt (s, 7)) val s = Substring.droplSpace s val s = if Substring.isPrefix ":" s then #2 (Substring.splitAt (s, 1)) else raise Fail (concat ["Entry.parseSymbol: \"", Substring.string s, "\""]) val (ret, rest) = Type.parse s val () = if Substring.isEmpty rest then () else raise Fail (concat ["Entry.parseSymbol: \"", Substring.string s, "\""]) in Symbol {name = name, ty = ret} end fun parse s = case Name.parse s of NONE => raise Fail "Entry.parse" | SOME (name, rest) => if Substring.isPrefix "=" rest then let val rest = #2 (Substring.splitAt (rest, 1)) val rest = Substring.droplSpace rest in if Substring.isPrefix "_const" rest then parseConst (rest, name) else if Substring.isPrefix "_import" rest then parseImport (rest, name) else if Substring.isPrefix "_symbol" rest then parseSymbol (rest, name) else raise Fail (concat ["Entry.parse: \"", Substring.string s, "\""]) end else raise Fail (concat ["Entry.parse: \"", Substring.string s, "\""]) end val entries = let val f = TextIO.openIn "basis-ffi.def" fun loop entries = case TextIO.inputLine f of NONE => List.rev entries | SOME s => if String.isPrefix "#" s then loop entries else let val entry = Entry.parse (Substring.full s) in loop (entry :: entries) end val entries = loop [] val () = TextIO.closeIn f val entries = List.sort Entry.compare entries in entries end fun outputC entries = let val f = TextIO.openOut "basis-ffi.h" fun print s = TextIO.output (f, s) fun println s = if s <> "" then (print s; print "\n") else () val () = println "/* This file is automatically generated. Do not edit. */\n\n" val () = println "#ifndef _MLTON_BASIS_FFI_H_\n" val () = println "#define _MLTON_BASIS_FFI_H_\n" val () = List.app (fn entry => println (Entry.toC entry)) entries val () = println "#endif /* _MLTON_BASIS_FFI_H_ */" val () = TextIO.closeOut f in () end fun outputML entries = let val f = TextIO.openOut "basis-ffi.sml" fun print s = TextIO.output (f, s) fun println s = if s <> "" then (print s; print "\n") else () val primStrs = (List.map (fn n => "Char" ^ n) ["8", "16", "32"]) @ (List.map (fn n => "Int" ^ n) ["8", "16", "32", "64"]) @ (List.map (fn n => "Real" ^ n) ["32", "64"]) @ (List.map (fn n => "Word" ^ n) ["8", "16", "32", "64"]) val () = println "(* This file is automatically generated. Do not edit. *)\n" val () = println "local open Primitive in " val () = println "structure PrimitiveFFI =" val () = println "struct" val cur = List.foldl (fn (entry, cur) => let val Name.T names = Entry.name entry val str = List.rev (List.tl (List.rev names)) fun loop (cur, str) = case (cur, str) of ([], []) => () | ([], str) => List.app (fn s => (println ("structure " ^ s ^ " = ") ; println "struct" ; if List.exists (fn s' => s = s') primStrs then println ("type t = " ^ s ^ ".t") else ())) str | (cur, []) => List.app (fn _ => println "end") cur | (c::cur,s::str) => if c = s then loop (cur, str) else (println "end" ; loop (cur, s::str)) in loop (cur, str) ; println (Entry.toML entry) ; str end) [] entries val () = List.app (fn _ => println "end") cur val () = println "end" val () = println "end" val () = TextIO.closeOut f in () end val () = outputC entries val () = outputML entries mlton-20100608/runtime/gen/gen-basis-ffi.stamp0000644000076600000240000000000011404435622017462 0ustar mtfstaffmlton-20100608/runtime/gen/gen-sizes.c0000644000076600000240000000211111404435622016057 0ustar mtfstaff/* Copyright (C) 2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #define MLTON_GC_INTERNAL_TYPES #include "platform.h" struct GC_state gcState; int main (__attribute__ ((unused)) int argc, __attribute__ ((unused)) char* argv[]) { FILE *sizesFd; sizesFd = fopen_safe ("sizes", "w"); fprintf (sizesFd, "cint = %"PRIuMAX"\n", (uintmax_t)sizeof(C_Int_t)); fprintf (sizesFd, "cpointer = %"PRIuMAX"\n", (uintmax_t)sizeof(C_Pointer_t)); fprintf (sizesFd, "cptrdiff = %"PRIuMAX"\n", (uintmax_t)sizeof(C_Ptrdiff_t)); fprintf (sizesFd, "csize = %"PRIuMAX"\n", (uintmax_t)sizeof(C_Size_t)); fprintf (sizesFd, "header = %"PRIuMAX"\n", (uintmax_t)sizeof(GC_header)); fprintf (sizesFd, "mplimb = %"PRIuMAX"\n", (uintmax_t)sizeof(C_MPLimb_t)); fprintf (sizesFd, "objptr = %"PRIuMAX"\n", (uintmax_t)sizeof(objptr)); fprintf (sizesFd, "seqIndex = %"PRIuMAX"\n", (uintmax_t)sizeof(GC_arrayLength)); fclose_safe(sizesFd); return 0; } mlton-20100608/runtime/gen/gen-types.c0000644000076600000240000004027611404435622016104 0ustar mtfstaff/* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #include "cenv.h" #include "util.h" static const char* mlTypesHPrefix[] = { "/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh", " * Jagannathan, and Stephen Weeks.", " *", " * MLton is released under a BSD-style license.", " * See the file MLton-LICENSE for details.", " */", "", "#ifndef _MLTON_MLTYPES_H_", "#define _MLTON_MLTYPES_H_", "", "/* We need these because in header files for exported SML functions, ", " * types.h is included without cenv.h.", " */", "#ifndef _ISOC99_SOURCE", "#define _ISOC99_SOURCE", "#endif", "#if (defined (_AIX) || defined (__hpux__) || defined (__OpenBSD__))", "#include ", "#elif (defined (__sun__))", "#include ", "#else", "#include ", "#endif", "", NULL }; static const char* cTypesHPrefix[] = { "/* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh", " * Jagannathan, and Stephen Weeks.", " *", " * MLton is released under a BSD-style license.", " * See the file MLton-LICENSE for details.", " */", "", "#ifndef _MLTON_CTYPES_H_", "#define _MLTON_CTYPES_H_", "", NULL }; static const char* cTypesSMLPrefix[] = { "(* Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh", " * Jagannathan, and Stephen Weeks.", " *", " * MLton is released under a BSD-style license.", " * See the file MLton-LICENSE for details.", " *)", "", NULL }; static const char* mlTypesHStd[] = { "/* ML types */", // "typedef void* Pointer;", // "typedef uintptr_t Pointer;", // "typedef unsigned char* Pointer;", "typedef unsigned char PointerAux __attribute__ ((may_alias));", "typedef PointerAux* Pointer;", "#define Array(t) Pointer", "#define Ref(t) Pointer", "#define Vector(t) Pointer", "", "typedef int8_t Int8_t;", "typedef int8_t Int8;", "typedef int16_t Int16_t;", "typedef int16_t Int16;", "typedef int32_t Int32_t;", "typedef int32_t Int32;", "typedef int64_t Int64_t;", "typedef int64_t Int64;", "typedef float Real32_t;", "typedef float Real32;", "typedef double Real64_t;", "typedef double Real64;", // "typedef long double Real128_t;", // "typedef long double Real128;", "typedef uint8_t Word8_t;", "typedef uint8_t Word8;", "typedef uint16_t Word16_t;", "typedef uint16_t Word16;", "typedef uint32_t Word32_t;", "typedef uint32_t Word32;", "typedef uint64_t Word64_t;", "typedef uint64_t Word64;", "", "typedef Int8_t WordS8_t;", "typedef Int8_t WordS8;", "typedef Int16_t WordS16_t;", "typedef Int16_t WordS16;", "typedef Int32_t WordS32_t;", "typedef Int32_t WordS32;", "typedef Int64_t WordS64_t;", "typedef Int64_t WordS64;", "", "typedef Word8_t WordU8_t;", "typedef Word8_t WordU8;", "typedef Word16_t WordU16_t;", "typedef Word16_t WordU16;", "typedef Word32_t WordU32_t;", "typedef Word32_t WordU32;", "typedef Word64_t WordU64_t;", "typedef Word64_t WordU64;", "", "typedef WordU8_t Char8_t;", "typedef WordU8_t Char8;", "typedef WordU16_t Char16_t;", "typedef WordU16_t Char16;", "typedef WordU32_t Char32_t;", "typedef WordU32_t Char32;", "", "typedef Vector(Char8_t) String8_t;", "typedef Vector(Char8_t) String8;", "typedef Vector(Char16_t) String16_t;", "typedef Vector(Char16_t) String16;", "typedef Vector(Char32_t) String32_t;", "typedef Vector(Char32_t) String32;", "", "typedef Int32_t Bool_t;", "typedef Int32_t Bool;", // "typedef Char8_t Char_t;", // "typedef Char8_t Char;", // "typedef Int32_t Int_t;", // "typedef Int32_t Int;", // "typedef Real64_t Real_t;", // "typedef Real64_t Real;", // "typedef String8_t String_t;", // "typedef String8_t String;", // "typedef Word32_t Word_t;", // "typedef Word32_t Word;", "" "typedef String8_t NullString8_t;", "typedef String8_t NullString8;", "", "typedef void* CPointer;", "typedef Pointer Objptr;", NULL }; #define booltype(t, bt, name) \ do { \ writeString (cTypesHFd, "typedef"); \ writeString (cTypesHFd, " /* "); \ writeString (cTypesHFd, #t); \ writeString (cTypesHFd, " */ "); \ writeString (cTypesHFd, bt); \ writeUintmaxU (cTypesHFd, CHAR_BIT * sizeof(t)); \ writeString (cTypesHFd, "_t"); \ writeString (cTypesHFd, " "); \ writeString (cTypesHFd, "C_"); \ writeString (cTypesHFd, name); \ writeString (cTypesHFd, "_t;"); \ writeNewline (cTypesHFd); \ writeString (cTypesSMLFd, "structure C_"); \ writeString (cTypesSMLFd, name); \ writeString (cTypesSMLFd, " = WordToBool ("); \ writeString (cTypesSMLFd, "type t = "); \ writeString (cTypesSMLFd, "Word"); \ writeUintmaxU (cTypesSMLFd, CHAR_BIT * sizeof(t));\ writeString (cTypesSMLFd, ".word"); \ writeString (cTypesSMLFd, " "); \ writeString (cTypesSMLFd, "val zero: t = 0wx0"); \ writeString (cTypesSMLFd, " "); \ writeString (cTypesSMLFd, "val one: t = 0wx1"); \ writeString (cTypesSMLFd, ")"); \ writeNewline (cTypesSMLFd); \ } while (0) #define systype(t, bt, name) \ do { \ char *btLower = strdup(bt); \ for (size_t i = 0; i < strlen(btLower); i++) \ btLower[i] = (char)(tolower((int)(bt[i]))); \ char *btUpper = strdup(bt); \ for (size_t i = 0; i < strlen(btUpper); i++) \ btUpper[i] = (char)(toupper((int)(bt[i]))); \ writeString (cTypesHFd, "typedef"); \ writeString (cTypesHFd, " /* "); \ writeString (cTypesHFd, #t); \ writeString (cTypesHFd, " */ "); \ writeString (cTypesHFd, bt); \ writeUintmaxU (cTypesHFd, CHAR_BIT * sizeof(t)); \ writeString (cTypesHFd, "_t"); \ writeString (cTypesHFd, " "); \ writeString (cTypesHFd, "C_"); \ writeString (cTypesHFd, name); \ writeString (cTypesHFd, "_t;"); \ writeNewline (cTypesHFd); \ writeString (cTypesSMLFd, "structure C_"); \ writeString (cTypesSMLFd, name); \ writeString (cTypesSMLFd, " = struct open "); \ writeString (cTypesSMLFd, bt); \ writeUintmaxU (cTypesSMLFd, CHAR_BIT * sizeof(t));\ writeString (cTypesSMLFd, " type t = "); \ writeString (cTypesSMLFd, btLower); \ writeString (cTypesSMLFd, " end"); \ writeNewline (cTypesSMLFd); \ writeString (cTypesSMLFd, "functor C_"); \ writeString (cTypesSMLFd, name); \ writeString (cTypesSMLFd, "_Choose"); \ writeString (cTypesSMLFd, bt); \ writeString (cTypesSMLFd, "N (A: CHOOSE_"); \ writeString (cTypesSMLFd, btUpper); \ writeString (cTypesSMLFd, "N_ARG) = Choose"); \ writeString (cTypesSMLFd, bt); \ writeString (cTypesSMLFd, "N_"); \ writeString (cTypesSMLFd, bt); \ writeUintmaxU (cTypesSMLFd, CHAR_BIT * sizeof(t));\ writeString (cTypesSMLFd, " (A)"); \ writeNewline (cTypesSMLFd); \ free (btLower); \ free (btUpper); \ } while (0) #define chksystype(t, name) \ do { \ if ((double)((t)(0.25)) > 0) \ systype(t, "Real", name); \ else if ((double)((t)(-1)) > 0) \ systype(t, "Word", name); \ else \ systype(t, "Int", name); \ } while (0) #define ptrtype(t, name) \ do { \ writeString (cTypesHFd, "typedef"); \ writeString (cTypesHFd, " /* "); \ writeString (cTypesHFd, #t); \ writeString (cTypesHFd, " */ "); \ writeString (cTypesHFd, "Pointer"); \ writeString (cTypesHFd, " "); \ writeString (cTypesHFd, "C_"); \ writeString (cTypesHFd, name); \ writeString (cTypesHFd, "_t;"); \ writeNewline (cTypesHFd); \ writeString (cTypesSMLFd, "structure C_"); \ writeString (cTypesSMLFd, name); \ writeString (cTypesSMLFd, " = Pointer"); \ writeNewline (cTypesSMLFd); \ } while (0) #undef ptrtype #define ptrtype(t, name) \ do { \ systype(t, "Word", name); \ } while (0) #define aliastype(name1, bt, name2) \ do { \ char *btLower = strdup(bt); \ for (size_t i = 0; i < strlen(btLower); i++) \ btLower[i] = (char)(tolower((int)(bt[i]))); \ char *btUpper = strdup(bt); \ for (size_t i = 0; i < strlen(btUpper); i++) \ btUpper[i] = (char)(toupper((int)(bt[i]))); \ writeString (cTypesHFd, "typedef "); \ writeString (cTypesHFd, "C_"); \ writeString (cTypesHFd, name1); \ writeString (cTypesHFd, "_t "); \ writeString (cTypesHFd, "C_"); \ writeString (cTypesHFd, name2); \ writeString (cTypesHFd, "_t;"); \ writeNewline (cTypesHFd); \ writeString (cTypesSMLFd, "structure C_"); \ writeString (cTypesSMLFd, name2); \ writeString (cTypesSMLFd, " = C_"); \ writeString (cTypesSMLFd, name1); \ writeNewline (cTypesSMLFd); \ writeString (cTypesSMLFd, "functor C_"); \ writeString (cTypesSMLFd, name2); \ writeString (cTypesSMLFd, "_Choose"); \ writeString (cTypesSMLFd, bt); \ writeString (cTypesSMLFd, "N (A: CHOOSE_"); \ writeString (cTypesSMLFd, btUpper); \ writeString (cTypesSMLFd, "N_ARG) = C_"); \ writeString (cTypesSMLFd, name1); \ writeString (cTypesSMLFd, "_Choose"); \ writeString (cTypesSMLFd, bt); \ writeString (cTypesSMLFd, "N (A)"); \ writeNewline (cTypesSMLFd); \ } while (0) static const char* mlTypesHSuffix[] = { "#endif /* _MLTON_MLTYPES_H_ */", NULL }; static const char* cTypesHSuffix[] = { "#define C_Errno_t(t) t", "", "#endif /* _MLTON_CTYPES_H_ */", NULL }; static const char* cTypesSMLSuffix[] = { NULL }; int main (__attribute__ ((unused)) int argc, __attribute__ ((unused)) char* argv[]) { FILE *mlTypesHFd; FILE *cTypesHFd; FILE *cTypesSMLFd; mlTypesHFd = fopen_safe ("ml-types.h", "w"); for (int i = 0; mlTypesHPrefix[i] != NULL; i++) writeStringWithNewline (mlTypesHFd, mlTypesHPrefix[i]); for (int i = 0; mlTypesHStd[i] != NULL; i++) writeStringWithNewline (mlTypesHFd, mlTypesHStd[i]); for (int i = 0; mlTypesHSuffix[i] != NULL; i++) writeStringWithNewline (mlTypesHFd, mlTypesHSuffix[i]); cTypesHFd = fopen_safe ("c-types.h", "w"); cTypesSMLFd = fopen_safe ("c-types.sml", "w"); for (int i = 0; cTypesHPrefix[i] != NULL; i++) writeStringWithNewline (cTypesHFd, cTypesHPrefix[i]); for (int i = 0; cTypesSMLPrefix[i] != NULL; i++) writeStringWithNewline (cTypesSMLFd, cTypesSMLPrefix[i]); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* C */"); writeStringWithNewline (cTypesSMLFd, "(* C *)"); booltype(_Bool, "Word", "Bool"); chksystype(char, "Char"); chksystype(signed char, "SChar"); chksystype(unsigned char, "UChar"); chksystype(short, "Short"); chksystype(signed short, "SShort"); chksystype(unsigned short, "UShort"); chksystype(int, "Int"); chksystype(signed int, "SInt"); chksystype(unsigned int, "UInt"); chksystype(long, "Long"); chksystype(signed long, "SLong"); chksystype(unsigned long, "ULong"); chksystype(long long, "LongLong"); chksystype(signed long long, "SLongLong"); chksystype(unsigned long long, "ULongLong"); chksystype(float, "Float"); chksystype(double, "Double"); // chksystype(long double, "LongDouble"); chksystype(size_t, "Size"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); ptrtype(unsigned char*, "Pointer"); // ptrtype(void*, "Pointer"); // ptrtype(uintptr_t, "Pointer"); ptrtype(char*, "String"); ptrtype(char**, "StringArray"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* Generic integers */"); writeStringWithNewline (cTypesSMLFd, "(* Generic integers *)"); aliastype("Int", "Int", "Fd"); aliastype("Int", "Int", "Signal"); aliastype("Int", "Int", "Status"); aliastype("Int", "Int", "Sock"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* C99 */"); writeStringWithNewline (cTypesSMLFd, "(* C99 *)"); chksystype(ptrdiff_t, "Ptrdiff"); chksystype(intmax_t, "Intmax"); chksystype(uintmax_t, "UIntmax"); chksystype(intptr_t, "Intptr"); chksystype(uintptr_t, "UIntptr"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* from */"); writeStringWithNewline (cTypesSMLFd, "(* from *)"); // ptrtype(DIR*, "DirP"); systype(DIR*, "Word", "DirP"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* from */"); writeStringWithNewline (cTypesSMLFd, "(* from *)"); chksystype(nfds_t, "NFds"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* from */"); writeStringWithNewline (cTypesSMLFd, "(* from *)"); chksystype(rlim_t, "RLim"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* from */"); writeStringWithNewline (cTypesSMLFd, "(* from *)"); // chksystype(blkcnt_t, "BlkCnt"); // chksystype(blksize_t, "BlkSize"); chksystype(clock_t, "Clock"); chksystype(dev_t, "Dev"); chksystype(gid_t, "GId"); // chksystype(id_t, "Id"); chksystype(ino_t, "INo"); chksystype(mode_t, "Mode"); chksystype(nlink_t, "NLink"); chksystype(off_t, "Off"); chksystype(pid_t, "PId"); chksystype(ssize_t, "SSize"); chksystype(suseconds_t, "SUSeconds"); chksystype(time_t, "Time"); chksystype(uid_t, "UId"); // chksystype(useconds_t, "USeconds"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* from */"); writeStringWithNewline (cTypesSMLFd, "(* from *)"); chksystype(socklen_t, "Socklen"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* from */"); writeStringWithNewline (cTypesSMLFd, "(* from *)"); chksystype(cc_t, "CC"); chksystype(speed_t, "Speed"); chksystype(tcflag_t, "TCFlag"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); writeStringWithNewline (cTypesHFd, "/* from \"gmp.h\" */"); writeStringWithNewline (cTypesSMLFd, "(* from \"gmp.h\" *)"); chksystype(mp_limb_t, "MPLimb"); writeNewline (cTypesHFd);writeNewline (cTypesSMLFd); for (int i = 0; cTypesHSuffix[i] != NULL; i++) writeStringWithNewline (cTypesHFd, cTypesHSuffix[i]); for (int i = 0; cTypesSMLSuffix[i] != NULL; i++) writeStringWithNewline (cTypesSMLFd, cTypesSMLSuffix[i]); fclose_safe(mlTypesHFd); fclose_safe(cTypesHFd); fclose_safe(cTypesSMLFd); return 0; } mlton-20100608/runtime/Makefile0000644000076600000240000003260411404435622014710 0ustar mtfstaff## Copyright (C) 2010 Matthew Fluet. # Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## PATH := ../bin:$(shell echo $$PATH) TARGET := self ifeq ($(TARGET), self) CC := gcc -std=gnu99 AR := ar rc RANLIB := ranlib else CC := $(TARGET)-gcc -std=gnu99 AR := $(TARGET)-ar rc RANLIB := $(TARGET)-ranlib endif TARGET_ARCH := $(shell ../bin/host-arch) TARGET_OS := $(shell ../bin/host-os) GCC_MAJOR_VERSION := \ $(shell $(CC) -v 2>&1 | grep 'gcc version' | \ sed 's/.*gcc version \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1/') GCC_MINOR_VERSION := \ $(shell $(CC) -v 2>&1 | grep 'gcc version' | \ sed 's/.*gcc version \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\2/') GCC_VERSION := $(GCC_MAJOR_VERSION).$(GCC_MINOR_VERSION) FLAGS := -fno-common EXE := OPTFLAGS := -O2 -fomit-frame-pointer DEBUGFLAGS := -O1 -fno-inline -fkeep-inline-functions -g2 PICFLAGS := -DPIC GCOPTFLAGS := GCDEBUGFLAGS := GCPICFLAGS := WARNFLAGS := OPTWARNFLAGS := DEBUGWARNFLAGS := PICWARNFLAGS := # Win32&64 don't use PIC code, all other platforms do ifeq ($(findstring $(TARGET_OS), mingw cygwin),) PICFLAGS += -fPIC endif # Make mlton library symbols private (win32&64 use another technique) ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION)) ifeq ($(findstring $(TARGET_OS), mingw cygwin),) FLAGS += -fvisibility=hidden endif endif ifeq ($(TARGET_ARCH), alpha) FLAGS += -mieee -mbwx -mtune=ev6 -mfp-rounding-mode=d endif ifeq ($(TARGET_ARCH), amd64) FLAGS += -m64 DEBUGFLAGS += -gstabs+ endif ifeq ($(findstring $(TARGET_ARCH), hppa ia64 powerpc sparc),$(TARGET_ARCH)) ifeq (4.2, $(firstword $(sort $(GCC_VERSION) 4.2))) # GMP headers contain C99 inline functions which generate warnings # with a suggestion to use this flag to disable the warnings. FLAGS += -fgnu89-inline endif endif ifeq ($(TARGET_ARCH), ia64) FLAGS += -mtune=itanium2 ifeq ($(TARGET_OS), hpux) FLAGS += -mlp64 endif endif ifeq ($(TARGET_OS)-$(TARGET_ARCH), aix-powerpc64) FLAGS += -maix64 AR := ar -X 64 rc endif ifeq ($(TARGET_ARCH), sparc) FLAGS += -m32 -mcpu=v8 -Wa,-xarch=v8plusa endif ifeq ($(TARGET_ARCH), x86) FLAGS += -m32 ifeq (3, $(firstword $(sort $(GCC_MAJOR_VERSION) 3))) OPTFLAGS += -falign-loops=2 -falign-jumps=2 -falign-functions=5 else OPTFLAGS += -malign-loops=2 -malign-jumps=2 -malign-functions=5 endif DEBUGFLAGS += -gstabs+ endif ifeq ($(TARGET_OS), cygwin) EXE := .exe endif ifeq ($(TARGET_OS), darwin) FLAGS += -I/usr/local/include -I/sw/include -I/opt/local/include endif ifeq ($(TARGET_OS), freebsd) FLAGS += -I/usr/local/include endif ifeq ($(TARGET_OS), mingw) EXE := .exe endif ifeq ($(TARGET_OS), netbsd) FLAGS += -I/usr/pkg/include endif ifeq ($(TARGET_OS), openbsd) FLAGS += -I/usr/local/include endif ifeq ($(TARGET_OS), solaris) FLAGS += -funroll-all-loops endif # These flags can be overridden by the user CPPFLAGS := CFLAGS := INCFLAGS := -I. -Iplatform OPTCFLAGS := $(CFLAGS) $(INCFLAGS) $(CPPFLAGS) $(FLAGS) $(OPTFLAGS) DEBUGCFLAGS := $(CFLAGS) $(INCFLAGS) $(CPPFLAGS) $(FLAGS) -DASSERT=1 $(DEBUGFLAGS) PICCFLAGS := $(CFLAGS) $(INCFLAGS) $(CPPFLAGS) $(FLAGS) $(OPTFLAGS) $(PICFLAGS) GCOPTCFLAGS = $(GCOPTFLAGS) GCDEBUGCFLAGS = $(GCDEBUGFLAGS) GCPICCFLAGS = $(GCOPTFLAGS) $(GCPICFLAGS) WARNCFLAGS := WARNCFLAGS += -pedantic -Wall ifeq ($(findstring $(GCC_MAJOR_VERSION), 3),$(GCC_MAJOR_VERSION)) WARNCFLAGS += -W endif ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION)) WARNCFLAGS += -Wextra endif WARNCFLAGS += -Wformat=2 ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION)) WARNCFLAGS += -Wswitch-default -Wswitch-enum endif WARNCFLAGS += -Wuninitialized ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION)) WARNCFLAGS += -Winit-self endif ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION)) WARNCFLAGS += -Wstrict-aliasing=2 endif WARNCFLAGS += -Wfloat-equal WARNCFLAGS += -Wundef WARNCFLAGS += -Wshadow WARNCFLAGS += -Wpointer-arith WARNCFLAGS += -Wbad-function-cast -Wcast-qual WARNCFLAGS += -Wwrite-strings # WARNCFLAGS += -Wconversion WARNCFLAGS += -Waggregate-return WARNCFLAGS += -Wstrict-prototypes ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION)) WARNCFLAGS += -Wold-style-definition endif WARNCFLAGS += -Wmissing-prototypes -Wmissing-declarations ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION)) WARNCFLAGS += -Wmissing-field-initializers endif WARNCFLAGS += -Wmissing-noreturn WARNCFLAGS += -Wmissing-format-attribute # WARNCFLAGS += -Wpacked # WARNCFLAGS += -Wpadded WARNCFLAGS += -Wredundant-decls WARNCFLAGS += -Wnested-externs WARNCFLAGS += -Wlong-long # WARNCFLAGS += -Wunreachable-code WARNCFLAGS += $(WARNFLAGS) # GCC doesn't recognize the %I64 format specifier which means %ll on windows ifeq ($(TARGET_OS), mingw) WARNCFLAGS += -Wno-format -Wno-missing-format-attribute endif OPTWARNCFLAGS := $(WARNCFLAGS) -Wdisabled-optimization $(OPTWARNFLAGS) DEBUGWARNCFLAGS := $(WARNCFLAGS) $(DEBUGWARNFLAGS) PICWARNCFLAGS := $(WARNCFLAGS) -Wdisabled-optimization $(OPTWARNFLAGS) GDTOACFILES := \ dmisc.c g__fmt.c misc.c strtoIdd.c strtopdd.c strtorf.c \ dtoa.c gmisc.c smisc.c strtoIf.c strtopf.c strtorQ.c \ g_ddfmt.c g_Qfmt.c strtod.c strtoIg.c strtopQ.c strtorx.c \ g_dfmt.c g_xfmt.c strtodg.c strtoIQ.c strtopx.c strtorxL.c \ gdtoa.c g_xLfmt.c strtodI.c strtoIx.c strtopxL.c sum.c \ gethex.c hd_init.c strtof.c strtoIxL.c strtord.c ulp.c \ g_ffmt.c hexnan.c strtoId.c strtopd.c strtordd.c GDTOACFILES := $(patsubst %,gdtoa/%,$(GDTOACFILES)) UTILHFILES := \ util.h \ $(shell find util -type f | grep '\.h$$') UTILCFILES := \ $(shell find util -type f | grep '\.c$$') PLATFORMHFILES := \ platform.h \ $(shell find platform -type f | grep '\.h$$') PLATFORMCFILES := \ $(shell find platform -type f | grep '\.c$$') GCHFILES := \ gc.h \ $(shell find gc -type f | grep '\.h$$') GCCFILES := \ $(shell find gc -type f | grep '\.c$$') BYTECODEHFILES := \ $(shell find bytecode -type f | grep '\.h$$') BASISHFILES := \ ml-types.h \ c-types.h \ basis-ffi.h \ $(shell find basis -type f | grep '\.h$$') BASISCFILES := \ $(shell find basis -type f | grep '\.c$$') HFILES := \ cenv.h \ $(UTILHFILES) \ $(PLATFORMHFILES) \ $(GCHFILES) \ $(BASISHFILES) GDTOA_OBJS := $(patsubst %.c,%.o,$(GDTOACFILES)) GDTOA_DEBUG_OBJS := $(patsubst %.c,%-gdb.o,$(GDTOACFILES)) GDTOA_PIC_OBJS := $(patsubst %.c,%-pic.o,$(GDTOACFILES)) OBJS := \ util.o \ platform.o \ platform/$(TARGET_OS).o \ gc.o OMIT_BYTECODE := no ifeq ($(OMIT_BYTECODE), yes) else OBJS += bytecode/interpret.o endif ifeq ($(COMPILE_FAST), yes) OBJS += basis.o else OBJS += \ $(foreach f, $(basename $(BASISCFILES)), $(f).o) endif DEBUG_OBJS := $(patsubst %.o,%-gdb.o,$(OBJS)) PIC_OBJS := $(patsubst %.o,%-pic.o,$(OBJS)) ALL := libgdtoa.a libgdtoa-gdb.a libgdtoa-pic.a \ libmlton.a libmlton-gdb.a libmlton-pic.a ALL += gen/c-types.sml gen/basis-ffi.sml gen/sizes ifeq ($(OMIT_BYTECODE), yes) else ALL += bytecode/opcodes endif all: $(ALL) gdtoa/arithchk.c: gdtoa.tgz gdtoa-patch gdtoa-patch.internal gdtoa-patch.mlton gzip -dc gdtoa.tgz | tar xf - patch -s -p0 arith.h gdtoa/%-pic.o: gdtoa/%.c gdtoa/arith.h $(CC) $(PICCFLAGS) $(PICWARNCFLAGS) -w -DINFNAN_CHECK -c -o $@ $< gdtoa/%-gdb.o: gdtoa/%.c gdtoa/arith.h $(CC) $(DEBUGCFLAGS) $(DEBUGWARNCFLAGS) -w -DINFNAN_CHECK -c -o $@ $< gdtoa/%.o: gdtoa/%.c gdtoa/arith.h $(CC) $(OPTCFLAGS) $(OPTWARNCFLAGS) -w -DINFNAN_CHECK -c -o $@ $< libgdtoa.a: $(GDTOA_OBJS) libgdtoa-gdb.a: $(GDTOA_DEBUG_OBJS) libgdtoa-pic.a: $(GDTOA_PIC_OBJS) util-pic.o: util.c $(UTILCFILES) cenv.h $(UTILHFILES) $(CC) $(PICCFLAGS) $(PICWARNCFLAGS) -c -o $@ $< util-gdb.o: util.c $(UTILCFILES) cenv.h $(UTILHFILES) $(CC) $(DEBUGCFLAGS) $(DEBUGWARNCFLAGS) -c -o $@ $< util.o: util.c $(UTILCFILES) cenv.h $(UTILHFILES) $(CC) $(OPTCFLAGS) $(OPTWARNCFLAGS) -c -o $@ $< c-types.h: gen/c-types.h cp $< $@ ml-types.h: gen/ml-types.h cp $< $@ gen/c-types.h gen/c-types.sml gen/ml-types.h: gen/gen-types.stamp @touch $@ gen/gen-types.stamp: gen/gen-types.c util.h util.o $(CC) $(OPTCFLAGS) $(WARNCFLAGS) -o gen/gen-types gen/gen-types.c util.o rm -f gen/c-types.h gen/c-types.sml gen/ml-types.h gen/gen-types.stamp cd gen && ./gen-types rm -f gen/gen-types$(EXE) gen/gen-types touch $@ basis-ffi.h: gen/basis-ffi.h cp $< $@ gen/basis-ffi.h gen/basis-ffi.sml: gen/gen-basis-ffi.stamp @touch $@ gen/gen-basis-ffi.stamp: gen/gen-basis-ffi.sml gen/basis-ffi.def mlton -output gen/gen-basis-ffi gen/gen-basis-ffi.sml rm -f gen/basis-ffi.h gen/basis-ffi.sml gen/gen-basis-ffi.stamp cd gen && ./gen-basis-ffi rm -f gen/gen-basis-ffi touch $@ gen/sizes: gen/gen-sizes.stamp @touch $@ gen/gen-sizes.stamp: gen/gen-sizes.c libmlton.a $(HFILES) $(CC) $(OPTCFLAGS) $(WARNCFLAGS) -I. -o gen/gen-sizes gen/gen-sizes.c -L. -lmlton rm -f gen/sizes cd gen && ./gen-sizes rm -f gen/gen-sizes$(EXE) gen/gen-sizes touch $@ platform/$(TARGET_OS)-pic.o: $(PLATFORMCFILES) platform/$(TARGET_OS)-gdb.o: $(PLATFORMCFILES) platform/$(TARGET_OS).o: $(PLATFORMCFILES) gc-pic.o: gc.c $(GCCFILES) $(HFILES) $(CC) $(PICCFLAGS) $(GCPICCFLAGS) $(PICWARNCFLAGS) -c -o $@ $< gc-gdb.o: gc.c $(GCCFILES) $(HFILES) $(CC) $(DEBUGCFLAGS) $(GCDEBUGCFLAGS) $(DEBUGWARNCFLAGS) -c -o $@ $< gc.o: gc.c $(GCCFILES) $(HFILES) $(CC) $(OPTCFLAGS) $(GCOPTCFLAGS) $(OPTWARNCFLAGS) -c -o $@ $< ## Needs -Wno-float-equal for Real_equal, included via "c-chunk.h". bytecode/interpret-pic.o: bytecode/interpret.c $(HFILES) $(BYTECODEHFILES) $(CC) -I../include $(PICCFLAGS) $(GCPICCFLAGS) $(PICWARNCFLAGS) -Wno-float-equal -c -o $@ $< bytecode/interpret-gdb.o: bytecode/interpret.c $(HFILES) $(BYTECODEHFILES) $(CC) -I../include $(DEBUGCFLAGS) $(GCDEBUGCFLAGS) $(DEBUGWARNCFLAGS) -Wno-float-equal -c -o $@ $< bytecode/interpret.o: bytecode/interpret.c $(HFILES) $(BYTECODEHFILES) $(CC) -I../include $(OPTCFLAGS) $(GCOPTCFLAGS) $(OPTWARNCFLAGS) -Wno-float-equal -c -o $@ $< bytecode/opcodes: bytecode/print-opcodes @touch $@ bytecode/print-opcodes: bytecode/print-opcodes.c bytecode/opcode.h $(HFILES) $(CC) $(OPTCFLAGS) $(WARNCFLAGS) -o bytecode/print-opcodes bytecode/print-opcodes.c rm -f bytecode/opcodes cd bytecode && ./print-opcodes > opcodes basis.c: $(BASISCFILES) rm -f basis.c cat $(BASISCFILES) >> basis.c ## Needs -Wno-float-equal for Real_equal; ## needs -Wno-format-nonliteral for Date_strfTime; ## needs -Wno-redundant-decls for 'extern struct GC_state gcState'. basis-pic.o: basis.c $(BASISCFILES) $(HFILES) $(CC) -Ibasis -Ibasis/Word -Ibasis/Real $(PICCFLAGS) $(PICWARNCFLAGS) -Wno-float-equal -Wno-format-nonliteral -Wno-redundant-decls -c -o $@ $< basis-gdb.o: basis.c $(BASISCFILES) $(HFILES) $(CC) -Ibasis -Ibasis/Word -Ibasis/Real $(DEBUGCFLAGS) $(DEBUGWARNCFLAGS) -Wno-float-equal -Wno-format-nonliteral -Wno-redundant-decls -c -o $@ $< basis.o: basis.c $(BASISCFILES) $(HFILES) $(CC) -Ibasis -Ibasis/Word -Ibasis/Real $(OPTCFLAGS) $(OPTWARNCFLAGS) -Wno-float-equal -Wno-format-nonliteral -Wno-redundant-decls -c -o $@ $< ## Needs -Wno-float-equal for Real_equal. basis/Real/Real-pic.o: basis/Real/Real.c $(HFILES) $(CC) $(PICCFLAGS) $(PICWARNCFLAGS) -Wno-float-equal -c -o $@ $< basis/Real/Real-gdb.o: basis/Real/Real.c $(HFILES) $(CC) $(DEBUGCFLAGS) $(DEBUGWARNCFLAGS) -Wno-float-equal -c -o $@ $< basis/Real/Real.o: basis/Real/Real.c $(HFILES) $(CC) $(OPTCFLAGS) $(OPTWARNCFLAGS) -Wno-float-equal -c -o $@ $< ## Needs -Wno-format-nonliteral for Date_strfTime. basis/System/Date-pic.o: basis/System/Date.c $(HFILES) $(CC) $(PICCFLAGS) $(PICWARNCFLAGS) -Wno-format-nonliteral -c -o $@ $< basis/System/Date-gdb.o: basis/System/Date.c $(HFILES) $(CC) $(DEBUGCFLAGS) $(DEBUGWARNCFLAGS) -Wno-format-nonliteral -c -o $@ $< basis/System/Date.o: basis/System/Date.c $(HFILES) $(CC) $(OPTCFLAGS) $(OPTWARNCFLAGS) -Wno-format-nonliteral -c -o $@ $< libmlton.a: $(OBJS) libmlton-gdb.a: $(DEBUG_OBJS) libmlton-pic.a: $(PIC_OBJS) %-pic.o: %.c $(HFILES) $(CC) $(PICCFLAGS) $(PICWARNCFLAGS) -c -o $@ $< %-gdb.o: %.c $(HFILES) $(CC) $(DEBUGCFLAGS) $(DEBUGWARNCFLAGS) -c -o $@ $< %.o: %.c $(HFILES) $(CC) $(OPTCFLAGS) $(OPTWARNCFLAGS) -c -o $@ $< %.a: rm -f $@ $(AR) $@ $^ $(RANLIB) $@ .PHONY: flags flags: echo TARGET = $(TARGET) echo TARGET_ARCH = $(TARGET_ARCH) echo TARGET_OS = $(TARGET_OS) echo GCC_MAJOR_VERSION = $(GCC_MAJOR_VERSION) echo GCC_MINOR_VERSION = $(GCC_MINOR_VERSION) echo GCC_VERSION = $(GCC_VERSION) echo FLAGS = $(FLAGS) echo EXE = $(EXE) echo OPTFLAGS = $(OPTFLAGS) echo GCOPTFLAGS = $(GCOPTFLAGS) echo DEBUGFLAGS = $(DEBUGFLAGS) echo WARNFLAGS = $(WARNFLAGS) echo OPTWARNFLAGS = $(OPTWARNFLAGS) echo DEBUGWARNFLAGS = $(DEBUGWARNFLAGS) echo OBJS = $(OBJS) .PHONY: clean clean: ../bin/clean .PHONY: rebuild-gdtoa-patch rebuild-gdtoa-patch: cd gdtoa && $(MAKE) clean && rm -f *~ *.orig mv gdtoa gdtoa-new gzip -dc gdtoa.tgz | tar xf - diff -P -C 2 -r gdtoa gdtoa-new >gdtoa-patch || exit 0 rm -rf gdtoa mv gdtoa-new gdtoa mlton-20100608/runtime/platform/0000755000076600000240000000000011404470407015067 5ustar mtfstaffmlton-20100608/runtime/platform/aix.c0000644000076600000240000001171611404435622016022 0ustar mtfstaff#include "platform.h" #include #include #include #include "diskBack.unix.c" #include "mmap-protect.c" #include "nonwin.c" #include "recv.nonblock.c" #include "use-mmap.c" int fpclassify64 (double d) { int c; c = class (d); switch (c) { case FP_PLUS_NORM: case FP_MINUS_NORM: return FP_NORMAL; case FP_PLUS_ZERO: case FP_MINUS_ZERO: return FP_ZERO; case FP_PLUS_INF: case FP_MINUS_INF: return FP_INFINITE; case FP_PLUS_DENORM: case FP_MINUS_DENORM: return FP_SUBNORMAL; case FP_SNAN: case FP_QNAN: return FP_NAN; default: die ("Real_class error: invalid class %d\n", c); } } size_t GC_pageSize (void) { long pageSize; pageSize = sysconf (_SC_PAGESIZE); if (pageSize < 0) diee ("GC_pageSize error: sysconf (_SC_PAGESIZE) failed"); return (size_t)pageSize; } /* We cannot use _SC_PHYS_PAGES from sysconf.c. It fails on some versions of AIX. */ uintmax_t GC_physMem (void) { struct vminfo vminfo; uintmax_t physMem; if (vmgetinfo (&vminfo, VMINFO, sizeof (vminfo)) < 0) diee ("GC_physMem error: vmgetinfo failed"); physMem = (uintmax_t)vminfo.memsizepgs * (uintmax_t)4096; return physMem; } struct map_type { int flag; const char *type; }; static struct map_type map_types[] = {{MA_MAINEXEC, "main"}, {MA_KERNTEXT, "kern"}, {MA_SHARED, "shared"}, {MA_STACK, "stack"}, {0, NULL}}; struct map_segment { prptr64_t start; prptr64_t end; const char *name; }; static struct map_segment map_segments[] = {{(prptr64_t)0x00000000, (prptr64_t)0x0fffffff, "kernel"}, /* Application program text. */ {(prptr64_t)0x10000000, (prptr64_t)0x1fffffff, "text"}, /* Application program data and the application stack. */ {(prptr64_t)0x20000000, (prptr64_t)0x2fffffff, "data"}, /* Available for use by shared memory or mmap services. */ {(prptr64_t)0x30000000, (prptr64_t)0xafffffff, "mmap"}, /* Shared library text. */ {(prptr64_t)0xd0000000, (prptr64_t)0xdfffffff, "shtext"}, /* Miscellaneous kernel data. */ {(prptr64_t)0xe0000000, (prptr64_t)0xefffffff, "kdata"}, /* Application shared library data. */ {(prptr64_t)0xf0000000, (prptr64_t)0xffffffff, "shdata"}, {0, 0, NULL}}; static const char * get_map_type (int flags, prptr64_t addr) { struct map_type *m; for (m = map_types; m->flag; m++) if (m->flag & flags) return m->type; if ((addr >= (prptr64_t)0xd0000000 && addr <= (prptr64_t)0xdfffffff) || (addr >= (prptr64_t)0xf0000000 && addr <= (prptr64_t)0xffffffff)) return "shlib"; return ""; } static const char * get_map_segment (prptr64_t addr) { struct map_segment *m; for (m = map_segments; m->name; m++) if (m->start <= addr && m->end >= addr) return m->name; return ""; } #define BUFLEN 65536 void GC_displayMem (void) { pid_t pid = getpid (); char fname[128]; int fd = 0; char *buf; struct prmap *map; printf ("va_start va_end perm type segment file (member) [object]\n"); printf ("--------+--------+---+------+------+----------------------\n"); snprintf (fname, sizeof (fname), "/proc/%d/map", pid); fd = open (fname, O_RDONLY); if (fd == -1) diee ("showMem error: opening %s failed", fname); /* I couldn't figure out a way to get the size of the map file beforehand (only open, read, write, and close work on files under /proc), so let's just hope that 64k will be enough. */ buf = malloc (BUFLEN); if (buf == NULL) die ("showMem error: out of memory."); read (fd, buf, BUFLEN); map = (struct prmap*)buf; for (map = (struct prmap*)buf; map->pr_size; map++) { char *m = buf + map->pr_pathoff; m += strlen (m) + 1; if (!m[0]) m = NULL; printf ("%08llx %08llx %s%s%s %-6s %-6s %s %s%s%s[%s]\n", map->pr_vaddr, map->pr_vaddr + map->pr_size, map->pr_mflags & MA_READ ? "r" : "-", map->pr_mflags & MA_WRITE ? "w" : "-", map->pr_mflags & MA_EXEC ? "x" : "-", get_map_type (map->pr_mflags, map->pr_vaddr), get_map_segment (map->pr_vaddr), buf + map->pr_pathoff, m ? "(" : "", m ? m : "", m ? ") " : "", map->pr_mapname); } } mlton-20100608/runtime/platform/aix.h0000644000076600000240000000205311404435622016021 0ustar mtfstaff#if defined(_ARCH_PPC64) #define __powerpc64__ #elif defined(_ARCH_PPC) #define __powerpc__ #else #error "Unknown architecture" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_FPCLASSIFY FALSE #define HAS_FPCLASSIFY32 FALSE #define HAS_FPCLASSIFY64 TRUE #define HAS_MSG_DONTWAIT FALSE #define HAS_PTRACE FALSE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING FALSE #define MLton_Platform_OS_host "aix" int fpclassify64(double d); /* This should not conflict with existing flags. */ #define MSG_DONTWAIT 0x1000000 mlton-20100608/runtime/platform/alpha.h0000644000076600000240000000005111404435622016321 0ustar mtfstaff#define MLton_Platform_Arch_host "alpha" mlton-20100608/runtime/platform/amd64.h0000644000076600000240000000034711404435622016157 0ustar mtfstaff#define MLton_Platform_Arch_host "amd64" #define POINTER_BITS 64 #if (defined (__CYGWIN__) || defined (__MINGW32__)) #define ADDRESS_BITS 43 #elif (defined (__linux__)) #define ADDRESS_BITS 48 #else #define ADDRESS_BITS 40 #endif mlton-20100608/runtime/platform/arm.h0000644000076600000240000000004711404435622016020 0ustar mtfstaff#define MLton_Platform_Arch_host "arm" mlton-20100608/runtime/platform/cygwin.c0000644000076600000240000000733611404435622016544 0ustar mtfstaff#define _GNU_SOURCE #include "platform.h" #include "mmap.c" #if not HAS_MSG_DONTWAIT #include "recv.nonblock.c" #endif #include "windows.c" #include "mremap.c" /* * The sysconf(_SC_PAGESIZE) is the necessary alignment for using * mmap. Windows has another notion of page size (that corresponds to * physical page size?). Just to be safe, we take the least common * multiple of the sysconf and Windows notions of page size. * * Since sysconf(_SC_PAGESIZE) might not correspond to the physical * page size, we can't use sysconf(_SC_PHYS_PAGES) to get physical * memory. So, use the Windows function. * * See: http://cygwin.com/ml/cygwin/2006-06/msg00341.html */ static size_t GC_pageSize_sysconf (void) { SYSTEM_INFO sysinfo; long int pageSize; pageSize = sysconf (_SC_PAGESIZE); GetSystemInfo(&sysinfo); /* MLton_Platform_CygwinUseMmap is not set when this is called. * Assume the worst; choose the larger allocation unit. */ if ((size_t)pageSize < (size_t)sysinfo.dwAllocationGranularity) return (size_t)sysinfo.dwAllocationGranularity; else return (size_t)pageSize; } static size_t GC_pageSize_windows (void) { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return (size_t)sysinfo.dwPageSize; } size_t GC_pageSize (void) { size_t pageSize_sysconf = GC_pageSize_sysconf (); size_t pageSize_windows = GC_pageSize_windows (); size_t a = pageSize_sysconf; size_t b = pageSize_windows; size_t t; while (b != 0) { t = b; b = a % b; a = t; } size_t gcd = a; size_t lcm = (pageSize_sysconf / gcd) * pageSize_windows; return lcm; } uintmax_t GC_physMem (void) { MEMORYSTATUS memstat; memstat.dwLength = sizeof(memstat); GlobalMemoryStatus(&memstat); return (uintmax_t)memstat.dwTotalPhys; } void *GC_mmapAnon (void *start, size_t length) { if (MLton_Platform_CygwinUseMmap) return mmapAnon (start, length); else return Windows_mmapAnon (start, length); } void GC_release (void *base, size_t length) { if (MLton_Platform_CygwinUseMmap) munmap_safe (base, length); else Windows_release (base, length); } void* GC_extendHead (void *base, size_t length) { if (MLton_Platform_CygwinUseMmap) return mmapAnon (base, length); else return Windows_mmapAnon (base, length); } void* GC_extendTail (void *base, size_t length) { if (MLton_Platform_CygwinUseMmap) return mmapAnon (base, length); else return Windows_extend (base, length); } HANDLE fileDesHandle (int fd) { // The temporary prevents a "cast does not match function type" warning. long t; t = get_osfhandle (fd); return (HANDLE)t; } /* ------------------------------------------------- */ /* Cygwin */ /* ------------------------------------------------- */ C_String_t Cygwin_toFullWindowsPath (NullString8_t path) { static char res[MAX_PATH]; #if ((CYGWIN_VERSION_API_MAJOR > 0) || (CYGWIN_VERSION_API_MINOR > 181)) cygwin_conv_path (CCP_POSIX_TO_WIN_A | CCP_ABSOLUTE, (char*)path, &res[0], MAX_PATH); #else cygwin_conv_to_full_win32_path ((char*)path, &res[0]); #endif return (C_String_t)&res[0]; } /* ------------------------------------------------- */ /* Posix */ /* ------------------------------------------------- */ void Posix_IO_setbin (C_Fd_t fd) { /* cygwin has a different method for working with its fds */ setmode (fd, O_BINARY); } void Posix_IO_settext (C_Fd_t fd) { /* cygwin has a different method for working with its fds */ setmode (fd, O_TEXT); } mlton-20100608/runtime/platform/cygwin.h0000644000076600000240000000307011404435622016540 0ustar mtfstaff#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MLton_Platform_OS_host "cygwin" #define HAS_FEROUND FALSE #define HAS_FPCLASSIFY TRUE #define HAS_REMAP TRUE #define HAS_SIGALTSTACK FALSE #define HAS_SIGNBIT TRUE #define HAS_SPAWN TRUE #define HAS_TIME_PROFILING FALSE #ifndef MSG_DONTWAIT #define HAS_MSG_DONTWAIT FALSE /* This should not conflict with existing flags. */ #define MSG_DONTWAIT 0x1000000 #else #define HAS_MSG_DONTWAIT TRUE #endif #define SPAWN_MODE _P_NOWAIT /* Cygwin does not handle IPv6. */ #ifndef AF_INET6 #define AF_INET6 23 /* Internet Protocol, Version 6 */ #define PF_INET6 AF_INET6 struct sockaddr_in6 { int dummy; // quell gcc warnings about "struct has no members" }; /* Cygwin does provide sockaddr_storage. */ #endif typedef unsigned int nfds_t; typedef long suseconds_t; // type of timeval.tv_usec in sys/time.h #ifndef MSG_WAITALL // Unimplemented on Cygwin #define MSG_WAITALL 0 #endif #ifndef MSG_EOR // Unimplemented on Cygwin #define MSG_EOR 0 #endif mlton-20100608/runtime/platform/darwin.c0000644000076600000240000000264311404435622016524 0ustar mtfstaff#include "platform.h" #include #include #include "diskBack.unix.c" #include "mmap-protect.c" #include "nonwin.c" #include "sysctl.c" #include "use-mmap.c" void GC_displayMem (void) { static char buffer[256]; snprintf (buffer, cardof(buffer), "/usr/bin/vmmap -w -interleaved %d\n", (int)getpid ()); (void)system (buffer); } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; #if (defined(__powerpc__) || defined(__ppc__)) #if __DARWIN_UNIX03 GC_handleSigProf ((code_pointer) ucp->uc_mcontext->__ss.__srr0); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext->ss.srr0); #endif #elif (defined(__i386__)) #if __DARWIN_UNIX03 GC_handleSigProf ((code_pointer) ucp->uc_mcontext->__ss.__eip); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext->ss.eip); #endif #elif (defined(__x86_64__)) #if __DARWIN_UNIX03 GC_handleSigProf ((code_pointer) ucp->uc_mcontext->__ss.__rip); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext->ss.rip); #endif #else #error Unsupported darwin CPU architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20100608/runtime/platform/darwin.h0000644000076600000240000000236211404435622016527 0ustar mtfstaff#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* might not #include */ #include #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_FPCLASSIFY TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT TRUE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "darwin" // MacOS only defines this if POSIX_C_SOURCE is defined. // However, defining that breaks half the osx system headers. // They couldn't possibly change the number at this point anyway. #ifndef SIGPOLL #define SIGPOLL 7 #endif /* for Posix_ProcEnv_environ */ #define environ *_NSGetEnviron() mlton-20100608/runtime/platform/diskBack.unix.c0000644000076600000240000000343611404435622017736 0ustar mtfstaffstatic FILE *tempFileDes (void) { int fd; FILE *f; char *template; const char *tmpDir; const char *tag = "/TempFileXXXXXXXXXX"; size_t tmpDirLen, tagLen; mode_t m; tmpDir = getenv ("TMP"); if (NULL == tmpDir) { tmpDir = getenv ("TMPDIR"); if (NULL == tmpDir) tmpDir = "/var/tmp"; } tmpDirLen = strlen(tmpDir); tagLen = strlen(tag); template = malloc_safe (tmpDirLen + tagLen + 1); strncpy (template, tmpDir, tmpDirLen + 1); strncpy (template + tmpDirLen, tag, tagLen + 1); m = umask(077); fd = mkstemp_safe (template); f = fdopen_safe (fd, "w+"); (void)umask(m); unlink_safe (template); free (template); return f; } typedef struct { FILE *f; } *WriteToDiskData; void GC_diskBack_read (void *data, pointer buf, size_t size) { FILE *f; const size_t READ_CHUNK_SIZE = 0x2000000; /* 32M */ f = ((WriteToDiskData)data)->f; fseek_safe (f, 0, SEEK_SET); /* fread (_, 1, size, _) succeeds * with size >= 2^31 * for a 32-bit executable on 64-bit linux. * Nonetheless, match GC_diskBack_write. */ while (size > 0) { size_t s = min (READ_CHUNK_SIZE, size); fread_safe (buf, 1, s, f); buf += s; size -= s; } } void GC_diskBack_close (void *data) { FILE *f; f = ((WriteToDiskData)data)->f; fclose_safe (f); free (data); } void *GC_diskBack_write (pointer buf, size_t size) { FILE *f; WriteToDiskData d; const size_t WRITE_CHUNK_SIZE = 0x2000000; /* 32M */ f = tempFileDes (); /* fwrite (_, 1, size, _) fails * (with no helpful error conditions!) * with size >= 2^31 * on x86-linux. */ while (size > 0) { size_t s = min (WRITE_CHUNK_SIZE, size); fwrite_safe (buf, 1, s, f); buf += s; size -= s; } d = (WriteToDiskData)(malloc_safe (sizeof(*d))); d->f = f; return d; } mlton-20100608/runtime/platform/displayMem.proc.c0000644000076600000240000000036211404435622020302 0ustar mtfstaffvoid GC_displayMem (void) { static char buffer[256]; int res; snprintf (buffer, cardof(buffer), "/bin/cat /proc/%d/maps\n", (int)(getpid ())); res = system (buffer); if (-1 == res) return; } mlton-20100608/runtime/platform/float-math.c0000644000076600000240000000142611404435622017272 0ustar mtfstaff#define unaryReal(func) \ float func##f (float x) { \ return (float)(func((double)x)); \ } unaryReal(acos) unaryReal(asin) unaryReal(atan) unaryReal(cos) unaryReal(cosh) unaryReal(exp) unaryReal(fabs) unaryReal(log) unaryReal(log10) unaryReal(rint) unaryReal(sin) unaryReal(sinh) unaryReal(sqrt) unaryReal(tan) unaryReal(tanh) #undef unaryReal #define binaryReal(func) \ float func##f (float x, float y) { \ return (float)(func((double)x, (double)y)); \ } binaryReal(atan2) binaryReal(pow) #undef binaryReal float frexpf(float x, int *e) { return (float)frexp((double)x, e); } float ldexpf (float x, int i) { return (float)ldexp((double)x, i); } mlton-20100608/runtime/platform/float-math.h0000644000076600000240000000073511404435622017301 0ustar mtfstaff#define unaryReal(func) float func##f (float x); unaryReal(acos) unaryReal(asin) unaryReal(atan) unaryReal(cos) unaryReal(cosh) unaryReal(exp) unaryReal(fabs) unaryReal(log) unaryReal(log10) unaryReal(rint) unaryReal(sin) unaryReal(sinh) unaryReal(sqrt) unaryReal(tan) unaryReal(tanh) #undef unaryReal #define binaryReal(func) float func##f (float x, float y); binaryReal(atan2) binaryReal(pow) #undef binaryReal float frexpf(float x, int *e); float ldexpf (float x, int i); mlton-20100608/runtime/platform/freebsd.c0000644000076600000240000000171511404435622016651 0ustar mtfstaff#include "platform.h" #include "diskBack.unix.c" #include "mmap-protect.c" #include "nonwin.c" #include "sysctl.c" #include "use-mmap.c" void GC_displayMem (void) { static char buffer[256]; snprintf (buffer, cardof(buffer), "/bin/cat /proc/%d/map\n", (int)getpid ()); (void)system (buffer); } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; #if (defined (__x86_64__)) GC_handleSigProf ((code_pointer) ucp->uc_mcontext.mc_rip); #elif (defined (__i386__)) GC_handleSigProf ((code_pointer) ucp->uc_mcontext.mc_eip); #else #error Profiling handler is missing for this architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20100608/runtime/platform/freebsd.h0000644000076600000240000000211611404435622016652 0ustar mtfstaff#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* might not #include */ #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_FPCLASSIFY TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT TRUE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "freebsd" /* This is probably debian specific, since freebsd worked w/o it before. */ #if (defined (__FreeBSD_kernel__)) #define getpgrp() getpgrp(getpid()) #endif extern char **environ; /* for Posix_ProcEnv_environ */ mlton-20100608/runtime/platform/hppa.h0000644000076600000240000000005011404435622016163 0ustar mtfstaff#define MLton_Platform_Arch_host "hppa" mlton-20100608/runtime/platform/hpux.c0000644000076600000240000000723511404435622016226 0ustar mtfstaff#include "platform.h" #include #include #include #include #define MAP_ANON MAP_ANONYMOUS #include "diskBack.unix.c" #include "mmap-protect.c" #include "nonwin.c" #include "recv.nonblock.c" #include "setenv.putenv.c" #include "use-mmap.c" struct pstnames { int type; const char *name; }; static struct pstnames pst_type_names[] = {{ PS_NOTUSED, "unused" }, { PS_USER_AREA, "user" }, { PS_TEXT, "text" }, { PS_DATA, "data" }, { PS_STACK, "stack" }, { PS_SHARED, "shared" }, { PS_NULLDEREF, "null" }, { PS_IO, "io" }, { PS_MMF, "mmap" }, { PS_GRAPHICS, "gfx" }, { PS_GRAPHICS_DMA, "gfxdma" }, #ifdef PS_RSESTACK { PS_RSESTACK, "rsestack" }, #endif { 0, NULL }}; static const char * pst_type_name(int type) { int i; for (i = 0; pst_type_names[i].name; i++) if (pst_type_names[i].type == type) return pst_type_names[i].name; return "unknown"; } static const char* pst_filename(struct pst_vm_status vm) { static char fname[256]; #ifdef PSTAT_FILEDETAILS if (pstat_getpathname (fname, sizeof (fname), &vm.pst_fid) < 0) #endif strcpy (fname, "unknown"); return fname; } void GC_displayMem (void) { int i; struct pst_vm_status buf; size_t page_size = sysconf (_SC_PAGE_SIZE); printf("va_start va_end perms type phys filename\n"); printf("--------+--------+-----+-------+------+-----------\n"); for (i = 0;; i++) { if (pstat_getprocvm (&buf, sizeof (buf), 0, i) < 0) break; printf("%p %p %s%s%s %-8s %4d %s\n", (void*)buf.pst_vaddr, (void*)(buf.pst_vaddr + buf.pst_length * page_size - 1), (buf.pst_flags & PS_PROT_READ) ? "-" : "r", (buf.pst_flags & PS_PROT_WRITE) ? "-" : "w", (buf.pst_flags & PS_PROT_EXECUTE) ? "-" : "x", pst_type_name (buf.pst_type), buf.pst_phys_pages, pst_filename (buf)); } } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) (ucp->uc_link)); } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } size_t GC_pageSize (void) { struct pst_static buf; if (pstat_getstatic (&buf, sizeof (buf), 1, 0) < 0) diee ("failed to get page size"); return buf.page_size; } uintmax_t GC_physMem (void) { struct pst_static buf; uintmax_t physMem; if (pstat_getstatic (&buf, sizeof (buf), 1, 0) < 0) diee ("failed to get physical memory size"); physMem = (uintmax_t)buf.physical_memory * (uintmax_t)buf.page_size; return physMem; } #ifdef __hppa__ float modff (float x, float *iptr) { double d, i; d = modf ((double)x, &i); *iptr = (float)i; return d; } float rintf (float x) { return (float)rint ((double)x); } float frexpf (float x, int *e) { return (float)frexp ((double)x, e); } float ldexpf (float x, int e) { return (float)ldexp ((double)x, e); } #endif /* __hppa__ */ mlton-20100608/runtime/platform/hpux.h0000644000076600000240000000373711404435622016236 0ustar mtfstaff#ifndef _XOPEN_SOURCE_EXTENDED #define _XOPEN_SOURCE_EXTENDED #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "setenv.h" #if defined(SO_TOE) #define HPUX_VERSION 1123 #elif defined(PRIV_PSET) #define HPUX_VERSION 1111 #elif defined(PRIV_SPUCTL) #define HPUX_VERSION 1100 #else #error "HP-UX 11.00 is the oldest supported version." #endif #undef UINTPTR_MAX #define UINTPTR_MAX ULONG_MAX #ifndef SIZE_MAX #define SIZE_MAX ((size_t)SSIZE_MAX * 2 + 1) #endif #define HAS_FEROUND TRUE #define HAS_FPCLASSIFY TRUE #define HAS_MSG_DONTWAIT FALSE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT TRUE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "hpux" #define LOG_PERROR 0 #define LOG_AUTHPRIV LOG_AUTH /* This should not conflict with existing flags. */ #define MSG_DONTWAIT 0x1000000 /* fesetround() doesn't seem to be returning 0 as expected. */ static int MLton_fesetround (int mode) { fesetround (mode); return 0; } #define fesetround MLton_fesetround typedef long suseconds_t; // type of timeval.tv_usec in sys/time.h #ifdef __hppa__ /* These do not exist on HPPA, so we implement our own. */ float modff(float x, float *iptr); float rintf(float x); float frexpf(float x, int *exp); float ldexpf(float x, int exp); #endif /* __hppa__ */ #define PRIxPTR "lx" /* These are incorrectly defined in the system headers. */ #undef PRIu32 #define PRIu32 "u" #undef PRIx32 #define PRIx32 "x" #undef PRId32 #define PRId32 "d" mlton-20100608/runtime/platform/hurd.c0000644000076600000240000000061311404435622016175 0ustar mtfstaff#define _GNU_SOURCE #include "platform.h" #include "diskBack.unix.c" #include "displayMem.proc.c" #include "mmap-protect.c" #include "nonwin.c" #include "use-mmap.c" #include "sysconf.c" #include "mremap.c" void* GC_extendHead (void *base, size_t length) { return mmapAnon (base, length); } void* GC_extendTail (void *base, size_t length) { return mmapAnon (base, length); } mlton-20100608/runtime/platform/hurd.h0000644000076600000240000000166011404435622016205 0ustar mtfstaff#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define HAS_FEROUND TRUE #define HAS_FPCLASSIFY TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP TRUE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT TRUE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING FALSE #define MLton_Platform_OS_host "hurd" // environ is already defined if _GNU_SOURCE is. #ifndef _GNU_SOURCE extern char **environ; /* for Posix_ProcEnv_environ */ #endif mlton-20100608/runtime/platform/ia64.h0000644000076600000240000000005011404435622015776 0ustar mtfstaff#define MLton_Platform_Arch_host "ia64" mlton-20100608/runtime/platform/linux.c0000644000076600000240000000677111404435622016405 0ustar mtfstaff#define _GNU_SOURCE #include "platform.h" #include "diskBack.unix.c" #include "displayMem.proc.c" #include "mmap-protect.c" #include "nonwin.c" #include "use-mmap.c" #ifndef EIP #define EIP 14 #endif static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { #if (defined (__x86_64__)) #define REG_INDEX(NAME) (offsetof(struct sigcontext, NAME) / sizeof(greg_t)) #ifndef REG_RIP #define REG_RIP REG_INDEX(rip) /* seems to be 16 */ #endif ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.gregs[REG_RIP]); #elif (defined (__alpha__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) (ucp->uc_mcontext.sc_pc)); #elif (defined (__hppa__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) (ucp->uc_mcontext.sc_iaoq[0] & ~0x3UL)); #elif (defined(__ia64__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->_u._mc.sc_ip); #elif (defined (__ppc__)) || (defined (__powerpc__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.regs->nip); #elif (defined (__sparc__)) struct sigcontext* scp = (struct sigcontext*)context; #if __WORDSIZE == 64 GC_handleSigProf ((code_pointer) scp->sigc_regs.tpc); #else GC_handleSigProf ((code_pointer) scp->si_regs.pc); #endif #elif (defined (__mips__)) ucontext_t* ucp = (ucontext_t*)context; #ifdef __UCLIBC__ GC_handleSigProf ((code_pointer) ucp->uc_mcontext.gpregs[CTX_EPC]); #else GC_handleSigProf ((code_pointer) ucp->uc_mcontext.pc); #endif #elif (defined (__i386__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.gregs[EIP]); #elif (defined (__arm__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.arm_pc); #elif (defined (__s390__)) ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.psw.addr); #else #error Profiling handler is missing for this architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } /* We need the value of MREMAP_MAYMOVE, which should come from sys/mman.h, but * isn't there. It is in linux/mman.h, but we can't #include that here, because * kernel headers don't mix with system headers. We could create a separate * file, include the kernel headers there, and define a global. But there * sometimes seem to be problems including kernel headers, so the easiest thing * to do is just define MREMAP_MAYMOVE. */ #define MREMAP_MAYMOVE 1 void *GC_mremap (void *start, size_t oldLength, size_t newLength) { return mremap (start, oldLength, newLength, MREMAP_MAYMOVE); } size_t GC_pageSize (void) { long int pageSize; pageSize = sysconf (_SC_PAGESIZE); if (pageSize < 0) diee ("GC_pageSize error: sysconf (_SC_PAGESIZE) failed"); return (size_t)pageSize; } /* sysconf(_SC_PHYS_PAGES) is not portable (mipsel uclibc) */ uintmax_t GC_physMem (void) { struct sysinfo si; if (sysinfo(&si) < 0) diee ("GC_physMem error: sysinfo failed"); return (uintmax_t)si.totalram * (uintmax_t)si.mem_unit; } mlton-20100608/runtime/platform/linux.h0000644000076600000240000000306711404435622016405 0ustar mtfstaff#include #include #ifdef __UCLIBC__ #include #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __UCLIBC__ #define HAS_FEROUND FALSE #else #define HAS_FEROUND TRUE #endif #define HAS_FPCLASSIFY TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP TRUE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT TRUE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "linux" // environ is already defined if _GNU_SOURCE is. #ifndef _GNU_SOURCE extern char **environ; /* for Posix_ProcEnv_environ */ #endif /* The following is compatibility code with older glibc and kernel versions. */ #ifndef __suseconds_t_defined #include typedef __kernel_suseconds_t suseconds_t; #define __suseconds_t_defined #endif #if __GLIBC__ == 2 && __GLIBC_MINOR__ <= 1 typedef unsigned long int nfds_t; #endif #ifndef SO_ACCEPTCONN #define SO_ACCEPTCONN 30 #endif #ifdef __UCLIBC__ #define FE_DOWNWARD _FPU_RC_DOWN #define FE_TONEAREST _FPU_RC_NEAREST #define FE_TOWARDZERO _FPU_RC_ZERO #define FE_UPWARD _FPU_RC_UP #endif mlton-20100608/runtime/platform/m68k.h0000644000076600000240000000005011404435622016020 0ustar mtfstaff#define MLton_Platform_Arch_host "m68k" mlton-20100608/runtime/platform/mingw.c0000644000076600000240000013752611404435622016372 0ustar mtfstaff#define _GNU_SOURCE #include "platform.h" #include "windows.c" #include "mremap.c" void *GC_mmapAnon (void *start, size_t length) { return Windows_mmapAnon (start, length); } void GC_release (void *base, size_t length) { Windows_release (base, length); } void *GC_extendHead (void *base, size_t length) { return Windows_mmapAnon (base, length); } void *GC_extendTail (void *base, size_t length) { return Windows_extend (base, length); } uintmax_t GC_physMem (void) { #ifdef _WIN64 MEMORYSTATUSEX memstat; memstat.dwLength = sizeof(memstat); GlobalMemoryStatusEx(&memstat); return (uintmax_t)memstat.ullTotalPhys; #else MEMORYSTATUS memstat; memstat.dwLength = sizeof(memstat); GlobalMemoryStatus(&memstat); return (uintmax_t)memstat.dwTotalPhys; #endif } size_t GC_pageSize (void) { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return (size_t)sysinfo.dwAllocationGranularity; } HANDLE fileDesHandle (int fd) { // The temporary prevents a "cast does not match function type" warning. intptr_t t; t = _get_osfhandle (fd); return (HANDLE)t; } int mkstemp (char *template) { char file_path[255]; char file_name[255]; char templ[4]; if (0 == GetTempPath (sizeof (file_path), file_path)) diee ("unable to make temporary file"); strncpy (templ, template, sizeof (templ) - 1); templ[sizeof (templ) - 1] = 0x00; if (0 == GetTempFileName (file_path, templ, 0, file_name)) diee ("unable to make temporary file"); return _open (file_name, _O_CREAT | _O_RDWR, _S_IREAD | _S_IWRITE); } /* ------------------------------------------------- */ /* Date */ /* ------------------------------------------------- */ #ifndef __GNUC__ #define EPOCHFILETIME (116444736000000000i64) #else #define EPOCHFILETIME (116444736000000000LL) #endif /* The basic plan is to get an initial time using GetSystemTime * that is good up to ~10ms accuracy. From then on, we compute * using deltas with the high-resolution (> microsecond range) * performance timers. A 64-bit accumulator holds microseconds * since (*nix) epoch. This is good for over 500,000 years before * wrap-around becomes a concern. * * However, we might need to watch out for wrap-around with the * QueryPerformanceCounter, because it could be measuring at a higher * frequency than microseconds. * * This function only strives to allow a program to run for * 100 years without being restarted. */ int gettimeofday (struct timeval *tv, __attribute__ ((unused)) struct timezone *tz) { static LARGE_INTEGER frequency; /* ticks/second */ static LARGE_INTEGER baseCounter; /* ticks since last rebase */ static LARGE_INTEGER baseMicroSeconds; /* unix time at last rebase */ LARGE_INTEGER nowCounter; LARGE_INTEGER deltaCounter; LARGE_INTEGER nowMicroSeconds; double deltaMicroseconds; /* This code is run the first time gettimeofday is called. */ if (frequency.QuadPart == 0) { FILETIME ft; /* tzset prepares the localtime function. I don't * really understand why it's here and not there, * but this has been the case since before svn logs. * So I leave it here to preserve the status-quo. */ tzset(); QueryPerformanceCounter(&baseCounter); QueryPerformanceFrequency(&frequency); if (frequency.QuadPart == 0) die("no high resolution clock"); GetSystemTimeAsFileTime (&ft); baseMicroSeconds.LowPart = ft.dwLowDateTime; baseMicroSeconds.HighPart = ft.dwHighDateTime; baseMicroSeconds.QuadPart -= EPOCHFILETIME; baseMicroSeconds.QuadPart /= 10; /* 100ns -> 1ms */ } /* Use the high res counter ticks to calculate the delta. * A double has 52+1 bits of precision. This means it can fit * deltas of up to 9007199254 seconds, or 286 years. We could * rebase before an overflow, but 286 is already > 100. */ QueryPerformanceCounter(&nowCounter); deltaCounter.QuadPart = nowCounter.QuadPart - baseCounter.QuadPart; deltaMicroseconds = deltaCounter.QuadPart; deltaMicroseconds /= frequency.QuadPart; deltaMicroseconds *= 1000000.0; nowMicroSeconds.QuadPart = baseMicroSeconds.QuadPart + deltaMicroseconds; /* If the frequency too fast, we need to check for wrap around. * 2**32 seconds is 136 years, so if HighPart == 0 we don't need to * waste a system call on GetSystemTimeAsFileTime. */ if (frequency.HighPart != 0) { LARGE_INTEGER nowLowResMicroSeconds; FILETIME ft; /* Use low res timer to detect performance counter wrap-around. */ GetSystemTimeAsFileTime (&ft); nowLowResMicroSeconds.LowPart = ft.dwLowDateTime; nowLowResMicroSeconds.HighPart = ft.dwHighDateTime; nowLowResMicroSeconds.QuadPart -= EPOCHFILETIME; nowLowResMicroSeconds.QuadPart /= 10; /* If deltaMicroseconds deviates by more than a second from the low * resolution timer, assume the high performance counter has wrapped. * One second is a safe margin b/c QueryPerformanceFrequency must fit * in a 64-bit integer. Therefore any wrap must exceed one second. */ if (nowMicroSeconds.QuadPart + 1000000 < nowLowResMicroSeconds.QuadPart) { baseCounter = nowCounter; baseMicroSeconds = nowLowResMicroSeconds; nowMicroSeconds = nowLowResMicroSeconds; } /* The above wrap-around detection destroys high resolution timing. * However, if one needs high resolution timing, then one is querying * gettimeofday quite often. Therefore, rebase the clock before any * wrap around troubles happen. We don't do this too often as it * introduces clock drift. */ if ((deltaCounter.HighPart & 0xffff0000UL) != 0) { baseCounter = nowCounter; baseMicroSeconds = nowMicroSeconds; } } tv->tv_sec = (long)(nowMicroSeconds.QuadPart / 1000000); tv->tv_usec = (long)(nowMicroSeconds.QuadPart % 1000000); return 0; } /* ------------------------------------------------- */ /* MLton.Itimer */ /* ------------------------------------------------- */ /* We use the kernel's TimerQueues -- see: * http://msdn.microsoft.com/en-us/library/ms686796(VS.85).aspx */ static HANDLE MainThread = NULL; static HANDLE TimerQueue = NULL; static HANDLE RealTimer = NULL; static HANDLE VirtTimer = NULL; static HANDLE ProfTimer = NULL; static HANDLE PrioTimer = NULL; static void (*SIGALRM_handler)(int sig) = SIG_DFL; static void (*SIGVTAM_handler)(int sig) = SIG_DFL; static void (*SIGPROF_handler)(int sig) = SIG_DFL; /* The timer handler is fired in another thread. * The idea is to suspend the main thread and resume it once we're done. * This will appear more-or-less the same as if a Unix system had received * the signal. We will also be firing the handler in the timer thread itself * for performance reasons (MLton uses this mechanism to do multi-threading). * This means the signal handlers must be fast, which they are since they * just mark the signal to be processed later. */ static VOID CALLBACK MLton_SIGALRM(__attribute__ ((unused)) PVOID myArg, __attribute__ ((unused)) BOOLEAN timeout) { SuspendThread(MainThread); if (SIGALRM_handler == SIG_IGN) { /* noop */ } else if (SIGALRM_handler == SIG_DFL) { die("alarm"); } else { (*SIGALRM_handler)(SIGALRM); } ResumeThread(MainThread); } static VOID CALLBACK MLton_SIGVTAM(__attribute__ ((unused)) PVOID myArg, __attribute__ ((unused)) BOOLEAN timeout) { SuspendThread(MainThread); if (SIGVTAM_handler == SIG_IGN) { /* noop */ } else if (SIGVTAM_handler == SIG_DFL) { die("vtalarm"); } else { (*SIGVTAM_handler)(SIGVTALRM); } ResumeThread(MainThread); } static VOID CALLBACK MLton_SIGPROF(__attribute__ ((unused)) PVOID myArg, __attribute__ ((unused)) BOOLEAN timeout) { SuspendThread(MainThread); if (SIGPROF_handler == SIG_IGN) { /* noop */ } else if (SIGPROF_handler == SIG_DFL) { die("sigprof"); } else { (*SIGPROF_handler)(SIGPROF); } ResumeThread(MainThread); } static void CALLBACK fixPriority(__attribute__ ((unused)) PVOID myArg, __attribute__ ((unused)) BOOLEAN timeout) { SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); DeleteTimerQueueTimer(TimerQueue, PrioTimer, NULL); } static int MLTimer(HANDLE *timer, const struct itimerval *value, WAITORTIMERCALLBACK callback) { DWORD DueTime, Period; /* Initialize the TimerQueue */ if (MainThread == 0) { /* This call improves the resolution of the scheduler from * 16ms to about 2ms in my testing. Sadly it requires winmm. */ timeBeginPeriod(1); TimerQueue = CreateTimerQueue(); if (TimerQueue == NULL) { errno = ENOMEM; return -1; } /* We need to get the TimerQueue to have higher priority. * From my testing, if it has the same priority as the main * thread and the main thread is busy, your best resolution * is a terribly slow 188ms. By boosting the priority of the * timer thread to ABOVE_NORMAL, I've gotten down to 2ms. */ CreateTimerQueueTimer(&PrioTimer, TimerQueue, fixPriority, 0, 1, 0, WT_EXECUTEINTIMERTHREAD); /* We need a handle to the main thread usable by the timer * thread. GetCurrentThread() is a self-reference so we need * to copy it to a new handle for it to work in other threads. */ DuplicateHandle(GetCurrentProcess(), /* source process */ GetCurrentThread(), /* source handle */ GetCurrentProcess(), /* target process */ &MainThread, /* target handle */ 0, /* access (ignored) */ FALSE, /* not inheritable */ DUPLICATE_SAME_ACCESS); if (MainThread == 0) die("Cannot get handle to initial thread"); } /* Windows uses ms accuracy for TimerQueues */ DueTime = value->it_value.tv_sec * 1000 + (value->it_value.tv_usec + 999) / 1000; Period = value->it_interval.tv_sec * 1000 + (value->it_interval.tv_usec + 999) / 1000; if (timer != NULL) { DeleteTimerQueueTimer(TimerQueue, *timer, NULL); *timer = NULL; } if (DueTime == 0) { return 0; } if (!CreateTimerQueueTimer( timer, /* output: created timer */ TimerQueue, /* The queue which holds the timers */ callback, /* Invoked on timer events */ 0, /* myArg for the callback */ DueTime, /* Must be non-zero => time till first event */ Period, /* Time till the event repeats (forever) */ WT_EXECUTEINTIMERTHREAD)) { /* Don't use a thread pool */ errno = ENOMEM; return -1; } return 0; } int setitimer (int which, const struct itimerval *value, struct itimerval *ovalue) { if (ovalue != 0) die("setitimer doesn't support retrieving old state"); switch (which) { case ITIMER_REAL: return MLTimer(&RealTimer, value, &MLton_SIGALRM); case ITIMER_VIRT: return MLTimer(&VirtTimer, value, &MLton_SIGVTAM); case ITIMER_PROF: return MLTimer(&ProfTimer, value, &MLton_SIGPROF); default: errno = EINVAL; return -1; } } static void catcher(__attribute__ ((unused)) int signo) { CONTEXT context; context.ContextFlags = CONTEXT_CONTROL; GetThreadContext(MainThread, &context); #if defined(__i386__) GC_handleSigProf((code_pointer) context.Eip); #elif defined(__x86_64__) GC_handleSigProf((code_pointer) context.Rip); #elif defined(_PPC_) GC_handleSigProf((code_pointer) context.Iar); #elif defined(_ALPHA_) GC_handleSigProf((code_pointer) context.Fir); #elif defined(MIPS) GC_handleSigProf((code_pointer) context.Fir); #elif defined(ARM) GC_handleSigProf((code_pointer) context.Pc); #else #error Profiling handler is missing for this architecture #endif } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = 0; sa->sa_handler = (_sig_func_ptr)&catcher; } /* ------------------------------------------------- */ /* MLton.Rlimit */ /* ------------------------------------------------- */ static struct rlimit rlimits[RLIM_NLIMITS]; static void initRlimits (void) { static int done = FALSE; int lim; if (done) return; done = TRUE; for (lim = 0; lim < RLIM_NLIMITS; ++lim ) { rlimits[lim].rlim_cur = 0; rlimits[lim].rlim_max = UINT_MAX; } } int getrlimit (int resource, struct rlimit *rlp) { initRlimits (); if (resource < 0 or resource >= RLIM_NLIMITS) { errno = EINVAL; return -1; } *rlp = rlimits[resource]; return 0; } int setrlimit (int resource, const struct rlimit *rlp) { initRlimits (); if (resource < 0 or resource >= RLIM_NLIMITS) { errno = EINVAL; return -1; } if (rlp->rlim_cur < rlimits[resource].rlim_max) rlimits[resource].rlim_cur = rlp->rlim_cur; else { errno = EPERM; return -1; } rlimits[resource].rlim_max = rlp->rlim_max; return 0; } /* ------------------------------------------------- */ /* MLton.Rusage */ /* ------------------------------------------------- */ /* GetProcessTimes and GetSystemTimeAsFileTime are documented at: * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocesstimes.asp */ int getrusage (int who, struct rusage *usage) { /* FILETIME has dw{High,Low}DateTime which store the number of * 100-nanoseconds since January 1, 1601 */ FILETIME creation_time; FILETIME exit_time; FILETIME kernel_time; FILETIME user_time; uint64_t user_usecs, kernel_usecs; if (who == RUSAGE_CHILDREN) { // !!! could use exit_time - creation_time from cwait memset(usage, 0, sizeof(struct rusage)); return 0; } if (who != RUSAGE_SELF) { errno = EINVAL; return -1; } if (GetProcessTimes(GetCurrentProcess(), &creation_time, &exit_time, &kernel_time, &user_time) == 0) { errno = EFAULT; return -1; } kernel_usecs = kernel_time.dwHighDateTime; kernel_usecs <<= sizeof(kernel_time.dwHighDateTime)*8; kernel_usecs |= kernel_time.dwLowDateTime; kernel_usecs /= 10; user_usecs = user_time.dwHighDateTime; user_usecs <<= sizeof(user_time.dwHighDateTime)*8; user_usecs |= user_time.dwLowDateTime; user_usecs /= 10; usage->ru_utime.tv_sec = user_usecs / 1000000; usage->ru_utime.tv_usec = user_usecs % 1000000; usage->ru_stime.tv_sec = kernel_usecs / 1000000; usage->ru_stime.tv_usec = kernel_usecs % 1000000; return 0; } /* ------------------------------------------------- */ /* OS.IO */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) int poll (__attribute__ ((unused)) struct pollfd *ufds, __attribute__ ((unused)) unsigned int nfds, __attribute__ ((unused)) int timeout) { die ("poll not implemented"); } /* ------------------------------------------------- */ /* Posix.FileSys */ /* ------------------------------------------------- */ static void GetWin32FileName (int fd, char* fname) { HANDLE fh, fhmap; DWORD fileSize, fileSizeHi; void* pMem = NULL; intptr_t tmp; tmp = _get_osfhandle (fd); fh = (HANDLE)tmp; fileSize = GetFileSize (fh, &fileSizeHi); fhmap = CreateFileMapping (fh, NULL, PAGE_READONLY, 0, fileSize, NULL); if (fhmap) { pMem = MapViewOfFile (fhmap, FILE_MAP_READ, 0, 0, 1); if (pMem) { GetMappedFileNameA (GetCurrentProcess(), pMem, fname, MAX_PATH); UnmapViewOfFile (pMem); } CloseHandle (fhmap); } } int fchmod (int filedes, mode_t mode) { char fname[MAX_PATH + 1]; GetWin32FileName (filedes, fname); return _chmod (fname, mode); } int fchdir (int filedes) { char fname[MAX_PATH + 1]; GetWin32FileName (filedes, fname); return chdir (fname); } __attribute__ ((noreturn)) int chown (__attribute__ ((unused)) const char *path, __attribute__ ((unused)) uid_t owner, __attribute__ ((unused)) gid_t group) { die ("chown not implemented"); } __attribute__ ((noreturn)) int fchown (__attribute__ ((unused)) int fd, __attribute__ ((unused)) uid_t owner, __attribute__ ((unused)) gid_t group) { die ("fchown not implemented"); } __attribute__ ((noreturn)) long fpathconf (__attribute__ ((unused)) int filedes, __attribute__ ((unused)) int name) { die ("fpathconf not implemented"); } __attribute__ ((noreturn)) int link (__attribute__ ((unused)) const char *oldpath, __attribute__ ((unused)) const char *newpath) { die ("link not implemented"); } int lstat (const char *file_name, struct stat *buf) { /* Win32 doesn't really have links. */ return stat (file_name, buf); } __attribute__ ((noreturn)) int mkfifo (__attribute__ ((unused)) const char *pathname, __attribute__ ((unused)) mode_t mode) { die ("mkfifo not implemented"); } __attribute__ ((noreturn)) long pathconf (__attribute__ ((unused)) const char *path, __attribute__ ((unused)) int name) { die ("pathconf not implemented"); } __attribute__ ((noreturn)) int readlink (__attribute__ ((unused)) const char *path, __attribute__ ((unused)) char *buf, __attribute__ ((unused)) size_t bufsiz) { die ("readlink not implemented"); } __attribute__ ((noreturn)) int symlink (__attribute__ ((unused)) const char *oldpath, __attribute__ ((unused)) const char *newpath) { die ("symlink not implemented"); } int truncate (const char *path, off_t len) { int fd; if ((fd = open(path, O_RDWR)) == -1) return -1; if (ftruncate(fd, len) < 0) { close(fd); return -1; } close(fd); return 0; } /* ------------------------------------------------- */ /* Posix.IO */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) int fcntl (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int cmd, ...) { die ("fcntl not implemented"); } int fsync (int fd) { return _commit (fd); } int pipe (int filedes[2]) { HANDLE read_h; HANDLE write_h; /* We pass no security attributes (0), so the current policy gets * inherited. The pipe is set to NOT stay open in child processes. * This will be corrected using DuplicateHandle in create() * The 4k buffersize is choosen b/c that's what linux uses. */ if (!CreatePipe(&read_h, &write_h, 0, 4096)) { errno = ENOMEM; /* fake errno: out of resources */ return -1; } /* This requires Win98+ * Choosing text/binary mode is defered till a later setbin/text call */ filedes[0] = _open_osfhandle((intptr_t)read_h, _O_RDONLY); filedes[1] = _open_osfhandle((intptr_t)write_h, _O_WRONLY); if (filedes[0] == -1 or filedes[1] == -1) { if (filedes[0] == -1) CloseHandle(read_h); else close(filedes[0]); if (filedes[1] == -1) CloseHandle(write_h); else close(filedes[1]); errno = ENFILE; return -1; } return 0; } /* ------------------------------------------------- */ /* Posix.ProcEnv */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) char *ctermid (__attribute__ ((unused)) char* s) { die ("*ctermid not implemented"); } __attribute__ ((noreturn)) gid_t getegid (void) { die ("getegid not implemented"); } __attribute__ ((noreturn)) uid_t geteuid (void) { die ("geteuid not implemented"); } __attribute__ ((noreturn)) gid_t getgid (void) { die ("getgid not implemented"); } __attribute__ ((noreturn)) int getgroups (__attribute__ ((unused)) int size, __attribute__ ((unused)) gid_t list[]) { die ("getgroups not implemented"); } __attribute__ ((noreturn)) char *getlogin (void) { die ("getlogin not implemented"); } __attribute__ ((noreturn)) pid_t getpgid(__attribute__ ((unused)) pid_t pid) { die ("getpgid not implemented"); } __attribute__ ((noreturn)) pid_t getpgrp(void) { die ("getpgrp not implemented"); } __attribute__ ((noreturn)) pid_t getppid (void) { die ("getppid not implemented"); } __attribute__ ((noreturn)) uid_t getuid (void) { die ("getuid not implemented"); } int setenv (const char *name, const char *value, int overwrite) { /* We could use _putenv, but then we'd need a temporary buffer for * use to concat name=value. */ if (not overwrite and getenv (name)) { errno = EEXIST; return -1; /* previous mingw setenv was buggy and returned 0 */ } if (SetEnvironmentVariable (name, value)) { errno = ENOMEM; /* this happens often in Windows.. */ return -1; } return 0; } __attribute__ ((noreturn)) int setgid (__attribute__ ((unused)) gid_t gid) { die ("setgid not implemented"); } __attribute__ ((noreturn)) int setgroups (__attribute__ ((unused)) size_t size, __attribute__ ((unused)) const gid_t *list) { die ("setgroups not implemented"); } __attribute__ ((noreturn)) int setpgid (__attribute__ ((unused)) pid_t pid, __attribute__ ((unused)) pid_t pgid) { die ("setpgid not implemented"); } __attribute__ ((noreturn)) pid_t setsid (void) { die ("setsid not implemented"); } __attribute__ ((noreturn)) int setuid (__attribute__ ((unused)) uid_t uid) { die ("setuid not implemented"); } __attribute__ ((noreturn)) long sysconf (__attribute__ ((unused)) int name) { die ("sysconf not implemented"); } __attribute__ ((noreturn)) clock_t times (__attribute__ ((unused)) struct tms *buf) { die ("times not implemented"); } __attribute__ ((noreturn)) char *ttyname (__attribute__ ((unused)) int desc) { die ("*ttyname not implemented"); } static void setMachine (struct utsname *buf) { int level; const char* platform = "unknown"; SYSTEM_INFO si; GetSystemInfo (&si); level = si.dwProcessorType; switch (si.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_INTEL: if (level < 3) level = 3; if (level > 6) level = 6; platform = "i%d86"; break; case PROCESSOR_ARCHITECTURE_IA64: platform = "ia64"; break; case PROCESSOR_ARCHITECTURE_AMD64: platform = "amd64"; break; case PROCESSOR_ARCHITECTURE_PPC: platform = "ppc"; break; case PROCESSOR_ARCHITECTURE_ALPHA: platform = "alpha"; break; case PROCESSOR_ARCHITECTURE_MIPS: platform = "mips"; break; case PROCESSOR_ARCHITECTURE_ARM: platform = "arm"; break; case PROCESSOR_ARCHITECTURE_ALPHA64: platform = "alpha64"; break; /* SHX? MSIL? IA32_ON_WIN64? */ default: platform = "unknown"; break; } sprintf (buf->machine, platform, level); } static void setSysname (struct utsname *buf) { OSVERSIONINFOEX osv; const char* os = "??"; #ifndef _WIN64 /* Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. */ SYSTEM_INFO si; void (WINAPI *pGNSI)(LPSYSTEM_INFO); pGNSI = (void(WINAPI *)(LPSYSTEM_INFO)) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); if (NULL != pGNSI) pGNSI(&si); else GetSystemInfo(&si); #endif osv.dwOSVersionInfoSize = sizeof (osv); /* Try to get extended information in order to be able to match the O.S. more precisely using osv.wProductType */ if (! GetVersionEx ((OSVERSIONINFO *)(void*) &osv)) { ZeroMemory(&osv, sizeof(OSVERSIONINFOEX)); osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO *)(void*) &osv); } switch (osv.dwPlatformId) { case VER_PLATFORM_WIN32_NT: #ifdef _WIN64 if (osv.dwMinorVersion == 0) { if (osv.dwMajorVersion <= 6) { if (osv.wProductType == VER_NT_WORKSTATION) os = "Vista_64"; else os = "2008_64"; } else os = "NTx_64"; } else if (osv.dwMinorVersion <= 2) os = "XP_64"; else os = "NTx_64"; #else if (osv.dwMinorVersion == 0) { if (osv.dwMajorVersion <= 4) os = "NT"; else if (osv.dwMajorVersion <= 5) os = "2000"; else { if (osv.wProductType == VER_NT_WORKSTATION) { if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) os = "Vista_WOW64"; else os = "Vista"; } else { if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) os = "2008"; else os = "2008_WOW64"; } } } else if (osv.dwMinorVersion <= 1) os = "XP"; else if (osv.dwMinorVersion <= 2) { if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) os = "XP_WOW64"; else os = "2003"; } else os = "NTx"; #endif break; case VER_PLATFORM_WIN32_WINDOWS: if (osv.dwMinorVersion == 0) os = "95"; else if (osv.dwMinorVersion < 90) os = "98"; else if (osv.dwMinorVersion == 90) os = "Me"; else os = "9X"; break; case VER_PLATFORM_WIN32s: os = "31"; /* aka DOS + Windows 3.1 */ break; default: os = "unknown"; break; } #ifdef _WIN64 #define mingw_name "MINGW64" #else #define mingw_name "MINGW32" #endif sprintf (buf->sysname, "%s_%s-%d.%d", mingw_name, os, (int)osv.dwMajorVersion, (int)osv.dwMinorVersion); } int uname (struct utsname *buf) { MLton_initSockets(); /* needed for gethostname */ setMachine (buf); setSysname (buf); unless (0 == gethostname (buf->nodename, sizeof (buf->nodename))) { strcpy (buf->nodename, "unknown"); } #ifdef _WIN64 sprintf (buf->release, "%d", __MINGW64_VERSION_MINOR); sprintf (buf->version, "%d", __MINGW64_VERSION_MAJOR); #else sprintf (buf->release, "%d", __MINGW32_MINOR_VERSION); sprintf (buf->version, "%d", __MINGW32_MAJOR_VERSION); #endif return 0; } /* ------------------------------------------------- */ /* Posix.Process */ /* ------------------------------------------------- */ int alarm (int secs) { struct itimerval new; new.it_interval.tv_usec = 0; new.it_interval.tv_sec = 0; new.it_value.tv_usec = 0; new.it_value.tv_sec = secs; return setitimer(ITIMER_REAL, &new, 0); } __attribute__ ((noreturn)) int fork (void) { die ("fork not implemented"); } int kill (pid_t pid, int sig) { HANDLE h = (HANDLE)pid; unless (TerminateProcess (h, SIGNALLED_BIT | sig)) { errno = ECHILD; return -1; } return 0; } int nanosleep (const struct timespec *req, struct timespec *rem) { Sleep (req->tv_sec * 1000 + (req->tv_nsec + 999999) / 1000000); rem->tv_nsec = 0; rem->tv_sec = 0; return 0; } __attribute__ ((noreturn)) int pause (void) { die ("pause not implemented"); } unsigned int sleep (unsigned int seconds) { Sleep (seconds * 1000); return 0; } __attribute__ ((noreturn)) pid_t wait (__attribute__ ((unused)) int *status) { die ("wait not implemented"); } pid_t waitpid (pid_t pid, int *status, int options) { HANDLE h; DWORD delay; /* pid <= 0 is handled in stub-mingw.sml */ h = (HANDLE)pid; delay = ((options & WNOHANG) != 0) ? 0 : INFINITE; switch (WaitForSingleObject (h, delay)) { case WAIT_OBJECT_0: /* process has exited */ break; case WAIT_TIMEOUT: /* process has not exited */ return 0; default: /* some sort of error */ errno = ECHILD; return -1; } unless (GetExitCodeProcess (h, (DWORD*)status)) { errno = ECHILD; return -1; } return pid; } /* ------------------------------------------------- */ /* Signals */ /* ------------------------------------------------- */ int sigaction (int signum, const struct sigaction *newact, struct sigaction *oldact) { _sig_func_ptr old; if (signum < 0 or signum >= NSIG) { errno = EINVAL; return -1; } switch (signum) { case SIGKILL: case SIGSTOP: errno = EINVAL; return -1; case SIGALRM: old = SIGALRM_handler; if (newact) SIGALRM_handler = newact->sa_handler; break; case SIGVTALRM: old = SIGVTAM_handler; if (newact) SIGVTAM_handler = newact->sa_handler; break; case SIGPROF: old = SIGPROF_handler; if (newact) SIGPROF_handler = newact->sa_handler; break; default: old = signal (signum, newact?newact->sa_handler:0); if (!newact) signal (signum, old); break; } if (oldact) oldact->sa_handler = old; return 0; } int sigaddset (sigset_t *set, const int signum) { if (signum < 0 or signum >= NSIG) { errno = EINVAL; return -1; } *set |= SIGTOMASK (signum); return 0; } int sigdelset (sigset_t *set, const int signum) { if (signum < 0 or signum >= NSIG) { errno = EINVAL; return -1; } *set &= ~SIGTOMASK (signum); return 0; } int sigemptyset (sigset_t *set) { *set = (sigset_t) 0; return 0; } int sigfillset (sigset_t *set) { *set = ~((sigset_t) 0); return 0; } int sigismember (const sigset_t *set, const int signum) { if (signum < 0 or signum >= NSIG) { errno = EINVAL; return -1; } return (*set & SIGTOMASK(signum)) ? 1 : 0; } /* With a bit of work and a redirected signal() function, we could * probably emulate these methods properly. AtM blocking is a lie. */ static sigset_t signals_blocked = 0; static sigset_t signals_pending = 0; int sigpending (sigset_t *set) { *set = signals_pending; return 0; } int sigprocmask (int how, const sigset_t *set, sigset_t *oldset) { if (oldset) { *oldset = signals_blocked; } if (set) { sigset_t newmask = signals_blocked; switch (how) { case SIG_BLOCK: /* add set to current mask */ newmask |= *set; break; case SIG_UNBLOCK: /* remove set from current mask */ newmask &= ~*set; break; case SIG_SETMASK: /* just set it */ newmask = *set; break; default: return -1; } signals_blocked = newmask; } return 0; } __attribute__ ((noreturn)) int sigsuspend (__attribute__ ((unused)) const sigset_t *mask) { die("sigsuspend is unimplemented, but could be hacked in if needed"); } /* ------------------------------------------------- */ /* Posix.IO */ /* ------------------------------------------------- */ void Posix_IO_setbin (C_Fd_t fd) { _setmode (fd, _O_BINARY); } void Posix_IO_settext (C_Fd_t fd) { _setmode (fd, _O_TEXT); } /* ------------------------------------------------- */ /* Posix.SysDB.Passwd */ /* ------------------------------------------------- */ #define INFO_LEVEL 3 static LPUSER_INFO_3 usrData = NULL; static struct passwd passwd; __attribute__ ((noreturn)) struct group *getgrgid (__attribute__ ((unused)) gid_t gid) { die ("getgrgid not implemented"); } __attribute__ ((noreturn)) struct group *getgrnam (__attribute__ ((unused)) const char *name) { die ("getgrnam not implemented"); } struct passwd *getpwnam (__attribute__ ((unused)) const char *name) { return NULL; // unless (NERR_Success == // NetUserGetInfo (NULL, (LPCWSTR)name, INFO_LEVEL, // (LPBYTE*)&usrData)) // return NULL; passwd.pw_dir = (char*)usrData->usri3_home_dir; passwd.pw_gid = usrData->usri3_primary_group_id; passwd.pw_name = (char*)usrData->usri3_name; passwd.pw_shell = (char*)usrData->usri3_script_path; passwd.pw_uid = usrData->usri3_user_id; return &passwd; } __attribute__ ((noreturn)) struct passwd *getpwuid (__attribute__ ((unused)) uid_t uid) { die ("getpwuid not implemented"); } /* ------------------------------------------------- */ /* Posix.TTY */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) speed_t cfgetispeed (__attribute__ ((unused)) struct termios *termios_p) { die ("cfgetispeed not implemented"); } __attribute__ ((noreturn)) speed_t cfgetospeed (__attribute__ ((unused)) struct termios *termios_p) { die ("cfgetospeed not implemented"); } __attribute__ ((noreturn)) int cfsetispeed (__attribute__ ((unused)) struct termios *termios_p, __attribute__ ((unused)) speed_t speed) { die ("cfsetispeed not implemented"); } __attribute__ ((noreturn)) int cfsetospeed (__attribute__ ((unused)) struct termios *termios_p, __attribute__ ((unused)) speed_t speed) { die ("cfsetospeed not implemented"); } __attribute__ ((noreturn)) int tcdrain (__attribute__ ((unused)) int fd) { die ("tcdrain not implemented"); } __attribute__ ((noreturn)) int tcflow (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int action) { die ("tcflow not implemented"); } __attribute__ ((noreturn)) int tcflush (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int queue_selector) { die ("tcflush not implemented"); } __attribute__ ((noreturn)) int tcgetattr (__attribute__ ((unused)) int fd, __attribute__ ((unused)) struct termios *termios_p) { die ("tcgetattr not implemented"); } __attribute__ ((noreturn)) pid_t tcgetpgrp (__attribute__ ((unused)) int fd) { die ("tcgetpgrp not implemented"); } __attribute__ ((noreturn)) int tcsendbreak (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int duration) { die ("tcsendbreak not implemented"); } __attribute__ ((noreturn)) int tcsetattr (__attribute__ ((unused)) int fd, __attribute__ ((unused)) int optional_actions, __attribute__ ((unused)) struct termios *termios_p) { die ("tcsetattr not implemented"); } __attribute__ ((noreturn)) int tcsetpgrp (__attribute__ ((unused)) int fd, __attribute__ ((unused)) pid_t pgrpid) { die ("tcsetpgrp not implemented"); } /* ------------------------------------------------- */ /* Socket */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) int ioctl (__attribute__ ((unused)) int d, __attribute__ ((unused)) int request, ...) { die ("ioctl not implemented"); } __attribute__ ((noreturn)) int socketpair (__attribute__ ((unused)) int d, __attribute__ ((unused)) int type, __attribute__ ((unused)) int protocol, __attribute__ ((unused)) int sv[2]) { die ("socketpair not implemented"); } void MLton_initSockets (void) { static Bool isInitialized = FALSE; WORD version; WSADATA wsaData; unless (isInitialized) { isInitialized = TRUE; version = MAKEWORD (2,2); WSAStartup (version, &wsaData); } } /* This table was constructed with help of * http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx#winsock.wsaenotsock_2 * man errno(3) */ void MLton_fixSocketErrno (void) { int status = WSAGetLastError (); switch (status) { case 0: errno = 0; break; case WSAEINTR: errno = EINTR; break; case WSAEBADF: errno = EBADF; break; case WSAEACCES: errno = EACCES; break; case WSAEFAULT: errno = EFAULT; break; case WSAEINVAL: errno = EINVAL; break; case WSAEMFILE: errno = EMFILE; break; case WSAEWOULDBLOCK: errno = EWOULDBLOCK; break; case WSAEINPROGRESS: errno = EINPROGRESS; break; case WSAEALREADY: errno = EALREADY; break; case WSAENOTSOCK: errno = ENOTSOCK; break; case WSAEDESTADDRREQ: errno = EDESTADDRREQ; break; case WSAEMSGSIZE: errno = EMSGSIZE; break; case WSAEPROTOTYPE: errno = EPROTOTYPE; break; case WSAENOPROTOOPT: errno = ENOPROTOOPT; break; case WSAEPROTONOSUPPORT: errno = EPROTONOSUPPORT; break; case WSAESOCKTNOSUPPORT: errno = ESOCKTNOSUPPORT; break; case WSAEOPNOTSUPP: errno = EOPNOTSUPP; break; case WSAEPFNOSUPPORT: errno = EPFNOSUPPORT; break; case WSAEAFNOSUPPORT: errno = EAFNOSUPPORT; break; case WSAEADDRINUSE: errno = EADDRINUSE; break; case WSAEADDRNOTAVAIL: errno = EADDRNOTAVAIL; break; case WSAENETDOWN: errno = ENETDOWN; break; case WSAENETUNREACH: errno = ENETUNREACH; break; case WSAENETRESET: errno = ENETRESET; break; case WSAECONNABORTED: errno = ECONNABORTED; break; case WSAECONNRESET: errno = ECONNRESET; break; case WSAENOBUFS: errno = ENOBUFS; break; case WSAEISCONN: errno = EISCONN; break; case WSAENOTCONN: errno = ENOTCONN; break; case WSAESHUTDOWN: errno = ESHUTDOWN; break; case WSAETIMEDOUT: errno = ETIMEDOUT; break; case WSAECONNREFUSED: errno = ECONNREFUSED; break; case WSAELOOP: errno = ELOOP; break; case WSAENAMETOOLONG: errno = ENAMETOOLONG; break; case WSAEHOSTDOWN: errno = EHOSTDOWN; break; case WSAEHOSTUNREACH: errno = EHOSTUNREACH; break; case WSAENOTEMPTY: errno = ENOTEMPTY; break; case WSAEDQUOT: errno = EDQUOT; break; case WSAESTALE: errno = ESTALE; break; case WSAEREMOTE: errno = EREMOTE; break; /* These codes appear to have a matching name, but the manual * descriptions of what the error codes mean seem to differ */ case WSAEUSERS: errno = EUSERS; break; case WSAECANCELLED: errno = ECANCELED; break; case WSA_E_CANCELLED: errno = ECANCELED; break; /* These codes have no matching code in the errno(3) man page. */ case WSAEPROCLIM: errno = EBUSY; break; case WSAETOOMANYREFS: errno = ENOMEM; break; case WSAEDISCON: errno = ESHUTDOWN; break; case WSA_E_NO_MORE: case WSAENOMORE: case WSASYSCALLFAILURE: errno = EIO; break; /* These codes are returned from the OS and subject to chage */ // WSA_INVALID_HANDLE // WSA_NOT_ENOUGH_MEMORY // WSA_INVALID_PARAMETER // WSA_OPERATION_ABORTED // WSA_IO_INCOMPLETE // WSA_IO_PENDING /* These codes mean some sort of windows specific fatal error */ case WSASYSNOTREADY: case WSAVERNOTSUPPORTED: case WSANOTINITIALISED: case WSAEINVALIDPROCTABLE: case WSAEINVALIDPROVIDER: case WSAEPROVIDERFAILEDINIT: case WSASERVICE_NOT_FOUND: case WSATYPE_NOT_FOUND: die("Problem loading winsock"); case WSAEREFUSED: case WSAHOST_NOT_FOUND: case WSATRY_AGAIN: case WSANO_RECOVERY: case WSANO_DATA: die("Strange winsock specific status code"); default: die("Unknown winsock status code"); } } /* The default strerror() does not know extended error codes. */ char *MLton_strerror(int code) { static char buffer[512]; /* Windows specific strerror */ if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, /* Not used for FROM_SYSTEM */ code, /* The status code to look up */ 0, /* Use the default language */ buffer, /* Write the message to here */ sizeof(buffer)-1, 0) == 0) { strcpy(buffer, "Unknown error"); } /* Cut message at EOL */ for (int i = 0; buffer[i]; ++i) if (buffer[i] == '\n' || buffer[i] == '\r') buffer[i] = 0; return buffer; } int MLton_recv(int s, void *buf, int len, int flags) { int ret, status = 0; if (flags & MSG_DONTWAIT) MinGW_setNonBlock(s); ret = recv(s, buf, len, flags & ~MSG_DONTWAIT); /* We need to preserve the error status across non-blocking call */ if (ret == -1) status = WSAGetLastError(); if (flags & MSG_DONTWAIT) MinGW_clearNonBlock(s); if (ret == -1) WSASetLastError(status); return ret; } int MLton_recvfrom(int s, void *buf, int len, int flags, void *from, socklen_t *fromlen) { int ret, status = 0; if (flags & MSG_DONTWAIT) MinGW_setNonBlock(s); ret = recvfrom(s, buf, len, flags & ~MSG_DONTWAIT, from, fromlen); /* We need to preserve the error status across non-blocking call */ if (ret == -1) status = WSAGetLastError(); if (flags & MSG_DONTWAIT) MinGW_clearNonBlock(s); if (ret == -1) WSASetLastError(status); return ret; } /* ------------------------------------------------- */ /* Syslog */ /* ------------------------------------------------- */ static const char* logident = ""; static int logopt = LOG_PERROR; static int logfacility = LOG_LOCAL0; void openlog(const char* ident, int opt, int facility) { logident = ident; logopt = opt; logfacility = facility; } void closelog(void) { } void syslog(int priority, __attribute__ ((unused)) const char* fmt, const char* msg) { static const char* severity[] = { "debug", "informational", "notice", "warning", "error", "CRITICAL", "ALERT", "EMERGENCY" }; if (priority < 0) priority = LOG_DEBUG; if (priority > LOG_EMERG) priority = LOG_EMERG; /* !!! Use ReportEvent to log with windows */ if ((logopt & LOG_PERROR) != 0) { if ((logopt & LOG_PID) != 0) fprintf(stderr, "%s(%d): %s: %s\n", logident, getpid(), severity[priority], msg); else fprintf(stderr, "%s: %s: %s\n", logident, severity[priority], msg); } } /* ------------------------------------------------- */ /* MinGW */ /* ------------------------------------------------- */ C_Size_t MinGW_getTempPath(C_Size_t buf_size, Array(Char8_t) buf) { return GetTempPath(buf_size, (char*)buf); } void MinGW_setNonBlock(C_Fd_t fd) { unsigned long yes = 1; ioctlsocket(fd, FIONBIO, &yes); } void MinGW_clearNonBlock(C_Fd_t fd) { unsigned long no = 0; ioctlsocket(fd, FIONBIO, &no); } mlton-20100608/runtime/platform/mingw.h0000644000076600000240000010032311404435622016360 0ustar mtfstaff/* Many of the functions used in mingw.c are Win2000+ */ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0500 #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #undef max // As of 20080807, MinGW has a broken fesetround. Use the runtime's. #define HAS_FEROUND FALSE // As of 20051104, MinGW has fpclassify, but it is broken. In particular, it // classifies subnormals as normals. So, we disable it here, which causes the // runtime to use our own version. #define HAS_FPCLASSIFY FALSE #define HAS_FPCLASSIFY32 FALSE #define HAS_FPCLASSIFY64 FALSE #define HAS_MSG_DONTWAIT FALSE #define HAS_REMAP TRUE #define HAS_SIGALTSTACK FALSE #define HAS_SIGNBIT TRUE #define HAS_SPAWN TRUE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "mingw" /** MinGW is a moving target. MLton seems to break every release. * Often new releases add new emulation for POSIX functions. * We need to provide wrappers for some POSIX functions, but * these wrappers end up conflicting with MinGW if they're added. * Therefore, all wrapper stuff we add will be #define'd to use * a MLton_prefix, thus avoiding collision with MinGW versions, * current, old, or future. Macros themselves can conflict, so * we need to #undef any old value, and in the case of constants, * wrap the define in an ifndef. It's ugly and verbose, but safe. */ #define MLTON_WRAPPER typedef unsigned short MLton_gid_t; typedef unsigned short MLton_uid_t; typedef long MLton_suseconds_t; // type of timeval.tv_usec in sys/time.h typedef short MLton_nlink_t; // type of st_nlink in sys/stat.h typedef unsigned int MLton_nfds_t; // we have a fake poll() with this many fds #undef gid_t #undef uid_t #undef suseconds_t #undef nlink_t #undef nfds_t #define gid_t MLton_gid_t #define uid_t MLton_uid_t #define suseconds_t MLton_suseconds_t #define nlink_t MLton_nlink_t #define nfds_t MLton_nfds_t MLTON_WRAPPER int MLton_getpagesize (void); MLTON_WRAPPER int MLton_mkstemp (char *template); #undef getpagesize #undef mkstemp #define getpagesize MLton_getpagesize #define mkstemp MLton_mkstemp #ifndef POLLIN #define POLLIN 1 #endif #ifndef POLLPRI #define POLLPRI 2 #endif #ifndef POLLOUT #define POLLOUT 4 #endif #ifndef _PC_CHOWN_RESTRICTED #define _PC_CHOWN_RESTRICTED 6 #endif #ifndef _PC_LINK_MAX #define _PC_LINK_MAX 0 #endif #ifndef _PC_MAX_CANON #define _PC_MAX_CANON 1 #endif #ifndef _PC_MAX_INPUT #define _PC_MAX_INPUT 2 #endif #ifndef _PC_NAME_MAX #define _PC_NAME_MAX 3 #endif #ifndef _PC_NO_TRUNC #define _PC_NO_TRUNC 7 #endif #ifndef _PC_PATH_MAX #define _PC_PATH_MAX 4 #endif #ifndef _PC_PIPE_BUF #define _PC_PIPE_BUF 5 #endif #ifndef _PC_VDISABLE #define _PC_VDISABLE 8 #endif #ifndef F_DUPFD #define F_DUPFD 0 #endif #ifndef F_GETFD #define F_GETFD 1 #endif #ifndef F_SETFD #define F_SETFD 2 #endif #ifndef F_GETFL #define F_GETFL 3 #endif #ifndef F_SETFL #define F_SETFL 4 #endif #ifndef F_GETOWN #define F_GETOWN 5 #endif #ifndef F_SETOWN #define F_SETOWN 6 #endif #ifndef F_GETLK #define F_GETLK 7 #endif #ifndef F_SETLK #define F_SETLK 8 #endif #ifndef F_RDLCK #define F_RDLCK 1 #endif #ifndef F_WRLCK #define F_WRLCK 2 #endif #ifndef F_UNLCK #define F_UNLCK 3 #endif #ifndef F_SETLKW #define F_SETLKW 9 #endif #ifndef FD_CLOEXEC #define FD_CLOEXEC 1 #endif #ifndef SHUT_RD #define SHUT_RD SD_RECEIVE #endif #ifndef SHUT_WR #define SHUT_WR SD_SEND #endif #ifndef SHUT_RDWR #define SHUT_RDWR SD_BOTH #endif /* ------------------------------------------------- */ /* Date */ /* ------------------------------------------------- */ /* MinGW provides gettimeofday in -lmingwex, which we don't link. * In order to avoid a name conflict, we use a different name. */ struct MLton_timezone { int unused; }; #undef timezone #define timezone MLton_timezone MLTON_WRAPPER int MLton_gettimeofday (struct timeval *tv, struct timezone *tz); #undef gettimeofday #define gettimeofday MLton_gettimeofday /* ------------------------------------------------- */ /* MLton.Itimer */ /* ------------------------------------------------- */ #ifndef ITIMER_REAL #define ITIMER_REAL 0 /*generates sigalrm */ #endif #ifndef ITIMER_VIRTUAL #define ITIMER_VIRTUAL 1 /*generates sigvtalrm */ #endif #ifndef ITIMER_VIRT #define ITIMER_VIRT 1 /*generates sigvtalrm */ #endif #ifndef ITIMER_PROF #define ITIMER_PROF 2 /*generates sigprof */ #endif struct MLton_itimerval { struct timeval it_interval; struct timeval it_value; }; #undef itimerval #define itimerval MLton_itimerval MLTON_WRAPPER int MLton_setitimer (int which, const struct itimerval *value, struct itimerval *ovalue); #undef setitimer #define setitimer MLton_setitimer /* ------------------------------------------------- */ /* MLton.Rlimit */ /* ------------------------------------------------- */ #ifndef RLIMIT_CPU #define RLIMIT_CPU 0 /* CPU time in seconds */ #endif #ifndef RLIMIT_FSIZE #define RLIMIT_FSIZE 1 /* Maximum filesize */ #endif #ifndef RLIMIT_DATA #define RLIMIT_DATA 2 /* max data size */ #endif #ifndef RLIMIT_STACK #define RLIMIT_STACK 3 /* max stack size */ #endif #ifndef RLIMIT_CORE #define RLIMIT_CORE 4 /* max core file size */ #endif #ifndef RLIMIT_NOFILE #define RLIMIT_NOFILE 5 /* max number of open files */ #endif #ifndef RLIMIT_OFILE #define RLIMIT_OFILE RLIMIT_NOFILE /* BSD name */ #endif #ifndef RLIMIT_AS #define RLIMIT_AS 6 /* address space (virt. memory) limit */ #endif #define RLIMIT_NLIMITS 7 /* upper bound of RLIMIT_* defines */ #define RLIM_NLIMITS RLIMIT_NLIMITS #ifndef RLIM_INFINITY #define RLIM_INFINITY (0xffffffffUL) #endif #ifndef RLIM_SAVED_MAX #define RLIM_SAVED_MAX RLIM_INFINITY #endif #ifndef RLIM_SAVED_CUR #define RLIM_SAVED_CUR RLIM_INFINITY #endif typedef unsigned long MLton_rlim_t; #undef rlim_t #define rlim_t MLton_rlim_t struct MLton_rlimit { rlim_t rlim_cur; rlim_t rlim_max; }; #undef rlimit #define rlimit MLton_rlimit MLTON_WRAPPER int MLton_getrlimit (int resource, struct rlimit *rlim); MLTON_WRAPPER int MLton_setrlimit (int resource, const struct rlimit *rlim); #undef getrlimit #undef setrlimit #define getrlimit MLton_getrlimit #define setrlimit MLton_setrlimit /* ------------------------------------------------- */ /* MLton.Rusage */ /* ------------------------------------------------- */ #ifndef RUSAGE_SELF #define RUSAGE_SELF 0 /* calling process */ #endif #ifndef RUSAGE_CHILDREN #define RUSAGE_CHILDREN -1 /* terminated child processes */ #endif struct MLton_rusage { struct timeval ru_utime; struct timeval ru_stime; }; #undef rusage #define rusage MLton_rusage MLTON_WRAPPER int MLton_getrusage (int who, struct rusage *usage); #undef getrusage #define getrusage MLton_getrusage /* ------------------------------------------------- */ /* OS.IO */ /* ------------------------------------------------- */ struct MLton_pollfd { short events; int fd; short revents; }; #undef pollfd #define pollfd MLton_pollfd MLTON_WRAPPER int MLton_poll (struct pollfd *ufds, nfds_t nfds, int timeout); #undef poll #define poll MLton_poll /* ------------------------------------------------- */ /* Posix.Error */ /* ------------------------------------------------- */ /* We cannot yet replace strerror at the time util.c is built */ #ifndef MLTON_UTIL MLTON_WRAPPER char *MLton_strerror(int code); #undef strerror #define strerror MLton_strerror #endif /* If MinGW doesn't (currently) define an error status we need, but winsock * does, then default to using the winsock status. They will not conflict. */ #ifndef EINTR #define EINTR WSAEINTR #endif #ifndef EBADF #define EBADF WSAEBADF #endif #ifndef EACCES #define EACCES WSAEACCES #endif #ifndef EFAULT #define EFAULT WSAEFAULT #endif #ifndef EINVAL #define EINVAL WSAEINVAL #endif #ifndef EMFILE #define EMFILE WSAEMFILE #endif #ifndef EAGAIN #define EAGAIN WSAEWOULDBLOCK #endif #ifndef EWOULDBLOCK #define EWOULDBLOCK EAGAIN #endif #ifndef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #endif #ifndef EALREADY #define EALREADY WSAEALREADY #endif #ifndef ENOTSOCK #define ENOTSOCK WSAENOTSOCK #endif #ifndef EDESTADDRREQ #define EDESTADDRREQ WSAEDESTADDRREQ #endif #ifndef EMSGSIZE #define EMSGSIZE WSAEMSGSIZE #endif #ifndef EPROTOTYPE #define EPROTOTYPE WSAEPROTOTYPE #endif #ifndef ENOPROTOOPT #define ENOPROTOOPT WSAENOPROTOOPT #endif #ifndef EPROTONOSUPPORT #define EPROTONOSUPPORT WSAEPROTONOSUPPORT #endif #ifndef ESOCKTNOSUPPORT #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT #endif #ifndef EOPNOTSUPP #define EOPNOTSUPP WSAEOPNOTSUPP #endif #ifndef EPFNOSUPPORT #define EPFNOSUPPORT WSAEPFNOSUPPORT #endif #ifndef EAFNOSUPPORT #define EAFNOSUPPORT WSAEAFNOSUPPORT #endif #ifndef EADDRINUSE #define EADDRINUSE WSAEADDRINUSE #endif #ifndef EADDRNOTAVAIL #define EADDRNOTAVAIL WSAEADDRNOTAVAIL #endif #ifndef ENETDOWN #define ENETDOWN WSAENETDOWN #endif #ifndef ENETUNREACH #define ENETUNREACH WSAENETUNREACH #endif #ifndef ENETRESET #define ENETRESET WSAENETRESET #endif #ifndef ECONNABORTED #define ECONNABORTED WSAECONNABORTED #endif #ifndef ECONNRESET #define ECONNRESET WSAECONNRESET #endif #ifndef ENOBUFS #define ENOBUFS WSAENOBUFS #endif #ifndef EISCONN #define EISCONN WSAEISCONN #endif #ifndef ENOTCONN #define ENOTCONN WSAENOTCONN #endif #ifndef ESHUTDOWN #define ESHUTDOWN WSAESHUTDOWN #endif #ifndef ETIMEDOUT #define ETIMEDOUT WSAETIMEDOUT #endif #ifndef ECONNREFUSED #define ECONNREFUSED WSAECONNREFUSED #endif #ifndef ELOOP #define ELOOP WSAELOOP #endif #ifndef ENAMETOOLONG #define ENAMETOOLONG WSAENAMETOOLONG #endif #ifndef EHOSTDOWN #define EHOSTDOWN WSAEHOSTDOWN #endif #ifndef EHOSTUNREACH #define EHOSTUNREACH WSAEHOSTUNREACH #endif #ifndef ENOTEMPTY #define ENOTEMPTY WSAENOTEMPTY #endif #ifndef EDQUOT #define EDQUOT WSAEDQUOT #endif #ifndef ESTALE #define ESTALE WSAESTALE #endif #ifndef ERMOTE #define EREMOTE WSAEREMOTE #endif /* Questionable fall backs: */ #ifndef EUSERS #define EUSERS WSAEUSERS #endif #ifndef ECANCELED #define ECANCELED WSAECANCELLED #endif #ifndef EBADMSG #define EBADMSG 77 #endif /* ------------------------------------------------- */ /* Posix.FileSys */ /* ------------------------------------------------- */ #ifndef S_IRGRP #define S_IRGRP 0000040 #endif #ifndef S_IROTH #define S_IROTH 0000004 #endif #ifndef S_IRWXG #define S_IRWXG 0000070 #endif #ifndef S_IRWXO #define S_IRWXO 0000007 #endif #ifndef S_ISGID #define S_ISGID 0002000 #endif #ifndef S_ISUID #define S_ISUID 0004000 #endif #ifndef S_IWGRP #define S_IWGRP 0000020 #endif #ifndef S_IWOTH #define S_IWOTH 0000002 #endif #ifndef S_IXGRP #define S_IXGRP 0000010 #endif #ifndef S_IXOTH #define S_IXOTH 0000001 #endif // Do not exist in a windows filesystem #ifndef S_IFLNK #define S_IFLNK 0 #endif #ifndef S_IFSOCK #define S_IFSOCK 0 #endif #ifndef S_ISVTX #define S_ISVTX 0 #endif #ifndef O_NOCTTY #define O_NOCTTY 0x8000 #endif #ifndef O_NONBLOCK #define O_NONBLOCK 0x4000 #endif // Synchronized writes? Safety of any kind? ... and windows?! hell no! #ifndef O_SYNC #define O_SYNC 0 #endif // Use m to silence unused warnings #undef S_ISLNK #undef S_ISSOCK #define S_ISLNK(m) (m?FALSE:FALSE) #define S_ISSOCK(m) (m?FALSE:FALSE) #ifndef O_ACCMODE #define O_ACCMODE O_RDONLY|O_WRONLY|O_RDWR #endif MLTON_WRAPPER int MLton_chown (const char *path, uid_t owner, gid_t group); MLTON_WRAPPER int MLton_fchmod (int filedes, mode_t mode); MLTON_WRAPPER int MLton_fchdir (int filedes); MLTON_WRAPPER int MLton_fchown (int fd, uid_t owner, gid_t group); MLTON_WRAPPER long MLton_fpathconf (int filedes, int name); MLTON_WRAPPER int MLton_link (const char *oldpath, const char *newpath); MLTON_WRAPPER int MLton_lstat (const char *file_name, struct stat *buf); MLTON_WRAPPER int MLton_mkfifo (const char *pathname, mode_t mode); MLTON_WRAPPER long MLton_pathconf (const char *path, int name); MLTON_WRAPPER int MLton_readlink (const char *path, char *buf, size_t bufsiz); MLTON_WRAPPER int MLton_symlink (const char *oldpath, const char *newpath); MLTON_WRAPPER int MLton_truncate (const char *path, off_t len); #undef chown #undef fchmod #undef fchdir #undef fchown #undef fpathconf #undef link #undef lstat #undef mkfifo #undef pathconf #undef readlink #undef symlink #undef truncate #define chown MLton_chown #define fchmod MLton_fchmod #define fchdir MLton_fchdir #define fchown MLton_fchown #define fpathconf MLton_fpathconf #define link MLton_link #define lstat MLton_lstat #define mkfifo MLton_mkfifo #define pathconf MLton_pathconf #define readlink MLton_readlink #define symlink MLton_symlink #define truncate MLton_truncate #undef mkdir #define mkdir(f, m) mkdir(f); chmod(f, m) /* ------------------------------------------------- */ /* Posix.IO */ /* ------------------------------------------------- */ struct MLton_flock { off_t l_len; pid_t l_pid; off_t l_start; short l_type; short l_whence; }; #undef flock #define flock MLton_flock MLTON_WRAPPER int MLton_fcntl (int fd, int cmd, ...); MLTON_WRAPPER int MLton_fsync (int fd); MLTON_WRAPPER int MLton_pipe (int filedes[2]); #undef fcntl #undef fsync #undef pipe #define fcntl MLton_fcntl #define fsync MLton_fsync #define pipe MLton_pipe /* ------------------------------------------------- */ /* Posix.ProcEnv */ /* ------------------------------------------------- */ #ifndef _SC_ARG_MAX #define _SC_ARG_MAX 0 #endif #ifndef _SC_CHILD_MAX #define _SC_CHILD_MAX 1 #endif #ifndef _SC_CLK_TCK #define _SC_CLK_TCK 2 #endif #ifndef _SC_JOB_CONTROL #define _SC_JOB_CONTROL 5 #endif #ifndef _SC_NGROUPS_MAX #define _SC_NGROUPS_MAX 3 #endif #ifndef _SC_OPEN_MAX #define _SC_OPEN_MAX 4 #endif #ifndef _SC_SAVED_IDS #define _SC_SAVED_IDS 6 #endif #ifndef _SC_VERSION #define _SC_VERSION 7 #endif struct MLton_tms { int tms_utime; int tms_stime; int tms_cutime; int tms_cstime; }; struct MLton_utsname { char machine[20]; char nodename[256]; char release[20]; char sysname[30]; char version[20]; }; #undef tms #undef utsname #define tms MLton_tms #define utsname MLton_utsname MLTON_WRAPPER char *MLton_getlogin (void); MLTON_WRAPPER char *MLton_ctermid (char *s); MLTON_WRAPPER gid_t MLton_getegid (void); MLTON_WRAPPER uid_t MLton_geteuid (void); MLTON_WRAPPER gid_t MLton_getgid (void); MLTON_WRAPPER int MLton_getgroups (int size, gid_t list[]); MLTON_WRAPPER pid_t MLton_getpgid(pid_t pid); MLTON_WRAPPER pid_t MLton_getpgrp(void); MLTON_WRAPPER pid_t MLton_getppid (void); MLTON_WRAPPER uid_t MLton_getuid (void); MLTON_WRAPPER int MLton_setenv (const char *name, const char *value, int overwrite); MLTON_WRAPPER int MLton_setgid (gid_t gid); MLTON_WRAPPER int MLton_setgroups (size_t size, const gid_t *list); MLTON_WRAPPER int MLton_setpgid (pid_t pid, pid_t pgid); MLTON_WRAPPER pid_t MLton_setsid (void); MLTON_WRAPPER int MLton_setuid (uid_t uid); MLTON_WRAPPER long MLton_sysconf (int name); MLTON_WRAPPER clock_t MLton_times (struct tms *buf); MLTON_WRAPPER char *MLton_ttyname (int desc); MLTON_WRAPPER int MLton_uname (struct utsname *buf); #undef getlogin #undef ctermid #undef getegid #undef geteuid #undef getgid #undef getgroups #undef getpgid #undef getpgrp #undef getppid #undef getuid #undef setenv #undef setgid #undef setgroups #undef setpgid #undef setsid #undef setuid #undef sysconf #undef times #undef ttyname #undef uname #define getlogin MLton_getlogin #define ctermid MLton_ctermid #define getegid MLton_getegid #define geteuid MLton_geteuid #define getgid MLton_getgid #define getgroups MLton_getgroups #define getpgid MLton_getpgid #define getpgrp MLton_getpgrp #define getppid MLton_getppid #define getuid MLton_getuid #define setenv MLton_setenv #define setgid MLton_setgid #define setgroups MLton_setgroups #define setpgid MLton_setpgid #define setsid MLton_setsid #define setuid MLton_setuid #define sysconf MLton_sysconf #define times MLton_times #define ttyname MLton_ttyname #define uname MLton_uname /* ------------------------------------------------- */ /* Posix.Process */ /* ------------------------------------------------- */ #define EXECVE(path, args, env) \ execve (path, (const char* const*)args, (const char* const*)env) #define EXECVP(file, args) execvp (file, (const char* const*) args) #define SPAWN_MODE _P_NOWAIT /* Windows exit status comes from: * 1. ExitProcess (used by return from main and exit) * 2. TerminateProcess (used by a remote process to 'kill') * * Windows does NOT differentiate between these two cases. * The waitpid API expects us to be able to tell the difference, * so we will emulate this difference by setting high 31st bit * whenever we 'kill' a process. */ #ifndef WNOHANG #define WNOHANG 1 #endif #ifndef WUNTRACED #define WUNTRACED 2 #endif #define SIGNALLED_BIT 0x80000000UL #ifndef WIFEXITED #define WIFEXITED(w) (((w) & SIGNALLED_BIT) == 0) #endif #ifndef WIFSIGNALED #define WIFSIGNALED(w) (((w) & SIGNALLED_BIT) != 0) #endif #ifndef WIFSTOPPED #define WIFSTOPPED(w) 0 #endif #ifndef WEXITSTATUS #define WEXITSTATUS(w) ((w) & 0xff) #endif #ifndef WTERMSIG #define WTERMSIG(w) ((w) & 0xff) #endif #ifndef WSTOPSIG #define WSTOPSIG WEXITSTATUS #endif /* Sometimes defined by mingw */ #if !defined(TIMESPEC_DEFINED) && !defined(_TIMESPEC_DEFINED) struct timespec { time_t tv_sec; long tv_nsec; }; #endif MLTON_WRAPPER int MLton_alarm(int); MLTON_WRAPPER int MLton_fork(void); /* mingw demands this return int */ MLTON_WRAPPER int MLton_kill (pid_t pid, int sig); MLTON_WRAPPER int MLton_pause (void); MLTON_WRAPPER int MLton_nanosleep (const struct timespec *req, struct timespec *rem); MLTON_WRAPPER unsigned int MLton_sleep (unsigned int seconds); MLTON_WRAPPER pid_t MLton_wait (int *status); MLTON_WRAPPER pid_t MLton_waitpid (pid_t pid, int *status, int options); #undef alarm #undef fork #undef kill #undef pause #undef nanosleep #undef sleep #undef wait #undef waitpid #define alarm MLton_alarm #define fork MLton_fork #define kill MLton_kill #define pause MLton_pause #define nanosleep MLton_nanosleep #define sleep MLton_sleep #define wait MLton_wait #define waitpid MLton_waitpid /* ------------------------------------------------- */ /* Posix.Signal */ /* ------------------------------------------------- */ /* Sometimes mingw defines some of these. Some not. Some always. */ #ifndef SIG_BLOCK #define SIG_BLOCK 1 #endif #ifndef SIG_SETMASK #define SIG_SETMASK 0 #endif #ifndef SIG_UNBLOCK #define SIG_UNBLOCK 2 #endif #ifndef SIGHUP #define SIGHUP 1 #endif /* SIGINT = 2 */ #ifndef SIGQUIT #define SIGQUIT 3 #endif /* SIGILL = 4 */ /* SIGTRAP = 5 (unused) */ /* SIGIOT = 6 (unused) */ /* SIGABRT = 6 (unused) */ /* SIGEMT = 7 (unused) */ /* SIGFPE = 8 */ #ifndef SIGKILL #define SIGKILL 9 #endif #ifndef SIGBUS #define SIGBUS 10 #endif /* SIGSEGV = 11 */ /* SIGSYS = 12 (unused) */ #ifndef SIGPIPE #define SIGPIPE 13 #endif #ifndef SIGALRM #define SIGALRM 14 #endif /* SIGTERM = 15 */ /* SIGBREAK = 21 */ /* SIGABRT2 = 22 */ /* These signals are fake. They do not exist on windows. */ #ifndef SIGSTOP #define SIGSTOP 16 #endif #ifndef SIGTSTP #define SIGTSTP 18 #endif #ifndef SIGCHLD #define SIGCHLD 23 #endif #ifndef SIGTTIN #define SIGTTIN 24 #endif #ifndef SIGTTOU #define SIGTTOU 25 #endif #ifndef SIGCONT #define SIGCONT 26 #endif #ifndef SIGUSR1 #define SIGUSR1 27 #endif #ifndef SIGUSR2 #define SIGUSR2 28 #endif #ifndef SIGVTALRM #define SIGVTALRM 29 /* virtual time alarm */ #endif #ifndef SIGPROF #define SIGPROF 30 /* profiling time alarm */ #endif /* We have extended the number of signals ... */ #ifdef NSIG #undef NSIG #endif #define NSIG 32 typedef __p_sig_fn_t MLton__sig_func_ptr; typedef int MLton_sigset_t; #undef _sig_func_ptr #undef sigset_t #define _sig_func_ptr MLton__sig_func_ptr #define sigset_t MLton_sigset_t struct MLton_sigaction { int sa_flags; sigset_t sa_mask; _sig_func_ptr sa_handler; }; #undef sigaction #define sigaction MLton_sigaction #ifndef SIGTOMASK #define SIGTOMASK(sn) (1 << ((sn)-1)) #endif MLTON_WRAPPER int MLton_sigaction (int signum, const struct sigaction *act, struct sigaction *oldact); MLTON_WRAPPER int MLton_sigaddset (sigset_t *set, int signum); MLTON_WRAPPER int MLton_sigdelset (sigset_t *set, int signum); MLTON_WRAPPER int MLton_sigemptyset (sigset_t *set); MLTON_WRAPPER int MLton_sigfillset (sigset_t *set); MLTON_WRAPPER int MLton_sigismember (const sigset_t *set, int signum); MLTON_WRAPPER int MLton_sigpending (sigset_t *set); MLTON_WRAPPER int MLton_sigprocmask (int how, const sigset_t *set, sigset_t *oldset); MLTON_WRAPPER int MLton_sigsuspend (const sigset_t *mask); #undef sigaction #undef sigaddset #undef sigdelset #undef sigemptyset #undef sigfillset #undef sigismember #undef sigpending #undef sigprocmask #undef sigsuspend #define sigaction MLton_sigaction #define sigaddset MLton_sigaddset #define sigdelset MLton_sigdelset #define sigemptyset MLton_sigemptyset #define sigfillset MLton_sigfillset #define sigismember MLton_sigismember #define sigpending MLton_sigpending #define sigprocmask MLton_sigprocmask #define sigsuspend MLton_sigsuspend /* ------------------------------------------------- */ /* Posix.SysDB.Passwd */ /* ------------------------------------------------- */ struct MLton_group { gid_t gr_gid; char **gr_mem; char *gr_name; char *gr_passwd; }; struct MLton_passwd { char *pw_dir; gid_t pw_gid; char *pw_name; char *pw_shell; uid_t pw_uid; }; #undef group #undef passwd #define group MLton_group #define passwd MLton_passwd MLTON_WRAPPER struct group *MLton_getgrgid (gid_t gid); MLTON_WRAPPER struct group *MLton_getgrnam (const char *name); MLTON_WRAPPER struct passwd *MLton_getpwnam (const char *name); MLTON_WRAPPER struct passwd *MLton_getpwuid (uid_t uid); #undef getgrgid #undef getgrnam #undef getpwnam #undef getpwuid #define getgrgid MLton_getgrgid #define getgrnam MLton_getgrnam #define getpwnam MLton_getpwnam #define getpwuid MLton_getpwuid /* ------------------------------------------------- */ /* Posix.TTY */ /* ------------------------------------------------- */ #ifndef B0 #define B0 0x00000 #endif #ifndef B50 #define B50 0x00001 #endif #ifndef B75 #define B75 0x00002 #endif #ifndef B110 #define B110 0x00003 #endif #ifndef B134 #define B134 0x00004 #endif #ifndef B150 #define B150 0x00005 #endif #ifndef B200 #define B200 0x00006 #endif #ifndef B300 #define B300 0x00007 #endif #ifndef B600 #define B600 0x00008 #endif #ifndef B1200 #define B1200 0x00009 #endif #ifndef B1800 #define B1800 0x0000a #endif #ifndef B2400 #define B2400 0x0000b #endif #ifndef B4800 #define B4800 0x0000c #endif #ifndef B9600 #define B9600 0x0000d #endif #ifndef B19200 #define B19200 0x0000e #endif #ifndef B38400 #define B38400 0x0000f #endif #ifndef VEOL #define VEOL 2 #endif #ifndef VEOL2 #define VEOL2 3 #endif #ifndef VEOF #define VEOF 4 #endif #ifndef VERASE #define VERASE 5 #endif #ifndef VINTER #define VINTR 6 #endif #ifndef VKILL #define VKILL 7 #endif #ifndef VLNEXT #define VLNEXT 8 #endif #ifndef VMIN #define VMIN 9 #endif #ifndef VQUIT #define VQUIT 10 #endif #ifndef VREPRINT #define VREPRINT 11 #endif #ifndef VSTART #define VSTART 12 #endif #ifndef VSTOP #define VSTOP 13 #endif #ifndef VSUSP #define VSUSP 14 #endif #ifndef VSWTC #define VSWTC 15 #endif #ifndef VTIME #define VTIME 16 #endif #ifndef VWERASE #define VWERASE 17 #endif #ifndef NCCS #define NCCS 18 #endif #ifndef IGNBRK #define IGNBRK 0x00001 #endif #ifndef BRKINT #define BRKINT 0x00002 #endif #ifndef IGNPAR #define IGNPAR 0x00004 #endif #ifndef IMAXBEL #define IMAXBEL 0x00008 #endif #ifndef INPCK #define INPCK 0x00010 #endif #ifndef ISTRIP #define ISTRIP 0x00020 #endif #ifndef INLCR #define INLCR 0x00040 #endif #ifndef IGNCR #define IGNCR 0x00080 #endif #ifndef ICRNL #define ICRNL 0x00100 #endif #ifndef IXON #define IXON 0x00400 #endif #ifndef IXOFF #define IXOFF 0x01000 #endif #ifndef IUCLC #define IUCLC 0x04000 #endif #ifndef IXANY #define IXANY 0x08000 #endif #ifndef PARMRK #define PARMRK 0x10000 #endif #ifndef OPOST #define OPOST 0x00001 #endif #ifndef CSIZE #define CSIZE 0x00030 #endif #ifndef CS5 #define CS5 0x00000 #endif #ifndef CS6 #define CS6 0x00010 #endif #ifndef CS7 #define CS7 0x00020 #endif #ifndef CS8 #define CS8 0x00030 #endif #ifndef CSTOPB #define CSTOPB 0x00040 #endif #ifndef CREAD #define CREAD 0x00080 #endif #ifndef PARENB #define PARENB 0x00100 #endif #ifndef PARODD #define PARODD 0x00200 #endif #ifndef HPUCL #define HUPCL 0x00400 #endif #ifndef CLOCAL #define CLOCAL 0x00800 #endif #ifndef CBAUDEX #define CBAUDEX 0x0100f #endif #ifndef B57600 #define B57600 0x01001 #endif #ifndef B115200 #define B115200 0x01002 #endif #ifndef B128000 #define B128000 0x01003 #endif #ifndef B230400 #define B230400 0x01004 #endif #ifndef B256000 #define B256000 0x01005 #endif #ifndef CRTSXOFF #define CRTSXOFF 0x04000 #endif #ifndef CRTSCTS #define CRTSCTS 0x08000 #endif #ifndef ISIG #define ISIG 0x0001 #endif #ifndef ICANON #define ICANON 0x0002 #endif #ifndef ECHO #define ECHO 0x0004 #endif #ifndef ECHOE #define ECHOE 0x0008 #endif #ifndef ECHOK #define ECHOK 0x0010 #endif #ifndef ECHONL #define ECHONL 0x0020 #endif #ifndef NOFLSH #define NOFLSH 0x0040 #endif #ifndef TOSTOP #define TOSTOP 0x0080 #endif #ifndef IEXTEN #define IEXTEN 0x0100 #endif #ifndef FLUSHO #define FLUSHO 0x0200 #endif #ifndef ECHOKE #define ECHOKE 0x0400 #endif #ifndef ECHOCTL #define ECHOCTL 0x0800 #endif #ifndef TCOOFF #define TCOOFF 0 #endif #ifndef TCOON #define TCOON 1 #endif #ifndef TCIOFF #define TCIOFF 2 #endif #ifndef TCION #define TCION 3 #endif #ifndef TCIFLUSH #define TCIFLUSH 0 #endif #ifndef TCOFLUSH #define TCOFLUSH 1 #endif #ifndef TCIOFLUSH #define TCIOFLUSH 2 #endif #ifndef TCFLSH #define TCFLSH 3 #endif #ifndef TCSAFLUSH #define TCSAFLUSH 1 #endif #ifndef TCSANOW #define TCSANOW 2 #endif #ifndef TCSADRAIN #define TCSADRAIN 3 #endif #ifndef TCSADFLUSH #define TCSADFLUSH 4 #endif typedef unsigned char MLton_cc_t; typedef unsigned int MLton_speed_t; typedef unsigned int MLton_tcflag_t; #undef cc_t #undef speed_t #undef tcflag_t #define cc_t MLton_cc_t #define speed_t MLton_speed_t #define tcflag_t MLton_tcflag_t struct MLton_termios { cc_t c_cc[NCCS]; tcflag_t c_cflag; tcflag_t c_iflag; tcflag_t c_lflag; tcflag_t c_oflag; }; #undef termios #define termios MLton_termios MLTON_WRAPPER speed_t MLton_cfgetispeed (struct termios *termios_p); MLTON_WRAPPER speed_t MLton_cfgetospeed (struct termios *termios_p); MLTON_WRAPPER int MLton_cfsetispeed (struct termios *termios_p, speed_t speed); MLTON_WRAPPER int MLton_cfsetospeed (struct termios *termios_p, speed_t speed); MLTON_WRAPPER int MLton_tcdrain (int fd); MLTON_WRAPPER int MLton_tcflow (int fd, int action); MLTON_WRAPPER int MLton_tcflush (int fd, int queue_selector); MLTON_WRAPPER int MLton_tcgetattr (int fd, struct termios *termios_p); MLTON_WRAPPER pid_t MLton_tcgetpgrp (int fd); MLTON_WRAPPER int MLton_tcsendbreak (int fd, int duration); MLTON_WRAPPER int MLton_tcsetattr (int fd, int optional_actions, struct termios *termios_p); MLTON_WRAPPER int MLton_tcsetpgrp (int fd, pid_t pgrpid); #undef cfgetispeed #undef cfgetospeed #undef cfsetispeed #undef cfsetospeed #undef tcdrain #undef tcflow #undef tcflush #undef tcgetattr #undef tcgetpgrp #undef tcsendbreak #undef tcsetattr #undef tcsetpgrp #define cfgetispeed MLton_cfgetispeed #define cfgetospeed MLton_cfgetospeed #define cfsetispeed MLton_cfsetispeed #define cfsetospeed MLton_cfsetospeed #define tcdrain MLton_tcdrain #define tcflow MLton_tcflow #define tcflush MLton_tcflush #define tcgetattr MLton_tcgetattr #define tcgetpgrp MLton_tcgetpgrp #define tcsendbreak MLton_tcsendbreak #define tcsetattr MLton_tcsetattr #define tcsetpgrp MLton_tcsetpgrp /* ------------------------------------------------- */ /* Socket */ /* ------------------------------------------------- */ // Unimplemented on windows: #ifndef MSG_WAITALL #define MSG_WAITALL 0x8 #endif #ifndef MSG_DONTWAIT #define MSG_DONTWAIT 0x1000000 #endif #ifndef MSG_EOR #define MSG_EOR 0 #endif #ifndef MSG_CTRUNC #define MSG_CTRUNC 0 #endif #ifndef MSG_TRUNC #define MSG_TRUNC MSG_PARTIAL #endif #ifndef UNIX_PATH_MAX #define UNIX_PATH_MAX 108 #endif typedef unsigned short MLton_sa_family_t; #undef sa_family_t #define sa_family_t MLton_sa_family_t struct MLton_sockaddr_un { sa_family_t sun_family; char sun_path[UNIX_PATH_MAX]; }; #undef sockaddr_un #define sockaddr_un MLton_sockaddr_un MLTON_WRAPPER int MLton_ioctl (int d, int request, ...); MLTON_WRAPPER int MLton_socketpair (int d, int type, int protocol, int sv[2]); #undef ioctl #undef socketpair #define ioctl MLton_ioctl #define socketpair MLton_socketpair /* ------------------------------------------------- */ /* Syslog */ /* ------------------------------------------------- */ #ifndef LOG_EMERG #define LOG_EMERG 7 #endif #ifndef LOG_ALERT #define LOG_ALERT 6 #endif #ifndef LOG_CRIT #define LOG_CRIT 5 #endif #ifndef LOG_ERR #define LOG_ERR 4 #endif #ifndef LOG_WARNING #define LOG_WARNING 3 #endif #ifndef LOG_NOTICE #define LOG_NOTICE 2 #endif #ifndef LOG_INFO #define LOG_INFO 1 #endif #ifndef LOG_DEBUG #define LOG_DEBUG 0 #endif #ifndef LOG_PID #define LOG_PID 0x01 /* include PID in output */ #endif #ifndef LOG_CONS #define LOG_CONS 0x02 /* dump to console (meaningless for windows?) */ #endif #ifndef LOG_ODELAY #define LOG_ODELAY 0x04 /* delay open; meaningless---always open */ #endif #ifndef LOG_NDELAY #define LOG_NDELAY 0x08 /* don't delay; meaningless */ #endif #ifndef LOG_NOWAIT #define LOG_NOWAIT 0x10 /* ignored and obsolete anyways */ #endif #ifndef LOG_PERROR #define LOG_PERROR 0x20 /* print to standard error, honoured */ #endif #ifndef LOG_AUTH #define LOG_AUTH 1 #endif #ifndef LOG_CRON #define LOG_CRON 2 #endif #ifndef LOG_DAEMON #define LOG_DAEMON 3 #endif #ifndef LOG_KERN #define LOG_KERN 4 #endif #ifndef LOG_LOCAL0 #define LOG_LOCAL0 5 #endif #ifndef LOG_LOCAL1 #define LOG_LOCAL1 6 #endif #ifndef LOG_LOCAL2 #define LOG_LOCAL2 7 #endif #ifndef LOG_LOCAL3 #define LOG_LOCAL3 8 #endif #ifndef LOG_LOCAL4 #define LOG_LOCAL4 9 #endif #ifndef LOG_LOCAL5 #define LOG_LOCAL5 10 #endif #ifndef LOG_LOCAL6 #define LOG_LOCAL6 11 #endif #ifndef LOG_LOCAL7 #define LOG_LOCAL7 12 #endif #ifndef LOG_LPR #define LOG_LPR 13 #endif #ifndef LOG_MAIL #define LOG_MAIL 14 #endif #ifndef LOG_NEWS #define LOG_NEWS 15 #endif #ifndef LOG_SYSLOG #define LOG_SYSLOG 16 #endif #ifndef LOG_USER #define LOG_USER 17 #endif #ifndef LOG_UUCP #define LOG_UUCP 18 #endif MLTON_WRAPPER void MLton_openlog(const char* ident, int logopt, int facility); MLTON_WRAPPER void MLton_closelog(void); MLTON_WRAPPER void MLton_syslog(int priority, const char* fmt, const char* msg); #undef openlog #undef closelog #undef syslog #define openlog MLton_openlog #define closelog MLton_closelog #define syslog MLton_syslog mlton-20100608/runtime/platform/mips.h0000644000076600000240000000005011404435622016203 0ustar mtfstaff#define MLton_Platform_Arch_host "mips" mlton-20100608/runtime/platform/mmap-protect.c0000644000076600000240000000126011404435622017642 0ustar mtfstaffvoid *GC_mmapAnon_safe_protect (void *start, size_t length, size_t dead_low, size_t dead_high) { void *base,*low,*result,*high; base = GC_mmapAnon_safe (start, length + dead_low + dead_high); low = base; if (mprotect (low, dead_low, PROT_NONE)) diee ("mprotect failed"); result = (void*)((pointer)low + dead_low); if (mprotect (result, length, PROT_READ | PROT_WRITE | PROT_EXEC)) diee ("mprotect failed"); high = (void*)((pointer)result + length); if (mprotect (high, dead_high, PROT_NONE)) diee ("mprotect failed"); return result; } mlton-20100608/runtime/platform/mmap.c0000644000076600000240000000112511404435622016164 0ustar mtfstaffstatic inline void *mmapAnon (void *start, size_t length) { return mmap (start, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); } static void munmap_safe (void *base, size_t length) { if (DEBUG_MEM) fprintf (stderr, "munmap_safe ("FMTPTR", %s)\n", (uintptr_t)base, uintmaxToCommaString (length)); assert (base != NULL); if (0 == length) return; if (0 != munmap (base, length)) diee ("munmap failed"); } mlton-20100608/runtime/platform/mremap.c0000644000076600000240000001045511404435622016521 0ustar mtfstaff#define GC_SMALLEST_PAGESIZE 4096 /* #define DEBUG_MREMAP 1 */ /* Used to allocate at the head and tail of an existing allocation */ static void *GC_extendHead (void *base, size_t length); static void *GC_extendTail (void *base, size_t length); void *GC_mremap (void *base, size_t oldLength, size_t newLength) { static void* cacheAddress = 0; static size_t cacheOldLength = 0; static size_t cacheNewLength = 0; static size_t cacheTailSize; static size_t cacheHeadSize; void* tail; void* head; void* alloc; size_t growth, bsLow, bsHigh, bsTry; #ifdef DEBUG_MREMAP fprintf(stderr, "remap(%08X, %d, %d)\n", (size_t)base, oldLength, newLength); fflush(stderr); #endif if (newLength == oldLength) return base; if (newLength < oldLength) { GC_release((char*)base + newLength, oldLength-newLength); return base; } growth = newLength-oldLength; if (cacheAddress == base && cacheOldLength == oldLength && cacheNewLength > newLength) /* cache only during backoff */ goto GC_mremap_cached; /* Start probing for the available tail length */ bsLow = 0; bsHigh = (growth+GC_SMALLEST_PAGESIZE-1)/GC_SMALLEST_PAGESIZE; /* Round bsHigh to a power of two -> allocation works with all page sizes */ for (bsTry = 1; bsTry <= bsHigh; bsTry += bsTry) { } bsHigh = bsTry; while (bsHigh - bsLow > 1) { bsTry = (bsHigh + bsLow)/2; tail = (char*)base + oldLength; alloc = GC_extendTail(tail, bsTry*GC_SMALLEST_PAGESIZE); if (tail == alloc) { GC_release(alloc, bsTry*GC_SMALLEST_PAGESIZE); bsLow = bsTry; } else { if (alloc != (void*)-1) GC_release(alloc, bsTry*GC_SMALLEST_PAGESIZE); bsHigh = bsTry; } } cacheTailSize = bsLow*GC_SMALLEST_PAGESIZE; /* Start probing for the available head length */ bsLow = 0; bsHigh = (growth+GC_SMALLEST_PAGESIZE-1)/GC_SMALLEST_PAGESIZE; /* Round bsHigh to a power of two -> allocation works with all page sizes */ for (bsTry = 1; bsTry <= bsHigh; bsTry += bsTry) { } bsHigh = bsTry; while (bsHigh - bsLow > 1) { bsTry = (bsHigh + bsLow)/2; head = (char*)base - bsTry*GC_SMALLEST_PAGESIZE; alloc = GC_extendHead(head, bsTry*GC_SMALLEST_PAGESIZE); if (head == alloc) { GC_release(alloc, bsTry*GC_SMALLEST_PAGESIZE); bsLow = bsTry; } else { if (alloc != (void*)-1) GC_release(alloc, bsTry*GC_SMALLEST_PAGESIZE); bsHigh = bsTry; } } cacheHeadSize = bsLow*GC_SMALLEST_PAGESIZE; #ifdef DEBUG_MREMAP fprintf(stderr, "Expansion detects: %10d/%10d/%10d = %10d\n", cacheHeadSize, oldLength, cacheTailSize, cacheHeadSize+ oldLength+ cacheTailSize); fflush(stderr); #endif cacheAddress = base; cacheOldLength = oldLength; GC_mremap_cached: cacheNewLength = newLength; /* Is there enough free space? */ if (cacheTailSize + cacheHeadSize < growth) { /* No, there's not. Try to move it instead. */ alloc = GC_mmapAnon(0, newLength); if (alloc != (void*)-1) { memcpy(alloc, base, oldLength); GC_release(base, oldLength); return alloc; } /* Failed even to move it */ return (void*)-1; } #ifdef DEBUG_MREMAP fprintf(stderr, "Expansion attempts %d bytes\n", newLength); fflush(stderr); #endif if (growth <= cacheTailSize) { tail = (char*)base + oldLength; alloc = GC_extendTail(tail, growth); if (alloc != tail) { /* This shouldn't happen; we tested for the memory! */ if (alloc != (void*)-1) GC_release(alloc, growth); return (void*)-1; } return base; } if (cacheTailSize > 0) { tail = (char*)base + oldLength; alloc = GC_extendTail(tail, cacheTailSize); if (alloc != tail) { /* This shouldn't happen; we tested for the memory! */ if (alloc != (void*)-1) GC_release(alloc, cacheTailSize); return (void*)-1; } } else { tail = 0; /* quell warning */ } head = (char*)base - (growth-cacheTailSize); alloc = GC_extendHead(head, growth-cacheTailSize); if (alloc != head) { /* This shouldn't happen; we tested for the memory! */ if (alloc != (void*)-1) GC_release(alloc, growth-cacheTailSize); if (cacheTailSize > 0) GC_release(tail, cacheTailSize); return (void*)-1; } memmove(head, base, oldLength); return head; } mlton-20100608/runtime/platform/netbsd.c0000644000076600000240000000116211404435622016512 0ustar mtfstaff#include "platform.h" #include "diskBack.unix.c" #include "displayMem.proc.c" #include "mmap-protect.c" #include "nonwin.c" #include "sysctl.c" #include "use-mmap.c" static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.__gregs[_REG_EIP]); } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20100608/runtime/platform/netbsd.h0000644000076600000240000000155311404435622016523 0ustar mtfstaff#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define HAS_FEROUND FALSE #define HAS_FPCLASSIFY TRUE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT TRUE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "netbsd" extern char **environ; /* for Posix_ProcEnv_environ */ mlton-20100608/runtime/platform/nonwin.c0000644000076600000240000000067611404435622016554 0ustar mtfstaff/* ------------------------------------------------- */ /* Posix */ /* ------------------------------------------------- */ __attribute__ ((noreturn)) void Posix_IO_setbin (__attribute__ ((unused)) C_Fd_t fd) { die("Posix_IO_setbin not implemented"); } __attribute__ ((noreturn)) void Posix_IO_settext (__attribute__ ((unused)) C_Fd_t fd) { die("Posix_IO_settext not implemented"); } mlton-20100608/runtime/platform/openbsd.c0000644000076600000240000000115011404435622016662 0ustar mtfstaff#include "platform.h" #include "diskBack.unix.c" #include "displayMem.proc.c" #include "mmap-protect.c" #include "nonwin.c" #include "sysctl.c" #include "use-mmap.c" static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->sc_eip); } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } mlton-20100608/runtime/platform/openbsd.h0000644000076600000240000000333611404435622016677 0ustar mtfstaff#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* might not #include */ #include #include #include #include #include #include #include #define HAS_FEROUND FALSE #define HAS_FPCLASSIFY FALSE #define HAS_FPCLASSIFY32 FALSE #define HAS_FPCLASSIFY64 FALSE #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "openbsd" int fpclassify32 (float f); int fpclassify64 (double d); /* #ifndef PRIu8 */ /* #define PRIu8 "hhu" */ /* #endif */ /* #ifndef PRIu16 */ /* #define PRIu16 "hu" */ /* #endif */ /* #ifndef PRIx16 */ /* #define PRIx16 "hx" */ /* #endif */ /* #ifndef PRId32 */ /* #define PRId32 "d" */ /* #endif */ /* #ifndef PRIu32 */ /* #define PRIu32 "u" */ /* #endif */ /* #ifndef PRIx32 */ /* #define PRIx32 "x" */ /* #endif */ /* typedef long long int intmax_t; */ /* #ifndef INTMAX_MIN */ /* #define INTMAX_MIN LLONG_MIN */ /* #endif */ /* typedef unsigned long long int uintmax_t; */ /* #ifndef PRIuMAX */ /* #define PRIuMAX "llu" */ /* #endif */ /* #ifndef PRIxMAX */ /* #define PRIxMAX "llx" */ /* #endif */ /* #ifndef PRIxPTR */ /* #define PRIxPTR "lx" */ /* #endif */ extern char **environ; /* for Posix_ProcEnv_environ */ mlton-20100608/runtime/platform/powerpc.h0000644000076600000240000000005311404435622016715 0ustar mtfstaff#define MLton_Platform_Arch_host "powerpc" mlton-20100608/runtime/platform/powerpc64.h0000644000076600000240000000005511404435622017071 0ustar mtfstaff#define MLton_Platform_Arch_host "powerpc64" mlton-20100608/runtime/platform/recv.nonblock.c0000644000076600000240000000206411404435622020000 0ustar mtfstaff/* Simulates MSG_DONTWAIT using fcntl() and O_NONBLOCK. */ static void fd_modify(int fd, int flags, int add, int shouldRemove) { int status; if (flags & MSG_DONTWAIT) { status = errno; int f = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, (f | add) & ~shouldRemove); errno = status; } } static void set_nonblock(int fd, int flags) { fd_modify(fd, flags, O_NONBLOCK, 0); } static void clear_nonblock(int fd, int flags) { fd_modify(fd, flags, 0, O_NONBLOCK); } int MLton_recv(int s, void *buf, int len, int flags) { int ret; set_nonblock(s, flags); ret = recv(s, buf, len, flags & ~MSG_DONTWAIT); clear_nonblock(s, flags); return ret; } int MLton_recvfrom(int s, void *buf, int len, int flags, void *from, socklen_t *fromlen) { int ret; set_nonblock(s, flags); ret = recvfrom(s, buf, len, flags & ~MSG_DONTWAIT, from, fromlen); clear_nonblock(s, flags); return ret; } mlton-20100608/runtime/platform/s390.h0000644000076600000240000000005011404435622015731 0ustar mtfstaff#define MLton_Platform_Arch_host "s390" mlton-20100608/runtime/platform/setenv.h0000644000076600000240000000010111404435622016534 0ustar mtfstaffint setenv (const char *name, const char *value, int overwrite); mlton-20100608/runtime/platform/setenv.putenv.c0000644000076600000240000000077411404435622020067 0ustar mtfstaff/* This implementation of setenv has a space leak, but I don't see how to avoid * it, since the specification of putenv is that it uses the memory for its arg. */ int setenv (const char *name, const char *value, int overwrite) { size_t len; char *b; if (!overwrite && getenv (name)) return 0; len = strlen (name) + strlen (value) + 2 /* = and \000 */; b = malloc (len); snprintf (b, len, "%s=%s", name, value); return putenv (b); } mlton-20100608/runtime/platform/solaris.c0000644000076600000240000000526011404435622016712 0ustar mtfstaff#include "platform.h" #include #include "diskBack.unix.c" #include "float-math.c" #include "mmap.c" #include "mmap-protect.c" #include "nonwin.c" #include "sysconf.c" #include "setenv.putenv.c" #ifdef __sparc__ int fegetround (void) { int mode; mode = fpgetround (); switch (mode) { case FP_RN: mode = 0; break; case FP_RM: mode = 1; break; case FP_RP: mode = 2; break; case FP_RZ: mode = 3; break; default: die ("fegetround: invalid mode %d\n", mode); } return mode; } int fesetround (int mode) { switch (mode) { case 0: mode = FP_RN; break; case 1: mode = FP_RM; break; case 2: mode = FP_RP; break; case 3: mode = FP_RZ; break; default: die ("fesetround: invalid mode %d\n", mode); } fpsetround (mode); return 0; } #endif /* __sparc__ */ int fpclassify64 (double d) { fpclass_t c; c = fpclass (d); switch (c) { case FP_SNAN: case FP_QNAN: return FP_NAN; case FP_NINF: case FP_PINF: return FP_INFINITE; case FP_NDENORM: case FP_PDENORM: return FP_SUBNORMAL; case FP_NZERO: case FP_PZERO: return FP_ZERO; case FP_NNORM: case FP_PNORM: return FP_NORMAL; default: die ("Real_class error: invalid class %d\n", c); } } /* ------------------------------------------------- */ /* GC */ /* ------------------------------------------------- */ void GC_displayMem (void) { static char buffer[256]; snprintf (buffer, cardof(buffer), "pmap %d\n", (int)(getpid ())); system (buffer); } static void catcher (__attribute__ ((unused)) int signo, __attribute__ ((unused)) siginfo_t* info, void* context) { ucontext_t* ucp = (ucontext_t*)context; GC_handleSigProf ((code_pointer) ucp->uc_mcontext.gregs[REG_PC]); } void GC_setSigProfHandler (struct sigaction *sa) { sa->sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa->sa_sigaction = (void (*)(int, siginfo_t*, void*))catcher; } /* On Solaris 5.7, MAP_ANON causes EINVAL and mmap requires a file descriptor. */ void *GC_mmapAnon (void *start, size_t length) { static int fd = -1; if (-1 == fd) fd = open ("/dev/zero", O_RDONLY); return mmap (start, length, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); } void GC_release (void *base, size_t length) { munmap_safe (base, length); } mlton-20100608/runtime/platform/solaris.h0000644000076600000240000000512711404435622016721 0ustar mtfstaff#include #include #include #include #include #include #include #include #include #include #include #include #include /* For FIONBIO, FIONREAD. */ #include #include /* This is defined in , bet we'll redefine it in export.h. */ #undef PRIVATE #include #include #include #include #include /* For SIOCATMARK. */ #include #include #include #include #include #include #include #include #include #include #include #ifdef __sparc__ #include "float-math.h" #include "setenv.h" #endif #define HAS_MSG_DONTWAIT TRUE #define HAS_REMAP FALSE #define HAS_SIGALTSTACK TRUE #define HAS_SIGNBIT FALSE #define HAS_SPAWN FALSE #define HAS_TIME_PROFILING TRUE #define MLton_Platform_OS_host "solaris" #ifndef PRIxPTR #define PRIxPTR "x" #endif /* Solaris 8 and older do not define a value for UINTPTR_MAX, so we redefine it with a value. */ #ifdef UINTPTR_MAX #undef UINTPTR_MAX #if defined(_LP64) || defined(_I32LPx) #define UINTPTR_MAX UINT64_MAX #else #define UINTPTR_MAX UINT32_MAX #endif #endif /* ------------------------------------------------- */ /* Posix.ProcEnv */ /* ------------------------------------------------- */ extern char **environ; /* ------------------------------------------------- */ /* MLton.Syslog */ /* ------------------------------------------------- */ #define LOG_AUTHPRIV LOG_AUTH #define LOG_PERROR 0 /* ------------------------------------------------- */ /* Real */ /* ------------------------------------------------- */ #ifdef __sparc__ #undef fegetround #undef fesetround #define fegetround MLton_fegetround #define fesetround MLton_fesetround int fegetround(void); int fesetround(int rounding_mode); #endif #undef fpclassify64 #define fpclassify64 MLton_fpclassify64 int fpclassify64 (double d); #define FE_TONEAREST 0 #define FE_DOWNWARD 1 #define FE_UPWARD 2 #define FE_TOWARDZERO 3 #define HAS_FEROUND TRUE #define HAS_FPCLASSIFY FALSE #define HAS_FPCLASSIFY32 FALSE #define HAS_FPCLASSIFY64 TRUE /* These are not predefined on Solaris 8. */ #ifndef NAN #define NAN (__builtin_nanf ("")) #endif #ifndef INFINITY #define INFINITY (__builtin_inff()) #endif mlton-20100608/runtime/platform/sparc.h0000644000076600000240000000005111404435622016344 0ustar mtfstaff#define MLton_Platform_Arch_host "sparc" mlton-20100608/runtime/platform/sysconf.c0000644000076600000240000000113311404435622016715 0ustar mtfstaffsize_t GC_pageSize (void) { long int pageSize; pageSize = sysconf (_SC_PAGESIZE); if (pageSize < 0) diee ("GC_pageSize error: sysconf (_SC_PAGESIZE) failed"); return (size_t)pageSize; } uintmax_t GC_physMem (void) { size_t pageSize = GC_pageSize (); long int physPages; uintmax_t physMem; physPages = sysconf (_SC_PHYS_PAGES); if (physPages < 0) diee ("GC_physMem error: sysconf (_SC_PHYS_PAGES) failed"); physMem = (uintmax_t)pageSize * (uintmax_t)physPages; return physMem; } mlton-20100608/runtime/platform/sysctl.c0000644000076600000240000000335611404435622016563 0ustar mtfstaffsize_t GC_pageSize (void) { size_t len; int mib[2]; len = 0; mib[0] = CTL_HW; mib[1] = HW_PAGESIZE; if (-1 == sysctl (mib, 2, NULL, &len, NULL, 0)) diee ("sysctl failed"); if (len == sizeof(unsigned long long int)) { unsigned long long int pageSize; if (-1 == sysctl (mib, 2, &pageSize, &len, NULL, 0)) diee ("sysctl failed"); return (size_t)pageSize; } else if (len == sizeof(unsigned long int)) { unsigned long int pageSize; if (-1 == sysctl (mib, 2, &pageSize, &len, NULL, 0)) diee ("sysctl failed"); return (size_t)pageSize; } else if (len == sizeof(unsigned int)) { unsigned int pageSize; if (-1 == sysctl (mib, 2, &pageSize, &len, NULL, 0)) diee ("sysctl failed"); return (size_t)pageSize; } else { die ("GC_pageSize"); } } uintmax_t GC_physMem (void) { size_t len; int mib[2]; len = 0; mib[0] = CTL_HW; #if defined(HW_MEMSIZE) /* Darwin */ mib[1] = HW_MEMSIZE; #elif defined(HW_PHYSMEM64) /* NetBSD */ mib[1] = HW_PHYSMEM64; #else mib[1] = HW_PHYSMEM; #endif if (-1 == sysctl (mib, 2, NULL, &len, NULL, 0)) diee ("sysctl failed"); if (len == sizeof(unsigned long long int)) { unsigned long long int physMem; if (-1 == sysctl (mib, 2, &physMem, &len, NULL, 0)) diee ("sysctl failed"); return (uintmax_t)physMem; } else if (len == sizeof(unsigned long int)) { unsigned long int physMem; if (-1 == sysctl (mib, 2, &physMem, &len, NULL, 0)) diee ("sysctl failed"); return (uintmax_t)physMem; } else if (len == sizeof(unsigned int)) { unsigned int physMem; if (-1 == sysctl (mib, 2, &physMem, &len, NULL, 0)) diee ("sysctl failed"); return (uintmax_t)physMem; } else { die ("GC_physMem"); } } mlton-20100608/runtime/platform/use-mmap.c0000644000076600000240000000030411404435622016754 0ustar mtfstaff#include "mmap.c" void GC_release (void *base, size_t length) { munmap_safe (base, length); } void *GC_mmapAnon (void *start, size_t length) { return mmapAnon (start, length); } mlton-20100608/runtime/platform/windows.c0000644000076600000240000004003011404435622016722 0ustar mtfstaffHANDLE fileDesHandle (int fd); #define BUFSIZE 512 static HANDLE tempFileDes (void) { /* Based on http://msdn.microsoft.com/en-us/library/aa363875(VS.85).aspx */ HANDLE hTempFile; DWORD dwRetVal; DWORD dwBufSize=BUFSIZE; UINT uRetVal; TCHAR szTempName[BUFSIZE]; TCHAR lpPathBuffer[BUFSIZE]; dwRetVal = GetTempPath(dwBufSize, lpPathBuffer); if (dwRetVal > dwBufSize || (dwRetVal == 0)) die ("GetTempPath(%ld,...) failed with error %ld\n", dwBufSize, GetLastError()); uRetVal = GetTempFileName(lpPathBuffer, TEXT("MLtonTempFile"), 0, szTempName); if (uRetVal == 0) die ("GetTempFileName(\"%s\",...) failed with error %ld\n", lpPathBuffer, GetLastError()); hTempFile = CreateFile((LPTSTR) szTempName, GENERIC_READ | GENERIC_WRITE, 0, NULL, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL); if (hTempFile == INVALID_HANDLE_VALUE) die ("CreateFile(\"%s\",...) failed with error %ld\n", szTempName, GetLastError()); return hTempFile; } typedef struct { HANDLE handle; } *WriteToDiskData; void GC_diskBack_read (void *data, pointer buf, size_t size) { HANDLE h; DWORD d; DWORD dwBytesRead; h = ((WriteToDiskData)data)->handle; d = SetFilePointer (h, 0, NULL, FILE_BEGIN); if (d == INVALID_SET_FILE_POINTER) die ("SetFilePointer failed with error %ld\n", GetLastError()); unless (ReadFile(h, buf, size, &dwBytesRead, NULL)) die ("ReadFile failed with error %ld\n", GetLastError()); } void GC_diskBack_close (void *data) { HANDLE h; h = ((WriteToDiskData)data)->handle; unless (CloseHandle (h)) die ("CloseHandle failed with error %ld.", GetLastError()); free (data); } void *GC_diskBack_write (pointer buf, size_t size) { HANDLE h; WriteToDiskData d; DWORD dwBytesWritten; h = tempFileDes (); unless (WriteFile (h, buf, size, &dwBytesWritten, NULL)) die ("WriteFile failed with error %ld\n", GetLastError()); d = (WriteToDiskData)(malloc_safe (sizeof(*d))); d->handle = h; return d; } static void displayMaps (void) { MEMORY_BASIC_INFORMATION buf; const char *state = ""; const char *protect = ""; uintptr_t address; buf.RegionSize = 0; for (address = 0; address + buf.RegionSize >= address; address += buf.RegionSize) { if (0 == VirtualQuery ((LPCVOID)address, &buf, sizeof (buf))) break; if (0 == buf.RegionSize) break; switch (buf.Protect) { case PAGE_READONLY: protect = "PAGE_READONLY"; break; case PAGE_READWRITE: protect = "PAGE_READWRITE"; break; case PAGE_WRITECOPY: protect = "PAGE_WRITECOPY"; break; case PAGE_EXECUTE: protect = "PAGE_EXECUTE"; break; case PAGE_EXECUTE_READ: protect = "PAGE_EXECUTE_READ"; break; case PAGE_EXECUTE_READWRITE: protect = "PAGE_EXECUTE_READWRITE"; break; case PAGE_EXECUTE_WRITECOPY: protect = "PAGE_EXECUTE_WRITECOPY"; break; case PAGE_GUARD: protect = "PAGE_GUARD"; break; case PAGE_NOACCESS: protect = "PAGE_NOACCESS"; break; case PAGE_NOCACHE: protect = "PAGE_NOCACHE"; break; default: assert (FALSE); } switch (buf.State) { case MEM_COMMIT: state = "MEM_COMMIT"; break; case MEM_FREE: state = "MEM_FREE"; break; case MEM_RESERVE: state = "MEM_RESERVE"; break; default: assert (FALSE); } fprintf(stderr, FMTPTR " %10"PRIuMAX" %s %s\n", (uintptr_t)buf.BaseAddress, (uintmax_t)buf.RegionSize, state, protect); } } void GC_displayMem (void) { #ifdef _WIN64 MEMORYSTATUSEX ms; ms.dwLength = sizeof (MEMORYSTATUSEX); GlobalMemoryStatusEx (&ms); fprintf(stderr, "Total Phys. Mem: %"PRIuMAX"\n" "Avail Phys. Mem: %"PRIuMAX"\n" "Total Page File: %"PRIuMAX"\n" "Avail Page File: %"PRIuMAX"\n" "Total Virtual: %"PRIuMAX"\n" "Avail Virtual: %"PRIuMAX"\n", (uintmax_t)ms.ullTotalPhys, (uintmax_t)ms.ullAvailPhys, (uintmax_t)ms.ullTotalPageFile, (uintmax_t)ms.ullAvailPageFile, (uintmax_t)ms.ullTotalVirtual, (uintmax_t)ms.ullAvailVirtual); #else MEMORYSTATUS ms; ms.dwLength = sizeof (MEMORYSTATUS); GlobalMemoryStatus (&ms); fprintf(stderr, "Total Phys. Mem: %"PRIuMAX"\n" "Avail Phys. Mem: %"PRIuMAX"\n" "Total Page File: %"PRIuMAX"\n" "Avail Page File: %"PRIuMAX"\n" "Total Virtual: %"PRIuMAX"\n" "Avail Virtual: %"PRIuMAX"\n", (uintmax_t)ms.dwTotalPhys, (uintmax_t)ms.dwAvailPhys, (uintmax_t)ms.dwTotalPageFile, (uintmax_t)ms.dwAvailPageFile, (uintmax_t)ms.dwTotalVirtual, (uintmax_t)ms.dwAvailVirtual); #endif displayMaps (); } static HANDLE dupHandle (int fd) { HANDLE dupd; HANDLE raw; raw = fileDesHandle (fd); if (raw == (HANDLE)-1 or raw == 0) { errno = EBADF; return 0; } /* 'Inspired' by http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_a_child_process_with_redirected_input_and_output.asp * It's interesting that you can open files for/from other processes... */ unless (DuplicateHandle ( GetCurrentProcess(), /* source process */ raw, /* source handle */ GetCurrentProcess(), /* target process */ &dupd, /* target handle - valid in target proc */ 0, /* ignored b/c DUPLICATE_SAME_ACCESS used */ TRUE, /* this can be inherited by children */ DUPLICATE_SAME_ACCESS))/* keep the same permissions */ { errno = ENOMEM; return 0; } return dupd; } /* Windows memory is allocated in two phases: reserve and commit. * A reservation makes the address space unavailable to other reservations. * Commiting reserved memory actually maps the reserved memory for use. * Decommitting a portion of a reservation releases the physical memory only. * The complicating detail is that one cannot partially release a reservation. * * The management routines below manage a 'heap' that is composed of several * distinct reservations, laid out in the following order: * 0+ reservations set MEM_COMMIT * 1 reservation starting MEM_COMMIT with an optional MEM_RESERVE tail * * The heap always starts on a reservation and ends at where the MEM_RESERVE * region (if any) begins. */ /* Create a new heap */ static inline void *Windows_mmapAnon (void *base, size_t length) { void *res; /* We prevoiusly used "0" instead of start, which lead to crashes. * After reading win32 documentation, the reason for these crashes * becomes clear: we were using only MEM_COMMIT! If there was memory * decommitted in a previous heap shrink, a new heap might end up * inside the reserved (but uncommitted) memory. When the old heap is * freed, it will kill the new heap as well. This bug will not happen * now because we reserve, then commit. Reserved memory cannot conflict. */ res = VirtualAlloc (base, length, MEM_RESERVE, PAGE_NOACCESS); if (0 == res) return (void*)-1; /* Actually get the memory for use */ if (0 == VirtualAlloc (res, length, MEM_COMMIT, PAGE_READWRITE)) { VirtualFree(res, 0, MEM_RELEASE); return (void*)-1; } return res; } static inline void Windows_release (void *base, size_t length) { MEMORY_BASIC_INFORMATION mi; if (length == 0) return; /* We might not be able to release the first reservation because * it overlaps the base address we wish to keep. The idea is to * decommit the part we don't need, and release all reservations * that may be after this point. */ if (0 == VirtualQuery(base, &mi, sizeof(mi))) die("VirtualQuery failed"); assert (mi.State != MEM_FREE); assert (mi.RegionSize <= length); if (mi.AllocationBase != base) { if (0 == VirtualFree(base, mi.RegionSize, MEM_DECOMMIT)) die("VirtualFree(MEM_DECOMMIT)"); /* Requery: the following region might also be decommit */ VirtualQuery(base, &mi, sizeof(mi)); assert (mi.State == MEM_RESERVE); /* It's possible the consolidated reserved space is larger * than the range we were asked to free. Bail out early. */ if (mi.RegionSize >= length) return; /* Skip decommited region and move to the next reservation */ base = (char*)base + mi.RegionSize; length -= mi.RegionSize; } /* Clean-up the remaining tail. */ while (length > 0) { if (0 == VirtualQuery(base, &mi, sizeof(mi))) die("VirtualQuery"); /* We should never have a completely decommitted alloc */ assert (mi.State == MEM_COMMIT); /* This method is supposed to only do complete releases */ assert (mi.AllocationBase == base); /* The committed region should never exceed the length */ assert (mi.RegionSize <= length); if (0 == VirtualFree(base, 0, MEM_RELEASE)) die("VirtualFree(MEM_RELEASE) failed"); base = (char*)base + mi.RegionSize; length -= mi.RegionSize; } /* The last release also handled the optional MEM_RESERVE region */ } /* Extend an existing heap */ static inline void* Windows_extend (void *base, size_t length) { MEMORY_BASIC_INFORMATION mi; void *end; /* Check the status of memory after the end of the allocation */ VirtualQuery(base, &mi, sizeof(mi)); if (mi.State == MEM_FREE) { /* No tail of reserved memory -> simply try to allocate */ return Windows_mmapAnon(base, length); } else if (mi.State == MEM_RESERVE) { assert (mi.AllocationBase <= base); end = (char*)base + mi.RegionSize; if (mi.RegionSize > length) { /* only commit is needed */ if (0 == VirtualAlloc(base, length, MEM_COMMIT, PAGE_READWRITE)) { return (void*)-1; } else { return base; } } else if (end == Windows_mmapAnon(end, length-mi.RegionSize)) { if (0 == VirtualAlloc(base, mi.RegionSize, MEM_COMMIT, PAGE_READWRITE)) { VirtualFree(end, 0, MEM_RELEASE); return (void*)-1; } else { return base; } } else { /* Failed to allocate tail */ return (void*)-1; } } else { /* The memory is used by another mapping */ return (void*)-1; } } C_Errno_t(C_PId_t) Windows_Process_create (NullString8_t cmds, NullString8_t args, NullString8_t envs, C_Fd_t in, C_Fd_t out, C_Fd_t err) { char *cmd; char *arg; char *env; STARTUPINFO si; PROCESS_INFORMATION pi; cmd = (char*)cmds; arg = (char*)args; env = (char*)envs; ZeroMemory (&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.hStdInput = dupHandle (in); si.hStdOutput = dupHandle (out); si.hStdError = dupHandle (err); si.dwFlags = STARTF_USESTDHANDLES; /* use the above */ if (!si.hStdInput or !si.hStdOutput or !si.hStdError) { if (si.hStdInput) CloseHandle (si.hStdInput); if (si.hStdOutput) CloseHandle (si.hStdOutput); if (si.hStdError) CloseHandle (si.hStdError); /* errno already faked by dupHandle */ return -1; } ZeroMemory (&pi, sizeof(PROCESS_INFORMATION)); unless (CreateProcess ( cmd, /* Module name */ arg, /* Command line */ NULL, /* Process handle not inheritable */ NULL, /* Thread handle not inheritable */ TRUE, /* Set handle inheritance to TRUE */ 0, /* No creation flags */ env, /* Environment */ NULL, /* Use parent's starting directory */ &si, /* Pointer to STARTUPINFO structure */ &pi /* Pointer to PROCESS_INFORMATION structure */ )) { errno = ENOENT; /* probably does not exist (aka ENOFILE)*/ return -1; } /* Process created successfully */ /* We will return the process handle for the 'pid'. * This way we can TerminateProcess (kill) it and * WaitForSingleObject/GetExitCodeProcess (reap) it. * The thread handle is not needed, so clean it. */ CloseHandle (pi.hThread); CloseHandle (si.hStdInput); CloseHandle (si.hStdOutput); CloseHandle (si.hStdError); return (C_PId_t)pi.hProcess; } C_Errno_t(C_PId_t) Windows_Process_createNull (NullString8_t cmds, NullString8_t args, C_Fd_t in, C_Fd_t out, C_Fd_t err) { return Windows_Process_create (cmds, args, NULL, in, out, err); } C_Errno_t(C_Int_t) Windows_Process_getexitcode (C_PId_t pid, Ref(C_Status_t) status) { HANDLE h; h = (HANDLE)pid; unless (WaitForSingleObject (h, INFINITE) == WAIT_OBJECT_0) { errno = ECHILD; return -1; } unless (GetExitCodeProcess (h, (DWORD*)status)) { errno = ECHILD; return -1; } return 0; } C_Errno_t(C_Int_t) Windows_Process_terminate (C_PId_t pid, C_Signal_t sig) { HANDLE h; h = (HANDLE)pid; unless (TerminateProcess (h, 0x80000000UL | sig)) { errno = ECHILD; return -1; } return 0; } mlton-20100608/runtime/platform/x86.h0000644000076600000240000000004711404435622015666 0ustar mtfstaff#define MLton_Platform_Arch_host "x86" mlton-20100608/runtime/platform.c0000644000076600000240000000171011404435622015232 0ustar mtfstaff/* Copyright (C) 2004-2009 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #include "platform.h" Bool MLton_Platform_CygwinUseMmap = TRUE; void GC_setCygwinUseMmap (bool b) { MLton_Platform_CygwinUseMmap = b; } void MLton_init (int argc, char **argv, GC_state s) { int start; Posix_ProcEnv_environ = (C_StringArray_t)environ; start = GC_init (s, argc, argv); /* Setup argv and argc that SML sees. */ /* start is now the index of the first real arg. */ CommandLine_commandName = (C_String_t)(argv[0]); CommandLine_argc = argc - start; CommandLine_argv = (C_StringArray_t)(argv + start); } void MLton_halt (GC_state s, C_Int_t status) { GC_done (s); exit (status); } void MLton_heapCheckTooLarge (void) { die ("Out of memory. Unable to check heap for more than %"PRIuMAX" bytes.\n", (uintmax_t)SIZE_MAX); } mlton-20100608/runtime/platform.h0000644000076600000240000001420711404435622015244 0ustar mtfstaff/* Copyright (C) 2010 Matthew Fluet. * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_PLATFORM_H_ #define _MLTON_PLATFORM_H_ #include "cenv.h" #include "util.h" #include "ml-types.h" #include "c-types.h" #ifndef MLton_Platform_Arch_host #error MLton_Platform_Arch_host not defined #endif #ifndef MLton_Platform_OS_host #error MLton_Platform_OS_host not defined #endif #ifndef HAS_FPCLASSIFY #error HAS_FPCLASSIFY not defined #endif #ifndef HAS_FEROUND #error HAS_FEROUND not defined #endif #ifndef HAS_MSG_DONTWAIT #error HAS_MSG_DONTWAIT not defined #endif #ifndef HAS_REMAP #error HAS_REMAP not defined #endif #ifndef HAS_SIGALTSTACK #error HAS_SIGALTSTACK not defined #endif #ifndef HAS_SIGNBIT #error HAS_SIGNBIT not defined #endif #ifndef HAS_SPAWN #error HAS_SPAWN not defined #endif #ifndef HAS_TIME_PROFILING #error HAS_TIME_PROFILING not defined #endif #ifndef EXECVP #define EXECVP execvp #endif #ifndef EXECVE #define EXECVE execve #endif /* Because HAS_FPCLASSIFY is unset, the runtime will provide it's own * implementation. It doesn't matter much what the values are, because * the runtime doesn't depend on the bit representation; it just returns * these values. Therefore, prefer to keep the system's own values, but * if they don't exist, setup our own. */ #if not HAS_FPCLASSIFY #ifndef FP_INFINITE #define FP_INFINITE 1 #endif #ifndef FP_NAN #define FP_NAN 0 #endif #ifndef FP_NORMAL #define FP_NORMAL 4 #endif #ifndef FP_SUBNORMAL #define FP_SUBNORMAL 3 #endif #ifndef FP_ZERO #define FP_ZERO 2 #endif #endif #define FE_NOSUPPORT -1 /* With HAS_FEROUND unset, the runtime will provide the implementation. * That implementation depends on FE_* having the values we set below. * We must therefore make sure to eliminate any existing #defines and * then create our own defines, which will also take precedence over * any enums we included from system headers. */ #if not HAS_FEROUND #ifdef FE_TONEAREST #undef FE_TONEAREST #endif #ifdef FE_DOWNWARD #undef FE_DOWNWARD #endif #ifdef FE_UPWARD #undef FE_UPWARD #endif #ifdef FE_TOWARDZERO #undef FE_TOWARDZERO #endif #define FE_TONEAREST 0 #define FE_DOWNWARD 1 #define FE_UPWARD 2 #define FE_TOWARDZERO 3 #endif #ifndef MLTON_CODEGEN_STATIC_INLINE #define MLTON_CODEGEN_STATIC_INLINE PRIVATE #endif #ifndef MLTON_CODEGEN_MATHFN #define MLTON_CODEGEN_MATHFN(decl) #endif #ifndef MLTON_CODEGEN_WORDSQUOTREM #define MLTON_CODEGEN_WORDSQUOTREM(func) func #endif #ifndef MLTON_CODEGEN_WORDSQUOTREM_IMPL #define MLTON_CODEGEN_WORDSQUOTREM_IMPL(func) func #endif #include "basis-ffi.h" #include "gc.h" /* ---------------------------------------------------------------- */ /* Runtime Init/Exit/Alloc */ /* ---------------------------------------------------------------- */ PRIVATE void MLton_init (int argc, char **argv, GC_state s); PRIVATE __attribute__ ((noreturn)) void MLton_halt (GC_state s, C_Int_t status); PRIVATE __attribute__ ((noreturn)) void MLton_heapCheckTooLarge (void); /* ---------------------------------------------------------------- */ /* Utility libraries */ /* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */ /* Garbage Collector */ /* ---------------------------------------------------------------- */ /* ------------------------------------------------- */ /* Virtual Memory */ /* ------------------------------------------------- */ /* GC_displayMem displays the virtual memory mapping to stdout. * It is used to diagnose memory problems. */ PRIVATE void GC_displayMem (void); PRIVATE void *GC_mmapAnon (void *start, size_t length); PRIVATE void *GC_mmapAnon_safe (void *start, size_t length); PRIVATE void *GC_mmapAnon_safe_protect (void *start, size_t length, size_t dead_low, size_t dead_high); PRIVATE void *GC_mremap (void *start, size_t oldLength, size_t newLength); PRIVATE void GC_release (void *base, size_t length); PRIVATE size_t GC_pageSize (void); PRIVATE uintmax_t GC_physMem (void); PRIVATE void GC_setCygwinUseMmap (bool b); PRIVATE void GC_diskBack_close (void *data); PRIVATE void GC_diskBack_read (void *data, pointer buf, size_t size); PRIVATE void *GC_diskBack_write (pointer buf, size_t size); /* ------------------------------------------------- */ /* SigProf Handler */ /* ------------------------------------------------- */ PRIVATE void GC_setSigProfHandler (struct sigaction *sa); /* ---------------------------------------------------------------- */ /* MLton libraries */ /* ---------------------------------------------------------------- */ /* ------------------------------------------------- */ /* MLton */ /* ------------------------------------------------- */ /* ---------------------------------- */ /* MLton.Platform */ /* ---------------------------------- */ #define MLton_Platform_Arch_bigendian isBigEndian() PRIVATE extern Bool MLton_Platform_CygwinUseMmap; /* ------------------------------------------------- */ /* Socket */ /* ------------------------------------------------- */ #if (defined (__MSVCRT__)) PRIVATE void MLton_initSockets (void); PRIVATE void MLton_fixSocketErrno (void); #else static inline void MLton_initSockets (void) {} static inline void MLton_fixSocketErrno (void) {} #endif #if HAS_MSG_DONTWAIT #define MLton_recv recv #define MLton_recvfrom recvfrom #else /* Platform has no MSG_DONTWAIT flag for recv(), so these must be defined to simulate that flag. */ PRIVATE int MLton_recv(int s, void *buf, int len, int flags); PRIVATE int MLton_recvfrom(int s, void *buf, int len, int flags, void *from, socklen_t *fromlen); #endif #endif /* _MLTON_PLATFORM_H_ */ mlton-20100608/runtime/util/0000755000076600000240000000000011404470407014220 5ustar mtfstaffmlton-20100608/runtime/util/align.h0000644000076600000240000000203711404435622015465 0ustar mtfstaff/* Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ static inline bool isAligned (size_t a, size_t b) { return 0 == a % b; } static inline bool isAlignedMax (uintmax_t a, uintmax_t b) { return 0 == a % b; } static inline size_t alignDown (size_t a, size_t b) { assert (b >= 1 && b == (b & -b)); a &= -b; assert (isAligned (a, b)); return a; } static inline uintmax_t alignMaxDown (uintmax_t a, uintmax_t b) { assert (b >= 1 && b == (b & -b)); a &= -b; assert (isAlignedMax (a, b)); return a; } static inline size_t align (size_t a, size_t b) { assert (b >= 1 && b == (b & -b)); a += b - 1; a &= -b; assert (isAligned (a, b)); return a; } static inline uintmax_t alignMax (uintmax_t a, uintmax_t b) { assert (b >= 1 && b == (b & -b)); a += b - 1; a &= -b; assert (isAlignedMax (a, b)); return a; } mlton-20100608/runtime/util/die.c0000644000076600000240000000112711404435622015126 0ustar mtfstaff/* Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #include "util.h" void die (const char *fmt, ...) { va_list args; fflush(stdout); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); exit(1); } void diee (const char * fmt, ...) { va_list args; fflush(stdout); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, " (%s)\n", strerror(errno)); exit(1); } mlton-20100608/runtime/util/die.h0000644000076600000240000000125211404435622015132 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ /* issue error message and exit */ PRIVATE extern void die (const char *fmt, ...) __attribute__ ((format(printf, 1, 2))) __attribute__ ((noreturn)); /* issue error message and exit. Also print strerror(errno). */ PRIVATE extern void diee (const char *fmt, ...) __attribute__ ((format(printf, 1, 2))) __attribute__ ((noreturn)); mlton-20100608/runtime/util/endian.h0000644000076600000240000000130711404435622015630 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ static inline bool isBigEndian(void) { union { uint16_t x; uint8_t y; } __attribute__((__may_alias__)) z; /* gcc optimizes the following code to just return the result. */ z.x = 0xABCDU; if (z.y == 0xAB) return TRUE; /* big endian */ if (z.y == 0xCD) return FALSE; /* little endian */ die ("Could not detect endian --- neither big nor little!\n"); return 0; } static inline bool isLittleEndian(void) { return not (isBigEndian()); } mlton-20100608/runtime/util/Makefile0000644000076600000240000000461111404435622015662 0ustar mtfstaff## Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh # Jagannathan, and Stephen Weeks. # Copyright (C) 1997-2000 NEC Research Institute. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## PATH = ../../bin:$(shell echo $$PATH) TARGET = self TARGET_ARCH = $(shell ../../bin/host-arch) TARGET_OS = $(shell ../../bin/host-os) GCC_VERSION = $(shell gcc -v 2>&1 | grep 'gcc version' | sed 's/.*gcc version \(.\).*/\1/') FLAGS = -fomit-frame-pointer ifeq ($(TARGET_ARCH), x86) ifneq ($(findstring $(GCC_VERSION), 3 4),) FLAGS += -falign-loops=2 -falign-jumps=2 -falign-functions=5 else FLAGS += -malign-loops=2 -malign-jumps=2 -malign-functions=5 endif DEFAULT_MODEL = A ALL_MODELS = A endif ifeq ($(TARGET_ARCH), amd64) FLAGS += -mtune=opteron DEFAULT_MODEL = BX ALL_MODELS = A AX B BX C CX G endif ifeq ($(TARGET_ARCH), sparc) FLAGS += -mv8 -m32 endif ifeq ($(TARGET_OS), solaris) FLAGS += -Wa,-xarch=v8plusa -fcall-used-g5 -fcall-used-g7 -funroll-all-loops -mcpu=ultrasparc endif ifeq ($(TARGET), self) AR = ar rc RANLIB = ranlib else AR = $(TARGET)-ar rc RANLIB = $(TARGET)-ranlib FLAGS += -b $(TARGET) endif CC = gcc -std=gnu99 CWFLAGS = -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-function \ -Wformat-nonliteral \ -Wuninitialized -Winit-self \ -Wstrict-aliasing=2 \ -Wfloat-equal \ -Wpointer-arith \ -Wbad-function-cast -Wcast-qual -Wcast-align \ -Waggregate-return \ -Wstrict-prototypes \ -Wmissing-noreturn -Wmissing-format-attribute \ -Wpacked \ -Wredundant-decls \ -Wnested-externs # -Wshadow \ # -Wconversion \ # -Wmissing-prototypes \ # -Wmissing-declarations \ # -Winline -Wdisabled-optimization CFLAGS = -O2 $(CWFLAGS) -I. -D_FILE_OFFSET_BITS=64 $(FLAGS) DEBUGFLAGS = $(CFLAGS) -Wunused -gstabs+ -g2 CFILES = \ $(shell find . -type f | grep '\.c$$') HFILES = \ $(shell find . -type f | grep '\.h$$') all: libgc.o libgc-gdb.o libgc-gdb.o: $(CFILES) $(HFILES) $(CC) $(DEBUGFLAGS) -DGC_MODEL_$(DEFAULT_MODEL) -O1 -DASSERT=1 -c -o $@ gc.c libgc.o: $(CFILES) $(HFILES) $(CC) $(CFLAGS) -DGC_MODEL_$(DEFAULT_MODEL) -c -o $@ gc.c .PHONY: models models: $(CFILES) $(HFILES) ( \ for m in $(ALL_MODELS); do \ $(CC) $(CFLAGS) -DGC_MODEL_$$m -c -o libgc.$$m.o gc.c; \ $(CC) $(DEBUGFLAGS) -O1 -DASSERT=1 -DGC_MODEL_$$m -c -o libgc-gdb.$$m.o gc.c; \ done; \ ) .PHONY: clean clean: ../../bin/clean mlton-20100608/runtime/util/pointer.h0000644000076600000240000000113011404435622016044 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ // typedef void* pointer; // typedef unsigned char* pointer; typedef unsigned char pointerAux __attribute__ ((may_alias)); typedef pointerAux* pointer; #if POINTER_BITS == 32 #define FMTPTR "0x%08"PRIxPTR #elif POINTER_BITS == 64 #define FMTPTR "0x%016"PRIxPTR #else #error POINTER_BITS undefined #endif typedef const unsigned char* code_pointer; mlton-20100608/runtime/util/read_write.h0000644000076600000240000000432511404435622016522 0ustar mtfstaff/* Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ static inline char readChar (FILE *f) { char res; fread_safe (&res, sizeof(char), 1, f); return res; } static inline size_t readSize (FILE *f) { size_t res; fread_safe (&res, sizeof(size_t), 1, f); return res; } static inline uint32_t readUint32 (FILE *f) { uint32_t res; fread_safe (&res, sizeof(uint32_t), 1, f); return res; } static inline uintptr_t readUintptr (FILE *f) { uintptr_t res; fread_safe (&res, sizeof(uintptr_t), 1, f); return res; } static inline void writeChar (FILE *f, char c) { fwrite_safe (&c, sizeof(char), 1, f); } static inline void writeSize (FILE *f, size_t z) { fwrite_safe (&z, sizeof(size_t), 1, f); } static inline void writeUint32 (FILE *f, uint32_t u) { fwrite_safe (&u, sizeof(uint32_t), 1, f); } static inline void writeUintptr (FILE *f, uintptr_t u) { fwrite_safe (&u, sizeof(uintptr_t), 1, f); } static inline void writeString (FILE *f, const char* s) { fwrite_safe (s, 1, strlen(s), f); } #define BUF_SIZE 81 static inline void writeUint32U (FILE *f, uint32_t u) { static char buf[BUF_SIZE]; snprintf (buf, BUF_SIZE, "%"PRIu32, u); writeString (f, buf); } static inline void writeUintmaxU (FILE *f, uintmax_t u) { static char buf[BUF_SIZE]; snprintf (buf, BUF_SIZE, "%"PRIuMAX, u); writeString (f, buf); } static inline void writeUint32X (FILE *f, uint32_t u) { static char buf[BUF_SIZE]; snprintf (buf, BUF_SIZE, "0x%08"PRIx32, u); writeString (f, buf); } static inline void writeUintmaxX (FILE *f, uintmax_t u) { static char buf[BUF_SIZE]; if (sizeof(uintmax_t) == 4) { snprintf (buf, BUF_SIZE, "0x%08"PRIxMAX, u); } else if (sizeof(uintmax_t) == 8) { snprintf (buf, BUF_SIZE, "0x%016"PRIxMAX, u); } else { snprintf (buf, BUF_SIZE, "0x%"PRIxMAX, u); } writeString (f, buf); } static inline void writeNewline (FILE *f) { writeString (f, "\n"); } static inline void writeStringWithNewline (FILE *f, const char* s) { writeString (f, s); writeNewline (f); } #undef BUF_SIZE mlton-20100608/runtime/util/safe.h0000644000076600000240000000474111404435622015315 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ static inline void *calloc_safe (size_t count, size_t size) { void *res; res = calloc (count, size); if (NULL == res) die ("calloc (%"PRIuMAX", %"PRIuMAX") failed.\n", (uintmax_t)count, (uintmax_t)size); return res; } static inline void fclose_safe (FILE* f) { int res; res = fclose (f); if (-1 == res) diee ("fclose (_) failed.\n"); return; } static inline FILE *fdopen_safe (int fd, const char *mode) { FILE *res; res = fdopen (fd, mode); if (0 == res) diee ("fopen (%d, %s) failed.\n", fd, mode); return res; } static inline FILE *fopen_safe (const char *fileName, const char *mode) { FILE *res; res = fopen (fileName, mode); if (0 == res) diee ("fopen (%s, %s) failed.\n", fileName, mode); return res; } static inline void fread_safe (void *buf, size_t size, size_t count, FILE *f) { size_t res; res = fread (buf, size, count, f); if (res != count) { diee ("fread ("FMTPTR", %"PRIuMAX", %"PRIuMAX", _) failed " "(only read %"PRIuMAX"%s).\n", (uintptr_t)buf, (uintmax_t)size, (uintmax_t)count, (uintmax_t)res, feof (f) ? "; eof" : ""); } } static inline int fseek_safe (FILE *f, long offset, int whence) { int res; res = fseek (f, offset, whence); if (-1 == res) diee ("fseek (_, %"PRIuMAX", %"PRIuMAX") failed.\n", (uintmax_t)offset, (uintmax_t)whence); return res; } static inline void fwrite_safe (const void *buf, size_t size, size_t count, FILE *f) { size_t res; res = fwrite (buf, size, count, f); if (res != count) diee ("fwrite (_, %"PRIuMAX", %"PRIuMAX", _) failed " "(only wrote %"PRIuMAX").\n", (uintmax_t)size, (uintmax_t)count, (uintmax_t)res); } static inline void *malloc_safe (size_t size) { void *res; res = malloc (size); if (NULL == res) die ("malloc (%"PRIuMAX") failed.\n", (uintmax_t)size); return res; } static inline int mkstemp_safe (char *template) { int fd; fd = mkstemp (template); if (-1 == fd) diee ("mkstemp (%s) failed.\n", template); return fd; } static inline void unlink_safe (const char *pathname) { int res; res = unlink (pathname); if (-1 == res) diee ("unlink (%s) failed.\n", pathname); return; } mlton-20100608/runtime/util/to-string.c0000644000076600000240000000432311404435622016314 0ustar mtfstaff/* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #include "util.h" const char* boolToString (bool b) { return b ? "TRUE" : "FALSE"; } #define BUF_SIZE 81 char* intmaxToCommaString (intmax_t n) { static char buf1[BUF_SIZE]; static char buf2[BUF_SIZE]; static char buf3[BUF_SIZE]; static char buf4[BUF_SIZE]; static char buf5[BUF_SIZE]; static char *bufs[] = {buf1, buf2, buf3, buf4, buf5}; static int bufIndex = 0; static char *buf; int i; buf = bufs[bufIndex++]; bufIndex %= 5; i = BUF_SIZE - 1; buf[i--] = '\000'; if (0 == n) buf[i--] = '0'; else if (INTMAX_MIN == n) { const char* s; /* must treat INTMAX_MIN specially, because I negate stuff later */ switch (sizeof(intmax_t)) { case 1: s = "-128"; break; case 2: s = "-32,768"; break; case 4: s = "-2,147,483,648"; break; case 8: s = "-9,223,372,036,854,775,808"; break; case 16: s = "-170,141,183,460,469,231,731,687,303,715,884,105,728"; break; default: die ("intmaxToCommaString: sizeof(intmax_t) = %"PRIuMAX"", (uintmax_t)sizeof(intmax_t)); break; } strncpy (buf + 1, s, strlen(s) + 1); i = 0; } else { intmax_t m; if (n > 0) m = n; else m = -n; while (m > 0) { buf[i--] = (char)((m % 10) + '0'); m = m / 10; if (i % 4 == 0 and m > 0) buf[i--] = ','; } if (n < 0) buf[i--] = '-'; } return buf + i + 1; } char* uintmaxToCommaString (uintmax_t n) { static char buf1[BUF_SIZE]; static char buf2[BUF_SIZE]; static char buf3[BUF_SIZE]; static char buf4[BUF_SIZE]; static char buf5[BUF_SIZE]; static char *bufs[] = {buf1, buf2, buf3, buf4, buf5}; static int bufIndex = 0; static char *buf; int i; buf = bufs[bufIndex++]; bufIndex %= 5; i = BUF_SIZE - 1; buf[i--] = '\000'; if (0 == n) buf[i--] = '0'; else { while (n > 0) { buf[i--] = (char)((n % 10) + '0'); n = n / 10; if (i % 4 == 0 and n > 0) buf[i--] = ','; } } return buf + i + 1; } #undef BUF_SIZE mlton-20100608/runtime/util/to-string.h0000644000076600000240000000052511404435622016321 0ustar mtfstaff/* Copyright (C) 2004-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ PRIVATE const char* boolToString (bool b); PRIVATE char* intmaxToCommaString (intmax_t n); PRIVATE char* uintmaxToCommaString (uintmax_t n); mlton-20100608/runtime/util.c0000644000076600000240000000041511404435622014364 0ustar mtfstaff/* Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #define MLTON_UTIL #include "util/die.c" #include "util/to-string.c" mlton-20100608/runtime/util.h0000644000076600000240000000164311404435622014375 0ustar mtfstaff/* Copyright (C) 1999-2007 Henry Cejtin, Matthew Fluet, Suresh * Jagannathan, and Stephen Weeks. * Copyright (C) 1997-2000 NEC Research Institute. * * MLton is released under a BSD-style license. * See the file MLton-LICENSE for details. */ #ifndef _MLTON_UTIL_H_ #define _MLTON_UTIL_H_ #include "cenv.h" #include "util/pointer.h" #ifndef TRUE #define TRUE (0 == 0) #endif #ifndef FALSE #define FALSE (not TRUE) #endif #define unless(p) if (not (p)) #define until(p) while (not (p)) #define cardof(a) (sizeof(a) / sizeof(*(a))) #define endof(a) ((a) + cardof(a)) #define TWOPOWER(n) (1 << (n)) #ifndef max #define max(a, b) ((a)>(b)?(a):(b)) #endif #ifndef min #define min(a, b) ((a)<(b)?(a):(b)) #endif #include "util/die.h" #include "util/safe.h" #include "util/read_write.h" #include "util/to-string.h" #include "util/align.h" #include "util/endian.h" #endif /* _MLTON_UTIL_H_ */ mlton-20100608/util/0000755000076600000240000000000011404470407012535 5ustar mtfstaffmlton-20100608/util/cm2mlb/0000755000076600000240000000000011404470407013711 5ustar mtfstaffmlton-20100608/util/cm2mlb/.ignore0000644000076600000240000000001211404435642015170 0ustar mtfstaffcm2mlb.*-*mlton-20100608/util/cm2mlb/cm2mlb-map0000644000076600000240000000226411404435642015571 0ustar mtfstaff$SMLNJ-BASIS $(SML_LIB)/basis $basis.cm $(SML_LIB)/basis $basis.cm/basis.cm $(SML_LIB)/basis/basis.mlb $SMLNJ-ML-YACC-LIB $(SML_LIB)/mlyacc-lib $SMLNJ-ML-YACC-LIB/ml-yacc-lib.cm $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb $ml-yacc-lib.cm $(SML_LIB)/mlyacc-lib $ml-yacc-lib.cm/ml-yacc-lib.cm $(SML_LIB)/mlyacc-lib/mlyacc-lib.mlb $cml $(SML_LIB)/cml $cml/cml.cm $(SML_LIB)/cml/cml.mlb $c $(SML_LIB)/mlnlffi-lib $c/c.cm $(SML_LIB)/mlnlffi-lib/mlnlffi-lib.mlb $SMLNJ-LIB $(SML_LIB)/smlnj-lib $controls-lib.cm $(SML_LIB)/smlnj-lib/Controls $hash-cons-lib.cm $(SML_LIB)/smlnj-lib/HashCons $html-lib.cm $(SML_LIB)/smlnj-lib/HTML $inet-lib.cm $(SML_LIB)/smlnj-lib/INet $pp-lib.cm $(SML_LIB)/smlnj-lib/PP $reactive-lib.cm $(SML_LIB)/smlnj-lib/Reactive $regexp-lib.cm $(SML_LIB)/smlnj-lib/RegExp $smlnj-lib.cm $(SML_LIB)/smlnj-lib/Util $unix-lib.cm $(SML_LIB)/smlnj-lib/Unix $ckit-lib.cm $(SML_LIB)/ckit-lib $ckit-lib.cm/ckit-lib.cm $(SML_LIB)/ckit-lib/ckit-lib.mlb $SMLNJ-MLRISC $(SML_LIB)/mlrisc-lib/mlb mlton-20100608/util/cm2mlb/cm2mlb.cm0000644000076600000240000000027511404435642015414 0ustar mtfstaffLibrary structure CM2MLB is $/pgraph.cm $smlnj/cm.cm $smlnj/viscomp/core.cm $/smlnj-lib.cm $/basis.cm gen-mlb.sml cm2mlb.sml mlton-20100608/util/cm2mlb/cm2mlb.sml0000644000076600000240000002343111404435642015607 0ustar mtfstaff(* * Author: Matthew Fluet (mfluet@acm.org) * * This requires that you have SML/NJ installed. * It works with SML/NJ 110.47 and may require changes to work with other * versions, since it depends on the CM structure. * * cm2mlb takes a ".cm" file and prints on stdout a corresponding ".mlb". * * To use from the REPL, do the following: * CM2MLB.cm2mlb {defines = ["MLton"], * maps = [], * sources = "sources.cm", * out = TextIO.stdOut} * * Before using from the shell, you must do the following, where is * the root directory of the SML/NJ installation. You may need to be root in * order to do these. * 1. From the SML/NJ REPL: * CM.make "cm2mlb.cm"; * CM2MLB.export (); * 2. ln -s /bin/.run-sml /bin/cm2mlb * 3. mv cm2mlb.x86-linux /bin/.heap * * Once it is installed, the usage is as follows: * cm2mlb [-Dsym ...] [-map file] sources.cm * * -Dsym can be used to define CM preprocessor symbols. * -map file can be used to add cm2mlb mappings. *) structure CM2MLB : sig val cm2mlb : {defines: string list, maps: string list, out: TextIO.outstream, sources: string} -> unit val main: string * string list -> OS.Process.status val export : unit -> unit end = struct structure PG = PortableGraph fun message s = TextIO.output (TextIO.stdErr, s ^ "\n") fun die msg = (message ("Error: " ^ msg) ; OS.Process.exit OS.Process.failure) structure CM = struct open CM structure Graph = struct val graph = fn src => (Graph.graph src) handle _ => NONE end end structure AnchorMap = struct fun make (file : string) = if OS.FileSys.access (file, [OS.FileSys.A_READ]) then let val lines = let val f = TextIO.openIn file in let fun loop lines = case TextIO.inputLine f of NONE => List.rev lines | SOME l => loop (l::lines) in loop [] before TextIO.closeIn f end handle e => (TextIO.closeIn f; raise e) end handle _ => [] in List.mapPartial (fn line => if CharVector.all Char.isSpace line then NONE else case String.tokens Char.isSpace line of [cmAnchor, mlbPath] => SOME {cmAnchor = cmAnchor, mlbPath = mlbPath} | _ => die (concat ["strange cm->mlb mapping: ", file, ":: ", line])) lines end else [] val default = make "cm2mlb-map" end fun cm2mlb {defines, maps, out, sources} = let (* Define preprocessor symbols *) val _ = List.app (fn sym => (#set (CM.symval sym)) (SOME 1)) defines val _ = (#set CM.Control.verbose) false val _ = (#set CM.Control.warn_obsolete) false val _ = Control.printWarnings := false val _ = if OS.FileSys.access (sources, [OS.FileSys.A_READ]) then () else die (concat ["file not found: ", sources]) val {dir, file = sources} = OS.Path.splitDirFile sources val () = if dir <> "" then OS.FileSys.chDir dir else () local val anchorMap = List.concat ((List.map AnchorMap.make maps) @ [AnchorMap.default]) fun peekAnchorMap cmAnchor' = case List.find (fn {cmAnchor, ...} => cmAnchor = cmAnchor') anchorMap of NONE => NONE | SOME {mlbPath, ...} => SOME mlbPath in val peekAnchorMap = peekAnchorMap end in case CM.Graph.graph sources of SOME {graph as PG.GRAPH {imports, ...}, imports = importLibs, nativesrc} => let val imports = ListPair.map (fn (bid, cmLib) => let val cmLibDescr = CM.Library.descr cmLib val cmLibOSString = CM.Library.osstring cmLib fun mlbLibDef () = let val {base, ext} = OS.Path.splitBaseExt cmLibOSString val mlbLib = OS.Path.joinBaseExt {base = base, ext = SOME "mlb"} in mlbLib end fun doitAnchoredPath arcs = let fun loop (prefix, suffix) = if List.null prefix then concat ["(* ", cmLibDescr, " =??=> *) ", mlbLibDef ()] else case peekAnchorMap (String.concatWith "/" (List.rev prefix)) of SOME mlbPath => concat ["(* ", cmLibDescr, " ====> *) ", mlbPath ^ suffix] | NONE => let val suffix = if suffix = "" then OS.Path.joinBaseExt {base = #base (OS.Path.splitBaseExt (List.hd prefix)), ext = SOME "mlb"} else (List.hd prefix) ^ suffix in loop (List.tl prefix, "/" ^ suffix) end in loop (List.rev arcs, "") end val mlbLib = if String.sub (cmLibDescr, 0) = #"$" then case String.fields (fn #"/" => true | _ => false) cmLibDescr of "$" :: (arcs as (arc0 :: _)) => doitAnchoredPath (("$" ^ arc0) :: arcs) | arc0 :: arcs => let val arc0 = case CharVector.findi (fn (_, #"(") => true | _ => false) arc0 of SOME (i, _) => String.extract (arc0, i + 2, SOME (String.size arc0 - i - 3)) | NONE => arc0 in doitAnchoredPath (arc0 :: arcs) end | arcs => doitAnchoredPath arcs else concat ["(* ", cmLibOSString, " ===> *) ", mlbLibDef ()] in concat [" basis ", bid, " = \n", " bas\n", " ", mlbLib, "\n", " end\n"] end) (imports, importLibs) in TextIO.output (out, "local\n"); List.app (fn s => TextIO.output (out, s)) imports; TextIO.output (out, "in\n"); GenMLB.gen {graph = graph, nativesrc = nativesrc, importprefix = fn _ => "", exportprefix = "", outstream = out}; TextIO.output (out, "end\n") end | NONE => die ("CM.Graph.graph " ^ sources ^ " failed") end fun usage msg = (message "Usage: cm2mlb [-Dsym ...] [-map file] sources.cm" ; die msg) fun main (_, args) = let val defines = ref ["MLton"] val maps = ref [] fun loop args = case args of [file] => cm2mlb {defines = !defines, maps = !maps, out = TextIO.stdOut, sources = file} | flag :: args => if String.isPrefix "-D" flag then (defines := String.extract (flag, 2, NONE) :: !defines ; loop args) else if "-map" = flag then case args of file :: args => (maps := file :: !maps ; loop args) | _ => usage "missing map file" else usage (String.concat ["invalid flag ", flag]) | _ => usage "wrong number of arguments" in loop args handle e => die (concat ["cm2mlb failed: ", General.exnMessage e]) ; OS.Process.success end fun export () = SMLofNJ.exportFn ("cm2mlb", main) end mlton-20100608/util/cm2mlb/gen-mlb.sml0000644000076600000240000001425011404435642015753 0ustar mtfstaff(* gen-mlb.sml *) (* Modified from SML/NJ sources by Matthew Fluet (mfluet@acm.org) *) (* gen-sml.sml * * Generate SML source code for a given library. * * (C) 2001 Lucent Technologies, Bell Labs * * author: Matthias Blume (blume@research.bell-labs.com) *) local structure P = PortableGraph in structure GenMLB : sig type typ = string type varname = string exception TypeError of typ * varname exception Unbound of varname exception ImportMismatch val gen : { graph: P.graph, nativesrc: string -> string, importprefix: string -> string, outstream: TextIO.outstream, exportprefix: string } -> unit end = struct type typ = string type varname = string exception TypeError of typ * varname exception Unbound of varname exception ImportMismatch structure M = RedBlackMapFn (type ord_key = string val compare = String.compare) type namespace = string type name = string type symbol = namespace * name fun symbol_compare ((ns, n), (ns', n')) = case String.compare (n, n') of EQUAL => String.compare (ns, ns') | unequal => unequal structure SS = RedBlackSetFn (type ord_key = symbol val compare = symbol_compare) structure SM = RedBlackMapFn (type ord_key = symbol val compare = symbol_compare) datatype binding = SYM of symbol | SYMS of SS.set | ENV of symbol SM.map fun gen args = let val { graph = P.GRAPH { imports, defs, export }, nativesrc, importprefix, outstream = outs, exportprefix } = args val (xlocal, xin, xend) = ("local", "in", "end") local val indent = ref 0 in fun out l = (TextIO.output (outs, CharVector.tabulate(!indent, fn _ => #" ")); app (fn s => TextIO.output (outs, s)) l; TextIO.output (outs, "\n")) val (xlocal, xin, xend) = (fn () => (out [xlocal]; indent := !indent + 3), fn () => (indent := !indent - 3; out [xin]; indent := !indent + 3), fn () => (indent := !indent - 3; out [xend])) end val im = let fun add (v, m) = M.insert (m, v, importprefix v) val m = List.foldl add M.empty imports in fn v => M.find (m, v) end val gensym = let val next = ref 0 in fn () => let val i = !next in next := i + 1; "gs_" ^ Int.toString i end end fun genexport (ss, fmt) = let val sl = SS.listItems ss val sl' = map (fn (ns, n) => (ns, gensym ())) sl fun oneline (sy, sy', e) = (fmt (sy, sy'); SM.insert (e, sy, sy')) in ListPair.foldl oneline SM.empty (sl, sl') end fun import (lib, ss) = let val lstruct = case im lib of NONE => raise Unbound lib | SOME n => n fun fmt ((ns, n), (_, n')) = out [ns, " ", n', " = ", lstruct, n] in xlocal (); out ["open ", lib]; xin (); genexport (ss, fmt) before xend () end fun genimport ((ns, n), (_, n')) = out [ns, " ", n, " = ", n'] fun compile (src, native, e, oss) = let fun fmt ((ns, n), (_, n')) = out [ns, " ", n', " = ", n] in xlocal (); SM.appi genimport e; out [if native then src else nativesrc src]; xin (); genexport (oss, fmt) before xend () end fun filter (e, ss) = SM.filteri (fn (sy, _) => SS.member (ss, sy)) e fun get dm v = case M.find (dm, v) of NONE => raise Unbound v | SOME d => d fun getENV dm v = case get dm v of ENV m => m | _ => raise TypeError ("env", v) fun namespace P.SGN = "signature" | namespace P.STR = "structure" | namespace P.FCT = "functor" fun onedef (P.DEF { lhs, rhs }, dm) = let val get = get dm val getENV = getENV dm fun getSYM v = case get v of SYM s => s | _ => raise TypeError ("sym", v) fun getSYMS v = case get v of SYMS ss => ss | _ => raise TypeError ("syms", v) in M.insert (dm, lhs, case rhs of P.SYM (ns, n) => SYM (namespace ns, n) | P.SYMS vl => let fun one (v, ss) = SS.add (ss, getSYM v) in SYMS (foldl one SS.empty vl) end | P.IMPORT { lib, syms } => ENV (import (lib, getSYMS syms)) | P.COMPILE { src = (src, native), env, syms } => ENV (compile (src, native, getENV env, getSYMS syms)) | P.FILTER { env, syms } => ENV (filter (getENV env, getSYMS syms)) | P.MERGE el => let fun one (v, e) = SM.unionWith #2 (getENV v, e) in ENV (foldl one SM.empty el) end) end val _ = xlocal () val _ = out ["$(SML_LIB)/basis/pervasive.mlb"] val dm = foldl onedef M.empty defs val ee = getENV dm export fun libexport ((ns, n), (_, n')) = out [ns, " ", exportprefix, n, " = ", n'] in xin (); SM.appi libexport ee; xend () end end end mlton-20100608/util/cm2mlb/Makefile0000644000076600000240000000207511404435642015357 0ustar mtfstaff## Copyright (C) 2010 Matthew Fluet. # # MLton is released under a BSD-style license. # See the file MLton-LICENSE for details. ## # # SML/NJ tools and heap suffix # ML_BUILD := ml-build ML_BUILD_FLAGS := ML_HEAP_SUFFIX := $(shell echo 'TextIO.output (TextIO.stdErr, SMLofNJ.SysInfo.getHeapSuffix ());' | sml 2>&1 1> /dev/null) # # cm2mlb root .cm # CM2MLB_CM := cm2mlb.cm # # cm2mlb heap image # CM2MLB_HEAP := cm2mlb.$(ML_HEAP_SUFFIX) all: $(CM2MLB_HEAP) $(CM2MLB_HEAP): cm2mlb.cm cm2mlb.sml gen-mlb.sml cm2mlb-map rm -f $(CM2MLB_HEAP) # $(ML_BUILD) $(ML_BUILD_FLAGS) $(CM2MLB_CM) CM2MLB.main $(CM2MLB_HEAP) ( \ echo 'if (CM.make "cm2mlb.cm") handle _ => false'; \ echo ' then ()'; \ echo ' else OS.Process.exit OS.Process.failure;'; \ echo 'CM2MLB.export();' \ ) | sml .PHONY: clean clean: ../../bin/clean SMLDIR := $(dir $(shell which sml)) .PHONY: install install: $(CM2MLB_HEAP) rm -f $(SMLDIR).heap/$(CM2MLB_HEAP) $(SMLDIR)cm2mlb cp $(CM2MLB_HEAP) $(SMLDIR).heap (cd $(SMLDIR) ; ln -s .run-sml cm2mlb)mlton-20100608/util/cmcat/0000755000076600000240000000000011404470407013624 5ustar mtfstaffmlton-20100608/util/cmcat/cmcat.sml0000644000076600000240000007724411404435642015450 0ustar mtfstaff(* * Authors: Stephen Weeks (sweeks@sweeks.com) * Matthew Fluet (fluet@cs.cornell.edu) * * This requires that you have SML/NJ installed. * It works with SML/NJ 110.44 and may require changes to work with other * versions, since it depends on the CM structure. * * cmcat takes a ".cm" file and prints on stdout a list of files in the order * deduced by CM. * * To use from the REPL, do the following: * CMcat.cmcat {comments = true, * defines = [], * sources = "sources.cm", * out = TextIO.stdOut} * * Before using from the shell, you must do the following, where is * the root directory of the SML/NJ installation. You may need to be root in * order to do these. * 1. From the SML/NJ REPL: * CM.make "sources.cm"; * CMcat.export (); * 2. ln -s /bin/.run-sml /bin/cmcat * 3. mv cmcat.x86-linux /bin/.heap * * Once it is installed, the usage is as follows: * cmcat [-comments] [-Dsym ...] sources.cm * * -comments can be used to add comments to the output, including import dependencies. * -Dsym can be used to define CM preprocessor symbols. *) structure CMcat : sig val cmcat : {comments: bool, defines: String.t list, out: Out.t, sources: String.t} -> unit val export : unit -> unit end = struct structure PG = PortableGraph structure Graph = DirectedGraph structure Node = Graph.Node structure Edge = Graph.Edge fun message s = Out.output (Out.error, s ^ "\n") structure CM = struct open CM structure Graph = struct val graph = fn src => (Graph.graph src) handle _ => NONE end end structure SrcDescr :> sig type t val make : String.t * String.t -> t val src : t -> String.t val descr : t -> String.t val equals : t * t -> bool val hash : t -> Word.t val toString : t -> String.t end = struct datatype t = T of String.t * String.t fun make (src,descr) = T (src,descr) fun src (T (s,_)) = s fun descr (T (_,d)) = d fun equals (T (src1,descr1), T (src2,descr2)) = String.equals(src1, src2) fun hash (T (src, descr)) = String.hash src fun toString (T (src, descr)) = concat [descr, ":", src] end structure Closure = struct fun topoSortImportGraph source = let datatype t = T of {graph: {graph: PG.graph, imports: SrcDescr.t List.t, nativesrc: String.t -> String.t} option, hash: Word.t, node: t Node.t, srcdescr: SrcDescr.t} val g : t Graph.t = Graph.new () val m : t HashSet.t = HashSet.new {hash = fn T {hash, ...} => hash} val {get : t Node.t -> t, set, rem} = Property.getSetOnce (Node.plist, Property.initRaise ("topoSortImportGraph:get", Node.layout)) val todo = ref [(SrcDescr.make (source,source),fn _ => ())]; fun closure () = if List.length (!todo) = 0 then () else Exn.withEscape (fn esc => let val (srcdescr,finish) = List.pop todo val hash = SrcDescr.hash srcdescr val T {node, ...} = HashSet.lookupOrInsert (m, hash, fn T {srcdescr = srcdescr', ...} => SrcDescr.equals(srcdescr, srcdescr'), fn () => case CM.Graph.graph (SrcDescr.src srcdescr) of NONE => let val node = Graph.newNode g val result = T {graph = NONE, hash = hash, node = node, srcdescr = srcdescr} val _ = set(node, result) in result end | SOME {graph, imports, nativesrc, ...} => let val node = Graph.newNode g val imports = List.map (imports, fn lib => let val descr = CM.Library.descr lib val descr = List.last (String.split(descr, #":")) val src = CM.Library.osstring lib val finish = fn import_node => (ignore o Graph.addEdge) (g, {from = import_node, to = node}) in List.push(todo, (SrcDescr.make (src, descr), finish)) ; SrcDescr.make (src, descr) end) val result = T {graph = SOME {graph = graph, imports = imports, nativesrc = nativesrc}, hash = hash, node = node, srcdescr = srcdescr} in set (node, result) ; result end) val _ = finish node in closure () end) val _ = closure () val libs = case Graph.topologicalSort g of NONE => raise Fail "topologicalSort of import graph failed" | SOME nodes => let val libs = List.map (nodes, fn n => let val T {graph, srcdescr, ...} = get n in {graph = graph, srcdescr = srcdescr} end) in libs end in libs end fun filter (libs : {graph: {graph: PG.graph, imports: SrcDescr.t List.t, nativesrc: String.t -> String.t} option, srcdescr: SrcDescr.t} List.t) = let datatype t = T of {hash: Word.t, lhs: SrcDescr.t * PG.varname, syms: (SrcDescr.t * PG.namespace * String.t * t Node.t) list} val symsNodesDefs : t HashSet.t = HashSet.new {hash = fn T {hash, ...} => hash} datatype s = S of {hash: Word.t, known: Bool.t, srcdescr: SrcDescr.t, syms: (SrcDescr.t * PG.namespace * String.t * t Node.t) list ref} val exports : s HashSet.t = HashSet.new {hash = fn S {hash, ...} => hash} val g : t Graph.t = Graph.new () val {get : t Node.t -> (unit -> unit), set, rem} = Property.getSetOnce (Node.plist, Property.initRaise ("filter:get", Node.layout)) datatype w = W of {hash: Word.t, lhs: SrcDescr.t * PG.varname} val keep : w HashSet.t = HashSet.new {hash = fn W {hash, ...} => hash} val addKeep = fn (srcdescr,vn) => let val hash = Word.xorb(SrcDescr.hash srcdescr, String.hash vn) val result = W {hash = hash, lhs = (srcdescr, vn)} in fn () => (HashSet.insertIfNew (keep, hash, fn W {lhs = (srcdescr',vn'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso vn = vn', fn () => result, fn _ => raise Fail "keep") ; ()) end datatype x = X of {hash: Word.t, srcdescr: SrcDescr.t, syms: (PG.namespace * String.t) list ref} val imports : x HashSet.t = HashSet.new {hash = fn X {hash, ...} => hash} val addImport = fn (srcdescr,ns,s) => let val hash = SrcDescr.hash srcdescr in fn () => let val X {syms, ...} = HashSet.lookupOrInsert (imports, hash, fn X {srcdescr = srcdescr', ...} => SrcDescr.equals(srcdescr, srcdescr'), fn () => X {hash = hash, srcdescr = srcdescr, syms = ref []}) in List.push(syms,(ns,s)) end end val _ = List.foreach (libs, fn {graph = NONE, srcdescr, ...} => let val hash = SrcDescr.hash srcdescr val _ = HashSet.insertIfNew (exports, hash, fn S {srcdescr = srcdescr', ...} => SrcDescr.equals(srcdescr, srcdescr'), fn () => S {hash = hash, known = false, srcdescr = srcdescr, syms = ref []}, fn _ => raise Fail (concat ["srcdescr: ", SrcDescr.toString srcdescr, " repeated"])) in () end | {graph = SOME {graph = PG.GRAPH {defs, export, imports}, imports = imports', ...}, srcdescr, ...} => let val srcdescr_hash = SrcDescr.hash srcdescr local val imports = List.map2(imports, imports', fn (vn,import) => (vn, let val hash = SrcDescr.hash import val S {known, syms as envSyms, ...} = case HashSet.peek (exports, hash, fn S {srcdescr, ...} => SrcDescr.equals(import, srcdescr)) of NONE => raise Fail (concat ["srcdescr: ", SrcDescr.toString srcdescr, " unknown"]) | SOME s => s in if known then fn symsSyms => List.keepAll (!envSyms, fn (srcdescr,ns,v,node) => List.contains(symsSyms,(ns,v),(op =))) else fn symsSyms => List.map (symsSyms, fn (ns,s) => case List.peek(!syms, fn (_,ns',s',_) => (ns,s) = (ns',s')) of SOME z => z | NONE => let val node = Graph.newNode g val _ = set(node,addImport (import,ns,s)) val z = (import,ns,s,node) in List.push(syms,z) ; z end) end)) in val importFn = String.memoizeList(fn _ => raise Fail "importFn", imports) end datatype u = U of {hash: Word.t, lhs: PG.varname, sym: PG.namespace * String.t} val symDefs : u HashSet.t = HashSet.new {hash = fn U {hash, ...} => hash} datatype v = V of {hash: Word.t, lhs: PG.varname, syms: (PG.namespace * String.t) list} val symsDefs : v HashSet.t = HashSet.new {hash = fn V {hash, ...} => hash} val _ = List.foreach (defs, fn PG.DEF {lhs, rhs} => case rhs of PG.SYM (ns,s) => let val hash = String.hash lhs val result = U {hash = hash, lhs = lhs, sym = (ns,s)} in HashSet.insertIfNew (symDefs, hash, fn U {lhs = lhs', ...} => lhs = lhs', fn () => result, fn _ => raise Fail (concat ["lhs: ", lhs, " violates VARNAME_ONCE"])) ; () end | PG.SYMS vns => let val hash = String.hash lhs val syms = List.foldr (vns, [], fn (vn,symsAcc) => let val hash = String.hash vn in case HashSet.peek (symDefs, hash, fn U {lhs, ...} => vn = lhs) of NONE => raise Fail (concat ["lhs: ", lhs, " violates SYM_TYPE"]) | SOME (U {sym, ...}) => sym::symsAcc end) val result = V {hash = hash, lhs = lhs, syms = syms} in HashSet.insertIfNew (symsDefs, hash, fn V {lhs = lhs', ...} => lhs = lhs', fn () => result, fn _ => raise Fail (concat ["lhs: ", lhs, " violates VARNAME_ONCE"])) ; () end | PG.IMPORT {lib, syms} => let val hash = Word.xorb(srcdescr_hash, String.hash lhs) val symsSyms = let val hash = String.hash syms in case HashSet.peek (symsDefs, hash, fn V {lhs, ...} => syms = lhs) of NONE => raise Fail (concat ["lhs: ", lhs, " violates SYMS_TYPE"]) | SOME (V {syms, ...}) => syms end val syms = importFn lib symsSyms val result = T {hash = hash, lhs = (srcdescr, lhs), syms = syms} in HashSet.insertIfNew (symsNodesDefs, hash, fn T {lhs = (srcdescr',lhs'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso lhs = lhs', fn () => result, fn _ => raise Fail (concat ["lhs: ", lhs, " violates VARNAME_ONCE"])) ; () end | PG.COMPILE {src, env, syms} => let val hash = Word.xorb(srcdescr_hash, String.hash lhs) val envSyms = let val hash = Word.xorb(srcdescr_hash, String.hash env) in case HashSet.peek (symsNodesDefs, hash, fn T {lhs = (srcdescr',env'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso env = env') of NONE => raise Fail (concat ["lhs: ", lhs, " violates ENV_TYPE"]) | SOME (T {syms, ...}) => syms end val symsSyms = let val hash = String.hash syms in case HashSet.peek (symsDefs, hash, fn V {lhs, ...} => syms = lhs) of NONE => raise Fail (concat ["lhs: ", lhs, " violates SYMS_TYPE"]) | SOME (V {syms, ...}) => syms end val node = Graph.newNode g val _ = set(node, addKeep (srcdescr, lhs)) val _ = List.foreach (envSyms, fn (_,_,_,node') => ignore(Graph.addEdge(g, {from = node, to = node'}))) val syms = List.map (symsSyms, fn (ns,v) => (srcdescr,ns,v,node)) val result = T {hash = hash, lhs = (srcdescr, lhs), syms = syms} in HashSet.insertIfNew (symsNodesDefs, hash, fn T {lhs = (srcdescr',lhs'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso lhs = lhs', fn () => result, fn _ => raise Fail (concat ["lhs: ", lhs, " violates VARNAME_ONCE"])) ; () end | PG.FILTER {env, syms} => let val hash = Word.xorb(srcdescr_hash, String.hash lhs) val envSyms = let val hash = Word.xorb(srcdescr_hash, String.hash env) in case HashSet.peek (symsNodesDefs, hash, fn T {lhs = (srcdescr',env'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso env = env') of NONE => raise Fail (concat ["lhs: ", lhs, " violates ENV_TYPE"]) | SOME (T {syms, ...}) => syms end val symsSyms = let val hash = String.hash syms in case HashSet.peek (symsDefs, hash, fn V {lhs, ...} => syms = lhs) of NONE => raise Fail (concat ["lhs: ", lhs, " violates SYMS_TYPE"]) | SOME (V {syms, ...}) => syms end val syms = List.keepAll (envSyms, fn (srcdescr,ns,v,node) => List.contains(symsSyms,(ns,v),(op =))) val result = T {hash = hash, lhs = (srcdescr, lhs), syms = syms} in HashSet.insertIfNew (symsNodesDefs, hash, fn T {lhs = (srcdescr',lhs'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso lhs = lhs', fn () => result, fn _ => raise Fail (concat ["lhs: ", lhs, " violates VARNAME_ONCE"])) ; () end | PG.MERGE vns => let val hash = Word.xorb(srcdescr_hash, String.hash lhs) val syms = List.foldr (vns, [], fn (vn,symsAcc) => let val hash = Word.xorb(srcdescr_hash, String.hash vn) in case HashSet.peek (symsNodesDefs, hash, fn T {lhs = (srcdescr',vn'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso vn = vn') of NONE => raise Fail (concat ["lhs: ", lhs, " violates ENV_TYPE"]) | SOME (T {syms, ...}) => symsAcc @ syms end) val result = T {hash = hash, lhs = (srcdescr, lhs), syms = syms} in HashSet.insertIfNew (symsNodesDefs, hash, fn T {lhs = (srcdescr',lhs'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso lhs = lhs', fn () => result, fn _ => raise Fail (concat ["lhs: ", lhs, " violates VARNAME_ONCE"])) ; () end) val exportSyms = let val hash = Word.xorb(srcdescr_hash, String.hash export) in case HashSet.peek (symsNodesDefs, hash, fn T {lhs = (srcdescr',export'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso export = export') of NONE => raise Fail (concat ["lhs: ", export, " violates ENV_TYPE"]) | SOME (T {syms, ...}) => syms end val result = S {hash = srcdescr_hash, known = true, srcdescr = srcdescr, syms = ref exportSyms} val _ = HashSet.insertIfNew (exports, srcdescr_hash, fn S {srcdescr = srcdescr', ...} => SrcDescr.equals(srcdescr, srcdescr'), fn () => result, fn _ => raise Fail (concat ["srcdescr: ", SrcDescr.toString srcdescr, " repeated"])) in () end) val {srcdescr, ...} = List.last libs val nodes = case HashSet.peek (exports, SrcDescr.hash srcdescr, fn S {srcdescr = srcdescr', ...} => SrcDescr.equals(srcdescr, srcdescr')) of NONE => raise Fail "nodes" | SOME (S {syms , ...}) => List.map(!syms,fn (_,_,_,n) => n) val _ = Graph.dfsNodes (g, nodes, Graph.DfsParam.startNode (fn node => (get node) ())) val keep = fn (srcdescr, vn) => Option.isSome (HashSet.peek (keep, Word.xorb(SrcDescr.hash srcdescr, String.hash vn), fn W {lhs = (srcdescr',vn'), ...} => SrcDescr.equals(srcdescr, srcdescr') andalso vn = vn')) val imports = fn import => case HashSet.peek (imports, SrcDescr.hash import, fn X {srcdescr, ...} => SrcDescr.equals(import, srcdescr)) of NONE => [] | SOME (X {syms, ...}) => !syms in (keep, imports) end end fun cmcat {comments, defines, out, sources} = let (* Define preprocessor symbols *) val _ = List.foreach(defines, fn sym => (#set (CM.symval sym)) (SOME 1)) val _ = (#set CM.Control.verbose) false val _ = (#set CM.Control.warn_obsolete) false val _ = Control.printWarnings := false val dir = OS.FileSys.getDir () val libs = Closure.topoSortImportGraph sources val (keep,imports) = Closure.filter libs in List.foreach (libs, fn {graph = NONE, srcdescr, ...} => if comments then (Out.output (out, "(* " ^ (SrcDescr.descr srcdescr) ^ "\n"); List.foreach (imports srcdescr, fn (ns,s) => Out.output (out, " * " ^ (case ns of PG.SGN => "signature " | PG.STR => "structure " | PG.FCT => "functor ") ^ s ^ "\n")); Out.output (out, " *)\n")) else () | {graph = SOME {graph, nativesrc, ...}, srcdescr, ...} => (if comments then Out.output (out, "(* " ^ (OS.Path.mkRelative {path = SrcDescr.src srcdescr, relativeTo = dir}) ^ " *)\n") else (); let val PG.GRAPH {defs, ...} = graph in List.foreach (defs, fn def => case def of PG.DEF {lhs, rhs = PG.COMPILE {src = (src, native), ...}, ...} => if keep(srcdescr,lhs) then Out.output(out, (if native then src else nativesrc src) ^ "\n") else () | _ => ()) end)) end fun die msg = (message "Usage: cmcat [-comments] [-Dsym ...] sources.cm" ; message ("Error: " ^ msg) ; OS.Process.exit OS.Process.failure) fun export () = SMLofNJ.exportFn ("cmcat", fn (_, args) => let val comments = ref false val defines = ref ["MLton"] fun loop args = case args of [file] => cmcat {comments = !comments, defines = !defines, out = Out.standard, sources = file} | flag :: args => if String.equals (flag, "-comments") then (comments := true; loop args) else if String.hasPrefix (flag, {prefix = "-D"}) then (defines := String.extract (flag, 2, NONE) :: !defines ; loop args) else die (String.concat ["invalid flag ", flag]) | _ => die "wrong number of arguments" in loop args (* handle _ => die "cmcat failed" *) ; 0 end) end mlton-20100608/util/cmcat/sources.cm0000644000076600000240000000023611404435642015633 0ustar mtfstaffGroup structure CMcat is $/pgraph.cm $smlnj/cm.cm $smlnj/viscomp/core.cm ../../lib/mlton/sources.cm cmcat.sml